diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..df5f35dc --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/final.iml b/.idea/final.iml new file mode 100644 index 00000000..0b872d82 --- /dev/null +++ b/.idea/final.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..64e21c8e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..9661ac71 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 00000000..95446d02 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + '); + res.end(''); +} + +http.createServer(onRequest).listen(3000); +``` + +## Testing + +```sh +$ npm test +``` + +## Benchmark + +``` +$ npm run bench + +> cookie@0.3.1 bench cookie +> node benchmark/index.js + + http_parser@2.8.0 + node@6.14.2 + v8@5.1.281.111 + uv@1.16.1 + zlib@1.2.11 + ares@1.10.1-DEV + icu@58.2 + modules@48 + napi@3 + openssl@1.0.2o + +> node benchmark/parse.js + + cookie.parse + + 6 tests completed. + + simple x 1,200,691 ops/sec ±1.12% (189 runs sampled) + decode x 1,012,994 ops/sec ±0.97% (186 runs sampled) + unquote x 1,074,174 ops/sec ±2.43% (186 runs sampled) + duplicates x 438,424 ops/sec ±2.17% (184 runs sampled) + 10 cookies x 147,154 ops/sec ±1.01% (186 runs sampled) + 100 cookies x 14,274 ops/sec ±1.07% (187 runs sampled) +``` + +## References + +- [RFC 6265: HTTP State Management Mechanism][rfc-6265] +- [Same-site Cookies][rfc-6265bis-03-4.1.2.7] + +[rfc-6265bis-03-4.1.2.7]: https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-4.1.2.7 +[rfc-6265]: https://tools.ietf.org/html/rfc6265 +[rfc-6265-5.1.4]: https://tools.ietf.org/html/rfc6265#section-5.1.4 +[rfc-6265-5.2.1]: https://tools.ietf.org/html/rfc6265#section-5.2.1 +[rfc-6265-5.2.2]: https://tools.ietf.org/html/rfc6265#section-5.2.2 +[rfc-6265-5.2.3]: https://tools.ietf.org/html/rfc6265#section-5.2.3 +[rfc-6265-5.2.4]: https://tools.ietf.org/html/rfc6265#section-5.2.4 +[rfc-6265-5.2.5]: https://tools.ietf.org/html/rfc6265#section-5.2.5 +[rfc-6265-5.2.6]: https://tools.ietf.org/html/rfc6265#section-5.2.6 +[rfc-6265-5.3]: https://tools.ietf.org/html/rfc6265#section-5.3 + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/cookie/master +[coveralls-url]: https://coveralls.io/r/jshttp/cookie?branch=master +[node-version-image]: https://badgen.net/npm/node/cookie +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/cookie +[npm-url]: https://npmjs.org/package/cookie +[npm-version-image]: https://badgen.net/npm/v/cookie +[travis-image]: https://badgen.net/travis/jshttp/cookie/master +[travis-url]: https://travis-ci.org/jshttp/cookie diff --git a/node_modules/cookie/index.js b/node_modules/cookie/index.js new file mode 100644 index 00000000..16f56c04 --- /dev/null +++ b/node_modules/cookie/index.js @@ -0,0 +1,198 @@ +/*! + * cookie + * Copyright(c) 2012-2014 Roman Shtylman + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +exports.parse = parse; +exports.serialize = serialize; + +/** + * Module variables. + * @private + */ + +var decode = decodeURIComponent; +var encode = encodeURIComponent; +var pairSplitRegExp = /; */; + +/** + * RegExp to match field-content in RFC 7230 sec 3.2 + * + * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] + * field-vchar = VCHAR / obs-text + * obs-text = %x80-FF + */ + +var fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/; + +/** + * Parse a cookie header. + * + * Parse the given cookie header string into an object + * The object has the various cookies as keys(names) => values + * + * @param {string} str + * @param {object} [options] + * @return {object} + * @public + */ + +function parse(str, options) { + if (typeof str !== 'string') { + throw new TypeError('argument str must be a string'); + } + + var obj = {} + var opt = options || {}; + var pairs = str.split(pairSplitRegExp); + var dec = opt.decode || decode; + + for (var i = 0; i < pairs.length; i++) { + var pair = pairs[i]; + var eq_idx = pair.indexOf('='); + + // skip things that don't look like key=value + if (eq_idx < 0) { + continue; + } + + var key = pair.substr(0, eq_idx).trim() + var val = pair.substr(++eq_idx, pair.length).trim(); + + // quoted values + if ('"' == val[0]) { + val = val.slice(1, -1); + } + + // only assign once + if (undefined == obj[key]) { + obj[key] = tryDecode(val, dec); + } + } + + return obj; +} + +/** + * Serialize data into a cookie header. + * + * Serialize the a name value pair into a cookie string suitable for + * http headers. An optional options object specified cookie parameters. + * + * serialize('foo', 'bar', { httpOnly: true }) + * => "foo=bar; httpOnly" + * + * @param {string} name + * @param {string} val + * @param {object} [options] + * @return {string} + * @public + */ + +function serialize(name, val, options) { + var opt = options || {}; + var enc = opt.encode || encode; + + if (typeof enc !== 'function') { + throw new TypeError('option encode is invalid'); + } + + if (!fieldContentRegExp.test(name)) { + throw new TypeError('argument name is invalid'); + } + + var value = enc(val); + + if (value && !fieldContentRegExp.test(value)) { + throw new TypeError('argument val is invalid'); + } + + var str = name + '=' + value; + + if (null != opt.maxAge) { + var maxAge = opt.maxAge - 0; + if (isNaN(maxAge)) throw new Error('maxAge should be a Number'); + str += '; Max-Age=' + Math.floor(maxAge); + } + + if (opt.domain) { + if (!fieldContentRegExp.test(opt.domain)) { + throw new TypeError('option domain is invalid'); + } + + str += '; Domain=' + opt.domain; + } + + if (opt.path) { + if (!fieldContentRegExp.test(opt.path)) { + throw new TypeError('option path is invalid'); + } + + str += '; Path=' + opt.path; + } + + if (opt.expires) { + if (typeof opt.expires.toUTCString !== 'function') { + throw new TypeError('option expires is invalid'); + } + + str += '; Expires=' + opt.expires.toUTCString(); + } + + if (opt.httpOnly) { + str += '; HttpOnly'; + } + + if (opt.secure) { + str += '; Secure'; + } + + if (opt.sameSite) { + var sameSite = typeof opt.sameSite === 'string' + ? opt.sameSite.toLowerCase() : opt.sameSite; + + switch (sameSite) { + case true: + str += '; SameSite=Strict'; + break; + case 'lax': + str += '; SameSite=Lax'; + break; + case 'strict': + str += '; SameSite=Strict'; + break; + case 'none': + str += '; SameSite=None'; + break; + default: + throw new TypeError('option sameSite is invalid'); + } + } + + return str; +} + +/** + * Try decoding a string using a decoding function. + * + * @param {string} str + * @param {function} decode + * @private + */ + +function tryDecode(str, decode) { + try { + return decode(str); + } catch (e) { + return str; + } +} diff --git a/node_modules/cookie/package.json b/node_modules/cookie/package.json new file mode 100644 index 00000000..efbc06af --- /dev/null +++ b/node_modules/cookie/package.json @@ -0,0 +1,78 @@ +{ + "_from": "cookie@0.4.0", + "_id": "cookie@0.4.0", + "_inBundle": false, + "_integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "_location": "/cookie", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "cookie@0.4.0", + "name": "cookie", + "escapedName": "cookie", + "rawSpec": "0.4.0", + "saveSpec": null, + "fetchSpec": "0.4.0" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "_shasum": "beb437e7022b3b6d49019d088665303ebe9c14ba", + "_spec": "cookie@0.4.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "Roman Shtylman", + "email": "shtylman@gmail.com" + }, + "bugs": { + "url": "https://github.com/jshttp/cookie/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + } + ], + "deprecated": false, + "description": "HTTP server cookie parsing and serialization", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "5.16.0", + "eslint-plugin-markdown": "1.0.0", + "istanbul": "0.4.5", + "mocha": "6.1.4" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "index.js" + ], + "homepage": "https://github.com/jshttp/cookie#readme", + "keywords": [ + "cookie", + "cookies" + ], + "license": "MIT", + "name": "cookie", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/cookie.git" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "version": "node scripts/version-history.js && git add HISTORY.md" + }, + "version": "0.4.0" +} diff --git a/node_modules/core-util-is/LICENSE b/node_modules/core-util-is/LICENSE new file mode 100644 index 00000000..d8d7f943 --- /dev/null +++ b/node_modules/core-util-is/LICENSE @@ -0,0 +1,19 @@ +Copyright Node.js contributors. All rights reserved. + +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/node_modules/core-util-is/README.md b/node_modules/core-util-is/README.md new file mode 100644 index 00000000..5a76b414 --- /dev/null +++ b/node_modules/core-util-is/README.md @@ -0,0 +1,3 @@ +# core-util-is + +The `util.is*` functions introduced in Node v0.12. diff --git a/node_modules/core-util-is/float.patch b/node_modules/core-util-is/float.patch new file mode 100644 index 00000000..a06d5c05 --- /dev/null +++ b/node_modules/core-util-is/float.patch @@ -0,0 +1,604 @@ +diff --git a/lib/util.js b/lib/util.js +index a03e874..9074e8e 100644 +--- a/lib/util.js ++++ b/lib/util.js +@@ -19,430 +19,6 @@ + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + +-var formatRegExp = /%[sdj%]/g; +-exports.format = function(f) { +- if (!isString(f)) { +- var objects = []; +- for (var i = 0; i < arguments.length; i++) { +- objects.push(inspect(arguments[i])); +- } +- return objects.join(' '); +- } +- +- var i = 1; +- var args = arguments; +- var len = args.length; +- var str = String(f).replace(formatRegExp, function(x) { +- if (x === '%%') return '%'; +- if (i >= len) return x; +- switch (x) { +- case '%s': return String(args[i++]); +- case '%d': return Number(args[i++]); +- case '%j': +- try { +- return JSON.stringify(args[i++]); +- } catch (_) { +- return '[Circular]'; +- } +- default: +- return x; +- } +- }); +- for (var x = args[i]; i < len; x = args[++i]) { +- if (isNull(x) || !isObject(x)) { +- str += ' ' + x; +- } else { +- str += ' ' + inspect(x); +- } +- } +- return str; +-}; +- +- +-// Mark that a method should not be used. +-// Returns a modified function which warns once by default. +-// If --no-deprecation is set, then it is a no-op. +-exports.deprecate = function(fn, msg) { +- // Allow for deprecating things in the process of starting up. +- if (isUndefined(global.process)) { +- return function() { +- return exports.deprecate(fn, msg).apply(this, arguments); +- }; +- } +- +- if (process.noDeprecation === true) { +- return fn; +- } +- +- var warned = false; +- function deprecated() { +- if (!warned) { +- if (process.throwDeprecation) { +- throw new Error(msg); +- } else if (process.traceDeprecation) { +- console.trace(msg); +- } else { +- console.error(msg); +- } +- warned = true; +- } +- return fn.apply(this, arguments); +- } +- +- return deprecated; +-}; +- +- +-var debugs = {}; +-var debugEnviron; +-exports.debuglog = function(set) { +- if (isUndefined(debugEnviron)) +- debugEnviron = process.env.NODE_DEBUG || ''; +- set = set.toUpperCase(); +- if (!debugs[set]) { +- if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { +- var pid = process.pid; +- debugs[set] = function() { +- var msg = exports.format.apply(exports, arguments); +- console.error('%s %d: %s', set, pid, msg); +- }; +- } else { +- debugs[set] = function() {}; +- } +- } +- return debugs[set]; +-}; +- +- +-/** +- * Echos the value of a value. Trys to print the value out +- * in the best way possible given the different types. +- * +- * @param {Object} obj The object to print out. +- * @param {Object} opts Optional options object that alters the output. +- */ +-/* legacy: obj, showHidden, depth, colors*/ +-function inspect(obj, opts) { +- // default options +- var ctx = { +- seen: [], +- stylize: stylizeNoColor +- }; +- // legacy... +- if (arguments.length >= 3) ctx.depth = arguments[2]; +- if (arguments.length >= 4) ctx.colors = arguments[3]; +- if (isBoolean(opts)) { +- // legacy... +- ctx.showHidden = opts; +- } else if (opts) { +- // got an "options" object +- exports._extend(ctx, opts); +- } +- // set default options +- if (isUndefined(ctx.showHidden)) ctx.showHidden = false; +- if (isUndefined(ctx.depth)) ctx.depth = 2; +- if (isUndefined(ctx.colors)) ctx.colors = false; +- if (isUndefined(ctx.customInspect)) ctx.customInspect = true; +- if (ctx.colors) ctx.stylize = stylizeWithColor; +- return formatValue(ctx, obj, ctx.depth); +-} +-exports.inspect = inspect; +- +- +-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +-inspect.colors = { +- 'bold' : [1, 22], +- 'italic' : [3, 23], +- 'underline' : [4, 24], +- 'inverse' : [7, 27], +- 'white' : [37, 39], +- 'grey' : [90, 39], +- 'black' : [30, 39], +- 'blue' : [34, 39], +- 'cyan' : [36, 39], +- 'green' : [32, 39], +- 'magenta' : [35, 39], +- 'red' : [31, 39], +- 'yellow' : [33, 39] +-}; +- +-// Don't use 'blue' not visible on cmd.exe +-inspect.styles = { +- 'special': 'cyan', +- 'number': 'yellow', +- 'boolean': 'yellow', +- 'undefined': 'grey', +- 'null': 'bold', +- 'string': 'green', +- 'date': 'magenta', +- // "name": intentionally not styling +- 'regexp': 'red' +-}; +- +- +-function stylizeWithColor(str, styleType) { +- var style = inspect.styles[styleType]; +- +- if (style) { +- return '\u001b[' + inspect.colors[style][0] + 'm' + str + +- '\u001b[' + inspect.colors[style][1] + 'm'; +- } else { +- return str; +- } +-} +- +- +-function stylizeNoColor(str, styleType) { +- return str; +-} +- +- +-function arrayToHash(array) { +- var hash = {}; +- +- array.forEach(function(val, idx) { +- hash[val] = true; +- }); +- +- return hash; +-} +- +- +-function formatValue(ctx, value, recurseTimes) { +- // Provide a hook for user-specified inspect functions. +- // Check that value is an object with an inspect function on it +- if (ctx.customInspect && +- value && +- isFunction(value.inspect) && +- // Filter out the util module, it's inspect function is special +- value.inspect !== exports.inspect && +- // Also filter out any prototype objects using the circular check. +- !(value.constructor && value.constructor.prototype === value)) { +- var ret = value.inspect(recurseTimes, ctx); +- if (!isString(ret)) { +- ret = formatValue(ctx, ret, recurseTimes); +- } +- return ret; +- } +- +- // Primitive types cannot have properties +- var primitive = formatPrimitive(ctx, value); +- if (primitive) { +- return primitive; +- } +- +- // Look up the keys of the object. +- var keys = Object.keys(value); +- var visibleKeys = arrayToHash(keys); +- +- if (ctx.showHidden) { +- keys = Object.getOwnPropertyNames(value); +- } +- +- // Some type of object without properties can be shortcutted. +- if (keys.length === 0) { +- if (isFunction(value)) { +- var name = value.name ? ': ' + value.name : ''; +- return ctx.stylize('[Function' + name + ']', 'special'); +- } +- if (isRegExp(value)) { +- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); +- } +- if (isDate(value)) { +- return ctx.stylize(Date.prototype.toString.call(value), 'date'); +- } +- if (isError(value)) { +- return formatError(value); +- } +- } +- +- var base = '', array = false, braces = ['{', '}']; +- +- // Make Array say that they are Array +- if (isArray(value)) { +- array = true; +- braces = ['[', ']']; +- } +- +- // Make functions say that they are functions +- if (isFunction(value)) { +- var n = value.name ? ': ' + value.name : ''; +- base = ' [Function' + n + ']'; +- } +- +- // Make RegExps say that they are RegExps +- if (isRegExp(value)) { +- base = ' ' + RegExp.prototype.toString.call(value); +- } +- +- // Make dates with properties first say the date +- if (isDate(value)) { +- base = ' ' + Date.prototype.toUTCString.call(value); +- } +- +- // Make error with message first say the error +- if (isError(value)) { +- base = ' ' + formatError(value); +- } +- +- if (keys.length === 0 && (!array || value.length == 0)) { +- return braces[0] + base + braces[1]; +- } +- +- if (recurseTimes < 0) { +- if (isRegExp(value)) { +- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); +- } else { +- return ctx.stylize('[Object]', 'special'); +- } +- } +- +- ctx.seen.push(value); +- +- var output; +- if (array) { +- output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); +- } else { +- output = keys.map(function(key) { +- return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); +- }); +- } +- +- ctx.seen.pop(); +- +- return reduceToSingleString(output, base, braces); +-} +- +- +-function formatPrimitive(ctx, value) { +- if (isUndefined(value)) +- return ctx.stylize('undefined', 'undefined'); +- if (isString(value)) { +- var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') +- .replace(/'/g, "\\'") +- .replace(/\\"/g, '"') + '\''; +- return ctx.stylize(simple, 'string'); +- } +- if (isNumber(value)) { +- // Format -0 as '-0'. Strict equality won't distinguish 0 from -0, +- // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 . +- if (value === 0 && 1 / value < 0) +- return ctx.stylize('-0', 'number'); +- return ctx.stylize('' + value, 'number'); +- } +- if (isBoolean(value)) +- return ctx.stylize('' + value, 'boolean'); +- // For some reason typeof null is "object", so special case here. +- if (isNull(value)) +- return ctx.stylize('null', 'null'); +-} +- +- +-function formatError(value) { +- return '[' + Error.prototype.toString.call(value) + ']'; +-} +- +- +-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { +- var output = []; +- for (var i = 0, l = value.length; i < l; ++i) { +- if (hasOwnProperty(value, String(i))) { +- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, +- String(i), true)); +- } else { +- output.push(''); +- } +- } +- keys.forEach(function(key) { +- if (!key.match(/^\d+$/)) { +- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, +- key, true)); +- } +- }); +- return output; +-} +- +- +-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { +- var name, str, desc; +- desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; +- if (desc.get) { +- if (desc.set) { +- str = ctx.stylize('[Getter/Setter]', 'special'); +- } else { +- str = ctx.stylize('[Getter]', 'special'); +- } +- } else { +- if (desc.set) { +- str = ctx.stylize('[Setter]', 'special'); +- } +- } +- if (!hasOwnProperty(visibleKeys, key)) { +- name = '[' + key + ']'; +- } +- if (!str) { +- if (ctx.seen.indexOf(desc.value) < 0) { +- if (isNull(recurseTimes)) { +- str = formatValue(ctx, desc.value, null); +- } else { +- str = formatValue(ctx, desc.value, recurseTimes - 1); +- } +- if (str.indexOf('\n') > -1) { +- if (array) { +- str = str.split('\n').map(function(line) { +- return ' ' + line; +- }).join('\n').substr(2); +- } else { +- str = '\n' + str.split('\n').map(function(line) { +- return ' ' + line; +- }).join('\n'); +- } +- } +- } else { +- str = ctx.stylize('[Circular]', 'special'); +- } +- } +- if (isUndefined(name)) { +- if (array && key.match(/^\d+$/)) { +- return str; +- } +- name = JSON.stringify('' + key); +- if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { +- name = name.substr(1, name.length - 2); +- name = ctx.stylize(name, 'name'); +- } else { +- name = name.replace(/'/g, "\\'") +- .replace(/\\"/g, '"') +- .replace(/(^"|"$)/g, "'"); +- name = ctx.stylize(name, 'string'); +- } +- } +- +- return name + ': ' + str; +-} +- +- +-function reduceToSingleString(output, base, braces) { +- var numLinesEst = 0; +- var length = output.reduce(function(prev, cur) { +- numLinesEst++; +- if (cur.indexOf('\n') >= 0) numLinesEst++; +- return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; +- }, 0); +- +- if (length > 60) { +- return braces[0] + +- (base === '' ? '' : base + '\n ') + +- ' ' + +- output.join(',\n ') + +- ' ' + +- braces[1]; +- } +- +- return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +-} +- +- + // NOTE: These type checking functions intentionally don't use `instanceof` + // because it is fragile and can be easily faked with `Object.create()`. + function isArray(ar) { +@@ -522,166 +98,10 @@ function isPrimitive(arg) { + exports.isPrimitive = isPrimitive; + + function isBuffer(arg) { +- return arg instanceof Buffer; ++ return Buffer.isBuffer(arg); + } + exports.isBuffer = isBuffer; + + function objectToString(o) { + return Object.prototype.toString.call(o); +-} +- +- +-function pad(n) { +- return n < 10 ? '0' + n.toString(10) : n.toString(10); +-} +- +- +-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', +- 'Oct', 'Nov', 'Dec']; +- +-// 26 Feb 16:19:34 +-function timestamp() { +- var d = new Date(); +- var time = [pad(d.getHours()), +- pad(d.getMinutes()), +- pad(d.getSeconds())].join(':'); +- return [d.getDate(), months[d.getMonth()], time].join(' '); +-} +- +- +-// log is just a thin wrapper to console.log that prepends a timestamp +-exports.log = function() { +- console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +-}; +- +- +-/** +- * Inherit the prototype methods from one constructor into another. +- * +- * The Function.prototype.inherits from lang.js rewritten as a standalone +- * function (not on Function.prototype). NOTE: If this file is to be loaded +- * during bootstrapping this function needs to be rewritten using some native +- * functions as prototype setup using normal JavaScript does not work as +- * expected during bootstrapping (see mirror.js in r114903). +- * +- * @param {function} ctor Constructor function which needs to inherit the +- * prototype. +- * @param {function} superCtor Constructor function to inherit prototype from. +- */ +-exports.inherits = function(ctor, superCtor) { +- ctor.super_ = superCtor; +- ctor.prototype = Object.create(superCtor.prototype, { +- constructor: { +- value: ctor, +- enumerable: false, +- writable: true, +- configurable: true +- } +- }); +-}; +- +-exports._extend = function(origin, add) { +- // Don't do anything if add isn't an object +- if (!add || !isObject(add)) return origin; +- +- var keys = Object.keys(add); +- var i = keys.length; +- while (i--) { +- origin[keys[i]] = add[keys[i]]; +- } +- return origin; +-}; +- +-function hasOwnProperty(obj, prop) { +- return Object.prototype.hasOwnProperty.call(obj, prop); +-} +- +- +-// Deprecated old stuff. +- +-exports.p = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- console.error(exports.inspect(arguments[i])); +- } +-}, 'util.p: Use console.error() instead'); +- +- +-exports.exec = exports.deprecate(function() { +- return require('child_process').exec.apply(this, arguments); +-}, 'util.exec is now called `child_process.exec`.'); +- +- +-exports.print = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stdout.write(String(arguments[i])); +- } +-}, 'util.print: Use console.log instead'); +- +- +-exports.puts = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stdout.write(arguments[i] + '\n'); +- } +-}, 'util.puts: Use console.log instead'); +- +- +-exports.debug = exports.deprecate(function(x) { +- process.stderr.write('DEBUG: ' + x + '\n'); +-}, 'util.debug: Use console.error instead'); +- +- +-exports.error = exports.deprecate(function(x) { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stderr.write(arguments[i] + '\n'); +- } +-}, 'util.error: Use console.error instead'); +- +- +-exports.pump = exports.deprecate(function(readStream, writeStream, callback) { +- var callbackCalled = false; +- +- function call(a, b, c) { +- if (callback && !callbackCalled) { +- callback(a, b, c); +- callbackCalled = true; +- } +- } +- +- readStream.addListener('data', function(chunk) { +- if (writeStream.write(chunk) === false) readStream.pause(); +- }); +- +- writeStream.addListener('drain', function() { +- readStream.resume(); +- }); +- +- readStream.addListener('end', function() { +- writeStream.end(); +- }); +- +- readStream.addListener('close', function() { +- call(); +- }); +- +- readStream.addListener('error', function(err) { +- writeStream.end(); +- call(err); +- }); +- +- writeStream.addListener('error', function(err) { +- readStream.destroy(); +- call(err); +- }); +-}, 'util.pump(): Use readableStream.pipe() instead'); +- +- +-var uv; +-exports._errnoException = function(err, syscall) { +- if (isUndefined(uv)) uv = process.binding('uv'); +- var errname = uv.errname(err); +- var e = new Error(syscall + ' ' + errname); +- e.code = errname; +- e.errno = errname; +- e.syscall = syscall; +- return e; +-}; ++} \ No newline at end of file diff --git a/node_modules/core-util-is/lib/util.js b/node_modules/core-util-is/lib/util.js new file mode 100644 index 00000000..ff4c851c --- /dev/null +++ b/node_modules/core-util-is/lib/util.js @@ -0,0 +1,107 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. + +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = Buffer.isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} diff --git a/node_modules/core-util-is/package.json b/node_modules/core-util-is/package.json new file mode 100644 index 00000000..a9f2e398 --- /dev/null +++ b/node_modules/core-util-is/package.json @@ -0,0 +1,62 @@ +{ + "_from": "core-util-is@~1.0.0", + "_id": "core-util-is@1.0.2", + "_inBundle": false, + "_integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "_location": "/core-util-is", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "core-util-is@~1.0.0", + "name": "core-util-is", + "escapedName": "core-util-is", + "rawSpec": "~1.0.0", + "saveSpec": null, + "fetchSpec": "~1.0.0" + }, + "_requiredBy": [ + "/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "_shasum": "b5fd54220aa2bc5ab57aab7140c940754503c1a7", + "_spec": "core-util-is@~1.0.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\readable-stream", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/core-util-is/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "The `util.is*` functions introduced in Node v0.12.", + "devDependencies": { + "tap": "^2.3.0" + }, + "homepage": "https://github.com/isaacs/core-util-is#readme", + "keywords": [ + "util", + "isBuffer", + "isArray", + "isNumber", + "isString", + "isRegExp", + "isThis", + "isThat", + "polyfill" + ], + "license": "MIT", + "main": "lib/util.js", + "name": "core-util-is", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/core-util-is.git" + }, + "scripts": { + "test": "tap test.js" + }, + "version": "1.0.2" +} diff --git a/node_modules/core-util-is/test.js b/node_modules/core-util-is/test.js new file mode 100644 index 00000000..1a490c65 --- /dev/null +++ b/node_modules/core-util-is/test.js @@ -0,0 +1,68 @@ +var assert = require('tap'); + +var t = require('./lib/util'); + +assert.equal(t.isArray([]), true); +assert.equal(t.isArray({}), false); + +assert.equal(t.isBoolean(null), false); +assert.equal(t.isBoolean(true), true); +assert.equal(t.isBoolean(false), true); + +assert.equal(t.isNull(null), true); +assert.equal(t.isNull(undefined), false); +assert.equal(t.isNull(false), false); +assert.equal(t.isNull(), false); + +assert.equal(t.isNullOrUndefined(null), true); +assert.equal(t.isNullOrUndefined(undefined), true); +assert.equal(t.isNullOrUndefined(false), false); +assert.equal(t.isNullOrUndefined(), true); + +assert.equal(t.isNumber(null), false); +assert.equal(t.isNumber('1'), false); +assert.equal(t.isNumber(1), true); + +assert.equal(t.isString(null), false); +assert.equal(t.isString('1'), true); +assert.equal(t.isString(1), false); + +assert.equal(t.isSymbol(null), false); +assert.equal(t.isSymbol('1'), false); +assert.equal(t.isSymbol(1), false); +assert.equal(t.isSymbol(Symbol()), true); + +assert.equal(t.isUndefined(null), false); +assert.equal(t.isUndefined(undefined), true); +assert.equal(t.isUndefined(false), false); +assert.equal(t.isUndefined(), true); + +assert.equal(t.isRegExp(null), false); +assert.equal(t.isRegExp('1'), false); +assert.equal(t.isRegExp(new RegExp()), true); + +assert.equal(t.isObject({}), true); +assert.equal(t.isObject([]), true); +assert.equal(t.isObject(new RegExp()), true); +assert.equal(t.isObject(new Date()), true); + +assert.equal(t.isDate(null), false); +assert.equal(t.isDate('1'), false); +assert.equal(t.isDate(new Date()), true); + +assert.equal(t.isError(null), false); +assert.equal(t.isError({ err: true }), false); +assert.equal(t.isError(new Error()), true); + +assert.equal(t.isFunction(null), false); +assert.equal(t.isFunction({ }), false); +assert.equal(t.isFunction(function() {}), true); + +assert.equal(t.isPrimitive(null), true); +assert.equal(t.isPrimitive(''), true); +assert.equal(t.isPrimitive(0), true); +assert.equal(t.isPrimitive(new Date()), false); + +assert.equal(t.isBuffer(null), false); +assert.equal(t.isBuffer({}), false); +assert.equal(t.isBuffer(new Buffer(0)), true); diff --git a/node_modules/csv-parse/CHANGELOG.md b/node_modules/csv-parse/CHANGELOG.md new file mode 100644 index 00000000..10b7c687 --- /dev/null +++ b/node_modules/csv-parse/CHANGELOG.md @@ -0,0 +1,651 @@ + +# Changelog + +## Todo + +Please join and contribute: + +* `skip_lines_with_empty_values`: rename to skip_records_with_empty_values (easy) +* `skip_lines_with_error`: rename to skip_records_with_error (easy) +* `relax`: rename to relax_quotes_when_unquoted (easy) +* `max_comment_size`: new option (medium) +* promise: new API module (medium) +* errors: finish normalisation of all errors (easy) +* encoding: new encoding_input and encoding_output options (medium) +* context: isolate info properties at context root (easy) +* context: merge record, raw, context, info, error into a single object (medium) +* relax_column_count: rename INCONSISTENT_RECORD_LENGTH to RECORD_INCONSISTENT_FIELDS_LENGTH (easy) +* relax_column_count: rename RECORD_DONT_MATCH_COLUMNS_LENGTH to RECORD_INCONSISTENT_COLUMNS (easy) + +## Version 4.15.3 + +* feat: lib/browser compatibility with ES5 + +## Version 4.15.2 + +* docs: browser demo fix #302 +* fix: browserify export parse instead of stringify + +## Version 4.15.1 + +* fix: skip_empty_lines don't interfere with from_line + +## Version 4.15.0 + +* feat: new ignore_last_delimiters option, solve #193 +* feat: generate browser compatible lib +* refactor: rename raw to record +* docs: comment about trimable chars +* refactor: move isCharTrimable + +## Version 4.14.2 + +* fix(skip_lines_with_error): work with relax_column_count (#303) +* sample: async iterator +* sample: promises + +## Version 4.14.1 + +* package: latest dependencies +* ts: enable strict mode +* package: mocha inside package declaration + +## Version 4.14.0 + +* on_record: expose info.error when relax_column_count is activated +* raw: move tests +* package: latest dependencies + +## Version 4.13.1 + +* encoding: buffer, detection and options samples +* encoding: return buffer when null or false +* encoding: support boolean values +* api: remove commented code + +## Version 4.13.0 + +New features: +* encoding: auto-detect from the bom +* encoding: new option +* bom: multi bom encoding + +Fixes & enhancements: +* delimiter: fix buffer size computation +* quote: compatibility with buffer size +* api: partial cache for needMoreData +* escape: support multiple characters +* quote: support multiple characters +* api: fix internal argument name + +## Version 4.12.0 + +New feature: +* ts: error types +* ts: support camelcase options (fix #287) + +## Version 4.11.1 + +New feature: +* escape: disabled when null or false + +Project management: +* travis: test node version 14 + +## Version 4.11 + +Project management: +* mistake in the release + +## Version 4.10.1 + +Minor improvements: +* columns_duplicates_to_array: error and type + +## Version 4.10.0 + +New feature: +* columns_duplicates_to_array: new option + +Project management: +* samples: new file recipie + +## Version 4.9.1 + +Minor improvements: +* delimiter: update ts definition +* delimiter: new sample + +## Version 4.9.0 + +New Feature: +* delimiter: accept multiple values + +## Version 4.8.9 + +Fix: +* sync: disregard emitted null records + +New Feature: +* trim: support form feed character + +Minor improvements: +* src: cache length in loops +* trim: new sample +* to_line: simple sample +* comment: simple sample +* bom: sample with hidden bom +* bom: test behavior with the column option + +## Version 4.8.8 + +* api: fix regression in browser environments + +## Version 4.8.7 + +* api: fix input string with output stream + +## Version 4.8.6 + +* on_record: catch and handle user errors + +## Version 4.8.5 + +* ts: fix `types` declaration + +## Version 4.8.4 + +* ts: fix `types` declaration to a single file + +## Version 4.8.3 + +* `errors`: handle undefined captureStackTrace + +## Version 4.8.2 + +* `relax_column_count`: ts definitions for less and more + +## Version 4.8.1 + +* package: move pad dependency to dev + +## Version 4.8.0 + +* `relax_column_count`: new less and more options +* columns: skip empty records before detecting headers +* errors: rename `CSV_INCONSISTENT_RECORD_LENGTH` +* errors: rename `CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH` + +## Version 4.7.0 + +New Feature: +* `on_record`: user function to alter and filter records + +Minor improvements: +* test: ensure every sample is valid +* `from_line`: honours inferred column names +* `from_line`: new sample +* errors: expose `CSV_INVALID_ARGUMENT` +* errors: expose `CSV_INVALID_COLUMN_DEFINITION` +* errors: expose `CSV_OPTION_COLUMNS_MISSING_NAME` +* errors: expose `CSV_INVALID_OPTION_BOM` +* errors: expose `CSV_INVALID_OPTION_CAST` +* errors: expose `CSV_INVALID_OPTION_CAST_DATE` +* errors: expose `CSV_INVALID_OPTION_COLUMNS` +* errors: expose `CSV_INVALID_OPTION_COMMENT` +* errors: expose `CSV_INVALID_OPTION_DELIMITER` +* error: fix call to supper + +Project management: +* package: contributing +* package: code of conduct + +## Version 4.6.5 + +* context: column is null when cast force the context creation, fix #260 + +## Version 4.6.4 + +* errors: don't stringify/parse undefined and null values +* errors: expose `CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE` +* errors: expose `CSV_MAX_RECORD_SIZE` + +## Version 4.6.3 + +* lint: integrate eslint + +## Version 4.6.2 + +* context: null column when columns number inferior to record length + +## Version 4.6.1 + +* src: set const in for loop + +## Version 4.6.0 + +* `skip_lines_with_empty_values`: handle non string value +* errors: add context information +* tests: new error assertion framework +* buffer: serialize to json as string +* errors: expose `INVALID_OPENING_QUOTE` + +## Version 4.5.0 + +* errors: start normalizing errors with unique codes and context +* errors: expose `CSV_INVALID_CLOSING_QUOTE` +* errors: expose `CSV_QUOTE_NOT_CLOSED` +* errors: expose `CSV_INVALID_RECORD_LENGTH_DONT_PREVIOUS_RECORDS` +* errors: expose `CSV_INVALID_RECORD_LENGTH_DONT_MATCH_COLUMNS` +* errors: expose `CSV_INVALID_COLUMN_MAPPING` + +## Version 4.4.7 + +* travis: remove node.js 8 and add 12 +* destroy: test inside readable event + +## Version 4.4.6 + +* security: remove regexp vulnerable to DOS in cast option, npm report 69742 + +## Version 4.4.5 + +* ts: add buffer as allowed type for input, fix #248 + +## Version 4.4.4 + +* package: latest dependencies +* bom: detection when buffer smaller than bom +* package: remove deprecated `@types/should` dependency +* package: update file path + +## Version 4.4.3 + +* package: fix files declaration + +## Version 4.4.2 + +* `bom`: parsing for BOM character #239 +* ts: add sync definition +* package: replace npm ignore with file field + +## Version 4.4.1 + +Fix: +* `columns`: allows returning an array of string, undefined, null or false + +## Version 4.4.0 + +New features: +* options: new `bom` option + +## Version 4.3.4 + +* `columns`: enrich error message when provided as literal object +* `cast`: handle undefined columns +* `skip_lines_with_error`: new sample + +## Version 4.3.3 + +Fix: +columns: fix es5 generation + +## Version 4.3.2 + +Fix: +* columns: immutable option + +## Version 4.3.1 + +Minor enhancements: +* ts: distribute definitions with es5 +* ts: unused MatcherFunc type + +Project management: +* babel: include .babelrc to git + +## Version 4.3.0 + +New features: +* `objname`: accept a buffer + +Minor enhancements: +* `to_line`: validation refinements +* `trim`, ltrim, rtrim: validation refinements +* `to`: validation refinements +* `from_line`: validation refinements +* `objname`: validation refinements +* `from`: validation refinements +* `escape`: validation refinements +* `skip_empty_lines`: validation refinements +* `skip_lines_with_empty_values`: validation refinements +* `skip_lines_with_error`: validation refinements +* `relax_column_count`: validation refinements +* `relax`: validation refinements +* `delimiter`: validation refinements +* `max_record_size`: validation refinements + +## Version 4.2.0 + +Fix: +* `record_delimiter`: fix multi bytes with `skip_empty_lines` and `from_line` +* `rtrim`: accept tab + +## Version 4.1.0 + +New features: +* options: accept snake case and camel case +* `cast`: dont call cast for non column-mappable fields + +Fix: +* `cast`: ensure column is a string and not an array +* stream: handle empty input streams +* `cast`: function may return non-string values +* stream: pass stream options without modification + +## Version 4.0.1 + +Fix: +* `relax_column_count`: handle records with more columns + +## Version 4.0.0 + +This is a complete rewrite based with a Buffer implementation. There are no major breaking changes but it introduces multiple minor breaking changes: + +* option `rowDelimiter` is now `record_delimiter` +* option `max_limit_on_data_read` is now `max_record_size` +* drop the record event +* normalise error message as `{error type}: {error description}` +* state values are now isolated into the `info` object +* `count` is now `info.records` +* `lines` is now `info.lines` +* `empty_line_count` is now `info.empty_lines` +* `skipped_line_count` is now `info.invalid_field_length` +* `context.count` is cast function is now `context.records` +* drop support for deprecated options `auto_parse` and `auto_parse_date` +* drop emission of the `record` event +* in `raw` option, the `row` property is renamed `record` +* default value of `max_record_size` is now `0` (unlimited) +* remove the `record` event, use the `readable` event and `this.read()` instead + +New features: +* new options `info`, `from_line` and `to_line` +* `trim`: respect `ltrim` and `rtrim` when defined +* `delimiter`: may be a Buffer +* `delimiter`: handle multiple bytes/characters +* callback: export info object as third argument +* `cast`: catch error in user functions +* ts: mark info as readonly with required properties +* `comment_lines`: count the number of commented lines with no records +* callback: pass undefined instead of null + +API management: +* Multiple tests have been rewritten with easier data sample +* Source code is now written in ES6 instead of CoffeeScript +* package: switch to MIT license + +## Version 3.2.0 + +* `max_limit_on_data_read`: update error msg +* src: simplify detection for more data +* lines: test empty line account for 1 line +* options: extract default options +* package: add a few keywords +* src: precompute escapeIsQuote +* travis: test against Node.js 11 + +## Version 3.1.3 + +* `rowDelimiter`: fix overlap with delimiter +* internal: rename rowDelimiterLength to `rowDelimiterMaxLength` + +## Version 3.1.2 + +* readme: fix links to project website + +## Version 3.1.1 + +* src: generate code + +## Version 3.1.0 + +* package: move to csv.js.org +* samples: new cast sample +* package: upgrade to babel 7 +* samples: new mixed api samples +* samples: new column script +* samples: update syntax +* package: improve ignore files + +## Version 3.0.0 + +Breaking changes: +* `columns`: skip empty values when null, false or undefined + +Cleanup: +* sync: refactor internal variables +* index: use destructuring assignment for deps + +## Version 2.5.0 + +* typescript: make definition header more relevant + +## Version 2.4.1 + +* `to`: ignore future records when to is reached + +## Version 2.4.0 + +* `trim`: after and before quote +* tests: compatibility with Node.js 10 +* `trim`: handle quote followed by escape +* parser: set nextChar to null instead of empty +* travis: run against node 8 and 10 + +## Version 2.3.0 + +* `cast`: pass the header property +* `auto_parse`: deprecated message on tests +* `cast`: inject lines property + +## Version 2.2.0 + +* `cast`: deprecate `auto_parse` +* `auto_parse`: function get context as second argument + +## Version 2.1.0 + +* `skip_lines_with_error`: DRYed implementation +* `skip_lines_with_error`: Go process the next line on error +* events: register and write not blocking +* test: prefix names by group membership +* events: emit record +* raw: test to ensure it preserve columns +* package: latest dependencies (28 march 2018) +* raw: ensure tests call and success +* package: ignore npm and yarn lock files +* sync: handle errors on last line + +## Version 2.0.4 + +* package: move babel to dev dependencies + +## Version 2.0.3 + +* package: es5 backward compatibility +* package: ignore yarn lock file + +## Version 2.0.2 + +* package: only remove js files in lib +* source: remove unreferenced variables #179 +* package: start running tests in preversion +* package: new release workflow + +## 2.0.0 + +This major version use CoffeeScript 2 which produces a modern JavaScript syntax +(ES6, or ES2015 and later) and break the compatibility with versions of Node.js +lower than 7.6 as well as the browsers. It is however stable in term of API. + +* package: use CoffeeScript 2 + +## v1.3.3 + +* package: revert to CoffeeScript 1 + +## v1.3.2 + +Irrelevant release, forgot to generate the coffee files. + +## v1.3.1 + +* package: preserve compatibility with Node.js < 7.6 + +## v1.3.0 + +* options: `auto_parse` as a user function +* options: `auto_parse_date` as a user function +* test: should require handled by mocha +* package: coffeescript 2 and use semver tilde +* options: ensure objectMode is cloned + +## v1.2.4 + +* `relax_column_count`: honors count while preserving skipped_line_count +* api: improve argument validation + +## v1.2.3 + +* sync: catch err on write + +## v1.2.2 + +* relax: handle double quote + +## v1.2.1 + +* src: group state variable initialisation +* package: update repo url +* quote: disabled when null, false or empty +* src: remove try/catch +* src: optimize estimation for row delimiter length +* lines: improve tests +* src: use in instead of multiple is +* src: string optimization + +## v1.2.0 + +* skip default row delimiters when quoted #58 +* `auto_parse`: cleaner implementation +* src: isolate internal variables + +## v1.1.12 + +* options: new to and from options + +## v1.1.11 + +* `rowDelimiters`: fix all last month issues + +## v1.1.10 + +* regression with trim and last empty field #123 + +## V1.1.9 + +* `rowDelimiter`: simplification +* fix regression when trim and skip_empty_lines activated #122 +* `auto_parse` = simplify internal function + +## V1.1.8 + +* src: trailing whitespace and empty headers #120 +* `rowDelimiter`: adding support for multiple row delimiters #119 +* Remove unnecessary argument: `Parser.prototype.__write` #114 + +## v1.1.7 + +* `skip_lines_with_empty_values`: support space and tabs #108 +* test: remove coverage support +* test: group by api, options and properties +* `skip_lines_with_empty_values` option +* write test illustrating column function throwing an error #98 +* added ability to skip columns #50 + +## v1.1.6 + +* reduce substr usage +* new raw option + +## v1.1.5 + +* `empty_line_count` counter and renamed skipped to `skipped_line_count` +* skipped line count + +## v1.1.4 + +* avoid de-optimisation due to wrong charAt index #103 +* parser writing before assigning listeners + +## v1.1.3 + +* `columns`: stop on column count error #100 + +## v1.1.2 + +* make the parser more sensitive to input +* test case about the chunks of multiple chars without quotes +* test about data emission with newline + +## v1.1.1 + +* stream: call end if data instance of buffer +* travis: add nodejs 6 +* `columns`: fix line error #97 + +## v1.1.0 + +* `relax_column_count`: default to false (strict) + +## v1.0.6 + +* `relax_column_count`: backward compatibility for 1.0.x +* `relax_column_count`: introduce new option +* `columns`: detect column length and fix lines count + +## v1.0.5 + +* fix quotes tests that used data with inconsistent number of #73 +* add tests for inconsistent number of columns #73 +* throw an error when a column is missing #73 +* travis: test nodejs versions 4, 5 +* `max_limit_on_data_read`: new option +* removing the duplicate files in test and samples #86 +* option argument to accept the number of bytes can be read #86 +* avoid unwanted parsing when there is wrong delimiter or row delimiter #86 + +## v1.0.4 + +* sync: support `objname` + +## v1.0.3 + +* sync: please older versions of node.js +* sync: new sample + +## v1.0.2 + +* sync: new module +* removed global variable record on stream.js example #70 + +## v1.0.1 + +* api: accept buffer with 3 arguments #57 +* package: latest dependencies +* spectrum: bypass regression test + +## v1.0.0 + +* `auto_parse`: work on all fields, rename to “is_*†+* `auto_parse`: simplify test diff --git a/node_modules/csv-parse/LICENSE b/node_modules/csv-parse/LICENSE new file mode 100644 index 00000000..918eaf05 --- /dev/null +++ b/node_modules/csv-parse/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2010 Adaltas + +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/node_modules/csv-parse/README.md b/node_modules/csv-parse/README.md new file mode 100644 index 00000000..9d8c28e9 --- /dev/null +++ b/node_modules/csv-parse/README.md @@ -0,0 +1,27 @@ + +# CSV Parser for Node.js + +[![Build Status](https://api.travis-ci.org/adaltas/node-csv-parse.svg)](https://travis-ci.org/#!/adaltas/node-csv-parse) [![NPM](https://img.shields.io/npm/dm/csv-parse)](https://www.npmjs.com/package/csv-parse) [![NPM](https://img.shields.io/npm/v/csv-parse)](https://www.npmjs.com/package/csv-parse) + +Part of the [CSV module](https://csv.js.org/), this project is a parser converting CSV text input into arrays or objects. It implements the Node.js [`stream.Transform` API](http://nodejs.org/api/stream.html#stream_class_stream_transform). It also provides a simple callback-based API for convenience. It is both extremely easy to use and powerful. It was first released in 2010 and is used against big data sets by a large community. + +## Documentation + +* [Project homepage](http://csv.js.org/parse/) +* [API](http://csv.js.org/parse/api/) +* [Options](http://csv.js.org/parse/options/) +* [Info properties](http://csv.js.org/parse/info/) +* [Common errors](http://csv.js.org/parse/errors/) +* [Examples](http://csv.js.org/project/examples/) + +## Features + +* Follow the Node.js streaming API +* Simplicity with the optional callback API +* Support delimiters, quotes, escape characters and comments +* Line breaks discovery +* Support big datasets +* Complete test coverage and samples for inspiration +* No external dependencies +* Work nicely with the [csv-generate](https://csv.js.org/generate/), [stream-transform](https://csv.js.org/transform/) and [csv-stringify](https://csv.js.org/stringify/) packages +* MIT License diff --git a/node_modules/csv-parse/lib/.DS_Store b/node_modules/csv-parse/lib/.DS_Store new file mode 100644 index 00000000..14c24fb7 Binary files /dev/null and b/node_modules/csv-parse/lib/.DS_Store differ diff --git a/node_modules/csv-parse/lib/ResizeableBuffer.js b/node_modules/csv-parse/lib/ResizeableBuffer.js new file mode 100644 index 00000000..467422c1 --- /dev/null +++ b/node_modules/csv-parse/lib/ResizeableBuffer.js @@ -0,0 +1,65 @@ + + +class ResizeableBuffer{ + constructor(size=100){ + this.size = size + this.length = 0 + this.buf = Buffer.alloc(size) + } + prepend(val){ + if(Buffer.isBuffer(val)){ + const length = this.length + val.length + if(length >= this.size){ + this.resize() + if(length >= this.size){ + throw Error('INVALID_BUFFER_STATE') + } + } + const buf = this.buf + this.buf = Buffer.alloc(this.size) + val.copy(this.buf, 0) + buf.copy(this.buf, val.length) + this.length += val.length + }else{ + const length = this.length++ + if(length === this.size){ + this.resize() + } + const buf = this.clone() + this.buf[0] = val + buf.copy(this.buf,1, 0, length) + } + } + append(val){ + const length = this.length++ + if(length === this.size){ + this.resize() + } + this.buf[length] = val + } + clone(){ + return Buffer.from(this.buf.slice(0, this.length)) + } + resize(){ + const length = this.length + this.size = this.size * 2 + const buf = Buffer.alloc(this.size) + this.buf.copy(buf,0, 0, length) + this.buf = buf + } + toString(encoding){ + if(encoding){ + return this.buf.slice(0, this.length).toString(encoding) + }else{ + return Uint8Array.prototype.slice.call(this.buf.slice(0, this.length)) + } + } + toJSON(){ + return this.toString('utf8') + } + reset(){ + this.length = 0 + } +} + +module.exports = ResizeableBuffer diff --git a/node_modules/csv-parse/lib/browser/index.js b/node_modules/csv-parse/lib/browser/index.js new file mode 100644 index 00000000..33fface4 --- /dev/null +++ b/node_modules/csv-parse/lib/browser/index.js @@ -0,0 +1,8090 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.parse = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 0 && arguments[0] !== undefined ? arguments[0] : 100; + + _classCallCheck(this, ResizeableBuffer); + + this.size = size; + this.length = 0; + this.buf = Buffer.alloc(size); + } + + _createClass(ResizeableBuffer, [{ + key: "prepend", + value: function prepend(val) { + if (Buffer.isBuffer(val)) { + var length = this.length + val.length; + + if (length >= this.size) { + this.resize(); + + if (length >= this.size) { + throw Error('INVALID_BUFFER_STATE'); + } + } + + var buf = this.buf; + this.buf = Buffer.alloc(this.size); + val.copy(this.buf, 0); + buf.copy(this.buf, val.length); + this.length += val.length; + } else { + var _length = this.length++; + + if (_length === this.size) { + this.resize(); + } + + var _buf = this.clone(); + + this.buf[0] = val; + + _buf.copy(this.buf, 1, 0, _length); + } + } + }, { + key: "append", + value: function append(val) { + var length = this.length++; + + if (length === this.size) { + this.resize(); + } + + this.buf[length] = val; + } + }, { + key: "clone", + value: function clone() { + return Buffer.from(this.buf.slice(0, this.length)); + } + }, { + key: "resize", + value: function resize() { + var length = this.length; + this.size = this.size * 2; + var buf = Buffer.alloc(this.size); + this.buf.copy(buf, 0, 0, length); + this.buf = buf; + } + }, { + key: "toString", + value: function toString(encoding) { + if (encoding) { + return this.buf.slice(0, this.length).toString(encoding); + } else { + return Uint8Array.prototype.slice.call(this.buf.slice(0, this.length)); + } + } + }, { + key: "toJSON", + value: function toJSON() { + return this.toString('utf8'); + } + }, { + key: "reset", + value: function reset() { + this.length = 0; + } + }]); + + return ResizeableBuffer; +}(); + +module.exports = ResizeableBuffer; + +}).call(this)}).call(this,require("buffer").Buffer) +},{"buffer":5}],2:[function(require,module,exports){ +(function (Buffer,setImmediate){(function (){ +"use strict"; + +function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } + +function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } + +function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +/* +CSV Parse + +Please look at the [project documentation](https://csv.js.org/parse/) for +additional information. +*/ +var _require = require('stream'), + Transform = _require.Transform; + +var ResizeableBuffer = require('./ResizeableBuffer'); // white space characters +// https://en.wikipedia.org/wiki/Whitespace_character +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Character_Classes#Types +// \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff + + +var tab = 9; +var nl = 10; // \n, 0x0A in hexadecimal, 10 in decimal + +var np = 12; +var cr = 13; // \r, 0x0D in hexadécimal, 13 in decimal + +var space = 32; +var boms = { + // Note, the following are equals: + // Buffer.from("\ufeff") + // Buffer.from([239, 187, 191]) + // Buffer.from('EFBBBF', 'hex') + 'utf8': Buffer.from([239, 187, 191]), + // Note, the following are equals: + // Buffer.from "\ufeff", 'utf16le + // Buffer.from([255, 254]) + 'utf16le': Buffer.from([255, 254]) +}; + +var Parser = /*#__PURE__*/function (_Transform) { + _inherits(Parser, _Transform); + + var _super = _createSuper(Parser); + + function Parser() { + var _this; + + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, Parser); + + _this = _super.call(this, _objectSpread(_objectSpread(_objectSpread({}, { + readableObjectMode: true + }), opts), {}, { + encoding: null + })); + _this.__originalOptions = opts; + + _this.__normalizeOptions(opts); + + return _this; + } + + _createClass(Parser, [{ + key: "__normalizeOptions", + value: function __normalizeOptions(opts) { + var options = {}; // Merge with user options + + for (var opt in opts) { + options[underscore(opt)] = opts[opt]; + } // Normalize option `encoding` + // Note: defined first because other options depends on it + // to convert chars/strings into buffers. + + + if (options.encoding === undefined || options.encoding === true) { + options.encoding = 'utf8'; + } else if (options.encoding === null || options.encoding === false) { + options.encoding = null; + } else if (typeof options.encoding !== 'string' && options.encoding !== null) { + throw new CsvError('CSV_INVALID_OPTION_ENCODING', ['Invalid option encoding:', 'encoding must be a string or null to return a buffer,', "got ".concat(JSON.stringify(options.encoding))], options); + } // Normalize option `bom` + + + if (options.bom === undefined || options.bom === null || options.bom === false) { + options.bom = false; + } else if (options.bom !== true) { + throw new CsvError('CSV_INVALID_OPTION_BOM', ['Invalid option bom:', 'bom must be true,', "got ".concat(JSON.stringify(options.bom))], options); + } // Normalize option `cast` + + + var fnCastField = null; + + if (options.cast === undefined || options.cast === null || options.cast === false || options.cast === '') { + options.cast = undefined; + } else if (typeof options.cast === 'function') { + fnCastField = options.cast; + options.cast = true; + } else if (options.cast !== true) { + throw new CsvError('CSV_INVALID_OPTION_CAST', ['Invalid option cast:', 'cast must be true or a function,', "got ".concat(JSON.stringify(options.cast))], options); + } // Normalize option `cast_date` + + + if (options.cast_date === undefined || options.cast_date === null || options.cast_date === false || options.cast_date === '') { + options.cast_date = false; + } else if (options.cast_date === true) { + options.cast_date = function (value) { + var date = Date.parse(value); + return !isNaN(date) ? new Date(date) : value; + }; + } else if (typeof options.cast_date !== 'function') { + throw new CsvError('CSV_INVALID_OPTION_CAST_DATE', ['Invalid option cast_date:', 'cast_date must be true or a function,', "got ".concat(JSON.stringify(options.cast_date))], options); + } // Normalize option `columns` + + + var fnFirstLineToHeaders = null; + + if (options.columns === true) { + // Fields in the first line are converted as-is to columns + fnFirstLineToHeaders = undefined; + } else if (typeof options.columns === 'function') { + fnFirstLineToHeaders = options.columns; + options.columns = true; + } else if (Array.isArray(options.columns)) { + options.columns = normalizeColumnsArray(options.columns); + } else if (options.columns === undefined || options.columns === null || options.columns === false) { + options.columns = false; + } else { + throw new CsvError('CSV_INVALID_OPTION_COLUMNS', ['Invalid option columns:', 'expect an object, a function or true,', "got ".concat(JSON.stringify(options.columns))], options); + } // Normalize option `columns_duplicates_to_array` + + + if (options.columns_duplicates_to_array === undefined || options.columns_duplicates_to_array === null || options.columns_duplicates_to_array === false) { + options.columns_duplicates_to_array = false; + } else if (options.columns_duplicates_to_array !== true) { + throw new CsvError('CSV_INVALID_OPTION_COLUMNS_DUPLICATES_TO_ARRAY', ['Invalid option columns_duplicates_to_array:', 'expect an boolean,', "got ".concat(JSON.stringify(options.columns_duplicates_to_array))], options); + } // Normalize option `comment` + + + if (options.comment === undefined || options.comment === null || options.comment === false || options.comment === '') { + options.comment = null; + } else { + if (typeof options.comment === 'string') { + options.comment = Buffer.from(options.comment, options.encoding); + } + + if (!Buffer.isBuffer(options.comment)) { + throw new CsvError('CSV_INVALID_OPTION_COMMENT', ['Invalid option comment:', 'comment must be a buffer or a string,', "got ".concat(JSON.stringify(options.comment))], options); + } + } // Normalize option `delimiter` + + + var delimiter_json = JSON.stringify(options.delimiter); + if (!Array.isArray(options.delimiter)) options.delimiter = [options.delimiter]; + + if (options.delimiter.length === 0) { + throw new CsvError('CSV_INVALID_OPTION_DELIMITER', ['Invalid option delimiter:', 'delimiter must be a non empty string or buffer or array of string|buffer,', "got ".concat(delimiter_json)], options); + } + + options.delimiter = options.delimiter.map(function (delimiter) { + if (delimiter === undefined || delimiter === null || delimiter === false) { + return Buffer.from(',', options.encoding); + } + + if (typeof delimiter === 'string') { + delimiter = Buffer.from(delimiter, options.encoding); + } + + if (!Buffer.isBuffer(delimiter) || delimiter.length === 0) { + throw new CsvError('CSV_INVALID_OPTION_DELIMITER', ['Invalid option delimiter:', 'delimiter must be a non empty string or buffer or array of string|buffer,', "got ".concat(delimiter_json)], options); + } + + return delimiter; + }); // Normalize option `escape` + + if (options.escape === undefined || options.escape === true) { + options.escape = Buffer.from('"', options.encoding); + } else if (typeof options.escape === 'string') { + options.escape = Buffer.from(options.escape, options.encoding); + } else if (options.escape === null || options.escape === false) { + options.escape = null; + } + + if (options.escape !== null) { + if (!Buffer.isBuffer(options.escape)) { + throw new Error("Invalid Option: escape must be a buffer, a string or a boolean, got ".concat(JSON.stringify(options.escape))); + } + } // Normalize option `from` + + + if (options.from === undefined || options.from === null) { + options.from = 1; + } else { + if (typeof options.from === 'string' && /\d+/.test(options.from)) { + options.from = parseInt(options.from); + } + + if (Number.isInteger(options.from)) { + if (options.from < 0) { + throw new Error("Invalid Option: from must be a positive integer, got ".concat(JSON.stringify(opts.from))); + } + } else { + throw new Error("Invalid Option: from must be an integer, got ".concat(JSON.stringify(options.from))); + } + } // Normalize option `from_line` + + + if (options.from_line === undefined || options.from_line === null) { + options.from_line = 1; + } else { + if (typeof options.from_line === 'string' && /\d+/.test(options.from_line)) { + options.from_line = parseInt(options.from_line); + } + + if (Number.isInteger(options.from_line)) { + if (options.from_line <= 0) { + throw new Error("Invalid Option: from_line must be a positive integer greater than 0, got ".concat(JSON.stringify(opts.from_line))); + } + } else { + throw new Error("Invalid Option: from_line must be an integer, got ".concat(JSON.stringify(opts.from_line))); + } + } // Normalize options `ignore_last_delimiters` + + + if (options.ignore_last_delimiters === undefined || options.ignore_last_delimiters === null) { + options.ignore_last_delimiters = false; + } else if (typeof options.ignore_last_delimiters === 'number') { + options.ignore_last_delimiters = Math.floor(options.ignore_last_delimiters); + + if (options.ignore_last_delimiters === 0) { + options.ignore_last_delimiters = false; + } + } else if (typeof options.ignore_last_delimiters !== 'boolean') { + throw new CsvError('CSV_INVALID_OPTION_IGNORE_LAST_DELIMITERS', ['Invalid option `ignore_last_delimiters`:', 'the value must be a boolean value or an integer,', "got ".concat(JSON.stringify(options.ignore_last_delimiters))], options); + } + + if (options.ignore_last_delimiters === true && options.columns === false) { + throw new CsvError('CSV_IGNORE_LAST_DELIMITERS_REQUIRES_COLUMNS', ['The option `ignore_last_delimiters`', 'requires the activation of the `columns` option'], options); + } // Normalize option `info` + + + if (options.info === undefined || options.info === null || options.info === false) { + options.info = false; + } else if (options.info !== true) { + throw new Error("Invalid Option: info must be true, got ".concat(JSON.stringify(options.info))); + } // Normalize option `max_record_size` + + + if (options.max_record_size === undefined || options.max_record_size === null || options.max_record_size === false) { + options.max_record_size = 0; + } else if (Number.isInteger(options.max_record_size) && options.max_record_size >= 0) {// Great, nothing to do + } else if (typeof options.max_record_size === 'string' && /\d+/.test(options.max_record_size)) { + options.max_record_size = parseInt(options.max_record_size); + } else { + throw new Error("Invalid Option: max_record_size must be a positive integer, got ".concat(JSON.stringify(options.max_record_size))); + } // Normalize option `objname` + + + if (options.objname === undefined || options.objname === null || options.objname === false) { + options.objname = undefined; + } else if (Buffer.isBuffer(options.objname)) { + if (options.objname.length === 0) { + throw new Error("Invalid Option: objname must be a non empty buffer"); + } + + if (options.encoding === null) {// Don't call `toString`, leave objname as a buffer + } else { + options.objname = options.objname.toString(options.encoding); + } + } else if (typeof options.objname === 'string') { + if (options.objname.length === 0) { + throw new Error("Invalid Option: objname must be a non empty string"); + } // Great, nothing to do + + } else { + throw new Error("Invalid Option: objname must be a string or a buffer, got ".concat(options.objname)); + } // Normalize option `on_record` + + + if (options.on_record === undefined || options.on_record === null) { + options.on_record = undefined; + } else if (typeof options.on_record !== 'function') { + throw new CsvError('CSV_INVALID_OPTION_ON_RECORD', ['Invalid option `on_record`:', 'expect a function,', "got ".concat(JSON.stringify(options.on_record))], options); + } // Normalize option `quote` + + + if (options.quote === null || options.quote === false || options.quote === '') { + options.quote = null; + } else { + if (options.quote === undefined || options.quote === true) { + options.quote = Buffer.from('"', options.encoding); + } else if (typeof options.quote === 'string') { + options.quote = Buffer.from(options.quote, options.encoding); + } + + if (!Buffer.isBuffer(options.quote)) { + throw new Error("Invalid Option: quote must be a buffer or a string, got ".concat(JSON.stringify(options.quote))); + } + } // Normalize option `raw` + + + if (options.raw === undefined || options.raw === null || options.raw === false) { + options.raw = false; + } else if (options.raw !== true) { + throw new Error("Invalid Option: raw must be true, got ".concat(JSON.stringify(options.raw))); + } // Normalize option `record_delimiter` + + + if (!options.record_delimiter) { + options.record_delimiter = []; + } else if (!Array.isArray(options.record_delimiter)) { + options.record_delimiter = [options.record_delimiter]; + } + + options.record_delimiter = options.record_delimiter.map(function (rd) { + if (typeof rd === 'string') { + rd = Buffer.from(rd, options.encoding); + } + + return rd; + }); // Normalize option `relax` + + if (typeof options.relax === 'boolean') {// Great, nothing to do + } else if (options.relax === undefined || options.relax === null) { + options.relax = false; + } else { + throw new Error("Invalid Option: relax must be a boolean, got ".concat(JSON.stringify(options.relax))); + } // Normalize option `relax_column_count` + + + if (typeof options.relax_column_count === 'boolean') {// Great, nothing to do + } else if (options.relax_column_count === undefined || options.relax_column_count === null) { + options.relax_column_count = false; + } else { + throw new Error("Invalid Option: relax_column_count must be a boolean, got ".concat(JSON.stringify(options.relax_column_count))); + } + + if (typeof options.relax_column_count_less === 'boolean') {// Great, nothing to do + } else if (options.relax_column_count_less === undefined || options.relax_column_count_less === null) { + options.relax_column_count_less = false; + } else { + throw new Error("Invalid Option: relax_column_count_less must be a boolean, got ".concat(JSON.stringify(options.relax_column_count_less))); + } + + if (typeof options.relax_column_count_more === 'boolean') {// Great, nothing to do + } else if (options.relax_column_count_more === undefined || options.relax_column_count_more === null) { + options.relax_column_count_more = false; + } else { + throw new Error("Invalid Option: relax_column_count_more must be a boolean, got ".concat(JSON.stringify(options.relax_column_count_more))); + } // Normalize option `skip_empty_lines` + + + if (typeof options.skip_empty_lines === 'boolean') {// Great, nothing to do + } else if (options.skip_empty_lines === undefined || options.skip_empty_lines === null) { + options.skip_empty_lines = false; + } else { + throw new Error("Invalid Option: skip_empty_lines must be a boolean, got ".concat(JSON.stringify(options.skip_empty_lines))); + } // Normalize option `skip_lines_with_empty_values` + + + if (typeof options.skip_lines_with_empty_values === 'boolean') {// Great, nothing to do + } else if (options.skip_lines_with_empty_values === undefined || options.skip_lines_with_empty_values === null) { + options.skip_lines_with_empty_values = false; + } else { + throw new Error("Invalid Option: skip_lines_with_empty_values must be a boolean, got ".concat(JSON.stringify(options.skip_lines_with_empty_values))); + } // Normalize option `skip_lines_with_error` + + + if (typeof options.skip_lines_with_error === 'boolean') {// Great, nothing to do + } else if (options.skip_lines_with_error === undefined || options.skip_lines_with_error === null) { + options.skip_lines_with_error = false; + } else { + throw new Error("Invalid Option: skip_lines_with_error must be a boolean, got ".concat(JSON.stringify(options.skip_lines_with_error))); + } // Normalize option `rtrim` + + + if (options.rtrim === undefined || options.rtrim === null || options.rtrim === false) { + options.rtrim = false; + } else if (options.rtrim !== true) { + throw new Error("Invalid Option: rtrim must be a boolean, got ".concat(JSON.stringify(options.rtrim))); + } // Normalize option `ltrim` + + + if (options.ltrim === undefined || options.ltrim === null || options.ltrim === false) { + options.ltrim = false; + } else if (options.ltrim !== true) { + throw new Error("Invalid Option: ltrim must be a boolean, got ".concat(JSON.stringify(options.ltrim))); + } // Normalize option `trim` + + + if (options.trim === undefined || options.trim === null || options.trim === false) { + options.trim = false; + } else if (options.trim !== true) { + throw new Error("Invalid Option: trim must be a boolean, got ".concat(JSON.stringify(options.trim))); + } // Normalize options `trim`, `ltrim` and `rtrim` + + + if (options.trim === true && opts.ltrim !== false) { + options.ltrim = true; + } else if (options.ltrim !== true) { + options.ltrim = false; + } + + if (options.trim === true && opts.rtrim !== false) { + options.rtrim = true; + } else if (options.rtrim !== true) { + options.rtrim = false; + } // Normalize option `to` + + + if (options.to === undefined || options.to === null) { + options.to = -1; + } else { + if (typeof options.to === 'string' && /\d+/.test(options.to)) { + options.to = parseInt(options.to); + } + + if (Number.isInteger(options.to)) { + if (options.to <= 0) { + throw new Error("Invalid Option: to must be a positive integer greater than 0, got ".concat(JSON.stringify(opts.to))); + } + } else { + throw new Error("Invalid Option: to must be an integer, got ".concat(JSON.stringify(opts.to))); + } + } // Normalize option `to_line` + + + if (options.to_line === undefined || options.to_line === null) { + options.to_line = -1; + } else { + if (typeof options.to_line === 'string' && /\d+/.test(options.to_line)) { + options.to_line = parseInt(options.to_line); + } + + if (Number.isInteger(options.to_line)) { + if (options.to_line <= 0) { + throw new Error("Invalid Option: to_line must be a positive integer greater than 0, got ".concat(JSON.stringify(opts.to_line))); + } + } else { + throw new Error("Invalid Option: to_line must be an integer, got ".concat(JSON.stringify(opts.to_line))); + } + } + + this.info = { + comment_lines: 0, + empty_lines: 0, + invalid_field_length: 0, + lines: 1, + records: 0 + }; + this.options = options; + this.state = { + bomSkipped: false, + castField: fnCastField, + commenting: false, + // Current error encountered by a record + error: undefined, + enabled: options.from_line === 1, + escaping: false, + // escapeIsQuote: options.escape === options.quote, + escapeIsQuote: Buffer.isBuffer(options.escape) && Buffer.isBuffer(options.quote) && Buffer.compare(options.escape, options.quote) === 0, + expectedRecordLength: options.columns === null ? 0 : options.columns.length, + field: new ResizeableBuffer(20), + firstLineToHeaders: fnFirstLineToHeaders, + info: Object.assign({}, this.info), + needMoreDataSize: Math.max.apply(Math, [// Skip if the remaining buffer smaller than comment + options.comment !== null ? options.comment.length : 0].concat(_toConsumableArray(options.delimiter.map(function (delimiter) { + return delimiter.length; + })), [// Skip if the remaining buffer can be escape sequence + options.quote !== null ? options.quote.length : 0])), + previousBuf: undefined, + quoting: false, + stop: false, + rawBuffer: new ResizeableBuffer(100), + record: [], + recordHasError: false, + record_length: 0, + recordDelimiterMaxLength: options.record_delimiter.length === 0 ? 2 : Math.max.apply(Math, _toConsumableArray(options.record_delimiter.map(function (v) { + return v.length; + }))), + trimChars: [Buffer.from(' ', options.encoding)[0], Buffer.from('\t', options.encoding)[0]], + wasQuoting: false, + wasRowDelimiter: false + }; + } // Implementation of `Transform._transform` + + }, { + key: "_transform", + value: function _transform(buf, encoding, callback) { + if (this.state.stop === true) { + return; + } + + var err = this.__parse(buf, false); + + if (err !== undefined) { + this.state.stop = true; + } + + callback(err); + } // Implementation of `Transform._flush` + + }, { + key: "_flush", + value: function _flush(callback) { + if (this.state.stop === true) { + return; + } + + var err = this.__parse(undefined, true); + + callback(err); + } // Central parser implementation + + }, { + key: "__parse", + value: function __parse(nextBuf, end) { + var _this$options = this.options, + bom = _this$options.bom, + comment = _this$options.comment, + escape = _this$options.escape, + from_line = _this$options.from_line, + info = _this$options.info, + ltrim = _this$options.ltrim, + max_record_size = _this$options.max_record_size, + quote = _this$options.quote, + raw = _this$options.raw, + relax = _this$options.relax, + rtrim = _this$options.rtrim, + skip_empty_lines = _this$options.skip_empty_lines, + to = _this$options.to, + to_line = _this$options.to_line; + var record_delimiter = this.options.record_delimiter; + var _this$state = this.state, + bomSkipped = _this$state.bomSkipped, + previousBuf = _this$state.previousBuf, + rawBuffer = _this$state.rawBuffer, + escapeIsQuote = _this$state.escapeIsQuote; + var buf; + + if (previousBuf === undefined) { + if (nextBuf === undefined) { + // Handle empty string + this.push(null); + return; + } else { + buf = nextBuf; + } + } else if (previousBuf !== undefined && nextBuf === undefined) { + buf = previousBuf; + } else { + buf = Buffer.concat([previousBuf, nextBuf]); + } // Handle UTF BOM + + + if (bomSkipped === false) { + if (bom === false) { + this.state.bomSkipped = true; + } else if (buf.length < 3) { + // No enough data + if (end === false) { + // Wait for more data + this.state.previousBuf = buf; + return; + } + } else { + for (var encoding in boms) { + if (boms[encoding].compare(buf, 0, boms[encoding].length) === 0) { + // Skip BOM + buf = buf.slice(boms[encoding].length); // Renormalize original options with the new encoding + + this.__normalizeOptions(_objectSpread(_objectSpread({}, this.__originalOptions), {}, { + encoding: encoding + })); + + break; + } + } + + this.state.bomSkipped = true; + } + } + + var bufLen = buf.length; + var pos; + + for (pos = 0; pos < bufLen; pos++) { + // Ensure we get enough space to look ahead + // There should be a way to move this out of the loop + if (this.__needMoreData(pos, bufLen, end)) { + break; + } + + if (this.state.wasRowDelimiter === true) { + this.info.lines++; + + if (info === true && this.state.record.length === 0 && this.state.field.length === 0 && this.state.wasQuoting === false) { + this.state.info = Object.assign({}, this.info); + } + + this.state.wasRowDelimiter = false; + } + + if (to_line !== -1 && this.info.lines > to_line) { + this.state.stop = true; + this.push(null); + return; + } // Auto discovery of record_delimiter, unix, mac and windows supported + + + if (this.state.quoting === false && record_delimiter.length === 0) { + var record_delimiterCount = this.__autoDiscoverRecordDelimiter(buf, pos); + + if (record_delimiterCount) { + record_delimiter = this.options.record_delimiter; + } + } + + var chr = buf[pos]; + + if (raw === true) { + rawBuffer.append(chr); + } + + if ((chr === cr || chr === nl) && this.state.wasRowDelimiter === false) { + this.state.wasRowDelimiter = true; + } // Previous char was a valid escape char + // treat the current char as a regular char + + + if (this.state.escaping === true) { + this.state.escaping = false; + } else { + // Escape is only active inside quoted fields + // We are quoting, the char is an escape chr and there is a chr to escape + // if(escape !== null && this.state.quoting === true && chr === escape && pos + 1 < bufLen){ + if (escape !== null && this.state.quoting === true && this.__isEscape(buf, pos, chr) && pos + escape.length < bufLen) { + if (escapeIsQuote) { + if (this.__isQuote(buf, pos + escape.length)) { + this.state.escaping = true; + pos += escape.length - 1; + continue; + } + } else { + this.state.escaping = true; + pos += escape.length - 1; + continue; + } + } // Not currently escaping and chr is a quote + // TODO: need to compare bytes instead of single char + + + if (this.state.commenting === false && this.__isQuote(buf, pos)) { + if (this.state.quoting === true) { + var nextChr = buf[pos + quote.length]; + + var isNextChrTrimable = rtrim && this.__isCharTrimable(nextChr); + + var isNextChrComment = comment !== null && this.__compareBytes(comment, buf, pos + quote.length, nextChr); + + var isNextChrDelimiter = this.__isDelimiter(buf, pos + quote.length, nextChr); + + var isNextChrRecordDelimiter = record_delimiter.length === 0 ? this.__autoDiscoverRecordDelimiter(buf, pos + quote.length) : this.__isRecordDelimiter(nextChr, buf, pos + quote.length); // Escape a quote + // Treat next char as a regular character + + if (escape !== null && this.__isEscape(buf, pos, chr) && this.__isQuote(buf, pos + escape.length)) { + pos += escape.length - 1; + } else if (!nextChr || isNextChrDelimiter || isNextChrRecordDelimiter || isNextChrComment || isNextChrTrimable) { + this.state.quoting = false; + this.state.wasQuoting = true; + pos += quote.length - 1; + continue; + } else if (relax === false) { + var err = this.__error(new CsvError('CSV_INVALID_CLOSING_QUOTE', ['Invalid Closing Quote:', "got \"".concat(String.fromCharCode(nextChr), "\""), "at line ".concat(this.info.lines), 'instead of delimiter, record delimiter, trimable character', '(if activated) or comment'], this.options, this.__context())); + + if (err !== undefined) return err; + } else { + this.state.quoting = false; + this.state.wasQuoting = true; + this.state.field.prepend(quote); + pos += quote.length - 1; + } + } else { + if (this.state.field.length !== 0) { + // In relax mode, treat opening quote preceded by chrs as regular + if (relax === false) { + var _err = this.__error(new CsvError('INVALID_OPENING_QUOTE', ['Invalid Opening Quote:', "a quote is found inside a field at line ".concat(this.info.lines)], this.options, this.__context(), { + field: this.state.field + })); + + if (_err !== undefined) return _err; + } + } else { + this.state.quoting = true; + pos += quote.length - 1; + continue; + } + } + } + + if (this.state.quoting === false) { + var recordDelimiterLength = this.__isRecordDelimiter(chr, buf, pos); + + if (recordDelimiterLength !== 0) { + // Do not emit comments which take a full line + var skipCommentLine = this.state.commenting && this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0; + + if (skipCommentLine) { + this.info.comment_lines++; // Skip full comment line + } else { + // Activate records emition if above from_line + if (this.state.enabled === false && this.info.lines + (this.state.wasRowDelimiter === true ? 1 : 0) >= from_line) { + this.state.enabled = true; + + this.__resetField(); + + this.__resetRecord(); + + pos += recordDelimiterLength - 1; + continue; + } // Skip if line is empty and skip_empty_lines activated + + + if (skip_empty_lines === true && this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0) { + this.info.empty_lines++; + pos += recordDelimiterLength - 1; + continue; + } + + var errField = this.__onField(); + + if (errField !== undefined) return errField; + + var errRecord = this.__onRecord(); + + if (errRecord !== undefined) return errRecord; + + if (to !== -1 && this.info.records >= to) { + this.state.stop = true; + this.push(null); + return; + } + } + + this.state.commenting = false; + pos += recordDelimiterLength - 1; + continue; + } + + if (this.state.commenting) { + continue; + } + + var commentCount = comment === null ? 0 : this.__compareBytes(comment, buf, pos, chr); + + if (commentCount !== 0) { + this.state.commenting = true; + continue; + } + + var delimiterLength = this.__isDelimiter(buf, pos, chr); + + if (delimiterLength !== 0) { + var _errField = this.__onField(); + + if (_errField !== undefined) return _errField; + pos += delimiterLength - 1; + continue; + } + } + } + + if (this.state.commenting === false) { + if (max_record_size !== 0 && this.state.record_length + this.state.field.length > max_record_size) { + var _err2 = this.__error(new CsvError('CSV_MAX_RECORD_SIZE', ['Max Record Size:', 'record exceed the maximum number of tolerated bytes', "of ".concat(max_record_size), "at line ".concat(this.info.lines)], this.options, this.__context())); + + if (_err2 !== undefined) return _err2; + } + } + + var lappend = ltrim === false || this.state.quoting === true || this.state.field.length !== 0 || !this.__isCharTrimable(chr); // rtrim in non quoting is handle in __onField + + var rappend = rtrim === false || this.state.wasQuoting === false; + + if (lappend === true && rappend === true) { + this.state.field.append(chr); + } else if (rtrim === true && !this.__isCharTrimable(chr)) { + var _err3 = this.__error(new CsvError('CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE', ['Invalid Closing Quote:', 'found non trimable byte after quote', "at line ".concat(this.info.lines)], this.options, this.__context())); + + if (_err3 !== undefined) return _err3; + } + } + + if (end === true) { + // Ensure we are not ending in a quoting state + if (this.state.quoting === true) { + var _err4 = this.__error(new CsvError('CSV_QUOTE_NOT_CLOSED', ['Quote Not Closed:', "the parsing is finished with an opening quote at line ".concat(this.info.lines)], this.options, this.__context())); + + if (_err4 !== undefined) return _err4; + } else { + // Skip last line if it has no characters + if (this.state.wasQuoting === true || this.state.record.length !== 0 || this.state.field.length !== 0) { + var _errField2 = this.__onField(); + + if (_errField2 !== undefined) return _errField2; + + var _errRecord = this.__onRecord(); + + if (_errRecord !== undefined) return _errRecord; + } else if (this.state.wasRowDelimiter === true) { + this.info.empty_lines++; + } else if (this.state.commenting === true) { + this.info.comment_lines++; + } + } + } else { + this.state.previousBuf = buf.slice(pos); + } + + if (this.state.wasRowDelimiter === true) { + this.info.lines++; + this.state.wasRowDelimiter = false; + } + } + }, { + key: "__onRecord", + value: function __onRecord() { + var _this$options2 = this.options, + columns = _this$options2.columns, + columns_duplicates_to_array = _this$options2.columns_duplicates_to_array, + encoding = _this$options2.encoding, + info = _this$options2.info, + from = _this$options2.from, + relax_column_count = _this$options2.relax_column_count, + relax_column_count_less = _this$options2.relax_column_count_less, + relax_column_count_more = _this$options2.relax_column_count_more, + raw = _this$options2.raw, + skip_lines_with_empty_values = _this$options2.skip_lines_with_empty_values; + var _this$state2 = this.state, + enabled = _this$state2.enabled, + record = _this$state2.record; + + if (enabled === false) { + return this.__resetRecord(); + } // Convert the first line into column names + + + var recordLength = record.length; + + if (columns === true) { + if (isRecordEmpty(record)) { + this.__resetRecord(); + + return; + } + + return this.__firstLineToColumns(record); + } + + if (columns === false && this.info.records === 0) { + this.state.expectedRecordLength = recordLength; + } + + if (recordLength !== this.state.expectedRecordLength) { + var err = columns === false ? // Todo: rename CSV_INCONSISTENT_RECORD_LENGTH to + // CSV_RECORD_INCONSISTENT_FIELDS_LENGTH + new CsvError('CSV_INCONSISTENT_RECORD_LENGTH', ['Invalid Record Length:', "expect ".concat(this.state.expectedRecordLength, ","), "got ".concat(recordLength, " on line ").concat(this.info.lines)], this.options, this.__context(), { + record: record + }) : // Todo: rename CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH to + // CSV_RECORD_INCONSISTENT_COLUMNS + new CsvError('CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH', ['Invalid Record Length:', "columns length is ".concat(columns.length, ","), // rename columns + "got ".concat(recordLength, " on line ").concat(this.info.lines)], this.options, this.__context(), { + record: record + }); + + if (relax_column_count === true || relax_column_count_less === true && recordLength < this.state.expectedRecordLength || relax_column_count_more === true && recordLength > this.state.expectedRecordLength) { + this.info.invalid_field_length++; + this.state.error = err; // Error is undefined with skip_lines_with_error + } else { + var finalErr = this.__error(err); + + if (finalErr) return finalErr; + } + } + + if (skip_lines_with_empty_values === true) { + if (isRecordEmpty(record)) { + this.__resetRecord(); + + return; + } + } + + if (this.state.recordHasError === true) { + this.__resetRecord(); + + this.state.recordHasError = false; + return; + } + + this.info.records++; + + if (from === 1 || this.info.records >= from) { + if (columns !== false) { + var obj = {}; // Transform record array to an object + + for (var i = 0, l = record.length; i < l; i++) { + if (columns[i] === undefined || columns[i].disabled) continue; // Turn duplicate columns into an array + + if (columns_duplicates_to_array === true && obj[columns[i].name]) { + if (Array.isArray(obj[columns[i].name])) { + obj[columns[i].name] = obj[columns[i].name].concat(record[i]); + } else { + obj[columns[i].name] = [obj[columns[i].name], record[i]]; + } + } else { + obj[columns[i].name] = record[i]; + } + } + + var objname = this.options.objname; + + if (objname === undefined) { + if (raw === true || info === true) { + var _err5 = this.__push(Object.assign({ + record: obj + }, raw === true ? { + raw: this.state.rawBuffer.toString(encoding) + } : {}, info === true ? { + info: this.state.info + } : {})); + + if (_err5) { + return _err5; + } + } else { + var _err6 = this.__push(obj); + + if (_err6) { + return _err6; + } + } + } else { + if (raw === true || info === true) { + var _err7 = this.__push(Object.assign({ + record: [obj[objname], obj] + }, raw === true ? { + raw: this.state.rawBuffer.toString(encoding) + } : {}, info === true ? { + info: this.state.info + } : {})); + + if (_err7) { + return _err7; + } + } else { + var _err8 = this.__push([obj[objname], obj]); + + if (_err8) { + return _err8; + } + } + } + } else { + if (raw === true || info === true) { + var _err9 = this.__push(Object.assign({ + record: record + }, raw === true ? { + raw: this.state.rawBuffer.toString(encoding) + } : {}, info === true ? { + info: this.state.info + } : {})); + + if (_err9) { + return _err9; + } + } else { + var _err10 = this.__push(record); + + if (_err10) { + return _err10; + } + } + } + } + + this.__resetRecord(); + } + }, { + key: "__firstLineToColumns", + value: function __firstLineToColumns(record) { + var firstLineToHeaders = this.state.firstLineToHeaders; + + try { + var headers = firstLineToHeaders === undefined ? record : firstLineToHeaders.call(null, record); + + if (!Array.isArray(headers)) { + return this.__error(new CsvError('CSV_INVALID_COLUMN_MAPPING', ['Invalid Column Mapping:', 'expect an array from column function,', "got ".concat(JSON.stringify(headers))], this.options, this.__context(), { + headers: headers + })); + } + + var normalizedHeaders = normalizeColumnsArray(headers); + this.state.expectedRecordLength = normalizedHeaders.length; + this.options.columns = normalizedHeaders; + + this.__resetRecord(); + + return; + } catch (err) { + return err; + } + } + }, { + key: "__resetRecord", + value: function __resetRecord() { + if (this.options.raw === true) { + this.state.rawBuffer.reset(); + } + + this.state.error = undefined; + this.state.record = []; + this.state.record_length = 0; + } + }, { + key: "__onField", + value: function __onField() { + var _this$options3 = this.options, + cast = _this$options3.cast, + encoding = _this$options3.encoding, + rtrim = _this$options3.rtrim, + max_record_size = _this$options3.max_record_size; + var _this$state3 = this.state, + enabled = _this$state3.enabled, + wasQuoting = _this$state3.wasQuoting; // Short circuit for the from_line options + + if (enabled === false) { + /* this.options.columns !== true && */ + return this.__resetField(); + } + + var field = this.state.field.toString(encoding); + + if (rtrim === true && wasQuoting === false) { + field = field.trimRight(); + } + + if (cast === true) { + var _this$__cast = this.__cast(field), + _this$__cast2 = _slicedToArray(_this$__cast, 2), + err = _this$__cast2[0], + f = _this$__cast2[1]; + + if (err !== undefined) return err; + field = f; + } + + this.state.record.push(field); // Increment record length if record size must not exceed a limit + + if (max_record_size !== 0 && typeof field === 'string') { + this.state.record_length += field.length; + } + + this.__resetField(); + } + }, { + key: "__resetField", + value: function __resetField() { + this.state.field.reset(); + this.state.wasQuoting = false; + } + }, { + key: "__push", + value: function __push(record) { + var on_record = this.options.on_record; + + if (on_record !== undefined) { + var context = this.__context(); + + try { + record = on_record.call(null, record, context); + } catch (err) { + return err; + } + + if (record === undefined || record === null) { + return; + } + } + + this.push(record); + } // Return a tuple with the error and the casted value + + }, { + key: "__cast", + value: function __cast(field) { + var _this$options4 = this.options, + columns = _this$options4.columns, + relax_column_count = _this$options4.relax_column_count; + var isColumns = Array.isArray(columns); // Dont loose time calling cast + // because the final record is an object + // and this field can't be associated to a key present in columns + + if (isColumns === true && relax_column_count && this.options.columns.length <= this.state.record.length) { + return [undefined, undefined]; + } + + var context = this.__context(); + + if (this.state.castField !== null) { + try { + return [undefined, this.state.castField.call(null, field, context)]; + } catch (err) { + return [err]; + } + } + + if (this.__isFloat(field)) { + return [undefined, parseFloat(field)]; + } else if (this.options.cast_date !== false) { + return [undefined, this.options.cast_date.call(null, field, context)]; + } + + return [undefined, field]; + } // Helper to test if a character is a space or a line delimiter + + }, { + key: "__isCharTrimable", + value: function __isCharTrimable(chr) { + return chr === space || chr === tab || chr === cr || chr === nl || chr === np; + } // Keep it in case we implement the `cast_int` option + // __isInt(value){ + // // return Number.isInteger(parseInt(value)) + // // return !isNaN( parseInt( obj ) ); + // return /^(\-|\+)?[1-9][0-9]*$/.test(value) + // } + + }, { + key: "__isFloat", + value: function __isFloat(value) { + return value - parseFloat(value) + 1 >= 0; // Borrowed from jquery + } + }, { + key: "__compareBytes", + value: function __compareBytes(sourceBuf, targetBuf, targetPos, firstByte) { + if (sourceBuf[0] !== firstByte) return 0; + var sourceLength = sourceBuf.length; + + for (var i = 1; i < sourceLength; i++) { + if (sourceBuf[i] !== targetBuf[targetPos + i]) return 0; + } + + return sourceLength; + } + }, { + key: "__needMoreData", + value: function __needMoreData(i, bufLen, end) { + if (end) return false; + var quote = this.options.quote; + var _this$state4 = this.state, + quoting = _this$state4.quoting, + needMoreDataSize = _this$state4.needMoreDataSize, + recordDelimiterMaxLength = _this$state4.recordDelimiterMaxLength; + var numOfCharLeft = bufLen - i - 1; + var requiredLength = Math.max(needMoreDataSize, // Skip if the remaining buffer smaller than record delimiter + recordDelimiterMaxLength, // Skip if the remaining buffer can be record delimiter following the closing quote + // 1 is for quote.length + quoting ? quote.length + recordDelimiterMaxLength : 0); + return numOfCharLeft < requiredLength; + } + }, { + key: "__isDelimiter", + value: function __isDelimiter(buf, pos, chr) { + var _this$options5 = this.options, + delimiter = _this$options5.delimiter, + ignore_last_delimiters = _this$options5.ignore_last_delimiters; + + if (ignore_last_delimiters === true && this.state.record.length === this.options.columns.length - 1) { + return 0; + } else if (ignore_last_delimiters !== false && typeof ignore_last_delimiters === 'number' && this.state.record.length === ignore_last_delimiters - 1) { + return 0; + } + + loop1: for (var i = 0; i < delimiter.length; i++) { + var del = delimiter[i]; + + if (del[0] === chr) { + for (var j = 1; j < del.length; j++) { + if (del[j] !== buf[pos + j]) continue loop1; + } + + return del.length; + } + } + + return 0; + } + }, { + key: "__isRecordDelimiter", + value: function __isRecordDelimiter(chr, buf, pos) { + var record_delimiter = this.options.record_delimiter; + var recordDelimiterLength = record_delimiter.length; + + loop1: for (var i = 0; i < recordDelimiterLength; i++) { + var rd = record_delimiter[i]; + var rdLength = rd.length; + + if (rd[0] !== chr) { + continue; + } + + for (var j = 1; j < rdLength; j++) { + if (rd[j] !== buf[pos + j]) { + continue loop1; + } + } + + return rd.length; + } + + return 0; + } + }, { + key: "__isEscape", + value: function __isEscape(buf, pos, chr) { + var escape = this.options.escape; + if (escape === null) return false; + var l = escape.length; + + if (escape[0] === chr) { + for (var i = 0; i < l; i++) { + if (escape[i] !== buf[pos + i]) { + return false; + } + } + + return true; + } + + return false; + } + }, { + key: "__isQuote", + value: function __isQuote(buf, pos) { + var quote = this.options.quote; + if (quote === null) return false; + var l = quote.length; + + for (var i = 0; i < l; i++) { + if (quote[i] !== buf[pos + i]) { + return false; + } + } + + return true; + } + }, { + key: "__autoDiscoverRecordDelimiter", + value: function __autoDiscoverRecordDelimiter(buf, pos) { + var encoding = this.options.encoding; + var chr = buf[pos]; + + if (chr === cr) { + if (buf[pos + 1] === nl) { + this.options.record_delimiter.push(Buffer.from('\r\n', encoding)); + this.state.recordDelimiterMaxLength = 2; + return 2; + } else { + this.options.record_delimiter.push(Buffer.from('\r', encoding)); + this.state.recordDelimiterMaxLength = 1; + return 1; + } + } else if (chr === nl) { + this.options.record_delimiter.push(Buffer.from('\n', encoding)); + this.state.recordDelimiterMaxLength = 1; + return 1; + } + + return 0; + } + }, { + key: "__error", + value: function __error(msg) { + var skip_lines_with_error = this.options.skip_lines_with_error; + var err = typeof msg === 'string' ? new Error(msg) : msg; + + if (skip_lines_with_error) { + this.state.recordHasError = true; + this.emit('skip', err); + return undefined; + } else { + return err; + } + } + }, { + key: "__context", + value: function __context() { + var columns = this.options.columns; + var isColumns = Array.isArray(columns); + return { + column: isColumns === true ? columns.length > this.state.record.length ? columns[this.state.record.length].name : null : this.state.record.length, + empty_lines: this.info.empty_lines, + error: this.state.error, + header: columns === true, + index: this.state.record.length, + invalid_field_length: this.info.invalid_field_length, + quoting: this.state.wasQuoting, + lines: this.info.lines, + records: this.info.records + }; + } + }]); + + return Parser; +}(Transform); + +var parse = function parse() { + var data, options, callback; + + for (var i in arguments) { + var argument = arguments[i]; + + var type = _typeof(argument); + + if (data === undefined && (typeof argument === 'string' || Buffer.isBuffer(argument))) { + data = argument; + } else if (options === undefined && isObject(argument)) { + options = argument; + } else if (callback === undefined && type === 'function') { + callback = argument; + } else { + throw new CsvError('CSV_INVALID_ARGUMENT', ['Invalid argument:', "got ".concat(JSON.stringify(argument), " at index ").concat(i)], this.options); + } + } + + var parser = new Parser(options); + + if (callback) { + var records = options === undefined || options.objname === undefined ? [] : {}; + parser.on('readable', function () { + var record; + + while ((record = this.read()) !== null) { + if (options === undefined || options.objname === undefined) { + records.push(record); + } else { + records[record[0]] = record[1]; + } + } + }); + parser.on('error', function (err) { + callback(err, undefined, parser.info); + }); + parser.on('end', function () { + callback(undefined, records, parser.info); + }); + } + + if (data !== undefined) { + // Give a chance for events to be registered later + if (typeof setImmediate === 'function') { + setImmediate(function () { + parser.write(data); + parser.end(); + }); + } else { + parser.write(data); + parser.end(); + } + } + + return parser; +}; + +var CsvError = /*#__PURE__*/function (_Error) { + _inherits(CsvError, _Error); + + var _super2 = _createSuper(CsvError); + + function CsvError(code, message, options) { + var _this2; + + _classCallCheck(this, CsvError); + + if (Array.isArray(message)) message = message.join(' '); + _this2 = _super2.call(this, message); + + if (Error.captureStackTrace !== undefined) { + Error.captureStackTrace(_assertThisInitialized(_this2), CsvError); + } + + _this2.code = code; + + for (var _len = arguments.length, contexts = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { + contexts[_key - 3] = arguments[_key]; + } + + for (var _i2 = 0, _contexts = contexts; _i2 < _contexts.length; _i2++) { + var context = _contexts[_i2]; + + for (var key in context) { + var value = context[key]; + _this2[key] = Buffer.isBuffer(value) ? value.toString(options.encoding) : value == null ? value : JSON.parse(JSON.stringify(value)); + } + } + + return _this2; + } + + return CsvError; +}( /*#__PURE__*/_wrapNativeSuper(Error)); + +parse.Parser = Parser; +parse.CsvError = CsvError; +module.exports = parse; + +var underscore = function underscore(str) { + return str.replace(/([A-Z])/g, function (_, match) { + return '_' + match.toLowerCase(); + }); +}; + +var isObject = function isObject(obj) { + return _typeof(obj) === 'object' && obj !== null && !Array.isArray(obj); +}; + +var isRecordEmpty = function isRecordEmpty(record) { + return record.every(function (field) { + return field == null || field.toString && field.toString().trim() === ''; + }); +}; + +var normalizeColumnsArray = function normalizeColumnsArray(columns) { + var normalizedColumns = []; + + for (var i = 0, l = columns.length; i < l; i++) { + var column = columns[i]; + + if (column === undefined || column === null || column === false) { + normalizedColumns[i] = { + disabled: true + }; + } else if (typeof column === 'string') { + normalizedColumns[i] = { + name: column + }; + } else if (isObject(column)) { + if (typeof column.name !== 'string') { + throw new CsvError('CSV_OPTION_COLUMNS_MISSING_NAME', ['Option columns missing name:', "property \"name\" is required at position ".concat(i), 'when column is an object literal']); + } + + normalizedColumns[i] = column; + } else { + throw new CsvError('CSV_INVALID_COLUMN_DEFINITION', ['Invalid column definition:', 'expect a string or a literal object,', "got ".concat(JSON.stringify(column), " at position ").concat(i)]); + } + } + + return normalizedColumns; +}; + +}).call(this)}).call(this,require("buffer").Buffer,require("timers").setImmediate) +},{"./ResizeableBuffer":1,"buffer":5,"stream":11,"timers":27}],3:[function(require,module,exports){ +'use strict' + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +// Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function getLens (b64) { + var len = b64.length + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf('=') + if (validLen === -1) validLen = len + + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4) + + return [validLen, placeHoldersLen] +} + +// base64 is 4/3 + up to two characters of the original data +function byteLength (b64) { + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function _byteLength (b64, validLen, placeHoldersLen) { + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function toByteArray (b64) { + var tmp + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) + + var curByte = 0 + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen + + var i + for (i = 0; i < len; i += 4) { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)] + arr[curByte++] = (tmp >> 16) & 0xFF + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 2) { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 1) { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + parts.push( + lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + '==' + ) + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1] + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + '=' + ) + } + + return parts.join('') +} + +},{}],4:[function(require,module,exports){ + +},{}],5:[function(require,module,exports){ +(function (Buffer){(function (){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +'use strict' + +var base64 = require('base64-js') +var ieee754 = require('ieee754') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 + +var K_MAX_LENGTH = 0x7fffffff +exports.kMaxLength = K_MAX_LENGTH + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Print warning and recommend using `buffer` v4.x which has an Object + * implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * We report that the browser does not support typed arrays if the are not subclassable + * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` + * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support + * for __proto__ and has a buggy typed array implementation. + */ +Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() + +if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && + typeof console.error === 'function') { + console.error( + 'This browser lacks typed array (Uint8Array) support which is required by ' + + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' + ) +} + +function typedArraySupport () { + // Can typed array instances can be augmented? + try { + var arr = new Uint8Array(1) + arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } + return arr.foo() === 42 + } catch (e) { + return false + } +} + +Object.defineProperty(Buffer.prototype, 'parent', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.buffer + } +}) + +Object.defineProperty(Buffer.prototype, 'offset', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.byteOffset + } +}) + +function createBuffer (length) { + if (length > K_MAX_LENGTH) { + throw new RangeError('The value "' + length + '" is invalid for option "size"') + } + // Return an augmented `Uint8Array` instance + var buf = new Uint8Array(length) + buf.__proto__ = Buffer.prototype + return buf +} + +/** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + +function Buffer (arg, encodingOrOffset, length) { + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new TypeError( + 'The "string" argument must be of type string. Received type number' + ) + } + return allocUnsafe(arg) + } + return from(arg, encodingOrOffset, length) +} + +// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 +if (typeof Symbol !== 'undefined' && Symbol.species != null && + Buffer[Symbol.species] === Buffer) { + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true, + enumerable: false, + writable: false + }) +} + +Buffer.poolSize = 8192 // not used by this implementation + +function from (value, encodingOrOffset, length) { + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value) + } + + if (value == null) { + throw TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) + } + + if (isInstance(value, ArrayBuffer) || + (value && isInstance(value.buffer, ArrayBuffer))) { + return fromArrayBuffer(value, encodingOrOffset, length) + } + + if (typeof value === 'number') { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ) + } + + var valueOf = value.valueOf && value.valueOf() + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length) + } + + var b = fromObject(value) + if (b) return b + + if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && + typeof value[Symbol.toPrimitive] === 'function') { + return Buffer.from( + value[Symbol.toPrimitive]('string'), encodingOrOffset, length + ) + } + + throw new TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) +} + +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ +Buffer.from = function (value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length) +} + +// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: +// https://github.com/feross/buffer/pull/148 +Buffer.prototype.__proto__ = Uint8Array.prototype +Buffer.__proto__ = Uint8Array + +function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be of type number') + } else if (size < 0) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } +} + +function alloc (size, fill, encoding) { + assertSize(size) + if (size <= 0) { + return createBuffer(size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(size).fill(fill, encoding) + : createBuffer(size).fill(fill) + } + return createBuffer(size) +} + +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ +Buffer.alloc = function (size, fill, encoding) { + return alloc(size, fill, encoding) +} + +function allocUnsafe (size) { + assertSize(size) + return createBuffer(size < 0 ? 0 : checked(size) | 0) +} + +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ +Buffer.allocUnsafe = function (size) { + return allocUnsafe(size) +} +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(size) +} + +function fromString (string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + + var length = byteLength(string, encoding) | 0 + var buf = createBuffer(length) + + var actual = buf.write(string, encoding) + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + buf = buf.slice(0, actual) + } + + return buf +} + +function fromArrayLike (array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0 + var buf = createBuffer(length) + for (var i = 0; i < length; i += 1) { + buf[i] = array[i] & 255 + } + return buf +} + +function fromArrayBuffer (array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds') + } + + var buf + if (byteOffset === undefined && length === undefined) { + buf = new Uint8Array(array) + } else if (length === undefined) { + buf = new Uint8Array(array, byteOffset) + } else { + buf = new Uint8Array(array, byteOffset, length) + } + + // Return an augmented `Uint8Array` instance + buf.__proto__ = Buffer.prototype + return buf +} + +function fromObject (obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0 + var buf = createBuffer(len) + + if (buf.length === 0) { + return buf + } + + obj.copy(buf, 0, 0, len) + return buf + } + + if (obj.length !== undefined) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0) + } + return fromArrayLike(obj) + } + + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data) + } +} + +function checked (length) { + // Note: cannot use `length < K_MAX_LENGTH` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= K_MAX_LENGTH) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (length) { + if (+length != length) { // eslint-disable-line eqeqeq + length = 0 + } + return Buffer.alloc(+length) +} + +Buffer.isBuffer = function isBuffer (b) { + return b != null && b._isBuffer === true && + b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false +} + +Buffer.compare = function compare (a, b) { + if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) + if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ) + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i] + y = b[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer.alloc(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; ++i) { + length += list[i].length + } + } + + var buffer = Buffer.allocUnsafe(length) + var pos = 0 + for (i = 0; i < list.length; ++i) { + var buf = list[i] + if (isInstance(buf, Uint8Array)) { + buf = Buffer.from(buf) + } + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos) + pos += buf.length + } + return buffer +} + +function byteLength (string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length + } + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + + 'Received type ' + typeof string + ) + } + + var len = string.length + var mustMatch = (arguments.length > 2 && arguments[2] === true) + if (!mustMatch && len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 + } + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +function slowToString (encoding, start, end) { + var loweredCase = false + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0 + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0 + start >>>= 0 + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) +// to detect a Buffer instance. It's not possible to use `instanceof Buffer` +// reliably in a browserify context because there could be multiple different +// copies of the 'buffer' package in use. This method works even for Buffer +// instances that were created from another copy of the `buffer` package. +// See: https://github.com/feross/buffer/issues/154 +Buffer.prototype._isBuffer = true + +function swap (b, n, m) { + var i = b[n] + b[n] = b[m] + b[m] = i +} + +Buffer.prototype.swap16 = function swap16 () { + var len = this.length + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1) + } + return this +} + +Buffer.prototype.swap32 = function swap32 () { + var len = this.length + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3) + swap(this, i + 1, i + 2) + } + return this +} + +Buffer.prototype.swap64 = function swap64 () { + var len = this.length + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7) + swap(this, i + 1, i + 6) + swap(this, i + 2, i + 5) + swap(this, i + 3, i + 4) + } + return this +} + +Buffer.prototype.toString = function toString () { + var length = this.length + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.toLocaleString = Buffer.prototype.toString + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() + if (this.length > max) str += ' ... ' + return '' +} + +Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength) + } + if (!Buffer.isBuffer(target)) { + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. ' + + 'Received type ' + (typeof target) + ) + } + + if (start === undefined) { + start = 0 + } + if (end === undefined) { + end = target ? target.length : 0 + } + if (thisStart === undefined) { + thisStart = 0 + } + if (thisEnd === undefined) { + thisEnd = this.length + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0 + end >>>= 0 + thisStart >>>= 0 + thisEnd >>>= 0 + + if (this === target) return 0 + + var x = thisEnd - thisStart + var y = end - start + var len = Math.min(x, y) + + var thisCopy = this.slice(thisStart, thisEnd) + var targetCopy = target.slice(start, end) + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i] + y = targetCopy[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } + byteOffset = +byteOffset // Coerce to Number. + if (numberIsNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1) + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1 + } else if (byteOffset < 0) { + if (dir) byteOffset = 0 + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding) + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF // Search for a byte value [0-255] + if (typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') +} + +function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1 + var arrLength = arr.length + var valLength = val.length + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase() + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2 + arrLength /= 2 + valLength /= 2 + byteOffset /= 2 + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i + if (dir) { + var foundIndex = -1 + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength + for (i = byteOffset; i >= 0; i--) { + var found = true + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false + break + } + } + if (found) return i + } + } + + return -1 +} + +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) +} + +Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + var strLen = string.length + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (numberIsNaN(parsed)) return i + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset >>> 0 + if (isFinite(length)) { + length = length >>> 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function latin1Slice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; ++i) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf = this.subarray(start, end) + // Return an augmented `Uint8Array` instance + newBuf.__proto__ = Buffer.prototype + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('Index out of range') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + + if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { + // Use built-in when available, missing from IE11 + this.copyWithin(targetStart, start, end) + } else if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (var i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start] + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, end), + targetStart + ) + } + + return len +} + +// Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) +Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start + start = 0 + end = this.length + } else if (typeof end === 'string') { + encoding = end + end = this.length + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + if (val.length === 1) { + var code = val.charCodeAt(0) + if ((encoding === 'utf8' && code < 128) || + encoding === 'latin1') { + // Fast path: If `val` fits into a single byte, use that numeric value. + val = code + } + } + } else if (typeof val === 'number') { + val = val & 255 + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0 + end = end === undefined ? this.length : end >>> 0 + + if (!val) val = 0 + + var i + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val + } + } else { + var bytes = Buffer.isBuffer(val) + ? val + : Buffer.from(val, encoding) + var len = bytes.length + if (len === 0) { + throw new TypeError('The value "' + val + + '" is invalid for argument "value"') + } + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len] + } + } + + return this +} + +// HELPER FUNCTIONS +// ================ + +var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node takes equal signs as end of the Base64 encoding + str = str.split('=')[0] + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = str.trim().replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass +// the `instanceof` check but they should be treated as of that type. +// See: https://github.com/feross/buffer/issues/166 +function isInstance (obj, type) { + return obj instanceof type || + (obj != null && obj.constructor != null && obj.constructor.name != null && + obj.constructor.name === type.name) +} +function numberIsNaN (obj) { + // For IE11 support + return obj !== obj // eslint-disable-line no-self-compare +} + +}).call(this)}).call(this,require("buffer").Buffer) +},{"base64-js":3,"buffer":5,"ieee754":7}],6:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +'use strict'; + +var R = typeof Reflect === 'object' ? Reflect : null +var ReflectApply = R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + } + +var ReflectOwnKeys +if (R && typeof R.ownKeys === 'function') { + ReflectOwnKeys = R.ownKeys +} else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target) + .concat(Object.getOwnPropertySymbols(target)); + }; +} else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; +} + +function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); +} + +var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { + return value !== value; +} + +function EventEmitter() { + EventEmitter.init.call(this); +} +module.exports = EventEmitter; +module.exports.once = once; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._eventsCount = 0; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +function checkListener(listener) { + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } +} + +Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); + } + defaultMaxListeners = arg; + } +}); + +EventEmitter.init = function() { + + if (this._events === undefined || + this._events === Object.getPrototypeOf(this)._events) { + this._events = Object.create(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +}; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); + } + this._maxListeners = n; + return this; +}; + +function _getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); +}; + +EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = (type === 'error'); + + var events = this._events; + if (events !== undefined) + doError = (doError && events.error === undefined); + else if (!doError) + return false; + + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) + er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); + err.context = er; + throw err; // Unhandled 'error' event + } + + var handler = events[type]; + + if (handler === undefined) + return false; + + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + ReflectApply(listeners[i], this, args); + } + + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + checkListener(listener); + + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' ' + String(type) + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) + return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } +} + +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + checkListener(listener); + + events = this._events; + if (events === undefined) + return this; + + list = events[type]; + if (list === undefined) + return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (position === 0) + list.shift(); + else { + spliceOne(list, position); + } + + if (list.length === 1) + events[type] = list[0]; + + if (events.removeListener !== undefined) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (events === undefined) + return this; + + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + +function _listeners(target, type, unwrap) { + var events = target._events; + + if (events === undefined) + return []; + + var evlistener = events[type]; + if (evlistener === undefined) + return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? + unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} + +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; + +EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + + if (events !== undefined) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; +}; + +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; +} + +function spliceOne(list, index) { + for (; index + 1 < list.length; index++) + list[index] = list[index + 1]; + list.pop(); +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} + +function once(emitter, name) { + return new Promise(function (resolve, reject) { + function eventListener() { + if (errorListener !== undefined) { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + }; + var errorListener; + + // Adding an error listener is not optional because + // if an error is thrown on an event emitter we cannot + // guarantee that the actual event we are waiting will + // be fired. The result could be a silent way to create + // memory or file descriptor leaks, which is something + // we should avoid. + if (name !== 'error') { + errorListener = function errorListener(err) { + emitter.removeListener(name, eventListener); + reject(err); + }; + + emitter.once('error', errorListener); + } + + emitter.once(name, eventListener); + }); +} + +},{}],7:[function(require,module,exports){ +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = ((value * c) - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],8:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } +} + +},{}],9:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],10:[function(require,module,exports){ +/*! safe-buffer. MIT License. Feross Aboukhadijeh */ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.prototype = Object.create(Buffer.prototype) + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} + +},{"buffer":5}],11:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +module.exports = Stream; + +var EE = require('events').EventEmitter; +var inherits = require('inherits'); + +inherits(Stream, EE); +Stream.Readable = require('readable-stream/lib/_stream_readable.js'); +Stream.Writable = require('readable-stream/lib/_stream_writable.js'); +Stream.Duplex = require('readable-stream/lib/_stream_duplex.js'); +Stream.Transform = require('readable-stream/lib/_stream_transform.js'); +Stream.PassThrough = require('readable-stream/lib/_stream_passthrough.js'); +Stream.finished = require('readable-stream/lib/internal/streams/end-of-stream.js') +Stream.pipeline = require('readable-stream/lib/internal/streams/pipeline.js') + +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; + + + +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. + +function Stream() { + EE.call(this); +} + +Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +},{"events":6,"inherits":8,"readable-stream/lib/_stream_duplex.js":13,"readable-stream/lib/_stream_passthrough.js":14,"readable-stream/lib/_stream_readable.js":15,"readable-stream/lib/_stream_transform.js":16,"readable-stream/lib/_stream_writable.js":17,"readable-stream/lib/internal/streams/end-of-stream.js":21,"readable-stream/lib/internal/streams/pipeline.js":23}],12:[function(require,module,exports){ +'use strict'; + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var codes = {}; + +function createErrorType(code, message, Base) { + if (!Base) { + Base = Error; + } + + function getMessage(arg1, arg2, arg3) { + if (typeof message === 'string') { + return message; + } else { + return message(arg1, arg2, arg3); + } + } + + var NodeError = + /*#__PURE__*/ + function (_Base) { + _inheritsLoose(NodeError, _Base); + + function NodeError(arg1, arg2, arg3) { + return _Base.call(this, getMessage(arg1, arg2, arg3)) || this; + } + + return NodeError; + }(Base); + + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + codes[code] = NodeError; +} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js + + +function oneOf(expected, thing) { + if (Array.isArray(expected)) { + var len = expected.length; + expected = expected.map(function (i) { + return String(i); + }); + + if (len > 2) { + return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1]; + } else if (len === 2) { + return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); + } else { + return "of ".concat(thing, " ").concat(expected[0]); + } + } else { + return "of ".concat(thing, " ").concat(String(expected)); + } +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + + +function startsWith(str, search, pos) { + return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith + + +function endsWith(str, search, this_len) { + if (this_len === undefined || this_len > str.length) { + this_len = str.length; + } + + return str.substring(this_len - search.length, this_len) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes + + +function includes(str, search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } +} + +createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"'; +}, TypeError); +createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { + // determiner: 'must be' or 'must not be' + var determiner; + + if (typeof expected === 'string' && startsWith(expected, 'not ')) { + determiner = 'must not be'; + expected = expected.replace(/^not /, ''); + } else { + determiner = 'must be'; + } + + var msg; + + if (endsWith(name, ' argument')) { + // For cases like 'first argument' + msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } else { + var type = includes(name, '.') ? 'property' : 'argument'; + msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } + + msg += ". Received type ".concat(typeof actual); + return msg; +}, TypeError); +createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { + return 'The ' + name + ' method is not implemented'; +}); +createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); +createErrorType('ERR_STREAM_DESTROYED', function (name) { + return 'Cannot call ' + name + ' after a stream was destroyed'; +}); +createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); +createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); +createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); +createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); +createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { + return 'Unknown encoding: ' + arg; +}, TypeError); +createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); +module.exports.codes = codes; + +},{}],13:[function(require,module,exports){ +(function (process){(function (){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. +'use strict'; +/**/ + +var objectKeys = Object.keys || function (obj) { + var keys = []; + + for (var key in obj) { + keys.push(key); + } + + return keys; +}; +/**/ + + +module.exports = Duplex; + +var Readable = require('./_stream_readable'); + +var Writable = require('./_stream_writable'); + +require('inherits')(Duplex, Readable); + +{ + // Allow the keys array to be GC'ed. + var keys = objectKeys(Writable.prototype); + + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + Readable.call(this, options); + Writable.call(this, options); + this.allowHalfOpen = true; + + if (options) { + if (options.readable === false) this.readable = false; + if (options.writable === false) this.writable = false; + + if (options.allowHalfOpen === false) { + this.allowHalfOpen = false; + this.once('end', onend); + } + } +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); +Object.defineProperty(Duplex.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); +Object.defineProperty(Duplex.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); // the no-half-open enforcer + +function onend() { + // If the writable side ended, then we're ok. + if (this._writableState.ended) return; // no more data can be written. + // But allow more writes to happen in this tick. + + process.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); +}).call(this)}).call(this,require('_process')) +},{"./_stream_readable":15,"./_stream_writable":17,"_process":9,"inherits":8}],14:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +require('inherits')(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; +},{"./_stream_transform":16,"inherits":8}],15:[function(require,module,exports){ +(function (process,global){(function (){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. +'use strict'; + +module.exports = Readable; +/**/ + +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; +/**/ + +var EE = require('events').EventEmitter; + +var EElistenerCount = function EElistenerCount(emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ + + +var Stream = require('./internal/streams/stream'); +/**/ + + +var Buffer = require('buffer').Buffer; + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} +/**/ + + +var debugUtil = require('util'); + +var debug; + +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function debug() {}; +} +/**/ + + +var BufferList = require('./internal/streams/buffer_list'); + +var destroyImpl = require('./internal/streams/destroy'); + +var _require = require('./internal/streams/state'), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = require('../errors').codes, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. + + +var StringDecoder; +var createReadableStreamAsyncIterator; +var from; + +require('inherits')(Readable, Stream); + +var errorOrDestroy = destroyImpl.errorOrDestroy; +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream, isDuplex) { + Duplex = Duplex || require('./_stream_duplex'); + options = options || {}; // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + + this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + + this.sync = true; // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + this.paused = true; // Should close be emitted on destroy. Defaults to true. + + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') + + this.autoDestroy = !!options.autoDestroy; // has it been destroyed + + this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + + this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s + + this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled + + this.readingMore = false; + this.decoder = null; + this.encoding = null; + + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside + // the ReadableState constructor, at least with V8 6.5 + + var isDuplex = this instanceof Duplex; + this._readableState = new ReadableState(options, this, isDuplex); // legacy + + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined) { + return false; + } + + return this._readableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._readableState.destroyed = value; + } +}); +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; + +Readable.prototype._destroy = function (err, cb) { + cb(err); +}; // Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. + + +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; // Unshift should *always* be something directly out of read() + + +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + debug('readableAddChunk', chunk); + var state = stream._readableState; + + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + + if (er) { + errorOrDestroy(stream, er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); + } else if (state.ended) { + errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state.destroyed) { + return false; + } else { + state.reading = false; + + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + maybeReadMore(stream, state); + } + } // We can push more data if we are below the highWaterMark. + // Also, if we have no data yet, we can stand some more bytes. + // This is to work around cases where hwm=0, such as the repl. + + + return !state.ended && (state.length < state.highWaterMark || state.length === 0); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + state.awaitDrain = 0; + stream.emit('data', chunk); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + if (state.needReadable) emitReadable(stream); + } + + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); + } + + return er; +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; // backwards compatibility. + + +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + var decoder = new StringDecoder(enc); + this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 + + this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: + + var p = this._readableState.buffer.head; + var content = ''; + + while (p !== null) { + content += decoder.write(p.data); + p = p.next; + } + + this._readableState.buffer.clear(); + + if (content !== '') this._readableState.buffer.push(content); + this._readableState.length = content.length; + return this; +}; // Don't raise the hwm > 1GB + + +var MAX_HWM = 0x40000000; + +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + + return n; +} // This function is designed to be inlinable, so please take care when making +// changes to the function body. + + +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } // If we're asking for more than the current hwm, then raise the hwm. + + + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; // Don't have enough + + if (!state.ended) { + state.needReadable = true; + return 0; + } + + return state.length; +} // you can override either this method, or the async _read(n) below. + + +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + + if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. + + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + // if we need a readable event, then we need to do some reading. + + + var doRead = state.needReadable; + debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some + + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + + + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; // if the length is currently zero, then we *need* a readable event. + + if (state.length === 0) state.needReadable = true; // call internal read method + + this._read(state.highWaterMark); + + state.sync = false; // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = state.length <= state.highWaterMark; + n = 0; + } else { + state.length -= n; + state.awaitDrain = 0; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. + + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + return ret; +}; + +function onEofChunk(stream, state) { + debug('onEofChunk'); + if (state.ended) return; + + if (state.decoder) { + var chunk = state.decoder.end(); + + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + + state.ended = true; + + if (state.sync) { + // if we are sync, wait until next tick to emit the data. + // Otherwise we risk emitting data in the flow() + // the readable code triggers during a read() call + emitReadable(stream); + } else { + // emit 'readable' now to make sure it gets picked up. + state.needReadable = false; + + if (!state.emittedReadable) { + state.emittedReadable = true; + emitReadable_(stream); + } + } +} // Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. + + +function emitReadable(stream) { + var state = stream._readableState; + debug('emitReadable', state.needReadable, state.emittedReadable); + state.needReadable = false; + + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + process.nextTick(emitReadable_, stream); + } +} + +function emitReadable_(stream) { + var state = stream._readableState; + debug('emitReadable_', state.destroyed, state.length, state.ended); + + if (!state.destroyed && (state.length || state.ended)) { + stream.emit('readable'); + state.emittedReadable = false; + } // The stream needs another readable event if + // 1. It is not flowing, as the flow mechanism will take + // care of it. + // 2. It is not ended. + // 3. It is below the highWaterMark, so we can schedule + // another readable later. + + + state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; + flow(stream); +} // at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. + + +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + process.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + // Attempt to read more data if we should. + // + // The conditions for reading more data are (one of): + // - Not enough data buffered (state.length < state.highWaterMark). The loop + // is responsible for filling the buffer with enough data if such data + // is available. If highWaterMark is 0 and we are not in the flowing mode + // we should _not_ attempt to buffer any extra data. We'll get more data + // when the stream consumer calls read() instead. + // - No data in the buffer, and the stream is in flowing mode. In this mode + // the loop below is responsible for ensuring read() is called. Failing to + // call read here would abort the flow and there's no other mechanism for + // continuing the flow if the stream consumer has just subscribed to the + // 'data' event. + // + // In addition to the above conditions to keep reading data, the following + // conditions prevent the data from being read: + // - The stream has ended (state.ended). + // - There is already a pending 'read' operation (state.reading). This is a + // case where the the stream has called the implementation defined _read() + // method, but they are processing the call asynchronously and have _not_ + // called push() with new data. In this case we skip performing more + // read()s. The execution ends in this method again after the _read() ends + // up calling push() with more data. + while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) { + var len = state.length; + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) // didn't get any data, stop spinning. + break; + } + + state.readingMore = false; +} // abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. + + +Readable.prototype._read = function (n) { + errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + + case 1: + state.pipes = [state.pipes, dest]; + break; + + default: + state.pipes.push(dest); + break; + } + + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn); + dest.on('unpipe', onunpipe); + + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + + + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + var cleanedUp = false; + + function cleanup() { + debug('cleanup'); // cleanup event handlers once the pipe is broken + + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + cleanedUp = true; // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + src.on('data', ondata); + + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + debug('dest.write', ret); + + if (ret === false) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', state.awaitDrain); + state.awaitDrain++; + } + + src.pause(); + } + } // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + + + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er); + } // Make sure our error handler is attached before userland ones. + + + prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. + + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + + dest.once('close', onclose); + + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } // tell the dest that it's being piped to + + + dest.emit('pipe', src); // start the flow if it hasn't been started already. + + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function pipeOnDrainFunctionResult() { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { + hasUnpiped: false + }; // if we're not piping anywhere, then do nothing. + + if (state.pipesCount === 0) return this; // just one destination. most common case. + + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + if (!dest) dest = state.pipes; // got a match. + + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } // slow case. multiple pipe destinations. + + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, { + hasUnpiped: false + }); + } + + return this; + } // try to find the right one. + + + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + dest.emit('unpipe', this, unpipeInfo); + return this; +}; // set up data events if they are asked for +// Ensure readable listeners eventually get something + + +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + var state = this._readableState; + + if (ev === 'data') { + // update readableListening so that resume() may be a no-op + // a few lines down. This is needed to support once('readable'). + state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused + + if (state.flowing !== false) this.resume(); + } else if (ev === 'readable') { + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.flowing = false; + state.emittedReadable = false; + debug('on readable', state.length, state.reading); + + if (state.length) { + emitReadable(this); + } else if (!state.reading) { + process.nextTick(nReadingNextTick, this); + } + } + } + + return res; +}; + +Readable.prototype.addListener = Readable.prototype.on; + +Readable.prototype.removeListener = function (ev, fn) { + var res = Stream.prototype.removeListener.call(this, ev, fn); + + if (ev === 'readable') { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +Readable.prototype.removeAllListeners = function (ev) { + var res = Stream.prototype.removeAllListeners.apply(this, arguments); + + if (ev === 'readable' || ev === undefined) { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +function updateReadableListening(self) { + var state = self._readableState; + state.readableListening = self.listenerCount('readable') > 0; + + if (state.resumeScheduled && !state.paused) { + // flowing needs to be set to true now, otherwise + // the upcoming resume will not flow. + state.flowing = true; // crude way to check if we should resume + } else if (self.listenerCount('data') > 0) { + self.resume(); + } +} + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} // pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. + + +Readable.prototype.resume = function () { + var state = this._readableState; + + if (!state.flowing) { + debug('resume'); // we flow only if there is no one listening + // for readable, but we still have to call + // resume() + + state.flowing = !state.readableListening; + resume(this, state); + } + + state.paused = false; + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + process.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + debug('resume', state.reading); + + if (!state.reading) { + stream.read(0); + } + + state.resumeScheduled = false; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + + if (this._readableState.flowing !== false) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + + this._readableState.paused = true; + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + + while (state.flowing && stream.read() !== null) { + ; + } +} // wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. + + +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + stream.on('end', function () { + debug('wrapped end'); + + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode + + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + + if (!ret) { + paused = true; + stream.pause(); + } + }); // proxy all the other methods. + // important when wrapping filters and duplexes. + + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function methodWrap(method) { + return function methodWrapReturnFunction() { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } // proxy certain important events. + + + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } // when we try to consume some more bytes, simply unpause the + // underlying stream. + + + this._read = function (n) { + debug('wrapped _read', n); + + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +if (typeof Symbol === 'function') { + Readable.prototype[Symbol.asyncIterator] = function () { + if (createReadableStreamAsyncIterator === undefined) { + createReadableStreamAsyncIterator = require('./internal/streams/async_iterator'); + } + + return createReadableStreamAsyncIterator(this); + }; +} + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.highWaterMark; + } +}); +Object.defineProperty(Readable.prototype, 'readableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState && this._readableState.buffer; + } +}); +Object.defineProperty(Readable.prototype, 'readableFlowing', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.flowing; + }, + set: function set(state) { + if (this._readableState) { + this._readableState.flowing = state; + } + } +}); // exposed for testing purposes only. + +Readable._fromList = fromList; +Object.defineProperty(Readable.prototype, 'readableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.length; + } +}); // Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. + +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = state.buffer.consume(n, state.decoder); + } + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + debug('endReadable', state.endEmitted); + + if (!state.endEmitted) { + state.ended = true; + process.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift. + + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the writable side is ready for autoDestroy as well + var wState = stream._writableState; + + if (!wState || wState.autoDestroy && wState.finished) { + stream.destroy(); + } + } + } +} + +if (typeof Symbol === 'function') { + Readable.from = function (iterable, opts) { + if (from === undefined) { + from = require('./internal/streams/from'); + } + + return from(Readable, iterable, opts); + }; +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + + return -1; +} +}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../errors":12,"./_stream_duplex":13,"./internal/streams/async_iterator":18,"./internal/streams/buffer_list":19,"./internal/streams/destroy":20,"./internal/streams/from":22,"./internal/streams/state":24,"./internal/streams/stream":25,"_process":9,"buffer":5,"events":6,"inherits":8,"string_decoder/":26,"util":4}],16:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. +'use strict'; + +module.exports = Transform; + +var _require$codes = require('../errors').codes, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, + ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; + +var Duplex = require('./_stream_duplex'); + +require('inherits')(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + var cb = ts.writecb; + + if (cb === null) { + return this.emit('error', new ERR_MULTIPLE_CALLBACK()); + } + + ts.writechunk = null; + ts.writecb = null; + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + cb(er); + var rs = this._readableState; + rs.reading = false; + + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + Duplex.call(this, options); + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; // start out asking for a readable event once data is transformed. + + this._readableState.needReadable = true; // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + if (typeof options.flush === 'function') this._flush = options.flush; + } // When the writable side finishes, then flush out anything remaining. + + + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function' && !this._readableState.destroyed) { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; // This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. + + +Transform.prototype._transform = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; // Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. + + +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && !ts.transforming) { + ts.transforming = true; + + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); // TODO(BridgeAR): Write a test for these two error cases + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + + if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); + if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); + return stream.push(null); +} +},{"../errors":12,"./_stream_duplex":13,"inherits":8}],17:[function(require,module,exports){ +(function (process,global){(function (){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. +'use strict'; + +module.exports = Writable; +/* */ + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} // It seems a linked list but it is not +// there will be only 2 of these for each stream + + +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ + + +var Duplex; +/**/ + +Writable.WritableState = WritableState; +/**/ + +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ + +var Stream = require('./internal/streams/stream'); +/**/ + + +var Buffer = require('buffer').Buffer; + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +var destroyImpl = require('./internal/streams/destroy'); + +var _require = require('./internal/streams/state'), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = require('../errors').codes, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, + ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; + +var errorOrDestroy = destroyImpl.errorOrDestroy; + +require('inherits')(Writable, Stream); + +function nop() {} + +function WritableState(options, stream, isDuplex) { + Duplex = Duplex || require('./_stream_duplex'); + options = options || {}; // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream, + // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. + + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream + // contains buffers or objects. + + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + + this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called + + this.finalCalled = false; // drain event flag. + + this.needDrain = false; // at the start of calling end() + + this.ending = false; // when end() has been called, and returned + + this.ended = false; // when 'finish' is emitted + + this.finished = false; // has it been destroyed + + this.destroyed = false; // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + + this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + + this.length = 0; // a flag to see when we're in the middle of a write. + + this.writing = false; // when true all writes will be buffered until .uncork() call + + this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + + this.sync = true; // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + + this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) + + this.onwrite = function (er) { + onwrite(stream, er); + }; // the callback that the user supplies to write(chunk,encoding,cb) + + + this.writecb = null; // the amount that is being written when _write is called. + + this.writelen = 0; + this.bufferedRequest = null; + this.lastBufferedRequest = null; // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + + this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + + this.prefinished = false; // True if the error was already emitted and should not be thrown again + + this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. + + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') + + this.autoDestroy = !!options.autoDestroy; // count buffered requests + + this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + + while (current) { + out.push(current); + current = current.next; + } + + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function writableStateBufferGetter() { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); // Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. + + +var realHasInstance; + +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function value(object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function realHasInstance(object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + // Checking for a Stream.Duplex instance is faster here instead of inside + // the WritableState constructor, at least with V8 6.5 + + var isDuplex = this instanceof Duplex; + if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); + this._writableState = new WritableState(options, this, isDuplex); // legacy. + + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + if (typeof options.writev === 'function') this._writev = options.writev; + if (typeof options.destroy === 'function') this._destroy = options.destroy; + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} // Otherwise people can pipe Writable streams, which is just wrong. + + +Writable.prototype.pipe = function () { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); +}; + +function writeAfterEnd(stream, cb) { + var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb + + errorOrDestroy(stream, er); + process.nextTick(cb, er); +} // Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. + + +function validChunk(stream, state, chunk, cb) { + var er; + + if (chunk === null) { + er = new ERR_STREAM_NULL_VALUES(); + } else if (typeof chunk !== 'string' && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); + } + + if (er) { + errorOrDestroy(stream, er); + process.nextTick(cb, er); + return false; + } + + return true; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + if (typeof cb !== 'function') cb = nop; + if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + return ret; +}; + +Writable.prototype.cork = function () { + this._writableState.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); // if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. + +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + + var len = state.objectMode ? 1 : chunk.length; + state.length += len; + var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. + + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + process.nextTick(cb, er); // this can emit finish, and it will always happen + // after error + + process.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); // this can emit finish, but finish must + // always follow error + + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK(); + onwriteStateUpdate(state); + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state) || stream.destroyed; + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + process.nextTick(afterWrite, stream, state, finished, cb); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} // Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. + + +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} // if there's something in the buffer waiting, then process it + + +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + var count = 0; + var allBuffers = true; + + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + + buffer.allBuffers = allBuffers; + doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + + state.pendingcb++; + state.lastBufferedRequest = null; + + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks + + if (state.corked) { + state.corked = 1; + this.uncork(); + } // ignore unnecessary end() calls. + + + if (!state.ending) endWritable(this, state, cb); + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} + +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + + if (err) { + errorOrDestroy(stream, err); + } + + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} + +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function' && !state.destroyed) { + state.pendingcb++; + state.finalCalled = true; + process.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + + if (need) { + prefinish(stream, state); + + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the readable side is ready for autoDestroy as well + var rState = stream._readableState; + + if (!rState || rState.autoDestroy && rState.endEmitted) { + stream.destroy(); + } + } + } + } + + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + + if (cb) { + if (state.finished) process.nextTick(cb);else stream.once('finish', cb); + } + + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } // reuse the free corkReq. + + + state.corkedRequestsFree.next = corkReq; +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._writableState === undefined) { + return false; + } + + return this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._writableState.destroyed = value; + } +}); +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; + +Writable.prototype._destroy = function (err, cb) { + cb(err); +}; +}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../errors":12,"./_stream_duplex":13,"./internal/streams/destroy":20,"./internal/streams/state":24,"./internal/streams/stream":25,"_process":9,"buffer":5,"inherits":8,"util-deprecate":28}],18:[function(require,module,exports){ +(function (process){(function (){ +'use strict'; + +var _Object$setPrototypeO; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var finished = require('./end-of-stream'); + +var kLastResolve = Symbol('lastResolve'); +var kLastReject = Symbol('lastReject'); +var kError = Symbol('error'); +var kEnded = Symbol('ended'); +var kLastPromise = Symbol('lastPromise'); +var kHandlePromise = Symbol('handlePromise'); +var kStream = Symbol('stream'); + +function createIterResult(value, done) { + return { + value: value, + done: done + }; +} + +function readAndResolve(iter) { + var resolve = iter[kLastResolve]; + + if (resolve !== null) { + var data = iter[kStream].read(); // we defer if data is null + // we can be expecting either 'end' or + // 'error' + + if (data !== null) { + iter[kLastPromise] = null; + iter[kLastResolve] = null; + iter[kLastReject] = null; + resolve(createIterResult(data, false)); + } + } +} + +function onReadable(iter) { + // we wait for the next tick, because it might + // emit an error with process.nextTick + process.nextTick(readAndResolve, iter); +} + +function wrapForNext(lastPromise, iter) { + return function (resolve, reject) { + lastPromise.then(function () { + if (iter[kEnded]) { + resolve(createIterResult(undefined, true)); + return; + } + + iter[kHandlePromise](resolve, reject); + }, reject); + }; +} + +var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); +var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { + get stream() { + return this[kStream]; + }, + + next: function next() { + var _this = this; + + // if we have detected an error in the meanwhile + // reject straight away + var error = this[kError]; + + if (error !== null) { + return Promise.reject(error); + } + + if (this[kEnded]) { + return Promise.resolve(createIterResult(undefined, true)); + } + + if (this[kStream].destroyed) { + // We need to defer via nextTick because if .destroy(err) is + // called, the error will be emitted via nextTick, and + // we cannot guarantee that there is no error lingering around + // waiting to be emitted. + return new Promise(function (resolve, reject) { + process.nextTick(function () { + if (_this[kError]) { + reject(_this[kError]); + } else { + resolve(createIterResult(undefined, true)); + } + }); + }); + } // if we have multiple next() calls + // we will wait for the previous Promise to finish + // this logic is optimized to support for await loops, + // where next() is only called once at a time + + + var lastPromise = this[kLastPromise]; + var promise; + + if (lastPromise) { + promise = new Promise(wrapForNext(lastPromise, this)); + } else { + // fast path needed to support multiple this.push() + // without triggering the next() queue + var data = this[kStream].read(); + + if (data !== null) { + return Promise.resolve(createIterResult(data, false)); + } + + promise = new Promise(this[kHandlePromise]); + } + + this[kLastPromise] = promise; + return promise; + } +}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { + return this; +}), _defineProperty(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + + // destroy(err, cb) is a private API + // we can guarantee we have that here, because we control the + // Readable class this is attached to + return new Promise(function (resolve, reject) { + _this2[kStream].destroy(null, function (err) { + if (err) { + reject(err); + return; + } + + resolve(createIterResult(undefined, true)); + }); + }); +}), _Object$setPrototypeO), AsyncIteratorPrototype); + +var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { + var _Object$create; + + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { + value: stream, + writable: true + }), _defineProperty(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty(_Object$create, kEnded, { + value: stream._readableState.endEmitted, + writable: true + }), _defineProperty(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data = iterator[kStream].read(); + + if (data) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); + iterator[kLastPromise] = null; + finished(stream, function (err) { + if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { + var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise + // returned by next() and store the error + + if (reject !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + reject(err); + } + + iterator[kError] = err; + return; + } + + var resolve = iterator[kLastResolve]; + + if (resolve !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(undefined, true)); + } + + iterator[kEnded] = true; + }); + stream.on('readable', onReadable.bind(null, iterator)); + return iterator; +}; + +module.exports = createReadableStreamAsyncIterator; +}).call(this)}).call(this,require('_process')) +},{"./end-of-stream":21,"_process":9}],19:[function(require,module,exports){ +'use strict'; + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var _require = require('buffer'), + Buffer = _require.Buffer; + +var _require2 = require('util'), + inspect = _require2.inspect; + +var custom = inspect && inspect.custom || 'inspect'; + +function copyBuffer(src, target, offset) { + Buffer.prototype.copy.call(src, target, offset); +} + +module.exports = +/*#__PURE__*/ +function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + _createClass(BufferList, [{ + key: "push", + value: function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + } + }, { + key: "unshift", + value: function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + }, { + key: "shift", + value: function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + } + }, { + key: "clear", + value: function clear() { + this.head = this.tail = null; + this.length = 0; + } + }, { + key: "join", + value: function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + + while (p = p.next) { + ret += s + p.data; + } + + return ret; + } + }, { + key: "concat", + value: function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + + return ret; + } // Consumes a specified amount of bytes or characters from the buffered data. + + }, { + key: "consume", + value: function consume(n, hasStrings) { + var ret; + + if (n < this.head.data.length) { + // `slice` is the same for buffers and strings. + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + // First chunk is a perfect match. + ret = this.shift(); + } else { + // Result spans more than one buffer. + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + + return ret; + } + }, { + key: "first", + value: function first() { + return this.head.data; + } // Consumes a specified amount of characters from the buffered data. + + }, { + key: "_getString", + value: function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Consumes a specified amount of bytes from the buffered data. + + }, { + key: "_getBuffer", + value: function _getBuffer(n) { + var ret = Buffer.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Make sure the linked list only shows the minimal necessary information. + + }, { + key: custom, + value: function value(_, options) { + return inspect(this, _objectSpread({}, options, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + } + }]); + + return BufferList; +}(); +},{"buffer":5,"util":4}],20:[function(require,module,exports){ +(function (process){(function (){ +'use strict'; // undocumented cb() API, needed for core, not for public API + +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err) { + if (!this._writableState) { + process.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + process.nextTick(emitErrorNT, this, err); + } + } + + return this; + } // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + + if (this._readableState) { + this._readableState.destroyed = true; + } // if this is a duplex stream mark the writable part as destroyed as well + + + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + if (!_this._writableState) { + process.nextTick(emitErrorAndCloseNT, _this, err); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + process.nextTick(emitErrorAndCloseNT, _this, err); + } else { + process.nextTick(emitCloseNT, _this); + } + } else if (cb) { + process.nextTick(emitCloseNT, _this); + cb(err); + } else { + process.nextTick(emitCloseNT, _this); + } + }); + + return this; +} + +function emitErrorAndCloseNT(self, err) { + emitErrorNT(self, err); + emitCloseNT(self); +} + +function emitCloseNT(self) { + if (self._writableState && !self._writableState.emitClose) return; + if (self._readableState && !self._readableState.emitClose) return; + self.emit('close'); +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +function errorOrDestroy(stream, err) { + // We have tests that rely on errors being emitted + // in the same tick, so changing this is semver major. + // For now when you opt-in to autoDestroy we allow + // the error to be emitted nextTick. In a future + // semver major update we should change the default to this. + var rState = stream._readableState; + var wState = stream._writableState; + if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy, + errorOrDestroy: errorOrDestroy +}; +}).call(this)}).call(this,require('_process')) +},{"_process":9}],21:[function(require,module,exports){ +// Ported from https://github.com/mafintosh/end-of-stream with +// permission from the author, Mathias Buus (@mafintosh). +'use strict'; + +var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + callback.apply(this, args); + }; +} + +function noop() {} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function eos(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; + callback = once(callback || noop); + var readable = opts.readable || opts.readable !== false && stream.readable; + var writable = opts.writable || opts.writable !== false && stream.writable; + + var onlegacyfinish = function onlegacyfinish() { + if (!stream.writable) onfinish(); + }; + + var writableEnded = stream._writableState && stream._writableState.finished; + + var onfinish = function onfinish() { + writable = false; + writableEnded = true; + if (!readable) callback.call(stream); + }; + + var readableEnded = stream._readableState && stream._readableState.endEmitted; + + var onend = function onend() { + readable = false; + readableEnded = true; + if (!writable) callback.call(stream); + }; + + var onerror = function onerror(err) { + callback.call(stream, err); + }; + + var onclose = function onclose() { + var err; + + if (readable && !readableEnded) { + if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + + if (writable && !writableEnded) { + if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + }; + + var onrequest = function onrequest() { + stream.req.on('finish', onfinish); + }; + + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest();else stream.on('request', onrequest); + } else if (writable && !stream._writableState) { + // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); + } + + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); + return function () { + stream.removeListener('complete', onfinish); + stream.removeListener('abort', onclose); + stream.removeListener('request', onrequest); + if (stream.req) stream.req.removeListener('finish', onfinish); + stream.removeListener('end', onlegacyfinish); + stream.removeListener('close', onlegacyfinish); + stream.removeListener('finish', onfinish); + stream.removeListener('end', onend); + stream.removeListener('error', onerror); + stream.removeListener('close', onclose); + }; +} + +module.exports = eos; +},{"../../../errors":12}],22:[function(require,module,exports){ +module.exports = function () { + throw new Error('Readable.from is not available in the browser') +}; + +},{}],23:[function(require,module,exports){ +// Ported from https://github.com/mafintosh/pump with +// permission from the author, Mathias Buus (@mafintosh). +'use strict'; + +var eos; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + callback.apply(void 0, arguments); + }; +} + +var _require$codes = require('../../../errors').codes, + ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; + +function noop(err) { + // Rethrow the error if it exists to avoid swallowing it + if (err) throw err; +} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function destroyer(stream, reading, writing, callback) { + callback = once(callback); + var closed = false; + stream.on('close', function () { + closed = true; + }); + if (eos === undefined) eos = require('./end-of-stream'); + eos(stream, { + readable: reading, + writable: writing + }, function (err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function (err) { + if (closed) return; + if (destroyed) return; + destroyed = true; // request.destroy just do .end - .abort is what we want + + if (isRequest(stream)) return stream.abort(); + if (typeof stream.destroy === 'function') return stream.destroy(); + callback(err || new ERR_STREAM_DESTROYED('pipe')); + }; +} + +function call(fn) { + fn(); +} + +function pipe(from, to) { + return from.pipe(to); +} + +function popCallback(streams) { + if (!streams.length) return noop; + if (typeof streams[streams.length - 1] !== 'function') return noop; + return streams.pop(); +} + +function pipeline() { + for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { + streams[_key] = arguments[_key]; + } + + var callback = popCallback(streams); + if (Array.isArray(streams[0])) streams = streams[0]; + + if (streams.length < 2) { + throw new ERR_MISSING_ARGS('streams'); + } + + var error; + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error); + }); + }); + return streams.reduce(pipe); +} + +module.exports = pipeline; +},{"../../../errors":12,"./end-of-stream":21}],24:[function(require,module,exports){ +'use strict'; + +var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE; + +function highWaterMarkFrom(options, isDuplex, duplexKey) { + return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; +} + +function getHighWaterMark(state, options, duplexKey, isDuplex) { + var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); + + if (hwm != null) { + if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { + var name = isDuplex ? duplexKey : 'highWaterMark'; + throw new ERR_INVALID_OPT_VALUE(name, hwm); + } + + return Math.floor(hwm); + } // Default value + + + return state.objectMode ? 16 : 16 * 1024; +} + +module.exports = { + getHighWaterMark: getHighWaterMark +}; +},{"../../../errors":12}],25:[function(require,module,exports){ +module.exports = require('events').EventEmitter; + +},{"events":6}],26:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} +},{"safe-buffer":10}],27:[function(require,module,exports){ +(function (setImmediate,clearImmediate){(function (){ +var nextTick = require('process/browser.js').nextTick; +var apply = Function.prototype.apply; +var slice = Array.prototype.slice; +var immediateIds = {}; +var nextImmediateId = 0; + +// DOM APIs, for completeness + +exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); +}; +exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); +}; +exports.clearTimeout = +exports.clearInterval = function(timeout) { timeout.close(); }; + +function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; +} +Timeout.prototype.unref = Timeout.prototype.ref = function() {}; +Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); +}; + +// Does not start the time, just sets up the members needed. +exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; +}; + +exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; +}; + +exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } +}; + +// That's not how node.js implements it but the exposed api is the same. +exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; +}; + +exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; +}; +}).call(this)}).call(this,require("timers").setImmediate,require("timers").clearImmediate) +},{"process/browser.js":9,"timers":27}],28:[function(require,module,exports){ +(function (global){(function (){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[2])(2) +}); diff --git a/node_modules/csv-parse/lib/browser/sync.js b/node_modules/csv-parse/lib/browser/sync.js new file mode 100644 index 00000000..501a3d2e --- /dev/null +++ b/node_modules/csv-parse/lib/browser/sync.js @@ -0,0 +1,8127 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.parse = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 0 && arguments[0] !== undefined ? arguments[0] : 100; + + _classCallCheck(this, ResizeableBuffer); + + this.size = size; + this.length = 0; + this.buf = Buffer.alloc(size); + } + + _createClass(ResizeableBuffer, [{ + key: "prepend", + value: function prepend(val) { + if (Buffer.isBuffer(val)) { + var length = this.length + val.length; + + if (length >= this.size) { + this.resize(); + + if (length >= this.size) { + throw Error('INVALID_BUFFER_STATE'); + } + } + + var buf = this.buf; + this.buf = Buffer.alloc(this.size); + val.copy(this.buf, 0); + buf.copy(this.buf, val.length); + this.length += val.length; + } else { + var _length = this.length++; + + if (_length === this.size) { + this.resize(); + } + + var _buf = this.clone(); + + this.buf[0] = val; + + _buf.copy(this.buf, 1, 0, _length); + } + } + }, { + key: "append", + value: function append(val) { + var length = this.length++; + + if (length === this.size) { + this.resize(); + } + + this.buf[length] = val; + } + }, { + key: "clone", + value: function clone() { + return Buffer.from(this.buf.slice(0, this.length)); + } + }, { + key: "resize", + value: function resize() { + var length = this.length; + this.size = this.size * 2; + var buf = Buffer.alloc(this.size); + this.buf.copy(buf, 0, 0, length); + this.buf = buf; + } + }, { + key: "toString", + value: function toString(encoding) { + if (encoding) { + return this.buf.slice(0, this.length).toString(encoding); + } else { + return Uint8Array.prototype.slice.call(this.buf.slice(0, this.length)); + } + } + }, { + key: "toJSON", + value: function toJSON() { + return this.toString('utf8'); + } + }, { + key: "reset", + value: function reset() { + this.length = 0; + } + }]); + + return ResizeableBuffer; +}(); + +module.exports = ResizeableBuffer; + +}).call(this)}).call(this,require("buffer").Buffer) +},{"buffer":6}],2:[function(require,module,exports){ +(function (Buffer,setImmediate){(function (){ +"use strict"; + +function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } + +function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } + +function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +/* +CSV Parse + +Please look at the [project documentation](https://csv.js.org/parse/) for +additional information. +*/ +var _require = require('stream'), + Transform = _require.Transform; + +var ResizeableBuffer = require('./ResizeableBuffer'); // white space characters +// https://en.wikipedia.org/wiki/Whitespace_character +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Character_Classes#Types +// \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff + + +var tab = 9; +var nl = 10; // \n, 0x0A in hexadecimal, 10 in decimal + +var np = 12; +var cr = 13; // \r, 0x0D in hexadécimal, 13 in decimal + +var space = 32; +var boms = { + // Note, the following are equals: + // Buffer.from("\ufeff") + // Buffer.from([239, 187, 191]) + // Buffer.from('EFBBBF', 'hex') + 'utf8': Buffer.from([239, 187, 191]), + // Note, the following are equals: + // Buffer.from "\ufeff", 'utf16le + // Buffer.from([255, 254]) + 'utf16le': Buffer.from([255, 254]) +}; + +var Parser = /*#__PURE__*/function (_Transform) { + _inherits(Parser, _Transform); + + var _super = _createSuper(Parser); + + function Parser() { + var _this; + + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, Parser); + + _this = _super.call(this, _objectSpread(_objectSpread(_objectSpread({}, { + readableObjectMode: true + }), opts), {}, { + encoding: null + })); + _this.__originalOptions = opts; + + _this.__normalizeOptions(opts); + + return _this; + } + + _createClass(Parser, [{ + key: "__normalizeOptions", + value: function __normalizeOptions(opts) { + var options = {}; // Merge with user options + + for (var opt in opts) { + options[underscore(opt)] = opts[opt]; + } // Normalize option `encoding` + // Note: defined first because other options depends on it + // to convert chars/strings into buffers. + + + if (options.encoding === undefined || options.encoding === true) { + options.encoding = 'utf8'; + } else if (options.encoding === null || options.encoding === false) { + options.encoding = null; + } else if (typeof options.encoding !== 'string' && options.encoding !== null) { + throw new CsvError('CSV_INVALID_OPTION_ENCODING', ['Invalid option encoding:', 'encoding must be a string or null to return a buffer,', "got ".concat(JSON.stringify(options.encoding))], options); + } // Normalize option `bom` + + + if (options.bom === undefined || options.bom === null || options.bom === false) { + options.bom = false; + } else if (options.bom !== true) { + throw new CsvError('CSV_INVALID_OPTION_BOM', ['Invalid option bom:', 'bom must be true,', "got ".concat(JSON.stringify(options.bom))], options); + } // Normalize option `cast` + + + var fnCastField = null; + + if (options.cast === undefined || options.cast === null || options.cast === false || options.cast === '') { + options.cast = undefined; + } else if (typeof options.cast === 'function') { + fnCastField = options.cast; + options.cast = true; + } else if (options.cast !== true) { + throw new CsvError('CSV_INVALID_OPTION_CAST', ['Invalid option cast:', 'cast must be true or a function,', "got ".concat(JSON.stringify(options.cast))], options); + } // Normalize option `cast_date` + + + if (options.cast_date === undefined || options.cast_date === null || options.cast_date === false || options.cast_date === '') { + options.cast_date = false; + } else if (options.cast_date === true) { + options.cast_date = function (value) { + var date = Date.parse(value); + return !isNaN(date) ? new Date(date) : value; + }; + } else if (typeof options.cast_date !== 'function') { + throw new CsvError('CSV_INVALID_OPTION_CAST_DATE', ['Invalid option cast_date:', 'cast_date must be true or a function,', "got ".concat(JSON.stringify(options.cast_date))], options); + } // Normalize option `columns` + + + var fnFirstLineToHeaders = null; + + if (options.columns === true) { + // Fields in the first line are converted as-is to columns + fnFirstLineToHeaders = undefined; + } else if (typeof options.columns === 'function') { + fnFirstLineToHeaders = options.columns; + options.columns = true; + } else if (Array.isArray(options.columns)) { + options.columns = normalizeColumnsArray(options.columns); + } else if (options.columns === undefined || options.columns === null || options.columns === false) { + options.columns = false; + } else { + throw new CsvError('CSV_INVALID_OPTION_COLUMNS', ['Invalid option columns:', 'expect an object, a function or true,', "got ".concat(JSON.stringify(options.columns))], options); + } // Normalize option `columns_duplicates_to_array` + + + if (options.columns_duplicates_to_array === undefined || options.columns_duplicates_to_array === null || options.columns_duplicates_to_array === false) { + options.columns_duplicates_to_array = false; + } else if (options.columns_duplicates_to_array !== true) { + throw new CsvError('CSV_INVALID_OPTION_COLUMNS_DUPLICATES_TO_ARRAY', ['Invalid option columns_duplicates_to_array:', 'expect an boolean,', "got ".concat(JSON.stringify(options.columns_duplicates_to_array))], options); + } // Normalize option `comment` + + + if (options.comment === undefined || options.comment === null || options.comment === false || options.comment === '') { + options.comment = null; + } else { + if (typeof options.comment === 'string') { + options.comment = Buffer.from(options.comment, options.encoding); + } + + if (!Buffer.isBuffer(options.comment)) { + throw new CsvError('CSV_INVALID_OPTION_COMMENT', ['Invalid option comment:', 'comment must be a buffer or a string,', "got ".concat(JSON.stringify(options.comment))], options); + } + } // Normalize option `delimiter` + + + var delimiter_json = JSON.stringify(options.delimiter); + if (!Array.isArray(options.delimiter)) options.delimiter = [options.delimiter]; + + if (options.delimiter.length === 0) { + throw new CsvError('CSV_INVALID_OPTION_DELIMITER', ['Invalid option delimiter:', 'delimiter must be a non empty string or buffer or array of string|buffer,', "got ".concat(delimiter_json)], options); + } + + options.delimiter = options.delimiter.map(function (delimiter) { + if (delimiter === undefined || delimiter === null || delimiter === false) { + return Buffer.from(',', options.encoding); + } + + if (typeof delimiter === 'string') { + delimiter = Buffer.from(delimiter, options.encoding); + } + + if (!Buffer.isBuffer(delimiter) || delimiter.length === 0) { + throw new CsvError('CSV_INVALID_OPTION_DELIMITER', ['Invalid option delimiter:', 'delimiter must be a non empty string or buffer or array of string|buffer,', "got ".concat(delimiter_json)], options); + } + + return delimiter; + }); // Normalize option `escape` + + if (options.escape === undefined || options.escape === true) { + options.escape = Buffer.from('"', options.encoding); + } else if (typeof options.escape === 'string') { + options.escape = Buffer.from(options.escape, options.encoding); + } else if (options.escape === null || options.escape === false) { + options.escape = null; + } + + if (options.escape !== null) { + if (!Buffer.isBuffer(options.escape)) { + throw new Error("Invalid Option: escape must be a buffer, a string or a boolean, got ".concat(JSON.stringify(options.escape))); + } + } // Normalize option `from` + + + if (options.from === undefined || options.from === null) { + options.from = 1; + } else { + if (typeof options.from === 'string' && /\d+/.test(options.from)) { + options.from = parseInt(options.from); + } + + if (Number.isInteger(options.from)) { + if (options.from < 0) { + throw new Error("Invalid Option: from must be a positive integer, got ".concat(JSON.stringify(opts.from))); + } + } else { + throw new Error("Invalid Option: from must be an integer, got ".concat(JSON.stringify(options.from))); + } + } // Normalize option `from_line` + + + if (options.from_line === undefined || options.from_line === null) { + options.from_line = 1; + } else { + if (typeof options.from_line === 'string' && /\d+/.test(options.from_line)) { + options.from_line = parseInt(options.from_line); + } + + if (Number.isInteger(options.from_line)) { + if (options.from_line <= 0) { + throw new Error("Invalid Option: from_line must be a positive integer greater than 0, got ".concat(JSON.stringify(opts.from_line))); + } + } else { + throw new Error("Invalid Option: from_line must be an integer, got ".concat(JSON.stringify(opts.from_line))); + } + } // Normalize options `ignore_last_delimiters` + + + if (options.ignore_last_delimiters === undefined || options.ignore_last_delimiters === null) { + options.ignore_last_delimiters = false; + } else if (typeof options.ignore_last_delimiters === 'number') { + options.ignore_last_delimiters = Math.floor(options.ignore_last_delimiters); + + if (options.ignore_last_delimiters === 0) { + options.ignore_last_delimiters = false; + } + } else if (typeof options.ignore_last_delimiters !== 'boolean') { + throw new CsvError('CSV_INVALID_OPTION_IGNORE_LAST_DELIMITERS', ['Invalid option `ignore_last_delimiters`:', 'the value must be a boolean value or an integer,', "got ".concat(JSON.stringify(options.ignore_last_delimiters))], options); + } + + if (options.ignore_last_delimiters === true && options.columns === false) { + throw new CsvError('CSV_IGNORE_LAST_DELIMITERS_REQUIRES_COLUMNS', ['The option `ignore_last_delimiters`', 'requires the activation of the `columns` option'], options); + } // Normalize option `info` + + + if (options.info === undefined || options.info === null || options.info === false) { + options.info = false; + } else if (options.info !== true) { + throw new Error("Invalid Option: info must be true, got ".concat(JSON.stringify(options.info))); + } // Normalize option `max_record_size` + + + if (options.max_record_size === undefined || options.max_record_size === null || options.max_record_size === false) { + options.max_record_size = 0; + } else if (Number.isInteger(options.max_record_size) && options.max_record_size >= 0) {// Great, nothing to do + } else if (typeof options.max_record_size === 'string' && /\d+/.test(options.max_record_size)) { + options.max_record_size = parseInt(options.max_record_size); + } else { + throw new Error("Invalid Option: max_record_size must be a positive integer, got ".concat(JSON.stringify(options.max_record_size))); + } // Normalize option `objname` + + + if (options.objname === undefined || options.objname === null || options.objname === false) { + options.objname = undefined; + } else if (Buffer.isBuffer(options.objname)) { + if (options.objname.length === 0) { + throw new Error("Invalid Option: objname must be a non empty buffer"); + } + + if (options.encoding === null) {// Don't call `toString`, leave objname as a buffer + } else { + options.objname = options.objname.toString(options.encoding); + } + } else if (typeof options.objname === 'string') { + if (options.objname.length === 0) { + throw new Error("Invalid Option: objname must be a non empty string"); + } // Great, nothing to do + + } else { + throw new Error("Invalid Option: objname must be a string or a buffer, got ".concat(options.objname)); + } // Normalize option `on_record` + + + if (options.on_record === undefined || options.on_record === null) { + options.on_record = undefined; + } else if (typeof options.on_record !== 'function') { + throw new CsvError('CSV_INVALID_OPTION_ON_RECORD', ['Invalid option `on_record`:', 'expect a function,', "got ".concat(JSON.stringify(options.on_record))], options); + } // Normalize option `quote` + + + if (options.quote === null || options.quote === false || options.quote === '') { + options.quote = null; + } else { + if (options.quote === undefined || options.quote === true) { + options.quote = Buffer.from('"', options.encoding); + } else if (typeof options.quote === 'string') { + options.quote = Buffer.from(options.quote, options.encoding); + } + + if (!Buffer.isBuffer(options.quote)) { + throw new Error("Invalid Option: quote must be a buffer or a string, got ".concat(JSON.stringify(options.quote))); + } + } // Normalize option `raw` + + + if (options.raw === undefined || options.raw === null || options.raw === false) { + options.raw = false; + } else if (options.raw !== true) { + throw new Error("Invalid Option: raw must be true, got ".concat(JSON.stringify(options.raw))); + } // Normalize option `record_delimiter` + + + if (!options.record_delimiter) { + options.record_delimiter = []; + } else if (!Array.isArray(options.record_delimiter)) { + options.record_delimiter = [options.record_delimiter]; + } + + options.record_delimiter = options.record_delimiter.map(function (rd) { + if (typeof rd === 'string') { + rd = Buffer.from(rd, options.encoding); + } + + return rd; + }); // Normalize option `relax` + + if (typeof options.relax === 'boolean') {// Great, nothing to do + } else if (options.relax === undefined || options.relax === null) { + options.relax = false; + } else { + throw new Error("Invalid Option: relax must be a boolean, got ".concat(JSON.stringify(options.relax))); + } // Normalize option `relax_column_count` + + + if (typeof options.relax_column_count === 'boolean') {// Great, nothing to do + } else if (options.relax_column_count === undefined || options.relax_column_count === null) { + options.relax_column_count = false; + } else { + throw new Error("Invalid Option: relax_column_count must be a boolean, got ".concat(JSON.stringify(options.relax_column_count))); + } + + if (typeof options.relax_column_count_less === 'boolean') {// Great, nothing to do + } else if (options.relax_column_count_less === undefined || options.relax_column_count_less === null) { + options.relax_column_count_less = false; + } else { + throw new Error("Invalid Option: relax_column_count_less must be a boolean, got ".concat(JSON.stringify(options.relax_column_count_less))); + } + + if (typeof options.relax_column_count_more === 'boolean') {// Great, nothing to do + } else if (options.relax_column_count_more === undefined || options.relax_column_count_more === null) { + options.relax_column_count_more = false; + } else { + throw new Error("Invalid Option: relax_column_count_more must be a boolean, got ".concat(JSON.stringify(options.relax_column_count_more))); + } // Normalize option `skip_empty_lines` + + + if (typeof options.skip_empty_lines === 'boolean') {// Great, nothing to do + } else if (options.skip_empty_lines === undefined || options.skip_empty_lines === null) { + options.skip_empty_lines = false; + } else { + throw new Error("Invalid Option: skip_empty_lines must be a boolean, got ".concat(JSON.stringify(options.skip_empty_lines))); + } // Normalize option `skip_lines_with_empty_values` + + + if (typeof options.skip_lines_with_empty_values === 'boolean') {// Great, nothing to do + } else if (options.skip_lines_with_empty_values === undefined || options.skip_lines_with_empty_values === null) { + options.skip_lines_with_empty_values = false; + } else { + throw new Error("Invalid Option: skip_lines_with_empty_values must be a boolean, got ".concat(JSON.stringify(options.skip_lines_with_empty_values))); + } // Normalize option `skip_lines_with_error` + + + if (typeof options.skip_lines_with_error === 'boolean') {// Great, nothing to do + } else if (options.skip_lines_with_error === undefined || options.skip_lines_with_error === null) { + options.skip_lines_with_error = false; + } else { + throw new Error("Invalid Option: skip_lines_with_error must be a boolean, got ".concat(JSON.stringify(options.skip_lines_with_error))); + } // Normalize option `rtrim` + + + if (options.rtrim === undefined || options.rtrim === null || options.rtrim === false) { + options.rtrim = false; + } else if (options.rtrim !== true) { + throw new Error("Invalid Option: rtrim must be a boolean, got ".concat(JSON.stringify(options.rtrim))); + } // Normalize option `ltrim` + + + if (options.ltrim === undefined || options.ltrim === null || options.ltrim === false) { + options.ltrim = false; + } else if (options.ltrim !== true) { + throw new Error("Invalid Option: ltrim must be a boolean, got ".concat(JSON.stringify(options.ltrim))); + } // Normalize option `trim` + + + if (options.trim === undefined || options.trim === null || options.trim === false) { + options.trim = false; + } else if (options.trim !== true) { + throw new Error("Invalid Option: trim must be a boolean, got ".concat(JSON.stringify(options.trim))); + } // Normalize options `trim`, `ltrim` and `rtrim` + + + if (options.trim === true && opts.ltrim !== false) { + options.ltrim = true; + } else if (options.ltrim !== true) { + options.ltrim = false; + } + + if (options.trim === true && opts.rtrim !== false) { + options.rtrim = true; + } else if (options.rtrim !== true) { + options.rtrim = false; + } // Normalize option `to` + + + if (options.to === undefined || options.to === null) { + options.to = -1; + } else { + if (typeof options.to === 'string' && /\d+/.test(options.to)) { + options.to = parseInt(options.to); + } + + if (Number.isInteger(options.to)) { + if (options.to <= 0) { + throw new Error("Invalid Option: to must be a positive integer greater than 0, got ".concat(JSON.stringify(opts.to))); + } + } else { + throw new Error("Invalid Option: to must be an integer, got ".concat(JSON.stringify(opts.to))); + } + } // Normalize option `to_line` + + + if (options.to_line === undefined || options.to_line === null) { + options.to_line = -1; + } else { + if (typeof options.to_line === 'string' && /\d+/.test(options.to_line)) { + options.to_line = parseInt(options.to_line); + } + + if (Number.isInteger(options.to_line)) { + if (options.to_line <= 0) { + throw new Error("Invalid Option: to_line must be a positive integer greater than 0, got ".concat(JSON.stringify(opts.to_line))); + } + } else { + throw new Error("Invalid Option: to_line must be an integer, got ".concat(JSON.stringify(opts.to_line))); + } + } + + this.info = { + comment_lines: 0, + empty_lines: 0, + invalid_field_length: 0, + lines: 1, + records: 0 + }; + this.options = options; + this.state = { + bomSkipped: false, + castField: fnCastField, + commenting: false, + // Current error encountered by a record + error: undefined, + enabled: options.from_line === 1, + escaping: false, + // escapeIsQuote: options.escape === options.quote, + escapeIsQuote: Buffer.isBuffer(options.escape) && Buffer.isBuffer(options.quote) && Buffer.compare(options.escape, options.quote) === 0, + expectedRecordLength: options.columns === null ? 0 : options.columns.length, + field: new ResizeableBuffer(20), + firstLineToHeaders: fnFirstLineToHeaders, + info: Object.assign({}, this.info), + needMoreDataSize: Math.max.apply(Math, [// Skip if the remaining buffer smaller than comment + options.comment !== null ? options.comment.length : 0].concat(_toConsumableArray(options.delimiter.map(function (delimiter) { + return delimiter.length; + })), [// Skip if the remaining buffer can be escape sequence + options.quote !== null ? options.quote.length : 0])), + previousBuf: undefined, + quoting: false, + stop: false, + rawBuffer: new ResizeableBuffer(100), + record: [], + recordHasError: false, + record_length: 0, + recordDelimiterMaxLength: options.record_delimiter.length === 0 ? 2 : Math.max.apply(Math, _toConsumableArray(options.record_delimiter.map(function (v) { + return v.length; + }))), + trimChars: [Buffer.from(' ', options.encoding)[0], Buffer.from('\t', options.encoding)[0]], + wasQuoting: false, + wasRowDelimiter: false + }; + } // Implementation of `Transform._transform` + + }, { + key: "_transform", + value: function _transform(buf, encoding, callback) { + if (this.state.stop === true) { + return; + } + + var err = this.__parse(buf, false); + + if (err !== undefined) { + this.state.stop = true; + } + + callback(err); + } // Implementation of `Transform._flush` + + }, { + key: "_flush", + value: function _flush(callback) { + if (this.state.stop === true) { + return; + } + + var err = this.__parse(undefined, true); + + callback(err); + } // Central parser implementation + + }, { + key: "__parse", + value: function __parse(nextBuf, end) { + var _this$options = this.options, + bom = _this$options.bom, + comment = _this$options.comment, + escape = _this$options.escape, + from_line = _this$options.from_line, + info = _this$options.info, + ltrim = _this$options.ltrim, + max_record_size = _this$options.max_record_size, + quote = _this$options.quote, + raw = _this$options.raw, + relax = _this$options.relax, + rtrim = _this$options.rtrim, + skip_empty_lines = _this$options.skip_empty_lines, + to = _this$options.to, + to_line = _this$options.to_line; + var record_delimiter = this.options.record_delimiter; + var _this$state = this.state, + bomSkipped = _this$state.bomSkipped, + previousBuf = _this$state.previousBuf, + rawBuffer = _this$state.rawBuffer, + escapeIsQuote = _this$state.escapeIsQuote; + var buf; + + if (previousBuf === undefined) { + if (nextBuf === undefined) { + // Handle empty string + this.push(null); + return; + } else { + buf = nextBuf; + } + } else if (previousBuf !== undefined && nextBuf === undefined) { + buf = previousBuf; + } else { + buf = Buffer.concat([previousBuf, nextBuf]); + } // Handle UTF BOM + + + if (bomSkipped === false) { + if (bom === false) { + this.state.bomSkipped = true; + } else if (buf.length < 3) { + // No enough data + if (end === false) { + // Wait for more data + this.state.previousBuf = buf; + return; + } + } else { + for (var encoding in boms) { + if (boms[encoding].compare(buf, 0, boms[encoding].length) === 0) { + // Skip BOM + buf = buf.slice(boms[encoding].length); // Renormalize original options with the new encoding + + this.__normalizeOptions(_objectSpread(_objectSpread({}, this.__originalOptions), {}, { + encoding: encoding + })); + + break; + } + } + + this.state.bomSkipped = true; + } + } + + var bufLen = buf.length; + var pos; + + for (pos = 0; pos < bufLen; pos++) { + // Ensure we get enough space to look ahead + // There should be a way to move this out of the loop + if (this.__needMoreData(pos, bufLen, end)) { + break; + } + + if (this.state.wasRowDelimiter === true) { + this.info.lines++; + + if (info === true && this.state.record.length === 0 && this.state.field.length === 0 && this.state.wasQuoting === false) { + this.state.info = Object.assign({}, this.info); + } + + this.state.wasRowDelimiter = false; + } + + if (to_line !== -1 && this.info.lines > to_line) { + this.state.stop = true; + this.push(null); + return; + } // Auto discovery of record_delimiter, unix, mac and windows supported + + + if (this.state.quoting === false && record_delimiter.length === 0) { + var record_delimiterCount = this.__autoDiscoverRecordDelimiter(buf, pos); + + if (record_delimiterCount) { + record_delimiter = this.options.record_delimiter; + } + } + + var chr = buf[pos]; + + if (raw === true) { + rawBuffer.append(chr); + } + + if ((chr === cr || chr === nl) && this.state.wasRowDelimiter === false) { + this.state.wasRowDelimiter = true; + } // Previous char was a valid escape char + // treat the current char as a regular char + + + if (this.state.escaping === true) { + this.state.escaping = false; + } else { + // Escape is only active inside quoted fields + // We are quoting, the char is an escape chr and there is a chr to escape + // if(escape !== null && this.state.quoting === true && chr === escape && pos + 1 < bufLen){ + if (escape !== null && this.state.quoting === true && this.__isEscape(buf, pos, chr) && pos + escape.length < bufLen) { + if (escapeIsQuote) { + if (this.__isQuote(buf, pos + escape.length)) { + this.state.escaping = true; + pos += escape.length - 1; + continue; + } + } else { + this.state.escaping = true; + pos += escape.length - 1; + continue; + } + } // Not currently escaping and chr is a quote + // TODO: need to compare bytes instead of single char + + + if (this.state.commenting === false && this.__isQuote(buf, pos)) { + if (this.state.quoting === true) { + var nextChr = buf[pos + quote.length]; + + var isNextChrTrimable = rtrim && this.__isCharTrimable(nextChr); + + var isNextChrComment = comment !== null && this.__compareBytes(comment, buf, pos + quote.length, nextChr); + + var isNextChrDelimiter = this.__isDelimiter(buf, pos + quote.length, nextChr); + + var isNextChrRecordDelimiter = record_delimiter.length === 0 ? this.__autoDiscoverRecordDelimiter(buf, pos + quote.length) : this.__isRecordDelimiter(nextChr, buf, pos + quote.length); // Escape a quote + // Treat next char as a regular character + + if (escape !== null && this.__isEscape(buf, pos, chr) && this.__isQuote(buf, pos + escape.length)) { + pos += escape.length - 1; + } else if (!nextChr || isNextChrDelimiter || isNextChrRecordDelimiter || isNextChrComment || isNextChrTrimable) { + this.state.quoting = false; + this.state.wasQuoting = true; + pos += quote.length - 1; + continue; + } else if (relax === false) { + var err = this.__error(new CsvError('CSV_INVALID_CLOSING_QUOTE', ['Invalid Closing Quote:', "got \"".concat(String.fromCharCode(nextChr), "\""), "at line ".concat(this.info.lines), 'instead of delimiter, record delimiter, trimable character', '(if activated) or comment'], this.options, this.__context())); + + if (err !== undefined) return err; + } else { + this.state.quoting = false; + this.state.wasQuoting = true; + this.state.field.prepend(quote); + pos += quote.length - 1; + } + } else { + if (this.state.field.length !== 0) { + // In relax mode, treat opening quote preceded by chrs as regular + if (relax === false) { + var _err = this.__error(new CsvError('INVALID_OPENING_QUOTE', ['Invalid Opening Quote:', "a quote is found inside a field at line ".concat(this.info.lines)], this.options, this.__context(), { + field: this.state.field + })); + + if (_err !== undefined) return _err; + } + } else { + this.state.quoting = true; + pos += quote.length - 1; + continue; + } + } + } + + if (this.state.quoting === false) { + var recordDelimiterLength = this.__isRecordDelimiter(chr, buf, pos); + + if (recordDelimiterLength !== 0) { + // Do not emit comments which take a full line + var skipCommentLine = this.state.commenting && this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0; + + if (skipCommentLine) { + this.info.comment_lines++; // Skip full comment line + } else { + // Activate records emition if above from_line + if (this.state.enabled === false && this.info.lines + (this.state.wasRowDelimiter === true ? 1 : 0) >= from_line) { + this.state.enabled = true; + + this.__resetField(); + + this.__resetRecord(); + + pos += recordDelimiterLength - 1; + continue; + } // Skip if line is empty and skip_empty_lines activated + + + if (skip_empty_lines === true && this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0) { + this.info.empty_lines++; + pos += recordDelimiterLength - 1; + continue; + } + + var errField = this.__onField(); + + if (errField !== undefined) return errField; + + var errRecord = this.__onRecord(); + + if (errRecord !== undefined) return errRecord; + + if (to !== -1 && this.info.records >= to) { + this.state.stop = true; + this.push(null); + return; + } + } + + this.state.commenting = false; + pos += recordDelimiterLength - 1; + continue; + } + + if (this.state.commenting) { + continue; + } + + var commentCount = comment === null ? 0 : this.__compareBytes(comment, buf, pos, chr); + + if (commentCount !== 0) { + this.state.commenting = true; + continue; + } + + var delimiterLength = this.__isDelimiter(buf, pos, chr); + + if (delimiterLength !== 0) { + var _errField = this.__onField(); + + if (_errField !== undefined) return _errField; + pos += delimiterLength - 1; + continue; + } + } + } + + if (this.state.commenting === false) { + if (max_record_size !== 0 && this.state.record_length + this.state.field.length > max_record_size) { + var _err2 = this.__error(new CsvError('CSV_MAX_RECORD_SIZE', ['Max Record Size:', 'record exceed the maximum number of tolerated bytes', "of ".concat(max_record_size), "at line ".concat(this.info.lines)], this.options, this.__context())); + + if (_err2 !== undefined) return _err2; + } + } + + var lappend = ltrim === false || this.state.quoting === true || this.state.field.length !== 0 || !this.__isCharTrimable(chr); // rtrim in non quoting is handle in __onField + + var rappend = rtrim === false || this.state.wasQuoting === false; + + if (lappend === true && rappend === true) { + this.state.field.append(chr); + } else if (rtrim === true && !this.__isCharTrimable(chr)) { + var _err3 = this.__error(new CsvError('CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE', ['Invalid Closing Quote:', 'found non trimable byte after quote', "at line ".concat(this.info.lines)], this.options, this.__context())); + + if (_err3 !== undefined) return _err3; + } + } + + if (end === true) { + // Ensure we are not ending in a quoting state + if (this.state.quoting === true) { + var _err4 = this.__error(new CsvError('CSV_QUOTE_NOT_CLOSED', ['Quote Not Closed:', "the parsing is finished with an opening quote at line ".concat(this.info.lines)], this.options, this.__context())); + + if (_err4 !== undefined) return _err4; + } else { + // Skip last line if it has no characters + if (this.state.wasQuoting === true || this.state.record.length !== 0 || this.state.field.length !== 0) { + var _errField2 = this.__onField(); + + if (_errField2 !== undefined) return _errField2; + + var _errRecord = this.__onRecord(); + + if (_errRecord !== undefined) return _errRecord; + } else if (this.state.wasRowDelimiter === true) { + this.info.empty_lines++; + } else if (this.state.commenting === true) { + this.info.comment_lines++; + } + } + } else { + this.state.previousBuf = buf.slice(pos); + } + + if (this.state.wasRowDelimiter === true) { + this.info.lines++; + this.state.wasRowDelimiter = false; + } + } + }, { + key: "__onRecord", + value: function __onRecord() { + var _this$options2 = this.options, + columns = _this$options2.columns, + columns_duplicates_to_array = _this$options2.columns_duplicates_to_array, + encoding = _this$options2.encoding, + info = _this$options2.info, + from = _this$options2.from, + relax_column_count = _this$options2.relax_column_count, + relax_column_count_less = _this$options2.relax_column_count_less, + relax_column_count_more = _this$options2.relax_column_count_more, + raw = _this$options2.raw, + skip_lines_with_empty_values = _this$options2.skip_lines_with_empty_values; + var _this$state2 = this.state, + enabled = _this$state2.enabled, + record = _this$state2.record; + + if (enabled === false) { + return this.__resetRecord(); + } // Convert the first line into column names + + + var recordLength = record.length; + + if (columns === true) { + if (isRecordEmpty(record)) { + this.__resetRecord(); + + return; + } + + return this.__firstLineToColumns(record); + } + + if (columns === false && this.info.records === 0) { + this.state.expectedRecordLength = recordLength; + } + + if (recordLength !== this.state.expectedRecordLength) { + var err = columns === false ? // Todo: rename CSV_INCONSISTENT_RECORD_LENGTH to + // CSV_RECORD_INCONSISTENT_FIELDS_LENGTH + new CsvError('CSV_INCONSISTENT_RECORD_LENGTH', ['Invalid Record Length:', "expect ".concat(this.state.expectedRecordLength, ","), "got ".concat(recordLength, " on line ").concat(this.info.lines)], this.options, this.__context(), { + record: record + }) : // Todo: rename CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH to + // CSV_RECORD_INCONSISTENT_COLUMNS + new CsvError('CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH', ['Invalid Record Length:', "columns length is ".concat(columns.length, ","), // rename columns + "got ".concat(recordLength, " on line ").concat(this.info.lines)], this.options, this.__context(), { + record: record + }); + + if (relax_column_count === true || relax_column_count_less === true && recordLength < this.state.expectedRecordLength || relax_column_count_more === true && recordLength > this.state.expectedRecordLength) { + this.info.invalid_field_length++; + this.state.error = err; // Error is undefined with skip_lines_with_error + } else { + var finalErr = this.__error(err); + + if (finalErr) return finalErr; + } + } + + if (skip_lines_with_empty_values === true) { + if (isRecordEmpty(record)) { + this.__resetRecord(); + + return; + } + } + + if (this.state.recordHasError === true) { + this.__resetRecord(); + + this.state.recordHasError = false; + return; + } + + this.info.records++; + + if (from === 1 || this.info.records >= from) { + if (columns !== false) { + var obj = {}; // Transform record array to an object + + for (var i = 0, l = record.length; i < l; i++) { + if (columns[i] === undefined || columns[i].disabled) continue; // Turn duplicate columns into an array + + if (columns_duplicates_to_array === true && obj[columns[i].name]) { + if (Array.isArray(obj[columns[i].name])) { + obj[columns[i].name] = obj[columns[i].name].concat(record[i]); + } else { + obj[columns[i].name] = [obj[columns[i].name], record[i]]; + } + } else { + obj[columns[i].name] = record[i]; + } + } + + var objname = this.options.objname; + + if (objname === undefined) { + if (raw === true || info === true) { + var _err5 = this.__push(Object.assign({ + record: obj + }, raw === true ? { + raw: this.state.rawBuffer.toString(encoding) + } : {}, info === true ? { + info: this.state.info + } : {})); + + if (_err5) { + return _err5; + } + } else { + var _err6 = this.__push(obj); + + if (_err6) { + return _err6; + } + } + } else { + if (raw === true || info === true) { + var _err7 = this.__push(Object.assign({ + record: [obj[objname], obj] + }, raw === true ? { + raw: this.state.rawBuffer.toString(encoding) + } : {}, info === true ? { + info: this.state.info + } : {})); + + if (_err7) { + return _err7; + } + } else { + var _err8 = this.__push([obj[objname], obj]); + + if (_err8) { + return _err8; + } + } + } + } else { + if (raw === true || info === true) { + var _err9 = this.__push(Object.assign({ + record: record + }, raw === true ? { + raw: this.state.rawBuffer.toString(encoding) + } : {}, info === true ? { + info: this.state.info + } : {})); + + if (_err9) { + return _err9; + } + } else { + var _err10 = this.__push(record); + + if (_err10) { + return _err10; + } + } + } + } + + this.__resetRecord(); + } + }, { + key: "__firstLineToColumns", + value: function __firstLineToColumns(record) { + var firstLineToHeaders = this.state.firstLineToHeaders; + + try { + var headers = firstLineToHeaders === undefined ? record : firstLineToHeaders.call(null, record); + + if (!Array.isArray(headers)) { + return this.__error(new CsvError('CSV_INVALID_COLUMN_MAPPING', ['Invalid Column Mapping:', 'expect an array from column function,', "got ".concat(JSON.stringify(headers))], this.options, this.__context(), { + headers: headers + })); + } + + var normalizedHeaders = normalizeColumnsArray(headers); + this.state.expectedRecordLength = normalizedHeaders.length; + this.options.columns = normalizedHeaders; + + this.__resetRecord(); + + return; + } catch (err) { + return err; + } + } + }, { + key: "__resetRecord", + value: function __resetRecord() { + if (this.options.raw === true) { + this.state.rawBuffer.reset(); + } + + this.state.error = undefined; + this.state.record = []; + this.state.record_length = 0; + } + }, { + key: "__onField", + value: function __onField() { + var _this$options3 = this.options, + cast = _this$options3.cast, + encoding = _this$options3.encoding, + rtrim = _this$options3.rtrim, + max_record_size = _this$options3.max_record_size; + var _this$state3 = this.state, + enabled = _this$state3.enabled, + wasQuoting = _this$state3.wasQuoting; // Short circuit for the from_line options + + if (enabled === false) { + /* this.options.columns !== true && */ + return this.__resetField(); + } + + var field = this.state.field.toString(encoding); + + if (rtrim === true && wasQuoting === false) { + field = field.trimRight(); + } + + if (cast === true) { + var _this$__cast = this.__cast(field), + _this$__cast2 = _slicedToArray(_this$__cast, 2), + err = _this$__cast2[0], + f = _this$__cast2[1]; + + if (err !== undefined) return err; + field = f; + } + + this.state.record.push(field); // Increment record length if record size must not exceed a limit + + if (max_record_size !== 0 && typeof field === 'string') { + this.state.record_length += field.length; + } + + this.__resetField(); + } + }, { + key: "__resetField", + value: function __resetField() { + this.state.field.reset(); + this.state.wasQuoting = false; + } + }, { + key: "__push", + value: function __push(record) { + var on_record = this.options.on_record; + + if (on_record !== undefined) { + var context = this.__context(); + + try { + record = on_record.call(null, record, context); + } catch (err) { + return err; + } + + if (record === undefined || record === null) { + return; + } + } + + this.push(record); + } // Return a tuple with the error and the casted value + + }, { + key: "__cast", + value: function __cast(field) { + var _this$options4 = this.options, + columns = _this$options4.columns, + relax_column_count = _this$options4.relax_column_count; + var isColumns = Array.isArray(columns); // Dont loose time calling cast + // because the final record is an object + // and this field can't be associated to a key present in columns + + if (isColumns === true && relax_column_count && this.options.columns.length <= this.state.record.length) { + return [undefined, undefined]; + } + + var context = this.__context(); + + if (this.state.castField !== null) { + try { + return [undefined, this.state.castField.call(null, field, context)]; + } catch (err) { + return [err]; + } + } + + if (this.__isFloat(field)) { + return [undefined, parseFloat(field)]; + } else if (this.options.cast_date !== false) { + return [undefined, this.options.cast_date.call(null, field, context)]; + } + + return [undefined, field]; + } // Helper to test if a character is a space or a line delimiter + + }, { + key: "__isCharTrimable", + value: function __isCharTrimable(chr) { + return chr === space || chr === tab || chr === cr || chr === nl || chr === np; + } // Keep it in case we implement the `cast_int` option + // __isInt(value){ + // // return Number.isInteger(parseInt(value)) + // // return !isNaN( parseInt( obj ) ); + // return /^(\-|\+)?[1-9][0-9]*$/.test(value) + // } + + }, { + key: "__isFloat", + value: function __isFloat(value) { + return value - parseFloat(value) + 1 >= 0; // Borrowed from jquery + } + }, { + key: "__compareBytes", + value: function __compareBytes(sourceBuf, targetBuf, targetPos, firstByte) { + if (sourceBuf[0] !== firstByte) return 0; + var sourceLength = sourceBuf.length; + + for (var i = 1; i < sourceLength; i++) { + if (sourceBuf[i] !== targetBuf[targetPos + i]) return 0; + } + + return sourceLength; + } + }, { + key: "__needMoreData", + value: function __needMoreData(i, bufLen, end) { + if (end) return false; + var quote = this.options.quote; + var _this$state4 = this.state, + quoting = _this$state4.quoting, + needMoreDataSize = _this$state4.needMoreDataSize, + recordDelimiterMaxLength = _this$state4.recordDelimiterMaxLength; + var numOfCharLeft = bufLen - i - 1; + var requiredLength = Math.max(needMoreDataSize, // Skip if the remaining buffer smaller than record delimiter + recordDelimiterMaxLength, // Skip if the remaining buffer can be record delimiter following the closing quote + // 1 is for quote.length + quoting ? quote.length + recordDelimiterMaxLength : 0); + return numOfCharLeft < requiredLength; + } + }, { + key: "__isDelimiter", + value: function __isDelimiter(buf, pos, chr) { + var _this$options5 = this.options, + delimiter = _this$options5.delimiter, + ignore_last_delimiters = _this$options5.ignore_last_delimiters; + + if (ignore_last_delimiters === true && this.state.record.length === this.options.columns.length - 1) { + return 0; + } else if (ignore_last_delimiters !== false && typeof ignore_last_delimiters === 'number' && this.state.record.length === ignore_last_delimiters - 1) { + return 0; + } + + loop1: for (var i = 0; i < delimiter.length; i++) { + var del = delimiter[i]; + + if (del[0] === chr) { + for (var j = 1; j < del.length; j++) { + if (del[j] !== buf[pos + j]) continue loop1; + } + + return del.length; + } + } + + return 0; + } + }, { + key: "__isRecordDelimiter", + value: function __isRecordDelimiter(chr, buf, pos) { + var record_delimiter = this.options.record_delimiter; + var recordDelimiterLength = record_delimiter.length; + + loop1: for (var i = 0; i < recordDelimiterLength; i++) { + var rd = record_delimiter[i]; + var rdLength = rd.length; + + if (rd[0] !== chr) { + continue; + } + + for (var j = 1; j < rdLength; j++) { + if (rd[j] !== buf[pos + j]) { + continue loop1; + } + } + + return rd.length; + } + + return 0; + } + }, { + key: "__isEscape", + value: function __isEscape(buf, pos, chr) { + var escape = this.options.escape; + if (escape === null) return false; + var l = escape.length; + + if (escape[0] === chr) { + for (var i = 0; i < l; i++) { + if (escape[i] !== buf[pos + i]) { + return false; + } + } + + return true; + } + + return false; + } + }, { + key: "__isQuote", + value: function __isQuote(buf, pos) { + var quote = this.options.quote; + if (quote === null) return false; + var l = quote.length; + + for (var i = 0; i < l; i++) { + if (quote[i] !== buf[pos + i]) { + return false; + } + } + + return true; + } + }, { + key: "__autoDiscoverRecordDelimiter", + value: function __autoDiscoverRecordDelimiter(buf, pos) { + var encoding = this.options.encoding; + var chr = buf[pos]; + + if (chr === cr) { + if (buf[pos + 1] === nl) { + this.options.record_delimiter.push(Buffer.from('\r\n', encoding)); + this.state.recordDelimiterMaxLength = 2; + return 2; + } else { + this.options.record_delimiter.push(Buffer.from('\r', encoding)); + this.state.recordDelimiterMaxLength = 1; + return 1; + } + } else if (chr === nl) { + this.options.record_delimiter.push(Buffer.from('\n', encoding)); + this.state.recordDelimiterMaxLength = 1; + return 1; + } + + return 0; + } + }, { + key: "__error", + value: function __error(msg) { + var skip_lines_with_error = this.options.skip_lines_with_error; + var err = typeof msg === 'string' ? new Error(msg) : msg; + + if (skip_lines_with_error) { + this.state.recordHasError = true; + this.emit('skip', err); + return undefined; + } else { + return err; + } + } + }, { + key: "__context", + value: function __context() { + var columns = this.options.columns; + var isColumns = Array.isArray(columns); + return { + column: isColumns === true ? columns.length > this.state.record.length ? columns[this.state.record.length].name : null : this.state.record.length, + empty_lines: this.info.empty_lines, + error: this.state.error, + header: columns === true, + index: this.state.record.length, + invalid_field_length: this.info.invalid_field_length, + quoting: this.state.wasQuoting, + lines: this.info.lines, + records: this.info.records + }; + } + }]); + + return Parser; +}(Transform); + +var parse = function parse() { + var data, options, callback; + + for (var i in arguments) { + var argument = arguments[i]; + + var type = _typeof(argument); + + if (data === undefined && (typeof argument === 'string' || Buffer.isBuffer(argument))) { + data = argument; + } else if (options === undefined && isObject(argument)) { + options = argument; + } else if (callback === undefined && type === 'function') { + callback = argument; + } else { + throw new CsvError('CSV_INVALID_ARGUMENT', ['Invalid argument:', "got ".concat(JSON.stringify(argument), " at index ").concat(i)], this.options); + } + } + + var parser = new Parser(options); + + if (callback) { + var records = options === undefined || options.objname === undefined ? [] : {}; + parser.on('readable', function () { + var record; + + while ((record = this.read()) !== null) { + if (options === undefined || options.objname === undefined) { + records.push(record); + } else { + records[record[0]] = record[1]; + } + } + }); + parser.on('error', function (err) { + callback(err, undefined, parser.info); + }); + parser.on('end', function () { + callback(undefined, records, parser.info); + }); + } + + if (data !== undefined) { + // Give a chance for events to be registered later + if (typeof setImmediate === 'function') { + setImmediate(function () { + parser.write(data); + parser.end(); + }); + } else { + parser.write(data); + parser.end(); + } + } + + return parser; +}; + +var CsvError = /*#__PURE__*/function (_Error) { + _inherits(CsvError, _Error); + + var _super2 = _createSuper(CsvError); + + function CsvError(code, message, options) { + var _this2; + + _classCallCheck(this, CsvError); + + if (Array.isArray(message)) message = message.join(' '); + _this2 = _super2.call(this, message); + + if (Error.captureStackTrace !== undefined) { + Error.captureStackTrace(_assertThisInitialized(_this2), CsvError); + } + + _this2.code = code; + + for (var _len = arguments.length, contexts = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { + contexts[_key - 3] = arguments[_key]; + } + + for (var _i2 = 0, _contexts = contexts; _i2 < _contexts.length; _i2++) { + var context = _contexts[_i2]; + + for (var key in context) { + var value = context[key]; + _this2[key] = Buffer.isBuffer(value) ? value.toString(options.encoding) : value == null ? value : JSON.parse(JSON.stringify(value)); + } + } + + return _this2; + } + + return CsvError; +}( /*#__PURE__*/_wrapNativeSuper(Error)); + +parse.Parser = Parser; +parse.CsvError = CsvError; +module.exports = parse; + +var underscore = function underscore(str) { + return str.replace(/([A-Z])/g, function (_, match) { + return '_' + match.toLowerCase(); + }); +}; + +var isObject = function isObject(obj) { + return _typeof(obj) === 'object' && obj !== null && !Array.isArray(obj); +}; + +var isRecordEmpty = function isRecordEmpty(record) { + return record.every(function (field) { + return field == null || field.toString && field.toString().trim() === ''; + }); +}; + +var normalizeColumnsArray = function normalizeColumnsArray(columns) { + var normalizedColumns = []; + + for (var i = 0, l = columns.length; i < l; i++) { + var column = columns[i]; + + if (column === undefined || column === null || column === false) { + normalizedColumns[i] = { + disabled: true + }; + } else if (typeof column === 'string') { + normalizedColumns[i] = { + name: column + }; + } else if (isObject(column)) { + if (typeof column.name !== 'string') { + throw new CsvError('CSV_OPTION_COLUMNS_MISSING_NAME', ['Option columns missing name:', "property \"name\" is required at position ".concat(i), 'when column is an object literal']); + } + + normalizedColumns[i] = column; + } else { + throw new CsvError('CSV_INVALID_COLUMN_DEFINITION', ['Invalid column definition:', 'expect a string or a literal object,', "got ".concat(JSON.stringify(column), " at position ").concat(i)]); + } + } + + return normalizedColumns; +}; + +}).call(this)}).call(this,require("buffer").Buffer,require("timers").setImmediate) +},{"./ResizeableBuffer":1,"buffer":6,"stream":12,"timers":28}],3:[function(require,module,exports){ +(function (Buffer){(function (){ +"use strict"; + +var parse = require('.'); + +module.exports = function (data) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + if (typeof data === 'string') { + data = Buffer.from(data); + } + + var records = options && options.objname ? {} : []; + var parser = new parse.Parser(options); + + parser.push = function (record) { + if (record === null) { + return; + } + + if (options.objname === undefined) records.push(record);else { + records[record[0]] = record[1]; + } + }; + + var err1 = parser.__parse(data, false); + + if (err1 !== undefined) throw err1; + + var err2 = parser.__parse(undefined, true); + + if (err2 !== undefined) throw err2; + return records; +}; + +}).call(this)}).call(this,require("buffer").Buffer) +},{".":2,"buffer":6}],4:[function(require,module,exports){ +'use strict' + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +// Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function getLens (b64) { + var len = b64.length + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf('=') + if (validLen === -1) validLen = len + + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4) + + return [validLen, placeHoldersLen] +} + +// base64 is 4/3 + up to two characters of the original data +function byteLength (b64) { + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function _byteLength (b64, validLen, placeHoldersLen) { + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function toByteArray (b64) { + var tmp + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) + + var curByte = 0 + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen + + var i + for (i = 0; i < len; i += 4) { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)] + arr[curByte++] = (tmp >> 16) & 0xFF + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 2) { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 1) { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + parts.push( + lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + '==' + ) + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1] + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + '=' + ) + } + + return parts.join('') +} + +},{}],5:[function(require,module,exports){ + +},{}],6:[function(require,module,exports){ +(function (Buffer){(function (){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +'use strict' + +var base64 = require('base64-js') +var ieee754 = require('ieee754') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 + +var K_MAX_LENGTH = 0x7fffffff +exports.kMaxLength = K_MAX_LENGTH + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Print warning and recommend using `buffer` v4.x which has an Object + * implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * We report that the browser does not support typed arrays if the are not subclassable + * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` + * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support + * for __proto__ and has a buggy typed array implementation. + */ +Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() + +if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && + typeof console.error === 'function') { + console.error( + 'This browser lacks typed array (Uint8Array) support which is required by ' + + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' + ) +} + +function typedArraySupport () { + // Can typed array instances can be augmented? + try { + var arr = new Uint8Array(1) + arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } + return arr.foo() === 42 + } catch (e) { + return false + } +} + +Object.defineProperty(Buffer.prototype, 'parent', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.buffer + } +}) + +Object.defineProperty(Buffer.prototype, 'offset', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.byteOffset + } +}) + +function createBuffer (length) { + if (length > K_MAX_LENGTH) { + throw new RangeError('The value "' + length + '" is invalid for option "size"') + } + // Return an augmented `Uint8Array` instance + var buf = new Uint8Array(length) + buf.__proto__ = Buffer.prototype + return buf +} + +/** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + +function Buffer (arg, encodingOrOffset, length) { + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new TypeError( + 'The "string" argument must be of type string. Received type number' + ) + } + return allocUnsafe(arg) + } + return from(arg, encodingOrOffset, length) +} + +// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 +if (typeof Symbol !== 'undefined' && Symbol.species != null && + Buffer[Symbol.species] === Buffer) { + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true, + enumerable: false, + writable: false + }) +} + +Buffer.poolSize = 8192 // not used by this implementation + +function from (value, encodingOrOffset, length) { + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value) + } + + if (value == null) { + throw TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) + } + + if (isInstance(value, ArrayBuffer) || + (value && isInstance(value.buffer, ArrayBuffer))) { + return fromArrayBuffer(value, encodingOrOffset, length) + } + + if (typeof value === 'number') { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ) + } + + var valueOf = value.valueOf && value.valueOf() + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length) + } + + var b = fromObject(value) + if (b) return b + + if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && + typeof value[Symbol.toPrimitive] === 'function') { + return Buffer.from( + value[Symbol.toPrimitive]('string'), encodingOrOffset, length + ) + } + + throw new TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) +} + +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ +Buffer.from = function (value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length) +} + +// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: +// https://github.com/feross/buffer/pull/148 +Buffer.prototype.__proto__ = Uint8Array.prototype +Buffer.__proto__ = Uint8Array + +function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be of type number') + } else if (size < 0) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } +} + +function alloc (size, fill, encoding) { + assertSize(size) + if (size <= 0) { + return createBuffer(size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(size).fill(fill, encoding) + : createBuffer(size).fill(fill) + } + return createBuffer(size) +} + +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ +Buffer.alloc = function (size, fill, encoding) { + return alloc(size, fill, encoding) +} + +function allocUnsafe (size) { + assertSize(size) + return createBuffer(size < 0 ? 0 : checked(size) | 0) +} + +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ +Buffer.allocUnsafe = function (size) { + return allocUnsafe(size) +} +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(size) +} + +function fromString (string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + + var length = byteLength(string, encoding) | 0 + var buf = createBuffer(length) + + var actual = buf.write(string, encoding) + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + buf = buf.slice(0, actual) + } + + return buf +} + +function fromArrayLike (array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0 + var buf = createBuffer(length) + for (var i = 0; i < length; i += 1) { + buf[i] = array[i] & 255 + } + return buf +} + +function fromArrayBuffer (array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds') + } + + var buf + if (byteOffset === undefined && length === undefined) { + buf = new Uint8Array(array) + } else if (length === undefined) { + buf = new Uint8Array(array, byteOffset) + } else { + buf = new Uint8Array(array, byteOffset, length) + } + + // Return an augmented `Uint8Array` instance + buf.__proto__ = Buffer.prototype + return buf +} + +function fromObject (obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0 + var buf = createBuffer(len) + + if (buf.length === 0) { + return buf + } + + obj.copy(buf, 0, 0, len) + return buf + } + + if (obj.length !== undefined) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0) + } + return fromArrayLike(obj) + } + + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data) + } +} + +function checked (length) { + // Note: cannot use `length < K_MAX_LENGTH` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= K_MAX_LENGTH) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (length) { + if (+length != length) { // eslint-disable-line eqeqeq + length = 0 + } + return Buffer.alloc(+length) +} + +Buffer.isBuffer = function isBuffer (b) { + return b != null && b._isBuffer === true && + b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false +} + +Buffer.compare = function compare (a, b) { + if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) + if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ) + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i] + y = b[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer.alloc(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; ++i) { + length += list[i].length + } + } + + var buffer = Buffer.allocUnsafe(length) + var pos = 0 + for (i = 0; i < list.length; ++i) { + var buf = list[i] + if (isInstance(buf, Uint8Array)) { + buf = Buffer.from(buf) + } + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos) + pos += buf.length + } + return buffer +} + +function byteLength (string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length + } + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + + 'Received type ' + typeof string + ) + } + + var len = string.length + var mustMatch = (arguments.length > 2 && arguments[2] === true) + if (!mustMatch && len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 + } + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +function slowToString (encoding, start, end) { + var loweredCase = false + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0 + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0 + start >>>= 0 + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) +// to detect a Buffer instance. It's not possible to use `instanceof Buffer` +// reliably in a browserify context because there could be multiple different +// copies of the 'buffer' package in use. This method works even for Buffer +// instances that were created from another copy of the `buffer` package. +// See: https://github.com/feross/buffer/issues/154 +Buffer.prototype._isBuffer = true + +function swap (b, n, m) { + var i = b[n] + b[n] = b[m] + b[m] = i +} + +Buffer.prototype.swap16 = function swap16 () { + var len = this.length + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1) + } + return this +} + +Buffer.prototype.swap32 = function swap32 () { + var len = this.length + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3) + swap(this, i + 1, i + 2) + } + return this +} + +Buffer.prototype.swap64 = function swap64 () { + var len = this.length + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7) + swap(this, i + 1, i + 6) + swap(this, i + 2, i + 5) + swap(this, i + 3, i + 4) + } + return this +} + +Buffer.prototype.toString = function toString () { + var length = this.length + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.toLocaleString = Buffer.prototype.toString + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() + if (this.length > max) str += ' ... ' + return '' +} + +Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength) + } + if (!Buffer.isBuffer(target)) { + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. ' + + 'Received type ' + (typeof target) + ) + } + + if (start === undefined) { + start = 0 + } + if (end === undefined) { + end = target ? target.length : 0 + } + if (thisStart === undefined) { + thisStart = 0 + } + if (thisEnd === undefined) { + thisEnd = this.length + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0 + end >>>= 0 + thisStart >>>= 0 + thisEnd >>>= 0 + + if (this === target) return 0 + + var x = thisEnd - thisStart + var y = end - start + var len = Math.min(x, y) + + var thisCopy = this.slice(thisStart, thisEnd) + var targetCopy = target.slice(start, end) + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i] + y = targetCopy[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } + byteOffset = +byteOffset // Coerce to Number. + if (numberIsNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1) + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1 + } else if (byteOffset < 0) { + if (dir) byteOffset = 0 + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding) + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF // Search for a byte value [0-255] + if (typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') +} + +function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1 + var arrLength = arr.length + var valLength = val.length + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase() + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2 + arrLength /= 2 + valLength /= 2 + byteOffset /= 2 + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i + if (dir) { + var foundIndex = -1 + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength + for (i = byteOffset; i >= 0; i--) { + var found = true + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false + break + } + } + if (found) return i + } + } + + return -1 +} + +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) +} + +Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + var strLen = string.length + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (numberIsNaN(parsed)) return i + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset >>> 0 + if (isFinite(length)) { + length = length >>> 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function latin1Slice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; ++i) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf = this.subarray(start, end) + // Return an augmented `Uint8Array` instance + newBuf.__proto__ = Buffer.prototype + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('Index out of range') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + + if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { + // Use built-in when available, missing from IE11 + this.copyWithin(targetStart, start, end) + } else if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (var i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start] + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, end), + targetStart + ) + } + + return len +} + +// Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) +Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start + start = 0 + end = this.length + } else if (typeof end === 'string') { + encoding = end + end = this.length + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + if (val.length === 1) { + var code = val.charCodeAt(0) + if ((encoding === 'utf8' && code < 128) || + encoding === 'latin1') { + // Fast path: If `val` fits into a single byte, use that numeric value. + val = code + } + } + } else if (typeof val === 'number') { + val = val & 255 + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0 + end = end === undefined ? this.length : end >>> 0 + + if (!val) val = 0 + + var i + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val + } + } else { + var bytes = Buffer.isBuffer(val) + ? val + : Buffer.from(val, encoding) + var len = bytes.length + if (len === 0) { + throw new TypeError('The value "' + val + + '" is invalid for argument "value"') + } + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len] + } + } + + return this +} + +// HELPER FUNCTIONS +// ================ + +var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node takes equal signs as end of the Base64 encoding + str = str.split('=')[0] + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = str.trim().replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass +// the `instanceof` check but they should be treated as of that type. +// See: https://github.com/feross/buffer/issues/166 +function isInstance (obj, type) { + return obj instanceof type || + (obj != null && obj.constructor != null && obj.constructor.name != null && + obj.constructor.name === type.name) +} +function numberIsNaN (obj) { + // For IE11 support + return obj !== obj // eslint-disable-line no-self-compare +} + +}).call(this)}).call(this,require("buffer").Buffer) +},{"base64-js":4,"buffer":6,"ieee754":8}],7:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +'use strict'; + +var R = typeof Reflect === 'object' ? Reflect : null +var ReflectApply = R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + } + +var ReflectOwnKeys +if (R && typeof R.ownKeys === 'function') { + ReflectOwnKeys = R.ownKeys +} else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target) + .concat(Object.getOwnPropertySymbols(target)); + }; +} else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; +} + +function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); +} + +var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { + return value !== value; +} + +function EventEmitter() { + EventEmitter.init.call(this); +} +module.exports = EventEmitter; +module.exports.once = once; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._eventsCount = 0; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +function checkListener(listener) { + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } +} + +Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); + } + defaultMaxListeners = arg; + } +}); + +EventEmitter.init = function() { + + if (this._events === undefined || + this._events === Object.getPrototypeOf(this)._events) { + this._events = Object.create(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +}; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); + } + this._maxListeners = n; + return this; +}; + +function _getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); +}; + +EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = (type === 'error'); + + var events = this._events; + if (events !== undefined) + doError = (doError && events.error === undefined); + else if (!doError) + return false; + + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) + er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); + err.context = er; + throw err; // Unhandled 'error' event + } + + var handler = events[type]; + + if (handler === undefined) + return false; + + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + ReflectApply(listeners[i], this, args); + } + + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + checkListener(listener); + + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' ' + String(type) + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) + return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } +} + +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + checkListener(listener); + + events = this._events; + if (events === undefined) + return this; + + list = events[type]; + if (list === undefined) + return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (position === 0) + list.shift(); + else { + spliceOne(list, position); + } + + if (list.length === 1) + events[type] = list[0]; + + if (events.removeListener !== undefined) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (events === undefined) + return this; + + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) + this._events = Object.create(null); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + +function _listeners(target, type, unwrap) { + var events = target._events; + + if (events === undefined) + return []; + + var evlistener = events[type]; + if (evlistener === undefined) + return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? + unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} + +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; + +EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + + if (events !== undefined) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; +}; + +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; +} + +function spliceOne(list, index) { + for (; index + 1 < list.length; index++) + list[index] = list[index + 1]; + list.pop(); +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} + +function once(emitter, name) { + return new Promise(function (resolve, reject) { + function eventListener() { + if (errorListener !== undefined) { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + }; + var errorListener; + + // Adding an error listener is not optional because + // if an error is thrown on an event emitter we cannot + // guarantee that the actual event we are waiting will + // be fired. The result could be a silent way to create + // memory or file descriptor leaks, which is something + // we should avoid. + if (name !== 'error') { + errorListener = function errorListener(err) { + emitter.removeListener(name, eventListener); + reject(err); + }; + + emitter.once('error', errorListener); + } + + emitter.once(name, eventListener); + }); +} + +},{}],8:[function(require,module,exports){ +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = ((value * c) - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],9:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } +} + +},{}],10:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],11:[function(require,module,exports){ +/*! safe-buffer. MIT License. Feross Aboukhadijeh */ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.prototype = Object.create(Buffer.prototype) + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} + +},{"buffer":6}],12:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +module.exports = Stream; + +var EE = require('events').EventEmitter; +var inherits = require('inherits'); + +inherits(Stream, EE); +Stream.Readable = require('readable-stream/lib/_stream_readable.js'); +Stream.Writable = require('readable-stream/lib/_stream_writable.js'); +Stream.Duplex = require('readable-stream/lib/_stream_duplex.js'); +Stream.Transform = require('readable-stream/lib/_stream_transform.js'); +Stream.PassThrough = require('readable-stream/lib/_stream_passthrough.js'); +Stream.finished = require('readable-stream/lib/internal/streams/end-of-stream.js') +Stream.pipeline = require('readable-stream/lib/internal/streams/pipeline.js') + +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; + + + +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. + +function Stream() { + EE.call(this); +} + +Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +},{"events":7,"inherits":9,"readable-stream/lib/_stream_duplex.js":14,"readable-stream/lib/_stream_passthrough.js":15,"readable-stream/lib/_stream_readable.js":16,"readable-stream/lib/_stream_transform.js":17,"readable-stream/lib/_stream_writable.js":18,"readable-stream/lib/internal/streams/end-of-stream.js":22,"readable-stream/lib/internal/streams/pipeline.js":24}],13:[function(require,module,exports){ +'use strict'; + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var codes = {}; + +function createErrorType(code, message, Base) { + if (!Base) { + Base = Error; + } + + function getMessage(arg1, arg2, arg3) { + if (typeof message === 'string') { + return message; + } else { + return message(arg1, arg2, arg3); + } + } + + var NodeError = + /*#__PURE__*/ + function (_Base) { + _inheritsLoose(NodeError, _Base); + + function NodeError(arg1, arg2, arg3) { + return _Base.call(this, getMessage(arg1, arg2, arg3)) || this; + } + + return NodeError; + }(Base); + + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + codes[code] = NodeError; +} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js + + +function oneOf(expected, thing) { + if (Array.isArray(expected)) { + var len = expected.length; + expected = expected.map(function (i) { + return String(i); + }); + + if (len > 2) { + return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1]; + } else if (len === 2) { + return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); + } else { + return "of ".concat(thing, " ").concat(expected[0]); + } + } else { + return "of ".concat(thing, " ").concat(String(expected)); + } +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + + +function startsWith(str, search, pos) { + return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith + + +function endsWith(str, search, this_len) { + if (this_len === undefined || this_len > str.length) { + this_len = str.length; + } + + return str.substring(this_len - search.length, this_len) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes + + +function includes(str, search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } +} + +createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"'; +}, TypeError); +createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { + // determiner: 'must be' or 'must not be' + var determiner; + + if (typeof expected === 'string' && startsWith(expected, 'not ')) { + determiner = 'must not be'; + expected = expected.replace(/^not /, ''); + } else { + determiner = 'must be'; + } + + var msg; + + if (endsWith(name, ' argument')) { + // For cases like 'first argument' + msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } else { + var type = includes(name, '.') ? 'property' : 'argument'; + msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } + + msg += ". Received type ".concat(typeof actual); + return msg; +}, TypeError); +createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { + return 'The ' + name + ' method is not implemented'; +}); +createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); +createErrorType('ERR_STREAM_DESTROYED', function (name) { + return 'Cannot call ' + name + ' after a stream was destroyed'; +}); +createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); +createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); +createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); +createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); +createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { + return 'Unknown encoding: ' + arg; +}, TypeError); +createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); +module.exports.codes = codes; + +},{}],14:[function(require,module,exports){ +(function (process){(function (){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. +'use strict'; +/**/ + +var objectKeys = Object.keys || function (obj) { + var keys = []; + + for (var key in obj) { + keys.push(key); + } + + return keys; +}; +/**/ + + +module.exports = Duplex; + +var Readable = require('./_stream_readable'); + +var Writable = require('./_stream_writable'); + +require('inherits')(Duplex, Readable); + +{ + // Allow the keys array to be GC'ed. + var keys = objectKeys(Writable.prototype); + + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + Readable.call(this, options); + Writable.call(this, options); + this.allowHalfOpen = true; + + if (options) { + if (options.readable === false) this.readable = false; + if (options.writable === false) this.writable = false; + + if (options.allowHalfOpen === false) { + this.allowHalfOpen = false; + this.once('end', onend); + } + } +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); +Object.defineProperty(Duplex.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); +Object.defineProperty(Duplex.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); // the no-half-open enforcer + +function onend() { + // If the writable side ended, then we're ok. + if (this._writableState.ended) return; // no more data can be written. + // But allow more writes to happen in this tick. + + process.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); +}).call(this)}).call(this,require('_process')) +},{"./_stream_readable":16,"./_stream_writable":18,"_process":10,"inherits":9}],15:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +require('inherits')(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; +},{"./_stream_transform":17,"inherits":9}],16:[function(require,module,exports){ +(function (process,global){(function (){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. +'use strict'; + +module.exports = Readable; +/**/ + +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; +/**/ + +var EE = require('events').EventEmitter; + +var EElistenerCount = function EElistenerCount(emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ + + +var Stream = require('./internal/streams/stream'); +/**/ + + +var Buffer = require('buffer').Buffer; + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} +/**/ + + +var debugUtil = require('util'); + +var debug; + +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function debug() {}; +} +/**/ + + +var BufferList = require('./internal/streams/buffer_list'); + +var destroyImpl = require('./internal/streams/destroy'); + +var _require = require('./internal/streams/state'), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = require('../errors').codes, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. + + +var StringDecoder; +var createReadableStreamAsyncIterator; +var from; + +require('inherits')(Readable, Stream); + +var errorOrDestroy = destroyImpl.errorOrDestroy; +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream, isDuplex) { + Duplex = Duplex || require('./_stream_duplex'); + options = options || {}; // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + + this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + + this.sync = true; // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + this.paused = true; // Should close be emitted on destroy. Defaults to true. + + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') + + this.autoDestroy = !!options.autoDestroy; // has it been destroyed + + this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + + this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s + + this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled + + this.readingMore = false; + this.decoder = null; + this.encoding = null; + + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside + // the ReadableState constructor, at least with V8 6.5 + + var isDuplex = this instanceof Duplex; + this._readableState = new ReadableState(options, this, isDuplex); // legacy + + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined) { + return false; + } + + return this._readableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._readableState.destroyed = value; + } +}); +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; + +Readable.prototype._destroy = function (err, cb) { + cb(err); +}; // Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. + + +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; // Unshift should *always* be something directly out of read() + + +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + debug('readableAddChunk', chunk); + var state = stream._readableState; + + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + + if (er) { + errorOrDestroy(stream, er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); + } else if (state.ended) { + errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state.destroyed) { + return false; + } else { + state.reading = false; + + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + maybeReadMore(stream, state); + } + } // We can push more data if we are below the highWaterMark. + // Also, if we have no data yet, we can stand some more bytes. + // This is to work around cases where hwm=0, such as the repl. + + + return !state.ended && (state.length < state.highWaterMark || state.length === 0); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + state.awaitDrain = 0; + stream.emit('data', chunk); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + if (state.needReadable) emitReadable(stream); + } + + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); + } + + return er; +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; // backwards compatibility. + + +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + var decoder = new StringDecoder(enc); + this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 + + this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: + + var p = this._readableState.buffer.head; + var content = ''; + + while (p !== null) { + content += decoder.write(p.data); + p = p.next; + } + + this._readableState.buffer.clear(); + + if (content !== '') this._readableState.buffer.push(content); + this._readableState.length = content.length; + return this; +}; // Don't raise the hwm > 1GB + + +var MAX_HWM = 0x40000000; + +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + + return n; +} // This function is designed to be inlinable, so please take care when making +// changes to the function body. + + +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } // If we're asking for more than the current hwm, then raise the hwm. + + + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; // Don't have enough + + if (!state.ended) { + state.needReadable = true; + return 0; + } + + return state.length; +} // you can override either this method, or the async _read(n) below. + + +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + + if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. + + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + // if we need a readable event, then we need to do some reading. + + + var doRead = state.needReadable; + debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some + + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + + + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; // if the length is currently zero, then we *need* a readable event. + + if (state.length === 0) state.needReadable = true; // call internal read method + + this._read(state.highWaterMark); + + state.sync = false; // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = state.length <= state.highWaterMark; + n = 0; + } else { + state.length -= n; + state.awaitDrain = 0; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. + + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + return ret; +}; + +function onEofChunk(stream, state) { + debug('onEofChunk'); + if (state.ended) return; + + if (state.decoder) { + var chunk = state.decoder.end(); + + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + + state.ended = true; + + if (state.sync) { + // if we are sync, wait until next tick to emit the data. + // Otherwise we risk emitting data in the flow() + // the readable code triggers during a read() call + emitReadable(stream); + } else { + // emit 'readable' now to make sure it gets picked up. + state.needReadable = false; + + if (!state.emittedReadable) { + state.emittedReadable = true; + emitReadable_(stream); + } + } +} // Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. + + +function emitReadable(stream) { + var state = stream._readableState; + debug('emitReadable', state.needReadable, state.emittedReadable); + state.needReadable = false; + + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + process.nextTick(emitReadable_, stream); + } +} + +function emitReadable_(stream) { + var state = stream._readableState; + debug('emitReadable_', state.destroyed, state.length, state.ended); + + if (!state.destroyed && (state.length || state.ended)) { + stream.emit('readable'); + state.emittedReadable = false; + } // The stream needs another readable event if + // 1. It is not flowing, as the flow mechanism will take + // care of it. + // 2. It is not ended. + // 3. It is below the highWaterMark, so we can schedule + // another readable later. + + + state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; + flow(stream); +} // at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. + + +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + process.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + // Attempt to read more data if we should. + // + // The conditions for reading more data are (one of): + // - Not enough data buffered (state.length < state.highWaterMark). The loop + // is responsible for filling the buffer with enough data if such data + // is available. If highWaterMark is 0 and we are not in the flowing mode + // we should _not_ attempt to buffer any extra data. We'll get more data + // when the stream consumer calls read() instead. + // - No data in the buffer, and the stream is in flowing mode. In this mode + // the loop below is responsible for ensuring read() is called. Failing to + // call read here would abort the flow and there's no other mechanism for + // continuing the flow if the stream consumer has just subscribed to the + // 'data' event. + // + // In addition to the above conditions to keep reading data, the following + // conditions prevent the data from being read: + // - The stream has ended (state.ended). + // - There is already a pending 'read' operation (state.reading). This is a + // case where the the stream has called the implementation defined _read() + // method, but they are processing the call asynchronously and have _not_ + // called push() with new data. In this case we skip performing more + // read()s. The execution ends in this method again after the _read() ends + // up calling push() with more data. + while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) { + var len = state.length; + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) // didn't get any data, stop spinning. + break; + } + + state.readingMore = false; +} // abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. + + +Readable.prototype._read = function (n) { + errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + + case 1: + state.pipes = [state.pipes, dest]; + break; + + default: + state.pipes.push(dest); + break; + } + + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn); + dest.on('unpipe', onunpipe); + + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + + + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + var cleanedUp = false; + + function cleanup() { + debug('cleanup'); // cleanup event handlers once the pipe is broken + + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + cleanedUp = true; // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + src.on('data', ondata); + + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + debug('dest.write', ret); + + if (ret === false) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', state.awaitDrain); + state.awaitDrain++; + } + + src.pause(); + } + } // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + + + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er); + } // Make sure our error handler is attached before userland ones. + + + prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. + + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + + dest.once('close', onclose); + + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } // tell the dest that it's being piped to + + + dest.emit('pipe', src); // start the flow if it hasn't been started already. + + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function pipeOnDrainFunctionResult() { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { + hasUnpiped: false + }; // if we're not piping anywhere, then do nothing. + + if (state.pipesCount === 0) return this; // just one destination. most common case. + + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + if (!dest) dest = state.pipes; // got a match. + + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } // slow case. multiple pipe destinations. + + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, { + hasUnpiped: false + }); + } + + return this; + } // try to find the right one. + + + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + dest.emit('unpipe', this, unpipeInfo); + return this; +}; // set up data events if they are asked for +// Ensure readable listeners eventually get something + + +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + var state = this._readableState; + + if (ev === 'data') { + // update readableListening so that resume() may be a no-op + // a few lines down. This is needed to support once('readable'). + state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused + + if (state.flowing !== false) this.resume(); + } else if (ev === 'readable') { + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.flowing = false; + state.emittedReadable = false; + debug('on readable', state.length, state.reading); + + if (state.length) { + emitReadable(this); + } else if (!state.reading) { + process.nextTick(nReadingNextTick, this); + } + } + } + + return res; +}; + +Readable.prototype.addListener = Readable.prototype.on; + +Readable.prototype.removeListener = function (ev, fn) { + var res = Stream.prototype.removeListener.call(this, ev, fn); + + if (ev === 'readable') { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +Readable.prototype.removeAllListeners = function (ev) { + var res = Stream.prototype.removeAllListeners.apply(this, arguments); + + if (ev === 'readable' || ev === undefined) { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +function updateReadableListening(self) { + var state = self._readableState; + state.readableListening = self.listenerCount('readable') > 0; + + if (state.resumeScheduled && !state.paused) { + // flowing needs to be set to true now, otherwise + // the upcoming resume will not flow. + state.flowing = true; // crude way to check if we should resume + } else if (self.listenerCount('data') > 0) { + self.resume(); + } +} + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} // pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. + + +Readable.prototype.resume = function () { + var state = this._readableState; + + if (!state.flowing) { + debug('resume'); // we flow only if there is no one listening + // for readable, but we still have to call + // resume() + + state.flowing = !state.readableListening; + resume(this, state); + } + + state.paused = false; + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + process.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + debug('resume', state.reading); + + if (!state.reading) { + stream.read(0); + } + + state.resumeScheduled = false; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + + if (this._readableState.flowing !== false) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + + this._readableState.paused = true; + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + + while (state.flowing && stream.read() !== null) { + ; + } +} // wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. + + +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + stream.on('end', function () { + debug('wrapped end'); + + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode + + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + + if (!ret) { + paused = true; + stream.pause(); + } + }); // proxy all the other methods. + // important when wrapping filters and duplexes. + + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function methodWrap(method) { + return function methodWrapReturnFunction() { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } // proxy certain important events. + + + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } // when we try to consume some more bytes, simply unpause the + // underlying stream. + + + this._read = function (n) { + debug('wrapped _read', n); + + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +if (typeof Symbol === 'function') { + Readable.prototype[Symbol.asyncIterator] = function () { + if (createReadableStreamAsyncIterator === undefined) { + createReadableStreamAsyncIterator = require('./internal/streams/async_iterator'); + } + + return createReadableStreamAsyncIterator(this); + }; +} + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.highWaterMark; + } +}); +Object.defineProperty(Readable.prototype, 'readableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState && this._readableState.buffer; + } +}); +Object.defineProperty(Readable.prototype, 'readableFlowing', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.flowing; + }, + set: function set(state) { + if (this._readableState) { + this._readableState.flowing = state; + } + } +}); // exposed for testing purposes only. + +Readable._fromList = fromList; +Object.defineProperty(Readable.prototype, 'readableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.length; + } +}); // Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. + +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = state.buffer.consume(n, state.decoder); + } + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + debug('endReadable', state.endEmitted); + + if (!state.endEmitted) { + state.ended = true; + process.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift. + + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the writable side is ready for autoDestroy as well + var wState = stream._writableState; + + if (!wState || wState.autoDestroy && wState.finished) { + stream.destroy(); + } + } + } +} + +if (typeof Symbol === 'function') { + Readable.from = function (iterable, opts) { + if (from === undefined) { + from = require('./internal/streams/from'); + } + + return from(Readable, iterable, opts); + }; +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + + return -1; +} +}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../errors":13,"./_stream_duplex":14,"./internal/streams/async_iterator":19,"./internal/streams/buffer_list":20,"./internal/streams/destroy":21,"./internal/streams/from":23,"./internal/streams/state":25,"./internal/streams/stream":26,"_process":10,"buffer":6,"events":7,"inherits":9,"string_decoder/":27,"util":5}],17:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. +'use strict'; + +module.exports = Transform; + +var _require$codes = require('../errors').codes, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, + ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; + +var Duplex = require('./_stream_duplex'); + +require('inherits')(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + var cb = ts.writecb; + + if (cb === null) { + return this.emit('error', new ERR_MULTIPLE_CALLBACK()); + } + + ts.writechunk = null; + ts.writecb = null; + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + cb(er); + var rs = this._readableState; + rs.reading = false; + + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + Duplex.call(this, options); + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; // start out asking for a readable event once data is transformed. + + this._readableState.needReadable = true; // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + if (typeof options.flush === 'function') this._flush = options.flush; + } // When the writable side finishes, then flush out anything remaining. + + + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function' && !this._readableState.destroyed) { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; // This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. + + +Transform.prototype._transform = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; // Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. + + +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && !ts.transforming) { + ts.transforming = true; + + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); // TODO(BridgeAR): Write a test for these two error cases + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + + if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); + if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); + return stream.push(null); +} +},{"../errors":13,"./_stream_duplex":14,"inherits":9}],18:[function(require,module,exports){ +(function (process,global){(function (){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. +'use strict'; + +module.exports = Writable; +/* */ + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} // It seems a linked list but it is not +// there will be only 2 of these for each stream + + +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ + + +var Duplex; +/**/ + +Writable.WritableState = WritableState; +/**/ + +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ + +var Stream = require('./internal/streams/stream'); +/**/ + + +var Buffer = require('buffer').Buffer; + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +var destroyImpl = require('./internal/streams/destroy'); + +var _require = require('./internal/streams/state'), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = require('../errors').codes, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, + ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; + +var errorOrDestroy = destroyImpl.errorOrDestroy; + +require('inherits')(Writable, Stream); + +function nop() {} + +function WritableState(options, stream, isDuplex) { + Duplex = Duplex || require('./_stream_duplex'); + options = options || {}; // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream, + // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. + + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream + // contains buffers or objects. + + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + + this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called + + this.finalCalled = false; // drain event flag. + + this.needDrain = false; // at the start of calling end() + + this.ending = false; // when end() has been called, and returned + + this.ended = false; // when 'finish' is emitted + + this.finished = false; // has it been destroyed + + this.destroyed = false; // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + + this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + + this.length = 0; // a flag to see when we're in the middle of a write. + + this.writing = false; // when true all writes will be buffered until .uncork() call + + this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + + this.sync = true; // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + + this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) + + this.onwrite = function (er) { + onwrite(stream, er); + }; // the callback that the user supplies to write(chunk,encoding,cb) + + + this.writecb = null; // the amount that is being written when _write is called. + + this.writelen = 0; + this.bufferedRequest = null; + this.lastBufferedRequest = null; // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + + this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + + this.prefinished = false; // True if the error was already emitted and should not be thrown again + + this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. + + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') + + this.autoDestroy = !!options.autoDestroy; // count buffered requests + + this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + + while (current) { + out.push(current); + current = current.next; + } + + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function writableStateBufferGetter() { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); // Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. + + +var realHasInstance; + +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function value(object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function realHasInstance(object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + // Checking for a Stream.Duplex instance is faster here instead of inside + // the WritableState constructor, at least with V8 6.5 + + var isDuplex = this instanceof Duplex; + if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); + this._writableState = new WritableState(options, this, isDuplex); // legacy. + + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + if (typeof options.writev === 'function') this._writev = options.writev; + if (typeof options.destroy === 'function') this._destroy = options.destroy; + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} // Otherwise people can pipe Writable streams, which is just wrong. + + +Writable.prototype.pipe = function () { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); +}; + +function writeAfterEnd(stream, cb) { + var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb + + errorOrDestroy(stream, er); + process.nextTick(cb, er); +} // Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. + + +function validChunk(stream, state, chunk, cb) { + var er; + + if (chunk === null) { + er = new ERR_STREAM_NULL_VALUES(); + } else if (typeof chunk !== 'string' && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); + } + + if (er) { + errorOrDestroy(stream, er); + process.nextTick(cb, er); + return false; + } + + return true; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + if (typeof cb !== 'function') cb = nop; + if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + return ret; +}; + +Writable.prototype.cork = function () { + this._writableState.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); // if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. + +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + + var len = state.objectMode ? 1 : chunk.length; + state.length += len; + var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. + + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + process.nextTick(cb, er); // this can emit finish, and it will always happen + // after error + + process.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); // this can emit finish, but finish must + // always follow error + + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK(); + onwriteStateUpdate(state); + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state) || stream.destroyed; + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + process.nextTick(afterWrite, stream, state, finished, cb); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} // Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. + + +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} // if there's something in the buffer waiting, then process it + + +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + var count = 0; + var allBuffers = true; + + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + + buffer.allBuffers = allBuffers; + doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + + state.pendingcb++; + state.lastBufferedRequest = null; + + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks + + if (state.corked) { + state.corked = 1; + this.uncork(); + } // ignore unnecessary end() calls. + + + if (!state.ending) endWritable(this, state, cb); + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} + +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + + if (err) { + errorOrDestroy(stream, err); + } + + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} + +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function' && !state.destroyed) { + state.pendingcb++; + state.finalCalled = true; + process.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + + if (need) { + prefinish(stream, state); + + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the readable side is ready for autoDestroy as well + var rState = stream._readableState; + + if (!rState || rState.autoDestroy && rState.endEmitted) { + stream.destroy(); + } + } + } + } + + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + + if (cb) { + if (state.finished) process.nextTick(cb);else stream.once('finish', cb); + } + + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } // reuse the free corkReq. + + + state.corkedRequestsFree.next = corkReq; +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._writableState === undefined) { + return false; + } + + return this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._writableState.destroyed = value; + } +}); +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; + +Writable.prototype._destroy = function (err, cb) { + cb(err); +}; +}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../errors":13,"./_stream_duplex":14,"./internal/streams/destroy":21,"./internal/streams/state":25,"./internal/streams/stream":26,"_process":10,"buffer":6,"inherits":9,"util-deprecate":29}],19:[function(require,module,exports){ +(function (process){(function (){ +'use strict'; + +var _Object$setPrototypeO; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var finished = require('./end-of-stream'); + +var kLastResolve = Symbol('lastResolve'); +var kLastReject = Symbol('lastReject'); +var kError = Symbol('error'); +var kEnded = Symbol('ended'); +var kLastPromise = Symbol('lastPromise'); +var kHandlePromise = Symbol('handlePromise'); +var kStream = Symbol('stream'); + +function createIterResult(value, done) { + return { + value: value, + done: done + }; +} + +function readAndResolve(iter) { + var resolve = iter[kLastResolve]; + + if (resolve !== null) { + var data = iter[kStream].read(); // we defer if data is null + // we can be expecting either 'end' or + // 'error' + + if (data !== null) { + iter[kLastPromise] = null; + iter[kLastResolve] = null; + iter[kLastReject] = null; + resolve(createIterResult(data, false)); + } + } +} + +function onReadable(iter) { + // we wait for the next tick, because it might + // emit an error with process.nextTick + process.nextTick(readAndResolve, iter); +} + +function wrapForNext(lastPromise, iter) { + return function (resolve, reject) { + lastPromise.then(function () { + if (iter[kEnded]) { + resolve(createIterResult(undefined, true)); + return; + } + + iter[kHandlePromise](resolve, reject); + }, reject); + }; +} + +var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); +var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { + get stream() { + return this[kStream]; + }, + + next: function next() { + var _this = this; + + // if we have detected an error in the meanwhile + // reject straight away + var error = this[kError]; + + if (error !== null) { + return Promise.reject(error); + } + + if (this[kEnded]) { + return Promise.resolve(createIterResult(undefined, true)); + } + + if (this[kStream].destroyed) { + // We need to defer via nextTick because if .destroy(err) is + // called, the error will be emitted via nextTick, and + // we cannot guarantee that there is no error lingering around + // waiting to be emitted. + return new Promise(function (resolve, reject) { + process.nextTick(function () { + if (_this[kError]) { + reject(_this[kError]); + } else { + resolve(createIterResult(undefined, true)); + } + }); + }); + } // if we have multiple next() calls + // we will wait for the previous Promise to finish + // this logic is optimized to support for await loops, + // where next() is only called once at a time + + + var lastPromise = this[kLastPromise]; + var promise; + + if (lastPromise) { + promise = new Promise(wrapForNext(lastPromise, this)); + } else { + // fast path needed to support multiple this.push() + // without triggering the next() queue + var data = this[kStream].read(); + + if (data !== null) { + return Promise.resolve(createIterResult(data, false)); + } + + promise = new Promise(this[kHandlePromise]); + } + + this[kLastPromise] = promise; + return promise; + } +}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { + return this; +}), _defineProperty(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + + // destroy(err, cb) is a private API + // we can guarantee we have that here, because we control the + // Readable class this is attached to + return new Promise(function (resolve, reject) { + _this2[kStream].destroy(null, function (err) { + if (err) { + reject(err); + return; + } + + resolve(createIterResult(undefined, true)); + }); + }); +}), _Object$setPrototypeO), AsyncIteratorPrototype); + +var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { + var _Object$create; + + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { + value: stream, + writable: true + }), _defineProperty(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty(_Object$create, kEnded, { + value: stream._readableState.endEmitted, + writable: true + }), _defineProperty(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data = iterator[kStream].read(); + + if (data) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); + iterator[kLastPromise] = null; + finished(stream, function (err) { + if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { + var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise + // returned by next() and store the error + + if (reject !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + reject(err); + } + + iterator[kError] = err; + return; + } + + var resolve = iterator[kLastResolve]; + + if (resolve !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(undefined, true)); + } + + iterator[kEnded] = true; + }); + stream.on('readable', onReadable.bind(null, iterator)); + return iterator; +}; + +module.exports = createReadableStreamAsyncIterator; +}).call(this)}).call(this,require('_process')) +},{"./end-of-stream":22,"_process":10}],20:[function(require,module,exports){ +'use strict'; + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var _require = require('buffer'), + Buffer = _require.Buffer; + +var _require2 = require('util'), + inspect = _require2.inspect; + +var custom = inspect && inspect.custom || 'inspect'; + +function copyBuffer(src, target, offset) { + Buffer.prototype.copy.call(src, target, offset); +} + +module.exports = +/*#__PURE__*/ +function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + _createClass(BufferList, [{ + key: "push", + value: function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + } + }, { + key: "unshift", + value: function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + }, { + key: "shift", + value: function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + } + }, { + key: "clear", + value: function clear() { + this.head = this.tail = null; + this.length = 0; + } + }, { + key: "join", + value: function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + + while (p = p.next) { + ret += s + p.data; + } + + return ret; + } + }, { + key: "concat", + value: function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + + return ret; + } // Consumes a specified amount of bytes or characters from the buffered data. + + }, { + key: "consume", + value: function consume(n, hasStrings) { + var ret; + + if (n < this.head.data.length) { + // `slice` is the same for buffers and strings. + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + // First chunk is a perfect match. + ret = this.shift(); + } else { + // Result spans more than one buffer. + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + + return ret; + } + }, { + key: "first", + value: function first() { + return this.head.data; + } // Consumes a specified amount of characters from the buffered data. + + }, { + key: "_getString", + value: function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Consumes a specified amount of bytes from the buffered data. + + }, { + key: "_getBuffer", + value: function _getBuffer(n) { + var ret = Buffer.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Make sure the linked list only shows the minimal necessary information. + + }, { + key: custom, + value: function value(_, options) { + return inspect(this, _objectSpread({}, options, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + } + }]); + + return BufferList; +}(); +},{"buffer":6,"util":5}],21:[function(require,module,exports){ +(function (process){(function (){ +'use strict'; // undocumented cb() API, needed for core, not for public API + +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err) { + if (!this._writableState) { + process.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + process.nextTick(emitErrorNT, this, err); + } + } + + return this; + } // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + + if (this._readableState) { + this._readableState.destroyed = true; + } // if this is a duplex stream mark the writable part as destroyed as well + + + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + if (!_this._writableState) { + process.nextTick(emitErrorAndCloseNT, _this, err); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + process.nextTick(emitErrorAndCloseNT, _this, err); + } else { + process.nextTick(emitCloseNT, _this); + } + } else if (cb) { + process.nextTick(emitCloseNT, _this); + cb(err); + } else { + process.nextTick(emitCloseNT, _this); + } + }); + + return this; +} + +function emitErrorAndCloseNT(self, err) { + emitErrorNT(self, err); + emitCloseNT(self); +} + +function emitCloseNT(self) { + if (self._writableState && !self._writableState.emitClose) return; + if (self._readableState && !self._readableState.emitClose) return; + self.emit('close'); +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +function errorOrDestroy(stream, err) { + // We have tests that rely on errors being emitted + // in the same tick, so changing this is semver major. + // For now when you opt-in to autoDestroy we allow + // the error to be emitted nextTick. In a future + // semver major update we should change the default to this. + var rState = stream._readableState; + var wState = stream._writableState; + if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy, + errorOrDestroy: errorOrDestroy +}; +}).call(this)}).call(this,require('_process')) +},{"_process":10}],22:[function(require,module,exports){ +// Ported from https://github.com/mafintosh/end-of-stream with +// permission from the author, Mathias Buus (@mafintosh). +'use strict'; + +var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + callback.apply(this, args); + }; +} + +function noop() {} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function eos(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; + callback = once(callback || noop); + var readable = opts.readable || opts.readable !== false && stream.readable; + var writable = opts.writable || opts.writable !== false && stream.writable; + + var onlegacyfinish = function onlegacyfinish() { + if (!stream.writable) onfinish(); + }; + + var writableEnded = stream._writableState && stream._writableState.finished; + + var onfinish = function onfinish() { + writable = false; + writableEnded = true; + if (!readable) callback.call(stream); + }; + + var readableEnded = stream._readableState && stream._readableState.endEmitted; + + var onend = function onend() { + readable = false; + readableEnded = true; + if (!writable) callback.call(stream); + }; + + var onerror = function onerror(err) { + callback.call(stream, err); + }; + + var onclose = function onclose() { + var err; + + if (readable && !readableEnded) { + if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + + if (writable && !writableEnded) { + if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + }; + + var onrequest = function onrequest() { + stream.req.on('finish', onfinish); + }; + + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest();else stream.on('request', onrequest); + } else if (writable && !stream._writableState) { + // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); + } + + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); + return function () { + stream.removeListener('complete', onfinish); + stream.removeListener('abort', onclose); + stream.removeListener('request', onrequest); + if (stream.req) stream.req.removeListener('finish', onfinish); + stream.removeListener('end', onlegacyfinish); + stream.removeListener('close', onlegacyfinish); + stream.removeListener('finish', onfinish); + stream.removeListener('end', onend); + stream.removeListener('error', onerror); + stream.removeListener('close', onclose); + }; +} + +module.exports = eos; +},{"../../../errors":13}],23:[function(require,module,exports){ +module.exports = function () { + throw new Error('Readable.from is not available in the browser') +}; + +},{}],24:[function(require,module,exports){ +// Ported from https://github.com/mafintosh/pump with +// permission from the author, Mathias Buus (@mafintosh). +'use strict'; + +var eos; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + callback.apply(void 0, arguments); + }; +} + +var _require$codes = require('../../../errors').codes, + ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; + +function noop(err) { + // Rethrow the error if it exists to avoid swallowing it + if (err) throw err; +} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function destroyer(stream, reading, writing, callback) { + callback = once(callback); + var closed = false; + stream.on('close', function () { + closed = true; + }); + if (eos === undefined) eos = require('./end-of-stream'); + eos(stream, { + readable: reading, + writable: writing + }, function (err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function (err) { + if (closed) return; + if (destroyed) return; + destroyed = true; // request.destroy just do .end - .abort is what we want + + if (isRequest(stream)) return stream.abort(); + if (typeof stream.destroy === 'function') return stream.destroy(); + callback(err || new ERR_STREAM_DESTROYED('pipe')); + }; +} + +function call(fn) { + fn(); +} + +function pipe(from, to) { + return from.pipe(to); +} + +function popCallback(streams) { + if (!streams.length) return noop; + if (typeof streams[streams.length - 1] !== 'function') return noop; + return streams.pop(); +} + +function pipeline() { + for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { + streams[_key] = arguments[_key]; + } + + var callback = popCallback(streams); + if (Array.isArray(streams[0])) streams = streams[0]; + + if (streams.length < 2) { + throw new ERR_MISSING_ARGS('streams'); + } + + var error; + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error); + }); + }); + return streams.reduce(pipe); +} + +module.exports = pipeline; +},{"../../../errors":13,"./end-of-stream":22}],25:[function(require,module,exports){ +'use strict'; + +var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE; + +function highWaterMarkFrom(options, isDuplex, duplexKey) { + return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; +} + +function getHighWaterMark(state, options, duplexKey, isDuplex) { + var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); + + if (hwm != null) { + if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { + var name = isDuplex ? duplexKey : 'highWaterMark'; + throw new ERR_INVALID_OPT_VALUE(name, hwm); + } + + return Math.floor(hwm); + } // Default value + + + return state.objectMode ? 16 : 16 * 1024; +} + +module.exports = { + getHighWaterMark: getHighWaterMark +}; +},{"../../../errors":13}],26:[function(require,module,exports){ +module.exports = require('events').EventEmitter; + +},{"events":7}],27:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} +},{"safe-buffer":11}],28:[function(require,module,exports){ +(function (setImmediate,clearImmediate){(function (){ +var nextTick = require('process/browser.js').nextTick; +var apply = Function.prototype.apply; +var slice = Array.prototype.slice; +var immediateIds = {}; +var nextImmediateId = 0; + +// DOM APIs, for completeness + +exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); +}; +exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); +}; +exports.clearTimeout = +exports.clearInterval = function(timeout) { timeout.close(); }; + +function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; +} +Timeout.prototype.unref = Timeout.prototype.ref = function() {}; +Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); +}; + +// Does not start the time, just sets up the members needed. +exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; +}; + +exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; +}; + +exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } +}; + +// That's not how node.js implements it but the exposed api is the same. +exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; +}; + +exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; +}; +}).call(this)}).call(this,require("timers").setImmediate,require("timers").clearImmediate) +},{"process/browser.js":10,"timers":28}],29:[function(require,module,exports){ +(function (global){(function (){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[3])(3) +}); diff --git a/node_modules/csv-parse/lib/es5/ResizeableBuffer.js b/node_modules/csv-parse/lib/es5/ResizeableBuffer.js new file mode 100644 index 00000000..8df1db33 --- /dev/null +++ b/node_modules/csv-parse/lib/es5/ResizeableBuffer.js @@ -0,0 +1,102 @@ +"use strict"; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var ResizeableBuffer = /*#__PURE__*/function () { + function ResizeableBuffer() { + var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100; + + _classCallCheck(this, ResizeableBuffer); + + this.size = size; + this.length = 0; + this.buf = Buffer.alloc(size); + } + + _createClass(ResizeableBuffer, [{ + key: "prepend", + value: function prepend(val) { + if (Buffer.isBuffer(val)) { + var length = this.length + val.length; + + if (length >= this.size) { + this.resize(); + + if (length >= this.size) { + throw Error('INVALID_BUFFER_STATE'); + } + } + + var buf = this.buf; + this.buf = Buffer.alloc(this.size); + val.copy(this.buf, 0); + buf.copy(this.buf, val.length); + this.length += val.length; + } else { + var _length = this.length++; + + if (_length === this.size) { + this.resize(); + } + + var _buf = this.clone(); + + this.buf[0] = val; + + _buf.copy(this.buf, 1, 0, _length); + } + } + }, { + key: "append", + value: function append(val) { + var length = this.length++; + + if (length === this.size) { + this.resize(); + } + + this.buf[length] = val; + } + }, { + key: "clone", + value: function clone() { + return Buffer.from(this.buf.slice(0, this.length)); + } + }, { + key: "resize", + value: function resize() { + var length = this.length; + this.size = this.size * 2; + var buf = Buffer.alloc(this.size); + this.buf.copy(buf, 0, 0, length); + this.buf = buf; + } + }, { + key: "toString", + value: function toString(encoding) { + if (encoding) { + return this.buf.slice(0, this.length).toString(encoding); + } else { + return Uint8Array.prototype.slice.call(this.buf.slice(0, this.length)); + } + } + }, { + key: "toJSON", + value: function toJSON() { + return this.toString('utf8'); + } + }, { + key: "reset", + value: function reset() { + this.length = 0; + } + }]); + + return ResizeableBuffer; +}(); + +module.exports = ResizeableBuffer; \ No newline at end of file diff --git a/node_modules/csv-parse/lib/es5/index.d.ts b/node_modules/csv-parse/lib/es5/index.d.ts new file mode 100644 index 00000000..5a3d19fb --- /dev/null +++ b/node_modules/csv-parse/lib/es5/index.d.ts @@ -0,0 +1,264 @@ +// Original definitions in https://github.com/DefinitelyTyped/DefinitelyTyped by: David Muller + +/// + +import * as stream from "stream"; + +export = parse; + +declare function parse(input: Buffer | string, options?: parse.Options, callback?: parse.Callback): parse.Parser; +declare function parse(input: Buffer | string, callback?: parse.Callback): parse.Parser; +declare function parse(options?: parse.Options, callback?: parse.Callback): parse.Parser; +declare function parse(callback?: parse.Callback): parse.Parser; +declare namespace parse { + + type Callback = (err: Error | undefined, records: any | undefined, info: Info) => void; + + interface Parser extends stream.Transform {} + + class Parser { + constructor(options: Options); + + __push(line: any): any; + + __write(chars: any, end: any, callback: any): any; + + readonly options: Options + + readonly info: Info; + } + + interface CastingContext { + readonly column: number | string; + readonly empty_lines: number; + readonly error: CsvError; + readonly header: boolean; + readonly index: number; + readonly quoting: boolean; + readonly lines: number; + readonly records: number; + readonly invalid_field_length: number; + } + + type CastingFunction = (value: string, context: CastingContext) => any; + + type CastingDateFunction = (value: string, context: CastingContext) => Date; + + type ColumnOption = string | undefined | null | false | { name: string }; + + interface Options { + /** + * If true, the parser will attempt to convert read data types to native types. + * @deprecated Use {@link cast} + */ + auto_parse?: boolean | CastingFunction; + autoParse?: boolean | CastingFunction; + /** + * If true, the parser will attempt to convert read data types to dates. It requires the "auto_parse" option. + * @deprecated Use {@link cast_date} + */ + auto_parse_date?: boolean | CastingDateFunction; + autoParseDate?: boolean | CastingDateFunction; + /** + * If true, detect and exclude the byte order mark (BOM) from the CSV input if present. + */ + bom?: boolean; + /** + * If true, the parser will attempt to convert input string to native types. + * If a function, receive the value as first argument, a context as second argument and return a new value. More information about the context properties is available below. + */ + cast?: boolean | CastingFunction; + /** + * If true, the parser will attempt to convert input string to dates. + * If a function, receive the value as argument and return a new value. It requires the "auto_parse" option. Be careful, it relies on Date.parse. + */ + cast_date?: boolean | CastingDateFunction; + castDate?: boolean | CastingDateFunction; + /** + * List of fields as an array, + * a user defined callback accepting the first line and returning the column names or true if autodiscovered in the first CSV line, + * default to null, + * affect the result data set in the sense that records will be objects instead of arrays. + */ + columns?: ColumnOption[] | boolean | ((record: any) => ColumnOption[]); + /** + * Convert values into an array of values when columns are activated and + * when multiple columns of the same name are found. + */ + columns_duplicates_to_array?: boolean; + columnsDuplicatesToArray?: boolean; + /** + * Treat all the characters after this one as a comment, default to '' (disabled). + */ + comment?: string; + /** + * Set the field delimiter. One character only, defaults to comma. + */ + delimiter?: string | string[] | Buffer; + /** + * Set the source and destination encoding, a value of `null` returns buffer instead of strings. + */ + encoding?: string | null; + /** + * Set the escape character, one character only, defaults to double quotes. + */ + escape?: string | Buffer; + /** + * Start handling records from the requested number of records. + */ + from?: number; + /** + * Start handling records from the requested line number. + */ + from_line?: number; + fromLine?: number; + /** + * Don't interpret delimiters as such in the last field according to the number of fields calculated from the number of columns, the option require the presence of the `column` option when `true`. + */ + ignore_last_delimiters?: boolean | number; + /** + * Generate two properties `info` and `record` where `info` is a snapshot of the info object at the time the record was created and `record` is the parsed array or object. + */ + info?: boolean; + /** + * If true, ignore whitespace immediately following the delimiter (i.e. left-trim all fields), defaults to false. + * Does not remove whitespace in a quoted field. + */ + ltrim?: boolean; + /** + * Maximum numer of characters to be contained in the field and line buffers before an exception is raised, + * used to guard against a wrong delimiter or record_delimiter, + * default to 128000 characters. + */ + max_record_size?: number; + maxRecordSize?: number; + /** + * Name of header-record title to name objects by. + */ + objname?: string; + /** + * Alter and filter records by executing a user defined function. + */ + on_record?: (record: any, context: CastingContext) => any; + onRecord?: (record: any, context: CastingContext) => any; + /** + * Optional character surrounding a field, one character only, defaults to double quotes. + */ + quote?: string | boolean | Buffer | null; + /** + * Generate two properties raw and row where raw is the original CSV row content and row is the parsed array or object. + */ + raw?: boolean; + /** + * Preserve quotes inside unquoted field. + */ + relax?: boolean; + /** + * Discard inconsistent columns count, default to false. + */ + relax_column_count?: boolean; + relaxColumnCount?: boolean; + /** + * Discard inconsistent columns count when the record contains less fields than expected, default to false. + */ + relax_column_count_less?: boolean; + relaxColumnCountLess?: boolean; + /** + * Discard inconsistent columns count when the record contains more fields than expected, default to false. + */ + relax_column_count_more?: boolean; + relaxColumnCountMore?: boolean; + /** + * One or multiple characters used to delimit record rows; defaults to auto discovery if not provided. + * Supported auto discovery method are Linux ("\n"), Apple ("\r") and Windows ("\r\n") row delimiters. + */ + record_delimiter?: string | string[] | Buffer | Buffer[]; + recordDelimiter?: string | string[] | Buffer | Buffer[]; + /** + * If true, ignore whitespace immediately preceding the delimiter (i.e. right-trim all fields), defaults to false. + * Does not remove whitespace in a quoted field. + */ + rtrim?: boolean; + /** + * Dont generate empty values for empty lines. + * Defaults to false + */ + skip_empty_lines?: boolean; + skipEmptyLines?: boolean; + /** + * Skip a line with error found inside and directly go process the next line. + */ + skip_lines_with_error?: boolean; + skipLinesWithError?: boolean; + /** + * Don't generate records for lines containing empty column values (column matching /\s*\/), defaults to false. + */ + skip_lines_with_empty_values?: boolean; + skipLinesWithEmptyValues?: boolean; + /** + * Stop handling records after the requested number of records. + */ + to?: number; + /** + * Stop handling records after the requested line number. + */ + to_line?: number; + toLine?: number; + /** + * If true, ignore whitespace immediately around the delimiter, defaults to false. + * Does not remove whitespace in a quoted field. + */ + trim?: boolean; + } + + interface Info { + /** + * Count the number of lines being fully commented. + */ + readonly comment_lines: number; + /** + * Count the number of processed empty lines. + */ + readonly empty_lines: number; + /** + * The number of lines encountered in the source dataset, start at 1 for the first line. + */ + readonly lines: number; + /** + * Count the number of processed records. + */ + readonly records: number; + /** + * Number of non uniform records when `relax_column_count` is true. + */ + readonly invalid_field_length: number; + } + + class CsvError extends Error { + readonly code: CsvErrorCode; + [key: string]: any; + + constructor(code: CsvErrorCode, message: string | string[], options?: Options, ...contexts: any[]); + } + + type CsvErrorCode = + 'CSV_INVALID_OPTION_BOM' + | 'CSV_INVALID_OPTION_CAST' + | 'CSV_INVALID_OPTION_CAST_DATE' + | 'CSV_INVALID_OPTION_COLUMNS' + | 'CSV_INVALID_OPTION_COLUMNS_DUPLICATES_TO_ARRAY' + | 'CSV_INVALID_OPTION_COMMENT' + | 'CSV_INVALID_OPTION_DELIMITER' + | 'CSV_INVALID_OPTION_ON_RECORD' + | 'CSV_INVALID_CLOSING_QUOTE' + | 'INVALID_OPENING_QUOTE' + | 'CSV_INVALID_COLUMN_MAPPING' + | 'CSV_INVALID_ARGUMENT' + | 'CSV_INVALID_COLUMN_DEFINITION' + | 'CSV_MAX_RECORD_SIZE' + | 'CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE' + | 'CSV_QUOTE_NOT_CLOSED' + | 'CSV_INCONSISTENT_RECORD_LENGTH' + | 'CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH' + | 'CSV_OPTION_COLUMNS_MISSING_NAME' +} diff --git a/node_modules/csv-parse/lib/es5/index.js b/node_modules/csv-parse/lib/es5/index.js new file mode 100644 index 00000000..9f4ad340 --- /dev/null +++ b/node_modules/csv-parse/lib/es5/index.js @@ -0,0 +1,1510 @@ +"use strict"; + +function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } + +function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } + +function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } + +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + +/* +CSV Parse + +Please look at the [project documentation](https://csv.js.org/parse/) for +additional information. +*/ +var _require = require('stream'), + Transform = _require.Transform; + +var ResizeableBuffer = require('./ResizeableBuffer'); // white space characters +// https://en.wikipedia.org/wiki/Whitespace_character +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Character_Classes#Types +// \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff + + +var tab = 9; +var nl = 10; // \n, 0x0A in hexadecimal, 10 in decimal + +var np = 12; +var cr = 13; // \r, 0x0D in hexadécimal, 13 in decimal + +var space = 32; +var boms = { + // Note, the following are equals: + // Buffer.from("\ufeff") + // Buffer.from([239, 187, 191]) + // Buffer.from('EFBBBF', 'hex') + 'utf8': Buffer.from([239, 187, 191]), + // Note, the following are equals: + // Buffer.from "\ufeff", 'utf16le + // Buffer.from([255, 254]) + 'utf16le': Buffer.from([255, 254]) +}; + +var Parser = /*#__PURE__*/function (_Transform) { + _inherits(Parser, _Transform); + + var _super = _createSuper(Parser); + + function Parser() { + var _this; + + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, Parser); + + _this = _super.call(this, _objectSpread(_objectSpread(_objectSpread({}, { + readableObjectMode: true + }), opts), {}, { + encoding: null + })); + _this.__originalOptions = opts; + + _this.__normalizeOptions(opts); + + return _this; + } + + _createClass(Parser, [{ + key: "__normalizeOptions", + value: function __normalizeOptions(opts) { + var options = {}; // Merge with user options + + for (var opt in opts) { + options[underscore(opt)] = opts[opt]; + } // Normalize option `encoding` + // Note: defined first because other options depends on it + // to convert chars/strings into buffers. + + + if (options.encoding === undefined || options.encoding === true) { + options.encoding = 'utf8'; + } else if (options.encoding === null || options.encoding === false) { + options.encoding = null; + } else if (typeof options.encoding !== 'string' && options.encoding !== null) { + throw new CsvError('CSV_INVALID_OPTION_ENCODING', ['Invalid option encoding:', 'encoding must be a string or null to return a buffer,', "got ".concat(JSON.stringify(options.encoding))], options); + } // Normalize option `bom` + + + if (options.bom === undefined || options.bom === null || options.bom === false) { + options.bom = false; + } else if (options.bom !== true) { + throw new CsvError('CSV_INVALID_OPTION_BOM', ['Invalid option bom:', 'bom must be true,', "got ".concat(JSON.stringify(options.bom))], options); + } // Normalize option `cast` + + + var fnCastField = null; + + if (options.cast === undefined || options.cast === null || options.cast === false || options.cast === '') { + options.cast = undefined; + } else if (typeof options.cast === 'function') { + fnCastField = options.cast; + options.cast = true; + } else if (options.cast !== true) { + throw new CsvError('CSV_INVALID_OPTION_CAST', ['Invalid option cast:', 'cast must be true or a function,', "got ".concat(JSON.stringify(options.cast))], options); + } // Normalize option `cast_date` + + + if (options.cast_date === undefined || options.cast_date === null || options.cast_date === false || options.cast_date === '') { + options.cast_date = false; + } else if (options.cast_date === true) { + options.cast_date = function (value) { + var date = Date.parse(value); + return !isNaN(date) ? new Date(date) : value; + }; + } else if (typeof options.cast_date !== 'function') { + throw new CsvError('CSV_INVALID_OPTION_CAST_DATE', ['Invalid option cast_date:', 'cast_date must be true or a function,', "got ".concat(JSON.stringify(options.cast_date))], options); + } // Normalize option `columns` + + + var fnFirstLineToHeaders = null; + + if (options.columns === true) { + // Fields in the first line are converted as-is to columns + fnFirstLineToHeaders = undefined; + } else if (typeof options.columns === 'function') { + fnFirstLineToHeaders = options.columns; + options.columns = true; + } else if (Array.isArray(options.columns)) { + options.columns = normalizeColumnsArray(options.columns); + } else if (options.columns === undefined || options.columns === null || options.columns === false) { + options.columns = false; + } else { + throw new CsvError('CSV_INVALID_OPTION_COLUMNS', ['Invalid option columns:', 'expect an object, a function or true,', "got ".concat(JSON.stringify(options.columns))], options); + } // Normalize option `columns_duplicates_to_array` + + + if (options.columns_duplicates_to_array === undefined || options.columns_duplicates_to_array === null || options.columns_duplicates_to_array === false) { + options.columns_duplicates_to_array = false; + } else if (options.columns_duplicates_to_array !== true) { + throw new CsvError('CSV_INVALID_OPTION_COLUMNS_DUPLICATES_TO_ARRAY', ['Invalid option columns_duplicates_to_array:', 'expect an boolean,', "got ".concat(JSON.stringify(options.columns_duplicates_to_array))], options); + } // Normalize option `comment` + + + if (options.comment === undefined || options.comment === null || options.comment === false || options.comment === '') { + options.comment = null; + } else { + if (typeof options.comment === 'string') { + options.comment = Buffer.from(options.comment, options.encoding); + } + + if (!Buffer.isBuffer(options.comment)) { + throw new CsvError('CSV_INVALID_OPTION_COMMENT', ['Invalid option comment:', 'comment must be a buffer or a string,', "got ".concat(JSON.stringify(options.comment))], options); + } + } // Normalize option `delimiter` + + + var delimiter_json = JSON.stringify(options.delimiter); + if (!Array.isArray(options.delimiter)) options.delimiter = [options.delimiter]; + + if (options.delimiter.length === 0) { + throw new CsvError('CSV_INVALID_OPTION_DELIMITER', ['Invalid option delimiter:', 'delimiter must be a non empty string or buffer or array of string|buffer,', "got ".concat(delimiter_json)], options); + } + + options.delimiter = options.delimiter.map(function (delimiter) { + if (delimiter === undefined || delimiter === null || delimiter === false) { + return Buffer.from(',', options.encoding); + } + + if (typeof delimiter === 'string') { + delimiter = Buffer.from(delimiter, options.encoding); + } + + if (!Buffer.isBuffer(delimiter) || delimiter.length === 0) { + throw new CsvError('CSV_INVALID_OPTION_DELIMITER', ['Invalid option delimiter:', 'delimiter must be a non empty string or buffer or array of string|buffer,', "got ".concat(delimiter_json)], options); + } + + return delimiter; + }); // Normalize option `escape` + + if (options.escape === undefined || options.escape === true) { + options.escape = Buffer.from('"', options.encoding); + } else if (typeof options.escape === 'string') { + options.escape = Buffer.from(options.escape, options.encoding); + } else if (options.escape === null || options.escape === false) { + options.escape = null; + } + + if (options.escape !== null) { + if (!Buffer.isBuffer(options.escape)) { + throw new Error("Invalid Option: escape must be a buffer, a string or a boolean, got ".concat(JSON.stringify(options.escape))); + } + } // Normalize option `from` + + + if (options.from === undefined || options.from === null) { + options.from = 1; + } else { + if (typeof options.from === 'string' && /\d+/.test(options.from)) { + options.from = parseInt(options.from); + } + + if (Number.isInteger(options.from)) { + if (options.from < 0) { + throw new Error("Invalid Option: from must be a positive integer, got ".concat(JSON.stringify(opts.from))); + } + } else { + throw new Error("Invalid Option: from must be an integer, got ".concat(JSON.stringify(options.from))); + } + } // Normalize option `from_line` + + + if (options.from_line === undefined || options.from_line === null) { + options.from_line = 1; + } else { + if (typeof options.from_line === 'string' && /\d+/.test(options.from_line)) { + options.from_line = parseInt(options.from_line); + } + + if (Number.isInteger(options.from_line)) { + if (options.from_line <= 0) { + throw new Error("Invalid Option: from_line must be a positive integer greater than 0, got ".concat(JSON.stringify(opts.from_line))); + } + } else { + throw new Error("Invalid Option: from_line must be an integer, got ".concat(JSON.stringify(opts.from_line))); + } + } // Normalize options `ignore_last_delimiters` + + + if (options.ignore_last_delimiters === undefined || options.ignore_last_delimiters === null) { + options.ignore_last_delimiters = false; + } else if (typeof options.ignore_last_delimiters === 'number') { + options.ignore_last_delimiters = Math.floor(options.ignore_last_delimiters); + + if (options.ignore_last_delimiters === 0) { + options.ignore_last_delimiters = false; + } + } else if (typeof options.ignore_last_delimiters !== 'boolean') { + throw new CsvError('CSV_INVALID_OPTION_IGNORE_LAST_DELIMITERS', ['Invalid option `ignore_last_delimiters`:', 'the value must be a boolean value or an integer,', "got ".concat(JSON.stringify(options.ignore_last_delimiters))], options); + } + + if (options.ignore_last_delimiters === true && options.columns === false) { + throw new CsvError('CSV_IGNORE_LAST_DELIMITERS_REQUIRES_COLUMNS', ['The option `ignore_last_delimiters`', 'requires the activation of the `columns` option'], options); + } // Normalize option `info` + + + if (options.info === undefined || options.info === null || options.info === false) { + options.info = false; + } else if (options.info !== true) { + throw new Error("Invalid Option: info must be true, got ".concat(JSON.stringify(options.info))); + } // Normalize option `max_record_size` + + + if (options.max_record_size === undefined || options.max_record_size === null || options.max_record_size === false) { + options.max_record_size = 0; + } else if (Number.isInteger(options.max_record_size) && options.max_record_size >= 0) {// Great, nothing to do + } else if (typeof options.max_record_size === 'string' && /\d+/.test(options.max_record_size)) { + options.max_record_size = parseInt(options.max_record_size); + } else { + throw new Error("Invalid Option: max_record_size must be a positive integer, got ".concat(JSON.stringify(options.max_record_size))); + } // Normalize option `objname` + + + if (options.objname === undefined || options.objname === null || options.objname === false) { + options.objname = undefined; + } else if (Buffer.isBuffer(options.objname)) { + if (options.objname.length === 0) { + throw new Error("Invalid Option: objname must be a non empty buffer"); + } + + if (options.encoding === null) {// Don't call `toString`, leave objname as a buffer + } else { + options.objname = options.objname.toString(options.encoding); + } + } else if (typeof options.objname === 'string') { + if (options.objname.length === 0) { + throw new Error("Invalid Option: objname must be a non empty string"); + } // Great, nothing to do + + } else { + throw new Error("Invalid Option: objname must be a string or a buffer, got ".concat(options.objname)); + } // Normalize option `on_record` + + + if (options.on_record === undefined || options.on_record === null) { + options.on_record = undefined; + } else if (typeof options.on_record !== 'function') { + throw new CsvError('CSV_INVALID_OPTION_ON_RECORD', ['Invalid option `on_record`:', 'expect a function,', "got ".concat(JSON.stringify(options.on_record))], options); + } // Normalize option `quote` + + + if (options.quote === null || options.quote === false || options.quote === '') { + options.quote = null; + } else { + if (options.quote === undefined || options.quote === true) { + options.quote = Buffer.from('"', options.encoding); + } else if (typeof options.quote === 'string') { + options.quote = Buffer.from(options.quote, options.encoding); + } + + if (!Buffer.isBuffer(options.quote)) { + throw new Error("Invalid Option: quote must be a buffer or a string, got ".concat(JSON.stringify(options.quote))); + } + } // Normalize option `raw` + + + if (options.raw === undefined || options.raw === null || options.raw === false) { + options.raw = false; + } else if (options.raw !== true) { + throw new Error("Invalid Option: raw must be true, got ".concat(JSON.stringify(options.raw))); + } // Normalize option `record_delimiter` + + + if (!options.record_delimiter) { + options.record_delimiter = []; + } else if (!Array.isArray(options.record_delimiter)) { + options.record_delimiter = [options.record_delimiter]; + } + + options.record_delimiter = options.record_delimiter.map(function (rd) { + if (typeof rd === 'string') { + rd = Buffer.from(rd, options.encoding); + } + + return rd; + }); // Normalize option `relax` + + if (typeof options.relax === 'boolean') {// Great, nothing to do + } else if (options.relax === undefined || options.relax === null) { + options.relax = false; + } else { + throw new Error("Invalid Option: relax must be a boolean, got ".concat(JSON.stringify(options.relax))); + } // Normalize option `relax_column_count` + + + if (typeof options.relax_column_count === 'boolean') {// Great, nothing to do + } else if (options.relax_column_count === undefined || options.relax_column_count === null) { + options.relax_column_count = false; + } else { + throw new Error("Invalid Option: relax_column_count must be a boolean, got ".concat(JSON.stringify(options.relax_column_count))); + } + + if (typeof options.relax_column_count_less === 'boolean') {// Great, nothing to do + } else if (options.relax_column_count_less === undefined || options.relax_column_count_less === null) { + options.relax_column_count_less = false; + } else { + throw new Error("Invalid Option: relax_column_count_less must be a boolean, got ".concat(JSON.stringify(options.relax_column_count_less))); + } + + if (typeof options.relax_column_count_more === 'boolean') {// Great, nothing to do + } else if (options.relax_column_count_more === undefined || options.relax_column_count_more === null) { + options.relax_column_count_more = false; + } else { + throw new Error("Invalid Option: relax_column_count_more must be a boolean, got ".concat(JSON.stringify(options.relax_column_count_more))); + } // Normalize option `skip_empty_lines` + + + if (typeof options.skip_empty_lines === 'boolean') {// Great, nothing to do + } else if (options.skip_empty_lines === undefined || options.skip_empty_lines === null) { + options.skip_empty_lines = false; + } else { + throw new Error("Invalid Option: skip_empty_lines must be a boolean, got ".concat(JSON.stringify(options.skip_empty_lines))); + } // Normalize option `skip_lines_with_empty_values` + + + if (typeof options.skip_lines_with_empty_values === 'boolean') {// Great, nothing to do + } else if (options.skip_lines_with_empty_values === undefined || options.skip_lines_with_empty_values === null) { + options.skip_lines_with_empty_values = false; + } else { + throw new Error("Invalid Option: skip_lines_with_empty_values must be a boolean, got ".concat(JSON.stringify(options.skip_lines_with_empty_values))); + } // Normalize option `skip_lines_with_error` + + + if (typeof options.skip_lines_with_error === 'boolean') {// Great, nothing to do + } else if (options.skip_lines_with_error === undefined || options.skip_lines_with_error === null) { + options.skip_lines_with_error = false; + } else { + throw new Error("Invalid Option: skip_lines_with_error must be a boolean, got ".concat(JSON.stringify(options.skip_lines_with_error))); + } // Normalize option `rtrim` + + + if (options.rtrim === undefined || options.rtrim === null || options.rtrim === false) { + options.rtrim = false; + } else if (options.rtrim !== true) { + throw new Error("Invalid Option: rtrim must be a boolean, got ".concat(JSON.stringify(options.rtrim))); + } // Normalize option `ltrim` + + + if (options.ltrim === undefined || options.ltrim === null || options.ltrim === false) { + options.ltrim = false; + } else if (options.ltrim !== true) { + throw new Error("Invalid Option: ltrim must be a boolean, got ".concat(JSON.stringify(options.ltrim))); + } // Normalize option `trim` + + + if (options.trim === undefined || options.trim === null || options.trim === false) { + options.trim = false; + } else if (options.trim !== true) { + throw new Error("Invalid Option: trim must be a boolean, got ".concat(JSON.stringify(options.trim))); + } // Normalize options `trim`, `ltrim` and `rtrim` + + + if (options.trim === true && opts.ltrim !== false) { + options.ltrim = true; + } else if (options.ltrim !== true) { + options.ltrim = false; + } + + if (options.trim === true && opts.rtrim !== false) { + options.rtrim = true; + } else if (options.rtrim !== true) { + options.rtrim = false; + } // Normalize option `to` + + + if (options.to === undefined || options.to === null) { + options.to = -1; + } else { + if (typeof options.to === 'string' && /\d+/.test(options.to)) { + options.to = parseInt(options.to); + } + + if (Number.isInteger(options.to)) { + if (options.to <= 0) { + throw new Error("Invalid Option: to must be a positive integer greater than 0, got ".concat(JSON.stringify(opts.to))); + } + } else { + throw new Error("Invalid Option: to must be an integer, got ".concat(JSON.stringify(opts.to))); + } + } // Normalize option `to_line` + + + if (options.to_line === undefined || options.to_line === null) { + options.to_line = -1; + } else { + if (typeof options.to_line === 'string' && /\d+/.test(options.to_line)) { + options.to_line = parseInt(options.to_line); + } + + if (Number.isInteger(options.to_line)) { + if (options.to_line <= 0) { + throw new Error("Invalid Option: to_line must be a positive integer greater than 0, got ".concat(JSON.stringify(opts.to_line))); + } + } else { + throw new Error("Invalid Option: to_line must be an integer, got ".concat(JSON.stringify(opts.to_line))); + } + } + + this.info = { + comment_lines: 0, + empty_lines: 0, + invalid_field_length: 0, + lines: 1, + records: 0 + }; + this.options = options; + this.state = { + bomSkipped: false, + castField: fnCastField, + commenting: false, + // Current error encountered by a record + error: undefined, + enabled: options.from_line === 1, + escaping: false, + // escapeIsQuote: options.escape === options.quote, + escapeIsQuote: Buffer.isBuffer(options.escape) && Buffer.isBuffer(options.quote) && Buffer.compare(options.escape, options.quote) === 0, + expectedRecordLength: options.columns === null ? 0 : options.columns.length, + field: new ResizeableBuffer(20), + firstLineToHeaders: fnFirstLineToHeaders, + info: Object.assign({}, this.info), + needMoreDataSize: Math.max.apply(Math, [// Skip if the remaining buffer smaller than comment + options.comment !== null ? options.comment.length : 0].concat(_toConsumableArray(options.delimiter.map(function (delimiter) { + return delimiter.length; + })), [// Skip if the remaining buffer can be escape sequence + options.quote !== null ? options.quote.length : 0])), + previousBuf: undefined, + quoting: false, + stop: false, + rawBuffer: new ResizeableBuffer(100), + record: [], + recordHasError: false, + record_length: 0, + recordDelimiterMaxLength: options.record_delimiter.length === 0 ? 2 : Math.max.apply(Math, _toConsumableArray(options.record_delimiter.map(function (v) { + return v.length; + }))), + trimChars: [Buffer.from(' ', options.encoding)[0], Buffer.from('\t', options.encoding)[0]], + wasQuoting: false, + wasRowDelimiter: false + }; + } // Implementation of `Transform._transform` + + }, { + key: "_transform", + value: function _transform(buf, encoding, callback) { + if (this.state.stop === true) { + return; + } + + var err = this.__parse(buf, false); + + if (err !== undefined) { + this.state.stop = true; + } + + callback(err); + } // Implementation of `Transform._flush` + + }, { + key: "_flush", + value: function _flush(callback) { + if (this.state.stop === true) { + return; + } + + var err = this.__parse(undefined, true); + + callback(err); + } // Central parser implementation + + }, { + key: "__parse", + value: function __parse(nextBuf, end) { + var _this$options = this.options, + bom = _this$options.bom, + comment = _this$options.comment, + escape = _this$options.escape, + from_line = _this$options.from_line, + info = _this$options.info, + ltrim = _this$options.ltrim, + max_record_size = _this$options.max_record_size, + quote = _this$options.quote, + raw = _this$options.raw, + relax = _this$options.relax, + rtrim = _this$options.rtrim, + skip_empty_lines = _this$options.skip_empty_lines, + to = _this$options.to, + to_line = _this$options.to_line; + var record_delimiter = this.options.record_delimiter; + var _this$state = this.state, + bomSkipped = _this$state.bomSkipped, + previousBuf = _this$state.previousBuf, + rawBuffer = _this$state.rawBuffer, + escapeIsQuote = _this$state.escapeIsQuote; + var buf; + + if (previousBuf === undefined) { + if (nextBuf === undefined) { + // Handle empty string + this.push(null); + return; + } else { + buf = nextBuf; + } + } else if (previousBuf !== undefined && nextBuf === undefined) { + buf = previousBuf; + } else { + buf = Buffer.concat([previousBuf, nextBuf]); + } // Handle UTF BOM + + + if (bomSkipped === false) { + if (bom === false) { + this.state.bomSkipped = true; + } else if (buf.length < 3) { + // No enough data + if (end === false) { + // Wait for more data + this.state.previousBuf = buf; + return; + } + } else { + for (var encoding in boms) { + if (boms[encoding].compare(buf, 0, boms[encoding].length) === 0) { + // Skip BOM + buf = buf.slice(boms[encoding].length); // Renormalize original options with the new encoding + + this.__normalizeOptions(_objectSpread(_objectSpread({}, this.__originalOptions), {}, { + encoding: encoding + })); + + break; + } + } + + this.state.bomSkipped = true; + } + } + + var bufLen = buf.length; + var pos; + + for (pos = 0; pos < bufLen; pos++) { + // Ensure we get enough space to look ahead + // There should be a way to move this out of the loop + if (this.__needMoreData(pos, bufLen, end)) { + break; + } + + if (this.state.wasRowDelimiter === true) { + this.info.lines++; + + if (info === true && this.state.record.length === 0 && this.state.field.length === 0 && this.state.wasQuoting === false) { + this.state.info = Object.assign({}, this.info); + } + + this.state.wasRowDelimiter = false; + } + + if (to_line !== -1 && this.info.lines > to_line) { + this.state.stop = true; + this.push(null); + return; + } // Auto discovery of record_delimiter, unix, mac and windows supported + + + if (this.state.quoting === false && record_delimiter.length === 0) { + var record_delimiterCount = this.__autoDiscoverRecordDelimiter(buf, pos); + + if (record_delimiterCount) { + record_delimiter = this.options.record_delimiter; + } + } + + var chr = buf[pos]; + + if (raw === true) { + rawBuffer.append(chr); + } + + if ((chr === cr || chr === nl) && this.state.wasRowDelimiter === false) { + this.state.wasRowDelimiter = true; + } // Previous char was a valid escape char + // treat the current char as a regular char + + + if (this.state.escaping === true) { + this.state.escaping = false; + } else { + // Escape is only active inside quoted fields + // We are quoting, the char is an escape chr and there is a chr to escape + // if(escape !== null && this.state.quoting === true && chr === escape && pos + 1 < bufLen){ + if (escape !== null && this.state.quoting === true && this.__isEscape(buf, pos, chr) && pos + escape.length < bufLen) { + if (escapeIsQuote) { + if (this.__isQuote(buf, pos + escape.length)) { + this.state.escaping = true; + pos += escape.length - 1; + continue; + } + } else { + this.state.escaping = true; + pos += escape.length - 1; + continue; + } + } // Not currently escaping and chr is a quote + // TODO: need to compare bytes instead of single char + + + if (this.state.commenting === false && this.__isQuote(buf, pos)) { + if (this.state.quoting === true) { + var nextChr = buf[pos + quote.length]; + + var isNextChrTrimable = rtrim && this.__isCharTrimable(nextChr); + + var isNextChrComment = comment !== null && this.__compareBytes(comment, buf, pos + quote.length, nextChr); + + var isNextChrDelimiter = this.__isDelimiter(buf, pos + quote.length, nextChr); + + var isNextChrRecordDelimiter = record_delimiter.length === 0 ? this.__autoDiscoverRecordDelimiter(buf, pos + quote.length) : this.__isRecordDelimiter(nextChr, buf, pos + quote.length); // Escape a quote + // Treat next char as a regular character + + if (escape !== null && this.__isEscape(buf, pos, chr) && this.__isQuote(buf, pos + escape.length)) { + pos += escape.length - 1; + } else if (!nextChr || isNextChrDelimiter || isNextChrRecordDelimiter || isNextChrComment || isNextChrTrimable) { + this.state.quoting = false; + this.state.wasQuoting = true; + pos += quote.length - 1; + continue; + } else if (relax === false) { + var err = this.__error(new CsvError('CSV_INVALID_CLOSING_QUOTE', ['Invalid Closing Quote:', "got \"".concat(String.fromCharCode(nextChr), "\""), "at line ".concat(this.info.lines), 'instead of delimiter, record delimiter, trimable character', '(if activated) or comment'], this.options, this.__context())); + + if (err !== undefined) return err; + } else { + this.state.quoting = false; + this.state.wasQuoting = true; + this.state.field.prepend(quote); + pos += quote.length - 1; + } + } else { + if (this.state.field.length !== 0) { + // In relax mode, treat opening quote preceded by chrs as regular + if (relax === false) { + var _err = this.__error(new CsvError('INVALID_OPENING_QUOTE', ['Invalid Opening Quote:', "a quote is found inside a field at line ".concat(this.info.lines)], this.options, this.__context(), { + field: this.state.field + })); + + if (_err !== undefined) return _err; + } + } else { + this.state.quoting = true; + pos += quote.length - 1; + continue; + } + } + } + + if (this.state.quoting === false) { + var recordDelimiterLength = this.__isRecordDelimiter(chr, buf, pos); + + if (recordDelimiterLength !== 0) { + // Do not emit comments which take a full line + var skipCommentLine = this.state.commenting && this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0; + + if (skipCommentLine) { + this.info.comment_lines++; // Skip full comment line + } else { + // Activate records emition if above from_line + if (this.state.enabled === false && this.info.lines + (this.state.wasRowDelimiter === true ? 1 : 0) >= from_line) { + this.state.enabled = true; + + this.__resetField(); + + this.__resetRecord(); + + pos += recordDelimiterLength - 1; + continue; + } // Skip if line is empty and skip_empty_lines activated + + + if (skip_empty_lines === true && this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0) { + this.info.empty_lines++; + pos += recordDelimiterLength - 1; + continue; + } + + var errField = this.__onField(); + + if (errField !== undefined) return errField; + + var errRecord = this.__onRecord(); + + if (errRecord !== undefined) return errRecord; + + if (to !== -1 && this.info.records >= to) { + this.state.stop = true; + this.push(null); + return; + } + } + + this.state.commenting = false; + pos += recordDelimiterLength - 1; + continue; + } + + if (this.state.commenting) { + continue; + } + + var commentCount = comment === null ? 0 : this.__compareBytes(comment, buf, pos, chr); + + if (commentCount !== 0) { + this.state.commenting = true; + continue; + } + + var delimiterLength = this.__isDelimiter(buf, pos, chr); + + if (delimiterLength !== 0) { + var _errField = this.__onField(); + + if (_errField !== undefined) return _errField; + pos += delimiterLength - 1; + continue; + } + } + } + + if (this.state.commenting === false) { + if (max_record_size !== 0 && this.state.record_length + this.state.field.length > max_record_size) { + var _err2 = this.__error(new CsvError('CSV_MAX_RECORD_SIZE', ['Max Record Size:', 'record exceed the maximum number of tolerated bytes', "of ".concat(max_record_size), "at line ".concat(this.info.lines)], this.options, this.__context())); + + if (_err2 !== undefined) return _err2; + } + } + + var lappend = ltrim === false || this.state.quoting === true || this.state.field.length !== 0 || !this.__isCharTrimable(chr); // rtrim in non quoting is handle in __onField + + var rappend = rtrim === false || this.state.wasQuoting === false; + + if (lappend === true && rappend === true) { + this.state.field.append(chr); + } else if (rtrim === true && !this.__isCharTrimable(chr)) { + var _err3 = this.__error(new CsvError('CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE', ['Invalid Closing Quote:', 'found non trimable byte after quote', "at line ".concat(this.info.lines)], this.options, this.__context())); + + if (_err3 !== undefined) return _err3; + } + } + + if (end === true) { + // Ensure we are not ending in a quoting state + if (this.state.quoting === true) { + var _err4 = this.__error(new CsvError('CSV_QUOTE_NOT_CLOSED', ['Quote Not Closed:', "the parsing is finished with an opening quote at line ".concat(this.info.lines)], this.options, this.__context())); + + if (_err4 !== undefined) return _err4; + } else { + // Skip last line if it has no characters + if (this.state.wasQuoting === true || this.state.record.length !== 0 || this.state.field.length !== 0) { + var _errField2 = this.__onField(); + + if (_errField2 !== undefined) return _errField2; + + var _errRecord = this.__onRecord(); + + if (_errRecord !== undefined) return _errRecord; + } else if (this.state.wasRowDelimiter === true) { + this.info.empty_lines++; + } else if (this.state.commenting === true) { + this.info.comment_lines++; + } + } + } else { + this.state.previousBuf = buf.slice(pos); + } + + if (this.state.wasRowDelimiter === true) { + this.info.lines++; + this.state.wasRowDelimiter = false; + } + } + }, { + key: "__onRecord", + value: function __onRecord() { + var _this$options2 = this.options, + columns = _this$options2.columns, + columns_duplicates_to_array = _this$options2.columns_duplicates_to_array, + encoding = _this$options2.encoding, + info = _this$options2.info, + from = _this$options2.from, + relax_column_count = _this$options2.relax_column_count, + relax_column_count_less = _this$options2.relax_column_count_less, + relax_column_count_more = _this$options2.relax_column_count_more, + raw = _this$options2.raw, + skip_lines_with_empty_values = _this$options2.skip_lines_with_empty_values; + var _this$state2 = this.state, + enabled = _this$state2.enabled, + record = _this$state2.record; + + if (enabled === false) { + return this.__resetRecord(); + } // Convert the first line into column names + + + var recordLength = record.length; + + if (columns === true) { + if (isRecordEmpty(record)) { + this.__resetRecord(); + + return; + } + + return this.__firstLineToColumns(record); + } + + if (columns === false && this.info.records === 0) { + this.state.expectedRecordLength = recordLength; + } + + if (recordLength !== this.state.expectedRecordLength) { + var err = columns === false ? // Todo: rename CSV_INCONSISTENT_RECORD_LENGTH to + // CSV_RECORD_INCONSISTENT_FIELDS_LENGTH + new CsvError('CSV_INCONSISTENT_RECORD_LENGTH', ['Invalid Record Length:', "expect ".concat(this.state.expectedRecordLength, ","), "got ".concat(recordLength, " on line ").concat(this.info.lines)], this.options, this.__context(), { + record: record + }) : // Todo: rename CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH to + // CSV_RECORD_INCONSISTENT_COLUMNS + new CsvError('CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH', ['Invalid Record Length:', "columns length is ".concat(columns.length, ","), // rename columns + "got ".concat(recordLength, " on line ").concat(this.info.lines)], this.options, this.__context(), { + record: record + }); + + if (relax_column_count === true || relax_column_count_less === true && recordLength < this.state.expectedRecordLength || relax_column_count_more === true && recordLength > this.state.expectedRecordLength) { + this.info.invalid_field_length++; + this.state.error = err; // Error is undefined with skip_lines_with_error + } else { + var finalErr = this.__error(err); + + if (finalErr) return finalErr; + } + } + + if (skip_lines_with_empty_values === true) { + if (isRecordEmpty(record)) { + this.__resetRecord(); + + return; + } + } + + if (this.state.recordHasError === true) { + this.__resetRecord(); + + this.state.recordHasError = false; + return; + } + + this.info.records++; + + if (from === 1 || this.info.records >= from) { + if (columns !== false) { + var obj = {}; // Transform record array to an object + + for (var i = 0, l = record.length; i < l; i++) { + if (columns[i] === undefined || columns[i].disabled) continue; // Turn duplicate columns into an array + + if (columns_duplicates_to_array === true && obj[columns[i].name]) { + if (Array.isArray(obj[columns[i].name])) { + obj[columns[i].name] = obj[columns[i].name].concat(record[i]); + } else { + obj[columns[i].name] = [obj[columns[i].name], record[i]]; + } + } else { + obj[columns[i].name] = record[i]; + } + } + + var objname = this.options.objname; + + if (objname === undefined) { + if (raw === true || info === true) { + var _err5 = this.__push(Object.assign({ + record: obj + }, raw === true ? { + raw: this.state.rawBuffer.toString(encoding) + } : {}, info === true ? { + info: this.state.info + } : {})); + + if (_err5) { + return _err5; + } + } else { + var _err6 = this.__push(obj); + + if (_err6) { + return _err6; + } + } + } else { + if (raw === true || info === true) { + var _err7 = this.__push(Object.assign({ + record: [obj[objname], obj] + }, raw === true ? { + raw: this.state.rawBuffer.toString(encoding) + } : {}, info === true ? { + info: this.state.info + } : {})); + + if (_err7) { + return _err7; + } + } else { + var _err8 = this.__push([obj[objname], obj]); + + if (_err8) { + return _err8; + } + } + } + } else { + if (raw === true || info === true) { + var _err9 = this.__push(Object.assign({ + record: record + }, raw === true ? { + raw: this.state.rawBuffer.toString(encoding) + } : {}, info === true ? { + info: this.state.info + } : {})); + + if (_err9) { + return _err9; + } + } else { + var _err10 = this.__push(record); + + if (_err10) { + return _err10; + } + } + } + } + + this.__resetRecord(); + } + }, { + key: "__firstLineToColumns", + value: function __firstLineToColumns(record) { + var firstLineToHeaders = this.state.firstLineToHeaders; + + try { + var headers = firstLineToHeaders === undefined ? record : firstLineToHeaders.call(null, record); + + if (!Array.isArray(headers)) { + return this.__error(new CsvError('CSV_INVALID_COLUMN_MAPPING', ['Invalid Column Mapping:', 'expect an array from column function,', "got ".concat(JSON.stringify(headers))], this.options, this.__context(), { + headers: headers + })); + } + + var normalizedHeaders = normalizeColumnsArray(headers); + this.state.expectedRecordLength = normalizedHeaders.length; + this.options.columns = normalizedHeaders; + + this.__resetRecord(); + + return; + } catch (err) { + return err; + } + } + }, { + key: "__resetRecord", + value: function __resetRecord() { + if (this.options.raw === true) { + this.state.rawBuffer.reset(); + } + + this.state.error = undefined; + this.state.record = []; + this.state.record_length = 0; + } + }, { + key: "__onField", + value: function __onField() { + var _this$options3 = this.options, + cast = _this$options3.cast, + encoding = _this$options3.encoding, + rtrim = _this$options3.rtrim, + max_record_size = _this$options3.max_record_size; + var _this$state3 = this.state, + enabled = _this$state3.enabled, + wasQuoting = _this$state3.wasQuoting; // Short circuit for the from_line options + + if (enabled === false) { + /* this.options.columns !== true && */ + return this.__resetField(); + } + + var field = this.state.field.toString(encoding); + + if (rtrim === true && wasQuoting === false) { + field = field.trimRight(); + } + + if (cast === true) { + var _this$__cast = this.__cast(field), + _this$__cast2 = _slicedToArray(_this$__cast, 2), + err = _this$__cast2[0], + f = _this$__cast2[1]; + + if (err !== undefined) return err; + field = f; + } + + this.state.record.push(field); // Increment record length if record size must not exceed a limit + + if (max_record_size !== 0 && typeof field === 'string') { + this.state.record_length += field.length; + } + + this.__resetField(); + } + }, { + key: "__resetField", + value: function __resetField() { + this.state.field.reset(); + this.state.wasQuoting = false; + } + }, { + key: "__push", + value: function __push(record) { + var on_record = this.options.on_record; + + if (on_record !== undefined) { + var context = this.__context(); + + try { + record = on_record.call(null, record, context); + } catch (err) { + return err; + } + + if (record === undefined || record === null) { + return; + } + } + + this.push(record); + } // Return a tuple with the error and the casted value + + }, { + key: "__cast", + value: function __cast(field) { + var _this$options4 = this.options, + columns = _this$options4.columns, + relax_column_count = _this$options4.relax_column_count; + var isColumns = Array.isArray(columns); // Dont loose time calling cast + // because the final record is an object + // and this field can't be associated to a key present in columns + + if (isColumns === true && relax_column_count && this.options.columns.length <= this.state.record.length) { + return [undefined, undefined]; + } + + var context = this.__context(); + + if (this.state.castField !== null) { + try { + return [undefined, this.state.castField.call(null, field, context)]; + } catch (err) { + return [err]; + } + } + + if (this.__isFloat(field)) { + return [undefined, parseFloat(field)]; + } else if (this.options.cast_date !== false) { + return [undefined, this.options.cast_date.call(null, field, context)]; + } + + return [undefined, field]; + } // Helper to test if a character is a space or a line delimiter + + }, { + key: "__isCharTrimable", + value: function __isCharTrimable(chr) { + return chr === space || chr === tab || chr === cr || chr === nl || chr === np; + } // Keep it in case we implement the `cast_int` option + // __isInt(value){ + // // return Number.isInteger(parseInt(value)) + // // return !isNaN( parseInt( obj ) ); + // return /^(\-|\+)?[1-9][0-9]*$/.test(value) + // } + + }, { + key: "__isFloat", + value: function __isFloat(value) { + return value - parseFloat(value) + 1 >= 0; // Borrowed from jquery + } + }, { + key: "__compareBytes", + value: function __compareBytes(sourceBuf, targetBuf, targetPos, firstByte) { + if (sourceBuf[0] !== firstByte) return 0; + var sourceLength = sourceBuf.length; + + for (var i = 1; i < sourceLength; i++) { + if (sourceBuf[i] !== targetBuf[targetPos + i]) return 0; + } + + return sourceLength; + } + }, { + key: "__needMoreData", + value: function __needMoreData(i, bufLen, end) { + if (end) return false; + var quote = this.options.quote; + var _this$state4 = this.state, + quoting = _this$state4.quoting, + needMoreDataSize = _this$state4.needMoreDataSize, + recordDelimiterMaxLength = _this$state4.recordDelimiterMaxLength; + var numOfCharLeft = bufLen - i - 1; + var requiredLength = Math.max(needMoreDataSize, // Skip if the remaining buffer smaller than record delimiter + recordDelimiterMaxLength, // Skip if the remaining buffer can be record delimiter following the closing quote + // 1 is for quote.length + quoting ? quote.length + recordDelimiterMaxLength : 0); + return numOfCharLeft < requiredLength; + } + }, { + key: "__isDelimiter", + value: function __isDelimiter(buf, pos, chr) { + var _this$options5 = this.options, + delimiter = _this$options5.delimiter, + ignore_last_delimiters = _this$options5.ignore_last_delimiters; + + if (ignore_last_delimiters === true && this.state.record.length === this.options.columns.length - 1) { + return 0; + } else if (ignore_last_delimiters !== false && typeof ignore_last_delimiters === 'number' && this.state.record.length === ignore_last_delimiters - 1) { + return 0; + } + + loop1: for (var i = 0; i < delimiter.length; i++) { + var del = delimiter[i]; + + if (del[0] === chr) { + for (var j = 1; j < del.length; j++) { + if (del[j] !== buf[pos + j]) continue loop1; + } + + return del.length; + } + } + + return 0; + } + }, { + key: "__isRecordDelimiter", + value: function __isRecordDelimiter(chr, buf, pos) { + var record_delimiter = this.options.record_delimiter; + var recordDelimiterLength = record_delimiter.length; + + loop1: for (var i = 0; i < recordDelimiterLength; i++) { + var rd = record_delimiter[i]; + var rdLength = rd.length; + + if (rd[0] !== chr) { + continue; + } + + for (var j = 1; j < rdLength; j++) { + if (rd[j] !== buf[pos + j]) { + continue loop1; + } + } + + return rd.length; + } + + return 0; + } + }, { + key: "__isEscape", + value: function __isEscape(buf, pos, chr) { + var escape = this.options.escape; + if (escape === null) return false; + var l = escape.length; + + if (escape[0] === chr) { + for (var i = 0; i < l; i++) { + if (escape[i] !== buf[pos + i]) { + return false; + } + } + + return true; + } + + return false; + } + }, { + key: "__isQuote", + value: function __isQuote(buf, pos) { + var quote = this.options.quote; + if (quote === null) return false; + var l = quote.length; + + for (var i = 0; i < l; i++) { + if (quote[i] !== buf[pos + i]) { + return false; + } + } + + return true; + } + }, { + key: "__autoDiscoverRecordDelimiter", + value: function __autoDiscoverRecordDelimiter(buf, pos) { + var encoding = this.options.encoding; + var chr = buf[pos]; + + if (chr === cr) { + if (buf[pos + 1] === nl) { + this.options.record_delimiter.push(Buffer.from('\r\n', encoding)); + this.state.recordDelimiterMaxLength = 2; + return 2; + } else { + this.options.record_delimiter.push(Buffer.from('\r', encoding)); + this.state.recordDelimiterMaxLength = 1; + return 1; + } + } else if (chr === nl) { + this.options.record_delimiter.push(Buffer.from('\n', encoding)); + this.state.recordDelimiterMaxLength = 1; + return 1; + } + + return 0; + } + }, { + key: "__error", + value: function __error(msg) { + var skip_lines_with_error = this.options.skip_lines_with_error; + var err = typeof msg === 'string' ? new Error(msg) : msg; + + if (skip_lines_with_error) { + this.state.recordHasError = true; + this.emit('skip', err); + return undefined; + } else { + return err; + } + } + }, { + key: "__context", + value: function __context() { + var columns = this.options.columns; + var isColumns = Array.isArray(columns); + return { + column: isColumns === true ? columns.length > this.state.record.length ? columns[this.state.record.length].name : null : this.state.record.length, + empty_lines: this.info.empty_lines, + error: this.state.error, + header: columns === true, + index: this.state.record.length, + invalid_field_length: this.info.invalid_field_length, + quoting: this.state.wasQuoting, + lines: this.info.lines, + records: this.info.records + }; + } + }]); + + return Parser; +}(Transform); + +var parse = function parse() { + var data, options, callback; + + for (var i in arguments) { + var argument = arguments[i]; + + var type = _typeof(argument); + + if (data === undefined && (typeof argument === 'string' || Buffer.isBuffer(argument))) { + data = argument; + } else if (options === undefined && isObject(argument)) { + options = argument; + } else if (callback === undefined && type === 'function') { + callback = argument; + } else { + throw new CsvError('CSV_INVALID_ARGUMENT', ['Invalid argument:', "got ".concat(JSON.stringify(argument), " at index ").concat(i)], this.options); + } + } + + var parser = new Parser(options); + + if (callback) { + var records = options === undefined || options.objname === undefined ? [] : {}; + parser.on('readable', function () { + var record; + + while ((record = this.read()) !== null) { + if (options === undefined || options.objname === undefined) { + records.push(record); + } else { + records[record[0]] = record[1]; + } + } + }); + parser.on('error', function (err) { + callback(err, undefined, parser.info); + }); + parser.on('end', function () { + callback(undefined, records, parser.info); + }); + } + + if (data !== undefined) { + // Give a chance for events to be registered later + if (typeof setImmediate === 'function') { + setImmediate(function () { + parser.write(data); + parser.end(); + }); + } else { + parser.write(data); + parser.end(); + } + } + + return parser; +}; + +var CsvError = /*#__PURE__*/function (_Error) { + _inherits(CsvError, _Error); + + var _super2 = _createSuper(CsvError); + + function CsvError(code, message, options) { + var _this2; + + _classCallCheck(this, CsvError); + + if (Array.isArray(message)) message = message.join(' '); + _this2 = _super2.call(this, message); + + if (Error.captureStackTrace !== undefined) { + Error.captureStackTrace(_assertThisInitialized(_this2), CsvError); + } + + _this2.code = code; + + for (var _len = arguments.length, contexts = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { + contexts[_key - 3] = arguments[_key]; + } + + for (var _i2 = 0, _contexts = contexts; _i2 < _contexts.length; _i2++) { + var context = _contexts[_i2]; + + for (var key in context) { + var value = context[key]; + _this2[key] = Buffer.isBuffer(value) ? value.toString(options.encoding) : value == null ? value : JSON.parse(JSON.stringify(value)); + } + } + + return _this2; + } + + return CsvError; +}( /*#__PURE__*/_wrapNativeSuper(Error)); + +parse.Parser = Parser; +parse.CsvError = CsvError; +module.exports = parse; + +var underscore = function underscore(str) { + return str.replace(/([A-Z])/g, function (_, match) { + return '_' + match.toLowerCase(); + }); +}; + +var isObject = function isObject(obj) { + return _typeof(obj) === 'object' && obj !== null && !Array.isArray(obj); +}; + +var isRecordEmpty = function isRecordEmpty(record) { + return record.every(function (field) { + return field == null || field.toString && field.toString().trim() === ''; + }); +}; + +var normalizeColumnsArray = function normalizeColumnsArray(columns) { + var normalizedColumns = []; + + for (var i = 0, l = columns.length; i < l; i++) { + var column = columns[i]; + + if (column === undefined || column === null || column === false) { + normalizedColumns[i] = { + disabled: true + }; + } else if (typeof column === 'string') { + normalizedColumns[i] = { + name: column + }; + } else if (isObject(column)) { + if (typeof column.name !== 'string') { + throw new CsvError('CSV_OPTION_COLUMNS_MISSING_NAME', ['Option columns missing name:', "property \"name\" is required at position ".concat(i), 'when column is an object literal']); + } + + normalizedColumns[i] = column; + } else { + throw new CsvError('CSV_INVALID_COLUMN_DEFINITION', ['Invalid column definition:', 'expect a string or a literal object,', "got ".concat(JSON.stringify(column), " at position ").concat(i)]); + } + } + + return normalizedColumns; +}; \ No newline at end of file diff --git a/node_modules/csv-parse/lib/es5/sync.d.ts b/node_modules/csv-parse/lib/es5/sync.d.ts new file mode 100644 index 00000000..7886698e --- /dev/null +++ b/node_modules/csv-parse/lib/es5/sync.d.ts @@ -0,0 +1,6 @@ +import * as csvParse from './index'; + +export = parse; + +declare function parse(input: Buffer | string, options?: csvParse.Options): any; +declare namespace parse {} \ No newline at end of file diff --git a/node_modules/csv-parse/lib/es5/sync.js b/node_modules/csv-parse/lib/es5/sync.js new file mode 100644 index 00000000..00106a09 --- /dev/null +++ b/node_modules/csv-parse/lib/es5/sync.js @@ -0,0 +1,33 @@ +"use strict"; + +var parse = require('.'); + +module.exports = function (data) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + if (typeof data === 'string') { + data = Buffer.from(data); + } + + var records = options && options.objname ? {} : []; + var parser = new parse.Parser(options); + + parser.push = function (record) { + if (record === null) { + return; + } + + if (options.objname === undefined) records.push(record);else { + records[record[0]] = record[1]; + } + }; + + var err1 = parser.__parse(data, false); + + if (err1 !== undefined) throw err1; + + var err2 = parser.__parse(undefined, true); + + if (err2 !== undefined) throw err2; + return records; +}; \ No newline at end of file diff --git a/node_modules/csv-parse/lib/index.d.ts b/node_modules/csv-parse/lib/index.d.ts new file mode 100644 index 00000000..5a3d19fb --- /dev/null +++ b/node_modules/csv-parse/lib/index.d.ts @@ -0,0 +1,264 @@ +// Original definitions in https://github.com/DefinitelyTyped/DefinitelyTyped by: David Muller + +/// + +import * as stream from "stream"; + +export = parse; + +declare function parse(input: Buffer | string, options?: parse.Options, callback?: parse.Callback): parse.Parser; +declare function parse(input: Buffer | string, callback?: parse.Callback): parse.Parser; +declare function parse(options?: parse.Options, callback?: parse.Callback): parse.Parser; +declare function parse(callback?: parse.Callback): parse.Parser; +declare namespace parse { + + type Callback = (err: Error | undefined, records: any | undefined, info: Info) => void; + + interface Parser extends stream.Transform {} + + class Parser { + constructor(options: Options); + + __push(line: any): any; + + __write(chars: any, end: any, callback: any): any; + + readonly options: Options + + readonly info: Info; + } + + interface CastingContext { + readonly column: number | string; + readonly empty_lines: number; + readonly error: CsvError; + readonly header: boolean; + readonly index: number; + readonly quoting: boolean; + readonly lines: number; + readonly records: number; + readonly invalid_field_length: number; + } + + type CastingFunction = (value: string, context: CastingContext) => any; + + type CastingDateFunction = (value: string, context: CastingContext) => Date; + + type ColumnOption = string | undefined | null | false | { name: string }; + + interface Options { + /** + * If true, the parser will attempt to convert read data types to native types. + * @deprecated Use {@link cast} + */ + auto_parse?: boolean | CastingFunction; + autoParse?: boolean | CastingFunction; + /** + * If true, the parser will attempt to convert read data types to dates. It requires the "auto_parse" option. + * @deprecated Use {@link cast_date} + */ + auto_parse_date?: boolean | CastingDateFunction; + autoParseDate?: boolean | CastingDateFunction; + /** + * If true, detect and exclude the byte order mark (BOM) from the CSV input if present. + */ + bom?: boolean; + /** + * If true, the parser will attempt to convert input string to native types. + * If a function, receive the value as first argument, a context as second argument and return a new value. More information about the context properties is available below. + */ + cast?: boolean | CastingFunction; + /** + * If true, the parser will attempt to convert input string to dates. + * If a function, receive the value as argument and return a new value. It requires the "auto_parse" option. Be careful, it relies on Date.parse. + */ + cast_date?: boolean | CastingDateFunction; + castDate?: boolean | CastingDateFunction; + /** + * List of fields as an array, + * a user defined callback accepting the first line and returning the column names or true if autodiscovered in the first CSV line, + * default to null, + * affect the result data set in the sense that records will be objects instead of arrays. + */ + columns?: ColumnOption[] | boolean | ((record: any) => ColumnOption[]); + /** + * Convert values into an array of values when columns are activated and + * when multiple columns of the same name are found. + */ + columns_duplicates_to_array?: boolean; + columnsDuplicatesToArray?: boolean; + /** + * Treat all the characters after this one as a comment, default to '' (disabled). + */ + comment?: string; + /** + * Set the field delimiter. One character only, defaults to comma. + */ + delimiter?: string | string[] | Buffer; + /** + * Set the source and destination encoding, a value of `null` returns buffer instead of strings. + */ + encoding?: string | null; + /** + * Set the escape character, one character only, defaults to double quotes. + */ + escape?: string | Buffer; + /** + * Start handling records from the requested number of records. + */ + from?: number; + /** + * Start handling records from the requested line number. + */ + from_line?: number; + fromLine?: number; + /** + * Don't interpret delimiters as such in the last field according to the number of fields calculated from the number of columns, the option require the presence of the `column` option when `true`. + */ + ignore_last_delimiters?: boolean | number; + /** + * Generate two properties `info` and `record` where `info` is a snapshot of the info object at the time the record was created and `record` is the parsed array or object. + */ + info?: boolean; + /** + * If true, ignore whitespace immediately following the delimiter (i.e. left-trim all fields), defaults to false. + * Does not remove whitespace in a quoted field. + */ + ltrim?: boolean; + /** + * Maximum numer of characters to be contained in the field and line buffers before an exception is raised, + * used to guard against a wrong delimiter or record_delimiter, + * default to 128000 characters. + */ + max_record_size?: number; + maxRecordSize?: number; + /** + * Name of header-record title to name objects by. + */ + objname?: string; + /** + * Alter and filter records by executing a user defined function. + */ + on_record?: (record: any, context: CastingContext) => any; + onRecord?: (record: any, context: CastingContext) => any; + /** + * Optional character surrounding a field, one character only, defaults to double quotes. + */ + quote?: string | boolean | Buffer | null; + /** + * Generate two properties raw and row where raw is the original CSV row content and row is the parsed array or object. + */ + raw?: boolean; + /** + * Preserve quotes inside unquoted field. + */ + relax?: boolean; + /** + * Discard inconsistent columns count, default to false. + */ + relax_column_count?: boolean; + relaxColumnCount?: boolean; + /** + * Discard inconsistent columns count when the record contains less fields than expected, default to false. + */ + relax_column_count_less?: boolean; + relaxColumnCountLess?: boolean; + /** + * Discard inconsistent columns count when the record contains more fields than expected, default to false. + */ + relax_column_count_more?: boolean; + relaxColumnCountMore?: boolean; + /** + * One or multiple characters used to delimit record rows; defaults to auto discovery if not provided. + * Supported auto discovery method are Linux ("\n"), Apple ("\r") and Windows ("\r\n") row delimiters. + */ + record_delimiter?: string | string[] | Buffer | Buffer[]; + recordDelimiter?: string | string[] | Buffer | Buffer[]; + /** + * If true, ignore whitespace immediately preceding the delimiter (i.e. right-trim all fields), defaults to false. + * Does not remove whitespace in a quoted field. + */ + rtrim?: boolean; + /** + * Dont generate empty values for empty lines. + * Defaults to false + */ + skip_empty_lines?: boolean; + skipEmptyLines?: boolean; + /** + * Skip a line with error found inside and directly go process the next line. + */ + skip_lines_with_error?: boolean; + skipLinesWithError?: boolean; + /** + * Don't generate records for lines containing empty column values (column matching /\s*\/), defaults to false. + */ + skip_lines_with_empty_values?: boolean; + skipLinesWithEmptyValues?: boolean; + /** + * Stop handling records after the requested number of records. + */ + to?: number; + /** + * Stop handling records after the requested line number. + */ + to_line?: number; + toLine?: number; + /** + * If true, ignore whitespace immediately around the delimiter, defaults to false. + * Does not remove whitespace in a quoted field. + */ + trim?: boolean; + } + + interface Info { + /** + * Count the number of lines being fully commented. + */ + readonly comment_lines: number; + /** + * Count the number of processed empty lines. + */ + readonly empty_lines: number; + /** + * The number of lines encountered in the source dataset, start at 1 for the first line. + */ + readonly lines: number; + /** + * Count the number of processed records. + */ + readonly records: number; + /** + * Number of non uniform records when `relax_column_count` is true. + */ + readonly invalid_field_length: number; + } + + class CsvError extends Error { + readonly code: CsvErrorCode; + [key: string]: any; + + constructor(code: CsvErrorCode, message: string | string[], options?: Options, ...contexts: any[]); + } + + type CsvErrorCode = + 'CSV_INVALID_OPTION_BOM' + | 'CSV_INVALID_OPTION_CAST' + | 'CSV_INVALID_OPTION_CAST_DATE' + | 'CSV_INVALID_OPTION_COLUMNS' + | 'CSV_INVALID_OPTION_COLUMNS_DUPLICATES_TO_ARRAY' + | 'CSV_INVALID_OPTION_COMMENT' + | 'CSV_INVALID_OPTION_DELIMITER' + | 'CSV_INVALID_OPTION_ON_RECORD' + | 'CSV_INVALID_CLOSING_QUOTE' + | 'INVALID_OPENING_QUOTE' + | 'CSV_INVALID_COLUMN_MAPPING' + | 'CSV_INVALID_ARGUMENT' + | 'CSV_INVALID_COLUMN_DEFINITION' + | 'CSV_MAX_RECORD_SIZE' + | 'CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE' + | 'CSV_QUOTE_NOT_CLOSED' + | 'CSV_INCONSISTENT_RECORD_LENGTH' + | 'CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH' + | 'CSV_OPTION_COLUMNS_MISSING_NAME' +} diff --git a/node_modules/csv-parse/lib/index.js b/node_modules/csv-parse/lib/index.js new file mode 100644 index 00000000..d3cb4aa2 --- /dev/null +++ b/node_modules/csv-parse/lib/index.js @@ -0,0 +1,1246 @@ + +/* +CSV Parse + +Please look at the [project documentation](https://csv.js.org/parse/) for +additional information. +*/ + +const { Transform } = require('stream') +const ResizeableBuffer = require('./ResizeableBuffer') + +// white space characters +// https://en.wikipedia.org/wiki/Whitespace_character +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Character_Classes#Types +// \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff +const tab = 9 +const nl = 10 // \n, 0x0A in hexadecimal, 10 in decimal +const np = 12 +const cr = 13 // \r, 0x0D in hexadécimal, 13 in decimal +const space = 32 +const boms = { + // Note, the following are equals: + // Buffer.from("\ufeff") + // Buffer.from([239, 187, 191]) + // Buffer.from('EFBBBF', 'hex') + 'utf8': Buffer.from([239, 187, 191]), + // Note, the following are equals: + // Buffer.from "\ufeff", 'utf16le + // Buffer.from([255, 254]) + 'utf16le': Buffer.from([255, 254]) +} + +class Parser extends Transform { + constructor(opts = {}){ + super({...{readableObjectMode: true}, ...opts, encoding: null}) + this.__originalOptions = opts + this.__normalizeOptions(opts) + } + __normalizeOptions(opts){ + const options = {} + // Merge with user options + for(let opt in opts){ + options[underscore(opt)] = opts[opt] + } + // Normalize option `encoding` + // Note: defined first because other options depends on it + // to convert chars/strings into buffers. + if(options.encoding === undefined || options.encoding === true){ + options.encoding = 'utf8' + }else if(options.encoding === null || options.encoding === false){ + options.encoding = null + }else if(typeof options.encoding !== 'string' && options.encoding !== null){ + throw new CsvError('CSV_INVALID_OPTION_ENCODING', [ + 'Invalid option encoding:', + 'encoding must be a string or null to return a buffer,', + `got ${JSON.stringify(options.encoding)}` + ], options) + } + // Normalize option `bom` + if(options.bom === undefined || options.bom === null || options.bom === false){ + options.bom = false + }else if(options.bom !== true){ + throw new CsvError('CSV_INVALID_OPTION_BOM', [ + 'Invalid option bom:', 'bom must be true,', + `got ${JSON.stringify(options.bom)}` + ], options) + } + // Normalize option `cast` + let fnCastField = null + if(options.cast === undefined || options.cast === null || options.cast === false || options.cast === ''){ + options.cast = undefined + }else if(typeof options.cast === 'function'){ + fnCastField = options.cast + options.cast = true + }else if(options.cast !== true){ + throw new CsvError('CSV_INVALID_OPTION_CAST', [ + 'Invalid option cast:', 'cast must be true or a function,', + `got ${JSON.stringify(options.cast)}` + ], options) + } + // Normalize option `cast_date` + if(options.cast_date === undefined || options.cast_date === null || options.cast_date === false || options.cast_date === ''){ + options.cast_date = false + }else if(options.cast_date === true){ + options.cast_date = function(value){ + const date = Date.parse(value) + return !isNaN(date) ? new Date(date) : value + } + }else if(typeof options.cast_date !== 'function'){ + throw new CsvError('CSV_INVALID_OPTION_CAST_DATE', [ + 'Invalid option cast_date:', 'cast_date must be true or a function,', + `got ${JSON.stringify(options.cast_date)}` + ], options) + } + // Normalize option `columns` + let fnFirstLineToHeaders = null + if(options.columns === true){ + // Fields in the first line are converted as-is to columns + fnFirstLineToHeaders = undefined + }else if(typeof options.columns === 'function'){ + fnFirstLineToHeaders = options.columns + options.columns = true + }else if(Array.isArray(options.columns)){ + options.columns = normalizeColumnsArray(options.columns) + }else if(options.columns === undefined || options.columns === null || options.columns === false){ + options.columns = false + }else{ + throw new CsvError('CSV_INVALID_OPTION_COLUMNS', [ + 'Invalid option columns:', + 'expect an object, a function or true,', + `got ${JSON.stringify(options.columns)}` + ], options) + } + // Normalize option `columns_duplicates_to_array` + if(options.columns_duplicates_to_array === undefined || options.columns_duplicates_to_array === null || options.columns_duplicates_to_array === false){ + options.columns_duplicates_to_array = false + }else if(options.columns_duplicates_to_array !== true){ + throw new CsvError('CSV_INVALID_OPTION_COLUMNS_DUPLICATES_TO_ARRAY', [ + 'Invalid option columns_duplicates_to_array:', + 'expect an boolean,', + `got ${JSON.stringify(options.columns_duplicates_to_array)}` + ], options) + } + // Normalize option `comment` + if(options.comment === undefined || options.comment === null || options.comment === false || options.comment === ''){ + options.comment = null + }else{ + if(typeof options.comment === 'string'){ + options.comment = Buffer.from(options.comment, options.encoding) + } + if(!Buffer.isBuffer(options.comment)){ + throw new CsvError('CSV_INVALID_OPTION_COMMENT', [ + 'Invalid option comment:', + 'comment must be a buffer or a string,', + `got ${JSON.stringify(options.comment)}` + ], options) + } + } + // Normalize option `delimiter` + const delimiter_json = JSON.stringify(options.delimiter) + if(!Array.isArray(options.delimiter)) options.delimiter = [options.delimiter] + if(options.delimiter.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_DELIMITER', [ + 'Invalid option delimiter:', + 'delimiter must be a non empty string or buffer or array of string|buffer,', + `got ${delimiter_json}` + ], options) + } + options.delimiter = options.delimiter.map(function(delimiter){ + if(delimiter === undefined || delimiter === null || delimiter === false){ + return Buffer.from(',', options.encoding) + } + if(typeof delimiter === 'string'){ + delimiter = Buffer.from(delimiter, options.encoding) + } + if( !Buffer.isBuffer(delimiter) || delimiter.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_DELIMITER', [ + 'Invalid option delimiter:', + 'delimiter must be a non empty string or buffer or array of string|buffer,', + `got ${delimiter_json}` + ], options) + } + return delimiter + }) + // Normalize option `escape` + if(options.escape === undefined || options.escape === true){ + options.escape = Buffer.from('"', options.encoding) + }else if(typeof options.escape === 'string'){ + options.escape = Buffer.from(options.escape, options.encoding) + }else if (options.escape === null || options.escape === false){ + options.escape = null + } + if(options.escape !== null){ + if(!Buffer.isBuffer(options.escape)){ + throw new Error(`Invalid Option: escape must be a buffer, a string or a boolean, got ${JSON.stringify(options.escape)}`) + } + } + // Normalize option `from` + if(options.from === undefined || options.from === null){ + options.from = 1 + }else{ + if(typeof options.from === 'string' && /\d+/.test(options.from)){ + options.from = parseInt(options.from) + } + if(Number.isInteger(options.from)){ + if(options.from < 0){ + throw new Error(`Invalid Option: from must be a positive integer, got ${JSON.stringify(opts.from)}`) + } + }else{ + throw new Error(`Invalid Option: from must be an integer, got ${JSON.stringify(options.from)}`) + } + } + // Normalize option `from_line` + if(options.from_line === undefined || options.from_line === null){ + options.from_line = 1 + }else{ + if(typeof options.from_line === 'string' && /\d+/.test(options.from_line)){ + options.from_line = parseInt(options.from_line) + } + if(Number.isInteger(options.from_line)){ + if(options.from_line <= 0){ + throw new Error(`Invalid Option: from_line must be a positive integer greater than 0, got ${JSON.stringify(opts.from_line)}`) + } + }else{ + throw new Error(`Invalid Option: from_line must be an integer, got ${JSON.stringify(opts.from_line)}`) + } + } + // Normalize options `ignore_last_delimiters` + if(options.ignore_last_delimiters === undefined || options.ignore_last_delimiters === null){ + options.ignore_last_delimiters = false + }else if(typeof options.ignore_last_delimiters === 'number'){ + options.ignore_last_delimiters = Math.floor(options.ignore_last_delimiters) + if(options.ignore_last_delimiters === 0){ + options.ignore_last_delimiters = false + } + }else if(typeof options.ignore_last_delimiters !== 'boolean'){ + throw new CsvError('CSV_INVALID_OPTION_IGNORE_LAST_DELIMITERS', [ + 'Invalid option `ignore_last_delimiters`:', + 'the value must be a boolean value or an integer,', + `got ${JSON.stringify(options.ignore_last_delimiters)}` + ], options) + } + if(options.ignore_last_delimiters === true && options.columns === false){ + throw new CsvError('CSV_IGNORE_LAST_DELIMITERS_REQUIRES_COLUMNS', [ + 'The option `ignore_last_delimiters`', + 'requires the activation of the `columns` option' + ], options) + } + // Normalize option `info` + if(options.info === undefined || options.info === null || options.info === false){ + options.info = false + }else if(options.info !== true){ + throw new Error(`Invalid Option: info must be true, got ${JSON.stringify(options.info)}`) + } + // Normalize option `max_record_size` + if(options.max_record_size === undefined || options.max_record_size === null || options.max_record_size === false){ + options.max_record_size = 0 + }else if(Number.isInteger(options.max_record_size) && options.max_record_size >= 0){ + // Great, nothing to do + }else if(typeof options.max_record_size === 'string' && /\d+/.test(options.max_record_size)){ + options.max_record_size = parseInt(options.max_record_size) + }else{ + throw new Error(`Invalid Option: max_record_size must be a positive integer, got ${JSON.stringify(options.max_record_size)}`) + } + // Normalize option `objname` + if(options.objname === undefined || options.objname === null || options.objname === false){ + options.objname = undefined + }else if(Buffer.isBuffer(options.objname)){ + if(options.objname.length === 0){ + throw new Error(`Invalid Option: objname must be a non empty buffer`) + } + if(options.encoding === null){ + // Don't call `toString`, leave objname as a buffer + }else{ + options.objname = options.objname.toString(options.encoding) + } + }else if(typeof options.objname === 'string'){ + if(options.objname.length === 0){ + throw new Error(`Invalid Option: objname must be a non empty string`) + } + // Great, nothing to do + }else{ + throw new Error(`Invalid Option: objname must be a string or a buffer, got ${options.objname}`) + } + // Normalize option `on_record` + if(options.on_record === undefined || options.on_record === null){ + options.on_record = undefined + }else if(typeof options.on_record !== 'function'){ + throw new CsvError('CSV_INVALID_OPTION_ON_RECORD', [ + 'Invalid option `on_record`:', + 'expect a function,', + `got ${JSON.stringify(options.on_record)}` + ], options) + } + // Normalize option `quote` + if(options.quote === null || options.quote === false || options.quote === ''){ + options.quote = null + }else{ + if(options.quote === undefined || options.quote === true){ + options.quote = Buffer.from('"', options.encoding) + }else if(typeof options.quote === 'string'){ + options.quote = Buffer.from(options.quote, options.encoding) + } + if(!Buffer.isBuffer(options.quote)){ + throw new Error(`Invalid Option: quote must be a buffer or a string, got ${JSON.stringify(options.quote)}`) + } + } + // Normalize option `raw` + if(options.raw === undefined || options.raw === null || options.raw === false){ + options.raw = false + }else if(options.raw !== true){ + throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`) + } + // Normalize option `record_delimiter` + if(!options.record_delimiter){ + options.record_delimiter = [] + }else if(!Array.isArray(options.record_delimiter)){ + options.record_delimiter = [options.record_delimiter] + } + options.record_delimiter = options.record_delimiter.map( function(rd){ + if(typeof rd === 'string'){ + rd = Buffer.from(rd, options.encoding) + } + return rd + }) + // Normalize option `relax` + if(typeof options.relax === 'boolean'){ + // Great, nothing to do + }else if(options.relax === undefined || options.relax === null){ + options.relax = false + }else{ + throw new Error(`Invalid Option: relax must be a boolean, got ${JSON.stringify(options.relax)}`) + } + // Normalize option `relax_column_count` + if(typeof options.relax_column_count === 'boolean'){ + // Great, nothing to do + }else if(options.relax_column_count === undefined || options.relax_column_count === null){ + options.relax_column_count = false + }else{ + throw new Error(`Invalid Option: relax_column_count must be a boolean, got ${JSON.stringify(options.relax_column_count)}`) + } + if(typeof options.relax_column_count_less === 'boolean'){ + // Great, nothing to do + }else if(options.relax_column_count_less === undefined || options.relax_column_count_less === null){ + options.relax_column_count_less = false + }else{ + throw new Error(`Invalid Option: relax_column_count_less must be a boolean, got ${JSON.stringify(options.relax_column_count_less)}`) + } + if(typeof options.relax_column_count_more === 'boolean'){ + // Great, nothing to do + }else if(options.relax_column_count_more === undefined || options.relax_column_count_more === null){ + options.relax_column_count_more = false + }else{ + throw new Error(`Invalid Option: relax_column_count_more must be a boolean, got ${JSON.stringify(options.relax_column_count_more)}`) + } + // Normalize option `skip_empty_lines` + if(typeof options.skip_empty_lines === 'boolean'){ + // Great, nothing to do + }else if(options.skip_empty_lines === undefined || options.skip_empty_lines === null){ + options.skip_empty_lines = false + }else{ + throw new Error(`Invalid Option: skip_empty_lines must be a boolean, got ${JSON.stringify(options.skip_empty_lines)}`) + } + // Normalize option `skip_lines_with_empty_values` + if(typeof options.skip_lines_with_empty_values === 'boolean'){ + // Great, nothing to do + }else if(options.skip_lines_with_empty_values === undefined || options.skip_lines_with_empty_values === null){ + options.skip_lines_with_empty_values = false + }else{ + throw new Error(`Invalid Option: skip_lines_with_empty_values must be a boolean, got ${JSON.stringify(options.skip_lines_with_empty_values)}`) + } + // Normalize option `skip_lines_with_error` + if(typeof options.skip_lines_with_error === 'boolean'){ + // Great, nothing to do + }else if(options.skip_lines_with_error === undefined || options.skip_lines_with_error === null){ + options.skip_lines_with_error = false + }else{ + throw new Error(`Invalid Option: skip_lines_with_error must be a boolean, got ${JSON.stringify(options.skip_lines_with_error)}`) + } + // Normalize option `rtrim` + if(options.rtrim === undefined || options.rtrim === null || options.rtrim === false){ + options.rtrim = false + }else if(options.rtrim !== true){ + throw new Error(`Invalid Option: rtrim must be a boolean, got ${JSON.stringify(options.rtrim)}`) + } + // Normalize option `ltrim` + if(options.ltrim === undefined || options.ltrim === null || options.ltrim === false){ + options.ltrim = false + }else if(options.ltrim !== true){ + throw new Error(`Invalid Option: ltrim must be a boolean, got ${JSON.stringify(options.ltrim)}`) + } + // Normalize option `trim` + if(options.trim === undefined || options.trim === null || options.trim === false){ + options.trim = false + }else if(options.trim !== true){ + throw new Error(`Invalid Option: trim must be a boolean, got ${JSON.stringify(options.trim)}`) + } + // Normalize options `trim`, `ltrim` and `rtrim` + if(options.trim === true && opts.ltrim !== false){ + options.ltrim = true + }else if(options.ltrim !== true){ + options.ltrim = false + } + if(options.trim === true && opts.rtrim !== false){ + options.rtrim = true + }else if(options.rtrim !== true){ + options.rtrim = false + } + // Normalize option `to` + if(options.to === undefined || options.to === null){ + options.to = -1 + }else{ + if(typeof options.to === 'string' && /\d+/.test(options.to)){ + options.to = parseInt(options.to) + } + if(Number.isInteger(options.to)){ + if(options.to <= 0){ + throw new Error(`Invalid Option: to must be a positive integer greater than 0, got ${JSON.stringify(opts.to)}`) + } + }else{ + throw new Error(`Invalid Option: to must be an integer, got ${JSON.stringify(opts.to)}`) + } + } + // Normalize option `to_line` + if(options.to_line === undefined || options.to_line === null){ + options.to_line = -1 + }else{ + if(typeof options.to_line === 'string' && /\d+/.test(options.to_line)){ + options.to_line = parseInt(options.to_line) + } + if(Number.isInteger(options.to_line)){ + if(options.to_line <= 0){ + throw new Error(`Invalid Option: to_line must be a positive integer greater than 0, got ${JSON.stringify(opts.to_line)}`) + } + }else{ + throw new Error(`Invalid Option: to_line must be an integer, got ${JSON.stringify(opts.to_line)}`) + } + } + this.info = { + comment_lines: 0, + empty_lines: 0, + invalid_field_length: 0, + lines: 1, + records: 0 + } + this.options = options + this.state = { + bomSkipped: false, + castField: fnCastField, + commenting: false, + // Current error encountered by a record + error: undefined, + enabled: options.from_line === 1, + escaping: false, + // escapeIsQuote: options.escape === options.quote, + escapeIsQuote: Buffer.isBuffer(options.escape) && Buffer.isBuffer(options.quote) && Buffer.compare(options.escape, options.quote) === 0, + expectedRecordLength: options.columns === null ? 0 : options.columns.length, + field: new ResizeableBuffer(20), + firstLineToHeaders: fnFirstLineToHeaders, + info: Object.assign({}, this.info), + needMoreDataSize: Math.max( + // Skip if the remaining buffer smaller than comment + options.comment !== null ? options.comment.length : 0, + // Skip if the remaining buffer can be delimiter + ...options.delimiter.map( (delimiter) => delimiter.length), + // Skip if the remaining buffer can be escape sequence + options.quote !== null ? options.quote.length : 0, + ), + previousBuf: undefined, + quoting: false, + stop: false, + rawBuffer: new ResizeableBuffer(100), + record: [], + recordHasError: false, + record_length: 0, + recordDelimiterMaxLength: options.record_delimiter.length === 0 ? 2 : Math.max(...options.record_delimiter.map( (v) => v.length)), + trimChars: [Buffer.from(' ', options.encoding)[0], Buffer.from('\t', options.encoding)[0]], + wasQuoting: false, + wasRowDelimiter: false + } + } + // Implementation of `Transform._transform` + _transform(buf, encoding, callback){ + if(this.state.stop === true){ + return + } + const err = this.__parse(buf, false) + if(err !== undefined){ + this.state.stop = true + } + callback(err) + } + // Implementation of `Transform._flush` + _flush(callback){ + if(this.state.stop === true){ + return + } + const err = this.__parse(undefined, true) + callback(err) + } + // Central parser implementation + __parse(nextBuf, end){ + const {bom, comment, escape, from_line, info, ltrim, max_record_size, quote, raw, relax, rtrim, skip_empty_lines, to, to_line} = this.options + let {record_delimiter} = this.options + const {bomSkipped, previousBuf, rawBuffer, escapeIsQuote} = this.state + let buf + if(previousBuf === undefined){ + if(nextBuf === undefined){ + // Handle empty string + this.push(null) + return + }else{ + buf = nextBuf + } + }else if(previousBuf !== undefined && nextBuf === undefined){ + buf = previousBuf + }else{ + buf = Buffer.concat([previousBuf, nextBuf]) + } + // Handle UTF BOM + if(bomSkipped === false){ + if(bom === false){ + this.state.bomSkipped = true + }else if(buf.length < 3){ + // No enough data + if(end === false){ + // Wait for more data + this.state.previousBuf = buf + return + } + }else{ + for(let encoding in boms){ + if(boms[encoding].compare(buf, 0, boms[encoding].length) === 0){ + // Skip BOM + buf = buf.slice(boms[encoding].length) + // Renormalize original options with the new encoding + this.__normalizeOptions({...this.__originalOptions, encoding: encoding}) + break + } + } + this.state.bomSkipped = true + } + } + const bufLen = buf.length + let pos + for(pos = 0; pos < bufLen; pos++){ + // Ensure we get enough space to look ahead + // There should be a way to move this out of the loop + if(this.__needMoreData(pos, bufLen, end)){ + break + } + if(this.state.wasRowDelimiter === true){ + this.info.lines++ + if(info === true && this.state.record.length === 0 && this.state.field.length === 0 && this.state.wasQuoting === false){ + this.state.info = Object.assign({}, this.info) + } + this.state.wasRowDelimiter = false + } + if(to_line !== -1 && this.info.lines > to_line){ + this.state.stop = true + this.push(null) + return + } + // Auto discovery of record_delimiter, unix, mac and windows supported + if(this.state.quoting === false && record_delimiter.length === 0){ + const record_delimiterCount = this.__autoDiscoverRecordDelimiter(buf, pos) + if(record_delimiterCount){ + record_delimiter = this.options.record_delimiter + } + } + const chr = buf[pos] + if(raw === true){ + rawBuffer.append(chr) + } + if((chr === cr || chr === nl) && this.state.wasRowDelimiter === false ){ + this.state.wasRowDelimiter = true + } + // Previous char was a valid escape char + // treat the current char as a regular char + if(this.state.escaping === true){ + this.state.escaping = false + }else{ + // Escape is only active inside quoted fields + // We are quoting, the char is an escape chr and there is a chr to escape + // if(escape !== null && this.state.quoting === true && chr === escape && pos + 1 < bufLen){ + if(escape !== null && this.state.quoting === true && this.__isEscape(buf, pos, chr) && pos + escape.length < bufLen){ + if(escapeIsQuote){ + if(this.__isQuote(buf, pos+escape.length)){ + this.state.escaping = true + pos += escape.length - 1 + continue + } + }else{ + this.state.escaping = true + pos += escape.length - 1 + continue + } + } + // Not currently escaping and chr is a quote + // TODO: need to compare bytes instead of single char + if(this.state.commenting === false && this.__isQuote(buf, pos)){ + if(this.state.quoting === true){ + const nextChr = buf[pos+quote.length] + const isNextChrTrimable = rtrim && this.__isCharTrimable(nextChr) + const isNextChrComment = comment !== null && this.__compareBytes(comment, buf, pos+quote.length, nextChr) + const isNextChrDelimiter = this.__isDelimiter(buf, pos+quote.length, nextChr) + const isNextChrRecordDelimiter = record_delimiter.length === 0 ? this.__autoDiscoverRecordDelimiter(buf, pos+quote.length) : this.__isRecordDelimiter(nextChr, buf, pos+quote.length) + // Escape a quote + // Treat next char as a regular character + if(escape !== null && this.__isEscape(buf, pos, chr) && this.__isQuote(buf, pos + escape.length)){ + pos += escape.length - 1 + }else if(!nextChr || isNextChrDelimiter || isNextChrRecordDelimiter || isNextChrComment || isNextChrTrimable){ + this.state.quoting = false + this.state.wasQuoting = true + pos += quote.length - 1 + continue + }else if(relax === false){ + const err = this.__error( + new CsvError('CSV_INVALID_CLOSING_QUOTE', [ + 'Invalid Closing Quote:', + `got "${String.fromCharCode(nextChr)}"`, + `at line ${this.info.lines}`, + 'instead of delimiter, record delimiter, trimable character', + '(if activated) or comment', + ], this.options, this.__context()) + ) + if(err !== undefined) return err + }else{ + this.state.quoting = false + this.state.wasQuoting = true + this.state.field.prepend(quote) + pos += quote.length - 1 + } + }else{ + if(this.state.field.length !== 0){ + // In relax mode, treat opening quote preceded by chrs as regular + if( relax === false ){ + const err = this.__error( + new CsvError('INVALID_OPENING_QUOTE', [ + 'Invalid Opening Quote:', + `a quote is found inside a field at line ${this.info.lines}`, + ], this.options, this.__context(), { + field: this.state.field, + }) + ) + if(err !== undefined) return err + } + }else{ + this.state.quoting = true + pos += quote.length - 1 + continue + } + } + } + if(this.state.quoting === false){ + let recordDelimiterLength = this.__isRecordDelimiter(chr, buf, pos) + if(recordDelimiterLength !== 0){ + // Do not emit comments which take a full line + const skipCommentLine = this.state.commenting && (this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0) + if(skipCommentLine){ + this.info.comment_lines++ + // Skip full comment line + }else{ + // Activate records emition if above from_line + if(this.state.enabled === false && this.info.lines + (this.state.wasRowDelimiter === true ? 1: 0) >= from_line){ + this.state.enabled = true + this.__resetField() + this.__resetRecord() + pos += recordDelimiterLength - 1 + continue + } + // Skip if line is empty and skip_empty_lines activated + if(skip_empty_lines === true && this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0){ + this.info.empty_lines++ + pos += recordDelimiterLength - 1 + continue + } + const errField = this.__onField() + if(errField !== undefined) return errField + const errRecord = this.__onRecord() + if(errRecord !== undefined) return errRecord + if(to !== -1 && this.info.records >= to){ + this.state.stop = true + this.push(null) + return + } + } + this.state.commenting = false + pos += recordDelimiterLength - 1 + continue + } + if(this.state.commenting){ + continue + } + const commentCount = comment === null ? 0 : this.__compareBytes(comment, buf, pos, chr) + if(commentCount !== 0){ + this.state.commenting = true + continue + } + let delimiterLength = this.__isDelimiter(buf, pos, chr) + if(delimiterLength !== 0){ + const errField = this.__onField() + if(errField !== undefined) return errField + pos += delimiterLength - 1 + continue + } + } + } + if(this.state.commenting === false){ + if(max_record_size !== 0 && this.state.record_length + this.state.field.length > max_record_size){ + const err = this.__error( + new CsvError('CSV_MAX_RECORD_SIZE', [ + 'Max Record Size:', + 'record exceed the maximum number of tolerated bytes', + `of ${max_record_size}`, + `at line ${this.info.lines}`, + ], this.options, this.__context()) + ) + if(err !== undefined) return err + } + } + + const lappend = ltrim === false || this.state.quoting === true || this.state.field.length !== 0 || !this.__isCharTrimable(chr) + // rtrim in non quoting is handle in __onField + const rappend = rtrim === false || this.state.wasQuoting === false + if( lappend === true && rappend === true ){ + this.state.field.append(chr) + }else if(rtrim === true && !this.__isCharTrimable(chr)){ + const err = this.__error( + new CsvError('CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE', [ + 'Invalid Closing Quote:', + 'found non trimable byte after quote', + `at line ${this.info.lines}`, + ], this.options, this.__context()) + ) + if(err !== undefined) return err + } + } + if(end === true){ + // Ensure we are not ending in a quoting state + if(this.state.quoting === true){ + const err = this.__error( + new CsvError('CSV_QUOTE_NOT_CLOSED', [ + 'Quote Not Closed:', + `the parsing is finished with an opening quote at line ${this.info.lines}`, + ], this.options, this.__context()) + ) + if(err !== undefined) return err + }else{ + // Skip last line if it has no characters + if(this.state.wasQuoting === true || this.state.record.length !== 0 || this.state.field.length !== 0){ + const errField = this.__onField() + if(errField !== undefined) return errField + const errRecord = this.__onRecord() + if(errRecord !== undefined) return errRecord + }else if(this.state.wasRowDelimiter === true){ + this.info.empty_lines++ + }else if(this.state.commenting === true){ + this.info.comment_lines++ + } + } + }else{ + this.state.previousBuf = buf.slice(pos) + } + if(this.state.wasRowDelimiter === true){ + this.info.lines++ + this.state.wasRowDelimiter = false + } + } + __onRecord(){ + const {columns, columns_duplicates_to_array, encoding, info, from, relax_column_count, relax_column_count_less, relax_column_count_more, raw, skip_lines_with_empty_values} = this.options + const {enabled, record} = this.state + if(enabled === false){ + return this.__resetRecord() + } + // Convert the first line into column names + const recordLength = record.length + if(columns === true){ + if(isRecordEmpty(record)){ + this.__resetRecord() + return + } + return this.__firstLineToColumns(record) + } + if(columns === false && this.info.records === 0){ + this.state.expectedRecordLength = recordLength + } + if(recordLength !== this.state.expectedRecordLength){ + const err = columns === false ? + // Todo: rename CSV_INCONSISTENT_RECORD_LENGTH to + // CSV_RECORD_INCONSISTENT_FIELDS_LENGTH + new CsvError('CSV_INCONSISTENT_RECORD_LENGTH', [ + 'Invalid Record Length:', + `expect ${this.state.expectedRecordLength},`, + `got ${recordLength} on line ${this.info.lines}`, + ], this.options, this.__context(), { + record: record, + }) + : + // Todo: rename CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH to + // CSV_RECORD_INCONSISTENT_COLUMNS + new CsvError('CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH', [ + 'Invalid Record Length:', + `columns length is ${columns.length},`, // rename columns + `got ${recordLength} on line ${this.info.lines}`, + ], this.options, this.__context(), { + record: record, + }) + if(relax_column_count === true || + (relax_column_count_less === true && recordLength < this.state.expectedRecordLength) || + (relax_column_count_more === true && recordLength > this.state.expectedRecordLength) ){ + this.info.invalid_field_length++ + this.state.error = err + // Error is undefined with skip_lines_with_error + }else{ + const finalErr = this.__error(err) + if(finalErr) return finalErr + } + } + if(skip_lines_with_empty_values === true){ + if(isRecordEmpty(record)){ + this.__resetRecord() + return + } + } + if(this.state.recordHasError === true){ + this.__resetRecord() + this.state.recordHasError = false + return + } + this.info.records++ + if(from === 1 || this.info.records >= from){ + if(columns !== false){ + const obj = {} + // Transform record array to an object + for(let i = 0, l = record.length; i < l; i++){ + if(columns[i] === undefined || columns[i].disabled) continue + // Turn duplicate columns into an array + if (columns_duplicates_to_array === true && obj[columns[i].name]) { + if (Array.isArray(obj[columns[i].name])) { + obj[columns[i].name] = obj[columns[i].name].concat(record[i]) + } else { + obj[columns[i].name] = [obj[columns[i].name], record[i]] + } + } else { + obj[columns[i].name] = record[i] + } + } + const {objname} = this.options + if(objname === undefined){ + if(raw === true || info === true){ + const err = this.__push(Object.assign( + {record: obj}, + (raw === true ? {raw: this.state.rawBuffer.toString(encoding)}: {}), + (info === true ? {info: this.state.info}: {}) + )) + if(err){ + return err + } + }else{ + const err = this.__push(obj) + if(err){ + return err + } + } + }else{ + if(raw === true || info === true){ + const err = this.__push(Object.assign( + {record: [obj[objname], obj]}, + raw === true ? {raw: this.state.rawBuffer.toString(encoding)}: {}, + info === true ? {info: this.state.info}: {} + )) + if(err){ + return err + } + }else{ + const err = this.__push([obj[objname], obj]) + if(err){ + return err + } + } + } + }else{ + if(raw === true || info === true){ + const err = this.__push(Object.assign( + {record: record}, + raw === true ? {raw: this.state.rawBuffer.toString(encoding)}: {}, + info === true ? {info: this.state.info}: {} + )) + if(err){ + return err + } + }else{ + const err = this.__push(record) + if(err){ + return err + } + } + } + } + this.__resetRecord() + } + __firstLineToColumns(record){ + const {firstLineToHeaders} = this.state + try{ + const headers = firstLineToHeaders === undefined ? record : firstLineToHeaders.call(null, record) + if(!Array.isArray(headers)){ + return this.__error( + new CsvError('CSV_INVALID_COLUMN_MAPPING', [ + 'Invalid Column Mapping:', + 'expect an array from column function,', + `got ${JSON.stringify(headers)}` + ], this.options, this.__context(), { + headers: headers, + }) + ) + } + const normalizedHeaders = normalizeColumnsArray(headers) + this.state.expectedRecordLength = normalizedHeaders.length + this.options.columns = normalizedHeaders + this.__resetRecord() + return + }catch(err){ + return err + } + } + __resetRecord(){ + if(this.options.raw === true){ + this.state.rawBuffer.reset() + } + this.state.error = undefined + this.state.record = [] + this.state.record_length = 0 + } + __onField(){ + const {cast, encoding, rtrim, max_record_size} = this.options + const {enabled, wasQuoting} = this.state + // Short circuit for the from_line options + if(enabled === false){ /* this.options.columns !== true && */ + return this.__resetField() + } + let field = this.state.field.toString(encoding) + if(rtrim === true && wasQuoting === false){ + field = field.trimRight() + } + if(cast === true){ + const [err, f] = this.__cast(field) + if(err !== undefined) return err + field = f + } + this.state.record.push(field) + // Increment record length if record size must not exceed a limit + if(max_record_size !== 0 && typeof field === 'string'){ + this.state.record_length += field.length + } + this.__resetField() + } + __resetField(){ + this.state.field.reset() + this.state.wasQuoting = false + } + __push(record){ + const {on_record} = this.options + if(on_record !== undefined){ + const context = this.__context() + try{ + record = on_record.call(null, record, context) + }catch(err){ + return err + } + if(record === undefined || record === null){ return } + } + this.push(record) + } + // Return a tuple with the error and the casted value + __cast(field){ + const {columns, relax_column_count} = this.options + const isColumns = Array.isArray(columns) + // Dont loose time calling cast + // because the final record is an object + // and this field can't be associated to a key present in columns + if( isColumns === true && relax_column_count && this.options.columns.length <= this.state.record.length ){ + return [undefined, undefined] + } + const context = this.__context() + if(this.state.castField !== null){ + try{ + return [undefined, this.state.castField.call(null, field, context)] + }catch(err){ + return [err] + } + } + if(this.__isFloat(field)){ + return [undefined, parseFloat(field)] + }else if(this.options.cast_date !== false){ + return [undefined, this.options.cast_date.call(null, field, context)] + } + return [undefined, field] + } + // Helper to test if a character is a space or a line delimiter + __isCharTrimable(chr){ + return chr === space || chr === tab || chr === cr || chr === nl || chr === np + } + // Keep it in case we implement the `cast_int` option + // __isInt(value){ + // // return Number.isInteger(parseInt(value)) + // // return !isNaN( parseInt( obj ) ); + // return /^(\-|\+)?[1-9][0-9]*$/.test(value) + // } + __isFloat(value){ + return (value - parseFloat( value ) + 1) >= 0 // Borrowed from jquery + } + __compareBytes(sourceBuf, targetBuf, targetPos, firstByte){ + if(sourceBuf[0] !== firstByte) return 0 + const sourceLength = sourceBuf.length + for(let i = 1; i < sourceLength; i++){ + if(sourceBuf[i] !== targetBuf[targetPos+i]) return 0 + } + return sourceLength + } + __needMoreData(i, bufLen, end){ + if(end) return false + const {quote} = this.options + const {quoting, needMoreDataSize, recordDelimiterMaxLength} = this.state + const numOfCharLeft = bufLen - i - 1 + const requiredLength = Math.max( + needMoreDataSize, + // Skip if the remaining buffer smaller than record delimiter + recordDelimiterMaxLength, + // Skip if the remaining buffer can be record delimiter following the closing quote + // 1 is for quote.length + quoting ? (quote.length + recordDelimiterMaxLength) : 0, + ) + return numOfCharLeft < requiredLength + } + __isDelimiter(buf, pos, chr){ + const {delimiter, ignore_last_delimiters} = this.options + if(ignore_last_delimiters === true && this.state.record.length === this.options.columns.length - 1){ + return 0 + }else if(ignore_last_delimiters !== false && typeof ignore_last_delimiters === 'number' && this.state.record.length === ignore_last_delimiters - 1){ + return 0 + } + loop1: for(let i = 0; i < delimiter.length; i++){ + const del = delimiter[i] + if(del[0] === chr){ + for(let j = 1; j < del.length; j++){ + if(del[j] !== buf[pos+j]) continue loop1 + } + return del.length + } + } + return 0 + } + __isRecordDelimiter(chr, buf, pos){ + const {record_delimiter} = this.options + const recordDelimiterLength = record_delimiter.length + loop1: for(let i = 0; i < recordDelimiterLength; i++){ + const rd = record_delimiter[i] + const rdLength = rd.length + if(rd[0] !== chr){ + continue + } + for(let j = 1; j < rdLength; j++){ + if(rd[j] !== buf[pos+j]){ + continue loop1 + } + } + return rd.length + } + return 0 + } + __isEscape(buf, pos, chr){ + const {escape} = this.options + if(escape === null) return false + const l = escape.length + if(escape[0] === chr){ + for(let i = 0; i < l; i++){ + if(escape[i] !== buf[pos+i]){ + return false + } + } + return true + } + return false + } + __isQuote(buf, pos){ + const {quote} = this.options + if(quote === null) return false + const l = quote.length + for(let i = 0; i < l; i++){ + if(quote[i] !== buf[pos+i]){ + return false + } + } + return true + } + __autoDiscoverRecordDelimiter(buf, pos){ + const {encoding} = this.options + const chr = buf[pos] + if(chr === cr){ + if(buf[pos+1] === nl){ + this.options.record_delimiter.push(Buffer.from('\r\n', encoding)) + this.state.recordDelimiterMaxLength = 2 + return 2 + }else{ + this.options.record_delimiter.push(Buffer.from('\r', encoding)) + this.state.recordDelimiterMaxLength = 1 + return 1 + } + }else if(chr === nl){ + this.options.record_delimiter.push(Buffer.from('\n', encoding)) + this.state.recordDelimiterMaxLength = 1 + return 1 + } + return 0 + } + __error(msg){ + const {skip_lines_with_error} = this.options + const err = typeof msg === 'string' ? new Error(msg) : msg + if(skip_lines_with_error){ + this.state.recordHasError = true + this.emit('skip', err) + return undefined + }else{ + return err + } + } + __context(){ + const {columns} = this.options + const isColumns = Array.isArray(columns) + return { + column: isColumns === true ? + ( columns.length > this.state.record.length ? + columns[this.state.record.length].name : + null + ) : + this.state.record.length, + empty_lines: this.info.empty_lines, + error: this.state.error, + header: columns === true, + index: this.state.record.length, + invalid_field_length: this.info.invalid_field_length, + quoting: this.state.wasQuoting, + lines: this.info.lines, + records: this.info.records + } + } +} + +const parse = function(){ + let data, options, callback + for(let i in arguments){ + const argument = arguments[i] + const type = typeof argument + if(data === undefined && (typeof argument === 'string' || Buffer.isBuffer(argument))){ + data = argument + }else if(options === undefined && isObject(argument)){ + options = argument + }else if(callback === undefined && type === 'function'){ + callback = argument + }else{ + throw new CsvError('CSV_INVALID_ARGUMENT', [ + 'Invalid argument:', + `got ${JSON.stringify(argument)} at index ${i}` + ], this.options) + } + } + const parser = new Parser(options) + if(callback){ + const records = options === undefined || options.objname === undefined ? [] : {} + parser.on('readable', function(){ + let record + while((record = this.read()) !== null){ + if(options === undefined || options.objname === undefined){ + records.push(record) + }else{ + records[record[0]] = record[1] + } + } + }) + parser.on('error', function(err){ + callback(err, undefined, parser.info) + }) + parser.on('end', function(){ + callback(undefined, records, parser.info) + }) + } + if(data !== undefined){ + // Give a chance for events to be registered later + if(typeof setImmediate === 'function'){ + setImmediate(function(){ + parser.write(data) + parser.end() + }) + }else{ + parser.write(data) + parser.end() + } + } + return parser +} + +class CsvError extends Error { + constructor(code, message, options, ...contexts) { + if(Array.isArray(message)) message = message.join(' ') + super(message) + if(Error.captureStackTrace !== undefined){ + Error.captureStackTrace(this, CsvError) + } + this.code = code + for(const context of contexts){ + for(const key in context){ + const value = context[key] + this[key] = Buffer.isBuffer(value) ? value.toString(options.encoding) : value == null ? value : JSON.parse(JSON.stringify(value)) + } + } + } +} + +parse.Parser = Parser + +parse.CsvError = CsvError + +module.exports = parse + +const underscore = function(str){ + return str.replace(/([A-Z])/g, function(_, match){ + return '_' + match.toLowerCase() + }) +} + +const isObject = function(obj){ + return (typeof obj === 'object' && obj !== null && !Array.isArray(obj)) +} + +const isRecordEmpty = function(record){ + return record.every( (field) => field == null || field.toString && field.toString().trim() === '' ) +} + +const normalizeColumnsArray = function(columns){ + const normalizedColumns = []; + for(let i = 0, l = columns.length; i < l; i++){ + const column = columns[i] + if(column === undefined || column === null || column === false){ + normalizedColumns[i] = { disabled: true } + }else if(typeof column === 'string'){ + normalizedColumns[i] = { name: column } + }else if(isObject(column)){ + if(typeof column.name !== 'string'){ + throw new CsvError('CSV_OPTION_COLUMNS_MISSING_NAME', [ + 'Option columns missing name:', + `property "name" is required at position ${i}`, + 'when column is an object literal' + ]) + } + normalizedColumns[i] = column + }else{ + throw new CsvError('CSV_INVALID_COLUMN_DEFINITION', [ + 'Invalid column definition:', + 'expect a string or a literal object,', + `got ${JSON.stringify(column)} at position ${i}` + ]) + } + } + return normalizedColumns; +} diff --git a/node_modules/csv-parse/lib/sync.d.ts b/node_modules/csv-parse/lib/sync.d.ts new file mode 100644 index 00000000..7886698e --- /dev/null +++ b/node_modules/csv-parse/lib/sync.d.ts @@ -0,0 +1,6 @@ +import * as csvParse from './index'; + +export = parse; + +declare function parse(input: Buffer | string, options?: csvParse.Options): any; +declare namespace parse {} \ No newline at end of file diff --git a/node_modules/csv-parse/lib/sync.js b/node_modules/csv-parse/lib/sync.js new file mode 100644 index 00000000..3f592de7 --- /dev/null +++ b/node_modules/csv-parse/lib/sync.js @@ -0,0 +1,25 @@ + +const parse = require('.') + +module.exports = function(data, options={}){ + if(typeof data === 'string'){ + data = Buffer.from(data) + } + const records = options && options.objname ? {} : [] + const parser = new parse.Parser(options) + parser.push = function(record){ + if(record === null){ + return + } + if(options.objname === undefined) + records.push(record) + else{ + records[record[0]] = record[1] + } + } + const err1 = parser.__parse(data, false) + if(err1 !== undefined) throw err1 + const err2 = parser.__parse(undefined, true) + if(err2 !== undefined) throw err2 + return records +} diff --git a/node_modules/csv-parse/package.json b/node_modules/csv-parse/package.json new file mode 100644 index 00000000..865cbaee --- /dev/null +++ b/node_modules/csv-parse/package.json @@ -0,0 +1,185 @@ +{ + "_from": "csv-parse", + "_id": "csv-parse@4.15.3", + "_inBundle": false, + "_integrity": "sha512-jlTqDvLdHnYMSr08ynNfk4IAUSJgJjTKy2U5CQBSu4cN9vQOJonLVZP4Qo4gKKrIgIQ5dr07UwOJdi+lRqT12w==", + "_location": "/csv-parse", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "csv-parse", + "name": "csv-parse", + "escapedName": "csv-parse", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.15.3.tgz", + "_shasum": "8a62759617a920c328cb31c351b05053b8f92b10", + "_spec": "csv-parse", + "_where": "C:\\Users\\rin\\Desktop\\final", + "author": { + "name": "David Worms", + "email": "david@adaltas.com", + "url": "https://www.adaltas.com" + }, + "bugs": { + "url": "https://github.com/wdavidw/node-csv-parse/issues" + }, + "bundleDependencies": false, + "coffeelintConfig": { + "indentation": { + "level": "error", + "value": 2 + }, + "line_endings": { + "level": "error", + "value": "unix" + }, + "max_line_length": { + "level": "ignore" + } + }, + "contributors": [ + { + "name": "David Worms", + "email": "david@adaltas.com", + "url": "https://www.adaltas.com" + }, + { + "name": "Will White", + "url": "https://github.com/willwhite" + }, + { + "name": "Justin Latimer", + "url": "https://github.com/justinlatimer" + }, + { + "name": "jonseymour", + "url": "https://github.com/jonseymour" + }, + { + "name": "pascalopitz", + "url": "https://github.com/pascalopitz" + }, + { + "name": "Josh Pschorr", + "url": "https://github.com/jpschorr" + }, + { + "name": "Elad Ben-Israel", + "url": "https://github.com/eladb" + }, + { + "name": "Philippe Plantier", + "url": "https://github.com/phipla" + }, + { + "name": "Tim Oxley", + "url": "https://github.com/timoxley" + }, + { + "name": "Damon Oehlman", + "url": "https://github.com/DamonOehlman" + }, + { + "name": "Alexandru Topliceanu", + "url": "https://github.com/topliceanu" + }, + { + "name": "Visup", + "url": "https://github.com/visup" + }, + { + "name": "Edmund von der Burg", + "url": "https://github.com/evdb" + }, + { + "name": "Douglas Christopher Wilson", + "url": "https://github.com/dougwilson" + }, + { + "name": "Joe Eaves", + "url": "https://github.com/Joeasaurus" + }, + { + "name": "Mark Stosberg", + "url": "https://github.com/markstos" + } + ], + "deprecated": false, + "description": "CSV parsing implementing the Node.js `stream.Transform` API", + "devDependencies": { + "@babel/cli": "^7.12.1", + "@babel/core": "^7.12.3", + "@babel/preset-env": "^7.12.1", + "@types/mocha": "^8.0.4", + "@types/node": "^14.14.7", + "babelify": "^10.0.0", + "browserify": "^17.0.0", + "coffeescript": "^2.5.1", + "csv-generate": "^3.2.4", + "csv-spectrum": "^1.0.0", + "each": "^1.2.2", + "eslint": "^7.13.0", + "express": "^4.17.1", + "mocha": "^8.2.1", + "pad": "^3.2.0", + "should": "^13.2.3", + "stream-transform": "^2.0.2", + "ts-node": "^9.0.0", + "typescript": "^4.0.5" + }, + "files": [ + "/lib" + ], + "homepage": "https://csv.js.org/parse/", + "keywords": [ + "csv", + "parse", + "parser", + "convert", + "tsv", + "stream" + ], + "license": "MIT", + "main": "./lib", + "mocha": { + "throw-deprecation": true, + "require": [ + "should", + "coffeescript/register", + "ts-node/register" + ], + "inline-diffs": true, + "timeout": 40000, + "reporter": "spec", + "recursive": true + }, + "name": "csv-parse", + "repository": { + "type": "git", + "url": "git+https://github.com/wdavidw/node-csv-parse.git" + }, + "scripts": { + "build": "npm run build:babel && npm run build:browserify", + "build:babel": "cd lib && babel *.js -d es5 && cd ..", + "build:browserify": "browserify lib/index.js --transform babelify --standalone parse > lib/browser/index.js && browserify lib/sync.js --transform babelify --standalone parse > lib/browser/sync.js", + "lint": "eslint lib/*.js", + "major": "npm version major -m 'Bump to version %s'", + "minor": "npm version minor -m 'Bump to version %s'", + "patch": "npm version patch -m 'Bump to version %s'", + "postversion": "git push && git push --tags && npm publish", + "pretest": "npm run build", + "preversion": "grep '## Trunk' CHANGELOG.md && npm test && cp lib/*.ts lib/es5 && git add lib/es5/*.ts", + "test": "npm run lint && TS_NODE_COMPILER_OPTIONS='{\"strictNullChecks\":true}' mocha test/**/*.{coffee,ts}", + "version": "version=`grep '^ \"version\": ' package.json | sed 's/.*\"\\([0-9\\.]*\\)\".*/\\1/'` && sed -i \"s/## Trunk/## Version $version/\" CHANGELOG.md && git add CHANGELOG.md" + }, + "types": "./lib/index.d.ts", + "version": "4.15.3" +} diff --git a/node_modules/d3-array/LICENSE b/node_modules/d3-array/LICENSE new file mode 100644 index 00000000..894ddc65 --- /dev/null +++ b/node_modules/d3-array/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2020 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-array/README.md b/node_modules/d3-array/README.md new file mode 100644 index 00000000..72b8a0a5 --- /dev/null +++ b/node_modules/d3-array/README.md @@ -0,0 +1,871 @@ +# d3-array + +Data in JavaScript is often represented by an iterable (such as an [array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array), [set](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Set) or [generator](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Generator)), and so iterable manipulation is a common task when analyzing or visualizing data. For example, you might take a contiguous slice (subset) of an array, filter an array using a predicate function, or map an array to a parallel set of values using a transform function. Before looking at the methods that d3-array provides, familiarize yourself with the powerful [array methods built-in to JavaScript](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array). + +JavaScript includes **mutation methods** that modify the array: + +* [*array*.pop](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/pop) - Remove the last element from the array. +* [*array*.push](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/push) - Add one or more elements to the end of the array. +* [*array*.reverse](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse) - Reverse the order of the elements of the array. +* [*array*.shift](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/shift) - Remove the first element from the array. +* [*array*.sort](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) - Sort the elements of the array. +* [*array*.splice](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) - Add or remove elements from the array. +* [*array*.unshift](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift) - Add one or more elements to the front of the array. + +There are also **access methods** that return some representation of the array: + +* [*array*.concat](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/concat) - Join the array with other array(s) or value(s). +* [*array*.join](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/join) - Join all elements of the array into a string. +* [*array*.slice](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/slice) - Extract a section of the array. +* [*array*.indexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) - Find the first occurrence of a value within the array. +* [*array*.lastIndexOf](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf) - Find the last occurrence of a value within the array. + +And finally **iteration methods** that apply functions to elements in the array: + +* [*array*.filter](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) - Create a new array with only the elements for which a predicate is true. +* [*array*.forEach](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) - Call a function for each element in the array. +* [*array*.every](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/every) - See if every element in the array satisfies a predicate. +* [*array*.map](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/map) - Create a new array with the result of calling a function on every element in the array. +* [*array*.some](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/some) - See if at least one element in the array satisfies a predicate. +* [*array*.reduce](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce) - Apply a function to reduce the array to a single value (from left-to-right). +* [*array*.reduceRight](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight) - Apply a function to reduce the array to a single value (from right-to-left). + +## Installing + +If you use NPM, `npm install d3-array`. Otherwise, download the [latest release](https://github.com/d3/d3-array/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-array.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +## API Reference + +* [Statistics](#statistics) +* [Search](#search) +* [Transformations](#transformations) +* [Iterables](#iterables) +* [Sets](#sets) +* [Bins](#bins) +* [Interning](#interning) + +### Statistics + +Methods for computing basic summary statistics. + +# d3.min(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/min.js), [Examples](https://observablehq.com/@d3/d3-extent) + +Returns the minimum value in the given *iterable* using natural order. If the iterable contains no comparable values, returns undefined. An optional *accessor* function may be specified, which is equivalent to calling Array.from before computing the minimum value. + +Unlike the built-in [Math.min](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/min), this method ignores undefined, null and NaN values; this is useful for ignoring missing data. In addition, elements are compared using natural order rather than numeric order. For example, the minimum of the strings [“20â€, “3â€] is “20â€, while the minimum of the numbers [20, 3] is 3. + +See also [extent](#extent). + +# d3.minIndex(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/minIndex.js), [Examples](https://observablehq.com/@d3/d3-extent) + +Returns the index of the minimum value in the given *iterable* using natural order. If the iterable contains no comparable values, returns -1. An optional *accessor* function may be specified, which is equivalent to calling Array.from before computing the minimum value. + +Unlike the built-in [Math.min](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/min), this method ignores undefined, null and NaN values; this is useful for ignoring missing data. In addition, elements are compared using natural order rather than numeric order. For example, the minimum of the strings [“20â€, “3â€] is “20â€, while the minimum of the numbers [20, 3] is 3. + +# d3.max(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/max.js), [Examples](https://observablehq.com/@d3/d3-extent) + +Returns the maximum value in the given *iterable* using natural order. If the iterable contains no comparable values, returns undefined. An optional *accessor* function may be specified, which is equivalent to calling Array.from before computing the maximum value. + +Unlike the built-in [Math.max](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/max), this method ignores undefined values; this is useful for ignoring missing data. In addition, elements are compared using natural order rather than numeric order. For example, the maximum of the strings [“20â€, “3â€] is “3â€, while the maximum of the numbers [20, 3] is 20. + +See also [extent](#extent). + +# d3.maxIndex(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/maxIndex.js), [Examples](https://observablehq.com/@d3/d3-extent) + +Returns the index of the maximum value in the given *iterable* using natural order. If the iterable contains no comparable values, returns -1. An optional *accessor* function may be specified, which is equivalent to calling Array.from before computing the maximum value. + +Unlike the built-in [Math.max](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/max), this method ignores undefined values; this is useful for ignoring missing data. In addition, elements are compared using natural order rather than numeric order. For example, the maximum of the strings [“20â€, “3â€] is “3â€, while the maximum of the numbers [20, 3] is 20. + +# d3.extent(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/extent.js), [Examples](https://observablehq.com/@d3/d3-extent) + +Returns the [minimum](#min) and [maximum](#max) value in the given *iterable* using natural order. If the iterable contains no comparable values, returns [undefined, undefined]. An optional *accessor* function may be specified, which is equivalent to calling Array.from before computing the extent. + +# d3.sum(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/sum.js), [Examples](https://observablehq.com/@d3/d3-sum) + +Returns the sum of the given *iterable* of numbers. If the iterable contains no numbers, returns 0. An optional *accessor* function may be specified, which is equivalent to calling Array.from before computing the sum. This method ignores undefined and NaN values; this is useful for ignoring missing data. + +# d3.mean(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/mean.js), [Examples](https://observablehq.com/@d3/d3-mean-d3-median-and-friends) + +Returns the mean of the given *iterable* of numbers. If the iterable contains no numbers, returns undefined. An optional *accessor* function may be specified, which is equivalent to calling Array.from before computing the mean. This method ignores undefined and NaN values; this is useful for ignoring missing data. + +# d3.median(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/median.js), [Examples](https://observablehq.com/@d3/d3-mean-d3-median-and-friends) + +Returns the median of the given *iterable* of numbers using the [R-7 method](https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample). If the iterable contains no numbers, returns undefined. An optional *accessor* function may be specified, which is equivalent to calling Array.from before computing the median. This method ignores undefined and NaN values; this is useful for ignoring missing data. + +# d3.cumsum(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/cumsum.js), [Examples](https://observablehq.com/@d3/d3-cumsum) + +Returns the cumulative sum of the given *iterable* of numbers, as a Float64Array of the same length. If the iterable contains no numbers, returns zeros. An optional *accessor* function may be specified, which is equivalent to calling Array.from before computing the cumulative sum. This method ignores undefined and NaN values; this is useful for ignoring missing data. + +# d3.quantile(iterable, p[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/quantile.js), [Examples](https://observablehq.com/@d3/d3-mean-d3-median-and-friends) + +Returns the *p*-quantile of the given *iterable* of numbers, where *p* is a number in the range [0, 1]. For example, the median can be computed using *p* = 0.5, the first quartile at *p* = 0.25, and the third quartile at *p* = 0.75. This particular implementation uses the [R-7 method](http://en.wikipedia.org/wiki/Quantile#Quantiles_of_a_population), which is the default for the R programming language and Excel. For example: + +```js +var a = [0, 10, 30]; +d3.quantile(a, 0); // 0 +d3.quantile(a, 0.5); // 10 +d3.quantile(a, 1); // 30 +d3.quantile(a, 0.25); // 5 +d3.quantile(a, 0.75); // 20 +d3.quantile(a, 0.1); // 2 +``` + +An optional *accessor* function may be specified, which is equivalent to calling *array*.map(*accessor*) before computing the quantile. + +# d3.quantileSorted(array, p[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/quantile.js), [Examples](https://observablehq.com/@d3/d3-mean-d3-median-and-friends) + +Similar to *quantile*, but expects the input to be a **sorted** *array* of values. In contrast with *quantile*, the accessor is only called on the elements needed to compute the quantile. + +# d3.variance(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/variance.js), [Examples](https://observablehq.com/@d3/d3-mean-d3-median-and-friends) + +Returns an [unbiased estimator of the population variance](http://mathworld.wolfram.com/SampleVariance.html) of the given *iterable* of numbers using [Welford’s algorithm](https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm). If the iterable has fewer than two numbers, returns undefined. An optional *accessor* function may be specified, which is equivalent to calling Array.from before computing the variance. This method ignores undefined and NaN values; this is useful for ignoring missing data. + +# d3.deviation(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/deviation.js), [Examples](https://observablehq.com/@d3/d3-mean-d3-median-and-friends) + +Returns the standard deviation, defined as the square root of the [bias-corrected variance](#variance), of the given *iterable* of numbers. If the iterable has fewer than two numbers, returns undefined. An optional *accessor* function may be specified, which is equivalent to calling Array.from before computing the standard deviation. This method ignores undefined and NaN values; this is useful for ignoring missing data. + +# d3.fsum([values][, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/fsum.js), [Examples](https://observablehq.com/@d3/d3-fsum) + +Returns a full precision summation of the given *values*. + +```js +d3.fsum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1]); // 1 +d3.sum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1]); // 0.9999999999999999 +``` + +Although slower, d3.fsum can replace d3.sum wherever greater precision is needed. Uses d3.Adder. + +# d3.fcumsum([values][, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/fsum.js), [Examples](https://observablehq.com/@d3/d3-fcumsum) + +Returns a full precision cumulative sum of the given *values*. + +```js +d3.fcumsum([1, 1e-14, -1]); // [1, 1.00000000000001, 1e-14] +d3.cumsum([1, 1e-14, -1]); // [1, 1.00000000000001, 9.992e-15] +``` + +Although slower, d3.fcumsum can replace d3.cumsum when greater precision is needed. Uses d3.Adder. + +# new d3.Adder() + +Creates a full precision adder for [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) floating point numbers, setting its initial value to 0. + +# *adder*.add(number) + +Adds the specified *number* to the adder’s current value and returns the adder. + +# *adder*.valueOf() + +Returns the IEEE 754 double precision representation of the adder’s current value. Most useful as the short-hand notation `+adder`. + +### Search + +Methods for searching arrays for a specific element. + +# d3.least(iterable[, comparator]) · [Source](https://github.com/d3/d3-array/blob/master/src/least.js), [Examples](https://observablehq.com/@d3/d3-least) +
# d3.least(iterable[, accessor]) + +Returns the least element of the specified *iterable* according to the specified *comparator* or *accessor*. If the given *iterable* contains no comparable elements (*i.e.*, the comparator returns NaN when comparing each element to itself), returns undefined. If *comparator* is not specified, it defaults to [ascending](#ascending). For example: + +```js +const array = [{foo: 42}, {foo: 91}]; +d3.least(array, (a, b) => a.foo - b.foo); // {foo: 42} +d3.least(array, (a, b) => b.foo - a.foo); // {foo: 91} +d3.least(array, a => a.foo); // {foo: 42} +``` + +This function is similar to [min](#min), except it allows the use of a comparator rather than an accessor. + +# d3.leastIndex(iterable[, comparator]) · [Source](https://github.com/d3/d3-array/blob/master/src/leastIndex.js), [Examples](https://observablehq.com/@d3/d3-least) +
# d3.leastIndex(iterable[, accessor]) + +Returns the index of the least element of the specified *iterable* according to the specified *comparator* or *accessor*. If the given *iterable* contains no comparable elements (*i.e.*, the comparator returns NaN when comparing each element to itself), returns -1. If *comparator* is not specified, it defaults to [ascending](#ascending). For example: + +```js +const array = [{foo: 42}, {foo: 91}]; +d3.leastIndex(array, (a, b) => a.foo - b.foo); // 0 +d3.leastIndex(array, (a, b) => b.foo - a.foo); // 1 +d3.leastIndex(array, a => a.foo); // 0 +``` + +This function is similar to [minIndex](#minIndex), except it allows the use of a comparator rather than an accessor. + +# d3.greatest(iterable[, comparator]) · [Source](https://github.com/d3/d3-array/blob/master/src/greatest.js), [Examples](https://observablehq.com/@d3/d3-least) +
# d3.greatest(iterable[, accessor]) + +Returns the greatest element of the specified *iterable* according to the specified *comparator* or *accessor*. If the given *iterable* contains no comparable elements (*i.e.*, the comparator returns NaN when comparing each element to itself), returns undefined. If *comparator* is not specified, it defaults to [ascending](#ascending). For example: + +```js +const array = [{foo: 42}, {foo: 91}]; +d3.greatest(array, (a, b) => a.foo - b.foo); // {foo: 91} +d3.greatest(array, (a, b) => b.foo - a.foo); // {foo: 42} +d3.greatest(array, a => a.foo); // {foo: 91} +``` + +This function is similar to [max](#max), except it allows the use of a comparator rather than an accessor. + +# d3.greatestIndex(iterable[, comparator]) · [Source](https://github.com/d3/d3-array/blob/master/src/greatestIndex.js), [Examples](https://observablehq.com/@d3/d3-least) +
# d3.greatestIndex(iterable[, accessor]) + +Returns the index of the greatest element of the specified *iterable* according to the specified *comparator* or *accessor*. If the given *iterable* contains no comparable elements (*i.e.*, the comparator returns NaN when comparing each element to itself), returns -1. If *comparator* is not specified, it defaults to [ascending](#ascending). For example: + +```js +const array = [{foo: 42}, {foo: 91}]; +d3.greatestIndex(array, (a, b) => a.foo - b.foo); // 1 +d3.greatestIndex(array, (a, b) => b.foo - a.foo); // 0 +d3.greatestIndex(array, a => a.foo); // 1 +``` + +This function is similar to [maxIndex](#maxIndex), except it allows the use of a comparator rather than an accessor. + +# d3.bisectLeft(array, x[, lo[, hi]]) · [Source](https://github.com/d3/d3-array/blob/master/src/bisect.js) + +Returns the insertion point for *x* in *array* to maintain sorted order. The arguments *lo* and *hi* may be used to specify a subset of the array which should be considered; by default the entire array is used. If *x* is already present in *array*, the insertion point will be before (to the left of) any existing entries. The return value is suitable for use as the first argument to [splice](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) assuming that *array* is already sorted. The returned insertion point *i* partitions the *array* into two halves so that all *v* < *x* for *v* in *array*.slice(*lo*, *i*) for the left side and all *v* >= *x* for *v* in *array*.slice(*i*, *hi*) for the right side. + +# d3.bisect(array, x[, lo[, hi]]) · [Source](https://github.com/d3/d3-array/blob/master/src/bisect.js), [Examples](https://observablehq.com/@d3/d3-bisect) +
# d3.bisectRight(array, x[, lo[, hi]]) + +Similar to [bisectLeft](#bisectLeft), but returns an insertion point which comes after (to the right of) any existing entries of *x* in *array*. The returned insertion point *i* partitions the *array* into two halves so that all *v* <= *x* for *v* in *array*.slice(*lo*, *i*) for the left side and all *v* > *x* for *v* in *array*.slice(*i*, *hi*) for the right side. + +# d3.bisectCenter(array, x[, lo[, hi]]) · [Source](https://github.com/d3/d3-array/blob/master/src/bisect.js), [Examples](https://observablehq.com/@d3/multi-line-chart) + +Returns the index of the value closest to *x* in the given *array* of numbers. The arguments *lo* (inclusive) and *hi* (exclusive) may be used to specify a subset of the array which should be considered; by default the entire array is used. + +See [*bisector*.center](#bisector_center). + +# d3.bisector(accessor) · [Source](https://github.com/d3/d3-array/blob/master/src/bisector.js) +
# d3.bisector(comparator) + +Returns a new bisector using the specified *accessor* or *comparator* function. This method can be used to bisect arrays of objects instead of being limited to simple arrays of primitives. For example, given the following array of objects: + +```js +var data = [ + {date: new Date(2011, 1, 1), value: 0.5}, + {date: new Date(2011, 2, 1), value: 0.6}, + {date: new Date(2011, 3, 1), value: 0.7}, + {date: new Date(2011, 4, 1), value: 0.8} +]; +``` + +A suitable bisect function could be constructed as: + +```js +var bisectDate = d3.bisector(function(d) { return d.date; }).right; +``` + +This is equivalent to specifying a comparator: + +```js +var bisectDate = d3.bisector(function(d, x) { return d.date - x; }).right; +``` + +And then applied as *bisectDate*(*array*, *date*), returning an index. Note that the comparator is always passed the search value *x* as the second argument. Use a comparator rather than an accessor if you want values to be sorted in an order different than natural order, such as in descending rather than ascending order. + +# bisector.left(array, x[, lo[, hi]]) · [Source](https://github.com/d3/d3-array/blob/master/src/bisector.js) + +Equivalent to [bisectLeft](#bisectLeft), but uses this bisector’s associated comparator. + +# bisector.right(array, x[, lo[, hi]]) · [Source](https://github.com/d3/d3-array/blob/master/src/bisector.js) + +Equivalent to [bisectRight](#bisectRight), but uses this bisector’s associated comparator. + +# bisector.center(array, x[, lo[, hi]]) · [Source](https://github.com/d3/d3-array/blob/master/src/bisector.js) + +Returns the index of the closest value to *x* in the given sorted *array*. This expects that the bisector’s associated accessor returns a quantitative value, or that the bisector’s associated comparator returns a signed distance; otherwise, this method is equivalent to *bisector*.left. + +# d3.quickselect(array, k, left = 0, right = array.length - 1, compare = ascending) · [Source](https://github.com/d3/d3-array/blob/master/src/quickselect.js), [Examples](https://observablehq.com/@d3/d3-quickselect) + +See [mourner/quickselect](https://github.com/mourner/quickselect/blob/master/README.md). + +# d3.ascending(a, b) · [Source](https://github.com/d3/d3-array/blob/master/src/ascending.js), [Examples](https://observablehq.com/@d3/d3-ascending) + +Returns -1 if *a* is less than *b*, or 1 if *a* is greater than *b*, or 0. This is the comparator function for natural order, and can be used in conjunction with the built-in [*array*.sort](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) method to arrange elements in ascending order. It is implemented as: + +```js +function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} +``` + +Note that if no comparator function is specified to the built-in sort method, the default order is lexicographic (alphabetical), not natural! This can lead to surprising behavior when sorting an array of numbers. + +# d3.descending(a, b) · [Source](https://github.com/d3/d3-array/blob/master/src/descending.js), [Examples](https://observablehq.com/@d3/d3-ascending) + +Returns -1 if *a* is greater than *b*, or 1 if *a* is less than *b*, or 0. This is the comparator function for reverse natural order, and can be used in conjunction with the built-in array sort method to arrange elements in descending order. It is implemented as: + +```js +function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} +``` + +Note that if no comparator function is specified to the built-in sort method, the default order is lexicographic (alphabetical), not natural! This can lead to surprising behavior when sorting an array of numbers. + +### Transformations + +Methods for transforming arrays and for generating new arrays. + +# d3.group(iterable, ...keys) · [Source](https://github.com/d3/d3-array/blob/master/src/group.js), [Examples](https://observablehq.com/@d3/d3-group-d3-rollup) + +Groups the specified *iterable* of values into an [InternMap](#InternMap) from *key* to array of value. For example, given some data: + +```js +data = [ + {name: "jim", amount: "34.0", date: "11/12/2015"}, + {name: "carl", amount: "120.11", date: "11/12/2015"}, + {name: "stacy", amount: "12.01", date: "01/04/2016"}, + {name: "stacy", amount: "34.05", date: "01/04/2016"} +] +``` + +To group the data by name: + +```js +d3.group(data, d => d.name) +``` + +This produces: + +```js +Map(3) { + "jim" => Array(1) + "carl" => Array(1) + "stacy" => Array(2) +} +``` + +If more than one *key* is specified, a nested InternMap is returned. For example: + +```js +d3.group(data, d => d.name, d => d.date) +``` + +This produces: + +```js +Map(3) { + "jim" => Map(1) { + "11/12/2015" => Array(1) + } + "carl" => Map(1) { + "11/12/2015" => Array(1) + } + "stacy" => Map(1) { + "01/04/2016" => Array(2) + } +} +``` + +To convert a Map to an Array, use [Array.from](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from). For example: + +```js +Array.from(d3.group(data, d => d.name)) +``` + +This produces: + +```js +[ + ["jim", Array(1)], + ["carl", Array(1)], + ["stacy", Array(2)] +] +``` + +You can also simultaneously convert the [*key*, *value*] to some other representation by passing a map function to Array.from: + +```js +Array.from(d3.group(data, d => d.name), ([key, value]) => ({key, value})) +``` + +This produces: + +```js +[ + {key: "jim", value: Array(1)}, + {key: "carl", value: Array(1)}, + {key: "stacy", value: Array(2)} +] +``` + +[*selection*.data](https://github.com/d3/d3-selection/blob/master/README.md#selection_data) accepts iterables directly, meaning that you can use a Map (or Set or other iterable) to perform a data join without first needing to convert to an array. + +# d3.groups(iterable, ...keys) · [Source](https://github.com/d3/d3-array/blob/master/src/group.js), [Examples](https://observablehq.com/@d3/d3-group-d3-rollup) + +Equivalent to [group](#group), but returns nested arrays instead of nested maps. + +# d3.index(iterable, ...keys) · [Source](https://github.com/d3/d3-array/blob/master/src/group.js), [Examples](https://observablehq.com/@d3/d3-group) + +Equivalent to [group](#group) but returns a unique value per compound key instead of an array, throwing if the key is not unique. + +For example, given the data defined above, + +```js +d3.index(data, d => d.amount) +``` + +returns + +```js +Map(4) { + "34.0" => Object {name: "jim", amount: "34.0", date: "11/12/2015"} + "120.11" => Object {name: "carl", amount: "120.11", date: "11/12/2015"} + "12.01" => Object {name: "stacy", amount: "12.01", date: "01/04/2016"} + "34.05" => Object {name: "stacy", amount: "34.05", date: "01/04/2016"} +} +``` + +On the other hand, + +```js +d3.index(data, d => d.name) +``` + +throws an error because two objects share the same name. + +# d3.indexes(iterable, ...keys) · [Source](https://github.com/d3/d3-array/blob/master/src/group.js), [Examples](https://observablehq.com/@d3/d3-group) + +Equivalent to [index](#index), but returns nested arrays instead of nested maps. + +# d3.rollup(iterable, reduce, ...keys) · [Source](https://github.com/d3/d3-array/blob/master/src/group.js), [Examples](https://observablehq.com/@d3/d3-group-d3-rollup) + +[Groups](#group) and reduces the specified *iterable* of values into an InternMap from *key* to value. For example, given some data: + +```js +data = [ + {name: "jim", amount: "34.0", date: "11/12/2015"}, + {name: "carl", amount: "120.11", date: "11/12/2015"}, + {name: "stacy", amount: "12.01", date: "01/04/2016"}, + {name: "stacy", amount: "34.05", date: "01/04/2016"} +] +``` + +To count the number of elements by name: + +```js +d3.rollup(data, v => v.length, d => d.name) +``` + +This produces: + +```js +Map(3) { + "jim" => 1 + "carl" => 1 + "stacy" => 2 +} +``` + +If more than one *key* is specified, a nested Map is returned. For example: + +```js +d3.rollup(data, v => v.length, d => d.name, d => d.date) +``` + +This produces: + +```js +Map(3) { + "jim" => Map(1) { + "11/12/2015" => 1 + } + "carl" => Map(1) { + "11/12/2015" => 1 + } + "stacy" => Map(1) { + "01/04/2016" => 2 + } +} +``` + +To convert a Map to an Array, use [Array.from](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from). See [d3.group](#group) for examples. + +# d3.rollups(iterable, ...keys) · [Source](https://github.com/d3/d3-array/blob/master/src/group.js), [Examples](https://observablehq.com/@d3/d3-group-d3-rollup) + +Equivalent to [rollup](#rollup), but returns nested arrays instead of nested maps. + +# d3.groupSort(iterable, comparator, key) · [Source](https://github.com/d3/d3-array/blob/master/src/groupSort.js), [Examples](https://observablehq.com/@d3/d3-groupsort) +
# d3.groupSort(iterable, accessor, key) + +Groups the specified *iterable* of elements according to the specified *key* function, sorts the groups according to the specified *comparator*, and then returns an array of keys in sorted order. For example, if you had a table of barley yields for different varieties, sites, and years, to sort the barley varieties by ascending median yield: + +```js +d3.groupSort(barley, g => d3.median(g, d => d.yield), d => d.variety) +``` + +For descending order, negate the group value: + +```js +d3.groupSort(barley, g => -d3.median(g, d => d.yield), d => d.variety) +``` + +If a *comparator* is passed instead of an *accessor* (i.e., if the second argument is a function that takes two arguments), it will be asked to compare two groups *a* and *b* and should return a negative value if *a* should be before *b*, a positive value if *a* should be after *b*, or zero for a partial ordering. + +# d3.count(iterable[, accessor]) · [Source](https://github.com/d3/d3-array/blob/master/src/count.js), [Examples](https://observablehq.com/@d3/d3-count) + +Returns the number of valid number values (*i.e.*, not null, NaN, or undefined) in the specified *iterable*; accepts an accessor. + +For example: + +```js +d3.count([{n: "Alice", age: NaN}, {n: "Bob", age: 18}, {n: "Other"}], d => d.age) // 1 +``` +# d3.cross(...iterables[, reducer]) · [Source](https://github.com/d3/d3-array/blob/master/src/cross.js), [Examples](https://observablehq.com/@d3/d3-cross) + +Returns the [Cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) of the specified *iterables*. For example, if two iterables *a* and *b* are specified, for each element *i* in the iterable *a* and each element *j* in the iterable *b*, in order, invokes the specified *reducer* function passing the element *i* and element *j*. If a *reducer* is not specified, it defaults to a function which creates a two-element array for each pair: + +```js +function pair(a, b) { + return [a, b]; +} +``` + +For example: + +```js +d3.cross([1, 2], ["x", "y"]); // returns [[1, "x"], [1, "y"], [2, "x"], [2, "y"]] +d3.cross([1, 2], ["x", "y"], (a, b) => a + b); // returns ["1x", "1y", "2x", "2y"] +``` + +# d3.merge(iterables) · [Source](https://github.com/d3/d3-array/blob/master/src/merge.js), [Examples](https://observablehq.com/@d3/d3-merge) + +Merges the specified iterable of *iterables* into a single array. This method is similar to the built-in array concat method; the only difference is that it is more convenient when you have an array of arrays. + +```js +d3.merge([[1], [2, 3]]); // returns [1, 2, 3] +``` + +# d3.pairs(iterable[, reducer]) · [Source](https://github.com/d3/d3-array/blob/master/src/pairs.js), [Examples](https://observablehq.com/@d3/d3-pairs) + +For each adjacent pair of elements in the specified *iterable*, in order, invokes the specified *reducer* function passing the element *i* and element *i* - 1. If a *reducer* is not specified, it defaults to a function which creates a two-element array for each pair: + +```js +function pair(a, b) { + return [a, b]; +} +``` + +For example: + +```js +d3.pairs([1, 2, 3, 4]); // returns [[1, 2], [2, 3], [3, 4]] +d3.pairs([1, 2, 3, 4], (a, b) => b - a); // returns [1, 1, 1]; +``` + +If the specified iterable has fewer than two elements, returns the empty array. + +# d3.permute(source, keys) · [Source](https://github.com/d3/d3-array/blob/master/src/permute.js), [Examples](https://observablehq.com/@d3/d3-permute) + +Returns a permutation of the specified *source* object (or array) using the specified iterable of *keys*. The returned array contains the corresponding property of the source object for each key in *keys*, in order. For example: + +```js +permute(["a", "b", "c"], [1, 2, 0]); // returns ["b", "c", "a"] +``` + +It is acceptable to have more keys than source elements, and for keys to be duplicated or omitted. + +This method can also be used to extract the values from an object into an array with a stable order. Extracting keyed values in order can be useful for generating data arrays in nested selections. For example: + +```js +let object = {yield: 27, variety: "Manchuria", year: 1931, site: "University Farm"}; +let fields = ["site", "variety", "yield"]; + +d3.permute(object, fields); // returns ["University Farm", "Manchuria", 27] +``` + +# d3.shuffle(array[, start[, stop]]) · [Source](https://github.com/d3/d3-array/blob/master/src/shuffle.js), [Examples](https://observablehq.com/@d3/d3-shuffle) + +Randomizes the order of the specified *array* in-place using the [Fisher–Yates shuffle](https://bost.ocks.org/mike/shuffle/) and returns the *array*. If *start* is specified, it is the starting index (inclusive) of the *array* to shuffle; if *start* is not specified, it defaults to zero. If *stop* is specified, it is the ending index (exclusive) of the *array* to shuffle; if *stop* is not specified, it defaults to *array*.length. For example, to shuffle the first ten elements of the *array*: shuffle(*array*, 0, 10). + +# d3.shuffler(random) · [Source](https://github.com/d3/d3-array/blob/master/src/shuffle.js) + +Returns a [shuffle function](#shuffle) given the specified random source. For example, using [d3.randomLcg](https://github.com/d3/d3-random/blob/master/README.md#randomLcg): + +```js +const random = d3.randomLcg(0.9051667019185816); +const shuffle = d3.shuffler(random); + +shuffle([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); // returns [7, 4, 5, 3, 9, 0, 6, 1, 2, 8] +``` + +# d3.ticks(start, stop, count) · [Source](https://github.com/d3/d3-array/blob/master/src/ticks.js), [Examples](https://observablehq.com/@d3/d3-ticks) + +Returns an array of approximately *count* + 1 uniformly-spaced, nicely-rounded values between *start* and *stop* (inclusive). Each value is a power of ten multiplied by 1, 2 or 5. See also [d3.tickIncrement](#tickIncrement), [d3.tickStep](#tickStep) and [*linear*.ticks](https://github.com/d3/d3-scale/blob/master/README.md#linear_ticks). + +Ticks are inclusive in the sense that they may include the specified *start* and *stop* values if (and only if) they are exact, nicely-rounded values consistent with the inferred [step](#tickStep). More formally, each returned tick *t* satisfies *start* ≤ *t* and *t* ≤ *stop*. + +# d3.tickIncrement(start, stop, count) · [Source](https://github.com/d3/d3-array/blob/master/src/ticks.js), [Examples](https://observablehq.com/@d3/d3-ticks) + +Like [d3.tickStep](#tickStep), except requires that *start* is always less than or equal to *stop*, and if the tick step for the given *start*, *stop* and *count* would be less than one, returns the negative inverse tick step instead. This method is always guaranteed to return an integer, and is used by [d3.ticks](#ticks) to guarantee that the returned tick values are represented as precisely as possible in IEEE 754 floating point. + +# d3.tickStep(start, stop, count) · [Source](https://github.com/d3/d3-array/blob/master/src/ticks.js), [Examples](https://observablehq.com/@d3/d3-ticks) + +Returns the difference between adjacent tick values if the same arguments were passed to [d3.ticks](#ticks): a nicely-rounded value that is a power of ten multiplied by 1, 2 or 5. Note that due to the limited precision of IEEE 754 floating point, the returned value may not be exact decimals; use [d3-format](https://github.com/d3/d3-format) to format numbers for human consumption. + +# d3.nice(start, stop, count) · [Source](https://github.com/d3/d3-array/blob/master/src/nice.js) + +Returns a new interval [*niceStart*, *niceStop*] covering the given interval [*start*, *stop*] and where *niceStart* and *niceStop* are guaranteed to align with the corresponding [tick step](#tickStep). Like [d3.tickIncrement](#tickIncrement), this requires that *start* is less than or equal to *stop*. + +# d3.range([start, ]stop[, step]) · [Source](https://github.com/d3/d3-array/blob/master/src/range.js), [Examples](https://observablehq.com/@d3/d3-range) + +Returns an array containing an arithmetic progression, similar to the Python built-in [range](http://docs.python.org/library/functions.html#range). This method is often used to iterate over a sequence of uniformly-spaced numeric values, such as the indexes of an array or the ticks of a linear scale. (See also [d3.ticks](#ticks) for nicely-rounded values.) + +If *step* is omitted, it defaults to 1. If *start* is omitted, it defaults to 0. The *stop* value is exclusive; it is not included in the result. If *step* is positive, the last element is the largest *start* + *i* \* *step* less than *stop*; if *step* is negative, the last element is the smallest *start* + *i* \* *step* greater than *stop*. If the returned array would contain an infinite number of values, an empty range is returned. + +The arguments are not required to be integers; however, the results are more predictable if they are. The values in the returned array are defined as *start* + *i* \* *step*, where *i* is an integer from zero to one minus the total number of elements in the returned array. For example: + +```js +d3.range(0, 1, 0.2) // [0, 0.2, 0.4, 0.6000000000000001, 0.8] +``` + +This unexpected behavior is due to IEEE 754 double-precision floating point, which defines 0.2 * 3 = 0.6000000000000001. Use [d3-format](https://github.com/d3/d3-format) to format numbers for human consumption with appropriate rounding; see also [linear.tickFormat](https://github.com/d3/d3-scale/blob/master/README.md#linear_tickFormat) in [d3-scale](https://github.com/d3/d3-scale). + +Likewise, if the returned array should have a specific length, consider using [array.map](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/map) on an integer range. For example: + +```js +d3.range(0, 1, 1 / 49); // BAD: returns 50 elements! +d3.range(49).map(function(d) { return d / 49; }); // GOOD: returns 49 elements. +``` + +# d3.transpose(matrix) · [Source](https://github.com/d3/d3-array/blob/master/src/transpose.js), [Examples](https://observablehq.com/@d3/d3-transpose) + +Uses the [zip](#zip) operator as a two-dimensional [matrix transpose](http://en.wikipedia.org/wiki/Transpose). + +# d3.zip(arrays…) · [Source](https://github.com/d3/d3-array/blob/master/src/zip.js), [Examples](https://observablehq.com/@d3/d3-transpose) + +Returns an array of arrays, where the *i*th array contains the *i*th element from each of the argument *arrays*. The returned array is truncated in length to the shortest array in *arrays*. If *arrays* contains only a single array, the returned array contains one-element arrays. With no arguments, the returned array is empty. + +```js +d3.zip([1, 2], [3, 4]); // returns [[1, 3], [2, 4]] +``` + +### Iterables + +These are equivalent to built-in array methods, but work with any iterable including Map, Set, and Generator. + +# d3.every(iterable, test) · [Source](https://github.com/d3/d3-array/blob/master/src/every.js) + +Returns true if the given *test* function returns true for every value in the given *iterable*. This method returns as soon as *test* returns a non-truthy value or all values are iterated over. Equivalent to [*array*.every](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every): + +```js +d3.every(new Set([1, 3, 5, 7]), x => x & 1) // true +``` + +# d3.some(iterable, test) · [Source](https://github.com/d3/d3-array/blob/master/src/some.js) + +Returns true if the given *test* function returns true for any value in the given *iterable*. This method returns as soon as *test* returns a truthy value or all values are iterated over. Equivalent to [*array*.some](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some): + +```js +d3.some(new Set([0, 2, 3, 4]), x => x & 1) // true +``` + +# d3.filter(iterable, test) · [Source](https://github.com/d3/d3-array/blob/master/src/filter.js) + +Returns a new array containing the values from *iterable*, in order, for which the given *test* function returns true. Equivalent to [*array*.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter): + +```js +d3.filter(new Set([0, 2, 3, 4]), x => x & 1) // [3] +``` + +# d3.map(iterable, mapper) · [Source](https://github.com/d3/d3-array/blob/master/src/map.js) + +Returns a new array containing the mapped values from *iterable*, in order, as defined by given *mapper* function. Equivalent to [*array*.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) and [Array.from](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from): + +```js +d3.map(new Set([0, 2, 3, 4]), x => x & 1) // [0, 0, 1, 0] +``` + +# d3.reduce(iterable, reducer[, initialValue]) · [Source](https://github.com/d3/d3-array/blob/master/src/reduce.js) + +Returns the reduced value defined by given *reducer* function, which is repeatedly invoked for each value in *iterable*, being passed the current reduced value and the next value. Equivalent to [*array*.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce): + +```js +d3.reduce(new Set([0, 2, 3, 4]), (p, v) => p + v, 0) // 9 +``` + +# d3.reverse(iterable) · [Source](https://github.com/d3/d3-array/blob/master/src/reverse.js) + +Returns an array containing the values in the given *iterable* in reverse order. Equivalent to [*array*.reverse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse), except that it does not mutate the given *iterable*: + +```js +d3.reverse(new Set([0, 2, 3, 1])) // [1, 3, 2, 0] +``` + +# d3.sort(iterable, comparator = d3.ascending) · [Source](https://github.com/d3/d3-array/blob/master/src/sort.js) +
# d3.sort(iterable, ...accessors) + +Returns an array containing the values in the given *iterable* in the sorted order defined by the given *comparator* or *accessor* function. If *comparator* is not specified, it defaults to [d3.ascending](#ascending). Equivalent to [*array*.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort), except that it does not mutate the given *iterable*, and the comparator defaults to natural order instead of lexicographic order: + +```js +d3.sort(new Set([0, 2, 3, 1])) // [0, 1, 2, 3] +``` + +If an *accessor* (a function that takes a single argument) is specified, + +```js +d3.sort(data, d => d.value) +``` + +it is equivalent to a *comparator* using [natural order](#ascending): + +```js +d3.sort(data, (a, b) => d3.ascending(a.value, b.value)) +``` + +The *accessor* is only invoked once per element, and thus the returned sorted order is consistent even if the accessor is nondeterministic. + +Multiple accessors may be specified to break ties: + +```js +d3.sort(points, ({x}) => x, ({y}) => y) +``` + +This is equivalent to: + +```js +d3.sort(data, (a, b) => d3.ascending(a.x, b.x) || d3.ascending(a.y, b.y)) +``` + +### Sets + +This methods implement basic set operations for any iterable. + +# d3.difference(iterable, ...others) · [Source](https://github.com/d3/d3-array/blob/master/src/difference.js) + +Returns a new Set containing every value in *iterable* that is not in any of the *others* iterables. + +```js +d3.difference([0, 1, 2, 0], [1]) // Set {0, 2} +``` + +# d3.union(...iterables) · [Source](https://github.com/d3/d3-array/blob/master/src/union.js) + +Returns a new Set containing every (distinct) value that appears in any of the given *iterables*. The order of values in the returned Set is based on their first occurrence in the given *iterables*. + +```js +d3.union([0, 2, 1, 0], [1, 3]) // Set {0, 2, 1, 3} +``` + +# d3.intersection(...iterables) · [Source](https://github.com/d3/d3-array/blob/master/src/intersection.js) + +Returns a new Set containing every (distinct) value that appears in all of the given *iterables*. The order of values in the returned Set is based on their first occurrence in the given *iterables*. + +```js +d3.intersection([0, 2, 1, 0], [1, 3]) // Set {1} +``` + +# d3.superset(a, b) · [Source](https://github.com/d3/d3-array/blob/master/src/superset.js) + +Returns true if *a* is a superset of *b*: if every value in the given iterable *b* is also in the given iterable *a*. + +```js +d3.superset([0, 2, 1, 3, 0], [1, 3]) // true +``` + +# d3.subset(a, b) · [Source](https://github.com/d3/d3-array/blob/master/src/subset.js) + +Returns true if *a* is a subset of *b*: if every value in the given iterable *a* is also in the given iterable *b*. + +```js +d3.subset([1, 3], [0, 2, 1, 3, 0]) // true +``` + +# d3.disjoint(a, b) · [Source](https://github.com/d3/d3-array/blob/master/src/disjoint.js) + +Returns true if *a* and *b* are disjoint: if *a* and *b* contain no shared value. + +```js +d3.disjoint([1, 3], [2, 4]) // true +``` + +### Bins + +[Histogram](http://bl.ocks.org/mbostock/3048450) + +Binning groups discrete samples into a smaller number of consecutive, non-overlapping intervals. They are often used to visualize the distribution of numerical data as histograms. + +# d3.bin() · [Source](https://github.com/d3/d3-array/blob/master/src/bin.js), [Examples](https://observablehq.com/@d3/d3-bin) + +Constructs a new bin generator with the default settings. + +# bin(data) · [Source](https://github.com/d3/d3-array/blob/master/src/bin.js), [Examples](https://observablehq.com/@d3/d3-bin) + +Bins the given iterable of *data* samples. Returns an array of bins, where each bin is an array containing the associated elements from the input *data*. Thus, the `length` of the bin is the number of elements in that bin. Each bin has two additional attributes: + +* `x0` - the lower bound of the bin (inclusive). +* `x1` - the upper bound of the bin (exclusive, except for the last bin). + +# bin.value([value]) · [Source](https://github.com/d3/d3-array/blob/master/src/bin.js), [Examples](https://observablehq.com/@d3/d3-bin) + +If *value* is specified, sets the value accessor to the specified function or constant and returns this bin generator. If *value* is not specified, returns the current value accessor, which defaults to the identity function. + +When bins are [generated](#_bin), the value accessor will be invoked for each element in the input data array, being passed the element `d`, the index `i`, and the array `data` as three arguments. The default value accessor assumes that the input data are orderable (comparable), such as numbers or dates. If your data are not, then you should specify an accessor that returns the corresponding orderable value for a given datum. + +This is similar to mapping your data to values before invoking the bin generator, but has the benefit that the input data remains associated with the returned bins, thereby making it easier to access other fields of the data. + +# bin.domain([domain]) · [Source](https://github.com/d3/d3-array/blob/master/src/bin.js), [Examples](https://observablehq.com/@d3/d3-bin) + +If *domain* is specified, sets the domain accessor to the specified function or array and returns this bin generator. If *domain* is not specified, returns the current domain accessor, which defaults to [extent](#extent). The bin domain is defined as an array [*min*, *max*], where *min* is the minimum observable value and *max* is the maximum observable value; both values are inclusive. Any value outside of this domain will be ignored when the bins are [generated](#_bin). + +For example, if you are using the bin generator in conjunction with a [linear scale](https://github.com/d3/d3-scale/blob/master/README.md#linear-scales) `x`, you might say: + +```js +var bin = d3.bin() + .domain(x.domain()) + .thresholds(x.ticks(20)); +``` + +You can then compute the bins from an array of numbers like so: + +```js +var bins = bin(numbers); +``` + +If the default [extent](#extent) domain is used and the [thresholds](#bin_thresholds) are specified as a count (rather than explicit values), then the computed domain will be [niced](#nice) such that all bins are uniform width. + +Note that the domain accessor is invoked on the materialized array of [values](#bin_value), not on the input data array. + +# bin.thresholds([count]) · [Source](https://github.com/d3/d3-array/blob/master/src/bin.js), [Examples](https://observablehq.com/@d3/d3-bin) +
# bin.thresholds([thresholds]) + +If *thresholds* is specified, sets the [threshold generator](#bin-thresholds) to the specified function or array and returns this bin generator. If *thresholds* is not specified, returns the current threshold generator, which by default implements [Sturges’ formula](#thresholdSturges). (Thus by default, the values to be binned must be numbers!) Thresholds are defined as an array of values [*x0*, *x1*, …]. Any value less than *x0* will be placed in the first bin; any value greater than or equal to *x0* but less than *x1* will be placed in the second bin; and so on. Thus, the [generated bins](#_bin) will have *thresholds*.length + 1 bins. See [bin thresholds](#bin-thresholds) for more information. + +Any threshold values outside the [domain](#bin_domain) are ignored. The first *bin*.x0 is always equal to the minimum domain value, and the last *bin*.x1 is always equal to the maximum domain value. + +If a *count* is specified instead of an array of *thresholds*, then the [domain](#bin_domain) will be uniformly divided into approximately *count* bins; see [ticks](#ticks). + +#### Bin Thresholds + +These functions are typically not used directly; instead, pass them to [*bin*.thresholds](#bin_thresholds). + +# d3.thresholdFreedmanDiaconis(values, min, max) · [Source](https://github.com/d3/d3-array/blob/master/src/threshold/freedmanDiaconis.js), [Examples](https://observablehq.com/@d3/d3-bin) + +Returns the number of bins according to the [Freedman–Diaconis rule](https://en.wikipedia.org/wiki/Histogram#Mathematical_definition); the input *values* must be numbers. + +# d3.thresholdScott(values, min, max) · [Source](https://github.com/d3/d3-array/blob/master/src/threshold/scott.js), [Examples](https://observablehq.com/@d3/d3-bin) + +Returns the number of bins according to [Scott’s normal reference rule](https://en.wikipedia.org/wiki/Histogram#Mathematical_definition); the input *values* must be numbers. + +# d3.thresholdSturges(values) · [Source](https://github.com/d3/d3-array/blob/master/src/threshold/sturges.js), [Examples](https://observablehq.com/@d3/d3-bin) + +Returns the number of bins according to [Sturges’ formula](https://en.wikipedia.org/wiki/Histogram#Mathematical_definition); the input *values* must be numbers. + +You may also implement your own threshold generator taking three arguments: the array of input [*values*](#bin_value) derived from the data, and the [observable domain](#bin_domain) represented as *min* and *max*. The generator may then return either the array of numeric thresholds or the *count* of bins; in the latter case the domain is divided uniformly into approximately *count* bins; see [ticks](#ticks). + +For instance, when binning date values, you might want to use the ticks from a time scale ([Example](https://observablehq.com/@d3/d3-bin-time-thresholds)). + +### Interning + +# new d3.InternMap([iterable][, key]) · [Source](https://github.com/mbostock/internmap/blob/main/src/index.js), [Examples](https://observablehq.com/d/d4c5f6ad343866b9) +
# new d3.InternSet([iterable][, key]) · [Source](https://github.com/mbostock/internmap/blob/main/src/index.js), [Examples](https://observablehq.com/d/d4c5f6ad343866b9) + +The [InternMap and InternSet](https://github.com/mbostock/internmap) classes extend the native JavaScript Map and Set classes, respectively, allowing Dates and other non-primitive keys by bypassing the [SameValueZero algorithm](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness) when determining key equality. d3.group, d3.rollup and d3.index use an InternMap rather than a native Map. These two classes are exported for convenience. diff --git a/node_modules/d3-array/dist/d3-array.js b/node_modules/d3-array/dist/d3-array.js new file mode 100644 index 00000000..5b9d4338 --- /dev/null +++ b/node_modules/d3-array/dist/d3-array.js @@ -0,0 +1,1180 @@ +// https://d3js.org/d3-array/ v2.12.0 Copyright 2021 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3 = global.d3 || {})); +}(this, (function (exports) { 'use strict'; + +function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +function bisector(f) { + let delta = f; + let compare = f; + + if (f.length === 1) { + delta = (d, x) => f(d) - x; + compare = ascendingComparator(f); + } + + function left(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + } + + function right(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + + function center(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + const i = left(a, x, lo, hi - 1); + return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i; + } + + return {left, center, right}; +} + +function ascendingComparator(f) { + return (d, x) => ascending(f(d), x); +} + +function number(x) { + return x === null ? NaN : +x; +} + +function* numbers(values, valueof) { + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + yield value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + yield value; + } + } + } +} + +const ascendingBisect = bisector(ascending); +const bisectRight = ascendingBisect.right; +const bisectLeft = ascendingBisect.left; +const bisectCenter = bisector(number).center; + +function count(values, valueof) { + let count = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count; + } + } + } + return count; +} + +function length$1(array) { + return array.length | 0; +} + +function empty(length) { + return !(length > 0); +} + +function arrayify(values) { + return typeof values !== "object" || "length" in values ? values : Array.from(values); +} + +function reducer(reduce) { + return values => reduce(...values); +} + +function cross(...values) { + const reduce = typeof values[values.length - 1] === "function" && reducer(values.pop()); + values = values.map(arrayify); + const lengths = values.map(length$1); + const j = values.length - 1; + const index = new Array(j + 1).fill(0); + const product = []; + if (j < 0 || lengths.some(empty)) return product; + while (true) { + product.push(index.map((j, i) => values[i][j])); + let i = j; + while (++index[i] === lengths[i]) { + if (i === 0) return reduce ? product.map(reduce) : product; + index[i--] = 0; + } + } +} + +function cumsum(values, valueof) { + var sum = 0, index = 0; + return Float64Array.from(values, valueof === undefined + ? v => (sum += +v || 0) + : v => (sum += +valueof(v, index++, values) || 0)); +} + +function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} + +function variance(values, valueof) { + let count = 0; + let delta; + let mean = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + delta = value - mean; + mean += delta / ++count; + sum += delta * (value - mean); + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + delta = value - mean; + mean += delta / ++count; + sum += delta * (value - mean); + } + } + } + if (count > 1) return sum / (count - 1); +} + +function deviation(values, valueof) { + const v = variance(values, valueof); + return v ? Math.sqrt(v) : v; +} + +function extent(values, valueof) { + let min; + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + return [min, max]; +} + +// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423 +class Adder { + constructor() { + this._partials = new Float64Array(32); + this._n = 0; + } + add(x) { + const p = this._partials; + let i = 0; + for (let j = 0; j < this._n && j < 32; j++) { + const y = p[j], + hi = x + y, + lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x); + if (lo) p[i++] = lo; + x = hi; + } + p[i] = x; + this._n = i + 1; + return this; + } + valueOf() { + const p = this._partials; + let n = this._n, x, y, lo, hi = 0; + if (n > 0) { + hi = p[--n]; + while (n > 0) { + x = hi; + y = p[--n]; + hi = x + y; + lo = y - (hi - x); + if (lo) break; + } + if (n > 0 && ((lo < 0 && p[n - 1] < 0) || (lo > 0 && p[n - 1] > 0))) { + y = lo * 2; + x = hi + y; + if (y == x - hi) hi = x; + } + } + return hi; + } +} + +function fsum(values, valueof) { + const adder = new Adder(); + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + adder.add(value); + } + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + adder.add(value); + } + } + } + return +adder; +} + +function fcumsum(values, valueof) { + const adder = new Adder(); + let index = -1; + return Float64Array.from(values, valueof === undefined + ? v => adder.add(+v || 0) + : v => adder.add(+valueof(v, ++index, values) || 0) + ); +} + +class InternMap extends Map { + constructor(entries, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (entries != null) for (const [key, value] of entries) this.set(key, value); + } + get(key) { + return super.get(intern_get(this, key)); + } + has(key) { + return super.has(intern_get(this, key)); + } + set(key, value) { + return super.set(intern_set(this, key), value); + } + delete(key) { + return super.delete(intern_delete(this, key)); + } +} + +class InternSet extends Set { + constructor(values, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (values != null) for (const value of values) this.add(value); + } + has(value) { + return super.has(intern_get(this, value)); + } + add(value) { + return super.add(intern_set(this, value)); + } + delete(value) { + return super.delete(intern_delete(this, value)); + } +} + +function intern_get({_intern, _key}, value) { + const key = _key(value); + return _intern.has(key) ? _intern.get(key) : value; +} + +function intern_set({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) return _intern.get(key); + _intern.set(key, value); + return value; +} + +function intern_delete({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) { + value = _intern.get(value); + _intern.delete(key); + } + return value; +} + +function keyof(value) { + return value !== null && typeof value === "object" ? value.valueOf() : value; +} + +function identity(x) { + return x; +} + +function group(values, ...keys) { + return nest(values, identity, identity, keys); +} + +function groups(values, ...keys) { + return nest(values, Array.from, identity, keys); +} + +function rollup(values, reduce, ...keys) { + return nest(values, identity, reduce, keys); +} + +function rollups(values, reduce, ...keys) { + return nest(values, Array.from, reduce, keys); +} + +function index(values, ...keys) { + return nest(values, identity, unique, keys); +} + +function indexes(values, ...keys) { + return nest(values, Array.from, unique, keys); +} + +function unique(values) { + if (values.length !== 1) throw new Error("duplicate key"); + return values[0]; +} + +function nest(values, map, reduce, keys) { + return (function regroup(values, i) { + if (i >= keys.length) return reduce(values); + const groups = new InternMap(); + const keyof = keys[i++]; + let index = -1; + for (const value of values) { + const key = keyof(value, ++index, values); + const group = groups.get(key); + if (group) group.push(value); + else groups.set(key, [value]); + } + for (const [key, values] of groups) { + groups.set(key, regroup(values, i)); + } + return map(groups); + })(values, 0); +} + +function permute(source, keys) { + return Array.from(keys, key => source[key]); +} + +function sort(values, ...F) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + values = Array.from(values); + let [f = ascending] = F; + if (f.length === 1 || F.length > 1) { + const index = Uint32Array.from(values, (d, i) => i); + if (F.length > 1) { + F = F.map(f => values.map(f)); + index.sort((i, j) => { + for (const f of F) { + const c = ascending(f[i], f[j]); + if (c) return c; + } + }); + } else { + f = values.map(f); + index.sort((i, j) => ascending(f[i], f[j])); + } + return permute(values, index); + } + return values.sort(f); +} + +function groupSort(values, reduce, key) { + return (reduce.length === 1 + ? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending(av, bv) || ascending(ak, bk))) + : sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending(ak, bk)))) + .map(([key]) => key); +} + +var array = Array.prototype; + +var slice = array.slice; + +function constant(x) { + return function() { + return x; + }; +} + +var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); + +function ticks(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; + + stop = +stop, start = +start, count = +count; + if (start === stop && count > 0) return [start]; + if (reverse = stop < start) n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; + + if (step > 0) { + start = Math.ceil(start / step); + stop = Math.floor(stop / step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) * step; + } else { + step = -step; + start = Math.ceil(start * step); + stop = Math.floor(stop * step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) / step; + } + + if (reverse) ticks.reverse(); + + return ticks; +} + +function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); +} + +function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; +} + +function nice(start, stop, count) { + let prestep; + while (true) { + const step = tickIncrement(start, stop, count); + if (step === prestep || step === 0 || !isFinite(step)) { + return [start, stop]; + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } + prestep = step; + } +} + +function sturges(values) { + return Math.ceil(Math.log(count(values)) / Math.LN2) + 1; +} + +function bin() { + var value = identity, + domain = extent, + threshold = sturges; + + function histogram(data) { + if (!Array.isArray(data)) data = Array.from(data); + + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds, and nice the + // default domain accordingly. + if (!Array.isArray(tz)) { + const max = x1, tn = +tz; + if (domain === extent) [x0, x1] = nice(x0, x1, tn); + tz = ticks(x0, x1, tn); + + // If the last threshold is coincident with the domain’s upper bound, the + // last bin will be zero-width. If the default domain is used, and this + // last threshold is coincident with the maximum input value, we can + // extend the niced upper bound by one tick to ensure uniform bin widths; + // otherwise, we simply remove the last threshold. Note that we don’t + // coerce values or the domain to numbers, and thus must be careful to + // compare order (>=) rather than strict equality (===)! + if (tz[tz.length - 1] >= x1) { + if (max >= x1 && domain === extent) { + const step = tickIncrement(x0, x1, tn); + if (isFinite(step)) { + if (step > 0) { + x1 = (Math.floor(x1 / step) + 1) * step; + } else if (step < 0) { + x1 = (Math.ceil(x1 * -step) + 1) / -step; + } + } + } else { + tz.pop(); + } + } + } + + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] > x1) tz.pop(), --m; + + var bins = new Array(m + 1), + bin; + + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } + + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } + + return bins; + } + + histogram.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + }; + + histogram.domain = function(_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + }; + + return histogram; +} + +function max(values, valueof) { + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (max < value || (max === undefined && value >= value))) { + max = value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { + max = value; + } + } + } + return max; +} + +function min(values, valueof) { + let min; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value; + } + } + } + return min; +} + +// Based on https://github.com/mourner/quickselect +// ISC license, Copyright 2018 Vladimir Agafonkin. +function quickselect(array, k, left = 0, right = array.length - 1, compare = ascending) { + while (right > left) { + if (right - left > 600) { + const n = right - left + 1; + const m = k - left + 1; + const z = Math.log(n); + const s = 0.5 * Math.exp(2 * z / 3); + const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + const newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + quickselect(array, k, newLeft, newRight, compare); + } + + const t = array[k]; + let i = left; + let j = right; + + swap(array, left, k); + if (compare(array[right], t) > 0) swap(array, left, right); + + while (i < j) { + swap(array, i, j), ++i, --j; + while (compare(array[i], t) < 0) ++i; + while (compare(array[j], t) > 0) --j; + } + + if (compare(array[left], t) === 0) swap(array, left, j); + else ++j, swap(array, j, right); + + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } + return array; +} + +function swap(array, i, j) { + const t = array[i]; + array[i] = array[j]; + array[j] = t; +} + +function quantile(values, p, valueof) { + values = Float64Array.from(numbers(values, valueof)); + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return min(values); + if (p >= 1) return max(values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = max(quickselect(values, i0).subarray(0, i0 + 1)), + value1 = min(values.subarray(i0 + 1)); + return value0 + (value1 - value0) * (i - i0); +} + +function quantileSorted(values, p, valueof = number) { + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); +} + +function freedmanDiaconis(values, min, max) { + return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(count(values), -1 / 3))); +} + +function scott(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(count(values), -1 / 3))); +} + +function maxIndex(values, valueof) { + let max; + let maxIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } + } + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } + } + } + return maxIndex; +} + +function mean(values, valueof) { + let count = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count, sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count, sum += value; + } + } + } + if (count) return sum / count; +} + +function median(values, valueof) { + return quantile(values, 0.5, valueof); +} + +function* flatten(arrays) { + for (const array of arrays) { + yield* array; + } +} + +function merge(arrays) { + return Array.from(flatten(arrays)); +} + +function minIndex(values, valueof) { + let min; + let minIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; + } + } + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; + } + } + } + return minIndex; +} + +function pairs(values, pairof = pair) { + const pairs = []; + let previous; + let first = false; + for (const value of values) { + if (first) pairs.push(pairof(previous, value)); + previous = value; + first = true; + } + return pairs; +} + +function pair(a, b) { + return [a, b]; +} + +function range(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; +} + +function least(values, compare = ascending) { + let min; + let defined = false; + if (compare.length === 1) { + let minValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending(value, minValue) < 0 + : ascending(value, value) === 0) { + min = element; + minValue = value; + defined = true; + } + } + } else { + for (const value of values) { + if (defined + ? compare(value, min) < 0 + : compare(value, value) === 0) { + min = value; + defined = true; + } + } + } + return min; +} + +function leastIndex(values, compare = ascending) { + if (compare.length === 1) return minIndex(values, compare); + let minValue; + let min = -1; + let index = -1; + for (const value of values) { + ++index; + if (min < 0 + ? compare(value, value) === 0 + : compare(value, minValue) < 0) { + minValue = value; + min = index; + } + } + return min; +} + +function greatest(values, compare = ascending) { + let max; + let defined = false; + if (compare.length === 1) { + let maxValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending(value, maxValue) > 0 + : ascending(value, value) === 0) { + max = element; + maxValue = value; + defined = true; + } + } + } else { + for (const value of values) { + if (defined + ? compare(value, max) > 0 + : compare(value, value) === 0) { + max = value; + defined = true; + } + } + } + return max; +} + +function greatestIndex(values, compare = ascending) { + if (compare.length === 1) return maxIndex(values, compare); + let maxValue; + let max = -1; + let index = -1; + for (const value of values) { + ++index; + if (max < 0 + ? compare(value, value) === 0 + : compare(value, maxValue) > 0) { + maxValue = value; + max = index; + } + } + return max; +} + +function scan(values, compare) { + const index = leastIndex(values, compare); + return index < 0 ? undefined : index; +} + +var shuffle = shuffler(Math.random); + +function shuffler(random) { + return function shuffle(array, i0 = 0, i1 = array.length) { + let m = i1 - (i0 = +i0); + while (m) { + const i = random() * m-- | 0, t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + return array; + }; +} + +function sum(values, valueof) { + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + sum += value; + } + } + } + return sum; +} + +function transpose(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; +} + +function length(d) { + return d.length; +} + +function zip() { + return transpose(arguments); +} + +function every(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (!test(value, ++index, values)) { + return false; + } + } + return true; +} + +function some(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + return true; + } + } + return false; +} + +function filter(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + const array = []; + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + array.push(value); + } + } + return array; +} + +function map(values, mapper) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + if (typeof mapper !== "function") throw new TypeError("mapper is not a function"); + return Array.from(values, (value, index) => mapper(value, index, values)); +} + +function reduce(values, reducer, value) { + if (typeof reducer !== "function") throw new TypeError("reducer is not a function"); + const iterator = values[Symbol.iterator](); + let done, next, index = -1; + if (arguments.length < 3) { + ({done, value} = iterator.next()); + if (done) return; + ++index; + } + while (({done, value: next} = iterator.next()), !done) { + value = reducer(value, next, ++index, values); + } + return value; +} + +function reverse(values) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + return Array.from(values).reverse(); +} + +function difference(values, ...others) { + values = new Set(values); + for (const other of others) { + for (const value of other) { + values.delete(value); + } + } + return values; +} + +function disjoint(values, other) { + const iterator = other[Symbol.iterator](), set = new Set(); + for (const v of values) { + if (set.has(v)) return false; + let value, done; + while (({value, done} = iterator.next())) { + if (done) break; + if (Object.is(v, value)) return false; + set.add(value); + } + } + return true; +} + +function set(values) { + return values instanceof Set ? values : new Set(values); +} + +function intersection(values, ...others) { + values = new Set(values); + others = others.map(set); + out: for (const value of values) { + for (const other of others) { + if (!other.has(value)) { + values.delete(value); + continue out; + } + } + } + return values; +} + +function superset(values, other) { + const iterator = values[Symbol.iterator](), set = new Set(); + for (const o of other) { + if (set.has(o)) continue; + let value, done; + while (({value, done} = iterator.next())) { + if (done) return false; + set.add(value); + if (Object.is(o, value)) break; + } + } + return true; +} + +function subset(values, other) { + return superset(other, values); +} + +function union(...others) { + const set = new Set(); + for (const other of others) { + for (const o of other) { + set.add(o); + } + } + return set; +} + +exports.Adder = Adder; +exports.InternMap = InternMap; +exports.InternSet = InternSet; +exports.ascending = ascending; +exports.bin = bin; +exports.bisect = bisectRight; +exports.bisectCenter = bisectCenter; +exports.bisectLeft = bisectLeft; +exports.bisectRight = bisectRight; +exports.bisector = bisector; +exports.count = count; +exports.cross = cross; +exports.cumsum = cumsum; +exports.descending = descending; +exports.deviation = deviation; +exports.difference = difference; +exports.disjoint = disjoint; +exports.every = every; +exports.extent = extent; +exports.fcumsum = fcumsum; +exports.filter = filter; +exports.fsum = fsum; +exports.greatest = greatest; +exports.greatestIndex = greatestIndex; +exports.group = group; +exports.groupSort = groupSort; +exports.groups = groups; +exports.histogram = bin; +exports.index = index; +exports.indexes = indexes; +exports.intersection = intersection; +exports.least = least; +exports.leastIndex = leastIndex; +exports.map = map; +exports.max = max; +exports.maxIndex = maxIndex; +exports.mean = mean; +exports.median = median; +exports.merge = merge; +exports.min = min; +exports.minIndex = minIndex; +exports.nice = nice; +exports.pairs = pairs; +exports.permute = permute; +exports.quantile = quantile; +exports.quantileSorted = quantileSorted; +exports.quickselect = quickselect; +exports.range = range; +exports.reduce = reduce; +exports.reverse = reverse; +exports.rollup = rollup; +exports.rollups = rollups; +exports.scan = scan; +exports.shuffle = shuffle; +exports.shuffler = shuffler; +exports.some = some; +exports.sort = sort; +exports.subset = subset; +exports.sum = sum; +exports.superset = superset; +exports.thresholdFreedmanDiaconis = freedmanDiaconis; +exports.thresholdScott = scott; +exports.thresholdSturges = sturges; +exports.tickIncrement = tickIncrement; +exports.tickStep = tickStep; +exports.ticks = ticks; +exports.transpose = transpose; +exports.union = union; +exports.variance = variance; +exports.zip = zip; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/node_modules/d3-array/dist/d3-array.min.js b/node_modules/d3-array/dist/d3-array.min.js new file mode 100644 index 00000000..8d6e559a --- /dev/null +++ b/node_modules/d3-array/dist/d3-array.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-array/ v2.12.0 Copyright 2021 Mike Bostock +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).d3=t.d3||{})}(this,(function(t){"use strict";function n(t,n){return tn?1:t>=n?0:NaN}function r(t){let r=t,e=t;function o(t,n,r,o){for(null==r&&(r=0),null==o&&(o=t.length);r>>1;e(t[f],n)<0?r=f+1:o=f}return r}return 1===t.length&&(r=(n,r)=>t(n)-r,e=function(t){return(r,e)=>n(t(r),e)}(t)),{left:o,center:function(t,n,e,f){null==e&&(e=0),null==f&&(f=t.length);const i=o(t,n,e,f-1);return i>e&&r(t[i-1],n)>-r(t[i],n)?i-1:i},right:function(t,n,r,o){for(null==r&&(r=0),null==o&&(o=t.length);r>>1;e(t[f],n)>0?o=f:r=f+1}return r}}}function e(t){return null===t?NaN:+t}const o=r(n),f=o.right,i=o.left,u=r(e).center;function l(t,n){let r=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&++r;else{let e=-1;for(let o of t)null!=(o=n(o,++e,t))&&(o=+o)>=o&&++r}return r}function s(t){return 0|t.length}function c(t){return!(t>0)}function a(t){return"object"!=typeof t||"length"in t?t:Array.from(t)}function h(t,n){let r,e=0,o=0,f=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(r=n-o,o+=r/++e,f+=r*(n-o));else{let i=-1;for(let u of t)null!=(u=n(u,++i,t))&&(u=+u)>=u&&(r=u-o,o+=r/++e,f+=r*(u-o))}if(e>1)return f/(e-1)}function d(t,n){const r=h(t,n);return r?Math.sqrt(r):r}function p(t,n){let r,e;if(void 0===n)for(const n of t)null!=n&&(void 0===r?n>=n&&(r=e=n):(r>n&&(r=n),e=f&&(r=e=f):(r>f&&(r=f),e0){for(f=t[--o];o>0&&(n=f,r=t[--o],f=n+r,e=r-(f-n),!e););o>0&&(e<0&&t[o-1]<0||e>0&&t[o-1]>0)&&(r=2*e,n=f+r,r==n-f&&(f=n))}return f}}class v extends Map{constructor(t,n=b){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),null!=t)for(const[n,r]of t)this.set(n,r)}get(t){return super.get(g(this,t))}has(t){return super.has(g(this,t))}set(t,n){return super.set(M(this,t),n)}delete(t){return super.delete(w(this,t))}}class m extends Set{constructor(t,n=b){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),null!=t)for(const n of t)this.add(n)}has(t){return super.has(g(this,t))}add(t){return super.add(M(this,t))}delete(t){return super.delete(w(this,t))}}function g({_intern:t,_key:n},r){const e=n(r);return t.has(e)?t.get(e):r}function M({_intern:t,_key:n},r){const e=n(r);return t.has(e)?t.get(e):(t.set(e,r),r)}function w({_intern:t,_key:n},r){const e=n(r);return t.has(e)&&(r=t.get(r),t.delete(e)),r}function b(t){return null!==t&&"object"==typeof t?t.valueOf():t}function A(t){return t}function x(t,...n){return k(t,A,A,n)}function S(t,n,...r){return k(t,A,n,r)}function _(t){if(1!==t.length)throw new Error("duplicate key");return t[0]}function k(t,n,r,e){return function t(o,f){if(f>=e.length)return r(o);const i=new v,u=e[f++];let l=-1;for(const t of o){const n=u(t,++l,o),r=i.get(n);r?r.push(t):i.set(n,[t])}for(const[n,r]of i)i.set(n,t(r,f));return n(i)}(t,0)}function T(t,n){return Array.from(n,(n=>t[n]))}function j(t,...r){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");t=Array.from(t);let[e=n]=r;if(1===e.length||r.length>1){const o=Uint32Array.from(t,((t,n)=>n));return r.length>1?(r=r.map((n=>t.map(n))),o.sort(((t,e)=>{for(const o of r){const r=n(o[t],o[e]);if(r)return r}}))):(e=t.map(e),o.sort(((t,r)=>n(e[t],e[r])))),T(t,o)}return t.sort(e)}var E=Array.prototype.slice;function N(t){return function(){return t}}var q=Math.sqrt(50),F=Math.sqrt(10),I=Math.sqrt(2);function O(t,n,r){var e,o,f,i,u=-1;if(r=+r,(t=+t)===(n=+n)&&r>0)return[t];if((e=n0)for(t=Math.ceil(t/i),n=Math.floor(n/i),f=new Array(o=Math.ceil(n-t+1));++u=0?(f>=q?10:f>=F?5:f>=I?2:1)*Math.pow(10,o):-Math.pow(10,-o)/(f>=q?10:f>=F?5:f>=I?2:1)}function P(t,n,r){let e;for(;;){const o=L(t,n,r);if(o===e||0===o||!isFinite(o))return[t,n];o>0?(t=Math.floor(t/o)*o,n=Math.ceil(n/o)*o):o<0&&(t=Math.ceil(t*o)/o,n=Math.floor(n*o)/o),e=o}}function z(t){return Math.ceil(Math.log(l(t))/Math.LN2)+1}function C(){var t=A,n=p,r=z;function e(e){Array.isArray(e)||(e=Array.from(e));var o,i,u=e.length,l=new Array(u);for(o=0;o=a)if(t>=a&&n===p){const t=L(c,a,r);isFinite(t)&&(t>0?a=(Math.floor(a/t)+1)*t:t<0&&(a=(Math.ceil(a*-t)+1)/-t))}else h.pop()}for(var d=h.length;h[0]<=c;)h.shift(),--d;for(;h[d-1]>a;)h.pop(),--d;var y,v=new Array(d+1);for(o=0;o<=d;++o)(y=v[o]=[]).x0=o>0?h[o-1]:c,y.x1=o=n)&&(r=n);else{let e=-1;for(let o of t)null!=(o=n(o,++e,t))&&(r=o)&&(r=o)}return r}function R(t,n){let r;if(void 0===n)for(const n of t)null!=n&&(r>n||void 0===r&&n>=n)&&(r=n);else{let e=-1;for(let o of t)null!=(o=n(o,++e,t))&&(r>o||void 0===r&&o>=o)&&(r=o)}return r}function U(t,r,e=0,o=t.length-1,f=n){for(;o>e;){if(o-e>600){const n=o-e+1,i=r-e+1,u=Math.log(n),l=.5*Math.exp(2*u/3),s=.5*Math.sqrt(u*l*(n-l)/n)*(i-n/2<0?-1:1);U(t,r,Math.max(e,Math.floor(r-i*l/n+s)),Math.min(o,Math.floor(r+(n-i)*l/n+s)),f)}const n=t[r];let i=e,u=o;for(B(t,e,r),f(t[o],n)>0&&B(t,e,o);i0;)--u}0===f(t[e],n)?B(t,e,u):(++u,B(t,u,o)),u<=r&&(e=u+1),r<=u&&(o=u-1)}return t}function B(t,n,r){const e=t[n];t[n]=t[r],t[r]=e}function G(t,n,r){if(e=(t=Float64Array.from(function*(t,n){if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(yield n);else{let r=-1;for(let e of t)null!=(e=n(e,++r,t))&&(e=+e)>=e&&(yield e)}}(t,r))).length){if((n=+n)<=0||e<2)return R(t);if(n>=1)return D(t);var e,o=(e-1)*n,f=Math.floor(o),i=D(U(t,f).subarray(0,f+1));return i+(R(t.subarray(f+1))-i)*(o-f)}}function H(t,n){let r,e=-1,o=-1;if(void 0===n)for(const n of t)++o,null!=n&&(r=n)&&(r=n,e=o);else for(let f of t)null!=(f=n(f,++o,t))&&(r=f)&&(r=f,e=o);return e}function J(t,n){let r,e=-1,o=-1;if(void 0===n)for(const n of t)++o,null!=n&&(r>n||void 0===r&&n>=n)&&(r=n,e=o);else for(let f of t)null!=(f=n(f,++o,t))&&(r>f||void 0===r&&f>=f)&&(r=f,e=o);return e}function K(t,n){return[t,n]}function Q(t,r=n){if(1===r.length)return J(t,r);let e,o=-1,f=-1;for(const n of t)++f,(o<0?0===r(n,n):r(n,e)<0)&&(e=n,o=f);return o}var V=W(Math.random);function W(t){return function(n,r=0,e=n.length){let o=e-(r=+r);for(;o;){const e=t()*o--|0,f=n[o+r];n[o+r]=n[e+r],n[e+r]=f}return n}}function X(t){if(!(o=t.length))return[];for(var n=-1,r=R(t,Y),e=new Array(r);++nt(...n)}(t.pop()),r=(t=t.map(a)).map(s),e=t.length-1,o=new Array(e+1).fill(0),f=[];if(e<0||r.some(c))return f;for(;;){f.push(o.map(((n,r)=>t[r][n])));let i=e;for(;++o[i]===r[i];){if(0===i)return n?f.map(n):f;o[i--]=0}}},t.cumsum=function(t,n){var r=0,e=0;return Float64Array.from(t,void 0===n?t=>r+=+t||0:o=>r+=+n(o,e++,t)||0)},t.descending=function(t,n){return nt?1:n>=t?0:NaN},t.deviation=d,t.difference=function(t,...n){t=new Set(t);for(const r of n)for(const n of r)t.delete(n);return t},t.disjoint=function(t,n){const r=n[Symbol.iterator](),e=new Set;for(const n of t){if(e.has(n))return!1;let t,o;for(;({value:t,done:o}=r.next())&&!o;){if(Object.is(n,t))return!1;e.add(t)}}return!0},t.every=function(t,n){if("function"!=typeof n)throw new TypeError("test is not a function");let r=-1;for(const e of t)if(!n(e,++r,t))return!1;return!0},t.extent=p,t.fcumsum=function(t,n){const r=new y;let e=-1;return Float64Array.from(t,void 0===n?t=>r.add(+t||0):o=>r.add(+n(o,++e,t)||0))},t.filter=function(t,n){if("function"!=typeof n)throw new TypeError("test is not a function");const r=[];let e=-1;for(const o of t)n(o,++e,t)&&r.push(o);return r},t.fsum=function(t,n){const r=new y;if(void 0===n)for(let n of t)(n=+n)&&r.add(n);else{let e=-1;for(let o of t)(o=+n(o,++e,t))&&r.add(o)}return+r},t.greatest=function(t,r=n){let e,o=!1;if(1===r.length){let f;for(const i of t){const t=r(i);(o?n(t,f)>0:0===n(t,t))&&(e=i,f=t,o=!0)}}else for(const n of t)(o?r(n,e)>0:0===r(n,n))&&(e=n,o=!0);return e},t.greatestIndex=function(t,r=n){if(1===r.length)return H(t,r);let e,o=-1,f=-1;for(const n of t)++f,(o<0?0===r(n,n):r(n,e)>0)&&(e=n,o=f);return o},t.group=x,t.groupSort=function(t,r,e){return(1===r.length?j(S(t,r,e),(([t,r],[e,o])=>n(r,o)||n(t,e))):j(x(t,e),(([t,e],[o,f])=>r(e,f)||n(t,o)))).map((([t])=>t))},t.groups=function(t,...n){return k(t,Array.from,A,n)},t.histogram=C,t.index=function(t,...n){return k(t,A,_,n)},t.indexes=function(t,...n){return k(t,Array.from,_,n)},t.intersection=function(t,...n){t=new Set(t),n=n.map(Z);t:for(const r of t)for(const e of n)if(!e.has(r)){t.delete(r);continue t}return t},t.least=function(t,r=n){let e,o=!1;if(1===r.length){let f;for(const i of t){const t=r(i);(o?n(t,f)<0:0===n(t,t))&&(e=i,f=t,o=!0)}}else for(const n of t)(o?r(n,e)<0:0===r(n,n))&&(e=n,o=!0);return e},t.leastIndex=Q,t.map=function(t,n){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");if("function"!=typeof n)throw new TypeError("mapper is not a function");return Array.from(t,((r,e)=>n(r,e,t)))},t.max=D,t.maxIndex=H,t.mean=function(t,n){let r=0,e=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(++r,e+=n);else{let o=-1;for(let f of t)null!=(f=n(f,++o,t))&&(f=+f)>=f&&(++r,e+=f)}if(r)return e/r},t.median=function(t,n){return G(t,.5,n)},t.merge=function(t){return Array.from(function*(t){for(const n of t)yield*n}(t))},t.min=R,t.minIndex=J,t.nice=P,t.pairs=function(t,n=K){const r=[];let e,o=!1;for(const f of t)o&&r.push(n(e,f)),e=f,o=!0;return r},t.permute=T,t.quantile=G,t.quantileSorted=function(t,n,r=e){if(o=t.length){if((n=+n)<=0||o<2)return+r(t[0],0,t);if(n>=1)return+r(t[o-1],o-1,t);var o,f=(o-1)*n,i=Math.floor(f),u=+r(t[i],i,t);return u+(+r(t[i+1],i+1,t)-u)*(f-i)}},t.quickselect=U,t.range=function(t,n,r){t=+t,n=+n,r=(o=arguments.length)<2?(n=t,t=0,1):o<3?1:+r;for(var e=-1,o=0|Math.max(0,Math.ceil((n-t)/r)),f=new Array(o);++e=q?o*=10:f>=F?o*=5:f>=I&&(o*=2),n b ? 1 : a >= b ? 0 : NaN; +} diff --git a/node_modules/d3-array/src/bin.js b/node_modules/d3-array/src/bin.js new file mode 100644 index 00000000..0bbb5532 --- /dev/null +++ b/node_modules/d3-array/src/bin.js @@ -0,0 +1,101 @@ +import {slice} from "./array.js"; +import bisect from "./bisect.js"; +import constant from "./constant.js"; +import extent from "./extent.js"; +import identity from "./identity.js"; +import nice from "./nice.js"; +import ticks, {tickIncrement} from "./ticks.js"; +import sturges from "./threshold/sturges.js"; + +export default function() { + var value = identity, + domain = extent, + threshold = sturges; + + function histogram(data) { + if (!Array.isArray(data)) data = Array.from(data); + + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds, and nice the + // default domain accordingly. + if (!Array.isArray(tz)) { + const max = x1, tn = +tz; + if (domain === extent) [x0, x1] = nice(x0, x1, tn); + tz = ticks(x0, x1, tn); + + // If the last threshold is coincident with the domain’s upper bound, the + // last bin will be zero-width. If the default domain is used, and this + // last threshold is coincident with the maximum input value, we can + // extend the niced upper bound by one tick to ensure uniform bin widths; + // otherwise, we simply remove the last threshold. Note that we don’t + // coerce values or the domain to numbers, and thus must be careful to + // compare order (>=) rather than strict equality (===)! + if (tz[tz.length - 1] >= x1) { + if (max >= x1 && domain === extent) { + const step = tickIncrement(x0, x1, tn); + if (isFinite(step)) { + if (step > 0) { + x1 = (Math.floor(x1 / step) + 1) * step; + } else if (step < 0) { + x1 = (Math.ceil(x1 * -step) + 1) / -step; + } + } + } else { + tz.pop(); + } + } + } + + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] > x1) tz.pop(), --m; + + var bins = new Array(m + 1), + bin; + + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } + + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisect(tz, x, 0, m)].push(data[i]); + } + } + + return bins; + } + + histogram.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + }; + + histogram.domain = function(_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + }; + + return histogram; +} diff --git a/node_modules/d3-array/src/bisect.js b/node_modules/d3-array/src/bisect.js new file mode 100644 index 00000000..333a7e43 --- /dev/null +++ b/node_modules/d3-array/src/bisect.js @@ -0,0 +1,9 @@ +import ascending from "./ascending.js"; +import bisector from "./bisector.js"; +import number from "./number.js"; + +const ascendingBisect = bisector(ascending); +export const bisectRight = ascendingBisect.right; +export const bisectLeft = ascendingBisect.left; +export const bisectCenter = bisector(number).center; +export default bisectRight; diff --git a/node_modules/d3-array/src/bisector.js b/node_modules/d3-array/src/bisector.js new file mode 100644 index 00000000..7b265dc4 --- /dev/null +++ b/node_modules/d3-array/src/bisector.js @@ -0,0 +1,46 @@ +import ascending from "./ascending.js"; + +export default function(f) { + let delta = f; + let compare = f; + + if (f.length === 1) { + delta = (d, x) => f(d) - x; + compare = ascendingComparator(f); + } + + function left(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + } + + function right(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + + function center(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + const i = left(a, x, lo, hi - 1); + return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i; + } + + return {left, center, right}; +} + +function ascendingComparator(f) { + return (d, x) => ascending(f(d), x); +} diff --git a/node_modules/d3-array/src/constant.js b/node_modules/d3-array/src/constant.js new file mode 100644 index 00000000..b7d42e71 --- /dev/null +++ b/node_modules/d3-array/src/constant.js @@ -0,0 +1,5 @@ +export default function(x) { + return function() { + return x; + }; +} diff --git a/node_modules/d3-array/src/count.js b/node_modules/d3-array/src/count.js new file mode 100644 index 00000000..b8783f08 --- /dev/null +++ b/node_modules/d3-array/src/count.js @@ -0,0 +1,18 @@ +export default function count(values, valueof) { + let count = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count; + } + } + } + return count; +} diff --git a/node_modules/d3-array/src/cross.js b/node_modules/d3-array/src/cross.js new file mode 100644 index 00000000..7efdbe3c --- /dev/null +++ b/node_modules/d3-array/src/cross.js @@ -0,0 +1,33 @@ +function length(array) { + return array.length | 0; +} + +function empty(length) { + return !(length > 0); +} + +function arrayify(values) { + return typeof values !== "object" || "length" in values ? values : Array.from(values); +} + +function reducer(reduce) { + return values => reduce(...values); +} + +export default function cross(...values) { + const reduce = typeof values[values.length - 1] === "function" && reducer(values.pop()); + values = values.map(arrayify); + const lengths = values.map(length); + const j = values.length - 1; + const index = new Array(j + 1).fill(0); + const product = []; + if (j < 0 || lengths.some(empty)) return product; + while (true) { + product.push(index.map((j, i) => values[i][j])); + let i = j; + while (++index[i] === lengths[i]) { + if (i === 0) return reduce ? product.map(reduce) : product; + index[i--] = 0; + } + } +} diff --git a/node_modules/d3-array/src/cumsum.js b/node_modules/d3-array/src/cumsum.js new file mode 100644 index 00000000..86fb0522 --- /dev/null +++ b/node_modules/d3-array/src/cumsum.js @@ -0,0 +1,6 @@ +export default function cumsum(values, valueof) { + var sum = 0, index = 0; + return Float64Array.from(values, valueof === undefined + ? v => (sum += +v || 0) + : v => (sum += +valueof(v, index++, values) || 0)); +} \ No newline at end of file diff --git a/node_modules/d3-array/src/descending.js b/node_modules/d3-array/src/descending.js new file mode 100644 index 00000000..a4e2d7fb --- /dev/null +++ b/node_modules/d3-array/src/descending.js @@ -0,0 +1,3 @@ +export default function(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} diff --git a/node_modules/d3-array/src/deviation.js b/node_modules/d3-array/src/deviation.js new file mode 100644 index 00000000..d5dbe7a9 --- /dev/null +++ b/node_modules/d3-array/src/deviation.js @@ -0,0 +1,6 @@ +import variance from "./variance.js"; + +export default function deviation(values, valueof) { + const v = variance(values, valueof); + return v ? Math.sqrt(v) : v; +} diff --git a/node_modules/d3-array/src/difference.js b/node_modules/d3-array/src/difference.js new file mode 100644 index 00000000..066334ba --- /dev/null +++ b/node_modules/d3-array/src/difference.js @@ -0,0 +1,9 @@ +export default function difference(values, ...others) { + values = new Set(values); + for (const other of others) { + for (const value of other) { + values.delete(value); + } + } + return values; +} diff --git a/node_modules/d3-array/src/disjoint.js b/node_modules/d3-array/src/disjoint.js new file mode 100644 index 00000000..02dfd03a --- /dev/null +++ b/node_modules/d3-array/src/disjoint.js @@ -0,0 +1,13 @@ +export default function disjoint(values, other) { + const iterator = other[Symbol.iterator](), set = new Set(); + for (const v of values) { + if (set.has(v)) return false; + let value, done; + while (({value, done} = iterator.next())) { + if (done) break; + if (Object.is(v, value)) return false; + set.add(value); + } + } + return true; +} diff --git a/node_modules/d3-array/src/every.js b/node_modules/d3-array/src/every.js new file mode 100644 index 00000000..484cac23 --- /dev/null +++ b/node_modules/d3-array/src/every.js @@ -0,0 +1,10 @@ +export default function every(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (!test(value, ++index, values)) { + return false; + } + } + return true; +} diff --git a/node_modules/d3-array/src/extent.js b/node_modules/d3-array/src/extent.js new file mode 100644 index 00000000..2e3738d6 --- /dev/null +++ b/node_modules/d3-array/src/extent.js @@ -0,0 +1,29 @@ +export default function(values, valueof) { + let min; + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + return [min, max]; +} diff --git a/node_modules/d3-array/src/filter.js b/node_modules/d3-array/src/filter.js new file mode 100644 index 00000000..d653392f --- /dev/null +++ b/node_modules/d3-array/src/filter.js @@ -0,0 +1,11 @@ +export default function filter(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + const array = []; + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + array.push(value); + } + } + return array; +} diff --git a/node_modules/d3-array/src/fsum.js b/node_modules/d3-array/src/fsum.js new file mode 100644 index 00000000..4a8e1cfc --- /dev/null +++ b/node_modules/d3-array/src/fsum.js @@ -0,0 +1,69 @@ +// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423 +export class Adder { + constructor() { + this._partials = new Float64Array(32); + this._n = 0; + } + add(x) { + const p = this._partials; + let i = 0; + for (let j = 0; j < this._n && j < 32; j++) { + const y = p[j], + hi = x + y, + lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x); + if (lo) p[i++] = lo; + x = hi; + } + p[i] = x; + this._n = i + 1; + return this; + } + valueOf() { + const p = this._partials; + let n = this._n, x, y, lo, hi = 0; + if (n > 0) { + hi = p[--n]; + while (n > 0) { + x = hi; + y = p[--n]; + hi = x + y; + lo = y - (hi - x); + if (lo) break; + } + if (n > 0 && ((lo < 0 && p[n - 1] < 0) || (lo > 0 && p[n - 1] > 0))) { + y = lo * 2; + x = hi + y; + if (y == x - hi) hi = x; + } + } + return hi; + } +} + +export function fsum(values, valueof) { + const adder = new Adder(); + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + adder.add(value); + } + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + adder.add(value); + } + } + } + return +adder; +} + +export function fcumsum(values, valueof) { + const adder = new Adder(); + let index = -1; + return Float64Array.from(values, valueof === undefined + ? v => adder.add(+v || 0) + : v => adder.add(+valueof(v, ++index, values) || 0) + ); +} diff --git a/node_modules/d3-array/src/greatest.js b/node_modules/d3-array/src/greatest.js new file mode 100644 index 00000000..521f4f5c --- /dev/null +++ b/node_modules/d3-array/src/greatest.js @@ -0,0 +1,29 @@ +import ascending from "./ascending.js"; + +export default function greatest(values, compare = ascending) { + let max; + let defined = false; + if (compare.length === 1) { + let maxValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending(value, maxValue) > 0 + : ascending(value, value) === 0) { + max = element; + maxValue = value; + defined = true; + } + } + } else { + for (const value of values) { + if (defined + ? compare(value, max) > 0 + : compare(value, value) === 0) { + max = value; + defined = true; + } + } + } + return max; +} diff --git a/node_modules/d3-array/src/greatestIndex.js b/node_modules/d3-array/src/greatestIndex.js new file mode 100644 index 00000000..2f390e5b --- /dev/null +++ b/node_modules/d3-array/src/greatestIndex.js @@ -0,0 +1,19 @@ +import ascending from "./ascending.js"; +import maxIndex from "./maxIndex.js"; + +export default function greatestIndex(values, compare = ascending) { + if (compare.length === 1) return maxIndex(values, compare); + let maxValue; + let max = -1; + let index = -1; + for (const value of values) { + ++index; + if (max < 0 + ? compare(value, value) === 0 + : compare(value, maxValue) > 0) { + maxValue = value; + max = index; + } + } + return max; +} diff --git a/node_modules/d3-array/src/group.js b/node_modules/d3-array/src/group.js new file mode 100644 index 00000000..77ae4dc7 --- /dev/null +++ b/node_modules/d3-array/src/group.js @@ -0,0 +1,50 @@ +import {InternMap} from "internmap"; +import identity from "./identity.js"; + +export default function group(values, ...keys) { + return nest(values, identity, identity, keys); +} + +export function groups(values, ...keys) { + return nest(values, Array.from, identity, keys); +} + +export function rollup(values, reduce, ...keys) { + return nest(values, identity, reduce, keys); +} + +export function rollups(values, reduce, ...keys) { + return nest(values, Array.from, reduce, keys); +} + +export function index(values, ...keys) { + return nest(values, identity, unique, keys); +} + +export function indexes(values, ...keys) { + return nest(values, Array.from, unique, keys); +} + +function unique(values) { + if (values.length !== 1) throw new Error("duplicate key"); + return values[0]; +} + +function nest(values, map, reduce, keys) { + return (function regroup(values, i) { + if (i >= keys.length) return reduce(values); + const groups = new InternMap(); + const keyof = keys[i++]; + let index = -1; + for (const value of values) { + const key = keyof(value, ++index, values); + const group = groups.get(key); + if (group) group.push(value); + else groups.set(key, [value]); + } + for (const [key, values] of groups) { + groups.set(key, regroup(values, i)); + } + return map(groups); + })(values, 0); +} diff --git a/node_modules/d3-array/src/groupSort.js b/node_modules/d3-array/src/groupSort.js new file mode 100644 index 00000000..1d1e93a9 --- /dev/null +++ b/node_modules/d3-array/src/groupSort.js @@ -0,0 +1,10 @@ +import ascending from "./ascending.js"; +import group, {rollup} from "./group.js"; +import sort from "./sort.js"; + +export default function groupSort(values, reduce, key) { + return (reduce.length === 1 + ? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending(av, bv) || ascending(ak, bk))) + : sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending(ak, bk)))) + .map(([key]) => key); +} diff --git a/node_modules/d3-array/src/identity.js b/node_modules/d3-array/src/identity.js new file mode 100644 index 00000000..b2f94b2e --- /dev/null +++ b/node_modules/d3-array/src/identity.js @@ -0,0 +1,3 @@ +export default function(x) { + return x; +} diff --git a/node_modules/d3-array/src/index.js b/node_modules/d3-array/src/index.js new file mode 100644 index 00000000..571aedca --- /dev/null +++ b/node_modules/d3-array/src/index.js @@ -0,0 +1,54 @@ +export {default as bisect, bisectRight, bisectLeft, bisectCenter} from "./bisect.js"; +export {default as ascending} from "./ascending.js"; +export {default as bisector} from "./bisector.js"; +export {default as count} from "./count.js"; +export {default as cross} from "./cross.js"; +export {default as cumsum} from "./cumsum.js"; +export {default as descending} from "./descending.js"; +export {default as deviation} from "./deviation.js"; +export {default as extent} from "./extent.js"; +export {Adder, fsum, fcumsum} from "./fsum.js"; +export {default as group, groups, index, indexes, rollup, rollups} from "./group.js"; +export {default as groupSort} from "./groupSort.js"; +export {default as bin, default as histogram} from "./bin.js"; // Deprecated; use bin. +export {default as thresholdFreedmanDiaconis} from "./threshold/freedmanDiaconis.js"; +export {default as thresholdScott} from "./threshold/scott.js"; +export {default as thresholdSturges} from "./threshold/sturges.js"; +export {default as max} from "./max.js"; +export {default as maxIndex} from "./maxIndex.js"; +export {default as mean} from "./mean.js"; +export {default as median} from "./median.js"; +export {default as merge} from "./merge.js"; +export {default as min} from "./min.js"; +export {default as minIndex} from "./minIndex.js"; +export {default as nice} from "./nice.js"; +export {default as pairs} from "./pairs.js"; +export {default as permute} from "./permute.js"; +export {default as quantile, quantileSorted} from "./quantile.js"; +export {default as quickselect} from "./quickselect.js"; +export {default as range} from "./range.js"; +export {default as least} from "./least.js"; +export {default as leastIndex} from "./leastIndex.js"; +export {default as greatest} from "./greatest.js"; +export {default as greatestIndex} from "./greatestIndex.js"; +export {default as scan} from "./scan.js"; // Deprecated; use leastIndex. +export {default as shuffle, shuffler} from "./shuffle.js"; +export {default as sum} from "./sum.js"; +export {default as ticks, tickIncrement, tickStep} from "./ticks.js"; +export {default as transpose} from "./transpose.js"; +export {default as variance} from "./variance.js"; +export {default as zip} from "./zip.js"; +export {default as every} from "./every.js"; +export {default as some} from "./some.js"; +export {default as filter} from "./filter.js"; +export {default as map} from "./map.js"; +export {default as reduce} from "./reduce.js"; +export {default as reverse} from "./reverse.js"; +export {default as sort} from "./sort.js"; +export {default as difference} from "./difference.js"; +export {default as disjoint} from "./disjoint.js"; +export {default as intersection} from "./intersection.js"; +export {default as subset} from "./subset.js"; +export {default as superset} from "./superset.js"; +export {default as union} from "./union.js"; +export {InternMap, InternSet} from "internmap"; diff --git a/node_modules/d3-array/src/intersection.js b/node_modules/d3-array/src/intersection.js new file mode 100644 index 00000000..2c6af2ab --- /dev/null +++ b/node_modules/d3-array/src/intersection.js @@ -0,0 +1,15 @@ +import set from "./set.js"; + +export default function intersection(values, ...others) { + values = new Set(values); + others = others.map(set); + out: for (const value of values) { + for (const other of others) { + if (!other.has(value)) { + values.delete(value); + continue out; + } + } + } + return values; +} diff --git a/node_modules/d3-array/src/least.js b/node_modules/d3-array/src/least.js new file mode 100644 index 00000000..a756abf4 --- /dev/null +++ b/node_modules/d3-array/src/least.js @@ -0,0 +1,29 @@ +import ascending from "./ascending.js"; + +export default function least(values, compare = ascending) { + let min; + let defined = false; + if (compare.length === 1) { + let minValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending(value, minValue) < 0 + : ascending(value, value) === 0) { + min = element; + minValue = value; + defined = true; + } + } + } else { + for (const value of values) { + if (defined + ? compare(value, min) < 0 + : compare(value, value) === 0) { + min = value; + defined = true; + } + } + } + return min; +} diff --git a/node_modules/d3-array/src/leastIndex.js b/node_modules/d3-array/src/leastIndex.js new file mode 100644 index 00000000..ee3542be --- /dev/null +++ b/node_modules/d3-array/src/leastIndex.js @@ -0,0 +1,19 @@ +import ascending from "./ascending.js"; +import minIndex from "./minIndex.js"; + +export default function leastIndex(values, compare = ascending) { + if (compare.length === 1) return minIndex(values, compare); + let minValue; + let min = -1; + let index = -1; + for (const value of values) { + ++index; + if (min < 0 + ? compare(value, value) === 0 + : compare(value, minValue) < 0) { + minValue = value; + min = index; + } + } + return min; +} diff --git a/node_modules/d3-array/src/map.js b/node_modules/d3-array/src/map.js new file mode 100644 index 00000000..4e568190 --- /dev/null +++ b/node_modules/d3-array/src/map.js @@ -0,0 +1,5 @@ +export default function map(values, mapper) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + if (typeof mapper !== "function") throw new TypeError("mapper is not a function"); + return Array.from(values, (value, index) => mapper(value, index, values)); +} diff --git a/node_modules/d3-array/src/max.js b/node_modules/d3-array/src/max.js new file mode 100644 index 00000000..ce287368 --- /dev/null +++ b/node_modules/d3-array/src/max.js @@ -0,0 +1,20 @@ +export default function max(values, valueof) { + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (max < value || (max === undefined && value >= value))) { + max = value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { + max = value; + } + } + } + return max; +} diff --git a/node_modules/d3-array/src/maxIndex.js b/node_modules/d3-array/src/maxIndex.js new file mode 100644 index 00000000..87da1a2c --- /dev/null +++ b/node_modules/d3-array/src/maxIndex.js @@ -0,0 +1,22 @@ +export default function maxIndex(values, valueof) { + let max; + let maxIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } + } + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } + } + } + return maxIndex; +} diff --git a/node_modules/d3-array/src/mean.js b/node_modules/d3-array/src/mean.js new file mode 100644 index 00000000..ff6fc461 --- /dev/null +++ b/node_modules/d3-array/src/mean.js @@ -0,0 +1,19 @@ +export default function mean(values, valueof) { + let count = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count, sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count, sum += value; + } + } + } + if (count) return sum / count; +} diff --git a/node_modules/d3-array/src/median.js b/node_modules/d3-array/src/median.js new file mode 100644 index 00000000..82cbc4e5 --- /dev/null +++ b/node_modules/d3-array/src/median.js @@ -0,0 +1,5 @@ +import quantile from "./quantile.js"; + +export default function(values, valueof) { + return quantile(values, 0.5, valueof); +} diff --git a/node_modules/d3-array/src/merge.js b/node_modules/d3-array/src/merge.js new file mode 100644 index 00000000..a3680028 --- /dev/null +++ b/node_modules/d3-array/src/merge.js @@ -0,0 +1,9 @@ +function* flatten(arrays) { + for (const array of arrays) { + yield* array; + } +} + +export default function merge(arrays) { + return Array.from(flatten(arrays)); +} diff --git a/node_modules/d3-array/src/min.js b/node_modules/d3-array/src/min.js new file mode 100644 index 00000000..df88bfb2 --- /dev/null +++ b/node_modules/d3-array/src/min.js @@ -0,0 +1,20 @@ +export default function min(values, valueof) { + let min; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value; + } + } + } + return min; +} diff --git a/node_modules/d3-array/src/minIndex.js b/node_modules/d3-array/src/minIndex.js new file mode 100644 index 00000000..5c07d1ea --- /dev/null +++ b/node_modules/d3-array/src/minIndex.js @@ -0,0 +1,22 @@ +export default function minIndex(values, valueof) { + let min; + let minIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; + } + } + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; + } + } + } + return minIndex; +} diff --git a/node_modules/d3-array/src/nice.js b/node_modules/d3-array/src/nice.js new file mode 100644 index 00000000..579b418c --- /dev/null +++ b/node_modules/d3-array/src/nice.js @@ -0,0 +1,18 @@ +import {tickIncrement} from "./ticks.js"; + +export default function nice(start, stop, count) { + let prestep; + while (true) { + const step = tickIncrement(start, stop, count); + if (step === prestep || step === 0 || !isFinite(step)) { + return [start, stop]; + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } + prestep = step; + } +} diff --git a/node_modules/d3-array/src/number.js b/node_modules/d3-array/src/number.js new file mode 100644 index 00000000..3a9a5243 --- /dev/null +++ b/node_modules/d3-array/src/number.js @@ -0,0 +1,20 @@ +export default function(x) { + return x === null ? NaN : +x; +} + +export function* numbers(values, valueof) { + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + yield value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + yield value; + } + } + } +} diff --git a/node_modules/d3-array/src/pairs.js b/node_modules/d3-array/src/pairs.js new file mode 100644 index 00000000..bfaafece --- /dev/null +++ b/node_modules/d3-array/src/pairs.js @@ -0,0 +1,15 @@ +export default function pairs(values, pairof = pair) { + const pairs = []; + let previous; + let first = false; + for (const value of values) { + if (first) pairs.push(pairof(previous, value)); + previous = value; + first = true; + } + return pairs; +} + +export function pair(a, b) { + return [a, b]; +} diff --git a/node_modules/d3-array/src/permute.js b/node_modules/d3-array/src/permute.js new file mode 100644 index 00000000..c7e822d1 --- /dev/null +++ b/node_modules/d3-array/src/permute.js @@ -0,0 +1,3 @@ +export default function(source, keys) { + return Array.from(keys, key => source[key]); +} diff --git a/node_modules/d3-array/src/quantile.js b/node_modules/d3-array/src/quantile.js new file mode 100644 index 00000000..09ddac7c --- /dev/null +++ b/node_modules/d3-array/src/quantile.js @@ -0,0 +1,29 @@ +import max from "./max.js"; +import min from "./min.js"; +import quickselect from "./quickselect.js"; +import number, {numbers} from "./number.js"; + +export default function quantile(values, p, valueof) { + values = Float64Array.from(numbers(values, valueof)); + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return min(values); + if (p >= 1) return max(values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = max(quickselect(values, i0).subarray(0, i0 + 1)), + value1 = min(values.subarray(i0 + 1)); + return value0 + (value1 - value0) * (i - i0); +} + +export function quantileSorted(values, p, valueof = number) { + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); +} diff --git a/node_modules/d3-array/src/quickselect.js b/node_modules/d3-array/src/quickselect.js new file mode 100644 index 00000000..2a31d365 --- /dev/null +++ b/node_modules/d3-array/src/quickselect.js @@ -0,0 +1,44 @@ +import ascending from "./ascending.js"; + +// Based on https://github.com/mourner/quickselect +// ISC license, Copyright 2018 Vladimir Agafonkin. +export default function quickselect(array, k, left = 0, right = array.length - 1, compare = ascending) { + while (right > left) { + if (right - left > 600) { + const n = right - left + 1; + const m = k - left + 1; + const z = Math.log(n); + const s = 0.5 * Math.exp(2 * z / 3); + const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + const newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + quickselect(array, k, newLeft, newRight, compare); + } + + const t = array[k]; + let i = left; + let j = right; + + swap(array, left, k); + if (compare(array[right], t) > 0) swap(array, left, right); + + while (i < j) { + swap(array, i, j), ++i, --j; + while (compare(array[i], t) < 0) ++i; + while (compare(array[j], t) > 0) --j; + } + + if (compare(array[left], t) === 0) swap(array, left, j); + else ++j, swap(array, j, right); + + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } + return array; +} + +function swap(array, i, j) { + const t = array[i]; + array[i] = array[j]; + array[j] = t; +} diff --git a/node_modules/d3-array/src/range.js b/node_modules/d3-array/src/range.js new file mode 100644 index 00000000..59756015 --- /dev/null +++ b/node_modules/d3-array/src/range.js @@ -0,0 +1,13 @@ +export default function(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; +} diff --git a/node_modules/d3-array/src/reduce.js b/node_modules/d3-array/src/reduce.js new file mode 100644 index 00000000..3b49cf56 --- /dev/null +++ b/node_modules/d3-array/src/reduce.js @@ -0,0 +1,14 @@ +export default function reduce(values, reducer, value) { + if (typeof reducer !== "function") throw new TypeError("reducer is not a function"); + const iterator = values[Symbol.iterator](); + let done, next, index = -1; + if (arguments.length < 3) { + ({done, value} = iterator.next()); + if (done) return; + ++index; + } + while (({done, value: next} = iterator.next()), !done) { + value = reducer(value, next, ++index, values); + } + return value; +} diff --git a/node_modules/d3-array/src/reverse.js b/node_modules/d3-array/src/reverse.js new file mode 100644 index 00000000..da6742cf --- /dev/null +++ b/node_modules/d3-array/src/reverse.js @@ -0,0 +1,4 @@ +export default function reverse(values) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + return Array.from(values).reverse(); +} diff --git a/node_modules/d3-array/src/scan.js b/node_modules/d3-array/src/scan.js new file mode 100644 index 00000000..9c538f8a --- /dev/null +++ b/node_modules/d3-array/src/scan.js @@ -0,0 +1,6 @@ +import leastIndex from "./leastIndex.js"; + +export default function scan(values, compare) { + const index = leastIndex(values, compare); + return index < 0 ? undefined : index; +} diff --git a/node_modules/d3-array/src/set.js b/node_modules/d3-array/src/set.js new file mode 100644 index 00000000..a115f9a4 --- /dev/null +++ b/node_modules/d3-array/src/set.js @@ -0,0 +1,3 @@ +export default function set(values) { + return values instanceof Set ? values : new Set(values); +} diff --git a/node_modules/d3-array/src/shuffle.js b/node_modules/d3-array/src/shuffle.js new file mode 100644 index 00000000..426cdac0 --- /dev/null +++ b/node_modules/d3-array/src/shuffle.js @@ -0,0 +1,13 @@ +export default shuffler(Math.random); + +export function shuffler(random) { + return function shuffle(array, i0 = 0, i1 = array.length) { + let m = i1 - (i0 = +i0); + while (m) { + const i = random() * m-- | 0, t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + return array; + }; +} diff --git a/node_modules/d3-array/src/some.js b/node_modules/d3-array/src/some.js new file mode 100644 index 00000000..0b8f98b9 --- /dev/null +++ b/node_modules/d3-array/src/some.js @@ -0,0 +1,10 @@ +export default function some(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + return true; + } + } + return false; +} diff --git a/node_modules/d3-array/src/sort.js b/node_modules/d3-array/src/sort.js new file mode 100644 index 00000000..6febc004 --- /dev/null +++ b/node_modules/d3-array/src/sort.js @@ -0,0 +1,25 @@ +import ascending from "./ascending.js"; +import permute from "./permute.js"; + +export default function sort(values, ...F) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + values = Array.from(values); + let [f = ascending] = F; + if (f.length === 1 || F.length > 1) { + const index = Uint32Array.from(values, (d, i) => i); + if (F.length > 1) { + F = F.map(f => values.map(f)); + index.sort((i, j) => { + for (const f of F) { + const c = ascending(f[i], f[j]); + if (c) return c; + } + }); + } else { + f = values.map(f); + index.sort((i, j) => ascending(f[i], f[j])); + } + return permute(values, index); + } + return values.sort(f); +} diff --git a/node_modules/d3-array/src/subset.js b/node_modules/d3-array/src/subset.js new file mode 100644 index 00000000..8a1c5640 --- /dev/null +++ b/node_modules/d3-array/src/subset.js @@ -0,0 +1,5 @@ +import superset from "./superset.js"; + +export default function subset(values, other) { + return superset(other, values); +} diff --git a/node_modules/d3-array/src/sum.js b/node_modules/d3-array/src/sum.js new file mode 100644 index 00000000..0720e2a1 --- /dev/null +++ b/node_modules/d3-array/src/sum.js @@ -0,0 +1,18 @@ +export default function sum(values, valueof) { + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + sum += value; + } + } + } + return sum; +} diff --git a/node_modules/d3-array/src/superset.js b/node_modules/d3-array/src/superset.js new file mode 100644 index 00000000..1097f262 --- /dev/null +++ b/node_modules/d3-array/src/superset.js @@ -0,0 +1,13 @@ +export default function superset(values, other) { + const iterator = values[Symbol.iterator](), set = new Set(); + for (const o of other) { + if (set.has(o)) continue; + let value, done; + while (({value, done} = iterator.next())) { + if (done) return false; + set.add(value); + if (Object.is(o, value)) break; + } + } + return true; +} diff --git a/node_modules/d3-array/src/threshold/freedmanDiaconis.js b/node_modules/d3-array/src/threshold/freedmanDiaconis.js new file mode 100644 index 00000000..2f9a2091 --- /dev/null +++ b/node_modules/d3-array/src/threshold/freedmanDiaconis.js @@ -0,0 +1,6 @@ +import count from "../count.js"; +import quantile from "../quantile.js"; + +export default function(values, min, max) { + return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(count(values), -1 / 3))); +} diff --git a/node_modules/d3-array/src/threshold/scott.js b/node_modules/d3-array/src/threshold/scott.js new file mode 100644 index 00000000..219e080d --- /dev/null +++ b/node_modules/d3-array/src/threshold/scott.js @@ -0,0 +1,6 @@ +import count from "../count.js"; +import deviation from "../deviation.js"; + +export default function(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(count(values), -1 / 3))); +} diff --git a/node_modules/d3-array/src/threshold/sturges.js b/node_modules/d3-array/src/threshold/sturges.js new file mode 100644 index 00000000..eba4ab9c --- /dev/null +++ b/node_modules/d3-array/src/threshold/sturges.js @@ -0,0 +1,5 @@ +import count from "../count.js"; + +export default function(values) { + return Math.ceil(Math.log(count(values)) / Math.LN2) + 1; +} diff --git a/node_modules/d3-array/src/ticks.js b/node_modules/d3-array/src/ticks.js new file mode 100644 index 00000000..dbb4426d --- /dev/null +++ b/node_modules/d3-array/src/ticks.js @@ -0,0 +1,52 @@ +var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); + +export default function(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; + + stop = +stop, start = +start, count = +count; + if (start === stop && count > 0) return [start]; + if (reverse = stop < start) n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; + + if (step > 0) { + start = Math.ceil(start / step); + stop = Math.floor(stop / step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) * step; + } else { + step = -step; + start = Math.ceil(start * step); + stop = Math.floor(stop * step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) / step; + } + + if (reverse) ticks.reverse(); + + return ticks; +} + +export function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); +} + +export function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; +} diff --git a/node_modules/d3-array/src/transpose.js b/node_modules/d3-array/src/transpose.js new file mode 100644 index 00000000..5ef3bfee --- /dev/null +++ b/node_modules/d3-array/src/transpose.js @@ -0,0 +1,15 @@ +import min from "./min.js"; + +export default function(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; +} + +function length(d) { + return d.length; +} diff --git a/node_modules/d3-array/src/union.js b/node_modules/d3-array/src/union.js new file mode 100644 index 00000000..eb0856e5 --- /dev/null +++ b/node_modules/d3-array/src/union.js @@ -0,0 +1,9 @@ +export default function union(...others) { + const set = new Set(); + for (const other of others) { + for (const o of other) { + set.add(o); + } + } + return set; +} diff --git a/node_modules/d3-array/src/variance.js b/node_modules/d3-array/src/variance.js new file mode 100644 index 00000000..2428bf85 --- /dev/null +++ b/node_modules/d3-array/src/variance.js @@ -0,0 +1,25 @@ +export default function variance(values, valueof) { + let count = 0; + let delta; + let mean = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + delta = value - mean; + mean += delta / ++count; + sum += delta * (value - mean); + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + delta = value - mean; + mean += delta / ++count; + sum += delta * (value - mean); + } + } + } + if (count > 1) return sum / (count - 1); +} diff --git a/node_modules/d3-array/src/zip.js b/node_modules/d3-array/src/zip.js new file mode 100644 index 00000000..a4603803 --- /dev/null +++ b/node_modules/d3-array/src/zip.js @@ -0,0 +1,5 @@ +import transpose from "./transpose.js"; + +export default function() { + return transpose(arguments); +} diff --git a/node_modules/d3-axis/LICENSE b/node_modules/d3-axis/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-axis/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-axis/README.md b/node_modules/d3-axis/README.md new file mode 100644 index 00000000..9512eb95 --- /dev/null +++ b/node_modules/d3-axis/README.md @@ -0,0 +1,198 @@ +# d3-axis + +The axis component renders human-readable reference marks for [scales](https://github.com/d3/d3-scale). This alleviates one of the more tedious tasks in visualizing data. + +## Installing + +If you use NPM, `npm install d3-axis`. Otherwise, download the [latest release](https://github.com/d3/d3-axis/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-axis.v2.min.js) or as part of [D3](https://github.com/d3/d3). (To be useful, you’ll also want to use [d3-scale](https://github.com/d3/d3-scale) and [d3-selection](https://github.com/d3/d3-selection), but these are soft dependencies.) AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +[Try d3-axis in your browser.](https://observablehq.com/collection/@d3/d3-axis) + +## API Reference + +Regardless of orientation, axes are always rendered at the origin. To change the position of the axis with respect to the chart, specify a [transform attribute](http://www.w3.org/TR/SVG/coords.html#TransformAttribute) on the containing element. For example: + +```js +d3.select("body").append("svg") + .attr("width", 1440) + .attr("height", 30) + .append("g") + .attr("transform", "translate(0,30)") + .call(axis); +``` + +The elements created by the axis are considered part of its public API. You can apply external stylesheets or modify the generated axis elements to [customize the axis appearance](https://observablehq.com/@d3/styled-axes). + +[Custom Axis](https://observablehq.com/@d3/styled-axes) + +An axis consists of a [path element](https://www.w3.org/TR/SVG/paths.html#PathElement) of class “domain†representing the extent of the scale’s domain, followed by transformed [g elements](https://www.w3.org/TR/SVG/struct.html#Groups) of class “tick†representing each of the scale’s ticks. Each tick has a [line element](https://www.w3.org/TR/SVG/shapes.html#LineElement) to draw the tick line, and a [text element](https://www.w3.org/TR/SVG/text.html#TextElement) for the tick label. For example, here is a typical bottom-oriented axis: + +```html + + + + + 0.0 + + + + 0.2 + + + + 0.4 + + + + 0.6 + + + + 0.8 + + + + 1.0 + + +``` + +The orientation of an axis is fixed; to change the orientation, remove the old axis and create a new axis. + +# d3.axisTop(scale) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +Constructs a new top-oriented axis generator for the given [scale](https://github.com/d3/d3-scale), with empty [tick arguments](#axis_ticks), a [tick size](#axis_tickSize) of 6 and [padding](#axis_tickPadding) of 3. In this orientation, ticks are drawn above the horizontal domain path. + +# d3.axisRight(scale) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +Constructs a new right-oriented axis generator for the given [scale](https://github.com/d3/d3-scale), with empty [tick arguments](#axis_ticks), a [tick size](#axis_tickSize) of 6 and [padding](#axis_tickPadding) of 3. In this orientation, ticks are drawn to the right of the vertical domain path. + +# d3.axisBottom(scale) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +Constructs a new bottom-oriented axis generator for the given [scale](https://github.com/d3/d3-scale), with empty [tick arguments](#axis_ticks), a [tick size](#axis_tickSize) of 6 and [padding](#axis_tickPadding) of 3. In this orientation, ticks are drawn below the horizontal domain path. + +# d3.axisLeft(scale) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +Constructs a new left-oriented axis generator for the given [scale](https://github.com/d3/d3-scale), with empty [tick arguments](#axis_ticks), a [tick size](#axis_tickSize) of 6 and [padding](#axis_tickPadding) of 3. In this orientation, ticks are drawn to the left of the vertical domain path. + +# axis(context) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +Render the axis to the given *context*, which may be either a [selection](https://github.com/d3/d3-selection) of SVG containers (either SVG or G elements) or a corresponding [transition](https://github.com/d3/d3-transition). + +# axis.scale([scale]) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +If *scale* is specified, sets the [scale](https://github.com/d3/d3-scale) and returns the axis. If *scale* is not specified, returns the current scale. + +# axis.ticks(arguments…) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) +
# axis.ticks([count[, specifier]]) +
# axis.ticks([interval[, specifier]]) + +Sets the *arguments* that will be passed to [*scale*.ticks](https://github.com/d3/d3-scale/blob/master/README.md#continuous_ticks) and [*scale*.tickFormat](https://github.com/d3/d3-scale/blob/master/README.md#continuous_tickFormat) when the axis is [rendered](#_axis), and returns the axis generator. The meaning of the *arguments* depends on the [axis’ scale](#axis_scale) type: most commonly, the arguments are a suggested *count* for the number of ticks (or a [time *interval*](https://github.com/d3/d3-time) for time scales), and an optional [format *specifier*](https://github.com/d3/d3-format) to customize how the tick values are formatted. + +This method has no effect if the scale does not implement *scale*.ticks, as with [band](https://github.com/d3/d3-scale/blob/master/README.md#band-scales) and [point](https://github.com/d3/d3-scale/blob/master/README.md#point-scales) scales. To set the tick values explicitly, use [*axis*.tickValues](#axis_tickValues). To set the tick format explicitly, use [*axis*.tickFormat](#axis_tickFormat). + +For example, to generate twenty ticks with SI-prefix formatting on a linear scale, say: + +```js +axis.ticks(20, "s"); +``` + +To generate ticks every fifteen minutes with a time scale, say: + +```js +axis.ticks(d3.timeMinute.every(15)); +``` + +This method is also a convenience function for [*axis*.tickArguments](#axis_tickArguments). For example, this: + +```js +axis.ticks(10); +``` + +Is equivalent to: + +```js +axis.tickArguments([10]); +``` + +To generate tick values directly, use [*scale*.ticks](https://github.com/d3/d3-scale/blob/master/README.md#continuous_ticks). + +# axis.tickArguments([arguments]) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +If *arguments* is specified, sets the *arguments* that will be passed to [*scale*.ticks](https://github.com/d3/d3-scale/blob/master/README.md#continuous_ticks) and [*scale*.tickFormat](https://github.com/d3/d3-scale/blob/master/README.md#continuous_tickFormat) when the axis is [rendered](#_axis), and returns the axis generator. The meaning of the *arguments* depends on the [axis’ scale](#axis_scale) type: most commonly, the arguments are a suggested *count* for the number of ticks (or a [time *interval*](https://github.com/d3/d3-time) for time scales), and an optional [format *specifier*](https://github.com/d3/d3-format) to customize how the tick values are formatted. + +If *arguments* is specified, this method has no effect if the scale does not implement *scale*.ticks, as with [band](https://github.com/d3/d3-scale/blob/master/README.md#band-scales) and [point](https://github.com/d3/d3-scale/blob/master/README.md#point-scales) scales. To set the tick values explicitly, use [*axis*.tickValues](#axis_tickValues). To set the tick format explicitly, use [*axis*.tickFormat](#axis_tickFormat). + +If *arguments* is not specified, returns the current tick arguments, which defaults to the empty array. + +For example, to generate twenty ticks with SI-prefix formatting on a linear scale, say: + +```js +axis.tickArguments([20, "s"]); +``` + +To generate ticks every fifteen minutes with a time scale, say: + +```js +axis.tickArguments([d3.timeMinute.every(15)]); +``` + +See also [*axis*.ticks](#axis_ticks). + +# axis.tickValues([values]) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +If a *values* array is specified, the specified values are used for ticks rather than using the scale’s automatic tick generator. If *values* is null, clears any previously-set explicit tick values and reverts back to the scale’s tick generator. If *values* is not specified, returns the current tick values, which defaults to null. For example, to generate ticks at specific values: + +```js +var xAxis = d3.axisBottom(x) + .tickValues([1, 2, 3, 5, 8, 13, 21]); +``` + +The explicit tick values take precedent over the tick arguments set by [*axis*.tickArguments](#axis_tickArguments). However, any tick arguments will still be passed to the scale’s [tickFormat](#axis_tickFormat) function if a tick format is not also set. + +# axis.tickFormat([format]) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +If *format* is specified, sets the tick format function and returns the axis. If *format* is not specified, returns the current format function, which defaults to null. A null format indicates that the scale’s default formatter should be used, which is generated by calling [*scale*.tickFormat](https://github.com/d3/d3-scale/blob/master/README.md#continuous_tickFormat). In this case, the arguments specified by [*axis*.tickArguments](#axis_tickArguments) are likewise passed to *scale*.tickFormat. + +See [d3-format](https://github.com/d3/d3-format) and [d3-time-format](https://github.com/d3/d3-time-format) for help creating formatters. For example, to display integers with comma-grouping for thousands: + +```js +axis.tickFormat(d3.format(",.0f")); +``` + +More commonly, a format specifier is passed to [*axis*.ticks](#axis_ticks): + +```js +axis.ticks(10, ",f"); +``` + +This has the advantage of setting the format precision automatically based on the tick interval. + +# axis.tickSize([size]) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +If *size* is specified, sets the [inner](#axis_tickSizeInner) and [outer](#axis_tickSizeOuter) tick size to the specified value and returns the axis. If *size* is not specified, returns the current inner tick size, which defaults to 6. + +# axis.tickSizeInner([size]) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +If *size* is specified, sets the inner tick size to the specified value and returns the axis. If *size* is not specified, returns the current inner tick size, which defaults to 6. The inner tick size controls the length of the tick lines, offset from the native position of the axis. + +# axis.tickSizeOuter([size]) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +If *size* is specified, sets the outer tick size to the specified value and returns the axis. If *size* is not specified, returns the current outer tick size, which defaults to 6. The outer tick size controls the length of the square ends of the domain path, offset from the native position of the axis. Thus, the “outer ticks†are not actually ticks but part of the domain path, and their position is determined by the associated scale’s domain extent. Thus, outer ticks may overlap with the first or last inner tick. An outer tick size of 0 suppresses the square ends of the domain path, instead producing a straight line. + +# axis.tickPadding([padding]) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +If *padding* is specified, sets the padding to the specified value in pixels and returns the axis. If *padding* is not specified, returns the current padding which defaults to 3 pixels. + +# axis.offset([offset]) · [Source](https://github.com/d3/d3-axis/blob/master/src/axis.js) + +If *offset* is specified, sets the offset to the specified value in pixels and returns the axis. If *offset* is not specified, returns the current offset which defaults to 0 on devices with a [devicePixelRatio](https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio) greater than 1, and 0.5px otherwise. This default offset ensures crisp edges on low-resolution devices. diff --git a/node_modules/d3-axis/dist/d3-axis.js b/node_modules/d3-axis/dist/d3-axis.js new file mode 100644 index 00000000..6c3893a2 --- /dev/null +++ b/node_modules/d3-axis/dist/d3-axis.js @@ -0,0 +1,194 @@ +// https://d3js.org/d3-axis/ v2.1.0 Copyright 2021 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3 = global.d3 || {})); +}(this, (function (exports) { 'use strict'; + +var slice = Array.prototype.slice; + +function identity(x) { + return x; +} + +var top = 1, + right = 2, + bottom = 3, + left = 4, + epsilon = 1e-6; + +function translateX(x) { + return "translate(" + x + ",0)"; +} + +function translateY(y) { + return "translate(0," + y + ")"; +} + +function number(scale) { + return d => +scale(d); +} + +function center(scale, offset) { + offset = Math.max(0, scale.bandwidth() - offset * 2) / 2; + if (scale.round()) offset = Math.round(offset); + return d => +scale(d) + offset; +} + +function entering() { + return !this.__axis; +} + +function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + offset = typeof window !== "undefined" && window.devicePixelRatio > 1 ? 0 : 0.5, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = +range[0] + offset, + range1 = +range[range.length - 1] + offset, + position = (scale.bandwidth ? center : number)(scale.copy(), offset), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "currentColor")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "currentColor") + .attr(x + "2", k * tickSizeInner)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "currentColor") + .attr(x, k * spacing) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); + + tickExit = tickExit.transition(context) + .attr("opacity", epsilon) + .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute("transform"); }); + + tickEnter + .attr("opacity", epsilon) + .attr("transform", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); }); + } + + tickExit.remove(); + + path + .attr("d", orient === left || orient === right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H" + offset + "V" + range1 + "H" + k * tickSizeOuter : "M" + offset + "," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V" + offset + "H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + "," + offset + "H" + range1)); + + tick + .attr("opacity", 1) + .attr("transform", function(d) { return transform(position(d) + offset); }); + + line + .attr(x + "2", k * tickSizeInner); + + text + .attr(x, k * spacing) + .text(format); + + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + + selection + .each(function() { this.__axis = position; }); + } + + axis.scale = function(_) { + return arguments.length ? (scale = _, axis) : scale; + }; + + axis.ticks = function() { + return tickArguments = slice.call(arguments), axis; + }; + + axis.tickArguments = function(_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice(); + }; + + axis.tickValues = function(_) { + return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice(); + }; + + axis.tickFormat = function(_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; + }; + + axis.tickSize = function(_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; + + axis.tickSizeInner = function(_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; + + axis.tickSizeOuter = function(_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; + + axis.tickPadding = function(_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; + + axis.offset = function(_) { + return arguments.length ? (offset = +_, axis) : offset; + }; + + return axis; +} + +function axisTop(scale) { + return axis(top, scale); +} + +function axisRight(scale) { + return axis(right, scale); +} + +function axisBottom(scale) { + return axis(bottom, scale); +} + +function axisLeft(scale) { + return axis(left, scale); +} + +exports.axisBottom = axisBottom; +exports.axisLeft = axisLeft; +exports.axisRight = axisRight; +exports.axisTop = axisTop; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/node_modules/d3-axis/dist/d3-axis.min.js b/node_modules/d3-axis/dist/d3-axis.min.js new file mode 100644 index 00000000..bb712528 --- /dev/null +++ b/node_modules/d3-axis/dist/d3-axis.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-axis/ v2.1.0 Copyright 2021 Mike Bostock +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).d3=t.d3||{})}(this,(function(t){"use strict";var n=Array.prototype.slice;function e(t){return t}var r=1e-6;function i(t){return"translate("+t+",0)"}function a(t){return"translate(0,"+t+")"}function o(t){return n=>+t(n)}function u(t,n){return n=Math.max(0,t.bandwidth()-2*n)/2,t.round()&&(n=Math.round(n)),e=>+t(e)+n}function l(){return!this.__axis}function c(t,c){var s=[],f=null,d=null,p=6,h=6,m=3,g="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,x=1===t||4===t?-1:1,k=4===t||2===t?"x":"y",y=1===t||3===t?i:a;function v(n){var i=null==f?c.ticks?c.ticks.apply(c,s):c.domain():f,a=null==d?c.tickFormat?c.tickFormat.apply(c,s):e:d,v=Math.max(p,0)+m,M=c.range(),_=+M[0]+g,b=+M[M.length-1]+g,w=(c.bandwidth?u:o)(c.copy(),g),A=n.selection?n.selection():n,F=A.selectAll(".domain").data([null]),V=A.selectAll(".tick").data(i,c).order(),z=V.exit(),H=V.enter().append("g").attr("class","tick"),C=V.select("line"),P=V.select("text");F=F.merge(F.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),V=V.merge(H),C=C.merge(H.append("line").attr("stroke","currentColor").attr(k+"2",x*p)),P=P.merge(H.append("text").attr("fill","currentColor").attr(k,x*v).attr("dy",1===t?"0em":3===t?"0.71em":"0.32em")),n!==A&&(F=F.transition(n),V=V.transition(n),C=C.transition(n),P=P.transition(n),z=z.transition(n).attr("opacity",r).attr("transform",(function(t){return isFinite(t=w(t))?y(t+g):this.getAttribute("transform")})),H.attr("opacity",r).attr("transform",(function(t){var n=this.parentNode.__axis;return y((n&&isFinite(n=n(t))?n:w(t))+g)}))),z.remove(),F.attr("d",4===t||2===t?h?"M"+x*h+","+_+"H"+g+"V"+b+"H"+x*h:"M"+g+","+_+"V"+b:h?"M"+_+","+x*h+"V"+g+"H"+b+"V"+x*h:"M"+_+","+g+"H"+b),V.attr("opacity",1).attr("transform",(function(t){return y(w(t)+g)})),C.attr(k+"2",x*p),P.attr(k,x*v).text(a),A.filter(l).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",2===t?"start":4===t?"end":"middle"),A.each((function(){this.__axis=w}))}return v.scale=function(t){return arguments.length?(c=t,v):c},v.ticks=function(){return s=n.call(arguments),v},v.tickArguments=function(t){return arguments.length?(s=null==t?[]:n.call(t),v):s.slice()},v.tickValues=function(t){return arguments.length?(f=null==t?null:n.call(t),v):f&&f.slice()},v.tickFormat=function(t){return arguments.length?(d=t,v):d},v.tickSize=function(t){return arguments.length?(p=h=+t,v):p},v.tickSizeInner=function(t){return arguments.length?(p=+t,v):p},v.tickSizeOuter=function(t){return arguments.length?(h=+t,v):h},v.tickPadding=function(t){return arguments.length?(m=+t,v):m},v.offset=function(t){return arguments.length?(g=+t,v):g},v}t.axisBottom=function(t){return c(3,t)},t.axisLeft=function(t){return c(4,t)},t.axisRight=function(t){return c(2,t)},t.axisTop=function(t){return c(1,t)},Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/node_modules/d3-axis/package.json b/node_modules/d3-axis/package.json new file mode 100644 index 00000000..0973aab4 --- /dev/null +++ b/node_modules/d3-axis/package.json @@ -0,0 +1,74 @@ +{ + "_from": "d3-axis@2", + "_id": "d3-axis@2.1.0", + "_inBundle": false, + "_integrity": "sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw==", + "_location": "/d3-axis", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-axis@2", + "name": "d3-axis", + "escapedName": "d3-axis", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3" + ], + "_resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-2.1.0.tgz", + "_shasum": "978db534092711117d032fad5d733d206307f6a0", + "_spec": "d3-axis@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-axis/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Displays automatic reference lines for scales.", + "devDependencies": { + "d3-scale": "2 - 3", + "d3-selection": "1 - 2", + "eslint": "7", + "jsdom": "16", + "rollup": "2", + "rollup-plugin-terser": "7", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-axis/", + "jsdelivr": "dist/d3-axis.min.js", + "keywords": [ + "d3", + "d3-module", + "axis", + "scale", + "visualization" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-axis.js", + "module": "src/index.js", + "name": "d3-axis", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-axis.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src test" + }, + "sideEffects": false, + "unpkg": "dist/d3-axis.min.js", + "version": "2.1.0" +} diff --git a/node_modules/d3-axis/src/array.js b/node_modules/d3-axis/src/array.js new file mode 100644 index 00000000..8eeac161 --- /dev/null +++ b/node_modules/d3-axis/src/array.js @@ -0,0 +1 @@ +export var slice = Array.prototype.slice; diff --git a/node_modules/d3-axis/src/axis.js b/node_modules/d3-axis/src/axis.js new file mode 100644 index 00000000..3f79513d --- /dev/null +++ b/node_modules/d3-axis/src/axis.js @@ -0,0 +1,175 @@ +import {slice} from "./array.js"; +import identity from "./identity.js"; + +var top = 1, + right = 2, + bottom = 3, + left = 4, + epsilon = 1e-6; + +function translateX(x) { + return "translate(" + x + ",0)"; +} + +function translateY(y) { + return "translate(0," + y + ")"; +} + +function number(scale) { + return d => +scale(d); +} + +function center(scale, offset) { + offset = Math.max(0, scale.bandwidth() - offset * 2) / 2; + if (scale.round()) offset = Math.round(offset); + return d => +scale(d) + offset; +} + +function entering() { + return !this.__axis; +} + +function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + offset = typeof window !== "undefined" && window.devicePixelRatio > 1 ? 0 : 0.5, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = +range[0] + offset, + range1 = +range[range.length - 1] + offset, + position = (scale.bandwidth ? center : number)(scale.copy(), offset), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "currentColor")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "currentColor") + .attr(x + "2", k * tickSizeInner)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "currentColor") + .attr(x, k * spacing) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); + + tickExit = tickExit.transition(context) + .attr("opacity", epsilon) + .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute("transform"); }); + + tickEnter + .attr("opacity", epsilon) + .attr("transform", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); }); + } + + tickExit.remove(); + + path + .attr("d", orient === left || orient === right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H" + offset + "V" + range1 + "H" + k * tickSizeOuter : "M" + offset + "," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V" + offset + "H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + "," + offset + "H" + range1)); + + tick + .attr("opacity", 1) + .attr("transform", function(d) { return transform(position(d) + offset); }); + + line + .attr(x + "2", k * tickSizeInner); + + text + .attr(x, k * spacing) + .text(format); + + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + + selection + .each(function() { this.__axis = position; }); + } + + axis.scale = function(_) { + return arguments.length ? (scale = _, axis) : scale; + }; + + axis.ticks = function() { + return tickArguments = slice.call(arguments), axis; + }; + + axis.tickArguments = function(_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice(); + }; + + axis.tickValues = function(_) { + return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice(); + }; + + axis.tickFormat = function(_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; + }; + + axis.tickSize = function(_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; + + axis.tickSizeInner = function(_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; + + axis.tickSizeOuter = function(_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; + + axis.tickPadding = function(_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; + + axis.offset = function(_) { + return arguments.length ? (offset = +_, axis) : offset; + }; + + return axis; +} + +export function axisTop(scale) { + return axis(top, scale); +} + +export function axisRight(scale) { + return axis(right, scale); +} + +export function axisBottom(scale) { + return axis(bottom, scale); +} + +export function axisLeft(scale) { + return axis(left, scale); +} diff --git a/node_modules/d3-axis/src/identity.js b/node_modules/d3-axis/src/identity.js new file mode 100644 index 00000000..b2f94b2e --- /dev/null +++ b/node_modules/d3-axis/src/identity.js @@ -0,0 +1,3 @@ +export default function(x) { + return x; +} diff --git a/node_modules/d3-axis/src/index.js b/node_modules/d3-axis/src/index.js new file mode 100644 index 00000000..d8700430 --- /dev/null +++ b/node_modules/d3-axis/src/index.js @@ -0,0 +1,6 @@ +export { + axisTop, + axisRight, + axisBottom, + axisLeft +} from "./axis.js"; diff --git a/node_modules/d3-brush/LICENSE b/node_modules/d3-brush/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-brush/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-brush/README.md b/node_modules/d3-brush/README.md new file mode 100644 index 00000000..25e74c66 --- /dev/null +++ b/node_modules/d3-brush/README.md @@ -0,0 +1,172 @@ +# d3-brush + +Brushing is the interactive specification a one- or two-dimensional selected region using a pointing gesture, such as by clicking and dragging the mouse. Brushing is often used to select discrete elements, such as dots in a scatterplot or files on a desktop. It can also be used to zoom-in to a region of interest, or to select continuous regions for [cross-filtering data](http://square.github.io/crossfilter/) or live histograms: + +[Mona Lisa Histogram](https://observablehq.com/@d3/mona-lisa-histogram) + +The d3-brush module implements brushing for mouse and touch events using [SVG](https://www.w3.org/TR/SVG/). Click and drag on the brush selection to translate the selection. Click and drag on one of the selection handles to move the corresponding edge (or edges) of the selection. Click and drag on the invisible overlay to define a new brush selection, or click anywhere within the brushable region while holding down the META (⌘) key. Holding down the ALT (⌥) key while moving the brush causes it to reposition around its center, while holding down SPACE locks the current brush size, allowing only translation. + +Brushes also support programmatic control. For example, you can listen to [*end* events](#brush-events), and then initiate a transition with [*brush*.move](#brush_move) to snap the brush selection to semantic boundaries: + +[Brush Snapping](https://observablehq.com/@d3/brush-snapping-transitions) + +Or you can have the brush recenter when you click outside the current selection: + +[Click-to-Recenter](https://observablehq.com/@d3/click-to-recenter-brush) + +## Installing + +If you use NPM, `npm install d3-brush`. Otherwise, download the [latest release](https://github.com/d3/d3-brush/releases/latest). You can load as a [standalone library](https://d3js.org/d3-brush.v1.min.js) or as part of [D3](https://github.com/d3/d3). ES modules, AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + + + + + + + + +``` + +[Try d3-brush in your browser.](https://observablehq.com/collection/@d3/d3-brush) + +## API Reference + +# d3.brush() · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js), [Examples](https://observablehq.com/@d3/brushable-scatterplot) + +Creates a new two-dimensional brush. + +# d3.brushX() · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js), [Examples](https://observablehq.com/@d3/focus-context) + +Creates a new one-dimensional brush along the *x*-dimension. + +# d3.brushY() · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js) + +Creates a new one-dimensional brush along the *y*-dimension. + +# brush(group) · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js), [Examples](https://observablehq.com/@d3/brushable-scatterplot-matrix) + +Applies the brush to the specified *group*, which must be a [selection](https://github.com/d3/d3-selection) of SVG [G elements](https://www.w3.org/TR/SVG/struct.html#Groups). This function is typically not invoked directly, and is instead invoked via [*selection*.call](https://github.com/d3/d3-selection#selection_call). For example, to render a brush: + +```js +svg.append("g") + .attr("class", "brush") + .call(d3.brush().on("brush", brushed)); +``` + +Internally, the brush uses [*selection*.on](https://github.com/d3/d3-selection#selection_on) to bind the necessary event listeners for dragging. The listeners use the name `.brush`, so you can subsequently unbind the brush event listeners as follows: + +```js +group.on(".brush", null); +``` + +The brush also creates the SVG elements necessary to display the brush selection and to receive input events for interaction. You can add, remove or modify these elements as desired to change the brush appearance; you can also apply stylesheets to modify the brush appearance. The structure of a two-dimensional brush is as follows: + +```html + + + + + + + + + + + + +``` + +The overlay rect covers the brushable area defined by [*brush*.extent](#brush_extent). The selection rect covers the area defined by the current [brush selection](#brushSelection). The handle rects cover the edges and corners of the brush selection, allowing the corresponding value in the brush selection to be modified interactively. To modify the brush selection programmatically, use [*brush*.move](#brush_move). + +# brush.move(group, selection) · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js), [Examples](https://observablehq.com/d/93b91f86f9ebc9b9) + +Sets the active *selection* of the brush on the specified *group*, which must be a [selection](https://github.com/d3/d3-selection) or a [transition](https://github.com/d3/d3-transition) of SVG [G elements](https://www.w3.org/TR/SVG/struct.html#Groups). The *selection* must be defined as an array of numbers, or null to clear the brush selection. For a [two-dimensional brush](#brush), it must be defined as [[*x0*, *y0*], [*x1*, *y1*]], where *x0* is the minimum *x*-value, *y0* is the minimum *y*-value, *x1* is the maximum *x*-value, and *y1* is the maximum *y*-value. For an [*x*-brush](#brushX), it must be defined as [*x0*, *x1*]; for a [*y*-brush](#brushY), it must be defined as [*y0*, *y1*]. The selection may also be specified as a function which returns such an array; if a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. The returned array defines the brush selection for that element. + +# brush.clear(group) · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js), [Examples](https://observablehq.com/@d3/double-click-brush-clear) + +An alias for [*brush*.move](#brush_move) with the null selection. + +# brush.extent([extent]) · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js), [Examples](https://observablehq.com/@d3/brush-snapping) + +If *extent* is specified, sets the brushable extent to the specified array of points [[*x0*, *y0*], [*x1*, *y1*]], where [*x0*, *y0*] is the top-left corner and [*x1*, *y1*] is the bottom-right corner, and returns this brush. The *extent* may also be specified as a function which returns such an array; if a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. If *extent* is not specified, returns the current extent accessor, which defaults to: + +```js +function defaultExtent() { + var svg = this.ownerSVGElement || this; + if (svg.hasAttribute("viewBox")) { + svg = svg.viewBox.baseVal; + return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; + } + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; +} +``` + +This default implementation requires that the owner SVG element have a defined [viewBox](https://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute), or [width](https://www.w3.org/TR/SVG/struct.html#SVGElementWidthAttribute) and [height](https://www.w3.org/TR/SVG/struct.html#SVGElementHeightAttribute) attributes. Alternatively, consider using [*element*.getBoundingClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). (In Firefox, [*element*.clientWidth](https://developer.mozilla.org/en-US/docs/Web/API/Element/clientWidth) and [*element*.clientHeight](https://developer.mozilla.org/en-US/docs/Web/API/Element/clientHeight) is zero for SVG elements!) + +The brush extent determines the size of the invisible overlay and also constrains the brush selection; the brush selection cannot go outside the brush extent. + +# brush.filter([filter]) · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js), [Examples](https://observablehq.com/@d3/brush-filter) + +If *filter* is specified, sets the filter to the specified function and returns the brush. If *filter* is not specified, returns the current filter, which defaults to: + +```js +function filter(event) { + return !event.ctrlKey && !event.button; +} +``` + +If the filter returns falsey, the initiating event is ignored and no brush gesture is started. Thus, the filter determines which input events are ignored. The default filter ignores mousedown events on secondary buttons, since those buttons are typically intended for other purposes, such as the context menu. + +# brush.touchable([touchable]) · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js) + +If *touchable* is specified, sets the touch support detector to the specified function and returns the brush. If *touchable* is not specified, returns the current touch support detector, which defaults to: + +```js +function touchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} +``` + +Touch event listeners are only registered if the detector returns truthy for the corresponding element when the brush is [applied](#_brush). The default detector works well for most browsers that are capable of touch input, but not all; Chrome’s mobile device emulator, for example, fails detection. + +# brush.keyModifiers([modifiers]) · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js) + +If *modifiers* is specified, sets whether the brush listens to key events during brushing and returns the brush. If *modifiers* is not specified, returns the current behavior, which defaults to true. + +# brush.handleSize([size]) · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js) + +If *size* is specified, sets the size of the brush handles to the specified number and returns the brush. If *size* is not specified, returns the current handle size, which defaults to six. This method must be called before [applying the brush](#_brush) to a selection; changing the handle size does not affect brushes that were previously rendered. + +# brush.on(typenames[, listener]) · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js) + +If *listener* is specified, sets the event *listener* for the specified *typenames* and returns the brush. If an event listener was already registered for the same type and name, the existing listener is removed before the new listener is added. If *listener* is null, removes the current event listeners for the specified *typenames*, if any. If *listener* is not specified, returns the first currently-assigned listener matching the specified *typenames*, if any. When a specified event is dispatched, each *listener* will be invoked with the same context and arguments as [*selection*.on](https://github.com/d3/d3-selection#selection_on) listeners: the current event `event` and datum `d`, with the `this` context as the current DOM element. + +The *typenames* is a string containing one or more *typename* separated by whitespace. Each *typename* is a *type*, optionally followed by a period (`.`) and a *name*, such as `brush.foo` and `brush.bar`; the name allows multiple listeners to be registered for the same *type*. The *type* must be one of the following: + +* `start` - at the start of a brush gesture, such as on mousedown. +* `brush` - when the brush moves, such as on mousemove. +* `end` - at the end of a brush gesture, such as on mouseup. + +See [*dispatch*.on](https://github.com/d3/d3-dispatch#dispatch_on) and [Brush Events](#brush-events) for more. + +# d3.brushSelection(node) · [Source](https://github.com/d3/d3-brush/blob/master/src/brush.js), [Examples](https://observablehq.com/@d3/double-click-brush-clear) + +Returns the current brush selection for the specified *node*. Internally, an element’s brush state is stored as *element*.\_\_brush; however, you should use this method rather than accessing it directly. If the given *node* has no selection, returns null. Otherwise, the *selection* is defined as an array of numbers. For a [two-dimensional brush](#brush), it is [[*x0*, *y0*], [*x1*, *y1*]], where *x0* is the minimum *x*-value, *y0* is the minimum *y*-value, *x1* is the maximum *x*-value, and *y1* is the maximum *y*-value. For an [*x*-brush](#brushX), it is [*x0*, *x1*]; for a [*y*-brush](#brushY), it is [*y0*, *y1*]. + +### Brush Events + +When a [brush event listener](#brush_on) is invoked, it receives the current brush event. The *event* object exposes several fields: + +* `target` - the associated [brush behavior](#brush). +* `type` - the string “startâ€, “brush†or “endâ€; see [*brush*.on](#brush_on). +* `selection` - the current [brush selection](#brushSelection). +* `sourceEvent` - the underlying input event, such as mousemove or touchmove. +* `mode` - the string “dragâ€, “spaceâ€, “handle†or “centerâ€; the mode of the brush. diff --git a/node_modules/d3-brush/dist/d3-brush.js b/node_modules/d3-brush/dist/d3-brush.js new file mode 100644 index 00000000..5fdcb560 --- /dev/null +++ b/node_modules/d3-brush/dist/d3-brush.js @@ -0,0 +1,656 @@ +// https://d3js.org/d3-brush/ v2.1.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-drag'), require('d3-interpolate'), require('d3-selection'), require('d3-transition')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3)); +}(this, function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { 'use strict'; + +var constant = x => () => x; + +function BrushEvent(type, { + sourceEvent, + target, + selection, + mode, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + selection: {value: selection, enumerable: true, configurable: true}, + mode: {value: mode, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} + +function nopropagation(event) { + event.stopImmediatePropagation(); +} + +function noevent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +var MODE_DRAG = {name: "drag"}, + MODE_SPACE = {name: "space"}, + MODE_HANDLE = {name: "handle"}, + MODE_CENTER = {name: "center"}; + +const {abs, max, min} = Math; + +function number1(e) { + return [+e[0], +e[1]]; +} + +function number2(e) { + return [number1(e[0]), number1(e[1])]; +} + +var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; }, + output: function(xy) { return xy && [xy[0][0], xy[1][0]]; } +}; + +var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; }, + output: function(xy) { return xy && [xy[0][1], xy[1][1]]; } +}; + +var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function(xy) { return xy == null ? null : number2(xy); }, + output: function(xy) { return xy; } +}; + +var cursors = { + overlay: "crosshair", + selection: "move", + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" +}; + +var flipX = { + e: "w", + w: "e", + nw: "ne", + ne: "nw", + se: "sw", + sw: "se" +}; + +var flipY = { + n: "s", + s: "n", + nw: "sw", + ne: "se", + se: "ne", + sw: "nw" +}; + +var signsX = { + overlay: +1, + selection: +1, + n: null, + e: +1, + s: null, + w: -1, + nw: -1, + ne: +1, + se: +1, + sw: -1 +}; + +var signsY = { + overlay: +1, + selection: +1, + n: -1, + e: null, + s: +1, + w: null, + nw: -1, + ne: -1, + se: +1, + sw: +1 +}; + +function type(t) { + return {type: t}; +} + +// Ignore right-click, since that should open the context menu. +function defaultFilter(event) { + return !event.ctrlKey && !event.button; +} + +function defaultExtent() { + var svg = this.ownerSVGElement || this; + if (svg.hasAttribute("viewBox")) { + svg = svg.viewBox.baseVal; + return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; + } + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; +} + +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +// Like d3.local, but with the name “__brush†rather than auto-generated. +function local(node) { + while (!node.__brush) if (!(node = node.parentNode)) return; + return node.__brush; +} + +function empty(extent) { + return extent[0][0] === extent[1][0] + || extent[0][1] === extent[1][1]; +} + +function brushSelection(node) { + var state = node.__brush; + return state ? state.dim.output(state.selection) : null; +} + +function brushX() { + return brush$1(X); +} + +function brushY() { + return brush$1(Y); +} + +function brush() { + return brush$1(XY); +} + +function brush$1(dim) { + var extent = defaultExtent, + filter = defaultFilter, + touchable = defaultTouchable, + keys = true, + listeners = d3Dispatch.dispatch("start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function() { + var extent = local(this).extent; + d3Selection.select(this) + .attr("x", extent[0][0]) + .attr("y", extent[0][1]) + .attr("width", extent[1][0] - extent[0][0]) + .attr("height", extent[1][1] - extent[0][1]); + }); + + group.selectAll(".selection") + .data([type("selection")]) + .enter().append("rect") + .attr("class", "selection") + .attr("cursor", cursors.selection) + .attr("fill", "#777") + .attr("fill-opacity", 0.3) + .attr("stroke", "#fff") + .attr("shape-rendering", "crispEdges"); + + var handle = group.selectAll(".handle") + .data(dim.handles, function(d) { return d.type; }); + + handle.exit().remove(); + + handle.enter().append("rect") + .attr("class", function(d) { return "handle handle--" + d.type; }) + .attr("cursor", function(d) { return cursors[d.type]; }); + + group + .each(redraw) + .attr("fill", "none") + .attr("pointer-events", "all") + .on("mousedown.brush", started) + .filter(touchable) + .on("touchstart.brush", started) + .on("touchmove.brush", touchmoved) + .on("touchend.brush touchcancel.brush", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + brush.move = function(group, selection) { + if (group.tween) { + group + .on("start.brush", function(event) { emitter(this, arguments).beforestart().start(event); }) + .on("interrupt.brush end.brush", function(event) { emitter(this, arguments).end(event); }) + .tween("brush", function() { + var that = this, + state = that.__brush, + emit = emitter(that, arguments), + selection0 = state.selection, + selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), + i = d3Interpolate.interpolate(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && selection1 === null ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 !== null && selection1 !== null ? tween : tween(1); + }); + } else { + group + .each(function() { + var that = this, + args = arguments, + state = that.__brush, + selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), + emit = emitter(that, args).beforestart(); + + d3Transition.interrupt(that); + state.selection = selection1 === null ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); + } + }; + + brush.clear = function(group) { + brush.move(group, null); + }; + + function redraw() { + var group = d3Selection.select(this), + selection = local(this).selection; + + if (selection) { + group.selectAll(".selection") + .style("display", null) + .attr("x", selection[0][0]) + .attr("y", selection[0][1]) + .attr("width", selection[1][0] - selection[0][0]) + .attr("height", selection[1][1] - selection[0][1]); + + group.selectAll(".handle") + .style("display", null) + .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; }) + .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; }) + .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; }) + .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; }); + } + + else { + group.selectAll(".selection,.handle") + .style("display", "none") + .attr("x", null) + .attr("y", null) + .attr("width", null) + .attr("height", null); + } + } + + function emitter(that, args, clean) { + var emit = that.__brush.emitter; + return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean); + } + + function Emitter(that, args, clean) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + this.clean = clean; + } + + Emitter.prototype = { + beforestart: function() { + if (++this.active === 1) this.state.emitter = this, this.starting = true; + return this; + }, + start: function(event, mode) { + if (this.starting) this.starting = false, this.emit("start", event, mode); + else this.emit("brush", event); + return this; + }, + brush: function(event, mode) { + this.emit("brush", event, mode); + return this; + }, + end: function(event, mode) { + if (--this.active === 0) delete this.state.emitter, this.emit("end", event, mode); + return this; + }, + emit: function(type, event, mode) { + var d = d3Selection.select(this.that).datum(); + listeners.call( + type, + this.that, + new BrushEvent(type, { + sourceEvent: event, + target: brush, + selection: dim.output(this.state.selection), + mode, + dispatch: listeners + }), + d + ); + } + }; + + function started(event) { + if (touchending && !event.touches) return; + if (!filter.apply(this, arguments)) return; + + var that = this, + type = event.target.__data__.type, + mode = (keys && event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local(that), + extent = state.extent, + selection = state.selection, + W = extent[0][0], w0, w1, + N = extent[0][1], n0, n1, + E = extent[1][0], e0, e1, + S = extent[1][1], s0, s1, + dx = 0, + dy = 0, + moving, + shifting = signX && signY && keys && event.shiftKey, + lockX, + lockY, + points = Array.from(event.touches || [event], t => { + const i = t.identifier; + t = d3Selection.pointer(t, that); + t.point0 = t.slice(); + t.identifier = i; + return t; + }); + + if (type === "overlay") { + if (selection) moving = true; + const pts = [points[0], points[1] || points[0]]; + state.selection = selection = [[ + w0 = dim === Y ? W : min(pts[0][0], pts[1][0]), + n0 = dim === X ? N : min(pts[0][1], pts[1][1]) + ], [ + e0 = dim === Y ? E : max(pts[0][0], pts[1][0]), + s0 = dim === X ? S : max(pts[0][1], pts[1][1]) + ]]; + if (points.length > 1) move(); + } else { + w0 = selection[0][0]; + n0 = selection[0][1]; + e0 = selection[1][0]; + s0 = selection[1][1]; + } + + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; + + var group = d3Selection.select(that) + .attr("pointer-events", "none"); + + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + d3Transition.interrupt(that); + var emit = emitter(that, arguments, true).beforestart(); + + if (event.touches) { + emit.moved = moved; + emit.ended = ended; + } else { + var view = d3Selection.select(event.view) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + if (keys) view + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true); + + d3Drag.dragDisable(event.view); + } + + redraw.call(that); + emit.start(event, mode.name); + + function moved(event) { + for (const p of event.changedTouches || [event]) { + for (const d of points) + if (d.identifier === p.identifier) d.cur = d3Selection.pointer(p, that); + } + if (shifting && !lockX && !lockY && points.length === 1) { + const point = points[0]; + if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1])) + lockY = true; + else + lockX = true; + } + for (const point of points) + if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1]; + moving = true; + noevent(event); + move(event); + } + + function move(event) { + const point = points[0], point0 = point.point0; + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (points[1]) { + if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1; + if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1; + } else { + if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + } + break; + } + case MODE_CENTER: { + if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX)); + if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY)); + break; + } + } + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) selection = state.selection; // May be set by brush.move! + if (lockX) w1 = selection[0][0], e1 = selection[1][0]; + if (lockY) n1 = selection[0][1], s1 = selection[1][1]; + + if (selection[0][0] !== w1 + || selection[0][1] !== n1 + || selection[1][0] !== e1 + || selection[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(event, mode.name); + } + } + + function ended(event) { + nopropagation(event); + if (event.touches) { + if (event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + } else { + d3Drag.dragEnable(event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) selection = state.selection; // May be set by brush.move (on start)! + if (empty(selection)) state.selection = null, redraw.call(that); + emit.end(event, mode.name); + } + + function keydowned(event) { + switch (event.keyCode) { + case 16: { // SHIFT + shifting = signX && signY; + break; + } + case 18: { // ALT + if (mode === MODE_HANDLE) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; + if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: return; + } + noevent(event); + } + + function keyupped(event) { + switch (event.keyCode) { + case 16: { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: { // SPACE + if (mode === MODE_SPACE) { + if (event.altKey) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: return; + } + noevent(event); + } + } + + function touchmoved(event) { + emitter(this, arguments).moved(event); + } + + function touchended(event) { + emitter(this, arguments).ended(event); + } + + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = number2(extent.apply(this, arguments)); + state.dim = dim; + return state; + } + + brush.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant(number2(_)), brush) : extent; + }; + + brush.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), brush) : filter; + }; + + brush.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), brush) : touchable; + }; + + brush.handleSize = function(_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.keyModifiers = function(_) { + return arguments.length ? (keys = !!_, brush) : keys; + }; + + brush.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; +} + +exports.brush = brush; +exports.brushSelection = brushSelection; +exports.brushX = brushX; +exports.brushY = brushY; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-brush/dist/d3-brush.min.js b/node_modules/d3-brush/dist/d3-brush.min.js new file mode 100644 index 00000000..eaea3e1b --- /dev/null +++ b/node_modules/d3-brush/dist/d3-brush.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-brush/ v2.1.0 Copyright 2020 Mike Bostock +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-dispatch"),require("d3-drag"),require("d3-interpolate"),require("d3-selection"),require("d3-transition")):"function"==typeof define&&define.amd?define(["exports","d3-dispatch","d3-drag","d3-interpolate","d3-selection","d3-transition"],t):t((e=e||self).d3=e.d3||{},e.d3,e.d3,e.d3,e.d3,e.d3)}(this,function(e,t,n,r,i,s){"use strict";var u=e=>()=>e;function o(e,{sourceEvent:t,target:n,selection:r,mode:i,dispatch:s}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},selection:{value:r,enumerable:!0,configurable:!0},mode:{value:i,enumerable:!0,configurable:!0},_:{value:s}})}function a(e){e.preventDefault(),e.stopImmediatePropagation()}var l={name:"drag"},c={name:"space"},h={name:"handle"},f={name:"center"};const{abs:d,max:p,min:b}=Math;function y(e){return[+e[0],+e[1]]}function v(e){return[y(e[0]),y(e[1])]}var m={name:"x",handles:["w","e"].map(E),input:function(e,t){return null==e?null:[[+e[0],t[0][1]],[+e[1],t[1][1]]]},output:function(e){return e&&[e[0][0],e[1][0]]}},w={name:"y",handles:["n","s"].map(E),input:function(e,t){return null==e?null:[[t[0][0],+e[0]],[t[1][0],+e[1]]]},output:function(e){return e&&[e[0][1],e[1][1]]}},g={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(E),input:function(e){return null==e?null:v(e)},output:function(e){return e}},_={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},x={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},k={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},z={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},A={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1};function E(e){return{type:e}}function q(e){return!e.ctrlKey&&!e.button}function K(){var e=this.ownerSVGElement||this;return e.hasAttribute("viewBox")?[[(e=e.viewBox.baseVal).x,e.y],[e.x+e.width,e.y+e.height]]:[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]}function P(){return navigator.maxTouchPoints||"ontouchstart"in this}function T(e){for(;!e.__brush;)if(!(e=e.parentNode))return;return e.__brush}function V(e){var y,g=K,V=q,j=P,M=!0,S=t.dispatch("start","brush","end"),B=6;function C(t){var n=t.property("__brush",Y).selectAll(".overlay").data([E("overlay")]);n.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",_.overlay).merge(n).each(function(){var e=T(this).extent;i.select(this).attr("x",e[0][0]).attr("y",e[0][1]).attr("width",e[1][0]-e[0][0]).attr("height",e[1][1]-e[0][1])}),t.selectAll(".selection").data([E("selection")]).enter().append("rect").attr("class","selection").attr("cursor",_.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var r=t.selectAll(".handle").data(e.handles,function(e){return e.type});r.exit().remove(),r.enter().append("rect").attr("class",function(e){return"handle handle--"+e.type}).attr("cursor",function(e){return _[e.type]}),t.each(D).attr("fill","none").attr("pointer-events","all").on("mousedown.brush",G).filter(j).on("touchstart.brush",G).on("touchmove.brush",N).on("touchend.brush touchcancel.brush",X).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function D(){var e=i.select(this),t=T(this).selection;t?(e.selectAll(".selection").style("display",null).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1]),e.selectAll(".handle").style("display",null).attr("x",function(e){return"e"===e.type[e.type.length-1]?t[1][0]-B/2:t[0][0]-B/2}).attr("y",function(e){return"s"===e.type[0]?t[1][1]-B/2:t[0][1]-B/2}).attr("width",function(e){return"n"===e.type||"s"===e.type?t[1][0]-t[0][0]+B:B}).attr("height",function(e){return"e"===e.type||"w"===e.type?t[1][1]-t[0][1]+B:B})):e.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}function I(e,t,n){var r=e.__brush.emitter;return!r||n&&r.clean?new O(e,t,n):r}function O(e,t,n){this.that=e,this.args=t,this.state=e.__brush,this.active=0,this.clean=n}function G(t){if((!y||t.touches)&&V.apply(this,arguments)){var r,u,o,v,g,E,q,K,P,j,S,B=this,C=t.target.__data__.type,O="selection"===(M&&t.metaKey?C="overlay":C)?l:M&&t.altKey?f:h,G=e===w?null:z[C],N=e===m?null:A[C],X=T(B),Y=X.extent,F=X.selection,H=Y[0][0],J=Y[0][1],L=Y[1][0],Q=Y[1][1],R=0,U=0,W=G&&N&&M&&t.shiftKey,Z=Array.from(t.touches||[t],e=>{const t=e.identifier;return(e=i.pointer(e,B)).point0=e.slice(),e.identifier=t,e});if("overlay"===C){F&&(P=!0);const t=[Z[0],Z[1]||Z[0]];X.selection=F=[[r=e===w?H:b(t[0][0],t[1][0]),o=e===m?J:b(t[0][1],t[1][1])],[g=e===w?L:p(t[0][0],t[1][0]),q=e===m?Q:p(t[0][1],t[1][1])]],Z.length>1&&ie()}else r=F[0][0],o=F[0][1],g=F[1][0],q=F[1][1];u=r,v=o,E=g,K=q;var $=i.select(B).attr("pointer-events","none"),ee=$.selectAll(".overlay").attr("cursor",_[C]);s.interrupt(B);var te=I(B,arguments,!0).beforestart();if(t.touches)te.moved=re,te.ended=se;else{var ne=i.select(t.view).on("mousemove.brush",re,!0).on("mouseup.brush",se,!0);M&&ne.on("keydown.brush",function(e){switch(e.keyCode){case 16:W=G&&N;break;case 18:O===h&&(G&&(g=E-R*G,r=u+R*G),N&&(q=K-U*N,o=v+U*N),O=f,ie());break;case 32:O!==h&&O!==f||(G<0?g=E-R:G>0&&(r=u-R),N<0?q=K-U:N>0&&(o=v-U),O=c,ee.attr("cursor",_.selection),ie());break;default:return}a(e)},!0).on("keyup.brush",function(e){switch(e.keyCode){case 16:W&&(j=S=W=!1,ie());break;case 18:O===f&&(G<0?g=E:G>0&&(r=u),N<0?q=K:N>0&&(o=v),O=h,ie());break;case 32:O===c&&(e.altKey?(G&&(g=E-R*G,r=u+R*G),N&&(q=K-U*N,o=v+U*N),O=f):(G<0?g=E:G>0&&(r=u),N<0?q=K:N>0&&(o=v),O=h),ee.attr("cursor",_[C]),ie());break;default:return}a(e)},!0),n.dragDisable(t.view)}D.call(B),te.start(t,O.name)}function re(e){for(const t of e.changedTouches||[e])for(const e of Z)e.identifier===t.identifier&&(e.cur=i.pointer(t,B));if(W&&!j&&!S&&1===Z.length){const e=Z[0];d(e.cur[0]-e[0])>d(e.cur[1]-e[1])?S=!0:j=!0}for(const e of Z)e.cur&&(e[0]=e.cur[0],e[1]=e.cur[1]);P=!0,a(e),ie(e)}function ie(e){const t=Z[0],n=t.point0;var i;switch(R=t[0]-n[0],U=t[1]-n[1],O){case c:case l:G&&(R=p(H-r,b(L-g,R)),u=r+R,E=g+R),N&&(U=p(J-o,b(Q-q,U)),v=o+U,K=q+U);break;case h:Z[1]?(G&&(u=p(H,b(L,Z[0][0])),E=p(H,b(L,Z[1][0])),G=1),N&&(v=p(J,b(Q,Z[0][1])),K=p(J,b(Q,Z[1][1])),N=1)):(G<0?(R=p(H-r,b(L-r,R)),u=r+R,E=g):G>0&&(R=p(H-g,b(L-g,R)),u=r,E=g+R),N<0?(U=p(J-o,b(Q-o,U)),v=o+U,K=q):N>0&&(U=p(J-q,b(Q-q,U)),v=o,K=q+U));break;case f:G&&(u=p(H,b(L,r-R*G)),E=p(H,b(L,g+R*G))),N&&(v=p(J,b(Q,o-U*N)),K=p(J,b(Q,q+U*N)))}E { + const i = t.identifier; + t = pointer(t, that); + t.point0 = t.slice(); + t.identifier = i; + return t; + }); + + if (type === "overlay") { + if (selection) moving = true; + const pts = [points[0], points[1] || points[0]]; + state.selection = selection = [[ + w0 = dim === Y ? W : min(pts[0][0], pts[1][0]), + n0 = dim === X ? N : min(pts[0][1], pts[1][1]) + ], [ + e0 = dim === Y ? E : max(pts[0][0], pts[1][0]), + s0 = dim === X ? S : max(pts[0][1], pts[1][1]) + ]]; + if (points.length > 1) move(); + } else { + w0 = selection[0][0]; + n0 = selection[0][1]; + e0 = selection[1][0]; + s0 = selection[1][1]; + } + + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; + + var group = select(that) + .attr("pointer-events", "none"); + + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + interrupt(that); + var emit = emitter(that, arguments, true).beforestart(); + + if (event.touches) { + emit.moved = moved; + emit.ended = ended; + } else { + var view = select(event.view) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + if (keys) view + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true) + + dragDisable(event.view); + } + + redraw.call(that); + emit.start(event, mode.name); + + function moved(event) { + for (const p of event.changedTouches || [event]) { + for (const d of points) + if (d.identifier === p.identifier) d.cur = pointer(p, that); + } + if (shifting && !lockX && !lockY && points.length === 1) { + const point = points[0]; + if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1])) + lockY = true; + else + lockX = true; + } + for (const point of points) + if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1]; + moving = true; + noevent(event); + move(event); + } + + function move(event) { + const point = points[0], point0 = point.point0; + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (points[1]) { + if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1; + if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1; + } else { + if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + } + break; + } + case MODE_CENTER: { + if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX)); + if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY)); + break; + } + } + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) selection = state.selection; // May be set by brush.move! + if (lockX) w1 = selection[0][0], e1 = selection[1][0]; + if (lockY) n1 = selection[0][1], s1 = selection[1][1]; + + if (selection[0][0] !== w1 + || selection[0][1] !== n1 + || selection[1][0] !== e1 + || selection[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(event, mode.name); + } + } + + function ended(event) { + nopropagation(event); + if (event.touches) { + if (event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + } else { + dragEnable(event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) selection = state.selection; // May be set by brush.move (on start)! + if (empty(selection)) state.selection = null, redraw.call(that); + emit.end(event, mode.name); + } + + function keydowned(event) { + switch (event.keyCode) { + case 16: { // SHIFT + shifting = signX && signY; + break; + } + case 18: { // ALT + if (mode === MODE_HANDLE) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; + if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: return; + } + noevent(event); + } + + function keyupped(event) { + switch (event.keyCode) { + case 16: { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: { // SPACE + if (mode === MODE_SPACE) { + if (event.altKey) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: return; + } + noevent(event); + } + } + + function touchmoved(event) { + emitter(this, arguments).moved(event); + } + + function touchended(event) { + emitter(this, arguments).ended(event); + } + + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = number2(extent.apply(this, arguments)); + state.dim = dim; + return state; + } + + brush.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant(number2(_)), brush) : extent; + }; + + brush.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), brush) : filter; + }; + + brush.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), brush) : touchable; + }; + + brush.handleSize = function(_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.keyModifiers = function(_) { + return arguments.length ? (keys = !!_, brush) : keys; + }; + + brush.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; +} diff --git a/node_modules/d3-brush/src/constant.js b/node_modules/d3-brush/src/constant.js new file mode 100644 index 00000000..3487c0dd --- /dev/null +++ b/node_modules/d3-brush/src/constant.js @@ -0,0 +1 @@ +export default x => () => x; diff --git a/node_modules/d3-brush/src/event.js b/node_modules/d3-brush/src/event.js new file mode 100644 index 00000000..78deba1e --- /dev/null +++ b/node_modules/d3-brush/src/event.js @@ -0,0 +1,16 @@ +export default function BrushEvent(type, { + sourceEvent, + target, + selection, + mode, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + selection: {value: selection, enumerable: true, configurable: true}, + mode: {value: mode, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} diff --git a/node_modules/d3-brush/src/index.js b/node_modules/d3-brush/src/index.js new file mode 100644 index 00000000..2c55476b --- /dev/null +++ b/node_modules/d3-brush/src/index.js @@ -0,0 +1,6 @@ +export { + default as brush, + brushX, + brushY, + brushSelection +} from "./brush.js"; diff --git a/node_modules/d3-brush/src/noevent.js b/node_modules/d3-brush/src/noevent.js new file mode 100644 index 00000000..b32552dc --- /dev/null +++ b/node_modules/d3-brush/src/noevent.js @@ -0,0 +1,8 @@ +export function nopropagation(event) { + event.stopImmediatePropagation(); +} + +export default function(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} diff --git a/node_modules/d3-chord/LICENSE b/node_modules/d3-chord/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-chord/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-chord/README.md b/node_modules/d3-chord/README.md new file mode 100644 index 00000000..ab2594b5 --- /dev/null +++ b/node_modules/d3-chord/README.md @@ -0,0 +1,214 @@ +# d3-chord + +Visualize relationships or network flow with an aesthetically-pleasing circular layout. + +[Chord Diagram](https://observablehq.com/@d3/chord-diagram) + +## Installing + +If you use NPM, `npm install d3-chord`. Otherwise, download the [latest release](https://github.com/d3/d3-chord/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-chord.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + +``` + +## API Reference + +# d3.chord() [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js "Source") + +Constructs a new chord layout with the default settings. + +# chord(matrix) [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js "Source") + +Computes the chord layout for the specified square *matrix* of size *n*×*n*, where the *matrix* represents the directed flow amongst a network (a complete digraph) of *n* nodes. The given *matrix* must be an array of length *n*, where each element *matrix*[*i*] is an array of *n* numbers, where each *matrix*[*i*][*j*] represents the flow from the *i*th node in the network to the *j*th node. Each number *matrix*[*i*][*j*] must be nonnegative, though it can be zero if there is no flow from node *i* to node *j*. From the [Circos tableviewer example](http://mkweb.bcgsc.ca/circos/guide/tables/): + +```js +var matrix = [ + [11975, 5871, 8916, 2868], + [ 1951, 10048, 2060, 6171], + [ 8010, 16145, 8090, 8045], + [ 1013, 990, 940, 6907] +]; +``` + +The return value of *chord*(*matrix*) is an array of *chords*, where each chord represents the combined bidirectional flow between two nodes *i* and *j* (where *i* may be equal to *j*) and is an object with the following properties: + +* `source` - the source subgroup +* `target` - the target subgroup + +Each source and target subgroup is also an object with the following properties: + +* `startAngle` - the start angle in radians +* `endAngle` - the end angle in radians +* `value` - the flow value *matrix*[*i*][*j*] +* `index` - the node index *i* + +The chords are typically passed to [d3.ribbon](#ribbon) to display the network relationships. The returned array includes only chord objects for which the value *matrix*[*i*][*j*] or *matrix*[*j*][*i*] is non-zero. Furthermore, the returned array only contains unique chords: a given chord *ij* represents the bidirectional flow from *i* to *j* *and* from *j* to *i*, and does not contain a duplicate chord *ji*; *i* and *j* are chosen such that the chord’s source always represents the larger of *matrix*[*i*][*j*] and *matrix*[*j*][*i*]. + +The *chords* array also defines a secondary array of length *n*, *chords*.groups, where each group represents the combined outflow for node *i*, corresponding to the elements *matrix*[*i*][0 … *n* - 1], and is an object with the following properties: + +* `startAngle` - the start angle in radians +* `endAngle` - the end angle in radians +* `value` - the total outgoing flow value for node *i* +* `index` - the node index *i* + +The groups are typically passed to [d3.arc](https://github.com/d3/d3-shape#arc) to produce a donut chart around the circumference of the chord layout. + +# chord.padAngle([angle]) [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js "Source") + +If *angle* is specified, sets the pad angle between adjacent groups to the specified number in radians and returns this chord layout. If *angle* is not specified, returns the current pad angle, which defaults to zero. + +# chord.sortGroups([compare]) [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js "Source") + +If *compare* is specified, sets the group comparator to the specified function or null and returns this chord layout. If *compare* is not specified, returns the current group comparator, which defaults to null. If the group comparator is non-null, it is used to sort the groups by their total outflow. See also [d3.ascending](https://github.com/d3/d3-array/blob/master/README.md#ascending) and [d3.descending](https://github.com/d3/d3-array/blob/master/README.md#descending). + +# chord.sortSubgroups([compare]) [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js "Source") + +If *compare* is specified, sets the subgroup comparator to the specified function or null and returns this chord layout. If *compare* is not specified, returns the current subgroup comparator, which defaults to null. If the subgroup comparator is non-null, it is used to sort the subgroups corresponding to *matrix*[*i*][0 … *n* - 1] for a given group *i* by their total outflow. See also [d3.ascending](https://github.com/d3/d3-array/blob/master/README.md#ascending) and [d3.descending](https://github.com/d3/d3-array/blob/master/README.md#descending). + +# chord.sortChords([compare]) [<>](https://github.com/d3/d3-chord/blob/master/src/chord.js "Source") + +If *compare* is specified, sets the chord comparator to the specified function or null and returns this chord layout. If *compare* is not specified, returns the current chord comparator, which defaults to null. If the chord comparator is non-null, it is used to sort the [chords](#_chord) by their combined flow; this only affects the *z*-order of the chords. See also [d3.ascending](https://github.com/d3/d3-array/blob/master/README.md#ascending) and [d3.descending](https://github.com/d3/d3-array/blob/master/README.md#descending). + +# d3.ribbon() [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +Creates a new ribbon generator with the default settings. + +# ribbon(arguments…) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +Generates a ribbon for the given *arguments*. The *arguments* are arbitrary; they are simply propagated to the ribbon generator’s accessor functions along with the `this` object. For example, with the default settings, a [chord object](#_chord) expected: + +```js +var ribbon = d3.ribbon(); + +ribbon({ + source: {startAngle: 0.7524114, endAngle: 1.1212972, radius: 240}, + target: {startAngle: 1.8617078, endAngle: 1.9842927, radius: 240} +}); // "M164.0162810494058,-175.21032946354026A240,240,0,0,1,216.1595644740915,-104.28347273835429Q0,0,229.9158815306728,68.8381247563705A240,240,0,0,1,219.77316791012538,96.43523560788266Q0,0,164.0162810494058,-175.21032946354026Z" +``` + +Or equivalently if the radius is instead defined as a constant: + +```js +var ribbon = d3.ribbon() + .radius(240); + +ribbon({ + source: {startAngle: 0.7524114, endAngle: 1.1212972}, + target: {startAngle: 1.8617078, endAngle: 1.9842927} +}); // "M164.0162810494058,-175.21032946354026A240,240,0,0,1,216.1595644740915,-104.28347273835429Q0,0,229.9158815306728,68.8381247563705A240,240,0,0,1,219.77316791012538,96.43523560788266Q0,0,164.0162810494058,-175.21032946354026Z" +``` + +If the ribbon generator has a context, then the ribbon is rendered to this context as a sequence of path method calls and this function returns void. Otherwise, a path data string is returned. + +# ribbon.source([source]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +If *source* is specified, sets the source accessor to the specified function and returns this ribbon generator. If *source* is not specified, returns the current source accessor, which defaults to: + +```js +function source(d) { + return d.source; +} +``` + +# ribbon.target([target]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +If *target* is specified, sets the target accessor to the specified function and returns this ribbon generator. If *target* is not specified, returns the current target accessor, which defaults to: + +```js +function target(d) { + return d.target; +} +``` + +# ribbon.radius([radius]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +If *radius* is specified, sets the source and target radius accessor to the specified function and returns this ribbon generator. If *radius* is not specified, returns the current source radius accessor, which defaults to: + +```js +function radius(d) { + return d.radius; +} +``` + +# ribbon.sourceRadius([radius]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +If *radius* is specified, sets the source radius accessor to the specified function and returns this ribbon generator. If *radius* is not specified, returns the current source radius accessor, which defaults to: + +```js +function radius(d) { + return d.radius; +} +``` + +# ribbon.targetRadius([radius]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +If *radius* is specified, sets the target radius accessor to the specified function and returns this ribbon generator. If *radius* is not specified, returns the current target radius accessor, which defaults to: + +```js +function radius(d) { + return d.radius; +} +``` + +By convention, the target radius in asymmetric chord diagrams is typically inset from the source radius, resulting in a gap between the end of the directed link and its associated group arc. + +# ribbon.startAngle([angle]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +If *angle* is specified, sets the start angle accessor to the specified function and returns this ribbon generator. If *angle* is not specified, returns the current start angle accessor, which defaults to: + +```js +function startAngle(d) { + return d.startAngle; +} +``` + +The *angle* is specified in radians, with 0 at -*y* (12 o’clock) and positive angles proceeding clockwise. + +# ribbon.endAngle([angle]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +If *angle* is specified, sets the end angle accessor to the specified function and returns this ribbon generator. If *angle* is not specified, returns the current end angle accessor, which defaults to: + +```js +function endAngle(d) { + return d.endAngle; +} +``` + +The *angle* is specified in radians, with 0 at -*y* (12 o’clock) and positive angles proceeding clockwise. + +# ribbon.padAngle([angle]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +If *angle* is specified, sets the pad angle accessor to the specified function and returns this ribbon generator. If *angle* is not specified, returns the current pad angle accessor, which defaults to: + +```js +function padAngle() { + return 0; +} +``` + +The pad angle specifies the angular gap between adjacent ribbons. + +# ribbon.context([context]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +If *context* is specified, sets the context and returns this ribbon generator. If *context* is not specified, returns the current context, which defaults to null. If the context is not null, then the [generated ribbon](#_ribbon) is rendered to this context as a sequence of [path method](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls. Otherwise, a [path data](http://www.w3.org/TR/SVG/paths.html#PathData) string representing the generated ribbon is returned. See also [d3-path](https://github.com/d3/d3-path). + +# d3.ribbonArrow() [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +Creates a new arrow ribbon generator with the default settings. + +# ribbonArrow.headRadius([radius]) [<>](https://github.com/d3/d3-chord/blob/master/src/ribbon.js "Source") + +If *radius* is specified, sets the arrowhead radius accessor to the specified function and returns this ribbon generator. If *radius* is not specified, returns the current arrowhead radius accessor, which defaults to: + +```js +function headRadius() { + return 10; +} +``` diff --git a/node_modules/d3-chord/dist/d3-chord.js b/node_modules/d3-chord/dist/d3-chord.js new file mode 100644 index 00000000..2bbc8977 --- /dev/null +++ b/node_modules/d3-chord/dist/d3-chord.js @@ -0,0 +1,284 @@ +// https://d3js.org/d3-chord/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-path')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-path'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); +}(this, function (exports, d3Path) { 'use strict'; + +var abs = Math.abs; +var cos = Math.cos; +var sin = Math.sin; +var pi = Math.PI; +var halfPi = pi / 2; +var tau = pi * 2; +var max = Math.max; +var epsilon = 1e-12; + +function range(i, j) { + return Array.from({length: j - i}, (_, k) => i + k); +} + +function compareValue(compare) { + return function(a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; +} + +function chord() { + return chord$1(false, false); +} + +function chordTranspose() { + return chord$1(false, true); +} + +function chordDirected() { + return chord$1(true, false); +} + +function chord$1(directed, transpose) { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = new Array(n), + groupIndex = range(0, n), + chords = new Array(n * n), + groups = new Array(n), + k = 0, dx; + + matrix = Float64Array.from({length: n * n}, transpose + ? (_, i) => matrix[i % n][i / n | 0] + : (_, i) => matrix[i / n | 0][i % n]); + + // Compute the scaling factor from value to angle in [0, 2pi]. + for (let i = 0; i < n; ++i) { + let x = 0; + for (let j = 0; j < n; ++j) x += matrix[i * n + j] + directed * matrix[j * n + i]; + k += groupSums[i] = x; + } + k = max(0, tau - padAngle * n) / k; + dx = k ? padAngle : tau / n; + + // Compute the angles for each group and constituent chord. + { + let x = 0; + if (sortGroups) groupIndex.sort((a, b) => sortGroups(groupSums[a], groupSums[b])); + for (const i of groupIndex) { + const x0 = x; + if (directed) { + const subgroupIndex = range(~n + 1, n).filter(j => j < 0 ? matrix[~j * n + i] : matrix[i * n + j]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(a < 0 ? -matrix[~a * n + i] : matrix[i * n + a], b < 0 ? -matrix[~b * n + i] : matrix[i * n + b])); + for (const j of subgroupIndex) { + if (j < 0) { + const chord = chords[~j * n + i] || (chords[~j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[~j * n + i] * k, value: matrix[~j * n + i]}; + } else { + const chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; + } else { + const subgroupIndex = range(0, n).filter(j => matrix[i * n + j] || matrix[j * n + i]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(matrix[i * n + a], matrix[i * n + b])); + for (const j of subgroupIndex) { + let chord; + if (i < j) { + chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } else { + chord = chords[j * n + i] || (chords[j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + if (i === j) chord.source = chord.target; + } + if (chord.source && chord.target && chord.source.value < chord.target.value) { + const source = chord.source; + chord.source = chord.target; + chord.target = source; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; + } + x += dx; + } + } + + // Remove empty chords. + chords = Object.values(chords); + chords.groups = groups; + return sortChords ? chords.sort(sortChords) : chords; + } + + chord.padAngle = function(_) { + return arguments.length ? (padAngle = max(0, _), chord) : padAngle; + }; + + chord.sortGroups = function(_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; + + chord.sortSubgroups = function(_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; + + chord.sortChords = function(_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; + + return chord; +} + +var slice = Array.prototype.slice; + +function constant(x) { + return function() { + return x; + }; +} + +function defaultSource(d) { + return d.source; +} + +function defaultTarget(d) { + return d.target; +} + +function defaultRadius(d) { + return d.radius; +} + +function defaultStartAngle(d) { + return d.startAngle; +} + +function defaultEndAngle(d) { + return d.endAngle; +} + +function defaultPadAngle() { + return 0; +} + +function defaultArrowheadRadius() { + return 10; +} + +function ribbon(headRadius) { + var source = defaultSource, + target = defaultTarget, + sourceRadius = defaultRadius, + targetRadius = defaultRadius, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + padAngle = defaultPadAngle, + context = null; + + function ribbon() { + var buffer, + s = source.apply(this, arguments), + t = target.apply(this, arguments), + ap = padAngle.apply(this, arguments) / 2, + argv = slice.call(arguments), + sr = +sourceRadius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi, + sa1 = endAngle.apply(this, argv) - halfPi, + tr = +targetRadius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi, + ta1 = endAngle.apply(this, argv) - halfPi; + + if (!context) context = buffer = d3Path.path(); + + if (ap > epsilon) { + if (abs(sa1 - sa0) > ap * 2 + epsilon) sa1 > sa0 ? (sa0 += ap, sa1 -= ap) : (sa0 -= ap, sa1 += ap); + else sa0 = sa1 = (sa0 + sa1) / 2; + if (abs(ta1 - ta0) > ap * 2 + epsilon) ta1 > ta0 ? (ta0 += ap, ta1 -= ap) : (ta0 -= ap, ta1 += ap); + else ta0 = ta1 = (ta0 + ta1) / 2; + } + + context.moveTo(sr * cos(sa0), sr * sin(sa0)); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { + if (headRadius) { + var hr = +headRadius.apply(this, arguments), tr2 = tr - hr, ta2 = (ta0 + ta1) / 2; + context.quadraticCurveTo(0, 0, tr2 * cos(ta0), tr2 * sin(ta0)); + context.lineTo(tr * cos(ta2), tr * sin(ta2)); + context.lineTo(tr2 * cos(ta1), tr2 * sin(ta1)); + } else { + context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + } + context.quadraticCurveTo(0, 0, sr * cos(sa0), sr * sin(sa0)); + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + if (headRadius) ribbon.headRadius = function(_) { + return arguments.length ? (headRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : headRadius; + }; + + ribbon.radius = function(_) { + return arguments.length ? (sourceRadius = targetRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : sourceRadius; + }; + + ribbon.sourceRadius = function(_) { + return arguments.length ? (sourceRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : sourceRadius; + }; + + ribbon.targetRadius = function(_) { + return arguments.length ? (targetRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : targetRadius; + }; + + ribbon.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : startAngle; + }; + + ribbon.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : endAngle; + }; + + ribbon.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : padAngle; + }; + + ribbon.source = function(_) { + return arguments.length ? (source = _, ribbon) : source; + }; + + ribbon.target = function(_) { + return arguments.length ? (target = _, ribbon) : target; + }; + + ribbon.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; + + return ribbon; +} + +function ribbon$1() { + return ribbon(); +} + +function ribbonArrow() { + return ribbon(defaultArrowheadRadius); +} + +exports.chord = chord; +exports.chordDirected = chordDirected; +exports.chordTranspose = chordTranspose; +exports.ribbon = ribbon$1; +exports.ribbonArrow = ribbonArrow; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-chord/dist/d3-chord.min.js b/node_modules/d3-chord/dist/d3-chord.min.js new file mode 100644 index 00000000..9e808958 --- /dev/null +++ b/node_modules/d3-chord/dist/d3-chord.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-chord/ v2.0.0 Copyright 2020 Mike Bostock +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-path")):"function"==typeof define&&define.amd?define(["exports","d3-path"],t):t((n=n||self).d3=n.d3||{},n.d3)}(this,function(n,t){"use strict";var e=Math.abs,r=Math.cos,u=Math.sin,o=Math.PI,l=o/2,a=2*o,i=Math.max,c=1e-12;function f(n,t){return Array.from({length:t-n},(t,e)=>n+e)}function s(n){return function(t,e){return n(t.source.value+t.target.value,e.source.value+e.target.value)}}function g(n,t){var e=0,r=null,u=null,o=null;function l(l){var c,s=l.length,g=new Array(s),p=f(0,s),d=new Array(s*s),h=new Array(s),y=0;l=Float64Array.from({length:s*s},t?(n,t)=>l[t%s][t/s|0]:(n,t)=>l[t/s|0][t%s]);for(let t=0;tr(g[n],g[t]));for(const e of p){const r=t;if(n){const n=f(1+~s,s).filter(n=>n<0?l[~n*s+e]:l[e*s+n]);u&&n.sort((n,t)=>u(n<0?-l[~n*s+e]:l[e*s+n],t<0?-l[~t*s+e]:l[e*s+t]));for(const r of n)if(r<0){(d[~r*s+e]||(d[~r*s+e]={source:null,target:null})).target={index:e,startAngle:t,endAngle:t+=l[~r*s+e]*y,value:l[~r*s+e]}}else{(d[e*s+r]||(d[e*s+r]={source:null,target:null})).source={index:e,startAngle:t,endAngle:t+=l[e*s+r]*y,value:l[e*s+r]}}h[e]={index:e,startAngle:r,endAngle:t,value:g[e]}}else{const n=f(0,s).filter(n=>l[e*s+n]||l[n*s+e]);u&&n.sort((n,t)=>u(l[e*s+n],l[e*s+t]));for(const r of n){let n;if(ec&&(e(M-b)>2*v+c?M>b?(b+=v,M-=v):(b-=v,M+=v):b=M=(b+M)/2,e(C-w)>2*v+c?C>w?(w+=v,C-=v):(w-=v,C+=v):w=C=(w+C)/2),m.moveTo(x*r(b),x*u(b)),m.arc(0,0,x,b,M),b!==w||M!==C)if(n){var _=q-+n.apply(this,arguments),j=(w+C)/2;m.quadraticCurveTo(0,0,_*r(w),_*u(w)),m.lineTo(q*r(j),q*u(j)),m.lineTo(_*r(C),_*u(C))}else m.quadraticCurveTo(0,0,q*r(w),q*u(w)),m.arc(0,0,q,w,C);if(m.quadraticCurveTo(0,0,x*r(b),x*u(b)),m.closePath(),d)return m=null,d+""||null}return n&&(M.headRadius=function(t){return arguments.length?(n="function"==typeof t?t:d(+t),M):n}),M.radius=function(n){return arguments.length?(i=f="function"==typeof n?n:d(+n),M):i},M.sourceRadius=function(n){return arguments.length?(i="function"==typeof n?n:d(+n),M):i},M.targetRadius=function(n){return arguments.length?(f="function"==typeof n?n:d(+n),M):f},M.startAngle=function(n){return arguments.length?(s="function"==typeof n?n:d(+n),M):s},M.endAngle=function(n){return arguments.length?(g="function"==typeof n?n:d(+n),M):g},M.padAngle=function(n){return arguments.length?(T="function"==typeof n?n:d(+n),M):T},M.source=function(n){return arguments.length?(o=n,M):o},M.target=function(n){return arguments.length?(a=n,M):a},M.context=function(n){return arguments.length?(m=null==n?null:n,M):m},M}n.chord=function(){return g(!1,!1)},n.chordDirected=function(){return g(!0,!1)},n.chordTranspose=function(){return g(!1,!0)},n.ribbon=function(){return m()},n.ribbonArrow=function(){return m(T)},Object.defineProperty(n,"__esModule",{value:!0})}); diff --git a/node_modules/d3-chord/package.json b/node_modules/d3-chord/package.json new file mode 100644 index 00000000..69ebee3a --- /dev/null +++ b/node_modules/d3-chord/package.json @@ -0,0 +1,75 @@ +{ + "_from": "d3-chord@2", + "_id": "d3-chord@2.0.0", + "_inBundle": false, + "_integrity": "sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig==", + "_location": "/d3-chord", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-chord@2", + "name": "d3-chord", + "escapedName": "d3-chord", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3" + ], + "_resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-2.0.0.tgz", + "_shasum": "32491b5665391180560f738e5c1ccd1e3c47ebae", + "_spec": "d3-chord@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-chord/issues" + }, + "bundleDependencies": false, + "dependencies": { + "d3-path": "1 - 2" + }, + "deprecated": false, + "description": "Visualize relationships or network flow with an aesthetically-pleasing circular layout.", + "devDependencies": { + "eslint": "6", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-chord/", + "jsdelivr": "dist/d3-chord.min.js", + "keywords": [ + "d3", + "d3-module", + "chord", + "radial", + "network", + "flow" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-chord.js", + "module": "src/index.js", + "name": "d3-chord", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-chord.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src" + }, + "sideEffects": false, + "unpkg": "dist/d3-chord.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-chord/src/array.js b/node_modules/d3-chord/src/array.js new file mode 100644 index 00000000..8eeac161 --- /dev/null +++ b/node_modules/d3-chord/src/array.js @@ -0,0 +1 @@ +export var slice = Array.prototype.slice; diff --git a/node_modules/d3-chord/src/chord.js b/node_modules/d3-chord/src/chord.js new file mode 100644 index 00000000..f9f1a98a --- /dev/null +++ b/node_modules/d3-chord/src/chord.js @@ -0,0 +1,122 @@ +import {max, tau} from "./math.js"; + +function range(i, j) { + return Array.from({length: j - i}, (_, k) => i + k); +} + +function compareValue(compare) { + return function(a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; +} + +export default function() { + return chord(false, false); +} + +export function chordTranspose() { + return chord(false, true); +} + +export function chordDirected() { + return chord(true, false); +} + +function chord(directed, transpose) { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = new Array(n), + groupIndex = range(0, n), + chords = new Array(n * n), + groups = new Array(n), + k = 0, dx; + + matrix = Float64Array.from({length: n * n}, transpose + ? (_, i) => matrix[i % n][i / n | 0] + : (_, i) => matrix[i / n | 0][i % n]); + + // Compute the scaling factor from value to angle in [0, 2pi]. + for (let i = 0; i < n; ++i) { + let x = 0; + for (let j = 0; j < n; ++j) x += matrix[i * n + j] + directed * matrix[j * n + i]; + k += groupSums[i] = x; + } + k = max(0, tau - padAngle * n) / k; + dx = k ? padAngle : tau / n; + + // Compute the angles for each group and constituent chord. + { + let x = 0; + if (sortGroups) groupIndex.sort((a, b) => sortGroups(groupSums[a], groupSums[b])); + for (const i of groupIndex) { + const x0 = x; + if (directed) { + const subgroupIndex = range(~n + 1, n).filter(j => j < 0 ? matrix[~j * n + i] : matrix[i * n + j]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(a < 0 ? -matrix[~a * n + i] : matrix[i * n + a], b < 0 ? -matrix[~b * n + i] : matrix[i * n + b])); + for (const j of subgroupIndex) { + if (j < 0) { + const chord = chords[~j * n + i] || (chords[~j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[~j * n + i] * k, value: matrix[~j * n + i]}; + } else { + const chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; + } else { + const subgroupIndex = range(0, n).filter(j => matrix[i * n + j] || matrix[j * n + i]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(matrix[i * n + a], matrix[i * n + b])); + for (const j of subgroupIndex) { + let chord; + if (i < j) { + chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } else { + chord = chords[j * n + i] || (chords[j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + if (i === j) chord.source = chord.target; + } + if (chord.source && chord.target && chord.source.value < chord.target.value) { + const source = chord.source; + chord.source = chord.target; + chord.target = source; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; + } + x += dx; + } + } + + // Remove empty chords. + chords = Object.values(chords); + chords.groups = groups; + return sortChords ? chords.sort(sortChords) : chords; + } + + chord.padAngle = function(_) { + return arguments.length ? (padAngle = max(0, _), chord) : padAngle; + }; + + chord.sortGroups = function(_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; + + chord.sortSubgroups = function(_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; + + chord.sortChords = function(_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; + + return chord; +} diff --git a/node_modules/d3-chord/src/constant.js b/node_modules/d3-chord/src/constant.js new file mode 100644 index 00000000..b7d42e71 --- /dev/null +++ b/node_modules/d3-chord/src/constant.js @@ -0,0 +1,5 @@ +export default function(x) { + return function() { + return x; + }; +} diff --git a/node_modules/d3-chord/src/index.js b/node_modules/d3-chord/src/index.js new file mode 100644 index 00000000..adec6036 --- /dev/null +++ b/node_modules/d3-chord/src/index.js @@ -0,0 +1,2 @@ +export {default as chord, chordTranspose, chordDirected} from "./chord.js"; +export {default as ribbon, ribbonArrow} from "./ribbon.js"; diff --git a/node_modules/d3-chord/src/math.js b/node_modules/d3-chord/src/math.js new file mode 100644 index 00000000..9ad579e2 --- /dev/null +++ b/node_modules/d3-chord/src/math.js @@ -0,0 +1,8 @@ +export var abs = Math.abs; +export var cos = Math.cos; +export var sin = Math.sin; +export var pi = Math.PI; +export var halfPi = pi / 2; +export var tau = pi * 2; +export var max = Math.max; +export var epsilon = 1e-12; diff --git a/node_modules/d3-chord/src/ribbon.js b/node_modules/d3-chord/src/ribbon.js new file mode 100644 index 00000000..bcd75b85 --- /dev/null +++ b/node_modules/d3-chord/src/ribbon.js @@ -0,0 +1,134 @@ +import {path} from "d3-path"; +import {slice} from "./array.js"; +import constant from "./constant.js"; +import {abs, cos, epsilon, halfPi, sin} from "./math.js"; + +function defaultSource(d) { + return d.source; +} + +function defaultTarget(d) { + return d.target; +} + +function defaultRadius(d) { + return d.radius; +} + +function defaultStartAngle(d) { + return d.startAngle; +} + +function defaultEndAngle(d) { + return d.endAngle; +} + +function defaultPadAngle() { + return 0; +} + +function defaultArrowheadRadius() { + return 10; +} + +function ribbon(headRadius) { + var source = defaultSource, + target = defaultTarget, + sourceRadius = defaultRadius, + targetRadius = defaultRadius, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + padAngle = defaultPadAngle, + context = null; + + function ribbon() { + var buffer, + s = source.apply(this, arguments), + t = target.apply(this, arguments), + ap = padAngle.apply(this, arguments) / 2, + argv = slice.call(arguments), + sr = +sourceRadius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi, + sa1 = endAngle.apply(this, argv) - halfPi, + tr = +targetRadius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi, + ta1 = endAngle.apply(this, argv) - halfPi; + + if (!context) context = buffer = path(); + + if (ap > epsilon) { + if (abs(sa1 - sa0) > ap * 2 + epsilon) sa1 > sa0 ? (sa0 += ap, sa1 -= ap) : (sa0 -= ap, sa1 += ap); + else sa0 = sa1 = (sa0 + sa1) / 2; + if (abs(ta1 - ta0) > ap * 2 + epsilon) ta1 > ta0 ? (ta0 += ap, ta1 -= ap) : (ta0 -= ap, ta1 += ap); + else ta0 = ta1 = (ta0 + ta1) / 2; + } + + context.moveTo(sr * cos(sa0), sr * sin(sa0)); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { + if (headRadius) { + var hr = +headRadius.apply(this, arguments), tr2 = tr - hr, ta2 = (ta0 + ta1) / 2; + context.quadraticCurveTo(0, 0, tr2 * cos(ta0), tr2 * sin(ta0)); + context.lineTo(tr * cos(ta2), tr * sin(ta2)); + context.lineTo(tr2 * cos(ta1), tr2 * sin(ta1)); + } else { + context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + } + context.quadraticCurveTo(0, 0, sr * cos(sa0), sr * sin(sa0)); + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + if (headRadius) ribbon.headRadius = function(_) { + return arguments.length ? (headRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : headRadius; + }; + + ribbon.radius = function(_) { + return arguments.length ? (sourceRadius = targetRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : sourceRadius; + }; + + ribbon.sourceRadius = function(_) { + return arguments.length ? (sourceRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : sourceRadius; + }; + + ribbon.targetRadius = function(_) { + return arguments.length ? (targetRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : targetRadius; + }; + + ribbon.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : startAngle; + }; + + ribbon.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : endAngle; + }; + + ribbon.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : padAngle; + }; + + ribbon.source = function(_) { + return arguments.length ? (source = _, ribbon) : source; + }; + + ribbon.target = function(_) { + return arguments.length ? (target = _, ribbon) : target; + }; + + ribbon.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; + + return ribbon; +} + +export default function() { + return ribbon(); +} + +export function ribbonArrow() { + return ribbon(defaultArrowheadRadius); +} diff --git a/node_modules/d3-color/LICENSE b/node_modules/d3-color/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-color/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-color/README.md b/node_modules/d3-color/README.md new file mode 100644 index 00000000..c29bed1f --- /dev/null +++ b/node_modules/d3-color/README.md @@ -0,0 +1,183 @@ +# d3-color + +Even though your browser understands a lot about colors, it doesn’t offer much help in manipulating colors through JavaScript. The d3-color module therefore provides representations for various color spaces, allowing specification, conversion and manipulation. (Also see [d3-interpolate](https://github.com/d3/d3-interpolate) for color interpolation.) + +For example, take the color named “steelblueâ€: + +```js +var c = d3.color("steelblue"); // {r: 70, g: 130, b: 180, opacity: 1} +``` + +Let’s try converting it to HSL: + +```js +var c = d3.hsl("steelblue"); // {h: 207.27…, s: 0.44, l: 0.4902…, opacity: 1} +``` + +Now rotate the hue by 90°, bump up the saturation, and format as a string for CSS: + +```js +c.h += 90; +c.s += 0.2; +c + ""; // rgb(198, 45, 205) +``` + +To fade the color slightly: + +```js +c.opacity = 0.8; +c + ""; // rgba(198, 45, 205, 0.8) +``` + +In addition to the ubiquitous and machine-friendly [RGB](#rgb) and [HSL](#hsl) color space, d3-color supports color spaces that are designed for humans: + +* [CIELAB](#lab) (*a.k.a.* “Labâ€) +* [CIELChab](#lch) (*a.k.a.* “LCh†or “HCLâ€) +* Dave Green’s [Cubehelix](#cubehelix) + +Cubehelix features monotonic lightness, while CIELAB and its polar form CIELChab are perceptually uniform. + +## Extensions + +For additional color spaces, see: + +* [d3-cam16](https://github.com/d3/d3-cam16) +* [d3-cam02](https://github.com/connorgr/d3-cam02) +* [d3-hsv](https://github.com/d3/d3-hsv) +* [d3-hcg](https://github.com/d3/d3-hcg) +* [d3-hsluv](https://github.com/petulla/d3-hsluv) + +To measure color differences, see: + +* [d3-color-difference](https://github.com/Evercoder/d3-color-difference) + +## Installing + +If you use NPM, `npm install d3-color`. Otherwise, download the [latest release](https://github.com/d3/d3-color/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-color.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +[Try d3-color in your browser.](https://observablehq.com/collection/@d3/d3-color) + +## API Reference + +# d3.color(specifier) [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +Parses the specified [CSS Color Module Level 3](http://www.w3.org/TR/css3-color/#colorunits) *specifier* string, returning an [RGB](#rgb) or [HSL](#hsl) color, along with [CSS Color Module Level 4 hex](https://www.w3.org/TR/css-color-4/#hex-notation) *specifier* strings. If the specifier was not valid, null is returned. Some examples: + +* `rgb(255, 255, 255)` +* `rgb(10%, 20%, 30%)` +* `rgba(255, 255, 255, 0.4)` +* `rgba(10%, 20%, 30%, 0.4)` +* `hsl(120, 50%, 20%)` +* `hsla(120, 50%, 20%, 0.4)` +* `#ffeeaa` +* `#fea` +* `#ffeeaa22` +* `#fea2` +* `steelblue` + +The list of supported [named colors](http://www.w3.org/TR/SVG/types.html#ColorKeywords) is specified by CSS. + +Note: this function may also be used with `instanceof` to test if an object is a color instance. The same is true of color subclasses, allowing you to test whether a color is in a particular color space. + +# *color*.opacity + +This color’s opacity, typically in the range [0, 1]. + +# *color*.rgb() [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +Returns the [RGB equivalent](#rgb) of this color. For RGB colors, that’s `this`. + +# color.copy([values]) [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +Returns a copy of this color. If *values* is specified, any enumerable own properties of *values* are assigned to the new returned color. For example, to derive a copy of a *color* with opacity 0.5, say + +```js +color.copy({opacity: 0.5}) +``` + +# *color*.brighter([k]) [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +Returns a brighter copy of this color. If *k* is specified, it controls how much brighter the returned color should be. If *k* is not specified, it defaults to 1. The behavior of this method is dependent on the implementing color space. + +# *color*.darker([k]) [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +Returns a darker copy of this color. If *k* is specified, it controls how much darker the returned color should be. If *k* is not specified, it defaults to 1. The behavior of this method is dependent on the implementing color space. + +# *color*.displayable() [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +Returns true if and only if the color is displayable on standard hardware. For example, this returns false for an RGB color if any channel value is less than zero or greater than 255 when rounded, or if the opacity is not in the range [0, 1]. + +# *color*.formatHex() [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +Returns a hexadecimal string representing this color in RGB space, such as `#f7eaba`. If this color is not displayable, a suitable displayable color is returned instead. For example, RGB channel values greater than 255 are clamped to 255. + +# *color*.formatHsl() [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +Returns a string representing this color according to the [CSS Color Module Level 3 specification](https://www.w3.org/TR/css-color-3/#hsl-color), such as `hsl(257, 50%, 80%)` or `hsla(257, 50%, 80%, 0.2)`. If this color is not displayable, a suitable displayable color is returned instead by clamping S and L channel values to the interval [0, 100]. + +# *color*.formatRgb() [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +Returns a string representing this color according to the [CSS Object Model specification](https://drafts.csswg.org/cssom/#serialize-a-css-component-value), such as `rgb(247, 234, 186)` or `rgba(247, 234, 186, 0.2)`. If this color is not displayable, a suitable displayable color is returned instead by clamping RGB channel values to the interval [0, 255]. + +# *color*.toString() [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source") + +An alias for [*color*.formatRgb](#color_formatRgb). + +# d3.rgb(r, g, b[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source")
+# d3.rgb(specifier)
+# d3.rgb(color)
+ +Constructs a new [RGB](https://en.wikipedia.org/wiki/RGB_color_model) color. The channel values are exposed as `r`, `g` and `b` properties on the returned instance. Use the [RGB color picker](http://bl.ocks.org/mbostock/78d64ca7ef013b4dcf8f) to explore this color space. + +If *r*, *g* and *b* are specified, these represent the channel values of the returned color; an *opacity* may also be specified. If a CSS Color Module Level 3 *specifier* string is specified, it is parsed and then converted to the RGB color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb). Note that unlike [*color*.rgb](#color_rgb) this method *always* returns a new instance, even if *color* is already an RGB color. + +# d3.hsl(h, s, l[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/color.js "Source")
+# d3.hsl(specifier)
+# d3.hsl(color)
+ +Constructs a new [HSL](https://en.wikipedia.org/wiki/HSL_and_HSV) color. The channel values are exposed as `h`, `s` and `l` properties on the returned instance. Use the [HSL color picker](http://bl.ocks.org/mbostock/debaad4fcce9bcee14cf) to explore this color space. + +If *h*, *s* and *l* are specified, these represent the channel values of the returned color; an *opacity* may also be specified. If a CSS Color Module Level 3 *specifier* string is specified, it is parsed and then converted to the HSL color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb) and then converted to HSL. (Colors already in the HSL color space skip the conversion to RGB.) + +# d3.lab(l, a, b[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/lab.js "Source")
+# d3.lab(specifier)
+# d3.lab(color)
+ +Constructs a new [CIELAB](https://en.wikipedia.org/wiki/Lab_color_space#CIELAB) color. The channel values are exposed as `l`, `a` and `b` properties on the returned instance. Use the [CIELAB color picker](http://bl.ocks.org/mbostock/9f37cc207c0cb166921b) to explore this color space. The value of *l* is typically in the range [0, 100], while *a* and *b* are typically in [-160, +160]. + +If *l*, *a* and *b* are specified, these represent the channel values of the returned color; an *opacity* may also be specified. If a CSS Color Module Level 3 *specifier* string is specified, it is parsed and then converted to the CIELAB color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb) and then converted to CIELAB. (Colors already in the CIELAB color space skip the conversion to RGB, and colors in the HCL color space are converted directly to CIELAB.) + +# d3.gray(l[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/lab.js "Source")
+ +Constructs a new [CIELAB](#lab) color with the specified *l* value and *a* = *b* = 0. + +# d3.hcl(h, c, l[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/lab.js "Source")
+# d3.hcl(specifier)
+# d3.hcl(color)
+ +Equivalent to [d3.lch](#lch), but with reversed argument order. + +# d3.lch(l, c, h[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/lab.js "Source")
+# d3.lch(specifier)
+# d3.lch(color)
+ +Constructs a new [CIELChab](https://en.wikipedia.org/wiki/CIELAB_color_space#Cylindrical_representation:_CIELCh_or_CIEHLC) color. The channel values are exposed as `l`, `c` and `h` properties on the returned instance. Use the [CIELChab color picker](http://bl.ocks.org/mbostock/3e115519a1b495e0bd95) to explore this color space. The value of *l* is typically in the range [0, 100], *c* is typically in [0, 230], and *h* is typically in [0, 360). + +If *l*, *c*, and *h* are specified, these represent the channel values of the returned color; an *opacity* may also be specified. If a CSS Color Module Level 3 *specifier* string is specified, it is parsed and then converted to CIELChab color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb) and then converted to CIELChab. (Colors already in CIELChab color space skip the conversion to RGB, and colors in CIELAB color space are converted directly to CIELChab.) + +# d3.cubehelix(h, s, l[, opacity]) [<>](https://github.com/d3/d3-color/blob/master/src/cubehelix.js "Source")
+# d3.cubehelix(specifier)
+# d3.cubehelix(color)
+ +Constructs a new [Cubehelix](http://www.mrao.cam.ac.uk/~dag/CUBEHELIX/) color. The channel values are exposed as `h`, `s` and `l` properties on the returned instance. Use the [Cubehelix color picker](http://bl.ocks.org/mbostock/ba8d75e45794c27168b5) to explore this color space. + +If *h*, *s* and *l* are specified, these represent the channel values of the returned color; an *opacity* may also be specified. If a CSS Color Module Level 3 *specifier* string is specified, it is parsed and then converted to the Cubehelix color space. See [color](#color) for examples. If a [*color*](#color) instance is specified, it is converted to the RGB color space using [*color*.rgb](#color_rgb) and then converted to Cubehelix. (Colors already in the Cubehelix color space skip the conversion to RGB.) diff --git a/node_modules/d3-color/dist/d3-color.js b/node_modules/d3-color/dist/d3-color.js new file mode 100644 index 00000000..ba460262 --- /dev/null +++ b/node_modules/d3-color/dist/d3-color.js @@ -0,0 +1,581 @@ +// https://d3js.org/d3-color/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +function define(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; +} + +function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; +} + +function Color() {} + +var darker = 0.7; +var brighter = 1 / darker; + +var reI = "\\s*([+-]?\\d+)\\s*", + reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reHex = /^#([0-9a-f]{3,8})$/, + reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + +var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 +}; + +define(Color, color, { + copy: function(channels) { + return Object.assign(new this.constructor, this, channels); + }, + displayable: function() { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb +}); + +function color_formatHex() { + return this.rgb().formatHex(); +} + +function color_formatHsl() { + return hslConvert(this).formatHsl(); +} + +function color_formatRgb() { + return this.rgb().formatRgb(); +} + +function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; +} + +function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); +} + +function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); +} + +function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} + +function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} + +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} + +define(Rgb, rgb, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function() { + return this; + }, + displayable: function() { + return (-0.5 <= this.r && this.r < 255.5) + && (-0.5 <= this.g && this.g < 255.5) + && (-0.5 <= this.b && this.b < 255.5) + && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); + +function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); +} + +function rgb_formatRgb() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); +} + +function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); +} + +function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); +} + +function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} + +function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} + +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Hsl, hsl, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl: function() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } +})); + +/* From FvD 13.37, CSS Color Module Level 3 */ +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; +} + +const radians = Math.PI / 180; +const degrees = 180 / Math.PI; + +// https://observablehq.com/@mbostock/lab-and-rgb +const K = 18, + Xn = 0.96422, + Yn = 1, + Zn = 0.82521, + t0 = 4 / 29, + t1 = 6 / 29, + t2 = 3 * t1 * t1, + t3 = t1 * t1 * t1; + +function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) return hcl2lab(o); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = rgb2lrgb(o.r), + g = rgb2lrgb(o.g), + b = rgb2lrgb(o.b), + y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) x = z = y; else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); +} + +function gray(l, opacity) { + return new Lab(l, 0, 0, opacity == null ? 1 : opacity); +} + +function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); +} + +function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; +} + +define(Lab, lab, extend(Color, { + brighter: function(k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function(k) { + return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function() { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), + lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } +})); + +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; +} + +function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); +} + +function lrgb2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} + +function rgb2lrgb(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} + +function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * degrees; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); +} + +function lch(l, c, h, opacity) { + return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; +} + +function hcl2lab(o) { + if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * radians; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); +} + +define(Hcl, hcl, extend(Color, { + brighter: function(k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker: function(k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb: function() { + return hcl2lab(this).rgb(); + } +})); + +var A = -0.14861, + B = +1.78277, + C = -0.29227, + D = -0.90649, + E = +1.97294, + ED = E * D, + EB = E * B, + BC_DA = B * C - D * A; + +function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * degrees - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +} + +function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); +} + +function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Cubehelix, cubehelix, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * radians, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } +})); + +exports.color = color; +exports.cubehelix = cubehelix; +exports.gray = gray; +exports.hcl = hcl; +exports.hsl = hsl; +exports.lab = lab; +exports.lch = lch; +exports.rgb = rgb; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-color/dist/d3-color.min.js b/node_modules/d3-color/dist/d3-color.min.js new file mode 100644 index 00000000..f3a02f0c --- /dev/null +++ b/node_modules/d3-color/dist/d3-color.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-color/ v2.0.0 Copyright 2020 Mike Bostock +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).d3=t.d3||{})}(this,function(t){"use strict";function e(t,e,n){t.prototype=e.prototype=n,n.constructor=t}function n(t,e){var n=Object.create(t.prototype);for(var i in e)n[i]=e[i];return n}function i(){}var r="\\s*([+-]?\\d+)\\s*",a="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",s="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",o=/^#([0-9a-f]{3,8})$/,h=new RegExp("^rgb\\("+[r,r,r]+"\\)$"),l=new RegExp("^rgb\\("+[s,s,s]+"\\)$"),u=new RegExp("^rgba\\("+[r,r,r,a]+"\\)$"),c=new RegExp("^rgba\\("+[s,s,s,a]+"\\)$"),g=new RegExp("^hsl\\("+[a,s,s]+"\\)$"),f=new RegExp("^hsla\\("+[a,s,s,a]+"\\)$"),d={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function p(){return this.rgb().formatHex()}function b(){return this.rgb().formatRgb()}function y(t){var e,n;return t=(t+"").trim().toLowerCase(),(e=o.exec(t))?(n=e[1].length,e=parseInt(e[1],16),6===n?w(e):3===n?new M(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?m(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?m(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=h.exec(t))?new M(e[1],e[2],e[3],1):(e=l.exec(t))?new M(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=u.exec(t))?m(e[1],e[2],e[3],e[4]):(e=c.exec(t))?m(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=g.exec(t))?R(e[1],e[2]/100,e[3]/100,1):(e=f.exec(t))?R(e[1],e[2]/100,e[3]/100,e[4]):d.hasOwnProperty(t)?w(d[t]):"transparent"===t?new M(NaN,NaN,NaN,0):null}function w(t){return new M(t>>16&255,t>>8&255,255&t,1)}function m(t,e,n,i){return i<=0&&(t=e=n=NaN),new M(t,e,n,i)}function N(t){return t instanceof i||(t=y(t)),t?new M((t=t.rgb()).r,t.g,t.b,t.opacity):new M}function k(t,e,n,i){return 1===arguments.length?N(t):new M(t,e,n,null==i?1:i)}function M(t,e,n,i){this.r=+t,this.g=+e,this.b=+n,this.opacity=+i}function v(){return"#"+q(this.r)+q(this.g)+q(this.b)}function x(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function q(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function R(t,e,n,i){return i<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new H(t,e,n,i)}function E(t){if(t instanceof H)return new H(t.h,t.s,t.l,t.opacity);if(t instanceof i||(t=y(t)),!t)return new H;if(t instanceof H)return t;var e=(t=t.rgb()).r/255,n=t.g/255,r=t.b/255,a=Math.min(e,n,r),s=Math.max(e,n,r),o=NaN,h=s-a,l=(s+a)/2;return h?(o=e===s?(n-r)/h+6*(n0&&l<1?0:o,new H(o,h,l,t.opacity)}function $(t,e,n,i){return 1===arguments.length?E(t):new H(t,e,n,null==i?1:i)}function H(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}function j(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}e(i,y,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:p,formatHex:p,formatHsl:function(){return E(this).formatHsl()},formatRgb:b,toString:b}),e(M,k,n(i,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new M(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new M(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:v,formatHex:v,formatRgb:x,toString:x})),e(H,$,n(i,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new H(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new H(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*e,r=2*n-i;return new M(j(t>=240?t-240:t+120,r,i),j(t,r,i),j(t<120?t+240:t-120,r,i),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));const O=Math.PI/180,P=180/Math.PI,I=.96422,S=1,_=.82521,z=4/29,C=6/29,L=3*C*C,A=C*C*C;function B(t){if(t instanceof F)return new F(t.l,t.a,t.b,t.opacity);if(t instanceof V)return W(t);t instanceof M||(t=N(t));var e,n,i=Q(t.r),r=Q(t.g),a=Q(t.b),s=G((.2225045*i+.7168786*r+.0606169*a)/S);return i===r&&r===a?e=n=s:(e=G((.4360747*i+.3850649*r+.1430804*a)/I),n=G((.0139322*i+.0971045*r+.7141733*a)/_)),new F(116*s-16,500*(e-s),200*(s-n),t.opacity)}function D(t,e,n,i){return 1===arguments.length?B(t):new F(t,e,n,null==i?1:i)}function F(t,e,n,i){this.l=+t,this.a=+e,this.b=+n,this.opacity=+i}function G(t){return t>A?Math.pow(t,1/3):t/L+z}function J(t){return t>C?t*t*t:L*(t-z)}function K(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function Q(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function T(t){if(t instanceof V)return new V(t.h,t.c,t.l,t.opacity);if(t instanceof F||(t=B(t)),0===t.a&&0===t.b)return new V(NaN,0> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; +} + +function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); +} + +function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); +} + +export function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} + +export function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} + +export function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} + +define(Rgb, rgb, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function() { + return this; + }, + displayable: function() { + return (-0.5 <= this.r && this.r < 255.5) + && (-0.5 <= this.g && this.g < 255.5) + && (-0.5 <= this.b && this.b < 255.5) + && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); + +function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); +} + +function rgb_formatRgb() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); +} + +function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); +} + +function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); +} + +export function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} + +export function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} + +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Hsl, hsl, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl: function() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } +})); + +/* From FvD 13.37, CSS Color Module Level 3 */ +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; +} diff --git a/node_modules/d3-color/src/cubehelix.js b/node_modules/d3-color/src/cubehelix.js new file mode 100644 index 00000000..83536dd2 --- /dev/null +++ b/node_modules/d3-color/src/cubehelix.js @@ -0,0 +1,61 @@ +import define, {extend} from "./define.js"; +import {Color, rgbConvert, Rgb, darker, brighter} from "./color.js"; +import {degrees, radians} from "./math.js"; + +var A = -0.14861, + B = +1.78277, + C = -0.29227, + D = -0.90649, + E = +1.97294, + ED = E * D, + EB = E * B, + BC_DA = B * C - D * A; + +function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * degrees - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +} + +export default function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); +} + +export function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Cubehelix, cubehelix, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * radians, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } +})); diff --git a/node_modules/d3-color/src/define.js b/node_modules/d3-color/src/define.js new file mode 100644 index 00000000..2bba2d3a --- /dev/null +++ b/node_modules/d3-color/src/define.js @@ -0,0 +1,10 @@ +export default function(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; +} + +export function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; +} diff --git a/node_modules/d3-color/src/index.js b/node_modules/d3-color/src/index.js new file mode 100644 index 00000000..831cf529 --- /dev/null +++ b/node_modules/d3-color/src/index.js @@ -0,0 +1,3 @@ +export {default as color, rgb, hsl} from "./color.js"; +export {default as lab, hcl, lch, gray} from "./lab.js"; +export {default as cubehelix} from "./cubehelix.js"; diff --git a/node_modules/d3-color/src/lab.js b/node_modules/d3-color/src/lab.js new file mode 100644 index 00000000..645e1a50 --- /dev/null +++ b/node_modules/d3-color/src/lab.js @@ -0,0 +1,123 @@ +import define, {extend} from "./define.js"; +import {Color, rgbConvert, Rgb} from "./color.js"; +import {degrees, radians} from "./math.js"; + +// https://observablehq.com/@mbostock/lab-and-rgb +const K = 18, + Xn = 0.96422, + Yn = 1, + Zn = 0.82521, + t0 = 4 / 29, + t1 = 6 / 29, + t2 = 3 * t1 * t1, + t3 = t1 * t1 * t1; + +function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) return hcl2lab(o); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = rgb2lrgb(o.r), + g = rgb2lrgb(o.g), + b = rgb2lrgb(o.b), + y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) x = z = y; else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); +} + +export function gray(l, opacity) { + return new Lab(l, 0, 0, opacity == null ? 1 : opacity); +} + +export default function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); +} + +export function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; +} + +define(Lab, lab, extend(Color, { + brighter: function(k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function(k) { + return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function() { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), + lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } +})); + +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; +} + +function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); +} + +function lrgb2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} + +function rgb2lrgb(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} + +function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * degrees; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); +} + +export function lch(l, c, h, opacity) { + return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +export function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +export function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; +} + +function hcl2lab(o) { + if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * radians; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); +} + +define(Hcl, hcl, extend(Color, { + brighter: function(k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker: function(k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb: function() { + return hcl2lab(this).rgb(); + } +})); diff --git a/node_modules/d3-color/src/math.js b/node_modules/d3-color/src/math.js new file mode 100644 index 00000000..66b172e7 --- /dev/null +++ b/node_modules/d3-color/src/math.js @@ -0,0 +1,2 @@ +export const radians = Math.PI / 180; +export const degrees = 180 / Math.PI; diff --git a/node_modules/d3-contour/LICENSE b/node_modules/d3-contour/LICENSE new file mode 100644 index 00000000..b1c85d06 --- /dev/null +++ b/node_modules/d3-contour/LICENSE @@ -0,0 +1,27 @@ +Copyright 2012-2017 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-contour/README.md b/node_modules/d3-contour/README.md new file mode 100644 index 00000000..acd2a846 --- /dev/null +++ b/node_modules/d3-contour/README.md @@ -0,0 +1,171 @@ +# d3-contour + +This library computes contour polygons by applying [marching squares](https://en.wikipedia.org/wiki/Marching_squares) to a rectangular array of numeric values. For example, here is Maungawhau’s topology (the classic `volcano` dataset and `terrain.colors` from R): + +[Volcano Contours](https://observablehq.com/@d3/volcano-contours) + +For each [threshold value](#contours_thresholds), the [contour generator](#_contours) constructs a GeoJSON MultiPolygon geometry object representing the area where the input values are greater than or equal to the threshold value. The geometry is in planar coordinates, where ⟨i + 0.5, j + 0.5⟩ corresponds to element i + jn in the input values array. Here is an example that loads a GeoTIFF of surface temperatures, and another that blurs a noisy monochrome PNG to produce smooth contours of cloud fraction: + +[GeoTiff Contours](https://bl.ocks.org/mbostock/4886c227038510f1c103ce305bef6fcc) +[Cloud Contours](https://bl.ocks.org/mbostock/818053c76d79d4841790c332656bf9da) + +Since the contour polygons are GeoJSON, you can transform and display them using standard tools; see [d3.geoPath](https://github.com/d3/d3-geo/blob/master/README.md#geoPath), [d3.geoProject](https://github.com/d3/d3-geo-projection/blob/master/README.md#geoProject) and [d3.geoStitch](https://github.com/d3/d3-geo-projection/blob/master/README.md#geoStitch), for example. Here the above contours of surface temperature are displayed in the Natural Earth projection: + +[GeoTiff Contours II](https://bl.ocks.org/mbostock/83c0be21dba7602ee14982b020b12f51) + +Contour plots can also visualize continuous functions by sampling. Here is the Goldstein–Price function (a test function for global optimization) and a trippy animation of *sin*(*x* + *y*)*sin*(*x* - *y*): + +[Contours](https://observablehq.com/@d3/contours) +[Animated Contours](https://observablehq.com/@d3/animated-contours) + +Contours can also show the [estimated density](#density-estimation) of point clouds, which is especially useful to avoid overplotting in large datasets. This library implements fast two-dimensional kernel density estimation; see [d3.contourDensity](#contourDensity). Here is a scatterplot showing the relationship between the idle duration and eruption duration for Old Faithful: + +[Density Contours](https://bl.ocks.org/mbostock/e3f4376d54e02d5d43ae32a7cf0e6aa9) + +And here is a density contour plot showing the relationship between the weight and price of 53,940 diamonds: + +[Density Contours](https://observablehq.com/@d3/density-contours) + +## Installing + +If you use NPM, `npm install d3-contour`. Otherwise, download the [latest release](https://github.com/d3/d3-contour/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-contour.v1.min.js) or as part of [D3 4.0](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + +``` + +## API Reference + +# d3.contours() [<>](https://github.com/d3/d3-contour/blob/master/src/contours.js "Source") + +Constructs a new contour generator with the default settings. + +# contours(values) [<>](https://github.com/d3/d3-contour/blob/master/src/contours.js "Source") + +Computes the contours for the given array of *values*, returning an array of [GeoJSON](http://geojson.org/geojson-spec.html) [MultiPolygon](http://geojson.org/geojson-spec.html#multipolygon) [geometry objects](http://geojson.org/geojson-spec.html#geometry-objects). Each geometry object represents the area where the input values are greater than or equal to the corresponding [threshold value](#contours_thresholds); the threshold value for each geometry object is exposed as geometry.value. + +The input *values* must be an array of length n×m where [n, m] is the contour generator’s [size](#contours_size); furthermore, each values[i + jn] must represent the value at the position ⟨i, j⟩. For example, to construct a 256×256 grid for the [Goldstein–Price function](https://en.wikipedia.org/wiki/Test_functions_for_optimization) where -2 ≤ x ≤ 2 and -2 ≤ y ≤ 1: + +```js +var n = 256, m = 256, values = new Array(n * m); +for (var j = 0.5, k = 0; j < m; ++j) { + for (var i = 0.5; i < n; ++i, ++k) { + values[k] = goldsteinPrice(i / n * 4 - 2, 1 - j / m * 3); + } +} + +function goldsteinPrice(x, y) { + return (1 + Math.pow(x + y + 1, 2) * (19 - 14 * x + 3 * x * x - 14 * y + 6 * x * x + 3 * y * y)) + * (30 + Math.pow(2 * x - 3 * y, 2) * (18 - 32 * x + 12 * x * x + 48 * y - 36 * x * y + 27 * y * y)); +} +``` + +The returned geometry objects are typically passed to [d3.geoPath](https://github.com/d3/d3-geo/blob/master/README.md#geoPath) to display, using null or [d3.geoIdentity](https://github.com/d3/d3-geo/blob/master/README.md#geoIdentity) as the associated projection. + +# contours.contour(values, threshold) [<>](https://github.com/d3/d3-contour/blob/master/src/contours.js "Source") + +Computes a single contour, returning a [GeoJSON](http://geojson.org/geojson-spec.html) [MultiPolygon](http://geojson.org/geojson-spec.html#multipolygon) [geometry object](http://geojson.org/geojson-spec.html#geometry-objects) representing the area where the input values are greater than or equal to the given [*threshold* value](#contours_thresholds); the threshold value for each geometry object is exposed as geometry.value. + +The input *values* must be an array of length n×m where [n, m] is the contour generator’s [size](#contours_size); furthermore, each values[i + jn] must represent the value at the position ⟨i, j⟩. See [*contours*](#_contours) for an example. + +# contours.size([size]) [<>](https://github.com/d3/d3-contour/blob/master/src/contours.js "Source") + +If *size* is specified, sets the expected size of the input *values* grid to the [contour generator](#_contour) and returns the contour generator. The *size* is specified as an array \[n, m\] where n is the number of columns in the grid and m is the number of rows; *n* and *m* must be positive integers. If *size* is not specified, returns the current size which defaults to [1, 1]. + +# contours.smooth([smooth]) [<>](https://github.com/d3/d3-contour/blob/master/src/contours.js "Source") + +If *smooth* is specified, sets whether or not the generated contour polygons are smoothed using linear interpolation. If *smooth* is not specified, returns the current smoothing flag, which defaults to true. + +# contours.thresholds([thresholds]) [<>](https://github.com/d3/d3-contour/blob/master/src/contours.js "Source") + +If *thresholds* is specified, sets the threshold generator to the specified function or array and returns this contour generator. If *thresholds* is not specified, returns the current threshold generator, which by default implements [Sturges’ formula](https://github.com/d3/d3-array/blob/master/README.md#thresholdSturges). + +Thresholds are defined as an array of values [*x0*, *x1*, …]. The first [generated contour](#_contour) corresponds to the area where the input values are greater than or equal to *x0*; the second contour corresponds to the area where the input values are greater than or equal to *x1*, and so on. Thus, there is exactly one generated MultiPolygon geometry object for each specified threshold value; the threshold value is exposed as geometry.value. + +If a *count* is specified instead of an array of *thresholds*, then the input values’ [extent](https://github.com/d3/d3-array/blob/master/README.md#extent) will be uniformly divided into approximately *count* bins; see [d3.ticks](https://github.com/d3/d3-array/blob/master/README.md#ticks). + +## Density Estimation + +# d3.contourDensity() [<>](https://github.com/d3/d3-contour/blob/master/src/density.js "Source") + +Constructs a new density estimator with the default settings. + +# density(data) [<>](https://github.com/d3/d3-contour/blob/master/src/density.js "Source") + +Estimates the density contours for the given array of *data*, returning an array of [GeoJSON](http://geojson.org/geojson-spec.html) [MultiPolygon](http://geojson.org/geojson-spec.html#multipolygon) [geometry objects](http://geojson.org/geojson-spec.html#geometry-objects). Each geometry object represents the area where the estimated number of points per square pixel is greater than or equal to the corresponding [threshold value](#density_thresholds); the threshold value for each geometry object is exposed as geometry.value. The returned geometry objects are typically passed to [d3.geoPath](https://github.com/d3/d3-geo/blob/master/README.md#geoPath) to display, using null or [d3.geoIdentity](https://github.com/d3/d3-geo/blob/master/README.md#geoIdentity) as the associated projection. See also [d3.contours](#contours). + +The *x*- and *y*-coordinate for each data point are computed using [*density*.x](#density_x) and [*density*.y](#density_y). In addition, [*density*.weight](#density_weight) indicates the relative contribution of each data point (default 1). The generated contours are only accurate within the estimator’s [defined size](#density_size). + +# density.x([x]) [<>](https://github.com/d3/d3-contour/blob/master/src/density.js "Source") + +If *x* is specified, sets the *x*-coordinate accessor. If *x* is not specified, returns the current *x*-coordinate accessor, which defaults to: + +```js +function x(d) { + return d[0]; +} +``` + +# density.y([y]) [<>](https://github.com/d3/d3-contour/blob/master/src/density.js "Source") + +If *y* is specified, sets the *y*-coordinate accessor. If *y* is not specified, returns the current *y*-coordinate accessor, which defaults to: + +```js +function y(d) { + return d[1]; +} +``` + +# density.weight([weight]) [<>](https://github.com/d3/d3-contour/blob/master/src/density.js "Source") + +If *weight* is specified, sets the accessor for point weights. If *weight* is not specified, returns the current point weight accessor, which defaults to: + +```js +function weight() { + return 1; +} +``` + +# density.size([size]) [<>](https://github.com/d3/d3-contour/blob/master/src/density.js "Source") + +If *size* is specified, sets the size of the density estimator to the specified bounds and returns the estimator. The *size* is specified as an array \[width, height\], where width is the maximum *x*-value and height is the maximum *y*-value. If *size* is not specified, returns the current size which defaults to [960, 500]. The [estimated density contours](#_density) are only accurate within the defined size. + +# density.cellSize([cellSize]) [<>](https://github.com/d3/d3-contour/blob/master/src/density.js "Source") + +If *cellSize* is specified, sets the size of individual cells in the underlying bin grid to the specified positive integer and returns the estimator. If *cellSize* is not specified, returns the current cell size, which defaults to 4. The cell size is rounded down to the nearest power of two. Smaller cells produce more detailed contour polygons, but are more expensive to compute. + +# density.thresholds([thresholds]) [<>](https://github.com/d3/d3-contour/blob/master/src/density.js "Source") + +If *thresholds* is specified, sets the threshold generator to the specified function or array and returns this contour generator. If *thresholds* is not specified, returns the current threshold generator, which by default generates about twenty nicely-rounded density thresholds. + +Thresholds are defined as an array of values [*x0*, *x1*, …]. The first [generated density contour](#_density) corresponds to the area where the estimated density is greater than or equal to *x0*; the second contour corresponds to the area where the estimated density is greater than or equal to *x1*, and so on. Thus, there is exactly one generated MultiPolygon geometry object for each specified threshold value; the threshold value is exposed as geometry.value. The first value *x0* should typically be greater than zero. + +If a *count* is specified instead of an array of *thresholds*, then approximately *count* uniformly-spaced nicely-rounded thresholds will be generated; see [d3.ticks](https://github.com/d3/d3-array/blob/master/README.md#ticks). + +# density.bandwidth([bandwidth]) [<>](https://github.com/d3/d3-contour/blob/master/src/density.js "Source") + +If *bandwidth* is specified, sets the bandwidth (the standard deviation) of the Gaussian kernel and returns the estimate. If *bandwidth* is not specified, returns the current bandwidth, which defaults to 20.4939…. The specified *bandwidth* is currently rounded to the nearest supported value by this implementation, and must be nonnegative. diff --git a/node_modules/d3-contour/dist/d3-contour.js b/node_modules/d3-contour/dist/d3-contour.js new file mode 100644 index 00000000..0903808e --- /dev/null +++ b/node_modules/d3-contour/dist/d3-contour.js @@ -0,0 +1,427 @@ +// https://d3js.org/d3-contour/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-array'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); +}(this, function (exports, d3Array) { 'use strict'; + +var array = Array.prototype; + +var slice = array.slice; + +function ascending(a, b) { + return a - b; +} + +function area(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; +} + +var constant = x => () => x; + +function contains(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) if (c = ringContains(ring, hole[i])) return c; + return 0; +} + +function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; + } + return contains; +} + +function segmentContains(a, b, c) { + var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); +} + +function collinear(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); +} + +function within(p, q, r) { + return p <= q && q <= r || r <= q && q <= p; +} + +function noop() {} + +var cases = [ + [], + [[[1.0, 1.5], [0.5, 1.0]]], + [[[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [0.5, 1.0]]], + [[[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 0.5], [1.0, 1.5]]], + [[[1.0, 0.5], [0.5, 1.0]]], + [[[0.5, 1.0], [1.0, 0.5]]], + [[[1.0, 1.5], [1.0, 0.5]]], + [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [1.0, 0.5]]], + [[[0.5, 1.0], [1.5, 1.0]]], + [[[1.0, 1.5], [1.5, 1.0]]], + [[[0.5, 1.0], [1.0, 1.5]]], + [] +]; + +function contours() { + var dx = 1, + dy = 1, + threshold = d3Array.thresholdSturges, + smooth = smoothLinear; + + function contours(values) { + var tz = threshold(values); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var domain = d3Array.extent(values), start = domain[0], stop = domain[1]; + tz = d3Array.tickStep(start, stop, tz); + tz = d3Array.range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + } else { + tz = tz.slice().sort(ascending); + } + + return tz.map(function(value) { + return contour(values, value); + }); + } + + // Accumulate, smooth contour rings, assign holes to exterior rings. + // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js + function contour(values, value) { + var polygons = [], + holes = []; + + isorings(values, value, function(ring) { + smooth(ring, values, value); + if (area(ring) > 0) polygons.push([ring]); + else holes.push(ring); + }); + + holes.forEach(function(hole) { + for (var i = 0, n = polygons.length, polygon; i < n; ++i) { + if (contains((polygon = polygons[i])[0], hole) !== -1) { + polygon.push(hole); + return; + } + } + }); + + return { + type: "MultiPolygon", + value: value, + coordinates: polygons + }; + } + + // Marching squares with isolines stitched into rings. + // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js + function isorings(values, value, callback) { + var fragmentByStart = new Array, + fragmentByEnd = new Array, + x, y, t0, t1, t2, t3; + + // Special case for the first row (y = -1, t2 = t3 = 0). + x = y = -1; + t1 = values[0] >= value; + cases[t1 << 1].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[x + 1] >= value; + cases[t0 | t1 << 1].forEach(stitch); + } + cases[t1 << 0].forEach(stitch); + + // General case for the intermediate rows. + while (++y < dy - 1) { + x = -1; + t1 = values[y * dx + dx] >= value; + t2 = values[y * dx] >= value; + cases[t1 << 1 | t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t1 | t2 << 3].forEach(stitch); + } + + // Special case for the last row (y = dy - 1, t0 = t1 = 0). + x = -1; + t2 = values[y * dx] >= value; + cases[t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t2 << 3].forEach(stitch); + + function stitch(line) { + var start = [line[0][0] + x, line[0][1] + y], + end = [line[1][0] + x, line[1][1] + y], + startIndex = index(start), + endIndex = index(end), + f, g; + if (f = fragmentByEnd[startIndex]) { + if (g = fragmentByStart[endIndex]) { + delete fragmentByEnd[f.end]; + delete fragmentByStart[g.start]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)}; + } + } else { + delete fragmentByEnd[f.end]; + f.ring.push(end); + fragmentByEnd[f.end = endIndex] = f; + } + } else if (f = fragmentByStart[endIndex]) { + if (g = fragmentByEnd[startIndex]) { + delete fragmentByStart[f.start]; + delete fragmentByEnd[g.end]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)}; + } + } else { + delete fragmentByStart[f.start]; + f.ring.unshift(start); + fragmentByStart[f.start = startIndex] = f; + } + } else { + fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]}; + } + } + } + + function index(point) { + return point[0] * 2 + point[1] * (dx + 1) * 4; + } + + function smoothLinear(ring, values, value) { + ring.forEach(function(point) { + var x = point[0], + y = point[1], + xt = x | 0, + yt = y | 0, + v0, + v1 = values[yt * dx + xt]; + if (x > 0 && x < dx && xt === x) { + v0 = values[yt * dx + xt - 1]; + point[0] = x + (value - v0) / (v1 - v0) - 0.5; + } + if (y > 0 && y < dy && yt === y) { + v0 = values[(yt - 1) * dx + xt]; + point[1] = y + (value - v0) / (v1 - v0) - 0.5; + } + }); + } + + contours.contour = contour; + + contours.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]); + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, contours; + }; + + contours.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), contours) : threshold; + }; + + contours.smooth = function(_) { + return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear; + }; + + return contours; +} + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurX(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var j = 0; j < m; ++j) { + for (var i = 0, sr = 0; i < n + r; ++i) { + if (i < n) { + sr += source.data[i + j * n]; + } + if (i >= r) { + if (i >= w) { + sr -= source.data[i - w + j * n]; + } + target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); + } + } + } +} + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurY(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var i = 0; i < n; ++i) { + for (var j = 0, sr = 0; j < m + r; ++j) { + if (j < m) { + sr += source.data[i + j * n]; + } + if (j >= r) { + if (j >= w) { + sr -= source.data[i + (j - w) * n]; + } + target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); + } + } + } +} + +function defaultX(d) { + return d[0]; +} + +function defaultY(d) { + return d[1]; +} + +function defaultWeight() { + return 1; +} + +function density() { + var x = defaultX, + y = defaultY, + weight = defaultWeight, + dx = 960, + dy = 500, + r = 20, // blur radius + k = 2, // log2(grid cell size) + o = r * 3, // grid offset, to pad for blur + n = (dx + o * 2) >> k, // grid width + m = (dy + o * 2) >> k, // grid height + threshold = constant(20); + + function density(data) { + var values0 = new Float32Array(n * m), + values1 = new Float32Array(n * m); + + data.forEach(function(d, i, data) { + var xi = (+x(d, i, data) + o) >> k, + yi = (+y(d, i, data) + o) >> k, + wi = +weight(d, i, data); + if (xi >= 0 && xi < n && yi >= 0 && yi < m) { + values0[xi + yi * n] += wi; + } + }); + + // TODO Optimize. + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + + var tz = threshold(values0); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var stop = d3Array.max(values0); + tz = d3Array.tickStep(0, stop, tz); + tz = d3Array.range(0, Math.floor(stop / tz) * tz, tz); + tz.shift(); + } + + return contours() + .thresholds(tz) + .size([n, m]) + (values0) + .map(transform); + } + + function transform(geometry) { + geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. + geometry.coordinates.forEach(transformPolygon); + return geometry; + } + + function transformPolygon(coordinates) { + coordinates.forEach(transformRing); + } + + function transformRing(coordinates) { + coordinates.forEach(transformPoint); + } + + // TODO Optimize. + function transformPoint(coordinates) { + coordinates[0] = coordinates[0] * Math.pow(2, k) - o; + coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + } + + function resize() { + o = r * 3; + n = (dx + o * 2) >> k; + m = (dy + o * 2) >> k; + return density; + } + + density.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), density) : x; + }; + + density.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), density) : y; + }; + + density.weight = function(_) { + return arguments.length ? (weight = typeof _ === "function" ? _ : constant(+_), density) : weight; + }; + + density.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = +_[0], _1 = +_[1]; + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, resize(); + }; + + density.cellSize = function(_) { + if (!arguments.length) return 1 << k; + if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); + return k = Math.floor(Math.log(_) / Math.LN2), resize(); + }; + + density.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold; + }; + + density.bandwidth = function(_) { + if (!arguments.length) return Math.sqrt(r * (r + 1)); + if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); + return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + }; + + return density; +} + +exports.contourDensity = density; +exports.contours = contours; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-contour/dist/d3-contour.min.js b/node_modules/d3-contour/dist/d3-contour.min.js new file mode 100644 index 00000000..53abde59 --- /dev/null +++ b/node_modules/d3-contour/dist/d3-contour.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-contour/ v2.0.0 Copyright 2020 Mike Bostock +!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("d3-array")):"function"==typeof define&&define.amd?define(["exports","d3-array"],r):r((t=t||self).d3=t.d3||{},t.d3)}(this,function(t,r){"use strict";var n=Array.prototype.slice;function e(t,r){return t-r}var i=t=>()=>t;function a(t,r){for(var n,e=-1,i=r.length;++ee!=g>e&&n<(s-c)*(e-d)/(g-d)+c&&(i=-i)}return i}function h(t,r,n){var e,i,a,o;return function(t,r,n){return(r[0]-t[0])*(n[1]-t[1])==(n[0]-t[0])*(r[1]-t[1])}(t,r,n)&&(i=t[e=+(t[0]===r[0])],a=n[e],o=r[e],i<=a&&a<=o||o<=a&&a<=i)}function f(){}var u=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]];function c(){var t=1,o=1,h=r.thresholdSturges,c=g;function d(t){var n=h(t);if(Array.isArray(n))n=n.slice().sort(e);else{var i=r.extent(t),a=i[0],o=i[1];n=r.tickStep(a,o,n),n=r.range(Math.floor(a/n)*n,Math.floor(o/n)*n,n)}return n.map(function(r){return l(t,r)})}function l(r,n){var e=[],i=[];return function(r,n,e){var i,a,h,f,c,d,l=new Array,g=new Array;i=a=-1,f=r[0]>=n,u[f<<1].forEach(v);for(;++i=n,u[h|f<<1].forEach(v);u[f<<0].forEach(v);for(;++a=n,c=r[a*t]>=n,u[f<<1|c<<2].forEach(v);++i=n,d=c,c=r[a*t+i+1]>=n,u[h|f<<1|c<<2|d<<3].forEach(v);u[f|c<<3].forEach(v)}i=-1,c=r[a*t]>=n,u[c<<2].forEach(v);for(;++i=n,u[c<<2|d<<3].forEach(v);function v(t){var r,n,o=[t[0][0]+i,t[0][1]+a],h=[t[1][0]+i,t[1][1]+a],f=s(o),u=s(h);(r=g[f])?(n=l[u])?(delete g[r.end],delete l[n.start],r===n?(r.ring.push(h),e(r.ring)):l[r.start]=g[n.end]={start:r.start,end:n.end,ring:r.ring.concat(n.ring)}):(delete g[r.end],r.ring.push(h),g[r.end=u]=r):(r=l[u])?(n=g[f])?(delete l[r.start],delete g[n.end],r===n?(r.ring.push(h),e(r.ring)):l[n.start]=g[r.end]={start:n.start,end:r.end,ring:n.ring.concat(r.ring)}):(delete l[r.start],r.ring.unshift(o),l[r.start=f]=r):l[f]=g[u]={start:f,end:u,ring:[o,h]}}u[c<<3].forEach(v)}(r,n,function(t){c(t,r,n),function(t){for(var r=0,n=t.length,e=t[n-1][1]*t[0][0]-t[n-1][0]*t[0][1];++r0?e.push([t]):i.push(t)}),i.forEach(function(t){for(var r,n=0,i=e.length;n0&&a0&&h=0&&e>=0))throw new Error("invalid size");return t=n,o=e,d},d.thresholds=function(t){return arguments.length?(h="function"==typeof t?t:Array.isArray(t)?i(n.call(t)):i(t),d):h},d.smooth=function(t){return arguments.length?(c=t?g:f,d):c===g},d}function d(t,r,n){for(var e=t.width,i=t.height,a=1+(n<<1),o=0;o=n&&(h>=a&&(f-=t.data[h-a+o*e]),r.data[h-n+o*e]=f/Math.min(h+1,e-1+a-h,a))}function l(t,r,n){for(var e=t.width,i=t.height,a=1+(n<<1),o=0;o=n&&(h>=a&&(f-=t.data[o+(h-a)*e]),r.data[o+(h-n)*e]=f/Math.min(h+1,i-1+a-h,a))}function s(t){return t[0]}function g(t){return t[1]}function v(){return 1}t.contourDensity=function(){var t=s,e=g,a=v,o=960,h=500,f=20,u=2,w=3*f,y=o+2*w>>u,p=h+2*w>>u,E=i(20);function M(n){var i=new Float32Array(y*p),o=new Float32Array(y*p);n.forEach(function(r,n,o){var h=+t(r,n,o)+w>>u,f=+e(r,n,o)+w>>u,c=+a(r,n,o);h>=0&&h=0&&f>u),l({width:y,height:p,data:o},{width:y,height:p,data:i},f>>u),d({width:y,height:p,data:i},{width:y,height:p,data:o},f>>u),l({width:y,height:p,data:o},{width:y,height:p,data:i},f>>u),d({width:y,height:p,data:i},{width:y,height:p,data:o},f>>u),l({width:y,height:p,data:o},{width:y,height:p,data:i},f>>u);var h=E(i);if(!Array.isArray(h)){var s=r.max(i);h=r.tickStep(0,s,h),(h=r.range(0,Math.floor(s/h)*h,h)).shift()}return c().thresholds(h).size([y,p])(i).map(A)}function A(t){return t.value*=Math.pow(2,-2*u),t.coordinates.forEach(m),t}function m(t){t.forEach(z)}function z(t){t.forEach(x)}function x(t){t[0]=t[0]*Math.pow(2,u)-w,t[1]=t[1]*Math.pow(2,u)-w}function b(){return y=o+2*(w=3*f)>>u,p=h+2*w>>u,M}return M.x=function(r){return arguments.length?(t="function"==typeof r?r:i(+r),M):t},M.y=function(t){return arguments.length?(e="function"==typeof t?t:i(+t),M):e},M.weight=function(t){return arguments.length?(a="function"==typeof t?t:i(+t),M):a},M.size=function(t){if(!arguments.length)return[o,h];var r=+t[0],n=+t[1];if(!(r>=0&&n>=0))throw new Error("invalid size");return o=r,h=n,b()},M.cellSize=function(t){if(!arguments.length)return 1<=1))throw new Error("invalid cell size");return u=Math.floor(Math.log(t)/Math.LN2),b()},M.thresholds=function(t){return arguments.length?(E="function"==typeof t?t:Array.isArray(t)?i(n.call(t)):i(t),M):E},M.bandwidth=function(t){if(!arguments.length)return Math.sqrt(f*(f+1));if(!((t=+t)>=0))throw new Error("invalid bandwidth");return f=Math.round((Math.sqrt(4*t*t+1)-1)/2),b()},M},t.contours=c,Object.defineProperty(t,"__esModule",{value:!0})}); diff --git a/node_modules/d3-contour/package.json b/node_modules/d3-contour/package.json new file mode 100644 index 00000000..e13df82e --- /dev/null +++ b/node_modules/d3-contour/package.json @@ -0,0 +1,73 @@ +{ + "_from": "d3-contour@2", + "_id": "d3-contour@2.0.0", + "_inBundle": false, + "_integrity": "sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==", + "_location": "/d3-contour", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-contour@2", + "name": "d3-contour", + "escapedName": "d3-contour", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3" + ], + "_resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-2.0.0.tgz", + "_shasum": "80ee834988563e3bea9d99ddde72c0f8c089ea40", + "_spec": "d3-contour@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-contour/issues" + }, + "bundleDependencies": false, + "dependencies": { + "d3-array": "2" + }, + "deprecated": false, + "description": "Compute contour polygons using marching squares.", + "devDependencies": { + "eslint": "6", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-contour/", + "jsdelivr": "dist/d3-contour.min.js", + "keywords": [ + "d3", + "d3-module", + "contour", + "isoline" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-contour.js", + "module": "src/index.js", + "name": "d3-contour", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-contour.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src" + }, + "sideEffects": false, + "unpkg": "dist/d3-contour.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-contour/src/area.js b/node_modules/d3-contour/src/area.js new file mode 100644 index 00000000..2157a7ef --- /dev/null +++ b/node_modules/d3-contour/src/area.js @@ -0,0 +1,5 @@ +export default function(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; +} diff --git a/node_modules/d3-contour/src/array.js b/node_modules/d3-contour/src/array.js new file mode 100644 index 00000000..d2361352 --- /dev/null +++ b/node_modules/d3-contour/src/array.js @@ -0,0 +1,3 @@ +var array = Array.prototype; + +export var slice = array.slice; diff --git a/node_modules/d3-contour/src/ascending.js b/node_modules/d3-contour/src/ascending.js new file mode 100644 index 00000000..8939af70 --- /dev/null +++ b/node_modules/d3-contour/src/ascending.js @@ -0,0 +1,3 @@ +export default function(a, b) { + return a - b; +} diff --git a/node_modules/d3-contour/src/blur.js b/node_modules/d3-contour/src/blur.js new file mode 100644 index 00000000..0edfb3ef --- /dev/null +++ b/node_modules/d3-contour/src/blur.js @@ -0,0 +1,43 @@ +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +export function blurX(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var j = 0; j < m; ++j) { + for (var i = 0, sr = 0; i < n + r; ++i) { + if (i < n) { + sr += source.data[i + j * n]; + } + if (i >= r) { + if (i >= w) { + sr -= source.data[i - w + j * n]; + } + target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); + } + } + } +} + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +export function blurY(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var i = 0; i < n; ++i) { + for (var j = 0, sr = 0; j < m + r; ++j) { + if (j < m) { + sr += source.data[i + j * n]; + } + if (j >= r) { + if (j >= w) { + sr -= source.data[i + (j - w) * n]; + } + target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); + } + } + } +} diff --git a/node_modules/d3-contour/src/constant.js b/node_modules/d3-contour/src/constant.js new file mode 100644 index 00000000..3487c0dd --- /dev/null +++ b/node_modules/d3-contour/src/constant.js @@ -0,0 +1 @@ +export default x => () => x; diff --git a/node_modules/d3-contour/src/contains.js b/node_modules/d3-contour/src/contains.js new file mode 100644 index 00000000..f364b354 --- /dev/null +++ b/node_modules/d3-contour/src/contains.js @@ -0,0 +1,27 @@ +export default function(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) if (c = ringContains(ring, hole[i])) return c; + return 0; +} + +function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; + } + return contains; +} + +function segmentContains(a, b, c) { + var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); +} + +function collinear(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); +} + +function within(p, q, r) { + return p <= q && q <= r || r <= q && q <= p; +} diff --git a/node_modules/d3-contour/src/contours.js b/node_modules/d3-contour/src/contours.js new file mode 100644 index 00000000..614e9ecf --- /dev/null +++ b/node_modules/d3-contour/src/contours.js @@ -0,0 +1,203 @@ +import {extent, thresholdSturges, tickStep, range} from "d3-array"; +import {slice} from "./array.js"; +import ascending from "./ascending.js"; +import area from "./area.js"; +import constant from "./constant.js"; +import contains from "./contains.js"; +import noop from "./noop.js"; + +var cases = [ + [], + [[[1.0, 1.5], [0.5, 1.0]]], + [[[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [0.5, 1.0]]], + [[[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 0.5], [1.0, 1.5]]], + [[[1.0, 0.5], [0.5, 1.0]]], + [[[0.5, 1.0], [1.0, 0.5]]], + [[[1.0, 1.5], [1.0, 0.5]]], + [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [1.0, 0.5]]], + [[[0.5, 1.0], [1.5, 1.0]]], + [[[1.0, 1.5], [1.5, 1.0]]], + [[[0.5, 1.0], [1.0, 1.5]]], + [] +]; + +export default function() { + var dx = 1, + dy = 1, + threshold = thresholdSturges, + smooth = smoothLinear; + + function contours(values) { + var tz = threshold(values); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var domain = extent(values), start = domain[0], stop = domain[1]; + tz = tickStep(start, stop, tz); + tz = range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + } else { + tz = tz.slice().sort(ascending); + } + + return tz.map(function(value) { + return contour(values, value); + }); + } + + // Accumulate, smooth contour rings, assign holes to exterior rings. + // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js + function contour(values, value) { + var polygons = [], + holes = []; + + isorings(values, value, function(ring) { + smooth(ring, values, value); + if (area(ring) > 0) polygons.push([ring]); + else holes.push(ring); + }); + + holes.forEach(function(hole) { + for (var i = 0, n = polygons.length, polygon; i < n; ++i) { + if (contains((polygon = polygons[i])[0], hole) !== -1) { + polygon.push(hole); + return; + } + } + }); + + return { + type: "MultiPolygon", + value: value, + coordinates: polygons + }; + } + + // Marching squares with isolines stitched into rings. + // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js + function isorings(values, value, callback) { + var fragmentByStart = new Array, + fragmentByEnd = new Array, + x, y, t0, t1, t2, t3; + + // Special case for the first row (y = -1, t2 = t3 = 0). + x = y = -1; + t1 = values[0] >= value; + cases[t1 << 1].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[x + 1] >= value; + cases[t0 | t1 << 1].forEach(stitch); + } + cases[t1 << 0].forEach(stitch); + + // General case for the intermediate rows. + while (++y < dy - 1) { + x = -1; + t1 = values[y * dx + dx] >= value; + t2 = values[y * dx] >= value; + cases[t1 << 1 | t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t1 | t2 << 3].forEach(stitch); + } + + // Special case for the last row (y = dy - 1, t0 = t1 = 0). + x = -1; + t2 = values[y * dx] >= value; + cases[t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t2 << 3].forEach(stitch); + + function stitch(line) { + var start = [line[0][0] + x, line[0][1] + y], + end = [line[1][0] + x, line[1][1] + y], + startIndex = index(start), + endIndex = index(end), + f, g; + if (f = fragmentByEnd[startIndex]) { + if (g = fragmentByStart[endIndex]) { + delete fragmentByEnd[f.end]; + delete fragmentByStart[g.start]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)}; + } + } else { + delete fragmentByEnd[f.end]; + f.ring.push(end); + fragmentByEnd[f.end = endIndex] = f; + } + } else if (f = fragmentByStart[endIndex]) { + if (g = fragmentByEnd[startIndex]) { + delete fragmentByStart[f.start]; + delete fragmentByEnd[g.end]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)}; + } + } else { + delete fragmentByStart[f.start]; + f.ring.unshift(start); + fragmentByStart[f.start = startIndex] = f; + } + } else { + fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]}; + } + } + } + + function index(point) { + return point[0] * 2 + point[1] * (dx + 1) * 4; + } + + function smoothLinear(ring, values, value) { + ring.forEach(function(point) { + var x = point[0], + y = point[1], + xt = x | 0, + yt = y | 0, + v0, + v1 = values[yt * dx + xt]; + if (x > 0 && x < dx && xt === x) { + v0 = values[yt * dx + xt - 1]; + point[0] = x + (value - v0) / (v1 - v0) - 0.5; + } + if (y > 0 && y < dy && yt === y) { + v0 = values[(yt - 1) * dx + xt]; + point[1] = y + (value - v0) / (v1 - v0) - 0.5; + } + }); + } + + contours.contour = contour; + + contours.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]); + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, contours; + }; + + contours.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), contours) : threshold; + }; + + contours.smooth = function(_) { + return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear; + }; + + return contours; +} diff --git a/node_modules/d3-contour/src/density.js b/node_modules/d3-contour/src/density.js new file mode 100644 index 00000000..a817f0a8 --- /dev/null +++ b/node_modules/d3-contour/src/density.js @@ -0,0 +1,133 @@ +import {max, range, tickStep} from "d3-array"; +import {slice} from "./array.js"; +import {blurX, blurY} from "./blur.js"; +import constant from "./constant.js"; +import contours from "./contours.js"; + +function defaultX(d) { + return d[0]; +} + +function defaultY(d) { + return d[1]; +} + +function defaultWeight() { + return 1; +} + +export default function() { + var x = defaultX, + y = defaultY, + weight = defaultWeight, + dx = 960, + dy = 500, + r = 20, // blur radius + k = 2, // log2(grid cell size) + o = r * 3, // grid offset, to pad for blur + n = (dx + o * 2) >> k, // grid width + m = (dy + o * 2) >> k, // grid height + threshold = constant(20); + + function density(data) { + var values0 = new Float32Array(n * m), + values1 = new Float32Array(n * m); + + data.forEach(function(d, i, data) { + var xi = (+x(d, i, data) + o) >> k, + yi = (+y(d, i, data) + o) >> k, + wi = +weight(d, i, data); + if (xi >= 0 && xi < n && yi >= 0 && yi < m) { + values0[xi + yi * n] += wi; + } + }); + + // TODO Optimize. + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + + var tz = threshold(values0); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var stop = max(values0); + tz = tickStep(0, stop, tz); + tz = range(0, Math.floor(stop / tz) * tz, tz); + tz.shift(); + } + + return contours() + .thresholds(tz) + .size([n, m]) + (values0) + .map(transform); + } + + function transform(geometry) { + geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. + geometry.coordinates.forEach(transformPolygon); + return geometry; + } + + function transformPolygon(coordinates) { + coordinates.forEach(transformRing); + } + + function transformRing(coordinates) { + coordinates.forEach(transformPoint); + } + + // TODO Optimize. + function transformPoint(coordinates) { + coordinates[0] = coordinates[0] * Math.pow(2, k) - o; + coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + } + + function resize() { + o = r * 3; + n = (dx + o * 2) >> k; + m = (dy + o * 2) >> k; + return density; + } + + density.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), density) : x; + }; + + density.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), density) : y; + }; + + density.weight = function(_) { + return arguments.length ? (weight = typeof _ === "function" ? _ : constant(+_), density) : weight; + }; + + density.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = +_[0], _1 = +_[1]; + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, resize(); + }; + + density.cellSize = function(_) { + if (!arguments.length) return 1 << k; + if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); + return k = Math.floor(Math.log(_) / Math.LN2), resize(); + }; + + density.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold; + }; + + density.bandwidth = function(_) { + if (!arguments.length) return Math.sqrt(r * (r + 1)); + if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); + return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + }; + + return density; +} diff --git a/node_modules/d3-contour/src/index.js b/node_modules/d3-contour/src/index.js new file mode 100644 index 00000000..8e6b5f0d --- /dev/null +++ b/node_modules/d3-contour/src/index.js @@ -0,0 +1,2 @@ +export {default as contours} from "./contours.js"; +export {default as contourDensity} from "./density.js"; diff --git a/node_modules/d3-contour/src/noop.js b/node_modules/d3-contour/src/noop.js new file mode 100644 index 00000000..6ab80bc8 --- /dev/null +++ b/node_modules/d3-contour/src/noop.js @@ -0,0 +1 @@ +export default function() {} diff --git a/node_modules/d3-delaunay/LICENSE b/node_modules/d3-delaunay/LICENSE new file mode 100644 index 00000000..cf16bc44 --- /dev/null +++ b/node_modules/d3-delaunay/LICENSE @@ -0,0 +1,13 @@ +Copyright 2018 Observable, Inc. + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/node_modules/d3-delaunay/README.md b/node_modules/d3-delaunay/README.md new file mode 100644 index 00000000..baf04812 --- /dev/null +++ b/node_modules/d3-delaunay/README.md @@ -0,0 +1,201 @@ +# d3-delaunay + +

+

Georgy “The Voronator†Voronoy + +This is a fast, no-dependency library for computing the [Voronoi diagram](https://en.wikipedia.org/wiki/Voronoi_diagram) of a set of two-dimensional points. It is based on [Delaunator](https://github.com/mapbox/delaunator), a fast library for computing the [Delaunay triangulation](https://en.wikipedia.org/wiki/Delaunay_triangulation) using [sweep algorithms](https://github.com/mapbox/delaunator/blob/master/README.md#papers). The Voronoi diagram is constructed by connecting the circumcenters of adjacent triangles in the Delaunay triangulation. + +For an interactive explanation of how this library works, see [The Delaunay’s Dual](https://observablehq.com/@mbostock/the-delaunays-dual). + +## Installing + +To install, `npm install d3-delaunay` or `yarn add d3-delaunay`. You can also download the [latest release](https://github.com/d3/d3-delaunay/releases/latest) or load directly from [unpkg](https://unpkg.com/d3-delaunay/). AMD, CommonJS and ES6+ environments are supported. In vanilla, a `d3` global is exported. + +```js +import {Delaunay} from "d3-delaunay"; + +const points = [[0, 0], [0, 1], [1, 0], [1, 1]]; +const delaunay = Delaunay.from(points); +const voronoi = delaunay.voronoi([0, 0, 960, 500]); +``` + +## API Reference + +### Delaunay + +# new Delaunay(points) [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +Returns the Delaunay triangulation for the given flat array [*x0*, *y0*, *x1*, *y1*, …] of *points*. + +```js +const delaunay = new Delaunay(Float64Array.of(0, 0, 0, 1, 1, 0, 1, 1)); +``` + +# Delaunay.from(points[, fx[, fy[, that]]]) [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +Returns the Delaunay triangulation for the given array or iterable of *points*. If *fx* and *fy* are not specified, then *points* is assumed to be an array of two-element arrays of numbers: [[*x0*, *y0*], [*x1*, *y1*], …]. Otherwise, *fx* and *fy* are functions that are invoked for each element in the *points* array in order, and must return the respective *x*- and *y*-coordinate for each point. If *that* is specified, the functions *fx* and *fy* are invoked with *that* as *this*. (See [Array.from](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/from) for reference.) + +```js +const delaunay = Delaunay.from([[0, 0], [0, 1], [1, 0], [1, 1]]); +``` + +# delaunay.points + +The coordinates of the points as an array [*x0*, *y0*, *x1*, *y1*, …]. Typically, this is a Float64Array, however you can use any array-like type in the [constructor](#new_Delaunay). + +# delaunay.halfedges + +The halfedge indexes as an Int32Array [*j0*, *j1*, …]. For each index 0 ≤ *i* < *halfedges*.length, there is a halfedge from triangle vertex *j* = *halfedges*[*i*] to triangle vertex *i*. Equivalently, this means that triangle ⌊*i* / 3⌋ is adjacent to triangle ⌊*j* / 3⌋. If *j* is negative, then triangle ⌊*i* / 3⌋ is an exterior triangle on the [convex hull](#delaunay_hull). For example, to render the internal edges of the Delaunay triangulation: + +```js +const {points, halfedges, triangles} = delaunay; +for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = triangles[i]; + const tj = triangles[j]; + context.moveTo(points[ti * 2], points[ti * 2 + 1]); + context.lineTo(points[tj * 2], points[tj * 2 + 1]); +} +``` + +See also [*delaunay*.render](#delaunay_render). + +# delaunay.hull + +An Int32Array of point indexes that form the convex hull in counterclockwise order. If the points are collinear, returns them ordered. + +See also [*delaunay*.renderHull](#delaunay_renderHull). + +# delaunay.triangles + +The triangle vertex indexes as an Uint32Array [*i0*, *j0*, *k0*, *i1*, *j1*, *k1*, …]. Each contiguous triplet of indexes *i*, *j*, *k* forms a counterclockwise triangle. The coordinates of the triangle’s points can be found by going through [*delaunay*.points](#delaunay_points). For example, to render triangle *i*: + +```js +const {points, triangles} = delaunay; +const t0 = triangles[i * 3 + 0]; +const t1 = triangles[i * 3 + 1]; +const t2 = triangles[i * 3 + 2]; +context.moveTo(points[t0 * 2], points[t0 * 2 + 1]); +context.lineTo(points[t1 * 2], points[t1 * 2 + 1]); +context.lineTo(points[t2 * 2], points[t2 * 2 + 1]); +context.closePath(); +``` + +See also [*delaunay*.renderTriangle](#delaunay_renderTriangle). + +# delaunay.inedges + +The incoming halfedge indexes as a Int32Array [*e0*, *e1*, *e2*, …]. For each point *i*, *inedges*[*i*] is the halfedge index *e* of an incoming halfedge. For coincident points, the halfedge index is -1; for points on the convex hull, the incoming halfedge is on the convex hull; for other points, the choice of incoming halfedge is arbitrary. The *inedges* table can be used to traverse the Delaunay triangulation; see also [*delaunay*.neighbors](#delaunay_neighbors). + +# delaunay.find(x, y[, i]) [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +Returns the index of the input point that is closest to the specified point ⟨*x*, *y*⟩. The search is started at the specified point *i*. If *i* is not specified, it defaults to zero. + +# delaunay.neighbors(i) [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +Returns an iterable over the indexes of the neighboring points to the specified point *i*. The iterable is empty if *i* is a coincident point. + +# delaunay.render([context]) [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +delaunay.render + +Renders the edges of the Delaunay triangulation to the specified *context*. The specified *context* must implement the *context*.moveTo and *context*.lineTo methods from the [CanvasPathMethods API](https://www.w3.org/TR/2dcontext/#canvaspathmethods). If a *context* is not specified, an SVG path string is returned instead. + +# delaunay.renderHull([context]) [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +delaunay.renderHull + +Renders the convex hull of the Delaunay triangulation to the specified *context*. The specified *context* must implement the *context*.moveTo and *context*.lineTo methods from the [CanvasPathMethods API](https://www.w3.org/TR/2dcontext/#canvaspathmethods). If a *context* is not specified, an SVG path string is returned instead. + +# delaunay.renderTriangle(i[, context]) [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +delaunay.renderTriangle + +Renders triangle *i* of the Delaunay triangulation to the specified *context*. The specified *context* must implement the *context*.moveTo, *context*.lineTo and *context*.closePath methods from the [CanvasPathMethods API](https://www.w3.org/TR/2dcontext/#canvaspathmethods). If a *context* is not specified, an SVG path string is returned instead. + +# delaunay.renderPoints(\[context\]\[, radius\]) [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +Renders the input points of the Delaunay triangulation to the specified *context* as circles with the specified *radius*. If *radius* is not specified, it defaults to 2. The specified *context* must implement the *context*.moveTo and *context*.arc methods from the [CanvasPathMethods API](https://www.w3.org/TR/2dcontext/#canvaspathmethods). If a *context* is not specified, an SVG path string is returned instead. + +# delaunay.hullPolygon() [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +Returns the closed polygon [[*x0*, *y0*], [*x1*, *y1*], …, [*x0*, *y0*]] representing the convex hull. + +# delaunay.trianglePolygons() [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +Returns an iterable over the [polygons for each triangle](#delaunay_trianglePolygon), in order. + +# delaunay.trianglePolygon(i) [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +Returns the closed polygon [[*x0*, *y0*], [*x1*, *y1*], [*x2*, *y2*], [*x0*, *y0*]] representing the triangle *i*. + +# delaunay.update() [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +Updates the triangulation after the points have been modified in-place. + +# delaunay.voronoi([bounds]) [<>](https://github.com/d3/d3-delaunay/blob/master/src/delaunay.js "Source") + +Returns the [Voronoi diagram](#voronoi) for the associated [points](#delaunay_points). When rendering, the diagram will be clipped to the specified *bounds* = [*xmin*, *ymin*, *xmax*, *ymax*]. If *bounds* is not specified, it defaults to [0, 0, 960, 500]. See [To Infinity and Back Again](https://observablehq.com/@mbostock/to-infinity-and-back-again) for an interactive explanation of Voronoi cell clipping. + +The Voronoi diagram is returned even in degenerate cases where no triangulation exists — namely 0, 1 or 2 points, and collinear points. + +### Voronoi + +# voronoi.delaunay + +The Voronoi diagram’s associated [Delaunay triangulation](#delaunay). + +# voronoi.circumcenters + +The [circumcenters](http://mathworld.wolfram.com/Circumcenter.html) of the Delaunay triangles as a Float64Array [*cx0*, *cy0*, *cx1*, *cy1*, …]. Each contiguous pair of coordinates *cx*, *cy* is the circumcenter for the corresponding triangle. These circumcenters form the coordinates of the Voronoi cell polygons. + +# voronoi.vectors + +A Float64Array [*vx0*, *vy0*, *wx0*, *wy0*, …] where each non-zero quadruple describes an open (infinite) cell on the outer hull, giving the directions of two open half-lines. + +# voronoi.xmin
+# voronoi.ymin
+# voronoi.xmax
+# voronoi.ymax
+ +The bounds of the viewport [*xmin*, *ymin*, *xmax*, *ymax*] for rendering the Voronoi diagram. These values only affect the rendering methods ([*voronoi*.render](#voronoi_render), [*voronoi*.renderBounds](#voronoi_renderBounds), [*cell*.render](#cell_render)). + +# voronoi.contains(i, x, y) [<>](https://github.com/d3/d3-delaunay/blob/master/src/cell.js "Source") + +Returns true if the cell with the specified index *i* contains the specified point ⟨*x*, *y*⟩. (This method is not affected by the associated Voronoi diagram’s viewport [bounds](#voronoi_xmin).) + +# voronoi.neighbors(i) [<>](https://github.com/d3/d3-delaunay/blob/master/src/voronoi.js "Source") + +Returns an iterable over the indexes of the cells that share a common edge with the specified cell *i*. Voronoi neighbors are always neighbors on the Delaunay graph, but the converse is false when the common edge has been clipped out by the Voronoi diagram’s viewport. + +# voronoi.render([context]) [<>](https://github.com/d3/d3-delaunay/blob/master/src/voronoi.js "Source") + +voronoi.render + +Renders the mesh of Voronoi cells to the specified *context*. The specified *context* must implement the *context*.moveTo and *context*.lineTo methods from the [CanvasPathMethods API](https://www.w3.org/TR/2dcontext/#canvaspathmethods). If a *context* is not specified, an SVG path string is returned instead. + +# voronoi.renderBounds([context]) [<>](https://github.com/d3/d3-delaunay/blob/master/src/voronoi.js "Source") + +voronoi.renderBounds + +Renders the viewport extent to the specified *context*. The specified *context* must implement the *context*.rect method from the [CanvasPathMethods API](https://www.w3.org/TR/2dcontext/#canvaspathmethods). Equivalent to *context*.rect(*voronoi*.xmin, *voronoi*.ymin, *voronoi*.xmax - *voronoi*.xmin, *voronoi*.ymax - *voronoi*.ymin). If a *context* is not specified, an SVG path string is returned instead. + +# voronoi.renderCell(i[, context]) [<>](https://github.com/d3/d3-delaunay/blob/master/src/voronoi.js "Source") + +cell.render + +Renders the cell with the specified index *i* to the specified *context*. The specified *context* must implement the *context*.moveTo , *context*.lineTo and *context*.closePath methods from the [CanvasPathMethods API](https://www.w3.org/TR/2dcontext/#canvaspathmethods). If a *context* is not specified, an SVG path string is returned instead. + +# voronoi.cellPolygons() [<>](https://github.com/d3/d3-delaunay/blob/master/src/voronoi.js "Source") + +Returns an iterable over the non-empty [polygons for each cell](#voronoi_cellPolygon), with the cell index as property. + +# voronoi.cellPolygon(i) [<>](https://github.com/d3/d3-delaunay/blob/master/src/voronoi.js "Source") + +Returns the convex, closed polygon [[*x0*, *y0*], [*x1*, *y1*], …, [*x0*, *y0*]] representing the cell for the specified point *i*. + +# voronoi.update() [<>](https://github.com/d3/d3-delaunay/blob/master/src/voronoi.js "Source") + +Updates the Voronoi diagram and underlying triangulation after the points have been modified in-place — useful for Lloyd’s relaxation. + diff --git a/node_modules/d3-delaunay/dist/d3-delaunay.js b/node_modules/d3-delaunay/dist/d3-delaunay.js new file mode 100644 index 00000000..6ab61648 --- /dev/null +++ b/node_modules/d3-delaunay/dist/d3-delaunay.js @@ -0,0 +1,1123 @@ +// https://github.com/d3/d3-delaunay v5.3.0 Copyright 2020 Mike Bostock +// https://github.com/mapbox/delaunator v4.0.1. Copyright 2019 Mapbox, Inc. +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +const EPSILON = Math.pow(2, -52); +const EDGE_STACK = new Uint32Array(512); + +class Delaunator { + + static from(points, getX = defaultGetX, getY = defaultGetY) { + const n = points.length; + const coords = new Float64Array(n * 2); + + for (let i = 0; i < n; i++) { + const p = points[i]; + coords[2 * i] = getX(p); + coords[2 * i + 1] = getY(p); + } + + return new Delaunator(coords); + } + + constructor(coords) { + const n = coords.length >> 1; + if (n > 0 && typeof coords[0] !== 'number') throw new Error('Expected coords to contain numbers.'); + + this.coords = coords; + + // arrays that will store the triangulation graph + const maxTriangles = Math.max(2 * n - 5, 0); + this._triangles = new Uint32Array(maxTriangles * 3); + this._halfedges = new Int32Array(maxTriangles * 3); + + // temporary arrays for tracking the edges of the advancing convex hull + this._hashSize = Math.ceil(Math.sqrt(n)); + this._hullPrev = new Uint32Array(n); // edge to prev edge + this._hullNext = new Uint32Array(n); // edge to next edge + this._hullTri = new Uint32Array(n); // edge to adjacent triangle + this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash + + // temporary arrays for sorting points + this._ids = new Uint32Array(n); + this._dists = new Float64Array(n); + + this.update(); + } + + update() { + const {coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash} = this; + const n = coords.length >> 1; + + // populate an array of point indices; calculate input data bbox + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + + for (let i = 0; i < n; i++) { + const x = coords[2 * i]; + const y = coords[2 * i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + this._ids[i] = i; + } + const cx = (minX + maxX) / 2; + const cy = (minY + maxY) / 2; + + let minDist = Infinity; + let i0, i1, i2; + + // pick a seed point close to the center + for (let i = 0; i < n; i++) { + const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]); + if (d < minDist) { + i0 = i; + minDist = d; + } + } + const i0x = coords[2 * i0]; + const i0y = coords[2 * i0 + 1]; + + minDist = Infinity; + + // find the point closest to the seed + for (let i = 0; i < n; i++) { + if (i === i0) continue; + const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]); + if (d < minDist && d > 0) { + i1 = i; + minDist = d; + } + } + let i1x = coords[2 * i1]; + let i1y = coords[2 * i1 + 1]; + + let minRadius = Infinity; + + // find the third point which forms the smallest circumcircle with the first two + for (let i = 0; i < n; i++) { + if (i === i0 || i === i1) continue; + const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]); + if (r < minRadius) { + i2 = i; + minRadius = r; + } + } + let i2x = coords[2 * i2]; + let i2y = coords[2 * i2 + 1]; + + if (minRadius === Infinity) { + // order collinear points by dx (or dy if all x are identical) + // and return the list as a hull + for (let i = 0; i < n; i++) { + this._dists[i] = (coords[2 * i] - coords[0]) || (coords[2 * i + 1] - coords[1]); + } + quicksort(this._ids, this._dists, 0, n - 1); + const hull = new Uint32Array(n); + let j = 0; + for (let i = 0, d0 = -Infinity; i < n; i++) { + const id = this._ids[i]; + if (this._dists[id] > d0) { + hull[j++] = id; + d0 = this._dists[id]; + } + } + this.hull = hull.subarray(0, j); + this.triangles = new Uint32Array(0); + this.halfedges = new Uint32Array(0); + return; + } + + // swap the order of the seed points for counter-clockwise orientation + if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) { + const i = i1; + const x = i1x; + const y = i1y; + i1 = i2; + i1x = i2x; + i1y = i2y; + i2 = i; + i2x = x; + i2y = y; + } + + const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y); + this._cx = center.x; + this._cy = center.y; + + for (let i = 0; i < n; i++) { + this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y); + } + + // sort the points by distance from the seed triangle circumcenter + quicksort(this._ids, this._dists, 0, n - 1); + + // set up the seed triangle as the starting hull + this._hullStart = i0; + let hullSize = 3; + + hullNext[i0] = hullPrev[i2] = i1; + hullNext[i1] = hullPrev[i0] = i2; + hullNext[i2] = hullPrev[i1] = i0; + + hullTri[i0] = 0; + hullTri[i1] = 1; + hullTri[i2] = 2; + + hullHash.fill(-1); + hullHash[this._hashKey(i0x, i0y)] = i0; + hullHash[this._hashKey(i1x, i1y)] = i1; + hullHash[this._hashKey(i2x, i2y)] = i2; + + this.trianglesLen = 0; + this._addTriangle(i0, i1, i2, -1, -1, -1); + + for (let k = 0, xp, yp; k < this._ids.length; k++) { + const i = this._ids[k]; + const x = coords[2 * i]; + const y = coords[2 * i + 1]; + + // skip near-duplicate points + if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue; + xp = x; + yp = y; + + // skip seed triangle points + if (i === i0 || i === i1 || i === i2) continue; + + // find a visible edge on the convex hull using edge hash + let start = 0; + for (let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++) { + start = hullHash[(key + j) % this._hashSize]; + if (start !== -1 && start !== hullNext[start]) break; + } + + start = hullPrev[start]; + let e = start, q; + while (q = hullNext[e], !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1])) { + e = q; + if (e === start) { + e = -1; + break; + } + } + if (e === -1) continue; // likely a near-duplicate point; skip it + + // add the first triangle from the point + let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]); + + // recursively flip triangles from the point until they satisfy the Delaunay condition + hullTri[i] = this._legalize(t + 2); + hullTri[e] = t; // keep track of boundary triangles on the hull + hullSize++; + + // walk forward through the hull, adding more triangles and flipping recursively + let n = hullNext[e]; + while (q = hullNext[n], orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1])) { + t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]); + hullTri[i] = this._legalize(t + 2); + hullNext[n] = n; // mark as removed + hullSize--; + n = q; + } + + // walk backward from the other side, adding more triangles and flipping + if (e === start) { + while (q = hullPrev[e], orient(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1])) { + t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]); + this._legalize(t + 2); + hullTri[q] = t; + hullNext[e] = e; // mark as removed + hullSize--; + e = q; + } + } + + // update the hull indices + this._hullStart = hullPrev[i] = e; + hullNext[e] = hullPrev[n] = i; + hullNext[i] = n; + + // save the two new edges in the hash table + hullHash[this._hashKey(x, y)] = i; + hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e; + } + + this.hull = new Uint32Array(hullSize); + for (let i = 0, e = this._hullStart; i < hullSize; i++) { + this.hull[i] = e; + e = hullNext[e]; + } + + // trim typed triangle mesh arrays + this.triangles = this._triangles.subarray(0, this.trianglesLen); + this.halfedges = this._halfedges.subarray(0, this.trianglesLen); + } + + _hashKey(x, y) { + return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize; + } + + _legalize(a) { + const {_triangles: triangles, _halfedges: halfedges, coords} = this; + + let i = 0; + let ar = 0; + + // recursion eliminated with a fixed-size stack + while (true) { + const b = halfedges[a]; + + /* if the pair of triangles doesn't satisfy the Delaunay condition + * (p1 is inside the circumcircle of [p0, pl, pr]), flip them, + * then do the same check/flip recursively for the new pair of triangles + * + * pl pl + * /||\ / \ + * al/ || \bl al/ \a + * / || \ / \ + * / a||b \ flip /___ar___\ + * p0\ || /p1 => p0\---bl---/p1 + * \ || / \ / + * ar\ || /br b\ /br + * \||/ \ / + * pr pr + */ + const a0 = a - a % 3; + ar = a0 + (a + 2) % 3; + + if (b === -1) { // convex hull edge + if (i === 0) break; + a = EDGE_STACK[--i]; + continue; + } + + const b0 = b - b % 3; + const al = a0 + (a + 1) % 3; + const bl = b0 + (b + 2) % 3; + + const p0 = triangles[ar]; + const pr = triangles[a]; + const pl = triangles[al]; + const p1 = triangles[bl]; + + const illegal = inCircle( + coords[2 * p0], coords[2 * p0 + 1], + coords[2 * pr], coords[2 * pr + 1], + coords[2 * pl], coords[2 * pl + 1], + coords[2 * p1], coords[2 * p1 + 1]); + + if (illegal) { + triangles[a] = p1; + triangles[b] = p0; + + const hbl = halfedges[bl]; + + // edge swapped on the other side of the hull (rare); fix the halfedge reference + if (hbl === -1) { + let e = this._hullStart; + do { + if (this._hullTri[e] === bl) { + this._hullTri[e] = a; + break; + } + e = this._hullPrev[e]; + } while (e !== this._hullStart); + } + this._link(a, hbl); + this._link(b, halfedges[ar]); + this._link(ar, bl); + + const br = b0 + (b + 1) % 3; + + // don't worry about hitting the cap: it can only happen on extremely degenerate input + if (i < EDGE_STACK.length) { + EDGE_STACK[i++] = br; + } + } else { + if (i === 0) break; + a = EDGE_STACK[--i]; + } + } + + return ar; + } + + _link(a, b) { + this._halfedges[a] = b; + if (b !== -1) this._halfedges[b] = a; + } + + // add a new triangle given vertex indices and adjacent half-edge ids + _addTriangle(i0, i1, i2, a, b, c) { + const t = this.trianglesLen; + + this._triangles[t] = i0; + this._triangles[t + 1] = i1; + this._triangles[t + 2] = i2; + + this._link(t, a); + this._link(t + 1, b); + this._link(t + 2, c); + + this.trianglesLen += 3; + + return t; + } +} + +// monotonically increases with real angle, but doesn't need expensive trigonometry +function pseudoAngle(dx, dy) { + const p = dx / (Math.abs(dx) + Math.abs(dy)); + return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1] +} + +function dist(ax, ay, bx, by) { + const dx = ax - bx; + const dy = ay - by; + return dx * dx + dy * dy; +} + +// return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check +function orientIfSure(px, py, rx, ry, qx, qy) { + const l = (ry - py) * (qx - px); + const r = (rx - px) * (qy - py); + return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0; +} + +// a more robust orientation test that's stable in a given triangle (to fix robustness issues) +function orient(rx, ry, qx, qy, px, py) { + const sign = orientIfSure(px, py, rx, ry, qx, qy) || + orientIfSure(rx, ry, qx, qy, px, py) || + orientIfSure(qx, qy, px, py, rx, ry); + return sign < 0; +} + +function inCircle(ax, ay, bx, by, cx, cy, px, py) { + const dx = ax - px; + const dy = ay - py; + const ex = bx - px; + const ey = by - py; + const fx = cx - px; + const fy = cy - py; + + const ap = dx * dx + dy * dy; + const bp = ex * ex + ey * ey; + const cp = fx * fx + fy * fy; + + return dx * (ey * cp - bp * fy) - + dy * (ex * cp - bp * fx) + + ap * (ex * fy - ey * fx) < 0; +} + +function circumradius(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; + + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); + + const x = (ey * bl - dy * cl) * d; + const y = (dx * cl - ex * bl) * d; + + return x * x + y * y; +} + +function circumcenter(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; + + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); + + const x = ax + (ey * bl - dy * cl) * d; + const y = ay + (dx * cl - ex * bl) * d; + + return {x, y}; +} + +function quicksort(ids, dists, left, right) { + if (right - left <= 20) { + for (let i = left + 1; i <= right; i++) { + const temp = ids[i]; + const tempDist = dists[temp]; + let j = i - 1; + while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--]; + ids[j + 1] = temp; + } + } else { + const median = (left + right) >> 1; + let i = left + 1; + let j = right; + swap(ids, median, i); + if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right); + if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right); + if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i); + + const temp = ids[i]; + const tempDist = dists[temp]; + while (true) { + do i++; while (dists[ids[i]] < tempDist); + do j--; while (dists[ids[j]] > tempDist); + if (j < i) break; + swap(ids, i, j); + } + ids[left + 1] = ids[j]; + ids[j] = temp; + + if (right - i + 1 >= j - left) { + quicksort(ids, dists, i, right); + quicksort(ids, dists, left, j - 1); + } else { + quicksort(ids, dists, left, j - 1); + quicksort(ids, dists, i, right); + } + } +} + +function swap(arr, i, j) { + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} + +function defaultGetX(p) { + return p[0]; +} +function defaultGetY(p) { + return p[1]; +} + +const epsilon = 1e-6; + +class Path { + constructor() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; + } + moveTo(x, y) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`; + } + closePath() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + } + lineTo(x, y) { + this._ += `L${this._x1 = +x},${this._y1 = +y}`; + } + arc(x, y, r) { + x = +x, y = +y, r = +r; + const x0 = x + r; + const y0 = y; + if (r < 0) throw new Error("negative radius"); + if (this._x1 === null) this._ += `M${x0},${y0}`; + else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) this._ += "L" + x0 + "," + y0; + if (!r) return; + this._ += `A${r},${r},0,1,1,${x - r},${y}A${r},${r},0,1,1,${this._x1 = x0},${this._y1 = y0}`; + } + rect(x, y, w, h) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${+w}v${+h}h${-w}Z`; + } + value() { + return this._ || null; + } +} + +class Polygon { + constructor() { + this._ = []; + } + moveTo(x, y) { + this._.push([x, y]); + } + closePath() { + this._.push(this._[0].slice()); + } + lineTo(x, y) { + this._.push([x, y]); + } + value() { + return this._.length ? this._ : null; + } +} + +class Voronoi { + constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) { + if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error("invalid bounds"); + this.delaunay = delaunay; + this._circumcenters = new Float64Array(delaunay.points.length * 2); + this.vectors = new Float64Array(delaunay.points.length * 2); + this.xmax = xmax, this.xmin = xmin; + this.ymax = ymax, this.ymin = ymin; + this._init(); + } + update() { + this.delaunay.update(); + this._init(); + return this; + } + _init() { + const {delaunay: {points, hull, triangles}, vectors} = this; + + // Compute circumcenters. + const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2); + for (let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2) { + const t1 = triangles[i] * 2; + const t2 = triangles[i + 1] * 2; + const t3 = triangles[i + 2] * 2; + const x1 = points[t1]; + const y1 = points[t1 + 1]; + const x2 = points[t2]; + const y2 = points[t2 + 1]; + const x3 = points[t3]; + const y3 = points[t3 + 1]; + + const dx = x2 - x1; + const dy = y2 - y1; + const ex = x3 - x1; + const ey = y3 - y1; + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const ab = (dx * ey - dy * ex) * 2; + + if (!ab) { + // degenerate case (collinear diagram) + x = (x1 + x3) / 2 - 1e8 * ey; + y = (y1 + y3) / 2 + 1e8 * ex; + } + else if (Math.abs(ab) < 1e-8) { + // almost equal points (degenerate triangle) + x = (x1 + x3) / 2; + y = (y1 + y3) / 2; + } else { + const d = 1 / ab; + x = x1 + (ey * bl - dy * cl) * d; + y = y1 + (dx * cl - ex * bl) * d; + } + circumcenters[j] = x; + circumcenters[j + 1] = y; + } + + // Compute exterior cell rays. + let h = hull[hull.length - 1]; + let p0, p1 = h * 4; + let x0, x1 = points[2 * h]; + let y0, y1 = points[2 * h + 1]; + vectors.fill(0); + for (let i = 0; i < hull.length; ++i) { + h = hull[i]; + p0 = p1, x0 = x1, y0 = y1; + p1 = h * 4, x1 = points[2 * h], y1 = points[2 * h + 1]; + vectors[p0 + 2] = vectors[p1] = y0 - y1; + vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0; + } + } + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {delaunay: {halfedges, inedges, hull}, circumcenters, vectors} = this; + if (hull.length <= 1) return null; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = Math.floor(i / 3) * 2; + const tj = Math.floor(j / 3) * 2; + const xi = circumcenters[ti]; + const yi = circumcenters[ti + 1]; + const xj = circumcenters[tj]; + const yj = circumcenters[tj + 1]; + this._renderSegment(xi, yi, xj, yj, context); + } + let h0, h1 = hull[hull.length - 1]; + for (let i = 0; i < hull.length; ++i) { + h0 = h1, h1 = hull[i]; + const t = Math.floor(inedges[h1] / 3) * 2; + const x = circumcenters[t]; + const y = circumcenters[t + 1]; + const v = h0 * 4; + const p = this._project(x, y, vectors[v + 2], vectors[v + 3]); + if (p) this._renderSegment(x, y, p[0], p[1], context); + } + return buffer && buffer.value(); + } + renderBounds(context) { + const buffer = context == null ? context = new Path : undefined; + context.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin); + return buffer && buffer.value(); + } + renderCell(i, context) { + const buffer = context == null ? context = new Path : undefined; + const points = this._clip(i); + if (points === null || !points.length) return; + context.moveTo(points[0], points[1]); + let n = points.length; + while (points[0] === points[n-2] && points[1] === points[n-1] && n > 1) n -= 2; + for (let i = 2; i < n; i += 2) { + if (points[i] !== points[i-2] || points[i+1] !== points[i-1]) + context.lineTo(points[i], points[i + 1]); + } + context.closePath(); + return buffer && buffer.value(); + } + *cellPolygons() { + const {delaunay: {points}} = this; + for (let i = 0, n = points.length / 2; i < n; ++i) { + const cell = this.cellPolygon(i); + if (cell) cell.index = i, yield cell; + } + } + cellPolygon(i) { + const polygon = new Polygon; + this.renderCell(i, polygon); + return polygon.value(); + } + _renderSegment(x0, y0, x1, y1, context) { + let S; + const c0 = this._regioncode(x0, y0); + const c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + context.moveTo(x0, y0); + context.lineTo(x1, y1); + } else if (S = this._clipSegment(x0, y0, x1, y1, c0, c1)) { + context.moveTo(S[0], S[1]); + context.lineTo(S[2], S[3]); + } + } + contains(i, x, y) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return false; + return this.delaunay._step(i, x, y) === i; + } + *neighbors(i) { + const ci = this._clip(i); + if (ci) for (const j of this.delaunay.neighbors(i)) { + const cj = this._clip(j); + // find the common edge + if (cj) loop: for (let ai = 0, li = ci.length; ai < li; ai += 2) { + for (let aj = 0, lj = cj.length; aj < lj; aj += 2) { + if (ci[ai] == cj[aj] + && ci[ai + 1] == cj[aj + 1] + && ci[(ai + 2) % li] == cj[(aj + lj - 2) % lj] + && ci[(ai + 3) % li] == cj[(aj + lj - 1) % lj] + ) { + yield j; + break loop; + } + } + } + } + } + _cell(i) { + const {circumcenters, delaunay: {inedges, halfedges, triangles}} = this; + const e0 = inedges[i]; + if (e0 === -1) return null; // coincident point + const points = []; + let e = e0; + do { + const t = Math.floor(e / 3); + points.push(circumcenters[t * 2], circumcenters[t * 2 + 1]); + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + } while (e !== e0 && e !== -1); + return points; + } + _clip(i) { + // degenerate case (1 valid point: return the box) + if (i === 0 && this.delaunay.hull.length === 1) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; + } + const points = this._cell(i); + if (points === null) return null; + const {vectors: V} = this; + const v = i * 4; + return V[v] || V[v + 1] + ? this._clipInfinite(i, points, V[v], V[v + 1], V[v + 2], V[v + 3]) + : this._clipFinite(i, points); + } + _clipFinite(i, points) { + const n = points.length; + let P = null; + let x0, y0, x1 = points[n - 2], y1 = points[n - 1]; + let c0, c1 = this._regioncode(x1, y1); + let e0, e1; + for (let j = 0; j < n; j += 2) { + x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1]; + c0 = c1, c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + e0 = e1, e1 = 0; + if (P) P.push(x1, y1); + else P = [x1, y1]; + } else { + let S, sx0, sy0, sx1, sy1; + if (c0 === 0) { + if ((S = this._clipSegment(x0, y0, x1, y1, c0, c1)) === null) continue; + [sx0, sy0, sx1, sy1] = S; + } else { + if ((S = this._clipSegment(x1, y1, x0, y0, c1, c0)) === null) continue; + [sx1, sy1, sx0, sy0] = S; + e0 = e1, e1 = this._edgecode(sx0, sy0); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx0, sy0); + else P = [sx0, sy0]; + } + e0 = e1, e1 = this._edgecode(sx1, sy1); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx1, sy1); + else P = [sx1, sy1]; + } + } + if (P) { + e0 = e1, e1 = this._edgecode(P[0], P[1]); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; + } + return P; + } + _clipSegment(x0, y0, x1, y1, c0, c1) { + while (true) { + if (c0 === 0 && c1 === 0) return [x0, y0, x1, y1]; + if (c0 & c1) return null; + let x, y, c = c0 || c1; + if (c & 0b1000) x = x0 + (x1 - x0) * (this.ymax - y0) / (y1 - y0), y = this.ymax; + else if (c & 0b0100) x = x0 + (x1 - x0) * (this.ymin - y0) / (y1 - y0), y = this.ymin; + else if (c & 0b0010) y = y0 + (y1 - y0) * (this.xmax - x0) / (x1 - x0), x = this.xmax; + else y = y0 + (y1 - y0) * (this.xmin - x0) / (x1 - x0), x = this.xmin; + if (c0) x0 = x, y0 = y, c0 = this._regioncode(x0, y0); + else x1 = x, y1 = y, c1 = this._regioncode(x1, y1); + } + } + _clipInfinite(i, points, vx0, vy0, vxn, vyn) { + let P = Array.from(points), p; + if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]); + if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]); + if (P = this._clipFinite(i, P)) { + for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) { + c0 = c1, c1 = this._edgecode(P[j], P[j + 1]); + if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length; + } + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax]; + } + return P; + } + _edge(i, e0, e1, P, j) { + while (e0 !== e1) { + let x, y; + switch (e0) { + case 0b0101: e0 = 0b0100; continue; // top-left + case 0b0100: e0 = 0b0110, x = this.xmax, y = this.ymin; break; // top + case 0b0110: e0 = 0b0010; continue; // top-right + case 0b0010: e0 = 0b1010, x = this.xmax, y = this.ymax; break; // right + case 0b1010: e0 = 0b1000; continue; // bottom-right + case 0b1000: e0 = 0b1001, x = this.xmin, y = this.ymax; break; // bottom + case 0b1001: e0 = 0b0001; continue; // bottom-left + case 0b0001: e0 = 0b0101, x = this.xmin, y = this.ymin; break; // left + } + if ((P[j] !== x || P[j + 1] !== y) && this.contains(i, x, y)) { + P.splice(j, 0, x, y), j += 2; + } + } + if (P.length > 4) { + for (let i = 0; i < P.length; i+= 2) { + const j = (i + 2) % P.length, k = (i + 4) % P.length; + if (P[i] === P[j] && P[j] === P[k] + || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) + P.splice(j, 2), i -= 2; + } + } + return j; + } + _project(x0, y0, vx, vy) { + let t = Infinity, c, x, y; + if (vy < 0) { // top + if (y0 <= this.ymin) return null; + if ((c = (this.ymin - y0) / vy) < t) y = this.ymin, x = x0 + (t = c) * vx; + } else if (vy > 0) { // bottom + if (y0 >= this.ymax) return null; + if ((c = (this.ymax - y0) / vy) < t) y = this.ymax, x = x0 + (t = c) * vx; + } + if (vx > 0) { // right + if (x0 >= this.xmax) return null; + if ((c = (this.xmax - x0) / vx) < t) x = this.xmax, y = y0 + (t = c) * vy; + } else if (vx < 0) { // left + if (x0 <= this.xmin) return null; + if ((c = (this.xmin - x0) / vx) < t) x = this.xmin, y = y0 + (t = c) * vy; + } + return [x, y]; + } + _edgecode(x, y) { + return (x === this.xmin ? 0b0001 + : x === this.xmax ? 0b0010 : 0b0000) + | (y === this.ymin ? 0b0100 + : y === this.ymax ? 0b1000 : 0b0000); + } + _regioncode(x, y) { + return (x < this.xmin ? 0b0001 + : x > this.xmax ? 0b0010 : 0b0000) + | (y < this.ymin ? 0b0100 + : y > this.ymax ? 0b1000 : 0b0000); + } +} + +const tau = 2 * Math.PI, pow = Math.pow; + +function pointX(p) { + return p[0]; +} + +function pointY(p) { + return p[1]; +} + +// A triangulation is collinear if all its triangles have a non-null area +function collinear(d) { + const {triangles, coords} = d; + for (let i = 0; i < triangles.length; i += 3) { + const a = 2 * triangles[i], + b = 2 * triangles[i + 1], + c = 2 * triangles[i + 2], + cross = (coords[c] - coords[a]) * (coords[b + 1] - coords[a + 1]) + - (coords[b] - coords[a]) * (coords[c + 1] - coords[a + 1]); + if (cross > 1e-10) return false; + } + return true; +} + +function jitter(x, y, r) { + return [x + Math.sin(x + y) * r, y + Math.cos(x - y) * r]; +} + +class Delaunay { + static from(points, fx = pointX, fy = pointY, that) { + return new Delaunay("length" in points + ? flatArray(points, fx, fy, that) + : Float64Array.from(flatIterable(points, fx, fy, that))); + } + constructor(points) { + this._delaunator = new Delaunator(points); + this.inedges = new Int32Array(points.length / 2); + this._hullIndex = new Int32Array(points.length / 2); + this.points = this._delaunator.coords; + this._init(); + } + update() { + this._delaunator.update(); + this._init(); + return this; + } + _init() { + const d = this._delaunator, points = this.points; + + // check for collinear + if (d.hull && d.hull.length > 2 && collinear(d)) { + this.collinear = Int32Array.from({length: points.length/2}, (_,i) => i) + .sort((i, j) => points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]); // for exact neighbors + const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], + bounds = [ points[2 * e], points[2 * e + 1], points[2 * f], points[2 * f + 1] ], + r = 1e-8 * Math.hypot(bounds[3] - bounds[1], bounds[2] - bounds[0]); + for (let i = 0, n = points.length / 2; i < n; ++i) { + const p = jitter(points[2 * i], points[2 * i + 1], r); + points[2 * i] = p[0]; + points[2 * i + 1] = p[1]; + } + this._delaunator = new Delaunator(points); + } else { + delete this.collinear; + } + + const halfedges = this.halfedges = this._delaunator.halfedges; + const hull = this.hull = this._delaunator.hull; + const triangles = this.triangles = this._delaunator.triangles; + const inedges = this.inedges.fill(-1); + const hullIndex = this._hullIndex.fill(-1); + + // Compute an index from each point to an (arbitrary) incoming halfedge + // Used to give the first neighbor of each point; for this reason, + // on the hull we give priority to exterior halfedges + for (let e = 0, n = halfedges.length; e < n; ++e) { + const p = triangles[e % 3 === 2 ? e - 2 : e + 1]; + if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e; + } + for (let i = 0, n = hull.length; i < n; ++i) { + hullIndex[hull[i]] = i; + } + + // degenerate case: 1 or 2 (distinct) points + if (hull.length <= 2 && hull.length > 0) { + this.triangles = new Int32Array(3).fill(-1); + this.halfedges = new Int32Array(3).fill(-1); + this.triangles[0] = hull[0]; + this.triangles[1] = hull[1]; + this.triangles[2] = hull[1]; + inedges[hull[0]] = 1; + if (hull.length === 2) inedges[hull[1]] = 0; + } + } + voronoi(bounds) { + return new Voronoi(this, bounds); + } + *neighbors(i) { + const {inedges, hull, _hullIndex, halfedges, triangles, collinear} = this; + + // degenerate case with several collinear points + if (collinear) { + const l = collinear.indexOf(i); + if (l > 0) yield collinear[l - 1]; + if (l < collinear.length - 1) yield collinear[l + 1]; + return; + } + + const e0 = inedges[i]; + if (e0 === -1) return; // coincident point + let e = e0, p0 = -1; + do { + yield p0 = triangles[e]; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) return; // bad triangulation + e = halfedges[e]; + if (e === -1) { + const p = hull[(_hullIndex[i] + 1) % hull.length]; + if (p !== p0) yield p; + return; + } + } while (e !== e0); + } + find(x, y, i = 0) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return -1; + const i0 = i; + let c; + while ((c = this._step(i, x, y)) >= 0 && c !== i && c !== i0) i = c; + return c; + } + _step(i, x, y) { + const {inedges, hull, _hullIndex, halfedges, triangles, points} = this; + if (inedges[i] === -1 || !points.length) return (i + 1) % (points.length >> 1); + let c = i; + let dc = pow(x - points[i * 2], 2) + pow(y - points[i * 2 + 1], 2); + const e0 = inedges[i]; + let e = e0; + do { + let t = triangles[e]; + const dt = pow(x - points[t * 2], 2) + pow(y - points[t * 2 + 1], 2); + if (dt < dc) dc = dt, c = t; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + if (e === -1) { + e = hull[(_hullIndex[i] + 1) % hull.length]; + if (e !== t) { + if (pow(x - points[e * 2], 2) + pow(y - points[e * 2 + 1], 2) < dc) return e; + } + break; + } + } while (e !== e0); + return c; + } + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {points, halfedges, triangles} = this; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = triangles[i] * 2; + const tj = triangles[j] * 2; + context.moveTo(points[ti], points[ti + 1]); + context.lineTo(points[tj], points[tj + 1]); + } + this.renderHull(context); + return buffer && buffer.value(); + } + renderPoints(context, r = 2) { + const buffer = context == null ? context = new Path : undefined; + const {points} = this; + for (let i = 0, n = points.length; i < n; i += 2) { + const x = points[i], y = points[i + 1]; + context.moveTo(x + r, y); + context.arc(x, y, r, 0, tau); + } + return buffer && buffer.value(); + } + renderHull(context) { + const buffer = context == null ? context = new Path : undefined; + const {hull, points} = this; + const h = hull[0] * 2, n = hull.length; + context.moveTo(points[h], points[h + 1]); + for (let i = 1; i < n; ++i) { + const h = 2 * hull[i]; + context.lineTo(points[h], points[h + 1]); + } + context.closePath(); + return buffer && buffer.value(); + } + hullPolygon() { + const polygon = new Polygon; + this.renderHull(polygon); + return polygon.value(); + } + renderTriangle(i, context) { + const buffer = context == null ? context = new Path : undefined; + const {points, triangles} = this; + const t0 = triangles[i *= 3] * 2; + const t1 = triangles[i + 1] * 2; + const t2 = triangles[i + 2] * 2; + context.moveTo(points[t0], points[t0 + 1]); + context.lineTo(points[t1], points[t1 + 1]); + context.lineTo(points[t2], points[t2 + 1]); + context.closePath(); + return buffer && buffer.value(); + } + *trianglePolygons() { + const {triangles} = this; + for (let i = 0, n = triangles.length / 3; i < n; ++i) { + yield this.trianglePolygon(i); + } + } + trianglePolygon(i) { + const polygon = new Polygon; + this.renderTriangle(i, polygon); + return polygon.value(); + } +} + +function flatArray(points, fx, fy, that) { + const n = points.length; + const array = new Float64Array(n * 2); + for (let i = 0; i < n; ++i) { + const p = points[i]; + array[i * 2] = fx.call(that, p, i, points); + array[i * 2 + 1] = fy.call(that, p, i, points); + } + return array; +} + +function* flatIterable(points, fx, fy, that) { + let i = 0; + for (const p of points) { + yield fx.call(that, p, i, points); + yield fy.call(that, p, i, points); + ++i; + } +} + +exports.Delaunay = Delaunay; +exports.Voronoi = Voronoi; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-delaunay/dist/d3-delaunay.min.js b/node_modules/d3-delaunay/dist/d3-delaunay.min.js new file mode 100644 index 00000000..2473bdf2 --- /dev/null +++ b/node_modules/d3-delaunay/dist/d3-delaunay.min.js @@ -0,0 +1,3 @@ +// https://github.com/d3/d3-delaunay v5.3.0 Copyright 2020 Mike Bostock +// https://github.com/mapbox/delaunator v4.0.1. Copyright 2019 Mapbox, Inc. +!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i((t=t||self).d3=t.d3||{})}(this,function(t){"use strict";const i=Math.pow(2,-52),e=new Uint32Array(512);class n{static from(t,i=u,e=_){const s=t.length,h=new Float64Array(2*s);for(let n=0;n>1;if(i>0&&"number"!=typeof t[0])throw new Error("Expected coords to contain numbers.");this.coords=t;const e=Math.max(2*i-5,0);this._triangles=new Uint32Array(3*e),this._halfedges=new Int32Array(3*e),this._hashSize=Math.ceil(Math.sqrt(i)),this._hullPrev=new Uint32Array(i),this._hullNext=new Uint32Array(i),this._hullTri=new Uint32Array(i),this._hullHash=new Int32Array(this._hashSize).fill(-1),this._ids=new Uint32Array(i),this._dists=new Float64Array(i),this.update()}update(){const{coords:t,_hullPrev:e,_hullNext:n,_hullTri:h,_hullHash:r}=this,c=t.length>>1;let u=1/0,_=1/0,f=-1/0,d=-1/0;for(let i=0;if&&(f=e),n>d&&(d=n),this._ids[i]=i}const g=(u+f)/2,y=(_+d)/2;let m,x,p,w=1/0;for(let i=0;i0&&(x=i,w=e)}let T=t[2*x],M=t[2*x+1],A=1/0;for(let i=0;in&&(i[e++]=s,n=this._dists[s])}return this.hull=i.subarray(0,e),this.triangles=new Uint32Array(0),void(this.halfedges=new Uint32Array(0))}if(l(v,b,T,M,k,$)){const t=x,i=T,e=M;x=p,T=k,M=$,p=t,k=i,$=e}const P=function(t,i,e,n,s,h){const l=e-t,r=n-i,o=s-t,a=h-i,c=l*l+r*r,u=o*o+a*a,_=.5/(l*a-r*o);return{x:t+(a*c-r*u)*_,y:i+(l*u-o*c)*_}}(v,b,T,M,k,$);this._cx=P.x,this._cy=P.y;for(let i=0;i0&&Math.abs(u-s)<=i&&Math.abs(_-o)<=i)continue;if(s=u,o=_,c===m||c===x||c===p)continue;let f=0;for(let t=0,i=this._hashKey(u,_);t0?3-e:1+e)/4}(t-this._cx,i-this._cy)*this._hashSize)%this._hashSize}_legalize(t){const{_triangles:i,_halfedges:n,coords:s}=this;let h=0,l=0;for(;;){const o=n[t],a=t-t%3;if(l=a+(t+2)%3,-1===o){if(0===h)break;t=e[--h];continue}const c=o-o%3,u=a+(t+1)%3,_=c+(o+2)%3,f=i[l],d=i[t],g=i[u],y=i[_];if(r(s[2*f],s[2*f+1],s[2*d],s[2*d+1],s[2*g],s[2*g+1],s[2*y],s[2*y+1])){i[t]=y,i[o]=f;const s=n[_];if(-1===s){let i=this._hullStart;do{if(this._hullTri[i]===_){this._hullTri[i]=t;break}i=this._hullPrev[i]}while(i!==this._hullStart)}this._link(t,s),this._link(o,n[l]),this._link(l,_);const r=c+(o+1)%3;h=33306690738754716e-32*Math.abs(l+r)?l-r:0}function l(t,i,e,n,s,l){return(h(s,l,t,i,e,n)||h(t,i,e,n,s,l)||h(e,n,s,l,t,i))<0}function r(t,i,e,n,s,h,l,r){const o=t-l,a=i-r,c=e-l,u=n-r,_=s-l,f=h-r,d=c*c+u*u,g=_*_+f*f;return o*(u*g-d*f)-a*(c*g-d*_)+(o*o+a*a)*(c*f-u*_)<0}function o(t,i,e,n,s,h){const l=e-t,r=n-i,o=s-t,a=h-i,c=l*l+r*r,u=o*o+a*a,_=.5/(l*a-r*o),f=(a*c-r*u)*_,d=(l*u-o*c)*_;return f*f+d*d}function a(t,i,e,n){if(n-e<=20)for(let s=e+1;s<=n;s++){const n=t[s],h=i[n];let l=s-1;for(;l>=e&&i[t[l]]>h;)t[l+1]=t[l--];t[l+1]=n}else{let s=e+1,h=n;c(t,e+n>>1,s),i[t[e]]>i[t[n]]&&c(t,e,n),i[t[s]]>i[t[n]]&&c(t,s,n),i[t[e]]>i[t[s]]&&c(t,e,s);const l=t[s],r=i[l];for(;;){do{s++}while(i[t[s]]r);if(h=h-e?(a(t,i,s,n),a(t,i,e,h-1)):(a(t,i,e,h-1),a(t,i,s,n))}}function c(t,i,e){const n=t[i];t[i]=t[e],t[e]=n}function u(t){return t[0]}function _(t){return t[1]}const f=1e-6;class d{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(t,i){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+i}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(t,i){this._+=`L${this._x1=+t},${this._y1=+i}`}arc(t,i,e){const n=(t=+t)+(e=+e),s=i=+i;if(e<0)throw new Error("negative radius");null===this._x1?this._+=`M${n},${s}`:(Math.abs(this._x1-n)>f||Math.abs(this._y1-s)>f)&&(this._+="L"+n+","+s),e&&(this._+=`A${e},${e},0,1,1,${t-e},${i}A${e},${e},0,1,1,${this._x1=n},${this._y1=s}`)}rect(t,i,e,n){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+i}h${+e}v${+n}h${-e}Z`}value(){return this._||null}}class g{constructor(){this._=[]}moveTo(t,i){this._.push([t,i])}closePath(){this._.push(this._[0].slice())}lineTo(t,i){this._.push([t,i])}value(){return this._.length?this._:null}}class y{constructor(t,[i,e,n,s]=[0,0,960,500]){if(!((n=+n)>=(i=+i)&&(s=+s)>=(e=+e)))throw new Error("invalid bounds");this.delaunay=t,this._circumcenters=new Float64Array(2*t.points.length),this.vectors=new Float64Array(2*t.points.length),this.xmax=n,this.xmin=i,this.ymax=s,this.ymin=e,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){const{delaunay:{points:t,hull:i,triangles:e},vectors:n}=this,s=this.circumcenters=this._circumcenters.subarray(0,e.length/3*2);for(let i,n,h=0,l=0,r=e.length;h1;)s-=2;for(let t=2;t4)for(let t=0;t0){if(i>=this.ymax)return null;(s=(this.ymax-i)/n)0){if(t>=this.xmax)return null;(s=(this.xmax-t)/e)this.xmax?2:0)|(ithis.ymax?8:0)}}const m=2*Math.PI,x=Math.pow;function p(t){return t[0]}function w(t){return t[1]}function v(t,i,e){return[t+Math.sin(t+i)*e,i+Math.cos(t-i)*e]}class b{static from(t,i=p,e=w,n){return new b("length"in t?function(t,i,e,n){const s=t.length,h=new Float64Array(2*s);for(let l=0;l2&&function(t){const{triangles:i,coords:e}=t;for(let t=0;t1e-10)return!1}return!0}(t)){this.collinear=Int32Array.from({length:i.length/2},(t,i)=>i).sort((t,e)=>i[2*t]-i[2*e]||i[2*t+1]-i[2*e+1]);const t=this.collinear[0],e=this.collinear[this.collinear.length-1],s=[i[2*t],i[2*t+1],i[2*e],i[2*e+1]],h=1e-8*Math.hypot(s[3]-s[1],s[2]-s[0]);for(let t=0,e=i.length/2;t0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=s[0],this.triangles[1]=s[1],this.triangles[2]=s[1],l[s[0]]=1,2===s.length&&(l[s[1]]=0))}voronoi(t){return new y(this,t)}*neighbors(t){const{inedges:i,hull:e,_hullIndex:n,halfedges:s,triangles:h,collinear:l}=this;if(l){const i=l.indexOf(t);return i>0&&(yield l[i-1]),void(i=0&&s!==e&&s!==n;)e=s;return s}_step(t,i,e){const{inedges:n,hull:s,_hullIndex:h,halfedges:l,triangles:r,points:o}=this;if(-1===n[t]||!o.length)return(t+1)%(o.length>>1);let a=t,c=x(i-o[2*t],2)+x(e-o[2*t+1],2);const u=n[t];let _=u;do{let n=r[_];const u=x(i-o[2*n],2)+x(e-o[2*n+1],2);if(u 1e-10) return false; + } + return true; +} + +function jitter(x, y, r) { + return [x + Math.sin(x + y) * r, y + Math.cos(x - y) * r]; +} + +export default class Delaunay { + static from(points, fx = pointX, fy = pointY, that) { + return new Delaunay("length" in points + ? flatArray(points, fx, fy, that) + : Float64Array.from(flatIterable(points, fx, fy, that))); + } + constructor(points) { + this._delaunator = new Delaunator(points); + this.inedges = new Int32Array(points.length / 2); + this._hullIndex = new Int32Array(points.length / 2); + this.points = this._delaunator.coords; + this._init(); + } + update() { + this._delaunator.update(); + this._init(); + return this; + } + _init() { + const d = this._delaunator, points = this.points; + + // check for collinear + if (d.hull && d.hull.length > 2 && collinear(d)) { + this.collinear = Int32Array.from({length: points.length/2}, (_,i) => i) + .sort((i, j) => points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]); // for exact neighbors + const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], + bounds = [ points[2 * e], points[2 * e + 1], points[2 * f], points[2 * f + 1] ], + r = 1e-8 * Math.hypot(bounds[3] - bounds[1], bounds[2] - bounds[0]); + for (let i = 0, n = points.length / 2; i < n; ++i) { + const p = jitter(points[2 * i], points[2 * i + 1], r); + points[2 * i] = p[0]; + points[2 * i + 1] = p[1]; + } + this._delaunator = new Delaunator(points); + } else { + delete this.collinear; + } + + const halfedges = this.halfedges = this._delaunator.halfedges; + const hull = this.hull = this._delaunator.hull; + const triangles = this.triangles = this._delaunator.triangles; + const inedges = this.inedges.fill(-1); + const hullIndex = this._hullIndex.fill(-1); + + // Compute an index from each point to an (arbitrary) incoming halfedge + // Used to give the first neighbor of each point; for this reason, + // on the hull we give priority to exterior halfedges + for (let e = 0, n = halfedges.length; e < n; ++e) { + const p = triangles[e % 3 === 2 ? e - 2 : e + 1]; + if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e; + } + for (let i = 0, n = hull.length; i < n; ++i) { + hullIndex[hull[i]] = i; + } + + // degenerate case: 1 or 2 (distinct) points + if (hull.length <= 2 && hull.length > 0) { + this.triangles = new Int32Array(3).fill(-1); + this.halfedges = new Int32Array(3).fill(-1); + this.triangles[0] = hull[0]; + this.triangles[1] = hull[1]; + this.triangles[2] = hull[1]; + inedges[hull[0]] = 1; + if (hull.length === 2) inedges[hull[1]] = 0; + } + } + voronoi(bounds) { + return new Voronoi(this, bounds); + } + *neighbors(i) { + const {inedges, hull, _hullIndex, halfedges, triangles, collinear} = this; + + // degenerate case with several collinear points + if (collinear) { + const l = collinear.indexOf(i); + if (l > 0) yield collinear[l - 1]; + if (l < collinear.length - 1) yield collinear[l + 1]; + return; + } + + const e0 = inedges[i]; + if (e0 === -1) return; // coincident point + let e = e0, p0 = -1; + do { + yield p0 = triangles[e]; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) return; // bad triangulation + e = halfedges[e]; + if (e === -1) { + const p = hull[(_hullIndex[i] + 1) % hull.length]; + if (p !== p0) yield p; + return; + } + } while (e !== e0); + } + find(x, y, i = 0) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return -1; + const i0 = i; + let c; + while ((c = this._step(i, x, y)) >= 0 && c !== i && c !== i0) i = c; + return c; + } + _step(i, x, y) { + const {inedges, hull, _hullIndex, halfedges, triangles, points} = this; + if (inedges[i] === -1 || !points.length) return (i + 1) % (points.length >> 1); + let c = i; + let dc = pow(x - points[i * 2], 2) + pow(y - points[i * 2 + 1], 2); + const e0 = inedges[i]; + let e = e0; + do { + let t = triangles[e]; + const dt = pow(x - points[t * 2], 2) + pow(y - points[t * 2 + 1], 2); + if (dt < dc) dc = dt, c = t; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + if (e === -1) { + e = hull[(_hullIndex[i] + 1) % hull.length]; + if (e !== t) { + if (pow(x - points[e * 2], 2) + pow(y - points[e * 2 + 1], 2) < dc) return e; + } + break; + } + } while (e !== e0); + return c; + } + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {points, halfedges, triangles} = this; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = triangles[i] * 2; + const tj = triangles[j] * 2; + context.moveTo(points[ti], points[ti + 1]); + context.lineTo(points[tj], points[tj + 1]); + } + this.renderHull(context); + return buffer && buffer.value(); + } + renderPoints(context, r = 2) { + const buffer = context == null ? context = new Path : undefined; + const {points} = this; + for (let i = 0, n = points.length; i < n; i += 2) { + const x = points[i], y = points[i + 1]; + context.moveTo(x + r, y); + context.arc(x, y, r, 0, tau); + } + return buffer && buffer.value(); + } + renderHull(context) { + const buffer = context == null ? context = new Path : undefined; + const {hull, points} = this; + const h = hull[0] * 2, n = hull.length; + context.moveTo(points[h], points[h + 1]); + for (let i = 1; i < n; ++i) { + const h = 2 * hull[i]; + context.lineTo(points[h], points[h + 1]); + } + context.closePath(); + return buffer && buffer.value(); + } + hullPolygon() { + const polygon = new Polygon; + this.renderHull(polygon); + return polygon.value(); + } + renderTriangle(i, context) { + const buffer = context == null ? context = new Path : undefined; + const {points, triangles} = this; + const t0 = triangles[i *= 3] * 2; + const t1 = triangles[i + 1] * 2; + const t2 = triangles[i + 2] * 2; + context.moveTo(points[t0], points[t0 + 1]); + context.lineTo(points[t1], points[t1 + 1]); + context.lineTo(points[t2], points[t2 + 1]); + context.closePath(); + return buffer && buffer.value(); + } + *trianglePolygons() { + const {triangles} = this; + for (let i = 0, n = triangles.length / 3; i < n; ++i) { + yield this.trianglePolygon(i); + } + } + trianglePolygon(i) { + const polygon = new Polygon; + this.renderTriangle(i, polygon); + return polygon.value(); + } +} + +function flatArray(points, fx, fy, that) { + const n = points.length; + const array = new Float64Array(n * 2); + for (let i = 0; i < n; ++i) { + const p = points[i]; + array[i * 2] = fx.call(that, p, i, points); + array[i * 2 + 1] = fy.call(that, p, i, points); + } + return array; +} + +function* flatIterable(points, fx, fy, that) { + let i = 0; + for (const p of points) { + yield fx.call(that, p, i, points); + yield fy.call(that, p, i, points); + ++i; + } +} diff --git a/node_modules/d3-delaunay/src/index.js b/node_modules/d3-delaunay/src/index.js new file mode 100644 index 00000000..dc9022e8 --- /dev/null +++ b/node_modules/d3-delaunay/src/index.js @@ -0,0 +1,2 @@ +export {default as Delaunay} from "./delaunay.js"; +export {default as Voronoi} from "./voronoi.js"; diff --git a/node_modules/d3-delaunay/src/path.js b/node_modules/d3-delaunay/src/path.js new file mode 100644 index 00000000..0eaa69e3 --- /dev/null +++ b/node_modules/d3-delaunay/src/path.js @@ -0,0 +1,37 @@ +const epsilon = 1e-6; + +export default class Path { + constructor() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; + } + moveTo(x, y) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`; + } + closePath() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + } + lineTo(x, y) { + this._ += `L${this._x1 = +x},${this._y1 = +y}`; + } + arc(x, y, r) { + x = +x, y = +y, r = +r; + const x0 = x + r; + const y0 = y; + if (r < 0) throw new Error("negative radius"); + if (this._x1 === null) this._ += `M${x0},${y0}`; + else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) this._ += "L" + x0 + "," + y0; + if (!r) return; + this._ += `A${r},${r},0,1,1,${x - r},${y}A${r},${r},0,1,1,${this._x1 = x0},${this._y1 = y0}`; + } + rect(x, y, w, h) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${+w}v${+h}h${-w}Z`; + } + value() { + return this._ || null; + } +} diff --git a/node_modules/d3-delaunay/src/polygon.js b/node_modules/d3-delaunay/src/polygon.js new file mode 100644 index 00000000..bdbbdc30 --- /dev/null +++ b/node_modules/d3-delaunay/src/polygon.js @@ -0,0 +1,17 @@ +export default class Polygon { + constructor() { + this._ = []; + } + moveTo(x, y) { + this._.push([x, y]); + } + closePath() { + this._.push(this._[0].slice()); + } + lineTo(x, y) { + this._.push([x, y]); + } + value() { + return this._.length ? this._ : null; + } +} diff --git a/node_modules/d3-delaunay/src/voronoi.js b/node_modules/d3-delaunay/src/voronoi.js new file mode 100644 index 00000000..b2d8d49e --- /dev/null +++ b/node_modules/d3-delaunay/src/voronoi.js @@ -0,0 +1,320 @@ +import Path from "./path.js"; +import Polygon from "./polygon.js"; + +export default class Voronoi { + constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) { + if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error("invalid bounds"); + this.delaunay = delaunay; + this._circumcenters = new Float64Array(delaunay.points.length * 2); + this.vectors = new Float64Array(delaunay.points.length * 2); + this.xmax = xmax, this.xmin = xmin; + this.ymax = ymax, this.ymin = ymin; + this._init(); + } + update() { + this.delaunay.update(); + this._init(); + return this; + } + _init() { + const {delaunay: {points, hull, triangles}, vectors} = this; + + // Compute circumcenters. + const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2); + for (let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2) { + const t1 = triangles[i] * 2; + const t2 = triangles[i + 1] * 2; + const t3 = triangles[i + 2] * 2; + const x1 = points[t1]; + const y1 = points[t1 + 1]; + const x2 = points[t2]; + const y2 = points[t2 + 1]; + const x3 = points[t3]; + const y3 = points[t3 + 1]; + + const dx = x2 - x1; + const dy = y2 - y1; + const ex = x3 - x1; + const ey = y3 - y1; + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const ab = (dx * ey - dy * ex) * 2; + + if (!ab) { + // degenerate case (collinear diagram) + x = (x1 + x3) / 2 - 1e8 * ey; + y = (y1 + y3) / 2 + 1e8 * ex; + } + else if (Math.abs(ab) < 1e-8) { + // almost equal points (degenerate triangle) + x = (x1 + x3) / 2; + y = (y1 + y3) / 2; + } else { + const d = 1 / ab; + x = x1 + (ey * bl - dy * cl) * d; + y = y1 + (dx * cl - ex * bl) * d; + } + circumcenters[j] = x; + circumcenters[j + 1] = y; + } + + // Compute exterior cell rays. + let h = hull[hull.length - 1]; + let p0, p1 = h * 4; + let x0, x1 = points[2 * h]; + let y0, y1 = points[2 * h + 1]; + vectors.fill(0); + for (let i = 0; i < hull.length; ++i) { + h = hull[i]; + p0 = p1, x0 = x1, y0 = y1; + p1 = h * 4, x1 = points[2 * h], y1 = points[2 * h + 1]; + vectors[p0 + 2] = vectors[p1] = y0 - y1; + vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0; + } + } + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {delaunay: {halfedges, inedges, hull}, circumcenters, vectors} = this; + if (hull.length <= 1) return null; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = Math.floor(i / 3) * 2; + const tj = Math.floor(j / 3) * 2; + const xi = circumcenters[ti]; + const yi = circumcenters[ti + 1]; + const xj = circumcenters[tj]; + const yj = circumcenters[tj + 1]; + this._renderSegment(xi, yi, xj, yj, context); + } + let h0, h1 = hull[hull.length - 1]; + for (let i = 0; i < hull.length; ++i) { + h0 = h1, h1 = hull[i]; + const t = Math.floor(inedges[h1] / 3) * 2; + const x = circumcenters[t]; + const y = circumcenters[t + 1]; + const v = h0 * 4; + const p = this._project(x, y, vectors[v + 2], vectors[v + 3]); + if (p) this._renderSegment(x, y, p[0], p[1], context); + } + return buffer && buffer.value(); + } + renderBounds(context) { + const buffer = context == null ? context = new Path : undefined; + context.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin); + return buffer && buffer.value(); + } + renderCell(i, context) { + const buffer = context == null ? context = new Path : undefined; + const points = this._clip(i); + if (points === null || !points.length) return; + context.moveTo(points[0], points[1]); + let n = points.length; + while (points[0] === points[n-2] && points[1] === points[n-1] && n > 1) n -= 2; + for (let i = 2; i < n; i += 2) { + if (points[i] !== points[i-2] || points[i+1] !== points[i-1]) + context.lineTo(points[i], points[i + 1]); + } + context.closePath(); + return buffer && buffer.value(); + } + *cellPolygons() { + const {delaunay: {points}} = this; + for (let i = 0, n = points.length / 2; i < n; ++i) { + const cell = this.cellPolygon(i); + if (cell) cell.index = i, yield cell; + } + } + cellPolygon(i) { + const polygon = new Polygon; + this.renderCell(i, polygon); + return polygon.value(); + } + _renderSegment(x0, y0, x1, y1, context) { + let S; + const c0 = this._regioncode(x0, y0); + const c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + context.moveTo(x0, y0); + context.lineTo(x1, y1); + } else if (S = this._clipSegment(x0, y0, x1, y1, c0, c1)) { + context.moveTo(S[0], S[1]); + context.lineTo(S[2], S[3]); + } + } + contains(i, x, y) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return false; + return this.delaunay._step(i, x, y) === i; + } + *neighbors(i) { + const ci = this._clip(i); + if (ci) for (const j of this.delaunay.neighbors(i)) { + const cj = this._clip(j); + // find the common edge + if (cj) loop: for (let ai = 0, li = ci.length; ai < li; ai += 2) { + for (let aj = 0, lj = cj.length; aj < lj; aj += 2) { + if (ci[ai] == cj[aj] + && ci[ai + 1] == cj[aj + 1] + && ci[(ai + 2) % li] == cj[(aj + lj - 2) % lj] + && ci[(ai + 3) % li] == cj[(aj + lj - 1) % lj] + ) { + yield j; + break loop; + } + } + } + } + } + _cell(i) { + const {circumcenters, delaunay: {inedges, halfedges, triangles}} = this; + const e0 = inedges[i]; + if (e0 === -1) return null; // coincident point + const points = []; + let e = e0; + do { + const t = Math.floor(e / 3); + points.push(circumcenters[t * 2], circumcenters[t * 2 + 1]); + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + } while (e !== e0 && e !== -1); + return points; + } + _clip(i) { + // degenerate case (1 valid point: return the box) + if (i === 0 && this.delaunay.hull.length === 1) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; + } + const points = this._cell(i); + if (points === null) return null; + const {vectors: V} = this; + const v = i * 4; + return V[v] || V[v + 1] + ? this._clipInfinite(i, points, V[v], V[v + 1], V[v + 2], V[v + 3]) + : this._clipFinite(i, points); + } + _clipFinite(i, points) { + const n = points.length; + let P = null; + let x0, y0, x1 = points[n - 2], y1 = points[n - 1]; + let c0, c1 = this._regioncode(x1, y1); + let e0, e1; + for (let j = 0; j < n; j += 2) { + x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1]; + c0 = c1, c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + e0 = e1, e1 = 0; + if (P) P.push(x1, y1); + else P = [x1, y1]; + } else { + let S, sx0, sy0, sx1, sy1; + if (c0 === 0) { + if ((S = this._clipSegment(x0, y0, x1, y1, c0, c1)) === null) continue; + [sx0, sy0, sx1, sy1] = S; + } else { + if ((S = this._clipSegment(x1, y1, x0, y0, c1, c0)) === null) continue; + [sx1, sy1, sx0, sy0] = S; + e0 = e1, e1 = this._edgecode(sx0, sy0); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx0, sy0); + else P = [sx0, sy0]; + } + e0 = e1, e1 = this._edgecode(sx1, sy1); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx1, sy1); + else P = [sx1, sy1]; + } + } + if (P) { + e0 = e1, e1 = this._edgecode(P[0], P[1]); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; + } + return P; + } + _clipSegment(x0, y0, x1, y1, c0, c1) { + while (true) { + if (c0 === 0 && c1 === 0) return [x0, y0, x1, y1]; + if (c0 & c1) return null; + let x, y, c = c0 || c1; + if (c & 0b1000) x = x0 + (x1 - x0) * (this.ymax - y0) / (y1 - y0), y = this.ymax; + else if (c & 0b0100) x = x0 + (x1 - x0) * (this.ymin - y0) / (y1 - y0), y = this.ymin; + else if (c & 0b0010) y = y0 + (y1 - y0) * (this.xmax - x0) / (x1 - x0), x = this.xmax; + else y = y0 + (y1 - y0) * (this.xmin - x0) / (x1 - x0), x = this.xmin; + if (c0) x0 = x, y0 = y, c0 = this._regioncode(x0, y0); + else x1 = x, y1 = y, c1 = this._regioncode(x1, y1); + } + } + _clipInfinite(i, points, vx0, vy0, vxn, vyn) { + let P = Array.from(points), p; + if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]); + if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]); + if (P = this._clipFinite(i, P)) { + for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) { + c0 = c1, c1 = this._edgecode(P[j], P[j + 1]); + if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length; + } + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax]; + } + return P; + } + _edge(i, e0, e1, P, j) { + while (e0 !== e1) { + let x, y; + switch (e0) { + case 0b0101: e0 = 0b0100; continue; // top-left + case 0b0100: e0 = 0b0110, x = this.xmax, y = this.ymin; break; // top + case 0b0110: e0 = 0b0010; continue; // top-right + case 0b0010: e0 = 0b1010, x = this.xmax, y = this.ymax; break; // right + case 0b1010: e0 = 0b1000; continue; // bottom-right + case 0b1000: e0 = 0b1001, x = this.xmin, y = this.ymax; break; // bottom + case 0b1001: e0 = 0b0001; continue; // bottom-left + case 0b0001: e0 = 0b0101, x = this.xmin, y = this.ymin; break; // left + } + if ((P[j] !== x || P[j + 1] !== y) && this.contains(i, x, y)) { + P.splice(j, 0, x, y), j += 2; + } + } + if (P.length > 4) { + for (let i = 0; i < P.length; i+= 2) { + const j = (i + 2) % P.length, k = (i + 4) % P.length; + if (P[i] === P[j] && P[j] === P[k] + || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) + P.splice(j, 2), i -= 2; + } + } + return j; + } + _project(x0, y0, vx, vy) { + let t = Infinity, c, x, y; + if (vy < 0) { // top + if (y0 <= this.ymin) return null; + if ((c = (this.ymin - y0) / vy) < t) y = this.ymin, x = x0 + (t = c) * vx; + } else if (vy > 0) { // bottom + if (y0 >= this.ymax) return null; + if ((c = (this.ymax - y0) / vy) < t) y = this.ymax, x = x0 + (t = c) * vx; + } + if (vx > 0) { // right + if (x0 >= this.xmax) return null; + if ((c = (this.xmax - x0) / vx) < t) x = this.xmax, y = y0 + (t = c) * vy; + } else if (vx < 0) { // left + if (x0 <= this.xmin) return null; + if ((c = (this.xmin - x0) / vx) < t) x = this.xmin, y = y0 + (t = c) * vy; + } + return [x, y]; + } + _edgecode(x, y) { + return (x === this.xmin ? 0b0001 + : x === this.xmax ? 0b0010 : 0b0000) + | (y === this.ymin ? 0b0100 + : y === this.ymax ? 0b1000 : 0b0000); + } + _regioncode(x, y) { + return (x < this.xmin ? 0b0001 + : x > this.xmax ? 0b0010 : 0b0000) + | (y < this.ymin ? 0b0100 + : y > this.ymax ? 0b1000 : 0b0000); + } +} diff --git a/node_modules/d3-dispatch/LICENSE b/node_modules/d3-dispatch/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-dispatch/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-dispatch/README.md b/node_modules/d3-dispatch/README.md new file mode 100644 index 00000000..65dfaf0a --- /dev/null +++ b/node_modules/d3-dispatch/README.md @@ -0,0 +1,82 @@ +# d3-dispatch + +Dispatching is a convenient mechanism for separating concerns with loosely-coupled code: register named callbacks and then call them with arbitrary arguments. A variety of D3 components, such as [d3-request](https://github.com/d3/d3-request), use this mechanism to emit events to listeners. Think of this like Node’s [EventEmitter](https://nodejs.org/api/events.html), except every listener has a well-defined name so it’s easy to remove or replace them. + +For example, to create a dispatch for *start* and *end* events: + +```js +var dispatch = d3.dispatch("start", "end"); +``` + +You can then register callbacks for these events using [*dispatch*.on](#dispatch_on): + +```js +dispatch.on("start", callback1); +dispatch.on("start.foo", callback2); +dispatch.on("end", callback3); +``` + +Then, you can invoke all the *start* callbacks using [*dispatch*.call](#dispatch_call) or [*dispatch*.apply](#dispatch_apply): + +```js +dispatch.call("start"); +``` + +Like *function*.call, you may also specify the `this` context and any arguments: + +```js +dispatch.call("start", {about: "I am a context object"}, "I am an argument"); +``` + +Want a more involved example? See how to use [d3-dispatch for coordinated views](http://bl.ocks.org/mbostock/5872848). + +## Installing + +If you use NPM, `npm install d3-dispatch`. Otherwise, download the [latest release](https://github.com/d3/d3-dispatch/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-dispatch.v1.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +[Try d3-dispatch in your browser.](https://observablehq.com/collection/@d3/d3-dispatch) + +## API Reference + +# d3.dispatch(types…) · [Source](https://github.com/d3/d3-dispatch/blob/master/src/dispatch.js) + +Creates a new dispatch for the specified event *types*. Each *type* is a string, such as `"start"` or `"end"`. + +# *dispatch*.on(typenames[, callback]) · [Source](https://github.com/d3/d3-dispatch/blob/master/src/dispatch.js) + +Adds, removes or gets the *callback* for the specified *typenames*. If a *callback* function is specified, it is registered for the specified (fully-qualified) *typenames*. If a callback was already registered for the given *typenames*, the existing callback is removed before the new callback is added. + +The specified *typenames* is a string, such as `start` or `end.foo`. The type may be optionally followed by a period (`.`) and a name; the optional name allows multiple callbacks to be registered to receive events of the same type, such as `start.foo` and `start.bar`. To specify multiple typenames, separate typenames with spaces, such as `start end` or `start.foo start.bar`. + +To remove all callbacks for a given name `foo`, say `dispatch.on(".foo", null)`. + +If *callback* is not specified, returns the current callback for the specified *typenames*, if any. If multiple typenames are specified, the first matching callback is returned. + +# *dispatch*.copy() · [Source](https://github.com/d3/d3-dispatch/blob/master/src/dispatch.js) + +Returns a copy of this dispatch object. Changes to this dispatch do not affect the returned copy and vice versa. + +# *dispatch*.call(type[, that[, arguments…]]) · [Source](https://github.com/d3/d3-dispatch/blob/master/src/dispatch.js) + +Like [*function*.call](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call), invokes each registered callback for the specified *type*, passing the callback the specified *arguments*, with *that* as the `this` context. See [*dispatch*.apply](#dispatch_apply) for more information. + +# *dispatch*.apply(type[, that[, arguments]]) · [Source](https://github.com/d3/d3-dispatch/blob/master/src/dispatch.js) + +Like [*function*.apply](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call), invokes each registered callback for the specified *type*, passing the callback the specified *arguments*, with *that* as the `this` context. For example, if you wanted to dispatch your *custom* callbacks after handling a native *click* event, while preserving the current `this` context and arguments, you could say: + +```js +selection.on("click", function() { + dispatch.apply("custom", this, arguments); +}); +``` + +You can pass whatever arguments you want to callbacks; most commonly, you might create an object that represents an event, or pass the current datum (*d*) and index (*i*). See [function.call](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Call) and [function.apply](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Apply) for further information. diff --git a/node_modules/d3-dispatch/dist/d3-dispatch.js b/node_modules/d3-dispatch/dist/d3-dispatch.js new file mode 100644 index 00000000..ece01fff --- /dev/null +++ b/node_modules/d3-dispatch/dist/d3-dispatch.js @@ -0,0 +1,95 @@ +// https://d3js.org/d3-dispatch/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +var noop = {value: () => {}}; + +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} + +function Dispatch(_) { + this._ = _; +} + +function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); +} + +Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } + + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function(type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } +}; + +function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } +} + +function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; +} + +exports.dispatch = dispatch; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-dispatch/dist/d3-dispatch.min.js b/node_modules/d3-dispatch/dist/d3-dispatch.min.js new file mode 100644 index 00000000..02a18246 --- /dev/null +++ b/node_modules/d3-dispatch/dist/d3-dispatch.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-dispatch/ v2.0.0 Copyright 2020 Mike Bostock +!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((n=n||self).d3=n.d3||{})}(this,function(n){"use strict";var e={value:()=>{}};function t(){for(var n,e=0,t=arguments.length,o={};e=0&&(t=n.slice(r+1),n=n.slice(0,r)),n&&!e.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:t}})}function i(n,e){for(var t,r=0,o=n.length;r0)for(var t,r,o=new Array(t),i=0;i {}}; + +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} + +function Dispatch(_) { + this._ = _; +} + +function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); +} + +Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } + + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function(type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } +}; + +function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } +} + +function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; +} + +export default dispatch; diff --git a/node_modules/d3-dispatch/src/index.js b/node_modules/d3-dispatch/src/index.js new file mode 100644 index 00000000..4b8d3bdd --- /dev/null +++ b/node_modules/d3-dispatch/src/index.js @@ -0,0 +1 @@ +export {default as dispatch} from "./dispatch.js"; diff --git a/node_modules/d3-drag/LICENSE b/node_modules/d3-drag/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-drag/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-drag/README.md b/node_modules/d3-drag/README.md new file mode 100644 index 00000000..fe458474 --- /dev/null +++ b/node_modules/d3-drag/README.md @@ -0,0 +1,236 @@ +# d3-drag + +[Drag-and-drop](https://en.wikipedia.org/wiki/Drag_and_drop) is a popular and easy-to-learn pointing gesture: move the pointer to an object, press and hold to grab it, “drag†the object to a new location, and release to “dropâ€. D3’s [drag behavior](#api-reference) provides a convenient but flexible abstraction for enabling drag-and-drop interaction on [selections](https://github.com/d3/d3-selection). For example, you can use d3-drag to facilitate interaction with a [force-directed graph](https://github.com/d3/d3-force), or a simulation of colliding circles: + +[Force-Directed Graph](https://observablehq.com/@d3/force-directed-graph)[Force Dragging II](https://observablehq.com/d/c55a5839a5bb7c73) + +You can also use d3-drag to implement custom user interface elements, such as a slider. But the drag behavior isn’t just for moving elements around; there are a variety of ways to respond to a drag gesture. For example, you can use it to lasso elements in a scatterplot, or to paint lines on a canvas: + +[Line Drawing](https://observablehq.com/@d3/draw-me) + +The drag behavior can be combined with other behaviors, such as [d3-zoom](https://github.com/d3/d3-zoom) for zooming. + +[Drag & Zoom II](https://observablehq.com/@d3/drag-zoom) + +The drag behavior is agnostic about the DOM, so you can use it with SVG, HTML or even Canvas! And you can extend it with advanced selection techniques, such as a Voronoi overlay or a closest-target search: + +[Circle Dragging IV](https://observablehq.com/@d3/circle-dragging-iii)[Circle Dragging II](https://observablehq.com/@d3/circle-dragging-ii) + +Best of all, the drag behavior automatically unifies mouse and touch input, and avoids browser idiosyncrasies. When [Pointer Events](https://www.w3.org/TR/pointerevents/) are more widely available, the drag behavior will support those, too. + +## Installing + +If you use NPM, `npm install d3-drag`. Otherwise, download the [latest release](https://github.com/d3/d3-drag/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-drag.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + + +``` + +[Try d3-drag in your browser.](https://observablehq.com/collection/@d3/d3-drag) + +## API Reference + +This table describes how the drag behavior interprets native events: + +| Event | Listening Element | Drag Event | Default Prevented? | +| ------------ | ----------------- | ---------- | ------------------ | +| mousedownâµ | selection | start | no¹ | +| mousemove² | window¹ | drag | yes | +| mouseup² | window¹ | end | yes | +| dragstart² | window | - | yes | +| selectstart² | window | - | yes | +| click³ | window | - | yes | +| touchstart | selection | start | noâ´ | +| touchmove | selection | drag | yes | +| touchend | selection | end | noâ´ | +| touchcancel | selection | end | noâ´ | + +The propagation of all consumed events is [immediately stopped](https://dom.spec.whatwg.org/#dom-event-stopimmediatepropagation). If you want to prevent some events from initiating a drag gesture, use [*drag*.filter](#drag_filter). + +¹ Necessary to capture events outside an iframe; see [#9](https://github.com/d3/d3-drag/issues/9). +
² Only applies during an active, mouse-based gesture; see [#9](https://github.com/d3/d3-drag/issues/9). +
³ Only applies immediately after some mouse-based gestures; see [*drag*.clickDistance](#drag_clickDistance). +
â´ Necessary to allow [click emulation](https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW7) on touch input; see [#9](https://github.com/d3/d3-drag/issues/9). +
âµ Ignored if within 500ms of a touch gesture ending; assumes [click emulation](https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW7). + +# d3.drag() · [Source](https://github.com/d3/d3-drag/blob/master/src/drag.js), [Examples](https://observablehq.com/collection/@d3/d3-drag) + +Creates a new drag behavior. The returned behavior, [*drag*](#_drag), is both an object and a function, and is typically applied to selected elements via [*selection*.call](https://github.com/d3/d3-selection#selection_call). + +# drag(selection) · [Source](https://github.com/d3/d3-drag/blob/master/src/drag.js), [Examples](https://observablehq.com/collection/@d3/d3-drag) + +Applies this drag behavior to the specified [*selection*](https://github.com/d3/d3-selection). This function is typically not invoked directly, and is instead invoked via [*selection*.call](https://github.com/d3/d3-selection#selection_call). For example, to instantiate a drag behavior and apply it to a selection: + +```js +d3.selectAll(".node").call(d3.drag().on("start", started)); +``` + +Internally, the drag behavior uses [*selection*.on](https://github.com/d3/d3-selection#selection_on) to bind the necessary event listeners for dragging. The listeners use the name `.drag`, so you can subsequently unbind the drag behavior as follows: + +```js +selection.on(".drag", null); +``` + +Applying the drag behavior also sets the [-webkit-tap-highlight-color](https://developer.apple.com/library/mac/documentation/AppleApplications/Reference/SafariWebContent/AdjustingtheTextSize/AdjustingtheTextSize.html#//apple_ref/doc/uid/TP40006510-SW5) style to transparent, disabling the tap highlight on iOS. If you want a different tap highlight color, remove or re-apply this style after applying the drag behavior. + +# drag.container([container]) · [Source](https://github.com/d3/d3-drag/blob/master/src/drag.js), [Examples](https://observablehq.com/collection/@d3/d3-drag) + +If *container* is specified, sets the container accessor to the specified object or function and returns the drag behavior. If *container* is not specified, returns the current container accessor, which defaults to: + +```js +function container() { + return this.parentNode; +} +``` + +The *container* of a drag gesture determines the coordinate system of subsequent [drag events](#drag-events), affecting *event*.x and *event*.y. The element returned by the container accessor is subsequently passed to [d3.pointer](https://github.com/d3/d3-selection#pointer) to determine the local coordinates of the pointer. + +The default container accessor returns the parent node of the element in the originating selection (see [*drag*](#_drag)) that received the initiating input event. This is often appropriate when dragging SVG or HTML elements, since those elements are typically positioned relative to a parent. For dragging graphical elements with a Canvas, however, you may want to redefine the container as the initiating element itself: + +```js +function container() { + return this; +} +``` + +Alternatively, the container may be specified as the element directly, such as `drag.container(canvas)`. + + +# drag.filter([filter]) · [Source](https://github.com/d3/d3-drag/blob/master/src/drag.js), [Examples](https://observablehq.com/d/c55a5839a5bb7c73) + +If *filter* is specified, sets the event filter to the specified function and returns the drag behavior. If *filter* is not specified, returns the current filter, which defaults to: + +```js +function filter(event) { + return !event.ctrlKey && !event.button; +} +``` + +If the filter returns falsey, the initiating event is ignored and no drag gestures are started. Thus, the filter determines which input events are ignored; the default filter ignores mousedown events on secondary buttons, since those buttons are typically intended for other purposes, such as the context menu. + +# drag.touchable([touchable]) · [Source](https://github.com/d3/d3-drag/blob/master/src/drag.js), [Examples](https://observablehq.com/d/c55a5839a5bb7c73) + +If *touchable* is specified, sets the touch support detector to the specified function and returns the drag behavior. If *touchable* is not specified, returns the current touch support detector, which defaults to: + +```js +function touchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} +``` + +Touch event listeners are only registered if the detector returns truthy for the corresponding element when the drag behavior is [applied](#_drag). The default detector works well for most browsers that are capable of touch input, but not all; Chrome’s mobile device emulator, for example, fails detection. + +# drag.subject([subject]) · [Source](https://github.com/d3/d3-drag/blob/master/src/drag.js), [Examples](https://observablehq.com/collection/@d3/d3-drag) + +If *subject* is specified, sets the subject accessor to the specified object or function and returns the drag behavior. If *subject* is not specified, returns the current subject accessor, which defaults to: + +```js +function subject(event, d) { + return d == null ? {x: event.x, y: event.y} : d; +} +``` + +The *subject* of a drag gesture represents *the thing being dragged*. It is computed when an initiating input event is received, such as a mousedown or touchstart, immediately before the drag gesture starts. The subject is then exposed as *event*.subject on subsequent [drag events](#drag-events) for this gesture. + +The default subject is the [datum](https://github.com/d3/d3-selection#selection_datum) of the element in the originating selection (see [*drag*](#_drag)) that received the initiating input event; if this datum is undefined, an object representing the coordinates of the pointer is created. When dragging circle elements in SVG, the default subject is thus the datum of the circle being dragged. With [Canvas](https://html.spec.whatwg.org/multipage/scripting.html#the-canvas-element), the default subject is the canvas element’s datum (regardless of where on the canvas you click). In this case, a custom subject accessor would be more appropriate, such as one that picks the closest circle to the mouse within a given search *radius*: + +```js +function subject(event) { + var n = circles.length, + i, + dx, + dy, + d2, + s2 = radius * radius, + circle, + subject; + + for (i = 0; i < n; ++i) { + circle = circles[i]; + dx = event.x - circle.x; + dy = event.y - circle.y; + d2 = dx * dx + dy * dy; + if (d2 < s2) subject = circle, s2 = d2; + } + + return subject; +} +``` + +(If necessary, the above can be accelerated using [*quadtree*.find](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_find), [*simulation*.find](https://github.com/d3/d3-force/blob/master/README.md#simulation_find) or [*delaunay*.find](https://github.com/d3/d3-delaunay/blob/master/README.md#delaunay_find).) + +The returned subject should be an object that exposes `x` and `y` properties, so that the relative position of the subject and the pointer can be preserved during the drag gesture. If the subject is null or undefined, no drag gesture is started for this pointer; however, other starting touches may yet start drag gestures. See also [*drag*.filter](#drag_filter). + +The subject of a drag gesture may not be changed after the gesture starts. The subject accessor is invoked with the same context and arguments as [*selection*.on](https://github.com/d3/d3-selection#selection_on) listeners: the current event (`event`) and datum `d`, with the `this` context as the current DOM element. During the evaluation of the subject accessor, `event` is a beforestart [drag event](#drag-events). Use *event*.sourceEvent to access the initiating input event and *event*.identifier to access the touch identifier. The *event*.x and *event*.y are relative to the [container](#drag_container), and are computed using [d3.pointer](https://github.com/d3/d3-selection#pointer). + +# drag.clickDistance([distance]) · [Source](https://github.com/d3/d3-drag/blob/master/src/drag.js) + +If *distance* is specified, sets the maximum distance that the mouse can move between mousedown and mouseup that will trigger a subsequent click event. If at any point between mousedown and mouseup the mouse is greater than or equal to *distance* from its position on mousedown, the click event following mouseup will be suppressed. If *distance* is not specified, returns the current distance threshold, which defaults to zero. The distance threshold is measured in client coordinates ([*event*.clientX](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientX) and [*event*.clientY](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientY)). + +# drag.on(typenames, [listener]) · [Source](https://github.com/d3/d3-drag/blob/master/src/drag.js) + +If *listener* is specified, sets the event *listener* for the specified *typenames* and returns the drag behavior. If an event listener was already registered for the same type and name, the existing listener is removed before the new listener is added. If *listener* is null, removes the current event listeners for the specified *typenames*, if any. If *listener* is not specified, returns the first currently-assigned listener matching the specified *typenames*, if any. When a specified event is dispatched, each *listener* will be invoked with the same context and arguments as [*selection*.on](https://github.com/d3/d3-selection#selection_on) listeners: the current event (`event`) and datum `d`, with the `this` context as the current DOM element. + +The *typenames* is a string containing one or more *typename* separated by whitespace. Each *typename* is a *type*, optionally followed by a period (`.`) and a *name*, such as `drag.foo` and `drag.bar`; the name allows multiple listeners to be registered for the same *type*. The *type* must be one of the following: + +* `start` - after a new pointer becomes active (on mousedown or touchstart). +* `drag` - after an active pointer moves (on mousemove or touchmove). +* `end` - after an active pointer becomes inactive (on mouseup, touchend or touchcancel). + +See [*dispatch*.on](https://github.com/d3/d3-dispatch#dispatch_on) for more. + +Changes to registered listeners via *drag*.on during a drag gesture *do not affect* the current drag gesture. Instead, you must use [*event*.on](#event_on), which also allows you to register temporary event listeners for the current drag gesture. **Separate events are dispatched for each active pointer** during a drag gesture. For example, if simultaneously dragging multiple subjects with multiple fingers, a start event is dispatched for each finger, even if both fingers start touching simultaneously. See [Drag Events](#drag-events) for more. + +# d3.dragDisable(window) · [Source](https://github.com/d3/d3-drag/blob/master/src/nodrag.js) + +Prevents native drag-and-drop and text selection on the specified *window*. As an alternative to preventing the default action of mousedown events (see [#9](https://github.com/d3/d3-drag/issues/9)), this method prevents undesirable default actions following mousedown. In supported browsers, this means capturing dragstart and selectstart events, preventing the associated default actions, and immediately stopping their propagation. In browsers that do not support selection events, the user-select CSS property is set to none on the document element. This method is intended to be called on mousedown, followed by [d3.dragEnable](#dragEnable) on mouseup. + +# d3.dragEnable(window[, noclick]) · [Source](https://github.com/d3/d3-drag/blob/master/src/nodrag.js) + +Allows native drag-and-drop and text selection on the specified *window*; undoes the effect of [d3.dragDisable](#dragDisable). This method is intended to be called on mouseup, preceded by [d3.dragDisable](#dragDisable) on mousedown. If *noclick* is true, this method also temporarily suppresses click events. The suppression of click events expires after a zero-millisecond timeout, such that it only suppress the click event that would immediately follow the current mouseup event, if any. + +### Drag Events + +When a [drag event listener](#drag_on) is invoked, it receives the current drag event as its first argument. The *event* object exposes several fields: + +* `target` - the associated [drag behavior](#drag). +* `type` - the string “startâ€, “drag†or “endâ€; see [*drag*.on](#drag_on). +* `subject` - the drag subject, defined by [*drag*.subject](#drag_subject). +* `x` - the new *x*-coordinate of the subject; see [*drag*.container](#drag_container). +* `y` - the new *y*-coordinate of the subject; see [*drag*.container](#drag_container). +* `dx` - the change in *x*-coordinate since the previous drag event. +* `dy` - the change in *y*-coordinate since the previous drag event. +* `identifier` - the string “mouseâ€, or a numeric [touch identifier](https://www.w3.org/TR/touch-events/#widl-Touch-identifier). +* `active` - the number of currently active drag gestures (on start and end, not including this one). +* `sourceEvent` - the underlying input event, such as mousemove or touchmove. + +The *event*.active field is useful for detecting the first start event and the last end event in a sequence of concurrent drag gestures: it is zero when the first drag gesture starts, and zero when the last drag gesture ends. + +The *event* object also exposes the [*event*.on](#event_on) method. + +# event.on(typenames, [listener]) · [Source](https://github.com/d3/d3-drag/blob/master/src/event.js) + +Equivalent to [*drag*.on](#drag_on), but only applies to the current drag gesture. Before the drag gesture starts, a [copy](https://github.com/d3/d3-dispatch#dispatch_copy) of the current drag [event listeners](#drag_on) is made. This copy is bound to the current drag gesture and modified by *event*.on. This is useful for temporary listeners that only receive events for the current drag gesture. For example, this start event listener registers temporary drag and end event listeners as closures: + +```js +function started(event) { + var circle = d3.select(this).classed("dragging", true); + + event.on("drag", dragged).on("end", ended); + + function dragged(event, d) { + circle.raise().attr("cx", d.x = event.x).attr("cy", d.y = event.y); + } + + function ended() { + circle.classed("dragging", false); + } +} +``` diff --git a/node_modules/d3-drag/dist/d3-drag.js b/node_modules/d3-drag/dist/d3-drag.js new file mode 100644 index 00000000..b63be970 --- /dev/null +++ b/node_modules/d3-drag/dist/d3-drag.js @@ -0,0 +1,266 @@ +// https://d3js.org/d3-drag/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-selection')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-selection'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3)); +}(this, function (exports, d3Dispatch, d3Selection) { 'use strict'; + +function nopropagation(event) { + event.stopImmediatePropagation(); +} + +function noevent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +function nodrag(view) { + var root = view.document.documentElement, + selection = d3Selection.select(view).on("dragstart.drag", noevent, true); + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } +} + +function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = d3Selection.select(view).on("dragstart.drag", null); + if (noclick) { + selection.on("click.drag", noevent, true); + setTimeout(function() { selection.on("click.drag", null); }, 0); + } + if ("onselectstart" in root) { + selection.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } +} + +var constant = x => () => x; + +function DragEvent(type, { + sourceEvent, + subject, + target, + identifier, + active, + x, y, dx, dy, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + subject: {value: subject, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + identifier: {value: identifier, enumerable: true, configurable: true}, + active: {value: active, enumerable: true, configurable: true}, + x: {value: x, enumerable: true, configurable: true}, + y: {value: y, enumerable: true, configurable: true}, + dx: {value: dx, enumerable: true, configurable: true}, + dy: {value: dy, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} + +DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; +}; + +// Ignore right-click, since that should open the context menu. +function defaultFilter(event) { + return !event.ctrlKey && !event.button; +} + +function defaultContainer() { + return this.parentNode; +} + +function defaultSubject(event, d) { + return d == null ? {x: event.x, y: event.y} : d; +} + +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function drag() { + var filter = defaultFilter, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable, + gestures = {}, + listeners = d3Dispatch.dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; + + function drag(selection) { + selection + .on("mousedown.drag", mousedowned) + .filter(touchable) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + function mousedowned(event, d) { + if (touchending || !filter.call(this, event, d)) return; + var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); + if (!gesture) return; + d3Selection.select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + nodrag(event.view); + nopropagation(event); + mousemoving = false; + mousedownx = event.clientX; + mousedowny = event.clientY; + gesture("start", event); + } + + function mousemoved(event) { + noevent(event); + if (!mousemoving) { + var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag", event); + } + + function mouseupped(event) { + d3Selection.select(event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(event.view, mousemoving); + noevent(event); + gestures.mouse("end", event); + } + + function touchstarted(event, d) { + if (!filter.call(this, event, d)) return; + var touches = event.changedTouches, + c = container.call(this, event, d), + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) { + nopropagation(event); + gesture("start", event, touches[i]); + } + } + } + + function touchmoved(event) { + var touches = event.changedTouches, + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent(event); + gesture("drag", event, touches[i]); + } + } + } + + function touchended(event) { + var touches = event.changedTouches, + n = touches.length, i, gesture; + + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(event); + gesture("end", event, touches[i]); + } + } + } + + function beforestart(that, container, event, d, identifier, touch) { + var dispatch = listeners.copy(), + p = d3Selection.pointer(touch || event, container), dx, dy, + s; + + if ((s = subject.call(that, new DragEvent("beforestart", { + sourceEvent: event, + target: drag, + identifier, + active, + x: p[0], + y: p[1], + dx: 0, + dy: 0, + dispatch + }), d)) == null) return; + + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + + return function gesture(type, event, touch) { + var p0 = p, n; + switch (type) { + case "start": gestures[identifier] = gesture, n = active++; break; + case "end": delete gestures[identifier], --active; // nobreak + case "drag": p = d3Selection.pointer(touch || event, container), n = active; break; + } + dispatch.call( + type, + that, + new DragEvent(type, { + sourceEvent: event, + subject: s, + target: drag, + identifier, + active: n, + x: p[0] + dx, + y: p[1] + dy, + dx: p[0] - p0[0], + dy: p[1] - p0[1], + dispatch + }), + d + ); + }; + } + + drag.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), drag) : filter; + }; + + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant(_), drag) : container; + }; + + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant(_), drag) : subject; + }; + + drag.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), drag) : touchable; + }; + + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + + return drag; +} + +exports.drag = drag; +exports.dragDisable = nodrag; +exports.dragEnable = yesdrag; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-drag/dist/d3-drag.min.js b/node_modules/d3-drag/dist/d3-drag.min.js new file mode 100644 index 00000000..a489e35e --- /dev/null +++ b/node_modules/d3-drag/dist/d3-drag.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-drag/ v2.0.0 Copyright 2020 Mike Bostock +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-dispatch"),require("d3-selection")):"function"==typeof define&&define.amd?define(["exports","d3-dispatch","d3-selection"],t):t((e=e||self).d3=e.d3||{},e.d3,e.d3)}(this,function(e,t,n){"use strict";function o(e){e.stopImmediatePropagation()}function r(e){e.preventDefault(),e.stopImmediatePropagation()}function i(e){var t=e.document.documentElement,o=n.select(e).on("dragstart.drag",r,!0);"onselectstart"in t?o.on("selectstart.drag",r,!0):(t.__noselect=t.style.MozUserSelect,t.style.MozUserSelect="none")}function a(e,t){var o=e.document.documentElement,i=n.select(e).on("dragstart.drag",null);t&&(i.on("click.drag",r,!0),setTimeout(function(){i.on("click.drag",null)},0)),"onselectstart"in o?i.on("selectstart.drag",null):(o.style.MozUserSelect=o.__noselect,delete o.__noselect)}var u=e=>()=>e;function c(e,{sourceEvent:t,subject:n,target:o,identifier:r,active:i,x:a,y:u,dx:c,dy:l,dispatch:s}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:o,enumerable:!0,configurable:!0},identifier:{value:r,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:u,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:s}})}function l(e){return!e.ctrlKey&&!e.button}function s(){return this.parentNode}function d(e,t){return null==t?{x:e.x,y:e.y}:t}function f(){return navigator.maxTouchPoints||"ontouchstart"in this}c.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e},e.drag=function(){var e,g,h,v,m=l,p=s,b=d,y=f,x={},_=t.dispatch("start","drag","end"),w=0,j=0;function E(e){e.on("mousedown.drag",T).filter(y).on("touchstart.drag",P).on("touchmove.drag",q).on("touchend.drag touchcancel.drag",z).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function T(t,r){if(!v&&m.call(this,t,r)){var a=D(this,p.call(this,t,r),t,r,"mouse");a&&(n.select(t.view).on("mousemove.drag",k,!0).on("mouseup.drag",M,!0),i(t.view),o(t),h=!1,e=t.clientX,g=t.clientY,a("start",t))}}function k(t){if(r(t),!h){var n=t.clientX-e,o=t.clientY-g;h=n*n+o*o>j}x.mouse("drag",t)}function M(e){n.select(e.view).on("mousemove.drag mouseup.drag",null),a(e.view,h),r(e),x.mouse("end",e)}function P(e,t){if(m.call(this,e,t)){var n,r,i=e.changedTouches,a=p.call(this,e,t),u=i.length;for(n=0;n () => x; diff --git a/node_modules/d3-drag/src/drag.js b/node_modules/d3-drag/src/drag.js new file mode 100644 index 00000000..3b84e0f2 --- /dev/null +++ b/node_modules/d3-drag/src/drag.js @@ -0,0 +1,192 @@ +import {dispatch} from "d3-dispatch"; +import {select, pointer} from "d3-selection"; +import nodrag, {yesdrag} from "./nodrag.js"; +import noevent, {nopropagation} from "./noevent.js"; +import constant from "./constant.js"; +import DragEvent from "./event.js"; + +// Ignore right-click, since that should open the context menu. +function defaultFilter(event) { + return !event.ctrlKey && !event.button; +} + +function defaultContainer() { + return this.parentNode; +} + +function defaultSubject(event, d) { + return d == null ? {x: event.x, y: event.y} : d; +} + +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +export default function() { + var filter = defaultFilter, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable, + gestures = {}, + listeners = dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; + + function drag(selection) { + selection + .on("mousedown.drag", mousedowned) + .filter(touchable) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + function mousedowned(event, d) { + if (touchending || !filter.call(this, event, d)) return; + var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); + if (!gesture) return; + select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + nodrag(event.view); + nopropagation(event); + mousemoving = false; + mousedownx = event.clientX; + mousedowny = event.clientY; + gesture("start", event); + } + + function mousemoved(event) { + noevent(event); + if (!mousemoving) { + var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag", event); + } + + function mouseupped(event) { + select(event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(event.view, mousemoving); + noevent(event); + gestures.mouse("end", event); + } + + function touchstarted(event, d) { + if (!filter.call(this, event, d)) return; + var touches = event.changedTouches, + c = container.call(this, event, d), + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) { + nopropagation(event); + gesture("start", event, touches[i]); + } + } + } + + function touchmoved(event) { + var touches = event.changedTouches, + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent(event); + gesture("drag", event, touches[i]); + } + } + } + + function touchended(event) { + var touches = event.changedTouches, + n = touches.length, i, gesture; + + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(event); + gesture("end", event, touches[i]); + } + } + } + + function beforestart(that, container, event, d, identifier, touch) { + var dispatch = listeners.copy(), + p = pointer(touch || event, container), dx, dy, + s; + + if ((s = subject.call(that, new DragEvent("beforestart", { + sourceEvent: event, + target: drag, + identifier, + active, + x: p[0], + y: p[1], + dx: 0, + dy: 0, + dispatch + }), d)) == null) return; + + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + + return function gesture(type, event, touch) { + var p0 = p, n; + switch (type) { + case "start": gestures[identifier] = gesture, n = active++; break; + case "end": delete gestures[identifier], --active; // nobreak + case "drag": p = pointer(touch || event, container), n = active; break; + } + dispatch.call( + type, + that, + new DragEvent(type, { + sourceEvent: event, + subject: s, + target: drag, + identifier, + active: n, + x: p[0] + dx, + y: p[1] + dy, + dx: p[0] - p0[0], + dy: p[1] - p0[1], + dispatch + }), + d + ); + }; + } + + drag.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), drag) : filter; + }; + + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant(_), drag) : container; + }; + + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant(_), drag) : subject; + }; + + drag.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), drag) : touchable; + }; + + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + + return drag; +} diff --git a/node_modules/d3-drag/src/event.js b/node_modules/d3-drag/src/event.js new file mode 100644 index 00000000..5f246fea --- /dev/null +++ b/node_modules/d3-drag/src/event.js @@ -0,0 +1,28 @@ +export default function DragEvent(type, { + sourceEvent, + subject, + target, + identifier, + active, + x, y, dx, dy, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + subject: {value: subject, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + identifier: {value: identifier, enumerable: true, configurable: true}, + active: {value: active, enumerable: true, configurable: true}, + x: {value: x, enumerable: true, configurable: true}, + y: {value: y, enumerable: true, configurable: true}, + dx: {value: dx, enumerable: true, configurable: true}, + dy: {value: dy, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} + +DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; +}; diff --git a/node_modules/d3-drag/src/index.js b/node_modules/d3-drag/src/index.js new file mode 100644 index 00000000..d2dd6019 --- /dev/null +++ b/node_modules/d3-drag/src/index.js @@ -0,0 +1,2 @@ +export {default as drag} from "./drag.js"; +export {default as dragDisable, yesdrag as dragEnable} from "./nodrag.js"; diff --git a/node_modules/d3-drag/src/nodrag.js b/node_modules/d3-drag/src/nodrag.js new file mode 100644 index 00000000..eab81d3b --- /dev/null +++ b/node_modules/d3-drag/src/nodrag.js @@ -0,0 +1,28 @@ +import {select} from "d3-selection"; +import noevent from "./noevent.js"; + +export default function(view) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", noevent, true); + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } +} + +export function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", null); + if (noclick) { + selection.on("click.drag", noevent, true); + setTimeout(function() { selection.on("click.drag", null); }, 0); + } + if ("onselectstart" in root) { + selection.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } +} diff --git a/node_modules/d3-drag/src/noevent.js b/node_modules/d3-drag/src/noevent.js new file mode 100644 index 00000000..b32552dc --- /dev/null +++ b/node_modules/d3-drag/src/noevent.js @@ -0,0 +1,8 @@ +export function nopropagation(event) { + event.stopImmediatePropagation(); +} + +export default function(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} diff --git a/node_modules/d3-dsv/LICENSE b/node_modules/d3-dsv/LICENSE new file mode 100644 index 00000000..3d0802c3 --- /dev/null +++ b/node_modules/d3-dsv/LICENSE @@ -0,0 +1,27 @@ +Copyright 2013-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-dsv/README.md b/node_modules/d3-dsv/README.md new file mode 100644 index 00000000..c348489f --- /dev/null +++ b/node_modules/d3-dsv/README.md @@ -0,0 +1,482 @@ +# d3-dsv + +This module provides a parser and formatter for delimiter-separated values, most commonly [comma-](https://en.wikipedia.org/wiki/Comma-separated_values) (CSV) or tab-separated values (TSV). These tabular formats are popular with spreadsheet programs such as Microsoft Excel, and are often more space-efficient than JSON. This implementation is based on [RFC 4180](http://tools.ietf.org/html/rfc4180). + +Comma (CSV) and tab (TSV) delimiters are built-in. For example, to parse: + +```js +d3.csvParse("foo,bar\n1,2"); // [{foo: "1", bar: "2"}, columns: ["foo", "bar"]] +d3.tsvParse("foo\tbar\n1\t2"); // [{foo: "1", bar: "2"}, columns: ["foo", "bar"]] +``` + +Or to format: + +```js +d3.csvFormat([{foo: "1", bar: "2"}]); // "foo,bar\n1,2" +d3.tsvFormat([{foo: "1", bar: "2"}]); // "foo\tbar\n1\t2" +``` + +To use a different delimiter, such as “|†for pipe-separated values, use [d3.dsvFormat](#dsvFormat): + +```js +var psv = d3.dsvFormat("|"); + +console.log(psv.parse("foo|bar\n1|2")); // [{foo: "1", bar: "2"}, columns: ["foo", "bar"]] +``` + +For easy loading of DSV files in a browser, see [d3-fetch](https://github.com/d3/d3-fetch)’s [d3.csv](https://github.com/d3/d3-fetch/blob/master/README.md#csv) and [d3.tsv](https://github.com/d3/d3-fetch/blob/master/README.md#tsv) methods. + +## Installing + +If you use NPM, `npm install d3-dsv`. Otherwise, download the [latest release](https://github.com/d3/d3-dsv/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-dsv.v1.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +[Try d3-dsv in your browser.](https://tonicdev.com/npm/d3-dsv) + +## API Reference + +# d3.csvParse(string[, row]) [<>](https://github.com/d3/d3-dsv/blob/master/src/csv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)(",").[parse](#dsv_parse). Note: requires unsafe-eval [content security policy](#content-security-policy). + +# d3.csvParseRows(string[, row]) [<>](https://github.com/d3/d3-dsv/blob/master/src/csv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)(",").[parseRows](#dsv_parseRows). + +# d3.csvFormat(rows[, columns]) [<>](https://github.com/d3/d3-dsv/blob/master/src/csv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)(",").[format](#dsv_format). + +# d3.csvFormatBody(rows[, columns]) [<>](https://github.com/d3/d3-dsv/blob/master/src/csv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)(",").[formatBody](#dsv_formatBody). + +# d3.csvFormatRows(rows) [<>](https://github.com/d3/d3-dsv/blob/master/src/csv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)(",").[formatRows](#dsv_formatRows). + +# d3.csvFormatRow(row) [<>](https://github.com/d3/d3-dsv/blob/master/src/csv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)(",").[formatRow](#dsv_formatRow). + +# d3.csvFormatValue(value) [<>](https://github.com/d3/d3-dsv/blob/master/src/csv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)(",").[formatValue](#dsv_formatValue). + +# d3.tsvParse(string[, row]) [<>](https://github.com/d3/d3-dsv/blob/master/src/tsv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)("\t").[parse](#dsv_parse). Note: requires unsafe-eval [content security policy](#content-security-policy). + +# d3.tsvParseRows(string[, row]) [<>](https://github.com/d3/d3-dsv/blob/master/src/tsv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)("\t").[parseRows](#dsv_parseRows). + +# d3.tsvFormat(rows[, columns]) [<>](https://github.com/d3/d3-dsv/blob/master/src/tsv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)("\t").[format](#dsv_format). + +# d3.tsvFormatBody(rows[, columns]) [<>](https://github.com/d3/d3-dsv/blob/master/src/tsv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)("\t").[formatBody](#dsv_formatBody). + +# d3.tsvFormatRows(rows) [<>](https://github.com/d3/d3-dsv/blob/master/src/tsv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)("\t").[formatRows](#dsv_formatRows). + +# d3.tsvFormatRow(row) [<>](https://github.com/d3/d3-dsv/blob/master/src/tsv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)("\t").[formatRow](#dsv_formatRow). + +# d3.tsvFormatValue(value) [<>](https://github.com/d3/d3-dsv/blob/master/src/tsv.js "Source") + +Equivalent to [dsvFormat](#dsvFormat)("\t").[formatValue](#dsv_formatValue). + +# d3.dsvFormat(delimiter) [<>](https://github.com/d3/d3-dsv/blob/master/src/dsv.js) + +Constructs a new DSV parser and formatter for the specified *delimiter*. The *delimiter* must be a single character (*i.e.*, a single 16-bit code unit); so, ASCII delimiters are fine, but emoji delimiters are not. + +# *dsv*.parse(string[, row]) [<>](https://github.com/d3/d3-dsv/blob/master/src/dsv.js "Source") + +Parses the specified *string*, which must be in the delimiter-separated values format with the appropriate delimiter, returning an array of objects representing the parsed rows. + +Unlike [*dsv*.parseRows](#dsv_parseRows), this method requires that the first line of the DSV content contains a delimiter-separated list of column names; these column names become the attributes on the returned objects. For example, consider the following CSV file: + +``` +Year,Make,Model,Length +1997,Ford,E350,2.34 +2000,Mercury,Cougar,2.38 +``` + +The resulting JavaScript array is: + +```js +[ + {"Year": "1997", "Make": "Ford", "Model": "E350", "Length": "2.34"}, + {"Year": "2000", "Make": "Mercury", "Model": "Cougar", "Length": "2.38"} +] +``` + +The returned array also exposes a `columns` property containing the column names in input order (in contrast to Object.keys, whose iteration order is arbitrary). For example: + +```js +data.columns; // ["Year", "Make", "Model", "Length"] +``` + +If the column names are not unique, only the last value is returned for each name; to access all values, use [*dsv*.parseRows](#dsv_parseRows) instead (see [example](https://observablehq.com/@d3/parse-csv-with-duplicate-column-names)). + +If a *row* conversion function is not specified, field values are strings. For safety, there is no automatic conversion to numbers, dates, or other types. In some cases, JavaScript may coerce strings to numbers for you automatically (for example, using the `+` operator), but better is to specify a *row* conversion function. See [d3.autoType](#autoType) for a convenient *row* conversion function that infers and coerces common types like numbers and strings. + +If a *row* conversion function is specified, the specified function is invoked for each row, being passed an object representing the current row (`d`), the index (`i`) starting at zero for the first non-header row, and the array of column names. If the returned value is null or undefined, the row is skipped and will be omitted from the array returned by *dsv*.parse; otherwise, the returned value defines the corresponding row object. For example: + +```js +var data = d3.csvParse(string, function(d) { + return { + year: new Date(+d.Year, 0, 1), // lowercase and convert "Year" to Date + make: d.Make, // lowercase + model: d.Model, // lowercase + length: +d.Length // lowercase and convert "Length" to number + }; +}); +``` + +Note: using `+` rather than [parseInt](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/parseInt) or [parseFloat](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/parseFloat) is typically faster, though more restrictive. For example, `"30px"` when coerced using `+` returns `NaN`, while parseInt and parseFloat return `30`. + +Note: requires unsafe-eval [content security policy](#content-security-policy). + +# dsv.parseRows(string[, row]) [<>](https://github.com/d3/d3-dsv/blob/master/src/dsv.js "Source") + +Parses the specified *string*, which must be in the delimiter-separated values format with the appropriate delimiter, returning an array of arrays representing the parsed rows. + +Unlike [*dsv*.parse](#dsv_parse), this method treats the header line as a standard row, and should be used whenever DSV content does not contain a header. Each row is represented as an array rather than an object. Rows may have variable length. For example, consider the following CSV file, which notably lacks a header line: + +``` +1997,Ford,E350,2.34 +2000,Mercury,Cougar,2.38 +``` + +The resulting JavaScript array is: + +```js +[ + ["1997", "Ford", "E350", "2.34"], + ["2000", "Mercury", "Cougar", "2.38"] +] +``` + +If a *row* conversion function is not specified, field values are strings. For safety, there is no automatic conversion to numbers, dates, or other types. In some cases, JavaScript may coerce strings to numbers for you automatically (for example, using the `+` operator), but better is to specify a *row* conversion function. See [d3.autoType](#autoType) for a convenient *row* conversion function that infers and coerces common types like numbers and strings. + +If a *row* conversion function is specified, the specified function is invoked for each row, being passed an array representing the current row (`d`), the index (`i`) starting at zero for the first row, and the array of column names. If the returned value is null or undefined, the row is skipped and will be omitted from the array returned by *dsv*.parse; otherwise, the returned value defines the corresponding row object. For example: + +```js +var data = d3.csvParseRows(string, function(d, i) { + return { + year: new Date(+d[0], 0, 1), // convert first colum column to Date + make: d[1], + model: d[2], + length: +d[3] // convert fourth column to number + }; +}); +``` + +In effect, *row* is similar to applying a [map](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map) and [filter](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter) operator to the returned rows. + +# dsv.format(rows[, columns]) [<>](https://github.com/d3/d3-dsv/blob/master/src/dsv.js "Source") + +Formats the specified array of object *rows* as delimiter-separated values, returning a string. This operation is the inverse of [*dsv*.parse](#dsv_parse). Each row will be separated by a newline (`\n`), and each column within each row will be separated by the delimiter (such as a comma, `,`). Values that contain either the delimiter, a double-quote (`"`) or a newline will be escaped using double-quotes. + +If *columns* is not specified, the list of column names that forms the header row is determined by the union of all properties on all objects in *rows*; the order of columns is nondeterministic. If *columns* is specified, it is an array of strings representing the column names. For example: + +```js +var string = d3.csvFormat(data, ["year", "make", "model", "length"]); +``` + +All fields on each row object will be coerced to strings. If the field value is null or undefined, the empty string is used. If the field value is a Date, the [ECMAScript date-time string format](https://www.ecma-international.org/ecma-262/9.0/index.html#sec-date-time-string-format) (a subset of ISO 8601) is used: for example, dates at UTC midnight are formatted as `YYYY-MM-DD`. For more control over which and how fields are formatted, first map *rows* to an array of array of string, and then use [*dsv*.formatRows](#dsv_formatRows). + +# dsv.formatBody(rows[, columns]) [<>](https://github.com/d3/d3-dsv/blob/master/src/dsv.js "Source") + +Equivalent to [*dsv*.format](#dsv_format), but omits the header row. This is useful, for example, when appending rows to an existing file. + +# dsv.formatRows(rows) [<>](https://github.com/d3/d3-dsv/blob/master/src/dsv.js "Source") + +Formats the specified array of array of string *rows* as delimiter-separated values, returning a string. This operation is the reverse of [*dsv*.parseRows](#dsv_parseRows). Each row will be separated by a newline (`\n`), and each column within each row will be separated by the delimiter (such as a comma, `,`). Values that contain either the delimiter, a double-quote (") or a newline will be escaped using double-quotes. + +To convert an array of objects to an array of arrays while explicitly specifying the columns, use [*array*.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map). For example: + +```js +var string = d3.csvFormatRows(data.map(function(d, i) { + return [ + d.year.getFullYear(), // Assuming d.year is a Date object. + d.make, + d.model, + d.length + ]; +})); +``` + +If you like, you can also [*array*.concat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat) this result with an array of column names to generate the first row: + +```js +var string = d3.csvFormatRows([[ + "year", + "make", + "model", + "length" + ]].concat(data.map(function(d, i) { + return [ + d.year.getFullYear(), // Assuming d.year is a Date object. + d.make, + d.model, + d.length + ]; +}))); +``` + +# dsv.formatRow(row) [<>](https://github.com/d3/d3-dsv/blob/master/src/dsv.js "Source") + +Formats a single array *row* of strings as delimiter-separated values, returning a string. Each column within the row will be separated by the delimiter (such as a comma, `,`). Values that contain either the delimiter, a double-quote (") or a newline will be escaped using double-quotes. + +# dsv.formatValue(value) [<>](https://github.com/d3/d3-dsv/blob/master/src/dsv.js "Source") + +Format a single *value* or string as a delimiter-separated value, returning a string. A value that contains either the delimiter, a double-quote (") or a newline will be escaped using double-quotes. + +# d3.autoType(object) [<>](https://github.com/d3/d3-dsv/blob/master/src/autoType.js "Source") + +Given an *object* (or array) representing a parsed row, infers the types of values on the *object* and coerces them accordingly, returning the mutated *object*. This function is intended to be used as a *row* accessor function in conjunction with [*dsv*.parse](#dsv_parse) and [*dsv*.parseRows](#dsv_parseRow). For example, consider the following CSV file: + +``` +Year,Make,Model,Length +1997,Ford,E350,2.34 +2000,Mercury,Cougar,2.38 +``` + +When used with [d3.csvParse](#csvParse), + +```js +d3.csvParse(string, d3.autoType) +``` + +the resulting JavaScript array is: + +```js +[ + {"Year": 1997, "Make": "Ford", "Model": "E350", "Length": 2.34}, + {"Year": 2000, "Make": "Mercury", "Model": "Cougar", "Length": 2.38} +] +``` + +Type inference works as follows. For each *value* in the given *object*, the [trimmed](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim) value is computed; the value is then re-assigned as follows: + +1. If empty, then `null`. +1. If exactly `"true"`, then `true`. +1. If exactly `"false"`, then `false`. +1. If exactly `"NaN"`, then `NaN`. +1. Otherwise, if [coercible to a number](https://www.ecma-international.org/ecma-262/9.0/index.html#sec-tonumber-applied-to-the-string-type), then a number. +1. Otherwise, if a [date-only or date-time string](https://www.ecma-international.org/ecma-262/9.0/index.html#sec-date-time-string-format), then a Date. +1. Otherwise, a string (the original untrimmed value). + +Values with leading zeroes may be coerced to numbers; for example `"08904"` coerces to `8904`. However, extra characters such as commas or units (*e.g.*, `"$1.00"`, `"(123)"`, `"1,234"` or `"32px"`) will prevent number coercion, resulting in a string. + +Date strings must be in ECMAScript’s subset of the [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601). When a date-only string such as YYYY-MM-DD is specified, the inferred time is midnight UTC; however, if a date-time string such as YYYY-MM-DDTHH:MM is specified without a time zone, it is assumed to be local time. + +Automatic type inference is primarily intended to provide safe, predictable behavior in conjunction with [*dsv*.format](#dsv_format) and [*dsv*.formatRows](#dsv_formatRows) for common JavaScript types. If you need different behavior, you should implement your own row accessor function. + +For more, see [the d3.autoType notebook](https://observablehq.com/@d3/d3-autotype). + +### Content Security Policy + +If a [content security policy](http://www.w3.org/TR/CSP/) is in place, note that [*dsv*.parse](#dsv_parse) requires `unsafe-eval` in the `script-src` directive, due to the (safe) use of dynamic code generation for fast parsing. (See [source](https://github.com/d3/d3-dsv/blob/master/src/dsv.js).) Alternatively, use [*dsv*.parseRows](#dsv_parseRows). + +### Byte-Order Marks + +DSV files sometimes begin with a [byte order mark (BOM)](https://en.wikipedia.org/wiki/Byte_order_mark); saving a spreadsheet in CSV UTF-8 format from Microsoft Excel, for example, will include a BOM. On the web this is not usually a problem because the [UTF-8 decode algorithm](https://encoding.spec.whatwg.org/#utf-8-decode) specified in the Encoding standard removes the BOM. Node.js, on the other hand, [does not remove the BOM](https://github.com/nodejs/node-v0.x-archive/issues/1918) when decoding UTF-8. + +If the BOM is not removed, the first character of the text is a zero-width non-breaking space. So if a CSV file with a BOM is parsed by [d3.csvParse](#csvParse), the first column’s name will begin with a zero-width non-breaking space. This can be hard to spot since this character is usually invisible when printed. + +To remove the BOM before parsing, consider using [strip-bom](https://www.npmjs.com/package/strip-bom). + +## Command Line Reference + +### dsv2dsv + +# dsv2dsv [options…] [file] + +Converts the specified DSV input *file* to DSV (typically with a different delimiter or encoding). If *file* is not specified, defaults to reading from stdin. For example, to convert to CSV to TSV: + +``` +csv2tsv < example.csv > example.tsv +``` + +To convert windows-1252 CSV to utf-8 CSV: + +``` +dsv2dsv --input-encoding windows-1252 < latin1.csv > utf8.csv +``` + +# dsv2dsv -h +
# dsv2dsv --help + +Output usage information. + +# dsv2dsv -V +
# dsv2dsv --version + +Output the version number. + +# dsv2dsv -o file +
# dsv2dsv --out file + +Specify the output file name. Defaults to “-†for stdout. + +# dsv2dsv -r delimiter +
# dsv2dsv --input-delimiter delimiter + +Specify the input delimiter character. Defaults to “,†for reading CSV. (You can enter a tab on the command line by typing ⌃V.) + +# dsv2dsv --input-encoding encoding + +Specify the input character encoding. Defaults to “utf8â€. + +# dsv2dsv -w delimiter +
# dsv2dsv --output-delimiter delimiter + +Specify the output delimiter character. Defaults to “,†for writing CSV. (You can enter a tab on the command line by typing ⌃V.) + +# dsv2dsv --output-encoding encoding + +Specify the output character encoding. Defaults to “utf8â€. + +# csv2tsv [options…] [file] + +Equivalent to [dsv2dsv](#dsv2dsv), but the [output delimiter](#dsv2dsv_output_delimiter) defaults to the tab character (\t). + +# tsv2csv [options…] [file] + +Equivalent to [dsv2dsv](#dsv2dsv), but the [input delimiter](#dsv2dsv_output_delimiter) defaults to the tab character (\t). + +### dsv2json + +# dsv2json [options…] [file] + +Converts the specified DSV input *file* to JSON. If *file* is not specified, defaults to reading from stdin. For example, to convert to CSV to JSON: + +``` +csv2json < example.csv > example.json +``` + +Or to convert CSV to a newline-delimited JSON stream: + +``` +csv2json -n < example.csv > example.ndjson +``` + +# dsv2json -h +
# dsv2json --help + +Output usage information. + +# dsv2json -V +
# dsv2json --version + +Output the version number. + +# dsv2json -o file +
# dsv2json --out file + +Specify the output file name. Defaults to “-†for stdout. + +# dsv2json -a +
# dsv2json --auto-type + +Use type inference when parsing rows. See d3.autoType for how it works. + +# dsv2json -r delimiter +
# dsv2json --input-delimiter delimiter + +Specify the input delimiter character. Defaults to “,†for reading CSV. (You can enter a tab on the command line by typing ⌃V.) + +# dsv2json --input-encoding encoding + +Specify the input character encoding. Defaults to “utf8â€. + +# dsv2json -r encoding +
# dsv2json --output-encoding encoding + +Specify the output character encoding. Defaults to “utf8â€. + +# dsv2json -n +
# dsv2json --newline-delimited + +Output [newline-delimited JSON](https://github.com/mbostock/ndjson-cli) instead of a single JSON array. + +# csv2json [options…] [file] + +Equivalent to [dsv2json](#dsv2json). + +# tsv2json [options…] [file] + +Equivalent to [dsv2json](#dsv2json), but the [input delimiter](#dsv2json_input_delimiter) defaults to the tab character (\t). + +### json2dsv + +# json2dsv [options…] [file] + +Converts the specified JSON input *file* to DSV. If *file* is not specified, defaults to reading from stdin. For example, to convert to JSON to CSV: + +``` +json2csv < example.json > example.csv +``` + +Or to convert a newline-delimited JSON stream to CSV: + +``` +json2csv -n < example.ndjson > example.csv +``` + +# json2dsv -h +
# json2dsv --help + +Output usage information. + +# json2dsv -V +
# json2dsv --version + +Output the version number. + +# json2dsv -o file +
# json2dsv --out file + +Specify the output file name. Defaults to “-†for stdout. + +# json2dsv --input-encoding encoding + +Specify the input character encoding. Defaults to “utf8â€. + +# json2dsv -w delimiter +
# json2dsv --output-delimiter delimiter + +Specify the output delimiter character. Defaults to “,†for writing CSV. (You can enter a tab on the command line by typing ⌃V.) + +# json2dsv --output-encoding encoding + +Specify the output character encoding. Defaults to “utf8â€. + +# json2dsv -n +
# json2dsv --newline-delimited + +Read [newline-delimited JSON](https://github.com/mbostock/ndjson-cli) instead of a single JSON array. + +# json2csv [options…] [file] + +Equivalent to [json2dsv](#json2dsv). + +# json2tsv [options…] [file] + +Equivalent to [json2dsv](#json2dsv), but the [output delimiter](#json2dsv_output_delimiter) defaults to the tab character (\t). diff --git a/node_modules/d3-dsv/bin/dsv2dsv b/node_modules/d3-dsv/bin/dsv2dsv new file mode 100644 index 00000000..63ca9caf --- /dev/null +++ b/node_modules/d3-dsv/bin/dsv2dsv @@ -0,0 +1,32 @@ +#!/usr/bin/env node + +var os = require("os"), + rw = require("rw").dash, + path = require("path"), + iconv = require("iconv-lite"), + commander = require("commander"), + dsv = require("../"); + +var program = path.basename(process.argv[1]), + defaultInDelimiter = program.slice(0, 3) === "tsv" ? "\t" : ",", + defaultOutDelimiter = program.slice(-3) === "tsv" ? "\t" : ","; + +commander + .version(require("../package.json").version) + .usage("[options] [file]") + .option("-o, --out ", "output file name; defaults to “-†for stdout", "-") + .option("-r, --input-delimiter ", "input delimiter character", defaultInDelimiter) + .option("-w, --output-delimiter ", "output delimiter character", defaultOutDelimiter) + .option("--input-encoding ", "input character encoding; defaults to “utf8â€", "utf8") + .option("--output-encoding ", "output character encoding; defaults to “utf8â€", "utf8") + .parse(process.argv); + +var inFormat = dsv.dsvFormat(commander.inputDelimiter), + outFormat = dsv.dsvFormat(commander.outputDelimiter); + +rw.readFile(commander.args[0] || "-", function(error, text) { + if (error) throw error; + rw.writeFile("-", iconv.encode(outFormat.format(inFormat.parse(iconv.decode(text, commander.inputEncoding))) + os.EOL, commander.outputEncoding), function(error) { + if (error) throw error; + }); +}); diff --git a/node_modules/d3-dsv/bin/dsv2json b/node_modules/d3-dsv/bin/dsv2json new file mode 100644 index 00000000..c0ec2a3f --- /dev/null +++ b/node_modules/d3-dsv/bin/dsv2json @@ -0,0 +1,37 @@ +#!/usr/bin/env node + +var os = require("os"), + rw = require("rw").dash, + path = require("path"), + iconv = require("iconv-lite"), + commander = require("commander"), + dsv = require("../"); + +var program = path.basename(process.argv[1]), + defaultInDelimiter = program.slice(0, 3) === "tsv" ? "\t" : ","; + +commander + .version(require("../package.json").version) + .usage("[options] [file]") + .option("-o, --out ", "output file name; defaults to “-†for stdout", "-") + .option("-r, --input-delimiter ", "input delimiter character", defaultInDelimiter) + .option("-a, --auto-type", "parse rows with type inference (see d3.autoType)") + .option("-n, --newline-delimited", "output newline-delimited JSON") + .option("--input-encoding ", "input character encoding; defaults to “utf8â€", "utf8") + .option("--output-encoding ", "output character encoding; defaults to “utf8â€", "utf8") + .parse(process.argv); + +var inFormat = dsv.dsvFormat(commander.inputDelimiter); + +rw.readFile(commander.args[0] || "-", function(error, text) { + if (error) throw error; + + var rowConverter = commander.autoType ? dsv.autoType : null + var rows = inFormat.parse(iconv.decode(text, commander.inputEncoding), rowConverter); + + rw.writeFile(commander.out, iconv.encode(commander.newlineDelimited + ? rows.map(function(row) { return JSON.stringify(row); }).join("\n") + "\n" + : JSON.stringify(rows) + os.EOL, commander.outputEncoding), function(error) { + if (error) throw error; + }); +}); diff --git a/node_modules/d3-dsv/bin/json2dsv b/node_modules/d3-dsv/bin/json2dsv new file mode 100644 index 00000000..ed6f2e0a --- /dev/null +++ b/node_modules/d3-dsv/bin/json2dsv @@ -0,0 +1,33 @@ +#!/usr/bin/env node + +var os = require("os"), + rw = require("rw").dash, + path = require("path"), + iconv = require("iconv-lite"), + commander = require("commander"), + dsv = require("../"); + +var program = path.basename(process.argv[1]), + defaultOutDelimiter = program.slice(-3) === "tsv" ? "\t" : ","; + +commander + .version(require("../package.json").version) + .usage("[options] [file]") + .option("-o, --out ", "output file name; defaults to “-†for stdout", "-") + .option("-w, --output-delimiter ", "output delimiter character", defaultOutDelimiter) + .option("-n, --newline-delimited", "accept newline-delimited JSON") + .option("--input-encoding ", "input character encoding; defaults to “utf8â€", "utf8") + .option("--output-encoding ", "output character encoding; defaults to “utf8â€", "utf8") + .parse(process.argv); + +var outFormat = dsv.dsvFormat(commander.outputDelimiter); + +rw.readFile(commander.args[0] || "-", function(error, text) { + if (error) throw error; + text = iconv.decode(text, commander.inputEncoding); + rw.writeFile(commander.out, iconv.encode(outFormat.format(commander.newlineDelimited + ? text.trim().split(/\r?\n/g).map(function(line) { return JSON.parse(line); }) + : JSON.parse(text)) + os.EOL, commander.outputEncoding), function(error) { + if (error) throw error; + }); +}); diff --git a/node_modules/d3-dsv/dist/d3-dsv.js b/node_modules/d3-dsv/dist/d3-dsv.js new file mode 100644 index 00000000..0b6956a3 --- /dev/null +++ b/node_modules/d3-dsv/dist/d3-dsv.js @@ -0,0 +1,233 @@ +// https://d3js.org/d3-dsv/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +var EOL = {}, + EOF = {}, + QUOTE = 34, + NEWLINE = 10, + RETURN = 13; + +function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "] || \"\""; + }).join(",") + "}"); +} + +function customConverter(columns, f) { + var object = objectConverter(columns); + return function(row, i) { + return f(object(row), i, columns); + }; +} + +// Compute unique columns in order of discovery. +function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; + + rows.forEach(function(row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); + + return columns; +} + +function pad(value, width) { + var s = value + "", length = s.length; + return length < width ? new Array(width - length + 1).join(0) + s : s; +} + +function formatYear(year) { + return year < 0 ? "-" + pad(-year, 6) + : year > 9999 ? "+" + pad(year, 6) + : pad(year, 4); +} + +function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" + : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" + : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" + : ""); +} + +function dsv(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function(row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns || []; + return rows; + } + + function parseRows(text, f) { + var rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? + + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) --N; + if (text.charCodeAt(N - 1) === RETURN) --N; + + function token() { + if (eof) return EOF; + if (eol) return eol = false, EOL; + + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE); + if ((i = I) >= N) eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } + + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + else if (c !== DELIMITER) continue; + return text.slice(j, i); + } + + // Return last token before EOF. + return eof = true, text.slice(j, N); + } + + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) continue; + rows.push(row); + } + + return rows; + } + + function preformatBody(rows, columns) { + return rows.map(function(row) { + return columns.map(function(column) { + return formatValue(row[column]); + }).join(delimiter); + }); + } + + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); + } + + function formatBody(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows, + formatRow: formatRow, + formatValue: formatValue + }; +} + +var csv = dsv(","); + +var csvParse = csv.parse; +var csvParseRows = csv.parseRows; +var csvFormat = csv.format; +var csvFormatBody = csv.formatBody; +var csvFormatRows = csv.formatRows; +var csvFormatRow = csv.formatRow; +var csvFormatValue = csv.formatValue; + +var tsv = dsv("\t"); + +var tsvParse = tsv.parse; +var tsvParseRows = tsv.parseRows; +var tsvFormat = tsv.format; +var tsvFormatBody = tsv.formatBody; +var tsvFormatRows = tsv.formatRows; +var tsvFormatRow = tsv.formatRow; +var tsvFormatValue = tsv.formatValue; + +function autoType(object) { + for (var key in object) { + var value = object[key].trim(), number, m; + if (!value) value = null; + else if (value === "true") value = true; + else if (value === "false") value = false; + else if (value === "NaN") value = NaN; + else if (!isNaN(number = +value)) value = number; + else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { + if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); + value = new Date(value); + } + else continue; + object[key] = value; + } + return object; +} + +// https://github.com/d3/d3-dsv/issues/45 +const fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); + +exports.autoType = autoType; +exports.csvFormat = csvFormat; +exports.csvFormatBody = csvFormatBody; +exports.csvFormatRow = csvFormatRow; +exports.csvFormatRows = csvFormatRows; +exports.csvFormatValue = csvFormatValue; +exports.csvParse = csvParse; +exports.csvParseRows = csvParseRows; +exports.dsvFormat = dsv; +exports.tsvFormat = tsvFormat; +exports.tsvFormatBody = tsvFormatBody; +exports.tsvFormatRow = tsvFormatRow; +exports.tsvFormatRows = tsvFormatRows; +exports.tsvFormatValue = tsvFormatValue; +exports.tsvParse = tsvParse; +exports.tsvParseRows = tsvParseRows; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-dsv/dist/d3-dsv.min.js b/node_modules/d3-dsv/dist/d3-dsv.min.js new file mode 100644 index 00000000..627ced44 --- /dev/null +++ b/node_modules/d3-dsv/dist/d3-dsv.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-dsv/ v2.0.0 Copyright 2020 Mike Bostock +!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((t=t||self).d3=t.d3||{})}(this,function(t){"use strict";var r={},e={},n=34,o=10,a=13;function u(t){return new Function("d","return {"+t.map(function(t,r){return JSON.stringify(t)+": d["+r+'] || ""'}).join(",")+"}")}function f(t){var r=Object.create(null),e=[];return t.forEach(function(t){for(var n in t)n in r||e.push(r[n]=n)}),e}function i(t,r){var e=t+"",n=e.length;return n9999?"+"+i(r,6):i(r,4))+"-"+i(t.getUTCMonth()+1,2)+"-"+i(t.getUTCDate(),2)+(a?"T"+i(e,2)+":"+i(n,2)+":"+i(o,2)+"."+i(a,3)+"Z":o?"T"+i(e,2)+":"+i(n,2)+":"+i(o,2)+"Z":n||e?"T"+i(e,2)+":"+i(n,2)+"Z":"")}function c(t){var i=new RegExp('["'+t+"\n\r]"),c=t.charCodeAt(0);function l(t,u){var f,i=[],s=t.length,l=0,d=0,m=s<=0,v=!1;function p(){if(m)return e;if(v)return v=!1,r;var u,f,i=l;if(t.charCodeAt(i)===n){for(;l++=s?m=!0:(f=t.charCodeAt(l++))===o?v=!0:f===a&&(v=!0,t.charCodeAt(l)===o&&++l),t.slice(i+1,u-1).replace(/""/g,'"')}for(;l 9999 ? "+" + pad(year, 6) + : pad(year, 4); +} + +function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear(date.getUTCFullYear(), 4) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" + : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" + : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" + : ""); +} + +export default function(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function(row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns || []; + return rows; + } + + function parseRows(text, f) { + var rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? + + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) --N; + if (text.charCodeAt(N - 1) === RETURN) --N; + + function token() { + if (eof) return EOF; + if (eol) return eol = false, EOL; + + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE); + if ((i = I) >= N) eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } + + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + else if (c !== DELIMITER) continue; + return text.slice(j, i); + } + + // Return last token before EOF. + return eof = true, text.slice(j, N); + } + + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) continue; + rows.push(row); + } + + return rows; + } + + function preformatBody(rows, columns) { + return rows.map(function(row) { + return columns.map(function(column) { + return formatValue(row[column]); + }).join(delimiter); + }); + } + + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); + } + + function formatBody(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows, + formatRow: formatRow, + formatValue: formatValue + }; +} diff --git a/node_modules/d3-dsv/src/index.js b/node_modules/d3-dsv/src/index.js new file mode 100644 index 00000000..0a63fff2 --- /dev/null +++ b/node_modules/d3-dsv/src/index.js @@ -0,0 +1,4 @@ +export {default as dsvFormat} from "./dsv.js"; +export {csvParse, csvParseRows, csvFormat, csvFormatBody, csvFormatRows, csvFormatRow, csvFormatValue} from "./csv.js"; +export {tsvParse, tsvParseRows, tsvFormat, tsvFormatBody, tsvFormatRows, tsvFormatRow, tsvFormatValue} from "./tsv.js"; +export {default as autoType} from "./autoType.js"; diff --git a/node_modules/d3-dsv/src/tsv.js b/node_modules/d3-dsv/src/tsv.js new file mode 100644 index 00000000..38b16c21 --- /dev/null +++ b/node_modules/d3-dsv/src/tsv.js @@ -0,0 +1,11 @@ +import dsv from "./dsv.js"; + +var tsv = dsv("\t"); + +export var tsvParse = tsv.parse; +export var tsvParseRows = tsv.parseRows; +export var tsvFormat = tsv.format; +export var tsvFormatBody = tsv.formatBody; +export var tsvFormatRows = tsv.formatRows; +export var tsvFormatRow = tsv.formatRow; +export var tsvFormatValue = tsv.formatValue; diff --git a/node_modules/d3-ease/LICENSE b/node_modules/d3-ease/LICENSE new file mode 100644 index 00000000..6c05ba05 --- /dev/null +++ b/node_modules/d3-ease/LICENSE @@ -0,0 +1,28 @@ +Copyright 2010-2016 Mike Bostock +Copyright 2001 Robert Penner +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-ease/README.md b/node_modules/d3-ease/README.md new file mode 100644 index 00000000..f2c86a8f --- /dev/null +++ b/node_modules/d3-ease/README.md @@ -0,0 +1,241 @@ +# d3-ease + +*Easing* is a method of distorting time to control apparent motion in animation. It is most commonly used for [slow-in, slow-out](https://en.wikipedia.org/wiki/12_basic_principles_of_animation#Slow_In_and_Slow_Out). By easing time, [animated transitions](https://github.com/d3/d3-transition) are smoother and exhibit more plausible motion. + +The easing types in this module implement the [ease method](#ease_ease), which takes a normalized time *t* and returns the corresponding “eased†time *tʹ*. Both the normalized time and the eased time are typically in the range [0,1], where 0 represents the start of the animation and 1 represents the end; some easing types, such as [elastic](#easeElastic), may return eased times slightly outside this range. A good easing type should return 0 if *t* = 0 and 1 if *t* = 1. See the [easing explorer](https://observablehq.com/@d3/easing) for a visual demonstration. + +These easing types are largely based on work by [Robert Penner](http://robertpenner.com/easing/). + +## Installing + +If you use NPM, `npm install d3-ease`. Otherwise, download the [latest release](https://github.com/d3/d3-ease/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-ease.v1.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +[Try d3-ease in your browser.](https://observablehq.com/@d3/easing-animations) + +## API Reference + +# ease(t) + +Given the specified normalized time *t*, typically in the range [0,1], returns the “eased†time *tʹ*, also typically in [0,1]. 0 represents the start of the animation and 1 represents the end. A good implementation returns 0 if *t* = 0 and 1 if *t* = 1. See the [easing explorer](https://observablehq.com/@d3/easing) for a visual demonstration. For example, to apply [cubic](#easeCubic) easing: + +```js +var te = d3.easeCubic(t); +``` + +Similarly, to apply custom [elastic](#easeElastic) easing: + +```js +// Before the animation starts, create your easing function. +var customElastic = d3.easeElastic.period(0.4); + +// During the animation, apply the easing function. +var te = customElastic(t); +``` + +# d3.easeLinear(t) [<>](https://github.com/d3/d3-ease/blob/master/src/linear.js "Source") + +Linear easing; the identity function; *linear*(*t*) returns *t*. + +[linear](https://observablehq.com/@d3/easing#linear) + +# d3.easePolyIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/poly.js#L3 "Source") + +Polynomial easing; raises *t* to the specified [exponent](#poly_exponent). If the exponent is not specified, it defaults to 3, equivalent to [cubicIn](#easeCubicIn). + +[polyIn](https://observablehq.com/@d3/easing#polyIn) + +# d3.easePolyOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/poly.js#L15 "Source") + +Reverse polynomial easing; equivalent to 1 - [polyIn](#easePolyIn)(1 - *t*). If the [exponent](#poly_exponent) is not specified, it defaults to 3, equivalent to [cubicOut](#easeCubicOut). + +[polyOut](https://observablehq.com/@d3/easing#polyOut) + +# d3.easePoly(t) [<>](https://github.com/d3/d3-ease/blob/master/src/poly.js "Source") +
# d3.easePolyInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/poly.js#L27 "Source") + +Symmetric polynomial easing; scales [polyIn](#easePolyIn) for *t* in [0, 0.5] and [polyOut](#easePolyOut) for *t* in [0.5, 1]. If the [exponent](#poly_exponent) is not specified, it defaults to 3, equivalent to [cubic](#easeCubic). + +[polyInOut](https://observablehq.com/@d3/easing#polyInOut) + +# poly.exponent(e) [<>](https://github.com/d3/d3-ease/blob/master/src/poly.js#L1 "Source") + +Returns a new polynomial easing with the specified exponent *e*. For example, to create equivalents of [linear](#easeLinear), [quad](#easeQuad), and [cubic](#easeCubic): + +```js +var linear = d3.easePoly.exponent(1), + quad = d3.easePoly.exponent(2), + cubic = d3.easePoly.exponent(3); +``` + +# d3.easeQuadIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/quad.js#L1 "Source") + +Quadratic easing; equivalent to [polyIn](#easePolyIn).[exponent](#poly_exponent)(2). + +[quadIn](https://observablehq.com/@d3/easing#quadIn) + +# d3.easeQuadOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/quad.js#L5 "Source") + +Reverse quadratic easing; equivalent to 1 - [quadIn](#easeQuadIn)(1 - *t*). Also equivalent to [polyOut](#easePolyOut).[exponent](#poly_exponent)(2). + +[quadOut](https://observablehq.com/@d3/easing#quadOut) + +# d3.easeQuad(t) [<>](https://github.com/d3/d3-ease/blob/master/src/quad.js "Source") +
# d3.easeQuadInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/quad.js#L9 "Source") + +Symmetric quadratic easing; scales [quadIn](#easeQuadIn) for *t* in [0, 0.5] and [quadOut](#easeQuadOut) for *t* in [0.5, 1]. Also equivalent to [poly](#easePoly).[exponent](#poly_exponent)(2). + +[quadInOut](https://observablehq.com/@d3/easing#quadInOut) + +# d3.easeCubicIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/cubic.js#L1 "Source") + +Cubic easing; equivalent to [polyIn](#easePolyIn).[exponent](#poly_exponent)(3). + +[cubicIn](https://observablehq.com/@d3/easing#cubicIn) + +# d3.easeCubicOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/cubic.js#L5 "Source") + +Reverse cubic easing; equivalent to 1 - [cubicIn](#easeCubicIn)(1 - *t*). Also equivalent to [polyOut](#easePolyOut).[exponent](#poly_exponent)(3). + +[cubicOut](https://observablehq.com/@d3/easing#cubicOut) + +# d3.easeCubic(t) [<>](https://github.com/d3/d3-ease/blob/master/src/cubic.js "Source") +
# d3.easeCubicInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/cubic.js#L9 "Source") + +Symmetric cubic easing; scales [cubicIn](#easeCubicIn) for *t* in [0, 0.5] and [cubicOut](#easeCubicOut) for *t* in [0.5, 1]. Also equivalent to [poly](#easePoly).[exponent](#poly_exponent)(3). + +[cubicInOut](https://observablehq.com/@d3/easing#cubicInOut) + +# d3.easeSinIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/sin.js#L4 "Source") + +Sinusoidal easing; returns sin(*t*). + +[sinIn](https://observablehq.com/@d3/easing#sinIn) + +# d3.easeSinOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/sin.js#L8 "Source") + +Reverse sinusoidal easing; equivalent to 1 - [sinIn](#easeSinIn)(1 - *t*). + +[sinOut](https://observablehq.com/@d3/easing#sinOut) + +# d3.easeSin(t) [<>](https://github.com/d3/d3-ease/blob/master/src/sin.js "Source") +
# d3.easeSinInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/sin.js#L12 "Source") + +Symmetric sinusoidal easing; scales [sinIn](#easeSinIn) for *t* in [0, 0.5] and [sinOut](#easeSinOut) for *t* in [0.5, 1]. + +[sinInOut](https://observablehq.com/@d3/easing#sinInOut) + +# d3.easeExpIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/exp.js#L1 "Source") + +Exponential easing; raises 2 to the exponent 10 \* (*t* - 1). + +[expIn](https://observablehq.com/@d3/easing#expIn) + +# d3.easeExpOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/exp.js#L5 "Source") + +Reverse exponential easing; equivalent to 1 - [expIn](#easeExpIn)(1 - *t*). + +[expOut](https://observablehq.com/@d3/easing#expOut) + +# d3.easeExp(t) [<>](https://github.com/d3/d3-ease/blob/master/src/exp.js "Source") +
# d3.easeExpInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/exp.js#L9 "Source") + +Symmetric exponential easing; scales [expIn](#easeExpIn) for *t* in [0, 0.5] and [expOut](#easeExpOut) for *t* in [0.5, 1]. + +[expInOut](https://observablehq.com/@d3/easing#expInOut) + +# d3.easeCircleIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/circle.js#L1 "Source") + +Circular easing. + +[circleIn](https://observablehq.com/@d3/easing#circleIn) + +# d3.easeCircleOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/circle.js#L5 "Source") + +Reverse circular easing; equivalent to 1 - [circleIn](#easeCircleIn)(1 - *t*). + +[circleOut](https://observablehq.com/@d3/easing#circleOut) + +# d3.easeCircle(t) [<>](https://github.com/d3/d3-ease/blob/master/src/circle.js "Source") +
# d3.easeCircleInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/circle.js#L9 "Source") + +Symmetric circular easing; scales [circleIn](#easeCircleIn) for *t* in [0, 0.5] and [circleOut](#easeCircleOut) for *t* in [0.5, 1]. + +[circleInOut](https://observablehq.com/@d3/easing#circleInOut) + +# d3.easeElasticIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js#L5 "Source") + +Elastic easing, like a rubber band. The [amplitude](#elastic_amplitude) and [period](#elastic_period) of the oscillation are configurable; if not specified, they default to 1 and 0.3, respectively. + +[elasticIn](https://observablehq.com/@d3/easing#elasticIn) + +# d3.easeElastic(t) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js "Source") +
# d3.easeElasticOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js#L18 "Source") + +Reverse elastic easing; equivalent to 1 - [elasticIn](#easeElasticIn)(1 - *t*). + +[elasticOut](https://observablehq.com/@d3/easing#elasticOut) + +# d3.easeElasticInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js#L31 "Source") + +Symmetric elastic easing; scales [elasticIn](#easeElasticIn) for *t* in [0, 0.5] and [elasticOut](#easeElasticOut) for *t* in [0.5, 1]. + +[elasticInOut](https://observablehq.com/@d3/easing#elasticInOut) + +# elastic.amplitude(a) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js#L40 "Source") + +Returns a new elastic easing with the specified amplitude *a*. + +# elastic.period(p) [<>](https://github.com/d3/d3-ease/blob/master/src/elastic.js#L41 "Source") + +Returns a new elastic easing with the specified period *p*. + +# d3.easeBackIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/back.js#L3 "Source") + +[Anticipatory](https://en.wikipedia.org/wiki/12_basic_principles_of_animation#Anticipation) easing, like a dancer bending his knees before jumping off the floor. The degree of [overshoot](#back_overshoot) is configurable; if not specified, it defaults to 1.70158. + +[backIn](https://observablehq.com/@d3/easing#backIn) + +# d3.easeBackOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/back.js#L15 "Source") + +Reverse anticipatory easing; equivalent to 1 - [backIn](#easeBackIn)(1 - *t*). + +[backOut](https://observablehq.com/@d3/easing#backOut) + +# d3.easeBack(t) [<>](https://github.com/d3/d3-ease/blob/master/src/back.js "Source") +
# d3.easeBackInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/back.js#L27 "Source") + +Symmetric anticipatory easing; scales [backIn](#easeBackIn) for *t* in [0, 0.5] and [backOut](#easeBackOut) for *t* in [0.5, 1]. + +[backInOut](https://observablehq.com/@d3/easing#backInOut) + +# back.overshoot(s) [<>](https://github.com/d3/d3-ease/blob/master/src/back.js#L1 "Source") + +Returns a new back easing with the specified overshoot *s*. + +# d3.easeBounceIn(t) [<>](https://github.com/d3/d3-ease/blob/master/src/bounce.js#L12 "Source") + +Bounce easing, like a rubber ball. + +[bounceIn](https://observablehq.com/@d3/easing#bounceIn) + +# d3.easeBounce(t) [<>](https://github.com/d3/d3-ease/blob/master/src/bounce.js "Source") +
# d3.easeBounceOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/bounce.js#L16 "Source") + +Reverse bounce easing; equivalent to 1 - [bounceIn](#easeBounceIn)(1 - *t*). + +[bounceOut](https://observablehq.com/@d3/easing#bounceOut) + +# d3.easeBounceInOut(t) [<>](https://github.com/d3/d3-ease/blob/master/src/bounce.js#L20 "Source") + +Symmetric bounce easing; scales [bounceIn](#easeBounceIn) for *t* in [0, 0.5] and [bounceOut](#easeBounceOut) for *t* in [0.5, 1]. + +[bounceInOut](https://observablehq.com/@d3/easing#bounceInOut) diff --git a/node_modules/d3-ease/dist/d3-ease.js b/node_modules/d3-ease/dist/d3-ease.js new file mode 100644 index 00000000..a8750ba7 --- /dev/null +++ b/node_modules/d3-ease/dist/d3-ease.js @@ -0,0 +1,262 @@ +// https://d3js.org/d3-ease/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +const linear = t => +t; + +function quadIn(t) { + return t * t; +} + +function quadOut(t) { + return t * (2 - t); +} + +function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; +} + +function cubicIn(t) { + return t * t * t; +} + +function cubicOut(t) { + return --t * t * t + 1; +} + +function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} + +var exponent = 3; + +var polyIn = (function custom(e) { + e = +e; + + function polyIn(t) { + return Math.pow(t, e); + } + + polyIn.exponent = custom; + + return polyIn; +})(exponent); + +var polyOut = (function custom(e) { + e = +e; + + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } + + polyOut.exponent = custom; + + return polyOut; +})(exponent); + +var polyInOut = (function custom(e) { + e = +e; + + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + + polyInOut.exponent = custom; + + return polyInOut; +})(exponent); + +var pi = Math.PI, + halfPi = pi / 2; + +function sinIn(t) { + return (+t === 1) ? 1 : 1 - Math.cos(t * halfPi); +} + +function sinOut(t) { + return Math.sin(t * halfPi); +} + +function sinInOut(t) { + return (1 - Math.cos(pi * t)) / 2; +} + +// tpmt is two power minus ten times t scaled to [0,1] +function tpmt(x) { + return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494; +} + +function expIn(t) { + return tpmt(1 - +t); +} + +function expOut(t) { + return 1 - tpmt(t); +} + +function expInOut(t) { + return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2; +} + +function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); +} + +function circleOut(t) { + return Math.sqrt(1 - --t * t); +} + +function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; +} + +var b1 = 4 / 11, + b2 = 6 / 11, + b3 = 8 / 11, + b4 = 3 / 4, + b5 = 9 / 11, + b6 = 10 / 11, + b7 = 15 / 16, + b8 = 21 / 22, + b9 = 63 / 64, + b0 = 1 / b1 / b1; + +function bounceIn(t) { + return 1 - bounceOut(1 - t); +} + +function bounceOut(t) { + return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; +} + +function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; +} + +var overshoot = 1.70158; + +var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return (t = +t) * t * (s * (t - 1) + t); + } + + backIn.overshoot = custom; + + return backIn; +})(overshoot); + +var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((t + 1) * s + t) + 1; + } + + backOut.overshoot = custom; + + return backOut; +})(overshoot); + +var backInOut = (function custom(s) { + s = +s; + + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + + backInOut.overshoot = custom; + + return backInOut; +})(overshoot); + +var tau = 2 * Math.PI, + amplitude = 1, + period = 0.3; + +var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticIn(t) { + return a * tpmt(-(--t)) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function(a) { return custom(a, p * tau); }; + elasticIn.period = function(p) { return custom(a, p); }; + + return elasticIn; +})(amplitude, period); + +var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticOut(t) { + return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticOut.period = function(p) { return custom(a, p); }; + + return elasticOut; +})(amplitude, period); + +var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * tpmt(-t) * Math.sin((s - t) / p) + : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticInOut.period = function(p) { return custom(a, p); }; + + return elasticInOut; +})(amplitude, period); + +exports.easeBack = backInOut; +exports.easeBackIn = backIn; +exports.easeBackInOut = backInOut; +exports.easeBackOut = backOut; +exports.easeBounce = bounceOut; +exports.easeBounceIn = bounceIn; +exports.easeBounceInOut = bounceInOut; +exports.easeBounceOut = bounceOut; +exports.easeCircle = circleInOut; +exports.easeCircleIn = circleIn; +exports.easeCircleInOut = circleInOut; +exports.easeCircleOut = circleOut; +exports.easeCubic = cubicInOut; +exports.easeCubicIn = cubicIn; +exports.easeCubicInOut = cubicInOut; +exports.easeCubicOut = cubicOut; +exports.easeElastic = elasticOut; +exports.easeElasticIn = elasticIn; +exports.easeElasticInOut = elasticInOut; +exports.easeElasticOut = elasticOut; +exports.easeExp = expInOut; +exports.easeExpIn = expIn; +exports.easeExpInOut = expInOut; +exports.easeExpOut = expOut; +exports.easeLinear = linear; +exports.easePoly = polyInOut; +exports.easePolyIn = polyIn; +exports.easePolyInOut = polyInOut; +exports.easePolyOut = polyOut; +exports.easeQuad = quadInOut; +exports.easeQuadIn = quadIn; +exports.easeQuadInOut = quadInOut; +exports.easeQuadOut = quadOut; +exports.easeSin = sinInOut; +exports.easeSinIn = sinIn; +exports.easeSinInOut = sinInOut; +exports.easeSinOut = sinOut; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-ease/dist/d3-ease.min.js b/node_modules/d3-ease/dist/d3-ease.min.js new file mode 100644 index 00000000..a44a0588 --- /dev/null +++ b/node_modules/d3-ease/dist/d3-ease.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-ease/ v2.0.0 Copyright 2020 Mike Bostock +!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((n=n||self).d3=n.d3||{})}(this,function(n){"use strict";function e(n){return((n*=2)<=1?n*n:--n*(2-n)+1)/2}function t(n){return((n*=2)<=1?n*n*n:(n-=2)*n*n+2)/2}var u=function n(e){function t(n){return Math.pow(n,e)}return e=+e,t.exponent=n,t}(3),r=function n(e){function t(n){return 1-Math.pow(1-n,e)}return e=+e,t.exponent=n,t}(3),a=function n(e){function t(n){return((n*=2)<=1?Math.pow(n,e):2-Math.pow(2-n,e))/2}return e=+e,t.exponent=n,t}(3),o=Math.PI,i=o/2;function c(n){return(1-Math.cos(o*n))/2}function s(n){return 1.0009775171065494*(Math.pow(2,-10*n)-.0009765625)}function f(n){return((n*=2)<=1?s(1-n):2-s(n-1))/2}function h(n){return((n*=2)<=1?1-Math.sqrt(1-n*n):Math.sqrt(1-(n-=2)*n)+1)/2}var p=4/11,M=6/11,d=8/11,I=.75,l=9/11,O=10/11,x=.9375,v=21/22,m=63/64,y=1/p/p;function B(n){return(n=+n)+n,n.easePoly=a,n.easePolyIn=u,n.easePolyInOut=a,n.easePolyOut=r,n.easeQuad=e,n.easeQuadIn=function(n){return n*n},n.easeQuadInOut=e,n.easeQuadOut=function(n){return n*(2-n)},n.easeSin=c,n.easeSinIn=function(n){return 1==+n?1:1-Math.cos(n*i)},n.easeSinInOut=c,n.easeSinOut=function(n){return Math.sin(n*i)},Object.defineProperty(n,"__esModule",{value:!0})}); diff --git a/node_modules/d3-ease/package.json b/node_modules/d3-ease/package.json new file mode 100644 index 00000000..6d0a7db7 --- /dev/null +++ b/node_modules/d3-ease/package.json @@ -0,0 +1,73 @@ +{ + "_from": "d3-ease@2", + "_id": "d3-ease@2.0.0", + "_inBundle": false, + "_integrity": "sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==", + "_location": "/d3-ease", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-ease@2", + "name": "d3-ease", + "escapedName": "d3-ease", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3", + "/d3-transition" + ], + "_resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-2.0.0.tgz", + "_shasum": "fd1762bfca00dae4bacea504b1d628ff290ac563", + "_spec": "d3-ease@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-ease/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Easing functions for smooth animation.", + "devDependencies": { + "eslint": "6", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-ease/", + "jsdelivr": "dist/d3-ease.min.js", + "keywords": [ + "d3", + "d3-module", + "ease", + "easing", + "animation", + "transition" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-ease.js", + "module": "src/index.js", + "name": "d3-ease", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-ease.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src test" + }, + "sideEffects": false, + "unpkg": "dist/d3-ease.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-ease/src/back.js b/node_modules/d3-ease/src/back.js new file mode 100644 index 00000000..b9c1bcc9 --- /dev/null +++ b/node_modules/d3-ease/src/back.js @@ -0,0 +1,37 @@ +var overshoot = 1.70158; + +export var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return (t = +t) * t * (s * (t - 1) + t); + } + + backIn.overshoot = custom; + + return backIn; +})(overshoot); + +export var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((t + 1) * s + t) + 1; + } + + backOut.overshoot = custom; + + return backOut; +})(overshoot); + +export var backInOut = (function custom(s) { + s = +s; + + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + + backInOut.overshoot = custom; + + return backInOut; +})(overshoot); diff --git a/node_modules/d3-ease/src/bounce.js b/node_modules/d3-ease/src/bounce.js new file mode 100644 index 00000000..d2d81caf --- /dev/null +++ b/node_modules/d3-ease/src/bounce.js @@ -0,0 +1,22 @@ +var b1 = 4 / 11, + b2 = 6 / 11, + b3 = 8 / 11, + b4 = 3 / 4, + b5 = 9 / 11, + b6 = 10 / 11, + b7 = 15 / 16, + b8 = 21 / 22, + b9 = 63 / 64, + b0 = 1 / b1 / b1; + +export function bounceIn(t) { + return 1 - bounceOut(1 - t); +} + +export function bounceOut(t) { + return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; +} + +export function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; +} diff --git a/node_modules/d3-ease/src/circle.js b/node_modules/d3-ease/src/circle.js new file mode 100644 index 00000000..8b9bb1de --- /dev/null +++ b/node_modules/d3-ease/src/circle.js @@ -0,0 +1,11 @@ +export function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); +} + +export function circleOut(t) { + return Math.sqrt(1 - --t * t); +} + +export function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; +} diff --git a/node_modules/d3-ease/src/cubic.js b/node_modules/d3-ease/src/cubic.js new file mode 100644 index 00000000..bad3a7ca --- /dev/null +++ b/node_modules/d3-ease/src/cubic.js @@ -0,0 +1,11 @@ +export function cubicIn(t) { + return t * t * t; +} + +export function cubicOut(t) { + return --t * t * t + 1; +} + +export function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} diff --git a/node_modules/d3-ease/src/elastic.js b/node_modules/d3-ease/src/elastic.js new file mode 100644 index 00000000..48ca6733 --- /dev/null +++ b/node_modules/d3-ease/src/elastic.js @@ -0,0 +1,46 @@ +import {tpmt} from "./math.js"; + +var tau = 2 * Math.PI, + amplitude = 1, + period = 0.3; + +export var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticIn(t) { + return a * tpmt(-(--t)) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function(a) { return custom(a, p * tau); }; + elasticIn.period = function(p) { return custom(a, p); }; + + return elasticIn; +})(amplitude, period); + +export var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticOut(t) { + return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticOut.period = function(p) { return custom(a, p); }; + + return elasticOut; +})(amplitude, period); + +export var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * tpmt(-t) * Math.sin((s - t) / p) + : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticInOut.period = function(p) { return custom(a, p); }; + + return elasticInOut; +})(amplitude, period); diff --git a/node_modules/d3-ease/src/exp.js b/node_modules/d3-ease/src/exp.js new file mode 100644 index 00000000..f3c1cf0f --- /dev/null +++ b/node_modules/d3-ease/src/exp.js @@ -0,0 +1,13 @@ +import {tpmt} from "./math.js"; + +export function expIn(t) { + return tpmt(1 - +t); +} + +export function expOut(t) { + return 1 - tpmt(t); +} + +export function expInOut(t) { + return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2; +} diff --git a/node_modules/d3-ease/src/index.js b/node_modules/d3-ease/src/index.js new file mode 100644 index 00000000..710d3df5 --- /dev/null +++ b/node_modules/d3-ease/src/index.js @@ -0,0 +1,66 @@ +export { + linear as easeLinear +} from "./linear.js"; + +export { + quadInOut as easeQuad, + quadIn as easeQuadIn, + quadOut as easeQuadOut, + quadInOut as easeQuadInOut +} from "./quad.js"; + +export { + cubicInOut as easeCubic, + cubicIn as easeCubicIn, + cubicOut as easeCubicOut, + cubicInOut as easeCubicInOut +} from "./cubic.js"; + +export { + polyInOut as easePoly, + polyIn as easePolyIn, + polyOut as easePolyOut, + polyInOut as easePolyInOut +} from "./poly.js"; + +export { + sinInOut as easeSin, + sinIn as easeSinIn, + sinOut as easeSinOut, + sinInOut as easeSinInOut +} from "./sin.js"; + +export { + expInOut as easeExp, + expIn as easeExpIn, + expOut as easeExpOut, + expInOut as easeExpInOut +} from "./exp.js"; + +export { + circleInOut as easeCircle, + circleIn as easeCircleIn, + circleOut as easeCircleOut, + circleInOut as easeCircleInOut +} from "./circle.js"; + +export { + bounceOut as easeBounce, + bounceIn as easeBounceIn, + bounceOut as easeBounceOut, + bounceInOut as easeBounceInOut +} from "./bounce.js"; + +export { + backInOut as easeBack, + backIn as easeBackIn, + backOut as easeBackOut, + backInOut as easeBackInOut +} from "./back.js"; + +export { + elasticOut as easeElastic, + elasticIn as easeElasticIn, + elasticOut as easeElasticOut, + elasticInOut as easeElasticInOut +} from "./elastic.js"; diff --git a/node_modules/d3-ease/src/linear.js b/node_modules/d3-ease/src/linear.js new file mode 100644 index 00000000..7b7d2c11 --- /dev/null +++ b/node_modules/d3-ease/src/linear.js @@ -0,0 +1 @@ +export const linear = t => +t; diff --git a/node_modules/d3-ease/src/math.js b/node_modules/d3-ease/src/math.js new file mode 100644 index 00000000..d342db17 --- /dev/null +++ b/node_modules/d3-ease/src/math.js @@ -0,0 +1,4 @@ +// tpmt is two power minus ten times t scaled to [0,1] +export function tpmt(x) { + return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494; +} diff --git a/node_modules/d3-ease/src/poly.js b/node_modules/d3-ease/src/poly.js new file mode 100644 index 00000000..827cf874 --- /dev/null +++ b/node_modules/d3-ease/src/poly.js @@ -0,0 +1,37 @@ +var exponent = 3; + +export var polyIn = (function custom(e) { + e = +e; + + function polyIn(t) { + return Math.pow(t, e); + } + + polyIn.exponent = custom; + + return polyIn; +})(exponent); + +export var polyOut = (function custom(e) { + e = +e; + + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } + + polyOut.exponent = custom; + + return polyOut; +})(exponent); + +export var polyInOut = (function custom(e) { + e = +e; + + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + + polyInOut.exponent = custom; + + return polyInOut; +})(exponent); diff --git a/node_modules/d3-ease/src/quad.js b/node_modules/d3-ease/src/quad.js new file mode 100644 index 00000000..df65bc29 --- /dev/null +++ b/node_modules/d3-ease/src/quad.js @@ -0,0 +1,11 @@ +export function quadIn(t) { + return t * t; +} + +export function quadOut(t) { + return t * (2 - t); +} + +export function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; +} diff --git a/node_modules/d3-ease/src/sin.js b/node_modules/d3-ease/src/sin.js new file mode 100644 index 00000000..d8e09b8e --- /dev/null +++ b/node_modules/d3-ease/src/sin.js @@ -0,0 +1,14 @@ +var pi = Math.PI, + halfPi = pi / 2; + +export function sinIn(t) { + return (+t === 1) ? 1 : 1 - Math.cos(t * halfPi); +} + +export function sinOut(t) { + return Math.sin(t * halfPi); +} + +export function sinInOut(t) { + return (1 - Math.cos(pi * t)) / 2; +} diff --git a/node_modules/d3-fetch/LICENSE b/node_modules/d3-fetch/LICENSE new file mode 100644 index 00000000..fb54fc9e --- /dev/null +++ b/node_modules/d3-fetch/LICENSE @@ -0,0 +1,27 @@ +Copyright 2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-fetch/README.md b/node_modules/d3-fetch/README.md new file mode 100644 index 00000000..36283fb5 --- /dev/null +++ b/node_modules/d3-fetch/README.md @@ -0,0 +1,104 @@ +# d3-fetch + +This module provides convenient parsing on top of [Fetch](https://fetch.spec.whatwg.org/). For example, to load a text file: + +```js +d3.text("/path/to/file.txt").then(function(text) { + console.log(text); // Hello, world! +}); +``` + +To load and parse a CSV file: + +```js +d3.csv("/path/to/file.csv").then(function(data) { + console.log(data); // [{"Hello": "world"}, …] +}); +``` + +This module has built-in support for parsing [JSON](#json), [CSV](#csv), and [TSV](#tsv). You can parse additional formats by using [text](#text) directly. (This module replaced [d3-request](https://github.com/d3/d3-request).) + +## Installing + +If you use NPM, `npm install d3-fetch`. Otherwise, download the [latest release](https://github.com/d3/d3-fetch/releases/latest). You can also load directly from [d3js.org](https://d3js.org) as a [standalone library](https://d3js.org/d3-fetch.v1.min.js). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + +``` + +## API Reference + +# d3.blob(input[, init]) [<>](https://github.com/d3/d3-fetch/blob/master/src/blob.js "Source") + +Fetches the binary file at the specified *input* URL as a Blob. If *init* is specified, it is passed along to the underlying call to [fetch](https://fetch.spec.whatwg.org/#fetch-method); see [RequestInit](https://fetch.spec.whatwg.org/#requestinit) for allowed fields. + +# d3.buffer(input[, init]) [<>](https://github.com/d3/d3-fetch/blob/master/src/buffer.js "Source") + +Fetches the binary file at the specified *input* URL as an ArrayBuffer. If *init* is specified, it is passed along to the underlying call to [fetch](https://fetch.spec.whatwg.org/#fetch-method); see [RequestInit](https://fetch.spec.whatwg.org/#requestinit) for allowed fields. + +# d3.csv(input[, init][, row]) [<>](https://github.com/d3/d3-fetch/blob/master/src/dsv.js "Source") + +Equivalent to [d3.dsv](#dsv) with the comma character as the delimiter. + +# d3.dsv(delimiter, input[, init][, row]) [<>](https://github.com/d3/d3-fetch/blob/master/src/dsv.js "Source") + +Fetches the [DSV](https://github.com/d3/d3-dsv) file at the specified *input* URL. If *init* is specified, it is passed along to the underlying call to [fetch](https://fetch.spec.whatwg.org/#fetch-method); see [RequestInit](https://fetch.spec.whatwg.org/#requestinit) for allowed fields. An optional *row* conversion function may be specified to map and filter row objects to a more-specific representation; see [*dsv*.parse](https://github.com/d3/d3-dsv#dsv_parse) for details. For example: + +```js +d3.dsv(",", "test.csv", function(d) { + return { + year: new Date(+d.Year, 0, 1), // convert "Year" column to Date + make: d.Make, + model: d.Model, + length: +d.Length // convert "Length" column to number + }; +}).then(function(data) { + console.log(data); +}); +``` + +If only one of *init* and *row* is specified, it is interpreted as the *row* conversion function if it is a function, and otherwise an *init* object. + +See also [d3.csv](#csv) and [d3.tsv](#tsv). + +# d3.html(input[, init]) [<>](https://github.com/d3/d3-fetch/blob/master/src/xml.js "Source") + +Fetches the file at the specified *input* URL as [text](#text) and then [parses it](https://developer.mozilla.org/docs/Web/API/DOMParser) as HTML. If *init* is specified, it is passed along to the underlying call to [fetch](https://fetch.spec.whatwg.org/#fetch-method); see [RequestInit](https://fetch.spec.whatwg.org/#requestinit) for allowed fields. + +# d3.image(input[, init]) [<>](https://github.com/d3/d3-fetch/blob/master/src/image.js "Source") + +Fetches the image at the specified *input* URL. If *init* is specified, sets any additional properties on the image before loading. For example, to enable an anonymous [cross-origin request](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image): + +```js +d3.image("https://example.com/test.png", {crossOrigin: "anonymous"}).then(function(img) { + console.log(img); +}); +``` + +# d3.json(input[, init]) [<>](https://github.com/d3/d3-fetch/blob/master/src/json.js "Source") + +Fetches the [JSON](http://json.org) file at the specified *input* URL. If *init* is specified, it is passed along to the underlying call to [fetch](https://fetch.spec.whatwg.org/#fetch-method); see [RequestInit](https://fetch.spec.whatwg.org/#requestinit) for allowed fields. If the server returns a status code of [204 No Content](https://developer.mozilla.org/docs/Web/HTTP/Status/204) or [205 Reset Content](https://developer.mozilla.org/docs/Web/HTTP/Status/205), the promise resolves to `undefined`. + +# d3.svg(input[, init]) [<>](https://github.com/d3/d3-fetch/blob/master/src/xml.js "Source") + +Fetches the file at the specified *input* URL as [text](#text) and then [parses it](https://developer.mozilla.org/docs/Web/API/DOMParser) as SVG. If *init* is specified, it is passed along to the underlying call to [fetch](https://fetch.spec.whatwg.org/#fetch-method); see [RequestInit](https://fetch.spec.whatwg.org/#requestinit) for allowed fields. + +# d3.text(input[, init]) [<>](https://github.com/d3/d3-fetch/blob/master/src/text.js "Source") + +Fetches the text file at the specified *input* URL. If *init* is specified, it is passed along to the underlying call to [fetch](https://fetch.spec.whatwg.org/#fetch-method); see [RequestInit](https://fetch.spec.whatwg.org/#requestinit) for allowed fields. + +# d3.tsv(input[, init][, row]) [<>](https://github.com/d3/d3-fetch/blob/master/src/dsv.js "Source") + +Equivalent to [d3.dsv](#dsv) with the tab character as the delimiter. + +# d3.xml(input[, init]) [<>](https://github.com/d3/d3-fetch/blob/master/src/xml.js "Source") + +Fetches the file at the specified *input* URL as [text](#text) and then [parses it](https://developer.mozilla.org/docs/Web/API/DOMParser) as XML. If *init* is specified, it is passed along to the underlying call to [fetch](https://fetch.spec.whatwg.org/#fetch-method); see [RequestInit](https://fetch.spec.whatwg.org/#requestinit) for allowed fields. diff --git a/node_modules/d3-fetch/dist/d3-fetch.js b/node_modules/d3-fetch/dist/d3-fetch.js new file mode 100644 index 00000000..81c7e1a5 --- /dev/null +++ b/node_modules/d3-fetch/dist/d3-fetch.js @@ -0,0 +1,100 @@ +// https://d3js.org/d3-fetch/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dsv')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-dsv'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); +}(this, function (exports, d3Dsv) { 'use strict'; + +function responseBlob(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.blob(); +} + +function blob(input, init) { + return fetch(input, init).then(responseBlob); +} + +function responseArrayBuffer(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); +} + +function buffer(input, init) { + return fetch(input, init).then(responseArrayBuffer); +} + +function responseText(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.text(); +} + +function text(input, init) { + return fetch(input, init).then(responseText); +} + +function dsvParse(parse) { + return function(input, init, row) { + if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; + return text(input, init).then(function(response) { + return parse(response, row); + }); + }; +} + +function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; + var format = d3Dsv.dsvFormat(delimiter); + return text(input, init).then(function(response) { + return format.parse(response, row); + }); +} + +var csv = dsvParse(d3Dsv.csvParse); +var tsv = dsvParse(d3Dsv.tsvParse); + +function image(input, init) { + return new Promise(function(resolve, reject) { + var image = new Image; + for (var key in init) image[key] = init[key]; + image.onerror = reject; + image.onload = function() { resolve(image); }; + image.src = input; + }); +} + +function responseJson(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + if (response.status === 204 || response.status === 205) return; + return response.json(); +} + +function json(input, init) { + return fetch(input, init).then(responseJson); +} + +function parser(type) { + return (input, init) => text(input, init) + .then(text => (new DOMParser).parseFromString(text, type)); +} + +var xml = parser("application/xml"); + +var html = parser("text/html"); + +var svg = parser("image/svg+xml"); + +exports.blob = blob; +exports.buffer = buffer; +exports.csv = csv; +exports.dsv = dsv; +exports.html = html; +exports.image = image; +exports.json = json; +exports.svg = svg; +exports.text = text; +exports.tsv = tsv; +exports.xml = xml; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-fetch/dist/d3-fetch.min.js b/node_modules/d3-fetch/dist/d3-fetch.min.js new file mode 100644 index 00000000..205ed452 --- /dev/null +++ b/node_modules/d3-fetch/dist/d3-fetch.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-fetch/ v2.0.0 Copyright 2020 Mike Bostock +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("d3-dsv")):"function"==typeof define&&define.amd?define(["exports","d3-dsv"],n):n((t=t||self).d3=t.d3||{},t.d3)}(this,function(t,n){"use strict";function e(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.blob()}function r(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.arrayBuffer()}function o(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.text()}function u(t,n){return fetch(t,n).then(o)}function f(t){return function(n,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=void 0),u(n,e).then(function(n){return t(n,r)})}}var s=f(n.csvParse),i=f(n.tsvParse);function c(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);if(204!==t.status&&205!==t.status)return t.json()}function a(t){return(n,e)=>u(n,e).then(n=>(new DOMParser).parseFromString(n,t))}var d=a("application/xml"),h=a("text/html"),v=a("image/svg+xml");t.blob=function(t,n){return fetch(t,n).then(e)},t.buffer=function(t,n){return fetch(t,n).then(r)},t.csv=s,t.dsv=function(t,e,r,o){3===arguments.length&&"function"==typeof r&&(o=r,r=void 0);var f=n.dsvFormat(t);return u(e,r).then(function(t){return f.parse(t,o)})},t.html=h,t.image=function(t,n){return new Promise(function(e,r){var o=new Image;for(var u in n)o[u]=n[u];o.onerror=r,o.onload=function(){e(o)},o.src=t})},t.json=function(t,n){return fetch(t,n).then(c)},t.svg=v,t.text=u,t.tsv=i,t.xml=d,Object.defineProperty(t,"__esModule",{value:!0})}); diff --git a/node_modules/d3-fetch/package.json b/node_modules/d3-fetch/package.json new file mode 100644 index 00000000..b2906a2d --- /dev/null +++ b/node_modules/d3-fetch/package.json @@ -0,0 +1,74 @@ +{ + "_from": "d3-fetch@2", + "_id": "d3-fetch@2.0.0", + "_inBundle": false, + "_integrity": "sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw==", + "_location": "/d3-fetch", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-fetch@2", + "name": "d3-fetch", + "escapedName": "d3-fetch", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3" + ], + "_resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-2.0.0.tgz", + "_shasum": "ecd7ef2128d9847a3b41b548fec80918d645c064", + "_spec": "d3-fetch@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-fetch/issues" + }, + "bundleDependencies": false, + "dependencies": { + "d3-dsv": "1 - 2" + }, + "deprecated": false, + "description": "Convenient parsing for Fetch.", + "devDependencies": { + "eslint": "6", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-fetch/", + "jsdelivr": "dist/d3-fetch.min.js", + "keywords": [ + "d3", + "d3-module", + "fetch", + "ajax", + "XMLHttpRequest" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-fetch.js", + "module": "src/index.js", + "name": "d3-fetch", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-fetch.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src" + }, + "sideEffects": false, + "unpkg": "dist/d3-fetch.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-fetch/src/blob.js b/node_modules/d3-fetch/src/blob.js new file mode 100644 index 00000000..646664c3 --- /dev/null +++ b/node_modules/d3-fetch/src/blob.js @@ -0,0 +1,8 @@ +function responseBlob(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.blob(); +} + +export default function(input, init) { + return fetch(input, init).then(responseBlob); +} diff --git a/node_modules/d3-fetch/src/buffer.js b/node_modules/d3-fetch/src/buffer.js new file mode 100644 index 00000000..f776a94b --- /dev/null +++ b/node_modules/d3-fetch/src/buffer.js @@ -0,0 +1,8 @@ +function responseArrayBuffer(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); +} + +export default function(input, init) { + return fetch(input, init).then(responseArrayBuffer); +} diff --git a/node_modules/d3-fetch/src/dsv.js b/node_modules/d3-fetch/src/dsv.js new file mode 100644 index 00000000..99d7bc39 --- /dev/null +++ b/node_modules/d3-fetch/src/dsv.js @@ -0,0 +1,22 @@ +import {csvParse, dsvFormat, tsvParse} from "d3-dsv"; +import text from "./text.js"; + +function dsvParse(parse) { + return function(input, init, row) { + if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; + return text(input, init).then(function(response) { + return parse(response, row); + }); + }; +} + +export default function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; + var format = dsvFormat(delimiter); + return text(input, init).then(function(response) { + return format.parse(response, row); + }); +} + +export var csv = dsvParse(csvParse); +export var tsv = dsvParse(tsvParse); diff --git a/node_modules/d3-fetch/src/image.js b/node_modules/d3-fetch/src/image.js new file mode 100644 index 00000000..c80a74bc --- /dev/null +++ b/node_modules/d3-fetch/src/image.js @@ -0,0 +1,9 @@ +export default function(input, init) { + return new Promise(function(resolve, reject) { + var image = new Image; + for (var key in init) image[key] = init[key]; + image.onerror = reject; + image.onload = function() { resolve(image); }; + image.src = input; + }); +} diff --git a/node_modules/d3-fetch/src/index.js b/node_modules/d3-fetch/src/index.js new file mode 100644 index 00000000..f3ac0f99 --- /dev/null +++ b/node_modules/d3-fetch/src/index.js @@ -0,0 +1,7 @@ +export {default as blob} from "./blob.js"; +export {default as buffer} from "./buffer.js"; +export {default as dsv, csv, tsv} from "./dsv.js"; +export {default as image} from "./image.js"; +export {default as json} from "./json.js"; +export {default as text} from "./text.js"; +export {default as xml, html, svg} from "./xml.js"; diff --git a/node_modules/d3-fetch/src/json.js b/node_modules/d3-fetch/src/json.js new file mode 100644 index 00000000..25e9798d --- /dev/null +++ b/node_modules/d3-fetch/src/json.js @@ -0,0 +1,9 @@ +function responseJson(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + if (response.status === 204 || response.status === 205) return; + return response.json(); +} + +export default function(input, init) { + return fetch(input, init).then(responseJson); +} diff --git a/node_modules/d3-fetch/src/text.js b/node_modules/d3-fetch/src/text.js new file mode 100644 index 00000000..8ea18f8e --- /dev/null +++ b/node_modules/d3-fetch/src/text.js @@ -0,0 +1,8 @@ +function responseText(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.text(); +} + +export default function(input, init) { + return fetch(input, init).then(responseText); +} diff --git a/node_modules/d3-fetch/src/xml.js b/node_modules/d3-fetch/src/xml.js new file mode 100644 index 00000000..56282804 --- /dev/null +++ b/node_modules/d3-fetch/src/xml.js @@ -0,0 +1,12 @@ +import text from "./text.js"; + +function parser(type) { + return (input, init) => text(input, init) + .then(text => (new DOMParser).parseFromString(text, type)); +} + +export default parser("application/xml"); + +export var html = parser("text/html"); + +export var svg = parser("image/svg+xml"); diff --git a/node_modules/d3-force/LICENSE b/node_modules/d3-force/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-force/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-force/README.md b/node_modules/d3-force/README.md new file mode 100644 index 00000000..08323395 --- /dev/null +++ b/node_modules/d3-force/README.md @@ -0,0 +1,468 @@ +# d3-force + +This module implements a [velocity Verlet](https://en.wikipedia.org/wiki/Verlet_integration) numerical integrator for simulating physical forces on particles. The simulation is simplified: it assumes a constant unit time step Δ*t* = 1 for each step, and a constant unit mass *m* = 1 for all particles. As a result, a force *F* acting on a particle is equivalent to a constant acceleration *a* over the time interval Δ*t*, and can be simulated simply by adding to the particle’s velocity, which is then added to the particle’s position. + +In the domain of information visualization, physical simulations are useful for studying [networks](http://bl.ocks.org/mbostock/ad70335eeef6d167bc36fd3c04378048) and [hierarchies](http://bl.ocks.org/mbostock/95aa92e2f4e8345aaa55a4a94d41ce37)! + +[Force Dragging III](http://bl.ocks.org/mbostock/ad70335eeef6d167bc36fd3c04378048)[Force-Directed Tree](http://bl.ocks.org/mbostock/95aa92e2f4e8345aaa55a4a94d41ce37) + +You can also simulate circles (disks) with collision, such as for [bubble charts](http://www.nytimes.com/interactive/2012/09/06/us/politics/convention-word-counts.html) or [beeswarm plots](http://bl.ocks.org/mbostock/6526445e2b44303eebf21da3b6627320): + +[Collision Detection](http://bl.ocks.org/mbostock/31ce330646fa8bcb7289ff3b97aab3f5)[Beeswarm](http://bl.ocks.org/mbostock/6526445e2b44303eebf21da3b6627320) + +You can even use it as a rudimentary physics engine, say to simulate cloth: + +[Force-Directed Lattice](http://bl.ocks.org/mbostock/1b64ec067fcfc51e7471d944f51f1611) + +To use this module, create a [simulation](#simulation) for an array of [nodes](#simulation_nodes), and compose the desired [forces](#simulation_force). Then [listen](#simulation_on) for tick events to render the nodes as they update in your preferred graphics system, such as Canvas or SVG. + +## Installing + +If you use NPM, `npm install d3-force`. Otherwise, download the [latest release](https://github.com/d3/d3-force/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-force.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3_force` global is exported: + +```html + + + + + +``` + +[Try d3-force in your browser.](https://observablehq.com/collection/@d3/d3-force) + +## API Reference + +### Simulation + +# d3.forceSimulation([nodes]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js "Source") + +Creates a new simulation with the specified array of [*nodes*](#simulation_nodes) and no [forces](#simulation_force). If *nodes* is not specified, it defaults to the empty array. The simulator [starts](#simulation_restart) automatically; use [*simulation*.on](#simulation_on) to listen for tick events as the simulation runs. If you wish to run the simulation manually instead, call [*simulation*.stop](#simulation_stop), and then call [*simulation*.tick](#simulation_tick) as desired. + +# simulation.restart() [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L86 "Source") + +Restarts the simulation’s internal timer and returns the simulation. In conjunction with [*simulation*.alphaTarget](#simulation_alphaTarget) or [*simulation*.alpha](#simulation_alpha), this method can be used to “reheat†the simulation during interaction, such as when dragging a node, or to resume the simulation after temporarily pausing it with [*simulation*.stop](#simulation_stop). + +# simulation.stop() [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L90 "Source") + +Stops the simulation’s internal timer, if it is running, and returns the simulation. If the timer is already stopped, this method does nothing. This method is useful for running the simulation manually; see [*simulation*.tick](#simulation_tick). + +# simulation.tick([iterations]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L38 "Source") + +Manually steps the simulation by the specified number of *iterations*, and returns the simulation. If *iterations* is not specified, it defaults to 1 (single step). + +For each iteration, it increments the current [*alpha*](#simulation_alpha) by ([*alphaTarget*](#simulation_alphaTarget) - *alpha*) × [*alphaDecay*](#simulation_alphaDecay); then invokes each registered [force](#simulation_force), passing the new *alpha*; then decrements each [node](#simulation_nodes)’s velocity by *velocity* × [*velocityDecay*](#simulation_velocityDecay); lastly increments each node’s position by *velocity*. + +This method does not dispatch [events](#simulation_on); events are only dispatched by the internal timer when the simulation is started automatically upon [creation](#forceSimulation) or by calling [*simulation*.restart](#simulation_restart). The natural number of ticks when the simulation is started is ⌈*log*([*alphaMin*](#simulation_alphaMin)) / *log*(1 - [*alphaDecay*](#simulation_alphaDecay))⌉; by default, this is 300. + +This method can be used in conjunction with [*simulation*.stop](#simulation_stop) to compute a [static force layout](https://bl.ocks.org/mbostock/1667139). For large graphs, static layouts should be computed [in a web worker](https://bl.ocks.org/mbostock/01ab2e85e8727d6529d20391c0fd9a16) to avoid freezing the user interface. + +# simulation.nodes([nodes]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L94 "Source") + +If *nodes* is specified, sets the simulation’s nodes to the specified array of objects, initializing their positions and velocities if necessary, and then [re-initializes](#force_initialize) any bound [forces](#simulation_force); returns the simulation. If *nodes* is not specified, returns the simulation’s array of nodes as specified to the [constructor](#forceSimulation). + +Each *node* must be an object. The following properties are assigned by the simulation: + +* `index` - the node’s zero-based index into *nodes* +* `x` - the node’s current *x*-position +* `y` - the node’s current *y*-position +* `vx` - the node’s current *x*-velocity +* `vy` - the node’s current *y*-velocity + +The position ⟨*x*,*y*⟩ and velocity ⟨*vx*,*vy*⟩ may be subsequently modified by [forces](#forces) and by the simulation. If either *vx* or *vy* is NaN, the velocity is initialized to ⟨0,0⟩. If either *x* or *y* is NaN, the position is initialized in a [phyllotaxis arrangement](https://observablehq.com/@d3/force-layout-phyllotaxis), so chosen to ensure a deterministic, uniform distribution. + +To fix a node in a given position, you may specify two additional properties: + +* `fx` - the node’s fixed *x*-position +* `fy` - the node’s fixed *y*-position + +At the end of each [tick](#simulation_tick), after the application of any forces, a node with a defined *node*.fx has *node*.x reset to this value and *node*.vx set to zero; likewise, a node with a defined *node*.fy has *node*.y reset to this value and *node*.vy set to zero. To unfix a node that was previously fixed, set *node*.fx and *node*.fy to null, or delete these properties. + +If the specified array of *nodes* is modified, such as when nodes are added to or removed from the simulation, this method must be called again with the new (or changed) array to notify the simulation and bound forces of the change; the simulation does not make a defensive copy of the specified array. + +# simulation.alpha([alpha]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L98 "Source") + +*alpha* is roughly analogous to temperature in [simulated annealing](https://en.wikipedia.org/wiki/Simulated_annealing#Overview). It decreases over time as the simulation “cools downâ€. When *alpha* reaches *alphaMin*, the simulation stops; see [*simulation*.restart](#simulation_restart). + +If *alpha* is specified, sets the current alpha to the specified number in the range [0,1] and returns this simulation. If *alpha* is not specified, returns the current alpha value, which defaults to 1. + +# simulation.alphaMin([min]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L102 "Source") + +If *min* is specified, sets the minimum *alpha* to the specified number in the range [0,1] and returns this simulation. If *min* is not specified, returns the current minimum *alpha* value, which defaults to 0.001. The simulation’s internal timer stops when the current [*alpha*](#simulation_alpha) is less than the minimum *alpha*. The default [alpha decay rate](#simulation_alphaDecay) of ~0.0228 corresponds to 300 iterations. + +# simulation.alphaDecay([decay]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L106 "Source") + +If *decay* is specified, sets the [*alpha*](#simulation_alpha) decay rate to the specified number in the range [0,1] and returns this simulation. If *decay* is not specified, returns the current *alpha* decay rate, which defaults to 0.0228… = 1 - *pow*(0.001, 1 / 300) where 0.001 is the default [minimum *alpha*](#simulation_alphaMin). + +The alpha decay rate determines how quickly the current alpha interpolates towards the desired [target *alpha*](#simulation_alphaTarget); since the default target *alpha* is zero, by default this controls how quickly the simulation cools. Higher decay rates cause the simulation to stabilize more quickly, but risk getting stuck in a local minimum; lower values cause the simulation to take longer to run, but typically converge on a better layout. To have the simulation run forever at the current *alpha*, set the *decay* rate to zero; alternatively, set a [target *alpha*](#simulation_alphaTarget) greater than the [minimum *alpha*](#simulation_alphaMin). + +# simulation.alphaTarget([target]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L110 "Source") + +If *target* is specified, sets the current target [*alpha*](#simulation_alpha) to the specified number in the range [0,1] and returns this simulation. If *target* is not specified, returns the current target alpha value, which defaults to 0. + +# simulation.velocityDecay([decay]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L114 "Source") + +If *decay* is specified, sets the velocity decay factor to the specified number in the range [0,1] and returns this simulation. If *decay* is not specified, returns the current velocity decay factor, which defaults to 0.4. The decay factor is akin to atmospheric friction; after the application of any forces during a [tick](#simulation_tick), each node’s velocity is multiplied by 1 - *decay*. As with lowering the [alpha decay rate](#simulation_alphaDecay), less velocity decay may converge on a better solution, but risks numerical instabilities and oscillation. + +# simulation.force(name[, force]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L118 "Source") + +If *force* is specified, assigns the [force](#forces) for the specified *name* and returns this simulation. If *force* is not specified, returns the force with the specified name, or undefined if there is no such force. (By default, new simulations have no forces.) For example, to create a new simulation to layout a graph, you might say: + +```js +var simulation = d3.forceSimulation(nodes) + .force("charge", d3.forceManyBody()) + .force("link", d3.forceLink(links)) + .force("center", d3.forceCenter()); +``` + +To remove the force with the given *name*, pass null as the *force*. For example, to remove the charge force: + +```js +simulation.force("charge", null); +``` + +# simulation.find(x, y[, radius]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L122 "Source") + +Returns the node closest to the position ⟨*x*,*y*⟩ with the given search *radius*. If *radius* is not specified, it defaults to infinity. If there is no node within the search area, returns undefined. + +# simulation.randomSource([source]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js "Source")) + +If *source* is specified, sets the function used to generate random numbers; this should be a function that returns a number between 0 (inclusive) and 1 (exclusive). If *source* is not specified, returns this simulation’s current random source which defaults to a fixed-seed [linear congruential generator](https://en.wikipedia.org/wiki/Linear_congruential_generator). See also [*random*.source](https://github.com/d3/d3-random/blob/master/README.md#random_source). + +# simulation.on(typenames, [listener]) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L145 "Source") + +If *listener* is specified, sets the event *listener* for the specified *typenames* and returns this simulation. If an event listener was already registered for the same type and name, the existing listener is removed before the new listener is added. If *listener* is null, removes the current event listeners for the specified *typenames*, if any. If *listener* is not specified, returns the first currently-assigned listener matching the specified *typenames*, if any. When a specified event is dispatched, each *listener* will be invoked with the `this` context as the simulation. + +The *typenames* is a string containing one or more *typename* separated by whitespace. Each *typename* is a *type*, optionally followed by a period (`.`) and a *name*, such as `tick.foo` and `tick.bar`; the name allows multiple listeners to be registered for the same *type*. The *type* must be one of the following: + +* `tick` - after each tick of the simulation’s internal timer. +* `end` - after the simulation’s timer stops when *alpha* < [*alphaMin*](#simulation_alphaMin). + +Note that *tick* events are not dispatched when [*simulation*.tick](#simulation_tick) is called manually; events are only dispatched by the internal timer and are intended for interactive rendering of the simulation. To affect the simulation, register [forces](#simulation_force) instead of modifying nodes’ positions or velocities inside a tick event listener. + +See [*dispatch*.on](https://github.com/d3/d3-dispatch#dispatch_on) for details. + +### Forces + +A *force* is simply a function that modifies nodes’ positions or velocities; in this context, a *force* can apply a classical physical force such as electrical charge or gravity, or it can resolve a geometric constraint, such as keeping nodes within a bounding box or keeping linked nodes a fixed distance apart. For example, a simple positioning force that moves nodes towards the origin ⟨0,0⟩ might be implemented as: + +```js +function force(alpha) { + for (var i = 0, n = nodes.length, node, k = alpha * 0.1; i < n; ++i) { + node = nodes[i]; + node.vx -= node.x * k; + node.vy -= node.y * k; + } +} +``` + +Forces typically read the node’s current position ⟨*x*,*y*⟩ and then add to (or subtract from) the node’s velocity ⟨*vx*,*vy*⟩. However, forces may also “peek ahead†to the anticipated next position of the node, ⟨*x* + *vx*,*y* + *vy*⟩; this is necessary for resolving geometric constraints through [iterative relaxation](https://en.wikipedia.org/wiki/Relaxation_\(iterative_method\)). Forces may also modify the position directly, which is sometimes useful to avoid adding energy to the simulation, such as when recentering the simulation in the viewport. + +Simulations typically compose multiple forces as desired. This module provides several for your enjoyment: + +* [Centering](#centering) +* [Collision](#collision) +* [Links](#links) +* [Many-Body](#many-body) +* [Positioning](#positioning) + +Forces may optionally implement [*force*.initialize](#force_initialize) to receive the simulation’s array of nodes. + +# force(alpha) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L47 "Source") + +Applies this force, optionally observing the specified *alpha*. Typically, the force is applied to the array of nodes previously passed to [*force*.initialize](#force_initialize), however, some forces may apply to a subset of nodes, or behave differently. For example, [d3.forceLink](#links) applies to the source and target of each link. + +# force.initialize(nodes, random) [<>](https://github.com/d3/d3-force/blob/master/src/simulation.js#L77 "Source") + +Supplies the array of *nodes* and *random* source to this force. This method is called when a force is bound to a simulation via [*simulation*.force](#simulation_force) and when the simulation’s nodes change via [*simulation*.nodes](#simulation_nodes). A force may perform necessary work during initialization, such as evaluating per-node parameters, to avoid repeatedly performing work during each application of the force. + +#### Centering + +The centering force translates nodes uniformly so that the mean position of all nodes (the center of mass if all nodes have equal weight) is at the given position ⟨[*x*](#center_x),[*y*](#center_y)⟩. This force modifies the positions of nodes on each application; it does not modify velocities, as doing so would typically cause the nodes to overshoot and oscillate around the desired center. This force helps keeps nodes in the center of the viewport, and unlike the [positioning force](#positioning), it does not distort their relative positions. + +# d3.forceCenter([x, y]) [<>](https://github.com/d3/d3-force/blob/master/src/center.js "Source") + +Creates a new centering force with the specified [*x*-](#center_x) and [*y*-](#center_y) coordinates. If *x* and *y* are not specified, they default to ⟨0,0⟩. + +# center.x([x]) [<>](https://github.com/d3/d3-force/blob/master/src/center.js "Source") + +If *x* is specified, sets the *x*-coordinate of the centering position to the specified number and returns this force. If *x* is not specified, returns the current *x*-coordinate, which defaults to zero. + +# center.y([y]) [<>](https://github.com/d3/d3-force/blob/master/src/center.js "Source") + +If *y* is specified, sets the *y*-coordinate of the centering position to the specified number and returns this force. If *y* is not specified, returns the current *y*-coordinate, which defaults to zero. + +# center.strength([strength]) · [<>](https://github.com/d3/d3-force/blob/master/src/center.js "Source") + +If *strength* is specified, sets the centering force’s strength. A reduced strength of e.g. 0.05 softens the movements on interactive graphs in which new nodes enter or exit the graph. If *strength* is not specified, returns the force’s current strength, which defaults to 1. + +#### Collision + +The collision force treats nodes as circles with a given [radius](#collide_radius), rather than points, and prevents nodes from overlapping. More formally, two nodes *a* and *b* are separated so that the distance between *a* and *b* is at least *radius*(*a*) + *radius*(*b*). To reduce jitter, this is by default a “soft†constraint with a configurable [strength](#collide_strength) and [iteration count](#collide_iterations). + +# d3.forceCollide([radius]) [<>](https://github.com/d3/d3-force/blob/master/src/collide.js "Source") + +Creates a new circle collision force with the specified [*radius*](#collide_radius). If *radius* is not specified, it defaults to the constant one for all nodes. + +# collide.radius([radius]) [<>](https://github.com/d3/d3-force/blob/master/src/collide.js#L86 "Source") + +If *radius* is specified, sets the radius accessor to the specified number or function, re-evaluates the radius accessor for each node, and returns this force. If *radius* is not specified, returns the current radius accessor, which defaults to: + +```js +function radius() { + return 1; +} +``` + +The radius accessor is invoked for each [node](#simulation_nodes) in the simulation, being passed the *node* and its zero-based *index*. The resulting number is then stored internally, such that the radius of each node is only recomputed when the force is initialized or when this method is called with a new *radius*, and not on every application of the force. + +# collide.strength([strength]) [<>](https://github.com/d3/d3-force/blob/master/src/collide.js#L82 "Source") + +If *strength* is specified, sets the force strength to the specified number in the range [0,1] and returns this force. If *strength* is not specified, returns the current strength which defaults to 1. + +Overlapping nodes are resolved through iterative relaxation. For each node, the other nodes that are anticipated to overlap at the next tick (using the anticipated positions ⟨*x* + *vx*,*y* + *vy*⟩) are determined; the node’s velocity is then modified to push the node out of each overlapping node. The change in velocity is dampened by the force’s strength such that the resolution of simultaneous overlaps can be blended together to find a stable solution. + +# collide.iterations([iterations]) [<>](https://github.com/d3/d3-force/blob/master/src/collide.js#L78 "Source") + +If *iterations* is specified, sets the number of iterations per application to the specified number and returns this force. If *iterations* is not specified, returns the current iteration count which defaults to 1. Increasing the number of iterations greatly increases the rigidity of the constraint and avoids partial overlap of nodes, but also increases the runtime cost to evaluate the force. + +#### Links + +The link force pushes linked nodes together or apart according to the desired [link distance](#link_distance). The strength of the force is proportional to the difference between the linked nodes’ distance and the target distance, similar to a spring force. + +# d3.forceLink([links]) [<>](https://github.com/d3/d3-force/blob/master/src/link.js "Source") + +Creates a new link force with the specified *links* and default parameters. If *links* is not specified, it defaults to the empty array. + +# link.links([links]) [<>](https://github.com/d3/d3-force/blob/master/src/link.js#L92 "Source") + +If *links* is specified, sets the array of links associated with this force, recomputes the [distance](#link_distance) and [strength](#link_strength) parameters for each link, and returns this force. If *links* is not specified, returns the current array of links, which defaults to the empty array. + +Each link is an object with the following properties: + +* `source` - the link’s source node; see [*simulation*.nodes](#simulation_nodes) +* `target` - the link’s target node; see [*simulation*.nodes](#simulation_nodes) +* `index` - the zero-based index into *links*, assigned by this method + +For convenience, a link’s source and target properties may be initialized using numeric or string identifiers rather than object references; see [*link*.id](#link_id). When the link force is [initialized](#force_initialize) (or re-initialized, as when the nodes or links change), any *link*.source or *link*.target property which is *not* an object is replaced by an object reference to the corresponding *node* with the given identifier. + +If the specified array of *links* is modified, such as when links are added to or removed from the simulation, this method must be called again with the new (or changed) array to notify the force of the change; the force does not make a defensive copy of the specified array. + +# link.id([id]) [<>](https://github.com/d3/d3-force/blob/master/src/link.js#L96 "Source") + +If *id* is specified, sets the node id accessor to the specified function and returns this force. If *id* is not specified, returns the current node id accessor, which defaults to the numeric *node*.index: + +```js +function id(d) { + return d.index; +} +``` + +The default id accessor allows each link’s source and target to be specified as a zero-based index into the [nodes](#simulation_nodes) array. For example: + +```js +var nodes = [ + {"id": "Alice"}, + {"id": "Bob"}, + {"id": "Carol"} +]; + +var links = [ + {"source": 0, "target": 1}, // Alice → Bob + {"source": 1, "target": 2} // Bob → Carol +]; +``` + +Now consider a different id accessor that returns a string: + +```js +function id(d) { + return d.id; +} +``` + +With this accessor, you can use named sources and targets: + +```js +var nodes = [ + {"id": "Alice"}, + {"id": "Bob"}, + {"id": "Carol"} +]; + +var links = [ + {"source": "Alice", "target": "Bob"}, + {"source": "Bob", "target": "Carol"} +]; +``` + +This is particularly useful when representing graphs in JSON, as JSON does not allow references. See [this example](http://bl.ocks.org/mbostock/f584aa36df54c451c94a9d0798caed35). + +The id accessor is invoked for each node whenever the force is initialized, as when the [nodes](#simulation_nodes) or [links](#link_links) change, being passed the node and its zero-based index. + +# link.distance([distance]) [<>](https://github.com/d3/d3-force/blob/master/src/link.js#L108 "Source") + +If *distance* is specified, sets the distance accessor to the specified number or function, re-evaluates the distance accessor for each link, and returns this force. If *distance* is not specified, returns the current distance accessor, which defaults to: + +```js +function distance() { + return 30; +} +``` + +The distance accessor is invoked for each [link](#link_links), being passed the *link* and its zero-based *index*. The resulting number is then stored internally, such that the distance of each link is only recomputed when the force is initialized or when this method is called with a new *distance*, and not on every application of the force. + +# link.strength([strength]) [<>](https://github.com/d3/d3-force/blob/master/src/link.js#L104 "Source") + +If *strength* is specified, sets the strength accessor to the specified number or function, re-evaluates the strength accessor for each link, and returns this force. If *strength* is not specified, returns the current strength accessor, which defaults to: + +```js +function strength(link) { + return 1 / Math.min(count(link.source), count(link.target)); +} +``` + +Where *count*(*node*) is a function that returns the number of links with the given node as a source or target. This default was chosen because it automatically reduces the strength of links connected to heavily-connected nodes, improving stability. + +The strength accessor is invoked for each [link](#link_links), being passed the *link* and its zero-based *index*. The resulting number is then stored internally, such that the strength of each link is only recomputed when the force is initialized or when this method is called with a new *strength*, and not on every application of the force. + +# link.iterations([iterations]) [<>](https://github.com/d3/d3-force/blob/master/src/link.js#L100 "Source") + +If *iterations* is specified, sets the number of iterations per application to the specified number and returns this force. If *iterations* is not specified, returns the current iteration count which defaults to 1. Increasing the number of iterations greatly increases the rigidity of the constraint and is useful for [complex structures such as lattices](http://bl.ocks.org/mbostock/1b64ec067fcfc51e7471d944f51f1611), but also increases the runtime cost to evaluate the force. + +#### Many-Body + +The many-body (or *n*-body) force applies mutually amongst all [nodes](#simulation_nodes). It can be used to simulate gravity (attraction) if the [strength](#manyBody_strength) is positive, or electrostatic charge (repulsion) if the strength is negative. This implementation uses quadtrees and the [Barnes–Hut approximation](https://en.wikipedia.org/wiki/Barnes–Hut_simulation) to greatly improve performance; the accuracy can be customized using the [theta](#manyBody_theta) parameter. + +Unlike links, which only affect two linked nodes, the charge force is global: every node affects every other node, even if they are on disconnected subgraphs. + +# d3.forceManyBody() [<>](https://github.com/d3/d3-force/blob/master/src/manyBody.js "Source") + +Creates a new many-body force with the default parameters. + +# manyBody.strength([strength]) [<>](https://github.com/d3/d3-force/blob/master/src/manyBody.js#L97 "Source") + +If *strength* is specified, sets the strength accessor to the specified number or function, re-evaluates the strength accessor for each node, and returns this force. A positive value causes nodes to attract each other, similar to gravity, while a negative value causes nodes to repel each other, similar to electrostatic charge. If *strength* is not specified, returns the current strength accessor, which defaults to: + +```js +function strength() { + return -30; +} +``` + +The strength accessor is invoked for each [node](#simulation_nodes) in the simulation, being passed the *node* and its zero-based *index*. The resulting number is then stored internally, such that the strength of each node is only recomputed when the force is initialized or when this method is called with a new *strength*, and not on every application of the force. + +# manyBody.theta([theta]) [<>](https://github.com/d3/d3-force/blob/master/src/manyBody.js#L109 "Source") + +If *theta* is specified, sets the Barnes–Hut approximation criterion to the specified number and returns this force. If *theta* is not specified, returns the current value, which defaults to 0.9. + +To accelerate computation, this force implements the [Barnes–Hut approximation](http://en.wikipedia.org/wiki/Barnes–Hut_simulation) which takes O(*n* log *n*) per application where *n* is the number of [nodes](#simulation_nodes). For each application, a [quadtree](https://github.com/d3/d3-quadtree) stores the current node positions; then for each node, the combined force of all other nodes on the given node is computed. For a cluster of nodes that is far away, the charge force can be approximated by treating the cluster as a single, larger node. The *theta* parameter determines the accuracy of the approximation: if the ratio *w* / *l* of the width *w* of the quadtree cell to the distance *l* from the node to the cell’s center of mass is less than *theta*, all nodes in the given cell are treated as a single node rather than individually. + +# manyBody.distanceMin([distance]) [<>](https://github.com/d3/d3-force/blob/master/src/manyBody.js#L101 "Source") + +If *distance* is specified, sets the minimum distance between nodes over which this force is considered. If *distance* is not specified, returns the current minimum distance, which defaults to 1. A minimum distance establishes an upper bound on the strength of the force between two nearby nodes, avoiding instability. In particular, it avoids an infinitely-strong force if two nodes are exactly coincident; in this case, the direction of the force is random. + +# manyBody.distanceMax([distance]) [<>](https://github.com/d3/d3-force/blob/master/src/manyBody.js#L105 "Source") + +If *distance* is specified, sets the maximum distance between nodes over which this force is considered. If *distance* is not specified, returns the current maximum distance, which defaults to infinity. Specifying a finite maximum distance improves performance and produces a more localized layout. + +#### Positioning + +The [*x*](#forceX)- and [*y*](#forceY)-positioning forces push nodes towards a desired position along the given dimension with a configurable strength. The [*radial*](#forceRadial) force is similar, except it pushes nodes towards the closest point on a given circle. The strength of the force is proportional to the one-dimensional distance between the node’s position and the target position. While these forces can be used to position individual nodes, they are intended primarily for global forces that apply to all (or most) nodes. + +# d3.forceX([x]) [<>](https://github.com/d3/d3-force/blob/master/src/x.js "Source") + +Creates a new positioning force along the *x*-axis towards the given position [*x*](#x_x). If *x* is not specified, it defaults to 0. + +# x.strength([strength]) [<>](https://github.com/d3/d3-force/blob/master/src/x.js#L32 "Source") + +If *strength* is specified, sets the strength accessor to the specified number or function, re-evaluates the strength accessor for each node, and returns this force. The *strength* determines how much to increment the node’s *x*-velocity: ([*x*](#x_x) - *node*.x) × *strength*. For example, a value of 0.1 indicates that the node should move a tenth of the way from its current *x*-position to the target *x*-position with each application. Higher values moves nodes more quickly to the target position, often at the expense of other forces or constraints. A value outside the range [0,1] is not recommended. + +If *strength* is not specified, returns the current strength accessor, which defaults to: + +```js +function strength() { + return 0.1; +} +``` + +The strength accessor is invoked for each [node](#simulation_nodes) in the simulation, being passed the *node* and its zero-based *index*. The resulting number is then stored internally, such that the strength of each node is only recomputed when the force is initialized or when this method is called with a new *strength*, and not on every application of the force. + +# x.x([x]) [<>](https://github.com/d3/d3-force/blob/master/src/x.js#L36 "Source") + +If *x* is specified, sets the *x*-coordinate accessor to the specified number or function, re-evaluates the *x*-accessor for each node, and returns this force. If *x* is not specified, returns the current *x*-accessor, which defaults to: + +```js +function x() { + return 0; +} +``` + +The *x*-accessor is invoked for each [node](#simulation_nodes) in the simulation, being passed the *node* and its zero-based *index*. The resulting number is then stored internally, such that the target *x*-coordinate of each node is only recomputed when the force is initialized or when this method is called with a new *x*, and not on every application of the force. + +# d3.forceY([y]) [<>](https://github.com/d3/d3-force/blob/master/src/y.js "Source") + +Creates a new positioning force along the *y*-axis towards the given position [*y*](#y_y). If *y* is not specified, it defaults to 0. + +# y.strength([strength]) [<>](https://github.com/d3/d3-force/blob/master/src/y.js#L32 "Source") + +If *strength* is specified, sets the strength accessor to the specified number or function, re-evaluates the strength accessor for each node, and returns this force. The *strength* determines how much to increment the node’s *y*-velocity: ([*y*](#y_y) - *node*.y) × *strength*. For example, a value of 0.1 indicates that the node should move a tenth of the way from its current *y*-position to the target *y*-position with each application. Higher values moves nodes more quickly to the target position, often at the expense of other forces or constraints. A value outside the range [0,1] is not recommended. + +If *strength* is not specified, returns the current strength accessor, which defaults to: + +```js +function strength() { + return 0.1; +} +``` + +The strength accessor is invoked for each [node](#simulation_nodes) in the simulation, being passed the *node* and its zero-based *index*. The resulting number is then stored internally, such that the strength of each node is only recomputed when the force is initialized or when this method is called with a new *strength*, and not on every application of the force. + +# y.y([y]) [<>](https://github.com/d3/d3-force/blob/master/src/y.js#L36 "Source") + +If *y* is specified, sets the *y*-coordinate accessor to the specified number or function, re-evaluates the *y*-accessor for each node, and returns this force. If *y* is not specified, returns the current *y*-accessor, which defaults to: + +```js +function y() { + return 0; +} +``` + +The *y*-accessor is invoked for each [node](#simulation_nodes) in the simulation, being passed the *node* and its zero-based *index*. The resulting number is then stored internally, such that the target *y*-coordinate of each node is only recomputed when the force is initialized or when this method is called with a new *y*, and not on every application of the force. + +# d3.forceRadial(radius[, x][, y]) [<>](https://github.com/d3/d3-force/blob/master/src/radial.js "Source") + +[Radial Force](https://bl.ocks.org/mbostock/cd98bf52e9067e26945edd95e8cf6ef9) + +Creates a new positioning force towards a circle of the specified [*radius*](#radial_radius) centered at ⟨[*x*](#radial_x),[*y*](#radial_y)⟩. If *x* and *y* are not specified, they default to ⟨0,0⟩. + +# radial.strength([strength]) [<>](https://github.com/d3/d3-force/blob/master/src/radial.js "Source") + +If *strength* is specified, sets the strength accessor to the specified number or function, re-evaluates the strength accessor for each node, and returns this force. The *strength* determines how much to increment the node’s *x*- and *y*-velocity. For example, a value of 0.1 indicates that the node should move a tenth of the way from its current position to the closest point on the circle with each application. Higher values moves nodes more quickly to the target position, often at the expense of other forces or constraints. A value outside the range [0,1] is not recommended. + +If *strength* is not specified, returns the current strength accessor, which defaults to: + +```js +function strength() { + return 0.1; +} +``` + +The strength accessor is invoked for each [node](#simulation_nodes) in the simulation, being passed the *node* and its zero-based *index*. The resulting number is then stored internally, such that the strength of each node is only recomputed when the force is initialized or when this method is called with a new *strength*, and not on every application of the force. + +# radial.radius([radius]) [<>](https://github.com/d3/d3-force/blob/master/src/radial.js "Source") + +If *radius* is specified, sets the circle *radius* to the specified number or function, re-evaluates the *radius* accessor for each node, and returns this force. If *radius* is not specified, returns the current *radius* accessor. + +The *radius* accessor is invoked for each [node](#simulation_nodes) in the simulation, being passed the *node* and its zero-based *index*. The resulting number is then stored internally, such that the target radius of each node is only recomputed when the force is initialized or when this method is called with a new *radius*, and not on every application of the force. + +# radial.x([x]) [<>](https://github.com/d3/d3-force/blob/master/src/radial.js "Source") + +If *x* is specified, sets the *x*-coordinate of the circle center to the specified number and returns this force. If *x* is not specified, returns the current *x*-coordinate of the center, which defaults to zero. + +# radial.y([y]) [<>](https://github.com/d3/d3-force/blob/master/src/radial.js "Source") + +If *y* is specified, sets the *y*-coordinate of the circle center to the specified number and returns this force. If *y* is not specified, returns the current *y*-coordinate of the center, which defaults to zero. diff --git a/node_modules/d3-force/dist/d3-force.js b/node_modules/d3-force/dist/d3-force.js new file mode 100644 index 00000000..d96788dd --- /dev/null +++ b/node_modules/d3-force/dist/d3-force.js @@ -0,0 +1,693 @@ +// https://d3js.org/d3-force/ v2.1.1 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-quadtree'), require('d3-dispatch'), require('d3-timer')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-quadtree', 'd3-dispatch', 'd3-timer'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3)); +}(this, function (exports, d3Quadtree, d3Dispatch, d3Timer) { 'use strict'; + +function center(x, y) { + var nodes, strength = 1; + + if (x == null) x = 0; + if (y == null) y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + + force.initialize = function(_) { + nodes = _; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + return force; +} + +function constant(x) { + return function() { + return x; + }; +} + +function jiggle(random) { + return (random() - 0.5) * 1e-6; +} + +function x(d) { + return d.x + d.vx; +} + +function y(d) { + return d.y + d.vy; +} + +function collide(radius) { + var nodes, + radii, + random, + strength = 1, + iterations = 1; + + if (typeof radius !== "function") radius = constant(radius == null ? 1 : +radius); + + function force() { + var i, n = nodes.length, + tree, + node, + xi, + yi, + ri, + ri2; + + for (var k = 0; k < iterations; ++k) { + tree = d3Quadtree.quadtree(nodes, x, y).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); + } + } + + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > node.index) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + + function prepare(quad) { + if (quad.data) return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; + + return force; +} + +function index(d) { + return d.index; +} + +function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("node not found: " + nodeId); + return node; +} + +function link(links) { + var id = index, + strength = defaultStrength, + strengths, + distance = constant(30), + distances, + nodes, + count, + bias, + random, + iterations = 1; + + if (links == null) links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(random); + y = target.y + target.vy - source.y - source.vy || jiggle(random); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; + } + } + } + + function initialize() { + if (!nodes) return; + + var i, + n = nodes.length, + m = links.length, + nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } + + function initializeStrength() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + + function initializeDistance() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + + force.links = function(_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + + force.id = function(_) { + return arguments.length ? (id = _, force) : id; + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initializeStrength(), force) : strength; + }; + + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance; + }; + + return force; +} + +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const a = 1664525; +const c = 1013904223; +const m = 4294967296; // 2^32 + +function lcg() { + let s = 1; + return () => (s = (a * s + c) % m) / m; +} + +function x$1(d) { + return d.x; +} + +function y$1(d) { + return d.y; +} + +var initialRadius = 10, + initialAngle = Math.PI * (3 - Math.sqrt(5)); + +function simulation(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = new Map(), + stepper = d3Timer.timer(step), + event = d3Dispatch.dispatch("tick", "end"), + random = lcg(); + + if (nodes == null) nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick(iterations) { + var i, n = nodes.length, node; + + if (iterations === undefined) iterations = 1; + + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.forEach(function(force) { + force(alpha); + }); + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } + + return simulation; + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) node.x = node.fx; + if (node.fy != null) node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + + function initializeForce(force) { + if (force.initialize) force.initialize(nodes, random); + return force; + } + + initializeNodes(); + + return simulation = { + tick: tick, + + restart: function() { + return stepper.restart(step), simulation; + }, + + stop: function() { + return stepper.stop(), simulation; + }, + + nodes: function(_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes; + }, + + alpha: function(_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function(_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function(_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function(_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function(_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + randomSource: function(_) { + return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random; + }, + + force: function(name, _) { + return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function(x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) radius = Infinity; + else radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + + return closest; + }, + + on: function(name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; +} + +function manyBody() { + var nodes, + node, + random, + alpha, + strength = constant(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = d3Quadtree.quadtree(nodes, x$1, y$1).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, weight = 0, x, y, i; + + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x = y = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = Math.abs(q.value))) { + strength += q.value, weight += c, x += c * q.x, y += c * q.y; + } + } + quad.x = x / weight; + quad.y = y / weight; + } + + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do strength += strengths[q.data.index]; + while (q = q.next); + } + + quad.value = strength; + } + + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + + var x = quad.x - node.x, + y = quad.y - node.y, + w = x2 - x1, + l = x * x + y * y; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x * quad.value * alpha / l; + node.vy += y * quad.value * alpha / l; + } + return true; + } + + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) return; + + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } + + do if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x * w; + node.vy += y * w; + } while (quad = quad.next); + } + + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.distanceMin = function(_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + + force.distanceMax = function(_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + + force.theta = function(_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + + return force; +} + +function radial(radius, x, y) { + var nodes, + strength = constant(0.1), + strengths, + radiuses; + + if (typeof radius !== "function") radius = constant(+radius); + if (x == null) x = 0; + if (y == null) y = 0; + + function force(alpha) { + for (var i = 0, n = nodes.length; i < n; ++i) { + var node = nodes[i], + dx = node.x - x || 1e-6, + dy = node.y - y || 1e-6, + r = Math.sqrt(dx * dx + dy * dy), + k = (radiuses[i] - r) * strengths[i] * alpha / r; + node.vx += dx * k; + node.vy += dy * k; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + radiuses = new Array(n); + for (i = 0; i < n; ++i) { + radiuses[i] = +radius(nodes[i], i, nodes); + strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _, initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; +} + +function x$2(x) { + var strength = constant(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") x = constant(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), initialize(), force) : x; + }; + + return force; +} + +function y$2(y) { + var strength = constant(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") y = constant(y == null ? 0 : +y); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), initialize(), force) : y; + }; + + return force; +} + +exports.forceCenter = center; +exports.forceCollide = collide; +exports.forceLink = link; +exports.forceManyBody = manyBody; +exports.forceRadial = radial; +exports.forceSimulation = simulation; +exports.forceX = x$2; +exports.forceY = y$2; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-force/dist/d3-force.min.js b/node_modules/d3-force/dist/d3-force.min.js new file mode 100644 index 00000000..d6dcb2c0 --- /dev/null +++ b/node_modules/d3-force/dist/d3-force.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-force/ v2.1.1 Copyright 2020 Mike Bostock +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-quadtree"),require("d3-dispatch"),require("d3-timer")):"function"==typeof define&&define.amd?define(["exports","d3-quadtree","d3-dispatch","d3-timer"],t):t((n=n||self).d3=n.d3||{},n.d3,n.d3,n.d3)}(this,function(n,t,r,e){"use strict";function i(n){return function(){return n}}function u(n){return 1e-6*(n()-.5)}function o(n){return n.x+n.vx}function f(n){return n.y+n.vy}function a(n){return n.index}function c(n,t){var r=n.get(t);if(!r)throw new Error("node not found: "+t);return r}const l=1664525,h=1013904223,v=4294967296;function y(n){return n.x}function d(n){return n.y}var x=10,g=Math.PI*(3-Math.sqrt(5));n.forceCenter=function(n,t){var r,e=1;function i(){var i,u,o=r.length,f=0,a=0;for(i=0;iy+l||ed+l||ih.index){var v=y-o.x-o.vx,s=d-o.y-o.vy,p=v*v+s*s;pn.r&&(n.r=n[t].r)}function y(){if(r){var t,i,u=r.length;for(e=new Array(u),t=0;t[h(n,t,e),n]));for(i=0,o=new Array(a);i=l)){(n.data!==r||n.next)&&(0===v&&(x+=(v=u(e))*v),0===y&&(x+=(y=u(e))*y),x(n=(l*n+h)%v)/v}();function p(){M(),d.call("tick",t),i1?(null==r?c.delete(n):c.set(n,q(r)),t):c.get(n)},find:function(t,r,e){var i,u,o,f,a,c=0,l=n.length;for(null==e?e=1/0:e*=e,c=0;c1?(d.on(n,r),t):d.on(n)}}},n.forceX=function(n){var t,r,e,u=i(.1);function o(n){for(var i,u=0,o=t.length;u node.index) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + + function prepare(quad) { + if (quad.data) return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; + + return force; +} diff --git a/node_modules/d3-force/src/constant.js b/node_modules/d3-force/src/constant.js new file mode 100644 index 00000000..b7d42e71 --- /dev/null +++ b/node_modules/d3-force/src/constant.js @@ -0,0 +1,5 @@ +export default function(x) { + return function() { + return x; + }; +} diff --git a/node_modules/d3-force/src/index.js b/node_modules/d3-force/src/index.js new file mode 100644 index 00000000..a76c1c49 --- /dev/null +++ b/node_modules/d3-force/src/index.js @@ -0,0 +1,8 @@ +export {default as forceCenter} from "./center.js"; +export {default as forceCollide} from "./collide.js"; +export {default as forceLink} from "./link.js"; +export {default as forceManyBody} from "./manyBody.js"; +export {default as forceRadial} from "./radial.js"; +export {default as forceSimulation} from "./simulation.js"; +export {default as forceX} from "./x.js"; +export {default as forceY} from "./y.js"; diff --git a/node_modules/d3-force/src/jiggle.js b/node_modules/d3-force/src/jiggle.js new file mode 100644 index 00000000..00752b9f --- /dev/null +++ b/node_modules/d3-force/src/jiggle.js @@ -0,0 +1,3 @@ +export default function(random) { + return (random() - 0.5) * 1e-6; +} diff --git a/node_modules/d3-force/src/lcg.js b/node_modules/d3-force/src/lcg.js new file mode 100644 index 00000000..a13cf79e --- /dev/null +++ b/node_modules/d3-force/src/lcg.js @@ -0,0 +1,9 @@ +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const a = 1664525; +const c = 1013904223; +const m = 4294967296; // 2^32 + +export default function() { + let s = 1; + return () => (s = (a * s + c) % m) / m; +} diff --git a/node_modules/d3-force/src/link.js b/node_modules/d3-force/src/link.js new file mode 100644 index 00000000..df6afa69 --- /dev/null +++ b/node_modules/d3-force/src/link.js @@ -0,0 +1,117 @@ +import constant from "./constant.js"; +import jiggle from "./jiggle.js"; + +function index(d) { + return d.index; +} + +function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("node not found: " + nodeId); + return node; +} + +export default function(links) { + var id = index, + strength = defaultStrength, + strengths, + distance = constant(30), + distances, + nodes, + count, + bias, + random, + iterations = 1; + + if (links == null) links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(random); + y = target.y + target.vy - source.y - source.vy || jiggle(random); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; + } + } + } + + function initialize() { + if (!nodes) return; + + var i, + n = nodes.length, + m = links.length, + nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } + + function initializeStrength() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + + function initializeDistance() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + + force.links = function(_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + + force.id = function(_) { + return arguments.length ? (id = _, force) : id; + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initializeStrength(), force) : strength; + }; + + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance; + }; + + return force; +} diff --git a/node_modules/d3-force/src/manyBody.js b/node_modules/d3-force/src/manyBody.js new file mode 100644 index 00000000..746a0d00 --- /dev/null +++ b/node_modules/d3-force/src/manyBody.js @@ -0,0 +1,116 @@ +import {quadtree} from "d3-quadtree"; +import constant from "./constant.js"; +import jiggle from "./jiggle.js"; +import {x, y} from "./simulation.js"; + +export default function() { + var nodes, + node, + random, + alpha, + strength = constant(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = quadtree(nodes, x, y).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, weight = 0, x, y, i; + + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x = y = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = Math.abs(q.value))) { + strength += q.value, weight += c, x += c * q.x, y += c * q.y; + } + } + quad.x = x / weight; + quad.y = y / weight; + } + + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do strength += strengths[q.data.index]; + while (q = q.next); + } + + quad.value = strength; + } + + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + + var x = quad.x - node.x, + y = quad.y - node.y, + w = x2 - x1, + l = x * x + y * y; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x * quad.value * alpha / l; + node.vy += y * quad.value * alpha / l; + } + return true; + } + + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) return; + + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } + + do if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x * w; + node.vy += y * w; + } while (quad = quad.next); + } + + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.distanceMin = function(_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + + force.distanceMax = function(_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + + force.theta = function(_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + + return force; +} diff --git a/node_modules/d3-force/src/radial.js b/node_modules/d3-force/src/radial.js new file mode 100644 index 00000000..609516bf --- /dev/null +++ b/node_modules/d3-force/src/radial.js @@ -0,0 +1,57 @@ +import constant from "./constant.js"; + +export default function(radius, x, y) { + var nodes, + strength = constant(0.1), + strengths, + radiuses; + + if (typeof radius !== "function") radius = constant(+radius); + if (x == null) x = 0; + if (y == null) y = 0; + + function force(alpha) { + for (var i = 0, n = nodes.length; i < n; ++i) { + var node = nodes[i], + dx = node.x - x || 1e-6, + dy = node.y - y || 1e-6, + r = Math.sqrt(dx * dx + dy * dy), + k = (radiuses[i] - r) * strengths[i] * alpha / r; + node.vx += dx * k; + node.vy += dy * k; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + radiuses = new Array(n); + for (i = 0; i < n; ++i) { + radiuses[i] = +radius(nodes[i], i, nodes); + strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _, initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; +} diff --git a/node_modules/d3-force/src/simulation.js b/node_modules/d3-force/src/simulation.js new file mode 100644 index 00000000..7a1ff823 --- /dev/null +++ b/node_modules/d3-force/src/simulation.js @@ -0,0 +1,156 @@ +import {dispatch} from "d3-dispatch"; +import {timer} from "d3-timer"; +import lcg from "./lcg.js"; + +export function x(d) { + return d.x; +} + +export function y(d) { + return d.y; +} + +var initialRadius = 10, + initialAngle = Math.PI * (3 - Math.sqrt(5)); + +export default function(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = new Map(), + stepper = timer(step), + event = dispatch("tick", "end"), + random = lcg(); + + if (nodes == null) nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick(iterations) { + var i, n = nodes.length, node; + + if (iterations === undefined) iterations = 1; + + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.forEach(function(force) { + force(alpha); + }); + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } + + return simulation; + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) node.x = node.fx; + if (node.fy != null) node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + + function initializeForce(force) { + if (force.initialize) force.initialize(nodes, random); + return force; + } + + initializeNodes(); + + return simulation = { + tick: tick, + + restart: function() { + return stepper.restart(step), simulation; + }, + + stop: function() { + return stepper.stop(), simulation; + }, + + nodes: function(_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes; + }, + + alpha: function(_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function(_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function(_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function(_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function(_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + randomSource: function(_) { + return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random; + }, + + force: function(name, _) { + return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function(x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) radius = Infinity; + else radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + + return closest; + }, + + on: function(name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; +} diff --git a/node_modules/d3-force/src/x.js b/node_modules/d3-force/src/x.js new file mode 100644 index 00000000..2e7a8219 --- /dev/null +++ b/node_modules/d3-force/src/x.js @@ -0,0 +1,41 @@ +import constant from "./constant.js"; + +export default function(x) { + var strength = constant(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") x = constant(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), initialize(), force) : x; + }; + + return force; +} diff --git a/node_modules/d3-force/src/y.js b/node_modules/d3-force/src/y.js new file mode 100644 index 00000000..5fcde676 --- /dev/null +++ b/node_modules/d3-force/src/y.js @@ -0,0 +1,41 @@ +import constant from "./constant.js"; + +export default function(y) { + var strength = constant(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") y = constant(y == null ? 0 : +y); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), initialize(), force) : y; + }; + + return force; +} diff --git a/node_modules/d3-format/LICENSE b/node_modules/d3-format/LICENSE new file mode 100644 index 00000000..4f0b022c --- /dev/null +++ b/node_modules/d3-format/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2015 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-format/README.md b/node_modules/d3-format/README.md new file mode 100644 index 00000000..1038a435 --- /dev/null +++ b/node_modules/d3-format/README.md @@ -0,0 +1,343 @@ +# d3-format + +Ever noticed how sometimes JavaScript doesn’t display numbers the way you expect? Like, you tried to print tenths with a simple loop: + +```js +for (var i = 0; i < 10; i++) { + console.log(0.1 * i); +} +``` + +And you got this: + +```js +0 +0.1 +0.2 +0.30000000000000004 +0.4 +0.5 +0.6000000000000001 +0.7000000000000001 +0.8 +0.9 +``` + +Welcome to [binary floating point](https://en.wikipedia.org/wiki/Double-precision_floating-point_format)! ಠ_ಠ + +Yet rounding error is not the only reason to customize number formatting. A table of numbers should be formatted consistently for comparison; above, 0.0 would be better than 0. Large numbers should have grouped digits (e.g., 42,000) or be in scientific or metric notation (4.2e+4, 42k). Currencies should have fixed precision ($3.50). Reported numerical results should be rounded to significant digits (4021 becomes 4000). Number formats should appropriate to the reader’s locale (42.000,00 or 42,000.00). The list goes on. + +Formatting numbers for human consumption is the purpose of d3-format, which is modeled after Python 3’s [format specification mini-language](https://docs.python.org/3/library/string.html#format-specification-mini-language) ([PEP 3101](https://www.python.org/dev/peps/pep-3101/)). Revisiting the example above: + +```js +var f = d3.format(".1f"); +for (var i = 0; i < 10; i++) { + console.log(f(0.1 * i)); +} +``` + +Now you get this: + +```js +0.0 +0.1 +0.2 +0.3 +0.4 +0.5 +0.6 +0.7 +0.8 +0.9 +``` + +But d3-format is much more than an alias for [number.toFixed](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed)! A few more examples: + +```js +d3.format(".0%")(0.123); // rounded percentage, "12%" +d3.format("($.2f")(-3.5); // localized fixed-point currency, "(£3.50)" +d3.format("+20")(42); // space-filled and signed, " +42" +d3.format(".^20")(42); // dot-filled and centered, ".........42........." +d3.format(".2s")(42e6); // SI-prefix with two significant digits, "42M" +d3.format("#x")(48879); // prefixed lowercase hexadecimal, "0xbeef" +d3.format(",.2r")(4223); // grouped thousands with two significant digits, "4,200" +``` + +See [*locale*.format](#locale_format) for a detailed specification, and try running [d3.formatSpecifier](#formatSpecifier) on the above formats to decode their meaning. + +## Installing + +If you use NPM, `npm install d3-format`. Otherwise, download the [latest release](https://github.com/d3/d3-format/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-format.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +Locale files are published to npm and can be loaded using [d3.json](https://github.com/d3/d3-request/blob/master/README.md#json). For example, to set Russian as the default locale: + +```js +d3.json("https://cdn.jsdelivr.net/npm/d3-format@2/locale/ru-RU.json", function(error, locale) { + if (error) throw error; + + d3.formatDefaultLocale(locale); + + var format = d3.format("$,"); + + console.log(format(1234.56)); // 1 234,56 руб. +}); +``` + +[Try d3-format in your browser.](https://observablehq.com/@d3/d3-format) + +## API Reference + +# d3.format(specifier) [<>](https://github.com/d3/d3-format/blob/master/src/defaultLocale.js#L4 "Source") + +An alias for [*locale*.format](#locale_format) on the [default locale](#formatDefaultLocale). + +# d3.formatPrefix(specifier, value) [<>](https://github.com/d3/d3-format/blob/master/src/defaultLocale.js#L5 "Source") + +An alias for [*locale*.formatPrefix](#locale_formatPrefix) on the [default locale](#formatDefaultLocale). + +# locale.format(specifier) [<>](https://github.com/d3/d3-format/blob/master/src/locale.js#L18 "Source") + +Returns a new format function for the given string *specifier*. The returned function takes a number as the only argument, and returns a string representing the formatted number. The general form of a specifier is: + +``` +[​[fill]align][sign][symbol][0][width][,][.precision][~][type] +``` + +The *fill* can be any character. The presence of a fill character is signaled by the *align* character following it, which must be one of the following: + +* `>` - Forces the field to be right-aligned within the available space. (Default behavior). +* `<` - Forces the field to be left-aligned within the available space. +* `^` - Forces the field to be centered within the available space. +* `=` - like `>`, but with any sign and symbol to the left of any padding. + +The *sign* can be: + +* `-` - nothing for zero or positive and a minus sign for negative. (Default behavior.) +* `+` - a plus sign for zero or positive and a minus sign for negative. +* `(` - nothing for zero or positive and parentheses for negative. +* ` ` (space) - a space for zero or positive and a minus sign for negative. + +The *symbol* can be: + +* `$` - apply currency symbols per the locale definition. +* `#` - for binary, octal, or hexadecimal notation, prefix by `0b`, `0o`, or `0x`, respectively. + +The *zero* (`0`) option enables zero-padding; this implicitly sets *fill* to `0` and *align* to `=`. The *width* defines the minimum field width; if not specified, then the width will be determined by the content. The *comma* (`,`) option enables the use of a group separator, such as a comma for thousands. + +Depending on the *type*, the *precision* either indicates the number of digits that follow the decimal point (types `f` and `%`), or the number of significant digits (types `​`, `e`, `g`, `r`, `s` and `p`). If the precision is not specified, it defaults to 6 for all types except `​` (none), which defaults to 12. Precision is ignored for integer formats (types `b`, `o`, `d`, `x`, `X` and `c`). See [precisionFixed](#precisionFixed) and [precisionRound](#precisionRound) for help picking an appropriate precision. + +The `~` option trims insignificant trailing zeros across all format types. This is most commonly used in conjunction with types `r`, `e`, `s` and `%`. For example: + +```js +d3.format("s")(1500); // "1.50000k" +d3.format("~s")(1500); // "1.5k" +``` + +The available *type* values are: + +* `e` - exponent notation. +* `f` - fixed point notation. +* `g` - either decimal or exponent notation, rounded to significant digits. +* `r` - decimal notation, rounded to significant digits. +* `s` - decimal notation with an [SI prefix](#locale_formatPrefix), rounded to significant digits. +* `%` - multiply by 100, and then decimal notation with a percent sign. +* `p` - multiply by 100, round to significant digits, and then decimal notation with a percent sign. +* `b` - binary notation, rounded to integer. +* `o` - octal notation, rounded to integer. +* `d` - decimal notation, rounded to integer. +* `x` - hexadecimal notation, using lower-case letters, rounded to integer. +* `X` - hexadecimal notation, using upper-case letters, rounded to integer. +* `c` - converts the integer to the corresponding unicode character before printing. + +The type `​` (none) is also supported as shorthand for `~g` (with a default precision of 12 instead of 6), and the type `n` is shorthand for `,g`. For the `g`, `n` and `​` (none) types, decimal notation is used if the resulting string would have *precision* or fewer digits; otherwise, exponent notation is used. For example: + +```js +d3.format(".2")(42); // "42" +d3.format(".2")(4.2); // "4.2" +d3.format(".1")(42); // "4e+1" +d3.format(".1")(4.2); // "4" +``` + +# locale.formatPrefix(specifier, value) [<>](https://github.com/d3/d3-format/blob/master/src/locale.js#L127 "Source") + +Equivalent to [*locale*.format](#locale_format), except the returned function will convert values to the units of the appropriate [SI prefix](https://en.wikipedia.org/wiki/Metric_prefix#List_of_SI_prefixes) for the specified numeric reference *value* before formatting in fixed point notation. The following prefixes are supported: + +* `y` - yocto, 10â»Â²â´ +* `z` - zepto, 10â»Â²Â¹ +* `a` - atto, 10â»Â¹â¸ +* `f` - femto, 10â»Â¹âµ +* `p` - pico, 10â»Â¹Â² +* `n` - nano, 10â»â¹ +* `µ` - micro, 10â»â¶ +* `m` - milli, 10â»Â³ +* `​` (none) - 10â° +* `k` - kilo, 10³ +* `M` - mega, 10â¶ +* `G` - giga, 10â¹ +* `T` - tera, 10¹² +* `P` - peta, 10¹ⵠ+* `E` - exa, 10¹⸠+* `Z` - zetta, 10²¹ +* `Y` - yotta, 10²ⴠ+ +Unlike [*locale*.format](#locale_format) with the `s` format type, this method returns a formatter with a consistent SI prefix, rather than computing the prefix dynamically for each number. In addition, the *precision* for the given *specifier* represents the number of digits past the decimal point (as with `f` fixed point notation), not the number of significant digits. For example: + +```js +var f = d3.formatPrefix(",.0", 1e-6); +f(0.00042); // "420µ" +f(0.0042); // "4,200µ" +``` + +This method is useful when formatting multiple numbers in the same units for easy comparison. See [precisionPrefix](#precisionPrefix) for help picking an appropriate precision, and [bl.ocks.org/9764126](http://bl.ocks.org/mbostock/9764126) for an example. + +# d3.formatSpecifier(specifier) [<>](https://github.com/d3/d3-format/blob/master/src/formatSpecifier.js "Source") + +Parses the specified *specifier*, returning an object with exposed fields that correspond to the [format specification mini-language](#locale_format) and a toString method that reconstructs the specifier. For example, `formatSpecifier("s")` returns: + +```js +FormatSpecifier { + "fill": " ", + "align": ">", + "sign": "-", + "symbol": "", + "zero": false, + "width": undefined, + "comma": false, + "precision": undefined, + "trim": false, + "type": "s" +} +``` + +This method is useful for understanding how format specifiers are parsed and for deriving new specifiers. For example, you might compute an appropriate precision based on the numbers you want to format using [precisionFixed](#precisionFixed) and then create a new format: + +```js +var s = d3.formatSpecifier("f"); +s.precision = d3.precisionFixed(0.01); +var f = d3.format(s); +f(42); // "42.00"; +``` + +# new d3.FormatSpecifier(specifier) [<>](https://github.com/d3/d3-format/blob/master/src/formatSpecifier.js "Source") + +Given the specified *specifier* object, returning an object with exposed fields that correspond to the [format specification mini-language](#locale_format) and a toString method that reconstructs the specifier. For example, `new FormatSpecifier({type: "s"})` returns: + +```js +FormatSpecifier { + "fill": " ", + "align": ">", + "sign": "-", + "symbol": "", + "zero": false, + "width": undefined, + "comma": false, + "precision": undefined, + "trim": false, + "type": "s" +} +``` + +# d3.precisionFixed(step) [<>](https://github.com/d3/d3-format/blob/master/src/precisionFixed.js "Source") + +Returns a suggested decimal precision for fixed point notation given the specified numeric *step* value. The *step* represents the minimum absolute difference between values that will be formatted. (This assumes that the values to be formatted are also multiples of *step*.) For example, given the numbers 1, 1.5, and 2, the *step* should be 0.5 and the suggested precision is 1: + +```js +var p = d3.precisionFixed(0.5), + f = d3.format("." + p + "f"); +f(1); // "1.0" +f(1.5); // "1.5" +f(2); // "2.0" +``` + +Whereas for the numbers 1, 2 and 3, the *step* should be 1 and the suggested precision is 0: + +```js +var p = d3.precisionFixed(1), + f = d3.format("." + p + "f"); +f(1); // "1" +f(2); // "2" +f(3); // "3" +``` + +Note: for the `%` format type, subtract two: + +```js +var p = Math.max(0, d3.precisionFixed(0.05) - 2), + f = d3.format("." + p + "%"); +f(0.45); // "45%" +f(0.50); // "50%" +f(0.55); // "55%" +``` + +# d3.precisionPrefix(step, value) [<>](https://github.com/d3/d3-format/blob/master/src/precisionPrefix.js "Source") + +Returns a suggested decimal precision for use with [*locale*.formatPrefix](#locale_formatPrefix) given the specified numeric *step* and reference *value*. The *step* represents the minimum absolute difference between values that will be formatted, and *value* determines which SI prefix will be used. (This assumes that the values to be formatted are also multiples of *step*.) For example, given the numbers 1.1e6, 1.2e6, and 1.3e6, the *step* should be 1e5, the *value* could be 1.3e6, and the suggested precision is 1: + +```js +var p = d3.precisionPrefix(1e5, 1.3e6), + f = d3.formatPrefix("." + p, 1.3e6); +f(1.1e6); // "1.1M" +f(1.2e6); // "1.2M" +f(1.3e6); // "1.3M" +``` + +# d3.precisionRound(step, max) [<>](https://github.com/d3/d3-format/blob/master/src/precisionRound.js "Source") + +Returns a suggested decimal precision for format types that round to significant digits given the specified numeric *step* and *max* values. The *step* represents the minimum absolute difference between values that will be formatted, and the *max* represents the largest absolute value that will be formatted. (This assumes that the values to be formatted are also multiples of *step*.) For example, given the numbers 0.99, 1.0, and 1.01, the *step* should be 0.01, the *max* should be 1.01, and the suggested precision is 3: + +```js +var p = d3.precisionRound(0.01, 1.01), + f = d3.format("." + p + "r"); +f(0.99); // "0.990" +f(1.0); // "1.00" +f(1.01); // "1.01" +``` + +Whereas for the numbers 0.9, 1.0, and 1.1, the *step* should be 0.1, the *max* should be 1.1, and the suggested precision is 2: + +```js +var p = d3.precisionRound(0.1, 1.1), + f = d3.format("." + p + "r"); +f(0.9); // "0.90" +f(1.0); // "1.0" +f(1.1); // "1.1" +``` + +Note: for the `e` format type, subtract one: + +```js +var p = Math.max(0, d3.precisionRound(0.01, 1.01) - 1), + f = d3.format("." + p + "e"); +f(0.01); // "1.00e-2" +f(1.01); // "1.01e+0" +``` + +### Locales + +# d3.formatLocale(definition) [<>](https://github.com/d3/d3-format/blob/master/src/locale.js "Source") + +Returns a *locale* object for the specified *definition* with [*locale*.format](#locale_format) and [*locale*.formatPrefix](#locale_formatPrefix) methods. The *definition* must include the following properties: + +* `decimal` - the decimal point (e.g., `"."`). +* `thousands` - the group separator (e.g., `","`). +* `grouping` - the array of group sizes (e.g., `[3]`), cycled as needed. +* `currency` - the currency prefix and suffix (e.g., `["$", ""]`). +* `numerals` - optional; an array of ten strings to replace the numerals 0-9. +* `percent` - optional; the percent sign (defaults to `"%"`). +* `minus` - optional; the minus sign (defaults to `"−"`). +* `nan` - optional; the not-a-number value (defaults `"NaN"`). + +Note that the *thousands* property is a misnomer, as the grouping definition allows groups other than thousands. + +# d3.formatDefaultLocale(definition) [<>](https://github.com/d3/d3-format/blob/master/src/defaultLocale.js "Source") + +Equivalent to [d3.formatLocale](#formatLocale), except it also redefines [d3.format](#format) and [d3.formatPrefix](#formatPrefix) to the new locale’s [*locale*.format](#locale_format) and [*locale*.formatPrefix](#locale_formatPrefix). If you do not set a default locale, it defaults to [U.S. English](https://github.com/d3/d3-format/blob/master/locale/en-US.json). diff --git a/node_modules/d3-format/dist/d3-format.js b/node_modules/d3-format/dist/d3-format.js new file mode 100644 index 00000000..21b0a2c5 --- /dev/null +++ b/node_modules/d3-format/dist/d3-format.js @@ -0,0 +1,343 @@ +// https://d3js.org/d3-format/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3 = global.d3 || {})); +}(this, (function (exports) { 'use strict'; + +function formatDecimal(x) { + return Math.abs(x = Math.round(x)) >= 1e21 + ? x.toLocaleString("en").replace(/,/g, "") + : x.toString(10); +} + +// Computes the decimal coefficient and exponent of the specified number x with +// significant digits p, where x is positive and p is in [1, 21] or undefined. +// For example, formatDecimalParts(1.23) returns ["123", 0]. +function formatDecimalParts(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; +} + +function exponent(x) { + return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN; +} + +function formatGroup(grouping, thousands) { + return function(value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; +} + +function formatNumerals(numerals) { + return function(value) { + return value.replace(/[0-9]/g, function(i) { + return numerals[+i]; + }); + }; +} + +// [[fill]align][sign][symbol][0][width][,][.precision][~][type] +var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + +function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); +} + +formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + +function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; + this.align = specifier.align === undefined ? ">" : specifier.align + ""; + this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? "" : specifier.type + ""; +} + +FormatSpecifier.prototype.toString = function() { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + + (this.trim ? "~" : "") + + this.type; +}; + +// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. +function formatTrim(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": i0 = i1 = i; break; + case "0": if (i0 === 0) i0 = i; i1 = i; break; + default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; +} + +var prefixExponent; + +function formatPrefixAuto(x, p) { + var d = formatDecimalParts(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y! +} + +function formatRounded(x, p) { + var d = formatDecimalParts(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); +} + +var formatTypes = { + "%": (x, p) => (x * 100).toFixed(p), + "b": (x) => Math.round(x).toString(2), + "c": (x) => x + "", + "d": formatDecimal, + "e": (x, p) => x.toExponential(p), + "f": (x, p) => x.toFixed(p), + "g": (x, p) => x.toPrecision(p), + "o": (x) => Math.round(x).toString(8), + "p": (x, p) => formatRounded(x * 100, p), + "r": formatRounded, + "s": formatPrefixAuto, + "X": (x) => Math.round(x).toString(16).toUpperCase(), + "x": (x) => Math.round(x).toString(16) +}; + +function identity(x) { + return x; +} + +var map = Array.prototype.map, + prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"]; + +function formatLocale(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""), + currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", + currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", + decimal = locale.decimal === undefined ? "." : locale.decimal + "", + numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)), + percent = locale.percent === undefined ? "%" : locale.percent + "", + minus = locale.minus === undefined ? "−" : locale.minus + "", + nan = locale.nan === undefined ? "NaN" : locale.nan + ""; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + trim = specifier.trim, + type = specifier.type; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision === undefined ? 6 + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Determine the sign. -0 is not less than 0, but 1 / -0 is! + var valueNegative = value < 0 || 1 / value < 0; + + // Perform the initial formatting. + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + + // Trim insignificant zeros. + if (trim) value = formatTrim(value); + + // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign. + if (valueNegative && +value === 0 && sign !== "+") valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value†part that can be + // grouped, and fractional or exponential “suffix†part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": value = valuePrefix + value + valueSuffix + padding; break; + case "=": value = valuePrefix + padding + value + valueSuffix; break; + case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; + default: value = padding + valuePrefix + value + valueSuffix; break; + } + + return numerals(value); + } + + format.toString = function() { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function(value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; +} + +var locale; + +defaultLocale({ + thousands: ",", + grouping: [3], + currency: ["$", ""] +}); + +function defaultLocale(definition) { + locale = formatLocale(definition); + exports.format = locale.format; + exports.formatPrefix = locale.formatPrefix; + return locale; +} + +function precisionFixed(step) { + return Math.max(0, -exponent(Math.abs(step))); +} + +function precisionPrefix(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); +} + +function precisionRound(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent(max) - exponent(step)) + 1; +} + +exports.FormatSpecifier = FormatSpecifier; +exports.formatDefaultLocale = defaultLocale; +exports.formatLocale = formatLocale; +exports.formatSpecifier = formatSpecifier; +exports.precisionFixed = precisionFixed; +exports.precisionPrefix = precisionPrefix; +exports.precisionRound = precisionRound; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/node_modules/d3-format/dist/d3-format.min.js b/node_modules/d3-format/dist/d3-format.min.js new file mode 100644 index 00000000..f4460fd9 --- /dev/null +++ b/node_modules/d3-format/dist/d3-format.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-format/ v2.0.0 Copyright 2020 Mike Bostock +!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i((t="undefined"!=typeof globalThis?globalThis:t||self).d3=t.d3||{})}(this,(function(t){"use strict";function i(t,i){if((n=(t=i?t.toExponential(i-1):t.toExponential()).indexOf("e"))<0)return null;var n,r=t.slice(0,n);return[r.length>1?r[0]+r.slice(2):r,+t.slice(n+1)]}function n(t){return(t=i(Math.abs(t)))?t[1]:NaN}var r,e=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function o(t){if(!(i=e.exec(t)))throw new Error("invalid format: "+t);var i;return new a({fill:i[1],align:i[2],sign:i[3],symbol:i[4],zero:i[5],width:i[6],comma:i[7],precision:i[8]&&i[8].slice(1),trim:i[9],type:i[10]})}function a(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function s(t,n){var r=i(t,n);if(!r)return t+"";var e=r[0],o=r[1];return o<0?"0."+new Array(-o).join("0")+e:e.length>o+1?e.slice(0,o+1)+"."+e.slice(o+1):e+new Array(o-e.length+2).join("0")}o.prototype=a.prototype,a.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var c={"%":(t,i)=>(100*t).toFixed(i),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,i)=>t.toExponential(i),f:(t,i)=>t.toFixed(i),g:(t,i)=>t.toPrecision(i),o:t=>Math.round(t).toString(8),p:(t,i)=>s(100*t,i),r:s,s:function(t,n){var e=i(t,n);if(!e)return t+"";var o=e[0],a=e[1],s=a-(r=3*Math.max(-8,Math.min(8,Math.floor(a/3))))+1,c=o.length;return s===c?o:s>c?o+new Array(s-c+1).join("0"):s>0?o.slice(0,s)+"."+o.slice(s):"0."+new Array(1-s).join("0")+i(t,Math.max(0,n+s-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function h(t){return t}var l,u=Array.prototype.map,f=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function d(t){var i,e,a=void 0===t.grouping||void 0===t.thousands?h:(i=u.call(t.grouping,Number),e=t.thousands+"",function(t,n){for(var r=t.length,o=[],a=0,s=i[0],c=0;r>0&&s>0&&(c+s+1>n&&(s=Math.max(1,n-c)),o.push(t.substring(r-=s,r+s)),!((c+=s+1)>n));)s=i[a=(a+1)%i.length];return o.reverse().join(e)}),s=void 0===t.currency?"":t.currency[0]+"",l=void 0===t.currency?"":t.currency[1]+"",d=void 0===t.decimal?".":t.decimal+"",m=void 0===t.numerals?h:function(t){return function(i){return i.replace(/[0-9]/g,(function(i){return t[+i]}))}}(u.call(t.numerals,String)),p=void 0===t.percent?"%":t.percent+"",g=void 0===t.minus?"−":t.minus+"",v=void 0===t.nan?"NaN":t.nan+"";function M(t){var i=(t=o(t)).fill,n=t.align,e=t.sign,h=t.symbol,u=t.zero,M=t.width,y=t.comma,x=t.precision,b=t.trim,w=t.type;"n"===w?(y=!0,w="g"):c[w]||(void 0===x&&(x=12),b=!0,w="g"),(u||"0"===i&&"="===n)&&(u=!0,i="0",n="=");var S="$"===h?s:"#"===h&&/[boxX]/.test(w)?"0"+w.toLowerCase():"",j="$"===h?l:/[%p]/.test(w)?p:"",k=c[w],z=/[defgprs%]/.test(w);function A(t){var o,s,c,h=S,l=j;if("c"===w)l=k(t)+l,t="";else{var p=(t=+t)<0||1/t<0;if(t=isNaN(t)?v:k(Math.abs(t),x),b&&(t=function(t){t:for(var i,n=t.length,r=1,e=-1;r0&&(e=0)}return e>0?t.slice(0,e)+t.slice(i+1):t}(t)),p&&0==+t&&"+"!==e&&(p=!1),h=(p?"("===e?e:g:"-"===e||"("===e?"":e)+h,l=("s"===w?f[8+r/3]:"")+l+(p&&"("===e?")":""),z)for(o=-1,s=t.length;++o(c=t.charCodeAt(o))||c>57){l=(46===c?d+t.slice(o+1):t.slice(o))+l,t=t.slice(0,o);break}}y&&!u&&(t=a(t,1/0));var A=h.length+t.length+l.length,N=A>1)+h+t+l+N.slice(A);break;default:t=N+h+t+l}return m(t)}return x=void 0===x?6:/[gprs]/.test(w)?Math.max(1,Math.min(21,x)):Math.max(0,Math.min(20,x)),A.toString=function(){return t+""},A}return{format:M,formatPrefix:function(t,i){var r=M(((t=o(t)).type="f",t)),e=3*Math.max(-8,Math.min(8,Math.floor(n(i)/3))),a=Math.pow(10,-e),s=f[8+e/3];return function(t){return r(a*t)+s}}}}function m(i){return l=d(i),t.format=l.format,t.formatPrefix=l.formatPrefix,l}m({thousands:",",grouping:[3],currency:["$",""]}),t.FormatSpecifier=a,t.formatDefaultLocale=m,t.formatLocale=d,t.formatSpecifier=o,t.precisionFixed=function(t){return Math.max(0,-n(Math.abs(t)))},t.precisionPrefix=function(t,i){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(n(i)/3)))-n(Math.abs(t)))},t.precisionRound=function(t,i){return t=Math.abs(t),i=Math.abs(i)-t,Math.max(0,n(i)-n(t))+1},Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/node_modules/d3-format/locale/ar-001.json b/node_modules/d3-format/locale/ar-001.json new file mode 100644 index 00000000..0376eb9f --- /dev/null +++ b/node_modules/d3-format/locale/ar-001.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", ""], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-AE.json b/node_modules/d3-format/locale/ar-AE.json new file mode 100644 index 00000000..a8273089 --- /dev/null +++ b/node_modules/d3-format/locale/ar-AE.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u062f\u002e\u0625\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-BH.json b/node_modules/d3-format/locale/ar-BH.json new file mode 100644 index 00000000..5f4e5dde --- /dev/null +++ b/node_modules/d3-format/locale/ar-BH.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u062f\u002e\u0628\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-DJ.json b/node_modules/d3-format/locale/ar-DJ.json new file mode 100644 index 00000000..b893ff0c --- /dev/null +++ b/node_modules/d3-format/locale/ar-DJ.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["\u200f\u0046\u0064\u006a ", ""], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-DZ.json b/node_modules/d3-format/locale/ar-DZ.json new file mode 100644 index 00000000..e1438af1 --- /dev/null +++ b/node_modules/d3-format/locale/ar-DZ.json @@ -0,0 +1,6 @@ +{ + "decimal": "\u002c", + "thousands": "\u002e", + "grouping": [3], + "currency": ["\u062f\u002e\u062c\u002e ", ""] +} diff --git a/node_modules/d3-format/locale/ar-EG.json b/node_modules/d3-format/locale/ar-EG.json new file mode 100644 index 00000000..2b1ff3aa --- /dev/null +++ b/node_modules/d3-format/locale/ar-EG.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u062c\u002e\u0645\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-EH.json b/node_modules/d3-format/locale/ar-EH.json new file mode 100644 index 00000000..b33c32af --- /dev/null +++ b/node_modules/d3-format/locale/ar-EH.json @@ -0,0 +1,6 @@ +{ + "decimal": "\u002e", + "thousands": "\u002c", + "grouping": [3], + "currency": ["\u062f\u002e\u0645\u002e ", ""] +} diff --git a/node_modules/d3-format/locale/ar-ER.json b/node_modules/d3-format/locale/ar-ER.json new file mode 100644 index 00000000..b0f82bbe --- /dev/null +++ b/node_modules/d3-format/locale/ar-ER.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["\u004e\u0066\u006b ", ""], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-IL.json b/node_modules/d3-format/locale/ar-IL.json new file mode 100644 index 00000000..ce15fb47 --- /dev/null +++ b/node_modules/d3-format/locale/ar-IL.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["\u20aa ", ""], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-IQ.json b/node_modules/d3-format/locale/ar-IQ.json new file mode 100644 index 00000000..a6c9b3fa --- /dev/null +++ b/node_modules/d3-format/locale/ar-IQ.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u062f\u002e\u0639\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-JO.json b/node_modules/d3-format/locale/ar-JO.json new file mode 100644 index 00000000..94df180b --- /dev/null +++ b/node_modules/d3-format/locale/ar-JO.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u062f\u002e\u0623\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-KM.json b/node_modules/d3-format/locale/ar-KM.json new file mode 100644 index 00000000..84dd81ad --- /dev/null +++ b/node_modules/d3-format/locale/ar-KM.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u0641\u002e\u062c\u002e\u0642\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-KW.json b/node_modules/d3-format/locale/ar-KW.json new file mode 100644 index 00000000..b4018ab7 --- /dev/null +++ b/node_modules/d3-format/locale/ar-KW.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u062f\u002e\u0643\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-LB.json b/node_modules/d3-format/locale/ar-LB.json new file mode 100644 index 00000000..c732df33 --- /dev/null +++ b/node_modules/d3-format/locale/ar-LB.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u0644\u002e\u0644\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-LY.json b/node_modules/d3-format/locale/ar-LY.json new file mode 100644 index 00000000..431f230c --- /dev/null +++ b/node_modules/d3-format/locale/ar-LY.json @@ -0,0 +1,6 @@ +{ + "decimal": "\u002c", + "thousands": "\u002e", + "grouping": [3], + "currency": ["\u062f\u002e\u0644\u002e ", ""] +} diff --git a/node_modules/d3-format/locale/ar-MA.json b/node_modules/d3-format/locale/ar-MA.json new file mode 100644 index 00000000..abc0663b --- /dev/null +++ b/node_modules/d3-format/locale/ar-MA.json @@ -0,0 +1,6 @@ +{ + "decimal": "\u002c", + "thousands": "\u002e", + "grouping": [3], + "currency": ["\u062f\u002e\u0645\u002e ", ""] +} diff --git a/node_modules/d3-format/locale/ar-MR.json b/node_modules/d3-format/locale/ar-MR.json new file mode 100644 index 00000000..8d1f8c27 --- /dev/null +++ b/node_modules/d3-format/locale/ar-MR.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u0623\u002e\u0645\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-OM.json b/node_modules/d3-format/locale/ar-OM.json new file mode 100644 index 00000000..04ad53ad --- /dev/null +++ b/node_modules/d3-format/locale/ar-OM.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u0631\u002e\u0639\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-PS.json b/node_modules/d3-format/locale/ar-PS.json new file mode 100644 index 00000000..ce15fb47 --- /dev/null +++ b/node_modules/d3-format/locale/ar-PS.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["\u20aa ", ""], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-QA.json b/node_modules/d3-format/locale/ar-QA.json new file mode 100644 index 00000000..94aef298 --- /dev/null +++ b/node_modules/d3-format/locale/ar-QA.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u0631\u002e\u0642\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-SA.json b/node_modules/d3-format/locale/ar-SA.json new file mode 100644 index 00000000..4d64227e --- /dev/null +++ b/node_modules/d3-format/locale/ar-SA.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u0631\u002e\u0633\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-SD.json b/node_modules/d3-format/locale/ar-SD.json new file mode 100644 index 00000000..1ae41ae8 --- /dev/null +++ b/node_modules/d3-format/locale/ar-SD.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u062c\u002e\u0633\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-SO.json b/node_modules/d3-format/locale/ar-SO.json new file mode 100644 index 00000000..143b46f6 --- /dev/null +++ b/node_modules/d3-format/locale/ar-SO.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["\u200f\u0053 ", ""], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-SS.json b/node_modules/d3-format/locale/ar-SS.json new file mode 100644 index 00000000..03ca5b4a --- /dev/null +++ b/node_modules/d3-format/locale/ar-SS.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["\u00a3 ", ""], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-SY.json b/node_modules/d3-format/locale/ar-SY.json new file mode 100644 index 00000000..40263fbb --- /dev/null +++ b/node_modules/d3-format/locale/ar-SY.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u0644\u002e\u0633\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-TD.json b/node_modules/d3-format/locale/ar-TD.json new file mode 100644 index 00000000..7bc36467 --- /dev/null +++ b/node_modules/d3-format/locale/ar-TD.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["\u200f\u0046\u0043\u0046\u0041 ", ""], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ar-TN.json b/node_modules/d3-format/locale/ar-TN.json new file mode 100644 index 00000000..16829aa5 --- /dev/null +++ b/node_modules/d3-format/locale/ar-TN.json @@ -0,0 +1,6 @@ +{ + "decimal": "\u002c", + "thousands": "\u002e", + "grouping": [3], + "currency": ["\u062f\u002e\u062a\u002e ", ""] +} diff --git a/node_modules/d3-format/locale/ar-YE.json b/node_modules/d3-format/locale/ar-YE.json new file mode 100644 index 00000000..ed9f48e8 --- /dev/null +++ b/node_modules/d3-format/locale/ar-YE.json @@ -0,0 +1,7 @@ +{ + "decimal": "\u066b", + "thousands": "\u066c", + "grouping": [3], + "currency": ["", " \u0631\u002e\u0649\u002e"], + "numerals" : ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"] +} diff --git a/node_modules/d3-format/locale/ca-ES.json b/node_modules/d3-format/locale/ca-ES.json new file mode 100644 index 00000000..a2497624 --- /dev/null +++ b/node_modules/d3-format/locale/ca-ES.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": ".", + "grouping": [3], + "currency": ["", "\u00a0€"] +} diff --git a/node_modules/d3-format/locale/cs-CZ.json b/node_modules/d3-format/locale/cs-CZ.json new file mode 100644 index 00000000..7ff40eb9 --- /dev/null +++ b/node_modules/d3-format/locale/cs-CZ.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": "\u00a0", + "grouping": [3], + "currency": ["", "\u00a0KÄ"] +} diff --git a/node_modules/d3-format/locale/de-CH.json b/node_modules/d3-format/locale/de-CH.json new file mode 100644 index 00000000..874bb56a --- /dev/null +++ b/node_modules/d3-format/locale/de-CH.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": "'", + "grouping": [3], + "currency": ["", "\u00a0CHF"] +} diff --git a/node_modules/d3-format/locale/de-DE.json b/node_modules/d3-format/locale/de-DE.json new file mode 100644 index 00000000..a2497624 --- /dev/null +++ b/node_modules/d3-format/locale/de-DE.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": ".", + "grouping": [3], + "currency": ["", "\u00a0€"] +} diff --git a/node_modules/d3-format/locale/en-CA.json b/node_modules/d3-format/locale/en-CA.json new file mode 100644 index 00000000..f075b861 --- /dev/null +++ b/node_modules/d3-format/locale/en-CA.json @@ -0,0 +1,6 @@ +{ + "decimal": ".", + "thousands": ",", + "grouping": [3], + "currency": ["$", ""] +} diff --git a/node_modules/d3-format/locale/en-GB.json b/node_modules/d3-format/locale/en-GB.json new file mode 100644 index 00000000..3d22d7a6 --- /dev/null +++ b/node_modules/d3-format/locale/en-GB.json @@ -0,0 +1,6 @@ +{ + "decimal": ".", + "thousands": ",", + "grouping": [3], + "currency": ["£", ""] +} diff --git a/node_modules/d3-format/locale/en-IE.json b/node_modules/d3-format/locale/en-IE.json new file mode 100644 index 00000000..7d644154 --- /dev/null +++ b/node_modules/d3-format/locale/en-IE.json @@ -0,0 +1,6 @@ +{ + "decimal": ".", + "thousands": ",", + "grouping": [3], + "currency": ["€", ""] +} diff --git a/node_modules/d3-format/locale/en-IN.json b/node_modules/d3-format/locale/en-IN.json new file mode 100644 index 00000000..ada1510f --- /dev/null +++ b/node_modules/d3-format/locale/en-IN.json @@ -0,0 +1,6 @@ +{ + "decimal": ".", + "thousands": ",", + "grouping": [3, 2, 2, 2, 2, 2, 2, 2, 2, 2], + "currency": ["₹", ""] +} diff --git a/node_modules/d3-format/locale/en-US.json b/node_modules/d3-format/locale/en-US.json new file mode 100644 index 00000000..f075b861 --- /dev/null +++ b/node_modules/d3-format/locale/en-US.json @@ -0,0 +1,6 @@ +{ + "decimal": ".", + "thousands": ",", + "grouping": [3], + "currency": ["$", ""] +} diff --git a/node_modules/d3-format/locale/es-BO.json b/node_modules/d3-format/locale/es-BO.json new file mode 100644 index 00000000..98fe6467 --- /dev/null +++ b/node_modules/d3-format/locale/es-BO.json @@ -0,0 +1,7 @@ +{ + "decimal": ",", + "thousands": ".", + "grouping": [3], + "currency": ["Bs\u00a0", ""], + "percent": "\u202f%" +} diff --git a/node_modules/d3-format/locale/es-ES.json b/node_modules/d3-format/locale/es-ES.json new file mode 100644 index 00000000..a2497624 --- /dev/null +++ b/node_modules/d3-format/locale/es-ES.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": ".", + "grouping": [3], + "currency": ["", "\u00a0€"] +} diff --git a/node_modules/d3-format/locale/es-MX.json b/node_modules/d3-format/locale/es-MX.json new file mode 100644 index 00000000..f075b861 --- /dev/null +++ b/node_modules/d3-format/locale/es-MX.json @@ -0,0 +1,6 @@ +{ + "decimal": ".", + "thousands": ",", + "grouping": [3], + "currency": ["$", ""] +} diff --git a/node_modules/d3-format/locale/fi-FI.json b/node_modules/d3-format/locale/fi-FI.json new file mode 100644 index 00000000..e2218ec9 --- /dev/null +++ b/node_modules/d3-format/locale/fi-FI.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": "\u00a0", + "grouping": [3], + "currency": ["", "\u00a0€"] +} diff --git a/node_modules/d3-format/locale/fr-CA.json b/node_modules/d3-format/locale/fr-CA.json new file mode 100644 index 00000000..0d927b92 --- /dev/null +++ b/node_modules/d3-format/locale/fr-CA.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": "\u00a0", + "grouping": [3], + "currency": ["", "$"] +} diff --git a/node_modules/d3-format/locale/fr-FR.json b/node_modules/d3-format/locale/fr-FR.json new file mode 100644 index 00000000..e0cf89de --- /dev/null +++ b/node_modules/d3-format/locale/fr-FR.json @@ -0,0 +1,7 @@ +{ + "decimal": ",", + "thousands": "\u00a0", + "grouping": [3], + "currency": ["", "\u00a0€"], + "percent": "\u202f%" +} diff --git a/node_modules/d3-format/locale/he-IL.json b/node_modules/d3-format/locale/he-IL.json new file mode 100644 index 00000000..23926cb8 --- /dev/null +++ b/node_modules/d3-format/locale/he-IL.json @@ -0,0 +1,6 @@ +{ + "decimal": ".", + "thousands": ",", + "grouping": [3], + "currency": ["₪", ""] +} diff --git a/node_modules/d3-format/locale/hu-HU.json b/node_modules/d3-format/locale/hu-HU.json new file mode 100644 index 00000000..1baff743 --- /dev/null +++ b/node_modules/d3-format/locale/hu-HU.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": "\u00a0", + "grouping": [3], + "currency": ["", "\u00a0Ft"] +} diff --git a/node_modules/d3-format/locale/it-IT.json b/node_modules/d3-format/locale/it-IT.json new file mode 100644 index 00000000..564ed46e --- /dev/null +++ b/node_modules/d3-format/locale/it-IT.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": ".", + "grouping": [3], + "currency": ["€", ""] +} diff --git a/node_modules/d3-format/locale/ja-JP.json b/node_modules/d3-format/locale/ja-JP.json new file mode 100644 index 00000000..fdcba6c7 --- /dev/null +++ b/node_modules/d3-format/locale/ja-JP.json @@ -0,0 +1,6 @@ +{ + "decimal": ".", + "thousands": ",", + "grouping": [3], + "currency": ["", "円"] +} diff --git a/node_modules/d3-format/locale/ko-KR.json b/node_modules/d3-format/locale/ko-KR.json new file mode 100644 index 00000000..d1d882cd --- /dev/null +++ b/node_modules/d3-format/locale/ko-KR.json @@ -0,0 +1,6 @@ +{ + "decimal": ".", + "thousands": ",", + "grouping": [3], + "currency": ["â‚©", ""] +} diff --git a/node_modules/d3-format/locale/mk-MK.json b/node_modules/d3-format/locale/mk-MK.json new file mode 100644 index 00000000..33528b8e --- /dev/null +++ b/node_modules/d3-format/locale/mk-MK.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": ".", + "grouping": [3], + "currency": ["", "\u00a0ден."] +} diff --git a/node_modules/d3-format/locale/nl-NL.json b/node_modules/d3-format/locale/nl-NL.json new file mode 100644 index 00000000..7176b373 --- /dev/null +++ b/node_modules/d3-format/locale/nl-NL.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": ".", + "grouping": [3], + "currency": ["€\u00a0", ""] +} diff --git a/node_modules/d3-format/locale/pl-PL.json b/node_modules/d3-format/locale/pl-PL.json new file mode 100644 index 00000000..12c673fa --- /dev/null +++ b/node_modules/d3-format/locale/pl-PL.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": ".", + "grouping": [3], + "currency": ["", "zÅ‚"] +} diff --git a/node_modules/d3-format/locale/pt-BR.json b/node_modules/d3-format/locale/pt-BR.json new file mode 100644 index 00000000..e6705f1e --- /dev/null +++ b/node_modules/d3-format/locale/pt-BR.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": ".", + "grouping": [3], + "currency": ["R$", ""] +} diff --git a/node_modules/d3-format/locale/ru-RU.json b/node_modules/d3-format/locale/ru-RU.json new file mode 100644 index 00000000..3b0acf63 --- /dev/null +++ b/node_modules/d3-format/locale/ru-RU.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": "\u00a0", + "grouping": [3], + "currency": ["", "\u00a0руб."] +} diff --git a/node_modules/d3-format/locale/sv-SE.json b/node_modules/d3-format/locale/sv-SE.json new file mode 100644 index 00000000..870eba32 --- /dev/null +++ b/node_modules/d3-format/locale/sv-SE.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": "\u00a0", + "grouping": [3], + "currency": ["", " kr"] +} diff --git a/node_modules/d3-format/locale/uk-UA.json b/node_modules/d3-format/locale/uk-UA.json new file mode 100644 index 00000000..75cee2d9 --- /dev/null +++ b/node_modules/d3-format/locale/uk-UA.json @@ -0,0 +1,6 @@ +{ + "decimal": ",", + "thousands": "\u00a0", + "grouping": [3], + "currency": ["", "\u00a0â‚´."] +} diff --git a/node_modules/d3-format/locale/zh-CN.json b/node_modules/d3-format/locale/zh-CN.json new file mode 100644 index 00000000..1ffc7b68 --- /dev/null +++ b/node_modules/d3-format/locale/zh-CN.json @@ -0,0 +1,6 @@ +{ + "decimal": ".", + "thousands": ",", + "grouping": [3], + "currency": ["Â¥", ""] +} diff --git a/node_modules/d3-format/package.json b/node_modules/d3-format/package.json new file mode 100644 index 00000000..3b489c1d --- /dev/null +++ b/node_modules/d3-format/package.json @@ -0,0 +1,74 @@ +{ + "_from": "d3-format@2", + "_id": "d3-format@2.0.0", + "_inBundle": false, + "_integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==", + "_location": "/d3-format", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-format@2", + "name": "d3-format", + "escapedName": "d3-format", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3", + "/d3-scale" + ], + "_resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", + "_shasum": "a10bcc0f986c372b729ba447382413aabf5b0767", + "_spec": "d3-format@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-format/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Format numbers for human consumption.", + "devDependencies": { + "eslint": "7", + "rollup": "2", + "rollup-plugin-terser": "7", + "tape": "5" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js", + "locale/*.json" + ], + "homepage": "https://d3js.org/d3-format/", + "jsdelivr": "dist/d3-format.min.js", + "keywords": [ + "d3", + "d3-module", + "format", + "localization" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-format.js", + "module": "src/index.js", + "name": "d3-format", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-format.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src test" + }, + "sideEffects": [ + "./src/defaultLocale.js" + ], + "unpkg": "dist/d3-format.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-format/src/defaultLocale.js b/node_modules/d3-format/src/defaultLocale.js new file mode 100644 index 00000000..2fab0577 --- /dev/null +++ b/node_modules/d3-format/src/defaultLocale.js @@ -0,0 +1,18 @@ +import formatLocale from "./locale.js"; + +var locale; +export var format; +export var formatPrefix; + +defaultLocale({ + thousands: ",", + grouping: [3], + currency: ["$", ""] +}); + +export default function defaultLocale(definition) { + locale = formatLocale(definition); + format = locale.format; + formatPrefix = locale.formatPrefix; + return locale; +} diff --git a/node_modules/d3-format/src/exponent.js b/node_modules/d3-format/src/exponent.js new file mode 100644 index 00000000..79b67e3d --- /dev/null +++ b/node_modules/d3-format/src/exponent.js @@ -0,0 +1,5 @@ +import {formatDecimalParts} from "./formatDecimal.js"; + +export default function(x) { + return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN; +} diff --git a/node_modules/d3-format/src/formatDecimal.js b/node_modules/d3-format/src/formatDecimal.js new file mode 100644 index 00000000..4b341924 --- /dev/null +++ b/node_modules/d3-format/src/formatDecimal.js @@ -0,0 +1,20 @@ +export default function(x) { + return Math.abs(x = Math.round(x)) >= 1e21 + ? x.toLocaleString("en").replace(/,/g, "") + : x.toString(10); +} + +// Computes the decimal coefficient and exponent of the specified number x with +// significant digits p, where x is positive and p is in [1, 21] or undefined. +// For example, formatDecimalParts(1.23) returns ["123", 0]. +export function formatDecimalParts(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; +} diff --git a/node_modules/d3-format/src/formatGroup.js b/node_modules/d3-format/src/formatGroup.js new file mode 100644 index 00000000..ae603d3a --- /dev/null +++ b/node_modules/d3-format/src/formatGroup.js @@ -0,0 +1,18 @@ +export default function(grouping, thousands) { + return function(value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; +} diff --git a/node_modules/d3-format/src/formatNumerals.js b/node_modules/d3-format/src/formatNumerals.js new file mode 100644 index 00000000..046317e9 --- /dev/null +++ b/node_modules/d3-format/src/formatNumerals.js @@ -0,0 +1,7 @@ +export default function(numerals) { + return function(value) { + return value.replace(/[0-9]/g, function(i) { + return numerals[+i]; + }); + }; +} diff --git a/node_modules/d3-format/src/formatPrefixAuto.js b/node_modules/d3-format/src/formatPrefixAuto.js new file mode 100644 index 00000000..907742aa --- /dev/null +++ b/node_modules/d3-format/src/formatPrefixAuto.js @@ -0,0 +1,16 @@ +import {formatDecimalParts} from "./formatDecimal.js"; + +export var prefixExponent; + +export default function(x, p) { + var d = formatDecimalParts(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y! +} diff --git a/node_modules/d3-format/src/formatRounded.js b/node_modules/d3-format/src/formatRounded.js new file mode 100644 index 00000000..ea5e10da --- /dev/null +++ b/node_modules/d3-format/src/formatRounded.js @@ -0,0 +1,11 @@ +import {formatDecimalParts} from "./formatDecimal.js"; + +export default function(x, p) { + var d = formatDecimalParts(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); +} diff --git a/node_modules/d3-format/src/formatSpecifier.js b/node_modules/d3-format/src/formatSpecifier.js new file mode 100644 index 00000000..2dabb2f4 --- /dev/null +++ b/node_modules/d3-format/src/formatSpecifier.js @@ -0,0 +1,47 @@ +// [[fill]align][sign][symbol][0][width][,][.precision][~][type] +var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + +export default function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); +} + +formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + +export function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; + this.align = specifier.align === undefined ? ">" : specifier.align + ""; + this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? "" : specifier.type + ""; +} + +FormatSpecifier.prototype.toString = function() { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + + (this.trim ? "~" : "") + + this.type; +}; diff --git a/node_modules/d3-format/src/formatTrim.js b/node_modules/d3-format/src/formatTrim.js new file mode 100644 index 00000000..b0d647b3 --- /dev/null +++ b/node_modules/d3-format/src/formatTrim.js @@ -0,0 +1,11 @@ +// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. +export default function(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": i0 = i1 = i; break; + case "0": if (i0 === 0) i0 = i; i1 = i; break; + default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; +} diff --git a/node_modules/d3-format/src/formatTypes.js b/node_modules/d3-format/src/formatTypes.js new file mode 100644 index 00000000..007db36d --- /dev/null +++ b/node_modules/d3-format/src/formatTypes.js @@ -0,0 +1,19 @@ +import formatDecimal from "./formatDecimal.js"; +import formatPrefixAuto from "./formatPrefixAuto.js"; +import formatRounded from "./formatRounded.js"; + +export default { + "%": (x, p) => (x * 100).toFixed(p), + "b": (x) => Math.round(x).toString(2), + "c": (x) => x + "", + "d": formatDecimal, + "e": (x, p) => x.toExponential(p), + "f": (x, p) => x.toFixed(p), + "g": (x, p) => x.toPrecision(p), + "o": (x) => Math.round(x).toString(8), + "p": (x, p) => formatRounded(x * 100, p), + "r": formatRounded, + "s": formatPrefixAuto, + "X": (x) => Math.round(x).toString(16).toUpperCase(), + "x": (x) => Math.round(x).toString(16) +}; diff --git a/node_modules/d3-format/src/identity.js b/node_modules/d3-format/src/identity.js new file mode 100644 index 00000000..b2f94b2e --- /dev/null +++ b/node_modules/d3-format/src/identity.js @@ -0,0 +1,3 @@ +export default function(x) { + return x; +} diff --git a/node_modules/d3-format/src/index.js b/node_modules/d3-format/src/index.js new file mode 100644 index 00000000..22ae6b24 --- /dev/null +++ b/node_modules/d3-format/src/index.js @@ -0,0 +1,6 @@ +export {default as formatDefaultLocale, format, formatPrefix} from "./defaultLocale.js"; +export {default as formatLocale} from "./locale.js"; +export {default as formatSpecifier, FormatSpecifier} from "./formatSpecifier.js"; +export {default as precisionFixed} from "./precisionFixed.js"; +export {default as precisionPrefix} from "./precisionPrefix.js"; +export {default as precisionRound} from "./precisionRound.js"; diff --git a/node_modules/d3-format/src/locale.js b/node_modules/d3-format/src/locale.js new file mode 100644 index 00000000..404f9414 --- /dev/null +++ b/node_modules/d3-format/src/locale.js @@ -0,0 +1,148 @@ +import exponent from "./exponent.js"; +import formatGroup from "./formatGroup.js"; +import formatNumerals from "./formatNumerals.js"; +import formatSpecifier from "./formatSpecifier.js"; +import formatTrim from "./formatTrim.js"; +import formatTypes from "./formatTypes.js"; +import {prefixExponent} from "./formatPrefixAuto.js"; +import identity from "./identity.js"; + +var map = Array.prototype.map, + prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"]; + +export default function(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""), + currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", + currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", + decimal = locale.decimal === undefined ? "." : locale.decimal + "", + numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)), + percent = locale.percent === undefined ? "%" : locale.percent + "", + minus = locale.minus === undefined ? "−" : locale.minus + "", + nan = locale.nan === undefined ? "NaN" : locale.nan + ""; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + trim = specifier.trim, + type = specifier.type; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision === undefined ? 6 + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Determine the sign. -0 is not less than 0, but 1 / -0 is! + var valueNegative = value < 0 || 1 / value < 0; + + // Perform the initial formatting. + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + + // Trim insignificant zeros. + if (trim) value = formatTrim(value); + + // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign. + if (valueNegative && +value === 0 && sign !== "+") valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value†part that can be + // grouped, and fractional or exponential “suffix†part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": value = valuePrefix + value + valueSuffix + padding; break; + case "=": value = valuePrefix + padding + value + valueSuffix; break; + case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; + default: value = padding + valuePrefix + value + valueSuffix; break; + } + + return numerals(value); + } + + format.toString = function() { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function(value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; +} diff --git a/node_modules/d3-format/src/precisionFixed.js b/node_modules/d3-format/src/precisionFixed.js new file mode 100644 index 00000000..237f53f8 --- /dev/null +++ b/node_modules/d3-format/src/precisionFixed.js @@ -0,0 +1,5 @@ +import exponent from "./exponent.js"; + +export default function(step) { + return Math.max(0, -exponent(Math.abs(step))); +} diff --git a/node_modules/d3-format/src/precisionPrefix.js b/node_modules/d3-format/src/precisionPrefix.js new file mode 100644 index 00000000..fd6af844 --- /dev/null +++ b/node_modules/d3-format/src/precisionPrefix.js @@ -0,0 +1,5 @@ +import exponent from "./exponent.js"; + +export default function(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); +} diff --git a/node_modules/d3-format/src/precisionRound.js b/node_modules/d3-format/src/precisionRound.js new file mode 100644 index 00000000..5c704370 --- /dev/null +++ b/node_modules/d3-format/src/precisionRound.js @@ -0,0 +1,6 @@ +import exponent from "./exponent.js"; + +export default function(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent(max) - exponent(step)) + 1; +} diff --git a/node_modules/d3-geo/LICENSE b/node_modules/d3-geo/LICENSE new file mode 100644 index 00000000..f9488eb5 --- /dev/null +++ b/node_modules/d3-geo/LICENSE @@ -0,0 +1,48 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +This license applies to GeographicLib, versions 1.12 and later. + +Copyright (c) 2008-2012, Charles Karney + +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/node_modules/d3-geo/README.md b/node_modules/d3-geo/README.md new file mode 100644 index 00000000..f5dfa946 --- /dev/null +++ b/node_modules/d3-geo/README.md @@ -0,0 +1,683 @@ +# d3-geo + +Map projections are sometimes implemented as point transformations. For instance, spherical Mercator: + +```js +function mercator(x, y) { + return [x, Math.log(Math.tan(Math.PI / 4 + y / 2))]; +} +``` + +This is a reasonable *mathematical* approach if your geometry consists of continuous, infinite point sets. Yet computers do not have infinite memory, so we must instead work with discrete geometry such as polygons and polylines! + +Discrete geometry makes the challenge of projecting from the sphere to the plane much harder. The edges of a spherical polygon are [geodesics](https://en.wikipedia.org/wiki/Geodesic) (segments of great circles), not straight lines. Projected to the plane, geodesics are curves in all map projections except [gnomonic](#geoGnomonic), and thus accurate projection requires interpolation along each arc. D3 uses [adaptive sampling](https://bl.ocks.org/mbostock/3795544) inspired by a popular [line simplification method](https://bost.ocks.org/mike/simplify/) to balance accuracy and performance. + +The projection of polygons and polylines must also deal with the topological differences between the sphere and the plane. Some projections require cutting geometry that [crosses the antimeridian](https://bl.ocks.org/mbostock/3788999), while others require [clipping geometry to a great circle](https://bl.ocks.org/mbostock/3021474). + +Spherical polygons also require a [winding order convention](https://bl.ocks.org/mbostock/a7bdfeb041e850799a8d3dce4d8c50c8) to determine which side of the polygon is the inside: the exterior ring for polygons smaller than a hemisphere must be clockwise, while the exterior ring for polygons [larger than a hemisphere](https://bl.ocks.org/mbostock/6713736) must be anticlockwise. Interior rings representing holes must use the opposite winding order of their exterior ring. This winding order convention is also used by [TopoJSON](https://github.com/topojson) and [ESRI shapefiles](https://github.com/mbostock/shapefile); however, it is the **opposite** convention of GeoJSON’s [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.6). (Also note that standard GeoJSON WGS84 uses planar equirectangular coordinates, not spherical coordinates, and thus may require [stitching](https://github.com/d3/d3-geo-projection/blob/master/README.md#geostitch) to remove antimeridian cuts.) + +D3’s approach affords great expressiveness: you can choose the right projection, and the right aspect, for your data. D3 supports a wide variety of common and [unusual map projections](https://github.com/d3/d3-geo-projection). For more, see Part 2 of [The Toolmaker’s Guide](https://vimeo.com/106198518#t=20m0s). + +D3 uses [GeoJSON](http://geojson.org/geojson-spec.html) to represent geographic features in JavaScript. (See also [TopoJSON](https://github.com/mbostock/topojson), an extension of GeoJSON that is significantly more compact and encodes topology.) To convert shapefiles to GeoJSON, use [shp2json](https://github.com/mbostock/shapefile/blob/master/README.md#shp2json), part of the [shapefile package](https://github.com/mbostock/shapefile). See [Command-Line Cartography](https://medium.com/@mbostock/command-line-cartography-part-1-897aa8f8ca2c) for an introduction to d3-geo and related tools. + +## Installing + +If you use NPM, `npm install d3-geo`. Otherwise, download the [latest release](https://github.com/d3/d3-geo/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-geo.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + +``` + +[Try d3-geo in your browser.](https://observablehq.com/collection/@d3/d3-geo) + +## API Reference + +* [Paths](#paths) +* [Projections](#projections) ([Azimuthal](#azimuthal-projections), [Composite](#composite-projections), [Conic](#conic-projections), [Cylindrical](#cylindrical-projections)) +* [Raw Projections](#raw-projections) +* [Spherical Math](#spherical-math) +* [Spherical Shapes](#spherical-shapes) +* [Streams](#streams) +* [Transforms](#transforms) +* [Clipping](#clipping) + +### Paths + +The geographic path generator, [d3.geoPath](#geoPath), is similar to the shape generators in [d3-shape](https://github.com/d3/d3-shape): given a GeoJSON geometry or feature object, it generates an SVG path data string or [renders the path to a Canvas](https://bl.ocks.org/mbostock/3783604). Canvas is recommended for dynamic or interactive projections to improve performance. Paths can be used with [projections](#projections) or [transforms](#transforms), or they can be used to render planar geometry directly to Canvas or SVG. + +# d3.geoPath([projection[, context]]) [<>](https://github.com/d3/d3-geo/blob/master/src/path/index.js "Source") + +Creates a new geographic path generator with the default settings. If *projection* is specified, sets the [current projection](#path_projection). If *context* is specified, sets the [current context](#path_context). + +# path(object[, arguments…]) [<>](https://github.com/d3/d3-geo/blob/master/src/path/index.js "Source") + +Renders the given *object*, which may be any GeoJSON feature or geometry object: + +* Point - a single position. +* MultiPoint - an array of positions. +* LineString - an array of positions forming a continuous line. +* MultiLineString - an array of arrays of positions forming several lines. +* Polygon - an array of arrays of positions forming a polygon (possibly with holes). +* MultiPolygon - a multidimensional array of positions forming multiple polygons. +* GeometryCollection - an array of geometry objects. +* Feature - a feature containing one of the above geometry objects. +* FeatureCollection - an array of feature objects. + +The type *Sphere* is also supported, which is useful for rendering the outline of the globe; a sphere has no coordinates. Any additional *arguments* are passed along to the [pointRadius](#path_pointRadius) accessor. + +To display multiple features, combine them into a feature collection: + +```js +svg.append("path") + .datum({type: "FeatureCollection", features: features}) + .attr("d", d3.geoPath()); +``` + +Or use multiple path elements: + +```js +svg.selectAll("path") + .data(features) + .enter().append("path") + .attr("d", d3.geoPath()); +``` + +Separate path elements are typically slower than a single path element. However, distinct path elements are useful for styling and interaction (e.g., click or mouseover). Canvas rendering (see [*path*.context](#path_context)) is typically faster than SVG, but requires more effort to implement styling and interaction. + +# path.area(object) [<>](https://github.com/d3/d3-geo/blob/master/src/path/area.js "Source") + +Returns the projected planar area (typically in square pixels) for the specified GeoJSON *object*. Point, MultiPoint, LineString and MultiLineString geometries have zero area. For Polygon and MultiPolygon geometries, this method first computes the area of the exterior ring, and then subtracts the area of any interior holes. This method observes any clipping performed by the [projection](#path_projection); see [*projection*.clipAngle](#projection_clipAngle) and [*projection*.clipExtent](#projection_clipExtent). This is the planar equivalent of [d3.geoArea](#geoArea). + +# path.bounds(object) [<>](https://github.com/d3/d3-geo/blob/master/src/path/bounds.js "Source") + +Returns the projected planar bounding box (typically in pixels) for the specified GeoJSON *object*. The bounding box is represented by a two-dimensional array: \[\[*xâ‚€*, *yâ‚€*\], \[*xâ‚*, *yâ‚*\]\], where *xâ‚€* is the minimum *x*-coordinate, *yâ‚€* is the minimum *y*-coordinate, *xâ‚* is maximum *x*-coordinate, and *yâ‚* is the maximum *y*-coordinate. This is handy for, say, zooming in to a particular feature. (Note that in projected planar coordinates, the minimum latitude is typically the maximum *y*-value, and the maximum latitude is typically the minimum *y*-value.) This method observes any clipping performed by the [projection](#path_projection); see [*projection*.clipAngle](#projection_clipAngle) and [*projection*.clipExtent](#projection_clipExtent). This is the planar equivalent of [d3.geoBounds](#geoBounds). + +# path.centroid(object) [<>](https://github.com/d3/d3-geo/blob/master/src/path/centroid.js "Source") + +Returns the projected planar centroid (typically in pixels) for the specified GeoJSON *object*. This is handy for, say, labeling state or county boundaries, or displaying a symbol map. For example, a [noncontiguous cartogram](https://bl.ocks.org/mbostock/4055908) might scale each state around its centroid. This method observes any clipping performed by the [projection](#path_projection); see [*projection*.clipAngle](#projection_clipAngle) and [*projection*.clipExtent](#projection_clipExtent). This is the planar equivalent of [d3.geoCentroid](#geoCentroid). + +# path.measure(object) [<>](https://github.com/d3/d3-geo/blob/master/src/path/measure.js "Source") + +Returns the projected planar length (typically in pixels) for the specified GeoJSON *object*. Point and MultiPoint geometries have zero length. For Polygon and MultiPolygon geometries, this method computes the summed length of all rings. This method observes any clipping performed by the [projection](#path_projection); see [*projection*.clipAngle](#projection_clipAngle) and [*projection*.clipExtent](#projection_clipExtent). This is the planar equivalent of [d3.geoLength](#geoLength). + +# path.projection([projection]) [<>](https://github.com/d3/d3-geo/blob/master/src/path/index.js "Source") + +If a *projection* is specified, sets the current projection to the specified projection. If *projection* is not specified, returns the current projection, which defaults to null. The null projection represents the identity transformation: the input geometry is not projected and is instead rendered directly in raw coordinates. This can be useful for fast rendering of [pre-projected geometry](https://bl.ocks.org/mbostock/5557726), or for fast rendering of the equirectangular projection. + +The given *projection* is typically one of D3’s built-in [geographic projections](#projections); however, any object that exposes a [*projection*.stream](#projection_stream) function can be used, enabling the use of [custom projections](https://bl.ocks.org/mbostock/5663666). See D3’s [transforms](#transforms) for more examples of arbitrary geometric transformations. + +# path.context([context]) [<>](https://github.com/d3/d3-geo/blob/master/src/path/index.js "Source") + +If *context* is specified, sets the current render context and returns the path generator. If the *context* is null, then the [path generator](#_path) will return an SVG path string; if the context is non-null, the path generator will instead call methods on the specified context to render geometry. The context must implement the following subset of the [CanvasRenderingContext2D API](https://www.w3.org/TR/2dcontext/#canvasrenderingcontext2d): + +* *context*.beginPath() +* *context*.moveTo(*x*, *y*) +* *context*.lineTo(*x*, *y*) +* *context*.arc(*x*, *y*, *radius*, *startAngle*, *endAngle*) +* *context*.closePath() + +If a *context* is not specified, returns the current render context which defaults to null. + +# path.pointRadius([radius]) [<>](https://github.com/d3/d3-geo/blob/master/src/path/index.js "Source") + +If *radius* is specified, sets the radius used to display Point and MultiPoint geometries to the specified number. If *radius* is not specified, returns the current radius accessor, which defaults to 4.5. While the radius is commonly specified as a number constant, it may also be specified as a function which is computed per feature, being passed the any arguments passed to the [path generator](#_path). For example, if your GeoJSON data has additional properties, you might access those properties inside the radius function to vary the point size; alternatively, you could [d3.symbol](https://github.com/d3/d3-shape#symbols) and a [projection](#geoProjection) for greater flexibility. + +### Projections + +Projections transform spherical polygonal geometry to planar polygonal geometry. D3 provides implementations of several classes of standard projections: + +* [Azimuthal](#azimuthal-projections) +* [Composite](#composite-projections) +* [Conic](#conic-projections) +* [Cylindrical](#cylindrical-projections) + +For many more projections, see [d3-geo-projection](https://github.com/d3/d3-geo-projection). You can implement [custom projections](#raw-projections) using [d3.geoProjection](#geoProjection) or [d3.geoProjectionMutator](#geoProjectionMutator). + +# projection(point) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +Returns a new array \[*x*, *y*\] (typically in pixels) representing the projected point of the given *point*. The point must be specified as a two-element array \[*longitude*, *latitude*\] in degrees. May return null if the specified *point* has no defined projected position, such as when the point is outside the clipping bounds of the projection. + +# projection.invert(point) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +Returns a new array \[*longitude*, *latitude*\] in degrees representing the unprojected point of the given projected *point*. The point must be specified as a two-element array \[*x*, *y*\] (typically in pixels). May return null if the specified *point* has no defined projected position, such as when the point is outside the clipping bounds of the projection. + +This method is only defined on invertible projections. + +# projection.stream(stream) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +Returns a [projection stream](#streams) for the specified output *stream*. Any input geometry is projected before being streamed to the output stream. A typical projection involves several geometry transformations: the input geometry is first converted to radians, rotated on three axes, clipped to the small circle or cut along the antimeridian, and lastly projected to the plane with adaptive resampling, scale and translation. + +# projection.preclip([preclip]) + +If *preclip* is specified, sets the projection’s spherical clipping to the specified function and returns the projection. If *preclip* is not specified, returns the current spherical clipping function (see [preclip](#preclip)). + +# projection.postclip([postclip]) + +If *postclip* is specified, sets the projection’s cartesian clipping to the specified function and returns the projection. If *postclip* is not specified, returns the current cartesian clipping function (see [postclip](#postclip)). + +# projection.clipAngle([angle]) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +If *angle* is specified, sets the projection’s clipping circle radius to the specified angle in degrees and returns the projection. If *angle* is null, switches to [antimeridian cutting](https://bl.ocks.org/mbostock/3788999) rather than small-circle clipping. If *angle* is not specified, returns the current clip angle which defaults to null. Small-circle clipping is independent of viewport clipping via [*projection*.clipExtent](#projection_clipExtent). + +See also [*projection*.preclip](#projection_preclip), [d3.geoClipAntimeridian](#geoClipAntimeridian), [d3.geoClipCircle](#geoClipCircle). + +# projection.clipExtent([extent]) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +If *extent* is specified, sets the projection’s viewport clip extent to the specified bounds in pixels and returns the projection. The *extent* bounds are specified as an array \[\[xâ‚€, yâ‚€\], \[xâ‚, yâ‚\]\], where xâ‚€ is the left-side of the viewport, yâ‚€ is the top, xâ‚ is the right and yâ‚ is the bottom. If *extent* is null, no viewport clipping is performed. If *extent* is not specified, returns the current viewport clip extent which defaults to null. Viewport clipping is independent of small-circle clipping via [*projection*.clipAngle](#projection_clipAngle). + +See also [*projection*.postclip](#projection_postclip), [d3.geoClipRectangle](#geoClipRectangle). + +# projection.scale([scale]) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +If *scale* is specified, sets the projection’s scale factor to the specified value and returns the projection. If *scale* is not specified, returns the current scale factor; the default scale is projection-specific. The scale factor corresponds linearly to the distance between projected points; however, absolute scale factors are not equivalent across projections. + +# projection.translate([translate]) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +If *translate* is specified, sets the projection’s translation offset to the specified two-element array [tx, ty] and returns the projection. If *translate* is not specified, returns the current translation offset which defaults to [480, 250]. The translation offset determines the pixel coordinates of the projection’s [center](#projection_center). The default translation offset places ⟨0°,0°⟩ at the center of a 960×500 area. + +# projection.center([center]) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +If *center* is specified, sets the projection’s center to the specified *center*, a two-element array of [*longitude*, *latitude*] in degrees and returns the projection. If *center* is not specified, returns the current center, which defaults to ⟨0°,0°⟩. + +# projection.angle([angle]) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +If *angle* is specified, sets the projection’s post-projection planar rotation angle to the specified *angle* in degrees and returns the projection. If *angle* is not specified, returns the projection’s current angle, which defaults to 0°. Note that it may be faster to rotate during rendering (e.g., using [*context*.rotate](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/rotate)) rather than during projection. + +# projection.reflectX([reflect]) + +If *reflect* is specified, sets whether or not the *x*-dimension is reflected (negated) in the output. If *reflect* is not specified, returns true if *x*-reflection is enabled, which defaults to false. This can be useful to display sky and astronomical data with the orb seen from below: right ascension (eastern direction) will point to the left when North is pointing up. + +# projection.reflectY([reflect]) + +If *reflect* is specified, sets whether or not the *y*-dimension is reflected (negated) in the output. If *reflect* is not specified, returns true if *y*-reflection is enabled, which defaults to false. This is especially useful for transforming from standard [spatial reference systems](https://en.wikipedia.org/wiki/Spatial_reference_system), which treat positive *y* as pointing up, to display coordinate systems such as Canvas and SVG, which treat positive *y* as pointing down. + +# projection.rotate([angles]) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +If *rotation* is specified, sets the projection’s [three-axis spherical rotation](https://bl.ocks.org/mbostock/4282586) to the specified *angles*, which must be a two- or three-element array of numbers [*lambda*, *phi*, *gamma*] specifying the rotation angles in degrees about [each spherical axis](https://bl.ocks.org/mbostock/4282586). (These correspond to [yaw, pitch and roll](https://en.wikipedia.org/wiki/Aircraft_principal_axes).) If the rotation angle *gamma* is omitted, it defaults to 0. See also [d3.geoRotation](#geoRotation). If *rotation* is not specified, returns the current rotation which defaults [0, 0, 0]. + +# projection.precision([precision]) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +If *precision* is specified, sets the threshold for the projection’s [adaptive resampling](https://bl.ocks.org/mbostock/3795544) to the specified value in pixels and returns the projection. This value corresponds to the [Douglas–Peucker](https://en.wikipedia.org/wiki/Ramer–Douglas–Peucker_algorithm) distance. If *precision* is not specified, returns the projection’s current resampling precision which defaults to √0.5 ≅ 0.70710… + +# projection.fitExtent(extent, object) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +Sets the projection’s [scale](#projection_scale) and [translate](#projection_translate) to fit the specified GeoJSON *object* in the center of the given *extent*. The extent is specified as an array \[\[xâ‚€, yâ‚€\], \[xâ‚, yâ‚\]\], where xâ‚€ is the left side of the bounding box, yâ‚€ is the top, xâ‚ is the right and yâ‚ is the bottom. Returns the projection. + +For example, to scale and translate the [New Jersey State Plane projection](https://bl.ocks.org/mbostock/5126418) to fit a GeoJSON object *nj* in the center of a 960×500 bounding box with 20 pixels of padding on each side: + +```js +var projection = d3.geoTransverseMercator() + .rotate([74 + 30 / 60, -38 - 50 / 60]) + .fitExtent([[20, 20], [940, 480]], nj); +``` + +Any [clip extent](#projection_clipExtent) is ignored when determining the new scale and translate. The [precision](#projection_precision) used to compute the bounding box of the given *object* is computed at an effective scale of 150. + +# projection.fitSize(size, object) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +A convenience method for [*projection*.fitExtent](#projection_fitExtent) where the top-left corner of the extent is [0, 0]. The following two statements are equivalent: + +```js +projection.fitExtent([[0, 0], [width, height]], object); +projection.fitSize([width, height], object); +``` + +# projection.fitWidth(width, object) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +A convenience method for [*projection*.fitSize](#projection_fitSize) where the height is automatically chosen from the aspect ratio of *object* and the given constraint on *width*. + +# projection.fitHeight(height, object) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +A convenience method for [*projection*.fitSize](#projection_fitSize) where the width is automatically chosen from the aspect ratio of *object* and the given constraint on *height*. + +#### Azimuthal Projections + +Azimuthal projections project the sphere directly onto a plane. + +# d3.geoAzimuthalEqualArea() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/azimuthalEqualArea.js "Source") +
# d3.geoAzimuthalEqualAreaRaw + +[](https://observablehq.com/@d3/azimuthal-equal-area) + +The azimuthal equal-area projection. + +# d3.geoAzimuthalEquidistant() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/azimuthalEquidistant.js "Source") +
# d3.geoAzimuthalEquidistantRaw + +[](https://observablehq.com/@d3/azimuthal-equidistant) + +The azimuthal equidistant projection. + +# d3.geoGnomonic() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/gnomonic.js "Source") +
# d3.geoGnomonicRaw + +[](https://observablehq.com/@d3/gnomonic) + +The gnomonic projection. + +# d3.geoOrthographic() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/orthographic.js "Source") +
# d3.geoOrthographicRaw + +[](https://observablehq.com/@d3/orthographic) + +The orthographic projection. + +# d3.geoStereographic() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/stereographic.js "Source") +
# d3.geoStereographicRaw + +[](https://observablehq.com/@d3/stereographic) + +The stereographic projection. + +#### Equal-Earth + +# d3.geoEqualEarth() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/equalEarth.js "Source") +
# d3.geoEqualEarthRaw + +[](https://observablehq.com/@d3/equal-earth) + +The Equal Earth projection, by Bojan Å avriÄ _et al._, 2018. + +#### Composite Projections + +Composite consist of several projections that are composed into a single display. The constituent projections have fixed clip, center and rotation, and thus composite projections do not support [*projection*.center](#projection_center), [*projection*.rotate](#projection_rotate), [*projection*.clipAngle](#projection_clipAngle), or [*projection*.clipExtent](#projection_clipExtent). + +# d3.geoAlbersUsa() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/albersUsa.js "Source") + +[](https://observablehq.com/@d3/u-s-map) + +This is a U.S.-centric composite projection of three [d3.geoConicEqualArea](#geoConicEqualArea) projections: [d3.geoAlbers](#geoAlbers) is used for the lower forty-eight states, and separate conic equal-area projections are used for Alaska and Hawaii. Note that the scale for Alaska is diminished: it is projected at 0.35× its true relative area. This diagram by Philippe Rivière illustrates how this projection uses two rectangular insets for Alaska and Hawaii: + +[](https://bl.ocks.org/Fil/7723167596af40d9159be34ffbf8d36b) + +See [Albers USA with Territories](https://www.npmjs.com/package/geo-albers-usa-territories) for an extension to all US territories, and [d3-composite-projections](http://geoexamples.com/d3-composite-projections/) for more examples. + +#### Conic Projections + +Conic projections project the sphere onto a cone, and then unroll the cone onto the plane. Conic projections have [two standard parallels](#conic_parallels). + +# conic.parallels([parallels]) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/conic.js "Source") + +The [two standard parallels](https://en.wikipedia.org/wiki/Map_projection#Conic) that define the map layout in conic projections. + +# d3.geoAlbers() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/albers.js "Source") + +[](https://observablehq.com/@d3/u-s-map) + +The Albers’ equal area-conic projection. This is a U.S.-centric configuration of [d3.geoConicEqualArea](#geoConicEqualArea). + +# d3.geoConicConformal() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/conicConformal.js "Source") +
# d3.geoConicConformalRaw(phi0, phi1) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/conicConformal.js "Source") + +[](https://observablehq.com/@d3/conic-conformal) + +The conic conformal projection. The parallels default to [30°, 30°] resulting in flat top. See also [*conic*.parallels](#conic_parallels). + +# d3.geoConicEqualArea() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/conicEqualArea.js "Source") +
# d3.geoConicEqualAreaRaw(phi0, phi1) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/conicEqualArea.js "Source") + +[](https://observablehq.com/@d3/conic-equal-area) + +The Albers’ equal-area conic projection. See also [*conic*.parallels](#conic_parallels). + +# d3.geoConicEquidistant() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/conicEquidistant.js "Source") +
# d3.geoConicEquidistantRaw(phi0, phi1) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/conicEquidistant.js "Source") + +[](https://observablehq.com/@d3/conic-equidistant) + +The conic equidistant projection. See also [*conic*.parallels](#conic_parallels). + +#### Cylindrical Projections + +Cylindrical projections project the sphere onto a containing cylinder, and then unroll the cylinder onto the plane. [Pseudocylindrical projections](https://web.archive.org/web/20150928042327/http://www.progonos.com/furuti/MapProj/Normal/ProjPCyl/projPCyl.html) are a generalization of cylindrical projections. + +# d3.geoEquirectangular() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/equirectangular.js "Source") +
# d3.geoEquirectangularRaw + +[](https://observablehq.com/@d3/equirectangular) + +The equirectangular (plate carrée) projection. + +# d3.geoMercator() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/mercator.js "Source") +
# d3.geoMercatorRaw + +[](https://observablehq.com/@d3/mercator) + +The spherical Mercator projection. Defines a default [*projection*.clipExtent](#projection_clipExtent) such that the world is projected to a square, clipped to approximately ±85° latitude. + +# d3.geoTransverseMercator() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/transverseMercator.js "Source") +
# d3.geoTransverseMercatorRaw + +[](https://observablehq.com/@d3/transverse-mercator) + +The transverse spherical Mercator projection. Defines a default [*projection*.clipExtent](#projection_clipExtent) such that the world is projected to a square, clipped to approximately ±85° latitude. + +# d3.geoNaturalEarth1() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/naturalEarth1.js "Source") +
# d3.geoNaturalEarth1Raw + +[](https://observablehq.com/@d3/natural-earth) + +The [Natural Earth projection](http://www.shadedrelief.com/NE_proj/) is a pseudocylindrical projection designed by Tom Patterson. It is neither conformal nor equal-area, but appealing to the eye for small-scale maps of the whole world. + +### Raw Projections + +Raw projections are point transformation functions that are used to implement custom projections; they typically passed to [d3.geoProjection](#geoProjection) or [d3.geoProjectionMutator](#geoProjectionMutator). They are exposed here to facilitate the derivation of related projections. Raw projections take spherical coordinates \[*lambda*, *phi*\] in radians (not degrees!) and return a point \[*x*, *y*\], typically in the unit square centered around the origin. + +# project(lambda, phi) + +Projects the specified point [lambda, phi] in radians, returning a new point \[*x*, *y*\] in unitless coordinates. + +# project.invert(x, y) + +The inverse of [*project*](#_project). + +# d3.geoProjection(project) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +Constructs a new projection from the specified [raw projection](#_project), *project*. The *project* function takes the *longitude* and *latitude* of a given point in [radians](http://mathworld.wolfram.com/Radian.html), often referred to as *lambda* (λ) and *phi* (φ), and returns a two-element array \[*x*, *y*\] representing its unit projection. The *project* function does not need to scale or translate the point, as these are applied automatically by [*projection*.scale](#projection_scale), [*projection*.translate](#projection_translate), and [*projection*.center](#projection_center). Likewise, the *project* function does not need to perform any spherical rotation, as [*projection*.rotate](#projection_rotate) is applied prior to projection. + +For example, a spherical Mercator projection can be implemented as: + +```js +var mercator = d3.geoProjection(function(x, y) { + return [x, Math.log(Math.tan(Math.PI / 4 + y / 2))]; +}); +``` + +If the *project* function exposes an *invert* method, the returned projection will also expose [*projection*.invert](#projection_invert). + +# d3.geoProjectionMutator(factory) [<>](https://github.com/d3/d3-geo/blob/master/src/projection/index.js "Source") + +Constructs a new projection from the specified [raw projection](#_project) *factory* and returns a *mutate* function to call whenever the raw projection changes. The *factory* must return a raw projection. The returned *mutate* function returns the wrapped projection. For example, a conic projection typically has two configurable parallels. A suitable *factory* function, such as [d3.geoConicEqualAreaRaw](#geoConicEqualAreaRaw), would have the form: + +```js +// y0 and y1 represent two parallels +function conicFactory(phi0, phi1) { + return function conicRaw(lambda, phi) { + return […, …]; + }; +} +``` + +Using d3.geoProjectionMutator, you can implement a standard projection that allows the parallels to be changed, reassigning the raw projection used internally by [d3.geoProjection](#geoProjection): + +```js +function conicCustom() { + var phi0 = 29.5, + phi1 = 45.5, + mutate = d3.geoProjectionMutator(conicFactory), + projection = mutate(phi0, phi1); + + projection.parallels = function(_) { + return arguments.length ? mutate(phi0 = +_[0], phi1 = +_[1]) : [phi0, phi1]; + }; + + return projection; +} +``` + +When creating a mutable projection, the *mutate* function is typically not exposed. + +### Spherical Math + +# d3.geoArea(object) [<>](https://github.com/d3/d3-geo/blob/master/src/area.js "Source") + +Returns the spherical area of the specified GeoJSON *object* in [steradians](http://mathworld.wolfram.com/Steradian.html). This is the spherical equivalent of [*path*.area](#path_area). + +# d3.geoBounds(object) [<>](https://github.com/d3/d3-geo/blob/master/src/bounds.js "Source") + +Returns the [spherical bounding box](https://www.jasondavies.com/maps/bounds/) for the specified GeoJSON *object*. The bounding box is represented by a two-dimensional array: \[\[*left*, *bottom*], \[*right*, *top*\]\], where *left* is the minimum longitude, *bottom* is the minimum latitude, *right* is maximum longitude, and *top* is the maximum latitude. All coordinates are given in degrees. (Note that in projected planar coordinates, the minimum latitude is typically the maximum *y*-value, and the maximum latitude is typically the minimum *y*-value.) This is the spherical equivalent of [*path*.bounds](#path_bounds). + +# d3.geoCentroid(object) [<>](https://github.com/d3/d3-geo/blob/master/src/centroid.js "Source") + +Returns the spherical centroid of the specified GeoJSON *object*. This is the spherical equivalent of [*path*.centroid](#path_centroid). + +# d3.geoDistance(a, b) [<>](https://github.com/d3/d3-geo/blob/master/src/distance.js "Source") + +Returns the great-arc distance in [radians](http://mathworld.wolfram.com/Radian.html) between the two points *a* and *b*. Each point must be specified as a two-element array \[*longitude*, *latitude*\] in degrees. This is the spherical equivalent of [*path*.measure](#path_measure) given a LineString of two points. + +# d3.geoLength(object) [<>](https://github.com/d3/d3-geo/blob/master/src/length.js "Source") + +Returns the great-arc length of the specified GeoJSON *object* in [radians](http://mathworld.wolfram.com/Radian.html). For polygons, returns the perimeter of the exterior ring plus that of any interior rings. This is the spherical equivalent of [*path*.measure](#path_measure). + +# d3.geoInterpolate(a, b) [<>](https://github.com/d3/d3-geo/blob/master/src/interpolate.js "Source") + +Returns an interpolator function given two points *a* and *b*. Each point must be specified as a two-element array \[*longitude*, *latitude*\] in degrees. The returned interpolator function takes a single argument *t*, where *t* is a number ranging from 0 to 1; a value of 0 returns the point *a*, while a value of 1 returns the point *b*. Intermediate values interpolate from *a* to *b* along the great arc that passes through both *a* and *b*. If *a* and *b* are antipodes, an arbitrary great arc is chosen. + +# d3.geoContains(object, point) [<>](https://github.com/d3/d3-geo/blob/master/src/contains.js "Source") + +Returns true if and only if the specified GeoJSON *object* contains the specified *point*, or false if the *object* does not contain the *point*. The point must be specified as a two-element array \[*longitude*, *latitude*\] in degrees. For Point and MultiPoint geometries, an exact test is used; for a Sphere, true is always returned; for other geometries, an epsilon threshold is applied. + +# d3.geoRotation(angles) [<>](https://github.com/d3/d3-geo/blob/master/src/rotation.js "Source") + +Returns a [rotation function](#_rotation) for the given *angles*, which must be a two- or three-element array of numbers [*lambda*, *phi*, *gamma*] specifying the rotation angles in degrees about [each spherical axis](https://bl.ocks.org/mbostock/4282586). (These correspond to [yaw, pitch and roll](https://en.wikipedia.org/wiki/Aircraft_principal_axes).) If the rotation angle *gamma* is omitted, it defaults to 0. See also [*projection*.rotate](#projection_rotate). + +# rotation(point) [<>](https://github.com/d3/d3-geo/blob/master/src/rotation.js "Source") + +Returns a new array \[*longitude*, *latitude*\] in degrees representing the rotated point of the given *point*. The point must be specified as a two-element array \[*longitude*, *latitude*\] in degrees. + +# rotation.invert(point) [<>](https://github.com/d3/d3-geo/blob/master/src/rotation.js "Source") + +Returns a new array \[*longitude*, *latitude*\] in degrees representing the point of the given rotated *point*; the inverse of [*rotation*](#_rotation). The point must be specified as a two-element array \[*longitude*, *latitude*\] in degrees. + +### Spherical Shapes + +To generate a [great arc](https://en.wikipedia.org/wiki/Great-circle_distance) (a segment of a great circle), simply pass a GeoJSON LineString geometry object to a [d3.geoPath](#geoPath). D3’s projections use great-arc interpolation for intermediate points, so there’s no need for a great arc shape generator. + +# d3.geoCircle() [<>](https://github.com/d3/d3-geo/blob/master/src/circle.js "Source") + +Returns a new circle generator. + +# circle(arguments…) [<>](https://github.com/d3/d3-geo/blob/master/src/circle.js "Source") + +Returns a new GeoJSON geometry object of type “Polygon†approximating a circle on the surface of a sphere, with the current [center](#circle_center), [radius](#circle_radius) and [precision](#circle_precision). Any *arguments* are passed to the accessors. + +# circle.center([center]) [<>](https://github.com/d3/d3-geo/blob/master/src/circle.js "Source") + +If *center* is specified, sets the circle center to the specified point \[*longitude*, *latitude*\] in degrees, and returns this circle generator. The center may also be specified as a function; this function will be invoked whenever a circle is [generated](#_circle), being passed any arguments passed to the circle generator. If *center* is not specified, returns the current center accessor, which defaults to: + +```js +function center() { + return [0, 0]; +} +``` + +# circle.radius([radius]) [<>](https://github.com/d3/d3-geo/blob/master/src/circle.js "Source") + +If *radius* is specified, sets the circle radius to the specified angle in degrees, and returns this circle generator. The radius may also be specified as a function; this function will be invoked whenever a circle is [generated](#_circle), being passed any arguments passed to the circle generator. If *radius* is not specified, returns the current radius accessor, which defaults to: + +```js +function radius() { + return 90; +} +``` + +# circle.precision([angle]) [<>](https://github.com/d3/d3-geo/blob/master/src/circle.js "Source") + +If *precision* is specified, sets the circle precision to the specified angle in degrees, and returns this circle generator. The precision may also be specified as a function; this function will be invoked whenever a circle is [generated](#_circle), being passed any arguments passed to the circle generator. If *precision* is not specified, returns the current precision accessor, which defaults to: + +```js +function precision() { + return 6; +} +``` + +Small circles do not follow great arcs and thus the generated polygon is only an approximation. Specifying a smaller precision angle improves the accuracy of the approximate polygon, but also increase the cost to generate and render it. + +# d3.geoGraticule() [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +Constructs a geometry generator for creating graticules: a uniform grid of [meridians](https://en.wikipedia.org/wiki/Meridian_\(geography\)) and [parallels](https://en.wikipedia.org/wiki/Circle_of_latitude) for showing projection distortion. The default graticule has meridians and parallels every 10° between ±80° latitude; for the polar regions, there are meridians every 90°. + + + +# graticule() [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +Returns a GeoJSON MultiLineString geometry object representing all meridians and parallels for this graticule. + +# graticule.lines() [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +Returns an array of GeoJSON LineString geometry objects, one for each meridian or parallel for this graticule. + +# graticule.outline() [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +Returns a GeoJSON Polygon geometry object representing the outline of this graticule, i.e. along the meridians and parallels defining its extent. + +# graticule.extent([extent]) [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +If *extent* is specified, sets the major and minor extents of this graticule. If *extent* is not specified, returns the current minor extent, which defaults to ⟨⟨-180°, -80° - ε⟩, ⟨180°, 80° + ε⟩⟩. + +# graticule.extentMajor([extent]) [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +If *extent* is specified, sets the major extent of this graticule. If *extent* is not specified, returns the current major extent, which defaults to ⟨⟨-180°, -90° + ε⟩, ⟨180°, 90° - ε⟩⟩. + +# graticule.extentMinor([extent]) [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +If *extent* is specified, sets the minor extent of this graticule. If *extent* is not specified, returns the current minor extent, which defaults to ⟨⟨-180°, -80° - ε⟩, ⟨180°, 80° + ε⟩⟩. + +# graticule.step([step]) [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +If *step* is specified, sets the major and minor step for this graticule. If *step* is not specified, returns the current minor step, which defaults to ⟨10°, 10°⟩. + +# graticule.stepMajor([step]) [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +If *step* is specified, sets the major step for this graticule. If *step* is not specified, returns the current major step, which defaults to ⟨90°, 360°⟩. + +# graticule.stepMinor([step]) [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +If *step* is specified, sets the minor step for this graticule. If *step* is not specified, returns the current minor step, which defaults to ⟨10°, 10°⟩. + +# graticule.precision([angle]) [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +If *precision* is specified, sets the precision for this graticule, in degrees. If *precision* is not specified, returns the current precision, which defaults to 2.5°. + +# d3.geoGraticule10() [<>](https://github.com/d3/d3-geo/blob/master/src/graticule.js "Source") + +A convenience method for directly generating the default 10° global graticule as a GeoJSON MultiLineString geometry object. Equivalent to: + +```js +function geoGraticule10() { + return d3.geoGraticule()(); +} +``` + +### Streams + +D3 transforms geometry using a sequence of function calls, rather than materializing intermediate representations, to minimize overhead. Streams must implement several methods to receive input geometry. Streams are inherently stateful; the meaning of a [point](#point) depends on whether the point is inside of a [line](#lineStart), and likewise a line is distinguished from a ring by a [polygon](#polygonStart). Despite the name “streamâ€, these method calls are currently synchronous. + +# d3.geoStream(object, stream) [<>](https://github.com/d3/d3-geo/blob/master/src/stream.js "Source") + +Streams the specified [GeoJSON](http://geojson.org) *object* to the specified [projection *stream*](#projection-streams). While both features and geometry objects are supported as input, the stream interface only describes the geometry, and thus additional feature properties are not visible to streams. + +# stream.point(x, y[, z]) + +Indicates a point with the specified coordinates *x* and *y* (and optionally *z*). The coordinate system is unspecified and implementation-dependent; for example, [projection streams](https://github.com/d3/d3-geo-projection) require spherical coordinates in degrees as input. Outside the context of a polygon or line, a point indicates a point geometry object ([Point](http://www.geojson.org/geojson-spec.html#point) or [MultiPoint](http://www.geojson.org/geojson-spec.html#multipoint)). Within a line or polygon ring, the point indicates a control point. + +# stream.lineStart() + +Indicates the start of a line or ring. Within a polygon, indicates the start of a ring. The first ring of a polygon is the exterior ring, and is typically clockwise. Any subsequent rings indicate holes in the polygon, and are typically counterclockwise. + +# stream.lineEnd() + +Indicates the end of a line or ring. Within a polygon, indicates the end of a ring. Unlike GeoJSON, the redundant closing coordinate of a ring is *not* indicated via [point](#point), and instead is implied via lineEnd within a polygon. Thus, the given polygon input: + +```json +{ + "type": "Polygon", + "coordinates": [ + [[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]] + ] +} +``` + +Will produce the following series of method calls on the stream: + +```js +stream.polygonStart(); +stream.lineStart(); +stream.point(0, 0); +stream.point(0, 1); +stream.point(1, 1); +stream.point(1, 0); +stream.lineEnd(); +stream.polygonEnd(); +``` + +# stream.polygonStart() + +Indicates the start of a polygon. The first line of a polygon indicates the exterior ring, and any subsequent lines indicate interior holes. + +# stream.polygonEnd() + +Indicates the end of a polygon. + +# stream.sphere() + +Indicates the sphere (the globe; the unit sphere centered at ⟨0,0,0⟩). + +### Transforms + +Transforms are a generalization of projections. Transform implement [*projection*.stream](#projection_stream) and can be passed to [*path*.projection](#path_projection). However, they only implement a subset of the other projection methods, and represent arbitrary geometric transformations rather than projections from spherical to planar coordinates. + +# d3.geoTransform(methods) [<>](https://github.com/d3/d3-geo/blob/master/src/transform.js "Source") + +Defines an arbitrary transform using the methods defined on the specified *methods* object. Any undefined methods will use pass-through methods that propagate inputs to the output stream. For example, to reflect the *y*-dimension (see also [*identity*.reflectY](#identity_reflectY)): + +```js +var reflectY = d3.geoTransform({ + point: function(x, y) { + this.stream.point(x, -y); + } +}); +``` + +Or to define an affine matrix transformation: + +```js +function matrix(a, b, c, d, tx, ty) { + return d3.geoTransform({ + point: function(x, y) { + this.stream.point(a * x + b * y + tx, c * x + d * y + ty); + } + }); +} +``` + +# d3.geoIdentity() [<>](https://github.com/d3/d3-geo/blob/master/src/projection/identity.js "Source") + +The identity transform can be used to scale, translate and clip planar geometry. It implements [*projection*.scale](#projection_scale), [*projection*.translate](#projection_translate), [*projection*.fitExtent](#projection_fitExtent), [*projection*.fitSize](#projection_fitSize), [*projection*.fitWidth](#projection_fitWidth), [*projection*.fitHeight](#projection_fitHeight), [*projection*.clipExtent](#projection_clipExtent), [*projection*.angle](#projection_angle), [*projection*.reflectX](#projection_reflectX) and [*projection*.reflectY](#projection_reflectY). + +### Clipping + +Projections perform cutting or clipping of geometries in two stages. + +# preclip(stream) + +Pre-clipping occurs in geographic coordinates. Cutting along the antimeridian line, or clipping along a small circle are the most common strategies. + +See [*projection*.preclip](#projection_preclip). + +# postclip(stream) + +Post-clipping occurs on the plane, when a projection is bounded to a certain extent such as a rectangle. + +See [*projection*.postclip](#projection_postclip). + +Clipping functions are implemented as transformations of a [projection stream](#streams). Pre-clipping operates on spherical coordinates, in radians. Post-clipping operates on planar coordinates, in pixels. + +# d3.geoClipAntimeridian + +A clipping function which transforms a stream such that geometries (lines or polygons) that cross the antimeridian line are cut in two, one on each side. Typically used for pre-clipping. + +# d3.geoClipCircle(angle) + +Generates a clipping function which transforms a stream such that geometries are bounded by a small circle of radius *angle* around the projection’s [center](#projection_center). Typically used for pre-clipping. + +# d3.geoClipRectangle(x0, y0, x1, y1) + +Generates a clipping function which transforms a stream such that geometries are bounded by a rectangle of coordinates [[x0, y0], [x1, y1]]. Typically used for post-clipping. diff --git a/node_modules/d3-geo/dist/d3-geo.js b/node_modules/d3-geo/dist/d3-geo.js new file mode 100644 index 00000000..54c5643b --- /dev/null +++ b/node_modules/d3-geo/dist/d3-geo.js @@ -0,0 +1,3127 @@ +// https://d3js.org/d3-geo/ v2.0.1 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-array'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); +}(this, function (exports, d3Array) { 'use strict'; + +var epsilon = 1e-6; +var epsilon2 = 1e-12; +var pi = Math.PI; +var halfPi = pi / 2; +var quarterPi = pi / 4; +var tau = pi * 2; + +var degrees = 180 / pi; +var radians = pi / 180; + +var abs = Math.abs; +var atan = Math.atan; +var atan2 = Math.atan2; +var cos = Math.cos; +var ceil = Math.ceil; +var exp = Math.exp; +var hypot = Math.hypot; +var log = Math.log; +var pow = Math.pow; +var sin = Math.sin; +var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; +var sqrt = Math.sqrt; +var tan = Math.tan; + +function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); +} + +function asin(x) { + return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x); +} + +function haversin(x) { + return (x = sin(x / 2)) * x; +} + +function noop() {} + +function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } +} + +var streamObjectType = { + Feature: function(object, stream) { + streamGeometry(object.geometry, stream); + }, + FeatureCollection: function(object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) streamGeometry(features[i].geometry, stream); + } +}; + +var streamGeometryType = { + Sphere: function(object, stream) { + stream.sphere(); + }, + Point: function(object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); + }, + LineString: function(object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamLine(coordinates[i], stream, 0); + }, + Polygon: function(object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamPolygon(coordinates[i], stream); + }, + GeometryCollection: function(object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) streamGeometry(geometries[i], stream); + } +}; + +function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); +} + +function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); +} + +function geoStream(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } +} + +var areaRingSum = new d3Array.Adder(); + +// hello? + +var areaSum = new d3Array.Adder(), + lambda00, + phi00, + lambda0, + cosPhi0, + sinPhi0; + +var areaStream = { + point: noop, + lineStart: noop, + lineEnd: noop, + polygonStart: function() { + areaRingSum = new d3Array.Adder(); + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function() { + var areaRing = +areaRingSum; + areaSum.add(areaRing < 0 ? tau + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop; + }, + sphere: function() { + areaSum.add(tau); + } +}; + +function areaRingStart() { + areaStream.point = areaPointFirst; +} + +function areaRingEnd() { + areaPoint(lambda00, phi00); +} + +function areaPointFirst(lambda, phi) { + areaStream.point = areaPoint; + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi); +} + +function areaPoint(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos(phi), + sinPhi = sin(phi), + k = sinPhi0 * sinPhi, + u = cosPhi0 * cosPhi + k * cos(adLambda), + v = k * sdLambda * sin(adLambda); + areaRingSum.add(atan2(v, u)); + + // Advance the previous points. + lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; +} + +function area(object) { + areaSum = new d3Array.Adder(); + geoStream(object, areaStream); + return areaSum * 2; +} + +function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; +} + +function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi); + return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]; +} + +function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} + +function cartesianCross(a, b) { + return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; +} + +// TODO return a +function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; +} + +function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; +} + +// TODO return d +function cartesianNormalizeInPlace(d) { + var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; +} + +var lambda0$1, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00$1, phi00$1, // first point + p0, // previous 3D point + deltaSum, + ranges, + range; + +var boundsStream = { + point: boundsPoint, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function() { + boundsStream.point = boundsRingPoint; + boundsStream.lineStart = boundsRingStart; + boundsStream.lineEnd = boundsRingEnd; + deltaSum = new d3Array.Adder(); + areaStream.polygonStart(); + }, + polygonEnd: function() { + areaStream.polygonEnd(); + boundsStream.point = boundsPoint; + boundsStream.lineStart = boundsLineStart; + boundsStream.lineEnd = boundsLineEnd; + if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon) phi1 = 90; + else if (deltaSum < -epsilon) phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + }, + sphere: function() { + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + } +}; + +function boundsPoint(lambda, phi) { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; +} + +function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees * sign, + phii, + antimeridian = abs(delta) > 180; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) lambda0$1 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + } + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; +} + +function boundsLineStart() { + boundsStream.point = linePoint; +} + +function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream.point = boundsPoint; + p0 = null; +} + +function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; + } + areaStream.point(lambda, phi); + linePoint(lambda, phi); +} + +function boundsRingStart() { + areaStream.lineStart(); +} + +function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream.lineEnd(); + if (abs(deltaSum) > epsilon) lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[1] = lambda1; + p0 = null; +} + +// Finds the left-right distance between two longitudes. +// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want +// the distance between ±180° to be 360°. +function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; +} + +function rangeCompare(a, b) { + return a[0] - b[0]; +} + +function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; +} + +function bounds(feature) { + var i, n, a, b, merged, deltaMax, delta; + + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + geoStream(feature, boundsStream); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; + } + } + + ranges = range = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; +} + +var W0, W1, + X0, Y0, Z0, + X1, Y1, Z1, + X2, Y2, Z2, + lambda00$2, phi00$2, // first point + x0, y0, z0; // previous point + +var centroidStream = { + sphere: noop, + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function() { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function() { + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + } +}; + +// Arithmetic mean of Cartesian vectors. +function centroidPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)); +} + +function centroidPointCartesian(x, y, z) { + ++W0; + X0 += (x - X0) / W0; + Y0 += (y - Y0) / W0; + Z0 += (z - Z0) / W0; +} + +function centroidLineStart() { + centroidStream.point = centroidLinePointFirst; +} + +function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidStream.point = centroidLinePoint; + centroidPointCartesian(x0, y0, z0); +} + +function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} + +function centroidLineEnd() { + centroidStream.point = centroidPoint; +} + +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). +function centroidRingStart() { + centroidStream.point = centroidRingPointFirst; +} + +function centroidRingEnd() { + centroidRingPoint(lambda00$2, phi00$2); + centroidStream.point = centroidPoint; +} + +function centroidRingPointFirst(lambda, phi) { + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + centroidStream.point = centroidRingPoint; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidPointCartesian(x0, y0, z0); +} + +function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + cx = y0 * z - z0 * y, + cy = z0 * x - x0 * z, + cz = x0 * y - y0 * x, + m = hypot(cx, cy, cz), + w = asin(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2.add(v * cx); + Y2.add(v * cy); + Z2.add(v * cz); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} + +function centroid(object) { + W0 = W1 = + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = 0; + X2 = new d3Array.Adder(); + Y2 = new d3Array.Adder(); + Z2 = new d3Array.Adder(); + geoStream(object, centroidStream); + + var x = +X2, + y = +Y2, + z = +Z2, + m = hypot(x, y, z); + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2) { + x = X1, y = Y1, z = Z1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon) x = X0, y = Y0, z = Z0; + m = hypot(x, y, z); + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2) return [NaN, NaN]; + } + + return [atan2(y, x) * degrees, asin(z / m) * degrees]; +} + +function constant(x) { + return function() { + return x; + }; +} + +function compose(a, b) { + + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + + return compose; +} + +function rotationIdentity(lambda, phi) { + return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi]; +} + +rotationIdentity.invert = rotationIdentity; + +function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); +} + +function forwardRotationLambda(deltaLambda) { + return function(lambda, phi) { + return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi]; + }; +} + +function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; +} + +function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos(deltaPhi), + sinDeltaPhi = sin(deltaPhi), + cosDeltaGamma = cos(deltaGamma), + sinDeltaGamma = sin(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function(lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin(k * cosDeltaPhi - x * sinDeltaPhi) + ]; + }; + + return rotation; +} + +function rotation(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + } + + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + }; + + return forward; +} + +// Generates a circle centered at [0°, 0°], with a given radius and precision. +function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos(radius), + sinRadius = sin(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]); + stream.point(point[0], point[1]); + } +} + +// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. +function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau; +} + +function circle() { + var center = constant([0, 0]), + radius = constant(90), + precision = constant(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees, x[1] *= degrees; + } + + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } + + circle.center = function(_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), circle) : radius; + }; + + circle.precision = function(_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant(+_), circle) : precision; + }; + + return circle; +} + +function clipBuffer() { + var lines = [], + line; + return { + point: function(x, y, m) { + line.push([x, y, m]); + }, + lineStart: function() { + lines.push(line = []); + }, + lineEnd: noop, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function() { + var result = lines; + lines = []; + line = null; + return result; + } + }; +} + +function pointEqual(a, b) { + return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon; +} + +function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous +} + +// A generalized polygon clipping algorithm: given a polygon that has been cut +// into its visible line segments, and rejoins the segments by interpolating +// along the clip edge. +function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n], x; + + if (pointEqual(p0, p1)) { + if (!p0[2] && !p1[2]) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + // handle degenerate cases by moving the point + p1[0] += 2 * epsilon; + } + + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + + if (!subject.length) return; + + clip.sort(compareIntersection); + link(subject); + link(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; + } + + var start = subject[0], + points, + point; + + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); + } +} + +function link(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; +} + +function longitude(point) { + if (abs(point[0]) <= pi) + return point[0]; + else + return sign(point[0]) * ((abs(point[0]) + pi) % tau - pi); +} + +function polygonContains(polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin(phi), + normal = [sin(lambda), -cos(lambda), 0], + angle = 0, + winding = 0; + + var sum = new d3Array.Adder(); + + if (sinPhi === 1) phi = halfPi + epsilon; + else if (sinPhi === -1) phi = -halfPi - epsilon; + + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin(phi0), + cosPhi0 = cos(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin(phi1), + cosPhi1 = cos(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi, + k = sinPhi0 * sinPhi1; + + sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta))); + angle += antimeridian ? delta + sign * tau : delta; + + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } + + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. + + return (angle < -epsilon || angle < epsilon && sum < -epsilon2) ^ (winding & 1); +} + +function clip(pointVisible, clipLine, interpolate, start) { + return function(sink) { + var line = clipLine(sink), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = d3Array.merge(segments); + var startInside = polygonContains(polygon, start); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipRejoin(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function() { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; + + function point(lambda, phi) { + if (pointVisible(lambda, phi)) sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + line.point(lambda, phi); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } + + function ringStart() { + ringSink.lineStart(); + ring = []; + } + + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; + + ring.pop(); + polygon.push(ring); + ring = null; + + if (!n) return; + + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } + + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; +} + +function validSegment(segment) { + return segment.length > 1; +} + +// Intersections are sorted along the clip edge. For both antimeridian cutting +// and circle clipping, the same comparison is used. +function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]); +} + +var clipAntimeridian = clip( + function() { return true; }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi, -halfPi] +); + +// Takes a line and cuts into visible segments. Return values: 0 - there were +// intersections or the line was empty; 1 - no intersections; 2 - there were +// intersections, and the first and last segments should be rejoined. +function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections + + return { + lineStart: function() { + stream.lineStart(); + clean = 1; + }, + point: function(lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi : -pi, + delta = abs(lambda1 - lambda0); + if (abs(delta - pi) < epsilon) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian + if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies + if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function() { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function() { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; +} + +function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin(lambda0 - lambda1); + return abs(sinLambda0Lambda1) > epsilon + ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) + - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; +} + +function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi; + stream.point(-pi, phi); + stream.point(0, phi); + stream.point(pi, phi); + stream.point(pi, 0); + stream.point(pi, -phi); + stream.point(0, -phi); + stream.point(-pi, -phi); + stream.point(-pi, 0); + stream.point(-pi, phi); + } else if (abs(from[0] - to[0]) > epsilon) { + var lambda = from[0] < to[0] ? pi : -pi; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } +} + +function clipCircle(radius) { + var cr = cos(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case + + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + + function visible(lambda, phi) { + return cos(lambda) * cos(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) + point1[2] = 1; + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1], 2); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1], 3); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function() { + return clean | ((v00 && v0) << 1); + } + }; + } + + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); + + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; + + // Two polar points. + if (!determinant) return !two && a; + + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); + + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + + if (t2 < 0) return; + + var t = sqrt(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + + if (!two) return q; + + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + + var delta = lambda1 - lambda0, + polar = abs(delta - pi) < epsilon, + meridian = polar || delta < epsilon; + + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]); +} + +function clipLine(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; +} + +var clipMax = 1e9, clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + +function clipRectangle(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } + + function corner(p, direction) { + return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3 + : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1 + : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } + + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } + + return function(stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; + + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; + + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } + + function polygonInside() { + var winding = 0; + + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; } + else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; } + } + } + + return winding; + } + + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } + + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = d3Array.merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipRejoin(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); + } + activeStream = stream, segments = polygon = ring = null; + } + + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } + + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + + return clipStream; + }; +} + +function extent() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function(_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } + }; +} + +var lengthSum, + lambda0$2, + sinPhi0$1, + cosPhi0$1; + +var lengthStream = { + sphere: noop, + point: noop, + lineStart: lengthLineStart, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop +}; + +function lengthLineStart() { + lengthStream.point = lengthPointFirst; + lengthStream.lineEnd = lengthLineEnd; +} + +function lengthLineEnd() { + lengthStream.point = lengthStream.lineEnd = noop; +} + +function lengthPointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0$2 = lambda, sinPhi0$1 = sin(phi), cosPhi0$1 = cos(phi); + lengthStream.point = lengthPoint; +} + +function lengthPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin(phi), + cosPhi = cos(phi), + delta = abs(lambda - lambda0$2), + cosDelta = cos(delta), + sinDelta = sin(delta), + x = cosPhi * sinDelta, + y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, + z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt(x * x + y * y), z)); + lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; +} + +function length(object) { + lengthSum = new d3Array.Adder(); + geoStream(object, lengthStream); + return +lengthSum; +} + +var coordinates = [null, null], + object = {type: "LineString", coordinates: coordinates}; + +function distance(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length(object); +} + +var containsObjectType = { + Feature: function(object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function(object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; + return false; + } +}; + +var containsGeometryType = { + Sphere: function() { + return true; + }, + Point: function(object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPoint(coordinates[i], point)) return true; + return false; + }, + LineString: function(object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsLine(coordinates[i], point)) return true; + return false; + }, + Polygon: function(object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPolygon(coordinates[i], point)) return true; + return false; + }, + GeometryCollection: function(object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) if (containsGeometry(geometries[i], point)) return true; + return false; + } +}; + +function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; +} + +function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; +} + +function containsLine(coordinates, point) { + var ao, bo, ab; + for (var i = 0, n = coordinates.length; i < n; i++) { + bo = distance(coordinates[i], point); + if (bo === 0) return true; + if (i > 0) { + ab = distance(coordinates[i], coordinates[i - 1]); + if ( + ab > 0 && + ao <= ab && + bo <= ab && + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab + ) + return true; + } + ao = bo; + } + return false; +} + +function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); +} + +function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; +} + +function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; +} + +function contains(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); +} + +function graticuleX(y0, y1, dy) { + var y = d3Array.range(y0, y1 - epsilon, dy).concat(y1); + return function(x) { return y.map(function(y) { return [x, y]; }); }; +} + +function graticuleY(x0, x1, dx) { + var x = d3Array.range(x0, x1 - epsilon, dx).concat(x1); + return function(y) { return x.map(function(x) { return [x, y]; }); }; +} + +function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; + + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; + } + + function lines() { + return d3Array.range(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(d3Array.range(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(d3Array.range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon; }).map(x)) + .concat(d3Array.range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon; }).map(y)); + } + + graticule.lines = function() { + return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; }); + }; + + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; + + graticule.extent = function(_) { + if (!arguments.length) return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; + + graticule.extentMajor = function(_) { + if (!arguments.length) return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + + graticule.extentMinor = function(_) { + if (!arguments.length) return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + + graticule.step = function(_) { + if (!arguments.length) return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; + + graticule.stepMajor = function(_) { + if (!arguments.length) return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + + graticule.stepMinor = function(_) { + if (!arguments.length) return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; + + return graticule + .extentMajor([[-180, -90 + epsilon], [180, 90 - epsilon]]) + .extentMinor([[-180, -80 - epsilon], [180, 80 + epsilon]]); +} + +function graticule10() { + return graticule()(); +} + +function interpolate(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos(y0), + sy0 = sin(y0), + cy1 = cos(y1), + sy1 = sin(y1), + kx0 = cy0 * cos(x0), + ky0 = cy0 * sin(x0), + kx1 = cy1 * cos(x1), + ky1 = cy1 * sin(x1), + d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin(d); + + var interpolate = d ? function(t) { + var B = sin(t *= d) / k, + A = sin(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2(y, x) * degrees, + atan2(z, sqrt(x * x + y * y)) * degrees + ]; + } : function() { + return [x0 * degrees, y0 * degrees]; + }; + + interpolate.distance = d; + + return interpolate; +} + +var identity = x => x; + +var areaSum$1 = new d3Array.Adder(), + areaRingSum$1 = new d3Array.Adder(), + x00, + y00, + x0$1, + y0$1; + +var areaStream$1 = { + point: noop, + lineStart: noop, + lineEnd: noop, + polygonStart: function() { + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function() { + areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop; + areaSum$1.add(abs(areaRingSum$1)); + areaRingSum$1 = new d3Array.Adder(); + }, + result: function() { + var area = areaSum$1 / 2; + areaSum$1 = new d3Array.Adder(); + return area; + } +}; + +function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; +} + +function areaPointFirst$1(x, y) { + areaStream$1.point = areaPoint$1; + x00 = x0$1 = x, y00 = y0$1 = y; +} + +function areaPoint$1(x, y) { + areaRingSum$1.add(y0$1 * x - x0$1 * y); + x0$1 = x, y0$1 = y; +} + +function areaRingEnd$1() { + areaPoint$1(x00, y00); +} + +var x0$2 = Infinity, + y0$2 = x0$2, + x1 = -x0$2, + y1 = x1; + +var boundsStream$1 = { + point: boundsPoint$1, + lineStart: noop, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop, + result: function() { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } +}; + +function boundsPoint$1(x, y) { + if (x < x0$2) x0$2 = x; + if (x > x1) x1 = x; + if (y < y0$2) y0$2 = y; + if (y > y1) y1 = y; +} + +// TODO Enforce positive area for exterior, negative area for interior? + +var X0$1 = 0, + Y0$1 = 0, + Z0$1 = 0, + X1$1 = 0, + Y1$1 = 0, + Z1$1 = 0, + X2$1 = 0, + Y2$1 = 0, + Z2$1 = 0, + x00$1, + y00$1, + x0$3, + y0$3; + +var centroidStream$1 = { + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, + polygonStart: function() { + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; + }, + polygonEnd: function() { + centroidStream$1.point = centroidPoint$1; + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + }, + result: function() { + var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] + : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] + : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] + : [NaN, NaN]; + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = + X2$1 = Y2$1 = Z2$1 = 0; + return centroid; + } +}; + +function centroidPoint$1(x, y) { + X0$1 += x; + Y0$1 += y; + ++Z0$1; +} + +function centroidLineStart$1() { + centroidStream$1.point = centroidPointFirstLine; +} + +function centroidPointFirstLine(x, y) { + centroidStream$1.point = centroidPointLine; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function centroidPointLine(x, y) { + var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; +} + +function centroidRingStart$1() { + centroidStream$1.point = centroidPointFirstRing; +} + +function centroidRingEnd$1() { + centroidPointRing(x00$1, y00$1); +} + +function centroidPointFirstRing(x, y) { + centroidStream$1.point = centroidPointRing; + centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); +} + +function centroidPointRing(x, y) { + var dx = x - x0$3, + dy = y - y0$3, + z = sqrt(dx * dx + dy * dy); + + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + + z = y0$3 * x - x0$3 * y; + X2$1 += z * (x0$3 + x); + Y2$1 += z * (y0$3 + y); + Z2$1 += z * 3; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function PathContext(context) { + this._context = context; +} + +PathContext.prototype = { + _radius: 4.5, + pointRadius: function(_) { + return this._radius = _, this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: { + this._context.lineTo(x, y); + break; + } + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau); + break; + } + } + }, + result: noop +}; + +var lengthSum$1 = new d3Array.Adder(), + lengthRing, + x00$2, + y00$2, + x0$4, + y0$4; + +var lengthStream$1 = { + point: noop, + lineStart: function() { + lengthStream$1.point = lengthPointFirst$1; + }, + lineEnd: function() { + if (lengthRing) lengthPoint$1(x00$2, y00$2); + lengthStream$1.point = noop; + }, + polygonStart: function() { + lengthRing = true; + }, + polygonEnd: function() { + lengthRing = null; + }, + result: function() { + var length = +lengthSum$1; + lengthSum$1 = new d3Array.Adder(); + return length; + } +}; + +function lengthPointFirst$1(x, y) { + lengthStream$1.point = lengthPoint$1; + x00$2 = x0$4 = x, y00$2 = y0$4 = y; +} + +function lengthPoint$1(x, y) { + x0$4 -= x, y0$4 -= y; + lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); + x0$4 = x, y0$4 = y; +} + +function PathString() { + this._string = []; +} + +PathString.prototype = { + _radius: 4.5, + _circle: circle$1(4.5), + pointRadius: function(_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + if (this._circle == null) this._circle = circle$1(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function() { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } +}; + +function circle$1(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; +} + +function index(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; + + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + geoStream(object, projectionStream(contextStream)); + } + return contextStream.result(); + } + + path.area = function(object) { + geoStream(object, projectionStream(areaStream$1)); + return areaStream$1.result(); + }; + + path.measure = function(object) { + geoStream(object, projectionStream(lengthStream$1)); + return lengthStream$1.result(); + }; + + path.bounds = function(object) { + geoStream(object, projectionStream(boundsStream$1)); + return boundsStream$1.result(); + }; + + path.centroid = function(object) { + geoStream(object, projectionStream(centroidStream$1)); + return centroidStream$1.result(); + }; + + path.projection = function(_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection; + }; + + path.context = function(_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; + + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + + return path.projection(projection).context(context); +} + +function transform(methods) { + return { + stream: transformer(methods) + }; +} + +function transformer(methods) { + return function(stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; + }; +} + +function TransformStream() {} + +TransformStream.prototype = { + constructor: TransformStream, + point: function(x, y) { this.stream.point(x, y); }, + sphere: function() { this.stream.sphere(); }, + lineStart: function() { this.stream.lineStart(); }, + lineEnd: function() { this.stream.lineEnd(); }, + polygonStart: function() { this.stream.polygonStart(); }, + polygonEnd: function() { this.stream.polygonEnd(); } +}; + +function fit(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) projection.clipExtent(null); + geoStream(object, projection.stream(boundsStream$1)); + fitBounds(boundsStream$1.result()); + if (clip != null) projection.clipExtent(clip); + return projection; +} + +function fitExtent(projection, extent, object) { + return fit(projection, function(b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); +} + +function fitWidth(projection, width, object) { + return fit(projection, function(b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +function fitHeight(projection, height, object) { + return fit(projection, function(b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +var maxDepth = 16, // maximum depth of subdivision + cosMinDistance = cos(30 * radians); // cos(minimum angular distance) + +function resample(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); +} + +function resampleNone(project) { + return transformer({ + point: function(x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); + } + }); +} + +function resample$1(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt(a * a + b * b + c * c), + phi2 = asin(c /= m), + lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); + } + } + } + return function(stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point + + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; }, + polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } + + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } + + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } + + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } + + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } + + return resampleStream; + }; +} + +var transformRadians = transformer({ + point: function(x, y) { + this.stream.point(x * radians, y * radians); + } +}); + +function transformRotate(rotate) { + return transformer({ + point: function(x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); + } + }); +} + +function scaleTranslate(k, dx, dy, sx, sy) { + function transform(x, y) { + x *= sx; y *= sy; + return [dx + k * x, dy - k * y]; + } + transform.invert = function(x, y) { + return [(x - dx) / k * sx, (dy - y) / k * sy]; + }; + return transform; +} + +function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { + if (!alpha) return scaleTranslate(k, dx, dy, sx, sy); + var cosAlpha = cos(alpha), + sinAlpha = sin(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; + function transform(x, y) { + x *= sx; y *= sy; + return [a * x - b * y + dx, dy - b * x - a * y]; + } + transform.invert = function(x, y) { + return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; + }; + return transform; +} + +function projection(project) { + return projectionMutator(function() { return project; })(); +} + +function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate + alpha = 0, // post-rotate angle + sx = 1, // reflectX + sy = 1, // reflectX + theta = null, preclip = clipAntimeridian, // pre-clip angle + x0 = null, y0, x1, y1, postclip = identity, // post-clip extent + delta2 = 0.5, // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; + + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); + } + + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees, point[1] * degrees]; + } + + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; + + projection.preclip = function(_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; + + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + + projection.clipAngle = function(_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; + }; + + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + projection.scale = function(_) { + return arguments.length ? (k = +_, recenter()) : k; + }; + + projection.translate = function(_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; + + projection.center = function(_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; + }; + + projection.rotate = function(_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; + }; + + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; + }; + + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; + }; + + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; + }; + + projection.precision = function(_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + }; + + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), + transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + return reset(); + } + + function reset() { + cache = cacheStream = null; + return projection; + } + + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); + }; +} + +function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function(_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees]; + }; + + return p; +} + +function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin(phi) / cosPhi0]; + } + + forward.invert = function(x, y) { + return [x / cosPhi0, asin(y * cosPhi0)]; + }; + + return forward; +} + +function conicEqualAreaRaw(y0, y1) { + var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; + + function project(x, y) { + var r = sqrt(c - 2 * n * sin(y)) / n; + return [r * sin(x *= n), r0 - r * cos(x)]; + } + + project.invert = function(x, y) { + var r0y = r0 - y, + l = atan2(x, abs(r0y)) * sign(r0y); + if (r0y * n < 0) + l -= pi * sign(x) * sign(r0y); + return [l / n, asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; +} + +function conicEqualArea() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); +} + +function albers() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); +} + +// The projections must have mutually exclusive clip regions on the sphere, +// as this will avoid emitting interleaving lines and polygons. +function multiplex(streams) { + var n = streams.length; + return { + point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); }, + sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); }, + lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); }, + lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); }, + polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); }, + polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); } + }; +} + +// A composite projection for the United States, configured by default for +// 960×500. The projection also works quite well at 960×600 if you change the +// scale to 1285 and adjust the translate accordingly. The set of standard +// parallels for each region comes from USGS, which is published here: +// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers +function albersUsa() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = {point: function(x, y) { point = [x, y]; }}; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); + } + + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); + }; + + albersUsa.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; + + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; + + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon, y + 0.120 * k + epsilon], [x - 0.214 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon, y + 0.166 * k + epsilon], [x - 0.115 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function(extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function(size, object) { + return fitSize(albersUsa, size, object); + }; + + albersUsa.fitWidth = function(width, object) { + return fitWidth(albersUsa, width, object); + }; + + albersUsa.fitHeight = function(height, object) { + return fitHeight(albersUsa, height, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); +} + +function azimuthalRaw(scale) { + return function(x, y) { + var cx = cos(x), + cy = cos(y), + k = scale(cx * cy); + if (k === Infinity) return [2, 0]; + return [ + k * cy * sin(x), + k * sin(y) + ]; + } +} + +function azimuthalInvert(angle) { + return function(x, y) { + var z = sqrt(x * x + y * y), + c = angle(z), + sc = sin(c), + cc = cos(c); + return [ + atan2(x * sc, z * cc), + asin(z && y * sc / z) + ]; + } +} + +var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { + return sqrt(2 / (1 + cxcy)); +}); + +azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) { + return 2 * asin(z / 2); +}); + +function azimuthalEqualArea() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); +} + +var azimuthalEquidistantRaw = azimuthalRaw(function(c) { + return (c = acos(c)) && c / sin(c); +}); + +azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) { + return z; +}); + +function azimuthalEquidistant() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); +} + +function mercatorRaw(lambda, phi) { + return [lambda, log(tan((halfPi + phi) / 2))]; +} + +mercatorRaw.invert = function(x, y) { + return [x, 2 * atan(exp(y)) - halfPi]; +}; + +function mercator() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau); +} + +function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent + + m.scale = function(_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; + + m.translate = function(_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function(_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function(_) { + return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + function reclip() { + var k = pi * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } + + return reclip(); +} + +function tany(y) { + return tan((halfPi + y) / 2); +} + +function conicConformalRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)), + f = cy0 * pow(tany(y0), n) / n; + + if (!n) return mercatorRaw; + + function project(x, y) { + if (f > 0) { if (y < -halfPi + epsilon) y = -halfPi + epsilon; } + else { if (y > halfPi - epsilon) y = halfPi - epsilon; } + var r = f / pow(tany(y), n); + return [r * sin(n * x), f - r * cos(n * x)]; + } + + project.invert = function(x, y) { + var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy), + l = atan2(x, abs(fy)) * sign(fy); + if (fy * n < 0) + l -= pi * sign(x) * sign(fy); + return [l / n, 2 * atan(pow(f / r, 1 / n)) - halfPi]; + }; + + return project; +} + +function conicConformal() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); +} + +function equirectangularRaw(lambda, phi) { + return [lambda, phi]; +} + +equirectangularRaw.invert = equirectangularRaw; + +function equirectangular() { + return projection(equirectangularRaw) + .scale(152.63); +} + +function conicEquidistantRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs(n) < epsilon) return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin(nx), g - gy * cos(nx)]; + } + + project.invert = function(x, y) { + var gy = g - y, + l = atan2(x, abs(gy)) * sign(gy); + if (gy * n < 0) + l -= pi * sign(x) * sign(gy); + return [l / n, g - sign(n) * sqrt(x * x + gy * gy)]; + }; + + return project; +} + +function conicEquidistant() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); +} + +var A1 = 1.340264, + A2 = -0.081106, + A3 = 0.000893, + A4 = 0.003796, + M = sqrt(3) / 2, + iterations = 12; + +function equalEarthRaw(lambda, phi) { + var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2; + return [ + lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), + l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) + ]; +} + +equalEarthRaw.invert = function(x, y) { + var l = y, l2 = l * l, l6 = l2 * l2 * l2; + for (var i = 0, delta, fy, fpy; i < iterations; ++i) { + fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; + fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); + l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; + if (abs(delta) < epsilon2) break; + } + return [ + M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l), + asin(sin(l) / M) + ]; +}; + +function equalEarth() { + return projection(equalEarthRaw) + .scale(177.158); +} + +function gnomonicRaw(x, y) { + var cy = cos(y), k = cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; +} + +gnomonicRaw.invert = azimuthalInvert(atan); + +function gnomonic() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); +} + +function identity$1() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, // scale, translate and reflect + alpha = 0, ca, sa, // angle + x0 = null, y0, x1, y1, // clip extent + kx = 1, ky = 1, + transform = transformer({ + point: function(x, y) { + var p = projection([x, y]); + this.stream.point(p[0], p[1]); + } + }), + postclip = identity, + cache, + cacheStream; + + function reset() { + kx = k * sx; + ky = k * sy; + cache = cacheStream = null; + return projection; + } + + function projection (p) { + var x = p[0] * kx, y = p[1] * ky; + if (alpha) { + var t = y * ca - x * sa; + x = x * ca + y * sa; + y = t; + } + return [x + tx, y + ty]; + } + projection.invert = function(p) { + var x = p[0] - tx, y = p[1] - ty; + if (alpha) { + var t = y * ca + x * sa; + x = x * ca - y * sa; + y = t; + } + return [x / kx, y / ky]; + }; + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }; + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + projection.scale = function(_) { + return arguments.length ? (k = +_, reset()) : k; + }; + projection.translate = function(_) { + return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; + }; + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees; + }; + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; + }; + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; + }; + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + return projection; +} + +function naturalEarth1Raw(lambda, phi) { + var phi2 = phi * phi, phi4 = phi2 * phi2; + return [ + lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), + phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) + ]; +} + +naturalEarth1Raw.invert = function(x, y) { + var phi = y, i = 25, delta; + do { + var phi2 = phi * phi, phi4 = phi2 * phi2; + phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + } while (abs(delta) > epsilon && --i > 0); + return [ + x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), + phi + ]; +}; + +function naturalEarth1() { + return projection(naturalEarth1Raw) + .scale(175.295); +} + +function orthographicRaw(x, y) { + return [cos(y) * sin(x), sin(y)]; +} + +orthographicRaw.invert = azimuthalInvert(asin); + +function orthographic() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon); +} + +function stereographicRaw(x, y) { + var cy = cos(y), k = 1 + cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; +} + +stereographicRaw.invert = azimuthalInvert(function(z) { + return 2 * atan(z); +}); + +function stereographic() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); +} + +function transverseMercatorRaw(lambda, phi) { + return [log(tan((halfPi + phi) / 2)), -lambda]; +} + +transverseMercatorRaw.invert = function(x, y) { + return [-y, 2 * atan(exp(x)) - halfPi]; +}; + +function transverseMercator() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; + + m.center = function(_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function(_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); +} + +exports.geoAlbers = albers; +exports.geoAlbersUsa = albersUsa; +exports.geoArea = area; +exports.geoAzimuthalEqualArea = azimuthalEqualArea; +exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; +exports.geoAzimuthalEquidistant = azimuthalEquidistant; +exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; +exports.geoBounds = bounds; +exports.geoCentroid = centroid; +exports.geoCircle = circle; +exports.geoClipAntimeridian = clipAntimeridian; +exports.geoClipCircle = clipCircle; +exports.geoClipExtent = extent; +exports.geoClipRectangle = clipRectangle; +exports.geoConicConformal = conicConformal; +exports.geoConicConformalRaw = conicConformalRaw; +exports.geoConicEqualArea = conicEqualArea; +exports.geoConicEqualAreaRaw = conicEqualAreaRaw; +exports.geoConicEquidistant = conicEquidistant; +exports.geoConicEquidistantRaw = conicEquidistantRaw; +exports.geoContains = contains; +exports.geoDistance = distance; +exports.geoEqualEarth = equalEarth; +exports.geoEqualEarthRaw = equalEarthRaw; +exports.geoEquirectangular = equirectangular; +exports.geoEquirectangularRaw = equirectangularRaw; +exports.geoGnomonic = gnomonic; +exports.geoGnomonicRaw = gnomonicRaw; +exports.geoGraticule = graticule; +exports.geoGraticule10 = graticule10; +exports.geoIdentity = identity$1; +exports.geoInterpolate = interpolate; +exports.geoLength = length; +exports.geoMercator = mercator; +exports.geoMercatorRaw = mercatorRaw; +exports.geoNaturalEarth1 = naturalEarth1; +exports.geoNaturalEarth1Raw = naturalEarth1Raw; +exports.geoOrthographic = orthographic; +exports.geoOrthographicRaw = orthographicRaw; +exports.geoPath = index; +exports.geoProjection = projection; +exports.geoProjectionMutator = projectionMutator; +exports.geoRotation = rotation; +exports.geoStereographic = stereographic; +exports.geoStereographicRaw = stereographicRaw; +exports.geoStream = geoStream; +exports.geoTransform = transform; +exports.geoTransverseMercator = transverseMercator; +exports.geoTransverseMercatorRaw = transverseMercatorRaw; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-geo/dist/d3-geo.min.js b/node_modules/d3-geo/dist/d3-geo.min.js new file mode 100644 index 00000000..ddb21690 --- /dev/null +++ b/node_modules/d3-geo/dist/d3-geo.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-geo/ v2.0.1 Copyright 2020 Mike Bostock +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-array")):"function"==typeof define&&define.amd?define(["exports","d3-array"],t):t((n=n||self).d3=n.d3||{},n.d3)}(this,function(n,t){"use strict";var r=1e-6,e=1e-12,i=Math.PI,o=i/2,u=i/4,a=2*i,c=180/i,l=i/180,f=Math.abs,p=Math.atan,s=Math.atan2,h=Math.cos,g=Math.ceil,v=Math.exp,d=Math.hypot,E=Math.log,y=Math.pow,S=Math.sin,m=Math.sign||function(n){return n>0?1:n<0?-1:0},M=Math.sqrt,x=Math.tan;function w(n){return n>1?0:n<-1?i:Math.acos(n)}function _(n){return n>1?o:n<-1?-o:Math.asin(n)}function N(n){return(n=S(n/2))*n}function A(){}function R(n,t){n&&P.hasOwnProperty(n.type)&&P[n.type](n,t)}var C={Feature:function(n,t){R(n.geometry,t)},FeatureCollection:function(n,t){for(var r=n.features,e=-1,i=r.length;++e=0?1:-1,i=e*r,o=h(t=(t*=l)/2+u),a=S(t),c=T*a,f=G*o+c*h(i),p=c*e*S(i);J.add(s(p,f)),O=n,G=o,T=a}function rn(n){return[s(n[1],n[0]),_(n[2])]}function en(n){var t=n[0],r=n[1],e=h(r);return[e*h(t),e*S(t),S(r)]}function on(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function un(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function an(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function cn(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function ln(n){var t=M(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}var fn,pn,sn,hn,gn,vn,dn,En,yn,Sn,mn,Mn,xn,wn,_n,Nn,An={point:Rn,lineStart:Pn,lineEnd:jn,polygonStart:function(){An.point=qn,An.lineStart=zn,An.lineEnd=bn,D=new t.Adder,Q.polygonStart()},polygonEnd:function(){Q.polygonEnd(),An.point=Rn,An.lineStart=Pn,An.lineEnd=jn,J<0?(k=-(H=180),F=-(I=90)):D>r?I=90:D<-r&&(F=-90),Z[0]=k,Z[1]=H},sphere:function(){k=-(H=180),F=-(I=90)}};function Rn(n,t){U.push(Z=[k=n,H=n]),tI&&(I=t)}function Cn(n,t){var r=en([n*l,t*l]);if(B){var e=un(B,r),i=un([e[1],-e[0],0],e);ln(i),i=rn(i);var o,u=n-W,a=u>0?1:-1,p=i[0]*c*a,s=f(u)>180;s^(a*WI&&(I=o):s^(a*W<(p=(p+360)%360-180)&&pI&&(I=t)),s?nLn(k,H)&&(H=n):Ln(n,H)>Ln(k,H)&&(k=n):H>=k?(nH&&(H=n)):n>W?Ln(k,n)>Ln(k,H)&&(H=n):Ln(n,H)>Ln(k,H)&&(k=n)}else U.push(Z=[k=n,H=n]);tI&&(I=t),B=r,W=n}function Pn(){An.point=Cn}function jn(){Z[0]=k,Z[1]=H,An.point=Rn,B=null}function qn(n,t){if(B){var r=n-W;D.add(f(r)>180?r+(r>0?360:-360):r)}else X=n,Y=t;Q.point(n,t),Cn(n,t)}function zn(){Q.lineStart()}function bn(){qn(X,Y),Q.lineEnd(),f(D)>r&&(k=-(H=180)),Z[0]=k,Z[1]=H,B=null}function Ln(n,t){return(t-=n)<0?t+360:t}function On(n,t){return n[0]-t[0]}function Gn(n,t){return n[0]<=n[1]?n[0]<=t&&t<=n[1]:ti?n+Math.round(-n/a)*a:n,t]}function Qn(n,t,r){return(n%=a)?t||r?Jn($n(n),nt(t,r)):$n(n):t||r?nt(t,r):Kn}function Vn(n){return function(t,r){return[(t+=n)>i?t-a:t<-i?t+a:t,r]}}function $n(n){var t=Vn(n);return t.invert=Vn(-n),t}function nt(n,t){var r=h(n),e=S(n),i=h(t),o=S(t);function u(n,t){var u=h(t),a=h(n)*u,c=S(n)*u,l=S(t),f=l*r+a*e;return[s(c*i-f*o,a*r-l*e),_(f*i+c*o)]}return u.invert=function(n,t){var u=h(t),a=h(n)*u,c=S(n)*u,l=S(t),f=l*i-c*o;return[s(c*i+l*o,a*r+f*e),_(f*r-a*e)]},u}function tt(n){function t(t){return(t=n(t[0]*l,t[1]*l))[0]*=c,t[1]*=c,t}return n=Qn(n[0]*l,n[1]*l,n.length>2?n[2]*l:0),t.invert=function(t){return(t=n.invert(t[0]*l,t[1]*l))[0]*=c,t[1]*=c,t},t}function rt(n,t,r,e,i,o){if(r){var u=h(t),c=S(t),l=e*r;null==i?(i=t+e*a,o=t-l/2):(i=et(u,i),o=et(u,o),(e>0?io)&&(i+=e*a));for(var f,p=i;e>0?p>o:p1&&t.push(t.pop().concat(t.shift()))},result:function(){var r=t;return t=[],n=null,r}}}function ot(n,t){return f(n[0]-t[0])=0;--u)o.point((p=f[u])[0],p[1]);else i(h.x,h.p.x,-1,o);h=h.p}f=(h=h.o).z,g=!g}while(!h.v);o.lineEnd()}}}function ct(n){if(t=n.length){for(var t,r,e=0,i=n[0];++e=0?1:-1,T=G*O,k=T>i,F=R*b;if(E.add(s(F*G*S(T),C*L+F*h(T))),v+=k?O+G*a:O,k^N>=l^q>=l){var H=un(en(w),en(j));ln(H);var I=un(g,H);ln(I);var W=(k^O>=0?-1:1)*_(I[2]);(f>W||f===W&&(H[0]||H[1]))&&(d+=k^O>=0?1:-1)}}return(v<-r||v0){for(s||(o.polygonStart(),s=!0),o.lineStart(),n=0;n1&&2&i&&l.push(l.pop().concat(l.shift())),a.push(l.filter(st))}return h}}function st(n){return n.length>1}function ht(n,t){return((n=n.x)[0]<0?n[1]-o-r:o-n[1])-((t=t.x)[0]<0?t[1]-o-r:o-t[1])}Kn.invert=Kn;var gt=pt(function(){return!0},function(n){var t,e=NaN,u=NaN,a=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(c,l){var s=c>0?i:-i,g=f(c-e);f(g-i)0?o:-o),n.point(a,u),n.lineEnd(),n.lineStart(),n.point(s,u),n.point(c,u),t=0):a!==s&&g>=i&&(f(e-a)r?p((S(t)*(u=h(i))*S(e)-S(i)*(o=h(t))*S(n))/(o*u*a)):(t+i)/2}(e,u,c,l),n.point(a,u),n.lineEnd(),n.lineStart(),n.point(s,u),t=0),n.point(e=c,u=l),a=s},lineEnd:function(){n.lineEnd(),e=u=NaN},clean:function(){return 2-t}}},function(n,t,e,u){var a;if(null==n)a=e*o,u.point(-i,a),u.point(0,a),u.point(i,a),u.point(i,0),u.point(i,-a),u.point(0,-a),u.point(-i,-a),u.point(-i,0),u.point(-i,a);else if(f(n[0]-t[0])>r){var c=n[0]0,u=f(t)>r;function a(n,r){return h(n)*h(r)>t}function c(n,e,o){var u=[1,0,0],a=un(en(n),en(e)),c=on(a,a),l=a[0],p=c-l*l;if(!p)return!o&&n;var s=t*c/p,h=-t*l/p,g=un(u,a),v=cn(u,s);an(v,cn(a,h));var d=g,E=on(v,d),y=on(d,d),S=E*E-y*(on(v,v)-1);if(!(S<0)){var m=M(S),x=cn(d,(-E-m)/y);if(an(x,v),x=rn(x),!o)return x;var w,_=n[0],N=e[0],A=n[1],R=e[1];N<_&&(w=_,_=N,N=w);var C=N-_,P=f(C-i)0^x[1]<(f(x[0]-_)i^(_<=x[0]&&x[0]<=N)){var j=cn(d,(-E+m)/y);return an(j,v),[x,rn(j)]}}}function p(t,r){var e=o?n:i-n,u=0;return t<-e?u|=1:t>e&&(u|=2),r<-e?u|=4:r>e&&(u|=8),u}return pt(a,function(n){var t,r,e,l,f;return{lineStart:function(){l=e=!1,f=1},point:function(s,h){var g,v=[s,h],d=a(s,h),E=o?d?0:p(s,h):d?p(s+(s<0?i:-i),h):0;if(!t&&(l=e=d)&&n.lineStart(),d!==e&&(!(g=c(t,v))||ot(t,g)||ot(v,g))&&(v[2]=1),d!==e)f=0,d?(n.lineStart(),g=c(v,t),n.point(g[0],g[1])):(g=c(t,v),n.point(g[0],g[1],2),n.lineEnd()),t=g;else if(u&&t&&o^d){var y;E&r||!(y=c(v,t,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1],3)))}!d||t&&ot(t,v)||n.point(v[0],v[1]),t=v,e=d,r=E},lineEnd:function(){e&&n.lineEnd(),t=null},clean:function(){return f|(l&&e)<<1}}},function(t,r,i,o){rt(o,n,e,i,t,r)},o?[0,-n]:[-i,n-i])}var dt,Et,yt,St,mt=1e9,Mt=-mt;function xt(n,e,i,o){function u(t,r){return n<=t&&t<=i&&e<=r&&r<=o}function a(t,r,u,a){var l=0,f=0;if(null==t||(l=c(t,u))!==(f=c(r,u))||p(t,r)<0^u>0)do{a.point(0===l||3===l?n:i,l>1?o:e)}while((l=(l+u+4)%4)!==f);else a.point(r[0],r[1])}function c(t,o){return f(t[0]-n)0?0:3:f(t[0]-i)0?2:1:f(t[1]-e)0?1:0:o>0?3:2}function l(n,t){return p(n.x,t.x)}function p(n,t){var r=c(n,1),e=c(t,1);return r!==e?r-e:0===r?t[1]-n[1]:1===r?n[0]-t[0]:2===r?n[1]-t[1]:t[0]-n[0]}return function(r){var c,f,p,s,h,g,v,d,E,y,S,m=r,M=it(),x={point:w,lineStart:function(){x.point=_,f&&f.push(p=[]);y=!0,E=!1,v=d=NaN},lineEnd:function(){c&&(_(s,h),g&&E&&M.rejoin(),c.push(M.result()));x.point=w,E&&m.lineEnd()},polygonStart:function(){m=M,c=[],f=[],S=!0},polygonEnd:function(){var e=function(){for(var t=0,r=0,e=f.length;ro&&(s-i)*(o-u)>(h-u)*(n-i)&&++t:h<=o&&(s-i)*(o-u)<(h-u)*(n-i)&&--t;return t}(),i=S&&e,u=(c=t.merge(c)).length;(i||u)&&(r.polygonStart(),i&&(r.lineStart(),a(null,null,1,r),r.lineEnd()),u&&at(c,l,e,a,r),r.polygonEnd());m=r,c=f=p=null}};function w(n,t){u(n,t)&&m.point(n,t)}function _(t,r){var a=u(t,r);if(f&&p.push([t,r]),y)s=t,h=r,g=a,y=!1,a&&(m.lineStart(),m.point(t,r));else if(a&&E)m.point(t,r);else{var c=[v=Math.max(Mt,Math.min(mt,v)),d=Math.max(Mt,Math.min(mt,d))],l=[t=Math.max(Mt,Math.min(mt,t)),r=Math.max(Mt,Math.min(mt,r))];!function(n,t,r,e,i,o){var u,a=n[0],c=n[1],l=0,f=1,p=t[0]-a,s=t[1]-c;if(u=r-a,p||!(u>0)){if(u/=p,p<0){if(u0){if(u>f)return;u>l&&(l=u)}if(u=i-a,p||!(u<0)){if(u/=p,p<0){if(u>f)return;u>l&&(l=u)}else if(p>0){if(u0)){if(u/=s,s<0){if(u0){if(u>f)return;u>l&&(l=u)}if(u=o-c,s||!(u<0)){if(u/=s,s<0){if(u>f)return;u>l&&(l=u)}else if(s>0){if(u0&&(n[0]=a+l*p,n[1]=c+l*s),f<1&&(t[0]=a+f*p,t[1]=c+f*s),!0}}}}}(c,l,n,e,i,o)?a&&(m.lineStart(),m.point(t,r),S=!1):(E||(m.lineStart(),m.point(c[0],c[1])),m.point(l[0],l[1]),a||m.lineEnd(),S=!1)}v=t,d=r,E=a}return x}}var wt={sphere:A,point:A,lineStart:function(){wt.point=Nt,wt.lineEnd=_t},lineEnd:A,polygonStart:A,polygonEnd:A};function _t(){wt.point=wt.lineEnd=A}function Nt(n,t){Et=n*=l,yt=S(t*=l),St=h(t),wt.point=At}function At(n,t){n*=l;var r=S(t*=l),e=h(t),i=f(n-Et),o=h(i),u=e*S(i),a=St*r-yt*e*o,c=yt*r+St*e*o;dt.add(s(M(u*u+a*a),c)),Et=n,yt=r,St=e}function Rt(n){return dt=new t.Adder,z(n,wt),+dt}var Ct=[null,null],Pt={type:"LineString",coordinates:Ct};function jt(n,t){return Ct[0]=n,Ct[1]=t,Rt(Pt)}var qt={Feature:function(n,t){return bt(n.geometry,t)},FeatureCollection:function(n,t){for(var r=n.features,e=-1,i=r.length;++e0&&(o=jt(n[u],n[u-1]))>0&&r<=o&&i<=o&&(r+i-o)*(1-Math.pow((r-i)/o,2))r}).map(p)).concat(t.range(g(a/E)*E,u,E).filter(function(n){return f(n%S)>r}).map(s))}return M.lines=function(){return x().map(function(n){return{type:"LineString",coordinates:n}})},M.outline=function(){return{type:"Polygon",coordinates:[h(o).concat(v(c).slice(1),h(i).reverse().slice(1),v(l).reverse().slice(1))]}},M.extent=function(n){return arguments.length?M.extentMajor(n).extentMinor(n):M.extentMinor()},M.extentMajor=function(n){return arguments.length?(o=+n[0][0],i=+n[1][0],l=+n[0][1],c=+n[1][1],o>i&&(n=o,o=i,i=n),l>c&&(n=l,l=c,c=n),M.precision(m)):[[o,l],[i,c]]},M.extentMinor=function(t){return arguments.length?(e=+t[0][0],n=+t[1][0],a=+t[0][1],u=+t[1][1],e>n&&(t=e,e=n,n=t),a>u&&(t=a,a=u,u=t),M.precision(m)):[[e,a],[n,u]]},M.step=function(n){return arguments.length?M.stepMajor(n).stepMinor(n):M.stepMinor()},M.stepMajor=function(n){return arguments.length?(y=+n[0],S=+n[1],M):[y,S]},M.stepMinor=function(n){return arguments.length?(d=+n[0],E=+n[1],M):[d,E]},M.precision=function(t){return arguments.length?(m=+t,p=Ft(a,u,90),s=Ht(e,n,m),h=Ft(l,c,90),v=Ht(o,i,m),M):m},M.extentMajor([[-180,-90+r],[180,90-r]]).extentMinor([[-180,-80-r],[180,80+r]])}var Wt,Xt,Yt,Bt,Dt=n=>n,Ut=new t.Adder,Zt=new t.Adder,Jt={point:A,lineStart:A,lineEnd:A,polygonStart:function(){Jt.lineStart=Kt,Jt.lineEnd=$t},polygonEnd:function(){Jt.lineStart=Jt.lineEnd=Jt.point=A,Ut.add(f(Zt)),Zt=new t.Adder},result:function(){var n=Ut/2;return Ut=new t.Adder,n}};function Kt(){Jt.point=Qt}function Qt(n,t){Jt.point=Vt,Wt=Yt=n,Xt=Bt=t}function Vt(n,t){Zt.add(Bt*n-Yt*t),Yt=n,Bt=t}function $t(){Vt(Wt,Xt)}var nr=1/0,tr=nr,rr=-nr,er=rr,ir={point:function(n,t){nrr&&(rr=n);ter&&(er=t)},lineStart:A,lineEnd:A,polygonStart:A,polygonEnd:A,result:function(){var n=[[nr,tr],[rr,er]];return rr=er=-(tr=nr=1/0),n}};var or,ur,ar,cr,lr=0,fr=0,pr=0,sr=0,hr=0,gr=0,vr=0,dr=0,Er=0,yr={point:Sr,lineStart:mr,lineEnd:wr,polygonStart:function(){yr.lineStart=_r,yr.lineEnd=Nr},polygonEnd:function(){yr.point=Sr,yr.lineStart=mr,yr.lineEnd=wr},result:function(){var n=Er?[vr/Er,dr/Er]:gr?[sr/gr,hr/gr]:pr?[lr/pr,fr/pr]:[NaN,NaN];return lr=fr=pr=sr=hr=gr=vr=dr=Er=0,n}};function Sr(n,t){lr+=n,fr+=t,++pr}function mr(){yr.point=Mr}function Mr(n,t){yr.point=xr,Sr(ar=n,cr=t)}function xr(n,t){var r=n-ar,e=t-cr,i=M(r*r+e*e);sr+=i*(ar+n)/2,hr+=i*(cr+t)/2,gr+=i,Sr(ar=n,cr=t)}function wr(){yr.point=Sr}function _r(){yr.point=Ar}function Nr(){Rr(or,ur)}function Ar(n,t){yr.point=Rr,Sr(or=ar=n,ur=cr=t)}function Rr(n,t){var r=n-ar,e=t-cr,i=M(r*r+e*e);sr+=i*(ar+n)/2,hr+=i*(cr+t)/2,gr+=i,vr+=(i=cr*n-ar*t)*(ar+n),dr+=i*(cr+t),Er+=3*i,Sr(ar=n,cr=t)}function Cr(n){this._context=n}Cr.prototype={_radius:4.5,pointRadius:function(n){return this._radius=n,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(n,t){switch(this._point){case 0:this._context.moveTo(n,t),this._point=1;break;case 1:this._context.lineTo(n,t);break;default:this._context.moveTo(n+this._radius,t),this._context.arc(n,t,this._radius,0,a)}},result:A};var Pr,jr,qr,zr,br,Lr=new t.Adder,Or={point:A,lineStart:function(){Or.point=Gr},lineEnd:function(){Pr&&Tr(jr,qr),Or.point=A},polygonStart:function(){Pr=!0},polygonEnd:function(){Pr=null},result:function(){var n=+Lr;return Lr=new t.Adder,n}};function Gr(n,t){Or.point=Tr,jr=zr=n,qr=br=t}function Tr(n,t){zr-=n,br-=t,Lr.add(M(zr*zr+br*br)),zr=n,br=t}function kr(){this._string=[]}function Fr(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Hr(n){return function(t){var r=new Ir;for(var e in n)r[e]=n[e];return r.stream=t,r}}function Ir(){}function Wr(n,t,r){var e=n.clipExtent&&n.clipExtent();return n.scale(150).translate([0,0]),null!=e&&n.clipExtent(null),z(r,n.stream(ir)),t(ir.result()),null!=e&&n.clipExtent(e),n}function Xr(n,t,r){return Wr(n,function(r){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1],o=Math.min(e/(r[1][0]-r[0][0]),i/(r[1][1]-r[0][1])),u=+t[0][0]+(e-o*(r[1][0]+r[0][0]))/2,a=+t[0][1]+(i-o*(r[1][1]+r[0][1]))/2;n.scale(150*o).translate([u,a])},r)}function Yr(n,t,r){return Xr(n,[[0,0],t],r)}function Br(n,t,r){return Wr(n,function(r){var e=+t,i=e/(r[1][0]-r[0][0]),o=(e-i*(r[1][0]+r[0][0]))/2,u=-i*r[0][1];n.scale(150*i).translate([o,u])},r)}function Dr(n,t,r){return Wr(n,function(r){var e=+t,i=e/(r[1][1]-r[0][1]),o=-i*r[0][0],u=(e-i*(r[1][1]+r[0][1]))/2;n.scale(150*i).translate([o,u])},r)}kr.prototype={_radius:4.5,_circle:Fr(4.5),pointRadius:function(n){return(n=+n)!==this._radius&&(this._radius=n,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(n,t){switch(this._point){case 0:this._string.push("M",n,",",t),this._point=1;break;case 1:this._string.push("L",n,",",t);break;default:null==this._circle&&(this._circle=Fr(this._radius)),this._string.push("M",n,",",t,this._circle)}},result:function(){if(this._string.length){var n=this._string.join("");return this._string=[],n}return null}},Ir.prototype={constructor:Ir,point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var Ur=16,Zr=h(30*l);function Jr(n,t){return+t?function(n,t){function e(i,o,u,a,c,l,p,h,g,v,d,E,y,S){var m=p-i,x=h-o,w=m*m+x*x;if(w>4*t&&y--){var N=a+v,A=c+d,R=l+E,C=M(N*N+A*A+R*R),P=_(R/=C),j=f(f(R)-1)t||f((m*L+x*O)/w-.5)>.3||a*v+c*d+l*E2?n[2]%360*l:0,z()):[y*c,S*c,m*c]},j.angle=function(n){return arguments.length?(x=n%360*l,z()):x*c},j.reflectX=function(n){return arguments.length?(w=n?-1:1,z()):w<0},j.reflectY=function(n){return arguments.length?(_=n?-1:1,z()):_<0},j.precision=function(n){return arguments.length?(u=Jr(a,P=n*n),b()):M(P)},j.fitExtent=function(n,t){return Xr(j,n,t)},j.fitSize=function(n,t){return Yr(j,n,t)},j.fitWidth=function(n,t){return Br(j,n,t)},j.fitHeight=function(n,t){return Dr(j,n,t)},function(){return t=n.apply(this,arguments),j.invert=t.invert&&q,z()}}function ne(n){var t=0,r=i/3,e=$r(n),o=e(t,r);return o.parallels=function(n){return arguments.length?e(t=n[0]*l,r=n[1]*l):[t*c,r*c]},o}function te(n,t){var e=S(n),o=(e+S(t))/2;if(f(o)0?t<-o+r&&(t=-o+r):t>o-r&&(t=o-r);var e=a/y(fe(t),u);return[e*S(u*n),a-e*h(u*n)]}return c.invert=function(n,t){var r=a-t,e=m(u)*M(n*n+r*r),c=s(n,f(r))*m(r);return r*u<0&&(c-=i*m(n)*m(r)),[c/u,2*p(y(a/e,1/u))-o]},c}function se(n,t){return[n,t]}function he(n,t){var e=h(n),o=n===t?S(n):(e-h(t))/(t-n),u=e/o+n;if(f(o)r&&--o>0);return[n/(.8707+(u=i*i)*(u*(u*u*u*(.003971-.001529*u)-.013791)-.131979)),i]},xe.invert=oe(_),we.invert=oe(function(n){return 2*p(n)}),_e.invert=function(n,t){return[-t,2*p(v(n))-o]},n.geoAlbers=ee,n.geoAlbersUsa=function(){var n,t,e,i,o,u,a=ee(),c=re().rotate([154,0]).center([-2,58.5]).parallels([55,65]),l=re().rotate([157,0]).center([-3,19.9]).parallels([8,18]),f={point:function(n,t){u=[n,t]}};function p(n){var t=n[0],r=n[1];return u=null,e.point(t,r),u||(i.point(t,r),u)||(o.point(t,r),u)}function s(){return n=t=null,p}return p.invert=function(n){var t=a.scale(),r=a.translate(),e=(n[0]-r[0])/t,i=(n[1]-r[1])/t;return(i>=.12&&i<.234&&e>=-.425&&e<-.214?c:i>=.166&&i<.234&&e>=-.214&&e<-.115?l:a).invert(n)},p.stream=function(r){return n&&t===r?n:(e=[a.stream(t=r),c.stream(r),l.stream(r)],i=e.length,n={point:function(n,t){for(var r=-1;++rLn(e[0],e[1])&&(e[1]=i[1]),Ln(i[0],e[1])>Ln(e[0],e[1])&&(e[0]=i[0])):o.push(e=i);for(u=-1/0,t=0,e=o[r=o.length-1];t<=r;e=i,++t)i=o[t],(a=Ln(e[1],i[0]))>u&&(u=a,k=i[0],H=e[1])}return U=Z=null,k===1/0||F===1/0?[[NaN,NaN],[NaN,NaN]]:[[k,F],[H,I]]},n.geoCentroid=function(n){fn=pn=sn=hn=gn=vn=dn=En=0,yn=new t.Adder,Sn=new t.Adder,mn=new t.Adder,z(n,Tn);var i=+yn,o=+Sn,u=+mn,a=d(i,o,u);return a2?n[2]+90:90]):[(n=r())[0],n[1],n[2]-90]},r([0,0,90]).scale(159.155)},n.geoTransverseMercatorRaw=_e,Object.defineProperty(n,"__esModule",{value:!0})}); diff --git a/node_modules/d3-geo/package.json b/node_modules/d3-geo/package.json new file mode 100644 index 00000000..8b7b02f9 --- /dev/null +++ b/node_modules/d3-geo/package.json @@ -0,0 +1,79 @@ +{ + "_from": "d3-geo@2", + "_id": "d3-geo@2.0.1", + "_inBundle": false, + "_integrity": "sha512-M6yzGbFRfxzNrVhxDJXzJqSLQ90q1cCyb3EWFZ1LF4eWOBYxFypw7I/NFVBNXKNqxv1bqLathhYvdJ6DC+th3A==", + "_location": "/d3-geo", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-geo@2", + "name": "d3-geo", + "escapedName": "d3-geo", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3" + ], + "_resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.1.tgz", + "_shasum": "2437fdfed3fe3aba2812bd8f30609cac83a7ee39", + "_spec": "d3-geo@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "https://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-geo/issues" + }, + "bundleDependencies": false, + "dependencies": { + "d3-array": ">=2.5" + }, + "deprecated": false, + "description": "Shapes and calculators for spherical coordinates.", + "devDependencies": { + "canvas": "1 - 2", + "d3-format": "1 - 2", + "eslint": "6", + "esm": "3", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4", + "topojson-client": "3", + "world-atlas": "1" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-geo/", + "jsdelivr": "dist/d3-geo.min.js", + "keywords": [ + "d3", + "d3-module", + "geo", + "maps", + "cartography" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-geo.js", + "module": "src/index.js", + "name": "d3-geo", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-geo.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test && mkdir -p test/output && test/compare-images", + "pretest": "rollup -c", + "test": "tape -r esm 'test/**/*-test.js' && eslint src" + }, + "sideEffects": false, + "unpkg": "dist/d3-geo.min.js", + "version": "2.0.1" +} diff --git a/node_modules/d3-geo/src/area.js b/node_modules/d3-geo/src/area.js new file mode 100644 index 00000000..df91640e --- /dev/null +++ b/node_modules/d3-geo/src/area.js @@ -0,0 +1,76 @@ +import {Adder} from "d3-array"; +import {atan2, cos, quarterPi, radians, sin, tau} from "./math.js"; +import noop from "./noop.js"; +import stream from "./stream.js"; + +export var areaRingSum = new Adder(); + +// hello? + +var areaSum = new Adder(), + lambda00, + phi00, + lambda0, + cosPhi0, + sinPhi0; + +export var areaStream = { + point: noop, + lineStart: noop, + lineEnd: noop, + polygonStart: function() { + areaRingSum = new Adder(); + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function() { + var areaRing = +areaRingSum; + areaSum.add(areaRing < 0 ? tau + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop; + }, + sphere: function() { + areaSum.add(tau); + } +}; + +function areaRingStart() { + areaStream.point = areaPointFirst; +} + +function areaRingEnd() { + areaPoint(lambda00, phi00); +} + +function areaPointFirst(lambda, phi) { + areaStream.point = areaPoint; + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi); +} + +function areaPoint(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos(phi), + sinPhi = sin(phi), + k = sinPhi0 * sinPhi, + u = cosPhi0 * cosPhi + k * cos(adLambda), + v = k * sdLambda * sin(adLambda); + areaRingSum.add(atan2(v, u)); + + // Advance the previous points. + lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; +} + +export default function(object) { + areaSum = new Adder(); + stream(object, areaStream); + return areaSum * 2; +} diff --git a/node_modules/d3-geo/src/bounds.js b/node_modules/d3-geo/src/bounds.js new file mode 100644 index 00000000..0b398ac9 --- /dev/null +++ b/node_modules/d3-geo/src/bounds.js @@ -0,0 +1,179 @@ +import {Adder} from "d3-array"; +import {areaStream, areaRingSum} from "./area.js"; +import {cartesian, cartesianCross, cartesianNormalizeInPlace, spherical} from "./cartesian.js"; +import {abs, degrees, epsilon, radians} from "./math.js"; +import stream from "./stream.js"; + +var lambda0, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00, phi00, // first point + p0, // previous 3D point + deltaSum, + ranges, + range; + +var boundsStream = { + point: boundsPoint, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function() { + boundsStream.point = boundsRingPoint; + boundsStream.lineStart = boundsRingStart; + boundsStream.lineEnd = boundsRingEnd; + deltaSum = new Adder(); + areaStream.polygonStart(); + }, + polygonEnd: function() { + areaStream.polygonEnd(); + boundsStream.point = boundsPoint; + boundsStream.lineStart = boundsLineStart; + boundsStream.lineEnd = boundsLineEnd; + if (areaRingSum < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon) phi1 = 90; + else if (deltaSum < -epsilon) phi0 = -90; + range[0] = lambda0, range[1] = lambda1; + }, + sphere: function() { + lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90); + } +}; + +function boundsPoint(lambda, phi) { + ranges.push(range = [lambda0 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; +} + +function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees * sign, + phii, + antimeridian = abs(delta) > 180; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda; + } + } else { + if (lambda1 >= lambda0) { + if (lambda < lambda0) lambda0 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0 = lambda, lambda1 = lambda]); + } + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; +} + +function boundsLineStart() { + boundsStream.point = linePoint; +} + +function boundsLineEnd() { + range[0] = lambda0, range[1] = lambda1; + boundsStream.point = boundsPoint; + p0 = null; +} + +function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00 = lambda, phi00 = phi; + } + areaStream.point(lambda, phi); + linePoint(lambda, phi); +} + +function boundsRingStart() { + areaStream.lineStart(); +} + +function boundsRingEnd() { + boundsRingPoint(lambda00, phi00); + areaStream.lineEnd(); + if (abs(deltaSum) > epsilon) lambda0 = -(lambda1 = 180); + range[0] = lambda0, range[1] = lambda1; + p0 = null; +} + +// Finds the left-right distance between two longitudes. +// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want +// the distance between ±180° to be 360°. +function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; +} + +function rangeCompare(a, b) { + return a[0] - b[0]; +} + +function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; +} + +export default function(feature) { + var i, n, a, b, merged, deltaMax, delta; + + phi1 = lambda1 = -(lambda0 = phi0 = Infinity); + ranges = []; + stream(feature, boundsStream); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0 = b[0], lambda1 = a[1]; + } + } + + ranges = range = null; + + return lambda0 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0, phi0], [lambda1, phi1]]; +} diff --git a/node_modules/d3-geo/src/cartesian.js b/node_modules/d3-geo/src/cartesian.js new file mode 100644 index 00000000..73790a6d --- /dev/null +++ b/node_modules/d3-geo/src/cartesian.js @@ -0,0 +1,33 @@ +import {asin, atan2, cos, sin, sqrt} from "./math.js"; + +export function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; +} + +export function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi); + return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]; +} + +export function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} + +export function cartesianCross(a, b) { + return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; +} + +// TODO return a +export function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; +} + +export function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; +} + +// TODO return d +export function cartesianNormalizeInPlace(d) { + var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; +} diff --git a/node_modules/d3-geo/src/centroid.js b/node_modules/d3-geo/src/centroid.js new file mode 100644 index 00000000..6b1eede0 --- /dev/null +++ b/node_modules/d3-geo/src/centroid.js @@ -0,0 +1,143 @@ +import {Adder} from "d3-array"; +import {asin, atan2, cos, degrees, epsilon, epsilon2, hypot, radians, sin, sqrt} from "./math.js"; +import noop from "./noop.js"; +import stream from "./stream.js"; + +var W0, W1, + X0, Y0, Z0, + X1, Y1, Z1, + X2, Y2, Z2, + lambda00, phi00, // first point + x0, y0, z0; // previous point + +var centroidStream = { + sphere: noop, + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function() { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function() { + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + } +}; + +// Arithmetic mean of Cartesian vectors. +function centroidPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)); +} + +function centroidPointCartesian(x, y, z) { + ++W0; + X0 += (x - X0) / W0; + Y0 += (y - Y0) / W0; + Z0 += (z - Z0) / W0; +} + +function centroidLineStart() { + centroidStream.point = centroidLinePointFirst; +} + +function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidStream.point = centroidLinePoint; + centroidPointCartesian(x0, y0, z0); +} + +function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} + +function centroidLineEnd() { + centroidStream.point = centroidPoint; +} + +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). +function centroidRingStart() { + centroidStream.point = centroidRingPointFirst; +} + +function centroidRingEnd() { + centroidRingPoint(lambda00, phi00); + centroidStream.point = centroidPoint; +} + +function centroidRingPointFirst(lambda, phi) { + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + centroidStream.point = centroidRingPoint; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidPointCartesian(x0, y0, z0); +} + +function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + cx = y0 * z - z0 * y, + cy = z0 * x - x0 * z, + cz = x0 * y - y0 * x, + m = hypot(cx, cy, cz), + w = asin(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2.add(v * cx); + Y2.add(v * cy); + Z2.add(v * cz); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} + +export default function(object) { + W0 = W1 = + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = 0; + X2 = new Adder(); + Y2 = new Adder(); + Z2 = new Adder(); + stream(object, centroidStream); + + var x = +X2, + y = +Y2, + z = +Z2, + m = hypot(x, y, z); + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2) { + x = X1, y = Y1, z = Z1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon) x = X0, y = Y0, z = Z0; + m = hypot(x, y, z); + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2) return [NaN, NaN]; + } + + return [atan2(y, x) * degrees, asin(z / m) * degrees]; +} diff --git a/node_modules/d3-geo/src/circle.js b/node_modules/d3-geo/src/circle.js new file mode 100644 index 00000000..85a0af94 --- /dev/null +++ b/node_modules/d3-geo/src/circle.js @@ -0,0 +1,72 @@ +import {cartesian, cartesianNormalizeInPlace, spherical} from "./cartesian.js"; +import constant from "./constant.js"; +import {acos, cos, degrees, epsilon, radians, sin, tau} from "./math.js"; +import {rotateRadians} from "./rotation.js"; + +// Generates a circle centered at [0°, 0°], with a given radius and precision. +export function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos(radius), + sinRadius = sin(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]); + stream.point(point[0], point[1]); + } +} + +// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. +function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau; +} + +export default function() { + var center = constant([0, 0]), + radius = constant(90), + precision = constant(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees, x[1] *= degrees; + } + + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } + + circle.center = function(_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), circle) : radius; + }; + + circle.precision = function(_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant(+_), circle) : precision; + }; + + return circle; +} diff --git a/node_modules/d3-geo/src/clip/antimeridian.js b/node_modules/d3-geo/src/clip/antimeridian.js new file mode 100644 index 00000000..7ed32d42 --- /dev/null +++ b/node_modules/d3-geo/src/clip/antimeridian.js @@ -0,0 +1,92 @@ +import clip from "./index.js"; +import {abs, atan, cos, epsilon, halfPi, pi, sin} from "../math.js"; + +export default clip( + function() { return true; }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi, -halfPi] +); + +// Takes a line and cuts into visible segments. Return values: 0 - there were +// intersections or the line was empty; 1 - no intersections; 2 - there were +// intersections, and the first and last segments should be rejoined. +function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections + + return { + lineStart: function() { + stream.lineStart(); + clean = 1; + }, + point: function(lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi : -pi, + delta = abs(lambda1 - lambda0); + if (abs(delta - pi) < epsilon) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian + if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies + if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function() { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function() { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; +} + +function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin(lambda0 - lambda1); + return abs(sinLambda0Lambda1) > epsilon + ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) + - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; +} + +function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi; + stream.point(-pi, phi); + stream.point(0, phi); + stream.point(pi, phi); + stream.point(pi, 0); + stream.point(pi, -phi); + stream.point(0, -phi); + stream.point(-pi, -phi); + stream.point(-pi, 0); + stream.point(-pi, phi); + } else if (abs(from[0] - to[0]) > epsilon) { + var lambda = from[0] < to[0] ? pi : -pi; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } +} diff --git a/node_modules/d3-geo/src/clip/buffer.js b/node_modules/d3-geo/src/clip/buffer.js new file mode 100644 index 00000000..f5e1ecec --- /dev/null +++ b/node_modules/d3-geo/src/clip/buffer.js @@ -0,0 +1,24 @@ +import noop from "../noop.js"; + +export default function() { + var lines = [], + line; + return { + point: function(x, y, m) { + line.push([x, y, m]); + }, + lineStart: function() { + lines.push(line = []); + }, + lineEnd: noop, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function() { + var result = lines; + lines = []; + line = null; + return result; + } + }; +} diff --git a/node_modules/d3-geo/src/clip/circle.js b/node_modules/d3-geo/src/clip/circle.js new file mode 100644 index 00000000..30dcf441 --- /dev/null +++ b/node_modules/d3-geo/src/clip/circle.js @@ -0,0 +1,177 @@ +import {cartesian, cartesianAddInPlace, cartesianCross, cartesianDot, cartesianScale, spherical} from "../cartesian.js"; +import {circleStream} from "../circle.js"; +import {abs, cos, epsilon, pi, radians, sqrt} from "../math.js"; +import pointEqual from "../pointEqual.js"; +import clip from "./index.js"; + +export default function(radius) { + var cr = cos(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case + + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + + function visible(lambda, phi) { + return cos(lambda) * cos(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) + point1[2] = 1; + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1], 2); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1], 3); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function() { + return clean | ((v00 && v0) << 1); + } + }; + } + + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); + + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; + + // Two polar points. + if (!determinant) return !two && a; + + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); + + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + + if (t2 < 0) return; + + var t = sqrt(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + + if (!two) return q; + + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + + var delta = lambda1 - lambda0, + polar = abs(delta - pi) < epsilon, + meridian = polar || delta < epsilon; + + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]); +} diff --git a/node_modules/d3-geo/src/clip/extent.js b/node_modules/d3-geo/src/clip/extent.js new file mode 100644 index 00000000..5ff06ee1 --- /dev/null +++ b/node_modules/d3-geo/src/clip/extent.js @@ -0,0 +1,20 @@ +import clipRectangle from "./rectangle.js"; + +export default function() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function(_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } + }; +} diff --git a/node_modules/d3-geo/src/clip/index.js b/node_modules/d3-geo/src/clip/index.js new file mode 100644 index 00000000..af7ac91f --- /dev/null +++ b/node_modules/d3-geo/src/clip/index.js @@ -0,0 +1,131 @@ +import clipBuffer from "./buffer.js"; +import clipRejoin from "./rejoin.js"; +import {epsilon, halfPi} from "../math.js"; +import polygonContains from "../polygonContains.js"; +import {merge} from "d3-array"; + +export default function(pointVisible, clipLine, interpolate, start) { + return function(sink) { + var line = clipLine(sink), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = merge(segments); + var startInside = polygonContains(polygon, start); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipRejoin(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function() { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; + + function point(lambda, phi) { + if (pointVisible(lambda, phi)) sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + line.point(lambda, phi); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } + + function ringStart() { + ringSink.lineStart(); + ring = []; + } + + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; + + ring.pop(); + polygon.push(ring); + ring = null; + + if (!n) return; + + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } + + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; +} + +function validSegment(segment) { + return segment.length > 1; +} + +// Intersections are sorted along the clip edge. For both antimeridian cutting +// and circle clipping, the same comparison is used. +function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]); +} diff --git a/node_modules/d3-geo/src/clip/line.js b/node_modules/d3-geo/src/clip/line.js new file mode 100644 index 00000000..3b173d7b --- /dev/null +++ b/node_modules/d3-geo/src/clip/line.js @@ -0,0 +1,59 @@ +export default function(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; +} diff --git a/node_modules/d3-geo/src/clip/rectangle.js b/node_modules/d3-geo/src/clip/rectangle.js new file mode 100644 index 00000000..47676261 --- /dev/null +++ b/node_modules/d3-geo/src/clip/rectangle.js @@ -0,0 +1,168 @@ +import {abs, epsilon} from "../math.js"; +import clipBuffer from "./buffer.js"; +import clipLine from "./line.js"; +import clipRejoin from "./rejoin.js"; +import {merge} from "d3-array"; + +var clipMax = 1e9, clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + +export default function clipRectangle(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } + + function corner(p, direction) { + return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3 + : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1 + : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } + + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } + + return function(stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; + + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; + + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } + + function polygonInside() { + var winding = 0; + + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; } + else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; } + } + } + + return winding; + } + + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } + + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipRejoin(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); + } + activeStream = stream, segments = polygon = ring = null; + } + + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } + + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + + return clipStream; + }; +} diff --git a/node_modules/d3-geo/src/clip/rejoin.js b/node_modules/d3-geo/src/clip/rejoin.js new file mode 100644 index 00000000..37e02411 --- /dev/null +++ b/node_modules/d3-geo/src/clip/rejoin.js @@ -0,0 +1,103 @@ +import pointEqual from "../pointEqual.js"; +import {epsilon} from "../math.js"; + +function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous +} + +// A generalized polygon clipping algorithm: given a polygon that has been cut +// into its visible line segments, and rejoins the segments by interpolating +// along the clip edge. +export default function(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n], x; + + if (pointEqual(p0, p1)) { + if (!p0[2] && !p1[2]) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + // handle degenerate cases by moving the point + p1[0] += 2 * epsilon; + } + + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + + if (!subject.length) return; + + clip.sort(compareIntersection); + link(subject); + link(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; + } + + var start = subject[0], + points, + point; + + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); + } +} + +function link(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; +} diff --git a/node_modules/d3-geo/src/compose.js b/node_modules/d3-geo/src/compose.js new file mode 100644 index 00000000..f6a967a7 --- /dev/null +++ b/node_modules/d3-geo/src/compose.js @@ -0,0 +1,12 @@ +export default function(a, b) { + + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + + return compose; +} diff --git a/node_modules/d3-geo/src/constant.js b/node_modules/d3-geo/src/constant.js new file mode 100644 index 00000000..b7d42e71 --- /dev/null +++ b/node_modules/d3-geo/src/constant.js @@ -0,0 +1,5 @@ +export default function(x) { + return function() { + return x; + }; +} diff --git a/node_modules/d3-geo/src/contains.js b/node_modules/d3-geo/src/contains.js new file mode 100644 index 00000000..923f4d43 --- /dev/null +++ b/node_modules/d3-geo/src/contains.js @@ -0,0 +1,97 @@ +import {default as polygonContains} from "./polygonContains.js"; +import {default as distance} from "./distance.js"; +import {epsilon2, radians} from "./math.js"; + +var containsObjectType = { + Feature: function(object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function(object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; + return false; + } +}; + +var containsGeometryType = { + Sphere: function() { + return true; + }, + Point: function(object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPoint(coordinates[i], point)) return true; + return false; + }, + LineString: function(object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsLine(coordinates[i], point)) return true; + return false; + }, + Polygon: function(object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPolygon(coordinates[i], point)) return true; + return false; + }, + GeometryCollection: function(object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) if (containsGeometry(geometries[i], point)) return true; + return false; + } +}; + +function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; +} + +function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; +} + +function containsLine(coordinates, point) { + var ao, bo, ab; + for (var i = 0, n = coordinates.length; i < n; i++) { + bo = distance(coordinates[i], point); + if (bo === 0) return true; + if (i > 0) { + ab = distance(coordinates[i], coordinates[i - 1]); + if ( + ab > 0 && + ao <= ab && + bo <= ab && + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab + ) + return true; + } + ao = bo; + } + return false; +} + +function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); +} + +function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; +} + +function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; +} + +export default function(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); +} diff --git a/node_modules/d3-geo/src/distance.js b/node_modules/d3-geo/src/distance.js new file mode 100644 index 00000000..0cd23db1 --- /dev/null +++ b/node_modules/d3-geo/src/distance.js @@ -0,0 +1,10 @@ +import length from "./length.js"; + +var coordinates = [null, null], + object = {type: "LineString", coordinates: coordinates}; + +export default function(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length(object); +} diff --git a/node_modules/d3-geo/src/graticule.js b/node_modules/d3-geo/src/graticule.js new file mode 100644 index 00000000..dc8daafd --- /dev/null +++ b/node_modules/d3-geo/src/graticule.js @@ -0,0 +1,105 @@ +import {range} from "d3-array"; +import {abs, ceil, epsilon} from "./math.js"; + +function graticuleX(y0, y1, dy) { + var y = range(y0, y1 - epsilon, dy).concat(y1); + return function(x) { return y.map(function(y) { return [x, y]; }); }; +} + +function graticuleY(x0, x1, dx) { + var x = range(x0, x1 - epsilon, dx).concat(x1); + return function(y) { return x.map(function(x) { return [x, y]; }); }; +} + +export default function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; + + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; + } + + function lines() { + return range(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(range(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon; }).map(x)) + .concat(range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon; }).map(y)); + } + + graticule.lines = function() { + return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; }); + }; + + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; + + graticule.extent = function(_) { + if (!arguments.length) return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; + + graticule.extentMajor = function(_) { + if (!arguments.length) return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + + graticule.extentMinor = function(_) { + if (!arguments.length) return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + + graticule.step = function(_) { + if (!arguments.length) return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; + + graticule.stepMajor = function(_) { + if (!arguments.length) return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + + graticule.stepMinor = function(_) { + if (!arguments.length) return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; + + return graticule + .extentMajor([[-180, -90 + epsilon], [180, 90 - epsilon]]) + .extentMinor([[-180, -80 - epsilon], [180, 80 + epsilon]]); +} + +export function graticule10() { + return graticule()(); +} diff --git a/node_modules/d3-geo/src/identity.js b/node_modules/d3-geo/src/identity.js new file mode 100644 index 00000000..9a800599 --- /dev/null +++ b/node_modules/d3-geo/src/identity.js @@ -0,0 +1 @@ +export default x => x; diff --git a/node_modules/d3-geo/src/index.js b/node_modules/d3-geo/src/index.js new file mode 100644 index 00000000..9a369763 --- /dev/null +++ b/node_modules/d3-geo/src/index.js @@ -0,0 +1,34 @@ +export {default as geoArea} from "./area.js"; +export {default as geoBounds} from "./bounds.js"; +export {default as geoCentroid} from "./centroid.js"; +export {default as geoCircle} from "./circle.js"; +export {default as geoClipAntimeridian} from "./clip/antimeridian.js"; +export {default as geoClipCircle} from "./clip/circle.js"; +export {default as geoClipExtent} from "./clip/extent.js"; // DEPRECATED! Use d3.geoIdentity().clipExtent(…). +export {default as geoClipRectangle} from "./clip/rectangle.js"; +export {default as geoContains} from "./contains.js"; +export {default as geoDistance} from "./distance.js"; +export {default as geoGraticule, graticule10 as geoGraticule10} from "./graticule.js"; +export {default as geoInterpolate} from "./interpolate.js"; +export {default as geoLength} from "./length.js"; +export {default as geoPath} from "./path/index.js"; +export {default as geoAlbers} from "./projection/albers.js"; +export {default as geoAlbersUsa} from "./projection/albersUsa.js"; +export {default as geoAzimuthalEqualArea, azimuthalEqualAreaRaw as geoAzimuthalEqualAreaRaw} from "./projection/azimuthalEqualArea.js"; +export {default as geoAzimuthalEquidistant, azimuthalEquidistantRaw as geoAzimuthalEquidistantRaw} from "./projection/azimuthalEquidistant.js"; +export {default as geoConicConformal, conicConformalRaw as geoConicConformalRaw} from "./projection/conicConformal.js"; +export {default as geoConicEqualArea, conicEqualAreaRaw as geoConicEqualAreaRaw} from "./projection/conicEqualArea.js"; +export {default as geoConicEquidistant, conicEquidistantRaw as geoConicEquidistantRaw} from "./projection/conicEquidistant.js"; +export {default as geoEqualEarth, equalEarthRaw as geoEqualEarthRaw} from "./projection/equalEarth.js"; +export {default as geoEquirectangular, equirectangularRaw as geoEquirectangularRaw} from "./projection/equirectangular.js"; +export {default as geoGnomonic, gnomonicRaw as geoGnomonicRaw} from "./projection/gnomonic.js"; +export {default as geoIdentity} from "./projection/identity.js"; +export {default as geoProjection, projectionMutator as geoProjectionMutator} from "./projection/index.js"; +export {default as geoMercator, mercatorRaw as geoMercatorRaw} from "./projection/mercator.js"; +export {default as geoNaturalEarth1, naturalEarth1Raw as geoNaturalEarth1Raw} from "./projection/naturalEarth1.js"; +export {default as geoOrthographic, orthographicRaw as geoOrthographicRaw} from "./projection/orthographic.js"; +export {default as geoStereographic, stereographicRaw as geoStereographicRaw} from "./projection/stereographic.js"; +export {default as geoTransverseMercator, transverseMercatorRaw as geoTransverseMercatorRaw} from "./projection/transverseMercator.js"; +export {default as geoRotation} from "./rotation.js"; +export {default as geoStream} from "./stream.js"; +export {default as geoTransform} from "./transform.js"; diff --git a/node_modules/d3-geo/src/interpolate.js b/node_modules/d3-geo/src/interpolate.js new file mode 100644 index 00000000..b19fbbaa --- /dev/null +++ b/node_modules/d3-geo/src/interpolate.js @@ -0,0 +1,36 @@ +import {asin, atan2, cos, degrees, haversin, radians, sin, sqrt} from "./math.js"; + +export default function(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos(y0), + sy0 = sin(y0), + cy1 = cos(y1), + sy1 = sin(y1), + kx0 = cy0 * cos(x0), + ky0 = cy0 * sin(x0), + kx1 = cy1 * cos(x1), + ky1 = cy1 * sin(x1), + d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin(d); + + var interpolate = d ? function(t) { + var B = sin(t *= d) / k, + A = sin(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2(y, x) * degrees, + atan2(z, sqrt(x * x + y * y)) * degrees + ]; + } : function() { + return [x0 * degrees, y0 * degrees]; + }; + + interpolate.distance = d; + + return interpolate; +} diff --git a/node_modules/d3-geo/src/length.js b/node_modules/d3-geo/src/length.js new file mode 100644 index 00000000..7899e053 --- /dev/null +++ b/node_modules/d3-geo/src/length.js @@ -0,0 +1,53 @@ +import {Adder} from "d3-array"; +import {abs, atan2, cos, radians, sin, sqrt} from "./math.js"; +import noop from "./noop.js"; +import stream from "./stream.js"; + +var lengthSum, + lambda0, + sinPhi0, + cosPhi0; + +var lengthStream = { + sphere: noop, + point: noop, + lineStart: lengthLineStart, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop +}; + +function lengthLineStart() { + lengthStream.point = lengthPointFirst; + lengthStream.lineEnd = lengthLineEnd; +} + +function lengthLineEnd() { + lengthStream.point = lengthStream.lineEnd = noop; +} + +function lengthPointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0 = lambda, sinPhi0 = sin(phi), cosPhi0 = cos(phi); + lengthStream.point = lengthPoint; +} + +function lengthPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin(phi), + cosPhi = cos(phi), + delta = abs(lambda - lambda0), + cosDelta = cos(delta), + sinDelta = sin(delta), + x = cosPhi * sinDelta, + y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta, + z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt(x * x + y * y), z)); + lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi; +} + +export default function(object) { + lengthSum = new Adder(); + stream(object, lengthStream); + return +lengthSum; +} diff --git a/node_modules/d3-geo/src/math.js b/node_modules/d3-geo/src/math.js new file mode 100644 index 00000000..ace500ff --- /dev/null +++ b/node_modules/d3-geo/src/math.js @@ -0,0 +1,36 @@ +export var epsilon = 1e-6; +export var epsilon2 = 1e-12; +export var pi = Math.PI; +export var halfPi = pi / 2; +export var quarterPi = pi / 4; +export var tau = pi * 2; + +export var degrees = 180 / pi; +export var radians = pi / 180; + +export var abs = Math.abs; +export var atan = Math.atan; +export var atan2 = Math.atan2; +export var cos = Math.cos; +export var ceil = Math.ceil; +export var exp = Math.exp; +export var floor = Math.floor; +export var hypot = Math.hypot; +export var log = Math.log; +export var pow = Math.pow; +export var sin = Math.sin; +export var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; +export var sqrt = Math.sqrt; +export var tan = Math.tan; + +export function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); +} + +export function asin(x) { + return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x); +} + +export function haversin(x) { + return (x = sin(x / 2)) * x; +} diff --git a/node_modules/d3-geo/src/noop.js b/node_modules/d3-geo/src/noop.js new file mode 100644 index 00000000..ca6a7447 --- /dev/null +++ b/node_modules/d3-geo/src/noop.js @@ -0,0 +1 @@ +export default function noop() {} diff --git a/node_modules/d3-geo/src/path/area.js b/node_modules/d3-geo/src/path/area.js new file mode 100644 index 00000000..bb38b196 --- /dev/null +++ b/node_modules/d3-geo/src/path/area.js @@ -0,0 +1,50 @@ +import {Adder} from "d3-array"; +import {abs} from "../math.js"; +import noop from "../noop.js"; + +var areaSum = new Adder(), + areaRingSum = new Adder(), + x00, + y00, + x0, + y0; + +var areaStream = { + point: noop, + lineStart: noop, + lineEnd: noop, + polygonStart: function() { + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function() { + areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop; + areaSum.add(abs(areaRingSum)); + areaRingSum = new Adder(); + }, + result: function() { + var area = areaSum / 2; + areaSum = new Adder(); + return area; + } +}; + +function areaRingStart() { + areaStream.point = areaPointFirst; +} + +function areaPointFirst(x, y) { + areaStream.point = areaPoint; + x00 = x0 = x, y00 = y0 = y; +} + +function areaPoint(x, y) { + areaRingSum.add(y0 * x - x0 * y); + x0 = x, y0 = y; +} + +function areaRingEnd() { + areaPoint(x00, y00); +} + +export default areaStream; diff --git a/node_modules/d3-geo/src/path/bounds.js b/node_modules/d3-geo/src/path/bounds.js new file mode 100644 index 00000000..0c83258a --- /dev/null +++ b/node_modules/d3-geo/src/path/bounds.js @@ -0,0 +1,28 @@ +import noop from "../noop.js"; + +var x0 = Infinity, + y0 = x0, + x1 = -x0, + y1 = x1; + +var boundsStream = { + point: boundsPoint, + lineStart: noop, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop, + result: function() { + var bounds = [[x0, y0], [x1, y1]]; + x1 = y1 = -(y0 = x0 = Infinity); + return bounds; + } +}; + +function boundsPoint(x, y) { + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; +} + +export default boundsStream; diff --git a/node_modules/d3-geo/src/path/centroid.js b/node_modules/d3-geo/src/path/centroid.js new file mode 100644 index 00000000..852ef767 --- /dev/null +++ b/node_modules/d3-geo/src/path/centroid.js @@ -0,0 +1,100 @@ +import {sqrt} from "../math.js"; + +// TODO Enforce positive area for exterior, negative area for interior? + +var X0 = 0, + Y0 = 0, + Z0 = 0, + X1 = 0, + Y1 = 0, + Z1 = 0, + X2 = 0, + Y2 = 0, + Z2 = 0, + x00, + y00, + x0, + y0; + +var centroidStream = { + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function() { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function() { + centroidStream.point = centroidPoint; + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + }, + result: function() { + var centroid = Z2 ? [X2 / Z2, Y2 / Z2] + : Z1 ? [X1 / Z1, Y1 / Z1] + : Z0 ? [X0 / Z0, Y0 / Z0] + : [NaN, NaN]; + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; + return centroid; + } +}; + +function centroidPoint(x, y) { + X0 += x; + Y0 += y; + ++Z0; +} + +function centroidLineStart() { + centroidStream.point = centroidPointFirstLine; +} + +function centroidPointFirstLine(x, y) { + centroidStream.point = centroidPointLine; + centroidPoint(x0 = x, y0 = y); +} + +function centroidPointLine(x, y) { + var dx = x - x0, dy = y - y0, z = sqrt(dx * dx + dy * dy); + X1 += z * (x0 + x) / 2; + Y1 += z * (y0 + y) / 2; + Z1 += z; + centroidPoint(x0 = x, y0 = y); +} + +function centroidLineEnd() { + centroidStream.point = centroidPoint; +} + +function centroidRingStart() { + centroidStream.point = centroidPointFirstRing; +} + +function centroidRingEnd() { + centroidPointRing(x00, y00); +} + +function centroidPointFirstRing(x, y) { + centroidStream.point = centroidPointRing; + centroidPoint(x00 = x0 = x, y00 = y0 = y); +} + +function centroidPointRing(x, y) { + var dx = x - x0, + dy = y - y0, + z = sqrt(dx * dx + dy * dy); + + X1 += z * (x0 + x) / 2; + Y1 += z * (y0 + y) / 2; + Z1 += z; + + z = y0 * x - x0 * y; + X2 += z * (x0 + x); + Y2 += z * (y0 + y); + Z2 += z * 3; + centroidPoint(x0 = x, y0 = y); +} + +export default centroidStream; diff --git a/node_modules/d3-geo/src/path/context.js b/node_modules/d3-geo/src/path/context.js new file mode 100644 index 00000000..5137fc93 --- /dev/null +++ b/node_modules/d3-geo/src/path/context.js @@ -0,0 +1,45 @@ +import {tau} from "../math.js"; +import noop from "../noop.js"; + +export default function PathContext(context) { + this._context = context; +} + +PathContext.prototype = { + _radius: 4.5, + pointRadius: function(_) { + return this._radius = _, this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: { + this._context.lineTo(x, y); + break; + } + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau); + break; + } + } + }, + result: noop +}; diff --git a/node_modules/d3-geo/src/path/index.js b/node_modules/d3-geo/src/path/index.js new file mode 100644 index 00000000..45da3058 --- /dev/null +++ b/node_modules/d3-geo/src/path/index.js @@ -0,0 +1,61 @@ +import identity from "../identity.js"; +import stream from "../stream.js"; +import pathArea from "./area.js"; +import pathBounds from "./bounds.js"; +import pathCentroid from "./centroid.js"; +import PathContext from "./context.js"; +import pathMeasure from "./measure.js"; +import PathString from "./string.js"; + +export default function(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; + + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + stream(object, projectionStream(contextStream)); + } + return contextStream.result(); + } + + path.area = function(object) { + stream(object, projectionStream(pathArea)); + return pathArea.result(); + }; + + path.measure = function(object) { + stream(object, projectionStream(pathMeasure)); + return pathMeasure.result(); + }; + + path.bounds = function(object) { + stream(object, projectionStream(pathBounds)); + return pathBounds.result(); + }; + + path.centroid = function(object) { + stream(object, projectionStream(pathCentroid)); + return pathCentroid.result(); + }; + + path.projection = function(_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection; + }; + + path.context = function(_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; + + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + + return path.projection(projection).context(context); +} diff --git a/node_modules/d3-geo/src/path/measure.js b/node_modules/d3-geo/src/path/measure.js new file mode 100644 index 00000000..ad4177a7 --- /dev/null +++ b/node_modules/d3-geo/src/path/measure.js @@ -0,0 +1,45 @@ +import {Adder} from "d3-array"; +import {sqrt} from "../math.js"; +import noop from "../noop.js"; + +var lengthSum = new Adder(), + lengthRing, + x00, + y00, + x0, + y0; + +var lengthStream = { + point: noop, + lineStart: function() { + lengthStream.point = lengthPointFirst; + }, + lineEnd: function() { + if (lengthRing) lengthPoint(x00, y00); + lengthStream.point = noop; + }, + polygonStart: function() { + lengthRing = true; + }, + polygonEnd: function() { + lengthRing = null; + }, + result: function() { + var length = +lengthSum; + lengthSum = new Adder(); + return length; + } +}; + +function lengthPointFirst(x, y) { + lengthStream.point = lengthPoint; + x00 = x0 = x, y00 = y0 = y; +} + +function lengthPoint(x, y) { + x0 -= x, y0 -= y; + lengthSum.add(sqrt(x0 * x0 + y0 * y0)); + x0 = x, y0 = y; +} + +export default lengthStream; diff --git a/node_modules/d3-geo/src/path/string.js b/node_modules/d3-geo/src/path/string.js new file mode 100644 index 00000000..02e57b0a --- /dev/null +++ b/node_modules/d3-geo/src/path/string.js @@ -0,0 +1,59 @@ +export default function PathString() { + this._string = []; +} + +PathString.prototype = { + _radius: 4.5, + _circle: circle(4.5), + pointRadius: function(_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + if (this._circle == null) this._circle = circle(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function() { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } +}; + +function circle(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; +} diff --git a/node_modules/d3-geo/src/pointEqual.js b/node_modules/d3-geo/src/pointEqual.js new file mode 100644 index 00000000..d25aa115 --- /dev/null +++ b/node_modules/d3-geo/src/pointEqual.js @@ -0,0 +1,5 @@ +import {abs, epsilon} from "./math.js"; + +export default function(a, b) { + return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon; +} diff --git a/node_modules/d3-geo/src/polygonContains.js b/node_modules/d3-geo/src/polygonContains.js new file mode 100644 index 00000000..117d200f --- /dev/null +++ b/node_modules/d3-geo/src/polygonContains.js @@ -0,0 +1,77 @@ +import {Adder} from "d3-array"; +import {cartesian, cartesianCross, cartesianNormalizeInPlace} from "./cartesian.js"; +import {abs, asin, atan2, cos, epsilon, epsilon2, halfPi, pi, quarterPi, sign, sin, tau} from "./math.js"; + +function longitude(point) { + if (abs(point[0]) <= pi) + return point[0]; + else + return sign(point[0]) * ((abs(point[0]) + pi) % tau - pi); +} + +export default function(polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin(phi), + normal = [sin(lambda), -cos(lambda), 0], + angle = 0, + winding = 0; + + var sum = new Adder(); + + if (sinPhi === 1) phi = halfPi + epsilon; + else if (sinPhi === -1) phi = -halfPi - epsilon; + + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin(phi0), + cosPhi0 = cos(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin(phi1), + cosPhi1 = cos(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi, + k = sinPhi0 * sinPhi1; + + sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta))); + angle += antimeridian ? delta + sign * tau : delta; + + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } + + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. + + return (angle < -epsilon || angle < epsilon && sum < -epsilon2) ^ (winding & 1); +} diff --git a/node_modules/d3-geo/src/projection/albers.js b/node_modules/d3-geo/src/projection/albers.js new file mode 100644 index 00000000..180425dc --- /dev/null +++ b/node_modules/d3-geo/src/projection/albers.js @@ -0,0 +1,10 @@ +import conicEqualArea from "./conicEqualArea.js"; + +export default function() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); +} diff --git a/node_modules/d3-geo/src/projection/albersUsa.js b/node_modules/d3-geo/src/projection/albersUsa.js new file mode 100644 index 00000000..fd295ed4 --- /dev/null +++ b/node_modules/d3-geo/src/projection/albersUsa.js @@ -0,0 +1,111 @@ +import {epsilon} from "../math.js"; +import albers from "./albers.js"; +import conicEqualArea from "./conicEqualArea.js"; +import {fitExtent, fitSize, fitWidth, fitHeight} from "./fit.js"; + +// The projections must have mutually exclusive clip regions on the sphere, +// as this will avoid emitting interleaving lines and polygons. +function multiplex(streams) { + var n = streams.length; + return { + point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); }, + sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); }, + lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); }, + lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); }, + polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); }, + polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); } + }; +} + +// A composite projection for the United States, configured by default for +// 960×500. The projection also works quite well at 960×600 if you change the +// scale to 1285 and adjust the translate accordingly. The set of standard +// parallels for each region comes from USGS, which is published here: +// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers +export default function() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = {point: function(x, y) { point = [x, y]; }}; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); + } + + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); + }; + + albersUsa.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; + + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; + + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon, y + 0.120 * k + epsilon], [x - 0.214 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon, y + 0.166 * k + epsilon], [x - 0.115 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function(extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function(size, object) { + return fitSize(albersUsa, size, object); + }; + + albersUsa.fitWidth = function(width, object) { + return fitWidth(albersUsa, width, object); + }; + + albersUsa.fitHeight = function(height, object) { + return fitHeight(albersUsa, height, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); +} diff --git a/node_modules/d3-geo/src/projection/azimuthal.js b/node_modules/d3-geo/src/projection/azimuthal.js new file mode 100644 index 00000000..22dffe7c --- /dev/null +++ b/node_modules/d3-geo/src/projection/azimuthal.js @@ -0,0 +1,27 @@ +import {asin, atan2, cos, sin, sqrt} from "../math.js"; + +export function azimuthalRaw(scale) { + return function(x, y) { + var cx = cos(x), + cy = cos(y), + k = scale(cx * cy); + if (k === Infinity) return [2, 0]; + return [ + k * cy * sin(x), + k * sin(y) + ]; + } +} + +export function azimuthalInvert(angle) { + return function(x, y) { + var z = sqrt(x * x + y * y), + c = angle(z), + sc = sin(c), + cc = cos(c); + return [ + atan2(x * sc, z * cc), + asin(z && y * sc / z) + ]; + } +} diff --git a/node_modules/d3-geo/src/projection/azimuthalEqualArea.js b/node_modules/d3-geo/src/projection/azimuthalEqualArea.js new file mode 100644 index 00000000..795d4c72 --- /dev/null +++ b/node_modules/d3-geo/src/projection/azimuthalEqualArea.js @@ -0,0 +1,17 @@ +import {asin, sqrt} from "../math.js"; +import {azimuthalRaw, azimuthalInvert} from "./azimuthal.js"; +import projection from "./index.js"; + +export var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { + return sqrt(2 / (1 + cxcy)); +}); + +azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) { + return 2 * asin(z / 2); +}); + +export default function() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); +} diff --git a/node_modules/d3-geo/src/projection/azimuthalEquidistant.js b/node_modules/d3-geo/src/projection/azimuthalEquidistant.js new file mode 100644 index 00000000..9b89eb9e --- /dev/null +++ b/node_modules/d3-geo/src/projection/azimuthalEquidistant.js @@ -0,0 +1,17 @@ +import {acos, sin} from "../math.js"; +import {azimuthalRaw, azimuthalInvert} from "./azimuthal.js"; +import projection from "./index.js"; + +export var azimuthalEquidistantRaw = azimuthalRaw(function(c) { + return (c = acos(c)) && c / sin(c); +}); + +azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) { + return z; +}); + +export default function() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); +} diff --git a/node_modules/d3-geo/src/projection/conic.js b/node_modules/d3-geo/src/projection/conic.js new file mode 100644 index 00000000..81c5744b --- /dev/null +++ b/node_modules/d3-geo/src/projection/conic.js @@ -0,0 +1,15 @@ +import {degrees, pi, radians} from "../math.js"; +import {projectionMutator} from "./index.js"; + +export function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function(_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees]; + }; + + return p; +} diff --git a/node_modules/d3-geo/src/projection/conicConformal.js b/node_modules/d3-geo/src/projection/conicConformal.js new file mode 100644 index 00000000..adf73da2 --- /dev/null +++ b/node_modules/d3-geo/src/projection/conicConformal.js @@ -0,0 +1,38 @@ +import {abs, atan, atan2, cos, epsilon, halfPi, log, pi, pow, sign, sin, sqrt, tan} from "../math.js"; +import {conicProjection} from "./conic.js"; +import {mercatorRaw} from "./mercator.js"; + +function tany(y) { + return tan((halfPi + y) / 2); +} + +export function conicConformalRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)), + f = cy0 * pow(tany(y0), n) / n; + + if (!n) return mercatorRaw; + + function project(x, y) { + if (f > 0) { if (y < -halfPi + epsilon) y = -halfPi + epsilon; } + else { if (y > halfPi - epsilon) y = halfPi - epsilon; } + var r = f / pow(tany(y), n); + return [r * sin(n * x), f - r * cos(n * x)]; + } + + project.invert = function(x, y) { + var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy), + l = atan2(x, abs(fy)) * sign(fy); + if (fy * n < 0) + l -= pi * sign(x) * sign(fy); + return [l / n, 2 * atan(pow(f / r, 1 / n)) - halfPi]; + }; + + return project; +} + +export default function() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); +} diff --git a/node_modules/d3-geo/src/projection/conicEqualArea.js b/node_modules/d3-geo/src/projection/conicEqualArea.js new file mode 100644 index 00000000..b4238e47 --- /dev/null +++ b/node_modules/d3-geo/src/projection/conicEqualArea.js @@ -0,0 +1,33 @@ +import {abs, asin, atan2, cos, epsilon, pi, sign, sin, sqrt} from "../math.js"; +import {conicProjection} from "./conic.js"; +import {cylindricalEqualAreaRaw} from "./cylindricalEqualArea.js"; + +export function conicEqualAreaRaw(y0, y1) { + var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; + + function project(x, y) { + var r = sqrt(c - 2 * n * sin(y)) / n; + return [r * sin(x *= n), r0 - r * cos(x)]; + } + + project.invert = function(x, y) { + var r0y = r0 - y, + l = atan2(x, abs(r0y)) * sign(r0y); + if (r0y * n < 0) + l -= pi * sign(x) * sign(r0y); + return [l / n, asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; +} + +export default function() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); +} diff --git a/node_modules/d3-geo/src/projection/conicEquidistant.js b/node_modules/d3-geo/src/projection/conicEquidistant.js new file mode 100644 index 00000000..796710e7 --- /dev/null +++ b/node_modules/d3-geo/src/projection/conicEquidistant.js @@ -0,0 +1,32 @@ +import {abs, atan2, cos, epsilon, pi, sign, sin, sqrt} from "../math.js"; +import {conicProjection} from "./conic.js"; +import {equirectangularRaw} from "./equirectangular.js"; + +export function conicEquidistantRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs(n) < epsilon) return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin(nx), g - gy * cos(nx)]; + } + + project.invert = function(x, y) { + var gy = g - y, + l = atan2(x, abs(gy)) * sign(gy); + if (gy * n < 0) + l -= pi * sign(x) * sign(gy); + return [l / n, g - sign(n) * sqrt(x * x + gy * gy)]; + }; + + return project; +} + +export default function() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); +} diff --git a/node_modules/d3-geo/src/projection/cylindricalEqualArea.js b/node_modules/d3-geo/src/projection/cylindricalEqualArea.js new file mode 100644 index 00000000..1d38b40c --- /dev/null +++ b/node_modules/d3-geo/src/projection/cylindricalEqualArea.js @@ -0,0 +1,15 @@ +import {asin, cos, sin} from "../math.js"; + +export function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin(phi) / cosPhi0]; + } + + forward.invert = function(x, y) { + return [x / cosPhi0, asin(y * cosPhi0)]; + }; + + return forward; +} diff --git a/node_modules/d3-geo/src/projection/equalEarth.js b/node_modules/d3-geo/src/projection/equalEarth.js new file mode 100644 index 00000000..dc5ce2cb --- /dev/null +++ b/node_modules/d3-geo/src/projection/equalEarth.js @@ -0,0 +1,36 @@ +import projection from "./index.js"; +import {abs, asin, cos, epsilon2, sin, sqrt} from "../math.js"; + +var A1 = 1.340264, + A2 = -0.081106, + A3 = 0.000893, + A4 = 0.003796, + M = sqrt(3) / 2, + iterations = 12; + +export function equalEarthRaw(lambda, phi) { + var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2; + return [ + lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), + l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) + ]; +} + +equalEarthRaw.invert = function(x, y) { + var l = y, l2 = l * l, l6 = l2 * l2 * l2; + for (var i = 0, delta, fy, fpy; i < iterations; ++i) { + fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; + fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); + l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; + if (abs(delta) < epsilon2) break; + } + return [ + M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l), + asin(sin(l) / M) + ]; +}; + +export default function() { + return projection(equalEarthRaw) + .scale(177.158); +} diff --git a/node_modules/d3-geo/src/projection/equirectangular.js b/node_modules/d3-geo/src/projection/equirectangular.js new file mode 100644 index 00000000..d47065c3 --- /dev/null +++ b/node_modules/d3-geo/src/projection/equirectangular.js @@ -0,0 +1,12 @@ +import projection from "./index.js"; + +export function equirectangularRaw(lambda, phi) { + return [lambda, phi]; +} + +equirectangularRaw.invert = equirectangularRaw; + +export default function() { + return projection(equirectangularRaw) + .scale(152.63); +} diff --git a/node_modules/d3-geo/src/projection/fit.js b/node_modules/d3-geo/src/projection/fit.js new file mode 100644 index 00000000..d496d0fb --- /dev/null +++ b/node_modules/d3-geo/src/projection/fit.js @@ -0,0 +1,47 @@ +import {default as geoStream} from "../stream.js"; +import boundsStream from "../path/bounds.js"; + +function fit(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) projection.clipExtent(null); + geoStream(object, projection.stream(boundsStream)); + fitBounds(boundsStream.result()); + if (clip != null) projection.clipExtent(clip); + return projection; +} + +export function fitExtent(projection, extent, object) { + return fit(projection, function(b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +export function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); +} + +export function fitWidth(projection, width, object) { + return fit(projection, function(b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +export function fitHeight(projection, height, object) { + return fit(projection, function(b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} diff --git a/node_modules/d3-geo/src/projection/gnomonic.js b/node_modules/d3-geo/src/projection/gnomonic.js new file mode 100644 index 00000000..5da1cc79 --- /dev/null +++ b/node_modules/d3-geo/src/projection/gnomonic.js @@ -0,0 +1,16 @@ +import {atan, cos, sin} from "../math.js"; +import {azimuthalInvert} from "./azimuthal.js"; +import projection from "./index.js"; + +export function gnomonicRaw(x, y) { + var cy = cos(y), k = cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; +} + +gnomonicRaw.invert = azimuthalInvert(atan); + +export default function() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); +} diff --git a/node_modules/d3-geo/src/projection/identity.js b/node_modules/d3-geo/src/projection/identity.js new file mode 100644 index 00000000..cc439d8c --- /dev/null +++ b/node_modules/d3-geo/src/projection/identity.js @@ -0,0 +1,85 @@ +import clipRectangle from "../clip/rectangle.js"; +import identity from "../identity.js"; +import {transformer} from "../transform.js"; +import {fitExtent, fitSize, fitWidth, fitHeight} from "./fit.js"; +import {cos, degrees, radians, sin} from "../math.js"; + +export default function() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, // scale, translate and reflect + alpha = 0, ca, sa, // angle + x0 = null, y0, x1, y1, // clip extent + kx = 1, ky = 1, + transform = transformer({ + point: function(x, y) { + var p = projection([x, y]) + this.stream.point(p[0], p[1]); + } + }), + postclip = identity, + cache, + cacheStream; + + function reset() { + kx = k * sx; + ky = k * sy; + cache = cacheStream = null; + return projection; + } + + function projection (p) { + var x = p[0] * kx, y = p[1] * ky; + if (alpha) { + var t = y * ca - x * sa; + x = x * ca + y * sa; + y = t; + } + return [x + tx, y + ty]; + } + projection.invert = function(p) { + var x = p[0] - tx, y = p[1] - ty; + if (alpha) { + var t = y * ca + x * sa; + x = x * ca - y * sa; + y = t; + } + return [x / kx, y / ky]; + }; + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }; + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + projection.scale = function(_) { + return arguments.length ? (k = +_, reset()) : k; + }; + projection.translate = function(_) { + return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; + } + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees; + }; + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; + }; + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; + }; + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + return projection; +} diff --git a/node_modules/d3-geo/src/projection/index.js b/node_modules/d3-geo/src/projection/index.js new file mode 100644 index 00000000..8ea64bc3 --- /dev/null +++ b/node_modules/d3-geo/src/projection/index.js @@ -0,0 +1,177 @@ +import clipAntimeridian from "../clip/antimeridian.js"; +import clipCircle from "../clip/circle.js"; +import clipRectangle from "../clip/rectangle.js"; +import compose from "../compose.js"; +import identity from "../identity.js"; +import {cos, degrees, radians, sin, sqrt} from "../math.js"; +import {rotateRadians} from "../rotation.js"; +import {transformer} from "../transform.js"; +import {fitExtent, fitSize, fitWidth, fitHeight} from "./fit.js"; +import resample from "./resample.js"; + +var transformRadians = transformer({ + point: function(x, y) { + this.stream.point(x * radians, y * radians); + } +}); + +function transformRotate(rotate) { + return transformer({ + point: function(x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); + } + }); +} + +function scaleTranslate(k, dx, dy, sx, sy) { + function transform(x, y) { + x *= sx; y *= sy; + return [dx + k * x, dy - k * y]; + } + transform.invert = function(x, y) { + return [(x - dx) / k * sx, (dy - y) / k * sy]; + }; + return transform; +} + +function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { + if (!alpha) return scaleTranslate(k, dx, dy, sx, sy); + var cosAlpha = cos(alpha), + sinAlpha = sin(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; + function transform(x, y) { + x *= sx; y *= sy; + return [a * x - b * y + dx, dy - b * x - a * y]; + } + transform.invert = function(x, y) { + return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; + }; + return transform; +} + +export default function projection(project) { + return projectionMutator(function() { return project; })(); +} + +export function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate + alpha = 0, // post-rotate angle + sx = 1, // reflectX + sy = 1, // reflectX + theta = null, preclip = clipAntimeridian, // pre-clip angle + x0 = null, y0, x1, y1, postclip = identity, // post-clip extent + delta2 = 0.5, // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; + + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); + } + + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees, point[1] * degrees]; + } + + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; + + projection.preclip = function(_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; + + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + + projection.clipAngle = function(_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; + }; + + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + projection.scale = function(_) { + return arguments.length ? (k = +_, recenter()) : k; + }; + + projection.translate = function(_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; + + projection.center = function(_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; + }; + + projection.rotate = function(_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; + }; + + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; + }; + + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; + }; + + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; + }; + + projection.precision = function(_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + }; + + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), + transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + return reset(); + } + + function reset() { + cache = cacheStream = null; + return projection; + } + + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); + }; +} diff --git a/node_modules/d3-geo/src/projection/mercator.js b/node_modules/d3-geo/src/projection/mercator.js new file mode 100644 index 00000000..be975a9d --- /dev/null +++ b/node_modules/d3-geo/src/projection/mercator.js @@ -0,0 +1,52 @@ +import {atan, exp, halfPi, log, pi, tan, tau} from "../math.js"; +import rotation from "../rotation.js"; +import projection from "./index.js"; + +export function mercatorRaw(lambda, phi) { + return [lambda, log(tan((halfPi + phi) / 2))]; +} + +mercatorRaw.invert = function(x, y) { + return [x, 2 * atan(exp(y)) - halfPi]; +}; + +export default function() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau); +} + +export function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent + + m.scale = function(_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; + + m.translate = function(_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function(_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function(_) { + return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + function reclip() { + var k = pi * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } + + return reclip(); +} diff --git a/node_modules/d3-geo/src/projection/naturalEarth1.js b/node_modules/d3-geo/src/projection/naturalEarth1.js new file mode 100644 index 00000000..fe5ed310 --- /dev/null +++ b/node_modules/d3-geo/src/projection/naturalEarth1.js @@ -0,0 +1,28 @@ +import projection from "./index.js"; +import {abs, epsilon} from "../math.js"; + +export function naturalEarth1Raw(lambda, phi) { + var phi2 = phi * phi, phi4 = phi2 * phi2; + return [ + lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), + phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) + ]; +} + +naturalEarth1Raw.invert = function(x, y) { + var phi = y, i = 25, delta; + do { + var phi2 = phi * phi, phi4 = phi2 * phi2; + phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + } while (abs(delta) > epsilon && --i > 0); + return [ + x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), + phi + ]; +}; + +export default function() { + return projection(naturalEarth1Raw) + .scale(175.295); +} diff --git a/node_modules/d3-geo/src/projection/orthographic.js b/node_modules/d3-geo/src/projection/orthographic.js new file mode 100644 index 00000000..b5a8351f --- /dev/null +++ b/node_modules/d3-geo/src/projection/orthographic.js @@ -0,0 +1,15 @@ +import {asin, cos, epsilon, sin} from "../math.js"; +import {azimuthalInvert} from "./azimuthal.js"; +import projection from "./index.js"; + +export function orthographicRaw(x, y) { + return [cos(y) * sin(x), sin(y)]; +} + +orthographicRaw.invert = azimuthalInvert(asin); + +export default function() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon); +} diff --git a/node_modules/d3-geo/src/projection/resample.js b/node_modules/d3-geo/src/projection/resample.js new file mode 100644 index 00000000..268fc442 --- /dev/null +++ b/node_modules/d3-geo/src/projection/resample.js @@ -0,0 +1,102 @@ +import {cartesian} from "../cartesian.js"; +import {abs, asin, atan2, cos, epsilon, radians, sqrt} from "../math.js"; +import {transformer} from "../transform.js"; + +var maxDepth = 16, // maximum depth of subdivision + cosMinDistance = cos(30 * radians); // cos(minimum angular distance) + +export default function(project, delta2) { + return +delta2 ? resample(project, delta2) : resampleNone(project); +} + +function resampleNone(project) { + return transformer({ + point: function(x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); + } + }); +} + +function resample(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt(a * a + b * b + c * c), + phi2 = asin(c /= m), + lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); + } + } + } + return function(stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point + + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; }, + polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } + + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } + + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } + + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } + + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } + + return resampleStream; + }; +} diff --git a/node_modules/d3-geo/src/projection/stereographic.js b/node_modules/d3-geo/src/projection/stereographic.js new file mode 100644 index 00000000..5f9694aa --- /dev/null +++ b/node_modules/d3-geo/src/projection/stereographic.js @@ -0,0 +1,18 @@ +import {atan, cos, sin} from "../math.js"; +import {azimuthalInvert} from "./azimuthal.js"; +import projection from "./index.js"; + +export function stereographicRaw(x, y) { + var cy = cos(y), k = 1 + cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; +} + +stereographicRaw.invert = azimuthalInvert(function(z) { + return 2 * atan(z); +}); + +export default function() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); +} diff --git a/node_modules/d3-geo/src/projection/transverseMercator.js b/node_modules/d3-geo/src/projection/transverseMercator.js new file mode 100644 index 00000000..bedd1c36 --- /dev/null +++ b/node_modules/d3-geo/src/projection/transverseMercator.js @@ -0,0 +1,27 @@ +import {atan, exp, halfPi, log, tan} from "../math.js"; +import {mercatorProjection} from "./mercator.js"; + +export function transverseMercatorRaw(lambda, phi) { + return [log(tan((halfPi + phi) / 2)), -lambda]; +} + +transverseMercatorRaw.invert = function(x, y) { + return [-y, 2 * atan(exp(x)) - halfPi]; +}; + +export default function() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; + + m.center = function(_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function(_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); +} diff --git a/node_modules/d3-geo/src/rotation.js b/node_modules/d3-geo/src/rotation.js new file mode 100644 index 00000000..4e2def36 --- /dev/null +++ b/node_modules/d3-geo/src/rotation.js @@ -0,0 +1,76 @@ +import compose from "./compose.js"; +import {abs, asin, atan2, cos, degrees, pi, radians, sin, tau} from "./math.js"; + +function rotationIdentity(lambda, phi) { + return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi]; +} + +rotationIdentity.invert = rotationIdentity; + +export function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); +} + +function forwardRotationLambda(deltaLambda) { + return function(lambda, phi) { + return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi]; + }; +} + +function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; +} + +function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos(deltaPhi), + sinDeltaPhi = sin(deltaPhi), + cosDeltaGamma = cos(deltaGamma), + sinDeltaGamma = sin(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function(lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin(k * cosDeltaPhi - x * sinDeltaPhi) + ]; + }; + + return rotation; +} + +export default function(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + } + + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + }; + + return forward; +} diff --git a/node_modules/d3-geo/src/stream.js b/node_modules/d3-geo/src/stream.js new file mode 100644 index 00000000..ee994ae4 --- /dev/null +++ b/node_modules/d3-geo/src/stream.js @@ -0,0 +1,69 @@ +function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } +} + +var streamObjectType = { + Feature: function(object, stream) { + streamGeometry(object.geometry, stream); + }, + FeatureCollection: function(object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) streamGeometry(features[i].geometry, stream); + } +}; + +var streamGeometryType = { + Sphere: function(object, stream) { + stream.sphere(); + }, + Point: function(object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); + }, + LineString: function(object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamLine(coordinates[i], stream, 0); + }, + Polygon: function(object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamPolygon(coordinates[i], stream); + }, + GeometryCollection: function(object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) streamGeometry(geometries[i], stream); + } +}; + +function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); +} + +function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); +} + +export default function(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } +} diff --git a/node_modules/d3-geo/src/transform.js b/node_modules/d3-geo/src/transform.js new file mode 100644 index 00000000..a954bc5a --- /dev/null +++ b/node_modules/d3-geo/src/transform.js @@ -0,0 +1,26 @@ +export default function(methods) { + return { + stream: transformer(methods) + }; +} + +export function transformer(methods) { + return function(stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; + }; +} + +function TransformStream() {} + +TransformStream.prototype = { + constructor: TransformStream, + point: function(x, y) { this.stream.point(x, y); }, + sphere: function() { this.stream.sphere(); }, + lineStart: function() { this.stream.lineStart(); }, + lineEnd: function() { this.stream.lineEnd(); }, + polygonStart: function() { this.stream.polygonStart(); }, + polygonEnd: function() { this.stream.polygonEnd(); } +}; diff --git a/node_modules/d3-hierarchy/LICENSE b/node_modules/d3-hierarchy/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-hierarchy/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-hierarchy/README.md b/node_modules/d3-hierarchy/README.md new file mode 100644 index 00000000..1366d5e0 --- /dev/null +++ b/node_modules/d3-hierarchy/README.md @@ -0,0 +1,572 @@ +# d3-hierarchy + +Many datasets are intrinsically hierarchical. Consider [geographic entities](https://www.census.gov/programs-surveys/geography/guidance/hierarchy.html), such as census blocks, census tracts, counties and states; the command structure of businesses and governments; file systems and software packages. And even non-hierarchical data may be arranged empirically into a hierarchy, as with [*k*-means clustering](https://en.wikipedia.org/wiki/K-means_clustering) or [phylogenetic trees](https://observablehq.com/@mbostock/tree-of-life). + +This module implements several popular techniques for visualizing hierarchical data: + +**Node-link diagrams** show topology using discrete marks for nodes and links, such as a circle for each node and a line connecting each parent and child. The [“tidy†tree](#tree) is delightfully compact, while the [dendrogram](#cluster) places leaves at the same level. (These have both polar and Cartesian forms.) [Indented trees](https://observablehq.com/@d3/indented-tree) are useful for interactive browsing. + +**Adjacency diagrams** show topology through the relative placement of nodes. They may also encode a quantitative dimension in the area of each node, for example to show revenue or file size. The [“icicle†diagram](#partition) uses rectangles, while the “sunburst†uses annular segments. + +**Enclosure diagrams** also use an area encoding, but show topology through containment. A [treemap](#treemap) recursively subdivides area into rectangles. [Circle-packing](#pack) tightly nests circles; this is not as space-efficient as a treemap, but perhaps more readily shows topology. + +A good hierarchical visualization facilitates rapid multiscale inference: micro-observations of individual elements and macro-observations of large groups. + +## Installing + +If you use NPM, `npm install d3-hierarchy`. Otherwise, download the [latest release](https://github.com/d3/d3-hierarchy/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-hierarchy.v1.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +## API Reference + +* [Hierarchy](#hierarchy) ([Stratify](#stratify)) +* [Cluster](#cluster) +* [Tree](#tree) +* [Treemap](#treemap) ([Treemap Tiling](#treemap-tiling)) +* [Partition](#partition) +* [Pack](#pack) + +### Hierarchy + +Before you can compute a hierarchical layout, you need a root node. If your data is already in a hierarchical format, such as JSON, you can pass it directly to [d3.hierarchy](#hierarchy); otherwise, you can rearrange tabular data, such as comma-separated values (CSV), into a hierarchy using [d3.stratify](#stratify). + +# d3.hierarchy(data[, children]) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/index.js), [Examples](https://observablehq.com/@d3/d3-hierarchy) + +Constructs a root node from the specified hierarchical *data*. The specified *data* must be an object representing the root node. For example: + +```json +{ + "name": "Eve", + "children": [ + { + "name": "Cain" + }, + { + "name": "Seth", + "children": [ + { + "name": "Enos" + }, + { + "name": "Noam" + } + ] + }, + { + "name": "Abel" + }, + { + "name": "Awan", + "children": [ + { + "name": "Enoch" + } + ] + }, + { + "name": "Azura" + } + ] +} +``` + +The specified *children* accessor function is invoked for each datum, starting with the root *data*, and must return an iterable of data representing the children, if any. If the children accessor is not specified, it defaults to: + +```js +function children(d) { + return d.children; +} +``` + +If *data* is a Map, it is implicitly converted to the entry [undefined, *data*], and the children accessor instead defaults to: + +```js +function children(d) { + return Array.isArray(d) ? d[1] : null; +} +``` + +This allows you to pass the result of [d3.group](https://github.com/d3/d3-array/blob/master/README.md#group) or [d3.rollup](https://github.com/d3/d3-array/blob/master/README.md#rollup) to d3.hierarchy. + +The returned node and each descendant has the following properties: + +* *node*.data - the associated data, as specified to the [constructor](#hierarchy). +* *node*.depth - zero for the root node, and increasing by one for each descendant generation. +* *node*.height - zero for leaf nodes, and the greatest distance from any descendant leaf for internal nodes. +* *node*.parent - the parent node, or null for the root node. +* *node*.children - an array of child nodes, if any; undefined for leaf nodes. +* *node*.value - the summed value of the node and its [descendants](#node_descendants); optional, see [*node*.sum](#node_sum) and [*node*.count](#node_count). + +This method can also be used to test if a node is an `instanceof d3.hierarchy` and to extend the node prototype. + +# node.ancestors() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/ancestors.js), [Examples](https://observablehq.com/@d3/d3-hierarchy) + +Returns the array of ancestors nodes, starting with this node, then followed by each parent up to the root. + +# node.descendants() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/descendants.js), [Examples](https://observablehq.com/@d3/d3-hierarchy) + +Returns the array of descendant nodes, starting with this node, then followed by each child in topological order. + +# node.leaves() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/leaves.js), [Examples](https://observablehq.com/@d3/d3-hierarchy) + +Returns the array of leaf nodes in traversal order; leaves are nodes with no children. + +# node.find(filter) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/find.js) + +Returns the first node in the hierarchy from this *node* for which the specified *filter* returns a truthy value. undefined if no such node is found. + +# node.path(target) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/path.js), [Examples](https://observablehq.com/@d3/d3-hierarchy) + +Returns the shortest path through the hierarchy from this *node* to the specified *target* node. The path starts at this *node*, ascends to the least common ancestor of this *node* and the *target* node, and then descends to the *target* node. This is particularly useful for [hierarchical edge bundling](https://observablehq.com/@d3/hierarchical-edge-bundling). + +# node.links() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/links.js), [Examples](https://observablehq.com/@d3/d3-hierarchy) + +Returns an array of links for this *node* and its descendants, where each *link* is an object that defines source and target properties. The source of each link is the parent node, and the target is a child node. + +# node.sum(value) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/sum.js), [Examples](https://observablehq.com/@d3/visiting-a-d3-hierarchy) + +Evaluates the specified *value* function for this *node* and each descendant in [post-order traversal](#node_eachAfter), and returns this *node*. The *node*.value property of each node is set to the numeric value returned by the specified function plus the combined value of all children. The function is passed the node’s data, and must return a non-negative number. The *value* accessor is evaluated for *node* and every descendant, including internal nodes; if you only want leaf nodes to have internal value, then return zero for any node with children. [For example](https://observablehq.com/@d3/treemap-by-count), as an alternative to [*node*.count](#node_count): + +```js +root.sum(function(d) { return d.value ? 1 : 0; }); +``` + +You must call *node*.sum or [*node*.count](#node_count) before invoking a hierarchical layout that requires *node*.value, such as [d3.treemap](#treemap). Since the API supports [method chaining](https://en.wikipedia.org/wiki/Method_chaining), you can invoke *node*.sum and [*node*.sort](#node_sort) before computing the layout, and then subsequently generate an array of all [descendant nodes](#node_descendants) like so: + +```js +var treemap = d3.treemap() + .size([width, height]) + .padding(2); + +var nodes = treemap(root + .sum(function(d) { return d.value; }) + .sort(function(a, b) { return b.height - a.height || b.value - a.value; })) + .descendants(); +``` + +This example assumes that the node data has a value field. + +# node.count() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/count.js), [Examples](https://observablehq.com/@d3/visiting-a-d3-hierarchy) + +Computes the number of leaves under this *node* and assigns it to *node*.value, and similarly for every descendant of *node*. If this *node* is a leaf, its count is one. Returns this *node*. See also [*node*.sum](#node_sum). + +# node.sort(compare) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/sort.js), [Examples](https://observablehq.com/@d3/visiting-a-d3-hierarchy) + +Sorts the children of this *node*, if any, and each of this *node*’s descendants’ children, in [pre-order traversal](#node_eachBefore) using the specified *compare* function, and returns this *node*. The specified function is passed two nodes *a* and *b* to compare. If *a* should be before *b*, the function must return a value less than zero; if *b* should be before *a*, the function must return a value greater than zero; otherwise, the relative order of *a* and *b* are not specified. See [*array*.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) for more. + +Unlike [*node*.sum](#node_sum), the *compare* function is passed two [nodes](#hierarchy) rather than two nodes’ data. For example, if the data has a value property, this sorts nodes by the descending aggregate value of the node and all its descendants, as is recommended for [circle-packing](#pack): + +```js +root + .sum(function(d) { return d.value; }) + .sort(function(a, b) { return b.value - a.value; }); +`````` + +Similarly, to sort nodes by descending height (greatest distance from any descendant leaf) and then descending value, as is recommended for [treemaps](#treemap) and [icicles](#partition): + +```js +root + .sum(function(d) { return d.value; }) + .sort(function(a, b) { return b.height - a.height || b.value - a.value; }); +``` + +To sort nodes by descending height and then ascending id, as is recommended for [trees](#tree) and [dendrograms](#cluster): + +```js +root + .sum(function(d) { return d.value; }) + .sort(function(a, b) { return b.height - a.height || a.id.localeCompare(b.id); }); +``` + +You must call *node*.sort before invoking a hierarchical layout if you want the new sort order to affect the layout; see [*node*.sum](#node_sum) for an example. + +# node[Symbol.iterator]() [<>](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/iterator.js "Source") + +Returns an iterator over the *node*’s descendants in breadth-first order. For example: + +```js +for (const descendant of node) { + console.log(descendant); +} +``` + +# node.each(function[, that]) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/each.js), [Examples](https://observablehq.com/@d3/visiting-a-d3-hierarchy) + +Invokes the specified *function* for *node* and each descendant in [breadth-first order](https://en.wikipedia.org/wiki/Breadth-first_search), such that a given *node* is only visited if all nodes of lesser depth have already been visited, as well as all preceding nodes of the same depth. The specified function is passed the current *descendant*, the zero-based traversal *index*, and this *node*. If *that* is specified, it is the this context of the callback. + +# node.eachAfter(function[, that]) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/eachAfter.js), [Examples](https://observablehq.com/@d3/visiting-a-d3-hierarchy) + +Invokes the specified *function* for *node* and each descendant in [post-order traversal](https://en.wikipedia.org/wiki/Tree_traversal#Post-order), such that a given *node* is only visited after all of its descendants have already been visited. The specified function is passed the current *descendant*, the zero-based traversal *index*, and this *node*. If *that* is specified, it is the this context of the callback. + +# node.eachBefore(function[, that]) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/eachBefore.js), [Examples](https://observablehq.com/@d3/visiting-a-d3-hierarchy) + +Invokes the specified *function* for *node* and each descendant in [pre-order traversal](https://en.wikipedia.org/wiki/Tree_traversal#Pre-order), such that a given *node* is only visited after all of its ancestors have already been visited. The specified function is passed the current *descendant*, the zero-based traversal *index*, and this *node*. If *that* is specified, it is the this context of the callback. + +# node.copy() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/hierarchy/index.js), [Examples](https://observablehq.com/@d3/d3-hierarchy) + +Return a deep copy of the subtree starting at this *node*. (The returned deep copy shares the same data, however.) The returned node is the root of a new tree; the returned node’s parent is always null and its depth is always zero. + +#### Stratify + +Consider the following table of relationships: + +Name | Parent +------|-------- +Eve | +Cain | Eve +Seth | Eve +Enos | Seth +Noam | Seth +Abel | Eve +Awan | Eve +Enoch | Awan +Azura | Eve + +These names are conveniently unique, so we can unambiguously represent the hierarchy as a CSV file: + +``` +name,parent +Eve, +Cain,Eve +Seth,Eve +Enos,Seth +Noam,Seth +Abel,Eve +Awan,Eve +Enoch,Awan +Azura,Eve +``` + +To parse the CSV using [d3.csvParse](https://github.com/d3/d3-dsv#csvParse): + +```js +var table = d3.csvParse(text); +``` + +This returns: + +```json +[ + {"name": "Eve", "parent": ""}, + {"name": "Cain", "parent": "Eve"}, + {"name": "Seth", "parent": "Eve"}, + {"name": "Enos", "parent": "Seth"}, + {"name": "Noam", "parent": "Seth"}, + {"name": "Abel", "parent": "Eve"}, + {"name": "Awan", "parent": "Eve"}, + {"name": "Enoch", "parent": "Awan"}, + {"name": "Azura", "parent": "Eve"} +] +``` + +To convert to a hierarchy: + +```js +var root = d3.stratify() + .id(function(d) { return d.name; }) + .parentId(function(d) { return d.parent; }) + (table); +``` + +This returns: + +[Stratify](https://runkit.com/mbostock/56fed33d8630b01300f72daa) + +This hierarchy can now be passed to a hierarchical layout, such as [d3.tree](#_tree), for visualization. + +# d3.stratify() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/stratify.js), [Examples](https://observablehq.com/@d3/d3-stratify) + +Constructs a new stratify operator with the default settings. + +# stratify(data) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/stratify.js), [Examples](https://observablehq.com/@d3/d3-stratify) + +Generates a new hierarchy from the specified tabular *data*. + +# stratify.id([id]) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/stratify.js), [Examples](https://observablehq.com/@d3/d3-stratify) + +If *id* is specified, sets the id accessor to the given function and returns this stratify operator. Otherwise, returns the current id accessor, which defaults to: + +```js +function id(d) { + return d.id; +} +``` + +The id accessor is invoked for each element in the input data passed to the [stratify operator](#_stratify), being passed the current datum (*d*) and the current index (*i*). The returned string is then used to identify the node’s relationships in conjunction with the [parent id](#stratify_parentId). For leaf nodes, the id may be undefined; otherwise, the id must be unique. (Null and the empty string are equivalent to undefined.) + +# stratify.parentId([parentId]) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/stratify.js), [Examples](https://observablehq.com/@d3/d3-stratify) + +If *parentId* is specified, sets the parent id accessor to the given function and returns this stratify operator. Otherwise, returns the current parent id accessor, which defaults to: + +```js +function parentId(d) { + return d.parentId; +} +``` + +The parent id accessor is invoked for each element in the input data passed to the [stratify operator](#_stratify), being passed the current datum (*d*) and the current index (*i*). The returned string is then used to identify the node’s relationships in conjunction with the [id](#stratify_id). For the root node, the parent id should be undefined. (Null and the empty string are equivalent to undefined.) There must be exactly one root node in the input data, and no circular relationships. + +### Cluster + +[Dendrogram](https://observablehq.com/@d3/cluster-dendrogram) + +The **cluster layout** produces [dendrograms](http://en.wikipedia.org/wiki/Dendrogram): node-link diagrams that place leaf nodes of the tree at the same depth. Dendrograms are typically less compact than [tidy trees](#tree), but are useful when all the leaves should be at the same level, such as for hierarchical clustering or [phylogenetic tree diagrams](https://observablehq.com/@mbostock/tree-of-life). + +# d3.cluster() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/cluster.js), [Examples](https://observablehq.com/@d3/cluster-dendrogram) + +Creates a new cluster layout with default settings. + +# cluster(root) + +Lays out the specified *root* [hierarchy](#hierarchy), assigning the following properties on *root* and its descendants: + +* *node*.x - the *x*-coordinate of the node +* *node*.y - the *y*-coordinate of the node + +The coordinates *x* and *y* represent an arbitrary coordinate system; for example, you can treat *x* as an angle and *y* as a radius to produce a [radial layout](https://observablehq.com/@d3/radial-dendrogram). You may want to call [*root*.sort](#node_sort) before passing the hierarchy to the cluster layout. + +# cluster.size([size]) + +If *size* is specified, sets this cluster layout’s size to the specified two-element array of numbers [*width*, *height*] and returns this cluster layout. If *size* is not specified, returns the current layout size, which defaults to [1, 1]. A layout size of null indicates that a [node size](#cluster_nodeSize) will be used instead. The coordinates *x* and *y* represent an arbitrary coordinate system; for example, to produce a [radial layout](https://observablehq.com/@d3/radial-dendrogram), a size of [360, *radius*] corresponds to a breadth of 360° and a depth of *radius*. + +# cluster.nodeSize([size]) + +If *size* is specified, sets this cluster layout’s node size to the specified two-element array of numbers [*width*, *height*] and returns this cluster layout. If *size* is not specified, returns the current node size, which defaults to null. A node size of null indicates that a [layout size](#cluster_size) will be used instead. When a node size is specified, the root node is always positioned at ⟨0, 0⟩. + +# cluster.separation([separation]) + +If *separation* is specified, sets the separation accessor to the specified function and returns this cluster layout. If *separation* is not specified, returns the current separation accessor, which defaults to: + +```js +function separation(a, b) { + return a.parent == b.parent ? 1 : 2; +} +``` + +The separation accessor is used to separate neighboring leaves. The separation function is passed two leaves *a* and *b*, and must return the desired separation. The nodes are typically siblings, though the nodes may be more distantly related if the layout decides to place such nodes adjacent. + +### Tree + +[Tidy Tree](https://observablehq.com/@d3/tidy-tree) + +The **tree** layout produces tidy node-link diagrams of trees using the [Reingold–Tilford “tidy†algorithm](http://reingold.co/tidier-drawings.pdf), improved to run in linear time by [Buchheim *et al.*](http://dirk.jivas.de/papers/buchheim02improving.pdf) Tidy trees are typically more compact than [dendrograms](#cluster). + +# d3.tree() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/tree.js), [Examples](https://observablehq.com/@d3/tidy-tree) + +Creates a new tree layout with default settings. + +# tree(root) + +Lays out the specified *root* [hierarchy](#hierarchy), assigning the following properties on *root* and its descendants: + +* *node*.x - the *x*-coordinate of the node +* *node*.y - the *y*-coordinate of the node + +The coordinates *x* and *y* represent an arbitrary coordinate system; for example, you can treat *x* as an angle and *y* as a radius to produce a [radial layout](https://observablehq.com/@d3/radial-tidy-tree). You may want to call [*root*.sort](#node_sort) before passing the hierarchy to the tree layout. + +# tree.size([size]) + +If *size* is specified, sets this tree layout’s size to the specified two-element array of numbers [*width*, *height*] and returns this tree layout. If *size* is not specified, returns the current layout size, which defaults to [1, 1]. A layout size of null indicates that a [node size](#tree_nodeSize) will be used instead. The coordinates *x* and *y* represent an arbitrary coordinate system; for example, to produce a [radial layout](https://observablehq.com/@d3/radial-tidy-tree), a size of [360, *radius*] corresponds to a breadth of 360° and a depth of *radius*. + +# tree.nodeSize([size]) + +If *size* is specified, sets this tree layout’s node size to the specified two-element array of numbers [*width*, *height*] and returns this tree layout. If *size* is not specified, returns the current node size, which defaults to null. A node size of null indicates that a [layout size](#tree_size) will be used instead. When a node size is specified, the root node is always positioned at ⟨0, 0⟩. + +# tree.separation([separation]) + +If *separation* is specified, sets the separation accessor to the specified function and returns this tree layout. If *separation* is not specified, returns the current separation accessor, which defaults to: + +```js +function separation(a, b) { + return a.parent == b.parent ? 1 : 2; +} +``` + +A variation that is more appropriate for radial layouts reduces the separation gap proportionally to the radius: + +```js +function separation(a, b) { + return (a.parent == b.parent ? 1 : 2) / a.depth; +} +``` + +The separation accessor is used to separate neighboring nodes. The separation function is passed two nodes *a* and *b*, and must return the desired separation. The nodes are typically siblings, though the nodes may be more distantly related if the layout decides to place such nodes adjacent. + +### Treemap + +[Treemap](https://observablehq.com/@d3/treemap) + +Introduced by [Ben Shneiderman](http://www.cs.umd.edu/hcil/treemap-history/) in 1991, a **treemap** recursively subdivides area into rectangles according to each node’s associated value. D3’s treemap implementation supports an extensible [tiling method](#treemap_tile): the default [squarified](#treemapSquarify) method seeks to generate rectangles with a [golden](https://en.wikipedia.org/wiki/Golden_ratio) aspect ratio; this offers better readability and size estimation than [slice-and-dice](#treemapSliceDice), which simply alternates between horizontal and vertical subdivision by depth. + +# d3.treemap() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/treemap/index.js), [Examples](https://observablehq.com/@d3/treemap) + +Creates a new treemap layout with default settings. + +# treemap(root) + +Lays out the specified *root* [hierarchy](#hierarchy), assigning the following properties on *root* and its descendants: + +* *node*.x0 - the left edge of the rectangle +* *node*.y0 - the top edge of the rectangle +* *node*.x1 - the right edge of the rectangle +* *node*.y1 - the bottom edge of the rectangle + +You must call [*root*.sum](#node_sum) before passing the hierarchy to the treemap layout. You probably also want to call [*root*.sort](#node_sort) to order the hierarchy before computing the layout. + +# treemap.tile([tile]) + +If *tile* is specified, sets the [tiling method](#treemap-tiling) to the specified function and returns this treemap layout. If *tile* is not specified, returns the current tiling method, which defaults to [d3.treemapSquarify](#treemapSquarify) with the golden ratio. + +# treemap.size([size]) + +If *size* is specified, sets this treemap layout’s size to the specified two-element array of numbers [*width*, *height*] and returns this treemap layout. If *size* is not specified, returns the current size, which defaults to [1, 1]. + +# treemap.round([round]) + +If *round* is specified, enables or disables rounding according to the given boolean and returns this treemap layout. If *round* is not specified, returns the current rounding state, which defaults to false. + +# treemap.padding([padding]) + +If *padding* is specified, sets the [inner](#treemap_paddingInner) and [outer](#treemap_paddingOuter) padding to the specified number or function and returns this treemap layout. If *padding* is not specified, returns the current inner padding function. + +# treemap.paddingInner([padding]) + +If *padding* is specified, sets the inner padding to the specified number or function and returns this treemap layout. If *padding* is not specified, returns the current inner padding function, which defaults to the constant zero. If *padding* is a function, it is invoked for each node with children, being passed the current node. The inner padding is used to separate a node’s adjacent children. + +# treemap.paddingOuter([padding]) + +If *padding* is specified, sets the [top](#treemap_paddingTop), [right](#treemap_paddingRight), [bottom](#treemap_paddingBottom) and [left](#treemap_paddingLeft) padding to the specified number or function and returns this treemap layout. If *padding* is not specified, returns the current top padding function. + +# treemap.paddingTop([padding]) + +If *padding* is specified, sets the top padding to the specified number or function and returns this treemap layout. If *padding* is not specified, returns the current top padding function, which defaults to the constant zero. If *padding* is a function, it is invoked for each node with children, being passed the current node. The top padding is used to separate the top edge of a node from its children. + +# treemap.paddingRight([padding]) + +If *padding* is specified, sets the right padding to the specified number or function and returns this treemap layout. If *padding* is not specified, returns the current right padding function, which defaults to the constant zero. If *padding* is a function, it is invoked for each node with children, being passed the current node. The right padding is used to separate the right edge of a node from its children. + +# treemap.paddingBottom([padding]) + +If *padding* is specified, sets the bottom padding to the specified number or function and returns this treemap layout. If *padding* is not specified, returns the current bottom padding function, which defaults to the constant zero. If *padding* is a function, it is invoked for each node with children, being passed the current node. The bottom padding is used to separate the bottom edge of a node from its children. + +# treemap.paddingLeft([padding]) + +If *padding* is specified, sets the left padding to the specified number or function and returns this treemap layout. If *padding* is not specified, returns the current left padding function, which defaults to the constant zero. If *padding* is a function, it is invoked for each node with children, being passed the current node. The left padding is used to separate the left edge of a node from its children. + +#### Treemap Tiling + +Several built-in tiling methods are provided for use with [*treemap*.tile](#treemap_tile). + +# d3.treemapBinary(node, x0, y0, x1, y1) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/treemap/binary.js), [Examples](https://observablehq.com/@d3/treemap) + +Recursively partitions the specified *nodes* into an approximately-balanced binary tree, choosing horizontal partitioning for wide rectangles and vertical partitioning for tall rectangles. + +# d3.treemapDice(node, x0, y0, x1, y1) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/treemap/dice.js), [Examples](https://observablehq.com/@d3/treemap) + +Divides the rectangular area specified by *x0*, *y0*, *x1*, *y1* horizontally according the value of each of the specified *node*’s children. The children are positioned in order, starting with the left edge (*x0*) of the given rectangle. If the sum of the children’s values is less than the specified *node*’s value (*i.e.*, if the specified *node* has a non-zero internal value), the remaining empty space will be positioned on the right edge (*x1*) of the given rectangle. + +# d3.treemapSlice(node, x0, y0, x1, y1) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/treemap/slice.js), [Examples](https://observablehq.com/@d3/treemap) + +Divides the rectangular area specified by *x0*, *y0*, *x1*, *y1* vertically according the value of each of the specified *node*’s children. The children are positioned in order, starting with the top edge (*y0*) of the given rectangle. If the sum of the children’s values is less than the specified *node*’s value (*i.e.*, if the specified *node* has a non-zero internal value), the remaining empty space will be positioned on the bottom edge (*y1*) of the given rectangle. + +# d3.treemapSliceDice(node, x0, y0, x1, y1) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/treemap/sliceDice.js), [Examples](https://observablehq.com/@d3/treemap) + +If the specified *node* has odd depth, delegates to [treemapSlice](#treemapSlice); otherwise delegates to [treemapDice](#treemapDice). + +# d3.treemapSquarify(node, x0, y0, x1, y1) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/treemap/squarify.js), [Examples](https://observablehq.com/@d3/treemap) + +Implements the [squarified treemap](https://www.win.tue.nl/~vanwijk/stm.pdf) algorithm by Bruls *et al.*, which seeks to produce rectangles of a given [aspect ratio](#squarify_ratio). + +# d3.treemapResquarify(node, x0, y0, x1, y1) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/treemap/resquarify.js), [Examples](https://observablehq.com/@d3/animated-treemap) + +Like [d3.treemapSquarify](#treemapSquarify), except preserves the topology (node adjacencies) of the previous layout computed by d3.treemapResquarify, if there is one and it used the same [target aspect ratio](#squarify_ratio). This tiling method is good for animating changes to treemaps because it only changes node sizes and not their relative positions, thus avoiding distracting shuffling and occlusion. The downside of a stable update, however, is a suboptimal layout for subsequent updates: only the first layout uses the Bruls *et al.* squarified algorithm. + +# squarify.ratio(ratio) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/treemap/squarify.js), [Examples](https://observablehq.com/@d3/treemap) + +Specifies the desired aspect ratio of the generated rectangles. The *ratio* must be specified as a number greater than or equal to one. Note that the orientation of the generated rectangles (tall or wide) is not implied by the ratio; for example, a ratio of two will attempt to produce a mixture of rectangles whose *width*:*height* ratio is either 2:1 or 1:2. (However, you can approximately achieve this result by generating a square treemap at different dimensions, and then [stretching the treemap](https://observablehq.com/@d3/stretched-treemap) to the desired aspect ratio.) Furthermore, the specified *ratio* is merely a hint to the tiling algorithm; the rectangles are not guaranteed to have the specified aspect ratio. If not specified, the aspect ratio defaults to the golden ratio, φ = (1 + sqrt(5)) / 2, per [Kong *et al.*](http://vis.stanford.edu/papers/perception-treemaps) + +### Partition + +[Partition](https://observablehq.com/@d3/icicle) + +The **partition layout** produces adjacency diagrams: a space-filling variant of a node-link tree diagram. Rather than drawing a link between parent and child in the hierarchy, nodes are drawn as solid areas (either arcs or rectangles), and their placement relative to other nodes reveals their position in the hierarchy. The size of the nodes encodes a quantitative dimension that would be difficult to show in a node-link diagram. + +# d3.partition() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/partition.js), [Examples](https://observablehq.com/@d3/icicle) + +Creates a new partition layout with the default settings. + +# partition(root) + +Lays out the specified *root* [hierarchy](#hierarchy), assigning the following properties on *root* and its descendants: + +* *node*.x0 - the left edge of the rectangle +* *node*.y0 - the top edge of the rectangle +* *node*.x1 - the right edge of the rectangle +* *node*.y1 - the bottom edge of the rectangle + +You must call [*root*.sum](#node_sum) before passing the hierarchy to the partition layout. You probably also want to call [*root*.sort](#node_sort) to order the hierarchy before computing the layout. + +# partition.size([size]) + +If *size* is specified, sets this partition layout’s size to the specified two-element array of numbers [*width*, *height*] and returns this partition layout. If *size* is not specified, returns the current size, which defaults to [1, 1]. + +# partition.round([round]) + +If *round* is specified, enables or disables rounding according to the given boolean and returns this partition layout. If *round* is not specified, returns the current rounding state, which defaults to false. + +# partition.padding([padding]) + +If *padding* is specified, sets the padding to the specified number and returns this partition layout. If *padding* is not specified, returns the current padding, which defaults to zero. The padding is used to separate a node’s adjacent children. + +### Pack + +[Circle-Packing](https://observablehq.com/@d3/circle-packing) + +Enclosure diagrams use containment (nesting) to represent a hierarchy. The size of the leaf circles encodes a quantitative dimension of the data. The enclosing circles show the approximate cumulative size of each subtree, but due to wasted space there is some distortion; only the leaf nodes can be compared accurately. Although [circle packing](http://en.wikipedia.org/wiki/Circle_packing) does not use space as efficiently as a [treemap](#treemap), the “wasted†space more prominently reveals the hierarchical structure. + +# d3.pack() · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/pack/index.js), [Examples](https://observablehq.com/@d3/circle-packing) + +Creates a new pack layout with the default settings. + +# pack(root) + +Lays out the specified *root* [hierarchy](#hierarchy), assigning the following properties on *root* and its descendants: + +* *node*.x - the *x*-coordinate of the circle’s center +* *node*.y - the *y*-coordinate of the circle’s center +* *node*.r - the radius of the circle + +You must call [*root*.sum](#node_sum) before passing the hierarchy to the pack layout. You probably also want to call [*root*.sort](#node_sort) to order the hierarchy before computing the layout. + +# pack.radius([radius]) + +If *radius* is specified, sets the pack layout’s radius accessor to the specified function and returns this pack layout. If *radius* is not specified, returns the current radius accessor, which defaults to null. If the radius accessor is null, the radius of each leaf circle is derived from the leaf *node*.value (computed by [*node*.sum](#node_sum)); the radii are then scaled proportionally to fit the [layout size](#pack_size). If the radius accessor is not null, the radius of each leaf circle is specified exactly by the function. + +# pack.size([size]) + +If *size* is specified, sets this pack layout’s size to the specified two-element array of numbers [*width*, *height*] and returns this pack layout. If *size* is not specified, returns the current size, which defaults to [1, 1]. + +# pack.padding([padding]) + +If *padding* is specified, sets this pack layout’s padding accessor to the specified number or function and returns this pack layout. If *padding* is not specified, returns the current padding accessor, which defaults to the constant zero. When siblings are packed, tangent siblings will be separated by approximately the specified padding; the enclosing parent circle will also be separated from its children by approximately the specified padding. If an [explicit radius](#pack_radius) is not specified, the padding is approximate because a two-pass algorithm is needed to fit within the [layout size](#pack_size): the circles are first packed without padding; a scaling factor is computed and applied to the specified padding; and lastly the circles are re-packed with padding. + +# d3.packSiblings(circles) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/pack/siblings.js) + +Packs the specified array of *circles*, each of which must have a *circle*.r property specifying the circle’s radius. Assigns the following properties to each circle: + +* *circle*.x - the *x*-coordinate of the circle’s center +* *circle*.y - the *y*-coordinate of the circle’s center + +The circles are positioned according to the front-chain packing algorithm by [Wang *et al.*](https://dl.acm.org/citation.cfm?id=1124851) + +# d3.packEnclose(circles) · [Source](https://github.com/d3/d3-hierarchy/blob/master/src/pack/enclose.js), [Examples](https://observablehq.com/@d3/d3-packenclose) + +Computes the [smallest circle](https://en.wikipedia.org/wiki/Smallest-circle_problem) that encloses the specified array of *circles*, each of which must have a *circle*.r property specifying the circle’s radius, and *circle*.x and *circle*.y properties specifying the circle’s center. The enclosing circle is computed using the [MatouÅ¡ek-Sharir-Welzl algorithm](http://www.inf.ethz.ch/personal/emo/PublFiles/SubexLinProg_ALG16_96.pdf). (See also [Apollonius’ Problem](https://bl.ocks.org/mbostock/751fdd637f4bc2e3f08b).) diff --git a/node_modules/d3-hierarchy/dist/d3-hierarchy.js b/node_modules/d3-hierarchy/dist/d3-hierarchy.js new file mode 100644 index 00000000..83d6212b --- /dev/null +++ b/node_modules/d3-hierarchy/dist/d3-hierarchy.js @@ -0,0 +1,1324 @@ +// https://d3js.org/d3-hierarchy/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; +} + +function meanXReduce(x, c) { + return x + c.x; +} + +function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); +} + +function maxYReduce(y, c) { + return Math.max(y, c.y); +} + +function leafLeft(node) { + var children; + while (children = node.children) node = children[0]; + return node; +} + +function leafRight(node) { + var children; + while (children = node.children) node = children[children.length - 1]; + return node; +} + +function cluster() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = false; + + function cluster(root) { + var previousNode, + x = 0; + + // First walk, computing the initial x & y values. + root.eachAfter(function(node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function(node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); + } + + cluster.separation = function(x) { + return arguments.length ? (separation = x, cluster) : separation; + }; + + cluster.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; + + cluster.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; + + return cluster; +} + +function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; +} + +function node_count() { + return this.eachAfter(count); +} + +function node_each(callback, that) { + let index = -1; + for (const node of this) { + callback.call(that, node, ++index, this); + } + return this; +} + +function node_eachBefore(callback, that) { + var node = this, nodes = [node], children, i, index = -1; + while (node = nodes.pop()) { + callback.call(that, node, ++index, this); + if (children = node.children) { + for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + } + return this; +} + +function node_eachAfter(callback, that) { + var node = this, nodes = [node], next = [], children, i, n, index = -1; + while (node = nodes.pop()) { + next.push(node); + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + } + while (node = next.pop()) { + callback.call(that, node, ++index, this); + } + return this; +} + +function node_find(callback, that) { + let index = -1; + for (const node of this) { + if (callback.call(that, node, ++index, this)) { + return node; + } + } +} + +function node_sum(value) { + return this.eachAfter(function(node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); +} + +function node_sort(compare) { + return this.eachBefore(function(node) { + if (node.children) { + node.children.sort(compare); + } + }); +} + +function node_path(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; +} + +function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; +} + +function node_ancestors() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; +} + +function node_descendants() { + return Array.from(this); +} + +function node_leaves() { + var leaves = []; + this.eachBefore(function(node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; +} + +function node_links() { + var root = this, links = []; + root.each(function(node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; +} + +function* node_iterator() { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + yield node; + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } + } while (next.length); +} + +function hierarchy(data, children) { + if (data instanceof Map) { + data = [undefined, data]; + if (children === undefined) children = mapChildren; + } else if (children === undefined) { + children = objectChildren; + } + + var root = new Node(data), + node, + nodes = [root], + child, + childs, + i, + n; + + while (node = nodes.pop()) { + if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) { + node.children = childs; + for (i = n - 1; i >= 0; --i) { + nodes.push(child = childs[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); +} + +function node_copy() { + return hierarchy(this).eachBefore(copyData); +} + +function objectChildren(d) { + return d.children; +} + +function mapChildren(d) { + return Array.isArray(d) ? d[1] : null; +} + +function copyData(node) { + if (node.data.value !== undefined) node.value = node.data.value; + node.data = node.data.data; +} + +function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); +} + +function Node(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; +} + +Node.prototype = hierarchy.prototype = { + constructor: Node, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + find: node_find, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy, + [Symbol.iterator]: node_iterator +}; + +function array(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} + +function shuffle(array) { + var m = array.length, + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m]; + array[m] = array[i]; + array[i] = t; + } + + return array; +} + +function enclose(circles) { + var i = 0, n = (circles = shuffle(Array.from(circles))).length, B = [], p, e; + + while (i < n) { + p = circles[i]; + if (e && enclosesWeak(e, p)) ++i; + else e = encloseBasis(B = extendBasis(B, p)), i = 0; + } + + return e; +} + +function extendBasis(B, p) { + var i, j; + + if (enclosesWeakAll(p, B)) return [p]; + + // If we get here then B must have at least one element. + for (i = 0; i < B.length; ++i) { + if (enclosesNot(p, B[i]) + && enclosesWeakAll(encloseBasis2(B[i], p), B)) { + return [B[i], p]; + } + } + + // If we get here then B must have at least two elements. + for (i = 0; i < B.length - 1; ++i) { + for (j = i + 1; j < B.length; ++j) { + if (enclosesNot(encloseBasis2(B[i], B[j]), p) + && enclosesNot(encloseBasis2(B[i], p), B[j]) + && enclosesNot(encloseBasis2(B[j], p), B[i]) + && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { + return [B[i], B[j], p]; + } + } + } + + // If we get here then something is very wrong. + throw new Error; +} + +function enclosesNot(a, b) { + var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; + return dr < 0 || dr * dr < dx * dx + dy * dy; +} + +function enclosesWeak(a, b) { + var dr = a.r - b.r + Math.max(a.r, b.r, 1) * 1e-9, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function enclosesWeakAll(a, B) { + for (var i = 0; i < B.length; ++i) { + if (!enclosesWeak(a, B[i])) { + return false; + } + } + return true; +} + +function encloseBasis(B) { + switch (B.length) { + case 1: return encloseBasis1(B[0]); + case 2: return encloseBasis2(B[0], B[1]); + case 3: return encloseBasis3(B[0], B[1], B[2]); + } +} + +function encloseBasis1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; +} + +function encloseBasis2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; +} + +function encloseBasis3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = x1 - x2, + a3 = x1 - x3, + b2 = y1 - y2, + b3 = y1 - y3, + c2 = r2 - r1, + c3 = r3 - r1, + d1 = x1 * x1 + y1 * y1 - r1 * r1, + d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, + d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (r1 + xa * xb + ya * yb), + C = xa * xa + ya * ya - r1 * r1, + r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + return { + x: x1 + xa + xb * r, + y: y1 + ya + yb * r, + r: r + }; +} + +function place(b, a, c) { + var dx = b.x - a.x, x, a2, + dy = b.y - a.y, y, b2, + d2 = dx * dx + dy * dy; + if (d2) { + a2 = a.r + c.r, a2 *= a2; + b2 = b.r + c.r, b2 *= b2; + if (a2 > b2) { + x = (d2 + b2 - a2) / (2 * d2); + y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); + c.x = b.x - x * dx - y * dy; + c.y = b.y - x * dy + y * dx; + } else { + x = (d2 + a2 - b2) / (2 * d2); + y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); + c.x = a.x + x * dx - y * dy; + c.y = a.y + x * dy + y * dx; + } + } else { + c.x = a.x + c.r; + c.y = a.y; + } +} + +function intersects(a, b) { + var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function score(node) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab, + dy = (a.y * b.r + b.y * a.r) / ab; + return dx * dx + dy * dy; +} + +function Node$1(circle) { + this._ = circle; + this.next = null; + this.previous = null; +} + +function packEnclose(circles) { + if (!(n = (circles = array(circles)).length)) return 0; + + var a, b, c, n, aa, ca, i, j, k, sj, sk; + + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) return a.r; + + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) return a.r + b.r; + + // Place the third circle. + place(b, a, c = circles[2]); + + // Initialize the front-chain using the first three circles a, b and c. + a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; + + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node$1(c); + + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness†is determined by linear distance along the front-chain. + // “Ahead†or “behind†is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + sk += k._.r, k = k.previous; + } + } while (j !== k.next); + + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; + + // Compute the new closest circle pair to the centroid. + aa = score(a); + while ((c = c.next) !== b) { + if ((ca = score(c)) < aa) { + a = c, aa = ca; + } + } + b = a.next; + } + + // Compute the enclosing circle of the front chain. + a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a); + + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; + + return c.r; +} + +function siblings(circles) { + packEnclose(circles); + return circles; +} + +function optional(f) { + return f == null ? null : required(f); +} + +function required(f) { + if (typeof f !== "function") throw new Error; + return f; +} + +function constantZero() { + return 0; +} + +function constant(x) { + return function() { + return x; + }; +} + +function defaultRadius(d) { + return Math.sqrt(d.value); +} + +function index() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; + + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } + + pack.radius = function(x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; + + pack.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; + + pack.padding = function(x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant(+x), pack) : padding; + }; + + return pack; +} + +function radiusLeaf(radius) { + return function(node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; +} + +function packChildren(padding, k) { + return function(node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; + + if (r) for (i = 0; i < n; ++i) children[i].r += r; + e = packEnclose(children); + if (r) for (i = 0; i < n; ++i) children[i].r -= r; + node.r = e + r; + } + }; +} + +function translateChild(k) { + return function(node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; +} + +function roundNode(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); +} + +function treemapDice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } +} + +function partition() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(dy, n) { + return function(node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + partition.round = function(x) { + return arguments.length ? (round = !!x, partition) : round; + }; + + partition.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; + + partition.padding = function(x) { + return arguments.length ? (padding = +x, partition) : padding; + }; + + return partition; +} + +var preroot = {depth: -1}, + ambiguous = {}; + +function defaultId(d) { + return d.id; +} + +function defaultParentId(d) { + return d.parentId; +} + +function stratify() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var nodes = Array.from(data), + n = nodes.length, + d, + i, + root, + parent, + node, + nodeId, + nodeKey, + nodeByKey = new Map; + + for (i = 0; i < n; ++i) { + d = nodes[i], node = nodes[i] = new Node(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = node.id = nodeId; + nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node); + } + if ((nodeId = parentId(d, i, data)) != null && (nodeId += "")) { + node.parent = nodeId; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (nodeId = node.parent) { + parent = nodeByKey.get(nodeId); + if (!parent) throw new Error("missing: " + nodeId); + if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); + if (parent.children) parent.children.push(node); + else parent.children = [node]; + node.parent = parent; + } else { + if (root) throw new Error("multiple roots"); + root = node; + } + } + + if (!root) throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) throw new Error("cycle"); + + return root; + } + + stratify.id = function(x) { + return arguments.length ? (id = required(x), stratify) : id; + }; + + stratify.parentId = function(x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; + }; + + return stratify; +} + +function defaultSeparation$1(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } + +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. +function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; +} + +// This function works analogously to nextLeft. +function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; +} + +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. +function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; +} + +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). +function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } +} + +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. +function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; +} + +function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number +} + +TreeNode.prototype = Object.create(Node.prototype); + +function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; + + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; + } + } + } + + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; +} + +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm +function tree() { + var separation = defaultSeparation$1, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function(node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + + return root; + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + + tree.separation = function(x) { + return arguments.length ? (separation = x, tree) : separation; + }; + + tree.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; + + tree.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; + + return tree; +} + +function treemapSlice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; + + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } +} + +var phi = (1 + Math.sqrt(5)) / 2; + +function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + + // Find the next non-empty node. + do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + + // Keep adding nodes while the aspect ratio maintains or improves. + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) minValue = nodeValue; + if (nodeValue > maxValue) maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { sumValue -= nodeValue; break; } + minRatio = newRatio; + } + + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + + return rows; +} + +var squarify = (function custom(ratio) { + + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + + squarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return squarify; +})(phi); + +function index$1() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + + treemap.round = function(x) { + return arguments.length ? (round = !!x, treemap) : round; + }; + + treemap.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; + + treemap.tile = function(x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; + + treemap.padding = function(x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; + + treemap.paddingInner = function(x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant(+x), treemap) : paddingInner; + }; + + treemap.paddingOuter = function(x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; + + treemap.paddingTop = function(x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function(x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function(x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function(x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant(+x), treemap) : paddingLeft; + }; + + return treemap; +} + +function binary(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); + + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + + partition(0, n, parent.value, x0, y0, x1, y1); + + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } + + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; + + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) k = mid + 1; + else hi = mid; + } + + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((x1 - x0) > (y1 - y0)) { + var xk = value ? (x0 * valueRight + x1 * valueLeft) / value : x1; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = value ? (y0 * valueRight + y1 * valueLeft) / value : y1; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } + } +} + +function sliceDice(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); +} + +var resquarify = (function custom(ratio) { + + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; + + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += (y1 - y0) * row.value / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += (x1 - x0) * row.value / value : x1, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } + + resquarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return resquarify; +})(phi); + +exports.cluster = cluster; +exports.hierarchy = hierarchy; +exports.pack = index; +exports.packEnclose = enclose; +exports.packSiblings = siblings; +exports.partition = partition; +exports.stratify = stratify; +exports.tree = tree; +exports.treemap = index$1; +exports.treemapBinary = binary; +exports.treemapDice = treemapDice; +exports.treemapResquarify = resquarify; +exports.treemapSlice = treemapSlice; +exports.treemapSliceDice = sliceDice; +exports.treemapSquarify = squarify; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-hierarchy/dist/d3-hierarchy.min.js b/node_modules/d3-hierarchy/dist/d3-hierarchy.min.js new file mode 100644 index 00000000..23f6f723 --- /dev/null +++ b/node_modules/d3-hierarchy/dist/d3-hierarchy.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-hierarchy/ v2.0.0 Copyright 2020 Mike Bostock +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((n=n||self).d3=n.d3||{})}(this,function(n){"use strict";function r(n,r){return n.parent===r.parent?1:2}function t(n,r){return n+r.x}function e(n,r){return Math.max(n,r.y)}function i(n){var r=0,t=n.children,e=t&&t.length;if(e)for(;--e>=0;)r+=t[e].value;else r=1;n.value=r}function u(n,r){n instanceof Map?(n=[void 0,n],void 0===r&&(r=a)):void 0===r&&(r=o);for(var t,e,i,u,f,h=new Node(n),l=[h];t=l.pop();)if((i=r(t.data))&&(f=(i=Array.from(i)).length))for(t.children=i,u=f-1;u>=0;--u)l.push(e=i[u]=new Node(i[u])),e.parent=t,e.depth=t.depth+1;return h.eachBefore(c)}function o(n){return n.children}function a(n){return Array.isArray(n)?n[1]:null}function f(n){void 0!==n.data.value&&(n.value=n.data.value),n.data=n.data.data}function c(n){var r=0;do{n.height=r}while((n=n.parent)&&n.height<++r)}function Node(n){this.data=n,this.depth=this.height=0,this.parent=null}function h(n){for(var r,t,e=0,i=(n=function(n){for(var r,t,e=n.length;e;)t=Math.random()*e--|0,r=n[e],n[e]=n[t],n[t]=r;return n}(Array.from(n))).length,u=[];e0&&t*t>e*e+i*i}function s(n,r){for(var t=0;t(o*=o)?(e=(c+o-i)/(2*c),u=Math.sqrt(Math.max(0,o/c-e*e)),t.x=n.x-e*a-u*f,t.y=n.y-e*f+u*a):(e=(c+i-o)/(2*c),u=Math.sqrt(Math.max(0,i/c-e*e)),t.x=r.x+e*a-u*f,t.y=r.y+e*f+u*a)):(t.x=r.x+t.r,t.y=r.y)}function m(n,r){var t=n.r+r.r-1e-6,e=r.x-n.x,i=r.y-n.y;return t>0&&t*t>e*e+i*i}function w(n){var r=n._,t=n.next._,e=r.r+t.r,i=(r.x*t.r+t.x*r.r)/e,u=(r.y*t.r+t.y*r.r)/e;return i*i+u*u}function _(n){this._=n,this.next=null,this.previous=null}function M(n){if(!(u=(r=n,n="object"==typeof r&&"length"in r?r:Array.from(r)).length))return 0;var r,t,e,i,u,o,a,f,c,l,p,d;if((t=n[0]).x=0,t.y=0,!(u>1))return t.r;if(e=n[1],t.x=-e.r,e.x=t.r,e.y=0,!(u>2))return t.r+e.r;g(e,t,i=n[2]),t=new _(t),e=new _(e),i=new _(i),t.next=i.previous=e,e.next=t.previous=i,i.next=e.previous=t;n:for(f=3;f=0;--e)u.push(t[e]);return this},find:function(n,r){let t=-1;for(const e of this)if(n.call(r,e,++t,this))return e},sum:function(n){return this.eachAfter(function(r){for(var t=+n(r.data)||0,e=r.children,i=e&&e.length;--i>=0;)t+=e[i].value;r.value=t})},sort:function(n){return this.eachBefore(function(r){r.children&&r.children.sort(n)})},path:function(n){for(var r=this,t=function(n,r){if(n===r)return n;var t=n.ancestors(),e=r.ancestors(),i=null;for(n=t.pop(),r=e.pop();n===r;)i=n,n=t.pop(),r=e.pop();return i}(r,n),e=[r];r!==t;)r=r.parent,e.push(r);for(var i=e.length;n!==t;)e.splice(i,0,n),n=n.parent;return e},ancestors:function(){for(var n=this,r=[n];n=n.parent;)r.push(n);return r},descendants:function(){return Array.from(this)},leaves:function(){var n=[];return this.eachBefore(function(r){r.children||n.push(r)}),n},links:function(){var n=this,r=[];return n.each(function(t){t!==n&&r.push({source:t.parent,target:t})}),r},copy:function(){return u(this).eachBefore(f)},[Symbol.iterator]:function*(){var n,r,t,e,i=this,u=[i];do{for(n=u.reverse(),u=[];i=n.pop();)if(yield i,r=i.children)for(t=0,e=r.length;tp&&(p=a),x=h*h*v,(d=Math.max(p/x,x/l))>s){h-=a;break}s=d}y.push(o={value:h,dice:f1?r:1)},t}(K);var U=function n(r){function t(n,t,e,i,u){if((o=n._squarify)&&o.ratio===r)for(var o,a,f,c,h,l=-1,p=o.length,d=n.value;++l1?r:1)},t}(K);n.cluster=function(){var n=r,i=1,u=1,o=!1;function a(r){var a,f=0;r.eachAfter(function(r){var i=r.children;i?(r.x=function(n){return n.reduce(t,0)/n.length}(i),r.y=function(n){return 1+n.reduce(e,0)}(i)):(r.x=a?f+=n(r,a):0,r.y=0,a=r)});var c=function(n){for(var r;r=n.children;)n=r[0];return n}(r),h=function(n){for(var r;r=n.children;)n=r[r.length-1];return n}(r),l=c.x-n(c,h)/2,p=h.x+n(h,c)/2;return r.eachAfter(o?function(n){n.x=(n.x-r.x)*i,n.y=(r.y-n.y)*u}:function(n){n.x=(n.x-l)/(p-l)*i,n.y=(1-(r.y?n.y/r.y:1))*u})}return a.separation=function(r){return arguments.length?(n=r,a):n},a.size=function(n){return arguments.length?(o=!1,i=+n[0],u=+n[1],a):o?null:[i,u]},a.nodeSize=function(n){return arguments.length?(o=!0,i=+n[0],u=+n[1],a):o?[i,u]:null},a},n.hierarchy=u,n.pack=function(){var n=null,r=1,t=1,e=A;function i(i){return i.x=r/2,i.y=t/2,n?i.eachBefore(E(n)).eachAfter(S(e,.5)).eachBefore(k(1)):i.eachBefore(E(b)).eachAfter(S(A,1)).eachAfter(S(e,i.r/Math.min(r,t))).eachBefore(k(Math.min(r,t)/(2*i.r))),i}return i.radius=function(r){return arguments.length?(n=z(r),i):n},i.size=function(n){return arguments.length?(r=+n[0],t=+n[1],i):[r,t]},i.padding=function(n){return arguments.length?(e="function"==typeof n?n:q(+n),i):e},i},n.packEnclose=h,n.packSiblings=function(n){return M(n),n},n.partition=function(){var n=1,r=1,t=0,e=!1;function i(i){var u=i.height+1;return i.x0=i.y0=t,i.x1=n,i.y1=r/u,i.eachBefore(function(n,r){return function(e){e.children&&j(e,e.x0,n*(e.depth+1)/r,e.x1,n*(e.depth+2)/r);var i=e.x0,u=e.y0,o=e.x1-t,a=e.y1-t;o0)throw new Error("cycle");return u}return t.id=function(r){return arguments.length?(n=B(r),t):n},t.parentId=function(n){return arguments.length?(r=B(n),t):r},t},n.tree=function(){var n=L,r=1,t=1,e=null;function i(i){var f=function(n){for(var r,t,e,i,u,o=new H(n,0),a=[o];r=a.pop();)if(e=r._.children)for(r.children=new Array(u=e.length),i=u-1;i>=0;--i)a.push(t=r.children[i]=new H(e[i],i)),t.parent=r;return(o.parent=new H(null,0)).children=[o],o}(i);if(f.eachAfter(u),f.parent.m=-f.z,f.eachBefore(o),e)i.eachBefore(a);else{var c=i,h=i,l=i;i.eachBefore(function(n){n.xh.x&&(h=n),n.depth>l.depth&&(l=n)});var p=c===h?1:n(c,h)/2,d=p-c.x,s=r/(h.x+p+d),v=t/(l.depth||1);i.eachBefore(function(n){n.x=(n.x+d)*s,n.y=n.depth*v})}return i}function u(r){var t=r.children,e=r.parent.children,i=r.i?e[r.i-1]:null;if(t){!function(n){for(var r,t=0,e=0,i=n.children,u=i.length;--u>=0;)(r=i[u]).z+=t,r.m+=t,t+=r.s+(e+=r.c)}(r);var u=(t[0].z+t[t.length-1].z)/2;i?(r.z=i.z+n(r._,i._),r.m=r.z-u):r.z=u}else i&&(r.z=i.z+n(r._,i._));r.parent.A=function(r,t,e){if(t){for(var i,u=r,o=r,a=t,f=u.parent.children[0],c=u.m,h=o.m,l=a.m,p=f.m;a=C(a),u=P(u),a&&u;)f=P(f),(o=C(o)).a=r,(i=a.z+l-u.z-c+n(a._,u._))>0&&(F(G(a,r,e),r,i),c+=i,h+=i),l+=a.m,c+=u.m,p+=f.m,h+=o.m;a&&!C(o)&&(o.t=a,o.m+=l-h),u&&!P(f)&&(f.t=u,f.m+=c-p,e=r)}return e}(r,i,r.parent.A||e[0])}function o(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function a(n){n.x*=r,n.y=n.depth*t}return i.separation=function(r){return arguments.length?(n=r,i):n},i.size=function(n){return arguments.length?(e=!1,r=+n[0],t=+n[1],i):e?null:[r,t]},i.nodeSize=function(n){return arguments.length?(e=!0,r=+n[0],t=+n[1],i):e?[r,t]:null},i},n.treemap=function(){var n=Q,r=!1,t=1,e=1,i=[0],u=A,o=A,a=A,f=A,c=A;function h(n){return n.x0=n.y0=0,n.x1=t,n.y1=e,n.eachBefore(l),i=[0],r&&n.eachBefore(I),n}function l(r){var t=i[r.depth],e=r.x0+t,h=r.y0+t,l=r.x1-t,p=r.y1-t;l=t-1){var h=a[r];return h.x0=i,h.y0=u,h.x1=o,void(h.y1=f)}for(var l=c[r],p=e/2+l,d=r+1,s=t-1;d>>1;c[v]f-u){var g=e?(i*y+o*x)/e:o;n(r,d,x,i,u,g,f),n(d,t,y,g,u,o,f)}else{var m=e?(u*y+f*x)/e:f;n(r,d,x,i,u,o,m),n(d,t,y,i,m,o,f)}}(0,f,n.value,r,t,e,i)},n.treemapDice=j,n.treemapResquarify=U,n.treemapSlice=J,n.treemapSliceDice=function(n,r,t,e,i){(1&n.depth?J:j)(n,r,t,e,i)},n.treemapSquarify=Q,Object.defineProperty(n,"__esModule",{value:!0})}); diff --git a/node_modules/d3-hierarchy/package.json b/node_modules/d3-hierarchy/package.json new file mode 100644 index 00000000..61ba83a6 --- /dev/null +++ b/node_modules/d3-hierarchy/package.json @@ -0,0 +1,77 @@ +{ + "_from": "d3-hierarchy@2", + "_id": "d3-hierarchy@2.0.0", + "_inBundle": false, + "_integrity": "sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==", + "_location": "/d3-hierarchy", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-hierarchy@2", + "name": "d3-hierarchy", + "escapedName": "d3-hierarchy", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3" + ], + "_resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz", + "_shasum": "dab88a58ca3e7a1bc6cab390e89667fcc6d20218", + "_spec": "d3-hierarchy@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-hierarchy/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Layout algorithms for visualizing hierarchical data.", + "devDependencies": { + "benchmark": "^2.1.4", + "d3-array": "1.2.0 - 2", + "d3-dsv": "1 - 2", + "d3-random": "1.1.0 - 2", + "eslint": "6", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-hierarchy/", + "jsdelivr": "dist/d3-hierarchy.min.js", + "keywords": [ + "d3", + "d3-module", + "layout", + "tree", + "treemap", + "hierarchy", + "infovis" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-hierarchy.js", + "module": "src/index.js", + "name": "d3-hierarchy", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-hierarchy.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src test" + }, + "sideEffects": false, + "unpkg": "dist/d3-hierarchy.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-hierarchy/src/accessors.js b/node_modules/d3-hierarchy/src/accessors.js new file mode 100644 index 00000000..369c4145 --- /dev/null +++ b/node_modules/d3-hierarchy/src/accessors.js @@ -0,0 +1,8 @@ +export function optional(f) { + return f == null ? null : required(f); +} + +export function required(f) { + if (typeof f !== "function") throw new Error; + return f; +} diff --git a/node_modules/d3-hierarchy/src/array.js b/node_modules/d3-hierarchy/src/array.js new file mode 100644 index 00000000..df69e807 --- /dev/null +++ b/node_modules/d3-hierarchy/src/array.js @@ -0,0 +1,20 @@ +export default function(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} + +export function shuffle(array) { + var m = array.length, + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m]; + array[m] = array[i]; + array[i] = t; + } + + return array; +} diff --git a/node_modules/d3-hierarchy/src/cluster.js b/node_modules/d3-hierarchy/src/cluster.js new file mode 100644 index 00000000..f5a280e2 --- /dev/null +++ b/node_modules/d3-hierarchy/src/cluster.js @@ -0,0 +1,84 @@ +function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; +} + +function meanXReduce(x, c) { + return x + c.x; +} + +function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); +} + +function maxYReduce(y, c) { + return Math.max(y, c.y); +} + +function leafLeft(node) { + var children; + while (children = node.children) node = children[0]; + return node; +} + +function leafRight(node) { + var children; + while (children = node.children) node = children[children.length - 1]; + return node; +} + +export default function() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = false; + + function cluster(root) { + var previousNode, + x = 0; + + // First walk, computing the initial x & y values. + root.eachAfter(function(node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function(node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); + } + + cluster.separation = function(x) { + return arguments.length ? (separation = x, cluster) : separation; + }; + + cluster.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; + + cluster.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; + + return cluster; +} diff --git a/node_modules/d3-hierarchy/src/constant.js b/node_modules/d3-hierarchy/src/constant.js new file mode 100644 index 00000000..1d947c4f --- /dev/null +++ b/node_modules/d3-hierarchy/src/constant.js @@ -0,0 +1,9 @@ +export function constantZero() { + return 0; +} + +export default function(x) { + return function() { + return x; + }; +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/ancestors.js b/node_modules/d3-hierarchy/src/hierarchy/ancestors.js new file mode 100644 index 00000000..f70c7264 --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/ancestors.js @@ -0,0 +1,7 @@ +export default function() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/count.js b/node_modules/d3-hierarchy/src/hierarchy/count.js new file mode 100644 index 00000000..0b90f1bd --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/count.js @@ -0,0 +1,12 @@ +function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; +} + +export default function() { + return this.eachAfter(count); +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/descendants.js b/node_modules/d3-hierarchy/src/hierarchy/descendants.js new file mode 100644 index 00000000..7f38090d --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/descendants.js @@ -0,0 +1,3 @@ +export default function() { + return Array.from(this); +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/each.js b/node_modules/d3-hierarchy/src/hierarchy/each.js new file mode 100644 index 00000000..af911cc7 --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/each.js @@ -0,0 +1,7 @@ +export default function(callback, that) { + let index = -1; + for (const node of this) { + callback.call(that, node, ++index, this); + } + return this; +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/eachAfter.js b/node_modules/d3-hierarchy/src/hierarchy/eachAfter.js new file mode 100644 index 00000000..a3f0a2c0 --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/eachAfter.js @@ -0,0 +1,15 @@ +export default function(callback, that) { + var node = this, nodes = [node], next = [], children, i, n, index = -1; + while (node = nodes.pop()) { + next.push(node); + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + } + while (node = next.pop()) { + callback.call(that, node, ++index, this); + } + return this; +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/eachBefore.js b/node_modules/d3-hierarchy/src/hierarchy/eachBefore.js new file mode 100644 index 00000000..f3cd524b --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/eachBefore.js @@ -0,0 +1,12 @@ +export default function(callback, that) { + var node = this, nodes = [node], children, i, index = -1; + while (node = nodes.pop()) { + callback.call(that, node, ++index, this); + if (children = node.children) { + for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + } + return this; +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/find.js b/node_modules/d3-hierarchy/src/hierarchy/find.js new file mode 100644 index 00000000..f4ed8c68 --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/find.js @@ -0,0 +1,8 @@ +export default function(callback, that) { + let index = -1; + for (const node of this) { + if (callback.call(that, node, ++index, this)) { + return node; + } + } +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/index.js b/node_modules/d3-hierarchy/src/hierarchy/index.js new file mode 100644 index 00000000..b9c1026f --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/index.js @@ -0,0 +1,91 @@ +import node_count from "./count.js"; +import node_each from "./each.js"; +import node_eachBefore from "./eachBefore.js"; +import node_eachAfter from "./eachAfter.js"; +import node_find from "./find.js"; +import node_sum from "./sum.js"; +import node_sort from "./sort.js"; +import node_path from "./path.js"; +import node_ancestors from "./ancestors.js"; +import node_descendants from "./descendants.js"; +import node_leaves from "./leaves.js"; +import node_links from "./links.js"; +import node_iterator from "./iterator.js"; + +export default function hierarchy(data, children) { + if (data instanceof Map) { + data = [undefined, data]; + if (children === undefined) children = mapChildren; + } else if (children === undefined) { + children = objectChildren; + } + + var root = new Node(data), + node, + nodes = [root], + child, + childs, + i, + n; + + while (node = nodes.pop()) { + if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) { + node.children = childs; + for (i = n - 1; i >= 0; --i) { + nodes.push(child = childs[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); +} + +function node_copy() { + return hierarchy(this).eachBefore(copyData); +} + +function objectChildren(d) { + return d.children; +} + +function mapChildren(d) { + return Array.isArray(d) ? d[1] : null; +} + +function copyData(node) { + if (node.data.value !== undefined) node.value = node.data.value; + node.data = node.data.data; +} + +export function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); +} + +export function Node(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; +} + +Node.prototype = hierarchy.prototype = { + constructor: Node, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + find: node_find, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy, + [Symbol.iterator]: node_iterator +}; diff --git a/node_modules/d3-hierarchy/src/hierarchy/iterator.js b/node_modules/d3-hierarchy/src/hierarchy/iterator.js new file mode 100644 index 00000000..7e06b620 --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/iterator.js @@ -0,0 +1,14 @@ +export default function*() { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + yield node; + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } + } while (next.length); +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/leaves.js b/node_modules/d3-hierarchy/src/hierarchy/leaves.js new file mode 100644 index 00000000..401c5b53 --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/leaves.js @@ -0,0 +1,9 @@ +export default function() { + var leaves = []; + this.eachBefore(function(node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/links.js b/node_modules/d3-hierarchy/src/hierarchy/links.js new file mode 100644 index 00000000..6fcb82fa --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/links.js @@ -0,0 +1,9 @@ +export default function() { + var root = this, links = []; + root.each(function(node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/path.js b/node_modules/d3-hierarchy/src/hierarchy/path.js new file mode 100644 index 00000000..99589138 --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/path.js @@ -0,0 +1,30 @@ +export default function(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; +} + +function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/sort.js b/node_modules/d3-hierarchy/src/hierarchy/sort.js new file mode 100644 index 00000000..5d0426d5 --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/sort.js @@ -0,0 +1,7 @@ +export default function(compare) { + return this.eachBefore(function(node) { + if (node.children) { + node.children.sort(compare); + } + }); +} diff --git a/node_modules/d3-hierarchy/src/hierarchy/sum.js b/node_modules/d3-hierarchy/src/hierarchy/sum.js new file mode 100644 index 00000000..350a965e --- /dev/null +++ b/node_modules/d3-hierarchy/src/hierarchy/sum.js @@ -0,0 +1,9 @@ +export default function(value) { + return this.eachAfter(function(node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); +} diff --git a/node_modules/d3-hierarchy/src/index.js b/node_modules/d3-hierarchy/src/index.js new file mode 100644 index 00000000..cd4cca39 --- /dev/null +++ b/node_modules/d3-hierarchy/src/index.js @@ -0,0 +1,15 @@ +export {default as cluster} from "./cluster.js"; +export {default as hierarchy} from "./hierarchy/index.js"; +export {default as pack} from "./pack/index.js"; +export {default as packSiblings} from "./pack/siblings.js"; +export {default as packEnclose} from "./pack/enclose.js"; +export {default as partition} from "./partition.js"; +export {default as stratify} from "./stratify.js"; +export {default as tree} from "./tree.js"; +export {default as treemap} from "./treemap/index.js"; +export {default as treemapBinary} from "./treemap/binary.js"; +export {default as treemapDice} from "./treemap/dice.js"; +export {default as treemapSlice} from "./treemap/slice.js"; +export {default as treemapSliceDice} from "./treemap/sliceDice.js"; +export {default as treemapSquarify} from "./treemap/squarify.js"; +export {default as treemapResquarify} from "./treemap/resquarify.js"; diff --git a/node_modules/d3-hierarchy/src/pack/enclose.js b/node_modules/d3-hierarchy/src/pack/enclose.js new file mode 100644 index 00000000..86231caa --- /dev/null +++ b/node_modules/d3-hierarchy/src/pack/enclose.js @@ -0,0 +1,118 @@ +import {shuffle} from "../array.js"; + +export default function(circles) { + var i = 0, n = (circles = shuffle(Array.from(circles))).length, B = [], p, e; + + while (i < n) { + p = circles[i]; + if (e && enclosesWeak(e, p)) ++i; + else e = encloseBasis(B = extendBasis(B, p)), i = 0; + } + + return e; +} + +function extendBasis(B, p) { + var i, j; + + if (enclosesWeakAll(p, B)) return [p]; + + // If we get here then B must have at least one element. + for (i = 0; i < B.length; ++i) { + if (enclosesNot(p, B[i]) + && enclosesWeakAll(encloseBasis2(B[i], p), B)) { + return [B[i], p]; + } + } + + // If we get here then B must have at least two elements. + for (i = 0; i < B.length - 1; ++i) { + for (j = i + 1; j < B.length; ++j) { + if (enclosesNot(encloseBasis2(B[i], B[j]), p) + && enclosesNot(encloseBasis2(B[i], p), B[j]) + && enclosesNot(encloseBasis2(B[j], p), B[i]) + && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { + return [B[i], B[j], p]; + } + } + } + + // If we get here then something is very wrong. + throw new Error; +} + +function enclosesNot(a, b) { + var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; + return dr < 0 || dr * dr < dx * dx + dy * dy; +} + +function enclosesWeak(a, b) { + var dr = a.r - b.r + Math.max(a.r, b.r, 1) * 1e-9, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function enclosesWeakAll(a, B) { + for (var i = 0; i < B.length; ++i) { + if (!enclosesWeak(a, B[i])) { + return false; + } + } + return true; +} + +function encloseBasis(B) { + switch (B.length) { + case 1: return encloseBasis1(B[0]); + case 2: return encloseBasis2(B[0], B[1]); + case 3: return encloseBasis3(B[0], B[1], B[2]); + } +} + +function encloseBasis1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; +} + +function encloseBasis2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; +} + +function encloseBasis3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = x1 - x2, + a3 = x1 - x3, + b2 = y1 - y2, + b3 = y1 - y3, + c2 = r2 - r1, + c3 = r3 - r1, + d1 = x1 * x1 + y1 * y1 - r1 * r1, + d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, + d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (r1 + xa * xb + ya * yb), + C = xa * xa + ya * ya - r1 * r1, + r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + return { + x: x1 + xa + xb * r, + y: y1 + ya + yb * r, + r: r + }; +} diff --git a/node_modules/d3-hierarchy/src/pack/index.js b/node_modules/d3-hierarchy/src/pack/index.js new file mode 100644 index 00000000..6ef2d7c9 --- /dev/null +++ b/node_modules/d3-hierarchy/src/pack/index.js @@ -0,0 +1,79 @@ +import {packEnclose} from "./siblings.js"; +import {optional} from "../accessors.js"; +import constant, {constantZero} from "../constant.js"; + +function defaultRadius(d) { + return Math.sqrt(d.value); +} + +export default function() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; + + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } + + pack.radius = function(x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; + + pack.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; + + pack.padding = function(x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant(+x), pack) : padding; + }; + + return pack; +} + +function radiusLeaf(radius) { + return function(node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; +} + +function packChildren(padding, k) { + return function(node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; + + if (r) for (i = 0; i < n; ++i) children[i].r += r; + e = packEnclose(children); + if (r) for (i = 0; i < n; ++i) children[i].r -= r; + node.r = e + r; + } + }; +} + +function translateChild(k) { + return function(node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; +} diff --git a/node_modules/d3-hierarchy/src/pack/siblings.js b/node_modules/d3-hierarchy/src/pack/siblings.js new file mode 100644 index 00000000..05047cfd --- /dev/null +++ b/node_modules/d3-hierarchy/src/pack/siblings.js @@ -0,0 +1,119 @@ +import array from "../array.js"; +import enclose from "./enclose.js"; + +function place(b, a, c) { + var dx = b.x - a.x, x, a2, + dy = b.y - a.y, y, b2, + d2 = dx * dx + dy * dy; + if (d2) { + a2 = a.r + c.r, a2 *= a2; + b2 = b.r + c.r, b2 *= b2; + if (a2 > b2) { + x = (d2 + b2 - a2) / (2 * d2); + y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); + c.x = b.x - x * dx - y * dy; + c.y = b.y - x * dy + y * dx; + } else { + x = (d2 + a2 - b2) / (2 * d2); + y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); + c.x = a.x + x * dx - y * dy; + c.y = a.y + x * dy + y * dx; + } + } else { + c.x = a.x + c.r; + c.y = a.y; + } +} + +function intersects(a, b) { + var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function score(node) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab, + dy = (a.y * b.r + b.y * a.r) / ab; + return dx * dx + dy * dy; +} + +function Node(circle) { + this._ = circle; + this.next = null; + this.previous = null; +} + +export function packEnclose(circles) { + if (!(n = (circles = array(circles)).length)) return 0; + + var a, b, c, n, aa, ca, i, j, k, sj, sk; + + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) return a.r; + + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) return a.r + b.r; + + // Place the third circle. + place(b, a, c = circles[2]); + + // Initialize the front-chain using the first three circles a, b and c. + a = new Node(a), b = new Node(b), c = new Node(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; + + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node(c); + + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness†is determined by linear distance along the front-chain. + // “Ahead†or “behind†is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + sk += k._.r, k = k.previous; + } + } while (j !== k.next); + + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; + + // Compute the new closest circle pair to the centroid. + aa = score(a); + while ((c = c.next) !== b) { + if ((ca = score(c)) < aa) { + a = c, aa = ca; + } + } + b = a.next; + } + + // Compute the enclosing circle of the front chain. + a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a); + + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; + + return c.r; +} + +export default function(circles) { + packEnclose(circles); + return circles; +} diff --git a/node_modules/d3-hierarchy/src/partition.js b/node_modules/d3-hierarchy/src/partition.js new file mode 100644 index 00000000..0165ef73 --- /dev/null +++ b/node_modules/d3-hierarchy/src/partition.js @@ -0,0 +1,52 @@ +import roundNode from "./treemap/round.js"; +import treemapDice from "./treemap/dice.js"; + +export default function() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(dy, n) { + return function(node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + partition.round = function(x) { + return arguments.length ? (round = !!x, partition) : round; + }; + + partition.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; + + partition.padding = function(x) { + return arguments.length ? (padding = +x, partition) : padding; + }; + + return partition; +} diff --git a/node_modules/d3-hierarchy/src/stratify.js b/node_modules/d3-hierarchy/src/stratify.js new file mode 100644 index 00000000..a6676c25 --- /dev/null +++ b/node_modules/d3-hierarchy/src/stratify.js @@ -0,0 +1,75 @@ +import {required} from "./accessors.js"; +import {Node, computeHeight} from "./hierarchy/index.js"; + +var preroot = {depth: -1}, + ambiguous = {}; + +function defaultId(d) { + return d.id; +} + +function defaultParentId(d) { + return d.parentId; +} + +export default function() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var nodes = Array.from(data), + n = nodes.length, + d, + i, + root, + parent, + node, + nodeId, + nodeKey, + nodeByKey = new Map; + + for (i = 0; i < n; ++i) { + d = nodes[i], node = nodes[i] = new Node(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = node.id = nodeId; + nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node); + } + if ((nodeId = parentId(d, i, data)) != null && (nodeId += "")) { + node.parent = nodeId; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (nodeId = node.parent) { + parent = nodeByKey.get(nodeId); + if (!parent) throw new Error("missing: " + nodeId); + if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); + if (parent.children) parent.children.push(node); + else parent.children = [node]; + node.parent = parent; + } else { + if (root) throw new Error("multiple roots"); + root = node; + } + } + + if (!root) throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) throw new Error("cycle"); + + return root; + } + + stratify.id = function(x) { + return arguments.length ? (id = required(x), stratify) : id; + }; + + stratify.parentId = function(x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; + }; + + return stratify; +} diff --git a/node_modules/d3-hierarchy/src/tree.js b/node_modules/d3-hierarchy/src/tree.js new file mode 100644 index 00000000..dc4275e4 --- /dev/null +++ b/node_modules/d3-hierarchy/src/tree.js @@ -0,0 +1,237 @@ +import {Node} from "./hierarchy/index.js"; + +function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } + +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. +function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; +} + +// This function works analogously to nextLeft. +function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; +} + +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. +function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; +} + +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). +function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } +} + +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. +function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; +} + +function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number +} + +TreeNode.prototype = Object.create(Node.prototype); + +function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; + + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; + } + } + } + + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; +} + +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm +export default function() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function(node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + + return root; + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + + tree.separation = function(x) { + return arguments.length ? (separation = x, tree) : separation; + }; + + tree.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; + + tree.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; + + return tree; +} diff --git a/node_modules/d3-hierarchy/src/treemap/binary.js b/node_modules/d3-hierarchy/src/treemap/binary.js new file mode 100644 index 00000000..a9395dc2 --- /dev/null +++ b/node_modules/d3-hierarchy/src/treemap/binary.js @@ -0,0 +1,46 @@ +export default function(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); + + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + + partition(0, n, parent.value, x0, y0, x1, y1); + + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } + + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; + + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) k = mid + 1; + else hi = mid; + } + + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((x1 - x0) > (y1 - y0)) { + var xk = value ? (x0 * valueRight + x1 * valueLeft) / value : x1; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = value ? (y0 * valueRight + y1 * valueLeft) / value : y1; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } + } +} diff --git a/node_modules/d3-hierarchy/src/treemap/dice.js b/node_modules/d3-hierarchy/src/treemap/dice.js new file mode 100644 index 00000000..605c1f66 --- /dev/null +++ b/node_modules/d3-hierarchy/src/treemap/dice.js @@ -0,0 +1,12 @@ +export default function(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } +} diff --git a/node_modules/d3-hierarchy/src/treemap/index.js b/node_modules/d3-hierarchy/src/treemap/index.js new file mode 100644 index 00000000..ccc42c9d --- /dev/null +++ b/node_modules/d3-hierarchy/src/treemap/index.js @@ -0,0 +1,94 @@ +import roundNode from "./round.js"; +import squarify from "./squarify.js"; +import {required} from "../accessors.js"; +import constant, {constantZero} from "../constant.js"; + +export default function() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + + treemap.round = function(x) { + return arguments.length ? (round = !!x, treemap) : round; + }; + + treemap.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; + + treemap.tile = function(x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; + + treemap.padding = function(x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; + + treemap.paddingInner = function(x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant(+x), treemap) : paddingInner; + }; + + treemap.paddingOuter = function(x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; + + treemap.paddingTop = function(x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function(x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function(x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function(x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant(+x), treemap) : paddingLeft; + }; + + return treemap; +} diff --git a/node_modules/d3-hierarchy/src/treemap/resquarify.js b/node_modules/d3-hierarchy/src/treemap/resquarify.js new file mode 100644 index 00000000..de720473 --- /dev/null +++ b/node_modules/d3-hierarchy/src/treemap/resquarify.js @@ -0,0 +1,36 @@ +import treemapDice from "./dice.js"; +import treemapSlice from "./slice.js"; +import {phi, squarifyRatio} from "./squarify.js"; + +export default (function custom(ratio) { + + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; + + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += (y1 - y0) * row.value / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += (x1 - x0) * row.value / value : x1, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } + + resquarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return resquarify; +})(phi); diff --git a/node_modules/d3-hierarchy/src/treemap/round.js b/node_modules/d3-hierarchy/src/treemap/round.js new file mode 100644 index 00000000..7ac45ec2 --- /dev/null +++ b/node_modules/d3-hierarchy/src/treemap/round.js @@ -0,0 +1,6 @@ +export default function(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); +} diff --git a/node_modules/d3-hierarchy/src/treemap/slice.js b/node_modules/d3-hierarchy/src/treemap/slice.js new file mode 100644 index 00000000..1022bfad --- /dev/null +++ b/node_modules/d3-hierarchy/src/treemap/slice.js @@ -0,0 +1,12 @@ +export default function(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; + + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } +} diff --git a/node_modules/d3-hierarchy/src/treemap/sliceDice.js b/node_modules/d3-hierarchy/src/treemap/sliceDice.js new file mode 100644 index 00000000..545ad42b --- /dev/null +++ b/node_modules/d3-hierarchy/src/treemap/sliceDice.js @@ -0,0 +1,6 @@ +import dice from "./dice.js"; +import slice from "./slice.js"; + +export default function(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? slice : dice)(parent, x0, y0, x1, y1); +} diff --git a/node_modules/d3-hierarchy/src/treemap/squarify.js b/node_modules/d3-hierarchy/src/treemap/squarify.js new file mode 100644 index 00000000..f8010703 --- /dev/null +++ b/node_modules/d3-hierarchy/src/treemap/squarify.js @@ -0,0 +1,66 @@ +import treemapDice from "./dice.js"; +import treemapSlice from "./slice.js"; + +export var phi = (1 + Math.sqrt(5)) / 2; + +export function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + + // Find the next non-empty node. + do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + + // Keep adding nodes while the aspect ratio maintains or improves. + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) minValue = nodeValue; + if (nodeValue > maxValue) maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { sumValue -= nodeValue; break; } + minRatio = newRatio; + } + + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + + return rows; +} + +export default (function custom(ratio) { + + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + + squarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return squarify; +})(phi); diff --git a/node_modules/d3-interpolate/LICENSE b/node_modules/d3-interpolate/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-interpolate/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-interpolate/README.md b/node_modules/d3-interpolate/README.md new file mode 100644 index 00000000..a7e72322 --- /dev/null +++ b/node_modules/d3-interpolate/README.md @@ -0,0 +1,258 @@ +# d3-interpolate + +This module provides a variety of interpolation methods for blending between two values. Values may be numbers, colors, strings, arrays, or even deeply-nested objects. For example: + +```js +var i = d3.interpolateNumber(10, 20); +i(0.0); // 10 +i(0.2); // 12 +i(0.5); // 15 +i(1.0); // 20 +``` + +The returned function `i` is called an *interpolator*. Given a starting value *a* and an ending value *b*, it takes a parameter *t* in the domain [0, 1] and returns the corresponding interpolated value between *a* and *b*. An interpolator typically returns a value equivalent to *a* at *t* = 0 and a value equivalent to *b* at *t* = 1. + +You can interpolate more than just numbers. To find the perceptual midpoint between steelblue and brown: + +```js +d3.interpolateLab("steelblue", "brown")(0.5); // "rgb(142, 92, 109)" +``` + +Here’s a more elaborate example demonstrating type inference used by [interpolate](#interpolate): + +```js +var i = d3.interpolate({colors: ["red", "blue"]}, {colors: ["white", "black"]}); +i(0.0); // {colors: ["rgb(255, 0, 0)", "rgb(0, 0, 255)"]} +i(0.5); // {colors: ["rgb(255, 128, 128)", "rgb(0, 0, 128)"]} +i(1.0); // {colors: ["rgb(255, 255, 255)", "rgb(0, 0, 0)"]} +``` + +Note that the generic value interpolator detects not only nested objects and arrays, but also color strings and numbers embedded in strings! + +## Installing + +If you use NPM, `npm install d3-interpolate`. Otherwise, download the [latest release](https://github.com/d3/d3-interpolate/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-interpolate.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. + +In vanilla, a `d3` global is exported. (If using [color interpolation](#color-spaces), also load [d3-color](https://github.com/d3/d3-color).) + +```html + + + +``` + +## API Reference + +# d3.interpolate(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/value.js), [Examples](https://observablehq.com/@d3/d3-interpolate) + +Returns an interpolator between the two arbitrary values *a* and *b*. The interpolator implementation is based on the type of the end value *b*, using the following algorithm: + +1. If *b* is null, undefined or a boolean, use the constant *b*. +2. If *b* is a number, use [interpolateNumber](#interpolateNumber). +3. If *b* is a [color](https://github.com/d3/d3-color/blob/master/README.md#color) or a string coercible to a color, use [interpolateRgb](#interpolateRgb). +4. If *b* is a [date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date), use [interpolateDate](#interpolateDate). +5. If *b* is a string, use [interpolateString](#interpolateString). +6. If *b* is a [typed array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray) of numbers, use [interpolateNumberArray](#interpolateNumberArray). +7. If *b* is a generic [array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray), use [interpolateArray](#interpolateArray). +8. If *b* is coercible to a number, use [interpolateNumber](#interpolateNumber). +9. Use [interpolateObject](#interpolateObject). + +Based on the chosen interpolator, *a* is coerced to the suitable corresponding type. + +# d3.interpolateNumber(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/number.js), [Examples](https://observablehq.com/@d3/d3-interpolatenumber) + +Returns an interpolator between the two numbers *a* and *b*. The returned interpolator is equivalent to: + +```js +function interpolator(t) { + return a * (1 - t) + b * t; +} +``` + +Caution: avoid interpolating to or from the number zero when the interpolator is used to generate a string. When very small values are stringified, they may be converted to scientific notation, which is an invalid attribute or style property value in older browsers. For example, the number `0.0000001` is converted to the string `"1e-7"`. This is particularly noticeable with interpolating opacity. To avoid scientific notation, start or end the transition at 1e-6: the smallest value that is not stringified in scientific notation. + +# d3.interpolateRound(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/round.js), [Examples](https://observablehq.com/@d3/d3-interpolatenumber) + +Returns an interpolator between the two numbers *a* and *b*; the interpolator is similar to [interpolateNumber](#interpolateNumber), except it will round the resulting value to the nearest integer. + +# d3.interpolateString(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/string.js), [Examples](https://observablehq.com/@d3/d3-interpolatestring) + +Returns an interpolator between the two strings *a* and *b*. The string interpolator finds numbers embedded in *a* and *b*, where each number is of the form understood by JavaScript. A few examples of numbers that will be detected within a string: `-1`, `42`, `3.14159`, and `6.0221413e+23`. + +For each number embedded in *b*, the interpolator will attempt to find a corresponding number in *a*. If a corresponding number is found, a numeric interpolator is created using [interpolateNumber](#interpolateNumber). The remaining parts of the string *b* are used as a template: the static parts of the string *b* remain constant for the interpolation, with the interpolated numeric values embedded in the template. + +For example, if *a* is `"300 12px sans-serif"`, and *b* is `"500 36px Comic-Sans"`, two embedded numbers are found. The remaining static parts (of string *b*) are a space between the two numbers (`" "`), and the suffix (`"px Comic-Sans"`). The result of the interpolator at *t* = 0.5 is `"400 24px Comic-Sans"`. + +# d3.interpolateDate(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/date.js), [Examples](https://observablehq.com/@d3/d3-interpolatedate) + +Returns an interpolator between the two [dates](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) *a* and *b*. + +Note: **no defensive copy** of the returned date is created; the same Date instance is returned for every evaluation of the interpolator. No copy is made for performance reasons; interpolators are often part of the inner loop of [animated transitions](https://github.com/d3/d3-transition). + +# d3.interpolateArray(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/array.js), [Examples](https://observablehq.com/@d3/d3-interpolateobject) + +Returns an interpolator between the two arrays *a* and *b*. If *b* is a typed array (e.g., Float64Array), [interpolateNumberArray](#interpolateNumberArray) is called instead. + +Internally, an array template is created that is the same length as *b*. For each element in *b*, if there exists a corresponding element in *a*, a generic interpolator is created for the two elements using [interpolate](#interpolate). If there is no such element, the static value from *b* is used in the template. Then, for the given parameter *t*, the template’s embedded interpolators are evaluated. The updated array template is then returned. + +For example, if *a* is the array `[0, 1]` and *b* is the array `[1, 10, 100]`, then the result of the interpolator for *t* = 0.5 is the array `[0.5, 5.5, 100]`. + +Note: **no defensive copy** of the template array is created; modifications of the returned array may adversely affect subsequent evaluation of the interpolator. No copy is made for performance reasons; interpolators are often part of the inner loop of [animated transitions](https://github.com/d3/d3-transition). + +# d3.interpolateNumberArray(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/numberArray.js), [Examples](https://observablehq.com/@d3/d3-interpolatenumberarray) + +Returns an interpolator between the two arrays of numbers *a* and *b*. Internally, an array template is created that is the same type and length as *b*. For each element in *b*, if there exists a corresponding element in *a*, the values are directly interpolated in the array template. If there is no such element, the static value from *b* is copied. The updated array template is then returned. + +Note: For performance reasons, **no defensive copy** is made of the template array and the arguments *a* and *b*; modifications of these arrays may affect subsequent evaluation of the interpolator. + +# d3.interpolateObject(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/object.js), [Examples](https://observablehq.com/@d3/d3-interpolateobject) + +Returns an interpolator between the two objects *a* and *b*. Internally, an object template is created that has the same properties as *b*. For each property in *b*, if there exists a corresponding property in *a*, a generic interpolator is created for the two elements using [interpolate](#interpolate). If there is no such property, the static value from *b* is used in the template. Then, for the given parameter *t*, the template's embedded interpolators are evaluated and the updated object template is then returned. + +For example, if *a* is the object `{x: 0, y: 1}` and *b* is the object `{x: 1, y: 10, z: 100}`, the result of the interpolator for *t* = 0.5 is the object `{x: 0.5, y: 5.5, z: 100}`. + +Object interpolation is particularly useful for *dataspace interpolation*, where data is interpolated rather than attribute values. For example, you can interpolate an object which describes an arc in a pie chart, and then use [d3.arc](https://github.com/d3/d3-shape/blob/master/README.md#arc) to compute the new SVG path data. + +Note: **no defensive copy** of the template object is created; modifications of the returned object may adversely affect subsequent evaluation of the interpolator. No copy is made for performance reasons; interpolators are often part of the inner loop of [animated transitions](https://github.com/d3/d3-transition). + +# d3.interpolateTransformCss(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/transform/index.js#L62), [Examples](https://observablehq.com/@d3/d3-interpolatetransformcss) + +Returns an interpolator between the two 2D CSS transforms represented by *a* and *b*. Each transform is decomposed to a standard representation of translate, rotate, *x*-skew and scale; these component transformations are then interpolated. This behavior is standardized by CSS: see [matrix decomposition for animation](http://www.w3.org/TR/css3-2d-transforms/#matrix-decomposition). + +# d3.interpolateTransformSvg(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/transform/index.js#L63), [Examples](https://observablehq.com/@d3/d3-interpolatetransformcss) + +Returns an interpolator between the two 2D SVG transforms represented by *a* and *b*. Each transform is decomposed to a standard representation of translate, rotate, *x*-skew and scale; these component transformations are then interpolated. This behavior is standardized by CSS: see [matrix decomposition for animation](http://www.w3.org/TR/css3-2d-transforms/#matrix-decomposition). + +# d3.interpolateZoom(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/zoom.js), [Examples](https://observablehq.com/@d3/d3-interpolatezoom) + +Returns an interpolator between the two views *a* and *b* of a two-dimensional plane, based on [“Smooth and efficient zooming and panningâ€](http://www.win.tue.nl/~vanwijk/zoompan.pdf) by Jarke J. van Wijk and Wim A.A. Nuij. Each view is defined as an array of three numbers: *cx*, *cy* and *width*. The first two coordinates *cx*, *cy* represent the center of the viewport; the last coordinate *width* represents the size of the viewport. + +The returned interpolator exposes a *duration* property which encodes the recommended transition duration in milliseconds. This duration is based on the path length of the curved trajectory through *x,y* space. If you want a slower or faster transition, multiply this by an arbitrary scale factor (V as described in the original paper). + +# *interpolateZoom*.rho(rho) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/zoom.js) + +Given a [zoom interpolator](#interpolateZoom), returns a new zoom interpolator using the specified curvature *rho*. When *rho* is close to 0, the interpolator is almost linear. The default curvature is sqrt(2). + +# d3.interpolateDiscrete(values) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/discrete.js), [Examples](https://observablehq.com/@d3/d3-interpolatediscrete) + +Returns a discrete interpolator for the given array of *values*. The returned interpolator maps *t* in [0, 1 / *n*) to *values*[0], *t* in [1 / *n*, 2 / *n*) to *values*[1], and so on, where *n* = *values*.length. In effect, this is a lightweight [quantize scale](https://github.com/d3/d3-scale/blob/master/README.md#quantize-scales) with a fixed domain of [0, 1]. + +### Sampling + +# d3.quantize(interpolator, n) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/quantize.js), [Examples](https://observablehq.com/@d3/d3-quantize) + +Returns *n* uniformly-spaced samples from the specified *interpolator*, where *n* is an integer greater than one. The first sample is always at *t* = 0, and the last sample is always at *t* = 1. This can be useful in generating a fixed number of samples from a given interpolator, such as to derive the range of a [quantize scale](https://github.com/d3/d3-scale/blob/master/README.md#quantize-scales) from a [continuous interpolator](https://github.com/d3/d3-scale-chromatic/blob/master/README.md#interpolateWarm). + +Caution: this method will not work with interpolators that do not return defensive copies of their output, such as [d3.interpolateArray](#interpolateArray), [d3.interpolateDate](#interpolateDate) and [d3.interpolateObject](#interpolateObject). For those interpolators, you must wrap the interpolator and create a copy for each returned value. + +### Color Spaces + +# d3.interpolateRgb(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/rgb.js), [Examples](https://observablehq.com/@d3/working-with-color) + +rgb + +Or, with a corrected [gamma](#interpolate_gamma) of 2.2: + +rgbGamma + +Returns an RGB color space interpolator between the two colors *a* and *b* with a configurable [gamma](#interpolate_gamma). If the gamma is not specified, it defaults to 1.0. The colors *a* and *b* need not be in RGB; they will be converted to RGB using [d3.rgb](https://github.com/d3/d3-color/blob/master/README.md#rgb). The return value of the interpolator is an RGB string. + +# d3.interpolateRgbBasis(colors) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/rgb.js#L54), [Examples](https://observablehq.com/@d3/working-with-color) + +Returns a uniform nonrational B-spline interpolator through the specified array of *colors*, which are converted to [RGB color space](https://github.com/d3/d3-color/blob/master/README.md#rgb). Implicit control points are generated such that the interpolator returns *colors*[0] at *t* = 0 and *colors*[*colors*.length - 1] at *t* = 1. Opacity interpolation is not currently supported. See also [d3.interpolateBasis](#interpolateBasis), and see [d3-scale-chromatic](https://github.com/d3/d3-scale-chromatic) for examples. + +# d3.interpolateRgbBasisClosed(colors) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/rgb.js#L55), [Examples](https://observablehq.com/@d3/working-with-color) + +Returns a uniform nonrational B-spline interpolator through the specified array of *colors*, which are converted to [RGB color space](https://github.com/d3/d3-color/blob/master/README.md#rgb). The control points are implicitly repeated such that the resulting spline has cyclical C² continuity when repeated around *t* in [0,1]; this is useful, for example, to create cyclical color scales. Opacity interpolation is not currently supported. See also [d3.interpolateBasisClosed](#interpolateBasisClosed), and see [d3-scale-chromatic](https://github.com/d3/d3-scale-chromatic) for examples. + +# d3.interpolateHsl(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/hsl.js), [Examples](https://observablehq.com/@d3/working-with-color) + +hsl + +Returns an HSL color space interpolator between the two colors *a* and *b*. The colors *a* and *b* need not be in HSL; they will be converted to HSL using [d3.hsl](https://github.com/d3/d3-color/blob/master/README.md#hsl). If either color’s hue or saturation is NaN, the opposing color’s channel value is used. The shortest path between hues is used. The return value of the interpolator is an RGB string. + +# d3.interpolateHslLong(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/hsl.js#L21), [Examples](https://observablehq.com/@d3/working-with-color) + +hslLong + +Like [interpolateHsl](#interpolateHsl), but does not use the shortest path between hues. + +# d3.interpolateLab(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/lab.js), [Examples](https://observablehq.com/@d3/working-with-color) + +lab + +Returns a [CIELAB color space](https://en.wikipedia.org/wiki/Lab_color_space#CIELAB) interpolator between the two colors *a* and *b*. The colors *a* and *b* need not be in CIELAB; they will be converted to CIELAB using [d3.lab](https://github.com/d3/d3-color/blob/master/README.md#lab). The return value of the interpolator is an RGB string. + +# d3.interpolateHcl(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/hcl.js), [Examples](https://observablehq.com/@d3/working-with-color) + +hcl + +Returns a [CIELChab color space](https://en.wikipedia.org/wiki/CIELAB_color_space#Cylindrical_representation:_CIELCh_or_CIEHLC) interpolator between the two colors *a* and *b*. The colors *a* and *b* need not be in CIELChab; they will be converted to CIELChab using [d3.hcl](https://github.com/d3/d3-color/blob/master/README.md#hcl). If either color’s hue or chroma is NaN, the opposing color’s channel value is used. The shortest path between hues is used. The return value of the interpolator is an RGB string. + +# d3.interpolateHclLong(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/hcl.js#L21), [Examples](https://observablehq.com/@d3/working-with-color) + +hclLong + +Like [interpolateHcl](#interpolateHcl), but does not use the shortest path between hues. + +# d3.interpolateCubehelix(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/cubehelix.js), [Examples](https://observablehq.com/@d3/working-with-color) + +cubehelix + +Or, with a [gamma](#interpolate_gamma) of 3.0 to emphasize high-intensity values: + +cubehelixGamma + +Returns a Cubehelix color space interpolator between the two colors *a* and *b* using a configurable [gamma](#interpolate_gamma). If the gamma is not specified, it defaults to 1.0. The colors *a* and *b* need not be in Cubehelix; they will be converted to Cubehelix using [d3.cubehelix](https://github.com/d3/d3-color/blob/master/README.md#cubehelix). If either color’s hue or saturation is NaN, the opposing color’s channel value is used. The shortest path between hues is used. The return value of the interpolator is an RGB string. + +# d3.interpolateCubehelixLong(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/cubehelix.js#L29), [Examples](https://observablehq.com/@d3/working-with-color) + +cubehelixLong + +Or, with a [gamma](#interpolate_gamma) of 3.0 to emphasize high-intensity values: + +cubehelixGammaLong + +Like [interpolateCubehelix](#interpolateCubehelix), but does not use the shortest path between hues. + +# interpolate.gamma(gamma) + +Given that *interpolate* is one of [interpolateRgb](#interpolateRgb), [interpolateCubehelix](#interpolateCubehelix) or [interpolateCubehelixLong](#interpolateCubehelixLong), returns a new interpolator factory of the same type using the specified *gamma*. For example, to interpolate from purple to orange with a gamma of 2.2 in RGB space: + +```js +var interpolator = d3.interpolateRgb.gamma(2.2)("purple", "orange"); +``` + +See Eric Brasseur’s article, [Gamma error in picture scaling](http://www.ericbrasseur.org/gamma.html), for more on gamma correction. + +# d3.interpolateHue(a, b) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/hue.js), [Examples](https://observablehq.com/@d3/working-with-color) + +Returns an interpolator between the two hue angles *a* and *b*. If either hue is NaN, the opposing value is used. The shortest path between hues is used. The return value of the interpolator is a number in [0, 360). + +### Splines + +Whereas standard interpolators blend from a starting value *a* at *t* = 0 to an ending value *b* at *t* = 1, spline interpolators smoothly blend multiple input values for *t* in [0,1] using piecewise polynomial functions. Only cubic uniform nonrational [B-splines](https://en.wikipedia.org/wiki/B-spline) are currently supported, also known as basis splines. + +# d3.interpolateBasis(values) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/basis.js), [Examples](https://observablehq.com/@d3/d3-interpolatebasis) + +Returns a uniform nonrational B-spline interpolator through the specified array of *values*, which must be numbers. Implicit control points are generated such that the interpolator returns *values*[0] at *t* = 0 and *values*[*values*.length - 1] at *t* = 1. See also [d3.curveBasis](https://github.com/d3/d3-shape/blob/master/README.md#curveBasis). + +# d3.interpolateBasisClosed(values) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/basisClosed.js), [Examples](https://observablehq.com/@d3/d3-interpolatebasis) + +Returns a uniform nonrational B-spline interpolator through the specified array of *values*, which must be numbers. The control points are implicitly repeated such that the resulting one-dimensional spline has cyclical C² continuity when repeated around *t* in [0,1]. See also [d3.curveBasisClosed](https://github.com/d3/d3-shape/blob/master/README.md#curveBasisClosed). + +### Piecewise + +# d3.piecewise([interpolate, ]values) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/piecewise.js), [Examples](https://observablehq.com/@d3/d3-piecewise) + +Returns a piecewise interpolator, composing interpolators for each adjacent pair of *values*. The returned interpolator maps *t* in [0, 1 / (*n* - 1)] to *interpolate*(*values*[0], *values*[1]), *t* in [1 / (*n* - 1), 2 / (*n* - 1)] to *interpolate*(*values*[1], *values*[2]), and so on, where *n* = *values*.length. In effect, this is a lightweight [linear scale](https://github.com/d3/d3-scale/blob/master/README.md#linear-scales). For example, to blend through red, green and blue: + +```js +var interpolate = d3.piecewise(d3.interpolateRgb.gamma(2.2), ["red", "green", "blue"]); +``` + +If *interpolate* is not specified, defaults to [d3.interpolate](#interpolate). diff --git a/node_modules/d3-interpolate/dist/d3-interpolate.js b/node_modules/d3-interpolate/dist/d3-interpolate.js new file mode 100644 index 00000000..387e7a65 --- /dev/null +++ b/node_modules/d3-interpolate/dist/d3-interpolate.js @@ -0,0 +1,590 @@ +// https://d3js.org/d3-interpolate/ v2.0.1 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-color')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-color'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); +}(this, function (exports, d3Color) { 'use strict'; + +function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; +} + +function basis$1(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +function basisClosed(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +var constant = x => () => x; + +function linear(a, d) { + return function(t) { + return a + t * d; + }; +} + +function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { + return Math.pow(a + t * b, y); + }; +} + +function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); +} + +function gamma(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a); + }; +} + +function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant(isNaN(a) ? b : a); +} + +var rgb = (function rgbGamma(y) { + var color = gamma(y); + + function rgb(start, end) { + var r = color((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb.gamma = rgbGamma; + + return rgb; +})(1); + +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color; + for (i = 0; i < n; ++i) { + color = d3Color.rgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function(t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ""; + }; + }; +} + +var rgbBasis = rgbSpline(basis$1); +var rgbBasisClosed = rgbSpline(basisClosed); + +function numberArray(a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function(t) { + for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; +} + +function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); +} + +function array(a, b) { + return (isNumberArray(b) ? numberArray : genericArray)(a, b); +} + +function genericArray(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; + + return function(t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; +} + +function date(a, b) { + var d = new Date; + return a = +a, b = +b, function(t) { + return d.setTime(a * (1 - t) + b * t), d; + }; +} + +function number(a, b) { + return a = +a, b = +b, function(t) { + return a * (1 - t) + b * t; + }; +} + +function object(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + + for (k in b) { + if (k in a) { + i[k] = value(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; +} + +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); + +function zero(b) { + return function() { + return b; + }; +} + +function one(b) { + return function(t) { + return b(t) + ""; + }; +} + +function string(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: number(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); +} + +function value(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant(b) + : (t === "number" ? number + : t === "string" ? ((c = d3Color.color(b)) ? (b = c, rgb) : string) + : b instanceof d3Color.color ? rgb + : b instanceof Date ? date + : isNumberArray(b) ? numberArray + : Array.isArray(b) ? genericArray + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object + : number)(a, b); +} + +function discrete(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} + +function hue$1(a, b) { + var i = hue(+a, +b); + return function(t) { + var x = i(t); + return x - 360 * Math.floor(x / 360); + }; +} + +function round(a, b) { + return a = +a, b = +b, function(t) { + return Math.round(a * (1 - t) + b * t); + }; +} + +var degrees = 180 / Math.PI; + +var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; + +function decompose(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; +} + +var svgNode; + +/* eslint-disable no-undef */ +function parseCss(value) { + const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f); +} + +function parseSvg(value) { + if (value == null) return identity; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); +} + +function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function(a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} + +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +var epsilon2 = 1e-12; + +function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; +} + +function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; +} + +function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); +} + +var zoom = (function zoomRho(rho, rho2, rho4) { + + // p0 = [ux0, uy0, w0] + // p1 = [ux1, uy1, w1] + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000 * rho / Math.SQRT2; + + return i; + } + + zoom.rho = function(_) { + var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; + return zoomRho(_1, _2, _4); + }; + + return zoom; +})(Math.SQRT2, 2, 4); + +function hsl(hue) { + return function(start, end) { + var h = hue((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hsl$1 = hsl(hue); +var hslLong = hsl(nogamma); + +function lab(start, end) { + var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; +} + +function hcl(hue) { + return function(start, end) { + var h = hue((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hcl$1 = hcl(hue); +var hclLong = hcl(nogamma); + +function cubehelix(hue) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix(start, end) { + var h = hue((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix.gamma = cubehelixGamma; + + return cubehelix; + })(1); +} + +var cubehelix$1 = cubehelix(hue); +var cubehelixLong = cubehelix(nogamma); + +function piecewise(interpolate, values) { + if (values === undefined) values = interpolate, interpolate = value; + var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); + while (i < n) I[i] = interpolate(v, v = values[++i]); + return function(t) { + var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); + return I[i](t - i); + }; +} + +function quantize(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; +} + +exports.interpolate = value; +exports.interpolateArray = array; +exports.interpolateBasis = basis$1; +exports.interpolateBasisClosed = basisClosed; +exports.interpolateCubehelix = cubehelix$1; +exports.interpolateCubehelixLong = cubehelixLong; +exports.interpolateDate = date; +exports.interpolateDiscrete = discrete; +exports.interpolateHcl = hcl$1; +exports.interpolateHclLong = hclLong; +exports.interpolateHsl = hsl$1; +exports.interpolateHslLong = hslLong; +exports.interpolateHue = hue$1; +exports.interpolateLab = lab; +exports.interpolateNumber = number; +exports.interpolateNumberArray = numberArray; +exports.interpolateObject = object; +exports.interpolateRgb = rgb; +exports.interpolateRgbBasis = rgbBasis; +exports.interpolateRgbBasisClosed = rgbBasisClosed; +exports.interpolateRound = round; +exports.interpolateString = string; +exports.interpolateTransformCss = interpolateTransformCss; +exports.interpolateTransformSvg = interpolateTransformSvg; +exports.interpolateZoom = zoom; +exports.piecewise = piecewise; +exports.quantize = quantize; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-interpolate/dist/d3-interpolate.min.js b/node_modules/d3-interpolate/dist/d3-interpolate.min.js new file mode 100644 index 00000000..46dd1c0e --- /dev/null +++ b/node_modules/d3-interpolate/dist/d3-interpolate.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-interpolate/ v2.0.1 Copyright 2020 Mike Bostock +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("d3-color")):"function"==typeof define&&define.amd?define(["exports","d3-color"],n):n((t=t||self).d3=t.d3||{},t.d3)}(this,function(t,n){"use strict";function r(t,n,r,e,a){var o=t*t,u=o*t;return((1-3*t+3*o-u)*n+(4-6*o+3*u)*r+(1+3*t+3*o-3*u)*e+u*a)/6}function e(t){var n=t.length-1;return function(e){var a=e<=0?e=0:e>=1?(e=1,n-1):Math.floor(e*n),o=t[a],u=t[a+1],i=a>0?t[a-1]:2*o-u,c=a()=>t;function u(t,n){return function(r){return t+r*n}}function i(t,n){var r=n-t;return r?u(t,r>180||r<-180?r-360*Math.round(r/360):r):o(isNaN(t)?n:t)}function c(t){return 1==(t=+t)?l:function(n,r){return r-n?function(t,n,r){return t=Math.pow(t,r),n=Math.pow(n,r)-t,r=1/r,function(e){return Math.pow(t+e*n,r)}}(n,r,t):o(isNaN(n)?r:n)}}function l(t,n){var r=n-t;return r?u(t,r):o(isNaN(t)?n:t)}var f=function t(r){var e=c(r);function a(t,r){var a=e((t=n.rgb(t)).r,(r=n.rgb(r)).r),o=e(t.g,r.g),u=e(t.b,r.b),i=l(t.opacity,r.opacity);return function(n){return t.r=a(n),t.g=o(n),t.b=u(n),t.opacity=i(n),t+""}}return a.gamma=t,a}(1);function s(t){return function(r){var e,a,o=r.length,u=new Array(o),i=new Array(o),c=new Array(o);for(e=0;eo&&(a=n.slice(o,a),i[u]?i[u]+=a:i[++u]=a),(r=r[0])===(e=e[0])?i[u]?i[u]+=e:i[++u]=e:(i[++u]=null,c.push({i:u,x:x(r,e)})),o=w.lastIndex;return o180?n+=360:n-t>180&&(t+=360),o.push({i:r.push(a(r)+"rotate(",null,e)-2,x:x(t,n)})):n&&r.push(a(r)+"rotate("+n+e)}(o.rotate,u.rotate,i,c),function(t,n,r,o){t!==n?o.push({i:r.push(a(r)+"skewX(",null,e)-2,x:x(t,n)}):n&&r.push(a(r)+"skewX("+n+e)}(o.skewX,u.skewX,i,c),function(t,n,r,e,o,u){if(t!==r||n!==e){var i=o.push(a(o)+"scale(",null,",",null,")");u.push({i:i-4,x:x(t,r)},{i:i-2,x:x(n,e)})}else 1===r&&1===e||o.push(a(o)+"scale("+r+","+e+")")}(o.scaleX,o.scaleY,u.scaleX,u.scaleY,i,c),o=u=null,function(t){for(var n,r=-1,e=c.length;++r= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} diff --git a/node_modules/d3-interpolate/src/basisClosed.js b/node_modules/d3-interpolate/src/basisClosed.js new file mode 100644 index 00000000..2639d928 --- /dev/null +++ b/node_modules/d3-interpolate/src/basisClosed.js @@ -0,0 +1,13 @@ +import {basis} from "./basis.js"; + +export default function(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} diff --git a/node_modules/d3-interpolate/src/color.js b/node_modules/d3-interpolate/src/color.js new file mode 100644 index 00000000..4630fb2f --- /dev/null +++ b/node_modules/d3-interpolate/src/color.js @@ -0,0 +1,29 @@ +import constant from "./constant.js"; + +function linear(a, d) { + return function(t) { + return a + t * d; + }; +} + +function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { + return Math.pow(a + t * b, y); + }; +} + +export function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); +} + +export function gamma(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a); + }; +} + +export default function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant(isNaN(a) ? b : a); +} diff --git a/node_modules/d3-interpolate/src/constant.js b/node_modules/d3-interpolate/src/constant.js new file mode 100644 index 00000000..3487c0dd --- /dev/null +++ b/node_modules/d3-interpolate/src/constant.js @@ -0,0 +1 @@ +export default x => () => x; diff --git a/node_modules/d3-interpolate/src/cubehelix.js b/node_modules/d3-interpolate/src/cubehelix.js new file mode 100644 index 00000000..2c4f64bd --- /dev/null +++ b/node_modules/d3-interpolate/src/cubehelix.js @@ -0,0 +1,29 @@ +import {cubehelix as colorCubehelix} from "d3-color"; +import color, {hue} from "./color.js"; + +function cubehelix(hue) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix(start, end) { + var h = hue((start = colorCubehelix(start)).h, (end = colorCubehelix(end)).h), + s = color(start.s, end.s), + l = color(start.l, end.l), + opacity = color(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix.gamma = cubehelixGamma; + + return cubehelix; + })(1); +} + +export default cubehelix(hue); +export var cubehelixLong = cubehelix(color); diff --git a/node_modules/d3-interpolate/src/date.js b/node_modules/d3-interpolate/src/date.js new file mode 100644 index 00000000..cdfbea79 --- /dev/null +++ b/node_modules/d3-interpolate/src/date.js @@ -0,0 +1,6 @@ +export default function(a, b) { + var d = new Date; + return a = +a, b = +b, function(t) { + return d.setTime(a * (1 - t) + b * t), d; + }; +} diff --git a/node_modules/d3-interpolate/src/discrete.js b/node_modules/d3-interpolate/src/discrete.js new file mode 100644 index 00000000..b3d1e3b6 --- /dev/null +++ b/node_modules/d3-interpolate/src/discrete.js @@ -0,0 +1,6 @@ +export default function(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} diff --git a/node_modules/d3-interpolate/src/hcl.js b/node_modules/d3-interpolate/src/hcl.js new file mode 100644 index 00000000..03125802 --- /dev/null +++ b/node_modules/d3-interpolate/src/hcl.js @@ -0,0 +1,21 @@ +import {hcl as colorHcl} from "d3-color"; +import color, {hue} from "./color.js"; + +function hcl(hue) { + return function(start, end) { + var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h), + c = color(start.c, end.c), + l = color(start.l, end.l), + opacity = color(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +export default hcl(hue); +export var hclLong = hcl(color); diff --git a/node_modules/d3-interpolate/src/hsl.js b/node_modules/d3-interpolate/src/hsl.js new file mode 100644 index 00000000..2f78a901 --- /dev/null +++ b/node_modules/d3-interpolate/src/hsl.js @@ -0,0 +1,21 @@ +import {hsl as colorHsl} from "d3-color"; +import color, {hue} from "./color.js"; + +function hsl(hue) { + return function(start, end) { + var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h), + s = color(start.s, end.s), + l = color(start.l, end.l), + opacity = color(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +export default hsl(hue); +export var hslLong = hsl(color); diff --git a/node_modules/d3-interpolate/src/hue.js b/node_modules/d3-interpolate/src/hue.js new file mode 100644 index 00000000..5d8d4b9c --- /dev/null +++ b/node_modules/d3-interpolate/src/hue.js @@ -0,0 +1,9 @@ +import {hue} from "./color.js"; + +export default function(a, b) { + var i = hue(+a, +b); + return function(t) { + var x = i(t); + return x - 360 * Math.floor(x / 360); + }; +} diff --git a/node_modules/d3-interpolate/src/index.js b/node_modules/d3-interpolate/src/index.js new file mode 100644 index 00000000..b4dce7d5 --- /dev/null +++ b/node_modules/d3-interpolate/src/index.js @@ -0,0 +1,21 @@ +export {default as interpolate} from "./value.js"; +export {default as interpolateArray} from "./array.js"; +export {default as interpolateBasis} from "./basis.js"; +export {default as interpolateBasisClosed} from "./basisClosed.js"; +export {default as interpolateDate} from "./date.js"; +export {default as interpolateDiscrete} from "./discrete.js"; +export {default as interpolateHue} from "./hue.js"; +export {default as interpolateNumber} from "./number.js"; +export {default as interpolateNumberArray} from "./numberArray.js"; +export {default as interpolateObject} from "./object.js"; +export {default as interpolateRound} from "./round.js"; +export {default as interpolateString} from "./string.js"; +export {interpolateTransformCss, interpolateTransformSvg} from "./transform/index.js"; +export {default as interpolateZoom} from "./zoom.js"; +export {default as interpolateRgb, rgbBasis as interpolateRgbBasis, rgbBasisClosed as interpolateRgbBasisClosed} from "./rgb.js"; +export {default as interpolateHsl, hslLong as interpolateHslLong} from "./hsl.js"; +export {default as interpolateLab} from "./lab.js"; +export {default as interpolateHcl, hclLong as interpolateHclLong} from "./hcl.js"; +export {default as interpolateCubehelix, cubehelixLong as interpolateCubehelixLong} from "./cubehelix.js"; +export {default as piecewise} from "./piecewise.js"; +export {default as quantize} from "./quantize.js"; diff --git a/node_modules/d3-interpolate/src/lab.js b/node_modules/d3-interpolate/src/lab.js new file mode 100644 index 00000000..8fbf7f35 --- /dev/null +++ b/node_modules/d3-interpolate/src/lab.js @@ -0,0 +1,16 @@ +import {lab as colorLab} from "d3-color"; +import color from "./color.js"; + +export default function lab(start, end) { + var l = color((start = colorLab(start)).l, (end = colorLab(end)).l), + a = color(start.a, end.a), + b = color(start.b, end.b), + opacity = color(start.opacity, end.opacity); + return function(t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; +} diff --git a/node_modules/d3-interpolate/src/number.js b/node_modules/d3-interpolate/src/number.js new file mode 100644 index 00000000..837b13db --- /dev/null +++ b/node_modules/d3-interpolate/src/number.js @@ -0,0 +1,5 @@ +export default function(a, b) { + return a = +a, b = +b, function(t) { + return a * (1 - t) + b * t; + }; +} diff --git a/node_modules/d3-interpolate/src/numberArray.js b/node_modules/d3-interpolate/src/numberArray.js new file mode 100644 index 00000000..4081086c --- /dev/null +++ b/node_modules/d3-interpolate/src/numberArray.js @@ -0,0 +1,14 @@ +export default function(a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function(t) { + for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; +} + +export function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); +} diff --git a/node_modules/d3-interpolate/src/object.js b/node_modules/d3-interpolate/src/object.js new file mode 100644 index 00000000..b521c337 --- /dev/null +++ b/node_modules/d3-interpolate/src/object.js @@ -0,0 +1,23 @@ +import value from "./value.js"; + +export default function(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + + for (k in b) { + if (k in a) { + i[k] = value(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; +} diff --git a/node_modules/d3-interpolate/src/piecewise.js b/node_modules/d3-interpolate/src/piecewise.js new file mode 100644 index 00000000..8b568c5f --- /dev/null +++ b/node_modules/d3-interpolate/src/piecewise.js @@ -0,0 +1,11 @@ +import {default as value} from "./value.js"; + +export default function piecewise(interpolate, values) { + if (values === undefined) values = interpolate, interpolate = value; + var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); + while (i < n) I[i] = interpolate(v, v = values[++i]); + return function(t) { + var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); + return I[i](t - i); + }; +} diff --git a/node_modules/d3-interpolate/src/quantize.js b/node_modules/d3-interpolate/src/quantize.js new file mode 100644 index 00000000..d7c23e69 --- /dev/null +++ b/node_modules/d3-interpolate/src/quantize.js @@ -0,0 +1,5 @@ +export default function(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; +} diff --git a/node_modules/d3-interpolate/src/rgb.js b/node_modules/d3-interpolate/src/rgb.js new file mode 100644 index 00000000..495c1f8c --- /dev/null +++ b/node_modules/d3-interpolate/src/rgb.js @@ -0,0 +1,55 @@ +import {rgb as colorRgb} from "d3-color"; +import basis from "./basis.js"; +import basisClosed from "./basisClosed.js"; +import nogamma, {gamma} from "./color.js"; + +export default (function rgbGamma(y) { + var color = gamma(y); + + function rgb(start, end) { + var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb.gamma = rgbGamma; + + return rgb; +})(1); + +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color; + for (i = 0; i < n; ++i) { + color = colorRgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function(t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ""; + }; + }; +} + +export var rgbBasis = rgbSpline(basis); +export var rgbBasisClosed = rgbSpline(basisClosed); diff --git a/node_modules/d3-interpolate/src/round.js b/node_modules/d3-interpolate/src/round.js new file mode 100644 index 00000000..2635d28c --- /dev/null +++ b/node_modules/d3-interpolate/src/round.js @@ -0,0 +1,5 @@ +export default function(a, b) { + return a = +a, b = +b, function(t) { + return Math.round(a * (1 - t) + b * t); + }; +} diff --git a/node_modules/d3-interpolate/src/string.js b/node_modules/d3-interpolate/src/string.js new file mode 100644 index 00000000..7f04d2d0 --- /dev/null +++ b/node_modules/d3-interpolate/src/string.js @@ -0,0 +1,64 @@ +import number from "./number.js"; + +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); + +function zero(b) { + return function() { + return b; + }; +} + +function one(b) { + return function(t) { + return b(t) + ""; + }; +} + +export default function(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: number(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); +} diff --git a/node_modules/d3-interpolate/src/transform/decompose.js b/node_modules/d3-interpolate/src/transform/decompose.js new file mode 100644 index 00000000..3535f231 --- /dev/null +++ b/node_modules/d3-interpolate/src/transform/decompose.js @@ -0,0 +1,26 @@ +var degrees = 180 / Math.PI; + +export var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; + +export default function(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; +} diff --git a/node_modules/d3-interpolate/src/transform/index.js b/node_modules/d3-interpolate/src/transform/index.js new file mode 100644 index 00000000..5383d5f8 --- /dev/null +++ b/node_modules/d3-interpolate/src/transform/index.js @@ -0,0 +1,63 @@ +import number from "../number.js"; +import {parseCss, parseSvg} from "./parse.js"; + +function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function(a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} + +export var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +export var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); diff --git a/node_modules/d3-interpolate/src/transform/parse.js b/node_modules/d3-interpolate/src/transform/parse.js new file mode 100644 index 00000000..c62088e0 --- /dev/null +++ b/node_modules/d3-interpolate/src/transform/parse.js @@ -0,0 +1,18 @@ +import decompose, {identity} from "./decompose.js"; + +var svgNode; + +/* eslint-disable no-undef */ +export function parseCss(value) { + const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f); +} + +export function parseSvg(value) { + if (value == null) return identity; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); +} diff --git a/node_modules/d3-interpolate/src/value.js b/node_modules/d3-interpolate/src/value.js new file mode 100644 index 00000000..6a67ac4a --- /dev/null +++ b/node_modules/d3-interpolate/src/value.js @@ -0,0 +1,22 @@ +import {color} from "d3-color"; +import rgb from "./rgb.js"; +import {genericArray} from "./array.js"; +import date from "./date.js"; +import number from "./number.js"; +import object from "./object.js"; +import string from "./string.js"; +import constant from "./constant.js"; +import numberArray, {isNumberArray} from "./numberArray.js"; + +export default function(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant(b) + : (t === "number" ? number + : t === "string" ? ((c = color(b)) ? (b = c, rgb) : string) + : b instanceof color ? rgb + : b instanceof Date ? date + : isNumberArray(b) ? numberArray + : Array.isArray(b) ? genericArray + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object + : number)(a, b); +} diff --git a/node_modules/d3-interpolate/src/zoom.js b/node_modules/d3-interpolate/src/zoom.js new file mode 100644 index 00000000..f2756026 --- /dev/null +++ b/node_modules/d3-interpolate/src/zoom.js @@ -0,0 +1,71 @@ +var epsilon2 = 1e-12; + +function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; +} + +function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; +} + +function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); +} + +export default (function zoomRho(rho, rho2, rho4) { + + // p0 = [ux0, uy0, w0] + // p1 = [ux1, uy1, w1] + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + } + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + } + } + + i.duration = S * 1000 * rho / Math.SQRT2; + + return i; + } + + zoom.rho = function(_) { + var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; + return zoomRho(_1, _2, _4); + }; + + return zoom; +})(Math.SQRT2, 2, 4); diff --git a/node_modules/d3-path/LICENSE b/node_modules/d3-path/LICENSE new file mode 100644 index 00000000..576b910b --- /dev/null +++ b/node_modules/d3-path/LICENSE @@ -0,0 +1,27 @@ +Copyright 2015-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-path/README.md b/node_modules/d3-path/README.md new file mode 100644 index 00000000..63f326a7 --- /dev/null +++ b/node_modules/d3-path/README.md @@ -0,0 +1,78 @@ +# d3-path + +Say you have some code that draws to a 2D canvas: + +```js +function drawCircle(context, radius) { + context.moveTo(radius, 0); + context.arc(0, 0, radius, 0, 2 * Math.PI); +} +``` + +The d3-path module lets you take this exact code and additionally render to [SVG](http://www.w3.org/TR/SVG/paths.html). It works by [serializing](#path_toString) [CanvasPathMethods](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls to [SVG path data](http://www.w3.org/TR/SVG/paths.html#PathData). For example: + +```js +var context = d3.path(); +drawCircle(context, 40); +pathElement.setAttribute("d", context.toString()); +``` + +Now code you write once can be used with both Canvas (for performance) and SVG (for convenience). For a practical example, see [d3-shape](https://github.com/d3/d3-shape). + +## Installing + +If you use NPM, `npm install d3-path`. Otherwise, download the [latest release](https://github.com/d3/d3-path/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-path.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +## API Reference + +# d3.path() · [Source](https://github.com/d3/d3-path/blob/master/src/path.js), [Examples](https://observablehq.com/@d3/d3-path) + +Constructs a new path serializer that implements [CanvasPathMethods](http://www.w3.org/TR/2dcontext/#canvaspathmethods). + +# path.moveTo(x, y) + +Move to the specified point ⟨*x*, *y*⟩. Equivalent to [*context*.moveTo](http://www.w3.org/TR/2dcontext/#dom-context-2d-moveto) and SVG’s [“moveto†command](http://www.w3.org/TR/SVG/paths.html#PathDataMovetoCommands). + +# path.closePath() + +Ends the current subpath and causes an automatic straight line to be drawn from the current point to the initial point of the current subpath. Equivalent to [*context*.closePath](http://www.w3.org/TR/2dcontext/#dom-context-2d-closepath) and SVG’s [“closepath†command](http://www.w3.org/TR/SVG/paths.html#PathDataClosePathCommand). + +# path.lineTo(x, y) + +Draws a straight line from the current point to the specified point ⟨*x*, *y*⟩. Equivalent to [*context*.lineTo](http://www.w3.org/TR/2dcontext/#dom-context-2d-lineto) and SVG’s [“lineto†command](http://www.w3.org/TR/SVG/paths.html#PathDataLinetoCommands). + +# path.quadraticCurveTo(cpx, cpy, x, y) + +Draws a quadratic Bézier segment from the current point to the specified point ⟨*x*, *y*⟩, with the specified control point ⟨*cpx*, *cpy*⟩. Equivalent to [*context*.quadraticCurveTo](http://www.w3.org/TR/2dcontext/#dom-context-2d-quadraticcurveto) and SVG’s [quadratic Bézier curve commands](http://www.w3.org/TR/SVG/paths.html#PathDataQuadraticBezierCommands). + +# path.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x, y) + +Draws a cubic Bézier segment from the current point to the specified point ⟨*x*, *y*⟩, with the specified control points ⟨*cpx1*, *cpy1*⟩ and ⟨*cpx2*, *cpy2*⟩. Equivalent to [*context*.bezierCurveTo](http://www.w3.org/TR/2dcontext/#dom-context-2d-beziercurveto) and SVG’s [cubic Bézier curve commands](http://www.w3.org/TR/SVG/paths.html#PathDataCubicBezierCommands). + +# path.arcTo(x1, y1, x2, y2, radius) + +Draws a circular arc segment with the specified *radius* that starts tangent to the line between the current point and the specified point ⟨*x1*, *y1*⟩ and ends tangent to the line between the specified points ⟨*x1*, *y1*⟩ and ⟨*x2*, *y2*⟩. If the first tangent point is not equal to the current point, a straight line is drawn between the current point and the first tangent point. Equivalent to [*context*.arcTo](http://www.w3.org/TR/2dcontext/#dom-context-2d-arcto) and uses SVG’s [elliptical arc curve commands](http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands). + +# path.arc(x, y, radius, startAngle, endAngle[, anticlockwise]) + +Draws a circular arc segment with the specified center ⟨*x*, *y*⟩, *radius*, *startAngle* and *endAngle*. If *anticlockwise* is true, the arc is drawn in the anticlockwise direction; otherwise, it is drawn in the clockwise direction. If the current point is not equal to the starting point of the arc, a straight line is drawn from the current point to the start of the arc. Equivalent to [*context*.arc](http://www.w3.org/TR/2dcontext/#dom-context-2d-arc) and uses SVG’s [elliptical arc curve commands](http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands). + +# path.rect(x, y, w, h) + +Creates a new subpath containing just the four points ⟨*x*, *y*⟩, ⟨*x* + *w*, *y*⟩, ⟨*x* + *w*, *y* + *h*⟩, ⟨*x*, *y* + *h*⟩, with those four points connected by straight lines, and then marks the subpath as closed. Equivalent to [*context*.rect](http://www.w3.org/TR/2dcontext/#dom-context-2d-rect) and uses SVG’s [“lineto†commands](http://www.w3.org/TR/SVG/paths.html#PathDataLinetoCommands). + +# path.toString() + +Returns the string representation of this *path* according to SVG’s [path data specification](http://www.w3.org/TR/SVG/paths.html#PathData). diff --git a/node_modules/d3-path/dist/d3-path.js b/node_modules/d3-path/dist/d3-path.js new file mode 100644 index 00000000..14086ca3 --- /dev/null +++ b/node_modules/d3-path/dist/d3-path.js @@ -0,0 +1,141 @@ +// https://d3js.org/d3-path/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +const pi = Math.PI, + tau = 2 * pi, + epsilon = 1e-6, + tauEpsilon = tau - epsilon; + +function Path() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; +} + +function path() { + return new Path; +} + +Path.prototype = path.prototype = { + constructor: Path, + moveTo: function(x, y) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); + }, + closePath: function() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + }, + lineTo: function(x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function(x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { + this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + arcTo: function(x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon)); + + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; + + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + + this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function(x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r, ccw = !!ccw; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; + } + + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) { + this._ += "L" + x0 + "," + y0; + } + + // Is this arc empty? We’re done. + if (!r) return; + + // Does the angle go the wrong way? Flip the direction. + if (da < 0) da = da % tau + tau; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } + + // Is this arc non-empty? Draw an arc! + else if (da > epsilon) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function(x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function() { + return this._; + } +}; + +exports.path = path; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-path/dist/d3-path.min.js b/node_modules/d3-path/dist/d3-path.min.js new file mode 100644 index 00000000..88628d09 --- /dev/null +++ b/node_modules/d3-path/dist/d3-path.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-path/ v2.0.0 Copyright 2020 Mike Bostock +!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i((t=t||self).d3=t.d3||{})}(this,function(t){"use strict";const i=Math.PI,s=2*i,h=s-1e-6;function e(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function _(){return new e}e.prototype=_.prototype={constructor:e,moveTo:function(t,i){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+i)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,i){this._+="L"+(this._x1=+t)+","+(this._y1=+i)},quadraticCurveTo:function(t,i,s,h){this._+="Q"+ +t+","+ +i+","+(this._x1=+s)+","+(this._y1=+h)},bezierCurveTo:function(t,i,s,h,e,_){this._+="C"+ +t+","+ +i+","+ +s+","+ +h+","+(this._x1=+e)+","+(this._y1=+_)},arcTo:function(t,s,h,e,_){t=+t,s=+s,h=+h,e=+e,_=+_;var n=this._x1,o=this._y1,r=h-t,a=e-s,u=n-t,c=o-s,f=u*u+c*c;if(_<0)throw new Error("negative radius: "+_);if(null===this._x1)this._+="M"+(this._x1=t)+","+(this._y1=s);else if(f>1e-6)if(Math.abs(c*r-a*u)>1e-6&&_){var x=h-n,y=e-o,M=r*r+a*a,l=x*x+y*y,d=Math.sqrt(M),p=Math.sqrt(f),v=_*Math.tan((i-Math.acos((M+f-l)/(2*d*p)))/2),b=v/p,w=v/d;Math.abs(b-1)>1e-6&&(this._+="L"+(t+b*u)+","+(s+b*c)),this._+="A"+_+","+_+",0,0,"+ +(c*x>u*y)+","+(this._x1=t+w*r)+","+(this._y1=s+w*a)}else this._+="L"+(this._x1=t)+","+(this._y1=s);else;},arc:function(t,e,_,n,o,r){t=+t,e=+e,r=!!r;var a=(_=+_)*Math.cos(n),u=_*Math.sin(n),c=t+a,f=e+u,x=1^r,y=r?n-o:o-n;if(_<0)throw new Error("negative radius: "+_);null===this._x1?this._+="M"+c+","+f:(Math.abs(this._x1-c)>1e-6||Math.abs(this._y1-f)>1e-6)&&(this._+="L"+c+","+f),_&&(y<0&&(y=y%s+s),y>h?this._+="A"+_+","+_+",0,1,"+x+","+(t-a)+","+(e-u)+"A"+_+","+_+",0,1,"+x+","+(this._x1=c)+","+(this._y1=f):y>1e-6&&(this._+="A"+_+","+_+",0,"+ +(y>=i)+","+x+","+(this._x1=t+_*Math.cos(o))+","+(this._y1=e+_*Math.sin(o))))},rect:function(t,i,s,h){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+i)+"h"+ +s+"v"+ +h+"h"+-s+"Z"},toString:function(){return this._}},t.path=_,Object.defineProperty(t,"__esModule",{value:!0})}); diff --git a/node_modules/d3-path/package.json b/node_modules/d3-path/package.json new file mode 100644 index 00000000..66b51e9a --- /dev/null +++ b/node_modules/d3-path/package.json @@ -0,0 +1,77 @@ +{ + "_from": "d3-path@2", + "_id": "d3-path@2.0.0", + "_inBundle": false, + "_integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==", + "_location": "/d3-path", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-path@2", + "name": "d3-path", + "escapedName": "d3-path", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3", + "/d3-chord", + "/d3-shape" + ], + "_resolved": "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz", + "_shasum": "55d86ac131a0548adae241eebfb56b4582dd09d8", + "_spec": "d3-path@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-path/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Serialize Canvas path commands to SVG.", + "devDependencies": { + "eslint": "6", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-path/", + "jsdelivr": "dist/d3-path.min.js", + "keywords": [ + "d3", + "d3-module", + "canvas", + "path", + "svg", + "graphics", + "CanvasRenderingContext2D", + "CanvasPathMethods", + "Path2D" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-path.js", + "module": "src/index.js", + "name": "d3-path", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-path.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src test" + }, + "sideEffects": false, + "unpkg": "dist/d3-path.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-path/src/index.js b/node_modules/d3-path/src/index.js new file mode 100644 index 00000000..968e6e58 --- /dev/null +++ b/node_modules/d3-path/src/index.js @@ -0,0 +1 @@ +export {default as path} from "./path.js"; diff --git a/node_modules/d3-path/src/path.js b/node_modules/d3-path/src/path.js new file mode 100644 index 00000000..28f1f666 --- /dev/null +++ b/node_modules/d3-path/src/path.js @@ -0,0 +1,130 @@ +const pi = Math.PI, + tau = 2 * pi, + epsilon = 1e-6, + tauEpsilon = tau - epsilon; + +function Path() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; +} + +function path() { + return new Path; +} + +Path.prototype = path.prototype = { + constructor: Path, + moveTo: function(x, y) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); + }, + closePath: function() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + }, + lineTo: function(x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function(x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { + this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + arcTo: function(x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon)); + + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; + + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + + this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function(x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r, ccw = !!ccw; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; + } + + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) { + this._ += "L" + x0 + "," + y0; + } + + // Is this arc empty? We’re done. + if (!r) return; + + // Does the angle go the wrong way? Flip the direction. + if (da < 0) da = da % tau + tau; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } + + // Is this arc non-empty? Draw an arc! + else if (da > epsilon) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function(x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function() { + return this._; + } +}; + +export default path; diff --git a/node_modules/d3-polygon/LICENSE b/node_modules/d3-polygon/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-polygon/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-polygon/README.md b/node_modules/d3-polygon/README.md new file mode 100644 index 00000000..4c0736d4 --- /dev/null +++ b/node_modules/d3-polygon/README.md @@ -0,0 +1,40 @@ +# d3-polygon + +This module provides a few basic geometric operations for two-dimensional polygons. Each polygon is represented as an array of two-element arrays [​[x1, y1], [x2, y2], …], and may either be closed (wherein the first and last point are the same) or open (wherein they are not). Typically polygons are in counterclockwise order, assuming a coordinate system where the origin ⟨0,0⟩ is in the top-left corner. + +## Installing + +If you use NPM, `npm install d3-polygon`. Otherwise, download the [latest release](https://github.com/d3/d3-polygon/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-polygon.v1.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +## API Reference + +# d3.polygonArea(polygon) [<>](https://github.com/d3/d3-polygon/blob/master/src/area.js#L1 "Source Code") + +Returns the signed area of the specified *polygon*. If the vertices of the polygon are in counterclockwise order (assuming a coordinate system where the origin ⟨0,0⟩ is in the top-left corner), the returned area is positive; otherwise it is negative, or zero. + +# d3.polygonCentroid(polygon) [<>](https://github.com/d3/d3-polygon/blob/master/src/centroid.js#L1 "Source Code") + +Returns the [centroid](https://en.wikipedia.org/wiki/Centroid) of the specified *polygon*. + +# d3.polygonHull(points) [<>](https://github.com/d3/d3-polygon/blob/master/src/hull.js#L23 "Source Code") + + + +Returns the [convex hull](https://en.wikipedia.org/wiki/Convex_hull) of the specified *points* using [Andrew’s monotone chain algorithm](http://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain). The returned hull is represented as an array containing a subset of the input *points* arranged in counterclockwise order. Returns null if *points* has fewer than three elements. + +# d3.polygonContains(polygon, point) [<>](https://github.com/d3/d3-polygon/blob/master/src/contains.js#L1 "Source Code") + +Returns true if and only if the specified *point* is inside the specified *polygon*. + +# d3.polygonLength(polygon) [<>](https://github.com/d3/d3-polygon/blob/master/src/length.js#L1 "Source Code") + +Returns the length of the perimeter of the specified *polygon*. diff --git a/node_modules/d3-polygon/dist/d3-polygon.js b/node_modules/d3-polygon/dist/d3-polygon.js new file mode 100644 index 00000000..244a55fa --- /dev/null +++ b/node_modules/d3-polygon/dist/d3-polygon.js @@ -0,0 +1,150 @@ +// https://d3js.org/d3-polygon/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +function area(polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + + return area / 2; +} + +function centroid(polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + + return k *= 3, [x / k, y / k]; +} + +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. +function cross(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); +} + +function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; +} + +// Computes the upper convex hull per the monotone chain algorithm. +// Assumes points.length >= 3, is sorted by x, unique in y. +// Returns an array of indices into points in left-to-right order. +function computeUpperHullIndexes(points) { + const n = points.length, + indexes = [0, 1]; + let size = 2, i; + + for (i = 2; i < n; ++i) { + while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points +} + +function hull(points) { + if ((n = points.length) < 3) return null; + + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); + + for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); + + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; + + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + + return hull; +} + +function contains(polygon, point) { + var n = polygon.length, + p = polygon[n - 1], + x = point[0], y = point[1], + x0 = p[0], y0 = p[1], + x1, y1, + inside = false; + + for (var i = 0; i < n; ++i) { + p = polygon[i], x1 = p[0], y1 = p[1]; + if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; + x0 = x1, y0 = y1; + } + + return inside; +} + +function length(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; + + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.hypot(xa, ya); + } + + return perimeter; +} + +exports.polygonArea = area; +exports.polygonCentroid = centroid; +exports.polygonContains = contains; +exports.polygonHull = hull; +exports.polygonLength = length; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-polygon/dist/d3-polygon.min.js b/node_modules/d3-polygon/dist/d3-polygon.min.js new file mode 100644 index 00000000..f5f44647 --- /dev/null +++ b/node_modules/d3-polygon/dist/d3-polygon.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-polygon/ v2.0.0 Copyright 2020 Mike Bostock +!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((n=n||self).d3=n.d3||{})}(this,function(n){"use strict";function e(n,e){return n[0]-e[0]||n[1]-e[1]}function t(n){const e=n.length,t=[0,1];let r,o=2;for(r=2;r1&&(f=n[t[o-2]],u=n[t[o-1]],l=n[r],(u[0]-f[0])*(l[1]-f[1])-(u[1]-f[1])*(l[0]-f[0])<=0);)--o;t[o++]=r}var f,u,l;return t.slice(0,o)}n.polygonArea=function(n){for(var e,t=-1,r=n.length,o=n[r-1],f=0;++tl!=g>l&&u<(i-t)*(l-r)/(g-r)+t&&(h=!h),i=t,g=r;return h},n.polygonHull=function(n){if((o=n.length)<3)return null;var r,o,f=new Array(o),u=new Array(o);for(r=0;r=0;--r)c.push(n[f[l[r]][2]]);for(r=+g;r y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; + x0 = x1, y0 = y1; + } + + return inside; +} diff --git a/node_modules/d3-polygon/src/cross.js b/node_modules/d3-polygon/src/cross.js new file mode 100644 index 00000000..11a6df07 --- /dev/null +++ b/node_modules/d3-polygon/src/cross.js @@ -0,0 +1,7 @@ +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. +export default function(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); +} diff --git a/node_modules/d3-polygon/src/hull.js b/node_modules/d3-polygon/src/hull.js new file mode 100644 index 00000000..daaf9a51 --- /dev/null +++ b/node_modules/d3-polygon/src/hull.js @@ -0,0 +1,49 @@ +import cross from "./cross.js"; + +function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; +} + +// Computes the upper convex hull per the monotone chain algorithm. +// Assumes points.length >= 3, is sorted by x, unique in y. +// Returns an array of indices into points in left-to-right order. +function computeUpperHullIndexes(points) { + const n = points.length, + indexes = [0, 1]; + let size = 2, i; + + for (i = 2; i < n; ++i) { + while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points +} + +export default function(points) { + if ((n = points.length) < 3) return null; + + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); + + for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); + + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; + + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + + return hull; +} diff --git a/node_modules/d3-polygon/src/index.js b/node_modules/d3-polygon/src/index.js new file mode 100644 index 00000000..e774be97 --- /dev/null +++ b/node_modules/d3-polygon/src/index.js @@ -0,0 +1,5 @@ +export {default as polygonArea} from "./area.js"; +export {default as polygonCentroid} from "./centroid.js"; +export {default as polygonHull} from "./hull.js"; +export {default as polygonContains} from "./contains.js"; +export {default as polygonLength} from "./length.js"; diff --git a/node_modules/d3-polygon/src/length.js b/node_modules/d3-polygon/src/length.js new file mode 100644 index 00000000..8e4da5ed --- /dev/null +++ b/node_modules/d3-polygon/src/length.js @@ -0,0 +1,23 @@ +export default function(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; + + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.hypot(xa, ya); + } + + return perimeter; +} diff --git a/node_modules/d3-quadtree/LICENSE b/node_modules/d3-quadtree/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-quadtree/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-quadtree/README.md b/node_modules/d3-quadtree/README.md new file mode 100644 index 00000000..fd99aae7 --- /dev/null +++ b/node_modules/d3-quadtree/README.md @@ -0,0 +1,183 @@ +# d3-quadtree + +A [quadtree](https://en.wikipedia.org/wiki/Quadtree) recursively partitions two-dimensional space into squares, dividing each square into four equally-sized squares. Each distinct point exists in a unique leaf [node](#nodes); coincident points are represented by a linked list. Quadtrees can accelerate various spatial operations, such as the [Barnes–Hut approximation](https://en.wikipedia.org/wiki/Barnes–Hut_simulation) for computing many-body forces, collision detection, and searching for nearby points. + + + + +## Installing + +If you use NPM, `npm install d3-quadtree`. Otherwise, download the [latest release](https://github.com/d3/d3-quadtree/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-quadtree.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +## API Reference + +# d3.quadtree([data[, x, y]]) + [<>](https://github.com/d3/d3-quadtree/blob/master/src/quadtree.js "Source") + +Creates a new, empty quadtree with an empty [extent](#quadtree_extent) and the default [*x*-](#quadtree_x) and [*y*-](#quadtree_y)accessors. If *data* is specified, [adds](#quadtree_addAll) the specified array of data to the quadtree. This is equivalent to: + +```js +var tree = d3.quadtree() + .addAll(data); +``` + +If *x* and *y* are also specified, sets the [*x*-](#quadtree_x) and [*y*-](#quadtree_y) accessors to the specified functions before adding the specified array of data to the quadtree, equivalent to: + +```js +var tree = d3.quadtree() + .x(x) + .y(y) + .addAll(data); +``` + +# quadtree.x([x]) [<>](https://github.com/d3/d3-quadtree/blob/master/src/x.js "Source") + +If *x* is specified, sets the current *x*-coordinate accessor and returns the quadtree. If *x* is not specified, returns the current *x*-accessor, which defaults to: + +```js +function x(d) { + return d[0]; +} +``` + +The *x*-acccessor is used to derive the *x*-coordinate of data when [adding](#quadtree_add) to and [removing](#quadtree_remove) from the tree. It is also used when [finding](#quadtree_find) to re-access the coordinates of data previously added to the tree; therefore, the *x*- and *y*-accessors must be consistent, returning the same value given the same input. + +# quadtree.y([y]) + [<>](https://github.com/d3/d3-quadtree/blob/master/src/y.js "Source") + +If *y* is specified, sets the current *y*-coordinate accessor and returns the quadtree. If *y* is not specified, returns the current *y*-accessor, which defaults to: + +```js +function y(d) { + return d[1]; +} +``` + +The *y*-acccessor is used to derive the *y*-coordinate of data when [adding](#quadtree_add) to and [removing](#quadtree_remove) from the tree. It is also used when [finding](#quadtree_find) to re-access the coordinates of data previously added to the tree; therefore, the *x*- and *y*-accessors must be consistent, returning the same value given the same input. + +# quadtree.extent([*extent*]) + [<>](https://github.com/d3/d3-quadtree/blob/master/src/extent.js "Source") + +If *extent* is specified, expands the quadtree to [cover](#quadtree_cover) the specified points [[*x0*, *y0*], [*x1*, *y1*]] and returns the quadtree. If *extent* is not specified, returns the quadtree’s current extent [[*x0*, *y0*], [*x1*, *y1*]], where *x0* and *y0* are the inclusive lower bounds and *x1* and *y1* are the inclusive upper bounds, or undefined if the quadtree has no extent. The extent may also be expanded by calling [*quadtree*.cover](#quadtree_cover) or [*quadtree*.add](#quadtree_add). + +# quadtree.cover(x, y) + [<>](https://github.com/d3/d3-quadtree/blob/master/src/cover.js "Source") + +Expands the quadtree to cover the specified point ⟨*x*,*y*⟩, and returns the quadtree. If the quadtree’s extent already covers the specified point, this method does nothing. If the quadtree has an extent, the extent is repeatedly doubled to cover the specified point, wrapping the [root](#quadtree_root) [node](#nodes) as necessary; if the quadtree is empty, the extent is initialized to the extent [[⌊*x*⌋, ⌊*y*⌋], [⌈*x*⌉, ⌈*y*⌉]]. (Rounding is necessary such that if the extent is later doubled, the boundaries of existing quadrants do not change due to floating point error.) + +# quadtree.add(datum) + [<>](https://github.com/d3/d3-quadtree/blob/master/src/add.js "Source") + +Adds the specified *datum* to the quadtree, deriving its coordinates ⟨*x*,*y*⟩ using the current [*x*-](#quadtree_x) and [*y*-](#quadtree_y)accessors, and returns the quadtree. If the new point is outside the current [extent](#quadtree_extent) of the quadtree, the quadtree is automatically expanded to [cover](#quadtree_cover) the new point. + +# quadtree.addAll(data) + [<>](https://github.com/d3/d3-quadtree/blob/master/src/add.js "Source") + +Adds the specified array of *data* to the quadtree, deriving each element’s coordinates ⟨*x*,*y*⟩ using the current [*x*-](#quadtree_x) and [*y*-](#quadtree_y)accessors, and return this quadtree. This is approximately equivalent to calling [*quadtree*.add](#quadtree_add) repeatedly: + +```js +for (var i = 0, n = data.length; i < n; ++i) { + quadtree.add(data[i]); +} +``` + +However, this method results in a more compact quadtree because the extent of the *data* is computed first before adding the data. + +# quadtree.remove(datum) + [<>](https://github.com/d3/d3-quadtree/blob/master/src/remove.js "Source") + +Removes the specified *datum* from the quadtree, deriving its coordinates ⟨*x*,*y*⟩ using the current [*x*-](#quadtree_x) and [*y*-](#quadtree_y)accessors, and returns the quadtree. If the specified *datum* does not exist in this quadtree, this method does nothing. + +# quadtree.removeAll(data) + [<>](https://github.com/d3/d3-quadtree/blob/master/src/remove.js "Source") + +Removes the specified *data* from the quadtree, deriving their coordinates ⟨*x*,*y*⟩ using the current [*x*-](#quadtree_x) and [*y*-](#quadtree_y)accessors, and returns the quadtree. If a specified datum does not exist in this quadtree, it is ignored. + +# quadtree.copy() + +Returns a copy of the quadtree. All [nodes](#nodes) in the returned quadtree are identical copies of the corresponding node in the quadtree; however, any data in the quadtree is shared by reference and not copied. + +# quadtree.root() + [<>](https://github.com/d3/d3-quadtree/blob/master/src/root.js "Source") + +Returns the root [node](#nodes) of the quadtree. + +# quadtree.data() + [<>](https://github.com/d3/d3-quadtree/blob/master/src/data.js "Source") + +Returns an array of all data in the quadtree. + +# quadtree.size() + [<>](https://github.com/d3/d3-quadtree/blob/master/src/size.js "Source") + +Returns the total number of data in the quadtree. + +# quadtree.find(x, y[, radius]) + [<>](https://github.com/d3/d3-quadtree/blob/master/src/find.js "Source") + +Returns the datum closest to the position ⟨*x*,*y*⟩ with the given search *radius*. If *radius* is not specified, it defaults to infinity. If there is no datum within the search area, returns undefined. + +# quadtree.visit(callback) + [<>](https://github.com/d3/d3-quadtree/blob/master/src/visit.js "Source") + +Visits each [node](#nodes) in the quadtree in pre-order traversal, invoking the specified *callback* with arguments *node*, *x0*, *y0*, *x1*, *y1* for each node, where *node* is the node being visited, ⟨*x0*, *y0*⟩ are the lower bounds of the node, and ⟨*x1*, *y1*⟩ are the upper bounds, and returns the quadtree. (Assuming that positive *x* is right and positive *y* is down, as is typically the case in Canvas and SVG, ⟨*x0*, *y0*⟩ is the top-left corner and ⟨*x1*, *y1*⟩ is the lower-right corner; however, the coordinate system is arbitrary, so more formally *x0* <= *x1* and *y0* <= *y1*.) + +If the *callback* returns true for a given node, then the children of that node are not visited; otherwise, all child nodes are visited. This can be used to quickly visit only parts of the tree, for example when using the [Barnes–Hut approximation](https://en.wikipedia.org/wiki/Barnes–Hut_simulation). Note, however, that child quadrants are always visited in sibling order: top-left, top-right, bottom-left, bottom-right. In cases such as [search](#quadtree_find), visiting siblings in a specific order may be faster. + +As an example, the following visits the quadtree and returns all the nodes within a rectangular extent [xmin, ymin, xmax, ymax], ignoring quads that cannot possibly contain any such node: + +```js +function search(quadtree, xmin, ymin, xmax, ymax) { + const results = []; + quadtree.visit(function(node, x1, y1, x2, y2) { + if (!node.length) { + do { + var d = node.data; + if (d[0] >= xmin && d[0] < xmax && d[1] >= ymin && d[1] < ymax) { + results.push(d); + } + } while (node = node.next); + } + return x1 >= xmax || y1 >= ymax || x2 < xmin || y2 < ymin; + }); + return results; +} +``` + +# quadtree.visitAfter(callback) + [<>](https://github.com/d3/d3-quadtree/blob/master/src/visitAfter.js "Source") + +Visits each [node](#nodes) in the quadtree in post-order traversal, invoking the specified *callback* with arguments *node*, *x0*, *y0*, *x1*, *y1* for each node, where *node* is the node being visited, ⟨*x0*, *y0*⟩ are the lower bounds of the node, and ⟨*x1*, *y1*⟩ are the upper bounds, and returns the quadtree. (Assuming that positive *x* is right and positive *y* is down, as is typically the case in Canvas and SVG, ⟨*x0*, *y0*⟩ is the top-left corner and ⟨*x1*, *y1*⟩ is the lower-right corner; however, the coordinate system is arbitrary, so more formally *x0* <= *x1* and *y0* <= *y1*.) Returns *root*. + +### Nodes + +Internal nodes of the quadtree are represented as four-element arrays in left-to-right, top-to-bottom order: + +* `0` - the top-left quadrant, if any. +* `1` - the top-right quadrant, if any. +* `2` - the bottom-left quadrant, if any. +* `3` - the bottom-right quadrant, if any. + +A child quadrant may be undefined if it is empty. + +Leaf nodes are represented as objects with the following properties: + +* `data` - the data associated with this point, as passed to [*quadtree*.add](#quadtree_add). +* `next` - the next datum in this leaf, if any. + +The `length` property may be used to distinguish leaf nodes from internal nodes: it is undefined for leaf nodes, and 4 for internal nodes. For example, to iterate over all data in a leaf node: + +```js +if (!node.length) do console.log(node.data); while (node = node.next); +``` + +The point’s *x*- and *y*-coordinates **must not be modified** while the point is in the quadtree. To update a point’s position, [remove](#quadtree_remove) the point and then re-[add](#quadtree_add) it to the quadtree at the new position. Alternatively, you may discard the existing quadtree entirely and create a new one from scratch; this may be more efficient if many of the points have moved. diff --git a/node_modules/d3-quadtree/dist/d3-quadtree.js b/node_modules/d3-quadtree/dist/d3-quadtree.js new file mode 100644 index 00000000..4e2c117d --- /dev/null +++ b/node_modules/d3-quadtree/dist/d3-quadtree.js @@ -0,0 +1,419 @@ +// https://d3js.org/d3-quadtree/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +function tree_add(d) { + const x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); +} + +function add(tree, x, y, d) { + if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points + + var parent, + node = tree._root, + leaf = {data: d}, + x0 = tree._x0, + y0 = tree._y0, + x1 = tree._x1, + y1 = tree._y1, + xm, + ym, + xp, + yp, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return tree._root = leaf, tree; + + // Find the existing leaf for the new point, or add it. + while (node.length) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; + } + + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; +} + +function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; + + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; + xz[i] = x; + yz[i] = y; + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; + } + + // If there were no (valid) points, abort. + if (x0 > x1 || y0 > y1) return this; + + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); + + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + + return this; +} + +function tree_cover(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points + + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; + + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } + + // Otherwise, double repeatedly to cover. + else { + var z = x1 - x0 || 1, + node = this._root, + parent, + i; + + while (x0 > x || x >= x1 || y0 > y || y >= y1) { + i = (y < y0) << 1 | (x < x0); + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: x1 = x0 + z, y1 = y0 + z; break; + case 1: x0 = x1 - z, y1 = y0 + z; break; + case 2: x1 = x0 + z, y0 = y1 - z; break; + case 3: x0 = x1 - z, y0 = y1 - z; break; + } + } + + if (this._root && this._root.length) this._root = node; + } + + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; +} + +function tree_data() { + var data = []; + this.visit(function(node) { + if (!node.length) do data.push(node.data); while (node = node.next) + }); + return data; +} + +function tree_extent(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; +} + +function Quad(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; +} + +function tree_find(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; + + if (node) quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; + } + + while (q = quads.pop()) { + + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) continue; + + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; + + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); + + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } + + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } + + return data; +} + +function tree_remove(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points + + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; + } + + // Find the point to remove. + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; + + // If there are multiple coincident points, remove just the point. + if (previous) return (next ? previous.next = next : delete previous.next), this; + + // If this is the root point, remove it. + if (!parent) return this._root = next, this; + + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; + } + + return this; +} + +function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; +} + +function tree_root() { + return this._root; +} + +function tree_size() { + var size = 0; + this.visit(function(node) { + if (!node.length) do ++size; while (node = node.next) + }); + return size; +} + +function tree_visit(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; +} + +function tree_visitAfter(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; +} + +function defaultX(d) { + return d[0]; +} + +function tree_x(_) { + return arguments.length ? (this._x = _, this) : this._x; +} + +function defaultY(d) { + return d[1]; +} + +function tree_y(_) { + return arguments.length ? (this._y = _, this) : this._y; +} + +function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); +} + +function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; +} + +function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) next = next.next = {data: leaf.data}; + return copy; +} + +var treeProto = quadtree.prototype = Quadtree.prototype; + +treeProto.copy = function() { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; + + if (!node) return copy; + + if (!node.length) return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); + else node.target[i] = leaf_copy(child); + } + } + } + + return copy; +}; + +treeProto.add = tree_add; +treeProto.addAll = addAll; +treeProto.cover = tree_cover; +treeProto.data = tree_data; +treeProto.extent = tree_extent; +treeProto.find = tree_find; +treeProto.remove = tree_remove; +treeProto.removeAll = removeAll; +treeProto.root = tree_root; +treeProto.size = tree_size; +treeProto.visit = tree_visit; +treeProto.visitAfter = tree_visitAfter; +treeProto.x = tree_x; +treeProto.y = tree_y; + +exports.quadtree = quadtree; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-quadtree/dist/d3-quadtree.min.js b/node_modules/d3-quadtree/dist/d3-quadtree.min.js new file mode 100644 index 00000000..db82ed2c --- /dev/null +++ b/node_modules/d3-quadtree/dist/d3-quadtree.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-quadtree/ v2.0.0 Copyright 2020 Mike Bostock +!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i((t=t||self).d3=t.d3||{})}(this,function(t){"use strict";function i(t,i,n,e){if(isNaN(i)||isNaN(n))return t;var r,s,h,o,a,u,l,_,f,c=t._root,x={data:e},y=t._x0,d=t._y0,v=t._x1,p=t._y1;if(!c)return t._root=x,t;for(;c.length;)if((u=i>=(s=(y+v)/2))?y=s:v=s,(l=n>=(h=(d+p)/2))?d=h:p=h,r=c,!(c=c[_=l<<1|u]))return r[_]=x,t;if(o=+t._x.call(null,c.data),a=+t._y.call(null,c.data),i===o&&n===a)return x.next=c,r?r[_]=x:t._root=x,t;do{r=r?r[_]=new Array(4):t._root=new Array(4),(u=i>=(s=(y+v)/2))?y=s:v=s,(l=n>=(h=(d+p)/2))?d=h:p=h}while((_=l<<1|u)==(f=(a>=h)<<1|o>=s));return r[f]=c,r[_]=x,t}function n(t,i,n,e,r){this.node=t,this.x0=i,this.y0=n,this.x1=e,this.y1=r}function e(t){return t[0]}function r(t){return t[1]}function s(t,i,n){var s=new h(null==i?e:i,null==n?r:n,NaN,NaN,NaN,NaN);return null==t?s:s.addAll(t)}function h(t,i,n,e,r,s){this._x=t,this._y=i,this._x0=n,this._y0=e,this._x1=r,this._y1=s,this._root=void 0}function o(t){for(var i={data:t.data},n=i;t=t.next;)n=n.next={data:t.data};return i}var a=s.prototype=h.prototype;a.copy=function(){var t,i,n=new h(this._x,this._y,this._x0,this._y0,this._x1,this._y1),e=this._root;if(!e)return n;if(!e.length)return n._root=o(e),n;for(t=[{source:e,target:n._root=new Array(4)}];e=t.pop();)for(var r=0;r<4;++r)(i=e.source[r])&&(i.length?t.push({source:i,target:e.target[r]=new Array(4)}):e.target[r]=o(i));return n},a.add=function(t){const n=+this._x.call(null,t),e=+this._y.call(null,t);return i(this.cover(n,e),n,e,t)},a.addAll=function(t){var n,e,r,s,h=t.length,o=new Array(h),a=new Array(h),u=1/0,l=1/0,_=-1/0,f=-1/0;for(e=0;e_&&(_=r),sf&&(f=s));if(u>_||l>f)return this;for(this.cover(u,l).cover(_,f),e=0;et||t>=r||e>i||i>=s;)switch(o=(ic||(h=u.y0)>x||(o=u.x1)<_||(a=u.y1)=p)<<1|t>=v)&&(u=y[y.length-1],y[y.length-1]=y[y.length-1-l],y[y.length-1-l]=u)}else{var w=t-+this._x.call(null,d.data),N=i-+this._y.call(null,d.data),g=w*w+N*N;if(g=(o=(x+d)/2))?x=o:d=o,(l=h>=(a=(y+v)/2))?y=a:v=a,i=c,!(c=c[_=l<<1|u]))return this;if(!c.length)break;(i[_+1&3]||i[_+2&3]||i[_+3&3])&&(n=i,f=_)}for(;c.data!==t;)if(e=c,!(c=c.next))return this;return(r=c.next)&&delete c.next,e?(r?e.next=r:delete e.next,this):i?(r?i[_]=r:delete i[_],(c=i[0]||i[1]||i[2]||i[3])&&c===(i[3]||i[2]||i[1]||i[0])&&!c.length&&(n?n[f]=c:this._root=c),this):(this._root=r,this)},a.removeAll=function(t){for(var i=0,n=t.length;i= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; + } + + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; +} + +export function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; + + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; + xz[i] = x; + yz[i] = y; + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; + } + + // If there were no (valid) points, abort. + if (x0 > x1 || y0 > y1) return this; + + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); + + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + + return this; +} diff --git a/node_modules/d3-quadtree/src/cover.js b/node_modules/d3-quadtree/src/cover.js new file mode 100644 index 00000000..e1d47cd6 --- /dev/null +++ b/node_modules/d3-quadtree/src/cover.js @@ -0,0 +1,43 @@ +export default function(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points + + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; + + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } + + // Otherwise, double repeatedly to cover. + else { + var z = x1 - x0 || 1, + node = this._root, + parent, + i; + + while (x0 > x || x >= x1 || y0 > y || y >= y1) { + i = (y < y0) << 1 | (x < x0); + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: x1 = x0 + z, y1 = y0 + z; break; + case 1: x0 = x1 - z, y1 = y0 + z; break; + case 2: x1 = x0 + z, y0 = y1 - z; break; + case 3: x0 = x1 - z, y0 = y1 - z; break; + } + } + + if (this._root && this._root.length) this._root = node; + } + + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; +} diff --git a/node_modules/d3-quadtree/src/data.js b/node_modules/d3-quadtree/src/data.js new file mode 100644 index 00000000..e934fa9d --- /dev/null +++ b/node_modules/d3-quadtree/src/data.js @@ -0,0 +1,7 @@ +export default function() { + var data = []; + this.visit(function(node) { + if (!node.length) do data.push(node.data); while (node = node.next) + }); + return data; +} diff --git a/node_modules/d3-quadtree/src/extent.js b/node_modules/d3-quadtree/src/extent.js new file mode 100644 index 00000000..9e65a90a --- /dev/null +++ b/node_modules/d3-quadtree/src/extent.js @@ -0,0 +1,5 @@ +export default function(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; +} diff --git a/node_modules/d3-quadtree/src/find.js b/node_modules/d3-quadtree/src/find.js new file mode 100644 index 00000000..e9db6c41 --- /dev/null +++ b/node_modules/d3-quadtree/src/find.js @@ -0,0 +1,70 @@ +import Quad from "./quad.js"; + +export default function(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; + + if (node) quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; + } + + while (q = quads.pop()) { + + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) continue; + + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; + + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); + + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } + + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } + + return data; +} diff --git a/node_modules/d3-quadtree/src/index.js b/node_modules/d3-quadtree/src/index.js new file mode 100644 index 00000000..e2b2c313 --- /dev/null +++ b/node_modules/d3-quadtree/src/index.js @@ -0,0 +1 @@ +export {default as quadtree} from "./quadtree.js"; diff --git a/node_modules/d3-quadtree/src/quad.js b/node_modules/d3-quadtree/src/quad.js new file mode 100644 index 00000000..6f714dbb --- /dev/null +++ b/node_modules/d3-quadtree/src/quad.js @@ -0,0 +1,7 @@ +export default function(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; +} diff --git a/node_modules/d3-quadtree/src/quadtree.js b/node_modules/d3-quadtree/src/quadtree.js new file mode 100644 index 00000000..5d585938 --- /dev/null +++ b/node_modules/d3-quadtree/src/quadtree.js @@ -0,0 +1,73 @@ +import tree_add, {addAll as tree_addAll} from "./add.js"; +import tree_cover from "./cover.js"; +import tree_data from "./data.js"; +import tree_extent from "./extent.js"; +import tree_find from "./find.js"; +import tree_remove, {removeAll as tree_removeAll} from "./remove.js"; +import tree_root from "./root.js"; +import tree_size from "./size.js"; +import tree_visit from "./visit.js"; +import tree_visitAfter from "./visitAfter.js"; +import tree_x, {defaultX} from "./x.js"; +import tree_y, {defaultY} from "./y.js"; + +export default function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); +} + +function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; +} + +function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) next = next.next = {data: leaf.data}; + return copy; +} + +var treeProto = quadtree.prototype = Quadtree.prototype; + +treeProto.copy = function() { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; + + if (!node) return copy; + + if (!node.length) return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); + else node.target[i] = leaf_copy(child); + } + } + } + + return copy; +}; + +treeProto.add = tree_add; +treeProto.addAll = tree_addAll; +treeProto.cover = tree_cover; +treeProto.data = tree_data; +treeProto.extent = tree_extent; +treeProto.find = tree_find; +treeProto.remove = tree_remove; +treeProto.removeAll = tree_removeAll; +treeProto.root = tree_root; +treeProto.size = tree_size; +treeProto.visit = tree_visit; +treeProto.visitAfter = tree_visitAfter; +treeProto.x = tree_x; +treeProto.y = tree_y; diff --git a/node_modules/d3-quadtree/src/remove.js b/node_modules/d3-quadtree/src/remove.js new file mode 100644 index 00000000..0ba27abe --- /dev/null +++ b/node_modules/d3-quadtree/src/remove.js @@ -0,0 +1,62 @@ +export default function(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points + + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; + } + + // Find the point to remove. + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; + + // If there are multiple coincident points, remove just the point. + if (previous) return (next ? previous.next = next : delete previous.next), this; + + // If this is the root point, remove it. + if (!parent) return this._root = next, this; + + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; + } + + return this; +} + +export function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; +} diff --git a/node_modules/d3-quadtree/src/root.js b/node_modules/d3-quadtree/src/root.js new file mode 100644 index 00000000..c32889f7 --- /dev/null +++ b/node_modules/d3-quadtree/src/root.js @@ -0,0 +1,3 @@ +export default function() { + return this._root; +} diff --git a/node_modules/d3-quadtree/src/size.js b/node_modules/d3-quadtree/src/size.js new file mode 100644 index 00000000..d2d5ab61 --- /dev/null +++ b/node_modules/d3-quadtree/src/size.js @@ -0,0 +1,7 @@ +export default function() { + var size = 0; + this.visit(function(node) { + if (!node.length) do ++size; while (node = node.next) + }); + return size; +} diff --git a/node_modules/d3-quadtree/src/visit.js b/node_modules/d3-quadtree/src/visit.js new file mode 100644 index 00000000..941ab884 --- /dev/null +++ b/node_modules/d3-quadtree/src/visit.js @@ -0,0 +1,16 @@ +import Quad from "./quad.js"; + +export default function(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; +} diff --git a/node_modules/d3-quadtree/src/visitAfter.js b/node_modules/d3-quadtree/src/visitAfter.js new file mode 100644 index 00000000..20966553 --- /dev/null +++ b/node_modules/d3-quadtree/src/visitAfter.js @@ -0,0 +1,21 @@ +import Quad from "./quad.js"; + +export default function(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; +} diff --git a/node_modules/d3-quadtree/src/x.js b/node_modules/d3-quadtree/src/x.js new file mode 100644 index 00000000..ffea5075 --- /dev/null +++ b/node_modules/d3-quadtree/src/x.js @@ -0,0 +1,7 @@ +export function defaultX(d) { + return d[0]; +} + +export default function(_) { + return arguments.length ? (this._x = _, this) : this._x; +} diff --git a/node_modules/d3-quadtree/src/y.js b/node_modules/d3-quadtree/src/y.js new file mode 100644 index 00000000..d2d29cb7 --- /dev/null +++ b/node_modules/d3-quadtree/src/y.js @@ -0,0 +1,7 @@ +export function defaultY(d) { + return d[1]; +} + +export default function(_) { + return arguments.length ? (this._y = _, this) : this._y; +} diff --git a/node_modules/d3-random/LICENSE b/node_modules/d3-random/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-random/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-random/README.md b/node_modules/d3-random/README.md new file mode 100644 index 00000000..87c163fb --- /dev/null +++ b/node_modules/d3-random/README.md @@ -0,0 +1,120 @@ +# d3-random + +Generate random numbers from various distributions. + +See the [d3-random collection on Observable](https://observablehq.com/collection/@d3/d3-random) for examples. + +## Installing + +If you use NPM, `npm install d3-random`. Otherwise, download the [latest release](https://github.com/d3/d3-random/releases/latest). You can also load directly as a [standalone library](https://d3js.org/d3-random.v2.min.js) or as part of [D3](https://github.com/d3/d3). ES modules, AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +## API Reference + +# d3.randomUniform([min, ][max]) · [Source](https://github.com/d3/d3-random/blob/master/src/uniform.js), [Examples](https://observablehq.com/@d3/d3-random#uniform) + +Returns a function for generating random numbers with a [uniform distribution](https://en.wikipedia.org/wiki/Uniform_distribution_\(continuous\)). The minimum allowed value of a returned number is *min* (inclusive), and the maximum is *max* (exclusive). If *min* is not specified, it defaults to 0; if *max* is not specified, it defaults to 1. For example: + +```js +d3.randomUniform(6)(); // Returns a number greater than or equal to 0 and less than 6. +d3.randomUniform(1, 5)(); // Returns a number greater than or equal to 1 and less than 5. +``` + +# d3.randomInt([min, ][max]) · [Source](https://github.com/d3/d3-random/blob/master/src/int.js), [Examples](https://observablehq.com/@d3/d3-random#int) + +Returns a function for generating random integers with a [uniform distribution](https://en.wikipedia.org/wiki/Uniform_distribution_\(continuous\)). The minimum allowed value of a returned number is ⌊*min*⌋ (inclusive), and the maximum is ⌊*max* - 1⌋ (inclusive). If *min* is not specified, it defaults to 0. For example: + +```js +d3.randomInt(6)(); // Returns an integer greater than or equal to 0 and less than 6. +d3.randomInt(1, 5)(); // Returns an integer greater than or equal to 1 and less than 5. +``` + +# d3.randomNormal([mu][, sigma]) · [Source](https://github.com/d3/d3-random/blob/master/src/normal.js), [Examples](https://observablehq.com/@d3/d3-random#normal) + +Returns a function for generating random numbers with a [normal (Gaussian) distribution](https://en.wikipedia.org/wiki/Normal_distribution). The expected value of the generated numbers is *mu*, with the given standard deviation *sigma*. If *mu* is not specified, it defaults to 0; if *sigma* is not specified, it defaults to 1. + +# d3.randomLogNormal([mu][, sigma]) · [Source](https://github.com/d3/d3-random/blob/master/src/logNormal.js), [Examples](https://observablehq.com/@d3/d3-random#logNormal) + +Returns a function for generating random numbers with a [log-normal distribution](https://en.wikipedia.org/wiki/Log-normal_distribution). The expected value of the random variable’s natural logarithm is *mu*, with the given standard deviation *sigma*. If *mu* is not specified, it defaults to 0; if *sigma* is not specified, it defaults to 1. + +# d3.randomBates(n) · [Source](https://github.com/d3/d3-random/blob/master/src/bates.js), [Examples](https://observablehq.com/@d3/d3-random#bates) + +Returns a function for generating random numbers with a [Bates distribution](https://en.wikipedia.org/wiki/Bates_distribution) with *n* independent variables. The case of fractional *n* is handled as with d3.randomIrwinHall, and d3.randomBates(0) is equivalent to d3.randomUniform(). + +# d3.randomIrwinHall(n) · [Source](https://github.com/d3/d3-random/blob/master/src/irwinHall.js), [Examples](https://observablehq.com/@d3/d3-random#irwinHall) + +Returns a function for generating random numbers with an [Irwin–Hall distribution](https://en.wikipedia.org/wiki/Irwin–Hall_distribution) with *n* independent variables. If the fractional part of *n* is non-zero, this is treated as adding d3.randomUniform() times that fractional part to the integral part. + +# d3.randomExponential(lambda) · [Source](https://github.com/d3/d3-random/blob/master/src/exponential.js), [Examples](https://observablehq.com/@d3/d3-random#exponential) + +Returns a function for generating random numbers with an [exponential distribution](https://en.wikipedia.org/wiki/Exponential_distribution) with the rate *lambda*; equivalent to time between events in a [Poisson process](https://en.wikipedia.org/wiki/Poisson_point_process) with a mean of 1 / *lambda*. For example, exponential(1/40) generates random times between events where, on average, one event occurs every 40 units of time. + +# d3.randomPareto(alpha) · [Source](https://github.com/d3/d3-random/blob/master/src/pareto.js), [Examples](https://observablehq.com/@d3/d3-random#pareto) + +Returns a function for generating random numbers with a [Pareto distribution](https://en.wikipedia.org/wiki/Pareto_distribution) with the shape *alpha*. The value *alpha* must be a positive value. + +# d3.randomBernoulli(p) · [Source](https://github.com/d3/d3-random/blob/master/src/bernoulli.js), [Examples](https://observablehq.com/@d3/d3-random#bernoulli) + +Returns a function for generating either 1 or 0 according to a [Bernoulli distribution](https://en.wikipedia.org/wiki/Binomial_distribution) with 1 being returned with success probability *p* and 0 with failure probability *q* = 1 - *p*. The value *p* is in the range [0, 1]. + +# d3.randomGeometric(p) · [Source](https://github.com/d3/d3-random/blob/master/src/geometric.js), [Examples](https://observablehq.com/@d3/d3-random#geometric) + +Returns a function for generating numbers with a [geometric distribution](https://en.wikipedia.org/wiki/Geometric_distribution) with success probability *p*. The value *p* is in the range [0, 1]. + +# d3.randomBinomial(n, p) · [Source](https://github.com/d3/d3-random/blob/master/src/binomial.js), [Examples](https://observablehq.com/@d3/d3-random#binomial) + +Returns a function for generating random numbers with a [binomial distribution](https://en.wikipedia.org/wiki/Binomial_distribution) with *n* the number of trials and *p* the probability of success in each trial. The value *n* is greater or equal to 0, and the value *p* is in the range [0, 1]. + +# d3.randomGamma(k, [theta]) · [Source](https://github.com/d3/d3-random/blob/master/src/gamma.js), [Examples](https://observablehq.com/@parcly-taxel/the-gamma-and-beta-distributions) + +Returns a function for generating random numbers with a [gamma distribution](https://en.wikipedia.org/wiki/Gamma_distribution) with *k* the shape parameter and *theta* the scale parameter. The value *k* must be a positive value; if *theta* is not specified, it defaults to 1. + +# d3.randomBeta(alpha, beta) · [Source](https://github.com/d3/d3-random/blob/master/src/beta.js), [Examples](https://observablehq.com/@parcly-taxel/the-gamma-and-beta-distributions) + +Returns a function for generating random numbers with a [beta distribution](https://en.wikipedia.org/wiki/Beta_distribution) with *alpha* and *beta* shape parameters, which must both be positive. + +# d3.randomWeibull(k, [a], [b]) · [Source](https://github.com/d3/d3-random/blob/master/src/weibull.js), [Examples](https://observablehq.com/@parcly-taxel/frechet-gumbel-weibull) + +Returns a function for generating random numbers with one of the [generalized extreme value distributions](https://en.wikipedia.org/wiki/Generalized_extreme_value_distribution), depending on *k*: + +* If *k* is positive, the [Weibull distribution](https://en.wikipedia.org/wiki/Weibull_distribution) with shape parameter *k* +* If *k* is zero, the [Gumbel distribution](https://en.wikipedia.org/wiki/Gumbel_distribution) +* If *k* is negative, the [Fréchet distribution](https://en.wikipedia.org/wiki/Fréchet_distribution) with shape parameter −*k* + +In all three cases, *a* is the location parameter and *b* is the scale parameter. If *a* is not specified, it defaults to 0; if *b* is not specified, it defaults to 1. + +# d3.randomCauchy([a], [b]) · [Source](https://github.com/d3/d3-random/blob/master/src/cauchy.js), [Examples](https://observablehq.com/@parcly-taxel/cauchy-and-logistic-distributions) + +Returns a function for generating random numbers with a [Cauchy distribution](https://en.wikipedia.org/wiki/Cauchy_distribution). *a* and *b* have the same meanings and default values as in d3.randomWeibull. + +# d3.randomLogistic([a], [b]) · [Source](https://github.com/d3/d3-random/blob/master/src/logistic.js), [Examples](https://observablehq.com/@parcly-taxel/cauchy-and-logistic-distributions) + +Returns a function for generating random numbers with a [logistic distribution](https://en.wikipedia.org/wiki/Logistic_distribution). *a* and *b* have the same meanings and default values as in d3.randomWeibull. + +# d3.randomPoisson(lambda) · [Source](https://github.com/d3/d3-random/blob/master/src/poisson.js), [Examples](https://observablehq.com/@parcly-taxel/the-poisson-distribution) + +Returns a function for generating random numbers with a [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution) with mean *lambda*. + +# random.source(source) · [Examples](https://observablehq.com/@d3/random-source) + +Returns the same type of function for generating random numbers but where the given random number generator *source* is used as the source of randomness instead of Math.random. The given random number generator must implement the same interface as Math.random and only return values in the range [0, 1). This is useful when a seeded random number generator is preferable to Math.random. For example: + +```js +const d3 = require("d3-random"); +const seed = 0.44871573888282423; // any number in [0, 1) +const random = d3.randomNormal.source(d3.randomLcg(seed))(0, 1); + +random(); // -0.6253955998897069 +``` + +# d3.randomLcg([seed]) · [Source](https://github.com/d3/d3-random/blob/master/src/lcg.js), [Examples](https://observablehq.com/@d3/d3-randomlcg) + +Returns a [linear congruential generator](https://en.wikipedia.org/wiki/Linear_congruential_generator); this function can be called repeatedly to obtain pseudorandom values well-distributed on the interval [0,1) and with a long period (up to 1 billion numbers), similar to Math.random. A *seed* can be specified as a real number in the interval [0,1) or as any integer. In the latter case, only the lower 32 bits are considered. Two generators instanced with the same seed generate the same sequence, allowing to create reproducible pseudo-random experiments. If the *seed* is not specified, one is chosen using Math.random. diff --git a/node_modules/d3-random/dist/d3-random.js b/node_modules/d3-random/dist/d3-random.js new file mode 100644 index 00000000..a586cf8f --- /dev/null +++ b/node_modules/d3-random/dist/d3-random.js @@ -0,0 +1,358 @@ +// https://d3js.org/d3-random/ v2.2.2 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3 = global.d3 || {})); +}(this, (function (exports) { 'use strict'; + +var defaultSource = Math.random; + +var uniform = (function sourceRandomUniform(source) { + function randomUniform(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) max = min, min = 0; + else max -= min; + return function() { + return source() * max + min; + }; + } + + randomUniform.source = sourceRandomUniform; + + return randomUniform; +})(defaultSource); + +var int = (function sourceRandomInt(source) { + function randomInt(min, max) { + if (arguments.length < 2) max = min, min = 0; + min = Math.floor(min); + max = Math.floor(max) - min; + return function() { + return Math.floor(source() * max + min); + }; + } + + randomInt.source = sourceRandomInt; + + return randomInt; +})(defaultSource); + +var normal = (function sourceRandomNormal(source) { + function randomNormal(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function() { + var y; + + // If available, use the second previously-generated uniform random. + if (x != null) y = x, x = null; + + // Otherwise, generate a new x and y. + else do { + x = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } + + randomNormal.source = sourceRandomNormal; + + return randomNormal; +})(defaultSource); + +var logNormal = (function sourceRandomLogNormal(source) { + var N = normal.source(source); + + function randomLogNormal() { + var randomNormal = N.apply(this, arguments); + return function() { + return Math.exp(randomNormal()); + }; + } + + randomLogNormal.source = sourceRandomLogNormal; + + return randomLogNormal; +})(defaultSource); + +var irwinHall = (function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + if ((n = +n) <= 0) return () => 0; + return function() { + for (var sum = 0, i = n; i > 1; --i) sum += source(); + return sum + i * source(); + }; + } + + randomIrwinHall.source = sourceRandomIrwinHall; + + return randomIrwinHall; +})(defaultSource); + +var bates = (function sourceRandomBates(source) { + var I = irwinHall.source(source); + + function randomBates(n) { + // use limiting distribution at n === 0 + if ((n = +n) === 0) return source; + var randomIrwinHall = I(n); + return function() { + return randomIrwinHall() / n; + }; + } + + randomBates.source = sourceRandomBates; + + return randomBates; +})(defaultSource); + +var exponential = (function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function() { + return -Math.log1p(-source()) / lambda; + }; + } + + randomExponential.source = sourceRandomExponential; + + return randomExponential; +})(defaultSource); + +var pareto = (function sourceRandomPareto(source) { + function randomPareto(alpha) { + if ((alpha = +alpha) < 0) throw new RangeError("invalid alpha"); + alpha = 1 / -alpha; + return function() { + return Math.pow(1 - source(), alpha); + }; + } + + randomPareto.source = sourceRandomPareto; + + return randomPareto; +})(defaultSource); + +var bernoulli = (function sourceRandomBernoulli(source) { + function randomBernoulli(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + return function() { + return Math.floor(source() + p); + }; + } + + randomBernoulli.source = sourceRandomBernoulli; + + return randomBernoulli; +})(defaultSource); + +var geometric = (function sourceRandomGeometric(source) { + function randomGeometric(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + if (p === 0) return () => Infinity; + if (p === 1) return () => 1; + p = Math.log1p(-p); + return function() { + return 1 + Math.floor(Math.log1p(-source()) / p); + }; + } + + randomGeometric.source = sourceRandomGeometric; + + return randomGeometric; +})(defaultSource); + +var gamma = (function sourceRandomGamma(source) { + var randomNormal = normal.source(source)(); + + function randomGamma(k, theta) { + if ((k = +k) < 0) throw new RangeError("invalid k"); + // degenerate distribution if k === 0 + if (k === 0) return () => 0; + theta = theta == null ? 1 : +theta; + // exponential distribution if k === 1 + if (k === 1) return () => -Math.log1p(-source()) * theta; + + var d = (k < 1 ? k + 1 : k) - 1 / 3, + c = 1 / (3 * Math.sqrt(d)), + multiplier = k < 1 ? () => Math.pow(source(), 1 / k) : () => 1; + return function() { + do { + do { + var x = randomNormal(), + v = 1 + c * x; + } while (v <= 0); + v *= v * v; + var u = 1 - source(); + } while (u >= 1 - 0.0331 * x * x * x * x && Math.log(u) >= 0.5 * x * x + d * (1 - v + Math.log(v))); + return d * v * multiplier() * theta; + }; + } + + randomGamma.source = sourceRandomGamma; + + return randomGamma; +})(defaultSource); + +var beta = (function sourceRandomBeta(source) { + var G = gamma.source(source); + + function randomBeta(alpha, beta) { + var X = G(alpha), + Y = G(beta); + return function() { + var x = X(); + return x === 0 ? 0 : x / (x + Y()); + }; + } + + randomBeta.source = sourceRandomBeta; + + return randomBeta; +})(defaultSource); + +var binomial = (function sourceRandomBinomial(source) { + var G = geometric.source(source), + B = beta.source(source); + + function randomBinomial(n, p) { + n = +n; + if ((p = +p) >= 1) return () => n; + if (p <= 0) return () => 0; + return function() { + var acc = 0, nn = n, pp = p; + while (nn * pp > 16 && nn * (1 - pp) > 16) { + var i = Math.floor((nn + 1) * pp), + y = B(i, nn - i + 1)(); + if (y <= pp) { + acc += i; + nn -= i; + pp = (pp - y) / (1 - y); + } else { + nn = i - 1; + pp /= y; + } + } + var sign = pp < 0.5, + pFinal = sign ? pp : 1 - pp, + g = G(pFinal); + for (var s = g(), k = 0; s <= nn; ++k) s += g(); + return acc + (sign ? k : nn - k); + }; + } + + randomBinomial.source = sourceRandomBinomial; + + return randomBinomial; +})(defaultSource); + +var weibull = (function sourceRandomWeibull(source) { + function randomWeibull(k, a, b) { + var outerFunc; + if ((k = +k) === 0) { + outerFunc = x => -Math.log(x); + } else { + k = 1 / k; + outerFunc = x => Math.pow(x, k); + } + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * outerFunc(-Math.log1p(-source())); + }; + } + + randomWeibull.source = sourceRandomWeibull; + + return randomWeibull; +})(defaultSource); + +var cauchy = (function sourceRandomCauchy(source) { + function randomCauchy(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * Math.tan(Math.PI * source()); + }; + } + + randomCauchy.source = sourceRandomCauchy; + + return randomCauchy; +})(defaultSource); + +var logistic = (function sourceRandomLogistic(source) { + function randomLogistic(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + var u = source(); + return a + b * Math.log(u / (1 - u)); + }; + } + + randomLogistic.source = sourceRandomLogistic; + + return randomLogistic; +})(defaultSource); + +var poisson = (function sourceRandomPoisson(source) { + var G = gamma.source(source), + B = binomial.source(source); + + function randomPoisson(lambda) { + return function() { + var acc = 0, l = lambda; + while (l > 16) { + var n = Math.floor(0.875 * l), + t = G(n)(); + if (t > l) return acc + B(n - 1, l / t)(); + acc += n; + l -= t; + } + for (var s = -Math.log1p(-source()), k = 0; s <= l; ++k) s -= Math.log1p(-source()); + return acc + k; + }; + } + + randomPoisson.source = sourceRandomPoisson; + + return randomPoisson; +})(defaultSource); + +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const mul = 0x19660D; +const inc = 0x3C6EF35F; +const eps = 1 / 0x100000000; + +function lcg(seed = Math.random()) { + let state = (0 <= seed && seed < 1 ? seed / eps : Math.abs(seed)) | 0; + return () => (state = mul * state + inc | 0, eps * (state >>> 0)); +} + +exports.randomBates = bates; +exports.randomBernoulli = bernoulli; +exports.randomBeta = beta; +exports.randomBinomial = binomial; +exports.randomCauchy = cauchy; +exports.randomExponential = exponential; +exports.randomGamma = gamma; +exports.randomGeometric = geometric; +exports.randomInt = int; +exports.randomIrwinHall = irwinHall; +exports.randomLcg = lcg; +exports.randomLogNormal = logNormal; +exports.randomLogistic = logistic; +exports.randomNormal = normal; +exports.randomPareto = pareto; +exports.randomPoisson = poisson; +exports.randomUniform = uniform; +exports.randomWeibull = weibull; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/node_modules/d3-random/dist/d3-random.min.js b/node_modules/d3-random/dist/d3-random.min.js new file mode 100644 index 00000000..920a9f91 --- /dev/null +++ b/node_modules/d3-random/dist/d3-random.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-random/ v2.2.2 Copyright 2020 Mike Bostock +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((n="undefined"!=typeof globalThis?globalThis:n||self).d3=n.d3||{})}(this,(function(n){"use strict";var r=Math.random,t=function n(r){function t(n,t){return n=null==n?0:+n,t=null==t?1:+t,1===arguments.length?(t=n,n=0):t-=n,function(){return r()*t+n}}return t.source=n,t}(r),o=function n(r){function t(n,t){return arguments.length<2&&(t=n,n=0),n=Math.floor(n),t=Math.floor(t)-n,function(){return Math.floor(r()*t+n)}}return t.source=n,t}(r),u=function n(r){function t(n,t){var o,u;return n=null==n?0:+n,t=null==t?1:+t,function(){var e;if(null!=o)e=o,o=null;else do{o=2*r()-1,e=2*r()-1,u=o*o+e*e}while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}}return t.source=n,t}(r),e=function n(r){var t=u.source(r);function o(){var n=t.apply(this,arguments);return function(){return Math.exp(n())}}return o.source=n,o}(r),a=function n(r){function t(n){return(n=+n)<=0?()=>0:function(){for(var t=0,o=n;o>1;--o)t+=r();return t+o*r()}}return t.source=n,t}(r),i=function n(r){var t=a.source(r);function o(n){if(0==(n=+n))return r;var o=t(n);return function(){return o()/n}}return o.source=n,o}(r),c=function n(r){function t(n){return function(){return-Math.log1p(-r())/n}}return t.source=n,t}(r),f=function n(r){function t(n){if((n=+n)<0)throw new RangeError("invalid alpha");return n=1/-n,function(){return Math.pow(1-r(),n)}}return t.source=n,t}(r),l=function n(r){function t(n){if((n=+n)<0||n>1)throw new RangeError("invalid p");return function(){return Math.floor(r()+n)}}return t.source=n,t}(r),h=function n(r){function t(n){if((n=+n)<0||n>1)throw new RangeError("invalid p");return 0===n?()=>1/0:1===n?()=>1:(n=Math.log1p(-n),function(){return 1+Math.floor(Math.log1p(-r())/n)})}return t.source=n,t}(r),s=function n(r){var t=u.source(r)();function o(n,o){if((n=+n)<0)throw new RangeError("invalid k");if(0===n)return()=>0;if(o=null==o?1:+o,1===n)return()=>-Math.log1p(-r())*o;var u=(n<1?n+1:n)-1/3,e=1/(3*Math.sqrt(u)),a=n<1?()=>Math.pow(r(),1/n):()=>1;return function(){do{do{var n=t(),i=1+e*n}while(i<=0);i*=i*i;var c=1-r()}while(c>=1-.0331*n*n*n*n&&Math.log(c)>=.5*n*n+u*(1-i+Math.log(i)));return u*i*a()*o}}return o.source=n,o}(r),d=function n(r){var t=s.source(r);function o(n,r){var o=t(n),u=t(r);return function(){var n=o();return 0===n?0:n/(n+u())}}return o.source=n,o}(r),M=function n(r){var t=h.source(r),o=d.source(r);function u(n,r){return n=+n,(r=+r)>=1?()=>n:r<=0?()=>0:function(){for(var u=0,e=n,a=r;e*a>16&&e*(1-a)>16;){var i=Math.floor((e+1)*a),c=o(i,e-i+1)();c<=a?(u+=i,e-=i,a=(a-c)/(1-c)):(e=i-1,a/=c)}for(var f=a<.5,l=t(f?a:1-a),h=l(),s=0;h<=e;++s)h+=l();return u+(f?s:e-s)}}return u.source=n,u}(r),v=function n(r){function t(n,t,o){var u;return 0==(n=+n)?u=n=>-Math.log(n):(n=1/n,u=r=>Math.pow(r,n)),t=null==t?0:+t,o=null==o?1:+o,function(){return t+o*u(-Math.log1p(-r()))}}return t.source=n,t}(r),m=function n(r){function t(n,t){return n=null==n?0:+n,t=null==t?1:+t,function(){return n+t*Math.tan(Math.PI*r())}}return t.source=n,t}(r),p=function n(r){function t(n,t){return n=null==n?0:+n,t=null==t?1:+t,function(){var o=r();return n+t*Math.log(o/(1-o))}}return t.source=n,t}(r),g=function n(r){var t=s.source(r),o=M.source(r);function u(n){return function(){for(var u=0,e=n;e>16;){var a=Math.floor(.875*e),i=t(a)();if(i>e)return u+o(a-1,e/i)();u+=a,e-=i}for(var c=-Math.log1p(-r()),f=0;c<=e;++f)c-=Math.log1p(-r());return u+f}}return u.source=n,u}(r);const w=1/4294967296;n.randomBates=i,n.randomBernoulli=l,n.randomBeta=d,n.randomBinomial=M,n.randomCauchy=m,n.randomExponential=c,n.randomGamma=s,n.randomGeometric=h,n.randomInt=o,n.randomIrwinHall=a,n.randomLcg=function(n=Math.random()){let r=0|(0<=n&&n<1?n/w:Math.abs(n));return()=>(r=1664525*r+1013904223|0,w*(r>>>0))},n.randomLogNormal=e,n.randomLogistic=p,n.randomNormal=u,n.randomPareto=f,n.randomPoisson=g,n.randomUniform=t,n.randomWeibull=v,Object.defineProperty(n,"__esModule",{value:!0})})); diff --git a/node_modules/d3-random/package.json b/node_modules/d3-random/package.json new file mode 100644 index 00000000..b57a54f0 --- /dev/null +++ b/node_modules/d3-random/package.json @@ -0,0 +1,73 @@ +{ + "_from": "d3-random@2", + "_id": "d3-random@2.2.2", + "_inBundle": false, + "_integrity": "sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==", + "_location": "/d3-random", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-random@2", + "name": "d3-random", + "escapedName": "d3-random", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3" + ], + "_resolved": "https://registry.npmjs.org/d3-random/-/d3-random-2.2.2.tgz", + "_shasum": "5eebd209ef4e45a2b362b019c1fb21c2c98cbb6e", + "_spec": "d3-random@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-random/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Generate random numbers from various distributions.", + "devDependencies": { + "d3-array": "1 - 2", + "eslint": "7", + "jsdom": "16", + "rollup": "2", + "rollup-plugin-terser": "7", + "tape": "4", + "tape-await": "0.1" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-random/", + "jsdelivr": "dist/d3-random.min.js", + "keywords": [ + "d3", + "d3-module", + "random", + "rng" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-random.js", + "module": "src/index.js", + "name": "d3-random", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-random.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "./test/run.sh" + }, + "sideEffects": false, + "unpkg": "dist/d3-random.min.js", + "version": "2.2.2" +} diff --git a/node_modules/d3-random/src/bates.js b/node_modules/d3-random/src/bates.js new file mode 100644 index 00000000..6bafddd0 --- /dev/null +++ b/node_modules/d3-random/src/bates.js @@ -0,0 +1,19 @@ +import defaultSource from "./defaultSource.js"; +import irwinHall from "./irwinHall.js"; + +export default (function sourceRandomBates(source) { + var I = irwinHall.source(source); + + function randomBates(n) { + // use limiting distribution at n === 0 + if ((n = +n) === 0) return source; + var randomIrwinHall = I(n); + return function() { + return randomIrwinHall() / n; + }; + } + + randomBates.source = sourceRandomBates; + + return randomBates; +})(defaultSource); diff --git a/node_modules/d3-random/src/bernoulli.js b/node_modules/d3-random/src/bernoulli.js new file mode 100644 index 00000000..8751b433 --- /dev/null +++ b/node_modules/d3-random/src/bernoulli.js @@ -0,0 +1,14 @@ +import defaultSource from "./defaultSource.js"; + +export default (function sourceRandomBernoulli(source) { + function randomBernoulli(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + return function() { + return Math.floor(source() + p); + }; + } + + randomBernoulli.source = sourceRandomBernoulli; + + return randomBernoulli; +})(defaultSource); diff --git a/node_modules/d3-random/src/beta.js b/node_modules/d3-random/src/beta.js new file mode 100644 index 00000000..15bb2b35 --- /dev/null +++ b/node_modules/d3-random/src/beta.js @@ -0,0 +1,19 @@ +import defaultSource from "./defaultSource.js"; +import gamma from "./gamma.js"; + +export default (function sourceRandomBeta(source) { + var G = gamma.source(source); + + function randomBeta(alpha, beta) { + var X = G(alpha), + Y = G(beta); + return function() { + var x = X(); + return x === 0 ? 0 : x / (x + Y()); + }; + } + + randomBeta.source = sourceRandomBeta; + + return randomBeta; +})(defaultSource); diff --git a/node_modules/d3-random/src/binomial.js b/node_modules/d3-random/src/binomial.js new file mode 100644 index 00000000..3213b4a7 --- /dev/null +++ b/node_modules/d3-random/src/binomial.js @@ -0,0 +1,38 @@ +import defaultSource from "./defaultSource.js"; +import beta from "./beta.js"; +import geometric from "./geometric.js"; + +export default (function sourceRandomBinomial(source) { + var G = geometric.source(source), + B = beta.source(source); + + function randomBinomial(n, p) { + n = +n; + if ((p = +p) >= 1) return () => n; + if (p <= 0) return () => 0; + return function() { + var acc = 0, nn = n, pp = p; + while (nn * pp > 16 && nn * (1 - pp) > 16) { + var i = Math.floor((nn + 1) * pp), + y = B(i, nn - i + 1)(); + if (y <= pp) { + acc += i; + nn -= i; + pp = (pp - y) / (1 - y); + } else { + nn = i - 1; + pp /= y; + } + } + var sign = pp < 0.5, + pFinal = sign ? pp : 1 - pp, + g = G(pFinal); + for (var s = g(), k = 0; s <= nn; ++k) s += g(); + return acc + (sign ? k : nn - k); + }; + } + + randomBinomial.source = sourceRandomBinomial; + + return randomBinomial; +})(defaultSource); diff --git a/node_modules/d3-random/src/cauchy.js b/node_modules/d3-random/src/cauchy.js new file mode 100644 index 00000000..95c15ca1 --- /dev/null +++ b/node_modules/d3-random/src/cauchy.js @@ -0,0 +1,15 @@ +import defaultSource from "./defaultSource.js"; + +export default (function sourceRandomCauchy(source) { + function randomCauchy(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * Math.tan(Math.PI * source()); + }; + } + + randomCauchy.source = sourceRandomCauchy; + + return randomCauchy; +})(defaultSource); diff --git a/node_modules/d3-random/src/defaultSource.js b/node_modules/d3-random/src/defaultSource.js new file mode 100644 index 00000000..ef54f3df --- /dev/null +++ b/node_modules/d3-random/src/defaultSource.js @@ -0,0 +1 @@ +export default Math.random; diff --git a/node_modules/d3-random/src/exponential.js b/node_modules/d3-random/src/exponential.js new file mode 100644 index 00000000..0d4304cc --- /dev/null +++ b/node_modules/d3-random/src/exponential.js @@ -0,0 +1,13 @@ +import defaultSource from "./defaultSource.js"; + +export default (function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function() { + return -Math.log1p(-source()) / lambda; + }; + } + + randomExponential.source = sourceRandomExponential; + + return randomExponential; +})(defaultSource); diff --git a/node_modules/d3-random/src/gamma.js b/node_modules/d3-random/src/gamma.js new file mode 100644 index 00000000..48bf7062 --- /dev/null +++ b/node_modules/d3-random/src/gamma.js @@ -0,0 +1,34 @@ +import defaultSource from "./defaultSource.js"; +import normal from "./normal.js"; + +export default (function sourceRandomGamma(source) { + var randomNormal = normal.source(source)(); + + function randomGamma(k, theta) { + if ((k = +k) < 0) throw new RangeError("invalid k"); + // degenerate distribution if k === 0 + if (k === 0) return () => 0; + theta = theta == null ? 1 : +theta; + // exponential distribution if k === 1 + if (k === 1) return () => -Math.log1p(-source()) * theta; + + var d = (k < 1 ? k + 1 : k) - 1 / 3, + c = 1 / (3 * Math.sqrt(d)), + multiplier = k < 1 ? () => Math.pow(source(), 1 / k) : () => 1; + return function() { + do { + do { + var x = randomNormal(), + v = 1 + c * x; + } while (v <= 0); + v *= v * v; + var u = 1 - source(); + } while (u >= 1 - 0.0331 * x * x * x * x && Math.log(u) >= 0.5 * x * x + d * (1 - v + Math.log(v))); + return d * v * multiplier() * theta; + }; + } + + randomGamma.source = sourceRandomGamma; + + return randomGamma; +})(defaultSource); diff --git a/node_modules/d3-random/src/geometric.js b/node_modules/d3-random/src/geometric.js new file mode 100644 index 00000000..2cae2cc8 --- /dev/null +++ b/node_modules/d3-random/src/geometric.js @@ -0,0 +1,17 @@ +import defaultSource from "./defaultSource.js"; + +export default (function sourceRandomGeometric(source) { + function randomGeometric(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + if (p === 0) return () => Infinity; + if (p === 1) return () => 1; + p = Math.log1p(-p); + return function() { + return 1 + Math.floor(Math.log1p(-source()) / p); + }; + } + + randomGeometric.source = sourceRandomGeometric; + + return randomGeometric; +})(defaultSource); diff --git a/node_modules/d3-random/src/index.js b/node_modules/d3-random/src/index.js new file mode 100644 index 00000000..033891e9 --- /dev/null +++ b/node_modules/d3-random/src/index.js @@ -0,0 +1,18 @@ +export {default as randomUniform} from "./uniform.js"; +export {default as randomInt} from "./int.js"; +export {default as randomNormal} from "./normal.js"; +export {default as randomLogNormal} from "./logNormal.js"; +export {default as randomBates} from "./bates.js"; +export {default as randomIrwinHall} from "./irwinHall.js"; +export {default as randomExponential} from "./exponential.js"; +export {default as randomPareto} from "./pareto.js"; +export {default as randomBernoulli} from "./bernoulli.js"; +export {default as randomGeometric} from "./geometric.js"; +export {default as randomBinomial} from "./binomial.js"; +export {default as randomGamma} from "./gamma.js"; +export {default as randomBeta} from "./beta.js"; +export {default as randomWeibull} from "./weibull.js"; +export {default as randomCauchy} from "./cauchy.js"; +export {default as randomLogistic} from "./logistic.js"; +export {default as randomPoisson} from "./poisson.js"; +export {default as randomLcg} from "./lcg.js"; diff --git a/node_modules/d3-random/src/int.js b/node_modules/d3-random/src/int.js new file mode 100644 index 00000000..a47249b7 --- /dev/null +++ b/node_modules/d3-random/src/int.js @@ -0,0 +1,16 @@ +import defaultSource from "./defaultSource.js"; + +export default (function sourceRandomInt(source) { + function randomInt(min, max) { + if (arguments.length < 2) max = min, min = 0; + min = Math.floor(min); + max = Math.floor(max) - min; + return function() { + return Math.floor(source() * max + min); + }; + } + + randomInt.source = sourceRandomInt; + + return randomInt; +})(defaultSource); diff --git a/node_modules/d3-random/src/irwinHall.js b/node_modules/d3-random/src/irwinHall.js new file mode 100644 index 00000000..4db5dccb --- /dev/null +++ b/node_modules/d3-random/src/irwinHall.js @@ -0,0 +1,15 @@ +import defaultSource from "./defaultSource.js"; + +export default (function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + if ((n = +n) <= 0) return () => 0; + return function() { + for (var sum = 0, i = n; i > 1; --i) sum += source(); + return sum + i * source(); + }; + } + + randomIrwinHall.source = sourceRandomIrwinHall; + + return randomIrwinHall; +})(defaultSource); diff --git a/node_modules/d3-random/src/lcg.js b/node_modules/d3-random/src/lcg.js new file mode 100644 index 00000000..fb058788 --- /dev/null +++ b/node_modules/d3-random/src/lcg.js @@ -0,0 +1,9 @@ +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const mul = 0x19660D; +const inc = 0x3C6EF35F; +const eps = 1 / 0x100000000; + +export default function lcg(seed = Math.random()) { + let state = (0 <= seed && seed < 1 ? seed / eps : Math.abs(seed)) | 0; + return () => (state = mul * state + inc | 0, eps * (state >>> 0)); +} diff --git a/node_modules/d3-random/src/logNormal.js b/node_modules/d3-random/src/logNormal.js new file mode 100644 index 00000000..3465fba3 --- /dev/null +++ b/node_modules/d3-random/src/logNormal.js @@ -0,0 +1,17 @@ +import defaultSource from "./defaultSource.js"; +import normal from "./normal.js"; + +export default (function sourceRandomLogNormal(source) { + var N = normal.source(source); + + function randomLogNormal() { + var randomNormal = N.apply(this, arguments); + return function() { + return Math.exp(randomNormal()); + }; + } + + randomLogNormal.source = sourceRandomLogNormal; + + return randomLogNormal; +})(defaultSource); diff --git a/node_modules/d3-random/src/logistic.js b/node_modules/d3-random/src/logistic.js new file mode 100644 index 00000000..b2cda2a3 --- /dev/null +++ b/node_modules/d3-random/src/logistic.js @@ -0,0 +1,16 @@ +import defaultSource from "./defaultSource.js"; + +export default (function sourceRandomLogistic(source) { + function randomLogistic(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + var u = source(); + return a + b * Math.log(u / (1 - u)); + }; + } + + randomLogistic.source = sourceRandomLogistic; + + return randomLogistic; +})(defaultSource); diff --git a/node_modules/d3-random/src/normal.js b/node_modules/d3-random/src/normal.js new file mode 100644 index 00000000..b6838d67 --- /dev/null +++ b/node_modules/d3-random/src/normal.js @@ -0,0 +1,28 @@ +import defaultSource from "./defaultSource.js"; + +export default (function sourceRandomNormal(source) { + function randomNormal(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function() { + var y; + + // If available, use the second previously-generated uniform random. + if (x != null) y = x, x = null; + + // Otherwise, generate a new x and y. + else do { + x = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } + + randomNormal.source = sourceRandomNormal; + + return randomNormal; +})(defaultSource); diff --git a/node_modules/d3-random/src/pareto.js b/node_modules/d3-random/src/pareto.js new file mode 100644 index 00000000..e5496f0c --- /dev/null +++ b/node_modules/d3-random/src/pareto.js @@ -0,0 +1,15 @@ +import defaultSource from "./defaultSource.js"; + +export default (function sourceRandomPareto(source) { + function randomPareto(alpha) { + if ((alpha = +alpha) < 0) throw new RangeError("invalid alpha"); + alpha = 1 / -alpha; + return function() { + return Math.pow(1 - source(), alpha); + }; + } + + randomPareto.source = sourceRandomPareto; + + return randomPareto; +})(defaultSource); diff --git a/node_modules/d3-random/src/poisson.js b/node_modules/d3-random/src/poisson.js new file mode 100644 index 00000000..da939955 --- /dev/null +++ b/node_modules/d3-random/src/poisson.js @@ -0,0 +1,27 @@ +import defaultSource from "./defaultSource.js"; +import binomial from "./binomial.js"; +import gamma from "./gamma.js"; + +export default (function sourceRandomPoisson(source) { + var G = gamma.source(source), + B = binomial.source(source); + + function randomPoisson(lambda) { + return function() { + var acc = 0, l = lambda; + while (l > 16) { + var n = Math.floor(0.875 * l), + t = G(n)(); + if (t > l) return acc + B(n - 1, l / t)(); + acc += n; + l -= t; + } + for (var s = -Math.log1p(-source()), k = 0; s <= l; ++k) s -= Math.log1p(-source()); + return acc + k; + }; + } + + randomPoisson.source = sourceRandomPoisson; + + return randomPoisson; +})(defaultSource); diff --git a/node_modules/d3-random/src/uniform.js b/node_modules/d3-random/src/uniform.js new file mode 100644 index 00000000..a2bc468a --- /dev/null +++ b/node_modules/d3-random/src/uniform.js @@ -0,0 +1,17 @@ +import defaultSource from "./defaultSource.js"; + +export default (function sourceRandomUniform(source) { + function randomUniform(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) max = min, min = 0; + else max -= min; + return function() { + return source() * max + min; + }; + } + + randomUniform.source = sourceRandomUniform; + + return randomUniform; +})(defaultSource); diff --git a/node_modules/d3-random/src/weibull.js b/node_modules/d3-random/src/weibull.js new file mode 100644 index 00000000..b7d796cc --- /dev/null +++ b/node_modules/d3-random/src/weibull.js @@ -0,0 +1,22 @@ +import defaultSource from "./defaultSource.js"; + +export default (function sourceRandomWeibull(source) { + function randomWeibull(k, a, b) { + var outerFunc; + if ((k = +k) === 0) { + outerFunc = x => -Math.log(x); + } else { + k = 1 / k; + outerFunc = x => Math.pow(x, k); + } + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * outerFunc(-Math.log1p(-source())); + }; + } + + randomWeibull.source = sourceRandomWeibull; + + return randomWeibull; +})(defaultSource); diff --git a/node_modules/d3-scale-chromatic/LICENSE b/node_modules/d3-scale-chromatic/LICENSE new file mode 100644 index 00000000..b10990f4 --- /dev/null +++ b/node_modules/d3-scale-chromatic/LICENSE @@ -0,0 +1,44 @@ +Copyright 2010-2018 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Apache-Style Software License for ColorBrewer software and ColorBrewer Color +Schemes + +Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State +University. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. diff --git a/node_modules/d3-scale-chromatic/README.md b/node_modules/d3-scale-chromatic/README.md new file mode 100644 index 00000000..20ae5fec --- /dev/null +++ b/node_modules/d3-scale-chromatic/README.md @@ -0,0 +1,386 @@ +# d3-scale-chromatic + +This module provides sequential, diverging and categorical color schemes designed to work with [d3-scale](https://github.com/d3/d3-scale)’s [d3.scaleOrdinal](https://github.com/d3/d3-scale#ordinal-scales) and [d3.scaleSequential](https://github.com/d3/d3-scale#sequential-scales). Most of these schemes are derived from Cynthia A. Brewer’s [ColorBrewer](http://colorbrewer2.org). Since ColorBrewer publishes only discrete color schemes, the sequential and diverging scales are interpolated using [uniform B-splines](https://bl.ocks.org/mbostock/048d21cf747371b11884f75ad896e5a5). + +For example, to create a categorical color scale using the [Accent](#schemeAccent) color scheme: + +```js +var accent = d3.scaleOrdinal(d3.schemeAccent); +``` + +To create a sequential discrete nine-color scale using the [Blues](#schemeBlues) color scheme: + +```js +var blues = d3.scaleOrdinal(d3.schemeBlues[9]); +``` + +To create a diverging, continuous color scale using the [PiYG](#interpolatePiYG) color scheme: + +```js +var piyg = d3.scaleSequential(d3.interpolatePiYG); +``` + +## Installing + +If you use NPM, `npm install d3-scale-chromatic`. Otherwise, download the [latest release](https://github.com/d3/d3-scale-chromatic/releases/latest) or load directly from [d3js.org](https://d3js.org) as a [standalone library](https://d3js.org/d3-scale-chromatic.v1.min.js). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + + +``` + +Or, as part of the [D3 default bundle](https://github.com/d3/d3): + +```html + + +``` + +[Try d3-scale-chromatic in your browser.](https://observablehq.com/collection/@d3/d3-scale-chromatic) + +## API Reference + +### Categorical + +# d3.schemeCategory10 [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/categorical/category10.js "Source") + +category10 + +An array of ten categorical colors represented as RGB hexadecimal strings. + +# d3.schemeAccent [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/categorical/Accent.js "Source") + +Accent + +An array of eight categorical colors represented as RGB hexadecimal strings. + +# d3.schemeDark2 [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/categorical/Dark2.js "Source") + +Dark2 + +An array of eight categorical colors represented as RGB hexadecimal strings. + +# d3.schemePaired [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/categorical/Paired.js "Source") + +Paired + +An array of twelve categorical colors represented as RGB hexadecimal strings. + +# d3.schemePastel1 [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/categorical/Pastel1.js "Source") + +Pastel1 + +An array of nine categorical colors represented as RGB hexadecimal strings. + +# d3.schemePastel2 [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/categorical/Pastel2.js "Source") + +Pastel2 + +An array of eight categorical colors represented as RGB hexadecimal strings. + +# d3.schemeSet1 [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/categorical/Set1.js "Source") + +Set1 + +An array of nine categorical colors represented as RGB hexadecimal strings. + +# d3.schemeSet2 [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/categorical/Set2.js "Source") + +Set2 + +An array of eight categorical colors represented as RGB hexadecimal strings. + +# d3.schemeSet3 [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/categorical/Set3.js "Source") + +Set3 + +An array of twelve categorical colors represented as RGB hexadecimal strings. + +# d3.schemeTableau10 [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/categorical/Tableau10.js "Source") + +Tableau10 + +An array of ten categorical colors authored by Tableau as part of [Tableau 10](https://www.tableau.com/about/blog/2016/7/colors-upgrade-tableau-10-56782) represented as RGB hexadecimal strings. + +### Diverging + +Diverging color schemes are available as continuous interpolators (often used with [d3.scaleSequential](https://github.com/d3/d3-scale/blob/master/README.md#sequential-scales)) and as discrete schemes (often used with [d3.scaleOrdinal](https://github.com/d3/d3-scale/blob/master/README.md#ordinal-scales)). Each discrete scheme, such as [d3.schemeBrBG](#schemeBrBG), is represented as an array of arrays of hexadecimal color strings. The *k*th element of this array contains the color scheme of size *k*; for example, `d3.schemeBrBG[9]` contains an array of nine strings representing the nine colors of the brown-blue-green diverging color scheme. Diverging color schemes support a size *k* ranging from 3 to 11. + +# d3.interpolateBrBG(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/diverging/BrBG.js "Source") +
# d3.schemeBrBG[*k*] + +BrBG + +Given a number *t* in the range [0,1], returns the corresponding color from the “BrBG†diverging color scheme represented as an RGB string. + +# d3.interpolatePRGn(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/diverging/PRGn.js "Source") +
# d3.schemePRGn[*k*] + +PRGn + +Given a number *t* in the range [0,1], returns the corresponding color from the “PRGn†diverging color scheme represented as an RGB string. + +# d3.interpolatePiYG(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/diverging/PiYG.js "Source") +
# d3.schemePiYG[*k*] + +PiYG + +Given a number *t* in the range [0,1], returns the corresponding color from the “PiYG†diverging color scheme represented as an RGB string. + +# d3.interpolatePuOr(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/diverging/PuOr.js "Source") +
# d3.schemePuOr[*k*] + +PuOr + +Given a number *t* in the range [0,1], returns the corresponding color from the “PuOr†diverging color scheme represented as an RGB string. + +# d3.interpolateRdBu(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/diverging/RdBu.js "Source") +
# d3.schemeRdBu[*k*] + +RdBu + +Given a number *t* in the range [0,1], returns the corresponding color from the “RdBu†diverging color scheme represented as an RGB string. + +# d3.interpolateRdGy(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/diverging/RdGy.js "Source") +
# d3.schemeRdGy[*k*] + +RdGy + +Given a number *t* in the range [0,1], returns the corresponding color from the “RdGy†diverging color scheme represented as an RGB string. + +# d3.interpolateRdYlBu(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/diverging/RdYlBu.js "Source") +
# d3.schemeRdYlBu[*k*] + +RdYlBu + +Given a number *t* in the range [0,1], returns the corresponding color from the “RdYlBu†diverging color scheme represented as an RGB string. + +# d3.interpolateRdYlGn(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/diverging/RdYlGn.js "Source") +
# d3.schemeRdYlGn[*k*] + +RdYlGn + +Given a number *t* in the range [0,1], returns the corresponding color from the “RdYlGn†diverging color scheme represented as an RGB string. + +# d3.interpolateSpectral(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/diverging/Spectral.js "Source") +
# d3.schemeSpectral[*k*] + +Spectral + +Given a number *t* in the range [0,1], returns the corresponding color from the “Spectral†diverging color scheme represented as an RGB string. + +### Sequential (Single Hue) + +Sequential, single-hue color schemes are available as continuous interpolators (often used with [d3.scaleSequential](https://github.com/d3/d3-scale/blob/master/README.md#sequential-scales)) and as discrete schemes (often used with [d3.scaleOrdinal](https://github.com/d3/d3-scale/blob/master/README.md#ordinal-scales)). Each discrete scheme, such as [d3.schemeBlues](#schemeBlues), is represented as an array of arrays of hexadecimal color strings. The *k*th element of this array contains the color scheme of size *k*; for example, `d3.schemeBlues[9]` contains an array of nine strings representing the nine colors of the blue sequential color scheme. Sequential, single-hue color schemes support a size *k* ranging from 3 to 9. + +# d3.interpolateBlues(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-single/Blues.js "Source") +
# d3.schemeBlues[*k*] + +Blues + +Given a number *t* in the range [0,1], returns the corresponding color from the “Blues†sequential color scheme represented as an RGB string. + +# d3.interpolateGreens(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-single/Greens.js "Source") +
# d3.schemeGreens[*k*] + +Greens + +Given a number *t* in the range [0,1], returns the corresponding color from the “Greens†sequential color scheme represented as an RGB string. + +# d3.interpolateGreys(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-single/Greys.js "Source") +
# d3.schemeGreys[*k*] + +Greys + +Given a number *t* in the range [0,1], returns the corresponding color from the “Greys†sequential color scheme represented as an RGB string. + +# d3.interpolateOranges(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-single/Oranges.js "Source") +
# d3.schemeOranges[*k*] + +Oranges + +Given a number *t* in the range [0,1], returns the corresponding color from the “Oranges†sequential color scheme represented as an RGB string. + +# d3.interpolatePurples(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-single/Purples.js "Source") +
# d3.schemePurples[*k*] + +Purples + +Given a number *t* in the range [0,1], returns the corresponding color from the “Purples†sequential color scheme represented as an RGB string. + +# d3.interpolateReds(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-single/Reds.js "Source") +
# d3.schemeReds[*k*] + +Reds + +Given a number *t* in the range [0,1], returns the corresponding color from the “Reds†sequential color scheme represented as an RGB string. + +### Sequential (Multi-Hue) + +Sequential, multi-hue color schemes are available as continuous interpolators (often used with [d3.scaleSequential](https://github.com/d3/d3-scale/blob/master/README.md#sequential-scales)) and as discrete schemes (often used with [d3.scaleOrdinal](https://github.com/d3/d3-scale/blob/master/README.md#ordinal-scales)). Each discrete scheme, such as [d3.schemeBuGn](#schemeBuGn), is represented as an array of arrays of hexadecimal color strings. The *k*th element of this array contains the color scheme of size *k*; for example, `d3.schemeBuGn[9]` contains an array of nine strings representing the nine colors of the blue-green sequential color scheme. Sequential, multi-hue color schemes support a size *k* ranging from 3 to 9. + +# d3.interpolateTurbo(t) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/turbo.js "Source") + +turbo + +Given a number *t* in the range [0,1], returns the corresponding color from the “turbo†color scheme by [Anton Mikhailov](https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html). + +# d3.interpolateViridis(t) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/viridis.js "Source") + +viridis + +Given a number *t* in the range [0,1], returns the corresponding color from the “viridis†perceptually-uniform color scheme designed by [van der Walt, Smith and Firing](https://bids.github.io/colormap/) for matplotlib, represented as an RGB string. + +# d3.interpolateInferno(t) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/viridis.js "Source") + +inferno + +Given a number *t* in the range [0,1], returns the corresponding color from the “inferno†perceptually-uniform color scheme designed by [van der Walt and Smith](https://bids.github.io/colormap/) for matplotlib, represented as an RGB string. + +# d3.interpolateMagma(t) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/viridis.js "Source") + +magma + +Given a number *t* in the range [0,1], returns the corresponding color from the “magma†perceptually-uniform color scheme designed by [van der Walt and Smith](https://bids.github.io/colormap/) for matplotlib, represented as an RGB string. + +# d3.interpolatePlasma(t) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/viridis.js "Source") + +plasma + +Given a number *t* in the range [0,1], returns the corresponding color from the “plasma†perceptually-uniform color scheme designed by [van der Walt and Smith](https://bids.github.io/colormap/) for matplotlib, represented as an RGB string. + +# d3.interpolateCividis(t) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/cividis.js "Source") + +cividis + +Given a number *t* in the range [0,1], returns the corresponding color from the “cividis†color vision deficiency-optimized color scheme designed by [Nuñez, Anderton, and Renslow](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0199239), represented as an RGB string. + +# d3.interpolateWarm(t) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/rainbow.js "Source") + +warm + +Given a number *t* in the range [0,1], returns the corresponding color from a 180° rotation of [Niccoli’s perceptual rainbow](https://mycarta.wordpress.com/2013/02/21/perceptual-rainbow-palette-the-method/), represented as an RGB string. + +# d3.interpolateCool(t) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/rainbow.js "Source") + +cool + +Given a number *t* in the range [0,1], returns the corresponding color from [Niccoli’s perceptual rainbow](https://mycarta.wordpress.com/2013/02/21/perceptual-rainbow-palette-the-method/), represented as an RGB string. + +# d3.interpolateCubehelixDefault(t) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/cubehelix.js "Source") + +cubehelix + +Given a number *t* in the range [0,1], returns the corresponding color from [Green’s default Cubehelix](http://www.mrao.cam.ac.uk/~dag/CUBEHELIX/) represented as an RGB string. + +# d3.interpolateBuGn(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/BuGn.js "Source") +
# d3.schemeBuGn[*k*] + +BuGn + +Given a number *t* in the range [0,1], returns the corresponding color from the “BuGn†sequential color scheme represented as an RGB string. + +# d3.interpolateBuPu(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/BuPu.js "Source") +
# d3.schemeBuPu[*k*] + +BuPu + +Given a number *t* in the range [0,1], returns the corresponding color from the “BuPu†sequential color scheme represented as an RGB string. + +# d3.interpolateGnBu(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/GnBu.js "Source") +
# d3.schemeGnBu[*k*] + +GnBu + +Given a number *t* in the range [0,1], returns the corresponding color from the “GnBu†sequential color scheme represented as an RGB string. + +# d3.interpolateOrRd(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/OrRd.js "Source") +
# d3.schemeOrRd[*k*] + +OrRd + +Given a number *t* in the range [0,1], returns the corresponding color from the “OrRd†sequential color scheme represented as an RGB string. + +# d3.interpolatePuBuGn(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/PuBuGn.js "Source") +
# d3.schemePuBuGn[*k*] + +PuBuGn + +Given a number *t* in the range [0,1], returns the corresponding color from the “PuBuGn†sequential color scheme represented as an RGB string. + +# d3.interpolatePuBu(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/PuBu.js "Source") +
# d3.schemePuBu[*k*] + +PuBu + +Given a number *t* in the range [0,1], returns the corresponding color from the “PuBu†sequential color scheme represented as an RGB string. + +# d3.interpolatePuRd(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/PuRd.js "Source") +
# d3.schemePuRd[*k*] + +PuRd + +Given a number *t* in the range [0,1], returns the corresponding color from the “PuRd†sequential color scheme represented as an RGB string. + +# d3.interpolateRdPu(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/RdPu.js "Source") +
# d3.schemeRdPu[*k*] + +RdPu + +Given a number *t* in the range [0,1], returns the corresponding color from the “RdPu†sequential color scheme represented as an RGB string. + +# d3.interpolateYlGnBu(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/YlGnBu.js "Source") +
# d3.schemeYlGnBu[*k*] + +YlGnBu + +Given a number *t* in the range [0,1], returns the corresponding color from the “YlGnBu†sequential color scheme represented as an RGB string. + +# d3.interpolateYlGn(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/YlGn.js "Source") +
# d3.schemeYlGn[*k*] + +YlGn + +Given a number *t* in the range [0,1], returns the corresponding color from the “YlGn†sequential color scheme represented as an RGB string. + +# d3.interpolateYlOrBr(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/YlOrBr.js "Source") +
# d3.schemeYlOrBr[*k*] + +YlOrBr + +Given a number *t* in the range [0,1], returns the corresponding color from the “YlOrBr†sequential color scheme represented as an RGB string. + +# d3.interpolateYlOrRd(*t*) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/YlOrRd.js "Source") +
# d3.schemeYlOrRd[*k*] + +YlOrRd + +Given a number *t* in the range [0,1], returns the corresponding color from the “YlOrRd†sequential color scheme represented as an RGB string. + +### Cyclical + +# d3.interpolateRainbow(t) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/rainbow.js "Source") + +rainbow + +Given a number *t* in the range [0,1], returns the corresponding color from [d3.interpolateWarm](#interpolateWarm) scale from [0.0, 0.5] followed by the [d3.interpolateCool](#interpolateCool) scale from [0.5, 1.0], thus implementing the cyclical [less-angry rainbow](http://bl.ocks.org/mbostock/310c99e53880faec2434) color scheme. + +# d3.interpolateSinebow(t) [<>](https://github.com/d3/d3-scale-chromatic/blob/master/src/sequential-multi/sinebow.js "Source") + +sinebow + +Given a number *t* in the range [0,1], returns the corresponding color from the “sinebow†color scheme by [Jim Bumgardner](https://krazydad.com/tutorials/makecolors.php) and [Charlie Loyd](http://basecase.org/env/on-rainbows). diff --git a/node_modules/d3-scale-chromatic/dist/d3-scale-chromatic.js b/node_modules/d3-scale-chromatic/dist/d3-scale-chromatic.js new file mode 100644 index 00000000..b68a1510 --- /dev/null +++ b/node_modules/d3-scale-chromatic/dist/d3-scale-chromatic.js @@ -0,0 +1,519 @@ +// https://d3js.org/d3-scale-chromatic/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-interpolate'), require('d3-color')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-interpolate', 'd3-color'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3)); +}(this, function (exports, d3Interpolate, d3Color) { 'use strict'; + +function colors(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; +} + +var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + +var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); + +var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); + +var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); + +var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); + +var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); + +var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); + +var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); + +var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); + +var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); + +var ramp = scheme => d3Interpolate.interpolateRgbBasis(scheme[scheme.length - 1]); + +var scheme = new Array(3).concat( + "d8b365f5f5f55ab4ac", + "a6611adfc27d80cdc1018571", + "a6611adfc27df5f5f580cdc1018571", + "8c510ad8b365f6e8c3c7eae55ab4ac01665e", + "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", + "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", + "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", + "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", + "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" +).map(colors); + +var BrBG = ramp(scheme); + +var scheme$1 = new Array(3).concat( + "af8dc3f7f7f77fbf7b", + "7b3294c2a5cfa6dba0008837", + "7b3294c2a5cff7f7f7a6dba0008837", + "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", + "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", + "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", + "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", + "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", + "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" +).map(colors); + +var PRGn = ramp(scheme$1); + +var scheme$2 = new Array(3).concat( + "e9a3c9f7f7f7a1d76a", + "d01c8bf1b6dab8e1864dac26", + "d01c8bf1b6daf7f7f7b8e1864dac26", + "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", + "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", + "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", + "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", + "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", + "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" +).map(colors); + +var PiYG = ramp(scheme$2); + +var scheme$3 = new Array(3).concat( + "998ec3f7f7f7f1a340", + "5e3c99b2abd2fdb863e66101", + "5e3c99b2abd2f7f7f7fdb863e66101", + "542788998ec3d8daebfee0b6f1a340b35806", + "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", + "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", + "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", + "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", + "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" +).map(colors); + +var PuOr = ramp(scheme$3); + +var scheme$4 = new Array(3).concat( + "ef8a62f7f7f767a9cf", + "ca0020f4a58292c5de0571b0", + "ca0020f4a582f7f7f792c5de0571b0", + "b2182bef8a62fddbc7d1e5f067a9cf2166ac", + "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", + "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", + "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", + "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", + "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" +).map(colors); + +var RdBu = ramp(scheme$4); + +var scheme$5 = new Array(3).concat( + "ef8a62ffffff999999", + "ca0020f4a582bababa404040", + "ca0020f4a582ffffffbababa404040", + "b2182bef8a62fddbc7e0e0e09999994d4d4d", + "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", + "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", + "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", + "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", + "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" +).map(colors); + +var RdGy = ramp(scheme$5); + +var scheme$6 = new Array(3).concat( + "fc8d59ffffbf91bfdb", + "d7191cfdae61abd9e92c7bb6", + "d7191cfdae61ffffbfabd9e92c7bb6", + "d73027fc8d59fee090e0f3f891bfdb4575b4", + "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", + "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", + "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", + "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", + "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" +).map(colors); + +var RdYlBu = ramp(scheme$6); + +var scheme$7 = new Array(3).concat( + "fc8d59ffffbf91cf60", + "d7191cfdae61a6d96a1a9641", + "d7191cfdae61ffffbfa6d96a1a9641", + "d73027fc8d59fee08bd9ef8b91cf601a9850", + "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", + "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", + "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", + "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", + "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" +).map(colors); + +var RdYlGn = ramp(scheme$7); + +var scheme$8 = new Array(3).concat( + "fc8d59ffffbf99d594", + "d7191cfdae61abdda42b83ba", + "d7191cfdae61ffffbfabdda42b83ba", + "d53e4ffc8d59fee08be6f59899d5943288bd", + "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", + "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", + "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", + "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", + "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" +).map(colors); + +var Spectral = ramp(scheme$8); + +var scheme$9 = new Array(3).concat( + "e5f5f999d8c92ca25f", + "edf8fbb2e2e266c2a4238b45", + "edf8fbb2e2e266c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" +).map(colors); + +var BuGn = ramp(scheme$9); + +var scheme$a = new Array(3).concat( + "e0ecf49ebcda8856a7", + "edf8fbb3cde38c96c688419d", + "edf8fbb3cde38c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" +).map(colors); + +var BuPu = ramp(scheme$a); + +var scheme$b = new Array(3).concat( + "e0f3dba8ddb543a2ca", + "f0f9e8bae4bc7bccc42b8cbe", + "f0f9e8bae4bc7bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" +).map(colors); + +var GnBu = ramp(scheme$b); + +var scheme$c = new Array(3).concat( + "fee8c8fdbb84e34a33", + "fef0d9fdcc8afc8d59d7301f", + "fef0d9fdcc8afc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" +).map(colors); + +var OrRd = ramp(scheme$c); + +var scheme$d = new Array(3).concat( + "ece2f0a6bddb1c9099", + "f6eff7bdc9e167a9cf02818a", + "f6eff7bdc9e167a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" +).map(colors); + +var PuBuGn = ramp(scheme$d); + +var scheme$e = new Array(3).concat( + "ece7f2a6bddb2b8cbe", + "f1eef6bdc9e174a9cf0570b0", + "f1eef6bdc9e174a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" +).map(colors); + +var PuBu = ramp(scheme$e); + +var scheme$f = new Array(3).concat( + "e7e1efc994c7dd1c77", + "f1eef6d7b5d8df65b0ce1256", + "f1eef6d7b5d8df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" +).map(colors); + +var PuRd = ramp(scheme$f); + +var scheme$g = new Array(3).concat( + "fde0ddfa9fb5c51b8a", + "feebe2fbb4b9f768a1ae017e", + "feebe2fbb4b9f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" +).map(colors); + +var RdPu = ramp(scheme$g); + +var scheme$h = new Array(3).concat( + "edf8b17fcdbb2c7fb8", + "ffffcca1dab441b6c4225ea8", + "ffffcca1dab441b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" +).map(colors); + +var YlGnBu = ramp(scheme$h); + +var scheme$i = new Array(3).concat( + "f7fcb9addd8e31a354", + "ffffccc2e69978c679238443", + "ffffccc2e69978c67931a354006837", + "ffffccd9f0a3addd8e78c67931a354006837", + "ffffccd9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" +).map(colors); + +var YlGn = ramp(scheme$i); + +var scheme$j = new Array(3).concat( + "fff7bcfec44fd95f0e", + "ffffd4fed98efe9929cc4c02", + "ffffd4fed98efe9929d95f0e993404", + "ffffd4fee391fec44ffe9929d95f0e993404", + "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" +).map(colors); + +var YlOrBr = ramp(scheme$j); + +var scheme$k = new Array(3).concat( + "ffeda0feb24cf03b20", + "ffffb2fecc5cfd8d3ce31a1c", + "ffffb2fecc5cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" +).map(colors); + +var YlOrRd = ramp(scheme$k); + +var scheme$l = new Array(3).concat( + "deebf79ecae13182bd", + "eff3ffbdd7e76baed62171b5", + "eff3ffbdd7e76baed63182bd08519c", + "eff3ffc6dbef9ecae16baed63182bd08519c", + "eff3ffc6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" +).map(colors); + +var Blues = ramp(scheme$l); + +var scheme$m = new Array(3).concat( + "e5f5e0a1d99b31a354", + "edf8e9bae4b374c476238b45", + "edf8e9bae4b374c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" +).map(colors); + +var Greens = ramp(scheme$m); + +var scheme$n = new Array(3).concat( + "f0f0f0bdbdbd636363", + "f7f7f7cccccc969696525252", + "f7f7f7cccccc969696636363252525", + "f7f7f7d9d9d9bdbdbd969696636363252525", + "f7f7f7d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" +).map(colors); + +var Greys = ramp(scheme$n); + +var scheme$o = new Array(3).concat( + "efedf5bcbddc756bb1", + "f2f0f7cbc9e29e9ac86a51a3", + "f2f0f7cbc9e29e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" +).map(colors); + +var Purples = ramp(scheme$o); + +var scheme$p = new Array(3).concat( + "fee0d2fc9272de2d26", + "fee5d9fcae91fb6a4acb181d", + "fee5d9fcae91fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" +).map(colors); + +var Reds = ramp(scheme$p); + +var scheme$q = new Array(3).concat( + "fee6cefdae6be6550d", + "feeddefdbe85fd8d3cd94701", + "feeddefdbe85fd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" +).map(colors); + +var Oranges = ramp(scheme$q); + +function cividis(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " + + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " + + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) + + ")"; +} + +var cubehelix = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(300, 0.5, 0.0), d3Color.cubehelix(-240, 0.5, 1.0)); + +var warm = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(-100, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); + +var cool = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(260, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); + +var c = d3Color.cubehelix(); + +function rainbow(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c.h = 360 * t - 100; + c.s = 1.5 - 1.5 * ts; + c.l = 0.8 - 0.9 * ts; + return c + ""; +} + +var c$1 = d3Color.rgb(), + pi_1_3 = Math.PI / 3, + pi_2_3 = Math.PI * 2 / 3; + +function sinebow(t) { + var x; + t = (0.5 - t) * Math.PI; + c$1.r = 255 * (x = Math.sin(t)) * x; + c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; + c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; + return c$1 + ""; +} + +function turbo(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " + + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " + + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) + + ")"; +} + +function ramp$1(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} + +var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + +var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + +var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + +var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + +exports.interpolateBlues = Blues; +exports.interpolateBrBG = BrBG; +exports.interpolateBuGn = BuGn; +exports.interpolateBuPu = BuPu; +exports.interpolateCividis = cividis; +exports.interpolateCool = cool; +exports.interpolateCubehelixDefault = cubehelix; +exports.interpolateGnBu = GnBu; +exports.interpolateGreens = Greens; +exports.interpolateGreys = Greys; +exports.interpolateInferno = inferno; +exports.interpolateMagma = magma; +exports.interpolateOrRd = OrRd; +exports.interpolateOranges = Oranges; +exports.interpolatePRGn = PRGn; +exports.interpolatePiYG = PiYG; +exports.interpolatePlasma = plasma; +exports.interpolatePuBu = PuBu; +exports.interpolatePuBuGn = PuBuGn; +exports.interpolatePuOr = PuOr; +exports.interpolatePuRd = PuRd; +exports.interpolatePurples = Purples; +exports.interpolateRainbow = rainbow; +exports.interpolateRdBu = RdBu; +exports.interpolateRdGy = RdGy; +exports.interpolateRdPu = RdPu; +exports.interpolateRdYlBu = RdYlBu; +exports.interpolateRdYlGn = RdYlGn; +exports.interpolateReds = Reds; +exports.interpolateSinebow = sinebow; +exports.interpolateSpectral = Spectral; +exports.interpolateTurbo = turbo; +exports.interpolateViridis = viridis; +exports.interpolateWarm = warm; +exports.interpolateYlGn = YlGn; +exports.interpolateYlGnBu = YlGnBu; +exports.interpolateYlOrBr = YlOrBr; +exports.interpolateYlOrRd = YlOrRd; +exports.schemeAccent = Accent; +exports.schemeBlues = scheme$l; +exports.schemeBrBG = scheme; +exports.schemeBuGn = scheme$9; +exports.schemeBuPu = scheme$a; +exports.schemeCategory10 = category10; +exports.schemeDark2 = Dark2; +exports.schemeGnBu = scheme$b; +exports.schemeGreens = scheme$m; +exports.schemeGreys = scheme$n; +exports.schemeOrRd = scheme$c; +exports.schemeOranges = scheme$q; +exports.schemePRGn = scheme$1; +exports.schemePaired = Paired; +exports.schemePastel1 = Pastel1; +exports.schemePastel2 = Pastel2; +exports.schemePiYG = scheme$2; +exports.schemePuBu = scheme$e; +exports.schemePuBuGn = scheme$d; +exports.schemePuOr = scheme$3; +exports.schemePuRd = scheme$f; +exports.schemePurples = scheme$o; +exports.schemeRdBu = scheme$4; +exports.schemeRdGy = scheme$5; +exports.schemeRdPu = scheme$g; +exports.schemeRdYlBu = scheme$6; +exports.schemeRdYlGn = scheme$7; +exports.schemeReds = scheme$p; +exports.schemeSet1 = Set1; +exports.schemeSet2 = Set2; +exports.schemeSet3 = Set3; +exports.schemeSpectral = scheme$8; +exports.schemeTableau10 = Tableau10; +exports.schemeYlGn = scheme$i; +exports.schemeYlGnBu = scheme$h; +exports.schemeYlOrBr = scheme$j; +exports.schemeYlOrRd = scheme$k; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-scale-chromatic/dist/d3-scale-chromatic.min.js b/node_modules/d3-scale-chromatic/dist/d3-scale-chromatic.min.js new file mode 100644 index 00000000..191130af --- /dev/null +++ b/node_modules/d3-scale-chromatic/dist/d3-scale-chromatic.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-scale-chromatic/ v2.0.0 Copyright 2020 Mike Bostock +!function(f,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("d3-interpolate"),require("d3-color")):"function"==typeof define&&define.amd?define(["exports","d3-interpolate","d3-color"],e):e((f=f||self).d3=f.d3||{},f.d3,f.d3)}(this,function(f,e,d){"use strict";function a(f){for(var e=f.length/6|0,d=new Array(e),a=0;ae.interpolateRgbBasis(f[f.length-1]),u=new Array(3).concat("d8b365f5f5f55ab4ac","a6611adfc27d80cdc1018571","a6611adfc27df5f5f580cdc1018571","8c510ad8b365f6e8c3c7eae55ab4ac01665e","8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e","8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e","8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e","5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30","5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(a),s=p(u),y=new Array(3).concat("af8dc3f7f7f77fbf7b","7b3294c2a5cfa6dba0008837","7b3294c2a5cff7f7f7a6dba0008837","762a83af8dc3e7d4e8d9f0d37fbf7b1b7837","762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837","762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837","762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837","40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b","40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(a),M=p(y),w=new Array(3).concat("e9a3c9f7f7f7a1d76a","d01c8bf1b6dab8e1864dac26","d01c8bf1b6daf7f7f7b8e1864dac26","c51b7de9a3c9fde0efe6f5d0a1d76a4d9221","c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221","c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221","c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221","8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419","8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(a),A=p(w),P=new Array(3).concat("998ec3f7f7f7f1a340","5e3c99b2abd2fdb863e66101","5e3c99b2abd2f7f7f7fdb863e66101","542788998ec3d8daebfee0b6f1a340b35806","542788998ec3d8daebf7f7f7fee0b6f1a340b35806","5427888073acb2abd2d8daebfee0b6fdb863e08214b35806","5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806","2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08","2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(a),B=p(P),G=new Array(3).concat("ef8a62f7f7f767a9cf","ca0020f4a58292c5de0571b0","ca0020f4a582f7f7f792c5de0571b0","b2182bef8a62fddbc7d1e5f067a9cf2166ac","b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac","b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac","b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac","67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061","67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(a),x=p(G),R=new Array(3).concat("ef8a62ffffff999999","ca0020f4a582bababa404040","ca0020f4a582ffffffbababa404040","b2182bef8a62fddbc7e0e0e09999994d4d4d","b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d","b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d","b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d","67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a","67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(a),g=p(R),Y=new Array(3).concat("fc8d59ffffbf91bfdb","d7191cfdae61abd9e92c7bb6","d7191cfdae61ffffbfabd9e92c7bb6","d73027fc8d59fee090e0f3f891bfdb4575b4","d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4","d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4","d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4","a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695","a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(a),O=p(Y),v=new Array(3).concat("fc8d59ffffbf91cf60","d7191cfdae61a6d96a1a9641","d7191cfdae61ffffbfa6d96a1a9641","d73027fc8d59fee08bd9ef8b91cf601a9850","d73027fc8d59fee08bffffbfd9ef8b91cf601a9850","d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850","d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850","a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837","a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(a),C=p(v),S=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(a),I=p(S),L=new Array(3).concat("e5f5f999d8c92ca25f","edf8fbb2e2e266c2a4238b45","edf8fbb2e2e266c2a42ca25f006d2c","edf8fbccece699d8c966c2a42ca25f006d2c","edf8fbccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(a),j=p(L),q=new Array(3).concat("e0ecf49ebcda8856a7","edf8fbb3cde38c96c688419d","edf8fbb3cde38c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(a),D=p(q),T=new Array(3).concat("e0f3dba8ddb543a2ca","f0f9e8bae4bc7bccc42b8cbe","f0f9e8bae4bc7bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(a),_=p(T),k=new Array(3).concat("fee8c8fdbb84e34a33","fef0d9fdcc8afc8d59d7301f","fef0d9fdcc8afc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(a),V=p(k),W=new Array(3).concat("ece2f0a6bddb1c9099","f6eff7bdc9e167a9cf02818a","f6eff7bdc9e167a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(a),z=p(W),E=new Array(3).concat("ece7f2a6bddb2b8cbe","f1eef6bdc9e174a9cf0570b0","f1eef6bdc9e174a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(a),F=p(E),H=new Array(3).concat("e7e1efc994c7dd1c77","f1eef6d7b5d8df65b0ce1256","f1eef6d7b5d8df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(a),J=p(H),K=new Array(3).concat("fde0ddfa9fb5c51b8a","feebe2fbb4b9f768a1ae017e","feebe2fbb4b9f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(a),N=p(K),Q=new Array(3).concat("edf8b17fcdbb2c7fb8","ffffcca1dab441b6c4225ea8","ffffcca1dab441b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(a),U=p(Q),X=new Array(3).concat("f7fcb9addd8e31a354","ffffccc2e69978c679238443","ffffccc2e69978c67931a354006837","ffffccd9f0a3addd8e78c67931a354006837","ffffccd9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(a),Z=p(X),$=new Array(3).concat("fff7bcfec44fd95f0e","ffffd4fed98efe9929cc4c02","ffffd4fed98efe9929d95f0e993404","ffffd4fee391fec44ffe9929d95f0e993404","ffffd4fee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(a),ff=p($),ef=new Array(3).concat("ffeda0feb24cf03b20","ffffb2fecc5cfd8d3ce31a1c","ffffb2fecc5cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(a),df=p(ef),af=new Array(3).concat("deebf79ecae13182bd","eff3ffbdd7e76baed62171b5","eff3ffbdd7e76baed63182bd08519c","eff3ffc6dbef9ecae16baed63182bd08519c","eff3ffc6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(a),cf=p(af),bf=new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(a),tf=p(bf),nf=new Array(3).concat("f0f0f0bdbdbd636363","f7f7f7cccccc969696525252","f7f7f7cccccc969696636363252525","f7f7f7d9d9d9bdbdbd969696636363252525","f7f7f7d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(a),rf=p(nf),of=new Array(3).concat("efedf5bcbddc756bb1","f2f0f7cbc9e29e9ac86a51a3","f2f0f7cbc9e29e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(a),lf=p(of),mf=new Array(3).concat("fee0d2fc9272de2d26","fee5d9fcae91fb6a4acb181d","fee5d9fcae91fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(a),hf=p(mf),pf=new Array(3).concat("fee6cefdae6be6550d","feeddefdbe85fd8d3cd94701","feeddefdbe85fd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(a),uf=p(pf);var sf=e.interpolateCubehelixLong(d.cubehelix(300,.5,0),d.cubehelix(-240,.5,1)),yf=e.interpolateCubehelixLong(d.cubehelix(-100,.75,.35),d.cubehelix(80,1.5,.8)),Mf=e.interpolateCubehelixLong(d.cubehelix(260,.75,.35),d.cubehelix(80,1.5,.8)),wf=d.cubehelix();var Af=d.rgb(),Pf=Math.PI/3,Bf=2*Math.PI/3;function Gf(f){var e=f.length;return function(d){return f[Math.max(0,Math.min(e-1,Math.floor(d*e)))]}}var xf=Gf(a("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),Rf=Gf(a("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),gf=Gf(a("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),Yf=Gf(a("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));f.interpolateBlues=cf,f.interpolateBrBG=s,f.interpolateBuGn=j,f.interpolateBuPu=D,f.interpolateCividis=function(f){return f=Math.max(0,Math.min(1,f)),"rgb("+Math.max(0,Math.min(255,Math.round(-4.54-f*(35.34-f*(2381.73-f*(6402.7-f*(7024.72-2710.57*f)))))))+", "+Math.max(0,Math.min(255,Math.round(32.49+f*(170.73+f*(52.82-f*(131.46-f*(176.58-67.37*f)))))))+", "+Math.max(0,Math.min(255,Math.round(81.24+f*(442.36-f*(2482.43-f*(6167.24-f*(6614.94-2475.67*f)))))))+")"},f.interpolateCool=Mf,f.interpolateCubehelixDefault=sf,f.interpolateGnBu=_,f.interpolateGreens=tf,f.interpolateGreys=rf,f.interpolateInferno=gf,f.interpolateMagma=Rf,f.interpolateOrRd=V,f.interpolateOranges=uf,f.interpolatePRGn=M,f.interpolatePiYG=A,f.interpolatePlasma=Yf,f.interpolatePuBu=F,f.interpolatePuBuGn=z,f.interpolatePuOr=B,f.interpolatePuRd=J,f.interpolatePurples=lf,f.interpolateRainbow=function(f){(f<0||f>1)&&(f-=Math.floor(f));var e=Math.abs(f-.5);return wf.h=360*f-100,wf.s=1.5-1.5*e,wf.l=.8-.9*e,wf+""},f.interpolateRdBu=x,f.interpolateRdGy=g,f.interpolateRdPu=N,f.interpolateRdYlBu=O,f.interpolateRdYlGn=C,f.interpolateReds=hf,f.interpolateSinebow=function(f){var e;return f=(.5-f)*Math.PI,Af.r=255*(e=Math.sin(f))*e,Af.g=255*(e=Math.sin(f+Pf))*e,Af.b=255*(e=Math.sin(f+Bf))*e,Af+""},f.interpolateSpectral=I,f.interpolateTurbo=function(f){return f=Math.max(0,Math.min(1,f)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+f*(1172.33-f*(10793.56-f*(33300.12-f*(38394.49-14825.05*f)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+f*(557.33+f*(1225.33-f*(3574.96-f*(1073.77+707.56*f)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+f*(3211.1-f*(15327.97-f*(27814-f*(22569.18-6838.66*f)))))))+")"},f.interpolateViridis=xf,f.interpolateWarm=yf,f.interpolateYlGn=Z,f.interpolateYlGnBu=U,f.interpolateYlOrBr=ff,f.interpolateYlOrRd=df,f.schemeAccent=b,f.schemeBlues=af,f.schemeBrBG=u,f.schemeBuGn=L,f.schemeBuPu=q,f.schemeCategory10=c,f.schemeDark2=t,f.schemeGnBu=T,f.schemeGreens=bf,f.schemeGreys=nf,f.schemeOrRd=k,f.schemeOranges=pf,f.schemePRGn=y,f.schemePaired=n,f.schemePastel1=r,f.schemePastel2=o,f.schemePiYG=w,f.schemePuBu=E,f.schemePuBuGn=W,f.schemePuOr=P,f.schemePuRd=H,f.schemePurples=of,f.schemeRdBu=G,f.schemeRdGy=R,f.schemeRdPu=K,f.schemeRdYlBu=Y,f.schemeRdYlGn=v,f.schemeReds=mf,f.schemeSet1=i,f.schemeSet2=l,f.schemeSet3=m,f.schemeSpectral=S,f.schemeTableau10=h,f.schemeYlGn=X,f.schemeYlGnBu=Q,f.schemeYlOrBr=$,f.schemeYlOrRd=ef,Object.defineProperty(f,"__esModule",{value:!0})}); diff --git a/node_modules/d3-scale-chromatic/package.json b/node_modules/d3-scale-chromatic/package.json new file mode 100644 index 00000000..63524e7e --- /dev/null +++ b/node_modules/d3-scale-chromatic/package.json @@ -0,0 +1,76 @@ +{ + "_from": "d3-scale-chromatic@2", + "_id": "d3-scale-chromatic@2.0.0", + "_inBundle": false, + "_integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", + "_location": "/d3-scale-chromatic", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-scale-chromatic@2", + "name": "d3-scale-chromatic", + "escapedName": "d3-scale-chromatic", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3" + ], + "_resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", + "_shasum": "c13f3af86685ff91323dc2f0ebd2dabbd72d8bab", + "_spec": "d3-scale-chromatic@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-scale-chromatic/issues" + }, + "bundleDependencies": false, + "dependencies": { + "d3-color": "1 - 2", + "d3-interpolate": "1 - 2" + }, + "deprecated": false, + "description": "Sequential, diverging and categorical color schemes.", + "devDependencies": { + "eslint": "6", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-scale-chromatic/", + "jsdelivr": "dist/d3-scale-chromatic.min.js", + "keywords": [ + "d3", + "d3-module", + "color", + "scale", + "sequential", + "colorbrewer" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-scale-chromatic.js", + "module": "src/index.js", + "name": "d3-scale-chromatic", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-scale-chromatic.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src" + }, + "sideEffects": false, + "unpkg": "dist/d3-scale-chromatic.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-scale-chromatic/src/categorical/Accent.js b/node_modules/d3-scale-chromatic/src/categorical/Accent.js new file mode 100644 index 00000000..3a1a9fd4 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/categorical/Accent.js @@ -0,0 +1,3 @@ +import colors from "../colors.js"; + +export default colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); diff --git a/node_modules/d3-scale-chromatic/src/categorical/Dark2.js b/node_modules/d3-scale-chromatic/src/categorical/Dark2.js new file mode 100644 index 00000000..1fe995da --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/categorical/Dark2.js @@ -0,0 +1,3 @@ +import colors from "../colors.js"; + +export default colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); diff --git a/node_modules/d3-scale-chromatic/src/categorical/Paired.js b/node_modules/d3-scale-chromatic/src/categorical/Paired.js new file mode 100644 index 00000000..831fba32 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/categorical/Paired.js @@ -0,0 +1,3 @@ +import colors from "../colors.js"; + +export default colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); diff --git a/node_modules/d3-scale-chromatic/src/categorical/Pastel1.js b/node_modules/d3-scale-chromatic/src/categorical/Pastel1.js new file mode 100644 index 00000000..d39c8034 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/categorical/Pastel1.js @@ -0,0 +1,3 @@ +import colors from "../colors.js"; + +export default colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); diff --git a/node_modules/d3-scale-chromatic/src/categorical/Pastel2.js b/node_modules/d3-scale-chromatic/src/categorical/Pastel2.js new file mode 100644 index 00000000..342e3ce3 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/categorical/Pastel2.js @@ -0,0 +1,3 @@ +import colors from "../colors.js"; + +export default colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); diff --git a/node_modules/d3-scale-chromatic/src/categorical/Set1.js b/node_modules/d3-scale-chromatic/src/categorical/Set1.js new file mode 100644 index 00000000..408887ba --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/categorical/Set1.js @@ -0,0 +1,3 @@ +import colors from "../colors.js"; + +export default colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); diff --git a/node_modules/d3-scale-chromatic/src/categorical/Set2.js b/node_modules/d3-scale-chromatic/src/categorical/Set2.js new file mode 100644 index 00000000..9aa80301 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/categorical/Set2.js @@ -0,0 +1,3 @@ +import colors from "../colors.js"; + +export default colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); diff --git a/node_modules/d3-scale-chromatic/src/categorical/Set3.js b/node_modules/d3-scale-chromatic/src/categorical/Set3.js new file mode 100644 index 00000000..d3b9b27d --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/categorical/Set3.js @@ -0,0 +1,3 @@ +import colors from "../colors.js"; + +export default colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); diff --git a/node_modules/d3-scale-chromatic/src/categorical/Tableau10.js b/node_modules/d3-scale-chromatic/src/categorical/Tableau10.js new file mode 100644 index 00000000..370c9502 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/categorical/Tableau10.js @@ -0,0 +1,3 @@ +import colors from "../colors.js"; + +export default colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); diff --git a/node_modules/d3-scale-chromatic/src/categorical/category10.js b/node_modules/d3-scale-chromatic/src/categorical/category10.js new file mode 100644 index 00000000..9adcd019 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/categorical/category10.js @@ -0,0 +1,3 @@ +import colors from "../colors.js"; + +export default colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); diff --git a/node_modules/d3-scale-chromatic/src/colors.js b/node_modules/d3-scale-chromatic/src/colors.js new file mode 100644 index 00000000..aeedad53 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/colors.js @@ -0,0 +1,5 @@ +export default function(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; +} diff --git a/node_modules/d3-scale-chromatic/src/diverging/BrBG.js b/node_modules/d3-scale-chromatic/src/diverging/BrBG.js new file mode 100644 index 00000000..6a467f7c --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/diverging/BrBG.js @@ -0,0 +1,16 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "d8b365f5f5f55ab4ac", + "a6611adfc27d80cdc1018571", + "a6611adfc27df5f5f580cdc1018571", + "8c510ad8b365f6e8c3c7eae55ab4ac01665e", + "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", + "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", + "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", + "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", + "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/diverging/PRGn.js b/node_modules/d3-scale-chromatic/src/diverging/PRGn.js new file mode 100644 index 00000000..dd278aa3 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/diverging/PRGn.js @@ -0,0 +1,16 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "af8dc3f7f7f77fbf7b", + "7b3294c2a5cfa6dba0008837", + "7b3294c2a5cff7f7f7a6dba0008837", + "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", + "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", + "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", + "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", + "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", + "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/diverging/PiYG.js b/node_modules/d3-scale-chromatic/src/diverging/PiYG.js new file mode 100644 index 00000000..43ef32d7 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/diverging/PiYG.js @@ -0,0 +1,16 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "e9a3c9f7f7f7a1d76a", + "d01c8bf1b6dab8e1864dac26", + "d01c8bf1b6daf7f7f7b8e1864dac26", + "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", + "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", + "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", + "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", + "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", + "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/diverging/PuOr.js b/node_modules/d3-scale-chromatic/src/diverging/PuOr.js new file mode 100644 index 00000000..770ef90f --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/diverging/PuOr.js @@ -0,0 +1,16 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "998ec3f7f7f7f1a340", + "5e3c99b2abd2fdb863e66101", + "5e3c99b2abd2f7f7f7fdb863e66101", + "542788998ec3d8daebfee0b6f1a340b35806", + "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", + "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", + "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", + "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", + "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/diverging/RdBu.js b/node_modules/d3-scale-chromatic/src/diverging/RdBu.js new file mode 100644 index 00000000..703d61c5 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/diverging/RdBu.js @@ -0,0 +1,16 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "ef8a62f7f7f767a9cf", + "ca0020f4a58292c5de0571b0", + "ca0020f4a582f7f7f792c5de0571b0", + "b2182bef8a62fddbc7d1e5f067a9cf2166ac", + "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", + "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", + "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", + "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", + "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/diverging/RdGy.js b/node_modules/d3-scale-chromatic/src/diverging/RdGy.js new file mode 100644 index 00000000..b4deb6a0 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/diverging/RdGy.js @@ -0,0 +1,16 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "ef8a62ffffff999999", + "ca0020f4a582bababa404040", + "ca0020f4a582ffffffbababa404040", + "b2182bef8a62fddbc7e0e0e09999994d4d4d", + "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", + "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", + "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", + "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", + "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js b/node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js new file mode 100644 index 00000000..ad1a4128 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js @@ -0,0 +1,16 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "fc8d59ffffbf91bfdb", + "d7191cfdae61abd9e92c7bb6", + "d7191cfdae61ffffbfabd9e92c7bb6", + "d73027fc8d59fee090e0f3f891bfdb4575b4", + "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", + "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", + "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", + "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", + "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js b/node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js new file mode 100644 index 00000000..3cd897e1 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js @@ -0,0 +1,16 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "fc8d59ffffbf91cf60", + "d7191cfdae61a6d96a1a9641", + "d7191cfdae61ffffbfa6d96a1a9641", + "d73027fc8d59fee08bd9ef8b91cf601a9850", + "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", + "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", + "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", + "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", + "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/diverging/Spectral.js b/node_modules/d3-scale-chromatic/src/diverging/Spectral.js new file mode 100644 index 00000000..cd1e1085 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/diverging/Spectral.js @@ -0,0 +1,16 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "fc8d59ffffbf99d594", + "d7191cfdae61abdda42b83ba", + "d7191cfdae61ffffbfabdda42b83ba", + "d53e4ffc8d59fee08be6f59899d5943288bd", + "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", + "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", + "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", + "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", + "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/index.js b/node_modules/d3-scale-chromatic/src/index.js new file mode 100644 index 00000000..3170296b --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/index.js @@ -0,0 +1,43 @@ +export {default as schemeCategory10} from "./categorical/category10.js"; +export {default as schemeAccent} from "./categorical/Accent.js"; +export {default as schemeDark2} from "./categorical/Dark2.js"; +export {default as schemePaired} from "./categorical/Paired.js"; +export {default as schemePastel1} from "./categorical/Pastel1.js"; +export {default as schemePastel2} from "./categorical/Pastel2.js"; +export {default as schemeSet1} from "./categorical/Set1.js"; +export {default as schemeSet2} from "./categorical/Set2.js"; +export {default as schemeSet3} from "./categorical/Set3.js"; +export {default as schemeTableau10} from "./categorical/Tableau10.js"; +export {default as interpolateBrBG, scheme as schemeBrBG} from "./diverging/BrBG.js"; +export {default as interpolatePRGn, scheme as schemePRGn} from "./diverging/PRGn.js"; +export {default as interpolatePiYG, scheme as schemePiYG} from "./diverging/PiYG.js"; +export {default as interpolatePuOr, scheme as schemePuOr} from "./diverging/PuOr.js"; +export {default as interpolateRdBu, scheme as schemeRdBu} from "./diverging/RdBu.js"; +export {default as interpolateRdGy, scheme as schemeRdGy} from "./diverging/RdGy.js"; +export {default as interpolateRdYlBu, scheme as schemeRdYlBu} from "./diverging/RdYlBu.js"; +export {default as interpolateRdYlGn, scheme as schemeRdYlGn} from "./diverging/RdYlGn.js"; +export {default as interpolateSpectral, scheme as schemeSpectral} from "./diverging/Spectral.js"; +export {default as interpolateBuGn, scheme as schemeBuGn} from "./sequential-multi/BuGn.js"; +export {default as interpolateBuPu, scheme as schemeBuPu} from "./sequential-multi/BuPu.js"; +export {default as interpolateGnBu, scheme as schemeGnBu} from "./sequential-multi/GnBu.js"; +export {default as interpolateOrRd, scheme as schemeOrRd} from "./sequential-multi/OrRd.js"; +export {default as interpolatePuBuGn, scheme as schemePuBuGn} from "./sequential-multi/PuBuGn.js"; +export {default as interpolatePuBu, scheme as schemePuBu} from "./sequential-multi/PuBu.js"; +export {default as interpolatePuRd, scheme as schemePuRd} from "./sequential-multi/PuRd.js"; +export {default as interpolateRdPu, scheme as schemeRdPu} from "./sequential-multi/RdPu.js"; +export {default as interpolateYlGnBu, scheme as schemeYlGnBu} from "./sequential-multi/YlGnBu.js"; +export {default as interpolateYlGn, scheme as schemeYlGn} from "./sequential-multi/YlGn.js"; +export {default as interpolateYlOrBr, scheme as schemeYlOrBr} from "./sequential-multi/YlOrBr.js"; +export {default as interpolateYlOrRd, scheme as schemeYlOrRd} from "./sequential-multi/YlOrRd.js"; +export {default as interpolateBlues, scheme as schemeBlues} from "./sequential-single/Blues.js"; +export {default as interpolateGreens, scheme as schemeGreens} from "./sequential-single/Greens.js"; +export {default as interpolateGreys, scheme as schemeGreys} from "./sequential-single/Greys.js"; +export {default as interpolatePurples, scheme as schemePurples} from "./sequential-single/Purples.js"; +export {default as interpolateReds, scheme as schemeReds} from "./sequential-single/Reds.js"; +export {default as interpolateOranges, scheme as schemeOranges} from "./sequential-single/Oranges.js"; +export {default as interpolateCividis} from "./sequential-multi/cividis.js"; +export {default as interpolateCubehelixDefault} from "./sequential-multi/cubehelix.js"; +export {default as interpolateRainbow, warm as interpolateWarm, cool as interpolateCool} from "./sequential-multi/rainbow.js"; +export {default as interpolateSinebow} from "./sequential-multi/sinebow.js"; +export {default as interpolateTurbo} from "./sequential-multi/turbo.js"; +export {default as interpolateViridis, magma as interpolateMagma, inferno as interpolateInferno, plasma as interpolatePlasma} from "./sequential-multi/viridis.js"; diff --git a/node_modules/d3-scale-chromatic/src/ramp.js b/node_modules/d3-scale-chromatic/src/ramp.js new file mode 100644 index 00000000..14f40508 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/ramp.js @@ -0,0 +1,3 @@ +import {interpolateRgbBasis} from "d3-interpolate"; + +export default scheme => interpolateRgbBasis(scheme[scheme.length - 1]); diff --git a/node_modules/d3-scale-chromatic/src/rampClosed.js b/node_modules/d3-scale-chromatic/src/rampClosed.js new file mode 100644 index 00000000..217d5024 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/rampClosed.js @@ -0,0 +1,9 @@ +import {scaleSequential} from "d3-scale"; +import {interpolateRgbBasisClosed} from "d3-interpolate"; +import colors from "./colors.js"; + +export default function(range) { + var s = scaleSequential(interpolateRgbBasisClosed(colors(range))).clamp(true); + delete s.clamp; + return s; +} diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js b/node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js new file mode 100644 index 00000000..bfd4ff4a --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "e5f5f999d8c92ca25f", + "edf8fbb2e2e266c2a4238b45", + "edf8fbb2e2e266c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js b/node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js new file mode 100644 index 00000000..7b6b7cc8 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "e0ecf49ebcda8856a7", + "edf8fbb3cde38c96c688419d", + "edf8fbb3cde38c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js b/node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js new file mode 100644 index 00000000..0e1a31c6 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "e0f3dba8ddb543a2ca", + "f0f9e8bae4bc7bccc42b8cbe", + "f0f9e8bae4bc7bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js b/node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js new file mode 100644 index 00000000..6726f75b --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "fee8c8fdbb84e34a33", + "fef0d9fdcc8afc8d59d7301f", + "fef0d9fdcc8afc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js b/node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js new file mode 100644 index 00000000..4a632812 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "ece7f2a6bddb2b8cbe", + "f1eef6bdc9e174a9cf0570b0", + "f1eef6bdc9e174a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js b/node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js new file mode 100644 index 00000000..11a60d4c --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "ece2f0a6bddb1c9099", + "f6eff7bdc9e167a9cf02818a", + "f6eff7bdc9e167a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js b/node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js new file mode 100644 index 00000000..2d9e1435 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "e7e1efc994c7dd1c77", + "f1eef6d7b5d8df65b0ce1256", + "f1eef6d7b5d8df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js b/node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js new file mode 100644 index 00000000..680a5b13 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "fde0ddfa9fb5c51b8a", + "feebe2fbb4b9f768a1ae017e", + "feebe2fbb4b9f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js b/node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js new file mode 100644 index 00000000..883ce593 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "f7fcb9addd8e31a354", + "ffffccc2e69978c679238443", + "ffffccc2e69978c67931a354006837", + "ffffccd9f0a3addd8e78c67931a354006837", + "ffffccd9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js b/node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js new file mode 100644 index 00000000..d002b3d5 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "edf8b17fcdbb2c7fb8", + "ffffcca1dab441b6c4225ea8", + "ffffcca1dab441b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js b/node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js new file mode 100644 index 00000000..cb32c44a --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "fff7bcfec44fd95f0e", + "ffffd4fed98efe9929cc4c02", + "ffffd4fed98efe9929d95f0e993404", + "ffffd4fee391fec44ffe9929d95f0e993404", + "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js b/node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js new file mode 100644 index 00000000..6c314bad --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "ffeda0feb24cf03b20", + "ffffb2fecc5cfd8d3ce31a1c", + "ffffb2fecc5cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/cividis.js b/node_modules/d3-scale-chromatic/src/sequential-multi/cividis.js new file mode 100644 index 00000000..46da9aba --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/cividis.js @@ -0,0 +1,8 @@ +export default function(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " + + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " + + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) + + ")"; +} diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js b/node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js new file mode 100644 index 00000000..7e9be127 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js @@ -0,0 +1,4 @@ +import {cubehelix} from "d3-color"; +import {interpolateCubehelixLong} from "d3-interpolate"; + +export default interpolateCubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0)); diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js b/node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js new file mode 100644 index 00000000..b33cd35a --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js @@ -0,0 +1,17 @@ +import {cubehelix} from "d3-color"; +import {interpolateCubehelixLong} from "d3-interpolate"; + +export var warm = interpolateCubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + +export var cool = interpolateCubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + +var c = cubehelix(); + +export default function(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c.h = 360 * t - 100; + c.s = 1.5 - 1.5 * ts; + c.l = 0.8 - 0.9 * ts; + return c + ""; +} diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js b/node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js new file mode 100644 index 00000000..09eb2de9 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js @@ -0,0 +1,14 @@ +import {rgb} from "d3-color"; + +var c = rgb(), + pi_1_3 = Math.PI / 3, + pi_2_3 = Math.PI * 2 / 3; + +export default function(t) { + var x; + t = (0.5 - t) * Math.PI; + c.r = 255 * (x = Math.sin(t)) * x; + c.g = 255 * (x = Math.sin(t + pi_1_3)) * x; + c.b = 255 * (x = Math.sin(t + pi_2_3)) * x; + return c + ""; +} diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/turbo.js b/node_modules/d3-scale-chromatic/src/sequential-multi/turbo.js new file mode 100644 index 00000000..31ae8a44 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/turbo.js @@ -0,0 +1,8 @@ +export default function(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " + + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " + + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) + + ")"; +} diff --git a/node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js b/node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js new file mode 100644 index 00000000..2eeb758f --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js @@ -0,0 +1,16 @@ +import colors from "../colors.js"; + +function ramp(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} + +export default ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + +export var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + +export var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + +export var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); diff --git a/node_modules/d3-scale-chromatic/src/sequential-single/Blues.js b/node_modules/d3-scale-chromatic/src/sequential-single/Blues.js new file mode 100644 index 00000000..7acfdd31 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-single/Blues.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "deebf79ecae13182bd", + "eff3ffbdd7e76baed62171b5", + "eff3ffbdd7e76baed63182bd08519c", + "eff3ffc6dbef9ecae16baed63182bd08519c", + "eff3ffc6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-single/Greens.js b/node_modules/d3-scale-chromatic/src/sequential-single/Greens.js new file mode 100644 index 00000000..48eb102e --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-single/Greens.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "e5f5e0a1d99b31a354", + "edf8e9bae4b374c476238b45", + "edf8e9bae4b374c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-single/Greys.js b/node_modules/d3-scale-chromatic/src/sequential-single/Greys.js new file mode 100644 index 00000000..315ca0a1 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-single/Greys.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "f0f0f0bdbdbd636363", + "f7f7f7cccccc969696525252", + "f7f7f7cccccc969696636363252525", + "f7f7f7d9d9d9bdbdbd969696636363252525", + "f7f7f7d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js b/node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js new file mode 100644 index 00000000..392bf233 --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "fee6cefdae6be6550d", + "feeddefdbe85fd8d3cd94701", + "feeddefdbe85fd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-single/Purples.js b/node_modules/d3-scale-chromatic/src/sequential-single/Purples.js new file mode 100644 index 00000000..f4b22a5a --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-single/Purples.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "efedf5bcbddc756bb1", + "f2f0f7cbc9e29e9ac86a51a3", + "f2f0f7cbc9e29e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale-chromatic/src/sequential-single/Reds.js b/node_modules/d3-scale-chromatic/src/sequential-single/Reds.js new file mode 100644 index 00000000..35a048fa --- /dev/null +++ b/node_modules/d3-scale-chromatic/src/sequential-single/Reds.js @@ -0,0 +1,14 @@ +import colors from "../colors.js"; +import ramp from "../ramp.js"; + +export var scheme = new Array(3).concat( + "fee0d2fc9272de2d26", + "fee5d9fcae91fb6a4acb181d", + "fee5d9fcae91fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" +).map(colors); + +export default ramp(scheme); diff --git a/node_modules/d3-scale/LICENSE b/node_modules/d3-scale/LICENSE new file mode 100644 index 00000000..4f0b022c --- /dev/null +++ b/node_modules/d3-scale/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2015 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-scale/README.md b/node_modules/d3-scale/README.md new file mode 100644 index 00000000..45eb0993 --- /dev/null +++ b/node_modules/d3-scale/README.md @@ -0,0 +1,991 @@ +# d3-scale + +Scales are a convenient abstraction for a fundamental task in visualization: mapping a dimension of abstract data to a visual representation. Although most often used for position-encoding quantitative data, such as mapping a measurement in meters to a position in pixels for dots in a scatterplot, scales can represent virtually any visual encoding, such as diverging colors, stroke widths, or symbol size. Scales can also be used with virtually any type of data, such as named categorical data or discrete data that requires sensible breaks. + +For [continuous](#continuous-scales) quantitative data, you typically want a [linear scale](#linear-scales). (For time series data, a [time scale](#time-scales).) If the distribution calls for it, consider transforming data using a [power](#power-scales) or [log](#log-scales) scale. A [quantize scale](#quantize-scales) may aid differentiation by rounding continuous data to a fixed set of discrete values; similarly, a [quantile scale](#quantile-scales) computes quantiles from a sample population, and a [threshold scale](#threshold-scales) allows you to specify arbitrary breaks in continuous data. + +For discrete ordinal (ordered) or categorical (unordered) data, an [ordinal scale](#ordinal-scales) specifies an explicit mapping from a set of data values to a corresponding set of visual attributes (such as colors). The related [band](#band-scales) and [point](#point-scales) scales are useful for position-encoding ordinal data, such as bars in a bar chart or dots in an categorical scatterplot. + +This repository does not provide color schemes; see [d3-scale-chromatic](https://github.com/d3/d3-scale-chromatic) for color schemes designed to work with d3-scale. + +Scales have no intrinsic visual representation. However, most scales can [generate](#continuous_ticks) and [format](#continuous_tickFormat) ticks for reference marks to aid in the construction of axes. + +For a longer introduction, see these recommended tutorials: + +* [Introducing d3-scale](https://medium.com/@mbostock/introducing-d3-scale-61980c51545f) by Mike Bostock + +* Chapter 7. Scales of [*Interactive Data Visualization for the Web*](http://alignedleft.com/work/d3-book) by Scott Murray + +* [d3: scales, and color.](http://www.jeromecukier.net/2011/08/11/d3-scales-and-color/) by Jérôme Cukier + +## Installing + +If you use NPM, `npm install d3-scale`. Otherwise, download the [latest release](https://github.com/d3/d3-scale/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-scale.v3.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + + + + + + +``` + +(You can omit d3-time and d3-time-format if you’re not using [d3.scaleTime](#scaleTime) or [d3.scaleUtc](#scaleUtc).) + +## API Reference + +* [Continuous](#continuous-scales) ([Linear](#linear-scales), [Power](#power-scales), [Log](#log-scales), [Identity](#identity-scales), [Time](#time-scales), [Radial](#radial-scales)) +* [Sequential](#sequential-scales) +* [Diverging](#diverging-scales) +* [Quantize](#quantize-scales) +* [Quantile](#quantile-scales) +* [Threshold](#threshold-scales) +* [Ordinal](#ordinal-scales) ([Band](#band-scales), [Point](#point-scales)) + +### Continuous Scales + +Continuous scales map a continuous, quantitative input [domain](#continuous_domain) to a continuous output [range](#continuous_range). If the range is also numeric, the mapping may be [inverted](#continuous_invert). A continuous scale is not constructed directly; instead, try a [linear](#linear-scales), [power](#power-scales), [log](#log-scales), [identity](#identity-scales), [radial](#radial-scales), [time](#time-scales) or [sequential color](#sequential-scales) scale. + +# continuous(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/continuous.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +Given a *value* from the [domain](#continuous_domain), returns the corresponding value from the [range](#continuous_range). If the given *value* is outside the domain, and [clamping](#continuous_clamp) is not enabled, the mapping may be extrapolated such that the returned value is outside the range. For example, to apply a position encoding: + +```js +var x = d3.scaleLinear() + .domain([10, 130]) + .range([0, 960]); + +x(20); // 80 +x(50); // 320 +``` + +Or to apply a color encoding: + +```js +var color = d3.scaleLinear() + .domain([10, 100]) + .range(["brown", "steelblue"]); + +color(20); // "#9a3439" +color(50); // "#7b5167" +``` + +Or, in shorthand: + +```js +var x = d3.scaleLinear([10, 130], [0, 960]); +var color = d3.scaleLinear([10, 100], ["brown", "steelblue"]); +``` + +# continuous.invert(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/continuous.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +Given a *value* from the [range](#continuous_range), returns the corresponding value from the [domain](#continuous_domain). Inversion is useful for interaction, say to determine the data value corresponding to the position of the mouse. For example, to invert a position encoding: + +```js +var x = d3.scaleLinear() + .domain([10, 130]) + .range([0, 960]); + +x.invert(80); // 20 +x.invert(320); // 50 +``` + +If the given *value* is outside the range, and [clamping](#continuous_clamp) is not enabled, the mapping may be extrapolated such that the returned value is outside the domain. This method is only supported if the range is numeric. If the range is not numeric, returns NaN. + +For a valid value *y* in the range, continuous(continuous.invert(y)) approximately equals *y*; similarly, for a valid value *x* in the domain, continuous.invert(continuous(x)) approximately equals *x*. The scale and its inverse may not be exact due to the limitations of floating point precision. + +# continuous.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/continuous.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +If *domain* is specified, sets the scale’s domain to the specified array of numbers. The array must contain two or more elements. If the elements in the given array are not numbers, they will be coerced to numbers. If *domain* is not specified, returns a copy of the scale’s current domain. + +Although continuous scales typically have two values each in their domain and range, specifying more than two values produces a piecewise scale. For example, to create a [diverging color scale](#diverging-scales) that interpolates between white and red for negative values, and white and green for positive values, say: + +```js +var color = d3.scaleLinear() + .domain([-1, 0, 1]) + .range(["red", "white", "green"]); + +color(-0.5); // "rgb(255, 128, 128)" +color(+0.5); // "rgb(128, 192, 128)" +``` + +Internally, a piecewise scale performs a [binary search](https://github.com/d3/d3-array/blob/master/README.md#bisect) for the range interpolator corresponding to the given domain value. Thus, the domain must be in ascending or descending order. If the domain and range have different lengths *N* and *M*, only the first *min(N,M)* elements in each are observed. + +# continuous.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/continuous.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +If *range* is specified, sets the scale’s range to the specified array of values. The array must contain two or more elements. Unlike the [domain](#continuous_domain), elements in the given array need not be numbers; any value that is supported by the underlying [interpolator](#continuous_interpolate) will work, though note that numeric ranges are required for [invert](#continuous_invert). If *range* is not specified, returns a copy of the scale’s current range. See [*continuous*.interpolate](#continuous_interpolate) for more examples. + +# continuous.rangeRound([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/continuous.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +Sets the scale’s [*range*](#continuous_range) to the specified array of values while also setting the scale’s [interpolator](#continuous_interpolate) to [interpolateRound](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateRound). This is a convenience method equivalent to: + +```js +continuous + .range(range) + .interpolate(d3.interpolateRound); +``` + +The rounding interpolator is sometimes useful for avoiding antialiasing artifacts, though also consider the [shape-rendering](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering) “crispEdges†styles. Note that this interpolator can only be used with numeric ranges. + +# continuous.clamp(clamp) · [Source](https://github.com/d3/d3-scale/blob/master/src/continuous.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +If *clamp* is specified, enables or disables clamping accordingly. If clamping is disabled and the scale is passed a value outside the [domain](#continuous_domain), the scale may return a value outside the [range](#continuous_range) through extrapolation. If clamping is enabled, the return value of the scale is always within the scale’s range. Clamping similarly applies to [*continuous*.invert](#continuous_invert). For example: + +```js +var x = d3.scaleLinear() + .domain([10, 130]) + .range([0, 960]); + +x(-10); // -160, outside range +x.invert(-160); // -10, outside domain + +x.clamp(true); +x(-10); // 0, clamped to range +x.invert(-160); // 10, clamped to domain +``` + +If *clamp* is not specified, returns whether or not the scale currently clamps values to within the range. + +# continuous.unknown([value]) · [Source](https://github.com/d3/d3-scale/blob/master/src/continuous.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +If *value* is specified, sets the output value of the scale for undefined (or NaN) input values and returns this scale. If *value* is not specified, returns the current unknown value, which defaults to undefined. + +# continuous.interpolate(interpolate) · [Source](https://github.com/d3/d3-scale/blob/master/src/continuous.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +If *interpolate* is specified, sets the scale’s [range](#continuous_range) interpolator factory. This interpolator factory is used to create interpolators for each adjacent pair of values from the range; these interpolators then map a normalized domain parameter *t* in [0, 1] to the corresponding value in the range. If *factory* is not specified, returns the scale’s current interpolator factory, which defaults to [d3.interpolate](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate). See [d3-interpolate](https://github.com/d3/d3-interpolate) for more interpolators. + +For example, consider a diverging color scale with three colors in the range: + +```js +var color = d3.scaleLinear() + .domain([-100, 0, +100]) + .range(["red", "white", "green"]); +``` + +Two interpolators are created internally by the scale, equivalent to: + +```js +var i0 = d3.interpolate("red", "white"), + i1 = d3.interpolate("white", "green"); +``` + +A common reason to specify a custom interpolator is to change the color space of interpolation. For example, to use [HCL](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateHcl): + +```js +var color = d3.scaleLinear() + .domain([10, 100]) + .range(["brown", "steelblue"]) + .interpolate(d3.interpolateHcl); +``` + +Or for [Cubehelix](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateCubehelix) with a custom gamma: + +```js +var color = d3.scaleLinear() + .domain([10, 100]) + .range(["brown", "steelblue"]) + .interpolate(d3.interpolateCubehelix.gamma(3)); +``` + +Note: the [default interpolator](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate) **may reuse return values**. For example, if the range values are objects, then the value interpolator always returns the same object, modifying it in-place. If the scale is used to set an attribute or style, this is typically acceptable (and desirable for performance); however, if you need to store the scale’s return value, you must specify your own interpolator or make a copy as appropriate. + +# continuous.ticks([count]) + +Returns approximately *count* representative values from the scale’s [domain](#continuous_domain). If *count* is not specified, it defaults to 10. The returned tick values are uniformly spaced, have human-readable values (such as multiples of powers of 10), and are guaranteed to be within the extent of the domain. Ticks are often used to display reference lines, or tick marks, in conjunction with the visualized data. The specified *count* is only a hint; the scale may return more or fewer values depending on the domain. See also d3-array’s [ticks](https://github.com/d3/d3-array/blob/master/README.md#ticks). + +# continuous.tickFormat([count[, specifier]]) · [Source](https://github.com/d3/d3-scale/blob/master/src/tickFormat.js), [Examples](https://observablehq.com/@d3/scale-ticks) + +Returns a [number format](https://github.com/d3/d3-format) function suitable for displaying a tick value, automatically computing the appropriate precision based on the fixed interval between tick values. The specified *count* should have the same value as the count that is used to generate the [tick values](#continuous_ticks). + +An optional *specifier* allows a [custom format](https://github.com/d3/d3-format/blob/master/README.md#locale_format) where the precision of the format is automatically set by the scale as appropriate for the tick interval. For example, to format percentage change, you might say: + +```js +var x = d3.scaleLinear() + .domain([-1, 1]) + .range([0, 960]); + +var ticks = x.ticks(5), + tickFormat = x.tickFormat(5, "+%"); + +ticks.map(tickFormat); // ["-100%", "-50%", "+0%", "+50%", "+100%"] +``` + +If *specifier* uses the format type `s`, the scale will return a [SI-prefix format](https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix) based on the largest value in the domain. If the *specifier* already specifies a precision, this method is equivalent to [*locale*.format](https://github.com/d3/d3-format/blob/master/README.md#locale_format). + +See also [d3.tickFormat](#tickFormat). + +# continuous.nice([count]) · [Source](https://github.com/d3/d3-scale/blob/master/src/nice.js), [Examples](https://observablehq.com/@d3/d3-scalelinear) + +Extends the [domain](#continuous_domain) so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. An optional tick *count* argument allows greater control over the step size used to extend the bounds, guaranteeing that the returned [ticks](#continuous_ticks) will exactly cover the domain. Nicing is useful if the domain is computed from data, say using [extent](https://github.com/d3/d3-array/blob/master/README.md#extent), and may be irregular. For example, for a domain of [0.201479…, 0.996679…], a nice domain might be [0.2, 1.0]. If the domain has more than two values, nicing the domain only affects the first and last value. See also d3-array’s [tickStep](https://github.com/d3/d3-array/blob/master/README.md#tickStep). + +Nicing a scale only modifies the current domain; it does not automatically nice domains that are subsequently set using [*continuous*.domain](#continuous_domain). You must re-nice the scale after setting the new domain, if desired. + +# continuous.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/continuous.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +Returns an exact copy of this scale. Changes to this scale will not affect the returned scale, and vice versa. + +# d3.tickFormat(start, stop, count[, specifier]) · [Source](https://github.com/d3/d3-scale/blob/master/src/tickFormat.js), [Examples](https://observablehq.com/@d3/scale-ticks) + +Returns a [number format](https://github.com/d3/d3-format) function suitable for displaying a tick value, automatically computing the appropriate precision based on the fixed interval between tick values, as determined by [d3.tickStep](https://github.com/d3/d3-array/blob/master/README.md#tickStep). + +An optional *specifier* allows a [custom format](https://github.com/d3/d3-format/blob/master/README.md#locale_format) where the precision of the format is automatically set by the scale as appropriate for the tick interval. For example, to format percentage change, you might say: + +```js +var tickFormat = d3.tickFormat(-1, 1, 5, "+%"); + +tickFormat(-0.5); // "-50%" +``` + +If *specifier* uses the format type `s`, the scale will return a [SI-prefix format](https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix) based on the larger absolute value of *start* and *stop*. If the *specifier* already specifies a precision, this method is equivalent to [*locale*.format](https://github.com/d3/d3-format/blob/master/README.md#locale_format). + +#### Linear Scales + +# d3.scaleLinear([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/linear.js), [Examples](https://observablehq.com/@d3/d3-scalelinear) + +Constructs a new [continuous scale](#continuous-scales) with the specified [domain](#continuous_domain) and [range](#continuous_range), the [default](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate) [interpolator](#continuous_interpolate) and [clamping](#continuous_clamp) disabled. If either *domain* or *range* are not specified, each defaults to [0, 1]. Linear scales are a good default choice for continuous quantitative data because they preserve proportional differences. Each range value *y* can be expressed as a function of the domain value *x*: *y* = *mx* + *b*. + +#### Power Scales + +Power scales are similar to [linear scales](#linear-scales), except an exponential transform is applied to the input domain value before the output range value is computed. Each range value *y* can be expressed as a function of the domain value *x*: *y* = *mx^k* + *b*, where *k* is the [exponent](#pow_exponent) value. Power scales also support negative domain values, in which case the input value and the resulting output value are multiplied by -1. + +# d3.scalePow([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +Constructs a new [continuous scale](#continuous-scales) with the specified [domain](#continuous_domain) and [range](#continuous_range), the [exponent](#pow_exponent) 1, the [default](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate) [interpolator](#continuous_interpolate) and [clamping](#continuous_clamp) disabled. If either *domain* or *range* are not specified, each defaults to [0, 1]. (Note that this is effectively a [linear](#linear-scales) scale until you set a different exponent.) + +# pow(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*](#_continuous). + +# pow.invert(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.invert](#continuous_invert). + +# pow.exponent([exponent]) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +If *exponent* is specified, sets the current exponent to the given numeric value. If *exponent* is not specified, returns the current exponent, which defaults to 1. (Note that this is effectively a [linear](#linear-scales) scale until you set a different exponent.) + +# pow.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.domain](#continuous_domain). + +# pow.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.range](#continuous_range). + +# pow.rangeRound([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.rangeRound](#continuous_rangeRound). + +# pow.clamp(clamp) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.clamp](#continuous_clamp). + +# pow.interpolate(interpolate) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.interpolate](#continuous_interpolate). + +# pow.ticks([count]) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/scale-ticks) + +See [*continuous*.ticks](#continuous_ticks). + +# pow.tickFormat([count[, specifier]]) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/scale-ticks) + +See [*continuous*.tickFormat](#continuous_tickFormat). + +# pow.nice([count]) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.nice](#continuous_nice). + +# pow.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.copy](#continuous_copy). + +# d3.scaleSqrt([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/pow.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +Constructs a new [continuous](#continuous-scales) [power scale](#power-scales) with the specified [domain](#continuous_domain) and [range](#continuous_range), the [exponent](#pow_exponent) 0.5, the [default](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate) [interpolator](#continuous_interpolate) and [clamping](#continuous_clamp) disabled. If either *domain* or *range* are not specified, each defaults to [0, 1]. This is a convenience method equivalent to `d3.scalePow(…).exponent(0.5)`. + +#### Log Scales + +Log scales are similar to [linear scales](#linear-scales), except a logarithmic transform is applied to the input domain value before the output range value is computed. The mapping to the range value *y* can be expressed as a function of the domain value *x*: *y* = *m* log(x) + *b*. + +As log(0) = -∞, a log scale domain must be **strictly-positive or strictly-negative**; the domain must not include or cross zero. A log scale with a positive domain has a well-defined behavior for positive values, and a log scale with a negative domain has a well-defined behavior for negative values. (For a negative domain, input and output values are implicitly multiplied by -1.) The behavior of the scale is undefined if you pass a negative value to a log scale with a positive domain or vice versa. + +# d3.scaleLog([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +Constructs a new [continuous scale](#continuous-scales) with the specified [domain](#log_domain) and [range](#log_range), the [base](#log_base) 10, the [default](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate) [interpolator](#log_interpolate) and [clamping](#log_clamp) disabled. If *domain* is not specified, it defaults to [1, 10]. If *range* is not specified, it defaults to [0, 1]. + +# log(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*](#_continuous). + +# log.invert(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.invert](#continuous_invert). + +# log.base([base]) · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +If *base* is specified, sets the base for this logarithmic scale to the specified value. If *base* is not specified, returns the current base, which defaults to 10. + +# log.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.domain](#continuous_domain). + +# log.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/continuous.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.range](#continuous_range). + +# log.rangeRound([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.rangeRound](#continuous_rangeRound). + +# log.clamp(clamp) · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.clamp](#continuous_clamp). + +# log.interpolate(interpolate) · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.interpolate](#continuous_interpolate). + +# log.ticks([count]) · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/scale-ticks) + +Like [*continuous*.ticks](#continuous_ticks), but customized for a log scale. If the [base](#log_base) is an integer, the returned ticks are uniformly spaced within each integer power of base; otherwise, one tick per power of base is returned. The returned ticks are guaranteed to be within the extent of the domain. If the orders of magnitude in the [domain](#log_domain) is greater than *count*, then at most one tick per power is returned. Otherwise, the tick values are unfiltered, but note that you can use [*log*.tickFormat](#log_tickFormat) to filter the display of tick labels. If *count* is not specified, it defaults to 10. + +# log.tickFormat([count[, specifier]]) · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/scale-ticks) + +Like [*continuous*.tickFormat](#continuous_tickFormat), but customized for a log scale. The specified *count* typically has the same value as the count that is used to generate the [tick values](#continuous_ticks). If there are too many ticks, the formatter may return the empty string for some of the tick labels; however, note that the ticks are still shown. To disable filtering, specify a *count* of Infinity. When specifying a count, you may also provide a format *specifier* or format function. For example, to get a tick formatter that will display 20 ticks of a currency, say `log.tickFormat(20, "$,f")`. If the specifier does not have a defined precision, the precision will be set automatically by the scale, returning the appropriate format. This provides a convenient way of specifying a format whose precision will be automatically set by the scale. + +# log.nice() · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/d3-scalelinear) + +Like [*continuous*.nice](#continuous_nice), except extends the domain to integer powers of [base](#log_base). For example, for a domain of [0.201479…, 0.996679…], and base 10, the nice domain is [0.1, 1]. If the domain has more than two values, nicing the domain only affects the first and last value. + +# log.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/log.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +See [*continuous*.copy](#continuous_copy). + +#### Symlog Scales + +See [A bi-symmetric log transformation for wide-range data](https://www.researchgate.net/profile/John_Webber4/publication/233967063_A_bi-symmetric_log_transformation_for_wide-range_data/links/0fcfd50d791c85082e000000.pdf) by Webber for more. + +# d3.scaleSymlog([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/symlog.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +Constructs a new [continuous scale](#continuous-scales) with the specified [domain](#continuous_domain) and [range](#continuous_range), the [constant](#symlog_constant) 1, the [default](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate) [interpolator](#continuous_interpolate) and [clamping](#continuous_clamp) disabled. If *domain* is not specified, it defaults to [0, 1]. If *range* is not specified, it defaults to [0, 1]. + +# symlog.constant([constant]) · [Source](https://github.com/d3/d3-scale/blob/master/src/symlog.js), [Examples](https://observablehq.com/@d3/continuous-scales) + +If *constant* is specified, sets the symlog constant to the specified number and returns this scale; otherwise returns the current value of the symlog constant, which defaults to 1. See “A bi-symmetric log transformation for wide-range data†by Webber for more. + +#### Identity Scales + +Identity scales are a special case of [linear scales](#linear-scales) where the domain and range are identical; the scale and its invert method are thus the identity function. These scales are occasionally useful when working with pixel coordinates, say in conjunction with an axis. Identity scales do not support [rangeRound](#continuous_rangeRound), [clamp](#continuous_clamp) or [interpolate](#continuous_interpolate). + +# d3.scaleIdentity([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/identity.js), [Examples](https://observablehq.com/@d3/d3-scalelinear) + +Constructs a new identity scale with the specified [domain](#continuous_domain) and [range](#continuous_range). If *range* is not specified, it defaults to [0, 1]. + +#### Radial Scales + +Radial scales are a variant of [linear scales](#linear-scales) where the range is internally squared so that an input value corresponds linearly to the squared output value. These scales are useful when you want the input value to correspond to the area of a graphical mark and the mark is specified by radius, as in a radial bar chart. Radial scales do not support [interpolate](#continuous_interpolate). + +# d3.scaleRadial([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/radial.js), [Examples](https://observablehq.com/@d3/radial-stacked-bar-chart) + +Constructs a new radial scale with the specified [domain](#continuous_domain) and [range](#continuous_range). If *domain* or *range* is not specified, each defaults to [0, 1]. + +#### Time Scales + +Time scales are a variant of [linear scales](#linear-scales) that have a temporal domain: domain values are coerced to [dates](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date) rather than numbers, and [invert](#continuous_invert) likewise returns a date. Time scales implement [ticks](#time_ticks) based on [calendar intervals](https://github.com/d3/d3-time), taking the pain out of generating axes for temporal domains. + +For example, to create a position encoding: + +```js +var x = d3.scaleTime() + .domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]) + .range([0, 960]); + +x(new Date(2000, 0, 1, 5)); // 200 +x(new Date(2000, 0, 1, 16)); // 640 +x.invert(200); // Sat Jan 01 2000 05:00:00 GMT-0800 (PST) +x.invert(640); // Sat Jan 01 2000 16:00:00 GMT-0800 (PST) +``` + +For a valid value *y* in the range, time(time.invert(y)) equals *y*; similarly, for a valid value *x* in the domain, time.invert(time(x)) equals *x*. The invert method is useful for interaction, say to determine the value in the domain that corresponds to the pixel location under the mouse. + +# d3.scaleTime([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/d3-scaletime) + +Constructs a new time scale with the specified [domain](#time_domain) and [range](#time_range), the [default](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate) [interpolator](#time_interpolate) and [clamping](#time_clamp) disabled. If *domain* is not specified, it defaults to [2000-01-01, 2000-01-02]. If *range* is not specified, it defaults to [0, 1]. + +# time(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/d3-scaletime) + +See [*continuous*](#_continuous). + +# time.invert(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/d3-scaletime) + +See [*continuous*.invert](#continuous_invert). + +# time.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/d3-scaletime) + +See [*continuous*.domain](#continuous_domain). + +# time.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/d3-scaletime) + +See [*continuous*.range](#continuous_range). + +# time.rangeRound([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/d3-scaletime) + +See [*continuous*.rangeRound](#continuous_rangeRound). + +# time.clamp(clamp) · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/d3-scaletime) + +See [*continuous*.clamp](#continuous_clamp). + +# time.interpolate(interpolate) · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/d3-scaletime) + +See [*continuous*.interpolate](#continuous_interpolate). + +# time.ticks([count]) · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/d3-scaletime) +
# time.ticks([interval]) + +Returns representative dates from the scale’s [domain](#time_domain). The returned tick values are uniformly-spaced (mostly), have sensible values (such as every day at midnight), and are guaranteed to be within the extent of the domain. Ticks are often used to display reference lines, or tick marks, in conjunction with the visualized data. + +An optional *count* may be specified to affect how many ticks are generated. If *count* is not specified, it defaults to 10. The specified *count* is only a hint; the scale may return more or fewer values depending on the domain. For example, to create ten default ticks, say: + +```js +var x = d3.scaleTime(); + +x.ticks(10); +// [Sat Jan 01 2000 00:00:00 GMT-0800 (PST), +// Sat Jan 01 2000 03:00:00 GMT-0800 (PST), +// Sat Jan 01 2000 06:00:00 GMT-0800 (PST), +// Sat Jan 01 2000 09:00:00 GMT-0800 (PST), +// Sat Jan 01 2000 12:00:00 GMT-0800 (PST), +// Sat Jan 01 2000 15:00:00 GMT-0800 (PST), +// Sat Jan 01 2000 18:00:00 GMT-0800 (PST), +// Sat Jan 01 2000 21:00:00 GMT-0800 (PST), +// Sun Jan 02 2000 00:00:00 GMT-0800 (PST)] +``` + +The following time intervals are considered for automatic ticks: + +* 1-, 5-, 15- and 30-second. +* 1-, 5-, 15- and 30-minute. +* 1-, 3-, 6- and 12-hour. +* 1- and 2-day. +* 1-week. +* 1- and 3-month. +* 1-year. + +In lieu of a *count*, a [time *interval*](https://github.com/d3/d3-time/blob/master/README.md#intervals) may be explicitly specified. To prune the generated ticks for a given time *interval*, use [*interval*.every](https://github.com/d3/d3-time/blob/master/README.md#interval_every). For example, to generate ticks at 15-[minute](https://github.com/d3/d3-time/blob/master/README.md#minute) intervals: + +```js +var x = d3.scaleTime() + .domain([new Date(2000, 0, 1, 0), new Date(2000, 0, 1, 2)]); + +x.ticks(d3.timeMinute.every(15)); +// [Sat Jan 01 2000 00:00:00 GMT-0800 (PST), +// Sat Jan 01 2000 00:15:00 GMT-0800 (PST), +// Sat Jan 01 2000 00:30:00 GMT-0800 (PST), +// Sat Jan 01 2000 00:45:00 GMT-0800 (PST), +// Sat Jan 01 2000 01:00:00 GMT-0800 (PST), +// Sat Jan 01 2000 01:15:00 GMT-0800 (PST), +// Sat Jan 01 2000 01:30:00 GMT-0800 (PST), +// Sat Jan 01 2000 01:45:00 GMT-0800 (PST), +// Sat Jan 01 2000 02:00:00 GMT-0800 (PST)] +``` + +Alternatively, pass a test function to [*interval*.filter](https://github.com/d3/d3-time/blob/master/README.md#interval_filter): + +```js +x.ticks(d3.timeMinute.filter(function(d) { + return d.getMinutes() % 15 === 0; +})); +``` + +Note: in some cases, such as with day ticks, specifying a *step* can result in irregular spacing of ticks because time intervals have varying length. + +# time.tickFormat([count[, specifier]]) · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/scale-ticks) +
# time.tickFormat([interval[, specifier]]) + +Returns a time format function suitable for displaying [tick](#time_ticks) values. The specified *count* or *interval* is currently ignored, but is accepted for consistency with other scales such as [*continuous*.tickFormat](#continuous_tickFormat). If a format *specifier* is specified, this method is equivalent to [format](https://github.com/d3/d3-time-format/blob/master/README.md#format). If *specifier* is not specified, the default time format is returned. The default multi-scale time format chooses a human-readable representation based on the specified date as follows: + +* `%Y` - for year boundaries, such as `2011`. +* `%B` - for month boundaries, such as `February`. +* `%b %d` - for week boundaries, such as `Feb 06`. +* `%a %d` - for day boundaries, such as `Mon 07`. +* `%I %p` - for hour boundaries, such as `01 AM`. +* `%I:%M` - for minute boundaries, such as `01:23`. +* `:%S` - for second boundaries, such as `:45`. +* `.%L` - milliseconds for all other times, such as `.012`. + +Although somewhat unusual, this default behavior has the benefit of providing both local and global context: for example, formatting a sequence of ticks as [11 PM, Mon 07, 01 AM] reveals information about hours, dates, and day simultaneously, rather than just the hours [11 PM, 12 AM, 01 AM]. See [d3-time-format](https://github.com/d3/d3-time-format) if you’d like to roll your own conditional time format. + +# time.nice([count]) · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/d3-scaletime) +
# time.nice([interval]) + +Extends the [domain](#time_domain) so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. See [*continuous*.nice](#continuous_nice) for more. + +An optional tick *count* argument allows greater control over the step size used to extend the bounds, guaranteeing that the returned [ticks](#time_ticks) will exactly cover the domain. Alternatively, a [time *interval*](https://github.com/d3/d3-time/blob/master/README.md#intervals) may be specified to explicitly set the ticks. If an *interval* is specified, an optional *step* may also be specified to skip some ticks. For example, `time.nice(d3.timeSecond.every(10))` will extend the domain to an even ten seconds (0, 10, 20, etc.). See [*time*.ticks](#time_ticks) and [*interval*.every](https://github.com/d3/d3-time/blob/master/README.md#interval_every) for further detail. + +Nicing is useful if the domain is computed from data, say using [extent](https://github.com/d3/d3-array/blob/master/README.md#extent), and may be irregular. For example, for a domain of [2009-07-13T00:02, 2009-07-13T23:48], the nice domain is [2009-07-13, 2009-07-14]. If the domain has more than two values, nicing the domain only affects the first and last value. + +# time.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/time.js), [Examples](https://observablehq.com/@d3/d3-scaletime) + +See [*continuous*.copy](#continuous_copy). + +# d3.scaleUtc([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/utcTime.js), [Examples](https://observablehq.com/@d3/d3-scaletime) + +Equivalent to [scaleTime](#scaleTime), but the returned time scale operates in [Coordinated Universal Time](https://en.wikipedia.org/wiki/Coordinated_Universal_Time) rather than local time. + +### Sequential Scales + +Sequential scales, like [diverging scales](#diverging-scales), are similar to [continuous scales](#continuous-scales) in that they map a continuous, numeric input domain to a continuous output range. However, unlike continuous scales, the input domain and output range of a sequential scale always has exactly two elements, and the output range is typically specified as an interpolator rather than an array of values. These scales do not expose [invert](#continuous_invert) and [interpolate](#continuous_interpolate) methods. + +# d3.scaleSequential([[domain, ]interpolator]) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +Constructs a new sequential scale with the specified [*domain*](#sequential_domain) and [*interpolator*](#sequential_interpolator) function or array. If *domain* is not specified, it defaults to [0, 1]. If *interpolator* is not specified, it defaults to the identity function. When the scale is [applied](#_sequential), the interpolator will be invoked with a value typically in the range [0, 1], where 0 represents the minimum value and 1 represents the maximum value. For example, to implement the ill-advised [HSL](https://github.com/d3/d3-color/blob/master/README.md#hsl) rainbow scale: + +```js +var rainbow = d3.scaleSequential(function(t) { + return d3.hsl(t * 360, 1, 0.5) + ""; +}); +``` + +A more aesthetically-pleasing and perceptually-effective cyclical hue encoding is to use [d3.interpolateRainbow](https://github.com/d3/d3-scale-chromatic/blob/master/README.md#interpolateRainbow): + +```js +var rainbow = d3.scaleSequential(d3.interpolateRainbow); +``` + +If *interpolator* is an array, it represents the scale’s two-element output range and is converted to an interpolator function using [d3.interpolate](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate). + +# sequential(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +See [*continuous*](#_continuous). + +# sequential.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +See [*continuous*.domain](#continuous_domain). Note that a sequential scale’s domain must be numeric and must contain exactly two values. + +# sequential.clamp([clamp]) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +See [*continuous*.clamp](#continuous_clamp). + +# sequential.interpolator([interpolator]) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +If *interpolator* is specified, sets the scale’s interpolator to the specified function. If *interpolator* is not specified, returns the scale’s current interpolator. + +# sequential.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +See [*continuous*.range](#continuous_range). If *range* is specified, the given two-element array is converted to an interpolator function using [d3.interpolate](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate). + +# sequential.rangeRound([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +See [*continuous*.rangeRound](#continuous_rangeRound). If *range* is specified, implicitly uses [d3.interpolateRound](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateRound) as the interpolator. + +# sequential.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +See [*continuous*.copy](#continuous_copy). + +# d3.scaleSequentialLog([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +A [sequential scale](#sequential-scales) with a logarithmic transform, analogous to a [log scale](#log-scales). + +# d3.scaleSequentialPow([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +A [sequential scale](#sequential-scales) with an exponential transform, analogous to a [power scale](#pow-scales). + +# d3.scaleSequentialSqrt([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +A [sequential scale](#sequential-scales) with a square-root transform, analogous to a [d3.scaleSqrt](#scaleSqrt). + +# d3.scaleSequentialSymlog([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequential.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +A [sequential scale](#sequential-scales) with a symmetric logarithmic transform, analogous to a [symlog scale](#symlog-scales). + +# d3.scaleSequentialQuantile([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequentialQuantile.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +A [sequential scale](#sequential-scales) using a *p*-quantile transform, analogous to a [quantile scale](#quantile-scales). + +# sequentialQuantile.quantiles(n) · [Source](https://github.com/d3/d3-scale/blob/master/src/sequentialQuantile.js), [Examples](https://observablehq.com/@d3/sequential-scales) + +Returns an array of *n* + 1 quantiles. For example, if *n* = 4, returns an array of five numbers: the minimum value, the first quartile, the median, the third quartile, and the maximum. + +### Diverging Scales + +Diverging scales, like [sequential scales](#sequential-scales), are similar to [continuous scales](#continuous-scales) in that they map a continuous, numeric input domain to a continuous output range. However, unlike continuous scales, the input domain and output range of a diverging scale always has exactly three elements, and the output range is typically specified as an interpolator rather than an array of values. These scales do not expose [invert](#continuous_invert) and [interpolate](#continuous_interpolate) methods. + +# d3.scaleDiverging([[domain, ]interpolator]) · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +Constructs a new diverging scale with the specified [*domain*](#diverging_domain) and [*interpolator*](#diverging_interpolator) function or array. If *domain* is not specified, it defaults to [0, 0.5, 1]. If *interpolator* is not specified, it defaults to the identity function. When the scale is [applied](#_diverging), the interpolator will be invoked with a value typically in the range [0, 1], where 0 represents the extreme negative value, 0.5 represents the neutral value, and 1 represents the extreme positive value. For example, using [d3.interpolateSpectral](https://github.com/d3/d3-scale-chromatic/blob/master/README.md#interpolateSpectral): + +```js +var spectral = d3.scaleDiverging(d3.interpolateSpectral); +``` + +If *interpolator* is an array, it represents the scale’s three-element output range and is converted to an interpolator function using [d3.interpolate](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate) and [d3.piecewise](https://github.com/d3/d3-interpolate/blob/master/README.md#piecewise). + +# diverging(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +See [*continuous*](#_continuous). + +# diverging.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +See [*continuous*.domain](#continuous_domain). Note that a diverging scale’s domain must be numeric and must contain exactly three values. The default domain is [0, 0.5, 1]. + +# diverging.clamp([clamp]) · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +See [*continuous*.clamp](#continuous_clamp). + +# diverging.interpolator([interpolator]) · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +If *interpolator* is specified, sets the scale’s interpolator to the specified function. If *interpolator* is not specified, returns the scale’s current interpolator. + +# diverging.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +See [*continuous*.range](#continuous_range). If *range* is specified, the given three-element array is converted to an interpolator function using [d3.interpolate](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate) and [d3.piecewise](https://github.com/d3/d3-interpolate/blob/master/README.md#piecewise). + +# diverging.rangeRound([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +See [*continuous*.range](#continuous_rangeRound). If *range* is specified, implicitly uses [d3.interpolateRound](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateRound) as the interpolator. + +# diverging.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +See [*continuous*.copy](#continuous_copy). + +# diverging.unknown() · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +See [*continuous*.unknown](#continuous_unknown). + +# d3.scaleDivergingLog([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +A [diverging scale](#diverging-scales) with a logarithmic transform, analogous to a [log scale](#log-scales). + +# d3.scaleDivergingPow([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +A [diverging scale](#diverging-scales) with an exponential transform, analogous to a [power scale](#pow-scales). + +# d3.scaleDivergingSqrt([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +A [diverging scale](#diverging-scales) with a square-root transform, analogous to a [d3.scaleSqrt](#scaleSqrt). + +# d3.scaleDivergingSymlog([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/diverging.js), [Examples](https://observablehq.com/@d3/diverging-scales) + +A [diverging scale](#diverging-scales) with a symmetric logarithmic transform, analogous to a [symlog scale](#symlog-scales). + +### Quantize Scales + +Quantize scales are similar to [linear scales](#linear-scales), except they use a discrete rather than continuous range. The continuous input domain is divided into uniform segments based on the number of values in (*i.e.*, the cardinality of) the output range. Each range value *y* can be expressed as a quantized linear function of the domain value *x*: *y* = *m round(x)* + *b*. See [this choropleth](https://observablehq.com/@d3/choropleth) for an example. + +# d3.scaleQuantize([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/quantize.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Constructs a new quantize scale with the specified [*domain*](#quantize_domain) and [*range*](#quantize_range). If either *domain* or *range* is not specified, each defaults to [0, 1]. Thus, the default quantize scale is equivalent to the [Math.round](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math/round) function. + +# quantize(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/quantize.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Given a *value* in the input [domain](#quantize_domain), returns the corresponding value in the output [range](#quantize_range). For example, to apply a color encoding: + +```js +var color = d3.scaleQuantize() + .domain([0, 1]) + .range(["brown", "steelblue"]); + +color(0.49); // "brown" +color(0.51); // "steelblue" +``` + +Or dividing the domain into three equally-sized parts with different range values to compute an appropriate stroke width: + +```js +var width = d3.scaleQuantize() + .domain([10, 100]) + .range([1, 2, 4]); + +width(20); // 1 +width(50); // 2 +width(80); // 4 +``` + +# quantize.invertExtent(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/quantize.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Returns the extent of values in the [domain](#quantize_domain) [x0, x1] for the corresponding *value* in the [range](#quantize_range): the inverse of [*quantize*](#_quantize). This method is useful for interaction, say to determine the value in the domain that corresponds to the pixel location under the mouse. + +```js +var width = d3.scaleQuantize() + .domain([10, 100]) + .range([1, 2, 4]); + +width.invertExtent(2); // [40, 70] +``` + +# quantize.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/quantize.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +If *domain* is specified, sets the scale’s domain to the specified two-element array of numbers. If the elements in the given array are not numbers, they will be coerced to numbers. The numbers must be in ascending order or the behavior of the scale is undefined. If *domain* is not specified, returns the scale’s current domain. + +# quantize.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/quantize.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +If *range* is specified, sets the scale’s range to the specified array of values. The array may contain any number of discrete values. The elements in the given array need not be numbers; any value or type will work. If *range* is not specified, returns the scale’s current range. + +# quantize.ticks([count]) · [Source](https://github.com/d3/d3-scale/blob/master/src/quantize.js), [Examples](https://observablehq.com/@d3/scale-ticks) + +Equivalent to [*continuous*.ticks](#continuous_ticks). + +# quantize.tickFormat([count[, specifier]]) · [Source](https://github.com/d3/d3-scale/blob/master/src/linear.js), [Examples](https://observablehq.com/@d3/scale-ticks) + +Equivalent to [*continuous*.tickFormat](#continuous_tickFormat). + +# quantize.nice() · [Source](https://github.com/d3/d3-scale/blob/master/src/quantize.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Equivalent to [*continuous*.nice](#continuous_nice). + +# quantize.thresholds() · [Source](https://github.com/d3/d3-scale/blob/master/src/quantize.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Returns the array of computed thresholds within the [domain](#quantize_domain). + +# quantize.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/quantize.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Returns an exact copy of this scale. Changes to this scale will not affect the returned scale, and vice versa. + +### Quantile Scales + +Quantile scales map a sampled input domain to a discrete range. The domain is considered continuous and thus the scale will accept any reasonable input value; however, the domain is specified as a discrete set of sample values. The number of values in (the cardinality of) the output range determines the number of quantiles that will be computed from the domain. To compute the quantiles, the domain is sorted, and treated as a [population of discrete values](https://en.wikipedia.org/wiki/Quantile#Quantiles_of_a_population); see d3-array’s [quantile](https://github.com/d3/d3-array/blob/master/README.md#quantile). See [this quantile choropleth](https://observablehq.com/@d3/quantile-choropleth) for an example. + +# d3.scaleQuantile([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/quantile.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Constructs a new quantile scale with the specified [*domain*](#quantile_domain) and [*range*](#quantile_range). If either *domain* or *range* is not specified, each defaults to the empty array. The quantile scale is invalid until both a domain and range are specified. + +# quantile(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/quantile.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Given a *value* in the input [domain](#quantile_domain), returns the corresponding value in the output [range](#quantile_range). + +# quantile.invertExtent(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/quantile.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Returns the extent of values in the [domain](#quantile_domain) [x0, x1] for the corresponding *value* in the [range](#quantile_range): the inverse of [*quantile*](#_quantile). This method is useful for interaction, say to determine the value in the domain that corresponds to the pixel location under the mouse. + +# quantile.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/quantile.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +If *domain* is specified, sets the domain of the quantile scale to the specified set of discrete numeric values. The array must not be empty, and must contain at least one numeric value; NaN, null and undefined values are ignored and not considered part of the sample population. If the elements in the given array are not numbers, they will be coerced to numbers. A copy of the input array is sorted and stored internally. If *domain* is not specified, returns the scale’s current domain. + +# quantile.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/quantile.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +If *range* is specified, sets the discrete values in the range. The array must not be empty, and may contain any type of value. The number of values in (the cardinality, or length, of) the *range* array determines the number of quantiles that are computed. For example, to compute quartiles, *range* must be an array of four elements such as [0, 1, 2, 3]. If *range* is not specified, returns the current range. + +# quantile.quantiles() · [Source](https://github.com/d3/d3-scale/blob/master/src/quantile.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Returns the quantile thresholds. If the [range](#quantile_range) contains *n* discrete values, the returned array will contain *n* - 1 thresholds. Values less than the first threshold are considered in the first quantile; values greater than or equal to the first threshold but less than the second threshold are in the second quantile, and so on. Internally, the thresholds array is used with [bisect](https://github.com/d3/d3-array/blob/master/README.md#bisect) to find the output quantile associated with the given input value. + +# quantile.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/quantile.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Returns an exact copy of this scale. Changes to this scale will not affect the returned scale, and vice versa. + +### Threshold Scales + +Threshold scales are similar to [quantize scales](#quantize-scales), except they allow you to map arbitrary subsets of the domain to discrete values in the range. The input domain is still continuous, and divided into slices based on a set of threshold values. See [this choropleth](https://observablehq.com/@d3/threshold-choropleth) for an example. + +# d3.scaleThreshold([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/threshold.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Constructs a new threshold scale with the specified [*domain*](#threshold_domain) and [*range*](#threshold_range). If *domain* is not specified, it defaults to [0.5]. If *range* is not specified, it defaults to [0, 1]. Thus, the default threshold scale is equivalent to the [Math.round](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math/round) function for numbers; for example threshold(0.49) returns 0, and threshold(0.51) returns 1. + +# threshold(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/threshold.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Given a *value* in the input [domain](#threshold_domain), returns the corresponding value in the output [range](#threshold_range). For example: + +```js +var color = d3.scaleThreshold() + .domain([0, 1]) + .range(["red", "white", "green"]); + +color(-1); // "red" +color(0); // "white" +color(0.5); // "white" +color(1); // "green" +color(1000); // "green" +``` + +# threshold.invertExtent(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/threshold.js), [Examples](https://observablehq.com/@d3/choropleth) + +Returns the extent of values in the [domain](#threshold_domain) [x0, x1] for the corresponding *value* in the [range](#threshold_range), representing the inverse mapping from range to domain. This method is useful for interaction, say to determine the value in the domain that corresponds to the pixel location under the mouse. For example: + +```js +var color = d3.scaleThreshold() + .domain([0, 1]) + .range(["red", "white", "green"]); + +color.invertExtent("red"); // [undefined, 0] +color.invertExtent("white"); // [0, 1] +color.invertExtent("green"); // [1, undefined] +``` + +# threshold.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/threshold.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +If *domain* is specified, sets the scale’s domain to the specified array of values. The values must be in ascending order or the behavior of the scale is undefined. The values are typically numbers, but any naturally ordered values (such as strings) will work; a threshold scale can be used to encode any type that is ordered. If the number of values in the scale’s range is N+1, the number of values in the scale’s domain must be N. If there are fewer than N elements in the domain, the additional values in the range are ignored. If there are more than N elements in the domain, the scale may return undefined for some inputs. If *domain* is not specified, returns the scale’s current domain. + +# threshold.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/threshold.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +If *range* is specified, sets the scale’s range to the specified array of values. If the number of values in the scale’s domain is N, the number of values in the scale’s range must be N+1. If there are fewer than N+1 elements in the range, the scale may return undefined for some inputs. If there are more than N+1 elements in the range, the additional values are ignored. The elements in the given array need not be numbers; any value or type will work. If *range* is not specified, returns the scale’s current range. + +# threshold.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/threshold.js), [Examples](https://observablehq.com/@d3/quantile-quantize-and-threshold-scales) + +Returns an exact copy of this scale. Changes to this scale will not affect the returned scale, and vice versa. + +### Ordinal Scales + +Unlike [continuous scales](#continuous-scales), ordinal scales have a discrete domain and range. For example, an ordinal scale might map a set of named categories to a set of colors, or determine the horizontal positions of columns in a column chart. + +# d3.scaleOrdinal([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/ordinal.js), [Examples](https://observablehq.com/@d3/d3-scaleordinal) + +Constructs a new ordinal scale with the specified [*domain*](#ordinal_domain) and [*range*](#ordinal_range). If *domain* is not specified, it defaults to the empty array. If *range* is not specified, it defaults to the empty array; an ordinal scale always returns undefined until a non-empty range is defined. + +# ordinal(value) · [Source](https://github.com/d3/d3-scale/blob/master/src/ordinal.js), [Examples](https://observablehq.com/@d3/d3-scaleordinal) + +Given a *value* in the input [domain](#ordinal_domain), returns the corresponding value in the output [range](#ordinal_range). If the given *value* is not in the scale’s [domain](#ordinal_domain), returns the [unknown](#ordinal_unknown); or, if the unknown value is [implicit](#scaleImplicit) (the default), then the *value* is implicitly added to the domain and the next-available value in the range is assigned to *value*, such that this and subsequent invocations of the scale given the same input *value* return the same output value. + +# ordinal.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/ordinal.js), [Examples](https://observablehq.com/@d3/d3-scaleordinal) + +If *domain* is specified, sets the domain to the specified array of values. The first element in *domain* will be mapped to the first element in the range, the second domain value to the second range value, and so on. Domain values are stored internally in a map from stringified value to index; the resulting index is then used to retrieve a value from the range. Thus, an ordinal scale’s values must be coercible to a string, and the stringified version of the domain value uniquely identifies the corresponding range value. If *domain* is not specified, this method returns the current domain. + +Setting the domain on an ordinal scale is optional if the [unknown value](#ordinal_unknown) is [implicit](#scaleImplicit) (the default). In this case, the domain will be inferred implicitly from usage by assigning each unique value passed to the scale a new value from the range. Note that an explicit domain is recommended to ensure deterministic behavior, as inferring the domain from usage will be dependent on ordering. + +# ordinal.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/ordinal.js), [Examples](https://observablehq.com/@d3/d3-scaleordinal) + +If *range* is specified, sets the range of the ordinal scale to the specified array of values. The first element in the domain will be mapped to the first element in *range*, the second domain value to the second range value, and so on. If there are fewer elements in the range than in the domain, the scale will reuse values from the start of the range. If *range* is not specified, this method returns the current range. + +# ordinal.unknown([value]) · [Source](https://github.com/d3/d3-scale/blob/master/src/ordinal.js), [Examples](https://observablehq.com/@d3/d3-scaleordinal) + +If *value* is specified, sets the output value of the scale for unknown input values and returns this scale. If *value* is not specified, returns the current unknown value, which defaults to [implicit](#scaleImplicit). The implicit value enables implicit domain construction; see [*ordinal*.domain](#ordinal_domain). + +# ordinal.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/ordinal.js), [Examples](https://observablehq.com/@d3/d3-scaleordinal) + +Returns an exact copy of this ordinal scale. Changes to this scale will not affect the returned scale, and vice versa. + +# d3.scaleImplicit · [Source](https://github.com/d3/d3-scale/blob/master/src/ordinal.js), [Examples](https://observablehq.com/@d3/d3-scaleordinal) + +A special value for [*ordinal*.unknown](#ordinal_unknown) that enables implicit domain construction: unknown values are implicitly added to the domain. + +#### Band Scales + +Band scales are like [ordinal scales](#ordinal-scales) except the output range is continuous and numeric. Discrete output values are automatically computed by the scale by dividing the continuous range into uniform bands. Band scales are typically used for bar charts with an ordinal or categorical dimension. The [unknown value](#ordinal_unknown) of a band scale is effectively undefined: they do not allow implicit domain construction. + +band + +# d3.scaleBand([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +Constructs a new band scale with the specified [*domain*](#band_domain) and [*range*](#band_range), no [padding](#band_padding), no [rounding](#band_round) and center [alignment](#band_align). If *domain* is not specified, it defaults to the empty domain. If *range* is not specified, it defaults to the unit range [0, 1]. + +# band(*value*) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +Given a *value* in the input [domain](#band_domain), returns the start of the corresponding band derived from the output [range](#band_range). If the given *value* is not in the scale’s domain, returns undefined. + +# band.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +If *domain* is specified, sets the domain to the specified array of values. The first element in *domain* will be mapped to the first band, the second domain value to the second band, and so on. Domain values are stored internally in a map from stringified value to index; the resulting index is then used to determine the band. Thus, a band scale’s values must be coercible to a string, and the stringified version of the domain value uniquely identifies the corresponding band. If *domain* is not specified, this method returns the current domain. + +# band.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +If *range* is specified, sets the scale’s range to the specified two-element array of numbers. If the elements in the given array are not numbers, they will be coerced to numbers. If *range* is not specified, returns the scale’s current range, which defaults to [0, 1]. + +# band.rangeRound([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +Sets the scale’s [*range*](#band_range) to the specified two-element array of numbers while also enabling [rounding](#band_round). This is a convenience method equivalent to: + +```js +band + .range(range) + .round(true); +``` + +Rounding is sometimes useful for avoiding antialiasing artifacts, though also consider the [shape-rendering](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering) “crispEdges†styles. + +# band.round([round]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +If *round* is specified, enables or disables rounding accordingly. If rounding is enabled, the start and stop of each band will be integers. Rounding is sometimes useful for avoiding antialiasing artifacts, though also consider the [shape-rendering](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering) “crispEdges†styles. Note that if the width of the domain is not a multiple of the cardinality of the range, there may be leftover unused space, even without padding! Use [*band*.align](#band_align) to specify how the leftover space is distributed. + +# band.paddingInner([padding]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +If *padding* is specified, sets the inner padding to the specified number which must be less than or equal to 1. If *padding* is not specified, returns the current inner padding which defaults to 0. The inner padding specifies the proportion of the range that is reserved for blank space between bands; a value of 0 means no blank space between bands, and a value of 1 means a [bandwidth](#band_bandwidth) of zero. + +# band.paddingOuter([padding]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +If *padding* is specified, sets the outer padding to the specified number which is typically in the range [0, 1]. If *padding* is not specified, returns the current outer padding which defaults to 0. The outer padding specifies the amount of blank space, in terms of multiples of the [step](#band_step), to reserve before the first band and after the last band. + +# band.padding([padding]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +A convenience method for setting the [inner](#band_paddingInner) and [outer](#band_paddingOuter) padding to the same *padding* value. If *padding* is not specified, returns the inner padding. + +# band.align([align]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +If *align* is specified, sets the alignment to the specified value which must be in the range [0, 1]. If *align* is not specified, returns the current alignment which defaults to 0.5. The alignment specifies how outer padding is distributed in the range. A value of 0.5 indicates that the outer padding should be equally distributed before the first band and after the last band; *i.e.*, the bands should be centered within the range. A value of 0 or 1 may be used to shift the bands to one side, say to position them adjacent to an axis. For more, [see this explainer](https://observablehq.com/@d3/band-align). + +# band.bandwidth() · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +Returns the width of each band. + +# band.step() · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +Returns the distance between the starts of adjacent bands. + +# band.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scaleband) + +Returns an exact copy of this scale. Changes to this scale will not affect the returned scale, and vice versa. + +#### Point Scales + +Point scales are a variant of [band scales](#band-scales) with the bandwidth fixed to zero. Point scales are typically used for scatterplots with an ordinal or categorical dimension. The [unknown value](#ordinal_unknown) of a point scale is always undefined: they do not allow implicit domain construction. + +point + +# d3.scalePoint([[domain, ]range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scalepoint) + +Constructs a new point scale with the specified [*domain*](#point_domain) and [*range*](#point_range), no [padding](#point_padding), no [rounding](#point_round) and center [alignment](#point_align). If *domain* is not specified, it defaults to the empty domain. If *range* is not specified, it defaults to the unit range [0, 1]. + +# point(*value*) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scalepoint) + +Given a *value* in the input [domain](#point_domain), returns the corresponding point derived from the output [range](#point_range). If the given *value* is not in the scale’s domain, returns undefined. + +# point.domain([domain]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scalepoint) + +If *domain* is specified, sets the domain to the specified array of values. The first element in *domain* will be mapped to the first point, the second domain value to the second point, and so on. Domain values are stored internally in a map from stringified value to index; the resulting index is then used to determine the point. Thus, a point scale’s values must be coercible to a string, and the stringified version of the domain value uniquely identifies the corresponding point. If *domain* is not specified, this method returns the current domain. + +# point.range([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scalepoint) + +If *range* is specified, sets the scale’s range to the specified two-element array of numbers. If the elements in the given array are not numbers, they will be coerced to numbers. If *range* is not specified, returns the scale’s current range, which defaults to [0, 1]. + +# point.rangeRound([range]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scalepoint) + +Sets the scale’s [*range*](#point_range) to the specified two-element array of numbers while also enabling [rounding](#point_round). This is a convenience method equivalent to: + +```js +point + .range(range) + .round(true); +``` + +Rounding is sometimes useful for avoiding antialiasing artifacts, though also consider the [shape-rendering](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering) “crispEdges†styles. + +# point.round([round]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scalepoint) + +If *round* is specified, enables or disables rounding accordingly. If rounding is enabled, the position of each point will be integers. Rounding is sometimes useful for avoiding antialiasing artifacts, though also consider the [shape-rendering](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/shape-rendering) “crispEdges†styles. Note that if the width of the domain is not a multiple of the cardinality of the range, there may be leftover unused space, even without padding! Use [*point*.align](#point_align) to specify how the leftover space is distributed. + +# point.padding([padding]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scalepoint) + +If *padding* is specified, sets the outer padding to the specified number which is typically in the range [0, 1]. If *padding* is not specified, returns the current outer padding which defaults to 0. The outer padding specifies the amount of blank space, in terms of multiples of the [step](#band_step), to reserve before the first point and after the last point. Equivalent to [*band*.paddingOuter](#band_paddingOuter). + +# point.align([align]) · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scalepoint) + +If *align* is specified, sets the alignment to the specified value which must be in the range [0, 1]. If *align* is not specified, returns the current alignment which defaults to 0.5. The alignment specifies how any leftover unused space in the range is distributed. A value of 0.5 indicates that the leftover space should be equally distributed before the first point and after the last point; *i.e.*, the points should be centered within the range. A value of 0 or 1 may be used to shift the points to one side, say to position them adjacent to an axis. + +# point.bandwidth() · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scalepoint) + +Returns zero. + +# point.step() · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scalepoint) + +Returns the distance between the starts of adjacent points. + +# point.copy() · [Source](https://github.com/d3/d3-scale/blob/master/src/band.js), [Examples](https://observablehq.com/@d3/d3-scalepoint) + +Returns an exact copy of this scale. Changes to this scale will not affect the returned scale, and vice versa. diff --git a/node_modules/d3-scale/dist/d3-scale.js b/node_modules/d3-scale/dist/d3-scale.js new file mode 100644 index 00000000..7a8c7e1e --- /dev/null +++ b/node_modules/d3-scale/dist/d3-scale.js @@ -0,0 +1,1267 @@ +// https://d3js.org/d3-scale/ v3.2.3 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('d3-interpolate'), require('d3-format'), require('d3-time'), require('d3-time-format')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-interpolate', 'd3-format', 'd3-time', 'd3-time-format'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3)); +}(this, function (exports, d3Array, d3Interpolate, d3Format, d3Time, d3TimeFormat) { 'use strict'; + +function initRange(domain, range) { + switch (arguments.length) { + case 0: break; + case 1: this.range(domain); break; + default: this.range(range).domain(domain); break; + } + return this; +} + +function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: break; + case 1: { + if (typeof domain === "function") this.interpolator(domain); + else this.range(domain); + break; + } + default: { + this.domain(domain); + if (typeof interpolator === "function") this.interpolator(interpolator); + else this.range(interpolator); + break; + } + } + return this; +} + +const implicit = Symbol("implicit"); + +function ordinal() { + var index = new Map(), + domain = [], + range = [], + unknown = implicit; + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = [], index = new Map(); + for (const value of _) { + const key = value + ""; + if (index.has(key)) continue; + index.set(key, domain.push(value)); + } + return scale; + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), scale) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return ordinal(domain, range).unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + r0 = 0, + r1 = 1, + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = r1 < r0, + start = reverse ? r1 : r0, + stop = reverse ? r0 : r1; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = d3Array.range(n).map(function(i) { return start + step * i; }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function(_) { + return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1]; + }; + + scale.rangeRound = function(_) { + return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale(); + }; + + scale.bandwidth = function() { + return bandwidth; + }; + + scale.step = function() { + return step; + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function(_) { + return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; + + scale.paddingInner = function(_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; + + scale.paddingOuter = function(_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; + + scale.align = function(_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function() { + return band(domain(), [r0, r1]) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return initRange.apply(rescale(), arguments); +} + +function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function() { + return pointish(copy()); + }; + + return scale; +} + +function point() { + return pointish(band.apply(null, arguments).paddingInner(1)); +} + +function constants(x) { + return function() { + return x; + }; +} + +function number(x) { + return +x; +} + +var unit = [0, 1]; + +function identity(x) { + return x; +} + +function normalize(a, b) { + return (b -= (a = +a)) + ? function(x) { return (x - a) / b; } + : constants(isNaN(b) ? NaN : 0.5); +} + +function clamper(a, b) { + var t; + if (a > b) t = a, a = b, b = t; + return function(x) { return Math.max(a, Math.min(b, x)); }; +} + +// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. +function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function(x) { return r0(d0(x)); }; +} + +function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + + return function(x) { + var i = d3Array.bisect(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; +} + +function copy(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +function transformer() { + var domain = unit, + range = unit, + interpolate = d3Interpolate.interpolate, + transform, + untransform, + unknown, + clamp = identity, + piecewise, + output, + input; + + function rescale() { + var n = Math.min(domain.length, range.length); + if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]); + piecewise = n > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + } + + scale.invert = function(y) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3Interpolate.interpolateNumber)))(y))); + }; + + scale.domain = function(_) { + return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); + }; + + scale.rangeRound = function(_) { + return range = Array.from(_), interpolate = d3Interpolate.interpolateRound, rescale(); + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity; + }; + + scale.interpolate = function(_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t, u) { + transform = t, untransform = u; + return rescale(); + }; +} + +function continuous() { + return transformer()(identity, identity); +} + +function tickFormat(start, stop, count, specifier) { + var step = d3Array.tickStep(start, stop, count), + precision; + specifier = d3Format.formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision; + return d3Format.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return d3Format.format(specifier); +} + +function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function(count) { + var d = domain(); + return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function(count, specifier) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + }; + + scale.nice = function(count) { + if (count == null) count = 10; + + var d = domain(); + var i0 = 0; + var i1 = d.length - 1; + var start = d[i0]; + var stop = d[i1]; + var prestep; + var step; + var maxIter = 10; + + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + while (maxIter-- > 0) { + step = d3Array.tickIncrement(start, stop, count); + if (step === prestep) { + d[i0] = start; + d[i1] = stop; + return domain(d); + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } else { + break; + } + prestep = step; + } + + return scale; + }; + + return scale; +} + +function linear() { + var scale = continuous(); + + scale.copy = function() { + return copy(scale, linear()); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); +} + +function identity$1(domain) { + var unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : x; + } + + scale.invert = scale; + + scale.domain = scale.range = function(_) { + return arguments.length ? (domain = Array.from(_, number), scale) : domain.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return identity$1(domain).unknown(unknown); + }; + + domain = arguments.length ? Array.from(domain, number) : [0, 1]; + + return linearish(scale); +} + +function nice(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; +} + +function transformLog(x) { + return Math.log(x); +} + +function transformExp(x) { + return Math.exp(x); +} + +function transformLogn(x) { + return -Math.log(-x); +} + +function transformExpn(x) { + return -Math.exp(-x); +} + +function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; +} + +function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function(x) { return Math.pow(base, x); }; +} + +function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function(x) { return Math.log(x) / base; }); +} + +function reflect(f) { + return function(x) { + return -f(-x); + }; +} + +function loggish(transform) { + var scale = transform(transformLog, transformExp), + domain = scale.domain, + base = 10, + logs, + pows; + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) { + logs = reflect(logs), pows = reflect(pows); + transform(transformLogn, transformExpn); + } else { + transform(transformLog, transformExp); + } + return scale; + } + + scale.base = function(_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function(count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.floor(i), j = Math.ceil(j); + if (u > 0) for (; i <= j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i <= j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + if (z.length * 2 < n) z = d3Array.ticks(u, v, n); + } else { + z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function(count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = d3Format.format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function(d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function() { + return domain(nice(domain(), { + floor: function(x) { return pows(Math.floor(logs(x))); }, + ceil: function(x) { return pows(Math.ceil(logs(x))); } + })); + }; + + return scale; +} + +function log() { + var scale = loggish(transformer()).domain([1, 10]); + + scale.copy = function() { + return copy(scale, log()).base(scale.base()); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function transformSymlog(c) { + return function(x) { + return Math.sign(x) * Math.log1p(Math.abs(x / c)); + }; +} + +function transformSymexp(c) { + return function(x) { + return Math.sign(x) * Math.expm1(Math.abs(x)) * c; + }; +} + +function symlogish(transform) { + var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); + + scale.constant = function(_) { + return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; + }; + + return linearish(scale); +} + +function symlog() { + var scale = symlogish(transformer()); + + scale.copy = function() { + return copy(scale, symlog()).constant(scale.constant()); + }; + + return initRange.apply(scale, arguments); +} + +function transformPow(exponent) { + return function(x) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + }; +} + +function transformSqrt(x) { + return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); +} + +function transformSquare(x) { + return x < 0 ? -x * x : x * x; +} + +function powish(transform) { + var scale = transform(identity, identity), + exponent = 1; + + function rescale() { + return exponent === 1 ? transform(identity, identity) + : exponent === 0.5 ? transform(transformSqrt, transformSquare) + : transform(transformPow(exponent), transformPow(1 / exponent)); + } + + scale.exponent = function(_) { + return arguments.length ? (exponent = +_, rescale()) : exponent; + }; + + return linearish(scale); +} + +function pow() { + var scale = powish(transformer()); + + scale.copy = function() { + return copy(scale, pow()).exponent(scale.exponent()); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function sqrt() { + return pow.apply(null, arguments).exponent(0.5); +} + +function square(x) { + return Math.sign(x) * x * x; +} + +function unsquare(x) { + return Math.sign(x) * Math.sqrt(Math.abs(x)); +} + +function radial() { + var squared = continuous(), + range = [0, 1], + round = false, + unknown; + + function scale(x) { + var y = unsquare(squared(x)); + return isNaN(y) ? unknown : round ? Math.round(y) : y; + } + + scale.invert = function(y) { + return squared.invert(square(y)); + }; + + scale.domain = function(_) { + return arguments.length ? (squared.domain(_), scale) : squared.domain(); + }; + + scale.range = function(_) { + return arguments.length ? (squared.range((range = Array.from(_, number)).map(square)), scale) : range.slice(); + }; + + scale.rangeRound = function(_) { + return scale.range(_).round(true); + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, scale) : round; + }; + + scale.clamp = function(_) { + return arguments.length ? (squared.clamp(_), scale) : squared.clamp(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return radial(squared.domain(), range) + .round(round) + .clamp(squared.clamp()) + .unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); +} + +function quantile() { + var domain = [], + range = [], + thresholds = [], + unknown; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = d3Array.quantileSorted(domain, i / n); + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : range[d3Array.bisect(thresholds, x)]; + } + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(d3Array.ascending); + return rescale(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.quantiles = function() { + return thresholds.slice(); + }; + + scale.copy = function() { + return quantile() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} + +function quantize() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1], + unknown; + + function scale(x) { + return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [x0, x1]; + }; + + scale.range = function(_) { + return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : scale; + }; + + scale.thresholds = function() { + return domain.slice(); + }; + + scale.copy = function() { + return quantize() + .domain([x0, x1]) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(linearish(scale), arguments); +} + +function threshold() { + var domain = [0.5], + range = [0, 1], + unknown, + n = 1; + + function scale(x) { + return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; + } + + scale.domain = function(_) { + return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return threshold() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} + +var durationSecond = 1000, + durationMinute = durationSecond * 60, + durationHour = durationMinute * 60, + durationDay = durationHour * 24, + durationWeek = durationDay * 7, + durationMonth = durationDay * 30, + durationYear = durationDay * 365; + +function date(t) { + return new Date(t); +} + +function number$1(t) { + return t instanceof Date ? +t : +new Date(+t); +} + +function calendar(year, month, week, day, hour, minute, second, millisecond, format) { + var scale = continuous(), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second, 1, durationSecond], + [second, 5, 5 * durationSecond], + [second, 15, 15 * durationSecond], + [second, 30, 30 * durationSecond], + [minute, 1, durationMinute], + [minute, 5, 5 * durationMinute], + [minute, 15, 15 * durationMinute], + [minute, 30, 30 * durationMinute], + [ hour, 1, durationHour ], + [ hour, 3, 3 * durationHour ], + [ hour, 6, 6 * durationHour ], + [ hour, 12, 12 * durationHour ], + [ day, 1, durationDay ], + [ day, 2, 2 * durationDay ], + [ week, 1, durationWeek ], + [ month, 1, durationMonth ], + [ month, 3, 3 * durationMonth ], + [ year, 1, durationYear ] + ]; + + function tickFormat(date) { + return (second(date) < date ? formatMillisecond + : minute(date) < date ? formatSecond + : hour(date) < date ? formatMinute + : day(date) < date ? formatHour + : month(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop) { + if (interval == null) interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = d3Array.bisector(function(i) { return i[2]; }).right(tickIntervals, target), + step; + if (i === tickIntervals.length) { + step = d3Array.tickStep(start / durationYear, stop / durationYear, interval); + interval = year; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = Math.max(d3Array.tickStep(start, stop, interval), 1); + interval = millisecond; + } + return interval.every(step); + } + + return interval; + } + + scale.invert = function(y) { + return new Date(invert(y)); + }; + + scale.domain = function(_) { + return arguments.length ? domain(Array.from(_, number$1)) : domain().map(date); + }; + + scale.ticks = function(interval) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function(count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function(interval) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1])) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function() { + return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + }; + + return scale; +} + +function time() { + return initRange.apply(calendar(d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3Time.timeMillisecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); +} + +function utcTime() { + return initRange.apply(calendar(d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3Time.utcMillisecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); +} + +function transformer$1() { + var x0 = 0, + x1 = 1, + t0, + t1, + k10, + transform, + interpolator = identity, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + function range(interpolate) { + return function(_) { + var r0, r1; + return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)]; + }; + } + + scale.range = range(d3Interpolate.interpolate); + + scale.rangeRound = range(d3Interpolate.interpolateRound); + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); + return scale; + }; +} + +function copy$1(source, target) { + return target + .domain(source.domain()) + .interpolator(source.interpolator()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +function sequential() { + var scale = linearish(transformer$1()(identity)); + + scale.copy = function() { + return copy$1(scale, sequential()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialLog() { + var scale = loggish(transformer$1()).domain([1, 10]); + + scale.copy = function() { + return copy$1(scale, sequentialLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialSymlog() { + var scale = symlogish(transformer$1()); + + scale.copy = function() { + return copy$1(scale, sequentialSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialPow() { + var scale = powish(transformer$1()); + + scale.copy = function() { + return copy$1(scale, sequentialPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialSqrt() { + return sequentialPow.apply(null, arguments).exponent(0.5); +} + +function sequentialQuantile() { + var domain = [], + interpolator = identity; + + function scale(x) { + if (!isNaN(x = +x)) return interpolator((d3Array.bisect(domain, x, 1) - 1) / (domain.length - 1)); + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(d3Array.ascending); + return scale; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.range = function() { + return domain.map((d, i) => interpolator(i / (domain.length - 1))); + }; + + scale.quantiles = function(n) { + return Array.from({length: n + 1}, (_, i) => d3Array.quantile(domain, i / n)); + }; + + scale.copy = function() { + return sequentialQuantile(interpolator).domain(domain); + }; + + return initInterpolator.apply(scale, arguments); +} + +function transformer$2() { + var x0 = 0, + x1 = 0.5, + x2 = 1, + s = 1, + t0, + t1, + t2, + k10, + k21, + interpolator = identity, + transform, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [x0, x1, x2]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + function range(interpolate) { + return function(_) { + var r0, r1, r2; + return arguments.length ? ([r0, r1, r2] = _, interpolator = d3Interpolate.piecewise(interpolate, [r0, r1, r2]), scale) : [interpolator(0), interpolator(0.5), interpolator(1)]; + }; + } + + scale.range = range(d3Interpolate.interpolate); + + scale.rangeRound = range(d3Interpolate.interpolateRound); + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1; + return scale; + }; +} + +function diverging() { + var scale = linearish(transformer$2()(identity)); + + scale.copy = function() { + return copy$1(scale, diverging()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingLog() { + var scale = loggish(transformer$2()).domain([0.1, 1, 10]); + + scale.copy = function() { + return copy$1(scale, divergingLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingSymlog() { + var scale = symlogish(transformer$2()); + + scale.copy = function() { + return copy$1(scale, divergingSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingPow() { + var scale = powish(transformer$2()); + + scale.copy = function() { + return copy$1(scale, divergingPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingSqrt() { + return divergingPow.apply(null, arguments).exponent(0.5); +} + +exports.scaleBand = band; +exports.scaleDiverging = diverging; +exports.scaleDivergingLog = divergingLog; +exports.scaleDivergingPow = divergingPow; +exports.scaleDivergingSqrt = divergingSqrt; +exports.scaleDivergingSymlog = divergingSymlog; +exports.scaleIdentity = identity$1; +exports.scaleImplicit = implicit; +exports.scaleLinear = linear; +exports.scaleLog = log; +exports.scaleOrdinal = ordinal; +exports.scalePoint = point; +exports.scalePow = pow; +exports.scaleQuantile = quantile; +exports.scaleQuantize = quantize; +exports.scaleRadial = radial; +exports.scaleSequential = sequential; +exports.scaleSequentialLog = sequentialLog; +exports.scaleSequentialPow = sequentialPow; +exports.scaleSequentialQuantile = sequentialQuantile; +exports.scaleSequentialSqrt = sequentialSqrt; +exports.scaleSequentialSymlog = sequentialSymlog; +exports.scaleSqrt = sqrt; +exports.scaleSymlog = symlog; +exports.scaleThreshold = threshold; +exports.scaleTime = time; +exports.scaleUtc = utcTime; +exports.tickFormat = tickFormat; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-scale/dist/d3-scale.min.js b/node_modules/d3-scale/dist/d3-scale.min.js new file mode 100644 index 00000000..81799bfa --- /dev/null +++ b/node_modules/d3-scale/dist/d3-scale.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-scale/ v3.2.3 Copyright 2020 Mike Bostock +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-array"),require("d3-interpolate"),require("d3-format"),require("d3-time"),require("d3-time-format")):"function"==typeof define&&define.amd?define(["exports","d3-array","d3-interpolate","d3-format","d3-time","d3-time-format"],t):t((n=n||self).d3=n.d3||{},n.d3,n.d3,n.d3,n.d3,n.d3)}(this,function(n,t,r,e,u,i){"use strict";function o(n,t){switch(arguments.length){case 0:break;case 1:this.range(n);break;default:this.range(t).domain(n)}return this}function a(n,t){switch(arguments.length){case 0:break;case 1:"function"==typeof n?this.interpolator(n):this.range(n);break;default:this.domain(n),"function"==typeof t?this.interpolator(t):this.range(t)}return this}const c=Symbol("implicit");function f(){var n=new Map,t=[],r=[],e=c;function u(u){var i=u+"",o=n.get(i);if(!o){if(e!==c)return e;n.set(i,o=t.push(u))}return r[(o-1)%r.length]}return u.domain=function(r){if(!arguments.length)return t.slice();t=[],n=new Map;for(const e of r){const r=e+"";n.has(r)||n.set(r,t.push(e))}return u},u.range=function(n){return arguments.length?(r=Array.from(n),u):r.slice()},u.unknown=function(n){return arguments.length?(e=n,u):e},u.copy=function(){return f(t,r).unknown(e)},o.apply(u,arguments),u}function l(){var n,r,e=f().unknown(void 0),u=e.domain,i=e.range,a=0,c=1,p=!1,s=0,h=0,g=.5;function m(){var e=u().length,o=ct&&(r=n,n=t,t=r),l=function(r){return Math.max(n,Math.min(t,r))}),u=e>2?d:m,i=o=null,y}function y(t){return isNaN(t=+t)?e:(i||(i=u(a.map(n),c,f)))(n(l(t)))}return y.invert=function(e){return l(t((o||(o=u(c,a.map(n),r.interpolateNumber)))(e)))},y.domain=function(n){return arguments.length?(a=Array.from(n,p),g()):a.slice()},y.range=function(n){return arguments.length?(c=Array.from(n),g()):c.slice()},y.rangeRound=function(n){return c=Array.from(n),f=r.interpolateRound,g()},y.clamp=function(n){return arguments.length?(l=!!n||h,g()):l!==h},y.interpolate=function(n){return arguments.length?(f=n,g()):f},y.unknown=function(n){return arguments.length?(e=n,y):e},function(r,e){return n=r,t=e,g()}}function M(){return v()(h,h)}function k(n,r,u,i){var o,a=t.tickStep(n,r,u);switch((i=e.formatSpecifier(null==i?",f":i)).type){case"s":var c=Math.max(Math.abs(n),Math.abs(r));return null!=i.precision||isNaN(o=e.precisionPrefix(a,c))||(i.precision=o),e.formatPrefix(i,c);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(o=e.precisionRound(a,Math.max(Math.abs(n),Math.abs(r))))||(i.precision=o-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(o=e.precisionFixed(a))||(i.precision=o-2*("%"===i.type))}return e.format(i)}function w(n){var r=n.domain;return n.ticks=function(n){var e=r();return t.ticks(e[0],e[e.length-1],null==n?10:n)},n.tickFormat=function(n,t){var e=r();return k(e[0],e[e.length-1],null==n?10:n,t)},n.nice=function(e){null==e&&(e=10);var u,i,o=r(),a=0,c=o.length-1,f=o[a],l=o[c],p=10;for(l0;){if((i=t.tickIncrement(f,l,e))===u)return o[a]=f,o[c]=l,r(o);if(i>0)f=Math.floor(f/i)*i,l=Math.ceil(l/i)*i;else{if(!(i<0))break;f=Math.ceil(f*i)/i,l=Math.floor(l*i)/i}u=i}return n},n}function N(n,t){var r,e=0,u=(n=n.slice()).length-1,i=n[e],o=n[u];return o0){for(;h<=g;++h)for(p=1,l=u(h);pf)break;d.push(s)}}else for(;h<=g;++h)for(p=a-1,l=u(h);p>=1;--p)if(!((s=l*p)f)break;d.push(s)}2*d.length0?i[t-1]:e[0],t=i?[a[i-1],u]:[a[t-1],a[t]]},f.unknown=function(n){return arguments.length?(r=n,f):f},f.thresholds=function(){return a.slice()},f.copy=function(){return n().domain([e,u]).range(c).unknown(r)},o.apply(w(f),arguments)},n.scaleRadial=function n(){var t,r=M(),e=[0,1],u=!1;function i(n){var e=function(n){return Math.sign(n)*Math.sqrt(Math.abs(n))}(r(n));return isNaN(e)?t:u?Math.round(e):e}return i.invert=function(n){return r.invert(U(n))},i.domain=function(n){return arguments.length?(r.domain(n),i):r.domain()},i.range=function(n){return arguments.length?(r.range((e=Array.from(n,p)).map(U)),i):e.slice()},i.rangeRound=function(n){return i.range(n).round(!0)},i.round=function(n){return arguments.length?(u=!!n,i):u},i.clamp=function(n){return arguments.length?(r.clamp(n),i):r.clamp()},i.unknown=function(n){return arguments.length?(t=n,i):t},i.copy=function(){return n(r.domain(),e).round(u).clamp(r.clamp()).unknown(t)},o.apply(i,arguments),w(i)},n.scaleSequential=function n(){var t=w(K()(h));return t.copy=function(){return V(t,n())},a.apply(t,arguments)},n.scaleSequentialLog=function n(){var t=R(K()).domain([1,10]);return t.copy=function(){return V(t,n()).base(t.base())},a.apply(t,arguments)},n.scaleSequentialPow=X,n.scaleSequentialQuantile=function n(){var r=[],e=h;function u(n){if(!isNaN(n=+n))return e((t.bisect(r,n,1)-1)/(r.length-1))}return u.domain=function(n){if(!arguments.length)return r.slice();r=[];for(let t of n)null==t||isNaN(t=+t)||r.push(t);return r.sort(t.ascending),u},u.interpolator=function(n){return arguments.length?(e=n,u):e},u.range=function(){return r.map((n,t)=>e(t/(r.length-1)))},u.quantiles=function(n){return Array.from({length:n+1},(e,u)=>t.quantile(r,u/n))},u.copy=function(){return n(e).domain(r)},a.apply(u,arguments)},n.scaleSequentialSqrt=function(){return X.apply(null,arguments).exponent(.5)},n.scaleSequentialSymlog=function n(){var t=F(K());return t.copy=function(){return V(t,n()).constant(t.constant())},a.apply(t,arguments)},n.scaleSqrt=function(){return Q.apply(null,arguments).exponent(.5)},n.scaleSymlog=function n(){var t=F(v());return t.copy=function(){return y(t,n()).constant(t.constant())},o.apply(t,arguments)},n.scaleThreshold=function n(){var r,e=[.5],u=[0,1],i=1;function a(n){return n<=n?u[t.bisect(e,n,0,i)]:r}return a.domain=function(n){return arguments.length?(e=Array.from(n),i=Math.min(e.length,u.length-1),a):e.slice()},a.range=function(n){return arguments.length?(u=Array.from(n),i=Math.min(e.length,u.length-1),a):u.slice()},a.invertExtent=function(n){var t=u.indexOf(n);return[e[t-1],e[t]]},a.unknown=function(n){return arguments.length?(r=n,a):r},a.copy=function(){return n().domain(e).range(u).unknown(r)},o.apply(a,arguments)},n.scaleTime=function(){return o.apply(J(u.timeYear,u.timeMonth,u.timeWeek,u.timeDay,u.timeHour,u.timeMinute,u.timeSecond,u.timeMillisecond,i.timeFormat).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)},n.scaleUtc=function(){return o.apply(J(u.utcYear,u.utcMonth,u.utcWeek,u.utcDay,u.utcHour,u.utcMinute,u.utcSecond,u.utcMillisecond,i.utcFormat).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)},n.tickFormat=k,Object.defineProperty(n,"__esModule",{value:!0})}); diff --git a/node_modules/d3-scale/package.json b/node_modules/d3-scale/package.json new file mode 100644 index 00000000..822e551a --- /dev/null +++ b/node_modules/d3-scale/package.json @@ -0,0 +1,78 @@ +{ + "_from": "d3-scale@3", + "_id": "d3-scale@3.2.3", + "_inBundle": false, + "_integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "_location": "/d3-scale", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-scale@3", + "name": "d3-scale", + "escapedName": "d3-scale", + "rawSpec": "3", + "saveSpec": null, + "fetchSpec": "3" + }, + "_requiredBy": [ + "/d3" + ], + "_resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "_shasum": "be380f57f1f61d4ff2e6cbb65a40593a51649cfd", + "_spec": "d3-scale@3", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-scale/issues" + }, + "bundleDependencies": false, + "dependencies": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + }, + "deprecated": false, + "description": "Encodings that map abstract data to visual representation.", + "devDependencies": { + "d3-color": "1 - 2", + "eslint": "6", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-scale/", + "jsdelivr": "dist/d3-scale.min.js", + "keywords": [ + "d3", + "d3-module", + "scale", + "visualization" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-scale.js", + "module": "src/index.js", + "name": "d3-scale", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-scale.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "TZ=America/Los_Angeles tape 'test/**/*-test.js' && eslint src" + }, + "sideEffects": false, + "unpkg": "dist/d3-scale.min.js", + "version": "3.2.3" +} diff --git a/node_modules/d3-scale/src/band.js b/node_modules/d3-scale/src/band.js new file mode 100644 index 00000000..88e1fbdf --- /dev/null +++ b/node_modules/d3-scale/src/band.js @@ -0,0 +1,101 @@ +import {range as sequence} from "d3-array"; +import {initRange} from "./init.js"; +import ordinal from "./ordinal.js"; + +export default function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + r0 = 0, + r1 = 1, + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = r1 < r0, + start = reverse ? r1 : r0, + stop = reverse ? r0 : r1; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = sequence(n).map(function(i) { return start + step * i; }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function(_) { + return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1]; + }; + + scale.rangeRound = function(_) { + return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale(); + }; + + scale.bandwidth = function() { + return bandwidth; + }; + + scale.step = function() { + return step; + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function(_) { + return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; + + scale.paddingInner = function(_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; + + scale.paddingOuter = function(_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; + + scale.align = function(_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function() { + return band(domain(), [r0, r1]) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return initRange.apply(rescale(), arguments); +} + +function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function() { + return pointish(copy()); + }; + + return scale; +} + +export function point() { + return pointish(band.apply(null, arguments).paddingInner(1)); +} diff --git a/node_modules/d3-scale/src/colors.js b/node_modules/d3-scale/src/colors.js new file mode 100644 index 00000000..b344ddb7 --- /dev/null +++ b/node_modules/d3-scale/src/colors.js @@ -0,0 +1,5 @@ +export default function colors(s) { + return s.match(/.{6}/g).map(function(x) { + return "#" + x; + }); +} diff --git a/node_modules/d3-scale/src/constant.js b/node_modules/d3-scale/src/constant.js new file mode 100644 index 00000000..be84feec --- /dev/null +++ b/node_modules/d3-scale/src/constant.js @@ -0,0 +1,5 @@ +export default function constants(x) { + return function() { + return x; + }; +} diff --git a/node_modules/d3-scale/src/continuous.js b/node_modules/d3-scale/src/continuous.js new file mode 100644 index 00000000..2dd1cf97 --- /dev/null +++ b/node_modules/d3-scale/src/continuous.js @@ -0,0 +1,125 @@ +import {bisect} from "d3-array"; +import {interpolate as interpolateValue, interpolateNumber, interpolateRound} from "d3-interpolate"; +import constant from "./constant.js"; +import number from "./number.js"; + +var unit = [0, 1]; + +export function identity(x) { + return x; +} + +function normalize(a, b) { + return (b -= (a = +a)) + ? function(x) { return (x - a) / b; } + : constant(isNaN(b) ? NaN : 0.5); +} + +function clamper(a, b) { + var t; + if (a > b) t = a, a = b, b = t; + return function(x) { return Math.max(a, Math.min(b, x)); }; +} + +// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. +function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function(x) { return r0(d0(x)); }; +} + +function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + + return function(x) { + var i = bisect(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; +} + +export function copy(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +export function transformer() { + var domain = unit, + range = unit, + interpolate = interpolateValue, + transform, + untransform, + unknown, + clamp = identity, + piecewise, + output, + input; + + function rescale() { + var n = Math.min(domain.length, range.length); + if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]); + piecewise = n > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + } + + scale.invert = function(y) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y))); + }; + + scale.domain = function(_) { + return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); + }; + + scale.rangeRound = function(_) { + return range = Array.from(_), interpolate = interpolateRound, rescale(); + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity; + }; + + scale.interpolate = function(_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t, u) { + transform = t, untransform = u; + return rescale(); + }; +} + +export default function continuous() { + return transformer()(identity, identity); +} diff --git a/node_modules/d3-scale/src/diverging.js b/node_modules/d3-scale/src/diverging.js new file mode 100644 index 00000000..f5907488 --- /dev/null +++ b/node_modules/d3-scale/src/diverging.js @@ -0,0 +1,104 @@ +import {interpolate, interpolateRound, piecewise} from "d3-interpolate"; +import {identity} from "./continuous.js"; +import {initInterpolator} from "./init.js"; +import {linearish} from "./linear.js"; +import {loggish} from "./log.js"; +import {copy} from "./sequential.js"; +import {symlogish} from "./symlog.js"; +import {powish} from "./pow.js"; + +function transformer() { + var x0 = 0, + x1 = 0.5, + x2 = 1, + s = 1, + t0, + t1, + t2, + k10, + k21, + interpolator = identity, + transform, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [x0, x1, x2]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + function range(interpolate) { + return function(_) { + var r0, r1, r2; + return arguments.length ? ([r0, r1, r2] = _, interpolator = piecewise(interpolate, [r0, r1, r2]), scale) : [interpolator(0), interpolator(0.5), interpolator(1)]; + }; + } + + scale.range = range(interpolate); + + scale.rangeRound = range(interpolateRound); + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1; + return scale; + }; +} + +export default function diverging() { + var scale = linearish(transformer()(identity)); + + scale.copy = function() { + return copy(scale, diverging()); + }; + + return initInterpolator.apply(scale, arguments); +} + +export function divergingLog() { + var scale = loggish(transformer()).domain([0.1, 1, 10]); + + scale.copy = function() { + return copy(scale, divergingLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +export function divergingSymlog() { + var scale = symlogish(transformer()); + + scale.copy = function() { + return copy(scale, divergingSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +export function divergingPow() { + var scale = powish(transformer()); + + scale.copy = function() { + return copy(scale, divergingPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +export function divergingSqrt() { + return divergingPow.apply(null, arguments).exponent(0.5); +} diff --git a/node_modules/d3-scale/src/identity.js b/node_modules/d3-scale/src/identity.js new file mode 100644 index 00000000..af41c591 --- /dev/null +++ b/node_modules/d3-scale/src/identity.js @@ -0,0 +1,28 @@ +import {linearish} from "./linear.js"; +import number from "./number.js"; + +export default function identity(domain) { + var unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : x; + } + + scale.invert = scale; + + scale.domain = scale.range = function(_) { + return arguments.length ? (domain = Array.from(_, number), scale) : domain.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return identity(domain).unknown(unknown); + }; + + domain = arguments.length ? Array.from(domain, number) : [0, 1]; + + return linearish(scale); +} diff --git a/node_modules/d3-scale/src/index.js b/node_modules/d3-scale/src/index.js new file mode 100644 index 00000000..510103cc --- /dev/null +++ b/node_modules/d3-scale/src/index.js @@ -0,0 +1,78 @@ +export { + default as scaleBand, + point as scalePoint +} from "./band.js"; + +export { + default as scaleIdentity +} from "./identity.js"; + +export { + default as scaleLinear +} from "./linear.js"; + +export { + default as scaleLog +} from "./log.js"; + +export { + default as scaleSymlog +} from "./symlog.js"; + +export { + default as scaleOrdinal, + implicit as scaleImplicit +} from "./ordinal.js"; + +export { + default as scalePow, + sqrt as scaleSqrt +} from "./pow.js"; + +export { + default as scaleRadial +} from "./radial.js"; + +export { + default as scaleQuantile +} from "./quantile.js"; + +export { + default as scaleQuantize +} from "./quantize.js"; + +export { + default as scaleThreshold +} from "./threshold.js"; + +export { + default as scaleTime +} from "./time.js"; + +export { + default as scaleUtc +} from "./utcTime.js"; + +export { + default as scaleSequential, + sequentialLog as scaleSequentialLog, + sequentialPow as scaleSequentialPow, + sequentialSqrt as scaleSequentialSqrt, + sequentialSymlog as scaleSequentialSymlog +} from "./sequential.js"; + +export { + default as scaleSequentialQuantile +} from "./sequentialQuantile.js"; + +export { + default as scaleDiverging, + divergingLog as scaleDivergingLog, + divergingPow as scaleDivergingPow, + divergingSqrt as scaleDivergingSqrt, + divergingSymlog as scaleDivergingSymlog +} from "./diverging.js"; + +export { + default as tickFormat +} from "./tickFormat.js"; diff --git a/node_modules/d3-scale/src/init.js b/node_modules/d3-scale/src/init.js new file mode 100644 index 00000000..61f51a07 --- /dev/null +++ b/node_modules/d3-scale/src/init.js @@ -0,0 +1,26 @@ +export function initRange(domain, range) { + switch (arguments.length) { + case 0: break; + case 1: this.range(domain); break; + default: this.range(range).domain(domain); break; + } + return this; +} + +export function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: break; + case 1: { + if (typeof domain === "function") this.interpolator(domain); + else this.range(domain); + break; + } + default: { + this.domain(domain); + if (typeof interpolator === "function") this.interpolator(interpolator); + else this.range(interpolator); + break; + } + } + return this; +} diff --git a/node_modules/d3-scale/src/linear.js b/node_modules/d3-scale/src/linear.js new file mode 100644 index 00000000..3617d32a --- /dev/null +++ b/node_modules/d3-scale/src/linear.js @@ -0,0 +1,70 @@ +import {ticks, tickIncrement} from "d3-array"; +import continuous, {copy} from "./continuous.js"; +import {initRange} from "./init.js"; +import tickFormat from "./tickFormat.js"; + +export function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function(count) { + var d = domain(); + return ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function(count, specifier) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + }; + + scale.nice = function(count) { + if (count == null) count = 10; + + var d = domain(); + var i0 = 0; + var i1 = d.length - 1; + var start = d[i0]; + var stop = d[i1]; + var prestep; + var step; + var maxIter = 10; + + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + while (maxIter-- > 0) { + step = tickIncrement(start, stop, count); + if (step === prestep) { + d[i0] = start + d[i1] = stop + return domain(d); + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } else { + break; + } + prestep = step; + } + + return scale; + }; + + return scale; +} + +export default function linear() { + var scale = continuous(); + + scale.copy = function() { + return copy(scale, linear()); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); +} diff --git a/node_modules/d3-scale/src/log.js b/node_modules/d3-scale/src/log.js new file mode 100644 index 00000000..ad3f231e --- /dev/null +++ b/node_modules/d3-scale/src/log.js @@ -0,0 +1,146 @@ +import {ticks} from "d3-array"; +import {format} from "d3-format"; +import nice from "./nice.js"; +import {copy, transformer} from "./continuous.js"; +import {initRange} from "./init.js"; + +function transformLog(x) { + return Math.log(x); +} + +function transformExp(x) { + return Math.exp(x); +} + +function transformLogn(x) { + return -Math.log(-x); +} + +function transformExpn(x) { + return -Math.exp(-x); +} + +function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; +} + +function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function(x) { return Math.pow(base, x); }; +} + +function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function(x) { return Math.log(x) / base; }); +} + +function reflect(f) { + return function(x) { + return -f(-x); + }; +} + +export function loggish(transform) { + var scale = transform(transformLog, transformExp), + domain = scale.domain, + base = 10, + logs, + pows; + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) { + logs = reflect(logs), pows = reflect(pows); + transform(transformLogn, transformExpn); + } else { + transform(transformLog, transformExp); + } + return scale; + } + + scale.base = function(_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function(count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.floor(i), j = Math.ceil(j); + if (u > 0) for (; i <= j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i <= j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + if (z.length * 2 < n) z = ticks(u, v, n); + } else { + z = ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function(count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function(d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function() { + return domain(nice(domain(), { + floor: function(x) { return pows(Math.floor(logs(x))); }, + ceil: function(x) { return pows(Math.ceil(logs(x))); } + })); + }; + + return scale; +} + +export default function log() { + var scale = loggish(transformer()).domain([1, 10]); + + scale.copy = function() { + return copy(scale, log()).base(scale.base()); + }; + + initRange.apply(scale, arguments); + + return scale; +} diff --git a/node_modules/d3-scale/src/nice.js b/node_modules/d3-scale/src/nice.js new file mode 100644 index 00000000..a44e6015 --- /dev/null +++ b/node_modules/d3-scale/src/nice.js @@ -0,0 +1,18 @@ +export default function nice(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; +} diff --git a/node_modules/d3-scale/src/number.js b/node_modules/d3-scale/src/number.js new file mode 100644 index 00000000..d185907f --- /dev/null +++ b/node_modules/d3-scale/src/number.js @@ -0,0 +1,3 @@ +export default function number(x) { + return +x; +} diff --git a/node_modules/d3-scale/src/ordinal.js b/node_modules/d3-scale/src/ordinal.js new file mode 100644 index 00000000..e98f600a --- /dev/null +++ b/node_modules/d3-scale/src/ordinal.js @@ -0,0 +1,46 @@ +import {initRange} from "./init.js"; + +export const implicit = Symbol("implicit"); + +export default function ordinal() { + var index = new Map(), + domain = [], + range = [], + unknown = implicit; + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = [], index = new Map(); + for (const value of _) { + const key = value + ""; + if (index.has(key)) continue; + index.set(key, domain.push(value)); + } + return scale; + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), scale) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return ordinal(domain, range).unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return scale; +} diff --git a/node_modules/d3-scale/src/pow.js b/node_modules/d3-scale/src/pow.js new file mode 100644 index 00000000..8146f1c0 --- /dev/null +++ b/node_modules/d3-scale/src/pow.js @@ -0,0 +1,50 @@ +import {linearish} from "./linear.js"; +import {copy, identity, transformer} from "./continuous.js"; +import {initRange} from "./init.js"; + +function transformPow(exponent) { + return function(x) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + }; +} + +function transformSqrt(x) { + return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); +} + +function transformSquare(x) { + return x < 0 ? -x * x : x * x; +} + +export function powish(transform) { + var scale = transform(identity, identity), + exponent = 1; + + function rescale() { + return exponent === 1 ? transform(identity, identity) + : exponent === 0.5 ? transform(transformSqrt, transformSquare) + : transform(transformPow(exponent), transformPow(1 / exponent)); + } + + scale.exponent = function(_) { + return arguments.length ? (exponent = +_, rescale()) : exponent; + }; + + return linearish(scale); +} + +export default function pow() { + var scale = powish(transformer()); + + scale.copy = function() { + return copy(scale, pow()).exponent(scale.exponent()); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +export function sqrt() { + return pow.apply(null, arguments).exponent(0.5); +} diff --git a/node_modules/d3-scale/src/quantile.js b/node_modules/d3-scale/src/quantile.js new file mode 100644 index 00000000..b4e708c0 --- /dev/null +++ b/node_modules/d3-scale/src/quantile.js @@ -0,0 +1,57 @@ +import {ascending, bisect, quantileSorted as threshold} from "d3-array"; +import {initRange} from "./init.js"; + +export default function quantile() { + var domain = [], + range = [], + thresholds = [], + unknown; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = threshold(domain, i / n); + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : range[bisect(thresholds, x)]; + } + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending); + return rescale(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.quantiles = function() { + return thresholds.slice(); + }; + + scale.copy = function() { + return quantile() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} diff --git a/node_modules/d3-scale/src/quantize.js b/node_modules/d3-scale/src/quantize.js new file mode 100644 index 00000000..735a5314 --- /dev/null +++ b/node_modules/d3-scale/src/quantize.js @@ -0,0 +1,56 @@ +import {bisect} from "d3-array"; +import {linearish} from "./linear.js"; +import {initRange} from "./init.js"; + +export default function quantize() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1], + unknown; + + function scale(x) { + return x <= x ? range[bisect(domain, x, 0, n)] : unknown; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [x0, x1]; + }; + + scale.range = function(_) { + return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : scale; + }; + + scale.thresholds = function() { + return domain.slice(); + }; + + scale.copy = function() { + return quantize() + .domain([x0, x1]) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(linearish(scale), arguments); +} diff --git a/node_modules/d3-scale/src/radial.js b/node_modules/d3-scale/src/radial.js new file mode 100644 index 00000000..5c00cc6d --- /dev/null +++ b/node_modules/d3-scale/src/radial.js @@ -0,0 +1,63 @@ +import continuous from "./continuous.js"; +import {initRange} from "./init.js"; +import {linearish} from "./linear.js"; +import number from "./number.js"; + +function square(x) { + return Math.sign(x) * x * x; +} + +function unsquare(x) { + return Math.sign(x) * Math.sqrt(Math.abs(x)); +} + +export default function radial() { + var squared = continuous(), + range = [0, 1], + round = false, + unknown; + + function scale(x) { + var y = unsquare(squared(x)); + return isNaN(y) ? unknown : round ? Math.round(y) : y; + } + + scale.invert = function(y) { + return squared.invert(square(y)); + }; + + scale.domain = function(_) { + return arguments.length ? (squared.domain(_), scale) : squared.domain(); + }; + + scale.range = function(_) { + return arguments.length ? (squared.range((range = Array.from(_, number)).map(square)), scale) : range.slice(); + }; + + scale.rangeRound = function(_) { + return scale.range(_).round(true); + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, scale) : round; + }; + + scale.clamp = function(_) { + return arguments.length ? (squared.clamp(_), scale) : squared.clamp(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return radial(squared.domain(), range) + .round(round) + .clamp(squared.clamp()) + .unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); +} diff --git a/node_modules/d3-scale/src/sequential.js b/node_modules/d3-scale/src/sequential.js new file mode 100644 index 00000000..bd38dba4 --- /dev/null +++ b/node_modules/d3-scale/src/sequential.js @@ -0,0 +1,107 @@ +import {interpolate, interpolateRound} from "d3-interpolate"; +import {identity} from "./continuous.js"; +import {initInterpolator} from "./init.js"; +import {linearish} from "./linear.js"; +import {loggish} from "./log.js"; +import {symlogish} from "./symlog.js"; +import {powish} from "./pow.js"; + +function transformer() { + var x0 = 0, + x1 = 1, + t0, + t1, + k10, + transform, + interpolator = identity, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + function range(interpolate) { + return function(_) { + var r0, r1; + return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)]; + }; + } + + scale.range = range(interpolate); + + scale.rangeRound = range(interpolateRound); + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); + return scale; + }; +} + +export function copy(source, target) { + return target + .domain(source.domain()) + .interpolator(source.interpolator()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +export default function sequential() { + var scale = linearish(transformer()(identity)); + + scale.copy = function() { + return copy(scale, sequential()); + }; + + return initInterpolator.apply(scale, arguments); +} + +export function sequentialLog() { + var scale = loggish(transformer()).domain([1, 10]); + + scale.copy = function() { + return copy(scale, sequentialLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +export function sequentialSymlog() { + var scale = symlogish(transformer()); + + scale.copy = function() { + return copy(scale, sequentialSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +export function sequentialPow() { + var scale = powish(transformer()); + + scale.copy = function() { + return copy(scale, sequentialPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +export function sequentialSqrt() { + return sequentialPow.apply(null, arguments).exponent(0.5); +} diff --git a/node_modules/d3-scale/src/sequentialQuantile.js b/node_modules/d3-scale/src/sequentialQuantile.js new file mode 100644 index 00000000..132ebd05 --- /dev/null +++ b/node_modules/d3-scale/src/sequentialQuantile.js @@ -0,0 +1,38 @@ +import {ascending, bisect, quantile} from "d3-array"; +import {identity} from "./continuous.js"; +import {initInterpolator} from "./init.js"; + +export default function sequentialQuantile() { + var domain = [], + interpolator = identity; + + function scale(x) { + if (!isNaN(x = +x)) return interpolator((bisect(domain, x, 1) - 1) / (domain.length - 1)); + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending); + return scale; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.range = function() { + return domain.map((d, i) => interpolator(i / (domain.length - 1))); + }; + + scale.quantiles = function(n) { + return Array.from({length: n + 1}, (_, i) => quantile(domain, i / n)); + }; + + scale.copy = function() { + return sequentialQuantile(interpolator).domain(domain); + }; + + return initInterpolator.apply(scale, arguments); +} diff --git a/node_modules/d3-scale/src/symlog.js b/node_modules/d3-scale/src/symlog.js new file mode 100644 index 00000000..125fa7b5 --- /dev/null +++ b/node_modules/d3-scale/src/symlog.js @@ -0,0 +1,35 @@ +import {linearish} from "./linear.js"; +import {copy, transformer} from "./continuous.js"; +import {initRange} from "./init.js"; + +function transformSymlog(c) { + return function(x) { + return Math.sign(x) * Math.log1p(Math.abs(x / c)); + }; +} + +function transformSymexp(c) { + return function(x) { + return Math.sign(x) * Math.expm1(Math.abs(x)) * c; + }; +} + +export function symlogish(transform) { + var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); + + scale.constant = function(_) { + return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; + }; + + return linearish(scale); +} + +export default function symlog() { + var scale = symlogish(transformer()); + + scale.copy = function() { + return copy(scale, symlog()).constant(scale.constant()); + }; + + return initRange.apply(scale, arguments); +} diff --git a/node_modules/d3-scale/src/threshold.js b/node_modules/d3-scale/src/threshold.js new file mode 100644 index 00000000..79d3559d --- /dev/null +++ b/node_modules/d3-scale/src/threshold.js @@ -0,0 +1,39 @@ +import {bisect} from "d3-array"; +import {initRange} from "./init.js"; + +export default function threshold() { + var domain = [0.5], + range = [0, 1], + unknown, + n = 1; + + function scale(x) { + return x <= x ? range[bisect(domain, x, 0, n)] : unknown; + } + + scale.domain = function(_) { + return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return threshold() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} diff --git a/node_modules/d3-scale/src/tickFormat.js b/node_modules/d3-scale/src/tickFormat.js new file mode 100644 index 00000000..15fc54ef --- /dev/null +++ b/node_modules/d3-scale/src/tickFormat.js @@ -0,0 +1,29 @@ +import {tickStep} from "d3-array"; +import {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from "d3-format"; + +export default function tickFormat(start, stop, count, specifier) { + var step = tickStep(start, stop, count), + precision; + specifier = formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision; + return formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return format(specifier); +} diff --git a/node_modules/d3-scale/src/time.js b/node_modules/d3-scale/src/time.js new file mode 100644 index 00000000..3cbf81e0 --- /dev/null +++ b/node_modules/d3-scale/src/time.js @@ -0,0 +1,136 @@ +import {bisector, tickStep} from "d3-array"; +import {timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond} from "d3-time"; +import {timeFormat} from "d3-time-format"; +import continuous, {copy} from "./continuous.js"; +import {initRange} from "./init.js"; +import nice from "./nice.js"; + +var durationSecond = 1000, + durationMinute = durationSecond * 60, + durationHour = durationMinute * 60, + durationDay = durationHour * 24, + durationWeek = durationDay * 7, + durationMonth = durationDay * 30, + durationYear = durationDay * 365; + +function date(t) { + return new Date(t); +} + +function number(t) { + return t instanceof Date ? +t : +new Date(+t); +} + +export function calendar(year, month, week, day, hour, minute, second, millisecond, format) { + var scale = continuous(), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second, 1, durationSecond], + [second, 5, 5 * durationSecond], + [second, 15, 15 * durationSecond], + [second, 30, 30 * durationSecond], + [minute, 1, durationMinute], + [minute, 5, 5 * durationMinute], + [minute, 15, 15 * durationMinute], + [minute, 30, 30 * durationMinute], + [ hour, 1, durationHour ], + [ hour, 3, 3 * durationHour ], + [ hour, 6, 6 * durationHour ], + [ hour, 12, 12 * durationHour ], + [ day, 1, durationDay ], + [ day, 2, 2 * durationDay ], + [ week, 1, durationWeek ], + [ month, 1, durationMonth ], + [ month, 3, 3 * durationMonth ], + [ year, 1, durationYear ] + ]; + + function tickFormat(date) { + return (second(date) < date ? formatMillisecond + : minute(date) < date ? formatSecond + : hour(date) < date ? formatMinute + : day(date) < date ? formatHour + : month(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop) { + if (interval == null) interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = bisector(function(i) { return i[2]; }).right(tickIntervals, target), + step; + if (i === tickIntervals.length) { + step = tickStep(start / durationYear, stop / durationYear, interval); + interval = year; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = Math.max(tickStep(start, stop, interval), 1); + interval = millisecond; + } + return interval.every(step); + } + + return interval; + } + + scale.invert = function(y) { + return new Date(invert(y)); + }; + + scale.domain = function(_) { + return arguments.length ? domain(Array.from(_, number)) : domain().map(date); + }; + + scale.ticks = function(interval) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function(count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function(interval) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1])) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function() { + return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + }; + + return scale; +} + +export default function time() { + return initRange.apply(calendar(timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); +} diff --git a/node_modules/d3-scale/src/utcTime.js b/node_modules/d3-scale/src/utcTime.js new file mode 100644 index 00000000..4e7ed84c --- /dev/null +++ b/node_modules/d3-scale/src/utcTime.js @@ -0,0 +1,8 @@ +import {calendar} from "./time.js"; +import {utcFormat} from "d3-time-format"; +import {utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, utcSecond, utcMillisecond} from "d3-time"; +import {initRange} from "./init.js"; + +export default function utcTime() { + return initRange.apply(calendar(utcYear, utcMonth, utcWeek, utcDay, utcHour, utcMinute, utcSecond, utcMillisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); +} diff --git a/node_modules/d3-selection/LICENSE b/node_modules/d3-selection/LICENSE new file mode 100644 index 00000000..74945c0e --- /dev/null +++ b/node_modules/d3-selection/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2010-2018, Michael Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* The name Michael Bostock may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-selection/README.md b/node_modules/d3-selection/README.md new file mode 100644 index 00000000..95254fb4 --- /dev/null +++ b/node_modules/d3-selection/README.md @@ -0,0 +1,859 @@ +# d3-selection + +Selections allow powerful data-driven transformation of the document object model (DOM): set [attributes](#selection_attr), [styles](#selection_style), [properties](#selection_property), [HTML](#selection_html) or [text](#selection_text) content, and more. Using the [data join](#joining-data)’s [enter](#selection_enter) and [exit](#selection_enter) selections, you can also [add](#selection_append) or [remove](#selection_remove) elements to correspond to data. + +Selection methods typically return the current selection, or a new selection, allowing the concise application of multiple operations on a given selection via method chaining. For example, to set the class and color style of all paragraph elements in the current document: + +```js +d3.selectAll("p") + .attr("class", "graf") + .style("color", "red"); +``` + +This is equivalent to: + +```js +const p = d3.selectAll("p"); +p.attr("class", "graf"); +p.style("color", "red"); +``` + +By convention, selection methods that return the current selection use *four* spaces of indent, while methods that return a new selection use only *two*. This helps reveal changes of context by making them stick out of the chain: + +```js +d3.select("body") + .append("svg") + .attr("width", 960) + .attr("height", 500) + .append("g") + .attr("transform", "translate(20,20)") + .append("rect") + .attr("width", 920) + .attr("height", 460); +``` + +Selections are immutable. All selection methods that affect which elements are selected (or their order) return a new selection rather than modifying the current selection. However, note that elements are necessarily mutable, as selections drive transformations of the document! + +For more, see [the d3-selection collection on Observable](https://observablehq.com/collection/@d3/d3-selection). + +## Installing + +If you use NPM, `npm install d3-selection`. Otherwise, download the [latest release](https://github.com/d3/d3-selection/releases/latest). You can also load d3-selection as a standalone library or as part of [D3](https://github.com/d3/d3). ES modules, AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +[Try d3-selection in your browser.](https://observablehq.com/collection/@d3/d3-selection) + +## API Reference + +* [Selecting Elements](#selecting-elements) +* [Modifying Elements](#modifying-elements) +* [Joining Data](#joining-data) +* [Handling Events](#handling-events) +* [Control Flow](#control-flow) +* [Local Variables](#local-variables) +* [Namespaces](#namespaces) + +### Selecting Elements + +Selection methods accept [W3C selector strings](http://www.w3.org/TR/selectors-api/) such as `.fancy` to select elements with the class *fancy*, or `div` to select DIV elements. Selection methods come in two forms: select and selectAll: the former selects only the first matching element, while the latter selects all matching elements in document order. The top-level selection methods, [d3.select](#select) and [d3.selectAll](#selectAll), query the entire document; the subselection methods, [*selection*.select](#selection_select) and [*selection*.selectAll](#selection_selectAll), restrict selection to descendants of the selected elements. + +# d3.selection() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/index.js) + +[Selects](#select) the root element, `document.documentElement`. This function can also be used to test for selections (`instanceof d3.selection`) or to extend the selection prototype. For example, to add a method to check checkboxes: + +```js +d3.selection.prototype.checked = function(value) { + return arguments.length < 1 + ? this.property("checked") + : this.property("checked", !!value); +}; +``` + +And then to use: + +```js +d3.selectAll("input[type=checkbox]").checked(true); +``` + +# d3.select(selector) · [Source](https://github.com/d3/d3-selection/blob/master/src/select.js) + +Selects the first element that matches the specified *selector* string. If no elements match the *selector*, returns an empty selection. If multiple elements match the *selector*, only the first matching element (in document order) will be selected. For example, to select the first anchor element: + +```js +const anchor = d3.select("a"); +``` + +If the *selector* is not a string, instead selects the specified node; this is useful if you already have a reference to a node, such as `this` within an event listener or a global such as `document.body`. For example, to make a clicked paragraph red: + +```js +d3.selectAll("p").on("click", function(event) { + d3.select(this).style("color", "red"); +}); +``` + +# d3.selectAll(selector) · [Source](https://github.com/d3/d3-selection/blob/master/src/selectAll.js) + +Selects all elements that match the specified *selector* string. The elements will be selected in document order (top-to-bottom). If no elements in the document match the *selector*, or if the *selector* is null or undefined, returns an empty selection. For example, to select all paragraphs: + +```js +const paragraph = d3.selectAll("p"); +``` + +If the *selector* is not a string, instead selects the specified array of nodes; this is useful if you already have a reference to nodes, such as `this.childNodes` within an event listener or a global such as `document.links`. The nodes may instead be an iterable, or a pseudo-array such as a NodeList. For example, to color all links red: + +```js +d3.selectAll(document.links).style("color", "red"); +``` + +# selection.select(selector) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/select.js) + +For each selected element, selects the first descendant element that matches the specified *selector* string. If no element matches the specified selector for the current element, the element at the current index will be null in the returned selection. (If the *selector* is null, every element in the returned selection will be null, resulting in an empty selection.) If the current element has associated data, this data is propagated to the corresponding selected element. If multiple elements match the selector, only the first matching element in document order is selected. For example, to select the first bold element in every paragraph: + +```js +const b = d3.selectAll("p").select("b"); +``` + +If the *selector* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). It must return an element, or null if there is no matching element. For example, to select the previous sibling of each paragraph: + +```js +const previous = d3.selectAll("p").select(function() { + return this.previousElementSibling; +}); +``` + +Unlike [*selection*.selectAll](#selection_selectAll), *selection*.select does not affect grouping: it preserves the existing group structure and indexes, and propagates data (if any) to selected children. Grouping plays an important role in the [data join](#joining-data). See [Nested Selections](http://bost.ocks.org/mike/nest/) and [How Selections Work](http://bost.ocks.org/mike/selection/) for more on this topic. + +# selection.selectAll(selector) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/selectAll.js) + +For each selected element, selects the descendant elements that match the specified *selector* string. The elements in the returned selection are grouped by their corresponding parent node in this selection. If no element matches the specified selector for the current element, or if the *selector* is null, the group at the current index will be empty. The selected elements do not inherit data from this selection; use [*selection*.data](#selection_data) to propagate data to children. For example, to select the bold elements in every paragraph: + +```js +const b = d3.selectAll("p").selectAll("b"); +``` + +If the *selector* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). It must return an array of elements (or an iterable, or a pseudo-array such as a NodeList), or the empty array if there are no matching elements. For example, to select the previous and next siblings of each paragraph: + +```js +const sibling = d3.selectAll("p").selectAll(function() { + return [ + this.previousElementSibling, + this.nextElementSibling + ]; +}); +``` + +Unlike [*selection*.select](#selection_select), *selection*.selectAll does affect grouping: each selected descendant is grouped by the parent element in the originating selection. Grouping plays an important role in the [data join](#joining-data). See [Nested Selections](http://bost.ocks.org/mike/nest/) and [How Selections Work](http://bost.ocks.org/mike/selection/) for more on this topic. + +# selection.filter(filter) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/filter.js) + +Filters the selection, returning a new selection that contains only the elements for which the specified *filter* is true. The *filter* may be specified either as a selector string or a function. If the *filter* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). + +For example, to filter a selection of table rows to contain only even rows: + +```js +const even = d3.selectAll("tr").filter(":nth-child(even)"); +``` + +This is approximately equivalent to using [d3.selectAll](#selectAll) directly, although the indexes may be different: + +```js +const even = d3.selectAll("tr:nth-child(even)"); +``` + +Similarly, using a function: + +```js +const even = d3.selectAll("tr").filter((d, i) => i & 1); +``` + +Or using [*selection*.select](#selection_select) (and avoiding an arrow function, since *this* is needed to refer to the current element): + +```js +const even = d3.selectAll("tr").select(function(d, i) { return i & 1 ? this : null; }); +``` + +Note that the `:nth-child` pseudo-class is a one-based index rather than a zero-based index. Also, the above filter functions do not have precisely the same meaning as `:nth-child`; they rely on the selection index rather than the number of preceding sibling elements in the DOM. + +The returned filtered selection preserves the parents of this selection, but like [*array*.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter), it does not preserve indexes as some elements may be removed; use [*selection*.select](#selection_select) to preserve the index, if needed. + +# selection.merge(other) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/merge.js) + +Returns a new selection merging this selection with the specified *other* selection. The returned selection has the same number of groups and the same parents as this selection. Any missing (null) elements in this selection are filled with the corresponding element, if present (not null), from the specified *selection*. (If the *other* selection has additional groups or parents, they are ignored.) + +This method is used internally by [*selection*.join](#selection_join) to merge the [enter](#selection_enter) and [update](#selection_data) selections after [binding data](#joining-data). You can also merge explicitly, although note that since merging is based on element index, you should use operations that preserve index, such as [*selection*.select](#selection_select) instead of [*selection*.filter](#selection_filter). For example: + +```js +const odd = selection.select(function(d, i) { return i & 1 ? this : null; )); +const even = selection.select(function(d, i) { return i & 1 ? null : this; )); +const merged = odd.merge(even); +``` + +See [*selection*.data](#selection_data) for more. + +This method is not intended for concatenating arbitrary selections, however: if both this selection and the specified *other* selection have (non-null) elements at the same index, this selection’s element is returned in the merge and the *other* selection’s element is ignored. + +# selection.selectChild([selector]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/selectChild.js) + +Returns a new selection with the (first) child of each element of the current selection matching the *selector*. If no *selector* is specified, selects the first child (if any). If the *selector* is specified as a string, selects the first child that matches (if any). If the *selector* is a function, it is evaluated for each of the children nodes, in order, being passed the child (*child*), the child’s index (*i*), and the list of children (*children*); the method selects the first child for which the selector return truthy, if any. + +# selection.selectChildren([selector]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/selectChildren.js) + +Returns a new selection with the children of each element of the current selection matching the *selector*. If no *selector* is specified, selects all the children. If the *selector* is specified as a string, selects the children that match (if any). If the *selector* is a function, it is evaluated for each of the children nodes, in order, being passed the child (*child*), the child’s index (*i*), and the list of children (*children*); the method selects all children for which the selector return truthy. + +# selection.selection() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/index.js) + +Returns the selection (for symmetry with [transition.selection](https://github.com/d3/d3-transition/blob/master/README.md#transition_selection)). + +# d3.matcher(selector) · [Source](https://github.com/d3/d3-selection/blob/master/src/matcher.js) + +Given the specified *selector*, returns a function which returns true if `this` element [matches](https://developer.mozilla.org/en-US/docs/Web/API/Element/matches) the specified selector. This method is used internally by [*selection*.filter](#selection_filter). For example, this: + +```js +const div = selection.filter("div"); +``` + +Is equivalent to: + +```js +const div = selection.filter(d3.matcher("div")); +``` + +(Although D3 is not a compatibility layer, this implementation does support vendor-prefixed implementations due to the recent standardization of *element*.matches.) + +# d3.selector(selector) · [Source](https://github.com/d3/d3-selection/blob/master/src/selector.js) + +Given the specified *selector*, returns a function which returns the first descendant of `this` element that matches the specified selector. This method is used internally by [*selection*.select](#selection_select). For example, this: + +```js +const div = selection.select("div"); +``` + +Is equivalent to: + +```js +const div = selection.select(d3.selector("div")); +``` + +# d3.selectorAll(selector) · [Source](https://github.com/d3/d3-selection/blob/master/src/selectAll.js) + +Given the specified *selector*, returns a function which returns all descendants of `this` element that match the specified selector. This method is used internally by [*selection*.selectAll](#selection_selectAll). For example, this: + +```js +const div = selection.selectAll("div"); +``` + +Is equivalent to: + +```js +const div = selection.selectAll(d3.selectorAll("div")); +``` + +# d3.window(node) · [Source](https://github.com/d3/d3-selection/blob/master/src/window.js) + +Returns the owner window for the specified *node*. If *node* is a node, returns the owner document’s default view; if *node* is a document, returns its default view; otherwise returns the *node*. + +# d3.style(node, name) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/style.js) + +Returns the value of the style property with the specified *name* for the specified *node*. If the *node* has an inline style with the specified *name*, its value is returned; otherwise, the [computed property value](https://developer.mozilla.org/en-US/docs/Web/CSS/computed_value) is returned. See also [*selection*.style](#selection_style). + +### Modifying Elements + +After selecting elements, use the selection’s transformation methods to affect document content. For example, to set the name attribute and color style of an anchor element: + +```js +d3.select("a") + .attr("name", "fred") + .style("color", "red"); +``` + +To experiment with selections, visit [d3js.org](https://d3js.org) and open your browser’s developer console! (In Chrome, open the console with ⌥⌘J.) Select elements and then inspect the returned selection to see which elements are selected and how they are grouped. Call selection methods and see how the page content changes. + +# selection.attr(name[, value]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/attr.js) + +If a *value* is specified, sets the attribute with the specified *name* to the specified value on the selected elements and returns this selection. If the *value* is a constant, all elements are given the same attribute value; otherwise, if the *value* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). The function’s return value is then used to set each element’s attribute. A null value will remove the specified attribute. + +If a *value* is not specified, returns the current value of the specified attribute for the first (non-null) element in the selection. This is generally useful only if you know that the selection contains exactly one element. + +The specified *name* may have a namespace prefix, such as `xlink:href` to specify the `href` attribute in the XLink namespace. See [namespaces](#namespaces) for the map of supported namespaces; additional namespaces can be registered by adding to the map. + +# selection.classed(names[, value]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/classed.js) + +If a *value* is specified, assigns or unassigns the specified CSS class *names* on the selected elements by setting the `class` attribute or modifying the `classList` property and returns this selection. The specified *names* is a string of space-separated class names. For example, to assign the classes `foo` and `bar` to the selected elements: + +```js +selection.classed("foo bar", true); +``` + +If the *value* is truthy, then all elements are assigned the specified classes; otherwise, the classes are unassigned. If the *value* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). The function’s return value is then used to assign or unassign classes on each element. For example, to randomly associate the class *foo* with on average half the selected elements: + +```js +selection.classed("foo", () => Math.random() > 0.5); +``` + +If a *value* is not specified, returns true if and only if the first (non-null) selected element has the specified *classes*. This is generally useful only if you know the selection contains exactly one element. + +# selection.style(name[, value[, priority]]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/style.js) + +If a *value* is specified, sets the style property with the specified *name* to the specified value on the selected elements and returns this selection. If the *value* is a constant, then all elements are given the same style property value; otherwise, if the *value* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). The function’s return value is then used to set each element’s style property. A null value will remove the style property. An optional *priority* may also be specified, either as null or the string `important` (without the exclamation point). + +If a *value* is not specified, returns the current value of the specified style property for the first (non-null) element in the selection. The current value is defined as the element’s inline value, if present, and otherwise its [computed value](https://developer.mozilla.org/en-US/docs/Web/CSS/computed_value). Accessing the current style value is generally useful only if you know the selection contains exactly one element. + +Caution: unlike many SVG attributes, CSS styles typically have associated units. For example, `3px` is a valid stroke-width property value, while `3` is not. Some browsers implicitly assign the `px` (pixel) unit to numeric values, but not all browsers do: IE, for example, throws an “invalid arguments†error! + +# selection.property(name[, value]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/property.js) + +Some HTML elements have special properties that are not addressable using attributes or styles, such as a form field’s text `value` and a checkbox’s `checked` boolean. Use this method to get or set these properties. + +If a *value* is specified, sets the property with the specified *name* to the specified value on selected elements. If the *value* is a constant, then all elements are given the same property value; otherwise, if the *value* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). The function’s return value is then used to set each element’s property. A null value will delete the specified property. + +If a *value* is not specified, returns the value of the specified property for the first (non-null) element in the selection. This is generally useful only if you know the selection contains exactly one element. + +# selection.text([value]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/text.js) + +If a *value* is specified, sets the [text content](http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent) to the specified value on all selected elements, replacing any existing child elements. If the *value* is a constant, then all elements are given the same text content; otherwise, if the *value* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). The function’s return value is then used to set each element’s text content. A null value will clear the content. + +If a *value* is not specified, returns the text content for the first (non-null) element in the selection. This is generally useful only if you know the selection contains exactly one element. + +# selection.html([value]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/html.js) + +If a *value* is specified, sets the [inner HTML](http://dev.w3.org/html5/spec-LC/apis-in-html-documents.html#innerhtml) to the specified value on all selected elements, replacing any existing child elements. If the *value* is a constant, then all elements are given the same inner HTML; otherwise, if the *value* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). The function’s return value is then used to set each element’s inner HTML. A null value will clear the content. + +If a *value* is not specified, returns the inner HTML for the first (non-null) element in the selection. This is generally useful only if you know the selection contains exactly one element. + +Use [*selection*.append](#selection_append) or [*selection*.insert](#selection_insert) instead to create data-driven content; this method is intended for when you want a little bit of HTML, say for rich formatting. Also, *selection*.html is only supported on HTML elements. SVG elements and other non-HTML elements do not support the innerHTML property, and thus are incompatible with *selection*.html. Consider using [XMLSerializer](https://developer.mozilla.org/en-US/docs/XMLSerializer) to convert a DOM subtree to text. See also the [innersvg polyfill](https://code.google.com/p/innersvg/), which provides a shim to support the innerHTML property on SVG elements. + +# selection.append(type) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/append.js) + +If the specified *type* is a string, appends a new element of this type (tag name) as the last child of each selected element, or before the next following sibling in the update selection if this is an [enter selection](#selection_enter). The latter behavior for enter selections allows you to insert elements into the DOM in an order consistent with the new bound data; however, note that [*selection*.order](#selection_order) may still be required if updating elements change order (*i.e.*, if the order of new data is inconsistent with old data). + +If the specified *type* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). This function should return an element to be appended. (The function typically creates a new element, but it may instead return an existing element.) For example, to append a paragraph to each DIV element: + +```js +d3.selectAll("div").append("p"); +``` + +This is equivalent to: + +```js +d3.selectAll("div").append(() => document.createElement("p")); +``` + +Which is equivalent to: + +```js +d3.selectAll("div").select(function() { + return this.appendChild(document.createElement("p")); +}); +``` + +In both cases, this method returns a new selection containing the appended elements. Each new element inherits the data of the current elements, if any, in the same manner as [*selection*.select](#selection_select). + +The specified *name* may have a namespace prefix, such as `svg:text` to specify a `text` attribute in the SVG namespace. See [namespaces](#namespaces) for the map of supported namespaces; additional namespaces can be registered by adding to the map. If no namespace is specified, the namespace will be inherited from the parent element; or, if the name is one of the known prefixes, the corresponding namespace will be used (for example, `svg` implies `svg:svg`). + +# selection.insert(type[, before]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/insert.js) + +If the specified *type* is a string, inserts a new element of this type (tag name) before the first element matching the specified *before* selector for each selected element. For example, a *before* selector `:first-child` will prepend nodes before the first child. If *before* is not specified, it defaults to null. (To append elements in an order consistent with [bound data](#joining-data), use [*selection*.append](#selection_append).) + +Both *type* and *before* may instead be specified as functions which are evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). The *type* function should return an element to be inserted; the *before* function should return the child element before which the element should be inserted. For example, to append a paragraph to each DIV element: + +```js +d3.selectAll("div").insert("p"); +``` + +This is equivalent to: + +```js +d3.selectAll("div").insert(() => document.createElement("p")); +``` + +Which is equivalent to: + +```js +d3.selectAll("div").select(function() { + return this.insertBefore(document.createElement("p"), null); +}); +``` + +In both cases, this method returns a new selection containing the appended elements. Each new element inherits the data of the current elements, if any, in the same manner as [*selection*.select](#selection_select). + +The specified *name* may have a namespace prefix, such as `svg:text` to specify a `text` attribute in the SVG namespace. See [namespaces](#namespaces) for the map of supported namespaces; additional namespaces can be registered by adding to the map. If no namespace is specified, the namespace will be inherited from the parent element; or, if the name is one of the known prefixes, the corresponding namespace will be used (for example, `svg` implies `svg:svg`). + +# selection.remove() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/remove.js) + +Removes the selected elements from the document. Returns this selection (the removed elements) which are now detached from the DOM. There is not currently a dedicated API to add removed elements back to the document; however, you can pass a function to [*selection*.append](#selection_append) or [*selection*.insert](#selection_insert) to re-add elements. + +# selection.clone([deep]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/clone.js) + +Inserts clones of the selected elements immediately following the selected elements and returns a selection of the newly added clones. If *deep* is truthy, the descendant nodes of the selected elements will be cloned as well. Otherwise, only the elements themselves will be cloned. Equivalent to: + +```js +selection.select(function() { + return this.parentNode.insertBefore(this.cloneNode(deep), this.nextSibling); +}); +``` + +# selection.sort(compare) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/sort.js) + +Returns a new selection that contains a copy of each group in this selection sorted according to the *compare* function. After sorting, re-inserts elements to match the resulting order (per [*selection*.order](#selection_order)). + +The compare function, which defaults to [ascending](https://github.com/d3/d3-array#ascending), is passed two elements’ data *a* and *b* to compare. It should return either a negative, positive, or zero value. If negative, then *a* should be before *b*; if positive, then *a* should be after *b*; otherwise, *a* and *b* are considered equal and the order is arbitrary. + +Note that sorting is not guaranteed to be stable; however, it is guaranteed to have the same behavior as your browser’s built-in [sort](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort) method on arrays. + +# selection.order() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/order.js) + +Re-inserts elements into the document such that the document order of each group matches the selection order. This is equivalent to calling [*selection*.sort](#selection_sort) if the data is already sorted, but much faster. + +# selection.raise() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/raise.js) + +Re-inserts each selected element, in order, as the last child of its parent. Equivalent to: + +```js +selection.each(function() { + this.parentNode.appendChild(this); +}); +``` + +# selection.lower() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/lower.js) + +Re-inserts each selected element, in order, as the first child of its parent. Equivalent to: + +```js +selection.each(function() { + this.parentNode.insertBefore(this, this.parentNode.firstChild); +}); +``` + +# d3.create(name) · [Source](https://github.com/d3/d3-selection/blob/master/src/create.js) + +Given the specified element *name*, returns a single-element selection containing a detached element of the given name in the current document. This method assumes the HTML namespace, so you must specify a namespace explicitly when creating SVG or other non-HTML elements; see [namespace](#namespace) for details on supported namespace prefixes. + +```js +d3.create("svg") // equivalent to svg:svg +d3.create("svg:svg") // more explicitly +d3.create("svg:g") // an SVG G element +d3.create("g") // an HTML G (unknown) element +``` + +# d3.creator(name) · [Source](https://github.com/d3/d3-selection/blob/master/src/creator.js) + +Given the specified element *name*, returns a function which creates an element of the given name, assuming that `this` is the parent element. This method is used internally by [*selection*.append](#selection_append) and [*selection*.insert](#selection_insert) to create new elements. For example, this: + +```js +selection.append("div"); +``` + +Is equivalent to: + +```js +selection.append(d3.creator("div")); +``` + +See [namespace](#namespace) for details on supported namespace prefixes, such as for SVG elements. + +### Joining Data + +For an introduction to D3’s data joins, see the [*selection*.join notebook](https://observablehq.com/@d3/selection-join). Also see [Thinking With Joins](http://bost.ocks.org/mike/join/). + +# selection.data([data[, key]]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/data.js) + +Binds the specified array of *data* with the selected elements, returning a new selection that represents the *update* selection: the elements successfully bound to data. Also defines the [enter](#selection_enter) and [exit](#selection_exit) selections on the returned selection, which can be used to add or remove elements to correspond to the new data. The specified *data* is an array of arbitrary values (*e.g.*, numbers or objects), or a function that returns an array of values for each group. When data is assigned to an element, it is stored in the property `__data__`, thus making the data “sticky†and available on re-selection. + +The *data* is specified **for each group** in the selection. If the selection has multiple groups (such as [d3.selectAll](#selectAll) followed by [*selection*.selectAll](#selection_selectAll)), then *data* should typically be specified as a function. This function will be evaluated for each group in order, being passed the group’s parent datum (*d*, which may be undefined), the group index (*i*), and the selection’s parent nodes (*nodes*), with *this* as the group’s parent element. + +In conjunction with [*selection*.join](#selection_join) (or more explicitly with [*selection*.enter](#selection_enter), [*selection*.exit](#selection_exit), [*selection*.append](#selection_append) and [*selection*.remove](#selection_remove)), *selection*.data can be used to enter, update and exit elements to match data. For example, to create an HTML table from a matrix of numbers: + +```js +const matrix = [ + [11975, 5871, 8916, 2868], + [ 1951, 10048, 2060, 6171], + [ 8010, 16145, 8090, 8045], + [ 1013, 990, 940, 6907] +]; + +d3.select("body") + .append("table") + .selectAll("tr") + .data(matrix) + .join("tr") + .selectAll("td") + .data(d => d) + .join("td") + .text(d => d); +``` + +In this example the *data* function is the identity function: for each table row, it returns the corresponding row from the data matrix. + +If a *key* function is not specified, then the first datum in *data* is assigned to the first selected element, the second datum to the second selected element, and so on. A *key* function may be specified to control which datum is assigned to which element, replacing the default join-by-index, by computing a string identifier for each datum and element. This key function is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]); the returned string is the element’s key. The key function is then also evaluated for each new datum in *data*, being passed the current datum (*d*), the current index (*i*), and the group’s new *data*, with *this* as the group’s parent DOM element; the returned string is the datum’s key. The datum for a given key is assigned to the element with the matching key. If multiple elements have the same key, the duplicate elements are put into the exit selection; if multiple data have the same key, the duplicate data are put into the enter selection. + +For example, given this document: + +```html +

+
+
+
+
+
+``` + +You could join data by key as follows: + + +```js +const data = [ + {name: "Locke", number: 4}, + {name: "Reyes", number: 8}, + {name: "Ford", number: 15}, + {name: "Jarrah", number: 16}, + {name: "Shephard", number: 23}, + {name: "Kwon", number: 42} +]; + +d3.selectAll("div") + .data(data, function(d) { return d ? d.name : this.id; }) + .text(d => d.number); +``` + +This example key function uses the datum *d* if present, and otherwise falls back to the element’s id property. Since these elements were not previously bound to data, the datum *d* is null when the key function is evaluated on selected elements, and non-null when the key function is evaluated on the new data. + +The *update* and *enter* selections are returned in data order, while the *exit* selection preserves the selection order prior to the join. If a key function is specified, the order of elements in the selection may not match their order in the document; use [*selection*.order](#selection_order) or [*selection*.sort](#selection_sort) as needed. For more on how the key function affects the join, see [A Bar Chart, Part 2](http://bost.ocks.org/mike/bar/2/) and [Object Constancy](http://bost.ocks.org/mike/constancy/). + +If *data* is not specified, this method returns the array of data for the selected elements. + +This method cannot be used to clear bound data; use [*selection*.datum](#selection_datum) instead. + +# selection.join(enter[, update][, exit]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/join.js) + +Appends, removes and reorders elements as necessary to match the data that was previously bound by [*selection*.data](#selection_data), returning the [merged](#selection_merge) enter and update selection. This method is a convenient alternative to the explicit [general update pattern](https://bl.ocks.org/mbostock/3808218), replacing [*selection*.enter](#selection_enter), [*selection*.exit](#selection_exit), [*selection*.append](#selection_append), [*selection*.remove](#selection_remove), and [*selection*.order](#selection_order). For example: + +```js +svg.selectAll("circle") + .data(data) + .join("circle") + .attr("fill", "none") + .attr("stroke", "black"); +``` + +The *enter* function may be specified as a string shorthand, as above, which is equivalent to [*selection*.append](#selection_append) with the given element name. Likewise, optional *update* and *exit* functions may be specified, which default to the identity function and calling [*selection*.remove](#selection_remove), respectively. The shorthand above is thus equivalent to: + +```js +svg.selectAll("circle") + .data(data) + .join( + enter => enter.append("circle"), + update => update, + exit => exit.remove() + ) + .attr("fill", "none") + .attr("stroke", "black"); +```` + +By passing separate functions on enter, update and exit, you have greater control over what happens. And by specifying a key function to [*selection*.data](#selection_data), you can minimize changes to the DOM to optimize performance. For example, to set different fill colors for enter and update: + +```js +svg.selectAll("circle") + .data(data) + .join( + enter => enter.append("circle").attr("fill", "green"), + update => update.attr("fill", "blue") + ) + .attr("stroke", "black"); +``` + +The selections returned by the *enter* and *update* functions are merged and then returned by *selection*.join. + +You also animate enter, update and exit by creating transitions inside the *enter*, *update* and *exit* functions. To avoid breaking the method chain, use *selection*.call to create transitions, or return an undefined enter or update selection to prevent merging: the return value of the *enter* and *update* functions specifies the two selections to merge and return by *selection*.join. + +For more, see the [*selection*.join notebook](https://observablehq.com/@d3/selection-join). + +# selection.enter() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/enter.js) + +Returns the enter selection: placeholder nodes for each datum that had no corresponding DOM element in the selection. (The enter selection is empty for selections not returned by [*selection*.data](#selection_data).) + +The enter selection is typically used to create “missing†elements corresponding to new data. For example, to create DIV elements from an array of numbers: + +```js +const div = d3.select("body") + .selectAll("div") + .data([4, 8, 15, 16, 23, 42]) + .enter().append("div") + .text(d => d); +``` + +If the body is initially empty, the above code will create six new DIV elements, append them to the body in-order, and assign their text content as the associated (string-coerced) number: + +```html +
4
+
8
+
15
+
16
+
23
+
42
+``` + +Conceptually, the enter selection’s placeholders are pointers to the parent element (in this example, the document body). The enter selection is typically only used transiently to append elements, and is often [merged](#selection_merge) with the update selection after appending, such that modifications can be applied to both entering and updating elements. + +# selection.exit() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/exit.js) + +Returns the exit selection: existing DOM elements in the selection for which no new datum was found. (The exit selection is empty for selections not returned by [*selection*.data](#selection_data).) + +The exit selection is typically used to remove “superfluous†elements corresponding to old data. For example, to update the DIV elements created previously with a new array of numbers: + +```js +div = div.data([1, 2, 4, 8, 16, 32], d => d); +``` + +Since a key function was specified (as the identity function), and the new data contains the numbers [4, 8, 16] which match existing elements in the document, the update selection contains three DIV elements. Leaving those elements as-is, we can append new elements for [1, 2, 32] using the enter selection: + +```js +div.enter().append("div").text(d => d); +``` + +Likewise, to remove the exiting elements [15, 23, 42]: + +```js +div.exit().remove(); +``` + +Now the document body looks like this: + +```html +
1
+
2
+
4
+
8
+
16
+
32
+``` + +The order of the DOM elements matches the order of the data because the old data’s order and the new data’s order were consistent. If the new data’s order is different, use [*selection*.order](#selection_order) to reorder the elements in the DOM. See the [General Update Pattern](http://bl.ocks.org/mbostock/3808218) example thread for more on data joins. + +# selection.datum([value]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/datum.js) + +Gets or sets the bound data for each selected element. Unlike [*selection*.data](#selection_data), this method does not compute a join and does not affect indexes or the enter and exit selections. + +If a *value* is specified, sets the element’s bound data to the specified value on all selected elements. If the *value* is a constant, all elements are given the same datum; otherwise, if the *value* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). The function is then used to set each element’s new data. A null value will delete the bound data. + +If a *value* is not specified, returns the bound datum for the first (non-null) element in the selection. This is generally useful only if you know the selection contains exactly one element. + +This method is useful for accessing HTML5 [custom data attributes](http://www.w3.org/TR/html5/dom.html#custom-data-attribute). For example, given the following elements: + +```html +
    +
  • Shawn Allen
  • +
  • Mike Bostock
  • +
+``` + +You can expose the custom data attributes by setting each element’s data as the built-in [dataset](http://www.w3.org/TR/html5/dom.html#dom-dataset) property: + +```js +selection.datum(function() { return this.dataset; }) +``` + +### Handling Events + +For interaction, selections allow listening for and dispatching of events. + +# selection.on(typenames[, listener[, options]]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/on.js) + +Adds or removes a *listener* to each selected element for the specified event *typenames*. The *typenames* is a string event type, such as `click`, `mouseover`, or `submit`; any [DOM event type](https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events) supported by your browser may be used. The type may be optionally followed by a period (`.`) and a name; the optional name allows multiple callbacks to be registered to receive events of the same type, such as `click.foo` and `click.bar`. To specify multiple typenames, separate typenames with spaces, such as `input change` or `click.foo click.bar`. + +When a specified event is dispatched on a selected element, the specified *listener* will be evaluated for the element, being passed the current event (*event*) and the current datum (*d*), with *this* as the current DOM element (*event*.currentTarget). Listeners always see the latest datum for their element. Note: while you can use [*event*.pageX](https://developer.mozilla.org/en/DOM/event.pageX) and [*event*.pageY](https://developer.mozilla.org/en/DOM/event.pageY) directly, it is often convenient to transform the event position to the local coordinate system of the element that received the event using [d3.pointer](#pointer). + +If an event listener was previously registered for the same *typename* on a selected element, the old listener is removed before the new listener is added. To remove a listener, pass null as the *listener*. To remove all listeners for a given name, pass null as the *listener* and `.foo` as the *typename*, where `foo` is the name; to remove all listeners with no name, specify `.` as the *typename*. + +An optional *options* object may specify characteristics about the event listener, such as whether it is capturing or passive; see [*element*.addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener). + +If a *listener* is not specified, returns the currently-assigned listener for the specified event *typename* on the first (non-null) selected element, if any. If multiple typenames are specified, the first matching listener is returned. + +# selection.dispatch(type[, parameters]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/dispatch.js) + +Dispatches a [custom event](http://www.w3.org/TR/dom/#interface-customevent) of the specified *type* to each selected element, in order. An optional *parameters* map may be specified to set additional properties of the event. It may contain the following fields: + +* [`bubbles`](https://www.w3.org/TR/dom/#dom-event-bubbles) - if true, the event is dispatched to ancestors in reverse tree order. +* [`cancelable`](https://www.w3.org/TR/dom/#dom-event-cancelable) - if true, *event*.preventDefault is allowed. +* [`detail`](https://www.w3.org/TR/dom/#dom-customevent-detail) - any custom data associated with the event. + +If *parameters* is a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). It must return the parameters map for the current element. + +# d3.pointer(event[, target]) · [Source](https://github.com/d3/d3-selection/blob/master/src/pointer.js) + +Returns a two-element array of numbers [*x*, *y*] representing the coordinates of the specified *event* relative to the specified *target*. *event* can be a [UIEvent](https://developer.mozilla.org/en-US/docs/Web/API/UIEvent) (MouseEvent or TouchEvent), a [PointerEvent](https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent), a custom event holding a UIEvent as *event*.sourceEvent, or a [touch](https://www.w3.org/TR/touch-events/#touch-interface). + +If *target* is not specified, it defaults to the source event’s currentTarget property, if available. + +If the *target* is an SVG element, the event’s coordinates are transformed using the [inverse](https://www.w3.org/TR/geometry-1/#dom-dommatrixreadonly-inverse) of the [screen coordinate transformation matrix](https://www.w3.org/TR/SVG/types.html#__svg__SVGGraphicsElement__getScreenCTM). + +If the *target* is an HTML element, the event’s coordinates are translated relative to the top-left corner of the *target*’s [bounding client rectangle](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). (As such, the coordinate system can only be translated relative to the client coordinates. See also [GeometryUtils](https://www.w3.org/TR/cssom-view-1/#the-geometryutils-interface).) + +Otherwise, [*event*.pageX, *event*.pageY] is returned. + +In the case of touch events, the coordinates of the first touch are returned. To handle multitouch interactions, see [pointers](#pointers) instead. + +# d3.pointers(event[, target]) · [Source](https://github.com/d3/d3-selection/blob/master/src/pointers.js) + +Returns an array [[*x0*, *y0*], [*x1*, *y1*]…] of coordinates of the specified *event*’s pointer locations relative to the specified *target*. For mouse, stylus or single touch events, [*x0*, *y0*] is equivalent to d3.pointer(event, target). In the case of multi-touch events, the returned array contains a pair of coordinates for each of the touches. + +If *target* is not specified, it defaults to the source event’s currentTarget property, if available. + +### Control Flow + +For advanced usage, selections provide methods for custom control flow. + +# selection.each(function) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/each.js) + +Invokes the specified *function* for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element (*nodes*[*i*]). This method can be used to invoke arbitrary code for each selected element, and is useful for creating a context to access parent and child data simultaneously, such as: + +```js +parent.each(function(p, j) { + d3.select(this) + .selectAll(".child") + .text(d => `child ${d.name} of ${p.name}`); +}); +``` + +See [Sized Donut Multiples](http://bl.ocks.org/mbostock/4c5fad723c87d2fd8273) for an example. + +# selection.call(function[, arguments…]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/call.js) + +Invokes the specified *function* exactly once, passing in this selection along with any optional *arguments*. Returns this selection. This is equivalent to invoking the function by hand but facilitates method chaining. For example, to set several styles in a reusable function: + +```js +function name(selection, first, last) { + selection + .attr("first-name", first) + .attr("last-name", last); +} +``` + +Now say: + +```js +d3.selectAll("div").call(name, "John", "Snow"); +``` + +This is roughly equivalent to: + +```js +name(d3.selectAll("div"), "John", "Snow"); +``` + +The only difference is that *selection*.call always returns the *selection* and not the return value of the called *function*, `name`. + +# selection.empty() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/empty.js) + +Returns true if this selection contains no (non-null) elements. + +# selection.nodes() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/nodes.js) + +Returns an array of all (non-null) elements in this selection. Equivalent to: + +```js +const elements = Array.from(selection); +```` + +See also [*selection*[Symbol.iterator]](#selection_iterator). + +# selection.node() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/node.js) + +Returns the first (non-null) element in this selection. If the selection is empty, returns null. + +# selection.size() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/size.js) + +Returns the total number of (non-null) elements in this selection. + +# selection[Symbol.iterator]() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/iterator.js) + +Returns an iterator over the selected (non-null) elements. For example, to iterate over the selected elements: + +```js +for (const element of selection) { + console.log(element); +} +``` + +To flatten the selection to an array: + +```js +const elements = [...selection]; +```` + +### Local Variables + +D3 locals allow you to define local state independent of data. For instance, when rendering [small multiples](http://bl.ocks.org/mbostock/e1192fe405703d8321a5187350910e08) of time-series data, you might want the same *x*-scale for all charts but distinct *y*-scales to compare the relative performance of each metric. D3 locals are scoped by DOM elements: on set, the value is stored on the given element; on get, the value is retrieved from given element or the nearest ancestor that defines it. + +# d3.local() · [Source](https://github.com/d3/d3-selection/blob/master/src/local.js) + +Declares a new local variable. For example: + +```js +const foo = d3.local(); +``` + +Like `var`, each local is a distinct symbolic reference; unlike `var`, the value of each local is also scoped by the DOM. + +# local.set(node, value) · [Source](https://github.com/d3/d3-selection/blob/master/src/local.js) + +Sets the value of this local on the specified *node* to the *value*, and returns the specified *value*. This is often performed using [*selection*.each](#selection_each): + +```js +selection.each(function(d) { foo.set(this, d.value); }); +``` + +If you are just setting a single variable, consider using [*selection*.property](#selection_property): + +```js +selection.property(foo, d => d.value); +``` + +# local.get(node) · [Source](https://github.com/d3/d3-selection/blob/master/src/local.js) + +Returns the value of this local on the specified *node*. If the *node* does not define this local, returns the value from the nearest ancestor that defines it. Returns undefined if no ancestor defines this local. + +# local.remove(node) · [Source](https://github.com/d3/d3-selection/blob/master/src/local.js) + +Deletes this local’s value from the specified *node*. Returns true if the *node* defined this local prior to removal, and false otherwise. If ancestors also define this local, those definitions are unaffected, and thus [*local*.get](#local_get) will still return the inherited value. + +# local.toString() · [Source](https://github.com/d3/d3-selection/blob/master/src/local.js) + +Returns the automatically-generated identifier for this local. This is the name of the property that is used to store the local’s value on elements, and thus you can also set or get the local’s value using *element*[*local*] or by using [*selection*.property](#selection_property). + +### Namespaces + +XML namespaces are fun! Right? Fortunately you can mostly ignore them. + +# d3.namespace(name) · [Source](https://github.com/d3/d3-selection/blob/master/src/namespace.js) + +Qualifies the specified *name*, which may or may not have a namespace prefix. If the name contains a colon (`:`), the substring before the colon is interpreted as the namespace prefix, which must be registered in [d3.namespaces](#namespaces). Returns an object `space` and `local` attributes describing the full namespace URL and the local name. For example: + +```js +d3.namespace("svg:text"); // {space: "http://www.w3.org/2000/svg", local: "text"} +``` + +If the name does not contain a colon, this function merely returns the input name. + +# d3.namespaces · [Source](https://github.com/d3/d3-selection/blob/master/src/namespaces.js) + +The map of registered namespace prefixes. The initial value is: + +```js +{ + svg: "http://www.w3.org/2000/svg", + xhtml: "http://www.w3.org/1999/xhtml", + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +} +``` + +Additional prefixes may be assigned as needed to create elements or attributes in other namespaces. diff --git a/node_modules/d3-selection/dist/d3-selection.js b/node_modules/d3-selection/dist/d3-selection.js new file mode 100644 index 00000000..582cfaba --- /dev/null +++ b/node_modules/d3-selection/dist/d3-selection.js @@ -0,0 +1,999 @@ +// https://d3js.org/d3-selection/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +var xhtml = "http://www.w3.org/1999/xhtml"; + +var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +}; + +function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins +} + +function creatorInherit(name) { + return function() { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; +} + +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; +} + +function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); +} + +function none() {} + +function selector(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; +} + +function selection_select(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); +} + +function array(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} + +function empty() { + return []; +} + +function selectorAll(selector) { + return selector == null ? empty : function() { + return this.querySelectorAll(selector); + }; +} + +function arrayAll(select) { + return function() { + var group = select.apply(this, arguments); + return group == null ? [] : array(group); + }; +} + +function selection_selectAll(select) { + if (typeof select === "function") select = arrayAll(select); + else select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); +} + +function matcher(selector) { + return function() { + return this.matches(selector); + }; +} + +function childMatcher(selector) { + return function(node) { + return node.matches(selector); + }; +} + +var find = Array.prototype.find; + +function childFind(match) { + return function() { + return find.call(this.children, match); + }; +} + +function childFirst() { + return this.firstElementChild; +} + +function selection_selectChild(match) { + return this.select(match == null ? childFirst + : childFind(typeof match === "function" ? match : childMatcher(match))); +} + +var filter = Array.prototype.filter; + +function children() { + return this.children; +} + +function childrenFilter(match) { + return function() { + return filter.call(this.children, match); + }; +} + +function selection_selectChildren(match) { + return this.selectAll(match == null ? children + : childrenFilter(typeof match === "function" ? match : childMatcher(match))); +} + +function selection_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); +} + +function sparse(update) { + return new Array(update.length); +} + +function selection_enter() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); +} + +function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; +} + +EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, + insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, + querySelector: function(selector) { return this._parent.querySelector(selector); }, + querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } +}; + +function constant(x) { + return function() { + return x; + }; +} + +function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } +} + +function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = new Map, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = key.call(parent, data[i], i, data) + ""; + if (node = nodeByKeyValue.get(keyValue)) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue.delete(keyValue); + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) { + exit[i] = node; + } + } +} + +function datum(node) { + return node.__data__; +} + +function selection_data(value, key) { + if (!arguments.length) return Array.from(this, datum); + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = array(value.call(parent, parent && parent.__data__, j, parents)), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; +} + +function selection_exit() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); +} + +function selection_join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; +} + +function selection_merge(selection) { + if (!(selection instanceof Selection)) throw new Error("invalid merge"); + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); +} + +function selection_order() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; +} + +function selection_sort(compare) { + if (!compare) compare = ascending; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); +} + +function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +function selection_call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; +} + +function selection_nodes() { + return Array.from(this); +} + +function selection_node() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; +} + +function selection_size() { + let size = 0; + for (const node of this) ++size; // eslint-disable-line no-unused-vars + return size; +} + +function selection_empty() { + return !this.node(); +} + +function selection_each(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; +} + +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; +} + +function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} + +function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; +} + +function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; +} + +function selection_attr(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); +} + +function defaultView(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document +} + +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} + +function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; +} + +function selection_style(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); +} + +function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); +} + +function propertyRemove(name) { + return function() { + delete this[name]; + }; +} + +function propertyConstant(name, value) { + return function() { + this[name] = value; + }; +} + +function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; +} + +function selection_property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; +} + +function classArray(string) { + return string.trim().split(/^|\s+/); +} + +function classList(node) { + return node.classList || new ClassList(node); +} + +function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); +} + +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; + +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); +} + +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); +} + +function classedTrue(names) { + return function() { + classedAdd(this, names); + }; +} + +function classedFalse(names) { + return function() { + classedRemove(this, names); + }; +} + +function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; +} + +function selection_classed(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); +} + +function textRemove() { + this.textContent = ""; +} + +function textConstant(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; +} + +function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; +} + +function htmlRemove() { + this.innerHTML = ""; +} + +function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; +} + +function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; +} + +function selection_html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; +} + +function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); +} + +function selection_raise() { + return this.each(raise); +} + +function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); +} + +function selection_lower() { + return this.each(lower); +} + +function selection_append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function() { + return this.appendChild(create.apply(this, arguments)); + }); +} + +function constantNull() { + return null; +} + +function selection_insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function() { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); +} + +function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); +} + +function selection_remove() { + return this.each(remove); +} + +function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +function selection_clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} + +function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; +} + +function contextListener(listener) { + return function(event) { + listener.call(this, event, this.__data__); + }; +} + +function parseTypenames(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); +} + +function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; +} + +function onAdd(typename, value, options) { + return function() { + var on = this.__on, o, listener = contextListener(value); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + this.addEventListener(o.type, o.listener = listener, o.options = options); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, options); + o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options}; + if (!on) this.__on = [o]; + else on.push(o); + }; +} + +function selection_on(typename, value, options) { + var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); + return this; +} + +function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); +} + +function dispatchConstant(type, params) { + return function() { + return dispatchEvent(this, type, params); + }; +} + +function dispatchFunction(type, params) { + return function() { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; +} + +function selection_dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); +} + +function* selection_iterator() { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) yield node; + } + } +} + +var root = [null]; + +function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; +} + +function selection() { + return new Selection([[document.documentElement]], root); +} + +function selection_selection() { + return this; +} + +Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + selectChild: selection_selectChild, + selectChildren: selection_selectChildren, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + selection: selection_selection, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch, + [Symbol.iterator]: selection_iterator +}; + +function select(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); +} + +function create(name) { + return select(creator(name).call(document.documentElement)); +} + +var nextId = 0; + +function local() { + return new Local; +} + +function Local() { + this._ = "@" + (++nextId).toString(36); +} + +Local.prototype = local.prototype = { + constructor: Local, + get: function(node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function(node, value) { + return node[this._] = value; + }, + remove: function(node) { + return this._ in node && delete node[this._]; + }, + toString: function() { + return this._; + } +}; + +function sourceEvent(event) { + let sourceEvent; + while (sourceEvent = event.sourceEvent) event = sourceEvent; + return event; +} + +function pointer(event, node) { + event = sourceEvent(event); + if (node === undefined) node = event.currentTarget; + if (node) { + var svg = node.ownerSVGElement || node; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + if (node.getBoundingClientRect) { + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + } + return [event.pageX, event.pageY]; +} + +function pointers(events, node) { + if (events.target) { // i.e., instanceof Event, not TouchList or iterable + events = sourceEvent(events); + if (node === undefined) node = events.currentTarget; + events = events.touches || [events]; + } + return Array.from(events, event => pointer(event, node)); +} + +function selectAll(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : array(selector)], root); +} + +exports.create = create; +exports.creator = creator; +exports.local = local; +exports.matcher = matcher; +exports.namespace = namespace; +exports.namespaces = namespaces; +exports.pointer = pointer; +exports.pointers = pointers; +exports.select = select; +exports.selectAll = selectAll; +exports.selection = selection; +exports.selector = selector; +exports.selectorAll = selectorAll; +exports.style = styleValue; +exports.window = defaultView; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-selection/dist/d3-selection.min.js b/node_modules/d3-selection/dist/d3-selection.min.js new file mode 100644 index 00000000..46a30ba4 --- /dev/null +++ b/node_modules/d3-selection/dist/d3-selection.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-selection/ v2.0.0 Copyright 2020 Mike Bostock +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t=t||self).d3=t.d3||{})}(this,function(t){"use strict";var n="http://www.w3.org/1999/xhtml",e={svg:"http://www.w3.org/2000/svg",xhtml:n,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function r(t){var n=t+="",r=n.indexOf(":");return r>=0&&"xmlns"!==(n=t.slice(0,r))&&(t=t.slice(r+1)),e.hasOwnProperty(n)?{space:e[n],local:t}:t}function i(t){var e=r(t);return(e.local?function(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}:function(t){return function(){var e=this.ownerDocument,r=this.namespaceURI;return r===n&&e.documentElement.namespaceURI===n?e.createElement(t):e.createElementNS(r,t)}})(e)}function o(){}function u(t){return null==t?o:function(){return this.querySelector(t)}}function c(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function s(){return[]}function l(t){return null==t?s:function(){return this.querySelectorAll(t)}}function a(t){return function(){return this.matches(t)}}function f(t){return function(n){return n.matches(t)}}var h=Array.prototype.find;function p(){return this.firstElementChild}var _=Array.prototype.filter;function d(){return this.children}function y(t){return new Array(t.length)}function v(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}function m(t,n,e,r,i,o){for(var u,c=0,s=n.length,l=o.length;cn?1:t>=n?0:NaN}function x(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function S(t,n){return t.style.getPropertyValue(n)||x(t).getComputedStyle(t,null).getPropertyValue(n)}function b(t){return t.trim().split(/^|\s+/)}function E(t){return t.classList||new N(t)}function N(t){this._node=t,this._names=b(t.getAttribute("class")||"")}function C(t,n){for(var e=E(t),r=-1,i=n.length;++r=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var I=[null];function U(t,n){this._groups=t,this._parents=n}function X(){return new U([[document.documentElement]],I)}function G(t){return"string"==typeof t?new U([[document.querySelector(t)]],[document.documentElement]):new U([[t]],I)}U.prototype=X.prototype={constructor:U,select:function(t){"function"!=typeof t&&(t=u(t));for(var n=this._groups,e=n.length,r=new Array(e),i=0;i=E&&(E=b+1);!(S=A[E])&&++E=0;)(r=i[o])&&(u&&4^r.compareDocumentPosition(u)&&u.parentNode.insertBefore(r,u),u=r);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=A);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o1?this.each((null==n?function(t){return function(){this.style.removeProperty(t)}}:"function"==typeof n?function(t,n,e){return function(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}}:function(t,n,e){return function(){this.style.setProperty(t,n,e)}})(t,n,null==e?"":e)):S(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?function(t){return function(){delete this[t]}}:"function"==typeof n?function(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}:function(t,n){return function(){this[t]=n}})(t,n)):this.node()[t]},classed:function(t,n){var e=b(t+"");if(arguments.length<2){for(var r=E(this.node()),i=-1,o=e.length;++i=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}})}(t+""),u=o.length;if(!(arguments.length<2)){for(c=n?R:j,r=0;rJ(t,n))},t.select=G,t.selectAll=function(t){return"string"==typeof t?new U([document.querySelectorAll(t)],[document.documentElement]):new U([null==t?[]:c(t)],I)},t.selection=X,t.selector=u,t.selectorAll=l,t.style=S,t.window=x,Object.defineProperty(t,"__esModule",{value:!0})}); diff --git a/node_modules/d3-selection/package.json b/node_modules/d3-selection/package.json new file mode 100644 index 00000000..619eef18 --- /dev/null +++ b/node_modules/d3-selection/package.json @@ -0,0 +1,75 @@ +{ + "_from": "d3-selection@2", + "_id": "d3-selection@2.0.0", + "_inBundle": false, + "_integrity": "sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==", + "_location": "/d3-selection", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-selection@2", + "name": "d3-selection", + "escapedName": "d3-selection", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3", + "/d3-brush", + "/d3-drag", + "/d3-zoom" + ], + "_resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-2.0.0.tgz", + "_shasum": "94a11638ea2141b7565f883780dabc7ef6a61066", + "_spec": "d3-selection@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "https://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-selection/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Data-driven DOM manipulation: select elements and join them to data.", + "devDependencies": { + "eslint": "6", + "jsdom": "15", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-selection/", + "jsdelivr": "dist/d3-selection.min.js", + "keywords": [ + "d3", + "d3-module", + "dom", + "selection", + "data-join" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-selection.js", + "module": "src/index.js", + "name": "d3-selection", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-selection.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src" + }, + "sideEffects": false, + "unpkg": "dist/d3-selection.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-selection/src/array.js b/node_modules/d3-selection/src/array.js new file mode 100644 index 00000000..f82c3ac6 --- /dev/null +++ b/node_modules/d3-selection/src/array.js @@ -0,0 +1,5 @@ +export default function(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} diff --git a/node_modules/d3-selection/src/constant.js b/node_modules/d3-selection/src/constant.js new file mode 100644 index 00000000..b7d42e71 --- /dev/null +++ b/node_modules/d3-selection/src/constant.js @@ -0,0 +1,5 @@ +export default function(x) { + return function() { + return x; + }; +} diff --git a/node_modules/d3-selection/src/create.js b/node_modules/d3-selection/src/create.js new file mode 100644 index 00000000..077a6a3d --- /dev/null +++ b/node_modules/d3-selection/src/create.js @@ -0,0 +1,6 @@ +import creator from "./creator.js"; +import select from "./select.js"; + +export default function(name) { + return select(creator(name).call(document.documentElement)); +} diff --git a/node_modules/d3-selection/src/creator.js b/node_modules/d3-selection/src/creator.js new file mode 100644 index 00000000..4f1b1621 --- /dev/null +++ b/node_modules/d3-selection/src/creator.js @@ -0,0 +1,25 @@ +import namespace from "./namespace.js"; +import {xhtml} from "./namespaces.js"; + +function creatorInherit(name) { + return function() { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; +} + +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; +} + +export default function(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); +} diff --git a/node_modules/d3-selection/src/identity.js b/node_modules/d3-selection/src/identity.js new file mode 100644 index 00000000..b2f94b2e --- /dev/null +++ b/node_modules/d3-selection/src/identity.js @@ -0,0 +1,3 @@ +export default function(x) { + return x; +} diff --git a/node_modules/d3-selection/src/index.js b/node_modules/d3-selection/src/index.js new file mode 100644 index 00000000..dc51a3bd --- /dev/null +++ b/node_modules/d3-selection/src/index.js @@ -0,0 +1,15 @@ +export {default as create} from "./create.js"; +export {default as creator} from "./creator.js"; +export {default as local} from "./local.js"; +export {default as matcher} from "./matcher.js"; +export {default as namespace} from "./namespace.js"; +export {default as namespaces} from "./namespaces.js"; +export {default as pointer} from "./pointer.js"; +export {default as pointers} from "./pointers.js"; +export {default as select} from "./select.js"; +export {default as selectAll} from "./selectAll.js"; +export {default as selection} from "./selection/index.js"; +export {default as selector} from "./selector.js"; +export {default as selectorAll} from "./selectorAll.js"; +export {styleValue as style} from "./selection/style.js"; +export {default as window} from "./window.js"; diff --git a/node_modules/d3-selection/src/local.js b/node_modules/d3-selection/src/local.js new file mode 100644 index 00000000..ab4c20f9 --- /dev/null +++ b/node_modules/d3-selection/src/local.js @@ -0,0 +1,27 @@ +var nextId = 0; + +export default function local() { + return new Local; +} + +function Local() { + this._ = "@" + (++nextId).toString(36); +} + +Local.prototype = local.prototype = { + constructor: Local, + get: function(node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function(node, value) { + return node[this._] = value; + }, + remove: function(node) { + return this._ in node && delete node[this._]; + }, + toString: function() { + return this._; + } +}; diff --git a/node_modules/d3-selection/src/matcher.js b/node_modules/d3-selection/src/matcher.js new file mode 100644 index 00000000..854b0d92 --- /dev/null +++ b/node_modules/d3-selection/src/matcher.js @@ -0,0 +1,12 @@ +export default function(selector) { + return function() { + return this.matches(selector); + }; +} + +export function childMatcher(selector) { + return function(node) { + return node.matches(selector); + }; +} + diff --git a/node_modules/d3-selection/src/namespace.js b/node_modules/d3-selection/src/namespace.js new file mode 100644 index 00000000..72db9df5 --- /dev/null +++ b/node_modules/d3-selection/src/namespace.js @@ -0,0 +1,7 @@ +import namespaces from "./namespaces.js"; + +export default function(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins +} diff --git a/node_modules/d3-selection/src/namespaces.js b/node_modules/d3-selection/src/namespaces.js new file mode 100644 index 00000000..01749bdc --- /dev/null +++ b/node_modules/d3-selection/src/namespaces.js @@ -0,0 +1,9 @@ +export var xhtml = "http://www.w3.org/1999/xhtml"; + +export default { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +}; diff --git a/node_modules/d3-selection/src/pointer.js b/node_modules/d3-selection/src/pointer.js new file mode 100644 index 00000000..3e2298f6 --- /dev/null +++ b/node_modules/d3-selection/src/pointer.js @@ -0,0 +1,20 @@ +import sourceEvent from "./sourceEvent.js"; + +export default function(event, node) { + event = sourceEvent(event); + if (node === undefined) node = event.currentTarget; + if (node) { + var svg = node.ownerSVGElement || node; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + if (node.getBoundingClientRect) { + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + } + return [event.pageX, event.pageY]; +} diff --git a/node_modules/d3-selection/src/pointers.js b/node_modules/d3-selection/src/pointers.js new file mode 100644 index 00000000..43d17d19 --- /dev/null +++ b/node_modules/d3-selection/src/pointers.js @@ -0,0 +1,11 @@ +import pointer from "./pointer.js"; +import sourceEvent from "./sourceEvent.js"; + +export default function(events, node) { + if (events.target) { // i.e., instanceof Event, not TouchList or iterable + events = sourceEvent(events); + if (node === undefined) node = events.currentTarget; + events = events.touches || [events]; + } + return Array.from(events, event => pointer(event, node)); +} diff --git a/node_modules/d3-selection/src/select.js b/node_modules/d3-selection/src/select.js new file mode 100644 index 00000000..dcea22e8 --- /dev/null +++ b/node_modules/d3-selection/src/select.js @@ -0,0 +1,7 @@ +import {Selection, root} from "./selection/index.js"; + +export default function(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); +} diff --git a/node_modules/d3-selection/src/selectAll.js b/node_modules/d3-selection/src/selectAll.js new file mode 100644 index 00000000..9345898e --- /dev/null +++ b/node_modules/d3-selection/src/selectAll.js @@ -0,0 +1,8 @@ +import array from "./array.js"; +import {Selection, root} from "./selection/index.js"; + +export default function(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : array(selector)], root); +} diff --git a/node_modules/d3-selection/src/selection/append.js b/node_modules/d3-selection/src/selection/append.js new file mode 100644 index 00000000..33336331 --- /dev/null +++ b/node_modules/d3-selection/src/selection/append.js @@ -0,0 +1,8 @@ +import creator from "../creator.js"; + +export default function(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function() { + return this.appendChild(create.apply(this, arguments)); + }); +} diff --git a/node_modules/d3-selection/src/selection/attr.js b/node_modules/d3-selection/src/selection/attr.js new file mode 100644 index 00000000..5e933538 --- /dev/null +++ b/node_modules/d3-selection/src/selection/attr.js @@ -0,0 +1,57 @@ +import namespace from "../namespace.js"; + +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; +} + +function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} + +function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; +} + +function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; +} + +export default function(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); +} diff --git a/node_modules/d3-selection/src/selection/call.js b/node_modules/d3-selection/src/selection/call.js new file mode 100644 index 00000000..2c41eeef --- /dev/null +++ b/node_modules/d3-selection/src/selection/call.js @@ -0,0 +1,6 @@ +export default function() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; +} diff --git a/node_modules/d3-selection/src/selection/classed.js b/node_modules/d3-selection/src/selection/classed.js new file mode 100644 index 00000000..b3563731 --- /dev/null +++ b/node_modules/d3-selection/src/selection/classed.js @@ -0,0 +1,75 @@ +function classArray(string) { + return string.trim().split(/^|\s+/); +} + +function classList(node) { + return node.classList || new ClassList(node); +} + +function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); +} + +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; + +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); +} + +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); +} + +function classedTrue(names) { + return function() { + classedAdd(this, names); + }; +} + +function classedFalse(names) { + return function() { + classedRemove(this, names); + }; +} + +function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; +} + +export default function(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); +} diff --git a/node_modules/d3-selection/src/selection/clone.js b/node_modules/d3-selection/src/selection/clone.js new file mode 100644 index 00000000..5e273bf1 --- /dev/null +++ b/node_modules/d3-selection/src/selection/clone.js @@ -0,0 +1,13 @@ +function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +export default function(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} diff --git a/node_modules/d3-selection/src/selection/data.js b/node_modules/d3-selection/src/selection/data.js new file mode 100644 index 00000000..4e0cf0aa --- /dev/null +++ b/node_modules/d3-selection/src/selection/data.js @@ -0,0 +1,117 @@ +import {Selection} from "./index.js"; +import {EnterNode} from "./enter.js"; +import array from "../array.js"; +import constant from "../constant.js"; + +function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } +} + +function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = new Map, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = key.call(parent, data[i], i, data) + ""; + if (node = nodeByKeyValue.get(keyValue)) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue.delete(keyValue); + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) { + exit[i] = node; + } + } +} + +function datum(node) { + return node.__data__; +} + +export default function(value, key) { + if (!arguments.length) return Array.from(this, datum); + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = array(value.call(parent, parent && parent.__data__, j, parents)), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; +} diff --git a/node_modules/d3-selection/src/selection/datum.js b/node_modules/d3-selection/src/selection/datum.js new file mode 100644 index 00000000..5de4e580 --- /dev/null +++ b/node_modules/d3-selection/src/selection/datum.js @@ -0,0 +1,5 @@ +export default function(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; +} diff --git a/node_modules/d3-selection/src/selection/dispatch.js b/node_modules/d3-selection/src/selection/dispatch.js new file mode 100644 index 00000000..8f57915f --- /dev/null +++ b/node_modules/d3-selection/src/selection/dispatch.js @@ -0,0 +1,34 @@ +import defaultView from "../window.js"; + +function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); +} + +function dispatchConstant(type, params) { + return function() { + return dispatchEvent(this, type, params); + }; +} + +function dispatchFunction(type, params) { + return function() { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; +} + +export default function(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); +} diff --git a/node_modules/d3-selection/src/selection/each.js b/node_modules/d3-selection/src/selection/each.js new file mode 100644 index 00000000..260af8f2 --- /dev/null +++ b/node_modules/d3-selection/src/selection/each.js @@ -0,0 +1,10 @@ +export default function(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; +} diff --git a/node_modules/d3-selection/src/selection/empty.js b/node_modules/d3-selection/src/selection/empty.js new file mode 100644 index 00000000..4e2cf428 --- /dev/null +++ b/node_modules/d3-selection/src/selection/empty.js @@ -0,0 +1,3 @@ +export default function() { + return !this.node(); +} diff --git a/node_modules/d3-selection/src/selection/enter.js b/node_modules/d3-selection/src/selection/enter.js new file mode 100644 index 00000000..83a3ed4d --- /dev/null +++ b/node_modules/d3-selection/src/selection/enter.js @@ -0,0 +1,22 @@ +import sparse from "./sparse.js"; +import {Selection} from "./index.js"; + +export default function() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); +} + +export function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; +} + +EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, + insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, + querySelector: function(selector) { return this._parent.querySelector(selector); }, + querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } +}; diff --git a/node_modules/d3-selection/src/selection/exit.js b/node_modules/d3-selection/src/selection/exit.js new file mode 100644 index 00000000..f5d7b45d --- /dev/null +++ b/node_modules/d3-selection/src/selection/exit.js @@ -0,0 +1,6 @@ +import sparse from "./sparse.js"; +import {Selection} from "./index.js"; + +export default function() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); +} diff --git a/node_modules/d3-selection/src/selection/filter.js b/node_modules/d3-selection/src/selection/filter.js new file mode 100644 index 00000000..74b3d6f2 --- /dev/null +++ b/node_modules/d3-selection/src/selection/filter.js @@ -0,0 +1,16 @@ +import {Selection} from "./index.js"; +import matcher from "../matcher.js"; + +export default function(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); +} diff --git a/node_modules/d3-selection/src/selection/html.js b/node_modules/d3-selection/src/selection/html.js new file mode 100644 index 00000000..df274428 --- /dev/null +++ b/node_modules/d3-selection/src/selection/html.js @@ -0,0 +1,25 @@ +function htmlRemove() { + this.innerHTML = ""; +} + +function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; +} + +function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; +} + +export default function(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; +} diff --git a/node_modules/d3-selection/src/selection/index.js b/node_modules/d3-selection/src/selection/index.js new file mode 100644 index 00000000..a593a219 --- /dev/null +++ b/node_modules/d3-selection/src/selection/index.js @@ -0,0 +1,90 @@ +import selection_select from "./select.js"; +import selection_selectAll from "./selectAll.js"; +import selection_selectChild from "./selectChild.js"; +import selection_selectChildren from "./selectChildren.js"; +import selection_filter from "./filter.js"; +import selection_data from "./data.js"; +import selection_enter from "./enter.js"; +import selection_exit from "./exit.js"; +import selection_join from "./join.js"; +import selection_merge from "./merge.js"; +import selection_order from "./order.js"; +import selection_sort from "./sort.js"; +import selection_call from "./call.js"; +import selection_nodes from "./nodes.js"; +import selection_node from "./node.js"; +import selection_size from "./size.js"; +import selection_empty from "./empty.js"; +import selection_each from "./each.js"; +import selection_attr from "./attr.js"; +import selection_style from "./style.js"; +import selection_property from "./property.js"; +import selection_classed from "./classed.js"; +import selection_text from "./text.js"; +import selection_html from "./html.js"; +import selection_raise from "./raise.js"; +import selection_lower from "./lower.js"; +import selection_append from "./append.js"; +import selection_insert from "./insert.js"; +import selection_remove from "./remove.js"; +import selection_clone from "./clone.js"; +import selection_datum from "./datum.js"; +import selection_on from "./on.js"; +import selection_dispatch from "./dispatch.js"; +import selection_iterator from "./iterator.js"; + +export var root = [null]; + +export function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; +} + +function selection() { + return new Selection([[document.documentElement]], root); +} + +function selection_selection() { + return this; +} + +Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + selectChild: selection_selectChild, + selectChildren: selection_selectChildren, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + selection: selection_selection, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch, + [Symbol.iterator]: selection_iterator +}; + +export default selection; diff --git a/node_modules/d3-selection/src/selection/insert.js b/node_modules/d3-selection/src/selection/insert.js new file mode 100644 index 00000000..1733de54 --- /dev/null +++ b/node_modules/d3-selection/src/selection/insert.js @@ -0,0 +1,14 @@ +import creator from "../creator.js"; +import selector from "../selector.js"; + +function constantNull() { + return null; +} + +export default function(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function() { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); +} diff --git a/node_modules/d3-selection/src/selection/iterator.js b/node_modules/d3-selection/src/selection/iterator.js new file mode 100644 index 00000000..58728191 --- /dev/null +++ b/node_modules/d3-selection/src/selection/iterator.js @@ -0,0 +1,7 @@ +export default function*() { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) yield node; + } + } +} diff --git a/node_modules/d3-selection/src/selection/join.js b/node_modules/d3-selection/src/selection/join.js new file mode 100644 index 00000000..625cd474 --- /dev/null +++ b/node_modules/d3-selection/src/selection/join.js @@ -0,0 +1,7 @@ +export default function(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; +} diff --git a/node_modules/d3-selection/src/selection/lower.js b/node_modules/d3-selection/src/selection/lower.js new file mode 100644 index 00000000..d7247132 --- /dev/null +++ b/node_modules/d3-selection/src/selection/lower.js @@ -0,0 +1,7 @@ +function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); +} + +export default function() { + return this.each(lower); +} diff --git a/node_modules/d3-selection/src/selection/merge.js b/node_modules/d3-selection/src/selection/merge.js new file mode 100644 index 00000000..eac96044 --- /dev/null +++ b/node_modules/d3-selection/src/selection/merge.js @@ -0,0 +1,19 @@ +import {Selection} from "./index.js"; + +export default function(selection) { + if (!(selection instanceof Selection)) throw new Error("invalid merge"); + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); +} diff --git a/node_modules/d3-selection/src/selection/node.js b/node_modules/d3-selection/src/selection/node.js new file mode 100644 index 00000000..0691cbc0 --- /dev/null +++ b/node_modules/d3-selection/src/selection/node.js @@ -0,0 +1,11 @@ +export default function() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; +} diff --git a/node_modules/d3-selection/src/selection/nodes.js b/node_modules/d3-selection/src/selection/nodes.js new file mode 100644 index 00000000..7f38090d --- /dev/null +++ b/node_modules/d3-selection/src/selection/nodes.js @@ -0,0 +1,3 @@ +export default function() { + return Array.from(this); +} diff --git a/node_modules/d3-selection/src/selection/on.js b/node_modules/d3-selection/src/selection/on.js new file mode 100644 index 00000000..7906c8ca --- /dev/null +++ b/node_modules/d3-selection/src/selection/on.js @@ -0,0 +1,67 @@ +function contextListener(listener) { + return function(event) { + listener.call(this, event, this.__data__); + }; +} + +function parseTypenames(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); +} + +function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; +} + +function onAdd(typename, value, options) { + return function() { + var on = this.__on, o, listener = contextListener(value); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + this.addEventListener(o.type, o.listener = listener, o.options = options); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, options); + o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options}; + if (!on) this.__on = [o]; + else on.push(o); + }; +} + +export default function(typename, value, options) { + var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); + return this; +} diff --git a/node_modules/d3-selection/src/selection/order.js b/node_modules/d3-selection/src/selection/order.js new file mode 100644 index 00000000..f8c52b4b --- /dev/null +++ b/node_modules/d3-selection/src/selection/order.js @@ -0,0 +1,13 @@ +export default function() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; +} diff --git a/node_modules/d3-selection/src/selection/property.js b/node_modules/d3-selection/src/selection/property.js new file mode 100644 index 00000000..3b7efd39 --- /dev/null +++ b/node_modules/d3-selection/src/selection/property.js @@ -0,0 +1,28 @@ +function propertyRemove(name) { + return function() { + delete this[name]; + }; +} + +function propertyConstant(name, value) { + return function() { + this[name] = value; + }; +} + +function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; +} + +export default function(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; +} diff --git a/node_modules/d3-selection/src/selection/raise.js b/node_modules/d3-selection/src/selection/raise.js new file mode 100644 index 00000000..3e9e1c9b --- /dev/null +++ b/node_modules/d3-selection/src/selection/raise.js @@ -0,0 +1,7 @@ +function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); +} + +export default function() { + return this.each(raise); +} diff --git a/node_modules/d3-selection/src/selection/remove.js b/node_modules/d3-selection/src/selection/remove.js new file mode 100644 index 00000000..12a81060 --- /dev/null +++ b/node_modules/d3-selection/src/selection/remove.js @@ -0,0 +1,8 @@ +function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); +} + +export default function() { + return this.each(remove); +} diff --git a/node_modules/d3-selection/src/selection/select.js b/node_modules/d3-selection/src/selection/select.js new file mode 100644 index 00000000..223cc243 --- /dev/null +++ b/node_modules/d3-selection/src/selection/select.js @@ -0,0 +1,17 @@ +import {Selection} from "./index.js"; +import selector from "../selector.js"; + +export default function(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); +} diff --git a/node_modules/d3-selection/src/selection/selectAll.js b/node_modules/d3-selection/src/selection/selectAll.js new file mode 100644 index 00000000..1eb90276 --- /dev/null +++ b/node_modules/d3-selection/src/selection/selectAll.js @@ -0,0 +1,26 @@ +import {Selection} from "./index.js"; +import array from "../array.js"; +import selectorAll from "../selectorAll.js"; + +function arrayAll(select) { + return function() { + var group = select.apply(this, arguments); + return group == null ? [] : array(group); + }; +} + +export default function(select) { + if (typeof select === "function") select = arrayAll(select); + else select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); +} diff --git a/node_modules/d3-selection/src/selection/selectChild.js b/node_modules/d3-selection/src/selection/selectChild.js new file mode 100644 index 00000000..d0427947 --- /dev/null +++ b/node_modules/d3-selection/src/selection/selectChild.js @@ -0,0 +1,18 @@ +import {childMatcher} from "../matcher.js"; + +var find = Array.prototype.find; + +function childFind(match) { + return function() { + return find.call(this.children, match); + }; +} + +function childFirst() { + return this.firstElementChild; +} + +export default function(match) { + return this.select(match == null ? childFirst + : childFind(typeof match === "function" ? match : childMatcher(match))); +} diff --git a/node_modules/d3-selection/src/selection/selectChildren.js b/node_modules/d3-selection/src/selection/selectChildren.js new file mode 100644 index 00000000..a1d0836f --- /dev/null +++ b/node_modules/d3-selection/src/selection/selectChildren.js @@ -0,0 +1,18 @@ +import {childMatcher} from "../matcher.js"; + +var filter = Array.prototype.filter; + +function children() { + return this.children; +} + +function childrenFilter(match) { + return function() { + return filter.call(this.children, match); + }; +} + +export default function(match) { + return this.selectAll(match == null ? children + : childrenFilter(typeof match === "function" ? match : childMatcher(match))); +} diff --git a/node_modules/d3-selection/src/selection/size.js b/node_modules/d3-selection/src/selection/size.js new file mode 100644 index 00000000..e07eaa4f --- /dev/null +++ b/node_modules/d3-selection/src/selection/size.js @@ -0,0 +1,5 @@ +export default function() { + let size = 0; + for (const node of this) ++size; // eslint-disable-line no-unused-vars + return size; +} diff --git a/node_modules/d3-selection/src/selection/sort.js b/node_modules/d3-selection/src/selection/sort.js new file mode 100644 index 00000000..336760f1 --- /dev/null +++ b/node_modules/d3-selection/src/selection/sort.js @@ -0,0 +1,24 @@ +import {Selection} from "./index.js"; + +export default function(compare) { + if (!compare) compare = ascending; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); +} + +function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} diff --git a/node_modules/d3-selection/src/selection/sparse.js b/node_modules/d3-selection/src/selection/sparse.js new file mode 100644 index 00000000..7b261ad1 --- /dev/null +++ b/node_modules/d3-selection/src/selection/sparse.js @@ -0,0 +1,3 @@ +export default function(update) { + return new Array(update.length); +} diff --git a/node_modules/d3-selection/src/selection/style.js b/node_modules/d3-selection/src/selection/style.js new file mode 100644 index 00000000..7e0f0586 --- /dev/null +++ b/node_modules/d3-selection/src/selection/style.js @@ -0,0 +1,35 @@ +import defaultView from "../window.js"; + +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} + +function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; +} + +export default function(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); +} + +export function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); +} diff --git a/node_modules/d3-selection/src/selection/text.js b/node_modules/d3-selection/src/selection/text.js new file mode 100644 index 00000000..a902980c --- /dev/null +++ b/node_modules/d3-selection/src/selection/text.js @@ -0,0 +1,25 @@ +function textRemove() { + this.textContent = ""; +} + +function textConstant(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; +} + +export default function(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; +} diff --git a/node_modules/d3-selection/src/selector.js b/node_modules/d3-selection/src/selector.js new file mode 100644 index 00000000..058bd73a --- /dev/null +++ b/node_modules/d3-selection/src/selector.js @@ -0,0 +1,7 @@ +function none() {} + +export default function(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; +} diff --git a/node_modules/d3-selection/src/selectorAll.js b/node_modules/d3-selection/src/selectorAll.js new file mode 100644 index 00000000..ea42ffa3 --- /dev/null +++ b/node_modules/d3-selection/src/selectorAll.js @@ -0,0 +1,9 @@ +function empty() { + return []; +} + +export default function(selector) { + return selector == null ? empty : function() { + return this.querySelectorAll(selector); + }; +} diff --git a/node_modules/d3-selection/src/sourceEvent.js b/node_modules/d3-selection/src/sourceEvent.js new file mode 100644 index 00000000..8ab130e2 --- /dev/null +++ b/node_modules/d3-selection/src/sourceEvent.js @@ -0,0 +1,5 @@ +export default function(event) { + let sourceEvent; + while (sourceEvent = event.sourceEvent) event = sourceEvent; + return event; +} diff --git a/node_modules/d3-selection/src/window.js b/node_modules/d3-selection/src/window.js new file mode 100644 index 00000000..ca1105bd --- /dev/null +++ b/node_modules/d3-selection/src/window.js @@ -0,0 +1,5 @@ +export default function(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document +} diff --git a/node_modules/d3-shape/LICENSE b/node_modules/d3-shape/LICENSE new file mode 100644 index 00000000..4f0b022c --- /dev/null +++ b/node_modules/d3-shape/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2015 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-shape/README.md b/node_modules/d3-shape/README.md new file mode 100644 index 00000000..98f630d3 --- /dev/null +++ b/node_modules/d3-shape/README.md @@ -0,0 +1,1162 @@ +# d3-shape + +Visualizations typically consist of discrete graphical marks, such as [symbols](#symbols), [arcs](#arcs), [lines](#lines) and [areas](#areas). While the rectangles of a bar chart may be easy enough to generate directly using [SVG](http://www.w3.org/TR/SVG/paths.html#PathData) or [Canvas](http://www.w3.org/TR/2dcontext/#canvaspathmethods), other shapes are complex, such as rounded annular sectors and centripetal Catmull–Rom splines. This module provides a variety of shape generators for your convenience. + +As with other aspects of D3, these shapes are driven by data: each shape generator exposes accessors that control how the input data are mapped to a visual representation. For example, you might define a line generator for a time series by [scaling](https://github.com/d3/d3-scale) fields of your data to fit the chart: + +```js +const line = d3.line() + .x(d => x(d.date)) + .y(d => y(d.value)); +``` + +This line generator can then be used to compute the `d` attribute of an SVG path element: + +```js +path.datum(data).attr("d", line); +``` + +Or you can use it to render to a Canvas 2D context: + +```js +line.context(context)(data); +``` + +For more, read [Introducing d3-shape](https://medium.com/@mbostock/introducing-d3-shape-73f8367e6d12). + +## Installing + +If you use NPM, `npm install d3-shape`. Otherwise, download the [latest release](https://github.com/d3/d3-shape/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-shape.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + +``` + + +## API Reference + +* [Arcs](#arcs) +* [Pies](#pies) +* [Lines](#lines) +* [Areas](#areas) +* [Curves](#curves) +* [Custom Curves](#custom-curves) +* [Links](#links) +* [Symbols](#symbols) +* [Custom Symbol Types](#custom-symbol-types) +* [Stacks](#stacks) + +Note: all the methods that accept arrays also accept iterables and convert them to arrays internally. + +### Arcs + +[Pie Chart](http://bl.ocks.org/mbostock/8878e7fd82034f1d63cf)[Donut Chart](http://bl.ocks.org/mbostock/2394b23da1994fc202e1) + +The arc generator produces a [circular](https://en.wikipedia.org/wiki/Circular_sector) or [annular](https://en.wikipedia.org/wiki/Annulus_\(mathematics\)) sector, as in a pie or donut chart. If the difference between the [start](#arc_startAngle) and [end](#arc_endAngle) angles (the *angular span*) is greater than [τ](https://en.wikipedia.org/wiki/Turn_\(geometry\)#Tau_proposal), the arc generator will produce a complete circle or annulus. If it is less than τ, arcs may have [rounded corners](#arc_cornerRadius) and [angular padding](#arc_padAngle). Arcs are always centered at ⟨0,0⟩; use a transform (see: [SVG](http://www.w3.org/TR/SVG/coords.html#TransformAttribute), [Canvas](http://www.w3.org/TR/2dcontext/#transformations)) to move the arc to a different position. + +See also the [pie generator](#pies), which computes the necessary angles to represent an array of data as a pie or donut chart; these angles can then be passed to an arc generator. + +# d3.arc() · [Source](https://github.com/d3/d3-shape/blob/master/src/arc.js) + +Constructs a new arc generator with the default settings. + +# arc(arguments…) · [Source](https://github.com/d3/d3-shape/blob/master/src/arc.js) + +Generates an arc for the given *arguments*. The *arguments* are arbitrary; they are simply propagated to the arc generator’s accessor functions along with the `this` object. For example, with the default settings, an object with radii and angles is expected: + +```js +const arc = d3.arc(); + +arc({ + innerRadius: 0, + outerRadius: 100, + startAngle: 0, + endAngle: Math.PI / 2 +}); // "M0,-100A100,100,0,0,1,100,0L0,0Z" +``` + +If the radii and angles are instead defined as constants, you can generate an arc without any arguments: + +```js +const arc = d3.arc() + .innerRadius(0) + .outerRadius(100) + .startAngle(0) + .endAngle(Math.PI / 2); + +arc(); // "M0,-100A100,100,0,0,1,100,0L0,0Z" +``` + +If the arc generator has a [context](#arc_context), then the arc is rendered to this context as a sequence of [path method](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls and this function returns void. Otherwise, a [path data](http://www.w3.org/TR/SVG/paths.html#PathData) string is returned. + +# arc.centroid(arguments…) · [Source](https://github.com/d3/d3-shape/blob/master/src/arc.js) + +Computes the midpoint [*x*, *y*] of the center line of the arc that would be [generated](#_arc) by the given *arguments*. The *arguments* are arbitrary; they are simply propagated to the arc generator’s accessor functions along with the `this` object. To be consistent with the generated arc, the accessors must be deterministic, *i.e.*, return the same value given the same arguments. The midpoint is defined as ([startAngle](#arc_startAngle) + [endAngle](#arc_endAngle)) / 2 and ([innerRadius](#arc_innerRadius) + [outerRadius](#arc_outerRadius)) / 2. For example: + +[Circular Sector Centroids](http://bl.ocks.org/mbostock/9b5a2fd1ce1a146f27e4)[Annular Sector Centroids](http://bl.ocks.org/mbostock/c274877f647361f3df7d) + +Note that this is **not the geometric center** of the arc, which may be outside the arc; this method is merely a convenience for positioning labels. + +# arc.innerRadius([radius]) · [Source](https://github.com/d3/d3-shape/blob/master/src/arc.js) + +If *radius* is specified, sets the inner radius to the specified function or number and returns this arc generator. If *radius* is not specified, returns the current inner radius accessor, which defaults to: + +```js +function innerRadius(d) { + return d.innerRadius; +} +``` + +Specifying the inner radius as a function is useful for constructing a stacked polar bar chart, often in conjunction with a [sqrt scale](https://github.com/d3/d3-scale#sqrt). More commonly, a constant inner radius is used for a donut or pie chart. If the outer radius is smaller than the inner radius, the inner and outer radii are swapped. A negative value is treated as zero. + +# arc.outerRadius([radius]) · [Source](https://github.com/d3/d3-shape/blob/master/src/arc.js) + +If *radius* is specified, sets the outer radius to the specified function or number and returns this arc generator. If *radius* is not specified, returns the current outer radius accessor, which defaults to: + +```js +function outerRadius(d) { + return d.outerRadius; +} +``` + +Specifying the outer radius as a function is useful for constructing a coxcomb or polar bar chart, often in conjunction with a [sqrt scale](https://github.com/d3/d3-scale#sqrt). More commonly, a constant outer radius is used for a pie or donut chart. If the outer radius is smaller than the inner radius, the inner and outer radii are swapped. A negative value is treated as zero. + +# arc.cornerRadius([radius]) · [Source](https://github.com/d3/d3-shape/blob/master/src/arc.js) + +If *radius* is specified, sets the corner radius to the specified function or number and returns this arc generator. If *radius* is not specified, returns the current corner radius accessor, which defaults to: + +```js +function cornerRadius() { + return 0; +} +``` + +If the corner radius is greater than zero, the corners of the arc are rounded using circles of the given radius. For a circular sector, the two outer corners are rounded; for an annular sector, all four corners are rounded. The corner circles are shown in this diagram: + +[Rounded Circular Sectors](http://bl.ocks.org/mbostock/e5e3680f3079cf5c3437)[Rounded Annular Sectors](http://bl.ocks.org/mbostock/f41f50e06a6c04828b6e) + +The corner radius may not be larger than ([outerRadius](#arc_outerRadius) - [innerRadius](#arc_innerRadius)) / 2. In addition, for arcs whose angular span is less than π, the corner radius may be reduced as two adjacent rounded corners intersect. This is occurs more often with the inner corners. See the [arc corners animation](http://bl.ocks.org/mbostock/b7671cb38efdfa5da3af) for illustration. + +# arc.startAngle([angle]) · [Source](https://github.com/d3/d3-shape/blob/master/src/arc.js) + +If *angle* is specified, sets the start angle to the specified function or number and returns this arc generator. If *angle* is not specified, returns the current start angle accessor, which defaults to: + +```js +function startAngle(d) { + return d.startAngle; +} +``` + +The *angle* is specified in radians, with 0 at -*y* (12 o’clock) and positive angles proceeding clockwise. If |endAngle - startAngle| ≥ τ, a complete circle or annulus is generated rather than a sector. + +# arc.endAngle([angle]) · [Source](https://github.com/d3/d3-shape/blob/master/src/arc.js) + +If *angle* is specified, sets the end angle to the specified function or number and returns this arc generator. If *angle* is not specified, returns the current end angle accessor, which defaults to: + +```js +function endAngle(d) { + return d.endAngle; +} +``` + +The *angle* is specified in radians, with 0 at -*y* (12 o’clock) and positive angles proceeding clockwise. If |endAngle - startAngle| ≥ τ, a complete circle or annulus is generated rather than a sector. + +# arc.padAngle([angle]) · [Source](https://github.com/d3/d3-shape/blob/master/src/arc.js) + +If *angle* is specified, sets the pad angle to the specified function or number and returns this arc generator. If *angle* is not specified, returns the current pad angle accessor, which defaults to: + +```js +function padAngle() { + return d && d.padAngle; +} +``` + +The pad angle is converted to a fixed linear distance separating adjacent arcs, defined as [padRadius](#arc_padRadius) * padAngle. This distance is subtracted equally from the [start](#arc_startAngle) and [end](#arc_endAngle) of the arc. If the arc forms a complete circle or annulus, as when |endAngle - startAngle| ≥ τ, the pad angle is ignored. + +If the [inner radius](#arc_innerRadius) or angular span is small relative to the pad angle, it may not be possible to maintain parallel edges between adjacent arcs. In this case, the inner edge of the arc may collapse to a point, similar to a circular sector. For this reason, padding is typically only applied to annular sectors (*i.e.*, when innerRadius is positive), as shown in this diagram: + +[Padded Circular Sectors](http://bl.ocks.org/mbostock/f37b07b92633781a46f7)[Padded Annular Sectors](http://bl.ocks.org/mbostock/99f0a6533f7c949cf8b8) + +The recommended minimum inner radius when using padding is outerRadius \* padAngle / sin(θ), where θ is the angular span of the smallest arc before padding. For example, if the outer radius is 200 pixels and the pad angle is 0.02 radians, a reasonable θ is 0.04 radians, and a reasonable inner radius is 100 pixels. See the [arc padding animation](http://bl.ocks.org/mbostock/053fcc2295a445afab07) for illustration. + +Often, the pad angle is not set directly on the arc generator, but is instead computed by the [pie generator](#pies) so as to ensure that the area of padded arcs is proportional to their value; see [*pie*.padAngle](#pie_padAngle). See the [pie padding animation](http://bl.ocks.org/mbostock/3e961b4c97a1b543fff2) for illustration. If you apply a constant pad angle to the arc generator directly, it tends to subtract disproportionately from smaller arcs, introducing distortion. + +# arc.padRadius([radius]) · [Source](https://github.com/d3/d3-shape/blob/master/src/arc.js) + +If *radius* is specified, sets the pad radius to the specified function or number and returns this arc generator. If *radius* is not specified, returns the current pad radius accessor, which defaults to null, indicating that the pad radius should be automatically computed as sqrt([innerRadius](#arc_innerRadius) * innerRadius + [outerRadius](#arc_outerRadius) * outerRadius). The pad radius determines the fixed linear distance separating adjacent arcs, defined as padRadius * [padAngle](#arc_padAngle). + +# arc.context([context]) · [Source](https://github.com/d3/d3-shape/blob/master/src/arc.js) + +If *context* is specified, sets the context and returns this arc generator. If *context* is not specified, returns the current context, which defaults to null. If the context is not null, then the [generated arc](#_arc) is rendered to this context as a sequence of [path method](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls. Otherwise, a [path data](http://www.w3.org/TR/SVG/paths.html#PathData) string representing the generated arc is returned. + +### Pies + +The pie generator does not produce a shape directly, but instead computes the necessary angles to represent a tabular dataset as a pie or donut chart; these angles can then be passed to an [arc generator](#arcs). + +# d3.pie() · [Source](https://github.com/d3/d3-shape/blob/master/src/pie.js) + +Constructs a new pie generator with the default settings. + +# pie(data[, arguments…]) · [Source](https://github.com/d3/d3-shape/blob/master/src/pie.js) + +Generates a pie for the given array of *data*, returning an array of objects representing each datum’s arc angles. Any additional *arguments* are arbitrary; they are simply propagated to the pie generator’s accessor functions along with the `this` object. The length of the returned array is the same as *data*, and each element *i* in the returned array corresponds to the element *i* in the input data. Each object in the returned array has the following properties: + +* `data` - the input datum; the corresponding element in the input data array. +* `value` - the numeric [value](#pie_value) of the arc. +* `index` - the zero-based [sorted index](#pie_sort) of the arc. +* `startAngle` - the [start angle](#pie_startAngle) of the arc. +* `endAngle` - the [end angle](#pie_endAngle) of the arc. +* `padAngle` - the [pad angle](#pie_padAngle) of the arc. + +This representation is designed to work with the arc generator’s default [startAngle](#arc_startAngle), [endAngle](#arc_endAngle) and [padAngle](#arc_padAngle) accessors. The angular units are arbitrary, but if you plan to use the pie generator in conjunction with an [arc generator](#arcs), you should specify angles in radians, with 0 at -*y* (12 o’clock) and positive angles proceeding clockwise. + +Given a small dataset of numbers, here is how to compute the arc angles to render this data as a pie chart: + +```js +const data = [1, 1, 2, 3, 5, 8, 13, 21]; +const arcs = d3.pie()(data); +``` + +The first pair of parens, `pie()`, [constructs](#pie) a default pie generator. The second, `pie()(data)`, [invokes](#_pie) this generator on the dataset, returning an array of objects: + +```json +[ + {"data": 1, "value": 1, "index": 6, "startAngle": 6.050474740247008, "endAngle": 6.166830023713296, "padAngle": 0}, + {"data": 1, "value": 1, "index": 7, "startAngle": 6.166830023713296, "endAngle": 6.283185307179584, "padAngle": 0}, + {"data": 2, "value": 2, "index": 5, "startAngle": 5.817764173314431, "endAngle": 6.050474740247008, "padAngle": 0}, + {"data": 3, "value": 3, "index": 4, "startAngle": 5.468698322915565, "endAngle": 5.817764173314431, "padAngle": 0}, + {"data": 5, "value": 5, "index": 3, "startAngle": 4.886921905584122, "endAngle": 5.468698322915565, "padAngle": 0}, + {"data": 8, "value": 8, "index": 2, "startAngle": 3.956079637853813, "endAngle": 4.886921905584122, "padAngle": 0}, + {"data": 13, "value": 13, "index": 1, "startAngle": 2.443460952792061, "endAngle": 3.956079637853813, "padAngle": 0}, + {"data": 21, "value": 21, "index": 0, "startAngle": 0.000000000000000, "endAngle": 2.443460952792061, "padAngle": 0} +] +``` + +Note that the returned array is in the same order as the data, even though this pie chart is [sorted](#pie_sortValues) by descending value, starting with the arc for the last datum (value 21) at 12 o’clock. + +# pie.value([value]) · [Source](https://github.com/d3/d3-shape/blob/master/src/pie.js) + +If *value* is specified, sets the value accessor to the specified function or number and returns this pie generator. If *value* is not specified, returns the current value accessor, which defaults to: + +```js +function value(d) { + return d; +} +``` + +When a pie is [generated](#_pie), the value accessor will be invoked for each element in the input data array, being passed the element `d`, the index `i`, and the array `data` as three arguments. The default value accessor assumes that the input data are numbers, or that they are coercible to numbers using [valueOf](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf). If your data are not simply numbers, then you should specify an accessor that returns the corresponding numeric value for a given datum. For example: + +```js +const data = [ + {"number": 4, "name": "Locke"}, + {"number": 8, "name": "Reyes"}, + {"number": 15, "name": "Ford"}, + {"number": 16, "name": "Jarrah"}, + {"number": 23, "name": "Shephard"}, + {"number": 42, "name": "Kwon"} +]; + +const arcs = d3.pie() + .value(d => d.number) + (data); +``` + +This is similar to [mapping](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) your data to values before invoking the pie generator: + +```js +const arcs = d3.pie()(data.map(d => d.number)); +``` + +The benefit of an accessor is that the input data remains associated with the returned objects, thereby making it easier to access other fields of the data, for example to set the color or to add text labels. + +# pie.sort([compare]) · [Source](https://github.com/d3/d3-shape/blob/master/src/pie.js) + +If *compare* is specified, sets the data comparator to the specified function and returns this pie generator. If *compare* is not specified, returns the current data comparator, which defaults to null. If both the data comparator and the value comparator are null, then arcs are positioned in the original input order. Otherwise, the data is sorted according to the data comparator, and the resulting order is used. Setting the data comparator implicitly sets the [value comparator](#pie_sortValues) to null. + +The *compare* function takes two arguments *a* and *b*, each elements from the input data array. If the arc for *a* should be before the arc for *b*, then the comparator must return a number less than zero; if the arc for *a* should be after the arc for *b*, then the comparator must return a number greater than zero; returning zero means that the relative order of *a* and *b* is unspecified. For example, to sort arcs by their associated name: + +```js +pie.sort((a, b) => a.name.localeCompare(b.name)); +``` + +Sorting does not affect the order of the [generated arc array](#_pie) which is always in the same order as the input data array; it merely affects the computed angles of each arc. The first arc starts at the [start angle](#pie_startAngle) and the last arc ends at the [end angle](#pie_endAngle). + +# pie.sortValues([compare]) · [Source](https://github.com/d3/d3-shape/blob/master/src/pie.js) + +If *compare* is specified, sets the value comparator to the specified function and returns this pie generator. If *compare* is not specified, returns the current value comparator, which defaults to descending value. The default value comparator is implemented as: + +```js +function compare(a, b) { + return b - a; +} +``` + +If both the data comparator and the value comparator are null, then arcs are positioned in the original input order. Otherwise, the data is sorted according to the data comparator, and the resulting order is used. Setting the value comparator implicitly sets the [data comparator](#pie_sort) to null. + +The value comparator is similar to the [data comparator](#pie_sort), except the two arguments *a* and *b* are values derived from the input data array using the [value accessor](#pie_value), not the data elements. If the arc for *a* should be before the arc for *b*, then the comparator must return a number less than zero; if the arc for *a* should be after the arc for *b*, then the comparator must return a number greater than zero; returning zero means that the relative order of *a* and *b* is unspecified. For example, to sort arcs by ascending value: + +```js +pie.sortValues((a, b) => a - b); +``` + +Sorting does not affect the order of the [generated arc array](#_pie) which is always in the same order as the input data array; it merely affects the computed angles of each arc. The first arc starts at the [start angle](#pie_startAngle) and the last arc ends at the [end angle](#pie_endAngle). + +# pie.startAngle([angle]) · [Source](https://github.com/d3/d3-shape/blob/master/src/pie.js) + +If *angle* is specified, sets the overall start angle of the pie to the specified function or number and returns this pie generator. If *angle* is not specified, returns the current start angle accessor, which defaults to: + +```js +function startAngle() { + return 0; +} +``` + +The start angle here means the *overall* start angle of the pie, *i.e.*, the start angle of the first arc. The start angle accessor is invoked once, being passed the same arguments and `this` context as the [pie generator](#_pie). The units of *angle* are arbitrary, but if you plan to use the pie generator in conjunction with an [arc generator](#arcs), you should specify an angle in radians, with 0 at -*y* (12 o’clock) and positive angles proceeding clockwise. + +# pie.endAngle([angle]) · [Source](https://github.com/d3/d3-shape/blob/master/src/pie.js) + +If *angle* is specified, sets the overall end angle of the pie to the specified function or number and returns this pie generator. If *angle* is not specified, returns the current end angle accessor, which defaults to: + +```js +function endAngle() { + return 2 * Math.PI; +} +``` + +The end angle here means the *overall* end angle of the pie, *i.e.*, the end angle of the last arc. The end angle accessor is invoked once, being passed the same arguments and `this` context as the [pie generator](#_pie). The units of *angle* are arbitrary, but if you plan to use the pie generator in conjunction with an [arc generator](#arcs), you should specify an angle in radians, with 0 at -*y* (12 o’clock) and positive angles proceeding clockwise. + +The value of the end angle is constrained to [startAngle](#pie_startAngle) ± τ, such that |endAngle - startAngle| ≤ τ. + +# pie.padAngle([angle]) · [Source](https://github.com/d3/d3-shape/blob/master/src/pie.js) + +If *angle* is specified, sets the pad angle to the specified function or number and returns this pie generator. If *angle* is not specified, returns the current pad angle accessor, which defaults to: + +```js +function padAngle() { + return 0; +} +``` + +The pad angle here means the angular separation between each adjacent arc. The total amount of padding reserved is the specified *angle* times the number of elements in the input data array, and at most |endAngle - startAngle|; the remaining space is then divided proportionally by [value](#pie_value) such that the relative area of each arc is preserved. See the [pie padding animation](http://bl.ocks.org/mbostock/3e961b4c97a1b543fff2) for illustration. The pad angle accessor is invoked once, being passed the same arguments and `this` context as the [pie generator](#_pie). The units of *angle* are arbitrary, but if you plan to use the pie generator in conjunction with an [arc generator](#arcs), you should specify an angle in radians. + +### Lines + +[Line Chart](https://observablehq.com/@d3/line-chart) + +The line generator produces a [spline](https://en.wikipedia.org/wiki/Spline_\(mathematics\)) or [polyline](https://en.wikipedia.org/wiki/Polygonal_chain), as in a line chart. Lines also appear in many other visualization types, such as the links in [hierarchical edge bundling](https://observablehq.com/@d3/hierarchical-edge-bundling). + +# d3.line([x][, y]) · [Source](https://github.com/d3/d3-shape/blob/master/src/line.js), [Examples](https://observablehq.com/@d3/d3-line) + +Constructs a new line generator with the default settings. If *x* or *y* are specified, sets the corresponding accessors to the specified function or number and returns this line generator. + +# line(data) · [Source](https://github.com/d3/d3-shape/blob/master/src/line.js), [Examples](https://observablehq.com/@d3/d3-line) + +Generates a line for the given array of *data*. Depending on this line generator’s associated [curve](#line_curve), the given input *data* may need to be sorted by *x*-value before being passed to the line generator. If the line generator has a [context](#line_context), then the line is rendered to this context as a sequence of [path method](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls and this function returns void. Otherwise, a [path data](http://www.w3.org/TR/SVG/paths.html#PathData) string is returned. + +# line.x([x]) · [Source](https://github.com/d3/d3-shape/blob/master/src/line.js), [Examples](https://observablehq.com/@d3/d3-line) + +If *x* is specified, sets the x accessor to the specified function or number and returns this line generator. If *x* is not specified, returns the current x accessor, which defaults to: + +```js +function x(d) { + return d[0]; +} +``` + +When a line is [generated](#_line), the x accessor will be invoked for each [defined](#line_defined) element in the input data array, being passed the element `d`, the index `i`, and the array `data` as three arguments. The default x accessor assumes that the input data are two-element arrays of numbers. If your data are in a different format, or if you wish to transform the data before rendering, then you should specify a custom accessor. For example, if `x` is a [time scale](https://github.com/d3/d3-scale#time-scales) and `y` is a [linear scale](https://github.com/d3/d3-scale#linear-scales): + +```js +const data = [ + {date: new Date(2007, 3, 24), value: 93.24}, + {date: new Date(2007, 3, 25), value: 95.35}, + {date: new Date(2007, 3, 26), value: 98.84}, + {date: new Date(2007, 3, 27), value: 99.92}, + {date: new Date(2007, 3, 30), value: 99.80}, + {date: new Date(2007, 4, 1), value: 99.47}, + … +]; + +const line = d3.line() + .x(d => x(d.date)) + .y(d => y(d.value)); +``` + +# line.y([y]) · [Source](https://github.com/d3/d3-shape/blob/master/src/line.js), [Examples](https://observablehq.com/@d3/d3-line) + +If *y* is specified, sets the y accessor to the specified function or number and returns this line generator. If *y* is not specified, returns the current y accessor, which defaults to: + +```js +function y(d) { + return d[1]; +} +``` + +When a line is [generated](#_line), the y accessor will be invoked for each [defined](#line_defined) element in the input data array, being passed the element `d`, the index `i`, and the array `data` as three arguments. The default y accessor assumes that the input data are two-element arrays of numbers. See [*line*.x](#line_x) for more information. + +# line.defined([defined]) · [Source](https://github.com/d3/d3-shape/blob/master/src/line.js), [Examples](https://observablehq.com/@d3/d3-line) + +If *defined* is specified, sets the defined accessor to the specified function or boolean and returns this line generator. If *defined* is not specified, returns the current defined accessor, which defaults to: + +```js +function defined() { + return true; +} +``` + +The default accessor thus assumes that the input data is always defined. When a line is [generated](#_line), the defined accessor will be invoked for each element in the input data array, being passed the element `d`, the index `i`, and the array `data` as three arguments. If the given element is defined (*i.e.*, if the defined accessor returns a truthy value for this element), the [x](#line_x) and [y](#line_y) accessors will subsequently be evaluated and the point will be added to the current line segment. Otherwise, the element will be skipped, the current line segment will be ended, and a new line segment will be generated for the next defined point. As a result, the generated line may have several discrete segments. For example: + +[Line with Missing Data](http://bl.ocks.org/mbostock/0533f44f2cfabecc5e3a) + +Note that if a line segment consists of only a single point, it may appear invisible unless rendered with rounded or square [line caps](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap). In addition, some curves such as [curveCardinalOpen](#curveCardinalOpen) only render a visible segment if it contains multiple points. + +# line.curve([curve]) · [Source](https://github.com/d3/d3-shape/blob/master/src/line.js), [Examples](https://observablehq.com/@d3/d3-line) + +If *curve* is specified, sets the [curve factory](#curves) and returns this line generator. If *curve* is not specified, returns the current curve factory, which defaults to [curveLinear](#curveLinear). + +# line.context([context]) · [Source](https://github.com/d3/d3-shape/blob/master/src/line.js), [Examples](https://observablehq.com/@d3/d3-line) + +If *context* is specified, sets the context and returns this line generator. If *context* is not specified, returns the current context, which defaults to null. If the context is not null, then the [generated line](#_line) is rendered to this context as a sequence of [path method](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls. Otherwise, a [path data](http://www.w3.org/TR/SVG/paths.html#PathData) string representing the generated line is returned. + +# d3.lineRadial() · [Source](https://github.com/d3/d3-shape/blob/master/src/lineRadial.js), [Examples](https://observablehq.com/@d3/d3-lineradial) + +Radial Line + +Constructs a new radial line generator with the default settings. A radial line generator is equivalent to the standard Cartesian [line generator](#line), except the [x](#line_x) and [y](#line_y) accessors are replaced with [angle](#lineRadial_angle) and [radius](#lineRadial_radius) accessors. Radial lines are always positioned relative to ⟨0,0⟩; use a transform (see: [SVG](http://www.w3.org/TR/SVG/coords.html#TransformAttribute), [Canvas](http://www.w3.org/TR/2dcontext/#transformations)) to change the origin. + +# lineRadial(data) · [Source](https://github.com/d3/d3-shape/blob/master/src/lineRadial.js#L4), [Examples](https://observablehq.com/@d3/d3-lineradial) + +Equivalent to [*line*](#_line). + +# lineRadial.angle([angle]) · [Source](https://github.com/d3/d3-shape/blob/master/src/lineRadial.js#L7), [Examples](https://observablehq.com/@d3/d3-lineradial) + +Equivalent to [*line*.x](#line_x), except the accessor returns the angle in radians, with 0 at -*y* (12 o’clock). + +# lineRadial.radius([radius]) · [Source](https://github.com/d3/d3-shape/blob/master/src/lineRadial.js#L8), [Examples](https://observablehq.com/@d3/d3-lineradial) + +Equivalent to [*line*.y](#line_y), except the accessor returns the radius: the distance from the origin ⟨0,0⟩. + +# lineRadial.defined([defined]) + +Equivalent to [*line*.defined](#line_defined). + +# lineRadial.curve([curve]) · [Source](https://github.com/d3/d3-shape/blob/master/src/lineRadial.js), [Examples](https://observablehq.com/@d3/d3-lineradial) + +Equivalent to [*line*.curve](#line_curve). Note that [curveMonotoneX](#curveMonotoneX) or [curveMonotoneY](#curveMonotoneY) are not recommended for radial lines because they assume that the data is monotonic in *x* or *y*, which is typically untrue of radial lines. + +# lineRadial.context([context]) + +Equivalent to [*line*.context](#line_context). + +### Areas + +[Area Chart](https://observablehq.com/@d3/area-chart)[Stacked Area Chart](https://observablehq.com/@d3/stacked-area-chart)[Difference Chart](https://observablehq.com/@d3/difference-chart) + +The area generator produces an area, as in an area chart. An area is defined by two bounding [lines](#lines), either splines or polylines. Typically, the two lines share the same [*x*-values](#area_x) ([x0](#area_x0) = [x1](#area_x1)), differing only in *y*-value ([y0](#area_y0) and [y1](#area_y1)); most commonly, y0 is defined as a constant representing [zero](http://www.vox.com/2015/11/19/9758062/y-axis-zero-chart). The first line (the topline) is defined by x1 and y1 and is rendered first; the second line (the baseline) is defined by x0 and y0 and is rendered second, with the points in reverse order. With a [curveLinear](#curveLinear) [curve](#area_curve), this produces a clockwise polygon. + +# d3.area([x][, y0][, y1]) · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +Constructs a new area generator with the default settings. If *x*, *y0* or *y1* are specified, sets the corresponding accessors to the specified function or number and returns this area generator. + +# area(data) · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +Generates an area for the given array of *data*. Depending on this area generator’s associated [curve](#area_curve), the given input *data* may need to be sorted by *x*-value before being passed to the area generator. If the area generator has a [context](#line_context), then the area is rendered to this context as a sequence of [path method](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls and this function returns void. Otherwise, a [path data](http://www.w3.org/TR/SVG/paths.html#PathData) string is returned. + +# area.x([x]) · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +If *x* is specified, sets [x0](#area_x0) to *x* and [x1](#area_x1) to null and returns this area generator. If *x* is not specified, returns the current x0 accessor. + +# area.x0([x]) · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +If *x* is specified, sets the x0 accessor to the specified function or number and returns this area generator. If *x* is not specified, returns the current x0 accessor, which defaults to: + +```js +function x(d) { + return d[0]; +} +``` + +When an area is [generated](#_area), the x0 accessor will be invoked for each [defined](#area_defined) element in the input data array, being passed the element `d`, the index `i`, and the array `data` as three arguments. The default x0 accessor assumes that the input data are two-element arrays of numbers. If your data are in a different format, or if you wish to transform the data before rendering, then you should specify a custom accessor. For example, if `x` is a [time scale](https://github.com/d3/d3-scale#time-scales) and `y` is a [linear scale](https://github.com/d3/d3-scale#linear-scales): + +```js +const data = [ + {date: new Date(2007, 3, 24), value: 93.24}, + {date: new Date(2007, 3, 25), value: 95.35}, + {date: new Date(2007, 3, 26), value: 98.84}, + {date: new Date(2007, 3, 27), value: 99.92}, + {date: new Date(2007, 3, 30), value: 99.80}, + {date: new Date(2007, 4, 1), value: 99.47}, + … +]; + +const area = d3.area() + .x(d => x(d.date)) + .y1(d => y(d.value)) + .y0(y(0)); +``` + +# area.x1([x]) · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +If *x* is specified, sets the x1 accessor to the specified function or number and returns this area generator. If *x* is not specified, returns the current x1 accessor, which defaults to null, indicating that the previously-computed [x0](#area_x0) value should be reused for the x1 value. + +When an area is [generated](#_area), the x1 accessor will be invoked for each [defined](#area_defined) element in the input data array, being passed the element `d`, the index `i`, and the array `data` as three arguments. See [*area*.x0](#area_x0) for more information. + +# area.y([y]) · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +If *y* is specified, sets [y0](#area_y0) to *y* and [y1](#area_y1) to null and returns this area generator. If *y* is not specified, returns the current y0 accessor. + +# area.y0([y]) · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +If *y* is specified, sets the y0 accessor to the specified function or number and returns this area generator. If *y* is not specified, returns the current y0 accessor, which defaults to: + +```js +function y() { + return 0; +} +``` + +When an area is [generated](#_area), the y0 accessor will be invoked for each [defined](#area_defined) element in the input data array, being passed the element `d`, the index `i`, and the array `data` as three arguments. See [*area*.x0](#area_x0) for more information. + +# area.y1([y]) · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +If *y* is specified, sets the y1 accessor to the specified function or number and returns this area generator. If *y* is not specified, returns the current y1 accessor, which defaults to: + +```js +function y(d) { + return d[1]; +} +``` + +A null accessor is also allowed, indicating that the previously-computed [y0](#area_y0) value should be reused for the y1 value. When an area is [generated](#_area), the y1 accessor will be invoked for each [defined](#area_defined) element in the input data array, being passed the element `d`, the index `i`, and the array `data` as three arguments. See [*area*.x0](#area_x0) for more information. + +# area.defined([defined]) · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +If *defined* is specified, sets the defined accessor to the specified function or boolean and returns this area generator. If *defined* is not specified, returns the current defined accessor, which defaults to: + +```js +function defined() { + return true; +} +``` + +The default accessor thus assumes that the input data is always defined. When an area is [generated](#_area), the defined accessor will be invoked for each element in the input data array, being passed the element `d`, the index `i`, and the array `data` as three arguments. If the given element is defined (*i.e.*, if the defined accessor returns a truthy value for this element), the [x0](#area_x0), [x1](#area_x1), [y0](#area_y0) and [y1](#area_y1) accessors will subsequently be evaluated and the point will be added to the current area segment. Otherwise, the element will be skipped, the current area segment will be ended, and a new area segment will be generated for the next defined point. As a result, the generated area may have several discrete segments. For example: + +[Area with Missing Data](http://bl.ocks.org/mbostock/3035090) + +Note that if an area segment consists of only a single point, it may appear invisible unless rendered with rounded or square [line caps](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap). In addition, some curves such as [curveCardinalOpen](#curveCardinalOpen) only render a visible segment if it contains multiple points. + +# area.curve([curve]) · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +If *curve* is specified, sets the [curve factory](#curves) and returns this area generator. If *curve* is not specified, returns the current curve factory, which defaults to [curveLinear](#curveLinear). + +# area.context([context]) · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +If *context* is specified, sets the context and returns this area generator. If *context* is not specified, returns the current context, which defaults to null. If the context is not null, then the [generated area](#_area) is rendered to this context as a sequence of [path method](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls. Otherwise, a [path data](http://www.w3.org/TR/SVG/paths.html#PathData) string representing the generated area is returned. + +# area.lineX0() · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) +
# area.lineY0() · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +Returns a new [line generator](#lines) that has this area generator’s current [defined accessor](#area_defined), [curve](#area_curve) and [context](#area_context). The line’s [*x*-accessor](#line_x) is this area’s [*x0*-accessor](#area_x0), and the line’s [*y*-accessor](#line_y) is this area’s [*y0*-accessor](#area_y0). + +# area.lineX1() · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +Returns a new [line generator](#lines) that has this area generator’s current [defined accessor](#area_defined), [curve](#area_curve) and [context](#area_context). The line’s [*x*-accessor](#line_x) is this area’s [*x1*-accessor](#area_x1), and the line’s [*y*-accessor](#line_y) is this area’s [*y0*-accessor](#area_y0). + +# area.lineY1() · [Source](https://github.com/d3/d3-shape/blob/master/src/area.js) + +Returns a new [line generator](#lines) that has this area generator’s current [defined accessor](#area_defined), [curve](#area_curve) and [context](#area_context). The line’s [*x*-accessor](#line_x) is this area’s [*x0*-accessor](#area_x0), and the line’s [*y*-accessor](#line_y) is this area’s [*y1*-accessor](#area_y1). + +# d3.areaRadial() · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) + +Radial Area + +Constructs a new radial area generator with the default settings. A radial area generator is equivalent to the standard Cartesian [area generator](#area), except the [x](#area_x) and [y](#area_y) accessors are replaced with [angle](#areaRadial_angle) and [radius](#areaRadial_radius) accessors. Radial areas are always positioned relative to ⟨0,0⟩; use a transform (see: [SVG](http://www.w3.org/TR/SVG/coords.html#TransformAttribute), [Canvas](http://www.w3.org/TR/2dcontext/#transformations)) to change the origin. + +# areaRadial(data) + +Equivalent to [*area*](#_area). + +# areaRadial.angle([angle]) · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) + +Equivalent to [*area*.x](#area_x), except the accessor returns the angle in radians, with 0 at -*y* (12 o’clock). + +# areaRadial.startAngle([angle]) · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) + +Equivalent to [*area*.x0](#area_x0), except the accessor returns the angle in radians, with 0 at -*y* (12 o’clock). Note: typically [angle](#areaRadial_angle) is used instead of setting separate start and end angles. + +# areaRadial.endAngle([angle]) · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) + +Equivalent to [*area*.x1](#area_x1), except the accessor returns the angle in radians, with 0 at -*y* (12 o’clock). Note: typically [angle](#areaRadial_angle) is used instead of setting separate start and end angles. + +# areaRadial.radius([radius]) · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) + +Equivalent to [*area*.y](#area_y), except the accessor returns the radius: the distance from the origin ⟨0,0⟩. + +# areaRadial.innerRadius([radius]) · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) + +Equivalent to [*area*.y0](#area_y0), except the accessor returns the radius: the distance from the origin ⟨0,0⟩. + +# areaRadial.outerRadius([radius]) · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) + +Equivalent to [*area*.y1](#area_y1), except the accessor returns the radius: the distance from the origin ⟨0,0⟩. + +# areaRadial.defined([defined]) + +Equivalent to [*area*.defined](#area_defined). + +# areaRadial.curve([curve]) · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) + +Equivalent to [*area*.curve](#area_curve). Note that [curveMonotoneX](#curveMonotoneX) or [curveMonotoneY](#curveMonotoneY) are not recommended for radial areas because they assume that the data is monotonic in *x* or *y*, which is typically untrue of radial areas. + +# areaRadial.context([context]) + +Equivalent to [*line*.context](#line_context). + +# areaRadial.lineStartAngle() · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) +
# areaRadial.lineInnerRadius() · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) + +Returns a new [radial line generator](#lineRadial) that has this radial area generator’s current [defined accessor](#areaRadial_defined), [curve](#areaRadial_curve) and [context](#areaRadial_context). The line’s [angle accessor](#lineRadial_angle) is this area’s [start angle accessor](#areaRadial_startAngle), and the line’s [radius accessor](#lineRadial_radius) is this area’s [inner radius accessor](#areaRadial_innerRadius). + +# areaRadial.lineEndAngle() · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) + +Returns a new [radial line generator](#lineRadial) that has this radial area generator’s current [defined accessor](#areaRadial_defined), [curve](#areaRadial_curve) and [context](#areaRadial_context). The line’s [angle accessor](#lineRadial_angle) is this area’s [end angle accessor](#areaRadial_endAngle), and the line’s [radius accessor](#lineRadial_radius) is this area’s [inner radius accessor](#areaRadial_innerRadius). + +# areaRadial.lineOuterRadius() · [Source](https://github.com/d3/d3-shape/blob/master/src/areaRadial.js) + +Returns a new [radial line generator](#lineRadial) that has this radial area generator’s current [defined accessor](#areaRadial_defined), [curve](#areaRadial_curve) and [context](#areaRadial_context). The line’s [angle accessor](#lineRadial_angle) is this area’s [start angle accessor](#areaRadial_startAngle), and the line’s [radius accessor](#lineRadial_radius) is this area’s [outer radius accessor](#areaRadial_outerRadius). + +### Curves + +While [lines](#lines) are defined as a sequence of two-dimensional [*x*, *y*] points, and [areas](#areas) are similarly defined by a topline and a baseline, there remains the task of transforming this discrete representation into a continuous shape: *i.e.*, how to interpolate between the points. A variety of curves are provided for this purpose. + +Curves are typically not constructed or used directly, instead being passed to [*line*.curve](#line_curve) and [*area*.curve](#area_curve). For example: + +```js +const line = d3.line(d => d.date, d => d.value) + .curve(d3.curveCatmullRom.alpha(0.5)); +``` + +# d3.curveBasis(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/basis.js) + +basis + +Produces a cubic [basis spline](https://en.wikipedia.org/wiki/B-spline) using the specified control points. The first and last points are triplicated such that the spline starts at the first point and ends at the last point, and is tangent to the line between the first and second points, and to the line between the penultimate and last points. + +# d3.curveBasisClosed(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/basisClosed.js) + +basisClosed + +Produces a closed cubic [basis spline](https://en.wikipedia.org/wiki/B-spline) using the specified control points. When a line segment ends, the first three control points are repeated, producing a closed loop with C2 continuity. + +# d3.curveBasisOpen(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/basisOpen.js) + +basisOpen + +Produces a cubic [basis spline](https://en.wikipedia.org/wiki/B-spline) using the specified control points. Unlike [basis](#basis), the first and last points are not repeated, and thus the curve typically does not intersect these points. + +# d3.curveBumpX(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/bump.js) + +bumpX + +Produces a Bézier curve between each pair of points, with horizontal tangents at each point. + +# d3.curveBumpY(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/bump.js) + +bumpY + +Produces a Bézier curve between each pair of points, with vertical tangents at each point. + +# d3.curveBundle(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/bundle.js) + +bundle + +Produces a straightened cubic [basis spline](https://en.wikipedia.org/wiki/B-spline) using the specified control points, with the spline straightened according to the curve’s [*beta*](#curveBundle_beta), which defaults to 0.85. This curve is typically used in [hierarchical edge bundling](https://observablehq.com/@d3/hierarchical-edge-bundling) to disambiguate connections, as proposed by [Danny Holten](https://www.win.tue.nl/vis1/home/dholten/) in [Hierarchical Edge Bundles: Visualization of Adjacency Relations in Hierarchical Data](https://www.win.tue.nl/vis1/home/dholten/papers/bundles_infovis.pdf). This curve does not implement [*curve*.areaStart](#curve_areaStart) and [*curve*.areaEnd](#curve_areaEnd); it is intended to work with [d3.line](#lines), not [d3.area](#areas). + +# bundle.beta(beta) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/bundle.js) + +Returns a bundle curve with the specified *beta* in the range [0, 1], representing the bundle strength. If *beta* equals zero, a straight line between the first and last point is produced; if *beta* equals one, a standard [basis](#basis) spline is produced. For example: + +```js +const line = d3.line().curve(d3.curveBundle.beta(0.5)); +``` + +# d3.curveCardinal(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/cardinal.js) + +cardinal + +Produces a cubic [cardinal spline](https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Cardinal_spline) using the specified control points, with one-sided differences used for the first and last piece. The default [tension](#curveCardinal_tension) is 0. + +# d3.curveCardinalClosed(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/cardinalClosed.js) + +cardinalClosed + +Produces a closed cubic [cardinal spline](https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Cardinal_spline) using the specified control points. When a line segment ends, the first three control points are repeated, producing a closed loop. The default [tension](#curveCardinal_tension) is 0. + +# d3.curveCardinalOpen(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/cardinalOpen.js) + +cardinalOpen + +Produces a cubic [cardinal spline](https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Cardinal_spline) using the specified control points. Unlike [curveCardinal](#curveCardinal), one-sided differences are not used for the first and last piece, and thus the curve starts at the second point and ends at the penultimate point. The default [tension](#curveCardinal_tension) is 0. + +# cardinal.tension(tension) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/cardinalOpen.js) + +Returns a cardinal curve with the specified *tension* in the range [0, 1]. The *tension* determines the length of the tangents: a *tension* of one yields all zero tangents, equivalent to [curveLinear](#curveLinear); a *tension* of zero produces a uniform [Catmull–Rom](#curveCatmullRom) spline. For example: + +```js +const line = d3.line().curve(d3.curveCardinal.tension(0.5)); +``` + +# d3.curveCatmullRom(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/catmullRom.js) + +catmullRom + +Produces a cubic Catmull–Rom spline using the specified control points and the parameter [*alpha*](#curveCatmullRom_alpha), which defaults to 0.5, as proposed by Yuksel et al. in [On the Parameterization of Catmull–Rom Curves](http://www.cemyuksel.com/research/catmullrom_param/), with one-sided differences used for the first and last piece. + +# d3.curveCatmullRomClosed(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/catmullRomClosed.js) + +catmullRomClosed + +Produces a closed cubic Catmull–Rom spline using the specified control points and the parameter [*alpha*](#curveCatmullRom_alpha), which defaults to 0.5, as proposed by Yuksel et al. When a line segment ends, the first three control points are repeated, producing a closed loop. + +# d3.curveCatmullRomOpen(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/catmullRomOpen.js) + +catmullRomOpen + +Produces a cubic Catmull–Rom spline using the specified control points and the parameter [*alpha*](#curveCatmullRom_alpha), which defaults to 0.5, as proposed by Yuksel et al. Unlike [curveCatmullRom](#curveCatmullRom), one-sided differences are not used for the first and last piece, and thus the curve starts at the second point and ends at the penultimate point. + +# catmullRom.alpha(alpha) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/catmullRom.js) + +Returns a cubic Catmull–Rom curve with the specified *alpha* in the range [0, 1]. If *alpha* is zero, produces a uniform spline, equivalent to [curveCardinal](#curveCardinal) with a tension of zero; if *alpha* is one, produces a chordal spline; if *alpha* is 0.5, produces a [centripetal spline](https://en.wikipedia.org/wiki/Centripetal_Catmull–Rom_spline). Centripetal splines are recommended to avoid self-intersections and overshoot. For example: + +```js +const line = d3.line().curve(d3.curveCatmullRom.alpha(0.5)); +``` + +# d3.curveLinear(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/linear.js) + +linear + +Produces a polyline through the specified points. + +# d3.curveLinearClosed(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/linearClosed.js) + +linearClosed + +Produces a closed polyline through the specified points by repeating the first point when the line segment ends. + +# d3.curveMonotoneX(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/monotone.js) + +monotoneX + +Produces a cubic spline that [preserves monotonicity](https://en.wikipedia.org/wiki/Monotone_cubic_interpolation) in *y*, assuming monotonicity in *x*, as proposed by Steffen in [A simple method for monotonic interpolation in one dimension](http://adsabs.harvard.edu/full/1990A%26A...239..443S): “a smooth curve with continuous first-order derivatives that passes through any given set of data points without spurious oscillations. Local extrema can occur only at grid points where they are given by the data, but not in between two adjacent grid points.†+ +# d3.curveMonotoneY(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/monotone.js) + +monotoneY + +Produces a cubic spline that [preserves monotonicity](https://en.wikipedia.org/wiki/Monotone_cubic_interpolation) in *x*, assuming monotonicity in *y*, as proposed by Steffen in [A simple method for monotonic interpolation in one dimension](http://adsabs.harvard.edu/full/1990A%26A...239..443S): “a smooth curve with continuous first-order derivatives that passes through any given set of data points without spurious oscillations. Local extrema can occur only at grid points where they are given by the data, but not in between two adjacent grid points.†+ +# d3.curveNatural(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/natural.js) + +natural + +Produces a [natural](https://en.wikipedia.org/wiki/Spline_interpolation) [cubic spline](http://mathworld.wolfram.com/CubicSpline.html) with the second derivative of the spline set to zero at the endpoints. + +# d3.curveStep(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/step.js) + +step + +Produces a piecewise constant function (a [step function](https://en.wikipedia.org/wiki/Step_function)) consisting of alternating horizontal and vertical lines. The *y*-value changes at the midpoint of each pair of adjacent *x*-values. + +# d3.curveStepAfter(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/step.js) + +stepAfter + +Produces a piecewise constant function (a [step function](https://en.wikipedia.org/wiki/Step_function)) consisting of alternating horizontal and vertical lines. The *y*-value changes after the *x*-value. + +# d3.curveStepBefore(context) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/step.js) + +stepBefore + +Produces a piecewise constant function (a [step function](https://en.wikipedia.org/wiki/Step_function)) consisting of alternating horizontal and vertical lines. The *y*-value changes before the *x*-value. + +### Custom Curves + +Curves are typically not used directly, instead being passed to [*line*.curve](#line_curve) and [*area*.curve](#area_curve). However, you can define your own curve implementation should none of the built-in curves satisfy your needs using the following interface. You can also use this low-level interface with a built-in curve type as an alternative to the line and area generators. + +# curve.areaStart() · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/step.js#L7) + +Indicates the start of a new area segment. Each area segment consists of exactly two [line segments](#curve_lineStart): the topline, followed by the baseline, with the baseline points in reverse order. + +# curve.areaEnd() · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/step.js) + +Indicates the end of the current area segment. + +# curve.lineStart() · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/step.js) + +Indicates the start of a new line segment. Zero or more [points](#curve_point) will follow. + +# curve.lineEnd() · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/step.js) + +Indicates the end of the current line segment. + +# curve.point(x, y) · [Source](https://github.com/d3/d3-shape/blob/master/src/curve/step.js) + +Indicates a new point in the current line segment with the given *x*- and *y*-values. + +### Links + +[Tidy Tree](https://observablehq.com/@d3/tidy-tree) + +The **link** shape generates a smooth cubic Bézier curve from a source point to a target point. The tangents of the curve at the start and end are either [vertical](#linkVertical), [horizontal](#linkHorizontal) or [radial](#linkRadial). + +# d3.linkVertical() · [Source](https://github.com/d3/d3-shape/blob/master/src/link/index.js) + +Returns a new [link generator](#_link) with vertical tangents. For example, to visualize [links](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_links) in a [tree diagram](https://github.com/d3/d3-hierarchy/blob/master/README.md#tree) rooted on the top edge of the display, you might say: + +```js +const link = d3.linkVertical() + .x(d => d.x) + .y(d => d.y); +``` + +# d3.linkHorizontal() · [Source](https://github.com/d3/d3-shape/blob/master/src/link/index.js) + +Returns a new [link generator](#_link) with horizontal tangents. For example, to visualize [links](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_links) in a [tree diagram](https://github.com/d3/d3-hierarchy/blob/master/README.md#tree) rooted on the left edge of the display, you might say: + +```js +const link = d3.linkHorizontal() + .x(d => d.y) + .y(d => d.x); +``` + +# link(arguments…) · [Source](https://github.com/d3/d3-shape/blob/master/src/link/index.js) + +Generates a link for the given *arguments*. The *arguments* are arbitrary; they are simply propagated to the link generator’s accessor functions along with the `this` object. For example, with the default settings, an object expected: + +```js +link({ + source: [100, 100], + target: [300, 300] +}); +``` + +# link.source([source]) · [Source](https://github.com/d3/d3-shape/blob/master/src/link/index.js) + +If *source* is specified, sets the source accessor to the specified function and returns this link generator. If *source* is not specified, returns the current source accessor, which defaults to: + +```js +function source(d) { + return d.source; +} +``` + +# link.target([target]) · [Source](https://github.com/d3/d3-shape/blob/master/src/link/index.js) + +If *target* is specified, sets the target accessor to the specified function and returns this link generator. If *target* is not specified, returns the current target accessor, which defaults to: + +```js +function target(d) { + return d.target; +} +``` + +# link.x([x]) · [Source](https://github.com/d3/d3-shape/blob/master/src/link/index.js) + +If *x* is specified, sets the *x*-accessor to the specified function or number and returns this link generator. If *x* is not specified, returns the current *x*-accessor, which defaults to: + +```js +function x(d) { + return d[0]; +} +``` + +# link.y([y]) · [Source](https://github.com/d3/d3-shape/blob/master/src/link/index.js) + +If *y* is specified, sets the *y*-accessor to the specified function or number and returns this link generator. If *y* is not specified, returns the current *y*-accessor, which defaults to: + +```js +function y(d) { + return d[1]; +} +``` + +# link.context([context]) · [Source](https://github.com/d3/d3-shape/blob/master/src/link/index.js) + +If *context* is specified, sets the context and returns this link generator. If *context* is not specified, returns the current context, which defaults to null. If the context is not null, then the [generated link](#_link) is rendered to this context as a sequence of [path method](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls. Otherwise, a [path data](http://www.w3.org/TR/SVG/paths.html#PathData) string representing the generated link is returned. See also [d3-path](https://github.com/d3/d3-path). + +# d3.linkRadial() · [Source](https://github.com/d3/d3-shape/blob/master/src/link/index.js) + +Returns a new [link generator](#_link) with radial tangents. For example, to visualize [links](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_links) in a [tree diagram](https://github.com/d3/d3-hierarchy/blob/master/README.md#tree) rooted in the center of the display, you might say: + +```js +const link = d3.linkRadial() + .angle(d => d.x) + .radius(d => d.y); +``` + +# linkRadial.angle([angle]) · [Source](https://github.com/d3/d3-shape/blob/master/src/link/index.js) + +Equivalent to [*link*.x](#link_x), except the accessor returns the angle in radians, with 0 at -*y* (12 o’clock). + +# linkRadial.radius([radius]) · [Source](https://github.com/d3/d3-shape/blob/master/src/link/index.js) + +Equivalent to [*link*.y](#link_y), except the accessor returns the radius: the distance from the origin ⟨0,0⟩. + +### Symbols + + + +Symbols provide a categorical shape encoding as is commonly used in scatterplots. Symbols are always centered at ⟨0,0⟩; use a transform (see: [SVG](http://www.w3.org/TR/SVG/coords.html#TransformAttribute), [Canvas](http://www.w3.org/TR/2dcontext/#transformations)) to move the symbol to a different position. + +# d3.symbol([type][, size]) · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +Constructs a new symbol generator of the specified [type](#symbol_type) and [size](#symbol_size). If not specified, *type* defaults to a circle, and *size* defaults to 64. + +# symbol(arguments…) · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +Generates a symbol for the given *arguments*. The *arguments* are arbitrary; they are simply propagated to the symbol generator’s accessor functions along with the `this` object. For example, with the default settings, no arguments are needed to produce a circle with area 64 square pixels. If the symbol generator has a [context](#symbol_context), then the symbol is rendered to this context as a sequence of [path method](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls and this function returns void. Otherwise, a [path data](http://www.w3.org/TR/SVG/paths.html#PathData) string is returned. + +# symbol.type([type]) · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +If *type* is specified, sets the symbol type to the specified function or symbol type and returns this symbol generator. If *type* is a function, the symbol generator’s arguments and *this* are passed through. (See [*selection*.attr](https://github.com/d3/d3-selection/blob/master/README.md#selection_attr) if you are using d3-selection.) If *type* is not specified, returns the current symbol type accessor, which defaults to: + +```js +function type() { + return circle; +} +``` + +See [symbols](#symbols) for the set of built-in symbol types. To implement a custom symbol type, pass an object that implements [*symbolType*.draw](#symbolType_draw). + +# symbol.size([size]) · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +If *size* is specified, sets the size to the specified function or number and returns this symbol generator. If *size* is a function, the symbol generator’s arguments and *this* are passed through. (See [*selection*.attr](https://github.com/d3/d3-selection/blob/master/README.md#selection_attr) if you are using d3-selection.) If *size* is not specified, returns the current size accessor, which defaults to: + +```js +function size() { + return 64; +} +``` + +Specifying the size as a function is useful for constructing a scatterplot with a size encoding. If you wish to scale the symbol to fit a given bounding box, rather than by area, try [SVG’s getBBox](https://observablehq.com/d/1fac2626b9e1b65f). + +# symbol.context([context]) · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol.js) + +If *context* is specified, sets the context and returns this symbol generator. If *context* is not specified, returns the current context, which defaults to null. If the context is not null, then the [generated symbol](#_symbol) is rendered to this context as a sequence of [path method](http://www.w3.org/TR/2dcontext/#canvaspathmethods) calls. Otherwise, a [path data](http://www.w3.org/TR/SVG/paths.html#PathData) string representing the generated symbol is returned. + +# d3.symbols · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +An array containing the set of all built-in symbol types: [circle](#symbolCircle), [cross](#symbolCross), [diamond](#symbolDiamond), [square](#symbolSquare), [star](#symbolStar), [triangle](#symbolTriangle), and [wye](#symbolWye). Useful for constructing the range of an [ordinal scale](https://github.com/d3/d3-scale#ordinal-scales) should you wish to use a shape encoding for categorical data. + +# d3.symbolCircle · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol/circle.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +The circle symbol type. + +# d3.symbolCross · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol/cross.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +The Greek cross symbol type, with arms of equal length. + +# d3.symbolDiamond · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol/diamond.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +The rhombus symbol type. + +# d3.symbolSquare · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol/square.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +The square symbol type. + +# d3.symbolStar · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol/star.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +The pentagonal star (pentagram) symbol type. + +# d3.symbolTriangle · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol/triangle.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +The up-pointing triangle symbol type. + +# d3.symbolWye · [Source](https://github.com/d3/d3-shape/blob/master/src/symbol/wye.js), [Examples](https://observablehq.com/@d3/fitted-symbols) + +The Y-shape symbol type. + +# d3.pointRadial(angle, radius) · [Source](https://github.com/d3/d3-shape/blob/master/src/pointRadial.js), [Examples](https://observablehq.com/@d3/radial-area-chart) + +Returns the point [x, y] for the given *angle* in radians, with 0 at -*y* (12 o’clock) and positive angles proceeding clockwise, and the given *radius*. + +### Custom Symbol Types + +Symbol types are typically not used directly, instead being passed to [*symbol*.type](#symbol_type). However, you can define your own symbol type implementation should none of the built-in types satisfy your needs using the following interface. You can also use this low-level interface with a built-in symbol type as an alternative to the symbol generator. + +# symbolType.draw(context, size) + +Renders this symbol type to the specified *context* with the specified *size* in square pixels. The *context* implements the [CanvasPathMethods](http://www.w3.org/TR/2dcontext/#canvaspathmethods) interface. (Note that this is a subset of the CanvasRenderingContext2D interface!) + +### Stacks + +[Stacked Bar Chart](https://observablehq.com/@d3/stacked-bar-chart)[Streamgraph](https://observablehq.com/@mbostock/streamgraph-transitions) + +Some shape types can be stacked, placing one shape adjacent to another. For example, a bar chart of monthly sales might be broken down into a multi-series bar chart by product category, stacking bars vertically. This is equivalent to subdividing a bar chart by an ordinal dimension (such as product category) and applying a color encoding. + +Stacked charts can show overall value and per-category value simultaneously; however, it is typically harder to compare across categories, as only the bottom layer of the stack is aligned. So, chose the [stack order](#stack_order) carefully, and consider a [streamgraph](#stackOffsetWiggle). (See also [grouped charts](https://observablehq.com/@d3/grouped-bar-chart).) + +Like the [pie generator](#pies), the stack generator does not produce a shape directly. Instead it computes positions which you can then pass to an [area generator](#areas) or use directly, say to position bars. + +# d3.stack() · [Source](https://github.com/d3/d3-shape/blob/master/src/stack.js) + +Constructs a new stack generator with the default settings. + +# stack(data[, arguments…]) · [Source](https://github.com/d3/d3-shape/blob/master/src/stack.js) + +Generates a stack for the given array of *data*, returning an array representing each series. Any additional *arguments* are arbitrary; they are simply propagated to accessors along with the `this` object. + +The series are determined by the [keys accessor](#stack_keys); each series *i* in the returned array corresponds to the *i*th key. Each series is an array of points, where each point *j* corresponds to the *j*th element in the input *data*. Lastly, each point is represented as an array [*y0*, *y1*] where *y0* is the lower value (baseline) and *y1* is the upper value (topline); the difference between *y0* and *y1* corresponds to the computed [value](#stack_value) for this point. The key for each series is available as *series*.key, and the [index](#stack_order) as *series*.index. The input data element for each point is available as *point*.data. + +For example, consider the following table representing monthly sales of fruits: + +Month | Apples | Bananas | Cherries | Dates +--------|--------|---------|----------|------- + 1/2015 | 3840 | 1920 | 960 | 400 + 2/2015 | 1600 | 1440 | 960 | 400 + 3/2015 | 640 | 960 | 640 | 400 + 4/2015 | 320 | 480 | 640 | 400 + +This might be represented in JavaScript as an array of objects: + +```js +const data = [ + {month: new Date(2015, 0, 1), apples: 3840, bananas: 1920, cherries: 960, dates: 400}, + {month: new Date(2015, 1, 1), apples: 1600, bananas: 1440, cherries: 960, dates: 400}, + {month: new Date(2015, 2, 1), apples: 640, bananas: 960, cherries: 640, dates: 400}, + {month: new Date(2015, 3, 1), apples: 320, bananas: 480, cherries: 640, dates: 400} +]; +``` + +To produce a stack for this data: + +```js +const stack = d3.stack() + .keys(["apples", "bananas", "cherries", "dates"]) + .order(d3.stackOrderNone) + .offset(d3.stackOffsetNone); + +const series = stack(data); +``` + +The resulting array has one element per *series*. Each series has one point per month, and each point has a lower and upper value defining the baseline and topline: + +```js +[ + [[ 0, 3840], [ 0, 1600], [ 0, 640], [ 0, 320]], // apples + [[3840, 5760], [1600, 3040], [ 640, 1600], [ 320, 800]], // bananas + [[5760, 6720], [3040, 4000], [1600, 2240], [ 800, 1440]], // cherries + [[6720, 7120], [4000, 4400], [2240, 2640], [1440, 1840]], // dates +] +``` + +Each series in then typically passed to an [area generator](#areas) to render an area chart, or used to construct rectangles for a bar chart. + +# stack.keys([keys]) · [Source](https://github.com/d3/d3-shape/blob/master/src/stack.js) + +If *keys* is specified, sets the keys accessor to the specified function or array and returns this stack generator. If *keys* is not specified, returns the current keys accessor, which defaults to the empty array. A series (layer) is [generated](#_stack) for each key. Keys are typically strings, but they may be arbitrary values. The series’ key is passed to the [value accessor](#stack_value), along with each data point, to compute the point’s value. + +# stack.value([value]) · [Source](https://github.com/d3/d3-shape/blob/master/src/stack.js) + +If *value* is specified, sets the value accessor to the specified function or number and returns this stack generator. If *value* is not specified, returns the current value accessor, which defaults to: + +```js +function value(d, key) { + return d[key]; +} +``` + +Thus, by default the stack generator assumes that the input data is an array of objects, with each object exposing named properties with numeric values; see [*stack*](#_stack) for an example. + +# stack.order([order]) · [Source](https://github.com/d3/d3-shape/blob/master/src/stack.js) + +If *order* is specified, sets the order accessor to the specified function or array and returns this stack generator. If *order* is not specified, returns the current order accessor, which defaults to [stackOrderNone](#stackOrderNone); this uses the order given by the [key accessor](#stack_key). See [stack orders](#stack-orders) for the built-in orders. + +If *order* is a function, it is passed the generated series array and must return an array of numeric indexes representing the stack order. For example, the default order is defined as: + +```js +function orderNone(series) { + let n = series.length; + const o = new Array(n); + while (--n >= 0) o[n] = n; + return o; +} +``` + +The stack order is computed prior to the [offset](#stack_offset); thus, the lower value for all points is zero at the time the order is computed. The index attribute for each series is also not set until after the order is computed. + +# stack.offset([offset]) · [Source](https://github.com/d3/d3-shape/blob/master/src/stack.js) + +If *offset* is specified, sets the offset accessor to the specified function and returns this stack generator. If *offset* is not specified, returns the current offset acccesor, which defaults to [stackOffsetNone](#stackOffsetNone); this uses a zero baseline. See [stack offsets](#stack-offsets) for the built-in offsets. + +The offset function is passed the generated series array and the order index array; it is then responsible for updating the lower and upper values in the series array. For example, the default offset is defined as: + +```js +function offsetNone(series, order) { + if (!((n = series.length) > 1)) return; + for (let i = 1, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (let j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = s0[j][1]; + } + } +} +``` + +### Stack Orders + +Stack orders are typically not used directly, but are instead passed to [*stack*.order](#stack_order). + +# d3.stackOrderAppearance(series) · [Source](https://github.com/d3/d3-shape/blob/master/src/order/appearance.js) + +Returns a series order such that the earliest series (according to the maximum value) is at the bottom. + +# d3.stackOrderAscending(series) · [Source](https://github.com/d3/d3-shape/blob/master/src/order/ascending.js) + +Returns a series order such that the smallest series (according to the sum of values) is at the bottom. + +# d3.stackOrderDescending(series) · [Source](https://github.com/d3/d3-shape/blob/master/src/order/descending.js) + +Returns a series order such that the largest series (according to the sum of values) is at the bottom. + +# d3.stackOrderInsideOut(series) · [Source](https://github.com/d3/d3-shape/blob/master/src/order/insideOut.js) + +Returns a series order such that the earliest series (according to the maximum value) are on the inside and the later series are on the outside. This order is recommended for streamgraphs in conjunction with the [wiggle offset](#stackOffsetWiggle). See [Stacked Graphs—Geometry & Aesthetics](http://leebyron.com/streamgraph/) by Byron & Wattenberg for more information. + +# d3.stackOrderNone(series) · [Source](https://github.com/d3/d3-shape/blob/master/src/order/none.js) + +Returns the given series order [0, 1, … *n* - 1] where *n* is the number of elements in *series*. Thus, the stack order is given by the [key accessor](#stack_keys). + +# d3.stackOrderReverse(series) · [Source](https://github.com/d3/d3-shape/blob/master/src/order/reverse.js) + +Returns the reverse of the given series order [*n* - 1, *n* - 2, … 0] where *n* is the number of elements in *series*. Thus, the stack order is given by the reverse of the [key accessor](#stack_keys). + +### Stack Offsets + +Stack offsets are typically not used directly, but are instead passed to [*stack*.offset](#stack_offset). + +# d3.stackOffsetExpand(series, order) · [Source](https://github.com/d3/d3-shape/blob/master/src/offset/expand.js) + +Applies a zero baseline and normalizes the values for each point such that the topline is always one. + +# d3.stackOffsetDiverging(series, order) · [Source](https://github.com/d3/d3-shape/blob/master/src/offset/diverging.js) + +Positive values are stacked above zero, negative values are [stacked below zero](https://bl.ocks.org/mbostock/b5935342c6d21928111928401e2c8608), and zero values are stacked at zero. + +# d3.stackOffsetNone(series, order) · [Source](https://github.com/d3/d3-shape/blob/master/src/offset/none.js) + +Applies a zero baseline. + +# d3.stackOffsetSilhouette(series, order) · [Source](https://github.com/d3/d3-shape/blob/master/src/offset/silhouette.js) + +Shifts the baseline down such that the center of the streamgraph is always at zero. + +# d3.stackOffsetWiggle(series, order) · [Source](https://github.com/d3/d3-shape/blob/master/src/offset/wiggle.js) + +Shifts the baseline so as to minimize the weighted wiggle of layers. This offset is recommended for streamgraphs in conjunction with the [inside-out order](#stackOrderInsideOut). See [Stacked Graphs—Geometry & Aesthetics](http://leebyron.com/streamgraph/) by Bryon & Wattenberg for more information. diff --git a/node_modules/d3-shape/dist/d3-shape.js b/node_modules/d3-shape/dist/d3-shape.js new file mode 100644 index 00000000..cb6f4157 --- /dev/null +++ b/node_modules/d3-shape/dist/d3-shape.js @@ -0,0 +1,2006 @@ +// https://d3js.org/d3-shape/ v2.1.0 Copyright 2021 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-path')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-path'], factory) : +(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3 = global.d3 || {}, global.d3)); +}(this, (function (exports, d3Path) { 'use strict'; + +function constant(x) { + return function constant() { + return x; + }; +} + +var abs = Math.abs; +var atan2 = Math.atan2; +var cos = Math.cos; +var max = Math.max; +var min = Math.min; +var sin = Math.sin; +var sqrt = Math.sqrt; + +var epsilon = 1e-12; +var pi = Math.PI; +var halfPi = pi / 2; +var tau = 2 * pi; + +function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); +} + +function asin(x) { + return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); +} + +function arcInnerRadius(d) { + return d.innerRadius; +} + +function arcOuterRadius(d) { + return d.outerRadius; +} + +function arcStartAngle(d) { + return d.startAngle; +} + +function arcEndAngle(d) { + return d.endAngle; +} + +function arcPadAngle(d) { + return d && d.padAngle; // Note: optional! +} + +function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = y32 * x10 - x32 * y10; + if (t * t < epsilon) return; + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + return [x0 + t * x10, y0 + t * y10]; +} + +// Compute perpendicular offset line of length rc. +// http://mathworld.wolfram.com/Circle-LineIntersection.html +function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, + y01 = y0 - y1, + lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), + ox = lo * y01, + oy = -lo * x01, + x11 = x0 + ox, + y11 = y0 + oy, + x10 = x1 + ox, + y10 = y1 + oy, + x00 = (x11 + x10) / 2, + y00 = (y11 + y10) / 2, + dx = x10 - x11, + dy = y10 - y11, + d2 = dx * dx + dy * dy, + r = r1 - rc, + D = x11 * y10 - x10 * y11, + d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)), + cx0 = (D * dy - dx * d) / d2, + cy0 = (-D * dx - dy * d) / d2, + cx1 = (D * dy + dx * d) / d2, + cy1 = (-D * dx + dy * d) / d2, + dx0 = cx0 - x00, + dy0 = cy0 - y00, + dx1 = cx1 - x00, + dy1 = cy1 - y00; + + // Pick the closer of the two intersection points. + // TODO Is there a faster way to determine which intersection to use? + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; +} + +function arc() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; + + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi, + a1 = endAngle.apply(this, arguments) - halfPi, + da = abs(a1 - a0), + cw = a1 > a0; + + if (!context) context = buffer = d3Path.path(); + + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) r = r1, r1 = r0, r0 = r; + + // Is it a point? + if (!(r1 > epsilon)) context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau - epsilon) { + context.moveTo(r1 * cos(a0), r1 * sin(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon) { + context.moveTo(r0 * cos(a1), r0 * sin(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } + + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), + rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon) { + var p0 = asin(rp / r0 * sin(ap)), + p1 = asin(rp / r1 * sin(ap)); + if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * cos(a01), + y01 = r1 * sin(a01), + x10 = r0 * cos(a10), + y10 = r0 * sin(a10); + + // Apply rounded corners? + if (rc > epsilon) { + var x11 = r1 * cos(a11), + y11 = r1 * sin(a11), + x00 = r0 * cos(a00), + y00 = r0 * sin(a00), + oc; + + // Restrict the corner radius according to the sector angle. + if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), + lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min(rc, (r0 - lc) / (kc - 1)); + rc1 = min(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon)) context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the outer ring just a circular arc? + else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the inner ring just a circular arc? + else context.arc(0, 0, r0, a10, a00, cw); + } + + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2; + return [cos(a) * r, sin(a) * r]; + }; + + arc.innerRadius = function(_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant(+_), arc) : innerRadius; + }; + + arc.outerRadius = function(_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant(+_), arc) : outerRadius; + }; + + arc.cornerRadius = function(_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant(+_), arc) : cornerRadius; + }; + + arc.padRadius = function(_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant(+_), arc) : padRadius; + }; + + arc.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), arc) : startAngle; + }; + + arc.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), arc) : endAngle; + }; + + arc.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), arc) : padAngle; + }; + + arc.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; +} + +var slice = Array.prototype.slice; + +function array(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} + +function Linear(context) { + this._context = context; +} + +Linear.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: this._context.lineTo(x, y); break; + } + } +}; + +function curveLinear(context) { + return new Linear(context); +} + +function x(p) { + return p[0]; +} + +function y(p) { + return p[1]; +} + +function line(x$1, y$1) { + var defined = constant(true), + context = null, + curve = curveLinear, + output = null; + + x$1 = typeof x$1 === "function" ? x$1 : (x$1 === undefined) ? x : constant(x$1); + y$1 = typeof y$1 === "function" ? y$1 : (y$1 === undefined) ? y : constant(y$1); + + function line(data) { + var i, + n = (data = array(data)).length, + d, + defined0 = false, + buffer; + + if (context == null) output = curve(buffer = d3Path.path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) output.lineStart(); + else output.lineEnd(); + } + if (defined0) output.point(+x$1(d, i, data), +y$1(d, i, data)); + } + + if (buffer) return output = null, buffer + "" || null; + } + + line.x = function(_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), line) : x$1; + }; + + line.y = function(_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), line) : y$1; + }; + + line.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), line) : defined; + }; + + line.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + + line.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + + return line; +} + +function area(x0, y0, y1) { + var x1 = null, + defined = constant(true), + context = null, + curve = curveLinear, + output = null; + + x0 = typeof x0 === "function" ? x0 : (x0 === undefined) ? x : constant(+x0); + y0 = typeof y0 === "function" ? y0 : (y0 === undefined) ? constant(0) : constant(+y0); + y1 = typeof y1 === "function" ? y1 : (y1 === undefined) ? y : constant(+y1); + + function area(data) { + var i, + j, + k, + n = (data = array(data)).length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); + + if (context == null) output = curve(buffer = d3Path.path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } + } + + if (buffer) return output = null, buffer + "" || null; + } + + function arealine() { + return line().defined(defined).curve(curve).context(context); + } + + area.x = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), x1 = null, area) : x0; + }; + + area.x0 = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), area) : x0; + }; + + area.x1 = function(_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : x1; + }; + + area.y = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), y1 = null, area) : y0; + }; + + area.y0 = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), area) : y0; + }; + + area.y1 = function(_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : y1; + }; + + area.lineX0 = + area.lineY0 = function() { + return arealine().x(x0).y(y0); + }; + + area.lineY1 = function() { + return arealine().x(x0).y(y1); + }; + + area.lineX1 = function() { + return arealine().x(x1).y(y0); + }; + + area.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), area) : defined; + }; + + area.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; + + area.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; + + return area; +} + +function descending$1(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} + +function identity(d) { + return d; +} + +function pie() { + var value = identity, + sortValues = descending$1, + sort = null, + startAngle = constant(0), + endAngle = constant(tau), + padAngle = constant(0); + + function pie(data) { + var i, + n = (data = array(data)).length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; + + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } + + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); }); + else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); }); + + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } + + return arcs; + } + + pie.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), pie) : value; + }; + + pie.sortValues = function(_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + }; + + pie.sort = function(_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; + }; + + pie.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), pie) : startAngle; + }; + + pie.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), pie) : endAngle; + }; + + pie.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), pie) : padAngle; + }; + + return pie; +} + +var curveRadialLinear = curveRadial$1(curveLinear); + +function Radial(curve) { + this._curve = curve; +} + +Radial.prototype = { + areaStart: function() { + this._curve.areaStart(); + }, + areaEnd: function() { + this._curve.areaEnd(); + }, + lineStart: function() { + this._curve.lineStart(); + }, + lineEnd: function() { + this._curve.lineEnd(); + }, + point: function(a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + } +}; + +function curveRadial$1(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; +} + +function lineRadial(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function(_) { + return arguments.length ? c(curveRadial$1(_)) : c()._curve; + }; + + return l; +} + +function lineRadial$1() { + return lineRadial(line().curve(curveRadialLinear)); +} + +function areaRadial() { + var a = area().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0; + a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1; + a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0; + a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1; + + a.curve = function(_) { + return arguments.length ? c(curveRadial$1(_)) : c()._curve; + }; + + return a; +} + +function pointRadial(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; +} + +function linkSource(d) { + return d.source; +} + +function linkTarget(d) { + return d.target; +} + +function link(curve) { + var source = linkSource, + target = linkTarget, + x$1 = x, + y$1 = y, + context = null; + + function link() { + var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); + if (!context) context = buffer = d3Path.path(); + curve(context, +x$1.apply(this, (argv[0] = s, argv)), +y$1.apply(this, argv), +x$1.apply(this, (argv[0] = t, argv)), +y$1.apply(this, argv)); + if (buffer) return context = null, buffer + "" || null; + } + + link.source = function(_) { + return arguments.length ? (source = _, link) : source; + }; + + link.target = function(_) { + return arguments.length ? (target = _, link) : target; + }; + + link.x = function(_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), link) : x$1; + }; + + link.y = function(_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), link) : y$1; + }; + + link.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; + + return link; +} + +function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); +} + +function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); +} + +function curveRadial(context, x0, y0, x1, y1) { + var p0 = pointRadial(x0, y0), + p1 = pointRadial(x0, y0 = (y0 + y1) / 2), + p2 = pointRadial(x1, y0), + p3 = pointRadial(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); +} + +function linkHorizontal() { + return link(curveHorizontal); +} + +function linkVertical() { + return link(curveVertical); +} + +function linkRadial() { + var l = link(curveRadial); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; +} + +var circle = { + draw: function(context, size) { + var r = Math.sqrt(size / pi); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau); + } +}; + +var cross = { + draw: function(context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } +}; + +var tan30 = Math.sqrt(1 / 3), + tan30_2 = tan30 * 2; + +var diamond = { + draw: function(context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } +}; + +var ka = 0.89081309152928522810, + kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10), + kx = Math.sin(tau / 10) * kr, + ky = -Math.cos(tau / 10) * kr; + +var star = { + draw: function(context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); + } + context.closePath(); + } +}; + +var square = { + draw: function(context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } +}; + +var sqrt3 = Math.sqrt(3); + +var triangle = { + draw: function(context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); + } +}; + +var c = -0.5, + s = Math.sqrt(3) / 2, + k = 1 / Math.sqrt(12), + a = (k / 2 + 1) * 3; + +var wye = { + draw: function(context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c * x0 - s * y0, s * x0 + c * y0); + context.lineTo(c * x1 - s * y1, s * x1 + c * y1); + context.lineTo(c * x2 - s * y2, s * x2 + c * y2); + context.lineTo(c * x0 + s * y0, c * y0 - s * x0); + context.lineTo(c * x1 + s * y1, c * y1 - s * x1); + context.lineTo(c * x2 + s * y2, c * y2 - s * x2); + context.closePath(); + } +}; + +var symbols = [ + circle, + cross, + diamond, + square, + star, + triangle, + wye +]; + +function symbol(type, size) { + var context = null; + type = typeof type === "function" ? type : constant(type || circle); + size = typeof size === "function" ? size : constant(size === undefined ? 64 : +size); + + function symbol() { + var buffer; + if (!context) context = buffer = d3Path.path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; + } + + symbol.type = function(_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant(_), symbol) : type; + }; + + symbol.size = function(_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant(+_), symbol) : size; + }; + + symbol.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; + + return symbol; +} + +function noop() {} + +function point$3(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); +} + +function Basis(context) { + this._context = context; +} + +Basis.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 3: point$3(this, this._x1, this._y1); // proceed + case 2: this._context.lineTo(this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basis(context) { + return new Basis(context); +} + +function BasisClosed(context) { + this._context = context; +} + +BasisClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x2, this._y2); + this._context.closePath(); + break; + } + case 2: { + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x2, this._y2); + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x2 = x, this._y2 = y; break; + case 1: this._point = 2; this._x3 = x, this._y3 = y; break; + case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basisClosed(context) { + return new BasisClosed(context); +} + +function BasisOpen(context) { + this._context = context; +} + +BasisOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; + case 3: this._point = 4; // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basisOpen(context) { + return new BasisOpen(context); +} + +class Bump { + constructor(context, x) { + this._context = context; + this._x = x; + } + areaStart() { + this._line = 0; + } + areaEnd() { + this._line = NaN; + } + lineStart() { + this._point = 0; + } + lineEnd() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + } + point(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: { + this._point = 1; + if (this._line) this._context.lineTo(x, y); + else this._context.moveTo(x, y); + break; + } + case 1: this._point = 2; // proceed + default: { + if (this._x) this._context.bezierCurveTo(this._x0 = (this._x0 + x) / 2, this._y0, this._x0, y, x, y); + else this._context.bezierCurveTo(this._x0, this._y0 = (this._y0 + y) / 2, x, this._y0, x, y); + break; + } + } + this._x0 = x, this._y0 = y; + } +} + +function bumpX(context) { + return new Bump(context, true); +} + +function bumpY(context) { + return new Bump(context, false); +} + +function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; +} + +Bundle.prototype = { + lineStart: function() { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function() { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +var bundle = (function custom(beta) { + + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + + bundle.beta = function(beta) { + return custom(+beta); + }; + + return bundle; +})(0.85); + +function point$2(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); +} + +function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +Cardinal.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: point$2(this, this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; this._x1 = x, this._y1 = y; break; + case 2: this._point = 3; // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinal = (function custom(tension) { + + function cardinal(context) { + return new Cardinal(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinalClosed = (function custom(tension) { + + function cardinal(context) { + return new CardinalClosed(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinalOpen = (function custom(tension) { + + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function point$1(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); +} + +function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRom.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: this.point(this._x2, this._y2); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; // proceed + default: point$1(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRom = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$1(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRomClosed = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$1(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRomOpen = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function LinearClosed(context) { + this._context = context; +} + +LinearClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._point) this._context.closePath(); + }, + point: function(x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); + } +}; + +function linearClosed(context) { + return new LinearClosed(context); +} + +function sign(x) { + return x < 0 ? -1 : 1; +} + +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. +function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; +} + +// Calculate a one-sided slope. +function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; +} + +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bézier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". +function point(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); +} + +function MonotoneX(context) { + this._context = context; +} + +MonotoneX.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x1, this._y1); break; + case 3: point(this, this._t0, slope2(this, this._t0)); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break; + default: point(this, this._t0, t1 = slope3(this, x, y)); break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } +}; + +function MonotoneY(context) { + this._context = new ReflectContext(context); +} + +(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { + MonotoneX.prototype.point.call(this, y, x); +}; + +function ReflectContext(context) { + this._context = context; +} + +ReflectContext.prototype = { + moveTo: function(x, y) { this._context.moveTo(y, x); }, + closePath: function() { this._context.closePath(); }, + lineTo: function(x, y) { this._context.lineTo(y, x); }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } +}; + +function monotoneX(context) { + return new MonotoneX(context); +} + +function monotoneY(context) { + return new MonotoneY(context); +} + +function Natural(context) { + this._context = context; +} + +Natural.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = []; + this._y = []; + }, + lineEnd: function() { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. +function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; +} + +function natural(context) { + return new Natural(context); +} + +function Step(context, t) { + this._context = context; + this._t = t; +} + +Step.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function() { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } +}; + +function step(context) { + return new Step(context, 0.5); +} + +function stepBefore(context) { + return new Step(context, 0); +} + +function stepAfter(context) { + return new Step(context, 1); +} + +function none$1(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } +} + +function none(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; +} + +function stackValue(d, key) { + return d[key]; +} + +function stackSeries(key) { + const series = []; + series.key = key; + return series; +} + +function stack() { + var keys = constant([]), + order = none, + offset = none$1, + value = stackValue; + + function stack(data) { + var sz = Array.from(keys.apply(this, arguments), stackSeries), + i, n = sz.length, j = -1, + oz; + + for (const d of data) { + for (i = 0, ++j; i < n; ++i) { + (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d; + } + } + + for (i = 0, oz = array(order(sz)); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function(_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant(Array.from(_)), stack) : keys; + }; + + stack.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), stack) : value; + }; + + stack.order = function(_) { + return arguments.length ? (order = _ == null ? none : typeof _ === "function" ? _ : constant(Array.from(_)), stack) : order; + }; + + stack.offset = function(_) { + return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset; + }; + + return stack; +} + +function expand(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none$1(series, order); +} + +function diverging(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = 0, d[1] = dy; + } + } + } +} + +function silhouette(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none$1(series, order); +} + +function wiggle(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none$1(series, order); +} + +function appearance(series) { + var peaks = series.map(peak); + return none(series).sort(function(a, b) { return peaks[a] - peaks[b]; }); +} + +function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; + return j; +} + +function ascending(series) { + var sums = series.map(sum); + return none(series).sort(function(a, b) { return sums[a] - sums[b]; }); +} + +function sum(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; +} + +function descending(series) { + return ascending(series).reverse(); +} + +function insideOut(series) { + var n = series.length, + i, + j, + sums = series.map(sum), + order = appearance(series), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); +} + +function reverse(series) { + return none(series).reverse(); +} + +exports.arc = arc; +exports.area = area; +exports.areaRadial = areaRadial; +exports.curveBasis = basis; +exports.curveBasisClosed = basisClosed; +exports.curveBasisOpen = basisOpen; +exports.curveBumpX = bumpX; +exports.curveBumpY = bumpY; +exports.curveBundle = bundle; +exports.curveCardinal = cardinal; +exports.curveCardinalClosed = cardinalClosed; +exports.curveCardinalOpen = cardinalOpen; +exports.curveCatmullRom = catmullRom; +exports.curveCatmullRomClosed = catmullRomClosed; +exports.curveCatmullRomOpen = catmullRomOpen; +exports.curveLinear = curveLinear; +exports.curveLinearClosed = linearClosed; +exports.curveMonotoneX = monotoneX; +exports.curveMonotoneY = monotoneY; +exports.curveNatural = natural; +exports.curveStep = step; +exports.curveStepAfter = stepAfter; +exports.curveStepBefore = stepBefore; +exports.line = line; +exports.lineRadial = lineRadial$1; +exports.linkHorizontal = linkHorizontal; +exports.linkRadial = linkRadial; +exports.linkVertical = linkVertical; +exports.pie = pie; +exports.pointRadial = pointRadial; +exports.radialArea = areaRadial; +exports.radialLine = lineRadial$1; +exports.stack = stack; +exports.stackOffsetDiverging = diverging; +exports.stackOffsetExpand = expand; +exports.stackOffsetNone = none$1; +exports.stackOffsetSilhouette = silhouette; +exports.stackOffsetWiggle = wiggle; +exports.stackOrderAppearance = appearance; +exports.stackOrderAscending = ascending; +exports.stackOrderDescending = descending; +exports.stackOrderInsideOut = insideOut; +exports.stackOrderNone = none; +exports.stackOrderReverse = reverse; +exports.symbol = symbol; +exports.symbolCircle = circle; +exports.symbolCross = cross; +exports.symbolDiamond = diamond; +exports.symbolSquare = square; +exports.symbolStar = star; +exports.symbolTriangle = triangle; +exports.symbolWye = wye; +exports.symbols = symbols; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/node_modules/d3-shape/dist/d3-shape.min.js b/node_modules/d3-shape/dist/d3-shape.min.js new file mode 100644 index 00000000..bda24146 --- /dev/null +++ b/node_modules/d3-shape/dist/d3-shape.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-shape/ v2.1.0 Copyright 2021 Mike Bostock +!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports,require("d3-path")):"function"==typeof define&&define.amd?define(["exports","d3-path"],i):i((t="undefined"!=typeof globalThis?globalThis:t||self).d3=t.d3||{},t.d3)}(this,(function(t,i){"use strict";function n(t){return function(){return t}}var e=Math.abs,s=Math.atan2,o=Math.cos,h=Math.max,_=Math.min,r=Math.sin,a=Math.sqrt,c=1e-12,l=Math.PI,u=l/2,f=2*l;function y(t){return t>1?0:t<-1?l:Math.acos(t)}function x(t){return t>=1?u:t<=-1?-u:Math.asin(t)}function p(t){return t.innerRadius}function v(t){return t.outerRadius}function d(t){return t.startAngle}function T(t){return t.endAngle}function g(t){return t&&t.padAngle}function b(t,i,n,e,s,o,h,_){var r=n-t,a=e-i,l=h-s,u=_-o,f=u*r-l*a;if(!(f*fO*O+R*R&&(M=E,S=A),{cx:M,cy:S,x01:-u,y01:-f,x11:M*(s/w-1),y11:S*(s/w-1)}}var w=Array.prototype.slice;function k(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function N(t){this._context=t}function M(t){return new N(t)}function S(t){return t[0]}function E(t){return t[1]}function A(t,e){var s=n(!0),o=null,h=M,_=null;function r(n){var r,a,c,l=(n=k(n)).length,u=!1;for(null==o&&(_=h(c=i.path())),r=0;r<=l;++r)!(r=l;--u)a.point(v[u],d[u]);a.lineEnd(),a.areaEnd()}p&&(v[c]=+t(f,c,n),d[c]=+e(f,c,n),a.point(o?+o(f,c,n):v[c],s?+s(f,c,n):d[c]))}if(y)return a=null,y+""||null}function l(){return A().defined(h).curve(r).context(_)}return t="function"==typeof t?t:void 0===t?S:n(+t),e="function"==typeof e?e:n(void 0===e?0:+e),s="function"==typeof s?s:void 0===s?E:n(+s),c.x=function(i){return arguments.length?(t="function"==typeof i?i:n(+i),o=null,c):t},c.x0=function(i){return arguments.length?(t="function"==typeof i?i:n(+i),c):t},c.x1=function(t){return arguments.length?(o=null==t?null:"function"==typeof t?t:n(+t),c):o},c.y=function(t){return arguments.length?(e="function"==typeof t?t:n(+t),s=null,c):e},c.y0=function(t){return arguments.length?(e="function"==typeof t?t:n(+t),c):e},c.y1=function(t){return arguments.length?(s=null==t?null:"function"==typeof t?t:n(+t),c):s},c.lineX0=c.lineY0=function(){return l().x(t).y(e)},c.lineY1=function(){return l().x(t).y(s)},c.lineX1=function(){return l().x(o).y(e)},c.defined=function(t){return arguments.length?(h="function"==typeof t?t:n(!!t),c):h},c.curve=function(t){return arguments.length?(r=t,null!=_&&(a=r(_)),c):r},c.context=function(t){return arguments.length?(null==t?_=a=null:a=r(_=t),c):_},c}function C(t,i){return it?1:i>=t?0:NaN}function O(t){return t}N.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,i){switch(t=+t,i=+i,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,i):this._context.moveTo(t,i);break;case 1:this._point=2;default:this._context.lineTo(t,i)}}};var R=z(M);function q(t){this._curve=t}function z(t){function i(i){return new q(t(i))}return i._curve=t,i}function X(t){var i=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?i(z(t)):i()._curve},t}function Y(){return X(A().curve(R))}function B(){var t=P().curve(R),i=t.curve,n=t.lineX0,e=t.lineX1,s=t.lineY0,o=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return X(n())},delete t.lineX0,t.lineEndAngle=function(){return X(e())},delete t.lineX1,t.lineInnerRadius=function(){return X(s())},delete t.lineY0,t.lineOuterRadius=function(){return X(o())},delete t.lineY1,t.curve=function(t){return arguments.length?i(z(t)):i()._curve},t}function j(t,i){return[(i=+i)*Math.cos(t-=Math.PI/2),i*Math.sin(t)]}function I(t){return t.source}function D(t){return t.target}function L(t){var e=I,s=D,o=S,h=E,_=null;function r(){var n,r=w.call(arguments),a=e.apply(this,r),c=s.apply(this,r);if(_||(_=n=i.path()),t(_,+o.apply(this,(r[0]=a,r)),+h.apply(this,r),+o.apply(this,(r[0]=c,r)),+h.apply(this,r)),n)return _=null,n+""||null}return r.source=function(t){return arguments.length?(e=t,r):e},r.target=function(t){return arguments.length?(s=t,r):s},r.x=function(t){return arguments.length?(o="function"==typeof t?t:n(+t),r):o},r.y=function(t){return arguments.length?(h="function"==typeof t?t:n(+t),r):h},r.context=function(t){return arguments.length?(_=null==t?null:t,r):_},r}function V(t,i,n,e,s){t.moveTo(i,n),t.bezierCurveTo(i=(i+e)/2,n,i,s,e,s)}function W(t,i,n,e,s){t.moveTo(i,n),t.bezierCurveTo(i,n=(n+s)/2,e,n,e,s)}function H(t,i,n,e,s){var o=j(i,n),h=j(i,n=(n+s)/2),_=j(e,n),r=j(e,s);t.moveTo(o[0],o[1]),t.bezierCurveTo(h[0],h[1],_[0],_[1],r[0],r[1])}q.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,i){this._curve.point(i*Math.sin(t),i*-Math.cos(t))}};var F={draw:function(t,i){var n=Math.sqrt(i/l);t.moveTo(n,0),t.arc(0,0,n,0,f)}},G={draw:function(t,i){var n=Math.sqrt(i/5)/2;t.moveTo(-3*n,-n),t.lineTo(-n,-n),t.lineTo(-n,-3*n),t.lineTo(n,-3*n),t.lineTo(n,-n),t.lineTo(3*n,-n),t.lineTo(3*n,n),t.lineTo(n,n),t.lineTo(n,3*n),t.lineTo(-n,3*n),t.lineTo(-n,n),t.lineTo(-3*n,n),t.closePath()}},J=Math.sqrt(1/3),K=2*J,Q={draw:function(t,i){var n=Math.sqrt(i/K),e=n*J;t.moveTo(0,-n),t.lineTo(e,0),t.lineTo(0,n),t.lineTo(-e,0),t.closePath()}},U=Math.sin(l/10)/Math.sin(7*l/10),Z=Math.sin(f/10)*U,$=-Math.cos(f/10)*U,tt={draw:function(t,i){var n=Math.sqrt(.8908130915292852*i),e=Z*n,s=$*n;t.moveTo(0,-n),t.lineTo(e,s);for(var o=1;o<5;++o){var h=f*o/5,_=Math.cos(h),r=Math.sin(h);t.lineTo(r*n,-_*n),t.lineTo(_*e-r*s,r*e+_*s)}t.closePath()}},it={draw:function(t,i){var n=Math.sqrt(i),e=-n/2;t.rect(e,e,n,n)}},nt=Math.sqrt(3),et={draw:function(t,i){var n=-Math.sqrt(i/(3*nt));t.moveTo(0,2*n),t.lineTo(-nt*n,-n),t.lineTo(nt*n,-n),t.closePath()}},st=-.5,ot=Math.sqrt(3)/2,ht=1/Math.sqrt(12),_t=3*(ht/2+1),rt={draw:function(t,i){var n=Math.sqrt(i/_t),e=n/2,s=n*ht,o=e,h=n*ht+n,_=-o,r=h;t.moveTo(e,s),t.lineTo(o,h),t.lineTo(_,r),t.lineTo(st*e-ot*s,ot*e+st*s),t.lineTo(st*o-ot*h,ot*o+st*h),t.lineTo(st*_-ot*r,ot*_+st*r),t.lineTo(st*e+ot*s,st*s-ot*e),t.lineTo(st*o+ot*h,st*h-ot*o),t.lineTo(st*_+ot*r,st*r-ot*_),t.closePath()}},at=[F,G,Q,it,tt,et,rt];function ct(){}function lt(t,i,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+i)/6,(t._y0+4*t._y1+n)/6)}function ut(t){this._context=t}function ft(t){this._context=t}function yt(t){this._context=t}ut.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:lt(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,i){switch(t=+t,i=+i,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,i):this._context.moveTo(t,i);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:lt(this,t,i)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=i}},ft.prototype={areaStart:ct,areaEnd:ct,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,i){switch(t=+t,i=+i,this._point){case 0:this._point=1,this._x2=t,this._y2=i;break;case 1:this._point=2,this._x3=t,this._y3=i;break;case 2:this._point=3,this._x4=t,this._y4=i,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+i)/6);break;default:lt(this,t,i)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=i}},yt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,i){switch(t=+t,i=+i,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,e=(this._y0+4*this._y1+i)/6;this._line?this._context.lineTo(n,e):this._context.moveTo(n,e);break;case 3:this._point=4;default:lt(this,t,i)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=i}};class xt{constructor(t,i){this._context=t,this._x=i}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line}point(t,i){switch(t=+t,i=+i,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,i):this._context.moveTo(t,i);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,i,t,i):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+i)/2,t,this._y0,t,i)}this._x0=t,this._y0=i}}function pt(t,i){this._basis=new ut(t),this._beta=i}pt.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,i=this._y,n=t.length-1;if(n>0)for(var e,s=t[0],o=i[0],h=t[n]-s,_=i[n]-o,r=-1;++r<=n;)e=r/n,this._basis.point(this._beta*t[r]+(1-this._beta)*(s+e*h),this._beta*i[r]+(1-this._beta)*(o+e*_));this._x=this._y=null,this._basis.lineEnd()},point:function(t,i){this._x.push(+t),this._y.push(+i)}};var vt=function t(i){function n(t){return 1===i?new ut(t):new pt(t,i)}return n.beta=function(i){return t(+i)},n}(.85);function dt(t,i,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-i),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function Tt(t,i){this._context=t,this._k=(1-i)/6}Tt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:dt(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,i){switch(t=+t,i=+i,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,i):this._context.moveTo(t,i);break;case 1:this._point=2,this._x1=t,this._y1=i;break;case 2:this._point=3;default:dt(this,t,i)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=i}};var gt=function t(i){function n(t){return new Tt(t,i)}return n.tension=function(i){return t(+i)},n}(0);function bt(t,i){this._context=t,this._k=(1-i)/6}bt.prototype={areaStart:ct,areaEnd:ct,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,i){switch(t=+t,i=+i,this._point){case 0:this._point=1,this._x3=t,this._y3=i;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=i);break;case 2:this._point=3,this._x5=t,this._y5=i;break;default:dt(this,t,i)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=i}};var mt=function t(i){function n(t){return new bt(t,i)}return n.tension=function(i){return t(+i)},n}(0);function wt(t,i){this._context=t,this._k=(1-i)/6}wt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,i){switch(t=+t,i=+i,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:dt(this,t,i)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=i}};var kt=function t(i){function n(t){return new wt(t,i)}return n.tension=function(i){return t(+i)},n}(0);function Nt(t,i,n){var e=t._x1,s=t._y1,o=t._x2,h=t._y2;if(t._l01_a>c){var _=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,r=3*t._l01_a*(t._l01_a+t._l12_a);e=(e*_-t._x0*t._l12_2a+t._x2*t._l01_2a)/r,s=(s*_-t._y0*t._l12_2a+t._y2*t._l01_2a)/r}if(t._l23_a>c){var a=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,l=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*a+t._x1*t._l23_2a-i*t._l12_2a)/l,h=(h*a+t._y1*t._l23_2a-n*t._l12_2a)/l}t._context.bezierCurveTo(e,s,o,h,t._x2,t._y2)}function Mt(t,i){this._context=t,this._alpha=i}Mt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,i){if(t=+t,i=+i,this._point){var n=this._x2-t,e=this._y2-i;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+e*e,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,i):this._context.moveTo(t,i);break;case 1:this._point=2;break;case 2:this._point=3;default:Nt(this,t,i)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=i}};var St=function t(i){function n(t){return i?new Mt(t,i):new Tt(t,0)}return n.alpha=function(i){return t(+i)},n}(.5);function Et(t,i){this._context=t,this._alpha=i}Et.prototype={areaStart:ct,areaEnd:ct,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,i){if(t=+t,i=+i,this._point){var n=this._x2-t,e=this._y2-i;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+e*e,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=i;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=i);break;case 2:this._point=3,this._x5=t,this._y5=i;break;default:Nt(this,t,i)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=i}};var At=function t(i){function n(t){return i?new Et(t,i):new bt(t,0)}return n.alpha=function(i){return t(+i)},n}(.5);function Pt(t,i){this._context=t,this._alpha=i}Pt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,i){if(t=+t,i=+i,this._point){var n=this._x2-t,e=this._y2-i;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+e*e,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Nt(this,t,i)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=i}};var Ct=function t(i){function n(t){return i?new Pt(t,i):new wt(t,0)}return n.alpha=function(i){return t(+i)},n}(.5);function Ot(t){this._context=t}function Rt(t){return t<0?-1:1}function qt(t,i,n){var e=t._x1-t._x0,s=i-t._x1,o=(t._y1-t._y0)/(e||s<0&&-0),h=(n-t._y1)/(s||e<0&&-0),_=(o*s+h*e)/(e+s);return(Rt(o)+Rt(h))*Math.min(Math.abs(o),Math.abs(h),.5*Math.abs(_))||0}function zt(t,i){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-i)/2:i}function Xt(t,i,n){var e=t._x0,s=t._y0,o=t._x1,h=t._y1,_=(o-e)/3;t._context.bezierCurveTo(e+_,s+_*i,o-_,h-_*n,o,h)}function Yt(t){this._context=t}function Bt(t){this._context=new jt(t)}function jt(t){this._context=t}function It(t){this._context=t}function Dt(t){var i,n,e=t.length-1,s=new Array(e),o=new Array(e),h=new Array(e);for(s[0]=0,o[0]=2,h[0]=t[0]+2*t[1],i=1;i=0;--i)s[i]=(h[i]-s[i+1])/o[i];for(o[e-1]=(t[e]+s[e-1])/2,i=0;i1)for(var n,e,s,o=1,h=t[i[0]],_=h.length;o=0;)n[i]=i;return n}function Ht(t,i){return t[i]}function Ft(t){const i=[];return i.key=t,i}function Gt(t){var i=t.map(Jt);return Wt(t).sort((function(t,n){return i[t]-i[n]}))}function Jt(t){for(var i,n=-1,e=0,s=t.length,o=-1/0;++no&&(o=i,e=n);return e}function Kt(t){var i=t.map(Qt);return Wt(t).sort((function(t,n){return i[t]-i[n]}))}function Qt(t){for(var i,n=0,e=-1,s=t.length;++e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,i){switch(t=+t,i=+i,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,i):this._context.moveTo(t,i);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,i),this._context.lineTo(t,i);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,i)}}this._x=t,this._y=i}},t.arc=function(){var t=p,h=v,w=n(0),k=null,N=d,M=T,S=g,E=null;function A(){var n,p,v=+t.apply(this,arguments),d=+h.apply(this,arguments),T=N.apply(this,arguments)-u,g=M.apply(this,arguments)-u,A=e(g-T),P=g>T;if(E||(E=n=i.path()),dc)if(A>f-c)E.moveTo(d*o(T),d*r(T)),E.arc(0,0,d,T,g,!P),v>c&&(E.moveTo(v*o(g),v*r(g)),E.arc(0,0,v,g,T,P));else{var C,O,R=T,q=g,z=T,X=g,Y=A,B=A,j=S.apply(this,arguments)/2,I=j>c&&(k?+k.apply(this,arguments):a(v*v+d*d)),D=_(e(d-v)/2,+w.apply(this,arguments)),L=D,V=D;if(I>c){var W=x(I/v*r(j)),H=x(I/d*r(j));(Y-=2*W)>c?(z+=W*=P?1:-1,X-=W):(Y=0,z=X=(T+g)/2),(B-=2*H)>c?(R+=H*=P?1:-1,q-=H):(B=0,R=q=(T+g)/2)}var F=d*o(R),G=d*r(R),J=v*o(X),K=v*r(X);if(D>c){var Q,U=d*o(q),Z=d*r(q),$=v*o(z),tt=v*r(z);if(Ac?V>c?(C=m($,tt,F,G,d,V,P),O=m(U,Z,J,K,d,V,P),E.moveTo(C.cx+C.x01,C.cy+C.y01),Vc&&Y>c?L>c?(C=m(J,K,U,Z,v,-L,P),O=m(F,G,$,tt,v,-L,P),E.lineTo(C.cx+C.x01,C.cy+C.y01),L0&&(y+=l);for(null!=i?x.sort((function(t,n){return i(p[t],p[n])})):null!=e&&x.sort((function(t,i){return e(n[t],n[i])})),_=0,a=y?(d-u*g)/y:0;_0?l*a:0)+g,p[r]={data:n[r],index:_,value:l,startAngle:v,endAngle:c,padAngle:T};return p}return _.value=function(i){return arguments.length?(t="function"==typeof i?i:n(+i),_):t},_.sortValues=function(t){return arguments.length?(i=t,e=null,_):i},_.sort=function(t){return arguments.length?(e=t,i=null,_):e},_.startAngle=function(t){return arguments.length?(s="function"==typeof t?t:n(+t),_):s},_.endAngle=function(t){return arguments.length?(o="function"==typeof t?t:n(+t),_):o},_.padAngle=function(t){return arguments.length?(h="function"==typeof t?t:n(+t),_):h},_},t.pointRadial=j,t.radialArea=B,t.radialLine=Y,t.stack=function(){var t=n([]),i=Wt,e=Vt,s=Ht;function o(n){var o,h,_=Array.from(t.apply(this,arguments),Ft),r=_.length,a=-1;for(const t of n)for(o=0,++a;o0)for(var n,e,s,o,h,_,r=0,a=t[i[0]].length;r0?(e[0]=o,e[1]=o+=s):s<0?(e[1]=h,e[0]=h+=s):(e[0]=0,e[1]=s)},t.stackOffsetExpand=function(t,i){if((e=t.length)>0){for(var n,e,s,o=0,h=t[0].length;o0){for(var n,e=0,s=t[i[0]],o=s.length;e0&&(e=(n=t[i[0]]).length)>0){for(var n,e,s,o=0,h=1;h dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; +} + +export default function() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; + + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi, + a1 = endAngle.apply(this, arguments) - halfPi, + da = abs(a1 - a0), + cw = a1 > a0; + + if (!context) context = buffer = path(); + + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) r = r1, r1 = r0, r0 = r; + + // Is it a point? + if (!(r1 > epsilon)) context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau - epsilon) { + context.moveTo(r1 * cos(a0), r1 * sin(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon) { + context.moveTo(r0 * cos(a1), r0 * sin(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } + + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), + rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon) { + var p0 = asin(rp / r0 * sin(ap)), + p1 = asin(rp / r1 * sin(ap)); + if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * cos(a01), + y01 = r1 * sin(a01), + x10 = r0 * cos(a10), + y10 = r0 * sin(a10); + + // Apply rounded corners? + if (rc > epsilon) { + var x11 = r1 * cos(a11), + y11 = r1 * sin(a11), + x00 = r0 * cos(a00), + y00 = r0 * sin(a00), + oc; + + // Restrict the corner radius according to the sector angle. + if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), + lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min(rc, (r0 - lc) / (kc - 1)); + rc1 = min(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon)) context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the outer ring just a circular arc? + else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the inner ring just a circular arc? + else context.arc(0, 0, r0, a10, a00, cw); + } + + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2; + return [cos(a) * r, sin(a) * r]; + }; + + arc.innerRadius = function(_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant(+_), arc) : innerRadius; + }; + + arc.outerRadius = function(_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant(+_), arc) : outerRadius; + }; + + arc.cornerRadius = function(_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant(+_), arc) : cornerRadius; + }; + + arc.padRadius = function(_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant(+_), arc) : padRadius; + }; + + arc.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), arc) : startAngle; + }; + + arc.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), arc) : endAngle; + }; + + arc.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), arc) : padAngle; + }; + + arc.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; +} diff --git a/node_modules/d3-shape/src/area.js b/node_modules/d3-shape/src/area.js new file mode 100644 index 00000000..8726630a --- /dev/null +++ b/node_modules/d3-shape/src/area.js @@ -0,0 +1,111 @@ +import {path} from "d3-path"; +import array from "./array.js"; +import constant from "./constant.js"; +import curveLinear from "./curve/linear.js"; +import line from "./line.js"; +import {x as pointX, y as pointY} from "./point.js"; + +export default function(x0, y0, y1) { + var x1 = null, + defined = constant(true), + context = null, + curve = curveLinear, + output = null; + + x0 = typeof x0 === "function" ? x0 : (x0 === undefined) ? pointX : constant(+x0); + y0 = typeof y0 === "function" ? y0 : (y0 === undefined) ? constant(0) : constant(+y0); + y1 = typeof y1 === "function" ? y1 : (y1 === undefined) ? pointY : constant(+y1); + + function area(data) { + var i, + j, + k, + n = (data = array(data)).length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } + } + + if (buffer) return output = null, buffer + "" || null; + } + + function arealine() { + return line().defined(defined).curve(curve).context(context); + } + + area.x = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), x1 = null, area) : x0; + }; + + area.x0 = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), area) : x0; + }; + + area.x1 = function(_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : x1; + }; + + area.y = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), y1 = null, area) : y0; + }; + + area.y0 = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), area) : y0; + }; + + area.y1 = function(_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : y1; + }; + + area.lineX0 = + area.lineY0 = function() { + return arealine().x(x0).y(y0); + }; + + area.lineY1 = function() { + return arealine().x(x0).y(y1); + }; + + area.lineX1 = function() { + return arealine().x(x1).y(y0); + }; + + area.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), area) : defined; + }; + + area.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; + + area.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; + + return area; +} diff --git a/node_modules/d3-shape/src/areaRadial.js b/node_modules/d3-shape/src/areaRadial.js new file mode 100644 index 00000000..61e01d78 --- /dev/null +++ b/node_modules/d3-shape/src/areaRadial.js @@ -0,0 +1,29 @@ +import curveRadial, {curveRadialLinear} from "./curve/radial.js"; +import area from "./area.js"; +import {lineRadial} from "./lineRadial.js"; + +export default function() { + var a = area().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0; + a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1; + a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0; + a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1; + + a.curve = function(_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return a; +} diff --git a/node_modules/d3-shape/src/array.js b/node_modules/d3-shape/src/array.js new file mode 100644 index 00000000..90808ffe --- /dev/null +++ b/node_modules/d3-shape/src/array.js @@ -0,0 +1,7 @@ +export var slice = Array.prototype.slice; + +export default function(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} diff --git a/node_modules/d3-shape/src/constant.js b/node_modules/d3-shape/src/constant.js new file mode 100644 index 00000000..6fa95b71 --- /dev/null +++ b/node_modules/d3-shape/src/constant.js @@ -0,0 +1,5 @@ +export default function(x) { + return function constant() { + return x; + }; +} diff --git a/node_modules/d3-shape/src/curve/basis.js b/node_modules/d3-shape/src/curve/basis.js new file mode 100644 index 00000000..b186bed5 --- /dev/null +++ b/node_modules/d3-shape/src/curve/basis.js @@ -0,0 +1,51 @@ +export function point(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); +} + +export function Basis(context) { + this._context = context; +} + +Basis.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 3: point(this, this._x1, this._y1); // proceed + case 2: this._context.lineTo(this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed + default: point(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +export default function(context) { + return new Basis(context); +} diff --git a/node_modules/d3-shape/src/curve/basisClosed.js b/node_modules/d3-shape/src/curve/basisClosed.js new file mode 100644 index 00000000..535df90f --- /dev/null +++ b/node_modules/d3-shape/src/curve/basisClosed.js @@ -0,0 +1,52 @@ +import noop from "../noop.js"; +import {point} from "./basis.js"; + +function BasisClosed(context) { + this._context = context; +} + +BasisClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x2, this._y2); + this._context.closePath(); + break; + } + case 2: { + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x2, this._y2); + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x2 = x, this._y2 = y; break; + case 1: this._point = 2; this._x3 = x, this._y3 = y; break; + case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; + default: point(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +export default function(context) { + return new BasisClosed(context); +} diff --git a/node_modules/d3-shape/src/curve/basisOpen.js b/node_modules/d3-shape/src/curve/basisOpen.js new file mode 100644 index 00000000..4f2e5b10 --- /dev/null +++ b/node_modules/d3-shape/src/curve/basisOpen.js @@ -0,0 +1,39 @@ +import {point} from "./basis.js"; + +function BasisOpen(context) { + this._context = context; +} + +BasisOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; + case 3: this._point = 4; // proceed + default: point(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +export default function(context) { + return new BasisOpen(context); +} diff --git a/node_modules/d3-shape/src/curve/bump.js b/node_modules/d3-shape/src/curve/bump.js new file mode 100644 index 00000000..b1d63270 --- /dev/null +++ b/node_modules/d3-shape/src/curve/bump.js @@ -0,0 +1,45 @@ +class Bump { + constructor(context, x) { + this._context = context; + this._x = x; + } + areaStart() { + this._line = 0; + } + areaEnd() { + this._line = NaN; + } + lineStart() { + this._point = 0; + } + lineEnd() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + } + point(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: { + this._point = 1; + if (this._line) this._context.lineTo(x, y); + else this._context.moveTo(x, y); + break; + } + case 1: this._point = 2; // proceed + default: { + if (this._x) this._context.bezierCurveTo(this._x0 = (this._x0 + x) / 2, this._y0, this._x0, y, x, y); + else this._context.bezierCurveTo(this._x0, this._y0 = (this._y0 + y) / 2, x, this._y0, x, y); + break; + } + } + this._x0 = x, this._y0 = y; + } +} + +export function bumpX(context) { + return new Bump(context, true); +} + +export function bumpY(context) { + return new Bump(context, false); +} diff --git a/node_modules/d3-shape/src/curve/bundle.js b/node_modules/d3-shape/src/curve/bundle.js new file mode 100644 index 00000000..ac1014eb --- /dev/null +++ b/node_modules/d3-shape/src/curve/bundle.js @@ -0,0 +1,56 @@ +import {Basis} from "./basis.js"; + +function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; +} + +Bundle.prototype = { + lineStart: function() { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function() { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +export default (function custom(beta) { + + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + + bundle.beta = function(beta) { + return custom(+beta); + }; + + return bundle; +})(0.85); diff --git a/node_modules/d3-shape/src/curve/cardinal.js b/node_modules/d3-shape/src/curve/cardinal.js new file mode 100644 index 00000000..3ab10701 --- /dev/null +++ b/node_modules/d3-shape/src/curve/cardinal.js @@ -0,0 +1,61 @@ +export function point(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); +} + +export function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +Cardinal.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: point(this, this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; this._x1 = x, this._y1 = y; break; + case 2: this._point = 3; // proceed + default: point(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +export default (function custom(tension) { + + function cardinal(context) { + return new Cardinal(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); diff --git a/node_modules/d3-shape/src/curve/cardinalClosed.js b/node_modules/d3-shape/src/curve/cardinalClosed.js new file mode 100644 index 00000000..acef52e3 --- /dev/null +++ b/node_modules/d3-shape/src/curve/cardinalClosed.js @@ -0,0 +1,61 @@ +import noop from "../noop.js"; +import {point} from "./cardinal.js"; + +export function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +export default (function custom(tension) { + + function cardinal(context) { + return new CardinalClosed(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); diff --git a/node_modules/d3-shape/src/curve/cardinalOpen.js b/node_modules/d3-shape/src/curve/cardinalOpen.js new file mode 100644 index 00000000..e7368419 --- /dev/null +++ b/node_modules/d3-shape/src/curve/cardinalOpen.js @@ -0,0 +1,49 @@ +import {point} from "./cardinal.js"; + +export function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +export default (function custom(tension) { + + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); diff --git a/node_modules/d3-shape/src/curve/catmullRom.js b/node_modules/d3-shape/src/curve/catmullRom.js new file mode 100644 index 00000000..643d10f3 --- /dev/null +++ b/node_modules/d3-shape/src/curve/catmullRom.js @@ -0,0 +1,88 @@ +import {epsilon} from "../math.js"; +import {Cardinal} from "./cardinal.js"; + +export function point(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); +} + +function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRom.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: this.point(this._x2, this._y2); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; // proceed + default: point(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +export default (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); diff --git a/node_modules/d3-shape/src/curve/catmullRomClosed.js b/node_modules/d3-shape/src/curve/catmullRomClosed.js new file mode 100644 index 00000000..6c6b9655 --- /dev/null +++ b/node_modules/d3-shape/src/curve/catmullRomClosed.js @@ -0,0 +1,74 @@ +import {CardinalClosed} from "./cardinalClosed.js"; +import noop from "../noop.js"; +import {point} from "./catmullRom.js"; + +function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +export default (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); diff --git a/node_modules/d3-shape/src/curve/catmullRomOpen.js b/node_modules/d3-shape/src/curve/catmullRomOpen.js new file mode 100644 index 00000000..7e4c5ca7 --- /dev/null +++ b/node_modules/d3-shape/src/curve/catmullRomOpen.js @@ -0,0 +1,62 @@ +import {CardinalOpen} from "./cardinalOpen.js"; +import {point} from "./catmullRom.js"; + +function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +export default (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); diff --git a/node_modules/d3-shape/src/curve/linear.js b/node_modules/d3-shape/src/curve/linear.js new file mode 100644 index 00000000..62454931 --- /dev/null +++ b/node_modules/d3-shape/src/curve/linear.js @@ -0,0 +1,31 @@ +function Linear(context) { + this._context = context; +} + +Linear.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: this._context.lineTo(x, y); break; + } + } +}; + +export default function(context) { + return new Linear(context); +} diff --git a/node_modules/d3-shape/src/curve/linearClosed.js b/node_modules/d3-shape/src/curve/linearClosed.js new file mode 100644 index 00000000..e25606ff --- /dev/null +++ b/node_modules/d3-shape/src/curve/linearClosed.js @@ -0,0 +1,25 @@ +import noop from "../noop.js"; + +function LinearClosed(context) { + this._context = context; +} + +LinearClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._point) this._context.closePath(); + }, + point: function(x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); + } +}; + +export default function(context) { + return new LinearClosed(context); +} diff --git a/node_modules/d3-shape/src/curve/monotone.js b/node_modules/d3-shape/src/curve/monotone.js new file mode 100644 index 00000000..2599031c --- /dev/null +++ b/node_modules/d3-shape/src/curve/monotone.js @@ -0,0 +1,104 @@ +function sign(x) { + return x < 0 ? -1 : 1; +} + +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. +function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; +} + +// Calculate a one-sided slope. +function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; +} + +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bézier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". +function point(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); +} + +function MonotoneX(context) { + this._context = context; +} + +MonotoneX.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x1, this._y1); break; + case 3: point(this, this._t0, slope2(this, this._t0)); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break; + default: point(this, this._t0, t1 = slope3(this, x, y)); break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } +} + +function MonotoneY(context) { + this._context = new ReflectContext(context); +} + +(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { + MonotoneX.prototype.point.call(this, y, x); +}; + +function ReflectContext(context) { + this._context = context; +} + +ReflectContext.prototype = { + moveTo: function(x, y) { this._context.moveTo(y, x); }, + closePath: function() { this._context.closePath(); }, + lineTo: function(x, y) { this._context.lineTo(y, x); }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } +}; + +export function monotoneX(context) { + return new MonotoneX(context); +} + +export function monotoneY(context) { + return new MonotoneY(context); +} diff --git a/node_modules/d3-shape/src/curve/natural.js b/node_modules/d3-shape/src/curve/natural.js new file mode 100644 index 00000000..d51eb513 --- /dev/null +++ b/node_modules/d3-shape/src/curve/natural.js @@ -0,0 +1,65 @@ +function Natural(context) { + this._context = context; +} + +Natural.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = []; + this._y = []; + }, + lineEnd: function() { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. +function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; +} + +export default function(context) { + return new Natural(context); +} diff --git a/node_modules/d3-shape/src/curve/radial.js b/node_modules/d3-shape/src/curve/radial.js new file mode 100644 index 00000000..730c989f --- /dev/null +++ b/node_modules/d3-shape/src/curve/radial.js @@ -0,0 +1,36 @@ +import curveLinear from "./linear.js"; + +export var curveRadialLinear = curveRadial(curveLinear); + +function Radial(curve) { + this._curve = curve; +} + +Radial.prototype = { + areaStart: function() { + this._curve.areaStart(); + }, + areaEnd: function() { + this._curve.areaEnd(); + }, + lineStart: function() { + this._curve.lineStart(); + }, + lineEnd: function() { + this._curve.lineEnd(); + }, + point: function(a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + } +}; + +export default function curveRadial(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; +} diff --git a/node_modules/d3-shape/src/curve/step.js b/node_modules/d3-shape/src/curve/step.js new file mode 100644 index 00000000..e9fb78ff --- /dev/null +++ b/node_modules/d3-shape/src/curve/step.js @@ -0,0 +1,53 @@ +function Step(context, t) { + this._context = context; + this._t = t; +} + +Step.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function() { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } +}; + +export default function(context) { + return new Step(context, 0.5); +} + +export function stepBefore(context) { + return new Step(context, 0); +} + +export function stepAfter(context) { + return new Step(context, 1); +} diff --git a/node_modules/d3-shape/src/descending.js b/node_modules/d3-shape/src/descending.js new file mode 100644 index 00000000..a4e2d7fb --- /dev/null +++ b/node_modules/d3-shape/src/descending.js @@ -0,0 +1,3 @@ +export default function(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} diff --git a/node_modules/d3-shape/src/identity.js b/node_modules/d3-shape/src/identity.js new file mode 100644 index 00000000..ca161abe --- /dev/null +++ b/node_modules/d3-shape/src/identity.js @@ -0,0 +1,3 @@ +export default function(d) { + return d; +} diff --git a/node_modules/d3-shape/src/index.js b/node_modules/d3-shape/src/index.js new file mode 100644 index 00000000..8ad85fce --- /dev/null +++ b/node_modules/d3-shape/src/index.js @@ -0,0 +1,47 @@ +export {default as arc} from "./arc.js"; +export {default as area} from "./area.js"; +export {default as line} from "./line.js"; +export {default as pie} from "./pie.js"; +export {default as areaRadial, default as radialArea} from "./areaRadial.js"; // Note: radialArea is deprecated! +export {default as lineRadial, default as radialLine} from "./lineRadial.js"; // Note: radialLine is deprecated! +export {default as pointRadial} from "./pointRadial.js"; +export {linkHorizontal, linkVertical, linkRadial} from "./link/index.js"; + +export {default as symbol, symbols} from "./symbol.js"; +export {default as symbolCircle} from "./symbol/circle.js"; +export {default as symbolCross} from "./symbol/cross.js"; +export {default as symbolDiamond} from "./symbol/diamond.js"; +export {default as symbolSquare} from "./symbol/square.js"; +export {default as symbolStar} from "./symbol/star.js"; +export {default as symbolTriangle} from "./symbol/triangle.js"; +export {default as symbolWye} from "./symbol/wye.js"; + +export {default as curveBasisClosed} from "./curve/basisClosed.js"; +export {default as curveBasisOpen} from "./curve/basisOpen.js"; +export {default as curveBasis} from "./curve/basis.js"; +export {bumpX as curveBumpX, bumpY as curveBumpY} from "./curve/bump.js"; +export {default as curveBundle} from "./curve/bundle.js"; +export {default as curveCardinalClosed} from "./curve/cardinalClosed.js"; +export {default as curveCardinalOpen} from "./curve/cardinalOpen.js"; +export {default as curveCardinal} from "./curve/cardinal.js"; +export {default as curveCatmullRomClosed} from "./curve/catmullRomClosed.js"; +export {default as curveCatmullRomOpen} from "./curve/catmullRomOpen.js"; +export {default as curveCatmullRom} from "./curve/catmullRom.js"; +export {default as curveLinearClosed} from "./curve/linearClosed.js"; +export {default as curveLinear} from "./curve/linear.js"; +export {monotoneX as curveMonotoneX, monotoneY as curveMonotoneY} from "./curve/monotone.js"; +export {default as curveNatural} from "./curve/natural.js"; +export {default as curveStep, stepAfter as curveStepAfter, stepBefore as curveStepBefore} from "./curve/step.js"; + +export {default as stack} from "./stack.js"; +export {default as stackOffsetExpand} from "./offset/expand.js"; +export {default as stackOffsetDiverging} from "./offset/diverging.js"; +export {default as stackOffsetNone} from "./offset/none.js"; +export {default as stackOffsetSilhouette} from "./offset/silhouette.js"; +export {default as stackOffsetWiggle} from "./offset/wiggle.js"; +export {default as stackOrderAppearance} from "./order/appearance.js"; +export {default as stackOrderAscending} from "./order/ascending.js"; +export {default as stackOrderDescending} from "./order/descending.js"; +export {default as stackOrderInsideOut} from "./order/insideOut.js"; +export {default as stackOrderNone} from "./order/none.js"; +export {default as stackOrderReverse} from "./order/reverse.js"; diff --git a/node_modules/d3-shape/src/line.js b/node_modules/d3-shape/src/line.js new file mode 100644 index 00000000..1ad92b23 --- /dev/null +++ b/node_modules/d3-shape/src/line.js @@ -0,0 +1,57 @@ +import {path} from "d3-path"; +import array from "./array.js"; +import constant from "./constant.js"; +import curveLinear from "./curve/linear.js"; +import {x as pointX, y as pointY} from "./point.js"; + +export default function(x, y) { + var defined = constant(true), + context = null, + curve = curveLinear, + output = null; + + x = typeof x === "function" ? x : (x === undefined) ? pointX : constant(x); + y = typeof y === "function" ? y : (y === undefined) ? pointY : constant(y); + + function line(data) { + var i, + n = (data = array(data)).length, + d, + defined0 = false, + buffer; + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) output.lineStart(); + else output.lineEnd(); + } + if (defined0) output.point(+x(d, i, data), +y(d, i, data)); + } + + if (buffer) return output = null, buffer + "" || null; + } + + line.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), line) : x; + }; + + line.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), line) : y; + }; + + line.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), line) : defined; + }; + + line.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + + line.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + + return line; +} diff --git a/node_modules/d3-shape/src/lineRadial.js b/node_modules/d3-shape/src/lineRadial.js new file mode 100644 index 00000000..beaf5773 --- /dev/null +++ b/node_modules/d3-shape/src/lineRadial.js @@ -0,0 +1,19 @@ +import curveRadial, {curveRadialLinear} from "./curve/radial.js"; +import line from "./line.js"; + +export function lineRadial(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function(_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return l; +} + +export default function() { + return lineRadial(line().curve(curveRadialLinear)); +} diff --git a/node_modules/d3-shape/src/link/index.js b/node_modules/d3-shape/src/link/index.js new file mode 100644 index 00000000..b3075d30 --- /dev/null +++ b/node_modules/d3-shape/src/link/index.js @@ -0,0 +1,84 @@ +import {path} from "d3-path"; +import {slice} from "../array.js"; +import constant from "../constant.js"; +import {x as pointX, y as pointY} from "../point.js"; +import pointRadial from "../pointRadial.js"; + +function linkSource(d) { + return d.source; +} + +function linkTarget(d) { + return d.target; +} + +function link(curve) { + var source = linkSource, + target = linkTarget, + x = pointX, + y = pointY, + context = null; + + function link() { + var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); + if (!context) context = buffer = path(); + curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv)); + if (buffer) return context = null, buffer + "" || null; + } + + link.source = function(_) { + return arguments.length ? (source = _, link) : source; + }; + + link.target = function(_) { + return arguments.length ? (target = _, link) : target; + }; + + link.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), link) : x; + }; + + link.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), link) : y; + }; + + link.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; + + return link; +} + +function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); +} + +function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); +} + +function curveRadial(context, x0, y0, x1, y1) { + var p0 = pointRadial(x0, y0), + p1 = pointRadial(x0, y0 = (y0 + y1) / 2), + p2 = pointRadial(x1, y0), + p3 = pointRadial(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); +} + +export function linkHorizontal() { + return link(curveHorizontal); +} + +export function linkVertical() { + return link(curveVertical); +} + +export function linkRadial() { + var l = link(curveRadial); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; +} diff --git a/node_modules/d3-shape/src/math.js b/node_modules/d3-shape/src/math.js new file mode 100644 index 00000000..131af621 --- /dev/null +++ b/node_modules/d3-shape/src/math.js @@ -0,0 +1,20 @@ +export var abs = Math.abs; +export var atan2 = Math.atan2; +export var cos = Math.cos; +export var max = Math.max; +export var min = Math.min; +export var sin = Math.sin; +export var sqrt = Math.sqrt; + +export var epsilon = 1e-12; +export var pi = Math.PI; +export var halfPi = pi / 2; +export var tau = 2 * pi; + +export function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); +} + +export function asin(x) { + return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); +} diff --git a/node_modules/d3-shape/src/noop.js b/node_modules/d3-shape/src/noop.js new file mode 100644 index 00000000..6ab80bc8 --- /dev/null +++ b/node_modules/d3-shape/src/noop.js @@ -0,0 +1 @@ +export default function() {} diff --git a/node_modules/d3-shape/src/offset/diverging.js b/node_modules/d3-shape/src/offset/diverging.js new file mode 100644 index 00000000..45a5fff6 --- /dev/null +++ b/node_modules/d3-shape/src/offset/diverging.js @@ -0,0 +1,14 @@ +export default function(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = 0, d[1] = dy; + } + } + } +} diff --git a/node_modules/d3-shape/src/offset/expand.js b/node_modules/d3-shape/src/offset/expand.js new file mode 100644 index 00000000..965bea1e --- /dev/null +++ b/node_modules/d3-shape/src/offset/expand.js @@ -0,0 +1,10 @@ +import none from "./none.js"; + +export default function(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none(series, order); +} diff --git a/node_modules/d3-shape/src/offset/none.js b/node_modules/d3-shape/src/offset/none.js new file mode 100644 index 00000000..d8e11dcb --- /dev/null +++ b/node_modules/d3-shape/src/offset/none.js @@ -0,0 +1,9 @@ +export default function(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } +} diff --git a/node_modules/d3-shape/src/offset/silhouette.js b/node_modules/d3-shape/src/offset/silhouette.js new file mode 100644 index 00000000..87829bec --- /dev/null +++ b/node_modules/d3-shape/src/offset/silhouette.js @@ -0,0 +1,10 @@ +import none from "./none.js"; + +export default function(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none(series, order); +} diff --git a/node_modules/d3-shape/src/offset/wiggle.js b/node_modules/d3-shape/src/offset/wiggle.js new file mode 100644 index 00000000..8db717cd --- /dev/null +++ b/node_modules/d3-shape/src/offset/wiggle.js @@ -0,0 +1,24 @@ +import none from "./none.js"; + +export default function(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none(series, order); +} diff --git a/node_modules/d3-shape/src/order/appearance.js b/node_modules/d3-shape/src/order/appearance.js new file mode 100644 index 00000000..e052924b --- /dev/null +++ b/node_modules/d3-shape/src/order/appearance.js @@ -0,0 +1,12 @@ +import none from "./none.js"; + +export default function(series) { + var peaks = series.map(peak); + return none(series).sort(function(a, b) { return peaks[a] - peaks[b]; }); +} + +function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; + return j; +} diff --git a/node_modules/d3-shape/src/order/ascending.js b/node_modules/d3-shape/src/order/ascending.js new file mode 100644 index 00000000..e0d28e3e --- /dev/null +++ b/node_modules/d3-shape/src/order/ascending.js @@ -0,0 +1,12 @@ +import none from "./none.js"; + +export default function(series) { + var sums = series.map(sum); + return none(series).sort(function(a, b) { return sums[a] - sums[b]; }); +} + +export function sum(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; +} diff --git a/node_modules/d3-shape/src/order/descending.js b/node_modules/d3-shape/src/order/descending.js new file mode 100644 index 00000000..dd272014 --- /dev/null +++ b/node_modules/d3-shape/src/order/descending.js @@ -0,0 +1,5 @@ +import ascending from "./ascending.js"; + +export default function(series) { + return ascending(series).reverse(); +} diff --git a/node_modules/d3-shape/src/order/insideOut.js b/node_modules/d3-shape/src/order/insideOut.js new file mode 100644 index 00000000..b0b2abda --- /dev/null +++ b/node_modules/d3-shape/src/order/insideOut.js @@ -0,0 +1,27 @@ +import appearance from "./appearance.js"; +import {sum} from "./ascending.js"; + +export default function(series) { + var n = series.length, + i, + j, + sums = series.map(sum), + order = appearance(series), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); +} diff --git a/node_modules/d3-shape/src/order/none.js b/node_modules/d3-shape/src/order/none.js new file mode 100644 index 00000000..b0d7d6f5 --- /dev/null +++ b/node_modules/d3-shape/src/order/none.js @@ -0,0 +1,5 @@ +export default function(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; +} diff --git a/node_modules/d3-shape/src/order/reverse.js b/node_modules/d3-shape/src/order/reverse.js new file mode 100644 index 00000000..8380ca04 --- /dev/null +++ b/node_modules/d3-shape/src/order/reverse.js @@ -0,0 +1,5 @@ +import none from "./none.js"; + +export default function(series) { + return none(series).reverse(); +} diff --git a/node_modules/d3-shape/src/pie.js b/node_modules/d3-shape/src/pie.js new file mode 100644 index 00000000..6748f45f --- /dev/null +++ b/node_modules/d3-shape/src/pie.js @@ -0,0 +1,80 @@ +import array from "./array.js"; +import constant from "./constant.js"; +import descending from "./descending.js"; +import identity from "./identity.js"; +import {tau} from "./math.js"; + +export default function() { + var value = identity, + sortValues = descending, + sort = null, + startAngle = constant(0), + endAngle = constant(tau), + padAngle = constant(0); + + function pie(data) { + var i, + n = (data = array(data)).length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; + + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } + + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); }); + else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); }); + + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } + + return arcs; + } + + pie.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), pie) : value; + }; + + pie.sortValues = function(_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + }; + + pie.sort = function(_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; + }; + + pie.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), pie) : startAngle; + }; + + pie.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), pie) : endAngle; + }; + + pie.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), pie) : padAngle; + }; + + return pie; +} diff --git a/node_modules/d3-shape/src/point.js b/node_modules/d3-shape/src/point.js new file mode 100644 index 00000000..c3452573 --- /dev/null +++ b/node_modules/d3-shape/src/point.js @@ -0,0 +1,7 @@ +export function x(p) { + return p[0]; +} + +export function y(p) { + return p[1]; +} diff --git a/node_modules/d3-shape/src/pointRadial.js b/node_modules/d3-shape/src/pointRadial.js new file mode 100644 index 00000000..1cccb705 --- /dev/null +++ b/node_modules/d3-shape/src/pointRadial.js @@ -0,0 +1,3 @@ +export default function(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; +} diff --git a/node_modules/d3-shape/src/stack.js b/node_modules/d3-shape/src/stack.js new file mode 100644 index 00000000..c4d30b1b --- /dev/null +++ b/node_modules/d3-shape/src/stack.js @@ -0,0 +1,58 @@ +import array from "./array.js"; +import constant from "./constant.js"; +import offsetNone from "./offset/none.js"; +import orderNone from "./order/none.js"; + +function stackValue(d, key) { + return d[key]; +} + +function stackSeries(key) { + const series = []; + series.key = key; + return series; +} + +export default function() { + var keys = constant([]), + order = orderNone, + offset = offsetNone, + value = stackValue; + + function stack(data) { + var sz = Array.from(keys.apply(this, arguments), stackSeries), + i, n = sz.length, j = -1, + oz; + + for (const d of data) { + for (i = 0, ++j; i < n; ++i) { + (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d; + } + } + + for (i = 0, oz = array(order(sz)); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function(_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant(Array.from(_)), stack) : keys; + }; + + stack.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), stack) : value; + }; + + stack.order = function(_) { + return arguments.length ? (order = _ == null ? orderNone : typeof _ === "function" ? _ : constant(Array.from(_)), stack) : order; + }; + + stack.offset = function(_) { + return arguments.length ? (offset = _ == null ? offsetNone : _, stack) : offset; + }; + + return stack; +} diff --git a/node_modules/d3-shape/src/symbol.js b/node_modules/d3-shape/src/symbol.js new file mode 100644 index 00000000..749b4923 --- /dev/null +++ b/node_modules/d3-shape/src/symbol.js @@ -0,0 +1,46 @@ +import {path} from "d3-path"; +import circle from "./symbol/circle.js"; +import cross from "./symbol/cross.js"; +import diamond from "./symbol/diamond.js"; +import star from "./symbol/star.js"; +import square from "./symbol/square.js"; +import triangle from "./symbol/triangle.js"; +import wye from "./symbol/wye.js"; +import constant from "./constant.js"; + +export var symbols = [ + circle, + cross, + diamond, + square, + star, + triangle, + wye +]; + +export default function(type, size) { + var context = null; + type = typeof type === "function" ? type : constant(type || circle); + size = typeof size === "function" ? size : constant(size === undefined ? 64 : +size); + + function symbol() { + var buffer; + if (!context) context = buffer = path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; + } + + symbol.type = function(_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant(_), symbol) : type; + }; + + symbol.size = function(_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant(+_), symbol) : size; + }; + + symbol.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; + + return symbol; +} diff --git a/node_modules/d3-shape/src/symbol/circle.js b/node_modules/d3-shape/src/symbol/circle.js new file mode 100644 index 00000000..46536511 --- /dev/null +++ b/node_modules/d3-shape/src/symbol/circle.js @@ -0,0 +1,9 @@ +import {pi, tau} from "../math.js"; + +export default { + draw: function(context, size) { + var r = Math.sqrt(size / pi); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau); + } +}; diff --git a/node_modules/d3-shape/src/symbol/cross.js b/node_modules/d3-shape/src/symbol/cross.js new file mode 100644 index 00000000..a282f805 --- /dev/null +++ b/node_modules/d3-shape/src/symbol/cross.js @@ -0,0 +1,18 @@ +export default { + draw: function(context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } +}; diff --git a/node_modules/d3-shape/src/symbol/diamond.js b/node_modules/d3-shape/src/symbol/diamond.js new file mode 100644 index 00000000..9f4ff1af --- /dev/null +++ b/node_modules/d3-shape/src/symbol/diamond.js @@ -0,0 +1,14 @@ +var tan30 = Math.sqrt(1 / 3), + tan30_2 = tan30 * 2; + +export default { + draw: function(context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } +}; diff --git a/node_modules/d3-shape/src/symbol/square.js b/node_modules/d3-shape/src/symbol/square.js new file mode 100644 index 00000000..10beccd5 --- /dev/null +++ b/node_modules/d3-shape/src/symbol/square.js @@ -0,0 +1,7 @@ +export default { + draw: function(context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } +}; diff --git a/node_modules/d3-shape/src/symbol/star.js b/node_modules/d3-shape/src/symbol/star.js new file mode 100644 index 00000000..c3560c35 --- /dev/null +++ b/node_modules/d3-shape/src/symbol/star.js @@ -0,0 +1,24 @@ +import {pi, tau} from "../math.js"; + +var ka = 0.89081309152928522810, + kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10), + kx = Math.sin(tau / 10) * kr, + ky = -Math.cos(tau / 10) * kr; + +export default { + draw: function(context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); + } + context.closePath(); + } +}; diff --git a/node_modules/d3-shape/src/symbol/triangle.js b/node_modules/d3-shape/src/symbol/triangle.js new file mode 100644 index 00000000..a323d200 --- /dev/null +++ b/node_modules/d3-shape/src/symbol/triangle.js @@ -0,0 +1,11 @@ +var sqrt3 = Math.sqrt(3); + +export default { + draw: function(context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); + } +}; diff --git a/node_modules/d3-shape/src/symbol/wye.js b/node_modules/d3-shape/src/symbol/wye.js new file mode 100644 index 00000000..697f2c3c --- /dev/null +++ b/node_modules/d3-shape/src/symbol/wye.js @@ -0,0 +1,26 @@ +var c = -0.5, + s = Math.sqrt(3) / 2, + k = 1 / Math.sqrt(12), + a = (k / 2 + 1) * 3; + +export default { + draw: function(context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c * x0 - s * y0, s * x0 + c * y0); + context.lineTo(c * x1 - s * y1, s * x1 + c * y1); + context.lineTo(c * x2 - s * y2, s * x2 + c * y2); + context.lineTo(c * x0 + s * y0, c * y0 - s * x0); + context.lineTo(c * x1 + s * y1, c * y1 - s * x1); + context.lineTo(c * x2 + s * y2, c * y2 - s * x2); + context.closePath(); + } +}; diff --git a/node_modules/d3-time-format/LICENSE b/node_modules/d3-time-format/LICENSE new file mode 100644 index 00000000..1d9d875e --- /dev/null +++ b/node_modules/d3-time-format/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2017 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-time-format/README.md b/node_modules/d3-time-format/README.md new file mode 100644 index 00000000..18b86dd8 --- /dev/null +++ b/node_modules/d3-time-format/README.md @@ -0,0 +1,199 @@ +# d3-time-format + +This module provides a JavaScript implementation of the venerable [strptime](http://pubs.opengroup.org/onlinepubs/009695399/functions/strptime.html) and [strftime](http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html) functions from the C standard library, and can be used to parse or format [dates](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) in a variety of locale-specific representations. To format a date, create a [formatter](#locale_format) from a specifier (a string with the desired format *directives*, indicated by `%`); then pass a date to the formatter, which returns a string. For example, to convert the current date to a human-readable string: + +```js +var formatTime = d3.timeFormat("%B %d, %Y"); +formatTime(new Date); // "June 30, 2015" +``` + +Likewise, to convert a string back to a date, create a [parser](#locale_parse): + +```js +var parseTime = d3.timeParse("%B %d, %Y"); +parseTime("June 30, 2015"); // Tue Jun 30 2015 00:00:00 GMT-0700 (PDT) +``` + +You can implement more elaborate conditional time formats, too. For example, here’s a [multi-scale time format](https://bl.ocks.org/mbostock/4149176) using [time intervals](https://github.com/d3/d3-time): + +```js +var formatMillisecond = d3.timeFormat(".%L"), + formatSecond = d3.timeFormat(":%S"), + formatMinute = d3.timeFormat("%I:%M"), + formatHour = d3.timeFormat("%I %p"), + formatDay = d3.timeFormat("%a %d"), + formatWeek = d3.timeFormat("%b %d"), + formatMonth = d3.timeFormat("%B"), + formatYear = d3.timeFormat("%Y"); + +function multiFormat(date) { + return (d3.timeSecond(date) < date ? formatMillisecond + : d3.timeMinute(date) < date ? formatSecond + : d3.timeHour(date) < date ? formatMinute + : d3.timeDay(date) < date ? formatHour + : d3.timeMonth(date) < date ? (d3.timeWeek(date) < date ? formatDay : formatWeek) + : d3.timeYear(date) < date ? formatMonth + : formatYear)(date); +} +``` + +This module is used by D3 [time scales](https://github.com/d3/d3-scale/blob/master/README.md#time-scales) to generate human-readable ticks. + +## Installing + +If you use NPM, `npm install d3-time-format`. Otherwise, download the [latest release](https://github.com/d3/d3-time-format/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-time-format.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + +``` + +Locale files are published to npm and can be loaded using [d3.json](https://github.com/d3/d3-request/blob/master/README.md#json). For example, to set Russian as the default locale: + +```js +d3.json("https://cdn.jsdelivr.net/npm/d3-time-format@3/locale/ru-RU.json", function(error, locale) { + if (error) throw error; + + d3.timeFormatDefaultLocale(locale); + + var format = d3.timeFormat("%c"); + + console.log(format(new Date)); // понедельник, 5 Ð´ÐµÐºÐ°Ð±Ñ€Ñ 2016 г. 10:31:59 +}); +``` + +## API Reference + +# d3.timeFormat(specifier) · [Source](https://github.com/d3/d3-time-format/blob/master/src/defaultLocale.js) + +An alias for [*locale*.format](#locale_format) on the [default locale](#timeFormatDefaultLocale). + +# d3.timeParse(specifier) · [Source](https://github.com/d3/d3-time-format/blob/master/src/defaultLocale.js) + +An alias for [*locale*.parse](#locale_parse) on the [default locale](#timeFormatDefaultLocale). + +# d3.utcFormat(specifier) · [Source](https://github.com/d3/d3-time-format/blob/master/src/defaultLocale.js) + +An alias for [*locale*.utcFormat](#locale_utcFormat) on the [default locale](#timeFormatDefaultLocale). + +# d3.utcParse(specifier) · [Source](https://github.com/d3/d3-time-format/blob/master/src/defaultLocale.js) + +An alias for [*locale*.utcParse](#locale_utcParse) on the [default locale](#timeFormatDefaultLocale). + +# d3.isoFormat · [Source](https://github.com/d3/d3-time-format/blob/master/src/isoFormat.js) + +The full [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) UTC time formatter. Where available, this method will use [Date.toISOString](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/toISOString) to format. + +# d3.isoParse · [Source](https://github.com/d3/d3-time-format/blob/master/src/isoParse.js) + +The full [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) UTC time parser. Where available, this method will use the [Date constructor](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date) to parse strings. If you depend on strict validation of the input format according to ISO 8601, you should construct a [UTC parser function](#utcParse): + +```js +var strictIsoParse = d3.utcParse("%Y-%m-%dT%H:%M:%S.%LZ"); +``` + +# locale.format(specifier) · [Source](https://github.com/d3/d3-time-format/blob/master/src/locale.js) + +Returns a new formatter for the given string *specifier*. The specifier string may contain the following directives: + +* `%a` - abbreviated weekday name.* +* `%A` - full weekday name.* +* `%b` - abbreviated month name.* +* `%B` - full month name.* +* `%c` - the locale’s date and time, such as `%x, %X`.* +* `%d` - zero-padded day of the month as a decimal number [01,31]. +* `%e` - space-padded day of the month as a decimal number [ 1,31]; equivalent to `%_d`. +* `%f` - microseconds as a decimal number [000000, 999999]. +* `%g` - ISO 8601 week-based year without century as a decimal number [00,99]. +* `%G` - ISO 8601 week-based year with century as a decimal number. +* `%H` - hour (24-hour clock) as a decimal number [00,23]. +* `%I` - hour (12-hour clock) as a decimal number [01,12]. +* `%j` - day of the year as a decimal number [001,366]. +* `%m` - month as a decimal number [01,12]. +* `%M` - minute as a decimal number [00,59]. +* `%L` - milliseconds as a decimal number [000, 999]. +* `%p` - either AM or PM.* +* `%q` - quarter of the year as a decimal number [1,4]. +* `%Q` - milliseconds since UNIX epoch. +* `%s` - seconds since UNIX epoch. +* `%S` - second as a decimal number [00,61]. +* `%u` - Monday-based (ISO 8601) weekday as a decimal number [1,7]. +* `%U` - Sunday-based week of the year as a decimal number [00,53]. +* `%V` - ISO 8601 week of the year as a decimal number [01, 53]. +* `%w` - Sunday-based weekday as a decimal number [0,6]. +* `%W` - Monday-based week of the year as a decimal number [00,53]. +* `%x` - the locale’s date, such as `%-m/%-d/%Y`.* +* `%X` - the locale’s time, such as `%-I:%M:%S %p`.* +* `%y` - year without century as a decimal number [00,99]. +* `%Y` - year with century as a decimal number, such as `1999`. +* `%Z` - time zone offset, such as `-0700`, `-07:00`, `-07`, or `Z`. +* `%%` - a literal percent sign (`%`). + +Directives marked with an asterisk (\*) may be affected by the [locale definition](#locales). + +For `%U`, all days in a new year preceding the first Sunday are considered to be in week 0. For `%W`, all days in a new year preceding the first Monday are considered to be in week 0. Week numbers are computed using [*interval*.count](https://github.com/d3/d3-time/blob/master/README.md#interval_count). For example, 2015-52 and 2016-00 represent Monday, December 28, 2015, while 2015-53 and 2016-01 represent Monday, January 4, 2016. This differs from the [ISO week date](https://en.wikipedia.org/wiki/ISO_week_date) specification (`%V`), which uses a more complicated definition! + +For `%V`,`%g` and `%G`, per the [strftime man page](http://man7.org/linux/man-pages/man3/strftime.3.html): + +> In this system, weeks start on a Monday, and are numbered from 01, for the first week, up to 52 or 53, for the last week. Week 1 is the first week where four or more days fall within the new year (or, synonymously, week 01 is: the first week of the year that contains a Thursday; or, the week that has 4 January in it). If the ISO week number belongs to the previous or next year, that year is used instead. + +The `%` sign indicating a directive may be immediately followed by a padding modifier: + +* `0` - zero-padding +* `_` - space-padding +* `-` - disable padding + +If no padding modifier is specified, the default is `0` for all directives except `%e`, which defaults to `_`. (In some implementations of strftime and strptime, a directive may include an optional field width or precision; this feature is not yet implemented.) + +The returned function formats a specified *[date](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date)*, returning the corresponding string. + +```js +var formatMonth = d3.timeFormat("%B"), + formatDay = d3.timeFormat("%A"), + date = new Date(2014, 4, 1); // Thu May 01 2014 00:00:00 GMT-0700 (PDT) + +formatMonth(date); // "May" +formatDay(date); // "Thursday" +``` + +# locale.parse(specifier) · [Source](https://github.com/d3/d3-time-format/blob/master/src/locale.js) + +Returns a new parser for the given string *specifier*. The specifier string may contain the same directives as [*locale*.format](#locale_format). The `%d` and `%e` directives are considered equivalent for parsing. + +The returned function parses a specified *string*, returning the corresponding [date](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date) or null if the string could not be parsed according to this format’s specifier. Parsing is strict: if the specified string does not exactly match the associated specifier, this method returns null. For example, if the associated specifier is `%Y-%m-%dT%H:%M:%SZ`, then the string `"2011-07-01T19:15:28Z"` will be parsed as expected, but `"2011-07-01T19:15:28"`, `"2011-07-01 19:15:28"` and `"2011-07-01"` will return null. (Note that the literal `Z` here is different from the time zone offset directive `%Z`.) If a more flexible parser is desired, try multiple formats sequentially until one returns non-null. + +# locale.utcFormat(specifier) · [Source](https://github.com/d3/d3-time-format/blob/master/src/locale.js) + +Equivalent to [*locale*.format](#locale_format), except all directives are interpreted as [Coordinated Universal Time (UTC)](https://en.wikipedia.org/wiki/Coordinated_Universal_Time) rather than local time. + +# locale.utcParse(specifier) · [Source](https://github.com/d3/d3-time-format/blob/master/src/locale.js) + +Equivalent to [*locale*.parse](#locale_parse), except all directives are interpreted as [Coordinated Universal Time (UTC)](https://en.wikipedia.org/wiki/Coordinated_Universal_Time) rather than local time. + +### Locales + +# d3.timeFormatLocale(definition) · [Source](https://github.com/d3/d3-time-format/blob/master/src/locale.js) + +Returns a *locale* object for the specified *definition* with [*locale*.format](#locale_format), [*locale*.parse](#locale_parse), [*locale*.utcFormat](#locale_utcFormat), [*locale*.utcParse](#locale_utcParse) methods. The *definition* must include the following properties: + +* `dateTime` - the date and time (`%c`) format specifier (e.g., `"%a %b %e %X %Y"`). +* `date` - the date (`%x`) format specifier (e.g., `"%m/%d/%Y"`). +* `time` - the time (`%X`) format specifier (e.g., `"%H:%M:%S"`). +* `periods` - the A.M. and P.M. equivalents (e.g., `["AM", "PM"]`). +* `days` - the full names of the weekdays, starting with Sunday. +* `shortDays` - the abbreviated names of the weekdays, starting with Sunday. +* `months` - the full names of the months (starting with January). +* `shortMonths` - the abbreviated names of the months (starting with January). + +For an example, see [Localized Time Axis II](https://bl.ocks.org/mbostock/805115ebaa574e771db1875a6d828949). + +# d3.timeFormatDefaultLocale(definition) · [Source](https://github.com/d3/d3-time-format/blob/master/src/defaultLocale.js) + +Equivalent to [d3.timeFormatLocale](#timeFormatLocale), except it also redefines [d3.timeFormat](#timeFormat), [d3.timeParse](#timeParse), [d3.utcFormat](#utcFormat) and [d3.utcParse](#utcParse) to the new locale’s [*locale*.format](#locale_format), [*locale*.parse](#locale_parse), [*locale*.utcFormat](#locale_utcFormat) and [*locale*.utcParse](#locale_utcParse). If you do not set a default locale, it defaults to [U.S. English](https://github.com/d3/d3-time-format/blob/master/locale/en-US.json). + +For an example, see [Localized Time Axis](https://bl.ocks.org/mbostock/6f1cc065d4d172bcaf322e399aa8d62f). diff --git a/node_modules/d3-time-format/dist/d3-time-format.js b/node_modules/d3-time-format/dist/d3-time-format.js new file mode 100644 index 00000000..516c0730 --- /dev/null +++ b/node_modules/d3-time-format/dist/d3-time-format.js @@ -0,0 +1,741 @@ +// https://d3js.org/d3-time-format/ v3.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-time')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-time'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); +}(this, function (exports, d3Time) { 'use strict'; + +function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); +} + +function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); +} + +function newDate(y, m, d) { + return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; +} + +function formatLocale(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "f": formatMicroseconds, + "g": formatYearISO, + "G": formatFullYearISO, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "q": formatQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatSeconds, + "u": formatWeekdayNumberMonday, + "U": formatWeekNumberSunday, + "V": formatWeekNumberISO, + "w": formatWeekdayNumberSunday, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "f": formatUTCMicroseconds, + "g": formatUTCYearISO, + "G": formatUTCFullYearISO, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "q": formatUTCQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatUTCSeconds, + "u": formatUTCWeekdayNumberMonday, + "U": formatUTCWeekNumberSunday, + "V": formatUTCWeekNumberISO, + "w": formatUTCWeekdayNumberSunday, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "f": parseMicroseconds, + "g": parseYear, + "G": parseFullYear, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "q": parseQuarter, + "Q": parseUnixTimestamp, + "s": parseUnixTimestampSeconds, + "S": parseSeconds, + "u": parseWeekdayNumberMonday, + "U": parseWeekNumberSunday, + "V": parseWeekNumberISO, + "w": parseWeekdayNumberSunday, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function(date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, Z) { + return function(string) { + var d = newDate(1900, undefined, 1), + i = parseSpecifier(d, specifier, string += "", 0), + week, day; + if (i != string.length) return null; + + // If a UNIX timestamp is specified, return it. + if ("Q" in d) return new Date(d.Q); + if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); + + // If this is utcParse, never use the local timezone. + if (Z && !("Z" in d)) d.Z = 0; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // If the month was not specified, inherit from the quarter. + if (d.m === undefined) d.m = "q" in d ? d.q : 0; + + // Convert day-of-week and week-of-year to day-of-year. + if ("V" in d) { + if (d.V < 1 || d.V > 53) return null; + if (!("w" in d)) d.w = 1; + if ("Z" in d) { + week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay(); + week = day > 4 || day === 0 ? d3Time.utcMonday.ceil(week) : d3Time.utcMonday(week); + week = d3Time.utcDay.offset(week, (d.V - 1) * 7); + d.y = week.getUTCFullYear(); + d.m = week.getUTCMonth(); + d.d = week.getUTCDate() + (d.w + 6) % 7; + } else { + week = localDate(newDate(d.y, 0, 1)), day = week.getDay(); + week = day > 4 || day === 0 ? d3Time.timeMonday.ceil(week) : d3Time.timeMonday(week); + week = d3Time.timeDay.offset(week, (d.V - 1) * 7); + d.y = week.getFullYear(); + d.m = week.getMonth(); + d.d = week.getDate() + (d.w + 6) % 7; + } + } else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; + day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return localDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatQuarter(d) { + return 1 + ~~(d.getMonth() / 3); + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + function formatUTCQuarter(d) { + return 1 + ~~(d.getUTCMonth() / 3); + } + + return { + format: function(specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function() { return specifier; }; + return f; + }, + parse: function(specifier) { + var p = newParse(specifier += "", false); + p.toString = function() { return specifier; }; + return p; + }, + utcFormat: function(specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function() { return specifier; }; + return f; + }, + utcParse: function(specifier) { + var p = newParse(specifier += "", true); + p.toString = function() { return specifier; }; + return p; + } + }; +} + +var pads = {"-": "", "_": " ", "0": "0"}, + numberRe = /^\s*\d+/, // note: ignores next directive + percentRe = /^%/, + requoteRe = /[\\^$*+?|[\]().{}]/g; + +function pad(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); +} + +function requote(s) { + return s.replace(requoteRe, "\\$&"); +} + +function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); +} + +function formatLookup(names) { + return new Map(names.map((name, i) => [name.toLowerCase(), i])); +} + +function parseWeekdayNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; +} + +function parseWeekdayNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.u = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.U = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberISO(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.V = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.W = +n[0], i + n[0].length) : -1; +} + +function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; +} + +function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; +} + +function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; +} + +function parseQuarter(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; +} + +function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; +} + +function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; +} + +function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; +} + +function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; +} + +function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; +} + +function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; +} + +function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; +} + +function parseMicroseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 6)); + return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; +} + +function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; +} + +function parseUnixTimestamp(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = +n[0], i + n[0].length) : -1; +} + +function parseUnixTimestampSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.s = +n[0], i + n[0].length) : -1; +} + +function formatDayOfMonth(d, p) { + return pad(d.getDate(), p, 2); +} + +function formatHour24(d, p) { + return pad(d.getHours(), p, 2); +} + +function formatHour12(d, p) { + return pad(d.getHours() % 12 || 12, p, 2); +} + +function formatDayOfYear(d, p) { + return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3); +} + +function formatMilliseconds(d, p) { + return pad(d.getMilliseconds(), p, 3); +} + +function formatMicroseconds(d, p) { + return formatMilliseconds(d, p) + "000"; +} + +function formatMonthNumber(d, p) { + return pad(d.getMonth() + 1, p, 2); +} + +function formatMinutes(d, p) { + return pad(d.getMinutes(), p, 2); +} + +function formatSeconds(d, p) { + return pad(d.getSeconds(), p, 2); +} + +function formatWeekdayNumberMonday(d) { + var day = d.getDay(); + return day === 0 ? 7 : day; +} + +function formatWeekNumberSunday(d, p) { + return pad(d3Time.timeSunday.count(d3Time.timeYear(d) - 1, d), p, 2); +} + +function dISO(d) { + var day = d.getDay(); + return (day >= 4 || day === 0) ? d3Time.timeThursday(d) : d3Time.timeThursday.ceil(d); +} + +function formatWeekNumberISO(d, p) { + d = dISO(d); + return pad(d3Time.timeThursday.count(d3Time.timeYear(d), d) + (d3Time.timeYear(d).getDay() === 4), p, 2); +} + +function formatWeekdayNumberSunday(d) { + return d.getDay(); +} + +function formatWeekNumberMonday(d, p) { + return pad(d3Time.timeMonday.count(d3Time.timeYear(d) - 1, d), p, 2); +} + +function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); +} + +function formatYearISO(d, p) { + d = dISO(d); + return pad(d.getFullYear() % 100, p, 2); +} + +function formatFullYear(d, p) { + return pad(d.getFullYear() % 10000, p, 4); +} + +function formatFullYearISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? d3Time.timeThursday(d) : d3Time.timeThursday.ceil(d); + return pad(d.getFullYear() % 10000, p, 4); +} + +function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad(z / 60 | 0, "0", 2) + + pad(z % 60, "0", 2); +} + +function formatUTCDayOfMonth(d, p) { + return pad(d.getUTCDate(), p, 2); +} + +function formatUTCHour24(d, p) { + return pad(d.getUTCHours(), p, 2); +} + +function formatUTCHour12(d, p) { + return pad(d.getUTCHours() % 12 || 12, p, 2); +} + +function formatUTCDayOfYear(d, p) { + return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3); +} + +function formatUTCMilliseconds(d, p) { + return pad(d.getUTCMilliseconds(), p, 3); +} + +function formatUTCMicroseconds(d, p) { + return formatUTCMilliseconds(d, p) + "000"; +} + +function formatUTCMonthNumber(d, p) { + return pad(d.getUTCMonth() + 1, p, 2); +} + +function formatUTCMinutes(d, p) { + return pad(d.getUTCMinutes(), p, 2); +} + +function formatUTCSeconds(d, p) { + return pad(d.getUTCSeconds(), p, 2); +} + +function formatUTCWeekdayNumberMonday(d) { + var dow = d.getUTCDay(); + return dow === 0 ? 7 : dow; +} + +function formatUTCWeekNumberSunday(d, p) { + return pad(d3Time.utcSunday.count(d3Time.utcYear(d) - 1, d), p, 2); +} + +function UTCdISO(d) { + var day = d.getUTCDay(); + return (day >= 4 || day === 0) ? d3Time.utcThursday(d) : d3Time.utcThursday.ceil(d); +} + +function formatUTCWeekNumberISO(d, p) { + d = UTCdISO(d); + return pad(d3Time.utcThursday.count(d3Time.utcYear(d), d) + (d3Time.utcYear(d).getUTCDay() === 4), p, 2); +} + +function formatUTCWeekdayNumberSunday(d) { + return d.getUTCDay(); +} + +function formatUTCWeekNumberMonday(d, p) { + return pad(d3Time.utcMonday.count(d3Time.utcYear(d) - 1, d), p, 2); +} + +function formatUTCYear(d, p) { + return pad(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCYearISO(d, p) { + d = UTCdISO(d); + return pad(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCFullYear(d, p) { + return pad(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCFullYearISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? d3Time.utcThursday(d) : d3Time.utcThursday.ceil(d); + return pad(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCZone() { + return "+0000"; +} + +function formatLiteralPercent() { + return "%"; +} + +function formatUnixTimestamp(d) { + return +d; +} + +function formatUnixTimestampSeconds(d) { + return Math.floor(+d / 1000); +} + +var locale; + +defaultLocale({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +}); + +function defaultLocale(definition) { + locale = formatLocale(definition); + exports.timeFormat = locale.format; + exports.timeParse = locale.parse; + exports.utcFormat = locale.utcFormat; + exports.utcParse = locale.utcParse; + return locale; +} + +var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + +function formatIsoNative(date) { + return date.toISOString(); +} + +var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); + +function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; +} + +var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); + +exports.isoFormat = formatIso; +exports.isoParse = parseIso; +exports.timeFormatDefaultLocale = defaultLocale; +exports.timeFormatLocale = formatLocale; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-time-format/dist/d3-time-format.min.js b/node_modules/d3-time-format/dist/d3-time-format.min.js new file mode 100644 index 00000000..668a1275 --- /dev/null +++ b/node_modules/d3-time-format/dist/d3-time-format.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-time-format/ v3.0.0 Copyright 2020 Mike Bostock +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-time")):"function"==typeof define&&define.amd?define(["exports","d3-time"],t):t((e=e||self).d3=e.d3||{},e.d3)}(this,function(e,t){"use strict";function n(e){if(0<=e.y&&e.y<100){var t=new Date(-1,e.m,e.d,e.H,e.M,e.S,e.L);return t.setFullYear(e.y),t}return new Date(e.y,e.m,e.d,e.H,e.M,e.S,e.L)}function r(e){if(0<=e.y&&e.y<100){var t=new Date(Date.UTC(-1,e.m,e.d,e.H,e.M,e.S,e.L));return t.setUTCFullYear(e.y),t}return new Date(Date.UTC(e.y,e.m,e.d,e.H,e.M,e.S,e.L))}function u(e,t,n){return{y:e,m:t,d:n,H:0,M:0,S:0,L:0}}function i(e){var i=e.dateTime,c=e.date,a=e.time,f=e.periods,l=e.days,s=e.shortDays,g=e.months,G=e.shortMonths,ge=y(f),pe=d(f),we=y(l),Se=d(l),Ye=y(s),Fe=d(s),Le=y(g),He=d(g),Ae=y(G),Ze=d(G),be={a:function(e){return s[e.getDay()]},A:function(e){return l[e.getDay()]},b:function(e){return G[e.getMonth()]},B:function(e){return g[e.getMonth()]},c:null,d:V,e:V,f:J,g:R,G:K,H:j,I:P,j:q,L:I,m:O,M:Q,p:function(e){return f[+(e.getHours()>=12)]},q:function(e){return 1+~~(e.getMonth()/3)},Q:Ue,s:xe,S:X,u:N,U:B,V:_,w:$,W:z,x:null,X:null,y:E,Y:k,Z:ee,"%":Ce},We={a:function(e){return s[e.getUTCDay()]},A:function(e){return l[e.getUTCDay()]},b:function(e){return G[e.getUTCMonth()]},B:function(e){return g[e.getUTCMonth()]},c:null,d:te,e:te,f:ce,g:ve,G:Me,H:ne,I:re,j:ue,L:ie,m:oe,M:ae,p:function(e){return f[+(e.getUTCHours()>=12)]},q:function(e){return 1+~~(e.getUTCMonth()/3)},Q:Ue,s:xe,S:fe,u:le,U:se,V:ye,w:de,W:he,x:null,X:null,y:me,Y:Te,Z:De,"%":Ce},Ve={a:function(e,t,n){var r=Ye.exec(t.slice(n));return r?(e.w=Fe.get(r[0].toLowerCase()),n+r[0].length):-1},A:function(e,t,n){var r=we.exec(t.slice(n));return r?(e.w=Se.get(r[0].toLowerCase()),n+r[0].length):-1},b:function(e,t,n){var r=Ae.exec(t.slice(n));return r?(e.m=Ze.get(r[0].toLowerCase()),n+r[0].length):-1},B:function(e,t,n){var r=Le.exec(t.slice(n));return r?(e.m=He.get(r[0].toLowerCase()),n+r[0].length):-1},c:function(e,t,n){return qe(e,i,t,n)},d:w,e:w,f:A,g:C,G:D,H:Y,I:Y,j:S,L:H,m:p,M:F,p:function(e,t,n){var r=ge.exec(t.slice(n));return r?(e.p=pe.get(r[0].toLowerCase()),n+r[0].length):-1},q:x,Q:b,s:W,S:L,u:m,U:v,V:T,w:h,W:M,x:function(e,t,n){return qe(e,c,t,n)},X:function(e,t,n){return qe(e,a,t,n)},y:C,Y:D,Z:U,"%":Z};function je(e,t){return function(n){var r,u,i,c=[],a=-1,f=0,l=e.length;for(n instanceof Date||(n=new Date(+n));++a53)return null;"w"in f||(f.w=1),"Z"in f?(a=(o=r(u(f.y,0,1))).getUTCDay(),o=a>4||0===a?t.utcMonday.ceil(o):t.utcMonday(o),o=t.utcDay.offset(o,7*(f.V-1)),f.y=o.getUTCFullYear(),f.m=o.getUTCMonth(),f.d=o.getUTCDate()+(f.w+6)%7):(a=(o=n(u(f.y,0,1))).getDay(),o=a>4||0===a?t.timeMonday.ceil(o):t.timeMonday(o),o=t.timeDay.offset(o,7*(f.V-1)),f.y=o.getFullYear(),f.m=o.getMonth(),f.d=o.getDate()+(f.w+6)%7)}else("W"in f||"U"in f)&&("w"in f||(f.w="u"in f?f.u%7:"W"in f?1:0),a="Z"in f?r(u(f.y,0,1)).getUTCDay():n(u(f.y,0,1)).getDay(),f.m=0,f.d="W"in f?(f.w+6)%7+7*f.W-(a+5)%7:f.w+7*f.U-(a+6)%7);return"Z"in f?(f.H+=f.Z/100|0,f.M+=f.Z%100,r(f)):n(f)}}function qe(e,t,n,r){for(var u,i,c=0,a=t.length,f=n.length;c=f)return-1;if(37===(u=t.charCodeAt(c++))){if(u=t.charAt(c++),!(i=Ve[u in o?t.charAt(c++):u])||(r=i(e,n,r))<0)return-1}else if(u!=n.charCodeAt(r++))return-1}return r}return be.x=je(c,be),be.X=je(a,be),be.c=je(i,be),We.x=je(c,We),We.X=je(a,We),We.c=je(i,We),{format:function(e){var t=je(e+="",be);return t.toString=function(){return e},t},parse:function(e){var t=Pe(e+="",!1);return t.toString=function(){return e},t},utcFormat:function(e){var t=je(e+="",We);return t.toString=function(){return e},t},utcParse:function(e){var t=Pe(e+="",!0);return t.toString=function(){return e},t}}}var c,o={"-":"",_:" ",0:"0"},a=/^\s*\d+/,f=/^%/,l=/[\\^$*+?|[\]().{}]/g;function s(e,t,n){var r=e<0?"-":"",u=(r?-e:e)+"",i=u.length;return r+(i[e.toLowerCase(),t]))}function h(e,t,n){var r=a.exec(t.slice(n,n+1));return r?(e.w=+r[0],n+r[0].length):-1}function m(e,t,n){var r=a.exec(t.slice(n,n+1));return r?(e.u=+r[0],n+r[0].length):-1}function v(e,t,n){var r=a.exec(t.slice(n,n+2));return r?(e.U=+r[0],n+r[0].length):-1}function T(e,t,n){var r=a.exec(t.slice(n,n+2));return r?(e.V=+r[0],n+r[0].length):-1}function M(e,t,n){var r=a.exec(t.slice(n,n+2));return r?(e.W=+r[0],n+r[0].length):-1}function D(e,t,n){var r=a.exec(t.slice(n,n+4));return r?(e.y=+r[0],n+r[0].length):-1}function C(e,t,n){var r=a.exec(t.slice(n,n+2));return r?(e.y=+r[0]+(+r[0]>68?1900:2e3),n+r[0].length):-1}function U(e,t,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(n,n+6));return r?(e.Z=r[1]?0:-(r[2]+(r[3]||"00")),n+r[0].length):-1}function x(e,t,n){var r=a.exec(t.slice(n,n+1));return r?(e.q=3*r[0]-3,n+r[0].length):-1}function p(e,t,n){var r=a.exec(t.slice(n,n+2));return r?(e.m=r[0]-1,n+r[0].length):-1}function w(e,t,n){var r=a.exec(t.slice(n,n+2));return r?(e.d=+r[0],n+r[0].length):-1}function S(e,t,n){var r=a.exec(t.slice(n,n+3));return r?(e.m=0,e.d=+r[0],n+r[0].length):-1}function Y(e,t,n){var r=a.exec(t.slice(n,n+2));return r?(e.H=+r[0],n+r[0].length):-1}function F(e,t,n){var r=a.exec(t.slice(n,n+2));return r?(e.M=+r[0],n+r[0].length):-1}function L(e,t,n){var r=a.exec(t.slice(n,n+2));return r?(e.S=+r[0],n+r[0].length):-1}function H(e,t,n){var r=a.exec(t.slice(n,n+3));return r?(e.L=+r[0],n+r[0].length):-1}function A(e,t,n){var r=a.exec(t.slice(n,n+6));return r?(e.L=Math.floor(r[0]/1e3),n+r[0].length):-1}function Z(e,t,n){var r=f.exec(t.slice(n,n+1));return r?n+r[0].length:-1}function b(e,t,n){var r=a.exec(t.slice(n));return r?(e.Q=+r[0],n+r[0].length):-1}function W(e,t,n){var r=a.exec(t.slice(n));return r?(e.s=+r[0],n+r[0].length):-1}function V(e,t){return s(e.getDate(),t,2)}function j(e,t){return s(e.getHours(),t,2)}function P(e,t){return s(e.getHours()%12||12,t,2)}function q(e,n){return s(1+t.timeDay.count(t.timeYear(e),e),n,3)}function I(e,t){return s(e.getMilliseconds(),t,3)}function J(e,t){return I(e,t)+"000"}function O(e,t){return s(e.getMonth()+1,t,2)}function Q(e,t){return s(e.getMinutes(),t,2)}function X(e,t){return s(e.getSeconds(),t,2)}function N(e){var t=e.getDay();return 0===t?7:t}function B(e,n){return s(t.timeSunday.count(t.timeYear(e)-1,e),n,2)}function G(e){var n=e.getDay();return n>=4||0===n?t.timeThursday(e):t.timeThursday.ceil(e)}function _(e,n){return e=G(e),s(t.timeThursday.count(t.timeYear(e),e)+(4===t.timeYear(e).getDay()),n,2)}function $(e){return e.getDay()}function z(e,n){return s(t.timeMonday.count(t.timeYear(e)-1,e),n,2)}function E(e,t){return s(e.getFullYear()%100,t,2)}function R(e,t){return s((e=G(e)).getFullYear()%100,t,2)}function k(e,t){return s(e.getFullYear()%1e4,t,4)}function K(e,n){var r=e.getDay();return s((e=r>=4||0===r?t.timeThursday(e):t.timeThursday.ceil(e)).getFullYear()%1e4,n,4)}function ee(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+s(t/60|0,"0",2)+s(t%60,"0",2)}function te(e,t){return s(e.getUTCDate(),t,2)}function ne(e,t){return s(e.getUTCHours(),t,2)}function re(e,t){return s(e.getUTCHours()%12||12,t,2)}function ue(e,n){return s(1+t.utcDay.count(t.utcYear(e),e),n,3)}function ie(e,t){return s(e.getUTCMilliseconds(),t,3)}function ce(e,t){return ie(e,t)+"000"}function oe(e,t){return s(e.getUTCMonth()+1,t,2)}function ae(e,t){return s(e.getUTCMinutes(),t,2)}function fe(e,t){return s(e.getUTCSeconds(),t,2)}function le(e){var t=e.getUTCDay();return 0===t?7:t}function se(e,n){return s(t.utcSunday.count(t.utcYear(e)-1,e),n,2)}function ge(e){var n=e.getUTCDay();return n>=4||0===n?t.utcThursday(e):t.utcThursday.ceil(e)}function ye(e,n){return e=ge(e),s(t.utcThursday.count(t.utcYear(e),e)+(4===t.utcYear(e).getUTCDay()),n,2)}function de(e){return e.getUTCDay()}function he(e,n){return s(t.utcMonday.count(t.utcYear(e)-1,e),n,2)}function me(e,t){return s(e.getUTCFullYear()%100,t,2)}function ve(e,t){return s((e=ge(e)).getUTCFullYear()%100,t,2)}function Te(e,t){return s(e.getUTCFullYear()%1e4,t,4)}function Me(e,n){var r=e.getUTCDay();return s((e=r>=4||0===r?t.utcThursday(e):t.utcThursday.ceil(e)).getUTCFullYear()%1e4,n,4)}function De(){return"+0000"}function Ce(){return"%"}function Ue(e){return+e}function xe(e){return Math.floor(+e/1e3)}function pe(t){return c=i(t),e.timeFormat=c.format,e.timeParse=c.parse,e.utcFormat=c.utcFormat,e.utcParse=c.utcParse,c}pe({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var we=Date.prototype.toISOString?function(e){return e.toISOString()}:e.utcFormat("%Y-%m-%dT%H:%M:%S.%LZ");var Se=+new Date("2000-01-01T00:00:00.000Z")?function(e){var t=new Date(e);return isNaN(t)?null:t}:e.utcParse("%Y-%m-%dT%H:%M:%S.%LZ");e.isoFormat=we,e.isoParse=Se,e.timeFormatDefaultLocale=pe,e.timeFormatLocale=i,Object.defineProperty(e,"__esModule",{value:!0})}); diff --git a/node_modules/d3-time-format/locale/ar-EG.json b/node_modules/d3-time-format/locale/ar-EG.json new file mode 100644 index 00000000..8ac02650 --- /dev/null +++ b/node_modules/d3-time-format/locale/ar-EG.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%x, %X", + "date": "%-d/%-m/%Y", + "time": "%-I:%M:%S %p", + "periods": ["ص", "Ù…"], + "days": ["الأحد", "الإثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت"], + "shortDays": ["أحد", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت"], + "months": ["يناير", "ÙØ¨Ø±Ø§ÙŠØ±", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوÙمبر", "ديسمبر"], + "shortMonths": ["يناير", "ÙØ¨Ø±Ø§ÙŠØ±", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوÙمبر", "ديسمبر"] +} diff --git a/node_modules/d3-time-format/locale/ca-ES.json b/node_modules/d3-time-format/locale/ca-ES.json new file mode 100644 index 00000000..a2708735 --- /dev/null +++ b/node_modules/d3-time-format/locale/ca-ES.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A, %e de %B de %Y, %X", + "date": "%d/%m/%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte"], + "shortDays": ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."], + "months": ["gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre"], + "shortMonths": ["gen.", "febr.", "març", "abr.", "maig", "juny", "jul.", "ag.", "set.", "oct.", "nov.", "des."] +} diff --git a/node_modules/d3-time-format/locale/cs-CZ.json b/node_modules/d3-time-format/locale/cs-CZ.json new file mode 100644 index 00000000..ced34ea5 --- /dev/null +++ b/node_modules/d3-time-format/locale/cs-CZ.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A,%e.%B %Y, %X", + "date": "%-d.%-m.%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["nedÄ›le", "pondÄ›lí", "úterý", "stÅ™eda", "Ävrtek", "pátek", "sobota"], + "shortDays": ["ne.", "po.", "út.", "st.", "Ät.", "pá.", "so."], + "months": ["leden", "únor", "bÅ™ezen", "duben", "kvÄ›ten", "Äerven", "Äervenec", "srpen", "září", "říjen", "listopad", "prosinec"], + "shortMonths": ["led", "úno", "bÅ™ez", "dub", "kvÄ›", "Äer", "Äerv", "srp", "zář", "říj", "list", "pros"] +} diff --git a/node_modules/d3-time-format/locale/da-DK.json b/node_modules/d3-time-format/locale/da-DK.json new file mode 100644 index 00000000..f0c2349c --- /dev/null +++ b/node_modules/d3-time-format/locale/da-DK.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A den %d %B %Y %X", + "date": "%d-%m-%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"], + "shortDays": ["søn", "man", "tir", "ons", "tor", "fre", "lør"], + "months": ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"], + "shortMonths": ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"] +} diff --git a/node_modules/d3-time-format/locale/de-CH.json b/node_modules/d3-time-format/locale/de-CH.json new file mode 100644 index 00000000..466b749b --- /dev/null +++ b/node_modules/d3-time-format/locale/de-CH.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A, der %e. %B %Y, %X", + "date": "%d.%m.%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], + "shortDays": ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], + "months": ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], + "shortMonths": ["Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"] +} diff --git a/node_modules/d3-time-format/locale/de-DE.json b/node_modules/d3-time-format/locale/de-DE.json new file mode 100644 index 00000000..466b749b --- /dev/null +++ b/node_modules/d3-time-format/locale/de-DE.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A, der %e. %B %Y, %X", + "date": "%d.%m.%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"], + "shortDays": ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], + "months": ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], + "shortMonths": ["Jan", "Feb", "Mrz", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"] +} diff --git a/node_modules/d3-time-format/locale/en-CA.json b/node_modules/d3-time-format/locale/en-CA.json new file mode 100644 index 00000000..5c13ae3c --- /dev/null +++ b/node_modules/d3-time-format/locale/en-CA.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%a %b %e %X %Y", + "date": "%Y-%m-%d", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + "shortDays": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + "months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + "shortMonths": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +} diff --git a/node_modules/d3-time-format/locale/en-GB.json b/node_modules/d3-time-format/locale/en-GB.json new file mode 100644 index 00000000..9f651c5c --- /dev/null +++ b/node_modules/d3-time-format/locale/en-GB.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%a %e %b %X %Y", + "date": "%d/%m/%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + "shortDays": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + "months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + "shortMonths": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +} diff --git a/node_modules/d3-time-format/locale/en-US.json b/node_modules/d3-time-format/locale/en-US.json new file mode 100644 index 00000000..a7ac9513 --- /dev/null +++ b/node_modules/d3-time-format/locale/en-US.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%x, %X", + "date": "%-m/%-d/%Y", + "time": "%-I:%M:%S %p", + "periods": ["AM", "PM"], + "days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + "shortDays": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + "months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + "shortMonths": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +} diff --git a/node_modules/d3-time-format/locale/es-ES.json b/node_modules/d3-time-format/locale/es-ES.json new file mode 100644 index 00000000..8c5f754f --- /dev/null +++ b/node_modules/d3-time-format/locale/es-ES.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A, %e de %B de %Y, %X", + "date": "%d/%m/%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], + "shortDays": ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], + "months": ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], + "shortMonths": ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"] +} diff --git a/node_modules/d3-time-format/locale/es-MX.json b/node_modules/d3-time-format/locale/es-MX.json new file mode 100644 index 00000000..4dc2077e --- /dev/null +++ b/node_modules/d3-time-format/locale/es-MX.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%x, %X", + "date": "%d/%m/%Y", + "time": "%-I:%M:%S %p", + "periods": ["AM", "PM"], + "days": ["domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"], + "shortDays": ["dom", "lun", "mar", "mié", "jue", "vie", "sáb"], + "months": ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"], + "shortMonths": ["ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"] +} diff --git a/node_modules/d3-time-format/locale/fa-IR.json b/node_modules/d3-time-format/locale/fa-IR.json new file mode 100644 index 00000000..badff07b --- /dev/null +++ b/node_modules/d3-time-format/locale/fa-IR.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%x, %X", + "date": "%-d/%-m/%Y", + "time": "%-I:%M:%S %p", + "periods": ["صبح", "عصر"], + "days": ["یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"], + "shortDays": ["یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"], + "months": ["ژانویه", "Ùوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"], + "shortMonths": ["ژانویه", "Ùوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"] +} diff --git a/node_modules/d3-time-format/locale/fi-FI.json b/node_modules/d3-time-format/locale/fi-FI.json new file mode 100644 index 00000000..2422199e --- /dev/null +++ b/node_modules/d3-time-format/locale/fi-FI.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A, %-d. %Bta %Y klo %X", + "date": "%-d.%-m.%Y", + "time": "%H:%M:%S", + "periods": ["a.m.", "p.m."], + "days": ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai"], + "shortDays": ["Su", "Ma", "Ti", "Ke", "To", "Pe", "La"], + "months": ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"], + "shortMonths": ["Tammi", "Helmi", "Maalis", "Huhti", "Touko", "Kesä", "Heinä", "Elo", "Syys", "Loka", "Marras", "Joulu"] +} diff --git a/node_modules/d3-time-format/locale/fr-CA.json b/node_modules/d3-time-format/locale/fr-CA.json new file mode 100644 index 00000000..1300cabd --- /dev/null +++ b/node_modules/d3-time-format/locale/fr-CA.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%a %e %b %Y %X", + "date": "%Y-%m-%d", + "time": "%H:%M:%S", + "periods": ["", ""], + "days": ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], + "shortDays": ["dim", "lun", "mar", "mer", "jeu", "ven", "sam"], + "months": ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"], + "shortMonths": ["jan", "fév", "mar", "avr", "mai", "jui", "jul", "aoû", "sep", "oct", "nov", "déc"] +} diff --git a/node_modules/d3-time-format/locale/fr-FR.json b/node_modules/d3-time-format/locale/fr-FR.json new file mode 100644 index 00000000..6ac05ee2 --- /dev/null +++ b/node_modules/d3-time-format/locale/fr-FR.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A %e %B %Y à %X", + "date": "%d/%m/%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"], + "shortDays": ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."], + "months": ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"], + "shortMonths": ["janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."] +} diff --git a/node_modules/d3-time-format/locale/he-IL.json b/node_modules/d3-time-format/locale/he-IL.json new file mode 100644 index 00000000..0ce27cdd --- /dev/null +++ b/node_modules/d3-time-format/locale/he-IL.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A, %e ב%B %Y %X", + "date": "%d.%m.%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["ר×שון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת"], + "shortDays": ["×׳", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳"], + "months": ["ינו×ר", "פברו×ר", "מרץ", "×פריל", "מ××™", "יוני", "יולי", "×וגוסט", "ספטמבר", "×וקטובר", "נובמבר", "דצמבר"], + "shortMonths": ["ינו׳", "פבר׳", "מרץ", "×פר׳", "מ××™", "יוני", "יולי", "×וג׳", "ספט׳", "×וק׳", "נוב׳", "דצמ׳"] +} diff --git a/node_modules/d3-time-format/locale/hu-HU.json b/node_modules/d3-time-format/locale/hu-HU.json new file mode 100644 index 00000000..d81acf22 --- /dev/null +++ b/node_modules/d3-time-format/locale/hu-HU.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%Y. %B %-e., %A %X", + "date": "%Y. %m. %d.", + "time": "%H:%M:%S", + "periods": ["de.", "du."], + "days": ["vasárnap", "hétfÅ‘", "kedd", "szerda", "csütörtök", "péntek", "szombat"], + "shortDays": ["V", "H", "K", "Sze", "Cs", "P", "Szo"], + "months": ["január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"], + "shortMonths": ["jan.", "feb.", "már.", "ápr.", "máj.", "jún.", "júl.", "aug.", "szept.", "okt.", "nov.", "dec."] +} diff --git a/node_modules/d3-time-format/locale/it-IT.json b/node_modules/d3-time-format/locale/it-IT.json new file mode 100644 index 00000000..0fc08e02 --- /dev/null +++ b/node_modules/d3-time-format/locale/it-IT.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A %e %B %Y, %X", + "date": "%d/%m/%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"], + "shortDays": ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"], + "months": ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"], + "shortMonths": ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"] +} diff --git a/node_modules/d3-time-format/locale/ja-JP.json b/node_modules/d3-time-format/locale/ja-JP.json new file mode 100644 index 00000000..72c460d7 --- /dev/null +++ b/node_modules/d3-time-format/locale/ja-JP.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%x %a %X", + "date": "%Y/%m/%d", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["日曜日", "月曜日", "ç«æ›œæ—¥", "水曜日", "木曜日", "金曜日", "土曜日"], + "shortDays": ["æ—¥", "月", "ç«", "æ°´", "木", "金", "土"], + "months": ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], + "shortMonths": ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"] +} diff --git a/node_modules/d3-time-format/locale/ko-KR.json b/node_modules/d3-time-format/locale/ko-KR.json new file mode 100644 index 00000000..7055666a --- /dev/null +++ b/node_modules/d3-time-format/locale/ko-KR.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%Y/%m/%d %a %X", + "date": "%Y/%m/%d", + "time": "%H:%M:%S", + "periods": ["오전", "오후"], + "days": ["ì¼ìš”ì¼", "월요ì¼", "화요ì¼", "수요ì¼", "목요ì¼", "금요ì¼", "토요ì¼"], + "shortDays": ["ì¼", "ì›”", "í™”", "수", "목", "금", "토"], + "months": ["1ì›”", "2ì›”", "3ì›”", "4ì›”", "5ì›”", "6ì›”", "7ì›”", "8ì›”", "9ì›”", "10ì›”", "11ì›”", "12ì›”"], + "shortMonths": ["1ì›”", "2ì›”", "3ì›”", "4ì›”", "5ì›”", "6ì›”", "7ì›”", "8ì›”", "9ì›”", "10ì›”", "11ì›”", "12ì›”"] +} diff --git a/node_modules/d3-time-format/locale/mk-MK.json b/node_modules/d3-time-format/locale/mk-MK.json new file mode 100644 index 00000000..4a47fd11 --- /dev/null +++ b/node_modules/d3-time-format/locale/mk-MK.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A, %e %B %Y г. %X", + "date": "%d.%m.%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["недела", "понеделник", "вторник", "Ñреда", "четврток", "петок", "Ñабота"], + "shortDays": ["нед", "пон", "вто", "Ñре", "чет", "пет", "Ñаб"], + "months": ["јануари", "февруари", "март", "април", "мај", "јуни", "јули", "авгуÑÑ‚", "Ñептември", "октомври", "ноември", "декември"], + "shortMonths": ["јан", "фев", "мар", "апр", "мај", "јун", "јул", "авг", "Ñеп", "окт", "ное", "дек"] +} diff --git a/node_modules/d3-time-format/locale/nb-NO.json b/node_modules/d3-time-format/locale/nb-NO.json new file mode 100644 index 00000000..a8bfd20e --- /dev/null +++ b/node_modules/d3-time-format/locale/nb-NO.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A den %d. %B %Y %X", + "date": "%d.%m.%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"], + "shortDays": ["søn", "man", "tir", "ons", "tor", "fre", "lør"], + "months": ["januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"], + "shortMonths": ["jan", "feb", "mars", "apr", "mai", "juni", "juli", "aug", "sep", "okt", "nov", "des"] +} diff --git a/node_modules/d3-time-format/locale/nl-NL.json b/node_modules/d3-time-format/locale/nl-NL.json new file mode 100644 index 00000000..375b0feb --- /dev/null +++ b/node_modules/d3-time-format/locale/nl-NL.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%a %e %B %Y %X", + "date": "%d-%m-%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"], + "shortDays": ["zo", "ma", "di", "wo", "do", "vr", "za"], + "months": ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"], + "shortMonths": ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"] +} diff --git a/node_modules/d3-time-format/locale/pl-PL.json b/node_modules/d3-time-format/locale/pl-PL.json new file mode 100644 index 00000000..616b4cd1 --- /dev/null +++ b/node_modules/d3-time-format/locale/pl-PL.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A, %e %B %Y, %X", + "date": "%d/%m/%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["Niedziela", "PoniedziaÅ‚ek", "Wtorek", "Åšroda", "Czwartek", "PiÄ…tek", "Sobota"], + "shortDays": ["Niedz.", "Pon.", "Wt.", "Åšr.", "Czw.", "Pt.", "Sob."], + "months": ["StyczeÅ„", "Luty", "Marzec", "KwiecieÅ„", "Maj", "Czerwiec", "Lipiec", "SierpieÅ„", "WrzesieÅ„", "Październik", "Listopad", "GrudzieÅ„"], + "shortMonths": ["Stycz.", "Luty", "Marz.", "Kwie.", "Maj", "Czerw.", "Lipc.", "Sierp.", "Wrz.", "Paźdz.", "Listop.", "Grudz."] +} diff --git a/node_modules/d3-time-format/locale/pt-BR.json b/node_modules/d3-time-format/locale/pt-BR.json new file mode 100644 index 00000000..4e9ff893 --- /dev/null +++ b/node_modules/d3-time-format/locale/pt-BR.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A, %e de %B de %Y. %X", + "date": "%d/%m/%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"], + "shortDays": ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"], + "months": ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + "shortMonths": ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"] +} diff --git a/node_modules/d3-time-format/locale/ru-RU.json b/node_modules/d3-time-format/locale/ru-RU.json new file mode 100644 index 00000000..c0423183 --- /dev/null +++ b/node_modules/d3-time-format/locale/ru-RU.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A, %e %B %Y г. %X", + "date": "%d.%m.%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["воÑкреÑенье", "понедельник", "вторник", "Ñреда", "четверг", "пÑтница", "Ñуббота"], + "shortDays": ["вÑ", "пн", "вт", "ÑÑ€", "чт", "пт", "Ñб"], + "months": ["ÑнварÑ", "февралÑ", "марта", "апрелÑ", "маÑ", "июнÑ", "июлÑ", "авгуÑта", "ÑентÑбрÑ", "октÑбрÑ", "ноÑбрÑ", "декабрÑ"], + "shortMonths": ["Ñнв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "Ñен", "окт", "ноÑ", "дек"] +} diff --git a/node_modules/d3-time-format/locale/sv-SE.json b/node_modules/d3-time-format/locale/sv-SE.json new file mode 100644 index 00000000..23183880 --- /dev/null +++ b/node_modules/d3-time-format/locale/sv-SE.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A den %d %B %Y %X", + "date": "%Y-%m-%d", + "time": "%H:%M:%S", + "periods": ["fm", "em"], + "days": ["Söndag", "MÃ¥ndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag"], + "shortDays": ["Sön", "MÃ¥n", "Tis", "Ons", "Tor", "Fre", "Lör"], + "months": ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"], + "shortMonths": ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"] +} diff --git a/node_modules/d3-time-format/locale/tr-TR.json b/node_modules/d3-time-format/locale/tr-TR.json new file mode 100644 index 00000000..ea0557e1 --- /dev/null +++ b/node_modules/d3-time-format/locale/tr-TR.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%a %e %b %X %Y", + "date": "%d/%m/%Y", + "time": "%H:%M:%S", + "periods": ["AM", "PM"], + "days": ["Pazar", "Pazartesi", "Salı", "ÇarÅŸamba", "PerÅŸembe", "Cuma", "Cumartesi"], + "shortDays": ["Paz", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt"], + "months": ["Ocak", "Åžubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "AÄŸustos", "Eylül", "Ekim", "Kasım", "Aralık"], + "shortMonths": ["Oca", "Åžub", "Mar", "Nis", "May", "Haz", "Tem", "AÄŸu", "Eyl", "Eki", "Kas", "Ara"] +} diff --git a/node_modules/d3-time-format/locale/uk-UA.json b/node_modules/d3-time-format/locale/uk-UA.json new file mode 100644 index 00000000..555eed4a --- /dev/null +++ b/node_modules/d3-time-format/locale/uk-UA.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%A, %e %B %Y Ñ€. %X", + "date": "%d.%m.%Y", + "time": "%H:%M:%S", + "periods": ["дп", "пп"], + "days": ["неділÑ", "понеділок", "вівторок", "Ñереда", "четвер", "п'ÑтницÑ", "Ñубота"], + "shortDays": ["нд", "пн", "вт", "ÑÑ€", "чт", "пт", "Ñб"], + "months": ["ÑічнÑ", "лютого", "березнÑ", "квітнÑ", "травнÑ", "червнÑ", "липнÑ", "ÑерпнÑ", "вереÑнÑ", "жовтнÑ", "лиÑтопада", "груднÑ"], + "shortMonths": ["Ñіч.", "лют.", "бер.", "квіт.", "трав.", "черв.", "лип.", "Ñерп.", "вер.", "жовт.", "лиÑÑ‚.", "груд."] +} diff --git a/node_modules/d3-time-format/locale/zh-CN.json b/node_modules/d3-time-format/locale/zh-CN.json new file mode 100644 index 00000000..762f212a --- /dev/null +++ b/node_modules/d3-time-format/locale/zh-CN.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%x %A %X", + "date": "%Yå¹´%-m月%-dæ—¥", + "time": "%H:%M:%S", + "periods": ["上åˆ", "下åˆ"], + "days": ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], + "shortDays": ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], + "months": ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "乿œˆ", "åæœˆ", "å一月", "å二月"], + "shortMonths": ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "乿œˆ", "åæœˆ", "å一月", "å二月"] +} diff --git a/node_modules/d3-time-format/locale/zh-TW.json b/node_modules/d3-time-format/locale/zh-TW.json new file mode 100644 index 00000000..767b2baf --- /dev/null +++ b/node_modules/d3-time-format/locale/zh-TW.json @@ -0,0 +1,10 @@ +{ + "dateTime": "%x %A %X", + "date": "%Yå¹´%-m月%-dæ—¥", + "time": "%H:%M:%S", + "periods": ["上åˆ", "下åˆ"], + "days": ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"], + "shortDays": ["æ—¥", "一", "二", "三", "å››", "五", "å…­"], + "months": ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "乿œˆ", "åæœˆ", "å一月", "å二月"], + "shortMonths": ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"] +} diff --git a/node_modules/d3-time-format/package.json b/node_modules/d3-time-format/package.json new file mode 100644 index 00000000..6405e9f3 --- /dev/null +++ b/node_modules/d3-time-format/package.json @@ -0,0 +1,79 @@ +{ + "_from": "d3-time-format@3", + "_id": "d3-time-format@3.0.0", + "_inBundle": false, + "_integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "_location": "/d3-time-format", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-time-format@3", + "name": "d3-time-format", + "escapedName": "d3-time-format", + "rawSpec": "3", + "saveSpec": null, + "fetchSpec": "3" + }, + "_requiredBy": [ + "/d3", + "/d3-scale" + ], + "_resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "_shasum": "df8056c83659e01f20ac5da5fdeae7c08d5f1bb6", + "_spec": "d3-time-format@3", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-time-format/issues" + }, + "bundleDependencies": false, + "dependencies": { + "d3-time": "1 - 2" + }, + "deprecated": false, + "description": "A JavaScript time formatter and parser inspired by strftime and strptime.", + "devDependencies": { + "eslint": "6", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js", + "locale/*.json" + ], + "homepage": "https://d3js.org/d3-time-format/", + "jsdelivr": "dist/d3-time-format.min.js", + "keywords": [ + "d3", + "d3-module", + "time", + "format", + "strftime", + "strptime" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-time-format.js", + "module": "src/index.js", + "name": "d3-time-format", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-time-format.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "TZ=America/Los_Angeles tape 'test/**/*-test.js' && eslint src" + }, + "sideEffects": [ + "./src/defaultLocale.js" + ], + "unpkg": "dist/d3-time-format.min.js", + "version": "3.0.0" +} diff --git a/node_modules/d3-time-format/src/defaultLocale.js b/node_modules/d3-time-format/src/defaultLocale.js new file mode 100644 index 00000000..d762db51 --- /dev/null +++ b/node_modules/d3-time-format/src/defaultLocale.js @@ -0,0 +1,27 @@ +import formatLocale from "./locale.js"; + +var locale; +export var timeFormat; +export var timeParse; +export var utcFormat; +export var utcParse; + +defaultLocale({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +}); + +export default function defaultLocale(definition) { + locale = formatLocale(definition); + timeFormat = locale.format; + timeParse = locale.parse; + utcFormat = locale.utcFormat; + utcParse = locale.utcParse; + return locale; +} diff --git a/node_modules/d3-time-format/src/index.js b/node_modules/d3-time-format/src/index.js new file mode 100644 index 00000000..6c93971d --- /dev/null +++ b/node_modules/d3-time-format/src/index.js @@ -0,0 +1,4 @@ +export {default as timeFormatDefaultLocale, timeFormat, timeParse, utcFormat, utcParse} from "./defaultLocale.js"; +export {default as timeFormatLocale} from "./locale.js"; +export {default as isoFormat} from "./isoFormat.js"; +export {default as isoParse} from "./isoParse.js"; diff --git a/node_modules/d3-time-format/src/isoFormat.js b/node_modules/d3-time-format/src/isoFormat.js new file mode 100644 index 00000000..43185a37 --- /dev/null +++ b/node_modules/d3-time-format/src/isoFormat.js @@ -0,0 +1,13 @@ +import {utcFormat} from "./defaultLocale.js"; + +export var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + +function formatIsoNative(date) { + return date.toISOString(); +} + +var formatIso = Date.prototype.toISOString + ? formatIsoNative + : utcFormat(isoSpecifier); + +export default formatIso; diff --git a/node_modules/d3-time-format/src/isoParse.js b/node_modules/d3-time-format/src/isoParse.js new file mode 100644 index 00000000..381d1c96 --- /dev/null +++ b/node_modules/d3-time-format/src/isoParse.js @@ -0,0 +1,13 @@ +import {isoSpecifier} from "./isoFormat.js"; +import {utcParse} from "./defaultLocale.js"; + +function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; +} + +var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : utcParse(isoSpecifier); + +export default parseIso; diff --git a/node_modules/d3-time-format/src/locale.js b/node_modules/d3-time-format/src/locale.js new file mode 100644 index 00000000..cc0dac25 --- /dev/null +++ b/node_modules/d3-time-format/src/locale.js @@ -0,0 +1,697 @@ +import { + timeDay, + timeSunday, + timeMonday, + timeThursday, + timeYear, + utcDay, + utcSunday, + utcMonday, + utcThursday, + utcYear +} from "d3-time"; + +function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); +} + +function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); +} + +function newDate(y, m, d) { + return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; +} + +export default function formatLocale(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "f": formatMicroseconds, + "g": formatYearISO, + "G": formatFullYearISO, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "q": formatQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatSeconds, + "u": formatWeekdayNumberMonday, + "U": formatWeekNumberSunday, + "V": formatWeekNumberISO, + "w": formatWeekdayNumberSunday, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "f": formatUTCMicroseconds, + "g": formatUTCYearISO, + "G": formatUTCFullYearISO, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "q": formatUTCQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatUTCSeconds, + "u": formatUTCWeekdayNumberMonday, + "U": formatUTCWeekNumberSunday, + "V": formatUTCWeekNumberISO, + "w": formatUTCWeekdayNumberSunday, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "f": parseMicroseconds, + "g": parseYear, + "G": parseFullYear, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "q": parseQuarter, + "Q": parseUnixTimestamp, + "s": parseUnixTimestampSeconds, + "S": parseSeconds, + "u": parseWeekdayNumberMonday, + "U": parseWeekNumberSunday, + "V": parseWeekNumberISO, + "w": parseWeekdayNumberSunday, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function(date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, Z) { + return function(string) { + var d = newDate(1900, undefined, 1), + i = parseSpecifier(d, specifier, string += "", 0), + week, day; + if (i != string.length) return null; + + // If a UNIX timestamp is specified, return it. + if ("Q" in d) return new Date(d.Q); + if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); + + // If this is utcParse, never use the local timezone. + if (Z && !("Z" in d)) d.Z = 0; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // If the month was not specified, inherit from the quarter. + if (d.m === undefined) d.m = "q" in d ? d.q : 0; + + // Convert day-of-week and week-of-year to day-of-year. + if ("V" in d) { + if (d.V < 1 || d.V > 53) return null; + if (!("w" in d)) d.w = 1; + if ("Z" in d) { + week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay(); + week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week); + week = utcDay.offset(week, (d.V - 1) * 7); + d.y = week.getUTCFullYear(); + d.m = week.getUTCMonth(); + d.d = week.getUTCDate() + (d.w + 6) % 7; + } else { + week = localDate(newDate(d.y, 0, 1)), day = week.getDay(); + week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week); + week = timeDay.offset(week, (d.V - 1) * 7); + d.y = week.getFullYear(); + d.m = week.getMonth(); + d.d = week.getDate() + (d.w + 6) % 7; + } + } else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; + day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return localDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatQuarter(d) { + return 1 + ~~(d.getMonth() / 3); + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + function formatUTCQuarter(d) { + return 1 + ~~(d.getUTCMonth() / 3); + } + + return { + format: function(specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function() { return specifier; }; + return f; + }, + parse: function(specifier) { + var p = newParse(specifier += "", false); + p.toString = function() { return specifier; }; + return p; + }, + utcFormat: function(specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function() { return specifier; }; + return f; + }, + utcParse: function(specifier) { + var p = newParse(specifier += "", true); + p.toString = function() { return specifier; }; + return p; + } + }; +} + +var pads = {"-": "", "_": " ", "0": "0"}, + numberRe = /^\s*\d+/, // note: ignores next directive + percentRe = /^%/, + requoteRe = /[\\^$*+?|[\]().{}]/g; + +function pad(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); +} + +function requote(s) { + return s.replace(requoteRe, "\\$&"); +} + +function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); +} + +function formatLookup(names) { + return new Map(names.map((name, i) => [name.toLowerCase(), i])); +} + +function parseWeekdayNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; +} + +function parseWeekdayNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.u = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.U = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberISO(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.V = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.W = +n[0], i + n[0].length) : -1; +} + +function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; +} + +function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; +} + +function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; +} + +function parseQuarter(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; +} + +function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; +} + +function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; +} + +function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; +} + +function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; +} + +function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; +} + +function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; +} + +function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; +} + +function parseMicroseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 6)); + return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; +} + +function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; +} + +function parseUnixTimestamp(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = +n[0], i + n[0].length) : -1; +} + +function parseUnixTimestampSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.s = +n[0], i + n[0].length) : -1; +} + +function formatDayOfMonth(d, p) { + return pad(d.getDate(), p, 2); +} + +function formatHour24(d, p) { + return pad(d.getHours(), p, 2); +} + +function formatHour12(d, p) { + return pad(d.getHours() % 12 || 12, p, 2); +} + +function formatDayOfYear(d, p) { + return pad(1 + timeDay.count(timeYear(d), d), p, 3); +} + +function formatMilliseconds(d, p) { + return pad(d.getMilliseconds(), p, 3); +} + +function formatMicroseconds(d, p) { + return formatMilliseconds(d, p) + "000"; +} + +function formatMonthNumber(d, p) { + return pad(d.getMonth() + 1, p, 2); +} + +function formatMinutes(d, p) { + return pad(d.getMinutes(), p, 2); +} + +function formatSeconds(d, p) { + return pad(d.getSeconds(), p, 2); +} + +function formatWeekdayNumberMonday(d) { + var day = d.getDay(); + return day === 0 ? 7 : day; +} + +function formatWeekNumberSunday(d, p) { + return pad(timeSunday.count(timeYear(d) - 1, d), p, 2); +} + +function dISO(d) { + var day = d.getDay(); + return (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d); +} + +function formatWeekNumberISO(d, p) { + d = dISO(d); + return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2); +} + +function formatWeekdayNumberSunday(d) { + return d.getDay(); +} + +function formatWeekNumberMonday(d, p) { + return pad(timeMonday.count(timeYear(d) - 1, d), p, 2); +} + +function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); +} + +function formatYearISO(d, p) { + d = dISO(d); + return pad(d.getFullYear() % 100, p, 2); +} + +function formatFullYear(d, p) { + return pad(d.getFullYear() % 10000, p, 4); +} + +function formatFullYearISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d); + return pad(d.getFullYear() % 10000, p, 4); +} + +function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad(z / 60 | 0, "0", 2) + + pad(z % 60, "0", 2); +} + +function formatUTCDayOfMonth(d, p) { + return pad(d.getUTCDate(), p, 2); +} + +function formatUTCHour24(d, p) { + return pad(d.getUTCHours(), p, 2); +} + +function formatUTCHour12(d, p) { + return pad(d.getUTCHours() % 12 || 12, p, 2); +} + +function formatUTCDayOfYear(d, p) { + return pad(1 + utcDay.count(utcYear(d), d), p, 3); +} + +function formatUTCMilliseconds(d, p) { + return pad(d.getUTCMilliseconds(), p, 3); +} + +function formatUTCMicroseconds(d, p) { + return formatUTCMilliseconds(d, p) + "000"; +} + +function formatUTCMonthNumber(d, p) { + return pad(d.getUTCMonth() + 1, p, 2); +} + +function formatUTCMinutes(d, p) { + return pad(d.getUTCMinutes(), p, 2); +} + +function formatUTCSeconds(d, p) { + return pad(d.getUTCSeconds(), p, 2); +} + +function formatUTCWeekdayNumberMonday(d) { + var dow = d.getUTCDay(); + return dow === 0 ? 7 : dow; +} + +function formatUTCWeekNumberSunday(d, p) { + return pad(utcSunday.count(utcYear(d) - 1, d), p, 2); +} + +function UTCdISO(d) { + var day = d.getUTCDay(); + return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); +} + +function formatUTCWeekNumberISO(d, p) { + d = UTCdISO(d); + return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2); +} + +function formatUTCWeekdayNumberSunday(d) { + return d.getUTCDay(); +} + +function formatUTCWeekNumberMonday(d, p) { + return pad(utcMonday.count(utcYear(d) - 1, d), p, 2); +} + +function formatUTCYear(d, p) { + return pad(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCYearISO(d, p) { + d = UTCdISO(d); + return pad(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCFullYear(d, p) { + return pad(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCFullYearISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); + return pad(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCZone() { + return "+0000"; +} + +function formatLiteralPercent() { + return "%"; +} + +function formatUnixTimestamp(d) { + return +d; +} + +function formatUnixTimestampSeconds(d) { + return Math.floor(+d / 1000); +} diff --git a/node_modules/d3-time/LICENSE b/node_modules/d3-time/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-time/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-time/README.md b/node_modules/d3-time/README.md new file mode 100644 index 00000000..94e9183d --- /dev/null +++ b/node_modules/d3-time/README.md @@ -0,0 +1,333 @@ +# d3-time + +When visualizing time series data, analyzing temporal patterns, or working with time in general, the irregularities of conventional time units quickly become apparent. In the [Gregorian calendar](https://en.wikipedia.org/wiki/Gregorian_calendar), for example, most months have 31 days but some have 28, 29 or 30; most years have 365 days but [leap years](https://en.wikipedia.org/wiki/Leap_year) have 366; and with [daylight saving](https://en.wikipedia.org/wiki/Daylight_saving_time), most days have 24 hours but some have 23 or 25. Adding to complexity, daylight saving conventions vary around the world. + +As a result of these temporal peculiarities, it can be difficult to perform seemingly-trivial tasks. For example, if you want to compute the number of days that have passed between two dates, you can’t simply subtract and divide by 24 hours (86,400,000 ms): + +```js +var start = new Date(2015, 02, 01), // Sun Mar 01 2015 00:00:00 GMT-0800 (PST) + end = new Date(2015, 03, 01); // Wed Apr 01 2015 00:00:00 GMT-0700 (PDT) +(end - start) / 864e5; // 30.958333333333332, oops! +``` + +You can, however, use [d3.timeDay](#timeDay).[count](#interval_count): + +```js +d3.timeDay.count(start, end); // 31 +``` + +The [day](#day) [interval](#api-reference) is one of several provided by d3-time. Each interval represents a conventional unit of time—[hours](#timeHour), [weeks](#timeWeek), [months](#timeMonth), *etc.*—and has methods to calculate boundary dates. For example, [d3.timeDay](#timeDay) computes midnight (typically 12:00 AM local time) of the corresponding day. In addition to [rounding](#interval_round) and [counting](#interval_count), intervals can also be used to generate arrays of boundary dates. For example, to compute each Sunday in the current month: + +```js +var now = new Date; +d3.timeWeek.range(d3.timeMonth.floor(now), d3.timeMonth.ceil(now)); +// [Sun Jun 07 2015 00:00:00 GMT-0700 (PDT), +// Sun Jun 14 2015 00:00:00 GMT-0700 (PDT), +// Sun Jun 21 2015 00:00:00 GMT-0700 (PDT), +// Sun Jun 28 2015 00:00:00 GMT-0700 (PDT)] +``` + +The d3-time module does not implement its own calendaring system; it merely implements a convenient API for calendar math on top of ECMAScript [Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date). Thus, it ignores leap seconds and can only work with the local time zone and [Coordinated Universal Time](https://en.wikipedia.org/wiki/Coordinated_Universal_Time) (UTC). + +This module is used by D3’s time scales to generate sensible ticks, by D3’s time format, and can also be used directly to do things like [calendar layouts](http://bl.ocks.org/mbostock/4063318). + +## Installing + +If you use NPM, `npm install d3-time`. Otherwise, download the [latest release](https://github.com/d3/d3-time/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-time.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +[Try d3-time in your browser.](https://observablehq.com/collection/@d3/d3-time) + +## API Reference + +# interval([date]) · [Source](https://github.com/d3/d3-time/blob/master/src/interval.js) + +Equivalent to [*interval*.floor](#interval_floor), except it *date* is not specified, it defaults to the current time. For example, [d3.timeYear](#timeYear)(*date*) and d3.timeYear.floor(*date*) are equivalent. + +```js +var monday = d3.timeMonday(); // The latest preceeding Monday, local time. +``` + +# interval.floor(date) · [Source](https://github.com/d3/d3-time/blob/master/src/interval.js) + +Returns a new date representing the latest interval boundary date before or equal to *date*. For example, [d3.timeDay](#timeDay).floor(*date*) typically returns 12:00 AM local time on the given *date*. + +This method is idempotent: if the specified *date* is already floored to the current interval, a new date with an identical time is returned. Furthermore, the returned date is the minimum expressible value of the associated interval, such that *interval*.floor(*interval*.floor(*date*) - 1) returns the preceeding interval boundary date. + +Note that the `==` and `===` operators do not compare by value with [Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) objects, and thus you cannot use them to tell whether the specified *date* has already been floored. Instead, coerce to a number and then compare: + +```js +// Returns true if the specified date is a day boundary. +function isDay(date) { + return +d3.timeDay.floor(date) === +date; +} +``` + +This is more reliable than testing whether the time is 12:00 AM, as in some time zones midnight may not exist due to daylight saving. + +# interval.round(date) · [Source](https://github.com/d3/d3-time/blob/master/src/interval.js) + +Returns a new date representing the closest interval boundary date to *date*. For example, [d3.timeDay](#timeDay).round(*date*) typically returns 12:00 AM local time on the given *date* if it is on or before noon, and 12:00 AM of the following day if it is after noon. + +This method is idempotent: if the specified *date* is already rounded to the current interval, a new date with an identical time is returned. + +# interval.ceil(date) · [Source](https://github.com/d3/d3-time/blob/master/src/interval.js) + +Returns a new date representing the earliest interval boundary date after or equal to *date*. For example, [d3.timeDay](#timeDay).ceil(*date*) typically returns 12:00 AM local time on the date following the given *date*. + +This method is idempotent: if the specified *date* is already ceilinged to the current interval, a new date with an identical time is returned. Furthermore, the returned date is the maximum expressible value of the associated interval, such that *interval*.ceil(*interval*.ceil(*date*) + 1) returns the following interval boundary date. + +# interval.offset(date[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/interval.js) + +Returns a new date equal to *date* plus *step* intervals. If *step* is not specified it defaults to 1. If *step* is negative, then the returned date will be before the specified *date*; if *step* is zero, then a copy of the specified *date* is returned; if *step* is not an integer, it is [floored](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor). This method does not round the specified *date* to the interval. For example, if *date* is today at 5:34 PM, then [d3.timeDay](#timeDay).offset(*date*, 1) returns 5:34 PM tomorrow (even if daylight saving changes!). + +# interval.range(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/interval.js) + +Returns an array of dates representing every interval boundary after or equal to *start* (inclusive) and before *stop* (exclusive). If *step* is specified, then every *step*th boundary will be returned; for example, for the [d3.timeDay](#timeDay) interval a *step* of 2 will return every other day. If *step* is not an integer, it is [floored](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor). + +The first date in the returned array is the earliest boundary after or equal to *start*; subsequent dates are [offset](#interval_offset) by *step* intervals and [floored](#interval_floor). Thus, two overlapping ranges may be consistent. For example, this range contains odd days: + +```js +d3.timeDay.range(new Date(2015, 0, 1), new Date(2015, 0, 7), 2); +// [Thu Jan 01 2015 00:00:00 GMT-0800 (PST), +// Sat Jan 03 2015 00:00:00 GMT-0800 (PST), +// Mon Jan 05 2015 00:00:00 GMT-0800 (PST)] +``` + +While this contains even days: + +```js +d3.timeDay.range(new Date(2015, 0, 2), new Date(2015, 0, 8), 2); +// [Fri Jan 02 2015 00:00:00 GMT-0800 (PST), +// Sun Jan 04 2015 00:00:00 GMT-0800 (PST), +// Tue Jan 06 2015 00:00:00 GMT-0800 (PST)] +``` + +To make ranges consistent when a *step* is specified, use [*interval*.every](#interval_every) instead. + +# interval.filter(test) · [Source](https://github.com/d3/d3-time/blob/master/src/interval.js) + +Returns a new interval that is a filtered subset of this interval using the specified *test* function. The *test* function is passed a date and should return true if and only if the specified date should be considered part of the interval. For example, to create an interval that returns the 1st, 11th, 21th and 31th (if it exists) of each month: + +```js +var i = d3.timeDay.filter(function(d) { return (d.getDate() - 1) % 10 === 0; }); +``` + +The returned filtered interval does not support [*interval*.count](#interval_count). See also [*interval*.every](#interval_every). + +# interval.every(step) · [Source](https://github.com/d3/d3-time/blob/master/src/interval.js) + +Returns a [filtered](#interval_filter) view of this interval representing every *step*th date. The meaning of *step* is dependent on this interval’s parent interval as defined by the field function. For example, [d3.timeMinute](#timeMinute).every(15) returns an interval representing every fifteen minutes, starting on the hour: :00, :15, :30, :45, etc. Note that for some intervals, the resulting dates may not be uniformly-spaced; [d3.timeDay](#timeDay)’s parent interval is [d3.timeMonth](#timeMonth), and thus the interval number resets at the start of each month. If *step* is not valid, returns null. If *step* is one, returns this interval. + +This method can be used in conjunction with [*interval*.range](#interval_range) to ensure that two overlapping ranges are consistent. For example, this range contains odd days: + +```js +d3.timeDay.every(2).range(new Date(2015, 0, 1), new Date(2015, 0, 7)); +// [Thu Jan 01 2015 00:00:00 GMT-0800 (PST), +// Sat Jan 03 2015 00:00:00 GMT-0800 (PST), +// Mon Jan 05 2015 00:00:00 GMT-0800 (PST)] +``` + +As does this one: + +```js +d3.timeDay.every(2).range(new Date(2015, 0, 2), new Date(2015, 0, 8)); +// [Sat Jan 03 2015 00:00:00 GMT-0800 (PST), +// Mon Jan 05 2015 00:00:00 GMT-0800 (PST), +// Wed Jan 07 2015 00:00:00 GMT-0800 (PST)] +``` + +The returned filtered interval does not support [*interval*.count](#interval_count). See also [*interval*.filter](#interval_filter). + +# interval.count(start, end) · [Source](https://github.com/d3/d3-time/blob/master/src/interval.js) + +Returns the number of interval boundaries after *start* (exclusive) and before or equal to *end* (inclusive). Note that this behavior is slightly different than [*interval*.range](#interval_range) because its purpose is to return the zero-based number of the specified *end* date relative to the specified *start* date. For example, to compute the current zero-based day-of-year number: + +```js +var now = new Date; +d3.timeDay.count(d3.timeYear(now), now); // 177 +``` + +Likewise, to compute the current zero-based week-of-year number for weeks that start on Sunday: + +```js +d3.timeSunday.count(d3.timeYear(now), now); // 25 +``` + +# d3.timeInterval(floor, offset[, count[, field]]) · [Source](https://github.com/d3/d3-time/blob/master/src/interval.js) + +Constructs a new custom interval given the specified *floor* and *offset* functions and an optional *count* function. + +The *floor* function takes a single date as an argument and rounds it down to the nearest interval boundary. + +The *offset* function takes a date and an integer step as arguments and advances the specified date by the specified number of boundaries; the step may be positive, negative or zero. + +The optional *count* function takes a start date and an end date, already floored to the current interval, and returns the number of boundaries between the start (exclusive) and end (inclusive). If a *count* function is not specified, the returned interval does not expose [*interval*.count](#interval_count) or [*interval*.every](#interval_every) methods. Note: due to an internal optimization, the specified *count* function must not invoke *interval*.count on other time intervals. + +The optional *field* function takes a date, already floored to the current interval, and returns the field value of the specified date, corresponding to the number of boundaries between this date (exclusive) and the latest previous parent boundary. For example, for the [d3.timeDay](#timeDay) interval, this returns the number of days since the start of the month. If a *field* function is not specified, it defaults to counting the number of interval boundaries since the UNIX epoch of January 1, 1970 UTC. The *field* function defines the behavior of [*interval*.every](#interval_every). + +### Intervals + +The following intervals are provided: + +# d3.timeMillisecond · [Source](https://github.com/d3/d3-time/blob/master/src/millisecond.js "Source") +
# d3.utcMillisecond + +Milliseconds; the shortest available time unit. + +# d3.timeSecond · [Source](https://github.com/d3/d3-time/blob/master/src/second.js "Source") +
# d3.utcSecond + +Seconds (e.g., 01:23:45.0000 AM); 1,000 milliseconds. + +# d3.timeMinute · [Source](https://github.com/d3/d3-time/blob/master/src/minute.js "Source") +
# d3.utcMinute · [Source](https://github.com/d3/d3-time/blob/master/src/utcMinute.js "Source") + +Minutes (e.g., 01:02:00 AM); 60 seconds. Note that ECMAScript [ignores leap seconds](http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.1). + +# d3.timeHour · [Source](https://github.com/d3/d3-time/blob/master/src/hour.js "Source") +
# d3.utcHour · [Source](https://github.com/d3/d3-time/blob/master/src/utcHour.js "Source") + +Hours (e.g., 01:00 AM); 60 minutes. Note that advancing time by one hour in local time can return the same hour or skip an hour due to daylight saving. + +# d3.timeDay · [Source](https://github.com/d3/d3-time/blob/master/src/day.js "Source") +
# d3.utcDay · [Source](https://github.com/d3/d3-time/blob/master/src/utcDay.js "Source") + +Days (e.g., February 7, 2012 at 12:00 AM); typically 24 hours. Days in local time may range from 23 to 25 hours due to daylight saving. + +# d3.timeWeek · [Source](https://github.com/d3/d3-time/blob/master/src/week.js "Source") +
# d3.utcWeek · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js "Source") + +Alias for [d3.timeSunday](#timeSunday); 7 days and typically 168 hours. Weeks in local time may range from 167 to 169 hours due on daylight saving. + +# d3.timeSunday · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcSunday · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Sunday-based weeks (e.g., February 5, 2012 at 12:00 AM). + +# d3.timeMonday · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcMonday · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Monday-based weeks (e.g., February 6, 2012 at 12:00 AM). + +# d3.timeTuesday · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcTuesday · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Tuesday-based weeks (e.g., February 7, 2012 at 12:00 AM). + +# d3.timeWednesday · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcWednesday · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Wednesday-based weeks (e.g., February 8, 2012 at 12:00 AM). + +# d3.timeThursday · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcThursday · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Thursday-based weeks (e.g., February 9, 2012 at 12:00 AM). + +# d3.timeFriday · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcFriday · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Friday-based weeks (e.g., February 10, 2012 at 12:00 AM). + +# d3.timeSaturday · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcSaturday · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Saturday-based weeks (e.g., February 11, 2012 at 12:00 AM). + +# d3.timeMonth · [Source](https://github.com/d3/d3-time/blob/master/src/month.js "Source") +
# d3.utcMonth · [Source](https://github.com/d3/d3-time/blob/master/src/utcMonth.js "Source") + +Months (e.g., February 1, 2012 at 12:00 AM); ranges from 28 to 31 days. + +# d3.timeYear · [Source](https://github.com/d3/d3-time/blob/master/src/year.js "Source") +
# d3.utcYear · [Source](https://github.com/d3/d3-time/blob/master/src/utcYear.js "Source") + +Years (e.g., January 1, 2012 at 12:00 AM); ranges from 365 to 366 days. + +### Ranges + +For convenience, aliases for [*interval*.range](#interval_range) are also provided as plural forms of the corresponding interval. + +# d3.timeMilliseconds(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/millisecond.js) +
# d3.utcMilliseconds(start, stop[, step]) + +Aliases for [d3.timeMillisecond](#timeMillisecond).[range](#interval_range) and [d3.utcMillisecond](#timeMillisecond).[range](#interval_range). + +# d3.timeSeconds(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/second.js) +
# d3.utcSeconds(start, stop[, step]) + +Aliases for [d3.timeSecond](#timeSecond).[range](#interval_range) and [d3.utcSecond](#timeSecond).[range](#interval_range). + +# d3.timeMinutes(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/minute.js) +
# d3.utcMinutes(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcMinute.js) + +Aliases for [d3.timeMinute](#timeMinute).[range](#interval_range) and [d3.utcMinute](#timeMinute).[range](#interval_range). + +# d3.timeHours(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/hour.js) +
# d3.utcHours(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcHour.js) + +Aliases for [d3.timeHour](#timeHour).[range](#interval_range) and [d3.utcHour](#timeHour).[range](#interval_range). + +# d3.timeDays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/day.js) +
# d3.utcDays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcDay.js) + +Aliases for [d3.timeDay](#timeDay).[range](#interval_range) and [d3.utcDay](#timeDay).[range](#interval_range). + +# d3.timeWeeks(start, stop[, step]) +
# d3.utcWeeks(start, stop[, step]) + +Aliases for [d3.timeWeek](#timeWeek).[range](#interval_range) and [d3.utcWeek](#timeWeek).[range](#interval_range). + +# d3.timeSundays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcSundays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Aliases for [d3.timeSunday](#timeSunday).[range](#interval_range) and [d3.utcSunday](#timeSunday).[range](#interval_range). + +# d3.timeMondays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcMondays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Aliases for [d3.timeMonday](#timeMonday).[range](#interval_range) and [d3.utcMonday](#timeMonday).[range](#interval_range). + +# d3.timeTuesdays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcTuesdays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Aliases for [d3.timeTuesday](#timeTuesday).[range](#interval_range) and [d3.utcTuesday](#timeTuesday).[range](#interval_range). + +# d3.timeWednesdays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcWednesdays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Aliases for [d3.timeWednesday](#timeWednesday).[range](#interval_range) and [d3.utcWednesday](#timeWednesday).[range](#interval_range). + +# d3.timeThursdays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcThursdays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Aliases for [d3.timeThursday](#timeThursday).[range](#interval_range) and [d3.utcThursday](#timeThursday).[range](#interval_range). + +# d3.timeFridays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcFridays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Aliases for [d3.timeFriday](#timeFriday).[range](#interval_range) and [d3.utcFriday](#timeFriday).[range](#interval_range). + +# d3.timeSaturdays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/week.js) +
# d3.utcSaturdays(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcWeek.js) + +Aliases for [d3.timeSaturday](#timeSaturday).[range](#interval_range) and [d3.utcSaturday](#timeSaturday).[range](#interval_range). + +# d3.timeMonths(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/month.js) +
# d3.utcMonths(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcMonth.js) + +Aliases for [d3.timeMonth](#timeMonth).[range](#interval_range) and [d3.utcMonth](#timeMonth).[range](#interval_range). + +# d3.timeYears(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/year.js) +
# d3.utcYears(start, stop[, step]) · [Source](https://github.com/d3/d3-time/blob/master/src/utcYear.js) + +Aliases for [d3.timeYear](#timeYear).[range](#interval_range) and [d3.utcYear](#timeYear).[range](#interval_range). diff --git a/node_modules/d3-time/dist/d3-time.js b/node_modules/d3-time/dist/d3-time.js new file mode 100644 index 00000000..da701cb9 --- /dev/null +++ b/node_modules/d3-time/dist/d3-time.js @@ -0,0 +1,370 @@ +// https://d3js.org/d3-time/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +var t0 = new Date, + t1 = new Date; + +function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; + } + + interval.floor = function(date) { + return floori(date = new Date(+date)), date; + }; + + interval.ceil = function(date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function(date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function(date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function(start, stop, step) { + var range = [], previous; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(previous = new Date(+start)), offseti(start, step), floori(start); + while (previous < start && start < stop); + return range; + }; + + interval.filter = function(test) { + return newInterval(function(date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function(date, step) { + if (date >= date) { + if (step < 0) while (++step <= 0) { + while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty + } else while (--step >= 0) { + while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty + } + } + }); + }; + + if (count) { + interval.count = function(start, end) { + t0.setTime(+start), t1.setTime(+end); + floori(t0), floori(t1); + return Math.floor(count(t0, t1)); + }; + + interval.every = function(step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function(d) { return field(d) % step === 0; } + : function(d) { return interval.count(0, d) % step === 0; }); + }; + } + + return interval; +} + +var millisecond = newInterval(function() { + // noop +}, function(date, step) { + date.setTime(+date + step); +}, function(start, end) { + return end - start; +}); + +// An optimized implementation for this simple case. +millisecond.every = function(k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function(date) { + date.setTime(Math.floor(date / k) * k); + }, function(date, step) { + date.setTime(+date + step * k); + }, function(start, end) { + return (end - start) / k; + }); +}; +var milliseconds = millisecond.range; + +var durationSecond = 1e3; +var durationMinute = 6e4; +var durationHour = 36e5; +var durationDay = 864e5; +var durationWeek = 6048e5; + +var second = newInterval(function(date) { + date.setTime(date - date.getMilliseconds()); +}, function(date, step) { + date.setTime(+date + step * durationSecond); +}, function(start, end) { + return (end - start) / durationSecond; +}, function(date) { + return date.getUTCSeconds(); +}); +var seconds = second.range; + +var minute = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getMinutes(); +}); +var minutes = minute.range; + +var hour = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getHours(); +}); +var hours = hour.range; + +var day = newInterval( + date => date.setHours(0, 0, 0, 0), + (date, step) => date.setDate(date.getDate() + step), + (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay, + date => date.getDate() - 1 +); +var days = day.range; + +function weekday(i) { + return newInterval(function(date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setDate(date.getDate() + step * 7); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; + }); +} + +var sunday = weekday(0); +var monday = weekday(1); +var tuesday = weekday(2); +var wednesday = weekday(3); +var thursday = weekday(4); +var friday = weekday(5); +var saturday = weekday(6); + +var sundays = sunday.range; +var mondays = monday.range; +var tuesdays = tuesday.range; +var wednesdays = wednesday.range; +var thursdays = thursday.range; +var fridays = friday.range; +var saturdays = saturday.range; + +var month = newInterval(function(date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setMonth(date.getMonth() + step); +}, function(start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; +}, function(date) { + return date.getMonth(); +}); +var months = month.range; + +var year = newInterval(function(date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setFullYear(date.getFullYear() + step); +}, function(start, end) { + return end.getFullYear() - start.getFullYear(); +}, function(date) { + return date.getFullYear(); +}); + +// An optimized implementation for this simple case. +year.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); +}; +var years = year.range; + +var utcMinute = newInterval(function(date) { + date.setUTCSeconds(0, 0); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getUTCMinutes(); +}); +var utcMinutes = utcMinute.range; + +var utcHour = newInterval(function(date) { + date.setUTCMinutes(0, 0, 0); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getUTCHours(); +}); +var utcHours = utcHour.range; + +var utcDay = newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCDate(date.getUTCDate() + step); +}, function(start, end) { + return (end - start) / durationDay; +}, function(date) { + return date.getUTCDate() - 1; +}); +var utcDays = utcDay.range; + +function utcWeekday(i) { + return newInterval(function(date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function(start, end) { + return (end - start) / durationWeek; + }); +} + +var utcSunday = utcWeekday(0); +var utcMonday = utcWeekday(1); +var utcTuesday = utcWeekday(2); +var utcWednesday = utcWeekday(3); +var utcThursday = utcWeekday(4); +var utcFriday = utcWeekday(5); +var utcSaturday = utcWeekday(6); + +var utcSundays = utcSunday.range; +var utcMondays = utcMonday.range; +var utcTuesdays = utcTuesday.range; +var utcWednesdays = utcWednesday.range; +var utcThursdays = utcThursday.range; +var utcFridays = utcFriday.range; +var utcSaturdays = utcSaturday.range; + +var utcMonth = newInterval(function(date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCMonth(date.getUTCMonth() + step); +}, function(start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; +}, function(date) { + return date.getUTCMonth(); +}); +var utcMonths = utcMonth.range; + +var utcYear = newInterval(function(date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); +}, function(start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); +}, function(date) { + return date.getUTCFullYear(); +}); + +// An optimized implementation for this simple case. +utcYear.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); +}; +var utcYears = utcYear.range; + +exports.timeDay = day; +exports.timeDays = days; +exports.timeFriday = friday; +exports.timeFridays = fridays; +exports.timeHour = hour; +exports.timeHours = hours; +exports.timeInterval = newInterval; +exports.timeMillisecond = millisecond; +exports.timeMilliseconds = milliseconds; +exports.timeMinute = minute; +exports.timeMinutes = minutes; +exports.timeMonday = monday; +exports.timeMondays = mondays; +exports.timeMonth = month; +exports.timeMonths = months; +exports.timeSaturday = saturday; +exports.timeSaturdays = saturdays; +exports.timeSecond = second; +exports.timeSeconds = seconds; +exports.timeSunday = sunday; +exports.timeSundays = sundays; +exports.timeThursday = thursday; +exports.timeThursdays = thursdays; +exports.timeTuesday = tuesday; +exports.timeTuesdays = tuesdays; +exports.timeWednesday = wednesday; +exports.timeWednesdays = wednesdays; +exports.timeWeek = sunday; +exports.timeWeeks = sundays; +exports.timeYear = year; +exports.timeYears = years; +exports.utcDay = utcDay; +exports.utcDays = utcDays; +exports.utcFriday = utcFriday; +exports.utcFridays = utcFridays; +exports.utcHour = utcHour; +exports.utcHours = utcHours; +exports.utcMillisecond = millisecond; +exports.utcMilliseconds = milliseconds; +exports.utcMinute = utcMinute; +exports.utcMinutes = utcMinutes; +exports.utcMonday = utcMonday; +exports.utcMondays = utcMondays; +exports.utcMonth = utcMonth; +exports.utcMonths = utcMonths; +exports.utcSaturday = utcSaturday; +exports.utcSaturdays = utcSaturdays; +exports.utcSecond = second; +exports.utcSeconds = seconds; +exports.utcSunday = utcSunday; +exports.utcSundays = utcSundays; +exports.utcThursday = utcThursday; +exports.utcThursdays = utcThursdays; +exports.utcTuesday = utcTuesday; +exports.utcTuesdays = utcTuesdays; +exports.utcWednesday = utcWednesday; +exports.utcWednesdays = utcWednesdays; +exports.utcWeek = utcSunday; +exports.utcWeeks = utcSundays; +exports.utcYear = utcYear; +exports.utcYears = utcYears; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-time/dist/d3-time.min.js b/node_modules/d3-time/dist/d3-time.min.js new file mode 100644 index 00000000..248be503 --- /dev/null +++ b/node_modules/d3-time/dist/d3-time.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-time/ v2.0.0 Copyright 2020 Mike Bostock +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).d3=e.d3||{})}(this,function(e){"use strict";var t=new Date,n=new Date;function u(e,r,i,o){function a(t){return e(t=0===arguments.length?new Date:new Date(+t)),t}return a.floor=function(t){return e(t=new Date(+t)),t},a.ceil=function(t){return e(t=new Date(t-1)),r(t,1),e(t),t},a.round=function(e){var t=a(e),n=a.ceil(e);return e-t0))return o;do{o.push(i=new Date(+t)),r(t,u),e(t)}while(i=n)for(;e(n),!t(n);)n.setTime(n-1)},function(e,n){if(e>=e)if(n<0)for(;++n<=0;)for(;r(e,-1),!t(e););else for(;--n>=0;)for(;r(e,1),!t(e););})},i&&(a.count=function(u,r){return t.setTime(+u),n.setTime(+r),e(t),e(n),Math.floor(i(t,n))},a.every=function(e){return e=Math.floor(e),isFinite(e)&&e>0?e>1?a.filter(o?function(t){return o(t)%e==0}:function(t){return a.count(0,t)%e==0}):a:null}),a}var r=u(function(){},function(e,t){e.setTime(+e+t)},function(e,t){return t-e});r.every=function(e){return e=Math.floor(e),isFinite(e)&&e>0?e>1?u(function(t){t.setTime(Math.floor(t/e)*e)},function(t,n){t.setTime(+t+n*e)},function(t,n){return(n-t)/e}):r:null};var i=r.range,o=6e4,a=6048e5,s=u(function(e){e.setTime(e-e.getMilliseconds())},function(e,t){e.setTime(+e+1e3*t)},function(e,t){return(t-e)/1e3},function(e){return e.getUTCSeconds()}),c=s.range,f=u(function(e){e.setTime(e-e.getMilliseconds()-1e3*e.getSeconds())},function(e,t){e.setTime(+e+t*o)},function(e,t){return(t-e)/o},function(e){return e.getMinutes()}),l=f.range,g=u(function(e){e.setTime(e-e.getMilliseconds()-1e3*e.getSeconds()-e.getMinutes()*o)},function(e,t){e.setTime(+e+36e5*t)},function(e,t){return(t-e)/36e5},function(e){return e.getHours()}),T=g.range,d=u(e=>e.setHours(0,0,0,0),(e,t)=>e.setDate(e.getDate()+t),(e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*o)/864e5,e=>e.getDate()-1),m=d.range;function M(e){return u(function(t){t.setDate(t.getDate()-(t.getDay()+7-e)%7),t.setHours(0,0,0,0)},function(e,t){e.setDate(e.getDate()+7*t)},function(e,t){return(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*o)/a})}var y=M(0),C=M(1),U=M(2),h=M(3),D=M(4),F=M(5),Y=M(6),H=y.range,S=C.range,v=U.range,w=h.range,p=D.range,W=F.range,O=Y.range,k=u(function(e){e.setDate(1),e.setHours(0,0,0,0)},function(e,t){e.setMonth(e.getMonth()+t)},function(e,t){return t.getMonth()-e.getMonth()+12*(t.getFullYear()-e.getFullYear())},function(e){return e.getMonth()}),z=k.range,x=u(function(e){e.setMonth(0,1),e.setHours(0,0,0,0)},function(e,t){e.setFullYear(e.getFullYear()+t)},function(e,t){return t.getFullYear()-e.getFullYear()},function(e){return e.getFullYear()});x.every=function(e){return isFinite(e=Math.floor(e))&&e>0?u(function(t){t.setFullYear(Math.floor(t.getFullYear()/e)*e),t.setMonth(0,1),t.setHours(0,0,0,0)},function(t,n){t.setFullYear(t.getFullYear()+n*e)}):null};var b=x.range,j=u(function(e){e.setUTCSeconds(0,0)},function(e,t){e.setTime(+e+t*o)},function(e,t){return(t-e)/o},function(e){return e.getUTCMinutes()}),_=j.range,I=u(function(e){e.setUTCMinutes(0,0,0)},function(e,t){e.setTime(+e+36e5*t)},function(e,t){return(t-e)/36e5},function(e){return e.getUTCHours()}),P=I.range,q=u(function(e){e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCDate(e.getUTCDate()+t)},function(e,t){return(t-e)/864e5},function(e){return e.getUTCDate()-1}),A=q.range;function B(e){return u(function(t){t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7),t.setUTCHours(0,0,0,0)},function(e,t){e.setUTCDate(e.getUTCDate()+7*t)},function(e,t){return(t-e)/a})}var E=B(0),G=B(1),J=B(2),K=B(3),L=B(4),N=B(5),Q=B(6),R=E.range,V=G.range,X=J.range,Z=K.range,$=L.range,ee=N.range,te=Q.range,ne=u(function(e){e.setUTCDate(1),e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCMonth(e.getUTCMonth()+t)},function(e,t){return t.getUTCMonth()-e.getUTCMonth()+12*(t.getUTCFullYear()-e.getUTCFullYear())},function(e){return e.getUTCMonth()}),ue=ne.range,re=u(function(e){e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},function(e,t){e.setUTCFullYear(e.getUTCFullYear()+t)},function(e,t){return t.getUTCFullYear()-e.getUTCFullYear()},function(e){return e.getUTCFullYear()});re.every=function(e){return isFinite(e=Math.floor(e))&&e>0?u(function(t){t.setUTCFullYear(Math.floor(t.getUTCFullYear()/e)*e),t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCFullYear(t.getUTCFullYear()+n*e)}):null};var ie=re.range;e.timeDay=d,e.timeDays=m,e.timeFriday=F,e.timeFridays=W,e.timeHour=g,e.timeHours=T,e.timeInterval=u,e.timeMillisecond=r,e.timeMilliseconds=i,e.timeMinute=f,e.timeMinutes=l,e.timeMonday=C,e.timeMondays=S,e.timeMonth=k,e.timeMonths=z,e.timeSaturday=Y,e.timeSaturdays=O,e.timeSecond=s,e.timeSeconds=c,e.timeSunday=y,e.timeSundays=H,e.timeThursday=D,e.timeThursdays=p,e.timeTuesday=U,e.timeTuesdays=v,e.timeWednesday=h,e.timeWednesdays=w,e.timeWeek=y,e.timeWeeks=H,e.timeYear=x,e.timeYears=b,e.utcDay=q,e.utcDays=A,e.utcFriday=N,e.utcFridays=ee,e.utcHour=I,e.utcHours=P,e.utcMillisecond=r,e.utcMilliseconds=i,e.utcMinute=j,e.utcMinutes=_,e.utcMonday=G,e.utcMondays=V,e.utcMonth=ne,e.utcMonths=ue,e.utcSaturday=Q,e.utcSaturdays=te,e.utcSecond=s,e.utcSeconds=c,e.utcSunday=E,e.utcSundays=R,e.utcThursday=L,e.utcThursdays=$,e.utcTuesday=J,e.utcTuesdays=X,e.utcWednesday=K,e.utcWednesdays=Z,e.utcWeek=E,e.utcWeeks=R,e.utcYear=re,e.utcYears=ie,Object.defineProperty(e,"__esModule",{value:!0})}); diff --git a/node_modules/d3-time/package.json b/node_modules/d3-time/package.json new file mode 100644 index 00000000..d76e0c4f --- /dev/null +++ b/node_modules/d3-time/package.json @@ -0,0 +1,73 @@ +{ + "_from": "d3-time@2", + "_id": "d3-time@2.0.0", + "_inBundle": false, + "_integrity": "sha512-2mvhstTFcMvwStWd9Tj3e6CEqtOivtD8AUiHT8ido/xmzrI9ijrUUihZ6nHuf/vsScRBonagOdj0Vv+SEL5G3Q==", + "_location": "/d3-time", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-time@2", + "name": "d3-time", + "escapedName": "d3-time", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3", + "/d3-scale", + "/d3-time-format" + ], + "_resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.0.0.tgz", + "_shasum": "ad7c127d17c67bd57a4c61f3eaecb81108b1e0ab", + "_spec": "d3-time@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-time/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "A calculator for humanity’s peculiar conventions of time.", + "devDependencies": { + "eslint": "6", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-time/", + "jsdelivr": "dist/d3-time.min.js", + "keywords": [ + "d3", + "d3-module", + "time", + "interval", + "calendar" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-time.js", + "module": "src/index.js", + "name": "d3-time", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-time.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "TZ=America/Los_Angeles tape 'test/**/*-test.js' && eslint src" + }, + "sideEffects": false, + "unpkg": "dist/d3-time.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-time/src/day.js b/node_modules/d3-time/src/day.js new file mode 100644 index 00000000..6c3f9ca2 --- /dev/null +++ b/node_modules/d3-time/src/day.js @@ -0,0 +1,12 @@ +import interval from "./interval.js"; +import {durationDay, durationMinute} from "./duration.js"; + +var day = interval( + date => date.setHours(0, 0, 0, 0), + (date, step) => date.setDate(date.getDate() + step), + (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay, + date => date.getDate() - 1 +); + +export default day; +export var days = day.range; diff --git a/node_modules/d3-time/src/duration.js b/node_modules/d3-time/src/duration.js new file mode 100644 index 00000000..fee16e79 --- /dev/null +++ b/node_modules/d3-time/src/duration.js @@ -0,0 +1,5 @@ +export var durationSecond = 1e3; +export var durationMinute = 6e4; +export var durationHour = 36e5; +export var durationDay = 864e5; +export var durationWeek = 6048e5; diff --git a/node_modules/d3-time/src/hour.js b/node_modules/d3-time/src/hour.js new file mode 100644 index 00000000..9b944d62 --- /dev/null +++ b/node_modules/d3-time/src/hour.js @@ -0,0 +1,15 @@ +import interval from "./interval.js"; +import {durationHour, durationMinute, durationSecond} from "./duration.js"; + +var hour = interval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getHours(); +}); + +export default hour; +export var hours = hour.range; diff --git a/node_modules/d3-time/src/index.js b/node_modules/d3-time/src/index.js new file mode 100644 index 00000000..354dc70f --- /dev/null +++ b/node_modules/d3-time/src/index.js @@ -0,0 +1,105 @@ +export { + default as timeInterval +} from "./interval.js"; + +export { + default as timeMillisecond, + milliseconds as timeMilliseconds, + default as utcMillisecond, + milliseconds as utcMilliseconds +} from "./millisecond.js"; + +export { + default as timeSecond, + seconds as timeSeconds, + default as utcSecond, + seconds as utcSeconds +} from "./second.js"; + +export { + default as timeMinute, + minutes as timeMinutes +} from "./minute.js"; + +export { + default as timeHour, + hours as timeHours +} from "./hour.js"; + +export { + default as timeDay, + days as timeDays +} from "./day.js"; + +export { + sunday as timeWeek, + sundays as timeWeeks, + sunday as timeSunday, + sundays as timeSundays, + monday as timeMonday, + mondays as timeMondays, + tuesday as timeTuesday, + tuesdays as timeTuesdays, + wednesday as timeWednesday, + wednesdays as timeWednesdays, + thursday as timeThursday, + thursdays as timeThursdays, + friday as timeFriday, + fridays as timeFridays, + saturday as timeSaturday, + saturdays as timeSaturdays +} from "./week.js"; + +export { + default as timeMonth, + months as timeMonths +} from "./month.js"; + +export { + default as timeYear, + years as timeYears +} from "./year.js"; + +export { + default as utcMinute, + utcMinutes as utcMinutes +} from "./utcMinute.js"; + +export { + default as utcHour, + utcHours as utcHours +} from "./utcHour.js"; + +export { + default as utcDay, + utcDays as utcDays +} from "./utcDay.js"; + +export { + utcSunday as utcWeek, + utcSundays as utcWeeks, + utcSunday as utcSunday, + utcSundays as utcSundays, + utcMonday as utcMonday, + utcMondays as utcMondays, + utcTuesday as utcTuesday, + utcTuesdays as utcTuesdays, + utcWednesday as utcWednesday, + utcWednesdays as utcWednesdays, + utcThursday as utcThursday, + utcThursdays as utcThursdays, + utcFriday as utcFriday, + utcFridays as utcFridays, + utcSaturday as utcSaturday, + utcSaturdays as utcSaturdays +} from "./utcWeek.js"; + +export { + default as utcMonth, + utcMonths as utcMonths +} from "./utcMonth.js"; + +export { + default as utcYear, + utcYears as utcYears +} from "./utcYear.js"; diff --git a/node_modules/d3-time/src/interval.js b/node_modules/d3-time/src/interval.js new file mode 100644 index 00000000..2714a81d --- /dev/null +++ b/node_modules/d3-time/src/interval.js @@ -0,0 +1,70 @@ +var t0 = new Date, + t1 = new Date; + +export default function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; + } + + interval.floor = function(date) { + return floori(date = new Date(+date)), date; + }; + + interval.ceil = function(date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function(date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function(date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function(start, stop, step) { + var range = [], previous; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(previous = new Date(+start)), offseti(start, step), floori(start); + while (previous < start && start < stop); + return range; + }; + + interval.filter = function(test) { + return newInterval(function(date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function(date, step) { + if (date >= date) { + if (step < 0) while (++step <= 0) { + while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty + } else while (--step >= 0) { + while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty + } + } + }); + }; + + if (count) { + interval.count = function(start, end) { + t0.setTime(+start), t1.setTime(+end); + floori(t0), floori(t1); + return Math.floor(count(t0, t1)); + }; + + interval.every = function(step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function(d) { return field(d) % step === 0; } + : function(d) { return interval.count(0, d) % step === 0; }); + }; + } + + return interval; +} diff --git a/node_modules/d3-time/src/millisecond.js b/node_modules/d3-time/src/millisecond.js new file mode 100644 index 00000000..d89585c2 --- /dev/null +++ b/node_modules/d3-time/src/millisecond.js @@ -0,0 +1,26 @@ +import interval from "./interval.js"; + +var millisecond = interval(function() { + // noop +}, function(date, step) { + date.setTime(+date + step); +}, function(start, end) { + return end - start; +}); + +// An optimized implementation for this simple case. +millisecond.every = function(k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return interval(function(date) { + date.setTime(Math.floor(date / k) * k); + }, function(date, step) { + date.setTime(+date + step * k); + }, function(start, end) { + return (end - start) / k; + }); +}; + +export default millisecond; +export var milliseconds = millisecond.range; diff --git a/node_modules/d3-time/src/minute.js b/node_modules/d3-time/src/minute.js new file mode 100644 index 00000000..2ed894bf --- /dev/null +++ b/node_modules/d3-time/src/minute.js @@ -0,0 +1,15 @@ +import interval from "./interval.js"; +import {durationMinute, durationSecond} from "./duration.js"; + +var minute = interval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getMinutes(); +}); + +export default minute; +export var minutes = minute.range; diff --git a/node_modules/d3-time/src/month.js b/node_modules/d3-time/src/month.js new file mode 100644 index 00000000..ac995dec --- /dev/null +++ b/node_modules/d3-time/src/month.js @@ -0,0 +1,15 @@ +import interval from "./interval.js"; + +var month = interval(function(date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setMonth(date.getMonth() + step); +}, function(start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; +}, function(date) { + return date.getMonth(); +}); + +export default month; +export var months = month.range; diff --git a/node_modules/d3-time/src/second.js b/node_modules/d3-time/src/second.js new file mode 100644 index 00000000..62069ef1 --- /dev/null +++ b/node_modules/d3-time/src/second.js @@ -0,0 +1,15 @@ +import interval from "./interval.js"; +import {durationSecond} from "./duration.js"; + +var second = interval(function(date) { + date.setTime(date - date.getMilliseconds()); +}, function(date, step) { + date.setTime(+date + step * durationSecond); +}, function(start, end) { + return (end - start) / durationSecond; +}, function(date) { + return date.getUTCSeconds(); +}); + +export default second; +export var seconds = second.range; diff --git a/node_modules/d3-time/src/utcDay.js b/node_modules/d3-time/src/utcDay.js new file mode 100644 index 00000000..8023be15 --- /dev/null +++ b/node_modules/d3-time/src/utcDay.js @@ -0,0 +1,15 @@ +import interval from "./interval.js"; +import {durationDay} from "./duration.js"; + +var utcDay = interval(function(date) { + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCDate(date.getUTCDate() + step); +}, function(start, end) { + return (end - start) / durationDay; +}, function(date) { + return date.getUTCDate() - 1; +}); + +export default utcDay; +export var utcDays = utcDay.range; diff --git a/node_modules/d3-time/src/utcHour.js b/node_modules/d3-time/src/utcHour.js new file mode 100644 index 00000000..98b88222 --- /dev/null +++ b/node_modules/d3-time/src/utcHour.js @@ -0,0 +1,15 @@ +import interval from "./interval.js"; +import {durationHour} from "./duration.js"; + +var utcHour = interval(function(date) { + date.setUTCMinutes(0, 0, 0); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getUTCHours(); +}); + +export default utcHour; +export var utcHours = utcHour.range; diff --git a/node_modules/d3-time/src/utcMinute.js b/node_modules/d3-time/src/utcMinute.js new file mode 100644 index 00000000..4e5e7e56 --- /dev/null +++ b/node_modules/d3-time/src/utcMinute.js @@ -0,0 +1,15 @@ +import interval from "./interval.js"; +import {durationMinute} from "./duration.js"; + +var utcMinute = interval(function(date) { + date.setUTCSeconds(0, 0); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getUTCMinutes(); +}); + +export default utcMinute; +export var utcMinutes = utcMinute.range; diff --git a/node_modules/d3-time/src/utcMonth.js b/node_modules/d3-time/src/utcMonth.js new file mode 100644 index 00000000..3991b180 --- /dev/null +++ b/node_modules/d3-time/src/utcMonth.js @@ -0,0 +1,15 @@ +import interval from "./interval.js"; + +var utcMonth = interval(function(date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCMonth(date.getUTCMonth() + step); +}, function(start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; +}, function(date) { + return date.getUTCMonth(); +}); + +export default utcMonth; +export var utcMonths = utcMonth.range; diff --git a/node_modules/d3-time/src/utcWeek.js b/node_modules/d3-time/src/utcWeek.js new file mode 100644 index 00000000..e36fac8b --- /dev/null +++ b/node_modules/d3-time/src/utcWeek.js @@ -0,0 +1,29 @@ +import interval from "./interval.js"; +import {durationWeek} from "./duration.js"; + +function utcWeekday(i) { + return interval(function(date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function(start, end) { + return (end - start) / durationWeek; + }); +} + +export var utcSunday = utcWeekday(0); +export var utcMonday = utcWeekday(1); +export var utcTuesday = utcWeekday(2); +export var utcWednesday = utcWeekday(3); +export var utcThursday = utcWeekday(4); +export var utcFriday = utcWeekday(5); +export var utcSaturday = utcWeekday(6); + +export var utcSundays = utcSunday.range; +export var utcMondays = utcMonday.range; +export var utcTuesdays = utcTuesday.range; +export var utcWednesdays = utcWednesday.range; +export var utcThursdays = utcThursday.range; +export var utcFridays = utcFriday.range; +export var utcSaturdays = utcSaturday.range; diff --git a/node_modules/d3-time/src/utcYear.js b/node_modules/d3-time/src/utcYear.js new file mode 100644 index 00000000..ee897648 --- /dev/null +++ b/node_modules/d3-time/src/utcYear.js @@ -0,0 +1,26 @@ +import interval from "./interval.js"; + +var utcYear = interval(function(date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); +}, function(start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); +}, function(date) { + return date.getUTCFullYear(); +}); + +// An optimized implementation for this simple case. +utcYear.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); +}; + +export default utcYear; +export var utcYears = utcYear.range; diff --git a/node_modules/d3-time/src/week.js b/node_modules/d3-time/src/week.js new file mode 100644 index 00000000..c0f1b030 --- /dev/null +++ b/node_modules/d3-time/src/week.js @@ -0,0 +1,29 @@ +import interval from "./interval.js"; +import {durationMinute, durationWeek} from "./duration.js"; + +function weekday(i) { + return interval(function(date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setDate(date.getDate() + step * 7); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; + }); +} + +export var sunday = weekday(0); +export var monday = weekday(1); +export var tuesday = weekday(2); +export var wednesday = weekday(3); +export var thursday = weekday(4); +export var friday = weekday(5); +export var saturday = weekday(6); + +export var sundays = sunday.range; +export var mondays = monday.range; +export var tuesdays = tuesday.range; +export var wednesdays = wednesday.range; +export var thursdays = thursday.range; +export var fridays = friday.range; +export var saturdays = saturday.range; diff --git a/node_modules/d3-time/src/year.js b/node_modules/d3-time/src/year.js new file mode 100644 index 00000000..a86872d7 --- /dev/null +++ b/node_modules/d3-time/src/year.js @@ -0,0 +1,26 @@ +import interval from "./interval.js"; + +var year = interval(function(date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setFullYear(date.getFullYear() + step); +}, function(start, end) { + return end.getFullYear() - start.getFullYear(); +}, function(date) { + return date.getFullYear(); +}); + +// An optimized implementation for this simple case. +year.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); +}; + +export default year; +export var years = year.range; diff --git a/node_modules/d3-timer/LICENSE b/node_modules/d3-timer/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-timer/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-timer/README.md b/node_modules/d3-timer/README.md new file mode 100644 index 00000000..d1aafd06 --- /dev/null +++ b/node_modules/d3-timer/README.md @@ -0,0 +1,75 @@ +# d3-timer + +This module provides an efficient queue capable of managing thousands of concurrent animations, while guaranteeing consistent, synchronized timing with concurrent or staged animations. Internally, it uses [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame) for fluid animation (if available), switching to [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout) for delays longer than 24ms. + +## Installing + +If you use NPM, `npm install d3-timer`. Otherwise, download the [latest release](https://github.com/d3/d3-timer/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-timer.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + +``` + +## API Reference + +# d3.now() [<>](https://github.com/d3/d3-timer/blob/master/src/timer.js "Source") + +Returns the current time as defined by [performance.now](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) if available, and [Date.now](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/now) if not. The current time is updated at the start of a frame; it is thus consistent during the frame, and any timers scheduled during the same frame will be synchronized. If this method is called outside of a frame, such as in response to a user event, the current time is calculated and then fixed until the next frame, again ensuring consistent timing during event handling. + +# d3.timer(callback[, delay[, time]]) [<>](https://github.com/d3/d3-timer/blob/master/src/timer.js "Source") + +Schedules a new timer, invoking the specified *callback* repeatedly until the timer is [stopped](#timer_stop). An optional numeric *delay* in milliseconds may be specified to invoke the given *callback* after a delay; if *delay* is not specified, it defaults to zero. The delay is relative to the specified *time* in milliseconds; if *time* is not specified, it defaults to [now](#now). + +The *callback* is passed the (apparent) *elapsed* time since the timer became active. For example: + +```js +var t = d3.timer(function(elapsed) { + console.log(elapsed); + if (elapsed > 200) t.stop(); +}, 150); +``` + +This produces roughly the following console output: + +``` +3 +25 +48 +65 +85 +106 +125 +146 +167 +189 +209 +``` + +(The exact values may vary depending on your JavaScript runtime and what else your computer is doing.) Note that the first *elapsed* time is 3ms: this is the elapsed time since the timer started, not since the timer was scheduled. Here the timer started 150ms after it was scheduled due to the specified delay. The apparent *elapsed* time may be less than the true *elapsed* time if the page is backgrounded and [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame) is paused; in the background, apparent time is frozen. + +If [timer](#timer) is called within the callback of another timer, the new timer callback (if eligible as determined by the specified *delay* and *time*) will be invoked immediately at the end of the current frame, rather than waiting until the next frame. Within a frame, timer callbacks are guaranteed to be invoked in the order they were scheduled, regardless of their start time. + +# timer.restart(callback[, delay[, time]]) [<>](https://github.com/d3/d3-timer/blob/master/src/timer.js "Source") + +Restart a timer with the specified *callback* and optional *delay* and *time*. This is equivalent to stopping this timer and creating a new timer with the specified arguments, although this timer retains the original invocation priority. + +# timer.stop() [<>](https://github.com/d3/d3-timer/blob/master/src/timer.js "Source") + +Stops this timer, preventing subsequent callbacks. This method has no effect if the timer has already stopped. + +# d3.timerFlush() [<>](https://github.com/d3/d3-timer/blob/master/src/timer.js "Source") + +Immediately invoke any eligible timer callbacks. Note that zero-delay timers are normally first executed after one frame (~17ms). This can cause a brief flicker because the browser renders the page twice: once at the end of the first event loop, then again immediately on the first timer callback. By flushing the timer queue at the end of the first event loop, you can run any zero-delay timers immediately and avoid the flicker. + +# d3.timeout(callback[, delay[, time]]) [<>](https://github.com/d3/d3-timer/blob/master/src/timeout.js "Source") + +Like [timer](#timer), except the timer automatically [stops](#timer_stop) on its first callback. A suitable replacement for [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout) that is guaranteed to not run in the background. The *callback* is passed the elapsed time. + +# d3.interval(callback[, delay[, time]]) [<>](https://github.com/d3/d3-timer/blob/master/src/interval.js "Source") + +Like [timer](#timer), except the *callback* is invoked only every *delay* milliseconds; if *delay* is not specified, this is equivalent to [timer](#timer). A suitable replacement for [setInterval](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval) that is guaranteed to not run in the background. The *callback* is passed the elapsed time. diff --git a/node_modules/d3-timer/dist/d3-timer.js b/node_modules/d3-timer/dist/d3-timer.js new file mode 100644 index 00000000..cbf45ecd --- /dev/null +++ b/node_modules/d3-timer/dist/d3-timer.js @@ -0,0 +1,153 @@ +// https://d3js.org/d3-timer/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +var frame = 0, // is an animation frame pending? + timeout = 0, // is a timeout pending? + interval = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); }; + +function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +} + +function clearNow() { + clockNow = 0; +} + +function Timer() { + this._call = + this._time = + this._next = null; +} + +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } +}; + +function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; +} + +function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; + } + --frame; +} + +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } +} + +function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; +} + +function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); +} + +function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} + +function timeout$1(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(elapsed => { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} + +function interval$1(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + t._restart = t.restart; + t.restart = function(callback, delay, time) { + delay = +delay, time = time == null ? now() : +time; + t._restart(function tick(elapsed) { + elapsed += total; + t._restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + }; + t.restart(callback, delay, time); + return t; +} + +exports.interval = interval$1; +exports.now = now; +exports.timeout = timeout$1; +exports.timer = timer; +exports.timerFlush = timerFlush; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-timer/dist/d3-timer.min.js b/node_modules/d3-timer/dist/d3-timer.min.js new file mode 100644 index 00000000..f03d7118 --- /dev/null +++ b/node_modules/d3-timer/dist/d3-timer.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-timer/ v2.0.0 Copyright 2020 Mike Bostock +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t=t||self).d3=t.d3||{})}(this,function(t){"use strict";var n,e,o=0,r=0,i=0,u=1e3,l=0,a=0,c=0,s="object"==typeof performance&&performance.now?performance:Date,f="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function _(){return a||(f(m),a=s.now()+c)}function m(){a=0}function p(){this._call=this._time=this._next=null}function w(t,n,e){var o=new p;return o.restart(t,n,e),o}function d(){_(),++o;for(var t,e=n;e;)(t=a-e._time)>=0&&e._call.call(null,t),e=e._next;--o}function h(){a=(l=s.now())+c,o=r=0;try{d()}finally{o=0,function(){var t,o,r=n,i=1/0;for(;r;)r._call?(i>r._time&&(i=r._time),t=r,r=r._next):(o=r._next,r._next=null,r=t?t._next=o:n=o);e=t,v(i)}(),a=0}}function y(){var t=s.now(),n=t-l;n>u&&(c-=n,l=t)}function v(t){o||(r&&(r=clearTimeout(r)),t-a>24?(t<1/0&&(r=setTimeout(h,t-s.now()-c)),i&&(i=clearInterval(i))):(i||(l=s.now(),i=setInterval(y,u)),o=1,f(h)))}p.prototype=w.prototype={constructor:p,restart:function(t,o,r){if("function"!=typeof t)throw new TypeError("callback is not a function");r=(null==r?_():+r)+(null==o?0:+o),this._next||e===this||(e?e._next=this:n=this,e=this),this._call=t,this._time=r,v()},stop:function(){this._call&&(this._call=null,this._time=1/0,v())}},t.interval=function(t,n,e){var o=new p,r=n;return null==n?(o.restart(t,n,e),o):(o._restart=o.restart,o.restart=function(t,n,e){n=+n,e=null==e?_():+e,o._restart(function i(u){u+=r,o._restart(i,r+=n,e),t(u)},n,e)},o.restart(t,n,e),o)},t.now=_,t.timeout=function(t,n,e){var o=new p;return n=null==n?0:+n,o.restart(e=>{o.stop(),t(e+n)},n,e),o},t.timer=w,t.timerFlush=d,Object.defineProperty(t,"__esModule",{value:!0})}); diff --git a/node_modules/d3-timer/package.json b/node_modules/d3-timer/package.json new file mode 100644 index 00000000..28e495ff --- /dev/null +++ b/node_modules/d3-timer/package.json @@ -0,0 +1,76 @@ +{ + "_from": "d3-timer@2", + "_id": "d3-timer@2.0.0", + "_inBundle": false, + "_integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==", + "_location": "/d3-timer", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-timer@2", + "name": "d3-timer", + "escapedName": "d3-timer", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3", + "/d3-force", + "/d3-transition" + ], + "_resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", + "_shasum": "055edb1d170cfe31ab2da8968deee940b56623e6", + "_spec": "d3-timer@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-timer/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "An efficient queue capable of managing thousands of concurrent animations.", + "devDependencies": { + "eslint": "6", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-timer/", + "jsdelivr": "dist/d3-timer.min.js", + "keywords": [ + "d3", + "d3-module", + "timer", + "transition", + "animation", + "requestAnimationFrame", + "setTimeout", + "setInterval" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-timer.js", + "module": "src/index.js", + "name": "d3-timer", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-timer.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src" + }, + "sideEffects": false, + "unpkg": "dist/d3-timer.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-timer/src/index.js b/node_modules/d3-timer/src/index.js new file mode 100644 index 00000000..66fb8c97 --- /dev/null +++ b/node_modules/d3-timer/src/index.js @@ -0,0 +1,13 @@ +export { + now, + timer, + timerFlush +} from "./timer.js"; + +export { + default as timeout +} from "./timeout.js"; + +export { + default as interval +} from "./interval.js"; diff --git a/node_modules/d3-timer/src/interval.js b/node_modules/d3-timer/src/interval.js new file mode 100644 index 00000000..e38e1bd8 --- /dev/null +++ b/node_modules/d3-timer/src/interval.js @@ -0,0 +1,17 @@ +import {Timer, now} from "./timer.js"; + +export default function(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + t._restart = t.restart; + t.restart = function(callback, delay, time) { + delay = +delay, time = time == null ? now() : +time; + t._restart(function tick(elapsed) { + elapsed += total; + t._restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + } + t.restart(callback, delay, time); + return t; +} diff --git a/node_modules/d3-timer/src/timeout.js b/node_modules/d3-timer/src/timeout.js new file mode 100644 index 00000000..29b4dd2d --- /dev/null +++ b/node_modules/d3-timer/src/timeout.js @@ -0,0 +1,11 @@ +import {Timer} from "./timer.js"; + +export default function(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(elapsed => { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} diff --git a/node_modules/d3-timer/src/timer.js b/node_modules/d3-timer/src/timer.js new file mode 100644 index 00000000..7db35646 --- /dev/null +++ b/node_modules/d3-timer/src/timer.js @@ -0,0 +1,110 @@ +var frame = 0, // is an animation frame pending? + timeout = 0, // is a timeout pending? + interval = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); }; + +export function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +} + +function clearNow() { + clockNow = 0; +} + +export function Timer() { + this._call = + this._time = + this._next = null; +} + +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } +}; + +export function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; +} + +export function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; + } + --frame; +} + +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } +} + +function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; +} + +function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); +} + +function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} diff --git a/node_modules/d3-transition/LICENSE b/node_modules/d3-transition/LICENSE new file mode 100644 index 00000000..6f3bc8f5 --- /dev/null +++ b/node_modules/d3-transition/LICENSE @@ -0,0 +1,58 @@ +Copyright (c) 2010-2015, Michael Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* The name Michael Bostock may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +TERMS OF USE - EASING EQUATIONS + +Open source under the BSD License. + +Copyright 2001 Robert Penner +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +- Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-transition/README.md b/node_modules/d3-transition/README.md new file mode 100644 index 00000000..bad872d0 --- /dev/null +++ b/node_modules/d3-transition/README.md @@ -0,0 +1,452 @@ +# d3-transition + +A transition is a [selection](https://github.com/d3/d3-selection)-like interface for animating changes to the DOM. Instead of applying changes instantaneously, transitions smoothly interpolate the DOM from its current state to the desired target state over a given duration. + +To apply a transition, select elements, call [*selection*.transition](#selection_transition), and then make the desired changes. For example: + +```js +d3.select("body") + .transition() + .style("background-color", "red"); +``` + +Transitions support most selection methods (such as [*transition*.attr](#transition_attr) and [*transition*.style](#transition_style) in place of [*selection*.attr](https://github.com/d3/d3-selection#selection_attr) and [*selection*.style](https://github.com/d3/d3-selection#selection_style)), but not all methods are supported; for example, you must [append](https://github.com/d3/d3-selection#selection_append) elements or [bind data](https://github.com/d3/d3-selection#joining-data) before a transition starts. A [*transition*.remove](#transition_remove) operator is provided for convenient removal of elements when the transition ends. + +To compute intermediate state, transitions leverage a variety of [built-in interpolators](https://github.com/d3/d3-interpolate). [Colors](https://github.com/d3/d3-interpolate#interpolateRgb), [numbers](https://github.com/d3/d3-interpolate#interpolateNumber), and [transforms](https://github.com/d3/d3-interpolate#interpolateTransform) are automatically detected. [Strings](https://github.com/d3/d3-interpolate#interpolateString) with embedded numbers are also detected, as is common with many styles (such as padding or font sizes) and paths. To specify a custom interpolator, use [*transition*.attrTween](#transition_attrTween), [*transition*.styleTween](#transition_styleTween) or [*transition*.tween](#transition_tween). + +## Installing + +If you use NPM, `npm install d3-transition`. Otherwise, download the [latest release](https://github.com/d3/d3-transition/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-transition.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + + + + + + +``` + +[Try d3-transition in your browser.](https://tonicdev.com/npm/d3-transition) + +## API Reference + +* [Selecting Elements](#selecting-elements) +* [Modifying Elements](#modifying-elements) +* [Timing](#timing) +* [Control Flow](#control-flow) +* [The Life of a Transition](#the-life-of-a-transition) + +### Selecting Elements + +Transitions are derived from [selections](https://github.com/d3/d3-selection) via [*selection*.transition](#selection_transition). You can also create a transition on the document root element using [d3.transition](#transition). + +# selection.transition([name]) · [Source](https://github.com/d3/d3-transition/blob/master/src/selection/transition.js) + +Returns a new transition on the given *selection* with the specified *name*. If a *name* is not specified, null is used. The new transition is only exclusive with other transitions of the same name. + +If the *name* is a [transition](#transition) instance, the returned transition has the same id and name as the specified transition. If a transition with the same id already exists on a selected element, the existing transition is returned for that element. Otherwise, the timing of the returned transition is inherited from the existing transition of the same id on the nearest ancestor of each selected element. Thus, this method can be used to synchronize a transition across multiple selections, or to re-select a transition for specific elements and modify its configuration. For example: + +```js +var t = d3.transition() + .duration(750) + .ease(d3.easeLinear); + +d3.selectAll(".apple").transition(t) + .style("fill", "red"); + +d3.selectAll(".orange").transition(t) + .style("fill", "orange"); +``` + +If the specified *transition* is not found on a selected node or its ancestors (such as if the transition [already ended](#the-life-of-a-transition)), the default timing parameters are used; however, in a future release, this will likely be changed to throw an error. See [#59](https://github.com/d3/d3-transition/issues/59). + +# selection.interrupt([name]) · [Source](https://github.com/d3/d3-transition/blob/master/src/selection/interrupt.js) + +Interrupts the active transition of the specified *name* on the selected elements, and cancels any pending transitions with the specified *name*, if any. If a name is not specified, null is used. + +Interrupting a transition on an element has no effect on any transitions on any descendant elements. For example, an [axis transition](https://github.com/d3/d3-axis) consists of multiple independent, synchronized transitions on the descendants of the axis [G element](https://www.w3.org/TR/SVG/struct.html#Groups) (the tick lines, the tick labels, the domain path, *etc.*). To interrupt the axis transition, you must therefore interrupt the descendants: + +```js +selection.selectAll("*").interrupt(); +``` + +The [universal selector](https://developer.mozilla.org/en-US/docs/Web/CSS/Universal_selectors), `*`, selects all descendant elements. If you also want to interrupt the G element itself: + +```js +selection.interrupt().selectAll("*").interrupt(); +``` + +# d3.interrupt(node[, name]) · [Source](https://github.com/d3/d3-transition/blob/master/src/interrupt.js) + +Interrupts the active transition of the specified *name* on the specified *node*, and cancels any pending transitions with the specified *name*, if any. If a name is not specified, null is used. See also [*selection*.interrupt](#selection_interrupt). + +# d3.transition([name]) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/index.js#L29) + +Returns a new transition on the root element, `document.documentElement`, with the specified *name*. If a *name* is not specified, null is used. The new transition is only exclusive with other transitions of the same name. The *name* may also be a [transition](#transition) instance; see [*selection*.transition](#selection_transition). This method is equivalent to: + +```js +d3.selection() + .transition(name) +``` + +This function can also be used to test for transitions (`instanceof d3.transition`) or to extend the transition prototype. + +# transition.select(selector) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/select.js) + +For each selected element, selects the first descendant element that matches the specified *selector* string, if any, and returns a transition on the resulting selection. The *selector* may be specified either as a selector string or a function. If a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. The new transition has the same id, name and timing as this transition; however, if a transition with the same id already exists on a selected element, the existing transition is returned for that element. + +This method is equivalent to deriving the selection for this transition via [*transition*.selection](#transition_selection), creating a subselection via [*selection*.select](https://github.com/d3/d3-selection#selection_select), and then creating a new transition via [*selection*.transition](#selection_transition): + +```js +transition + .selection() + .select(selector) + .transition(transition) +``` + +# transition.selectAll(selector) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/selectAll.js) + +For each selected element, selects all descendant elements that match the specified *selector* string, if any, and returns a transition on the resulting selection. The *selector* may be specified either as a selector string or a function. If a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. The new transition has the same id, name and timing as this transition; however, if a transition with the same id already exists on a selected element, the existing transition is returned for that element. + +This method is equivalent to deriving the selection for this transition via [*transition*.selection](#transition_selection), creating a subselection via [*selection*.selectAll](https://github.com/d3/d3-selection#selection_selectAll), and then creating a new transition via [*selection*.transition](#selection_transition): + +```js +transition + .selection() + .selectAll(selector) + .transition(transition) +``` + +# transition.filter(filter) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/filter.js) + +For each selected element, selects only the elements that match the specified *filter*, and returns a transition on the resulting selection. The *filter* may be specified either as a selector string or a function. If a function, it is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. The new transition has the same id, name and timing as this transition; however, if a transition with the same id already exists on a selected element, the existing transition is returned for that element. + +This method is equivalent to deriving the selection for this transition via [*transition*.selection](#transition_selection), creating a subselection via [*selection*.filter](https://github.com/d3/d3-selection#selection_filter), and then creating a new transition via [*selection*.transition](#selection_transition): + +```js +transition + .selection() + .filter(filter) + .transition(transition) +``` + +# transition.merge(other) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/merge.js) + +Returns a new transition merging this transition with the specified *other* transition, which must have the same id as this transition. The returned transition has the same number of groups, the same parents, the same name and the same id as this transition. Any missing (null) elements in this transition are filled with the corresponding element, if present (not null), from the *other* transition. + +This method is equivalent to deriving the selection for this transition via [*transition*.selection](#transition_selection), merging with the selection likewise derived from the *other* transition via [*selection*.merge](https://github.com/d3/d3-selection#selection_merge), and then creating a new transition via [*selection*.transition](#selection_transition): + +```js +transition + .selection() + .merge(other.selection()) + .transition(transition) +``` + +# transition.transition() · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/transition.js) + +Returns a new transition on the same selected elements as this transition, scheduled to start when this transition ends. The new transition inherits a reference time equal to this transition’s time plus its [delay](#transition_delay) and [duration](#transition_duration). The new transition also inherits this transition’s name, duration, and [easing](#transition_ease). This method can be used to schedule a sequence of chained transitions. For example: + +```js +d3.selectAll(".apple") + .transition() // First fade to green. + .style("fill", "green") + .transition() // Then red. + .style("fill", "red") + .transition() // Wait one second. Then brown, and remove. + .delay(1000) + .style("fill", "brown") + .remove(); +``` + +The delay for each transition is relative to its previous transition. Thus, in the above example, apples will stay red for one second before the last transition to brown starts. + +# transition.selection() · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/selection.js) + +Returns the [selection](https://github.com/d3/d3-selection#selection) corresponding to this transition. + +# d3.active(node[, name]) · [Source](https://github.com/d3/d3-transition/blob/master/src/active.js) + +Returns the active transition on the specified *node* with the specified *name*, if any. If no *name* is specified, null is used. Returns null if there is no such active transition on the specified node. This method is useful for creating chained transitions. For example, to initiate disco mode: + +```js +d3.selectAll("circle").transition() + .delay(function(d, i) { return i * 50; }) + .on("start", function repeat() { + d3.active(this) + .style("fill", "red") + .transition() + .style("fill", "green") + .transition() + .style("fill", "blue") + .transition() + .on("start", repeat); + }); +``` + +See [chained transitions](https://bl.ocks.org/mbostock/70d5541b547cc222aa02) for an example. + +### Modifying Elements + +After selecting elements and creating a transition with [*selection*.transition](#selection_transition), use the transition’s transformation methods to affect document content. + +# transition.attr(name, value) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/attr.js) + +For each selected element, assigns the [attribute tween](#transition_attrTween) for the attribute with the specified *name* to the specified target *value*. The starting value of the tween is the attribute’s value when the transition starts. The target *value* may be specified either as a constant or a function. If a function, it is immediately evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. + +If the target value is null, the attribute is removed when the transition starts. Otherwise, an interpolator is chosen based on the type of the target value, using the following algorithm: + +1. If *value* is a number, use [interpolateNumber](https://github.com/d3/d3-interpolate#interpolateNumber). +2. If *value* is a [color](https://github.com/d3/d3-color#color) or a string coercible to a color, use [interpolateRgb](https://github.com/d3/d3-interpolate#interpolateRgb). +3. Use [interpolateString](https://github.com/d3/d3-interpolate#interpolateString). + +To apply a different interpolator, use [*transition*.attrTween](#transition_attrTween). + +# transition.attrTween(name[, factory]) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/attrTween.js) + +If *factory* is specified and not null, assigns the attribute [tween](#transition_tween) for the attribute with the specified *name* to the specified interpolator *factory*. An interpolator factory is a function that returns an [interpolator](https://github.com/d3/d3-interpolate); when the transition starts, the *factory* is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. The returned interpolator will then be invoked for each frame of the transition, in order, being passed the [eased](#transition_ease) time *t*, typically in the range [0, 1]. Lastly, the return value of the interpolator will be used to set the attribute value. The interpolator must return a string. (To remove an attribute at the start of a transition, use [*transition*.attr](#transition_attr); to remove an attribute at the end of a transition, use [*transition*.on](#transition_on) to listen for the *end* event.) + +If the specified *factory* is null, removes the previously-assigned attribute tween of the specified *name*, if any. If *factory* is not specified, returns the current interpolator factory for attribute with the specified *name*, or undefined if no such tween exists. + +For example, to interpolate the fill attribute from red to blue: + +```js +transition.attrTween("fill", function() { + return d3.interpolateRgb("red", "blue"); +}); +``` + +Or to interpolate from the current fill to blue, like [*transition*.attr](#transition_attr): + +```js +transition.attrTween("fill", function() { + return d3.interpolateRgb(this.getAttribute("fill"), "blue"); +}); +``` + +Or to apply a custom rainbow interpolator: + +```js +transition.attrTween("fill", function() { + return function(t) { + return "hsl(" + t * 360 + ",100%,50%)"; + }; +}); +``` + +This method is useful to specify a custom interpolator, such as one that understands [SVG paths](https://bl.ocks.org/mbostock/3916621). A useful technique is *data interpolation*, where [d3.interpolateObject](https://github.com/d3/d3-interpolate#interpolateObject) is used to interpolate two data values, and the resulting value is then used (say, with a [shape](https://github.com/d3/d3-shape)) to compute the new attribute value. + +# transition.style(name, value[, priority]) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/style.js) + +For each selected element, assigns the [style tween](#transition_styleTween) for the style with the specified *name* to the specified target *value* with the specified *priority*. The starting value of the tween is the style’s inline value if present, and otherwise its computed value, when the transition starts. The target *value* may be specified either as a constant or a function. If a function, it is immediately evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. + +If the target value is null, the style is removed when the transition starts. Otherwise, an interpolator is chosen based on the type of the target value, using the following algorithm: + +1. If *value* is a number, use [interpolateNumber](https://github.com/d3/d3-interpolate#interpolateNumber). +2. If *value* is a [color](https://github.com/d3/d3-color#color) or a string coercible to a color, use [interpolateRgb](https://github.com/d3/d3-interpolate#interpolateRgb). +3. Use [interpolateString](https://github.com/d3/d3-interpolate#interpolateString). + +To apply a different interpolator, use [*transition*.styleTween](#transition_styleTween). + +# transition.styleTween(name[, factory[, priority]])) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/styleTween.js) + +If *factory* is specified and not null, assigns the style [tween](#transition_tween) for the style with the specified *name* to the specified interpolator *factory*. An interpolator factory is a function that returns an [interpolator](https://github.com/d3/d3-interpolate); when the transition starts, the *factory* is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. The returned interpolator will then be invoked for each frame of the transition, in order, being passed the [eased](#transition_ease) time *t*, typically in the range [0, 1]. Lastly, the return value of the interpolator will be used to set the style value with the specified *priority*. The interpolator must return a string. (To remove an style at the start of a transition, use [*transition*.style](#transition_style); to remove an style at the end of a transition, use [*transition*.on](#transition_on) to listen for the *end* event.) + +If the specified *factory* is null, removes the previously-assigned style tween of the specified *name*, if any. If *factory* is not specified, returns the current interpolator factory for style with the specified *name*, or undefined if no such tween exists. + +For example, to interpolate the fill style from red to blue: + +```js +transition.styleTween("fill", function() { + return d3.interpolateRgb("red", "blue"); +}); +``` + +Or to interpolate from the current fill to blue, like [*transition*.style](#transition_style): + +```js +transition.styleTween("fill", function() { + return d3.interpolateRgb(this.style.fill, "blue"); +}); +``` + +Or to apply a custom rainbow interpolator: + +```js +transition.styleTween("fill", function() { + return function(t) { + return "hsl(" + t * 360 + ",100%,50%)"; + }; +}); +``` + +This method is useful to specify a custom interpolator, such as with *data interpolation*, where [d3.interpolateObject](https://github.com/d3/d3-interpolate#interpolateObject) is used to interpolate two data values, and the resulting value is then used to compute the new style value. + +# transition.text(value) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/text.js) + +For each selected element, sets the [text content](http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent) to the specified target *value* when the transition starts. The *value* may be specified either as a constant or a function. If a function, it is immediately evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. The function’s return value is then used to set each element’s text content. A null value will clear the content. + +To interpolate text rather than to set it on start, use [*transition*.textTween](#transition_textTween) or append a replacement element and cross-fade opacity. Text is not interpolated by default because it is usually undesirable. + +# transition.textTween(factory) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/textTween.js), [Examples](https://observablehq.com/@d3/transition-texttween) + +If *factory* is specified and not null, assigns the text [tween](#transition_tween) to the specified interpolator *factory*. An interpolator factory is a function that returns an [interpolator](https://github.com/d3/d3-interpolate); when the transition starts, the *factory* is evaluated for each selected element, in order, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. The returned interpolator will then be invoked for each frame of the transition, in order, being passed the [eased](#transition_ease) time *t*, typically in the range [0, 1]. Lastly, the return value of the interpolator will be used to set the text. The interpolator must return a string. + +For example, to interpolate the text with integers from 0 to 100: + +```js +transition.textTween(function() { + return d3.interpolateRound(0, 100); +}); +``` + +If the specified *factory* is null, removes the previously-assigned text tween, if any. If *factory* is not specified, returns the current interpolator factory for text, or undefined if no such tween exists. + +# transition.remove() · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/remove.js) + +For each selected element, [removes](https://github.com/d3/d3-selection#selection_remove) the element when the transition ends, as long as the element has no other active or pending transitions. If the element has other active or pending transitions, does nothing. + +# transition.tween(name[, value]) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/tween.js) + +For each selected element, assigns the tween with the specified *name* with the specified *value* function. The *value* must be specified as a function that returns a function. When the transition starts, the *value* function is evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. The returned function is then invoked for each frame of the transition, in order, being passed the [eased](#transition_ease) time *t*, typically in the range [0, 1]. If the specified *value* is null, removes the previously-assigned tween of the specified *name*, if any. + +For example, to interpolate the fill attribute to blue, like [*transition*.attr](#transition_attr): + +```js +transition.tween("attr.fill", function() { + var i = d3.interpolateRgb(this.getAttribute("fill"), "blue"); + return function(t) { + this.setAttribute("fill", i(t)); + }; +}); +``` + +This method is useful to specify a custom interpolator, or to perform side-effects, say to animate the [scroll offset](https://bl.ocks.org/mbostock/1649463). + +### Timing + +The [easing](#transition_ease), [delay](#transition_delay) and [duration](#transition_duration) of a transition is configurable. For example, a per-element delay can be used to [stagger the reordering](https://observablehq.com/@d3/sortable-bar-chart) of elements, improving perception. See [Animated Transitions in Statistical Data Graphics](http://vis.berkeley.edu/papers/animated_transitions/) for recommendations. + +# transition.delay([value]) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/delay.js) + +For each selected element, sets the transition delay to the specified *value* in milliseconds. The *value* may be specified either as a constant or a function. If a function, it is immediately evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. The function’s return value is then used to set each element’s transition delay. If a delay is not specified, it defaults to zero. + +If a *value* is not specified, returns the current value of the delay for the first (non-null) element in the transition. This is generally useful only if you know that the transition contains exactly one element. + +Setting the delay to a multiple of the index `i` is a convenient way to stagger transitions across a set of elements. For example: + +```js +transition.delay(function(d, i) { return i * 10; }); +``` + +Of course, you can also compute the delay as a function of the data, or [sort the selection](https://github.com/d3/d3-selection#selection_sort) before computed an index-based delay. + +# transition.duration([value]) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/duration.js) + +For each selected element, sets the transition duration to the specified *value* in milliseconds. The *value* may be specified either as a constant or a function. If a function, it is immediately evaluated for each selected element, in order, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. The function’s return value is then used to set each element’s transition duration. If a duration is not specified, it defaults to 250ms. + +If a *value* is not specified, returns the current value of the duration for the first (non-null) element in the transition. This is generally useful only if you know that the transition contains exactly one element. + +# transition.ease([value]) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/ease.js) + +Specifies the transition [easing function](https://github.com/d3/d3-ease) for all selected elements. The *value* must be specified as a function. The easing function is invoked for each frame of the animation, being passed the normalized time *t* in the range [0, 1]; it must then return the eased time *tʹ* which is typically also in the range [0, 1]. A good easing function should return 0 if *t* = 0 and 1 if *t* = 1. If an easing function is not specified, it defaults to [d3.easeCubic](https://github.com/d3/d3-ease#easeCubic). + +If a *value* is not specified, returns the current easing function for the first (non-null) element in the transition. This is generally useful only if you know that the transition contains exactly one element. + +# transition.easeVarying(factory) [<>](https://github.com/d3/d3-transition/blob/master/src/transition/easeVarying.js "Source") + +Specifies a factory for the transition [easing function](https://github.com/d3/d3-ease). The *factory* must be a function. It is invoked for each node of the selection, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. It must return an easing function. + +### Control Flow + +For advanced usage, transitions provide methods for custom control flow. + +# transition.end() · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/end.js) + +Returns a promise that resolves when every selected element finishes transitioning. If any element’s transition is cancelled or interrupted, the promise rejects. + +# transition.on(typenames[, listener]) · [Source](https://github.com/d3/d3-transition/blob/master/src/transition/on.js) + +Adds or removes a *listener* to each selected element for the specified event *typenames*. The *typenames* is one of the following string event types: + +* `start` - when the transition starts. +* `end` - when the transition ends. +* `interrupt` - when the transition is interrupted. +* `cancel` - when the transition is cancelled. + +See [The Life of a Transition](#the-life-of-a-transition) for more. Note that these are *not* native DOM events as implemented by [*selection*.on](https://github.com/d3/d3-selection#selection_on) and [*selection*.dispatch](https://github.com/d3/d3-selection#selection_dispatch), but transition events! + +The type may be optionally followed by a period (`.`) and a name; the optional name allows multiple callbacks to be registered to receive events of the same type, such as `start.foo` and `start.bar`. To specify multiple typenames, separate typenames with spaces, such as `interrupt end` or `start.foo start.bar`. + +When a specified transition event is dispatched on a selected node, the specified *listener* will be invoked for the transitioning element, being passed the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. Listeners always see the latest datum for their element, but the index is a property of the selection and is fixed when the listener is assigned; to update the index, re-assign the listener. + +If an event listener was previously registered for the same *typename* on a selected element, the old listener is removed before the new listener is added. To remove a listener, pass null as the *listener*. To remove all listeners for a given name, pass null as the *listener* and `.foo` as the *typename*, where `foo` is the name; to remove all listeners with no name, specify `.` as the *typename*. + +If a *listener* is not specified, returns the currently-assigned listener for the specified event *typename* on the first (non-null) selected element, if any. If multiple typenames are specified, the first matching listener is returned. + +# transition.each(function) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/each.js) + +Invokes the specified *function* for each selected element, passing in the current datum (*d*), the current index (*i*), and the current group (*nodes*), with *this* as the current DOM element. This method can be used to invoke arbitrary code for each selected element, and is useful for creating a context to access parent and child data simultaneously. Equivalent to [*selection*.each](https://github.com/d3/d3-selection#selection_each). + +# transition.call(function[, arguments…]) · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/call.js) + +Invokes the specified *function* exactly once, passing in this transition along with any optional *arguments*. Returns this transition. This is equivalent to invoking the function by hand but facilitates method chaining. For example, to set several attributes in a reusable function: + +```js +function color(transition, fill, stroke) { + transition + .style("fill", fill) + .style("stroke", stroke); +} +``` + +Now say: + +```js +d3.selectAll("div").transition().call(color, "red", "blue"); +``` + +This is equivalent to: + +```js +color(d3.selectAll("div").transition(), "red", "blue"); +``` + +Equivalent to [*selection*.call](https://github.com/d3/d3-selection#selection_call). + +# transition.empty() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/empty.js) + +Returns true if this transition contains no (non-null) elements. Equivalent to [*selection*.empty](https://github.com/d3/d3-selection#selection_empty). + +# transition.nodes() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/nodes.js) + +Returns an array of all (non-null) elements in this transition. Equivalent to [*selection*.nodes](https://github.com/d3/d3-selection#selection_nodes). + +# transition.node() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/node.js) + +Returns the first (non-null) element in this transition. If the transition is empty, returns null. Equivalent to [*selection*.node](https://github.com/d3/d3-selection#selection_node). + +# transition.size() · [Source](https://github.com/d3/d3-selection/blob/master/src/selection/size.js) + +Returns the total number of elements in this transition. Equivalent to [*selection*.size](https://github.com/d3/d3-selection#selection_size). + +### The Life of a Transition + +Immediately after creating a transition, such as by [*selection*.transition](#selection_transition) or [*transition*.transition](#transition_transition), you may configure the transition using methods such as [*transition*.delay](#transition_delay), [*transition*.duration](#transition_duration), [*transition*.attr](#transition_attr) and [*transition*.style](#transition_style). Methods that specify target values (such as *transition*.attr) are evaluated synchronously; however, methods that require the starting value for interpolation, such as [*transition*.attrTween](#transition_attrTween) and [*transition*.styleTween](#transition_styleTween), must be deferred until the transition starts. + +Shortly after creation, either at the end of the current frame or during the next frame, the transition is scheduled. At this point, the delay and `start` event listeners may no longer be changed; attempting to do so throws an error with the message “too late: already scheduled†(or if the transition has ended, “transition not foundâ€). + +When the transition subsequently starts, it interrupts the active transition of the same name on the same element, if any, dispatching an `interrupt` event to registered listeners. (Note that interrupts happen on start, not creation, and thus even a zero-delay transition will not immediately interrupt the active transition: the old transition is given a final frame. Use [*selection*.interrupt](#selection_interrupt) to interrupt immediately.) The starting transition also cancels any pending transitions of the same name on the same element that were created before the starting transition. The transition then dispatches a `start` event to registered listeners. This is the last moment at which the transition may be modified: the transition’s timing, tweens, and listeners may not be changed when it is running; attempting to do so throws an error with the message “too late: already running†(or if the transition has ended, “transition not foundâ€). The transition initializes its tweens immediately after starting. + +During the frame the transition starts, but *after* all transitions starting this frame have been started, the transition invokes its tweens for the first time. Batching tween initialization, which typically involves reading from the DOM, improves performance by avoiding interleaved DOM reads and writes. + +For each frame that a transition is active, it invokes its tweens with an [eased](#transition_ease) *t*-value ranging from 0 to 1. Within each frame, the transition invokes its tweens in the order they were registered. + +When a transition ends, it invokes its tweens a final time with a (non-eased) *t*-value of 1. It then dispatches an `end` event to registered listeners. This is the last moment at which the transition may be inspected: after ending, the transition is deleted from the element, and its configuration is destroyed. (A transition’s configuration is also destroyed on interrupt or cancel.) Attempting to inspect a transition after it is destroyed throws an error with the message “transition not foundâ€. diff --git a/node_modules/d3-transition/dist/d3-transition.js b/node_modules/d3-transition/dist/d3-transition.js new file mode 100644 index 00000000..0628d87b --- /dev/null +++ b/node_modules/d3-transition/dist/d3-transition.js @@ -0,0 +1,898 @@ +// https://d3js.org/d3-transition/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-dispatch'), require('d3-timer'), require('d3-interpolate'), require('d3-color'), require('d3-ease')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-timer', 'd3-interpolate', 'd3-color', 'd3-ease'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3)); +}(this, function (exports, d3Selection, d3Dispatch, d3Timer, d3Interpolate, d3Color, d3Ease) { 'use strict'; + +var emptyOn = d3Dispatch.dispatch("start", "end", "cancel", "interrupt"); +var emptyTween = []; + +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; + +function schedule(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +} + +function init(node, id) { + var schedule = get(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; +} + +function set(node, id) { + var schedule = get(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; +} + +function get(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + return schedule; +} + +function create(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = d3Timer.timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return d3Timer.timeout(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + d3Timer.timeout(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } +} + +function interrupt(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { empty = false; continue; } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; +} + +function selection_interrupt(name) { + return this.each(function() { + interrupt(this, name); + }); +} + +function tweenRemove(id, name) { + var tween0, tween1; + return function() { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; +} + +function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function() { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; +} + +function transition_tween(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = get(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); +} + +function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function() { + var schedule = set(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function(node) { + return get(node, id).value[name]; + }; +} + +function interpolate(a, b) { + var c; + return (typeof b === "number" ? d3Interpolate.interpolateNumber + : b instanceof d3Color.color ? d3Interpolate.interpolateRgb + : (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb) + : d3Interpolate.interpolateString)(a, b); +} + +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrConstantNS(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function attrFunctionNS(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function transition_attr(name, value) { + var fullname = d3Selection.namespace(name), i = fullname === "transform" ? d3Interpolate.interpolateTransformSvg : interpolate; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) + : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); +} + +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i.call(this, t)); + }; +} + +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; +} + +function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; +} + +function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; +} + +function transition_attrTween(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = d3Selection.namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +} + +function delayFunction(id, value) { + return function() { + init(this, id).delay = +value.apply(this, arguments); + }; +} + +function delayConstant(id, value) { + return value = +value, function() { + init(this, id).delay = value; + }; +} + +function transition_delay(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get(this.node(), id).delay; +} + +function durationFunction(id, value) { + return function() { + set(this, id).duration = +value.apply(this, arguments); + }; +} + +function durationConstant(id, value) { + return value = +value, function() { + set(this, id).duration = value; + }; +} + +function transition_duration(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get(this.node(), id).duration; +} + +function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function() { + set(this, id).ease = value; + }; +} + +function transition_ease(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get(this.node(), id).ease; +} + +function easeVarying(id, value) { + return function() { + var v = value.apply(this, arguments); + if (typeof v !== "function") throw new Error; + set(this, id).ease = v; + }; +} + +function transition_easeVarying(value) { + if (typeof value !== "function") throw new Error; + return this.each(easeVarying(this._id, value)); +} + +function transition_filter(match) { + if (typeof match !== "function") match = d3Selection.matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); +} + +function transition_merge(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Transition(merges, this._parents, this._name, this._id); +} + +function start(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); +} + +function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : set; + return function() { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; +} + +function transition_on(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); +} + +function removeFunction(id) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; +} + +function transition_remove() { + return this.on("end.remove", removeFunction(this._id)); +} + +function transition_select(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = d3Selection.selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); +} + +function transition_selectAll(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = d3Selection.selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); +} + +var Selection = d3Selection.selection.prototype.constructor; + +function transition_selection() { + return new Selection(this._groups, this._parents); +} + +function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function() { + var string0 = d3Selection.style(this, name), + string1 = (this.style.removeProperty(name), d3Selection.style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} + +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = d3Selection.style(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function styleFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0 = d3Selection.style(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), d3Selection.style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function() { + var schedule = set(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; +} + +function transition_style(name, value, priority) { + var i = (name += "") === "transform" ? d3Interpolate.interpolateTransformCss : interpolate; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, styleRemove(name)) + : typeof value === "function" ? this + .styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, styleConstant(name, i, value), priority) + .on("end.style." + name, null); +} + +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i.call(this, t), priority); + }; +} + +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; +} + +function transition_styleTween(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +} + +function textConstant(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} + +function transition_text(value) { + return this.tween("text", typeof value === "function" + ? textFunction(tweenValue(this, "text", value)) + : textConstant(value == null ? "" : value + "")); +} + +function textInterpolate(i) { + return function(t) { + this.textContent = i.call(this, t); + }; +} + +function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } + tween._value = value; + return tween; +} + +function transition_textTween(value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, textTween(value)); +} + +function transition_transition() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } + } + } + + return new Transition(groups, this._parents, name, id1); +} + +function transition_end() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = {value: reject}, + end = {value: function() { if (--size === 0) resolve(); }}; + + that.each(function() { + var schedule = set(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + + // The selection was empty, resolve end immediately + if (size === 0) resolve(); + }); +} + +var id = 0; + +function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; +} + +function transition(name) { + return d3Selection.selection().transition(name); +} + +function newId() { + return ++id; +} + +var selection_prototype = d3Selection.selection.prototype; + +Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + easeVarying: transition_easeVarying, + end: transition_end, + [Symbol.iterator]: selection_prototype[Symbol.iterator] +}; + +var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: d3Ease.easeCubicInOut +}; + +function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + throw new Error(`transition ${id} not found`); + } + } + return timing; +} + +function selection_transition(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); +} + +d3Selection.selection.prototype.interrupt = selection_interrupt; +d3Selection.selection.prototype.transition = selection_transition; + +var root = [null]; + +function active(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root, name, +i); + } + } + } + + return null; +} + +exports.active = active; +exports.interrupt = interrupt; +exports.transition = transition; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/d3-transition/dist/d3-transition.min.js b/node_modules/d3-transition/dist/d3-transition.min.js new file mode 100644 index 00000000..b4fd717e --- /dev/null +++ b/node_modules/d3-transition/dist/d3-transition.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-transition/ v2.0.0 Copyright 2020 Mike Bostock +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("d3-selection"),require("d3-dispatch"),require("d3-timer"),require("d3-interpolate"),require("d3-color"),require("d3-ease")):"function"==typeof define&&define.amd?define(["exports","d3-selection","d3-dispatch","d3-timer","d3-interpolate","d3-color","d3-ease"],n):n((t=t||self).d3=t.d3||{},t.d3,t.d3,t.d3,t.d3,t.d3,t.d3)}(this,function(t,n,e,r,i,o,u){"use strict";var a=e.dispatch("start","end","cancel","interrupt"),s=[],l=0,f=1,c=2,h=3,d=4,p=5,_=6;function v(t,n,e,i,o,u){var v=t.__transition;if(v){if(e in v)return}else t.__transition={};!function(t,n,e){var i,o=t.__transition;function u(l){var p,v,y,m;if(e.state!==f)return s();for(p in o)if((m=o[p]).name===e.name){if(m.state===h)return r.timeout(u);m.state===d?(m.state=_,m.timer.stop(),m.on.call("interrupt",t,t.__data__,m.index,m.group),delete o[p]):+pl)throw new Error("too late; already scheduled");return e}function m(t,n){var e=w(t,n);if(e.state>h)throw new Error("too late; already running");return e}function w(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function g(t,n){var e,r,i,o=t.__transition,u=!0;if(o){for(i in n=null==n?null:n+"",o)(e=o[i]).name===n?(r=e.state>c&&e.state=0&&(t=t.slice(0,n)),!t||"start"===t})}(n)?y:m;return function(){var u=o(this,t),a=u.on;a!==r&&(i=(r=a).copy()).on(n,e),u.on=i}}(e,t,n))},attr:function(t,e){var r=n.namespace(t),o="transform"===r?i.interpolateTransformSvg:x;return this.attrTween(t,"function"==typeof e?(r.local?function(t,n,e){var r,i,o;return function(){var u,a,s=e(this);if(null!=s)return(u=this.getAttributeNS(t.space,t.local))===(a=s+"")?null:u===r&&a===i?o:(i=a,o=n(r=u,s));this.removeAttributeNS(t.space,t.local)}}:function(t,n,e){var r,i,o;return function(){var u,a,s=e(this);if(null!=s)return(u=this.getAttribute(t))===(a=s+"")?null:u===r&&a===i?o:(i=a,o=n(r=u,s));this.removeAttribute(t)}})(r,o,b(this,"attr."+t,e)):null==e?(r.local?function(t){return function(){this.removeAttributeNS(t.space,t.local)}}:function(t){return function(){this.removeAttribute(t)}})(r):(r.local?function(t,n,e){var r,i,o=e+"";return function(){var u=this.getAttributeNS(t.space,t.local);return u===o?null:u===r?i:i=n(r=u,e)}}:function(t,n,e){var r,i,o=e+"";return function(){var u=this.getAttribute(t);return u===o?null:u===r?i:i=n(r=u,e)}})(r,o,e))},attrTween:function(t,e){var r="attr."+t;if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==e)return this.tween(r,null);if("function"!=typeof e)throw new Error;var i=n.namespace(t);return this.tween(r,(i.local?function(t,n){var e,r;function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&function(t,n){return function(e){this.setAttributeNS(t.space,t.local,n.call(this,e))}}(t,i)),e}return i._value=n,i}:function(t,n){var e,r;function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&function(t,n){return function(e){this.setAttribute(t,n.call(this,e))}}(t,i)),e}return i._value=n,i})(i,e))},style:function(t,e,r){var o="transform"==(t+="")?i.interpolateTransformCss:x;return null==e?this.styleTween(t,function(t,e){var r,i,o;return function(){var u=n.style(this,t),a=(this.style.removeProperty(t),n.style(this,t));return u===a?null:u===r&&a===i?o:o=e(r=u,i=a)}}(t,o)).on("end.style."+t,E(t)):"function"==typeof e?this.styleTween(t,function(t,e,r){var i,o,u;return function(){var a=n.style(this,t),s=r(this),l=s+"";return null==s&&(this.style.removeProperty(t),l=s=n.style(this,t)),a===l?null:a===i&&l===o?u:(o=l,u=e(i=a,s))}}(t,o,b(this,"style."+t,e))).each(function(t,n){var e,r,i,o,u="style."+n,a="end."+u;return function(){var s=m(this,t),l=s.on,f=null==s.value[u]?o||(o=E(n)):void 0;l===e&&i===f||(r=(e=l).copy()).on(a,i=f),s.on=r}}(this._id,t)):this.styleTween(t,function(t,e,r){var i,o,u=r+"";return function(){var a=n.style(this,t);return a===u?null:a===i?o:o=e(i=a,r)}}(t,o,e),r).on("end.style."+t,null)},styleTween:function(t,n,e){var r="style."+(t+="");if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==n)return this.tween(r,null);if("function"!=typeof n)throw new Error;return this.tween(r,function(t,n,e){var r,i;function o(){var o=n.apply(this,arguments);return o!==i&&(r=(i=o)&&function(t,n,e){return function(r){this.style.setProperty(t,n.call(this,r),e)}}(t,o,e)),r}return o._value=n,o}(t,n,null==e?"":e))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var n=t(this);this.textContent=null==n?"":n}}(b(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var n="text";if(arguments.length<1)return(n=this.tween(n))&&n._value;if(null==t)return this.tween(n,null);if("function"!=typeof t)throw new Error;return this.tween(n,function(t){var n,e;function r(){var r=t.apply(this,arguments);return r!==e&&(n=(e=r)&&function(t){return function(n){this.textContent=t.call(this,n)}}(r)),n}return r._value=t,r}(t))},remove:function(){return this.on("end.remove",function(t){return function(){var n=this.parentNode;for(var e in this.__transition)if(+e!==t)return;n&&n.removeChild(this)}}(this._id))},tween:function(t,n){var e=this._id;if(t+="",arguments.length<2){for(var r,i=w(this.node(),e).tween,o=0,u=i.length;of&&e.name===n)return new T([[t]],O,n,+r);return null},t.interrupt=g,t.transition=N,Object.defineProperty(t,"__esModule",{value:!0})}); diff --git a/node_modules/d3-transition/package.json b/node_modules/d3-transition/package.json new file mode 100644 index 00000000..4c6b724d --- /dev/null +++ b/node_modules/d3-transition/package.json @@ -0,0 +1,85 @@ +{ + "_from": "d3-transition@2", + "_id": "d3-transition@2.0.0", + "_inBundle": false, + "_integrity": "sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==", + "_location": "/d3-transition", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "d3-transition@2", + "name": "d3-transition", + "escapedName": "d3-transition", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/d3", + "/d3-brush", + "/d3-zoom" + ], + "_resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-2.0.0.tgz", + "_shasum": "366ef70c22ef88d1e34105f507516991a291c94c", + "_spec": "d3-transition@2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3", + "author": { + "name": "Mike Bostock", + "url": "https://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3-transition/issues" + }, + "bundleDependencies": false, + "dependencies": { + "d3-color": "1 - 2", + "d3-dispatch": "1 - 2", + "d3-ease": "1 - 2", + "d3-interpolate": "1 - 2", + "d3-timer": "1 - 2" + }, + "deprecated": false, + "description": "Animated transitions for D3 selections.", + "devDependencies": { + "d3-selection": "2", + "eslint": "6", + "jsdom": "15", + "rollup": "1", + "rollup-plugin-terser": "5", + "tape": "4" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://d3js.org/d3-transition/", + "jsdelivr": "dist/d3-transition.min.js", + "keywords": [ + "d3", + "d3-module", + "dom", + "transition", + "animation" + ], + "license": "BSD-3-Clause", + "main": "dist/d3-transition.js", + "module": "src/index.js", + "name": "d3-transition", + "peerDependencies": { + "d3-selection": "2" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3-transition.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../${npm_package_name}/dist/${npm_package_name}.js ${npm_package_name}.v${npm_package_version%%.*}.js && cp ../${npm_package_name}/dist/${npm_package_name}.min.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git add ${npm_package_name}.v${npm_package_version%%.*}.js ${npm_package_name}.v${npm_package_version%%.*}.min.js && git commit -m \"${npm_package_name} ${npm_package_version}\" && git push && cd - && zip -j dist/${npm_package_name}.zip -- LICENSE README.md dist/${npm_package_name}.js dist/${npm_package_name}.min.js", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape 'test/**/*-test.js' && eslint src" + }, + "sideEffects": true, + "unpkg": "dist/d3-transition.min.js", + "version": "2.0.0" +} diff --git a/node_modules/d3-transition/src/active.js b/node_modules/d3-transition/src/active.js new file mode 100644 index 00000000..abd4c67e --- /dev/null +++ b/node_modules/d3-transition/src/active.js @@ -0,0 +1,21 @@ +import {Transition} from "./transition/index.js"; +import {SCHEDULED} from "./transition/schedule.js"; + +var root = [null]; + +export default function(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root, name, +i); + } + } + } + + return null; +} diff --git a/node_modules/d3-transition/src/index.js b/node_modules/d3-transition/src/index.js new file mode 100644 index 00000000..d6a6dd35 --- /dev/null +++ b/node_modules/d3-transition/src/index.js @@ -0,0 +1,4 @@ +import "./selection/index.js"; +export {default as transition} from "./transition/index.js"; +export {default as active} from "./active.js"; +export {default as interrupt} from "./interrupt.js"; diff --git a/node_modules/d3-transition/src/interrupt.js b/node_modules/d3-transition/src/interrupt.js new file mode 100644 index 00000000..efb455eb --- /dev/null +++ b/node_modules/d3-transition/src/interrupt.js @@ -0,0 +1,24 @@ +import {STARTING, ENDING, ENDED} from "./transition/schedule.js"; + +export default function(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { empty = false; continue; } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; +} diff --git a/node_modules/d3-transition/src/selection/index.js b/node_modules/d3-transition/src/selection/index.js new file mode 100644 index 00000000..c5512eff --- /dev/null +++ b/node_modules/d3-transition/src/selection/index.js @@ -0,0 +1,6 @@ +import {selection} from "d3-selection"; +import selection_interrupt from "./interrupt.js"; +import selection_transition from "./transition.js"; + +selection.prototype.interrupt = selection_interrupt; +selection.prototype.transition = selection_transition; diff --git a/node_modules/d3-transition/src/selection/interrupt.js b/node_modules/d3-transition/src/selection/interrupt.js new file mode 100644 index 00000000..799a9238 --- /dev/null +++ b/node_modules/d3-transition/src/selection/interrupt.js @@ -0,0 +1,7 @@ +import interrupt from "../interrupt.js"; + +export default function(name) { + return this.each(function() { + interrupt(this, name); + }); +} diff --git a/node_modules/d3-transition/src/selection/transition.js b/node_modules/d3-transition/src/selection/transition.js new file mode 100644 index 00000000..a328dcb3 --- /dev/null +++ b/node_modules/d3-transition/src/selection/transition.js @@ -0,0 +1,42 @@ +import {Transition, newId} from "../transition/index.js"; +import schedule from "../transition/schedule.js"; +import {easeCubicInOut} from "d3-ease"; +import {now} from "d3-timer"; + +var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: easeCubicInOut +}; + +function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + throw new Error(`transition ${id} not found`); + } + } + return timing; +} + +export default function(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); +} diff --git a/node_modules/d3-transition/src/transition/attr.js b/node_modules/d3-transition/src/transition/attr.js new file mode 100644 index 00000000..3c3c764e --- /dev/null +++ b/node_modules/d3-transition/src/transition/attr.js @@ -0,0 +1,78 @@ +import {interpolateTransformSvg as interpolateTransform} from "d3-interpolate"; +import {namespace} from "d3-selection"; +import {tweenValue} from "./tween.js"; +import interpolate from "./interpolate.js"; + +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrConstantNS(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function attrFunctionNS(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +export default function(name, value) { + var fullname = namespace(name), i = fullname === "transform" ? interpolateTransform : interpolate; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) + : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); +} diff --git a/node_modules/d3-transition/src/transition/attrTween.js b/node_modules/d3-transition/src/transition/attrTween.js new file mode 100644 index 00000000..0dd4a005 --- /dev/null +++ b/node_modules/d3-transition/src/transition/attrTween.js @@ -0,0 +1,44 @@ +import {namespace} from "d3-selection"; + +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i.call(this, t)); + }; +} + +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; +} + +function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; +} + +function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; +} + +export default function(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +} diff --git a/node_modules/d3-transition/src/transition/delay.js b/node_modules/d3-transition/src/transition/delay.js new file mode 100644 index 00000000..1ba1acd1 --- /dev/null +++ b/node_modules/d3-transition/src/transition/delay.js @@ -0,0 +1,23 @@ +import {get, init} from "./schedule.js"; + +function delayFunction(id, value) { + return function() { + init(this, id).delay = +value.apply(this, arguments); + }; +} + +function delayConstant(id, value) { + return value = +value, function() { + init(this, id).delay = value; + }; +} + +export default function(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get(this.node(), id).delay; +} diff --git a/node_modules/d3-transition/src/transition/duration.js b/node_modules/d3-transition/src/transition/duration.js new file mode 100644 index 00000000..445691ef --- /dev/null +++ b/node_modules/d3-transition/src/transition/duration.js @@ -0,0 +1,23 @@ +import {get, set} from "./schedule.js"; + +function durationFunction(id, value) { + return function() { + set(this, id).duration = +value.apply(this, arguments); + }; +} + +function durationConstant(id, value) { + return value = +value, function() { + set(this, id).duration = value; + }; +} + +export default function(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get(this.node(), id).duration; +} diff --git a/node_modules/d3-transition/src/transition/ease.js b/node_modules/d3-transition/src/transition/ease.js new file mode 100644 index 00000000..83b1445b --- /dev/null +++ b/node_modules/d3-transition/src/transition/ease.js @@ -0,0 +1,16 @@ +import {get, set} from "./schedule.js"; + +function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function() { + set(this, id).ease = value; + }; +} + +export default function(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get(this.node(), id).ease; +} diff --git a/node_modules/d3-transition/src/transition/easeVarying.js b/node_modules/d3-transition/src/transition/easeVarying.js new file mode 100644 index 00000000..51e3a0d6 --- /dev/null +++ b/node_modules/d3-transition/src/transition/easeVarying.js @@ -0,0 +1,14 @@ +import {set} from "./schedule.js"; + +function easeVarying(id, value) { + return function() { + var v = value.apply(this, arguments); + if (typeof v !== "function") throw new Error; + set(this, id).ease = v; + }; +} + +export default function(value) { + if (typeof value !== "function") throw new Error; + return this.each(easeVarying(this._id, value)); +} diff --git a/node_modules/d3-transition/src/transition/end.js b/node_modules/d3-transition/src/transition/end.js new file mode 100644 index 00000000..d9aa3734 --- /dev/null +++ b/node_modules/d3-transition/src/transition/end.js @@ -0,0 +1,29 @@ +import {set} from "./schedule.js"; + +export default function() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = {value: reject}, + end = {value: function() { if (--size === 0) resolve(); }}; + + that.each(function() { + var schedule = set(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + + // The selection was empty, resolve end immediately + if (size === 0) resolve(); + }); +} diff --git a/node_modules/d3-transition/src/transition/filter.js b/node_modules/d3-transition/src/transition/filter.js new file mode 100644 index 00000000..f5237be5 --- /dev/null +++ b/node_modules/d3-transition/src/transition/filter.js @@ -0,0 +1,16 @@ +import {matcher} from "d3-selection"; +import {Transition} from "./index.js"; + +export default function(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); +} diff --git a/node_modules/d3-transition/src/transition/index.js b/node_modules/d3-transition/src/transition/index.js new file mode 100644 index 00000000..355be71f --- /dev/null +++ b/node_modules/d3-transition/src/transition/index.js @@ -0,0 +1,71 @@ +import {selection} from "d3-selection"; +import transition_attr from "./attr.js"; +import transition_attrTween from "./attrTween.js"; +import transition_delay from "./delay.js"; +import transition_duration from "./duration.js"; +import transition_ease from "./ease.js"; +import transition_easeVarying from "./easeVarying.js"; +import transition_filter from "./filter.js"; +import transition_merge from "./merge.js"; +import transition_on from "./on.js"; +import transition_remove from "./remove.js"; +import transition_select from "./select.js"; +import transition_selectAll from "./selectAll.js"; +import transition_selection from "./selection.js"; +import transition_style from "./style.js"; +import transition_styleTween from "./styleTween.js"; +import transition_text from "./text.js"; +import transition_textTween from "./textTween.js"; +import transition_transition from "./transition.js"; +import transition_tween from "./tween.js"; +import transition_end from "./end.js"; + +var id = 0; + +export function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; +} + +export default function transition(name) { + return selection().transition(name); +} + +export function newId() { + return ++id; +} + +var selection_prototype = selection.prototype; + +Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + easeVarying: transition_easeVarying, + end: transition_end, + [Symbol.iterator]: selection_prototype[Symbol.iterator] +}; diff --git a/node_modules/d3-transition/src/transition/interpolate.js b/node_modules/d3-transition/src/transition/interpolate.js new file mode 100644 index 00000000..d389d62c --- /dev/null +++ b/node_modules/d3-transition/src/transition/interpolate.js @@ -0,0 +1,10 @@ +import {color} from "d3-color"; +import {interpolateNumber, interpolateRgb, interpolateString} from "d3-interpolate"; + +export default function(a, b) { + var c; + return (typeof b === "number" ? interpolateNumber + : b instanceof color ? interpolateRgb + : (c = color(b)) ? (b = c, interpolateRgb) + : interpolateString)(a, b); +} diff --git a/node_modules/d3-transition/src/transition/merge.js b/node_modules/d3-transition/src/transition/merge.js new file mode 100644 index 00000000..46609537 --- /dev/null +++ b/node_modules/d3-transition/src/transition/merge.js @@ -0,0 +1,19 @@ +import {Transition} from "./index.js"; + +export default function(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Transition(merges, this._parents, this._name, this._id); +} diff --git a/node_modules/d3-transition/src/transition/on.js b/node_modules/d3-transition/src/transition/on.js new file mode 100644 index 00000000..b6a91d3a --- /dev/null +++ b/node_modules/d3-transition/src/transition/on.js @@ -0,0 +1,32 @@ +import {get, set, init} from "./schedule.js"; + +function start(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); +} + +function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : set; + return function() { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; +} + +export default function(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); +} diff --git a/node_modules/d3-transition/src/transition/remove.js b/node_modules/d3-transition/src/transition/remove.js new file mode 100644 index 00000000..c4bff9b3 --- /dev/null +++ b/node_modules/d3-transition/src/transition/remove.js @@ -0,0 +1,11 @@ +function removeFunction(id) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; +} + +export default function() { + return this.on("end.remove", removeFunction(this._id)); +} diff --git a/node_modules/d3-transition/src/transition/schedule.js b/node_modules/d3-transition/src/transition/schedule.js new file mode 100644 index 00000000..f4e88d70 --- /dev/null +++ b/node_modules/d3-transition/src/transition/schedule.js @@ -0,0 +1,153 @@ +import {dispatch} from "d3-dispatch"; +import {timer, timeout} from "d3-timer"; + +var emptyOn = dispatch("start", "end", "cancel", "interrupt"); +var emptyTween = []; + +export var CREATED = 0; +export var SCHEDULED = 1; +export var STARTING = 2; +export var STARTED = 3; +export var RUNNING = 4; +export var ENDING = 5; +export var ENDED = 6; + +export default function(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +} + +export function init(node, id) { + var schedule = get(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; +} + +export function set(node, id) { + var schedule = get(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; +} + +export function get(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + return schedule; +} + +function create(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return timeout(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + timeout(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } +} diff --git a/node_modules/d3-transition/src/transition/select.js b/node_modules/d3-transition/src/transition/select.js new file mode 100644 index 00000000..959c8c0c --- /dev/null +++ b/node_modules/d3-transition/src/transition/select.js @@ -0,0 +1,22 @@ +import {selector} from "d3-selection"; +import {Transition} from "./index.js"; +import schedule, {get} from "./schedule.js"; + +export default function(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); +} diff --git a/node_modules/d3-transition/src/transition/selectAll.js b/node_modules/d3-transition/src/transition/selectAll.js new file mode 100644 index 00000000..1ba48013 --- /dev/null +++ b/node_modules/d3-transition/src/transition/selectAll.js @@ -0,0 +1,26 @@ +import {selectorAll} from "d3-selection"; +import {Transition} from "./index.js"; +import schedule, {get} from "./schedule.js"; + +export default function(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); +} diff --git a/node_modules/d3-transition/src/transition/selection.js b/node_modules/d3-transition/src/transition/selection.js new file mode 100644 index 00000000..d0c5944f --- /dev/null +++ b/node_modules/d3-transition/src/transition/selection.js @@ -0,0 +1,7 @@ +import {selection} from "d3-selection"; + +var Selection = selection.prototype.constructor; + +export default function() { + return new Selection(this._groups, this._parents); +} diff --git a/node_modules/d3-transition/src/transition/style.js b/node_modules/d3-transition/src/transition/style.js new file mode 100644 index 00000000..7dcb1871 --- /dev/null +++ b/node_modules/d3-transition/src/transition/style.js @@ -0,0 +1,80 @@ +import {interpolateTransformCss as interpolateTransform} from "d3-interpolate"; +import {style} from "d3-selection"; +import {set} from "./schedule.js"; +import {tweenValue} from "./tween.js"; +import interpolate from "./interpolate.js"; + +function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function() { + var string0 = style(this, name), + string1 = (this.style.removeProperty(name), style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} + +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = style(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function styleFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0 = style(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function() { + var schedule = set(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; +} + +export default function(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransform : interpolate; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, styleRemove(name)) + : typeof value === "function" ? this + .styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, styleConstant(name, i, value), priority) + .on("end.style." + name, null); +} diff --git a/node_modules/d3-transition/src/transition/styleTween.js b/node_modules/d3-transition/src/transition/styleTween.js new file mode 100644 index 00000000..f692483f --- /dev/null +++ b/node_modules/d3-transition/src/transition/styleTween.js @@ -0,0 +1,24 @@ +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i.call(this, t), priority); + }; +} + +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; +} + +export default function(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +} diff --git a/node_modules/d3-transition/src/transition/text.js b/node_modules/d3-transition/src/transition/text.js new file mode 100644 index 00000000..a7f75d94 --- /dev/null +++ b/node_modules/d3-transition/src/transition/text.js @@ -0,0 +1,20 @@ +import {tweenValue} from "./tween.js"; + +function textConstant(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} + +export default function(value) { + return this.tween("text", typeof value === "function" + ? textFunction(tweenValue(this, "text", value)) + : textConstant(value == null ? "" : value + "")); +} diff --git a/node_modules/d3-transition/src/transition/textTween.js b/node_modules/d3-transition/src/transition/textTween.js new file mode 100644 index 00000000..16d1bf17 --- /dev/null +++ b/node_modules/d3-transition/src/transition/textTween.js @@ -0,0 +1,24 @@ +function textInterpolate(i) { + return function(t) { + this.textContent = i.call(this, t); + }; +} + +function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } + tween._value = value; + return tween; +} + +export default function(value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, textTween(value)); +} diff --git a/node_modules/d3-transition/src/transition/transition.js b/node_modules/d3-transition/src/transition/transition.js new file mode 100644 index 00000000..6a6dd24e --- /dev/null +++ b/node_modules/d3-transition/src/transition/transition.js @@ -0,0 +1,24 @@ +import {Transition, newId} from "./index.js"; +import schedule, {get} from "./schedule.js"; + +export default function() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } + } + } + + return new Transition(groups, this._parents, name, id1); +} diff --git a/node_modules/d3-transition/src/transition/tween.js b/node_modules/d3-transition/src/transition/tween.js new file mode 100644 index 00000000..ba96781e --- /dev/null +++ b/node_modules/d3-transition/src/transition/tween.js @@ -0,0 +1,81 @@ +import {get, set} from "./schedule.js"; + +function tweenRemove(id, name) { + var tween0, tween1; + return function() { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; +} + +function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function() { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; +} + +export default function(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = get(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); +} + +export function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function() { + var schedule = set(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function(node) { + return get(node, id).value[name]; + }; +} diff --git a/node_modules/d3-zoom/LICENSE b/node_modules/d3-zoom/LICENSE new file mode 100644 index 00000000..721bd22e --- /dev/null +++ b/node_modules/d3-zoom/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2016 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3-zoom/README.md b/node_modules/d3-zoom/README.md new file mode 100644 index 00000000..dd29d50e --- /dev/null +++ b/node_modules/d3-zoom/README.md @@ -0,0 +1,402 @@ +# d3-zoom + +Panning and zooming are popular interaction techniques which let the user focus on a region of interest by restricting the view. It is easy to learn due to direct manipulation: click-and-drag to pan (translate), spin the wheel to zoom (scale), or use touch. Panning and zooming are widely used in web-based mapping, but can also be used with visualizations such as time-series and scatterplots. + +The zoom behavior implemented by d3-zoom is a convenient but flexible abstraction for enabling pan-and-zoom on [selections](https://github.com/d3/d3-selection). It handles a surprising variety of [input events](#api-reference) and browser quirks. The zoom behavior is agnostic about the DOM, so you can use it with SVG, HTML or Canvas. + +[Canvas Zooming](https://observablehq.com/@d3/zoom-canvas)[SVG Zooming](https://observablehq.com/@d3/zoom) + +The zoom behavior is also designed to work with [d3-scale](https://github.com/d3/d3-scale) and [d3-axis](https://github.com/d3/d3-axis); see [*transform*.rescaleX](#transform_rescaleX) and [*transform*.rescaleY](#transform_rescaleY). You can also restrict zooming using [*zoom*.scaleExtent](#zoom_scaleExtent) and panning using [*zoom*.translateExtent](#zoom_translateExtent). + +[Axis Zooming](https://observablehq.com/@d3/zoomable-scatterplot) + +The zoom behavior can be combined with other behaviors, such as [d3-drag](https://github.com/d3/d3-drag) for dragging, and [d3-brush](https://github.com/d3/d3-brush) for focus + context. + +[Drag & Zoom II](https://observablehq.com/@d3/drag-zoom)[Brush & Zoom](https://observablehq.com/@d3/focus-context) + +The zoom behavior can be controlled programmatically using [*zoom*.transform](#zoom_transform), allowing you to implement user interface controls which drive the display or to stage animated tours through your data. Smooth zoom transitions are based on [“Smooth and efficient zooming and panningâ€](http://www.win.tue.nl/~vanwijk/zoompan.pdf) by Jarke J. van Wijk and Wim A.A. Nuij. + +[Zoom Transitions](https://observablehq.com/@d3/programmatic-zoom) + +See also [d3-tile](https://github.com/d3/d3-tile) for examples panning and zooming maps. + +## Installing + +If you use NPM, `npm install d3-zoom`. Otherwise, download the [latest release](https://github.com/d3/d3-zoom/releases/latest). You can also load directly from [d3js.org](https://d3js.org), either as a [standalone library](https://d3js.org/d3-zoom.v2.min.js) or as part of [D3](https://github.com/d3/d3). AMD, CommonJS, and vanilla environments are supported. In vanilla, a `d3` global is exported: + +```html + + + + + + + + + + +``` + +[Try d3-zoom in your browser.](https://observablehq.com/collection/@d3/d3-zoom) + +## API Reference + +This table describes how the zoom behavior interprets native events: + +| Event | Listening Element | Zoom Event | Default Prevented? | +| ------------ | ----------------- | ----------- | ------------------ | +| mousedownâµ | selection | start | no¹ | +| mousemove² | window¹ | zoom | yes | +| mouseup² | window¹ | end | yes | +| dragstart² | window | - | yes | +| selectstart² | window | - | yes | +| click³ | window | - | yes | +| dblclick | selection | *multiple*â¶ | yes | +| wheel⸠| selection | zoomâ· | yes | +| touchstart | selection | *multiple*â¶ | noâ´ | +| touchmove | selection | zoom | yes | +| touchend | selection | end | noâ´ | +| touchcancel | selection | end | noâ´ | + +The propagation of all consumed events is [immediately stopped](https://dom.spec.whatwg.org/#dom-event-stopimmediatepropagation). + +¹ Necessary to capture events outside an iframe; see [d3-drag#9](https://github.com/d3/d3-drag/issues/9). +
² Only applies during an active, mouse-based gesture; see [d3-drag#9](https://github.com/d3/d3-drag/issues/9). +
³ Only applies immediately after some mouse-based gestures; see [*zoom*.clickDistance](#zoom_clickDistance). +
â´ Necessary to allow [click emulation](https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW7) on touch input; see [d3-drag#9](https://github.com/d3/d3-drag/issues/9). +
âµ Ignored if within 500ms of a touch gesture ending; assumes [click emulation](https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW7). +
â¶ Double-click and double-tap initiate a transition that emits start, zoom and end events; see [*zoom*.tapDistance](#zoom_tapDistance).. +
â· The first wheel event emits a start event; an end event is emitted when no wheel events are received for 150ms. +
⸠Ignored if already at the corresponding limit of the [scale extent](#zoom_scaleExtent). + +# d3.zoom() · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js), [Examples](https://observablehq.com/collection/@d3/d3-zoom) + +Creates a new zoom behavior. The returned behavior, [*zoom*](#_drag), is both an object and a function, and is typically applied to selected elements via [*selection*.call](https://github.com/d3/d3-selection#selection_call). + +# zoom(selection) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js), [Examples](https://observablehq.com/collection/@d3/d3-zoom) + +Applies this zoom behavior to the specified [*selection*](https://github.com/d3/d3-selection), binding the necessary event listeners to allow panning and zooming, and initializing the [zoom transform](#zoom-transforms) on each selected element to the identity transform if not already defined. This function is typically not invoked directly, and is instead invoked via [*selection*.call](https://github.com/d3/d3-selection#selection_call). For example, to instantiate a zoom behavior and apply it to a selection: + +```js +selection.call(d3.zoom().on("zoom", zoomed)); +``` + +Internally, the zoom behavior uses [*selection*.on](https://github.com/d3/d3-selection#selection_on) to bind the necessary event listeners for zooming. The listeners use the name `.zoom`, so you can subsequently unbind the zoom behavior as follows: + +```js +selection.on(".zoom", null); +``` + +To disable just wheel-driven zooming (say to not interfere with native scrolling), you can remove the zoom behavior’s wheel event listener after applying the zoom behavior to the selection: + +```js +selection + .call(zoom) + .on("wheel.zoom", null); +``` + +Alternatively, use [*zoom*.filter](#zoom_filter) for greater control over which events can initiate zoom gestures. + +Applying the zoom behavior also sets the [-webkit-tap-highlight-color](https://developer.apple.com/library/mac/documentation/AppleApplications/Reference/SafariWebContent/AdjustingtheTextSize/AdjustingtheTextSize.html#//apple_ref/doc/uid/TP40006510-SW5) style to transparent, disabling the tap highlight on iOS. If you want a different tap highlight color, remove or re-apply this style after applying the drag behavior. + +# zoom.transform(selection, transform[, point]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js), [Examples](https://observablehq.com/collection/@d3/d3-zoom) + +If *selection* is a selection, sets the [current zoom transform](#zoomTransform) of the selected elements to the specified *transform*, instantaneously emitting start, zoom and end [events](#zoom-events). If *selection* is a transition, defines a “zoom†tween to the specified *transform* using [d3.interpolateZoom](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateZoom), emitting a start event when the transition starts, zoom events for each tick of the transition, and then an end event when the transition ends (or is interrupted). The transition will attempt to minimize the visual movement around the specified *point*; if the *point* is not specified, it defaults to the center of the viewport [extent](#zoom_extent). The *transform* may be specified either as a [zoom transform](#zoom-transforms) or as a function that returns a zoom transform; similarly, the *point* may be specified either as a two-element array [*x*, *y*] or a function that returns such an array. If a function, it is invoked for each selected element, being passed the current event (`event`) and datum `d`, with the `this` context as the current DOM element. + +This function is typically not invoked directly, and is instead invoked via [*selection*.call](https://github.com/d3/d3-selection#selection_call) or [*transition*.call](https://github.com/d3/d3-transition#transition_call). For example, to reset the zoom transform to the [identity transform](#zoomIdentity) instantaneously: + +```js +selection.call(zoom.transform, d3.zoomIdentity); +``` + +To smoothly reset the zoom transform to the identity transform over 750 milliseconds: + +```js +selection.transition().duration(750).call(zoom.transform, d3.zoomIdentity); +``` + +This method requires that you specify the new zoom transform completely, and does not enforce the defined [scale extent](#zoom_scaleExtent) and [translate extent](#zoom_translateExtent), if any. To derive a new transform from the existing transform, and to enforce the scale and translate extents, see the convenience methods [*zoom*.translateBy](#zoom_translateBy), [*zoom*.scaleBy](#zoom_scaleBy) and [*zoom*.scaleTo](#zoom_scaleTo). + +# zoom.translateBy(selection, x, y) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *selection* is a selection, [translates](#transform_translate) the [current zoom transform](#zoomTransform) of the selected elements by *x* and *y*, such that the new *tx1* = *tx0* + *kx* and *ty1* = *ty0* + *ky*. If *selection* is a transition, defines a “zoom†tween translating the current transform. This method is a convenience method for [*zoom*.transform](#zoom_transform). The *x* and *y* translation amounts may be specified either as numbers or as functions that return numbers. If a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. + +# zoom.translateTo(selection, x, y[, p]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *selection* is a selection, [translates](#transform_translate) the [current zoom transform](#zoomTransform) of the selected elements such that the given position ⟨*x*,*y*⟩ appears at given point *p*. The new *tx* = *px* - *kx* and *ty* = *py* - *ky*. If *p* is not specified, it defaults to the center of the viewport [extent](#zoom_extent). If *selection* is a transition, defines a “zoom†tween translating the current transform. This method is a convenience method for [*zoom*.transform](#zoom_transform). The *x* and *y* coordinates may be specified either as numbers or as functions that returns numbers; similarly the *p* point may be specified either as a two-element array [*px*,*py*] or a function. If a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. + +# zoom.scaleBy(selection, k[, p]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *selection* is a selection, [scales](#transform_scale) the [current zoom transform](#zoomTransform) of the selected elements by *k*, such that the new *kâ‚* = *kâ‚€k*. The reference point *p* does move. If *p* is not specified, it defaults to the center of the viewport [extent](#zoom_extent). If *selection* is a transition, defines a “zoom†tween translating the current transform. This method is a convenience method for [*zoom*.transform](#zoom_transform). The *k* scale factor may be specified either as a number or a function that returns a number; similarly the *p* point may be specified either as a two-element array [*px*,*py*] or a function. If a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. + +# zoom.scaleTo(selection, k[, p]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *selection* is a selection, [scales](#transform_scale) the [current zoom transform](#zoomTransform) of the selected elements to *k*, such that the new *kâ‚* = *k*. The reference point *p* does move. If *p* is not specified, it defaults to the center of the viewport [extent](#zoom_extent). If *selection* is a transition, defines a “zoom†tween translating the current transform. This method is a convenience method for [*zoom*.transform](#zoom_transform). The *k* scale factor may be specified either as a number or a function that returns a number; similarly the *p* point may be specified either as a two-element array [*px*,*py*] or a function. If a function, it is invoked for each selected element, being passed the current datum `d` and index `i`, with the `this` context as the current DOM element. + +# zoom.constrain([constrain]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *constrain* is specified, sets the transform constraint function to the specified function and returns the zoom behavior. If *constrain* is not specified, returns the current constraint function, which defaults to: + +```js +function constrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); +} +``` + +The constraint function must return a [*transform*](#zoom-transforms) given the current *transform*, [viewport extent](#zoom_extent) and [translate extent](#zoom_translateExtent). The default implementation attempts to ensure that the viewport extent does not go outside the translate extent. + +# zoom.filter([filter]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *filter* is specified, sets the filter to the specified function and returns the zoom behavior. If *filter* is not specified, returns the current filter, which defaults to: + +```js +function filter(event) { + return !event.ctrlKey && !event.button; +} +``` + +The filter is passed the current event (`event`) and datum `d`, with the `this` context as the current DOM element. If the filter returns falsey, the initiating event is ignored and no zoom gestures are started. Thus, the filter determines which input events are ignored. The default filter ignores mousedown events on secondary buttons, since those buttons are typically intended for other purposes, such as the context menu. + +# zoom.touchable([touchable]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *touchable* is specified, sets the touch support detector to the specified function and returns the zoom behavior. If *touchable* is not specified, returns the current touch support detector, which defaults to: + +```js +function touchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} +``` + +Touch event listeners are only registered if the detector returns truthy for the corresponding element when the zoom behavior is [applied](#_zoom). The default detector works well for most browsers that are capable of touch input, but not all; Chrome’s mobile device emulator, for example, fails detection. + +# zoom.wheelDelta([delta]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *delta* is specified, sets the wheel delta function to the specified function and returns the zoom behavior. If *delta* is not specified, returns the current wheel delta function, which defaults to: + +```js +function wheelDelta(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002); +} +``` + +The value *Δ* returned by the wheel delta function determines the amount of scaling applied in response to a [WheelEvent](https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent). The scale factor [*transform*.k](#zoomTransform) is multiplied by 2*Δ*; for example, a *Δ* of +1 doubles the scale factor, *Δ* of -1 halves the scale factor. + +# zoom.extent([extent]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *extent* is specified, sets the viewport extent to the specified array of points [[*x0*, *y0*], [*x1*, *y1*]], where [*x0*, *y0*] is the top-left corner of the viewport and [*x1*, *y1*] is the bottom-right corner of the viewport, and returns this zoom behavior. The *extent* may also be specified as a function which returns such an array; if a function, it is invoked for each selected element, being passed the current datum `d`, with the `this` context as the current DOM element. + +If *extent* is not specified, returns the current extent accessor, which defaults to [[0, 0], [*width*, *height*]] where *width* is the [client width](https://developer.mozilla.org/en-US/docs/Web/API/Element/clientWidth) of the element and *height* is its [client height](https://developer.mozilla.org/en-US/docs/Web/API/Element/clientHeight); for SVG elements, the nearest ancestor SVG element’s viewBox, or [width](https://www.w3.org/TR/SVG/struct.html#SVGElementWidthAttribute) and [height](https://www.w3.org/TR/SVG/struct.html#SVGElementHeightAttribute) attributes, are used. Alternatively, consider using [*element*.getBoundingClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). + +The viewport extent affects several functions: the center of the viewport remains fixed during changes by [*zoom*.scaleBy](#zoom_scaleBy) and [*zoom*.scaleTo](#zoom_scaleTo); the viewport center and dimensions affect the path chosen by [d3.interpolateZoom](https://github.com/d3/d3-interpolate#interpolateZoom); and the viewport extent is needed to enforce the optional [translate extent](#zoom_translateExtent). + +# zoom.scaleExtent([extent]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *extent* is specified, sets the scale extent to the specified array of numbers [*k0*, *k1*] where *k0* is the minimum allowed scale factor and *k1* is the maximum allowed scale factor, and returns this zoom behavior. If *extent* is not specified, returns the current scale extent, which defaults to [0, ∞]. The scale extent restricts zooming in and out. It is enforced on interaction and when using [*zoom*.scaleBy](#zoom_scaleBy), [*zoom*.scaleTo](#zoom_scaleTo) and [*zoom*.translateBy](#zoom_translateBy); however, it is not enforced when using [*zoom*.transform](#zoom_transform) to set the transform explicitly. + +If the user tries to zoom by wheeling when already at the corresponding limit of the scale extent, the wheel events will be ignored and not initiate a zoom gesture. This allows the user to scroll down past a zoomable area after zooming in, or to scroll up after zooming out. If you would prefer to always prevent scrolling on wheel input regardless of the scale extent, register a wheel event listener to prevent the browser default behavior: + +```js +selection + .call(zoom) + .on("wheel", event => event.preventDefault()); +``` + +# zoom.translateExtent([extent]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *extent* is specified, sets the translate extent to the specified array of points [[*x0*, *y0*], [*x1*, *y1*]], where [*x0*, *y0*] is the top-left corner of the world and [*x1*, *y1*] is the bottom-right corner of the world, and returns this zoom behavior. If *extent* is not specified, returns the current translate extent, which defaults to [[-∞, -∞], [+∞, +∞]]. The translate extent restricts panning, and may cause translation on zoom out. It is enforced on interaction and when using [*zoom*.scaleBy](#zoom_scaleBy), [*zoom*.scaleTo](#zoom_scaleTo) and [*zoom*.translateBy](#zoom_translateBy); however, it is not enforced when using [*zoom*.transform](#zoom_transform) to set the transform explicitly. + +# zoom.clickDistance([distance]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *distance* is specified, sets the maximum distance that the mouse can move between mousedown and mouseup that will trigger a subsequent click event. If at any point between mousedown and mouseup the mouse is greater than or equal to *distance* from its position on mousedown, the click event following mouseup will be suppressed. If *distance* is not specified, returns the current distance threshold, which defaults to zero. The distance threshold is measured in client coordinates ([*event*.clientX](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientX) and [*event*.clientY](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientY)). + +# zoom.tapDistance([distance]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *distance* is specified, sets the maximum distance that a double-tap gesture can move between first touchstart and second touchend that will trigger a subsequent double-click event. If *distance* is not specified, returns the current distance threshold, which defaults to 10. The distance threshold is measured in client coordinates ([*event*.clientX](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientX) and [*event*.clientY](https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/clientY)). + +# zoom.duration([duration]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *duration* is specified, sets the duration for zoom transitions on double-click and double-tap to the specified number of milliseconds and returns the zoom behavior. If *duration* is not specified, returns the current duration, which defaults to 250 milliseconds. If the duration is not greater than zero, double-click and -tap trigger instantaneous changes to the zoom transform rather than initiating smooth transitions. + +To disable double-click and double-tap transitions, you can remove the zoom behavior’s dblclick event listener after applying the zoom behavior to the selection: + +```js +selection + .call(zoom) + .on("dblclick.zoom", null); +``` + +# zoom.interpolate([interpolate]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *interpolate* is specified, sets the interpolation factory for zoom transitions to the specified function. If *interpolate* is not specified, returns the current interpolation factory, which defaults to [d3.interpolateZoom](https://github.com/d3/d3-interpolate#interpolateZoom) to implement smooth zooming. To apply direct interpolation between two views, try [d3.interpolate](https://github.com/d3/d3-interpolate#interpolate) instead. + +# zoom.on(typenames[, listener]) · [Source](https://github.com/d3/d3-zoom/blob/master/src/zoom.js) + +If *listener* is specified, sets the event *listener* for the specified *typenames* and returns the zoom behavior. If an event listener was already registered for the same type and name, the existing listener is removed before the new listener is added. If *listener* is null, removes the current event listeners for the specified *typenames*, if any. If *listener* is not specified, returns the first currently-assigned listener matching the specified *typenames*, if any. When a specified event is dispatched, each *listener* will be invoked with the same context and arguments as [*selection*.on](https://github.com/d3/d3-selection#selection_on) listeners: the current event (`event`) and datum `d`, with the `this` context as the current DOM element. + +The *typenames* is a string containing one or more *typename* separated by whitespace. Each *typename* is a *type*, optionally followed by a period (`.`) and a *name*, such as `zoom.foo` and `zoom.bar`; the name allows multiple listeners to be registered for the same *type*. The *type* must be one of the following: + +* `start` - after zooming begins (such as on mousedown). +* `zoom` - after a change to the zoom transform (such as on mousemove). +* `end` - after zooming ends (such as on mouseup ). + +See [*dispatch*.on](https://github.com/d3/d3-dispatch#dispatch_on) for more. + +### Zoom Events + +When a [zoom event listener](#zoom_on) is invoked, it receives the current zoom event as a first argument. The *event* object exposes several fields: + +* *event*.target - the associated [zoom behavior](#zoom). +* *event*.type - the string “startâ€, “zoom†or “endâ€; see [*zoom*.on](#zoom_on). +* *event*.transform - the current [zoom transform](#zoom-transforms). +* *event*.sourceEvent - the underlying input event, such as mousemove or touchmove. + +### Zoom Transforms + +The zoom behavior stores the zoom state on the element to which the zoom behavior was [applied](#_zoom), not on the zoom behavior itself. This is because the zoom behavior can be applied to many elements simultaneously, and each element can be zoomed independently. The zoom state can change either on user interaction or programmatically via [*zoom*.transform](#zoom_transform). + +To retrieve the zoom state, use *event*.transform on the current [zoom event](#zoom-events) within a zoom event listener (see [*zoom*.on](#zoom_on)), or use [d3.zoomTransform](#zoomTransform) for a given node. The latter is particularly useful for modifying the zoom state programmatically, say to implement buttons for zooming in and out. + +# d3.zoomTransform(node) · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns the current transform for the specified *node*. Note that *node* should typically be a DOM element, not a *selection*. (A selection may consist of multiple nodes, in different states, and this function only returns a single transform.) If you have a selection, call [*selection*.node](https://github.com/d3/d3-selection#selection_node) first: + +```js +var transform = d3.zoomTransform(selection.node()); +``` + +In the context of an [event listener](https://github.com/d3/d3-selection#selection_on), the *node* is typically the element that received the input event (which should be equal to [*event*.transform](#zoom-events)), *this*: + +```js +var transform = d3.zoomTransform(this); +``` + +Internally, an element’s transform is stored as *element*.\_\_zoom; however, you should use this method rather than accessing it directly. If the given *node* has no defined transform, returns the transform of the closest ancestor, or if none exists, the [identity transformation](#zoomIdentity). The returned transform represents a two-dimensional [transformation matrix](https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations) of the form: + +*k* 0 *tx* +
0 *k* *ty* +
0 0 1 + +(This matrix is capable of representing only scale and translation; a future release may also allow rotation, though this would probably not be a backwards-compatible change.) The position ⟨*x*,*y*⟩ is transformed to ⟨*xk* + *tx*,*yk* + *ty*⟩. The transform object exposes the following properties: + +* *transform*.x - the translation amount *tx* along the *x*-axis. +* *transform*.y - the translation amount *ty* along the *y*-axis. +* *transform*.k - the scale factor *k*. + +These properties should be considered read-only; instead of mutating a transform, use [*transform*.scale](#transform_scale) and [*transform*.translate](#transform_translate) to derive a new transform. Also see [*zoom*.scaleBy](#zoom_scaleBy), [*zoom*.scaleTo](#zoom_scaleTo) and [*zoom*.translateBy](#zoom_translateBy) for convenience methods on the zoom behavior. To create a transform with a given *k*, *tx*, and *ty*: + +```js +var t = d3.zoomIdentity.translate(x, y).scale(k); +``` + +To apply the transformation to a [Canvas 2D context](https://www.w3.org/TR/2dcontext/), use [*context*.translate](https://www.w3.org/TR/2dcontext/#dom-context-2d-translate) followed by [*context*.scale](https://www.w3.org/TR/2dcontext/#dom-context-2d-scale): + +```js +context.translate(transform.x, transform.y); +context.scale(transform.k, transform.k); +``` + +Similarly, to apply the transformation to HTML elements via [CSS](https://www.w3.org/TR/css-transforms-1/): + +```js +div.style("transform", "translate(" + transform.x + "px," + transform.y + "px) scale(" + transform.k + ")"); +div.style("transform-origin", "0 0"); +``` + +To apply the transformation to [SVG](https://www.w3.org/TR/SVG/coords.html#TransformAttribute): + +```js +g.attr("transform", "translate(" + transform.x + "," + transform.y + ") scale(" + transform.k + ")"); +``` + +Or more simply, taking advantage of [*transform*.toString](#transform_toString): + +```js +g.attr("transform", transform); +``` + +Note that the order of transformations matters! The translate must be applied before the scale. + +# transform.scale(k) · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns a transform whose scale *kâ‚* is equal to *kâ‚€k*, where *kâ‚€* is this transform’s scale. + +# transform.translate(x, y) · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns a transform whose translation *tx1* and *ty1* is equal to *tx0* + *tk x* and *ty0* + *tk y*, where *tx0* and *ty0* is this transform’s translation and *tk* is this transform’s scale. + +# transform.apply(point) · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns the transformation of the specified *point* which is a two-element array of numbers [*x*, *y*]. The returned point is equal to [*xk* + *tx*, *yk* + *ty*]. + +# transform.applyX(x) · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns the transformation of the specified *x*-coordinate, *xk* + *tx*. + +# transform.applyY(y) · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns the transformation of the specified *y*-coordinate, *yk* + *ty*. + +# transform.invert(point) · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns the inverse transformation of the specified *point* which is a two-element array of numbers [*x*, *y*]. The returned point is equal to [(*x* - *tx*) / *k*, (*y* - *ty*) / *k*]. + +# transform.invertX(x) · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns the inverse transformation of the specified *x*-coordinate, (*x* - *tx*) / *k*. + +# transform.invertY(y) · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns the inverse transformation of the specified *y*-coordinate, (*y* - *ty*) / *k*. + +# transform.rescaleX(x) · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns a [copy](https://github.com/d3/d3-scale#continuous_copy) of the [continuous scale](https://github.com/d3/d3-scale#continuous-scales) *x* whose [domain](https://github.com/d3/d3-scale#continuous_domain) is transformed. This is implemented by first applying the [inverse *x*-transform](#transform_invertX) on the scale’s [range](https://github.com/d3/d3-scale#continuous_range), and then applying the [inverse scale](https://github.com/d3/d3-scale#continuous_invert) to compute the corresponding domain: + +```js +function rescaleX(x) { + var range = x.range().map(transform.invertX, transform), + domain = range.map(x.invert, x); + return x.copy().domain(domain); +} +``` + +The scale *x* must use [d3.interpolateNumber](https://github.com/d3/d3-interpolate#interpolateNumber); do not use [*continuous*.rangeRound](https://github.com/d3/d3-scale#continuous_rangeRound) as this reduces the accuracy of [*continuous*.invert](https://github.com/d3/d3-scale#continuous_invert) and can lead to an inaccurate rescaled domain. This method does not modify the input scale *x*; *x* thus represents the untransformed scale, while the returned scale represents its transformed view. + +# transform.rescaleY(y) · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns a [copy](https://github.com/d3/d3-scale#continuous_copy) of the [continuous scale](https://github.com/d3/d3-scale#continuous-scales) *y* whose [domain](https://github.com/d3/d3-scale#continuous_domain) is transformed. This is implemented by first applying the [inverse *y*-transform](#transform_invertY) on the scale’s [range](https://github.com/d3/d3-scale#continuous_range), and then applying the [inverse scale](https://github.com/d3/d3-scale#continuous_invert) to compute the corresponding domain: + +```js +function rescaleY(y) { + var range = y.range().map(transform.invertY, transform), + domain = range.map(y.invert, y); + return y.copy().domain(domain); +} +``` + +The scale *y* must use [d3.interpolateNumber](https://github.com/d3/d3-interpolate#interpolateNumber); do not use [*continuous*.rangeRound](https://github.com/d3/d3-scale#continuous_rangeRound) as this reduces the accuracy of [*continuous*.invert](https://github.com/d3/d3-scale#continuous_invert) and can lead to an inaccurate rescaled domain. This method does not modify the input scale *y*; *y* thus represents the untransformed scale, while the returned scale represents its transformed view. + +# transform.toString() · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +Returns a string representing the [SVG transform](https://www.w3.org/TR/SVG/coords.html#TransformAttribute) corresponding to this transform. Implemented as: + +```js +function toString() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; +} +``` + +# d3.zoomIdentity · [Source](https://github.com/d3/d3-zoom/blob/master/src/transform.js) + +The identity transform, where *k* = 1, *tx* = *ty* = 0. diff --git a/node_modules/d3-zoom/dist/d3-zoom.js b/node_modules/d3-zoom/dist/d3-zoom.js new file mode 100644 index 00000000..656aaa75 --- /dev/null +++ b/node_modules/d3-zoom/dist/d3-zoom.js @@ -0,0 +1,530 @@ +// https://d3js.org/d3-zoom/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-drag'), require('d3-interpolate'), require('d3-selection'), require('d3-transition')) : +typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3)); +}(this, (function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { 'use strict'; + +var constant = x => () => x; + +function ZoomEvent(type, { + sourceEvent, + target, + transform, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + transform: {value: transform, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} + +function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; +} + +Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function(x) { + return x * this.k + this.x; + }, + applyY: function(y) { + return y * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x) { + return (x - this.x) / this.k; + }, + invertY: function(y) { + return (y - this.y) / this.k; + }, + rescaleX: function(x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function(y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } +}; + +var identity = new Transform(1, 0, 0); + +transform.prototype = Transform.prototype; + +function transform(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity; + return node.__zoom; +} + +function nopropagation(event) { + event.stopImmediatePropagation(); +} + +function noevent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// Ignore right-click, since that should open the context menu. +// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event +function defaultFilter(event) { + return (!event.ctrlKey || event.type === 'wheel') && !event.button; +} + +function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; +} + +function defaultTransform() { + return this.__zoom || identity; +} + +function defaultWheelDelta(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1); +} + +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function defaultConstrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); +} + +function zoom() { + var filter = defaultFilter, + extent = defaultExtent, + constrain = defaultConstrain, + wheelDelta = defaultWheelDelta, + touchable = defaultTouchable, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = d3Interpolate.interpolateZoom, + listeners = d3Dispatch.dispatch("start", "zoom", "end"), + touchstarting, + touchfirst, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0, + tapDistance = 10; + + function zoom(selection) { + selection + .property("__zoom", defaultTransform) + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .filter(touchable) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + zoom.transform = function(collection, transform, point, event) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); + if (collection !== selection) { + schedule(collection, transform, point, event); + } else { + selection.interrupt().each(function() { + gesture(this, arguments) + .event(event) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function(selection, k, p, event) { + zoom.scaleTo(selection, function() { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p, event); + }; + + zoom.scaleTo = function(selection, k, p, event) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p, event); + }; + + zoom.translateBy = function(selection, x, y, event) { + zoom.transform(selection, function() { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments), translateExtent); + }, null, event); + }; + + zoom.translateTo = function(selection, x, y, p, event) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p, event); + }; + + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition, transform, point, event) { + transition + .on("start.zoom", function() { gesture(this, arguments).event(event).start(); }) + .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).event(event).end(); }) + .tween("zoom", function() { + var that = this, + args = arguments, + g = gesture(that, args).event(event), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } + g.zoom(null, t); + }; + }); + } + + function gesture(that, args, clean) { + return (!clean && that.__zooming) || new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.sourceEvent = null; + this.extent = extent.apply(that, args); + this.taps = 0; + } + + Gesture.prototype = { + event: function(event) { + if (event) this.sourceEvent = event; + return this; + }, + start: function() { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function(type) { + var d = d3Selection.select(this.that).datum(); + listeners.call( + type, + this.that, + new ZoomEvent(type, { + sourceEvent: this.sourceEvent, + target: zoom, + type, + transform: this.that.__zoom, + dispatch: listeners + }), + d + ); + } + }; + + function wheeled(event, ...args) { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, args).event(event), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = d3Selection.pointer(event); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } + + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; + + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + d3Transition.interrupt(this); + g.start(); + } + + noevent(event); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } + + function mousedowned(event, ...args) { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, args, true).event(event), + v = d3Selection.select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = d3Selection.pointer(event, currentTarget), + currentTarget = event.currentTarget, + x0 = event.clientX, + y0 = event.clientY; + + d3Drag.dragDisable(event.view); + nopropagation(event); + g.mouse = [p, this.__zoom.invert(p)]; + d3Transition.interrupt(this); + g.start(); + + function mousemoved(event) { + noevent(event); + if (!g.moved) { + var dx = event.clientX - x0, dy = event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.event(event) + .zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3Selection.pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent)); + } + + function mouseupped(event) { + v.on("mousemove.zoom mouseup.zoom", null); + d3Drag.dragEnable(event.view, g.moved); + noevent(event); + g.event(event).end(); + } + } + + function dblclicked(event, ...args) { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = d3Selection.pointer(event.changedTouches ? event.changedTouches[0] : event, this), + p1 = t0.invert(p0), + k1 = t0.k * (event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent); + + noevent(event); + if (duration > 0) d3Selection.select(this).transition().duration(duration).call(schedule, t1, p0, event); + else d3Selection.select(this).call(zoom.transform, t1, p0, event); + } + + function touchstarted(event, ...args) { + if (!filter.apply(this, arguments)) return; + var touches = event.touches, + n = touches.length, + g = gesture(this, args, event.changedTouches.length === n).event(event), + started, i, t, p; + + nopropagation(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = d3Selection.pointer(t, this); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + + if (touchstarting) touchstarting = clearTimeout(touchstarting); + + if (started) { + if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); + d3Transition.interrupt(this); + g.start(); + } + } + + function touchmoved(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, i, t, p, l; + + noevent(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = d3Selection.pointer(t, this); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } + else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + + function touchended(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, i, t; + + nopropagation(event); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. + if (g.taps === 2) { + t = d3Selection.pointer(t, this); + if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { + var p = d3Selection.select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + } + + zoom.wheelDelta = function(_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; + }; + + zoom.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; + }; + + zoom.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; + }; + + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function(_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + + zoom.translateExtent = function(_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + + zoom.constrain = function(_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function(_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + zoom.tapDistance = function(_) { + return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + }; + + return zoom; +} + +exports.zoom = zoom; +exports.zoomIdentity = identity; +exports.zoomTransform = transform; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/node_modules/d3-zoom/dist/d3-zoom.min.js b/node_modules/d3-zoom/dist/d3-zoom.min.js new file mode 100644 index 00000000..50c0b873 --- /dev/null +++ b/node_modules/d3-zoom/dist/d3-zoom.min.js @@ -0,0 +1,2 @@ +// https://d3js.org/d3-zoom/ v2.0.0 Copyright 2020 Mike Bostock +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("d3-dispatch"),require("d3-drag"),require("d3-interpolate"),require("d3-selection"),require("d3-transition")):"function"==typeof define&&define.amd?define(["exports","d3-dispatch","d3-drag","d3-interpolate","d3-selection","d3-transition"],e):e((t=t||self).d3=t.d3||{},t.d3,t.d3,t.d3,t.d3,t.d3)}(this,(function(t,e,n,o,i,r){"use strict";var u=t=>()=>t;function s(t,{sourceEvent:e,target:n,transform:o,dispatch:i}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:o,enumerable:!0,configurable:!0},_:{value:i}})}function h(t,e,n){this.k=t,this.x=e,this.y=n}h.prototype={constructor:h,scale:function(t){return 1===t?this:new h(this.k*t,this.x,this.y)},translate:function(t,e){return 0===t&0===e?this:new h(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var a=new h(1,0,0);function c(t){for(;!t.__zoom;)if(!(t=t.parentNode))return a;return t.__zoom}function l(t){t.stopImmediatePropagation()}function f(t){t.preventDefault(),t.stopImmediatePropagation()}function p(t){return!(t.ctrlKey&&"wheel"!==t.type||t.button)}function m(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t).hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]:[[0,0],[t.clientWidth,t.clientHeight]]}function v(){return this.__zoom||a}function d(t){return-t.deltaY*(1===t.deltaMode?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function y(){return navigator.maxTouchPoints||"ontouchstart"in this}function z(t,e,n){var o=t.invertX(e[0][0])-n[0][0],i=t.invertX(e[1][0])-n[1][0],r=t.invertY(e[0][1])-n[0][1],u=t.invertY(e[1][1])-n[1][1];return t.translate(i>o?(o+i)/2:Math.min(0,o)||Math.max(0,i),u>r?(r+u)/2:Math.min(0,r)||Math.max(0,u))}c.prototype=h.prototype,t.zoom=function(){var t,c,_,g=p,x=m,k=z,w=d,b=y,T=[0,1/0],M=[[-1/0,-1/0],[1/0,1/0]],E=250,Y=o.interpolateZoom,X=e.dispatch("start","zoom","end"),q=0,D=10;function P(t){t.property("__zoom",v).on("wheel.zoom",G).on("mousedown.zoom",O).on("dblclick.zoom",A).filter(b).on("touchstart.zoom",H).on("touchmove.zoom",N).on("touchend.zoom touchcancel.zoom",W).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function V(t,e){return(e=Math.max(T[0],Math.min(T[1],e)))===t.k?t:new h(e,t.x,t.y)}function B(t,e,n){var o=e[0]-n[0]*t.k,i=e[1]-n[1]*t.k;return o===t.x&&i===t.y?t:new h(t.k,o,i)}function j(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function I(t,e,n,o){t.on("start.zoom",(function(){K(this,arguments).event(o).start()})).on("interrupt.zoom end.zoom",(function(){K(this,arguments).event(o).end()})).tween("zoom",(function(){var t=this,i=arguments,r=K(t,i).event(o),u=x.apply(t,i),s=null==n?j(u):"function"==typeof n?n.apply(t,i):n,a=Math.max(u[1][0]-u[0][0],u[1][1]-u[0][1]),c=t.__zoom,l="function"==typeof e?e.apply(t,i):e,f=Y(c.invert(s).concat(a/c.k),l.invert(s).concat(a/l.k));return function(t){if(1===t)t=l;else{var e=f(t),n=a/e[2];t=new h(n,s[0]-e[0]*n,s[1]-e[1]*n)}r.zoom(null,t)}}))}function K(t,e,n){return!n&&t.__zooming||new S(t,e)}function S(t,e){this.that=t,this.args=e,this.active=0,this.sourceEvent=null,this.extent=x.apply(t,e),this.taps=0}function G(t,...e){if(g.apply(this,arguments)){var n=K(this,e).event(t),o=this.__zoom,u=Math.max(T[0],Math.min(T[1],o.k*Math.pow(2,w.apply(this,arguments)))),s=i.pointer(t);if(n.wheel)n.mouse[0][0]===s[0]&&n.mouse[0][1]===s[1]||(n.mouse[1]=o.invert(n.mouse[0]=s)),clearTimeout(n.wheel);else{if(o.k===u)return;n.mouse=[s,o.invert(s)],r.interrupt(this),n.start()}f(t),n.wheel=setTimeout(h,150),n.zoom("mouse",k(B(V(o,u),n.mouse[0],n.mouse[1]),n.extent,M))}function h(){n.wheel=null,n.end()}}function O(t,...e){if(!_&&g.apply(this,arguments)){var o=K(this,e,!0).event(t),u=i.select(t.view).on("mousemove.zoom",p,!0).on("mouseup.zoom",m,!0),s=i.pointer(t,h),h=t.currentTarget,a=t.clientX,c=t.clientY;n.dragDisable(t.view),l(t),o.mouse=[s,this.__zoom.invert(s)],r.interrupt(this),o.start()}function p(t){if(f(t),!o.moved){var e=t.clientX-a,n=t.clientY-c;o.moved=e*e+n*n>q}o.event(t).zoom("mouse",k(B(o.that.__zoom,o.mouse[0]=i.pointer(t,h),o.mouse[1]),o.extent,M))}function m(t){u.on("mousemove.zoom mouseup.zoom",null),n.dragEnable(t.view,o.moved),f(t),o.event(t).end()}}function A(t,...e){if(g.apply(this,arguments)){var n=this.__zoom,o=i.pointer(t.changedTouches?t.changedTouches[0]:t,this),r=n.invert(o),u=n.k*(t.shiftKey?.5:2),s=k(B(V(n,u),o,r),x.apply(this,e),M);f(t),E>0?i.select(this).transition().duration(E).call(I,s,o,t):i.select(this).call(P.transform,s,o,t)}}function H(e,...n){if(g.apply(this,arguments)){var o,u,s,h,a=e.touches,f=a.length,p=K(this,n,e.changedTouches.length===f).event(e);for(l(e),u=0;u () => x; diff --git a/node_modules/d3-zoom/src/event.js b/node_modules/d3-zoom/src/event.js new file mode 100644 index 00000000..0a28790e --- /dev/null +++ b/node_modules/d3-zoom/src/event.js @@ -0,0 +1,14 @@ +export default function ZoomEvent(type, { + sourceEvent, + target, + transform, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + transform: {value: transform, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} diff --git a/node_modules/d3-zoom/src/index.js b/node_modules/d3-zoom/src/index.js new file mode 100644 index 00000000..9cdc0cf8 --- /dev/null +++ b/node_modules/d3-zoom/src/index.js @@ -0,0 +1,2 @@ +export {default as zoom} from "./zoom.js"; +export {default as zoomTransform, identity as zoomIdentity} from "./transform.js"; diff --git a/node_modules/d3-zoom/src/noevent.js b/node_modules/d3-zoom/src/noevent.js new file mode 100644 index 00000000..b32552dc --- /dev/null +++ b/node_modules/d3-zoom/src/noevent.js @@ -0,0 +1,8 @@ +export function nopropagation(event) { + event.stopImmediatePropagation(); +} + +export default function(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} diff --git a/node_modules/d3-zoom/src/transform.js b/node_modules/d3-zoom/src/transform.js new file mode 100644 index 00000000..8e19f1bc --- /dev/null +++ b/node_modules/d3-zoom/src/transform.js @@ -0,0 +1,51 @@ +export function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; +} + +Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function(x) { + return x * this.k + this.x; + }, + applyY: function(y) { + return y * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x) { + return (x - this.x) / this.k; + }, + invertY: function(y) { + return (y - this.y) / this.k; + }, + rescaleX: function(x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function(y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } +}; + +export var identity = new Transform(1, 0, 0); + +transform.prototype = Transform.prototype; + +export default function transform(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity; + return node.__zoom; +} diff --git a/node_modules/d3-zoom/src/zoom.js b/node_modules/d3-zoom/src/zoom.js new file mode 100644 index 00000000..93059bd8 --- /dev/null +++ b/node_modules/d3-zoom/src/zoom.js @@ -0,0 +1,447 @@ +import {dispatch} from "d3-dispatch"; +import {dragDisable, dragEnable} from "d3-drag"; +import {interpolateZoom} from "d3-interpolate"; +import {select, pointer} from "d3-selection"; +import {interrupt} from "d3-transition"; +import constant from "./constant.js"; +import ZoomEvent from "./event.js"; +import {Transform, identity} from "./transform.js"; +import noevent, {nopropagation} from "./noevent.js"; + +// Ignore right-click, since that should open the context menu. +// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event +function defaultFilter(event) { + return (!event.ctrlKey || event.type === 'wheel') && !event.button; +} + +function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; +} + +function defaultTransform() { + return this.__zoom || identity; +} + +function defaultWheelDelta(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1); +} + +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function defaultConstrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); +} + +export default function() { + var filter = defaultFilter, + extent = defaultExtent, + constrain = defaultConstrain, + wheelDelta = defaultWheelDelta, + touchable = defaultTouchable, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = interpolateZoom, + listeners = dispatch("start", "zoom", "end"), + touchstarting, + touchfirst, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0, + tapDistance = 10; + + function zoom(selection) { + selection + .property("__zoom", defaultTransform) + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .filter(touchable) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + zoom.transform = function(collection, transform, point, event) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); + if (collection !== selection) { + schedule(collection, transform, point, event); + } else { + selection.interrupt().each(function() { + gesture(this, arguments) + .event(event) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function(selection, k, p, event) { + zoom.scaleTo(selection, function() { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p, event); + }; + + zoom.scaleTo = function(selection, k, p, event) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p, event); + }; + + zoom.translateBy = function(selection, x, y, event) { + zoom.transform(selection, function() { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments), translateExtent); + }, null, event); + }; + + zoom.translateTo = function(selection, x, y, p, event) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p, event); + }; + + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition, transform, point, event) { + transition + .on("start.zoom", function() { gesture(this, arguments).event(event).start(); }) + .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).event(event).end(); }) + .tween("zoom", function() { + var that = this, + args = arguments, + g = gesture(that, args).event(event), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } + g.zoom(null, t); + }; + }); + } + + function gesture(that, args, clean) { + return (!clean && that.__zooming) || new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.sourceEvent = null; + this.extent = extent.apply(that, args); + this.taps = 0; + } + + Gesture.prototype = { + event: function(event) { + if (event) this.sourceEvent = event; + return this; + }, + start: function() { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function(type) { + var d = select(this.that).datum(); + listeners.call( + type, + this.that, + new ZoomEvent(type, { + sourceEvent: this.sourceEvent, + target: zoom, + type, + transform: this.that.__zoom, + dispatch: listeners + }), + d + ); + } + }; + + function wheeled(event, ...args) { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, args).event(event), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = pointer(event); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } + + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; + + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + interrupt(this); + g.start(); + } + + noevent(event); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } + + function mousedowned(event, ...args) { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, args, true).event(event), + v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = pointer(event, currentTarget), + currentTarget = event.currentTarget, + x0 = event.clientX, + y0 = event.clientY; + + dragDisable(event.view); + nopropagation(event); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt(this); + g.start(); + + function mousemoved(event) { + noevent(event); + if (!g.moved) { + var dx = event.clientX - x0, dy = event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.event(event) + .zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent)); + } + + function mouseupped(event) { + v.on("mousemove.zoom mouseup.zoom", null); + dragEnable(event.view, g.moved); + noevent(event); + g.event(event).end(); + } + } + + function dblclicked(event, ...args) { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this), + p1 = t0.invert(p0), + k1 = t0.k * (event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent); + + noevent(event); + if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event); + else select(this).call(zoom.transform, t1, p0, event); + } + + function touchstarted(event, ...args) { + if (!filter.apply(this, arguments)) return; + var touches = event.touches, + n = touches.length, + g = gesture(this, args, event.changedTouches.length === n).event(event), + started, i, t, p; + + nopropagation(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer(t, this); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + + if (touchstarting) touchstarting = clearTimeout(touchstarting); + + if (started) { + if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); + interrupt(this); + g.start(); + } + } + + function touchmoved(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, i, t, p, l; + + noevent(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer(t, this); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } + else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + + function touchended(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, i, t; + + nopropagation(event); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. + if (g.taps === 2) { + t = pointer(t, this); + if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { + var p = select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + } + + zoom.wheelDelta = function(_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; + }; + + zoom.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; + }; + + zoom.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; + }; + + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function(_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + + zoom.translateExtent = function(_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + + zoom.constrain = function(_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function(_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + zoom.tapDistance = function(_) { + return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + }; + + return zoom; +} diff --git a/node_modules/d3/CHANGES.md b/node_modules/d3/CHANGES.md new file mode 100644 index 00000000..b5592445 --- /dev/null +++ b/node_modules/d3/CHANGES.md @@ -0,0 +1,1643 @@ +# Changes in D3 6.0 + +[Released August 26, 2020.](https://github.com/d3/d3/releases/tag/v6.0.0) + +*This document covers only major changes. For minor and patch changes, please see the [release notes](https://github.com/d3/d3/releases).* + +D3 now **uses native collections** (Map and Set) and **accepts iterables**. [d3.group and d3.rollup](https://observablehq.com/@d3/d3-group) are powerful new aggregation functions that replace d3.nest and work great [with d3-hierarchy](https://observablehq.com/d/9a453665f405eebf) and d3-selection. There are lots of new helpers in d3-array, too, such as [d3.greatest](https://observablehq.com/@d3/d3-least), [d3.quickselect](https://observablehq.com/@d3/d3-quickselect), and [d3.fsum](https://observablehq.com/@d3/d3-fsum). + +D3 now **passes events directly to listeners**, replacing the d3.event global and bringing D3 inline with vanilla JavaScript and most other frameworks. + +**d3-delaunay** (based on Vladimir Agafonkin’s excellent [Delaunator](https://github.com/mapbox/delaunator)) replaces d3-voronoi, offering dramatic improvements to performance, robustness, and [search](https://observablehq.com/@d3/delaunay-find). And there’s a new [d3-geo-voronoi](https://github.com/Fil/d3-geo-voronoi) for spherical (geographical) data! **d3-random** is [greatly expanded](https://github.com/d3/d3-random/blob/master/README.md) and includes a fast [linear congruential generator](https://observablehq.com/@d3/d3-randomlcg) for seeded randomness. **d3-chord** has new layouts for [directed](https://observablehq.com/@d3/directed-chord-diagram) and transposed chord diagrams. **d3-scale** adds a new [radial scale](https://observablehq.com/@d3/radial-stacked-bar-chart-ii) type. + +… and a variety of other small enhancements. [More than 450 examples](https://observablehq.com/@d3/gallery) have been updated to D3 6.0! + +### d3-array + +* Accept iterables. +* Add [d3.group](https://github.com/d3/d3-array/blob/master/README.md#group). +* Add [d3.groups](https://github.com/d3/d3-array/blob/master/README.md#groups). +* Add [d3.index](https://github.com/d3/d3-array/blob/master/README.md#index). +* Add [d3.indexes](https://github.com/d3/d3-array/blob/master/README.md#indexes). +* Add [d3.rollup](https://github.com/d3/d3-array/blob/master/README.md#rollup). +* Add [d3.rollups](https://github.com/d3/d3-array/blob/master/README.md#rollups). +* Add [d3.maxIndex](https://github.com/d3/d3-array/blob/master/README.md#maxIndex). +* Add [d3.minIndex](https://github.com/d3/d3-array/blob/master/README.md#minIndex). +* Add [d3.greatest](https://github.com/d3/d3-array/blob/master/README.md#greatest). +* Add [d3.greatestIndex](https://github.com/d3/d3-array/blob/master/README.md#greatestIndex). +* Add [d3.least](https://github.com/d3/d3-array/blob/master/README.md#least). +* Add [d3.leastIndex](https://github.com/d3/d3-array/blob/master/README.md#leastIndex). +* Add [d3.bin](https://github.com/d3/d3-array/blob/master/README.md#bin). +* Add [d3.count](https://github.com/d3/d3-array/blob/master/README.md#count). +* Add [d3.cumsum](https://github.com/d3/d3-array/blob/master/README.md#cumsum). +* Add [d3.fsum](https://github.com/d3/d3-array/blob/master/README.md#fsum). +* Add [d3.Adder](https://github.com/d3/d3-array/blob/master/README.md#Adder). +* Add [d3.quantileSorted](https://github.com/d3/d3-array/blob/master/README.md#quantileSorted). +* Add [d3.quickselect](https://github.com/d3/d3-array/blob/master/README.md#quickselect). +* Add [*bisector*.center](https://github.com/d3/d3-array/blob/master/README.md#bisector_center). +* Allow more than two iterables for [d3.cross](https://github.com/d3/d3-array/blob/master/README.md#cross). +* Accept non-sorted input with [d3.quantile](https://github.com/d3/d3-array/blob/master/README.md#quantile). +* Fix a *array*.sort bug in Safari. +* Fix bin thresholds to ignore NaN input. +* Fix [d3.ticks](https://github.com/d3/d3-array/blob/master/README.md#ticks) to not return ticks outside the domain. +* Improve the performance of [d3.median](https://github.com/d3/d3-array/blob/master/README.md#median). + +See https://observablehq.com/@d3/d3-array-2-0 for details. + +### d3-brush + +* Add [*event*.mode](https://github.com/d3/d3-brush/blob/master/README.md#brush-events). +* Change [*brush*.on](https://github.com/d3/d3-brush/blob/master/README.md#brush_on) to pass the *event* directly to listeners. +* Improve multitouch (two-touch) interaction. + +### d3-chord + +* Add [d3.chordDirected](https://github.com/d3/d3-chord/blob/master/README.md#chordDirected). +* Add [d3.chordTranspose](https://github.com/d3/d3-chord/blob/master/README.md#chordTranspose). +* Add [d3.ribbonArrow](https://github.com/d3/d3-chord/blob/master/README.md#ribbonArrow). +* Add [*ribbon*.padAngle](https://github.com/d3/d3-chord/blob/master/README.md#ribbon_padAngle). +* Add [*ribbon*.sourceRadius](https://github.com/d3/d3-chord/blob/master/README.md#ribbon_sourceRadius). +* Add [*ribbon*.targetRadius](https://github.com/d3/d3-chord/blob/master/README.md#ribbon_targetRadius). + +### d3-delaunay + +* Add [d3.Delaunay](https://github.com/d3/d3-delaunay/blob/master/README.md). + +### d3-drag + +* Change [*drag*.on](https://github.com/d3/d3-drag/blob/master/README.md#drag_on) to pass the *event* directly to listeners. + +### d3-force + +* Add *iterations* argument to [*simulation*.tick](https://github.com/d3/d3-force/blob/master/README.md#simulation_tick). +* Add [*forceCenter*.strength](https://github.com/d3/d3-force/blob/master/README.md#center_strength). +* Add [*forceSimulation*.randomSource](https://github.com/d3/d3-force/blob/master/README.md#simulation_randomSource). +* All built-in forces are now fully deterministic (including “jiggling†coincident nodes). +* Improve the default phyllotaxis layout slightly by offsetting by one half-radius. +* Improve the error message when a link references an unknown node. +* [*force*.initialize](https://github.com/d3/d3-force/blob/master/README.md#force_initialize) is now passed a random source. +* Fix bug when initializing nodes with fixed positions. + +### d3-format + +* Change the default minus sign to the minus sign (−) instead of hyphen-minus (-). +* Fix decimal `d` formatting of numbers greater than or equal to 1e21. + +### d3-geo + +* Fix clipping of some degenerate polygons. + +### d3-hierarchy + +* Accept iterables. +* Add [*node*[Symbol.iterator]](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_iterator); hierarchies are now iterable. +* Add [*node*.find](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_find). +* Change [*node*.each](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_each) to pass the traversal index. +* Change [*node*.eachAfter](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_eachAfter) to pass the traversal index. +* Change [*node*.eachBefore](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_eachBefore) to pass the traversal index. +* Fix [d3.packSiblings](https://github.com/d3/d3-hierarchy/blob/master/README.md#packSiblings) for huge circles. +* Fix divide-by-zero bug in [d3.treemapBinary](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemapBinary). +* Fix divide-by-zero bug in [d3.treemapResquarify](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemapResquarify). + +### d3-interpolate + +* Add [*interpolateZoom*.rho](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateZoom_rho). (#25) +* Allow [d3.piecewise](https://github.com/d3/d3-interpolate/blob/master/README.md#piecewise) to default to using d3.interpolate. #90 +* Change [d3.interpolateTransformCss](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateTransformCss) to use DOMMatrix and require absolute units. #83 + +### d3-quadtree + +* Fix an infinite loop when coordinates diverge to huge values. + +### d3-random + +* Add [d3.randomLcg](https://github.com/d3/d3-random/blob/master/README.md#randomLcg). +* Add [d3.randomGamma](https://github.com/d3/d3-random/blob/master/README.md#randomGamma). +* Add [d3.randomBeta](https://github.com/d3/d3-random/blob/master/README.md#randomBeta). +* Add [d3.randomWeibull](https://github.com/d3/d3-random/blob/master/README.md#randomWeibull). +* Add [d3.randomCauchy](https://github.com/d3/d3-random/blob/master/README.md#randomCauchy). +* Add [d3.randomLogistic](https://github.com/d3/d3-random/blob/master/README.md#randomLogistic). +* Add [d3.randomPoisson](https://github.com/d3/d3-random/blob/master/README.md#randomPoisson). +* Add [d3.randomInt](https://github.com/d3/d3-random/blob/master/README.md#randomInt). +* Add [d3.randomBinomial](https://github.com/d3/d3-random/blob/master/README.md#randomBinomial). +* Add [d3.randomGeometric](https://github.com/d3/d3-random/blob/master/README.md#randomGeometric). +* Add [d3.randomPareto](https://github.com/d3/d3-random/blob/master/README.md#randomPareto). +* Add [d3.randomBernoulli](https://github.com/d3/d3-random/blob/master/README.md#randomBernoulli). +* Allow [d3.randomBates](https://github.com/d3/d3-random/blob/master/README.md#randomBates) to take fractional *n*. +* Allow [d3.randomIrwinHall](https://github.com/d3/d3-random/blob/master/README.md#randomIrwinHall) to take fractional *n*. +* Don’t wrap Math.random in the default source. + +Thanks to @Lange, @p-v-d-Veeken, @svanschooten, @Parcly-Taxel and @jrus for your contributions! + +### d3-scale + +* Accept iterables. +* Add [*diverging*.rangeRound](https://github.com/d3/d3-scale/blob/master/README.md#diverging_rangeRound). +* Add [*sequential*.range](https://github.com/d3/d3-scale/blob/master/README.md#sequential_range) (for compatibility with d3-axis). +* Add [*sequential*.rangeRound](https://github.com/d3/d3-scale/blob/master/README.md#sequential_rangeRound). +* Add [*sequentialQuantile*.quantiles](https://github.com/d3/d3-scale/blob/master/README.md#sequentialQuantile_quantiles). +* Add [d3.scaleRadial](https://github.com/d3/d3-scale/blob/master/README.md#radial-scales). +* [*diverging*.range](https://github.com/d3/d3-scale/blob/master/README.md#diverging_range) can now be used to set the interpolator. +* [*sequential*.range](https://github.com/d3/d3-scale/blob/master/README.md#sequential_range) can now be used to set the interpolator. +* [d3.scaleDiverging](https://github.com/d3/d3-scale/blob/master/README.md#diverging-scales) can now accept a range array in place of an interpolator. +* [d3.scaleSequential](https://github.com/d3/d3-scale/blob/master/README.md#sequential-scales) can now accept a range array in place of an interpolator. +* Fix [*continuous*.nice](https://github.com/d3/d3-scale/blob/master/README.md#continuous_nice) to ensure that niced domains always span ticks. +* Fix [*log*.ticks](https://github.com/d3/d3-scale/blob/master/README.md#log_ticks) for small domains. +* Fix [*log*.ticks](https://github.com/d3/d3-scale/blob/master/README.md#log_ticks) for small domains. #44 +* Fix [*scale*.clamp](https://github.com/d3/d3-scale/blob/master/README.md#continuous_clamp) for [sequential quantile scales](https://github.com/d3/d3-scale/blob/master/README.md#scaleSequentialQuantile). Thanks, @Fil! +* Fix [*scale*.clamp](https://github.com/d3/d3-scale/blob/master/README.md#continuous_clamp) for continuous scales with more domain values than range values. +* Fix [diverging scales](https://github.com/d3/d3-scale/blob/master/README.md#diverging-scales) with descending domains. +* Remove deprecated *step* argument from [*time*.ticks](https://github.com/d3/d3-scale/blob/master/README.md#time_ticks) and [*time*.nice](https://github.com/d3/d3-scale/blob/master/README.md#time_nice). + +### d3-selection + +* Add [*selection*.selectChild](https://github.com/d3/d3-selection/blob/master/README.md#selection_selectChild). +* Add [*selection*.selectChildren](https://github.com/d3/d3-selection/blob/master/README.md#selection_selectChildren). +* Add [d3.pointer](https://github.com/d3/d3-selection/blob/master/README.md#pointer). +* Add [d3.pointers](https://github.com/d3/d3-selection/blob/master/README.md#pointers). +* Add *selection*[Symbol.iterator]; selections are now iterable! +* Accept iterables with [*selection*.data](https://github.com/d3/d3-selection/blob/master/README.md#selection_data). +* Accept iterables with [d3.selectAll](https://github.com/d3/d3-selection/blob/master/README.md#selectAll). +* Change [*selection*.on](https://github.com/d3/d3-selection/blob/master/README.md#selection_on) to pass the *event* directly to listeners. +* Remove index and group from *selection*.on listeners! +* Remove d3.event! +* Remove d3.mouse. +* Remove d3.touch. +* Remove d3.touches. +* Remove d3.customEvent. +* Remove d3.clientPoint. +* Remove d3.sourceEvent. +* Fix *selection*.merge(*transition*) to error. + +For an overview of changes, see https://observablehq.com/@d3/d3-selection-2-0. + +### d3-shape + +* Accept iterables. +* Add [d3.line](https://github.com/d3/d3-shape/blob/master/README.md#line)(*x*, *y*) shorthand. +* Add [d3.area](https://github.com/d3/d3-shape/blob/master/README.md#area)(*x*, *y0*, *y1*) shorthand. +* Add [d3.symbol](https://github.com/d3/d3-shape/blob/master/README.md#symbol)(*type*, *size*) shorthand. + +### d3-time-format + +* Add ISO 8601 “week year†(`%G` and `%g`). + +### d3-timer + +* Fix [*interval*.restart](https://github.com/d3/d3-timer/blob/master/README.md#timer_restart) to restart as an interval. + +### d3-transition + +* Add [*transition*.easeVarying](https://github.com/d3/d3-transition/blob/master/README.md#transition_easeVarying). +* Add *transition*[Symbol.iterator]; transitions are now iterable. +* Fix [*selection*.transition](https://github.com/d3/d3-transition/blob/master/README.md#selection_transition) to error if the named transition to inherit is not found.k +* Fix [*transition*.end](https://github.com/d3/d3-transition/blob/master/README.md#transition_end) to resolve immediately if the selection is empty. + +### d3-zoom + +* Add [*zoom*.tapDistance](https://github.com/d3/d3-zoom/blob/master/README.md#zoom_tapDistance). +* Change [*zoom*.on](https://github.com/d3/d3-zoom/blob/master/README.md#zoom_on) to pass the *event* directly to listeners. +* Change the default [*zoom*.filter](https://github.com/d3/d3-zoom/blob/master/README.md#zoom_filter) to observe *wheel* events if the control key is pressed. +* Change the default [*zoom*.wheelDelta](ttps://github.com/d3/d3-zoom/blob/master/README.md#zoom_wheelDelta) to go faster if the control key is pressed. +* Don‘t set touch-action: none. +* Upgrade to [d3-selection 2](https://observablehq.com/@d3/d3-selection-2-0). + +### Breaking Changes + +D3 6.0 introduces several non-backwards-compatible changes. + +* Remove [d3.event](https://observablehq.com/d/f91cccf0cad5e9cb#events). +* Change [*selection*.on](https://observablehq.com/d/f91cccf0cad5e9cb#events) to pass the *event* directly to listeners. +* Change [*transition*.on](https://observablehq.com/d/f91cccf0cad5e9cb#events) to pass the *event* directly to listeners. +* Change [*brush*.on](https://observablehq.com/d/f91cccf0cad5e9cb#event_brush) to pass the *event* directly to listeners. +* Change [*drag*.on](https://observablehq.com/d/f91cccf0cad5e9cb#event_drag) to pass the *event* directly to listeners. +* Change [*zoom*.on](https://observablehq.com/d/f91cccf0cad5e9cb#event_zoom) to pass the *event* directly to listeners. +* Remove d3.mouse; use [d3.pointer](https://observablehq.com/d/f91cccf0cad5e9cb#pointer). +* Remove d3.touch; use [d3.pointer](https://observablehq.com/d/f91cccf0cad5e9cb#pointer). +* Remove d3.touches; use [d3.pointers](https://observablehq.com/d/f91cccf0cad5e9cb#pointer). +* Remove d3.clientPoint; use [d3.pointer](https://observablehq.com/d/f91cccf0cad5e9cb#pointer). +* Remove d3.voronoi; use [d3.Delaunay](https://observablehq.com/d/f91cccf0cad5e9cb#delaunay). +* Remove d3.nest; use [d3.group](https://observablehq.com/d/f91cccf0cad5e9cb#group) and [d3.rollup](https://observablehq.com/d/f91cccf0cad5e9cb#group). +* Remove d3.map; use [Map](https://observablehq.com/d/f91cccf0cad5e9cb#collection). +* Remove d3.set; use [Set](https://observablehq.com/d/f91cccf0cad5e9cb#collection). +* Remove d3.keys; use [Object.keys](https://observablehq.com/d/f91cccf0cad5e9cb#collection). +* Remove d3.values; use [Object.values](https://observablehq.com/d/f91cccf0cad5e9cb#collection). +* Remove d3.entries; use [Object.entries](https://observablehq.com/d/f91cccf0cad5e9cb#collection). +* Rename d3.histogram to [d3.bin](https://observablehq.com/d/f91cccf0cad5e9cb#bin). +* Rename d3.scan to [d3.leastIndex](https://observablehq.com/d/f91cccf0cad5e9cb#leastIndex). +* Change [d3.interpolateTransformCss](https://observablehq.com/d/f91cccf0cad5e9cb#interpolateTransformCss) to require absolute units. +* Change [d3.format](https://observablehq.com/d/f91cccf0cad5e9cb#minus) to default to the minus sign instead of hyphen-minus for negative values. + +D3 now requires a browser that supports [ES2015](http://www.ecma-international.org/ecma-262/6.0/). For older browsers, you must bring your own transpiler. + +Lastly, support for [Bower](https://bower.io) has been dropped; D3 is now exclusively published to npm and GitHub. + +See our [migration guide](https://observablehq.com/d/f91cccf0cad5e9cb) for help upgrading. + +# Changes in D3 5.0 + +[Released March 22, 2018.](https://github.com/d3/d3/releases/tag/v5.0.0) + +D3 5.0 introduces only a few non-backwards-compatible changes. + +D3 now uses [Promises](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Using_promises) instead of asynchronous callbacks to load data. Promises simplify the structure of asynchronous code, especially in modern browsers that support [async and await](https://javascript.info/async-await). (See this [introduction to promises](https://observablehq.com/@observablehq/introduction-to-promises) on [Observable](https://observablehq.com).) For example, to load a CSV file in v4, you might say: + +```js +d3.csv("file.csv", function(error, data) { + if (error) throw error; + console.log(data); +}); +``` + +In v5, using promises: + +```js +d3.csv("file.csv").then(function(data) { + console.log(data); +}); +``` + +Note that you don’t need to rethrow the error—the promise will reject automatically, and you can *promise*.catch if desired. Using await, the code is even simpler: + +```js +const data = await d3.csv("file.csv"); +console.log(data); +``` + +With the adoption of promises, D3 now uses the [Fetch API](https://fetch.spec.whatwg.org/) instead of [XMLHttpRequest](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest): the [d3-request](https://github.com/d3/d3-request) module has been replaced by [d3-fetch](https://github.com/d3/d3-fetch). Fetch supports many powerful new features, such as [streaming responses](https://observablehq.com/@mbostock/streaming-shapefiles). D3 5.0 also deprecates and removes the [d3-queue](https://github.com/d3/d3-queue) module. Use [Promise.all](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) to run a batch of asynchronous tasks in parallel, or a helper library such as [p-queue](https://github.com/sindresorhus/p-queue) to [control concurrency](https://observablehq.com/@mbostock/hello-p-queue). + +D3 no longer provides the d3.schemeCategory20* categorical color schemes. These twenty-color schemes were flawed because their grouped design could falsely imply relationships in the data: a shared hue can imply that the encoded data are part of a group (a super-category), while relative lightness can imply order. Instead, D3 now includes [d3-scale-chromatic](https://github.com/d3/d3-scale-chromatic), which implements excellent schemes from ColorBrewer, including [categorical](https://github.com/d3/d3-scale-chromatic/blob/master/README.md#categorical), [diverging](https://github.com/d3/d3-scale-chromatic/blob/master/README.md#diverging), [sequential single-hue](https://github.com/d3/d3-scale-chromatic/blob/master/README.md#sequential-single-hue) and [sequential multi-hue](https://github.com/d3/d3-scale-chromatic/blob/master/README.md#sequential-multi-hue) schemes. These schemes are available in both discrete and continuous variants. + +D3 now provides implementations of [marching squares](https://observablehq.com/@d3/contours) and [density estimation](https://observablehq.com/@d3/density-contours) via [d3-contour](https://github.com/d3/d3-contour)! There are two new [d3-selection](https://github.com/d3/d3-selection) methods: [*selection*.clone](https://github.com/d3/d3-selection/blob/master/README.md#selection_clone) for inserting clones of the selected nodes, and [d3.create](https://github.com/d3/d3-selection/blob/master/README.md#create) for creating detached elements. [Geographic projections](https://github.com/d3/d3-geo) now support [*projection*.angle](https://github.com/d3/d3-geo/blob/master/README.md#projection_angle), which has enabled several fantastic new [polyhedral projections](https://github.com/d3/d3-geo-polygon) by Philippe Rivière. + +Lastly, D3’s [package.json](https://github.com/d3/d3/blob/master/package.json) no longer pins exact versions of the dependent D3 modules. This fixes an issue with [duplicate installs](https://github.com/d3/d3/issues/3256) of D3 modules. + +# Changes in D3 4.0 + +[Released June 28, 2016.](https://github.com/d3/d3/releases/tag/v4.0.0) + +D3 4.0 is modular. Instead of one library, D3 is now [many small libraries](#table-of-contents) that are designed to work together. You can pick and choose which parts to use as you see fit. Each library is maintained in its own repository, allowing decentralized ownership and independent release cycles. The default bundle combines about thirty of these microlibraries. + +```html + +``` + +As before, you can load optional plugins on top of the default bundle, such as [ColorBrewer scales](https://github.com/d3/d3-scale-chromatic): + +```html + + +``` + +You are not required to use the default bundle! If you’re just using [d3-selection](https://github.com/d3/d3-selection), use it as a standalone library. Like the default bundle, you can load D3 microlibraries using vanilla script tags or RequireJS (great for HTTP/2!): + +```html + +``` + +You can also `cat` D3 microlibraries into a custom bundle, or use tools such as [Webpack](https://webpack.github.io/) and [Rollup](http://rollupjs.org/) to create [optimized bundles](https://bl.ocks.org/mbostock/bb09af4c39c79cffcde4). Custom bundles are great for applications that use a subset of D3’s features; for example, a React chart library might use D3 for scales and shapes, and React to manipulate the DOM. The D3 microlibraries are written as [ES6 modules](http://www.2ality.com/2014/09/es6-modules-final.html), and Rollup lets you pick at the symbol level to produce smaller bundles. + +Small files are nice, but modularity is also about making D3 more *fun*. Microlibraries are easier to understand, develop and test. They make it easier for new people to get involved and contribute. They reduce the distinction between a “core module†and a “pluginâ€, and increase the pace of development in D3 features. + +If you don’t care about modularity, you can mostly ignore this change and keep using the default bundle. However, there is one unavoidable consequence of adopting ES6 modules: every symbol in D3 4.0 now shares a flat namespace rather than the nested one of D3 3.x. For example, d3.scale.linear is now d3.scaleLinear, and d3.layout.treemap is now d3.treemap. The adoption of ES6 modules also means that D3 is now written exclusively in [strict mode](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode) and has better readability. And there have been many other significant improvements to D3’s features! (Nearly all of the code from D3 3.x has been rewritten.) These changes are covered below. + +### Other Global Changes + +The default [UMD bundle](https://github.com/umdjs/umd) is now [anonymous](https://github.com/requirejs/requirejs/wiki/Updating-existing-libraries#register-as-an-anonymous-module-). No `d3` global is exported if AMD or CommonJS is detected. In a vanilla environment, the D3 microlibraries share the `d3` global, even if you load them independently; thus, code you write is the same whether or not you use the default bundle. (See [Let’s Make a (D3) Plugin](https://bost.ocks.org/mike/d3-plugin/) for more.) The generated bundle is no longer stored in the Git repository; Bower has been repointed to [d3-bower](https://github.com/mbostock-bower/d3-bower), and you can find the generated files on [npm](https://unpkg.com/d3) or attached to the [latest release](https://github.com/d3/d3/releases/latest). The non-minified default bundle is no longer mangled, making it more readable and preserving inline comments. + +To the consternation of some users, 3.x employed Unicode variable names such as λ, φ, Ï„ and Ï€ for a concise representation of mathematical operations. A downside of this approach was that a SyntaxError would occur if you loaded the non-minified D3 using ISO-8859-1 instead of UTF-8. 3.x also used Unicode string literals, such as the SI-prefix µ for 1e-6. 4.0 uses only ASCII variable names and ASCII string literals (see [rollup-plugin-ascii](https://github.com/mbostock/rollup-plugin-ascii)), avoiding encoding problems. + +### Table of Contents + +* [Arrays](#arrays-d3-array) +* [Axes](#axes-d3-axis) +* [Brushes](#brushes-d3-brush) +* [Chords](#chords-d3-chord) +* [Collections](#collections-d3-collection) +* [Colors](#colors-d3-color) +* [Dispatches](#dispatches-d3-dispatch) +* [Dragging](#dragging-d3-drag) +* [Delimiter-Separated Values](#delimiter-separated-values-d3-dsv) +* [Easings](#easings-d3-ease) +* [Forces](#forces-d3-force) +* [Number Formats](#number-formats-d3-format) +* [Geographies](#geographies-d3-geo) +* [Hierarchies](#hierarchies-d3-hierarchy) +* [Internals](#internals) +* [Interpolators](#interpolators-d3-interpolate) +* [Paths](#paths-d3-path) +* [Polygons](#polygons-d3-polygon) +* [Quadtrees](#quadtrees-d3-quadtree) +* [Queues](#queues-d3-queue) +* [Random Numbers](#random-numbers-d3-random) +* [Requests](#requests-d3-request) +* [Scales](#scales-d3-scale) +* [Selections](#selections-d3-selection) +* [Shapes](#shapes-d3-shape) +* [Time Formats](#time-formats-d3-time-format) +* [Time Intervals](#time-intervals-d3-time) +* [Timers](#timers-d3-timer) +* [Transitions](#transitions-d3-transition) +* [Voronoi Diagrams](#voronoi-diagrams-d3-voronoi) +* [Zooming](#zooming-d3-zoom) + +## [Arrays (d3-array)](https://github.com/d3/d3-array/blob/master/README.md) + +The new [d3.scan](https://github.com/d3/d3-array/blob/master/README.md#scan) method performs a linear scan of an array, returning the index of the least element according to the specified comparator. This is similar to [d3.min](https://github.com/d3/d3-array/blob/master/README.md#min) and [d3.max](https://github.com/d3/d3-array/blob/master/README.md#max), except you can use it to find the position of an extreme element, rather than just calculate an extreme value. + +```js +var data = [ + {name: "Alice", value: 2}, + {name: "Bob", value: 3}, + {name: "Carol", value: 1}, + {name: "Dwayne", value: 5} +]; + +var i = d3.scan(data, function(a, b) { return a.value - b.value; }); // 2 +data[i]; // {name: "Carol", value: 1} +``` + +The new [d3.ticks](https://github.com/d3/d3-array/blob/master/README.md#ticks) and [d3.tickStep](https://github.com/d3/d3-array/blob/master/README.md#tickStep) methods are useful for generating human-readable numeric ticks. These methods are a low-level alternative to [*continuous*.ticks](https://github.com/d3/d3-scale/blob/master/README.md#continuous_ticks) from [d3-scale](https://github.com/d3/d3-scale). The new implementation is also more accurate, returning the optimal number of ticks as measured by relative error. + +```js +var ticks = d3.ticks(0, 10, 5); // [0, 2, 4, 6, 8, 10] +``` + +The [d3.range](https://github.com/d3/d3-array/blob/master/README.md#range) method no longer makes an elaborate attempt to avoid floating-point error when *step* is not an integer. The returned values are strictly defined as *start* + *i* \* *step*, where *i* is an integer. (Learn more about [floating point math](http://0.30000000000000004.com/).) d3.range returns the empty array for infinite ranges, rather than throwing an error. + +The method signature for optional accessors has been changed to be more consistent with array methods such as [*array*.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach): the accessor is passed the current element (*d*), the index (*i*), and the array (*data*), with *this* as undefined. This affects [d3.min](https://github.com/d3/d3-array/blob/master/README.md#min), [d3.max](https://github.com/d3/d3-array/blob/master/README.md#max), [d3.extent](https://github.com/d3/d3-array/blob/master/README.md#extent), [d3.sum](https://github.com/d3/d3-array/blob/master/README.md#sum), [d3.mean](https://github.com/d3/d3-array/blob/master/README.md#mean), [d3.median](https://github.com/d3/d3-array/blob/master/README.md#median), [d3.quantile](https://github.com/d3/d3-array/blob/master/README.md#quantile), [d3.variance](https://github.com/d3/d3-array/blob/master/README.md#variance) and [d3.deviation](https://github.com/d3/d3-array/blob/master/README.md#deviation). The [d3.quantile](https://github.com/d3/d3-array/blob/master/README.md#quantile) method previously did not take an accessor. Some methods with optional arguments now treat those arguments as missing if they are null or undefined, rather than strictly checking arguments.length. + +The new [d3.histogram](https://github.com/d3/d3-array/blob/master/README.md#histograms) API replaces d3.layout.histogram. Rather than exposing *bin*.x and *bin*.dx on each returned bin, the histogram exposes *bin*.x0 and *bin*.x1, guaranteeing that *bin*.x0 is exactly equal to *bin*.x1 on the preceding bin. The “frequency†and “probability†modes are no longer supported; each bin is simply an array of elements from the input data, so *bin*.length is equal to D3 3.x’s *bin*.y in frequency mode. To compute a probability distribution, divide the number of elements in each bin by the total number of elements. + +The *histogram*.range method has been renamed [*histogram*.domain](https://github.com/d3/d3-array/blob/master/README.md#histogram_domain) for consistency with scales. The *histogram*.bins method has been renamed [*histogram*.thresholds](https://github.com/d3/d3-array/blob/master/README.md#histogram_thresholds), and no longer accepts an upper value: *n* thresholds will produce *n* + 1 bins. If you specify a desired number of bins rather than thresholds, d3.histogram now uses [d3.ticks](https://github.com/d3/d3-array/blob/master/README.md#ticks) to compute nice bin thresholds. In addition to the default Sturges’ formula, D3 now implements the [Freedman-Diaconis rule](https://github.com/d3/d3-array/blob/master/README.md#thresholdFreedmanDiaconis) and [Scott’s normal reference rule](https://github.com/d3/d3-array/blob/master/README.md#thresholdScott). + +## [Axes (d3-axis)](https://github.com/d3/d3-axis/blob/master/README.md) + +To render axes properly in D3 3.x, you needed to style them: + +```html + + +``` + +If you didn’t, you saw this: + + + +D3 4.0 provides default styles and shorter syntax. In place of d3.svg.axis and *axis*.orient, D3 4.0 now provides four constructors for each orientation: [d3.axisTop](https://github.com/d3/d3-axis/blob/master/README.md#axisTop), [d3.axisRight](https://github.com/d3/d3-axis/blob/master/README.md#axisRight), [d3.axisBottom](https://github.com/d3/d3-axis/blob/master/README.md#axisBottom), [d3.axisLeft](https://github.com/d3/d3-axis/blob/master/README.md#axisLeft). These constructors accept a scale, so you can reduce all of the above to: + +```html + +``` + +And get this: + + + +As before, you can customize the axis appearance either by applying stylesheets or by modifying the axis elements. The default appearance has been changed slightly to offset the axis by a half-pixel; this fixes a crisp-edges rendering issue on Safari where the axis would be drawn two-pixels thick. + +There’s now an [*axis*.tickArguments](https://github.com/d3/d3-axis/blob/master/README.md#axis_tickArguments) method, as an alternative to [*axis*.ticks](https://github.com/d3/d3-axis/blob/master/README.md#axis_ticks) that also allows the axis tick arguments to be inspected. The [*axis*.tickSize](https://github.com/d3/d3-axis/blob/master/README.md#axis_tickSize) method has been changed to only allow a single argument when setting the tick size. The *axis*.innerTickSize and *axis*.outerTickSize methods have been renamed [*axis*.tickSizeInner](https://github.com/d3/d3-axis/blob/master/README.md#axis_tickSizeInner) and [*axis*.tickSizeOuter](https://github.com/d3/d3-axis/blob/master/README.md#axis_tickSizeOuter), respectively. + +## [Brushes (d3-brush)](https://github.com/d3/d3-brush/blob/master/README.md) + +Replacing d3.svg.brush, there are now three classes of brush for brushing along the *x*-dimension, the *y*-dimension, or both: [d3.brushX](https://github.com/d3/d3-brush/blob/master/README.md#brushX), [d3.brushY](https://github.com/d3/d3-brush/blob/master/README.md#brushY), [d3.brush](https://github.com/d3/d3-brush/blob/master/README.md#brush). Brushes are no longer dependent on [scales](#scales-d3-scale); instead, each brush defines a selection in screen coordinates. This selection can be [inverted](https://github.com/d3/d3-scale/blob/master/README.md#continuous_invert) if you want to compute the corresponding data domain. And rather than rely on the scales’ ranges to determine the brushable area, there is now a [*brush*.extent](https://github.com/d3/d3-brush/blob/master/README.md#brush_extent) method for setting it. If you do not set the brush extent, it defaults to the full extent of the owner SVG element. The *brush*.clamp method has also been eliminated; brushing is always restricted to the brushable area defined by the brush extent. + +Brushes no longer store the active brush selection (*i.e.*, the highlighted region; the brush’s position) internally. The brush’s position is now stored on any elements to which the brush has been applied. The brush’s position is available as *event*.selection within a brush event or by calling [d3.brushSelection](https://github.com/d3/d3-brush/blob/master/README.md#brushSelection) on a given *element*. To move the brush programmatically, use [*brush*.move](https://github.com/d3/d3-brush/blob/master/README.md#brush_move) with a given [selection](#selections-d3-selection) or [transition](#transitions-d3-transition); see the [brush snapping example](https://bl.ocks.org/mbostock/6232537). The *brush*.event method has been removed. + +Brush interaction has been improved. By default, brushes now ignore right-clicks intended for the context menu; you can change this behavior using [*brush*.filter](https://github.com/d3/d3-brush/blob/master/README.md#brush_filter). Brushes also ignore emulated mouse events on iOS. Holding down SHIFT (⇧) while brushing locks the *x*- or *y*-position of the brush. Holding down META (⌘) while clicking and dragging starts a new selection, rather than translating the existing selection. + +The default appearance of the brush has also been improved and slightly simplified. Previously it was necessary to apply styles to the brush to give it a reasonable appearance, such as: + +```css +.brush .extent { + stroke: #fff; + fill-opacity: .125; + shape-rendering: crispEdges; +} +``` + +These styles are now applied by default as attributes; if you want to customize the brush appearance, you can still apply external styles or modify the brush elements. (D3 4.0 features a similar improvement to [axes](#axes-d3-axis).) A new [*brush*.handleSize](https://github.com/d3/d3-brush/blob/master/README.md#brush_handleSize) method lets you override the brush handle size; it defaults to six pixels. + +The brush now consumes handled events, making it easier to combine with other interactive behaviors such as [dragging](#dragging-d3-drag) and [zooming](#zooming-d3-zoom). The *brushstart* and *brushend* events have been renamed to *start* and *end*, respectively. The brush event no longer reports a *event*.mode to distinguish between resizing and dragging the brush. + +## [Chords (d3-chord)](https://github.com/d3/d3-chord/blob/master/README.md) + +Pursuant to the great namespace flattening: + +* d3.layout.chord ↦ [d3.chord](https://github.com/d3/d3-chord/blob/master/README.md#chord) +* d3.svg.chord ↦ [d3.ribbon](https://github.com/d3/d3-chord/blob/master/README.md#ribbon) + +For consistency with [*arc*.padAngle](https://github.com/d3/d3-shape/blob/master/README.md#arc_padAngle), *chord*.padding has also been renamed to [*ribbon*.padAngle](https://github.com/d3/d3-chord/blob/master/README.md#ribbon_padAngle). A new [*ribbon*.context](https://github.com/d3/d3-chord/blob/master/README.md#ribbon_context) method lets you render chord diagrams to Canvas! See also [d3-path](#paths-d3-path). + +## [Collections (d3-collection)](https://github.com/d3/d3-collection/blob/master/README.md) + +The [d3.set](https://github.com/d3/d3-collection/blob/master/README.md#set) constructor now accepts an existing set for making a copy. If you pass an array to d3.set, you can also pass a value accessor. This accessor takes the standard arguments: the current element (*d*), the index (*i*), and the array (*data*), with *this* undefined. For example: + +```js +var yields = [ + {yield: 22.13333, variety: "Manchuria", year: 1932, site: "Grand Rapids"}, + {yield: 26.76667, variety: "Peatland", year: 1932, site: "Grand Rapids"}, + {yield: 28.10000, variety: "No. 462", year: 1931, site: "Duluth"}, + {yield: 38.50000, variety: "Svansota", year: 1932, site: "Waseca"}, + {yield: 40.46667, variety: "Svansota", year: 1931, site: "Crookston"}, + {yield: 36.03333, variety: "Peatland", year: 1932, site: "Waseca"}, + {yield: 34.46667, variety: "Wisconsin No. 38", year: 1931, site: "Grand Rapids"} +]; + +var sites = d3.set(yields, function(d) { return d.site; }); // Grand Rapids, Duluth, Waseca, Crookston +``` + +The [d3.map](https://github.com/d3/d3-collection/blob/master/README.md#map) constructor also follows the standard array accessor argument pattern. + +The *map*.forEach and *set*.forEach methods have been renamed to [*map*.each](https://github.com/d3/d3-collection/blob/master/README.md#map_each) and [*set*.each](https://github.com/d3/d3-collection/blob/master/README.md#set_each) respectively. The order of arguments for *map*.each has also been changed to *value*, *key* and *map*, while the order of arguments for *set*.each is now *value*, *value* and *set*. This is closer to ES6 [*map*.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/forEach) and [*set*.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/forEach). Also like ES6 Map and Set, *map*.set and *set*.add now return the current collection (rather than the added value) to facilitate method chaining. New [*map*.clear](https://github.com/d3/d3-collection/blob/master/README.md#map_clear) and [*set*.clear](https://github.com/d3/d3-collection/blob/master/README.md#set_clear) methods can be used to empty collections. + +The [*nest*.map](https://github.com/d3/d3-collection/blob/master/README.md#nest_map) method now always returns a d3.map instance. For a plain object, use [*nest*.object](https://github.com/d3/d3-collection/blob/master/README.md#nest_object) instead. When used in conjunction with [*nest*.rollup](https://github.com/d3/d3-collection/blob/master/README.md#nest_rollup), [*nest*.entries](https://github.com/d3/d3-collection/blob/master/README.md#nest_entries) now returns {key, value} objects for the leaf entries, instead of {key, values}. This makes *nest*.rollup easier to use in conjunction with [hierarchies](#hierarchies-d3-hierarchy), as in this [Nest Treemap example](https://bl.ocks.org/mbostock/2838bf53e0e65f369f476afd653663a2). + +## [Colors (d3-color)](https://github.com/d3/d3-color/blob/master/README.md) + +All colors now have opacity exposed as *color*.opacity, which is a number in [0, 1]. You can pass an optional opacity argument to the color space constructors [d3.rgb](https://github.com/d3/d3-color/blob/master/README.md#rgb), [d3.hsl](https://github.com/d3/d3-color/blob/master/README.md#hsl), [d3.lab](https://github.com/d3/d3-color/blob/master/README.md#lab), [d3.hcl](https://github.com/d3/d3-color/blob/master/README.md#hcl) or [d3.cubehelix](https://github.com/d3/d3-color/blob/master/README.md#cubehelix). + +You can now parse rgba(…) and hsla(…) CSS color specifiers or the string “transparent†using [d3.color](https://github.com/d3/d3-color/blob/master/README.md#color). The “transparent†color is defined as an RGB color with zero opacity and undefined red, green and blue channels; this differs slightly from CSS which defines it as transparent black, but is useful for simplifying color interpolation logic where either the starting or ending color has undefined channels. The [*color*.toString](https://github.com/d3/d3-color/blob/master/README.md#color_toString) method now likewise returns an rgb(…) or rgba(…) string with integer channel values, not the hexadecimal RGB format, consistent with CSS computed values. This improves performance by short-circuiting transitions when the element’s starting style matches its ending style. + +The new [d3.color](https://github.com/d3/d3-color/blob/master/README.md#color) method is the primary method for parsing colors: it returns a d3.color instance in the appropriate color space, or null if the CSS color specifier is invalid. For example: + +```js +var red = d3.color("hsl(0, 80%, 50%)"); // {h: 0, l: 0.5, s: 0.8, opacity: 1} +``` + +The parsing implementation is now more robust. For example, you can no longer mix integers and percentages in rgb(…), and it correctly handles whitespace, decimal points, number signs, and other edge cases. The color space constructors d3.rgb, d3.hsl, d3.lab, d3.hcl and d3.cubehelix now always return a copy of the input color, converted to the corresponding color space. While [*color*.rgb](https://github.com/d3/d3-color/blob/master/README.md#color_rgb) remains, *rgb*.hsl has been removed; use d3.hsl to convert a color to the RGB color space. + +The RGB color space no longer greedily quantizes and clamps channel values when creating colors, improving accuracy in color space conversion. Quantization and clamping now occurs in *color*.toString when formatting a color for display. You can use the new [*color*.displayable](https://github.com/d3/d3-color/blob/master/README.md#color_displayable) to test whether a color is [out-of-gamut](https://en.wikipedia.org/wiki/Gamut). + +The [*rgb*.brighter](https://github.com/d3/d3-color/blob/master/README.md#rgb_brighter) method no longer special-cases black. This is a multiplicative operator, defining a new color *r*′, *g*′, *b*′ where *r*′ = *r* × *pow*(0.7, *k*), *g*′ = *g* × *pow*(0.7, *k*) and *b*′ = *b* × *pow*(0.7, *k*); a brighter black is still black. + +There’s a new [d3.cubehelix](https://github.com/d3/d3-color/blob/master/README.md#cubehelix) color space, generalizing Dave Green’s color scheme! (See also [d3.interpolateCubehelixDefault](https://github.com/d3/d3-scale/blob/master/README.md#interpolateCubehelixDefault) from [d3-scale](#scales-d3-scale).) You can continue to define your own custom color spaces, too; see [d3-hsv](https://github.com/d3/d3-hsv) for an example. + +## [Dispatches (d3-dispatch)](https://github.com/d3/d3-dispatch/blob/master/README.md) + +Rather than decorating the *dispatch* object with each event type, the dispatch object now exposes generic [*dispatch*.call](https://github.com/d3/d3-dispatch/blob/master/README.md#dispatch_call) and [*dispatch*.apply](https://github.com/d3/d3-dispatch/blob/master/README.md#dispatch_apply) methods which take the *type* string as the first argument. For example, in D3 3.x, you might say: + +```js +dispatcher.foo.call(that, "Hello, Foo!"); +``` + +To dispatch a *foo* event in D3 4.0, you’d say: + +```js +dispatcher.call("foo", that, "Hello, Foo!"); +``` + +The [*dispatch*.on](https://github.com/d3/d3-dispatch/blob/master/README.md#dispatch_on) method now accepts multiple typenames, allowing you to add or remove listeners for multiple events simultaneously. For example, to send both *foo* and *bar* events to the same listener: + +```js +dispatcher.on("foo bar", function(message) { + console.log(message); +}); +``` + +This matches the new behavior of [*selection*.on](https://github.com/d3/d3-selection/blob/master/README.md#selection_on) in [d3-selection](#selections-d3-selection). The *dispatch*.on method now validates that the specifier *listener* is a function, rather than throwing an error in the future. + +The new implementation d3.dispatch is faster, using fewer closures to improve performance. There’s also a new [*dispatch*.copy](https://github.com/d3/d3-dispatch/blob/master/README.md#dispatch_copy) method for making a copy of a dispatcher; this is used by [d3-transition](#transitions-d3-transition) to improve the performance of transitions in the common case where all elements in a transition have the same transition event listeners. + +## [Dragging (d3-drag)](https://github.com/d3/d3-drag/blob/master/README.md) + +The drag behavior d3.behavior.drag has been renamed to d3.drag. The *drag*.origin method has been replaced by [*drag*.subject](https://github.com/d3/d3-drag/blob/master/README.md#drag_subject), which allows you to define the thing being dragged at the start of a drag gesture. This is particularly useful with Canvas, where draggable objects typically share a Canvas element (as opposed to SVG, where draggable objects typically have distinct DOM elements); see the [circle dragging example](https://bl.ocks.org/mbostock/444757cc9f0fde320a5f469cd36860f4). + +A new [*drag*.container](https://github.com/d3/d3-drag/blob/master/README.md#drag_container) method lets you override the parent element that defines the drag gesture coordinate system. This defaults to the parent node of the element to which the drag behavior was applied. For dragging on Canvas elements, you probably want to use the Canvas element as the container. + +[Drag events](https://github.com/d3/d3-drag/blob/master/README.md#drag-events) now expose an [*event*.on](https://github.com/d3/d3-drag/blob/master/README.md#event_on) method for registering temporary listeners for duration of the current drag gesture; these listeners can capture state for the current gesture, such as the thing being dragged. A new *event*.active property lets you detect whether multiple (multitouch) drag gestures are active concurrently. The *dragstart* and *dragend* events have been renamed to *start* and *end*. By default, drag behaviors now ignore right-clicks intended for the context menu; use [*drag*.filter](https://github.com/d3/d3-drag/blob/master/README.md#drag_filter) to control which events are ignored. The drag behavior also ignores emulated mouse events on iOS. The drag behavior now consumes handled events, making it easier to combine with other interactive behaviors such as [zooming](#zooming-d3-zoom). + +The new [d3.dragEnable](https://github.com/d3/d3-drag/blob/master/README.md#dragEnable) and [d3.dragDisable](https://github.com/d3/d3-drag/blob/master/README.md#dragDisable) methods provide a low-level API for implementing drag gestures across browsers and devices. These methods are also used by other D3 components, such as the [brush](#brushes-d3-brush). + +## [Delimiter-Separated Values (d3-dsv)](https://github.com/d3/d3-dsv/blob/master/README.md) + +Pursuant to the great namespace flattening, various CSV and TSV methods have new names: + +* d3.csv.parse ↦ [d3.csvParse](https://github.com/d3/d3-dsv/blob/master/README.md#csvParse) +* d3.csv.parseRows ↦ [d3.csvParseRows](https://github.com/d3/d3-dsv/blob/master/README.md#csvParseRows) +* d3.csv.format ↦ [d3.csvFormat](https://github.com/d3/d3-dsv/blob/master/README.md#csvFormat) +* d3.csv.formatRows ↦ [d3.csvFormatRows](https://github.com/d3/d3-dsv/blob/master/README.md#csvFormatRows) +* d3.tsv.parse ↦ [d3.tsvParse](https://github.com/d3/d3-dsv/blob/master/README.md#tsvParse) +* d3.tsv.parseRows ↦ [d3.tsvParseRows](https://github.com/d3/d3-dsv/blob/master/README.md#tsvParseRows) +* d3.tsv.format ↦ [d3.tsvFormat](https://github.com/d3/d3-dsv/blob/master/README.md#tsvFormat) +* d3.tsv.formatRows ↦ [d3.tsvFormatRows](https://github.com/d3/d3-dsv/blob/master/README.md#tsvFormatRows) + +The [d3.csv](https://github.com/d3/d3-request/blob/master/README.md#csv) and [d3.tsv](https://github.com/d3/d3-request/blob/master/README.md#tsv) methods for loading files of the corresponding formats have not been renamed, however! Those are defined in [d3-request](#requests-d3-request).There’s no longer a d3.dsv method, which served the triple purpose of defining a DSV formatter, a DSV parser and a DSV requestor; instead, there’s just [d3.dsvFormat](https://github.com/d3/d3-dsv/blob/master/README.md#dsvFormat) which you can use to define a DSV formatter and parser. You can use [*request*.response](https://github.com/d3/d3-request/blob/master/README.md#request_response) to make a request and then parse the response body, or just use [d3.text](https://github.com/d3/d3-request/blob/master/README.md#text). + +The [*dsv*.parse](https://github.com/d3/d3-dsv/blob/master/README.md#dsv_parse) method now exposes the column names and their input order as *data*.columns. For example: + +```js +d3.csv("cars.csv", function(error, data) { + if (error) throw error; + console.log(data.columns); // ["Year", "Make", "Model", "Length"] +}); +``` + +You can likewise pass an optional array of column names to [*dsv*.format](https://github.com/d3/d3-dsv/blob/master/README.md#dsv_format) to format only a subset of columns, or to specify the column order explicitly: + +```js +var string = d3.csvFormat(data, ["Year", "Model", "Length"]); +``` + +The parser is a bit faster and the formatter is a bit more robust: inputs are coerced to strings before formatting, fixing an obscure crash, and deprecated support for falling back to [*dsv*.formatRows](https://github.com/d3/d3-dsv/blob/master/README.md#dsv_formatRows) when the input *data* is an array of arrays has been removed. + +## [Easings (d3-ease)](https://github.com/d3/d3-ease/blob/master/README.md) + +D3 3.x used strings, such as “cubic-in-outâ€, to identify easing methods; these strings could be passed to d3.ease or *transition*.ease. D3 4.0 uses symbols instead, such as [d3.easeCubicInOut](https://github.com/d3/d3-ease/blob/master/README.md#easeCubicInOut). Symbols are simpler and cleaner. They work well with Rollup to produce smaller custom bundles. You can still define your own custom easing function, too, if desired. Here’s the full list of equivalents: + +* linear ↦ [d3.easeLinear](https://github.com/d3/d3-ease/blob/master/README.md#easeLinear)¹ +* linear-in ↦ [d3.easeLinear](https://github.com/d3/d3-ease/blob/master/README.md#easeLinear)¹ +* linear-out ↦ [d3.easeLinear](https://github.com/d3/d3-ease/blob/master/README.md#easeLinear)¹ +* linear-in-out ↦ [d3.easeLinear](https://github.com/d3/d3-ease/blob/master/README.md#easeLinear)¹ +* linear-out-in ↦ [d3.easeLinear](https://github.com/d3/d3-ease/blob/master/README.md#easeLinear)¹ +* poly-in ↦ [d3.easePolyIn](https://github.com/d3/d3-ease/blob/master/README.md#easePolyIn) +* poly-out ↦ [d3.easePolyOut](https://github.com/d3/d3-ease/blob/master/README.md#easePolyOut) +* poly-in-out ↦ [d3.easePolyInOut](https://github.com/d3/d3-ease/blob/master/README.md#easePolyInOut) +* poly-out-in ↦ REMOVED² +* quad-in ↦ [d3.easeQuadIn](https://github.com/d3/d3-ease/blob/master/README.md#easeQuadIn) +* quad-out ↦ [d3.easeQuadOut](https://github.com/d3/d3-ease/blob/master/README.md#easeQuadOut) +* quad-in-out ↦ [d3.easeQuadInOut](https://github.com/d3/d3-ease/blob/master/README.md#easeQuadInOut) +* quad-out-in ↦ REMOVED² +* cubic-in ↦ [d3.easeCubicIn](https://github.com/d3/d3-ease/blob/master/README.md#easeCubicIn) +* cubic-out ↦ [d3.easeCubicOut](https://github.com/d3/d3-ease/blob/master/README.md#easeCubicOut) +* cubic-in-out ↦ [d3.easeCubicInOut](https://github.com/d3/d3-ease/blob/master/README.md#easeCubicInOut) +* cubic-out-in ↦ REMOVED² +* sin-in ↦ [d3.easeSinIn](https://github.com/d3/d3-ease/blob/master/README.md#easeSinIn) +* sin-out ↦ [d3.easeSinOut](https://github.com/d3/d3-ease/blob/master/README.md#easeSinOut) +* sin-in-out ↦ [d3.easeSinInOut](https://github.com/d3/d3-ease/blob/master/README.md#easeSinInOut) +* sin-out-in ↦ REMOVED² +* exp-in ↦ [d3.easeExpIn](https://github.com/d3/d3-ease/blob/master/README.md#easeExpIn) +* exp-out ↦ [d3.easeExpOut](https://github.com/d3/d3-ease/blob/master/README.md#easeExpOut) +* exp-in-out ↦ [d3.easeExpInOut](https://github.com/d3/d3-ease/blob/master/README.md#easeExpInOut) +* exp-out-in ↦ REMOVED² +* circle-in ↦ [d3.easeCircleIn](https://github.com/d3/d3-ease/blob/master/README.md#easeCircleIn) +* circle-out ↦ [d3.easeCircleOut](https://github.com/d3/d3-ease/blob/master/README.md#easeCircleOut) +* circle-in-out ↦ [d3.easeCircleInOut](https://github.com/d3/d3-ease/blob/master/README.md#easeCircleInOut) +* circle-out-in ↦ REMOVED² +* elastic-in ↦ [d3.easeElasticOut](https://github.com/d3/d3-ease/blob/master/README.md#easeElasticOut)² +* elastic-out ↦ [d3.easeElasticIn](https://github.com/d3/d3-ease/blob/master/README.md#easeElasticIn)² +* elastic-in-out ↦ REMOVED² +* elastic-out-in ↦ [d3.easeElasticInOut](https://github.com/d3/d3-ease/blob/master/README.md#easeElasticInOut)² +* back-in ↦ [d3.easeBackIn](https://github.com/d3/d3-ease/blob/master/README.md#easeBackIn) +* back-out ↦ [d3.easeBackOut](https://github.com/d3/d3-ease/blob/master/README.md#easeBackOut) +* back-in-out ↦ [d3.easeBackInOut](https://github.com/d3/d3-ease/blob/master/README.md#easeBackInOut) +* back-out-in ↦ REMOVED² +* bounce-in ↦ [d3.easeBounceOut](https://github.com/d3/d3-ease/blob/master/README.md#easeBounceOut)² +* bounce-out ↦ [d3.easeBounceIn](https://github.com/d3/d3-ease/blob/master/README.md#easeBounceIn)² +* bounce-in-out ↦ REMOVED² +* bounce-out-in ↦ [d3.easeBounceInOut](https://github.com/d3/d3-ease/blob/master/README.md#easeBounceInOut)² + +¹ The -in, -out and -in-out variants of linear easing are identical, so there’s just d3.easeLinear. +
² Elastic and bounce easing were inadvertently reversed in 3.x, so 4.0 eliminates -out-in easing! + +For convenience, there are also default aliases for each easing method. For example, [d3.easeCubic](https://github.com/d3/d3-ease/blob/master/README.md#easeCubic) is an alias for [d3.easeCubicInOut](https://github.com/d3/d3-ease/blob/master/README.md#easeCubicInOut). Most default to -in-out; the exceptions are [d3.easeBounce](https://github.com/d3/d3-ease/blob/master/README.md#easeBounce) and [d3.easeElastic](https://github.com/d3/d3-ease/blob/master/README.md#easeElastic), which default to -out. + +Rather than pass optional arguments to d3.ease or *transition*.ease, parameterizable easing functions now have named parameters: [*poly*.exponent](https://github.com/d3/d3-ease/blob/master/README.md#poly_exponent), [*elastic*.amplitude](https://github.com/d3/d3-ease/blob/master/README.md#elastic_amplitude), [*elastic*.period](https://github.com/d3/d3-ease/blob/master/README.md#elastic_period) and [*back*.overshoot](https://github.com/d3/d3-ease/blob/master/README.md#back_overshoot). For example, in D3 3.x you might say: + +```js +var e = d3.ease("elastic-out-in", 1.2); +``` + +The equivalent in D3 4.0 is: + +```js +var e = d3.easeElastic.amplitude(1.2); +``` + +Many of the easing functions have been optimized for performance and accuracy. Several bugs have been fixed, as well, such as the interpretation of the overshoot parameter for back easing, and the period parameter for elastic easing. Also, [d3-transition](#transitions-d3-transition) now explicitly guarantees that the last tick of the transition happens at exactly *t* = 1, avoiding floating point errors in some easing functions. + +There’s now a nice [visual reference](https://github.com/d3/d3-ease/blob/master/README.md) and an [animated reference](https://bl.ocks.org/mbostock/248bac3b8e354a9103c4) to the new easing functions, too! + +## [Forces (d3-force)](https://github.com/d3/d3-force/blob/master/README.md) + +The force layout d3.layout.force has been renamed to d3.forceSimulation. The force simulation now uses [velocity Verlet integration](https://en.wikipedia.org/wiki/Verlet_integration#Velocity_Verlet) rather than position Verlet, tracking the nodes’ positions (*node*.x, *node*.y) and velocities (*node*.vx, *node*.vy) rather than their previous positions (*node*.px, *node*.py). + +Rather than hard-coding a set of built-in forces, the force simulation is now extensible: you specify which forces you want! The approach affords greater flexibility through composition. The new forces are more flexible, too: force parameters can typically be configured per-node or per-link. There are separate positioning forces for [*x*](https://github.com/d3/d3-force/blob/master/README.md#forceX) and [*y*](https://github.com/d3/d3-force/blob/master/README.md#forceY) that replace *force*.gravity; [*x*.x](https://github.com/d3/d3-force/blob/master/README.md#x_x) and [*y*.y](https://github.com/d3/d3-force/blob/master/README.md#y_y) replace *force*.size. The new [link force](https://github.com/d3/d3-force/blob/master/README.md#forceLink) replaces *force*.linkStrength and employs better default heuristics to improve stability. The new [many-body force](https://github.com/d3/d3-force/blob/master/README.md#forceManyBody) replaces *force*.charge and supports a new [minimum-distance parameter](https://github.com/d3/d3-force/blob/master/README.md#manyBody_distanceMin) and performance improvements thanks to 4.0’s [new quadtrees](#quadtrees-d3-quadtree). There are also brand-new forces for [centering nodes](https://github.com/d3/d3-force/blob/master/README.md#forceCenter) and [collision resolution](https://github.com/d3/d3-force/blob/master/README.md#forceCollision). + +The new forces and simulation have been carefully crafted to avoid nondeterminism. Rather than initializing nodes randomly, if the nodes do not have preset positions, they are placed in a phyllotaxis pattern: + +Phyllotaxis + +Random jitter is still needed to resolve link, collision and many-body forces if there are coincident nodes, but at least in the common case, the force simulation (and the resulting force-directed graph layout) is now consistent across browsers and reloads. D3 no longer plays dice! + +The force simulation has several new methods for greater control over heating, such as [*simulation*.alphaMin](https://github.com/d3/d3-force/blob/master/README.md#simulation_alphaMin) and [*simulation*.alphaDecay](https://github.com/d3/d3-force/blob/master/README.md#simulation_alphaDecay), and the internal timer. Calling [*simulation*.alpha](https://github.com/d3/d3-force/blob/master/README.md#simulation_alpha) now has no effect on the internal timer, which is controlled independently via [*simulation*.stop](https://github.com/d3/d3-force/blob/master/README.md#simulation_stop) and [*simulation*.restart](https://github.com/d3/d3-force/blob/master/README.md#simulation_restart). The force layout’s internal timer now starts automatically on creation, removing *force*.start. As in 3.x, you can advance the simulation manually using [*simulation*.tick](https://github.com/d3/d3-force/blob/master/README.md#simulation_tick). The *force*.friction parameter is replaced by *simulation*.velocityDecay. A new [*simulation*.alphaTarget](https://github.com/d3/d3-force/blob/master/README.md#simulation_alphaTarget) method allows you to set the desired alpha (temperature) of the simulation, such that the simulation can be smoothly reheated during interaction, and then smoothly cooled again. This improves the stability of the graph during interaction. + +The force layout no longer depends on the [drag behavior](#dragging-d3-drag), though you can certainly create [draggable force-directed graphs](https://bl.ocks.org/mbostock/ad70335eeef6d167bc36fd3c04378048)! Set *node*.fx and *node*.fy to fix a node’s position. As an alternative to a [Voronoi](#voronoi-d3-voronoi) SVG overlay, you can now use [*simulation*.find](https://github.com/d3/d3-force/blob/master/README.md#simulation_find) to find the closest node to a pointer. + +## [Number Formats (d3-format)](https://github.com/d3/d3-format/blob/master/README.md) + +If a precision is not specified, the formatting behavior has changed: there is now a default precision of 6 for all directives except *none*, which defaults to 12. In 3.x, if you did not specify a precision, the number was formatted using its shortest unique representation (per [*number*.toString](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString)); this could lead to unexpected digits due to [floating point math](http://0.30000000000000004.com/). The new default precision in 4.0 produces more consistent results: + +```js +var f = d3.format("e"); +f(42); // "4.200000e+1" +f(0.1 + 0.2); // "3.000000e-1" +``` + +To trim insignificant trailing zeroes, use the *none* directive, which is similar `g`. For example: + +```js +var f = d3.format(".3"); +f(0.12345); // "0.123" +f(0.10000); // "0.1" +f(0.1 + 0.2); // "0.3" +``` + +Under the hood, number formatting has improved accuracy with very large and very small numbers by using [*number*.toExponential](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toExponential) rather than [Math.log](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log) to extract the mantissa and exponent. Negative zero (-0, an IEEE 754 construct) and very small numbers that round to zero are now formatted as unsigned zero. The inherently unsafe d3.round method has been removed, along with d3.requote. + +The [d3.formatPrefix](https://github.com/d3/d3-format/blob/master/README.md#formatPrefix) method has been changed. Rather than returning an SI-prefix string, it returns an SI-prefix format function for a given *specifier* and reference *value*. For example, to format thousands: + +```js +var f = d3.formatPrefix(",.0", 1e3); +f(1e3); // "1k" +f(1e4); // "10k" +f(1e5); // "100k" +f(1e6); // "1,000k" +``` + +Unlike the `s` format directive, d3.formatPrefix always employs the same SI-prefix, producing consistent results: + +```js +var f = d3.format(".0s"); +f(1e3); // "1k" +f(1e4); // "10k" +f(1e5); // "100k" +f(1e6); // "1M" +``` + +The new `(` sign option uses parentheses for negative values. This is particularly useful in conjunction with `$`. For example: + +```js +d3.format("+.0f")(-42); // "-42" +d3.format("(.0f")(-42); // "(42)" +d3.format("+$.0f")(-42); // "-$42" +d3.format("($.0f")(-42); // "($42)" +``` + +The new `=` align option places any sign and symbol to the left of any padding: + +```js +d3.format(">6d")(-42); // " -42" +d3.format("=6d")(-42); // "- 42" +d3.format(">(6d")(-42); // " (42)" +d3.format("=(6d")(-42); // "( 42)" +``` + +The `b`, `o`, `d` and `x` directives now round to the nearest integer, rather than returning the empty string for non-integers: + +```js +d3.format("b")(41.9); // "101010" +d3.format("o")(41.9); // "52" +d3.format("d")(41.9); // "42" +d3.format("x")(41.9); // "2a" +``` + +The `c` directive is now for character data (*i.e.*, literal strings), not for character codes. The is useful if you just want to apply padding and alignment and don’t care about formatting numbers. For example, the infamous [left-pad](http://blog.npmjs.org/post/141577284765/kik-left-pad-and-npm) (as well as center- and right-pad!) can be conveniently implemented as: + +```js +d3.format(">10c")("foo"); // " foo" +d3.format("^10c")("foo"); // " foo " +d3.format("<10c")("foo"); // "foo " +``` + +There are several new methods for computing suggested decimal precisions; these are used by [d3-scale](#scales-d3-scale) for tick formatting, and are helpful for implementing custom number formats: [d3.precisionFixed](https://github.com/d3/d3-format/blob/master/README.md#precisionFixed), [d3.precisionPrefix](https://github.com/d3/d3-format/blob/master/README.md#precisionPrefix) and [d3.precisionRound](https://github.com/d3/d3-format/blob/master/README.md#precisionRound). There’s also a new [d3.formatSpecifier](https://github.com/d3/d3-format/blob/master/README.md#formatSpecifier) method for parsing, validating and debugging format specifiers; it’s also good for deriving related format specifiers, such as when you want to substitute the precision automatically. + +You can now set the default locale using [d3.formatDefaultLocale](https://github.com/d3/d3-format/blob/master/README.md#formatDefaultLocale)! The locales are published as [JSON](https://github.com/d3/d3-request/blob/master/README.md#json) to [npm](https://unpkg.com/d3-format/locale/). + +## [Geographies (d3-geo)](https://github.com/d3/d3-geo/blob/master/README.md) + +Pursuant to the great namespace flattening, various methods have new names: + +* d3.geo.graticule ↦ [d3.geoGraticule](https://github.com/d3/d3-geo/blob/master/README.md#geoGraticule) +* d3.geo.circle ↦ [d3.geoCircle](https://github.com/d3/d3-geo/blob/master/README.md#geoCircle) +* d3.geo.area ↦ [d3.geoArea](https://github.com/d3/d3-geo/blob/master/README.md#geoArea) +* d3.geo.bounds ↦ [d3.geoBounds](https://github.com/d3/d3-geo/blob/master/README.md#geoBounds) +* d3.geo.centroid ↦ [d3.geoCentroid](https://github.com/d3/d3-geo/blob/master/README.md#geoCentroid) +* d3.geo.distance ↦ [d3.geoDistance](https://github.com/d3/d3-geo/blob/master/README.md#geoDistance) +* d3.geo.interpolate ↦ [d3.geoInterpolate](https://github.com/d3/d3-geo/blob/master/README.md#geoInterpolate) +* d3.geo.length ↦ [d3.geoLength](https://github.com/d3/d3-geo/blob/master/README.md#geoLength) +* d3.geo.rotation ↦ [d3.geoRotation](https://github.com/d3/d3-geo/blob/master/README.md#geoRotation) +* d3.geo.stream ↦ [d3.geoStream](https://github.com/d3/d3-geo/blob/master/README.md#geoStream) +* d3.geo.path ↦ [d3.geoPath](https://github.com/d3/d3-geo/blob/master/README.md#geoPath) +* d3.geo.projection ↦ [d3.geoProjection](https://github.com/d3/d3-geo/blob/master/README.md#geoProjection) +* d3.geo.projectionMutator ↦ [d3.geoProjectionMutator](https://github.com/d3/d3-geo/blob/master/README.md#geoProjectionMutator) +* d3.geo.albers ↦ [d3.geoAlbers](https://github.com/d3/d3-geo/blob/master/README.md#geoAlbers) +* d3.geo.albersUsa ↦ [d3.geoAlbersUsa](https://github.com/d3/d3-geo/blob/master/README.md#geoAlbersUsa) +* d3.geo.azimuthalEqualArea ↦ [d3.geoAzimuthalEqualArea](https://github.com/d3/d3-geo/blob/master/README.md#geoAzimuthalEqualArea) +* d3.geo.azimuthalEquidistant ↦ [d3.geoAzimuthalEquidistant](https://github.com/d3/d3-geo/blob/master/README.md#geoAzimuthalEquidistant) +* d3.geo.conicConformal ↦ [d3.geoConicConformal](https://github.com/d3/d3-geo/blob/master/README.md#geoConicConformal) +* d3.geo.conicEqualArea ↦ [d3.geoConicEqualArea](https://github.com/d3/d3-geo/blob/master/README.md#geoConicEqualArea) +* d3.geo.conicEquidistant ↦ [d3.geoConicEquidistant](https://github.com/d3/d3-geo/blob/master/README.md#geoConicEquidistant) +* d3.geo.equirectangular ↦ [d3.geoEquirectangular](https://github.com/d3/d3-geo/blob/master/README.md#geoEquirectangular) +* d3.geo.gnomonic ↦ [d3.geoGnomonic](https://github.com/d3/d3-geo/blob/master/README.md#geoGnomonic) +* d3.geo.mercator ↦ [d3.geoMercator](https://github.com/d3/d3-geo/blob/master/README.md#geoMercator) +* d3.geo.orthographic ↦ [d3.geoOrthographic](https://github.com/d3/d3-geo/blob/master/README.md#geoOrthographic) +* d3.geo.stereographic ↦ [d3.geoStereographic](https://github.com/d3/d3-geo/blob/master/README.md#geoStereographic) +* d3.geo.transverseMercator ↦ [d3.geoTransverseMercator](https://github.com/d3/d3-geo/blob/master/README.md#geoTransverseMercator) + +Also renamed for consistency: + +* *circle*.origin ↦ [*circle*.center](https://github.com/d3/d3-geo/blob/master/README.md#circle_center) +* *circle*.angle ↦ [*circle*.radius](https://github.com/d3/d3-geo/blob/master/README.md#circle_radius) +* *graticule*.majorExtent ↦ [*graticule*.extentMajor](https://github.com/d3/d3-geo/blob/master/README.md#graticule_extentMajor) +* *graticule*.minorExtent ↦ [*graticule*.extentMinor](https://github.com/d3/d3-geo/blob/master/README.md#graticule_extentMinor) +* *graticule*.majorStep ↦ [*graticule*.stepMajor](https://github.com/d3/d3-geo/blob/master/README.md#graticule_stepMajor) +* *graticule*.minorStep ↦ [*graticule*.stepMinor](https://github.com/d3/d3-geo/blob/master/README.md#graticule_stepMinor) + +Projections now have more appropriate defaults. For example, [d3.geoOrthographic](https://github.com/d3/d3-geo/blob/master/README.md#geoOrthographic) has a 90° clip angle by default, showing only the front hemisphere, and [d3.geoGnomonic](https://github.com/d3/d3-geo/blob/master/README.md#geoGnomonic) has a default 60° clip angle. The default [projection](https://github.com/d3/d3-geo/blob/master/README.md#path_projection) for [d3.geoPath](https://github.com/d3/d3-geo/blob/master/README.md#geoPath) is now null rather than [d3.geoAlbersUsa](https://github.com/d3/d3-geo/blob/master/README.md#geoAlbersUsa); a null projection is used with [pre-projected geometry](https://bl.ocks.org/mbostock/5557726) and is typically faster to render. + +“Fallback projectionsâ€â€”when you pass a function rather than a projection to [*path*.projection](https://github.com/d3/d3-geo/blob/master/README.md#path_projection)—are no longer supported. For geographic projections, use [d3.geoProjection](https://github.com/d3/d3-geo/blob/master/README.md#geoProjection) or [d3.geoProjectionMutator](https://github.com/d3/d3-geo/blob/master/README.md#geoProjectionMutator) to define a custom projection. For arbitrary geometry transformations, implement the [stream interface](https://github.com/d3/d3-geo/blob/master/README.md#streams); see also [d3.geoTransform](https://github.com/d3/d3-geo/blob/master/README.md#geoTransform). The “raw†projections (e.g., d3.geo.equirectangular.raw) are no longer exported. + +## [Hierarchies (d3-hierarchy)](https://github.com/d3/d3-hierarchy/blob/master/README.md) + +Pursuant to the great namespace flattening: + +* d3.layout.cluster ↦ [d3.cluster](https://github.com/d3/d3-hierarchy/blob/master/README.md#cluster) +* d3.layout.hierarchy ↦ [d3.hierarchy](https://github.com/d3/d3-hierarchy/blob/master/README.md#hierarchy) +* d3.layout.pack ↦ [d3.pack](https://github.com/d3/d3-hierarchy/blob/master/README.md#pack) +* d3.layout.partition ↦ [d3.partition](https://github.com/d3/d3-hierarchy/blob/master/README.md#partition) +* d3.layout.tree ↦ [d3.tree](https://github.com/d3/d3-hierarchy/blob/master/README.md#tree) +* d3.layout.treemap ↦ [d3.treemap](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemap) + +As an alternative to using JSON to represent hierarchical data (such as the “flare.json format†used by many D3 examples), the new [d3.stratify](https://github.com/d3/d3-hierarchy/blob/master/README.md#stratify) operator simplifies the conversion of tabular data to hierarchical data! This is convenient if you already have data in a tabular format, such as the result of a SQL query or a CSV file: + +``` +name,parent +Eve, +Cain,Eve +Seth,Eve +Enos,Seth +Noam,Seth +Abel,Eve +Awan,Eve +Enoch,Awan +Azura,Eve +``` + +To convert this to a root [*node*](https://github.com/d3/d3-hierarchy/blob/master/README.md#hierarchy): + +```js +var root = d3.stratify() + .id(function(d) { return d.name; }) + .parentId(function(d) { return d.parent; }) + (nodes); +``` + +The resulting *root* can be passed to [d3.tree](https://github.com/d3/d3-hierarchy/blob/master/README.md#tree) to produce a tree diagram like this: + + + +Root nodes can also be created from JSON data using [d3.hierarchy](https://github.com/d3/d3-hierarchy/blob/master/README.md#hierarchy). The hierarchy layouts now take these root nodes as input rather than operating directly on JSON data, which helps to provide a cleaner separation between the input data and the computed layout. (For example, use [*node*.copy](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_copy) to isolate layout changes.) It also simplifies the API: rather than each hierarchy layout needing to implement value and sorting accessors, there are now generic [*node*.sum](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_sum) and [*node*.sort](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_sort) methods that work with any hierarchy layout. + +The new d3.hierarchy API also provides a richer set of methods for manipulating hierarchical data. For example, to generate an array of all nodes in topological order, use [*node*.descendants](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_descendants); for just leaf nodes, use [*node*.leaves](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_leaves). To highlight the ancestors of a given *node* on mouseover, use [*node*.ancestors](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_ancestors). To generate an array of {source, target} links for a given hierarchy, use [*node*.links](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_links); this replaces *treemap*.links and similar methods on the other layouts. The new [*node*.path](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_path) method replaces d3.layout.bundle; see also [d3.curveBundle](https://github.com/d3/d3-shape/blob/master/README.md#curveBundle) for hierarchical edge bundling. + +The hierarchy layouts have been rewritten using new, non-recursive traversal methods ([*node*.each](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_each), [*node*.eachAfter](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_eachAfter) and [*node*.eachBefore](https://github.com/d3/d3-hierarchy/blob/master/README.md#node_eachBefore)), improving performance on large datasets. The d3.tree layout no longer uses a *node*.\_ field to store temporary state during layout. + +Treemap tiling is now [extensible](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemap-tiling) via [*treemap*.tile](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemap_tile)! The default squarified tiling algorithm, [d3.treemapSquarify](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemapSquarify), has been completely rewritten, improving performance and fixing bugs in padding and rounding. The *treemap*.sticky method has been replaced with the [d3.treemapResquarify](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemapResquarify), which is identical to d3.treemapSquarify except it performs stable neighbor-preserving updates. The *treemap*.ratio method has been replaced with [*squarify*.ratio](https://github.com/d3/d3-hierarchy/blob/master/README.md#squarify_ratio). And there’s a new [d3.treemapBinary](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemapBinary) for binary treemaps! + +Treemap padding has also been improved. The treemap now distinguishes between [outer padding](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemap_paddingOuter) that separates a parent from its children, and [inner padding](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemap_paddingInner) that separates adjacent siblings. You can set the [top-](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemap_paddingTop), [right-](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemap_paddingRight), [bottom-](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemap_paddingBottom) and [left-](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemap_paddingLeft)outer padding separately. There are new examples for the traditional [nested treemap](https://bl.ocks.org/mbostock/911ad09bdead40ec0061) and for Lü and Fogarty’s [cascaded treemap](https://bl.ocks.org/mbostock/f85ffb3a5ac518598043). And there’s a new example demonstrating [d3.nest with d3.treemap](https://bl.ocks.org/mbostock/2838bf53e0e65f369f476afd653663a2). + +The space-filling layouts [d3.treemap](https://github.com/d3/d3-hierarchy/blob/master/README.md#treemap) and [d3.partition](https://github.com/d3/d3-hierarchy/blob/master/README.md#partition) now output *x0*, *x1*, *y0*, *y1* on each node instead of *x0*, *dx*, *y0*, *dy*. This improves accuracy by ensuring that the edges of adjacent cells are exactly equal, rather than sometimes being slightly off due to floating point math. The partition layout now supports [rounding](https://github.com/d3/d3-hierarchy/blob/master/README.md#partition_round) and [padding](https://github.com/d3/d3-hierarchy/blob/master/README.md#partition_padding). + +The circle-packing layout, [d3.pack](https://github.com/d3/d3-hierarchy/blob/master/README.md#pack), has been completely rewritten to better implement Wang et al.’s algorithm, fixing major bugs and improving results! Welzl’s algorithm is now used to compute the exact [smallest enclosing circle](https://bl.ocks.org/mbostock/29c534ff0b270054a01c) for each parent, rather than the approximate answer used by Wang et al. The 3.x output is shown on the left; 4.0 is shown on the right: + +Circle Packing in 3.x Circle Packing in 4.0 + +A non-hierarchical implementation is also available as [d3.packSiblings](https://github.com/d3/d3-hierarchy/blob/master/README.md#packSiblings), and the smallest enclosing circle implementation is available as [d3.packEnclose](https://github.com/d3/d3-hierarchy/blob/master/README.md#packEnclose). [Pack padding](https://github.com/d3/d3-hierarchy/blob/master/README.md#pack_padding) now applies between a parent and its children, as well as between adjacent siblings. In addition, you can now specify padding as a function that is computed dynamically for each parent. + +## Internals + +The d3.rebind method has been removed. (See the [3.x source](https://github.com/d3/d3/blob/v3.5.17/src/core/rebind.js).) If you want to wrap a getter-setter method, the recommend pattern is to implement a wrapper method and check the return value. For example, given a *component* that uses an internal [*dispatch*](#dispatches-d3-dispatch), *component*.on can rebind *dispatch*.on as follows: + +```js +component.on = function() { + var value = dispatch.on.apply(dispatch, arguments); + return value === dispatch ? component : value; +}; +``` + +The d3.functor method has been removed. (See the [3.x source](https://github.com/d3/d3/blob/v3.5.17/src/core/functor.js).) If you want to promote a constant value to a function, the recommended pattern is to implement a closure that returns the constant value. If desired, you can use a helper method as follows: + +```js +function constant(x) { + return function() { + return x; + }; +} +``` + +Given a value *x*, to promote *x* to a function if it is not already: + +```js +var fx = typeof x === "function" ? x : constant(x); +``` + +## [Interpolators (d3-interpolate)](https://github.com/d3/d3-interpolate/blob/master/README.md) + +The [d3.interpolate](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate) method no longer delegates to d3.interpolators, which has been removed; its behavior is now defined by the library. It is now slightly faster in the common case that *b* is a number. It only uses [d3.interpolateRgb](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateRgb) if *b* is a valid CSS color specifier (and not approximately one). And if the end value *b* is null, undefined, true or false, d3.interpolate now returns a constant function which always returns *b*. + +The behavior of [d3.interpolateObject](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateObject) and [d3.interpolateArray](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateArray) has changed slightly with respect to properties or elements in the start value *a* that do not exist in the end value *b*: these properties and elements are now ignored, such that the ending value of the interpolator at *t* = 1 is now precisely equal to *b*. So, in 3.x: + +```js +d3.interpolateObject({foo: 2, bar: 1}, {foo: 3})(0.5); // {bar: 1, foo: 2.5} in 3.x +``` + +Whereas in 4.0, *a*.bar is ignored: + +```js +d3.interpolateObject({foo: 2, bar: 1}, {foo: 3})(0.5); // {foo: 2.5} in 4.0 +``` + +If *a* or *b* are undefined or not an object, they are now implicitly converted to the empty object or empty array as appropriate, rather than throwing a TypeError. + +The d3.interpolateTransform interpolator has been renamed to [d3.interpolateTransformSvg](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateTransformSvg), and there is a new [d3.interpolateTransformCss](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateTransformCss) to interpolate CSS transforms! This allows [d3-transition](#transitions-d3-transition) to automatically interpolate both the SVG [transform attribute](https://www.w3.org/TR/SVG/coords.html#TransformAttribute) and the CSS [transform style property](https://www.w3.org/TR/css-transforms-1/#transform-property). (Note, however, that only 2D CSS transforms are supported.) The d3.transform method has been removed. + +Color space interpolators now interpolate opacity (see [d3-color](#colors-d3-color)) and return rgb(…) or rgba(…) CSS color specifier strings rather than using the RGB hexadecimal format. This is necessary to support opacity interpolation, but is also beneficial because it matches CSS computed values. When a channel in the start color *a* is undefined, color interpolators now use the corresponding channel value from the end color *b*, or *vice versa*. This logic previously applied to some channels (such as saturation in HSL), but now applies to all channels in all color spaces, and is especially useful when interpolating to or from transparent. + +There are now “long†versions of cylindrical color space interpolators: [d3.interpolateHslLong](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateHslLong), [d3.interpolateHclLong](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateHclLong) and [d3.interpolateCubehelixLong](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateCubehelixLong). These interpolators use linear interpolation of hue, rather than using the shortest path around the 360° hue circle. See [d3.interpolateRainbow](https://github.com/d3/d3-scale/blob/master/README.md#interpolateRainbow) for an example. The Cubehelix color space is now supported by [d3-color](#colors-d3-color), and so there are now [d3.interpolateCubehelix](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateCubehelix) and [d3.interpolateCubehelixLong](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateCubehelixLong) interpolators. + +[Gamma-corrected color interpolation](https://web.archive.org/web/20160112115812/http://www.4p8.com/eric.brasseur/gamma.html) is now supported for both RGB and Cubehelix color spaces as [*interpolate*.gamma](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate_gamma). For example, to interpolate from purple to orange with a gamma of 2.2 in RGB space: + +```js +var interpolate = d3.interpolateRgb.gamma(2.2)("purple", "orange"); +``` + +There are new interpolators for uniform non-rational [B-splines](https://en.wikipedia.org/wiki/B-spline)! These are useful for smoothly interpolating between an arbitrary sequence of values from *t* = 0 to *t* = 1, such as to generate a smooth color gradient from a discrete set of colors. The [d3.interpolateBasis](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateBasis) and [d3.interpolateBasisClosed](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateBasisClosed) interpolators generate one-dimensional B-splines, while [d3.interpolateRgbBasis](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateRgbBasis) and [d3.interpolateRgbBasisClosed](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateRgbBasisClosed) generate three-dimensional B-splines through RGB color space. These are used by [d3-scale-chromatic](https://github.com/d3/d3-scale-chromatic) to generate continuous color scales from ColorBrewer’s discrete color schemes, such as [PiYG](https://bl.ocks.org/mbostock/048d21cf747371b11884f75ad896e5a5). + +There’s also now a [d3.quantize](https://github.com/d3/d3-interpolate/blob/master/README.md#quantize) method for generating uniformly-spaced discrete samples from a continuous interpolator. This is useful for taking one of the built-in color scales (such as [d3.interpolateViridis](https://github.com/d3/d3-scale/blob/master/README.md#interpolateViridis)) and quantizing it for use with [d3.scaleQuantize](https://github.com/d3/d3-scale/blob/master/README.md#scaleQuantize), [d3.scaleQuantile](https://github.com/d3/d3-scale/blob/master/README.md#scaleQuantile) or [d3.scaleThreshold](https://github.com/d3/d3-scale/blob/master/README.md#scaleThreshold). + +## [Paths (d3-path)](https://github.com/d3/d3-path/blob/master/README.md) + +The [d3.path](https://github.com/d3/d3-path/blob/master/README.md#path) serializer implements the [CanvasPathMethods API](https://www.w3.org/TR/2dcontext/#canvaspathmethods), allowing you to write code that can render to either Canvas or SVG. For example, given some code that draws to a canvas: + +```js +function drawCircle(context, radius) { + context.moveTo(radius, 0); + context.arc(0, 0, radius, 0, 2 * Math.PI); +} +``` + +You can render to SVG as follows: + +```js +var context = d3.path(); +drawCircle(context, 40); +pathElement.setAttribute("d", context.toString()); +``` + +The path serializer enables [d3-shape](#shapes-d3-shape) to support both Canvas and SVG; see [*line*.context](https://github.com/d3/d3-shape/blob/master/README.md#line_context) and [*area*.context](https://github.com/d3/d3-shape/blob/master/README.md#area_context), for example. + +## [Polygons (d3-polygon)](https://github.com/d3/d3-polygon/blob/master/README.md) + +There’s no longer a d3.geom.polygon constructor; instead you just pass an array of vertices to the polygon methods. So instead of *polygon*.area and *polygon*.centroid, there’s [d3.polygonArea](https://github.com/d3/d3-polygon/blob/master/README.md#polygonArea) and [d3.polygonCentroid](https://github.com/d3/d3-polygon/blob/master/README.md#polygonCentroid). There are also new [d3.polygonContains](https://github.com/d3/d3-polygon/blob/master/README.md#polygonContains) and [d3.polygonLength](https://github.com/d3/d3-polygon/blob/master/README.md#polygonLength) methods. There’s no longer an equivalent to *polygon*.clip, but if [Sutherland–Hodgman clipping](https://en.wikipedia.org/wiki/Sutherland–Hodgman_algorithm) is needed, please [file a feature request](https://github.com/d3/d3-polygon/issues). + +The d3.geom.hull operator has been simplified: instead of an operator with *hull*.x and *hull*.y accessors, there’s just the [d3.polygonHull](https://github.com/d3/d3-polygon/blob/master/README.md#polygonHull) method which takes an array of points and returns the convex hull. + +## [Quadtrees (d3-quadtree)](https://github.com/d3/d3-quadtree/blob/master/README.md) + +The d3.geom.quadtree method has been replaced by [d3.quadtree](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree). 4.0 removes the concept of quadtree “generators†(configurable functions that build a quadtree from an array of data); there are now just quadtrees, which you can create via d3.quadtree and add data to via [*quadtree*.add](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_add) and [*quadtree*.addAll](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_addAll). This code in 3.x: + +```js +var quadtree = d3.geom.quadtree() + .extent([[0, 0], [width, height]]) + (data); +``` + +Can be rewritten in 4.0 as: + +```js +var quadtree = d3.quadtree() + .extent([[0, 0], [width, height]]) + .addAll(data); +``` + +The new quadtree implementation is vastly improved! It is no longer recursive, avoiding stack overflows when there are large numbers of coincident points. The internal storage is now more efficient, and the implementation is also faster; constructing a quadtree of 1M normally-distributed points takes about one second in 4.0, as compared to three seconds in 3.x. + +The change in [internal *node* structure](https://github.com/d3/d3-quadtree/blob/master/README.md#nodes) affects [*quadtree*.visit](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_visit): use *node*.length to distinguish leaf nodes from internal nodes. For example, to iterate over all data in a quadtree: + +```js +quadtree.visit(function(node) { + if (!node.length) { + do { + console.log(node.data); + } while (node = node.next) + } +}); +``` + +There’s a new [*quadtree*.visitAfter](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_visitAfter) method for visiting nodes in post-order traversal. This feature is used in [d3-force](#forces-d3-force) to implement the [Barnes–Hut approximation](https://en.wikipedia.org/wiki/Barnes–Hut_simulation). + +You can now remove data from a quadtree using [*quadtree*.remove](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_remove) and [*quadtree*.removeAll](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_removeAll). When adding data to a quadtree, the quadtree will now expand its extent by repeated doubling if the new point is outside the existing extent of the quadtree. There are also [*quadtree*.extent](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_extent) and [*quadtree*.cover](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_cover) methods for explicitly expanding the extent of the quadtree after creation. + +Quadtrees support several new utility methods: [*quadtree*.copy](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_copy) returns a copy of the quadtree sharing the same data; [*quadtree*.data](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_data) generates an array of all data in the quadtree; [*quadtree*.size](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_size) returns the number of data points in the quadtree; and [*quadtree*.root](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_root) returns the root node, which is useful for manual traversal of the quadtree. The [*quadtree*.find](https://github.com/d3/d3-quadtree/blob/master/README.md#quadtree_find) method now takes an optional search radius, which is useful for pointer-based selection in [force-directed graphs](https://bl.ocks.org/mbostock/ad70335eeef6d167bc36fd3c04378048). + +## [Queues (d3-queue)](https://github.com/d3/d3-queue/blob/master/README.md) + +Formerly known as Queue.js and queue-async, [d3.queue](https://github.com/d3/d3-queue) is now included in the default bundle, making it easy to load data files in parallel. It has been rewritten with fewer closures to improve performance, and there are now stricter checks in place to guarantee well-defined behavior. You can now use instanceof d3.queue and inspect the queue’s internal private state. + +## [Random Numbers (d3-random)](https://github.com/d3/d3-random/blob/master/README.md) + +Pursuant to the great namespace flattening, the random number generators have new names: + +* d3.random.normal ↦ [d3.randomNormal](https://github.com/d3/d3-random/blob/master/README.md#randomNormal) +* d3.random.logNormal ↦ [d3.randomLogNormal](https://github.com/d3/d3-random/blob/master/README.md#randomLogNormal) +* d3.random.bates ↦ [d3.randomBates](https://github.com/d3/d3-random/blob/master/README.md#randomBates) +* d3.random.irwinHall ↦ [d3.randomIrwinHall](https://github.com/d3/d3-random/blob/master/README.md#randomIrwinHall) + +There are also new random number generators for [exponential](https://github.com/d3/d3-random/blob/master/README.md#randomExponential) and [uniform](https://github.com/d3/d3-random/blob/master/README.md#randomUniform) distributions. The [normal](https://github.com/d3/d3-random/blob/master/README.md#randomNormal) and [log-normal](https://github.com/d3/d3-random/blob/master/README.md#randomLogNormal) random generators have been optimized. + +## [Requests (d3-request)](https://github.com/d3/d3-request/blob/master/README.md) + +The d3.xhr method has been renamed to [d3.request](https://github.com/d3/d3-request/blob/master/README.md#request). Basic authentication is now supported using [*request*.user](https://github.com/d3/d3-request/blob/master/README.md#request_user) and [*request*.password](https://github.com/d3/d3-request/blob/master/README.md#request_password). You can now configure a timeout using [*request*.timeout](https://github.com/d3/d3-request/blob/master/README.md#request_timeout). + +If an error occurs, the corresponding [ProgressEvent](https://xhr.spec.whatwg.org/#interface-progressevent) of type “error†is now passed to the error listener, rather than the [XMLHttpRequest](https://xhr.spec.whatwg.org/#interface-xmlhttprequest). Likewise, the ProgressEvent is passed to progress event listeners, rather than using [d3.event](https://github.com/d3/d3-selection/blob/master/README.md#event). If [d3.xml](https://github.com/d3/d3-request/blob/master/README.md#xml) encounters an error parsing XML, this error is now reported to error listeners rather than returning a null response. + +The [d3.request](https://github.com/d3/d3-request/blob/master/README.md#request), [d3.text](https://github.com/d3/d3-request/blob/master/README.md#text) and [d3.xml](https://github.com/d3/d3-request/blob/master/README.md#xml) methods no longer take an optional mime type as the second argument; use [*request*.mimeType](https://github.com/d3/d3-request/blob/master/README.md#request_mimeType) instead. For example: + +```js +d3.xml("file.svg").mimeType("image/svg+xml").get(function(error, svg) { + … +}); +``` + +With the exception of [d3.html](https://github.com/d3/d3-request/blob/master/README.md#html) and [d3.xml](https://github.com/d3/d3-request/blob/master/README.md#xml), Node is now supported via [node-XMLHttpRequest](https://github.com/driverdan/node-XMLHttpRequest). + +## [Scales (d3-scale)](https://github.com/d3/d3-scale/blob/master/README.md) + +Pursuant to the great namespace flattening: + +* d3.scale.linear ↦ [d3.scaleLinear](https://github.com/d3/d3-scale/blob/master/README.md#scaleLinear) +* d3.scale.sqrt ↦ [d3.scaleSqrt](https://github.com/d3/d3-scale/blob/master/README.md#scaleSqrt) +* d3.scale.pow ↦ [d3.scalePow](https://github.com/d3/d3-scale/blob/master/README.md#scalePow) +* d3.scale.log ↦ [d3.scaleLog](https://github.com/d3/d3-scale/blob/master/README.md#scaleLog) +* d3.scale.quantize ↦ [d3.scaleQuantize](https://github.com/d3/d3-scale/blob/master/README.md#scaleQuantize) +* d3.scale.threshold ↦ [d3.scaleThreshold](https://github.com/d3/d3-scale/blob/master/README.md#scaleThreshold) +* d3.scale.quantile ↦ [d3.scaleQuantile](https://github.com/d3/d3-scale/blob/master/README.md#scaleQuantile) +* d3.scale.identity ↦ [d3.scaleIdentity](https://github.com/d3/d3-scale/blob/master/README.md#scaleIdentity) +* d3.scale.ordinal ↦ [d3.scaleOrdinal](https://github.com/d3/d3-scale/blob/master/README.md#scaleOrdinal) +* d3.time.scale ↦ [d3.scaleTime](https://github.com/d3/d3-scale/blob/master/README.md#scaleTime) +* d3.time.scale.utc ↦ [d3.scaleUtc](https://github.com/d3/d3-scale/blob/master/README.md#scaleUtc) + +Scales now generate ticks in the same order as the domain: if you have a descending domain, you now get descending ticks. This change affects the order of tick elements generated by [axes](#axes-d3-axis). For example: + +```js +d3.scaleLinear().domain([10, 0]).ticks(5); // [10, 8, 6, 4, 2, 0] +``` + +[Log tick formatting](https://github.com/d3/d3-scale/blob/master/README.md#log_tickFormat) now assumes a default *count* of ten, not Infinity, if not specified. Log scales with domains that span many powers (such as from 1e+3 to 1e+29) now return only one [tick](https://github.com/d3/d3-scale/blob/master/README.md#log_ticks) per power rather than returning *base* ticks per power. Non-linear quantitative scales are slightly more accurate. + +You can now control whether an ordinal scale’s domain is implicitly extended when the scale is passed a value that is not already in its domain. By default, [*ordinal*.unknown](https://github.com/d3/d3-scale/blob/master/README.md#ordinal_unknown) is [d3.scaleImplicit](https://github.com/d3/d3-scale/blob/master/README.md#scaleImplicit), causing unknown values to be added to the domain: + +```js +var x = d3.scaleOrdinal() + .domain([0, 1]) + .range(["red", "green", "blue"]); + +x.domain(); // [0, 1] +x(2); // "blue" +x.domain(); // [0, 1, 2] +``` + +By setting *ordinal*.unknown, you instead define the output value for unknown inputs. This is particularly useful for choropleth maps where you want to assign a color to missing data. + +```js +var x = d3.scaleOrdinal() + .domain([0, 1]) + .range(["red", "green", "blue"]) + .unknown(undefined); + +x.domain(); // [0, 1] +x(2); // undefined +x.domain(); // [0, 1] +``` + +The *ordinal*.rangeBands and *ordinal*.rangeRoundBands methods have been replaced with a new subclass of ordinal scale: [band scales](https://github.com/d3/d3-scale/blob/master/README.md#band-scales). The following code in 3.x: + +```js +var x = d3.scale.ordinal() + .domain(["a", "b", "c"]) + .rangeBands([0, width]); +``` + +Is equivalent to this in 4.0: + +```js +var x = d3.scaleBand() + .domain(["a", "b", "c"]) + .range([0, width]); +``` + +The new [*band*.padding](https://github.com/d3/d3-scale/blob/master/README.md#band_padding), [*band*.paddingInner](https://github.com/d3/d3-scale/blob/master/README.md#band_paddingInner) and [*band*.paddingOuter](https://github.com/d3/d3-scale/blob/master/README.md#band_paddingOuter) methods replace the optional arguments to *ordinal*.rangeBands. The new [*band*.bandwidth](https://github.com/d3/d3-scale/blob/master/README.md#band_bandwidth) and [*band*.step](https://github.com/d3/d3-scale/blob/master/README.md#band_step) methods replace *ordinal*.rangeBand. There’s also a new [*band*.align](https://github.com/d3/d3-scale/blob/master/README.md#band_align) method which you can use to control how the extra space outside the bands is distributed, say to shift columns closer to the *y*-axis. + +Similarly, the *ordinal*.rangePoints and *ordinal*.rangeRoundPoints methods have been replaced with a new subclass of ordinal scale: [point scales](https://github.com/d3/d3-scale/blob/master/README.md#point-scales). The following code in 3.x: + +```js +var x = d3.scale.ordinal() + .domain(["a", "b", "c"]) + .rangePoints([0, width]); +``` + +Is equivalent to this in 4.0: + +```js +var x = d3.scalePoint() + .domain(["a", "b", "c"]) + .range([0, width]); +``` + +The new [*point*.padding](https://github.com/d3/d3-scale/blob/master/README.md#point_padding) method replaces the optional *padding* argument to *ordinal*.rangePoints. Like *ordinal*.rangeBand with *ordinal*.rangePoints, the [*point*.bandwidth](https://github.com/d3/d3-scale/blob/master/README.md#point_bandwidth) method always returns zero; a new [*point*.step](https://github.com/d3/d3-scale/blob/master/README.md#point_step) method returns the interval between adjacent points. + +The [ordinal scale constructor](https://github.com/d3/d3-scale/blob/master/README.md#ordinal-scales) now takes an optional *range* for a shorter alternative to [*ordinal*.range](https://github.com/d3/d3-scale/blob/master/README.md#ordinal_range). This is especially useful now that the categorical color scales have been changed to simple arrays of colors rather than specialized ordinal scale constructors: + +* d3.scale.category10 ↦ [d3.schemeCategory10](https://github.com/d3/d3-scale/blob/master/README.md#schemeCategory10) +* d3.scale.category20 ↦ [d3.schemeCategory20](https://github.com/d3/d3-scale/blob/master/README.md#schemeCategory20) +* d3.scale.category20b ↦ [d3.schemeCategory20b](https://github.com/d3/d3-scale/blob/master/README.md#schemeCategory20b) +* d3.scale.category20c ↦ [d3.schemeCategory20c](https://github.com/d3/d3-scale/blob/master/README.md#schemeCategory20c) + +The following code in 3.x: + +```js +var color = d3.scale.category10(); +``` + +Is equivalent to this in 4.0: + +```js +var color = d3.scaleOrdinal(d3.schemeCategory10); +``` + +[Sequential scales](https://github.com/d3/d3-scale/blob/master/README.md#scaleSequential), are a new class of scales with a fixed output [interpolator](https://github.com/d3/d3-scale/blob/master/README.md#sequential_interpolator) instead of a [range](https://github.com/d3/d3-scale/blob/master/README.md#continuous_range). Typically these scales are used to implement continuous sequential or diverging color schemes. Inspired by Matplotlib’s new [perceptually-motived colormaps](https://bids.github.io/colormap/), 4.0 now features [viridis](https://github.com/d3/d3-scale/blob/master/README.md#interpolateViridis), [inferno](https://github.com/d3/d3-scale/blob/master/README.md#interpolateInferno), [magma](https://github.com/d3/d3-scale/blob/master/README.md#interpolateMagma), [plasma](https://github.com/d3/d3-scale/blob/master/README.md#interpolatePlasma) interpolators for use with sequential scales. Using [d3.quantize](https://github.com/d3/d3-interpolate/blob/master/README.md#quantize), these interpolators can also be applied to [quantile](https://github.com/d3/d3-scale/blob/master/README.md#quantile-scales), [quantize](https://github.com/d3/d3-scale/blob/master/README.md#quantize-scales) and [threshold](https://github.com/d3/d3-scale/blob/master/README.md#threshold-scales) scales. + +[viridis](https://github.com/d3/d3-scale/blob/master/README.md#interpolateViridis) +[inferno](https://github.com/d3/d3-scale/blob/master/README.md#interpolateInferno) +[magma](https://github.com/d3/d3-scale/blob/master/README.md#interpolateMagma) +[plasma](https://github.com/d3/d3-scale/blob/master/README.md#interpolatePlasma) + +4.0 also ships new Cubehelix schemes, including [Dave Green’s default](https://github.com/d3/d3-scale/blob/master/README.md#interpolateCubehelixDefault) and a [cyclical rainbow](https://github.com/d3/d3-scale/blob/master/README.md#interpolateRainbow) inspired by [Matteo Niccoli](https://mycarta.wordpress.com/2013/02/21/perceptual-rainbow-palette-the-method/): + +[cubehelix](https://github.com/d3/d3-scale/blob/master/README.md#interpolateCubehelixDefault) +[rainbow](https://github.com/d3/d3-scale/blob/master/README.md#interpolateRainbow) +[warm](https://github.com/d3/d3-scale/blob/master/README.md#interpolateWarm) +[cool](https://github.com/d3/d3-scale/blob/master/README.md#interpolateCool) + +For even more sequential and categorical color schemes, see [d3-scale-chromatic](https://github.com/d3/d3-scale-chromatic). + +For an introduction to scales, see [Introducing d3-scale](https://medium.com/@mbostock/introducing-d3-scale-61980c51545f). + +## [Selections (d3-selection)](https://github.com/d3/d3-selection/blob/master/README.md) + +Selections no longer subclass Array using [prototype chain injection](http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/#wrappers_prototype_chain_injection); they are now plain objects, improving performance. The internal fields (*selection*.\_groups, *selection*.\_parents) are private; please use the documented public API to manipulate selections. The new [*selection*.nodes](https://github.com/d3/d3-selection/blob/master/README.md#selection_nodes) method generates an array of all nodes in a selection. + +Selections are now immutable: the elements and parents in a selection never change. (The elements’ attributes and content will of course still be modified!) The [*selection*.sort](https://github.com/d3/d3-selection/blob/master/README.md#selection_sort) and [*selection*.data](https://github.com/d3/d3-selection/blob/master/README.md#selection_data) methods now return new selections rather than modifying the selection in-place. In addition, [*selection*.append](https://github.com/d3/d3-selection/blob/master/README.md#selection_append) no longer merges entering nodes into the update selection; use [*selection*.merge](https://github.com/d3/d3-selection/blob/master/README.md#selection_merge) to combine enter and update after a data join. For example, the following [general update pattern](https://bl.ocks.org/mbostock/a8a5baa4c4a470cda598) in 3.x: + +```js +var circle = svg.selectAll("circle").data(data) // UPDATE + .style("fill", "blue"); + +circle.exit().remove(); // EXIT + +circle.enter().append("circle") // ENTER; modifies UPDATE! 🌶 + .style("fill", "green"); + +circle // ENTER + UPDATE + .style("stroke", "black"); +``` + +Would be rewritten in 4.0 as: + +```js +var circle = svg.selectAll("circle").data(data) // UPDATE + .style("fill", "blue"); + +circle.exit().remove(); // EXIT + +circle.enter().append("circle") // ENTER + .style("fill", "green") + .merge(circle) // ENTER + UPDATE + .style("stroke", "black"); +``` + +This change is discussed further in [What Makes Software Good](https://medium.com/@mbostock/what-makes-software-good-943557f8a488). + +In 3.x, the [*selection*.enter](https://github.com/d3/d3-selection/blob/master/README.md#selection_enter) and [*selection*.exit](https://github.com/d3/d3-selection/blob/master/README.md#selection_exit) methods were undefined until you called *selection*.data, resulting in a TypeError if you attempted to access them. In 4.0, now they simply return the empty selection if the selection has not been joined to data. + +In 3.x, [*selection*.append](https://github.com/d3/d3-selection/blob/master/README.md#selection_append) would always append the new element as the last child of its parent. A little-known trick was to use [*selection*.insert](https://github.com/d3/d3-selection/blob/master/README.md#selection_insert) without specifying a *before* selector when entering nodes, causing the entering nodes to be inserted before the following element in the update selection. In 4.0, this is now the default behavior of *selection*.append; if you do not specify a *before* selector to *selection*.insert, the inserted element is appended as the last child. This change makes the general update pattern preserve the relative order of elements and data. For example, given the following DOM: + +```html +
a
+
b
+
f
+``` + +And the following code: + +```js +var div = d3.select("body").selectAll("div") + .data(["a", "b", "c", "d", "e", "f"], function(d) { return d || this.textContent; }); + +div.enter().append("div") + .text(function(d) { return d; }); +``` + +The resulting DOM will be: + +```html +
a
+
b
+
c
+
d
+
e
+
f
+``` + +Thus, the entering *c*, *d* and *e* are inserted before *f*, since *f* is the following element in the update selection. Although this behavior is sufficient to preserve order if the new data’s order is stable, if the data changes order, you must still use [*selection*.order](https://github.com/d3/d3-selection/blob/master/README.md#selection_order) to reorder elements. + +There is now only one class of selection. 3.x implemented enter selections using a special class with different behavior for *enter*.append and *enter*.select; a consequence of this design was that enter selections in 3.x lacked [certain methods](https://github.com/d3/d3/issues/2043). In 4.0, enter selections are simply normal selections; they have the same methods and the same behavior. Placeholder [enter nodes](https://github.com/d3/d3-selection/blob/master/src/selection/enter.js) now implement [*node*.appendChild](https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild), [*node*.insertBefore](https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore), [*node*.querySelector](https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector), and [*node*.querySelectorAll](https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll). + +The [*selection*.data](https://github.com/d3/d3-selection/blob/master/README.md#selection_data) method has been changed slightly with respect to duplicate keys. In 3.x, if multiple data had the same key, the duplicate data would be ignored and not included in enter, update or exit; in 4.0 the duplicate data is always put in the enter selection. In both 3.x and 4.0, if multiple elements have the same key, the duplicate elements are put in the exit selection. Thus, 4.0’s behavior is now symmetric for enter and exit, and the general update pattern will now produce a DOM that matches the data even if there are duplicate keys. + +Selections have several new methods! Use [*selection*.raise](https://github.com/d3/d3-selection/blob/master/README.md#selection_raise) to move the selected elements to the front of their siblings, so that they are drawn on top; use [*selection*.lower](https://github.com/d3/d3-selection/blob/master/README.md#selection_lower) to move them to the back. Use [*selection*.dispatch](https://github.com/d3/d3-selection/blob/master/README.md#selection_dispatch) to dispatch a [custom event](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent) to event listeners. + +When called in getter mode, [*selection*.data](https://github.com/d3/d3-selection/blob/master/README.md#selection_data) now returns the data for all elements in the selection, rather than just the data for the first group of elements. The [*selection*.call](https://github.com/d3/d3-selection/blob/master/README.md#selection_call) method no longer sets the `this` context when invoking the specified function; the *selection* is passed as the first argument to the function, so use that. The [*selection*.on](https://github.com/d3/d3-selection/blob/master/README.md#selection_on) method now accepts multiple whitespace-separated typenames, so you can add or remove multiple listeners simultaneously. For example: + +```js +selection.on("mousedown touchstart", function() { + console.log(d3.event.type); +}); +``` + +The arguments passed to callback functions has changed slightly in 4.0 to be more consistent. The standard arguments are the element’s datum (*d*), the element’s index (*i*), and the element’s group (*nodes*), with *this* as the element. The slight exception to this convention is *selection*.data, which is evaluated for each group rather than each element; it is passed the group’s parent datum (*d*), the group index (*i*), and the selection’s parents (*parents*), with *this* as the group’s parent. + +The new [d3.local](https://github.com/d3/d3-selection/blob/master/README.md#local-variables) provides a mechanism for defining [local variables](https://bl.ocks.org/mbostock/e1192fe405703d8321a5187350910e08): state that is bound to DOM elements, and available to any descendant element. This can be a convenient alternative to using [*selection*.each](https://github.com/d3/d3-selection/blob/master/README.md#selection_each) or storing local state in data. + +The d3.ns.prefix namespace prefix map has been renamed to [d3.namespaces](https://github.com/d3/d3-selection/blob/master/README.md#namespaces), and the d3.ns.qualify method has been renamed to [d3.namespace](https://github.com/d3/d3-selection/blob/master/README.md#namespace). Several new low-level methods are now available, as well. [d3.matcher](https://github.com/d3/d3-selection/blob/master/README.md#matcher) is used internally by [*selection*.filter](https://github.com/d3/d3-selection/blob/master/README.md#selection_filter); [d3.selector](https://github.com/d3/d3-selection/blob/master/README.md#selector) is used by [*selection*.select](https://github.com/d3/d3-selection/blob/master/README.md#selection_select); [d3.selectorAll](https://github.com/d3/d3-selection/blob/master/README.md#selectorAll) is used by [*selection*.selectAll](https://github.com/d3/d3-selection/blob/master/README.md#selection_selectAll); [d3.creator](https://github.com/d3/d3-selection/blob/master/README.md#creator) is used by [*selection*.append](https://github.com/d3/d3-selection/blob/master/README.md#selection_append) and [*selection*.insert](https://github.com/d3/d3-selection/blob/master/README.md#selection_insert). The new [d3.window](https://github.com/d3/d3-selection/blob/master/README.md#window) returns the owner window for a given element, window or document. The new [d3.customEvent](https://github.com/d3/d3-selection/blob/master/README.md#customEvent) temporarily sets [d3.event](https://github.com/d3/d3-selection/blob/master/README.md#event) while invoking a function, allowing you to implement controls which dispatch custom events; this is used by [d3-drag](https://github.com/d3/d3-drag), [d3-zoom](https://github.com/d3/d3-zoom) and [d3-brush](https://github.com/d3/d3-brush). + +For the sake of parsimony, the multi-value methods—where you pass an object to set multiple attributes, styles or properties simultaneously—have been extracted to [d3-selection-multi](https://github.com/d3/d3-selection-multi) and are no longer part of the default bundle. The multi-value map methods have also been renamed to plural form to reduce overload: [*selection*.attrs](https://github.com/d3/d3-selection-multi/blob/master/README.md#selection_attrs), [*selection*.styles](https://github.com/d3/d3-selection-multi/blob/master/README.md#selection_styles) and [*selection*.properties](https://github.com/d3/d3-selection-multi/blob/master/README.md#selection_properties). + +## [Shapes (d3-shape)](https://github.com/d3/d3-shape/blob/master/README.md) + +Pursuant to the great namespace flattening: + +* d3.svg.line ↦ [d3.line](https://github.com/d3/d3-shape/blob/master/README.md#lines) +* d3.svg.line.radial ↦ [d3.radialLine](https://github.com/d3/d3-shape/blob/master/README.md#radialLine) +* d3.svg.area ↦ [d3.area](https://github.com/d3/d3-shape/blob/master/README.md#areas) +* d3.svg.area.radial ↦ [d3.radialArea](https://github.com/d3/d3-shape/blob/master/README.md#radialArea) +* d3.svg.arc ↦ [d3.arc](https://github.com/d3/d3-shape/blob/master/README.md#arcs) +* d3.svg.symbol ↦ [d3.symbol](https://github.com/d3/d3-shape/blob/master/README.md#symbols) +* d3.svg.symbolTypes ↦ [d3.symbolTypes](https://github.com/d3/d3-shape/blob/master/README.md#symbolTypes) +* d3.layout.pie ↦ [d3.pie](https://github.com/d3/d3-shape/blob/master/README.md#pies) +* d3.layout.stack ↦ [d3.stack](https://github.com/d3/d3-shape/blob/master/README.md#stacks) +* d3.svg.diagonal ↦ REMOVED (see [d3/d3-shape#27](https://github.com/d3/d3-shape/issues/27)) +* d3.svg.diagonal.radial ↦ REMOVED + +Shapes are no longer limited to SVG; they can now render to Canvas! Shape generators now support an optional *context*: given a [CanvasRenderingContext2D](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D), you can render a shape as a canvas path to be filled or stroked. For example, a [canvas pie chart](https://bl.ocks.org/mbostock/8878e7fd82034f1d63cf) might use an arc generator: + +```js +var arc = d3.arc() + .outerRadius(radius - 10) + .innerRadius(0) + .context(context); +``` + +To render an arc for a given datum *d*: + +```js +context.beginPath(); +arc(d); +context.fill(); +``` + +See [*line*.context](https://github.com/d3/d3-shape/blob/master/README.md#line_context), [*area*.context](https://github.com/d3/d3-shape/blob/master/README.md#area_context) and [*arc*.context](https://github.com/d3/d3-shape/blob/master/README.md#arc_context) for more. Under the hood, shapes use [d3-path](#paths-d3-path) to serialize canvas path methods to SVG path data when the context is null; thus, shapes are optimized for rendering to canvas. You can also now derive lines from areas. The line shares most of the same accessors, such as [*line*.defined](https://github.com/d3/d3-shape/blob/master/README.md#line_defined) and [*line*.curve](https://github.com/d3/d3-shape/blob/master/README.md#line_curve), with the area from which it is derived. For example, to render the topline of an area, use [*area*.lineY1](https://github.com/d3/d3-shape/blob/master/README.md#area_lineY1); for the baseline, use [*area*.lineY0](https://github.com/d3/d3-shape/blob/master/README.md#area_lineY0). + +4.0 introduces a new curve API for specifying how line and area shapes interpolate between data points. The *line*.interpolate and *area*.interpolate methods have been replaced with [*line*.curve](https://github.com/d3/d3-shape/blob/master/README.md#line_curve) and [*area*.curve](https://github.com/d3/d3-shape/blob/master/README.md#area_curve). Curves are implemented using the [curve interface](https://github.com/d3/d3-shape/blob/master/README.md#custom-curves) rather than as a function that returns an SVG path data string; this allows curves to render to either SVG or Canvas. In addition, *line*.curve and *area*.curve now take a function which instantiates a curve for a given *context*, rather than a string. The full list of equivalents: + +* linear ↦ [d3.curveLinear](https://github.com/d3/d3-shape/blob/master/README.md#curveLinear) +* linear-closed ↦ [d3.curveLinearClosed](https://github.com/d3/d3-shape/blob/master/README.md#curveLinearClosed) +* step ↦ [d3.curveStep](https://github.com/d3/d3-shape/blob/master/README.md#curveStep) +* step-before ↦ [d3.curveStepBefore](https://github.com/d3/d3-shape/blob/master/README.md#curveStepBefore) +* step-after ↦ [d3.curveStepAfter](https://github.com/d3/d3-shape/blob/master/README.md#curveStepAfter) +* basis ↦ [d3.curveBasis](https://github.com/d3/d3-shape/blob/master/README.md#curveBasis) +* basis-open ↦ [d3.curveBasisOpen](https://github.com/d3/d3-shape/blob/master/README.md#curveBasisOpen) +* basis-closed ↦ [d3.curveBasisClosed](https://github.com/d3/d3-shape/blob/master/README.md#curveBasisClosed) +* bundle ↦ [d3.curveBundle](https://github.com/d3/d3-shape/blob/master/README.md#curveBundle) +* cardinal ↦ [d3.curveCardinal](https://github.com/d3/d3-shape/blob/master/README.md#curveCardinal) +* cardinal-open ↦ [d3.curveCardinalOpen](https://github.com/d3/d3-shape/blob/master/README.md#curveCardinalOpen) +* cardinal-closed ↦ [d3.curveCardinalClosed](https://github.com/d3/d3-shape/blob/master/README.md#curveCardinalClosed) +* monotone ↦ [d3.curveMonotoneX](https://github.com/d3/d3-shape/blob/master/README.md#curveMonotoneX) + +But that’s not all! 4.0 now provides parameterized Catmull–Rom splines as proposed by [Yuksel *et al.*](http://www.cemyuksel.com/research/catmullrom_param/). These are available as [d3.curveCatmullRom](https://github.com/d3/d3-shape/blob/master/README.md#curveCatmullRom), [d3.curveCatmullRomClosed](https://github.com/d3/d3-shape/blob/master/README.md#curveCatmullRomClosed) and [d3.curveCatmullRomOpen](https://github.com/d3/d3-shape/blob/master/README.md#curveCatmullRomOpen). + +catmullRom +catmullRomOpen +catmullRomClosed + +Each curve type can define its own named parameters, replacing *line*.tension and *area*.tension. For example, Catmull–Rom splines are parameterized using [*catmullRom*.alpha](https://github.com/d3/d3-shape/blob/master/README.md#curveCatmullRom_alpha) and defaults to 0.5, which corresponds to a centripetal spline that avoids self-intersections and overshoot. For a uniform Catmull–Rom spline instead: + +```js +var line = d3.line() + .curve(d3.curveCatmullRom.alpha(0)); +``` + +4.0 fixes the interpretation of the cardinal spline *tension* parameter, which is now specified as [*cardinal*.tension](https://github.com/d3/d3-shape/blob/master/README.md#curveCardinal_tension) and defaults to zero for a uniform Catmull–Rom spline; a tension of one produces a linear curve. The first and last segments of basis and cardinal curves have also been fixed! The undocumented *interpolate*.reverse field has been removed. Curves can define different behavior for toplines and baselines by counting the sequence of [*curve*.lineStart](https://github.com/d3/d3-shape/blob/master/README.md#curve_lineStart) within [*curve*.areaStart](https://github.com/d3/d3-shape/blob/master/README.md#curve_areaStart). See the [d3.curveStep implementation](https://github.com/d3/d3-shape/blob/master/src/curve/step.js) for an example. + +4.0 fixes numerous bugs in the monotone curve implementation, and introduces [d3.curveMonotoneY](https://github.com/d3/d3-shape/blob/master/README.md#curveMonotoneY); this is like d3.curveMonotoneX, except it requires that the input points are monotone in *y* rather than *x*, such as for a vertically-oriented line chart. The new [d3.curveNatural](https://github.com/d3/d3-shape/blob/master/README.md#curveNatural) produces a [natural cubic spline](http://mathworld.wolfram.com/CubicSpline.html). The default [β](https://github.com/d3/d3-shape/blob/master/README.md#bundle_beta) for [d3.curveBundle](https://github.com/d3/d3-shape/blob/master/README.md#curveBundle) is now 0.85, rather than 0.7, matching the values used by [Holten](https://www.win.tue.nl/vis1/home/dholten/papers/bundles_infovis.pdf). 4.0 also has a more robust implementation of arc padding; see [*arc*.padAngle](https://github.com/d3/d3-shape/blob/master/README.md#arc_padAngle) and [*arc*.padRadius](https://github.com/d3/d3-shape/blob/master/README.md#arc_padRadius). + +4.0 introduces a new symbol type API. Symbol types are passed to [*symbol*.type](https://github.com/d3/d3-shape/blob/master/README.md#symbol_type) in place of strings. The equivalents are: + +* circle ↦ [d3.symbolCircle](https://github.com/d3/d3-shape/blob/master/README.md#symbolCircle) +* cross ↦ [d3.symbolCross](https://github.com/d3/d3-shape/blob/master/README.md#symbolCross) +* diamond ↦ [d3.symbolDiamond](https://github.com/d3/d3-shape/blob/master/README.md#symbolDiamond) +* square ↦ [d3.symbolSquare](https://github.com/d3/d3-shape/blob/master/README.md#symbolSquare) +* triangle-down ↦ REMOVED +* triangle-up ↦ [d3.symbolTriangle](https://github.com/d3/d3-shape/blob/master/README.md#symbolTriangle) +* ADDED ↦ [d3.symbolStar](https://github.com/d3/d3-shape/blob/master/README.md#symbolStar) +* ADDED ↦ [d3.symbolWye](https://github.com/d3/d3-shape/blob/master/README.md#symbolWye) + +The full set of symbol types is now: + + + +Lastly, 4.0 overhauls the stack layout API, replacing d3.layout.stack with [d3.stack](https://github.com/d3/d3-shape/blob/master/README.md#stacks). The stack generator no longer needs an *x*-accessor. In addition, the API has been simplified: the *stack* generator now accepts tabular input, such as this array of objects: + +```js +var data = [ + {month: new Date(2015, 0, 1), apples: 3840, bananas: 1920, cherries: 960, dates: 400}, + {month: new Date(2015, 1, 1), apples: 1600, bananas: 1440, cherries: 960, dates: 400}, + {month: new Date(2015, 2, 1), apples: 640, bananas: 960, cherries: 640, dates: 400}, + {month: new Date(2015, 3, 1), apples: 320, bananas: 480, cherries: 640, dates: 400} +]; +``` + +To generate the stack layout, first define a stack generator, and then apply it to the data: + +```js +var stack = d3.stack() + .keys(["apples", "bananas", "cherries", "dates"]) + .order(d3.stackOrderNone) + .offset(d3.stackOffsetNone); + +var series = stack(data); +``` + +The resulting array has one element per *series*. Each series has one point per month, and each point has a lower and upper value defining the baseline and topline: + +```js +[ + [[ 0, 3840], [ 0, 1600], [ 0, 640], [ 0, 320]], // apples + [[3840, 5760], [1600, 3040], [ 640, 1600], [ 320, 800]], // bananas + [[5760, 6720], [3040, 4000], [1600, 2240], [ 800, 1440]], // cherries + [[6720, 7120], [4000, 4400], [2240, 2640], [1440, 1840]], // dates +] +``` + +Each series in then typically passed to an [area generator](https://github.com/d3/d3-shape/blob/master/README.md#areas) to render an area chart, or used to construct rectangles for a bar chart. Stack generators no longer modify the input data, so *stack*.out has been removed. + +For an introduction to shapes, see [Introducing d3-shape](https://medium.com/@mbostock/introducing-d3-shape-73f8367e6d12). + +## [Time Formats (d3-time-format)](https://github.com/d3/d3-time-format/blob/master/README.md) + +Pursuant to the great namespace flattening, the format constructors have new names: + +* d3.time.format ↦ [d3.timeFormat](https://github.com/d3/d3-time-format/blob/master/README.md#timeFormat) +* d3.time.format.utc ↦ [d3.utcFormat](https://github.com/d3/d3-time-format/blob/master/README.md#utcFormat) +* d3.time.format.iso ↦ [d3.isoFormat](https://github.com/d3/d3-time-format/blob/master/README.md#isoFormat) + +The *format*.parse method has also been removed in favor of separate [d3.timeParse](https://github.com/d3/d3-time-format/blob/master/README.md#timeParse), [d3.utcParse](https://github.com/d3/d3-time-format/blob/master/README.md#utcParse) and [d3.isoParse](https://github.com/d3/d3-time-format/blob/master/README.md#isoParse) parser constructors. Thus, this code in 3.x: + +```js +var parseTime = d3.time.format("%c").parse; +``` + +Can be rewritten in 4.0 as: + +```js +var parseTime = d3.timeParse("%c"); +``` + +The multi-scale time format d3.time.format.multi has been replaced by [d3.scaleTime](https://github.com/d3/d3-scale/blob/master/README.md#scaleTime)’s [tick format](https://github.com/d3/d3-scale/blob/master/README.md#time_tickFormat). Time formats now coerce inputs to dates, and time parsers coerce inputs to strings. The `%Z` directive now allows more flexible parsing of time zone offsets, such as `-0700`, `-07:00`, `-07`, and `Z`. The `%p` directive is now parsed correctly when the locale’s period name is longer than two characters (*e.g.*, “a.m.â€). + +The default U.S. English locale now uses 12-hour time and a more concise representation of the date. This aligns with local convention and is consistent with [*date*.toLocaleString](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString) in Chrome, Firefox and Node: + +```js +var now = new Date; +d3.timeFormat("%c")(new Date); // "6/23/2016, 2:01:33 PM" +d3.timeFormat("%x")(new Date); // "6/23/2016" +d3.timeFormat("%X")(new Date); // "2:01:38 PM" +``` + +You can now set the default locale using [d3.timeFormatDefaultLocale](https://github.com/d3/d3-time-format/blob/master/README.md#timeFormatDefaultLocale)! The locales are published as [JSON](https://github.com/d3/d3-request/blob/master/README.md#json) to [npm](https://unpkg.com/d3-time-format/locale/). + +The performance of time formatting and parsing has been improved, and the UTC formatter and parser have a cleaner implementation (that avoids temporarily overriding the Date global). + +## [Time Intervals (d3-time)](https://github.com/d3/d3-time/blob/master/README.md) + +Pursuant to the great namespace flattening, the local time intervals have been renamed: + +* ADDED ↦ [d3.timeMillisecond](https://github.com/d3/d3-time/blob/master/README.md#timeMillisecond) +* d3.time.second ↦ [d3.timeSecond](https://github.com/d3/d3-time/blob/master/README.md#timeSecond) +* d3.time.minute ↦ [d3.timeMinute](https://github.com/d3/d3-time/blob/master/README.md#timeMinute) +* d3.time.hour ↦ [d3.timeHour](https://github.com/d3/d3-time/blob/master/README.md#timeHour) +* d3.time.day ↦ [d3.timeDay](https://github.com/d3/d3-time/blob/master/README.md#timeDay) +* d3.time.sunday ↦ [d3.timeSunday](https://github.com/d3/d3-time/blob/master/README.md#timeSunday) +* d3.time.monday ↦ [d3.timeMonday](https://github.com/d3/d3-time/blob/master/README.md#timeMonday) +* d3.time.tuesday ↦ [d3.timeTuesday](https://github.com/d3/d3-time/blob/master/README.md#timeTuesday) +* d3.time.wednesday ↦ [d3.timeWednesday](https://github.com/d3/d3-time/blob/master/README.md#timeWednesday) +* d3.time.thursday ↦ [d3.timeThursday](https://github.com/d3/d3-time/blob/master/README.md#timeThursday) +* d3.time.friday ↦ [d3.timeFriday](https://github.com/d3/d3-time/blob/master/README.md#timeFriday) +* d3.time.saturday ↦ [d3.timeSaturday](https://github.com/d3/d3-time/blob/master/README.md#timeSaturday) +* d3.time.week ↦ [d3.timeWeek](https://github.com/d3/d3-time/blob/master/README.md#timeWeek) +* d3.time.month ↦ [d3.timeMonth](https://github.com/d3/d3-time/blob/master/README.md#timeMonth) +* d3.time.year ↦ [d3.timeYear](https://github.com/d3/d3-time/blob/master/README.md#timeYear) + +The UTC time intervals have likewise been renamed: + +* ADDED ↦ [d3.utcMillisecond](https://github.com/d3/d3-time/blob/master/README.md#utcMillisecond) +* d3.time.second.utc ↦ [d3.utcSecond](https://github.com/d3/d3-time/blob/master/README.md#utcSecond) +* d3.time.minute.utc ↦ [d3.utcMinute](https://github.com/d3/d3-time/blob/master/README.md#utcMinute) +* d3.time.hour.utc ↦ [d3.utcHour](https://github.com/d3/d3-time/blob/master/README.md#utcHour) +* d3.time.day.utc ↦ [d3.utcDay](https://github.com/d3/d3-time/blob/master/README.md#utcDay) +* d3.time.sunday.utc ↦ [d3.utcSunday](https://github.com/d3/d3-time/blob/master/README.md#utcSunday) +* d3.time.monday.utc ↦ [d3.utcMonday](https://github.com/d3/d3-time/blob/master/README.md#utcMonday) +* d3.time.tuesday.utc ↦ [d3.utcTuesday](https://github.com/d3/d3-time/blob/master/README.md#utcTuesday) +* d3.time.wednesday.utc ↦ [d3.utcWednesday](https://github.com/d3/d3-time/blob/master/README.md#utcWednesday) +* d3.time.thursday.utc ↦ [d3.utcThursday](https://github.com/d3/d3-time/blob/master/README.md#utcThursday) +* d3.time.friday.utc ↦ [d3.utcFriday](https://github.com/d3/d3-time/blob/master/README.md#utcFriday) +* d3.time.saturday.utc ↦ [d3.utcSaturday](https://github.com/d3/d3-time/blob/master/README.md#utcSaturday) +* d3.time.week.utc ↦ [d3.utcWeek](https://github.com/d3/d3-time/blob/master/README.md#utcWeek) +* d3.time.month.utc ↦ [d3.utcMonth](https://github.com/d3/d3-time/blob/master/README.md#utcMonth) +* d3.time.year.utc ↦ [d3.utcYear](https://github.com/d3/d3-time/blob/master/README.md#utcYear) + +The local time range aliases have been renamed: + +* d3.time.seconds ↦ [d3.timeSeconds](https://github.com/d3/d3-time/blob/master/README.md#timeSeconds) +* d3.time.minutes ↦ [d3.timeMinutes](https://github.com/d3/d3-time/blob/master/README.md#timeMinutes) +* d3.time.hours ↦ [d3.timeHours](https://github.com/d3/d3-time/blob/master/README.md#timeHours) +* d3.time.days ↦ [d3.timeDays](https://github.com/d3/d3-time/blob/master/README.md#timeDays) +* d3.time.sundays ↦ [d3.timeSundays](https://github.com/d3/d3-time/blob/master/README.md#timeSundays) +* d3.time.mondays ↦ [d3.timeMondays](https://github.com/d3/d3-time/blob/master/README.md#timeMondays) +* d3.time.tuesdays ↦ [d3.timeTuesdays](https://github.com/d3/d3-time/blob/master/README.md#timeTuesdays) +* d3.time.wednesdays ↦ [d3.timeWednesdays](https://github.com/d3/d3-time/blob/master/README.md#timeWednesdays) +* d3.time.thursdays ↦ [d3.timeThursdays](https://github.com/d3/d3-time/blob/master/README.md#timeThursdays) +* d3.time.fridays ↦ [d3.timeFridays](https://github.com/d3/d3-time/blob/master/README.md#timeFridays) +* d3.time.saturdays ↦ [d3.timeSaturdays](https://github.com/d3/d3-time/blob/master/README.md#timeSaturdays) +* d3.time.weeks ↦ [d3.timeWeeks](https://github.com/d3/d3-time/blob/master/README.md#timeWeeks) +* d3.time.months ↦ [d3.timeMonths](https://github.com/d3/d3-time/blob/master/README.md#timeMonths) +* d3.time.years ↦ [d3.timeYears](https://github.com/d3/d3-time/blob/master/README.md#timeYears) + +The UTC time range aliases have been renamed: + +* d3.time.seconds.utc ↦ [d3.utcSeconds](https://github.com/d3/d3-time/blob/master/README.md#utcSeconds) +* d3.time.minutes.utc ↦ [d3.utcMinutes](https://github.com/d3/d3-time/blob/master/README.md#utcMinutes) +* d3.time.hours.utc ↦ [d3.utcHours](https://github.com/d3/d3-time/blob/master/README.md#utcHours) +* d3.time.days.utc ↦ [d3.utcDays](https://github.com/d3/d3-time/blob/master/README.md#utcDays) +* d3.time.sundays.utc ↦ [d3.utcSundays](https://github.com/d3/d3-time/blob/master/README.md#utcSundays) +* d3.time.mondays.utc ↦ [d3.utcMondays](https://github.com/d3/d3-time/blob/master/README.md#utcMondays) +* d3.time.tuesdays.utc ↦ [d3.utcTuesdays](https://github.com/d3/d3-time/blob/master/README.md#utcTuesdays) +* d3.time.wednesdays.utc ↦ [d3.utcWednesdays](https://github.com/d3/d3-time/blob/master/README.md#utcWednesdays) +* d3.time.thursdays.utc ↦ [d3.utcThursdays](https://github.com/d3/d3-time/blob/master/README.md#utcThursdays) +* d3.time.fridays.utc ↦ [d3.utcFridays](https://github.com/d3/d3-time/blob/master/README.md#utcFridays) +* d3.time.saturdays.utc ↦ [d3.utcSaturdays](https://github.com/d3/d3-time/blob/master/README.md#utcSaturdays) +* d3.time.weeks.utc ↦ [d3.utcWeeks](https://github.com/d3/d3-time/blob/master/README.md#utcWeeks) +* d3.time.months.utc ↦ [d3.utcMonths](https://github.com/d3/d3-time/blob/master/README.md#utcMonths) +* d3.time.years.utc ↦ [d3.utcYears](https://github.com/d3/d3-time/blob/master/README.md#utcYears) + +The behavior of [*interval*.range](https://github.com/d3/d3-time/blob/master/README.md#interval_range) (and the convenience aliases such as [d3.timeDays](https://github.com/d3/d3-time/blob/master/README.md#timeDays)) has been changed when *step* is greater than one. Rather than filtering the returned dates using the field number, *interval*.range now behaves like [d3.range](https://github.com/d3/d3-array/blob/master/README.md#range): it simply skips, returning every *step*th date. For example, the following code in 3.x returns only odd days of the month: + +```js +d3.time.days(new Date(2016, 4, 28), new Date(2016, 5, 5), 2); +// [Sun May 29 2016 00:00:00 GMT-0700 (PDT), +// Tue May 31 2016 00:00:00 GMT-0700 (PDT), +// Wed Jun 01 2016 00:00:00 GMT-0700 (PDT), +// Fri Jun 03 2016 00:00:00 GMT-0700 (PDT)] +``` + +Note the returned array of dates does not start on the *start* date because May 28 is even. Also note that May 31 and June 1 are one day apart, not two! The behavior of d3.timeDays in 4.0 is probably closer to what you expect: + +```js +d3.timeDays(new Date(2016, 4, 28), new Date(2016, 5, 5), 2); +// [Sat May 28 2016 00:00:00 GMT-0700 (PDT), +// Mon May 30 2016 00:00:00 GMT-0700 (PDT), +// Wed Jun 01 2016 00:00:00 GMT-0700 (PDT), +// Fri Jun 03 2016 00:00:00 GMT-0700 (PDT)] +``` + +If you want a filtered view of a time interval (say to guarantee that two overlapping ranges are consistent, such as when generating [time scale ticks](https://github.com/d3/d3-scale/blob/master/README.md#time_ticks)), you can use the new [*interval*.every](https://github.com/d3/d3-time/blob/master/README.md#interval_every) method or its more general cousin [*interval*.filter](https://github.com/d3/d3-time/blob/master/README.md#interval_filter): + +```js +d3.timeDay.every(2).range(new Date(2016, 4, 28), new Date(2016, 5, 5)); +// [Sun May 29 2016 00:00:00 GMT-0700 (PDT), +// Tue May 31 2016 00:00:00 GMT-0700 (PDT), +// Wed Jun 01 2016 00:00:00 GMT-0700 (PDT), +// Fri Jun 03 2016 00:00:00 GMT-0700 (PDT)] +``` + +Time intervals now expose an [*interval*.count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) method for counting the number of interval boundaries after a *start* date and before or equal to an *end* date. This replaces d3.time.dayOfYear and related methods in 3.x. For example, this code in 3.x: + +```js +var now = new Date; +d3.time.dayOfYear(now); // 165 +``` + +Can be rewritten in 4.0 as: + +```js +var now = new Date; +d3.timeDay.count(d3.timeYear(now), now); // 165 +``` + +Likewise, in place of 3.x’s d3.time.weekOfYear, in 4.0 you would say: + +```js +d3.timeWeek.count(d3.timeYear(now), now); // 24 +``` + +The new *interval*.count is of course more general. For example, you can use it to compute hour-of-week for a heatmap: + +```js +d3.timeHour.count(d3.timeWeek(now), now); // 64 +``` + +Here are all the equivalences from 3.x to 4.0: + +* d3.time.dayOfYear ↦ [d3.timeDay](https://github.com/d3/d3-time/blob/master/README.md#timeDay).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.sundayOfYear ↦ [d3.timeSunday](https://github.com/d3/d3-time/blob/master/README.md#timeSunday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.mondayOfYear ↦ [d3.timeMonday](https://github.com/d3/d3-time/blob/master/README.md#timeMonday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.tuesdayOfYear ↦ [d3.timeTuesday](https://github.com/d3/d3-time/blob/master/README.md#timeTuesday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.wednesdayOfYear ↦ [d3.timeWednesday](https://github.com/d3/d3-time/blob/master/README.md#timeWednesday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.thursdayOfYear ↦ [d3.timeThursday](https://github.com/d3/d3-time/blob/master/README.md#timeThursday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.fridayOfYear ↦ [d3.timeFriday](https://github.com/d3/d3-time/blob/master/README.md#timeFriday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.saturdayOfYear ↦ [d3.timeSaturday](https://github.com/d3/d3-time/blob/master/README.md#timeSaturday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.weekOfYear ↦ [d3.timeWeek](https://github.com/d3/d3-time/blob/master/README.md#timeWeek).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.dayOfYear.utc ↦ [d3.utcDay](https://github.com/d3/d3-time/blob/master/README.md#utcDay).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.sundayOfYear.utc ↦ [d3.utcSunday](https://github.com/d3/d3-time/blob/master/README.md#utcSunday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.mondayOfYear.utc ↦ [d3.utcMonday](https://github.com/d3/d3-time/blob/master/README.md#utcMonday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.tuesdayOfYear.utc ↦ [d3.utcTuesday](https://github.com/d3/d3-time/blob/master/README.md#utcTuesday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.wednesdayOfYear.utc ↦ [d3.utcWednesday](https://github.com/d3/d3-time/blob/master/README.md#utcWednesday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.thursdayOfYear.utc ↦ [d3.utcThursday](https://github.com/d3/d3-time/blob/master/README.md#utcThursday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.fridayOfYear.utc ↦ [d3.utcFriday](https://github.com/d3/d3-time/blob/master/README.md#utcFriday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.saturdayOfYear.utc ↦ [d3.utcSaturday](https://github.com/d3/d3-time/blob/master/README.md#utcSaturday).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) +* d3.time.weekOfYear.utc ↦ [d3.utcWeek](https://github.com/d3/d3-time/blob/master/README.md#utcWeek).[count](https://github.com/d3/d3-time/blob/master/README.md#interval_count) + +D3 4.0 now also lets you define custom time intervals using [d3.timeInterval](https://github.com/d3/d3-time/blob/master/README.md#timeInterval). The [d3.timeYear](https://github.com/d3/d3-time/blob/master/README.md#timeYear), [d3.utcYear](https://github.com/d3/d3-time/blob/master/README.md#utcYear), [d3.timeMillisecond](https://github.com/d3/d3-time/blob/master/README.md#timeMillisecond) and [d3.utcMillisecond](https://github.com/d3/d3-time/blob/master/README.md#utcMillisecond) intervals have optimized implementations of [*interval*.every](https://github.com/d3/d3-time/blob/master/README.md#interval_every), which is necessary to generate time ticks for very large or very small domains efficiently. More generally, the performance of time intervals has been improved, and time intervals now do a better job with respect to daylight savings in various locales. + +## [Timers (d3-timer)](https://github.com/d3/d3-timer/blob/master/README.md) + +In D3 3.x, the only way to stop a timer was for its callback to return true. For example, this timer stops after one second: + +```js +d3.timer(function(elapsed) { + console.log(elapsed); + return elapsed >= 1000; +}); +``` + +In 4.0, use [*timer*.stop](https://github.com/d3/d3-timer/blob/master/README.md#timer_stop) instead: + +```js +var t = d3.timer(function(elapsed) { + console.log(elapsed); + if (elapsed >= 1000) { + t.stop(); + } +}); +``` + +The primary benefit of *timer*.stop is that timers are not required to self-terminate: they can be stopped externally, allowing for the immediate and synchronous disposal of associated resources, and the separation of concerns. The above is equivalent to: + +```js +var t = d3.timer(function(elapsed) { + console.log(elapsed); +}); + +d3.timeout(function() { + t.stop(); +}, 1000); +``` + +This improvement extends to [d3-transition](#transitions-d3-transition): now when a transition is interrupted, its resources are immediately freed rather than having to wait for transition to start. + +4.0 also introduces a new [*timer*.restart](https://github.com/d3/d3-timer/blob/master/README.md#timer_restart) method for restarting timers, for replacing the callback of a running timer, or for changing its delay or reference time. Unlike *timer*.stop followed by [d3.timer](https://github.com/d3/d3-timer/blob/master/README.md#timer), *timer*.restart maintains the invocation priority of an existing timer: it guarantees that the order of invocation of active timers remains the same. The d3.timer.flush method has been renamed to [d3.timerFlush](https://github.com/d3/d3-timer/blob/master/README.md#timerFlush). + +Some usage patterns in D3 3.x could cause the browser to hang when a background page returned to the foreground. For example, the following code schedules a transition every second: + +```js +setInterval(function() { + d3.selectAll("div").transition().call(someAnimation); // BAD +}, 1000); +``` + +If such code runs in the background for hours, thousands of queued transitions will try to run simultaneously when the page is foregrounded. D3 4.0 avoids this hang by freezing time in the background: when a page is in the background, time does not advance, and so no queue of timers accumulates to run when the page returns to the foreground. Use d3.timer instead of transitions to schedule a long-running animation, or use [d3.timeout](https://github.com/d3/d3-timer/blob/master/README.md#timeout) and [d3.interval](https://github.com/d3/d3-timer/blob/master/README.md#interval) in place of setTimeout and setInterval to prevent transitions from being queued in the background: + +```js +d3.interval(function() { + d3.selectAll("div").transition().call(someAnimation); // GOOD +}, 1000); +``` + +By freezing time in the background, timers are effectively “unaware†of being backgrounded. It’s like nothing happened! 4.0 also now uses high-precision time ([performance.now](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now)) where available; the current time is available as [d3.now](https://github.com/d3/d3-timer/blob/master/README.md#now). + +## [Transitions (d3-transition)](https://github.com/d3/d3-transition/blob/master/README.md) + +The [*selection*.transition](https://github.com/d3/d3-transition/blob/master/README.md#selection_transition) method now takes an optional *transition* instance which can be used to synchronize a new transition with an existing transition. (This change is discussed further in [What Makes Software Good?](https://medium.com/@mbostock/what-makes-software-good-943557f8a488)) For example: + +```js +var t = d3.transition() + .duration(750) + .ease(d3.easeLinear); + +d3.selectAll(".apple").transition(t) + .style("fill", "red"); + +d3.selectAll(".orange").transition(t) + .style("fill", "orange"); +``` + +Transitions created this way inherit timing from the closest ancestor element, and thus are synchronized even when the referenced *transition* has variable timing such as a staggered delay. This method replaces the deeply magical behavior of *transition*.each in 3.x; in 4.0, [*transition*.each](https://github.com/d3/d3-transition/blob/master/README.md#transition_each) is identical to [*selection*.each](https://github.com/d3/d3-selection/blob/master/README.md#selection_each). Use the new [*transition*.on](https://github.com/d3/d3-transition/blob/master/README.md#transition_on) method to listen to transition events. + +The meaning of [*transition*.delay](https://github.com/d3/d3-transition/blob/master/README.md#transition_delay) has changed for chained transitions created by [*transition*.transition](https://github.com/d3/d3-transition/blob/master/README.md#transition_transition). The specified delay is now relative to the *previous* transition in the chain, rather than the *first* transition in the chain; this makes it easier to insert interstitial pauses. For example: + +```js +d3.selectAll(".apple") + .transition() // First fade to green. + .style("fill", "green") + .transition() // Then red. + .style("fill", "red") + .transition() // Wait one second. Then brown, and remove. + .delay(1000) + .style("fill", "brown") + .remove(); +``` + +Time is now frozen in the background; see [d3-timer](#timers-d3-timer) for more information. While it was previously the case that transitions did not run in the background, now they pick up where they left off when the page returns to the foreground. This avoids page hangs by not scheduling an unbounded number of transitions in the background. If you want to schedule an infinitely-repeating transition, use transition events, or use [d3.timeout](https://github.com/d3/d3-timer/blob/master/README.md#timeout) and [d3.interval](https://github.com/d3/d3-timer/blob/master/README.md#interval) in place of [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout) and [setInterval](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval). + +The [*selection*.interrupt](https://github.com/d3/d3-transition/blob/master/README.md#selection_interrupt) method now cancels all scheduled transitions on the selected elements, in addition to interrupting any active transition. When transitions are interrupted, any resources associated with the transition are now released immediately, rather than waiting until the transition starts, improving performance. (See also [*timer*.stop](https://github.com/d3/d3-timer/blob/master/README.md#timer_stop).) The new [d3.interrupt](https://github.com/d3/d3-transition/blob/master/README.md#interrupt) method is an alternative to [*selection*.interrupt](https://github.com/d3/d3-transition/blob/master/README.md#selection_interrupt) for quickly interrupting a single node. + +The new [d3.active](https://github.com/d3/d3-transition/blob/master/README.md#active) method allows you to select the currently-active transition on a given *node*, if any. This is useful for modifying in-progress transitions and for scheduling infinitely-repeating transitions. For example, this transition continuously oscillates between red and blue: + +```js +d3.select("circle") + .transition() + .on("start", function repeat() { + d3.active(this) + .style("fill", "red") + .transition() + .style("fill", "blue") + .transition() + .on("start", repeat); + }); +``` + +The [life cycle of a transition](https://github.com/d3/d3-transition/blob/master/README.md#the-life-of-a-transition) is now more formally defined and enforced. For example, attempting to change the duration of a running transition now throws an error rather than silently failing. The [*transition*.remove](https://github.com/d3/d3-transition/blob/master/README.md#transition_remove) method has been fixed if multiple transition names are in use: the element is only removed if it has no scheduled transitions, regardless of name. The [*transition*.ease](https://github.com/d3/d3-transition/blob/master/README.md#transition_ease) method now always takes an [easing function](#easings-d3-ease), not a string. When a transition ends, the tweens are invoked one last time with *t* equal to exactly 1, regardless of the associated easing function. + +As with [selections](#selections-d3-selection) in 4.0, all transition callback functions now receive the standard arguments: the element’s datum (*d*), the element’s index (*i*), and the element’s group (*nodes*), with *this* as the element. This notably affects [*transition*.attrTween](https://github.com/d3/d3-transition/blob/master/README.md#transition_attrTween) and [*transition*.styleTween](https://github.com/d3/d3-transition/blob/master/README.md#transition_styleTween), which no longer pass the *tween* function the current attribute or style value as the third argument. The *transition*.attrTween and *transition*.styleTween methods can now be called in getter modes for debugging or to share tween definitions between transitions. + +Homogenous transitions are now optimized! If all elements in a transition share the same tween, interpolator, or event listeners, this state is now shared across the transition rather than separately allocated for each element. 4.0 also uses an optimized default interpolator in place of [d3.interpolate](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolate) for [*transition*.attr](https://github.com/d3/d3-transition/blob/master/README.md#transition_attr) and [*transition*.style](https://github.com/d3/d3-transition/blob/master/README.md#transition_style). And transitions can now interpolate both [CSS](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateTransformCss) and [SVG](https://github.com/d3/d3-interpolate/blob/master/README.md#interpolateTransformSvg) transforms. + +For reusable components that support transitions, such as [axes](#axes-d3-axis), a new [*transition*.selection](https://github.com/d3/d3-transition/blob/master/README.md#transition_selection) method returns the [selection](#selections-d3-selection) that corresponds to a given transition. There is also a new [*transition*.merge](https://github.com/d3/d3-transition/blob/master/README.md#transition_merge) method that is equivalent to [*selection*.merge](https://github.com/d3/d3-selection/blob/master/README.md#selection_merge). + +For the sake of parsimony, the multi-value map methods have been extracted to [d3-selection-multi](https://github.com/d3/d3-selection-multi) and are no longer part of the default bundle. The multi-value map methods have also been renamed to plural form to reduce overload: [*transition*.attrs](https://github.com/d3/d3-selection-multi/blob/master/README.md#transition_attrs) and [*transition*.styles](https://github.com/d3/d3-selection-multi/blob/master/README.md#transition_styles). + +## [Voronoi Diagrams (d3-voronoi)](https://github.com/d3/d3-voronoi/blob/master/README.md) + +The d3.geom.voronoi method has been renamed to [d3.voronoi](https://github.com/d3/d3-voronoi/blob/master/README.md#voronoi), and the *voronoi*.clipExtent method has been renamed to [*voronoi*.extent](https://github.com/d3/d3-voronoi/blob/master/README.md#voronoi_extent). The undocumented *polygon*.point property in 3.x, which is the element in the input *data* corresponding to the polygon, has been renamed to *polygon*.data. + +Calling [*voronoi*](https://github.com/d3/d3-voronoi/blob/master/README.md#_voronoi) now returns the full [Voronoi diagram](https://github.com/d3/d3-voronoi/blob/master/README.md#voronoi-diagrams), which includes topological information: each Voronoi edge exposes *edge*.left and *edge*.right specifying the sites on either side of the edge, and each Voronoi cell is defined as an array of these edges and a corresponding site. The Voronoi diagram can be used to efficiently compute both the Voronoi and Delaunay tessellations for a set of points: [*diagram*.polygons](https://github.com/d3/d3-voronoi/blob/master/README.md#diagram_polygons), [*diagram*.links](https://github.com/d3/d3-voronoi/blob/master/README.md#diagram_links), and [*diagram*.triangles](https://github.com/d3/d3-voronoi/blob/master/README.md#diagram_triangles). The new topology is also useful in conjunction with TopoJSON; see the [Voronoi topology example](https://bl.ocks.org/mbostock/cd52a201d7694eb9d890). + +The [*voronoi*.polygons](https://github.com/d3/d3-voronoi/blob/master/README.md#voronoi_polygons) and [*diagram*.polygons](https://github.com/d3/d3-voronoi/blob/master/README.md#diagram_polygons) now require an [extent](https://github.com/d3/d3-voronoi/blob/master/README.md#voronoi_extent); there is no longer an implicit extent of ±1e6. The [*voronoi*.links](https://github.com/d3/d3-voronoi/blob/master/README.md#voronoi_links), [*voronoi*.triangles](https://github.com/d3/d3-voronoi/blob/master/README.md#voronoi_triangles), [*diagram*.links](https://github.com/d3/d3-voronoi/blob/master/README.md#diagram_links) and [*diagram*.triangles](https://github.com/d3/d3-voronoi/blob/master/README.md#diagram_triangles) are now affected by the clip extent: as the Delaunay is computed as the dual of the Voronoi, two sites are only linked if the clipped cells are touching. To compute the Delaunay triangulation without respect to clipping, set the extent to null. + +The Voronoi generator finally has well-defined behavior for coincident vertices: the first of a set of coincident points has a defined cell, while the subsequent duplicate points have null cells. The returned array of polygons is sparse, so by using *array*.forEach or *array*.map, you can easily skip undefined cells. The Voronoi generator also now correctly handles the case where no cell edges intersect the extent. + +## [Zooming (d3-zoom)](https://github.com/d3/d3-zoom/blob/master/README.md) + +The zoom behavior d3.behavior.zoom has been renamed to d3.zoom. Zoom behaviors no longer store the active zoom transform (*i.e.*, the visible region; the scale and translate) internally. The zoom transform is now stored on any elements to which the zoom behavior has been applied. The zoom transform is available as *event*.transform within a zoom event or by calling [d3.zoomTransform](https://github.com/d3/d3-zoom/blob/master/README.md#zoomTransform) on a given *element*. To zoom programmatically, use [*zoom*.transform](https://github.com/d3/d3-zoom/blob/master/README.md#zoom_transform) with a given [selection](#selections-d3-selection) or [transition](#transitions-d3-transition); see the [zoom transitions example](https://bl.ocks.org/mbostock/b783fbb2e673561d214e09c7fb5cedee). The *zoom*.event method has been removed. + +To make programmatic zooming easier, there are several new convenience methods on top of *zoom*.transform: [*zoom*.translateBy](https://github.com/d3/d3-zoom/blob/master/README.md#zoom_translateBy), [*zoom*.scaleBy](https://github.com/d3/d3-zoom/blob/master/README.md#zoom_scaleBy) and [*zoom*.scaleTo](https://github.com/d3/d3-zoom/blob/master/README.md#zoom_scaleTo). There is also a new API for describing [zoom transforms](https://github.com/d3/d3-zoom/blob/master/README.md#zoom-transforms). Zoom behaviors are no longer dependent on [scales](#scales-d3-scale), but you can use [*transform*.rescaleX](https://github.com/d3/d3-zoom/blob/master/README.md#transform_rescaleX), [*transform*.rescaleY](https://github.com/d3/d3-zoom/blob/master/README.md#transform_rescaleY), [*transform*.invertX](https://github.com/d3/d3-zoom/blob/master/README.md#transform_invertX) or [*transform*.invertY](https://github.com/d3/d3-zoom/blob/master/README.md#transform_invertY) to transform a scale’s domain. 3.x’s *event*.scale is replaced with *event*.transform.k, and *event*.translate is replaced with *event*.transform.x and *event*.transform.y. The *zoom*.center method has been removed in favor of programmatic zooming. + +The zoom behavior finally supports simple constraints on panning! The new [*zoom*.translateExtent](https://github.com/d3/d3-zoom/blob/master/README.md#zoom_translateExtent) lets you define the viewable extent of the world: the currently-visible extent (the extent of the viewport, as defined by [*zoom*.extent](https://github.com/d3/d3-zoom/blob/master/README.md#zoom_extent)) is always contained within the translate extent. The *zoom*.size method has been replaced by *zoom*.extent, and the default behavior is now smarter: it defaults to the extent of the zoom behavior’s owner element, rather than being hardcoded to 960×500. (This also improves the default path chosen during smooth zoom transitions!) + +The zoom behavior’s interaction has also improved. It now correctly handles concurrent wheeling and dragging, as well as concurrent touching and mousing. The zoom behavior now ignores wheel events at the limits of its scale extent, allowing you to scroll past a zoomable area. The *zoomstart* and *zoomend* events have been renamed *start* and *end*. By default, zoom behaviors now ignore right-clicks intended for the context menu; use [*zoom*.filter](https://github.com/d3/d3-zoom/blob/master/README.md#zoom_filter) to control which events are ignored. The zoom behavior also ignores emulated mouse events on iOS. The zoom behavior now consumes handled events, making it easier to combine with other interactive behaviors such as [dragging](#dragging-d3-drag). diff --git a/node_modules/d3/LICENSE b/node_modules/d3/LICENSE new file mode 100644 index 00000000..894ddc65 --- /dev/null +++ b/node_modules/d3/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2020 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/d3/README.md b/node_modules/d3/README.md new file mode 100644 index 00000000..74058319 --- /dev/null +++ b/node_modules/d3/README.md @@ -0,0 +1,57 @@ +# D3: Data-Driven Documents + + + +**D3** (or **D3.js**) is a JavaScript library for visualizing data using web standards. D3 helps you bring data to life using SVG, Canvas and HTML. D3 combines powerful visualization and interaction techniques with a data-driven approach to DOM manipulation, giving you the full capabilities of modern browsers and the freedom to design the right visual interface for your data. + +## Resources + +* [Introduction](https://observablehq.com/@d3/learn-d3) +* [API Reference](https://github.com/d3/d3/blob/master/API.md) +* [Releases](https://github.com/d3/d3/releases) +* [Examples](https://observablehq.com/@d3/gallery) +* [Wiki](https://github.com/d3/d3/wiki) + +## Installing + +If you use npm, `npm install d3`. Otherwise, download the [latest release](https://github.com/d3/d3/releases/latest). The released bundle supports anonymous AMD, CommonJS, and vanilla environments. You can load directly from [d3js.org](https://d3js.org), [CDNJS](https://cdnjs.com/libraries/d3), or [unpkg](https://unpkg.com/d3/). For example: + +```html + +``` + +For the minified version: + +```html + +``` + +You can also use the standalone D3 microlibraries. For example, [d3-selection](https://github.com/d3/d3-selection): + +```html + +``` + +D3 is written using [ES2015 modules](http://www.2ality.com/2014/09/es6-modules-final.html). Create a [custom bundle using Rollup](https://bl.ocks.org/mbostock/bb09af4c39c79cffcde4), Webpack, or your preferred bundler. To import D3 into an ES2015 application, either import specific symbols from specific D3 modules: + +```js +import {scaleLinear} from "d3-scale"; +``` + +Or import everything into a namespace (here, `d3`): + +```js +import * as d3 from "d3"; +``` + +In Node: + +```js +const d3 = require("d3"); +``` + +You can also require individual modules and combine them into a `d3` object using [Object.assign](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign): + +```js +const d3 = Object.assign({}, require("d3-format"), require("d3-geo"), require("d3-geo-projection")); +``` diff --git a/node_modules/d3/dist/d3.js b/node_modules/d3/dist/d3.js new file mode 100644 index 00000000..5dbfb563 --- /dev/null +++ b/node_modules/d3/dist/d3.js @@ -0,0 +1,19718 @@ +// https://d3js.org v6.6.0 Copyright 2021 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3 = global.d3 || {})); +}(this, (function (exports) { 'use strict'; + +var version = "6.6.0"; + +function ascending$3(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +function bisector(f) { + let delta = f; + let compare = f; + + if (f.length === 1) { + delta = (d, x) => f(d) - x; + compare = ascendingComparator(f); + } + + function left(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + } + + function right(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + + function center(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + const i = left(a, x, lo, hi - 1); + return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i; + } + + return {left, center, right}; +} + +function ascendingComparator(f) { + return (d, x) => ascending$3(f(d), x); +} + +function number$3(x) { + return x === null ? NaN : +x; +} + +function* numbers(values, valueof) { + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + yield value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + yield value; + } + } + } +} + +const ascendingBisect = bisector(ascending$3); +const bisectRight = ascendingBisect.right; +const bisectLeft = ascendingBisect.left; +const bisectCenter = bisector(number$3).center; + +function count$1(values, valueof) { + let count = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count; + } + } + } + return count; +} + +function length$3(array) { + return array.length | 0; +} + +function empty$2(length) { + return !(length > 0); +} + +function arrayify(values) { + return typeof values !== "object" || "length" in values ? values : Array.from(values); +} + +function reducer(reduce) { + return values => reduce(...values); +} + +function cross$2(...values) { + const reduce = typeof values[values.length - 1] === "function" && reducer(values.pop()); + values = values.map(arrayify); + const lengths = values.map(length$3); + const j = values.length - 1; + const index = new Array(j + 1).fill(0); + const product = []; + if (j < 0 || lengths.some(empty$2)) return product; + while (true) { + product.push(index.map((j, i) => values[i][j])); + let i = j; + while (++index[i] === lengths[i]) { + if (i === 0) return reduce ? product.map(reduce) : product; + index[i--] = 0; + } + } +} + +function cumsum(values, valueof) { + var sum = 0, index = 0; + return Float64Array.from(values, valueof === undefined + ? v => (sum += +v || 0) + : v => (sum += +valueof(v, index++, values) || 0)); +} + +function descending$2(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} + +function variance(values, valueof) { + let count = 0; + let delta; + let mean = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + delta = value - mean; + mean += delta / ++count; + sum += delta * (value - mean); + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + delta = value - mean; + mean += delta / ++count; + sum += delta * (value - mean); + } + } + } + if (count > 1) return sum / (count - 1); +} + +function deviation(values, valueof) { + const v = variance(values, valueof); + return v ? Math.sqrt(v) : v; +} + +function extent$1(values, valueof) { + let min; + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + return [min, max]; +} + +// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423 +class Adder { + constructor() { + this._partials = new Float64Array(32); + this._n = 0; + } + add(x) { + const p = this._partials; + let i = 0; + for (let j = 0; j < this._n && j < 32; j++) { + const y = p[j], + hi = x + y, + lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x); + if (lo) p[i++] = lo; + x = hi; + } + p[i] = x; + this._n = i + 1; + return this; + } + valueOf() { + const p = this._partials; + let n = this._n, x, y, lo, hi = 0; + if (n > 0) { + hi = p[--n]; + while (n > 0) { + x = hi; + y = p[--n]; + hi = x + y; + lo = y - (hi - x); + if (lo) break; + } + if (n > 0 && ((lo < 0 && p[n - 1] < 0) || (lo > 0 && p[n - 1] > 0))) { + y = lo * 2; + x = hi + y; + if (y == x - hi) hi = x; + } + } + return hi; + } +} + +function fsum(values, valueof) { + const adder = new Adder(); + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + adder.add(value); + } + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + adder.add(value); + } + } + } + return +adder; +} + +function fcumsum(values, valueof) { + const adder = new Adder(); + let index = -1; + return Float64Array.from(values, valueof === undefined + ? v => adder.add(+v || 0) + : v => adder.add(+valueof(v, ++index, values) || 0) + ); +} + +class InternMap extends Map { + constructor(entries, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (entries != null) for (const [key, value] of entries) this.set(key, value); + } + get(key) { + return super.get(intern_get(this, key)); + } + has(key) { + return super.has(intern_get(this, key)); + } + set(key, value) { + return super.set(intern_set(this, key), value); + } + delete(key) { + return super.delete(intern_delete(this, key)); + } +} + +class InternSet extends Set { + constructor(values, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (values != null) for (const value of values) this.add(value); + } + has(value) { + return super.has(intern_get(this, value)); + } + add(value) { + return super.add(intern_set(this, value)); + } + delete(value) { + return super.delete(intern_delete(this, value)); + } +} + +function intern_get({_intern, _key}, value) { + const key = _key(value); + return _intern.has(key) ? _intern.get(key) : value; +} + +function intern_set({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) return _intern.get(key); + _intern.set(key, value); + return value; +} + +function intern_delete({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) { + value = _intern.get(value); + _intern.delete(key); + } + return value; +} + +function keyof(value) { + return value !== null && typeof value === "object" ? value.valueOf() : value; +} + +function identity$9(x) { + return x; +} + +function group(values, ...keys) { + return nest(values, identity$9, identity$9, keys); +} + +function groups(values, ...keys) { + return nest(values, Array.from, identity$9, keys); +} + +function rollup(values, reduce, ...keys) { + return nest(values, identity$9, reduce, keys); +} + +function rollups(values, reduce, ...keys) { + return nest(values, Array.from, reduce, keys); +} + +function index$4(values, ...keys) { + return nest(values, identity$9, unique, keys); +} + +function indexes(values, ...keys) { + return nest(values, Array.from, unique, keys); +} + +function unique(values) { + if (values.length !== 1) throw new Error("duplicate key"); + return values[0]; +} + +function nest(values, map, reduce, keys) { + return (function regroup(values, i) { + if (i >= keys.length) return reduce(values); + const groups = new InternMap(); + const keyof = keys[i++]; + let index = -1; + for (const value of values) { + const key = keyof(value, ++index, values); + const group = groups.get(key); + if (group) group.push(value); + else groups.set(key, [value]); + } + for (const [key, values] of groups) { + groups.set(key, regroup(values, i)); + } + return map(groups); + })(values, 0); +} + +function permute(source, keys) { + return Array.from(keys, key => source[key]); +} + +function sort(values, ...F) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + values = Array.from(values); + let [f = ascending$3] = F; + if (f.length === 1 || F.length > 1) { + const index = Uint32Array.from(values, (d, i) => i); + if (F.length > 1) { + F = F.map(f => values.map(f)); + index.sort((i, j) => { + for (const f of F) { + const c = ascending$3(f[i], f[j]); + if (c) return c; + } + }); + } else { + f = values.map(f); + index.sort((i, j) => ascending$3(f[i], f[j])); + } + return permute(values, index); + } + return values.sort(f); +} + +function groupSort(values, reduce, key) { + return (reduce.length === 1 + ? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending$3(av, bv) || ascending$3(ak, bk))) + : sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending$3(ak, bk)))) + .map(([key]) => key); +} + +var array$5 = Array.prototype; + +var slice$4 = array$5.slice; + +function constant$b(x) { + return function() { + return x; + }; +} + +var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); + +function ticks(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; + + stop = +stop, start = +start, count = +count; + if (start === stop && count > 0) return [start]; + if (reverse = stop < start) n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; + + if (step > 0) { + start = Math.ceil(start / step); + stop = Math.floor(stop / step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) * step; + } else { + step = -step; + start = Math.ceil(start * step); + stop = Math.floor(stop * step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) / step; + } + + if (reverse) ticks.reverse(); + + return ticks; +} + +function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); +} + +function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; +} + +function nice$1(start, stop, count) { + let prestep; + while (true) { + const step = tickIncrement(start, stop, count); + if (step === prestep || step === 0 || !isFinite(step)) { + return [start, stop]; + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } + prestep = step; + } +} + +function thresholdSturges(values) { + return Math.ceil(Math.log(count$1(values)) / Math.LN2) + 1; +} + +function bin() { + var value = identity$9, + domain = extent$1, + threshold = thresholdSturges; + + function histogram(data) { + if (!Array.isArray(data)) data = Array.from(data); + + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds, and nice the + // default domain accordingly. + if (!Array.isArray(tz)) { + const max = x1, tn = +tz; + if (domain === extent$1) [x0, x1] = nice$1(x0, x1, tn); + tz = ticks(x0, x1, tn); + + // If the last threshold is coincident with the domain’s upper bound, the + // last bin will be zero-width. If the default domain is used, and this + // last threshold is coincident with the maximum input value, we can + // extend the niced upper bound by one tick to ensure uniform bin widths; + // otherwise, we simply remove the last threshold. Note that we don’t + // coerce values or the domain to numbers, and thus must be careful to + // compare order (>=) rather than strict equality (===)! + if (tz[tz.length - 1] >= x1) { + if (max >= x1 && domain === extent$1) { + const step = tickIncrement(x0, x1, tn); + if (isFinite(step)) { + if (step > 0) { + x1 = (Math.floor(x1 / step) + 1) * step; + } else if (step < 0) { + x1 = (Math.ceil(x1 * -step) + 1) / -step; + } + } + } else { + tz.pop(); + } + } + } + + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] > x1) tz.pop(), --m; + + var bins = new Array(m + 1), + bin; + + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } + + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } + + return bins; + } + + histogram.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(_), histogram) : value; + }; + + histogram.domain = function(_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant$b([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$b(slice$4.call(_)) : constant$b(_), histogram) : threshold; + }; + + return histogram; +} + +function max$3(values, valueof) { + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (max < value || (max === undefined && value >= value))) { + max = value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { + max = value; + } + } + } + return max; +} + +function min$2(values, valueof) { + let min; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value; + } + } + } + return min; +} + +// Based on https://github.com/mourner/quickselect +// ISC license, Copyright 2018 Vladimir Agafonkin. +function quickselect(array, k, left = 0, right = array.length - 1, compare = ascending$3) { + while (right > left) { + if (right - left > 600) { + const n = right - left + 1; + const m = k - left + 1; + const z = Math.log(n); + const s = 0.5 * Math.exp(2 * z / 3); + const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + const newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + quickselect(array, k, newLeft, newRight, compare); + } + + const t = array[k]; + let i = left; + let j = right; + + swap$1(array, left, k); + if (compare(array[right], t) > 0) swap$1(array, left, right); + + while (i < j) { + swap$1(array, i, j), ++i, --j; + while (compare(array[i], t) < 0) ++i; + while (compare(array[j], t) > 0) --j; + } + + if (compare(array[left], t) === 0) swap$1(array, left, j); + else ++j, swap$1(array, j, right); + + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } + return array; +} + +function swap$1(array, i, j) { + const t = array[i]; + array[i] = array[j]; + array[j] = t; +} + +function quantile$1(values, p, valueof) { + values = Float64Array.from(numbers(values, valueof)); + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return min$2(values); + if (p >= 1) return max$3(values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = max$3(quickselect(values, i0).subarray(0, i0 + 1)), + value1 = min$2(values.subarray(i0 + 1)); + return value0 + (value1 - value0) * (i - i0); +} + +function quantileSorted(values, p, valueof = number$3) { + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); +} + +function freedmanDiaconis(values, min, max) { + return Math.ceil((max - min) / (2 * (quantile$1(values, 0.75) - quantile$1(values, 0.25)) * Math.pow(count$1(values), -1 / 3))); +} + +function scott(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(count$1(values), -1 / 3))); +} + +function maxIndex(values, valueof) { + let max; + let maxIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } + } + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } + } + } + return maxIndex; +} + +function mean(values, valueof) { + let count = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count, sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count, sum += value; + } + } + } + if (count) return sum / count; +} + +function median(values, valueof) { + return quantile$1(values, 0.5, valueof); +} + +function* flatten(arrays) { + for (const array of arrays) { + yield* array; + } +} + +function merge(arrays) { + return Array.from(flatten(arrays)); +} + +function minIndex(values, valueof) { + let min; + let minIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; + } + } + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; + } + } + } + return minIndex; +} + +function pairs(values, pairof = pair) { + const pairs = []; + let previous; + let first = false; + for (const value of values) { + if (first) pairs.push(pairof(previous, value)); + previous = value; + first = true; + } + return pairs; +} + +function pair(a, b) { + return [a, b]; +} + +function sequence(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; +} + +function least(values, compare = ascending$3) { + let min; + let defined = false; + if (compare.length === 1) { + let minValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending$3(value, minValue) < 0 + : ascending$3(value, value) === 0) { + min = element; + minValue = value; + defined = true; + } + } + } else { + for (const value of values) { + if (defined + ? compare(value, min) < 0 + : compare(value, value) === 0) { + min = value; + defined = true; + } + } + } + return min; +} + +function leastIndex(values, compare = ascending$3) { + if (compare.length === 1) return minIndex(values, compare); + let minValue; + let min = -1; + let index = -1; + for (const value of values) { + ++index; + if (min < 0 + ? compare(value, value) === 0 + : compare(value, minValue) < 0) { + minValue = value; + min = index; + } + } + return min; +} + +function greatest(values, compare = ascending$3) { + let max; + let defined = false; + if (compare.length === 1) { + let maxValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending$3(value, maxValue) > 0 + : ascending$3(value, value) === 0) { + max = element; + maxValue = value; + defined = true; + } + } + } else { + for (const value of values) { + if (defined + ? compare(value, max) > 0 + : compare(value, value) === 0) { + max = value; + defined = true; + } + } + } + return max; +} + +function greatestIndex(values, compare = ascending$3) { + if (compare.length === 1) return maxIndex(values, compare); + let maxValue; + let max = -1; + let index = -1; + for (const value of values) { + ++index; + if (max < 0 + ? compare(value, value) === 0 + : compare(value, maxValue) > 0) { + maxValue = value; + max = index; + } + } + return max; +} + +function scan(values, compare) { + const index = leastIndex(values, compare); + return index < 0 ? undefined : index; +} + +var shuffle$1 = shuffler(Math.random); + +function shuffler(random) { + return function shuffle(array, i0 = 0, i1 = array.length) { + let m = i1 - (i0 = +i0); + while (m) { + const i = random() * m-- | 0, t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + return array; + }; +} + +function sum$1(values, valueof) { + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + sum += value; + } + } + } + return sum; +} + +function transpose(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min$2(matrix, length$2), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; +} + +function length$2(d) { + return d.length; +} + +function zip() { + return transpose(arguments); +} + +function every(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (!test(value, ++index, values)) { + return false; + } + } + return true; +} + +function some(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + return true; + } + } + return false; +} + +function filter$1(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + const array = []; + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + array.push(value); + } + } + return array; +} + +function map$1(values, mapper) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + if (typeof mapper !== "function") throw new TypeError("mapper is not a function"); + return Array.from(values, (value, index) => mapper(value, index, values)); +} + +function reduce(values, reducer, value) { + if (typeof reducer !== "function") throw new TypeError("reducer is not a function"); + const iterator = values[Symbol.iterator](); + let done, next, index = -1; + if (arguments.length < 3) { + ({done, value} = iterator.next()); + if (done) return; + ++index; + } + while (({done, value: next} = iterator.next()), !done) { + value = reducer(value, next, ++index, values); + } + return value; +} + +function reverse$1(values) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + return Array.from(values).reverse(); +} + +function difference(values, ...others) { + values = new Set(values); + for (const other of others) { + for (const value of other) { + values.delete(value); + } + } + return values; +} + +function disjoint(values, other) { + const iterator = other[Symbol.iterator](), set = new Set(); + for (const v of values) { + if (set.has(v)) return false; + let value, done; + while (({value, done} = iterator.next())) { + if (done) break; + if (Object.is(v, value)) return false; + set.add(value); + } + } + return true; +} + +function set$2(values) { + return values instanceof Set ? values : new Set(values); +} + +function intersection(values, ...others) { + values = new Set(values); + others = others.map(set$2); + out: for (const value of values) { + for (const other of others) { + if (!other.has(value)) { + values.delete(value); + continue out; + } + } + } + return values; +} + +function superset(values, other) { + const iterator = values[Symbol.iterator](), set = new Set(); + for (const o of other) { + if (set.has(o)) continue; + let value, done; + while (({value, done} = iterator.next())) { + if (done) return false; + set.add(value); + if (Object.is(o, value)) break; + } + } + return true; +} + +function subset(values, other) { + return superset(other, values); +} + +function union(...others) { + const set = new Set(); + for (const other of others) { + for (const o of other) { + set.add(o); + } + } + return set; +} + +var slice$3 = Array.prototype.slice; + +function identity$8(x) { + return x; +} + +var top = 1, + right = 2, + bottom = 3, + left = 4, + epsilon$5 = 1e-6; + +function translateX(x) { + return "translate(" + x + ",0)"; +} + +function translateY(y) { + return "translate(0," + y + ")"; +} + +function number$2(scale) { + return d => +scale(d); +} + +function center$1(scale, offset) { + offset = Math.max(0, scale.bandwidth() - offset * 2) / 2; + if (scale.round()) offset = Math.round(offset); + return d => +scale(d) + offset; +} + +function entering() { + return !this.__axis; +} + +function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + offset = typeof window !== "undefined" && window.devicePixelRatio > 1 ? 0 : 0.5, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$8) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = +range[0] + offset, + range1 = +range[range.length - 1] + offset, + position = (scale.bandwidth ? center$1 : number$2)(scale.copy(), offset), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "currentColor")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "currentColor") + .attr(x + "2", k * tickSizeInner)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "currentColor") + .attr(x, k * spacing) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); + + tickExit = tickExit.transition(context) + .attr("opacity", epsilon$5) + .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute("transform"); }); + + tickEnter + .attr("opacity", epsilon$5) + .attr("transform", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); }); + } + + tickExit.remove(); + + path + .attr("d", orient === left || orient === right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H" + offset + "V" + range1 + "H" + k * tickSizeOuter : "M" + offset + "," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V" + offset + "H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + "," + offset + "H" + range1)); + + tick + .attr("opacity", 1) + .attr("transform", function(d) { return transform(position(d) + offset); }); + + line + .attr(x + "2", k * tickSizeInner); + + text + .attr(x, k * spacing) + .text(format); + + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + + selection + .each(function() { this.__axis = position; }); + } + + axis.scale = function(_) { + return arguments.length ? (scale = _, axis) : scale; + }; + + axis.ticks = function() { + return tickArguments = slice$3.call(arguments), axis; + }; + + axis.tickArguments = function(_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice$3.call(_), axis) : tickArguments.slice(); + }; + + axis.tickValues = function(_) { + return arguments.length ? (tickValues = _ == null ? null : slice$3.call(_), axis) : tickValues && tickValues.slice(); + }; + + axis.tickFormat = function(_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; + }; + + axis.tickSize = function(_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; + + axis.tickSizeInner = function(_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; + + axis.tickSizeOuter = function(_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; + + axis.tickPadding = function(_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; + + axis.offset = function(_) { + return arguments.length ? (offset = +_, axis) : offset; + }; + + return axis; +} + +function axisTop(scale) { + return axis(top, scale); +} + +function axisRight(scale) { + return axis(right, scale); +} + +function axisBottom(scale) { + return axis(bottom, scale); +} + +function axisLeft(scale) { + return axis(left, scale); +} + +var noop$3 = {value: () => {}}; + +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} + +function Dispatch(_) { + this._ = _; +} + +function parseTypenames$1(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); +} + +Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, + T = parseTypenames$1(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get$1(_[t], typename.name))) return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set$1(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set$1(_[t], typename.name, null); + } + + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function(type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } +}; + +function get$1(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } +} + +function set$1(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop$3, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; +} + +var xhtml = "http://www.w3.org/1999/xhtml"; + +var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +}; + +function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins +} + +function creatorInherit(name) { + return function() { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; +} + +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; +} + +function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); +} + +function none$2() {} + +function selector(selector) { + return selector == null ? none$2 : function() { + return this.querySelector(selector); + }; +} + +function selection_select(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection$1(subgroups, this._parents); +} + +function array$4(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} + +function empty$1() { + return []; +} + +function selectorAll(selector) { + return selector == null ? empty$1 : function() { + return this.querySelectorAll(selector); + }; +} + +function arrayAll(select) { + return function() { + var group = select.apply(this, arguments); + return group == null ? [] : array$4(group); + }; +} + +function selection_selectAll(select) { + if (typeof select === "function") select = arrayAll(select); + else select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection$1(subgroups, parents); +} + +function matcher(selector) { + return function() { + return this.matches(selector); + }; +} + +function childMatcher(selector) { + return function(node) { + return node.matches(selector); + }; +} + +var find$1 = Array.prototype.find; + +function childFind(match) { + return function() { + return find$1.call(this.children, match); + }; +} + +function childFirst() { + return this.firstElementChild; +} + +function selection_selectChild(match) { + return this.select(match == null ? childFirst + : childFind(typeof match === "function" ? match : childMatcher(match))); +} + +var filter = Array.prototype.filter; + +function children() { + return this.children; +} + +function childrenFilter(match) { + return function() { + return filter.call(this.children, match); + }; +} + +function selection_selectChildren(match) { + return this.selectAll(match == null ? children + : childrenFilter(typeof match === "function" ? match : childMatcher(match))); +} + +function selection_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection$1(subgroups, this._parents); +} + +function sparse(update) { + return new Array(update.length); +} + +function selection_enter() { + return new Selection$1(this._enter || this._groups.map(sparse), this._parents); +} + +function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; +} + +EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, + insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, + querySelector: function(selector) { return this._parent.querySelector(selector); }, + querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } +}; + +function constant$a(x) { + return function() { + return x; + }; +} + +function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } +} + +function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = new Map, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = key.call(parent, data[i], i, data) + ""; + if (node = nodeByKeyValue.get(keyValue)) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue.delete(keyValue); + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) { + exit[i] = node; + } + } +} + +function datum(node) { + return node.__data__; +} + +function selection_data(value, key) { + if (!arguments.length) return Array.from(this, datum); + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant$a(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = array$4(value.call(parent, parent && parent.__data__, j, parents)), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } + } + + update = new Selection$1(update, parents); + update._enter = enter; + update._exit = exit; + return update; +} + +function selection_exit() { + return new Selection$1(this._exit || this._groups.map(sparse), this._parents); +} + +function selection_join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; +} + +function selection_merge(selection) { + if (!(selection instanceof Selection$1)) throw new Error("invalid merge"); + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection$1(merges, this._parents); +} + +function selection_order() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; +} + +function selection_sort(compare) { + if (!compare) compare = ascending$2; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection$1(sortgroups, this._parents).order(); +} + +function ascending$2(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +function selection_call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; +} + +function selection_nodes() { + return Array.from(this); +} + +function selection_node() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; +} + +function selection_size() { + let size = 0; + for (const node of this) ++size; // eslint-disable-line no-unused-vars + return size; +} + +function selection_empty() { + return !this.node(); +} + +function selection_each(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; +} + +function attrRemove$1(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS$1(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant$1(name, value) { + return function() { + this.setAttribute(name, value); + }; +} + +function attrConstantNS$1(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} + +function attrFunction$1(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; +} + +function attrFunctionNS$1(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; +} + +function selection_attr(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS$1 : attrRemove$1) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS$1 : attrFunction$1) + : (fullname.local ? attrConstantNS$1 : attrConstant$1)))(fullname, value)); +} + +function defaultView(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document +} + +function styleRemove$1(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant$1(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} + +function styleFunction$1(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; +} + +function selection_style(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove$1 : typeof value === "function" + ? styleFunction$1 + : styleConstant$1)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); +} + +function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); +} + +function propertyRemove(name) { + return function() { + delete this[name]; + }; +} + +function propertyConstant(name, value) { + return function() { + this[name] = value; + }; +} + +function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; +} + +function selection_property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; +} + +function classArray(string) { + return string.trim().split(/^|\s+/); +} + +function classList(node) { + return node.classList || new ClassList(node); +} + +function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); +} + +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; + +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); +} + +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); +} + +function classedTrue(names) { + return function() { + classedAdd(this, names); + }; +} + +function classedFalse(names) { + return function() { + classedRemove(this, names); + }; +} + +function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; +} + +function selection_classed(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); +} + +function textRemove() { + this.textContent = ""; +} + +function textConstant$1(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction$1(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; +} + +function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction$1 + : textConstant$1)(value)) + : this.node().textContent; +} + +function htmlRemove() { + this.innerHTML = ""; +} + +function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; +} + +function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; +} + +function selection_html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; +} + +function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); +} + +function selection_raise() { + return this.each(raise); +} + +function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); +} + +function selection_lower() { + return this.each(lower); +} + +function selection_append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function() { + return this.appendChild(create.apply(this, arguments)); + }); +} + +function constantNull() { + return null; +} + +function selection_insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function() { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); +} + +function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); +} + +function selection_remove() { + return this.each(remove); +} + +function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +function selection_clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} + +function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; +} + +function contextListener(listener) { + return function(event) { + listener.call(this, event, this.__data__); + }; +} + +function parseTypenames(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); +} + +function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; +} + +function onAdd(typename, value, options) { + return function() { + var on = this.__on, o, listener = contextListener(value); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + this.addEventListener(o.type, o.listener = listener, o.options = options); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, options); + o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options}; + if (!on) this.__on = [o]; + else on.push(o); + }; +} + +function selection_on(typename, value, options) { + var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); + return this; +} + +function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); +} + +function dispatchConstant(type, params) { + return function() { + return dispatchEvent(this, type, params); + }; +} + +function dispatchFunction(type, params) { + return function() { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; +} + +function selection_dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); +} + +function* selection_iterator() { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) yield node; + } + } +} + +var root$1 = [null]; + +function Selection$1(groups, parents) { + this._groups = groups; + this._parents = parents; +} + +function selection() { + return new Selection$1([[document.documentElement]], root$1); +} + +function selection_selection() { + return this; +} + +Selection$1.prototype = selection.prototype = { + constructor: Selection$1, + select: selection_select, + selectAll: selection_selectAll, + selectChild: selection_selectChild, + selectChildren: selection_selectChildren, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + selection: selection_selection, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch, + [Symbol.iterator]: selection_iterator +}; + +function select(selector) { + return typeof selector === "string" + ? new Selection$1([[document.querySelector(selector)]], [document.documentElement]) + : new Selection$1([[selector]], root$1); +} + +function create$1(name) { + return select(creator(name).call(document.documentElement)); +} + +var nextId = 0; + +function local$1() { + return new Local; +} + +function Local() { + this._ = "@" + (++nextId).toString(36); +} + +Local.prototype = local$1.prototype = { + constructor: Local, + get: function(node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function(node, value) { + return node[this._] = value; + }, + remove: function(node) { + return this._ in node && delete node[this._]; + }, + toString: function() { + return this._; + } +}; + +function sourceEvent(event) { + let sourceEvent; + while (sourceEvent = event.sourceEvent) event = sourceEvent; + return event; +} + +function pointer(event, node) { + event = sourceEvent(event); + if (node === undefined) node = event.currentTarget; + if (node) { + var svg = node.ownerSVGElement || node; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + if (node.getBoundingClientRect) { + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + } + return [event.pageX, event.pageY]; +} + +function pointers(events, node) { + if (events.target) { // i.e., instanceof Event, not TouchList or iterable + events = sourceEvent(events); + if (node === undefined) node = events.currentTarget; + events = events.touches || [events]; + } + return Array.from(events, event => pointer(event, node)); +} + +function selectAll(selector) { + return typeof selector === "string" + ? new Selection$1([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection$1([selector == null ? [] : array$4(selector)], root$1); +} + +function nopropagation$2(event) { + event.stopImmediatePropagation(); +} + +function noevent$2(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +function dragDisable(view) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", noevent$2, true); + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent$2, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } +} + +function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", null); + if (noclick) { + selection.on("click.drag", noevent$2, true); + setTimeout(function() { selection.on("click.drag", null); }, 0); + } + if ("onselectstart" in root) { + selection.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } +} + +var constant$9 = x => () => x; + +function DragEvent(type, { + sourceEvent, + subject, + target, + identifier, + active, + x, y, dx, dy, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + subject: {value: subject, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + identifier: {value: identifier, enumerable: true, configurable: true}, + active: {value: active, enumerable: true, configurable: true}, + x: {value: x, enumerable: true, configurable: true}, + y: {value: y, enumerable: true, configurable: true}, + dx: {value: dx, enumerable: true, configurable: true}, + dy: {value: dy, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} + +DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; +}; + +// Ignore right-click, since that should open the context menu. +function defaultFilter$2(event) { + return !event.ctrlKey && !event.button; +} + +function defaultContainer() { + return this.parentNode; +} + +function defaultSubject(event, d) { + return d == null ? {x: event.x, y: event.y} : d; +} + +function defaultTouchable$2() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function drag() { + var filter = defaultFilter$2, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable$2, + gestures = {}, + listeners = dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; + + function drag(selection) { + selection + .on("mousedown.drag", mousedowned) + .filter(touchable) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + function mousedowned(event, d) { + if (touchending || !filter.call(this, event, d)) return; + var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); + if (!gesture) return; + select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + dragDisable(event.view); + nopropagation$2(event); + mousemoving = false; + mousedownx = event.clientX; + mousedowny = event.clientY; + gesture("start", event); + } + + function mousemoved(event) { + noevent$2(event); + if (!mousemoving) { + var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag", event); + } + + function mouseupped(event) { + select(event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(event.view, mousemoving); + noevent$2(event); + gestures.mouse("end", event); + } + + function touchstarted(event, d) { + if (!filter.call(this, event, d)) return; + var touches = event.changedTouches, + c = container.call(this, event, d), + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) { + nopropagation$2(event); + gesture("start", event, touches[i]); + } + } + } + + function touchmoved(event) { + var touches = event.changedTouches, + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent$2(event); + gesture("drag", event, touches[i]); + } + } + } + + function touchended(event) { + var touches = event.changedTouches, + n = touches.length, i, gesture; + + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation$2(event); + gesture("end", event, touches[i]); + } + } + } + + function beforestart(that, container, event, d, identifier, touch) { + var dispatch = listeners.copy(), + p = pointer(touch || event, container), dx, dy, + s; + + if ((s = subject.call(that, new DragEvent("beforestart", { + sourceEvent: event, + target: drag, + identifier, + active, + x: p[0], + y: p[1], + dx: 0, + dy: 0, + dispatch + }), d)) == null) return; + + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + + return function gesture(type, event, touch) { + var p0 = p, n; + switch (type) { + case "start": gestures[identifier] = gesture, n = active++; break; + case "end": delete gestures[identifier], --active; // nobreak + case "drag": p = pointer(touch || event, container), n = active; break; + } + dispatch.call( + type, + that, + new DragEvent(type, { + sourceEvent: event, + subject: s, + target: drag, + identifier, + active: n, + x: p[0] + dx, + y: p[1] + dy, + dx: p[0] - p0[0], + dy: p[1] - p0[1], + dispatch + }), + d + ); + }; + } + + drag.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$9(!!_), drag) : filter; + }; + + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant$9(_), drag) : container; + }; + + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant$9(_), drag) : subject; + }; + + drag.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$9(!!_), drag) : touchable; + }; + + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + + return drag; +} + +function define(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; +} + +function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; +} + +function Color() {} + +var darker = 0.7; +var brighter = 1 / darker; + +var reI = "\\s*([+-]?\\d+)\\s*", + reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reHex = /^#([0-9a-f]{3,8})$/, + reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + +var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 +}; + +define(Color, color, { + copy: function(channels) { + return Object.assign(new this.constructor, this, channels); + }, + displayable: function() { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb +}); + +function color_formatHex() { + return this.rgb().formatHex(); +} + +function color_formatHsl() { + return hslConvert(this).formatHsl(); +} + +function color_formatRgb() { + return this.rgb().formatRgb(); +} + +function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; +} + +function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); +} + +function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); +} + +function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} + +function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} + +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} + +define(Rgb, rgb, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function() { + return this; + }, + displayable: function() { + return (-0.5 <= this.r && this.r < 255.5) + && (-0.5 <= this.g && this.g < 255.5) + && (-0.5 <= this.b && this.b < 255.5) + && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); + +function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); +} + +function rgb_formatRgb() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); +} + +function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); +} + +function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); +} + +function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} + +function hsl$2(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} + +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Hsl, hsl$2, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl: function() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } +})); + +/* From FvD 13.37, CSS Color Module Level 3 */ +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; +} + +const radians$1 = Math.PI / 180; +const degrees$2 = 180 / Math.PI; + +// https://observablehq.com/@mbostock/lab-and-rgb +const K = 18, + Xn = 0.96422, + Yn = 1, + Zn = 0.82521, + t0$1 = 4 / 29, + t1$1 = 6 / 29, + t2 = 3 * t1$1 * t1$1, + t3 = t1$1 * t1$1 * t1$1; + +function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) return hcl2lab(o); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = rgb2lrgb(o.r), + g = rgb2lrgb(o.g), + b = rgb2lrgb(o.b), + y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) x = z = y; else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); +} + +function gray(l, opacity) { + return new Lab(l, 0, 0, opacity == null ? 1 : opacity); +} + +function lab$1(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); +} + +function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; +} + +define(Lab, lab$1, extend(Color, { + brighter: function(k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function(k) { + return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function() { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), + lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } +})); + +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0$1; +} + +function lab2xyz(t) { + return t > t1$1 ? t * t * t : t2 * (t - t0$1); +} + +function lrgb2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} + +function rgb2lrgb(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} + +function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * degrees$2; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); +} + +function lch(l, c, h, opacity) { + return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +function hcl$2(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; +} + +function hcl2lab(o) { + if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * radians$1; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); +} + +define(Hcl, hcl$2, extend(Color, { + brighter: function(k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker: function(k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb: function() { + return hcl2lab(this).rgb(); + } +})); + +var A = -0.14861, + B = +1.78277, + C = -0.29227, + D = -0.90649, + E = +1.97294, + ED = E * D, + EB = E * B, + BC_DA = B * C - D * A; + +function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * degrees$2 - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +} + +function cubehelix$3(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); +} + +function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Cubehelix, cubehelix$3, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * radians$1, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } +})); + +function basis$1(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; +} + +function basis$2(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis$1((t - i / n) * n, v0, v1, v2, v3); + }; +} + +function basisClosed$1(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis$1((t - i / n) * n, v0, v1, v2, v3); + }; +} + +var constant$8 = x => () => x; + +function linear$2(a, d) { + return function(t) { + return a + t * d; + }; +} + +function exponential$1(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { + return Math.pow(a + t * b, y); + }; +} + +function hue$1(a, b) { + var d = b - a; + return d ? linear$2(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$8(isNaN(a) ? b : a); +} + +function gamma$1(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential$1(a, b, y) : constant$8(isNaN(a) ? b : a); + }; +} + +function nogamma(a, b) { + var d = b - a; + return d ? linear$2(a, d) : constant$8(isNaN(a) ? b : a); +} + +var interpolateRgb = (function rgbGamma(y) { + var color = gamma$1(y); + + function rgb$1(start, end) { + var r = color((start = rgb(start)).r, (end = rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb$1.gamma = rgbGamma; + + return rgb$1; +})(1); + +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color; + for (i = 0; i < n; ++i) { + color = rgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function(t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ""; + }; + }; +} + +var rgbBasis = rgbSpline(basis$2); +var rgbBasisClosed = rgbSpline(basisClosed$1); + +function numberArray(a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function(t) { + for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; +} + +function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); +} + +function array$3(a, b) { + return (isNumberArray(b) ? numberArray : genericArray)(a, b); +} + +function genericArray(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = interpolate$2(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; + + return function(t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; +} + +function date$1(a, b) { + var d = new Date; + return a = +a, b = +b, function(t) { + return d.setTime(a * (1 - t) + b * t), d; + }; +} + +function interpolateNumber(a, b) { + return a = +a, b = +b, function(t) { + return a * (1 - t) + b * t; + }; +} + +function object$1(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + + for (k in b) { + if (k in a) { + i[k] = interpolate$2(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; +} + +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); + +function zero(b) { + return function() { + return b; + }; +} + +function one(b) { + return function(t) { + return b(t) + ""; + }; +} + +function interpolateString(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: interpolateNumber(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); +} + +function interpolate$2(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant$8(b) + : (t === "number" ? interpolateNumber + : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString) + : b instanceof color ? interpolateRgb + : b instanceof Date ? date$1 + : isNumberArray(b) ? numberArray + : Array.isArray(b) ? genericArray + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object$1 + : interpolateNumber)(a, b); +} + +function discrete(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} + +function hue(a, b) { + var i = hue$1(+a, +b); + return function(t) { + var x = i(t); + return x - 360 * Math.floor(x / 360); + }; +} + +function interpolateRound(a, b) { + return a = +a, b = +b, function(t) { + return Math.round(a * (1 - t) + b * t); + }; +} + +var degrees$1 = 180 / Math.PI; + +var identity$7 = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; + +function decompose(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees$1, + skewX: Math.atan(skewX) * degrees$1, + scaleX: scaleX, + scaleY: scaleY + }; +} + +var svgNode; + +/* eslint-disable no-undef */ +function parseCss(value) { + const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m.isIdentity ? identity$7 : decompose(m.a, m.b, m.c, m.d, m.e, m.f); +} + +function parseSvg(value) { + if (value == null) return identity$7; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity$7; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); +} + +function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function(a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} + +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +var epsilon2$1 = 1e-12; + +function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; +} + +function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; +} + +function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); +} + +var interpolateZoom = (function zoomRho(rho, rho2, rho4) { + + // p0 = [ux0, uy0, w0] + // p1 = [ux1, uy1, w1] + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2$1) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000 * rho / Math.SQRT2; + + return i; + } + + zoom.rho = function(_) { + var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; + return zoomRho(_1, _2, _4); + }; + + return zoom; +})(Math.SQRT2, 2, 4); + +function hsl(hue) { + return function(start, end) { + var h = hue((start = hsl$2(start)).h, (end = hsl$2(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hsl$1 = hsl(hue$1); +var hslLong = hsl(nogamma); + +function lab(start, end) { + var l = nogamma((start = lab$1(start)).l, (end = lab$1(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; +} + +function hcl(hue) { + return function(start, end) { + var h = hue((start = hcl$2(start)).h, (end = hcl$2(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hcl$1 = hcl(hue$1); +var hclLong = hcl(nogamma); + +function cubehelix$1(hue) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix(start, end) { + var h = hue((start = cubehelix$3(start)).h, (end = cubehelix$3(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix.gamma = cubehelixGamma; + + return cubehelix; + })(1); +} + +var cubehelix$2 = cubehelix$1(hue$1); +var cubehelixLong = cubehelix$1(nogamma); + +function piecewise(interpolate, values) { + if (values === undefined) values = interpolate, interpolate = interpolate$2; + var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); + while (i < n) I[i] = interpolate(v, v = values[++i]); + return function(t) { + var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); + return I[i](t - i); + }; +} + +function quantize$1(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; +} + +var frame = 0, // is an animation frame pending? + timeout$1 = 0, // is a timeout pending? + interval$1 = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); }; + +function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +} + +function clearNow() { + clockNow = 0; +} + +function Timer() { + this._call = + this._time = + this._next = null; +} + +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } +}; + +function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; +} + +function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; + } + --frame; +} + +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout$1 = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } +} + +function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; +} + +function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); +} + +function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + if (timeout$1) timeout$1 = clearTimeout(timeout$1); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) timeout$1 = setTimeout(wake, time - clock.now() - clockSkew); + if (interval$1) interval$1 = clearInterval(interval$1); + } else { + if (!interval$1) clockLast = clock.now(), interval$1 = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} + +function timeout(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(elapsed => { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} + +function interval(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + t._restart = t.restart; + t.restart = function(callback, delay, time) { + delay = +delay, time = time == null ? now() : +time; + t._restart(function tick(elapsed) { + elapsed += total; + t._restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + }; + t.restart(callback, delay, time); + return t; +} + +var emptyOn = dispatch("start", "end", "cancel", "interrupt"); +var emptyTween = []; + +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; + +function schedule(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +} + +function init(node, id) { + var schedule = get(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; +} + +function set(node, id) { + var schedule = get(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; +} + +function get(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + return schedule; +} + +function create(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return timeout(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + timeout(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } +} + +function interrupt(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { empty = false; continue; } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; +} + +function selection_interrupt(name) { + return this.each(function() { + interrupt(this, name); + }); +} + +function tweenRemove(id, name) { + var tween0, tween1; + return function() { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; +} + +function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function() { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; +} + +function transition_tween(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = get(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); +} + +function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function() { + var schedule = set(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function(node) { + return get(node, id).value[name]; + }; +} + +function interpolate$1(a, b) { + var c; + return (typeof b === "number" ? interpolateNumber + : b instanceof color ? interpolateRgb + : (c = color(b)) ? (b = c, interpolateRgb) + : interpolateString)(a, b); +} + +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrConstantNS(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function attrFunctionNS(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function transition_attr(name, value) { + var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate$1; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) + : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); +} + +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i.call(this, t)); + }; +} + +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; +} + +function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; +} + +function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; +} + +function transition_attrTween(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +} + +function delayFunction(id, value) { + return function() { + init(this, id).delay = +value.apply(this, arguments); + }; +} + +function delayConstant(id, value) { + return value = +value, function() { + init(this, id).delay = value; + }; +} + +function transition_delay(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get(this.node(), id).delay; +} + +function durationFunction(id, value) { + return function() { + set(this, id).duration = +value.apply(this, arguments); + }; +} + +function durationConstant(id, value) { + return value = +value, function() { + set(this, id).duration = value; + }; +} + +function transition_duration(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get(this.node(), id).duration; +} + +function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function() { + set(this, id).ease = value; + }; +} + +function transition_ease(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get(this.node(), id).ease; +} + +function easeVarying(id, value) { + return function() { + var v = value.apply(this, arguments); + if (typeof v !== "function") throw new Error; + set(this, id).ease = v; + }; +} + +function transition_easeVarying(value) { + if (typeof value !== "function") throw new Error; + return this.each(easeVarying(this._id, value)); +} + +function transition_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); +} + +function transition_merge(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Transition(merges, this._parents, this._name, this._id); +} + +function start(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); +} + +function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : set; + return function() { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; +} + +function transition_on(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); +} + +function removeFunction(id) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; +} + +function transition_remove() { + return this.on("end.remove", removeFunction(this._id)); +} + +function transition_select(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); +} + +function transition_selectAll(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); +} + +var Selection = selection.prototype.constructor; + +function transition_selection() { + return new Selection(this._groups, this._parents); +} + +function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function() { + var string0 = styleValue(this, name), + string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} + +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = styleValue(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function styleFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0 = styleValue(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function() { + var schedule = set(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; +} + +function transition_style(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate$1; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, styleRemove(name)) + : typeof value === "function" ? this + .styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, styleConstant(name, i, value), priority) + .on("end.style." + name, null); +} + +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i.call(this, t), priority); + }; +} + +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; +} + +function transition_styleTween(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +} + +function textConstant(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} + +function transition_text(value) { + return this.tween("text", typeof value === "function" + ? textFunction(tweenValue(this, "text", value)) + : textConstant(value == null ? "" : value + "")); +} + +function textInterpolate(i) { + return function(t) { + this.textContent = i.call(this, t); + }; +} + +function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } + tween._value = value; + return tween; +} + +function transition_textTween(value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, textTween(value)); +} + +function transition_transition() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } + } + } + + return new Transition(groups, this._parents, name, id1); +} + +function transition_end() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = {value: reject}, + end = {value: function() { if (--size === 0) resolve(); }}; + + that.each(function() { + var schedule = set(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + + // The selection was empty, resolve end immediately + if (size === 0) resolve(); + }); +} + +var id = 0; + +function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; +} + +function transition(name) { + return selection().transition(name); +} + +function newId() { + return ++id; +} + +var selection_prototype = selection.prototype; + +Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + easeVarying: transition_easeVarying, + end: transition_end, + [Symbol.iterator]: selection_prototype[Symbol.iterator] +}; + +const linear$1 = t => +t; + +function quadIn(t) { + return t * t; +} + +function quadOut(t) { + return t * (2 - t); +} + +function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; +} + +function cubicIn(t) { + return t * t * t; +} + +function cubicOut(t) { + return --t * t * t + 1; +} + +function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} + +var exponent$1 = 3; + +var polyIn = (function custom(e) { + e = +e; + + function polyIn(t) { + return Math.pow(t, e); + } + + polyIn.exponent = custom; + + return polyIn; +})(exponent$1); + +var polyOut = (function custom(e) { + e = +e; + + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } + + polyOut.exponent = custom; + + return polyOut; +})(exponent$1); + +var polyInOut = (function custom(e) { + e = +e; + + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + + polyInOut.exponent = custom; + + return polyInOut; +})(exponent$1); + +var pi$4 = Math.PI, + halfPi$3 = pi$4 / 2; + +function sinIn(t) { + return (+t === 1) ? 1 : 1 - Math.cos(t * halfPi$3); +} + +function sinOut(t) { + return Math.sin(t * halfPi$3); +} + +function sinInOut(t) { + return (1 - Math.cos(pi$4 * t)) / 2; +} + +// tpmt is two power minus ten times t scaled to [0,1] +function tpmt(x) { + return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494; +} + +function expIn(t) { + return tpmt(1 - +t); +} + +function expOut(t) { + return 1 - tpmt(t); +} + +function expInOut(t) { + return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2; +} + +function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); +} + +function circleOut(t) { + return Math.sqrt(1 - --t * t); +} + +function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; +} + +var b1 = 4 / 11, + b2 = 6 / 11, + b3 = 8 / 11, + b4 = 3 / 4, + b5 = 9 / 11, + b6 = 10 / 11, + b7 = 15 / 16, + b8 = 21 / 22, + b9 = 63 / 64, + b0 = 1 / b1 / b1; + +function bounceIn(t) { + return 1 - bounceOut(1 - t); +} + +function bounceOut(t) { + return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; +} + +function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; +} + +var overshoot = 1.70158; + +var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return (t = +t) * t * (s * (t - 1) + t); + } + + backIn.overshoot = custom; + + return backIn; +})(overshoot); + +var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((t + 1) * s + t) + 1; + } + + backOut.overshoot = custom; + + return backOut; +})(overshoot); + +var backInOut = (function custom(s) { + s = +s; + + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + + backInOut.overshoot = custom; + + return backInOut; +})(overshoot); + +var tau$5 = 2 * Math.PI, + amplitude = 1, + period = 0.3; + +var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau$5); + + function elasticIn(t) { + return a * tpmt(-(--t)) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function(a) { return custom(a, p * tau$5); }; + elasticIn.period = function(p) { return custom(a, p); }; + + return elasticIn; +})(amplitude, period); + +var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau$5); + + function elasticOut(t) { + return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function(a) { return custom(a, p * tau$5); }; + elasticOut.period = function(p) { return custom(a, p); }; + + return elasticOut; +})(amplitude, period); + +var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau$5); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * tpmt(-t) * Math.sin((s - t) / p) + : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function(a) { return custom(a, p * tau$5); }; + elasticInOut.period = function(p) { return custom(a, p); }; + + return elasticInOut; +})(amplitude, period); + +var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut +}; + +function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + throw new Error(`transition ${id} not found`); + } + } + return timing; +} + +function selection_transition(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); +} + +selection.prototype.interrupt = selection_interrupt; +selection.prototype.transition = selection_transition; + +var root = [null]; + +function active(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root, name, +i); + } + } + } + + return null; +} + +var constant$7 = x => () => x; + +function BrushEvent(type, { + sourceEvent, + target, + selection, + mode, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + selection: {value: selection, enumerable: true, configurable: true}, + mode: {value: mode, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} + +function nopropagation$1(event) { + event.stopImmediatePropagation(); +} + +function noevent$1(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +var MODE_DRAG = {name: "drag"}, + MODE_SPACE = {name: "space"}, + MODE_HANDLE = {name: "handle"}, + MODE_CENTER = {name: "center"}; + +const {abs: abs$3, max: max$2, min: min$1} = Math; + +function number1(e) { + return [+e[0], +e[1]]; +} + +function number2(e) { + return [number1(e[0]), number1(e[1])]; +} + +var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; }, + output: function(xy) { return xy && [xy[0][0], xy[1][0]]; } +}; + +var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; }, + output: function(xy) { return xy && [xy[0][1], xy[1][1]]; } +}; + +var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function(xy) { return xy == null ? null : number2(xy); }, + output: function(xy) { return xy; } +}; + +var cursors = { + overlay: "crosshair", + selection: "move", + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" +}; + +var flipX = { + e: "w", + w: "e", + nw: "ne", + ne: "nw", + se: "sw", + sw: "se" +}; + +var flipY = { + n: "s", + s: "n", + nw: "sw", + ne: "se", + se: "ne", + sw: "nw" +}; + +var signsX = { + overlay: +1, + selection: +1, + n: null, + e: +1, + s: null, + w: -1, + nw: -1, + ne: +1, + se: +1, + sw: -1 +}; + +var signsY = { + overlay: +1, + selection: +1, + n: -1, + e: null, + s: +1, + w: null, + nw: -1, + ne: -1, + se: +1, + sw: +1 +}; + +function type(t) { + return {type: t}; +} + +// Ignore right-click, since that should open the context menu. +function defaultFilter$1(event) { + return !event.ctrlKey && !event.button; +} + +function defaultExtent$1() { + var svg = this.ownerSVGElement || this; + if (svg.hasAttribute("viewBox")) { + svg = svg.viewBox.baseVal; + return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; + } + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; +} + +function defaultTouchable$1() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +// Like d3.local, but with the name “__brush†rather than auto-generated. +function local(node) { + while (!node.__brush) if (!(node = node.parentNode)) return; + return node.__brush; +} + +function empty(extent) { + return extent[0][0] === extent[1][0] + || extent[0][1] === extent[1][1]; +} + +function brushSelection(node) { + var state = node.__brush; + return state ? state.dim.output(state.selection) : null; +} + +function brushX() { + return brush$1(X); +} + +function brushY() { + return brush$1(Y); +} + +function brush() { + return brush$1(XY); +} + +function brush$1(dim) { + var extent = defaultExtent$1, + filter = defaultFilter$1, + touchable = defaultTouchable$1, + keys = true, + listeners = dispatch("start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function() { + var extent = local(this).extent; + select(this) + .attr("x", extent[0][0]) + .attr("y", extent[0][1]) + .attr("width", extent[1][0] - extent[0][0]) + .attr("height", extent[1][1] - extent[0][1]); + }); + + group.selectAll(".selection") + .data([type("selection")]) + .enter().append("rect") + .attr("class", "selection") + .attr("cursor", cursors.selection) + .attr("fill", "#777") + .attr("fill-opacity", 0.3) + .attr("stroke", "#fff") + .attr("shape-rendering", "crispEdges"); + + var handle = group.selectAll(".handle") + .data(dim.handles, function(d) { return d.type; }); + + handle.exit().remove(); + + handle.enter().append("rect") + .attr("class", function(d) { return "handle handle--" + d.type; }) + .attr("cursor", function(d) { return cursors[d.type]; }); + + group + .each(redraw) + .attr("fill", "none") + .attr("pointer-events", "all") + .on("mousedown.brush", started) + .filter(touchable) + .on("touchstart.brush", started) + .on("touchmove.brush", touchmoved) + .on("touchend.brush touchcancel.brush", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + brush.move = function(group, selection) { + if (group.tween) { + group + .on("start.brush", function(event) { emitter(this, arguments).beforestart().start(event); }) + .on("interrupt.brush end.brush", function(event) { emitter(this, arguments).end(event); }) + .tween("brush", function() { + var that = this, + state = that.__brush, + emit = emitter(that, arguments), + selection0 = state.selection, + selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), + i = interpolate$2(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && selection1 === null ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 !== null && selection1 !== null ? tween : tween(1); + }); + } else { + group + .each(function() { + var that = this, + args = arguments, + state = that.__brush, + selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), + emit = emitter(that, args).beforestart(); + + interrupt(that); + state.selection = selection1 === null ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); + } + }; + + brush.clear = function(group) { + brush.move(group, null); + }; + + function redraw() { + var group = select(this), + selection = local(this).selection; + + if (selection) { + group.selectAll(".selection") + .style("display", null) + .attr("x", selection[0][0]) + .attr("y", selection[0][1]) + .attr("width", selection[1][0] - selection[0][0]) + .attr("height", selection[1][1] - selection[0][1]); + + group.selectAll(".handle") + .style("display", null) + .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; }) + .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; }) + .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; }) + .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; }); + } + + else { + group.selectAll(".selection,.handle") + .style("display", "none") + .attr("x", null) + .attr("y", null) + .attr("width", null) + .attr("height", null); + } + } + + function emitter(that, args, clean) { + var emit = that.__brush.emitter; + return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean); + } + + function Emitter(that, args, clean) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + this.clean = clean; + } + + Emitter.prototype = { + beforestart: function() { + if (++this.active === 1) this.state.emitter = this, this.starting = true; + return this; + }, + start: function(event, mode) { + if (this.starting) this.starting = false, this.emit("start", event, mode); + else this.emit("brush", event); + return this; + }, + brush: function(event, mode) { + this.emit("brush", event, mode); + return this; + }, + end: function(event, mode) { + if (--this.active === 0) delete this.state.emitter, this.emit("end", event, mode); + return this; + }, + emit: function(type, event, mode) { + var d = select(this.that).datum(); + listeners.call( + type, + this.that, + new BrushEvent(type, { + sourceEvent: event, + target: brush, + selection: dim.output(this.state.selection), + mode, + dispatch: listeners + }), + d + ); + } + }; + + function started(event) { + if (touchending && !event.touches) return; + if (!filter.apply(this, arguments)) return; + + var that = this, + type = event.target.__data__.type, + mode = (keys && event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local(that), + extent = state.extent, + selection = state.selection, + W = extent[0][0], w0, w1, + N = extent[0][1], n0, n1, + E = extent[1][0], e0, e1, + S = extent[1][1], s0, s1, + dx = 0, + dy = 0, + moving, + shifting = signX && signY && keys && event.shiftKey, + lockX, + lockY, + points = Array.from(event.touches || [event], t => { + const i = t.identifier; + t = pointer(t, that); + t.point0 = t.slice(); + t.identifier = i; + return t; + }); + + if (type === "overlay") { + if (selection) moving = true; + const pts = [points[0], points[1] || points[0]]; + state.selection = selection = [[ + w0 = dim === Y ? W : min$1(pts[0][0], pts[1][0]), + n0 = dim === X ? N : min$1(pts[0][1], pts[1][1]) + ], [ + e0 = dim === Y ? E : max$2(pts[0][0], pts[1][0]), + s0 = dim === X ? S : max$2(pts[0][1], pts[1][1]) + ]]; + if (points.length > 1) move(); + } else { + w0 = selection[0][0]; + n0 = selection[0][1]; + e0 = selection[1][0]; + s0 = selection[1][1]; + } + + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; + + var group = select(that) + .attr("pointer-events", "none"); + + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + interrupt(that); + var emit = emitter(that, arguments, true).beforestart(); + + if (event.touches) { + emit.moved = moved; + emit.ended = ended; + } else { + var view = select(event.view) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + if (keys) view + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true); + + dragDisable(event.view); + } + + redraw.call(that); + emit.start(event, mode.name); + + function moved(event) { + for (const p of event.changedTouches || [event]) { + for (const d of points) + if (d.identifier === p.identifier) d.cur = pointer(p, that); + } + if (shifting && !lockX && !lockY && points.length === 1) { + const point = points[0]; + if (abs$3(point.cur[0] - point[0]) > abs$3(point.cur[1] - point[1])) + lockY = true; + else + lockX = true; + } + for (const point of points) + if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1]; + moving = true; + noevent$1(event); + move(event); + } + + function move(event) { + const point = points[0], point0 = point.point0; + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = max$2(W - w0, min$1(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = max$2(N - n0, min$1(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (points[1]) { + if (signX) w1 = max$2(W, min$1(E, points[0][0])), e1 = max$2(W, min$1(E, points[1][0])), signX = 1; + if (signY) n1 = max$2(N, min$1(S, points[0][1])), s1 = max$2(N, min$1(S, points[1][1])), signY = 1; + } else { + if (signX < 0) dx = max$2(W - w0, min$1(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = max$2(W - e0, min$1(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = max$2(N - n0, min$1(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = max$2(N - s0, min$1(S - s0, dy)), n1 = n0, s1 = s0 + dy; + } + break; + } + case MODE_CENTER: { + if (signX) w1 = max$2(W, min$1(E, w0 - dx * signX)), e1 = max$2(W, min$1(E, e0 + dx * signX)); + if (signY) n1 = max$2(N, min$1(S, n0 - dy * signY)), s1 = max$2(N, min$1(S, s0 + dy * signY)); + break; + } + } + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) selection = state.selection; // May be set by brush.move! + if (lockX) w1 = selection[0][0], e1 = selection[1][0]; + if (lockY) n1 = selection[0][1], s1 = selection[1][1]; + + if (selection[0][0] !== w1 + || selection[0][1] !== n1 + || selection[1][0] !== e1 + || selection[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(event, mode.name); + } + } + + function ended(event) { + nopropagation$1(event); + if (event.touches) { + if (event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + } else { + yesdrag(event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) selection = state.selection; // May be set by brush.move (on start)! + if (empty(selection)) state.selection = null, redraw.call(that); + emit.end(event, mode.name); + } + + function keydowned(event) { + switch (event.keyCode) { + case 16: { // SHIFT + shifting = signX && signY; + break; + } + case 18: { // ALT + if (mode === MODE_HANDLE) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; + if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: return; + } + noevent$1(event); + } + + function keyupped(event) { + switch (event.keyCode) { + case 16: { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: { // SPACE + if (mode === MODE_SPACE) { + if (event.altKey) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: return; + } + noevent$1(event); + } + } + + function touchmoved(event) { + emitter(this, arguments).moved(event); + } + + function touchended(event) { + emitter(this, arguments).ended(event); + } + + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = number2(extent.apply(this, arguments)); + state.dim = dim; + return state; + } + + brush.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$7(number2(_)), brush) : extent; + }; + + brush.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$7(!!_), brush) : filter; + }; + + brush.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$7(!!_), brush) : touchable; + }; + + brush.handleSize = function(_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.keyModifiers = function(_) { + return arguments.length ? (keys = !!_, brush) : keys; + }; + + brush.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; +} + +var abs$2 = Math.abs; +var cos$2 = Math.cos; +var sin$2 = Math.sin; +var pi$3 = Math.PI; +var halfPi$2 = pi$3 / 2; +var tau$4 = pi$3 * 2; +var max$1 = Math.max; +var epsilon$4 = 1e-12; + +function range$1(i, j) { + return Array.from({length: j - i}, (_, k) => i + k); +} + +function compareValue(compare) { + return function(a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; +} + +function chord() { + return chord$1(false, false); +} + +function chordTranspose() { + return chord$1(false, true); +} + +function chordDirected() { + return chord$1(true, false); +} + +function chord$1(directed, transpose) { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = new Array(n), + groupIndex = range$1(0, n), + chords = new Array(n * n), + groups = new Array(n), + k = 0, dx; + + matrix = Float64Array.from({length: n * n}, transpose + ? (_, i) => matrix[i % n][i / n | 0] + : (_, i) => matrix[i / n | 0][i % n]); + + // Compute the scaling factor from value to angle in [0, 2pi]. + for (let i = 0; i < n; ++i) { + let x = 0; + for (let j = 0; j < n; ++j) x += matrix[i * n + j] + directed * matrix[j * n + i]; + k += groupSums[i] = x; + } + k = max$1(0, tau$4 - padAngle * n) / k; + dx = k ? padAngle : tau$4 / n; + + // Compute the angles for each group and constituent chord. + { + let x = 0; + if (sortGroups) groupIndex.sort((a, b) => sortGroups(groupSums[a], groupSums[b])); + for (const i of groupIndex) { + const x0 = x; + if (directed) { + const subgroupIndex = range$1(~n + 1, n).filter(j => j < 0 ? matrix[~j * n + i] : matrix[i * n + j]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(a < 0 ? -matrix[~a * n + i] : matrix[i * n + a], b < 0 ? -matrix[~b * n + i] : matrix[i * n + b])); + for (const j of subgroupIndex) { + if (j < 0) { + const chord = chords[~j * n + i] || (chords[~j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[~j * n + i] * k, value: matrix[~j * n + i]}; + } else { + const chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; + } else { + const subgroupIndex = range$1(0, n).filter(j => matrix[i * n + j] || matrix[j * n + i]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(matrix[i * n + a], matrix[i * n + b])); + for (const j of subgroupIndex) { + let chord; + if (i < j) { + chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } else { + chord = chords[j * n + i] || (chords[j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + if (i === j) chord.source = chord.target; + } + if (chord.source && chord.target && chord.source.value < chord.target.value) { + const source = chord.source; + chord.source = chord.target; + chord.target = source; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; + } + x += dx; + } + } + + // Remove empty chords. + chords = Object.values(chords); + chords.groups = groups; + return sortChords ? chords.sort(sortChords) : chords; + } + + chord.padAngle = function(_) { + return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle; + }; + + chord.sortGroups = function(_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; + + chord.sortSubgroups = function(_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; + + chord.sortChords = function(_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; + + return chord; +} + +const pi$2 = Math.PI, + tau$3 = 2 * pi$2, + epsilon$3 = 1e-6, + tauEpsilon = tau$3 - epsilon$3; + +function Path$1() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; +} + +function path() { + return new Path$1; +} + +Path$1.prototype = path.prototype = { + constructor: Path$1, + moveTo: function(x, y) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); + }, + closePath: function() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + }, + lineTo: function(x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function(x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { + this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + arcTo: function(x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon$3)); + + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$3) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; + + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon$3) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + + this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function(x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r, ccw = !!ccw; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; + } + + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon$3 || Math.abs(this._y1 - y0) > epsilon$3) { + this._ += "L" + x0 + "," + y0; + } + + // Is this arc empty? We’re done. + if (!r) return; + + // Does the angle go the wrong way? Flip the direction. + if (da < 0) da = da % tau$3 + tau$3; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } + + // Is this arc non-empty? Draw an arc! + else if (da > epsilon$3) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function(x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function() { + return this._; + } +}; + +var slice$2 = Array.prototype.slice; + +function constant$6(x) { + return function() { + return x; + }; +} + +function defaultSource$1(d) { + return d.source; +} + +function defaultTarget(d) { + return d.target; +} + +function defaultRadius$1(d) { + return d.radius; +} + +function defaultStartAngle(d) { + return d.startAngle; +} + +function defaultEndAngle(d) { + return d.endAngle; +} + +function defaultPadAngle() { + return 0; +} + +function defaultArrowheadRadius() { + return 10; +} + +function ribbon(headRadius) { + var source = defaultSource$1, + target = defaultTarget, + sourceRadius = defaultRadius$1, + targetRadius = defaultRadius$1, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + padAngle = defaultPadAngle, + context = null; + + function ribbon() { + var buffer, + s = source.apply(this, arguments), + t = target.apply(this, arguments), + ap = padAngle.apply(this, arguments) / 2, + argv = slice$2.call(arguments), + sr = +sourceRadius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi$2, + sa1 = endAngle.apply(this, argv) - halfPi$2, + tr = +targetRadius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi$2, + ta1 = endAngle.apply(this, argv) - halfPi$2; + + if (!context) context = buffer = path(); + + if (ap > epsilon$4) { + if (abs$2(sa1 - sa0) > ap * 2 + epsilon$4) sa1 > sa0 ? (sa0 += ap, sa1 -= ap) : (sa0 -= ap, sa1 += ap); + else sa0 = sa1 = (sa0 + sa1) / 2; + if (abs$2(ta1 - ta0) > ap * 2 + epsilon$4) ta1 > ta0 ? (ta0 += ap, ta1 -= ap) : (ta0 -= ap, ta1 += ap); + else ta0 = ta1 = (ta0 + ta1) / 2; + } + + context.moveTo(sr * cos$2(sa0), sr * sin$2(sa0)); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { + if (headRadius) { + var hr = +headRadius.apply(this, arguments), tr2 = tr - hr, ta2 = (ta0 + ta1) / 2; + context.quadraticCurveTo(0, 0, tr2 * cos$2(ta0), tr2 * sin$2(ta0)); + context.lineTo(tr * cos$2(ta2), tr * sin$2(ta2)); + context.lineTo(tr2 * cos$2(ta1), tr2 * sin$2(ta1)); + } else { + context.quadraticCurveTo(0, 0, tr * cos$2(ta0), tr * sin$2(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + } + context.quadraticCurveTo(0, 0, sr * cos$2(sa0), sr * sin$2(sa0)); + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + if (headRadius) ribbon.headRadius = function(_) { + return arguments.length ? (headRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : headRadius; + }; + + ribbon.radius = function(_) { + return arguments.length ? (sourceRadius = targetRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : sourceRadius; + }; + + ribbon.sourceRadius = function(_) { + return arguments.length ? (sourceRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : sourceRadius; + }; + + ribbon.targetRadius = function(_) { + return arguments.length ? (targetRadius = typeof _ === "function" ? _ : constant$6(+_), ribbon) : targetRadius; + }; + + ribbon.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$6(+_), ribbon) : startAngle; + }; + + ribbon.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$6(+_), ribbon) : endAngle; + }; + + ribbon.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$6(+_), ribbon) : padAngle; + }; + + ribbon.source = function(_) { + return arguments.length ? (source = _, ribbon) : source; + }; + + ribbon.target = function(_) { + return arguments.length ? (target = _, ribbon) : target; + }; + + ribbon.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; + + return ribbon; +} + +function ribbon$1() { + return ribbon(); +} + +function ribbonArrow() { + return ribbon(defaultArrowheadRadius); +} + +var array$2 = Array.prototype; + +var slice$1 = array$2.slice; + +function ascending$1(a, b) { + return a - b; +} + +function area$3(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; +} + +var constant$5 = x => () => x; + +function contains$2(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) if (c = ringContains(ring, hole[i])) return c; + return 0; +} + +function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; + } + return contains; +} + +function segmentContains(a, b, c) { + var i; return collinear$1(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); +} + +function collinear$1(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); +} + +function within(p, q, r) { + return p <= q && q <= r || r <= q && q <= p; +} + +function noop$2() {} + +var cases = [ + [], + [[[1.0, 1.5], [0.5, 1.0]]], + [[[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [0.5, 1.0]]], + [[[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 0.5], [1.0, 1.5]]], + [[[1.0, 0.5], [0.5, 1.0]]], + [[[0.5, 1.0], [1.0, 0.5]]], + [[[1.0, 1.5], [1.0, 0.5]]], + [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [1.0, 0.5]]], + [[[0.5, 1.0], [1.5, 1.0]]], + [[[1.0, 1.5], [1.5, 1.0]]], + [[[0.5, 1.0], [1.0, 1.5]]], + [] +]; + +function contours() { + var dx = 1, + dy = 1, + threshold = thresholdSturges, + smooth = smoothLinear; + + function contours(values) { + var tz = threshold(values); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var domain = extent$1(values), start = domain[0], stop = domain[1]; + tz = tickStep(start, stop, tz); + tz = sequence(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + } else { + tz = tz.slice().sort(ascending$1); + } + + return tz.map(function(value) { + return contour(values, value); + }); + } + + // Accumulate, smooth contour rings, assign holes to exterior rings. + // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js + function contour(values, value) { + var polygons = [], + holes = []; + + isorings(values, value, function(ring) { + smooth(ring, values, value); + if (area$3(ring) > 0) polygons.push([ring]); + else holes.push(ring); + }); + + holes.forEach(function(hole) { + for (var i = 0, n = polygons.length, polygon; i < n; ++i) { + if (contains$2((polygon = polygons[i])[0], hole) !== -1) { + polygon.push(hole); + return; + } + } + }); + + return { + type: "MultiPolygon", + value: value, + coordinates: polygons + }; + } + + // Marching squares with isolines stitched into rings. + // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js + function isorings(values, value, callback) { + var fragmentByStart = new Array, + fragmentByEnd = new Array, + x, y, t0, t1, t2, t3; + + // Special case for the first row (y = -1, t2 = t3 = 0). + x = y = -1; + t1 = values[0] >= value; + cases[t1 << 1].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[x + 1] >= value; + cases[t0 | t1 << 1].forEach(stitch); + } + cases[t1 << 0].forEach(stitch); + + // General case for the intermediate rows. + while (++y < dy - 1) { + x = -1; + t1 = values[y * dx + dx] >= value; + t2 = values[y * dx] >= value; + cases[t1 << 1 | t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t1 | t2 << 3].forEach(stitch); + } + + // Special case for the last row (y = dy - 1, t0 = t1 = 0). + x = -1; + t2 = values[y * dx] >= value; + cases[t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t2 << 3].forEach(stitch); + + function stitch(line) { + var start = [line[0][0] + x, line[0][1] + y], + end = [line[1][0] + x, line[1][1] + y], + startIndex = index(start), + endIndex = index(end), + f, g; + if (f = fragmentByEnd[startIndex]) { + if (g = fragmentByStart[endIndex]) { + delete fragmentByEnd[f.end]; + delete fragmentByStart[g.start]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)}; + } + } else { + delete fragmentByEnd[f.end]; + f.ring.push(end); + fragmentByEnd[f.end = endIndex] = f; + } + } else if (f = fragmentByStart[endIndex]) { + if (g = fragmentByEnd[startIndex]) { + delete fragmentByStart[f.start]; + delete fragmentByEnd[g.end]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)}; + } + } else { + delete fragmentByStart[f.start]; + f.ring.unshift(start); + fragmentByStart[f.start = startIndex] = f; + } + } else { + fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]}; + } + } + } + + function index(point) { + return point[0] * 2 + point[1] * (dx + 1) * 4; + } + + function smoothLinear(ring, values, value) { + ring.forEach(function(point) { + var x = point[0], + y = point[1], + xt = x | 0, + yt = y | 0, + v0, + v1 = values[yt * dx + xt]; + if (x > 0 && x < dx && xt === x) { + v0 = values[yt * dx + xt - 1]; + point[0] = x + (value - v0) / (v1 - v0) - 0.5; + } + if (y > 0 && y < dy && yt === y) { + v0 = values[(yt - 1) * dx + xt]; + point[1] = y + (value - v0) / (v1 - v0) - 0.5; + } + }); + } + + contours.contour = contour; + + contours.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]); + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, contours; + }; + + contours.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$5(slice$1.call(_)) : constant$5(_), contours) : threshold; + }; + + contours.smooth = function(_) { + return arguments.length ? (smooth = _ ? smoothLinear : noop$2, contours) : smooth === smoothLinear; + }; + + return contours; +} + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurX(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var j = 0; j < m; ++j) { + for (var i = 0, sr = 0; i < n + r; ++i) { + if (i < n) { + sr += source.data[i + j * n]; + } + if (i >= r) { + if (i >= w) { + sr -= source.data[i - w + j * n]; + } + target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); + } + } + } +} + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurY(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var i = 0; i < n; ++i) { + for (var j = 0, sr = 0; j < m + r; ++j) { + if (j < m) { + sr += source.data[i + j * n]; + } + if (j >= r) { + if (j >= w) { + sr -= source.data[i + (j - w) * n]; + } + target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); + } + } + } +} + +function defaultX$1(d) { + return d[0]; +} + +function defaultY$1(d) { + return d[1]; +} + +function defaultWeight() { + return 1; +} + +function density() { + var x = defaultX$1, + y = defaultY$1, + weight = defaultWeight, + dx = 960, + dy = 500, + r = 20, // blur radius + k = 2, // log2(grid cell size) + o = r * 3, // grid offset, to pad for blur + n = (dx + o * 2) >> k, // grid width + m = (dy + o * 2) >> k, // grid height + threshold = constant$5(20); + + function density(data) { + var values0 = new Float32Array(n * m), + values1 = new Float32Array(n * m); + + data.forEach(function(d, i, data) { + var xi = (+x(d, i, data) + o) >> k, + yi = (+y(d, i, data) + o) >> k, + wi = +weight(d, i, data); + if (xi >= 0 && xi < n && yi >= 0 && yi < m) { + values0[xi + yi * n] += wi; + } + }); + + // TODO Optimize. + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + + var tz = threshold(values0); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var stop = max$3(values0); + tz = tickStep(0, stop, tz); + tz = sequence(0, Math.floor(stop / tz) * tz, tz); + tz.shift(); + } + + return contours() + .thresholds(tz) + .size([n, m]) + (values0) + .map(transform); + } + + function transform(geometry) { + geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. + geometry.coordinates.forEach(transformPolygon); + return geometry; + } + + function transformPolygon(coordinates) { + coordinates.forEach(transformRing); + } + + function transformRing(coordinates) { + coordinates.forEach(transformPoint); + } + + // TODO Optimize. + function transformPoint(coordinates) { + coordinates[0] = coordinates[0] * Math.pow(2, k) - o; + coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + } + + function resize() { + o = r * 3; + n = (dx + o * 2) >> k; + m = (dy + o * 2) >> k; + return density; + } + + density.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$5(+_), density) : x; + }; + + density.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$5(+_), density) : y; + }; + + density.weight = function(_) { + return arguments.length ? (weight = typeof _ === "function" ? _ : constant$5(+_), density) : weight; + }; + + density.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = +_[0], _1 = +_[1]; + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, resize(); + }; + + density.cellSize = function(_) { + if (!arguments.length) return 1 << k; + if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); + return k = Math.floor(Math.log(_) / Math.LN2), resize(); + }; + + density.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$5(slice$1.call(_)) : constant$5(_), density) : threshold; + }; + + density.bandwidth = function(_) { + if (!arguments.length) return Math.sqrt(r * (r + 1)); + if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); + return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + }; + + return density; +} + +const EPSILON = Math.pow(2, -52); +const EDGE_STACK = new Uint32Array(512); + +class Delaunator { + + static from(points, getX = defaultGetX, getY = defaultGetY) { + const n = points.length; + const coords = new Float64Array(n * 2); + + for (let i = 0; i < n; i++) { + const p = points[i]; + coords[2 * i] = getX(p); + coords[2 * i + 1] = getY(p); + } + + return new Delaunator(coords); + } + + constructor(coords) { + const n = coords.length >> 1; + if (n > 0 && typeof coords[0] !== 'number') throw new Error('Expected coords to contain numbers.'); + + this.coords = coords; + + // arrays that will store the triangulation graph + const maxTriangles = Math.max(2 * n - 5, 0); + this._triangles = new Uint32Array(maxTriangles * 3); + this._halfedges = new Int32Array(maxTriangles * 3); + + // temporary arrays for tracking the edges of the advancing convex hull + this._hashSize = Math.ceil(Math.sqrt(n)); + this._hullPrev = new Uint32Array(n); // edge to prev edge + this._hullNext = new Uint32Array(n); // edge to next edge + this._hullTri = new Uint32Array(n); // edge to adjacent triangle + this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash + + // temporary arrays for sorting points + this._ids = new Uint32Array(n); + this._dists = new Float64Array(n); + + this.update(); + } + + update() { + const {coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash} = this; + const n = coords.length >> 1; + + // populate an array of point indices; calculate input data bbox + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + + for (let i = 0; i < n; i++) { + const x = coords[2 * i]; + const y = coords[2 * i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + this._ids[i] = i; + } + const cx = (minX + maxX) / 2; + const cy = (minY + maxY) / 2; + + let minDist = Infinity; + let i0, i1, i2; + + // pick a seed point close to the center + for (let i = 0; i < n; i++) { + const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]); + if (d < minDist) { + i0 = i; + minDist = d; + } + } + const i0x = coords[2 * i0]; + const i0y = coords[2 * i0 + 1]; + + minDist = Infinity; + + // find the point closest to the seed + for (let i = 0; i < n; i++) { + if (i === i0) continue; + const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]); + if (d < minDist && d > 0) { + i1 = i; + minDist = d; + } + } + let i1x = coords[2 * i1]; + let i1y = coords[2 * i1 + 1]; + + let minRadius = Infinity; + + // find the third point which forms the smallest circumcircle with the first two + for (let i = 0; i < n; i++) { + if (i === i0 || i === i1) continue; + const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]); + if (r < minRadius) { + i2 = i; + minRadius = r; + } + } + let i2x = coords[2 * i2]; + let i2y = coords[2 * i2 + 1]; + + if (minRadius === Infinity) { + // order collinear points by dx (or dy if all x are identical) + // and return the list as a hull + for (let i = 0; i < n; i++) { + this._dists[i] = (coords[2 * i] - coords[0]) || (coords[2 * i + 1] - coords[1]); + } + quicksort(this._ids, this._dists, 0, n - 1); + const hull = new Uint32Array(n); + let j = 0; + for (let i = 0, d0 = -Infinity; i < n; i++) { + const id = this._ids[i]; + if (this._dists[id] > d0) { + hull[j++] = id; + d0 = this._dists[id]; + } + } + this.hull = hull.subarray(0, j); + this.triangles = new Uint32Array(0); + this.halfedges = new Uint32Array(0); + return; + } + + // swap the order of the seed points for counter-clockwise orientation + if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) { + const i = i1; + const x = i1x; + const y = i1y; + i1 = i2; + i1x = i2x; + i1y = i2y; + i2 = i; + i2x = x; + i2y = y; + } + + const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y); + this._cx = center.x; + this._cy = center.y; + + for (let i = 0; i < n; i++) { + this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y); + } + + // sort the points by distance from the seed triangle circumcenter + quicksort(this._ids, this._dists, 0, n - 1); + + // set up the seed triangle as the starting hull + this._hullStart = i0; + let hullSize = 3; + + hullNext[i0] = hullPrev[i2] = i1; + hullNext[i1] = hullPrev[i0] = i2; + hullNext[i2] = hullPrev[i1] = i0; + + hullTri[i0] = 0; + hullTri[i1] = 1; + hullTri[i2] = 2; + + hullHash.fill(-1); + hullHash[this._hashKey(i0x, i0y)] = i0; + hullHash[this._hashKey(i1x, i1y)] = i1; + hullHash[this._hashKey(i2x, i2y)] = i2; + + this.trianglesLen = 0; + this._addTriangle(i0, i1, i2, -1, -1, -1); + + for (let k = 0, xp, yp; k < this._ids.length; k++) { + const i = this._ids[k]; + const x = coords[2 * i]; + const y = coords[2 * i + 1]; + + // skip near-duplicate points + if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue; + xp = x; + yp = y; + + // skip seed triangle points + if (i === i0 || i === i1 || i === i2) continue; + + // find a visible edge on the convex hull using edge hash + let start = 0; + for (let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++) { + start = hullHash[(key + j) % this._hashSize]; + if (start !== -1 && start !== hullNext[start]) break; + } + + start = hullPrev[start]; + let e = start, q; + while (q = hullNext[e], !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1])) { + e = q; + if (e === start) { + e = -1; + break; + } + } + if (e === -1) continue; // likely a near-duplicate point; skip it + + // add the first triangle from the point + let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]); + + // recursively flip triangles from the point until they satisfy the Delaunay condition + hullTri[i] = this._legalize(t + 2); + hullTri[e] = t; // keep track of boundary triangles on the hull + hullSize++; + + // walk forward through the hull, adding more triangles and flipping recursively + let n = hullNext[e]; + while (q = hullNext[n], orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1])) { + t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]); + hullTri[i] = this._legalize(t + 2); + hullNext[n] = n; // mark as removed + hullSize--; + n = q; + } + + // walk backward from the other side, adding more triangles and flipping + if (e === start) { + while (q = hullPrev[e], orient(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1])) { + t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]); + this._legalize(t + 2); + hullTri[q] = t; + hullNext[e] = e; // mark as removed + hullSize--; + e = q; + } + } + + // update the hull indices + this._hullStart = hullPrev[i] = e; + hullNext[e] = hullPrev[n] = i; + hullNext[i] = n; + + // save the two new edges in the hash table + hullHash[this._hashKey(x, y)] = i; + hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e; + } + + this.hull = new Uint32Array(hullSize); + for (let i = 0, e = this._hullStart; i < hullSize; i++) { + this.hull[i] = e; + e = hullNext[e]; + } + + // trim typed triangle mesh arrays + this.triangles = this._triangles.subarray(0, this.trianglesLen); + this.halfedges = this._halfedges.subarray(0, this.trianglesLen); + } + + _hashKey(x, y) { + return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize; + } + + _legalize(a) { + const {_triangles: triangles, _halfedges: halfedges, coords} = this; + + let i = 0; + let ar = 0; + + // recursion eliminated with a fixed-size stack + while (true) { + const b = halfedges[a]; + + /* if the pair of triangles doesn't satisfy the Delaunay condition + * (p1 is inside the circumcircle of [p0, pl, pr]), flip them, + * then do the same check/flip recursively for the new pair of triangles + * + * pl pl + * /||\ / \ + * al/ || \bl al/ \a + * / || \ / \ + * / a||b \ flip /___ar___\ + * p0\ || /p1 => p0\---bl---/p1 + * \ || / \ / + * ar\ || /br b\ /br + * \||/ \ / + * pr pr + */ + const a0 = a - a % 3; + ar = a0 + (a + 2) % 3; + + if (b === -1) { // convex hull edge + if (i === 0) break; + a = EDGE_STACK[--i]; + continue; + } + + const b0 = b - b % 3; + const al = a0 + (a + 1) % 3; + const bl = b0 + (b + 2) % 3; + + const p0 = triangles[ar]; + const pr = triangles[a]; + const pl = triangles[al]; + const p1 = triangles[bl]; + + const illegal = inCircle( + coords[2 * p0], coords[2 * p0 + 1], + coords[2 * pr], coords[2 * pr + 1], + coords[2 * pl], coords[2 * pl + 1], + coords[2 * p1], coords[2 * p1 + 1]); + + if (illegal) { + triangles[a] = p1; + triangles[b] = p0; + + const hbl = halfedges[bl]; + + // edge swapped on the other side of the hull (rare); fix the halfedge reference + if (hbl === -1) { + let e = this._hullStart; + do { + if (this._hullTri[e] === bl) { + this._hullTri[e] = a; + break; + } + e = this._hullPrev[e]; + } while (e !== this._hullStart); + } + this._link(a, hbl); + this._link(b, halfedges[ar]); + this._link(ar, bl); + + const br = b0 + (b + 1) % 3; + + // don't worry about hitting the cap: it can only happen on extremely degenerate input + if (i < EDGE_STACK.length) { + EDGE_STACK[i++] = br; + } + } else { + if (i === 0) break; + a = EDGE_STACK[--i]; + } + } + + return ar; + } + + _link(a, b) { + this._halfedges[a] = b; + if (b !== -1) this._halfedges[b] = a; + } + + // add a new triangle given vertex indices and adjacent half-edge ids + _addTriangle(i0, i1, i2, a, b, c) { + const t = this.trianglesLen; + + this._triangles[t] = i0; + this._triangles[t + 1] = i1; + this._triangles[t + 2] = i2; + + this._link(t, a); + this._link(t + 1, b); + this._link(t + 2, c); + + this.trianglesLen += 3; + + return t; + } +} + +// monotonically increases with real angle, but doesn't need expensive trigonometry +function pseudoAngle(dx, dy) { + const p = dx / (Math.abs(dx) + Math.abs(dy)); + return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1] +} + +function dist(ax, ay, bx, by) { + const dx = ax - bx; + const dy = ay - by; + return dx * dx + dy * dy; +} + +// return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check +function orientIfSure(px, py, rx, ry, qx, qy) { + const l = (ry - py) * (qx - px); + const r = (rx - px) * (qy - py); + return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0; +} + +// a more robust orientation test that's stable in a given triangle (to fix robustness issues) +function orient(rx, ry, qx, qy, px, py) { + const sign = orientIfSure(px, py, rx, ry, qx, qy) || + orientIfSure(rx, ry, qx, qy, px, py) || + orientIfSure(qx, qy, px, py, rx, ry); + return sign < 0; +} + +function inCircle(ax, ay, bx, by, cx, cy, px, py) { + const dx = ax - px; + const dy = ay - py; + const ex = bx - px; + const ey = by - py; + const fx = cx - px; + const fy = cy - py; + + const ap = dx * dx + dy * dy; + const bp = ex * ex + ey * ey; + const cp = fx * fx + fy * fy; + + return dx * (ey * cp - bp * fy) - + dy * (ex * cp - bp * fx) + + ap * (ex * fy - ey * fx) < 0; +} + +function circumradius(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; + + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); + + const x = (ey * bl - dy * cl) * d; + const y = (dx * cl - ex * bl) * d; + + return x * x + y * y; +} + +function circumcenter(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; + + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); + + const x = ax + (ey * bl - dy * cl) * d; + const y = ay + (dx * cl - ex * bl) * d; + + return {x, y}; +} + +function quicksort(ids, dists, left, right) { + if (right - left <= 20) { + for (let i = left + 1; i <= right; i++) { + const temp = ids[i]; + const tempDist = dists[temp]; + let j = i - 1; + while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--]; + ids[j + 1] = temp; + } + } else { + const median = (left + right) >> 1; + let i = left + 1; + let j = right; + swap(ids, median, i); + if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right); + if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right); + if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i); + + const temp = ids[i]; + const tempDist = dists[temp]; + while (true) { + do i++; while (dists[ids[i]] < tempDist); + do j--; while (dists[ids[j]] > tempDist); + if (j < i) break; + swap(ids, i, j); + } + ids[left + 1] = ids[j]; + ids[j] = temp; + + if (right - i + 1 >= j - left) { + quicksort(ids, dists, i, right); + quicksort(ids, dists, left, j - 1); + } else { + quicksort(ids, dists, left, j - 1); + quicksort(ids, dists, i, right); + } + } +} + +function swap(arr, i, j) { + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} + +function defaultGetX(p) { + return p[0]; +} +function defaultGetY(p) { + return p[1]; +} + +const epsilon$2 = 1e-6; + +class Path { + constructor() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; + } + moveTo(x, y) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`; + } + closePath() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + } + lineTo(x, y) { + this._ += `L${this._x1 = +x},${this._y1 = +y}`; + } + arc(x, y, r) { + x = +x, y = +y, r = +r; + const x0 = x + r; + const y0 = y; + if (r < 0) throw new Error("negative radius"); + if (this._x1 === null) this._ += `M${x0},${y0}`; + else if (Math.abs(this._x1 - x0) > epsilon$2 || Math.abs(this._y1 - y0) > epsilon$2) this._ += "L" + x0 + "," + y0; + if (!r) return; + this._ += `A${r},${r},0,1,1,${x - r},${y}A${r},${r},0,1,1,${this._x1 = x0},${this._y1 = y0}`; + } + rect(x, y, w, h) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${+w}v${+h}h${-w}Z`; + } + value() { + return this._ || null; + } +} + +class Polygon { + constructor() { + this._ = []; + } + moveTo(x, y) { + this._.push([x, y]); + } + closePath() { + this._.push(this._[0].slice()); + } + lineTo(x, y) { + this._.push([x, y]); + } + value() { + return this._.length ? this._ : null; + } +} + +class Voronoi { + constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) { + if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error("invalid bounds"); + this.delaunay = delaunay; + this._circumcenters = new Float64Array(delaunay.points.length * 2); + this.vectors = new Float64Array(delaunay.points.length * 2); + this.xmax = xmax, this.xmin = xmin; + this.ymax = ymax, this.ymin = ymin; + this._init(); + } + update() { + this.delaunay.update(); + this._init(); + return this; + } + _init() { + const {delaunay: {points, hull, triangles}, vectors} = this; + + // Compute circumcenters. + const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2); + for (let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2) { + const t1 = triangles[i] * 2; + const t2 = triangles[i + 1] * 2; + const t3 = triangles[i + 2] * 2; + const x1 = points[t1]; + const y1 = points[t1 + 1]; + const x2 = points[t2]; + const y2 = points[t2 + 1]; + const x3 = points[t3]; + const y3 = points[t3 + 1]; + + const dx = x2 - x1; + const dy = y2 - y1; + const ex = x3 - x1; + const ey = y3 - y1; + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const ab = (dx * ey - dy * ex) * 2; + + if (!ab) { + // degenerate case (collinear diagram) + x = (x1 + x3) / 2 - 1e8 * ey; + y = (y1 + y3) / 2 + 1e8 * ex; + } + else if (Math.abs(ab) < 1e-8) { + // almost equal points (degenerate triangle) + x = (x1 + x3) / 2; + y = (y1 + y3) / 2; + } else { + const d = 1 / ab; + x = x1 + (ey * bl - dy * cl) * d; + y = y1 + (dx * cl - ex * bl) * d; + } + circumcenters[j] = x; + circumcenters[j + 1] = y; + } + + // Compute exterior cell rays. + let h = hull[hull.length - 1]; + let p0, p1 = h * 4; + let x0, x1 = points[2 * h]; + let y0, y1 = points[2 * h + 1]; + vectors.fill(0); + for (let i = 0; i < hull.length; ++i) { + h = hull[i]; + p0 = p1, x0 = x1, y0 = y1; + p1 = h * 4, x1 = points[2 * h], y1 = points[2 * h + 1]; + vectors[p0 + 2] = vectors[p1] = y0 - y1; + vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0; + } + } + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {delaunay: {halfedges, inedges, hull}, circumcenters, vectors} = this; + if (hull.length <= 1) return null; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = Math.floor(i / 3) * 2; + const tj = Math.floor(j / 3) * 2; + const xi = circumcenters[ti]; + const yi = circumcenters[ti + 1]; + const xj = circumcenters[tj]; + const yj = circumcenters[tj + 1]; + this._renderSegment(xi, yi, xj, yj, context); + } + let h0, h1 = hull[hull.length - 1]; + for (let i = 0; i < hull.length; ++i) { + h0 = h1, h1 = hull[i]; + const t = Math.floor(inedges[h1] / 3) * 2; + const x = circumcenters[t]; + const y = circumcenters[t + 1]; + const v = h0 * 4; + const p = this._project(x, y, vectors[v + 2], vectors[v + 3]); + if (p) this._renderSegment(x, y, p[0], p[1], context); + } + return buffer && buffer.value(); + } + renderBounds(context) { + const buffer = context == null ? context = new Path : undefined; + context.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin); + return buffer && buffer.value(); + } + renderCell(i, context) { + const buffer = context == null ? context = new Path : undefined; + const points = this._clip(i); + if (points === null || !points.length) return; + context.moveTo(points[0], points[1]); + let n = points.length; + while (points[0] === points[n-2] && points[1] === points[n-1] && n > 1) n -= 2; + for (let i = 2; i < n; i += 2) { + if (points[i] !== points[i-2] || points[i+1] !== points[i-1]) + context.lineTo(points[i], points[i + 1]); + } + context.closePath(); + return buffer && buffer.value(); + } + *cellPolygons() { + const {delaunay: {points}} = this; + for (let i = 0, n = points.length / 2; i < n; ++i) { + const cell = this.cellPolygon(i); + if (cell) cell.index = i, yield cell; + } + } + cellPolygon(i) { + const polygon = new Polygon; + this.renderCell(i, polygon); + return polygon.value(); + } + _renderSegment(x0, y0, x1, y1, context) { + let S; + const c0 = this._regioncode(x0, y0); + const c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + context.moveTo(x0, y0); + context.lineTo(x1, y1); + } else if (S = this._clipSegment(x0, y0, x1, y1, c0, c1)) { + context.moveTo(S[0], S[1]); + context.lineTo(S[2], S[3]); + } + } + contains(i, x, y) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return false; + return this.delaunay._step(i, x, y) === i; + } + *neighbors(i) { + const ci = this._clip(i); + if (ci) for (const j of this.delaunay.neighbors(i)) { + const cj = this._clip(j); + // find the common edge + if (cj) loop: for (let ai = 0, li = ci.length; ai < li; ai += 2) { + for (let aj = 0, lj = cj.length; aj < lj; aj += 2) { + if (ci[ai] == cj[aj] + && ci[ai + 1] == cj[aj + 1] + && ci[(ai + 2) % li] == cj[(aj + lj - 2) % lj] + && ci[(ai + 3) % li] == cj[(aj + lj - 1) % lj] + ) { + yield j; + break loop; + } + } + } + } + } + _cell(i) { + const {circumcenters, delaunay: {inedges, halfedges, triangles}} = this; + const e0 = inedges[i]; + if (e0 === -1) return null; // coincident point + const points = []; + let e = e0; + do { + const t = Math.floor(e / 3); + points.push(circumcenters[t * 2], circumcenters[t * 2 + 1]); + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + } while (e !== e0 && e !== -1); + return points; + } + _clip(i) { + // degenerate case (1 valid point: return the box) + if (i === 0 && this.delaunay.hull.length === 1) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; + } + const points = this._cell(i); + if (points === null) return null; + const {vectors: V} = this; + const v = i * 4; + return V[v] || V[v + 1] + ? this._clipInfinite(i, points, V[v], V[v + 1], V[v + 2], V[v + 3]) + : this._clipFinite(i, points); + } + _clipFinite(i, points) { + const n = points.length; + let P = null; + let x0, y0, x1 = points[n - 2], y1 = points[n - 1]; + let c0, c1 = this._regioncode(x1, y1); + let e0, e1; + for (let j = 0; j < n; j += 2) { + x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1]; + c0 = c1, c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + e0 = e1, e1 = 0; + if (P) P.push(x1, y1); + else P = [x1, y1]; + } else { + let S, sx0, sy0, sx1, sy1; + if (c0 === 0) { + if ((S = this._clipSegment(x0, y0, x1, y1, c0, c1)) === null) continue; + [sx0, sy0, sx1, sy1] = S; + } else { + if ((S = this._clipSegment(x1, y1, x0, y0, c1, c0)) === null) continue; + [sx1, sy1, sx0, sy0] = S; + e0 = e1, e1 = this._edgecode(sx0, sy0); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx0, sy0); + else P = [sx0, sy0]; + } + e0 = e1, e1 = this._edgecode(sx1, sy1); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx1, sy1); + else P = [sx1, sy1]; + } + } + if (P) { + e0 = e1, e1 = this._edgecode(P[0], P[1]); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; + } + return P; + } + _clipSegment(x0, y0, x1, y1, c0, c1) { + while (true) { + if (c0 === 0 && c1 === 0) return [x0, y0, x1, y1]; + if (c0 & c1) return null; + let x, y, c = c0 || c1; + if (c & 0b1000) x = x0 + (x1 - x0) * (this.ymax - y0) / (y1 - y0), y = this.ymax; + else if (c & 0b0100) x = x0 + (x1 - x0) * (this.ymin - y0) / (y1 - y0), y = this.ymin; + else if (c & 0b0010) y = y0 + (y1 - y0) * (this.xmax - x0) / (x1 - x0), x = this.xmax; + else y = y0 + (y1 - y0) * (this.xmin - x0) / (x1 - x0), x = this.xmin; + if (c0) x0 = x, y0 = y, c0 = this._regioncode(x0, y0); + else x1 = x, y1 = y, c1 = this._regioncode(x1, y1); + } + } + _clipInfinite(i, points, vx0, vy0, vxn, vyn) { + let P = Array.from(points), p; + if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]); + if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]); + if (P = this._clipFinite(i, P)) { + for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) { + c0 = c1, c1 = this._edgecode(P[j], P[j + 1]); + if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length; + } + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax]; + } + return P; + } + _edge(i, e0, e1, P, j) { + while (e0 !== e1) { + let x, y; + switch (e0) { + case 0b0101: e0 = 0b0100; continue; // top-left + case 0b0100: e0 = 0b0110, x = this.xmax, y = this.ymin; break; // top + case 0b0110: e0 = 0b0010; continue; // top-right + case 0b0010: e0 = 0b1010, x = this.xmax, y = this.ymax; break; // right + case 0b1010: e0 = 0b1000; continue; // bottom-right + case 0b1000: e0 = 0b1001, x = this.xmin, y = this.ymax; break; // bottom + case 0b1001: e0 = 0b0001; continue; // bottom-left + case 0b0001: e0 = 0b0101, x = this.xmin, y = this.ymin; break; // left + } + if ((P[j] !== x || P[j + 1] !== y) && this.contains(i, x, y)) { + P.splice(j, 0, x, y), j += 2; + } + } + if (P.length > 4) { + for (let i = 0; i < P.length; i+= 2) { + const j = (i + 2) % P.length, k = (i + 4) % P.length; + if (P[i] === P[j] && P[j] === P[k] + || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) + P.splice(j, 2), i -= 2; + } + } + return j; + } + _project(x0, y0, vx, vy) { + let t = Infinity, c, x, y; + if (vy < 0) { // top + if (y0 <= this.ymin) return null; + if ((c = (this.ymin - y0) / vy) < t) y = this.ymin, x = x0 + (t = c) * vx; + } else if (vy > 0) { // bottom + if (y0 >= this.ymax) return null; + if ((c = (this.ymax - y0) / vy) < t) y = this.ymax, x = x0 + (t = c) * vx; + } + if (vx > 0) { // right + if (x0 >= this.xmax) return null; + if ((c = (this.xmax - x0) / vx) < t) x = this.xmax, y = y0 + (t = c) * vy; + } else if (vx < 0) { // left + if (x0 <= this.xmin) return null; + if ((c = (this.xmin - x0) / vx) < t) x = this.xmin, y = y0 + (t = c) * vy; + } + return [x, y]; + } + _edgecode(x, y) { + return (x === this.xmin ? 0b0001 + : x === this.xmax ? 0b0010 : 0b0000) + | (y === this.ymin ? 0b0100 + : y === this.ymax ? 0b1000 : 0b0000); + } + _regioncode(x, y) { + return (x < this.xmin ? 0b0001 + : x > this.xmax ? 0b0010 : 0b0000) + | (y < this.ymin ? 0b0100 + : y > this.ymax ? 0b1000 : 0b0000); + } +} + +const tau$2 = 2 * Math.PI, pow$2 = Math.pow; + +function pointX(p) { + return p[0]; +} + +function pointY(p) { + return p[1]; +} + +// A triangulation is collinear if all its triangles have a non-null area +function collinear(d) { + const {triangles, coords} = d; + for (let i = 0; i < triangles.length; i += 3) { + const a = 2 * triangles[i], + b = 2 * triangles[i + 1], + c = 2 * triangles[i + 2], + cross = (coords[c] - coords[a]) * (coords[b + 1] - coords[a + 1]) + - (coords[b] - coords[a]) * (coords[c + 1] - coords[a + 1]); + if (cross > 1e-10) return false; + } + return true; +} + +function jitter(x, y, r) { + return [x + Math.sin(x + y) * r, y + Math.cos(x - y) * r]; +} + +class Delaunay { + static from(points, fx = pointX, fy = pointY, that) { + return new Delaunay("length" in points + ? flatArray(points, fx, fy, that) + : Float64Array.from(flatIterable(points, fx, fy, that))); + } + constructor(points) { + this._delaunator = new Delaunator(points); + this.inedges = new Int32Array(points.length / 2); + this._hullIndex = new Int32Array(points.length / 2); + this.points = this._delaunator.coords; + this._init(); + } + update() { + this._delaunator.update(); + this._init(); + return this; + } + _init() { + const d = this._delaunator, points = this.points; + + // check for collinear + if (d.hull && d.hull.length > 2 && collinear(d)) { + this.collinear = Int32Array.from({length: points.length/2}, (_,i) => i) + .sort((i, j) => points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]); // for exact neighbors + const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], + bounds = [ points[2 * e], points[2 * e + 1], points[2 * f], points[2 * f + 1] ], + r = 1e-8 * Math.hypot(bounds[3] - bounds[1], bounds[2] - bounds[0]); + for (let i = 0, n = points.length / 2; i < n; ++i) { + const p = jitter(points[2 * i], points[2 * i + 1], r); + points[2 * i] = p[0]; + points[2 * i + 1] = p[1]; + } + this._delaunator = new Delaunator(points); + } else { + delete this.collinear; + } + + const halfedges = this.halfedges = this._delaunator.halfedges; + const hull = this.hull = this._delaunator.hull; + const triangles = this.triangles = this._delaunator.triangles; + const inedges = this.inedges.fill(-1); + const hullIndex = this._hullIndex.fill(-1); + + // Compute an index from each point to an (arbitrary) incoming halfedge + // Used to give the first neighbor of each point; for this reason, + // on the hull we give priority to exterior halfedges + for (let e = 0, n = halfedges.length; e < n; ++e) { + const p = triangles[e % 3 === 2 ? e - 2 : e + 1]; + if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e; + } + for (let i = 0, n = hull.length; i < n; ++i) { + hullIndex[hull[i]] = i; + } + + // degenerate case: 1 or 2 (distinct) points + if (hull.length <= 2 && hull.length > 0) { + this.triangles = new Int32Array(3).fill(-1); + this.halfedges = new Int32Array(3).fill(-1); + this.triangles[0] = hull[0]; + this.triangles[1] = hull[1]; + this.triangles[2] = hull[1]; + inedges[hull[0]] = 1; + if (hull.length === 2) inedges[hull[1]] = 0; + } + } + voronoi(bounds) { + return new Voronoi(this, bounds); + } + *neighbors(i) { + const {inedges, hull, _hullIndex, halfedges, triangles, collinear} = this; + + // degenerate case with several collinear points + if (collinear) { + const l = collinear.indexOf(i); + if (l > 0) yield collinear[l - 1]; + if (l < collinear.length - 1) yield collinear[l + 1]; + return; + } + + const e0 = inedges[i]; + if (e0 === -1) return; // coincident point + let e = e0, p0 = -1; + do { + yield p0 = triangles[e]; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) return; // bad triangulation + e = halfedges[e]; + if (e === -1) { + const p = hull[(_hullIndex[i] + 1) % hull.length]; + if (p !== p0) yield p; + return; + } + } while (e !== e0); + } + find(x, y, i = 0) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return -1; + const i0 = i; + let c; + while ((c = this._step(i, x, y)) >= 0 && c !== i && c !== i0) i = c; + return c; + } + _step(i, x, y) { + const {inedges, hull, _hullIndex, halfedges, triangles, points} = this; + if (inedges[i] === -1 || !points.length) return (i + 1) % (points.length >> 1); + let c = i; + let dc = pow$2(x - points[i * 2], 2) + pow$2(y - points[i * 2 + 1], 2); + const e0 = inedges[i]; + let e = e0; + do { + let t = triangles[e]; + const dt = pow$2(x - points[t * 2], 2) + pow$2(y - points[t * 2 + 1], 2); + if (dt < dc) dc = dt, c = t; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + if (e === -1) { + e = hull[(_hullIndex[i] + 1) % hull.length]; + if (e !== t) { + if (pow$2(x - points[e * 2], 2) + pow$2(y - points[e * 2 + 1], 2) < dc) return e; + } + break; + } + } while (e !== e0); + return c; + } + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {points, halfedges, triangles} = this; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = triangles[i] * 2; + const tj = triangles[j] * 2; + context.moveTo(points[ti], points[ti + 1]); + context.lineTo(points[tj], points[tj + 1]); + } + this.renderHull(context); + return buffer && buffer.value(); + } + renderPoints(context, r = 2) { + const buffer = context == null ? context = new Path : undefined; + const {points} = this; + for (let i = 0, n = points.length; i < n; i += 2) { + const x = points[i], y = points[i + 1]; + context.moveTo(x + r, y); + context.arc(x, y, r, 0, tau$2); + } + return buffer && buffer.value(); + } + renderHull(context) { + const buffer = context == null ? context = new Path : undefined; + const {hull, points} = this; + const h = hull[0] * 2, n = hull.length; + context.moveTo(points[h], points[h + 1]); + for (let i = 1; i < n; ++i) { + const h = 2 * hull[i]; + context.lineTo(points[h], points[h + 1]); + } + context.closePath(); + return buffer && buffer.value(); + } + hullPolygon() { + const polygon = new Polygon; + this.renderHull(polygon); + return polygon.value(); + } + renderTriangle(i, context) { + const buffer = context == null ? context = new Path : undefined; + const {points, triangles} = this; + const t0 = triangles[i *= 3] * 2; + const t1 = triangles[i + 1] * 2; + const t2 = triangles[i + 2] * 2; + context.moveTo(points[t0], points[t0 + 1]); + context.lineTo(points[t1], points[t1 + 1]); + context.lineTo(points[t2], points[t2 + 1]); + context.closePath(); + return buffer && buffer.value(); + } + *trianglePolygons() { + const {triangles} = this; + for (let i = 0, n = triangles.length / 3; i < n; ++i) { + yield this.trianglePolygon(i); + } + } + trianglePolygon(i) { + const polygon = new Polygon; + this.renderTriangle(i, polygon); + return polygon.value(); + } +} + +function flatArray(points, fx, fy, that) { + const n = points.length; + const array = new Float64Array(n * 2); + for (let i = 0; i < n; ++i) { + const p = points[i]; + array[i * 2] = fx.call(that, p, i, points); + array[i * 2 + 1] = fy.call(that, p, i, points); + } + return array; +} + +function* flatIterable(points, fx, fy, that) { + let i = 0; + for (const p of points) { + yield fx.call(that, p, i, points); + yield fy.call(that, p, i, points); + ++i; + } +} + +var EOL = {}, + EOF = {}, + QUOTE = 34, + NEWLINE = 10, + RETURN = 13; + +function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "] || \"\""; + }).join(",") + "}"); +} + +function customConverter(columns, f) { + var object = objectConverter(columns); + return function(row, i) { + return f(object(row), i, columns); + }; +} + +// Compute unique columns in order of discovery. +function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; + + rows.forEach(function(row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); + + return columns; +} + +function pad$1(value, width) { + var s = value + "", length = s.length; + return length < width ? new Array(width - length + 1).join(0) + s : s; +} + +function formatYear$1(year) { + return year < 0 ? "-" + pad$1(-year, 6) + : year > 9999 ? "+" + pad$1(year, 6) + : pad$1(year, 4); +} + +function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear$1(date.getUTCFullYear()) + "-" + pad$1(date.getUTCMonth() + 1, 2) + "-" + pad$1(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad$1(hours, 2) + ":" + pad$1(minutes, 2) + ":" + pad$1(seconds, 2) + "." + pad$1(milliseconds, 3) + "Z" + : seconds ? "T" + pad$1(hours, 2) + ":" + pad$1(minutes, 2) + ":" + pad$1(seconds, 2) + "Z" + : minutes || hours ? "T" + pad$1(hours, 2) + ":" + pad$1(minutes, 2) + "Z" + : ""); +} + +function dsvFormat(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function(row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns || []; + return rows; + } + + function parseRows(text, f) { + var rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? + + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) --N; + if (text.charCodeAt(N - 1) === RETURN) --N; + + function token() { + if (eof) return EOF; + if (eol) return eol = false, EOL; + + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE); + if ((i = I) >= N) eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } + + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + else if (c !== DELIMITER) continue; + return text.slice(j, i); + } + + // Return last token before EOF. + return eof = true, text.slice(j, N); + } + + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) continue; + rows.push(row); + } + + return rows; + } + + function preformatBody(rows, columns) { + return rows.map(function(row) { + return columns.map(function(column) { + return formatValue(row[column]); + }).join(delimiter); + }); + } + + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); + } + + function formatBody(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows, + formatRow: formatRow, + formatValue: formatValue + }; +} + +var csv$1 = dsvFormat(","); + +var csvParse = csv$1.parse; +var csvParseRows = csv$1.parseRows; +var csvFormat = csv$1.format; +var csvFormatBody = csv$1.formatBody; +var csvFormatRows = csv$1.formatRows; +var csvFormatRow = csv$1.formatRow; +var csvFormatValue = csv$1.formatValue; + +var tsv$1 = dsvFormat("\t"); + +var tsvParse = tsv$1.parse; +var tsvParseRows = tsv$1.parseRows; +var tsvFormat = tsv$1.format; +var tsvFormatBody = tsv$1.formatBody; +var tsvFormatRows = tsv$1.formatRows; +var tsvFormatRow = tsv$1.formatRow; +var tsvFormatValue = tsv$1.formatValue; + +function autoType(object) { + for (var key in object) { + var value = object[key].trim(), number, m; + if (!value) value = null; + else if (value === "true") value = true; + else if (value === "false") value = false; + else if (value === "NaN") value = NaN; + else if (!isNaN(number = +value)) value = number; + else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { + if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); + value = new Date(value); + } + else continue; + object[key] = value; + } + return object; +} + +// https://github.com/d3/d3-dsv/issues/45 +const fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); + +function responseBlob(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.blob(); +} + +function blob(input, init) { + return fetch(input, init).then(responseBlob); +} + +function responseArrayBuffer(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); +} + +function buffer(input, init) { + return fetch(input, init).then(responseArrayBuffer); +} + +function responseText(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.text(); +} + +function text(input, init) { + return fetch(input, init).then(responseText); +} + +function dsvParse(parse) { + return function(input, init, row) { + if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; + return text(input, init).then(function(response) { + return parse(response, row); + }); + }; +} + +function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; + var format = dsvFormat(delimiter); + return text(input, init).then(function(response) { + return format.parse(response, row); + }); +} + +var csv = dsvParse(csvParse); +var tsv = dsvParse(tsvParse); + +function image(input, init) { + return new Promise(function(resolve, reject) { + var image = new Image; + for (var key in init) image[key] = init[key]; + image.onerror = reject; + image.onload = function() { resolve(image); }; + image.src = input; + }); +} + +function responseJson(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + if (response.status === 204 || response.status === 205) return; + return response.json(); +} + +function json(input, init) { + return fetch(input, init).then(responseJson); +} + +function parser(type) { + return (input, init) => text(input, init) + .then(text => (new DOMParser).parseFromString(text, type)); +} + +var xml = parser("application/xml"); + +var html = parser("text/html"); + +var svg = parser("image/svg+xml"); + +function center(x, y) { + var nodes, strength = 1; + + if (x == null) x = 0; + if (y == null) y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + + force.initialize = function(_) { + nodes = _; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + return force; +} + +function tree_add(d) { + const x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); +} + +function add(tree, x, y, d) { + if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points + + var parent, + node = tree._root, + leaf = {data: d}, + x0 = tree._x0, + y0 = tree._y0, + x1 = tree._x1, + y1 = tree._y1, + xm, + ym, + xp, + yp, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return tree._root = leaf, tree; + + // Find the existing leaf for the new point, or add it. + while (node.length) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; + } + + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; +} + +function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; + + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; + xz[i] = x; + yz[i] = y; + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; + } + + // If there were no (valid) points, abort. + if (x0 > x1 || y0 > y1) return this; + + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); + + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + + return this; +} + +function tree_cover(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points + + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; + + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } + + // Otherwise, double repeatedly to cover. + else { + var z = x1 - x0 || 1, + node = this._root, + parent, + i; + + while (x0 > x || x >= x1 || y0 > y || y >= y1) { + i = (y < y0) << 1 | (x < x0); + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: x1 = x0 + z, y1 = y0 + z; break; + case 1: x0 = x1 - z, y1 = y0 + z; break; + case 2: x1 = x0 + z, y0 = y1 - z; break; + case 3: x0 = x1 - z, y0 = y1 - z; break; + } + } + + if (this._root && this._root.length) this._root = node; + } + + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; +} + +function tree_data() { + var data = []; + this.visit(function(node) { + if (!node.length) do data.push(node.data); while (node = node.next) + }); + return data; +} + +function tree_extent(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; +} + +function Quad(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; +} + +function tree_find(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; + + if (node) quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; + } + + while (q = quads.pop()) { + + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) continue; + + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; + + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); + + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } + + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } + + return data; +} + +function tree_remove(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points + + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; + } + + // Find the point to remove. + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; + + // If there are multiple coincident points, remove just the point. + if (previous) return (next ? previous.next = next : delete previous.next), this; + + // If this is the root point, remove it. + if (!parent) return this._root = next, this; + + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; + } + + return this; +} + +function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; +} + +function tree_root() { + return this._root; +} + +function tree_size() { + var size = 0; + this.visit(function(node) { + if (!node.length) do ++size; while (node = node.next) + }); + return size; +} + +function tree_visit(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; +} + +function tree_visitAfter(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; +} + +function defaultX(d) { + return d[0]; +} + +function tree_x(_) { + return arguments.length ? (this._x = _, this) : this._x; +} + +function defaultY(d) { + return d[1]; +} + +function tree_y(_) { + return arguments.length ? (this._y = _, this) : this._y; +} + +function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); +} + +function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; +} + +function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) next = next.next = {data: leaf.data}; + return copy; +} + +var treeProto = quadtree.prototype = Quadtree.prototype; + +treeProto.copy = function() { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; + + if (!node) return copy; + + if (!node.length) return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); + else node.target[i] = leaf_copy(child); + } + } + } + + return copy; +}; + +treeProto.add = tree_add; +treeProto.addAll = addAll; +treeProto.cover = tree_cover; +treeProto.data = tree_data; +treeProto.extent = tree_extent; +treeProto.find = tree_find; +treeProto.remove = tree_remove; +treeProto.removeAll = removeAll; +treeProto.root = tree_root; +treeProto.size = tree_size; +treeProto.visit = tree_visit; +treeProto.visitAfter = tree_visitAfter; +treeProto.x = tree_x; +treeProto.y = tree_y; + +function constant$4(x) { + return function() { + return x; + }; +} + +function jiggle(random) { + return (random() - 0.5) * 1e-6; +} + +function x$3(d) { + return d.x + d.vx; +} + +function y$3(d) { + return d.y + d.vy; +} + +function collide(radius) { + var nodes, + radii, + random, + strength = 1, + iterations = 1; + + if (typeof radius !== "function") radius = constant$4(radius == null ? 1 : +radius); + + function force() { + var i, n = nodes.length, + tree, + node, + xi, + yi, + ri, + ri2; + + for (var k = 0; k < iterations; ++k) { + tree = quadtree(nodes, x$3, y$3).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); + } + } + + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > node.index) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + + function prepare(quad) { + if (quad.data) return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : radius; + }; + + return force; +} + +function index$3(d) { + return d.index; +} + +function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("node not found: " + nodeId); + return node; +} + +function link$2(links) { + var id = index$3, + strength = defaultStrength, + strengths, + distance = constant$4(30), + distances, + nodes, + count, + bias, + random, + iterations = 1; + + if (links == null) links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(random); + y = target.y + target.vy - source.y - source.vy || jiggle(random); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; + } + } + } + + function initialize() { + if (!nodes) return; + + var i, + n = nodes.length, + m = links.length, + nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } + + function initializeStrength() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + + function initializeDistance() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + + force.links = function(_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + + force.id = function(_) { + return arguments.length ? (id = _, force) : id; + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), initializeStrength(), force) : strength; + }; + + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant$4(+_), initializeDistance(), force) : distance; + }; + + return force; +} + +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const a$1 = 1664525; +const c$3 = 1013904223; +const m = 4294967296; // 2^32 + +function lcg$1() { + let s = 1; + return () => (s = (a$1 * s + c$3) % m) / m; +} + +function x$2(d) { + return d.x; +} + +function y$2(d) { + return d.y; +} + +var initialRadius = 10, + initialAngle = Math.PI * (3 - Math.sqrt(5)); + +function simulation(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = new Map(), + stepper = timer(step), + event = dispatch("tick", "end"), + random = lcg$1(); + + if (nodes == null) nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick(iterations) { + var i, n = nodes.length, node; + + if (iterations === undefined) iterations = 1; + + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.forEach(function(force) { + force(alpha); + }); + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } + + return simulation; + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) node.x = node.fx; + if (node.fy != null) node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + + function initializeForce(force) { + if (force.initialize) force.initialize(nodes, random); + return force; + } + + initializeNodes(); + + return simulation = { + tick: tick, + + restart: function() { + return stepper.restart(step), simulation; + }, + + stop: function() { + return stepper.stop(), simulation; + }, + + nodes: function(_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes; + }, + + alpha: function(_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function(_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function(_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function(_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function(_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + randomSource: function(_) { + return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random; + }, + + force: function(name, _) { + return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function(x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) radius = Infinity; + else radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + + return closest; + }, + + on: function(name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; +} + +function manyBody() { + var nodes, + node, + random, + alpha, + strength = constant$4(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = quadtree(nodes, x$2, y$2).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, weight = 0, x, y, i; + + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x = y = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = Math.abs(q.value))) { + strength += q.value, weight += c, x += c * q.x, y += c * q.y; + } + } + quad.x = x / weight; + quad.y = y / weight; + } + + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do strength += strengths[q.data.index]; + while (q = q.next); + } + + quad.value = strength; + } + + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + + var x = quad.x - node.x, + y = quad.y - node.y, + w = x2 - x1, + l = x * x + y * y; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x * quad.value * alpha / l; + node.vy += y * quad.value * alpha / l; + } + return true; + } + + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) return; + + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } + + do if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x * w; + node.vy += y * w; + } while (quad = quad.next); + } + + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : strength; + }; + + force.distanceMin = function(_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + + force.distanceMax = function(_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + + force.theta = function(_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + + return force; +} + +function radial$1(radius, x, y) { + var nodes, + strength = constant$4(0.1), + strengths, + radiuses; + + if (typeof radius !== "function") radius = constant$4(+radius); + if (x == null) x = 0; + if (y == null) y = 0; + + function force(alpha) { + for (var i = 0, n = nodes.length; i < n; ++i) { + var node = nodes[i], + dx = node.x - x || 1e-6, + dy = node.y - y || 1e-6, + r = Math.sqrt(dx * dx + dy * dy), + k = (radiuses[i] - r) * strengths[i] * alpha / r; + node.vx += dx * k; + node.vy += dy * k; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + radiuses = new Array(n); + for (i = 0; i < n; ++i) { + radiuses[i] = +radius(nodes[i], i, nodes); + strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _, initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : radius; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; +} + +function x$1(x) { + var strength = constant$4(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") x = constant$4(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : strength; + }; + + force.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : x; + }; + + return force; +} + +function y$1(y) { + var strength = constant$4(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") y = constant$4(y == null ? 0 : +y); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : strength; + }; + + force.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$4(+_), initialize(), force) : y; + }; + + return force; +} + +function formatDecimal(x) { + return Math.abs(x = Math.round(x)) >= 1e21 + ? x.toLocaleString("en").replace(/,/g, "") + : x.toString(10); +} + +// Computes the decimal coefficient and exponent of the specified number x with +// significant digits p, where x is positive and p is in [1, 21] or undefined. +// For example, formatDecimalParts(1.23) returns ["123", 0]. +function formatDecimalParts(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; +} + +function exponent(x) { + return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN; +} + +function formatGroup(grouping, thousands) { + return function(value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; +} + +function formatNumerals(numerals) { + return function(value) { + return value.replace(/[0-9]/g, function(i) { + return numerals[+i]; + }); + }; +} + +// [[fill]align][sign][symbol][0][width][,][.precision][~][type] +var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + +function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); +} + +formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + +function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; + this.align = specifier.align === undefined ? ">" : specifier.align + ""; + this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? "" : specifier.type + ""; +} + +FormatSpecifier.prototype.toString = function() { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + + (this.trim ? "~" : "") + + this.type; +}; + +// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. +function formatTrim(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": i0 = i1 = i; break; + case "0": if (i0 === 0) i0 = i; i1 = i; break; + default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; +} + +var prefixExponent; + +function formatPrefixAuto(x, p) { + var d = formatDecimalParts(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y! +} + +function formatRounded(x, p) { + var d = formatDecimalParts(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); +} + +var formatTypes = { + "%": (x, p) => (x * 100).toFixed(p), + "b": (x) => Math.round(x).toString(2), + "c": (x) => x + "", + "d": formatDecimal, + "e": (x, p) => x.toExponential(p), + "f": (x, p) => x.toFixed(p), + "g": (x, p) => x.toPrecision(p), + "o": (x) => Math.round(x).toString(8), + "p": (x, p) => formatRounded(x * 100, p), + "r": formatRounded, + "s": formatPrefixAuto, + "X": (x) => Math.round(x).toString(16).toUpperCase(), + "x": (x) => Math.round(x).toString(16) +}; + +function identity$6(x) { + return x; +} + +var map = Array.prototype.map, + prefixes = ["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"]; + +function formatLocale$1(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity$6 : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""), + currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", + currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", + decimal = locale.decimal === undefined ? "." : locale.decimal + "", + numerals = locale.numerals === undefined ? identity$6 : formatNumerals(map.call(locale.numerals, String)), + percent = locale.percent === undefined ? "%" : locale.percent + "", + minus = locale.minus === undefined ? "\u2212" : locale.minus + "", + nan = locale.nan === undefined ? "NaN" : locale.nan + ""; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + trim = specifier.trim, + type = specifier.type; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision === undefined ? 6 + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Determine the sign. -0 is not less than 0, but 1 / -0 is! + var valueNegative = value < 0 || 1 / value < 0; + + // Perform the initial formatting. + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + + // Trim insignificant zeros. + if (trim) value = formatTrim(value); + + // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign. + if (valueNegative && +value === 0 && sign !== "+") valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value†part that can be + // grouped, and fractional or exponential “suffix†part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": value = valuePrefix + value + valueSuffix + padding; break; + case "=": value = valuePrefix + padding + value + valueSuffix; break; + case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; + default: value = padding + valuePrefix + value + valueSuffix; break; + } + + return numerals(value); + } + + format.toString = function() { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function(value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; +} + +var locale$1; +exports.format = void 0; +exports.formatPrefix = void 0; + +defaultLocale$1({ + thousands: ",", + grouping: [3], + currency: ["$", ""] +}); + +function defaultLocale$1(definition) { + locale$1 = formatLocale$1(definition); + exports.format = locale$1.format; + exports.formatPrefix = locale$1.formatPrefix; + return locale$1; +} + +function precisionFixed(step) { + return Math.max(0, -exponent(Math.abs(step))); +} + +function precisionPrefix(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); +} + +function precisionRound(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent(max) - exponent(step)) + 1; +} + +var epsilon$1 = 1e-6; +var epsilon2 = 1e-12; +var pi$1 = Math.PI; +var halfPi$1 = pi$1 / 2; +var quarterPi = pi$1 / 4; +var tau$1 = pi$1 * 2; + +var degrees = 180 / pi$1; +var radians = pi$1 / 180; + +var abs$1 = Math.abs; +var atan = Math.atan; +var atan2$1 = Math.atan2; +var cos$1 = Math.cos; +var ceil = Math.ceil; +var exp = Math.exp; +var hypot = Math.hypot; +var log$1 = Math.log; +var pow$1 = Math.pow; +var sin$1 = Math.sin; +var sign$1 = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; +var sqrt$2 = Math.sqrt; +var tan = Math.tan; + +function acos$1(x) { + return x > 1 ? 0 : x < -1 ? pi$1 : Math.acos(x); +} + +function asin$1(x) { + return x > 1 ? halfPi$1 : x < -1 ? -halfPi$1 : Math.asin(x); +} + +function haversin(x) { + return (x = sin$1(x / 2)) * x; +} + +function noop$1() {} + +function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } +} + +var streamObjectType = { + Feature: function(object, stream) { + streamGeometry(object.geometry, stream); + }, + FeatureCollection: function(object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) streamGeometry(features[i].geometry, stream); + } +}; + +var streamGeometryType = { + Sphere: function(object, stream) { + stream.sphere(); + }, + Point: function(object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); + }, + LineString: function(object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamLine(coordinates[i], stream, 0); + }, + Polygon: function(object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamPolygon(coordinates[i], stream); + }, + GeometryCollection: function(object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) streamGeometry(geometries[i], stream); + } +}; + +function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); +} + +function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); +} + +function geoStream(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } +} + +var areaRingSum$1 = new Adder(); + +// hello? + +var areaSum$1 = new Adder(), + lambda00$2, + phi00$2, + lambda0$2, + cosPhi0$1, + sinPhi0$1; + +var areaStream$1 = { + point: noop$1, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: function() { + areaRingSum$1 = new Adder(); + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function() { + var areaRing = +areaRingSum$1; + areaSum$1.add(areaRing < 0 ? tau$1 + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop$1; + }, + sphere: function() { + areaSum$1.add(tau$1); + } +}; + +function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; +} + +function areaRingEnd$1() { + areaPoint$1(lambda00$2, phi00$2); +} + +function areaPointFirst$1(lambda, phi) { + areaStream$1.point = areaPoint$1; + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + lambda0$2 = lambda, cosPhi0$1 = cos$1(phi = phi / 2 + quarterPi), sinPhi0$1 = sin$1(phi); +} + +function areaPoint$1(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0$2, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos$1(phi), + sinPhi = sin$1(phi), + k = sinPhi0$1 * sinPhi, + u = cosPhi0$1 * cosPhi + k * cos$1(adLambda), + v = k * sdLambda * sin$1(adLambda); + areaRingSum$1.add(atan2$1(v, u)); + + // Advance the previous points. + lambda0$2 = lambda, cosPhi0$1 = cosPhi, sinPhi0$1 = sinPhi; +} + +function area$2(object) { + areaSum$1 = new Adder(); + geoStream(object, areaStream$1); + return areaSum$1 * 2; +} + +function spherical(cartesian) { + return [atan2$1(cartesian[1], cartesian[0]), asin$1(cartesian[2])]; +} + +function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi); + return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)]; +} + +function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} + +function cartesianCross(a, b) { + return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; +} + +// TODO return a +function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; +} + +function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; +} + +// TODO return d +function cartesianNormalizeInPlace(d) { + var l = sqrt$2(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; +} + +var lambda0$1, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00$1, phi00$1, // first point + p0, // previous 3D point + deltaSum, + ranges, + range; + +var boundsStream$1 = { + point: boundsPoint$1, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function() { + boundsStream$1.point = boundsRingPoint; + boundsStream$1.lineStart = boundsRingStart; + boundsStream$1.lineEnd = boundsRingEnd; + deltaSum = new Adder(); + areaStream$1.polygonStart(); + }, + polygonEnd: function() { + areaStream$1.polygonEnd(); + boundsStream$1.point = boundsPoint$1; + boundsStream$1.lineStart = boundsLineStart; + boundsStream$1.lineEnd = boundsLineEnd; + if (areaRingSum$1 < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon$1) phi1 = 90; + else if (deltaSum < -epsilon$1) phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + }, + sphere: function() { + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + } +}; + +function boundsPoint$1(lambda, phi) { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; +} + +function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees * sign, + phii, + antimeridian = abs$1(delta) > 180; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) lambda0$1 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + } + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; +} + +function boundsLineStart() { + boundsStream$1.point = linePoint; +} + +function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream$1.point = boundsPoint$1; + p0 = null; +} + +function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs$1(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; + } + areaStream$1.point(lambda, phi); + linePoint(lambda, phi); +} + +function boundsRingStart() { + areaStream$1.lineStart(); +} + +function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream$1.lineEnd(); + if (abs$1(deltaSum) > epsilon$1) lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[1] = lambda1; + p0 = null; +} + +// Finds the left-right distance between two longitudes. +// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want +// the distance between ±180° to be 360°. +function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; +} + +function rangeCompare(a, b) { + return a[0] - b[0]; +} + +function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; +} + +function bounds(feature) { + var i, n, a, b, merged, deltaMax, delta; + + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + geoStream(feature, boundsStream$1); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; + } + } + + ranges = range = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; +} + +var W0, W1, + X0$1, Y0$1, Z0$1, + X1$1, Y1$1, Z1$1, + X2$1, Y2$1, Z2$1, + lambda00, phi00, // first point + x0$4, y0$4, z0; // previous point + +var centroidStream$1 = { + sphere: noop$1, + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, + polygonStart: function() { + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; + }, + polygonEnd: function() { + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + } +}; + +// Arithmetic mean of Cartesian vectors. +function centroidPoint$1(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)); +} + +function centroidPointCartesian(x, y, z) { + ++W0; + X0$1 += (x - X0$1) / W0; + Y0$1 += (y - Y0$1) / W0; + Z0$1 += (z - Z0$1) / W0; +} + +function centroidLineStart$1() { + centroidStream$1.point = centroidLinePointFirst; +} + +function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + x0$4 = cosPhi * cos$1(lambda); + y0$4 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidStream$1.point = centroidLinePoint; + centroidPointCartesian(x0$4, y0$4, z0); +} + +function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + w = atan2$1(sqrt$2((w = y0$4 * z - z0 * y) * w + (w = z0 * x - x0$4 * z) * w + (w = x0$4 * y - y0$4 * x) * w), x0$4 * x + y0$4 * y + z0 * z); + W1 += w; + X1$1 += w * (x0$4 + (x0$4 = x)); + Y1$1 += w * (y0$4 + (y0$4 = y)); + Z1$1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0$4, y0$4, z0); +} + +function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; +} + +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). +function centroidRingStart$1() { + centroidStream$1.point = centroidRingPointFirst; +} + +function centroidRingEnd$1() { + centroidRingPoint(lambda00, phi00); + centroidStream$1.point = centroidPoint$1; +} + +function centroidRingPointFirst(lambda, phi) { + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + centroidStream$1.point = centroidRingPoint; + var cosPhi = cos$1(phi); + x0$4 = cosPhi * cos$1(lambda); + y0$4 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidPointCartesian(x0$4, y0$4, z0); +} + +function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + cx = y0$4 * z - z0 * y, + cy = z0 * x - x0$4 * z, + cz = x0$4 * y - y0$4 * x, + m = hypot(cx, cy, cz), + w = asin$1(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2$1.add(v * cx); + Y2$1.add(v * cy); + Z2$1.add(v * cz); + W1 += w; + X1$1 += w * (x0$4 + (x0$4 = x)); + Y1$1 += w * (y0$4 + (y0$4 = y)); + Z1$1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0$4, y0$4, z0); +} + +function centroid$1(object) { + W0 = W1 = + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = 0; + X2$1 = new Adder(); + Y2$1 = new Adder(); + Z2$1 = new Adder(); + geoStream(object, centroidStream$1); + + var x = +X2$1, + y = +Y2$1, + z = +Z2$1, + m = hypot(x, y, z); + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2) { + x = X1$1, y = Y1$1, z = Z1$1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon$1) x = X0$1, y = Y0$1, z = Z0$1; + m = hypot(x, y, z); + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2) return [NaN, NaN]; + } + + return [atan2$1(y, x) * degrees, asin$1(z / m) * degrees]; +} + +function constant$3(x) { + return function() { + return x; + }; +} + +function compose(a, b) { + + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + + return compose; +} + +function rotationIdentity(lambda, phi) { + return [abs$1(lambda) > pi$1 ? lambda + Math.round(-lambda / tau$1) * tau$1 : lambda, phi]; +} + +rotationIdentity.invert = rotationIdentity; + +function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau$1) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); +} + +function forwardRotationLambda(deltaLambda) { + return function(lambda, phi) { + return lambda += deltaLambda, [lambda > pi$1 ? lambda - tau$1 : lambda < -pi$1 ? lambda + tau$1 : lambda, phi]; + }; +} + +function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; +} + +function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos$1(deltaPhi), + sinDeltaPhi = sin$1(deltaPhi), + cosDeltaGamma = cos$1(deltaGamma), + sinDeltaGamma = sin$1(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2$1(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin$1(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2$1(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin$1(k * cosDeltaPhi - x * sinDeltaPhi) + ]; + }; + + return rotation; +} + +function rotation(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + } + + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + }; + + return forward; +} + +// Generates a circle centered at [0°, 0°], with a given radius and precision. +function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos$1(radius), + sinRadius = sin$1(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau$1; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$1; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]); + stream.point(point[0], point[1]); + } +} + +// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. +function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos$1(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau$1 - epsilon$1) % tau$1; +} + +function circle$2() { + var center = constant$3([0, 0]), + radius = constant$3(90), + precision = constant$3(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees, x[1] *= degrees; + } + + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } + + circle.center = function(_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant$3([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$3(+_), circle) : radius; + }; + + circle.precision = function(_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant$3(+_), circle) : precision; + }; + + return circle; +} + +function clipBuffer() { + var lines = [], + line; + return { + point: function(x, y, m) { + line.push([x, y, m]); + }, + lineStart: function() { + lines.push(line = []); + }, + lineEnd: noop$1, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function() { + var result = lines; + lines = []; + line = null; + return result; + } + }; +} + +function pointEqual(a, b) { + return abs$1(a[0] - b[0]) < epsilon$1 && abs$1(a[1] - b[1]) < epsilon$1; +} + +function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous +} + +// A generalized polygon clipping algorithm: given a polygon that has been cut +// into its visible line segments, and rejoins the segments by interpolating +// along the clip edge. +function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n], x; + + if (pointEqual(p0, p1)) { + if (!p0[2] && !p1[2]) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + // handle degenerate cases by moving the point + p1[0] += 2 * epsilon$1; + } + + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + + if (!subject.length) return; + + clip.sort(compareIntersection); + link$1(subject); + link$1(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; + } + + var start = subject[0], + points, + point; + + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); + } +} + +function link$1(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; +} + +function longitude(point) { + if (abs$1(point[0]) <= pi$1) + return point[0]; + else + return sign$1(point[0]) * ((abs$1(point[0]) + pi$1) % tau$1 - pi$1); +} + +function polygonContains(polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin$1(phi), + normal = [sin$1(lambda), -cos$1(lambda), 0], + angle = 0, + winding = 0; + + var sum = new Adder(); + + if (sinPhi === 1) phi = halfPi$1 + epsilon$1; + else if (sinPhi === -1) phi = -halfPi$1 - epsilon$1; + + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin$1(phi0), + cosPhi0 = cos$1(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin$1(phi1), + cosPhi1 = cos$1(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi$1, + k = sinPhi0 * sinPhi1; + + sum.add(atan2$1(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta))); + angle += antimeridian ? delta + sign * tau$1 : delta; + + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin$1(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } + + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. + + return (angle < -epsilon$1 || angle < epsilon$1 && sum < -epsilon2) ^ (winding & 1); +} + +function clip(pointVisible, clipLine, interpolate, start) { + return function(sink) { + var line = clipLine(sink), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = merge(segments); + var startInside = polygonContains(polygon, start); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipRejoin(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function() { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; + + function point(lambda, phi) { + if (pointVisible(lambda, phi)) sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + line.point(lambda, phi); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } + + function ringStart() { + ringSink.lineStart(); + ring = []; + } + + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; + + ring.pop(); + polygon.push(ring); + ring = null; + + if (!n) return; + + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } + + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; +} + +function validSegment(segment) { + return segment.length > 1; +} + +// Intersections are sorted along the clip edge. For both antimeridian cutting +// and circle clipping, the same comparison is used. +function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi$1 - epsilon$1 : halfPi$1 - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi$1 - epsilon$1 : halfPi$1 - b[1]); +} + +var clipAntimeridian = clip( + function() { return true; }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi$1, -halfPi$1] +); + +// Takes a line and cuts into visible segments. Return values: 0 - there were +// intersections or the line was empty; 1 - no intersections; 2 - there were +// intersections, and the first and last segments should be rejoined. +function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections + + return { + lineStart: function() { + stream.lineStart(); + clean = 1; + }, + point: function(lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi$1 : -pi$1, + delta = abs$1(lambda1 - lambda0); + if (abs$1(delta - pi$1) < epsilon$1) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$1 : -halfPi$1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi$1) { // line crosses antimeridian + if (abs$1(lambda0 - sign0) < epsilon$1) lambda0 -= sign0 * epsilon$1; // handle degeneracies + if (abs$1(lambda1 - sign1) < epsilon$1) lambda1 -= sign1 * epsilon$1; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function() { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function() { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; +} + +function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin$1(lambda0 - lambda1); + return abs$1(sinLambda0Lambda1) > epsilon$1 + ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1) + - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; +} + +function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi$1; + stream.point(-pi$1, phi); + stream.point(0, phi); + stream.point(pi$1, phi); + stream.point(pi$1, 0); + stream.point(pi$1, -phi); + stream.point(0, -phi); + stream.point(-pi$1, -phi); + stream.point(-pi$1, 0); + stream.point(-pi$1, phi); + } else if (abs$1(from[0] - to[0]) > epsilon$1) { + var lambda = from[0] < to[0] ? pi$1 : -pi$1; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } +} + +function clipCircle(radius) { + var cr = cos$1(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs$1(cr) > epsilon$1; // TODO optimise for this common case + + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + + function visible(lambda, phi) { + return cos$1(lambda) * cos$1(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi$1 : -pi$1), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) + point1[2] = 1; + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1], 2); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1], 3); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function() { + return clean | ((v00 && v0) << 1); + } + }; + } + + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); + + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; + + // Two polar points. + if (!determinant) return !two && a; + + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); + + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + + if (t2 < 0) return; + + var t = sqrt$2(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + + if (!two) return q; + + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + + var delta = lambda1 - lambda0, + polar = abs$1(delta - pi$1) < epsilon$1, + meridian = polar || delta < epsilon$1; + + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs$1(q[0] - lambda0) < epsilon$1 ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi$1 ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi$1 - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$1, radius - pi$1]); +} + +function clipLine(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; +} + +var clipMax = 1e9, clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + +function clipRectangle(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } + + function corner(p, direction) { + return abs$1(p[0] - x0) < epsilon$1 ? direction > 0 ? 0 : 3 + : abs$1(p[0] - x1) < epsilon$1 ? direction > 0 ? 2 : 1 + : abs$1(p[1] - y0) < epsilon$1 ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } + + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } + + return function(stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; + + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; + + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } + + function polygonInside() { + var winding = 0; + + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; } + else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; } + } + } + + return winding; + } + + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } + + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipRejoin(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); + } + activeStream = stream, segments = polygon = ring = null; + } + + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } + + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + + return clipStream; + }; +} + +function extent() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function(_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } + }; +} + +var lengthSum$1, + lambda0, + sinPhi0, + cosPhi0; + +var lengthStream$1 = { + sphere: noop$1, + point: noop$1, + lineStart: lengthLineStart, + lineEnd: noop$1, + polygonStart: noop$1, + polygonEnd: noop$1 +}; + +function lengthLineStart() { + lengthStream$1.point = lengthPointFirst$1; + lengthStream$1.lineEnd = lengthLineEnd; +} + +function lengthLineEnd() { + lengthStream$1.point = lengthStream$1.lineEnd = noop$1; +} + +function lengthPointFirst$1(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0 = lambda, sinPhi0 = sin$1(phi), cosPhi0 = cos$1(phi); + lengthStream$1.point = lengthPoint$1; +} + +function lengthPoint$1(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin$1(phi), + cosPhi = cos$1(phi), + delta = abs$1(lambda - lambda0), + cosDelta = cos$1(delta), + sinDelta = sin$1(delta), + x = cosPhi * sinDelta, + y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta, + z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta; + lengthSum$1.add(atan2$1(sqrt$2(x * x + y * y), z)); + lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi; +} + +function length$1(object) { + lengthSum$1 = new Adder(); + geoStream(object, lengthStream$1); + return +lengthSum$1; +} + +var coordinates = [null, null], + object = {type: "LineString", coordinates: coordinates}; + +function distance(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length$1(object); +} + +var containsObjectType = { + Feature: function(object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function(object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; + return false; + } +}; + +var containsGeometryType = { + Sphere: function() { + return true; + }, + Point: function(object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPoint(coordinates[i], point)) return true; + return false; + }, + LineString: function(object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsLine(coordinates[i], point)) return true; + return false; + }, + Polygon: function(object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPolygon(coordinates[i], point)) return true; + return false; + }, + GeometryCollection: function(object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) if (containsGeometry(geometries[i], point)) return true; + return false; + } +}; + +function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; +} + +function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; +} + +function containsLine(coordinates, point) { + var ao, bo, ab; + for (var i = 0, n = coordinates.length; i < n; i++) { + bo = distance(coordinates[i], point); + if (bo === 0) return true; + if (i > 0) { + ab = distance(coordinates[i], coordinates[i - 1]); + if ( + ab > 0 && + ao <= ab && + bo <= ab && + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab + ) + return true; + } + ao = bo; + } + return false; +} + +function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); +} + +function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; +} + +function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; +} + +function contains$1(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); +} + +function graticuleX(y0, y1, dy) { + var y = sequence(y0, y1 - epsilon$1, dy).concat(y1); + return function(x) { return y.map(function(y) { return [x, y]; }); }; +} + +function graticuleY(x0, x1, dx) { + var x = sequence(x0, x1 - epsilon$1, dx).concat(x1); + return function(y) { return x.map(function(x) { return [x, y]; }); }; +} + +function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; + + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; + } + + function lines() { + return sequence(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(sequence(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(sequence(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs$1(x % DX) > epsilon$1; }).map(x)) + .concat(sequence(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs$1(y % DY) > epsilon$1; }).map(y)); + } + + graticule.lines = function() { + return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; }); + }; + + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; + + graticule.extent = function(_) { + if (!arguments.length) return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; + + graticule.extentMajor = function(_) { + if (!arguments.length) return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + + graticule.extentMinor = function(_) { + if (!arguments.length) return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + + graticule.step = function(_) { + if (!arguments.length) return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; + + graticule.stepMajor = function(_) { + if (!arguments.length) return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + + graticule.stepMinor = function(_) { + if (!arguments.length) return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; + + return graticule + .extentMajor([[-180, -90 + epsilon$1], [180, 90 - epsilon$1]]) + .extentMinor([[-180, -80 - epsilon$1], [180, 80 + epsilon$1]]); +} + +function graticule10() { + return graticule()(); +} + +function interpolate(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos$1(y0), + sy0 = sin$1(y0), + cy1 = cos$1(y1), + sy1 = sin$1(y1), + kx0 = cy0 * cos$1(x0), + ky0 = cy0 * sin$1(x0), + kx1 = cy1 * cos$1(x1), + ky1 = cy1 * sin$1(x1), + d = 2 * asin$1(sqrt$2(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin$1(d); + + var interpolate = d ? function(t) { + var B = sin$1(t *= d) / k, + A = sin$1(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2$1(y, x) * degrees, + atan2$1(z, sqrt$2(x * x + y * y)) * degrees + ]; + } : function() { + return [x0 * degrees, y0 * degrees]; + }; + + interpolate.distance = d; + + return interpolate; +} + +var identity$5 = x => x; + +var areaSum = new Adder(), + areaRingSum = new Adder(), + x00$2, + y00$2, + x0$3, + y0$3; + +var areaStream = { + point: noop$1, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: function() { + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function() { + areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop$1; + areaSum.add(abs$1(areaRingSum)); + areaRingSum = new Adder(); + }, + result: function() { + var area = areaSum / 2; + areaSum = new Adder(); + return area; + } +}; + +function areaRingStart() { + areaStream.point = areaPointFirst; +} + +function areaPointFirst(x, y) { + areaStream.point = areaPoint; + x00$2 = x0$3 = x, y00$2 = y0$3 = y; +} + +function areaPoint(x, y) { + areaRingSum.add(y0$3 * x - x0$3 * y); + x0$3 = x, y0$3 = y; +} + +function areaRingEnd() { + areaPoint(x00$2, y00$2); +} + +var x0$2 = Infinity, + y0$2 = x0$2, + x1 = -x0$2, + y1 = x1; + +var boundsStream = { + point: boundsPoint, + lineStart: noop$1, + lineEnd: noop$1, + polygonStart: noop$1, + polygonEnd: noop$1, + result: function() { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } +}; + +function boundsPoint(x, y) { + if (x < x0$2) x0$2 = x; + if (x > x1) x1 = x; + if (y < y0$2) y0$2 = y; + if (y > y1) y1 = y; +} + +// TODO Enforce positive area for exterior, negative area for interior? + +var X0 = 0, + Y0 = 0, + Z0 = 0, + X1 = 0, + Y1 = 0, + Z1 = 0, + X2 = 0, + Y2 = 0, + Z2 = 0, + x00$1, + y00$1, + x0$1, + y0$1; + +var centroidStream = { + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function() { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function() { + centroidStream.point = centroidPoint; + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + }, + result: function() { + var centroid = Z2 ? [X2 / Z2, Y2 / Z2] + : Z1 ? [X1 / Z1, Y1 / Z1] + : Z0 ? [X0 / Z0, Y0 / Z0] + : [NaN, NaN]; + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; + return centroid; + } +}; + +function centroidPoint(x, y) { + X0 += x; + Y0 += y; + ++Z0; +} + +function centroidLineStart() { + centroidStream.point = centroidPointFirstLine; +} + +function centroidPointFirstLine(x, y) { + centroidStream.point = centroidPointLine; + centroidPoint(x0$1 = x, y0$1 = y); +} + +function centroidPointLine(x, y) { + var dx = x - x0$1, dy = y - y0$1, z = sqrt$2(dx * dx + dy * dy); + X1 += z * (x0$1 + x) / 2; + Y1 += z * (y0$1 + y) / 2; + Z1 += z; + centroidPoint(x0$1 = x, y0$1 = y); +} + +function centroidLineEnd() { + centroidStream.point = centroidPoint; +} + +function centroidRingStart() { + centroidStream.point = centroidPointFirstRing; +} + +function centroidRingEnd() { + centroidPointRing(x00$1, y00$1); +} + +function centroidPointFirstRing(x, y) { + centroidStream.point = centroidPointRing; + centroidPoint(x00$1 = x0$1 = x, y00$1 = y0$1 = y); +} + +function centroidPointRing(x, y) { + var dx = x - x0$1, + dy = y - y0$1, + z = sqrt$2(dx * dx + dy * dy); + + X1 += z * (x0$1 + x) / 2; + Y1 += z * (y0$1 + y) / 2; + Z1 += z; + + z = y0$1 * x - x0$1 * y; + X2 += z * (x0$1 + x); + Y2 += z * (y0$1 + y); + Z2 += z * 3; + centroidPoint(x0$1 = x, y0$1 = y); +} + +function PathContext(context) { + this._context = context; +} + +PathContext.prototype = { + _radius: 4.5, + pointRadius: function(_) { + return this._radius = _, this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: { + this._context.lineTo(x, y); + break; + } + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau$1); + break; + } + } + }, + result: noop$1 +}; + +var lengthSum = new Adder(), + lengthRing, + x00, + y00, + x0, + y0; + +var lengthStream = { + point: noop$1, + lineStart: function() { + lengthStream.point = lengthPointFirst; + }, + lineEnd: function() { + if (lengthRing) lengthPoint(x00, y00); + lengthStream.point = noop$1; + }, + polygonStart: function() { + lengthRing = true; + }, + polygonEnd: function() { + lengthRing = null; + }, + result: function() { + var length = +lengthSum; + lengthSum = new Adder(); + return length; + } +}; + +function lengthPointFirst(x, y) { + lengthStream.point = lengthPoint; + x00 = x0 = x, y00 = y0 = y; +} + +function lengthPoint(x, y) { + x0 -= x, y0 -= y; + lengthSum.add(sqrt$2(x0 * x0 + y0 * y0)); + x0 = x, y0 = y; +} + +function PathString() { + this._string = []; +} + +PathString.prototype = { + _radius: 4.5, + _circle: circle$1(4.5), + pointRadius: function(_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + if (this._circle == null) this._circle = circle$1(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function() { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } +}; + +function circle$1(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; +} + +function index$2(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; + + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + geoStream(object, projectionStream(contextStream)); + } + return contextStream.result(); + } + + path.area = function(object) { + geoStream(object, projectionStream(areaStream)); + return areaStream.result(); + }; + + path.measure = function(object) { + geoStream(object, projectionStream(lengthStream)); + return lengthStream.result(); + }; + + path.bounds = function(object) { + geoStream(object, projectionStream(boundsStream)); + return boundsStream.result(); + }; + + path.centroid = function(object) { + geoStream(object, projectionStream(centroidStream)); + return centroidStream.result(); + }; + + path.projection = function(_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$5) : (projection = _).stream, path) : projection; + }; + + path.context = function(_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; + + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + + return path.projection(projection).context(context); +} + +function transform$1(methods) { + return { + stream: transformer$3(methods) + }; +} + +function transformer$3(methods) { + return function(stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; + }; +} + +function TransformStream() {} + +TransformStream.prototype = { + constructor: TransformStream, + point: function(x, y) { this.stream.point(x, y); }, + sphere: function() { this.stream.sphere(); }, + lineStart: function() { this.stream.lineStart(); }, + lineEnd: function() { this.stream.lineEnd(); }, + polygonStart: function() { this.stream.polygonStart(); }, + polygonEnd: function() { this.stream.polygonEnd(); } +}; + +function fit(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) projection.clipExtent(null); + geoStream(object, projection.stream(boundsStream)); + fitBounds(boundsStream.result()); + if (clip != null) projection.clipExtent(clip); + return projection; +} + +function fitExtent(projection, extent, object) { + return fit(projection, function(b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); +} + +function fitWidth(projection, width, object) { + return fit(projection, function(b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +function fitHeight(projection, height, object) { + return fit(projection, function(b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +var maxDepth = 16, // maximum depth of subdivision + cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance) + +function resample(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); +} + +function resampleNone(project) { + return transformer$3({ + point: function(x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); + } + }); +} + +function resample$1(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt$2(a * a + b * b + c * c), + phi2 = asin$1(c /= m), + lambda2 = abs$1(abs$1(c) - 1) < epsilon$1 || abs$1(lambda0 - lambda1) < epsilon$1 ? (lambda0 + lambda1) / 2 : atan2$1(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs$1((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); + } + } + } + return function(stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point + + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; }, + polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } + + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } + + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } + + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } + + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } + + return resampleStream; + }; +} + +var transformRadians = transformer$3({ + point: function(x, y) { + this.stream.point(x * radians, y * radians); + } +}); + +function transformRotate(rotate) { + return transformer$3({ + point: function(x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); + } + }); +} + +function scaleTranslate(k, dx, dy, sx, sy) { + function transform(x, y) { + x *= sx; y *= sy; + return [dx + k * x, dy - k * y]; + } + transform.invert = function(x, y) { + return [(x - dx) / k * sx, (dy - y) / k * sy]; + }; + return transform; +} + +function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { + if (!alpha) return scaleTranslate(k, dx, dy, sx, sy); + var cosAlpha = cos$1(alpha), + sinAlpha = sin$1(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; + function transform(x, y) { + x *= sx; y *= sy; + return [a * x - b * y + dx, dy - b * x - a * y]; + } + transform.invert = function(x, y) { + return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; + }; + return transform; +} + +function projection(project) { + return projectionMutator(function() { return project; })(); +} + +function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate + alpha = 0, // post-rotate angle + sx = 1, // reflectX + sy = 1, // reflectX + theta = null, preclip = clipAntimeridian, // pre-clip angle + x0 = null, y0, x1, y1, postclip = identity$5, // post-clip extent + delta2 = 0.5, // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; + + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); + } + + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees, point[1] * degrees]; + } + + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; + + projection.preclip = function(_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; + + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + + projection.clipAngle = function(_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; + }; + + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$5) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + projection.scale = function(_) { + return arguments.length ? (k = +_, recenter()) : k; + }; + + projection.translate = function(_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; + + projection.center = function(_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; + }; + + projection.rotate = function(_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; + }; + + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; + }; + + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; + }; + + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; + }; + + projection.precision = function(_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt$2(delta2); + }; + + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), + transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + return reset(); + } + + function reset() { + cache = cacheStream = null; + return projection; + } + + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); + }; +} + +function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi$1 / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function(_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees]; + }; + + return p; +} + +function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos$1(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin$1(phi) / cosPhi0]; + } + + forward.invert = function(x, y) { + return [x / cosPhi0, asin$1(y * cosPhi0)]; + }; + + return forward; +} + +function conicEqualAreaRaw(y0, y1) { + var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs$1(n) < epsilon$1) return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt$2(c) / n; + + function project(x, y) { + var r = sqrt$2(c - 2 * n * sin$1(y)) / n; + return [r * sin$1(x *= n), r0 - r * cos$1(x)]; + } + + project.invert = function(x, y) { + var r0y = r0 - y, + l = atan2$1(x, abs$1(r0y)) * sign$1(r0y); + if (r0y * n < 0) + l -= pi$1 * sign$1(x) * sign$1(r0y); + return [l / n, asin$1((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; +} + +function conicEqualArea() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); +} + +function albers() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); +} + +// The projections must have mutually exclusive clip regions on the sphere, +// as this will avoid emitting interleaving lines and polygons. +function multiplex(streams) { + var n = streams.length; + return { + point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); }, + sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); }, + lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); }, + lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); }, + polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); }, + polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); } + }; +} + +// A composite projection for the United States, configured by default for +// 960×500. The projection also works quite well at 960×600 if you change the +// scale to 1285 and adjust the translate accordingly. The set of standard +// parallels for each region comes from USGS, which is published here: +// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers +function albersUsa() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = {point: function(x, y) { point = [x, y]; }}; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); + } + + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); + }; + + albersUsa.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; + + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; + + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon$1, y + 0.120 * k + epsilon$1], [x - 0.214 * k - epsilon$1, y + 0.234 * k - epsilon$1]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon$1, y + 0.166 * k + epsilon$1], [x - 0.115 * k - epsilon$1, y + 0.234 * k - epsilon$1]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function(extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function(size, object) { + return fitSize(albersUsa, size, object); + }; + + albersUsa.fitWidth = function(width, object) { + return fitWidth(albersUsa, width, object); + }; + + albersUsa.fitHeight = function(height, object) { + return fitHeight(albersUsa, height, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); +} + +function azimuthalRaw(scale) { + return function(x, y) { + var cx = cos$1(x), + cy = cos$1(y), + k = scale(cx * cy); + if (k === Infinity) return [2, 0]; + return [ + k * cy * sin$1(x), + k * sin$1(y) + ]; + } +} + +function azimuthalInvert(angle) { + return function(x, y) { + var z = sqrt$2(x * x + y * y), + c = angle(z), + sc = sin$1(c), + cc = cos$1(c); + return [ + atan2$1(x * sc, z * cc), + asin$1(z && y * sc / z) + ]; + } +} + +var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { + return sqrt$2(2 / (1 + cxcy)); +}); + +azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) { + return 2 * asin$1(z / 2); +}); + +function azimuthalEqualArea() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); +} + +var azimuthalEquidistantRaw = azimuthalRaw(function(c) { + return (c = acos$1(c)) && c / sin$1(c); +}); + +azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) { + return z; +}); + +function azimuthalEquidistant() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); +} + +function mercatorRaw(lambda, phi) { + return [lambda, log$1(tan((halfPi$1 + phi) / 2))]; +} + +mercatorRaw.invert = function(x, y) { + return [x, 2 * atan(exp(y)) - halfPi$1]; +}; + +function mercator() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau$1); +} + +function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent + + m.scale = function(_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; + + m.translate = function(_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function(_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function(_) { + return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + function reclip() { + var k = pi$1 * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } + + return reclip(); +} + +function tany(y) { + return tan((halfPi$1 + y) / 2); +} + +function conicConformalRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : log$1(cy0 / cos$1(y1)) / log$1(tany(y1) / tany(y0)), + f = cy0 * pow$1(tany(y0), n) / n; + + if (!n) return mercatorRaw; + + function project(x, y) { + if (f > 0) { if (y < -halfPi$1 + epsilon$1) y = -halfPi$1 + epsilon$1; } + else { if (y > halfPi$1 - epsilon$1) y = halfPi$1 - epsilon$1; } + var r = f / pow$1(tany(y), n); + return [r * sin$1(n * x), f - r * cos$1(n * x)]; + } + + project.invert = function(x, y) { + var fy = f - y, r = sign$1(n) * sqrt$2(x * x + fy * fy), + l = atan2$1(x, abs$1(fy)) * sign$1(fy); + if (fy * n < 0) + l -= pi$1 * sign$1(x) * sign$1(fy); + return [l / n, 2 * atan(pow$1(f / r, 1 / n)) - halfPi$1]; + }; + + return project; +} + +function conicConformal() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); +} + +function equirectangularRaw(lambda, phi) { + return [lambda, phi]; +} + +equirectangularRaw.invert = equirectangularRaw; + +function equirectangular() { + return projection(equirectangularRaw) + .scale(152.63); +} + +function conicEquidistantRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs$1(n) < epsilon$1) return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin$1(nx), g - gy * cos$1(nx)]; + } + + project.invert = function(x, y) { + var gy = g - y, + l = atan2$1(x, abs$1(gy)) * sign$1(gy); + if (gy * n < 0) + l -= pi$1 * sign$1(x) * sign$1(gy); + return [l / n, g - sign$1(n) * sqrt$2(x * x + gy * gy)]; + }; + + return project; +} + +function conicEquidistant() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); +} + +var A1 = 1.340264, + A2 = -0.081106, + A3 = 0.000893, + A4 = 0.003796, + M = sqrt$2(3) / 2, + iterations = 12; + +function equalEarthRaw(lambda, phi) { + var l = asin$1(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2; + return [ + lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), + l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) + ]; +} + +equalEarthRaw.invert = function(x, y) { + var l = y, l2 = l * l, l6 = l2 * l2 * l2; + for (var i = 0, delta, fy, fpy; i < iterations; ++i) { + fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; + fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); + l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; + if (abs$1(delta) < epsilon2) break; + } + return [ + M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l), + asin$1(sin$1(l) / M) + ]; +}; + +function equalEarth() { + return projection(equalEarthRaw) + .scale(177.158); +} + +function gnomonicRaw(x, y) { + var cy = cos$1(y), k = cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; +} + +gnomonicRaw.invert = azimuthalInvert(atan); + +function gnomonic() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); +} + +function identity$4() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, // scale, translate and reflect + alpha = 0, ca, sa, // angle + x0 = null, y0, x1, y1, // clip extent + kx = 1, ky = 1, + transform = transformer$3({ + point: function(x, y) { + var p = projection([x, y]); + this.stream.point(p[0], p[1]); + } + }), + postclip = identity$5, + cache, + cacheStream; + + function reset() { + kx = k * sx; + ky = k * sy; + cache = cacheStream = null; + return projection; + } + + function projection (p) { + var x = p[0] * kx, y = p[1] * ky; + if (alpha) { + var t = y * ca - x * sa; + x = x * ca + y * sa; + y = t; + } + return [x + tx, y + ty]; + } + projection.invert = function(p) { + var x = p[0] - tx, y = p[1] - ty; + if (alpha) { + var t = y * ca + x * sa; + x = x * ca - y * sa; + y = t; + } + return [x / kx, y / ky]; + }; + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }; + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$5) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + projection.scale = function(_) { + return arguments.length ? (k = +_, reset()) : k; + }; + projection.translate = function(_) { + return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; + }; + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, sa = sin$1(alpha), ca = cos$1(alpha), reset()) : alpha * degrees; + }; + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; + }; + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; + }; + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + return projection; +} + +function naturalEarth1Raw(lambda, phi) { + var phi2 = phi * phi, phi4 = phi2 * phi2; + return [ + lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), + phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) + ]; +} + +naturalEarth1Raw.invert = function(x, y) { + var phi = y, i = 25, delta; + do { + var phi2 = phi * phi, phi4 = phi2 * phi2; + phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + } while (abs$1(delta) > epsilon$1 && --i > 0); + return [ + x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), + phi + ]; +}; + +function naturalEarth1() { + return projection(naturalEarth1Raw) + .scale(175.295); +} + +function orthographicRaw(x, y) { + return [cos$1(y) * sin$1(x), sin$1(y)]; +} + +orthographicRaw.invert = azimuthalInvert(asin$1); + +function orthographic() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon$1); +} + +function stereographicRaw(x, y) { + var cy = cos$1(y), k = 1 + cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; +} + +stereographicRaw.invert = azimuthalInvert(function(z) { + return 2 * atan(z); +}); + +function stereographic() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); +} + +function transverseMercatorRaw(lambda, phi) { + return [log$1(tan((halfPi$1 + phi) / 2)), -lambda]; +} + +transverseMercatorRaw.invert = function(x, y) { + return [-y, 2 * atan(exp(x)) - halfPi$1]; +}; + +function transverseMercator() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; + + m.center = function(_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function(_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); +} + +function defaultSeparation$1(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; +} + +function meanXReduce(x, c) { + return x + c.x; +} + +function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); +} + +function maxYReduce(y, c) { + return Math.max(y, c.y); +} + +function leafLeft(node) { + var children; + while (children = node.children) node = children[0]; + return node; +} + +function leafRight(node) { + var children; + while (children = node.children) node = children[children.length - 1]; + return node; +} + +function cluster() { + var separation = defaultSeparation$1, + dx = 1, + dy = 1, + nodeSize = false; + + function cluster(root) { + var previousNode, + x = 0; + + // First walk, computing the initial x & y values. + root.eachAfter(function(node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function(node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); + } + + cluster.separation = function(x) { + return arguments.length ? (separation = x, cluster) : separation; + }; + + cluster.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; + + cluster.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; + + return cluster; +} + +function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; +} + +function node_count() { + return this.eachAfter(count); +} + +function node_each(callback, that) { + let index = -1; + for (const node of this) { + callback.call(that, node, ++index, this); + } + return this; +} + +function node_eachBefore(callback, that) { + var node = this, nodes = [node], children, i, index = -1; + while (node = nodes.pop()) { + callback.call(that, node, ++index, this); + if (children = node.children) { + for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + } + return this; +} + +function node_eachAfter(callback, that) { + var node = this, nodes = [node], next = [], children, i, n, index = -1; + while (node = nodes.pop()) { + next.push(node); + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + } + while (node = next.pop()) { + callback.call(that, node, ++index, this); + } + return this; +} + +function node_find(callback, that) { + let index = -1; + for (const node of this) { + if (callback.call(that, node, ++index, this)) { + return node; + } + } +} + +function node_sum(value) { + return this.eachAfter(function(node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); +} + +function node_sort(compare) { + return this.eachBefore(function(node) { + if (node.children) { + node.children.sort(compare); + } + }); +} + +function node_path(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; +} + +function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; +} + +function node_ancestors() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; +} + +function node_descendants() { + return Array.from(this); +} + +function node_leaves() { + var leaves = []; + this.eachBefore(function(node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; +} + +function node_links() { + var root = this, links = []; + root.each(function(node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; +} + +function* node_iterator() { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + yield node; + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } + } while (next.length); +} + +function hierarchy(data, children) { + if (data instanceof Map) { + data = [undefined, data]; + if (children === undefined) children = mapChildren; + } else if (children === undefined) { + children = objectChildren; + } + + var root = new Node$1(data), + node, + nodes = [root], + child, + childs, + i, + n; + + while (node = nodes.pop()) { + if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) { + node.children = childs; + for (i = n - 1; i >= 0; --i) { + nodes.push(child = childs[i] = new Node$1(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); +} + +function node_copy() { + return hierarchy(this).eachBefore(copyData); +} + +function objectChildren(d) { + return d.children; +} + +function mapChildren(d) { + return Array.isArray(d) ? d[1] : null; +} + +function copyData(node) { + if (node.data.value !== undefined) node.value = node.data.value; + node.data = node.data.data; +} + +function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); +} + +function Node$1(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; +} + +Node$1.prototype = hierarchy.prototype = { + constructor: Node$1, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + find: node_find, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy, + [Symbol.iterator]: node_iterator +}; + +function array$1(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} + +function shuffle(array) { + var m = array.length, + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m]; + array[m] = array[i]; + array[i] = t; + } + + return array; +} + +function enclose(circles) { + var i = 0, n = (circles = shuffle(Array.from(circles))).length, B = [], p, e; + + while (i < n) { + p = circles[i]; + if (e && enclosesWeak(e, p)) ++i; + else e = encloseBasis(B = extendBasis(B, p)), i = 0; + } + + return e; +} + +function extendBasis(B, p) { + var i, j; + + if (enclosesWeakAll(p, B)) return [p]; + + // If we get here then B must have at least one element. + for (i = 0; i < B.length; ++i) { + if (enclosesNot(p, B[i]) + && enclosesWeakAll(encloseBasis2(B[i], p), B)) { + return [B[i], p]; + } + } + + // If we get here then B must have at least two elements. + for (i = 0; i < B.length - 1; ++i) { + for (j = i + 1; j < B.length; ++j) { + if (enclosesNot(encloseBasis2(B[i], B[j]), p) + && enclosesNot(encloseBasis2(B[i], p), B[j]) + && enclosesNot(encloseBasis2(B[j], p), B[i]) + && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { + return [B[i], B[j], p]; + } + } + } + + // If we get here then something is very wrong. + throw new Error; +} + +function enclosesNot(a, b) { + var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; + return dr < 0 || dr * dr < dx * dx + dy * dy; +} + +function enclosesWeak(a, b) { + var dr = a.r - b.r + Math.max(a.r, b.r, 1) * 1e-9, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function enclosesWeakAll(a, B) { + for (var i = 0; i < B.length; ++i) { + if (!enclosesWeak(a, B[i])) { + return false; + } + } + return true; +} + +function encloseBasis(B) { + switch (B.length) { + case 1: return encloseBasis1(B[0]); + case 2: return encloseBasis2(B[0], B[1]); + case 3: return encloseBasis3(B[0], B[1], B[2]); + } +} + +function encloseBasis1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; +} + +function encloseBasis2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; +} + +function encloseBasis3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = x1 - x2, + a3 = x1 - x3, + b2 = y1 - y2, + b3 = y1 - y3, + c2 = r2 - r1, + c3 = r3 - r1, + d1 = x1 * x1 + y1 * y1 - r1 * r1, + d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, + d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (r1 + xa * xb + ya * yb), + C = xa * xa + ya * ya - r1 * r1, + r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + return { + x: x1 + xa + xb * r, + y: y1 + ya + yb * r, + r: r + }; +} + +function place(b, a, c) { + var dx = b.x - a.x, x, a2, + dy = b.y - a.y, y, b2, + d2 = dx * dx + dy * dy; + if (d2) { + a2 = a.r + c.r, a2 *= a2; + b2 = b.r + c.r, b2 *= b2; + if (a2 > b2) { + x = (d2 + b2 - a2) / (2 * d2); + y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); + c.x = b.x - x * dx - y * dy; + c.y = b.y - x * dy + y * dx; + } else { + x = (d2 + a2 - b2) / (2 * d2); + y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); + c.x = a.x + x * dx - y * dy; + c.y = a.y + x * dy + y * dx; + } + } else { + c.x = a.x + c.r; + c.y = a.y; + } +} + +function intersects(a, b) { + var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function score(node) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab, + dy = (a.y * b.r + b.y * a.r) / ab; + return dx * dx + dy * dy; +} + +function Node(circle) { + this._ = circle; + this.next = null; + this.previous = null; +} + +function packEnclose(circles) { + if (!(n = (circles = array$1(circles)).length)) return 0; + + var a, b, c, n, aa, ca, i, j, k, sj, sk; + + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) return a.r; + + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) return a.r + b.r; + + // Place the third circle. + place(b, a, c = circles[2]); + + // Initialize the front-chain using the first three circles a, b and c. + a = new Node(a), b = new Node(b), c = new Node(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; + + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node(c); + + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness†is determined by linear distance along the front-chain. + // “Ahead†or “behind†is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + sk += k._.r, k = k.previous; + } + } while (j !== k.next); + + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; + + // Compute the new closest circle pair to the centroid. + aa = score(a); + while ((c = c.next) !== b) { + if ((ca = score(c)) < aa) { + a = c, aa = ca; + } + } + b = a.next; + } + + // Compute the enclosing circle of the front chain. + a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a); + + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; + + return c.r; +} + +function siblings(circles) { + packEnclose(circles); + return circles; +} + +function optional(f) { + return f == null ? null : required(f); +} + +function required(f) { + if (typeof f !== "function") throw new Error; + return f; +} + +function constantZero() { + return 0; +} + +function constant$2(x) { + return function() { + return x; + }; +} + +function defaultRadius(d) { + return Math.sqrt(d.value); +} + +function index$1() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; + + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } + + pack.radius = function(x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; + + pack.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; + + pack.padding = function(x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant$2(+x), pack) : padding; + }; + + return pack; +} + +function radiusLeaf(radius) { + return function(node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; +} + +function packChildren(padding, k) { + return function(node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; + + if (r) for (i = 0; i < n; ++i) children[i].r += r; + e = packEnclose(children); + if (r) for (i = 0; i < n; ++i) children[i].r -= r; + node.r = e + r; + } + }; +} + +function translateChild(k) { + return function(node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; +} + +function roundNode(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); +} + +function treemapDice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } +} + +function partition() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(dy, n) { + return function(node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + partition.round = function(x) { + return arguments.length ? (round = !!x, partition) : round; + }; + + partition.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; + + partition.padding = function(x) { + return arguments.length ? (padding = +x, partition) : padding; + }; + + return partition; +} + +var preroot = {depth: -1}, + ambiguous = {}; + +function defaultId(d) { + return d.id; +} + +function defaultParentId(d) { + return d.parentId; +} + +function stratify() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var nodes = Array.from(data), + n = nodes.length, + d, + i, + root, + parent, + node, + nodeId, + nodeKey, + nodeByKey = new Map; + + for (i = 0; i < n; ++i) { + d = nodes[i], node = nodes[i] = new Node$1(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = node.id = nodeId; + nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node); + } + if ((nodeId = parentId(d, i, data)) != null && (nodeId += "")) { + node.parent = nodeId; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (nodeId = node.parent) { + parent = nodeByKey.get(nodeId); + if (!parent) throw new Error("missing: " + nodeId); + if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); + if (parent.children) parent.children.push(node); + else parent.children = [node]; + node.parent = parent; + } else { + if (root) throw new Error("multiple roots"); + root = node; + } + } + + if (!root) throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) throw new Error("cycle"); + + return root; + } + + stratify.id = function(x) { + return arguments.length ? (id = required(x), stratify) : id; + }; + + stratify.parentId = function(x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; + }; + + return stratify; +} + +function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } + +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. +function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; +} + +// This function works analogously to nextLeft. +function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; +} + +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. +function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; +} + +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). +function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } +} + +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. +function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; +} + +function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number +} + +TreeNode.prototype = Object.create(Node$1.prototype); + +function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; + + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; + } + } + } + + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; +} + +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm +function tree() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function(node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + + return root; + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + + tree.separation = function(x) { + return arguments.length ? (separation = x, tree) : separation; + }; + + tree.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; + + tree.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; + + return tree; +} + +function treemapSlice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; + + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } +} + +var phi = (1 + Math.sqrt(5)) / 2; + +function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + + // Find the next non-empty node. + do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + + // Keep adding nodes while the aspect ratio maintains or improves. + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) minValue = nodeValue; + if (nodeValue > maxValue) maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { sumValue -= nodeValue; break; } + minRatio = newRatio; + } + + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + + return rows; +} + +var squarify = (function custom(ratio) { + + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + + squarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return squarify; +})(phi); + +function index() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + + treemap.round = function(x) { + return arguments.length ? (round = !!x, treemap) : round; + }; + + treemap.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; + + treemap.tile = function(x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; + + treemap.padding = function(x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; + + treemap.paddingInner = function(x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$2(+x), treemap) : paddingInner; + }; + + treemap.paddingOuter = function(x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; + + treemap.paddingTop = function(x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$2(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function(x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$2(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function(x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$2(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function(x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$2(+x), treemap) : paddingLeft; + }; + + return treemap; +} + +function binary(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); + + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + + partition(0, n, parent.value, x0, y0, x1, y1); + + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } + + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; + + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) k = mid + 1; + else hi = mid; + } + + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((x1 - x0) > (y1 - y0)) { + var xk = value ? (x0 * valueRight + x1 * valueLeft) / value : x1; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = value ? (y0 * valueRight + y1 * valueLeft) / value : y1; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } + } +} + +function sliceDice(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); +} + +var resquarify = (function custom(ratio) { + + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; + + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += (y1 - y0) * row.value / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += (x1 - x0) * row.value / value : x1, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } + + resquarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return resquarify; +})(phi); + +function area$1(polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + + return area / 2; +} + +function centroid(polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + + return k *= 3, [x / k, y / k]; +} + +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. +function cross$1(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); +} + +function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; +} + +// Computes the upper convex hull per the monotone chain algorithm. +// Assumes points.length >= 3, is sorted by x, unique in y. +// Returns an array of indices into points in left-to-right order. +function computeUpperHullIndexes(points) { + const n = points.length, + indexes = [0, 1]; + let size = 2, i; + + for (i = 2; i < n; ++i) { + while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points +} + +function hull(points) { + if ((n = points.length) < 3) return null; + + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); + + for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); + + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; + + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + + return hull; +} + +function contains(polygon, point) { + var n = polygon.length, + p = polygon[n - 1], + x = point[0], y = point[1], + x0 = p[0], y0 = p[1], + x1, y1, + inside = false; + + for (var i = 0; i < n; ++i) { + p = polygon[i], x1 = p[0], y1 = p[1]; + if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; + x0 = x1, y0 = y1; + } + + return inside; +} + +function length(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; + + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.hypot(xa, ya); + } + + return perimeter; +} + +var defaultSource = Math.random; + +var uniform = (function sourceRandomUniform(source) { + function randomUniform(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) max = min, min = 0; + else max -= min; + return function() { + return source() * max + min; + }; + } + + randomUniform.source = sourceRandomUniform; + + return randomUniform; +})(defaultSource); + +var int = (function sourceRandomInt(source) { + function randomInt(min, max) { + if (arguments.length < 2) max = min, min = 0; + min = Math.floor(min); + max = Math.floor(max) - min; + return function() { + return Math.floor(source() * max + min); + }; + } + + randomInt.source = sourceRandomInt; + + return randomInt; +})(defaultSource); + +var normal = (function sourceRandomNormal(source) { + function randomNormal(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function() { + var y; + + // If available, use the second previously-generated uniform random. + if (x != null) y = x, x = null; + + // Otherwise, generate a new x and y. + else do { + x = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } + + randomNormal.source = sourceRandomNormal; + + return randomNormal; +})(defaultSource); + +var logNormal = (function sourceRandomLogNormal(source) { + var N = normal.source(source); + + function randomLogNormal() { + var randomNormal = N.apply(this, arguments); + return function() { + return Math.exp(randomNormal()); + }; + } + + randomLogNormal.source = sourceRandomLogNormal; + + return randomLogNormal; +})(defaultSource); + +var irwinHall = (function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + if ((n = +n) <= 0) return () => 0; + return function() { + for (var sum = 0, i = n; i > 1; --i) sum += source(); + return sum + i * source(); + }; + } + + randomIrwinHall.source = sourceRandomIrwinHall; + + return randomIrwinHall; +})(defaultSource); + +var bates = (function sourceRandomBates(source) { + var I = irwinHall.source(source); + + function randomBates(n) { + // use limiting distribution at n === 0 + if ((n = +n) === 0) return source; + var randomIrwinHall = I(n); + return function() { + return randomIrwinHall() / n; + }; + } + + randomBates.source = sourceRandomBates; + + return randomBates; +})(defaultSource); + +var exponential = (function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function() { + return -Math.log1p(-source()) / lambda; + }; + } + + randomExponential.source = sourceRandomExponential; + + return randomExponential; +})(defaultSource); + +var pareto = (function sourceRandomPareto(source) { + function randomPareto(alpha) { + if ((alpha = +alpha) < 0) throw new RangeError("invalid alpha"); + alpha = 1 / -alpha; + return function() { + return Math.pow(1 - source(), alpha); + }; + } + + randomPareto.source = sourceRandomPareto; + + return randomPareto; +})(defaultSource); + +var bernoulli = (function sourceRandomBernoulli(source) { + function randomBernoulli(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + return function() { + return Math.floor(source() + p); + }; + } + + randomBernoulli.source = sourceRandomBernoulli; + + return randomBernoulli; +})(defaultSource); + +var geometric = (function sourceRandomGeometric(source) { + function randomGeometric(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + if (p === 0) return () => Infinity; + if (p === 1) return () => 1; + p = Math.log1p(-p); + return function() { + return 1 + Math.floor(Math.log1p(-source()) / p); + }; + } + + randomGeometric.source = sourceRandomGeometric; + + return randomGeometric; +})(defaultSource); + +var gamma = (function sourceRandomGamma(source) { + var randomNormal = normal.source(source)(); + + function randomGamma(k, theta) { + if ((k = +k) < 0) throw new RangeError("invalid k"); + // degenerate distribution if k === 0 + if (k === 0) return () => 0; + theta = theta == null ? 1 : +theta; + // exponential distribution if k === 1 + if (k === 1) return () => -Math.log1p(-source()) * theta; + + var d = (k < 1 ? k + 1 : k) - 1 / 3, + c = 1 / (3 * Math.sqrt(d)), + multiplier = k < 1 ? () => Math.pow(source(), 1 / k) : () => 1; + return function() { + do { + do { + var x = randomNormal(), + v = 1 + c * x; + } while (v <= 0); + v *= v * v; + var u = 1 - source(); + } while (u >= 1 - 0.0331 * x * x * x * x && Math.log(u) >= 0.5 * x * x + d * (1 - v + Math.log(v))); + return d * v * multiplier() * theta; + }; + } + + randomGamma.source = sourceRandomGamma; + + return randomGamma; +})(defaultSource); + +var beta = (function sourceRandomBeta(source) { + var G = gamma.source(source); + + function randomBeta(alpha, beta) { + var X = G(alpha), + Y = G(beta); + return function() { + var x = X(); + return x === 0 ? 0 : x / (x + Y()); + }; + } + + randomBeta.source = sourceRandomBeta; + + return randomBeta; +})(defaultSource); + +var binomial = (function sourceRandomBinomial(source) { + var G = geometric.source(source), + B = beta.source(source); + + function randomBinomial(n, p) { + n = +n; + if ((p = +p) >= 1) return () => n; + if (p <= 0) return () => 0; + return function() { + var acc = 0, nn = n, pp = p; + while (nn * pp > 16 && nn * (1 - pp) > 16) { + var i = Math.floor((nn + 1) * pp), + y = B(i, nn - i + 1)(); + if (y <= pp) { + acc += i; + nn -= i; + pp = (pp - y) / (1 - y); + } else { + nn = i - 1; + pp /= y; + } + } + var sign = pp < 0.5, + pFinal = sign ? pp : 1 - pp, + g = G(pFinal); + for (var s = g(), k = 0; s <= nn; ++k) s += g(); + return acc + (sign ? k : nn - k); + }; + } + + randomBinomial.source = sourceRandomBinomial; + + return randomBinomial; +})(defaultSource); + +var weibull = (function sourceRandomWeibull(source) { + function randomWeibull(k, a, b) { + var outerFunc; + if ((k = +k) === 0) { + outerFunc = x => -Math.log(x); + } else { + k = 1 / k; + outerFunc = x => Math.pow(x, k); + } + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * outerFunc(-Math.log1p(-source())); + }; + } + + randomWeibull.source = sourceRandomWeibull; + + return randomWeibull; +})(defaultSource); + +var cauchy = (function sourceRandomCauchy(source) { + function randomCauchy(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * Math.tan(Math.PI * source()); + }; + } + + randomCauchy.source = sourceRandomCauchy; + + return randomCauchy; +})(defaultSource); + +var logistic = (function sourceRandomLogistic(source) { + function randomLogistic(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + var u = source(); + return a + b * Math.log(u / (1 - u)); + }; + } + + randomLogistic.source = sourceRandomLogistic; + + return randomLogistic; +})(defaultSource); + +var poisson = (function sourceRandomPoisson(source) { + var G = gamma.source(source), + B = binomial.source(source); + + function randomPoisson(lambda) { + return function() { + var acc = 0, l = lambda; + while (l > 16) { + var n = Math.floor(0.875 * l), + t = G(n)(); + if (t > l) return acc + B(n - 1, l / t)(); + acc += n; + l -= t; + } + for (var s = -Math.log1p(-source()), k = 0; s <= l; ++k) s -= Math.log1p(-source()); + return acc + k; + }; + } + + randomPoisson.source = sourceRandomPoisson; + + return randomPoisson; +})(defaultSource); + +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const mul = 0x19660D; +const inc = 0x3C6EF35F; +const eps = 1 / 0x100000000; + +function lcg(seed = Math.random()) { + let state = (0 <= seed && seed < 1 ? seed / eps : Math.abs(seed)) | 0; + return () => (state = mul * state + inc | 0, eps * (state >>> 0)); +} + +function initRange(domain, range) { + switch (arguments.length) { + case 0: break; + case 1: this.range(domain); break; + default: this.range(range).domain(domain); break; + } + return this; +} + +function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: break; + case 1: { + if (typeof domain === "function") this.interpolator(domain); + else this.range(domain); + break; + } + default: { + this.domain(domain); + if (typeof interpolator === "function") this.interpolator(interpolator); + else this.range(interpolator); + break; + } + } + return this; +} + +const implicit = Symbol("implicit"); + +function ordinal() { + var index = new Map(), + domain = [], + range = [], + unknown = implicit; + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = [], index = new Map(); + for (const value of _) { + const key = value + ""; + if (index.has(key)) continue; + index.set(key, domain.push(value)); + } + return scale; + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), scale) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return ordinal(domain, range).unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + r0 = 0, + r1 = 1, + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = r1 < r0, + start = reverse ? r1 : r0, + stop = reverse ? r0 : r1; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = sequence(n).map(function(i) { return start + step * i; }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function(_) { + return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1]; + }; + + scale.rangeRound = function(_) { + return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale(); + }; + + scale.bandwidth = function() { + return bandwidth; + }; + + scale.step = function() { + return step; + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function(_) { + return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; + + scale.paddingInner = function(_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; + + scale.paddingOuter = function(_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; + + scale.align = function(_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function() { + return band(domain(), [r0, r1]) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return initRange.apply(rescale(), arguments); +} + +function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function() { + return pointish(copy()); + }; + + return scale; +} + +function point$4() { + return pointish(band.apply(null, arguments).paddingInner(1)); +} + +function constants(x) { + return function() { + return x; + }; +} + +function number$1(x) { + return +x; +} + +var unit = [0, 1]; + +function identity$3(x) { + return x; +} + +function normalize(a, b) { + return (b -= (a = +a)) + ? function(x) { return (x - a) / b; } + : constants(isNaN(b) ? NaN : 0.5); +} + +function clamper(a, b) { + var t; + if (a > b) t = a, a = b, b = t; + return function(x) { return Math.max(a, Math.min(b, x)); }; +} + +// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. +function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function(x) { return r0(d0(x)); }; +} + +function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + + return function(x) { + var i = bisectRight(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; +} + +function copy$1(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +function transformer$2() { + var domain = unit, + range = unit, + interpolate = interpolate$2, + transform, + untransform, + unknown, + clamp = identity$3, + piecewise, + output, + input; + + function rescale() { + var n = Math.min(domain.length, range.length); + if (clamp !== identity$3) clamp = clamper(domain[0], domain[n - 1]); + piecewise = n > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + } + + scale.invert = function(y) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y))); + }; + + scale.domain = function(_) { + return arguments.length ? (domain = Array.from(_, number$1), rescale()) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); + }; + + scale.rangeRound = function(_) { + return range = Array.from(_), interpolate = interpolateRound, rescale(); + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = _ ? true : identity$3, rescale()) : clamp !== identity$3; + }; + + scale.interpolate = function(_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t, u) { + transform = t, untransform = u; + return rescale(); + }; +} + +function continuous() { + return transformer$2()(identity$3, identity$3); +} + +function tickFormat(start, stop, count, specifier) { + var step = tickStep(start, stop, count), + precision; + specifier = formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision; + return exports.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return exports.format(specifier); +} + +function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function(count) { + var d = domain(); + return ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function(count, specifier) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + }; + + scale.nice = function(count) { + if (count == null) count = 10; + + var d = domain(); + var i0 = 0; + var i1 = d.length - 1; + var start = d[i0]; + var stop = d[i1]; + var prestep; + var step; + var maxIter = 10; + + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + while (maxIter-- > 0) { + step = tickIncrement(start, stop, count); + if (step === prestep) { + d[i0] = start; + d[i1] = stop; + return domain(d); + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } else { + break; + } + prestep = step; + } + + return scale; + }; + + return scale; +} + +function linear() { + var scale = continuous(); + + scale.copy = function() { + return copy$1(scale, linear()); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); +} + +function identity$2(domain) { + var unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : x; + } + + scale.invert = scale; + + scale.domain = scale.range = function(_) { + return arguments.length ? (domain = Array.from(_, number$1), scale) : domain.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return identity$2(domain).unknown(unknown); + }; + + domain = arguments.length ? Array.from(domain, number$1) : [0, 1]; + + return linearish(scale); +} + +function nice(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; +} + +function transformLog(x) { + return Math.log(x); +} + +function transformExp(x) { + return Math.exp(x); +} + +function transformLogn(x) { + return -Math.log(-x); +} + +function transformExpn(x) { + return -Math.exp(-x); +} + +function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; +} + +function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function(x) { return Math.pow(base, x); }; +} + +function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function(x) { return Math.log(x) / base; }); +} + +function reflect(f) { + return function(x) { + return -f(-x); + }; +} + +function loggish(transform) { + var scale = transform(transformLog, transformExp), + domain = scale.domain, + base = 10, + logs, + pows; + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) { + logs = reflect(logs), pows = reflect(pows); + transform(transformLogn, transformExpn); + } else { + transform(transformLog, transformExp); + } + return scale; + } + + scale.base = function(_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function(count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.floor(i), j = Math.ceil(j); + if (u > 0) for (; i <= j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i <= j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + if (z.length * 2 < n) z = ticks(u, v, n); + } else { + z = ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function(count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = exports.format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function(d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function() { + return domain(nice(domain(), { + floor: function(x) { return pows(Math.floor(logs(x))); }, + ceil: function(x) { return pows(Math.ceil(logs(x))); } + })); + }; + + return scale; +} + +function log() { + var scale = loggish(transformer$2()).domain([1, 10]); + + scale.copy = function() { + return copy$1(scale, log()).base(scale.base()); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function transformSymlog(c) { + return function(x) { + return Math.sign(x) * Math.log1p(Math.abs(x / c)); + }; +} + +function transformSymexp(c) { + return function(x) { + return Math.sign(x) * Math.expm1(Math.abs(x)) * c; + }; +} + +function symlogish(transform) { + var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); + + scale.constant = function(_) { + return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; + }; + + return linearish(scale); +} + +function symlog() { + var scale = symlogish(transformer$2()); + + scale.copy = function() { + return copy$1(scale, symlog()).constant(scale.constant()); + }; + + return initRange.apply(scale, arguments); +} + +function transformPow(exponent) { + return function(x) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + }; +} + +function transformSqrt(x) { + return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); +} + +function transformSquare(x) { + return x < 0 ? -x * x : x * x; +} + +function powish(transform) { + var scale = transform(identity$3, identity$3), + exponent = 1; + + function rescale() { + return exponent === 1 ? transform(identity$3, identity$3) + : exponent === 0.5 ? transform(transformSqrt, transformSquare) + : transform(transformPow(exponent), transformPow(1 / exponent)); + } + + scale.exponent = function(_) { + return arguments.length ? (exponent = +_, rescale()) : exponent; + }; + + return linearish(scale); +} + +function pow() { + var scale = powish(transformer$2()); + + scale.copy = function() { + return copy$1(scale, pow()).exponent(scale.exponent()); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function sqrt$1() { + return pow.apply(null, arguments).exponent(0.5); +} + +function square$1(x) { + return Math.sign(x) * x * x; +} + +function unsquare(x) { + return Math.sign(x) * Math.sqrt(Math.abs(x)); +} + +function radial() { + var squared = continuous(), + range = [0, 1], + round = false, + unknown; + + function scale(x) { + var y = unsquare(squared(x)); + return isNaN(y) ? unknown : round ? Math.round(y) : y; + } + + scale.invert = function(y) { + return squared.invert(square$1(y)); + }; + + scale.domain = function(_) { + return arguments.length ? (squared.domain(_), scale) : squared.domain(); + }; + + scale.range = function(_) { + return arguments.length ? (squared.range((range = Array.from(_, number$1)).map(square$1)), scale) : range.slice(); + }; + + scale.rangeRound = function(_) { + return scale.range(_).round(true); + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, scale) : round; + }; + + scale.clamp = function(_) { + return arguments.length ? (squared.clamp(_), scale) : squared.clamp(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return radial(squared.domain(), range) + .round(round) + .clamp(squared.clamp()) + .unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); +} + +function quantile() { + var domain = [], + range = [], + thresholds = [], + unknown; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = quantileSorted(domain, i / n); + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : range[bisectRight(thresholds, x)]; + } + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending$3); + return rescale(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.quantiles = function() { + return thresholds.slice(); + }; + + scale.copy = function() { + return quantile() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} + +function quantize() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1], + unknown; + + function scale(x) { + return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [x0, x1]; + }; + + scale.range = function(_) { + return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : scale; + }; + + scale.thresholds = function() { + return domain.slice(); + }; + + scale.copy = function() { + return quantize() + .domain([x0, x1]) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(linearish(scale), arguments); +} + +function threshold() { + var domain = [0.5], + range = [0, 1], + unknown, + n = 1; + + function scale(x) { + return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + } + + scale.domain = function(_) { + return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return threshold() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} + +var t0 = new Date, + t1 = new Date; + +function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; + } + + interval.floor = function(date) { + return floori(date = new Date(+date)), date; + }; + + interval.ceil = function(date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function(date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function(date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function(start, stop, step) { + var range = [], previous; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(previous = new Date(+start)), offseti(start, step), floori(start); + while (previous < start && start < stop); + return range; + }; + + interval.filter = function(test) { + return newInterval(function(date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function(date, step) { + if (date >= date) { + if (step < 0) while (++step <= 0) { + while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty + } else while (--step >= 0) { + while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty + } + } + }); + }; + + if (count) { + interval.count = function(start, end) { + t0.setTime(+start), t1.setTime(+end); + floori(t0), floori(t1); + return Math.floor(count(t0, t1)); + }; + + interval.every = function(step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function(d) { return field(d) % step === 0; } + : function(d) { return interval.count(0, d) % step === 0; }); + }; + } + + return interval; +} + +var millisecond = newInterval(function() { + // noop +}, function(date, step) { + date.setTime(+date + step); +}, function(start, end) { + return end - start; +}); + +// An optimized implementation for this simple case. +millisecond.every = function(k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function(date) { + date.setTime(Math.floor(date / k) * k); + }, function(date, step) { + date.setTime(+date + step * k); + }, function(start, end) { + return (end - start) / k; + }); +}; +var milliseconds = millisecond.range; + +var durationSecond$1 = 1e3; +var durationMinute$1 = 6e4; +var durationHour$1 = 36e5; +var durationDay$1 = 864e5; +var durationWeek$1 = 6048e5; + +var second = newInterval(function(date) { + date.setTime(date - date.getMilliseconds()); +}, function(date, step) { + date.setTime(+date + step * durationSecond$1); +}, function(start, end) { + return (end - start) / durationSecond$1; +}, function(date) { + return date.getUTCSeconds(); +}); +var seconds = second.range; + +var minute = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond$1); +}, function(date, step) { + date.setTime(+date + step * durationMinute$1); +}, function(start, end) { + return (end - start) / durationMinute$1; +}, function(date) { + return date.getMinutes(); +}); +var minutes = minute.range; + +var hour = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond$1 - date.getMinutes() * durationMinute$1); +}, function(date, step) { + date.setTime(+date + step * durationHour$1); +}, function(start, end) { + return (end - start) / durationHour$1; +}, function(date) { + return date.getHours(); +}); +var hours = hour.range; + +var day = newInterval( + date => date.setHours(0, 0, 0, 0), + (date, step) => date.setDate(date.getDate() + step), + (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationDay$1, + date => date.getDate() - 1 +); +var days = day.range; + +function weekday(i) { + return newInterval(function(date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setDate(date.getDate() + step * 7); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationWeek$1; + }); +} + +var sunday = weekday(0); +var monday = weekday(1); +var tuesday = weekday(2); +var wednesday = weekday(3); +var thursday = weekday(4); +var friday = weekday(5); +var saturday = weekday(6); + +var sundays = sunday.range; +var mondays = monday.range; +var tuesdays = tuesday.range; +var wednesdays = wednesday.range; +var thursdays = thursday.range; +var fridays = friday.range; +var saturdays = saturday.range; + +var month = newInterval(function(date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setMonth(date.getMonth() + step); +}, function(start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; +}, function(date) { + return date.getMonth(); +}); +var months = month.range; + +var year = newInterval(function(date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setFullYear(date.getFullYear() + step); +}, function(start, end) { + return end.getFullYear() - start.getFullYear(); +}, function(date) { + return date.getFullYear(); +}); + +// An optimized implementation for this simple case. +year.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); +}; +var years = year.range; + +var utcMinute = newInterval(function(date) { + date.setUTCSeconds(0, 0); +}, function(date, step) { + date.setTime(+date + step * durationMinute$1); +}, function(start, end) { + return (end - start) / durationMinute$1; +}, function(date) { + return date.getUTCMinutes(); +}); +var utcMinutes = utcMinute.range; + +var utcHour = newInterval(function(date) { + date.setUTCMinutes(0, 0, 0); +}, function(date, step) { + date.setTime(+date + step * durationHour$1); +}, function(start, end) { + return (end - start) / durationHour$1; +}, function(date) { + return date.getUTCHours(); +}); +var utcHours = utcHour.range; + +var utcDay = newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCDate(date.getUTCDate() + step); +}, function(start, end) { + return (end - start) / durationDay$1; +}, function(date) { + return date.getUTCDate() - 1; +}); +var utcDays = utcDay.range; + +function utcWeekday(i) { + return newInterval(function(date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function(start, end) { + return (end - start) / durationWeek$1; + }); +} + +var utcSunday = utcWeekday(0); +var utcMonday = utcWeekday(1); +var utcTuesday = utcWeekday(2); +var utcWednesday = utcWeekday(3); +var utcThursday = utcWeekday(4); +var utcFriday = utcWeekday(5); +var utcSaturday = utcWeekday(6); + +var utcSundays = utcSunday.range; +var utcMondays = utcMonday.range; +var utcTuesdays = utcTuesday.range; +var utcWednesdays = utcWednesday.range; +var utcThursdays = utcThursday.range; +var utcFridays = utcFriday.range; +var utcSaturdays = utcSaturday.range; + +var utcMonth = newInterval(function(date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCMonth(date.getUTCMonth() + step); +}, function(start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; +}, function(date) { + return date.getUTCMonth(); +}); +var utcMonths = utcMonth.range; + +var utcYear = newInterval(function(date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); +}, function(start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); +}, function(date) { + return date.getUTCFullYear(); +}); + +// An optimized implementation for this simple case. +utcYear.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); +}; +var utcYears = utcYear.range; + +function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); +} + +function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); +} + +function newDate(y, m, d) { + return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; +} + +function formatLocale(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "f": formatMicroseconds, + "g": formatYearISO, + "G": formatFullYearISO, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "q": formatQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatSeconds, + "u": formatWeekdayNumberMonday, + "U": formatWeekNumberSunday, + "V": formatWeekNumberISO, + "w": formatWeekdayNumberSunday, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "f": formatUTCMicroseconds, + "g": formatUTCYearISO, + "G": formatUTCFullYearISO, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "q": formatUTCQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatUTCSeconds, + "u": formatUTCWeekdayNumberMonday, + "U": formatUTCWeekNumberSunday, + "V": formatUTCWeekNumberISO, + "w": formatUTCWeekdayNumberSunday, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "f": parseMicroseconds, + "g": parseYear, + "G": parseFullYear, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "q": parseQuarter, + "Q": parseUnixTimestamp, + "s": parseUnixTimestampSeconds, + "S": parseSeconds, + "u": parseWeekdayNumberMonday, + "U": parseWeekNumberSunday, + "V": parseWeekNumberISO, + "w": parseWeekdayNumberSunday, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function(date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, Z) { + return function(string) { + var d = newDate(1900, undefined, 1), + i = parseSpecifier(d, specifier, string += "", 0), + week, day$1; + if (i != string.length) return null; + + // If a UNIX timestamp is specified, return it. + if ("Q" in d) return new Date(d.Q); + if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); + + // If this is utcParse, never use the local timezone. + if (Z && !("Z" in d)) d.Z = 0; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // If the month was not specified, inherit from the quarter. + if (d.m === undefined) d.m = "q" in d ? d.q : 0; + + // Convert day-of-week and week-of-year to day-of-year. + if ("V" in d) { + if (d.V < 1 || d.V > 53) return null; + if (!("w" in d)) d.w = 1; + if ("Z" in d) { + week = utcDate(newDate(d.y, 0, 1)), day$1 = week.getUTCDay(); + week = day$1 > 4 || day$1 === 0 ? utcMonday.ceil(week) : utcMonday(week); + week = utcDay.offset(week, (d.V - 1) * 7); + d.y = week.getUTCFullYear(); + d.m = week.getUTCMonth(); + d.d = week.getUTCDate() + (d.w + 6) % 7; + } else { + week = localDate(newDate(d.y, 0, 1)), day$1 = week.getDay(); + week = day$1 > 4 || day$1 === 0 ? monday.ceil(week) : monday(week); + week = day.offset(week, (d.V - 1) * 7); + d.y = week.getFullYear(); + d.m = week.getMonth(); + d.d = week.getDate() + (d.w + 6) % 7; + } + } else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; + day$1 = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$1 + 5) % 7 : d.w + d.U * 7 - (day$1 + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return localDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatQuarter(d) { + return 1 + ~~(d.getMonth() / 3); + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + function formatUTCQuarter(d) { + return 1 + ~~(d.getUTCMonth() / 3); + } + + return { + format: function(specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function() { return specifier; }; + return f; + }, + parse: function(specifier) { + var p = newParse(specifier += "", false); + p.toString = function() { return specifier; }; + return p; + }, + utcFormat: function(specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function() { return specifier; }; + return f; + }, + utcParse: function(specifier) { + var p = newParse(specifier += "", true); + p.toString = function() { return specifier; }; + return p; + } + }; +} + +var pads = {"-": "", "_": " ", "0": "0"}, + numberRe = /^\s*\d+/, // note: ignores next directive + percentRe = /^%/, + requoteRe = /[\\^$*+?|[\]().{}]/g; + +function pad(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); +} + +function requote(s) { + return s.replace(requoteRe, "\\$&"); +} + +function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); +} + +function formatLookup(names) { + return new Map(names.map((name, i) => [name.toLowerCase(), i])); +} + +function parseWeekdayNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; +} + +function parseWeekdayNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.u = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.U = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberISO(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.V = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.W = +n[0], i + n[0].length) : -1; +} + +function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; +} + +function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; +} + +function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; +} + +function parseQuarter(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; +} + +function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; +} + +function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; +} + +function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; +} + +function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; +} + +function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; +} + +function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; +} + +function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; +} + +function parseMicroseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 6)); + return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; +} + +function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; +} + +function parseUnixTimestamp(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = +n[0], i + n[0].length) : -1; +} + +function parseUnixTimestampSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.s = +n[0], i + n[0].length) : -1; +} + +function formatDayOfMonth(d, p) { + return pad(d.getDate(), p, 2); +} + +function formatHour24(d, p) { + return pad(d.getHours(), p, 2); +} + +function formatHour12(d, p) { + return pad(d.getHours() % 12 || 12, p, 2); +} + +function formatDayOfYear(d, p) { + return pad(1 + day.count(year(d), d), p, 3); +} + +function formatMilliseconds(d, p) { + return pad(d.getMilliseconds(), p, 3); +} + +function formatMicroseconds(d, p) { + return formatMilliseconds(d, p) + "000"; +} + +function formatMonthNumber(d, p) { + return pad(d.getMonth() + 1, p, 2); +} + +function formatMinutes(d, p) { + return pad(d.getMinutes(), p, 2); +} + +function formatSeconds(d, p) { + return pad(d.getSeconds(), p, 2); +} + +function formatWeekdayNumberMonday(d) { + var day = d.getDay(); + return day === 0 ? 7 : day; +} + +function formatWeekNumberSunday(d, p) { + return pad(sunday.count(year(d) - 1, d), p, 2); +} + +function dISO(d) { + var day = d.getDay(); + return (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d); +} + +function formatWeekNumberISO(d, p) { + d = dISO(d); + return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2); +} + +function formatWeekdayNumberSunday(d) { + return d.getDay(); +} + +function formatWeekNumberMonday(d, p) { + return pad(monday.count(year(d) - 1, d), p, 2); +} + +function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); +} + +function formatYearISO(d, p) { + d = dISO(d); + return pad(d.getFullYear() % 100, p, 2); +} + +function formatFullYear(d, p) { + return pad(d.getFullYear() % 10000, p, 4); +} + +function formatFullYearISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d); + return pad(d.getFullYear() % 10000, p, 4); +} + +function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad(z / 60 | 0, "0", 2) + + pad(z % 60, "0", 2); +} + +function formatUTCDayOfMonth(d, p) { + return pad(d.getUTCDate(), p, 2); +} + +function formatUTCHour24(d, p) { + return pad(d.getUTCHours(), p, 2); +} + +function formatUTCHour12(d, p) { + return pad(d.getUTCHours() % 12 || 12, p, 2); +} + +function formatUTCDayOfYear(d, p) { + return pad(1 + utcDay.count(utcYear(d), d), p, 3); +} + +function formatUTCMilliseconds(d, p) { + return pad(d.getUTCMilliseconds(), p, 3); +} + +function formatUTCMicroseconds(d, p) { + return formatUTCMilliseconds(d, p) + "000"; +} + +function formatUTCMonthNumber(d, p) { + return pad(d.getUTCMonth() + 1, p, 2); +} + +function formatUTCMinutes(d, p) { + return pad(d.getUTCMinutes(), p, 2); +} + +function formatUTCSeconds(d, p) { + return pad(d.getUTCSeconds(), p, 2); +} + +function formatUTCWeekdayNumberMonday(d) { + var dow = d.getUTCDay(); + return dow === 0 ? 7 : dow; +} + +function formatUTCWeekNumberSunday(d, p) { + return pad(utcSunday.count(utcYear(d) - 1, d), p, 2); +} + +function UTCdISO(d) { + var day = d.getUTCDay(); + return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); +} + +function formatUTCWeekNumberISO(d, p) { + d = UTCdISO(d); + return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2); +} + +function formatUTCWeekdayNumberSunday(d) { + return d.getUTCDay(); +} + +function formatUTCWeekNumberMonday(d, p) { + return pad(utcMonday.count(utcYear(d) - 1, d), p, 2); +} + +function formatUTCYear(d, p) { + return pad(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCYearISO(d, p) { + d = UTCdISO(d); + return pad(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCFullYear(d, p) { + return pad(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCFullYearISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); + return pad(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCZone() { + return "+0000"; +} + +function formatLiteralPercent() { + return "%"; +} + +function formatUnixTimestamp(d) { + return +d; +} + +function formatUnixTimestampSeconds(d) { + return Math.floor(+d / 1000); +} + +var locale; +exports.timeFormat = void 0; +exports.timeParse = void 0; +exports.utcFormat = void 0; +exports.utcParse = void 0; + +defaultLocale({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +}); + +function defaultLocale(definition) { + locale = formatLocale(definition); + exports.timeFormat = locale.format; + exports.timeParse = locale.parse; + exports.utcFormat = locale.utcFormat; + exports.utcParse = locale.utcParse; + return locale; +} + +var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + +function formatIsoNative(date) { + return date.toISOString(); +} + +var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); + +function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; +} + +var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); + +var durationSecond = 1000, + durationMinute = durationSecond * 60, + durationHour = durationMinute * 60, + durationDay = durationHour * 24, + durationWeek = durationDay * 7, + durationMonth = durationDay * 30, + durationYear = durationDay * 365; + +function date(t) { + return new Date(t); +} + +function number(t) { + return t instanceof Date ? +t : +new Date(+t); +} + +function calendar(year, month, week, day, hour, minute, second, millisecond, format) { + var scale = continuous(), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second, 1, durationSecond], + [second, 5, 5 * durationSecond], + [second, 15, 15 * durationSecond], + [second, 30, 30 * durationSecond], + [minute, 1, durationMinute], + [minute, 5, 5 * durationMinute], + [minute, 15, 15 * durationMinute], + [minute, 30, 30 * durationMinute], + [ hour, 1, durationHour ], + [ hour, 3, 3 * durationHour ], + [ hour, 6, 6 * durationHour ], + [ hour, 12, 12 * durationHour ], + [ day, 1, durationDay ], + [ day, 2, 2 * durationDay ], + [ week, 1, durationWeek ], + [ month, 1, durationMonth ], + [ month, 3, 3 * durationMonth ], + [ year, 1, durationYear ] + ]; + + function tickFormat(date) { + return (second(date) < date ? formatMillisecond + : minute(date) < date ? formatSecond + : hour(date) < date ? formatMinute + : day(date) < date ? formatHour + : month(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop) { + if (interval == null) interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = bisector(function(i) { return i[2]; }).right(tickIntervals, target), + step; + if (i === tickIntervals.length) { + step = tickStep(start / durationYear, stop / durationYear, interval); + interval = year; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = Math.max(tickStep(start, stop, interval), 1); + interval = millisecond; + } + return interval.every(step); + } + + return interval; + } + + scale.invert = function(y) { + return new Date(invert(y)); + }; + + scale.domain = function(_) { + return arguments.length ? domain(Array.from(_, number)) : domain().map(date); + }; + + scale.ticks = function(interval) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function(count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function(interval) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1])) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function() { + return copy$1(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + }; + + return scale; +} + +function time() { + return initRange.apply(calendar(year, month, sunday, day, hour, minute, second, millisecond, exports.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); +} + +function utcTime() { + return initRange.apply(calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, exports.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); +} + +function transformer$1() { + var x0 = 0, + x1 = 1, + t0, + t1, + k10, + transform, + interpolator = identity$3, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + function range(interpolate) { + return function(_) { + var r0, r1; + return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)]; + }; + } + + scale.range = range(interpolate$2); + + scale.rangeRound = range(interpolateRound); + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); + return scale; + }; +} + +function copy(source, target) { + return target + .domain(source.domain()) + .interpolator(source.interpolator()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +function sequential() { + var scale = linearish(transformer$1()(identity$3)); + + scale.copy = function() { + return copy(scale, sequential()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialLog() { + var scale = loggish(transformer$1()).domain([1, 10]); + + scale.copy = function() { + return copy(scale, sequentialLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialSymlog() { + var scale = symlogish(transformer$1()); + + scale.copy = function() { + return copy(scale, sequentialSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialPow() { + var scale = powish(transformer$1()); + + scale.copy = function() { + return copy(scale, sequentialPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialSqrt() { + return sequentialPow.apply(null, arguments).exponent(0.5); +} + +function sequentialQuantile() { + var domain = [], + interpolator = identity$3; + + function scale(x) { + if (!isNaN(x = +x)) return interpolator((bisectRight(domain, x, 1) - 1) / (domain.length - 1)); + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending$3); + return scale; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.range = function() { + return domain.map((d, i) => interpolator(i / (domain.length - 1))); + }; + + scale.quantiles = function(n) { + return Array.from({length: n + 1}, (_, i) => quantile$1(domain, i / n)); + }; + + scale.copy = function() { + return sequentialQuantile(interpolator).domain(domain); + }; + + return initInterpolator.apply(scale, arguments); +} + +function transformer() { + var x0 = 0, + x1 = 0.5, + x2 = 1, + s = 1, + t0, + t1, + t2, + k10, + k21, + interpolator = identity$3, + transform, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [x0, x1, x2]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + function range(interpolate) { + return function(_) { + var r0, r1, r2; + return arguments.length ? ([r0, r1, r2] = _, interpolator = piecewise(interpolate, [r0, r1, r2]), scale) : [interpolator(0), interpolator(0.5), interpolator(1)]; + }; + } + + scale.range = range(interpolate$2); + + scale.rangeRound = range(interpolateRound); + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1; + return scale; + }; +} + +function diverging$1() { + var scale = linearish(transformer()(identity$3)); + + scale.copy = function() { + return copy(scale, diverging$1()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingLog() { + var scale = loggish(transformer()).domain([0.1, 1, 10]); + + scale.copy = function() { + return copy(scale, divergingLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingSymlog() { + var scale = symlogish(transformer()); + + scale.copy = function() { + return copy(scale, divergingSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingPow() { + var scale = powish(transformer()); + + scale.copy = function() { + return copy(scale, divergingPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingSqrt() { + return divergingPow.apply(null, arguments).exponent(0.5); +} + +function colors(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; +} + +var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + +var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); + +var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); + +var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); + +var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); + +var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); + +var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); + +var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); + +var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); + +var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); + +var ramp$1 = scheme => rgbBasis(scheme[scheme.length - 1]); + +var scheme$q = new Array(3).concat( + "d8b365f5f5f55ab4ac", + "a6611adfc27d80cdc1018571", + "a6611adfc27df5f5f580cdc1018571", + "8c510ad8b365f6e8c3c7eae55ab4ac01665e", + "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", + "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", + "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", + "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", + "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" +).map(colors); + +var BrBG = ramp$1(scheme$q); + +var scheme$p = new Array(3).concat( + "af8dc3f7f7f77fbf7b", + "7b3294c2a5cfa6dba0008837", + "7b3294c2a5cff7f7f7a6dba0008837", + "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", + "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", + "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", + "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", + "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", + "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" +).map(colors); + +var PRGn = ramp$1(scheme$p); + +var scheme$o = new Array(3).concat( + "e9a3c9f7f7f7a1d76a", + "d01c8bf1b6dab8e1864dac26", + "d01c8bf1b6daf7f7f7b8e1864dac26", + "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", + "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", + "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", + "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", + "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", + "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" +).map(colors); + +var PiYG = ramp$1(scheme$o); + +var scheme$n = new Array(3).concat( + "998ec3f7f7f7f1a340", + "5e3c99b2abd2fdb863e66101", + "5e3c99b2abd2f7f7f7fdb863e66101", + "542788998ec3d8daebfee0b6f1a340b35806", + "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", + "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", + "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", + "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", + "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" +).map(colors); + +var PuOr = ramp$1(scheme$n); + +var scheme$m = new Array(3).concat( + "ef8a62f7f7f767a9cf", + "ca0020f4a58292c5de0571b0", + "ca0020f4a582f7f7f792c5de0571b0", + "b2182bef8a62fddbc7d1e5f067a9cf2166ac", + "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", + "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", + "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", + "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", + "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" +).map(colors); + +var RdBu = ramp$1(scheme$m); + +var scheme$l = new Array(3).concat( + "ef8a62ffffff999999", + "ca0020f4a582bababa404040", + "ca0020f4a582ffffffbababa404040", + "b2182bef8a62fddbc7e0e0e09999994d4d4d", + "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", + "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", + "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", + "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", + "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" +).map(colors); + +var RdGy = ramp$1(scheme$l); + +var scheme$k = new Array(3).concat( + "fc8d59ffffbf91bfdb", + "d7191cfdae61abd9e92c7bb6", + "d7191cfdae61ffffbfabd9e92c7bb6", + "d73027fc8d59fee090e0f3f891bfdb4575b4", + "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", + "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", + "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", + "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", + "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" +).map(colors); + +var RdYlBu = ramp$1(scheme$k); + +var scheme$j = new Array(3).concat( + "fc8d59ffffbf91cf60", + "d7191cfdae61a6d96a1a9641", + "d7191cfdae61ffffbfa6d96a1a9641", + "d73027fc8d59fee08bd9ef8b91cf601a9850", + "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", + "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", + "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", + "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", + "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" +).map(colors); + +var RdYlGn = ramp$1(scheme$j); + +var scheme$i = new Array(3).concat( + "fc8d59ffffbf99d594", + "d7191cfdae61abdda42b83ba", + "d7191cfdae61ffffbfabdda42b83ba", + "d53e4ffc8d59fee08be6f59899d5943288bd", + "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", + "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", + "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", + "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", + "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" +).map(colors); + +var Spectral = ramp$1(scheme$i); + +var scheme$h = new Array(3).concat( + "e5f5f999d8c92ca25f", + "edf8fbb2e2e266c2a4238b45", + "edf8fbb2e2e266c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" +).map(colors); + +var BuGn = ramp$1(scheme$h); + +var scheme$g = new Array(3).concat( + "e0ecf49ebcda8856a7", + "edf8fbb3cde38c96c688419d", + "edf8fbb3cde38c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" +).map(colors); + +var BuPu = ramp$1(scheme$g); + +var scheme$f = new Array(3).concat( + "e0f3dba8ddb543a2ca", + "f0f9e8bae4bc7bccc42b8cbe", + "f0f9e8bae4bc7bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" +).map(colors); + +var GnBu = ramp$1(scheme$f); + +var scheme$e = new Array(3).concat( + "fee8c8fdbb84e34a33", + "fef0d9fdcc8afc8d59d7301f", + "fef0d9fdcc8afc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" +).map(colors); + +var OrRd = ramp$1(scheme$e); + +var scheme$d = new Array(3).concat( + "ece2f0a6bddb1c9099", + "f6eff7bdc9e167a9cf02818a", + "f6eff7bdc9e167a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" +).map(colors); + +var PuBuGn = ramp$1(scheme$d); + +var scheme$c = new Array(3).concat( + "ece7f2a6bddb2b8cbe", + "f1eef6bdc9e174a9cf0570b0", + "f1eef6bdc9e174a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" +).map(colors); + +var PuBu = ramp$1(scheme$c); + +var scheme$b = new Array(3).concat( + "e7e1efc994c7dd1c77", + "f1eef6d7b5d8df65b0ce1256", + "f1eef6d7b5d8df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" +).map(colors); + +var PuRd = ramp$1(scheme$b); + +var scheme$a = new Array(3).concat( + "fde0ddfa9fb5c51b8a", + "feebe2fbb4b9f768a1ae017e", + "feebe2fbb4b9f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" +).map(colors); + +var RdPu = ramp$1(scheme$a); + +var scheme$9 = new Array(3).concat( + "edf8b17fcdbb2c7fb8", + "ffffcca1dab441b6c4225ea8", + "ffffcca1dab441b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" +).map(colors); + +var YlGnBu = ramp$1(scheme$9); + +var scheme$8 = new Array(3).concat( + "f7fcb9addd8e31a354", + "ffffccc2e69978c679238443", + "ffffccc2e69978c67931a354006837", + "ffffccd9f0a3addd8e78c67931a354006837", + "ffffccd9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" +).map(colors); + +var YlGn = ramp$1(scheme$8); + +var scheme$7 = new Array(3).concat( + "fff7bcfec44fd95f0e", + "ffffd4fed98efe9929cc4c02", + "ffffd4fed98efe9929d95f0e993404", + "ffffd4fee391fec44ffe9929d95f0e993404", + "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" +).map(colors); + +var YlOrBr = ramp$1(scheme$7); + +var scheme$6 = new Array(3).concat( + "ffeda0feb24cf03b20", + "ffffb2fecc5cfd8d3ce31a1c", + "ffffb2fecc5cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" +).map(colors); + +var YlOrRd = ramp$1(scheme$6); + +var scheme$5 = new Array(3).concat( + "deebf79ecae13182bd", + "eff3ffbdd7e76baed62171b5", + "eff3ffbdd7e76baed63182bd08519c", + "eff3ffc6dbef9ecae16baed63182bd08519c", + "eff3ffc6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" +).map(colors); + +var Blues = ramp$1(scheme$5); + +var scheme$4 = new Array(3).concat( + "e5f5e0a1d99b31a354", + "edf8e9bae4b374c476238b45", + "edf8e9bae4b374c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" +).map(colors); + +var Greens = ramp$1(scheme$4); + +var scheme$3 = new Array(3).concat( + "f0f0f0bdbdbd636363", + "f7f7f7cccccc969696525252", + "f7f7f7cccccc969696636363252525", + "f7f7f7d9d9d9bdbdbd969696636363252525", + "f7f7f7d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" +).map(colors); + +var Greys = ramp$1(scheme$3); + +var scheme$2 = new Array(3).concat( + "efedf5bcbddc756bb1", + "f2f0f7cbc9e29e9ac86a51a3", + "f2f0f7cbc9e29e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" +).map(colors); + +var Purples = ramp$1(scheme$2); + +var scheme$1 = new Array(3).concat( + "fee0d2fc9272de2d26", + "fee5d9fcae91fb6a4acb181d", + "fee5d9fcae91fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" +).map(colors); + +var Reds = ramp$1(scheme$1); + +var scheme = new Array(3).concat( + "fee6cefdae6be6550d", + "feeddefdbe85fd8d3cd94701", + "feeddefdbe85fd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" +).map(colors); + +var Oranges = ramp$1(scheme); + +function cividis(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " + + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " + + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) + + ")"; +} + +var cubehelix = cubehelixLong(cubehelix$3(300, 0.5, 0.0), cubehelix$3(-240, 0.5, 1.0)); + +var warm = cubehelixLong(cubehelix$3(-100, 0.75, 0.35), cubehelix$3(80, 1.50, 0.8)); + +var cool = cubehelixLong(cubehelix$3(260, 0.75, 0.35), cubehelix$3(80, 1.50, 0.8)); + +var c$2 = cubehelix$3(); + +function rainbow(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c$2.h = 360 * t - 100; + c$2.s = 1.5 - 1.5 * ts; + c$2.l = 0.8 - 0.9 * ts; + return c$2 + ""; +} + +var c$1 = rgb(), + pi_1_3 = Math.PI / 3, + pi_2_3 = Math.PI * 2 / 3; + +function sinebow(t) { + var x; + t = (0.5 - t) * Math.PI; + c$1.r = 255 * (x = Math.sin(t)) * x; + c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; + c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; + return c$1 + ""; +} + +function turbo(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " + + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " + + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) + + ")"; +} + +function ramp(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} + +var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + +var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + +var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + +var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + +function constant$1(x) { + return function constant() { + return x; + }; +} + +var abs = Math.abs; +var atan2 = Math.atan2; +var cos = Math.cos; +var max = Math.max; +var min = Math.min; +var sin = Math.sin; +var sqrt = Math.sqrt; + +var epsilon = 1e-12; +var pi = Math.PI; +var halfPi = pi / 2; +var tau = 2 * pi; + +function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); +} + +function asin(x) { + return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); +} + +function arcInnerRadius(d) { + return d.innerRadius; +} + +function arcOuterRadius(d) { + return d.outerRadius; +} + +function arcStartAngle(d) { + return d.startAngle; +} + +function arcEndAngle(d) { + return d.endAngle; +} + +function arcPadAngle(d) { + return d && d.padAngle; // Note: optional! +} + +function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = y32 * x10 - x32 * y10; + if (t * t < epsilon) return; + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + return [x0 + t * x10, y0 + t * y10]; +} + +// Compute perpendicular offset line of length rc. +// http://mathworld.wolfram.com/Circle-LineIntersection.html +function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, + y01 = y0 - y1, + lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), + ox = lo * y01, + oy = -lo * x01, + x11 = x0 + ox, + y11 = y0 + oy, + x10 = x1 + ox, + y10 = y1 + oy, + x00 = (x11 + x10) / 2, + y00 = (y11 + y10) / 2, + dx = x10 - x11, + dy = y10 - y11, + d2 = dx * dx + dy * dy, + r = r1 - rc, + D = x11 * y10 - x10 * y11, + d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)), + cx0 = (D * dy - dx * d) / d2, + cy0 = (-D * dx - dy * d) / d2, + cx1 = (D * dy + dx * d) / d2, + cy1 = (-D * dx + dy * d) / d2, + dx0 = cx0 - x00, + dy0 = cy0 - y00, + dx1 = cx1 - x00, + dy1 = cy1 - y00; + + // Pick the closer of the two intersection points. + // TODO Is there a faster way to determine which intersection to use? + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; +} + +function arc() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant$1(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; + + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi, + a1 = endAngle.apply(this, arguments) - halfPi, + da = abs(a1 - a0), + cw = a1 > a0; + + if (!context) context = buffer = path(); + + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) r = r1, r1 = r0, r0 = r; + + // Is it a point? + if (!(r1 > epsilon)) context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau - epsilon) { + context.moveTo(r1 * cos(a0), r1 * sin(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon) { + context.moveTo(r0 * cos(a1), r0 * sin(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } + + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), + rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon) { + var p0 = asin(rp / r0 * sin(ap)), + p1 = asin(rp / r1 * sin(ap)); + if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * cos(a01), + y01 = r1 * sin(a01), + x10 = r0 * cos(a10), + y10 = r0 * sin(a10); + + // Apply rounded corners? + if (rc > epsilon) { + var x11 = r1 * cos(a11), + y11 = r1 * sin(a11), + x00 = r0 * cos(a00), + y00 = r0 * sin(a00), + oc; + + // Restrict the corner radius according to the sector angle. + if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), + lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min(rc, (r0 - lc) / (kc - 1)); + rc1 = min(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon)) context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the outer ring just a circular arc? + else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the inner ring just a circular arc? + else context.arc(0, 0, r0, a10, a00, cw); + } + + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2; + return [cos(a) * r, sin(a) * r]; + }; + + arc.innerRadius = function(_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : innerRadius; + }; + + arc.outerRadius = function(_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : outerRadius; + }; + + arc.cornerRadius = function(_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$1(+_), arc) : cornerRadius; + }; + + arc.padRadius = function(_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), arc) : padRadius; + }; + + arc.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : startAngle; + }; + + arc.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : endAngle; + }; + + arc.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$1(+_), arc) : padAngle; + }; + + arc.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; +} + +var slice = Array.prototype.slice; + +function array(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} + +function Linear(context) { + this._context = context; +} + +Linear.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: this._context.lineTo(x, y); break; + } + } +}; + +function curveLinear(context) { + return new Linear(context); +} + +function x(p) { + return p[0]; +} + +function y(p) { + return p[1]; +} + +function line(x$1, y$1) { + var defined = constant$1(true), + context = null, + curve = curveLinear, + output = null; + + x$1 = typeof x$1 === "function" ? x$1 : (x$1 === undefined) ? x : constant$1(x$1); + y$1 = typeof y$1 === "function" ? y$1 : (y$1 === undefined) ? y : constant$1(y$1); + + function line(data) { + var i, + n = (data = array(data)).length, + d, + defined0 = false, + buffer; + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) output.lineStart(); + else output.lineEnd(); + } + if (defined0) output.point(+x$1(d, i, data), +y$1(d, i, data)); + } + + if (buffer) return output = null, buffer + "" || null; + } + + line.x = function(_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant$1(+_), line) : x$1; + }; + + line.y = function(_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant$1(+_), line) : y$1; + }; + + line.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$1(!!_), line) : defined; + }; + + line.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + + line.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + + return line; +} + +function area(x0, y0, y1) { + var x1 = null, + defined = constant$1(true), + context = null, + curve = curveLinear, + output = null; + + x0 = typeof x0 === "function" ? x0 : (x0 === undefined) ? x : constant$1(+x0); + y0 = typeof y0 === "function" ? y0 : (y0 === undefined) ? constant$1(0) : constant$1(+y0); + y1 = typeof y1 === "function" ? y1 : (y1 === undefined) ? y : constant$1(+y1); + + function area(data) { + var i, + j, + k, + n = (data = array(data)).length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } + } + + if (buffer) return output = null, buffer + "" || null; + } + + function arealine() { + return line().defined(defined).curve(curve).context(context); + } + + area.x = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$1(+_), x1 = null, area) : x0; + }; + + area.x0 = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$1(+_), area) : x0; + }; + + area.x1 = function(_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), area) : x1; + }; + + area.y = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$1(+_), y1 = null, area) : y0; + }; + + area.y0 = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$1(+_), area) : y0; + }; + + area.y1 = function(_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$1(+_), area) : y1; + }; + + area.lineX0 = + area.lineY0 = function() { + return arealine().x(x0).y(y0); + }; + + area.lineY1 = function() { + return arealine().x(x0).y(y1); + }; + + area.lineX1 = function() { + return arealine().x(x1).y(y0); + }; + + area.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$1(!!_), area) : defined; + }; + + area.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; + + area.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; + + return area; +} + +function descending$1(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} + +function identity$1(d) { + return d; +} + +function pie() { + var value = identity$1, + sortValues = descending$1, + sort = null, + startAngle = constant$1(0), + endAngle = constant$1(tau), + padAngle = constant$1(0); + + function pie(data) { + var i, + n = (data = array(data)).length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; + + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } + + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); }); + else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); }); + + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } + + return arcs; + } + + pie.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$1(+_), pie) : value; + }; + + pie.sortValues = function(_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + }; + + pie.sort = function(_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; + }; + + pie.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : startAngle; + }; + + pie.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : endAngle; + }; + + pie.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$1(+_), pie) : padAngle; + }; + + return pie; +} + +var curveRadialLinear = curveRadial$1(curveLinear); + +function Radial(curve) { + this._curve = curve; +} + +Radial.prototype = { + areaStart: function() { + this._curve.areaStart(); + }, + areaEnd: function() { + this._curve.areaEnd(); + }, + lineStart: function() { + this._curve.lineStart(); + }, + lineEnd: function() { + this._curve.lineEnd(); + }, + point: function(a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + } +}; + +function curveRadial$1(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; +} + +function lineRadial(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function(_) { + return arguments.length ? c(curveRadial$1(_)) : c()._curve; + }; + + return l; +} + +function lineRadial$1() { + return lineRadial(line().curve(curveRadialLinear)); +} + +function areaRadial() { + var a = area().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0; + a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1; + a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0; + a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1; + + a.curve = function(_) { + return arguments.length ? c(curveRadial$1(_)) : c()._curve; + }; + + return a; +} + +function pointRadial(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; +} + +function linkSource(d) { + return d.source; +} + +function linkTarget(d) { + return d.target; +} + +function link(curve) { + var source = linkSource, + target = linkTarget, + x$1 = x, + y$1 = y, + context = null; + + function link() { + var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); + if (!context) context = buffer = path(); + curve(context, +x$1.apply(this, (argv[0] = s, argv)), +y$1.apply(this, argv), +x$1.apply(this, (argv[0] = t, argv)), +y$1.apply(this, argv)); + if (buffer) return context = null, buffer + "" || null; + } + + link.source = function(_) { + return arguments.length ? (source = _, link) : source; + }; + + link.target = function(_) { + return arguments.length ? (target = _, link) : target; + }; + + link.x = function(_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant$1(+_), link) : x$1; + }; + + link.y = function(_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant$1(+_), link) : y$1; + }; + + link.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; + + return link; +} + +function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); +} + +function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); +} + +function curveRadial(context, x0, y0, x1, y1) { + var p0 = pointRadial(x0, y0), + p1 = pointRadial(x0, y0 = (y0 + y1) / 2), + p2 = pointRadial(x1, y0), + p3 = pointRadial(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); +} + +function linkHorizontal() { + return link(curveHorizontal); +} + +function linkVertical() { + return link(curveVertical); +} + +function linkRadial() { + var l = link(curveRadial); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; +} + +var circle = { + draw: function(context, size) { + var r = Math.sqrt(size / pi); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau); + } +}; + +var cross = { + draw: function(context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } +}; + +var tan30 = Math.sqrt(1 / 3), + tan30_2 = tan30 * 2; + +var diamond = { + draw: function(context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } +}; + +var ka = 0.89081309152928522810, + kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10), + kx = Math.sin(tau / 10) * kr, + ky = -Math.cos(tau / 10) * kr; + +var star = { + draw: function(context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); + } + context.closePath(); + } +}; + +var square = { + draw: function(context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } +}; + +var sqrt3 = Math.sqrt(3); + +var triangle = { + draw: function(context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); + } +}; + +var c = -0.5, + s = Math.sqrt(3) / 2, + k = 1 / Math.sqrt(12), + a = (k / 2 + 1) * 3; + +var wye = { + draw: function(context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c * x0 - s * y0, s * x0 + c * y0); + context.lineTo(c * x1 - s * y1, s * x1 + c * y1); + context.lineTo(c * x2 - s * y2, s * x2 + c * y2); + context.lineTo(c * x0 + s * y0, c * y0 - s * x0); + context.lineTo(c * x1 + s * y1, c * y1 - s * x1); + context.lineTo(c * x2 + s * y2, c * y2 - s * x2); + context.closePath(); + } +}; + +var symbols = [ + circle, + cross, + diamond, + square, + star, + triangle, + wye +]; + +function symbol(type, size) { + var context = null; + type = typeof type === "function" ? type : constant$1(type || circle); + size = typeof size === "function" ? size : constant$1(size === undefined ? 64 : +size); + + function symbol() { + var buffer; + if (!context) context = buffer = path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; + } + + symbol.type = function(_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant$1(_), symbol) : type; + }; + + symbol.size = function(_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant$1(+_), symbol) : size; + }; + + symbol.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; + + return symbol; +} + +function noop() {} + +function point$3(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); +} + +function Basis(context) { + this._context = context; +} + +Basis.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 3: point$3(this, this._x1, this._y1); // proceed + case 2: this._context.lineTo(this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basis(context) { + return new Basis(context); +} + +function BasisClosed(context) { + this._context = context; +} + +BasisClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x2, this._y2); + this._context.closePath(); + break; + } + case 2: { + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x2, this._y2); + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x2 = x, this._y2 = y; break; + case 1: this._point = 2; this._x3 = x, this._y3 = y; break; + case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basisClosed(context) { + return new BasisClosed(context); +} + +function BasisOpen(context) { + this._context = context; +} + +BasisOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; + case 3: this._point = 4; // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basisOpen(context) { + return new BasisOpen(context); +} + +class Bump { + constructor(context, x) { + this._context = context; + this._x = x; + } + areaStart() { + this._line = 0; + } + areaEnd() { + this._line = NaN; + } + lineStart() { + this._point = 0; + } + lineEnd() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + } + point(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: { + this._point = 1; + if (this._line) this._context.lineTo(x, y); + else this._context.moveTo(x, y); + break; + } + case 1: this._point = 2; // proceed + default: { + if (this._x) this._context.bezierCurveTo(this._x0 = (this._x0 + x) / 2, this._y0, this._x0, y, x, y); + else this._context.bezierCurveTo(this._x0, this._y0 = (this._y0 + y) / 2, x, this._y0, x, y); + break; + } + } + this._x0 = x, this._y0 = y; + } +} + +function bumpX(context) { + return new Bump(context, true); +} + +function bumpY(context) { + return new Bump(context, false); +} + +function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; +} + +Bundle.prototype = { + lineStart: function() { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function() { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +var bundle = (function custom(beta) { + + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + + bundle.beta = function(beta) { + return custom(+beta); + }; + + return bundle; +})(0.85); + +function point$2(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); +} + +function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +Cardinal.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: point$2(this, this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; this._x1 = x, this._y1 = y; break; + case 2: this._point = 3; // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinal = (function custom(tension) { + + function cardinal(context) { + return new Cardinal(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinalClosed = (function custom(tension) { + + function cardinal(context) { + return new CardinalClosed(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinalOpen = (function custom(tension) { + + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function point$1(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); +} + +function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRom.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: this.point(this._x2, this._y2); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; // proceed + default: point$1(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRom = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$1(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRomClosed = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$1(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRomOpen = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function LinearClosed(context) { + this._context = context; +} + +LinearClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._point) this._context.closePath(); + }, + point: function(x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); + } +}; + +function linearClosed(context) { + return new LinearClosed(context); +} + +function sign(x) { + return x < 0 ? -1 : 1; +} + +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. +function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; +} + +// Calculate a one-sided slope. +function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; +} + +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bézier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". +function point(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); +} + +function MonotoneX(context) { + this._context = context; +} + +MonotoneX.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x1, this._y1); break; + case 3: point(this, this._t0, slope2(this, this._t0)); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break; + default: point(this, this._t0, t1 = slope3(this, x, y)); break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } +}; + +function MonotoneY(context) { + this._context = new ReflectContext(context); +} + +(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { + MonotoneX.prototype.point.call(this, y, x); +}; + +function ReflectContext(context) { + this._context = context; +} + +ReflectContext.prototype = { + moveTo: function(x, y) { this._context.moveTo(y, x); }, + closePath: function() { this._context.closePath(); }, + lineTo: function(x, y) { this._context.lineTo(y, x); }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } +}; + +function monotoneX(context) { + return new MonotoneX(context); +} + +function monotoneY(context) { + return new MonotoneY(context); +} + +function Natural(context) { + this._context = context; +} + +Natural.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = []; + this._y = []; + }, + lineEnd: function() { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. +function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; +} + +function natural(context) { + return new Natural(context); +} + +function Step(context, t) { + this._context = context; + this._t = t; +} + +Step.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function() { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } +}; + +function step(context) { + return new Step(context, 0.5); +} + +function stepBefore(context) { + return new Step(context, 0); +} + +function stepAfter(context) { + return new Step(context, 1); +} + +function none$1(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } +} + +function none(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; +} + +function stackValue(d, key) { + return d[key]; +} + +function stackSeries(key) { + const series = []; + series.key = key; + return series; +} + +function stack() { + var keys = constant$1([]), + order = none, + offset = none$1, + value = stackValue; + + function stack(data) { + var sz = Array.from(keys.apply(this, arguments), stackSeries), + i, n = sz.length, j = -1, + oz; + + for (const d of data) { + for (i = 0, ++j; i < n; ++i) { + (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d; + } + } + + for (i = 0, oz = array(order(sz)); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function(_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant$1(Array.from(_)), stack) : keys; + }; + + stack.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$1(+_), stack) : value; + }; + + stack.order = function(_) { + return arguments.length ? (order = _ == null ? none : typeof _ === "function" ? _ : constant$1(Array.from(_)), stack) : order; + }; + + stack.offset = function(_) { + return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset; + }; + + return stack; +} + +function expand(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none$1(series, order); +} + +function diverging(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = 0, d[1] = dy; + } + } + } +} + +function silhouette(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none$1(series, order); +} + +function wiggle(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none$1(series, order); +} + +function appearance(series) { + var peaks = series.map(peak); + return none(series).sort(function(a, b) { return peaks[a] - peaks[b]; }); +} + +function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; + return j; +} + +function ascending(series) { + var sums = series.map(sum); + return none(series).sort(function(a, b) { return sums[a] - sums[b]; }); +} + +function sum(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; +} + +function descending(series) { + return ascending(series).reverse(); +} + +function insideOut(series) { + var n = series.length, + i, + j, + sums = series.map(sum), + order = appearance(series), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); +} + +function reverse(series) { + return none(series).reverse(); +} + +var constant = x => () => x; + +function ZoomEvent(type, { + sourceEvent, + target, + transform, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + transform: {value: transform, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} + +function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; +} + +Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function(x) { + return x * this.k + this.x; + }, + applyY: function(y) { + return y * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x) { + return (x - this.x) / this.k; + }, + invertY: function(y) { + return (y - this.y) / this.k; + }, + rescaleX: function(x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function(y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } +}; + +var identity = new Transform(1, 0, 0); + +transform.prototype = Transform.prototype; + +function transform(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity; + return node.__zoom; +} + +function nopropagation(event) { + event.stopImmediatePropagation(); +} + +function noevent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// Ignore right-click, since that should open the context menu. +// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event +function defaultFilter(event) { + return (!event.ctrlKey || event.type === 'wheel') && !event.button; +} + +function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; +} + +function defaultTransform() { + return this.__zoom || identity; +} + +function defaultWheelDelta(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1); +} + +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function defaultConstrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); +} + +function zoom() { + var filter = defaultFilter, + extent = defaultExtent, + constrain = defaultConstrain, + wheelDelta = defaultWheelDelta, + touchable = defaultTouchable, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = interpolateZoom, + listeners = dispatch("start", "zoom", "end"), + touchstarting, + touchfirst, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0, + tapDistance = 10; + + function zoom(selection) { + selection + .property("__zoom", defaultTransform) + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .filter(touchable) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + zoom.transform = function(collection, transform, point, event) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); + if (collection !== selection) { + schedule(collection, transform, point, event); + } else { + selection.interrupt().each(function() { + gesture(this, arguments) + .event(event) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function(selection, k, p, event) { + zoom.scaleTo(selection, function() { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p, event); + }; + + zoom.scaleTo = function(selection, k, p, event) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p, event); + }; + + zoom.translateBy = function(selection, x, y, event) { + zoom.transform(selection, function() { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments), translateExtent); + }, null, event); + }; + + zoom.translateTo = function(selection, x, y, p, event) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p, event); + }; + + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition, transform, point, event) { + transition + .on("start.zoom", function() { gesture(this, arguments).event(event).start(); }) + .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).event(event).end(); }) + .tween("zoom", function() { + var that = this, + args = arguments, + g = gesture(that, args).event(event), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } + g.zoom(null, t); + }; + }); + } + + function gesture(that, args, clean) { + return (!clean && that.__zooming) || new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.sourceEvent = null; + this.extent = extent.apply(that, args); + this.taps = 0; + } + + Gesture.prototype = { + event: function(event) { + if (event) this.sourceEvent = event; + return this; + }, + start: function() { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function(type) { + var d = select(this.that).datum(); + listeners.call( + type, + this.that, + new ZoomEvent(type, { + sourceEvent: this.sourceEvent, + target: zoom, + type, + transform: this.that.__zoom, + dispatch: listeners + }), + d + ); + } + }; + + function wheeled(event, ...args) { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, args).event(event), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = pointer(event); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } + + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; + + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + interrupt(this); + g.start(); + } + + noevent(event); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } + + function mousedowned(event, ...args) { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, args, true).event(event), + v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = pointer(event, currentTarget), + currentTarget = event.currentTarget, + x0 = event.clientX, + y0 = event.clientY; + + dragDisable(event.view); + nopropagation(event); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt(this); + g.start(); + + function mousemoved(event) { + noevent(event); + if (!g.moved) { + var dx = event.clientX - x0, dy = event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.event(event) + .zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent)); + } + + function mouseupped(event) { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(event.view, g.moved); + noevent(event); + g.event(event).end(); + } + } + + function dblclicked(event, ...args) { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this), + p1 = t0.invert(p0), + k1 = t0.k * (event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent); + + noevent(event); + if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event); + else select(this).call(zoom.transform, t1, p0, event); + } + + function touchstarted(event, ...args) { + if (!filter.apply(this, arguments)) return; + var touches = event.touches, + n = touches.length, + g = gesture(this, args, event.changedTouches.length === n).event(event), + started, i, t, p; + + nopropagation(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer(t, this); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + + if (touchstarting) touchstarting = clearTimeout(touchstarting); + + if (started) { + if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); + interrupt(this); + g.start(); + } + } + + function touchmoved(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, i, t, p, l; + + noevent(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer(t, this); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } + else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + + function touchended(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, i, t; + + nopropagation(event); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. + if (g.taps === 2) { + t = pointer(t, this); + if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { + var p = select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + } + + zoom.wheelDelta = function(_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; + }; + + zoom.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; + }; + + zoom.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; + }; + + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function(_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + + zoom.translateExtent = function(_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + + zoom.constrain = function(_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function(_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + zoom.tapDistance = function(_) { + return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + }; + + return zoom; +} + +exports.Adder = Adder; +exports.Delaunay = Delaunay; +exports.FormatSpecifier = FormatSpecifier; +exports.InternMap = InternMap; +exports.InternSet = InternSet; +exports.Voronoi = Voronoi; +exports.active = active; +exports.arc = arc; +exports.area = area; +exports.areaRadial = areaRadial; +exports.ascending = ascending$3; +exports.autoType = autoType; +exports.axisBottom = axisBottom; +exports.axisLeft = axisLeft; +exports.axisRight = axisRight; +exports.axisTop = axisTop; +exports.bin = bin; +exports.bisect = bisectRight; +exports.bisectCenter = bisectCenter; +exports.bisectLeft = bisectLeft; +exports.bisectRight = bisectRight; +exports.bisector = bisector; +exports.blob = blob; +exports.brush = brush; +exports.brushSelection = brushSelection; +exports.brushX = brushX; +exports.brushY = brushY; +exports.buffer = buffer; +exports.chord = chord; +exports.chordDirected = chordDirected; +exports.chordTranspose = chordTranspose; +exports.cluster = cluster; +exports.color = color; +exports.contourDensity = density; +exports.contours = contours; +exports.count = count$1; +exports.create = create$1; +exports.creator = creator; +exports.cross = cross$2; +exports.csv = csv; +exports.csvFormat = csvFormat; +exports.csvFormatBody = csvFormatBody; +exports.csvFormatRow = csvFormatRow; +exports.csvFormatRows = csvFormatRows; +exports.csvFormatValue = csvFormatValue; +exports.csvParse = csvParse; +exports.csvParseRows = csvParseRows; +exports.cubehelix = cubehelix$3; +exports.cumsum = cumsum; +exports.curveBasis = basis; +exports.curveBasisClosed = basisClosed; +exports.curveBasisOpen = basisOpen; +exports.curveBumpX = bumpX; +exports.curveBumpY = bumpY; +exports.curveBundle = bundle; +exports.curveCardinal = cardinal; +exports.curveCardinalClosed = cardinalClosed; +exports.curveCardinalOpen = cardinalOpen; +exports.curveCatmullRom = catmullRom; +exports.curveCatmullRomClosed = catmullRomClosed; +exports.curveCatmullRomOpen = catmullRomOpen; +exports.curveLinear = curveLinear; +exports.curveLinearClosed = linearClosed; +exports.curveMonotoneX = monotoneX; +exports.curveMonotoneY = monotoneY; +exports.curveNatural = natural; +exports.curveStep = step; +exports.curveStepAfter = stepAfter; +exports.curveStepBefore = stepBefore; +exports.descending = descending$2; +exports.deviation = deviation; +exports.difference = difference; +exports.disjoint = disjoint; +exports.dispatch = dispatch; +exports.drag = drag; +exports.dragDisable = dragDisable; +exports.dragEnable = yesdrag; +exports.dsv = dsv; +exports.dsvFormat = dsvFormat; +exports.easeBack = backInOut; +exports.easeBackIn = backIn; +exports.easeBackInOut = backInOut; +exports.easeBackOut = backOut; +exports.easeBounce = bounceOut; +exports.easeBounceIn = bounceIn; +exports.easeBounceInOut = bounceInOut; +exports.easeBounceOut = bounceOut; +exports.easeCircle = circleInOut; +exports.easeCircleIn = circleIn; +exports.easeCircleInOut = circleInOut; +exports.easeCircleOut = circleOut; +exports.easeCubic = cubicInOut; +exports.easeCubicIn = cubicIn; +exports.easeCubicInOut = cubicInOut; +exports.easeCubicOut = cubicOut; +exports.easeElastic = elasticOut; +exports.easeElasticIn = elasticIn; +exports.easeElasticInOut = elasticInOut; +exports.easeElasticOut = elasticOut; +exports.easeExp = expInOut; +exports.easeExpIn = expIn; +exports.easeExpInOut = expInOut; +exports.easeExpOut = expOut; +exports.easeLinear = linear$1; +exports.easePoly = polyInOut; +exports.easePolyIn = polyIn; +exports.easePolyInOut = polyInOut; +exports.easePolyOut = polyOut; +exports.easeQuad = quadInOut; +exports.easeQuadIn = quadIn; +exports.easeQuadInOut = quadInOut; +exports.easeQuadOut = quadOut; +exports.easeSin = sinInOut; +exports.easeSinIn = sinIn; +exports.easeSinInOut = sinInOut; +exports.easeSinOut = sinOut; +exports.every = every; +exports.extent = extent$1; +exports.fcumsum = fcumsum; +exports.filter = filter$1; +exports.forceCenter = center; +exports.forceCollide = collide; +exports.forceLink = link$2; +exports.forceManyBody = manyBody; +exports.forceRadial = radial$1; +exports.forceSimulation = simulation; +exports.forceX = x$1; +exports.forceY = y$1; +exports.formatDefaultLocale = defaultLocale$1; +exports.formatLocale = formatLocale$1; +exports.formatSpecifier = formatSpecifier; +exports.fsum = fsum; +exports.geoAlbers = albers; +exports.geoAlbersUsa = albersUsa; +exports.geoArea = area$2; +exports.geoAzimuthalEqualArea = azimuthalEqualArea; +exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; +exports.geoAzimuthalEquidistant = azimuthalEquidistant; +exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; +exports.geoBounds = bounds; +exports.geoCentroid = centroid$1; +exports.geoCircle = circle$2; +exports.geoClipAntimeridian = clipAntimeridian; +exports.geoClipCircle = clipCircle; +exports.geoClipExtent = extent; +exports.geoClipRectangle = clipRectangle; +exports.geoConicConformal = conicConformal; +exports.geoConicConformalRaw = conicConformalRaw; +exports.geoConicEqualArea = conicEqualArea; +exports.geoConicEqualAreaRaw = conicEqualAreaRaw; +exports.geoConicEquidistant = conicEquidistant; +exports.geoConicEquidistantRaw = conicEquidistantRaw; +exports.geoContains = contains$1; +exports.geoDistance = distance; +exports.geoEqualEarth = equalEarth; +exports.geoEqualEarthRaw = equalEarthRaw; +exports.geoEquirectangular = equirectangular; +exports.geoEquirectangularRaw = equirectangularRaw; +exports.geoGnomonic = gnomonic; +exports.geoGnomonicRaw = gnomonicRaw; +exports.geoGraticule = graticule; +exports.geoGraticule10 = graticule10; +exports.geoIdentity = identity$4; +exports.geoInterpolate = interpolate; +exports.geoLength = length$1; +exports.geoMercator = mercator; +exports.geoMercatorRaw = mercatorRaw; +exports.geoNaturalEarth1 = naturalEarth1; +exports.geoNaturalEarth1Raw = naturalEarth1Raw; +exports.geoOrthographic = orthographic; +exports.geoOrthographicRaw = orthographicRaw; +exports.geoPath = index$2; +exports.geoProjection = projection; +exports.geoProjectionMutator = projectionMutator; +exports.geoRotation = rotation; +exports.geoStereographic = stereographic; +exports.geoStereographicRaw = stereographicRaw; +exports.geoStream = geoStream; +exports.geoTransform = transform$1; +exports.geoTransverseMercator = transverseMercator; +exports.geoTransverseMercatorRaw = transverseMercatorRaw; +exports.gray = gray; +exports.greatest = greatest; +exports.greatestIndex = greatestIndex; +exports.group = group; +exports.groupSort = groupSort; +exports.groups = groups; +exports.hcl = hcl$2; +exports.hierarchy = hierarchy; +exports.histogram = bin; +exports.hsl = hsl$2; +exports.html = html; +exports.image = image; +exports.index = index$4; +exports.indexes = indexes; +exports.interpolate = interpolate$2; +exports.interpolateArray = array$3; +exports.interpolateBasis = basis$2; +exports.interpolateBasisClosed = basisClosed$1; +exports.interpolateBlues = Blues; +exports.interpolateBrBG = BrBG; +exports.interpolateBuGn = BuGn; +exports.interpolateBuPu = BuPu; +exports.interpolateCividis = cividis; +exports.interpolateCool = cool; +exports.interpolateCubehelix = cubehelix$2; +exports.interpolateCubehelixDefault = cubehelix; +exports.interpolateCubehelixLong = cubehelixLong; +exports.interpolateDate = date$1; +exports.interpolateDiscrete = discrete; +exports.interpolateGnBu = GnBu; +exports.interpolateGreens = Greens; +exports.interpolateGreys = Greys; +exports.interpolateHcl = hcl$1; +exports.interpolateHclLong = hclLong; +exports.interpolateHsl = hsl$1; +exports.interpolateHslLong = hslLong; +exports.interpolateHue = hue; +exports.interpolateInferno = inferno; +exports.interpolateLab = lab; +exports.interpolateMagma = magma; +exports.interpolateNumber = interpolateNumber; +exports.interpolateNumberArray = numberArray; +exports.interpolateObject = object$1; +exports.interpolateOrRd = OrRd; +exports.interpolateOranges = Oranges; +exports.interpolatePRGn = PRGn; +exports.interpolatePiYG = PiYG; +exports.interpolatePlasma = plasma; +exports.interpolatePuBu = PuBu; +exports.interpolatePuBuGn = PuBuGn; +exports.interpolatePuOr = PuOr; +exports.interpolatePuRd = PuRd; +exports.interpolatePurples = Purples; +exports.interpolateRainbow = rainbow; +exports.interpolateRdBu = RdBu; +exports.interpolateRdGy = RdGy; +exports.interpolateRdPu = RdPu; +exports.interpolateRdYlBu = RdYlBu; +exports.interpolateRdYlGn = RdYlGn; +exports.interpolateReds = Reds; +exports.interpolateRgb = interpolateRgb; +exports.interpolateRgbBasis = rgbBasis; +exports.interpolateRgbBasisClosed = rgbBasisClosed; +exports.interpolateRound = interpolateRound; +exports.interpolateSinebow = sinebow; +exports.interpolateSpectral = Spectral; +exports.interpolateString = interpolateString; +exports.interpolateTransformCss = interpolateTransformCss; +exports.interpolateTransformSvg = interpolateTransformSvg; +exports.interpolateTurbo = turbo; +exports.interpolateViridis = viridis; +exports.interpolateWarm = warm; +exports.interpolateYlGn = YlGn; +exports.interpolateYlGnBu = YlGnBu; +exports.interpolateYlOrBr = YlOrBr; +exports.interpolateYlOrRd = YlOrRd; +exports.interpolateZoom = interpolateZoom; +exports.interrupt = interrupt; +exports.intersection = intersection; +exports.interval = interval; +exports.isoFormat = formatIso; +exports.isoParse = parseIso; +exports.json = json; +exports.lab = lab$1; +exports.lch = lch; +exports.least = least; +exports.leastIndex = leastIndex; +exports.line = line; +exports.lineRadial = lineRadial$1; +exports.linkHorizontal = linkHorizontal; +exports.linkRadial = linkRadial; +exports.linkVertical = linkVertical; +exports.local = local$1; +exports.map = map$1; +exports.matcher = matcher; +exports.max = max$3; +exports.maxIndex = maxIndex; +exports.mean = mean; +exports.median = median; +exports.merge = merge; +exports.min = min$2; +exports.minIndex = minIndex; +exports.namespace = namespace; +exports.namespaces = namespaces; +exports.nice = nice$1; +exports.now = now; +exports.pack = index$1; +exports.packEnclose = enclose; +exports.packSiblings = siblings; +exports.pairs = pairs; +exports.partition = partition; +exports.path = path; +exports.permute = permute; +exports.pie = pie; +exports.piecewise = piecewise; +exports.pointRadial = pointRadial; +exports.pointer = pointer; +exports.pointers = pointers; +exports.polygonArea = area$1; +exports.polygonCentroid = centroid; +exports.polygonContains = contains; +exports.polygonHull = hull; +exports.polygonLength = length; +exports.precisionFixed = precisionFixed; +exports.precisionPrefix = precisionPrefix; +exports.precisionRound = precisionRound; +exports.quadtree = quadtree; +exports.quantile = quantile$1; +exports.quantileSorted = quantileSorted; +exports.quantize = quantize$1; +exports.quickselect = quickselect; +exports.radialArea = areaRadial; +exports.radialLine = lineRadial$1; +exports.randomBates = bates; +exports.randomBernoulli = bernoulli; +exports.randomBeta = beta; +exports.randomBinomial = binomial; +exports.randomCauchy = cauchy; +exports.randomExponential = exponential; +exports.randomGamma = gamma; +exports.randomGeometric = geometric; +exports.randomInt = int; +exports.randomIrwinHall = irwinHall; +exports.randomLcg = lcg; +exports.randomLogNormal = logNormal; +exports.randomLogistic = logistic; +exports.randomNormal = normal; +exports.randomPareto = pareto; +exports.randomPoisson = poisson; +exports.randomUniform = uniform; +exports.randomWeibull = weibull; +exports.range = sequence; +exports.reduce = reduce; +exports.reverse = reverse$1; +exports.rgb = rgb; +exports.ribbon = ribbon$1; +exports.ribbonArrow = ribbonArrow; +exports.rollup = rollup; +exports.rollups = rollups; +exports.scaleBand = band; +exports.scaleDiverging = diverging$1; +exports.scaleDivergingLog = divergingLog; +exports.scaleDivergingPow = divergingPow; +exports.scaleDivergingSqrt = divergingSqrt; +exports.scaleDivergingSymlog = divergingSymlog; +exports.scaleIdentity = identity$2; +exports.scaleImplicit = implicit; +exports.scaleLinear = linear; +exports.scaleLog = log; +exports.scaleOrdinal = ordinal; +exports.scalePoint = point$4; +exports.scalePow = pow; +exports.scaleQuantile = quantile; +exports.scaleQuantize = quantize; +exports.scaleRadial = radial; +exports.scaleSequential = sequential; +exports.scaleSequentialLog = sequentialLog; +exports.scaleSequentialPow = sequentialPow; +exports.scaleSequentialQuantile = sequentialQuantile; +exports.scaleSequentialSqrt = sequentialSqrt; +exports.scaleSequentialSymlog = sequentialSymlog; +exports.scaleSqrt = sqrt$1; +exports.scaleSymlog = symlog; +exports.scaleThreshold = threshold; +exports.scaleTime = time; +exports.scaleUtc = utcTime; +exports.scan = scan; +exports.schemeAccent = Accent; +exports.schemeBlues = scheme$5; +exports.schemeBrBG = scheme$q; +exports.schemeBuGn = scheme$h; +exports.schemeBuPu = scheme$g; +exports.schemeCategory10 = category10; +exports.schemeDark2 = Dark2; +exports.schemeGnBu = scheme$f; +exports.schemeGreens = scheme$4; +exports.schemeGreys = scheme$3; +exports.schemeOrRd = scheme$e; +exports.schemeOranges = scheme; +exports.schemePRGn = scheme$p; +exports.schemePaired = Paired; +exports.schemePastel1 = Pastel1; +exports.schemePastel2 = Pastel2; +exports.schemePiYG = scheme$o; +exports.schemePuBu = scheme$c; +exports.schemePuBuGn = scheme$d; +exports.schemePuOr = scheme$n; +exports.schemePuRd = scheme$b; +exports.schemePurples = scheme$2; +exports.schemeRdBu = scheme$m; +exports.schemeRdGy = scheme$l; +exports.schemeRdPu = scheme$a; +exports.schemeRdYlBu = scheme$k; +exports.schemeRdYlGn = scheme$j; +exports.schemeReds = scheme$1; +exports.schemeSet1 = Set1; +exports.schemeSet2 = Set2; +exports.schemeSet3 = Set3; +exports.schemeSpectral = scheme$i; +exports.schemeTableau10 = Tableau10; +exports.schemeYlGn = scheme$8; +exports.schemeYlGnBu = scheme$9; +exports.schemeYlOrBr = scheme$7; +exports.schemeYlOrRd = scheme$6; +exports.select = select; +exports.selectAll = selectAll; +exports.selection = selection; +exports.selector = selector; +exports.selectorAll = selectorAll; +exports.shuffle = shuffle$1; +exports.shuffler = shuffler; +exports.some = some; +exports.sort = sort; +exports.stack = stack; +exports.stackOffsetDiverging = diverging; +exports.stackOffsetExpand = expand; +exports.stackOffsetNone = none$1; +exports.stackOffsetSilhouette = silhouette; +exports.stackOffsetWiggle = wiggle; +exports.stackOrderAppearance = appearance; +exports.stackOrderAscending = ascending; +exports.stackOrderDescending = descending; +exports.stackOrderInsideOut = insideOut; +exports.stackOrderNone = none; +exports.stackOrderReverse = reverse; +exports.stratify = stratify; +exports.style = styleValue; +exports.subset = subset; +exports.sum = sum$1; +exports.superset = superset; +exports.svg = svg; +exports.symbol = symbol; +exports.symbolCircle = circle; +exports.symbolCross = cross; +exports.symbolDiamond = diamond; +exports.symbolSquare = square; +exports.symbolStar = star; +exports.symbolTriangle = triangle; +exports.symbolWye = wye; +exports.symbols = symbols; +exports.text = text; +exports.thresholdFreedmanDiaconis = freedmanDiaconis; +exports.thresholdScott = scott; +exports.thresholdSturges = thresholdSturges; +exports.tickFormat = tickFormat; +exports.tickIncrement = tickIncrement; +exports.tickStep = tickStep; +exports.ticks = ticks; +exports.timeDay = day; +exports.timeDays = days; +exports.timeFormatDefaultLocale = defaultLocale; +exports.timeFormatLocale = formatLocale; +exports.timeFriday = friday; +exports.timeFridays = fridays; +exports.timeHour = hour; +exports.timeHours = hours; +exports.timeInterval = newInterval; +exports.timeMillisecond = millisecond; +exports.timeMilliseconds = milliseconds; +exports.timeMinute = minute; +exports.timeMinutes = minutes; +exports.timeMonday = monday; +exports.timeMondays = mondays; +exports.timeMonth = month; +exports.timeMonths = months; +exports.timeSaturday = saturday; +exports.timeSaturdays = saturdays; +exports.timeSecond = second; +exports.timeSeconds = seconds; +exports.timeSunday = sunday; +exports.timeSundays = sundays; +exports.timeThursday = thursday; +exports.timeThursdays = thursdays; +exports.timeTuesday = tuesday; +exports.timeTuesdays = tuesdays; +exports.timeWednesday = wednesday; +exports.timeWednesdays = wednesdays; +exports.timeWeek = sunday; +exports.timeWeeks = sundays; +exports.timeYear = year; +exports.timeYears = years; +exports.timeout = timeout; +exports.timer = timer; +exports.timerFlush = timerFlush; +exports.transition = transition; +exports.transpose = transpose; +exports.tree = tree; +exports.treemap = index; +exports.treemapBinary = binary; +exports.treemapDice = treemapDice; +exports.treemapResquarify = resquarify; +exports.treemapSlice = treemapSlice; +exports.treemapSliceDice = sliceDice; +exports.treemapSquarify = squarify; +exports.tsv = tsv; +exports.tsvFormat = tsvFormat; +exports.tsvFormatBody = tsvFormatBody; +exports.tsvFormatRow = tsvFormatRow; +exports.tsvFormatRows = tsvFormatRows; +exports.tsvFormatValue = tsvFormatValue; +exports.tsvParse = tsvParse; +exports.tsvParseRows = tsvParseRows; +exports.union = union; +exports.utcDay = utcDay; +exports.utcDays = utcDays; +exports.utcFriday = utcFriday; +exports.utcFridays = utcFridays; +exports.utcHour = utcHour; +exports.utcHours = utcHours; +exports.utcMillisecond = millisecond; +exports.utcMilliseconds = milliseconds; +exports.utcMinute = utcMinute; +exports.utcMinutes = utcMinutes; +exports.utcMonday = utcMonday; +exports.utcMondays = utcMondays; +exports.utcMonth = utcMonth; +exports.utcMonths = utcMonths; +exports.utcSaturday = utcSaturday; +exports.utcSaturdays = utcSaturdays; +exports.utcSecond = second; +exports.utcSeconds = seconds; +exports.utcSunday = utcSunday; +exports.utcSundays = utcSundays; +exports.utcThursday = utcThursday; +exports.utcThursdays = utcThursdays; +exports.utcTuesday = utcTuesday; +exports.utcTuesdays = utcTuesdays; +exports.utcWednesday = utcWednesday; +exports.utcWednesdays = utcWednesdays; +exports.utcWeek = utcSunday; +exports.utcWeeks = utcSundays; +exports.utcYear = utcYear; +exports.utcYears = utcYears; +exports.variance = variance; +exports.version = version; +exports.window = defaultView; +exports.xml = xml; +exports.zip = zip; +exports.zoom = zoom; +exports.zoomIdentity = identity; +exports.zoomTransform = transform; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/node_modules/d3/dist/d3.min.js b/node_modules/d3/dist/d3.min.js new file mode 100644 index 00000000..eb0ee042 --- /dev/null +++ b/node_modules/d3/dist/d3.min.js @@ -0,0 +1,2 @@ +// https://d3js.org v6.6.0 Copyright 2021 Mike Bostock +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).d3=t.d3||{})}(this,(function(t){"use strict";function n(t,n){return tn?1:t>=n?0:NaN}function e(t){let e=t,r=t;function i(t,n,e,i){for(null==e&&(e=0),null==i&&(i=t.length);e>>1;r(t[o],n)<0?e=o+1:i=o}return e}return 1===t.length&&(e=(n,e)=>t(n)-e,r=function(t){return(e,r)=>n(t(e),r)}(t)),{left:i,center:function(t,n,r,o){null==r&&(r=0),null==o&&(o=t.length);const a=i(t,n,r,o-1);return a>r&&e(t[a-1],n)>-e(t[a],n)?a-1:a},right:function(t,n,e,i){for(null==e&&(e=0),null==i&&(i=t.length);e>>1;r(t[o],n)>0?i=o:e=o+1}return e}}}function r(t){return null===t?NaN:+t}const i=e(n),o=i.right,a=i.left,u=e(r).center;function c(t,n){let e=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&++e;else{let r=-1;for(let i of t)null!=(i=n(i,++r,t))&&(i=+i)>=i&&++e}return e}function f(t){return 0|t.length}function s(t){return!(t>0)}function l(t){return"object"!=typeof t||"length"in t?t:Array.from(t)}function h(t,n){let e,r=0,i=0,o=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(e=n-i,i+=e/++r,o+=e*(n-i));else{let a=-1;for(let u of t)null!=(u=n(u,++a,t))&&(u=+u)>=u&&(e=u-i,i+=e/++r,o+=e*(u-i))}if(r>1)return o/(r-1)}function d(t,n){const e=h(t,n);return e?Math.sqrt(e):e}function p(t,n){let e,r;if(void 0===n)for(const n of t)null!=n&&(void 0===e?n>=n&&(e=r=n):(e>n&&(e=n),r=o&&(e=r=o):(e>o&&(e=o),r0){for(o=t[--i];i>0&&(n=o,e=t[--i],o=n+e,r=e-(o-n),!r););i>0&&(r<0&&t[i-1]<0||r>0&&t[i-1]>0)&&(e=2*r,n=o+e,e==n-o&&(o=n))}return o}}class y extends Map{constructor(t,n=x){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),null!=t)for(const[n,e]of t)this.set(n,e)}get(t){return super.get(_(this,t))}has(t){return super.has(_(this,t))}set(t,n){return super.set(b(this,t),n)}delete(t){return super.delete(m(this,t))}}class v extends Set{constructor(t,n=x){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),null!=t)for(const n of t)this.add(n)}has(t){return super.has(_(this,t))}add(t){return super.add(b(this,t))}delete(t){return super.delete(m(this,t))}}function _({_intern:t,_key:n},e){const r=n(e);return t.has(r)?t.get(r):e}function b({_intern:t,_key:n},e){const r=n(e);return t.has(r)?t.get(r):(t.set(r,e),e)}function m({_intern:t,_key:n},e){const r=n(e);return t.has(r)&&(e=t.get(e),t.delete(r)),e}function x(t){return null!==t&&"object"==typeof t?t.valueOf():t}function w(t){return t}function M(t,...n){return S(t,w,w,n)}function A(t,n,...e){return S(t,w,n,e)}function T(t){if(1!==t.length)throw new Error("duplicate key");return t[0]}function S(t,n,e,r){return function t(i,o){if(o>=r.length)return e(i);const a=new y,u=r[o++];let c=-1;for(const t of i){const n=u(t,++c,i),e=a.get(n);e?e.push(t):a.set(n,[t])}for(const[n,e]of a)a.set(n,t(e,o));return n(a)}(t,0)}function E(t,n){return Array.from(n,(n=>t[n]))}function k(t,...e){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");t=Array.from(t);let[r=n]=e;if(1===r.length||e.length>1){const i=Uint32Array.from(t,((t,n)=>n));return e.length>1?(e=e.map((n=>t.map(n))),i.sort(((t,r)=>{for(const i of e){const e=n(i[t],i[r]);if(e)return e}}))):(r=t.map(r),i.sort(((t,e)=>n(r[t],r[e])))),E(t,i)}return t.sort(r)}var N=Array.prototype.slice;function C(t){return function(){return t}}var P=Math.sqrt(50),z=Math.sqrt(10),D=Math.sqrt(2);function q(t,n,e){var r,i,o,a,u=-1;if(e=+e,(t=+t)===(n=+n)&&e>0)return[t];if((r=n0)for(t=Math.ceil(t/a),n=Math.floor(n/a),o=new Array(i=Math.ceil(n-t+1));++u=0?(o>=P?10:o>=z?5:o>=D?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(o>=P?10:o>=z?5:o>=D?2:1)}function F(t,n,e){var r=Math.abs(n-t)/Math.max(0,e),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),o=r/i;return o>=P?i*=10:o>=z?i*=5:o>=D&&(i*=2),n0?(t=Math.floor(t/i)*i,n=Math.ceil(n/i)*i):i<0&&(t=Math.ceil(t*i)/i,n=Math.floor(n*i)/i),r=i}}function U(t){return Math.ceil(Math.log(c(t))/Math.LN2)+1}function I(){var t=w,n=p,e=U;function r(r){Array.isArray(r)||(r=Array.from(r));var i,a,u=r.length,c=new Array(u);for(i=0;i=l)if(t>=l&&n===p){const t=R(s,l,e);isFinite(t)&&(t>0?l=(Math.floor(l/t)+1)*t:t<0&&(l=(Math.ceil(l*-t)+1)/-t))}else h.pop()}for(var d=h.length;h[0]<=s;)h.shift(),--d;for(;h[d-1]>l;)h.pop(),--d;var g,y=new Array(d+1);for(i=0;i<=d;++i)(g=y[i]=[]).x0=i>0?h[i-1]:s,g.x1=i=n)&&(e=n);else{let r=-1;for(let i of t)null!=(i=n(i,++r,t))&&(e=i)&&(e=i)}return e}function Y(t,n){let e;if(void 0===n)for(const n of t)null!=n&&(e>n||void 0===e&&n>=n)&&(e=n);else{let r=-1;for(let i of t)null!=(i=n(i,++r,t))&&(e>i||void 0===e&&i>=i)&&(e=i)}return e}function L(t,e,r=0,i=t.length-1,o=n){for(;i>r;){if(i-r>600){const n=i-r+1,a=e-r+1,u=Math.log(n),c=.5*Math.exp(2*u/3),f=.5*Math.sqrt(u*c*(n-c)/n)*(a-n/2<0?-1:1);L(t,e,Math.max(r,Math.floor(e-a*c/n+f)),Math.min(i,Math.floor(e+(n-a)*c/n+f)),o)}const n=t[e];let a=r,u=i;for(j(t,r,e),o(t[i],n)>0&&j(t,r,i);a0;)--u}0===o(t[r],n)?j(t,r,u):(++u,j(t,u,i)),u<=e&&(r=u+1),e<=u&&(i=u-1)}return t}function j(t,n,e){const r=t[n];t[n]=t[e],t[e]=r}function H(t,n,e){if(r=(t=Float64Array.from(function*(t,n){if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(yield n);else{let e=-1;for(let r of t)null!=(r=n(r,++e,t))&&(r=+r)>=r&&(yield r)}}(t,e))).length){if((n=+n)<=0||r<2)return Y(t);if(n>=1)return B(t);var r,i=(r-1)*n,o=Math.floor(i),a=B(L(t,o).subarray(0,o+1));return a+(Y(t.subarray(o+1))-a)*(i-o)}}function X(t,n,e=r){if(i=t.length){if((n=+n)<=0||i<2)return+e(t[0],0,t);if(n>=1)return+e(t[i-1],i-1,t);var i,o=(i-1)*n,a=Math.floor(o),u=+e(t[a],a,t);return u+(+e(t[a+1],a+1,t)-u)*(o-a)}}function G(t,n){let e,r=-1,i=-1;if(void 0===n)for(const n of t)++i,null!=n&&(e=n)&&(e=n,r=i);else for(let o of t)null!=(o=n(o,++i,t))&&(e=o)&&(e=o,r=i);return r}function V(t){return Array.from(function*(t){for(const n of t)yield*n}(t))}function $(t,n){let e,r=-1,i=-1;if(void 0===n)for(const n of t)++i,null!=n&&(e>n||void 0===e&&n>=n)&&(e=n,r=i);else for(let o of t)null!=(o=n(o,++i,t))&&(e>o||void 0===e&&o>=o)&&(e=o,r=i);return r}function W(t,n){return[t,n]}function Z(t,n,e){t=+t,n=+n,e=(i=arguments.length)<2?(n=t,t=0,1):i<3?1:+e;for(var r=-1,i=0|Math.max(0,Math.ceil((n-t)/e)),o=new Array(i);++r+t(n)}function st(t,n){return n=Math.max(0,t.bandwidth()-2*n)/2,t.round()&&(n=Math.round(n)),e=>+t(e)+n}function lt(){return!this.__axis}function ht(t,n){var e=[],r=null,i=null,o=6,a=6,u=3,c="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,f=1===t||4===t?-1:1,s=4===t||2===t?"x":"y",l=1===t||3===t?ut:ct;function h(h){var d=null==r?n.ticks?n.ticks.apply(n,e):n.domain():r,p=null==i?n.tickFormat?n.tickFormat.apply(n,e):ot:i,g=Math.max(o,0)+u,y=n.range(),v=+y[0]+c,_=+y[y.length-1]+c,b=(n.bandwidth?st:ft)(n.copy(),c),m=h.selection?h.selection():h,x=m.selectAll(".domain").data([null]),w=m.selectAll(".tick").data(d,n).order(),M=w.exit(),A=w.enter().append("g").attr("class","tick"),T=w.select("line"),S=w.select("text");x=x.merge(x.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),w=w.merge(A),T=T.merge(A.append("line").attr("stroke","currentColor").attr(s+"2",f*o)),S=S.merge(A.append("text").attr("fill","currentColor").attr(s,f*g).attr("dy",1===t?"0em":3===t?"0.71em":"0.32em")),h!==m&&(x=x.transition(h),w=w.transition(h),T=T.transition(h),S=S.transition(h),M=M.transition(h).attr("opacity",at).attr("transform",(function(t){return isFinite(t=b(t))?l(t+c):this.getAttribute("transform")})),A.attr("opacity",at).attr("transform",(function(t){var n=this.parentNode.__axis;return l((n&&isFinite(n=n(t))?n:b(t))+c)}))),M.remove(),x.attr("d",4===t||2===t?a?"M"+f*a+","+v+"H"+c+"V"+_+"H"+f*a:"M"+c+","+v+"V"+_:a?"M"+v+","+f*a+"V"+c+"H"+_+"V"+f*a:"M"+v+","+c+"H"+_),w.attr("opacity",1).attr("transform",(function(t){return l(b(t)+c)})),T.attr(s+"2",f*o),S.attr(s,f*g).text(p),m.filter(lt).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",2===t?"start":4===t?"end":"middle"),m.each((function(){this.__axis=b}))}return h.scale=function(t){return arguments.length?(n=t,h):n},h.ticks=function(){return e=it.call(arguments),h},h.tickArguments=function(t){return arguments.length?(e=null==t?[]:it.call(t),h):e.slice()},h.tickValues=function(t){return arguments.length?(r=null==t?null:it.call(t),h):r&&r.slice()},h.tickFormat=function(t){return arguments.length?(i=t,h):i},h.tickSize=function(t){return arguments.length?(o=a=+t,h):o},h.tickSizeInner=function(t){return arguments.length?(o=+t,h):o},h.tickSizeOuter=function(t){return arguments.length?(a=+t,h):a},h.tickPadding=function(t){return arguments.length?(u=+t,h):u},h.offset=function(t){return arguments.length?(c=+t,h):c},h}var dt={value:()=>{}};function pt(){for(var t,n=0,e=arguments.length,r={};n=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))}function vt(t,n){for(var e,r=0,i=t.length;r0)for(var e,r,i=new Array(e),o=0;o=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),mt.hasOwnProperty(n)?{space:mt[n],local:t}:t}function wt(t){return function(){var n=this.ownerDocument,e=this.namespaceURI;return e===bt&&n.documentElement.namespaceURI===bt?n.createElement(t):n.createElementNS(e,t)}}function Mt(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function At(t){var n=xt(t);return(n.local?Mt:wt)(n)}function Tt(){}function St(t){return null==t?Tt:function(){return this.querySelector(t)}}function Et(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function kt(){return[]}function Nt(t){return null==t?kt:function(){return this.querySelectorAll(t)}}function Ct(t){return function(){return this.matches(t)}}function Pt(t){return function(n){return n.matches(t)}}var zt=Array.prototype.find;function Dt(){return this.firstElementChild}var qt=Array.prototype.filter;function Rt(){return this.children}function Ft(t){return new Array(t.length)}function Ot(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}function Ut(t){return function(){return t}}function It(t,n,e,r,i,o){for(var a,u=0,c=n.length,f=o.length;un?1:t>=n?0:NaN}function jt(t){return function(){this.removeAttribute(t)}}function Ht(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Xt(t,n){return function(){this.setAttribute(t,n)}}function Gt(t,n){return function(){this.setAttributeNS(t.space,t.local,n)}}function Vt(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}}function $t(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}}function Wt(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function Zt(t){return function(){this.style.removeProperty(t)}}function Kt(t,n,e){return function(){this.style.setProperty(t,n,e)}}function Qt(t,n,e){return function(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}}function Jt(t,n){return t.style.getPropertyValue(n)||Wt(t).getComputedStyle(t,null).getPropertyValue(n)}function tn(t){return function(){delete this[t]}}function nn(t,n){return function(){this[t]=n}}function en(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}function rn(t){return t.trim().split(/^|\s+/)}function on(t){return t.classList||new an(t)}function an(t){this._node=t,this._names=rn(t.getAttribute("class")||"")}function un(t,n){for(var e=on(t),r=-1,i=n.length;++r=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}}))}function Tn(t){return function(){var n=this.__on;if(n){for(var e,r=0,i=-1,o=n.length;r=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var Cn=[null];function Pn(t,n){this._groups=t,this._parents=n}function zn(){return new Pn([[document.documentElement]],Cn)}function Dn(t){return"string"==typeof t?new Pn([[document.querySelector(t)]],[document.documentElement]):new Pn([[t]],Cn)}Pn.prototype=zn.prototype={constructor:Pn,select:function(t){"function"!=typeof t&&(t=St(t));for(var n=this._groups,e=n.length,r=new Array(e),i=0;i=x&&(x=m+1);!(b=y[x])&&++x=0;)(r=i[o])&&(a&&4^r.compareDocumentPosition(a)&&a.parentNode.insertBefore(r,a),a=r);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=Lt);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o1?this.each((null==n?Zt:"function"==typeof n?Qt:Kt)(t,n,null==e?"":e)):Jt(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?tn:"function"==typeof n?en:nn)(t,n)):this.node()[t]},classed:function(t,n){var e=rn(t+"");if(arguments.length<2){for(var r=on(this.node()),i=-1,o=e.length;++i()=>t;function Hn(t,{sourceEvent:n,subject:e,target:r,identifier:i,active:o,x:a,y:u,dx:c,dy:f,dispatch:s}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},subject:{value:e,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:i,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:u,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:f,enumerable:!0,configurable:!0},_:{value:s}})}function Xn(t){return!t.ctrlKey&&!t.button}function Gn(){return this.parentNode}function Vn(t,n){return null==n?{x:t.x,y:t.y}:n}function $n(){return navigator.maxTouchPoints||"ontouchstart"in this}function Wn(t,n,e){t.prototype=n.prototype=e,e.constructor=t}function Zn(t,n){var e=Object.create(t.prototype);for(var r in n)e[r]=n[r];return e}function Kn(){}Hn.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};var Qn=.7,Jn=1/Qn,te="\\s*([+-]?\\d+)\\s*",ne="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",ee="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",re=/^#([0-9a-f]{3,8})$/,ie=new RegExp("^rgb\\("+[te,te,te]+"\\)$"),oe=new RegExp("^rgb\\("+[ee,ee,ee]+"\\)$"),ae=new RegExp("^rgba\\("+[te,te,te,ne]+"\\)$"),ue=new RegExp("^rgba\\("+[ee,ee,ee,ne]+"\\)$"),ce=new RegExp("^hsl\\("+[ne,ee,ee]+"\\)$"),fe=new RegExp("^hsla\\("+[ne,ee,ee,ne]+"\\)$"),se={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function le(){return this.rgb().formatHex()}function he(){return this.rgb().formatRgb()}function de(t){var n,e;return t=(t+"").trim().toLowerCase(),(n=re.exec(t))?(e=n[1].length,n=parseInt(n[1],16),6===e?pe(n):3===e?new _e(n>>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):8===e?ge(n>>24&255,n>>16&255,n>>8&255,(255&n)/255):4===e?ge(n>>12&15|n>>8&240,n>>8&15|n>>4&240,n>>4&15|240&n,((15&n)<<4|15&n)/255):null):(n=ie.exec(t))?new _e(n[1],n[2],n[3],1):(n=oe.exec(t))?new _e(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=ae.exec(t))?ge(n[1],n[2],n[3],n[4]):(n=ue.exec(t))?ge(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=ce.exec(t))?we(n[1],n[2]/100,n[3]/100,1):(n=fe.exec(t))?we(n[1],n[2]/100,n[3]/100,n[4]):se.hasOwnProperty(t)?pe(se[t]):"transparent"===t?new _e(NaN,NaN,NaN,0):null}function pe(t){return new _e(t>>16&255,t>>8&255,255&t,1)}function ge(t,n,e,r){return r<=0&&(t=n=e=NaN),new _e(t,n,e,r)}function ye(t){return t instanceof Kn||(t=de(t)),t?new _e((t=t.rgb()).r,t.g,t.b,t.opacity):new _e}function ve(t,n,e,r){return 1===arguments.length?ye(t):new _e(t,n,e,null==r?1:r)}function _e(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function be(){return"#"+xe(this.r)+xe(this.g)+xe(this.b)}function me(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}function xe(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function we(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new Te(t,n,e,r)}function Me(t){if(t instanceof Te)return new Te(t.h,t.s,t.l,t.opacity);if(t instanceof Kn||(t=de(t)),!t)return new Te;if(t instanceof Te)return t;var n=(t=t.rgb()).r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),a=NaN,u=o-i,c=(o+i)/2;return u?(a=n===o?(e-r)/u+6*(e0&&c<1?0:a,new Te(a,u,c,t.opacity)}function Ae(t,n,e,r){return 1===arguments.length?Me(t):new Te(t,n,e,null==r?1:r)}function Te(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function Se(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}Wn(Kn,de,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:le,formatHex:le,formatHsl:function(){return Me(this).formatHsl()},formatRgb:he,toString:he}),Wn(_e,ve,Zn(Kn,{brighter:function(t){return t=null==t?Jn:Math.pow(Jn,t),new _e(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?Qn:Math.pow(Qn,t),new _e(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:be,formatHex:be,formatRgb:me,toString:me})),Wn(Te,Ae,Zn(Kn,{brighter:function(t){return t=null==t?Jn:Math.pow(Jn,t),new Te(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?Qn:Math.pow(Qn,t),new Te(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),n=isNaN(t)||isNaN(this.s)?0:this.s,e=this.l,r=e+(e<.5?e:1-e)*n,i=2*e-r;return new _e(Se(t>=240?t-240:t+120,i,r),Se(t,i,r),Se(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"hsl(":"hsla(")+(this.h||0)+", "+100*(this.s||0)+"%, "+100*(this.l||0)+"%"+(1===t?")":", "+t+")")}}));const Ee=Math.PI/180,ke=180/Math.PI,Ne=.96422,Ce=.82521,Pe=4/29,ze=6/29,De=3*ze*ze;function qe(t){if(t instanceof Fe)return new Fe(t.l,t.a,t.b,t.opacity);if(t instanceof je)return He(t);t instanceof _e||(t=ye(t));var n,e,r=Be(t.r),i=Be(t.g),o=Be(t.b),a=Oe((.2225045*r+.7168786*i+.0606169*o)/1);return r===i&&i===o?n=e=a:(n=Oe((.4360747*r+.3850649*i+.1430804*o)/Ne),e=Oe((.0139322*r+.0971045*i+.7141733*o)/Ce)),new Fe(116*a-16,500*(n-a),200*(a-e),t.opacity)}function Re(t,n,e,r){return 1===arguments.length?qe(t):new Fe(t,n,e,null==r?1:r)}function Fe(t,n,e,r){this.l=+t,this.a=+n,this.b=+e,this.opacity=+r}function Oe(t){return t>.008856451679035631?Math.pow(t,1/3):t/De+Pe}function Ue(t){return t>ze?t*t*t:De*(t-Pe)}function Ie(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function Be(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Ye(t){if(t instanceof je)return new je(t.h,t.c,t.l,t.opacity);if(t instanceof Fe||(t=qe(t)),0===t.a&&0===t.b)return new je(NaN,0=1?(e=1,n-1):Math.floor(e*n),i=t[r],o=t[r+1],a=r>0?t[r-1]:2*i-o,u=r()=>t;function ar(t,n){return function(e){return t+e*n}}function ur(t,n){var e=n-t;return e?ar(t,e>180||e<-180?e-360*Math.round(e/360):e):or(isNaN(t)?n:t)}function cr(t){return 1==(t=+t)?fr:function(n,e){return e-n?function(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(r){return Math.pow(t+r*n,e)}}(n,e,t):or(isNaN(n)?e:n)}}function fr(t,n){var e=n-t;return e?ar(t,e):or(isNaN(t)?n:t)}var sr=function t(n){var e=cr(n);function r(t,n){var r=e((t=ve(t)).r,(n=ve(n)).r),i=e(t.g,n.g),o=e(t.b,n.b),a=fr(t.opacity,n.opacity);return function(n){return t.r=r(n),t.g=i(n),t.b=o(n),t.opacity=a(n),t+""}}return r.gamma=t,r}(1);function lr(t){return function(n){var e,r,i=n.length,o=new Array(i),a=new Array(i),u=new Array(i);for(e=0;eo&&(i=n.slice(o,i),u[a]?u[a]+=i:u[++a]=i),(e=e[0])===(r=r[0])?u[a]?u[a]+=r:u[++a]=r:(u[++a]=null,c.push({i:a,x:_r(e,r)})),o=xr.lastIndex;return o180?n+=360:n-t>180&&(t+=360),o.push({i:e.push(i(e)+"rotate(",null,r)-2,x:_r(t,n)})):n&&e.push(i(e)+"rotate("+n+r)}(o.rotate,a.rotate,u,c),function(t,n,e,o){t!==n?o.push({i:e.push(i(e)+"skewX(",null,r)-2,x:_r(t,n)}):n&&e.push(i(e)+"skewX("+n+r)}(o.skewX,a.skewX,u,c),function(t,n,e,r,o,a){if(t!==e||n!==r){var u=o.push(i(o)+"scale(",null,",",null,")");a.push({i:u-4,x:_r(t,e)},{i:u-2,x:_r(n,r)})}else 1===e&&1===r||o.push(i(o)+"scale("+e+","+r+")")}(o.scaleX,o.scaleY,a.scaleX,a.scaleY,u,c),o=a=null,function(t){for(var n,e=-1,r=c.length;++e=0&&n._call.call(null,t),n=n._next;--Gr}function oi(){Zr=(Wr=Qr.now())+Kr,Gr=Vr=0;try{ii()}finally{Gr=0,function(){var t,n,e=Hr,r=1/0;for(;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:Hr=n);Xr=t,ui(r)}(),Zr=0}}function ai(){var t=Qr.now(),n=t-Wr;n>1e3&&(Kr-=n,Wr=t)}function ui(t){Gr||(Vr&&(Vr=clearTimeout(Vr)),t-Zr>24?(t<1/0&&(Vr=setTimeout(oi,t-Qr.now()-Kr)),$r&&($r=clearInterval($r))):($r||(Wr=Qr.now(),$r=setInterval(ai,1e3)),Gr=1,Jr(oi)))}function ci(t,n,e){var r=new ei;return n=null==n?0:+n,r.restart((e=>{r.stop(),t(e+n)}),n,e),r}ei.prototype=ri.prototype={constructor:ei,restart:function(t,n,e){if("function"!=typeof t)throw new TypeError("callback is not a function");e=(null==e?ti():+e)+(null==n?0:+n),this._next||Xr===this||(Xr?Xr._next=this:Hr=this,Xr=this),this._call=t,this._time=e,ui()},stop:function(){this._call&&(this._call=null,this._time=1/0,ui())}};var fi=pt("start","end","cancel","interrupt"),si=[];function li(t,n,e,r,i,o){var a=t.__transition;if(a){if(e in a)return}else t.__transition={};!function(t,n,e){var r,i=t.__transition;function o(t){e.state=1,e.timer.restart(a,e.delay,e.time),e.delay<=t&&a(t-e.delay)}function a(o){var f,s,l,h;if(1!==e.state)return c();for(f in i)if((h=i[f]).name===e.name){if(3===h.state)return ci(a);4===h.state?(h.state=6,h.timer.stop(),h.on.call("interrupt",t,t.__data__,h.index,h.group),delete i[f]):+f0)throw new Error("too late; already scheduled");return e}function di(t,n){var e=pi(t,n);if(e.state>3)throw new Error("too late; already running");return e}function pi(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function gi(t,n){var e,r,i,o=t.__transition,a=!0;if(o){for(i in n=null==n?null:n+"",o)(e=o[i]).name===n?(r=e.state>2&&e.state<5,e.state=6,e.timer.stop(),e.on.call(r?"interrupt":"cancel",t,t.__data__,e.index,e.group),delete o[i]):a=!1;a&&delete t.__transition}}function yi(t,n){var e,r;return function(){var i=di(this,t),o=i.tween;if(o!==e)for(var a=0,u=(r=e=o).length;a=0&&(t=t.slice(0,n)),!t||"start"===t}))}(n)?hi:di;return function(){var a=o(this,t),u=a.on;u!==r&&(i=(r=u).copy()).on(n,e),a.on=i}}var Fi=zn.prototype.constructor;function Oi(t){return function(){this.style.removeProperty(t)}}function Ui(t,n,e){return function(r){this.style.setProperty(t,n.call(this,r),e)}}function Ii(t,n,e){var r,i;function o(){var o=n.apply(this,arguments);return o!==i&&(r=(i=o)&&Ui(t,o,e)),r}return o._value=n,o}function Bi(t){return function(n){this.textContent=t.call(this,n)}}function Yi(t){var n,e;function r(){var r=t.apply(this,arguments);return r!==e&&(n=(e=r)&&Bi(r)),n}return r._value=t,r}var Li=0;function ji(t,n,e,r){this._groups=t,this._parents=n,this._name=e,this._id=r}function Hi(t){return zn().transition(t)}function Xi(){return++Li}var Gi=zn.prototype;ji.prototype=Hi.prototype={constructor:ji,select:function(t){var n=this._name,e=this._id;"function"!=typeof t&&(t=St(t));for(var r=this._groups,i=r.length,o=new Array(i),a=0;a()=>t;function mo(t,{sourceEvent:n,target:e,selection:r,mode:i,dispatch:o}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},selection:{value:r,enumerable:!0,configurable:!0},mode:{value:i,enumerable:!0,configurable:!0},_:{value:o}})}function xo(t){t.stopImmediatePropagation()}function wo(t){t.preventDefault(),t.stopImmediatePropagation()}var Mo={name:"drag"},Ao={name:"space"},To={name:"handle"},So={name:"center"};const{abs:Eo,max:ko,min:No}=Math;function Co(t){return[+t[0],+t[1]]}function Po(t){return[Co(t[0]),Co(t[1])]}var zo={name:"x",handles:["w","e"].map(Bo),input:function(t,n){return null==t?null:[[+t[0],n[0][1]],[+t[1],n[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},Do={name:"y",handles:["n","s"].map(Bo),input:function(t,n){return null==t?null:[[n[0][0],+t[0]],[n[1][0],+t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},qo={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(Bo),input:function(t){return null==t?null:Po(t)},output:function(t){return t}},Ro={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Fo={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},Oo={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},Uo={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},Io={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1};function Bo(t){return{type:t}}function Yo(t){return!t.ctrlKey&&!t.button}function Lo(){var t=this.ownerSVGElement||this;return t.hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}function jo(){return navigator.maxTouchPoints||"ontouchstart"in this}function Ho(t){for(;!t.__brush;)if(!(t=t.parentNode))return;return t.__brush}function Xo(t){return t[0][0]===t[1][0]||t[0][1]===t[1][1]}function Go(t){var n,e=Lo,r=Yo,i=jo,o=!0,a=pt("start","brush","end"),u=6;function c(n){var e=n.property("__brush",g).selectAll(".overlay").data([Bo("overlay")]);e.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",Ro.overlay).merge(e).each((function(){var t=Ho(this).extent;Dn(this).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1])})),n.selectAll(".selection").data([Bo("selection")]).enter().append("rect").attr("class","selection").attr("cursor",Ro.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var r=n.selectAll(".handle").data(t.handles,(function(t){return t.type}));r.exit().remove(),r.enter().append("rect").attr("class",(function(t){return"handle handle--"+t.type})).attr("cursor",(function(t){return Ro[t.type]})),n.each(f).attr("fill","none").attr("pointer-events","all").on("mousedown.brush",h).filter(i).on("touchstart.brush",h).on("touchmove.brush",d).on("touchend.brush touchcancel.brush",p).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function f(){var t=Dn(this),n=Ho(this).selection;n?(t.selectAll(".selection").style("display",null).attr("x",n[0][0]).attr("y",n[0][1]).attr("width",n[1][0]-n[0][0]).attr("height",n[1][1]-n[0][1]),t.selectAll(".handle").style("display",null).attr("x",(function(t){return"e"===t.type[t.type.length-1]?n[1][0]-u/2:n[0][0]-u/2})).attr("y",(function(t){return"s"===t.type[0]?n[1][1]-u/2:n[0][1]-u/2})).attr("width",(function(t){return"n"===t.type||"s"===t.type?n[1][0]-n[0][0]+u:u})).attr("height",(function(t){return"e"===t.type||"w"===t.type?n[1][1]-n[0][1]+u:u}))):t.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}function s(t,n,e){var r=t.__brush.emitter;return!r||e&&r.clean?new l(t,n,e):r}function l(t,n,e){this.that=t,this.args=n,this.state=t.__brush,this.active=0,this.clean=e}function h(e){if((!n||e.touches)&&r.apply(this,arguments)){var i,a,u,c,l,h,d,p,g,y,v,_=this,b=e.target.__data__.type,m="selection"===(o&&e.metaKey?b="overlay":b)?Mo:o&&e.altKey?So:To,x=t===Do?null:Uo[b],w=t===zo?null:Io[b],M=Ho(_),A=M.extent,T=M.selection,S=A[0][0],E=A[0][1],k=A[1][0],N=A[1][1],C=0,P=0,z=x&&w&&o&&e.shiftKey,D=Array.from(e.touches||[e],(t=>{const n=t.identifier;return(t=Un(t,_)).point0=t.slice(),t.identifier=n,t}));if("overlay"===b){T&&(g=!0);const n=[D[0],D[1]||D[0]];M.selection=T=[[i=t===Do?S:No(n[0][0],n[1][0]),u=t===zo?E:No(n[0][1],n[1][1])],[l=t===Do?k:ko(n[0][0],n[1][0]),d=t===zo?N:ko(n[0][1],n[1][1])]],D.length>1&&I()}else i=T[0][0],u=T[0][1],l=T[1][0],d=T[1][1];a=i,c=u,h=l,p=d;var q=Dn(_).attr("pointer-events","none"),R=q.selectAll(".overlay").attr("cursor",Ro[b]);gi(_);var F=s(_,arguments,!0).beforestart();if(e.touches)F.moved=U,F.ended=B;else{var O=Dn(e.view).on("mousemove.brush",U,!0).on("mouseup.brush",B,!0);o&&O.on("keydown.brush",Y,!0).on("keyup.brush",L,!0),Yn(e.view)}f.call(_),F.start(e,m.name)}function U(t){for(const n of t.changedTouches||[t])for(const t of D)t.identifier===n.identifier&&(t.cur=Un(n,_));if(z&&!y&&!v&&1===D.length){const t=D[0];Eo(t.cur[0]-t[0])>Eo(t.cur[1]-t[1])?v=!0:y=!0}for(const t of D)t.cur&&(t[0]=t.cur[0],t[1]=t.cur[1]);g=!0,wo(t),I(t)}function I(t){const n=D[0],e=n.point0;var r;switch(C=n[0]-e[0],P=n[1]-e[1],m){case Ao:case Mo:x&&(C=ko(S-i,No(k-l,C)),a=i+C,h=l+C),w&&(P=ko(E-u,No(N-d,P)),c=u+P,p=d+P);break;case To:D[1]?(x&&(a=ko(S,No(k,D[0][0])),h=ko(S,No(k,D[1][0])),x=1),w&&(c=ko(E,No(N,D[0][1])),p=ko(E,No(N,D[1][1])),w=1)):(x<0?(C=ko(S-i,No(k-i,C)),a=i+C,h=l):x>0&&(C=ko(S-l,No(k-l,C)),a=i,h=l+C),w<0?(P=ko(E-u,No(N-u,P)),c=u+P,p=d):w>0&&(P=ko(E-d,No(N-d,P)),c=u,p=d+P));break;case So:x&&(a=ko(S,No(k,i-C*x)),h=ko(S,No(k,l+C*x))),w&&(c=ko(E,No(N,u-P*w)),p=ko(E,No(N,d+P*w)))}h0&&(i=a-C),w<0?d=p-P:w>0&&(u=c-P),m=Ao,R.attr("cursor",Ro.selection),I());break;default:return}wo(t)}function L(t){switch(t.keyCode){case 16:z&&(y=v=z=!1,I());break;case 18:m===So&&(x<0?l=h:x>0&&(i=a),w<0?d=p:w>0&&(u=c),m=To,I());break;case 32:m===Ao&&(t.altKey?(x&&(l=h-C*x,i=a+C*x),w&&(d=p-P*w,u=c+P*w),m=So):(x<0?l=h:x>0&&(i=a),w<0?d=p:w>0&&(u=c),m=To),R.attr("cursor",Ro[b]),I());break;default:return}wo(t)}}function d(t){s(this,arguments).moved(t)}function p(t){s(this,arguments).ended(t)}function g(){var n=this.__brush||{selection:null};return n.extent=Po(e.apply(this,arguments)),n.dim=t,n}return c.move=function(n,e){n.tween?n.on("start.brush",(function(t){s(this,arguments).beforestart().start(t)})).on("interrupt.brush end.brush",(function(t){s(this,arguments).end(t)})).tween("brush",(function(){var n=this,r=n.__brush,i=s(n,arguments),o=r.selection,a=t.input("function"==typeof e?e.apply(this,arguments):e,r.extent),u=Mr(o,a);function c(t){r.selection=1===t&&null===a?null:u(t),f.call(n),i.brush()}return null!==o&&null!==a?c:c(1)})):n.each((function(){var n=this,r=arguments,i=n.__brush,o=t.input("function"==typeof e?e.apply(n,r):e,i.extent),a=s(n,r).beforestart();gi(n),i.selection=null===o?null:o,f.call(n),a.start().brush().end()}))},c.clear=function(t){c.move(t,null)},l.prototype={beforestart:function(){return 1==++this.active&&(this.state.emitter=this,this.starting=!0),this},start:function(t,n){return this.starting?(this.starting=!1,this.emit("start",t,n)):this.emit("brush",t),this},brush:function(t,n){return this.emit("brush",t,n),this},end:function(t,n){return 0==--this.active&&(delete this.state.emitter,this.emit("end",t,n)),this},emit:function(n,e,r){var i=Dn(this.that).datum();a.call(n,this.that,new mo(n,{sourceEvent:e,target:c,selection:t.output(this.state.selection),mode:r,dispatch:a}),i)}},c.extent=function(t){return arguments.length?(e="function"==typeof t?t:bo(Po(t)),c):e},c.filter=function(t){return arguments.length?(r="function"==typeof t?t:bo(!!t),c):r},c.touchable=function(t){return arguments.length?(i="function"==typeof t?t:bo(!!t),c):i},c.handleSize=function(t){return arguments.length?(u=+t,c):u},c.keyModifiers=function(t){return arguments.length?(o=!!t,c):o},c.on=function(){var t=a.on.apply(a,arguments);return t===a?c:t},c}var Vo=Math.abs,$o=Math.cos,Wo=Math.sin,Zo=Math.PI,Ko=Zo/2,Qo=2*Zo,Jo=Math.max,ta=1e-12;function na(t,n){return Array.from({length:n-t},((n,e)=>t+e))}function ea(t){return function(n,e){return t(n.source.value+n.target.value,e.source.value+e.target.value)}}function ra(t,n){var e=0,r=null,i=null,o=null;function a(a){var u,c=a.length,f=new Array(c),s=na(0,c),l=new Array(c*c),h=new Array(c),d=0;a=Float64Array.from({length:c*c},n?(t,n)=>a[n%c][n/c|0]:(t,n)=>a[n/c|0][n%c]);for(let n=0;nr(f[t],f[n])));for(const e of s){const r=n;if(t){const t=na(1+~c,c).filter((t=>t<0?a[~t*c+e]:a[e*c+t]));i&&t.sort(((t,n)=>i(t<0?-a[~t*c+e]:a[e*c+t],n<0?-a[~n*c+e]:a[e*c+n])));for(const r of t)if(r<0){(l[~r*c+e]||(l[~r*c+e]={source:null,target:null})).target={index:e,startAngle:n,endAngle:n+=a[~r*c+e]*d,value:a[~r*c+e]}}else{(l[e*c+r]||(l[e*c+r]={source:null,target:null})).source={index:e,startAngle:n,endAngle:n+=a[e*c+r]*d,value:a[e*c+r]}}h[e]={index:e,startAngle:r,endAngle:n,value:f[e]}}else{const t=na(0,c).filter((t=>a[e*c+t]||a[t*c+e]));i&&t.sort(((t,n)=>i(a[e*c+t],a[e*c+n])));for(const r of t){let t;if(eaa)if(Math.abs(s*u-c*f)>aa&&i){var h=e-o,d=r-a,p=u*u+c*c,g=h*h+d*d,y=Math.sqrt(p),v=Math.sqrt(l),_=i*Math.tan((ia-Math.acos((p+l-g)/(2*y*v)))/2),b=_/v,m=_/y;Math.abs(b-1)>aa&&(this._+="L"+(t+b*f)+","+(n+b*s)),this._+="A"+i+","+i+",0,0,"+ +(s*h>f*d)+","+(this._x1=t+m*u)+","+(this._y1=n+m*c)}else this._+="L"+(this._x1=t)+","+(this._y1=n);else;},arc:function(t,n,e,r,i,o){t=+t,n=+n,o=!!o;var a=(e=+e)*Math.cos(r),u=e*Math.sin(r),c=t+a,f=n+u,s=1^o,l=o?r-i:i-r;if(e<0)throw new Error("negative radius: "+e);null===this._x1?this._+="M"+c+","+f:(Math.abs(this._x1-c)>aa||Math.abs(this._y1-f)>aa)&&(this._+="L"+c+","+f),e&&(l<0&&(l=l%oa+oa),l>ua?this._+="A"+e+","+e+",0,1,"+s+","+(t-a)+","+(n-u)+"A"+e+","+e+",0,1,"+s+","+(this._x1=c)+","+(this._y1=f):l>aa&&(this._+="A"+e+","+e+",0,"+ +(l>=ia)+","+s+","+(this._x1=t+e*Math.cos(i))+","+(this._y1=n+e*Math.sin(i))))},rect:function(t,n,e,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +e+"v"+ +r+"h"+-e+"Z"},toString:function(){return this._}};var sa=Array.prototype.slice;function la(t){return function(){return t}}function ha(t){return t.source}function da(t){return t.target}function pa(t){return t.radius}function ga(t){return t.startAngle}function ya(t){return t.endAngle}function va(){return 0}function _a(){return 10}function ba(t){var n=ha,e=da,r=pa,i=pa,o=ga,a=ya,u=va,c=null;function f(){var f,s=n.apply(this,arguments),l=e.apply(this,arguments),h=u.apply(this,arguments)/2,d=sa.call(arguments),p=+r.apply(this,(d[0]=s,d)),g=o.apply(this,d)-Ko,y=a.apply(this,d)-Ko,v=+i.apply(this,(d[0]=l,d)),_=o.apply(this,d)-Ko,b=a.apply(this,d)-Ko;if(c||(c=f=fa()),h>ta&&(Vo(y-g)>2*h+ta?y>g?(g+=h,y-=h):(g-=h,y+=h):g=y=(g+y)/2,Vo(b-_)>2*h+ta?b>_?(_+=h,b-=h):(_-=h,b+=h):_=b=(_+b)/2),c.moveTo(p*$o(g),p*Wo(g)),c.arc(0,0,p,g,y),g!==_||y!==b)if(t){var m=+t.apply(this,arguments),x=v-m,w=(_+b)/2;c.quadraticCurveTo(0,0,x*$o(_),x*Wo(_)),c.lineTo(v*$o(w),v*Wo(w)),c.lineTo(x*$o(b),x*Wo(b))}else c.quadraticCurveTo(0,0,v*$o(_),v*Wo(_)),c.arc(0,0,v,_,b);if(c.quadraticCurveTo(0,0,p*$o(g),p*Wo(g)),c.closePath(),f)return c=null,f+""||null}return t&&(f.headRadius=function(n){return arguments.length?(t="function"==typeof n?n:la(+n),f):t}),f.radius=function(t){return arguments.length?(r=i="function"==typeof t?t:la(+t),f):r},f.sourceRadius=function(t){return arguments.length?(r="function"==typeof t?t:la(+t),f):r},f.targetRadius=function(t){return arguments.length?(i="function"==typeof t?t:la(+t),f):i},f.startAngle=function(t){return arguments.length?(o="function"==typeof t?t:la(+t),f):o},f.endAngle=function(t){return arguments.length?(a="function"==typeof t?t:la(+t),f):a},f.padAngle=function(t){return arguments.length?(u="function"==typeof t?t:la(+t),f):u},f.source=function(t){return arguments.length?(n=t,f):n},f.target=function(t){return arguments.length?(e=t,f):e},f.context=function(t){return arguments.length?(c=null==t?null:t,f):c},f}var ma=Array.prototype.slice;function xa(t,n){return t-n}var wa=t=>()=>t;function Ma(t,n){for(var e,r=-1,i=n.length;++rr!=d>r&&e<(h-f)*(r-s)/(d-s)+f&&(i=-i)}return i}function Ta(t,n,e){var r,i,o,a;return function(t,n,e){return(n[0]-t[0])*(e[1]-t[1])==(e[0]-t[0])*(n[1]-t[1])}(t,n,e)&&(i=t[r=+(t[0]===n[0])],o=e[r],a=n[r],i<=o&&o<=a||a<=o&&o<=i)}function Sa(){}var Ea=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]];function ka(){var t=1,n=1,e=U,r=u;function i(t){var n=e(t);if(Array.isArray(n))n=n.slice().sort(xa);else{var r=p(t),i=r[0],a=r[1];n=F(i,a,n),n=Z(Math.floor(i/n)*n,Math.floor(a/n)*n,n)}return n.map((function(n){return o(t,n)}))}function o(e,i){var o=[],u=[];return function(e,r,i){var o,u,c,f,s,l,h=new Array,d=new Array;o=u=-1,f=e[0]>=r,Ea[f<<1].forEach(p);for(;++o=r,Ea[c|f<<1].forEach(p);Ea[f<<0].forEach(p);for(;++u=r,s=e[u*t]>=r,Ea[f<<1|s<<2].forEach(p);++o=r,l=s,s=e[u*t+o+1]>=r,Ea[c|f<<1|s<<2|l<<3].forEach(p);Ea[f|s<<3].forEach(p)}o=-1,s=e[u*t]>=r,Ea[s<<2].forEach(p);for(;++o=r,Ea[s<<2|l<<3].forEach(p);function p(t){var n,e,r=[t[0][0]+o,t[0][1]+u],c=[t[1][0]+o,t[1][1]+u],f=a(r),s=a(c);(n=d[f])?(e=h[s])?(delete d[n.end],delete h[e.start],n===e?(n.ring.push(c),i(n.ring)):h[n.start]=d[e.end]={start:n.start,end:e.end,ring:n.ring.concat(e.ring)}):(delete d[n.end],n.ring.push(c),d[n.end=s]=n):(n=h[s])?(e=d[f])?(delete h[n.start],delete d[e.end],n===e?(n.ring.push(c),i(n.ring)):h[e.start]=d[n.end]={start:e.start,end:n.end,ring:e.ring.concat(n.ring)}):(delete h[n.start],n.ring.unshift(r),h[n.start=f]=n):h[f]=d[s]={start:f,end:s,ring:[r,c]}}Ea[s<<3].forEach(p)}(e,i,(function(t){r(t,e,i),function(t){for(var n=0,e=t.length,r=t[e-1][1]*t[0][0]-t[e-1][0]*t[0][1];++n0?o.push([t]):u.push(t)})),u.forEach((function(t){for(var n,e=0,r=o.length;e0&&a0&&u=0&&o>=0))throw new Error("invalid size");return t=r,n=o,i},i.thresholds=function(t){return arguments.length?(e="function"==typeof t?t:Array.isArray(t)?wa(ma.call(t)):wa(t),i):e},i.smooth=function(t){return arguments.length?(r=t?u:Sa,i):r===u},i}function Na(t,n,e){for(var r=t.width,i=t.height,o=1+(e<<1),a=0;a=e&&(u>=o&&(c-=t.data[u-o+a*r]),n.data[u-e+a*r]=c/Math.min(u+1,r-1+o-u,o))}function Ca(t,n,e){for(var r=t.width,i=t.height,o=1+(e<<1),a=0;a=e&&(u>=o&&(c-=t.data[a+(u-o)*r]),n.data[a+(u-e)*r]=c/Math.min(u+1,i-1+o-u,o))}function Pa(t){return t[0]}function za(t){return t[1]}function Da(){return 1}const qa=Math.pow(2,-52),Ra=new Uint32Array(512);class Fa{static from(t,n=Ha,e=Xa){const r=t.length,i=new Float64Array(2*r);for(let o=0;o>1;if(n>0&&"number"!=typeof t[0])throw new Error("Expected coords to contain numbers.");this.coords=t;const e=Math.max(2*n-5,0);this._triangles=new Uint32Array(3*e),this._halfedges=new Int32Array(3*e),this._hashSize=Math.ceil(Math.sqrt(n)),this._hullPrev=new Uint32Array(n),this._hullNext=new Uint32Array(n),this._hullTri=new Uint32Array(n),this._hullHash=new Int32Array(this._hashSize).fill(-1),this._ids=new Uint32Array(n),this._dists=new Float64Array(n),this.update()}update(){const{coords:t,_hullPrev:n,_hullNext:e,_hullTri:r,_hullHash:i}=this,o=t.length>>1;let a=1/0,u=1/0,c=-1/0,f=-1/0;for(let n=0;nc&&(c=e),r>f&&(f=r),this._ids[n]=n}const s=(a+c)/2,l=(u+f)/2;let h,d,p,g=1/0;for(let n=0;n0&&(d=n,g=e)}let _=t[2*d],b=t[2*d+1],m=1/0;for(let n=0;nr&&(n[e++]=i,r=this._dists[i])}return this.hull=n.subarray(0,e),this.triangles=new Uint32Array(0),void(this.halfedges=new Uint32Array(0))}if(Ia(y,v,_,b,x,w)){const t=d,n=_,e=b;d=p,_=x,b=w,p=t,x=n,w=e}const M=function(t,n,e,r,i,o){const a=e-t,u=r-n,c=i-t,f=o-n,s=a*a+u*u,l=c*c+f*f,h=.5/(a*f-u*c);return{x:t+(f*s-u*l)*h,y:n+(a*l-c*s)*h}}(y,v,_,b,x,w);this._cx=M.x,this._cy=M.y;for(let n=0;n0&&Math.abs(f-o)<=qa&&Math.abs(s-a)<=qa)continue;if(o=f,a=s,c===h||c===d||c===p)continue;let l=0;for(let t=0,n=this._hashKey(f,s);t0?3-e:1+e)/4}(t-this._cx,n-this._cy)*this._hashSize)%this._hashSize}_legalize(t){const{_triangles:n,_halfedges:e,coords:r}=this;let i=0,o=0;for(;;){const a=e[t],u=t-t%3;if(o=u+(t+2)%3,-1===a){if(0===i)break;t=Ra[--i];continue}const c=a-a%3,f=u+(t+1)%3,s=c+(a+2)%3,l=n[o],h=n[t],d=n[f],p=n[s];if(Ba(r[2*l],r[2*l+1],r[2*h],r[2*h+1],r[2*d],r[2*d+1],r[2*p],r[2*p+1])){n[t]=p,n[a]=l;const r=e[s];if(-1===r){let n=this._hullStart;do{if(this._hullTri[n]===s){this._hullTri[n]=t;break}n=this._hullPrev[n]}while(n!==this._hullStart)}this._link(t,r),this._link(a,e[o]),this._link(o,s);const u=c+(a+1)%3;i=33306690738754716e-32*Math.abs(a+u)?a-u:0}function Ia(t,n,e,r,i,o){return(Ua(i,o,t,n,e,r)||Ua(t,n,e,r,i,o)||Ua(e,r,i,o,t,n))<0}function Ba(t,n,e,r,i,o,a,u){const c=t-a,f=n-u,s=e-a,l=r-u,h=i-a,d=o-u,p=s*s+l*l,g=h*h+d*d;return c*(l*g-p*d)-f*(s*g-p*h)+(c*c+f*f)*(s*d-l*h)<0}function Ya(t,n,e,r,i,o){const a=e-t,u=r-n,c=i-t,f=o-n,s=a*a+u*u,l=c*c+f*f,h=.5/(a*f-u*c),d=(f*s-u*l)*h,p=(a*l-c*s)*h;return d*d+p*p}function La(t,n,e,r){if(r-e<=20)for(let i=e+1;i<=r;i++){const r=t[i],o=n[r];let a=i-1;for(;a>=e&&n[t[a]]>o;)t[a+1]=t[a--];t[a+1]=r}else{let i=e+1,o=r;ja(t,e+r>>1,i),n[t[e]]>n[t[r]]&&ja(t,e,r),n[t[i]]>n[t[r]]&&ja(t,i,r),n[t[e]]>n[t[i]]&&ja(t,e,i);const a=t[i],u=n[a];for(;;){do{i++}while(n[t[i]]u);if(o=o-e?(La(t,n,i,r),La(t,n,e,o-1)):(La(t,n,e,o-1),La(t,n,i,r))}}function ja(t,n,e){const r=t[n];t[n]=t[e],t[e]=r}function Ha(t){return t[0]}function Xa(t){return t[1]}const Ga=1e-6;class Va{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(t,n){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(t,n){this._+=`L${this._x1=+t},${this._y1=+n}`}arc(t,n,e){const r=(t=+t)+(e=+e),i=n=+n;if(e<0)throw new Error("negative radius");null===this._x1?this._+=`M${r},${i}`:(Math.abs(this._x1-r)>Ga||Math.abs(this._y1-i)>Ga)&&(this._+="L"+r+","+i),e&&(this._+=`A${e},${e},0,1,1,${t-e},${n}A${e},${e},0,1,1,${this._x1=r},${this._y1=i}`)}rect(t,n,e,r){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}h${+e}v${+r}h${-e}Z`}value(){return this._||null}}class $a{constructor(){this._=[]}moveTo(t,n){this._.push([t,n])}closePath(){this._.push(this._[0].slice())}lineTo(t,n){this._.push([t,n])}value(){return this._.length?this._:null}}class Wa{constructor(t,[n,e,r,i]=[0,0,960,500]){if(!((r=+r)>=(n=+n)&&(i=+i)>=(e=+e)))throw new Error("invalid bounds");this.delaunay=t,this._circumcenters=new Float64Array(2*t.points.length),this.vectors=new Float64Array(2*t.points.length),this.xmax=r,this.xmin=n,this.ymax=i,this.ymin=e,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){const{delaunay:{points:t,hull:n,triangles:e},vectors:r}=this,i=this.circumcenters=this._circumcenters.subarray(0,e.length/3*2);for(let n,r,o=0,a=0,u=e.length;o1;)i-=2;for(let t=2;t4)for(let t=0;t0){if(n>=this.ymax)return null;(i=(this.ymax-n)/r)0){if(t>=this.xmax)return null;(i=(this.xmax-t)/e)this.xmax?2:0)|(nthis.ymax?8:0)}}const Za=2*Math.PI,Ka=Math.pow;function Qa(t){return t[0]}function Ja(t){return t[1]}function tu(t,n,e){return[t+Math.sin(t+n)*e,n+Math.cos(t-n)*e]}class nu{static from(t,n=Qa,e=Ja,r){return new nu("length"in t?function(t,n,e,r){const i=t.length,o=new Float64Array(2*i);for(let a=0;a2&&function(t){const{triangles:n,coords:e}=t;for(let t=0;t1e-10)return!1}return!0}(t)){this.collinear=Int32Array.from({length:n.length/2},((t,n)=>n)).sort(((t,e)=>n[2*t]-n[2*e]||n[2*t+1]-n[2*e+1]));const t=this.collinear[0],e=this.collinear[this.collinear.length-1],r=[n[2*t],n[2*t+1],n[2*e],n[2*e+1]],i=1e-8*Math.hypot(r[3]-r[1],r[2]-r[0]);for(let t=0,e=n.length/2;t0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=r[0],this.triangles[1]=r[1],this.triangles[2]=r[1],o[r[0]]=1,2===r.length&&(o[r[1]]=0))}voronoi(t){return new Wa(this,t)}*neighbors(t){const{inedges:n,hull:e,_hullIndex:r,halfedges:i,triangles:o,collinear:a}=this;if(a){const n=a.indexOf(t);return n>0&&(yield a[n-1]),void(n=0&&i!==e&&i!==r;)e=i;return i}_step(t,n,e){const{inedges:r,hull:i,_hullIndex:o,halfedges:a,triangles:u,points:c}=this;if(-1===r[t]||!c.length)return(t+1)%(c.length>>1);let f=t,s=Ka(n-c[2*t],2)+Ka(e-c[2*t+1],2);const l=r[t];let h=l;do{let r=u[h];const l=Ka(n-c[2*r],2)+Ka(e-c[2*r+1],2);if(l9999?"+"+au(t,6):au(t,4)}(t.getUTCFullYear())+"-"+au(t.getUTCMonth()+1,2)+"-"+au(t.getUTCDate(),2)+(i?"T"+au(n,2)+":"+au(e,2)+":"+au(r,2)+"."+au(i,3)+"Z":r?"T"+au(n,2)+":"+au(e,2)+":"+au(r,2)+"Z":e||n?"T"+au(n,2)+":"+au(e,2)+"Z":"")}function cu(t){var n=new RegExp('["'+t+"\n\r]"),e=t.charCodeAt(0);function r(t,n){var r,i=[],o=t.length,a=0,u=0,c=o<=0,f=!1;function s(){if(c)return ru;if(f)return f=!1,eu;var n,r,i=a;if(34===t.charCodeAt(i)){for(;a++=o?c=!0:10===(r=t.charCodeAt(a++))?f=!0:13===r&&(f=!0,10===t.charCodeAt(a)&&++a),t.slice(i+1,n-1).replace(/""/g,'"')}for(;aNu(n,e).then((n=>(new DOMParser).parseFromString(n,t)))}var Ru=qu("application/xml"),Fu=qu("text/html"),Ou=qu("image/svg+xml");function Uu(t,n,e,r){if(isNaN(n)||isNaN(e))return t;var i,o,a,u,c,f,s,l,h,d=t._root,p={data:r},g=t._x0,y=t._y0,v=t._x1,_=t._y1;if(!d)return t._root=p,t;for(;d.length;)if((f=n>=(o=(g+v)/2))?g=o:v=o,(s=e>=(a=(y+_)/2))?y=a:_=a,i=d,!(d=d[l=s<<1|f]))return i[l]=p,t;if(u=+t._x.call(null,d.data),c=+t._y.call(null,d.data),n===u&&e===c)return p.next=d,i?i[l]=p:t._root=p,t;do{i=i?i[l]=new Array(4):t._root=new Array(4),(f=n>=(o=(g+v)/2))?g=o:v=o,(s=e>=(a=(y+_)/2))?y=a:_=a}while((l=s<<1|f)==(h=(c>=a)<<1|u>=o));return i[h]=d,i[l]=p,t}function Iu(t,n,e,r,i){this.node=t,this.x0=n,this.y0=e,this.x1=r,this.y1=i}function Bu(t){return t[0]}function Yu(t){return t[1]}function Lu(t,n,e){var r=new ju(null==n?Bu:n,null==e?Yu:e,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function ju(t,n,e,r,i,o){this._x=t,this._y=n,this._x0=e,this._y0=r,this._x1=i,this._y1=o,this._root=void 0}function Hu(t){for(var n={data:t.data},e=n;t=t.next;)e=e.next={data:t.data};return n}var Xu=Lu.prototype=ju.prototype;function Gu(t){return function(){return t}}function Vu(t){return 1e-6*(t()-.5)}function $u(t){return t.x+t.vx}function Wu(t){return t.y+t.vy}function Zu(t){return t.index}function Ku(t,n){var e=t.get(n);if(!e)throw new Error("node not found: "+n);return e}Xu.copy=function(){var t,n,e=new ju(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return e;if(!r.length)return e._root=Hu(r),e;for(t=[{source:r,target:e._root=new Array(4)}];r=t.pop();)for(var i=0;i<4;++i)(n=r.source[i])&&(n.length?t.push({source:n,target:r.target[i]=new Array(4)}):r.target[i]=Hu(n));return e},Xu.add=function(t){const n=+this._x.call(null,t),e=+this._y.call(null,t);return Uu(this.cover(n,e),n,e,t)},Xu.addAll=function(t){var n,e,r,i,o=t.length,a=new Array(o),u=new Array(o),c=1/0,f=1/0,s=-1/0,l=-1/0;for(e=0;es&&(s=r),il&&(l=i));if(c>s||f>l)return this;for(this.cover(c,f).cover(s,l),e=0;et||t>=i||r>n||n>=o;)switch(u=(nh||(o=c.y0)>d||(a=c.x1)=v)<<1|t>=y)&&(c=p[p.length-1],p[p.length-1]=p[p.length-1-f],p[p.length-1-f]=c)}else{var _=t-+this._x.call(null,g.data),b=n-+this._y.call(null,g.data),m=_*_+b*b;if(m=(u=(p+y)/2))?p=u:y=u,(s=a>=(c=(g+v)/2))?g=c:v=c,n=d,!(d=d[l=s<<1|f]))return this;if(!d.length)break;(n[l+1&3]||n[l+2&3]||n[l+3&3])&&(e=n,h=l)}for(;d.data!==t;)if(r=d,!(d=d.next))return this;return(i=d.next)&&delete d.next,r?(i?r.next=i:delete r.next,this):n?(i?n[l]=i:delete n[l],(d=n[0]||n[1]||n[2]||n[3])&&d===(n[3]||n[2]||n[1]||n[0])&&!d.length&&(e?e[h]=d:this._root=d),this):(this._root=i,this)},Xu.removeAll=function(t){for(var n=0,e=t.length;n1?r[0]+r.slice(2):r,+t.slice(e+1)]}function rc(t){return(t=ec(Math.abs(t)))?t[1]:NaN}var ic,oc=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function ac(t){if(!(n=oc.exec(t)))throw new Error("invalid format: "+t);var n;return new uc({fill:n[1],align:n[2],sign:n[3],symbol:n[4],zero:n[5],width:n[6],comma:n[7],precision:n[8]&&n[8].slice(1),trim:n[9],type:n[10]})}function uc(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function cc(t,n){var e=ec(t,n);if(!e)return t+"";var r=e[0],i=e[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}ac.prototype=uc.prototype,uc.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var fc={"%":(t,n)=>(100*t).toFixed(n),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,n)=>t.toExponential(n),f:(t,n)=>t.toFixed(n),g:(t,n)=>t.toPrecision(n),o:t=>Math.round(t).toString(8),p:(t,n)=>cc(100*t,n),r:cc,s:function(t,n){var e=ec(t,n);if(!e)return t+"";var r=e[0],i=e[1],o=i-(ic=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,a=r.length;return o===a?r:o>a?r+new Array(o-a+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+ec(t,Math.max(0,n+o-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function sc(t){return t}var lc,hc=Array.prototype.map,dc=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function pc(t){var n,e,r=void 0===t.grouping||void 0===t.thousands?sc:(n=hc.call(t.grouping,Number),e=t.thousands+"",function(t,r){for(var i=t.length,o=[],a=0,u=n[0],c=0;i>0&&u>0&&(c+u+1>r&&(u=Math.max(1,r-c)),o.push(t.substring(i-=u,i+u)),!((c+=u+1)>r));)u=n[a=(a+1)%n.length];return o.reverse().join(e)}),i=void 0===t.currency?"":t.currency[0]+"",o=void 0===t.currency?"":t.currency[1]+"",a=void 0===t.decimal?".":t.decimal+"",u=void 0===t.numerals?sc:function(t){return function(n){return n.replace(/[0-9]/g,(function(n){return t[+n]}))}}(hc.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",f=void 0===t.minus?"−":t.minus+"",s=void 0===t.nan?"NaN":t.nan+"";function l(t){var n=(t=ac(t)).fill,e=t.align,l=t.sign,h=t.symbol,d=t.zero,p=t.width,g=t.comma,y=t.precision,v=t.trim,_=t.type;"n"===_?(g=!0,_="g"):fc[_]||(void 0===y&&(y=12),v=!0,_="g"),(d||"0"===n&&"="===e)&&(d=!0,n="0",e="=");var b="$"===h?i:"#"===h&&/[boxX]/.test(_)?"0"+_.toLowerCase():"",m="$"===h?o:/[%p]/.test(_)?c:"",x=fc[_],w=/[defgprs%]/.test(_);function M(t){var i,o,c,h=b,M=m;if("c"===_)M=x(t)+M,t="";else{var A=(t=+t)<0||1/t<0;if(t=isNaN(t)?s:x(Math.abs(t),y),v&&(t=function(t){t:for(var n,e=t.length,r=1,i=-1;r0&&(i=0)}return i>0?t.slice(0,i)+t.slice(n+1):t}(t)),A&&0==+t&&"+"!==l&&(A=!1),h=(A?"("===l?l:f:"-"===l||"("===l?"":l)+h,M=("s"===_?dc[8+ic/3]:"")+M+(A&&"("===l?")":""),w)for(i=-1,o=t.length;++i(c=t.charCodeAt(i))||c>57){M=(46===c?a+t.slice(i+1):t.slice(i))+M,t=t.slice(0,i);break}}g&&!d&&(t=r(t,1/0));var T=h.length+t.length+M.length,S=T>1)+h+t+M+S.slice(T);break;default:t=S+h+t+M}return u(t)}return y=void 0===y?6:/[gprs]/.test(_)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),M.toString=function(){return t+""},M}return{format:l,formatPrefix:function(t,n){var e=l(((t=ac(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(rc(n)/3))),i=Math.pow(10,-r),o=dc[8+r/3];return function(t){return e(i*t)+o}}}}function gc(n){return lc=pc(n),t.format=lc.format,t.formatPrefix=lc.formatPrefix,lc}function yc(t){return Math.max(0,-rc(Math.abs(t)))}function vc(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(rc(n)/3)))-rc(Math.abs(t)))}function _c(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,rc(n)-rc(t))+1}t.format=void 0,t.formatPrefix=void 0,gc({thousands:",",grouping:[3],currency:["$",""]});var bc=1e-6,mc=1e-12,xc=Math.PI,wc=xc/2,Mc=xc/4,Ac=2*xc,Tc=180/xc,Sc=xc/180,Ec=Math.abs,kc=Math.atan,Nc=Math.atan2,Cc=Math.cos,Pc=Math.ceil,zc=Math.exp,Dc=Math.hypot,qc=Math.log,Rc=Math.pow,Fc=Math.sin,Oc=Math.sign||function(t){return t>0?1:t<0?-1:0},Uc=Math.sqrt,Ic=Math.tan;function Bc(t){return t>1?0:t<-1?xc:Math.acos(t)}function Yc(t){return t>1?wc:t<-1?-wc:Math.asin(t)}function Lc(t){return(t=Fc(t/2))*t}function jc(){}function Hc(t,n){t&&Gc.hasOwnProperty(t.type)&&Gc[t.type](t,n)}var Xc={Feature:function(t,n){Hc(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r=0?1:-1,i=r*e,o=Cc(n=(n*=Sc)/2+Mc),a=Fc(n),u=tf*a,c=Jc*o+u*Cc(i),f=u*r*Fc(i);df.add(Nc(f,c)),Qc=t,Jc=o,tf=a}function mf(t){return[Nc(t[1],t[0]),Yc(t[2])]}function xf(t){var n=t[0],e=t[1],r=Cc(e);return[r*Cc(n),r*Fc(n),Fc(e)]}function wf(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function Mf(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function Af(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function Tf(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function Sf(t){var n=Uc(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}var Ef,kf,Nf,Cf,Pf,zf,Df,qf,Rf,Ff,Of,Uf,If,Bf,Yf,Lf,jf={point:Hf,lineStart:Gf,lineEnd:Vf,polygonStart:function(){jf.point=$f,jf.lineStart=Wf,jf.lineEnd=Zf,sf=new g,gf.polygonStart()},polygonEnd:function(){gf.polygonEnd(),jf.point=Hf,jf.lineStart=Gf,jf.lineEnd=Vf,df<0?(nf=-(rf=180),ef=-(of=90)):sf>bc?of=90:sf<-1e-6&&(ef=-90),hf[0]=nf,hf[1]=rf},sphere:function(){nf=-(rf=180),ef=-(of=90)}};function Hf(t,n){lf.push(hf=[nf=t,rf=t]),nof&&(of=n)}function Xf(t,n){var e=xf([t*Sc,n*Sc]);if(ff){var r=Mf(ff,e),i=Mf([r[1],-r[0],0],r);Sf(i),i=mf(i);var o,a=t-af,u=a>0?1:-1,c=i[0]*Tc*u,f=Ec(a)>180;f^(u*afof&&(of=o):f^(u*af<(c=(c+360)%360-180)&&cof&&(of=n)),f?tKf(nf,rf)&&(rf=t):Kf(t,rf)>Kf(nf,rf)&&(nf=t):rf>=nf?(trf&&(rf=t)):t>af?Kf(nf,t)>Kf(nf,rf)&&(rf=t):Kf(t,rf)>Kf(nf,rf)&&(nf=t)}else lf.push(hf=[nf=t,rf=t]);nof&&(of=n),ff=e,af=t}function Gf(){jf.point=Xf}function Vf(){hf[0]=nf,hf[1]=rf,jf.point=Hf,ff=null}function $f(t,n){if(ff){var e=t-af;sf.add(Ec(e)>180?e+(e>0?360:-360):e)}else uf=t,cf=n;gf.point(t,n),Xf(t,n)}function Wf(){gf.lineStart()}function Zf(){$f(uf,cf),gf.lineEnd(),Ec(sf)>bc&&(nf=-(rf=180)),hf[0]=nf,hf[1]=rf,ff=null}function Kf(t,n){return(n-=t)<0?n+360:n}function Qf(t,n){return t[0]-n[0]}function Jf(t,n){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nxc?t+Math.round(-t/Ac)*Ac:t,n]}function ps(t,n,e){return(t%=Ac)?n||e?hs(ys(t),vs(n,e)):ys(t):n||e?vs(n,e):ds}function gs(t){return function(n,e){return[(n+=t)>xc?n-Ac:n<-xc?n+Ac:n,e]}}function ys(t){var n=gs(t);return n.invert=gs(-t),n}function vs(t,n){var e=Cc(t),r=Fc(t),i=Cc(n),o=Fc(n);function a(t,n){var a=Cc(n),u=Cc(t)*a,c=Fc(t)*a,f=Fc(n),s=f*e+u*r;return[Nc(c*i-s*o,u*e-f*r),Yc(s*i+c*o)]}return a.invert=function(t,n){var a=Cc(n),u=Cc(t)*a,c=Fc(t)*a,f=Fc(n),s=f*i-c*o;return[Nc(c*i+f*o,u*e+s*r),Yc(s*e-u*r)]},a}function _s(t){function n(n){return(n=t(n[0]*Sc,n[1]*Sc))[0]*=Tc,n[1]*=Tc,n}return t=ps(t[0]*Sc,t[1]*Sc,t.length>2?t[2]*Sc:0),n.invert=function(n){return(n=t.invert(n[0]*Sc,n[1]*Sc))[0]*=Tc,n[1]*=Tc,n},n}function bs(t,n,e,r,i,o){if(e){var a=Cc(n),u=Fc(n),c=r*e;null==i?(i=n+r*Ac,o=n-c/2):(i=ms(a,i),o=ms(a,o),(r>0?io)&&(i+=r*Ac));for(var f,s=i;r>0?s>o:s1&&n.push(n.pop().concat(n.shift()))},result:function(){var e=n;return n=[],t=null,e}}}function ws(t,n){return Ec(t[0]-n[0])=0;--o)i.point((s=f[o])[0],s[1]);else r(h.x,h.p.x,-1,i);h=h.p}f=(h=h.o).z,d=!d}while(!h.v);i.lineEnd()}}}function Ts(t){if(n=t.length){for(var n,e,r=0,i=t[0];++r=0?1:-1,E=S*T,k=E>xc,N=v*M;if(c.add(Nc(N*S*Fc(E),_*A+N*Cc(E))),a+=k?T+S*Ac:T,k^p>=e^x>=e){var C=Mf(xf(d),xf(m));Sf(C);var P=Mf(o,C);Sf(P);var z=(k^T>=0?-1:1)*Yc(P[2]);(r>z||r===z&&(C[0]||C[1]))&&(u+=k^T>=0?1:-1)}}return(a<-1e-6||a0){for(l||(i.polygonStart(),l=!0),i.lineStart(),t=0;t1&&2&c&&h.push(h.pop().concat(h.shift())),a.push(h.filter(Ns))}return h}}function Ns(t){return t.length>1}function Cs(t,n){return((t=t.x)[0]<0?t[1]-wc-bc:wc-t[1])-((n=n.x)[0]<0?n[1]-wc-bc:wc-n[1])}ds.invert=ds;var Ps=ks((function(){return!0}),(function(t){var n,e=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),n=1},point:function(o,a){var u=o>0?xc:-xc,c=Ec(o-e);Ec(c-xc)0?wc:-wc),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),t.point(o,r),n=0):i!==u&&c>=xc&&(Ec(e-i)bc?kc((Fc(n)*(o=Cc(r))*Fc(e)-Fc(r)*(i=Cc(n))*Fc(t))/(i*o*a)):(n+r)/2}(e,r,o,a),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),n=0),t.point(e=o,r=a),i=u},lineEnd:function(){t.lineEnd(),e=r=NaN},clean:function(){return 2-n}}}),(function(t,n,e,r){var i;if(null==t)i=e*wc,r.point(-xc,i),r.point(0,i),r.point(xc,i),r.point(xc,0),r.point(xc,-i),r.point(0,-i),r.point(-xc,-i),r.point(-xc,0),r.point(-xc,i);else if(Ec(t[0]-n[0])>bc){var o=t[0]0,i=Ec(n)>bc;function o(t,e){return Cc(t)*Cc(e)>n}function a(t,e,r){var i=[1,0,0],o=Mf(xf(t),xf(e)),a=wf(o,o),u=o[0],c=a-u*u;if(!c)return!r&&t;var f=n*a/c,s=-n*u/c,l=Mf(i,o),h=Tf(i,f);Af(h,Tf(o,s));var d=l,p=wf(h,d),g=wf(d,d),y=p*p-g*(wf(h,h)-1);if(!(y<0)){var v=Uc(y),_=Tf(d,(-p-v)/g);if(Af(_,h),_=mf(_),!r)return _;var b,m=t[0],x=e[0],w=t[1],M=e[1];x0^_[1]<(Ec(_[0]-m)xc^(m<=_[0]&&_[0]<=x)){var S=Tf(d,(-p+v)/g);return Af(S,h),[_,mf(S)]}}}function u(n,e){var i=r?t:xc-t,o=0;return n<-i?o|=1:n>i&&(o|=2),e<-i?o|=4:e>i&&(o|=8),o}return ks(o,(function(t){var n,e,c,f,s;return{lineStart:function(){f=c=!1,s=1},point:function(l,h){var d,p=[l,h],g=o(l,h),y=r?g?0:u(l,h):g?u(l+(l<0?xc:-xc),h):0;if(!n&&(f=c=g)&&t.lineStart(),g!==c&&(!(d=a(n,p))||ws(n,d)||ws(p,d))&&(p[2]=1),g!==c)s=0,g?(t.lineStart(),d=a(p,n),t.point(d[0],d[1])):(d=a(n,p),t.point(d[0],d[1],2),t.lineEnd()),n=d;else if(i&&n&&r^g){var v;y&e||!(v=a(p,n,!0))||(s=0,r?(t.lineStart(),t.point(v[0][0],v[0][1]),t.point(v[1][0],v[1][1]),t.lineEnd()):(t.point(v[1][0],v[1][1]),t.lineEnd(),t.lineStart(),t.point(v[0][0],v[0][1],3)))}!g||n&&ws(n,p)||t.point(p[0],p[1]),n=p,c=g,e=y},lineEnd:function(){c&&t.lineEnd(),n=null},clean:function(){return s|(f&&c)<<1}}}),(function(n,r,i,o){bs(o,t,e,i,n,r)}),r?[0,-t]:[-xc,t-xc])}var Ds,qs,Rs,Fs,Os=1e9,Us=-Os;function Is(t,n,e,r){function i(i,o){return t<=i&&i<=e&&n<=o&&o<=r}function o(i,o,u,f){var s=0,l=0;if(null==i||(s=a(i,u))!==(l=a(o,u))||c(i,o)<0^u>0)do{f.point(0===s||3===s?t:e,s>1?r:n)}while((s=(s+u+4)%4)!==l);else f.point(o[0],o[1])}function a(r,i){return Ec(r[0]-t)0?0:3:Ec(r[0]-e)0?2:1:Ec(r[1]-n)0?1:0:i>0?3:2}function u(t,n){return c(t.x,n.x)}function c(t,n){var e=a(t,1),r=a(n,1);return e!==r?e-r:0===e?n[1]-t[1]:1===e?t[0]-n[0]:2===e?t[1]-n[1]:n[0]-t[0]}return function(a){var c,f,s,l,h,d,p,g,y,v,_,b=a,m=xs(),x={point:w,lineStart:function(){x.point=M,f&&f.push(s=[]);v=!0,y=!1,p=g=NaN},lineEnd:function(){c&&(M(l,h),d&&y&&m.rejoin(),c.push(m.result()));x.point=w,y&&b.lineEnd()},polygonStart:function(){b=m,c=[],f=[],_=!0},polygonEnd:function(){var n=function(){for(var n=0,e=0,i=f.length;er&&(h-o)*(r-a)>(d-a)*(t-o)&&++n:d<=r&&(h-o)*(r-a)<(d-a)*(t-o)&&--n;return n}(),e=_&&n,i=(c=V(c)).length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),o(null,null,1,a),a.lineEnd()),i&&As(c,u,n,o,a),a.polygonEnd());b=a,c=f=s=null}};function w(t,n){i(t,n)&&b.point(t,n)}function M(o,a){var u=i(o,a);if(f&&s.push([o,a]),v)l=o,h=a,d=u,v=!1,u&&(b.lineStart(),b.point(o,a));else if(u&&y)b.point(o,a);else{var c=[p=Math.max(Us,Math.min(Os,p)),g=Math.max(Us,Math.min(Os,g))],m=[o=Math.max(Us,Math.min(Os,o)),a=Math.max(Us,Math.min(Os,a))];!function(t,n,e,r,i,o){var a,u=t[0],c=t[1],f=0,s=1,l=n[0]-u,h=n[1]-c;if(a=e-u,l||!(a>0)){if(a/=l,l<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=i-u,l||!(a<0)){if(a/=l,l<0){if(a>s)return;a>f&&(f=a)}else if(l>0){if(a0)){if(a/=h,h<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=o-c,h||!(a<0)){if(a/=h,h<0){if(a>s)return;a>f&&(f=a)}else if(h>0){if(a0&&(t[0]=u+f*l,t[1]=c+f*h),s<1&&(n[0]=u+s*l,n[1]=c+s*h),!0}}}}}(c,m,t,n,e,r)?u&&(b.lineStart(),b.point(o,a),_=!1):(y||(b.lineStart(),b.point(c[0],c[1])),b.point(m[0],m[1]),u||b.lineEnd(),_=!1)}p=o,g=a,y=u}return x}}var Bs={sphere:jc,point:jc,lineStart:function(){Bs.point=Ls,Bs.lineEnd=Ys},lineEnd:jc,polygonStart:jc,polygonEnd:jc};function Ys(){Bs.point=Bs.lineEnd=jc}function Ls(t,n){qs=t*=Sc,Rs=Fc(n*=Sc),Fs=Cc(n),Bs.point=js}function js(t,n){t*=Sc;var e=Fc(n*=Sc),r=Cc(n),i=Ec(t-qs),o=Cc(i),a=r*Fc(i),u=Fs*e-Rs*r*o,c=Rs*e+Fs*r*o;Ds.add(Nc(Uc(a*a+u*u),c)),qs=t,Rs=e,Fs=r}function Hs(t){return Ds=new g,Wc(t,Bs),+Ds}var Xs=[null,null],Gs={type:"LineString",coordinates:Xs};function Vs(t,n){return Xs[0]=t,Xs[1]=n,Hs(Gs)}var $s={Feature:function(t,n){return Zs(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r0&&(i=Vs(t[o],t[o-1]))>0&&e<=i&&r<=i&&(e+r-i)*(1-Math.pow((e-r)/i,2))bc})).map(c)).concat(Z(Pc(o/d)*d,i,d).filter((function(t){return Ec(t%g)>bc})).map(f))}return v.lines=function(){return _().map((function(t){return{type:"LineString",coordinates:t}}))},v.outline=function(){return{type:"Polygon",coordinates:[s(r).concat(l(a).slice(1),s(e).reverse().slice(1),l(u).reverse().slice(1))]}},v.extent=function(t){return arguments.length?v.extentMajor(t).extentMinor(t):v.extentMinor()},v.extentMajor=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],u=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),u>a&&(t=u,u=a,a=t),v.precision(y)):[[r,u],[e,a]]},v.extentMinor=function(e){return arguments.length?(n=+e[0][0],t=+e[1][0],o=+e[0][1],i=+e[1][1],n>t&&(e=n,n=t,t=e),o>i&&(e=o,o=i,i=e),v.precision(y)):[[n,o],[t,i]]},v.step=function(t){return arguments.length?v.stepMajor(t).stepMinor(t):v.stepMinor()},v.stepMajor=function(t){return arguments.length?(p=+t[0],g=+t[1],v):[p,g]},v.stepMinor=function(t){return arguments.length?(h=+t[0],d=+t[1],v):[h,d]},v.precision=function(h){return arguments.length?(y=+h,c=el(o,i,90),f=rl(n,t,y),s=el(u,a,90),l=rl(r,e,y),v):y},v.extentMajor([[-180,-89.999999],[180,89.999999]]).extentMinor([[-180,-80.000001],[180,80.000001]])}var ol,al,ul,cl,fl=t=>t,sl=new g,ll=new g,hl={point:jc,lineStart:jc,lineEnd:jc,polygonStart:function(){hl.lineStart=dl,hl.lineEnd=yl},polygonEnd:function(){hl.lineStart=hl.lineEnd=hl.point=jc,sl.add(Ec(ll)),ll=new g},result:function(){var t=sl/2;return sl=new g,t}};function dl(){hl.point=pl}function pl(t,n){hl.point=gl,ol=ul=t,al=cl=n}function gl(t,n){ll.add(cl*t-ul*n),ul=t,cl=n}function yl(){gl(ol,al)}var vl=1/0,_l=vl,bl=-vl,ml=bl,xl={point:function(t,n){tbl&&(bl=t);n<_l&&(_l=n);n>ml&&(ml=n)},lineStart:jc,lineEnd:jc,polygonStart:jc,polygonEnd:jc,result:function(){var t=[[vl,_l],[bl,ml]];return bl=ml=-(_l=vl=1/0),t}};var wl,Ml,Al,Tl,Sl=0,El=0,kl=0,Nl=0,Cl=0,Pl=0,zl=0,Dl=0,ql=0,Rl={point:Fl,lineStart:Ol,lineEnd:Bl,polygonStart:function(){Rl.lineStart=Yl,Rl.lineEnd=Ll},polygonEnd:function(){Rl.point=Fl,Rl.lineStart=Ol,Rl.lineEnd=Bl},result:function(){var t=ql?[zl/ql,Dl/ql]:Pl?[Nl/Pl,Cl/Pl]:kl?[Sl/kl,El/kl]:[NaN,NaN];return Sl=El=kl=Nl=Cl=Pl=zl=Dl=ql=0,t}};function Fl(t,n){Sl+=t,El+=n,++kl}function Ol(){Rl.point=Ul}function Ul(t,n){Rl.point=Il,Fl(Al=t,Tl=n)}function Il(t,n){var e=t-Al,r=n-Tl,i=Uc(e*e+r*r);Nl+=i*(Al+t)/2,Cl+=i*(Tl+n)/2,Pl+=i,Fl(Al=t,Tl=n)}function Bl(){Rl.point=Fl}function Yl(){Rl.point=jl}function Ll(){Hl(wl,Ml)}function jl(t,n){Rl.point=Hl,Fl(wl=Al=t,Ml=Tl=n)}function Hl(t,n){var e=t-Al,r=n-Tl,i=Uc(e*e+r*r);Nl+=i*(Al+t)/2,Cl+=i*(Tl+n)/2,Pl+=i,zl+=(i=Tl*t-Al*n)*(Al+t),Dl+=i*(Tl+n),ql+=3*i,Fl(Al=t,Tl=n)}function Xl(t){this._context=t}Xl.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._context.moveTo(t,n),this._point=1;break;case 1:this._context.lineTo(t,n);break;default:this._context.moveTo(t+this._radius,n),this._context.arc(t,n,this._radius,0,Ac)}},result:jc};var Gl,Vl,$l,Wl,Zl,Kl=new g,Ql={point:jc,lineStart:function(){Ql.point=Jl},lineEnd:function(){Gl&&th(Vl,$l),Ql.point=jc},polygonStart:function(){Gl=!0},polygonEnd:function(){Gl=null},result:function(){var t=+Kl;return Kl=new g,t}};function Jl(t,n){Ql.point=th,Vl=Wl=t,$l=Zl=n}function th(t,n){Wl-=t,Zl-=n,Kl.add(Uc(Wl*Wl+Zl*Zl)),Wl=t,Zl=n}function nh(){this._string=[]}function eh(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function rh(t){return function(n){var e=new ih;for(var r in t)e[r]=t[r];return e.stream=n,e}}function ih(){}function oh(t,n,e){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),Wc(e,t.stream(xl)),n(xl.result()),null!=r&&t.clipExtent(r),t}function ah(t,n,e){return oh(t,(function(e){var r=n[1][0]-n[0][0],i=n[1][1]-n[0][1],o=Math.min(r/(e[1][0]-e[0][0]),i/(e[1][1]-e[0][1])),a=+n[0][0]+(r-o*(e[1][0]+e[0][0]))/2,u=+n[0][1]+(i-o*(e[1][1]+e[0][1]))/2;t.scale(150*o).translate([a,u])}),e)}function uh(t,n,e){return ah(t,[[0,0],n],e)}function ch(t,n,e){return oh(t,(function(e){var r=+n,i=r/(e[1][0]-e[0][0]),o=(r-i*(e[1][0]+e[0][0]))/2,a=-i*e[0][1];t.scale(150*i).translate([o,a])}),e)}function fh(t,n,e){return oh(t,(function(e){var r=+n,i=r/(e[1][1]-e[0][1]),o=-i*e[0][0],a=(r-i*(e[1][1]+e[0][1]))/2;t.scale(150*i).translate([o,a])}),e)}nh.prototype={_radius:4.5,_circle:eh(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._string.push("M",t,",",n),this._point=1;break;case 1:this._string.push("L",t,",",n);break;default:null==this._circle&&(this._circle=eh(this._radius)),this._string.push("M",t,",",n,this._circle)}},result:function(){if(this._string.length){var t=this._string.join("");return this._string=[],t}return null}},ih.prototype={constructor:ih,point:function(t,n){this.stream.point(t,n)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var sh=Cc(30*Sc);function lh(t,n){return+n?function(t,n){function e(r,i,o,a,u,c,f,s,l,h,d,p,g,y){var v=f-r,_=s-i,b=v*v+_*_;if(b>4*n&&g--){var m=a+h,x=u+d,w=c+p,M=Uc(m*m+x*x+w*w),A=Yc(w/=M),T=Ec(Ec(w)-1)n||Ec((v*N+_*C)/b-.5)>.3||a*h+u*d+c*p2?t[2]%360*Sc:0,N()):[y*Tc,v*Tc,_*Tc]},E.angle=function(t){return arguments.length?(b=t%360*Sc,N()):b*Tc},E.reflectX=function(t){return arguments.length?(m=t?-1:1,N()):m<0},E.reflectY=function(t){return arguments.length?(x=t?-1:1,N()):x<0},E.precision=function(t){return arguments.length?(a=lh(u,S=t*t),C()):Uc(S)},E.fitExtent=function(t,n){return ah(E,t,n)},E.fitSize=function(t,n){return uh(E,t,n)},E.fitWidth=function(t,n){return ch(E,t,n)},E.fitHeight=function(t,n){return fh(E,t,n)},function(){return n=t.apply(this,arguments),E.invert=n.invert&&k,N()}}function yh(t){var n=0,e=xc/3,r=gh(t),i=r(n,e);return i.parallels=function(t){return arguments.length?r(n=t[0]*Sc,e=t[1]*Sc):[n*Tc,e*Tc]},i}function vh(t,n){var e=Fc(t),r=(e+Fc(n))/2;if(Ec(r)0?n<-wc+bc&&(n=-wc+bc):n>wc-bc&&(n=wc-bc);var e=i/Rc(Sh(n),r);return[e*Fc(r*t),i-e*Cc(r*t)]}return o.invert=function(t,n){var e=i-n,o=Oc(r)*Uc(t*t+e*e),a=Nc(t,Ec(e))*Oc(e);return e*r<0&&(a-=xc*Oc(t)*Oc(e)),[a/r,2*kc(Rc(i/o,1/r))-wc]},o}function kh(t,n){return[t,n]}function Nh(t,n){var e=Cc(t),r=t===n?Fc(t):(e-Cc(n))/(n-t),i=e/r+t;if(Ec(r)=0;)n+=e[r].value;else n=1;t.value=n}function Xh(t,n){t instanceof Map?(t=[void 0,t],void 0===n&&(n=Vh)):void 0===n&&(n=Gh);for(var e,r,i,o,a,u=new Zh(t),c=[u];e=c.pop();)if((i=n(e.data))&&(a=(i=Array.from(i)).length))for(e.children=i,o=a-1;o>=0;--o)c.push(r=i[o]=new Zh(i[o])),r.parent=e,r.depth=e.depth+1;return u.eachBefore(Wh)}function Gh(t){return t.children}function Vh(t){return Array.isArray(t)?t[1]:null}function $h(t){void 0!==t.data.value&&(t.value=t.data.value),t.data=t.data.data}function Wh(t){var n=0;do{t.height=n}while((t=t.parent)&&t.height<++n)}function Zh(t){this.data=t,this.depth=this.height=0,this.parent=null}function Kh(t){for(var n,e,r=0,i=(t=function(t){for(var n,e,r=t.length;r;)e=Math.random()*r--|0,n=t[r],t[r]=t[e],t[e]=n;return t}(Array.from(t))).length,o=[];r0&&e*e>r*r+i*i}function nd(t,n){for(var e=0;e(a*=a)?(r=(f+a-i)/(2*f),o=Math.sqrt(Math.max(0,a/f-r*r)),e.x=t.x-r*u-o*c,e.y=t.y-r*c+o*u):(r=(f+i-a)/(2*f),o=Math.sqrt(Math.max(0,i/f-r*r)),e.x=n.x+r*u-o*c,e.y=n.y+r*c+o*u)):(e.x=n.x+e.r,e.y=n.y)}function ad(t,n){var e=t.r+n.r-1e-6,r=n.x-t.x,i=n.y-t.y;return e>0&&e*e>r*r+i*i}function ud(t){var n=t._,e=t.next._,r=n.r+e.r,i=(n.x*e.r+e.x*n.r)/r,o=(n.y*e.r+e.y*n.r)/r;return i*i+o*o}function cd(t){this._=t,this.next=null,this.previous=null}function fd(t){if(!(i=(t=function(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}(t)).length))return 0;var n,e,r,i,o,a,u,c,f,s,l;if((n=t[0]).x=0,n.y=0,!(i>1))return n.r;if(e=t[1],n.x=-e.r,e.x=n.r,e.y=0,!(i>2))return n.r+e.r;od(e,n,r=t[2]),n=new cd(n),e=new cd(e),r=new cd(r),n.next=r.previous=e,e.next=n.previous=r,r.next=e.previous=n;t:for(u=3;ubc&&--i>0);return[t/(.8707+(o=r*r)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),r]},Uh.invert=xh(Yc),Ih.invert=xh((function(t){return 2*kc(t)})),Bh.invert=function(t,n){return[-n,2*kc(zc(t))-wc]},Zh.prototype=Xh.prototype={constructor:Zh,count:function(){return this.eachAfter(Hh)},each:function(t,n){let e=-1;for(const r of this)t.call(n,r,++e,this);return this},eachAfter:function(t,n){for(var e,r,i,o=this,a=[o],u=[],c=-1;o=a.pop();)if(u.push(o),e=o.children)for(r=0,i=e.length;r=0;--r)o.push(e[r]);return this},find:function(t,n){let e=-1;for(const r of this)if(t.call(n,r,++e,this))return r},sum:function(t){return this.eachAfter((function(n){for(var e=+t(n.data)||0,r=n.children,i=r&&r.length;--i>=0;)e+=r[i].value;n.value=e}))},sort:function(t){return this.eachBefore((function(n){n.children&&n.children.sort(t)}))},path:function(t){for(var n=this,e=function(t,n){if(t===n)return t;var e=t.ancestors(),r=n.ancestors(),i=null;t=e.pop(),n=r.pop();for(;t===n;)i=t,t=e.pop(),n=r.pop();return i}(n,t),r=[n];n!==e;)n=n.parent,r.push(n);for(var i=r.length;t!==e;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,n=[t];t=t.parent;)n.push(t);return n},descendants:function(){return Array.from(this)},leaves:function(){var t=[];return this.eachBefore((function(n){n.children||t.push(n)})),t},links:function(){var t=this,n=[];return t.each((function(e){e!==t&&n.push({source:e.parent,target:e})})),n},copy:function(){return Xh(this).eachBefore($h)},[Symbol.iterator]:function*(){var t,n,e,r,i=this,o=[i];do{for(t=o.reverse(),o=[];i=t.pop();)if(yield i,n=i.children)for(e=0,r=n.length;eh&&(h=u),y=s*s*g,(d=Math.max(h/y,y/l))>p){s-=u;break}p=d}v.push(a={value:s,dice:c1?n:1)},e}(Pd);var qd=function t(n){function e(t,e,r,i,o){if((a=t._squarify)&&a.ratio===n)for(var a,u,c,f,s,l=-1,h=a.length,d=t.value;++l1?n:1)},e}(Pd);function Rd(t,n,e){return(n[0]-t[0])*(e[1]-t[1])-(n[1]-t[1])*(e[0]-t[0])}function Fd(t,n){return t[0]-n[0]||t[1]-n[1]}function Od(t){const n=t.length,e=[0,1];let r,i=2;for(r=2;r1&&Rd(t[e[i-2]],t[e[i-1]],t[r])<=0;)--i;e[i++]=r}return e.slice(0,i)}var Ud=Math.random,Id=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,1===arguments.length?(e=t,t=0):e-=t,function(){return n()*e+t}}return e.source=t,e}(Ud),Bd=function t(n){function e(t,e){return arguments.length<2&&(e=t,t=0),t=Math.floor(t),e=Math.floor(e)-t,function(){return Math.floor(n()*e+t)}}return e.source=t,e}(Ud),Yd=function t(n){function e(t,e){var r,i;return t=null==t?0:+t,e=null==e?1:+e,function(){var o;if(null!=r)o=r,r=null;else do{r=2*n()-1,o=2*n()-1,i=r*r+o*o}while(!i||i>1);return t+e*o*Math.sqrt(-2*Math.log(i)/i)}}return e.source=t,e}(Ud),Ld=function t(n){var e=Yd.source(n);function r(){var t=e.apply(this,arguments);return function(){return Math.exp(t())}}return r.source=t,r}(Ud),jd=function t(n){function e(t){return(t=+t)<=0?()=>0:function(){for(var e=0,r=t;r>1;--r)e+=n();return e+r*n()}}return e.source=t,e}(Ud),Hd=function t(n){var e=jd.source(n);function r(t){if(0==(t=+t))return n;var r=e(t);return function(){return r()/t}}return r.source=t,r}(Ud),Xd=function t(n){function e(t){return function(){return-Math.log1p(-n())/t}}return e.source=t,e}(Ud),Gd=function t(n){function e(t){if((t=+t)<0)throw new RangeError("invalid alpha");return t=1/-t,function(){return Math.pow(1-n(),t)}}return e.source=t,e}(Ud),Vd=function t(n){function e(t){if((t=+t)<0||t>1)throw new RangeError("invalid p");return function(){return Math.floor(n()+t)}}return e.source=t,e}(Ud),$d=function t(n){function e(t){if((t=+t)<0||t>1)throw new RangeError("invalid p");return 0===t?()=>1/0:1===t?()=>1:(t=Math.log1p(-t),function(){return 1+Math.floor(Math.log1p(-n())/t)})}return e.source=t,e}(Ud),Wd=function t(n){var e=Yd.source(n)();function r(t,r){if((t=+t)<0)throw new RangeError("invalid k");if(0===t)return()=>0;if(r=null==r?1:+r,1===t)return()=>-Math.log1p(-n())*r;var i=(t<1?t+1:t)-1/3,o=1/(3*Math.sqrt(i)),a=t<1?()=>Math.pow(n(),1/t):()=>1;return function(){do{do{var t=e(),u=1+o*t}while(u<=0);u*=u*u;var c=1-n()}while(c>=1-.0331*t*t*t*t&&Math.log(c)>=.5*t*t+i*(1-u+Math.log(u)));return i*u*a()*r}}return r.source=t,r}(Ud),Zd=function t(n){var e=Wd.source(n);function r(t,n){var r=e(t),i=e(n);return function(){var t=r();return 0===t?0:t/(t+i())}}return r.source=t,r}(Ud),Kd=function t(n){var e=$d.source(n),r=Zd.source(n);function i(t,n){return t=+t,(n=+n)>=1?()=>t:n<=0?()=>0:function(){for(var i=0,o=t,a=n;o*a>16&&o*(1-a)>16;){var u=Math.floor((o+1)*a),c=r(u,o-u+1)();c<=a?(i+=u,o-=u,a=(a-c)/(1-c)):(o=u-1,a/=c)}for(var f=a<.5,s=e(f?a:1-a),l=s(),h=0;l<=o;++h)l+=s();return i+(f?h:o-h)}}return i.source=t,i}(Ud),Qd=function t(n){function e(t,e,r){var i;return 0==(t=+t)?i=t=>-Math.log(t):(t=1/t,i=n=>Math.pow(n,t)),e=null==e?0:+e,r=null==r?1:+r,function(){return e+r*i(-Math.log1p(-n()))}}return e.source=t,e}(Ud),Jd=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,function(){return t+e*Math.tan(Math.PI*n())}}return e.source=t,e}(Ud),tp=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,function(){var r=n();return t+e*Math.log(r/(1-r))}}return e.source=t,e}(Ud),np=function t(n){var e=Wd.source(n),r=Kd.source(n);function i(t){return function(){for(var i=0,o=t;o>16;){var a=Math.floor(.875*o),u=e(a)();if(u>o)return i+r(a-1,o/u)();i+=a,o-=u}for(var c=-Math.log1p(-n()),f=0;c<=o;++f)c-=Math.log1p(-n());return i+f}}return i.source=t,i}(Ud);const ep=1/4294967296;function rp(t,n){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(n).domain(t)}return this}function ip(t,n){switch(arguments.length){case 0:break;case 1:"function"==typeof t?this.interpolator(t):this.range(t);break;default:this.domain(t),"function"==typeof n?this.interpolator(n):this.range(n)}return this}const op=Symbol("implicit");function ap(){var t=new Map,n=[],e=[],r=op;function i(i){var o=i+"",a=t.get(o);if(!a){if(r!==op)return r;t.set(o,a=n.push(i))}return e[(a-1)%e.length]}return i.domain=function(e){if(!arguments.length)return n.slice();n=[],t=new Map;for(const r of e){const e=r+"";t.has(e)||t.set(e,n.push(r))}return i},i.range=function(t){return arguments.length?(e=Array.from(t),i):e.slice()},i.unknown=function(t){return arguments.length?(r=t,i):r},i.copy=function(){return ap(n,e).unknown(r)},rp.apply(i,arguments),i}function up(){var t,n,e=ap().unknown(void 0),r=e.domain,i=e.range,o=0,a=1,u=!1,c=0,f=0,s=.5;function l(){var e=r().length,l=an&&(e=t,t=n,n=e),function(e){return Math.max(t,Math.min(n,e))}}(a[0],a[t-1])),r=t>2?pp:dp,i=o=null,l}function l(n){return isNaN(n=+n)?e:(i||(i=r(a.map(t),u,c)))(t(f(n)))}return l.invert=function(e){return f(n((o||(o=r(u,a.map(t),_r)))(e)))},l.domain=function(t){return arguments.length?(a=Array.from(t,fp),s()):a.slice()},l.range=function(t){return arguments.length?(u=Array.from(t),s()):u.slice()},l.rangeRound=function(t){return u=Array.from(t),c=Ar,s()},l.clamp=function(t){return arguments.length?(f=!!t||lp,s()):f!==lp},l.interpolate=function(t){return arguments.length?(c=t,s()):c},l.unknown=function(t){return arguments.length?(e=t,l):e},function(e,r){return t=e,n=r,s()}}function vp(){return yp()(lp,lp)}function _p(n,e,r,i){var o,a=F(n,e,r);switch((i=ac(null==i?",f":i)).type){case"s":var u=Math.max(Math.abs(n),Math.abs(e));return null!=i.precision||isNaN(o=vc(a,u))||(i.precision=o),t.formatPrefix(i,u);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(o=_c(a,Math.max(Math.abs(n),Math.abs(e))))||(i.precision=o-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(o=yc(a))||(i.precision=o-2*("%"===i.type))}return t.format(i)}function bp(t){var n=t.domain;return t.ticks=function(t){var e=n();return q(e[0],e[e.length-1],null==t?10:t)},t.tickFormat=function(t,e){var r=n();return _p(r[0],r[r.length-1],null==t?10:t,e)},t.nice=function(e){null==e&&(e=10);var r,i,o=n(),a=0,u=o.length-1,c=o[a],f=o[u],s=10;for(f0;){if((i=R(c,f,e))===r)return o[a]=c,o[u]=f,n(o);if(i>0)c=Math.floor(c/i)*i,f=Math.ceil(f/i)*i;else{if(!(i<0))break;c=Math.ceil(c*i)/i,f=Math.floor(f*i)/i}r=i}return t},t}function mp(t,n){var e,r=0,i=(t=t.slice()).length-1,o=t[r],a=t[i];return a0){for(;h<=d;++h)for(s=1,f=r(h);sc)break;g.push(l)}}else for(;h<=d;++h)for(s=a-1,f=r(h);s>=1;--s)if(!((l=f*s)c)break;g.push(l)}2*g.length0))return u;do{u.push(a=new Date(+e)),n(e,o),t(e)}while(a=n)for(;t(n),!e(n);)n.setTime(n-1)}),(function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;n(t,-1),!e(t););else for(;--r>=0;)for(;n(t,1),!e(t););}))},e&&(i.count=function(n,r){return Up.setTime(+n),Ip.setTime(+r),t(Up),t(Ip),Math.floor(e(Up,Ip))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(n){return r(n)%t==0}:function(n){return i.count(0,n)%t==0}):i:null}),i}var Yp=Bp((function(){}),(function(t,n){t.setTime(+t+n)}),(function(t,n){return n-t}));Yp.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?Bp((function(n){n.setTime(Math.floor(n/t)*t)}),(function(n,e){n.setTime(+n+e*t)}),(function(n,e){return(e-n)/t})):Yp:null};var Lp=Yp.range,jp=1e3,Hp=6e4,Xp=36e5,Gp=864e5,Vp=6048e5,$p=Bp((function(t){t.setTime(t-t.getMilliseconds())}),(function(t,n){t.setTime(+t+n*jp)}),(function(t,n){return(n-t)/jp}),(function(t){return t.getUTCSeconds()})),Wp=$p.range,Zp=Bp((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*jp)}),(function(t,n){t.setTime(+t+n*Hp)}),(function(t,n){return(n-t)/Hp}),(function(t){return t.getMinutes()})),Kp=Zp.range,Qp=Bp((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*jp-t.getMinutes()*Hp)}),(function(t,n){t.setTime(+t+n*Xp)}),(function(t,n){return(n-t)/Xp}),(function(t){return t.getHours()})),Jp=Qp.range,tg=Bp((t=>t.setHours(0,0,0,0)),((t,n)=>t.setDate(t.getDate()+n)),((t,n)=>(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Hp)/Gp),(t=>t.getDate()-1)),ng=tg.range;function eg(t){return Bp((function(n){n.setDate(n.getDate()-(n.getDay()+7-t)%7),n.setHours(0,0,0,0)}),(function(t,n){t.setDate(t.getDate()+7*n)}),(function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Hp)/Vp}))}var rg=eg(0),ig=eg(1),og=eg(2),ag=eg(3),ug=eg(4),cg=eg(5),fg=eg(6),sg=rg.range,lg=ig.range,hg=og.range,dg=ag.range,pg=ug.range,gg=cg.range,yg=fg.range,vg=Bp((function(t){t.setDate(1),t.setHours(0,0,0,0)}),(function(t,n){t.setMonth(t.getMonth()+n)}),(function(t,n){return n.getMonth()-t.getMonth()+12*(n.getFullYear()-t.getFullYear())}),(function(t){return t.getMonth()})),_g=vg.range,bg=Bp((function(t){t.setMonth(0,1),t.setHours(0,0,0,0)}),(function(t,n){t.setFullYear(t.getFullYear()+n)}),(function(t,n){return n.getFullYear()-t.getFullYear()}),(function(t){return t.getFullYear()}));bg.every=function(t){return isFinite(t=Math.floor(t))&&t>0?Bp((function(n){n.setFullYear(Math.floor(n.getFullYear()/t)*t),n.setMonth(0,1),n.setHours(0,0,0,0)}),(function(n,e){n.setFullYear(n.getFullYear()+e*t)})):null};var mg=bg.range,xg=Bp((function(t){t.setUTCSeconds(0,0)}),(function(t,n){t.setTime(+t+n*Hp)}),(function(t,n){return(n-t)/Hp}),(function(t){return t.getUTCMinutes()})),wg=xg.range,Mg=Bp((function(t){t.setUTCMinutes(0,0,0)}),(function(t,n){t.setTime(+t+n*Xp)}),(function(t,n){return(n-t)/Xp}),(function(t){return t.getUTCHours()})),Ag=Mg.range,Tg=Bp((function(t){t.setUTCHours(0,0,0,0)}),(function(t,n){t.setUTCDate(t.getUTCDate()+n)}),(function(t,n){return(n-t)/Gp}),(function(t){return t.getUTCDate()-1})),Sg=Tg.range;function Eg(t){return Bp((function(n){n.setUTCDate(n.getUTCDate()-(n.getUTCDay()+7-t)%7),n.setUTCHours(0,0,0,0)}),(function(t,n){t.setUTCDate(t.getUTCDate()+7*n)}),(function(t,n){return(n-t)/Vp}))}var kg=Eg(0),Ng=Eg(1),Cg=Eg(2),Pg=Eg(3),zg=Eg(4),Dg=Eg(5),qg=Eg(6),Rg=kg.range,Fg=Ng.range,Og=Cg.range,Ug=Pg.range,Ig=zg.range,Bg=Dg.range,Yg=qg.range,Lg=Bp((function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),(function(t,n){t.setUTCMonth(t.getUTCMonth()+n)}),(function(t,n){return n.getUTCMonth()-t.getUTCMonth()+12*(n.getUTCFullYear()-t.getUTCFullYear())}),(function(t){return t.getUTCMonth()})),jg=Lg.range,Hg=Bp((function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),(function(t,n){t.setUTCFullYear(t.getUTCFullYear()+n)}),(function(t,n){return n.getUTCFullYear()-t.getUTCFullYear()}),(function(t){return t.getUTCFullYear()}));Hg.every=function(t){return isFinite(t=Math.floor(t))&&t>0?Bp((function(n){n.setUTCFullYear(Math.floor(n.getUTCFullYear()/t)*t),n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0)}),(function(n,e){n.setUTCFullYear(n.getUTCFullYear()+e*t)})):null};var Xg=Hg.range;function Gg(t){if(0<=t.y&&t.y<100){var n=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return n.setFullYear(t.y),n}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function Vg(t){if(0<=t.y&&t.y<100){var n=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return n.setUTCFullYear(t.y),n}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function $g(t,n,e){return{y:t,m:n,d:e,H:0,M:0,S:0,L:0}}function Wg(t){var n=t.dateTime,e=t.date,r=t.time,i=t.periods,o=t.days,a=t.shortDays,u=t.months,c=t.shortMonths,f=ry(i),s=iy(i),l=ry(o),h=iy(o),d=ry(a),p=iy(a),g=ry(u),y=iy(u),v=ry(c),_=iy(c),b={a:function(t){return a[t.getDay()]},A:function(t){return o[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return u[t.getMonth()]},c:null,d:Ty,e:Ty,f:Cy,g:Yy,G:jy,H:Sy,I:Ey,j:ky,L:Ny,m:Py,M:zy,p:function(t){return i[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:hv,s:dv,S:Dy,u:qy,U:Ry,V:Oy,w:Uy,W:Iy,x:null,X:null,y:By,Y:Ly,Z:Hy,"%":lv},m={a:function(t){return a[t.getUTCDay()]},A:function(t){return o[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return u[t.getUTCMonth()]},c:null,d:Xy,e:Xy,f:Zy,g:uv,G:fv,H:Gy,I:Vy,j:$y,L:Wy,m:Ky,M:Qy,p:function(t){return i[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:hv,s:dv,S:Jy,u:tv,U:nv,V:rv,w:iv,W:ov,x:null,X:null,y:av,Y:cv,Z:sv,"%":lv},x={a:function(t,n,e){var r=d.exec(n.slice(e));return r?(t.w=p.get(r[0].toLowerCase()),e+r[0].length):-1},A:function(t,n,e){var r=l.exec(n.slice(e));return r?(t.w=h.get(r[0].toLowerCase()),e+r[0].length):-1},b:function(t,n,e){var r=v.exec(n.slice(e));return r?(t.m=_.get(r[0].toLowerCase()),e+r[0].length):-1},B:function(t,n,e){var r=g.exec(n.slice(e));return r?(t.m=y.get(r[0].toLowerCase()),e+r[0].length):-1},c:function(t,e,r){return A(t,n,e,r)},d:gy,e:gy,f:xy,g:ly,G:sy,H:vy,I:vy,j:yy,L:my,m:py,M:_y,p:function(t,n,e){var r=f.exec(n.slice(e));return r?(t.p=s.get(r[0].toLowerCase()),e+r[0].length):-1},q:dy,Q:My,s:Ay,S:by,u:ay,U:uy,V:cy,w:oy,W:fy,x:function(t,n,r){return A(t,e,n,r)},X:function(t,n,e){return A(t,r,n,e)},y:ly,Y:sy,Z:hy,"%":wy};function w(t,n){return function(e){var r,i,o,a=[],u=-1,c=0,f=t.length;for(e instanceof Date||(e=new Date(+e));++u53)return null;"w"in o||(o.w=1),"Z"in o?(i=(r=Vg($g(o.y,0,1))).getUTCDay(),r=i>4||0===i?Ng.ceil(r):Ng(r),r=Tg.offset(r,7*(o.V-1)),o.y=r.getUTCFullYear(),o.m=r.getUTCMonth(),o.d=r.getUTCDate()+(o.w+6)%7):(i=(r=Gg($g(o.y,0,1))).getDay(),r=i>4||0===i?ig.ceil(r):ig(r),r=tg.offset(r,7*(o.V-1)),o.y=r.getFullYear(),o.m=r.getMonth(),o.d=r.getDate()+(o.w+6)%7)}else("W"in o||"U"in o)&&("w"in o||(o.w="u"in o?o.u%7:"W"in o?1:0),i="Z"in o?Vg($g(o.y,0,1)).getUTCDay():Gg($g(o.y,0,1)).getDay(),o.m=0,o.d="W"in o?(o.w+6)%7+7*o.W-(i+5)%7:o.w+7*o.U-(i+6)%7);return"Z"in o?(o.H+=o.Z/100|0,o.M+=o.Z%100,Vg(o)):Gg(o)}}function A(t,n,e,r){for(var i,o,a=0,u=n.length,c=e.length;a=c)return-1;if(37===(i=n.charCodeAt(a++))){if(i=n.charAt(a++),!(o=x[i in Kg?n.charAt(a++):i])||(r=o(t,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}return b.x=w(e,b),b.X=w(r,b),b.c=w(n,b),m.x=w(e,m),m.X=w(r,m),m.c=w(n,m),{format:function(t){var n=w(t+="",b);return n.toString=function(){return t},n},parse:function(t){var n=M(t+="",!1);return n.toString=function(){return t},n},utcFormat:function(t){var n=w(t+="",m);return n.toString=function(){return t},n},utcParse:function(t){var n=M(t+="",!0);return n.toString=function(){return t},n}}}var Zg,Kg={"-":"",_:" ",0:"0"},Qg=/^\s*\d+/,Jg=/^%/,ty=/[\\^$*+?|[\]().{}]/g;function ny(t,n,e){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o[t.toLowerCase(),n])))}function oy(t,n,e){var r=Qg.exec(n.slice(e,e+1));return r?(t.w=+r[0],e+r[0].length):-1}function ay(t,n,e){var r=Qg.exec(n.slice(e,e+1));return r?(t.u=+r[0],e+r[0].length):-1}function uy(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.U=+r[0],e+r[0].length):-1}function cy(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.V=+r[0],e+r[0].length):-1}function fy(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.W=+r[0],e+r[0].length):-1}function sy(t,n,e){var r=Qg.exec(n.slice(e,e+4));return r?(t.y=+r[0],e+r[0].length):-1}function ly(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.y=+r[0]+(+r[0]>68?1900:2e3),e+r[0].length):-1}function hy(t,n,e){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(n.slice(e,e+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),e+r[0].length):-1}function dy(t,n,e){var r=Qg.exec(n.slice(e,e+1));return r?(t.q=3*r[0]-3,e+r[0].length):-1}function py(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.m=r[0]-1,e+r[0].length):-1}function gy(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.d=+r[0],e+r[0].length):-1}function yy(t,n,e){var r=Qg.exec(n.slice(e,e+3));return r?(t.m=0,t.d=+r[0],e+r[0].length):-1}function vy(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.H=+r[0],e+r[0].length):-1}function _y(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.M=+r[0],e+r[0].length):-1}function by(t,n,e){var r=Qg.exec(n.slice(e,e+2));return r?(t.S=+r[0],e+r[0].length):-1}function my(t,n,e){var r=Qg.exec(n.slice(e,e+3));return r?(t.L=+r[0],e+r[0].length):-1}function xy(t,n,e){var r=Qg.exec(n.slice(e,e+6));return r?(t.L=Math.floor(r[0]/1e3),e+r[0].length):-1}function wy(t,n,e){var r=Jg.exec(n.slice(e,e+1));return r?e+r[0].length:-1}function My(t,n,e){var r=Qg.exec(n.slice(e));return r?(t.Q=+r[0],e+r[0].length):-1}function Ay(t,n,e){var r=Qg.exec(n.slice(e));return r?(t.s=+r[0],e+r[0].length):-1}function Ty(t,n){return ny(t.getDate(),n,2)}function Sy(t,n){return ny(t.getHours(),n,2)}function Ey(t,n){return ny(t.getHours()%12||12,n,2)}function ky(t,n){return ny(1+tg.count(bg(t),t),n,3)}function Ny(t,n){return ny(t.getMilliseconds(),n,3)}function Cy(t,n){return Ny(t,n)+"000"}function Py(t,n){return ny(t.getMonth()+1,n,2)}function zy(t,n){return ny(t.getMinutes(),n,2)}function Dy(t,n){return ny(t.getSeconds(),n,2)}function qy(t){var n=t.getDay();return 0===n?7:n}function Ry(t,n){return ny(rg.count(bg(t)-1,t),n,2)}function Fy(t){var n=t.getDay();return n>=4||0===n?ug(t):ug.ceil(t)}function Oy(t,n){return t=Fy(t),ny(ug.count(bg(t),t)+(4===bg(t).getDay()),n,2)}function Uy(t){return t.getDay()}function Iy(t,n){return ny(ig.count(bg(t)-1,t),n,2)}function By(t,n){return ny(t.getFullYear()%100,n,2)}function Yy(t,n){return ny((t=Fy(t)).getFullYear()%100,n,2)}function Ly(t,n){return ny(t.getFullYear()%1e4,n,4)}function jy(t,n){var e=t.getDay();return ny((t=e>=4||0===e?ug(t):ug.ceil(t)).getFullYear()%1e4,n,4)}function Hy(t){var n=t.getTimezoneOffset();return(n>0?"-":(n*=-1,"+"))+ny(n/60|0,"0",2)+ny(n%60,"0",2)}function Xy(t,n){return ny(t.getUTCDate(),n,2)}function Gy(t,n){return ny(t.getUTCHours(),n,2)}function Vy(t,n){return ny(t.getUTCHours()%12||12,n,2)}function $y(t,n){return ny(1+Tg.count(Hg(t),t),n,3)}function Wy(t,n){return ny(t.getUTCMilliseconds(),n,3)}function Zy(t,n){return Wy(t,n)+"000"}function Ky(t,n){return ny(t.getUTCMonth()+1,n,2)}function Qy(t,n){return ny(t.getUTCMinutes(),n,2)}function Jy(t,n){return ny(t.getUTCSeconds(),n,2)}function tv(t){var n=t.getUTCDay();return 0===n?7:n}function nv(t,n){return ny(kg.count(Hg(t)-1,t),n,2)}function ev(t){var n=t.getUTCDay();return n>=4||0===n?zg(t):zg.ceil(t)}function rv(t,n){return t=ev(t),ny(zg.count(Hg(t),t)+(4===Hg(t).getUTCDay()),n,2)}function iv(t){return t.getUTCDay()}function ov(t,n){return ny(Ng.count(Hg(t)-1,t),n,2)}function av(t,n){return ny(t.getUTCFullYear()%100,n,2)}function uv(t,n){return ny((t=ev(t)).getUTCFullYear()%100,n,2)}function cv(t,n){return ny(t.getUTCFullYear()%1e4,n,4)}function fv(t,n){var e=t.getUTCDay();return ny((t=e>=4||0===e?zg(t):zg.ceil(t)).getUTCFullYear()%1e4,n,4)}function sv(){return"+0000"}function lv(){return"%"}function hv(t){return+t}function dv(t){return Math.floor(+t/1e3)}function pv(n){return Zg=Wg(n),t.timeFormat=Zg.format,t.timeParse=Zg.parse,t.utcFormat=Zg.utcFormat,t.utcParse=Zg.utcParse,Zg}t.timeFormat=void 0,t.timeParse=void 0,t.utcFormat=void 0,t.utcParse=void 0,pv({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var gv="%Y-%m-%dT%H:%M:%S.%LZ";var yv=Date.prototype.toISOString?function(t){return t.toISOString()}:t.utcFormat(gv);var vv=+new Date("2000-01-01T00:00:00.000Z")?function(t){var n=new Date(t);return isNaN(n)?null:n}:t.utcParse(gv),_v=1e3,bv=6e4,mv=36e5,xv=864e5,wv=2592e6,Mv=31536e6;function Av(t){return new Date(t)}function Tv(t){return t instanceof Date?+t:+new Date(+t)}function Sv(t,n,r,i,o,a,u,c,f){var s=vp(),l=s.invert,h=s.domain,d=f(".%L"),p=f(":%S"),g=f("%I:%M"),y=f("%I %p"),v=f("%a %d"),_=f("%b %d"),b=f("%B"),m=f("%Y"),x=[[u,1,_v],[u,5,5e3],[u,15,15e3],[u,30,3e4],[a,1,bv],[a,5,3e5],[a,15,9e5],[a,30,18e5],[o,1,mv],[o,3,108e5],[o,6,216e5],[o,12,432e5],[i,1,xv],[i,2,1728e5],[r,1,6048e5],[n,1,wv],[n,3,7776e6],[t,1,Mv]];function w(e){return(u(e)hr(t[t.length-1]),Hv=new Array(3).concat("d8b365f5f5f55ab4ac","a6611adfc27d80cdc1018571","a6611adfc27df5f5f580cdc1018571","8c510ad8b365f6e8c3c7eae55ab4ac01665e","8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e","8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e","8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e","5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30","5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(zv),Xv=jv(Hv),Gv=new Array(3).concat("af8dc3f7f7f77fbf7b","7b3294c2a5cfa6dba0008837","7b3294c2a5cff7f7f7a6dba0008837","762a83af8dc3e7d4e8d9f0d37fbf7b1b7837","762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837","762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837","762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837","40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b","40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(zv),Vv=jv(Gv),$v=new Array(3).concat("e9a3c9f7f7f7a1d76a","d01c8bf1b6dab8e1864dac26","d01c8bf1b6daf7f7f7b8e1864dac26","c51b7de9a3c9fde0efe6f5d0a1d76a4d9221","c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221","c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221","c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221","8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419","8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(zv),Wv=jv($v),Zv=new Array(3).concat("998ec3f7f7f7f1a340","5e3c99b2abd2fdb863e66101","5e3c99b2abd2f7f7f7fdb863e66101","542788998ec3d8daebfee0b6f1a340b35806","542788998ec3d8daebf7f7f7fee0b6f1a340b35806","5427888073acb2abd2d8daebfee0b6fdb863e08214b35806","5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806","2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08","2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(zv),Kv=jv(Zv),Qv=new Array(3).concat("ef8a62f7f7f767a9cf","ca0020f4a58292c5de0571b0","ca0020f4a582f7f7f792c5de0571b0","b2182bef8a62fddbc7d1e5f067a9cf2166ac","b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac","b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac","b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac","67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061","67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(zv),Jv=jv(Qv),t_=new Array(3).concat("ef8a62ffffff999999","ca0020f4a582bababa404040","ca0020f4a582ffffffbababa404040","b2182bef8a62fddbc7e0e0e09999994d4d4d","b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d","b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d","b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d","67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a","67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(zv),n_=jv(t_),e_=new Array(3).concat("fc8d59ffffbf91bfdb","d7191cfdae61abd9e92c7bb6","d7191cfdae61ffffbfabd9e92c7bb6","d73027fc8d59fee090e0f3f891bfdb4575b4","d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4","d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4","d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4","a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695","a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(zv),r_=jv(e_),i_=new Array(3).concat("fc8d59ffffbf91cf60","d7191cfdae61a6d96a1a9641","d7191cfdae61ffffbfa6d96a1a9641","d73027fc8d59fee08bd9ef8b91cf601a9850","d73027fc8d59fee08bffffbfd9ef8b91cf601a9850","d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850","d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850","a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837","a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(zv),o_=jv(i_),a_=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(zv),u_=jv(a_),c_=new Array(3).concat("e5f5f999d8c92ca25f","edf8fbb2e2e266c2a4238b45","edf8fbb2e2e266c2a42ca25f006d2c","edf8fbccece699d8c966c2a42ca25f006d2c","edf8fbccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(zv),f_=jv(c_),s_=new Array(3).concat("e0ecf49ebcda8856a7","edf8fbb3cde38c96c688419d","edf8fbb3cde38c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(zv),l_=jv(s_),h_=new Array(3).concat("e0f3dba8ddb543a2ca","f0f9e8bae4bc7bccc42b8cbe","f0f9e8bae4bc7bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(zv),d_=jv(h_),p_=new Array(3).concat("fee8c8fdbb84e34a33","fef0d9fdcc8afc8d59d7301f","fef0d9fdcc8afc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(zv),g_=jv(p_),y_=new Array(3).concat("ece2f0a6bddb1c9099","f6eff7bdc9e167a9cf02818a","f6eff7bdc9e167a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(zv),v_=jv(y_),__=new Array(3).concat("ece7f2a6bddb2b8cbe","f1eef6bdc9e174a9cf0570b0","f1eef6bdc9e174a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(zv),b_=jv(__),m_=new Array(3).concat("e7e1efc994c7dd1c77","f1eef6d7b5d8df65b0ce1256","f1eef6d7b5d8df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(zv),x_=jv(m_),w_=new Array(3).concat("fde0ddfa9fb5c51b8a","feebe2fbb4b9f768a1ae017e","feebe2fbb4b9f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(zv),M_=jv(w_),A_=new Array(3).concat("edf8b17fcdbb2c7fb8","ffffcca1dab441b6c4225ea8","ffffcca1dab441b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(zv),T_=jv(A_),S_=new Array(3).concat("f7fcb9addd8e31a354","ffffccc2e69978c679238443","ffffccc2e69978c67931a354006837","ffffccd9f0a3addd8e78c67931a354006837","ffffccd9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(zv),E_=jv(S_),k_=new Array(3).concat("fff7bcfec44fd95f0e","ffffd4fed98efe9929cc4c02","ffffd4fed98efe9929d95f0e993404","ffffd4fee391fec44ffe9929d95f0e993404","ffffd4fee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(zv),N_=jv(k_),C_=new Array(3).concat("ffeda0feb24cf03b20","ffffb2fecc5cfd8d3ce31a1c","ffffb2fecc5cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(zv),P_=jv(C_),z_=new Array(3).concat("deebf79ecae13182bd","eff3ffbdd7e76baed62171b5","eff3ffbdd7e76baed63182bd08519c","eff3ffc6dbef9ecae16baed63182bd08519c","eff3ffc6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(zv),D_=jv(z_),q_=new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(zv),R_=jv(q_),F_=new Array(3).concat("f0f0f0bdbdbd636363","f7f7f7cccccc969696525252","f7f7f7cccccc969696636363252525","f7f7f7d9d9d9bdbdbd969696636363252525","f7f7f7d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(zv),O_=jv(F_),U_=new Array(3).concat("efedf5bcbddc756bb1","f2f0f7cbc9e29e9ac86a51a3","f2f0f7cbc9e29e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(zv),I_=jv(U_),B_=new Array(3).concat("fee0d2fc9272de2d26","fee5d9fcae91fb6a4acb181d","fee5d9fcae91fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(zv),Y_=jv(B_),L_=new Array(3).concat("fee6cefdae6be6550d","feeddefdbe85fd8d3cd94701","feeddefdbe85fd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(zv),j_=jv(L_);var H_=Lr(tr(300,.5,0),tr(-240,.5,1)),X_=Lr(tr(-100,.75,.35),tr(80,1.5,.8)),G_=Lr(tr(260,.75,.35),tr(80,1.5,.8)),V_=tr();var $_=ve(),W_=Math.PI/3,Z_=2*Math.PI/3;function K_(t){var n=t.length;return function(e){return t[Math.max(0,Math.min(n-1,Math.floor(e*n)))]}}var Q_=K_(zv("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),J_=K_(zv("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),tb=K_(zv("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),nb=K_(zv("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));function eb(t){return function(){return t}}var rb=Math.abs,ib=Math.atan2,ob=Math.cos,ab=Math.max,ub=Math.min,cb=Math.sin,fb=Math.sqrt,sb=1e-12,lb=Math.PI,hb=lb/2,db=2*lb;function pb(t){return t>1?0:t<-1?lb:Math.acos(t)}function gb(t){return t>=1?hb:t<=-1?-hb:Math.asin(t)}function yb(t){return t.innerRadius}function vb(t){return t.outerRadius}function _b(t){return t.startAngle}function bb(t){return t.endAngle}function mb(t){return t&&t.padAngle}function xb(t,n,e,r,i,o,a,u){var c=e-t,f=r-n,s=a-i,l=u-o,h=l*c-s*f;if(!(h*hC*C+P*P&&(A=S,T=E),{cx:A,cy:T,x01:-s,y01:-l,x11:A*(i/x-1),y11:T*(i/x-1)}}var Mb=Array.prototype.slice;function Ab(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function Tb(t){this._context=t}function Sb(t){return new Tb(t)}function Eb(t){return t[0]}function kb(t){return t[1]}function Nb(t,n){var e=eb(!0),r=null,i=Sb,o=null;function a(a){var u,c,f,s=(a=Ab(a)).length,l=!1;for(null==r&&(o=i(f=fa())),u=0;u<=s;++u)!(u=s;--l)u.point(y[l],v[l]);u.lineEnd(),u.areaEnd()}g&&(y[f]=+t(h,f,c),v[f]=+n(h,f,c),u.point(r?+r(h,f,c):y[f],e?+e(h,f,c):v[f]))}if(d)return u=null,d+""||null}function f(){return Nb().defined(i).curve(a).context(o)}return t="function"==typeof t?t:void 0===t?Eb:eb(+t),n="function"==typeof n?n:eb(void 0===n?0:+n),e="function"==typeof e?e:void 0===e?kb:eb(+e),c.x=function(n){return arguments.length?(t="function"==typeof n?n:eb(+n),r=null,c):t},c.x0=function(n){return arguments.length?(t="function"==typeof n?n:eb(+n),c):t},c.x1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:eb(+t),c):r},c.y=function(t){return arguments.length?(n="function"==typeof t?t:eb(+t),e=null,c):n},c.y0=function(t){return arguments.length?(n="function"==typeof t?t:eb(+t),c):n},c.y1=function(t){return arguments.length?(e=null==t?null:"function"==typeof t?t:eb(+t),c):e},c.lineX0=c.lineY0=function(){return f().x(t).y(n)},c.lineY1=function(){return f().x(t).y(e)},c.lineX1=function(){return f().x(r).y(n)},c.defined=function(t){return arguments.length?(i="function"==typeof t?t:eb(!!t),c):i},c.curve=function(t){return arguments.length?(a=t,null!=o&&(u=a(o)),c):a},c.context=function(t){return arguments.length?(null==t?o=u=null:u=a(o=t),c):o},c}function Pb(t,n){return nt?1:n>=t?0:NaN}function zb(t){return t}Tb.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:this._context.lineTo(t,n)}}};var Db=Rb(Sb);function qb(t){this._curve=t}function Rb(t){function n(n){return new qb(t(n))}return n._curve=t,n}function Fb(t){var n=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?n(Rb(t)):n()._curve},t}function Ob(){return Fb(Nb().curve(Db))}function Ub(){var t=Cb().curve(Db),n=t.curve,e=t.lineX0,r=t.lineX1,i=t.lineY0,o=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return Fb(e())},delete t.lineX0,t.lineEndAngle=function(){return Fb(r())},delete t.lineX1,t.lineInnerRadius=function(){return Fb(i())},delete t.lineY0,t.lineOuterRadius=function(){return Fb(o())},delete t.lineY1,t.curve=function(t){return arguments.length?n(Rb(t)):n()._curve},t}function Ib(t,n){return[(n=+n)*Math.cos(t-=Math.PI/2),n*Math.sin(t)]}function Bb(t){return t.source}function Yb(t){return t.target}function Lb(t){var n=Bb,e=Yb,r=Eb,i=kb,o=null;function a(){var a,u=Mb.call(arguments),c=n.apply(this,u),f=e.apply(this,u);if(o||(o=a=fa()),t(o,+r.apply(this,(u[0]=c,u)),+i.apply(this,u),+r.apply(this,(u[0]=f,u)),+i.apply(this,u)),a)return o=null,a+""||null}return a.source=function(t){return arguments.length?(n=t,a):n},a.target=function(t){return arguments.length?(e=t,a):e},a.x=function(t){return arguments.length?(r="function"==typeof t?t:eb(+t),a):r},a.y=function(t){return arguments.length?(i="function"==typeof t?t:eb(+t),a):i},a.context=function(t){return arguments.length?(o=null==t?null:t,a):o},a}function jb(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n=(n+r)/2,e,n,i,r,i)}function Hb(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n,e=(e+i)/2,r,e,r,i)}function Xb(t,n,e,r,i){var o=Ib(n,e),a=Ib(n,e=(e+i)/2),u=Ib(r,e),c=Ib(r,i);t.moveTo(o[0],o[1]),t.bezierCurveTo(a[0],a[1],u[0],u[1],c[0],c[1])}qb.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,n){this._curve.point(n*Math.sin(t),n*-Math.cos(t))}};var Gb={draw:function(t,n){var e=Math.sqrt(n/lb);t.moveTo(e,0),t.arc(0,0,e,0,db)}},Vb={draw:function(t,n){var e=Math.sqrt(n/5)/2;t.moveTo(-3*e,-e),t.lineTo(-e,-e),t.lineTo(-e,-3*e),t.lineTo(e,-3*e),t.lineTo(e,-e),t.lineTo(3*e,-e),t.lineTo(3*e,e),t.lineTo(e,e),t.lineTo(e,3*e),t.lineTo(-e,3*e),t.lineTo(-e,e),t.lineTo(-3*e,e),t.closePath()}},$b=Math.sqrt(1/3),Wb=2*$b,Zb={draw:function(t,n){var e=Math.sqrt(n/Wb),r=e*$b;t.moveTo(0,-e),t.lineTo(r,0),t.lineTo(0,e),t.lineTo(-r,0),t.closePath()}},Kb=Math.sin(lb/10)/Math.sin(7*lb/10),Qb=Math.sin(db/10)*Kb,Jb=-Math.cos(db/10)*Kb,tm={draw:function(t,n){var e=Math.sqrt(.8908130915292852*n),r=Qb*e,i=Jb*e;t.moveTo(0,-e),t.lineTo(r,i);for(var o=1;o<5;++o){var a=db*o/5,u=Math.cos(a),c=Math.sin(a);t.lineTo(c*e,-u*e),t.lineTo(u*r-c*i,c*r+u*i)}t.closePath()}},nm={draw:function(t,n){var e=Math.sqrt(n),r=-e/2;t.rect(r,r,e,e)}},em=Math.sqrt(3),rm={draw:function(t,n){var e=-Math.sqrt(n/(3*em));t.moveTo(0,2*e),t.lineTo(-em*e,-e),t.lineTo(em*e,-e),t.closePath()}},im=-.5,om=Math.sqrt(3)/2,am=1/Math.sqrt(12),um=3*(am/2+1),cm={draw:function(t,n){var e=Math.sqrt(n/um),r=e/2,i=e*am,o=r,a=e*am+e,u=-o,c=a;t.moveTo(r,i),t.lineTo(o,a),t.lineTo(u,c),t.lineTo(im*r-om*i,om*r+im*i),t.lineTo(im*o-om*a,om*o+im*a),t.lineTo(im*u-om*c,om*u+im*c),t.lineTo(im*r+om*i,im*i-om*r),t.lineTo(im*o+om*a,im*a-om*o),t.lineTo(im*u+om*c,im*c-om*u),t.closePath()}},fm=[Gb,Vb,Zb,nm,tm,rm,cm];function sm(){}function lm(t,n,e){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+n)/6,(t._y0+4*t._y1+e)/6)}function hm(t){this._context=t}function dm(t){this._context=t}function pm(t){this._context=t}hm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:lm(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:lm(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},dm.prototype={areaStart:sm,areaEnd:sm,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x2=t,this._y2=n;break;case 1:this._point=2,this._x3=t,this._y3=n;break;case 2:this._point=3,this._x4=t,this._y4=n,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+n)/6);break;default:lm(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},pm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var e=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break;case 3:this._point=4;default:lm(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}};class gm{constructor(t,n){this._context=t,this._x=n}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line}point(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,n,t,n):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+n)/2,t,this._y0,t,n)}this._x0=t,this._y0=n}}function ym(t,n){this._basis=new hm(t),this._beta=n}ym.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,n=this._y,e=t.length-1;if(e>0)for(var r,i=t[0],o=n[0],a=t[e]-i,u=n[e]-o,c=-1;++c<=e;)r=c/e,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*a),this._beta*n[c]+(1-this._beta)*(o+r*u));this._x=this._y=null,this._basis.lineEnd()},point:function(t,n){this._x.push(+t),this._y.push(+n)}};var vm=function t(n){function e(t){return 1===n?new hm(t):new ym(t,n)}return e.beta=function(n){return t(+n)},e}(.85);function _m(t,n,e){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-n),t._y2+t._k*(t._y1-e),t._x2,t._y2)}function bm(t,n){this._context=t,this._k=(1-n)/6}bm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:_m(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2,this._x1=t,this._y1=n;break;case 2:this._point=3;default:_m(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var mm=function t(n){function e(t){return new bm(t,n)}return e.tension=function(n){return t(+n)},e}(0);function xm(t,n){this._context=t,this._k=(1-n)/6}xm.prototype={areaStart:sm,areaEnd:sm,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:_m(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var wm=function t(n){function e(t){return new xm(t,n)}return e.tension=function(n){return t(+n)},e}(0);function Mm(t,n){this._context=t,this._k=(1-n)/6}Mm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:_m(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Am=function t(n){function e(t){return new Mm(t,n)}return e.tension=function(n){return t(+n)},e}(0);function Tm(t,n,e){var r=t._x1,i=t._y1,o=t._x2,a=t._y2;if(t._l01_a>sb){var u=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*u-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*u-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>sb){var f=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,s=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*f+t._x1*t._l23_2a-n*t._l12_2a)/s,a=(a*f+t._y1*t._l23_2a-e*t._l12_2a)/s}t._context.bezierCurveTo(r,i,o,a,t._x2,t._y2)}function Sm(t,n){this._context=t,this._alpha=n}Sm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;default:Tm(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Em=function t(n){function e(t){return n?new Sm(t,n):new bm(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function km(t,n){this._context=t,this._alpha=n}km.prototype={areaStart:sm,areaEnd:sm,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:Tm(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Nm=function t(n){function e(t){return n?new km(t,n):new xm(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function Cm(t,n){this._context=t,this._alpha=n}Cm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Tm(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Pm=function t(n){function e(t){return n?new Cm(t,n):new Mm(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function zm(t){this._context=t}function Dm(t){return t<0?-1:1}function qm(t,n,e){var r=t._x1-t._x0,i=n-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),a=(e-t._y1)/(i||r<0&&-0),u=(o*i+a*r)/(r+i);return(Dm(o)+Dm(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(u))||0}function Rm(t,n){var e=t._x1-t._x0;return e?(3*(t._y1-t._y0)/e-n)/2:n}function Fm(t,n,e){var r=t._x0,i=t._y0,o=t._x1,a=t._y1,u=(o-r)/3;t._context.bezierCurveTo(r+u,i+u*n,o-u,a-u*e,o,a)}function Om(t){this._context=t}function Um(t){this._context=new Im(t)}function Im(t){this._context=t}function Bm(t){this._context=t}function Ym(t){var n,e,r=t.length-1,i=new Array(r),o=new Array(r),a=new Array(r);for(i[0]=0,o[0]=2,a[0]=t[0]+2*t[1],n=1;n=0;--n)i[n]=(a[n]-i[n+1])/o[n];for(o[r-1]=(t[r]+i[r-1])/2,n=0;n1)for(var e,r,i,o=1,a=t[n[0]],u=a.length;o=0;)e[n]=n;return e}function Xm(t,n){return t[n]}function Gm(t){const n=[];return n.key=t,n}function Vm(t){var n=t.map($m);return Hm(t).sort((function(t,e){return n[t]-n[e]}))}function $m(t){for(var n,e=-1,r=0,i=t.length,o=-1/0;++eo&&(o=n,r=e);return r}function Wm(t){var n=t.map(Zm);return Hm(t).sort((function(t,e){return n[t]-n[e]}))}function Zm(t){for(var n,e=0,r=-1,i=t.length;++r=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,n),this._context.lineTo(t,n);else{var e=this._x*(1-this._t)+t*this._t;this._context.lineTo(e,this._y),this._context.lineTo(e,n)}}this._x=t,this._y=n}};var Km=t=>()=>t;function Qm(t,{sourceEvent:n,target:e,transform:r,dispatch:i}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:i}})}function Jm(t,n,e){this.k=t,this.x=n,this.y=e}Jm.prototype={constructor:Jm,scale:function(t){return 1===t?this:new Jm(this.k*t,this.x,this.y)},translate:function(t,n){return 0===t&0===n?this:new Jm(this.k,this.x+this.k*t,this.y+this.k*n)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var tx=new Jm(1,0,0);function nx(t){for(;!t.__zoom;)if(!(t=t.parentNode))return tx;return t.__zoom}function ex(t){t.stopImmediatePropagation()}function rx(t){t.preventDefault(),t.stopImmediatePropagation()}function ix(t){return!(t.ctrlKey&&"wheel"!==t.type||t.button)}function ox(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t).hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]:[[0,0],[t.clientWidth,t.clientHeight]]}function ax(){return this.__zoom||tx}function ux(t){return-t.deltaY*(1===t.deltaMode?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function cx(){return navigator.maxTouchPoints||"ontouchstart"in this}function fx(t,n,e){var r=t.invertX(n[0][0])-e[0][0],i=t.invertX(n[1][0])-e[1][0],o=t.invertY(n[0][1])-e[0][1],a=t.invertY(n[1][1])-e[1][1];return t.translate(i>r?(r+i)/2:Math.min(0,r)||Math.max(0,i),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}nx.prototype=Jm.prototype,t.Adder=g,t.Delaunay=nu,t.FormatSpecifier=uc,t.InternMap=y,t.InternSet=v,t.Voronoi=Wa,t.active=function(t,n){var e,r,i=t.__transition;if(i)for(r in n=null==n?null:n+"",i)if((e=i[r]).state>1&&e.name===n)return new ji([[t]],_o,n,+r);return null},t.arc=function(){var t=yb,n=vb,e=eb(0),r=null,i=_b,o=bb,a=mb,u=null;function c(){var c,f,s=+t.apply(this,arguments),l=+n.apply(this,arguments),h=i.apply(this,arguments)-hb,d=o.apply(this,arguments)-hb,p=rb(d-h),g=d>h;if(u||(u=c=fa()),lsb)if(p>db-sb)u.moveTo(l*ob(h),l*cb(h)),u.arc(0,0,l,h,d,!g),s>sb&&(u.moveTo(s*ob(d),s*cb(d)),u.arc(0,0,s,d,h,g));else{var y,v,_=h,b=d,m=h,x=d,w=p,M=p,A=a.apply(this,arguments)/2,T=A>sb&&(r?+r.apply(this,arguments):fb(s*s+l*l)),S=ub(rb(l-s)/2,+e.apply(this,arguments)),E=S,k=S;if(T>sb){var N=gb(T/s*cb(A)),C=gb(T/l*cb(A));(w-=2*N)>sb?(m+=N*=g?1:-1,x-=N):(w=0,m=x=(h+d)/2),(M-=2*C)>sb?(_+=C*=g?1:-1,b-=C):(M=0,_=b=(h+d)/2)}var P=l*ob(_),z=l*cb(_),D=s*ob(x),q=s*cb(x);if(S>sb){var R,F=l*ob(b),O=l*cb(b),U=s*ob(m),I=s*cb(m);if(psb?k>sb?(y=wb(U,I,P,z,l,k,g),v=wb(F,O,D,q,l,k,g),u.moveTo(y.cx+y.x01,y.cy+y.y01),ksb&&w>sb?E>sb?(y=wb(D,q,F,O,s,-E,g),v=wb(P,z,U,I,s,-E,g),u.lineTo(y.cx+y.x01,y.cy+y.y01),E>a,f=i+2*u>>a,s=wa(20);function l(r){var i=new Float32Array(c*f),l=new Float32Array(c*f);r.forEach((function(r,o,s){var l=+t(r,o,s)+u>>a,h=+n(r,o,s)+u>>a,d=+e(r,o,s);l>=0&&l=0&&h>a),Ca({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a),Na({width:c,height:f,data:i},{width:c,height:f,data:l},o>>a),Ca({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a),Na({width:c,height:f,data:i},{width:c,height:f,data:l},o>>a),Ca({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a);var d=s(i);if(!Array.isArray(d)){var p=B(i);d=F(0,p,d),(d=Z(0,Math.floor(p/d)*d,d)).shift()}return ka().thresholds(d).size([c,f])(i).map(h)}function h(t){return t.value*=Math.pow(2,-2*a),t.coordinates.forEach(d),t}function d(t){t.forEach(p)}function p(t){t.forEach(g)}function g(t){t[0]=t[0]*Math.pow(2,a)-u,t[1]=t[1]*Math.pow(2,a)-u}function y(){return c=r+2*(u=3*o)>>a,f=i+2*u>>a,l}return l.x=function(n){return arguments.length?(t="function"==typeof n?n:wa(+n),l):t},l.y=function(t){return arguments.length?(n="function"==typeof t?t:wa(+t),l):n},l.weight=function(t){return arguments.length?(e="function"==typeof t?t:wa(+t),l):e},l.size=function(t){if(!arguments.length)return[r,i];var n=+t[0],e=+t[1];if(!(n>=0&&e>=0))throw new Error("invalid size");return r=n,i=e,y()},l.cellSize=function(t){if(!arguments.length)return 1<=1))throw new Error("invalid cell size");return a=Math.floor(Math.log(t)/Math.LN2),y()},l.thresholds=function(t){return arguments.length?(s="function"==typeof t?t:Array.isArray(t)?wa(ma.call(t)):wa(t),l):s},l.bandwidth=function(t){if(!arguments.length)return Math.sqrt(o*(o+1));if(!((t=+t)>=0))throw new Error("invalid bandwidth");return o=Math.round((Math.sqrt(4*t*t+1)-1)/2),y()},l},t.contours=ka,t.count=c,t.create=function(t){return Dn(At(t).call(document.documentElement))},t.creator=At,t.cross=function(...t){const n="function"==typeof t[t.length-1]&&function(t){return n=>t(...n)}(t.pop()),e=(t=t.map(l)).map(f),r=t.length-1,i=new Array(r+1).fill(0),o=[];if(r<0||e.some(s))return o;for(;;){o.push(i.map(((n,e)=>t[e][n])));let a=r;for(;++i[a]===e[a];){if(0===a)return n?o.map(n):o;i[a--]=0}}},t.csv=Pu,t.csvFormat=hu,t.csvFormatBody=du,t.csvFormatRow=gu,t.csvFormatRows=pu,t.csvFormatValue=yu,t.csvParse=su,t.csvParseRows=lu,t.cubehelix=tr,t.cumsum=function(t,n){var e=0,r=0;return Float64Array.from(t,void 0===n?t=>e+=+t||0:i=>e+=+n(i,r++,t)||0)},t.curveBasis=function(t){return new hm(t)},t.curveBasisClosed=function(t){return new dm(t)},t.curveBasisOpen=function(t){return new pm(t)},t.curveBumpX=function(t){return new gm(t,!0)},t.curveBumpY=function(t){return new gm(t,!1)},t.curveBundle=vm,t.curveCardinal=mm,t.curveCardinalClosed=wm,t.curveCardinalOpen=Am,t.curveCatmullRom=Em,t.curveCatmullRomClosed=Nm,t.curveCatmullRomOpen=Pm,t.curveLinear=Sb,t.curveLinearClosed=function(t){return new zm(t)},t.curveMonotoneX=function(t){return new Om(t)},t.curveMonotoneY=function(t){return new Um(t)},t.curveNatural=function(t){return new Bm(t)},t.curveStep=function(t){return new Lm(t,.5)},t.curveStepAfter=function(t){return new Lm(t,1)},t.curveStepBefore=function(t){return new Lm(t,0)},t.descending=function(t,n){return nt?1:n>=t?0:NaN},t.deviation=d,t.difference=function(t,...n){t=new Set(t);for(const e of n)for(const n of e)t.delete(n);return t},t.disjoint=function(t,n){const e=n[Symbol.iterator](),r=new Set;for(const n of t){if(r.has(n))return!1;let t,i;for(;({value:t,done:i}=e.next())&&!i;){if(Object.is(n,t))return!1;r.add(t)}}return!0},t.dispatch=pt,t.drag=function(){var t,n,e,r,i=Xn,o=Gn,a=Vn,u=$n,c={},f=pt("start","drag","end"),s=0,l=0;function h(t){t.on("mousedown.drag",d).filter(u).on("touchstart.drag",y).on("touchmove.drag",v).on("touchend.drag touchcancel.drag",_).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(a,u){if(!r&&i.call(this,a,u)){var c=b(this,o.call(this,a,u),a,u,"mouse");c&&(Dn(a.view).on("mousemove.drag",p,!0).on("mouseup.drag",g,!0),Yn(a.view),In(a),e=!1,t=a.clientX,n=a.clientY,c("start",a))}}function p(r){if(Bn(r),!e){var i=r.clientX-t,o=r.clientY-n;e=i*i+o*o>l}c.mouse("drag",r)}function g(t){Dn(t.view).on("mousemove.drag mouseup.drag",null),Ln(t.view,e),Bn(t),c.mouse("end",t)}function y(t,n){if(i.call(this,t,n)){var e,r,a=t.changedTouches,u=o.call(this,t,n),c=a.length;for(e=0;e+t,t.easePoly=Ki,t.easePolyIn=Wi,t.easePolyInOut=Ki,t.easePolyOut=Zi,t.easeQuad=Vi,t.easeQuadIn=function(t){return t*t},t.easeQuadInOut=Vi,t.easeQuadOut=function(t){return t*(2-t)},t.easeSin=to,t.easeSinIn=function(t){return 1==+t?1:1-Math.cos(t*Ji)},t.easeSinInOut=to,t.easeSinOut=function(t){return Math.sin(t*Ji)},t.every=function(t,n){if("function"!=typeof n)throw new TypeError("test is not a function");let e=-1;for(const r of t)if(!n(r,++e,t))return!1;return!0},t.extent=p,t.fcumsum=function(t,n){const e=new g;let r=-1;return Float64Array.from(t,void 0===n?t=>e.add(+t||0):i=>e.add(+n(i,++r,t)||0))},t.filter=function(t,n){if("function"!=typeof n)throw new TypeError("test is not a function");const e=[];let r=-1;for(const i of t)n(i,++r,t)&&e.push(i);return e},t.forceCenter=function(t,n){var e,r=1;function i(){var i,o,a=e.length,u=0,c=0;for(i=0;if+p||os+p||ac.index){var g=f-u.x-u.vx,y=s-u.y-u.vy,v=g*g+y*y;vt.r&&(t.r=t[n].r)}function c(){if(n){var r,i,o=n.length;for(e=new Array(o),r=0;r[u(t,n,r),t])));for(a=0,i=new Array(f);a=u)){(t.data!==n||t.next)&&(0===l&&(p+=(l=Vu(e))*l),0===h&&(p+=(h=Vu(e))*h),p(t=(1664525*t+1013904223)%Qu)/Qu}();function l(){h(),f.call("tick",n),e1?(null==e?u.delete(t):u.set(t,p(e)),n):u.get(t)},find:function(n,e,r){var i,o,a,u,c,f=0,s=t.length;for(null==r?r=1/0:r*=r,f=0;f1?(f.on(t,e),n):f.on(t)}}},t.forceX=function(t){var n,e,r,i=Gu(.1);function o(t){for(var i,o=0,a=n.length;o=.12&&i<.234&&r>=-.425&&r<-.214?u:i>=.166&&i<.234&&r>=-.214&&r<-.115?c:a).invert(t)},s.stream=function(e){return t&&n===e?t:(r=[a.stream(n=e),u.stream(e),c.stream(e)],i=r.length,t={point:function(t,n){for(var e=-1;++eKf(r[0],r[1])&&(r[1]=i[1]),Kf(i[0],r[1])>Kf(r[0],r[1])&&(r[0]=i[0])):o.push(r=i);for(a=-1/0,n=0,r=o[e=o.length-1];n<=e;r=i,++n)i=o[n],(u=Kf(r[1],i[0]))>a&&(a=u,nf=i[0],rf=r[1])}return lf=hf=null,nf===1/0||ef===1/0?[[NaN,NaN],[NaN,NaN]]:[[nf,ef],[rf,of]]},t.geoCentroid=function(t){Ef=kf=Nf=Cf=Pf=zf=Df=qf=0,Rf=new g,Ff=new g,Of=new g,Wc(t,ts);var n=+Rf,e=+Ff,r=+Of,i=Dc(n,e,r);return i2?t[2]+90:90]):[(t=e())[0],t[1],t[2]-90]},e([0,0,90]).scale(159.155)},t.geoTransverseMercatorRaw=Bh,t.gray=function(t,n){return new Fe(t,0,0,null==n?1:n)},t.greatest=function(t,e=n){let r,i=!1;if(1===e.length){let o;for(const a of t){const t=e(a);(i?n(t,o)>0:0===n(t,t))&&(r=a,o=t,i=!0)}}else for(const n of t)(i?e(n,r)>0:0===e(n,n))&&(r=n,i=!0);return r},t.greatestIndex=function(t,e=n){if(1===e.length)return G(t,e);let r,i=-1,o=-1;for(const n of t)++o,(i<0?0===e(n,n):e(n,r)>0)&&(r=n,i=o);return i},t.group=M,t.groupSort=function(t,e,r){return(1===e.length?k(A(t,e,r),(([t,e],[r,i])=>n(e,i)||n(t,r))):k(M(t,r),(([t,r],[i,o])=>e(r,o)||n(t,i)))).map((([t])=>t))},t.groups=function(t,...n){return S(t,Array.from,w,n)},t.hcl=Le,t.hierarchy=Xh,t.histogram=I,t.hsl=Ae,t.html=Fu,t.image=function(t,n){return new Promise((function(e,r){var i=new Image;for(var o in n)i[o]=n[o];i.onerror=r,i.onload=function(){e(i)},i.src=t}))},t.index=function(t,...n){return S(t,w,T,n)},t.indexes=function(t,...n){return S(t,Array.from,T,n)},t.interpolate=Mr,t.interpolateArray=function(t,n){return(gr(n)?pr:yr)(t,n)},t.interpolateBasis=rr,t.interpolateBasisClosed=ir,t.interpolateBlues=D_,t.interpolateBrBG=Xv,t.interpolateBuGn=f_,t.interpolateBuPu=l_,t.interpolateCividis=function(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(-4.54-t*(35.34-t*(2381.73-t*(6402.7-t*(7024.72-2710.57*t)))))))+", "+Math.max(0,Math.min(255,Math.round(32.49+t*(170.73+t*(52.82-t*(131.46-t*(176.58-67.37*t)))))))+", "+Math.max(0,Math.min(255,Math.round(81.24+t*(442.36-t*(2482.43-t*(6167.24-t*(6614.94-2475.67*t)))))))+")"},t.interpolateCool=G_,t.interpolateCubehelix=Yr,t.interpolateCubehelixDefault=H_,t.interpolateCubehelixLong=Lr,t.interpolateDate=vr,t.interpolateDiscrete=function(t){var n=t.length;return function(e){return t[Math.max(0,Math.min(n-1,Math.floor(e*n)))]}},t.interpolateGnBu=d_,t.interpolateGreens=R_,t.interpolateGreys=O_,t.interpolateHcl=Ur,t.interpolateHclLong=Ir,t.interpolateHsl=Rr,t.interpolateHslLong=Fr,t.interpolateHue=function(t,n){var e=ur(+t,+n);return function(t){var n=e(t);return n-360*Math.floor(n/360)}},t.interpolateInferno=tb,t.interpolateLab=function(t,n){var e=fr((t=Re(t)).l,(n=Re(n)).l),r=fr(t.a,n.a),i=fr(t.b,n.b),o=fr(t.opacity,n.opacity);return function(n){return t.l=e(n),t.a=r(n),t.b=i(n),t.opacity=o(n),t+""}},t.interpolateMagma=J_,t.interpolateNumber=_r,t.interpolateNumberArray=pr,t.interpolateObject=br,t.interpolateOrRd=g_,t.interpolateOranges=j_,t.interpolatePRGn=Vv,t.interpolatePiYG=Wv,t.interpolatePlasma=nb,t.interpolatePuBu=b_,t.interpolatePuBuGn=v_,t.interpolatePuOr=Kv,t.interpolatePuRd=x_,t.interpolatePurples=I_,t.interpolateRainbow=function(t){(t<0||t>1)&&(t-=Math.floor(t));var n=Math.abs(t-.5);return V_.h=360*t-100,V_.s=1.5-1.5*n,V_.l=.8-.9*n,V_+""},t.interpolateRdBu=Jv,t.interpolateRdGy=n_,t.interpolateRdPu=M_,t.interpolateRdYlBu=r_,t.interpolateRdYlGn=o_,t.interpolateReds=Y_,t.interpolateRgb=sr,t.interpolateRgbBasis=hr,t.interpolateRgbBasisClosed=dr,t.interpolateRound=Ar,t.interpolateSinebow=function(t){var n;return t=(.5-t)*Math.PI,$_.r=255*(n=Math.sin(t))*n,$_.g=255*(n=Math.sin(t+W_))*n,$_.b=255*(n=Math.sin(t+Z_))*n,$_+""},t.interpolateSpectral=u_,t.interpolateString=wr,t.interpolateTransformCss=Cr,t.interpolateTransformSvg=Pr,t.interpolateTurbo=function(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+t*(1172.33-t*(10793.56-t*(33300.12-t*(38394.49-14825.05*t)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+t*(557.33+t*(1225.33-t*(3574.96-t*(1073.77+707.56*t)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+t*(3211.1-t*(15327.97-t*(27814-t*(22569.18-6838.66*t)))))))+")"},t.interpolateViridis=Q_,t.interpolateWarm=X_,t.interpolateYlGn=E_,t.interpolateYlGnBu=T_,t.interpolateYlOrBr=N_,t.interpolateYlOrRd=P_,t.interpolateZoom=Dr,t.interrupt=gi,t.intersection=function(t,...n){t=new Set(t),n=n.map(et);t:for(const e of t)for(const r of n)if(!r.has(e)){t.delete(e);continue t}return t},t.interval=function(t,n,e){var r=new ei,i=n;return null==n?(r.restart(t,n,e),r):(r._restart=r.restart,r.restart=function(t,n,e){n=+n,e=null==e?ti():+e,r._restart((function o(a){a+=i,r._restart(o,i+=n,e),t(a)}),n,e)},r.restart(t,n,e),r)},t.isoFormat=yv,t.isoParse=vv,t.json=function(t,n){return fetch(t,n).then(Du)},t.lab=Re,t.lch=function(t,n,e,r){return 1===arguments.length?Ye(t):new je(e,n,t,null==r?1:r)},t.least=function(t,e=n){let r,i=!1;if(1===e.length){let o;for(const a of t){const t=e(a);(i?n(t,o)<0:0===n(t,t))&&(r=a,o=t,i=!0)}}else for(const n of t)(i?e(n,r)<0:0===e(n,n))&&(r=n,i=!0);return r},t.leastIndex=K,t.line=Nb,t.lineRadial=Ob,t.linkHorizontal=function(){return Lb(jb)},t.linkRadial=function(){var t=Lb(Xb);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t},t.linkVertical=function(){return Lb(Hb)},t.local=Rn,t.map=function(t,n){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");if("function"!=typeof n)throw new TypeError("mapper is not a function");return Array.from(t,((e,r)=>n(e,r,t)))},t.matcher=Ct,t.max=B,t.maxIndex=G,t.mean=function(t,n){let e=0,r=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(++e,r+=n);else{let i=-1;for(let o of t)null!=(o=n(o,++i,t))&&(o=+o)>=o&&(++e,r+=o)}if(e)return r/e},t.median=function(t,n){return H(t,.5,n)},t.merge=V,t.min=Y,t.minIndex=$,t.namespace=xt,t.namespaces=mt,t.nice=O,t.now=ti,t.pack=function(){var t=null,n=1,e=1,r=hd;function i(i){return i.x=n/2,i.y=e/2,t?i.eachBefore(gd(t)).eachAfter(yd(r,.5)).eachBefore(vd(1)):i.eachBefore(gd(pd)).eachAfter(yd(hd,1)).eachAfter(yd(r,i.r/Math.min(n,e))).eachBefore(vd(Math.min(n,e)/(2*i.r))),i}return i.radius=function(n){return arguments.length?(t=sd(n),i):t},i.size=function(t){return arguments.length?(n=+t[0],e=+t[1],i):[n,e]},i.padding=function(t){return arguments.length?(r="function"==typeof t?t:dd(+t),i):r},i},t.packEnclose=Kh,t.packSiblings=function(t){return fd(t),t},t.pairs=function(t,n=W){const e=[];let r,i=!1;for(const o of t)i&&e.push(n(r,o)),r=o,i=!0;return e},t.partition=function(){var t=1,n=1,e=0,r=!1;function i(i){var o=i.height+1;return i.x0=i.y0=e,i.x1=t,i.y1=n/o,i.eachBefore(function(t,n){return function(r){r.children&&bd(r,r.x0,t*(r.depth+1)/n,r.x1,t*(r.depth+2)/n);var i=r.x0,o=r.y0,a=r.x1-e,u=r.y1-e;a0&&(d+=l);for(null!=n?p.sort((function(t,e){return n(g[t],g[e])})):null!=e&&p.sort((function(t,n){return e(a[t],a[n])})),u=0,f=d?(v-h*b)/d:0;u0?l*f:0)+b,g[c]={data:a[c],index:u,value:l,startAngle:y,endAngle:s,padAngle:_};return g}return a.value=function(n){return arguments.length?(t="function"==typeof n?n:eb(+n),a):t},a.sortValues=function(t){return arguments.length?(n=t,e=null,a):n},a.sort=function(t){return arguments.length?(e=t,n=null,a):e},a.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:eb(+t),a):r},a.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:eb(+t),a):i},a.padAngle=function(t){return arguments.length?(o="function"==typeof t?t:eb(+t),a):o},a},t.piecewise=jr,t.pointRadial=Ib,t.pointer=Un,t.pointers=function(t,n){return t.target&&(t=On(t),void 0===n&&(n=t.currentTarget),t=t.touches||[t]),Array.from(t,(t=>Un(t,n)))},t.polygonArea=function(t){for(var n,e=-1,r=t.length,i=t[r-1],o=0;++eu!=f>u&&a<(c-e)*(u-r)/(f-r)+e&&(s=!s),c=e,f=r;return s},t.polygonHull=function(t){if((e=t.length)<3)return null;var n,e,r=new Array(e),i=new Array(e);for(n=0;n=0;--n)f.push(t[r[o[n]][2]]);for(n=+u;n(n=1664525*n+1013904223|0,ep*(n>>>0))},t.randomLogNormal=Ld,t.randomLogistic=tp,t.randomNormal=Yd,t.randomPareto=Gd,t.randomPoisson=np,t.randomUniform=Id,t.randomWeibull=Qd,t.range=Z,t.reduce=function(t,n,e){if("function"!=typeof n)throw new TypeError("reducer is not a function");const r=t[Symbol.iterator]();let i,o,a=-1;if(arguments.length<3){if(({done:i,value:e}=r.next()),i)return;++a}for(;({done:i,value:o}=r.next()),!i;)e=n(e,o,++a,t);return e},t.reverse=function(t){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");return Array.from(t).reverse()},t.rgb=ve,t.ribbon=function(){return ba()},t.ribbonArrow=function(){return ba(_a)},t.rollup=A,t.rollups=function(t,n,...e){return S(t,Array.from,n,e)},t.scaleBand=up,t.scaleDiverging=function t(){var n=bp(Cv()(lp));return n.copy=function(){return kv(n,t())},ip.apply(n,arguments)},t.scaleDivergingLog=function t(){var n=Ep(Cv()).domain([.1,1,10]);return n.copy=function(){return kv(n,t()).base(n.base())},ip.apply(n,arguments)},t.scaleDivergingPow=Pv,t.scaleDivergingSqrt=function(){return Pv.apply(null,arguments).exponent(.5)},t.scaleDivergingSymlog=function t(){var n=Cp(Cv());return n.copy=function(){return kv(n,t()).constant(n.constant())},ip.apply(n,arguments)},t.scaleIdentity=function t(n){var e;function r(t){return isNaN(t=+t)?e:t}return r.invert=r,r.domain=r.range=function(t){return arguments.length?(n=Array.from(t,fp),r):n.slice()},r.unknown=function(t){return arguments.length?(e=t,r):e},r.copy=function(){return t(n).unknown(e)},n=arguments.length?Array.from(n,fp):[0,1],bp(r)},t.scaleImplicit=op,t.scaleLinear=function t(){var n=vp();return n.copy=function(){return gp(n,t())},rp.apply(n,arguments),bp(n)},t.scaleLog=function t(){var n=Ep(yp()).domain([1,10]);return n.copy=function(){return gp(n,t()).base(n.base())},rp.apply(n,arguments),n},t.scaleOrdinal=ap,t.scalePoint=function(){return cp(up.apply(null,arguments).paddingInner(1))},t.scalePow=Rp,t.scaleQuantile=function t(){var e,r=[],i=[],a=[];function u(){var t=0,n=Math.max(1,i.length);for(a=new Array(n-1);++t0?a[n-1]:r[0],n=i?[a[i-1],r]:[a[n-1],a[n]]},c.unknown=function(t){return arguments.length?(n=t,c):c},c.thresholds=function(){return a.slice()},c.copy=function(){return t().domain([e,r]).range(u).unknown(n)},rp.apply(bp(c),arguments)},t.scaleRadial=function t(){var n,e=vp(),r=[0,1],i=!1;function o(t){var r=Op(e(t));return isNaN(r)?n:i?Math.round(r):r}return o.invert=function(t){return e.invert(Fp(t))},o.domain=function(t){return arguments.length?(e.domain(t),o):e.domain()},o.range=function(t){return arguments.length?(e.range((r=Array.from(t,fp)).map(Fp)),o):r.slice()},o.rangeRound=function(t){return o.range(t).round(!0)},o.round=function(t){return arguments.length?(i=!!t,o):i},o.clamp=function(t){return arguments.length?(e.clamp(t),o):e.clamp()},o.unknown=function(t){return arguments.length?(n=t,o):n},o.copy=function(){return t(e.domain(),r).round(i).clamp(e.clamp()).unknown(n)},rp.apply(o,arguments),bp(o)},t.scaleSequential=function t(){var n=bp(Ev()(lp));return n.copy=function(){return kv(n,t())},ip.apply(n,arguments)},t.scaleSequentialLog=function t(){var n=Ep(Ev()).domain([1,10]);return n.copy=function(){return kv(n,t()).base(n.base())},ip.apply(n,arguments)},t.scaleSequentialPow=Nv,t.scaleSequentialQuantile=function t(){var e=[],r=lp;function i(t){if(!isNaN(t=+t))return r((o(e,t,1)-1)/(e.length-1))}return i.domain=function(t){if(!arguments.length)return e.slice();e=[];for(let n of t)null==n||isNaN(n=+n)||e.push(n);return e.sort(n),i},i.interpolator=function(t){return arguments.length?(r=t,i):r},i.range=function(){return e.map(((t,n)=>r(n/(e.length-1))))},i.quantiles=function(t){return Array.from({length:t+1},((n,r)=>H(e,r/t)))},i.copy=function(){return t(r).domain(e)},ip.apply(i,arguments)},t.scaleSequentialSqrt=function(){return Nv.apply(null,arguments).exponent(.5)},t.scaleSequentialSymlog=function t(){var n=Cp(Ev());return n.copy=function(){return kv(n,t()).constant(n.constant())},ip.apply(n,arguments)},t.scaleSqrt=function(){return Rp.apply(null,arguments).exponent(.5)},t.scaleSymlog=function t(){var n=Cp(yp());return n.copy=function(){return gp(n,t()).constant(n.constant())},rp.apply(n,arguments)},t.scaleThreshold=function t(){var n,e=[.5],r=[0,1],i=1;function a(t){return t<=t?r[o(e,t,0,i)]:n}return a.domain=function(t){return arguments.length?(e=Array.from(t),i=Math.min(e.length,r.length-1),a):e.slice()},a.range=function(t){return arguments.length?(r=Array.from(t),i=Math.min(e.length,r.length-1),a):r.slice()},a.invertExtent=function(t){var n=r.indexOf(t);return[e[n-1],e[n]]},a.unknown=function(t){return arguments.length?(n=t,a):n},a.copy=function(){return t().domain(e).range(r).unknown(n)},rp.apply(a,arguments)},t.scaleTime=function(){return rp.apply(Sv(bg,vg,rg,tg,Qp,Zp,$p,Yp,t.timeFormat).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)},t.scaleUtc=function(){return rp.apply(Sv(Hg,Lg,kg,Tg,Mg,xg,$p,Yp,t.utcFormat).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)},t.scan=function(t,n){const e=K(t,n);return e<0?void 0:e},t.schemeAccent=qv,t.schemeBlues=z_,t.schemeBrBG=Hv,t.schemeBuGn=c_,t.schemeBuPu=s_,t.schemeCategory10=Dv,t.schemeDark2=Rv,t.schemeGnBu=h_,t.schemeGreens=q_,t.schemeGreys=F_,t.schemeOrRd=p_,t.schemeOranges=L_,t.schemePRGn=Gv,t.schemePaired=Fv,t.schemePastel1=Ov,t.schemePastel2=Uv,t.schemePiYG=$v,t.schemePuBu=__,t.schemePuBuGn=y_,t.schemePuOr=Zv,t.schemePuRd=m_,t.schemePurples=U_,t.schemeRdBu=Qv,t.schemeRdGy=t_,t.schemeRdPu=w_,t.schemeRdYlBu=e_,t.schemeRdYlGn=i_,t.schemeReds=B_,t.schemeSet1=Iv,t.schemeSet2=Bv,t.schemeSet3=Yv,t.schemeSpectral=a_,t.schemeTableau10=Lv,t.schemeYlGn=S_,t.schemeYlGnBu=A_,t.schemeYlOrBr=k_,t.schemeYlOrRd=C_,t.select=Dn,t.selectAll=function(t){return"string"==typeof t?new Pn([document.querySelectorAll(t)],[document.documentElement]):new Pn([null==t?[]:Et(t)],Cn)},t.selection=zn,t.selector=St,t.selectorAll=Nt,t.shuffle=Q,t.shuffler=J,t.some=function(t,n){if("function"!=typeof n)throw new TypeError("test is not a function");let e=-1;for(const r of t)if(n(r,++e,t))return!0;return!1},t.sort=k,t.stack=function(){var t=eb([]),n=Hm,e=jm,r=Xm;function i(i){var o,a,u=Array.from(t.apply(this,arguments),Gm),c=u.length,f=-1;for(const t of i)for(o=0,++f;o0)for(var e,r,i,o,a,u,c=0,f=t[n[0]].length;c0?(r[0]=o,r[1]=o+=i):i<0?(r[1]=a,r[0]=a+=i):(r[0]=0,r[1]=i)},t.stackOffsetExpand=function(t,n){if((r=t.length)>0){for(var e,r,i,o=0,a=t[0].length;o0){for(var e,r=0,i=t[n[0]],o=i.length;r0&&(r=(e=t[n[0]]).length)>0){for(var e,r,i,o=0,a=1;a0)throw new Error("cycle");return o}return e.id=function(n){return arguments.length?(t=ld(n),e):t},e.parentId=function(t){return arguments.length?(n=ld(t),e):n},e},t.style=Jt,t.subset=function(t,n){return rt(n,t)},t.sum=function(t,n){let e=0;if(void 0===n)for(let n of t)(n=+n)&&(e+=n);else{let r=-1;for(let i of t)(i=+n(i,++r,t))&&(e+=i)}return e},t.superset=rt,t.svg=Ou,t.symbol=function(t,n){var e=null;function r(){var r;if(e||(e=r=fa()),t.apply(this,arguments).draw(e,+n.apply(this,arguments)),r)return e=null,r+""||null}return t="function"==typeof t?t:eb(t||Gb),n="function"==typeof n?n:eb(void 0===n?64:+n),r.type=function(n){return arguments.length?(t="function"==typeof n?n:eb(n),r):t},r.size=function(t){return arguments.length?(n="function"==typeof t?t:eb(+t),r):n},r.context=function(t){return arguments.length?(e=null==t?null:t,r):e},r},t.symbolCircle=Gb,t.symbolCross=Vb,t.symbolDiamond=Zb,t.symbolSquare=nm,t.symbolStar=tm,t.symbolTriangle=rm,t.symbolWye=cm,t.symbols=fm,t.text=Nu,t.thresholdFreedmanDiaconis=function(t,n,e){return Math.ceil((e-n)/(2*(H(t,.75)-H(t,.25))*Math.pow(c(t),-1/3)))},t.thresholdScott=function(t,n,e){return Math.ceil((e-n)/(3.5*d(t)*Math.pow(c(t),-1/3)))},t.thresholdSturges=U,t.tickFormat=_p,t.tickIncrement=R,t.tickStep=F,t.ticks=q,t.timeDay=tg,t.timeDays=ng,t.timeFormatDefaultLocale=pv,t.timeFormatLocale=Wg,t.timeFriday=cg,t.timeFridays=gg,t.timeHour=Qp,t.timeHours=Jp,t.timeInterval=Bp,t.timeMillisecond=Yp,t.timeMilliseconds=Lp,t.timeMinute=Zp,t.timeMinutes=Kp,t.timeMonday=ig,t.timeMondays=lg,t.timeMonth=vg,t.timeMonths=_g,t.timeSaturday=fg,t.timeSaturdays=yg,t.timeSecond=$p,t.timeSeconds=Wp,t.timeSunday=rg,t.timeSundays=sg,t.timeThursday=ug,t.timeThursdays=pg,t.timeTuesday=og,t.timeTuesdays=hg,t.timeWednesday=ag,t.timeWednesdays=dg,t.timeWeek=rg,t.timeWeeks=sg,t.timeYear=bg,t.timeYears=mg,t.timeout=ci,t.timer=ri,t.timerFlush=ii,t.transition=Hi,t.transpose=tt,t.tree=function(){var t=Ad,n=1,e=1,r=null;function i(i){var c=function(t){for(var n,e,r,i,o,a=new Nd(t,0),u=[a];n=u.pop();)if(r=n._.children)for(n.children=new Array(o=r.length),i=o-1;i>=0;--i)u.push(e=n.children[i]=new Nd(r[i],i)),e.parent=n;return(a.parent=new Nd(null,0)).children=[a],a}(i);if(c.eachAfter(o),c.parent.m=-c.z,c.eachBefore(a),r)i.eachBefore(u);else{var f=i,s=i,l=i;i.eachBefore((function(t){t.xs.x&&(s=t),t.depth>l.depth&&(l=t)}));var h=f===s?1:t(f,s)/2,d=h-f.x,p=n/(s.x+h+d),g=e/(l.depth||1);i.eachBefore((function(t){t.x=(t.x+d)*p,t.y=t.depth*g}))}return i}function o(n){var e=n.children,r=n.parent.children,i=n.i?r[n.i-1]:null;if(e){!function(t){for(var n,e=0,r=0,i=t.children,o=i.length;--o>=0;)(n=i[o]).z+=e,n.m+=e,e+=n.s+(r+=n.c)}(n);var o=(e[0].z+e[e.length-1].z)/2;i?(n.z=i.z+t(n._,i._),n.m=n.z-o):n.z=o}else i&&(n.z=i.z+t(n._,i._));n.parent.A=function(n,e,r){if(e){for(var i,o=n,a=n,u=e,c=o.parent.children[0],f=o.m,s=a.m,l=u.m,h=c.m;u=Sd(u),o=Td(o),u&&o;)c=Td(c),(a=Sd(a)).a=n,(i=u.z+l-o.z-f+t(u._,o._))>0&&(Ed(kd(u,n,r),n,i),f+=i,s+=i),l+=u.m,f+=o.m,h+=c.m,s+=a.m;u&&!Sd(a)&&(a.t=u,a.m+=l-s),o&&!Td(c)&&(c.t=o,c.m+=f-h,r=n)}return r}(n,i,n.parent.A||r[0])}function a(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function u(t){t.x*=n,t.y=t.depth*e}return i.separation=function(n){return arguments.length?(t=n,i):t},i.size=function(t){return arguments.length?(r=!1,n=+t[0],e=+t[1],i):r?null:[n,e]},i.nodeSize=function(t){return arguments.length?(r=!0,n=+t[0],e=+t[1],i):r?[n,e]:null},i},t.treemap=function(){var t=Dd,n=!1,e=1,r=1,i=[0],o=hd,a=hd,u=hd,c=hd,f=hd;function s(t){return t.x0=t.y0=0,t.x1=e,t.y1=r,t.eachBefore(l),i=[0],n&&t.eachBefore(_d),t}function l(n){var e=i[n.depth],r=n.x0+e,s=n.y0+e,l=n.x1-e,h=n.y1-e;l=e-1){var s=u[n];return s.x0=i,s.y0=o,s.x1=a,void(s.y1=c)}var l=f[n],h=r/2+l,d=n+1,p=e-1;for(;d>>1;f[g]c-o){var _=r?(i*v+a*y)/r:a;t(n,d,y,i,o,_,c),t(d,e,v,_,o,a,c)}else{var b=r?(o*v+c*y)/r:c;t(n,d,y,i,o,a,b),t(d,e,v,i,b,a,c)}}(0,c,t.value,n,e,r,i)},t.treemapDice=bd,t.treemapResquarify=qd,t.treemapSlice=Cd,t.treemapSliceDice=function(t,n,e,r,i){(1&t.depth?Cd:bd)(t,n,e,r,i)},t.treemapSquarify=Dd,t.tsv=zu,t.tsvFormat=mu,t.tsvFormatBody=xu,t.tsvFormatRow=Mu,t.tsvFormatRows=wu,t.tsvFormatValue=Au,t.tsvParse=_u,t.tsvParseRows=bu,t.union=function(...t){const n=new Set;for(const e of t)for(const t of e)n.add(t);return n},t.utcDay=Tg,t.utcDays=Sg,t.utcFriday=Dg,t.utcFridays=Bg,t.utcHour=Mg,t.utcHours=Ag,t.utcMillisecond=Yp,t.utcMilliseconds=Lp,t.utcMinute=xg,t.utcMinutes=wg,t.utcMonday=Ng,t.utcMondays=Fg,t.utcMonth=Lg,t.utcMonths=jg,t.utcSaturday=qg,t.utcSaturdays=Yg,t.utcSecond=$p,t.utcSeconds=Wp,t.utcSunday=kg,t.utcSundays=Rg,t.utcThursday=zg,t.utcThursdays=Ig,t.utcTuesday=Cg,t.utcTuesdays=Og,t.utcWednesday=Pg,t.utcWednesdays=Ug,t.utcWeek=kg,t.utcWeeks=Rg,t.utcYear=Hg,t.utcYears=Xg,t.variance=h,t.version="6.6.0",t.window=Wt,t.xml=Ru,t.zip=function(){return tt(arguments)},t.zoom=function(){var t,n,e,r=ix,i=ox,o=fx,a=ux,u=cx,c=[0,1/0],f=[[-1/0,-1/0],[1/0,1/0]],s=250,l=Dr,h=pt("start","zoom","end"),d=500,p=0,g=10;function y(t){t.property("__zoom",ax).on("wheel.zoom",M).on("mousedown.zoom",A).on("dblclick.zoom",T).filter(u).on("touchstart.zoom",S).on("touchmove.zoom",E).on("touchend.zoom touchcancel.zoom",k).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function v(t,n){return(n=Math.max(c[0],Math.min(c[1],n)))===t.k?t:new Jm(n,t.x,t.y)}function _(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new Jm(t.k,r,i)}function b(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function m(t,n,e,r){t.on("start.zoom",(function(){x(this,arguments).event(r).start()})).on("interrupt.zoom end.zoom",(function(){x(this,arguments).event(r).end()})).tween("zoom",(function(){var t=this,o=arguments,a=x(t,o).event(r),u=i.apply(t,o),c=null==e?b(u):"function"==typeof e?e.apply(t,o):e,f=Math.max(u[1][0]-u[0][0],u[1][1]-u[0][1]),s=t.__zoom,h="function"==typeof n?n.apply(t,o):n,d=l(s.invert(c).concat(f/s.k),h.invert(c).concat(f/h.k));return function(t){if(1===t)t=h;else{var n=d(t),e=f/n[2];t=new Jm(e,c[0]-n[0]*e,c[1]-n[1]*e)}a.zoom(null,t)}}))}function x(t,n,e){return!e&&t.__zooming||new w(t,n)}function w(t,n){this.that=t,this.args=n,this.active=0,this.sourceEvent=null,this.extent=i.apply(t,n),this.taps=0}function M(t,...n){if(r.apply(this,arguments)){var e=x(this,n).event(t),i=this.__zoom,u=Math.max(c[0],Math.min(c[1],i.k*Math.pow(2,a.apply(this,arguments)))),s=Un(t);if(e.wheel)e.mouse[0][0]===s[0]&&e.mouse[0][1]===s[1]||(e.mouse[1]=i.invert(e.mouse[0]=s)),clearTimeout(e.wheel);else{if(i.k===u)return;e.mouse=[s,i.invert(s)],gi(this),e.start()}rx(t),e.wheel=setTimeout(l,150),e.zoom("mouse",o(_(v(i,u),e.mouse[0],e.mouse[1]),e.extent,f))}function l(){e.wheel=null,e.end()}}function A(t,...n){if(!e&&r.apply(this,arguments)){var i=x(this,n,!0).event(t),a=Dn(t.view).on("mousemove.zoom",h,!0).on("mouseup.zoom",d,!0),u=Un(t,c),c=t.currentTarget,s=t.clientX,l=t.clientY;Yn(t.view),ex(t),i.mouse=[u,this.__zoom.invert(u)],gi(this),i.start()}function h(t){if(rx(t),!i.moved){var n=t.clientX-s,e=t.clientY-l;i.moved=n*n+e*e>p}i.event(t).zoom("mouse",o(_(i.that.__zoom,i.mouse[0]=Un(t,c),i.mouse[1]),i.extent,f))}function d(t){a.on("mousemove.zoom mouseup.zoom",null),Ln(t.view,i.moved),rx(t),i.event(t).end()}}function T(t,...n){if(r.apply(this,arguments)){var e=this.__zoom,a=Un(t.changedTouches?t.changedTouches[0]:t,this),u=e.invert(a),c=e.k*(t.shiftKey?.5:2),l=o(_(v(e,c),a,u),i.apply(this,n),f);rx(t),s>0?Dn(this).transition().duration(s).call(m,l,a,t):Dn(this).call(y.transform,l,a,t)}}function S(e,...i){if(r.apply(this,arguments)){var o,a,u,c,f=e.touches,s=f.length,l=x(this,i,e.changedTouches.length===s).event(e);for(ex(e),a=0;a dist/package.js && rollup -c","test":"tape 'test/**/*-test.js'","prepublishOnly":"yarn test","postpublish":"git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3/dist/d3.js d3.v${npm_package_version%%.*}.js && cp ../d3/dist/d3.min.js d3.v${npm_package_version%%.*}.min.js && git add d3.v${npm_package_version%%.*}.js d3.v${npm_package_version%%.*}.min.js && git commit -m \"d3 ${npm_package_version}\" && git push && cd - && zip -j dist/d3.zip -- LICENSE README.md API.md CHANGES.md dist/d3.js dist/d3.min.js"}; +export var devDependencies = {"json2module":"0.0","rimraf":"3","rollup":"2","rollup-plugin-ascii":"0.0","rollup-plugin-node-resolve":"5","rollup-plugin-terser":"7","tape":"4","tape-await":"0.1"}; +export var dependencies = {"d3-array":"2","d3-axis":"2","d3-brush":"2","d3-chord":"2","d3-color":"2","d3-contour":"2","d3-delaunay":"5","d3-dispatch":"2","d3-drag":"2","d3-dsv":"2","d3-ease":"2","d3-fetch":"2","d3-force":"2","d3-format":"2","d3-geo":"2","d3-hierarchy":"2","d3-interpolate":"2","d3-path":"2","d3-polygon":"2","d3-quadtree":"2","d3-random":"2","d3-scale":"3","d3-scale-chromatic":"2","d3-selection":"2","d3-shape":"2","d3-time":"2","d3-time-format":"3","d3-timer":"2","d3-transition":"2","d3-zoom":"2"}; diff --git a/node_modules/d3/index.js b/node_modules/d3/index.js new file mode 100644 index 00000000..9dcf0bbd --- /dev/null +++ b/node_modules/d3/index.js @@ -0,0 +1,31 @@ +export {version} from "./dist/package.js"; +export * from "d3-array"; +export * from "d3-axis"; +export * from "d3-brush"; +export * from "d3-chord"; +export * from "d3-color"; +export * from "d3-contour"; +export * from "d3-delaunay"; +export * from "d3-dispatch"; +export * from "d3-drag"; +export * from "d3-dsv"; +export * from "d3-ease"; +export * from "d3-fetch"; +export * from "d3-force"; +export * from "d3-format"; +export * from "d3-geo"; +export * from "d3-hierarchy"; +export * from "d3-interpolate"; +export * from "d3-path"; +export * from "d3-polygon"; +export * from "d3-quadtree"; +export * from "d3-random"; +export * from "d3-scale"; +export * from "d3-scale-chromatic"; +export * from "d3-selection"; +export * from "d3-shape"; +export * from "d3-time"; +export * from "d3-time-format"; +export * from "d3-timer"; +export * from "d3-transition"; +export * from "d3-zoom"; diff --git a/node_modules/d3/package.json b/node_modules/d3/package.json new file mode 100644 index 00000000..23c902dc --- /dev/null +++ b/node_modules/d3/package.json @@ -0,0 +1,107 @@ +{ + "_from": "d3", + "_id": "d3@6.6.0", + "_inBundle": false, + "_integrity": "sha512-fWyMfZDSOLksXeYuiHM/uHap7pKgypUnOGY8jiTfmmAWH1HM6ErPtnHiKEdqs7DtZqbombUgaKwq3B5Pjm7GOQ==", + "_location": "/d3", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "d3", + "name": "d3", + "escapedName": "d3", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/d3/-/d3-6.6.0.tgz", + "_shasum": "0722c03b0ad5a479b54080c00e5daa6b809a83c7", + "_spec": "d3", + "_where": "C:\\Users\\rin\\Desktop\\final", + "author": { + "name": "Mike Bostock", + "url": "https://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/d3/d3/issues" + }, + "bundleDependencies": false, + "dependencies": { + "d3-array": "2", + "d3-axis": "2", + "d3-brush": "2", + "d3-chord": "2", + "d3-color": "2", + "d3-contour": "2", + "d3-delaunay": "5", + "d3-dispatch": "2", + "d3-drag": "2", + "d3-dsv": "2", + "d3-ease": "2", + "d3-fetch": "2", + "d3-force": "2", + "d3-format": "2", + "d3-geo": "2", + "d3-hierarchy": "2", + "d3-interpolate": "2", + "d3-path": "2", + "d3-polygon": "2", + "d3-quadtree": "2", + "d3-random": "2", + "d3-scale": "3", + "d3-scale-chromatic": "2", + "d3-selection": "2", + "d3-shape": "2", + "d3-time": "2", + "d3-time-format": "3", + "d3-timer": "2", + "d3-transition": "2", + "d3-zoom": "2" + }, + "deprecated": false, + "description": "Data-Driven Documents", + "devDependencies": { + "json2module": "0.0", + "rimraf": "3", + "rollup": "2", + "rollup-plugin-ascii": "0.0", + "rollup-plugin-node-resolve": "5", + "rollup-plugin-terser": "7", + "tape": "4", + "tape-await": "0.1" + }, + "files": [ + "dist/**/*.js", + "index.js" + ], + "homepage": "https://d3js.org", + "jsdelivr": "dist/d3.min.js", + "keywords": [ + "dom", + "visualization", + "svg", + "animation", + "canvas" + ], + "license": "BSD-3-Clause", + "main": "dist/d3.node.js", + "module": "index.js", + "name": "d3", + "repository": { + "type": "git", + "url": "git+https://github.com/d3/d3.git" + }, + "scripts": { + "postpublish": "git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3/dist/d3.js d3.v${npm_package_version%%.*}.js && cp ../d3/dist/d3.min.js d3.v${npm_package_version%%.*}.min.js && git add d3.v${npm_package_version%%.*}.js d3.v${npm_package_version%%.*}.min.js && git commit -m \"d3 ${npm_package_version}\" && git push && cd - && zip -j dist/d3.zip -- LICENSE README.md API.md CHANGES.md dist/d3.js dist/d3.min.js", + "prepublishOnly": "yarn test", + "pretest": "rimraf dist && mkdir dist && json2module package.json > dist/package.js && rollup -c", + "test": "tape 'test/**/*-test.js'" + }, + "unpkg": "dist/d3.min.js", + "version": "6.6.0" +} diff --git a/node_modules/debug/.coveralls.yml b/node_modules/debug/.coveralls.yml new file mode 100644 index 00000000..20a70685 --- /dev/null +++ b/node_modules/debug/.coveralls.yml @@ -0,0 +1 @@ +repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve diff --git a/node_modules/debug/.eslintrc b/node_modules/debug/.eslintrc new file mode 100644 index 00000000..8a37ae2c --- /dev/null +++ b/node_modules/debug/.eslintrc @@ -0,0 +1,11 @@ +{ + "env": { + "browser": true, + "node": true + }, + "rules": { + "no-console": 0, + "no-empty": [1, { "allowEmptyCatch": true }] + }, + "extends": "eslint:recommended" +} diff --git a/node_modules/debug/.npmignore b/node_modules/debug/.npmignore new file mode 100644 index 00000000..5f60eecc --- /dev/null +++ b/node_modules/debug/.npmignore @@ -0,0 +1,9 @@ +support +test +examples +example +*.sock +dist +yarn.lock +coverage +bower.json diff --git a/node_modules/debug/.travis.yml b/node_modules/debug/.travis.yml new file mode 100644 index 00000000..6c6090c3 --- /dev/null +++ b/node_modules/debug/.travis.yml @@ -0,0 +1,14 @@ + +language: node_js +node_js: + - "6" + - "5" + - "4" + +install: + - make node_modules + +script: + - make lint + - make test + - make coveralls diff --git a/node_modules/debug/CHANGELOG.md b/node_modules/debug/CHANGELOG.md new file mode 100644 index 00000000..eadaa189 --- /dev/null +++ b/node_modules/debug/CHANGELOG.md @@ -0,0 +1,362 @@ + +2.6.9 / 2017-09-22 +================== + + * remove ReDoS regexp in %o formatter (#504) + +2.6.8 / 2017-05-18 +================== + + * Fix: Check for undefined on browser globals (#462, @marbemac) + +2.6.7 / 2017-05-16 +================== + + * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom) + * Fix: Inline extend function in node implementation (#452, @dougwilson) + * Docs: Fix typo (#455, @msasad) + +2.6.5 / 2017-04-27 +================== + + * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek) + * Misc: clean up browser reference checks (#447, @thebigredgeek) + * Misc: add npm-debug.log to .gitignore (@thebigredgeek) + + +2.6.4 / 2017-04-20 +================== + + * Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo) + * Chore: ignore bower.json in npm installations. (#437, @joaovieira) + * Misc: update "ms" to v0.7.3 (@tootallnate) + +2.6.3 / 2017-03-13 +================== + + * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts) + * Docs: Changelog fix (@thebigredgeek) + +2.6.2 / 2017-03-10 +================== + + * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin) + * Docs: Add backers and sponsors from Open Collective (#422, @piamancini) + * Docs: Add Slackin invite badge (@tootallnate) + +2.6.1 / 2017-02-10 +================== + + * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error + * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0) + * Fix: IE8 "Expected identifier" error (#414, @vgoma) + * Fix: Namespaces would not disable once enabled (#409, @musikov) + +2.6.0 / 2016-12-28 +================== + + * Fix: added better null pointer checks for browser useColors (@thebigredgeek) + * Improvement: removed explicit `window.debug` export (#404, @tootallnate) + * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate) + +2.5.2 / 2016-12-25 +================== + + * Fix: reference error on window within webworkers (#393, @KlausTrainer) + * Docs: fixed README typo (#391, @lurch) + * Docs: added notice about v3 api discussion (@thebigredgeek) + +2.5.1 / 2016-12-20 +================== + + * Fix: babel-core compatibility + +2.5.0 / 2016-12-20 +================== + + * Fix: wrong reference in bower file (@thebigredgeek) + * Fix: webworker compatibility (@thebigredgeek) + * Fix: output formatting issue (#388, @kribblo) + * Fix: babel-loader compatibility (#383, @escwald) + * Misc: removed built asset from repo and publications (@thebigredgeek) + * Misc: moved source files to /src (#378, @yamikuronue) + * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue) + * Test: coveralls integration (#378, @yamikuronue) + * Docs: simplified language in the opening paragraph (#373, @yamikuronue) + +2.4.5 / 2016-12-17 +================== + + * Fix: `navigator` undefined in Rhino (#376, @jochenberger) + * Fix: custom log function (#379, @hsiliev) + * Improvement: bit of cleanup + linting fixes (@thebigredgeek) + * Improvement: rm non-maintainted `dist/` dir (#375, @freewil) + * Docs: simplified language in the opening paragraph. (#373, @yamikuronue) + +2.4.4 / 2016-12-14 +================== + + * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts) + +2.4.3 / 2016-12-14 +================== + + * Fix: navigation.userAgent error for react native (#364, @escwald) + +2.4.2 / 2016-12-14 +================== + + * Fix: browser colors (#367, @tootallnate) + * Misc: travis ci integration (@thebigredgeek) + * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek) + +2.4.1 / 2016-12-13 +================== + + * Fix: typo that broke the package (#356) + +2.4.0 / 2016-12-13 +================== + + * Fix: bower.json references unbuilt src entry point (#342, @justmatt) + * Fix: revert "handle regex special characters" (@tootallnate) + * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate) + * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate) + * Improvement: allow colors in workers (#335, @botverse) + * Improvement: use same color for same namespace. (#338, @lchenay) + +2.3.3 / 2016-11-09 +================== + + * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne) + * Fix: Returning `localStorage` saved values (#331, Levi Thomason) + * Improvement: Don't create an empty object when no `process` (Nathan Rajlich) + +2.3.2 / 2016-11-09 +================== + + * Fix: be super-safe in index.js as well (@TooTallNate) + * Fix: should check whether process exists (Tom Newby) + +2.3.1 / 2016-11-09 +================== + + * Fix: Added electron compatibility (#324, @paulcbetts) + * Improvement: Added performance optimizations (@tootallnate) + * Readme: Corrected PowerShell environment variable example (#252, @gimre) + * Misc: Removed yarn lock file from source control (#321, @fengmk2) + +2.3.0 / 2016-11-07 +================== + + * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic) + * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos) + * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15) + * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran) + * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom) + * Package: Update "ms" to 0.7.2 (#315, @DevSide) + * Package: removed superfluous version property from bower.json (#207 @kkirsche) + * Readme: fix USE_COLORS to DEBUG_COLORS + * Readme: Doc fixes for format string sugar (#269, @mlucool) + * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0) + * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable) + * Readme: better docs for browser support (#224, @matthewmueller) + * Tooling: Added yarn integration for development (#317, @thebigredgeek) + * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek) + * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman) + * Misc: Updated contributors (@thebigredgeek) + +2.2.0 / 2015-05-09 +================== + + * package: update "ms" to v0.7.1 (#202, @dougwilson) + * README: add logging to file example (#193, @DanielOchoa) + * README: fixed a typo (#191, @amir-s) + * browser: expose `storage` (#190, @stephenmathieson) + * Makefile: add a `distclean` target (#189, @stephenmathieson) + +2.1.3 / 2015-03-13 +================== + + * Updated stdout/stderr example (#186) + * Updated example/stdout.js to match debug current behaviour + * Renamed example/stderr.js to stdout.js + * Update Readme.md (#184) + * replace high intensity foreground color for bold (#182, #183) + +2.1.2 / 2015-03-01 +================== + + * dist: recompile + * update "ms" to v0.7.0 + * package: update "browserify" to v9.0.3 + * component: fix "ms.js" repo location + * changed bower package name + * updated documentation about using debug in a browser + * fix: security error on safari (#167, #168, @yields) + +2.1.1 / 2014-12-29 +================== + + * browser: use `typeof` to check for `console` existence + * browser: check for `console.log` truthiness (fix IE 8/9) + * browser: add support for Chrome apps + * Readme: added Windows usage remarks + * Add `bower.json` to properly support bower install + +2.1.0 / 2014-10-15 +================== + + * node: implement `DEBUG_FD` env variable support + * package: update "browserify" to v6.1.0 + * package: add "license" field to package.json (#135, @panuhorsmalahti) + +2.0.0 / 2014-09-01 +================== + + * package: update "browserify" to v5.11.0 + * node: use stderr rather than stdout for logging (#29, @stephenmathieson) + +1.0.4 / 2014-07-15 +================== + + * dist: recompile + * example: remove `console.info()` log usage + * example: add "Content-Type" UTF-8 header to browser example + * browser: place %c marker after the space character + * browser: reset the "content" color via `color: inherit` + * browser: add colors support for Firefox >= v31 + * debug: prefer an instance `log()` function over the global one (#119) + * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) + +1.0.3 / 2014-07-09 +================== + + * Add support for multiple wildcards in namespaces (#122, @seegno) + * browser: fix lint + +1.0.2 / 2014-06-10 +================== + + * browser: update color palette (#113, @gscottolson) + * common: make console logging function configurable (#108, @timoxley) + * node: fix %o colors on old node <= 0.8.x + * Makefile: find node path using shell/which (#109, @timoxley) + +1.0.1 / 2014-06-06 +================== + + * browser: use `removeItem()` to clear localStorage + * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) + * package: add "contributors" section + * node: fix comment typo + * README: list authors + +1.0.0 / 2014-06-04 +================== + + * make ms diff be global, not be scope + * debug: ignore empty strings in enable() + * node: make DEBUG_COLORS able to disable coloring + * *: export the `colors` array + * npmignore: don't publish the `dist` dir + * Makefile: refactor to use browserify + * package: add "browserify" as a dev dependency + * Readme: add Web Inspector Colors section + * node: reset terminal color for the debug content + * node: map "%o" to `util.inspect()` + * browser: map "%j" to `JSON.stringify()` + * debug: add custom "formatters" + * debug: use "ms" module for humanizing the diff + * Readme: add "bash" syntax highlighting + * browser: add Firebug color support + * browser: add colors for WebKit browsers + * node: apply log to `console` + * rewrite: abstract common logic for Node & browsers + * add .jshintrc file + +0.8.1 / 2014-04-14 +================== + + * package: re-add the "component" section + +0.8.0 / 2014-03-30 +================== + + * add `enable()` method for nodejs. Closes #27 + * change from stderr to stdout + * remove unnecessary index.js file + +0.7.4 / 2013-11-13 +================== + + * remove "browserify" key from package.json (fixes something in browserify) + +0.7.3 / 2013-10-30 +================== + + * fix: catch localStorage security error when cookies are blocked (Chrome) + * add debug(err) support. Closes #46 + * add .browser prop to package.json. Closes #42 + +0.7.2 / 2013-02-06 +================== + + * fix package.json + * fix: Mobile Safari (private mode) is broken with debug + * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript + +0.7.1 / 2013-02-05 +================== + + * add repository URL to package.json + * add DEBUG_COLORED to force colored output + * add browserify support + * fix component. Closes #24 + +0.7.0 / 2012-05-04 +================== + + * Added .component to package.json + * Added debug.component.js build + +0.6.0 / 2012-03-16 +================== + + * Added support for "-" prefix in DEBUG [Vinay Pulim] + * Added `.enabled` flag to the node version [TooTallNate] + +0.5.0 / 2012-02-02 +================== + + * Added: humanize diffs. Closes #8 + * Added `debug.disable()` to the CS variant + * Removed padding. Closes #10 + * Fixed: persist client-side variant again. Closes #9 + +0.4.0 / 2012-02-01 +================== + + * Added browser variant support for older browsers [TooTallNate] + * Added `debug.enable('project:*')` to browser variant [TooTallNate] + * Added padding to diff (moved it to the right) + +0.3.0 / 2012-01-26 +================== + + * Added millisecond diff when isatty, otherwise UTC string + +0.2.0 / 2012-01-22 +================== + + * Added wildcard support + +0.1.0 / 2011-12-02 +================== + + * Added: remove colors unless stderr isatty [TooTallNate] + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/debug/LICENSE b/node_modules/debug/LICENSE new file mode 100644 index 00000000..658c933d --- /dev/null +++ b/node_modules/debug/LICENSE @@ -0,0 +1,19 @@ +(The MIT License) + +Copyright (c) 2014 TJ Holowaychuk + +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/node_modules/debug/Makefile b/node_modules/debug/Makefile new file mode 100644 index 00000000..584da8bf --- /dev/null +++ b/node_modules/debug/Makefile @@ -0,0 +1,50 @@ +# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 +THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) + +# BIN directory +BIN := $(THIS_DIR)/node_modules/.bin + +# Path +PATH := node_modules/.bin:$(PATH) +SHELL := /bin/bash + +# applications +NODE ?= $(shell which node) +YARN ?= $(shell which yarn) +PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm)) +BROWSERIFY ?= $(NODE) $(BIN)/browserify + +.FORCE: + +install: node_modules + +node_modules: package.json + @NODE_ENV= $(PKG) install + @touch node_modules + +lint: .FORCE + eslint browser.js debug.js index.js node.js + +test-node: .FORCE + istanbul cover node_modules/mocha/bin/_mocha -- test/**.js + +test-browser: .FORCE + mkdir -p dist + + @$(BROWSERIFY) \ + --standalone debug \ + . > dist/debug.js + + karma start --single-run + rimraf dist + +test: .FORCE + concurrently \ + "make test-node" \ + "make test-browser" + +coveralls: + cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js + +.PHONY: all install clean distclean diff --git a/node_modules/debug/README.md b/node_modules/debug/README.md new file mode 100644 index 00000000..f67be6b3 --- /dev/null +++ b/node_modules/debug/README.md @@ -0,0 +1,312 @@ +# debug +[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug) [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) +[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) + + + +A tiny node.js debugging utility modelled after node core's debugging technique. + +**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)** + +## Installation + +```bash +$ npm install debug +``` + +## Usage + +`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. + +Example _app.js_: + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %s', name); + +http.createServer(function(req, res){ + debug(req.method + ' ' + req.url); + res.end('hello\n'); +}).listen(3000, function(){ + debug('listening'); +}); + +// fake worker of some kind + +require('./worker'); +``` + +Example _worker.js_: + +```js +var debug = require('debug')('worker'); + +setInterval(function(){ + debug('doing some work'); +}, 1000); +``` + + The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: + + ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) + + ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) + +#### Windows note + + On Windows the environment variable is set using the `set` command. + + ```cmd + set DEBUG=*,-not_this + ``` + + Note that PowerShell uses different syntax to set environment variables. + + ```cmd + $env:DEBUG = "*,-not_this" + ``` + +Then, run the program to be debugged as usual. + +## Millisecond diff + + When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. + + ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) + + When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: + + ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) + +## Conventions + + If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". + +## Wildcards + + The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. + + You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". + +## Environment Variables + + When running through Node.js, you can set a few environment variables that will + change the behavior of the debug logging: + +| Name | Purpose | +|-----------|-------------------------------------------------| +| `DEBUG` | Enables/disables specific debugging namespaces. | +| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | +| `DEBUG_DEPTH` | Object inspection depth. | +| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | + + + __Note:__ The environment variables beginning with `DEBUG_` end up being + converted into an Options object that gets used with `%o`/`%O` formatters. + See the Node.js documentation for + [`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) + for the complete list. + +## Formatters + + + Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. Below are the officially supported formatters: + +| Formatter | Representation | +|-----------|----------------| +| `%O` | Pretty-print an Object on multiple lines. | +| `%o` | Pretty-print an Object all on a single line. | +| `%s` | String. | +| `%d` | Number (both integer and float). | +| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | +| `%%` | Single percent sign ('%'). This does not consume an argument. | + +### Custom formatters + + You can add custom formatters by extending the `debug.formatters` object. For example, if you wanted to add support for rendering a Buffer as hex with `%h`, you could do something like: + +```js +const createDebug = require('debug') +createDebug.formatters.h = (v) => { + return v.toString('hex') +} + +// …elsewhere +const debug = createDebug('foo') +debug('this is hex: %h', new Buffer('hello world')) +// foo this is hex: 68656c6c6f20776f726c6421 +0ms +``` + +## Browser support + You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), + or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), + if you don't want to build it yourself. + + Debug's enable state is currently persisted by `localStorage`. + Consider the situation shown below where you have `worker:a` and `worker:b`, + and wish to debug both. You can enable this using `localStorage.debug`: + +```js +localStorage.debug = 'worker:*' +``` + +And then refresh the page. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + b('doing some work'); +}, 1200); +``` + +#### Web Inspector Colors + + Colors are also enabled on "Web Inspectors" that understand the `%c` formatting + option. These are WebKit web inspectors, Firefox ([since version + 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) + and the Firebug plugin for Firefox (any version). + + Colored output looks something like: + + ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) + + +## Output streams + + By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: + +Example _stdout.js_: + +```js +var debug = require('debug'); +var error = debug('app:error'); + +// by default stderr is used +error('goes to stderr!'); + +var log = debug('app:log'); +// set this namespace to log via console.log +log.log = console.log.bind(console); // don't forget to bind to console! +log('goes to stdout'); +error('still goes to stderr!'); + +// set all output to go via console.info +// overrides all per-namespace log settings +debug.log = console.info.bind(console); +error('now goes to stdout via console.info'); +log('still goes to stdout, but via console.info now'); +``` + + +## Authors + + - TJ Holowaychuk + - Nathan Rajlich + - Andrew Rhyne + +## Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Sponsors + +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## License + +(The MIT License) + +Copyright (c) 2014-2016 TJ Holowaychuk <tj@vision-media.ca> + +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/node_modules/debug/component.json b/node_modules/debug/component.json new file mode 100644 index 00000000..9de26410 --- /dev/null +++ b/node_modules/debug/component.json @@ -0,0 +1,19 @@ +{ + "name": "debug", + "repo": "visionmedia/debug", + "description": "small debugging utility", + "version": "2.6.9", + "keywords": [ + "debug", + "log", + "debugger" + ], + "main": "src/browser.js", + "scripts": [ + "src/browser.js", + "src/debug.js" + ], + "dependencies": { + "rauchg/ms.js": "0.7.1" + } +} diff --git a/node_modules/debug/karma.conf.js b/node_modules/debug/karma.conf.js new file mode 100644 index 00000000..103a82d1 --- /dev/null +++ b/node_modules/debug/karma.conf.js @@ -0,0 +1,70 @@ +// Karma configuration +// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC) + +module.exports = function(config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['mocha', 'chai', 'sinon'], + + + // list of files / patterns to load in the browser + files: [ + 'dist/debug.js', + 'test/*spec.js' + ], + + + // list of files to exclude + exclude: [ + 'src/node.js' + ], + + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + }, + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['PhantomJS'], + + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity + }) +} diff --git a/node_modules/debug/node.js b/node_modules/debug/node.js new file mode 100644 index 00000000..7fc36fe6 --- /dev/null +++ b/node_modules/debug/node.js @@ -0,0 +1 @@ +module.exports = require('./src/node'); diff --git a/node_modules/debug/package.json b/node_modules/debug/package.json new file mode 100644 index 00000000..efc5f443 --- /dev/null +++ b/node_modules/debug/package.json @@ -0,0 +1,91 @@ +{ + "_from": "debug@2.6.9", + "_id": "debug@2.6.9", + "_inBundle": false, + "_integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "_location": "/debug", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "debug@2.6.9", + "name": "debug", + "escapedName": "debug", + "rawSpec": "2.6.9", + "saveSpec": null, + "fetchSpec": "2.6.9" + }, + "_requiredBy": [ + "/express", + "/express/body-parser", + "/finalhandler", + "/send" + ], + "_resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "_shasum": "5d128515df134ff327e90a4c93f4e077a536341f", + "_spec": "debug@2.6.9", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "browser": "./src/browser.js", + "bugs": { + "url": "https://github.com/visionmedia/debug/issues" + }, + "bundleDependencies": false, + "component": { + "scripts": { + "debug/index.js": "browser.js", + "debug/debug.js": "debug.js" + } + }, + "contributors": [ + { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://n8.io" + }, + { + "name": "Andrew Rhyne", + "email": "rhyneandrew@gmail.com" + } + ], + "dependencies": { + "ms": "2.0.0" + }, + "deprecated": false, + "description": "small debugging utility", + "devDependencies": { + "browserify": "9.0.3", + "chai": "^3.5.0", + "concurrently": "^3.1.0", + "coveralls": "^2.11.15", + "eslint": "^3.12.1", + "istanbul": "^0.4.5", + "karma": "^1.3.0", + "karma-chai": "^0.1.0", + "karma-mocha": "^1.3.0", + "karma-phantomjs-launcher": "^1.0.2", + "karma-sinon": "^1.0.5", + "mocha": "^3.2.0", + "mocha-lcov-reporter": "^1.2.0", + "rimraf": "^2.5.4", + "sinon": "^1.17.6", + "sinon-chai": "^2.8.0" + }, + "homepage": "https://github.com/visionmedia/debug#readme", + "keywords": [ + "debug", + "log", + "debugger" + ], + "license": "MIT", + "main": "./src/index.js", + "name": "debug", + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/debug.git" + }, + "version": "2.6.9" +} diff --git a/node_modules/debug/src/browser.js b/node_modules/debug/src/browser.js new file mode 100644 index 00000000..71069249 --- /dev/null +++ b/node_modules/debug/src/browser.js @@ -0,0 +1,185 @@ +/** + * This is the web browser implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = require('./debug'); +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = 'undefined' != typeof chrome + && 'undefined' != typeof chrome.storage + ? chrome.storage.local + : localstorage(); + +/** + * Colors. + */ + +exports.colors = [ + 'lightseagreen', + 'forestgreen', + 'goldenrod', + 'dodgerblue', + 'darkorchid', + 'crimson' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { + return true; + } + + // is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +exports.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return '[UnexpectedJSONParseError]: ' + err.message; + } +}; + + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + var useColors = this.useColors; + + args[0] = (useColors ? '%c' : '') + + this.namespace + + (useColors ? ' %c' : ' ') + + args[0] + + (useColors ? '%c ' : ' ') + + '+' + exports.humanize(this.diff); + + if (!useColors) return; + + var c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit') + + // the final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ('%%' === match) return; + index++; + if ('%c' === match) { + // we only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". + * + * @api public + */ + +function log() { + // this hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return 'object' === typeof console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + try { + if (null == namespaces) { + exports.storage.removeItem('debug'); + } else { + exports.storage.debug = namespaces; + } + } catch(e) {} +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + var r; + try { + r = exports.storage.debug; + } catch(e) {} + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Enable namespaces listed in `localStorage.debug` initially. + */ + +exports.enable(load()); + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + return window.localStorage; + } catch (e) {} +} diff --git a/node_modules/debug/src/debug.js b/node_modules/debug/src/debug.js new file mode 100644 index 00000000..6a5e3fc9 --- /dev/null +++ b/node_modules/debug/src/debug.js @@ -0,0 +1,202 @@ + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; +exports.coerce = coerce; +exports.disable = disable; +exports.enable = enable; +exports.enabled = enabled; +exports.humanize = require('ms'); + +/** + * The currently active debug mode names, and names to skip. + */ + +exports.names = []; +exports.skips = []; + +/** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + +exports.formatters = {}; + +/** + * Previous log timestamp. + */ + +var prevTime; + +/** + * Select a color. + * @param {String} namespace + * @return {Number} + * @api private + */ + +function selectColor(namespace) { + var hash = 0, i; + + for (i in namespace) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return exports.colors[Math.abs(hash) % exports.colors.length]; +} + +/** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + +function createDebug(namespace) { + + function debug() { + // disabled? + if (!debug.enabled) return; + + var self = debug; + + // set `diff` timestamp + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + // turn the `arguments` into a proper Array + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + + args[0] = exports.coerce(args[0]); + + if ('string' !== typeof args[0]) { + // anything else let's inspect with %O + args.unshift('%O'); + } + + // apply any `formatters` transformations + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + // if we encounter an escaped % then don't increase the array index + if (match === '%%') return match; + index++; + var formatter = exports.formatters[format]; + if ('function' === typeof formatter) { + var val = args[index]; + match = formatter.call(self, val); + + // now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // apply env-specific formatting (colors, etc.) + exports.formatArgs.call(self, args); + + var logFn = debug.log || exports.log || console.log.bind(console); + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.enabled = exports.enabled(namespace); + debug.useColors = exports.useColors(); + debug.color = selectColor(namespace); + + // env-specific initialization logic for debug instances + if ('function' === typeof exports.init) { + exports.init(debug); + } + + return debug; +} + +/** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + +function enable(namespaces) { + exports.save(namespaces); + + exports.names = []; + exports.skips = []; + + var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + var len = split.length; + + for (var i = 0; i < len; i++) { + if (!split[i]) continue; // ignore empty strings + namespaces = split[i].replace(/\*/g, '.*?'); + if (namespaces[0] === '-') { + exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + exports.names.push(new RegExp('^' + namespaces + '$')); + } + } +} + +/** + * Disable debug output. + * + * @api public + */ + +function disable() { + exports.enable(''); +} + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +function enabled(name) { + var i, len; + for (i = 0, len = exports.skips.length; i < len; i++) { + if (exports.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports.names.length; i < len; i++) { + if (exports.names[i].test(name)) { + return true; + } + } + return false; +} + +/** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} diff --git a/node_modules/debug/src/index.js b/node_modules/debug/src/index.js new file mode 100644 index 00000000..e12cf4d5 --- /dev/null +++ b/node_modules/debug/src/index.js @@ -0,0 +1,10 @@ +/** + * Detect Electron renderer process, which is node, but we should + * treat as a browser. + */ + +if (typeof process !== 'undefined' && process.type === 'renderer') { + module.exports = require('./browser.js'); +} else { + module.exports = require('./node.js'); +} diff --git a/node_modules/debug/src/inspector-log.js b/node_modules/debug/src/inspector-log.js new file mode 100644 index 00000000..60ea6c04 --- /dev/null +++ b/node_modules/debug/src/inspector-log.js @@ -0,0 +1,15 @@ +module.exports = inspectorLog; + +// black hole +const nullStream = new (require('stream').Writable)(); +nullStream._write = () => {}; + +/** + * Outputs a `console.log()` to the Node.js Inspector console *only*. + */ +function inspectorLog() { + const stdout = console._stdout; + console._stdout = nullStream; + console.log.apply(console, arguments); + console._stdout = stdout; +} diff --git a/node_modules/debug/src/node.js b/node_modules/debug/src/node.js new file mode 100644 index 00000000..b15109c9 --- /dev/null +++ b/node_modules/debug/src/node.js @@ -0,0 +1,248 @@ +/** + * Module dependencies. + */ + +var tty = require('tty'); +var util = require('util'); + +/** + * This is the Node.js implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = require('./debug'); +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; + +/** + * Colors. + */ + +exports.colors = [6, 2, 3, 4, 5, 1]; + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(function (key) { + return /^debug_/i.test(key); +}).reduce(function (obj, key) { + // camel-case + var prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); + + // coerce string value into JS value + var val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) val = true; + else if (/^(no|off|false|disabled)$/i.test(val)) val = false; + else if (val === 'null') val = null; + else val = Number(val); + + obj[prop] = val; + return obj; +}, {}); + +/** + * The file descriptor to write the `debug()` calls to. + * Set the `DEBUG_FD` env variable to override with another value. i.e.: + * + * $ DEBUG_FD=3 node script.js 3>debug.log + */ + +var fd = parseInt(process.env.DEBUG_FD, 10) || 2; + +if (1 !== fd && 2 !== fd) { + util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() +} + +var stream = 1 === fd ? process.stdout : + 2 === fd ? process.stderr : + createWritableStdioStream(fd); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts + ? Boolean(exports.inspectOpts.colors) + : tty.isatty(fd); +} + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +exports.formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n').map(function(str) { + return str.trim() + }).join(' '); +}; + +/** + * Map %o to `util.inspect()`, allowing multiple lines if needed. + */ + +exports.formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + var name = this.namespace; + var useColors = this.useColors; + + if (useColors) { + var c = this.color; + var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); + } else { + args[0] = new Date().toUTCString() + + ' ' + name + ' ' + args[0]; + } +} + +/** + * Invokes `util.format()` with the specified arguments and writes to `stream`. + */ + +function log() { + return stream.write(util.format.apply(util, arguments) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + if (null == namespaces) { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } else { + process.env.DEBUG = namespaces; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Copied from `node/src/node.js`. + * + * XXX: It's lame that node doesn't expose this API out-of-the-box. It also + * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. + */ + +function createWritableStdioStream (fd) { + var stream; + var tty_wrap = process.binding('tty_wrap'); + + // Note stream._type is used for test-module-load-list.js + + switch (tty_wrap.guessHandleType(fd)) { + case 'TTY': + stream = new tty.WriteStream(fd); + stream._type = 'tty'; + + // Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + case 'FILE': + var fs = require('fs'); + stream = new fs.SyncWriteStream(fd, { autoClose: false }); + stream._type = 'fs'; + break; + + case 'PIPE': + case 'TCP': + var net = require('net'); + stream = new net.Socket({ + fd: fd, + readable: false, + writable: true + }); + + // FIXME Should probably have an option in net.Socket to create a + // stream from an existing fd which is writable only. But for now + // we'll just add this hack and set the `readable` member to false. + // Test: ./node test/fixtures/echo.js < /etc/passwd + stream.readable = false; + stream.read = null; + stream._type = 'pipe'; + + // FIXME Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + default: + // Probably an error on in uv_guess_handle() + throw new Error('Implement me. Unknown stream file type!'); + } + + // For supporting legacy API we put the FD here. + stream.fd = fd; + + stream._isStdio = true; + + return stream; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init (debug) { + debug.inspectOpts = {}; + + var keys = Object.keys(exports.inspectOpts); + for (var i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +/** + * Enable namespaces listed in `process.env.DEBUG` initially. + */ + +exports.enable(load()); diff --git a/node_modules/delaunator/LICENSE b/node_modules/delaunator/LICENSE new file mode 100644 index 00000000..6f4f868b --- /dev/null +++ b/node_modules/delaunator/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2017, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/node_modules/delaunator/README.md b/node_modules/delaunator/README.md new file mode 100644 index 00000000..b97bff99 --- /dev/null +++ b/node_modules/delaunator/README.md @@ -0,0 +1,127 @@ +# Delaunator [![Build Status](https://travis-ci.org/mapbox/delaunator.svg?branch=master)](https://travis-ci.org/mapbox/delaunator) [![](https://img.shields.io/badge/simply-awesome-brightgreen.svg)](https://github.com/mourner/projects) + +An incredibly fast JavaScript library for +[Delaunay triangulation](https://en.wikipedia.org/wiki/Delaunay_triangulation) of 2D points. + +- [Interactive Demo](https://mapbox.github.io/delaunator/demo.html) +- [Guide to data structures](https://mapbox.github.io/delaunator/) + +### Projects based on Delaunator + +- [d3-delaunay](https://github.com/d3/d3-delaunay) for Voronoi diagrams, search, traversal and rendering. +- [d3-geo-voronoi](https://github.com/Fil/d3-geo-voronoi) for Delaunay triangulations and Voronoi diagrams on a sphere (e.g. for geographic locations). + +### Ports to other languages + +- [delaunator-rs](https://github.com/mourner/delaunator-rs) (Rust) +- [fogleman/delaunay](https://github.com/fogleman/delaunay) (Go) +- [delaunator-cpp](https://github.com/delfrrr/delaunator-cpp) (C++) + +Delaunay triangulation example + +## Example + +```js +const points = [[168, 180], [168, 178], [168, 179], [168, 181], [168, 183], ...]; + +const delaunay = Delaunator.from(points); +console.log(delaunay.triangles); +// [623, 636, 619, 636, 444, 619, ...] +``` + +## Install + +Install with NPM (`npm install delaunator`) or Yarn (`yarn add delaunator`), then: + +```js +// import as an ES module +import Delaunator from 'delaunator'; + +// or require in Node / Browserify +const Delaunator = require('delaunator'); +``` + +Or use a browser build directly: + +```html + + +``` + +## API Reference + +#### Delaunator.from(points[, getX, getY]) + +Constructs a delaunay triangulation object given an array of points (`[x, y]` by default). +`getX` and `getY` are optional functions of the form `(point) => value` for custom point formats. +Duplicate points are skipped. + +#### new Delaunator(coords) + +Constructs a delaunay triangulation object given an array of point coordinates of the form: +`[x0, y0, x1, y1, ...]` (use a typed array for best performance). + +#### delaunay.triangles + +A `Uint32Array` array of triangle vertex indices (each group of three numbers forms a triangle). +All triangles are directed counterclockwise. + +To get the coordinates of all triangles, use: + +```js +for (let i = 0; i < triangles.length; i += 3) { + coordinates.push([ + points[triangles[i]], + points[triangles[i + 1]], + points[triangles[i + 2]] + ]); +} +``` + +#### delaunay.halfedges + +A `Int32Array` array of triangle half-edge indices that allows you to traverse the triangulation. +`i`-th half-edge in the array corresponds to vertex `triangles[i]` the half-edge is coming from. +`halfedges[i]` is the index of a twin half-edge in an adjacent triangle +(or `-1` for outer half-edges on the convex hull). + +The flat array-based data structures might be counterintuitive, +but they're one of the key reasons this library is fast. + +#### delaunay.hull + +A `Uint32Array` array of indices that reference points on the convex hull of the input data, counter-clockwise. + +#### delaunay.coords + +An array of input coordinates in the form `[x0, y0, x1, y1, ....]`, +of the type provided in the constructor (or `Float64Array` if you used `Delaunator.from`). + +#### delaunay.update() + +Updates the triangulation if you modified `delaunay.coords` values in place, avoiding expensive memory allocations. +Useful for iterative relaxation algorithms such as [Lloyd's](https://en.wikipedia.org/wiki/Lloyd%27s_algorithm). + +## Performance + +Benchmark results against other Delaunay JS libraries +(`npm run bench` on Macbook Pro Retina 15" 2017, Node v10.10.0): + +  | uniform 100k | gauss 100k | grid 100k | degen 100k | uniform 1 million | gauss 1 million | grid 1 million | degen 1 million +:-- | --: | --: | --: | --: | --: | --: | --: | --: +**delaunator** | 82ms | 61ms | 66ms | 25ms | 1.07s | 950ms | 830ms | 278ms +[faster‑delaunay](https://github.com/Bathlamos/delaunay-triangulation) | 473ms | 411ms | 272ms | 68ms | 4.27s | 4.62s | 4.3s | 810ms +[incremental‑delaunay](https://github.com/mikolalysenko/incremental-delaunay) | 547ms | 505ms | 172ms | 528ms | 5.9s | 6.08s | 2.11s | 6.09s +[d3‑voronoi](https://github.com/d3/d3-voronoi) | 972ms | 909ms | 358ms | 720ms | 15.04s | 13.86s | 5.55s | 11.13s +[delaunay‑fast](https://github.com/ironwallaby/delaunay) | 3.8s | 4s | 12.57s | timeout | 132s | 138s | 399s | timeout +[delaunay](https://github.com/darkskyapp/delaunay) | 4.85s | 5.73s | 15.05s | timeout | 156s | 178s | 326s | timeout +[delaunay‑triangulate](https://github.com/mikolalysenko/delaunay-triangulate) | 2.24s | 2.04s | OOM | 1.51s | OOM | OOM | OOM | OOM +[cdt2d](https://github.com/mikolalysenko/cdt2d) | 45s | 51s | 118s | 17s | timeout | timeout | timeout | timeout + +## Papers + +The algorithm is based on ideas from the following papers: + +- [A simple sweep-line Delaunay triangulation algorithm](http://www.academicpub.org/jao/paperInfo.aspx?paperid=15630), 2013, Liu Yonghe, Feng Jinming and Shao Yuehong +- [S-hull: a fast radial sweep-hull routine for Delaunay triangulation](http://www.s-hull.org/paper/s_hull.pdf), 2010, David Sinclair +- [A faster circle-sweep Delaunay triangulation algorithm](http://cglab.ca/~biniaz/papers/Sweep%20Circle.pdf), 2011, Ahmad Biniaz and Gholamhossein Dastghaibyfard diff --git a/node_modules/delaunator/delaunator.js b/node_modules/delaunator/delaunator.js new file mode 100644 index 00000000..20465372 --- /dev/null +++ b/node_modules/delaunator/delaunator.js @@ -0,0 +1,512 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.Delaunator = factory()); +}(this, function () { 'use strict'; + + var EPSILON = Math.pow(2, -52); + var EDGE_STACK = new Uint32Array(512); + + var Delaunator = function Delaunator(coords) { + var n = coords.length >> 1; + if (n > 0 && typeof coords[0] !== 'number') { throw new Error('Expected coords to contain numbers.'); } + + this.coords = coords; + + // arrays that will store the triangulation graph + var maxTriangles = Math.max(2 * n - 5, 0); + this._triangles = new Uint32Array(maxTriangles * 3); + this._halfedges = new Int32Array(maxTriangles * 3); + + // temporary arrays for tracking the edges of the advancing convex hull + this._hashSize = Math.ceil(Math.sqrt(n)); + this._hullPrev = new Uint32Array(n); // edge to prev edge + this._hullNext = new Uint32Array(n); // edge to next edge + this._hullTri = new Uint32Array(n); // edge to adjacent triangle + this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash + + // temporary arrays for sorting points + this._ids = new Uint32Array(n); + this._dists = new Float64Array(n); + + this.update(); + }; + + Delaunator.from = function from (points, getX, getY) { + if ( getX === void 0 ) getX = defaultGetX; + if ( getY === void 0 ) getY = defaultGetY; + + var n = points.length; + var coords = new Float64Array(n * 2); + + for (var i = 0; i < n; i++) { + var p = points[i]; + coords[2 * i] = getX(p); + coords[2 * i + 1] = getY(p); + } + + return new Delaunator(coords); + }; + + Delaunator.prototype.update = function update () { + var ref = this; + var coords = ref.coords; + var hullPrev = ref._hullPrev; + var hullNext = ref._hullNext; + var hullTri = ref._hullTri; + var hullHash = ref._hullHash; + var n = coords.length >> 1; + + // populate an array of point indices; calculate input data bbox + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < n; i++) { + var x = coords[2 * i]; + var y = coords[2 * i + 1]; + if (x < minX) { minX = x; } + if (y < minY) { minY = y; } + if (x > maxX) { maxX = x; } + if (y > maxY) { maxY = y; } + this._ids[i] = i; + } + var cx = (minX + maxX) / 2; + var cy = (minY + maxY) / 2; + + var minDist = Infinity; + var i0, i1, i2; + + // pick a seed point close to the center + for (var i$1 = 0; i$1 < n; i$1++) { + var d = dist(cx, cy, coords[2 * i$1], coords[2 * i$1 + 1]); + if (d < minDist) { + i0 = i$1; + minDist = d; + } + } + var i0x = coords[2 * i0]; + var i0y = coords[2 * i0 + 1]; + + minDist = Infinity; + + // find the point closest to the seed + for (var i$2 = 0; i$2 < n; i$2++) { + if (i$2 === i0) { continue; } + var d$1 = dist(i0x, i0y, coords[2 * i$2], coords[2 * i$2 + 1]); + if (d$1 < minDist && d$1 > 0) { + i1 = i$2; + minDist = d$1; + } + } + var i1x = coords[2 * i1]; + var i1y = coords[2 * i1 + 1]; + + var minRadius = Infinity; + + // find the third point which forms the smallest circumcircle with the first two + for (var i$3 = 0; i$3 < n; i$3++) { + if (i$3 === i0 || i$3 === i1) { continue; } + var r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i$3], coords[2 * i$3 + 1]); + if (r < minRadius) { + i2 = i$3; + minRadius = r; + } + } + var i2x = coords[2 * i2]; + var i2y = coords[2 * i2 + 1]; + + if (minRadius === Infinity) { + // order collinear points by dx (or dy if all x are identical) + // and return the list as a hull + for (var i$4 = 0; i$4 < n; i$4++) { + this._dists[i$4] = (coords[2 * i$4] - coords[0]) || (coords[2 * i$4 + 1] - coords[1]); + } + quicksort(this._ids, this._dists, 0, n - 1); + var hull = new Uint32Array(n); + var j = 0; + for (var i$5 = 0, d0 = -Infinity; i$5 < n; i$5++) { + var id = this._ids[i$5]; + if (this._dists[id] > d0) { + hull[j++] = id; + d0 = this._dists[id]; + } + } + this.hull = hull.subarray(0, j); + this.triangles = new Uint32Array(0); + this.halfedges = new Uint32Array(0); + return; + } + + // swap the order of the seed points for counter-clockwise orientation + if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) { + var i$6 = i1; + var x$1 = i1x; + var y$1 = i1y; + i1 = i2; + i1x = i2x; + i1y = i2y; + i2 = i$6; + i2x = x$1; + i2y = y$1; + } + + var center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y); + this._cx = center.x; + this._cy = center.y; + + for (var i$7 = 0; i$7 < n; i$7++) { + this._dists[i$7] = dist(coords[2 * i$7], coords[2 * i$7 + 1], center.x, center.y); + } + + // sort the points by distance from the seed triangle circumcenter + quicksort(this._ids, this._dists, 0, n - 1); + + // set up the seed triangle as the starting hull + this._hullStart = i0; + var hullSize = 3; + + hullNext[i0] = hullPrev[i2] = i1; + hullNext[i1] = hullPrev[i0] = i2; + hullNext[i2] = hullPrev[i1] = i0; + + hullTri[i0] = 0; + hullTri[i1] = 1; + hullTri[i2] = 2; + + hullHash.fill(-1); + hullHash[this._hashKey(i0x, i0y)] = i0; + hullHash[this._hashKey(i1x, i1y)] = i1; + hullHash[this._hashKey(i2x, i2y)] = i2; + + this.trianglesLen = 0; + this._addTriangle(i0, i1, i2, -1, -1, -1); + + for (var k = 0, xp = (void 0), yp = (void 0); k < this._ids.length; k++) { + var i$8 = this._ids[k]; + var x$2 = coords[2 * i$8]; + var y$2 = coords[2 * i$8 + 1]; + + // skip near-duplicate points + if (k > 0 && Math.abs(x$2 - xp) <= EPSILON && Math.abs(y$2 - yp) <= EPSILON) { continue; } + xp = x$2; + yp = y$2; + + // skip seed triangle points + if (i$8 === i0 || i$8 === i1 || i$8 === i2) { continue; } + + // find a visible edge on the convex hull using edge hash + var start = 0; + for (var j$1 = 0, key = this._hashKey(x$2, y$2); j$1 < this._hashSize; j$1++) { + start = hullHash[(key + j$1) % this._hashSize]; + if (start !== -1 && start !== hullNext[start]) { break; } + } + + start = hullPrev[start]; + var e = start, q = (void 0); + while (q = hullNext[e], !orient(x$2, y$2, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1])) { + e = q; + if (e === start) { + e = -1; + break; + } + } + if (e === -1) { continue; } // likely a near-duplicate point; skip it + + // add the first triangle from the point + var t = this._addTriangle(e, i$8, hullNext[e], -1, -1, hullTri[e]); + + // recursively flip triangles from the point until they satisfy the Delaunay condition + hullTri[i$8] = this._legalize(t + 2); + hullTri[e] = t; // keep track of boundary triangles on the hull + hullSize++; + + // walk forward through the hull, adding more triangles and flipping recursively + var n$1 = hullNext[e]; + while (q = hullNext[n$1], orient(x$2, y$2, coords[2 * n$1], coords[2 * n$1 + 1], coords[2 * q], coords[2 * q + 1])) { + t = this._addTriangle(n$1, i$8, q, hullTri[i$8], -1, hullTri[n$1]); + hullTri[i$8] = this._legalize(t + 2); + hullNext[n$1] = n$1; // mark as removed + hullSize--; + n$1 = q; + } + + // walk backward from the other side, adding more triangles and flipping + if (e === start) { + while (q = hullPrev[e], orient(x$2, y$2, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1])) { + t = this._addTriangle(q, i$8, e, -1, hullTri[e], hullTri[q]); + this._legalize(t + 2); + hullTri[q] = t; + hullNext[e] = e; // mark as removed + hullSize--; + e = q; + } + } + + // update the hull indices + this._hullStart = hullPrev[i$8] = e; + hullNext[e] = hullPrev[n$1] = i$8; + hullNext[i$8] = n$1; + + // save the two new edges in the hash table + hullHash[this._hashKey(x$2, y$2)] = i$8; + hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e; + } + + this.hull = new Uint32Array(hullSize); + for (var i$9 = 0, e$1 = this._hullStart; i$9 < hullSize; i$9++) { + this.hull[i$9] = e$1; + e$1 = hullNext[e$1]; + } + + // trim typed triangle mesh arrays + this.triangles = this._triangles.subarray(0, this.trianglesLen); + this.halfedges = this._halfedges.subarray(0, this.trianglesLen); + }; + + Delaunator.prototype._hashKey = function _hashKey (x, y) { + return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize; + }; + + Delaunator.prototype._legalize = function _legalize (a) { + var ref = this; + var triangles = ref._triangles; + var halfedges = ref._halfedges; + var coords = ref.coords; + + var i = 0; + var ar = 0; + + // recursion eliminated with a fixed-size stack + while (true) { + var b = halfedges[a]; + + /* if the pair of triangles doesn't satisfy the Delaunay condition + * (p1 is inside the circumcircle of [p0, pl, pr]), flip them, + * then do the same check/flip recursively for the new pair of triangles + * + * pl pl + * /||\ / \ + * al/ || \bl al/\a + * / || \ / \ + * / a||b \flip/___ar___\ + * p0\ || /p1 => p0\---bl---/p1 + * \ || / \ / + * ar\ || /br b\/br + * \||/ \ / + * pr pr + */ + var a0 = a - a % 3; + ar = a0 + (a + 2) % 3; + + if (b === -1) { // convex hull edge + if (i === 0) { break; } + a = EDGE_STACK[--i]; + continue; + } + + var b0 = b - b % 3; + var al = a0 + (a + 1) % 3; + var bl = b0 + (b + 2) % 3; + + var p0 = triangles[ar]; + var pr = triangles[a]; + var pl = triangles[al]; + var p1 = triangles[bl]; + + var illegal = inCircle( + coords[2 * p0], coords[2 * p0 + 1], + coords[2 * pr], coords[2 * pr + 1], + coords[2 * pl], coords[2 * pl + 1], + coords[2 * p1], coords[2 * p1 + 1]); + + if (illegal) { + triangles[a] = p1; + triangles[b] = p0; + + var hbl = halfedges[bl]; + + // edge swapped on the other side of the hull (rare); fix the halfedge reference + if (hbl === -1) { + var e = this._hullStart; + do { + if (this._hullTri[e] === bl) { + this._hullTri[e] = a; + break; + } + e = this._hullPrev[e]; + } while (e !== this._hullStart); + } + this._link(a, hbl); + this._link(b, halfedges[ar]); + this._link(ar, bl); + + var br = b0 + (b + 1) % 3; + + // don't worry about hitting the cap: it can only happen on extremely degenerate input + if (i < EDGE_STACK.length) { + EDGE_STACK[i++] = br; + } + } else { + if (i === 0) { break; } + a = EDGE_STACK[--i]; + } + } + + return ar; + }; + + Delaunator.prototype._link = function _link (a, b) { + this._halfedges[a] = b; + if (b !== -1) { this._halfedges[b] = a; } + }; + + // add a new triangle given vertex indices and adjacent half-edge ids + Delaunator.prototype._addTriangle = function _addTriangle (i0, i1, i2, a, b, c) { + var t = this.trianglesLen; + + this._triangles[t] = i0; + this._triangles[t + 1] = i1; + this._triangles[t + 2] = i2; + + this._link(t, a); + this._link(t + 1, b); + this._link(t + 2, c); + + this.trianglesLen += 3; + + return t; + }; + + // monotonically increases with real angle, but doesn't need expensive trigonometry + function pseudoAngle(dx, dy) { + var p = dx / (Math.abs(dx) + Math.abs(dy)); + return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1] + } + + function dist(ax, ay, bx, by) { + var dx = ax - bx; + var dy = ay - by; + return dx * dx + dy * dy; + } + + // return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check + function orientIfSure(px, py, rx, ry, qx, qy) { + var l = (ry - py) * (qx - px); + var r = (rx - px) * (qy - py); + return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0; + } + + // a more robust orientation test that's stable in a given triangle (to fix robustness issues) + function orient(rx, ry, qx, qy, px, py) { + var sign = orientIfSure(px, py, rx, ry, qx, qy) || + orientIfSure(rx, ry, qx, qy, px, py) || + orientIfSure(qx, qy, px, py, rx, ry); + return sign < 0; + } + + function inCircle(ax, ay, bx, by, cx, cy, px, py) { + var dx = ax - px; + var dy = ay - py; + var ex = bx - px; + var ey = by - py; + var fx = cx - px; + var fy = cy - py; + + var ap = dx * dx + dy * dy; + var bp = ex * ex + ey * ey; + var cp = fx * fx + fy * fy; + + return dx * (ey * cp - bp * fy) - + dy * (ex * cp - bp * fx) + + ap * (ex * fy - ey * fx) < 0; + } + + function circumradius(ax, ay, bx, by, cx, cy) { + var dx = bx - ax; + var dy = by - ay; + var ex = cx - ax; + var ey = cy - ay; + + var bl = dx * dx + dy * dy; + var cl = ex * ex + ey * ey; + var d = 0.5 / (dx * ey - dy * ex); + + var x = (ey * bl - dy * cl) * d; + var y = (dx * cl - ex * bl) * d; + + return x * x + y * y; + } + + function circumcenter(ax, ay, bx, by, cx, cy) { + var dx = bx - ax; + var dy = by - ay; + var ex = cx - ax; + var ey = cy - ay; + + var bl = dx * dx + dy * dy; + var cl = ex * ex + ey * ey; + var d = 0.5 / (dx * ey - dy * ex); + + var x = ax + (ey * bl - dy * cl) * d; + var y = ay + (dx * cl - ex * bl) * d; + + return {x: x, y: y}; + } + + function quicksort(ids, dists, left, right) { + if (right - left <= 20) { + for (var i = left + 1; i <= right; i++) { + var temp = ids[i]; + var tempDist = dists[temp]; + var j = i - 1; + while (j >= left && dists[ids[j]] > tempDist) { ids[j + 1] = ids[j--]; } + ids[j + 1] = temp; + } + } else { + var median = (left + right) >> 1; + var i$1 = left + 1; + var j$1 = right; + swap(ids, median, i$1); + if (dists[ids[left]] > dists[ids[right]]) { swap(ids, left, right); } + if (dists[ids[i$1]] > dists[ids[right]]) { swap(ids, i$1, right); } + if (dists[ids[left]] > dists[ids[i$1]]) { swap(ids, left, i$1); } + + var temp$1 = ids[i$1]; + var tempDist$1 = dists[temp$1]; + while (true) { + do { i$1++; } while (dists[ids[i$1]] < tempDist$1); + do { j$1--; } while (dists[ids[j$1]] > tempDist$1); + if (j$1 < i$1) { break; } + swap(ids, i$1, j$1); + } + ids[left + 1] = ids[j$1]; + ids[j$1] = temp$1; + + if (right - i$1 + 1 >= j$1 - left) { + quicksort(ids, dists, i$1, right); + quicksort(ids, dists, left, j$1 - 1); + } else { + quicksort(ids, dists, left, j$1 - 1); + quicksort(ids, dists, i$1, right); + } + } + } + + function swap(arr, i, j) { + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + } + + function defaultGetX(p) { + return p[0]; + } + function defaultGetY(p) { + return p[1]; + } + + return Delaunator; + +})); diff --git a/node_modules/delaunator/delaunator.min.js b/node_modules/delaunator/delaunator.min.js new file mode 100644 index 00000000..9cb87998 --- /dev/null +++ b/node_modules/delaunator/delaunator.min.js @@ -0,0 +1 @@ +!function(i,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(i=i||self).Delaunator=t()}(this,function(){"use strict";var i=Math.pow(2,-52),t=new Uint32Array(512),r=function(i){var t=i.length>>1;if(t>0&&"number"!=typeof i[0])throw new Error("Expected coords to contain numbers.");this.coords=i;var r=Math.max(2*t-5,0);this._triangles=new Uint32Array(3*r),this._halfedges=new Int32Array(3*r),this._hashSize=Math.ceil(Math.sqrt(t)),this._hullPrev=new Uint32Array(t),this._hullNext=new Uint32Array(t),this._hullTri=new Uint32Array(t),this._hullHash=new Int32Array(this._hashSize).fill(-1),this._ids=new Uint32Array(t),this._dists=new Float64Array(t),this.update()};function s(i,t,r,s){var h=i-r,a=t-s;return h*h+a*a}function h(i,t,r,s,h,a){var e=(s-t)*(h-i),n=(r-i)*(a-t);return Math.abs(e-n)>=33306690738754716e-32*Math.abs(e+n)?e-n:0}function a(i,t,r,s,a,e){return(h(a,e,i,t,r,s)||h(i,t,r,s,a,e)||h(r,s,a,e,i,t))<0}function e(i,t,r,s,h,a){var e=r-i,n=s-t,l=h-i,o=a-t,f=e*e+n*n,_=l*l+o*o,d=.5/(e*o-n*l),v=(o*f-n*_)*d,u=(e*_-l*f)*d;return v*v+u*u}function n(i,t,r,s){if(s-r<=20)for(var h=r+1;h<=s;h++){for(var a=i[h],e=t[a],o=h-1;o>=r&&t[i[o]]>e;)i[o+1]=i[o--];i[o+1]=a}else{var f=r+1,_=s;l(i,r+s>>1,f),t[i[r]]>t[i[s]]&&l(i,r,s),t[i[f]]>t[i[s]]&&l(i,f,s),t[i[r]]>t[i[f]]&&l(i,r,f);for(var d=i[f],v=t[d];;){do{f++}while(t[i[f]]v);if(_=_-r?(n(i,t,f,s),n(i,t,r,_-1)):(n(i,t,r,_-1),n(i,t,f,s))}}function l(i,t,r){var s=i[t];i[t]=i[r],i[r]=s}function o(i){return i[0]}function f(i){return i[1]}return r.from=function(i,t,s){void 0===t&&(t=o),void 0===s&&(s=f);for(var h=i.length,a=new Float64Array(2*h),e=0;e>1,_=1/0,d=1/0,v=-1/0,u=-1/0,y=0;yv&&(v=g),c>u&&(u=c),this._ids[y]=y}for(var w,p,b,A=(_+v)/2,k=(d+u)/2,x=1/0,M=0;M0&&(p=T,x=m)}for(var K=t[2*p],L=t[2*p+1],P=1/0,E=0;EB&&(j[q++]=C,B=this._dists[C])}return this.hull=j.subarray(0,q),this.triangles=new Uint32Array(0),void(this.halfedges=new Uint32Array(0))}if(a(z,U,K,L,H,I)){var G=p,J=K,O=L;p=b,K=H,L=I,b=G,H=J,I=O}var Q=function(i,t,r,s,h,a){var e=r-i,n=s-t,l=h-i,o=a-t,f=e*e+n*n,_=l*l+o*o,d=.5/(e*o-n*l);return{x:i+(o*f-n*_)*d,y:t+(e*_-l*f)*d}}(z,U,K,L,H,I);this._cx=Q.x,this._cy=Q.y;for(var R=0;R0&&Math.abs($-X)<=i&&Math.abs(ii-Y)<=i)&&(X=$,Y=ii,Z!==w&&Z!==p&&Z!==b)){for(var ti=0,ri=0,si=this._hashKey($,ii);ri0?3-h:1+h)/4*this._hashSize))%this._hashSize;var r,s,h},r.prototype._legalize=function(i){for(var r,s,h,a,e,n,l,o,f,_,d,v,u,y,g,c,w=this._triangles,p=this._halfedges,b=this.coords,A=0,k=0;;){var x=p[i],M=i-i%3;if(k=M+(i+2)%3,-1!==x){var S=x-x%3,z=M+(i+1)%3,U=S+(x+2)%3,T=w[k],m=w[i],K=w[z],L=w[U];if(r=b[2*T],s=b[2*T+1],h=b[2*m],a=b[2*m+1],e=b[2*K],n=b[2*K+1],l=b[2*L],o=b[2*L+1],f=void 0,_=void 0,d=void 0,v=void 0,u=void 0,y=void 0,void 0,g=void 0,c=void 0,(f=r-l)*((v=a-o)*(c=(u=e-l)*u+(y=n-o)*y)-(g=(d=h-l)*d+v*v)*y)-(_=s-o)*(d*c-g*u)+(f*f+_*_)*(d*y-v*u)<0){w[i]=L,w[x]=T;var P=p[U];if(-1===P){var E=this._hullStart;do{if(this._hullTri[E]===U){this._hullTri[E]=i;break}E=this._hullPrev[E]}while(E!==this._hullStart)}this._link(i,P),this._link(x,p[k]),this._link(k,U);var F=S+(x+1)%3;A> 1; + if (n > 0 && typeof coords[0] !== 'number') throw new Error('Expected coords to contain numbers.'); + + this.coords = coords; + + // arrays that will store the triangulation graph + const maxTriangles = Math.max(2 * n - 5, 0); + this._triangles = new Uint32Array(maxTriangles * 3); + this._halfedges = new Int32Array(maxTriangles * 3); + + // temporary arrays for tracking the edges of the advancing convex hull + this._hashSize = Math.ceil(Math.sqrt(n)); + this._hullPrev = new Uint32Array(n); // edge to prev edge + this._hullNext = new Uint32Array(n); // edge to next edge + this._hullTri = new Uint32Array(n); // edge to adjacent triangle + this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash + + // temporary arrays for sorting points + this._ids = new Uint32Array(n); + this._dists = new Float64Array(n); + + this.update(); + } + + update() { + const {coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash} = this; + const n = coords.length >> 1; + + // populate an array of point indices; calculate input data bbox + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + + for (let i = 0; i < n; i++) { + const x = coords[2 * i]; + const y = coords[2 * i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + this._ids[i] = i; + } + const cx = (minX + maxX) / 2; + const cy = (minY + maxY) / 2; + + let minDist = Infinity; + let i0, i1, i2; + + // pick a seed point close to the center + for (let i = 0; i < n; i++) { + const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]); + if (d < minDist) { + i0 = i; + minDist = d; + } + } + const i0x = coords[2 * i0]; + const i0y = coords[2 * i0 + 1]; + + minDist = Infinity; + + // find the point closest to the seed + for (let i = 0; i < n; i++) { + if (i === i0) continue; + const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]); + if (d < minDist && d > 0) { + i1 = i; + minDist = d; + } + } + let i1x = coords[2 * i1]; + let i1y = coords[2 * i1 + 1]; + + let minRadius = Infinity; + + // find the third point which forms the smallest circumcircle with the first two + for (let i = 0; i < n; i++) { + if (i === i0 || i === i1) continue; + const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]); + if (r < minRadius) { + i2 = i; + minRadius = r; + } + } + let i2x = coords[2 * i2]; + let i2y = coords[2 * i2 + 1]; + + if (minRadius === Infinity) { + // order collinear points by dx (or dy if all x are identical) + // and return the list as a hull + for (let i = 0; i < n; i++) { + this._dists[i] = (coords[2 * i] - coords[0]) || (coords[2 * i + 1] - coords[1]); + } + quicksort(this._ids, this._dists, 0, n - 1); + const hull = new Uint32Array(n); + let j = 0; + for (let i = 0, d0 = -Infinity; i < n; i++) { + const id = this._ids[i]; + if (this._dists[id] > d0) { + hull[j++] = id; + d0 = this._dists[id]; + } + } + this.hull = hull.subarray(0, j); + this.triangles = new Uint32Array(0); + this.halfedges = new Uint32Array(0); + return; + } + + // swap the order of the seed points for counter-clockwise orientation + if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) { + const i = i1; + const x = i1x; + const y = i1y; + i1 = i2; + i1x = i2x; + i1y = i2y; + i2 = i; + i2x = x; + i2y = y; + } + + const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y); + this._cx = center.x; + this._cy = center.y; + + for (let i = 0; i < n; i++) { + this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y); + } + + // sort the points by distance from the seed triangle circumcenter + quicksort(this._ids, this._dists, 0, n - 1); + + // set up the seed triangle as the starting hull + this._hullStart = i0; + let hullSize = 3; + + hullNext[i0] = hullPrev[i2] = i1; + hullNext[i1] = hullPrev[i0] = i2; + hullNext[i2] = hullPrev[i1] = i0; + + hullTri[i0] = 0; + hullTri[i1] = 1; + hullTri[i2] = 2; + + hullHash.fill(-1); + hullHash[this._hashKey(i0x, i0y)] = i0; + hullHash[this._hashKey(i1x, i1y)] = i1; + hullHash[this._hashKey(i2x, i2y)] = i2; + + this.trianglesLen = 0; + this._addTriangle(i0, i1, i2, -1, -1, -1); + + for (let k = 0, xp, yp; k < this._ids.length; k++) { + const i = this._ids[k]; + const x = coords[2 * i]; + const y = coords[2 * i + 1]; + + // skip near-duplicate points + if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue; + xp = x; + yp = y; + + // skip seed triangle points + if (i === i0 || i === i1 || i === i2) continue; + + // find a visible edge on the convex hull using edge hash + let start = 0; + for (let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++) { + start = hullHash[(key + j) % this._hashSize]; + if (start !== -1 && start !== hullNext[start]) break; + } + + start = hullPrev[start]; + let e = start, q; + while (q = hullNext[e], !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1])) { + e = q; + if (e === start) { + e = -1; + break; + } + } + if (e === -1) continue; // likely a near-duplicate point; skip it + + // add the first triangle from the point + let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]); + + // recursively flip triangles from the point until they satisfy the Delaunay condition + hullTri[i] = this._legalize(t + 2); + hullTri[e] = t; // keep track of boundary triangles on the hull + hullSize++; + + // walk forward through the hull, adding more triangles and flipping recursively + let n = hullNext[e]; + while (q = hullNext[n], orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1])) { + t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]); + hullTri[i] = this._legalize(t + 2); + hullNext[n] = n; // mark as removed + hullSize--; + n = q; + } + + // walk backward from the other side, adding more triangles and flipping + if (e === start) { + while (q = hullPrev[e], orient(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1])) { + t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]); + this._legalize(t + 2); + hullTri[q] = t; + hullNext[e] = e; // mark as removed + hullSize--; + e = q; + } + } + + // update the hull indices + this._hullStart = hullPrev[i] = e; + hullNext[e] = hullPrev[n] = i; + hullNext[i] = n; + + // save the two new edges in the hash table + hullHash[this._hashKey(x, y)] = i; + hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e; + } + + this.hull = new Uint32Array(hullSize); + for (let i = 0, e = this._hullStart; i < hullSize; i++) { + this.hull[i] = e; + e = hullNext[e]; + } + + // trim typed triangle mesh arrays + this.triangles = this._triangles.subarray(0, this.trianglesLen); + this.halfedges = this._halfedges.subarray(0, this.trianglesLen); + } + + _hashKey(x, y) { + return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize; + } + + _legalize(a) { + const {_triangles: triangles, _halfedges: halfedges, coords} = this; + + let i = 0; + let ar = 0; + + // recursion eliminated with a fixed-size stack + while (true) { + const b = halfedges[a]; + + /* if the pair of triangles doesn't satisfy the Delaunay condition + * (p1 is inside the circumcircle of [p0, pl, pr]), flip them, + * then do the same check/flip recursively for the new pair of triangles + * + * pl pl + * /||\ / \ + * al/ || \bl al/ \a + * / || \ / \ + * / a||b \ flip /___ar___\ + * p0\ || /p1 => p0\---bl---/p1 + * \ || / \ / + * ar\ || /br b\ /br + * \||/ \ / + * pr pr + */ + const a0 = a - a % 3; + ar = a0 + (a + 2) % 3; + + if (b === -1) { // convex hull edge + if (i === 0) break; + a = EDGE_STACK[--i]; + continue; + } + + const b0 = b - b % 3; + const al = a0 + (a + 1) % 3; + const bl = b0 + (b + 2) % 3; + + const p0 = triangles[ar]; + const pr = triangles[a]; + const pl = triangles[al]; + const p1 = triangles[bl]; + + const illegal = inCircle( + coords[2 * p0], coords[2 * p0 + 1], + coords[2 * pr], coords[2 * pr + 1], + coords[2 * pl], coords[2 * pl + 1], + coords[2 * p1], coords[2 * p1 + 1]); + + if (illegal) { + triangles[a] = p1; + triangles[b] = p0; + + const hbl = halfedges[bl]; + + // edge swapped on the other side of the hull (rare); fix the halfedge reference + if (hbl === -1) { + let e = this._hullStart; + do { + if (this._hullTri[e] === bl) { + this._hullTri[e] = a; + break; + } + e = this._hullPrev[e]; + } while (e !== this._hullStart); + } + this._link(a, hbl); + this._link(b, halfedges[ar]); + this._link(ar, bl); + + const br = b0 + (b + 1) % 3; + + // don't worry about hitting the cap: it can only happen on extremely degenerate input + if (i < EDGE_STACK.length) { + EDGE_STACK[i++] = br; + } + } else { + if (i === 0) break; + a = EDGE_STACK[--i]; + } + } + + return ar; + } + + _link(a, b) { + this._halfedges[a] = b; + if (b !== -1) this._halfedges[b] = a; + } + + // add a new triangle given vertex indices and adjacent half-edge ids + _addTriangle(i0, i1, i2, a, b, c) { + const t = this.trianglesLen; + + this._triangles[t] = i0; + this._triangles[t + 1] = i1; + this._triangles[t + 2] = i2; + + this._link(t, a); + this._link(t + 1, b); + this._link(t + 2, c); + + this.trianglesLen += 3; + + return t; + } +} + +// monotonically increases with real angle, but doesn't need expensive trigonometry +function pseudoAngle(dx, dy) { + const p = dx / (Math.abs(dx) + Math.abs(dy)); + return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1] +} + +function dist(ax, ay, bx, by) { + const dx = ax - bx; + const dy = ay - by; + return dx * dx + dy * dy; +} + +// return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check +function orientIfSure(px, py, rx, ry, qx, qy) { + const l = (ry - py) * (qx - px); + const r = (rx - px) * (qy - py); + return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0; +} + +// a more robust orientation test that's stable in a given triangle (to fix robustness issues) +function orient(rx, ry, qx, qy, px, py) { + const sign = orientIfSure(px, py, rx, ry, qx, qy) || + orientIfSure(rx, ry, qx, qy, px, py) || + orientIfSure(qx, qy, px, py, rx, ry); + return sign < 0; +} + +function inCircle(ax, ay, bx, by, cx, cy, px, py) { + const dx = ax - px; + const dy = ay - py; + const ex = bx - px; + const ey = by - py; + const fx = cx - px; + const fy = cy - py; + + const ap = dx * dx + dy * dy; + const bp = ex * ex + ey * ey; + const cp = fx * fx + fy * fy; + + return dx * (ey * cp - bp * fy) - + dy * (ex * cp - bp * fx) + + ap * (ex * fy - ey * fx) < 0; +} + +function circumradius(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; + + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); + + const x = (ey * bl - dy * cl) * d; + const y = (dx * cl - ex * bl) * d; + + return x * x + y * y; +} + +function circumcenter(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; + + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); + + const x = ax + (ey * bl - dy * cl) * d; + const y = ay + (dx * cl - ex * bl) * d; + + return {x, y}; +} + +function quicksort(ids, dists, left, right) { + if (right - left <= 20) { + for (let i = left + 1; i <= right; i++) { + const temp = ids[i]; + const tempDist = dists[temp]; + let j = i - 1; + while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--]; + ids[j + 1] = temp; + } + } else { + const median = (left + right) >> 1; + let i = left + 1; + let j = right; + swap(ids, median, i); + if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right); + if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right); + if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i); + + const temp = ids[i]; + const tempDist = dists[temp]; + while (true) { + do i++; while (dists[ids[i]] < tempDist); + do j--; while (dists[ids[j]] > tempDist); + if (j < i) break; + swap(ids, i, j); + } + ids[left + 1] = ids[j]; + ids[j] = temp; + + if (right - i + 1 >= j - left) { + quicksort(ids, dists, i, right); + quicksort(ids, dists, left, j - 1); + } else { + quicksort(ids, dists, left, j - 1); + quicksort(ids, dists, i, right); + } + } +} + +function swap(arr, i, j) { + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} + +function defaultGetX(p) { + return p[0]; +} +function defaultGetY(p) { + return p[1]; +} diff --git a/node_modules/delaunator/package.json b/node_modules/delaunator/package.json new file mode 100644 index 00000000..9e7f8358 --- /dev/null +++ b/node_modules/delaunator/package.json @@ -0,0 +1,83 @@ +{ + "_from": "delaunator@4", + "_id": "delaunator@4.0.1", + "_inBundle": false, + "_integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==", + "_location": "/delaunator", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "delaunator@4", + "name": "delaunator", + "escapedName": "delaunator", + "rawSpec": "4", + "saveSpec": null, + "fetchSpec": "4" + }, + "_requiredBy": [ + "/d3-delaunay" + ], + "_resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", + "_shasum": "3d779687f57919a7a418f8ab947d3bddb6846957", + "_spec": "delaunator@4", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3-delaunay", + "author": { + "name": "Vladimir Agafonkin" + }, + "bugs": { + "url": "https://github.com/mapbox/delaunator/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "An incredibly fast JavaScript library for Delaunay triangulation of 2D points", + "devDependencies": { + "c8": "^5.0.1", + "eslint": "^6.2.2", + "eslint-config-mourner": "^3.0.0", + "esm": "^3.2.25", + "rollup": "^1.20.3", + "rollup-plugin-buble": "^0.19.8", + "rollup-plugin-terser": "^5.1.1", + "tape": "^4.11.0" + }, + "eslintConfig": { + "extends": "mourner", + "rules": { + "no-sequences": 0 + } + }, + "files": [ + "index.js", + "delaunator.js", + "delaunator.min.js" + ], + "homepage": "https://github.com/mapbox/delaunator#readme", + "jsdelivr": "delaunator.min.js", + "keywords": [ + "delaunay triangulation", + "computational geometry", + "algorithms" + ], + "license": "ISC", + "main": "delaunator.js", + "module": "index.js", + "name": "delaunator", + "repository": { + "type": "git", + "url": "git+https://github.com/mapbox/delaunator.git" + }, + "scripts": { + "bench": "node -r esm bench.js", + "build": "rollup -c", + "cov": "c8 node -r esm test/test.js && c8 report -r html", + "lint": "eslint index.js test/test.js bench.js rollup.config.js docs/diagrams.js", + "prepublishOnly": "npm test && npm run build", + "pretest": "npm run lint", + "start": "rollup -cw", + "test": "node -r esm test/test.js" + }, + "unpkg": "delaunator.min.js", + "version": "4.0.1" +} diff --git a/node_modules/denque/CHANGELOG.md b/node_modules/denque/CHANGELOG.md new file mode 100644 index 00000000..bb5ffb6f --- /dev/null +++ b/node_modules/denque/CHANGELOG.md @@ -0,0 +1,4 @@ +## 1.5.0 + + - feat: adds capacity option for circular buffers (#27) + diff --git a/node_modules/denque/LICENSE b/node_modules/denque/LICENSE new file mode 100644 index 00000000..fd22a2db --- /dev/null +++ b/node_modules/denque/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2018 Mike Diarmid (Salakar) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this library except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/node_modules/denque/README.md b/node_modules/denque/README.md new file mode 100644 index 00000000..6821e0d0 --- /dev/null +++ b/node_modules/denque/README.md @@ -0,0 +1,362 @@ +

+ +
+
+

Denque

+

+ +

+ NPM downloads + NPM version + Build version + Build version + License + Chat + Follow on Twitter +

+ +Extremely fast and lightweight [double-ended queue](http://en.wikipedia.org/wiki/Double-ended_queue) implementation with zero dependencies. + +Double-ended queues can also be used as a: + +- [Stack](http://en.wikipedia.org/wiki/Stack_\(abstract_data_type\)) +- [Queue](http://en.wikipedia.org/wiki/Queue_\(data_structure\)) + +This implementation is currently the fastest available, even faster than `double-ended-queue`, see the [benchmarks](#benchmarks) + +Every queue operation is done at a constant `O(1)` - including random access from `.peekAt(index)`. + +**Works on all node versions >= v0.10** + +# Quick Start + + npm install denque + +```js +const Denque = require("denque"); + +const denque = new Denque([1,2,3,4]); +denque.shift(); // 1 +denque.pop(); // 4 +``` + + +# API + +- [`new Denque()`](#new-denque---denque) +- [`new Denque(Array items)`](#new-denquearray-items---denque) +- [`push(item)`](#pushitem---int) +- [`unshift(item)`](#unshiftitem---int) +- [`pop()`](#pop---dynamic) +- [`shift()`](#shift---dynamic) +- [`toArray()`](#toarray---array) +- [`peekBack()`](#peekback---dynamic) +- [`peekFront()`](#peekfront---dynamic) +- [`peekAt(int index)`](#peekAtint-index---dynamic) +- [`remove(int index, int count)`](#remove) +- [`removeOne(int index)`](#removeOne) +- [`splice(int index, int count, item1, item2, ...)`](#splice) +- [`isEmpty()`](#isempty---boolean) +- [`clear()`](#clear---void) + +#### `new Denque()` -> `Denque` + +Creates an empty double-ended queue with initial capacity of 4. + +```js +var denque = new Denque(); +denque.push(1); +denque.push(2); +denque.push(3); +denque.shift(); //1 +denque.pop(); //3 +``` + +
+ +#### `new Denque(Array items)` -> `Denque` + +Creates a double-ended queue from `items`. + +```js +var denque = new Denque([1,2,3,4]); +denque.shift(); // 1 +denque.pop(); // 4 +``` + +
+ + +#### `push(item)` -> `int` + +Push an item to the back of this queue. Returns the amount of items currently in the queue after the operation. + +```js +var denque = new Denque(); +denque.push(1); +denque.pop(); // 1 +denque.push(2); +denque.push(3); +denque.shift(); // 2 +denque.shift(); // 3 +``` + +
+ +#### `unshift(item)` -> `int` + +Unshift an item to the front of this queue. Returns the amount of items currently in the queue after the operation. + +```js +var denque = new Denque([2,3]); +denque.unshift(1); +denque.toString(); // "1,2,3" +denque.unshift(-2); +denque.toString(); // "-2,-1,0,1,2,3" +``` + +
+ + +#### `pop()` -> `dynamic` + +Pop off the item at the back of this queue. + +Note: The item will be removed from the queue. If you simply want to see what's at the back of the queue use [`peekBack()`](#peekback---dynamic) or [`.peekAt(-1)`](#peekAtint-index---dynamic). + +If the queue is empty, `undefined` is returned. If you need to differentiate between `undefined` values in the queue and `pop()` return value - +check the queue `.length` before popping. + +```js +var denque = new Denque([1,2,3]); +denque.pop(); // 3 +denque.pop(); // 2 +denque.pop(); // 1 +denque.pop(); // undefined +``` + +**Aliases:** `removeBack` + +
+ +#### `shift()` -> `dynamic` + +Shifts off the item at the front of this queue. + +Note: The item will be removed from the queue. If you simply want to see what's at the front of the queue use [`peekFront()`](#peekfront---dynamic) or [`.peekAt(0)`](#peekAtint-index---dynamic). + +If the queue is empty, `undefined` is returned. If you need to differentiate between `undefined` values in the queue and `shift()` return value - +check the queue `.length` before shifting. + +```js +var denque = new Denque([1,2,3]); +denque.shift(); // 1 +denque.shift(); // 2 +denque.shift(); // 3 +denque.shift(); // undefined +``` + +
+ +#### `toArray()` -> `Array` + +Returns the items in the queue as an array. Starting from the item in the front of the queue and ending to the item at the back of the queue. + +```js +var denque = new Denque([1,2,3]); +denque.push(4); +denque.unshift(0); +denque.toArray(); // [0,1,2,3,4] +``` + +
+ +#### `peekBack()` -> `dynamic` + +Returns the item that is at the back of this queue without removing it. + +If the queue is empty, `undefined` is returned. + +```js +var denque = new Denque([1,2,3]); +denque.push(4); +denque.peekBack(); // 4 +``` + +
+ +#### `peekFront()` -> `dynamic` + +Returns the item that is at the front of this queue without removing it. + +If the queue is empty, `undefined` is returned. + +```js +var denque = new Denque([1,2,3]); +denque.push(4); +denque.peekFront(); // 1 +``` + +
+ +#### `peekAt(int index)` -> `dynamic` + +Returns the item that is at the given `index` of this queue without removing it. + +The index is zero-based, so `.peekAt(0)` will return the item that is at the front, `.peekAt(1)` will return +the item that comes after and so on. + +The index can be negative to read items at the back of the queue. `.peekAt(-1)` returns the item that is at the back of the queue, +`.peekAt(-2)` will return the item that comes before and so on. + +Returns `undefined` if `index` is not a valid index into the queue. + +```js +var denque = new Denque([1,2,3]); +denque.peekAt(0); //1 +denque.peekAt(1); //2 +denque.peekAt(2); //3 + +denque.peekAt(-1); // 3 +denque.peekAt(-2); // 2 +denque.peekAt(-3); // 1 +``` + +**Note**: The implementation has O(1) random access using `.peekAt()`. + +**Aliases:** `get` + +
+ +#### `remove(int index, int count)` -> `array` + +Remove number of items from the specified index from the list. + +Returns array of removed items. + +Returns undefined if the list is empty. + +```js +var denque = new Denque([1,2,3,4,5,6,7]); +denque.remove(0,3); //[1,2,3] +denque.remove(1,2); //[5,6] +var denque1 = new Denque([1,2,3,4,5,6,7]); +denque1.remove(4, 100); //[5,6,7] +``` + +
+ +#### `removeOne(int index)` -> `dynamic` + +Remove and return the item at the specified index from the list. + +Returns undefined if the list is empty. + +```js +var denque = new Denque([1,2,3,4,5,6,7]); +denque.removeOne(4); // 5 +denque.removeOne(3); // 4 +denque1.removeOne(1); // 2 +``` + +
+ +#### `splice(int index, int count, item1, item2, ...)` -> `array` + +Native splice implementation. + +Remove number of items from the specified index from the list and/or add new elements. + +Returns array of removed items or empty array if count == 0. + +Returns undefined if the list is empty. + +```js +var denque = new Denque([1,2,3,4,5,6,7]); +denque.splice(denque.length, 0, 8, 9, 10); // [] +denque.toArray() // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] +denque.splice(3, 3, 44, 55, 66); // [4,5,6] +denque.splice(5,4, 666,667,668,669); // [ 66, 7, 8, 9 ] +denque.toArray() // [ 1, 2, 3, 44, 55, 666, 667, 668, 669, 10 ] +``` + +
+ +#### `isEmpty()` -> `boolean` + +Return `true` if this queue is empty, `false` otherwise. + +```js +var denque = new Denque(); +denque.isEmpty(); // true +denque.push(1); +denque.isEmpty(); // false +``` + +
+ +#### `clear()` -> `void` + +Remove all items from this queue. Does not change the queue's capacity. + +```js +var denque = new Denque([1,2,3]); +denque.toString(); // "1,2,3" +denque.clear(); +denque.toString(); // "" +``` +
+ + +## Benchmarks + +#### Platform info: +``` +Darwin 17.0.0 x64 +Node.JS 9.4.0 +V8 6.2.414.46-node.17 +Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz × 8 +``` + +#### 1000 items in queue + + (3 x shift + 3 x push ops per 'op') + + denque x 64,365,425 ops/sec ±0.69% (92 runs sampled) + double-ended-queue x 26,646,882 ops/sec ±0.47% (94 runs sampled) + +#### 2 million items in queue + + (3 x shift + 3 x push ops per 'op') + + denque x 61,994,249 ops/sec ±0.26% (95 runs sampled) + double-ended-queue x 26,363,500 ops/sec ±0.42% (91 runs sampled) + +#### Splice + + (1 x splice per 'op') - initial size of 100,000 items + + denque.splice x 925,749 ops/sec ±22.29% (77 runs sampled) + native array splice x 7,777 ops/sec ±8.35% (50 runs sampled) + +#### Remove + + (1 x remove + 10 x push per 'op') - initial size of 100,000 items + + denque.remove x 2,635,275 ops/sec ±0.37% (95 runs sampled) + native array splice - Fails to complete: "JavaScript heap out of memory" + +#### Remove One + + (1 x removeOne + 10 x push per 'op') - initial size of 100,000 items + + denque.removeOne x 1,088,240 ops/sec ±0.21% (93 runs sampled) + native array splice x 5,300 ops/sec ±0.41% (96 runs sampled) + +--- + +Built and maintained with 💛 by [Invertase](https://invertase.io). + +- [💼 Hire Us](https://invertase.io/hire-us) +- [â˜•ï¸ Sponsor Us](https://opencollective.com/react-native-firebase) +- [👩â€ðŸ’» Work With Us](https://invertase.io/jobs) diff --git a/node_modules/denque/index.d.ts b/node_modules/denque/index.d.ts new file mode 100644 index 00000000..05d7123f --- /dev/null +++ b/node_modules/denque/index.d.ts @@ -0,0 +1,31 @@ +declare class Denque { + constructor(); + constructor(array: T[]); + constructor(array: T[], options: IDenqueOptions); + + push(item: T): number; + unshift(item: T): number; + pop(): T | undefined; + removeBack(): T | undefined; + shift(): T | undefined; + peekBack(): T | undefined; + peekFront(): T | undefined; + peekAt(index: number): T | undefined; + get(index: number): T | undefined; + remove(index: number, count: number): T[]; + removeOne(index: number): T | undefined; + splice(index: number, count: number, ...item: T[]): T[] | undefined; + isEmpty(): boolean; + clear(): void; + + toString(): string; + toArray(): T[]; + + length: number; +} + +interface IDenqueOptions { + capacity?: number +} + +export = Denque; diff --git a/node_modules/denque/index.js b/node_modules/denque/index.js new file mode 100644 index 00000000..f664cd72 --- /dev/null +++ b/node_modules/denque/index.js @@ -0,0 +1,443 @@ +'use strict'; + +/** + * Custom implementation of a double ended queue. + */ +function Denque(array, options) { + var options = options || {}; + + this._head = 0; + this._tail = 0; + this._capacity = options.capacity; + this._capacityMask = 0x3; + this._list = new Array(4); + if (Array.isArray(array)) { + this._fromArray(array); + } +} + +/** + * ------------- + * PUBLIC API + * ------------- + */ + +/** + * Returns the item at the specified index from the list. + * 0 is the first element, 1 is the second, and so on... + * Elements at negative values are that many from the end: -1 is one before the end + * (the last element), -2 is two before the end (one before last), etc. + * @param index + * @returns {*} + */ +Denque.prototype.peekAt = function peekAt(index) { + var i = index; + // expect a number or return undefined + if ((i !== (i | 0))) { + return void 0; + } + var len = this.size(); + if (i >= len || i < -len) return undefined; + if (i < 0) i += len; + i = (this._head + i) & this._capacityMask; + return this._list[i]; +}; + +/** + * Alias for peekAt() + * @param i + * @returns {*} + */ +Denque.prototype.get = function get(i) { + return this.peekAt(i); +}; + +/** + * Returns the first item in the list without removing it. + * @returns {*} + */ +Denque.prototype.peek = function peek() { + if (this._head === this._tail) return undefined; + return this._list[this._head]; +}; + +/** + * Alias for peek() + * @returns {*} + */ +Denque.prototype.peekFront = function peekFront() { + return this.peek(); +}; + +/** + * Returns the item that is at the back of the queue without removing it. + * Uses peekAt(-1) + */ +Denque.prototype.peekBack = function peekBack() { + return this.peekAt(-1); +}; + +/** + * Returns the current length of the queue + * @return {Number} + */ +Object.defineProperty(Denque.prototype, 'length', { + get: function length() { + return this.size(); + } +}); + +/** + * Return the number of items on the list, or 0 if empty. + * @returns {number} + */ +Denque.prototype.size = function size() { + if (this._head === this._tail) return 0; + if (this._head < this._tail) return this._tail - this._head; + else return this._capacityMask + 1 - (this._head - this._tail); +}; + +/** + * Add an item at the beginning of the list. + * @param item + */ +Denque.prototype.unshift = function unshift(item) { + if (item === undefined) return this.size(); + var len = this._list.length; + this._head = (this._head - 1 + len) & this._capacityMask; + this._list[this._head] = item; + if (this._tail === this._head) this._growArray(); + if (this._capacity && this.size() > this._capacity) this.pop(); + if (this._head < this._tail) return this._tail - this._head; + else return this._capacityMask + 1 - (this._head - this._tail); +}; + +/** + * Remove and return the first item on the list, + * Returns undefined if the list is empty. + * @returns {*} + */ +Denque.prototype.shift = function shift() { + var head = this._head; + if (head === this._tail) return undefined; + var item = this._list[head]; + this._list[head] = undefined; + this._head = (head + 1) & this._capacityMask; + if (head < 2 && this._tail > 10000 && this._tail <= this._list.length >>> 2) this._shrinkArray(); + return item; +}; + +/** + * Add an item to the bottom of the list. + * @param item + */ +Denque.prototype.push = function push(item) { + if (item === undefined) return this.size(); + var tail = this._tail; + this._list[tail] = item; + this._tail = (tail + 1) & this._capacityMask; + if (this._tail === this._head) { + this._growArray(); + } + if (this._capacity && this.size() > this._capacity) { + this.shift(); + } + if (this._head < this._tail) return this._tail - this._head; + else return this._capacityMask + 1 - (this._head - this._tail); +}; + +/** + * Remove and return the last item on the list. + * Returns undefined if the list is empty. + * @returns {*} + */ +Denque.prototype.pop = function pop() { + var tail = this._tail; + if (tail === this._head) return undefined; + var len = this._list.length; + this._tail = (tail - 1 + len) & this._capacityMask; + var item = this._list[this._tail]; + this._list[this._tail] = undefined; + if (this._head < 2 && tail > 10000 && tail <= len >>> 2) this._shrinkArray(); + return item; +}; + +/** + * Remove and return the item at the specified index from the list. + * Returns undefined if the list is empty. + * @param index + * @returns {*} + */ +Denque.prototype.removeOne = function removeOne(index) { + var i = index; + // expect a number or return undefined + if ((i !== (i | 0))) { + return void 0; + } + if (this._head === this._tail) return void 0; + var size = this.size(); + var len = this._list.length; + if (i >= size || i < -size) return void 0; + if (i < 0) i += size; + i = (this._head + i) & this._capacityMask; + var item = this._list[i]; + var k; + if (index < size / 2) { + for (k = index; k > 0; k--) { + this._list[i] = this._list[i = (i - 1 + len) & this._capacityMask]; + } + this._list[i] = void 0; + this._head = (this._head + 1 + len) & this._capacityMask; + } else { + for (k = size - 1 - index; k > 0; k--) { + this._list[i] = this._list[i = ( i + 1 + len) & this._capacityMask]; + } + this._list[i] = void 0; + this._tail = (this._tail - 1 + len) & this._capacityMask; + } + return item; +}; + +/** + * Remove number of items from the specified index from the list. + * Returns array of removed items. + * Returns undefined if the list is empty. + * @param index + * @param count + * @returns {array} + */ +Denque.prototype.remove = function remove(index, count) { + var i = index; + var removed; + var del_count = count; + // expect a number or return undefined + if ((i !== (i | 0))) { + return void 0; + } + if (this._head === this._tail) return void 0; + var size = this.size(); + var len = this._list.length; + if (i >= size || i < -size || count < 1) return void 0; + if (i < 0) i += size; + if (count === 1 || !count) { + removed = new Array(1); + removed[0] = this.removeOne(i); + return removed; + } + if (i === 0 && i + count >= size) { + removed = this.toArray(); + this.clear(); + return removed; + } + if (i + count > size) count = size - i; + var k; + removed = new Array(count); + for (k = 0; k < count; k++) { + removed[k] = this._list[(this._head + i + k) & this._capacityMask]; + } + i = (this._head + i) & this._capacityMask; + if (index + count === size) { + this._tail = (this._tail - count + len) & this._capacityMask; + for (k = count; k > 0; k--) { + this._list[i = (i + 1 + len) & this._capacityMask] = void 0; + } + return removed; + } + if (index === 0) { + this._head = (this._head + count + len) & this._capacityMask; + for (k = count - 1; k > 0; k--) { + this._list[i = (i + 1 + len) & this._capacityMask] = void 0; + } + return removed; + } + if (i < size / 2) { + this._head = (this._head + index + count + len) & this._capacityMask; + for (k = index; k > 0; k--) { + this.unshift(this._list[i = (i - 1 + len) & this._capacityMask]); + } + i = (this._head - 1 + len) & this._capacityMask; + while (del_count > 0) { + this._list[i = (i - 1 + len) & this._capacityMask] = void 0; + del_count--; + } + if (index < 0) this._tail = i; + } else { + this._tail = i; + i = (i + count + len) & this._capacityMask; + for (k = size - (count + index); k > 0; k--) { + this.push(this._list[i++]); + } + i = this._tail; + while (del_count > 0) { + this._list[i = (i + 1 + len) & this._capacityMask] = void 0; + del_count--; + } + } + if (this._head < 2 && this._tail > 10000 && this._tail <= len >>> 2) this._shrinkArray(); + return removed; +}; + +/** + * Native splice implementation. + * Remove number of items from the specified index from the list and/or add new elements. + * Returns array of removed items or empty array if count == 0. + * Returns undefined if the list is empty. + * + * @param index + * @param count + * @param {...*} [elements] + * @returns {array} + */ +Denque.prototype.splice = function splice(index, count) { + var i = index; + // expect a number or return undefined + if ((i !== (i | 0))) { + return void 0; + } + var size = this.size(); + if (i < 0) i += size; + if (i > size) return void 0; + if (arguments.length > 2) { + var k; + var temp; + var removed; + var arg_len = arguments.length; + var len = this._list.length; + var arguments_index = 2; + if (!size || i < size / 2) { + temp = new Array(i); + for (k = 0; k < i; k++) { + temp[k] = this._list[(this._head + k) & this._capacityMask]; + } + if (count === 0) { + removed = []; + if (i > 0) { + this._head = (this._head + i + len) & this._capacityMask; + } + } else { + removed = this.remove(i, count); + this._head = (this._head + i + len) & this._capacityMask; + } + while (arg_len > arguments_index) { + this.unshift(arguments[--arg_len]); + } + for (k = i; k > 0; k--) { + this.unshift(temp[k - 1]); + } + } else { + temp = new Array(size - (i + count)); + var leng = temp.length; + for (k = 0; k < leng; k++) { + temp[k] = this._list[(this._head + i + count + k) & this._capacityMask]; + } + if (count === 0) { + removed = []; + if (i != size) { + this._tail = (this._head + i + len) & this._capacityMask; + } + } else { + removed = this.remove(i, count); + this._tail = (this._tail - leng + len) & this._capacityMask; + } + while (arguments_index < arg_len) { + this.push(arguments[arguments_index++]); + } + for (k = 0; k < leng; k++) { + this.push(temp[k]); + } + } + return removed; + } else { + return this.remove(i, count); + } +}; + +/** + * Soft clear - does not reset capacity. + */ +Denque.prototype.clear = function clear() { + this._head = 0; + this._tail = 0; +}; + +/** + * Returns true or false whether the list is empty. + * @returns {boolean} + */ +Denque.prototype.isEmpty = function isEmpty() { + return this._head === this._tail; +}; + +/** + * Returns an array of all queue items. + * @returns {Array} + */ +Denque.prototype.toArray = function toArray() { + return this._copyArray(false); +}; + +/** + * ------------- + * INTERNALS + * ------------- + */ + +/** + * Fills the queue with items from an array + * For use in the constructor + * @param array + * @private + */ +Denque.prototype._fromArray = function _fromArray(array) { + for (var i = 0; i < array.length; i++) this.push(array[i]); +}; + +/** + * + * @param fullCopy + * @returns {Array} + * @private + */ +Denque.prototype._copyArray = function _copyArray(fullCopy) { + var newArray = []; + var list = this._list; + var len = list.length; + var i; + if (fullCopy || this._head > this._tail) { + for (i = this._head; i < len; i++) newArray.push(list[i]); + for (i = 0; i < this._tail; i++) newArray.push(list[i]); + } else { + for (i = this._head; i < this._tail; i++) newArray.push(list[i]); + } + return newArray; +}; + +/** + * Grows the internal list array. + * @private + */ +Denque.prototype._growArray = function _growArray() { + if (this._head) { + // copy existing data, head to end, then beginning to tail. + this._list = this._copyArray(true); + this._head = 0; + } + + // head is at 0 and array is now full, safe to extend + this._tail = this._list.length; + + this._list.length *= 2; + this._capacityMask = (this._capacityMask << 1) | 1; +}; + +/** + * Shrinks the internal list array. + * @private + */ +Denque.prototype._shrinkArray = function _shrinkArray() { + this._list.length >>>= 1; + this._capacityMask >>>= 1; +}; + + +module.exports = Denque; diff --git a/node_modules/denque/package.json b/node_modules/denque/package.json new file mode 100644 index 00000000..a09b85e2 --- /dev/null +++ b/node_modules/denque/package.json @@ -0,0 +1,84 @@ +{ + "_from": "denque@^1.4.1", + "_id": "denque@1.5.0", + "_inBundle": false, + "_integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", + "_location": "/denque", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "denque@^1.4.1", + "name": "denque", + "escapedName": "denque", + "rawSpec": "^1.4.1", + "saveSpec": null, + "fetchSpec": "^1.4.1" + }, + "_requiredBy": [ + "/mongodb" + ], + "_resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "_shasum": "773de0686ff2d8ec2ff92914316a47b73b1c73de", + "_spec": "denque@^1.4.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\mongodb", + "author": { + "name": "Invertase", + "email": "oss@invertase.io", + "url": "http://github.com/invertase/" + }, + "bugs": { + "url": "https://github.com/invertase/denque/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Mike Diarmid", + "email": "mike@invertase.io", + "url": "Salakar" + } + ], + "deprecated": false, + "description": "The fastest javascript implementation of a double-ended queue. Maintains compatability with deque.", + "devDependencies": { + "benchmark": "^2.1.4", + "coveralls": "^2.13.3", + "double-ended-queue": "^2.1.0-0", + "istanbul": "^0.4.5", + "mocha": "^3.5.3", + "typescript": "^3.4.1" + }, + "engines": { + "node": ">=0.10" + }, + "homepage": "https://github.com/invertase/denque#readme", + "keywords": [ + "data-structure", + "data-structures", + "queue", + "double", + "end", + "ended", + "deque", + "denque", + "double-ended-queue" + ], + "license": "Apache-2.0", + "main": "index.js", + "name": "denque", + "repository": { + "type": "git", + "url": "git+https://github.com/invertase/denque.git" + }, + "scripts": { + "benchmark_2mil": "node benchmark/two_million", + "benchmark_remove": "node benchmark/remove", + "benchmark_removeOne": "node benchmark/removeOne", + "benchmark_splice": "node benchmark/splice", + "benchmark_thousand": "node benchmark/thousand", + "coveralls": "cat ./coverage/lcov.info | coveralls", + "test": "istanbul cover --report lcov _mocha && npm run typescript", + "typescript": "tsc --project ./test/type/tsconfig.json" + }, + "version": "1.5.0" +} diff --git a/node_modules/depd/History.md b/node_modules/depd/History.md new file mode 100644 index 00000000..507ecb8d --- /dev/null +++ b/node_modules/depd/History.md @@ -0,0 +1,96 @@ +1.1.2 / 2018-01-11 +================== + + * perf: remove argument reassignment + * Support Node.js 0.6 to 9.x + +1.1.1 / 2017-07-27 +================== + + * Remove unnecessary `Buffer` loading + * Support Node.js 0.6 to 8.x + +1.1.0 / 2015-09-14 +================== + + * Enable strict mode in more places + * Support io.js 3.x + * Support io.js 2.x + * Support web browser loading + - Requires bundler like Browserify or webpack + +1.0.1 / 2015-04-07 +================== + + * Fix `TypeError`s when under `'use strict'` code + * Fix useless type name on auto-generated messages + * Support io.js 1.x + * Support Node.js 0.12 + +1.0.0 / 2014-09-17 +================== + + * No changes + +0.4.5 / 2014-09-09 +================== + + * Improve call speed to functions using the function wrapper + * Support Node.js 0.6 + +0.4.4 / 2014-07-27 +================== + + * Work-around v8 generating empty stack traces + +0.4.3 / 2014-07-26 +================== + + * Fix exception when global `Error.stackTraceLimit` is too low + +0.4.2 / 2014-07-19 +================== + + * Correct call site for wrapped functions and properties + +0.4.1 / 2014-07-19 +================== + + * Improve automatic message generation for function properties + +0.4.0 / 2014-07-19 +================== + + * Add `TRACE_DEPRECATION` environment variable + * Remove non-standard grey color from color output + * Support `--no-deprecation` argument + * Support `--trace-deprecation` argument + * Support `deprecate.property(fn, prop, message)` + +0.3.0 / 2014-06-16 +================== + + * Add `NO_DEPRECATION` environment variable + +0.2.0 / 2014-06-15 +================== + + * Add `deprecate.property(obj, prop, message)` + * Remove `supports-color` dependency for node.js 0.8 + +0.1.0 / 2014-06-15 +================== + + * Add `deprecate.function(fn, message)` + * Add `process.on('deprecation', fn)` emitter + * Automatically generate message when omitted from `deprecate()` + +0.0.1 / 2014-06-15 +================== + + * Fix warning for dynamic calls at singe call site + +0.0.0 / 2014-06-15 +================== + + * Initial implementation diff --git a/node_modules/depd/LICENSE b/node_modules/depd/LICENSE new file mode 100644 index 00000000..84441fbb --- /dev/null +++ b/node_modules/depd/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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/node_modules/depd/Readme.md b/node_modules/depd/Readme.md new file mode 100644 index 00000000..77906702 --- /dev/null +++ b/node_modules/depd/Readme.md @@ -0,0 +1,280 @@ +# depd + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-image]][node-url] +[![Linux Build][travis-image]][travis-url] +[![Windows Build][appveyor-image]][appveyor-url] +[![Coverage Status][coveralls-image]][coveralls-url] + +Deprecate all the things + +> With great modules comes great responsibility; mark things deprecated! + +## Install + +This module is installed directly using `npm`: + +```sh +$ npm install depd +``` + +This module can also be bundled with systems like +[Browserify](http://browserify.org/) or [webpack](https://webpack.github.io/), +though by default this module will alter it's API to no longer display or +track deprecations. + +## API + + + +```js +var deprecate = require('depd')('my-module') +``` + +This library allows you to display deprecation messages to your users. +This library goes above and beyond with deprecation warnings by +introspection of the call stack (but only the bits that it is interested +in). + +Instead of just warning on the first invocation of a deprecated +function and never again, this module will warn on the first invocation +of a deprecated function per unique call site, making it ideal to alert +users of all deprecated uses across the code base, rather than just +whatever happens to execute first. + +The deprecation warnings from this module also include the file and line +information for the call into the module that the deprecated function was +in. + +**NOTE** this library has a similar interface to the `debug` module, and +this module uses the calling file to get the boundary for the call stacks, +so you should always create a new `deprecate` object in each file and not +within some central file. + +### depd(namespace) + +Create a new deprecate function that uses the given namespace name in the +messages and will display the call site prior to the stack entering the +file this function was called from. It is highly suggested you use the +name of your module as the namespace. + +### deprecate(message) + +Call this function from deprecated code to display a deprecation message. +This message will appear once per unique caller site. Caller site is the +first call site in the stack in a different file from the caller of this +function. + +If the message is omitted, a message is generated for you based on the site +of the `deprecate()` call and will display the name of the function called, +similar to the name displayed in a stack trace. + +### deprecate.function(fn, message) + +Call this function to wrap a given function in a deprecation message on any +call to the function. An optional message can be supplied to provide a custom +message. + +### deprecate.property(obj, prop, message) + +Call this function to wrap a given property on object in a deprecation message +on any accessing or setting of the property. An optional message can be supplied +to provide a custom message. + +The method must be called on the object where the property belongs (not +inherited from the prototype). + +If the property is a data descriptor, it will be converted to an accessor +descriptor in order to display the deprecation message. + +### process.on('deprecation', fn) + +This module will allow easy capturing of deprecation errors by emitting the +errors as the type "deprecation" on the global `process`. If there are no +listeners for this type, the errors are written to STDERR as normal, but if +there are any listeners, nothing will be written to STDERR and instead only +emitted. From there, you can write the errors in a different format or to a +logging source. + +The error represents the deprecation and is emitted only once with the same +rules as writing to STDERR. The error has the following properties: + + - `message` - This is the message given by the library + - `name` - This is always `'DeprecationError'` + - `namespace` - This is the namespace the deprecation came from + - `stack` - This is the stack of the call to the deprecated thing + +Example `error.stack` output: + +``` +DeprecationError: my-cool-module deprecated oldfunction + at Object. ([eval]-wrapper:6:22) + at Module._compile (module.js:456:26) + at evalScript (node.js:532:25) + at startup (node.js:80:7) + at node.js:902:3 +``` + +### process.env.NO_DEPRECATION + +As a user of modules that are deprecated, the environment variable `NO_DEPRECATION` +is provided as a quick solution to silencing deprecation warnings from being +output. The format of this is similar to that of `DEBUG`: + +```sh +$ NO_DEPRECATION=my-module,othermod node app.js +``` + +This will suppress deprecations from being output for "my-module" and "othermod". +The value is a list of comma-separated namespaces. To suppress every warning +across all namespaces, use the value `*` for a namespace. + +Providing the argument `--no-deprecation` to the `node` executable will suppress +all deprecations (only available in Node.js 0.8 or higher). + +**NOTE** This will not suppress the deperecations given to any "deprecation" +event listeners, just the output to STDERR. + +### process.env.TRACE_DEPRECATION + +As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION` +is provided as a solution to getting more detailed location information in deprecation +warnings by including the entire stack trace. The format of this is the same as +`NO_DEPRECATION`: + +```sh +$ TRACE_DEPRECATION=my-module,othermod node app.js +``` + +This will include stack traces for deprecations being output for "my-module" and +"othermod". The value is a list of comma-separated namespaces. To trace every +warning across all namespaces, use the value `*` for a namespace. + +Providing the argument `--trace-deprecation` to the `node` executable will trace +all deprecations (only available in Node.js 0.8 or higher). + +**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`. + +## Display + +![message](files/message.png) + +When a user calls a function in your library that you mark deprecated, they +will see the following written to STDERR (in the given colors, similar colors +and layout to the `debug` module): + +``` +bright cyan bright yellow +| | reset cyan +| | | | +â–¼ â–¼ â–¼ â–¼ +my-cool-module deprecated oldfunction [eval]-wrapper:6:22 +â–² â–² â–² â–² +| | | | +namespace | | location of mycoolmod.oldfunction() call + | deprecation message + the word "deprecated" +``` + +If the user redirects their STDERR to a file or somewhere that does not support +colors, they see (similar layout to the `debug` module): + +``` +Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22 +â–² â–² â–² â–² â–² +| | | | | +timestamp of message namespace | | location of mycoolmod.oldfunction() call + | deprecation message + the word "deprecated" +``` + +## Examples + +### Deprecating all calls to a function + +This will display a deprecated message about "oldfunction" being deprecated +from "my-module" on STDERR. + +```js +var deprecate = require('depd')('my-cool-module') + +// message automatically derived from function name +// Object.oldfunction +exports.oldfunction = deprecate.function(function oldfunction () { + // all calls to function are deprecated +}) + +// specific message +exports.oldfunction = deprecate.function(function () { + // all calls to function are deprecated +}, 'oldfunction') +``` + +### Conditionally deprecating a function call + +This will display a deprecated message about "weirdfunction" being deprecated +from "my-module" on STDERR when called with less than 2 arguments. + +```js +var deprecate = require('depd')('my-cool-module') + +exports.weirdfunction = function () { + if (arguments.length < 2) { + // calls with 0 or 1 args are deprecated + deprecate('weirdfunction args < 2') + } +} +``` + +When calling `deprecate` as a function, the warning is counted per call site +within your own module, so you can display different deprecations depending +on different situations and the users will still get all the warnings: + +```js +var deprecate = require('depd')('my-cool-module') + +exports.weirdfunction = function () { + if (arguments.length < 2) { + // calls with 0 or 1 args are deprecated + deprecate('weirdfunction args < 2') + } else if (typeof arguments[0] !== 'string') { + // calls with non-string first argument are deprecated + deprecate('weirdfunction non-string first arg') + } +} +``` + +### Deprecating property access + +This will display a deprecated message about "oldprop" being deprecated +from "my-module" on STDERR when accessed. A deprecation will be displayed +when setting the value and when getting the value. + +```js +var deprecate = require('depd')('my-cool-module') + +exports.oldprop = 'something' + +// message automatically derives from property name +deprecate.property(exports, 'oldprop') + +// explicit message +deprecate.property(exports, 'oldprop', 'oldprop >= 0.10') +``` + +## License + +[MIT](LICENSE) + +[npm-version-image]: https://img.shields.io/npm/v/depd.svg +[npm-downloads-image]: https://img.shields.io/npm/dm/depd.svg +[npm-url]: https://npmjs.org/package/depd +[travis-image]: https://img.shields.io/travis/dougwilson/nodejs-depd/master.svg?label=linux +[travis-url]: https://travis-ci.org/dougwilson/nodejs-depd +[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/nodejs-depd/master.svg?label=windows +[appveyor-url]: https://ci.appveyor.com/project/dougwilson/nodejs-depd +[coveralls-image]: https://img.shields.io/coveralls/dougwilson/nodejs-depd/master.svg +[coveralls-url]: https://coveralls.io/r/dougwilson/nodejs-depd?branch=master +[node-image]: https://img.shields.io/node/v/depd.svg +[node-url]: https://nodejs.org/en/download/ diff --git a/node_modules/depd/index.js b/node_modules/depd/index.js new file mode 100644 index 00000000..d758d3c8 --- /dev/null +++ b/node_modules/depd/index.js @@ -0,0 +1,522 @@ +/*! + * depd + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var callSiteToString = require('./lib/compat').callSiteToString +var eventListenerCount = require('./lib/compat').eventListenerCount +var relative = require('path').relative + +/** + * Module exports. + */ + +module.exports = depd + +/** + * Get the path to base files on. + */ + +var basePath = process.cwd() + +/** + * Determine if namespace is contained in the string. + */ + +function containsNamespace (str, namespace) { + var vals = str.split(/[ ,]+/) + var ns = String(namespace).toLowerCase() + + for (var i = 0; i < vals.length; i++) { + var val = vals[i] + + // namespace contained + if (val && (val === '*' || val.toLowerCase() === ns)) { + return true + } + } + + return false +} + +/** + * Convert a data descriptor to accessor descriptor. + */ + +function convertDataDescriptorToAccessor (obj, prop, message) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop) + var value = descriptor.value + + descriptor.get = function getter () { return value } + + if (descriptor.writable) { + descriptor.set = function setter (val) { return (value = val) } + } + + delete descriptor.value + delete descriptor.writable + + Object.defineProperty(obj, prop, descriptor) + + return descriptor +} + +/** + * Create arguments string to keep arity. + */ + +function createArgumentsString (arity) { + var str = '' + + for (var i = 0; i < arity; i++) { + str += ', arg' + i + } + + return str.substr(2) +} + +/** + * Create stack string from stack. + */ + +function createStackString (stack) { + var str = this.name + ': ' + this.namespace + + if (this.message) { + str += ' deprecated ' + this.message + } + + for (var i = 0; i < stack.length; i++) { + str += '\n at ' + callSiteToString(stack[i]) + } + + return str +} + +/** + * Create deprecate for namespace in caller. + */ + +function depd (namespace) { + if (!namespace) { + throw new TypeError('argument namespace is required') + } + + var stack = getStack() + var site = callSiteLocation(stack[1]) + var file = site[0] + + function deprecate (message) { + // call to self as log + log.call(deprecate, message) + } + + deprecate._file = file + deprecate._ignored = isignored(namespace) + deprecate._namespace = namespace + deprecate._traced = istraced(namespace) + deprecate._warned = Object.create(null) + + deprecate.function = wrapfunction + deprecate.property = wrapproperty + + return deprecate +} + +/** + * Determine if namespace is ignored. + */ + +function isignored (namespace) { + /* istanbul ignore next: tested in a child processs */ + if (process.noDeprecation) { + // --no-deprecation support + return true + } + + var str = process.env.NO_DEPRECATION || '' + + // namespace ignored + return containsNamespace(str, namespace) +} + +/** + * Determine if namespace is traced. + */ + +function istraced (namespace) { + /* istanbul ignore next: tested in a child processs */ + if (process.traceDeprecation) { + // --trace-deprecation support + return true + } + + var str = process.env.TRACE_DEPRECATION || '' + + // namespace traced + return containsNamespace(str, namespace) +} + +/** + * Display deprecation message. + */ + +function log (message, site) { + var haslisteners = eventListenerCount(process, 'deprecation') !== 0 + + // abort early if no destination + if (!haslisteners && this._ignored) { + return + } + + var caller + var callFile + var callSite + var depSite + var i = 0 + var seen = false + var stack = getStack() + var file = this._file + + if (site) { + // provided site + depSite = site + callSite = callSiteLocation(stack[1]) + callSite.name = depSite.name + file = callSite[0] + } else { + // get call site + i = 2 + depSite = callSiteLocation(stack[i]) + callSite = depSite + } + + // get caller of deprecated thing in relation to file + for (; i < stack.length; i++) { + caller = callSiteLocation(stack[i]) + callFile = caller[0] + + if (callFile === file) { + seen = true + } else if (callFile === this._file) { + file = this._file + } else if (seen) { + break + } + } + + var key = caller + ? depSite.join(':') + '__' + caller.join(':') + : undefined + + if (key !== undefined && key in this._warned) { + // already warned + return + } + + this._warned[key] = true + + // generate automatic message from call site + var msg = message + if (!msg) { + msg = callSite === depSite || !callSite.name + ? defaultMessage(depSite) + : defaultMessage(callSite) + } + + // emit deprecation if listeners exist + if (haslisteners) { + var err = DeprecationError(this._namespace, msg, stack.slice(i)) + process.emit('deprecation', err) + return + } + + // format and write message + var format = process.stderr.isTTY + ? formatColor + : formatPlain + var output = format.call(this, msg, caller, stack.slice(i)) + process.stderr.write(output + '\n', 'utf8') +} + +/** + * Get call site location as array. + */ + +function callSiteLocation (callSite) { + var file = callSite.getFileName() || '' + var line = callSite.getLineNumber() + var colm = callSite.getColumnNumber() + + if (callSite.isEval()) { + file = callSite.getEvalOrigin() + ', ' + file + } + + var site = [file, line, colm] + + site.callSite = callSite + site.name = callSite.getFunctionName() + + return site +} + +/** + * Generate a default message from the site. + */ + +function defaultMessage (site) { + var callSite = site.callSite + var funcName = site.name + + // make useful anonymous name + if (!funcName) { + funcName = '' + } + + var context = callSite.getThis() + var typeName = context && callSite.getTypeName() + + // ignore useless type name + if (typeName === 'Object') { + typeName = undefined + } + + // make useful type name + if (typeName === 'Function') { + typeName = context.name || typeName + } + + return typeName && callSite.getMethodName() + ? typeName + '.' + funcName + : funcName +} + +/** + * Format deprecation message without color. + */ + +function formatPlain (msg, caller, stack) { + var timestamp = new Date().toUTCString() + + var formatted = timestamp + + ' ' + this._namespace + + ' deprecated ' + msg + + // add stack trace + if (this._traced) { + for (var i = 0; i < stack.length; i++) { + formatted += '\n at ' + callSiteToString(stack[i]) + } + + return formatted + } + + if (caller) { + formatted += ' at ' + formatLocation(caller) + } + + return formatted +} + +/** + * Format deprecation message with color. + */ + +function formatColor (msg, caller, stack) { + var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' + // bold cyan + ' \x1b[33;1mdeprecated\x1b[22;39m' + // bold yellow + ' \x1b[0m' + msg + '\x1b[39m' // reset + + // add stack trace + if (this._traced) { + for (var i = 0; i < stack.length; i++) { + formatted += '\n \x1b[36mat ' + callSiteToString(stack[i]) + '\x1b[39m' // cyan + } + + return formatted + } + + if (caller) { + formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan + } + + return formatted +} + +/** + * Format call site location. + */ + +function formatLocation (callSite) { + return relative(basePath, callSite[0]) + + ':' + callSite[1] + + ':' + callSite[2] +} + +/** + * Get the stack as array of call sites. + */ + +function getStack () { + var limit = Error.stackTraceLimit + var obj = {} + var prep = Error.prepareStackTrace + + Error.prepareStackTrace = prepareObjectStackTrace + Error.stackTraceLimit = Math.max(10, limit) + + // capture the stack + Error.captureStackTrace(obj) + + // slice this function off the top + var stack = obj.stack.slice(1) + + Error.prepareStackTrace = prep + Error.stackTraceLimit = limit + + return stack +} + +/** + * Capture call site stack from v8. + */ + +function prepareObjectStackTrace (obj, stack) { + return stack +} + +/** + * Return a wrapped function in a deprecation message. + */ + +function wrapfunction (fn, message) { + if (typeof fn !== 'function') { + throw new TypeError('argument fn must be a function') + } + + var args = createArgumentsString(fn.length) + var deprecate = this // eslint-disable-line no-unused-vars + var stack = getStack() + var site = callSiteLocation(stack[1]) + + site.name = fn.name + + // eslint-disable-next-line no-eval + var deprecatedfn = eval('(function (' + args + ') {\n' + + '"use strict"\n' + + 'log.call(deprecate, message, site)\n' + + 'return fn.apply(this, arguments)\n' + + '})') + + return deprecatedfn +} + +/** + * Wrap property in a deprecation message. + */ + +function wrapproperty (obj, prop, message) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + throw new TypeError('argument obj must be object') + } + + var descriptor = Object.getOwnPropertyDescriptor(obj, prop) + + if (!descriptor) { + throw new TypeError('must call property on owner object') + } + + if (!descriptor.configurable) { + throw new TypeError('property must be configurable') + } + + var deprecate = this + var stack = getStack() + var site = callSiteLocation(stack[1]) + + // set site name + site.name = prop + + // convert data descriptor + if ('value' in descriptor) { + descriptor = convertDataDescriptorToAccessor(obj, prop, message) + } + + var get = descriptor.get + var set = descriptor.set + + // wrap getter + if (typeof get === 'function') { + descriptor.get = function getter () { + log.call(deprecate, message, site) + return get.apply(this, arguments) + } + } + + // wrap setter + if (typeof set === 'function') { + descriptor.set = function setter () { + log.call(deprecate, message, site) + return set.apply(this, arguments) + } + } + + Object.defineProperty(obj, prop, descriptor) +} + +/** + * Create DeprecationError for deprecation + */ + +function DeprecationError (namespace, message, stack) { + var error = new Error() + var stackString + + Object.defineProperty(error, 'constructor', { + value: DeprecationError + }) + + Object.defineProperty(error, 'message', { + configurable: true, + enumerable: false, + value: message, + writable: true + }) + + Object.defineProperty(error, 'name', { + enumerable: false, + configurable: true, + value: 'DeprecationError', + writable: true + }) + + Object.defineProperty(error, 'namespace', { + configurable: true, + enumerable: false, + value: namespace, + writable: true + }) + + Object.defineProperty(error, 'stack', { + configurable: true, + enumerable: false, + get: function () { + if (stackString !== undefined) { + return stackString + } + + // prepare stack trace + return (stackString = createStackString.call(this, stack)) + }, + set: function setter (val) { + stackString = val + } + }) + + return error +} diff --git a/node_modules/depd/lib/browser/index.js b/node_modules/depd/lib/browser/index.js new file mode 100644 index 00000000..6be45cc2 --- /dev/null +++ b/node_modules/depd/lib/browser/index.js @@ -0,0 +1,77 @@ +/*! + * depd + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = depd + +/** + * Create deprecate for namespace in caller. + */ + +function depd (namespace) { + if (!namespace) { + throw new TypeError('argument namespace is required') + } + + function deprecate (message) { + // no-op in browser + } + + deprecate._file = undefined + deprecate._ignored = true + deprecate._namespace = namespace + deprecate._traced = false + deprecate._warned = Object.create(null) + + deprecate.function = wrapfunction + deprecate.property = wrapproperty + + return deprecate +} + +/** + * Return a wrapped function in a deprecation message. + * + * This is a no-op version of the wrapper, which does nothing but call + * validation. + */ + +function wrapfunction (fn, message) { + if (typeof fn !== 'function') { + throw new TypeError('argument fn must be a function') + } + + return fn +} + +/** + * Wrap property in a deprecation message. + * + * This is a no-op version of the wrapper, which does nothing but call + * validation. + */ + +function wrapproperty (obj, prop, message) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + throw new TypeError('argument obj must be object') + } + + var descriptor = Object.getOwnPropertyDescriptor(obj, prop) + + if (!descriptor) { + throw new TypeError('must call property on owner object') + } + + if (!descriptor.configurable) { + throw new TypeError('property must be configurable') + } +} diff --git a/node_modules/depd/lib/compat/callsite-tostring.js b/node_modules/depd/lib/compat/callsite-tostring.js new file mode 100644 index 00000000..73186dc6 --- /dev/null +++ b/node_modules/depd/lib/compat/callsite-tostring.js @@ -0,0 +1,103 @@ +/*! + * depd + * Copyright(c) 2014 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + */ + +module.exports = callSiteToString + +/** + * Format a CallSite file location to a string. + */ + +function callSiteFileLocation (callSite) { + var fileName + var fileLocation = '' + + if (callSite.isNative()) { + fileLocation = 'native' + } else if (callSite.isEval()) { + fileName = callSite.getScriptNameOrSourceURL() + if (!fileName) { + fileLocation = callSite.getEvalOrigin() + } + } else { + fileName = callSite.getFileName() + } + + if (fileName) { + fileLocation += fileName + + var lineNumber = callSite.getLineNumber() + if (lineNumber != null) { + fileLocation += ':' + lineNumber + + var columnNumber = callSite.getColumnNumber() + if (columnNumber) { + fileLocation += ':' + columnNumber + } + } + } + + return fileLocation || 'unknown source' +} + +/** + * Format a CallSite to a string. + */ + +function callSiteToString (callSite) { + var addSuffix = true + var fileLocation = callSiteFileLocation(callSite) + var functionName = callSite.getFunctionName() + var isConstructor = callSite.isConstructor() + var isMethodCall = !(callSite.isToplevel() || isConstructor) + var line = '' + + if (isMethodCall) { + var methodName = callSite.getMethodName() + var typeName = getConstructorName(callSite) + + if (functionName) { + if (typeName && functionName.indexOf(typeName) !== 0) { + line += typeName + '.' + } + + line += functionName + + if (methodName && functionName.lastIndexOf('.' + methodName) !== functionName.length - methodName.length - 1) { + line += ' [as ' + methodName + ']' + } + } else { + line += typeName + '.' + (methodName || '') + } + } else if (isConstructor) { + line += 'new ' + (functionName || '') + } else if (functionName) { + line += functionName + } else { + addSuffix = false + line += fileLocation + } + + if (addSuffix) { + line += ' (' + fileLocation + ')' + } + + return line +} + +/** + * Get constructor name of reviver. + */ + +function getConstructorName (obj) { + var receiver = obj.receiver + return (receiver.constructor && receiver.constructor.name) || null +} diff --git a/node_modules/depd/lib/compat/event-listener-count.js b/node_modules/depd/lib/compat/event-listener-count.js new file mode 100644 index 00000000..3a8925d1 --- /dev/null +++ b/node_modules/depd/lib/compat/event-listener-count.js @@ -0,0 +1,22 @@ +/*! + * depd + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = eventListenerCount + +/** + * Get the count of listeners on an event emitter of a specific type. + */ + +function eventListenerCount (emitter, type) { + return emitter.listeners(type).length +} diff --git a/node_modules/depd/lib/compat/index.js b/node_modules/depd/lib/compat/index.js new file mode 100644 index 00000000..955b3336 --- /dev/null +++ b/node_modules/depd/lib/compat/index.js @@ -0,0 +1,79 @@ +/*! + * depd + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var EventEmitter = require('events').EventEmitter + +/** + * Module exports. + * @public + */ + +lazyProperty(module.exports, 'callSiteToString', function callSiteToString () { + var limit = Error.stackTraceLimit + var obj = {} + var prep = Error.prepareStackTrace + + function prepareObjectStackTrace (obj, stack) { + return stack + } + + Error.prepareStackTrace = prepareObjectStackTrace + Error.stackTraceLimit = 2 + + // capture the stack + Error.captureStackTrace(obj) + + // slice the stack + var stack = obj.stack.slice() + + Error.prepareStackTrace = prep + Error.stackTraceLimit = limit + + return stack[0].toString ? toString : require('./callsite-tostring') +}) + +lazyProperty(module.exports, 'eventListenerCount', function eventListenerCount () { + return EventEmitter.listenerCount || require('./event-listener-count') +}) + +/** + * Define a lazy property. + */ + +function lazyProperty (obj, prop, getter) { + function get () { + var val = getter() + + Object.defineProperty(obj, prop, { + configurable: true, + enumerable: true, + value: val + }) + + return val + } + + Object.defineProperty(obj, prop, { + configurable: true, + enumerable: true, + get: get + }) +} + +/** + * Call toString() on the obj + */ + +function toString (obj) { + return obj.toString() +} diff --git a/node_modules/depd/package.json b/node_modules/depd/package.json new file mode 100644 index 00000000..34b09003 --- /dev/null +++ b/node_modules/depd/package.json @@ -0,0 +1,79 @@ +{ + "_from": "depd@~1.1.2", + "_id": "depd@1.1.2", + "_inBundle": false, + "_integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "_location": "/depd", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "depd@~1.1.2", + "name": "depd", + "escapedName": "depd", + "rawSpec": "~1.1.2", + "saveSpec": null, + "fetchSpec": "~1.1.2" + }, + "_requiredBy": [ + "/express", + "/express/body-parser", + "/http-errors", + "/send" + ], + "_resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "_shasum": "9bcd52e14c097763e749b274c4346ed2e560b5a9", + "_spec": "depd@~1.1.2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + "browser": "lib/browser/index.js", + "bugs": { + "url": "https://github.com/dougwilson/nodejs-depd/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Deprecate all the things", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "3.19.0", + "eslint-config-standard": "7.1.0", + "eslint-plugin-markdown": "1.0.0-beta.7", + "eslint-plugin-promise": "3.6.0", + "eslint-plugin-standard": "3.0.1", + "istanbul": "0.4.5", + "mocha": "~1.21.5" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "lib/", + "History.md", + "LICENSE", + "index.js", + "Readme.md" + ], + "homepage": "https://github.com/dougwilson/nodejs-depd#readme", + "keywords": [ + "deprecate", + "deprecated" + ], + "license": "MIT", + "name": "depd", + "repository": { + "type": "git", + "url": "git+https://github.com/dougwilson/nodejs-depd.git" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail test/", + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --no-exit test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/" + }, + "version": "1.1.2" +} diff --git a/node_modules/destroy/LICENSE b/node_modules/destroy/LICENSE new file mode 100644 index 00000000..a7ae8ee9 --- /dev/null +++ b/node_modules/destroy/LICENSE @@ -0,0 +1,22 @@ + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + +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/node_modules/destroy/README.md b/node_modules/destroy/README.md new file mode 100644 index 00000000..6474bc3c --- /dev/null +++ b/node_modules/destroy/README.md @@ -0,0 +1,60 @@ +# Destroy + +[![NPM version][npm-image]][npm-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] +[![Gittip][gittip-image]][gittip-url] + +Destroy a stream. + +This module is meant to ensure a stream gets destroyed, handling different APIs +and Node.js bugs. + +## API + +```js +var destroy = require('destroy') +``` + +### destroy(stream) + +Destroy the given stream. In most cases, this is identical to a simple +`stream.destroy()` call. The rules are as follows for a given stream: + + 1. If the `stream` is an instance of `ReadStream`, then call `stream.destroy()` + and add a listener to the `open` event to call `stream.close()` if it is + fired. This is for a Node.js bug that will leak a file descriptor if + `.destroy()` is called before `open`. + 2. If the `stream` is not an instance of `Stream`, then nothing happens. + 3. If the `stream` has a `.destroy()` method, then call it. + +The function returns the `stream` passed in as the argument. + +## Example + +```js +var destroy = require('destroy') + +var fs = require('fs') +var stream = fs.createReadStream('package.json') + +// ... and later +destroy(stream) +``` + +[npm-image]: https://img.shields.io/npm/v/destroy.svg?style=flat-square +[npm-url]: https://npmjs.org/package/destroy +[github-tag]: http://img.shields.io/github/tag/stream-utils/destroy.svg?style=flat-square +[github-url]: https://github.com/stream-utils/destroy/tags +[travis-image]: https://img.shields.io/travis/stream-utils/destroy.svg?style=flat-square +[travis-url]: https://travis-ci.org/stream-utils/destroy +[coveralls-image]: https://img.shields.io/coveralls/stream-utils/destroy.svg?style=flat-square +[coveralls-url]: https://coveralls.io/r/stream-utils/destroy?branch=master +[license-image]: http://img.shields.io/npm/l/destroy.svg?style=flat-square +[license-url]: LICENSE.md +[downloads-image]: http://img.shields.io/npm/dm/destroy.svg?style=flat-square +[downloads-url]: https://npmjs.org/package/destroy +[gittip-image]: https://img.shields.io/gittip/jonathanong.svg?style=flat-square +[gittip-url]: https://www.gittip.com/jonathanong/ diff --git a/node_modules/destroy/index.js b/node_modules/destroy/index.js new file mode 100644 index 00000000..6da2d26e --- /dev/null +++ b/node_modules/destroy/index.js @@ -0,0 +1,75 @@ +/*! + * destroy + * Copyright(c) 2014 Jonathan Ong + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var ReadStream = require('fs').ReadStream +var Stream = require('stream') + +/** + * Module exports. + * @public + */ + +module.exports = destroy + +/** + * Destroy a stream. + * + * @param {object} stream + * @public + */ + +function destroy(stream) { + if (stream instanceof ReadStream) { + return destroyReadStream(stream) + } + + if (!(stream instanceof Stream)) { + return stream + } + + if (typeof stream.destroy === 'function') { + stream.destroy() + } + + return stream +} + +/** + * Destroy a ReadStream. + * + * @param {object} stream + * @private + */ + +function destroyReadStream(stream) { + stream.destroy() + + if (typeof stream.close === 'function') { + // node.js core bug work-around + stream.on('open', onOpenClose) + } + + return stream +} + +/** + * On open handler to close stream. + * @private + */ + +function onOpenClose() { + if (typeof this.fd === 'number') { + // actually close down the fd + this.close() + } +} diff --git a/node_modules/destroy/package.json b/node_modules/destroy/package.json new file mode 100644 index 00000000..5b2a423e --- /dev/null +++ b/node_modules/destroy/package.json @@ -0,0 +1,71 @@ +{ + "_from": "destroy@~1.0.4", + "_id": "destroy@1.0.4", + "_inBundle": false, + "_integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "_location": "/destroy", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "destroy@~1.0.4", + "name": "destroy", + "escapedName": "destroy", + "rawSpec": "~1.0.4", + "saveSpec": null, + "fetchSpec": "~1.0.4" + }, + "_requiredBy": [ + "/send" + ], + "_resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "_shasum": "978857442c44749e4206613e37946205826abd80", + "_spec": "destroy@~1.0.4", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\send", + "author": { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + }, + "bugs": { + "url": "https://github.com/stream-utils/destroy/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + } + ], + "deprecated": false, + "description": "destroy a stream if possible", + "devDependencies": { + "istanbul": "0.4.2", + "mocha": "2.3.4" + }, + "files": [ + "index.js", + "LICENSE" + ], + "homepage": "https://github.com/stream-utils/destroy#readme", + "keywords": [ + "stream", + "streams", + "destroy", + "cleanup", + "leak", + "fd" + ], + "license": "MIT", + "name": "destroy", + "repository": { + "type": "git", + "url": "git+https://github.com/stream-utils/destroy.git" + }, + "scripts": { + "test": "mocha --reporter spec", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" + }, + "version": "1.0.4" +} diff --git a/node_modules/ee-first/LICENSE b/node_modules/ee-first/LICENSE new file mode 100644 index 00000000..a7ae8ee9 --- /dev/null +++ b/node_modules/ee-first/LICENSE @@ -0,0 +1,22 @@ + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + +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/node_modules/ee-first/README.md b/node_modules/ee-first/README.md new file mode 100644 index 00000000..cbd2478b --- /dev/null +++ b/node_modules/ee-first/README.md @@ -0,0 +1,80 @@ +# EE First + +[![NPM version][npm-image]][npm-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] +[![Gittip][gittip-image]][gittip-url] + +Get the first event in a set of event emitters and event pairs, +then clean up after itself. + +## Install + +```sh +$ npm install ee-first +``` + +## API + +```js +var first = require('ee-first') +``` + +### first(arr, listener) + +Invoke `listener` on the first event from the list specified in `arr`. `arr` is +an array of arrays, with each array in the format `[ee, ...event]`. `listener` +will be called only once, the first time any of the given events are emitted. If +`error` is one of the listened events, then if that fires first, the `listener` +will be given the `err` argument. + +The `listener` is invoked as `listener(err, ee, event, args)`, where `err` is the +first argument emitted from an `error` event, if applicable; `ee` is the event +emitter that fired; `event` is the string event name that fired; and `args` is an +array of the arguments that were emitted on the event. + +```js +var ee1 = new EventEmitter() +var ee2 = new EventEmitter() + +first([ + [ee1, 'close', 'end', 'error'], + [ee2, 'error'] +], function (err, ee, event, args) { + // listener invoked +}) +``` + +#### .cancel() + +The group of listeners can be cancelled before being invoked and have all the event +listeners removed from the underlying event emitters. + +```js +var thunk = first([ + [ee1, 'close', 'end', 'error'], + [ee2, 'error'] +], function (err, ee, event, args) { + // listener invoked +}) + +// cancel and clean up +thunk.cancel() +``` + +[npm-image]: https://img.shields.io/npm/v/ee-first.svg?style=flat-square +[npm-url]: https://npmjs.org/package/ee-first +[github-tag]: http://img.shields.io/github/tag/jonathanong/ee-first.svg?style=flat-square +[github-url]: https://github.com/jonathanong/ee-first/tags +[travis-image]: https://img.shields.io/travis/jonathanong/ee-first.svg?style=flat-square +[travis-url]: https://travis-ci.org/jonathanong/ee-first +[coveralls-image]: https://img.shields.io/coveralls/jonathanong/ee-first.svg?style=flat-square +[coveralls-url]: https://coveralls.io/r/jonathanong/ee-first?branch=master +[license-image]: http://img.shields.io/npm/l/ee-first.svg?style=flat-square +[license-url]: LICENSE.md +[downloads-image]: http://img.shields.io/npm/dm/ee-first.svg?style=flat-square +[downloads-url]: https://npmjs.org/package/ee-first +[gittip-image]: https://img.shields.io/gittip/jonathanong.svg?style=flat-square +[gittip-url]: https://www.gittip.com/jonathanong/ diff --git a/node_modules/ee-first/index.js b/node_modules/ee-first/index.js new file mode 100644 index 00000000..501287cd --- /dev/null +++ b/node_modules/ee-first/index.js @@ -0,0 +1,95 @@ +/*! + * ee-first + * Copyright(c) 2014 Jonathan Ong + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = first + +/** + * Get the first event in a set of event emitters and event pairs. + * + * @param {array} stuff + * @param {function} done + * @public + */ + +function first(stuff, done) { + if (!Array.isArray(stuff)) + throw new TypeError('arg must be an array of [ee, events...] arrays') + + var cleanups = [] + + for (var i = 0; i < stuff.length; i++) { + var arr = stuff[i] + + if (!Array.isArray(arr) || arr.length < 2) + throw new TypeError('each array member must be [ee, events...]') + + var ee = arr[0] + + for (var j = 1; j < arr.length; j++) { + var event = arr[j] + var fn = listener(event, callback) + + // listen to the event + ee.on(event, fn) + // push this listener to the list of cleanups + cleanups.push({ + ee: ee, + event: event, + fn: fn, + }) + } + } + + function callback() { + cleanup() + done.apply(null, arguments) + } + + function cleanup() { + var x + for (var i = 0; i < cleanups.length; i++) { + x = cleanups[i] + x.ee.removeListener(x.event, x.fn) + } + } + + function thunk(fn) { + done = fn + } + + thunk.cancel = cleanup + + return thunk +} + +/** + * Create the event listener. + * @private + */ + +function listener(event, done) { + return function onevent(arg1) { + var args = new Array(arguments.length) + var ee = this + var err = event === 'error' + ? arg1 + : null + + // copy args to prevent arguments escaping scope + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + + done(err, ee, event, args) + } +} diff --git a/node_modules/ee-first/package.json b/node_modules/ee-first/package.json new file mode 100644 index 00000000..f8ed393a --- /dev/null +++ b/node_modules/ee-first/package.json @@ -0,0 +1,63 @@ +{ + "_from": "ee-first@1.1.1", + "_id": "ee-first@1.1.1", + "_inBundle": false, + "_integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "_location": "/ee-first", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ee-first@1.1.1", + "name": "ee-first", + "escapedName": "ee-first", + "rawSpec": "1.1.1", + "saveSpec": null, + "fetchSpec": "1.1.1" + }, + "_requiredBy": [ + "/on-finished" + ], + "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "_shasum": "590c61156b0ae2f4f0255732a158b266bc56b21d", + "_spec": "ee-first@1.1.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\on-finished", + "author": { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + }, + "bugs": { + "url": "https://github.com/jonathanong/ee-first/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + } + ], + "deprecated": false, + "description": "return the first event in a set of ee/event pairs", + "devDependencies": { + "istanbul": "0.3.9", + "mocha": "2.2.5" + }, + "files": [ + "index.js", + "LICENSE" + ], + "homepage": "https://github.com/jonathanong/ee-first#readme", + "license": "MIT", + "name": "ee-first", + "repository": { + "type": "git", + "url": "git+https://github.com/jonathanong/ee-first.git" + }, + "scripts": { + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "1.1.1" +} diff --git a/node_modules/encodeurl/HISTORY.md b/node_modules/encodeurl/HISTORY.md new file mode 100644 index 00000000..41313b2b --- /dev/null +++ b/node_modules/encodeurl/HISTORY.md @@ -0,0 +1,14 @@ +1.0.2 / 2018-01-21 +================== + + * Fix encoding `%` as last character + +1.0.1 / 2016-06-09 +================== + + * Fix encoding unpaired surrogates at start/end of string + +1.0.0 / 2016-06-08 +================== + + * Initial release diff --git a/node_modules/encodeurl/LICENSE b/node_modules/encodeurl/LICENSE new file mode 100644 index 00000000..8812229b --- /dev/null +++ b/node_modules/encodeurl/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2016 Douglas Christopher Wilson + +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/node_modules/encodeurl/README.md b/node_modules/encodeurl/README.md new file mode 100644 index 00000000..127c5a0d --- /dev/null +++ b/node_modules/encodeurl/README.md @@ -0,0 +1,128 @@ +# encodeurl + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Encode a URL to a percent-encoded form, excluding already-encoded sequences + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install encodeurl +``` + +## API + +```js +var encodeUrl = require('encodeurl') +``` + +### encodeUrl(url) + +Encode a URL to a percent-encoded form, excluding already-encoded sequences. + +This function will take an already-encoded URL and encode all the non-URL +code points (as UTF-8 byte sequences). This function will not encode the +"%" character unless it is not part of a valid sequence (`%20` will be +left as-is, but `%foo` will be encoded as `%25foo`). + +This encode is meant to be "safe" and does not throw errors. It will try as +hard as it can to properly encode the given URL, including replacing any raw, +unpaired surrogate pairs with the Unicode replacement character prior to +encoding. + +This function is _similar_ to the intrinsic function `encodeURI`, except it +will not encode the `%` character if that is part of a valid sequence, will +not encode `[` and `]` (for IPv6 hostnames) and will replace raw, unpaired +surrogate pairs with the Unicode replacement character (instead of throwing). + +## Examples + +### Encode a URL containing user-controled data + +```js +var encodeUrl = require('encodeurl') +var escapeHtml = require('escape-html') + +http.createServer(function onRequest (req, res) { + // get encoded form of inbound url + var url = encodeUrl(req.url) + + // create html message + var body = '

Location ' + escapeHtml(url) + ' not found

' + + // send a 404 + res.statusCode = 404 + res.setHeader('Content-Type', 'text/html; charset=UTF-8') + res.setHeader('Content-Length', String(Buffer.byteLength(body, 'utf-8'))) + res.end(body, 'utf-8') +}) +``` + +### Encode a URL for use in a header field + +```js +var encodeUrl = require('encodeurl') +var escapeHtml = require('escape-html') +var url = require('url') + +http.createServer(function onRequest (req, res) { + // parse inbound url + var href = url.parse(req) + + // set new host for redirect + href.host = 'localhost' + href.protocol = 'https:' + href.slashes = true + + // create location header + var location = encodeUrl(url.format(href)) + + // create html message + var body = '

Redirecting to new site: ' + escapeHtml(location) + '

' + + // send a 301 + res.statusCode = 301 + res.setHeader('Content-Type', 'text/html; charset=UTF-8') + res.setHeader('Content-Length', String(Buffer.byteLength(body, 'utf-8'))) + res.setHeader('Location', location) + res.end(body, 'utf-8') +}) +``` + +## Testing + +```sh +$ npm test +$ npm run lint +``` + +## References + +- [RFC 3986: Uniform Resource Identifier (URI): Generic Syntax][rfc-3986] +- [WHATWG URL Living Standard][whatwg-url] + +[rfc-3986]: https://tools.ietf.org/html/rfc3986 +[whatwg-url]: https://url.spec.whatwg.org/ + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/encodeurl.svg +[npm-url]: https://npmjs.org/package/encodeurl +[node-version-image]: https://img.shields.io/node/v/encodeurl.svg +[node-version-url]: https://nodejs.org/en/download +[travis-image]: https://img.shields.io/travis/pillarjs/encodeurl.svg +[travis-url]: https://travis-ci.org/pillarjs/encodeurl +[coveralls-image]: https://img.shields.io/coveralls/pillarjs/encodeurl.svg +[coveralls-url]: https://coveralls.io/r/pillarjs/encodeurl?branch=master +[downloads-image]: https://img.shields.io/npm/dm/encodeurl.svg +[downloads-url]: https://npmjs.org/package/encodeurl diff --git a/node_modules/encodeurl/index.js b/node_modules/encodeurl/index.js new file mode 100644 index 00000000..fc4906c6 --- /dev/null +++ b/node_modules/encodeurl/index.js @@ -0,0 +1,60 @@ +/*! + * encodeurl + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = encodeUrl + +/** + * RegExp to match non-URL code points, *after* encoding (i.e. not including "%") + * and including invalid escape sequences. + * @private + */ + +var ENCODE_CHARS_REGEXP = /(?:[^\x21\x25\x26-\x3B\x3D\x3F-\x5B\x5D\x5F\x61-\x7A\x7E]|%(?:[^0-9A-Fa-f]|[0-9A-Fa-f][^0-9A-Fa-f]|$))+/g + +/** + * RegExp to match unmatched surrogate pair. + * @private + */ + +var UNMATCHED_SURROGATE_PAIR_REGEXP = /(^|[^\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF]([^\uDC00-\uDFFF]|$)/g + +/** + * String to replace unmatched surrogate pair with. + * @private + */ + +var UNMATCHED_SURROGATE_PAIR_REPLACE = '$1\uFFFD$2' + +/** + * Encode a URL to a percent-encoded form, excluding already-encoded sequences. + * + * This function will take an already-encoded URL and encode all the non-URL + * code points. This function will not encode the "%" character unless it is + * not part of a valid sequence (`%20` will be left as-is, but `%foo` will + * be encoded as `%25foo`). + * + * This encode is meant to be "safe" and does not throw errors. It will try as + * hard as it can to properly encode the given URL, including replacing any raw, + * unpaired surrogate pairs with the Unicode replacement character prior to + * encoding. + * + * @param {string} url + * @return {string} + * @public + */ + +function encodeUrl (url) { + return String(url) + .replace(UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE) + .replace(ENCODE_CHARS_REGEXP, encodeURI) +} diff --git a/node_modules/encodeurl/package.json b/node_modules/encodeurl/package.json new file mode 100644 index 00000000..9735639e --- /dev/null +++ b/node_modules/encodeurl/package.json @@ -0,0 +1,78 @@ +{ + "_from": "encodeurl@~1.0.2", + "_id": "encodeurl@1.0.2", + "_inBundle": false, + "_integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "_location": "/encodeurl", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "encodeurl@~1.0.2", + "name": "encodeurl", + "escapedName": "encodeurl", + "rawSpec": "~1.0.2", + "saveSpec": null, + "fetchSpec": "~1.0.2" + }, + "_requiredBy": [ + "/express", + "/finalhandler", + "/send", + "/serve-static" + ], + "_resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "_shasum": "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59", + "_spec": "encodeurl@~1.0.2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "bugs": { + "url": "https://github.com/pillarjs/encodeurl/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + } + ], + "deprecated": false, + "description": "Encode a URL to a percent-encoded form, excluding already-encoded sequences", + "devDependencies": { + "eslint": "3.19.0", + "eslint-config-standard": "10.2.1", + "eslint-plugin-import": "2.8.0", + "eslint-plugin-node": "5.2.1", + "eslint-plugin-promise": "3.6.0", + "eslint-plugin-standard": "3.0.1", + "istanbul": "0.4.5", + "mocha": "2.5.3" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "README.md", + "index.js" + ], + "homepage": "https://github.com/pillarjs/encodeurl#readme", + "keywords": [ + "encode", + "encodeurl", + "url" + ], + "license": "MIT", + "name": "encodeurl", + "repository": { + "type": "git", + "url": "git+https://github.com/pillarjs/encodeurl.git" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "1.0.2" +} diff --git a/node_modules/escape-html/LICENSE b/node_modules/escape-html/LICENSE new file mode 100644 index 00000000..2e70de97 --- /dev/null +++ b/node_modules/escape-html/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2012-2013 TJ Holowaychuk +Copyright (c) 2015 Andreas Lubbe +Copyright (c) 2015 Tiancheng "Timothy" Gu + +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/node_modules/escape-html/Readme.md b/node_modules/escape-html/Readme.md new file mode 100644 index 00000000..653d9eaa --- /dev/null +++ b/node_modules/escape-html/Readme.md @@ -0,0 +1,43 @@ + +# escape-html + + Escape string for use in HTML + +## Example + +```js +var escape = require('escape-html'); +var html = escape('foo & bar'); +// -> foo & bar +``` + +## Benchmark + +``` +$ npm run-script bench + +> escape-html@1.0.3 bench nodejs-escape-html +> node benchmark/index.js + + + http_parser@1.0 + node@0.10.33 + v8@3.14.5.9 + ares@1.9.0-DEV + uv@0.10.29 + zlib@1.2.3 + modules@11 + openssl@1.0.1j + + 1 test completed. + 2 tests completed. + 3 tests completed. + + no special characters x 19,435,271 ops/sec ±0.85% (187 runs sampled) + single special character x 6,132,421 ops/sec ±0.67% (194 runs sampled) + many special characters x 3,175,826 ops/sec ±0.65% (193 runs sampled) +``` + +## License + + MIT \ No newline at end of file diff --git a/node_modules/escape-html/index.js b/node_modules/escape-html/index.js new file mode 100644 index 00000000..bf9e226f --- /dev/null +++ b/node_modules/escape-html/index.js @@ -0,0 +1,78 @@ +/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */ + +'use strict'; + +/** + * Module variables. + * @private + */ + +var matchHtmlRegExp = /["'&<>]/; + +/** + * Module exports. + * @public + */ + +module.exports = escapeHtml; + +/** + * Escape special characters in the given string of html. + * + * @param {string} string The string to escape for inserting into HTML + * @return {string} + * @public + */ + +function escapeHtml(string) { + var str = '' + string; + var match = matchHtmlRegExp.exec(str); + + if (!match) { + return str; + } + + var escape; + var html = ''; + var index = 0; + var lastIndex = 0; + + for (index = match.index; index < str.length; index++) { + switch (str.charCodeAt(index)) { + case 34: // " + escape = '"'; + break; + case 38: // & + escape = '&'; + break; + case 39: // ' + escape = '''; + break; + case 60: // < + escape = '<'; + break; + case 62: // > + escape = '>'; + break; + default: + continue; + } + + if (lastIndex !== index) { + html += str.substring(lastIndex, index); + } + + lastIndex = index + 1; + html += escape; + } + + return lastIndex !== index + ? html + str.substring(lastIndex, index) + : html; +} diff --git a/node_modules/escape-html/package.json b/node_modules/escape-html/package.json new file mode 100644 index 00000000..eeaa0048 --- /dev/null +++ b/node_modules/escape-html/package.json @@ -0,0 +1,59 @@ +{ + "_from": "escape-html@~1.0.3", + "_id": "escape-html@1.0.3", + "_inBundle": false, + "_integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "_location": "/escape-html", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "escape-html@~1.0.3", + "name": "escape-html", + "escapedName": "escape-html", + "rawSpec": "~1.0.3", + "saveSpec": null, + "fetchSpec": "~1.0.3" + }, + "_requiredBy": [ + "/express", + "/finalhandler", + "/send", + "/serve-static" + ], + "_resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "_shasum": "0258eae4d3d0c0974de1c169188ef0051d1d1988", + "_spec": "escape-html@~1.0.3", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "bugs": { + "url": "https://github.com/component/escape-html/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Escape string for use in HTML", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "1.0.0" + }, + "files": [ + "LICENSE", + "Readme.md", + "index.js" + ], + "homepage": "https://github.com/component/escape-html#readme", + "keywords": [ + "escape", + "html", + "utility" + ], + "license": "MIT", + "name": "escape-html", + "repository": { + "type": "git", + "url": "git+https://github.com/component/escape-html.git" + }, + "scripts": { + "bench": "node benchmark/index.js" + }, + "version": "1.0.3" +} diff --git a/node_modules/etag/HISTORY.md b/node_modules/etag/HISTORY.md new file mode 100644 index 00000000..222b293d --- /dev/null +++ b/node_modules/etag/HISTORY.md @@ -0,0 +1,83 @@ +1.8.1 / 2017-09-12 +================== + + * perf: replace regular expression with substring + +1.8.0 / 2017-02-18 +================== + + * Use SHA1 instead of MD5 for ETag hashing + - Improves performance for larger entities + - Works with FIPS 140-2 OpenSSL configuration + +1.7.0 / 2015-06-08 +================== + + * Always include entity length in ETags for hash length extensions + * Generate non-Stats ETags using MD5 only (no longer CRC32) + * Improve stat performance by removing hashing + * Remove base64 padding in ETags to shorten + * Use MD5 instead of MD4 in weak ETags over 1KB + +1.6.0 / 2015-05-10 +================== + + * Improve support for JXcore + * Remove requirement of `atime` in the stats object + * Support "fake" stats objects in environments without `fs` + +1.5.1 / 2014-11-19 +================== + + * deps: crc@3.2.1 + - Minor fixes + +1.5.0 / 2014-10-14 +================== + + * Improve string performance + * Slightly improve speed for weak ETags over 1KB + +1.4.0 / 2014-09-21 +================== + + * Support "fake" stats objects + * Support Node.js 0.6 + +1.3.1 / 2014-09-14 +================== + + * Use the (new and improved) `crc` for crc32 + +1.3.0 / 2014-08-29 +================== + + * Default strings to strong ETags + * Improve speed for weak ETags over 1KB + +1.2.1 / 2014-08-29 +================== + + * Use the (much faster) `buffer-crc32` for crc32 + +1.2.0 / 2014-08-24 +================== + + * Add support for file stat objects + +1.1.0 / 2014-08-24 +================== + + * Add fast-path for empty entity + * Add weak ETag generation + * Shrink size of generated ETags + +1.0.1 / 2014-08-24 +================== + + * Fix behavior of string containing Unicode + +1.0.0 / 2014-05-18 +================== + + * Initial release diff --git a/node_modules/etag/LICENSE b/node_modules/etag/LICENSE new file mode 100644 index 00000000..cab251c2 --- /dev/null +++ b/node_modules/etag/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2016 Douglas Christopher Wilson + +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/node_modules/etag/README.md b/node_modules/etag/README.md new file mode 100644 index 00000000..09c2169e --- /dev/null +++ b/node_modules/etag/README.md @@ -0,0 +1,159 @@ +# etag + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Create simple HTTP ETags + +This module generates HTTP ETags (as defined in RFC 7232) for use in +HTTP responses. + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install etag +``` + +## API + + + +```js +var etag = require('etag') +``` + +### etag(entity, [options]) + +Generate a strong ETag for the given entity. This should be the complete +body of the entity. Strings, `Buffer`s, and `fs.Stats` are accepted. By +default, a strong ETag is generated except for `fs.Stats`, which will +generate a weak ETag (this can be overwritten by `options.weak`). + + + +```js +res.setHeader('ETag', etag(body)) +``` + +#### Options + +`etag` accepts these properties in the options object. + +##### weak + +Specifies if the generated ETag will include the weak validator mark (that +is, the leading `W/`). The actual entity tag is the same. The default value +is `false`, unless the `entity` is `fs.Stats`, in which case it is `true`. + +## Testing + +```sh +$ npm test +``` + +## Benchmark + +```bash +$ npm run-script bench + +> etag@1.8.1 bench nodejs-etag +> node benchmark/index.js + + http_parser@2.7.0 + node@6.11.1 + v8@5.1.281.103 + uv@1.11.0 + zlib@1.2.11 + ares@1.10.1-DEV + icu@58.2 + modules@48 + openssl@1.0.2k + +> node benchmark/body0-100b.js + + 100B body + + 4 tests completed. + + buffer - strong x 258,647 ops/sec ±1.07% (180 runs sampled) + buffer - weak x 263,812 ops/sec ±0.61% (184 runs sampled) + string - strong x 259,955 ops/sec ±1.19% (185 runs sampled) + string - weak x 264,356 ops/sec ±1.09% (184 runs sampled) + +> node benchmark/body1-1kb.js + + 1KB body + + 4 tests completed. + + buffer - strong x 189,018 ops/sec ±1.12% (182 runs sampled) + buffer - weak x 190,586 ops/sec ±0.81% (186 runs sampled) + string - strong x 144,272 ops/sec ±0.96% (188 runs sampled) + string - weak x 145,380 ops/sec ±1.43% (187 runs sampled) + +> node benchmark/body2-5kb.js + + 5KB body + + 4 tests completed. + + buffer - strong x 92,435 ops/sec ±0.42% (188 runs sampled) + buffer - weak x 92,373 ops/sec ±0.58% (189 runs sampled) + string - strong x 48,850 ops/sec ±0.56% (186 runs sampled) + string - weak x 49,380 ops/sec ±0.56% (190 runs sampled) + +> node benchmark/body3-10kb.js + + 10KB body + + 4 tests completed. + + buffer - strong x 55,989 ops/sec ±0.93% (188 runs sampled) + buffer - weak x 56,148 ops/sec ±0.55% (190 runs sampled) + string - strong x 27,345 ops/sec ±0.43% (188 runs sampled) + string - weak x 27,496 ops/sec ±0.45% (190 runs sampled) + +> node benchmark/body4-100kb.js + + 100KB body + + 4 tests completed. + + buffer - strong x 7,083 ops/sec ±0.22% (190 runs sampled) + buffer - weak x 7,115 ops/sec ±0.26% (191 runs sampled) + string - strong x 3,068 ops/sec ±0.34% (190 runs sampled) + string - weak x 3,096 ops/sec ±0.35% (190 runs sampled) + +> node benchmark/stats.js + + stat + + 4 tests completed. + + real - strong x 871,642 ops/sec ±0.34% (189 runs sampled) + real - weak x 867,613 ops/sec ±0.39% (190 runs sampled) + fake - strong x 401,051 ops/sec ±0.40% (189 runs sampled) + fake - weak x 400,100 ops/sec ±0.47% (188 runs sampled) +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/etag.svg +[npm-url]: https://npmjs.org/package/etag +[node-version-image]: https://img.shields.io/node/v/etag.svg +[node-version-url]: https://nodejs.org/en/download/ +[travis-image]: https://img.shields.io/travis/jshttp/etag/master.svg +[travis-url]: https://travis-ci.org/jshttp/etag +[coveralls-image]: https://img.shields.io/coveralls/jshttp/etag/master.svg +[coveralls-url]: https://coveralls.io/r/jshttp/etag?branch=master +[downloads-image]: https://img.shields.io/npm/dm/etag.svg +[downloads-url]: https://npmjs.org/package/etag diff --git a/node_modules/etag/index.js b/node_modules/etag/index.js new file mode 100644 index 00000000..2a585c91 --- /dev/null +++ b/node_modules/etag/index.js @@ -0,0 +1,131 @@ +/*! + * etag + * Copyright(c) 2014-2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = etag + +/** + * Module dependencies. + * @private + */ + +var crypto = require('crypto') +var Stats = require('fs').Stats + +/** + * Module variables. + * @private + */ + +var toString = Object.prototype.toString + +/** + * Generate an entity tag. + * + * @param {Buffer|string} entity + * @return {string} + * @private + */ + +function entitytag (entity) { + if (entity.length === 0) { + // fast-path empty + return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"' + } + + // compute hash of entity + var hash = crypto + .createHash('sha1') + .update(entity, 'utf8') + .digest('base64') + .substring(0, 27) + + // compute length of entity + var len = typeof entity === 'string' + ? Buffer.byteLength(entity, 'utf8') + : entity.length + + return '"' + len.toString(16) + '-' + hash + '"' +} + +/** + * Create a simple ETag. + * + * @param {string|Buffer|Stats} entity + * @param {object} [options] + * @param {boolean} [options.weak] + * @return {String} + * @public + */ + +function etag (entity, options) { + if (entity == null) { + throw new TypeError('argument entity is required') + } + + // support fs.Stats object + var isStats = isstats(entity) + var weak = options && typeof options.weak === 'boolean' + ? options.weak + : isStats + + // validate argument + if (!isStats && typeof entity !== 'string' && !Buffer.isBuffer(entity)) { + throw new TypeError('argument entity must be string, Buffer, or fs.Stats') + } + + // generate entity tag + var tag = isStats + ? stattag(entity) + : entitytag(entity) + + return weak + ? 'W/' + tag + : tag +} + +/** + * Determine if object is a Stats object. + * + * @param {object} obj + * @return {boolean} + * @api private + */ + +function isstats (obj) { + // genuine fs.Stats + if (typeof Stats === 'function' && obj instanceof Stats) { + return true + } + + // quack quack + return obj && typeof obj === 'object' && + 'ctime' in obj && toString.call(obj.ctime) === '[object Date]' && + 'mtime' in obj && toString.call(obj.mtime) === '[object Date]' && + 'ino' in obj && typeof obj.ino === 'number' && + 'size' in obj && typeof obj.size === 'number' +} + +/** + * Generate a tag for a stat. + * + * @param {object} stat + * @return {string} + * @private + */ + +function stattag (stat) { + var mtime = stat.mtime.getTime().toString(16) + var size = stat.size.toString(16) + + return '"' + size + '-' + mtime + '"' +} diff --git a/node_modules/etag/package.json b/node_modules/etag/package.json new file mode 100644 index 00000000..909dfdc4 --- /dev/null +++ b/node_modules/etag/package.json @@ -0,0 +1,86 @@ +{ + "_from": "etag@~1.8.1", + "_id": "etag@1.8.1", + "_inBundle": false, + "_integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "_location": "/etag", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "etag@~1.8.1", + "name": "etag", + "escapedName": "etag", + "rawSpec": "~1.8.1", + "saveSpec": null, + "fetchSpec": "~1.8.1" + }, + "_requiredBy": [ + "/express", + "/send" + ], + "_resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "_shasum": "41ae2eeb65efa62268aebfea83ac7d79299b0887", + "_spec": "etag@~1.8.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "bugs": { + "url": "https://github.com/jshttp/etag/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "David Björklund", + "email": "david.bjorklund@gmail.com" + } + ], + "deprecated": false, + "description": "Create simple HTTP ETags", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "3.19.0", + "eslint-config-standard": "10.2.1", + "eslint-plugin-import": "2.7.0", + "eslint-plugin-markdown": "1.0.0-beta.6", + "eslint-plugin-node": "5.1.1", + "eslint-plugin-promise": "3.5.0", + "eslint-plugin-standard": "3.0.1", + "istanbul": "0.4.5", + "mocha": "1.21.5", + "safe-buffer": "5.1.1", + "seedrandom": "2.4.3" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "README.md", + "index.js" + ], + "homepage": "https://github.com/jshttp/etag#readme", + "keywords": [ + "etag", + "http", + "res" + ], + "license": "MIT", + "name": "etag", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/etag.git" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "1.8.1" +} diff --git a/node_modules/express/History.md b/node_modules/express/History.md new file mode 100644 index 00000000..6e62a6dd --- /dev/null +++ b/node_modules/express/History.md @@ -0,0 +1,3477 @@ +4.17.1 / 2019-05-25 +=================== + + * Revert "Improve error message for `null`/`undefined` to `res.status`" + +4.17.0 / 2019-05-16 +=================== + + * Add `express.raw` to parse bodies into `Buffer` + * Add `express.text` to parse bodies into string + * Improve error message for non-strings to `res.sendFile` + * Improve error message for `null`/`undefined` to `res.status` + * Support multiple hosts in `X-Forwarded-Host` + * deps: accepts@~1.3.7 + * deps: body-parser@1.19.0 + - Add encoding MIK + - Add petabyte (`pb`) support + - Fix parsing array brackets after index + - deps: bytes@3.1.0 + - deps: http-errors@1.7.2 + - deps: iconv-lite@0.4.24 + - deps: qs@6.7.0 + - deps: raw-body@2.4.0 + - deps: type-is@~1.6.17 + * deps: content-disposition@0.5.3 + * deps: cookie@0.4.0 + - Add `SameSite=None` support + * deps: finalhandler@~1.1.2 + - Set stricter `Content-Security-Policy` header + - deps: parseurl@~1.3.3 + - deps: statuses@~1.5.0 + * deps: parseurl@~1.3.3 + * deps: proxy-addr@~2.0.5 + - deps: ipaddr.js@1.9.0 + * deps: qs@6.7.0 + - Fix parsing array brackets after index + * deps: range-parser@~1.2.1 + * deps: send@0.17.1 + - Set stricter CSP header in redirect & error responses + - deps: http-errors@~1.7.2 + - deps: mime@1.6.0 + - deps: ms@2.1.1 + - deps: range-parser@~1.2.1 + - deps: statuses@~1.5.0 + - perf: remove redundant `path.normalize` call + * deps: serve-static@1.14.1 + - Set stricter CSP header in redirect response + - deps: parseurl@~1.3.3 + - deps: send@0.17.1 + * deps: setprototypeof@1.1.1 + * deps: statuses@~1.5.0 + - Add `103 Early Hints` + * deps: type-is@~1.6.18 + - deps: mime-types@~2.1.24 + - perf: prevent internal `throw` on invalid type + +4.16.4 / 2018-10-10 +=================== + + * Fix issue where `"Request aborted"` may be logged in `res.sendfile` + * Fix JSDoc for `Router` constructor + * deps: body-parser@1.18.3 + - Fix deprecation warnings on Node.js 10+ + - Fix stack trace for strict json parse error + - deps: depd@~1.1.2 + - deps: http-errors@~1.6.3 + - deps: iconv-lite@0.4.23 + - deps: qs@6.5.2 + - deps: raw-body@2.3.3 + - deps: type-is@~1.6.16 + * deps: proxy-addr@~2.0.4 + - deps: ipaddr.js@1.8.0 + * deps: qs@6.5.2 + * deps: safe-buffer@5.1.2 + +4.16.3 / 2018-03-12 +=================== + + * deps: accepts@~1.3.5 + - deps: mime-types@~2.1.18 + * deps: depd@~1.1.2 + - perf: remove argument reassignment + * deps: encodeurl@~1.0.2 + - Fix encoding `%` as last character + * deps: finalhandler@1.1.1 + - Fix 404 output for bad / missing pathnames + - deps: encodeurl@~1.0.2 + - deps: statuses@~1.4.0 + * deps: proxy-addr@~2.0.3 + - deps: ipaddr.js@1.6.0 + * deps: send@0.16.2 + - Fix incorrect end tag in default error & redirects + - deps: depd@~1.1.2 + - deps: encodeurl@~1.0.2 + - deps: statuses@~1.4.0 + * deps: serve-static@1.13.2 + - Fix incorrect end tag in redirects + - deps: encodeurl@~1.0.2 + - deps: send@0.16.2 + * deps: statuses@~1.4.0 + * deps: type-is@~1.6.16 + - deps: mime-types@~2.1.18 + +4.16.2 / 2017-10-09 +=================== + + * Fix `TypeError` in `res.send` when given `Buffer` and `ETag` header set + * perf: skip parsing of entire `X-Forwarded-Proto` header + +4.16.1 / 2017-09-29 +=================== + + * deps: send@0.16.1 + * deps: serve-static@1.13.1 + - Fix regression when `root` is incorrectly set to a file + - deps: send@0.16.1 + +4.16.0 / 2017-09-28 +=================== + + * Add `"json escape"` setting for `res.json` and `res.jsonp` + * Add `express.json` and `express.urlencoded` to parse bodies + * Add `options` argument to `res.download` + * Improve error message when autoloading invalid view engine + * Improve error messages when non-function provided as middleware + * Skip `Buffer` encoding when not generating ETag for small response + * Use `safe-buffer` for improved Buffer API + * deps: accepts@~1.3.4 + - deps: mime-types@~2.1.16 + * deps: content-type@~1.0.4 + - perf: remove argument reassignment + - perf: skip parameter parsing when no parameters + * deps: etag@~1.8.1 + - perf: replace regular expression with substring + * deps: finalhandler@1.1.0 + - Use `res.headersSent` when available + * deps: parseurl@~1.3.2 + - perf: reduce overhead for full URLs + - perf: unroll the "fast-path" `RegExp` + * deps: proxy-addr@~2.0.2 + - Fix trimming leading / trailing OWS in `X-Forwarded-For` + - deps: forwarded@~0.1.2 + - deps: ipaddr.js@1.5.2 + - perf: reduce overhead when no `X-Forwarded-For` header + * deps: qs@6.5.1 + - Fix parsing & compacting very deep objects + * deps: send@0.16.0 + - Add 70 new types for file extensions + - Add `immutable` option + - Fix missing `` in default error & redirects + - Set charset as "UTF-8" for .js and .json + - Use instance methods on steam to check for listeners + - deps: mime@1.4.1 + - perf: improve path validation speed + * deps: serve-static@1.13.0 + - Add 70 new types for file extensions + - Add `immutable` option + - Set charset as "UTF-8" for .js and .json + - deps: send@0.16.0 + * deps: setprototypeof@1.1.0 + * deps: utils-merge@1.0.1 + * deps: vary@~1.1.2 + - perf: improve header token parsing speed + * perf: re-use options object when generating ETags + * perf: remove dead `.charset` set in `res.jsonp` + +4.15.5 / 2017-09-24 +=================== + + * deps: debug@2.6.9 + * deps: finalhandler@~1.0.6 + - deps: debug@2.6.9 + - deps: parseurl@~1.3.2 + * deps: fresh@0.5.2 + - Fix handling of modified headers with invalid dates + - perf: improve ETag match loop + - perf: improve `If-None-Match` token parsing + * deps: send@0.15.6 + - Fix handling of modified headers with invalid dates + - deps: debug@2.6.9 + - deps: etag@~1.8.1 + - deps: fresh@0.5.2 + - perf: improve `If-Match` token parsing + * deps: serve-static@1.12.6 + - deps: parseurl@~1.3.2 + - deps: send@0.15.6 + - perf: improve slash collapsing + +4.15.4 / 2017-08-06 +=================== + + * deps: debug@2.6.8 + * deps: depd@~1.1.1 + - Remove unnecessary `Buffer` loading + * deps: finalhandler@~1.0.4 + - deps: debug@2.6.8 + * deps: proxy-addr@~1.1.5 + - Fix array argument being altered + - deps: ipaddr.js@1.4.0 + * deps: qs@6.5.0 + * deps: send@0.15.4 + - deps: debug@2.6.8 + - deps: depd@~1.1.1 + - deps: http-errors@~1.6.2 + * deps: serve-static@1.12.4 + - deps: send@0.15.4 + +4.15.3 / 2017-05-16 +=================== + + * Fix error when `res.set` cannot add charset to `Content-Type` + * deps: debug@2.6.7 + - Fix `DEBUG_MAX_ARRAY_LENGTH` + - deps: ms@2.0.0 + * deps: finalhandler@~1.0.3 + - Fix missing `` in HTML document + - deps: debug@2.6.7 + * deps: proxy-addr@~1.1.4 + - deps: ipaddr.js@1.3.0 + * deps: send@0.15.3 + - deps: debug@2.6.7 + - deps: ms@2.0.0 + * deps: serve-static@1.12.3 + - deps: send@0.15.3 + * deps: type-is@~1.6.15 + - deps: mime-types@~2.1.15 + * deps: vary@~1.1.1 + - perf: hoist regular expression + +4.15.2 / 2017-03-06 +=================== + + * deps: qs@6.4.0 + - Fix regression parsing keys starting with `[` + +4.15.1 / 2017-03-05 +=================== + + * deps: send@0.15.1 + - Fix issue when `Date.parse` does not return `NaN` on invalid date + - Fix strict violation in broken environments + * deps: serve-static@1.12.1 + - Fix issue when `Date.parse` does not return `NaN` on invalid date + - deps: send@0.15.1 + +4.15.0 / 2017-03-01 +=================== + + * Add debug message when loading view engine + * Add `next("router")` to exit from router + * Fix case where `router.use` skipped requests routes did not + * Remove usage of `res._headers` private field + - Improves compatibility with Node.js 8 nightly + * Skip routing when `req.url` is not set + * Use `%o` in path debug to tell types apart + * Use `Object.create` to setup request & response prototypes + * Use `setprototypeof` module to replace `__proto__` setting + * Use `statuses` instead of `http` module for status messages + * deps: debug@2.6.1 + - Allow colors in workers + - Deprecated `DEBUG_FD` environment variable set to `3` or higher + - Fix error when running under React Native + - Use same color for same namespace + - deps: ms@0.7.2 + * deps: etag@~1.8.0 + - Use SHA1 instead of MD5 for ETag hashing + - Works with FIPS 140-2 OpenSSL configuration + * deps: finalhandler@~1.0.0 + - Fix exception when `err` cannot be converted to a string + - Fully URL-encode the pathname in the 404 + - Only include the pathname in the 404 message + - Send complete HTML document + - Set `Content-Security-Policy: default-src 'self'` header + - deps: debug@2.6.1 + * deps: fresh@0.5.0 + - Fix false detection of `no-cache` request directive + - Fix incorrect result when `If-None-Match` has both `*` and ETags + - Fix weak `ETag` matching to match spec + - perf: delay reading header values until needed + - perf: enable strict mode + - perf: hoist regular expressions + - perf: remove duplicate conditional + - perf: remove unnecessary boolean coercions + - perf: skip checking modified time if ETag check failed + - perf: skip parsing `If-None-Match` when no `ETag` header + - perf: use `Date.parse` instead of `new Date` + * deps: qs@6.3.1 + - Fix array parsing from skipping empty values + - Fix compacting nested arrays + * deps: send@0.15.0 + - Fix false detection of `no-cache` request directive + - Fix incorrect result when `If-None-Match` has both `*` and ETags + - Fix weak `ETag` matching to match spec + - Remove usage of `res._headers` private field + - Support `If-Match` and `If-Unmodified-Since` headers + - Use `res.getHeaderNames()` when available + - Use `res.headersSent` when available + - deps: debug@2.6.1 + - deps: etag@~1.8.0 + - deps: fresh@0.5.0 + - deps: http-errors@~1.6.1 + * deps: serve-static@1.12.0 + - Fix false detection of `no-cache` request directive + - Fix incorrect result when `If-None-Match` has both `*` and ETags + - Fix weak `ETag` matching to match spec + - Remove usage of `res._headers` private field + - Send complete HTML document in redirect response + - Set default CSP header in redirect response + - Support `If-Match` and `If-Unmodified-Since` headers + - Use `res.getHeaderNames()` when available + - Use `res.headersSent` when available + - deps: send@0.15.0 + * perf: add fast match path for `*` route + * perf: improve `req.ips` performance + +4.14.1 / 2017-01-28 +=================== + + * deps: content-disposition@0.5.2 + * deps: finalhandler@0.5.1 + - Fix exception when `err.headers` is not an object + - deps: statuses@~1.3.1 + - perf: hoist regular expressions + - perf: remove duplicate validation path + * deps: proxy-addr@~1.1.3 + - deps: ipaddr.js@1.2.0 + * deps: send@0.14.2 + - deps: http-errors@~1.5.1 + - deps: ms@0.7.2 + - deps: statuses@~1.3.1 + * deps: serve-static@~1.11.2 + - deps: send@0.14.2 + * deps: type-is@~1.6.14 + - deps: mime-types@~2.1.13 + +4.14.0 / 2016-06-16 +=================== + + * Add `acceptRanges` option to `res.sendFile`/`res.sendfile` + * Add `cacheControl` option to `res.sendFile`/`res.sendfile` + * Add `options` argument to `req.range` + - Includes the `combine` option + * Encode URL in `res.location`/`res.redirect` if not already encoded + * Fix some redirect handling in `res.sendFile`/`res.sendfile` + * Fix Windows absolute path check using forward slashes + * Improve error with invalid arguments to `req.get()` + * Improve performance for `res.json`/`res.jsonp` in most cases + * Improve `Range` header handling in `res.sendFile`/`res.sendfile` + * deps: accepts@~1.3.3 + - Fix including type extensions in parameters in `Accept` parsing + - Fix parsing `Accept` parameters with quoted equals + - Fix parsing `Accept` parameters with quoted semicolons + - Many performance improvements + - deps: mime-types@~2.1.11 + - deps: negotiator@0.6.1 + * deps: content-type@~1.0.2 + - perf: enable strict mode + * deps: cookie@0.3.1 + - Add `sameSite` option + - Fix cookie `Max-Age` to never be a floating point number + - Improve error message when `encode` is not a function + - Improve error message when `expires` is not a `Date` + - Throw better error for invalid argument to parse + - Throw on invalid values provided to `serialize` + - perf: enable strict mode + - perf: hoist regular expression + - perf: use for loop in parse + - perf: use string concatenation for serialization + * deps: finalhandler@0.5.0 + - Change invalid or non-numeric status code to 500 + - Overwrite status message to match set status code + - Prefer `err.statusCode` if `err.status` is invalid + - Set response headers from `err.headers` object + - Use `statuses` instead of `http` module for status messages + * deps: proxy-addr@~1.1.2 + - Fix accepting various invalid netmasks + - Fix IPv6-mapped IPv4 validation edge cases + - IPv4 netmasks must be contiguous + - IPv6 addresses cannot be used as a netmask + - deps: ipaddr.js@1.1.1 + * deps: qs@6.2.0 + - Add `decoder` option in `parse` function + * deps: range-parser@~1.2.0 + - Add `combine` option to combine overlapping ranges + - Fix incorrectly returning -1 when there is at least one valid range + - perf: remove internal function + * deps: send@0.14.1 + - Add `acceptRanges` option + - Add `cacheControl` option + - Attempt to combine multiple ranges into single range + - Correctly inherit from `Stream` class + - Fix `Content-Range` header in 416 responses when using `start`/`end` options + - Fix `Content-Range` header missing from default 416 responses + - Fix redirect error when `path` contains raw non-URL characters + - Fix redirect when `path` starts with multiple forward slashes + - Ignore non-byte `Range` headers + - deps: http-errors@~1.5.0 + - deps: range-parser@~1.2.0 + - deps: statuses@~1.3.0 + - perf: remove argument reassignment + * deps: serve-static@~1.11.1 + - Add `acceptRanges` option + - Add `cacheControl` option + - Attempt to combine multiple ranges into single range + - Fix redirect error when `req.url` contains raw non-URL characters + - Ignore non-byte `Range` headers + - Use status code 301 for redirects + - deps: send@0.14.1 + * deps: type-is@~1.6.13 + - Fix type error when given invalid type to match against + - deps: mime-types@~2.1.11 + * deps: vary@~1.1.0 + - Only accept valid field names in the `field` argument + * perf: use strict equality when possible + +4.13.4 / 2016-01-21 +=================== + + * deps: content-disposition@0.5.1 + - perf: enable strict mode + * deps: cookie@0.1.5 + - Throw on invalid values provided to `serialize` + * deps: depd@~1.1.0 + - Support web browser loading + - perf: enable strict mode + * deps: escape-html@~1.0.3 + - perf: enable strict mode + - perf: optimize string replacement + - perf: use faster string coercion + * deps: finalhandler@0.4.1 + - deps: escape-html@~1.0.3 + * deps: merge-descriptors@1.0.1 + - perf: enable strict mode + * deps: methods@~1.1.2 + - perf: enable strict mode + * deps: parseurl@~1.3.1 + - perf: enable strict mode + * deps: proxy-addr@~1.0.10 + - deps: ipaddr.js@1.0.5 + - perf: enable strict mode + * deps: range-parser@~1.0.3 + - perf: enable strict mode + * deps: send@0.13.1 + - deps: depd@~1.1.0 + - deps: destroy@~1.0.4 + - deps: escape-html@~1.0.3 + - deps: range-parser@~1.0.3 + * deps: serve-static@~1.10.2 + - deps: escape-html@~1.0.3 + - deps: parseurl@~1.3.0 + - deps: send@0.13.1 + +4.13.3 / 2015-08-02 +=================== + + * Fix infinite loop condition using `mergeParams: true` + * Fix inner numeric indices incorrectly altering parent `req.params` + +4.13.2 / 2015-07-31 +=================== + + * deps: accepts@~1.2.12 + - deps: mime-types@~2.1.4 + * deps: array-flatten@1.1.1 + - perf: enable strict mode + * deps: path-to-regexp@0.1.7 + - Fix regression with escaped round brackets and matching groups + * deps: type-is@~1.6.6 + - deps: mime-types@~2.1.4 + +4.13.1 / 2015-07-05 +=================== + + * deps: accepts@~1.2.10 + - deps: mime-types@~2.1.2 + * deps: qs@4.0.0 + - Fix dropping parameters like `hasOwnProperty` + - Fix various parsing edge cases + * deps: type-is@~1.6.4 + - deps: mime-types@~2.1.2 + - perf: enable strict mode + - perf: remove argument reassignment + +4.13.0 / 2015-06-20 +=================== + + * Add settings to debug output + * Fix `res.format` error when only `default` provided + * Fix issue where `next('route')` in `app.param` would incorrectly skip values + * Fix hiding platform issues with `decodeURIComponent` + - Only `URIError`s are a 400 + * Fix using `*` before params in routes + * Fix using capture groups before params in routes + * Simplify `res.cookie` to call `res.append` + * Use `array-flatten` module for flattening arrays + * deps: accepts@~1.2.9 + - deps: mime-types@~2.1.1 + - perf: avoid argument reassignment & argument slice + - perf: avoid negotiator recursive construction + - perf: enable strict mode + - perf: remove unnecessary bitwise operator + * deps: cookie@0.1.3 + - perf: deduce the scope of try-catch deopt + - perf: remove argument reassignments + * deps: escape-html@1.0.2 + * deps: etag@~1.7.0 + - Always include entity length in ETags for hash length extensions + - Generate non-Stats ETags using MD5 only (no longer CRC32) + - Improve stat performance by removing hashing + - Improve support for JXcore + - Remove base64 padding in ETags to shorten + - Support "fake" stats objects in environments without fs + - Use MD5 instead of MD4 in weak ETags over 1KB + * deps: finalhandler@0.4.0 + - Fix a false-positive when unpiping in Node.js 0.8 + - Support `statusCode` property on `Error` objects + - Use `unpipe` module for unpiping requests + - deps: escape-html@1.0.2 + - deps: on-finished@~2.3.0 + - perf: enable strict mode + - perf: remove argument reassignment + * deps: fresh@0.3.0 + - Add weak `ETag` matching support + * deps: on-finished@~2.3.0 + - Add defined behavior for HTTP `CONNECT` requests + - Add defined behavior for HTTP `Upgrade` requests + - deps: ee-first@1.1.1 + * deps: path-to-regexp@0.1.6 + * deps: send@0.13.0 + - Allow Node.js HTTP server to set `Date` response header + - Fix incorrectly removing `Content-Location` on 304 response + - Improve the default redirect response headers + - Send appropriate headers on default error response + - Use `http-errors` for standard emitted errors + - Use `statuses` instead of `http` module for status messages + - deps: escape-html@1.0.2 + - deps: etag@~1.7.0 + - deps: fresh@0.3.0 + - deps: on-finished@~2.3.0 + - perf: enable strict mode + - perf: remove unnecessary array allocations + * deps: serve-static@~1.10.0 + - Add `fallthrough` option + - Fix reading options from options prototype + - Improve the default redirect response headers + - Malformed URLs now `next()` instead of 400 + - deps: escape-html@1.0.2 + - deps: send@0.13.0 + - perf: enable strict mode + - perf: remove argument reassignment + * deps: type-is@~1.6.3 + - deps: mime-types@~2.1.1 + - perf: reduce try block size + - perf: remove bitwise operations + * perf: enable strict mode + * perf: isolate `app.render` try block + * perf: remove argument reassignments in application + * perf: remove argument reassignments in request prototype + * perf: remove argument reassignments in response prototype + * perf: remove argument reassignments in routing + * perf: remove argument reassignments in `View` + * perf: skip attempting to decode zero length string + * perf: use saved reference to `http.STATUS_CODES` + +4.12.4 / 2015-05-17 +=================== + + * deps: accepts@~1.2.7 + - deps: mime-types@~2.0.11 + - deps: negotiator@0.5.3 + * deps: debug@~2.2.0 + - deps: ms@0.7.1 + * deps: depd@~1.0.1 + * deps: etag@~1.6.0 + - Improve support for JXcore + - Support "fake" stats objects in environments without `fs` + * deps: finalhandler@0.3.6 + - deps: debug@~2.2.0 + - deps: on-finished@~2.2.1 + * deps: on-finished@~2.2.1 + - Fix `isFinished(req)` when data buffered + * deps: proxy-addr@~1.0.8 + - deps: ipaddr.js@1.0.1 + * deps: qs@2.4.2 + - Fix allowing parameters like `constructor` + * deps: send@0.12.3 + - deps: debug@~2.2.0 + - deps: depd@~1.0.1 + - deps: etag@~1.6.0 + - deps: ms@0.7.1 + - deps: on-finished@~2.2.1 + * deps: serve-static@~1.9.3 + - deps: send@0.12.3 + * deps: type-is@~1.6.2 + - deps: mime-types@~2.0.11 + +4.12.3 / 2015-03-17 +=================== + + * deps: accepts@~1.2.5 + - deps: mime-types@~2.0.10 + * deps: debug@~2.1.3 + - Fix high intensity foreground color for bold + - deps: ms@0.7.0 + * deps: finalhandler@0.3.4 + - deps: debug@~2.1.3 + * deps: proxy-addr@~1.0.7 + - deps: ipaddr.js@0.1.9 + * deps: qs@2.4.1 + - Fix error when parameter `hasOwnProperty` is present + * deps: send@0.12.2 + - Throw errors early for invalid `extensions` or `index` options + - deps: debug@~2.1.3 + * deps: serve-static@~1.9.2 + - deps: send@0.12.2 + * deps: type-is@~1.6.1 + - deps: mime-types@~2.0.10 + +4.12.2 / 2015-03-02 +=================== + + * Fix regression where `"Request aborted"` is logged using `res.sendFile` + +4.12.1 / 2015-03-01 +=================== + + * Fix constructing application with non-configurable prototype properties + * Fix `ECONNRESET` errors from `res.sendFile` usage + * Fix `req.host` when using "trust proxy" hops count + * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count + * Fix wrong `code` on aborted connections from `res.sendFile` + * deps: merge-descriptors@1.0.0 + +4.12.0 / 2015-02-23 +=================== + + * Fix `"trust proxy"` setting to inherit when app is mounted + * Generate `ETag`s for all request responses + - No longer restricted to only responses for `GET` and `HEAD` requests + * Use `content-type` to parse `Content-Type` headers + * deps: accepts@~1.2.4 + - Fix preference sorting to be stable for long acceptable lists + - deps: mime-types@~2.0.9 + - deps: negotiator@0.5.1 + * deps: cookie-signature@1.0.6 + * deps: send@0.12.1 + - Always read the stat size from the file + - Fix mutating passed-in `options` + - deps: mime@1.3.4 + * deps: serve-static@~1.9.1 + - deps: send@0.12.1 + * deps: type-is@~1.6.0 + - fix argument reassignment + - fix false-positives in `hasBody` `Transfer-Encoding` check + - support wildcard for both type and subtype (`*/*`) + - deps: mime-types@~2.0.9 + +4.11.2 / 2015-02-01 +=================== + + * Fix `res.redirect` double-calling `res.end` for `HEAD` requests + * deps: accepts@~1.2.3 + - deps: mime-types@~2.0.8 + * deps: proxy-addr@~1.0.6 + - deps: ipaddr.js@0.1.8 + * deps: type-is@~1.5.6 + - deps: mime-types@~2.0.8 + +4.11.1 / 2015-01-20 +=================== + + * deps: send@0.11.1 + - Fix root path disclosure + * deps: serve-static@~1.8.1 + - Fix redirect loop in Node.js 0.11.14 + - Fix root path disclosure + - deps: send@0.11.1 + +4.11.0 / 2015-01-13 +=================== + + * Add `res.append(field, val)` to append headers + * Deprecate leading `:` in `name` for `app.param(name, fn)` + * Deprecate `req.param()` -- use `req.params`, `req.body`, or `req.query` instead + * Deprecate `app.param(fn)` + * Fix `OPTIONS` responses to include the `HEAD` method properly + * Fix `res.sendFile` not always detecting aborted connection + * Match routes iteratively to prevent stack overflows + * deps: accepts@~1.2.2 + - deps: mime-types@~2.0.7 + - deps: negotiator@0.5.0 + * deps: send@0.11.0 + - deps: debug@~2.1.1 + - deps: etag@~1.5.1 + - deps: ms@0.7.0 + - deps: on-finished@~2.2.0 + * deps: serve-static@~1.8.0 + - deps: send@0.11.0 + +4.10.8 / 2015-01-13 +=================== + + * Fix crash from error within `OPTIONS` response handler + * deps: proxy-addr@~1.0.5 + - deps: ipaddr.js@0.1.6 + +4.10.7 / 2015-01-04 +=================== + + * Fix `Allow` header for `OPTIONS` to not contain duplicate methods + * Fix incorrect "Request aborted" for `res.sendFile` when `HEAD` or 304 + * deps: debug@~2.1.1 + * deps: finalhandler@0.3.3 + - deps: debug@~2.1.1 + - deps: on-finished@~2.2.0 + * deps: methods@~1.1.1 + * deps: on-finished@~2.2.0 + * deps: serve-static@~1.7.2 + - Fix potential open redirect when mounted at root + * deps: type-is@~1.5.5 + - deps: mime-types@~2.0.7 + +4.10.6 / 2014-12-12 +=================== + + * Fix exception in `req.fresh`/`req.stale` without response headers + +4.10.5 / 2014-12-10 +=================== + + * Fix `res.send` double-calling `res.end` for `HEAD` requests + * deps: accepts@~1.1.4 + - deps: mime-types@~2.0.4 + * deps: type-is@~1.5.4 + - deps: mime-types@~2.0.4 + +4.10.4 / 2014-11-24 +=================== + + * Fix `res.sendfile` logging standard write errors + +4.10.3 / 2014-11-23 +=================== + + * Fix `res.sendFile` logging standard write errors + * deps: etag@~1.5.1 + * deps: proxy-addr@~1.0.4 + - deps: ipaddr.js@0.1.5 + * deps: qs@2.3.3 + - Fix `arrayLimit` behavior + +4.10.2 / 2014-11-09 +=================== + + * Correctly invoke async router callback asynchronously + * deps: accepts@~1.1.3 + - deps: mime-types@~2.0.3 + * deps: type-is@~1.5.3 + - deps: mime-types@~2.0.3 + +4.10.1 / 2014-10-28 +=================== + + * Fix handling of URLs containing `://` in the path + * deps: qs@2.3.2 + - Fix parsing of mixed objects and values + +4.10.0 / 2014-10-23 +=================== + + * Add support for `app.set('views', array)` + - Views are looked up in sequence in array of directories + * Fix `res.send(status)` to mention `res.sendStatus(status)` + * Fix handling of invalid empty URLs + * Use `content-disposition` module for `res.attachment`/`res.download` + - Sends standards-compliant `Content-Disposition` header + - Full Unicode support + * Use `path.resolve` in view lookup + * deps: debug@~2.1.0 + - Implement `DEBUG_FD` env variable support + * deps: depd@~1.0.0 + * deps: etag@~1.5.0 + - Improve string performance + - Slightly improve speed for weak ETags over 1KB + * deps: finalhandler@0.3.2 + - Terminate in progress response only on error + - Use `on-finished` to determine request status + - deps: debug@~2.1.0 + - deps: on-finished@~2.1.1 + * deps: on-finished@~2.1.1 + - Fix handling of pipelined requests + * deps: qs@2.3.0 + - Fix parsing of mixed implicit and explicit arrays + * deps: send@0.10.1 + - deps: debug@~2.1.0 + - deps: depd@~1.0.0 + - deps: etag@~1.5.0 + - deps: on-finished@~2.1.1 + * deps: serve-static@~1.7.1 + - deps: send@0.10.1 + +4.9.8 / 2014-10-17 +================== + + * Fix `res.redirect` body when redirect status specified + * deps: accepts@~1.1.2 + - Fix error when media type has invalid parameter + - deps: negotiator@0.4.9 + +4.9.7 / 2014-10-10 +================== + + * Fix using same param name in array of paths + +4.9.6 / 2014-10-08 +================== + + * deps: accepts@~1.1.1 + - deps: mime-types@~2.0.2 + - deps: negotiator@0.4.8 + * deps: serve-static@~1.6.4 + - Fix redirect loop when index file serving disabled + * deps: type-is@~1.5.2 + - deps: mime-types@~2.0.2 + +4.9.5 / 2014-09-24 +================== + + * deps: etag@~1.4.0 + * deps: proxy-addr@~1.0.3 + - Use `forwarded` npm module + * deps: send@0.9.3 + - deps: etag@~1.4.0 + * deps: serve-static@~1.6.3 + - deps: send@0.9.3 + +4.9.4 / 2014-09-19 +================== + + * deps: qs@2.2.4 + - Fix issue with object keys starting with numbers truncated + +4.9.3 / 2014-09-18 +================== + + * deps: proxy-addr@~1.0.2 + - Fix a global leak when multiple subnets are trusted + - deps: ipaddr.js@0.1.3 + +4.9.2 / 2014-09-17 +================== + + * Fix regression for empty string `path` in `app.use` + * Fix `router.use` to accept array of middleware without path + * Improve error message for bad `app.use` arguments + +4.9.1 / 2014-09-16 +================== + + * Fix `app.use` to accept array of middleware without path + * deps: depd@0.4.5 + * deps: etag@~1.3.1 + * deps: send@0.9.2 + - deps: depd@0.4.5 + - deps: etag@~1.3.1 + - deps: range-parser@~1.0.2 + * deps: serve-static@~1.6.2 + - deps: send@0.9.2 + +4.9.0 / 2014-09-08 +================== + + * Add `res.sendStatus` + * Invoke callback for sendfile when client aborts + - Applies to `res.sendFile`, `res.sendfile`, and `res.download` + - `err` will be populated with request aborted error + * Support IP address host in `req.subdomains` + * Use `etag` to generate `ETag` headers + * deps: accepts@~1.1.0 + - update `mime-types` + * deps: cookie-signature@1.0.5 + * deps: debug@~2.0.0 + * deps: finalhandler@0.2.0 + - Set `X-Content-Type-Options: nosniff` header + - deps: debug@~2.0.0 + * deps: fresh@0.2.4 + * deps: media-typer@0.3.0 + - Throw error when parameter format invalid on parse + * deps: qs@2.2.3 + - Fix issue where first empty value in array is discarded + * deps: range-parser@~1.0.2 + * deps: send@0.9.1 + - Add `lastModified` option + - Use `etag` to generate `ETag` header + - deps: debug@~2.0.0 + - deps: fresh@0.2.4 + * deps: serve-static@~1.6.1 + - Add `lastModified` option + - deps: send@0.9.1 + * deps: type-is@~1.5.1 + - fix `hasbody` to be true for `content-length: 0` + - deps: media-typer@0.3.0 + - deps: mime-types@~2.0.1 + * deps: vary@~1.0.0 + - Accept valid `Vary` header string as `field` + +4.8.8 / 2014-09-04 +================== + + * deps: send@0.8.5 + - Fix a path traversal issue when using `root` + - Fix malicious path detection for empty string path + * deps: serve-static@~1.5.4 + - deps: send@0.8.5 + +4.8.7 / 2014-08-29 +================== + + * deps: qs@2.2.2 + - Remove unnecessary cloning + +4.8.6 / 2014-08-27 +================== + + * deps: qs@2.2.0 + - Array parsing fix + - Performance improvements + +4.8.5 / 2014-08-18 +================== + + * deps: send@0.8.3 + - deps: destroy@1.0.3 + - deps: on-finished@2.1.0 + * deps: serve-static@~1.5.3 + - deps: send@0.8.3 + +4.8.4 / 2014-08-14 +================== + + * deps: qs@1.2.2 + * deps: send@0.8.2 + - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` + * deps: serve-static@~1.5.2 + - deps: send@0.8.2 + +4.8.3 / 2014-08-10 +================== + + * deps: parseurl@~1.3.0 + * deps: qs@1.2.1 + * deps: serve-static@~1.5.1 + - Fix parsing of weird `req.originalUrl` values + - deps: parseurl@~1.3.0 + - deps: utils-merge@1.0.0 + +4.8.2 / 2014-08-07 +================== + + * deps: qs@1.2.0 + - Fix parsing array of objects + +4.8.1 / 2014-08-06 +================== + + * fix incorrect deprecation warnings on `res.download` + * deps: qs@1.1.0 + - Accept urlencoded square brackets + - Accept empty values in implicit array notation + +4.8.0 / 2014-08-05 +================== + + * add `res.sendFile` + - accepts a file system path instead of a URL + - requires an absolute path or `root` option specified + * deprecate `res.sendfile` -- use `res.sendFile` instead + * support mounted app as any argument to `app.use()` + * deps: qs@1.0.2 + - Complete rewrite + - Limits array length to 20 + - Limits object depth to 5 + - Limits parameters to 1,000 + * deps: send@0.8.1 + - Add `extensions` option + * deps: serve-static@~1.5.0 + - Add `extensions` option + - deps: send@0.8.1 + +4.7.4 / 2014-08-04 +================== + + * fix `res.sendfile` regression for serving directory index files + * deps: send@0.7.4 + - Fix incorrect 403 on Windows and Node.js 0.11 + - Fix serving index files without root dir + * deps: serve-static@~1.4.4 + - deps: send@0.7.4 + +4.7.3 / 2014-08-04 +================== + + * deps: send@0.7.3 + - Fix incorrect 403 on Windows and Node.js 0.11 + * deps: serve-static@~1.4.3 + - Fix incorrect 403 on Windows and Node.js 0.11 + - deps: send@0.7.3 + +4.7.2 / 2014-07-27 +================== + + * deps: depd@0.4.4 + - Work-around v8 generating empty stack traces + * deps: send@0.7.2 + - deps: depd@0.4.4 + * deps: serve-static@~1.4.2 + +4.7.1 / 2014-07-26 +================== + + * deps: depd@0.4.3 + - Fix exception when global `Error.stackTraceLimit` is too low + * deps: send@0.7.1 + - deps: depd@0.4.3 + * deps: serve-static@~1.4.1 + +4.7.0 / 2014-07-25 +================== + + * fix `req.protocol` for proxy-direct connections + * configurable query parser with `app.set('query parser', parser)` + - `app.set('query parser', 'extended')` parse with "qs" module + - `app.set('query parser', 'simple')` parse with "querystring" core module + - `app.set('query parser', false)` disable query string parsing + - `app.set('query parser', true)` enable simple parsing + * deprecate `res.json(status, obj)` -- use `res.status(status).json(obj)` instead + * deprecate `res.jsonp(status, obj)` -- use `res.status(status).jsonp(obj)` instead + * deprecate `res.send(status, body)` -- use `res.status(status).send(body)` instead + * deps: debug@1.0.4 + * deps: depd@0.4.2 + - Add `TRACE_DEPRECATION` environment variable + - Remove non-standard grey color from color output + - Support `--no-deprecation` argument + - Support `--trace-deprecation` argument + * deps: finalhandler@0.1.0 + - Respond after request fully read + - deps: debug@1.0.4 + * deps: parseurl@~1.2.0 + - Cache URLs based on original value + - Remove no-longer-needed URL mis-parse work-around + - Simplify the "fast-path" `RegExp` + * deps: send@0.7.0 + - Add `dotfiles` option + - Cap `maxAge` value to 1 year + - deps: debug@1.0.4 + - deps: depd@0.4.2 + * deps: serve-static@~1.4.0 + - deps: parseurl@~1.2.0 + - deps: send@0.7.0 + * perf: prevent multiple `Buffer` creation in `res.send` + +4.6.1 / 2014-07-12 +================== + + * fix `subapp.mountpath` regression for `app.use(subapp)` + +4.6.0 / 2014-07-11 +================== + + * accept multiple callbacks to `app.use()` + * add explicit "Rosetta Flash JSONP abuse" protection + - previous versions are not vulnerable; this is just explicit protection + * catch errors in multiple `req.param(name, fn)` handlers + * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead + * fix `res.send(status, num)` to send `num` as json (not error) + * remove unnecessary escaping when `res.jsonp` returns JSON response + * support non-string `path` in `app.use(path, fn)` + - supports array of paths + - supports `RegExp` + * router: fix optimization on router exit + * router: refactor location of `try` blocks + * router: speed up standard `app.use(fn)` + * deps: debug@1.0.3 + - Add support for multiple wildcards in namespaces + * deps: finalhandler@0.0.3 + - deps: debug@1.0.3 + * deps: methods@1.1.0 + - add `CONNECT` + * deps: parseurl@~1.1.3 + - faster parsing of href-only URLs + * deps: path-to-regexp@0.1.3 + * deps: send@0.6.0 + - deps: debug@1.0.3 + * deps: serve-static@~1.3.2 + - deps: parseurl@~1.1.3 + - deps: send@0.6.0 + * perf: fix arguments reassign deopt in some `res` methods + +4.5.1 / 2014-07-06 +================== + + * fix routing regression when altering `req.method` + +4.5.0 / 2014-07-04 +================== + + * add deprecation message to non-plural `req.accepts*` + * add deprecation message to `res.send(body, status)` + * add deprecation message to `res.vary()` + * add `headers` option to `res.sendfile` + - use to set headers on successful file transfer + * add `mergeParams` option to `Router` + - merges `req.params` from parent routes + * add `req.hostname` -- correct name for what `req.host` returns + * deprecate things with `depd` module + * deprecate `req.host` -- use `req.hostname` instead + * fix behavior when handling request without routes + * fix handling when `route.all` is only route + * invoke `router.param()` only when route matches + * restore `req.params` after invoking router + * use `finalhandler` for final response handling + * use `media-typer` to alter content-type charset + * deps: accepts@~1.0.7 + * deps: send@0.5.0 + - Accept string for `maxage` (converted by `ms`) + - Include link in default redirect response + * deps: serve-static@~1.3.0 + - Accept string for `maxAge` (converted by `ms`) + - Add `setHeaders` option + - Include HTML link in redirect response + - deps: send@0.5.0 + * deps: type-is@~1.3.2 + +4.4.5 / 2014-06-26 +================== + + * deps: cookie-signature@1.0.4 + - fix for timing attacks + +4.4.4 / 2014-06-20 +================== + + * fix `res.attachment` Unicode filenames in Safari + * fix "trim prefix" debug message in `express:router` + * deps: accepts@~1.0.5 + * deps: buffer-crc32@0.2.3 + +4.4.3 / 2014-06-11 +================== + + * fix persistence of modified `req.params[name]` from `app.param()` + * deps: accepts@1.0.3 + - deps: negotiator@0.4.6 + * deps: debug@1.0.2 + * deps: send@0.4.3 + - Do not throw uncatchable error on file open race condition + - Use `escape-html` for HTML escaping + - deps: debug@1.0.2 + - deps: finished@1.2.2 + - deps: fresh@0.2.2 + * deps: serve-static@1.2.3 + - Do not throw uncatchable error on file open race condition + - deps: send@0.4.3 + +4.4.2 / 2014-06-09 +================== + + * fix catching errors from top-level handlers + * use `vary` module for `res.vary` + * deps: debug@1.0.1 + * deps: proxy-addr@1.0.1 + * deps: send@0.4.2 + - fix "event emitter leak" warnings + - deps: debug@1.0.1 + - deps: finished@1.2.1 + * deps: serve-static@1.2.2 + - fix "event emitter leak" warnings + - deps: send@0.4.2 + * deps: type-is@1.2.1 + +4.4.1 / 2014-06-02 +================== + + * deps: methods@1.0.1 + * deps: send@0.4.1 + - Send `max-age` in `Cache-Control` in correct format + * deps: serve-static@1.2.1 + - use `escape-html` for escaping + - deps: send@0.4.1 + +4.4.0 / 2014-05-30 +================== + + * custom etag control with `app.set('etag', val)` + - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation + - `app.set('etag', 'weak')` weak tag + - `app.set('etag', 'strong')` strong etag + - `app.set('etag', false)` turn off + - `app.set('etag', true)` standard etag + * mark `res.send` ETag as weak and reduce collisions + * update accepts to 1.0.2 + - Fix interpretation when header not in request + * update send to 0.4.0 + - Calculate ETag with md5 for reduced collisions + - Ignore stream errors after request ends + - deps: debug@0.8.1 + * update serve-static to 1.2.0 + - Calculate ETag with md5 for reduced collisions + - Ignore stream errors after request ends + - deps: send@0.4.0 + +4.3.2 / 2014-05-28 +================== + + * fix handling of errors from `router.param()` callbacks + +4.3.1 / 2014-05-23 +================== + + * revert "fix behavior of multiple `app.VERB` for the same path" + - this caused a regression in the order of route execution + +4.3.0 / 2014-05-21 +================== + + * add `req.baseUrl` to access the path stripped from `req.url` in routes + * fix behavior of multiple `app.VERB` for the same path + * fix issue routing requests among sub routers + * invoke `router.param()` only when necessary instead of every match + * proper proxy trust with `app.set('trust proxy', trust)` + - `app.set('trust proxy', 1)` trust first hop + - `app.set('trust proxy', 'loopback')` trust loopback addresses + - `app.set('trust proxy', '10.0.0.1')` trust single IP + - `app.set('trust proxy', '10.0.0.1/16')` trust subnet + - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list + - `app.set('trust proxy', false)` turn off + - `app.set('trust proxy', true)` trust everything + * set proper `charset` in `Content-Type` for `res.send` + * update type-is to 1.2.0 + - support suffix matching + +4.2.0 / 2014-05-11 +================== + + * deprecate `app.del()` -- use `app.delete()` instead + * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead + - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` + * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead + - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` + * fix `req.next` when inside router instance + * include `ETag` header in `HEAD` requests + * keep previous `Content-Type` for `res.jsonp` + * support PURGE method + - add `app.purge` + - add `router.purge` + - include PURGE in `app.all` + * update debug to 0.8.0 + - add `enable()` method + - change from stderr to stdout + * update methods to 1.0.0 + - add PURGE + +4.1.2 / 2014-05-08 +================== + + * fix `req.host` for IPv6 literals + * fix `res.jsonp` error if callback param is object + +4.1.1 / 2014-04-27 +================== + + * fix package.json to reflect supported node version + +4.1.0 / 2014-04-24 +================== + + * pass options from `res.sendfile` to `send` + * preserve casing of headers in `res.header` and `res.set` + * support unicode file names in `res.attachment` and `res.download` + * update accepts to 1.0.1 + - deps: negotiator@0.4.0 + * update cookie to 0.1.2 + - Fix for maxAge == 0 + - made compat with expires field + * update send to 0.3.0 + - Accept API options in options object + - Coerce option types + - Control whether to generate etags + - Default directory access to 403 when index disabled + - Fix sending files with dots without root set + - Include file path in etag + - Make "Can't set headers after they are sent." catchable + - Send full entity-body for multi range requests + - Set etags to "weak" + - Support "If-Range" header + - Support multiple index paths + - deps: mime@1.2.11 + * update serve-static to 1.1.0 + - Accept options directly to `send` module + - Resolve relative paths at middleware setup + - Use parseurl to parse the URL from request + - deps: send@0.3.0 + * update type-is to 1.1.0 + - add non-array values support + - add `multipart` as a shorthand + +4.0.0 / 2014-04-09 +================== + + * remove: + - node 0.8 support + - connect and connect's patches except for charset handling + - express(1) - moved to [express-generator](https://github.com/expressjs/generator) + - `express.createServer()` - it has been deprecated for a long time. Use `express()` + - `app.configure` - use logic in your own app code + - `app.router` - is removed + - `req.auth` - use `basic-auth` instead + - `req.accepted*` - use `req.accepts*()` instead + - `res.location` - relative URL resolution is removed + - `res.charset` - include the charset in the content type when using `res.set()` + - all bundled middleware except `static` + * change: + - `app.route` -> `app.mountpath` when mounting an express app in another express app + - `json spaces` no longer enabled by default in development + - `req.accepts*` -> `req.accepts*s` - i.e. `req.acceptsEncoding` -> `req.acceptsEncodings` + - `req.params` is now an object instead of an array + - `res.locals` is no longer a function. It is a plain js object. Treat it as such. + - `res.headerSent` -> `res.headersSent` to match node.js ServerResponse object + * refactor: + - `req.accepts*` with [accepts](https://github.com/expressjs/accepts) + - `req.is` with [type-is](https://github.com/expressjs/type-is) + - [path-to-regexp](https://github.com/component/path-to-regexp) + * add: + - `app.router()` - returns the app Router instance + - `app.route()` - Proxy to the app's `Router#route()` method to create a new route + - Router & Route - public API + +3.21.2 / 2015-07-31 +=================== + + * deps: connect@2.30.2 + - deps: body-parser@~1.13.3 + - deps: compression@~1.5.2 + - deps: errorhandler@~1.4.2 + - deps: method-override@~2.3.5 + - deps: serve-index@~1.7.2 + - deps: type-is@~1.6.6 + - deps: vhost@~3.0.1 + * deps: vary@~1.0.1 + - Fix setting empty header from empty `field` + - perf: enable strict mode + - perf: remove argument reassignments + +3.21.1 / 2015-07-05 +=================== + + * deps: basic-auth@~1.0.3 + * deps: connect@2.30.1 + - deps: body-parser@~1.13.2 + - deps: compression@~1.5.1 + - deps: errorhandler@~1.4.1 + - deps: morgan@~1.6.1 + - deps: pause@0.1.0 + - deps: qs@4.0.0 + - deps: serve-index@~1.7.1 + - deps: type-is@~1.6.4 + +3.21.0 / 2015-06-18 +=================== + + * deps: basic-auth@1.0.2 + - perf: enable strict mode + - perf: hoist regular expression + - perf: parse with regular expressions + - perf: remove argument reassignment + * deps: connect@2.30.0 + - deps: body-parser@~1.13.1 + - deps: bytes@2.1.0 + - deps: compression@~1.5.0 + - deps: cookie@0.1.3 + - deps: cookie-parser@~1.3.5 + - deps: csurf@~1.8.3 + - deps: errorhandler@~1.4.0 + - deps: express-session@~1.11.3 + - deps: finalhandler@0.4.0 + - deps: fresh@0.3.0 + - deps: morgan@~1.6.0 + - deps: serve-favicon@~2.3.0 + - deps: serve-index@~1.7.0 + - deps: serve-static@~1.10.0 + - deps: type-is@~1.6.3 + * deps: cookie@0.1.3 + - perf: deduce the scope of try-catch deopt + - perf: remove argument reassignments + * deps: escape-html@1.0.2 + * deps: etag@~1.7.0 + - Always include entity length in ETags for hash length extensions + - Generate non-Stats ETags using MD5 only (no longer CRC32) + - Improve stat performance by removing hashing + - Improve support for JXcore + - Remove base64 padding in ETags to shorten + - Support "fake" stats objects in environments without fs + - Use MD5 instead of MD4 in weak ETags over 1KB + * deps: fresh@0.3.0 + - Add weak `ETag` matching support + * deps: mkdirp@0.5.1 + - Work in global strict mode + * deps: send@0.13.0 + - Allow Node.js HTTP server to set `Date` response header + - Fix incorrectly removing `Content-Location` on 304 response + - Improve the default redirect response headers + - Send appropriate headers on default error response + - Use `http-errors` for standard emitted errors + - Use `statuses` instead of `http` module for status messages + - deps: escape-html@1.0.2 + - deps: etag@~1.7.0 + - deps: fresh@0.3.0 + - deps: on-finished@~2.3.0 + - perf: enable strict mode + - perf: remove unnecessary array allocations + +3.20.3 / 2015-05-17 +=================== + + * deps: connect@2.29.2 + - deps: body-parser@~1.12.4 + - deps: compression@~1.4.4 + - deps: connect-timeout@~1.6.2 + - deps: debug@~2.2.0 + - deps: depd@~1.0.1 + - deps: errorhandler@~1.3.6 + - deps: finalhandler@0.3.6 + - deps: method-override@~2.3.3 + - deps: morgan@~1.5.3 + - deps: qs@2.4.2 + - deps: response-time@~2.3.1 + - deps: serve-favicon@~2.2.1 + - deps: serve-index@~1.6.4 + - deps: serve-static@~1.9.3 + - deps: type-is@~1.6.2 + * deps: debug@~2.2.0 + - deps: ms@0.7.1 + * deps: depd@~1.0.1 + * deps: proxy-addr@~1.0.8 + - deps: ipaddr.js@1.0.1 + * deps: send@0.12.3 + - deps: debug@~2.2.0 + - deps: depd@~1.0.1 + - deps: etag@~1.6.0 + - deps: ms@0.7.1 + - deps: on-finished@~2.2.1 + +3.20.2 / 2015-03-16 +=================== + + * deps: connect@2.29.1 + - deps: body-parser@~1.12.2 + - deps: compression@~1.4.3 + - deps: connect-timeout@~1.6.1 + - deps: debug@~2.1.3 + - deps: errorhandler@~1.3.5 + - deps: express-session@~1.10.4 + - deps: finalhandler@0.3.4 + - deps: method-override@~2.3.2 + - deps: morgan@~1.5.2 + - deps: qs@2.4.1 + - deps: serve-index@~1.6.3 + - deps: serve-static@~1.9.2 + - deps: type-is@~1.6.1 + * deps: debug@~2.1.3 + - Fix high intensity foreground color for bold + - deps: ms@0.7.0 + * deps: merge-descriptors@1.0.0 + * deps: proxy-addr@~1.0.7 + - deps: ipaddr.js@0.1.9 + * deps: send@0.12.2 + - Throw errors early for invalid `extensions` or `index` options + - deps: debug@~2.1.3 + +3.20.1 / 2015-02-28 +=================== + + * Fix `req.host` when using "trust proxy" hops count + * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count + +3.20.0 / 2015-02-18 +=================== + + * Fix `"trust proxy"` setting to inherit when app is mounted + * Generate `ETag`s for all request responses + - No longer restricted to only responses for `GET` and `HEAD` requests + * Use `content-type` to parse `Content-Type` headers + * deps: connect@2.29.0 + - Use `content-type` to parse `Content-Type` headers + - deps: body-parser@~1.12.0 + - deps: compression@~1.4.1 + - deps: connect-timeout@~1.6.0 + - deps: cookie-parser@~1.3.4 + - deps: cookie-signature@1.0.6 + - deps: csurf@~1.7.0 + - deps: errorhandler@~1.3.4 + - deps: express-session@~1.10.3 + - deps: http-errors@~1.3.1 + - deps: response-time@~2.3.0 + - deps: serve-index@~1.6.2 + - deps: serve-static@~1.9.1 + - deps: type-is@~1.6.0 + * deps: cookie-signature@1.0.6 + * deps: send@0.12.1 + - Always read the stat size from the file + - Fix mutating passed-in `options` + - deps: mime@1.3.4 + +3.19.2 / 2015-02-01 +=================== + + * deps: connect@2.28.3 + - deps: compression@~1.3.1 + - deps: csurf@~1.6.6 + - deps: errorhandler@~1.3.3 + - deps: express-session@~1.10.2 + - deps: serve-index@~1.6.1 + - deps: type-is@~1.5.6 + * deps: proxy-addr@~1.0.6 + - deps: ipaddr.js@0.1.8 + +3.19.1 / 2015-01-20 +=================== + + * deps: connect@2.28.2 + - deps: body-parser@~1.10.2 + - deps: serve-static@~1.8.1 + * deps: send@0.11.1 + - Fix root path disclosure + +3.19.0 / 2015-01-09 +=================== + + * Fix `OPTIONS` responses to include the `HEAD` method property + * Use `readline` for prompt in `express(1)` + * deps: commander@2.6.0 + * deps: connect@2.28.1 + - deps: body-parser@~1.10.1 + - deps: compression@~1.3.0 + - deps: connect-timeout@~1.5.0 + - deps: csurf@~1.6.4 + - deps: debug@~2.1.1 + - deps: errorhandler@~1.3.2 + - deps: express-session@~1.10.1 + - deps: finalhandler@0.3.3 + - deps: method-override@~2.3.1 + - deps: morgan@~1.5.1 + - deps: serve-favicon@~2.2.0 + - deps: serve-index@~1.6.0 + - deps: serve-static@~1.8.0 + - deps: type-is@~1.5.5 + * deps: debug@~2.1.1 + * deps: methods@~1.1.1 + * deps: proxy-addr@~1.0.5 + - deps: ipaddr.js@0.1.6 + * deps: send@0.11.0 + - deps: debug@~2.1.1 + - deps: etag@~1.5.1 + - deps: ms@0.7.0 + - deps: on-finished@~2.2.0 + +3.18.6 / 2014-12-12 +=================== + + * Fix exception in `req.fresh`/`req.stale` without response headers + +3.18.5 / 2014-12-11 +=================== + + * deps: connect@2.27.6 + - deps: compression@~1.2.2 + - deps: express-session@~1.9.3 + - deps: http-errors@~1.2.8 + - deps: serve-index@~1.5.3 + - deps: type-is@~1.5.4 + +3.18.4 / 2014-11-23 +=================== + + * deps: connect@2.27.4 + - deps: body-parser@~1.9.3 + - deps: compression@~1.2.1 + - deps: errorhandler@~1.2.3 + - deps: express-session@~1.9.2 + - deps: qs@2.3.3 + - deps: serve-favicon@~2.1.7 + - deps: serve-static@~1.5.1 + - deps: type-is@~1.5.3 + * deps: etag@~1.5.1 + * deps: proxy-addr@~1.0.4 + - deps: ipaddr.js@0.1.5 + +3.18.3 / 2014-11-09 +=================== + + * deps: connect@2.27.3 + - Correctly invoke async callback asynchronously + - deps: csurf@~1.6.3 + +3.18.2 / 2014-10-28 +=================== + + * deps: connect@2.27.2 + - Fix handling of URLs containing `://` in the path + - deps: body-parser@~1.9.2 + - deps: qs@2.3.2 + +3.18.1 / 2014-10-22 +=================== + + * Fix internal `utils.merge` deprecation warnings + * deps: connect@2.27.1 + - deps: body-parser@~1.9.1 + - deps: express-session@~1.9.1 + - deps: finalhandler@0.3.2 + - deps: morgan@~1.4.1 + - deps: qs@2.3.0 + - deps: serve-static@~1.7.1 + * deps: send@0.10.1 + - deps: on-finished@~2.1.1 + +3.18.0 / 2014-10-17 +=================== + + * Use `content-disposition` module for `res.attachment`/`res.download` + - Sends standards-compliant `Content-Disposition` header + - Full Unicode support + * Use `etag` module to generate `ETag` headers + * deps: connect@2.27.0 + - Use `http-errors` module for creating errors + - Use `utils-merge` module for merging objects + - deps: body-parser@~1.9.0 + - deps: compression@~1.2.0 + - deps: connect-timeout@~1.4.0 + - deps: debug@~2.1.0 + - deps: depd@~1.0.0 + - deps: express-session@~1.9.0 + - deps: finalhandler@0.3.1 + - deps: method-override@~2.3.0 + - deps: morgan@~1.4.0 + - deps: response-time@~2.2.0 + - deps: serve-favicon@~2.1.6 + - deps: serve-index@~1.5.0 + - deps: serve-static@~1.7.0 + * deps: debug@~2.1.0 + - Implement `DEBUG_FD` env variable support + * deps: depd@~1.0.0 + * deps: send@0.10.0 + - deps: debug@~2.1.0 + - deps: depd@~1.0.0 + - deps: etag@~1.5.0 + +3.17.8 / 2014-10-15 +=================== + + * deps: connect@2.26.6 + - deps: compression@~1.1.2 + - deps: csurf@~1.6.2 + - deps: errorhandler@~1.2.2 + +3.17.7 / 2014-10-08 +=================== + + * deps: connect@2.26.5 + - Fix accepting non-object arguments to `logger` + - deps: serve-static@~1.6.4 + +3.17.6 / 2014-10-02 +=================== + + * deps: connect@2.26.4 + - deps: morgan@~1.3.2 + - deps: type-is@~1.5.2 + +3.17.5 / 2014-09-24 +=================== + + * deps: connect@2.26.3 + - deps: body-parser@~1.8.4 + - deps: serve-favicon@~2.1.5 + - deps: serve-static@~1.6.3 + * deps: proxy-addr@~1.0.3 + - Use `forwarded` npm module + * deps: send@0.9.3 + - deps: etag@~1.4.0 + +3.17.4 / 2014-09-19 +=================== + + * deps: connect@2.26.2 + - deps: body-parser@~1.8.3 + - deps: qs@2.2.4 + +3.17.3 / 2014-09-18 +=================== + + * deps: proxy-addr@~1.0.2 + - Fix a global leak when multiple subnets are trusted + - deps: ipaddr.js@0.1.3 + +3.17.2 / 2014-09-15 +=================== + + * Use `crc` instead of `buffer-crc32` for speed + * deps: connect@2.26.1 + - deps: body-parser@~1.8.2 + - deps: depd@0.4.5 + - deps: express-session@~1.8.2 + - deps: morgan@~1.3.1 + - deps: serve-favicon@~2.1.3 + - deps: serve-static@~1.6.2 + * deps: depd@0.4.5 + * deps: send@0.9.2 + - deps: depd@0.4.5 + - deps: etag@~1.3.1 + - deps: range-parser@~1.0.2 + +3.17.1 / 2014-09-08 +=================== + + * Fix error in `req.subdomains` on empty host + +3.17.0 / 2014-09-08 +=================== + + * Support `X-Forwarded-Host` in `req.subdomains` + * Support IP address host in `req.subdomains` + * deps: connect@2.26.0 + - deps: body-parser@~1.8.1 + - deps: compression@~1.1.0 + - deps: connect-timeout@~1.3.0 + - deps: cookie-parser@~1.3.3 + - deps: cookie-signature@1.0.5 + - deps: csurf@~1.6.1 + - deps: debug@~2.0.0 + - deps: errorhandler@~1.2.0 + - deps: express-session@~1.8.1 + - deps: finalhandler@0.2.0 + - deps: fresh@0.2.4 + - deps: media-typer@0.3.0 + - deps: method-override@~2.2.0 + - deps: morgan@~1.3.0 + - deps: qs@2.2.3 + - deps: serve-favicon@~2.1.3 + - deps: serve-index@~1.2.1 + - deps: serve-static@~1.6.1 + - deps: type-is@~1.5.1 + - deps: vhost@~3.0.0 + * deps: cookie-signature@1.0.5 + * deps: debug@~2.0.0 + * deps: fresh@0.2.4 + * deps: media-typer@0.3.0 + - Throw error when parameter format invalid on parse + * deps: range-parser@~1.0.2 + * deps: send@0.9.1 + - Add `lastModified` option + - Use `etag` to generate `ETag` header + - deps: debug@~2.0.0 + - deps: fresh@0.2.4 + * deps: vary@~1.0.0 + - Accept valid `Vary` header string as `field` + +3.16.10 / 2014-09-04 +==================== + + * deps: connect@2.25.10 + - deps: serve-static@~1.5.4 + * deps: send@0.8.5 + - Fix a path traversal issue when using `root` + - Fix malicious path detection for empty string path + +3.16.9 / 2014-08-29 +=================== + + * deps: connect@2.25.9 + - deps: body-parser@~1.6.7 + - deps: qs@2.2.2 + +3.16.8 / 2014-08-27 +=================== + + * deps: connect@2.25.8 + - deps: body-parser@~1.6.6 + - deps: csurf@~1.4.1 + - deps: qs@2.2.0 + +3.16.7 / 2014-08-18 +=================== + + * deps: connect@2.25.7 + - deps: body-parser@~1.6.5 + - deps: express-session@~1.7.6 + - deps: morgan@~1.2.3 + - deps: serve-static@~1.5.3 + * deps: send@0.8.3 + - deps: destroy@1.0.3 + - deps: on-finished@2.1.0 + +3.16.6 / 2014-08-14 +=================== + + * deps: connect@2.25.6 + - deps: body-parser@~1.6.4 + - deps: qs@1.2.2 + - deps: serve-static@~1.5.2 + * deps: send@0.8.2 + - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` + +3.16.5 / 2014-08-11 +=================== + + * deps: connect@2.25.5 + - Fix backwards compatibility in `logger` + +3.16.4 / 2014-08-10 +=================== + + * Fix original URL parsing in `res.location` + * deps: connect@2.25.4 + - Fix `query` middleware breaking with argument + - deps: body-parser@~1.6.3 + - deps: compression@~1.0.11 + - deps: connect-timeout@~1.2.2 + - deps: express-session@~1.7.5 + - deps: method-override@~2.1.3 + - deps: on-headers@~1.0.0 + - deps: parseurl@~1.3.0 + - deps: qs@1.2.1 + - deps: response-time@~2.0.1 + - deps: serve-index@~1.1.6 + - deps: serve-static@~1.5.1 + * deps: parseurl@~1.3.0 + +3.16.3 / 2014-08-07 +=================== + + * deps: connect@2.25.3 + - deps: multiparty@3.3.2 + +3.16.2 / 2014-08-07 +=================== + + * deps: connect@2.25.2 + - deps: body-parser@~1.6.2 + - deps: qs@1.2.0 + +3.16.1 / 2014-08-06 +=================== + + * deps: connect@2.25.1 + - deps: body-parser@~1.6.1 + - deps: qs@1.1.0 + +3.16.0 / 2014-08-05 +=================== + + * deps: connect@2.25.0 + - deps: body-parser@~1.6.0 + - deps: compression@~1.0.10 + - deps: csurf@~1.4.0 + - deps: express-session@~1.7.4 + - deps: qs@1.0.2 + - deps: serve-static@~1.5.0 + * deps: send@0.8.1 + - Add `extensions` option + +3.15.3 / 2014-08-04 +=================== + + * fix `res.sendfile` regression for serving directory index files + * deps: connect@2.24.3 + - deps: serve-index@~1.1.5 + - deps: serve-static@~1.4.4 + * deps: send@0.7.4 + - Fix incorrect 403 on Windows and Node.js 0.11 + - Fix serving index files without root dir + +3.15.2 / 2014-07-27 +=================== + + * deps: connect@2.24.2 + - deps: body-parser@~1.5.2 + - deps: depd@0.4.4 + - deps: express-session@~1.7.2 + - deps: morgan@~1.2.2 + - deps: serve-static@~1.4.2 + * deps: depd@0.4.4 + - Work-around v8 generating empty stack traces + * deps: send@0.7.2 + - deps: depd@0.4.4 + +3.15.1 / 2014-07-26 +=================== + + * deps: connect@2.24.1 + - deps: body-parser@~1.5.1 + - deps: depd@0.4.3 + - deps: express-session@~1.7.1 + - deps: morgan@~1.2.1 + - deps: serve-index@~1.1.4 + - deps: serve-static@~1.4.1 + * deps: depd@0.4.3 + - Fix exception when global `Error.stackTraceLimit` is too low + * deps: send@0.7.1 + - deps: depd@0.4.3 + +3.15.0 / 2014-07-22 +=================== + + * Fix `req.protocol` for proxy-direct connections + * Pass options from `res.sendfile` to `send` + * deps: connect@2.24.0 + - deps: body-parser@~1.5.0 + - deps: compression@~1.0.9 + - deps: connect-timeout@~1.2.1 + - deps: debug@1.0.4 + - deps: depd@0.4.2 + - deps: express-session@~1.7.0 + - deps: finalhandler@0.1.0 + - deps: method-override@~2.1.2 + - deps: morgan@~1.2.0 + - deps: multiparty@3.3.1 + - deps: parseurl@~1.2.0 + - deps: serve-static@~1.4.0 + * deps: debug@1.0.4 + * deps: depd@0.4.2 + - Add `TRACE_DEPRECATION` environment variable + - Remove non-standard grey color from color output + - Support `--no-deprecation` argument + - Support `--trace-deprecation` argument + * deps: parseurl@~1.2.0 + - Cache URLs based on original value + - Remove no-longer-needed URL mis-parse work-around + - Simplify the "fast-path" `RegExp` + * deps: send@0.7.0 + - Add `dotfiles` option + - Cap `maxAge` value to 1 year + - deps: debug@1.0.4 + - deps: depd@0.4.2 + +3.14.0 / 2014-07-11 +=================== + + * add explicit "Rosetta Flash JSONP abuse" protection + - previous versions are not vulnerable; this is just explicit protection + * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead + * fix `res.send(status, num)` to send `num` as json (not error) + * remove unnecessary escaping when `res.jsonp` returns JSON response + * deps: basic-auth@1.0.0 + - support empty password + - support empty username + * deps: connect@2.23.0 + - deps: debug@1.0.3 + - deps: express-session@~1.6.4 + - deps: method-override@~2.1.0 + - deps: parseurl@~1.1.3 + - deps: serve-static@~1.3.1 + * deps: debug@1.0.3 + - Add support for multiple wildcards in namespaces + * deps: methods@1.1.0 + - add `CONNECT` + * deps: parseurl@~1.1.3 + - faster parsing of href-only URLs + +3.13.0 / 2014-07-03 +=================== + + * add deprecation message to `app.configure` + * add deprecation message to `req.auth` + * use `basic-auth` to parse `Authorization` header + * deps: connect@2.22.0 + - deps: csurf@~1.3.0 + - deps: express-session@~1.6.1 + - deps: multiparty@3.3.0 + - deps: serve-static@~1.3.0 + * deps: send@0.5.0 + - Accept string for `maxage` (converted by `ms`) + - Include link in default redirect response + +3.12.1 / 2014-06-26 +=================== + + * deps: connect@2.21.1 + - deps: cookie-parser@1.3.2 + - deps: cookie-signature@1.0.4 + - deps: express-session@~1.5.2 + - deps: type-is@~1.3.2 + * deps: cookie-signature@1.0.4 + - fix for timing attacks + +3.12.0 / 2014-06-21 +=================== + + * use `media-typer` to alter content-type charset + * deps: connect@2.21.0 + - deprecate `connect(middleware)` -- use `app.use(middleware)` instead + - deprecate `connect.createServer()` -- use `connect()` instead + - fix `res.setHeader()` patch to work with with get -> append -> set pattern + - deps: compression@~1.0.8 + - deps: errorhandler@~1.1.1 + - deps: express-session@~1.5.0 + - deps: serve-index@~1.1.3 + +3.11.0 / 2014-06-19 +=================== + + * deprecate things with `depd` module + * deps: buffer-crc32@0.2.3 + * deps: connect@2.20.2 + - deprecate `verify` option to `json` -- use `body-parser` npm module instead + - deprecate `verify` option to `urlencoded` -- use `body-parser` npm module instead + - deprecate things with `depd` module + - use `finalhandler` for final response handling + - use `media-typer` to parse `content-type` for charset + - deps: body-parser@1.4.3 + - deps: connect-timeout@1.1.1 + - deps: cookie-parser@1.3.1 + - deps: csurf@1.2.2 + - deps: errorhandler@1.1.0 + - deps: express-session@1.4.0 + - deps: multiparty@3.2.9 + - deps: serve-index@1.1.2 + - deps: type-is@1.3.1 + - deps: vhost@2.0.0 + +3.10.5 / 2014-06-11 +=================== + + * deps: connect@2.19.6 + - deps: body-parser@1.3.1 + - deps: compression@1.0.7 + - deps: debug@1.0.2 + - deps: serve-index@1.1.1 + - deps: serve-static@1.2.3 + * deps: debug@1.0.2 + * deps: send@0.4.3 + - Do not throw uncatchable error on file open race condition + - Use `escape-html` for HTML escaping + - deps: debug@1.0.2 + - deps: finished@1.2.2 + - deps: fresh@0.2.2 + +3.10.4 / 2014-06-09 +=================== + + * deps: connect@2.19.5 + - fix "event emitter leak" warnings + - deps: csurf@1.2.1 + - deps: debug@1.0.1 + - deps: serve-static@1.2.2 + - deps: type-is@1.2.1 + * deps: debug@1.0.1 + * deps: send@0.4.2 + - fix "event emitter leak" warnings + - deps: finished@1.2.1 + - deps: debug@1.0.1 + +3.10.3 / 2014-06-05 +=================== + + * use `vary` module for `res.vary` + * deps: connect@2.19.4 + - deps: errorhandler@1.0.2 + - deps: method-override@2.0.2 + - deps: serve-favicon@2.0.1 + * deps: debug@1.0.0 + +3.10.2 / 2014-06-03 +=================== + + * deps: connect@2.19.3 + - deps: compression@1.0.6 + +3.10.1 / 2014-06-03 +=================== + + * deps: connect@2.19.2 + - deps: compression@1.0.4 + * deps: proxy-addr@1.0.1 + +3.10.0 / 2014-06-02 +=================== + + * deps: connect@2.19.1 + - deprecate `methodOverride()` -- use `method-override` npm module instead + - deps: body-parser@1.3.0 + - deps: method-override@2.0.1 + - deps: multiparty@3.2.8 + - deps: response-time@2.0.0 + - deps: serve-static@1.2.1 + * deps: methods@1.0.1 + * deps: send@0.4.1 + - Send `max-age` in `Cache-Control` in correct format + +3.9.0 / 2014-05-30 +================== + + * custom etag control with `app.set('etag', val)` + - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation + - `app.set('etag', 'weak')` weak tag + - `app.set('etag', 'strong')` strong etag + - `app.set('etag', false)` turn off + - `app.set('etag', true)` standard etag + * Include ETag in HEAD requests + * mark `res.send` ETag as weak and reduce collisions + * update connect to 2.18.0 + - deps: compression@1.0.3 + - deps: serve-index@1.1.0 + - deps: serve-static@1.2.0 + * update send to 0.4.0 + - Calculate ETag with md5 for reduced collisions + - Ignore stream errors after request ends + - deps: debug@0.8.1 + +3.8.1 / 2014-05-27 +================== + + * update connect to 2.17.3 + - deps: body-parser@1.2.2 + - deps: express-session@1.2.1 + - deps: method-override@1.0.2 + +3.8.0 / 2014-05-21 +================== + + * keep previous `Content-Type` for `res.jsonp` + * set proper `charset` in `Content-Type` for `res.send` + * update connect to 2.17.1 + - fix `res.charset` appending charset when `content-type` has one + - deps: express-session@1.2.0 + - deps: morgan@1.1.1 + - deps: serve-index@1.0.3 + +3.7.0 / 2014-05-18 +================== + + * proper proxy trust with `app.set('trust proxy', trust)` + - `app.set('trust proxy', 1)` trust first hop + - `app.set('trust proxy', 'loopback')` trust loopback addresses + - `app.set('trust proxy', '10.0.0.1')` trust single IP + - `app.set('trust proxy', '10.0.0.1/16')` trust subnet + - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list + - `app.set('trust proxy', false)` turn off + - `app.set('trust proxy', true)` trust everything + * update connect to 2.16.2 + - deprecate `res.headerSent` -- use `res.headersSent` + - deprecate `res.on("header")` -- use on-headers module instead + - fix edge-case in `res.appendHeader` that would append in wrong order + - json: use body-parser + - urlencoded: use body-parser + - dep: bytes@1.0.0 + - dep: cookie-parser@1.1.0 + - dep: csurf@1.2.0 + - dep: express-session@1.1.0 + - dep: method-override@1.0.1 + +3.6.0 / 2014-05-09 +================== + + * deprecate `app.del()` -- use `app.delete()` instead + * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead + - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` + * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead + - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` + * support PURGE method + - add `app.purge` + - add `router.purge` + - include PURGE in `app.all` + * update connect to 2.15.0 + * Add `res.appendHeader` + * Call error stack even when response has been sent + * Patch `res.headerSent` to return Boolean + * Patch `res.headersSent` for node.js 0.8 + * Prevent default 404 handler after response sent + * dep: compression@1.0.2 + * dep: connect-timeout@1.1.0 + * dep: debug@^0.8.0 + * dep: errorhandler@1.0.1 + * dep: express-session@1.0.4 + * dep: morgan@1.0.1 + * dep: serve-favicon@2.0.0 + * dep: serve-index@1.0.2 + * update debug to 0.8.0 + * add `enable()` method + * change from stderr to stdout + * update methods to 1.0.0 + - add PURGE + * update mkdirp to 0.5.0 + +3.5.3 / 2014-05-08 +================== + + * fix `req.host` for IPv6 literals + * fix `res.jsonp` error if callback param is object + +3.5.2 / 2014-04-24 +================== + + * update connect to 2.14.5 + * update cookie to 0.1.2 + * update mkdirp to 0.4.0 + * update send to 0.3.0 + +3.5.1 / 2014-03-25 +================== + + * pin less-middleware in generated app + +3.5.0 / 2014-03-06 +================== + + * bump deps + +3.4.8 / 2014-01-13 +================== + + * prevent incorrect automatic OPTIONS responses #1868 @dpatti + * update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi + * throw 400 in case of malformed paths @rlidwka + +3.4.7 / 2013-12-10 +================== + + * update connect + +3.4.6 / 2013-12-01 +================== + + * update connect (raw-body) + +3.4.5 / 2013-11-27 +================== + + * update connect + * res.location: remove leading ./ #1802 @kapouer + * res.redirect: fix `res.redirect('toString') #1829 @michaelficarra + * res.send: always send ETag when content-length > 0 + * router: add Router.all() method + +3.4.4 / 2013-10-29 +================== + + * update connect + * update supertest + * update methods + * express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04 + +3.4.3 / 2013-10-23 +================== + + * update connect + +3.4.2 / 2013-10-18 +================== + + * update connect + * downgrade commander + +3.4.1 / 2013-10-15 +================== + + * update connect + * update commander + * jsonp: check if callback is a function + * router: wrap encodeURIComponent in a try/catch #1735 (@lxe) + * res.format: now includes charset @1747 (@sorribas) + * res.links: allow multiple calls @1746 (@sorribas) + +3.4.0 / 2013-09-07 +================== + + * add res.vary(). Closes #1682 + * update connect + +3.3.8 / 2013-09-02 +================== + + * update connect + +3.3.7 / 2013-08-28 +================== + + * update connect + +3.3.6 / 2013-08-27 +================== + + * Revert "remove charset from json responses. Closes #1631" (causes issues in some clients) + * add: req.accepts take an argument list + +3.3.4 / 2013-07-08 +================== + + * update send and connect + +3.3.3 / 2013-07-04 +================== + + * update connect + +3.3.2 / 2013-07-03 +================== + + * update connect + * update send + * remove .version export + +3.3.1 / 2013-06-27 +================== + + * update connect + +3.3.0 / 2013-06-26 +================== + + * update connect + * add support for multiple X-Forwarded-Proto values. Closes #1646 + * change: remove charset from json responses. Closes #1631 + * change: return actual booleans from req.accept* functions + * fix jsonp callback array throw + +3.2.6 / 2013-06-02 +================== + + * update connect + +3.2.5 / 2013-05-21 +================== + + * update connect + * update node-cookie + * add: throw a meaningful error when there is no default engine + * change generation of ETags with res.send() to GET requests only. Closes #1619 + +3.2.4 / 2013-05-09 +================== + + * fix `req.subdomains` when no Host is present + * fix `req.host` when no Host is present, return undefined + +3.2.3 / 2013-05-07 +================== + + * update connect / qs + +3.2.2 / 2013-05-03 +================== + + * update qs + +3.2.1 / 2013-04-29 +================== + + * add app.VERB() paths array deprecation warning + * update connect + * update qs and remove all ~ semver crap + * fix: accept number as value of Signed Cookie + +3.2.0 / 2013-04-15 +================== + + * add "view" constructor setting to override view behaviour + * add req.acceptsEncoding(name) + * add req.acceptedEncodings + * revert cookie signature change causing session race conditions + * fix sorting of Accept values of the same quality + +3.1.2 / 2013-04-12 +================== + + * add support for custom Accept parameters + * update cookie-signature + +3.1.1 / 2013-04-01 +================== + + * add X-Forwarded-Host support to `req.host` + * fix relative redirects + * update mkdirp + * update buffer-crc32 + * remove legacy app.configure() method from app template. + +3.1.0 / 2013-01-25 +================== + + * add support for leading "." in "view engine" setting + * add array support to `res.set()` + * add node 0.8.x to travis.yml + * add "subdomain offset" setting for tweaking `req.subdomains` + * add `res.location(url)` implementing `res.redirect()`-like setting of Location + * use app.get() for x-powered-by setting for inheritance + * fix colons in passwords for `req.auth` + +3.0.6 / 2013-01-04 +================== + + * add http verb methods to Router + * update connect + * fix mangling of the `res.cookie()` options object + * fix jsonp whitespace escape. Closes #1132 + +3.0.5 / 2012-12-19 +================== + + * add throwing when a non-function is passed to a route + * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses + * revert "add 'etag' option" + +3.0.4 / 2012-12-05 +================== + + * add 'etag' option to disable `res.send()` Etags + * add escaping of urls in text/plain in `res.redirect()` + for old browsers interpreting as html + * change crc32 module for a more liberal license + * update connect + +3.0.3 / 2012-11-13 +================== + + * update connect + * update cookie module + * fix cookie max-age + +3.0.2 / 2012-11-08 +================== + + * add OPTIONS to cors example. Closes #1398 + * fix route chaining regression. Closes #1397 + +3.0.1 / 2012-11-01 +================== + + * update connect + +3.0.0 / 2012-10-23 +================== + + * add `make clean` + * add "Basic" check to req.auth + * add `req.auth` test coverage + * add cb && cb(payload) to `res.jsonp()`. Closes #1374 + * add backwards compat for `res.redirect()` status. Closes #1336 + * add support for `res.json()` to retain previously defined Content-Types. Closes #1349 + * update connect + * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382 + * remove non-primitive string support for `res.send()` + * fix view-locals example. Closes #1370 + * fix route-separation example + +3.0.0rc5 / 2012-09-18 +================== + + * update connect + * add redis search example + * add static-files example + * add "x-powered-by" setting (`app.disable('x-powered-by')`) + * add "application/octet-stream" redirect Accept test case. Closes #1317 + +3.0.0rc4 / 2012-08-30 +================== + + * add `res.jsonp()`. Closes #1307 + * add "verbose errors" option to error-pages example + * add another route example to express(1) so people are not so confused + * add redis online user activity tracking example + * update connect dep + * fix etag quoting. Closes #1310 + * fix error-pages 404 status + * fix jsonp callback char restrictions + * remove old OPTIONS default response + +3.0.0rc3 / 2012-08-13 +================== + + * update connect dep + * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds] + * fix `res.render()` clobbering of "locals" + +3.0.0rc2 / 2012-08-03 +================== + + * add CORS example + * update connect dep + * deprecate `.createServer()` & remove old stale examples + * fix: escape `res.redirect()` link + * fix vhost example + +3.0.0rc1 / 2012-07-24 +================== + + * add more examples to view-locals + * add scheme-relative redirects (`res.redirect("//foo.com")`) support + * update cookie dep + * update connect dep + * update send dep + * fix `express(1)` -h flag, use -H for hogan. Closes #1245 + * fix `res.sendfile()` socket error handling regression + +3.0.0beta7 / 2012-07-16 +================== + + * update connect dep for `send()` root normalization regression + +3.0.0beta6 / 2012-07-13 +================== + + * add `err.view` property for view errors. Closes #1226 + * add "jsonp callback name" setting + * add support for "/foo/:bar*" non-greedy matches + * change `res.sendfile()` to use `send()` module + * change `res.send` to use "response-send" module + * remove `app.locals.use` and `res.locals.use`, use regular middleware + +3.0.0beta5 / 2012-07-03 +================== + + * add "make check" support + * add route-map example + * add `res.json(obj, status)` support back for BC + * add "methods" dep, remove internal methods module + * update connect dep + * update auth example to utilize cores pbkdf2 + * updated tests to use "supertest" + +3.0.0beta4 / 2012-06-25 +================== + + * Added `req.auth` + * Added `req.range(size)` + * Added `res.links(obj)` + * Added `res.send(body, status)` support back for backwards compat + * Added `.default()` support to `res.format()` + * Added 2xx / 304 check to `req.fresh` + * Revert "Added + support to the router" + * Fixed `res.send()` freshness check, respect res.statusCode + +3.0.0beta3 / 2012-06-15 +================== + + * Added hogan `--hjs` to express(1) [nullfirm] + * Added another example to content-negotiation + * Added `fresh` dep + * Changed: `res.send()` always checks freshness + * Fixed: expose connects mime module. Closes #1165 + +3.0.0beta2 / 2012-06-06 +================== + + * Added `+` support to the router + * Added `req.host` + * Changed `req.param()` to check route first + * Update connect dep + +3.0.0beta1 / 2012-06-01 +================== + + * Added `res.format()` callback to override default 406 behaviour + * Fixed `res.redirect()` 406. Closes #1154 + +3.0.0alpha5 / 2012-05-30 +================== + + * Added `req.ip` + * Added `{ signed: true }` option to `res.cookie()` + * Removed `res.signedCookie()` + * Changed: dont reverse `req.ips` + * Fixed "trust proxy" setting check for `req.ips` + +3.0.0alpha4 / 2012-05-09 +================== + + * Added: allow `[]` in jsonp callback. Closes #1128 + * Added `PORT` env var support in generated template. Closes #1118 [benatkin] + * Updated: connect 2.2.2 + +3.0.0alpha3 / 2012-05-04 +================== + + * Added public `app.routes`. Closes #887 + * Added _view-locals_ example + * Added _mvc_ example + * Added `res.locals.use()`. Closes #1120 + * Added conditional-GET support to `res.send()` + * Added: coerce `res.set()` values to strings + * Changed: moved `static()` in generated apps below router + * Changed: `res.send()` only set ETag when not previously set + * Changed connect 2.2.1 dep + * Changed: `make test` now runs unit / acceptance tests + * Fixed req/res proto inheritance + +3.0.0alpha2 / 2012-04-26 +================== + + * Added `make benchmark` back + * Added `res.send()` support for `String` objects + * Added client-side data exposing example + * Added `res.header()` and `req.header()` aliases for BC + * Added `express.createServer()` for BC + * Perf: memoize parsed urls + * Perf: connect 2.2.0 dep + * Changed: make `expressInit()` middleware self-aware + * Fixed: use app.get() for all core settings + * Fixed redis session example + * Fixed session example. Closes #1105 + * Fixed generated express dep. Closes #1078 + +3.0.0alpha1 / 2012-04-15 +================== + + * Added `app.locals.use(callback)` + * Added `app.locals` object + * Added `app.locals(obj)` + * Added `res.locals` object + * Added `res.locals(obj)` + * Added `res.format()` for content-negotiation + * Added `app.engine()` + * Added `res.cookie()` JSON cookie support + * Added "trust proxy" setting + * Added `req.subdomains` + * Added `req.protocol` + * Added `req.secure` + * Added `req.path` + * Added `req.ips` + * Added `req.fresh` + * Added `req.stale` + * Added comma-delimited / array support for `req.accepts()` + * Added debug instrumentation + * Added `res.set(obj)` + * Added `res.set(field, value)` + * Added `res.get(field)` + * Added `app.get(setting)`. Closes #842 + * Added `req.acceptsLanguage()` + * Added `req.acceptsCharset()` + * Added `req.accepted` + * Added `req.acceptedLanguages` + * Added `req.acceptedCharsets` + * Added "json replacer" setting + * Added "json spaces" setting + * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92 + * Added `--less` support to express(1) + * Added `express.response` prototype + * Added `express.request` prototype + * Added `express.application` prototype + * Added `app.path()` + * Added `app.render()` + * Added `res.type()` to replace `res.contentType()` + * Changed: `res.redirect()` to add relative support + * Changed: enable "jsonp callback" by default + * Changed: renamed "case sensitive routes" to "case sensitive routing" + * Rewrite of all tests with mocha + * Removed "root" setting + * Removed `res.redirect('home')` support + * Removed `req.notify()` + * Removed `app.register()` + * Removed `app.redirect()` + * Removed `app.is()` + * Removed `app.helpers()` + * Removed `app.dynamicHelpers()` + * Fixed `res.sendfile()` with non-GET. Closes #723 + * Fixed express(1) public dir for windows. Closes #866 + +2.5.9/ 2012-04-02 +================== + + * Added support for PURGE request method [pbuyle] + * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki] + +2.5.8 / 2012-02-08 +================== + + * Update mkdirp dep. Closes #991 + +2.5.7 / 2012-02-06 +================== + + * Fixed `app.all` duplicate DELETE requests [mscdex] + +2.5.6 / 2012-01-13 +================== + + * Updated hamljs dev dep. Closes #953 + +2.5.5 / 2012-01-08 +================== + + * Fixed: set `filename` on cached templates [matthewleon] + +2.5.4 / 2012-01-02 +================== + + * Fixed `express(1)` eol on 0.4.x. Closes #947 + +2.5.3 / 2011-12-30 +================== + + * Fixed `req.is()` when a charset is present + +2.5.2 / 2011-12-10 +================== + + * Fixed: express(1) LF -> CRLF for windows + +2.5.1 / 2011-11-17 +================== + + * Changed: updated connect to 1.8.x + * Removed sass.js support from express(1) + +2.5.0 / 2011-10-24 +================== + + * Added ./routes dir for generated app by default + * Added npm install reminder to express(1) app gen + * Added 0.5.x support + * Removed `make test-cov` since it wont work with node 0.5.x + * Fixed express(1) public dir for windows. Closes #866 + +2.4.7 / 2011-10-05 +================== + + * Added mkdirp to express(1). Closes #795 + * Added simple _json-config_ example + * Added shorthand for the parsed request's pathname via `req.path` + * Changed connect dep to 1.7.x to fix npm issue... + * Fixed `res.redirect()` __HEAD__ support. [reported by xerox] + * Fixed `req.flash()`, only escape args + * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie] + +2.4.6 / 2011-08-22 +================== + + * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode] + +2.4.5 / 2011-08-19 +================== + + * Added support for routes to handle errors. Closes #809 + * Added `app.routes.all()`. Closes #803 + * Added "basepath" setting to work in conjunction with reverse proxies etc. + * Refactored `Route` to use a single array of callbacks + * Added support for multiple callbacks for `app.param()`. Closes #801 +Closes #805 + * Changed: removed .call(self) for route callbacks + * Dependency: `qs >= 0.3.1` + * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808 + +2.4.4 / 2011-08-05 +================== + + * Fixed `res.header()` intention of a set, even when `undefined` + * Fixed `*`, value no longer required + * Fixed `res.send(204)` support. Closes #771 + +2.4.3 / 2011-07-14 +================== + + * Added docs for `status` option special-case. Closes #739 + * Fixed `options.filename`, exposing the view path to template engines + +2.4.2. / 2011-07-06 +================== + + * Revert "removed jsonp stripping" for XSS + +2.4.1 / 2011-07-06 +================== + + * Added `res.json()` JSONP support. Closes #737 + * Added _extending-templates_ example. Closes #730 + * Added "strict routing" setting for trailing slashes + * Added support for multiple envs in `app.configure()` calls. Closes #735 + * Changed: `res.send()` using `res.json()` + * Changed: when cookie `path === null` don't default it + * Changed; default cookie path to "home" setting. Closes #731 + * Removed _pids/logs_ creation from express(1) + +2.4.0 / 2011-06-28 +================== + + * Added chainable `res.status(code)` + * Added `res.json()`, an explicit version of `res.send(obj)` + * Added simple web-service example + +2.3.12 / 2011-06-22 +================== + + * \#express is now on freenode! come join! + * Added `req.get(field, param)` + * Added links to Japanese documentation, thanks @hideyukisaito! + * Added; the `express(1)` generated app outputs the env + * Added `content-negotiation` example + * Dependency: connect >= 1.5.1 < 2.0.0 + * Fixed view layout bug. Closes #720 + * Fixed; ignore body on 304. Closes #701 + +2.3.11 / 2011-06-04 +================== + + * Added `npm test` + * Removed generation of dummy test file from `express(1)` + * Fixed; `express(1)` adds express as a dep + * Fixed; prune on `prepublish` + +2.3.10 / 2011-05-27 +================== + + * Added `req.route`, exposing the current route + * Added _package.json_ generation support to `express(1)` + * Fixed call to `app.param()` function for optional params. Closes #682 + +2.3.9 / 2011-05-25 +================== + + * Fixed bug-ish with `../' in `res.partial()` calls + +2.3.8 / 2011-05-24 +================== + + * Fixed `app.options()` + +2.3.7 / 2011-05-23 +================== + + * Added route `Collection`, ex: `app.get('/user/:id').remove();` + * Added support for `app.param(fn)` to define param logic + * Removed `app.param()` support for callback with return value + * Removed module.parent check from express(1) generated app. Closes #670 + * Refactored router. Closes #639 + +2.3.6 / 2011-05-20 +================== + + * Changed; using devDependencies instead of git submodules + * Fixed redis session example + * Fixed markdown example + * Fixed view caching, should not be enabled in development + +2.3.5 / 2011-05-20 +================== + + * Added export `.view` as alias for `.View` + +2.3.4 / 2011-05-08 +================== + + * Added `./examples/say` + * Fixed `res.sendfile()` bug preventing the transfer of files with spaces + +2.3.3 / 2011-05-03 +================== + + * Added "case sensitive routes" option. + * Changed; split methods supported per rfc [slaskis] + * Fixed route-specific middleware when using the same callback function several times + +2.3.2 / 2011-04-27 +================== + + * Fixed view hints + +2.3.1 / 2011-04-26 +================== + + * Added `app.match()` as `app.match.all()` + * Added `app.lookup()` as `app.lookup.all()` + * Added `app.remove()` for `app.remove.all()` + * Added `app.remove.VERB()` + * Fixed template caching collision issue. Closes #644 + * Moved router over from connect and started refactor + +2.3.0 / 2011-04-25 +================== + + * Added options support to `res.clearCookie()` + * Added `res.helpers()` as alias of `res.locals()` + * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0` + * Changed; auto set Content-Type in res.attachement [Aaron Heckmann] + * Renamed "cache views" to "view cache". Closes #628 + * Fixed caching of views when using several apps. Closes #637 + * Fixed gotcha invoking `app.param()` callbacks once per route middleware. +Closes #638 + * Fixed partial lookup precedence. Closes #631 +Shaw] + +2.2.2 / 2011-04-12 +================== + + * Added second callback support for `res.download()` connection errors + * Fixed `filename` option passing to template engine + +2.2.1 / 2011-04-04 +================== + + * Added `layout(path)` helper to change the layout within a view. Closes #610 + * Fixed `partial()` collection object support. + Previously only anything with `.length` would work. + When `.length` is present one must still be aware of holes, + however now `{ collection: {foo: 'bar'}}` is valid, exposes + `keyInCollection` and `keysInCollection`. + + * Performance improved with better view caching + * Removed `request` and `response` locals + * Changed; errorHandler page title is now `Express` instead of `Connect` + +2.2.0 / 2011-03-30 +================== + + * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606 + * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606 + * Added `app.VERB(path)` as alias of `app.lookup.VERB()`. + * Dependency `connect >= 1.2.0` + +2.1.1 / 2011-03-29 +================== + + * Added; expose `err.view` object when failing to locate a view + * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann] + * Fixed; `res.send(undefined)` responds with 204 [aheckmann] + +2.1.0 / 2011-03-24 +================== + + * Added `/_?` partial lookup support. Closes #447 + * Added `request`, `response`, and `app` local variables + * Added `settings` local variable, containing the app's settings + * Added `req.flash()` exception if `req.session` is not available + * Added `res.send(bool)` support (json response) + * Fixed stylus example for latest version + * Fixed; wrap try/catch around `res.render()` + +2.0.0 / 2011-03-17 +================== + + * Fixed up index view path alternative. + * Changed; `res.locals()` without object returns the locals + +2.0.0rc3 / 2011-03-17 +================== + + * Added `res.locals(obj)` to compliment `res.local(key, val)` + * Added `res.partial()` callback support + * Fixed recursive error reporting issue in `res.render()` + +2.0.0rc2 / 2011-03-17 +================== + + * Changed; `partial()` "locals" are now optional + * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01] + * Fixed .filename view engine option [reported by drudge] + * Fixed blog example + * Fixed `{req,res}.app` reference when mounting [Ben Weaver] + +2.0.0rc / 2011-03-14 +================== + + * Fixed; expose `HTTPSServer` constructor + * Fixed express(1) default test charset. Closes #579 [reported by secoif] + * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP] + +2.0.0beta3 / 2011-03-09 +================== + + * Added support for `res.contentType()` literal + The original `res.contentType('.json')`, + `res.contentType('application/json')`, and `res.contentType('json')` + will work now. + * Added `res.render()` status option support back + * Added charset option for `res.render()` + * Added `.charset` support (via connect 1.0.4) + * Added view resolution hints when in development and a lookup fails + * Added layout lookup support relative to the page view. + For example while rendering `./views/user/index.jade` if you create + `./views/user/layout.jade` it will be used in favour of the root layout. + * Fixed `res.redirect()`. RFC states absolute url [reported by unlink] + * Fixed; default `res.send()` string charset to utf8 + * Removed `Partial` constructor (not currently used) + +2.0.0beta2 / 2011-03-07 +================== + + * Added res.render() `.locals` support back to aid in migration process + * Fixed flash example + +2.0.0beta / 2011-03-03 +================== + + * Added HTTPS support + * Added `res.cookie()` maxAge support + * Added `req.header()` _Referrer_ / _Referer_ special-case, either works + * Added mount support for `res.redirect()`, now respects the mount-point + * Added `union()` util, taking place of `merge(clone())` combo + * Added stylus support to express(1) generated app + * Added secret to session middleware used in examples and generated app + * Added `res.local(name, val)` for progressive view locals + * Added default param support to `req.param(name, default)` + * Added `app.disabled()` and `app.enabled()` + * Added `app.register()` support for omitting leading ".", either works + * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539 + * Added `app.param()` to map route params to async/sync logic + * Added; aliased `app.helpers()` as `app.locals()`. Closes #481 + * Added extname with no leading "." support to `res.contentType()` + * Added `cache views` setting, defaulting to enabled in "production" env + * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_. + * Added `req.accepts()` support for extensions + * Changed; `res.download()` and `res.sendfile()` now utilize Connect's + static file server `connect.static.send()`. + * Changed; replaced `connect.utils.mime()` with npm _mime_ module + * Changed; allow `req.query` to be pre-defined (via middleware or other parent + * Changed view partial resolution, now relative to parent view + * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`. + * Fixed `req.param()` bug returning Array.prototype methods. Closes #552 + * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()` + * Fixed; using _qs_ module instead of _querystring_ + * Fixed; strip unsafe chars from jsonp callbacks + * Removed "stream threshold" setting + +1.0.8 / 2011-03-01 +================== + + * Allow `req.query` to be pre-defined (via middleware or other parent app) + * "connect": ">= 0.5.0 < 1.0.0". Closes #547 + * Removed the long deprecated __EXPRESS_ENV__ support + +1.0.7 / 2011-02-07 +================== + + * Fixed `render()` setting inheritance. + Mounted apps would not inherit "view engine" + +1.0.6 / 2011-02-07 +================== + + * Fixed `view engine` setting bug when period is in dirname + +1.0.5 / 2011-02-05 +================== + + * Added secret to generated app `session()` call + +1.0.4 / 2011-02-05 +================== + + * Added `qs` dependency to _package.json_ + * Fixed namespaced `require()`s for latest connect support + +1.0.3 / 2011-01-13 +================== + + * Remove unsafe characters from JSONP callback names [Ryan Grove] + +1.0.2 / 2011-01-10 +================== + + * Removed nested require, using `connect.router` + +1.0.1 / 2010-12-29 +================== + + * Fixed for middleware stacked via `createServer()` + previously the `foo` middleware passed to `createServer(foo)` + would not have access to Express methods such as `res.send()` + or props like `req.query` etc. + +1.0.0 / 2010-11-16 +================== + + * Added; deduce partial object names from the last segment. + For example by default `partial('forum/post', postObject)` will + give you the _post_ object, providing a meaningful default. + * Added http status code string representation to `res.redirect()` body + * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__. + * Added `req.is()` to aid in content negotiation + * Added partial local inheritance [suggested by masylum]. Closes #102 + providing access to parent template locals. + * Added _-s, --session[s]_ flag to express(1) to add session related middleware + * Added _--template_ flag to express(1) to specify the + template engine to use. + * Added _--css_ flag to express(1) to specify the + stylesheet engine to use (or just plain css by default). + * Added `app.all()` support [thanks aheckmann] + * Added partial direct object support. + You may now `partial('user', user)` providing the "user" local, + vs previously `partial('user', { object: user })`. + * Added _route-separation_ example since many people question ways + to do this with CommonJS modules. Also view the _blog_ example for + an alternative. + * Performance; caching view path derived partial object names + * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454 + * Fixed jsonp support; _text/javascript_ as per mailinglist discussion + +1.0.0rc4 / 2010-10-14 +================== + + * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0 + * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware)) + * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass] + * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass] + * Added `partial()` support for array-like collections. Closes #434 + * Added support for swappable querystring parsers + * Added session usage docs. Closes #443 + * Added dynamic helper caching. Closes #439 [suggested by maritz] + * Added authentication example + * Added basic Range support to `res.sendfile()` (and `res.download()` etc) + * Changed; `express(1)` generated app using 2 spaces instead of 4 + * Default env to "development" again [aheckmann] + * Removed _context_ option is no more, use "scope" + * Fixed; exposing _./support_ libs to examples so they can run without installs + * Fixed mvc example + +1.0.0rc3 / 2010-09-20 +================== + + * Added confirmation for `express(1)` app generation. Closes #391 + * Added extending of flash formatters via `app.flashFormatters` + * Added flash formatter support. Closes #411 + * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold" + * Added _stream threshold_ setting for `res.sendfile()` + * Added `res.send()` __HEAD__ support + * Added `res.clearCookie()` + * Added `res.cookie()` + * Added `res.render()` headers option + * Added `res.redirect()` response bodies + * Added `res.render()` status option support. Closes #425 [thanks aheckmann] + * Fixed `res.sendfile()` responding with 403 on malicious path + * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_ + * Fixed; mounted apps settings now inherit from parent app [aheckmann] + * Fixed; stripping Content-Length / Content-Type when 204 + * Fixed `res.send()` 204. Closes #419 + * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402 + * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo] + + +1.0.0rc2 / 2010-08-17 +================== + + * Added `app.register()` for template engine mapping. Closes #390 + * Added `res.render()` callback support as second argument (no options) + * Added callback support to `res.download()` + * Added callback support for `res.sendfile()` + * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()` + * Added "partials" setting to docs + * Added default expresso tests to `express(1)` generated app. Closes #384 + * Fixed `res.sendfile()` error handling, defer via `next()` + * Fixed `res.render()` callback when a layout is used [thanks guillermo] + * Fixed; `make install` creating ~/.node_libraries when not present + * Fixed issue preventing error handlers from being defined anywhere. Closes #387 + +1.0.0rc / 2010-07-28 +================== + + * Added mounted hook. Closes #369 + * Added connect dependency to _package.json_ + + * Removed "reload views" setting and support code + development env never caches, production always caches. + + * Removed _param_ in route callbacks, signature is now + simply (req, res, next), previously (req, res, params, next). + Use _req.params_ for path captures, _req.query_ for GET params. + + * Fixed "home" setting + * Fixed middleware/router precedence issue. Closes #366 + * Fixed; _configure()_ callbacks called immediately. Closes #368 + +1.0.0beta2 / 2010-07-23 +================== + + * Added more examples + * Added; exporting `Server` constructor + * Added `Server#helpers()` for view locals + * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349 + * Added support for absolute view paths + * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363 + * Added Guillermo Rauch to the contributor list + * Added support for "as" for non-collection partials. Closes #341 + * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf] + * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo] + * Fixed instanceof `Array` checks, now `Array.isArray()` + * Fixed express(1) expansion of public dirs. Closes #348 + * Fixed middleware precedence. Closes #345 + * Fixed view watcher, now async [thanks aheckmann] + +1.0.0beta / 2010-07-15 +================== + + * Re-write + - much faster + - much lighter + - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs + +0.14.0 / 2010-06-15 +================== + + * Utilize relative requires + * Added Static bufferSize option [aheckmann] + * Fixed caching of view and partial subdirectories [aheckmann] + * Fixed mime.type() comments now that ".ext" is not supported + * Updated haml submodule + * Updated class submodule + * Removed bin/express + +0.13.0 / 2010-06-01 +================== + + * Added node v0.1.97 compatibility + * Added support for deleting cookies via Request#cookie('key', null) + * Updated haml submodule + * Fixed not-found page, now using using charset utf-8 + * Fixed show-exceptions page, now using using charset utf-8 + * Fixed view support due to fs.readFile Buffers + * Changed; mime.type() no longer accepts ".type" due to node extname() changes + +0.12.0 / 2010-05-22 +================== + + * Added node v0.1.96 compatibility + * Added view `helpers` export which act as additional local variables + * Updated haml submodule + * Changed ETag; removed inode, modified time only + * Fixed LF to CRLF for setting multiple cookies + * Fixed cookie compilation; values are now urlencoded + * Fixed cookies parsing; accepts quoted values and url escaped cookies + +0.11.0 / 2010-05-06 +================== + + * Added support for layouts using different engines + - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' }) + - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml' + - this.render('page.html.haml', { layout: false }) // no layout + * Updated ext submodule + * Updated haml submodule + * Fixed EJS partial support by passing along the context. Issue #307 + +0.10.1 / 2010-05-03 +================== + + * Fixed binary uploads. + +0.10.0 / 2010-04-30 +================== + + * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s + encoding is set to 'utf8' or 'utf-8'. + * Added "encoding" option to Request#render(). Closes #299 + * Added "dump exceptions" setting, which is enabled by default. + * Added simple ejs template engine support + * Added error response support for text/plain, application/json. Closes #297 + * Added callback function param to Request#error() + * Added Request#sendHead() + * Added Request#stream() + * Added support for Request#respond(304, null) for empty response bodies + * Added ETag support to Request#sendfile() + * Added options to Request#sendfile(), passed to fs.createReadStream() + * Added filename arg to Request#download() + * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request + * Performance enhanced by preventing several calls to toLowerCase() in Router#match() + * Changed; Request#sendfile() now streams + * Changed; Renamed Request#halt() to Request#respond(). Closes #289 + * Changed; Using sys.inspect() instead of JSON.encode() for error output + * Changed; run() returns the http.Server instance. Closes #298 + * Changed; Defaulting Server#host to null (INADDR_ANY) + * Changed; Logger "common" format scale of 0.4f + * Removed Logger "request" format + * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found + * Fixed several issues with http client + * Fixed Logger Content-Length output + * Fixed bug preventing Opera from retaining the generated session id. Closes #292 + +0.9.0 / 2010-04-14 +================== + + * Added DSL level error() route support + * Added DSL level notFound() route support + * Added Request#error() + * Added Request#notFound() + * Added Request#render() callback function. Closes #258 + * Added "max upload size" setting + * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254 + * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js + * Added callback function support to Request#halt() as 3rd/4th arg + * Added preprocessing of route param wildcards using param(). Closes #251 + * Added view partial support (with collections etc) + * Fixed bug preventing falsey params (such as ?page=0). Closes #286 + * Fixed setting of multiple cookies. Closes #199 + * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml) + * Changed; session cookie is now httpOnly + * Changed; Request is no longer global + * Changed; Event is no longer global + * Changed; "sys" module is no longer global + * Changed; moved Request#download to Static plugin where it belongs + * Changed; Request instance created before body parsing. Closes #262 + * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253 + * Changed; Pre-caching view partials in memory when "cache view partials" is enabled + * Updated support to node --version 0.1.90 + * Updated dependencies + * Removed set("session cookie") in favour of use(Session, { cookie: { ... }}) + * Removed utils.mixin(); use Object#mergeDeep() + +0.8.0 / 2010-03-19 +================== + + * Added coffeescript example app. Closes #242 + * Changed; cache api now async friendly. Closes #240 + * Removed deprecated 'express/static' support. Use 'express/plugins/static' + +0.7.6 / 2010-03-19 +================== + + * Added Request#isXHR. Closes #229 + * Added `make install` (for the executable) + * Added `express` executable for setting up simple app templates + * Added "GET /public/*" to Static plugin, defaulting to /public + * Added Static plugin + * Fixed; Request#render() only calls cache.get() once + * Fixed; Namespacing View caches with "view:" + * Fixed; Namespacing Static caches with "static:" + * Fixed; Both example apps now use the Static plugin + * Fixed set("views"). Closes #239 + * Fixed missing space for combined log format + * Deprecated Request#sendfile() and 'express/static' + * Removed Server#running + +0.7.5 / 2010-03-16 +================== + + * Added Request#flash() support without args, now returns all flashes + * Updated ext submodule + +0.7.4 / 2010-03-16 +================== + + * Fixed session reaper + * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft) + +0.7.3 / 2010-03-16 +================== + + * Added package.json + * Fixed requiring of haml / sass due to kiwi removal + +0.7.2 / 2010-03-16 +================== + + * Fixed GIT submodules (HAH!) + +0.7.1 / 2010-03-16 +================== + + * Changed; Express now using submodules again until a PM is adopted + * Changed; chat example using millisecond conversions from ext + +0.7.0 / 2010-03-15 +================== + + * Added Request#pass() support (finds the next matching route, or the given path) + * Added Logger plugin (default "common" format replaces CommonLogger) + * Removed Profiler plugin + * Removed CommonLogger plugin + +0.6.0 / 2010-03-11 +================== + + * Added seed.yml for kiwi package management support + * Added HTTP client query string support when method is GET. Closes #205 + + * Added support for arbitrary view engines. + For example "foo.engine.html" will now require('engine'), + the exports from this module are cached after the first require(). + + * Added async plugin support + + * Removed usage of RESTful route funcs as http client + get() etc, use http.get() and friends + + * Removed custom exceptions + +0.5.0 / 2010-03-10 +================== + + * Added ext dependency (library of js extensions) + * Removed extname() / basename() utils. Use path module + * Removed toArray() util. Use arguments.values + * Removed escapeRegexp() util. Use RegExp.escape() + * Removed process.mixin() dependency. Use utils.mixin() + * Removed Collection + * Removed ElementCollection + * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;) + +0.4.0 / 2010-02-11 +================== + + * Added flash() example to sample upload app + * Added high level restful http client module (express/http) + * Changed; RESTful route functions double as HTTP clients. Closes #69 + * Changed; throwing error when routes are added at runtime + * Changed; defaulting render() context to the current Request. Closes #197 + * Updated haml submodule + +0.3.0 / 2010-02-11 +================== + + * Updated haml / sass submodules. Closes #200 + * Added flash message support. Closes #64 + * Added accepts() now allows multiple args. fixes #117 + * Added support for plugins to halt. Closes #189 + * Added alternate layout support. Closes #119 + * Removed Route#run(). Closes #188 + * Fixed broken specs due to use(Cookie) missing + +0.2.1 / 2010-02-05 +================== + + * Added "plot" format option for Profiler (for gnuplot processing) + * Added request number to Profiler plugin + * Fixed binary encoding for multipart file uploads, was previously defaulting to UTF8 + * Fixed issue with routes not firing when not files are present. Closes #184 + * Fixed process.Promise -> events.Promise + +0.2.0 / 2010-02-03 +================== + + * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180 + * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174 + * Added expiration support to cache api with reaper. Closes #133 + * Added cache Store.Memory#reap() + * Added Cache; cache api now uses first class Cache instances + * Added abstract session Store. Closes #172 + * Changed; cache Memory.Store#get() utilizing Collection + * Renamed MemoryStore -> Store.Memory + * Fixed use() of the same plugin several time will always use latest options. Closes #176 + +0.1.0 / 2010-02-03 +================== + + * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context + * Updated node support to 0.1.27 Closes #169 + * Updated dirname(__filename) -> __dirname + * Updated libxmljs support to v0.2.0 + * Added session support with memory store / reaping + * Added quick uid() helper + * Added multi-part upload support + * Added Sass.js support / submodule + * Added production env caching view contents and static files + * Added static file caching. Closes #136 + * Added cache plugin with memory stores + * Added support to StaticFile so that it works with non-textual files. + * Removed dirname() helper + * Removed several globals (now their modules must be required) + +0.0.2 / 2010-01-10 +================== + + * Added view benchmarks; currently haml vs ejs + * Added Request#attachment() specs. Closes #116 + * Added use of node's parseQuery() util. Closes #123 + * Added `make init` for submodules + * Updated Haml + * Updated sample chat app to show messages on load + * Updated libxmljs parseString -> parseHtmlString + * Fixed `make init` to work with older versions of git + * Fixed specs can now run independent specs for those who can't build deps. Closes #127 + * Fixed issues introduced by the node url module changes. Closes 126. + * Fixed two assertions failing due to Collection#keys() returning strings + * Fixed faulty Collection#toArray() spec due to keys() returning strings + * Fixed `make test` now builds libxmljs.node before testing + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/express/LICENSE b/node_modules/express/LICENSE new file mode 100644 index 00000000..aa927e44 --- /dev/null +++ b/node_modules/express/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2009-2014 TJ Holowaychuk +Copyright (c) 2013-2014 Roman Shtylman +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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/node_modules/express/Readme.md b/node_modules/express/Readme.md new file mode 100644 index 00000000..1f912973 --- /dev/null +++ b/node_modules/express/Readme.md @@ -0,0 +1,155 @@ +[![Express Logo](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)](http://expressjs.com/) + + Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). + + [![NPM Version][npm-image]][npm-url] + [![NPM Downloads][downloads-image]][downloads-url] + [![Linux Build][travis-image]][travis-url] + [![Windows Build][appveyor-image]][appveyor-url] + [![Test Coverage][coveralls-image]][coveralls-url] + +```js +const express = require('express') +const app = express() + +app.get('/', function (req, res) { + res.send('Hello World') +}) + +app.listen(3000) +``` + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). + +Before installing, [download and install Node.js](https://nodejs.org/en/download/). +Node.js 0.10 or higher is required. + +Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```bash +$ npm install express +``` + +Follow [our installing guide](http://expressjs.com/en/starter/installing.html) +for more information. + +## Features + + * Robust routing + * Focus on high performance + * Super-high test coverage + * HTTP helpers (redirection, caching, etc) + * View system supporting 14+ template engines + * Content negotiation + * Executable for generating applications quickly + +## Docs & Community + + * [Website and Documentation](http://expressjs.com/) - [[website repo](https://github.com/expressjs/expressjs.com)] + * [#express](https://webchat.freenode.net/?channels=express) on freenode IRC + * [GitHub Organization](https://github.com/expressjs) for Official Middleware & Modules + * Visit the [Wiki](https://github.com/expressjs/express/wiki) + * [Google Group](https://groups.google.com/group/express-js) for discussion + * [Gitter](https://gitter.im/expressjs/express) for support and discussion + +**PROTIP** Be sure to read [Migrating from 3.x to 4.x](https://github.com/expressjs/express/wiki/Migrating-from-3.x-to-4.x) as well as [New features in 4.x](https://github.com/expressjs/express/wiki/New-features-in-4.x). + +### Security Issues + +If you discover a security vulnerability in Express, please see [Security Policies and Procedures](Security.md). + +## Quick Start + + The quickest way to get started with express is to utilize the executable [`express(1)`](https://github.com/expressjs/generator) to generate an application as shown below: + + Install the executable. The executable's major version will match Express's: + +```bash +$ npm install -g express-generator@4 +``` + + Create the app: + +```bash +$ express /tmp/foo && cd /tmp/foo +``` + + Install dependencies: + +```bash +$ npm install +``` + + Start the server: + +```bash +$ npm start +``` + + View the website at: http://localhost:3000 + +## Philosophy + + The Express philosophy is to provide small, robust tooling for HTTP servers, making + it a great solution for single page applications, web sites, hybrids, or public + HTTP APIs. + + Express does not force you to use any specific ORM or template engine. With support for over + 14 template engines via [Consolidate.js](https://github.com/tj/consolidate.js), + you can quickly craft your perfect framework. + +## Examples + + To view the examples, clone the Express repo and install the dependencies: + +```bash +$ git clone git://github.com/expressjs/express.git --depth 1 +$ cd express +$ npm install +``` + + Then run whichever example you want: + +```bash +$ node examples/content-negotiation +``` + +## Tests + + To run the test suite, first install the dependencies, then run `npm test`: + +```bash +$ npm install +$ npm test +``` + +## Contributing + +[Contributing Guide](Contributing.md) + +## People + +The original author of Express is [TJ Holowaychuk](https://github.com/tj) + +The current lead maintainer is [Douglas Christopher Wilson](https://github.com/dougwilson) + +[List of all contributors](https://github.com/expressjs/express/graphs/contributors) + +## License + + [MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/express.svg +[npm-url]: https://npmjs.org/package/express +[downloads-image]: https://img.shields.io/npm/dm/express.svg +[downloads-url]: https://npmjs.org/package/express +[travis-image]: https://img.shields.io/travis/expressjs/express/master.svg?label=linux +[travis-url]: https://travis-ci.org/expressjs/express +[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/express/master.svg?label=windows +[appveyor-url]: https://ci.appveyor.com/project/dougwilson/express +[coveralls-image]: https://img.shields.io/coveralls/expressjs/express/master.svg +[coveralls-url]: https://coveralls.io/r/expressjs/express?branch=master diff --git a/node_modules/express/index.js b/node_modules/express/index.js new file mode 100644 index 00000000..d219b0c8 --- /dev/null +++ b/node_modules/express/index.js @@ -0,0 +1,11 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2013 Roman Shtylman + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +module.exports = require('./lib/express'); diff --git a/node_modules/express/lib/application.js b/node_modules/express/lib/application.js new file mode 100644 index 00000000..91f77d24 --- /dev/null +++ b/node_modules/express/lib/application.js @@ -0,0 +1,644 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2013 Roman Shtylman + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + * @private + */ + +var finalhandler = require('finalhandler'); +var Router = require('./router'); +var methods = require('methods'); +var middleware = require('./middleware/init'); +var query = require('./middleware/query'); +var debug = require('debug')('express:application'); +var View = require('./view'); +var http = require('http'); +var compileETag = require('./utils').compileETag; +var compileQueryParser = require('./utils').compileQueryParser; +var compileTrust = require('./utils').compileTrust; +var deprecate = require('depd')('express'); +var flatten = require('array-flatten'); +var merge = require('utils-merge'); +var resolve = require('path').resolve; +var setPrototypeOf = require('setprototypeof') +var slice = Array.prototype.slice; + +/** + * Application prototype. + */ + +var app = exports = module.exports = {}; + +/** + * Variable for trust proxy inheritance back-compat + * @private + */ + +var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default'; + +/** + * Initialize the server. + * + * - setup default configuration + * - setup default middleware + * - setup route reflection methods + * + * @private + */ + +app.init = function init() { + this.cache = {}; + this.engines = {}; + this.settings = {}; + + this.defaultConfiguration(); +}; + +/** + * Initialize application configuration. + * @private + */ + +app.defaultConfiguration = function defaultConfiguration() { + var env = process.env.NODE_ENV || 'development'; + + // default settings + this.enable('x-powered-by'); + this.set('etag', 'weak'); + this.set('env', env); + this.set('query parser', 'extended'); + this.set('subdomain offset', 2); + this.set('trust proxy', false); + + // trust proxy inherit back-compat + Object.defineProperty(this.settings, trustProxyDefaultSymbol, { + configurable: true, + value: true + }); + + debug('booting in %s mode', env); + + this.on('mount', function onmount(parent) { + // inherit trust proxy + if (this.settings[trustProxyDefaultSymbol] === true + && typeof parent.settings['trust proxy fn'] === 'function') { + delete this.settings['trust proxy']; + delete this.settings['trust proxy fn']; + } + + // inherit protos + setPrototypeOf(this.request, parent.request) + setPrototypeOf(this.response, parent.response) + setPrototypeOf(this.engines, parent.engines) + setPrototypeOf(this.settings, parent.settings) + }); + + // setup locals + this.locals = Object.create(null); + + // top-most app is mounted at / + this.mountpath = '/'; + + // default locals + this.locals.settings = this.settings; + + // default configuration + this.set('view', View); + this.set('views', resolve('views')); + this.set('jsonp callback name', 'callback'); + + if (env === 'production') { + this.enable('view cache'); + } + + Object.defineProperty(this, 'router', { + get: function() { + throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.'); + } + }); +}; + +/** + * lazily adds the base router if it has not yet been added. + * + * We cannot add the base router in the defaultConfiguration because + * it reads app settings which might be set after that has run. + * + * @private + */ +app.lazyrouter = function lazyrouter() { + if (!this._router) { + this._router = new Router({ + caseSensitive: this.enabled('case sensitive routing'), + strict: this.enabled('strict routing') + }); + + this._router.use(query(this.get('query parser fn'))); + this._router.use(middleware.init(this)); + } +}; + +/** + * Dispatch a req, res pair into the application. Starts pipeline processing. + * + * If no callback is provided, then default error handlers will respond + * in the event of an error bubbling through the stack. + * + * @private + */ + +app.handle = function handle(req, res, callback) { + var router = this._router; + + // final handler + var done = callback || finalhandler(req, res, { + env: this.get('env'), + onerror: logerror.bind(this) + }); + + // no routes + if (!router) { + debug('no routes defined on app'); + done(); + return; + } + + router.handle(req, res, done); +}; + +/** + * Proxy `Router#use()` to add middleware to the app router. + * See Router#use() documentation for details. + * + * If the _fn_ parameter is an express app, then it will be + * mounted at the _route_ specified. + * + * @public + */ + +app.use = function use(fn) { + var offset = 0; + var path = '/'; + + // default path to '/' + // disambiguate app.use([fn]) + if (typeof fn !== 'function') { + var arg = fn; + + while (Array.isArray(arg) && arg.length !== 0) { + arg = arg[0]; + } + + // first arg is the path + if (typeof arg !== 'function') { + offset = 1; + path = fn; + } + } + + var fns = flatten(slice.call(arguments, offset)); + + if (fns.length === 0) { + throw new TypeError('app.use() requires a middleware function') + } + + // setup router + this.lazyrouter(); + var router = this._router; + + fns.forEach(function (fn) { + // non-express app + if (!fn || !fn.handle || !fn.set) { + return router.use(path, fn); + } + + debug('.use app under %s', path); + fn.mountpath = path; + fn.parent = this; + + // restore .app property on req and res + router.use(path, function mounted_app(req, res, next) { + var orig = req.app; + fn.handle(req, res, function (err) { + setPrototypeOf(req, orig.request) + setPrototypeOf(res, orig.response) + next(err); + }); + }); + + // mounted an app + fn.emit('mount', this); + }, this); + + return this; +}; + +/** + * Proxy to the app `Router#route()` + * Returns a new `Route` instance for the _path_. + * + * Routes are isolated middleware stacks for specific paths. + * See the Route api docs for details. + * + * @public + */ + +app.route = function route(path) { + this.lazyrouter(); + return this._router.route(path); +}; + +/** + * Register the given template engine callback `fn` + * as `ext`. + * + * By default will `require()` the engine based on the + * file extension. For example if you try to render + * a "foo.ejs" file Express will invoke the following internally: + * + * app.engine('ejs', require('ejs').__express); + * + * For engines that do not provide `.__express` out of the box, + * or if you wish to "map" a different extension to the template engine + * you may use this method. For example mapping the EJS template engine to + * ".html" files: + * + * app.engine('html', require('ejs').renderFile); + * + * In this case EJS provides a `.renderFile()` method with + * the same signature that Express expects: `(path, options, callback)`, + * though note that it aliases this method as `ejs.__express` internally + * so if you're using ".ejs" extensions you dont need to do anything. + * + * Some template engines do not follow this convention, the + * [Consolidate.js](https://github.com/tj/consolidate.js) + * library was created to map all of node's popular template + * engines to follow this convention, thus allowing them to + * work seamlessly within Express. + * + * @param {String} ext + * @param {Function} fn + * @return {app} for chaining + * @public + */ + +app.engine = function engine(ext, fn) { + if (typeof fn !== 'function') { + throw new Error('callback function required'); + } + + // get file extension + var extension = ext[0] !== '.' + ? '.' + ext + : ext; + + // store engine + this.engines[extension] = fn; + + return this; +}; + +/** + * Proxy to `Router#param()` with one added api feature. The _name_ parameter + * can be an array of names. + * + * See the Router#param() docs for more details. + * + * @param {String|Array} name + * @param {Function} fn + * @return {app} for chaining + * @public + */ + +app.param = function param(name, fn) { + this.lazyrouter(); + + if (Array.isArray(name)) { + for (var i = 0; i < name.length; i++) { + this.param(name[i], fn); + } + + return this; + } + + this._router.param(name, fn); + + return this; +}; + +/** + * Assign `setting` to `val`, or return `setting`'s value. + * + * app.set('foo', 'bar'); + * app.set('foo'); + * // => "bar" + * + * Mounted servers inherit their parent server's settings. + * + * @param {String} setting + * @param {*} [val] + * @return {Server} for chaining + * @public + */ + +app.set = function set(setting, val) { + if (arguments.length === 1) { + // app.get(setting) + return this.settings[setting]; + } + + debug('set "%s" to %o', setting, val); + + // set value + this.settings[setting] = val; + + // trigger matched settings + switch (setting) { + case 'etag': + this.set('etag fn', compileETag(val)); + break; + case 'query parser': + this.set('query parser fn', compileQueryParser(val)); + break; + case 'trust proxy': + this.set('trust proxy fn', compileTrust(val)); + + // trust proxy inherit back-compat + Object.defineProperty(this.settings, trustProxyDefaultSymbol, { + configurable: true, + value: false + }); + + break; + } + + return this; +}; + +/** + * Return the app's absolute pathname + * based on the parent(s) that have + * mounted it. + * + * For example if the application was + * mounted as "/admin", which itself + * was mounted as "/blog" then the + * return value would be "/blog/admin". + * + * @return {String} + * @private + */ + +app.path = function path() { + return this.parent + ? this.parent.path() + this.mountpath + : ''; +}; + +/** + * Check if `setting` is enabled (truthy). + * + * app.enabled('foo') + * // => false + * + * app.enable('foo') + * app.enabled('foo') + * // => true + * + * @param {String} setting + * @return {Boolean} + * @public + */ + +app.enabled = function enabled(setting) { + return Boolean(this.set(setting)); +}; + +/** + * Check if `setting` is disabled. + * + * app.disabled('foo') + * // => true + * + * app.enable('foo') + * app.disabled('foo') + * // => false + * + * @param {String} setting + * @return {Boolean} + * @public + */ + +app.disabled = function disabled(setting) { + return !this.set(setting); +}; + +/** + * Enable `setting`. + * + * @param {String} setting + * @return {app} for chaining + * @public + */ + +app.enable = function enable(setting) { + return this.set(setting, true); +}; + +/** + * Disable `setting`. + * + * @param {String} setting + * @return {app} for chaining + * @public + */ + +app.disable = function disable(setting) { + return this.set(setting, false); +}; + +/** + * Delegate `.VERB(...)` calls to `router.VERB(...)`. + */ + +methods.forEach(function(method){ + app[method] = function(path){ + if (method === 'get' && arguments.length === 1) { + // app.get(setting) + return this.set(path); + } + + this.lazyrouter(); + + var route = this._router.route(path); + route[method].apply(route, slice.call(arguments, 1)); + return this; + }; +}); + +/** + * Special-cased "all" method, applying the given route `path`, + * middleware, and callback to _every_ HTTP method. + * + * @param {String} path + * @param {Function} ... + * @return {app} for chaining + * @public + */ + +app.all = function all(path) { + this.lazyrouter(); + + var route = this._router.route(path); + var args = slice.call(arguments, 1); + + for (var i = 0; i < methods.length; i++) { + route[methods[i]].apply(route, args); + } + + return this; +}; + +// del -> delete alias + +app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead'); + +/** + * Render the given view `name` name with `options` + * and a callback accepting an error and the + * rendered template string. + * + * Example: + * + * app.render('email', { name: 'Tobi' }, function(err, html){ + * // ... + * }) + * + * @param {String} name + * @param {Object|Function} options or fn + * @param {Function} callback + * @public + */ + +app.render = function render(name, options, callback) { + var cache = this.cache; + var done = callback; + var engines = this.engines; + var opts = options; + var renderOptions = {}; + var view; + + // support callback function as second arg + if (typeof options === 'function') { + done = options; + opts = {}; + } + + // merge app.locals + merge(renderOptions, this.locals); + + // merge options._locals + if (opts._locals) { + merge(renderOptions, opts._locals); + } + + // merge options + merge(renderOptions, opts); + + // set .cache unless explicitly provided + if (renderOptions.cache == null) { + renderOptions.cache = this.enabled('view cache'); + } + + // primed cache + if (renderOptions.cache) { + view = cache[name]; + } + + // view + if (!view) { + var View = this.get('view'); + + view = new View(name, { + defaultEngine: this.get('view engine'), + root: this.get('views'), + engines: engines + }); + + if (!view.path) { + var dirs = Array.isArray(view.root) && view.root.length > 1 + ? 'directories "' + view.root.slice(0, -1).join('", "') + '" or "' + view.root[view.root.length - 1] + '"' + : 'directory "' + view.root + '"' + var err = new Error('Failed to lookup view "' + name + '" in views ' + dirs); + err.view = view; + return done(err); + } + + // prime the cache + if (renderOptions.cache) { + cache[name] = view; + } + } + + // render + tryRender(view, renderOptions, done); +}; + +/** + * Listen for connections. + * + * A node `http.Server` is returned, with this + * application (which is a `Function`) as its + * callback. If you wish to create both an HTTP + * and HTTPS server you may do so with the "http" + * and "https" modules as shown here: + * + * var http = require('http') + * , https = require('https') + * , express = require('express') + * , app = express(); + * + * http.createServer(app).listen(80); + * https.createServer({ ... }, app).listen(443); + * + * @return {http.Server} + * @public + */ + +app.listen = function listen() { + var server = http.createServer(this); + return server.listen.apply(server, arguments); +}; + +/** + * Log error using console.error. + * + * @param {Error} err + * @private + */ + +function logerror(err) { + /* istanbul ignore next */ + if (this.get('env') !== 'test') console.error(err.stack || err.toString()); +} + +/** + * Try rendering a view. + * @private + */ + +function tryRender(view, options, callback) { + try { + view.render(options, callback); + } catch (err) { + callback(err); + } +} diff --git a/node_modules/express/lib/express.js b/node_modules/express/lib/express.js new file mode 100644 index 00000000..d188a16d --- /dev/null +++ b/node_modules/express/lib/express.js @@ -0,0 +1,116 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2013 Roman Shtylman + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + */ + +var bodyParser = require('body-parser') +var EventEmitter = require('events').EventEmitter; +var mixin = require('merge-descriptors'); +var proto = require('./application'); +var Route = require('./router/route'); +var Router = require('./router'); +var req = require('./request'); +var res = require('./response'); + +/** + * Expose `createApplication()`. + */ + +exports = module.exports = createApplication; + +/** + * Create an express application. + * + * @return {Function} + * @api public + */ + +function createApplication() { + var app = function(req, res, next) { + app.handle(req, res, next); + }; + + mixin(app, EventEmitter.prototype, false); + mixin(app, proto, false); + + // expose the prototype that will get set on requests + app.request = Object.create(req, { + app: { configurable: true, enumerable: true, writable: true, value: app } + }) + + // expose the prototype that will get set on responses + app.response = Object.create(res, { + app: { configurable: true, enumerable: true, writable: true, value: app } + }) + + app.init(); + return app; +} + +/** + * Expose the prototypes. + */ + +exports.application = proto; +exports.request = req; +exports.response = res; + +/** + * Expose constructors. + */ + +exports.Route = Route; +exports.Router = Router; + +/** + * Expose middleware + */ + +exports.json = bodyParser.json +exports.query = require('./middleware/query'); +exports.raw = bodyParser.raw +exports.static = require('serve-static'); +exports.text = bodyParser.text +exports.urlencoded = bodyParser.urlencoded + +/** + * Replace removed middleware with an appropriate error message. + */ + +var removedMiddlewares = [ + 'bodyParser', + 'compress', + 'cookieSession', + 'session', + 'logger', + 'cookieParser', + 'favicon', + 'responseTime', + 'errorHandler', + 'timeout', + 'methodOverride', + 'vhost', + 'csrf', + 'directory', + 'limit', + 'multipart', + 'staticCache' +] + +removedMiddlewares.forEach(function (name) { + Object.defineProperty(exports, name, { + get: function () { + throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.'); + }, + configurable: true + }); +}); diff --git a/node_modules/express/lib/middleware/init.js b/node_modules/express/lib/middleware/init.js new file mode 100644 index 00000000..dfd04274 --- /dev/null +++ b/node_modules/express/lib/middleware/init.js @@ -0,0 +1,43 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2013 Roman Shtylman + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + * @private + */ + +var setPrototypeOf = require('setprototypeof') + +/** + * Initialization middleware, exposing the + * request and response to each other, as well + * as defaulting the X-Powered-By header field. + * + * @param {Function} app + * @return {Function} + * @api private + */ + +exports.init = function(app){ + return function expressInit(req, res, next){ + if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); + req.res = res; + res.req = req; + req.next = next; + + setPrototypeOf(req, app.request) + setPrototypeOf(res, app.response) + + res.locals = res.locals || Object.create(null); + + next(); + }; +}; + diff --git a/node_modules/express/lib/middleware/query.js b/node_modules/express/lib/middleware/query.js new file mode 100644 index 00000000..7e916694 --- /dev/null +++ b/node_modules/express/lib/middleware/query.js @@ -0,0 +1,47 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2013 Roman Shtylman + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + */ + +var merge = require('utils-merge') +var parseUrl = require('parseurl'); +var qs = require('qs'); + +/** + * @param {Object} options + * @return {Function} + * @api public + */ + +module.exports = function query(options) { + var opts = merge({}, options) + var queryparse = qs.parse; + + if (typeof options === 'function') { + queryparse = options; + opts = undefined; + } + + if (opts !== undefined && opts.allowPrototypes === undefined) { + // back-compat for qs module + opts.allowPrototypes = true; + } + + return function query(req, res, next){ + if (!req.query) { + var val = parseUrl(req).query; + req.query = queryparse(val, opts); + } + + next(); + }; +}; diff --git a/node_modules/express/lib/request.js b/node_modules/express/lib/request.js new file mode 100644 index 00000000..a9400ef9 --- /dev/null +++ b/node_modules/express/lib/request.js @@ -0,0 +1,525 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2013 Roman Shtylman + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + * @private + */ + +var accepts = require('accepts'); +var deprecate = require('depd')('express'); +var isIP = require('net').isIP; +var typeis = require('type-is'); +var http = require('http'); +var fresh = require('fresh'); +var parseRange = require('range-parser'); +var parse = require('parseurl'); +var proxyaddr = require('proxy-addr'); + +/** + * Request prototype. + * @public + */ + +var req = Object.create(http.IncomingMessage.prototype) + +/** + * Module exports. + * @public + */ + +module.exports = req + +/** + * Return request header. + * + * The `Referrer` header field is special-cased, + * both `Referrer` and `Referer` are interchangeable. + * + * Examples: + * + * req.get('Content-Type'); + * // => "text/plain" + * + * req.get('content-type'); + * // => "text/plain" + * + * req.get('Something'); + * // => undefined + * + * Aliased as `req.header()`. + * + * @param {String} name + * @return {String} + * @public + */ + +req.get = +req.header = function header(name) { + if (!name) { + throw new TypeError('name argument is required to req.get'); + } + + if (typeof name !== 'string') { + throw new TypeError('name must be a string to req.get'); + } + + var lc = name.toLowerCase(); + + switch (lc) { + case 'referer': + case 'referrer': + return this.headers.referrer + || this.headers.referer; + default: + return this.headers[lc]; + } +}; + +/** + * To do: update docs. + * + * Check if the given `type(s)` is acceptable, returning + * the best match when true, otherwise `undefined`, in which + * case you should respond with 406 "Not Acceptable". + * + * The `type` value may be a single MIME type string + * such as "application/json", an extension name + * such as "json", a comma-delimited list such as "json, html, text/plain", + * an argument list such as `"json", "html", "text/plain"`, + * or an array `["json", "html", "text/plain"]`. When a list + * or array is given, the _best_ match, if any is returned. + * + * Examples: + * + * // Accept: text/html + * req.accepts('html'); + * // => "html" + * + * // Accept: text/*, application/json + * req.accepts('html'); + * // => "html" + * req.accepts('text/html'); + * // => "text/html" + * req.accepts('json, text'); + * // => "json" + * req.accepts('application/json'); + * // => "application/json" + * + * // Accept: text/*, application/json + * req.accepts('image/png'); + * req.accepts('png'); + * // => undefined + * + * // Accept: text/*;q=.5, application/json + * req.accepts(['html', 'json']); + * req.accepts('html', 'json'); + * req.accepts('html, json'); + * // => "json" + * + * @param {String|Array} type(s) + * @return {String|Array|Boolean} + * @public + */ + +req.accepts = function(){ + var accept = accepts(this); + return accept.types.apply(accept, arguments); +}; + +/** + * Check if the given `encoding`s are accepted. + * + * @param {String} ...encoding + * @return {String|Array} + * @public + */ + +req.acceptsEncodings = function(){ + var accept = accepts(this); + return accept.encodings.apply(accept, arguments); +}; + +req.acceptsEncoding = deprecate.function(req.acceptsEncodings, + 'req.acceptsEncoding: Use acceptsEncodings instead'); + +/** + * Check if the given `charset`s are acceptable, + * otherwise you should respond with 406 "Not Acceptable". + * + * @param {String} ...charset + * @return {String|Array} + * @public + */ + +req.acceptsCharsets = function(){ + var accept = accepts(this); + return accept.charsets.apply(accept, arguments); +}; + +req.acceptsCharset = deprecate.function(req.acceptsCharsets, + 'req.acceptsCharset: Use acceptsCharsets instead'); + +/** + * Check if the given `lang`s are acceptable, + * otherwise you should respond with 406 "Not Acceptable". + * + * @param {String} ...lang + * @return {String|Array} + * @public + */ + +req.acceptsLanguages = function(){ + var accept = accepts(this); + return accept.languages.apply(accept, arguments); +}; + +req.acceptsLanguage = deprecate.function(req.acceptsLanguages, + 'req.acceptsLanguage: Use acceptsLanguages instead'); + +/** + * Parse Range header field, capping to the given `size`. + * + * Unspecified ranges such as "0-" require knowledge of your resource length. In + * the case of a byte range this is of course the total number of bytes. If the + * Range header field is not given `undefined` is returned, `-1` when unsatisfiable, + * and `-2` when syntactically invalid. + * + * When ranges are returned, the array has a "type" property which is the type of + * range that is required (most commonly, "bytes"). Each array element is an object + * with a "start" and "end" property for the portion of the range. + * + * The "combine" option can be set to `true` and overlapping & adjacent ranges + * will be combined into a single range. + * + * NOTE: remember that ranges are inclusive, so for example "Range: users=0-3" + * should respond with 4 users when available, not 3. + * + * @param {number} size + * @param {object} [options] + * @param {boolean} [options.combine=false] + * @return {number|array} + * @public + */ + +req.range = function range(size, options) { + var range = this.get('Range'); + if (!range) return; + return parseRange(size, range, options); +}; + +/** + * Return the value of param `name` when present or `defaultValue`. + * + * - Checks route placeholders, ex: _/user/:id_ + * - Checks body params, ex: id=12, {"id":12} + * - Checks query string params, ex: ?id=12 + * + * To utilize request bodies, `req.body` + * should be an object. This can be done by using + * the `bodyParser()` middleware. + * + * @param {String} name + * @param {Mixed} [defaultValue] + * @return {String} + * @public + */ + +req.param = function param(name, defaultValue) { + var params = this.params || {}; + var body = this.body || {}; + var query = this.query || {}; + + var args = arguments.length === 1 + ? 'name' + : 'name, default'; + deprecate('req.param(' + args + '): Use req.params, req.body, or req.query instead'); + + if (null != params[name] && params.hasOwnProperty(name)) return params[name]; + if (null != body[name]) return body[name]; + if (null != query[name]) return query[name]; + + return defaultValue; +}; + +/** + * Check if the incoming request contains the "Content-Type" + * header field, and it contains the give mime `type`. + * + * Examples: + * + * // With Content-Type: text/html; charset=utf-8 + * req.is('html'); + * req.is('text/html'); + * req.is('text/*'); + * // => true + * + * // When Content-Type is application/json + * req.is('json'); + * req.is('application/json'); + * req.is('application/*'); + * // => true + * + * req.is('html'); + * // => false + * + * @param {String|Array} types... + * @return {String|false|null} + * @public + */ + +req.is = function is(types) { + var arr = types; + + // support flattened arguments + if (!Array.isArray(types)) { + arr = new Array(arguments.length); + for (var i = 0; i < arr.length; i++) { + arr[i] = arguments[i]; + } + } + + return typeis(this, arr); +}; + +/** + * Return the protocol string "http" or "https" + * when requested with TLS. When the "trust proxy" + * setting trusts the socket address, the + * "X-Forwarded-Proto" header field will be trusted + * and used if present. + * + * If you're running behind a reverse proxy that + * supplies https for you this may be enabled. + * + * @return {String} + * @public + */ + +defineGetter(req, 'protocol', function protocol(){ + var proto = this.connection.encrypted + ? 'https' + : 'http'; + var trust = this.app.get('trust proxy fn'); + + if (!trust(this.connection.remoteAddress, 0)) { + return proto; + } + + // Note: X-Forwarded-Proto is normally only ever a + // single value, but this is to be safe. + var header = this.get('X-Forwarded-Proto') || proto + var index = header.indexOf(',') + + return index !== -1 + ? header.substring(0, index).trim() + : header.trim() +}); + +/** + * Short-hand for: + * + * req.protocol === 'https' + * + * @return {Boolean} + * @public + */ + +defineGetter(req, 'secure', function secure(){ + return this.protocol === 'https'; +}); + +/** + * Return the remote address from the trusted proxy. + * + * The is the remote address on the socket unless + * "trust proxy" is set. + * + * @return {String} + * @public + */ + +defineGetter(req, 'ip', function ip(){ + var trust = this.app.get('trust proxy fn'); + return proxyaddr(this, trust); +}); + +/** + * When "trust proxy" is set, trusted proxy addresses + client. + * + * For example if the value were "client, proxy1, proxy2" + * you would receive the array `["client", "proxy1", "proxy2"]` + * where "proxy2" is the furthest down-stream and "proxy1" and + * "proxy2" were trusted. + * + * @return {Array} + * @public + */ + +defineGetter(req, 'ips', function ips() { + var trust = this.app.get('trust proxy fn'); + var addrs = proxyaddr.all(this, trust); + + // reverse the order (to farthest -> closest) + // and remove socket address + addrs.reverse().pop() + + return addrs +}); + +/** + * Return subdomains as an array. + * + * Subdomains are the dot-separated parts of the host before the main domain of + * the app. By default, the domain of the app is assumed to be the last two + * parts of the host. This can be changed by setting "subdomain offset". + * + * For example, if the domain is "tobi.ferrets.example.com": + * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. + * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. + * + * @return {Array} + * @public + */ + +defineGetter(req, 'subdomains', function subdomains() { + var hostname = this.hostname; + + if (!hostname) return []; + + var offset = this.app.get('subdomain offset'); + var subdomains = !isIP(hostname) + ? hostname.split('.').reverse() + : [hostname]; + + return subdomains.slice(offset); +}); + +/** + * Short-hand for `url.parse(req.url).pathname`. + * + * @return {String} + * @public + */ + +defineGetter(req, 'path', function path() { + return parse(this).pathname; +}); + +/** + * Parse the "Host" header field to a hostname. + * + * When the "trust proxy" setting trusts the socket + * address, the "X-Forwarded-Host" header field will + * be trusted. + * + * @return {String} + * @public + */ + +defineGetter(req, 'hostname', function hostname(){ + var trust = this.app.get('trust proxy fn'); + var host = this.get('X-Forwarded-Host'); + + if (!host || !trust(this.connection.remoteAddress, 0)) { + host = this.get('Host'); + } else if (host.indexOf(',') !== -1) { + // Note: X-Forwarded-Host is normally only ever a + // single value, but this is to be safe. + host = host.substring(0, host.indexOf(',')).trimRight() + } + + if (!host) return; + + // IPv6 literal support + var offset = host[0] === '[' + ? host.indexOf(']') + 1 + : 0; + var index = host.indexOf(':', offset); + + return index !== -1 + ? host.substring(0, index) + : host; +}); + +// TODO: change req.host to return host in next major + +defineGetter(req, 'host', deprecate.function(function host(){ + return this.hostname; +}, 'req.host: Use req.hostname instead')); + +/** + * Check if the request is fresh, aka + * Last-Modified and/or the ETag + * still match. + * + * @return {Boolean} + * @public + */ + +defineGetter(req, 'fresh', function(){ + var method = this.method; + var res = this.res + var status = res.statusCode + + // GET or HEAD for weak freshness validation only + if ('GET' !== method && 'HEAD' !== method) return false; + + // 2xx or 304 as per rfc2616 14.26 + if ((status >= 200 && status < 300) || 304 === status) { + return fresh(this.headers, { + 'etag': res.get('ETag'), + 'last-modified': res.get('Last-Modified') + }) + } + + return false; +}); + +/** + * Check if the request is stale, aka + * "Last-Modified" and / or the "ETag" for the + * resource has changed. + * + * @return {Boolean} + * @public + */ + +defineGetter(req, 'stale', function stale(){ + return !this.fresh; +}); + +/** + * Check if the request was an _XMLHttpRequest_. + * + * @return {Boolean} + * @public + */ + +defineGetter(req, 'xhr', function xhr(){ + var val = this.get('X-Requested-With') || ''; + return val.toLowerCase() === 'xmlhttprequest'; +}); + +/** + * Helper function for creating a getter on an object. + * + * @param {Object} obj + * @param {String} name + * @param {Function} getter + * @private + */ +function defineGetter(obj, name, getter) { + Object.defineProperty(obj, name, { + configurable: true, + enumerable: true, + get: getter + }); +} diff --git a/node_modules/express/lib/response.js b/node_modules/express/lib/response.js new file mode 100644 index 00000000..c9f08cd5 --- /dev/null +++ b/node_modules/express/lib/response.js @@ -0,0 +1,1142 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + * @private + */ + +var Buffer = require('safe-buffer').Buffer +var contentDisposition = require('content-disposition'); +var deprecate = require('depd')('express'); +var encodeUrl = require('encodeurl'); +var escapeHtml = require('escape-html'); +var http = require('http'); +var isAbsolute = require('./utils').isAbsolute; +var onFinished = require('on-finished'); +var path = require('path'); +var statuses = require('statuses') +var merge = require('utils-merge'); +var sign = require('cookie-signature').sign; +var normalizeType = require('./utils').normalizeType; +var normalizeTypes = require('./utils').normalizeTypes; +var setCharset = require('./utils').setCharset; +var cookie = require('cookie'); +var send = require('send'); +var extname = path.extname; +var mime = send.mime; +var resolve = path.resolve; +var vary = require('vary'); + +/** + * Response prototype. + * @public + */ + +var res = Object.create(http.ServerResponse.prototype) + +/** + * Module exports. + * @public + */ + +module.exports = res + +/** + * Module variables. + * @private + */ + +var charsetRegExp = /;\s*charset\s*=/; + +/** + * Set status `code`. + * + * @param {Number} code + * @return {ServerResponse} + * @public + */ + +res.status = function status(code) { + this.statusCode = code; + return this; +}; + +/** + * Set Link header field with the given `links`. + * + * Examples: + * + * res.links({ + * next: 'http://api.example.com/users?page=2', + * last: 'http://api.example.com/users?page=5' + * }); + * + * @param {Object} links + * @return {ServerResponse} + * @public + */ + +res.links = function(links){ + var link = this.get('Link') || ''; + if (link) link += ', '; + return this.set('Link', link + Object.keys(links).map(function(rel){ + return '<' + links[rel] + '>; rel="' + rel + '"'; + }).join(', ')); +}; + +/** + * Send a response. + * + * Examples: + * + * res.send(Buffer.from('wahoo')); + * res.send({ some: 'json' }); + * res.send('

some html

'); + * + * @param {string|number|boolean|object|Buffer} body + * @public + */ + +res.send = function send(body) { + var chunk = body; + var encoding; + var req = this.req; + var type; + + // settings + var app = this.app; + + // allow status / body + if (arguments.length === 2) { + // res.send(body, status) backwards compat + if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') { + deprecate('res.send(body, status): Use res.status(status).send(body) instead'); + this.statusCode = arguments[1]; + } else { + deprecate('res.send(status, body): Use res.status(status).send(body) instead'); + this.statusCode = arguments[0]; + chunk = arguments[1]; + } + } + + // disambiguate res.send(status) and res.send(status, num) + if (typeof chunk === 'number' && arguments.length === 1) { + // res.send(status) will set status message as text string + if (!this.get('Content-Type')) { + this.type('txt'); + } + + deprecate('res.send(status): Use res.sendStatus(status) instead'); + this.statusCode = chunk; + chunk = statuses[chunk] + } + + switch (typeof chunk) { + // string defaulting to html + case 'string': + if (!this.get('Content-Type')) { + this.type('html'); + } + break; + case 'boolean': + case 'number': + case 'object': + if (chunk === null) { + chunk = ''; + } else if (Buffer.isBuffer(chunk)) { + if (!this.get('Content-Type')) { + this.type('bin'); + } + } else { + return this.json(chunk); + } + break; + } + + // write strings in utf-8 + if (typeof chunk === 'string') { + encoding = 'utf8'; + type = this.get('Content-Type'); + + // reflect this in content-type + if (typeof type === 'string') { + this.set('Content-Type', setCharset(type, 'utf-8')); + } + } + + // determine if ETag should be generated + var etagFn = app.get('etag fn') + var generateETag = !this.get('ETag') && typeof etagFn === 'function' + + // populate Content-Length + var len + if (chunk !== undefined) { + if (Buffer.isBuffer(chunk)) { + // get length of Buffer + len = chunk.length + } else if (!generateETag && chunk.length < 1000) { + // just calculate length when no ETag + small chunk + len = Buffer.byteLength(chunk, encoding) + } else { + // convert chunk to Buffer and calculate + chunk = Buffer.from(chunk, encoding) + encoding = undefined; + len = chunk.length + } + + this.set('Content-Length', len); + } + + // populate ETag + var etag; + if (generateETag && len !== undefined) { + if ((etag = etagFn(chunk, encoding))) { + this.set('ETag', etag); + } + } + + // freshness + if (req.fresh) this.statusCode = 304; + + // strip irrelevant headers + if (204 === this.statusCode || 304 === this.statusCode) { + this.removeHeader('Content-Type'); + this.removeHeader('Content-Length'); + this.removeHeader('Transfer-Encoding'); + chunk = ''; + } + + if (req.method === 'HEAD') { + // skip body for HEAD + this.end(); + } else { + // respond + this.end(chunk, encoding); + } + + return this; +}; + +/** + * Send JSON response. + * + * Examples: + * + * res.json(null); + * res.json({ user: 'tj' }); + * + * @param {string|number|boolean|object} obj + * @public + */ + +res.json = function json(obj) { + var val = obj; + + // allow status / body + if (arguments.length === 2) { + // res.json(body, status) backwards compat + if (typeof arguments[1] === 'number') { + deprecate('res.json(obj, status): Use res.status(status).json(obj) instead'); + this.statusCode = arguments[1]; + } else { + deprecate('res.json(status, obj): Use res.status(status).json(obj) instead'); + this.statusCode = arguments[0]; + val = arguments[1]; + } + } + + // settings + var app = this.app; + var escape = app.get('json escape') + var replacer = app.get('json replacer'); + var spaces = app.get('json spaces'); + var body = stringify(val, replacer, spaces, escape) + + // content-type + if (!this.get('Content-Type')) { + this.set('Content-Type', 'application/json'); + } + + return this.send(body); +}; + +/** + * Send JSON response with JSONP callback support. + * + * Examples: + * + * res.jsonp(null); + * res.jsonp({ user: 'tj' }); + * + * @param {string|number|boolean|object} obj + * @public + */ + +res.jsonp = function jsonp(obj) { + var val = obj; + + // allow status / body + if (arguments.length === 2) { + // res.json(body, status) backwards compat + if (typeof arguments[1] === 'number') { + deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead'); + this.statusCode = arguments[1]; + } else { + deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead'); + this.statusCode = arguments[0]; + val = arguments[1]; + } + } + + // settings + var app = this.app; + var escape = app.get('json escape') + var replacer = app.get('json replacer'); + var spaces = app.get('json spaces'); + var body = stringify(val, replacer, spaces, escape) + var callback = this.req.query[app.get('jsonp callback name')]; + + // content-type + if (!this.get('Content-Type')) { + this.set('X-Content-Type-Options', 'nosniff'); + this.set('Content-Type', 'application/json'); + } + + // fixup callback + if (Array.isArray(callback)) { + callback = callback[0]; + } + + // jsonp + if (typeof callback === 'string' && callback.length !== 0) { + this.set('X-Content-Type-Options', 'nosniff'); + this.set('Content-Type', 'text/javascript'); + + // restrict callback charset + callback = callback.replace(/[^\[\]\w$.]/g, ''); + + // replace chars not allowed in JavaScript that are in JSON + body = body + .replace(/\u2028/g, '\\u2028') + .replace(/\u2029/g, '\\u2029'); + + // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse" + // the typeof check is just to reduce client error noise + body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');'; + } + + return this.send(body); +}; + +/** + * Send given HTTP status code. + * + * Sets the response status to `statusCode` and the body of the + * response to the standard description from node's http.STATUS_CODES + * or the statusCode number if no description. + * + * Examples: + * + * res.sendStatus(200); + * + * @param {number} statusCode + * @public + */ + +res.sendStatus = function sendStatus(statusCode) { + var body = statuses[statusCode] || String(statusCode) + + this.statusCode = statusCode; + this.type('txt'); + + return this.send(body); +}; + +/** + * Transfer the file at the given `path`. + * + * Automatically sets the _Content-Type_ response header field. + * The callback `callback(err)` is invoked when the transfer is complete + * or when an error occurs. Be sure to check `res.sentHeader` + * if you wish to attempt responding, as the header and some data + * may have already been transferred. + * + * Options: + * + * - `maxAge` defaulting to 0 (can be string converted by `ms`) + * - `root` root directory for relative filenames + * - `headers` object of headers to serve with file + * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them + * + * Other options are passed along to `send`. + * + * Examples: + * + * The following example illustrates how `res.sendFile()` may + * be used as an alternative for the `static()` middleware for + * dynamic situations. The code backing `res.sendFile()` is actually + * the same code, so HTTP cache support etc is identical. + * + * app.get('/user/:uid/photos/:file', function(req, res){ + * var uid = req.params.uid + * , file = req.params.file; + * + * req.user.mayViewFilesFrom(uid, function(yes){ + * if (yes) { + * res.sendFile('/uploads/' + uid + '/' + file); + * } else { + * res.send(403, 'Sorry! you cant see that.'); + * } + * }); + * }); + * + * @public + */ + +res.sendFile = function sendFile(path, options, callback) { + var done = callback; + var req = this.req; + var res = this; + var next = req.next; + var opts = options || {}; + + if (!path) { + throw new TypeError('path argument is required to res.sendFile'); + } + + if (typeof path !== 'string') { + throw new TypeError('path must be a string to res.sendFile') + } + + // support function as second arg + if (typeof options === 'function') { + done = options; + opts = {}; + } + + if (!opts.root && !isAbsolute(path)) { + throw new TypeError('path must be absolute or specify root to res.sendFile'); + } + + // create file stream + var pathname = encodeURI(path); + var file = send(req, pathname, opts); + + // transfer + sendfile(res, file, opts, function (err) { + if (done) return done(err); + if (err && err.code === 'EISDIR') return next(); + + // next() all but write errors + if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') { + next(err); + } + }); +}; + +/** + * Transfer the file at the given `path`. + * + * Automatically sets the _Content-Type_ response header field. + * The callback `callback(err)` is invoked when the transfer is complete + * or when an error occurs. Be sure to check `res.sentHeader` + * if you wish to attempt responding, as the header and some data + * may have already been transferred. + * + * Options: + * + * - `maxAge` defaulting to 0 (can be string converted by `ms`) + * - `root` root directory for relative filenames + * - `headers` object of headers to serve with file + * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them + * + * Other options are passed along to `send`. + * + * Examples: + * + * The following example illustrates how `res.sendfile()` may + * be used as an alternative for the `static()` middleware for + * dynamic situations. The code backing `res.sendfile()` is actually + * the same code, so HTTP cache support etc is identical. + * + * app.get('/user/:uid/photos/:file', function(req, res){ + * var uid = req.params.uid + * , file = req.params.file; + * + * req.user.mayViewFilesFrom(uid, function(yes){ + * if (yes) { + * res.sendfile('/uploads/' + uid + '/' + file); + * } else { + * res.send(403, 'Sorry! you cant see that.'); + * } + * }); + * }); + * + * @public + */ + +res.sendfile = function (path, options, callback) { + var done = callback; + var req = this.req; + var res = this; + var next = req.next; + var opts = options || {}; + + // support function as second arg + if (typeof options === 'function') { + done = options; + opts = {}; + } + + // create file stream + var file = send(req, path, opts); + + // transfer + sendfile(res, file, opts, function (err) { + if (done) return done(err); + if (err && err.code === 'EISDIR') return next(); + + // next() all but write errors + if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') { + next(err); + } + }); +}; + +res.sendfile = deprecate.function(res.sendfile, + 'res.sendfile: Use res.sendFile instead'); + +/** + * Transfer the file at the given `path` as an attachment. + * + * Optionally providing an alternate attachment `filename`, + * and optional callback `callback(err)`. The callback is invoked + * when the data transfer is complete, or when an error has + * ocurred. Be sure to check `res.headersSent` if you plan to respond. + * + * Optionally providing an `options` object to use with `res.sendFile()`. + * This function will set the `Content-Disposition` header, overriding + * any `Content-Disposition` header passed as header options in order + * to set the attachment and filename. + * + * This method uses `res.sendFile()`. + * + * @public + */ + +res.download = function download (path, filename, options, callback) { + var done = callback; + var name = filename; + var opts = options || null + + // support function as second or third arg + if (typeof filename === 'function') { + done = filename; + name = null; + opts = null + } else if (typeof options === 'function') { + done = options + opts = null + } + + // set Content-Disposition when file is sent + var headers = { + 'Content-Disposition': contentDisposition(name || path) + }; + + // merge user-provided headers + if (opts && opts.headers) { + var keys = Object.keys(opts.headers) + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + if (key.toLowerCase() !== 'content-disposition') { + headers[key] = opts.headers[key] + } + } + } + + // merge user-provided options + opts = Object.create(opts) + opts.headers = headers + + // Resolve the full path for sendFile + var fullPath = resolve(path); + + // send file + return this.sendFile(fullPath, opts, done) +}; + +/** + * Set _Content-Type_ response header with `type` through `mime.lookup()` + * when it does not contain "/", or set the Content-Type to `type` otherwise. + * + * Examples: + * + * res.type('.html'); + * res.type('html'); + * res.type('json'); + * res.type('application/json'); + * res.type('png'); + * + * @param {String} type + * @return {ServerResponse} for chaining + * @public + */ + +res.contentType = +res.type = function contentType(type) { + var ct = type.indexOf('/') === -1 + ? mime.lookup(type) + : type; + + return this.set('Content-Type', ct); +}; + +/** + * Respond to the Acceptable formats using an `obj` + * of mime-type callbacks. + * + * This method uses `req.accepted`, an array of + * acceptable types ordered by their quality values. + * When "Accept" is not present the _first_ callback + * is invoked, otherwise the first match is used. When + * no match is performed the server responds with + * 406 "Not Acceptable". + * + * Content-Type is set for you, however if you choose + * you may alter this within the callback using `res.type()` + * or `res.set('Content-Type', ...)`. + * + * res.format({ + * 'text/plain': function(){ + * res.send('hey'); + * }, + * + * 'text/html': function(){ + * res.send('

hey

'); + * }, + * + * 'appliation/json': function(){ + * res.send({ message: 'hey' }); + * } + * }); + * + * In addition to canonicalized MIME types you may + * also use extnames mapped to these types: + * + * res.format({ + * text: function(){ + * res.send('hey'); + * }, + * + * html: function(){ + * res.send('

hey

'); + * }, + * + * json: function(){ + * res.send({ message: 'hey' }); + * } + * }); + * + * By default Express passes an `Error` + * with a `.status` of 406 to `next(err)` + * if a match is not made. If you provide + * a `.default` callback it will be invoked + * instead. + * + * @param {Object} obj + * @return {ServerResponse} for chaining + * @public + */ + +res.format = function(obj){ + var req = this.req; + var next = req.next; + + var fn = obj.default; + if (fn) delete obj.default; + var keys = Object.keys(obj); + + var key = keys.length > 0 + ? req.accepts(keys) + : false; + + this.vary("Accept"); + + if (key) { + this.set('Content-Type', normalizeType(key).value); + obj[key](req, this, next); + } else if (fn) { + fn(); + } else { + var err = new Error('Not Acceptable'); + err.status = err.statusCode = 406; + err.types = normalizeTypes(keys).map(function(o){ return o.value }); + next(err); + } + + return this; +}; + +/** + * Set _Content-Disposition_ header to _attachment_ with optional `filename`. + * + * @param {String} filename + * @return {ServerResponse} + * @public + */ + +res.attachment = function attachment(filename) { + if (filename) { + this.type(extname(filename)); + } + + this.set('Content-Disposition', contentDisposition(filename)); + + return this; +}; + +/** + * Append additional header `field` with value `val`. + * + * Example: + * + * res.append('Link', ['', '']); + * res.append('Set-Cookie', 'foo=bar; Path=/; HttpOnly'); + * res.append('Warning', '199 Miscellaneous warning'); + * + * @param {String} field + * @param {String|Array} val + * @return {ServerResponse} for chaining + * @public + */ + +res.append = function append(field, val) { + var prev = this.get(field); + var value = val; + + if (prev) { + // concat the new and prev vals + value = Array.isArray(prev) ? prev.concat(val) + : Array.isArray(val) ? [prev].concat(val) + : [prev, val]; + } + + return this.set(field, value); +}; + +/** + * Set header `field` to `val`, or pass + * an object of header fields. + * + * Examples: + * + * res.set('Foo', ['bar', 'baz']); + * res.set('Accept', 'application/json'); + * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); + * + * Aliased as `res.header()`. + * + * @param {String|Object} field + * @param {String|Array} val + * @return {ServerResponse} for chaining + * @public + */ + +res.set = +res.header = function header(field, val) { + if (arguments.length === 2) { + var value = Array.isArray(val) + ? val.map(String) + : String(val); + + // add charset to content-type + if (field.toLowerCase() === 'content-type') { + if (Array.isArray(value)) { + throw new TypeError('Content-Type cannot be set to an Array'); + } + if (!charsetRegExp.test(value)) { + var charset = mime.charsets.lookup(value.split(';')[0]); + if (charset) value += '; charset=' + charset.toLowerCase(); + } + } + + this.setHeader(field, value); + } else { + for (var key in field) { + this.set(key, field[key]); + } + } + return this; +}; + +/** + * Get value for header `field`. + * + * @param {String} field + * @return {String} + * @public + */ + +res.get = function(field){ + return this.getHeader(field); +}; + +/** + * Clear cookie `name`. + * + * @param {String} name + * @param {Object} [options] + * @return {ServerResponse} for chaining + * @public + */ + +res.clearCookie = function clearCookie(name, options) { + var opts = merge({ expires: new Date(1), path: '/' }, options); + + return this.cookie(name, '', opts); +}; + +/** + * Set cookie `name` to `value`, with the given `options`. + * + * Options: + * + * - `maxAge` max-age in milliseconds, converted to `expires` + * - `signed` sign the cookie + * - `path` defaults to "/" + * + * Examples: + * + * // "Remember Me" for 15 minutes + * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); + * + * // same as above + * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) + * + * @param {String} name + * @param {String|Object} value + * @param {Object} [options] + * @return {ServerResponse} for chaining + * @public + */ + +res.cookie = function (name, value, options) { + var opts = merge({}, options); + var secret = this.req.secret; + var signed = opts.signed; + + if (signed && !secret) { + throw new Error('cookieParser("secret") required for signed cookies'); + } + + var val = typeof value === 'object' + ? 'j:' + JSON.stringify(value) + : String(value); + + if (signed) { + val = 's:' + sign(val, secret); + } + + if ('maxAge' in opts) { + opts.expires = new Date(Date.now() + opts.maxAge); + opts.maxAge /= 1000; + } + + if (opts.path == null) { + opts.path = '/'; + } + + this.append('Set-Cookie', cookie.serialize(name, String(val), opts)); + + return this; +}; + +/** + * Set the location header to `url`. + * + * The given `url` can also be "back", which redirects + * to the _Referrer_ or _Referer_ headers or "/". + * + * Examples: + * + * res.location('/foo/bar').; + * res.location('http://example.com'); + * res.location('../login'); + * + * @param {String} url + * @return {ServerResponse} for chaining + * @public + */ + +res.location = function location(url) { + var loc = url; + + // "back" is an alias for the referrer + if (url === 'back') { + loc = this.req.get('Referrer') || '/'; + } + + // set location + return this.set('Location', encodeUrl(loc)); +}; + +/** + * Redirect to the given `url` with optional response `status` + * defaulting to 302. + * + * The resulting `url` is determined by `res.location()`, so + * it will play nicely with mounted apps, relative paths, + * `"back"` etc. + * + * Examples: + * + * res.redirect('/foo/bar'); + * res.redirect('http://example.com'); + * res.redirect(301, 'http://example.com'); + * res.redirect('../login'); // /blog/post/1 -> /blog/login + * + * @public + */ + +res.redirect = function redirect(url) { + var address = url; + var body; + var status = 302; + + // allow status / url + if (arguments.length === 2) { + if (typeof arguments[0] === 'number') { + status = arguments[0]; + address = arguments[1]; + } else { + deprecate('res.redirect(url, status): Use res.redirect(status, url) instead'); + status = arguments[1]; + } + } + + // Set location header + address = this.location(address).get('Location'); + + // Support text/{plain,html} by default + this.format({ + text: function(){ + body = statuses[status] + '. Redirecting to ' + address + }, + + html: function(){ + var u = escapeHtml(address); + body = '

' + statuses[status] + '. Redirecting to ' + u + '

' + }, + + default: function(){ + body = ''; + } + }); + + // Respond + this.statusCode = status; + this.set('Content-Length', Buffer.byteLength(body)); + + if (this.req.method === 'HEAD') { + this.end(); + } else { + this.end(body); + } +}; + +/** + * Add `field` to Vary. If already present in the Vary set, then + * this call is simply ignored. + * + * @param {Array|String} field + * @return {ServerResponse} for chaining + * @public + */ + +res.vary = function(field){ + // checks for back-compat + if (!field || (Array.isArray(field) && !field.length)) { + deprecate('res.vary(): Provide a field name'); + return this; + } + + vary(this, field); + + return this; +}; + +/** + * Render `view` with the given `options` and optional callback `fn`. + * When a callback function is given a response will _not_ be made + * automatically, otherwise a response of _200_ and _text/html_ is given. + * + * Options: + * + * - `cache` boolean hinting to the engine it should cache + * - `filename` filename of the view being rendered + * + * @public + */ + +res.render = function render(view, options, callback) { + var app = this.req.app; + var done = callback; + var opts = options || {}; + var req = this.req; + var self = this; + + // support callback function as second arg + if (typeof options === 'function') { + done = options; + opts = {}; + } + + // merge res.locals + opts._locals = self.locals; + + // default callback to respond + done = done || function (err, str) { + if (err) return req.next(err); + self.send(str); + }; + + // render + app.render(view, opts, done); +}; + +// pipe the send file stream +function sendfile(res, file, options, callback) { + var done = false; + var streaming; + + // request aborted + function onaborted() { + if (done) return; + done = true; + + var err = new Error('Request aborted'); + err.code = 'ECONNABORTED'; + callback(err); + } + + // directory + function ondirectory() { + if (done) return; + done = true; + + var err = new Error('EISDIR, read'); + err.code = 'EISDIR'; + callback(err); + } + + // errors + function onerror(err) { + if (done) return; + done = true; + callback(err); + } + + // ended + function onend() { + if (done) return; + done = true; + callback(); + } + + // file + function onfile() { + streaming = false; + } + + // finished + function onfinish(err) { + if (err && err.code === 'ECONNRESET') return onaborted(); + if (err) return onerror(err); + if (done) return; + + setImmediate(function () { + if (streaming !== false && !done) { + onaborted(); + return; + } + + if (done) return; + done = true; + callback(); + }); + } + + // streaming + function onstream() { + streaming = true; + } + + file.on('directory', ondirectory); + file.on('end', onend); + file.on('error', onerror); + file.on('file', onfile); + file.on('stream', onstream); + onFinished(res, onfinish); + + if (options.headers) { + // set headers on successful transfer + file.on('headers', function headers(res) { + var obj = options.headers; + var keys = Object.keys(obj); + + for (var i = 0; i < keys.length; i++) { + var k = keys[i]; + res.setHeader(k, obj[k]); + } + }); + } + + // pipe + file.pipe(res); +} + +/** + * Stringify JSON, like JSON.stringify, but v8 optimized, with the + * ability to escape characters that can trigger HTML sniffing. + * + * @param {*} value + * @param {function} replaces + * @param {number} spaces + * @param {boolean} escape + * @returns {string} + * @private + */ + +function stringify (value, replacer, spaces, escape) { + // v8 checks arguments.length for optimizing simple call + // https://bugs.chromium.org/p/v8/issues/detail?id=4730 + var json = replacer || spaces + ? JSON.stringify(value, replacer, spaces) + : JSON.stringify(value); + + if (escape) { + json = json.replace(/[<>&]/g, function (c) { + switch (c.charCodeAt(0)) { + case 0x3c: + return '\\u003c' + case 0x3e: + return '\\u003e' + case 0x26: + return '\\u0026' + /* istanbul ignore next: unreachable default */ + default: + return c + } + }) + } + + return json +} diff --git a/node_modules/express/lib/router/index.js b/node_modules/express/lib/router/index.js new file mode 100644 index 00000000..69e6d380 --- /dev/null +++ b/node_modules/express/lib/router/index.js @@ -0,0 +1,662 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2013 Roman Shtylman + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + * @private + */ + +var Route = require('./route'); +var Layer = require('./layer'); +var methods = require('methods'); +var mixin = require('utils-merge'); +var debug = require('debug')('express:router'); +var deprecate = require('depd')('express'); +var flatten = require('array-flatten'); +var parseUrl = require('parseurl'); +var setPrototypeOf = require('setprototypeof') + +/** + * Module variables. + * @private + */ + +var objectRegExp = /^\[object (\S+)\]$/; +var slice = Array.prototype.slice; +var toString = Object.prototype.toString; + +/** + * Initialize a new `Router` with the given `options`. + * + * @param {Object} [options] + * @return {Router} which is an callable function + * @public + */ + +var proto = module.exports = function(options) { + var opts = options || {}; + + function router(req, res, next) { + router.handle(req, res, next); + } + + // mixin Router class functions + setPrototypeOf(router, proto) + + router.params = {}; + router._params = []; + router.caseSensitive = opts.caseSensitive; + router.mergeParams = opts.mergeParams; + router.strict = opts.strict; + router.stack = []; + + return router; +}; + +/** + * Map the given param placeholder `name`(s) to the given callback. + * + * Parameter mapping is used to provide pre-conditions to routes + * which use normalized placeholders. For example a _:user_id_ parameter + * could automatically load a user's information from the database without + * any additional code, + * + * The callback uses the same signature as middleware, the only difference + * being that the value of the placeholder is passed, in this case the _id_ + * of the user. Once the `next()` function is invoked, just like middleware + * it will continue on to execute the route, or subsequent parameter functions. + * + * Just like in middleware, you must either respond to the request or call next + * to avoid stalling the request. + * + * app.param('user_id', function(req, res, next, id){ + * User.find(id, function(err, user){ + * if (err) { + * return next(err); + * } else if (!user) { + * return next(new Error('failed to load user')); + * } + * req.user = user; + * next(); + * }); + * }); + * + * @param {String} name + * @param {Function} fn + * @return {app} for chaining + * @public + */ + +proto.param = function param(name, fn) { + // param logic + if (typeof name === 'function') { + deprecate('router.param(fn): Refactor to use path params'); + this._params.push(name); + return; + } + + // apply param functions + var params = this._params; + var len = params.length; + var ret; + + if (name[0] === ':') { + deprecate('router.param(' + JSON.stringify(name) + ', fn): Use router.param(' + JSON.stringify(name.substr(1)) + ', fn) instead'); + name = name.substr(1); + } + + for (var i = 0; i < len; ++i) { + if (ret = params[i](name, fn)) { + fn = ret; + } + } + + // ensure we end up with a + // middleware function + if ('function' !== typeof fn) { + throw new Error('invalid param() call for ' + name + ', got ' + fn); + } + + (this.params[name] = this.params[name] || []).push(fn); + return this; +}; + +/** + * Dispatch a req, res into the router. + * @private + */ + +proto.handle = function handle(req, res, out) { + var self = this; + + debug('dispatching %s %s', req.method, req.url); + + var idx = 0; + var protohost = getProtohost(req.url) || '' + var removed = ''; + var slashAdded = false; + var paramcalled = {}; + + // store options for OPTIONS request + // only used if OPTIONS request + var options = []; + + // middleware and routes + var stack = self.stack; + + // manage inter-router variables + var parentParams = req.params; + var parentUrl = req.baseUrl || ''; + var done = restore(out, req, 'baseUrl', 'next', 'params'); + + // setup next layer + req.next = next; + + // for options requests, respond with a default if nothing else responds + if (req.method === 'OPTIONS') { + done = wrap(done, function(old, err) { + if (err || options.length === 0) return old(err); + sendOptionsResponse(res, options, old); + }); + } + + // setup basic req values + req.baseUrl = parentUrl; + req.originalUrl = req.originalUrl || req.url; + + next(); + + function next(err) { + var layerError = err === 'route' + ? null + : err; + + // remove added slash + if (slashAdded) { + req.url = req.url.substr(1); + slashAdded = false; + } + + // restore altered req.url + if (removed.length !== 0) { + req.baseUrl = parentUrl; + req.url = protohost + removed + req.url.substr(protohost.length); + removed = ''; + } + + // signal to exit router + if (layerError === 'router') { + setImmediate(done, null) + return + } + + // no more matching layers + if (idx >= stack.length) { + setImmediate(done, layerError); + return; + } + + // get pathname of request + var path = getPathname(req); + + if (path == null) { + return done(layerError); + } + + // find next matching layer + var layer; + var match; + var route; + + while (match !== true && idx < stack.length) { + layer = stack[idx++]; + match = matchLayer(layer, path); + route = layer.route; + + if (typeof match !== 'boolean') { + // hold on to layerError + layerError = layerError || match; + } + + if (match !== true) { + continue; + } + + if (!route) { + // process non-route handlers normally + continue; + } + + if (layerError) { + // routes do not match with a pending error + match = false; + continue; + } + + var method = req.method; + var has_method = route._handles_method(method); + + // build up automatic options response + if (!has_method && method === 'OPTIONS') { + appendMethods(options, route._options()); + } + + // don't even bother matching route + if (!has_method && method !== 'HEAD') { + match = false; + continue; + } + } + + // no match + if (match !== true) { + return done(layerError); + } + + // store route for dispatch on change + if (route) { + req.route = route; + } + + // Capture one-time layer values + req.params = self.mergeParams + ? mergeParams(layer.params, parentParams) + : layer.params; + var layerPath = layer.path; + + // this should be done for the layer + self.process_params(layer, paramcalled, req, res, function (err) { + if (err) { + return next(layerError || err); + } + + if (route) { + return layer.handle_request(req, res, next); + } + + trim_prefix(layer, layerError, layerPath, path); + }); + } + + function trim_prefix(layer, layerError, layerPath, path) { + if (layerPath.length !== 0) { + // Validate path breaks on a path separator + var c = path[layerPath.length] + if (c && c !== '/' && c !== '.') return next(layerError) + + // Trim off the part of the url that matches the route + // middleware (.use stuff) needs to have the path stripped + debug('trim prefix (%s) from url %s', layerPath, req.url); + removed = layerPath; + req.url = protohost + req.url.substr(protohost.length + removed.length); + + // Ensure leading slash + if (!protohost && req.url[0] !== '/') { + req.url = '/' + req.url; + slashAdded = true; + } + + // Setup base URL (no trailing slash) + req.baseUrl = parentUrl + (removed[removed.length - 1] === '/' + ? removed.substring(0, removed.length - 1) + : removed); + } + + debug('%s %s : %s', layer.name, layerPath, req.originalUrl); + + if (layerError) { + layer.handle_error(layerError, req, res, next); + } else { + layer.handle_request(req, res, next); + } + } +}; + +/** + * Process any parameters for the layer. + * @private + */ + +proto.process_params = function process_params(layer, called, req, res, done) { + var params = this.params; + + // captured parameters from the layer, keys and values + var keys = layer.keys; + + // fast track + if (!keys || keys.length === 0) { + return done(); + } + + var i = 0; + var name; + var paramIndex = 0; + var key; + var paramVal; + var paramCallbacks; + var paramCalled; + + // process params in order + // param callbacks can be async + function param(err) { + if (err) { + return done(err); + } + + if (i >= keys.length ) { + return done(); + } + + paramIndex = 0; + key = keys[i++]; + name = key.name; + paramVal = req.params[name]; + paramCallbacks = params[name]; + paramCalled = called[name]; + + if (paramVal === undefined || !paramCallbacks) { + return param(); + } + + // param previously called with same value or error occurred + if (paramCalled && (paramCalled.match === paramVal + || (paramCalled.error && paramCalled.error !== 'route'))) { + // restore value + req.params[name] = paramCalled.value; + + // next param + return param(paramCalled.error); + } + + called[name] = paramCalled = { + error: null, + match: paramVal, + value: paramVal + }; + + paramCallback(); + } + + // single param callbacks + function paramCallback(err) { + var fn = paramCallbacks[paramIndex++]; + + // store updated value + paramCalled.value = req.params[key.name]; + + if (err) { + // store error + paramCalled.error = err; + param(err); + return; + } + + if (!fn) return param(); + + try { + fn(req, res, paramCallback, paramVal, key.name); + } catch (e) { + paramCallback(e); + } + } + + param(); +}; + +/** + * Use the given middleware function, with optional path, defaulting to "/". + * + * Use (like `.all`) will run for any http METHOD, but it will not add + * handlers for those methods so OPTIONS requests will not consider `.use` + * functions even if they could respond. + * + * The other difference is that _route_ path is stripped and not visible + * to the handler function. The main effect of this feature is that mounted + * handlers can operate without any code changes regardless of the "prefix" + * pathname. + * + * @public + */ + +proto.use = function use(fn) { + var offset = 0; + var path = '/'; + + // default path to '/' + // disambiguate router.use([fn]) + if (typeof fn !== 'function') { + var arg = fn; + + while (Array.isArray(arg) && arg.length !== 0) { + arg = arg[0]; + } + + // first arg is the path + if (typeof arg !== 'function') { + offset = 1; + path = fn; + } + } + + var callbacks = flatten(slice.call(arguments, offset)); + + if (callbacks.length === 0) { + throw new TypeError('Router.use() requires a middleware function') + } + + for (var i = 0; i < callbacks.length; i++) { + var fn = callbacks[i]; + + if (typeof fn !== 'function') { + throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn)) + } + + // add the middleware + debug('use %o %s', path, fn.name || '') + + var layer = new Layer(path, { + sensitive: this.caseSensitive, + strict: false, + end: false + }, fn); + + layer.route = undefined; + + this.stack.push(layer); + } + + return this; +}; + +/** + * Create a new Route for the given path. + * + * Each route contains a separate middleware stack and VERB handlers. + * + * See the Route api documentation for details on adding handlers + * and middleware to routes. + * + * @param {String} path + * @return {Route} + * @public + */ + +proto.route = function route(path) { + var route = new Route(path); + + var layer = new Layer(path, { + sensitive: this.caseSensitive, + strict: this.strict, + end: true + }, route.dispatch.bind(route)); + + layer.route = route; + + this.stack.push(layer); + return route; +}; + +// create Router#VERB functions +methods.concat('all').forEach(function(method){ + proto[method] = function(path){ + var route = this.route(path) + route[method].apply(route, slice.call(arguments, 1)); + return this; + }; +}); + +// append methods to a list of methods +function appendMethods(list, addition) { + for (var i = 0; i < addition.length; i++) { + var method = addition[i]; + if (list.indexOf(method) === -1) { + list.push(method); + } + } +} + +// get pathname of request +function getPathname(req) { + try { + return parseUrl(req).pathname; + } catch (err) { + return undefined; + } +} + +// Get get protocol + host for a URL +function getProtohost(url) { + if (typeof url !== 'string' || url.length === 0 || url[0] === '/') { + return undefined + } + + var searchIndex = url.indexOf('?') + var pathLength = searchIndex !== -1 + ? searchIndex + : url.length + var fqdnIndex = url.substr(0, pathLength).indexOf('://') + + return fqdnIndex !== -1 + ? url.substr(0, url.indexOf('/', 3 + fqdnIndex)) + : undefined +} + +// get type for error message +function gettype(obj) { + var type = typeof obj; + + if (type !== 'object') { + return type; + } + + // inspect [[Class]] for objects + return toString.call(obj) + .replace(objectRegExp, '$1'); +} + +/** + * Match path to a layer. + * + * @param {Layer} layer + * @param {string} path + * @private + */ + +function matchLayer(layer, path) { + try { + return layer.match(path); + } catch (err) { + return err; + } +} + +// merge params with parent params +function mergeParams(params, parent) { + if (typeof parent !== 'object' || !parent) { + return params; + } + + // make copy of parent for base + var obj = mixin({}, parent); + + // simple non-numeric merging + if (!(0 in params) || !(0 in parent)) { + return mixin(obj, params); + } + + var i = 0; + var o = 0; + + // determine numeric gaps + while (i in params) { + i++; + } + + while (o in parent) { + o++; + } + + // offset numeric indices in params before merge + for (i--; i >= 0; i--) { + params[i + o] = params[i]; + + // create holes for the merge when necessary + if (i < o) { + delete params[i]; + } + } + + return mixin(obj, params); +} + +// restore obj props after function +function restore(fn, obj) { + var props = new Array(arguments.length - 2); + var vals = new Array(arguments.length - 2); + + for (var i = 0; i < props.length; i++) { + props[i] = arguments[i + 2]; + vals[i] = obj[props[i]]; + } + + return function () { + // restore vals + for (var i = 0; i < props.length; i++) { + obj[props[i]] = vals[i]; + } + + return fn.apply(this, arguments); + }; +} + +// send an OPTIONS response +function sendOptionsResponse(res, options, next) { + try { + var body = options.join(','); + res.set('Allow', body); + res.send(body); + } catch (err) { + next(err); + } +} + +// wrap a function +function wrap(old, fn) { + return function proxy() { + var args = new Array(arguments.length + 1); + + args[0] = old; + for (var i = 0, len = arguments.length; i < len; i++) { + args[i + 1] = arguments[i]; + } + + fn.apply(this, args); + }; +} diff --git a/node_modules/express/lib/router/layer.js b/node_modules/express/lib/router/layer.js new file mode 100644 index 00000000..4dc8e86d --- /dev/null +++ b/node_modules/express/lib/router/layer.js @@ -0,0 +1,181 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2013 Roman Shtylman + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + * @private + */ + +var pathRegexp = require('path-to-regexp'); +var debug = require('debug')('express:router:layer'); + +/** + * Module variables. + * @private + */ + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +/** + * Module exports. + * @public + */ + +module.exports = Layer; + +function Layer(path, options, fn) { + if (!(this instanceof Layer)) { + return new Layer(path, options, fn); + } + + debug('new %o', path) + var opts = options || {}; + + this.handle = fn; + this.name = fn.name || ''; + this.params = undefined; + this.path = undefined; + this.regexp = pathRegexp(path, this.keys = [], opts); + + // set fast path flags + this.regexp.fast_star = path === '*' + this.regexp.fast_slash = path === '/' && opts.end === false +} + +/** + * Handle the error for the layer. + * + * @param {Error} error + * @param {Request} req + * @param {Response} res + * @param {function} next + * @api private + */ + +Layer.prototype.handle_error = function handle_error(error, req, res, next) { + var fn = this.handle; + + if (fn.length !== 4) { + // not a standard error handler + return next(error); + } + + try { + fn(error, req, res, next); + } catch (err) { + next(err); + } +}; + +/** + * Handle the request for the layer. + * + * @param {Request} req + * @param {Response} res + * @param {function} next + * @api private + */ + +Layer.prototype.handle_request = function handle(req, res, next) { + var fn = this.handle; + + if (fn.length > 3) { + // not a standard request handler + return next(); + } + + try { + fn(req, res, next); + } catch (err) { + next(err); + } +}; + +/** + * Check if this route matches `path`, if so + * populate `.params`. + * + * @param {String} path + * @return {Boolean} + * @api private + */ + +Layer.prototype.match = function match(path) { + var match + + if (path != null) { + // fast path non-ending match for / (any path matches) + if (this.regexp.fast_slash) { + this.params = {} + this.path = '' + return true + } + + // fast path for * (everything matched in a param) + if (this.regexp.fast_star) { + this.params = {'0': decode_param(path)} + this.path = path + return true + } + + // match the path + match = this.regexp.exec(path) + } + + if (!match) { + this.params = undefined; + this.path = undefined; + return false; + } + + // store values + this.params = {}; + this.path = match[0] + + var keys = this.keys; + var params = this.params; + + for (var i = 1; i < match.length; i++) { + var key = keys[i - 1]; + var prop = key.name; + var val = decode_param(match[i]) + + if (val !== undefined || !(hasOwnProperty.call(params, prop))) { + params[prop] = val; + } + } + + return true; +}; + +/** + * Decode param value. + * + * @param {string} val + * @return {string} + * @private + */ + +function decode_param(val) { + if (typeof val !== 'string' || val.length === 0) { + return val; + } + + try { + return decodeURIComponent(val); + } catch (err) { + if (err instanceof URIError) { + err.message = 'Failed to decode param \'' + val + '\''; + err.status = err.statusCode = 400; + } + + throw err; + } +} diff --git a/node_modules/express/lib/router/route.js b/node_modules/express/lib/router/route.js new file mode 100644 index 00000000..178df0d5 --- /dev/null +++ b/node_modules/express/lib/router/route.js @@ -0,0 +1,216 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2013 Roman Shtylman + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + * @private + */ + +var debug = require('debug')('express:router:route'); +var flatten = require('array-flatten'); +var Layer = require('./layer'); +var methods = require('methods'); + +/** + * Module variables. + * @private + */ + +var slice = Array.prototype.slice; +var toString = Object.prototype.toString; + +/** + * Module exports. + * @public + */ + +module.exports = Route; + +/** + * Initialize `Route` with the given `path`, + * + * @param {String} path + * @public + */ + +function Route(path) { + this.path = path; + this.stack = []; + + debug('new %o', path) + + // route handlers for various http methods + this.methods = {}; +} + +/** + * Determine if the route handles a given method. + * @private + */ + +Route.prototype._handles_method = function _handles_method(method) { + if (this.methods._all) { + return true; + } + + var name = method.toLowerCase(); + + if (name === 'head' && !this.methods['head']) { + name = 'get'; + } + + return Boolean(this.methods[name]); +}; + +/** + * @return {Array} supported HTTP methods + * @private + */ + +Route.prototype._options = function _options() { + var methods = Object.keys(this.methods); + + // append automatic head + if (this.methods.get && !this.methods.head) { + methods.push('head'); + } + + for (var i = 0; i < methods.length; i++) { + // make upper case + methods[i] = methods[i].toUpperCase(); + } + + return methods; +}; + +/** + * dispatch req, res into this route + * @private + */ + +Route.prototype.dispatch = function dispatch(req, res, done) { + var idx = 0; + var stack = this.stack; + if (stack.length === 0) { + return done(); + } + + var method = req.method.toLowerCase(); + if (method === 'head' && !this.methods['head']) { + method = 'get'; + } + + req.route = this; + + next(); + + function next(err) { + // signal to exit route + if (err && err === 'route') { + return done(); + } + + // signal to exit router + if (err && err === 'router') { + return done(err) + } + + var layer = stack[idx++]; + if (!layer) { + return done(err); + } + + if (layer.method && layer.method !== method) { + return next(err); + } + + if (err) { + layer.handle_error(err, req, res, next); + } else { + layer.handle_request(req, res, next); + } + } +}; + +/** + * Add a handler for all HTTP verbs to this route. + * + * Behaves just like middleware and can respond or call `next` + * to continue processing. + * + * You can use multiple `.all` call to add multiple handlers. + * + * function check_something(req, res, next){ + * next(); + * }; + * + * function validate_user(req, res, next){ + * next(); + * }; + * + * route + * .all(validate_user) + * .all(check_something) + * .get(function(req, res, next){ + * res.send('hello world'); + * }); + * + * @param {function} handler + * @return {Route} for chaining + * @api public + */ + +Route.prototype.all = function all() { + var handles = flatten(slice.call(arguments)); + + for (var i = 0; i < handles.length; i++) { + var handle = handles[i]; + + if (typeof handle !== 'function') { + var type = toString.call(handle); + var msg = 'Route.all() requires a callback function but got a ' + type + throw new TypeError(msg); + } + + var layer = Layer('/', {}, handle); + layer.method = undefined; + + this.methods._all = true; + this.stack.push(layer); + } + + return this; +}; + +methods.forEach(function(method){ + Route.prototype[method] = function(){ + var handles = flatten(slice.call(arguments)); + + for (var i = 0; i < handles.length; i++) { + var handle = handles[i]; + + if (typeof handle !== 'function') { + var type = toString.call(handle); + var msg = 'Route.' + method + '() requires a callback function but got a ' + type + throw new Error(msg); + } + + debug('%s %o', method, this.path) + + var layer = Layer('/', {}, handle); + layer.method = method; + + this.methods[method] = true; + this.stack.push(layer); + } + + return this; + }; +}); diff --git a/node_modules/express/lib/utils.js b/node_modules/express/lib/utils.js new file mode 100644 index 00000000..bd81ac7f --- /dev/null +++ b/node_modules/express/lib/utils.js @@ -0,0 +1,306 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + * @api private + */ + +var Buffer = require('safe-buffer').Buffer +var contentDisposition = require('content-disposition'); +var contentType = require('content-type'); +var deprecate = require('depd')('express'); +var flatten = require('array-flatten'); +var mime = require('send').mime; +var etag = require('etag'); +var proxyaddr = require('proxy-addr'); +var qs = require('qs'); +var querystring = require('querystring'); + +/** + * Return strong ETag for `body`. + * + * @param {String|Buffer} body + * @param {String} [encoding] + * @return {String} + * @api private + */ + +exports.etag = createETagGenerator({ weak: false }) + +/** + * Return weak ETag for `body`. + * + * @param {String|Buffer} body + * @param {String} [encoding] + * @return {String} + * @api private + */ + +exports.wetag = createETagGenerator({ weak: true }) + +/** + * Check if `path` looks absolute. + * + * @param {String} path + * @return {Boolean} + * @api private + */ + +exports.isAbsolute = function(path){ + if ('/' === path[0]) return true; + if (':' === path[1] && ('\\' === path[2] || '/' === path[2])) return true; // Windows device path + if ('\\\\' === path.substring(0, 2)) return true; // Microsoft Azure absolute path +}; + +/** + * Flatten the given `arr`. + * + * @param {Array} arr + * @return {Array} + * @api private + */ + +exports.flatten = deprecate.function(flatten, + 'utils.flatten: use array-flatten npm module instead'); + +/** + * Normalize the given `type`, for example "html" becomes "text/html". + * + * @param {String} type + * @return {Object} + * @api private + */ + +exports.normalizeType = function(type){ + return ~type.indexOf('/') + ? acceptParams(type) + : { value: mime.lookup(type), params: {} }; +}; + +/** + * Normalize `types`, for example "html" becomes "text/html". + * + * @param {Array} types + * @return {Array} + * @api private + */ + +exports.normalizeTypes = function(types){ + var ret = []; + + for (var i = 0; i < types.length; ++i) { + ret.push(exports.normalizeType(types[i])); + } + + return ret; +}; + +/** + * Generate Content-Disposition header appropriate for the filename. + * non-ascii filenames are urlencoded and a filename* parameter is added + * + * @param {String} filename + * @return {String} + * @api private + */ + +exports.contentDisposition = deprecate.function(contentDisposition, + 'utils.contentDisposition: use content-disposition npm module instead'); + +/** + * Parse accept params `str` returning an + * object with `.value`, `.quality` and `.params`. + * also includes `.originalIndex` for stable sorting + * + * @param {String} str + * @return {Object} + * @api private + */ + +function acceptParams(str, index) { + var parts = str.split(/ *; */); + var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index }; + + for (var i = 1; i < parts.length; ++i) { + var pms = parts[i].split(/ *= */); + if ('q' === pms[0]) { + ret.quality = parseFloat(pms[1]); + } else { + ret.params[pms[0]] = pms[1]; + } + } + + return ret; +} + +/** + * Compile "etag" value to function. + * + * @param {Boolean|String|Function} val + * @return {Function} + * @api private + */ + +exports.compileETag = function(val) { + var fn; + + if (typeof val === 'function') { + return val; + } + + switch (val) { + case true: + fn = exports.wetag; + break; + case false: + break; + case 'strong': + fn = exports.etag; + break; + case 'weak': + fn = exports.wetag; + break; + default: + throw new TypeError('unknown value for etag function: ' + val); + } + + return fn; +} + +/** + * Compile "query parser" value to function. + * + * @param {String|Function} val + * @return {Function} + * @api private + */ + +exports.compileQueryParser = function compileQueryParser(val) { + var fn; + + if (typeof val === 'function') { + return val; + } + + switch (val) { + case true: + fn = querystring.parse; + break; + case false: + fn = newObject; + break; + case 'extended': + fn = parseExtendedQueryString; + break; + case 'simple': + fn = querystring.parse; + break; + default: + throw new TypeError('unknown value for query parser function: ' + val); + } + + return fn; +} + +/** + * Compile "proxy trust" value to function. + * + * @param {Boolean|String|Number|Array|Function} val + * @return {Function} + * @api private + */ + +exports.compileTrust = function(val) { + if (typeof val === 'function') return val; + + if (val === true) { + // Support plain true/false + return function(){ return true }; + } + + if (typeof val === 'number') { + // Support trusting hop count + return function(a, i){ return i < val }; + } + + if (typeof val === 'string') { + // Support comma-separated values + val = val.split(/ *, */); + } + + return proxyaddr.compile(val || []); +} + +/** + * Set the charset in a given Content-Type string. + * + * @param {String} type + * @param {String} charset + * @return {String} + * @api private + */ + +exports.setCharset = function setCharset(type, charset) { + if (!type || !charset) { + return type; + } + + // parse type + var parsed = contentType.parse(type); + + // set charset + parsed.parameters.charset = charset; + + // format type + return contentType.format(parsed); +}; + +/** + * Create an ETag generator function, generating ETags with + * the given options. + * + * @param {object} options + * @return {function} + * @private + */ + +function createETagGenerator (options) { + return function generateETag (body, encoding) { + var buf = !Buffer.isBuffer(body) + ? Buffer.from(body, encoding) + : body + + return etag(buf, options) + } +} + +/** + * Parse an extended query string with qs. + * + * @return {Object} + * @private + */ + +function parseExtendedQueryString(str) { + return qs.parse(str, { + allowPrototypes: true + }); +} + +/** + * Return new empty object. + * + * @return {Object} + * @api private + */ + +function newObject() { + return {}; +} diff --git a/node_modules/express/lib/view.js b/node_modules/express/lib/view.js new file mode 100644 index 00000000..cf101cae --- /dev/null +++ b/node_modules/express/lib/view.js @@ -0,0 +1,182 @@ +/*! + * express + * Copyright(c) 2009-2013 TJ Holowaychuk + * Copyright(c) 2013 Roman Shtylman + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + * @private + */ + +var debug = require('debug')('express:view'); +var path = require('path'); +var fs = require('fs'); + +/** + * Module variables. + * @private + */ + +var dirname = path.dirname; +var basename = path.basename; +var extname = path.extname; +var join = path.join; +var resolve = path.resolve; + +/** + * Module exports. + * @public + */ + +module.exports = View; + +/** + * Initialize a new `View` with the given `name`. + * + * Options: + * + * - `defaultEngine` the default template engine name + * - `engines` template engine require() cache + * - `root` root path for view lookup + * + * @param {string} name + * @param {object} options + * @public + */ + +function View(name, options) { + var opts = options || {}; + + this.defaultEngine = opts.defaultEngine; + this.ext = extname(name); + this.name = name; + this.root = opts.root; + + if (!this.ext && !this.defaultEngine) { + throw new Error('No default engine was specified and no extension was provided.'); + } + + var fileName = name; + + if (!this.ext) { + // get extension from default engine name + this.ext = this.defaultEngine[0] !== '.' + ? '.' + this.defaultEngine + : this.defaultEngine; + + fileName += this.ext; + } + + if (!opts.engines[this.ext]) { + // load engine + var mod = this.ext.substr(1) + debug('require "%s"', mod) + + // default engine export + var fn = require(mod).__express + + if (typeof fn !== 'function') { + throw new Error('Module "' + mod + '" does not provide a view engine.') + } + + opts.engines[this.ext] = fn + } + + // store loaded engine + this.engine = opts.engines[this.ext]; + + // lookup path + this.path = this.lookup(fileName); +} + +/** + * Lookup view by the given `name` + * + * @param {string} name + * @private + */ + +View.prototype.lookup = function lookup(name) { + var path; + var roots = [].concat(this.root); + + debug('lookup "%s"', name); + + for (var i = 0; i < roots.length && !path; i++) { + var root = roots[i]; + + // resolve the path + var loc = resolve(root, name); + var dir = dirname(loc); + var file = basename(loc); + + // resolve the file + path = this.resolve(dir, file); + } + + return path; +}; + +/** + * Render with the given options. + * + * @param {object} options + * @param {function} callback + * @private + */ + +View.prototype.render = function render(options, callback) { + debug('render "%s"', this.path); + this.engine(this.path, options, callback); +}; + +/** + * Resolve the file within the given directory. + * + * @param {string} dir + * @param {string} file + * @private + */ + +View.prototype.resolve = function resolve(dir, file) { + var ext = this.ext; + + // . + var path = join(dir, file); + var stat = tryStat(path); + + if (stat && stat.isFile()) { + return path; + } + + // /index. + path = join(dir, basename(file, ext), 'index' + ext); + stat = tryStat(path); + + if (stat && stat.isFile()) { + return path; + } +}; + +/** + * Return a stat, maybe. + * + * @param {string} path + * @return {fs.Stats} + * @private + */ + +function tryStat(path) { + debug('stat "%s"', path); + + try { + return fs.statSync(path); + } catch (e) { + return undefined; + } +} diff --git a/node_modules/express/node_modules/body-parser/HISTORY.md b/node_modules/express/node_modules/body-parser/HISTORY.md new file mode 100644 index 00000000..a1d3fbfb --- /dev/null +++ b/node_modules/express/node_modules/body-parser/HISTORY.md @@ -0,0 +1,609 @@ +1.19.0 / 2019-04-25 +=================== + + * deps: bytes@3.1.0 + - Add petabyte (`pb`) support + * deps: http-errors@1.7.2 + - Set constructor name when possible + - deps: setprototypeof@1.1.1 + - deps: statuses@'>= 1.5.0 < 2' + * deps: iconv-lite@0.4.24 + - Added encoding MIK + * deps: qs@6.7.0 + - Fix parsing array brackets after index + * deps: raw-body@2.4.0 + - deps: bytes@3.1.0 + - deps: http-errors@1.7.2 + - deps: iconv-lite@0.4.24 + * deps: type-is@~1.6.17 + - deps: mime-types@~2.1.24 + - perf: prevent internal `throw` on invalid type + +1.18.3 / 2018-05-14 +=================== + + * Fix stack trace for strict json parse error + * deps: depd@~1.1.2 + - perf: remove argument reassignment + * deps: http-errors@~1.6.3 + - deps: depd@~1.1.2 + - deps: setprototypeof@1.1.0 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.23 + - Fix loading encoding with year appended + - Fix deprecation warnings on Node.js 10+ + * deps: qs@6.5.2 + * deps: raw-body@2.3.3 + - deps: http-errors@1.6.3 + - deps: iconv-lite@0.4.23 + * deps: type-is@~1.6.16 + - deps: mime-types@~2.1.18 + +1.18.2 / 2017-09-22 +=================== + + * deps: debug@2.6.9 + * perf: remove argument reassignment + +1.18.1 / 2017-09-12 +=================== + + * deps: content-type@~1.0.4 + - perf: remove argument reassignment + - perf: skip parameter parsing when no parameters + * deps: iconv-lite@0.4.19 + - Fix ISO-8859-1 regression + - Update Windows-1255 + * deps: qs@6.5.1 + - Fix parsing & compacting very deep objects + * deps: raw-body@2.3.2 + - deps: iconv-lite@0.4.19 + +1.18.0 / 2017-09-08 +=================== + + * Fix JSON strict violation error to match native parse error + * Include the `body` property on verify errors + * Include the `type` property on all generated errors + * Use `http-errors` to set status code on errors + * deps: bytes@3.0.0 + * deps: debug@2.6.8 + * deps: depd@~1.1.1 + - Remove unnecessary `Buffer` loading + * deps: http-errors@~1.6.2 + - deps: depd@1.1.1 + * deps: iconv-lite@0.4.18 + - Add support for React Native + - Add a warning if not loaded as utf-8 + - Fix CESU-8 decoding in Node.js 8 + - Improve speed of ISO-8859-1 encoding + * deps: qs@6.5.0 + * deps: raw-body@2.3.1 + - Use `http-errors` for standard emitted errors + - deps: bytes@3.0.0 + - deps: iconv-lite@0.4.18 + - perf: skip buffer decoding on overage chunk + * perf: prevent internal `throw` when missing charset + +1.17.2 / 2017-05-17 +=================== + + * deps: debug@2.6.7 + - Fix `DEBUG_MAX_ARRAY_LENGTH` + - deps: ms@2.0.0 + * deps: type-is@~1.6.15 + - deps: mime-types@~2.1.15 + +1.17.1 / 2017-03-06 +=================== + + * deps: qs@6.4.0 + - Fix regression parsing keys starting with `[` + +1.17.0 / 2017-03-01 +=================== + + * deps: http-errors@~1.6.1 + - Make `message` property enumerable for `HttpError`s + - deps: setprototypeof@1.0.3 + * deps: qs@6.3.1 + - Fix compacting nested arrays + +1.16.1 / 2017-02-10 +=================== + + * deps: debug@2.6.1 + - Fix deprecation messages in WebStorm and other editors + - Undeprecate `DEBUG_FD` set to `1` or `2` + +1.16.0 / 2017-01-17 +=================== + + * deps: debug@2.6.0 + - Allow colors in workers + - Deprecated `DEBUG_FD` environment variable + - Fix error when running under React Native + - Use same color for same namespace + - deps: ms@0.7.2 + * deps: http-errors@~1.5.1 + - deps: inherits@2.0.3 + - deps: setprototypeof@1.0.2 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.15 + - Added encoding MS-31J + - Added encoding MS-932 + - Added encoding MS-936 + - Added encoding MS-949 + - Added encoding MS-950 + - Fix GBK/GB18030 handling of Euro character + * deps: qs@6.2.1 + - Fix array parsing from skipping empty values + * deps: raw-body@~2.2.0 + - deps: iconv-lite@0.4.15 + * deps: type-is@~1.6.14 + - deps: mime-types@~2.1.13 + +1.15.2 / 2016-06-19 +=================== + + * deps: bytes@2.4.0 + * deps: content-type@~1.0.2 + - perf: enable strict mode + * deps: http-errors@~1.5.0 + - Use `setprototypeof` module to replace `__proto__` setting + - deps: statuses@'>= 1.3.0 < 2' + - perf: enable strict mode + * deps: qs@6.2.0 + * deps: raw-body@~2.1.7 + - deps: bytes@2.4.0 + - perf: remove double-cleanup on happy path + * deps: type-is@~1.6.13 + - deps: mime-types@~2.1.11 + +1.15.1 / 2016-05-05 +=================== + + * deps: bytes@2.3.0 + - Drop partial bytes on all parsed units + - Fix parsing byte string that looks like hex + * deps: raw-body@~2.1.6 + - deps: bytes@2.3.0 + * deps: type-is@~1.6.12 + - deps: mime-types@~2.1.10 + +1.15.0 / 2016-02-10 +=================== + + * deps: http-errors@~1.4.0 + - Add `HttpError` export, for `err instanceof createError.HttpError` + - deps: inherits@2.0.1 + - deps: statuses@'>= 1.2.1 < 2' + * deps: qs@6.1.0 + * deps: type-is@~1.6.11 + - deps: mime-types@~2.1.9 + +1.14.2 / 2015-12-16 +=================== + + * deps: bytes@2.2.0 + * deps: iconv-lite@0.4.13 + * deps: qs@5.2.0 + * deps: raw-body@~2.1.5 + - deps: bytes@2.2.0 + - deps: iconv-lite@0.4.13 + * deps: type-is@~1.6.10 + - deps: mime-types@~2.1.8 + +1.14.1 / 2015-09-27 +=================== + + * Fix issue where invalid charset results in 400 when `verify` used + * deps: iconv-lite@0.4.12 + - Fix CESU-8 decoding in Node.js 4.x + * deps: raw-body@~2.1.4 + - Fix masking critical errors from `iconv-lite` + - deps: iconv-lite@0.4.12 + * deps: type-is@~1.6.9 + - deps: mime-types@~2.1.7 + +1.14.0 / 2015-09-16 +=================== + + * Fix JSON strict parse error to match syntax errors + * Provide static `require` analysis in `urlencoded` parser + * deps: depd@~1.1.0 + - Support web browser loading + * deps: qs@5.1.0 + * deps: raw-body@~2.1.3 + - Fix sync callback when attaching data listener causes sync read + * deps: type-is@~1.6.8 + - Fix type error when given invalid type to match against + - deps: mime-types@~2.1.6 + +1.13.3 / 2015-07-31 +=================== + + * deps: type-is@~1.6.6 + - deps: mime-types@~2.1.4 + +1.13.2 / 2015-07-05 +=================== + + * deps: iconv-lite@0.4.11 + * deps: qs@4.0.0 + - Fix dropping parameters like `hasOwnProperty` + - Fix user-visible incompatibilities from 3.1.0 + - Fix various parsing edge cases + * deps: raw-body@~2.1.2 + - Fix error stack traces to skip `makeError` + - deps: iconv-lite@0.4.11 + * deps: type-is@~1.6.4 + - deps: mime-types@~2.1.2 + - perf: enable strict mode + - perf: remove argument reassignment + +1.13.1 / 2015-06-16 +=================== + + * deps: qs@2.4.2 + - Downgraded from 3.1.0 because of user-visible incompatibilities + +1.13.0 / 2015-06-14 +=================== + + * Add `statusCode` property on `Error`s, in addition to `status` + * Change `type` default to `application/json` for JSON parser + * Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser + * Provide static `require` analysis + * Use the `http-errors` module to generate errors + * deps: bytes@2.1.0 + - Slight optimizations + * deps: iconv-lite@0.4.10 + - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails + - Leading BOM is now removed when decoding + * deps: on-finished@~2.3.0 + - Add defined behavior for HTTP `CONNECT` requests + - Add defined behavior for HTTP `Upgrade` requests + - deps: ee-first@1.1.1 + * deps: qs@3.1.0 + - Fix dropping parameters like `hasOwnProperty` + - Fix various parsing edge cases + - Parsed object now has `null` prototype + * deps: raw-body@~2.1.1 + - Use `unpipe` module for unpiping requests + - deps: iconv-lite@0.4.10 + * deps: type-is@~1.6.3 + - deps: mime-types@~2.1.1 + - perf: reduce try block size + - perf: remove bitwise operations + * perf: enable strict mode + * perf: remove argument reassignment + * perf: remove delete call + +1.12.4 / 2015-05-10 +=================== + + * deps: debug@~2.2.0 + * deps: qs@2.4.2 + - Fix allowing parameters like `constructor` + * deps: on-finished@~2.2.1 + * deps: raw-body@~2.0.1 + - Fix a false-positive when unpiping in Node.js 0.8 + - deps: bytes@2.0.1 + * deps: type-is@~1.6.2 + - deps: mime-types@~2.0.11 + +1.12.3 / 2015-04-15 +=================== + + * Slight efficiency improvement when not debugging + * deps: depd@~1.0.1 + * deps: iconv-lite@0.4.8 + - Add encoding alias UNICODE-1-1-UTF-7 + * deps: raw-body@1.3.4 + - Fix hanging callback if request aborts during read + - deps: iconv-lite@0.4.8 + +1.12.2 / 2015-03-16 +=================== + + * deps: qs@2.4.1 + - Fix error when parameter `hasOwnProperty` is present + +1.12.1 / 2015-03-15 +=================== + + * deps: debug@~2.1.3 + - Fix high intensity foreground color for bold + - deps: ms@0.7.0 + * deps: type-is@~1.6.1 + - deps: mime-types@~2.0.10 + +1.12.0 / 2015-02-13 +=================== + + * add `debug` messages + * accept a function for the `type` option + * use `content-type` to parse `Content-Type` headers + * deps: iconv-lite@0.4.7 + - Gracefully support enumerables on `Object.prototype` + * deps: raw-body@1.3.3 + - deps: iconv-lite@0.4.7 + * deps: type-is@~1.6.0 + - fix argument reassignment + - fix false-positives in `hasBody` `Transfer-Encoding` check + - support wildcard for both type and subtype (`*/*`) + - deps: mime-types@~2.0.9 + +1.11.0 / 2015-01-30 +=================== + + * make internal `extended: true` depth limit infinity + * deps: type-is@~1.5.6 + - deps: mime-types@~2.0.8 + +1.10.2 / 2015-01-20 +=================== + + * deps: iconv-lite@0.4.6 + - Fix rare aliases of single-byte encodings + * deps: raw-body@1.3.2 + - deps: iconv-lite@0.4.6 + +1.10.1 / 2015-01-01 +=================== + + * deps: on-finished@~2.2.0 + * deps: type-is@~1.5.5 + - deps: mime-types@~2.0.7 + +1.10.0 / 2014-12-02 +=================== + + * make internal `extended: true` array limit dynamic + +1.9.3 / 2014-11-21 +================== + + * deps: iconv-lite@0.4.5 + - Fix Windows-31J and X-SJIS encoding support + * deps: qs@2.3.3 + - Fix `arrayLimit` behavior + * deps: raw-body@1.3.1 + - deps: iconv-lite@0.4.5 + * deps: type-is@~1.5.3 + - deps: mime-types@~2.0.3 + +1.9.2 / 2014-10-27 +================== + + * deps: qs@2.3.2 + - Fix parsing of mixed objects and values + +1.9.1 / 2014-10-22 +================== + + * deps: on-finished@~2.1.1 + - Fix handling of pipelined requests + * deps: qs@2.3.0 + - Fix parsing of mixed implicit and explicit arrays + * deps: type-is@~1.5.2 + - deps: mime-types@~2.0.2 + +1.9.0 / 2014-09-24 +================== + + * include the charset in "unsupported charset" error message + * include the encoding in "unsupported content encoding" error message + * deps: depd@~1.0.0 + +1.8.4 / 2014-09-23 +================== + + * fix content encoding to be case-insensitive + +1.8.3 / 2014-09-19 +================== + + * deps: qs@2.2.4 + - Fix issue with object keys starting with numbers truncated + +1.8.2 / 2014-09-15 +================== + + * deps: depd@0.4.5 + +1.8.1 / 2014-09-07 +================== + + * deps: media-typer@0.3.0 + * deps: type-is@~1.5.1 + +1.8.0 / 2014-09-05 +================== + + * make empty-body-handling consistent between chunked requests + - empty `json` produces `{}` + - empty `raw` produces `new Buffer(0)` + - empty `text` produces `''` + - empty `urlencoded` produces `{}` + * deps: qs@2.2.3 + - Fix issue where first empty value in array is discarded + * deps: type-is@~1.5.0 + - fix `hasbody` to be true for `content-length: 0` + +1.7.0 / 2014-09-01 +================== + + * add `parameterLimit` option to `urlencoded` parser + * change `urlencoded` extended array limit to 100 + * respond with 413 when over `parameterLimit` in `urlencoded` + +1.6.7 / 2014-08-29 +================== + + * deps: qs@2.2.2 + - Remove unnecessary cloning + +1.6.6 / 2014-08-27 +================== + + * deps: qs@2.2.0 + - Array parsing fix + - Performance improvements + +1.6.5 / 2014-08-16 +================== + + * deps: on-finished@2.1.0 + +1.6.4 / 2014-08-14 +================== + + * deps: qs@1.2.2 + +1.6.3 / 2014-08-10 +================== + + * deps: qs@1.2.1 + +1.6.2 / 2014-08-07 +================== + + * deps: qs@1.2.0 + - Fix parsing array of objects + +1.6.1 / 2014-08-06 +================== + + * deps: qs@1.1.0 + - Accept urlencoded square brackets + - Accept empty values in implicit array notation + +1.6.0 / 2014-08-05 +================== + + * deps: qs@1.0.2 + - Complete rewrite + - Limits array length to 20 + - Limits object depth to 5 + - Limits parameters to 1,000 + +1.5.2 / 2014-07-27 +================== + + * deps: depd@0.4.4 + - Work-around v8 generating empty stack traces + +1.5.1 / 2014-07-26 +================== + + * deps: depd@0.4.3 + - Fix exception when global `Error.stackTraceLimit` is too low + +1.5.0 / 2014-07-20 +================== + + * deps: depd@0.4.2 + - Add `TRACE_DEPRECATION` environment variable + - Remove non-standard grey color from color output + - Support `--no-deprecation` argument + - Support `--trace-deprecation` argument + * deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + * deps: raw-body@1.3.0 + - deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + - Fix `Cannot switch to old mode now` error on Node.js 0.10+ + * deps: type-is@~1.3.2 + +1.4.3 / 2014-06-19 +================== + + * deps: type-is@1.3.1 + - fix global variable leak + +1.4.2 / 2014-06-19 +================== + + * deps: type-is@1.3.0 + - improve type parsing + +1.4.1 / 2014-06-19 +================== + + * fix urlencoded extended deprecation message + +1.4.0 / 2014-06-19 +================== + + * add `text` parser + * add `raw` parser + * check accepted charset in content-type (accepts utf-8) + * check accepted encoding in content-encoding (accepts identity) + * deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed + * deprecate `urlencoded()` without provided `extended` option + * lazy-load urlencoded parsers + * parsers split into files for reduced mem usage + * support gzip and deflate bodies + - set `inflate: false` to turn off + * deps: raw-body@1.2.2 + - Support all encodings from `iconv-lite` + +1.3.1 / 2014-06-11 +================== + + * deps: type-is@1.2.1 + - Switch dependency from mime to mime-types@1.0.0 + +1.3.0 / 2014-05-31 +================== + + * add `extended` option to urlencoded parser + +1.2.2 / 2014-05-27 +================== + + * deps: raw-body@1.1.6 + - assert stream encoding on node.js 0.8 + - assert stream encoding on node.js < 0.10.6 + - deps: bytes@1 + +1.2.1 / 2014-05-26 +================== + + * invoke `next(err)` after request fully read + - prevents hung responses and socket hang ups + +1.2.0 / 2014-05-11 +================== + + * add `verify` option + * deps: type-is@1.2.0 + - support suffix matching + +1.1.2 / 2014-05-11 +================== + + * improve json parser speed + +1.1.1 / 2014-05-11 +================== + + * fix repeated limit parsing with every request + +1.1.0 / 2014-05-10 +================== + + * add `type` option + * deps: pin for safety and consistency + +1.0.2 / 2014-04-14 +================== + + * use `type-is` module + +1.0.1 / 2014-03-20 +================== + + * lower default limits to 100kb diff --git a/node_modules/express/node_modules/body-parser/LICENSE b/node_modules/express/node_modules/body-parser/LICENSE new file mode 100644 index 00000000..386b7b69 --- /dev/null +++ b/node_modules/express/node_modules/body-parser/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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/node_modules/express/node_modules/body-parser/README.md b/node_modules/express/node_modules/body-parser/README.md new file mode 100644 index 00000000..aba6297a --- /dev/null +++ b/node_modules/express/node_modules/body-parser/README.md @@ -0,0 +1,443 @@ +# body-parser + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Node.js body parsing middleware. + +Parse incoming request bodies in a middleware before your handlers, available +under the `req.body` property. + +**Note** As `req.body`'s shape is based on user-controlled input, all +properties and values in this object are untrusted and should be validated +before trusting. For example, `req.body.foo.toString()` may fail in multiple +ways, for example the `foo` property may not be there or may not be a string, +and `toString` may not be a function and instead a string or other user input. + +[Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/). + +_This does not handle multipart bodies_, due to their complex and typically +large nature. For multipart bodies, you may be interested in the following +modules: + + * [busboy](https://www.npmjs.org/package/busboy#readme) and + [connect-busboy](https://www.npmjs.org/package/connect-busboy#readme) + * [multiparty](https://www.npmjs.org/package/multiparty#readme) and + [connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme) + * [formidable](https://www.npmjs.org/package/formidable#readme) + * [multer](https://www.npmjs.org/package/multer#readme) + +This module provides the following parsers: + + * [JSON body parser](#bodyparserjsonoptions) + * [Raw body parser](#bodyparserrawoptions) + * [Text body parser](#bodyparsertextoptions) + * [URL-encoded form body parser](#bodyparserurlencodedoptions) + +Other body parsers you might be interested in: + +- [body](https://www.npmjs.org/package/body#readme) +- [co-body](https://www.npmjs.org/package/co-body#readme) + +## Installation + +```sh +$ npm install body-parser +``` + +## API + + + +```js +var bodyParser = require('body-parser') +``` + +The `bodyParser` object exposes various factories to create middlewares. All +middlewares will populate the `req.body` property with the parsed body when +the `Content-Type` request header matches the `type` option, or an empty +object (`{}`) if there was no body to parse, the `Content-Type` was not matched, +or an error occurred. + +The various errors returned by this module are described in the +[errors section](#errors). + +### bodyParser.json([options]) + +Returns middleware that only parses `json` and only looks at requests where +the `Content-Type` header matches the `type` option. This parser accepts any +Unicode encoding of the body and supports automatic inflation of `gzip` and +`deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). + +#### Options + +The `json` function takes an optional `options` object that may contain any of +the following keys: + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### reviver + +The `reviver` option is passed directly to `JSON.parse` as the second +argument. You can find more information on this argument +[in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter). + +##### strict + +When set to `true`, will only accept arrays and objects; when `false` will +accept anything `JSON.parse` accepts. Defaults to `true`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not a +function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `json`), a mime type (like `application/json`), or +a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type` +option is called as `fn(req)` and the request is parsed if it returns a truthy +value. Defaults to `application/json`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.raw([options]) + +Returns middleware that parses all bodies as a `Buffer` and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser supports automatic inflation of `gzip` and `deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This will be a `Buffer` object +of the body. + +#### Options + +The `raw` function takes an optional `options` object that may contain any of +the following keys: + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. +If not a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this +can be an extension name (like `bin`), a mime type (like +`application/octet-stream`), or a mime type with a wildcard (like `*/*` or +`application/*`). If a function, the `type` option is called as `fn(req)` +and the request is parsed if it returns a truthy value. Defaults to +`application/octet-stream`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.text([options]) + +Returns middleware that parses all bodies as a string and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser supports automatic inflation of `gzip` and `deflate` encodings. + +A new `body` string containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This will be a string of the +body. + +#### Options + +The `text` function takes an optional `options` object that may contain any of +the following keys: + +##### defaultCharset + +Specify the default character set for the text content if the charset is not +specified in the `Content-Type` header of the request. Defaults to `utf-8`. + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not +a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `txt`), a mime type (like `text/plain`), or a mime +type with a wildcard (like `*/*` or `text/*`). If a function, the `type` +option is called as `fn(req)` and the request is parsed if it returns a +truthy value. Defaults to `text/plain`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.urlencoded([options]) + +Returns middleware that only parses `urlencoded` bodies and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser accepts only UTF-8 encoding of the body and supports automatic +inflation of `gzip` and `deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This object will contain +key-value pairs, where the value can be a string or array (when `extended` is +`false`), or any type (when `extended` is `true`). + +#### Options + +The `urlencoded` function takes an optional `options` object that may contain +any of the following keys: + +##### extended + +The `extended` option allows to choose between parsing the URL-encoded data +with the `querystring` library (when `false`) or the `qs` library (when +`true`). The "extended" syntax allows for rich objects and arrays to be +encoded into the URL-encoded format, allowing for a JSON-like experience +with URL-encoded. For more information, please +[see the qs library](https://www.npmjs.org/package/qs#readme). + +Defaults to `true`, but using the default has been deprecated. Please +research into the difference between `qs` and `querystring` and choose the +appropriate setting. + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### parameterLimit + +The `parameterLimit` option controls the maximum number of parameters that +are allowed in the URL-encoded data. If a request contains more parameters +than this value, a 413 will be returned to the client. Defaults to `1000`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not +a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `urlencoded`), a mime type (like +`application/x-www-form-urlencoded`), or a mime type with a wildcard (like +`*/x-www-form-urlencoded`). If a function, the `type` option is called as +`fn(req)` and the request is parsed if it returns a truthy value. Defaults +to `application/x-www-form-urlencoded`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +## Errors + +The middlewares provided by this module create errors depending on the error +condition during parsing. The errors will typically have a `status`/`statusCode` +property that contains the suggested HTTP response code, an `expose` property +to determine if the `message` property should be displayed to the client, a +`type` property to determine the type of error without matching against the +`message`, and a `body` property containing the read body, if available. + +The following are the common errors emitted, though any error can come through +for various reasons. + +### content encoding unsupported + +This error will occur when the request had a `Content-Encoding` header that +contained an encoding but the "inflation" option was set to `false`. The +`status` property is set to `415`, the `type` property is set to +`'encoding.unsupported'`, and the `charset` property will be set to the +encoding that is unsupported. + +### request aborted + +This error will occur when the request is aborted by the client before reading +the body has finished. The `received` property will be set to the number of +bytes received before the request was aborted and the `expected` property is +set to the number of expected bytes. The `status` property is set to `400` +and `type` property is set to `'request.aborted'`. + +### request entity too large + +This error will occur when the request body's size is larger than the "limit" +option. The `limit` property will be set to the byte limit and the `length` +property will be set to the request body's length. The `status` property is +set to `413` and the `type` property is set to `'entity.too.large'`. + +### request size did not match content length + +This error will occur when the request's length did not match the length from +the `Content-Length` header. This typically occurs when the request is malformed, +typically when the `Content-Length` header was calculated based on characters +instead of bytes. The `status` property is set to `400` and the `type` property +is set to `'request.size.invalid'`. + +### stream encoding should not be set + +This error will occur when something called the `req.setEncoding` method prior +to this middleware. This module operates directly on bytes only and you cannot +call `req.setEncoding` when using this module. The `status` property is set to +`500` and the `type` property is set to `'stream.encoding.set'`. + +### too many parameters + +This error will occur when the content of the request exceeds the configured +`parameterLimit` for the `urlencoded` parser. The `status` property is set to +`413` and the `type` property is set to `'parameters.too.many'`. + +### unsupported charset "BOGUS" + +This error will occur when the request had a charset parameter in the +`Content-Type` header, but the `iconv-lite` module does not support it OR the +parser does not support it. The charset is contained in the message as well +as in the `charset` property. The `status` property is set to `415`, the +`type` property is set to `'charset.unsupported'`, and the `charset` property +is set to the charset that is unsupported. + +### unsupported content encoding "bogus" + +This error will occur when the request had a `Content-Encoding` header that +contained an unsupported encoding. The encoding is contained in the message +as well as in the `encoding` property. The `status` property is set to `415`, +the `type` property is set to `'encoding.unsupported'`, and the `encoding` +property is set to the encoding that is unsupported. + +## Examples + +### Express/Connect top-level generic + +This example demonstrates adding a generic JSON and URL-encoded parser as a +top-level middleware, which will parse the bodies of all incoming requests. +This is the simplest setup. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// parse application/x-www-form-urlencoded +app.use(bodyParser.urlencoded({ extended: false })) + +// parse application/json +app.use(bodyParser.json()) + +app.use(function (req, res) { + res.setHeader('Content-Type', 'text/plain') + res.write('you posted:\n') + res.end(JSON.stringify(req.body, null, 2)) +}) +``` + +### Express route-specific + +This example demonstrates adding body parsers specifically to the routes that +need them. In general, this is the most recommended way to use body-parser with +Express. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// create application/json parser +var jsonParser = bodyParser.json() + +// create application/x-www-form-urlencoded parser +var urlencodedParser = bodyParser.urlencoded({ extended: false }) + +// POST /login gets urlencoded bodies +app.post('/login', urlencodedParser, function (req, res) { + res.send('welcome, ' + req.body.username) +}) + +// POST /api/users gets JSON bodies +app.post('/api/users', jsonParser, function (req, res) { + // create user in req.body +}) +``` + +### Change accepted type for parsers + +All the parsers accept a `type` option which allows you to change the +`Content-Type` that the middleware will parse. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// parse various different custom JSON types as JSON +app.use(bodyParser.json({ type: 'application/*+json' })) + +// parse some custom thing into a Buffer +app.use(bodyParser.raw({ type: 'application/vnd.custom-type' })) + +// parse an HTML body into a string +app.use(bodyParser.text({ type: 'text/html' })) +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/body-parser.svg +[npm-url]: https://npmjs.org/package/body-parser +[travis-image]: https://img.shields.io/travis/expressjs/body-parser/master.svg +[travis-url]: https://travis-ci.org/expressjs/body-parser +[coveralls-image]: https://img.shields.io/coveralls/expressjs/body-parser/master.svg +[coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master +[downloads-image]: https://img.shields.io/npm/dm/body-parser.svg +[downloads-url]: https://npmjs.org/package/body-parser diff --git a/node_modules/express/node_modules/body-parser/index.js b/node_modules/express/node_modules/body-parser/index.js new file mode 100644 index 00000000..93c3a1ff --- /dev/null +++ b/node_modules/express/node_modules/body-parser/index.js @@ -0,0 +1,157 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var deprecate = require('depd')('body-parser') + +/** + * Cache of loaded parsers. + * @private + */ + +var parsers = Object.create(null) + +/** + * @typedef Parsers + * @type {function} + * @property {function} json + * @property {function} raw + * @property {function} text + * @property {function} urlencoded + */ + +/** + * Module exports. + * @type {Parsers} + */ + +exports = module.exports = deprecate.function(bodyParser, + 'bodyParser: use individual json/urlencoded middlewares') + +/** + * JSON parser. + * @public + */ + +Object.defineProperty(exports, 'json', { + configurable: true, + enumerable: true, + get: createParserGetter('json') +}) + +/** + * Raw parser. + * @public + */ + +Object.defineProperty(exports, 'raw', { + configurable: true, + enumerable: true, + get: createParserGetter('raw') +}) + +/** + * Text parser. + * @public + */ + +Object.defineProperty(exports, 'text', { + configurable: true, + enumerable: true, + get: createParserGetter('text') +}) + +/** + * URL-encoded parser. + * @public + */ + +Object.defineProperty(exports, 'urlencoded', { + configurable: true, + enumerable: true, + get: createParserGetter('urlencoded') +}) + +/** + * Create a middleware to parse json and urlencoded bodies. + * + * @param {object} [options] + * @return {function} + * @deprecated + * @public + */ + +function bodyParser (options) { + var opts = {} + + // exclude type option + if (options) { + for (var prop in options) { + if (prop !== 'type') { + opts[prop] = options[prop] + } + } + } + + var _urlencoded = exports.urlencoded(opts) + var _json = exports.json(opts) + + return function bodyParser (req, res, next) { + _json(req, res, function (err) { + if (err) return next(err) + _urlencoded(req, res, next) + }) + } +} + +/** + * Create a getter for loading a parser. + * @private + */ + +function createParserGetter (name) { + return function get () { + return loadParser(name) + } +} + +/** + * Load a parser module. + * @private + */ + +function loadParser (parserName) { + var parser = parsers[parserName] + + if (parser !== undefined) { + return parser + } + + // this uses a switch for static require analysis + switch (parserName) { + case 'json': + parser = require('./lib/types/json') + break + case 'raw': + parser = require('./lib/types/raw') + break + case 'text': + parser = require('./lib/types/text') + break + case 'urlencoded': + parser = require('./lib/types/urlencoded') + break + } + + // store to prevent invoking require() + return (parsers[parserName] = parser) +} diff --git a/node_modules/express/node_modules/body-parser/lib/read.js b/node_modules/express/node_modules/body-parser/lib/read.js new file mode 100644 index 00000000..c1026095 --- /dev/null +++ b/node_modules/express/node_modules/body-parser/lib/read.js @@ -0,0 +1,181 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var createError = require('http-errors') +var getBody = require('raw-body') +var iconv = require('iconv-lite') +var onFinished = require('on-finished') +var zlib = require('zlib') + +/** + * Module exports. + */ + +module.exports = read + +/** + * Read a request into a buffer and parse. + * + * @param {object} req + * @param {object} res + * @param {function} next + * @param {function} parse + * @param {function} debug + * @param {object} options + * @private + */ + +function read (req, res, next, parse, debug, options) { + var length + var opts = options + var stream + + // flag as parsed + req._body = true + + // read options + var encoding = opts.encoding !== null + ? opts.encoding + : null + var verify = opts.verify + + try { + // get the content stream + stream = contentstream(req, debug, opts.inflate) + length = stream.length + stream.length = undefined + } catch (err) { + return next(err) + } + + // set raw-body options + opts.length = length + opts.encoding = verify + ? null + : encoding + + // assert charset is supported + if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) { + return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { + charset: encoding.toLowerCase(), + type: 'charset.unsupported' + })) + } + + // read body + debug('read body') + getBody(stream, opts, function (error, body) { + if (error) { + var _error + + if (error.type === 'encoding.unsupported') { + // echo back charset + _error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { + charset: encoding.toLowerCase(), + type: 'charset.unsupported' + }) + } else { + // set status code on error + _error = createError(400, error) + } + + // read off entire request + stream.resume() + onFinished(req, function onfinished () { + next(createError(400, _error)) + }) + return + } + + // verify + if (verify) { + try { + debug('verify body') + verify(req, res, body, encoding) + } catch (err) { + next(createError(403, err, { + body: body, + type: err.type || 'entity.verify.failed' + })) + return + } + } + + // parse + var str = body + try { + debug('parse body') + str = typeof body !== 'string' && encoding !== null + ? iconv.decode(body, encoding) + : body + req.body = parse(str) + } catch (err) { + next(createError(400, err, { + body: str, + type: err.type || 'entity.parse.failed' + })) + return + } + + next() + }) +} + +/** + * Get the content stream of the request. + * + * @param {object} req + * @param {function} debug + * @param {boolean} [inflate=true] + * @return {object} + * @api private + */ + +function contentstream (req, debug, inflate) { + var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase() + var length = req.headers['content-length'] + var stream + + debug('content-encoding "%s"', encoding) + + if (inflate === false && encoding !== 'identity') { + throw createError(415, 'content encoding unsupported', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } + + switch (encoding) { + case 'deflate': + stream = zlib.createInflate() + debug('inflate body') + req.pipe(stream) + break + case 'gzip': + stream = zlib.createGunzip() + debug('gunzip body') + req.pipe(stream) + break + case 'identity': + stream = req + stream.length = length + break + default: + throw createError(415, 'unsupported content encoding "' + encoding + '"', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } + + return stream +} diff --git a/node_modules/express/node_modules/body-parser/lib/types/json.js b/node_modules/express/node_modules/body-parser/lib/types/json.js new file mode 100644 index 00000000..2971dc14 --- /dev/null +++ b/node_modules/express/node_modules/body-parser/lib/types/json.js @@ -0,0 +1,230 @@ +/*! + * body-parser + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var createError = require('http-errors') +var debug = require('debug')('body-parser:json') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = json + +/** + * RegExp to match the first non-space in a string. + * + * Allowed whitespace is defined in RFC 7159: + * + * ws = *( + * %x20 / ; Space + * %x09 / ; Horizontal tab + * %x0A / ; Line feed or New line + * %x0D ) ; Carriage return + */ + +var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*(.)/ // eslint-disable-line no-control-regex + +/** + * Create a middleware to parse JSON bodies. + * + * @param {object} [options] + * @return {function} + * @public + */ + +function json (options) { + var opts = options || {} + + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var inflate = opts.inflate !== false + var reviver = opts.reviver + var strict = opts.strict !== false + var type = opts.type || 'application/json' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (body) { + if (body.length === 0) { + // special-case empty json body, as it's a common client-side mistake + // TODO: maybe make this configurable or part of "strict" option + return {} + } + + if (strict) { + var first = firstchar(body) + + if (first !== '{' && first !== '[') { + debug('strict violation') + throw createStrictSyntaxError(body, first) + } + } + + try { + debug('parse json') + return JSON.parse(body, reviver) + } catch (e) { + throw normalizeJsonSyntaxError(e, { + message: e.message, + stack: e.stack + }) + } + } + + return function jsonParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // assert charset per RFC 7159 sec 8.1 + var charset = getCharset(req) || 'utf-8' + if (charset.substr(0, 4) !== 'utf-') { + debug('invalid charset') + next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { + charset: charset, + type: 'charset.unsupported' + })) + return + } + + // read + read(req, res, next, parse, debug, { + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Create strict violation syntax error matching native error. + * + * @param {string} str + * @param {string} char + * @return {Error} + * @private + */ + +function createStrictSyntaxError (str, char) { + var index = str.indexOf(char) + var partial = str.substring(0, index) + '#' + + try { + JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation') + } catch (e) { + return normalizeJsonSyntaxError(e, { + message: e.message.replace('#', char), + stack: e.stack + }) + } +} + +/** + * Get the first non-whitespace character in a string. + * + * @param {string} str + * @return {function} + * @private + */ + +function firstchar (str) { + return FIRST_CHAR_REGEXP.exec(str)[1] +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Normalize a SyntaxError for JSON.parse. + * + * @param {SyntaxError} error + * @param {object} obj + * @return {SyntaxError} + */ + +function normalizeJsonSyntaxError (error, obj) { + var keys = Object.getOwnPropertyNames(error) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + if (key !== 'stack' && key !== 'message') { + delete error[key] + } + } + + // replace stack before message for Node.js 0.10 and below + error.stack = obj.stack.replace(error.message, obj.message) + error.message = obj.message + + return error +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/express/node_modules/body-parser/lib/types/raw.js b/node_modules/express/node_modules/body-parser/lib/types/raw.js new file mode 100644 index 00000000..f5d1b674 --- /dev/null +++ b/node_modules/express/node_modules/body-parser/lib/types/raw.js @@ -0,0 +1,101 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + */ + +var bytes = require('bytes') +var debug = require('debug')('body-parser:raw') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = raw + +/** + * Create a middleware to parse raw bodies. + * + * @param {object} [options] + * @return {function} + * @api public + */ + +function raw (options) { + var opts = options || {} + + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'application/octet-stream' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (buf) { + return buf + } + + return function rawParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // read + read(req, res, next, parse, debug, { + encoding: null, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/express/node_modules/body-parser/lib/types/text.js b/node_modules/express/node_modules/body-parser/lib/types/text.js new file mode 100644 index 00000000..083a0090 --- /dev/null +++ b/node_modules/express/node_modules/body-parser/lib/types/text.js @@ -0,0 +1,121 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var debug = require('debug')('body-parser:text') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = text + +/** + * Create a middleware to parse text bodies. + * + * @param {object} [options] + * @return {function} + * @api public + */ + +function text (options) { + var opts = options || {} + + var defaultCharset = opts.defaultCharset || 'utf-8' + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'text/plain' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (buf) { + return buf + } + + return function textParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // get charset + var charset = getCharset(req) || defaultCharset + + // read + read(req, res, next, parse, debug, { + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/express/node_modules/body-parser/lib/types/urlencoded.js b/node_modules/express/node_modules/body-parser/lib/types/urlencoded.js new file mode 100644 index 00000000..b2ca8f16 --- /dev/null +++ b/node_modules/express/node_modules/body-parser/lib/types/urlencoded.js @@ -0,0 +1,284 @@ +/*! + * body-parser + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var createError = require('http-errors') +var debug = require('debug')('body-parser:urlencoded') +var deprecate = require('depd')('body-parser') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = urlencoded + +/** + * Cache of parser modules. + */ + +var parsers = Object.create(null) + +/** + * Create a middleware to parse urlencoded bodies. + * + * @param {object} [options] + * @return {function} + * @public + */ + +function urlencoded (options) { + var opts = options || {} + + // notice because option default will flip in next major + if (opts.extended === undefined) { + deprecate('undefined extended: provide extended option') + } + + var extended = opts.extended !== false + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'application/x-www-form-urlencoded' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate query parser + var queryparse = extended + ? extendedparser(opts) + : simpleparser(opts) + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (body) { + return body.length + ? queryparse(body) + : {} + } + + return function urlencodedParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // assert charset + var charset = getCharset(req) || 'utf-8' + if (charset !== 'utf-8') { + debug('invalid charset') + next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { + charset: charset, + type: 'charset.unsupported' + })) + return + } + + // read + read(req, res, next, parse, debug, { + debug: debug, + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the extended query parser. + * + * @param {object} options + */ + +function extendedparser (options) { + var parameterLimit = options.parameterLimit !== undefined + ? options.parameterLimit + : 1000 + var parse = parser('qs') + + if (isNaN(parameterLimit) || parameterLimit < 1) { + throw new TypeError('option parameterLimit must be a positive number') + } + + if (isFinite(parameterLimit)) { + parameterLimit = parameterLimit | 0 + } + + return function queryparse (body) { + var paramCount = parameterCount(body, parameterLimit) + + if (paramCount === undefined) { + debug('too many parameters') + throw createError(413, 'too many parameters', { + type: 'parameters.too.many' + }) + } + + var arrayLimit = Math.max(100, paramCount) + + debug('parse extended urlencoding') + return parse(body, { + allowPrototypes: true, + arrayLimit: arrayLimit, + depth: Infinity, + parameterLimit: parameterLimit + }) + } +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Count the number of parameters, stopping once limit reached + * + * @param {string} body + * @param {number} limit + * @api private + */ + +function parameterCount (body, limit) { + var count = 0 + var index = 0 + + while ((index = body.indexOf('&', index)) !== -1) { + count++ + index++ + + if (count === limit) { + return undefined + } + } + + return count +} + +/** + * Get parser for module name dynamically. + * + * @param {string} name + * @return {function} + * @api private + */ + +function parser (name) { + var mod = parsers[name] + + if (mod !== undefined) { + return mod.parse + } + + // this uses a switch for static require analysis + switch (name) { + case 'qs': + mod = require('qs') + break + case 'querystring': + mod = require('querystring') + break + } + + // store to prevent invoking require() + parsers[name] = mod + + return mod.parse +} + +/** + * Get the simple query parser. + * + * @param {object} options + */ + +function simpleparser (options) { + var parameterLimit = options.parameterLimit !== undefined + ? options.parameterLimit + : 1000 + var parse = parser('querystring') + + if (isNaN(parameterLimit) || parameterLimit < 1) { + throw new TypeError('option parameterLimit must be a positive number') + } + + if (isFinite(parameterLimit)) { + parameterLimit = parameterLimit | 0 + } + + return function queryparse (body) { + var paramCount = parameterCount(body, parameterLimit) + + if (paramCount === undefined) { + debug('too many parameters') + throw createError(413, 'too many parameters', { + type: 'parameters.too.many' + }) + } + + debug('parse urlencoding') + return parse(body, undefined, undefined, { maxKeys: parameterLimit }) + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/express/node_modules/body-parser/package.json b/node_modules/express/node_modules/body-parser/package.json new file mode 100644 index 00000000..c8e5a974 --- /dev/null +++ b/node_modules/express/node_modules/body-parser/package.json @@ -0,0 +1,91 @@ +{ + "_from": "body-parser@1.19.0", + "_id": "body-parser@1.19.0", + "_inBundle": false, + "_integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "_location": "/express/body-parser", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "body-parser@1.19.0", + "name": "body-parser", + "escapedName": "body-parser", + "rawSpec": "1.19.0", + "saveSpec": null, + "fetchSpec": "1.19.0" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "_shasum": "96b2709e57c9c4e09a6fd66a8fd979844f69f08a", + "_spec": "body-parser@1.19.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "bugs": { + "url": "https://github.com/expressjs/body-parser/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "deprecated": false, + "description": "Node.js body parsing middleware", + "devDependencies": { + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "istanbul": "0.4.5", + "methods": "1.1.2", + "mocha": "6.1.4", + "safe-buffer": "5.1.2", + "supertest": "4.0.2" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "lib/", + "LICENSE", + "HISTORY.md", + "index.js" + ], + "homepage": "https://github.com/expressjs/body-parser#readme", + "license": "MIT", + "name": "body-parser", + "repository": { + "type": "git", + "url": "git+https://github.com/expressjs/body-parser.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --require test/support/env --reporter spec --check-leaks --bail test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/" + }, + "version": "1.19.0" +} diff --git a/node_modules/express/package.json b/node_modules/express/package.json new file mode 100644 index 00000000..93022ebb --- /dev/null +++ b/node_modules/express/package.json @@ -0,0 +1,165 @@ +{ + "_from": "express@^4.17.1", + "_id": "express@4.17.1", + "_inBundle": false, + "_integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "_location": "/express", + "_phantomChildren": { + "bytes": "3.1.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "1.6.18" + }, + "_requested": { + "type": "range", + "registry": true, + "raw": "express@^4.17.1", + "name": "express", + "escapedName": "express", + "rawSpec": "^4.17.1", + "saveSpec": null, + "fetchSpec": "^4.17.1" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "_shasum": "4491fc38605cf51f8629d39c2b5d026f98a4c134", + "_spec": "express@^4.17.1", + "_where": "C:\\Users\\rin\\Desktop\\final", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "bugs": { + "url": "https://github.com/expressjs/express/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Aaron Heckmann", + "email": "aaron.heckmann+github@gmail.com" + }, + { + "name": "Ciaran Jessup", + "email": "ciaranj@gmail.com" + }, + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Guillermo Rauch", + "email": "rauchg@gmail.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com" + }, + { + "name": "Roman Shtylman", + "email": "shtylman+expressjs@gmail.com" + }, + { + "name": "Young Jae Sim", + "email": "hanul@hanul.me" + } + ], + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "deprecated": false, + "description": "Fast, unopinionated, minimalist web framework", + "devDependencies": { + "after": "0.8.2", + "connect-redis": "3.4.1", + "cookie-parser": "~1.4.4", + "cookie-session": "1.3.3", + "ejs": "2.6.1", + "eslint": "2.13.1", + "express-session": "1.16.1", + "hbs": "4.0.4", + "istanbul": "0.4.5", + "marked": "0.6.2", + "method-override": "3.0.0", + "mocha": "5.2.0", + "morgan": "1.9.1", + "multiparty": "4.2.1", + "pbkdf2-password": "1.2.1", + "should": "13.2.3", + "supertest": "3.3.0", + "vhost": "~3.0.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "files": [ + "LICENSE", + "History.md", + "Readme.md", + "index.js", + "lib/" + ], + "homepage": "http://expressjs.com/", + "keywords": [ + "express", + "framework", + "sinatra", + "web", + "rest", + "restful", + "router", + "app", + "api" + ], + "license": "MIT", + "name": "express", + "repository": { + "type": "git", + "url": "git+https://github.com/expressjs/express.git" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", + "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/" + }, + "version": "4.17.1" +} diff --git a/node_modules/filereader/.npmignore b/node_modules/filereader/.npmignore new file mode 100644 index 00000000..59d842ba --- /dev/null +++ b/node_modules/filereader/.npmignore @@ -0,0 +1,28 @@ +# 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 + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# Commenting this out is preferred by some people, see +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- +node_modules + +# Users Environment Variables +.lock-wscript diff --git a/node_modules/filereader/FileReader.js b/node_modules/filereader/FileReader.js new file mode 100644 index 00000000..d4709ff7 --- /dev/null +++ b/node_modules/filereader/FileReader.js @@ -0,0 +1,300 @@ +// +// FileReader +// +// http://www.w3.org/TR/FileAPI/#dfn-filereader +// https://developer.mozilla.org/en/DOM/FileReader +(function () { + "use strict"; + + var fs = require("fs") + , EventEmitter = require("events").EventEmitter + ; + + function doop(fn, args, context) { + if ('function' === typeof fn) { + fn.apply(context, args); + } + } + + function toDataUrl(data, type) { + // var data = self.result; + var dataUrl = 'data:'; + + if (type) { + dataUrl += type + ';'; + } + + if (/text/i.test(type)) { + dataUrl += 'charset=utf-8,'; + dataUrl += data.toString('utf8'); + } else { + dataUrl += 'base64,'; + dataUrl += data.toString('base64'); + } + + return dataUrl; + } + + function mapDataToFormat(file, data, format, encoding) { + // var data = self.result; + + switch(format) { + case 'buffer': + return data; + break; + case 'binary': + return data.toString('binary'); + break; + case 'dataUrl': + return toDataUrl(data, file.type); + break; + case 'text': + return data.toString(encoding || 'utf8'); + break; + } + } + + function FileReader() { + var self = this, + emitter = new EventEmitter, + file; + + self.addEventListener = function (on, callback) { + emitter.on(on, callback); + }; + self.removeEventListener = function (callback) { + emitter.removeListener(callback); + } + self.dispatchEvent = function (on) { + emitter.emit(on); + } + + self.EMPTY = 0; + self.LOADING = 1; + self.DONE = 2; + + self.error = undefined; // Read only + self.readyState = self.EMPTY; // Read only + self.result = undefined; // Road only + + // non-standard + self.on = function () { + emitter.on.apply(emitter, arguments); + } + self.nodeChunkedEncoding = false; + self.setNodeChunkedEncoding = function (val) { + self.nodeChunkedEncoding = val; + }; + // end non-standard + + + + // Whatever the file object is, turn it into a Node.JS File.Stream + function createFileStream() { + var stream = new EventEmitter(), + chunked = self.nodeChunkedEncoding; + + // attempt to make the length computable + if (!file.size && chunked && file.path) { + fs.stat(file.path, function (err, stat) { + file.size = stat.size; + file.lastModifiedDate = stat.mtime; + }); + } + + + // The stream exists, do nothing more + if (file.stream) { + return; + } + + + // Create a read stream from a buffer + if (file.buffer) { + process.nextTick(function () { + stream.emit('data', file.buffer); + stream.emit('end'); + }); + file.stream = stream; + return; + } + + + // Create a read stream from a file + if (file.path) { + // TODO url + if (!chunked) { + fs.readFile(file.path, function (err, data) { + if (err) { + stream.emit('error', err); + } + if (data) { + stream.emit('data', data); + stream.emit('end'); + } + }); + + file.stream = stream; + return; + } + + // TODO don't duplicate this code here, + // expose a method in File instead + file.stream = fs.createReadStream(file.path); + } + } + + + + // before any other listeners are added + emitter.on('abort', function () { + self.readyState = self.DONE; + }); + + + + // Map `error`, `progress`, `load`, and `loadend` + function mapStreamToEmitter(format, encoding) { + var stream = file.stream, + buffers = [], + chunked = self.nodeChunkedEncoding; + + buffers.dataLength = 0; + + stream.on('error', function (err) { + if (self.DONE === self.readyState) { + return; + } + + self.readyState = self.DONE; + self.error = err; + emitter.emit('error', err); + }); + + stream.on('data', function (data) { + if (self.DONE === self.readyState) { + return; + } + + buffers.dataLength += data.length; + buffers.push(data); + + emitter.emit('progress', { + // fs.stat will probably complete before this + // but possibly it will not, hence the check + lengthComputable: (!isNaN(file.size)) ? true : false, + loaded: buffers.dataLength, + total: file.size + }); + + emitter.emit('data', data); + }); + + stream.on('end', function () { + if (self.DONE === self.readyState) { + return; + } + + var data; + + if (buffers.length > 1 ) { + data = Buffer.concat(buffers); + } else { + data = buffers[0]; + } + + self.readyState = self.DONE; + self.result = mapDataToFormat(file, data, format, encoding); + emitter.emit('load', { + target: { + // non-standard + nodeBufferResult: data, + result: self.result + } + }); + + emitter.emit('loadend'); + }); + } + + + // Abort is overwritten by readAsXyz + self.abort = function () { + if (self.readState == self.DONE) { + return; + } + self.readyState = self.DONE; + emitter.emit('abort'); + }; + + + + // + function mapUserEvents() { + emitter.on('start', function () { + doop(self.onloadstart, arguments); + }); + emitter.on('progress', function () { + doop(self.onprogress, arguments); + }); + emitter.on('error', function (err) { + // TODO translate to FileError + if (self.onerror) { + self.onerror(err); + } else { + if (!emitter.listeners.error || !emitter.listeners.error.length) { + throw err; + } + } + }); + emitter.on('load', function () { + doop(self.onload, arguments); + }); + emitter.on('end', function () { + doop(self.onloadend, arguments); + }); + emitter.on('abort', function () { + doop(self.onabort, arguments); + }); + } + + + + function readFile(_file, format, encoding) { + file = _file; + if (!file || !file.name || !(file.path || file.stream || file.buffer)) { + throw new Error("cannot read as File: " + JSON.stringify(file)); + } + if (0 !== self.readyState) { + console.log("already loading, request to change format ignored"); + return; + } + + // 'process.nextTick' does not ensure order, (i.e. an fs.stat queued later may return faster) + // but `onloadstart` must come before the first `data` event and must be asynchronous. + // Hence we waste a single tick waiting + process.nextTick(function () { + self.readyState = self.LOADING; + emitter.emit('loadstart'); + createFileStream(); + mapStreamToEmitter(format, encoding); + mapUserEvents(); + }); + } + + self.readAsArrayBuffer = function (file) { + readFile(file, 'buffer'); + }; + self.readAsBinaryString = function (file) { + readFile(file, 'binary'); + }; + self.readAsDataURL = function (file) { + readFile(file, 'dataUrl'); + }; + self.readAsText = function (file, encoding) { + readFile(file, 'text', encoding); + }; + } + + module.exports = FileReader; +}()); diff --git a/node_modules/filereader/LICENSE b/node_modules/filereader/LICENSE new file mode 100644 index 00000000..e06d2081 --- /dev/null +++ b/node_modules/filereader/LICENSE @@ -0,0 +1,202 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/node_modules/filereader/README.md b/node_modules/filereader/README.md new file mode 100644 index 00000000..0a7c07f8 --- /dev/null +++ b/node_modules/filereader/README.md @@ -0,0 +1,104 @@ +FileReader +========== + +HTML5 FileAPI `FileReader` for Node.JS +(could potentially be modified to work with older browsers as well). + +See and + + +```javascript +'use strict'; + +var FileReader = require('filereader') + , fileReader = new FileReader() + ; + +fileReader.setNodeChunkedEncoding(true || false); +fileReader.readAsDataURL(new File('./files/my-file.txt')); + +// non-standard alias of `addEventListener` listening to non-standard `data` event +fileReader.on('data', function (data) { + console.log("chunkSize:", data.length); +}); + +// `onload` as listener +fileReader.addEventListener('load', function (ev) { + console.log("dataUrlSize:", ev.target.result.length); +}); + +// `onloadend` as property +fileReader.onloadend', function () { + console.log("Success"); +}); +``` +``` + +Implemented API + + * `.readAsArrayBuffer()` + * `.readAsBinaryString()` + * `.readAsDataURL()` + * `.readAsText()` + * `.addEventListener(eventname, callback)` + * `.removeEventListener(callback)` + * `.dispatchEvent(eventname)` + * `.EMPTY = 0` + * `.LOADING = 1` + * `.DONE = 2` + * `.error = undefined` + * `.readyState = self.EMPTY` + * `.result = undefined` + +Events + + * start + * progress + * error + * load + * end + * abort + * data // non-standard + +Event Payload + +`end` +```javascript +{ target: + { nodeBufferResult: // non-standard + , result: + } +} +``` + +`progress` +```javascript +// fs.stat will probably complete before this +// but possibly it will not, hence the check +{ lengthComputable: (!isNaN(file.size)) ? true : false +, loaded: buffers.dataLength +, total: file.size +} +``` + +Non-W3C API + + * `.on(eventname, callback)` + * `.nodeChunkedEncoding = false` + * `.setNodeChunkedEncoding()` + +Misc Notes on FileReader +=== + +**FileReader.setNodeChunkedEncoding()** is a *non-standard* method which hints that the `FileReader` should chunk if possible + +I.E. The file will be sent with the header `Transfer-Encoding: chunked` + +The default is `false` since many webservers do not correctly implement the standard correctly, +and hence do not expect or accept `Transfer-Encoding: chunked` from clients. + +**FileReader.on** is a *non-standard* alias of `addEventListener` + +**EventTarget.target.nodeBufferResult** is a *non-standard* property which is a `Node.Buffer` instance of the data. + +**FileReader.on('data', fn)** is a *non-standard* event which passes a `Node.Buffer` chunk each time the `progress` event is fired. diff --git a/node_modules/filereader/package.json b/node_modules/filereader/package.json new file mode 100644 index 00000000..351af628 --- /dev/null +++ b/node_modules/filereader/package.json @@ -0,0 +1,48 @@ +{ + "_from": "filereader", + "_id": "filereader@0.10.3", + "_inBundle": false, + "_integrity": "sha1-x0fUos2PYeVBinwH/hJXpD8KzbE=", + "_location": "/filereader", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "filereader", + "name": "filereader", + "escapedName": "filereader", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/filereader/-/filereader-0.10.3.tgz", + "_shasum": "c747d4a2cd8f61e5418a7c07fe1257a43f0acdb1", + "_spec": "filereader", + "_where": "C:\\Users\\rin\\Desktop\\final", + "author": { + "name": "AJ ONeal", + "email": "coolaj86@gmail.com" + }, + "bundleDependencies": false, + "contributors": [], + "dependencies": {}, + "deprecated": false, + "description": "HTML5 FileAPI `FileReader` for Node.JS.", + "keywords": [ + "html5", + "jsdom", + "file-api", + "FileReader", + "file-reader", + "file", + "reader" + ], + "main": "FileReader.js", + "name": "filereader", + "url": "http://github.com/node-file-api/FileReader", + "version": "0.10.3" +} diff --git a/node_modules/finalhandler/HISTORY.md b/node_modules/finalhandler/HISTORY.md new file mode 100644 index 00000000..920c35e5 --- /dev/null +++ b/node_modules/finalhandler/HISTORY.md @@ -0,0 +1,187 @@ +1.1.2 / 2019-05-09 +================== + + * Set stricter `Content-Security-Policy` header + * deps: parseurl@~1.3.3 + * deps: statuses@~1.5.0 + +1.1.1 / 2018-03-06 +================== + + * Fix 404 output for bad / missing pathnames + * deps: encodeurl@~1.0.2 + - Fix encoding `%` as last character + * deps: statuses@~1.4.0 + +1.1.0 / 2017-09-24 +================== + + * Use `res.headersSent` when available + +1.0.6 / 2017-09-22 +================== + + * deps: debug@2.6.9 + +1.0.5 / 2017-09-15 +================== + + * deps: parseurl@~1.3.2 + - perf: reduce overhead for full URLs + - perf: unroll the "fast-path" `RegExp` + +1.0.4 / 2017-08-03 +================== + + * deps: debug@2.6.8 + +1.0.3 / 2017-05-16 +================== + + * deps: debug@2.6.7 + - deps: ms@2.0.0 + +1.0.2 / 2017-04-22 +================== + + * deps: debug@2.6.4 + - deps: ms@0.7.3 + +1.0.1 / 2017-03-21 +================== + + * Fix missing `` in HTML document + * deps: debug@2.6.3 + - Fix: `DEBUG_MAX_ARRAY_LENGTH` + +1.0.0 / 2017-02-15 +================== + + * Fix exception when `err` cannot be converted to a string + * Fully URL-encode the pathname in the 404 message + * Only include the pathname in the 404 message + * Send complete HTML document + * Set `Content-Security-Policy: default-src 'self'` header + * deps: debug@2.6.1 + - Allow colors in workers + - Deprecated `DEBUG_FD` environment variable set to `3` or higher + - Fix error when running under React Native + - Use same color for same namespace + - deps: ms@0.7.2 + +0.5.1 / 2016-11-12 +================== + + * Fix exception when `err.headers` is not an object + * deps: statuses@~1.3.1 + * perf: hoist regular expressions + * perf: remove duplicate validation path + +0.5.0 / 2016-06-15 +================== + + * Change invalid or non-numeric status code to 500 + * Overwrite status message to match set status code + * Prefer `err.statusCode` if `err.status` is invalid + * Set response headers from `err.headers` object + * Use `statuses` instead of `http` module for status messages + - Includes all defined status messages + +0.4.1 / 2015-12-02 +================== + + * deps: escape-html@~1.0.3 + - perf: enable strict mode + - perf: optimize string replacement + - perf: use faster string coercion + +0.4.0 / 2015-06-14 +================== + + * Fix a false-positive when unpiping in Node.js 0.8 + * Support `statusCode` property on `Error` objects + * Use `unpipe` module for unpiping requests + * deps: escape-html@1.0.2 + * deps: on-finished@~2.3.0 + - Add defined behavior for HTTP `CONNECT` requests + - Add defined behavior for HTTP `Upgrade` requests + - deps: ee-first@1.1.1 + * perf: enable strict mode + * perf: remove argument reassignment + +0.3.6 / 2015-05-11 +================== + + * deps: debug@~2.2.0 + - deps: ms@0.7.1 + +0.3.5 / 2015-04-22 +================== + + * deps: on-finished@~2.2.1 + - Fix `isFinished(req)` when data buffered + +0.3.4 / 2015-03-15 +================== + + * deps: debug@~2.1.3 + - Fix high intensity foreground color for bold + - deps: ms@0.7.0 + +0.3.3 / 2015-01-01 +================== + + * deps: debug@~2.1.1 + * deps: on-finished@~2.2.0 + +0.3.2 / 2014-10-22 +================== + + * deps: on-finished@~2.1.1 + - Fix handling of pipelined requests + +0.3.1 / 2014-10-16 +================== + + * deps: debug@~2.1.0 + - Implement `DEBUG_FD` env variable support + +0.3.0 / 2014-09-17 +================== + + * Terminate in progress response only on error + * Use `on-finished` to determine request status + +0.2.0 / 2014-09-03 +================== + + * Set `X-Content-Type-Options: nosniff` header + * deps: debug@~2.0.0 + +0.1.0 / 2014-07-16 +================== + + * Respond after request fully read + - prevents hung responses and socket hang ups + * deps: debug@1.0.4 + +0.0.3 / 2014-07-11 +================== + + * deps: debug@1.0.3 + - Add support for multiple wildcards in namespaces + +0.0.2 / 2014-06-19 +================== + + * Handle invalid status codes + +0.0.1 / 2014-06-05 +================== + + * deps: debug@1.0.2 + +0.0.0 / 2014-06-05 +================== + + * Extracted from connect/express diff --git a/node_modules/finalhandler/LICENSE b/node_modules/finalhandler/LICENSE new file mode 100644 index 00000000..fb309827 --- /dev/null +++ b/node_modules/finalhandler/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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/node_modules/finalhandler/README.md b/node_modules/finalhandler/README.md new file mode 100644 index 00000000..96327f0d --- /dev/null +++ b/node_modules/finalhandler/README.md @@ -0,0 +1,148 @@ +# finalhandler + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Node.js function to invoke as the final step to respond to HTTP request. + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install finalhandler +``` + +## API + + + +```js +var finalhandler = require('finalhandler') +``` + +### finalhandler(req, res, [options]) + +Returns function to be invoked as the final step for the given `req` and `res`. +This function is to be invoked as `fn(err)`. If `err` is falsy, the handler will +write out a 404 response to the `res`. If it is truthy, an error response will +be written out to the `res`. + +When an error is written, the following information is added to the response: + + * The `res.statusCode` is set from `err.status` (or `err.statusCode`). If + this value is outside the 4xx or 5xx range, it will be set to 500. + * The `res.statusMessage` is set according to the status code. + * The body will be the HTML of the status code message if `env` is + `'production'`, otherwise will be `err.stack`. + * Any headers specified in an `err.headers` object. + +The final handler will also unpipe anything from `req` when it is invoked. + +#### options.env + +By default, the environment is determined by `NODE_ENV` variable, but it can be +overridden by this option. + +#### options.onerror + +Provide a function to be called with the `err` when it exists. Can be used for +writing errors to a central location without excessive function generation. Called +as `onerror(err, req, res)`. + +## Examples + +### always 404 + +```js +var finalhandler = require('finalhandler') +var http = require('http') + +var server = http.createServer(function (req, res) { + var done = finalhandler(req, res) + done() +}) + +server.listen(3000) +``` + +### perform simple action + +```js +var finalhandler = require('finalhandler') +var fs = require('fs') +var http = require('http') + +var server = http.createServer(function (req, res) { + var done = finalhandler(req, res) + + fs.readFile('index.html', function (err, buf) { + if (err) return done(err) + res.setHeader('Content-Type', 'text/html') + res.end(buf) + }) +}) + +server.listen(3000) +``` + +### use with middleware-style functions + +```js +var finalhandler = require('finalhandler') +var http = require('http') +var serveStatic = require('serve-static') + +var serve = serveStatic('public') + +var server = http.createServer(function (req, res) { + var done = finalhandler(req, res) + serve(req, res, done) +}) + +server.listen(3000) +``` + +### keep log of all errors + +```js +var finalhandler = require('finalhandler') +var fs = require('fs') +var http = require('http') + +var server = http.createServer(function (req, res) { + var done = finalhandler(req, res, { onerror: logerror }) + + fs.readFile('index.html', function (err, buf) { + if (err) return done(err) + res.setHeader('Content-Type', 'text/html') + res.end(buf) + }) +}) + +server.listen(3000) + +function logerror (err) { + console.error(err.stack || err.toString()) +} +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/finalhandler.svg +[npm-url]: https://npmjs.org/package/finalhandler +[node-image]: https://img.shields.io/node/v/finalhandler.svg +[node-url]: https://nodejs.org/en/download +[travis-image]: https://img.shields.io/travis/pillarjs/finalhandler.svg +[travis-url]: https://travis-ci.org/pillarjs/finalhandler +[coveralls-image]: https://img.shields.io/coveralls/pillarjs/finalhandler.svg +[coveralls-url]: https://coveralls.io/r/pillarjs/finalhandler?branch=master +[downloads-image]: https://img.shields.io/npm/dm/finalhandler.svg +[downloads-url]: https://npmjs.org/package/finalhandler diff --git a/node_modules/finalhandler/index.js b/node_modules/finalhandler/index.js new file mode 100644 index 00000000..56735079 --- /dev/null +++ b/node_modules/finalhandler/index.js @@ -0,0 +1,331 @@ +/*! + * finalhandler + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var debug = require('debug')('finalhandler') +var encodeUrl = require('encodeurl') +var escapeHtml = require('escape-html') +var onFinished = require('on-finished') +var parseUrl = require('parseurl') +var statuses = require('statuses') +var unpipe = require('unpipe') + +/** + * Module variables. + * @private + */ + +var DOUBLE_SPACE_REGEXP = /\x20{2}/g +var NEWLINE_REGEXP = /\n/g + +/* istanbul ignore next */ +var defer = typeof setImmediate === 'function' + ? setImmediate + : function (fn) { process.nextTick(fn.bind.apply(fn, arguments)) } +var isFinished = onFinished.isFinished + +/** + * Create a minimal HTML document. + * + * @param {string} message + * @private + */ + +function createHtmlDocument (message) { + var body = escapeHtml(message) + .replace(NEWLINE_REGEXP, '
') + .replace(DOUBLE_SPACE_REGEXP, '  ') + + return '\n' + + '\n' + + '\n' + + '\n' + + 'Error\n' + + '\n' + + '\n' + + '
' + body + '
\n' + + '\n' + + '\n' +} + +/** + * Module exports. + * @public + */ + +module.exports = finalhandler + +/** + * Create a function to handle the final response. + * + * @param {Request} req + * @param {Response} res + * @param {Object} [options] + * @return {Function} + * @public + */ + +function finalhandler (req, res, options) { + var opts = options || {} + + // get environment + var env = opts.env || process.env.NODE_ENV || 'development' + + // get error callback + var onerror = opts.onerror + + return function (err) { + var headers + var msg + var status + + // ignore 404 on in-flight response + if (!err && headersSent(res)) { + debug('cannot 404 after headers sent') + return + } + + // unhandled error + if (err) { + // respect status code from error + status = getErrorStatusCode(err) + + if (status === undefined) { + // fallback to status code on response + status = getResponseStatusCode(res) + } else { + // respect headers from error + headers = getErrorHeaders(err) + } + + // get error message + msg = getErrorMessage(err, status, env) + } else { + // not found + status = 404 + msg = 'Cannot ' + req.method + ' ' + encodeUrl(getResourceName(req)) + } + + debug('default %s', status) + + // schedule onerror callback + if (err && onerror) { + defer(onerror, err, req, res) + } + + // cannot actually respond + if (headersSent(res)) { + debug('cannot %d after headers sent', status) + req.socket.destroy() + return + } + + // send response + send(req, res, status, headers, msg) + } +} + +/** + * Get headers from Error object. + * + * @param {Error} err + * @return {object} + * @private + */ + +function getErrorHeaders (err) { + if (!err.headers || typeof err.headers !== 'object') { + return undefined + } + + var headers = Object.create(null) + var keys = Object.keys(err.headers) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + headers[key] = err.headers[key] + } + + return headers +} + +/** + * Get message from Error object, fallback to status message. + * + * @param {Error} err + * @param {number} status + * @param {string} env + * @return {string} + * @private + */ + +function getErrorMessage (err, status, env) { + var msg + + if (env !== 'production') { + // use err.stack, which typically includes err.message + msg = err.stack + + // fallback to err.toString() when possible + if (!msg && typeof err.toString === 'function') { + msg = err.toString() + } + } + + return msg || statuses[status] +} + +/** + * Get status code from Error object. + * + * @param {Error} err + * @return {number} + * @private + */ + +function getErrorStatusCode (err) { + // check err.status + if (typeof err.status === 'number' && err.status >= 400 && err.status < 600) { + return err.status + } + + // check err.statusCode + if (typeof err.statusCode === 'number' && err.statusCode >= 400 && err.statusCode < 600) { + return err.statusCode + } + + return undefined +} + +/** + * Get resource name for the request. + * + * This is typically just the original pathname of the request + * but will fallback to "resource" is that cannot be determined. + * + * @param {IncomingMessage} req + * @return {string} + * @private + */ + +function getResourceName (req) { + try { + return parseUrl.original(req).pathname + } catch (e) { + return 'resource' + } +} + +/** + * Get status code from response. + * + * @param {OutgoingMessage} res + * @return {number} + * @private + */ + +function getResponseStatusCode (res) { + var status = res.statusCode + + // default status code to 500 if outside valid range + if (typeof status !== 'number' || status < 400 || status > 599) { + status = 500 + } + + return status +} + +/** + * Determine if the response headers have been sent. + * + * @param {object} res + * @returns {boolean} + * @private + */ + +function headersSent (res) { + return typeof res.headersSent !== 'boolean' + ? Boolean(res._header) + : res.headersSent +} + +/** + * Send response. + * + * @param {IncomingMessage} req + * @param {OutgoingMessage} res + * @param {number} status + * @param {object} headers + * @param {string} message + * @private + */ + +function send (req, res, status, headers, message) { + function write () { + // response body + var body = createHtmlDocument(message) + + // response status + res.statusCode = status + res.statusMessage = statuses[status] + + // response headers + setHeaders(res, headers) + + // security headers + res.setHeader('Content-Security-Policy', "default-src 'none'") + res.setHeader('X-Content-Type-Options', 'nosniff') + + // standard headers + res.setHeader('Content-Type', 'text/html; charset=utf-8') + res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')) + + if (req.method === 'HEAD') { + res.end() + return + } + + res.end(body, 'utf8') + } + + if (isFinished(req)) { + write() + return + } + + // unpipe everything from the request + unpipe(req) + + // flush the request + onFinished(req, write) + req.resume() +} + +/** + * Set response headers from an object. + * + * @param {OutgoingMessage} res + * @param {object} headers + * @private + */ + +function setHeaders (res, headers) { + if (!headers) { + return + } + + var keys = Object.keys(headers) + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + res.setHeader(key, headers[key]) + } +} diff --git a/node_modules/finalhandler/package.json b/node_modules/finalhandler/package.json new file mode 100644 index 00000000..3e1f5e78 --- /dev/null +++ b/node_modules/finalhandler/package.json @@ -0,0 +1,80 @@ +{ + "_from": "finalhandler@~1.1.2", + "_id": "finalhandler@1.1.2", + "_inBundle": false, + "_integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "_location": "/finalhandler", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "finalhandler@~1.1.2", + "name": "finalhandler", + "escapedName": "finalhandler", + "rawSpec": "~1.1.2", + "saveSpec": null, + "fetchSpec": "~1.1.2" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "_shasum": "b7e7d000ffd11938d0fdb053506f6ebabe9f587d", + "_spec": "finalhandler@~1.1.2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + "bugs": { + "url": "https://github.com/pillarjs/finalhandler/issues" + }, + "bundleDependencies": false, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "deprecated": false, + "description": "Node.js final http responder", + "devDependencies": { + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "istanbul": "0.4.5", + "mocha": "6.1.4", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "supertest": "4.0.2" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "index.js" + ], + "homepage": "https://github.com/pillarjs/finalhandler#readme", + "license": "MIT", + "name": "finalhandler", + "repository": { + "type": "git", + "url": "git+https://github.com/pillarjs/finalhandler.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" + }, + "version": "1.1.2" +} diff --git a/node_modules/forwarded/HISTORY.md b/node_modules/forwarded/HISTORY.md new file mode 100644 index 00000000..2599a557 --- /dev/null +++ b/node_modules/forwarded/HISTORY.md @@ -0,0 +1,16 @@ +0.1.2 / 2017-09-14 +================== + + * perf: improve header parsing + * perf: reduce overhead when no `X-Forwarded-For` header + +0.1.1 / 2017-09-10 +================== + + * Fix trimming leading / trailing OWS + * perf: hoist regular expression + +0.1.0 / 2014-09-21 +================== + + * Initial release diff --git a/node_modules/forwarded/LICENSE b/node_modules/forwarded/LICENSE new file mode 100644 index 00000000..84441fbb --- /dev/null +++ b/node_modules/forwarded/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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/node_modules/forwarded/README.md b/node_modules/forwarded/README.md new file mode 100644 index 00000000..c776ee54 --- /dev/null +++ b/node_modules/forwarded/README.md @@ -0,0 +1,57 @@ +# forwarded + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Parse HTTP X-Forwarded-For header + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install forwarded +``` + +## API + +```js +var forwarded = require('forwarded') +``` + +### forwarded(req) + +```js +var addresses = forwarded(req) +``` + +Parse the `X-Forwarded-For` header from the request. Returns an array +of the addresses, including the socket address for the `req`, in reverse +order (i.e. index `0` is the socket address and the last index is the +furthest address, typically the end-user). + +## Testing + +```sh +$ npm test +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/forwarded.svg +[npm-url]: https://npmjs.org/package/forwarded +[node-version-image]: https://img.shields.io/node/v/forwarded.svg +[node-version-url]: https://nodejs.org/en/download/ +[travis-image]: https://img.shields.io/travis/jshttp/forwarded/master.svg +[travis-url]: https://travis-ci.org/jshttp/forwarded +[coveralls-image]: https://img.shields.io/coveralls/jshttp/forwarded/master.svg +[coveralls-url]: https://coveralls.io/r/jshttp/forwarded?branch=master +[downloads-image]: https://img.shields.io/npm/dm/forwarded.svg +[downloads-url]: https://npmjs.org/package/forwarded diff --git a/node_modules/forwarded/index.js b/node_modules/forwarded/index.js new file mode 100644 index 00000000..7833b3de --- /dev/null +++ b/node_modules/forwarded/index.js @@ -0,0 +1,76 @@ +/*! + * forwarded + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = forwarded + +/** + * Get all addresses in the request, using the `X-Forwarded-For` header. + * + * @param {object} req + * @return {array} + * @public + */ + +function forwarded (req) { + if (!req) { + throw new TypeError('argument req is required') + } + + // simple header parsing + var proxyAddrs = parse(req.headers['x-forwarded-for'] || '') + var socketAddr = req.connection.remoteAddress + var addrs = [socketAddr].concat(proxyAddrs) + + // return all addresses + return addrs +} + +/** + * Parse the X-Forwarded-For header. + * + * @param {string} header + * @private + */ + +function parse (header) { + var end = header.length + var list = [] + var start = header.length + + // gather addresses, backwards + for (var i = header.length - 1; i >= 0; i--) { + switch (header.charCodeAt(i)) { + case 0x20: /* */ + if (start === end) { + start = end = i + } + break + case 0x2c: /* , */ + if (start !== end) { + list.push(header.substring(start, end)) + } + start = end = i + break + default: + start = i + break + } + } + + // final address + if (start !== end) { + list.push(header.substring(start, end)) + } + + return list +} diff --git a/node_modules/forwarded/package.json b/node_modules/forwarded/package.json new file mode 100644 index 00000000..07a69486 --- /dev/null +++ b/node_modules/forwarded/package.json @@ -0,0 +1,78 @@ +{ + "_from": "forwarded@~0.1.2", + "_id": "forwarded@0.1.2", + "_inBundle": false, + "_integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "_location": "/forwarded", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "forwarded@~0.1.2", + "name": "forwarded", + "escapedName": "forwarded", + "rawSpec": "~0.1.2", + "saveSpec": null, + "fetchSpec": "~0.1.2" + }, + "_requiredBy": [ + "/proxy-addr" + ], + "_resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "_shasum": "98c23dab1175657b8c0573e8ceccd91b0ff18c84", + "_spec": "forwarded@~0.1.2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\proxy-addr", + "bugs": { + "url": "https://github.com/jshttp/forwarded/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + } + ], + "deprecated": false, + "description": "Parse HTTP X-Forwarded-For header", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "3.19.0", + "eslint-config-standard": "10.2.1", + "eslint-plugin-import": "2.7.0", + "eslint-plugin-node": "5.1.1", + "eslint-plugin-promise": "3.5.0", + "eslint-plugin-standard": "3.0.1", + "istanbul": "0.4.5", + "mocha": "1.21.5" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "README.md", + "index.js" + ], + "homepage": "https://github.com/jshttp/forwarded#readme", + "keywords": [ + "x-forwarded-for", + "http", + "req" + ], + "license": "MIT", + "name": "forwarded", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/forwarded.git" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "0.1.2" +} diff --git a/node_modules/fresh/HISTORY.md b/node_modules/fresh/HISTORY.md new file mode 100644 index 00000000..4586996a --- /dev/null +++ b/node_modules/fresh/HISTORY.md @@ -0,0 +1,70 @@ +0.5.2 / 2017-09-13 +================== + + * Fix regression matching multiple ETags in `If-None-Match` + * perf: improve `If-None-Match` token parsing + +0.5.1 / 2017-09-11 +================== + + * Fix handling of modified headers with invalid dates + * perf: improve ETag match loop + +0.5.0 / 2017-02-21 +================== + + * Fix incorrect result when `If-None-Match` has both `*` and ETags + * Fix weak `ETag` matching to match spec + * perf: delay reading header values until needed + * perf: skip checking modified time if ETag check failed + * perf: skip parsing `If-None-Match` when no `ETag` header + * perf: use `Date.parse` instead of `new Date` + +0.4.0 / 2017-02-05 +================== + + * Fix false detection of `no-cache` request directive + * perf: enable strict mode + * perf: hoist regular expressions + * perf: remove duplicate conditional + * perf: remove unnecessary boolean coercions + +0.3.0 / 2015-05-12 +================== + + * Add weak `ETag` matching support + +0.2.4 / 2014-09-07 +================== + + * Support Node.js 0.6 + +0.2.3 / 2014-09-07 +================== + + * Move repository to jshttp + +0.2.2 / 2014-02-19 +================== + + * Revert "Fix for blank page on Safari reload" + +0.2.1 / 2014-01-29 +================== + + * Fix for blank page on Safari reload + +0.2.0 / 2013-08-11 +================== + + * Return stale for `Cache-Control: no-cache` + +0.1.0 / 2012-06-15 +================== + + * Add `If-None-Match: *` support + +0.0.1 / 2012-06-10 +================== + + * Initial release diff --git a/node_modules/fresh/LICENSE b/node_modules/fresh/LICENSE new file mode 100644 index 00000000..1434ade7 --- /dev/null +++ b/node_modules/fresh/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson + +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/node_modules/fresh/README.md b/node_modules/fresh/README.md new file mode 100644 index 00000000..1c1c680d --- /dev/null +++ b/node_modules/fresh/README.md @@ -0,0 +1,119 @@ +# fresh + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +HTTP response freshness testing + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +``` +$ npm install fresh +``` + +## API + + + +```js +var fresh = require('fresh') +``` + +### fresh(reqHeaders, resHeaders) + +Check freshness of the response using request and response headers. + +When the response is still "fresh" in the client's cache `true` is +returned, otherwise `false` is returned to indicate that the client +cache is now stale and the full response should be sent. + +When a client sends the `Cache-Control: no-cache` request header to +indicate an end-to-end reload request, this module will return `false` +to make handling these requests transparent. + +## Known Issues + +This module is designed to only follow the HTTP specifications, not +to work-around all kinda of client bugs (especially since this module +typically does not recieve enough information to understand what the +client actually is). + +There is a known issue that in certain versions of Safari, Safari +will incorrectly make a request that allows this module to validate +freshness of the resource even when Safari does not have a +representation of the resource in the cache. The module +[jumanji](https://www.npmjs.com/package/jumanji) can be used in +an Express application to work-around this issue and also provides +links to further reading on this Safari bug. + +## Example + +### API usage + + + +```js +var reqHeaders = { 'if-none-match': '"foo"' } +var resHeaders = { 'etag': '"bar"' } +fresh(reqHeaders, resHeaders) +// => false + +var reqHeaders = { 'if-none-match': '"foo"' } +var resHeaders = { 'etag': '"foo"' } +fresh(reqHeaders, resHeaders) +// => true +``` + +### Using with Node.js http server + +```js +var fresh = require('fresh') +var http = require('http') + +var server = http.createServer(function (req, res) { + // perform server logic + // ... including adding ETag / Last-Modified response headers + + if (isFresh(req, res)) { + // client has a fresh copy of resource + res.statusCode = 304 + res.end() + return + } + + // send the resource + res.statusCode = 200 + res.end('hello, world!') +}) + +function isFresh (req, res) { + return fresh(req.headers, { + 'etag': res.getHeader('ETag'), + 'last-modified': res.getHeader('Last-Modified') + }) +} + +server.listen(3000) +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/fresh.svg +[npm-url]: https://npmjs.org/package/fresh +[node-version-image]: https://img.shields.io/node/v/fresh.svg +[node-version-url]: https://nodejs.org/en/ +[travis-image]: https://img.shields.io/travis/jshttp/fresh/master.svg +[travis-url]: https://travis-ci.org/jshttp/fresh +[coveralls-image]: https://img.shields.io/coveralls/jshttp/fresh/master.svg +[coveralls-url]: https://coveralls.io/r/jshttp/fresh?branch=master +[downloads-image]: https://img.shields.io/npm/dm/fresh.svg +[downloads-url]: https://npmjs.org/package/fresh diff --git a/node_modules/fresh/index.js b/node_modules/fresh/index.js new file mode 100644 index 00000000..d154f5a7 --- /dev/null +++ b/node_modules/fresh/index.js @@ -0,0 +1,137 @@ +/*! + * fresh + * Copyright(c) 2012 TJ Holowaychuk + * Copyright(c) 2016-2017 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * RegExp to check for no-cache token in Cache-Control. + * @private + */ + +var CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/ + +/** + * Module exports. + * @public + */ + +module.exports = fresh + +/** + * Check freshness of the response using request and response headers. + * + * @param {Object} reqHeaders + * @param {Object} resHeaders + * @return {Boolean} + * @public + */ + +function fresh (reqHeaders, resHeaders) { + // fields + var modifiedSince = reqHeaders['if-modified-since'] + var noneMatch = reqHeaders['if-none-match'] + + // unconditional request + if (!modifiedSince && !noneMatch) { + return false + } + + // Always return stale when Cache-Control: no-cache + // to support end-to-end reload requests + // https://tools.ietf.org/html/rfc2616#section-14.9.4 + var cacheControl = reqHeaders['cache-control'] + if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl)) { + return false + } + + // if-none-match + if (noneMatch && noneMatch !== '*') { + var etag = resHeaders['etag'] + + if (!etag) { + return false + } + + var etagStale = true + var matches = parseTokenList(noneMatch) + for (var i = 0; i < matches.length; i++) { + var match = matches[i] + if (match === etag || match === 'W/' + etag || 'W/' + match === etag) { + etagStale = false + break + } + } + + if (etagStale) { + return false + } + } + + // if-modified-since + if (modifiedSince) { + var lastModified = resHeaders['last-modified'] + var modifiedStale = !lastModified || !(parseHttpDate(lastModified) <= parseHttpDate(modifiedSince)) + + if (modifiedStale) { + return false + } + } + + return true +} + +/** + * Parse an HTTP Date into a number. + * + * @param {string} date + * @private + */ + +function parseHttpDate (date) { + var timestamp = date && Date.parse(date) + + // istanbul ignore next: guard against date.js Date.parse patching + return typeof timestamp === 'number' + ? timestamp + : NaN +} + +/** + * Parse a HTTP token list. + * + * @param {string} str + * @private + */ + +function parseTokenList (str) { + var end = 0 + var list = [] + var start = 0 + + // gather tokens + for (var i = 0, len = str.length; i < len; i++) { + switch (str.charCodeAt(i)) { + case 0x20: /* */ + if (start === end) { + start = end = i + 1 + } + break + case 0x2c: /* , */ + list.push(str.substring(start, end)) + start = end = i + 1 + break + default: + end = i + 1 + break + } + } + + // final token + list.push(str.substring(start, end)) + + return list +} diff --git a/node_modules/fresh/package.json b/node_modules/fresh/package.json new file mode 100644 index 00000000..8bcfe062 --- /dev/null +++ b/node_modules/fresh/package.json @@ -0,0 +1,90 @@ +{ + "_from": "fresh@0.5.2", + "_id": "fresh@0.5.2", + "_inBundle": false, + "_integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "_location": "/fresh", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "fresh@0.5.2", + "name": "fresh", + "escapedName": "fresh", + "rawSpec": "0.5.2", + "saveSpec": null, + "fetchSpec": "0.5.2" + }, + "_requiredBy": [ + "/express", + "/send" + ], + "_resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "_shasum": "3d8cadd90d976569fa835ab1f8e4b23a105605a7", + "_spec": "fresh@0.5.2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "url": "http://tjholowaychuk.com" + }, + "bugs": { + "url": "https://github.com/jshttp/fresh/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "deprecated": false, + "description": "HTTP response freshness testing", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "3.19.0", + "eslint-config-standard": "10.2.1", + "eslint-plugin-import": "2.7.0", + "eslint-plugin-markdown": "1.0.0-beta.6", + "eslint-plugin-node": "5.1.1", + "eslint-plugin-promise": "3.5.0", + "eslint-plugin-standard": "3.0.1", + "istanbul": "0.4.5", + "mocha": "1.21.5" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "index.js" + ], + "homepage": "https://github.com/jshttp/fresh#readme", + "keywords": [ + "fresh", + "http", + "conditional", + "cache" + ], + "license": "MIT", + "name": "fresh", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/fresh.git" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "0.5.2" +} diff --git a/node_modules/fs/README.md b/node_modules/fs/README.md new file mode 100644 index 00000000..5e9a74ca --- /dev/null +++ b/node_modules/fs/README.md @@ -0,0 +1,9 @@ +# Security holding package + +This package name is not currently in use, but was formerly occupied +by another package. To avoid malicious use, npm is hanging on to the +package name, but loosely, and we'll probably give it to you if you +want it. + +You may adopt this package by contacting support@npmjs.com and +requesting the name. diff --git a/node_modules/fs/package.json b/node_modules/fs/package.json new file mode 100644 index 00000000..87528520 --- /dev/null +++ b/node_modules/fs/package.json @@ -0,0 +1,46 @@ +{ + "_from": "fs", + "_id": "fs@0.0.1-security", + "_inBundle": false, + "_integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=", + "_location": "/fs", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "fs", + "name": "fs", + "escapedName": "fs", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "_shasum": "8a7bd37186b6dddf3813f23858b57ecaaf5e41d4", + "_spec": "fs", + "_where": "C:\\Users\\rin\\Desktop\\final", + "author": "", + "bugs": { + "url": "https://github.com/npm/security-holder/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "This package name is not currently in use, but was formerly occupied by another package. To avoid malicious use, npm is hanging on to the package name, but loosely, and we'll probably give it to you if you want it.", + "homepage": "https://github.com/npm/security-holder#readme", + "keywords": [], + "license": "ISC", + "main": "index.js", + "name": "fs", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/security-holder.git" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "version": "0.0.1-security" +} diff --git a/node_modules/http-errors/HISTORY.md b/node_modules/http-errors/HISTORY.md new file mode 100644 index 00000000..efc2d4c9 --- /dev/null +++ b/node_modules/http-errors/HISTORY.md @@ -0,0 +1,149 @@ +2019-02-18 / 1.7.2 +================== + + * deps: setprototypeof@1.1.1 + +2018-09-08 / 1.7.1 +================== + + * Fix error creating objects in some environments + +2018-07-30 / 1.7.0 +================== + + * Set constructor name when possible + * Use `toidentifier` module to make class names + * deps: statuses@'>= 1.5.0 < 2' + +2018-03-29 / 1.6.3 +================== + + * deps: depd@~1.1.2 + - perf: remove argument reassignment + * deps: setprototypeof@1.1.0 + * deps: statuses@'>= 1.4.0 < 2' + +2017-08-04 / 1.6.2 +================== + + * deps: depd@1.1.1 + - Remove unnecessary `Buffer` loading + +2017-02-20 / 1.6.1 +================== + + * deps: setprototypeof@1.0.3 + - Fix shim for old browsers + +2017-02-14 / 1.6.0 +================== + + * Accept custom 4xx and 5xx status codes in factory + * Add deprecation message to `"I'mateapot"` export + * Deprecate passing status code as anything except first argument in factory + * Deprecate using non-error status codes + * Make `message` property enumerable for `HttpError`s + +2016-11-16 / 1.5.1 +================== + + * deps: inherits@2.0.3 + - Fix issue loading in browser + * deps: setprototypeof@1.0.2 + * deps: statuses@'>= 1.3.1 < 2' + +2016-05-18 / 1.5.0 +================== + + * Support new code `421 Misdirected Request` + * Use `setprototypeof` module to replace `__proto__` setting + * deps: statuses@'>= 1.3.0 < 2' + - Add `421 Misdirected Request` + - perf: enable strict mode + * perf: enable strict mode + +2016-01-28 / 1.4.0 +================== + + * Add `HttpError` export, for `err instanceof createError.HttpError` + * deps: inherits@2.0.1 + * deps: statuses@'>= 1.2.1 < 2' + - Fix message for status 451 + - Remove incorrect nginx status code + +2015-02-02 / 1.3.1 +================== + + * Fix regression where status can be overwritten in `createError` `props` + +2015-02-01 / 1.3.0 +================== + + * Construct errors using defined constructors from `createError` + * Fix error names that are not identifiers + - `createError["I'mateapot"]` is now `createError.ImATeapot` + * Set a meaningful `name` property on constructed errors + +2014-12-09 / 1.2.8 +================== + + * Fix stack trace from exported function + * Remove `arguments.callee` usage + +2014-10-14 / 1.2.7 +================== + + * Remove duplicate line + +2014-10-02 / 1.2.6 +================== + + * Fix `expose` to be `true` for `ClientError` constructor + +2014-09-28 / 1.2.5 +================== + + * deps: statuses@1 + +2014-09-21 / 1.2.4 +================== + + * Fix dependency version to work with old `npm`s + +2014-09-21 / 1.2.3 +================== + + * deps: statuses@~1.1.0 + +2014-09-21 / 1.2.2 +================== + + * Fix publish error + +2014-09-21 / 1.2.1 +================== + + * Support Node.js 0.6 + * Use `inherits` instead of `util` + +2014-09-09 / 1.2.0 +================== + + * Fix the way inheriting functions + * Support `expose` being provided in properties argument + +2014-09-08 / 1.1.0 +================== + + * Default status to 500 + * Support provided `error` to extend + +2014-09-08 / 1.0.1 +================== + + * Fix accepting string message + +2014-09-08 / 1.0.0 +================== + + * Initial release diff --git a/node_modules/http-errors/LICENSE b/node_modules/http-errors/LICENSE new file mode 100644 index 00000000..82af4df5 --- /dev/null +++ b/node_modules/http-errors/LICENSE @@ -0,0 +1,23 @@ + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com + +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/node_modules/http-errors/README.md b/node_modules/http-errors/README.md new file mode 100644 index 00000000..3b254811 --- /dev/null +++ b/node_modules/http-errors/README.md @@ -0,0 +1,163 @@ +# http-errors + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][node-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Create HTTP errors for Express, Koa, Connect, etc. with ease. + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```bash +$ npm install http-errors +``` + +## Example + +```js +var createError = require('http-errors') +var express = require('express') +var app = express() + +app.use(function (req, res, next) { + if (!req.user) return next(createError(401, 'Please login to view this page.')) + next() +}) +``` + +## API + +This is the current API, currently extracted from Koa and subject to change. + +### Error Properties + +- `expose` - can be used to signal if `message` should be sent to the client, + defaulting to `false` when `status` >= 500 +- `headers` - can be an object of header names to values to be sent to the + client, defaulting to `undefined`. When defined, the key names should all + be lower-cased +- `message` - the traditional error message, which should be kept short and all + single line +- `status` - the status code of the error, mirroring `statusCode` for general + compatibility +- `statusCode` - the status code of the error, defaulting to `500` + +### createError([status], [message], [properties]) + +Create a new error object with the given message `msg`. +The error object inherits from `createError.HttpError`. + + + +```js +var err = createError(404, 'This video does not exist!') +``` + +- `status: 500` - the status code as a number +- `message` - the message of the error, defaulting to node's text for that status code. +- `properties` - custom properties to attach to the object + +### createError([status], [error], [properties]) + +Extend the given `error` object with `createError.HttpError` +properties. This will not alter the inheritance of the given +`error` object, and the modified `error` object is the +return value. + + + +```js +fs.readFile('foo.txt', function (err, buf) { + if (err) { + if (err.code === 'ENOENT') { + var httpError = createError(404, err, { expose: false }) + } else { + var httpError = createError(500, err) + } + } +}) +``` + +- `status` - the status code as a number +- `error` - the error object to extend +- `properties` - custom properties to attach to the object + +### new createError\[code || name\](\[msg]\)) + +Create a new error object with the given message `msg`. +The error object inherits from `createError.HttpError`. + + + +```js +var err = new createError.NotFound() +``` + +- `code` - the status code as a number +- `name` - the name of the error as a "bumpy case", i.e. `NotFound` or `InternalServerError`. + +#### List of all constructors + +|Status Code|Constructor Name | +|-----------|-----------------------------| +|400 |BadRequest | +|401 |Unauthorized | +|402 |PaymentRequired | +|403 |Forbidden | +|404 |NotFound | +|405 |MethodNotAllowed | +|406 |NotAcceptable | +|407 |ProxyAuthenticationRequired | +|408 |RequestTimeout | +|409 |Conflict | +|410 |Gone | +|411 |LengthRequired | +|412 |PreconditionFailed | +|413 |PayloadTooLarge | +|414 |URITooLong | +|415 |UnsupportedMediaType | +|416 |RangeNotSatisfiable | +|417 |ExpectationFailed | +|418 |ImATeapot | +|421 |MisdirectedRequest | +|422 |UnprocessableEntity | +|423 |Locked | +|424 |FailedDependency | +|425 |UnorderedCollection | +|426 |UpgradeRequired | +|428 |PreconditionRequired | +|429 |TooManyRequests | +|431 |RequestHeaderFieldsTooLarge | +|451 |UnavailableForLegalReasons | +|500 |InternalServerError | +|501 |NotImplemented | +|502 |BadGateway | +|503 |ServiceUnavailable | +|504 |GatewayTimeout | +|505 |HTTPVersionNotSupported | +|506 |VariantAlsoNegotiates | +|507 |InsufficientStorage | +|508 |LoopDetected | +|509 |BandwidthLimitExceeded | +|510 |NotExtended | +|511 |NetworkAuthenticationRequired| + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/http-errors/master +[coveralls-url]: https://coveralls.io/r/jshttp/http-errors?branch=master +[node-image]: https://badgen.net/npm/node/http-errors +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/http-errors +[npm-url]: https://npmjs.org/package/http-errors +[npm-version-image]: https://badgen.net/npm/v/http-errors +[travis-image]: https://badgen.net/travis/jshttp/http-errors/master +[travis-url]: https://travis-ci.org/jshttp/http-errors diff --git a/node_modules/http-errors/index.js b/node_modules/http-errors/index.js new file mode 100644 index 00000000..10ca4adc --- /dev/null +++ b/node_modules/http-errors/index.js @@ -0,0 +1,266 @@ +/*! + * http-errors + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var deprecate = require('depd')('http-errors') +var setPrototypeOf = require('setprototypeof') +var statuses = require('statuses') +var inherits = require('inherits') +var toIdentifier = require('toidentifier') + +/** + * Module exports. + * @public + */ + +module.exports = createError +module.exports.HttpError = createHttpErrorConstructor() + +// Populate exports for all constructors +populateConstructorExports(module.exports, statuses.codes, module.exports.HttpError) + +/** + * Get the code class of a status code. + * @private + */ + +function codeClass (status) { + return Number(String(status).charAt(0) + '00') +} + +/** + * Create a new HTTP Error. + * + * @returns {Error} + * @public + */ + +function createError () { + // so much arity going on ~_~ + var err + var msg + var status = 500 + var props = {} + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i] + if (arg instanceof Error) { + err = arg + status = err.status || err.statusCode || status + continue + } + switch (typeof arg) { + case 'string': + msg = arg + break + case 'number': + status = arg + if (i !== 0) { + deprecate('non-first-argument status code; replace with createError(' + arg + ', ...)') + } + break + case 'object': + props = arg + break + } + } + + if (typeof status === 'number' && (status < 400 || status >= 600)) { + deprecate('non-error status code; use only 4xx or 5xx status codes') + } + + if (typeof status !== 'number' || + (!statuses[status] && (status < 400 || status >= 600))) { + status = 500 + } + + // constructor + var HttpError = createError[status] || createError[codeClass(status)] + + if (!err) { + // create error + err = HttpError + ? new HttpError(msg) + : new Error(msg || statuses[status]) + Error.captureStackTrace(err, createError) + } + + if (!HttpError || !(err instanceof HttpError) || err.status !== status) { + // add properties to generic error + err.expose = status < 500 + err.status = err.statusCode = status + } + + for (var key in props) { + if (key !== 'status' && key !== 'statusCode') { + err[key] = props[key] + } + } + + return err +} + +/** + * Create HTTP error abstract base class. + * @private + */ + +function createHttpErrorConstructor () { + function HttpError () { + throw new TypeError('cannot construct abstract class') + } + + inherits(HttpError, Error) + + return HttpError +} + +/** + * Create a constructor for a client error. + * @private + */ + +function createClientErrorConstructor (HttpError, name, code) { + var className = name.match(/Error$/) ? name : name + 'Error' + + function ClientError (message) { + // create the error object + var msg = message != null ? message : statuses[code] + var err = new Error(msg) + + // capture a stack trace to the construction point + Error.captureStackTrace(err, ClientError) + + // adjust the [[Prototype]] + setPrototypeOf(err, ClientError.prototype) + + // redefine the error message + Object.defineProperty(err, 'message', { + enumerable: true, + configurable: true, + value: msg, + writable: true + }) + + // redefine the error name + Object.defineProperty(err, 'name', { + enumerable: false, + configurable: true, + value: className, + writable: true + }) + + return err + } + + inherits(ClientError, HttpError) + nameFunc(ClientError, className) + + ClientError.prototype.status = code + ClientError.prototype.statusCode = code + ClientError.prototype.expose = true + + return ClientError +} + +/** + * Create a constructor for a server error. + * @private + */ + +function createServerErrorConstructor (HttpError, name, code) { + var className = name.match(/Error$/) ? name : name + 'Error' + + function ServerError (message) { + // create the error object + var msg = message != null ? message : statuses[code] + var err = new Error(msg) + + // capture a stack trace to the construction point + Error.captureStackTrace(err, ServerError) + + // adjust the [[Prototype]] + setPrototypeOf(err, ServerError.prototype) + + // redefine the error message + Object.defineProperty(err, 'message', { + enumerable: true, + configurable: true, + value: msg, + writable: true + }) + + // redefine the error name + Object.defineProperty(err, 'name', { + enumerable: false, + configurable: true, + value: className, + writable: true + }) + + return err + } + + inherits(ServerError, HttpError) + nameFunc(ServerError, className) + + ServerError.prototype.status = code + ServerError.prototype.statusCode = code + ServerError.prototype.expose = false + + return ServerError +} + +/** + * Set the name of a function, if possible. + * @private + */ + +function nameFunc (func, name) { + var desc = Object.getOwnPropertyDescriptor(func, 'name') + + if (desc && desc.configurable) { + desc.value = name + Object.defineProperty(func, 'name', desc) + } +} + +/** + * Populate the exports object with constructors for every error class. + * @private + */ + +function populateConstructorExports (exports, codes, HttpError) { + codes.forEach(function forEachCode (code) { + var CodeError + var name = toIdentifier(statuses[code]) + + switch (codeClass(code)) { + case 400: + CodeError = createClientErrorConstructor(HttpError, name, code) + break + case 500: + CodeError = createServerErrorConstructor(HttpError, name, code) + break + } + + if (CodeError) { + // export the constructor + exports[code] = CodeError + exports[name] = CodeError + } + }) + + // backwards-compatibility + exports["I'mateapot"] = deprecate.function(exports.ImATeapot, + '"I\'mateapot"; use "ImATeapot" instead') +} diff --git a/node_modules/http-errors/package.json b/node_modules/http-errors/package.json new file mode 100644 index 00000000..39fda0ba --- /dev/null +++ b/node_modules/http-errors/package.json @@ -0,0 +1,93 @@ +{ + "_from": "http-errors@1.7.2", + "_id": "http-errors@1.7.2", + "_inBundle": false, + "_integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "_location": "/http-errors", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "http-errors@1.7.2", + "name": "http-errors", + "escapedName": "http-errors", + "rawSpec": "1.7.2", + "saveSpec": null, + "fetchSpec": "1.7.2" + }, + "_requiredBy": [ + "/express/body-parser", + "/raw-body", + "/send" + ], + "_resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "_shasum": "4f5029cf13239f31036e5b2e55292bcfbcc85c8f", + "_spec": "http-errors@1.7.2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express\\node_modules\\body-parser", + "author": { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + }, + "bugs": { + "url": "https://github.com/jshttp/http-errors/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Alan Plum", + "email": "me@pluma.io" + }, + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + } + ], + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "deprecated": false, + "description": "Create HTTP error objects", + "devDependencies": { + "eslint": "5.13.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.16.0", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "7.0.1", + "eslint-plugin-promise": "4.0.1", + "eslint-plugin-standard": "4.0.0", + "istanbul": "0.4.5", + "mocha": "5.2.0" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "index.js", + "HISTORY.md", + "LICENSE", + "README.md" + ], + "homepage": "https://github.com/jshttp/http-errors#readme", + "keywords": [ + "http", + "error" + ], + "license": "MIT", + "name": "http-errors", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/http-errors.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md . && node ./scripts/lint-readme-list.js", + "test": "mocha --reporter spec --bail", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" + }, + "version": "1.7.2" +} diff --git a/node_modules/iconv-lite/Changelog.md b/node_modules/iconv-lite/Changelog.md new file mode 100644 index 00000000..f252313f --- /dev/null +++ b/node_modules/iconv-lite/Changelog.md @@ -0,0 +1,162 @@ +# 0.4.24 / 2018-08-22 + + * Added MIK encoding (#196, by @Ivan-Kalatchev) + + +# 0.4.23 / 2018-05-07 + + * Fix deprecation warning in Node v10 due to the last usage of `new Buffer` (#185, by @felixbuenemann) + * Switched from NodeBuffer to Buffer in typings (#155 by @felixfbecker, #186 by @larssn) + + +# 0.4.22 / 2018-05-05 + + * Use older semver style for dependencies to be compatible with Node version 0.10 (#182, by @dougwilson) + * Fix tests to accomodate fixes in Node v10 (#182, by @dougwilson) + + +# 0.4.21 / 2018-04-06 + + * Fix encoding canonicalization (#156) + * Fix the paths in the "browser" field in package.json (#174 by @LMLB) + * Removed "contributors" section in package.json - see Git history instead. + + +# 0.4.20 / 2018-04-06 + + * Updated `new Buffer()` usages with recommended replacements as it's being deprecated in Node v10 (#176, #178 by @ChALkeR) + + +# 0.4.19 / 2017-09-09 + + * Fixed iso8859-1 codec regression in handling untranslatable characters (#162, caused by #147) + * Re-generated windows1255 codec, because it was updated in iconv project + * Fixed grammar in error message when iconv-lite is loaded with encoding other than utf8 + + +# 0.4.18 / 2017-06-13 + + * Fixed CESU-8 regression in Node v8. + + +# 0.4.17 / 2017-04-22 + + * Updated typescript definition file to support Angular 2 AoT mode (#153 by @larssn) + + +# 0.4.16 / 2017-04-22 + + * Added support for React Native (#150) + * Changed iso8859-1 encoding to usine internal 'binary' encoding, as it's the same thing (#147 by @mscdex) + * Fixed typo in Readme (#138 by @jiangzhuo) + * Fixed build for Node v6.10+ by making correct version comparison + * Added a warning if iconv-lite is loaded not as utf-8 (see #142) + + +# 0.4.15 / 2016-11-21 + + * Fixed typescript type definition (#137) + + +# 0.4.14 / 2016-11-20 + + * Preparation for v1.0 + * Added Node v6 and latest Node versions to Travis CI test rig + * Deprecated Node v0.8 support + * Typescript typings (@larssn) + * Fix encoding of Euro character in GB 18030 (inspired by @lygstate) + * Add ms prefix to dbcs windows encodings (@rokoroku) + + +# 0.4.13 / 2015-10-01 + + * Fix silly mistake in deprecation notice. + + +# 0.4.12 / 2015-09-26 + + * Node v4 support: + * Added CESU-8 decoding (#106) + * Added deprecation notice for `extendNodeEncodings` + * Added Travis tests for Node v4 and io.js latest (#105 by @Mithgol) + + +# 0.4.11 / 2015-07-03 + + * Added CESU-8 encoding. + + +# 0.4.10 / 2015-05-26 + + * Changed UTF-16 endianness heuristic to take into account any ASCII chars, not + just spaces. This should minimize the importance of "default" endianness. + + +# 0.4.9 / 2015-05-24 + + * Streamlined BOM handling: strip BOM by default, add BOM when encoding if + addBOM: true. Added docs to Readme. + * UTF16 now uses UTF16-LE by default. + * Fixed minor issue with big5 encoding. + * Added io.js testing on Travis; updated node-iconv version to test against. + Now we just skip testing SBCS encodings that node-iconv doesn't support. + * (internal refactoring) Updated codec interface to use classes. + * Use strict mode in all files. + + +# 0.4.8 / 2015-04-14 + + * added alias UNICODE-1-1-UTF-7 for UTF-7 encoding (#94) + + +# 0.4.7 / 2015-02-05 + + * stop official support of Node.js v0.8. Should still work, but no guarantees. + reason: Packages needed for testing are hard to get on Travis CI. + * work in environment where Object.prototype is monkey patched with enumerable + props (#89). + + +# 0.4.6 / 2015-01-12 + + * fix rare aliases of single-byte encodings (thanks @mscdex) + * double the timeout for dbcs tests to make them less flaky on travis + + +# 0.4.5 / 2014-11-20 + + * fix windows-31j and x-sjis encoding support (@nleush) + * minor fix: undefined variable reference when internal error happens + + +# 0.4.4 / 2014-07-16 + + * added encodings UTF-7 (RFC2152) and UTF-7-IMAP (RFC3501 Section 5.1.3) + * fixed streaming base64 encoding + + +# 0.4.3 / 2014-06-14 + + * added encodings UTF-16BE and UTF-16 with BOM + + +# 0.4.2 / 2014-06-12 + + * don't throw exception if `extendNodeEncodings()` is called more than once + + +# 0.4.1 / 2014-06-11 + + * codepage 808 added + + +# 0.4.0 / 2014-06-10 + + * code is rewritten from scratch + * all widespread encodings are supported + * streaming interface added + * browserify compatibility added + * (optional) extend core primitive encodings to make usage even simpler + * moved from vows to mocha as the testing framework + + diff --git a/node_modules/iconv-lite/LICENSE b/node_modules/iconv-lite/LICENSE new file mode 100644 index 00000000..d518d837 --- /dev/null +++ b/node_modules/iconv-lite/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2011 Alexander Shtuchkin + +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/node_modules/iconv-lite/README.md b/node_modules/iconv-lite/README.md new file mode 100644 index 00000000..c981c370 --- /dev/null +++ b/node_modules/iconv-lite/README.md @@ -0,0 +1,156 @@ +## Pure JS character encoding conversion [![Build Status](https://travis-ci.org/ashtuchkin/iconv-lite.svg?branch=master)](https://travis-ci.org/ashtuchkin/iconv-lite) + + * Doesn't need native code compilation. Works on Windows and in sandboxed environments like [Cloud9](http://c9.io). + * Used in popular projects like [Express.js (body_parser)](https://github.com/expressjs/body-parser), + [Grunt](http://gruntjs.com/), [Nodemailer](http://www.nodemailer.com/), [Yeoman](http://yeoman.io/) and others. + * Faster than [node-iconv](https://github.com/bnoordhuis/node-iconv) (see below for performance comparison). + * Intuitive encode/decode API + * Streaming support for Node v0.10+ + * [Deprecated] Can extend Node.js primitives (buffers, streams) to support all iconv-lite encodings. + * In-browser usage via [Browserify](https://github.com/substack/node-browserify) (~180k gzip compressed with Buffer shim included). + * Typescript [type definition file](https://github.com/ashtuchkin/iconv-lite/blob/master/lib/index.d.ts) included. + * React Native is supported (need to explicitly `npm install` two more modules: `buffer` and `stream`). + * License: MIT. + +[![NPM Stats](https://nodei.co/npm/iconv-lite.png?downloads=true&downloadRank=true)](https://npmjs.org/packages/iconv-lite/) + +## Usage +### Basic API +```javascript +var iconv = require('iconv-lite'); + +// Convert from an encoded buffer to js string. +str = iconv.decode(Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]), 'win1251'); + +// Convert from js string to an encoded buffer. +buf = iconv.encode("Sample input string", 'win1251'); + +// Check if encoding is supported +iconv.encodingExists("us-ascii") +``` + +### Streaming API (Node v0.10+) +```javascript + +// Decode stream (from binary stream to js strings) +http.createServer(function(req, res) { + var converterStream = iconv.decodeStream('win1251'); + req.pipe(converterStream); + + converterStream.on('data', function(str) { + console.log(str); // Do something with decoded strings, chunk-by-chunk. + }); +}); + +// Convert encoding streaming example +fs.createReadStream('file-in-win1251.txt') + .pipe(iconv.decodeStream('win1251')) + .pipe(iconv.encodeStream('ucs2')) + .pipe(fs.createWriteStream('file-in-ucs2.txt')); + +// Sugar: all encode/decode streams have .collect(cb) method to accumulate data. +http.createServer(function(req, res) { + req.pipe(iconv.decodeStream('win1251')).collect(function(err, body) { + assert(typeof body == 'string'); + console.log(body); // full request body string + }); +}); +``` + +### [Deprecated] Extend Node.js own encodings +> NOTE: This doesn't work on latest Node versions. See [details](https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility). + +```javascript +// After this call all Node basic primitives will understand iconv-lite encodings. +iconv.extendNodeEncodings(); + +// Examples: +buf = new Buffer(str, 'win1251'); +buf.write(str, 'gbk'); +str = buf.toString('latin1'); +assert(Buffer.isEncoding('iso-8859-15')); +Buffer.byteLength(str, 'us-ascii'); + +http.createServer(function(req, res) { + req.setEncoding('big5'); + req.collect(function(err, body) { + console.log(body); + }); +}); + +fs.createReadStream("file.txt", "shift_jis"); + +// External modules are also supported (if they use Node primitives, which they probably do). +request = require('request'); +request({ + url: "http://github.com/", + encoding: "cp932" +}); + +// To remove extensions +iconv.undoExtendNodeEncodings(); +``` + +## Supported encodings + + * All node.js native encodings: utf8, ucs2 / utf16-le, ascii, binary, base64, hex. + * Additional unicode encodings: utf16, utf16-be, utf-7, utf-7-imap. + * All widespread singlebyte encodings: Windows 125x family, ISO-8859 family, + IBM/DOS codepages, Macintosh family, KOI8 family, all others supported by iconv library. + Aliases like 'latin1', 'us-ascii' also supported. + * All widespread multibyte encodings: CP932, CP936, CP949, CP950, GB2312, GBK, GB18030, Big5, Shift_JIS, EUC-JP. + +See [all supported encodings on wiki](https://github.com/ashtuchkin/iconv-lite/wiki/Supported-Encodings). + +Most singlebyte encodings are generated automatically from [node-iconv](https://github.com/bnoordhuis/node-iconv). Thank you Ben Noordhuis and libiconv authors! + +Multibyte encodings are generated from [Unicode.org mappings](http://www.unicode.org/Public/MAPPINGS/) and [WHATWG Encoding Standard mappings](http://encoding.spec.whatwg.org/). Thank you, respective authors! + + +## Encoding/decoding speed + +Comparison with node-iconv module (1000x256kb, on MacBook Pro, Core i5/2.6 GHz, Node v0.12.0). +Note: your results may vary, so please always check on your hardware. + + operation iconv@2.1.4 iconv-lite@0.4.7 + ---------------------------------------------------------- + encode('win1251') ~96 Mb/s ~320 Mb/s + decode('win1251') ~95 Mb/s ~246 Mb/s + +## BOM handling + + * Decoding: BOM is stripped by default, unless overridden by passing `stripBOM: false` in options + (f.ex. `iconv.decode(buf, enc, {stripBOM: false})`). + A callback might also be given as a `stripBOM` parameter - it'll be called if BOM character was actually found. + * If you want to detect UTF-8 BOM when decoding other encodings, use [node-autodetect-decoder-stream](https://github.com/danielgindi/node-autodetect-decoder-stream) module. + * Encoding: No BOM added, unless overridden by `addBOM: true` option. + +## UTF-16 Encodings + +This library supports UTF-16LE, UTF-16BE and UTF-16 encodings. First two are straightforward, but UTF-16 is trying to be +smart about endianness in the following ways: + * Decoding: uses BOM and 'spaces heuristic' to determine input endianness. Default is UTF-16LE, but can be + overridden with `defaultEncoding: 'utf-16be'` option. Strips BOM unless `stripBOM: false`. + * Encoding: uses UTF-16LE and writes BOM by default. Use `addBOM: false` to override. + +## Other notes + +When decoding, be sure to supply a Buffer to decode() method, otherwise [bad things usually happen](https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding). +Untranslatable characters are set to � or ?. No transliteration is currently supported. +Node versions 0.10.31 and 0.11.13 are buggy, don't use them (see #65, #77). + +## Testing + +```bash +$ git clone git@github.com:ashtuchkin/iconv-lite.git +$ cd iconv-lite +$ npm install +$ npm test + +$ # To view performance: +$ node test/performance.js + +$ # To view test coverage: +$ npm run coverage +$ open coverage/lcov-report/index.html +``` diff --git a/node_modules/iconv-lite/encodings/dbcs-codec.js b/node_modules/iconv-lite/encodings/dbcs-codec.js new file mode 100644 index 00000000..1fe3e160 --- /dev/null +++ b/node_modules/iconv-lite/encodings/dbcs-codec.js @@ -0,0 +1,555 @@ +"use strict"; +var Buffer = require("safer-buffer").Buffer; + +// Multibyte codec. In this scheme, a character is represented by 1 or more bytes. +// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences. +// To save memory and loading time, we read table files only when requested. + +exports._dbcs = DBCSCodec; + +var UNASSIGNED = -1, + GB18030_CODE = -2, + SEQ_START = -10, + NODE_START = -1000, + UNASSIGNED_NODE = new Array(0x100), + DEF_CHAR = -1; + +for (var i = 0; i < 0x100; i++) + UNASSIGNED_NODE[i] = UNASSIGNED; + + +// Class DBCSCodec reads and initializes mapping tables. +function DBCSCodec(codecOptions, iconv) { + this.encodingName = codecOptions.encodingName; + if (!codecOptions) + throw new Error("DBCS codec is called without the data.") + if (!codecOptions.table) + throw new Error("Encoding '" + this.encodingName + "' has no data."); + + // Load tables. + var mappingTable = codecOptions.table(); + + + // Decode tables: MBCS -> Unicode. + + // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256. + // Trie root is decodeTables[0]. + // Values: >= 0 -> unicode character code. can be > 0xFFFF + // == UNASSIGNED -> unknown/unassigned sequence. + // == GB18030_CODE -> this is the end of a GB18030 4-byte sequence. + // <= NODE_START -> index of the next node in our trie to process next byte. + // <= SEQ_START -> index of the start of a character code sequence, in decodeTableSeq. + this.decodeTables = []; + this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node. + + // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here. + this.decodeTableSeq = []; + + // Actual mapping tables consist of chunks. Use them to fill up decode tables. + for (var i = 0; i < mappingTable.length; i++) + this._addDecodeChunk(mappingTable[i]); + + this.defaultCharUnicode = iconv.defaultCharUnicode; + + + // Encode tables: Unicode -> DBCS. + + // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance. + // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null. + // Values: >= 0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.). + // == UNASSIGNED -> no conversion found. Output a default char. + // <= SEQ_START -> it's an index in encodeTableSeq, see below. The character starts a sequence. + this.encodeTable = []; + + // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of + // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key + // means end of sequence (needed when one sequence is a strict subsequence of another). + // Objects are kept separately from encodeTable to increase performance. + this.encodeTableSeq = []; + + // Some chars can be decoded, but need not be encoded. + var skipEncodeChars = {}; + if (codecOptions.encodeSkipVals) + for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) { + var val = codecOptions.encodeSkipVals[i]; + if (typeof val === 'number') + skipEncodeChars[val] = true; + else + for (var j = val.from; j <= val.to; j++) + skipEncodeChars[j] = true; + } + + // Use decode trie to recursively fill out encode tables. + this._fillEncodeTable(0, 0, skipEncodeChars); + + // Add more encoding pairs when needed. + if (codecOptions.encodeAdd) { + for (var uChar in codecOptions.encodeAdd) + if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar)) + this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]); + } + + this.defCharSB = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)]; + if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?']; + if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0); + + + // Load & create GB18030 tables when needed. + if (typeof codecOptions.gb18030 === 'function') { + this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges. + + // Add GB18030 decode tables. + var thirdByteNodeIdx = this.decodeTables.length; + var thirdByteNode = this.decodeTables[thirdByteNodeIdx] = UNASSIGNED_NODE.slice(0); + + var fourthByteNodeIdx = this.decodeTables.length; + var fourthByteNode = this.decodeTables[fourthByteNodeIdx] = UNASSIGNED_NODE.slice(0); + + for (var i = 0x81; i <= 0xFE; i++) { + var secondByteNodeIdx = NODE_START - this.decodeTables[0][i]; + var secondByteNode = this.decodeTables[secondByteNodeIdx]; + for (var j = 0x30; j <= 0x39; j++) + secondByteNode[j] = NODE_START - thirdByteNodeIdx; + } + for (var i = 0x81; i <= 0xFE; i++) + thirdByteNode[i] = NODE_START - fourthByteNodeIdx; + for (var i = 0x30; i <= 0x39; i++) + fourthByteNode[i] = GB18030_CODE + } +} + +DBCSCodec.prototype.encoder = DBCSEncoder; +DBCSCodec.prototype.decoder = DBCSDecoder; + +// Decoder helpers +DBCSCodec.prototype._getDecodeTrieNode = function(addr) { + var bytes = []; + for (; addr > 0; addr >>= 8) + bytes.push(addr & 0xFF); + if (bytes.length == 0) + bytes.push(0); + + var node = this.decodeTables[0]; + for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie. + var val = node[bytes[i]]; + + if (val == UNASSIGNED) { // Create new node. + node[bytes[i]] = NODE_START - this.decodeTables.length; + this.decodeTables.push(node = UNASSIGNED_NODE.slice(0)); + } + else if (val <= NODE_START) { // Existing node. + node = this.decodeTables[NODE_START - val]; + } + else + throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16)); + } + return node; +} + + +DBCSCodec.prototype._addDecodeChunk = function(chunk) { + // First element of chunk is the hex mbcs code where we start. + var curAddr = parseInt(chunk[0], 16); + + // Choose the decoding node where we'll write our chars. + var writeTable = this._getDecodeTrieNode(curAddr); + curAddr = curAddr & 0xFF; + + // Write all other elements of the chunk to the table. + for (var k = 1; k < chunk.length; k++) { + var part = chunk[k]; + if (typeof part === "string") { // String, write as-is. + for (var l = 0; l < part.length;) { + var code = part.charCodeAt(l++); + if (0xD800 <= code && code < 0xDC00) { // Decode surrogate + var codeTrail = part.charCodeAt(l++); + if (0xDC00 <= codeTrail && codeTrail < 0xE000) + writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00); + else + throw new Error("Incorrect surrogate pair in " + this.encodingName + " at chunk " + chunk[0]); + } + else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used) + var len = 0xFFF - code + 2; + var seq = []; + for (var m = 0; m < len; m++) + seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq. + + writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length; + this.decodeTableSeq.push(seq); + } + else + writeTable[curAddr++] = code; // Basic char + } + } + else if (typeof part === "number") { // Integer, meaning increasing sequence starting with prev character. + var charCode = writeTable[curAddr - 1] + 1; + for (var l = 0; l < part; l++) + writeTable[curAddr++] = charCode++; + } + else + throw new Error("Incorrect type '" + typeof part + "' given in " + this.encodingName + " at chunk " + chunk[0]); + } + if (curAddr > 0xFF) + throw new Error("Incorrect chunk in " + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr); +} + +// Encoder helpers +DBCSCodec.prototype._getEncodeBucket = function(uCode) { + var high = uCode >> 8; // This could be > 0xFF because of astral characters. + if (this.encodeTable[high] === undefined) + this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand. + return this.encodeTable[high]; +} + +DBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) { + var bucket = this._getEncodeBucket(uCode); + var low = uCode & 0xFF; + if (bucket[low] <= SEQ_START) + this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it. + else if (bucket[low] == UNASSIGNED) + bucket[low] = dbcsCode; +} + +DBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) { + + // Get the root of character tree according to first character of the sequence. + var uCode = seq[0]; + var bucket = this._getEncodeBucket(uCode); + var low = uCode & 0xFF; + + var node; + if (bucket[low] <= SEQ_START) { + // There's already a sequence with - use it. + node = this.encodeTableSeq[SEQ_START-bucket[low]]; + } + else { + // There was no sequence object - allocate a new one. + node = {}; + if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence. + bucket[low] = SEQ_START - this.encodeTableSeq.length; + this.encodeTableSeq.push(node); + } + + // Traverse the character tree, allocating new nodes as needed. + for (var j = 1; j < seq.length-1; j++) { + var oldVal = node[uCode]; + if (typeof oldVal === 'object') + node = oldVal; + else { + node = node[uCode] = {} + if (oldVal !== undefined) + node[DEF_CHAR] = oldVal + } + } + + // Set the leaf to given dbcsCode. + uCode = seq[seq.length-1]; + node[uCode] = dbcsCode; +} + +DBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) { + var node = this.decodeTables[nodeIdx]; + for (var i = 0; i < 0x100; i++) { + var uCode = node[i]; + var mbCode = prefix + i; + if (skipEncodeChars[mbCode]) + continue; + + if (uCode >= 0) + this._setEncodeChar(uCode, mbCode); + else if (uCode <= NODE_START) + this._fillEncodeTable(NODE_START - uCode, mbCode << 8, skipEncodeChars); + else if (uCode <= SEQ_START) + this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode); + } +} + + + +// == Encoder ================================================================== + +function DBCSEncoder(options, codec) { + // Encoder state + this.leadSurrogate = -1; + this.seqObj = undefined; + + // Static data + this.encodeTable = codec.encodeTable; + this.encodeTableSeq = codec.encodeTableSeq; + this.defaultCharSingleByte = codec.defCharSB; + this.gb18030 = codec.gb18030; +} + +DBCSEncoder.prototype.write = function(str) { + var newBuf = Buffer.alloc(str.length * (this.gb18030 ? 4 : 3)), + leadSurrogate = this.leadSurrogate, + seqObj = this.seqObj, nextChar = -1, + i = 0, j = 0; + + while (true) { + // 0. Get next character. + if (nextChar === -1) { + if (i == str.length) break; + var uCode = str.charCodeAt(i++); + } + else { + var uCode = nextChar; + nextChar = -1; + } + + // 1. Handle surrogates. + if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates. + if (uCode < 0xDC00) { // We've got lead surrogate. + if (leadSurrogate === -1) { + leadSurrogate = uCode; + continue; + } else { + leadSurrogate = uCode; + // Double lead surrogate found. + uCode = UNASSIGNED; + } + } else { // We've got trail surrogate. + if (leadSurrogate !== -1) { + uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00); + leadSurrogate = -1; + } else { + // Incomplete surrogate pair - only trail surrogate found. + uCode = UNASSIGNED; + } + + } + } + else if (leadSurrogate !== -1) { + // Incomplete surrogate pair - only lead surrogate found. + nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char. + leadSurrogate = -1; + } + + // 2. Convert uCode character. + var dbcsCode = UNASSIGNED; + if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence + var resCode = seqObj[uCode]; + if (typeof resCode === 'object') { // Sequence continues. + seqObj = resCode; + continue; + + } else if (typeof resCode == 'number') { // Sequence finished. Write it. + dbcsCode = resCode; + + } else if (resCode == undefined) { // Current character is not part of the sequence. + + // Try default character for this sequence + resCode = seqObj[DEF_CHAR]; + if (resCode !== undefined) { + dbcsCode = resCode; // Found. Write it. + nextChar = uCode; // Current character will be written too in the next iteration. + + } else { + // TODO: What if we have no default? (resCode == undefined) + // Then, we should write first char of the sequence as-is and try the rest recursively. + // Didn't do it for now because no encoding has this situation yet. + // Currently, just skip the sequence and write current char. + } + } + seqObj = undefined; + } + else if (uCode >= 0) { // Regular character + var subtable = this.encodeTable[uCode >> 8]; + if (subtable !== undefined) + dbcsCode = subtable[uCode & 0xFF]; + + if (dbcsCode <= SEQ_START) { // Sequence start + seqObj = this.encodeTableSeq[SEQ_START-dbcsCode]; + continue; + } + + if (dbcsCode == UNASSIGNED && this.gb18030) { + // Use GB18030 algorithm to find character(s) to write. + var idx = findIdx(this.gb18030.uChars, uCode); + if (idx != -1) { + var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]); + newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600; + newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260; + newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10; + newBuf[j++] = 0x30 + dbcsCode; + continue; + } + } + } + + // 3. Write dbcsCode character. + if (dbcsCode === UNASSIGNED) + dbcsCode = this.defaultCharSingleByte; + + if (dbcsCode < 0x100) { + newBuf[j++] = dbcsCode; + } + else if (dbcsCode < 0x10000) { + newBuf[j++] = dbcsCode >> 8; // high byte + newBuf[j++] = dbcsCode & 0xFF; // low byte + } + else { + newBuf[j++] = dbcsCode >> 16; + newBuf[j++] = (dbcsCode >> 8) & 0xFF; + newBuf[j++] = dbcsCode & 0xFF; + } + } + + this.seqObj = seqObj; + this.leadSurrogate = leadSurrogate; + return newBuf.slice(0, j); +} + +DBCSEncoder.prototype.end = function() { + if (this.leadSurrogate === -1 && this.seqObj === undefined) + return; // All clean. Most often case. + + var newBuf = Buffer.alloc(10), j = 0; + + if (this.seqObj) { // We're in the sequence. + var dbcsCode = this.seqObj[DEF_CHAR]; + if (dbcsCode !== undefined) { // Write beginning of the sequence. + if (dbcsCode < 0x100) { + newBuf[j++] = dbcsCode; + } + else { + newBuf[j++] = dbcsCode >> 8; // high byte + newBuf[j++] = dbcsCode & 0xFF; // low byte + } + } else { + // See todo above. + } + this.seqObj = undefined; + } + + if (this.leadSurrogate !== -1) { + // Incomplete surrogate pair - only lead surrogate found. + newBuf[j++] = this.defaultCharSingleByte; + this.leadSurrogate = -1; + } + + return newBuf.slice(0, j); +} + +// Export for testing +DBCSEncoder.prototype.findIdx = findIdx; + + +// == Decoder ================================================================== + +function DBCSDecoder(options, codec) { + // Decoder state + this.nodeIdx = 0; + this.prevBuf = Buffer.alloc(0); + + // Static data + this.decodeTables = codec.decodeTables; + this.decodeTableSeq = codec.decodeTableSeq; + this.defaultCharUnicode = codec.defaultCharUnicode; + this.gb18030 = codec.gb18030; +} + +DBCSDecoder.prototype.write = function(buf) { + var newBuf = Buffer.alloc(buf.length*2), + nodeIdx = this.nodeIdx, + prevBuf = this.prevBuf, prevBufOffset = this.prevBuf.length, + seqStart = -this.prevBuf.length, // idx of the start of current parsed sequence. + uCode; + + if (prevBufOffset > 0) // Make prev buf overlap a little to make it easier to slice later. + prevBuf = Buffer.concat([prevBuf, buf.slice(0, 10)]); + + for (var i = 0, j = 0; i < buf.length; i++) { + var curByte = (i >= 0) ? buf[i] : prevBuf[i + prevBufOffset]; + + // Lookup in current trie node. + var uCode = this.decodeTables[nodeIdx][curByte]; + + if (uCode >= 0) { + // Normal character, just use it. + } + else if (uCode === UNASSIGNED) { // Unknown char. + // TODO: Callback with seq. + //var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset); + i = seqStart; // Try to parse again, after skipping first byte of the sequence ('i' will be incremented by 'for' cycle). + uCode = this.defaultCharUnicode.charCodeAt(0); + } + else if (uCode === GB18030_CODE) { + var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset); + var ptr = (curSeq[0]-0x81)*12600 + (curSeq[1]-0x30)*1260 + (curSeq[2]-0x81)*10 + (curSeq[3]-0x30); + var idx = findIdx(this.gb18030.gbChars, ptr); + uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx]; + } + else if (uCode <= NODE_START) { // Go to next trie node. + nodeIdx = NODE_START - uCode; + continue; + } + else if (uCode <= SEQ_START) { // Output a sequence of chars. + var seq = this.decodeTableSeq[SEQ_START - uCode]; + for (var k = 0; k < seq.length - 1; k++) { + uCode = seq[k]; + newBuf[j++] = uCode & 0xFF; + newBuf[j++] = uCode >> 8; + } + uCode = seq[seq.length-1]; + } + else + throw new Error("iconv-lite internal error: invalid decoding table value " + uCode + " at " + nodeIdx + "/" + curByte); + + // Write the character to buffer, handling higher planes using surrogate pair. + if (uCode > 0xFFFF) { + uCode -= 0x10000; + var uCodeLead = 0xD800 + Math.floor(uCode / 0x400); + newBuf[j++] = uCodeLead & 0xFF; + newBuf[j++] = uCodeLead >> 8; + + uCode = 0xDC00 + uCode % 0x400; + } + newBuf[j++] = uCode & 0xFF; + newBuf[j++] = uCode >> 8; + + // Reset trie node. + nodeIdx = 0; seqStart = i+1; + } + + this.nodeIdx = nodeIdx; + this.prevBuf = (seqStart >= 0) ? buf.slice(seqStart) : prevBuf.slice(seqStart + prevBufOffset); + return newBuf.slice(0, j).toString('ucs2'); +} + +DBCSDecoder.prototype.end = function() { + var ret = ''; + + // Try to parse all remaining chars. + while (this.prevBuf.length > 0) { + // Skip 1 character in the buffer. + ret += this.defaultCharUnicode; + var buf = this.prevBuf.slice(1); + + // Parse remaining as usual. + this.prevBuf = Buffer.alloc(0); + this.nodeIdx = 0; + if (buf.length > 0) + ret += this.write(buf); + } + + this.nodeIdx = 0; + return ret; +} + +// Binary search for GB18030. Returns largest i such that table[i] <= val. +function findIdx(table, val) { + if (table[0] > val) + return -1; + + var l = 0, r = table.length; + while (l < r-1) { // always table[l] <= val < table[r] + var mid = l + Math.floor((r-l+1)/2); + if (table[mid] <= val) + l = mid; + else + r = mid; + } + return l; +} + diff --git a/node_modules/iconv-lite/encodings/dbcs-data.js b/node_modules/iconv-lite/encodings/dbcs-data.js new file mode 100644 index 00000000..4b619143 --- /dev/null +++ b/node_modules/iconv-lite/encodings/dbcs-data.js @@ -0,0 +1,176 @@ +"use strict"; + +// Description of supported double byte encodings and aliases. +// Tables are not require()-d until they are needed to speed up library load. +// require()-s are direct to support Browserify. + +module.exports = { + + // == Japanese/ShiftJIS ==================================================== + // All japanese encodings are based on JIS X set of standards: + // JIS X 0201 - Single-byte encoding of ASCII + Â¥ + Kana chars at 0xA1-0xDF. + // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes. + // Has several variations in 1978, 1983, 1990 and 1997. + // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead. + // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233. + // 2 planes, first is superset of 0208, second - revised 0212. + // Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx) + + // Byte encodings are: + // * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte + // encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC. + // Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI. + // * EUC-JP: Up to 3 bytes per character. Used mostly on *nixes. + // 0x00-0x7F - lower part of 0201 + // 0x8E, 0xA1-0xDF - upper part of 0201 + // (0xA1-0xFE)x2 - 0208 plane (94x94). + // 0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94). + // * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon. + // Used as-is in ISO2022 family. + // * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII, + // 0201-1976 Roman, 0208-1978, 0208-1983. + // * ISO2022-JP-1: Adds esc seq for 0212-1990. + // * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7. + // * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2. + // * ISO2022-JP-2004: Adds 0213-2004 Plane 1. + // + // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes. + // + // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html + + 'shiftjis': { + type: '_dbcs', + table: function() { return require('./tables/shiftjis.json') }, + encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E}, + encodeSkipVals: [{from: 0xED40, to: 0xF940}], + }, + 'csshiftjis': 'shiftjis', + 'mskanji': 'shiftjis', + 'sjis': 'shiftjis', + 'windows31j': 'shiftjis', + 'ms31j': 'shiftjis', + 'xsjis': 'shiftjis', + 'windows932': 'shiftjis', + 'ms932': 'shiftjis', + '932': 'shiftjis', + 'cp932': 'shiftjis', + + 'eucjp': { + type: '_dbcs', + table: function() { return require('./tables/eucjp.json') }, + encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E}, + }, + + // TODO: KDDI extension to Shift_JIS + // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes. + // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars. + + + // == Chinese/GBK ========================================================== + // http://en.wikipedia.org/wiki/GBK + // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder + + // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936 + 'gb2312': 'cp936', + 'gb231280': 'cp936', + 'gb23121980': 'cp936', + 'csgb2312': 'cp936', + 'csiso58gb231280': 'cp936', + 'euccn': 'cp936', + + // Microsoft's CP936 is a subset and approximation of GBK. + 'windows936': 'cp936', + 'ms936': 'cp936', + '936': 'cp936', + 'cp936': { + type: '_dbcs', + table: function() { return require('./tables/cp936.json') }, + }, + + // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other. + 'gbk': { + type: '_dbcs', + table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) }, + }, + 'xgbk': 'gbk', + 'isoir58': 'gbk', + + // GB18030 is an algorithmic extension of GBK. + // Main source: https://www.w3.org/TR/encoding/#gbk-encoder + // http://icu-project.org/docs/papers/gb18030.html + // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml + // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0 + 'gb18030': { + type: '_dbcs', + table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) }, + gb18030: function() { return require('./tables/gb18030-ranges.json') }, + encodeSkipVals: [0x80], + encodeAdd: {'€': 0xA2E3}, + }, + + 'chinese': 'gb18030', + + + // == Korean =============================================================== + // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same. + 'windows949': 'cp949', + 'ms949': 'cp949', + '949': 'cp949', + 'cp949': { + type: '_dbcs', + table: function() { return require('./tables/cp949.json') }, + }, + + 'cseuckr': 'cp949', + 'csksc56011987': 'cp949', + 'euckr': 'cp949', + 'isoir149': 'cp949', + 'korean': 'cp949', + 'ksc56011987': 'cp949', + 'ksc56011989': 'cp949', + 'ksc5601': 'cp949', + + + // == Big5/Taiwan/Hong Kong ================================================ + // There are lots of tables for Big5 and cp950. Please see the following links for history: + // http://moztw.org/docs/big5/ http://www.haible.de/bruno/charsets/conversion-tables/Big5.html + // Variations, in roughly number of defined chars: + // * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT + // * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/ + // * Big5-2003 (Taiwan standard) almost superset of cp950. + // * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers. + // * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard. + // many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years. + // Plus, it has 4 combining sequences. + // Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299 + // because big5-hkscs is the only encoding to include astral characters in non-algorithmic way. + // Implementations are not consistent within browsers; sometimes labeled as just big5. + // MS Internet Explorer switches from big5 to big5-hkscs when a patch applied. + // Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31 + // In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s. + // Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt + // http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt + // + // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder + // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong. + + 'windows950': 'cp950', + 'ms950': 'cp950', + '950': 'cp950', + 'cp950': { + type: '_dbcs', + table: function() { return require('./tables/cp950.json') }, + }, + + // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus. + 'big5': 'big5hkscs', + 'big5hkscs': { + type: '_dbcs', + table: function() { return require('./tables/cp950.json').concat(require('./tables/big5-added.json')) }, + encodeSkipVals: [0xa2cc], + }, + + 'cnbig5': 'big5hkscs', + 'csbig5': 'big5hkscs', + 'xxbig5': 'big5hkscs', +}; diff --git a/node_modules/iconv-lite/encodings/index.js b/node_modules/iconv-lite/encodings/index.js new file mode 100644 index 00000000..e3040031 --- /dev/null +++ b/node_modules/iconv-lite/encodings/index.js @@ -0,0 +1,22 @@ +"use strict"; + +// Update this array if you add/rename/remove files in this directory. +// We support Browserify by skipping automatic module discovery and requiring modules directly. +var modules = [ + require("./internal"), + require("./utf16"), + require("./utf7"), + require("./sbcs-codec"), + require("./sbcs-data"), + require("./sbcs-data-generated"), + require("./dbcs-codec"), + require("./dbcs-data"), +]; + +// Put all encoding/alias/codec definitions to single object and export it. +for (var i = 0; i < modules.length; i++) { + var module = modules[i]; + for (var enc in module) + if (Object.prototype.hasOwnProperty.call(module, enc)) + exports[enc] = module[enc]; +} diff --git a/node_modules/iconv-lite/encodings/internal.js b/node_modules/iconv-lite/encodings/internal.js new file mode 100644 index 00000000..05ce38b2 --- /dev/null +++ b/node_modules/iconv-lite/encodings/internal.js @@ -0,0 +1,188 @@ +"use strict"; +var Buffer = require("safer-buffer").Buffer; + +// Export Node.js internal encodings. + +module.exports = { + // Encodings + utf8: { type: "_internal", bomAware: true}, + cesu8: { type: "_internal", bomAware: true}, + unicode11utf8: "utf8", + + ucs2: { type: "_internal", bomAware: true}, + utf16le: "ucs2", + + binary: { type: "_internal" }, + base64: { type: "_internal" }, + hex: { type: "_internal" }, + + // Codec. + _internal: InternalCodec, +}; + +//------------------------------------------------------------------------------ + +function InternalCodec(codecOptions, iconv) { + this.enc = codecOptions.encodingName; + this.bomAware = codecOptions.bomAware; + + if (this.enc === "base64") + this.encoder = InternalEncoderBase64; + else if (this.enc === "cesu8") { + this.enc = "utf8"; // Use utf8 for decoding. + this.encoder = InternalEncoderCesu8; + + // Add decoder for versions of Node not supporting CESU-8 + if (Buffer.from('eda0bdedb2a9', 'hex').toString() !== '💩') { + this.decoder = InternalDecoderCesu8; + this.defaultCharUnicode = iconv.defaultCharUnicode; + } + } +} + +InternalCodec.prototype.encoder = InternalEncoder; +InternalCodec.prototype.decoder = InternalDecoder; + +//------------------------------------------------------------------------------ + +// We use node.js internal decoder. Its signature is the same as ours. +var StringDecoder = require('string_decoder').StringDecoder; + +if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method. + StringDecoder.prototype.end = function() {}; + + +function InternalDecoder(options, codec) { + StringDecoder.call(this, codec.enc); +} + +InternalDecoder.prototype = StringDecoder.prototype; + + +//------------------------------------------------------------------------------ +// Encoder is mostly trivial + +function InternalEncoder(options, codec) { + this.enc = codec.enc; +} + +InternalEncoder.prototype.write = function(str) { + return Buffer.from(str, this.enc); +} + +InternalEncoder.prototype.end = function() { +} + + +//------------------------------------------------------------------------------ +// Except base64 encoder, which must keep its state. + +function InternalEncoderBase64(options, codec) { + this.prevStr = ''; +} + +InternalEncoderBase64.prototype.write = function(str) { + str = this.prevStr + str; + var completeQuads = str.length - (str.length % 4); + this.prevStr = str.slice(completeQuads); + str = str.slice(0, completeQuads); + + return Buffer.from(str, "base64"); +} + +InternalEncoderBase64.prototype.end = function() { + return Buffer.from(this.prevStr, "base64"); +} + + +//------------------------------------------------------------------------------ +// CESU-8 encoder is also special. + +function InternalEncoderCesu8(options, codec) { +} + +InternalEncoderCesu8.prototype.write = function(str) { + var buf = Buffer.alloc(str.length * 3), bufIdx = 0; + for (var i = 0; i < str.length; i++) { + var charCode = str.charCodeAt(i); + // Naive implementation, but it works because CESU-8 is especially easy + // to convert from UTF-16 (which all JS strings are encoded in). + if (charCode < 0x80) + buf[bufIdx++] = charCode; + else if (charCode < 0x800) { + buf[bufIdx++] = 0xC0 + (charCode >>> 6); + buf[bufIdx++] = 0x80 + (charCode & 0x3f); + } + else { // charCode will always be < 0x10000 in javascript. + buf[bufIdx++] = 0xE0 + (charCode >>> 12); + buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f); + buf[bufIdx++] = 0x80 + (charCode & 0x3f); + } + } + return buf.slice(0, bufIdx); +} + +InternalEncoderCesu8.prototype.end = function() { +} + +//------------------------------------------------------------------------------ +// CESU-8 decoder is not implemented in Node v4.0+ + +function InternalDecoderCesu8(options, codec) { + this.acc = 0; + this.contBytes = 0; + this.accBytes = 0; + this.defaultCharUnicode = codec.defaultCharUnicode; +} + +InternalDecoderCesu8.prototype.write = function(buf) { + var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes, + res = ''; + for (var i = 0; i < buf.length; i++) { + var curByte = buf[i]; + if ((curByte & 0xC0) !== 0x80) { // Leading byte + if (contBytes > 0) { // Previous code is invalid + res += this.defaultCharUnicode; + contBytes = 0; + } + + if (curByte < 0x80) { // Single-byte code + res += String.fromCharCode(curByte); + } else if (curByte < 0xE0) { // Two-byte code + acc = curByte & 0x1F; + contBytes = 1; accBytes = 1; + } else if (curByte < 0xF0) { // Three-byte code + acc = curByte & 0x0F; + contBytes = 2; accBytes = 1; + } else { // Four or more are not supported for CESU-8. + res += this.defaultCharUnicode; + } + } else { // Continuation byte + if (contBytes > 0) { // We're waiting for it. + acc = (acc << 6) | (curByte & 0x3f); + contBytes--; accBytes++; + if (contBytes === 0) { + // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80) + if (accBytes === 2 && acc < 0x80 && acc > 0) + res += this.defaultCharUnicode; + else if (accBytes === 3 && acc < 0x800) + res += this.defaultCharUnicode; + else + // Actually add character. + res += String.fromCharCode(acc); + } + } else { // Unexpected continuation byte + res += this.defaultCharUnicode; + } + } + } + this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes; + return res; +} + +InternalDecoderCesu8.prototype.end = function() { + var res = 0; + if (this.contBytes > 0) + res += this.defaultCharUnicode; + return res; +} diff --git a/node_modules/iconv-lite/encodings/sbcs-codec.js b/node_modules/iconv-lite/encodings/sbcs-codec.js new file mode 100644 index 00000000..abac5ffa --- /dev/null +++ b/node_modules/iconv-lite/encodings/sbcs-codec.js @@ -0,0 +1,72 @@ +"use strict"; +var Buffer = require("safer-buffer").Buffer; + +// Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that +// correspond to encoded bytes (if 128 - then lower half is ASCII). + +exports._sbcs = SBCSCodec; +function SBCSCodec(codecOptions, iconv) { + if (!codecOptions) + throw new Error("SBCS codec is called without the data.") + + // Prepare char buffer for decoding. + if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256)) + throw new Error("Encoding '"+codecOptions.type+"' has incorrect 'chars' (must be of len 128 or 256)"); + + if (codecOptions.chars.length === 128) { + var asciiString = ""; + for (var i = 0; i < 128; i++) + asciiString += String.fromCharCode(i); + codecOptions.chars = asciiString + codecOptions.chars; + } + + this.decodeBuf = Buffer.from(codecOptions.chars, 'ucs2'); + + // Encoding buffer. + var encodeBuf = Buffer.alloc(65536, iconv.defaultCharSingleByte.charCodeAt(0)); + + for (var i = 0; i < codecOptions.chars.length; i++) + encodeBuf[codecOptions.chars.charCodeAt(i)] = i; + + this.encodeBuf = encodeBuf; +} + +SBCSCodec.prototype.encoder = SBCSEncoder; +SBCSCodec.prototype.decoder = SBCSDecoder; + + +function SBCSEncoder(options, codec) { + this.encodeBuf = codec.encodeBuf; +} + +SBCSEncoder.prototype.write = function(str) { + var buf = Buffer.alloc(str.length); + for (var i = 0; i < str.length; i++) + buf[i] = this.encodeBuf[str.charCodeAt(i)]; + + return buf; +} + +SBCSEncoder.prototype.end = function() { +} + + +function SBCSDecoder(options, codec) { + this.decodeBuf = codec.decodeBuf; +} + +SBCSDecoder.prototype.write = function(buf) { + // Strings are immutable in JS -> we use ucs2 buffer to speed up computations. + var decodeBuf = this.decodeBuf; + var newBuf = Buffer.alloc(buf.length*2); + var idx1 = 0, idx2 = 0; + for (var i = 0; i < buf.length; i++) { + idx1 = buf[i]*2; idx2 = i*2; + newBuf[idx2] = decodeBuf[idx1]; + newBuf[idx2+1] = decodeBuf[idx1+1]; + } + return newBuf.toString('ucs2'); +} + +SBCSDecoder.prototype.end = function() { +} diff --git a/node_modules/iconv-lite/encodings/sbcs-data-generated.js b/node_modules/iconv-lite/encodings/sbcs-data-generated.js new file mode 100644 index 00000000..9b482360 --- /dev/null +++ b/node_modules/iconv-lite/encodings/sbcs-data-generated.js @@ -0,0 +1,451 @@ +"use strict"; + +// Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script. +module.exports = { + "437": "cp437", + "737": "cp737", + "775": "cp775", + "850": "cp850", + "852": "cp852", + "855": "cp855", + "856": "cp856", + "857": "cp857", + "858": "cp858", + "860": "cp860", + "861": "cp861", + "862": "cp862", + "863": "cp863", + "864": "cp864", + "865": "cp865", + "866": "cp866", + "869": "cp869", + "874": "windows874", + "922": "cp922", + "1046": "cp1046", + "1124": "cp1124", + "1125": "cp1125", + "1129": "cp1129", + "1133": "cp1133", + "1161": "cp1161", + "1162": "cp1162", + "1163": "cp1163", + "1250": "windows1250", + "1251": "windows1251", + "1252": "windows1252", + "1253": "windows1253", + "1254": "windows1254", + "1255": "windows1255", + "1256": "windows1256", + "1257": "windows1257", + "1258": "windows1258", + "28591": "iso88591", + "28592": "iso88592", + "28593": "iso88593", + "28594": "iso88594", + "28595": "iso88595", + "28596": "iso88596", + "28597": "iso88597", + "28598": "iso88598", + "28599": "iso88599", + "28600": "iso885910", + "28601": "iso885911", + "28603": "iso885913", + "28604": "iso885914", + "28605": "iso885915", + "28606": "iso885916", + "windows874": { + "type": "_sbcs", + "chars": "€����…�����������‘’“â€â€¢â€“—�������� à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛����" + }, + "win874": "windows874", + "cp874": "windows874", + "windows1250": { + "type": "_sbcs", + "chars": "€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“â€â€¢â€“—�™š›śťžź ˇ˘Å¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»ĽËľżŔÃÂĂÄĹĆÇČÉĘËĚÃÃŽÄŽÄŃŇÓÔÅÖ×ŘŮÚŰÜÃŢßŕáâăäĺćçÄéęëěíîÄđńňóôőö÷řůúűüýţ˙" + }, + "win1250": "windows1250", + "cp1250": "windows1250", + "windows1251": { + "type": "_sbcs", + "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋÐђ‘’“â€â€¢â€“—�™љ›њќћџ ЎўЈ¤Ò¦§Ð©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ" + }, + "win1251": "windows1251", + "cp1251": "windows1251", + "windows1252": { + "type": "_sbcs", + "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“â€â€¢â€“—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖרÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + }, + "win1252": "windows1252", + "cp1252": "windows1252", + "windows1253": { + "type": "_sbcs", + "chars": "€�‚ƒ„…†‡�‰�‹�����‘’“â€â€¢â€“—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎÎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπÏςστυφχψωϊϋόÏώ�" + }, + "win1253": "windows1253", + "cp1253": "windows1253", + "windows1254": { + "type": "_sbcs", + "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“â€â€¢â€“—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ" + }, + "win1254": "windows1254", + "cp1254": "windows1254", + "windows1255": { + "type": "_sbcs", + "chars": "€�‚ƒ„…†‡ˆ‰�‹�����‘’“â€â€¢â€“—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀×ׂ׃װױײ׳״�������×בגדהוזחטיךכל×מןנסעףפץצקרשת��‎â€ï¿½" + }, + "win1255": "windows1255", + "cp1255": "windows1255", + "windows1256": { + "type": "_sbcs", + "chars": "€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“â€â€¢â€“—ک™ڑ›œ‌â€ÚºÂ ØŒÂ¢Â£Â¤Â¥Â¦Â§Â¨Â©Ú¾Â«Â¬Â­Â®Â¯Â°Â±Â²Â³Â´ÂµÂ¶Â·Â¸Â¹Ø›Â»Â¼Â½Â¾ØŸÛءآأؤإئابةتثجحخدذرزسشصض×طظعغـÙقكàلâمنهوçèéêëىيîïًٌÙَôÙÙ÷ّùْûü‎â€Û’" + }, + "win1256": "windows1256", + "cp1256": "windows1256", + "windows1257": { + "type": "_sbcs", + "chars": "€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“â€â€¢â€“—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲÅŚŪÜŻŽßąįÄćäåęēÄéźėģķīļšńņóÅõö÷ųłśūüżž˙" + }, + "win1257": "windows1257", + "cp1257": "windows1257", + "windows1258": { + "type": "_sbcs", + "chars": "€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“â€â€¢â€“—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂĂÄÅÆÇÈÉÊË̀ÃÃŽÃÄÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêëÌíîïđṇ̃óôơö÷øùúûüư₫ÿ" + }, + "win1258": "windows1258", + "cp1258": "windows1258", + "iso88591": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖרÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + }, + "cp28591": "iso88591", + "iso88592": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ Ą˘Å¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťźËžżŔÃÂĂÄĹĆÇČÉĘËĚÃÃŽÄŽÄŃŇÓÔÅÖ×ŘŮÚŰÜÃŢßŕáâăäĺćçÄéęëěíîÄđńňóôőö÷řůúűüýţ˙" + }, + "cp28592": "iso88592", + "iso88593": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ Ħ˘£¤�Ĥ§¨İŞĞĴ­�ݰħ²³´µĥ·¸ışğĵ½�żÀÃÂ�ÄĊĈÇÈÉÊËÌÃÃŽÃ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ÄùúûüŭÅË™" + }, + "cp28593": "iso88593", + "iso88594": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ĄĸŖ¤Ĩϧ¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩšēģŧŊžŋĀÃÂÃÄÅÆĮČÉĘËĖÃÎĪÄŅŌĶÔÕÖרŲÚÛÜŨŪßÄáâãäåæįÄéęëėíîīđņÅķôõö÷øųúûüũū˙" + }, + "cp28594": "iso88594", + "iso88595": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ÐЂЃЄЅІЇЈЉЊЋЌ­ЎÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ№ёђѓєѕіїјљњћќ§ўџ" + }, + "cp28595": "iso88595", + "iso88596": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـÙقكلمنهوىيًٌÙÙŽÙÙّْ�������������" + }, + "cp28596": "iso88596", + "iso88597": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎÎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπÏςστυφχψωϊϋόÏώ�" + }, + "cp28597": "iso88597", + "iso88598": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗×בגדהוזחטיךכל×מןנסעףפץצקרשת��‎â€ï¿½" + }, + "cp28598": "iso88598", + "iso88599": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ" + }, + "cp28599": "iso88599", + "iso885910": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ĄĒĢĪĨͧĻÄŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÃÂÃÄÅÆĮČÉĘËĖÃÃŽÃÃŅŌÓÔÕÖŨØŲÚÛÜÃÞßÄáâãäåæįÄéęëėíîïðņÅóôõöũøųúûüýþĸ" + }, + "cp28600": "iso885910", + "iso885911": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛����" + }, + "cp28601": "iso885911", + "iso885913": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ â€Â¢Â£Â¤â€žÂ¦Â§Ã˜Â©Å–«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲÅŚŪÜŻŽßąįÄćäåęēÄéźėģķīļšńņóÅõö÷ųłśūüżž’" + }, + "cp28603": "iso885913", + "iso885914": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀá¹Â¶á¹–áºá¹—ẃṠỳẄẅṡÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃŴÑÒÓÔÕÖṪØÙÚÛÜÃŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ" + }, + "cp28604": "iso885914", + "iso885915": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖרÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + }, + "cp28605": "iso885915", + "iso885916": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ĄąÅ€„Чš©Ș«Ź­źŻ°±ČłŽâ€Â¶Â·Å¾Äș»ŒœŸżÀÃÂĂÄĆÆÇÈÉÊËÌÃÃŽÃÄŃÒÓÔÅÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ" + }, + "cp28606": "iso885916", + "cp437": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿âŒÂ¬Â½Â¼Â¡Â«Â»â–‘▒▓│┤╡╢╖╕╣║╗â•╜╛â”└┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â " + }, + "ibm437": "cp437", + "csibm437": "cp437", + "cp737": { + "type": "_sbcs", + "chars": "ΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπÏσςτυφχψ░▒▓│┤╡╢╖╕╣║╗â•╜╛â”└┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌â–▀ωάέήϊίόÏϋώΆΈΉΊΌΎÎ±≥≤ΪΫ÷≈°∙·√â¿Â²â– Â " + }, + "ibm737": "cp737", + "csibm737": "cp737", + "cp775": { + "type": "_sbcs", + "chars": "ĆüéÄäģåćłēŖŗīŹÄÅÉæÆÅöĢ¢ŚśÖÜø£Ø×¤ĀĪóŻżźâ€Â¦Â©Â®Â¬Â½Â¼Å«»░▒▓│┤ĄČĘĖ╣║╗â•ĮŠâ”└┴┬├─┼ŲŪ╚╔╩╦╠â•╬ŽąÄęėįšųūž┘┌█▄▌â–▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ " + }, + "ibm775": "cp775", + "csibm775": "cp775", + "cp850": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÃÂÀ©╣║╗â•¢¥â”└┴┬├─┼ãÃ╚╔╩╦╠â•╬¤ðÃÊËÈıÃÃŽÃ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýï´­±‗¾¶§÷¸°¨·¹³²■ " + }, + "ibm850": "cp850", + "csibm850": "cp850", + "cp852": { + "type": "_sbcs", + "chars": "ÇüéâäůćçłëÅőîŹÄĆÉĹĺôöĽľŚśÖÜŤťÅ×ÄáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÃÂĚŞ╣║╗╯żâ”└┴┬├─┼Ăă╚╔╩╦╠â•╬¤đÄĎËÄŇÃÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÃţ´­Ë˛ˇ˘§÷¸°¨˙űŘř■ " + }, + "ibm852": "cp852", + "csibm852": "cp852", + "cp855": { + "type": "_sbcs", + "chars": "ђЂѓЃёÐєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџÐюЮъЪаÐбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗â•йЙâ”└┴┬├─┼кК╚╔╩╦╠â•╬¤лЛмМнÐоОп┘┌█▄ПÑ▀ЯрРÑСтТуУжЖвВьЬ№­ыЫзЗшШÑЭщЩчЧ§■ " + }, + "ibm855": "cp855", + "csibm855": "cp855", + "cp856": { + "type": "_sbcs", + "chars": "×בגדהוזחטיךכל×מןנסעףפץצקרשת�£�×����������®¬½¼�«»░▒▓│┤���©╣║╗â•¢¥â”└┴┬├─┼��╚╔╩╦╠â•╬¤���������┘┌█▄¦�▀������µ�������¯´­±‗¾¶§÷¸°¨·¹³²■ " + }, + "ibm856": "cp856", + "csibm856": "cp856", + "cp857": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÃÂÀ©╣║╗â•¢¥â”└┴┬├─┼ãÃ╚╔╩╦╠â•╬¤ºªÊËÈ�ÃÃŽÃ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ " + }, + "ibm857": "cp857", + "csibm857": "cp857", + "cp858": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÃÂÀ©╣║╗â•¢¥â”└┴┬├─┼ãÃ╚╔╩╦╠â•╬¤ðÃÊËÈ€ÃÃŽÃ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýï´­±‗¾¶§÷¸°¨·¹³²■ " + }, + "ibm858": "cp858", + "csibm858": "cp858", + "cp860": { + "type": "_sbcs", + "chars": "ÇüéâãàÃçêÊèÃÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñѪº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗â•╜╛â”└┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â " + }, + "ibm860": "cp860", + "csibm860": "cp860", + "cp861": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèÃðÞÄÅÉæÆôöþûÃýÖÜø£Ø₧ƒáíóúÃÃÓÚ¿âŒÂ¬Â½Â¼Â¡Â«Â»â–‘▒▓│┤╡╢╖╕╣║╗â•╜╛â”└┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â " + }, + "ibm861": "cp861", + "csibm861": "cp861", + "cp862": { + "type": "_sbcs", + "chars": "×בגדהוזחטיךכל×מןנסעףפץצקרשת¢£¥₧ƒáíóúñѪº¿âŒÂ¬Â½Â¼Â¡Â«Â»â–‘▒▓│┤╡╢╖╕╣║╗â•╜╛â”└┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â " + }, + "ibm862": "cp862", + "csibm862": "cp862", + "cp863": { + "type": "_sbcs", + "chars": "ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÃûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯ÎâŒÂ¬Â½Â¼Â¾Â«Â»â–‘▒▓│┤╡╢╖╕╣║╗â•╜╛â”└┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â " + }, + "ibm863": "cp863", + "csibm863": "cp863", + "cp864": { + "type": "_sbcs", + "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$Ùª&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°·∙√▒─│┼┤┬├┴â”┌└┘β∞φ±½¼≈«»ﻷﻸ��ﻻﻼ� ­ﺂ£¤ﺄ��ﺎïºïº•ﺙ،ïºïº¡ïº¥Ù Ù¡Ù¢Ù£Ù¤Ù¥Ù¦Ù§Ù¨Ù©ï»‘؛ﺱﺵﺹ؟¢ﺀïºïºƒïº…ﻊﺋïºïº‘ﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿï»ï»…ﻋï»Â¦Â¬Ã·Ã—ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎï»ï»¡ï¹½Ù‘ﻥﻩﻬﻰﻲï»ï»•ﻵﻶï»ï»™ï»±â– ï¿½" + }, + "ibm864": "cp864", + "csibm864": "cp864", + "cp865": { + "type": "_sbcs", + "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿âŒÂ¬Â½Â¼Â¡Â«Â¤â–‘▒▓│┤╡╢╖╕╣║╗â•╜╛â”└┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â " + }, + "ibm865": "cp865", + "csibm865": "cp865", + "cp866": { + "type": "_sbcs", + "chars": "ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗â•╜╛â”└┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌â–▀рÑтуфхцчшщъыьÑÑŽÑÐёЄєЇїЎў°∙·√№¤■ " + }, + "ibm866": "cp866", + "csibm866": "cp866", + "cp869": { + "type": "_sbcs", + "chars": "������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Î²³ά£έήίϊÎÏŒÏΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜÎ╣║╗â•ΞΟâ”└┴┬├─┼ΠΡ╚╔╩╦╠â•╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπÏσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ " + }, + "ibm869": "cp869", + "csibm869": "cp869", + "cp922": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£¤¥¦§¨©ª«¬­®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÎÊÑÒÓÔÕÖרÙÚÛÜÃŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ" + }, + "ibm922": "cp922", + "csibm922": "cp922", + "cp1046": { + "type": "_sbcs", + "chars": "ﺈ×÷ﹱˆ■│─â”┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎï»ï»ï»¶ï»¸ï»ºï»¼Â ï£ºï£¹ï£¸Â¤ï£»ïº‹ïº‘ﺗﺛﺟﺣ،­ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـÙقكلمنهوىيًٌÙÙŽÙÙّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ�" + }, + "ibm1046": "cp1046", + "csibm1046": "cp1046", + "cp1124": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ÐЂÒЄЅІЇЈЉЊЋЌ­ЎÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ№ёђґєѕіїјљњћќ§ўџ" + }, + "ibm1124": "cp1124", + "csibm1124": "cp1124", + "cp1125": { + "type": "_sbcs", + "chars": "ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗â•╜╛â”└┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌â–▀рÑтуфхцчшщъыьÑÑŽÑÐÑ‘ÒґЄєІіЇї·√№¤■ " + }, + "ibm1125": "cp1125", + "csibm1125": "cp1125", + "cp1129": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£¤¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÃÂĂÄÅÆÇÈÉÊË̀ÃÃŽÃÄÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêëÌíîïđṇ̃óôơö÷øùúûüư₫ÿ" + }, + "ibm1129": "cp1129", + "csibm1129": "cp1129", + "cp1133": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ àºàº‚ຄງຈສຊàºàº”ຕຖທນບປຜàºàºžàºŸàº¡àº¢àº£àº¥àº§àº«àº­àº®ï¿½ï¿½ï¿½àº¯àº°àº²àº³àº´àºµàº¶àº·àº¸àº¹àº¼àº±àº»àº½ï¿½ï¿½ï¿½à»€à»à»‚ໃໄ່້໊໋໌à»à»†ï¿½à»œà»â‚­ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½à»à»‘໒໓໔໕໖໗໘໙��¢¬¦�" + }, + "ibm1133": "cp1133", + "csibm1133": "cp1133", + "cp1161": { + "type": "_sbcs", + "chars": "��������������������������������่à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºà¹‰à¹Šà¹‹â‚¬à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛¢¬¦ " + }, + "ibm1161": "cp1161", + "csibm1161": "cp1161", + "cp1162": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“â€â€¢â€“—˜™š›œÂžŸ à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛����" + }, + "ibm1162": "cp1162", + "csibm1162": "cp1162", + "cp1163": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ¡¢£€¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÃÂĂÄÅÆÇÈÉÊË̀ÃÃŽÃÄÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêëÌíîïđṇ̃óôơö÷øùúûüư₫ÿ" + }, + "ibm1163": "cp1163", + "csibm1163": "cp1163", + "maccroatian": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑âˆÅ¡âˆ«ÂªÂºâ„¦Å¾Ã¸Â¿Â¡Â¬âˆšÆ’≈ƫȅ ÀÃÕŒœÄ—“â€â€˜â€™Ã·â—Šï¿½Â©â„¤‹›Æ»–·‚„‰ÂćÃÄÈÃÃŽÃÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ" + }, + "maccyrillic": { + "type": "_sbcs", + "chars": "ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“â€â€˜â€™Ã·â€žÐŽÑžÐÑŸâ„–ÐÑ‘ÑабвгдежзийклмнопрÑтуфхцчшщъыьÑю¤" + }, + "macgreek": { + "type": "_sbcs", + "chars": "Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάάΟΡ≈Τ«»… ΥΧΆΈœ–―“â€â€˜â€™Ã·Î‰ÎŠÎŒÎŽÎ­Î®Î¯ÏŒÎÏαβψδεφγηιξκλμνοπώÏστθωςχυζϊϋÎΰ�" + }, + "maciceland": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü𢣧•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑âˆÏ€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’≈∆«»… ÀÃÕŒœ–—“â€â€˜â€™Ã·â—ŠÃ¿Å¸â„¤ÃðÞþý·‚„‰ÂÊÃËÈÃÃŽÃÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸Ë˛ˇ" + }, + "macroman": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑âˆÏ€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’≈∆«»… ÀÃÕŒœ–—“â€â€˜â€™Ã·â—ŠÃ¿Å¸â„¤‹›ï¬ï¬‚‡·‚„‰ÂÊÃËÈÃÃŽÃÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸Ë˛ˇ" + }, + "macromania": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑âˆÏ€âˆ«ÂªÂºâ„¦ÄƒÅŸÂ¿Â¡Â¬âˆšÆ’≈∆«»… ÀÃÕŒœ–—“â€â€˜â€™Ã·â—ŠÃ¿Å¸â„¤‹›Ţţ‡·‚„‰ÂÊÃËÈÃÃŽÃÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸Ë˛ˇ" + }, + "macthai": { + "type": "_sbcs", + "chars": "«»…ï¢ï¢’“â€ï¢™ï¿½â€¢ï¢„ï¢ï¢ï¢“‘’� à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï»¿â€‹â€“—฿เà¹à¹‚ใไๅๆ็่้๊๋์à¹â„¢à¹à¹à¹‘๒๓๔๕๖๗๘๙®©����" + }, + "macturkish": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑âˆÏ€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’≈∆«»… ÀÃÕŒœ–—“â€â€˜â€™Ã·â—ŠÃ¿Å¸ÄžÄŸÄ°Ä±ÅžÅŸâ€¡Â·â€šâ€žâ€°Ã‚ÊÃËÈÃÃŽÃÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸Ë˛ˇ" + }, + "macukraine": { + "type": "_sbcs", + "chars": "ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ò£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“â€â€˜â€™Ã·â€žÐŽÑžÐÑŸâ„–ÐÑ‘ÑабвгдежзийклмнопрÑтуфхцчшщъыьÑю¤" + }, + "koi8r": { + "type": "_sbcs", + "chars": "─│┌â”└┘├┤┬┴┼▀▄█▌â–░▒▓⌠■∙√≈≤≥ ⌡°²·÷â•║╒ё╓╔╕╖╗╘╙╚╛╜â•╞╟╠╡Ð╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопÑÑ€ÑтужвьызшÑщчъЮÐБЦДЕФГХИЙКЛМÐОПЯРСТУЖВЬЫЗШЭЩЧЪ" + }, + "koi8u": { + "type": "_sbcs", + "chars": "─│┌â”└┘├┤┬┴┼▀▄█▌â–░▒▓⌠■∙√≈≤≥ ⌡°²·÷â•║╒ёє╔ії╗╘╙╚╛ґâ•╞╟╠╡ÐЄ╣ІЇ╦╧╨╩╪Ò╬©юабцдефгхийклмнопÑÑ€ÑтужвьызшÑщчъЮÐБЦДЕФГХИЙКЛМÐОПЯРСТУЖВЬЫЗШЭЩЧЪ" + }, + "koi8ru": { + "type": "_sbcs", + "chars": "─│┌â”└┘├┤┬┴┼▀▄█▌â–░▒▓⌠■∙√≈≤≥ ⌡°²·÷â•║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ÐЄ╣ІЇ╦╧╨╩╪ÒЎ©юабцдефгхийклмнопÑÑ€ÑтужвьызшÑщчъЮÐБЦДЕФГХИЙКЛМÐОПЯРСТУЖВЬЫЗШЭЩЧЪ" + }, + "koi8t": { + "type": "_sbcs", + "chars": "қғ‚Ғ„…†‡�‰ҳ‹ҲҷҶ�Қ‘’“â€â€¢â€“—�™�›�����ӯӮё¤ӣ¦§���«¬­®�°±²Ð�Ӣ¶·�№�»���©юабцдефгхийклмнопÑÑ€ÑтужвьызшÑщчъЮÐБЦДЕФГХИЙКЛМÐОПЯРСТУЖВЬЫЗШЭЩЧЪ" + }, + "armscii8": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ �և։)(»«—.Õ,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհÕձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռÕÕ½ÕŽÕ¾ÕÕ¿ÕÖ€Õ‘ÖՒւՓփՔքՕօՖֆ՚�" + }, + "rk1048": { + "type": "_sbcs", + "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺÐђ‘’“â€â€¢â€“—�™љ›њқһџ ҰұӘ¤Ө¦§Ð©Ғ«¬­®Ү°±Ііөµ¶·ё№ғ»әҢңүÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ" + }, + "tcvn": { + "type": "_sbcs", + "chars": "\u0000ÚỤ\u0003ỪỬỮ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010ỨỰỲỶỸÃá»´\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÀẢÃÃẠẶẬÈẺẼÉẸỆÌỈĨÃỊÒỎÕÓỌỘỜỞỠỚỢÙỦŨ ĂÂÊÔƠƯÄăâêôơưđẰ̀̉̃Ị̀àảãáạẲằẳẵắẴẮẦẨẪẤỀặầẩẫấậèỂẻẽéẹá»á»ƒá»…ếệìỉỄẾỒĩíịòỔá»ÃµÃ³á»á»“ổỗốộá»á»Ÿá»¡á»›á»£Ã¹á»–ủũúụừửữứựỳỷỹýỵá»" + }, + "georgianacademy": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“â€â€¢â€“—˜™š›œÂžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿áƒáƒ‘გდევზთიკლმნáƒáƒžáƒŸáƒ áƒ¡áƒ¢áƒ£áƒ¤áƒ¥áƒ¦áƒ§áƒ¨áƒ©áƒªáƒ«áƒ¬áƒ­áƒ®áƒ¯áƒ°áƒ±áƒ²áƒ³áƒ´áƒµáƒ¶Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ã°Ã±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ã½Ã¾Ã¿" + }, + "georgianps": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“â€â€¢â€“—˜™š›œÂžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿áƒáƒ‘გდევზჱთიკლმნჲáƒáƒžáƒŸáƒ áƒ¡áƒ¢áƒ³áƒ£áƒ¤áƒ¥áƒ¦áƒ§áƒ¨áƒ©áƒªáƒ«áƒ¬áƒ­áƒ®áƒ´áƒ¯áƒ°áƒµÃ¦Ã§Ã¨Ã©ÃªÃ«Ã¬Ã­Ã®Ã¯Ã°Ã±Ã²Ã³Ã´ÃµÃ¶Ã·Ã¸Ã¹ÃºÃ»Ã¼Ã½Ã¾Ã¿" + }, + "pt154": { + "type": "_sbcs", + "chars": "ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“â€â€¢â€“—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ð©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫÒÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ" + }, + "viscii": { + "type": "_sbcs", + "chars": "\u0000\u0001Ẳ\u0003\u0004ẴẪ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013á»¶\u0015\u0016\u0017\u0018Ỹ\u001a\u001b\u001c\u001dá»´\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ẠẮẰẶẤẦẨẬẼẸẾỀỂỄỆá»á»’ỔỖỘỢỚỜỞỊỎỌỈỦŨỤỲÕắằặấầẩậẽẹếá»á»ƒá»…ệốồổỗỠƠộá»á»Ÿá»‹á»°á»¨á»ªá»¬Æ¡á»›Æ¯Ã€ÃÂÃẢĂẳẵÈÉÊẺÌÃĨỳÄứÒÓÔạỷừửÙÚỹỵÃỡưàáâãảăữẫèéêẻìíĩỉđựòóôõá»á»á»¥Ã¹ÃºÅ©á»§Ã½á»£á»®" + }, + "iso646cn": { + "type": "_sbcs", + "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#Â¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������" + }, + "iso646jp": { + "type": "_sbcs", + "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[Â¥]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������" + }, + "hproman8": { + "type": "_sbcs", + "chars": "€Â‚ƒ„…†‡ˆ‰Š‹ŒÂŽ‘’“”•–—˜™š›œÂžŸ ÀÂÈÊËÎôˋˆ¨˜ÙÛ₤¯Ãý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÃÃãÃðÃÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±�" + }, + "macintosh": { + "type": "_sbcs", + "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑âˆÏ€âˆ«ÂªÂºâ„¦Ã¦Ã¸Â¿Â¡Â¬âˆšÆ’≈∆«»… ÀÃÕŒœ–—“â€â€˜â€™Ã·â—ŠÃ¿Å¸â„¤‹›ï¬ï¬‚‡·‚„‰ÂÊÃËÈÃÃŽÃÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸Ë˛ˇ" + }, + "ascii": { + "type": "_sbcs", + "chars": "��������������������������������������������������������������������������������������������������������������������������������" + }, + "tis620": { + "type": "_sbcs", + "chars": "���������������������������������à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºï¿½ï¿½ï¿½ï¿½à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛����" + } +} \ No newline at end of file diff --git a/node_modules/iconv-lite/encodings/sbcs-data.js b/node_modules/iconv-lite/encodings/sbcs-data.js new file mode 100644 index 00000000..fdb81a39 --- /dev/null +++ b/node_modules/iconv-lite/encodings/sbcs-data.js @@ -0,0 +1,174 @@ +"use strict"; + +// Manually added data to be used by sbcs codec in addition to generated one. + +module.exports = { + // Not supported by iconv, not sure why. + "10029": "maccenteuro", + "maccenteuro": { + "type": "_sbcs", + "chars": "ÄĀÄÉĄÖÜáąČäÄĆć鏟ĎíÄĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňÅÕőŌ–—“â€â€˜â€™Ã·â—ŠÅŔŕŘ‹›řŖŗŠ‚„šŚśÃŤťÃŽžŪÓÔūŮÚůŰűŲųÃýķŻÅżĢˇ" + }, + + "808": "cp808", + "ibm808": "cp808", + "cp808": { + "type": "_sbcs", + "chars": "ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗â•╜╛â”└┴┬├─┼╞╟╚╔╩╦╠â•╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌â–▀рÑтуфхцчшщъыьÑÑŽÑÐёЄєЇїЎў°∙·√№€■ " + }, + + "mik": { + "type": "_sbcs", + "chars": "ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ└┴┬├─┼╣║╚╔╩╦╠â•╬â”░▒▓│┤№§╗â•┘┌█▄▌â–▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√â¿Â²â– Â " + }, + + // Aliases of generated encodings. + "ascii8bit": "ascii", + "usascii": "ascii", + "ansix34": "ascii", + "ansix341968": "ascii", + "ansix341986": "ascii", + "csascii": "ascii", + "cp367": "ascii", + "ibm367": "ascii", + "isoir6": "ascii", + "iso646us": "ascii", + "iso646irv": "ascii", + "us": "ascii", + + "latin1": "iso88591", + "latin2": "iso88592", + "latin3": "iso88593", + "latin4": "iso88594", + "latin5": "iso88599", + "latin6": "iso885910", + "latin7": "iso885913", + "latin8": "iso885914", + "latin9": "iso885915", + "latin10": "iso885916", + + "csisolatin1": "iso88591", + "csisolatin2": "iso88592", + "csisolatin3": "iso88593", + "csisolatin4": "iso88594", + "csisolatincyrillic": "iso88595", + "csisolatinarabic": "iso88596", + "csisolatingreek" : "iso88597", + "csisolatinhebrew": "iso88598", + "csisolatin5": "iso88599", + "csisolatin6": "iso885910", + + "l1": "iso88591", + "l2": "iso88592", + "l3": "iso88593", + "l4": "iso88594", + "l5": "iso88599", + "l6": "iso885910", + "l7": "iso885913", + "l8": "iso885914", + "l9": "iso885915", + "l10": "iso885916", + + "isoir14": "iso646jp", + "isoir57": "iso646cn", + "isoir100": "iso88591", + "isoir101": "iso88592", + "isoir109": "iso88593", + "isoir110": "iso88594", + "isoir144": "iso88595", + "isoir127": "iso88596", + "isoir126": "iso88597", + "isoir138": "iso88598", + "isoir148": "iso88599", + "isoir157": "iso885910", + "isoir166": "tis620", + "isoir179": "iso885913", + "isoir199": "iso885914", + "isoir203": "iso885915", + "isoir226": "iso885916", + + "cp819": "iso88591", + "ibm819": "iso88591", + + "cyrillic": "iso88595", + + "arabic": "iso88596", + "arabic8": "iso88596", + "ecma114": "iso88596", + "asmo708": "iso88596", + + "greek" : "iso88597", + "greek8" : "iso88597", + "ecma118" : "iso88597", + "elot928" : "iso88597", + + "hebrew": "iso88598", + "hebrew8": "iso88598", + + "turkish": "iso88599", + "turkish8": "iso88599", + + "thai": "iso885911", + "thai8": "iso885911", + + "celtic": "iso885914", + "celtic8": "iso885914", + "isoceltic": "iso885914", + + "tis6200": "tis620", + "tis62025291": "tis620", + "tis62025330": "tis620", + + "10000": "macroman", + "10006": "macgreek", + "10007": "maccyrillic", + "10079": "maciceland", + "10081": "macturkish", + + "cspc8codepage437": "cp437", + "cspc775baltic": "cp775", + "cspc850multilingual": "cp850", + "cspcp852": "cp852", + "cspc862latinhebrew": "cp862", + "cpgr": "cp869", + + "msee": "cp1250", + "mscyrl": "cp1251", + "msansi": "cp1252", + "msgreek": "cp1253", + "msturk": "cp1254", + "mshebr": "cp1255", + "msarab": "cp1256", + "winbaltrim": "cp1257", + + "cp20866": "koi8r", + "20866": "koi8r", + "ibm878": "koi8r", + "cskoi8r": "koi8r", + + "cp21866": "koi8u", + "21866": "koi8u", + "ibm1168": "koi8u", + + "strk10482002": "rk1048", + + "tcvn5712": "tcvn", + "tcvn57121": "tcvn", + + "gb198880": "iso646cn", + "cn": "iso646cn", + + "csiso14jisc6220ro": "iso646jp", + "jisc62201969ro": "iso646jp", + "jp": "iso646jp", + + "cshproman8": "hproman8", + "r8": "hproman8", + "roman8": "hproman8", + "xroman8": "hproman8", + "ibm1051": "hproman8", + + "mac": "macintosh", + "csmacintosh": "macintosh", +}; + diff --git a/node_modules/iconv-lite/encodings/tables/big5-added.json b/node_modules/iconv-lite/encodings/tables/big5-added.json new file mode 100644 index 00000000..3c3d3c2f --- /dev/null +++ b/node_modules/iconv-lite/encodings/tables/big5-added.json @@ -0,0 +1,122 @@ +[ +["8740","ä°ä°²ä˜ƒä–¦ä•¸ð§‰§äµ·ä–³ð§²±ä³¢ð§³…㮕䜶ä„䱇䱀𤊿𣘗ð§’𦺋𧃒䱗ðª‘ä䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡æ™å›»"], +["8767","ç¶•å¤ð¨®¹ã·´éœ´ð§¯¯å¯›ð¡µžåª¤ã˜¥ð©º°å«‘å®·å³¼æ®è–“ð©¥…ç‘¡ç’㡵𡵓𣚞𦀡㻬"], +["87a1","𥣞㫵竼龗𤅡ð¨¤ð£‡ªð ªŠð£‰žäŒŠè’„é¾–é¯ä¤°è˜“墖éŠéˆ˜ç§ç¨²æ™ æ¨©è¢ç‘Œç¯…枂稬å‰é†ã“¦ç„𥶹瓆鿇垳䤯呌䄱𣚎堘穲𧭥è®äš®ð¦ºˆä†ð¥¶™ç®®ð¢’¼é¿ˆð¢“𢓉𢓌鿉蔄𣖻䂴鿊䓡𪷿æ‹ç®é¿‹"], +["8840","㇀",4,"𠄌㇅𠃑ð ƒã‡†ã‡‡ð ƒ‹ð¡¿¨ã‡ˆð ƒŠã‡‰ã‡Šã‡‹ã‡Œð „Žã‡ã‡ŽÄ€ÃÇÀĒÉĚÈŌÓǑÒ࿿Ê̄Ế࿿Ê̌ỀÊÄáǎàɑēéěèīíÇìÅóǒòūúǔùǖǘǚ"], +["88a1","ǜü࿿ê̄ế࿿ê̌á»ÃªÉ¡âšâ›"], +["8940","𪎩𡅅"], +["8943","攊"], +["8946","丽æ»éµŽé‡Ÿ"], +["894c","𧜵撑会伨侨兖兴农凤务动医åŽå‘å˜å›¢å£°å¤„备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织ç»ç»Ÿç¼†ç¼·è‰ºè‹è¯è§†è®¾è¯¢è½¦è½§è½®"], +["89a1","ç‘ç³¼ç·æ¥†ç«‰åˆ§"], +["89ab","醌碸酞肼"], +["89b0","贋胶𠧧"], +["89b5","肟黇ä³é·‰é¸Œä°¾ð©·¶ð§€Žé¸Šðª„³ã—"], +["89c1","溚舾甙"], +["89c5","䤑马éªé¾™ç¦‡ð¨‘¬ð¡·Šð —𢫦两äºäº€äº‡äº¿ä»«ä¼·ã‘Œä¾½ã¹ˆå€ƒå‚ˆã‘½ã’“㒥円夅凛凼刅争剹åŠåŒ§ã—‡åŽ©ã•‘åŽ°ã•“å‚å£ã•­ã•²ãšå’“咣咴咹å“哯唘唣唨㖘唿㖥㖿嗗㗅"], +["8a40","𧶄唥"], +["8a43","𠱂𠴕𥄫å–𢳆㧬ð è¹†ð¤¶¸ð©“¥ä“𨂾çºð¢°¸ã¨´äŸ•ð¨…𦧲𤷪æ“𠵼𠾴𠳕𡃴æ’蹾𠺖𠰋𠽤𢲩𨉖𤓓"], +["8a64","𠵆ð©©ð¨ƒ©äŸ´ð¤º§ð¢³‚骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕"], +["8a76","ä™ð¦‚¥æ’´å“£ð¢µŒð¢¯Šð¡·ã§»ð¡¯"], +["8aa1","𦛚𦜖𧦠擪ð¥’𠱃蹨𢆡𨭌𠜱"], +["8aac","䠋𠆩㿺塳ð¢¶"], +["8ab2","𤗈𠓼𦂗𠽌𠶖啹䂻䎺"], +["8abb","䪴𢩦ð¡‚膪飵𠶜æ¹ã§¾ð¢µè·€å𡿑¼ã¹ƒ"], +["8ac9","ðª˜ð ¸‰ð¢«ð¢³‰"], +["8ace","𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻"], +["8adf","𧕴𢺋𢈈𪙛ð¨³ð ¹ºð °´ð¦ œç¾“ð¡ƒð¢ ƒð¢¤¹ã—»ð¥‡£ð ºŒð ¾ð ºªã¾“𠼰𠵇ð¡…𠹌"], +["8af6","𠺫𠮩𠵈𡃀𡄽㿹𢚖æ²ð ¾­"], +["8b40","ð£´ð§˜¹ð¢¯Žð µ¾ð µ¿ð¢±‘𢱕㨘𠺘𡃇𠼮𪘲ð¦­ð¨³’𨶙𨳊閪哌苄喹"], +["8b55","𩻃鰦骶ð§žð¢·®ç…€è…­èƒ¬å°œð¦•²è„´ãž—åŸð¨‚½é†¶ð »ºð ¸ð ¹·ð »»ã—𤷫㘉𠳖嚯𢞵𡃉ð ¸ð ¹¸ð¡¸ð¡…ˆð¨ˆ‡ð¡‘•ð ¹¹ð¤¹ð¢¶¤å©”ð¡€ð¡€žð¡ƒµð¡ƒ¶åžœð ¸‘"], +["8ba1","ð§š”ð¨‹ð ¾µð ¹»ð¥…¾ãœƒð ¾¶ð¡†€ð¥‹˜ðªŠ½ð¤§šð¡ ºð¤…·ð¨‰¼å¢™å‰¨ã˜šð¥œ½ç®²å­¨ä €ä¬¬é¼§ä§§é°Ÿé®ð¥­´ð£„½å—»ã—²åš‰ä¸¨å¤‚ð¡¯ð¯¡¸é‘𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺ç¬çˆ«ä¸¬çŠ­ð¤£©ç½’ç¤»ç³¹ç½“ð¦‰ªã“"], +["8bde","ð¦‹è€‚肀𦘒𦥑å衤è§ð§¢²è® è´é’…镸长门ð¨¸éŸ¦é¡µé£Žé£žé¥£ð© é±¼é¸Ÿé»„æ­¯ï¤‡ä¸·ð ‚‡é˜æˆ·é’¢"], +["8c40","倻淾𩱳龦㷉è¢ð¤…Žç·å³µä¬ ð¥‡ã•™ð¥´°æ„¢ð¨¨²è¾§é‡¶ç†‘朙玺ð£Šðª„‡ã²‹ð¡¦€ä¬ç£¤ç‚冮ð¨œä€‰æ©£ðªŠºäˆ£è˜ð ©¯ç¨ªð©¥‡ð¨«ªé•ç匤ð¢¾é´ç›™ð¨§£é¾§çŸäº£ä¿°å‚¼ä¸¯ä¼—龨å´ç¶‹å¢’å£ð¡¶¶åº’庙忂𢜒斋"], +["8ca1","ð£¹æ¤™æ©ƒð£±£æ³¿"], +["8ca7","爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩è¢é¾ªèº¹é¾«è¿è•Ÿé§ éˆ¡é¾¬ð¨¶¹ð¡¿ä±äŠ¢å¨š"], +["8cc9","顨æ«ä‰¶åœ½"], +["8cce","藖𤥻芿ð§„ä²ð¦µ´åµ»ð¦¬•𦾾龭龮宖龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶"], +["8ce6","峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤ð¦±è«Œä¾´ð ˆ¹å¦¿è…¬é¡–𩣺弻"], +["8d40","𠮟"], +["8d42","ð¢‡ð¨¥­ä„‚äš»ð©¹ã¼‡é¾³ðª†µäƒ¸ãŸ–䛷𦱆䅼𨚲ð§¿ä•­ã£”𥒚䕡䔛䶉䱻䵶䗪㿈ð¤¬ã™¡ä“žä’½ä‡­å´¾åµˆåµ–ã·¼ã å¶¤å¶¹ã  ã ¸å¹‚åº½å¼¥å¾ƒã¤ˆã¤”ã¤¿ã¥æƒ—愽峥㦉憷憹æ‡ã¦¸æˆ¬æŠæ‹¥æŒ˜ã§¸åš±"], +["8da1","ã¨ƒæ¢æ»æ‡æ‘šã©‹æ“€å´•å˜¡é¾Ÿãª—æ–†ãª½æ—¿æ™“ã«²æš’ã¬¢æœ–ã­‚æž¤æ €ã­˜æ¡Šæ¢„ã­²ã­±ã­»æ¤‰æ¥ƒç‰œæ¥¤æ¦Ÿæ¦…ã®¼æ§–ã¯æ©¥æ©´æ©±æª‚ã¯¬æª™ã¯²æª«æªµæ«”æ«¶æ®æ¯æ¯ªæ±µæ²ªã³‹æ´‚洆洦æ¶ã³¯æ¶¤æ¶±æ¸•æ¸˜æ¸©æº†ð¨§€æº»æ»¢æ»šé½¿æ»¨æ»©æ¼¤æ¼´ãµ†ð£½æ¾æ¾¾ãµªãµµç†·å²™ã¶Šç€¬ã¶‘çç”ç¯ç¿ç‚‰ð Œ¥ä㗱𠻘"], +["8e40","𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑ð¦’䇊竚ç«ç«ªä‡¯å’²ð¥°ç¬‹ç­•笩𥌎𥳾箢筯莜𥮴𦱿ç¯è¡ç®’箸𥴠㶭𥱥蒒篺簆簵ð¥³ç±„粃𤢂粦晽𤕸糉糇糦籴糳糵糎"], +["8ea1","ç¹§ä”𦹄çµð¦»–ç’綉綫焵綳緒ð¤—𦀩緤㴓緵𡟹緥ð¨­ç¸ð¦„¡ð¦…šç¹®çº’䌫鑬縧罀ç½ç½‡ç¤¶ð¦‹é§¡ç¾—ð¦‘羣𡙡ð ¨ä•œð£¦ä”ƒð¨Œºç¿ºð¦’‰è€…耈è€è€¨è€¯ðª‚‡ð¦³ƒè€»è€¼è¡ð¢œ”䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩ð ¬ð¦©’𣵾俹𡓽蓢è¢ð¦¬Šð¤¦§ð£”°ð¡³ð£·¸èŠªæ¤›ð¯¦”ä‡›"], +["8f40","è•‹è‹èŒšð ¸–𡞴ã›ð£…½ð£•šè‰»è‹¢èŒ˜ð£º‹ð¦¶£ð¦¬…𦮗𣗎㶿èŒå—¬èŽ…ä”‹ð¦¶¥èŽ¬èè“㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘蒨𦮖𦹷𦹃蓞è莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖"], +["8fa1","𨘥𨘻è—𧂈蘂𡖂ð§ƒð¯¦²ä•ªè˜¨ã™ˆð¡¢¢å·ð§Žšè™¾è±ðªƒ¸èŸ®ð¢°§èž±èŸšè å™¡è™¬æ¡–ä˜è¡…衆𧗠𣶹𧗤衞袜䙛袴袵æè£…ç·ð§œè¦‡è¦Šè¦¦è¦©è¦§è¦¼ð¨¨¥è§§ð§¤¤ð§ª½èªœçž“釾èªð§©™ç«©ð§¬ºð£¾äœ“𧬸煼謌謟ð¥°ð¥•¥è¬¿è­Œè­èª©ð¤©ºè®è®›èª¯ð¡›Ÿä˜•è¡è²›ð§µ”ð§¶ð¯§”㜥𧵓賖𧶘𧶽贒贃ð¡¤è³›çœè´‘𤳉ã»èµ·"], +["9040","趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭ð¨¥ð¨’辥錃𪊟ð ©è¾³ä¤ªð¨§žð¨”½ð£¶»å»¸ð£‰¢è¿¹ðª€”𨚼ð¨”𢌥㦀𦻗逷𨔼𧪾é¡ð¨•¬ð¨˜‹é‚¨ð¨œ“郄𨛦邮都酧㫰醩釄粬𨤳𡺉鈎沟é‰é‰¢ð¥–¹éŠ¹ð¨«†ð£²›ð¨¬Œð¥—›"], +["90a1","𠴱錬é«ð¨«¡ð¨¯«ç‚嫃𨫢𨫥䥥鉄𨯬𨰹𨯿é³é‘›èº¼é–…é–¦é¦é– æ¿¶äŠ¹ð¢™ºð¨›˜ð¡‰¼ð£¸®ä§Ÿæ°œé™»éš–ä…¬éš£ð¦»•æ‡šéš¶ç£µð¨« éš½åŒä¦¡ð¦²¸ð ‰´ð¦ð©‚¯ð©ƒ¥ð¤«‘𡤕𣌊霱虂霶ä¨ä”½ä–…𤫩çµå­éœ›éœð©‡•é—孊𩇫éŸé¥åƒð£‚·ð£‚¼éž‰éžŸéž±éž¾éŸ€éŸ’韠𥑬韮çœð©³éŸ¿éŸµð©ð§¥ºä«‘頴頳顋顦㬎𧅵㵑𠘰𤅜"], +["9140","𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬é¸é¤¹ð¤¨©ä­²ð©¡—𩤅駵騌騻é¨é©˜ð¥œ¥ã›„𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃ð£½é­é­€ð©´¾å©…𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈"], +["91a1","鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴éºéº•麞麢䴴麪麯ð¤¤é»ã­ ã§¥ã´ä¼²ãž¾ð¨°«é¼‚鼈䮖é¤ð¦¶¢é¼—鼖鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸ð¤ˆð¤©‘玞𨯚𡣺禟𨥾𨸶é©é³ð¨©„鋬éŽé‹ð¨¥¬ð¤’¹çˆ—㻫ç²ç©ƒçƒð¤‘³ð¤¸ç…¾ð¡Ÿ¯ç‚£ð¡¢¾ð£–™ã»‡ð¡¢…ð¥¯ð¡Ÿ¸ãœ¢ð¡›»ð¡ ¹ã›¡ð¡´ð¡£‘𥽋㜣𡛀å›ð¤¨¥ð¡¾ð¡Š¨"], +["9240","ð¡†ð¡’¶è”ƒð£š¦è”ƒè‘•𤦔𧅥𣸱𥕜𣻻ð§’䓴𣛮ð©¦ð¦¼¦æŸ¹ãœ³ã°•㷧塬𡤢æ ä—𣜿𤃡𤂋ð¤„𦰡哋嚞𦚱嚒𠿟𠮨ð ¸é†ð¨¬“鎜仸儫㠙ð¤¶äº¼ð ‘¥ð ¿ä½‹ä¾Šð¥™‘婨𠆫ð ‹ã¦™ð ŒŠð ”ãµä¼©ð ‹€ð¨º³ð ‰µè«šð ˆŒäº˜"], +["92a1","åƒå„侢伃𤨎𣺊佂倮å¬å‚俌俥å˜åƒ¼å…™å…›å…兞湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠ä“𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡é®ä™ºç†Œð¤ŽŒð ° ð¤¦¬ð¡ƒ¤æ§‘ð ¸ç‘¹ã»žç’™ç”瑖玘䮎𤪼ð¤‚åã–„çˆð¤ƒ‰å–´ð …å“𠯆åœé‰é›´é¦åŸåžå¿ã˜¾å£‹åª™ð¨©†ð¡›ºð¡¯ð¡œå¨¬å¦¸éŠå©¾å«å¨’𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃"], +["9340","åªð¨¯—ð “é ç’Œð¡Œƒç„…䥲éˆð¨§»éŽ½ãž å°žå²žå¹žå¹ˆð¡¦–ð¡¥¼ð£«®å»å­ð¡¤ƒð¡¤„ãœð¡¢ ã›ð¡›¾ã›“脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠æ¾ð¢¡ ð¢˜«å¿›ãº¸ð¢–¯ð¢–¾ð©‚ˆð¦½³æ‡€ð €¾ð †ð¢˜›æ†™æ†˜æµð¢²›ð¢´‡ð¤›”ð©…"], +["93a1","摱𤙥𢭪㨩𢬢ð£‘𩣪𢹸挷𪑛撶挱æ‘ð¤§£ð¢µ§æŠ¤ð¢²¡æ»æ•«æ¥²ã¯´ð£‚Žð£Š­ð¤¦‰ð£Š«å”ð£‹ ð¡£™ð©¿æ›Žð£Š‰ð£†³ã« ä†ð¥–„𨬢ð¥–𡛼𥕛ð¥¥ç£®ð£„ƒð¡ ªð£ˆ´ã‘¤ð£ˆð£†‚𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢ð£¾ç“ã®–æžð¤˜ªæ¢¶æ žã¯„檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋"], +["9440","éŠ‰ð¨€žð¨§œé‘§æ¶¥æ¼‹ð¤§¬æµ§ð£½¿ã¶æ¸„𤀼娽渊塇洤硂焻𤌚𤉶烱ç‰çŠ‡çŠ”ð¤žð¤œ¥å…¹ð¤ª¤ð —«ç‘ºð£»¸ð£™Ÿð¤©Šð¤¤—𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌ç¼éއç·ä’Ÿð¦·ªä•‘疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻"], +["94a1","ã·ð¤©Žã»¿ð¤§…𤣳釺圲é‚𨫣𡡤僟𥈡𥇧ç¸ð£ˆ²çœŽçœç»ð¤š—ð£žã©žð¤£°ç¸ç’›ãº¿ð¤ªºð¤«‡äƒˆð¤ª–𦆮錇ð¥–ç žç¢ç¢ˆç£’ç祙ð§ð¥›£ä„Žç¦›è’–禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺ð¡®ã–—啫㕰㚪𠇔ð °ç«¢å©™ð¢›µð¥ª¯ð¥ªœå¨ð ‰›ç£°å¨ªð¥¯†ç«¾ä‡¹ç±ç±­äˆ‘𥮳𥺼𥺦ç³ð¤§¹ð¡ž°ç²Žç±¼ç²®æª²ç·œç¸‡ç·“罎𦉡"], +["9540","𦅜𧭈綗𥺂䉪𦭵𠤖柖ð Žð£—埄ð¦’ð¦¸ð¤¥¢ç¿ç¬§ð  ¬ð¥«©ð¥µƒç¬Œð¥¸Žé§¦è™…驣樜ð£¿ã§¢ð¤§·ð¦–­é¨Ÿð¦– è’€ð§„§ð¦³‘䓪脷ä‚胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧è˜ð§ˆ›åª†ä…¿ð¡¡€å¬«ð¡¢¡å«¤ð¡£˜èš ð¯¦¼ð£¶è ­ð§¢å¨‚"], +["95a1","衮佅袇袿裦襥è¥ð¥šƒè¥”𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵ä›ãŸ²è¨½è¨œð©‘ˆå½éˆ«ð¤Š„旔焩烄𡡅鵭貟賩𧷜妚矃姰ä®ã›”踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻邗啱䤆醻é„𨩋ä¢ð¨«¼é§ð¨°ð¨°»è“¥è¨«é–™é–§é–—閖𨴴瑅㻂𤣿𤩂ð¤ªã»§ð£ˆ¥éšð¨»§ð¨¹¦ð¨¹¥ã»Œð¤§­ð¤©¸ð£¿®ç’瑫㻼éð©‚°"], +["9640","桇ä¨ð©‚“𥟟éé¨ð¨¦‰ð¨°¦ð¨¬¯ð¦Ž¾éŠºå¬‘è­©ä¤¼ç¹ð¤ˆ›éž›é±é¤¸ð ¼¦å·ð¨¯…𤪲頟𩓚鋶𩗗釥䓀ð¨­ð¤©§ð¨­¤é£œð¨©…㼀鈪䤥è”餻é¥ð§¬†ã·½é¦›ä­¯é¦ªé©œð¨­¥ð¥£ˆæªé¨¡å«¾é¨¯ð©£±ä®ð©¥ˆé¦¼ä®½ä®—é½å¡²ð¡Œ‚堢𤦸"], +["96a1","𡓨硄𢜟𣶸棅㵽鑘㤧æ…ð¢žð¢¥«æ„‡é±é±“鱻鰵é°é­¿é¯ð©¸­é®Ÿðª‡µðªƒ¾é´¡ä²®ð¤„„鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰è è—®ð¦¸€ð£Ÿ—ð¦¤ç§¢ð£–œð£™€ä¤­ð¤§žãµ¢é›éоéˆð Š¿ç¢¹é‰·é‘俤㑀é¤ð¥•砽硔碶硋ð¡—𣇉ð¤¥ãššä½²æ¿šæ¿™ç€žç€žå”𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗嬨𡞵𨩉"], +["9740","愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖ð ¼è‘²ð¦³€ð¡“𤋺𢰦ð¤å¦”𣶷ð¦ç¶¨ð¦…›ð¦‚¤ð¤¦¹ð¤¦‹ð¨§ºé‹¥ç¢ã»©ç’´ð¨­£ð¡¢Ÿã»¡ð¤ª³æ«˜ç³ç»ã»–𤨾𤪔𡟙𤩦𠎧ð¡¤ð¤§¥ç‘ˆð¤¤–炥𤥶銄ç¦éŸð “¾éŒ±ð¨«Žð¨¨–鎆𨯧𥗕䤵𨪂煫"], +["97a1","𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂ð¤©ð¡¡’ä”®é㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹ð¨ªð¡¡¢é´ã³ð ª´äª–㦊僴㵩㵌𡎜煵䋻𨈘æ¸ð©ƒ¤ä“«æµ—ð§¹ç§æ²¯ã³–𣿭𣸭渂漌㵯ð µç•‘㚼㓈䚀㻚䡱姄鉮䤾è½ð¨°œð¦¯€å ’埈㛖𡑒烾ð¤¢ð¤©±ð¢¿£ð¡Š°ð¢Ž½æ¢¹æ¥§ð¡Ž˜ð£“¥ð§¯´ð£›Ÿð¨ªƒð£Ÿ–ð£ºð¤²Ÿæ¨šð£š­ð¦²·è¾ä“Ÿä“Ž"], +["9840","𦴦𦵑𦲂𦿞漗𧄉茽𡜺è­ð¦²€ð§“ð¡Ÿ›å¦‰åª‚ð¡ž³å©¡å©±ð¡¤…ð¤‡¼ãœ­å§¯ð¡œ¼ã›‡ç†ŽéŽæššð¤Š¥å©®å¨«ð¤Š“樫𣻹𧜶𤑛𤋊ç„𤉙𨧡侰𦴨峂𤓎ð§¹ð¤Ž½æ¨Œð¤‰–𡌄炦焳ð¤©ã¶¥æ³Ÿð¯ ¥ð¤©ç¹¥å§«å´¯ã·³å½œð¤©ð¡ŸŸç¶¤è¦"], +["98a1","咅𣫺𣌀𠈔å¾ð £•𠘙㿥𡾞𪊶瀃𩅛嵰çŽç³“𨩙ð© ä¿ˆç¿§ç‹çŒð§«´çŒ¸çŒ¹ð¥›¶ççˆãº©ð§¬˜é¬ç‡µð¤£²ç¡è‡¶ã»ŠçœŒã»‘沢国ç™çžçŸã»¢ã»°ã»´ã»ºç““㼎㽓畂畭畲ç–㽼痈痜㿀ç™ã¿—癴㿜発𤽜熈嘣覀塩ä€çƒä€¹æ¡ä…㗛瞘äªä¯å±žçž¾çŸ‹å£²ç ˜ç‚¹ç œä‚¨ç ¹ç¡‡ç¡‘硦葈𥔵礳栃礲䄃"], +["9940","䄉禑禙辻稆込䅧窑䆲窼艹䇄ç«ç«›ä‡ä¸¡ç­¢ç­¬ç­»ç°’簛䉠䉺类粜䊌粸䊔糭输烀ð ³ç·ç·”ç·ç·½ç¾®ç¾´çŠŸäŽ—è€ è€¥ç¬¹è€®è€±è”㷌垴炠肷胩ä­è„ŒçŒªè„Žè„’ç• è„”ä㬹腖腙腚"], +["99a1","ä“堺腼膄ä¥è†“ä­è†¥åŸ¯è‡è‡¤è‰”ä’芦艶苊苘苿䒰è—险榊è…烵葤惣蒈䔄蒾蓡蓸è”蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘å”蹱嗵躰䠷軎転軤軭軲辷è¿è¿Šè¿Œé€³é§„䢭飠鈓䤞鈨鉘鉫銱銮銿"], +["9a40","鋣鋫鋳鋴鋽éƒéŽ„éŽ­ä¥…ä¥‘éº¿é—åŒéé­é¾ä¥ªé‘”鑹锭関䦧间阳䧥枠䨤é€ä¨µéž²éŸ‚噔䫤惨颹䬙飱塄餎餙冴餜餷饂é¥é¥¢ä­°é§…ä®é¨¼é¬çªƒé­©é®é¯é¯±é¯´ä±­é° ã¯ð¡¯‚鵉鰺"], +["9aa1","黾å™é¶“鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀é“㞹𠗕𠘕𠙶𡚺å—煳𠫂ð «ð ®¿å‘ªð¯ »ð ¯‹å’žð ¯»ð °»ð ±“𠱥𠱼惧ð ²å™ºð ²µð ³ð ³­ð µ¯ð ¶²ð ·ˆæ¥•鰯螥𠸄𠸎𠻗ð ¾ð ¼­ð ¹³å° ð ¾¼å¸‹ð¡œð¡ð¡¶æœžð¡»ð¡‚ˆð¡‚–㙇𡂿𡃓𡄯𡄻å¤è’­ð¡‹£ð¡µð¡Œ¶è®ð¡•·ð¡˜™ð¡Ÿƒð¡Ÿ‡ä¹¸ç‚»ð¡ ­ð¡¥ª"], +["9b40","ð¡¨­ð¡©…ð¡°ªð¡±°ð¡²¬ð¡»ˆæ‹ƒð¡»•ð¡¼•ç†˜æ¡•ð¢…æ§©ã›ˆð¢‰¼ð¢—ð¢ºð¢œªð¢¡±ð¢¥è‹½ð¢¥§ð¢¦“𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌"], +["9b62","𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳ð£¦ð£ŒŸð£žå¾±æ™ˆæš¿ð§©¹ð£•§ð£—³çˆð¤¦ºçŸ—𣘚𣜖纇ð †å¢µæœŽ"], +["9ba1","椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚ä£äª¸ð¤„™ð¨ªšð¤‹®ð¤Œð¤€»ð¤Œ´ð¤Ž–𤩅𠗊凒𠘑妟𡺨㮾𣳿ð¤„𤓖垈𤙴㦛𤜯𨗨𩧉ã¢ð¢‡ƒè­žð¨­Žé§–𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆ð ¹è»šð¥€¬åŠåœ¿ç…±ð¥Š™ð¥™ð£½Šð¤ª§å–¼ð¥‘†ð¥‘®ð¦­’釔㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿ð¥¡å¦ã“»ð£Œæƒžð¥¤ƒä¼ð¨¥ˆð¥ª®ð¥®‰ð¥°†ð¡¶åž¡ç…‘澶𦄂𧰒é–𦆲𤾚譢ð¦‚𦑊"], +["9c40","嵛𦯷輶𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧ð¯£ä¾»åš¹ð¤”¡ð¦›¼ä¹ªð¤¤´é™–æ¶ð¦²½ã˜˜è¥·ð¦ž™ð¦¡®ð¦‘𦡞營𦣇筂𩃀𠨑𦤦鄄𦤹穅鷰𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙èð¦®ä›ð¦²¤ç”»è¡¥ð¦¶®å¢¶"], +["9ca1","㜜ð¢–ð§‹ð§‡ã±”𧊀𧊅éŠð¢…ºð§Š‹éŒ°ð§‹¦ð¤§æ°¹é’Ÿð§‘𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹å°ç§£ä”¿æš¶ð©²­ð©¢¤è¥ƒð§ŸŒð§¡˜å›–䃟𡘊㦡𣜯𨃨ð¡…熭è¦ð§§ð©†¨å©§ä²·ð§‚¯ð¨¦«ð§§½ð§¨Šð§¬‹ð§µ¦ð¤…ºç­ƒç¥¾ð¨€‰æ¾µðª‹Ÿæ¨ƒð¨Œ˜åŽ¢ð¦¸‡éŽ¿æ ¶é𨅯𨀣𦦵ð¡­ð£ˆ¯ð¨ˆå¶…𨰰𨂃圕頣𨥉嶫𤦈斾槕å’𤪥ð£¾ã°‘朶ð¨‚𨃴𨄮𡾡ð¨…"], +["9d40","𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺æ¦ð¨¥–砈鉕𨦸ä²ð¨§§äŸð¨§¨ð¨­†ð¨¯”姸𨰉輋𨿅𩃬筑ð©„𩄼㷷𩅞𤫊è¿çŠåš‹ð©“§ð©—©ð©–°ð©–¸ð©œ²ð©£‘𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达å—"], +["9da1","辺𢒰边𤪓䔉繿潖檱仪㓤𨬬ð§¢ãœºèº€ð¡Ÿµð¨€¤ð¨­¬ð¨®™ð§¨¾ð¦š¯ã·«ð§™•𣲷𥘵𥥖亚ð¥ºð¦‰˜åš¿ð ¹­è¸Žå­­ð£ºˆð¤²žæžæ‹ð¡Ÿ¶ð¡¡»æ”°å˜­ð¥±Šåšð¥Œ‘㷆𩶘䱽嘢嘞罉𥻘奵𣵀è°ä¸œð ¿ªð µ‰ð£šºè„—鵞贘瘻鱅癎瞹é…å²è…ˆè‹·å˜¥è„²è˜è‚½å—ªç¥¢å™ƒå–ð ºã—Žå˜…嗱曱𨋢㘭甴嗰喺咗啲ð ±ð ²–å»ð¥…ˆð ¹¶ð¢±¢"], +["9e40","ð º¢éº«çµšå—žð¡µæŠé­å’”è³ç‡¶é…¶æ¼æŽ¹æ¾å•©ð¢­ƒé±²ð¢º³å†šã“Ÿð ¶§å†§å‘唞唓癦踭𦢊疱肶蠄螆裇膶èœð¡ƒä“¬çŒ„𤜆å®èŒ‹ð¦¢“噻𢛴𧴯𤆣𧵳ð¦»ð§Š¶é…°ð¡‡™éˆˆð£³¼ðªš©ð º¬ð »¹ç‰¦ð¡²¢äŽð¤¿‚𧿹𠿫䃺"], +["9ea1","鱿”Ÿð¢¶ ä£³ð¤Ÿ ð©µ¼ð ¿¬ð ¸Šæ¢ð§–£ð ¿­"], +["9ead","ð¦ˆð¡†‡ç†£çºŽéµä¸šä¸„ã•·å¬æ²²å§ãš¬ã§œå½ãš¥ð¤˜˜å¢šð¤­®èˆ­å‘‹åžªð¥ª•ð ¥¹"], +["9ec5","㩒𢑥ç´ð©º¬ä´‰é¯­ð£³¾ð©¼°ä±›ð¤¾©ð©–žð©¿žè‘œð£¶¶ð§Š²ð¦ž³ð£œ æŒ®ç´¥ð£»·ð£¸¬ã¨ªé€ˆå‹Œã¹´ã™ºä—©ð ’Žç™€å«°ð º¶ç¡ºð§¼®å¢§ä‚¿å™¼é®‹åµ´ç™”ðª´éº…䳡痹㟻愙𣃚ð¤²"], +["9ef5","å™ð¡Š©åž§ð¤¥£ð©¸†åˆ´ð§‚®ã–­æ±Šéµ¼"], +["9f40","籖鬹埞ð¡¬å±“æ““ð©“𦌵𧅤蚭𠴨𦴢𤫢𠵱"], +["9f4f","凾ð¡¼å¶Žéœƒð¡·‘éºéŒç¬Ÿé¬‚峑箣扨挵髿ç¯é¬ªç±¾é¬®ç±‚粆鰕篼鬉鼗鰛𤤾齚啳寃俽麘俲剠㸆勑å§å–妷帒韈鶫轜呩鞴饀鞺匬愰"], +["9fa1","椬åšé°Šé´‚䰻陿¦€å‚¦ç•†ð¡­é§šå‰³"], +["9fae","é…™éšé…œ"], +["9fb2","酑𨺗æ¿ð¦´£æ«Šå˜‘醎畺抅ð ¼ç籰𥰡𣳽"], +["9fc1","𤤙盖é®ä¸ªð ³”莾衂"], +["9fc9","届槀僭åºåˆŸå·µä»Žæ°±ð ‡²ä¼¹å’œå“šåŠšè¶‚ã—¾å¼Œã—³"], +["9fdb","歒酼龥鮗頮颴骺麨麄煺笔"], +["9fe7","毺蠘罸"], +["9feb","嘠𪙊蹷齓"], +["9ff0","è·”è¹é¸œè¸æŠ‚ð¨½è¸¨è¹µç«“𤩷稾磘泪詧瘇"], +["a040","𨩚鼦泎蟖痃𪊲硓咢贌狢ç±è¬­çŒ‚瓱賫𤪻蘯徺袠䒷"], +["a055","𡠻𦸅"], +["a058","詾𢔛"], +["a05b","惽癧髗鵄é®é®èŸµ"], +["a063","è è³·çŒ¬éœ¡é®°ã—–犲䰇籑饊𦅙慙䰄麖慽"], +["a073","åŸæ…¯æŠ¦æˆ¹æ‹Žã©œæ‡¢åŽªð£µæ¤æ ‚ã—’"], +["a0a1","嵗𨯂迚𨸹"], +["a0a6","僙𡵆礆匲阸𠼻ä¥"], +["a0ae","矾"], +["a0b0","糂𥼚糚稭è¦è£çµç”…瓲覔舚朌è¢ð§’†è›ç“°è„ƒçœ¤è¦‰ð¦ŸŒç•“𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦"], +["a0d4","覩瑨涹èŸð¤€‘瓧㷛煶悤憜㳑煢æ·"], +["a0e2","ç½±ð¨¬­ç‰æƒ©ä­¾åˆ ã°˜ð£³‡ð¥»—𧙖𥔱𡥄𡋾𩤃𦷜𧂭å³ð¦†­ð¨¨ð£™·ð ƒ®ð¦¡†ð¤¼Žä•¢å¬Ÿð¦Œé½éº¦ð¦‰«"], +["a3c0","â€",31,"â¡"], +["c6a1","â‘ ",9,"â‘´",9,"â…°",9,"丶丿亅亠冂冖冫勹匸å©åŽ¶å¤Šå®€å·›â¼³å¹¿å»´å½å½¡æ”´æ— ç–’癶辵隶¨ˆヽヾã‚ゞ〃ä»ã€…〆〇ー[]✽ã",23], +["c740","ã™",58,"ァアィイ"], +["c7a1","ã‚¥",81,"Ð",5,"ÐЖ",4], +["c840","Л",26,"ёж",25,"⇧↸↹ã‡ð ƒŒä¹šð ‚Šåˆ‚ä’‘"], +["c8a1","龰冈龱𧘇"], +["c8cd","¬¦'"㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌âºâº•⺜âºâº¥âº§âºªâº¬âº®âº¶âº¼âº¾â»†â»Šâ»Œâ»â»â»–⻗⻞⻣"], +["c8f5","ʃÉɛɔɵœøŋʊɪ"], +["f9fe","ï¿­"], +["fa40","𠕇鋛𠗟𣿅蕌䊵ç¯å†µã™‰ð¤¥‚𨧤é„ð¡§›è‹®ð£³ˆç ¼æ„æ‹Ÿð¤¤³ð¨¦ªð Š ð¦®³ð¡Œ…侫𢓭倈𦴩𧪄𣘀𤪱𢔓倩ð ¾å¾¤ð Ž€ð ‡æ»›ð Ÿå½å„㑺儎顬ãƒè–𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂è½ð –³ð£²™å†²å†¸"], +["faa1","鴴凉å‡å‡‘㳜凓𤪦决凢å‚å‡­èæ¤¾ð£œ­å½»åˆ‹åˆ¦åˆ¼åŠµå‰—åŠ”åŠ¹å‹…ç°•è•‚å‹ è˜ð¦¬“包𨫞啉滙𣾀𠥔𣿬匳å„ð ¯¢æ³‹ð¡œ¦æ ›ç•æŠãºªã£Œð¡›¨ç‡ä’¢å­å´ð¨š«å¾å¿ð¡––𡘓矦厓𨪛厠厫厮玧ð¥²ã½™çŽœåå…æ±‰ä¹‰åŸ¾å™ãª«ð ®å ð£¿«ð¢¶£å¶ð ±·å“ç¹å”«æ™—浛呭𦭓𠵴å•å’咤䞦ð¡œð »ã¶´ð µ"], +["fb40","𨦼𢚘啇䳭å¯ç—å–†å–©å˜…ð¡£—ð¤€ºä•’ð¤µæš³ð¡‚´å˜·æ›ð£ŠŠæš¤æš­å™å™ç£±å›±éž‡å¾åœ€å›¯å›­ð¨­¦ã˜£ð¡‰å†ð¤†¥æ±®ç‚‹å‚㚱𦱾埦ð¡–堃𡑔ð¤£å ¦ð¤¯µå¡œå¢ªã•¡å£ å£œð¡ˆ¼å£»å¯¿åƒðª…𤉸é“㖡够梦㛃湙"], +["fba1","𡘾娤啓𡚒蔅姉𠵎ð¦²ð¦´ªð¡Ÿœå§™ð¡Ÿ»ð¡ž²ð¦¶¦æµ±ð¡ ¨ð¡›•姹𦹅媫婣㛦𤦩婷㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広å‹å­¶æ–ˆå­¼ð§¨Žä€„ä¡ð ˆ„寕慠𡨴𥧌𠖥寳å®ä´å°…ð¡­„å°“çŽå°”𡲥𦬨屉ä£å²…峩峯嶋𡷹𡸷å´å´˜åµ†ð¡º¤å²ºå·—苼㠭ð¤¤ð¢‰ð¢…³èŠ‡ã ¶ã¯‚å¸®æªŠå¹µå¹ºð¤’¼ð ³“åŽ¦äº·å»åލð¡±å¸‰å»´ð¨’‚"], +["fc40","廹廻㢠廼栾é›å¼ð ‡ð¯¢”㫞䢮𡌺强𦢈ð¢å½˜ð¢‘±å½£éž½ð¦¹®å½²é€ð¨¨¶å¾§å¶¶ãµŸð¥‰ð¡½ªð§ƒ¸ð¢™¨é‡–𠊞𨨩怱暅𡡷㥣㷇㘹åžð¢ž´ç¥±ã¹€æ‚žæ‚¤æ‚³ð¤¦‚ð¤¦ð§©“ç’¤åƒ¡åª æ…¤è¤æ…‚慈𦻒æ†å‡´ð ™–憇宪𣾷"], +["fca1","𢡟懓ð¨®ð©¥æ‡ã¤²ð¢¦€ð¢£æ€£æ…œæ”žæŽ‹ð „˜æ‹…ð¡°æ‹•ð¢¸æ¬ð¤§Ÿã¨—æ¸æ¸ð¡ŽŽð¡Ÿ¼æ’æ¾Šð¢¸¶é ”ð¤‚Œð¥œæ“¡æ“¥é‘»ã©¦æºã©—æ•æ¼–ð¤¨¨ð¤¨£æ–…æ•­æ•Ÿð£¾æ–µð¤¥€ä¬·æ—‘äƒ˜ð¡ ©æ— æ—£å¿Ÿð£€æ˜˜ð£‡·ð£‡¸æ™„ð£†¤ð£†¥æ™‹ð ¹µæ™§ð¥‡¦æ™³æ™´ð¡¸½ð£ˆ±ð¨—´ð£‡ˆð¥Œ“çŸ…ð¢£·é¦¤æœ‚ð¤Žœð¤¨¡ã¬«æ§ºð£Ÿ‚æžæ§æ¢ð¤‡ð©ƒ­æŸ—ä“©æ ¢æ¹éˆ¼æ ð£¦ð¦¶ æ¡"], +["fd40","ð£‘¯æ§¡æ¨‹ð¨«Ÿæ¥³æ£ƒð£—æ¤æ¤€ã´²ã¨ð£˜¼ã®€æž¬æ¥¡ð¨©Šä‹¼æ¤¶æ¦˜ã®¡ð ‰è£å‚槹𣙙𢄪橅𣜃æªã¯³æž±æ«ˆð©†œã°æ¬ð ¤£æƒžæ¬µæ­´ð¢Ÿæºµð£«›ð Žµð¡¥˜ã€å¡ð£­šæ¯¡ð£»¼æ¯œæ°·ð¢’‹ð¤£±ð¦­‘汚舦汹𣶼䓅𣶽𤆤𤤌𤤀"], +["fda1","ð£³‰ã›¥ã³«ð ´²é®ƒð£‡¹ð¢’‘ç¾æ ·ð¦´¥ð¦¶¡ð¦·«æ¶–浜湼漄𤥿𤂅𦹲蔳𦽴凇沜æ¸è®ð¨¬¡æ¸¯ð£¸¯ç‘“𣾂秌æ¹åª‘ð£‹æ¿¸ãœæ¾ð£¸°æ»ºð¡’—ð¤€½ä••é°æ½„潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀ð¦‡ç‹ç¾ç‚§ç‚烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊煮岜ð¤¥ç…é¢ð¤‹ç„¬ð¤‘šð¤¨§ð¤¨¢ç†ºð¨¯¨ç‚½çˆŽ"], +["fe40","鑂爕夑鑃爤éð¥˜…çˆ®ç‰€ð¤¥´æ¢½ç‰•ç‰—ã¹•ð£„æ æ¼½çŠ‚çŒªçŒ«ð¤ £ð¨ «ä£­ð¨ „çŒ¨çŒ®ç玪𠰺𦨮ç‰ç‘‰ð¤‡¢ð¡›§ð¤¨¤æ˜£ã›…𤦷ð¤¦ð¤§»ç·ç•椃𤨦ç¹ð —ƒã»—瑜𢢭瑠𨺲瑇ç¤ç‘¶èŽ¹ç‘¬ãœ°ç‘´é±æ¨¬ç’‚䥓𤪌"], +["fea1","𤅟𤩹ð¨®å­†ð¨°ƒð¡¢žç“ˆð¡¦ˆç”Žç“©ç”žð¨»™ð¡©‹å¯—𨺬鎅ç•畊畧畮𤾂㼄𤴓疎ç‘疞疴瘂瘬癑ç™ç™¯ç™¶ð¦µçšè‡¯ãŸ¸ð¦¤‘𦤎皡皥皷盌𦾟葢ð¥‚ð¥…½ð¡¸œçœžçœ¦ç€æ’¯ð¥ˆ ç˜ð£Š¬çž¯ð¨¥¤ð¨¥¨ð¡›çŸ´ç ‰ð¡¶ð¤¨’棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗ç¦ð§¬¹ç¤¼ç¦©æ¸ªð§„¦ãº¨ç§†ð©„ç§”"] +] diff --git a/node_modules/iconv-lite/encodings/tables/cp936.json b/node_modules/iconv-lite/encodings/tables/cp936.json new file mode 100644 index 00000000..49ddb9a1 --- /dev/null +++ b/node_modules/iconv-lite/encodings/tables/cp936.json @@ -0,0 +1,264 @@ +[ +["0","\u0000",127,"€"], +["8140","丂丄丅丆ä¸ä¸’丗丟丠両丣並丩丮丯丱丳丵丷丼乀ä¹ä¹‚乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪",5,"乲乴",9,"乿",6,"亇亊"], +["8180","äºäº–亗亙亜äºäºžäº£äºªäº¯äº°äº±äº´äº¶äº·äº¸äº¹äº¼äº½äº¾ä»ˆä»Œä»ä»ä»’仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂",6,"伋伌伒",4,"伜ä¼ä¼¡ä¼£ä¼¨ä¼©ä¼¬ä¼­ä¼®ä¼±ä¼³ä¼µä¼·ä¼¹ä¼»ä¼¾",4,"佄佅佇",5,"佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀ä¾ä¾‚侅來侇侊侌侎ä¾ä¾’侓侕侖侘侙侚侜侞侟価侢"], +["8240","侤侫侭侰",4,"ä¾¶",8,"ä¿€ä¿ä¿‚俆俇俈俉俋俌ä¿ä¿’",4,"俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿",11], +["8280","個倎å€å€‘倓倕倖倗倛å€å€žå€ å€¢å€£å€¤å€§å€«å€¯",10,"倻倽倿å€åå‚å„å…å†å‰åŠå‹åå",4,"å–å—å˜å™å›å",7,"å¦",5,"å­",8,"å¸å¹åºå¼å½å‚傂傃傄傆傇傉傊傋傌傎",20,"傤傦傪傫傭",4,"傳",6,"傼"], +["8340","傽",17,"åƒ",5,"僗僘僙僛",10,"僨僩僪僫僯僰僱僲僴僶",4,"僼",9,"儈"], +["8380","儉儊儌",5,"å„“",13,"å„¢",28,"兂兇兊兌兎å…å…兒兓兗兘兙兛å…",4,"兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎å†å†å†‘冓冔冘冚å†å†žå†Ÿå†¡å†£å†¦",4,"冭冮冴冸冹冺冾冿å‡å‡‚凃凅凈凊å‡å‡Žå‡å‡’",5], +["8440","凘凙凚凜凞凟凢凣凥",5,"凬凮凱凲凴凷凾刄刅刉刋刌åˆåˆåˆ“刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄",5,"剋剎å‰å‰’剓剕剗剘"], +["8480","剙剚剛å‰å‰Ÿå‰ å‰¢å‰£å‰¤å‰¦å‰¨å‰«å‰¬å‰­å‰®å‰°å‰±å‰³",9,"剾劀劃",4,"劉",6,"劑劒劔",6,"劜劤劥劦劧劮劯劰労",9,"å‹€å‹å‹‚勄勅勆勈勊勌å‹å‹Žå‹å‹‘勓勔動勗務",5,"勠勡勢勣勥",10,"勱",7,"勻勼勽åŒåŒ‚匃匄匇匉匊匋匌匎"], +["8540","匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯",9,"匼匽å€å‚å„å†å‹åŒååå”å˜å™å›åå¥å¨åªå¬å­å²å¶å¹å»å¼å½å¾åŽ€åŽåŽƒåŽ‡åŽˆåŽŠåŽŽåŽ"], +["8580","åŽ",4,"厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯",6,"厷厸厹厺厼厽厾å€åƒ",4,"åŽååå’å“å•åšåœååžå¡å¢å§å´åºå¾å¿å€å‚å…å‡å‹å”å˜å™åšåœå¢å¤å¥åªå°å³å¶å·åºå½å¿å‘呂呄呅呇呉呌å‘呎å‘呑呚å‘",4,"呣呥呧呩",7,"呴呹呺呾呿å’咃咅咇咈咉咊å’咑咓咗咘咜咞咟咠咡"], +["8640","咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠",4,"哫哬哯哰哱哴",5,"哻哾唀唂唃唄唅唈唊",4,"唒唓唕",5,"唜å”唞唟唡唥唦"], +["8680","唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋",4,"啑啒啓啔啗",4,"å•啞啟啠啢啣啨啩啫啯",5,"啹啺啽啿喅喆喌å–å–Žå–喒喓喕喖喗喚喛喞喠",6,"å–¨",8,"喲喴営喸喺喼喿",4,"嗆嗇嗈嗊嗋嗎å—å—å—•å——",4,"嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸",4,"嗿嘂嘃嘄嘅"], +["8740","嘆嘇嘊嘋å˜å˜",7,"嘙嘚嘜å˜å˜ å˜¡å˜¢å˜¥å˜¦å˜¨å˜©å˜ªå˜«å˜®å˜¯å˜°å˜³å˜µå˜·å˜¸å˜ºå˜¼å˜½å˜¾å™€",11,"å™",4,"噕噖噚噛å™",4], +["8780","噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽",7,"嚇",6,"åšåš‘åš’åš”",14,"嚤",10,"åš°",6,"嚸嚹嚺嚻嚽",12,"囋",8,"囕囖囘囙囜団囥",5,"囬囮囯囲図囶囷囸囻囼圀åœåœ‚圅圇國",6], +["8840","園",9,"åœåœžåœ åœ¡åœ¢åœ¤åœ¥åœ¦åœ§åœ«åœ±åœ²åœ´",4,"圼圽圿ååƒå„å…å†åˆå‰å‹å’",4,"å˜å™å¢å£å¥å§å¬å®å°å±å²å´åµå¸å¹åºå½å¾å¿åž€"], +["8880","åžåž‡åžˆåž‰åžŠåž",4,"åž”",6,"åžœåžåžžåžŸåž¥åž¨åžªåž¬åž¯åž°åž±åž³åžµåž¶åž·åž¹",8,"埄",6,"埌åŸåŸåŸ‘埓埖埗埛埜埞埡埢埣埥",7,"埮埰埱埲埳埵埶執埻埼埾埿å å ƒå „堅堈堉堊堌堎å å å ’堓堔堖堗堘堚堛堜å å Ÿå ¢å £å ¥",4,"å «",4,"報堲堳場堶",7], +["8940","å ¾",5,"å¡…",6,"塎å¡å¡å¡’å¡“å¡•å¡–å¡—å¡™",4,"塟",5,"塦",4,"å¡­",16,"塿墂墄墆墇墈墊墋墌"], +["8980","å¢",4,"墔",4,"墛墜å¢å¢ ",7,"墪",17,"墽墾墿壀壂壃壄壆",10,"壒壓壔壖",13,"壥",5,"壭壯壱売壴壵壷壸壺",7,"夃夅夆夈",4,"夎å¤å¤‘夒夓夗夘夛å¤å¤žå¤ å¤¡å¤¢å¤£å¤¦å¤¨å¤¬å¤°å¤²å¤³å¤µå¤¶å¤»"], +["8a40","夽夾夿奀奃奅奆奊奌å¥å¥å¥’奓奙奛",4,"奡奣奤奦",12,"奵奷奺奻奼奾奿妀妅妉妋妌妎å¦å¦å¦‘妔妕妘妚妛妜å¦å¦Ÿå¦ å¦¡å¦¢å¦¦"], +["8a80","妧妬妭妰妱妳",5,"妺妼妽妿",6,"姇姈姉姌å§å§Žå§å§•姖姙姛姞",4,"姤姦姧姩姪姫姭",11,"姺姼姽姾娀娂娊娋å¨å¨Žå¨å¨å¨’娔娕娖娗娙娚娛å¨å¨žå¨¡å¨¢å¨¤å¨¦å¨§å¨¨å¨ª",6,"娳娵娷",4,"娽娾娿å©",4,"婇婈婋",9,"婖婗婘婙婛",5], +["8b40","婡婣婤婥婦婨婩婫",8,"婸婹婻婼婽婾媀",17,"媓",6,"媜",13,"媫媬"], +["8b80","媭",4,"媴媶媷媹",4,"媿嫀嫃",5,"嫊嫋å«",4,"嫓嫕嫗嫙嫚嫛å«å«žå«Ÿå«¢å«¤å«¥å«§å«¨å«ªå«¬",4,"嫲",22,"嬊",11,"嬘",25,"嬳嬵嬶嬸",7,"å­",6], +["8c40","å­ˆ",7,"孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊å®å®Žå®å®‘宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀å¯å¯ƒå¯ˆå¯‰å¯Šå¯‹å¯å¯Žå¯"], +["8c80","寑寔",8,"寠寢寣實寧審",4,"寯寱",6,"寽対尀専尃尅將專尋尌å°å°Žå°å°’尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌å±å±’屓屔屖屗屘屚屛屜å±å±Ÿå±¢å±¤å±§",6,"å±°å±²",6,"屻屼屽屾岀岃",4,"岉岊岋岎å²å²’岓岕å²",4,"岤",4], +["8d40","岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅",5,"峌",5,"峓",5,"峚",6,"峢峣峧峩峫峬峮峯峱",9,"å³¼",4], +["8d80","å´å´„å´…å´ˆ",5,"å´",4,"崕崗崘崙崚崜å´å´Ÿ",4,"崥崨崪崫崬崯",4,"å´µ",7,"å´¿",7,"嵈嵉åµ",10,"嵙嵚嵜嵞",10,"嵪嵭嵮嵰嵱嵲嵳嵵",12,"嶃",21,"嶚嶛嶜嶞嶟嶠"], +["8e40","å¶¡",21,"嶸",12,"å·†",6,"å·Ž",12,"巜巟巠巣巤巪巬巭"], +["8e80","巰巵巶巸",4,"巿帀帄帇帉帊帋å¸å¸Žå¸’帓帗帞",7,"帨",4,"帯帰帲",4,"帹帺帾帿幀å¹å¹ƒå¹†",5,"å¹",6,"å¹–",4,"幜å¹å¹Ÿå¹ å¹£",14,"幵幷幹幾åºåº‚広庅庈庉庌åºåºŽåº’庘庛åºåº¡åº¢åº£åº¤åº¨",4,"庮",4,"庴庺庻庼庽庿",6], +["8f40","廆廇廈廋",5,"廔廕廗廘廙廚廜",11,"廩廫",8,"廵廸廹廻廼廽弅弆弇弉弌å¼å¼Žå¼å¼’弔弖弙弚弜å¼å¼žå¼¡å¼¢å¼£å¼¤"], +["8f80","弨弫弬弮弰弲",6,"弻弽弾弿å½",14,"彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆å¾å¾Žå¾å¾‘従徔徖徚徛å¾å¾žå¾Ÿå¾ å¾¢",5,"復徫徬徯",5,"徶徸徹徺徻徾",4,"忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇"], +["9040","æ€ˆæ€‰æ€‹æ€Œæ€æ€‘怓怗怘怚怞怟怢怣怤怬怭怮怰",4,"怶",4,"æ€½æ€¾æ€æ„",6,"æŒæŽææ‘æ“æ”æ–æ—æ˜æ›æœæžæŸæ æ¡æ¥æ¦æ®æ±æ²æ´æµæ·æ¾æ‚€"], +["9080","æ‚æ‚‚æ‚…æ‚†æ‚‡æ‚ˆæ‚Šæ‚‹æ‚Žæ‚æ‚悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽",7,"惇惈惉惌",4,"惒惓惔惖惗惙惛惞惡",4,"惪惱惲惵惷惸惻",4,"愂愃愄愅愇愊愋愌æ„",4,"æ„–æ„—æ„˜æ„™æ„›æ„œæ„æ„žæ„¡æ„¢æ„¥æ„¨æ„©æ„ªæ„¬",18,"æ…€",6], +["9140","æ…‡æ…‰æ…‹æ…æ…æ…æ…’慓慔慖",6,"慞慟慠慡慣慤慥慦慩",6,"慱慲慳慴慶慸",18,"æ†Œæ†æ†",4,"憕"], +["9180","憖",6,"憞",8,"憪憫憭",9,"憸",5,"æ†¿æ‡€æ‡æ‡ƒ",4,"應懌",4,"懓懕",16,"懧",13,"懶",8,"戀",5,"æˆ‡æˆ‰æˆ“æˆ”æˆ™æˆœæˆæˆžæˆ æˆ£æˆ¦æˆ§æˆ¨æˆ©æˆ«æˆ­æˆ¯æˆ°æˆ±æˆ²æˆµæˆ¶æˆ¸",4,"扂扄扅扆扊"], +["9240","æ‰æ‰æ‰•扖扗扙扚扜",6,"æ‰¤æ‰¥æ‰¨æ‰±æ‰²æ‰´æ‰µæ‰·æ‰¸æ‰ºæ‰»æ‰½æŠæŠ‚æŠƒæŠ…æŠ†æŠ‡æŠˆæŠ‹",5,"æŠ”æŠ™æŠœæŠæŠžæŠ£æŠ¦æŠ§æŠ©æŠªæŠ­æŠ®æŠ¯æŠ°æŠ²æŠ³æŠ´æŠ¶æŠ·æŠ¸æŠºæŠ¾æ‹€æ‹"], +["9280","æ‹ƒæ‹‹æ‹æ‹‘æ‹•æ‹æ‹žæ‹ æ‹¡æ‹¤æ‹ªæ‹«æ‹°æ‹²æ‹µæ‹¸æ‹¹æ‹ºæ‹»æŒ€æŒƒæŒ„æŒ…æŒ†æŒŠæŒ‹æŒŒæŒæŒæŒæŒ’挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳",5,"æŒ»æŒ¼æŒ¾æŒ¿æ€ææ„æ‡æˆæŠæ‘æ’æ“æ”æ–",7,"æ æ¤æ¥æ¦æ¨æªæ«æ¬æ¯æ°æ²æ³æ´æµæ¸æ¹æ¼æ½æ¾æ¿æŽæŽƒæŽ„æŽ…æŽ†æŽ‹æŽæŽ‘æŽ“æŽ”æŽ•æŽ—æŽ™",6,"採掤掦掫掯掱掲掵掶掹掻掽掿æ€"], +["9340","ææ‚æƒæ…æ‡æˆæŠæ‹æŒæ‘æ“æ”æ•æ—",6,"æŸæ¢æ¤",4,"æ«æ¬æ®æ¯æ°æ±æ³æµæ·æ¹æºæ»æ¼æ¾æƒæ„æ†",4,"ææŽæ‘æ’æ•",5,"ææŸæ¢æ£æ¤"], +["9380","æ¥æ§æ¨æ©æ«æ®",5,"æµ",4,"æ»æ¼æ¾æ‘€æ‘‚摃摉摋",6,"æ‘“æ‘•æ‘–æ‘—æ‘™",4,"摟",7,"摨摪摫摬摮",9,"æ‘»",6,"撃撆撈",8,"æ’“æ’”æ’—æ’˜æ’šæ’›æ’œæ’æ’Ÿ",4,"æ’¥æ’¦æ’§æ’¨æ’ªæ’«æ’¯æ’±æ’²æ’³æ’´æ’¶æ’¹æ’»æ’½æ’¾æ’¿æ“æ“ƒæ“„擆",6,"æ“æ“‘擓擔擕擖擙據"], +["9440","æ“›æ“œæ“æ“Ÿæ“ æ“¡æ“£æ“¥æ“§",24,"æ”",7,"攊",7,"攓",4,"æ”™",8], +["9480","攢攣攤攦",4,"攬攭攰攱攲攳攷攺攼攽敀",4,"æ•†æ•‡æ•Šæ•‹æ•æ•Žæ•敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數",14,"æ–ˆæ–‰æ–Šæ–æ–Žæ–æ–’æ–”æ–•æ––æ–˜æ–šæ–æ–žæ– æ–¢æ–£æ–¦æ–¨æ–ªæ–¬æ–®æ–±",7,"æ–ºæ–»æ–¾æ–¿æ—€æ—‚æ—‡æ—ˆæ—‰æ—Šæ—æ—旑旓旔旕旘",7,"旡旣旤旪旫"], +["9540","旲旳旴旵旸旹旻",4,"æ˜æ˜„æ˜…æ˜‡æ˜ˆæ˜‰æ˜‹æ˜æ˜æ˜‘昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷",4,"昽昿晀時晄",6,"æ™æ™Žæ™æ™‘晘"], +["9580","æ™™æ™›æ™œæ™æ™žæ™ æ™¢æ™£æ™¥æ™§æ™©",4,"æ™±æ™²æ™³æ™µæ™¸æ™¹æ™»æ™¼æ™½æ™¿æš€æšæšƒæš…æš†æšˆæš‰æšŠæš‹æšæšŽæšæšæš’æš“暔暕暘",4,"æšž",8,"æš©",4,"暯",4,"暵暶暷暸暺暻暼暽暿",25,"曚曞",7,"曧曨曪",5,"æ›±æ›µæ›¶æ›¸æ›ºæ›»æ›½æœæœ‚會"], +["9640","æœ„æœ…æœ†æœ‡æœŒæœŽæœæœ‘朒朓朖朘朙朚朜朞朠",5,"æœ§æœ©æœ®æœ°æœ²æœ³æœ¶æœ·æœ¸æœ¹æœ»æœ¼æœ¾æœ¿ææ„æ…æ‡æŠæ‹ææ’æ”æ•æ—",4,"ææ¢æ£æ¤æ¦æ§æ«æ¬æ®æ±æ´æ¶"], +["9680","æ¸æ¹æºæ»æ½æž€æž‚æžƒæž…æž†æžˆæžŠæžŒæžæžŽæžæž‘枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹",7,"柂柅",9,"柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵",7,"æŸ¾æ æ ‚æ ƒæ „æ †æ æ æ ’栔栕栘",4,"æ žæ Ÿæ  æ ¢",6,"æ «",6,"æ ´æ µæ ¶æ ºæ »æ ¿æ¡‡æ¡‹æ¡æ¡æ¡’æ¡–",5], +["9740","æ¡œæ¡æ¡žæ¡Ÿæ¡ªæ¡¬",7,"桵桸",8,"梂梄梇",7,"æ¢æ¢‘梒梔梕梖梘",9,"梣梤梥梩梪梫梬梮梱梲梴梶梷梸"], +["9780","梹",6,"æ£æ£ƒ",5,"æ£Šæ£Œæ£Žæ£æ£æ£‘棓棔棖棗棙棛",4,"棡棢棤",9,"棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆",4,"æ¤Œæ¤æ¤‘椓",11,"椡椢椣椥",7,"æ¤®æ¤¯æ¤±æ¤²æ¤³æ¤µæ¤¶æ¤·æ¤¸æ¤ºæ¤»æ¤¼æ¤¾æ¥€æ¥æ¥ƒ",16,"楕楖楘楙楛楜楟"], +["9840","楡楢楤楥楧楨楩楪楬業楯楰楲",4,"æ¥ºæ¥»æ¥½æ¥¾æ¥¿æ¦æ¦ƒæ¦…榊榋榌榎",5,"榖榗榙榚æ¦",9,"榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽"], +["9880","榾榿槀槂",7,"æ§‹æ§æ§æ§‘æ§’æ§“æ§•",5,"æ§œæ§æ§žæ§¡",11,"槮槯槰槱槳",9,"槾樀",9,"樋",11,"標",5,"樠樢",5,"権樫樬樭樮樰樲樳樴樶",6,"樿",4,"橅橆橈",7,"æ©‘",6,"橚"], +["9940","橜",4,"橢橣橤橦",10,"橲",6,"æ©ºæ©»æ©½æ©¾æ©¿æªæª‚檃檅",8,"æªæª’",4,"檘",7,"檡",5], +["9980","檧檨檪檭",114,"欥欦欨",6], +["9a40","æ¬¯æ¬°æ¬±æ¬³æ¬´æ¬µæ¬¶æ¬¸æ¬»æ¬¼æ¬½æ¬¿æ­€æ­æ­‚歄歅歈歊歋æ­",11,"æ­š",7,"歨歩歫",13,"歺歽歾歿殀殅殈"], +["9a80","æ®Œæ®Žæ®æ®æ®‘殔殕殗殘殙殜",4,"殢",7,"殫",7,"殶殸",6,"毀毃毄毆",4,"æ¯Œæ¯Žæ¯æ¯‘毘毚毜",4,"毢",7,"毬毭毮毰毱毲毴毶毷毸毺毻毼毾",6,"æ°ˆ",4,"æ°Žæ°’æ°—æ°œæ°æ°žæ° æ°£æ°¥æ°«æ°¬æ°­æ°±æ°³æ°¶æ°·æ°¹æ°ºæ°»æ°¼æ°¾æ°¿æ±ƒæ±„汅汈汋",4,"汑汒汓汖汘"], +["9b40","汙汚汢汣汥汦汧汫",4,"æ±±æ±³æ±µæ±·æ±¸æ±ºæ±»æ±¼æ±¿æ²€æ²„æ²‡æ²Šæ²‹æ²æ²Žæ²‘æ²’æ²•æ²–æ²—æ²˜æ²šæ²œæ²æ²žæ² æ²¢æ²¨æ²¬æ²¯æ²°æ²´æ²µæ²¶æ²·æ²ºæ³€æ³æ³‚æ³ƒæ³†æ³‡æ³ˆæ³‹æ³æ³Žæ³æ³‘泒泘"], +["9b80","æ³™æ³šæ³œæ³æ³Ÿæ³¤æ³¦æ³§æ³©æ³¬æ³­æ³²æ³´æ³¹æ³¿æ´€æ´‚æ´ƒæ´…æ´†æ´ˆæ´‰æ´Šæ´æ´æ´æ´‘æ´“æ´”æ´•æ´–æ´˜æ´œæ´æ´Ÿ",5,"æ´¦æ´¨æ´©æ´¬æ´­æ´¯æ´°æ´´æ´¶æ´·æ´¸æ´ºæ´¿æµ€æµ‚æµ„æµ‰æµŒæµæµ•æµ–æµ—æµ˜æµ›æµæµŸæµ¡æµ¢æµ¤æµ¥æµ§æµ¨æµ«æµ¬æµ­æµ°æµ±æµ²æµ³æµµæµ¶æµ¹æµºæµ»æµ½",4,"æ¶ƒæ¶„æ¶†æ¶‡æ¶Šæ¶‹æ¶æ¶æ¶æ¶’æ¶–",4,"涜涢涥涬涭涰涱涳涴涶涷涹",5,"æ·æ·‚淃淈淉淊"], +["9c40","æ·æ·Žæ·æ·æ·’淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽",7,"æ¸†æ¸‡æ¸ˆæ¸‰æ¸‹æ¸æ¸’渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵"], +["9c80","渶渷渹渻",7,"æ¹…",7,"æ¹æ¹æ¹‘æ¹’æ¹•æ¹—æ¹™æ¹šæ¹œæ¹æ¹žæ¹ ",10,"湬湭湯",14,"æº€æºæº‚溄溇溈溊",4,"溑",6,"æº™æºšæº›æºæºžæº æº¡æº£æº¤æº¦æº¨æº©æº«æº¬æº­æº®æº°æº³æºµæº¸æº¹æº¼æº¾æº¿æ»€æ»ƒæ»„æ»…æ»†æ»ˆæ»‰æ»Šæ»Œæ»æ»Žæ»æ»’æ»–æ»˜æ»™æ»›æ»œæ»æ»£æ»§æ»ª",5], +["9d40","滰滱滲滳滵滶滷滸滺",7,"漃漄漅漇漈漊",4,"æ¼æ¼‘æ¼’æ¼–",9,"漡漢漣漥漦漧漨漬漮漰漲漴漵漷",6,"æ¼¿æ½€æ½æ½‚"], +["9d80","潃潄潅潈潉潊潌潎",9,"æ½™æ½šæ½›æ½æ½Ÿæ½ æ½¡æ½£æ½¤æ½¥æ½§",5,"潯潰潱潳潵潶潷潹潻潽",6,"澅澆澇澊澋æ¾",12,"æ¾æ¾žæ¾Ÿæ¾ æ¾¢",4,"澨",10,"澴澵澷澸澺",5,"æ¿æ¿ƒ",5,"濊",6,"æ¿“",10,"濟濢濣濤濥"], +["9e40","濦",7,"æ¿°",32,"瀒",7,"瀜",6,"瀤",6], +["9e80","瀫",9,"瀶瀷瀸瀺",17,"ççŽç",13,"çŸ",11,"ç®ç±ç²ç³ç´ç·ç¹çºç»ç½ç‚炂炃炄炆炇炈炋炌ç‚ç‚ç‚炑炓炗炘炚炛炞",12,"炰炲炴炵炶為炾炿烄烅烆烇烉烋",12,"烚"], +["9f40","烜çƒçƒžçƒ çƒ¡çƒ¢çƒ£çƒ¥çƒªçƒ®çƒ°",6,"烸烺烻烼烾",10,"ç„‹",4,"焑焒焔焗焛",10,"ç„§",7,"焲焳焴"], +["9f80","焵焷",13,"煆煇煈煉煋ç…ç…",12,"ç…ç…Ÿ",4,"煥煩",4,"煯煰煱煴煵煶煷煹煻煼煾",5,"熅",4,"熋熌ç†ç†Žç†ç†‘熒熓熕熖熗熚",4,"熡",6,"熩熪熫熭",5,"熴熶熷熸熺",8,"燄",9,"ç‡",4], +["a040","燖",9,"燡燢燣燤燦燨",5,"燯",9,"燺",11,"爇",19], +["a080","爛爜爞",9,"爩爫爭爮爯爲爳爴爺爼爾牀",6,"牉牊牋牎ç‰ç‰ç‰‘牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅",4,"犌犎çŠçŠ‘çŠ“",11,"犠",11,"犮犱犲犳犵犺",6,"狅狆狇狉狊狋狌ç‹ç‹‘狓狔狕狖狘狚狛"], +["a1a1"," ã€ã€‚·ˉˇ¨〃々—~‖…‘’“â€ã€”〕〈",7,"〖〗ã€ã€‘±×÷∶∧∨∑âˆâˆªâˆ©âˆˆâˆ·âˆšâŠ¥âˆ¥âˆ âŒ’âŠ™âˆ«âˆ®â‰¡â‰Œâ‰ˆâˆ½âˆâ‰ â‰®â‰¯â‰¤â‰¥âˆžâˆµâˆ´â™‚♀°′″℃$¤¢£‰§№☆★○â—◎◇◆□■△▲※→â†â†‘↓〓"], +["a2a1","â…°",9], +["a2b1","â’ˆ",19,"â‘´",19,"â‘ ",9], +["a2e5","㈠",9], +["a2f1","â… ",11], +["a3a1","ï¼ï¼‚#¥%",88,"ï¿£"], +["a4a1","ã",82], +["a5a1","ã‚¡",85], +["a6a1","Α",16,"Σ",6], +["a6c1","α",16,"σ",6], +["a6e0","︵︶︹︺︿﹀︽︾ï¹ï¹‚﹃﹄"], +["a6ee","︻︼︷︸︱"], +["a6f4","︳︴"], +["a7a1","Ð",5,"ÐЖ",25], +["a7d1","а",5,"ёж",25], +["a840","ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿â•",35,"â–",6], +["a880","â–ˆ",7,"▓▔▕▼▽◢◣◤◥☉⊕〒ã€ã€ž"], +["a8a1","ÄáǎàēéěèīíÇìÅóǒòūúǔùǖǘǚǜüêɑ"], +["a8bd","ńň"], +["a8c0","É¡"], +["a8c5","ã„…",36], +["a940","〡",8,"㊣㎎ãŽãŽœãŽãŽžãŽ¡ã„ãŽã‘ã’ã•︰¬¦"], +["a959","℡㈱"], +["a95c","â€"], +["a960","ー゛゜ヽヾ〆ã‚ゞ﹉",9,"﹔﹕﹖﹗﹙",8], +["a980","ï¹¢",4,"﹨﹩﹪﹫"], +["a996","〇"], +["a9a4","─",75], +["aa40","狜ç‹ç‹Ÿç‹¢",5,"狪狫狵狶狹狽狾狿猀猂猄",5,"猋猌çŒçŒçŒçŒ‘猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽ç€",8], +["aa80","ç‰çŠç‹çŒçŽçç‘ç“ç”ç•ç–ç˜",7,"ç¡",10,"ç®ç°ç±"], +["ab40","ç²",11,"ç¿",4,"玅玆玈玊玌çŽçŽçŽçŽ’çŽ“çŽ”çŽ•çŽ—çŽ˜çŽ™çŽšçŽœçŽçŽžçŽ çŽ¡çŽ£",5,"玪玬玭玱玴玵玶玸玹玼玽玾玿ççƒ",4], +["ab80","ç‹çŒçŽç’",6,"çšç›çœççŸç¡ç¢ç£ç¤ç¦ç¨çªç«ç¬ç®ç¯ç°ç±ç³",4], +["ac40","ç¸",10,"ç„ç‡çˆç‹çŒççŽç‘",8,"çœ",5,"ç£ç¤ç§ç©ç«ç­ç¯ç±ç²ç·",4,"ç½ç¾ç¿ç‘€ç‘‚",11], +["ac80","瑎",6,"瑖瑘ç‘ç‘ ",12,"瑮瑯瑱",4,"瑸瑹瑺"], +["ad40","瑻瑼瑽瑿璂璄璅璆璈璉璊璌ç’ç’ç’‘",10,"ç’ç’Ÿ",7,"ç’ª",15,"ç’»",12], +["ad80","瓈",9,"ç““",8,"ç“瓟瓡瓥瓧",6,"瓰瓱瓲"], +["ae40","瓳瓵瓸",6,"甀ç”甂甃甅",7,"甎ç”甒甔甕甖甗甛ç”甞甠",4,"甦甧甪甮甴甶甹甼甽甿ç•畂畃畄畆畇畉畊ç•ç•畑畒畓畕畖畗畘"], +["ae80","ç•",7,"畧畨畩畫",6,"畳畵當畷畺",4,"ç–€ç–ç–‚ç–„ç–…ç–‡"], +["af40","疈疉疊疌ç–ç–Žç–疓疕疘疛疜疞疢疦",4,"疭疶疷疺疻疿痀ç—痆痋痌痎ç—ç—痑痓痗痙痚痜ç—痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇"], +["af80","瘈瘉瘋ç˜ç˜Žç˜ç˜‘瘒瘓瘔瘖瘚瘜ç˜ç˜žç˜¡ç˜£ç˜§ç˜¨ç˜¬ç˜®ç˜¯ç˜±ç˜²ç˜¶ç˜·ç˜¹ç˜ºç˜»ç˜½ç™ç™‚癄"], +["b040","ç™…",6,"癎",5,"癕癗",4,"ç™ç™Ÿç™ ç™¡ç™¢ç™¤",6,"癬癭癮癰",7,"癹発發癿皀çšçšƒçš…皉皊皌çšçšçšçš’皔皕皗皘皚皛"], +["b080","çšœ",7,"皥",8,"皯皰皳皵",9,"盀ç›ç›ƒå•Šé˜¿åŸƒæŒ¨å“Žå”‰å“€çš‘癌蔼矮艾ç¢çˆ±éš˜éžæ°¨å®‰ä¿ºæŒ‰æš—å²¸èƒºæ¡ˆè‚®æ˜‚ç›Žå‡¹æ•–ç†¬ç¿±è¢„å‚²å¥¥æ‡Šæ¾³èŠ­æŒæ‰’å­å§ç¬†å…«ç–¤å·´æ‹”è·‹é¶æŠŠè€™å霸罢爸白æŸç™¾æ‘†ä½°è´¥æ‹œç¨—æ–‘ç­æ¬æ‰³èˆ¬é¢æ¿ç‰ˆæ‰®æ‹Œä¼´ç“£åŠåŠžç»Šé‚¦å¸®æ¢†æ¦œè†€ç»‘æ£’ç£…èšŒé•‘å‚谤苞胞包褒剥"], +["b140","盄盇盉盋盌盓盕盙盚盜ç›ç›žç› ",4,"盦",7,"盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎",10,"眛眜çœçœžçœ¡çœ£çœ¤çœ¥çœ§çœªçœ«"], +["b180","眬眮眰",4,"眹眻眽眾眿ç‚ç„ç…ç†çˆ",7,"ç’",7,"çœè–„雹ä¿å ¡é¥±å®æŠ±æŠ¥æš´è±¹é²çˆ†æ¯ç¢‘悲å‘北辈背è´é’¡å€ç‹ˆå¤‡æƒ«ç„™è¢«å¥”苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖å¸åº‡ç—¹é—­æ•弊必辟å£è‡‚é¿é™›éž­è¾¹ç¼–è´¬æ‰ä¾¿å˜åžè¾¨è¾©è¾«é标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳"], +["b240","ççžçŸç ç¤ç§ç©çªç­",11,"çºç»ç¼çžçž‚瞃瞆",5,"çžçžçž“",11,"瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶",4], +["b280","瞼瞾矀",12,"矎",8,"矘矙矚çŸ",4,"çŸ¤ç—…å¹¶çŽ»è æ’­æ‹¨é’µæ³¢åšå‹ƒæé“‚箔伯帛舶脖膊渤泊驳æ•åœå“ºè¡¥åŸ ä¸å¸ƒæ­¥ç°¿éƒ¨æ€–æ“¦çŒœè£ææ‰è´¢ç¬è¸©é‡‡å½©èœè”¡é¤å‚蚕残惭惨ç¿è‹èˆ±ä»“æ²§è—æ“糙槽曹è‰åŽ•ç­–ä¾§å†Œæµ‹å±‚è¹­æ’å‰èŒ¬èŒ¶æŸ¥ç¢´æ½å¯Ÿå²”å·®è¯§æ‹†æŸ´è±ºæ€æŽºè‰é¦‹è°—缠铲产é˜é¢¤æ˜ŒçŒ–"], +["b340","矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃",5,"ç Šç ‹ç Žç ç ç “砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿ç¡ç¡‚硃硄硆硈硉硊硋ç¡ç¡ç¡‘硓硔硘硙硚"], +["b380","硛硜硞",11,"硯",7,"硸硹硺硻硽",6,"场å°å¸¸é•¿å¿è‚ åŽ‚æ•žç•…å”±å€¡è¶…æŠ„é’žæœå˜²æ½®å·¢åµç‚’车扯撤掣彻澈郴臣辰尘晨忱沉陈è¶è¡¬æ’‘称城橙æˆå‘ˆä¹˜ç¨‹æƒ©æ¾„诚承逞骋秤åƒç—´æŒåŒ™æ± è¿Ÿå¼›é©°è€»é½¿ä¾ˆå°ºèµ¤ç¿…斥炽充冲虫崇宠抽酬畴踌稠æ„筹仇绸瞅丑臭åˆå‡ºæ©±åŽ¨èº‡é”„é›æ»é™¤æ¥š"], +["b440","碄碅碆碈碊碋ç¢ç¢ç¢’碔碕碖碙ç¢ç¢žç¢ ç¢¢ç¢¤ç¢¦ç¢¨",7,"碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌ç£ç£Žç£ç£‘磒磓磖磗磘磚",9], +["b480","磤磥磦磧磩磪磫磭",4,"磳磵磶磸磹磻",5,"礂礃礄礆",6,"础储矗æè§¦å¤„æ£å·ç©¿æ¤½ä¼ èˆ¹å–˜ä¸²ç–®çª—幢床闯创å¹ç‚Šæ¶é”¤åž‚春椿醇唇淳纯蠢戳绰疵茨ç£é›Œè¾žæ…ˆç“·è¯æ­¤åˆºèµæ¬¡èªè‘±å›±åŒ†ä»Žä¸›å‡‘粗醋簇促蹿篡窜摧崔催脆ç˜ç²¹æ·¬ç¿ æ‘å­˜å¯¸ç£‹æ’®æ“æŽªæŒ«é”™æ­è¾¾ç­”瘩打大呆歹傣戴带殆代贷袋待逮"], +["b540","ç¤",5,"礔",9,"礟",4,"礥",14,"礵",4,"礽礿祂祃祄祅祇祊",8,"祔祕祘祙祡祣"], +["b580","祤祦祩祪祫祬祮祰",6,"祹祻",4,"禂禃禆禇禈禉禋禌ç¦ç¦Žç¦ç¦‘禒怠耽担丹å•éƒ¸æŽ¸èƒ†æ—¦æ°®ä½†æƒ®æ·¡è¯žå¼¹è›‹å½“æŒ¡å…šè¡æ¡£åˆ€æ£è¹ˆå€’岛祷导到稻悼é“盗德得的蹬ç¯ç™»ç­‰çžªå‡³é‚“堤低滴迪敌笛狄涤翟嫡抵底地蒂第å¸å¼Ÿé€’缔颠掂滇碘点典é›åž«ç”µä½ƒç”¸åº—惦奠淀殿碉å¼é›•å‡‹åˆæŽ‰åŠé’“调跌爹碟è¶è¿­è°å "], +["b640","禓",6,"禛",11,"禨",10,"禴",4,"禼禿秂秄秅秇秈秊秌秎ç§ç§ç§“秔秖秗秙",5,"秠秡秢秥秨秪"], +["b680","秬秮秱",6,"秹秺秼秾秿ç¨ç¨„稅稇稈稉稊稌ç¨",4,"稕稖稘稙稛稜ä¸ç›¯å®é’‰é¡¶é¼Žé”­å®šè®¢ä¸¢ä¸œå†¬è‘£æ‡‚动栋侗æ«å†»æ´žå…œæŠ–æ–—é™¡è±†é€—ç—˜éƒ½ç£æ¯’犊独读堵ç¹èµŒæœé•€è‚šåº¦æ¸¡å¦’端短锻段断缎堆兑队对墩å¨è¹²æ•¦é¡¿å›¤é’ç›¾éæŽ‡å“†å¤šå¤ºåž›èº²æœµè·ºèˆµå‰æƒ°å •蛾峨鹅俄é¢è®¹å¨¥æ¶åŽ„æ‰¼é鄂饿æ©è€Œå„¿è€³å°”饵洱二"], +["b740","ç¨ç¨Ÿç¨¡ç¨¢ç¨¤",14,"稴稵稶稸稺稾穀",5,"穇",9,"ç©’",4,"穘",16], +["b780","ç©©",6,"穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎çªçªçª“窔窙窚窛窞窡窢贰å‘罚ç­ä¼ä¹é˜€æ³•ç藩帆番翻樊矾钒ç¹å‡¡çƒ¦å返范贩犯饭泛åŠèŠ³æ–¹è‚ªæˆ¿é˜²å¦¨ä»¿è®¿çººæ”¾è²éžå•¡é£žè‚¥åŒªè¯½å è‚ºåºŸæ²¸è´¹èŠ¬é…šå©æ°›åˆ†çº·åŸç„šæ±¾ç²‰å¥‹ä»½å¿¿æ„¤ç²ªä¸°å°æž«èœ‚峰锋风疯烽逢冯ç¼è®½å¥‰å‡¤ä½›å¦å¤«æ•·è‚¤å­µæ‰¶æ‹‚è¾å¹…氟符ä¼ä¿˜æœ"], +["b840","窣窤窧窩窪窫窮",4,"窴",10,"ç«€",10,"竌",9,"竗竘竚竛竜ç«ç«¡ç«¢ç«¤ç«§",5,"竮竰竱竲竳"], +["b880","ç«´",4,"竻竼竾笀ç¬ç¬‚笅笇笉笌ç¬ç¬Žç¬ç¬’笓笖笗笘笚笜ç¬ç¬Ÿç¬¡ç¬¢ç¬£ç¬§ç¬©ç¬­æµ®æ¶ªç¦è¢±å¼—甫抚辅俯釜斧脯腑府è…赴副覆赋å¤å‚…付阜父腹负富讣附妇缚å’å™¶å˜Žè¯¥æ”¹æ¦‚é’™ç›–æº‰å¹²ç”˜æ†æŸ‘ç«¿è‚赶感秆敢赣冈刚钢缸肛纲岗港æ ç¯™çš‹é«˜è†ç¾”糕æžé•ç¨¿å‘Šå“¥æ­Œææˆˆé¸½èƒ³ç–™å‰²é©è‘›æ ¼è›¤é˜éš”铬个å„给根跟耕更庚羹"], +["b940","笯笰笲笴笵笶笷笹笻笽笿",5,"筆筈筊ç­ç­Žç­“筕筗筙筜筞筟筡筣",10,"筯筰筳筴筶筸筺筼筽筿ç®ç®‚箃箄箆",6,"箎ç®"], +["b980","箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹",7,"篂篃範埂耿梗工攻功æ­é¾šä¾›èº¬å…¬å®«å¼“巩汞拱贡共钩勾沟苟狗垢构购够辜è‡å’•ç®ä¼°æ²½å­¤å§‘鼓å¤è›Šéª¨è°·è‚¡æ•…顾固雇刮瓜å‰å¯¡æŒ‚è¤‚ä¹–æ‹æ€ªæ£ºå…³å®˜å† è§‚ç®¡é¦†ç½æƒ¯çŒè´¯å…‰å¹¿é€›ç‘°è§„圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚æ£é”…郭国果裹过哈"], +["ba40","篅篈築篊篋ç¯ç¯Žç¯ç¯ç¯’篔",4,"篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲",4,"篸篹篺篻篽篿",7,"簈簉簊ç°ç°Žç°",5,"簗簘簙"], +["ba80","ç°š",4,"ç° ",5,"簨簩簫",12,"ç°¹",5,"ç±‚éª¸å­©æµ·æ°¦äº¥å®³éª‡é…£æ†¨é‚¯éŸ©å«æ¶µå¯’å‡½å–Šç½•ç¿°æ’¼ææ—±æ†¾æ‚焊汗汉夯æ­èˆªå£•嚎豪毫éƒå¥½è€—å·æµ©å‘µå–è·è核禾和何åˆç›’貉阂河涸赫è¤é¹¤è´ºå˜¿é»‘痕很狠æ¨å“¼äº¨æ¨ªè¡¡æ’轰哄烘虹鸿洪å®å¼˜çº¢å–‰ä¾¯çŒ´å¼åŽšå€™åŽå‘¼ä¹Žå¿½ç‘šå£¶è‘«èƒ¡è´ç‹ç³Šæ¹–"], +["bb40","籃",9,"籎",36,"ç±µ",5,"ç±¾",9], +["bb80","粈粊",6,"粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴",4,"粺粻弧虎唬护互沪户花哗åŽçŒ¾æ»‘ç”»åˆ’åŒ–è¯æ§å¾Šæ€€æ·®åæ¬¢çŽ¯æ¡“è¿˜ç¼“æ¢æ‚£å”¤ç—ªè±¢ç„•æ¶£å®¦å¹»è’æ…Œé»„磺è—簧皇凰惶煌晃幌æè°Žç°æŒ¥è¾‰å¾½æ¢è›”å›žæ¯æ‚”æ…§å‰æƒ æ™¦è´¿ç§½ä¼šçƒ©æ±‡è®³è¯²ç»˜è¤æ˜å©šé­‚æµ‘æ··è±æ´»ä¼™ç«èŽ·æˆ–æƒ‘éœè´§ç¥¸å‡»åœ¾åŸºæœºç•¸ç¨½ç§¯ç®•"], +["bc40","粿糀糂糃糄糆糉糋糎",6,"糘糚糛ç³ç³žç³¡",6,"糩",5,"ç³°",7,"糹糺糼",13,"ç´‹",5], +["bc80","ç´‘",14,"紡紣紤紥紦紨紩紪紬紭紮細",6,"è‚Œé¥¥è¿¹æ¿€è®¥é¸¡å§¬ç»©ç¼‰å‰æžæ£˜è¾‘ç±é›†åŠæ€¥ç–¾æ±²å³å«‰çº§æŒ¤å‡ è„Šå·±è“ŸæŠ€å†€å­£ä¼Žç¥­å‰‚悸济寄寂计记既忌际妓继纪嘉枷夹佳家加èšé¢Šè´¾ç”²é’¾å‡ç¨¼ä»·æž¶é©¾å«æ­¼ç›‘åšå°–笺间煎兼肩艰奸缄茧检柬碱硷拣æ¡ç®€ä¿­å‰ªå‡è槛鉴践贱è§é”®ç®­ä»¶"], +["bd40","ç´·",54,"絯",7], +["bd80","絸",32,"å¥èˆ°å‰‘é¥¯æ¸æº…涧建僵姜将浆江疆蒋桨奖讲匠酱é™è•‰æ¤’ç¤ç„¦èƒ¶äº¤éƒŠæµ‡éª„娇嚼æ…铰矫侥脚狡角饺缴绞剿教酵轿较å«çª–æ­æŽ¥çš†ç§¸è¡—é˜¶æˆªåŠ«èŠ‚æ¡”æ°æ·ç«ç«­æ´ç»“è§£å§æˆ’è—‰èŠ¥ç•Œå€Ÿä»‹ç–¥è¯«å±Šå·¾ç­‹æ–¤é‡‘ä»Šæ´¥è¥Ÿç´§é”¦ä»…è°¨è¿›é³æ™‹ç¦è¿‘烬浸"], +["be40","ç¶™",12,"ç¶§",6,"綯",42], +["be80","ç·š",32,"尽劲è†å…¢èŒŽç›æ™¶é²¸äº¬æƒŠç²¾ç²³ç»äº•警景颈é™å¢ƒæ•¬é•œå¾„ç—‰é–竟竞净炯窘æªç©¶çº çŽ–éŸ­ä¹…ç¸ä¹é…’厩救旧臼舅咎就疚鞠拘狙疽居驹èŠå±€å’€çŸ©ä¸¾æ²®èšæ‹’æ®å·¨å…·è·è¸žé”¯ä¿±å¥æƒ§ç‚¬å‰§æé¹ƒå¨Ÿå€¦çœ·å·ç»¢æ’…攫抉掘倔爵觉决诀ç»å‡èŒé’§å†›å›å³»"], +["bf40","ç·»",62], +["bf80","縺縼",4,"繂",4,"繈",21,"俊竣浚郡éªå–€å’–å¡å’¯å¼€æ©æ¥·å‡¯æ…¨åˆŠå ªå‹˜åŽç çœ‹åº·æ…·ç³ æ‰›æŠ—亢炕考拷烤é å·è‹›æŸ¯æ£µç£•é¢—ç§‘å£³å’³å¯æ¸´å…‹åˆ»å®¢è¯¾è‚¯å•ƒåž¦æ³å‘å­ç©ºæå­”æŽ§æŠ å£æ‰£å¯‡æž¯å“­çªŸè‹¦é…·åº“裤夸垮挎跨胯å—筷侩快宽款匡ç­ç‹‚框矿眶旷况äºç›”岿窥葵奎é­å‚€"], +["c040","繞",35,"纃",23,"纜çºçºž"], +["c080","纮纴纻纼绖绤绬绹缊ç¼ç¼žç¼·ç¼¹ç¼»",6,"罃罆",9,"ç½’ç½“é¦ˆæ„§æºƒå¤æ˜†æ†å›°æ‹¬æ‰©å»“阔垃拉喇蜡腊辣啦莱æ¥èµ–è“å©ªæ æ‹¦ç¯®é˜‘兰澜谰æ½è§ˆæ‡’ç¼†çƒ‚æ»¥ç…æ¦”狼廊郎朗浪æžåŠ³ç‰¢è€ä½¬å§¥é…ªçƒ™æ¶å‹’ä¹é›·é•­è•¾ç£Šç´¯å„¡åž’擂肋类泪棱楞冷厘梨çŠé»Žç¯±ç‹¸ç¦»æ¼“ç†æŽé‡Œé²¤ç¤¼èމè”åæ —丽厉励砾历利傈例ä¿"], +["c140","罖罙罛罜ç½ç½žç½ ç½£",4,"罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂",7,"羋ç¾ç¾",4,"羕",4,"羛羜羠羢羣羥羦羨",6,"ç¾±"], +["c180","ç¾³",4,"羺羻羾翀翂翃翄翆翇翈翉翋ç¿ç¿",4,"ç¿–ç¿—ç¿™",5,"翢翣痢立粒沥隶力璃哩俩è”莲连镰廉怜涟帘敛脸链æ‹ç‚¼ç»ƒç²®å‡‰æ¢ç²±è‰¯ä¸¤è¾†é‡æ™¾äº®è°…æ’©èŠåƒšç–—ç‡Žå¯¥è¾½æ½¦äº†æ’‚é•£å»–æ–™åˆ—è£‚çƒˆåŠ£çŒŽç³æž—磷霖临邻鳞淋凛èµå拎玲è±é›¶é¾„铃伶羚凌çµé™µå²­é¢†å¦ä»¤æºœç‰æ¦´ç¡«é¦ç•™åˆ˜ç˜¤æµæŸ³å…­é¾™è‹å’™ç¬¼çª¿"], +["c240","翤翧翨翪翫翬翭翯翲翴",6,"翽翾翿耂耇耈耉耊耎è€è€‘耓耚耛è€è€žè€Ÿè€¡è€£è€¤è€«",5,"耲耴耹耺耼耾è€èè„è…è‡èˆè‰èŽèèè‘è“è•è–è—"], +["c280","è™è›",13,"è«",5,"è²",11,"隆垄拢陇楼娄æ‚篓æ¼é™‹èЦå¢é¢…åºç‚‰æŽ³å¤è™é²éº“碌露路赂鹿潞禄录陆戮驴å•é“侣旅履屡缕虑氯律率滤绿峦挛孪滦åµä¹±æŽ ç•¥æŠ¡è½®ä¼¦ä»‘沦纶论èèžºç½—é€»é”£ç®©éª¡è£¸è½æ´›éª†ç»œå¦ˆéº»çŽ›ç èš‚马骂嘛å—埋买麦å–迈脉瞒馒蛮满蔓曼慢漫"], +["c340","è¾è‚肂肅肈肊è‚",5,"肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇",4,"èƒ",6,"胘胟胠胢胣胦胮胵胷胹胻胾胿脀è„脃脄脅脇脈脋"], +["c380","脌脕脗脙脛脜è„脟",12,"脭脮脰脳脴脵脷脹",4,"脿谩芒茫盲氓忙莽猫茅锚毛矛铆å¯èŒ‚å†’å¸½è²Œè´¸ä¹ˆçŽ«æžšæ¢…é…¶éœ‰ç…¤æ²¡çœ‰åª’é•æ¯ç¾Žæ˜§å¯å¦¹åªšé—¨é—·ä»¬èŒè’™æª¬ç›Ÿé”°çŒ›æ¢¦å­Ÿçœ¯é†šé¡ç³œè¿·è°œå¼¥ç±³ç§˜è§…泌蜜密幂棉眠绵冕å…勉娩缅é¢è‹—æçž„è—ç§’æ¸ºåº™å¦™è”‘ç­æ°‘æŠ¿çš¿æ•æ‚¯é—½æ˜ŽèžŸé¸£é“­å命谬摸"], +["c440","è…€",5,"腇腉è…è…Žè…腒腖腗腘腛",4,"腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸è†è†ƒ",4,"膉膋膌è†è†Žè†è†’",5,"膙膚膞",4,"膤膥"], +["c480","膧膩膫",7,"膴",5,"膼膽膾膿臄臅臇臈臉臋è‡",6,"æ‘¹è˜‘æ¨¡è†œç£¨æ‘©é­”æŠ¹æœ«èŽ«å¢¨é»˜æ²«æ¼ å¯žé™Œè°‹ç‰ŸæŸæ‹‡ç‰¡äº©å§†æ¯å¢“暮幕募慕木目ç¦ç‰§ç©†æ‹¿å“ªå‘钠那娜纳氖乃奶è€å¥ˆå—男难囊挠脑æ¼é—¹æ·–å‘¢é¦å†…嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵æ»å¿µå¨˜é…¿é¸Ÿå°¿æè‚å­½å•®é•Šé•æ¶…您柠狞å‡å®"], +["c540","臔",14,"臤臥臦臨臩臫臮",4,"臵",5,"臽臿舃與",4,"舎èˆèˆ‘舓舕",5,"èˆèˆ èˆ¤èˆ¥èˆ¦èˆ§èˆ©èˆ®èˆ²èˆºèˆ¼èˆ½èˆ¿"], +["c580","艀è‰è‰‚艃艅艆艈艊艌è‰è‰Žè‰",7,"艙艛艜è‰è‰žè‰ ",7,"艩拧泞牛扭钮纽脓浓农弄奴努怒女暖è™ç–ŸæŒªæ‡¦ç³¯è¯ºå“¦æ¬§é¸¥æ®´è—•å‘•å¶æ²¤å•ªè¶´çˆ¬å¸•æ€•ç¶æ‹æŽ’牌徘湃派攀潘盘ç£ç›¼ç•”判å›ä¹“庞æ—耪胖抛咆刨炮è¢è·‘泡呸胚培裴赔陪é…ä½©æ²›å–·ç›†ç °æŠ¨çƒ¹æ¾Žå½­è“¬æ£šç¡¼ç¯·è†¨æœ‹é¹æ§ç¢°å¯ç ’éœ¹æ‰¹æŠ«åŠˆçµæ¯—"], +["c640","艪艫艬艭艱艵艶艷艸艻艼芀èŠèŠƒèŠ…èŠ†èŠ‡èŠ‰èŠŒèŠèŠ“èŠ”èŠ•èŠ–èŠšèŠ›èŠžèŠ èŠ¢èŠ£èŠ§èŠ²èŠµèŠ¶èŠºèŠ»èŠ¼èŠ¿è‹€è‹‚è‹ƒè‹…è‹†è‹‰è‹è‹–苙苚è‹è‹¢è‹§è‹¨è‹©è‹ªè‹¬è‹­è‹®è‹°è‹²è‹³è‹µè‹¶è‹¸"], +["c680","苺苼",4,"茊茋èŒèŒèŒ’茓茖茘茙èŒ",9,"茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻å±è­¬ç¯‡å片骗飘漂瓢票撇瞥拼频贫å“è˜ä¹’åªè‹¹è平凭瓶评å±å¡æ³¼é¢‡å©†ç ´é­„迫粕剖扑铺仆莆葡è©è’²åŸ”朴圃普浦谱æ›ç€‘期欺栖戚妻七凄漆柒æ²å…¶æ£‹å¥‡æ­§ç•¦å´Žè„齿——祈ç¥éª‘起岂乞ä¼å¯å¥‘砌器气迄弃汽泣讫æŽ"], +["c740","茾茿èè‚è„è…èˆèŠ",4,"è“è•",4,"èè¢è°",6,"è¹èºè¾",6,"莇莈莊莋莌èŽèŽèŽèŽ‘èŽ”èŽ•èŽ–èŽ—èŽ™èŽšèŽèŽŸèŽ¡",6,"莬莭莮"], +["c780","莯莵莻莾莿è‚èƒè„è†èˆè‰è‹èèŽèè‘è’è“è•è—è™èšè›èžè¢è£è¤è¦è§è¨è«è¬è­æ°æ´½ç‰µæ‰¦é’Žé“…åƒè¿ç­¾ä»Ÿè°¦ä¹¾é»”钱钳剿½œé£æµ…谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭ä¿çªåˆ‡èŒ„且怯窃钦侵亲秦ç´å‹¤èŠ¹æ“’ç¦½å¯æ²é’è½»æ°¢å€¾å¿æ¸…擎晴氰情顷请庆ç¼ç©·ç§‹ä¸˜é‚±çƒæ±‚囚酋泅趋区蛆曲躯屈驱渠"], +["c840","è®è¯è³",4,"èºè»è¼è¾è¿è€è‚è…è‡èˆè‰èŠèè’",5,"è™èšè›èž",5,"è©",7,"è²",5,"è¹èºè»è¾",7,"葇葈葉"], +["c880","葊",6,"è‘’",4,"葘è‘葞葟葠葢葤",4,"葪葮葯葰葲葴葷葹葻葼å–娶龋趣去圈颧æƒé†›æ³‰å…¨ç—Šæ‹³çŠ¬åˆ¸åŠç¼ºç‚”瘸å´é¹Šæ¦·ç¡®é›€è£™ç¾¤ç„¶ç‡ƒå†‰æŸ“瓤壤攘嚷让饶扰绕惹热壬ä»äººå¿éŸ§ä»»è®¤åˆƒå¦Šçº«æ‰”仿—¥æˆŽèŒ¸è“‰è£èžç†”æº¶å®¹ç»’å†—æ‰æŸ”肉茹蠕儒孺如辱乳æ±å…¥è¤¥è½¯é˜®è•Šç‘žé”闰润若弱撒洒è¨è…®é³ƒå¡žèµ›ä¸‰å"], +["c940","葽",4,"蒃蒄蒅蒆蒊è’è’",7,"蒘蒚蒛è’è’žè’Ÿè’ è’¢",12,"蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎è“蓒蓔蓕蓗"], +["c980","蓘",4,"蓞蓡蓢蓤蓧",4,"蓭蓮蓯蓱",10,"蓽蓾蔀è”蔂伞散桑嗓丧æ”骚扫嫂瑟色涩森僧莎砂æ€åˆ¹æ²™çº±å‚»å•¥ç…žç­›æ™’çŠè‹«æ‰å±±åˆ ç…½è¡«é—ªé™•æ“…èµ¡è†³å–„æ±•æ‰‡ç¼®å¢’ä¼¤å•†èµæ™Œä¸Šå°šè£³æ¢¢æŽç¨çƒ§èŠå‹ºéŸ¶å°‘哨邵ç»å¥¢èµŠè›‡èˆŒèˆèµ¦æ‘„射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲å‡ç»³"], +["ca40","蔃",8,"è”蔎è”è”蔒蔔蔕蔖蔘蔙蔛蔜è”蔞蔠蔢",8,"è”­",9,"蔾",4,"蕄蕅蕆蕇蕋",10], +["ca80","蕗蕘蕚蕛蕜è•蕟",4,"蕥蕦蕧蕩",8,"蕳蕵蕶蕷蕸蕼蕽蕿薀è–çœç››å‰©èƒœåœ£å¸ˆå¤±ç‹®æ–½æ¹¿è¯—尸虱å石拾时什食蚀实识å²çŸ¢ä½¿å±Žé©¶å§‹å¼ç¤ºå£«ä¸–柿事拭誓é€åŠ¿æ˜¯å—œå™¬é€‚ä»•ä¾é‡Šé¥°æ°å¸‚æƒå®¤è§†è¯•收手首守寿授售å—瘦兽蔬枢梳殊抒输å”舒淑ç–书赎孰熟薯暑曙署蜀é»é¼ å±žæœ¯è¿°æ ‘æŸæˆç«–墅庶数漱"], +["cb40","薂薃薆薈",6,"è–",10,"è–",6,"薥薦薧薩薫薬薭薱",5,"薸薺",6,"è—‚",6,"è—Š",4,"è—‘è—’"], +["cb80","藔藖",5,"è—",6,"藥藦藧藨藪",14,"æ•åˆ·è€æ‘”衰甩帅栓拴霜åŒçˆ½è°æ°´ç¡ç¨Žå®çž¬é¡ºèˆœè¯´ç¡•æœ”çƒæ–¯æ’•嘶æ€ç§å¸ä¸æ­»è‚†å¯ºå—£å››ä¼ºä¼¼é¥²å·³æ¾è€¸æ€‚颂é€å®‹è®¼è¯µæœè‰˜æ“žå—½è‹é…¥ä¿—素速粟僳塑溯宿诉肃酸蒜算虽隋éšç»¥é«“碎å²ç©—é‚隧祟孙æŸç¬‹è“‘梭唆缩çç´¢é”æ‰€å¡Œä»–它她塔"], +["cc40","藹藺藼藽藾蘀",4,"蘆",10,"蘒蘓蘔蘕蘗",15,"蘨蘪",13,"蘹蘺蘻蘽蘾蘿虀"], +["cc80","è™",11,"虒虓處",4,"虛虜è™è™Ÿè™ è™¡è™£",7,"ç­æŒžè¹‹è¸èƒŽè‹”æŠ¬å°æ³°é…žå¤ªæ€æ±°åæ‘Šè´ªç˜«æ»©å›æª€ç—°æ½­è°­è°ˆå¦æ¯¯è¢’碳探å¹ç‚­æ±¤å¡˜æªå ‚棠膛å”ç³–å€˜èººæ·Œè¶Ÿçƒ«æŽæ¶›æ»”ç»¦è„æ¡ƒé€ƒæ·˜é™¶è®¨å¥—特藤腾疼誊梯剔踢锑æé¢˜è¹„å•¼ä½“æ›¿åšæƒ•涕剃屉天添填田甜æ¬èˆ”腆挑æ¡è¿¢çœºè·³è´´é“帖厅å¬çƒƒ"], +["cd40","虭虯虰虲",6,"蚃",6,"蚎",4,"蚔蚖",5,"èšž",4,"蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻",4,"è›è›‚蛃蛅蛈蛌è›è›’蛓蛕蛖蛗蛚蛜"], +["cd80","è›è› è›¡è›¢è›£è›¥è›¦è›§è›¨è›ªè›«è›¬è›¯è›µè›¶è›·è›ºè›»è›¼è›½è›¿èœèœ„蜅蜆蜋蜌蜎èœèœèœ‘蜔蜖汀廷åœäº­åº­æŒºè‰‡é€šæ¡é…®çž³åŒé“œå½¤ç«¥æ¡¶æ…ç­’ç»Ÿç—›å·æŠ•å¤´é€å‡¸ç§ƒçªå›¾å¾’途涂屠土åå…”æ¹å›¢æŽ¨é¢“腿蜕褪退åžå±¯è‡€æ‹–托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄å¨"], +["ce40","蜙蜛èœèœŸèœ èœ¤èœ¦èœ§èœ¨èœªèœ«èœ¬èœ­èœ¯èœ°èœ²èœ³èœµèœ¶èœ¸èœ¹èœºèœ¼èœ½è€",6,"èŠè‹èèèè‘è’è”è•è–è˜èš",5,"è¡è¢è¦",7,"è¯è±è²è³èµ"], +["ce80","è·è¸è¹èºè¿èž€èžèž„螆螇螉螊螌螎",4,"螔螕螖螘",6,"èž ",4,"å·å¾®å±éŸ¦è¿æ¡…围唯惟为æ½ç»´è‹‡èŽå§”伟伪尾纬未蔚味ç•胃喂é­ä½æ¸­è°“尉慰å«ç˜Ÿæ¸©èšŠæ–‡é—»çº¹å»ç¨³ç´Šé—®å—¡ç¿ç“®æŒèœ—æ¶¡çªæˆ‘æ–¡å§æ¡æ²ƒå·«å‘œé’¨ä¹Œæ±¡è¯¬å±‹æ— èŠœæ¢§å¾å´æ¯‹æ­¦äº”æ‚åˆèˆžä¼ä¾®åžæˆŠé›¾æ™¤ç‰©å‹¿åŠ¡æ‚Ÿè¯¯æ˜”ç†™æžè¥¿ç¡’矽晰嘻å¸é”¡ç‰º"], +["cf40","螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿èŸ",4,"蟇蟈蟉蟌",4,"蟔",6,"蟜èŸèŸžèŸŸèŸ¡èŸ¢èŸ£èŸ¤èŸ¦èŸ§èŸ¨èŸ©èŸ«èŸ¬èŸ­èŸ¯",9], +["cf80","蟺蟻蟼蟽蟿蠀è è ‚è „",5,"è ‹",7,"蠔蠗蠘蠙蠚蠜",4,"蠣稀æ¯å¸Œæ‚‰è†å¤•惜熄烯溪æ±çŠ€æª„è¢­å¸­ä¹ åª³å–œé“£æ´—ç³»éš™æˆç»†çžŽè™¾åŒ£éœžè¾–暇峡侠狭下厦å¤å“掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷é™çº¿ç›¸åŽ¢é•¶é¦™ç®±è¥„æ¹˜ä¹¡ç¿”ç¥¥è¯¦æƒ³å“享项巷橡åƒå‘象è§ç¡éœ„削哮嚣销消宵淆晓"], +["d040","è ¤",13,"è ³",5,"蠺蠻蠽蠾蠿è¡è¡‚衃衆",5,"衎",5,"衕衖衘衚",6,"衦衧衪衭衯衱衳衴衵衶衸衹衺"], +["d080","衻衼袀袃袆袇袉袊袌袎è¢è¢è¢‘袓袔袕袗",4,"è¢",4,"袣袥",5,"å°å­æ ¡è‚–啸笑效楔些歇èŽéž‹å挟æºé‚ªæ–œèƒè°å†™æ¢°å¸èŸ¹æ‡ˆæ³„æ³»è°¢å±‘è–ªèŠ¯é”Œæ¬£è¾›æ–°å¿»å¿ƒä¿¡è¡…æ˜Ÿè…¥çŒ©æƒºå…´åˆ‘åž‹å½¢é‚¢è¡Œé†’å¹¸ææ€§å§“兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须å¾è®¸è“„酗噿—­åºç•œæ¤çµ®å©¿ç»ªç»­è½©å–§å®£æ‚¬æ—‹çŽ„"], +["d140","袬袮袯袰袲",4,"袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌è£è£è£è£‘裓裖裗裚",4,"裠裡裦裧裩",6,"裲裵裶裷裺裻製裿褀è¤è¤ƒ",5], +["d180","褉褋",4,"褑褔",4,"褜",4,"褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚é´è–›å­¦ç©´é›ªè¡€å‹‹ç†å¾ªæ—¬è¯¢å¯»é©¯å·¡æ®‰æ±›è®­è®¯é€Šè¿…压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹ç›ä¸¥ç ”èœ’å²©å»¶è¨€é¢œé˜Žç‚Žæ²¿å¥„æŽ©çœ¼è¡æ¼”艳堰燕厌砚é›å”å½¦ç„°å®´è°šéªŒæ®ƒå¤®é¸¯ç§§æ¨æ‰¬ä½¯ç–¡ç¾Šæ´‹é˜³æ°§ä»°ç—’养样漾邀腰妖瑶"], +["d240","褸",8,"襂襃襅",24,"襠",5,"襧",19,"襼"], +["d280","襽襾覀覂覄覅覇",26,"摇尧é¥çª‘谣姚咬舀è¯è¦è€€æ¤°å™Žè€¶çˆ·é‡Žå†¶ä¹Ÿé¡µæŽ–ä¸šå¶æ›³è…‹å¤œæ¶²ä¸€å£¹åŒ»æ–铱ä¾ä¼Šè¡£é¢å¤·é—ç§»ä»ªèƒ°ç–‘æ²‚å®œå§¨å½æ¤…èšå€šå·²ä¹™çŸ£ä»¥è‰ºæŠ‘æ˜“é‚‘å±¹äº¿å½¹è‡†é€¸è‚„ç–«äº¦è£”æ„æ¯…忆义益溢诣议谊译异翼翌绎茵è«å› æ®·éŸ³é˜´å§»åŸé“¶æ·«å¯…饮尹引éš"], +["d340","覢",30,"觃è§è§“觔觕觗觘觙觛è§è§Ÿè§ è§¡è§¢è§¤è§§è§¨è§©è§ªè§¬è§­è§®è§°è§±è§²è§´",6], +["d380","è§»",4,"è¨",5,"計",21,"å°è‹±æ¨±å©´é¹°åº”缨莹è¤è¥è§è‡è¿Žèµ¢ç›ˆå½±é¢–硬映哟拥佣臃痈庸é›è¸Šè›¹å’泳涌永æ¿å‹‡ç”¨å¹½ä¼˜æ‚ å¿§å°¤ç”±é‚®é“€çŠ¹æ²¹æ¸¸é…‰æœ‰å‹å³ä½‘釉诱åˆå¹¼è¿‚æ·¤äºŽç›‚æ¦†è™žæ„šèˆ†ä½™ä¿žé€¾é±¼æ„‰æ¸æ¸”隅予娱雨与屿禹宇语羽玉域芋éƒåé‡å–»å³ªå¾¡æ„ˆæ¬²ç‹±è‚²èª‰"], +["d440","訞",31,"訿",8,"詉",21], +["d480","詟",25,"詺",6,"浴寓裕预豫驭鸳渊冤元垣è¢åŽŸæ´è¾•园员圆猿æºç¼˜è¿œè‹‘愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨å…è¿è•´é…晕韵孕åŒç ¸æ‚栽哉ç¾å®°è½½å†åœ¨å’±æ”’暂赞赃è„葬é­ç³Ÿå‡¿è—»æž£æ—©æ¾¡èš¤èºå™ªé€ çš‚ç¶ç‡¥è´£æ‹©åˆ™æ³½è´¼æ€Žå¢žæ†Žæ›¾èµ æ‰Žå–³æ¸£æœ­è½§"], +["d540","èª",7,"誋",7,"誔",46], +["d580","諃",32,"铡闸眨栅榨咋ä¹ç‚¸è¯ˆæ‘˜æ–‹å®…çª„å€ºå¯¨çž»æ¯¡è©¹ç²˜æ²¾ç›æ–©è¾—å´­å±•è˜¸æ ˆå æˆ˜ç«™æ¹›ç»½æ¨Ÿç« å½°æ¼³å¼ æŽŒæ¶¨æ–丈å¸è´¦ä»—胀瘴障招昭找沼赵照罩兆肇å¬é®æŠ˜å“²è›°è¾™è€…é”—è”—è¿™æµ™çæ–ŸçœŸç”„砧臻贞针侦枕疹诊震振镇阵蒸挣çå¾ç‹°äº‰æ€”整拯正政"], +["d640","諤",34,"謈",27], +["d680","謤謥謧",30,"帧症郑è¯èŠæžæ”¯å±èœ˜çŸ¥è‚¢è„‚æ±ä¹‹ç»‡èŒç›´æ¤æ®–æ‰§å€¼ä¾„å€æŒ‡æ­¢è¶¾åªæ—¨çº¸å¿—挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终ç§è‚¿é‡ä»²ä¼—èˆŸå‘¨å·žæ´²è¯Œç²¥è½´è‚˜å¸šå’’çš±å®™æ˜¼éª¤ç æ ªè››æœ±çŒªè¯¸è¯›é€ç«¹çƒ›ç…®æ‹„瞩嘱主著柱助蛀贮铸筑"], +["d740","è­†",31,"è­§",4,"è­­",25], +["d780","讇",24,"讬讱讻诇è¯è¯ªè°‰è°žä½æ³¨ç¥é©»æŠ“爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘å ç¼€è°†å‡†æ‰æ‹™å“桌ç¢èŒé…Œå•„ç€ç¼æµŠå…¹å’¨èµ„姿滋淄孜紫仔籽滓å­è‡ªæ¸å­—é¬ƒæ£•è¸ªå®—ç»¼æ€»çºµé‚¹èµ°å¥æç§Ÿè¶³å’æ—ç¥–è¯…é˜»ç»„é’»çº‚å˜´é†‰æœ€ç½ªå°Šéµæ˜¨å·¦ä½æŸžåšä½œå座"], +["d840","è°¸",8,"豂豃豄豅豈豊豋è±",7,"豖豗豘豙豛",5,"è±£",6,"豬",6,"豴豵豶豷豻",6,"貃貄貆貇"], +["d880","貈貋è²",6,"貕貖貗貙",20,"äºä¸Œå…€ä¸å»¿å…ä¸•äº˜ä¸žé¬²å­¬å™©ä¸¨ç¦ºä¸¿åŒ•ä¹‡å¤­çˆ»å®æ°å›Ÿèƒ¤é¦—毓ç¾é¼—丶亟é¼ä¹œä¹©äº“芈孛啬å˜ä»„åŽåŽåŽ£åŽ¥åŽ®é¥èµåŒšåµåŒ¦åŒ®åŒ¾èµœå¦å£åˆ‚刈刎刭刳刿剀剌剞剡剜蒯剽劂åŠåŠåŠ“å†‚ç½”äº»ä»ƒä»‰ä»‚ä»¨ä»¡ä»«ä»žä¼›ä»³ä¼¢ä½¤ä»µä¼¥ä¼§ä¼‰ä¼«ä½žä½§æ”¸ä½šä½"], +["d940","è²®",62], +["d980","è³­",32,"佟佗伲伽佶佴侑侉侃ä¾ä½¾ä½»ä¾ªä½¼ä¾¬ä¾”俦俨俪俅俚俣俜俑俟俸倩åŒä¿³å€¬å€å€®å€­ä¿¾å€œå€Œå€¥å€¨å¾åƒå•åˆåŽå¬å»å‚¥å‚§å‚©å‚ºåƒ–å„†åƒ­åƒ¬åƒ¦åƒ®å„‡å„‹ä»æ°½ä½˜ä½¥ä¿Žé¾ æ±†ç±´å…®å·½é»‰é¦˜å†å¤”勹åŒè¨‡åŒå‡«å¤™å…•亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼"], +["da40","è´Ž",14,"贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸",8,"趂趃趆趇趈趉趌",4,"è¶’è¶“è¶•",9,"è¶ è¶¡"], +["da80","趢趤",12,"趲趶趷趹趻趽跀è·è·‚跅跇跈跉跊è·è·è·’跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋è¯è¯Žè¯’诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌è°è°‘谒谔谕谖谙谛谘è°è°Ÿè° è°¡è°¥è°§è°ªè°«è°®è°¯è°²è°³è°µè°¶å©åºé˜é˜¢é˜¡é˜±é˜ªé˜½é˜¼é™‚陉陔陟陧陬陲陴隈éšéš—éš°é‚—é‚›é‚邙邬邡邴邳邶邺"], +["db40","跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾",6,"踆踇踈踋è¸è¸Žè¸è¸‘踒踓踕",7,"踠踡踤",4,"踫踭踰踲踳踴踶踷踸踻踼踾"], +["db80","踿蹃蹅蹆蹌",4,"蹓",5,"蹚",11,"蹧蹨蹪蹫蹮蹱邸邰éƒéƒ…邾éƒéƒ„郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆åˆå¥‚劢劬劭劾哿å‹å‹–å‹°åŸç‡®çŸå»´å‡µå‡¼é¬¯å޶å¼ç•šå·¯åŒåž©åž¡å¡¾å¢¼å£…壑圩圬圪圳圹圮圯åœåœ»å‚å©åž…å«åž†å¼å»å¨å­å¶å³åž­åž¤åžŒåž²åŸåž§åž´åž“垠埕埘埚埙埒垸埴埯埸埤åŸ"], +["dc40","蹳蹵蹷",4,"蹽蹾躀躂躃躄躆躈",6,"躑躒躓躕",6,"èºèºŸ",11,"躭躮躰躱躳",6,"躻",7], +["dc80","軃",10,"è»",21,"å ‹å åŸ½åŸ­å €å žå ™å¡„堠塥塬å¢å¢‰å¢šå¢€é¦¨é¼™æ‡¿è‰¹è‰½è‰¿èŠèŠŠèŠ¨èŠ„èŠŽèŠ‘èŠ—èŠ™èŠ«èŠ¸èŠ¾èŠ°è‹ˆè‹Šè‹£èŠ˜èŠ·èŠ®è‹‹è‹Œè‹èŠ©èŠ´èŠ¡èŠªèŠŸè‹„è‹ŽèŠ¤è‹¡èŒ‰è‹·è‹¤èŒèŒ‡è‹œè‹´è‹’苘茌苻苓茑茚茆茔茕苠苕茜è‘è›èœèŒˆèŽ’èŒ¼èŒ´èŒ±èŽ›èžèŒ¯èè‡èƒèŸè€èŒ—è èŒ­èŒºèŒ³è¦è¥"], +["dd40","軥",62], +["dd80","輤",32,"è¨èŒ›è©è¬èªè­è®èްè¸èŽ³èŽ´èŽ èŽªèŽ“èŽœèŽ…è¼èŽ¶èŽ©è½èޏè»èŽ˜èŽžèŽ¨èŽºèŽ¼èèè¥è˜å ‡è˜è‹èè½è–èœè¸è‘è†è”èŸèèƒè¸è¹èªè…è€è¦è°è¡è‘œè‘‘葚葙葳蒇蒈葺蒉葸è¼è‘†è‘©è‘¶è’Œè’Žè±è‘­è“è“è“蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌ç”蔸蓰蔹蔟蔺"], +["de40","è½…",32,"轪辀辌辒è¾è¾ è¾¡è¾¢è¾¤è¾¥è¾¦è¾§è¾ªè¾¬è¾­è¾®è¾¯è¾²è¾³è¾´è¾µè¾·è¾¸è¾ºè¾»è¾¼è¾¿è¿€è¿ƒè¿†"], +["de80","迉",4,"è¿è¿’迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇è–蕹薮薜薅薹薷薰藓è—藜藿蘧蘅蘩蘖蘼廾弈夼å¥è€·å¥•奚奘åŒå°¢å°¥å°¬å°´æ‰Œæ‰ªæŠŸæŠ»æ‹Šæ‹šæ‹—æ‹®æŒ¢æ‹¶æŒ¹æ‹æƒæŽ­æ¶æ±æºæŽŽæŽ´æ­æŽ¬æŽŠæ©æŽ®æŽ¼æ²æ¸æ æ¿æ„æžæŽæ‘’æ†æŽ¾æ‘…æ‘æ‹æ›æ æŒæ¦æ¡æ‘žæ’„æ‘­æ’–"], +["df40","這逜連逤逥逧",5,"逰",4,"逷逹逺逽逿é€éƒé…é†éˆ",4,"éŽé”é•é–é™éšéœ",5,"é¤é¦é§é©éªé«é¬é¯",4,"é¶",6,"é¾é‚"], +["df80","還邅邆邇邉邊邌",4,"é‚’é‚”é‚–é‚˜é‚šé‚œé‚žé‚Ÿé‚ é‚¤é‚¥é‚§é‚¨é‚©é‚«é‚­é‚²é‚·é‚¼é‚½é‚¿éƒ€æ‘ºæ’·æ’¸æ’™æ’ºæ“€æ“æ“—擤擢攉攥攮弋忒甙弑åŸå±å½å©å¨å»å’å–å†å‘‹å‘’呓呔呖呃å¡å‘—å‘™å£å²å’‚咔呷呱呤咚咛咄呶呦å’å“咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤å“å“哞唛哧唠哽唔哳唢唣å”唑唧唪啧å–喵啉啭å•啕唿å•唼"], +["e040","郂郃郆郈郉郋郌éƒéƒ’郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀é„鄃鄅",19,"鄚鄛鄜"], +["e080","é„鄟鄠鄡鄤",10,"鄰鄲",6,"鄺",8,"酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈å–喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦å—嗄嗯嗥嗲嗳嗌å—嗨嗵嗤辔嘞嘈嘌å˜å˜¤å˜£å—¾å˜€å˜§å˜­å™˜å˜¹å™—嘬å™å™¢å™™å™œå™Œå™”嚆噤噱噫噻噼嚅嚓嚯囔囗å›å›¡å›µå›«å›¹å›¿åœ„圊圉圜å¸å¸™å¸”帑帱帻帼"], +["e140","酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀",4,"醆醈醊醎é†é†“",6,"醜",5,"醤",5,"醫醬醰醱醲醳醶醷醸醹醻"], +["e180","醼",10,"釈釋é‡é‡’",9,"é‡",8,"帷幄幔幛幞幡岌屺å²å²å²–岈岘岙岑岚岜岵岢岽岬岫岱岣å³å²·å³„峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯åµåµ«åµ‹åµŠåµ©åµ´å¶‚å¶™å¶è±³å¶·å·…彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃ç‹ç‹Žç‹ç‹’狨狯狩狲狴狷çŒç‹³çŒƒç‹º"], +["e240","釦",62], +["e280","鈥",32,"狻猗猓猡猊猞çŒçŒ•猢猹猥猬猸猱ççç—ç ç¬ç¯ç¾èˆ›å¤¥é£§å¤¤å¤‚饣饧",5,"饴饷饽馀馄馇馊é¦é¦é¦‘é¦“é¦”é¦•åº€åº‘åº‹åº–åº¥åº åº¹åºµåº¾åº³èµ“å»’å»‘å»›å»¨å»ªè†ºå¿„å¿‰å¿–å¿æ€ƒå¿®æ€„å¿¡å¿¤å¿¾æ€…æ€†å¿ªå¿­å¿¸æ€™æ€µæ€¦æ€›æ€æ€æ€©æ€«æ€Šæ€¿æ€¡æ¸æ¹æ»æºæ‚"], +["e340","鉆",45,"鉵",16], +["e380","銆",7,"éŠ",24,"æªæ½æ‚–æ‚šæ‚­æ‚æ‚ƒæ‚’æ‚Œæ‚›æƒ¬æ‚»æ‚±æƒæƒ˜æƒ†æƒšæ‚´æ„ æ„¦æ„•愣惴愀愎愫慊慵憬憔憧憷懔懵å¿éš³é—©é—«é—±é—³é—µé—¶é—¼é—¾é˜ƒé˜„阆阈阊阋阌é˜é˜é˜’é˜•é˜–é˜—é˜™é˜šä¸¬çˆ¿æˆ•æ°µæ±”æ±œæ±Šæ²£æ²…æ²æ²”æ²Œæ±¨æ±©æ±´æ±¶æ²†æ²©æ³æ³”沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾"], +["e440","銨",5,"銯",24,"鋉",31], +["e480","é‹©",32,"æ´¹æ´§æ´Œæµƒæµˆæ´‡æ´„æ´™æ´Žæ´«æµæ´®æ´µæ´šæµæµ’æµ”æ´³æ¶‘æµ¯æ¶žæ¶ æµžæ¶“æ¶”æµœæµ æµ¼æµ£æ¸šæ·‡æ·…æ·žæ¸Žæ¶¿æ· æ¸‘æ·¦æ·æ·™æ¸–æ¶«æ¸Œæ¶®æ¸«æ¹®æ¹Žæ¹«æº²æ¹Ÿæº†æ¹“æ¹”æ¸²æ¸¥æ¹„æ»Ÿæº±æº˜æ» æ¼­æ»¢æº¥æº§æº½æº»æº·æ»—æº´æ»æºæ»‚æºŸæ½¢æ½†æ½‡æ¼¤æ¼•æ»¹æ¼¯æ¼¶æ½‹æ½´æ¼ªæ¼‰æ¼©æ¾‰æ¾æ¾Œæ½¸æ½²æ½¼æ½ºæ¿‘"], +["e540","錊",51,"錿",10], +["e580","éŠ",31,"髿¿‰æ¾§æ¾¹æ¾¶æ¿‚濡濮濞濠濯瀚瀣瀛瀹瀵ççžå®€å®„宕宓宥宸甯骞æ´å¯¤å¯®è¤°å¯°è¹‡è¬‡è¾¶è¿“迕迥迮迤迩迦迳迨逅逄逋逦逑é€é€–逡逵逶逭逯é„é‘é’éé¨é˜é¢é›æš¹é´é½é‚‚邈邃邋å½å½—彖彘尻咫å±å±™å­±å±£å±¦ç¾¼å¼ªå¼©å¼­è‰´å¼¼é¬»å±®å¦å¦ƒå¦å¦©å¦ªå¦£"], +["e640","é¬",34,"éŽ",27], +["e680","鎬",29,"é‹éŒé妗姊妫妞妤姒妲妯姗妾娅娆å§å¨ˆå§£å§˜å§¹å¨Œå¨‰å¨²å¨´å¨‘娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀éªéª…骈骊éªéª’骓骖骘骛骜éªéªŸéª éª¢éª£éª¥éª§çºŸçº¡çº£çº¥çº¨çº©"], +["e740","éŽ",7,"é—",54], +["e780","éŽ",32,"纭纰纾绀ç»ç»‚绉绋绌ç»ç»”绗绛绠绡绨绫绮绯绱绲ç¼ç»¶ç»ºç»»ç»¾ç¼ç¼‚缃缇缈缋缌ç¼ç¼‘缒缗缙缜缛缟缡",6,"缪缫缬缭缯",4,"缵幺畿巛甾邕玎玑玮玢玟çç‚ç‘玷玳ç€ç‰çˆç¥ç™é¡¼çŠç©ç§çžçŽºç²ççªç‘›ç¦ç¥ç¨ç°ç®ç¬"], +["e840","é¯",14,"é¿",43,"鑬鑭鑮鑯"], +["e880","é‘°",20,"钑钖钘铇é“铓铔铚铦铻锜锠ç›çšç‘瑜瑗瑕瑙瑷瑭瑾璜璎璀ç’璇璋璞璨璩ç’ç’§ç“’ç’ºéŸªéŸ«éŸ¬æŒæ“æžæˆæ©æž¥æž‡æªæ³æž˜æž§æµæž¨æžžæž­æž‹æ·æ¼æŸ°æ ‰æŸ˜æ ŠæŸ©æž°æ ŒæŸ™æžµæŸšæž³æŸæ €æŸƒæž¸æŸ¢æ ŽæŸæŸ½æ ²æ ³æ¡ æ¡¡æ¡Žæ¡¢æ¡„æ¡¤æ¢ƒæ æ¡•æ¡¦æ¡æ¡§æ¡€æ ¾æ¡Šæ¡‰æ ©æ¢µæ¢æ¡´æ¡·æ¢“桫棂楮棼椟椠棹"], +["e940","锧锳锽镃镈镋镕镚镠镮镴镵長",7,"é–€",42], +["e980","é–«",32,"æ¤¤æ£°æ¤‹æ¤æ¥—æ££æ¤æ¥±æ¤¹æ¥ æ¥‚æ¥æ¦„æ¥«æ¦€æ¦˜æ¥¸æ¤´æ§Œæ¦‡æ¦ˆæ§Žæ¦‰æ¥¦æ¥£æ¥¹æ¦›æ¦§æ¦»æ¦«æ¦­æ§”æ¦±æ§æ§Šæ§Ÿæ¦•æ§ æ¦æ§¿æ¨¯æ§­æ¨—æ¨˜æ©¥æ§²æ©„æ¨¾æª æ©æ©›æ¨µæªŽæ©¹æ¨½æ¨¨æ©˜æ©¼æª‘æªæª©æª—æª«çŒ·ç’æ®æ®‚æ®‡æ®„æ®’æ®“æ®æ®šæ®›æ®¡æ®ªè½«è½­è½±è½²è½³è½µè½¶è½¸è½·è½¹è½ºè½¼è½¾è¾è¾‚辄辇辋"], +["ea40","é—Œ",27,"闬闿阇阓阘阛阞阠阣",6,"阫阬阭阯阰阷阸阹阺阾é™é™ƒé™Šé™Žé™é™‘陒陓陖陗"], +["ea80","陘陙陚陜é™é™žé™ é™£é™¥é™¦é™«é™­",4,"陳陸",12,"隇隉隊è¾è¾Žè¾è¾˜è¾šè»Žæˆ‹æˆ—戛戟戢戡戥戤戬臧瓯瓴瓿ç”ç”‘ç”“æ”´æ—®æ—¯æ—°æ˜Šæ˜™æ²æ˜ƒæ˜•æ˜€ç‚…æ›·æ˜æ˜´æ˜±æ˜¶æ˜µè€†æ™Ÿæ™”æ™æ™æ™–æ™¡æ™—æ™·æš„æšŒæš§æšæš¾æ››æ›œæ›¦æ›©è´²è´³è´¶è´»è´½èµ€èµ…赆赈赉赇èµèµ•赙觇觊觋觌觎è§è§è§‘牮犟ç‰ç‰¦ç‰¯ç‰¾ç‰¿çŠ„çŠ‹çŠçŠçŠ’æŒˆæŒ²æŽ°"], +["eb40","隌階隑隒隓隕隖隚際éš",9,"隨",7,"隱隲隴隵隷隸隺隻隿雂雃雈雊雋é›é›‘雓雔雖",9,"雡",6,"雫"], +["eb80","雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌éœéœ‘霒霔霕霗",4,"éœéœŸéœ æ¿æ“˜è€„æ¯ªæ¯³æ¯½æ¯µæ¯¹æ°…æ°‡æ°†æ°æ°•氘氙氚氡氩氤氪氲攵敕敫ç‰ç‰’牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙èƒèƒ—æœèƒèƒ«èƒ±èƒ´èƒ­è„脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧å¡åªµè†ˆè†‚膑滕膣膪臌朦臊膻"], +["ec40","霡",8,"霫霬霮霯霱霳",4,"霺霻霼霽霿",18,"é”é•é—é˜éšéœééŸé£é¤é¦é§é¨éª",7], +["ec80","é²éµé·",4,"é½",7,"鞆",4,"鞌鞎éžéžéž“鞕鞖鞗鞙",4,"è‡è†¦æ¬¤æ¬·æ¬¹æ­ƒæ­†æ­™é£‘飒飓飕飙飚殳彀毂觳æ–齑斓於旆旄旃旌旎旒旖炀炜炖ç‚炻烀炷炫炱烨烊ç„焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹çˆçˆ¨ç¬ç„˜ç…¦ç†¹æˆ¾æˆ½æ‰ƒæ‰ˆæ‰‰ç¤»ç¥€ç¥†ç¥‰ç¥›ç¥œç¥“祚祢祗祠祯祧祺禅禊禚禧禳忑å¿"], +["ed40","鞞鞟鞡鞢鞤",6,"鞬鞮鞰鞱鞳鞵",46], +["ed80","韤韥韨韮",4,"韴韷",23,"æ€¼ææšæ§ææ™æ£æ‚«æ„†æ„æ…æ†©æ†æ‡‹æ‡‘æˆ†è‚€è¿æ²“泶淼矶矸砀砉砗砘砑斫砭砜ç ç ¹ç ºç »ç Ÿç ¼ç ¥ç ¬ç £ç ©ç¡Žç¡­ç¡–ç¡—ç ¦ç¡ç¡‡ç¡Œç¡ªç¢›ç¢“碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄çœç›¹çœ‡çœˆçœšçœ¢çœ™çœ­çœ¦çœµçœ¸çç‘ç‡çƒçšç¨"], +["ee40","é ",62], +["ee80","顎",32,"ç¢ç¥ç¿çžç½çž€çžŒçž‘瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹ç¾ç½¾ç›ç›¥è ²é’…钆钇钋钊钌é’é’é’钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶",4,"钼钽钿铄铈",6,"é“铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪"], +["ef40","顯",5,"颋颎颒颕颙颣風",37,"é£é£é£”飖飗飛飜é£é£ ",4], +["ef80","飥飦飩",30,"铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊é”锎é”é”’",4,"锘锛é”锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎é•镒镓镔镖镗镘镙镛镞镟é•镡镢镤",8,"镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔"], +["f040","餈",4,"餎é¤é¤‘",28,"餯",26], +["f080","饊",9,"饖",12,"饤饦饳饸饹饻饾馂馃馉稹稷穑é»é¦¥ç©°çšˆçšŽçš“皙皤瓞瓠甬鸠鸢鸨",4,"鸲鸱鸶鸸鸷鸹鸺鸾é¹é¹‚鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦",6,"鹱鹭鹳疒疔疖疠ç–疬疣疳疴疸痄疱疰痃痂痖ç—痣痨痦痤痫痧瘃痱痼痿ç˜ç˜€ç˜…瘌瘗瘊瘥瘘瘕瘙"], +["f140","馌馎馚",10,"馦馧馩",47], +["f180","é§™",32,"瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳ç™ç™žç™”癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶è¥è¥¦è¥»ç–‹èƒ¥çš²çš´çŸœè€’耔耖耜耠耢耥耦耧耩耨耱耋耵èƒè†èè’è©è±è¦ƒé¡¸é¢€é¢ƒ"], +["f240","駺",62], +["f280","騹",32,"颉颌é¢é¢é¢”颚颛颞颟颡颢颥颦è™è™”虬虮虿虺虼虻蚨èšèš‹èš¬èšèš§èš£èšªèš“蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉è›èš´è›©è›±è›²è›­è›³è›èœ“蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊èœèœ‰èœ£èœ»èœžèœ¥èœ®èœšèœ¾èˆèœ´èœ±èœ©èœ·èœ¿èž‚蜢è½è¾è»è è°èŒè®èž‹è“è£è¼è¤è™è¥èž“螯螨蟒"], +["f340","驚",17,"驲骃骉éªéªŽéª”骕骙骦骩",6,"骲骳骴骵骹骻骽骾骿髃髄髆",4,"é«é«Žé«é«é«’體髕髖髗髙髚髛髜"], +["f380","é«é«žé« é«¢é«£é«¤é«¥é«§é«¨é«©é«ªé«¬é«®é«°",8,"髺髼",6,"鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅èˆç«ºç«½ç¬ˆç¬ƒç¬„笕笊笫ç¬ç­‡ç¬¸ç¬ªç¬™ç¬®ç¬±ç¬ ç¬¥ç¬¤ç¬³ç¬¾ç¬žç­˜ç­šç­…筵筌ç­ç­ ç­®ç­»ç­¢ç­²ç­±ç®ç®¦ç®§ç®¸ç®¬ç®ç®¨ç®…箪箜箢箫箴篑ç¯ç¯Œç¯ç¯šç¯¥ç¯¦ç¯ªç°Œç¯¾ç¯¼ç°ç°–ç°‹"], +["f440","鬇鬉",5,"é¬é¬‘鬒鬔",10,"鬠鬡鬢鬤",10,"鬰鬱鬳",7,"鬽鬾鬿魀魆魊魋魌魎é­é­’é­“é­•",5], +["f480","é­›",32,"簟簪簦簸ç±ç±€è‡¾èˆèˆ‚舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋è‰è‰šè‰Ÿè‰¨è¡¾è¢…袈裘裟襞ç¾ç¾Ÿç¾§ç¾¯ç¾°ç¾²ç±¼æ•‰ç²‘ç²ç²œç²žç²¢ç²²ç²¼ç²½ç³ç³‡ç³Œç³ç³ˆç³…糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊é…é…Žé…é…¤"], +["f540","é­¼",62], +["f580","é®»",32,"酢酡酰酩酯酽酾酲酴酹醌醅é†é†é†‘醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎è·è·›è·†è·¬è··è·¸è·£è·¹è·»è·¤è¸‰è·½è¸”è¸è¸Ÿè¸¬è¸®è¸£è¸¯è¸ºè¹€è¸¹è¸µè¸½è¸±è¹‰è¹è¹‚蹑蹒蹊蹰蹶蹼蹯蹴躅èºèº”èºèºœèºžè±¸è²‚貊貅貘貔斛觖觞觚觜"], +["f640","鯜",62], +["f680","é°›",32,"觥觫觯訾謦é“雩雳雯霆éœéœˆéœéœŽéœªéœ­éœ°éœ¾é¾€é¾ƒé¾…",5,"龌黾鼋é¼éš¹éš¼éš½é›Žé›’瞿雠銎銮鋈錾éªéŠéŽé¾é‘«é±¿é²‚鲅鲆鲇鲈稣鲋鲎é²é²‘鲒鲔鲕鲚鲛鲞",5,"é²¥",4,"鲫鲭鲮鲰",7,"鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋"], +["f740","é°¼",62], +["f780","鱻鱽鱾鲀鲃鲄鲉鲊鲌é²é²“鲖鲗鲘鲙é²é²ªé²¬é²¯é²¹é²¾",4,"鳈鳉鳑鳒鳚鳛鳠鳡鳌",4,"鳓鳔鳕鳗鳘鳙鳜é³é³Ÿé³¢é¼éž…鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼é«é«€é«…髂髋髌髑魅魃魇魉魈é­é­‘飨é¤é¤®é¥•饔髟髡髦髯髫髻髭髹鬈é¬é¬“鬟鬣麽麾縻麂麇麈麋麒é–éºéºŸé»›é»œé»é» é»Ÿé»¢é»©é»§é»¥é»ªé»¯é¼¢é¼¬é¼¯é¼¹é¼·é¼½é¼¾é½„"], +["f840","é³£",62], +["f880","é´¢",32], +["f940","鵃",62], +["f980","é¶‚",32], +["fa40","é¶£",62], +["fa80","é·¢",32], +["fb40","鸃",27,"鸤鸧鸮鸰鸴鸻鸼鹀é¹é¹é¹’鹓鹔鹖鹙é¹é¹Ÿé¹ é¹¡é¹¢é¹¥é¹®é¹¯é¹²é¹´",9,"麀"], +["fb80","éºéºƒéº„麅麆麉麊麌",5,"麔",8,"麞麠",5,"麧麨麩麪"], +["fc40","麫",8,"麵麶麷麹麺麼麿",4,"黅黆黇黈黊黋黌é»é»’黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰",8,"黺黽黿",6], +["fc80","鼆",4,"鼌é¼é¼‘鼒鼔鼕鼖鼘鼚",5,"鼡鼣",8,"鼭鼮鼰鼱"], +["fd40","é¼²",4,"鼸鼺鼼鼿",4,"é½…",10,"é½’",38], +["fd80","é½¹",5,"é¾é¾‚é¾",11,"龜é¾é¾žé¾¡",4,"郎凉秊裏隣"], +["fe40","兀ï¨ï¨Žï¨ï¨‘﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩"] +] diff --git a/node_modules/iconv-lite/encodings/tables/cp949.json b/node_modules/iconv-lite/encodings/tables/cp949.json new file mode 100644 index 00000000..2022a007 --- /dev/null +++ b/node_modules/iconv-lite/encodings/tables/cp949.json @@ -0,0 +1,273 @@ +[ +["0","\u0000",127], +["8141","갂갃갅갆갋",4,"갘갞갟갡갢갣갥",6,"갮갲갳갴"], +["8161","갵갶갷갺갻갽갾갿ê±",9,"걌걎",5,"걕"], +["8181","걖걗걙걚걛ê±",18,"걲걳걵걶걹걻",4,"겂겇겈ê²ê²Žê²ê²‘겒겓겕",6,"겞겢",5,"겫겭겮겱",6,"겺겾겿곀곂곃곅곆곇곉곊곋ê³",7,"곖곘",7,"곢곣곥곦곩곫곭곮곲곴곷",4,"곾곿ê´ê´‚괃괅괇",4,"ê´Žê´ê´’ê´“"], +["8241","괔괕괖괗괙괚괛ê´ê´žê´Ÿê´¡",7,"괪괫괮",5], +["8261","괶괷괹괺괻괽",6,"굆굈굊",5,"굑굒굓굕굖굗"], +["8281","êµ™",7,"굢굤",7,"굮굯굱굲굷굸굹굺굾궀궃",4,"ê¶Šê¶‹ê¶ê¶Žê¶ê¶‘",10,"ê¶ž",5,"ê¶¥",17,"궸",7,"귂귃귅귆귇귉",6,"ê·’ê·”",7,"ê·ê·žê·Ÿê·¡ê·¢ê·£ê·¥",18], +["8341","귺귻귽귾긂",5,"긊긌긎",5,"긕",7], +["8361","ê¸",18,"긲긳긵긶긹긻긼"], +["8381","긽긾긿깂깄깇깈깉깋ê¹ê¹‘깒깓깕깗",4,"깞깢깣깤깦깧깪깫깭깮깯깱",6,"깺깾",5,"꺆",5,"êº",46,"꺿ê»ê»‚껃껅",6,"껎껒",5,"껚껛ê»",8], +["8441","껦껧껩껪껬껮",5,"껵껶껷껹껺껻껽",8], +["8461","꼆꼉꼊꼋꼌꼎ê¼ê¼‘",18], +["8481","꼤",7,"꼮꼯꼱꼳꼵",6,"꼾꽀꽄꽅꽆꽇꽊",5,"꽑",10,"꽞",5,"꽦",18,"꽺",5,"ê¾ê¾‚꾃꾅꾆꾇꾉",6,"꾒꾓꾔꾖",5,"ê¾",26,"꾺꾻꾽꾾"], +["8541","꾿ê¿",5,"꿊꿌ê¿",4,"ê¿•",6,"ê¿",4], +["8561","ê¿¢",5,"꿪",5,"꿲꿳꿵꿶꿷꿹",6,"뀂뀃"], +["8581","뀅",6,"ë€ë€Žë€ë€‘뀒뀓뀕",6,"뀞",9,"뀩",26,"ë†ë‡ë‰ë‹ëëëë‘ë’ë–ë˜ëšë›ëœëž",29,"ë¾ë¿ë‚낂낃낅",6,"낎ë‚ë‚’",5,"ë‚›ë‚낞낣낤"], +["8641","낥낦낧낪낰낲낶낷낹낺낻낽",6,"냆냊",5,"냒"], +["8661","냓냕냖냗냙",6,"냡냢냣냤냦",10], +["8681","냱",22,"넊ë„넎ë„넑넔넕넖넗넚넞",4,"넦넧넩넪넫넭",6,"넶넺",5,"녂녃녅녆녇녉",6,"녒녓녖녗녙녚녛ë…ë…žë…Ÿë…¡",22,"녺녻녽녾녿ë†ë†ƒ",4,"놊놌놎ë†ë†ë†‘놕놖놗놙놚놛ë†"], +["8741","놞",9,"놩",15], +["8761","놹",18,"ë‡ë‡Žë‡ë‡‘뇒뇓뇕"], +["8781","뇖",5,"뇞뇠",7,"뇪뇫뇭뇮뇯뇱",7,"뇺뇼뇾",5,"눆눇눉눊ëˆ",6,"눖눘눚",5,"눡",18,"눵",6,"눽",26,"뉙뉚뉛ë‰ë‰žë‰Ÿë‰¡",6,"뉪",4], +["8841","뉯",4,"뉶",5,"뉽",6,"늆늇늈늊",4], +["8861","ëŠëŠ’ëŠ“ëŠ•ëŠ–ëŠ—ëŠ›",4,"늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷"], +["8881","늸",15,"닊닋ë‹ë‹Žë‹ë‹‘ë‹“",4,"닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉",6,"댒댖",5,"ëŒ",54,"ë—ë™ëšëë ë¡ë¢ë£"], +["8941","ë¦ë¨ëªë¬ë­ë¯ë²ë³ëµë¶ë·ë¹",6,"뎂뎆",5,"ëŽ"], +["8961","뎎ëŽëŽ‘ëŽ’ëŽ“ëŽ•",10,"뎢",5,"뎩뎪뎫뎭"], +["8981","뎮",21,"ë†ë‡ë‰ëŠëëë‘ë’ë“ë–ë˜ëšëœëžëŸë¡ë¢ë£ë¥ë¦ë§ë©",18,"ë½",18,"ë‘",6,"ë™ëšë›ëëžëŸë¡",6,"ëªë¬",7,"ëµ",15], +["8a41","ë‘…",10,"ë‘’ë‘“ë‘•ë‘–ë‘—ë‘™",6,"둢둤둦"], +["8a61","ë‘§",4,"ë‘­",18,"ë’ë’‚"], +["8a81","ë’ƒ",4,"ë’‰",19,"ë’ž",5,"뒥뒦뒧뒩뒪뒫뒭",7,"뒶뒸뒺",5,"ë“듂듃듅듆듇듉",6,"듑듒듓듔듖",5,"듞듟듡듢듥듧",4,"듮듰듲",5,"듹",26,"딖딗딙딚ë”"], +["8b41","딞",5,"딦딫",4,"딲딳딵딶딷딹",6,"땂땆"], +["8b61","땇땈땉땊땎ë•ë•‘ë•’ë•“ë••",6,"땞땢",8], +["8b81","ë•«",52,"떢떣떥떦떧떩떬떭떮떯떲떶",4,"떾떿ë—뗂뗃뗅",6,"ë—Žë—’",5,"ë—™",18,"ë—­",18], +["8c41","똀",15,"똒똓똕똖똗똙",4], +["8c61","똞",6,"똦",5,"똭",6,"똵",5], +["8c81","똻",12,"뙉",26,"뙥뙦뙧뙩",50,"뚞뚟뚡뚢뚣뚥",5,"뚭뚮뚯뚰뚲",16], +["8d41","뛃",16,"뛕",8], +["8d61","뛞",17,"뛱뛲뛳뛵뛶뛷뛹뛺"], +["8d81","ë›»",4,"뜂뜃뜄뜆",33,"뜪뜫뜭뜮뜱",6,"뜺뜼",7,"ë…ë†ë‡ë‰ëŠë‹ë",6,"ë–",9,"ë¡ë¢ë£ë¥ë¦ë§ë©",6,"ë²ë´ë¶",5,"ë¾ë¿ëžëž‚랃랅",6,"랎랓랔랕랚랛ëžëžž"], +["8e41","랟랡",6,"랪랮",5,"ëž¶ëž·ëž¹",8], +["8e61","럂",4,"럈럊",19], +["8e81","럞",13,"럮럯럱럲럳럵",6,"럾렂",4,"ë Šë ‹ë ë Žë ë ‘",6,"렚렜렞",5,"렦렧렩렪렫렭",6,"ë ¶ë º",5,"ë¡ë¡‚롃롅",11,"ë¡’ë¡”",7,"롞롟롡롢롣롥",6,"롮롰롲",5,"롹롺롻롽",7], +["8f41","뢅",7,"뢎",17], +["8f61","뢠",7,"뢩",6,"뢱뢲뢳뢵뢶뢷뢹",4], +["8f81","뢾뢿룂룄룆",5,"ë£ë£Žë£ë£‘룒룓룕",7,"룞룠룢",5,"룪룫룭룮룯룱",6,"룺룼룾",5,"뤅",18,"뤙",6,"뤡",26,"뤾뤿ë¥ë¥‚륃륅",6,"ë¥ë¥Žë¥ë¥’",5], +["9041","륚륛ë¥ë¥žë¥Ÿë¥¡",6,"륪륬륮",5,"륶륷륹륺륻륽"], +["9061","륾",5,"릆릈릋릌ë¦",15], +["9081","릟",12,"릮릯릱릲릳릵",6,"릾맀맂",5,"ë§Šë§‹ë§ë§“",4,"맚맜맟맠맢맦맧맩맪맫맭",6,"ë§¶ë§»",4,"먂",5,"먉",11,"먖",33,"먺먻먽먾먿ë©ë©ƒë©„멅멆"], +["9141","멇멊멌ë©ë©ë©‘멒멖멗멙멚멛ë©",6,"멦멪",5], +["9161","멲멳멵멶멷멹",9,"몆몈몉몊몋ëª",5], +["9181","몓",20,"몪몭몮몯몱몳",4,"몺몼몾",5,"뫅뫆뫇뫉",14,"뫚",33,"뫽뫾뫿ë¬ë¬‚묃묅",7,"묎ë¬ë¬’",5,"묙묚묛ë¬ë¬žë¬Ÿë¬¡",6], +["9241","묨묪묬",7,"묷묹묺묿",4,"뭆뭈뭊뭋뭌뭎뭑뭒"], +["9261","ë­“ë­•ë­–ë­—ë­™",7,"뭢뭤",7,"ë­­",4], +["9281","ë­²",21,"뮉뮊뮋ë®ë®Žë®ë®‘",18,"뮥뮦뮧뮩뮪뮫뮭",6,"뮵뮶뮸",7,"ë¯ë¯‚믃믅믆믇믉",6,"믑믒믔",35,"믺믻믽믾ë°"], +["9341","ë°ƒ",4,"ë°Šë°Žë°ë°’밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵"], +["9361","ë°¶ë°·ë°¹",6,"뱂뱆뱇뱈뱊뱋뱎ë±ë±‘",8], +["9381","뱚뱛뱜뱞",37,"벆벇벉벊ë²ë²",4,"벖벘벛",4,"벢벣벥벦벩",6,"벲벶",5,"벾벿ë³ë³‚볃볅",7,"볎볒볓볔볖볗볙볚볛ë³",22,"볷볹볺볻볽"], +["9441","ë³¾",5,"봆봈봊",5,"ë´‘ë´’ë´“ë´•",8], +["9461","ë´ž",5,"ë´¥",6,"ë´­",12], +["9481","ë´º",5,"ëµ",6,"뵊뵋ëµëµŽëµëµ‘",6,"뵚",9,"뵥뵦뵧뵩",22,"붂붃붅붆붋",4,"붒붔붖붗붘붛ë¶",6,"ë¶¥",10,"ë¶±",6,"ë¶¹",24], +["9541","뷒뷓뷖뷗뷙뷚뷛ë·",11,"ë·ª",5,"ë·±"], +["9561","뷲뷳뷵뷶뷷뷹",6,"ë¸ë¸‚븄븆",5,"븎ë¸ë¸‘븒븓"], +["9581","븕",6,"븞븠",35,"빆빇빉빊빋ë¹ë¹",4,"빖빘빜ë¹ë¹žë¹Ÿë¹¢ë¹£ë¹¥ë¹¦ë¹§ë¹©ë¹«",4,"빲빶",4,"빾빿ëºëº‚뺃뺅",6,"뺎뺒",5,"뺚",13,"뺩",14], +["9641","뺸",23,"뻒뻓"], +["9661","뻕뻖뻙",6,"뻡뻢뻦",5,"ë»­",8], +["9681","ë»¶",10,"뼂",5,"뼊",13,"뼚뼞",33,"뽂뽃뽅뽆뽇뽉",6,"뽒뽓뽔뽖",44], +["9741","뾃",16,"뾕",8], +["9761","뾞",17,"ë¾±",7], +["9781","ë¾¹",11,"뿆",5,"뿎ë¿ë¿‘ë¿’ë¿“ë¿•",6,"ë¿ë¿žë¿ ë¿¢",89,"쀽쀾쀿"], +["9841","ì€",16,"ì’",5,"ì™ìšì›"], +["9861","ììžìŸì¡",6,"ìª",15], +["9881","ìº",21,"ì‚’ì‚“ì‚•ì‚–ì‚—ì‚™",6,"삢삤삦",5,"삮삱삲삷",4,"삾샂샃샄샆샇샊샋ìƒìƒŽìƒìƒ‘",6,"샚샞",5,"샦샧샩샪샫샭",6,"샶샸샺",5,"ì„섂섃섅섆섇섉",6,"섑섒섓섔섖",5,"섡섢섥섨섩섪섫섮"], +["9941","섲섳섴섵섷섺섻섽섾섿ì…",6,"ì…Šì…Ž",5,"ì…–ì…—"], +["9961","셙셚셛ì…",6,"셦셪",5,"셱셲셳셵셶셷셹셺셻"], +["9981","ì…¼",8,"솆",5,"ì†ì†‘솒솓솕솗",4,"솞솠솢솣솤솦솧솪솫솭솮솯솱",11,"솾",5,"쇅쇆쇇쇉쇊쇋ì‡",6,"쇕쇖쇙",6,"쇡쇢쇣쇥쇦쇧쇩",6,"쇲쇴",7,"쇾쇿ìˆìˆ‚숃숅",6,"숎ìˆìˆ’",5,"숚숛ìˆìˆžìˆ¡ìˆ¢ìˆ£"], +["9a41","숤숥숦숧숪숬숮숰숳숵",16], +["9a61","쉆쉇쉉",6,"쉒쉓쉕쉖쉗쉙",6,"쉡쉢쉣쉤쉦"], +["9a81","쉧",4,"쉮쉯쉱쉲쉳쉵",6,"쉾슀슂",5,"슊",5,"슑",6,"슙슚슜슞",5,"슦슧슩슪슫슮",5,"슶슸슺",33,"싞싟싡싢싥",5,"싮싰싲싳싴싵싷싺싽싾싿ìŒ",6,"쌊쌋쌎ìŒ"], +["9b41","ìŒìŒ‘쌒쌖쌗쌙쌚쌛ìŒ",6,"쌦쌧쌪",8], +["9b61","쌳",17,"ì†",7], +["9b81","ìŽ",25,"ìªì«ì­ì®ì¯ì±ì³",4,"ìºì»ì¾",5,"쎅쎆쎇쎉쎊쎋ìŽ",50,"ì",22,"ìš"], +["9c41","ì›ììžì¡ì£",4,"ìªì«ì¬ì®",5,"ì¶ì·ì¹",5], +["9c61","ì¿",8,"ì‰",6,"ì‘",9], +["9c81","ì›",8,"ì¥",6,"ì­ì®ì¯ì±ì²ì³ìµ",6,"ì¾",9,"쑉",26,"쑦쑧쑩쑪쑫쑭",6,"쑶쑷쑸쑺",5,"ì’",18,"ì’•",6,"ì’",12], +["9d41","ì’ª",13,"쒹쒺쒻쒽",8], +["9d61","쓆",25], +["9d81","ì“ ",8,"쓪",5,"쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂",9,"ì”씎ì”씑씒씓씕",6,"ì”",10,"씪씫씭씮씯씱",6,"씺씼씾",5,"앆앇앋ì•ì•앑앒앖앚앛앜앟앢앣앥앦앧앩",6,"앲앶",5,"앾앿ì–얂얃얅얆얈얉얊얋얎ì–ì–’ì–“ì–”"], +["9e41","얖얙얚얛ì–ì–žì–Ÿì–¡",7,"ì–ª",9,"ì–¶"], +["9e61","얷얺얿",4,"ì—‹ì—ì—ì—’ì—“ì—•ì—–ì——ì—™",6,"엢엤엦엧"], +["9e81","엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋ì˜ì˜Žì˜ì˜‘",6,"옚ì˜",6,"옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉",6,"ì™’ì™–",5,"왞왟왡",10,"왭왮왰왲",5,"왺왻왽왾왿ìš",6,"욊욌욎",5,"욖욗욙욚욛ìš",6,"욦"], +["9f41","욨욪",5,"욲욳욵욶욷욻",4,"웂웄웆",5,"웎"], +["9f61","ì›ì›‘웒웓웕",6,"웞웟웢",5,"웪웫웭웮웯웱웲"], +["9f81","웳",4,"웺웻웼웾",5,"윆윇윉윊윋ìœ",6,"윖윘윚",5,"윢윣윥윦윧윩",6,"윲윴윶윸윹윺윻윾윿ìì‚ìƒì…",4,"ì‹ìŽìì™ìšì›ììžìŸì¡",6,"ì©ìªì¬",7,"ì¶ì·ì¹ìºì»ì¿ìž€ìžìž‚잆잋잌ìžìžìž’잓잕잙잛",4,"잢잧",4,"잮잯잱잲잳잵잶잷"], +["a041","잸잹잺잻잾쟂",5,"쟊쟋ìŸìŸìŸ‘",6,"쟙쟚쟛쟜"], +["a061","쟞",5,"쟥쟦쟧쟩쟪쟫쟭",13], +["a081","쟻",4,"젂젃젅젆젇젉젋",4,"젒젔젗",4,"젞젟젡젢젣젥",6,"젮젰젲",5,"젹젺젻젽젾젿ì¡",6,"졊졋졎",5,"ì¡•",26,"졲졳졵졶졷졹졻",4,"좂좄좈좉좊좎",5,"좕",7,"좞좠좢좣좤"], +["a141","좥좦좧좩",18,"좾좿죀ì£"], +["a161","죂죃죅죆죇죉죊죋ì£",6,"죖죘죚",5,"죢죣죥"], +["a181","죦",14,"죶",5,"죾죿ì¤ì¤‚줃줇",4,"줎 ã€ã€‚·‥…¨〃­―∥\∼‘’“â€ã€”〕〈",9,"±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○â—◎◇◆□■△▲▽▼→â†â†‘↓↔〓≪≫√∽âˆâˆµâˆ«âˆ¬âˆˆâˆ‹âŠ†âŠ‡âŠ‚âŠƒâˆªâˆ©âˆ§âˆ¨ï¿¢"], +["a241","ì¤ì¤’",5,"줙",18], +["a261","줭",6,"줵",18], +["a281","쥈",7,"쥒쥓쥕쥖쥗쥙",6,"쥢쥤",7,"쥭쥮쥯⇒⇔∀∃´~ˇ˘Ë˚˙¸˛¡¿Ë∮∑âˆÂ¤â„‰â€°â—◀▷▶♤♠♡♥♧♣⊙◈▣â—◑▒▤▥▨▧▦▩♨â˜â˜Žâ˜œâ˜žÂ¶â€ â€¡â†•↗↙↖↘♭♩♪♬㉿㈜№ã‡â„¢ã‚ã˜â„¡â‚¬Â®"], +["a341","쥱쥲쥳쥵",6,"쥽",10,"즊즋ì¦ì¦Žì¦"], +["a361","즑",6,"즚즜즞",16], +["a381","즯",16,"짂짃짅짆짉짋",4,"짒짔짗짘짛ï¼",58,"₩]",32,"ï¿£"], +["a441","짞짟짡짣짥짦짨짩짪짫짮짲",5,"짺짻짽짾짿ì¨ì¨‚쨃쨄"], +["a461","쨅쨆쨇쨊쨎",5,"쨕쨖쨗쨙",12], +["a481","쨦쨧쨨쨪",28,"ㄱ",93], +["a541","쩇",4,"쩎ì©ì©‘ì©’ì©“ì©•",6,"쩞쩢",5,"쩩쩪"], +["a561","ì©«",17,"쩾",5,"쪅쪆"], +["a581","쪇",16,"쪙",14,"â…°",9], +["a5b0","â… ",9], +["a5c1","Α",16,"Σ",6], +["a5e1","α",16,"σ",6], +["a641","쪨",19,"쪾쪿ì«ì«‚쫃쫅"], +["a661","쫆",5,"쫎ì«ì«’쫔쫕쫖쫗쫚",5,"ì«¡",6], +["a681","쫨쫩쫪쫫쫭",6,"쫵",18,"쬉쬊─│┌â”┘└├┬┤┴┼â”┃â”┓┛┗┣┳┫┻╋┠┯┨┷┿â”┰┥┸╂┒┑┚┙┖┕┎â”┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀â•╃",7], +["a741","쬋",4,"쬑쬒쬓쬕쬖쬗쬙",6,"쬢",7], +["a761","쬪",22,"쭂쭃쭄"], +["a781","쭅쭆쭇쭊쭋ì­ì­Žì­ì­‘",6,"쭚쭛쭜쭞",5,"ì­¥",7,"㎕㎖㎗ℓ㎘ã„㎣㎤㎥㎦㎙",9,"ãŠãŽãŽŽãŽã㎈㎉ãˆãŽ§ãŽ¨ãŽ°",9,"㎀",4,"㎺",5,"ãŽ",4,"Ωã€ã㎊㎋㎌ã–ã…㎭㎮㎯ã›ãŽ©ãŽªãŽ«ãŽ¬ããã“ãƒã‰ãœã†"], +["a841","ì­­",10,"ì­º",14], +["a861","쮉",18,"ì®",6], +["a881","쮤",19,"쮹",11,"ÆÃªĦ"], +["a8a6","IJ"], +["a8a8","Ä¿ÅØŒºÞŦŊ"], +["a8b1","㉠",27,"â“",25,"â‘ ",14,"½⅓⅔¼¾⅛⅜â…â…ž"], +["a941","쯅",14,"쯕",10], +["a961","쯠쯡쯢쯣쯥쯦쯨쯪",18], +["a981","쯽",14,"ì°Žì°ì°‘ì°’ì°“ì°•",6,"찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀",27,"â’œ",25,"â‘´",14,"¹²³â´â¿â‚₂₃₄"], +["aa41","찥찦찪찫찭찯찱",6,"찺찿",4,"챆챇챉챊챋ì±ì±Ž"], +["aa61","ì±",4,"챖챚",5,"챡챢챣챥챧챩",6,"챱챲"], +["aa81","챳챴챶",29,"ã",82], +["ab41","첔첕첖첗첚첛ì²ì²žì²Ÿì²¡",6,"첪첮",5,"ì²¶ì²·ì²¹"], +["ab61","첺첻첽",6,"쳆쳈쳊",5,"쳑쳒쳓쳕",5], +["ab81","ì³›",8,"ì³¥",6,"쳭쳮쳯쳱",12,"ã‚¡",85], +["ac41","쳾쳿촀촂",5,"ì´Šì´‹ì´ì´Žì´ì´‘",6,"촚촜촞촟촠"], +["ac61","촡촢촣촥촦촧촩촪촫촭",11,"ì´º",4], +["ac81","ì´¿",28,"ìµìµžìµŸÐ",5,"ÐЖ",25], +["acd1","а",5,"ёж",25], +["ad41","쵡쵢쵣쵥",6,"쵮쵰쵲",5,"ìµ¹",7], +["ad61","ì¶",6,"춉",10,"춖춗춙춚춛ì¶ì¶žì¶Ÿ"], +["ad81","춠춡춢춣춦춨춪",5,"ì¶±",18,"ì·…"], +["ae41","ì·†",5,"ì·ì·Žì·ì·‘",16], +["ae61","ì·¢",5,"췩췪췫췭췮췯췱",6,"췺췼췾",4], +["ae81","츃츅츆츇츉츊츋ì¸",6,"츕츖츗츘츚",5,"츢츣츥츦츧츩츪츫"], +["af41","츬츭츮츯츲츴츶",19], +["af61","칊",13,"칚칛ì¹ì¹žì¹¢",5,"칪칬"], +["af81","ì¹®",5,"칶칷칹칺칻칽",6,"캆캈캊",5,"캒캓캕캖캗캙"], +["b041","캚",5,"캢캦",5,"캮",12], +["b061","캻",5,"컂",19], +["b081","ì»–",13,"컦컧컩컪컭",6,"컶컺",5,"ê°€ê°ê°„갇갈갉갊ê°",7,"ê°™",4,"갠갤갬갭갯갰갱갸갹갼걀걋ê±ê±”걘걜거걱건걷걸걺검ê²ê²ƒê²„겅겆겉겊겋게ê²ê²”겜ê²ê²Ÿê² ê²¡ê²¨ê²©ê²ªê²¬ê²¯ê²°ê²¸ê²¹ê²»ê²¼ê²½ê³ê³„곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆"], +["b141","켂켃켅켆켇켉",6,"켒켔켖",5,"ì¼ì¼žì¼Ÿì¼¡ì¼¢ì¼£"], +["b161","ì¼¥",6,"켮켲",5,"ì¼¹",11], +["b181","ì½…",14,"콖콗콙콚콛ì½",6,"콦콨콪콫콬괌ê´ê´ê´‘괘괜괠괩괬괭괴괵괸괼굄굅굇굉êµêµ”굘굡굣구국군굳굴굵굶굻굼굽굿ê¶ê¶‚궈궉권ê¶ê¶œê¶ê¶¤ê¶·ê·€ê·ê·„ê·ˆê·ê·‘귓규균귤그극근귿글ê¸ê¸ˆê¸‰ê¸‹ê¸ê¸”기긱긴긷길긺김ê¹ê¹ƒê¹…깆깊까ê¹ê¹Žê¹ê¹”깖깜ê¹ê¹Ÿê¹ ê¹¡ê¹¥ê¹¨ê¹©ê¹¬ê¹°ê¹¸"], +["b241","콭콮콯콲콳콵콶콷콹",6,"ì¾ì¾‚쾃쾄쾆",5,"ì¾"], +["b261","쾎",18,"ì¾¢",5,"쾩"], +["b281","쾪",5,"ì¾±",18,"ì¿…",6,"깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌ê»ê»ê»ê»‘께껙껜껨껫껭껴껸껼꼇꼈ê¼ê¼ê¼¬ê¼­ê¼°ê¼²ê¼´ê¼¼ê¼½ê¼¿ê½ê½‚꽃꽈꽉ê½ê½œê½ê½¤ê½¥ê½¹ê¾€ê¾„꾈ê¾ê¾‘꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋ê¿ê¿Žê¿”꿜꿨꿩꿰꿱꿴꿸뀀ë€ë€„뀌ë€ë€”뀜ë€ë€¨ë„ë…ëˆëŠëŒëŽë“ë”ë•ë—ë™"], +["b341","쿌",19,"쿢쿣쿥쿦쿧쿩"], +["b361","쿪",5,"쿲쿴쿶",5,"쿽쿾쿿í€í€‚퀃퀅",5], +["b381","퀋",5,"퀒",5,"퀙",19,"ëë¼ë½ë‚€ë‚„낌ë‚ë‚낑나낙낚난낟날낡낢남납낫",4,"낱낳내낵낸낼냄냅냇냈냉ëƒëƒ‘냔냘냠냥너넉넋넌ë„넒넓넘넙넛넜ë„넣네넥넨넬넴넵넷넸넹녀ë…ë…„ë…ˆë…녑녔녕녘녜녠노녹논놀놂놈놉놋ë†ë†’놓놔놘놜놨뇌ë‡ë‡”뇜ë‡"], +["b441","퀮",5,"퀶퀷퀹퀺퀻퀽",6,"í†íˆíŠ",5], +["b461","í‘í’í“í•í–í—í™",6,"í¡",10,"í®í¯"], +["b481","í±í²í³íµ",6,"í¾í¿í‚€í‚‚",18,"뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉ëŠëŠ‘ëŠ”ëŠ˜ëŠ™ëŠšëŠ ëŠ¡ëŠ£ëŠ¥ëŠ¦ëŠªëŠ¬ëŠ°ëŠ´ë‹ˆë‹‰ë‹Œë‹ë‹’님닙닛ë‹ë‹¢ë‹¤ë‹¥ë‹¦ë‹¨ë‹«",4,"닳담답닷",4,"닿대ëŒëŒ„댈ëŒëŒ‘댓댔댕댜ë”ë•ë–ë˜ë›ëœëžëŸë¤ë¥"], +["b541","í‚•",14,"킦킧킩킪킫킭",5], +["b561","킳킶킸킺",5,"탂탃탅탆탇탊",5,"탒탖",4], +["b581","탛탞탟탡탢탣탥",6,"탮탲",5,"탹",11,"ë§ë©ë«ë®ë°ë±ë´ë¸ëŽ€ëŽëŽƒëŽ„ëŽ…ëŽŒëŽëŽ”ëŽ ëŽ¡ëŽ¨ëŽ¬ë„ë…ëˆë‹ëŒëŽëë”ë•ë—ë™ë›ëë ë¤ë¨ë¼ëë˜ëœë ë¨ë©ë«ë´ë‘둑둔둘둠둡둣둥둬뒀뒈ë’뒤뒨뒬뒵뒷뒹듀듄듈ë“듕드ë“든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸"], +["b641","í„…",7,"턎",17], +["b661","í„ ",15,"턲턳턵턶턷턹턻턼턽턾"], +["b681","í„¿í…‚í…†",5,"í…Ží…í…‘í…’í…“í…•",6,"í…ží… í…¢",5,"텩텪텫텭땀ë•땃땄땅땋때ë•ë•땔땜ë•땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌ë—ë—ë—뗑뗘뗬ë˜ë˜‘똔똘똥똬똴뙈뙤뙨뚜ëšëš ëš¤ëš«ëš¬ëš±ë›”뛰뛴뛸뜀ëœëœ…뜨뜩뜬뜯뜰뜸뜹뜻ë„ëˆëŒë”ë•ë ë¤ë¨ë°ë±ë³ëµë¼ë½ëž€ëž„람ëžëžëžëž‘ëž’ëž–ëž—"], +["b741","í…®",13,"í…½",6,"톅톆톇톉톊"], +["b761","톋",20,"톢톣톥톦톧"], +["b781","톩",6,"톲톴톶톷톸톹톻톽톾톿í‡",14,"래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀ë ë ‡ë ˆë ‰ë Œë ë ˜ë ™ë ›ë ë ¤ë ¥ë ¨ë ¬ë ´ë µë ·ë ¸ë ¹ë¡€ë¡„롑롓로ë¡ë¡ ë¡¤ë¡¬ë¡­ë¡¯ë¡±ë¡¸ë¡¼ë¢ë¢¨ë¢°ë¢´ë¢¸ë£€ë£ë£ƒë£…료ë£ë£”ë£ë£Ÿë£¡ë£¨ë£©ë£¬ë£°ë£¸ë£¹ë£»ë£½ë¤„뤘뤠뤼뤽륀륄륌ë¥ë¥‘류륙륜률륨륩"], +["b841","í‡",7,"퇙",17], +["b861","퇫",8,"퇵퇶퇷퇹",13], +["b881","툈툊",5,"툑",24,"륫륭르륵른를름릅릇릉릊ë¦ë¦Žë¦¬ë¦­ë¦°ë¦´ë¦¼ë¦½ë¦¿ë§ë§ˆë§‰ë§Œë§Ž",4,"맘맙맛ë§ë§žë§¡ë§£ë§¤ë§¥ë§¨ë§¬ë§´ë§µë§·ë§¸ë§¹ë§ºë¨€ë¨ë¨ˆë¨•머먹먼멀멂멈멉멋ë©ë©Žë©“메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼"], +["b941","툪툫툮툯툱툲툳툵",6,"툾퉀퉂",5,"퉉퉊퉋퉌"], +["b961","í‰",14,"í‰",6,"퉥퉦퉧퉨"], +["b981","퉩",22,"튂튃튅튆튇튉튊튋튌묀묄ë¬ë¬ë¬‘묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉ë­ë­ë­ë­”뭘뭡뭣뭬뮈뮌ë®ë®¤ë®¨ë®¬ë®´ë®·ë¯€ë¯„믈ë¯ë¯“미믹민믿밀밂밈밉밋밌ë°ë°ë°‘ë°”",4,"ë°›",4,"밤밥밧방밭배백밴밸뱀ë±ë±ƒë±„뱅뱉뱌ë±ë±ë±ë²„벅번벋벌벎범법벗"], +["ba41","íŠíŠŽíŠíŠ’íŠ“íŠ”íŠ–",5,"íŠíŠžíŠŸíŠ¡íŠ¢íŠ£íŠ¥",6,"튭"], +["ba61","튮튯튰튲",5,"튺튻튽튾í‹í‹ƒ",4,"틊틌",5], +["ba81","틒틓틕틖틗틙틚틛í‹",6,"틦",9,"틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별ë³ë³ë³ë³‘볕볘볜보복볶본볼봄봅봇봉ë´ë´”봤봬뵀뵈뵉뵌ëµëµ˜ëµ™ëµ¤ëµ¨ë¶€ë¶ë¶„붇불붉붊ë¶ë¶‘붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브ë¸ë¸ë¸”븜ë¸ë¸Ÿë¹„빅빈빌빎빔빕빗빙빚빛빠빡빤"], +["bb41","í‹»",4,"팂팄팆",5,"íŒíŒ‘팒팓팕팗",4,"팞팢팣"], +["bb61","팤팦팧팪팫팭팮팯팱",6,"팺팾",5,"í†í‡íˆí‰"], +["bb81","íŠ",31,"빨빪빰빱빳빴빵빻빼빽뺀뺄뺌ëºëºëºëº‘뺘뺙뺨ë»ë»‘뻔뻗뻘뻠뻣뻤뻥뻬ë¼ë¼ˆë¼‰ë¼˜ë¼™ë¼›ë¼œë¼ë½€ë½ë½„뽈ë½ë½‘뽕뾔뾰뿅뿌ë¿ë¿ë¿”뿜뿟뿡쀼ì‘ì˜ìœì ì¨ì©ì‚삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀ìƒìƒ…새색샌ìƒìƒ˜ìƒ™ìƒ›ìƒœìƒìƒ¤"], +["bc41","íª",17,"í¾í¿íŽíŽ‚íŽƒíŽ…íŽ†íŽ‡"], +["bc61","펈펉펊펋펎펒",5,"펚펛íŽíŽžíŽŸíŽ¡",6,"펪펬펮"], +["bc81","펯",4,"펵펶펷펹펺펻펽",6,"í†í‡íŠ",5,"í‘",5,"샥샨샬샴샵샷샹섀섄섈ì„섕서",4,"섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌ì…셔셕션셜셤셥셧셨셩셰셴셸솅소ì†ì†Žì†ì†”솖솜ì†ì†Ÿì†¡ì†¥ì†¨ì†©ì†¬ì†°ì†½ì‡„쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌ìˆìˆìˆ‘수숙순숟술숨숩숫숭"], +["bd41","í—í™",7,"í¢í¤",7,"í®í¯í±í²í³íµí¶í·"], +["bd61","í¸í¹íºí»í¾í€í‚",5,"í‰",13], +["bd81","í—",5,"íž",25,"숯숱숲숴쉈ì‰ì‰‘쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿ìŠìŠˆìŠ‰ìŠìŠ˜ìŠ›ìŠìŠ¤ìŠ¥ìŠ¨ìŠ¬ìŠ­ìŠ´ìŠµìŠ·ìŠ¹ì‹œì‹ì‹ ì‹£ì‹¤ì‹«ì‹¬ì‹­ì‹¯ì‹±ì‹¶ì‹¸ì‹¹ì‹»ì‹¼ìŒ€ìŒˆìŒ‰ìŒŒìŒìŒ“쌔쌕쌘쌜쌤쌥쌨쌩ì…ì¨ì©ì¬ì°ì²ì¸ì¹ì¼ì½ìŽ„ìŽˆìŽŒì€ì˜ì™ìœìŸì ì¢ì¨ì©ì­ì´ìµì¸ìˆìì¤ì¬ì°"], +["be41","í¸",7,"í‘푂푃푅",14], +["be61","í‘”",7,"í‘푞푟푡푢푣푥",7,"푮푰푱푲"], +["be81","푳",4,"푺푻푽푾í’í’ƒ",4,"풊풌풎",5,"í’•",8,"ì´ì¼ì½ì‘ˆì‘¤ì‘¥ì‘¨ì‘¬ì‘´ì‘µì‘¹ì’€ì’”쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀ì”씌ì”씔씜씨씩씬씰씸씹씻씽아악안앉않알ì•앎앓암압앗았앙ì•앞애액앤앨앰앱앳앴앵야약얀얄얇얌ì–ì–양얕얗얘얜얠얩어억언얹얻얼얽얾엄",6,"엌엎"], +["bf41","í’ž",10,"í’ª",14], +["bf61","í’¹",18,"í“퓎í“í“‘í“’í““í“•"], +["bf81","í“–",5,"í“퓞퓠",7,"퓩퓪퓫퓭퓮퓯퓱",6,"퓹퓺퓼ì—엑엔엘엠엡엣엥여역엮연열엶엷염",5,"옅옆옇예옌ì˜ì˜˜ì˜™ì˜›ì˜œì˜¤ì˜¥ì˜¨ì˜¬ì˜­ì˜®ì˜°ì˜³ì˜´ì˜µì˜·ì˜¹ì˜»ì™€ì™ì™„왈ì™ì™‘왓왔왕왜ì™ì™ ì™¬ì™¯ì™±ì™¸ì™¹ì™¼ìš€ìšˆìš‰ìš‹ìšìš”욕욘욜욤욥욧용우욱운울욹욺움ì›ì›ƒì›…워ì›ì›ì›”웜ì›ì› ì›¡ì›¨"], +["c041","퓾",5,"픅픆픇픉픊픋í”",6,"픖픘",5], +["c061","픞",25], +["c081","픸픹픺픻픾픿í•핂핃핅",6,"핎í•í•’",5,"핚핛í•핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽ì€ì„ìŠìŒììì‘",7,"ìœì ì¨ì«ì´ìµì¸ì¼ì½ì¾ìžƒìž„입잇있잉잊잎ìžìž‘잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀ìŸìŸˆìŸ‰ìŸŒìŸŽìŸìŸ˜ìŸìŸ¤ìŸ¨ìŸ¬ì €ì ì „절젊"], +["c141","핤핦핧핪핬핮",5,"핶핷핹핺핻핽",6,"햆햊햋"], +["c161","í–Œí–í–Ží–í–‘",19,"햦햧"], +["c181","í–¨",31,"ì ì ‘ì “ì •ì –ì œì ì  ì ¤ì ¬ì ­ì ¯ì ±ì ¸ì ¼ì¡€ì¡ˆì¡‰ì¡Œì¡ì¡”조족존졸졺좀ì¢ì¢ƒì¢…좆좇좋좌ì¢ì¢”ì¢ì¢Ÿì¢¡ì¢¨ì¢¼ì¢½ì£„죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌ì¤ì¤ì¤‘줘줬줴ì¥ì¥‘쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌ì¦ì¦˜ì¦™ì¦›ì¦ì§€ì§ì§„짇질짊ì§ì§‘ì§“"], +["c241","í—Ší—‹í—í—Ží—í—‘í—“",4,"헚헜헞",5,"헦헧헩헪헫헭헮"], +["c261","í—¯",4,"헶헸헺",5,"혂혃혅혆혇혉",6,"혒"], +["c281","혖",5,"í˜í˜ží˜Ÿí˜¡í˜¢í˜£í˜¥",7,"혮",9,"혺혻징짖짙짚짜ì§ì§ ì§¢ì§¤ì§§ì§¬ì§­ì§¯ì§°ì§±ì§¸ì§¹ì§¼ì¨€ì¨ˆì¨‰ì¨‹ì¨Œì¨ì¨”쨘쨩쩌ì©ì©ì©”쩜ì©ì©Ÿì© ì©¡ì©¨ì©½ìª„쪘쪼쪽쫀쫄쫌ì«ì«ì«‘쫓쫘쫙쫠쫬쫴쬈ì¬ì¬”쬘쬠쬡ì­ì­ˆì­‰ì­Œì­ì­˜ì­™ì­ì­¤ì­¸ì­¹ì®œì®¸ì¯”쯤쯧쯩찌ì°ì°ì°”ì°œì°ì°¡ì°¢ì°§ì°¨ì°©ì°¬ì°®ì°°ì°¸ì°¹ì°»"], +["c341","혽혾혿í™í™‚홃홄홆홇홊홌홎í™í™í™’홓홖홗홙홚홛í™",4], +["c361","홢",4,"홨홪",5,"홲홳홵",11], +["c381","íšíš‚횄횆",5,"횎íšíš‘횒횓횕",7,"횞횠횢",5,"횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉ì³ì³”쳤쳬쳰ì´ì´ˆì´‰ì´Œì´ì´˜ì´™ì´›ì´ì´¤ì´¨ì´¬ì´¹ìµœìµ ìµ¤ìµ¬ìµ­ìµ¯ìµ±ìµ¸ì¶ˆì¶”축춘출춤춥춧충춰췄췌ì·ì·¨ì·¬ì·°ì·¸ì·¹ì·»ì·½ì¸„츈츌츔츙츠측츤츨츰츱츳층"], +["c441","횫횭횮횯횱",7,"횺횼",7,"훆훇훉훊훋"], +["c461","í›í›Ží›í›í›’훓훕훖훘훚",5,"훡훢훣훥훦훧훩",4], +["c481","훮훯훱훲훳훴훶",5,"훾훿íœíœ‚휃휅",11,"휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉ìºìº‘캔캘캠캡캣캤캥캬캭ì»ì»¤ì»¥ì»¨ì»«ì»¬ì»´ì»µì»·ì»¸ì»¹ì¼€ì¼ì¼„켈ì¼ì¼‘켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼"], +["c541","휕휖휗휚휛íœíœžíœŸíœ¡",6,"휪휬휮",5,"휶휷휹"], +["c561","휺휻휽",6,"í…í†íˆíŠ",5,"í’í“í•íš",4], +["c581","íŸí¢í¤í¦í§í¨íªí«í­í®í¯í±í²í³íµ",6,"í¾í¿íž€íž‚",5,"힊힋í„í…í‡í‰íí”í˜í í¬í­í°í´í¼í½í‚키킥킨킬킴킵킷킹타íƒíƒ„탈탉íƒíƒ‘탓탔탕태íƒíƒ íƒ¤íƒ¬íƒ­íƒ¯íƒ°íƒ±íƒ¸í„터턱턴털턺텀í…텃텄텅테í…í…텔템í…텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉íˆíˆ¬íˆ­íˆ°íˆ´íˆ¼íˆ½íˆ¿í‰í‰ˆí‰œ"], +["c641","ížížŽížíž‘",6,"힚힜힞",5], +["c6a1","퉤튀íŠíŠ„íŠˆíŠíŠ‘íŠ•íŠœíŠ íŠ¤íŠ¬íŠ±íŠ¸íŠ¹íŠ¼íŠ¿í‹€í‹‚í‹ˆí‹‰í‹‹í‹”í‹˜í‹œí‹¤í‹¥í‹°í‹±í‹´í‹¸íŒ€íŒíŒƒíŒ…파íŒíŒŽíŒíŒ”팖팜íŒíŒŸíŒ íŒ¡íŒ¥íŒ¨íŒ©íŒ¬íŒ°íŒ¸íŒ¹íŒ»íŒ¼íŒ½í„í…í¼í½íŽ€íŽ„íŽŒíŽíŽíŽíŽ‘íŽ˜íŽ™íŽœíŽ íŽ¨íŽ©íŽ«íŽ­íŽ´íŽ¸íŽ¼í„í…íˆí‰íí˜í¡í£í¬í­í°í´í¼í½í¿í"], +["c7a1","íˆí푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋í’풔풩퓌í“퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌í•í•핑하학한할핥함합핫항해핵핸핼햄햅햇했행í–향허헉헌í—헒험헙헛í—헤헥헨헬헴헵헷헹혀í˜í˜„혈í˜í˜‘혓혔형혜혠"], +["c8a1","혤혭호혹혼홀홅홈홉홋í™í™‘화확환활홧황홰홱홴횃횅회íšíšíš”íšíšŸíš¡íš¨íš¬íš°íš¹íš»í›„훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼í„í‡í‰íí‘í”í–í—í˜í™í í¡í£í¥í©í¬í°í´í¼í½ížížˆíž‰ížŒížíž˜íž™íž›íž"], +["caa1","伽佳å‡åƒ¹åŠ å¯å‘µå“¥å˜‰å«å®¶æš‡æž¶æž·æŸ¯æ­Œç‚痂稼苛茄街袈訶賈è·è»»è¿¦é§•刻å´å„æªæ…¤æ®¼çè„šè¦ºè§’é–£ä¾ƒåˆŠå¢¾å¥¸å§¦å¹²å¹¹æ‡‡æ€æ†æŸ¬æ¡¿æ¾—癎看磵稈竿簡è‚è‰®è‰±è««é–“ä¹«å–æ›·æ¸´ç¢£ç«­è‘›è¤èŽéž¨å‹˜åŽå ªåµŒæ„Ÿæ†¾æˆ¡æ•¢æŸ‘橄減甘疳監瞰紺邯鑑鑒龕"], +["cba1","匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑è¥è¬›é‹¼é™é±‡ä»‹ä»·å€‹å‡±å¡æ„·æ„¾æ…¨æ”¹æ§ªæ¼‘疥皆盖箇芥蓋豈鎧開喀客å‘ï¤ç²³ç¾¹é†µå€¨åŽ»å±…å·¨æ‹’æ®æ“šæ“§æ¸ ç‚¬ç¥›è·è¸žï¤‚é½é‰…鋸乾件å¥å·¾å»ºæ„†æ¥—腱虔蹇éµé¨«ä¹žå‚‘æ°æ¡€å„‰åŠåŠ’æª¢"], +["cca1","çž¼éˆé»”åŠ«æ€¯è¿²åˆæ†©æ­æ“Šæ ¼æª„激膈覡隔堅牽犬甄絹繭肩見譴é£éµ‘抉決潔çµç¼ºè¨£å…¼æ…Šç®è¬™é‰—鎌京俓倞傾儆å‹å‹å¿å°å¢ƒåºšå¾‘慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕é¡é ƒé ¸é©šé¯¨ä¿‚啓堺契季屆悸戒桂械"], +["cda1","棨溪界癸磎稽系繫繼計誡谿階鷄å¤å©å‘Šå‘±å›ºå§‘å­¤å°»åº«æ‹·æ”·æ•…æ•²æš æž¯æ§æ²½ç—¼çšç¾ç¨¿ç¾”考股è†è‹¦è‹½è°è—蠱袴誥賈辜錮雇顧高鼓哭斛曲æ¢ç©€è°·éµ å›°å¤å´‘æ˜†æ¢±æ£æ»¾ç¨è¢žé¯¤æ±¨ï¤„éª¨ä¾›å…¬å…±åŠŸå­”å·¥ææ­æ‹±æŽ§æ”»ç™ç©ºèš£è²¢éžä¸²å¯¡æˆˆæžœç“œ"], +["cea1","ç§‘è“誇課跨éŽé‹é¡†å»“槨藿郭串冠官寬慣棺款çŒç¯ç“˜ç®¡ç½è…è§€è²«é—œé¤¨åˆ®ææ‹¬é€‚侊光匡壙廣曠洸炚狂ç–ç­èƒ±é‘›å¦æŽ›ç½«ä¹–å‚€å¡Šå£žæ€ªæ„§æ‹æ§é­å®ç´˜è‚±è½Ÿäº¤åƒ‘咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久ä¹ä»‡ä¿±å…·å‹¾"], +["cfa1","å€å£å¥å’Žå˜”åµåž¢å¯‡å¶‡å»æ‡¼æ‹˜æ•‘æž¸æŸ©æ§‹æ­æ¯†æ¯¬æ±‚æºç¸ç‹—玖çƒçž¿çŸ©ç©¶çµ¿è€‰è‡¼èˆ…舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局èŠéž éž«éº´å›çª˜ç¾¤è£™è»éƒ¡å €å±ˆæŽ˜çªŸå®®å¼“穹窮芎躬倦券勸å·åœˆæ‹³æ²æ¬Šæ·ƒçœ·åŽ¥ç—蕨蹶闕机櫃潰詭軌饋句晷歸貴"], +["d0a1","鬼龜å«åœ­å¥Žæ†æ§»çªç¡…窺竅糾葵è¦èµ³é€µé–¨å‹»å‡ç•‡ç­ èŒéˆžï¤ˆæ©˜å…‹å‰‹åŠ‡æˆŸæ£˜æ¥µéš™åƒ…åŠ¤å‹¤æ‡ƒæ–¤æ ¹æ§¿ç‘¾ç­‹èŠ¹è«è¦²è¬¹è¿‘饉契今妗擒昑檎ç´ç¦ç¦½èŠ©è¡¾è¡¿è¥Ÿï¤ŠéŒ¦ä¼‹åŠæ€¥æ‰±æ±²ç´šçµ¦äº˜å…¢çŸœè‚¯ä¼ä¼Žå…¶å†€å—œå™¨åœ»åŸºåŸ¼å¤”奇妓寄å²å´Žå·±å¹¾å¿ŒæŠ€æ——æ—£"], +["d1a1","æœžæœŸæžæ£‹æ£„機欺氣汽沂淇玘ç¦çªç’‚璣畸畿ç¢ç£¯ç¥ç¥‡ç¥ˆç¥ºç®•紀綺羈耆耭肌記è­è±ˆèµ·éŒ¡éŒ¤é£¢é¥‘騎é¨é©¥éº’ç·Šä½¶å‰æ‹®æ¡”é‡‘å–«å„ºï¤‹ï¤Œå¨œæ‡¦ï¤æ‹æ‹¿ï¤Ž",5,"那樂",4,"諾酪駱亂卵暖ï¤ç…–ï¤žï¤Ÿé›£ï¤ ææºå—ï¤¡æžæ¥ æ¹³ï¤¢ç”·ï¤£ï¤¤ï¤¥"], +["d2a1","ç´ï¤¦ï¤§è¡²å›Šå¨˜ï¤¨",4,"乃來內奈柰è€ï¤®å¥³å¹´æ’šç§Šå¿µæ¬æ‹ˆæ»å¯§å¯—努勞奴弩怒擄櫓爐瑙盧",5,"駑魯",10,"濃籠聾膿農惱牢磊腦賂雷尿壘",7,"嫩訥æ»ç´ï¥’",5,"能菱陵尼泥匿溺多茶"], +["d3a1","丹亶但單團壇彖斷旦檀段æ¹çŸ­ç«¯ç°žç·žè›‹è¢’鄲雿’»æ¾¾çºç–¸é”啖忆ºæ“”曇淡湛潭澹痰èƒè†½è•覃談譚錟沓畓答è¸éå”堂塘幢戇撞棠當糖螳黨代垈å®å¤§å°å²±å¸¶å¾…æˆ´æ“¡çŽ³è‡ºè¢‹è²¸éšŠé»›å®…å¾·æ‚³å€’åˆ€åˆ°åœ–å µå¡—å°Žå± å³¶å¶‹åº¦å¾’æ‚¼æŒ‘æŽ‰æ—æ¡ƒ"], +["d4a1","棹櫂淘渡滔濤燾盜ç¹ç¦±ç¨»è„覩賭跳蹈逃途é“都é陶韜毒瀆牘犢ç¨ç£ç¦¿ç¯¤çº›è®€å¢©æƒ‡æ•¦æ—½æš¾æ²Œç„žç‡‰è±šé “ä¹­çªä»å†¬å‡å‹•åŒæ†§æ±æ¡æ£Ÿæ´žæ½¼ç–¼çž³ç«¥èƒ´è‘£éŠ…å…œæ–—æœæž“痘竇è³ï¥šè±†é€—頭屯臀芚éé¯éˆå¾—å¶æ©™ç‡ˆç™»ç­‰è—¤è¬„鄧騰喇懶拏癩羅"], +["d5a1","蘿螺裸é‚樂洛烙çžçµ¡è½ï¥é…ªé§±ï¥žäº‚嵿¬„æ¬’ç€¾çˆ›è˜­é¸žå‰Œè¾£åµæ“¥æ”¬æ¬–濫籃纜è—襤覽拉臘蠟廊朗浪狼ç…瑯螂郞來å´å¾ èŠå†·æŽ ç•¥äº®å€†å…©å‡‰æ¢æ¨‘粮粱糧良諒輛é‡ä¾¶å„·å‹µå‘‚廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷ç€ç¤«è½¢é‚æ†æˆ€æ”£æ¼£"], +["d6a1","煉璉練è¯è“®è¼¦é€£éŠå†½åˆ—劣洌烈裂廉斂殮濂簾çµä»¤ä¼¶å›¹ï¥Ÿå²ºå¶ºæ€œçŽ²ç¬­ç¾šç¿Žè†é€žéˆ´é›¶éˆé ˜é½¡ä¾‹æ¾§ç¦®é†´éš·å‹žï¥ æ’ˆæ“„櫓潞瀘çˆç›§è€è˜†è™œè·¯è¼…露魯鷺鹵碌祿綠è‰éŒ„鹿麓論壟弄朧瀧ç“ç± è¾å„¡ç€¨ç‰¢ç£Šè³‚賚賴雷了僚寮廖料燎療瞭èŠè“¼"], +["d7a1","é¼é¬§é¾å£˜å©å±¢æ¨“æ·šæ¼ç˜»ç´¯ç¸·è”žè¤¸é¤é™‹åŠ‰æ—’æŸ³æ¦´æµæºœç€ç‰ç‘ ç•™ç˜¤ç¡«è¬¬é¡žå…­æˆ®é™¸ä¾–倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾è±é™µä¿šåˆ©åŽ˜åå”Žå±¥æ‚§æŽæ¢¨æµ¬çŠç‹¸ç†ç’ƒï¥¢ç—¢ç±¬ç½¹ç¾¸èމè£è£¡é‡Œé‡é›¢é¯‰åæ½¾ç‡ç’˜è—ºèºªéš£é±—麟林淋ç³è‡¨éœ–ç ¬"], +["d8a1","立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万å娩巒彎慢挽晩曼滿漫ç£çžžè¬è”“蠻輓饅鰻唜抹末沫茉襪éºäº¡å¦„å¿˜å¿™æœ›ç¶²ç½”èŠ’èŒ«èŽ½è¼žé‚™åŸ‹å¦¹åª’å¯æ˜§æžšæ¢…æ¯ç…¤ç½µè²·è³£é‚魅脈貊陌驀麥孟氓猛盲盟èŒå†ªè¦“å…冕勉棉沔眄眠綿緬é¢éºµæ»…"], +["d9a1","蔑冥åå‘½æ˜Žæšæ¤§æºŸçš¿çž‘èŒ—è“‚èžŸé…©éŠ˜é³´è¢‚ä¾®å†’å‹Ÿå§†å¸½æ…•æ‘¸æ‘¹æš®æŸæ¨¡æ¯æ¯›ç‰Ÿç‰¡ç‘眸矛耗芼茅謀謨貌木æ²ç‰§ç›®ç¦ç©†é¶©æ­¿æ²’夢朦蒙å¯å¢“å¦™å»Ÿææ˜´æ³æ¸ºçŒ«ç«—苗錨務巫憮懋戊拇撫无楙武毋無ç·ç•繆舞茂蕪誣貿霧鵡墨默們刎å»å•æ–‡"], +["daa1","æ±¶ç´Šç´‹èžèšŠé–€é›¯å‹¿æ²•物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷é¡é»´å²·æ‚¶æ„æ†«æ•æ—»æ—¼æ°‘泯玟ç‰ç·¡é–”密蜜è¬å‰åšæ‹ææ’²æœ´æ¨¸æ³Šç€ç’žç®”粕縛膊舶薄迫雹é§ä¼´åŠå囿‹Œæ¬æ”€æ–‘槃泮潘ç­ç•”瘢盤盼ç£ç£»ç¤¬çµ†èˆ¬èŸ è¿”頒飯勃拔撥渤潑"], +["dba1","發跋醱鉢髮魃倣å‚åŠå¦¨å°¨å¹‡å½·æˆ¿æ”¾æ–¹æ—昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防é¾å€ä¿³ï¥£åŸ¹å¾˜æ‹œæŽ’æ¯æ¹ƒç„™ç›ƒèƒŒèƒšè£´è£µè¤™è³ è¼©é…é™ªä¼¯ä½°å¸›æŸæ ¢ç™½ç™¾é­„幡樊煩燔番磻ç¹è•ƒè—©é£œä¼ç­ç½°é–¥å‡¡å¸†æ¢µæ°¾æ±Žæ³›çŠ¯ç¯„èŒƒæ³•çºåƒ»åŠˆå£æ“˜æª—ç’§ç™–"], +["dca1","碧蘗闢霹便åžå¼è®Šè¾¨è¾¯é‚Šåˆ¥çž¥é±‰é¼ˆä¸™å€‚兵屛幷昞昺柄棅炳ç”病秉ç«è¼§é¤ é¨ˆä¿å ¡å ±å¯¶æ™®æ­¥æ´‘湺潽ç¤ç”«è©è£œè¤“譜輔ä¼åƒ•åŒåœå®“復æœç¦è…¹èŒ¯è””複覆輹輻馥鰒本乶俸奉å°å³¯å³°æ§æ£’烽熢ç«ç¸«è“¬èœ‚逢鋒鳳ä¸ä»˜ä¿¯å‚…剖副å¦å’埠夫婦"], +["dda1","孚孵富府復扶敷斧浮溥父符簿缶è…腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分å©å™´å¢³å¥”å¥®å¿¿æ†¤æ‰®æ˜æ±¾ç„šç›†ç²‰ç³žç´›èЬè³é›°ï¥§ä½›å¼—彿拂崩朋棚硼繃鵬丕備匕匪å‘å¦ƒå©¢åº‡æ‚²æ†Šæ‰‰æ‰¹æ–æž‡æ¦§æ¯”毖毗毘沸泌çµç—ºç ’碑秕秘粃緋翡肥"], +["dea1","脾臂è²èœšè£¨èª¹è­¬è²»é„™éžé£›é¼»åš¬å¬ªå½¬æ–Œæª³æ®¯æµœæ¿±ç€•ç‰çŽ­è²§è³“é »æ†‘æ°·è˜é¨ä¹äº‹äº›ä»•伺似使俟僿å²å¸å”†å—£å››å£«å¥¢å¨‘å¯«å¯ºå°„å·³å¸«å¾™æ€æ¨æ–œæ–¯æŸ¶æŸ»æ¢­æ­»æ²™æ³—渣瀉ç…砂社祀祠ç§ç¯©ç´—絲肆èˆèŽŽè“‘è›‡è£Ÿè©è©žè¬è³œèµ¦è¾­é‚ªé£¼é§Ÿéºå‰Šï¥©æœ”索"], +["dfa1","傘刪山散汕çŠç”£ç–ç®—è’œé…¸éœ°ä¹·æ’’æ®ºç…žè–©ä¸‰ï¥«æ‰æ£®æ¸—èŠŸè”˜è¡«æ·æ¾éˆ’颯上傷åƒå„Ÿå•†å–ªå˜—孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼åºåº¶å¾æ•æŠ’æ¿æ•暑曙書栖棲犀瑞筮絮緖署"], +["e0a1","胥舒薯西誓é€é‹¤é»é¼ å¤•å¥­å¸­æƒœæ˜”æ™³æžæ±æ·…潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽ç瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣é¸éŠ‘é¥é¥é®®å¨å±‘楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾è´é–ƒé™æ”æ¶‰ç‡®ï¥®åŸŽå§“å®¬æ€§æƒºæˆæ˜Ÿæ™ŸçŒ©ç¹ç››çœç­¬"], +["e1a1","è–è²è…¥èª é†’世勢歲洗稅笹細說貰å¬å˜¯å¡‘宵å°å°‘å·¢æ‰€æŽƒæ”æ˜­æ¢³æ²¼æ¶ˆæº¯ç€Ÿç‚¤ç‡’甦ç–疎瘙笑篠簫素紹蔬蕭蘇訴é€é¡é‚µéŠ·éŸ¶é¨·ä¿—å±¬æŸæ¶‘粟續謖贖速孫巽æè“€éœé£¡çŽ‡å®‹æ‚šæ¾æ·žè¨Ÿèª¦é€é Œåˆ·ï¥°ç‘碎鎖衰釗修å—嗽囚垂壽嫂守岫峀帥æ„"], +["e2a1","æˆæ‰‹æŽˆæœæ”¶æ•¸æ¨¹æ®Šæ°´æ´™æ¼±ç‡§ç‹©ç¸ç‡ç’²ç˜¦ç¡ç§€ç©—竪粹ç¶ç¶¬ç¹¡ç¾žè„©èŒ±è’蓚藪袖誰è®è¼¸é‚邃酬銖銹隋隧隨雖需須首髓鬚å”塾夙孰宿淑潚熟ç¡ç’¹è‚…è½å·¡å¾‡å¾ªæ‚旬栒楯橓殉洵淳ç£ç›¾çž¬ç­ç´”脣舜è€è“´è•£è©¢è«„醇錞順馴戌術述鉥崇崧"], +["e3a1","嵩瑟è†è¨æ¿•拾習褶襲丞乘僧å‹å‡æ‰¿æ˜‡ç¹©è …陞ä¾åŒ™å˜¶å§‹åª¤å°¸å±Žå±å¸‚å¼‘æƒæ–½æ˜¯æ™‚枾柴猜矢示翅蒔è“è¦–è©¦è©©è«¡è±•è±ºåŸ´å¯”å¼æ¯æ‹­æ¤æ®–湜熄篒è•識軾食飾伸ä¾ä¿¡å‘»å¨ å®¸æ„¼æ–°æ™¨ç‡¼ç”³ç¥žç´³è…Žè‡£èŽ˜è–ªè—Žèœƒè¨Šèº«è¾›ï¥±è¿…å¤±å®¤å¯¦æ‚‰å¯©å°‹å¿ƒæ²"], +["e4a1","沈深瀋甚芯諶什å拾雙æ°äºžä¿„兒啞娥峨我牙芽莪蛾衙è¨é˜¿é›…餓鴉éµå Šå²³å¶½å¹„æƒ¡æ„•æ¡æ¨‚渥鄂é”顎é°é½·å®‰å²¸æŒ‰æ™æ¡ˆçœ¼é›éžé¡”鮟斡è¬è»‹é–¼å”µå²©å·–庵暗癌è´é—‡å£“æŠ¼ç‹Žé´¨ä»°å¤®æ€æ˜»æ®ƒç§§é´¦åŽ“å“€åŸƒå´–æ„›æ›–æ¶¯ç¢è‰¾éš˜é„厄扼掖液縊腋é¡"], +["e5a1","æ«»ç½Œé¶¯é¸šä¹Ÿå€»å†¶å¤œæƒ¹æ¶æ¤°çˆºè€¶ï¥´é‡Žå¼±ï¥µï¥¶ç´„若葯蒻藥èºï¥·ä½¯ï¥¸ï¥¹å£¤å­ƒæ™æšæ”˜æ•­æš˜ï¥ºæ¥Šæ¨£æ´‹ç€ç…¬ç—’ç˜ç¦³ç©°ï¥»ç¾Šï¥¼è¥„諒讓釀陽量養圄御於æ¼ç˜€ç¦¦èªžé¦­é­šé½¬å„„憶抑æªè‡†åƒå °å½¦ç„‰è¨€è«ºå­¼è˜–俺儼嚴奄掩淹嶪業円予余勵呂ï¦å¦‚廬"], +["e6a1","旅歟æ±ï¦„璵礖礪與艅茹輿è½ï¦†é¤˜ï¦‡ï¦ˆï¦‰äº¦ï¦ŠåŸŸå½¹æ˜“曆歷疫繹譯ï¦é€†é©›åš¥å §å§¸å¨Ÿå®´ï¦Žå»¶ï¦ï¦ææŒ»ï¦‘椽沇沿涎涓淵演漣烟然煙煉燃燕璉ç¡ç¡¯ï¦•筵緣練縯聯è¡è»Ÿï¦˜ï¦™ï¦šé‰›ï¦›é³¶ï¦œï¦ï¦žæ‚…涅烈熱裂說閱厭廉念捻染殮炎焰ç°è‰¶è‹’"], +["e7a1","簾閻髥鹽曄獵ç‡è‘‰ï¦¨ï¦©å¡‹ï¦ªï¦«å¶¸å½±ï¦¬æ˜ æšŽæ¥¹æ¦®æ°¸æ³³æ¸¶æ½æ¿šç€›ç€¯ç…營ç°ï¦­ç‘›ï¦®ç“”盈穎纓羚聆英詠迎鈴éˆï¦²éœ™ï¦³ï¦´ä¹‚å€ªï¦µåˆˆå¡æ›³æ±­æ¿ŠçŒŠç¿ç©¢èŠ®è—蘂禮裔詣譽豫醴銳隸霓é äº”ä¼ä¿‰å‚²åˆå¾å³å—šå¡¢å¢ºå¥§å¨›å¯¤æ‚Ÿï¦¹æ‡Šæ•–旿晤梧汚澳"], +["e8a1","çƒç†¬ç’筽蜈誤鰲鼇屋沃ç„玉鈺溫瑥瘟穩縕蘊兀壅æ“瓮甕癰ç¿é‚•é›é¥”渦瓦窩窪臥蛙è¸è¨›å©‰å®Œå®›æ¢¡æ¤€æµ£çŽ©ç“ç¬ç¢—緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬å·çŒ¥ç•ï¦ºï¦»åƒ¥å‡¹å ¯å¤­å¦–å§šå¯¥ï¦¼ï¦½å¶¢æ‹—æ–æ’“擾料曜樂橈燎燿瑤ï§"], +["e9a1","窈窯繇繞耀腰蓼蟯è¦è¬ é™ï§ƒé‚€é¥’慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬è³èŒ¸è“‰è¸ŠéŽ”éžï§„于佑å¶å„ªåˆå‹å³å®‡å¯“尤愚憂旴牛玗瑀盂ç¥ç¦‘禹紆羽芋藕虞迂é‡éƒµé‡ªéš…雨雩勖彧旭昱栯煜稶éƒé Šäº‘暈橒殞æ¾ç†‰è€˜èŠ¸è•“"], +["eaa1","é‹éš•雲韻蔚鬱äºç†Šé›„å…ƒåŽŸå“¡åœ“åœ’åž£åª›å«„å¯ƒæ€¨æ„¿æ´æ²…洹湲æºçˆ°çŒ¿ç‘—è‹‘è¢è½…é ï§†é™¢é¡˜é´›æœˆè¶Šé‰žä½å‰åƒžå±åœå§”å¨å°‰æ…°æšæ¸­çˆ²ç‘‹ç·¯èƒƒèŽè‘¦è”¿èŸè¡›è¤˜è¬‚é•韋é­ä¹³ä¾‘å„’å…ªï§‡å”¯å–©å­ºå®¥å¹¼å¹½åº¾æ‚ æƒŸæ„ˆæ„‰æ„æ”¸æœ‰ï§ˆæŸ”柚柳楡楢油洧流游溜"], +["eba1","濡猶猷琉瑜由ï§ç™’ï§Žï§ç¶­è‡¾è¸è£•誘諛諭踰蹂éŠé€¾éºé…‰é‡‰é®ï§ï§‘堉戮毓肉育陸倫å…奫尹崙淪潤玧胤贇輪鈗é–ï§˜ï§™ï§šï§›è¿æˆŽç€œçµ¨èžï§œåž æ©æ…‡æ®·èª¾éŠ€éš±ä¹™åŸæ·«è”­é™°éŸ³é£®æ–æ³£é‚‘å‡æ‡‰è†ºé·¹ä¾å€šå„€å®œæ„懿擬椅毅疑矣義艤è–蟻衣誼"], +["eca1","議醫二以伊ï§ï§žå¤·å§¨ï§Ÿå·²å¼›å½›æ€¡ï§ ï§¡ï§¢ï§£çˆ¾ç¥ï§¤ç•°ç—痢移罹而耳肄苡è‘裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人ä»åˆƒå°ï§­å’½å› å§»å¯…å¼•å¿æ¹®ï§®ï§¯çµªèŒµï§°èš“èªï§±é­é·ï§²ï§³ä¸€ä½šä½¾å£¹æ—¥æº¢é€¸éŽ°é¦¹ä»»å£¬å¦Šå§™æï§´ï§µç¨”ï§¶è賃入å„"], +["eda1","立笠粒ä»å‰©å­•芿仔刺咨姉姿å­å­—å­œæ£æ…ˆæ»‹ç‚™ç…®çŽ†ç“·ç–µç£ç´«è€…自茨蔗藉諮資雌作勺嚼斫昨ç¼ç‚¸çˆµç¶½èŠé…Œé›€éµ²å­±æ£§æ®˜æ½ºç›žå²‘æš«æ½›ç®´ç°ªè ¶é›œä¸ˆä»—åŒ å ´å¢»å£¯å¥¬å°‡å¸³åº„å¼µæŽŒæš²æ–æ¨Ÿæª£æ¬Œæ¼¿ç‰†ï§ºç璋章粧腸臟臧莊葬蔣薔è—è£è´“醬長"], +["eea1","éšœå†å“‰åœ¨å®°æ‰ææ ½æ¢“渽滓ç½ç¸¡è£è²¡è¼‰é½‹é½Žçˆ­ç®è«éŒšä½‡ä½Žå„²å’€å§åº•æŠµæµæ¥®æ¨—沮渚狙猪疽箸紵苧è¹è‘—藷詛貯躇這邸雎齟勣åŠå«¡å¯‚摘敵滴狄炙的ç©ç¬›ç±ç¸¾ç¿Ÿè»è¬«è³Šèµ¤è·¡è¹Ÿè¿ªè¿¹é©é‘佃佺傳全典å‰å‰ªå¡¡å¡¼å¥ å°ˆå±•廛悛戰栓殿氈澱"], +["efa1","ç…Žç ç”°ç”¸ç•‘癲筌箋箭篆çºè©®è¼¾è½‰éˆ¿éŠ“éŒ¢é«é›»é¡šé¡«é¤žåˆ‡æˆªæŠ˜æµ™ç™¤ç«Šç¯€çµ¶å å²¾åº—漸点粘霑鮎點接摺è¶ä¸äº•亭åœåµå‘ˆå§ƒå®šå¹€åº­å»·å¾æƒ…挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎ç½ç”ºç›ç¢‡ç¦Žç¨‹ç©½ç²¾ç¶Žè‰‡è¨‚諪貞鄭酊釘鉦鋌錠霆é–"], +["f0a1","éœé ‚鼎制劑啼堤å¸å¼Ÿæ‚Œææ¢¯æ¿Ÿç¥­ç¬¬è‡è–ºè£½è«¸è¹„é†é™¤éš›éœ½é¡Œé½Šä¿Žå…†å‡‹åŠ©å˜²å¼”å½«æŽªæ“æ—©æ™æ›ºæ›¹æœæ¢æ£—槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙èºé€ é­é‡£é˜»é›•é³¥æ—簇足éƒå­˜å°Šå’æ‹™çŒå€§å®—從悰慫棕淙ç®ç¨®çµ‚綜縱腫"], +["f1a1","踪踵é¾é˜ä½å左座挫罪主ä½ä¾åšå§èƒ„呪周嗾å¥å®™å·žå»šæ™æœ±æŸ±æ ªæ³¨æ´²æ¹Šæ¾ç‚·ç ç–‡ç±Œç´‚紬綢舟蛛註誅走躊輳週酎酒鑄é§ç«¹ç²¥ä¿Šå„准埈寯峻晙樽浚準濬焌畯竣蠢逡éµé›‹é§¿èŒä¸­ä»²è¡†é‡å½æ«›æ¥«æ±è‘ºå¢žæ†Žæ›¾æ‹¯çƒç”‘症繒蒸證贈之åª"], +["f2a1","咫地å€å¿—æŒæŒ‡æ‘¯æ”¯æ—¨æ™ºæžæž³æ­¢æ± æ²šæ¼¬çŸ¥ç ¥ç¥‰ç¥—紙肢脂至èŠèŠ·èœ˜èªŒï§¼è´„è¶¾é²ç›´ç¨™ç¨·ç¹”è·å”‡å—”å¡µæŒ¯æ¢æ™‰æ™‹æ¡­æ¦›æ®„津溱ç瑨璡畛疹盡眞瞋秦縉ç¸è‡»è”¯è¢—診賑軫辰進鎭陣陳震侄å±å§ªå«‰å¸™æ¡Žç“†ç–¾ç§©çª’膣蛭質跌迭斟朕什執潗ç·è¼¯"], +["f3a1","é¶é›†å¾µæ‡²æ¾„且侘借å‰å—Ÿåµ¯å·®æ¬¡æ­¤ç£‹ç®šï§¾è¹‰è»Šé®æ‰æ¾ç€çª„錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽é¤é¥Œåˆ¹å¯Ÿæ“¦æœ­ç´®åƒ­åƒå¡¹æ…˜æ…™æ‡ºæ–¬ç«™è®’è®–å€‰å€¡å‰µå”±å¨¼å» å½°æ„´æ•žæ˜Œæ˜¶æš¢æ§æ»„漲猖瘡窓脹艙è–蒼債埰寀寨彩採砦綵èœè”¡é‡‡é‡µå†ŠæŸµç­–"], +["f4a1","責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟åƒå–˜å¤©å·æ“…泉淺玔穿舛薦賤è¸é·é‡§é—¡é˜¡éŸ†å‡¸å“²å–†å¾¹æ’¤æ¾ˆç¶´è¼Ÿè½éµåƒ‰å°–沾添甛瞻簽籤詹諂堞妾帖æ·ç‰’ç–Šç«è«œè²¼è¼’廳晴淸è½èè«‹é‘鯖切剃替涕滯締諦逮éžé«”åˆå‰¿å“¨æ†”抄招梢"], +["f5a1","椒楚樵炒焦ç¡ç¤ç¤Žç§’ç¨è‚–艸苕è‰è•‰è²‚超酢醋醮促囑燭矗蜀觸寸忖æ‘邨å¢å¡šå¯µæ‚¤æ†æ‘ ç¸½è°è”¥éŠƒæ’®å‚¬å´”æœ€å¢œæŠ½æŽ¨æ¤Žæ¥¸æ¨žæ¹«çšºç§‹èŠ»è©è«è¶¨è¿½é„’酋醜éŒéŒ˜éŽšé››é¨¶é°ä¸‘畜ç¥ç«ºç­‘ç¯‰ç¸®è“„è¹™è¹´è»¸é€æ˜¥æ¤¿ç‘ƒå‡ºæœ®é»œå……忠沖蟲è¡è¡·æ‚´è†µèƒ"], +["f6a1","è´…å–å¹å˜´å¨¶å°±ç‚Šç¿ èšè„†è‡­è¶£é†‰é©Ÿé·²å´ä»„åŽ æƒ»æ¸¬å±¤ä¾ˆå€¤å—¤å³™å¹Ÿæ¥æ¢”治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸ç›ç §é‡é¼èŸ„秤稱快他咤唾墮妥惰打拖朶楕舵陀馱é§å€¬å“å•„å¼ï¨æ‰˜ï¨‚æ“¢æ™«æŸæ¿æ¿¯ç¢ç¸è¨—"], +["f7a1","é¸å‘‘嘆å¦å½ˆæ†šæ­Žç˜ç‚­ç¶»èª•å¥ªè„«æŽ¢çœˆè€½è²ªå¡”æ­æ¦»å®•帑湯糖蕩兌å°å¤ªæ€ æ…‹æ®†æ±°æ³°ç¬žèƒŽè‹”跆邰颱宅擇澤撑攄兎å土討慟桶洞痛筒統通堆槌腿褪退頹å¸å¥—妬投é€é¬ªæ…特闖å¡å©†å·´æŠŠæ’­æ“ºæ·æ³¢æ´¾çˆ¬ç¶ç ´ç½·èŠ­è·›é —åˆ¤å‚æ¿ç‰ˆç“£è²©è¾¦éˆ‘"], +["f8a1","é˜ªå…«å­æŒä½©å”„悖敗沛浿牌狽稗覇è²å½­æ¾Žçƒ¹è†¨æ„Žä¾¿åæ‰ç‰‡ç¯‡ç·¨ç¿©é鞭騙貶åªå¹³æž°èè©•å å¬–幣廢弊斃肺蔽閉陛佈包åŒåŒå’†å“ºåœƒå¸ƒæ€–抛抱æ•暴泡浦疱砲胞脯苞葡蒲è¢è¤’逋鋪飽鮑幅暴æ›ç€‘çˆ†ï¨‡ä¿µå‰½å½ªæ…“æ“æ¨™æ¼‚瓢票表豹飇飄驃"], +["f9a1","å“稟楓諷豊風馮彼披疲皮被é¿é™‚匹弼必泌çŒç•¢ç–‹ç­†è‹¾é¦ä¹é€¼ä¸‹ä½•厦å¤å»ˆæ˜°æ²³ç‘•è·è¦è³€é霞鰕壑學è™è¬”é¶´å¯’æ¨æ‚旱汗漢澣瀚罕翰閑閒é™éŸ“割轄函å«å’¸å•£å–Šæª»æ¶µç·˜è‰¦éŠœé™·é¹¹åˆå“ˆç›’è›¤é–¤é—”é™œäº¢ä¼‰å§®å«¦å··æ’æŠ—æ­æ¡æ²†æ¸¯ç¼¸è‚›èˆª"], +["faa1","行降項亥å•咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸æè‡è¡Œäº«å‘åš®ç¦é„•響餉饗香噓墟虛許憲櫶ç»è»’歇險驗奕爀赫é©ä¿”峴弦懸晛泫炫玄玹ç¾çœ©ç絃絢縣舷衒見賢鉉顯孑穴血é å«Œä¿ å”夾峽挾浹狹脅脇莢é‹é °äº¨å…„刑型"], +["fba1","形泂滎瀅ç炯熒ç©ç‘©èŠèž¢è¡¡é€ˆé‚¢éŽ£é¦¨å…®å½—æƒ æ…§æš³è•™è¹Šé†¯éž‹ä¹Žäº’å‘¼å£•å£ºå¥½å²µå¼§æˆ¶æ‰ˆæ˜Šæ™§æ¯«æµ©æ·æ¹–滸澔濠濩çç‹ç¥ç‘šç“ çš“祜糊縞胡芦葫蒿虎號è´è­·è±ªéŽ¬é €é¡¥æƒ‘æˆ–é…·å©šæ˜æ··æ¸¾ç¿é­‚忽惚ç¬å“„弘汞泓洪烘紅虹訌鴻化和嬅樺ç«ç•µ"], +["fca1","ç¦ç¦¾èбè¯è©±è­è²¨é´ï¨‹æ“´æ”«ç¢ºç¢»ç©«ä¸¸å–šå¥å®¦å¹»æ‚£æ›æ­¡æ™¥æ¡“渙煥環紈還驩鰥活滑猾è±é—Šå‡°å¹Œå¾¨ææƒ¶æ„°æ…Œæ™ƒæ™„æ¦¥æ³æ¹Ÿæ»‰æ½¢ç…Œç’œçš‡ç¯ç°§è’è—é‘éšé»ƒåŒ¯å›žå»»å¾Šæ¢æ‚”懷晦會檜淮澮ç°çªç¹ªè†¾èŒ´è›”誨賄劃ç²å®–æ©«é„å“®åš†å­æ•ˆæ–…æ›‰æ¢Ÿæ¶æ·†"], +["fda1","爻肴酵é©ä¾¯å€™åŽšåŽå¼å–‰å—…帿後朽煦ç逅勛勳塤壎焄ç†ç‡»è–°è¨“暈薨喧暄煊è±å‰å–™æ¯å½™å¾½æ®æš‰ç…‡è«±è¼éº¾ä¼‘æºçƒ‹ç•¦è™§æ¤è­Žé·¸å…‡å‡¶åŒˆæ´¶èƒ¸é»‘昕欣炘痕åƒå±¹ç´‡è¨–æ¬ æ¬½æ­†å¸æ°æ´½ç¿•興僖凞喜噫å›å§¬å¬‰å¸Œæ†™æ†˜æˆ±æ™žæ›¦ç†™ç†¹ç†ºçŠ§ç¦§ç¨€ç¾²è©°"] +] diff --git a/node_modules/iconv-lite/encodings/tables/cp950.json b/node_modules/iconv-lite/encodings/tables/cp950.json new file mode 100644 index 00000000..d8bc8717 --- /dev/null +++ b/node_modules/iconv-lite/encodings/tables/cp950.json @@ -0,0 +1,177 @@ +[ +["0","\u0000",127], +["a140"," ,ã€ã€‚.‧;:?ï¼ï¸°â€¦â€¥ï¹ï¹‘﹒·﹔﹕﹖﹗|–︱—︳╴︴ï¹ï¼ˆï¼‰ï¸µï¸¶ï½›ï½ï¸·ï¸¸ã€”〕︹︺ã€ã€‘︻︼《》︽︾〈〉︿﹀「ã€ï¹ï¹‚『ã€ï¹ƒï¹„﹙﹚"], +["a1a1","﹛﹜ï¹ï¹žâ€˜â€™â€œâ€ã€ã€žâ€µâ€²ï¼ƒï¼†ï¼Šâ€»Â§ã€ƒâ—‹â—△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_Ë﹉﹊ï¹ï¹Žï¹‹ï¹Œï¹Ÿï¹ ï¹¡ï¼‹ï¼Ã—÷±√<>ï¼â‰¦â‰§â‰ âˆžâ‰’≡﹢",4,"~∩∪⊥∠∟⊿ã’ã‘∫∮∵∴♀♂⊕⊙↑↓â†â†’↖↗↙↘∥∣ï¼"], +["a240","\∕﹨$¥〒¢£%@℃℉﹩﹪﹫ã•㎜ãŽãŽžãŽãŽ¡ãŽŽãŽã„°兙兛兞å…兡兣嗧瓩糎â–",7,"â–â–Žâ–▌▋▊▉┼┴┬┤├▔─│▕┌â”└┘╭"], +["a2a1","╮╰╯â•╞╪╡◢◣◥◤╱╲╳ï¼",9,"â… ",9,"〡",8,"åå„å…A",25,"ï½",21], +["a340","wxyzΑ",16,"Σ",6,"α",16,"σ",6,"ã„…",10], +["a3a1","ã„",25,"˙ˉˊˇˋ"], +["a3e1","€"], +["a440","一乙ä¸ä¸ƒä¹ƒä¹äº†äºŒäººå„¿å…¥å…«å‡ åˆ€åˆåŠ›åŒ•ååœåˆä¸‰ä¸‹ä¸ˆä¸Šä¸«ä¸¸å‡¡ä¹…么也乞于亡兀刃勺åƒå‰å£åœŸå£«å¤•大女å­å­‘孓寸å°å°¢å°¸å±±å·å·¥å·±å·²å·³å·¾å¹²å»¾å¼‹å¼“æ‰"], +["a4a1","丑ä¸ä¸ä¸­ä¸°ä¸¹ä¹‹å°¹äºˆäº‘井互五亢ä»ä»€ä»ƒä»†ä»‡ä»ä»Šä»‹ä»„å…ƒå…內六兮公冗凶分切刈勻勾勿化匹åˆå‡å…åžåŽ„å‹åŠåå£¬å¤©å¤«å¤ªå¤­å­”å°‘å°¤å°ºå±¯å·´å¹»å»¿å¼”å¼•å¿ƒæˆˆæˆ¶æ‰‹æ‰Žæ”¯æ–‡æ–—æ–¤æ–¹æ—¥æ›°æœˆæœ¨æ¬ æ­¢æ­¹æ¯‹æ¯”æ¯›æ°æ°´ç«çˆªçˆ¶çˆ»ç‰‡ç‰™ç‰›çŠ¬çŽ‹ä¸™"], +["a540","世丕且丘主ä¹ä¹ä¹Žä»¥ä»˜ä»”仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北åŒä»ŸåŠå‰å¡å å¯å®åŽ»å¯å¤å³å¬å®å©å¨å¼å¸åµå«å¦åªå²å±å°å¥å­å»å››å›šå¤–"], +["a5a1","央失奴奶孕它尼巨巧左市布平幼å¼å¼˜å¼—å¿…æˆŠæ‰“æ‰”æ‰’æ‰‘æ–¥æ—¦æœ®æœ¬æœªæœ«æœ­æ­£æ¯æ°‘æ°æ°¸æ±æ±€æ°¾çŠ¯çŽ„çŽ‰ç“œç“¦ç”˜ç”Ÿç”¨ç”©ç”°ç”±ç”²ç”³ç–‹ç™½çš®çš¿ç›®çŸ›çŸ¢çŸ³ç¤ºç¦¾ç©´ç«‹ä¸žä¸Ÿä¹’ä¹“ä¹©äº™äº¤äº¦äº¥ä»¿ä¼‰ä¼™ä¼Šä¼•ä¼ä¼ä¼‘ä¼ä»²ä»¶ä»»ä»°ä»³ä»½ä¼ä¼‹å…‰å…‡å…†å…ˆå…¨"], +["a640","å…±å†å†°åˆ—刑划刎刖劣匈匡匠å°å±å‰ååŒåŠååå‹å„å‘ååˆåƒåŽå†å’因回å›åœ³åœ°åœ¨åœ­åœ¬åœ¯åœ©å¤™å¤šå¤·å¤¸å¦„奸妃好她如å¦å­—存宇守宅安寺尖屹州帆并年"], +["a6a1","å¼å¼›å¿™å¿–æˆŽæˆŒæˆæˆæ‰£æ‰›æ‰˜æ”¶æ—©æ—¨æ—¬æ—­æ›²æ›³æœ‰æœ½æœ´æœ±æœµæ¬¡æ­¤æ­»æ°–æ±æ±—æ±™æ±Ÿæ± æ±æ±•æ±¡æ±›æ±æ±Žç°ç‰Ÿç‰ç™¾ç«¹ç±³ç³¸ç¼¶ç¾Šç¾½è€è€ƒè€Œè€’耳è¿è‚‰è‚‹è‚Œè‡£è‡ªè‡³è‡¼èˆŒèˆ›èˆŸè‰®è‰²è‰¾è™«è¡€è¡Œè¡£è¥¿é˜¡ä¸²äº¨ä½ä½ä½‡ä½—佞伴佛何估ä½ä½‘伽伺伸佃佔似但佣"], +["a740","作你伯低伶余ä½ä½ˆä½šå…Œå…‹å…兵冶冷別判利刪刨劫助努劬匣å³åµåå­åžå¾å¦å‘Žå§å‘†å‘ƒå³å‘ˆå‘‚å›å©å‘Šå¹å»å¸å®åµå¶å å¼å‘€å±å«åŸå¬å›ªå›°å›¤å›«åŠå‘å€å"], +["a7a1","å‡åŽåœ¾åå圻壯夾å¦å¦’妨妞妣妙妖å¦å¦¤å¦“妊妥å­å­œå­šå­›å®Œå®‹å®å°¬å±€å±å°¿å°¾å²å²‘岔岌巫希åºåº‡åºŠå»·å¼„弟彤形彷役忘忌志å¿å¿±å¿«å¿¸å¿ªæˆ’æˆ‘æŠ„æŠ—æŠ–æŠ€æ‰¶æŠ‰æ‰­æŠŠæ‰¼æ‰¾æ‰¹æ‰³æŠ’æ‰¯æŠ˜æ‰®æŠ•æŠ“æŠ‘æŠ†æ”¹æ”»æ”¸æ—±æ›´æŸæŽæææ‘æœæ–æžæ‰æ†æ "], +["a840","æ“æ—æ­¥æ¯æ±‚æ±žæ²™æ²æ²ˆæ²‰æ²…æ²›æ±ªæ±ºæ²æ±°æ²Œæ±¨æ²–æ²’æ±½æ²ƒæ±²æ±¾æ±´æ²†æ±¶æ²æ²”沘沂ç¶ç¼ç½ç¸ç‰¢ç‰¡ç‰ ç‹„狂玖甬甫男甸皂盯矣ç§ç§€ç¦¿ç©¶ç³»ç½•è‚–è‚“è‚肘肛肚育良芒"], +["a8a1","芋èŠè¦‹è§’言谷豆豕è²èµ¤èµ°è¶³èº«è»Šè¾›è¾°è¿‚迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯ä¾ä¾ä½³ä½¿ä½¬ä¾›ä¾‹ä¾†ä¾ƒä½°ä½µä¾ˆä½©ä½»ä¾–ä½¾ä¾ä¾‘佺兔兒兕兩具其典冽函刻券刷刺到刮制å‰åŠ¾åŠ»å’å”å“å‘å¦å·å¸å¹å–å”å—味呵"], +["a940","咖呸咕咀呻呷咄咒咆呼å’呱呶和咚呢周咋命咎固垃å·åªå©å¡å¦å¤å¼å¤œå¥‰å¥‡å¥ˆå¥„奔妾妻委妹妮姑姆å§å§å§‹å§“姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居"], +["a9a1","屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往å¾å½¿å½¼å¿å¿ å¿½å¿µå¿¿æ€æ€”æ€¯æ€µæ€–æ€ªæ€•æ€¡æ€§æ€©æ€«æ€›æˆ–æˆ•æˆ¿æˆ¾æ‰€æ‰¿æ‹‰æ‹Œæ‹„æŠ¿æ‹‚æŠ¹æ‹’æ‹›æŠ«æ‹“æ‹”æ‹‹æ‹ˆæŠ¨æŠ½æŠ¼æ‹æ‹™æ‹‡æ‹æŠµæ‹šæŠ±æ‹˜æ‹–æ‹—æ‹†æŠ¬æ‹Žæ”¾æ–§æ–¼æ—ºæ˜”æ˜“æ˜Œæ˜†æ˜‚æ˜Žæ˜€æ˜æ˜•昊"], +["aa40","æ˜‡æœæœ‹æ­æž‹æž•æ±æžœæ³æ·æž‡æžæž—æ¯æ°æ¿æž‰æ¾æžæµæžšæž“æ¼æªæ²æ¬£æ­¦æ­§æ­¿æ°“æ°›æ³£æ³¨æ³³æ²±æ³Œæ³¥æ²³æ²½æ²¾æ²¼æ³¢æ²«æ³•æ³“æ²¸æ³„æ²¹æ³æ²®æ³—泅泱沿治泡泛泊沬泯泜泖泠"], +["aaa1","炕炎炒炊炙爬爭爸版牧物狀狎狙狗ç‹çŽ©çŽ¨çŽŸçŽ«çŽ¥ç”½ç–疙疚的盂盲直知矽社祀ç¥ç§‰ç§ˆç©ºç©¹ç«ºç³¾ç½”羌羋者肺肥肢肱股肫肩肴肪肯臥臾èˆèгèŠèŠ™èŠ­èŠ½èŠŸèŠ¹èŠ±èŠ¬èŠ¥èŠ¯èŠ¸èŠ£èŠ°èŠ¾èŠ·è™Žè™±åˆè¡¨è»‹è¿Žè¿”近邵邸邱邶采金長門阜陀阿阻附"], +["ab40","陂隹雨é’éžäºŸäº­äº®ä¿¡ä¾µä¾¯ä¾¿ä¿ ä¿‘ä¿ä¿ä¿ƒä¾¶ä¿˜ä¿Ÿä¿Šä¿—ä¾®ä¿ä¿„係俚俎俞侷兗冒冑冠剎剃削å‰å‰Œå‰‹å‰‡å‹‡å‹‰å‹ƒå‹åŒå—å»åŽšå›å’¬å“€å’¨å“Žå“‰å’¸å’¦å’³å“‡å“‚咽咪å“"], +["aba1","哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契å¥å¥Žå¥å§œå§˜å§¿å§£å§¨å¨ƒå§¥å§ªå§šå§¦å¨å§»å­©å®£å®¦å®¤å®¢å®¥å°å±Žå±å±å±‹å³™å³’å··å¸å¸¥å¸Ÿå¹½åº åº¦å»ºå¼ˆå¼­å½¥å¾ˆå¾…å¾Šå¾‹å¾‡å¾Œå¾‰æ€’æ€æ€ æ€¥æ€Žæ€¨ææ°æ¨æ¢æ†æƒæ¬æ«æªæ¤æ‰æ‹œæŒ–æŒ‰æ‹¼æ‹­æŒæ‹®æ‹½æŒ‡æ‹±æ‹·"], +["ac40","æ‹¯æ‹¬æ‹¾æ‹´æŒ‘æŒ‚æ”¿æ•…æ–«æ–½æ—¢æ˜¥æ˜­æ˜ æ˜§æ˜¯æ˜Ÿæ˜¨æ˜±æ˜¤æ›·æŸ¿æŸ“æŸ±æŸ”æŸæŸ¬æž¶æž¯æŸµæŸ©æŸ¯æŸ„æŸ‘æž´æŸšæŸ¥æž¸æŸæŸžæŸ³æž°æŸ™æŸ¢æŸæŸ’æ­ªæ®ƒæ®†æ®µæ¯’æ¯—æ°Ÿæ³‰æ´‹æ´²æ´ªæµæ´¥æ´Œæ´±æ´žæ´—"], +["aca1","活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷çŠçŽ»çŽ²çç€çŽ³ç”šç”­ç•界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅çœç›¹ç›¸çœ‰çœ‹ç›¾ç›¼çœ‡çŸœç ‚研砌ç ç¥†ç¥‰ç¥ˆç¥‡ç¦¹ç¦ºç§‘ç§’ç§‹ç©¿çªç«¿ç«½ç±½ç´‚紅紀紉紇約紆缸美羿耄"], +["ad40","è€è€è€‘耶胖胥胚胃胄背胡胛胎胞胤èƒè‡´èˆ¢è‹§èŒƒèŒ…苣苛苦茄若茂茉苒苗英èŒè‹œè‹”苑苞苓苟苯茆è™è™¹è™»è™ºè¡è¡«è¦è§”計訂訃貞負赴赳趴è»è»Œè¿°è¿¦è¿¢è¿ªè¿¥"], +["ada1","迭迫迤迨郊郎éƒéƒƒé…‹é…Šé‡é–‚é™é™‹é™Œé™é¢é©éŸ‹éŸ­éŸ³é é¢¨é£›é£Ÿé¦–香乘亳倌å€å€£ä¿¯å€¦å€¥ä¿¸å€©å€–倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢å‡å‡Œå‡†å‡‹å‰–剜剔剛å‰åŒªå¿åŽŸåŽåŸå“¨å”å”唷哼哥哲唆哺唔哩哭員唉哮哪"], +["ae40","哦唧唇哽å”圃圄埂埔埋埃堉å¤å¥—奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展å±å³­å³½å³»å³ªå³¨å³°å³¶å´å³´å·®å¸­å¸«åº«åº­åº§å¼±å¾’徑徿™"], +["aea1","æ£æ¥ææ•æ­æ©æ¯æ‚„æ‚Ÿæ‚šæ‚æ‚”æ‚Œæ‚…æ‚–æ‰‡æ‹³æŒˆæ‹¿æŽæŒ¾æŒ¯æ•æ‚æ†ææ‰æŒºææŒ½æŒªæŒ«æŒ¨ææŒæ•ˆæ•‰æ–™æ—æ—…æ™‚æ™‰æ™æ™ƒæ™’æ™Œæ™…æ™æ›¸æœ”æœ•æœ—æ ¡æ ¸æ¡ˆæ¡†æ¡“æ ¹æ¡‚æ¡”æ ©æ¢³æ —æ¡Œæ¡‘æ ½æŸ´æ¡æ¡€æ ¼æ¡ƒæ ªæ¡…æ “æ ˜æ¡æ®Šæ®‰æ®·æ°£æ°§æ°¨æ°¦æ°¤æ³°æµªæ¶•消涇浦浸海浙涓"], +["af40","浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈çƒçˆ¹ç‰¹ç‹¼ç‹¹ç‹½ç‹¸ç‹·çކç­ç‰ç®ç çªçžç•”ç•畜畚留疾病症疲疳疽疼疹痂疸皋皰益ç›ç›Žçœ©çœŸçœ çœ¨çŸ©ç °ç §ç ¸ç ç ´ç ·"], +["afa1","砥砭砠砟砲祕ç¥ç¥ ç¥Ÿç¥–神ç¥ç¥—祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純ç´ç´•ç´šç´œç´ç´™ç´›ç¼ºç½Ÿç¾”ç¿…ç¿è€†è€˜è€•耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀èˆèˆªèˆ«èˆ¨èˆ¬èŠ»èŒ«è’è”èŠèŒ¸èè‰èŒµèŒ´è茲茹茶茗è€èŒ±èŒ¨èƒ"], +["b040","虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷è¢è¢‚衽衹記è¨è¨Žè¨Œè¨•訊託訓訖è¨è¨‘豈豺豹財貢起躬軒軔è»è¾±é€é€†è¿·é€€è¿ºè¿´é€ƒè¿½é€…迸邕郡éƒéƒ¢é…’é…酌釘é‡é‡—釜釙閃院陣陡"], +["b0a1","é™›é™é™¤é™˜é™žéš»é£¢é¦¬éª¨é«˜é¬¥é¬²é¬¼ä¹¾åºå½åœå‡åƒåŒåšå‰å¥å¶åŽå•åµå´å·åå€å¯å­å…œå†•凰剪副勒務勘動åŒåŒåŒ™åŒ¿å€åŒ¾åƒæ›¼å•†å•ªå•¦å•„啞啡啃啊唱啖å•啕唯啤唸售啜唬啣唳å•啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶å©å©‰å©¦å©ªå©€"], +["b140","娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜å±å´‡å´†å´Žå´›å´–å´¢å´‘å´©å´”å´™å´¤å´§å´—å·¢å¸¸å¸¶å¸³å¸·åº·åº¸åº¶åºµåº¾å¼µå¼·å½—å½¬å½©å½«å¾—å¾™å¾žå¾˜å¾¡å¾ å¾œæ¿æ‚£æ‚‰æ‚ æ‚¨æƒ‹æ‚´æƒ¦æ‚½"], +["b1a1","æƒ…æ‚»æ‚µæƒœæ‚¼æƒ˜æƒ•æƒ†æƒŸæ‚¸æƒšæƒ‡æˆšæˆ›æ‰ˆæŽ æŽ§æ²æŽ–æŽ¢æŽ¥æ·æ§æŽ˜æŽªæ±æŽ©æŽ‰æŽƒæŽ›æ«æŽ¨æŽ„æŽˆæŽ™æŽ¡æŽ¬æŽ’æŽæŽ€æ»æ©æ¨æºæ•æ•–æ•‘æ•™æ•—å•Ÿæ•æ•˜æ••æ•”æ–œæ–›æ–¬æ—æ—‹æ—Œæ—Žæ™æ™šæ™¤æ™¨æ™¦æ™žæ›¹å‹—æœ›æ¢æ¢¯æ¢¢æ¢“æ¢µæ¡¿æ¡¶æ¢±æ¢§æ¢—æ¢°æ¢ƒæ£„æ¢­æ¢†æ¢…æ¢”æ¢æ¢¨æ¢Ÿæ¢¡æ¢‚欲殺"], +["b240","毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽çŠçŒœçŒ›çŒ–猓猙率ç…çŠçƒç†ç¾çç“ ç“¶"], +["b2a1","瓷甜產略畦畢異ç–痔痕疵痊ç—皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜èŠè†è„¯è„–脣脫脩脰脤舂舵舷舶船莎莞莘è¸èŽ¢èŽ–èŽ½èŽ«èŽ’èŽŠèŽ“èŽ‰èŽ è·è»è¼"], +["b340","莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖è¢è¢‹è¦“è¦è¨ªè¨è¨£è¨¥è¨±è¨­è¨Ÿè¨›è¨¢è±‰è±šè²©è²¬è²«è²¨è²ªè²§èµ§èµ¦è¶¾è¶ºè»›è»Ÿé€™é€é€šé€—連速é€é€é€•逞造é€é€¢é€–逛途"], +["b3a1","部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢å‚傅備傑傀傖傘傚最凱割剴創剩勞å‹å‹›åšåŽ¥å•»å–€å–§å•¼å–Šå–喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙åœå ¯å ªå ´å ¤å °å ±å ¡å å  å£¹å£ºå¥ "], +["b440","婷媚婿媒媛媧孳孱寒富寓å¯å°Šå°‹å°±åµŒåµå´´åµ‡å·½å¹…帽幀幃幾廊å»å»‚å»„å¼¼å½­å¾©å¾ªå¾¨æƒ‘æƒ¡æ‚²æ‚¶æƒ æ„œæ„£æƒºæ„•æƒ°æƒ»æƒ´æ…¨æƒ±æ„Žæƒ¶æ„‰æ„€æ„’æˆŸæ‰‰æŽ£æŽŒææ€æ©æ‰æ†æ"], +["b4a1","æ’æ£ææ¡æ–æ­æ®æ¶æ´æªæ›æ‘’æšæ¹æ•žæ•¦æ•¢æ•£æ–‘æ–æ–¯æ™®æ™°æ™´æ™¶æ™¯æš‘æ™ºæ™¾æ™·æ›¾æ›¿æœŸæœæ£ºæ£•æ£ æ£˜æ£—æ¤…æ£Ÿæ£µæ£®æ£§æ£¹æ£’æ£²æ££æ£‹æ£æ¤æ¤’æ¤Žæ£‰æ£šæ¥®æ£»æ¬¾æ¬ºæ¬½æ®˜æ®–æ®¼æ¯¯æ°®æ°¯æ°¬æ¸¯æ¸¸æ¹”æ¸¡æ¸²æ¹§æ¹Šæ¸ æ¸¥æ¸£æ¸›æ¹›æ¹˜æ¸¤æ¹–æ¹®æ¸­æ¸¦æ¹¯æ¸´æ¹æ¸ºæ¸¬æ¹ƒæ¸æ¸¾æ»‹"], +["b540","溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩çºçªç³ç¢ç¥çµç¶ç´ç¯ç›ç¦ç¨ç”¥ç”¦ç•«ç•ªç—¢ç—›ç—£ç—™ç—˜ç—žç— ç™»ç™¼çš–皓皴盜ç短ç¡ç¡¬ç¡¯ç¨ç¨ˆç¨‹ç¨…稀窘"], +["b5a1","窗窖童竣等策筆ç­ç­’ç­”ç­ç­‹ç­ç­‘粟粥絞çµçµ¨çµ•紫絮絲絡給絢絰絳善翔翕耋è’肅腕腔腋腑腎脹腆脾腌腓腴舒舜è©èƒè¸èè è…è‹èè¯è±è´è‘—èŠè°èŒèŒè½è²èŠè¸èŽè„èœè‡è”èŸè™›è›Ÿè›™è›­è›”蛛蛤è›è›žè¡—è£è£‚袱覃視註詠評詞証è©"], +["b640","詔詛è©è©†è¨´è¨ºè¨¶è©–象貂貯貼貳貽è³è²»è³€è²´è²·è²¶è²¿è²¸è¶Šè¶…è¶è·Žè·è·‹è·šè·‘跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥é‡éˆ”鈕鈣鈉鈞éˆéˆéˆ‡éˆ‘é–”é–é–‹é–‘"], +["b6a1","間閒閎隊階隋陽隅隆éšé™²éš„é›é›…雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃é»é»‘亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧å«å«‰å«Œåª¾åª½åª¼"], +["b740","åª³å«‚åª²åµ©åµ¯å¹Œå¹¹å»‰å»ˆå¼’å½™å¾¬å¾®æ„šæ„æ…ˆæ„Ÿæƒ³æ„›æƒ¹æ„æ„ˆæ…Žæ…Œæ…„æ…æ„¾æ„´æ„§æ„æ„†æ„·æˆ¡æˆ¢æ“æ¾æžæªæ­æ½æ¬ææœæ”ææ¶æ–æ—æ†æ•¬æ–Ÿæ–°æš—æš‰æš‡æšˆæš–æš„æš˜æšæœƒæ¦”業"], +["b7a1","æ¥šæ¥·æ¥ æ¥”æ¥µæ¤°æ¦‚æ¥Šæ¥¨æ¥«æ¥žæ¥“æ¥¹æ¦†æ¥æ¥£æ¥›æ­‡æ­²æ¯€æ®¿æ¯“æ¯½æº¢æº¯æ»“æº¶æ»‚æºæºæ»‡æ»…溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷ç…猿猾瑯瑚瑕瑟瑞ç‘ç¿ç‘™ç‘›ç‘œç•¶ç•¸ç˜€ç—°ç˜ç—²ç—±ç—ºç—¿ç—´ç—³ç›žç›Ÿç›ç«ç¦çžç£"], +["b840","ç¹çªç¬çœç¥ç¨ç¢çŸ®ç¢Žç¢°ç¢—碘碌碉硼碑碓硿祺祿ç¦è¬ç¦½ç¨œç¨šç¨ ç¨”稟稞窟窠筷節筠筮筧粱粳粵經絹綑ç¶ç¶çµ›ç½®ç½©ç½ªç½²ç¾©ç¾¨ç¾¤è–è˜è‚†è‚„腱腰腸腥腮腳腫"], +["b8a1","腹腺腦舅艇蒂葷è½è±è‘µè‘¦è‘«è‘‰è‘¬è‘›è¼èµè‘¡è‘£è‘©è‘­è‘†è™žè™œè™Ÿè›¹èœ“蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘è£è£¡è£Šè£•裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊"], +["b940","辟農é‹éŠé“é‚é”逼é•éé‡ééŽéé‘逾é鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉é‰é‰…鈹鈿鉚閘隘隔隕é›é›‹é›‰é›Šé›·é›»é›¹é›¶é–é´é¶é é ‘頓頊頒頌飼飴"], +["b9a1","飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕åƒåƒ‘僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉å˜å˜Žå—·å˜–嘟嘈å˜å—¶åœ˜åœ–塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察å°å±¢å¶„嶇幛幣幕幗幔廓廖弊彆彰徹慇"], +["ba40","æ„¿æ…‹æ…·æ…¢æ…£æ…Ÿæ…šæ…˜æ…µæˆªæ’‡æ‘˜æ‘”æ’¤æ‘¸æ‘Ÿæ‘ºæ‘‘æ‘§æ´æ‘­æ‘»æ•²æ–¡æ——æ—–æš¢æš¨æšæ¦œæ¦¨æ¦•æ§æ¦®æ§“æ§‹æ¦›æ¦·æ¦»æ¦«æ¦´æ§æ§æ¦­æ§Œæ¦¦æ§ƒæ¦£æ­‰æ­Œæ°³æ¼³æ¼”æ»¾æ¼“æ»´æ¼©æ¼¾æ¼ æ¼¬æ¼æ¼‚æ¼¢"], +["baa1","æ»¿æ»¯æ¼†æ¼±æ¼¸æ¼²æ¼£æ¼•æ¼«æ¼¯æ¾ˆæ¼ªæ»¬æ¼æ»²æ»Œæ»·ç†”熙煽熊熄熒爾犒犖ç„ç瑤瑣瑪瑰瑭甄疑瘧ç˜ç˜‹ç˜‰ç˜“盡監瞄ç½ç¿ç¡ç£ç¢Ÿç¢§ç¢³ç¢©ç¢£ç¦Žç¦ç¦ç¨®ç¨±çªªçª©ç«­ç«¯ç®¡ç®•箋筵算ç®ç®”ç®ç®¸ç®‡ç®„粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬"], +["bb40","罰翠翡翟èžèšè‚‡è…膀è†è†ˆè†Šè…¿è†‚臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓è’蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘è•蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣èªèª¡èª“誤"], +["bba1","說誥誨誘誑誚誧豪è²è²Œè³“賑賒赫趙趕跼輔輒輕輓辣é é˜éœé£é™éžé¢éé›é„™é„˜é„žé…µé…¸é…·é…´é‰¸éŠ€éŠ…éŠ˜éŠ–é‰»éŠ“éŠœéŠ¨é‰¼éŠ‘é–¡é–¨é–©é–£é–¥é–¤éš™éšœéš›é›Œé›’éœ€é¼éž…韶頗領颯颱餃餅餌餉é§éª¯éª°é«¦é­é­‚鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜"], +["bc40","劇劈劉åŠåŠŠå‹°åŽ²å˜®å˜»å˜¹å˜²å˜¿å˜´å˜©å™“å™Žå™—å™´å˜¶å˜¯å˜°å¢€å¢Ÿå¢žå¢³å¢œå¢®å¢©å¢¦å¥­å¬‰å«»å¬‹å«µå¬Œå¬ˆå¯®å¯¬å¯©å¯«å±¤å±¥å¶å¶”幢幟幡廢廚廟å»å»£å» å½ˆå½±å¾·å¾µæ…¶æ…§æ…®æ…慕憂"], +["bca1","æ…¼æ…°æ…«æ…¾æ†§æ†æ†«æ†Žæ†¬æ†šæ†¤æ†”æ†®æˆ®æ‘©æ‘¯æ‘¹æ’žæ’²æ’ˆæ’æ’°æ’¥æ’“æ’•æ’©æ’’æ’®æ’­æ’«æ’šæ’¬æ’™æ’¢æ’³æ•µæ•·æ•¸æš®æš«æš´æš±æ¨£æ¨Ÿæ§¨æ¨æ¨žæ¨™æ§½æ¨¡æ¨“æ¨Šæ§³æ¨‚æ¨…æ§­æ¨‘æ­æ­Žæ®¤æ¯…毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛çŽç—ç‘©ç’‹ç’ƒ"], +["bd40","瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼ç£ç¨¿ç¨¼ç©€ç¨½ç¨·ç¨»çª¯çª®ç®­ç®±ç¯„箴篆篇ç¯ç® ç¯Œç³Šç· ç·´ç·¯ç·»ç·˜ç·¬ç·ç·¨ç·£ç·šç·žç·©ç¶žç·™ç·²ç·¹ç½µç½·ç¾¯"], +["bda1","翩耦膛膜è†è† è†šè†˜è”—蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂è´è¶è è¦è¸è¨è™è—èŒè“è¡›è¡è¤è¤‡è¤’褓褕褊誼諒談諄誕請諸課諉諂調誰論è«èª¶èª¹è«›è±Œè±Žè±¬è³ è³žè³¦è³¤è³¬è³­è³¢è³£è³œè³ªè³¡èµ­è¶Ÿè¶£è¸«è¸è¸è¸¢è¸è¸©è¸Ÿè¸¡è¸žèººè¼è¼›è¼Ÿè¼©è¼¦è¼ªè¼œè¼ž"], +["be40","è¼¥é©é®é¨é­é·é„°é„­é„§é„±é†‡é†‰é†‹é†ƒé‹…銻銷鋪銬鋤é‹éŠ³éŠ¼é‹’é‹‡é‹°éŠ²é–­é–±éœ„éœ†éœ‡éœ‰é éžéž‹éžé ¡é «é œé¢³é¤Šé¤“餒餘é§é§é§Ÿé§›é§‘駕駒駙骷髮髯鬧魅魄魷魯鴆鴉"], +["bea1","鴃麩麾黎墨齒儒儘儔å„儕冀冪å‡åŠ‘åŠ“å‹³å™™å™«å™¹å™©å™¤å™¸å™ªå™¨å™¥å™±å™¯å™¬å™¢å™¶å£å¢¾å£‡å£…奮å¬å¬´å­¸å¯°å°Žå½Šæ†²æ†‘æ†©æ†Šæ‡æ†¶æ†¾æ‡Šæ‡ˆæˆ°æ“…æ“æ“‹æ’»æ’¼æ“šæ“„æ“‡æ“‚æ“æ’¿æ“’擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡"], +["bf40","æ¿ƒæ¾¤æ¿æ¾§æ¾³æ¿€æ¾¹æ¾¶æ¾¦æ¾ æ¾´ç†¾ç‡‰ç‡ç‡’燈燕熹燎燙燜燃燄ç¨ç’œç’£ç’˜ç’Ÿç’žç“¢ç”Œç”瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦ç©ç©Žç©†ç©Œç©‹çªºç¯™ç°‘築篤篛篡篩篦糕糖縊"], +["bfa1","縑縈縛縣縞ç¸ç¸‰ç¸ç½¹ç¾²ç¿°ç¿±ç¿®è€¨è†³è†©è†¨è‡»èˆˆè‰˜è‰™è•Šè•™è•ˆè•¨è•©è•ƒè•‰è•­è•ªè•žèžƒèžŸèžžèž¢èžè¡¡è¤ªè¤²è¤¥è¤«è¤¡è¦ªè¦¦è«¦è«ºè««è«±è¬€è«œè«§è«®è«¾è¬è¬‚諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦éµé´é¸é²é¼éºé„´é†’錠錶鋸錳錯錢鋼錫錄錚"], +["c040","éŒéŒ¦éŒ¡éŒ•錮錙閻隧隨險雕霎霑霖éœéœ“éœé›éœé¦éž˜é °é ¸é »é ·é ­é ¹é ¤é¤é¤¨é¤žé¤›é¤¡é¤šé§­é§¢é§±éª¸éª¼é«»é«­é¬¨é®‘鴕鴣鴦鴨鴒鴛默黔é¾é¾œå„ªå„Ÿå„¡å„²å‹µåšŽåš€åšåš…嚇"], +["c0a1","åšå£•å£“å£‘å£Žå¬°å¬ªå¬¤å­ºå°·å±¨å¶¼å¶ºå¶½å¶¸å¹«å½Œå¾½æ‡‰æ‡‚æ‡‡æ‡¦æ‡‹æˆ²æˆ´æ“Žæ“Šæ“˜æ“ æ“°æ“¦æ“¬æ“±æ“¢æ“­æ–‚æ–ƒæ›™æ›–æª€æª”æª„æª¢æªœæ«›æª£æ©¾æª—æªæª æ­œæ®®æ¯šæ°ˆæ¿˜æ¿±æ¿Ÿæ¿ æ¿›æ¿¤æ¿«æ¿¯æ¾€æ¿¬æ¿¡æ¿©æ¿•濮濰燧營燮燦燥燭燬燴燠爵牆ç°ç²ç’©ç’°ç’¦ç’¨ç™†ç™‚癌盪瞳瞪瞰瞬"], +["c140","瞧瞭矯磷磺磴磯ç¤ç¦§ç¦ªç©—窿簇ç°ç¯¾ç¯·ç°Œç¯ ç³ ç³œç³žç³¢ç³Ÿç³™ç³ç¸®ç¸¾ç¹†ç¸·ç¸²ç¹ƒç¸«ç¸½ç¸±ç¹…ç¹ç¸´ç¸¹ç¹ˆç¸µç¸¿ç¸¯ç½„翳翼è±è²è°è¯è³è‡†è‡ƒè†ºè‡‚臀膿膽臉膾臨舉艱薪"], +["c1a1","薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠è¬è¬„è¬è±è°¿è±³è³ºè³½è³¼è³¸è³»è¶¨è¹‰è¹‹è¹ˆè¹Šè½„輾轂轅輿é¿é½é‚„é‚邂邀鄹醣醞醜é鎂錨éµéŠé¥é‹éŒ˜é¾é¬é›é°éšé”闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵é¨"], +["c240","駿鮮鮫鮪鮭鴻鴿麋é»é»žé»œé»é»›é¼¾é½‹å¢åš•åš®å£™å£˜å¬¸å½æ‡£æˆ³æ“´æ“²æ“¾æ”†æ“ºæ“»æ“·æ–·æ›œæœ¦æª³æª¬æ«ƒæª»æª¸æ«‚檮檯歟歸殯瀉瀋濾瀆濺瀑ç€ç‡»ç‡¼ç‡¾ç‡¸ç·çµç’§ç’¿ç”•癖癘"], +["c2a1","癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻è·è¶è‡è‡èˆŠè—è–©è—è—藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫è±è´…蹙蹣蹦蹤蹟蹕軀轉è½é‚‡é‚ƒé‚ˆé†«é†¬é‡éŽ”éŽŠéŽ–éŽ¢éŽ³éŽ®éŽ¬éŽ°éŽ˜éŽšéŽ—é—”é—–é—闕離雜雙雛雞霤鞣鞦"], +["c340","鞭韹é¡é¡é¡Œé¡Žé¡“颺餾餿餽餮馥騎é«é¬ƒé¬†é­é­Žé­é¯Šé¯‰é¯½é¯ˆé¯€éµ‘éµéµ é» é¼•鼬儳嚥壞壟壢寵é¾å»¬æ‡²æ‡·æ‡¶æ‡µæ”€æ”æ› æ›æ«¥æ«æ«šæ«“瀛瀟瀨瀚ç€ç€•瀘爆çˆç‰˜çŠ¢ç¸"], +["c3a1","çºç’½ç“Šç“£ç–‡ç–†ç™Ÿç™¡çŸ‡ç¤™ç¦±ç©«ç©©ç°¾ç°¿ç°¸ç°½ç°·ç±€ç¹«ç¹­ç¹¹ç¹©ç¹ªç¾…繳羶羹羸臘藩è—藪藕藤藥藷蟻蠅è èŸ¹èŸ¾è¥ è¥Ÿè¥–襞è­è­œè­˜è­‰è­šè­Žè­è­†è­™è´ˆè´Šè¹¼è¹²èº‡è¹¶è¹¬è¹ºè¹´è½”轎辭邊邋醱醮é¡é‘éŸéƒéˆéœéé–é¢éé˜é¤é—é¨é—œéš´é›£éœªéœ§é¡éŸœéŸ»é¡ž"], +["c440","願顛颼饅饉騖騙é¬é¯¨é¯§é¯–鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲çˆç»ç“癢癥礦礪礬礫竇競籌籃ç±ç³¯ç³°è¾®ç¹½ç¹¼"], +["c4a1","纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫è´è´èº‰èºèº…躂醴釋é˜éƒé½é—¡éœ°é£„饒饑馨騫騰騷騵鰓é°é¹¹éºµé»¨é¼¯é½Ÿé½£é½¡å„·å„¸å›å›€å›‚夔屬巿‡¼æ‡¾æ”攜斕曩櫻欄櫺殲çŒçˆ›çŠ§ç“–ç“”ç™©çŸ“ç±çºçºŒç¾¼è˜—蘭蘚蠣蠢蠡蠟襪襬覽譴"], +["c540","護譽贓躊èºèº‹è½Ÿè¾¯é†ºé®é³éµéºé¸é²é«é—¢éœ¸éœ¹éœ²éŸ¿é¡§é¡¥é¥—驅驃驀騾é«é­”魑鰭鰥鶯鶴鷂鶸éºé»¯é¼™é½œé½¦é½§å„¼å„»å›ˆå›Šå›‰å­¿å·”巒彎懿攤權歡ç‘ç˜çŽ€ç“¤ç–Šç™®ç™¬"], +["c5a1","禳籠籟è¾è½è‡Ÿè¥²è¥¯è§¼è®€è´–贗躑躓轡酈鑄鑑鑒霽霾韃éŸé¡«é¥•é©•é©é«’鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬æ¬ç“šç«Šç±¤ç±£ç±¥çº“纖纔臢蘸蘿蠱變é‚é‚鑣鑠鑤é¨é¡¯é¥œé©šé©›é©—髓體髑鱔鱗鱖鷥麟黴囑壩攬çžç™±ç™²çŸ—ç½ç¾ˆè ¶è ¹è¡¢è®“è®’"], +["c640","讖艷贛釀鑪é‚éˆé„韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖ç£ç±¬ç±®è »è§€èº¡é‡é‘²é‘°é¡±é¥žé«–鬣黌ç¤çŸšè®šé‘·éŸ‰é©¢é©¥çºœè®œèºªé‡…鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲"], +["c940","乂乜凵匚厂万丌乇äºå›—兀屮彳ä¸å†‡ä¸Žä¸®äº“仂仉仈冘勼å¬åŽ¹åœ å¤ƒå¤¬å°å·¿æ—¡æ®³æ¯Œæ°”爿丱丼仨仜仩仡ä»ä»šåˆŒåŒœåŒåœ¢åœ£å¤—夯å®å®„å°’å°»å±´å±³å¸„åº€åº‚å¿‰æˆ‰æ‰æ°•"], +["c9a1","氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈ä¼ä¼‚伅伢伓伄仴伒冱刓刉åˆåŠ¦åŒ¢åŒŸå厊å‡å›¡å›Ÿåœ®åœªåœ´å¤¼å¦€å¥¼å¦…å¥»å¥¾å¥·å¥¿å­–å°•å°¥å±¼å±ºå±»å±¾å·Ÿå¹µåº„å¼‚å¼šå½´å¿•å¿”å¿æ‰œæ‰žæ‰¤æ‰¡æ‰¦æ‰¢æ‰™æ‰ æ‰šæ‰¥æ—¯æ—®æœ¾æœ¹æœ¸æœ»æœºæœ¿æœ¼æœ³æ°˜æ±†æ±’æ±œæ±æ±Šæ±”汋"], +["ca40","汌ç±ç‰žçŠ´çŠµçŽŽç”ªç™¿ç©µç½‘è‰¸è‰¼èŠ€è‰½è‰¿è™è¥¾é‚™é‚—邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟ä½ä½˜ä¼­ä¼³ä¼¿ä½¡å†å†¹åˆœåˆžåˆ¡åŠ­åŠ®åŒ‰å£å²åŽŽåŽå°å·åªå‘”å‘…å™åœå¥å˜"], +["caa1","å½å‘å‘å¨å¤å‘‡å›®å›§å›¥åå…åŒå‰å‹å’夆奀妦妘妠妗妎妢å¦å¦å¦§å¦¡å®Žå®’尨尪å²å²å²ˆå²‹å²‰å²’岊岆岓岕巠帊帎庋庉庌庈åºå¼…å¼å½¸å½¶å¿’å¿‘å¿å¿­å¿¨å¿®å¿³å¿¡å¿¤å¿£å¿ºå¿¯å¿·å¿»æ€€å¿´æˆºæŠƒæŠŒæŠŽæŠæŠ”æŠ‡æ‰±æ‰»æ‰ºæ‰°æŠæŠˆæ‰·æ‰½æ‰²æ‰´æ”·æ—°æ—´æ—³æ—²æ—µæ…æ‡"], +["cb40","æ™æ•æŒæˆæææšæ‹æ¯æ°™æ°šæ±¸æ±§æ±«æ²„æ²‹æ²æ±±æ±¯æ±©æ²šæ±­æ²‡æ²•沜汦汳汥汻沎ç´çºç‰£çŠ¿çŠ½ç‹ƒç‹†ç‹çŠºç‹…çŽ•çŽ—çŽ“çŽ”çŽ’ç”ºç”¹ç–”ç–•çšç¤½è€´è‚•è‚™è‚肒肜èŠèŠèŠ…èŠŽèŠ‘èŠ“"], +["cba1","芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹ä¾ä½¸ä¾ä¾œä¾”侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿å’咑咂咈呫呺呾呥呬呴呦å’呯呡呠咘呣呧呤囷囹å¯å²å­å«å±å°å¶åž€åµå»å³å´å¢"], +["cc40","å¨å½å¤Œå¥…妵妺å§å§Žå¦²å§Œå§å¦¶å¦¼å§ƒå§–妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧å²å²¥å²¶å²°å²¦å¸—帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋"], +["cca1","æ€´æ€Šæ€—æ€³æ€šæ€žæ€¬æ€¢æ€æ€æ€®æ€“æ€‘æ€Œæ€‰æ€œæˆ”æˆ½æŠ­æŠ´æ‹‘æŠ¾æŠªæŠ¶æ‹ŠæŠ®æŠ³æŠ¯æŠ»æŠ©æŠ°æŠ¸æ”½æ–¨æ–»æ˜‰æ—¼æ˜„æ˜’æ˜ˆæ—»æ˜ƒæ˜‹æ˜æ˜…æ—½æ˜‘æ˜æ›¶æœŠæž…æ¬æžŽæž’æ¶æ»æž˜æž†æž„æ´æžæžŒæºæžŸæž‘æž™æžƒæ½æžæ¸æ¹æž”æ¬¥æ®€æ­¾æ¯žæ°æ²“æ³¬æ³«æ³®æ³™æ²¶æ³”æ²­æ³§æ²·æ³æ³‚沺泃泆泭泲"], +["cd40","æ³’æ³æ²´æ²Šæ²æ²€æ³žæ³€æ´°æ³æ³‡æ²°æ³¹æ³æ³©æ³‘炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬çŽç“瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺"], +["cda1","矷祂礿秅穸穻竻籵糽耵è‚肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓è¿è¿–迕迗邲邴邯邳邰阹阽阼阺陃ä¿ä¿…俓侲俉俋ä¿ä¿”俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽å¼åŽ—åŽ–åŽ™åŽ˜å’ºå’¡å’­å’¥å“"], +["ce40","哃èŒå’·å’®å“–咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗åžåž›åž”垘åžåž™åž¥åžšåž•壴å¤å¥“姡姞姮娀姱å§å§ºå§½å§¼å§¶å§¤å§²å§·å§›å§©å§³å§µå§ å§¾å§´å§­å®¨å±Œå³å³˜å³Œå³—峋峛"], +["cea1","峞峚峉峇峊峖峓峔å³å³ˆå³†å³Žå³Ÿå³¸å·¹å¸¡å¸¢å¸£å¸ å¸¤åº°åº¤åº¢åº›åº£åº¥å¼‡å¼®å½–å¾†æ€·æ€¹æ”æ²æžæ…æ“æ‡æ‰æ›æŒæ€æ‚æŸæ€¤æ„æ˜æ¦æ®æ‰‚æ‰ƒæ‹æŒæŒ‹æ‹µæŒŽæŒƒæ‹«æ‹¹æŒæŒŒæ‹¸æ‹¶æŒ€æŒ“æŒ”æ‹ºæŒ•æ‹»æ‹°æ•æ•ƒæ–ªæ–¿æ˜¶æ˜¡æ˜²æ˜µæ˜œæ˜¦æ˜¢æ˜³æ˜«æ˜ºæ˜æ˜´æ˜¹æ˜®æœæœæŸæŸ²æŸˆæžº"], +["cf40","æŸœæž»æŸ¸æŸ˜æŸ€æž·æŸ…æŸ«æŸ¤æŸŸæžµæŸæž³æŸ·æŸ¶æŸ®æŸ£æŸ‚æž¹æŸŽæŸ§æŸ°æž²æŸ¼æŸ†æŸ­æŸŒæž®æŸ¦æŸ›æŸºæŸ‰æŸŠæŸƒæŸªæŸ‹æ¬¨æ®‚æ®„æ®¶æ¯–æ¯˜æ¯ æ° æ°¡æ´¨æ´´æ´­æ´Ÿæ´¼æ´¿æ´’æ´Šæ³šæ´³æ´„æ´™æ´ºæ´šæ´‘æ´€æ´æµ‚"], +["cfa1","æ´æ´˜æ´·æ´ƒæ´æµ€æ´‡æ´ æ´¬æ´ˆæ´¢æ´‰æ´ç‚·ç‚Ÿç‚¾ç‚±ç‚°ç‚¡ç‚´ç‚µç‚©ç‰ç‰‰ç‰Šç‰¬ç‰°ç‰³ç‰®ç‹Šç‹¤ç‹¨ç‹«ç‹Ÿç‹ªç‹¦ç‹£çŽ…çŒç‚çˆç…玹玶玵玴ç«çŽ¿ç‡ç޾çƒç†çޏç‹ç“¬ç“®ç”®ç•‡ç•ˆç–§ç–ªç™¹ç›„眈眃眄眅眊盷盻盺矧矨砆砑砒砅ç ç ç Žç ‰ç ƒç “祊祌祋祅祄秕ç§ç§ç§–秎窀"], +["d040","穾竑笀ç¬ç±ºç±¸ç±¹ç±¿ç²€ç²ç´ƒç´ˆç´ç½˜ç¾‘ç¾ç¾¾è€‡è€Žè€è€”耷胘胇胠胑胈胂èƒèƒ…胣胙胜胊胕胉èƒèƒ—胦èƒè‡¿èˆ¡èŠ”è‹™è‹¾è‹¹èŒ‡è‹¨èŒ€è‹•èŒºè‹«è‹–è‹´è‹¬è‹¡è‹²è‹µèŒŒè‹»è‹¶è‹°è‹ª"], +["d0a1","苤苠苺苳苭虷虴虼虳è¡è¡Žè¡§è¡ªè¡©è§“訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔é™é™‘陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢å‹åŒŽåŽžå”¦å“¢å”—å”’å“§å“³å“¤å”šå“¿å”„å”ˆå“«å”‘å”…å“±"], +["d140","唊哻哷哸哠唎唃唋åœåœ‚埌堲埕埒垺埆垽垼垸垶垿埇åŸåž¹åŸå¤Žå¥Šå¨™å¨–娭娮娕å¨å¨—å¨Šå¨žå¨³å­¬å®§å®­å®¬å°ƒå±–å±”å³¬å³¿å³®å³±å³·å´€å³¹å¸©å¸¨åº¨åº®åºªåº¬å¼³å¼°å½§ææšæ§"], +["d1a1","ææ‚¢æ‚ˆæ‚€æ‚’æ‚æ‚æ‚ƒæ‚•æ‚›æ‚—æ‚‡æ‚œæ‚Žæˆ™æ‰†æ‹²æŒæ–æŒ¬æ„æ…æŒ¶æƒæ¤æŒ¹æ‹æŠæŒ¼æŒ©ææŒ´æ˜æ”æ™æŒ­æ‡æŒ³æšæ‘æŒ¸æ—æ€æˆæ•Šæ•†æ—†æ—ƒæ—„æ—‚æ™Šæ™Ÿæ™‡æ™‘æœ’æœ“æ Ÿæ šæ¡‰æ ²æ ³æ »æ¡‹æ¡æ –æ ±æ œæ µæ «æ ­æ ¯æ¡Žæ¡„æ ´æ æ ’æ ”æ ¦æ ¨æ ®æ¡æ ºæ ¥æ  æ¬¬æ¬¯æ¬­æ¬±æ¬´æ­­è‚‚殈毦毤"], +["d240","æ¯¨æ¯£æ¯¢æ¯§æ°¥æµºæµ£æµ¤æµ¶æ´æµ¡æ¶’æµ˜æµ¢æµ­æµ¯æ¶‘æ¶æ·¯æµ¿æ¶†æµžæµ§æµ æ¶—浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵æ¶çƒœçƒ“烑çƒçƒ‹ç¼¹çƒ¢çƒ—烒烞烠烔çƒçƒ…烆烇烚烎烡牂牸"], +["d2a1","牷牶猀狺狴狾狶狳狻çŒç“ç™ç¥ç–玼ç§ç£ç©çœç’ç›ç”ççšç—ç˜ç¨ç“žç“Ÿç“´ç“µç”¡ç•›ç•Ÿç–°ç—疻痄痀疿疶疺皊盉çœçœ›çœçœ“眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛ç¥ç¥œç¥“祒祑秫秬秠秮秭秪秜秞ç§çª†çª‰çª…窋窌窊窇竘ç¬"], +["d340","笄笓笅ç¬ç¬ˆç¬Šç¬Žç¬‰ç¬’粄粑粊粌粈ç²ç²…ç´žç´ç´‘紎紘紖紓紟紒ç´ç´Œç½œç½¡ç½žç½ ç½ç½›ç¾–羒翃翂翀耖耾耹胺胲胹胵è„胻脀èˆèˆ¯èˆ¥èŒ³èŒ­è„茙è‘茥è–茿è茦茜茢"], +["d3a1","è‚èŽèŒ›èŒªèŒˆèŒ¼è茖茤茠茷茯茩è‡è…èŒè“茞茬è‹èŒ§èˆè™“虒蚢蚨蚖èšèš‘蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎èšèšèš”衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤é…"], +["d440","é…Žé…釕釢釚陜陟隼飣髟鬯乿å°åªå¡åžå å“å‹åå²åˆååå›åŠå¢å€•å…åŸå©å«å£å¤å†å€å®å³å—å‘å‡å‰«å‰­å‰¬å‰®å‹–勓匭厜啵啶唼å•å•唴唪啑啢唶唵唰啒啅"], +["d4a1","唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳åŸå ‡åŸ®åŸ£åŸ²åŸ¥åŸ¬åŸ¡å ŽåŸ¼å åŸ§å å ŒåŸ±åŸ©åŸ°å å „奜婠婘婕婧婞娸娵婭å©å©Ÿå©¥å©¬å©“婤婗婃å©å©’婄婛婈媎娾å©å¨¹å©Œå©°å©©å©‡å©‘婖婂婜孲孮å¯å¯€å±™å´žå´‹å´å´šå´ å´Œå´¨å´å´¦å´¥å´"], +["d540","å´°å´’å´£å´Ÿå´®å¸¾å¸´åº±åº´åº¹åº²åº³å¼¶å¼¸å¾›å¾–å¾Ÿæ‚Šæ‚æ‚†æ‚¾æ‚°æ‚ºæƒ“æƒ”æƒæƒ¤æƒ™æƒæƒˆæ‚±æƒ›æ‚·æƒŠæ‚¿æƒƒæƒæƒ€æŒ²æ¥æŽŠæŽ‚æ½æŽ½æŽžæŽ­æŽæŽ—æŽ«æŽŽæ¯æŽ‡æŽæ®æŽ¯æµæŽœæ­æŽ®æ¼æŽ¤æŒ»æŽŸ"], +["d5a1","æ¸æŽ…æŽæŽ‘æŽæ°æ•“æ—æ™¥æ™¡æ™›æ™™æ™œæ™¢æœ˜æ¡¹æ¢‡æ¢æ¢œæ¡­æ¡®æ¢®æ¢«æ¥–æ¡¯æ¢£æ¢¬æ¢©æ¡µæ¡´æ¢²æ¢æ¡·æ¢’æ¡¼æ¡«æ¡²æ¢ªæ¢€æ¡±æ¡¾æ¢›æ¢–æ¢‹æ¢ æ¢‰æ¢¤æ¡¸æ¡»æ¢‘æ¢Œæ¢Šæ¡½æ¬¶æ¬³æ¬·æ¬¸æ®‘æ®æ®æ®Žæ®Œæ°ªæ·€æ¶«æ¶´æ¶³æ¹´æ¶¬æ·©æ·¢æ¶·æ·¶æ·”æ¸€æ·ˆæ· æ·Ÿæ·–æ¶¾æ·¥æ·œæ·æ·›æ·´æ·Šæ¶½æ·­æ·°æ¶ºæ·•æ·‚æ·æ·‰"], +["d640","æ·æ·²æ·“æ·½æ·—æ·æ·£æ¶»çƒºç„烷焗烴焌烰焄烳ç„烼烿焆焓焀烸烶焋焂焎牾牻牼牿çŒçŒ—猇猑猘猊猈狿çŒçŒžçŽˆç¶ç¸çµç„çç½ç‡ç€çºç¼ç¿çŒç‹ç´çˆç•¤ç•£ç—Žç—’ç—"], +["d6a1","痋痌痑ç—çšçš‰ç›“眹眯眭眱眲眴眳眽眥眻眵硈硒硉ç¡ç¡Šç¡Œç ¦ç¡…ç¡ç¥¤ç¥§ç¥©ç¥ªç¥£ç¥«ç¥¡ç¦»ç§ºç§¸ç§¶ç§·çªçª”çªç¬µç­‡ç¬´ç¬¥ç¬°ç¬¢ç¬¤ç¬³ç¬˜ç¬ªç¬ç¬±ç¬«ç¬­ç¬¯ç¬²ç¬¸ç¬šç¬£ç²”粘粖粣紵紽紸紶紺絅紬紩çµçµ‡ç´¾ç´¿çµŠç´»ç´¨ç½£ç¾•羜ç¾ç¾›ç¿Šç¿‹ç¿ç¿ç¿‘翇ç¿ç¿‰è€Ÿ"], +["d740","耞耛è‡èƒèˆè„˜è„¥è„™è„›è„­è„Ÿè„¬è„žè„¡è„•è„§è„脢舑舸舳舺舴舲艴èŽèŽ£èŽ¨èŽèºè³èޤè´èŽèŽèŽ•èŽ™èµèŽ”èŽ©è½èŽƒèŽŒèŽèŽ›èŽªèŽ‹è¾èŽ¥èŽ¯èŽˆèŽ—èŽ°è¿èŽ¦èŽ‡èŽ®è¶èŽšè™™è™–èš¿èš·"], +["d7a1","蛂è›è›…蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜è±è±½è²¥èµ½èµ»èµ¹è¶¼è·‚趹趿è·è»˜è»žè»è»œè»—軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪"], +["d840","釫釷釨釮镺閆閈陼陭陫陱陯隿éªé „飥馗傛傕傔傞傋傣傃傌傎å‚å¨å‚œå‚’傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈å–å–µå–喣喒喤啽喌喦啿喕喡喎圌堩堷"], +["d8a1","堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜åªåª“åªå¯ªå¯å¯‹å¯”寑寊寎尌尰崷嵃嵫åµåµ‹å´¿å´µåµ‘嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄å¹å½˜å¾¦å¾¥å¾«æƒ‰æ‚¹æƒŒæƒ¢æƒŽæƒ„æ„”"], +["d940","æƒ²æ„Šæ„–æ„…æƒµæ„“æƒ¸æƒ¼æƒ¾æƒæ„ƒæ„˜æ„æ„æƒ¿æ„„æ„‹æ‰ŠæŽ”æŽ±æŽ°æŽæ¥æ¨æ¯æƒæ’æ³æŠæ æ¶æ•æ²æµæ‘¡æŸæŽ¾ææœæ„æ˜æ“æ‚æ‡æŒæ‹æˆæ°æ—æ™æ”²æ•§æ•ªæ•¤æ•œæ•¨æ•¥æ–Œæ–æ–žæ–®æ—æ—’"], +["d9a1","æ™¼æ™¬æ™»æš€æ™±æ™¹æ™ªæ™²æœæ¤Œæ£“æ¤„æ£œæ¤ªæ£¬æ£ªæ£±æ¤æ£–æ£·æ£«æ£¤æ£¶æ¤“æ¤æ£³æ£¡æ¤‡æ£Œæ¤ˆæ¥°æ¢´æ¤‘æ£¯æ£†æ¤”æ£¸æ£æ£½æ£¼æ£¨æ¤‹æ¤Šæ¤—æ£Žæ£ˆæ£æ£žæ£¦æ£´æ£‘æ¤†æ£”æ£©æ¤•æ¤¥æ£‡æ¬¹æ¬»æ¬¿æ¬¼æ®”æ®—æ®™æ®•æ®½æ¯°æ¯²æ¯³æ°°æ·¼æ¹†æ¹‡æ¸Ÿæ¹‰æºˆæ¸¼æ¸½æ¹…æ¹¢æ¸«æ¸¿æ¹æ¹æ¹³æ¸œæ¸³æ¹‹æ¹€æ¹‘渻渃渮湞"], +["da40","湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌ç®ç¬ç°ç«ç–"], +["daa1","çšç¡ç­ç±ç¤ç£çç©ç ç²ç“»ç”¯ç•¯ç•¬ç—§ç—šç—¡ç—¦ç—痟痤痗皕皒盚ç†ç‡ç„çç…çŠçŽç‹çŒçŸžçŸ¬ç¡ ç¡¤ç¡¥ç¡œç¡­ç¡±ç¡ªç¡®ç¡°ç¡©ç¡¨ç¡žç¡¢ç¥´ç¥³ç¥²ç¥°ç¨‚稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪çµçµ­çµœçµ«çµ’絔絩絑絟絎缾缿罥"], +["db40","罦羢羠羡翗è‘èè胾胔腃腊腒è…腇脽è…脺臦臮臷臸臹舄舼舽舿艵茻èè¹è£è€è¨è’è§è¤è¼è¶èè†èˆè«è£èŽ¿èèè¥è˜è¿è¡è‹èŽè–èµè‰è‰èèžè‘è†è‚è³"], +["dba1","è•èºè‡è‘èªè“èƒè¬è®è„è»è—è¢è›è›è¾è›˜è›¢è›¦è›“蛣蛚蛪è›è›«è›œè›¬è›©è›—蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲è¤è£‰è¦•覘覗è§è§šè§›è©Žè©è¨¹è©™è©€è©—詘詄詅詒詈詑詊詌è©è±Ÿè²è²€è²ºè²¾è²°è²¹è²µè¶„趀趉跘跓è·è·‡è·–è·œè·è·•跙跈跗跅軯軷軺"], +["dc40","軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻é„鄀鄇鄅鄃酡酤酟酢酠éˆéˆŠéˆ¥éˆƒéˆšéˆ¦éˆéˆŒéˆ€éˆ’釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻é–é–Œé–隇陾隈"], +["dca1","隉隃隀雂雈雃雱雰é¬é°é®é ‡é¢©é£«é³¦é»¹äºƒäº„亶傽傿僆傮僄僊傴僈僂傰åƒå‚ºå‚±åƒ‹åƒ‰å‚¶å‚¸å‡—剺剸剻剼嗃嗛嗌å—å—‹å—Šå—嗀嗔嗄嗩喿嗒å–å—嗕嗢嗖嗈嗲å—嗙嗂圔塓塨塤å¡å¡å¡‰å¡¯å¡•塎å¡å¡™å¡¥å¡›å ½å¡£å¡±å£¼å«‡å«„嫋媺媸媱媵媰媿嫈媻嫆"], +["dd40","媷嫀嫊媴媶å«åª¹åªå¯–寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰å¹å¹Žå¹Šå¹å¹‹å»…å»Œå»†å»‹å»‡å½€å¾¯å¾­æƒ·æ…‰æ…Šæ„«æ……æ„¶æ„²æ„®æ…†æ„¯æ…æ„©æ…€æˆ é…¨æˆ£æˆ¥æˆ¤æ…æ±æ«ææ’æ‰æ æ¤"], +["dda1","æ³æ‘ƒæŸæ•æ˜æ¹æ·æ¢æ£æŒæ¦æ°æ¨æ‘æµæ¯æŠæšæ‘€æ¥æ§æ‹æ§æ›æ®æ¡æŽæ•¯æ–’æ—“æš†æšŒæš•æšæš‹æšŠæš™æš”æ™¸æœ æ¥¦æ¥Ÿæ¤¸æ¥Žæ¥¢æ¥±æ¤¿æ¥…æ¥ªæ¤¹æ¥‚æ¥—æ¥™æ¥ºæ¥ˆæ¥‰æ¤µæ¥¬æ¤³æ¤½æ¥¥æ£°æ¥¸æ¤´æ¥©æ¥€æ¥¯æ¥„æ¥¶æ¥˜æ¥æ¥´æ¥Œæ¤»æ¥‹æ¤·æ¥œæ¥æ¥‘æ¤²æ¥’æ¤¯æ¥»æ¤¼æ­†æ­…æ­ƒæ­‚æ­ˆæ­æ®›ï¨æ¯»æ¯¼"], +["de40","æ¯¹æ¯·æ¯¸æº›æ»–æ»ˆæºæ»€æºŸæº“æº”æº æº±æº¹æ»†æ»’æº½æ»æºžæ»‰æº·æº°æ»æº¦æ»æº²æº¾æ»ƒæ»œæ»˜æº™æº’æºŽæºæº¤æº¡æº¿æº³æ»æ»Šæº—溮溣煇煔煒煣煠ç…ç…煢煲煸煪煡煂煘煃煋煰煟ç…ç…“"], +["dea1","ç…„ç…ç…šç‰çŠçŠŒçŠ‘çŠçŠŽçŒ¼ç‚猻猺ç€çŠç‰ç‘„瑊瑋瑒瑑瑗瑀ç‘ç‘瑎瑂瑆ç‘瑔瓡瓿瓾瓽ç”畹畷榃痯ç˜ç˜ƒç—·ç—¾ç—¼ç—¹ç—¸ç˜ç—»ç—¶ç—­ç—µç—½çš™çšµç›ç•çŸç ç’ç–çšç©ç§ç”ç™ç­çŸ ç¢‡ç¢šç¢”ç¢ç¢„碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓"], +["df40","稛ç¨çª£çª¢çªžç««ç­¦ç­¤ç­­ç­´ç­©ç­²ç­¥ç­³ç­±ç­°ç­¡ç­¸ç­¶ç­£ç²²ç²´ç²¯ç¶ˆç¶†ç¶€ç¶çµ¿ç¶…絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯"], +["dfa1","è…„è…¡èˆè‰‰è‰„艀艂艅蓱è¿è‘–葶葹è’è’葥葑葀蒆葧è°è‘葽葚葙葴葳è‘蔇葞è·èºè´è‘ºè‘ƒè‘¸è²è‘…è©è™è‘‹è¯è‘‚è­è‘Ÿè‘°è¹è‘Žè‘Œè‘’葯蓅蒎è»è‘‡è¶è³è‘¨è‘¾è‘„è«è‘ è‘”è‘®è‘蜋蜄蛷蜌蛺蛖蛵è蛸蜎蜉èœè›¶èœèœ…裖裋è£è£Žè£žè£›è£šè£Œè£è¦…覛觟觥觤"], +["e040","觡觠觢觜触詶誆詿詡訿詷誂誄詵誃èªè©´è©ºè°¼è±‹è±Šè±¥è±¤è±¦è²†è²„貅賌赨赩趑趌趎è¶è¶è¶“è¶”è¶è¶’跰跠跬跱跮è·è·©è·£è·¢è·§è·²è·«è·´è¼†è»¿è¼è¼€è¼…輇輈輂輋é’逿"], +["e0a1","é„é‰é€½é„é„é„鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬é‰é‰ é‰§é‰¯éˆ¶é‰¡é‰°éˆ±é‰”鉣é‰é‰²é‰Žé‰“鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵é³é·é¸é²é é é Žé¢¬é£¶é£¹é¦¯é¦²é¦°é¦µéª­éª«é­›é³ªé³­é³§éº€é»½åƒ¦åƒ”僗僨僳僛僪åƒåƒ¤åƒ“僬僰僯僣僠"], +["e140","凘劀åŠå‹©å‹«åŒ°åŽ¬å˜§å˜•å˜Œå˜’å—¼å˜å˜œå˜å˜“嘂嗺å˜å˜„嗿嗹墉塼å¢å¢˜å¢†å¢å¡¿å¡´å¢‹å¡ºå¢‡å¢‘墎塶墂墈塻墔å¢å£¾å¥«å«œå«®å«¥å«•嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞å«å«™å«¨å«Ÿå­·å¯ "], +["e1a1","寣屣嶂嶀嵽嶆嵺å¶åµ·å¶Šå¶‰å¶ˆåµ¾åµ¼å¶åµ¹åµ¿å¹˜å¹™å¹“å»˜å»‘å»—å»Žå»œå»•å»™å»’å»”å½„å½ƒå½¯å¾¶æ„¬æ„¨æ…æ…žæ…±æ…³æ…’æ…“æ…²æ…¬æ†€æ…´æ…”æ…ºæ…›æ…¥æ„»æ…ªæ…¡æ…–æˆ©æˆ§æˆ«æ«æ‘æ‘›æ‘æ‘´æ‘¶æ‘²æ‘³æ‘½æ‘µæ‘¦æ’¦æ‘Žæ’‚æ‘žæ‘œæ‘‹æ‘“æ‘ æ‘æ‘¿æ¿æ‘¬æ‘«æ‘™æ‘¥æ‘·æ•³æ– æš¡æš æšŸæœ…朄朢榱榶槉"], +["e240","æ¦ æ§Žæ¦–æ¦°æ¦¬æ¦¼æ¦‘æ¦™æ¦Žæ¦§æ¦æ¦©æ¦¾æ¦¯æ¦¿æ§„æ¦½æ¦¤æ§”æ¦¹æ§Šæ¦šæ§æ¦³æ¦“æ¦ªæ¦¡æ¦žæ§™æ¦—æ¦æ§‚æ¦µæ¦¥æ§†æ­Šæ­æ­‹æ®žæ®Ÿæ® æ¯ƒæ¯„毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊"], +["e2a1","æ¼¶æ½³æ»¹æ»®æ¼­æ½€æ¼°æ¼¼æ¼µæ»«æ¼‡æ¼Žæ½ƒæ¼…æ»½æ»¶æ¼¹æ¼œæ»¼æ¼ºæ¼Ÿæ¼æ¼žæ¼ˆæ¼¡ç†‡ç†ç†‰ç†€ç†…熂ç†ç…»ç††ç†ç†—牄牓犗犕犓çƒçç‘çŒç‘¢ç‘³ç‘±ç‘µç‘²ç‘§ç‘®ç”€ç”‚甃畽ç–瘖瘈瘌瘕瘑瘊瘔皸çžç¼çž…çž‚ç®çž€ç¯ç¾çžƒç¢²ç¢ªç¢´ç¢­ç¢¨ç¡¾ç¢«ç¢žç¢¥ç¢ ç¢¬ç¢¢ç¢¤ç¦˜ç¦Šç¦‹ç¦–禕禔禓"], +["e340","禗禈禒ç¦ç¨«ç©Šç¨°ç¨¯ç¨¨ç¨¦çª¨çª«çª¬ç«®ç®ˆç®œç®Šç®‘ç®ç®–ç®ç®Œç®›ç®Žç®…箘劄箙箤箂粻粿粼粺綧綷緂綣綪ç·ç·€ç·…ç¶ç·Žç·„緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞"], +["e3a1","耤èèœè†‰è††è†ƒè†‡è†è†Œè†‹èˆ•蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴è“è“蒪蒚蒱è“è’蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶è“蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨è«è€èœ®èœžèœ¡èœ™èœ›èƒèœ¬è蜾è†èœ èœ²èœªèœ­èœ¼èœ’蜺蜱蜵è‚蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻"], +["e440","裰裬裫è¦è¦¡è¦Ÿè¦žè§©è§«è§¨èª«èª™èª‹èª’èªèª–谽豨豩賕è³è³—趖踉踂跿è¸è·½è¸Šè¸ƒè¸‡è¸†è¸…跾踀踄è¼è¼‘輎è¼é„£é„œé„ é„¢é„Ÿé„鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪éŠ"], +["e4a1","銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩éŠéŠ‹éˆ­éšžéš¡é›¿é˜é½éºé¾éžƒéž€éž‚é»éž„éžé¿éŸŽéŸé –颭颮餂餀餇é¦é¦œé§ƒé¦¹é¦»é¦ºé§‚馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵å™å™Šå™‰å™†å™˜"], +["e540","噚噀嘳嘽嘬嘾嘸嘪嘺圚墫å¢å¢±å¢ å¢£å¢¯å¢¬å¢¥å¢¡å£¿å«¿å«´å«½å«·å«¶å¬ƒå«¸å¬‚嫹å¬å¬‡å¬…å¬å±§å¶™å¶—嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩å¹å¹ å¹œç·³å»›å»žå»¡å½‰å¾²æ†‹æ†ƒæ…¹æ†±æ†°æ†¢æ†‰"], +["e5a1","æ†›æ†“æ†¯æ†­æ†Ÿæ†’æ†ªæ†¡æ†æ…¦æ†³æˆ­æ‘®æ‘°æ’–æ’ æ’…æ’—æ’œæ’æ’‹æ’Šæ’Œæ’£æ’Ÿæ‘¨æ’±æ’˜æ•¶æ•ºæ•¹æ•»æ–²æ–³æšµæš°æš©æš²æš·æšªæš¯æ¨€æ¨†æ¨—æ§¥æ§¸æ¨•æ§±æ§¤æ¨ æ§¿æ§¬æ§¢æ¨›æ¨æ§¾æ¨§æ§²æ§®æ¨”æ§·æ§§æ©€æ¨ˆæ§¦æ§»æ¨æ§¼æ§«æ¨‰æ¨„æ¨˜æ¨¥æ¨æ§¶æ¨¦æ¨‡æ§´æ¨–æ­‘æ®¥æ®£æ®¢æ®¦æ°æ°€æ¯¿æ°‚æ½æ¼¦æ½¾æ¾‡æ¿†æ¾’"], +["e640","æ¾æ¾‰æ¾Œæ½¢æ½æ¾…æ½šæ¾–æ½¶æ½¬æ¾‚æ½•æ½²æ½’æ½æ½—æ¾”æ¾“æ½æ¼€æ½¡æ½«æ½½æ½§æ¾æ½“澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵ç†ç†¥ç†žç†¤ç†¡ç†ªç†œç†§ç†³çŠ˜çŠšç˜ç’çžçŸç çç›ç¡çšç™"], +["e6a1","ç¢ç’‡ç’‰ç’Šç’†ç’瑽璅璈瑼瑹甈甇畾瘥瘞瘙ç˜ç˜œç˜£ç˜šç˜¨ç˜›çšœçšçšžçš›çžçžçž‰çžˆç£ç¢»ç£ç£Œç£‘磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨è¤è§è†£è†Ÿ"], +["e740","膞膕膢膙膗舖è‰è‰“艒è‰è‰Žè‰‘蔤蔻è”蔀蔩蔎蔉è”蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨è”蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢"], +["e7a1","è–è£è¤è·èŸ¡è³è˜è”è›è’è¡èšè‘èžè­èªèèŽèŸèè¯è¬èºè®èœè¥èè»èµè¢è§è©è¡šè¤…褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬è«è«†èª¸è«“諑諔諕誻諗誾諀諅諘諃誺誽諙谾è±è²è³¥è³Ÿè³™è³¨è³šè³è³§è¶ è¶œè¶¡è¶›è¸ è¸£è¸¥è¸¤è¸®è¸•踛踖踑踙踦踧"], +["e840","踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗é³é°é¯é§é«é„¯é„«é„©é„ªé„²é„¦é„®é†…醆醊é†é†‚醄醀é‹é‹ƒé‹„鋀鋙銶é‹é‹±é‹Ÿé‹˜é‹©é‹—é‹é‹Œé‹¯é‹‚鋨鋊鋈鋎鋦é‹é‹•鋉鋠鋞鋧鋑鋓"], +["e8a1","銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂éšéžŠéžŽéžˆéŸéŸé žé é ¦é ©é ¨é  é ›é §é¢²é¤ˆé£ºé¤‘餔餖餗餕駜é§é§é§“駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓é¼é¼å„œå„“儗儚儑凞匴å¡å™°å™ å™®"], +["e940","噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓å¬å¬–å¬¨å¬šå¬ å¬žå¯¯å¶¬å¶±å¶©å¶§å¶µå¶°å¶®å¶ªå¶¨å¶²å¶­å¶¯å¶´å¹§å¹¨å¹¦å¹¯å»©å»§å»¦å»¨å»¥å½‹å¾¼æ†æ†¨æ†–æ‡…æ†´æ‡†æ‡æ‡Œæ†º"], +["e9a1","æ†¿æ†¸æ†Œæ“—æ“–æ“æ“æ“‰æ’½æ’‰æ“ƒæ“›æ“³æ“™æ”³æ•¿æ•¼æ–¢æ›ˆæš¾æ›€æ›Šæ›‹æ›æš½æš»æšºæ›Œæœ£æ¨´æ©¦æ©‰æ©§æ¨²æ©¨æ¨¾æ©æ©­æ©¶æ©›æ©‘æ¨¨æ©šæ¨»æ¨¿æ©æ©ªæ©¤æ©æ©æ©”æ©¯æ©©æ© æ¨¼æ©žæ©–æ©•æ©æ©Žæ©†æ­•æ­”æ­–æ®§æ®ªæ®«æ¯ˆæ¯‡æ°„æ°ƒæ°†æ¾­æ¿‹æ¾£æ¿‡æ¾¼æ¿Žæ¿ˆæ½žæ¿„æ¾½æ¾žæ¿Šæ¾¨ç€„æ¾¥æ¾®æ¾ºæ¾¬æ¾ªæ¿æ¾¿æ¾¸"], +["ea40","æ¾¢æ¿‰æ¾«æ¿æ¾¯æ¾²æ¾°ç‡…燂熿熸燖燀ç‡ç‡‹ç‡”燊燇ç‡ç†½ç‡˜ç†¼ç‡†ç‡šç‡›çŠçŠžç©ç¦ç§ç¬ç¥ç«çªç‘¿ç’šç’ ç’”璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚çžçž¡çžœçž›çž¢çž£çž•çž™"], +["eaa1","çž—ç£ç£©ç£¥ç£ªç£žç££ç£›ç£¡ç£¢ç£­ç£Ÿç£ ç¦¤ç©„穈穇窶窸窵窱窷篞篣篧ç¯ç¯•篥篚篨篹篔篪篢篜篫篘篟糒糔糗ç³ç³‘縒縡縗縌縟縠縓縎縜縕縚縢縋ç¸ç¸–ç¸ç¸”縥縤罃罻罼罺羱翯耪耩è¬è†±è†¦è†®è†¹è†µè†«è†°è†¬è†´è†²è†·è†§è‡²è‰•艖艗蕖蕅蕫è•蕓蕡蕘"], +["eb40","蕀蕆蕤è•蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦è•蕔蕥蕬虣虥虤螛èžèž—螓螒螈èžèž–螘è¹èž‡èž£èž…èžèž‘èžèž„螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠"], +["eba1","諢諲諴諵è«è¬”諤諟諰諈諞諡諨諿諯諻貑貒è²è³µè³®è³±è³°è³³èµ¬èµ®è¶¥è¶§è¸³è¸¾è¸¸è¹€è¹…踶踼踽è¹è¸°è¸¿èº½è¼¶è¼®è¼µè¼²è¼¹è¼·è¼´é¶é¹é»é‚†éƒºé„³é„µé„¶é†“é†é†‘é†é†éŒ§éŒžéŒˆéŒŸéŒ†éŒéºéŒ¸éŒ¼éŒ›éŒ£éŒ’éŒé†éŒ­éŒŽéŒé‹‹éŒé‹ºéŒ¥éŒ“鋹鋷錴錂錤鋿錩錹錵錪錔錌"], +["ec40","錋鋾錉錀鋻錖閼é—閾閹閺閶閿閵閽隩雔霋霒éœéž™éž—鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒é®é­ºé®•"], +["eca1","魽鮈鴥鴗鴠鴞鴔鴩é´é´˜é´¢é´é´™é´Ÿéºˆéº†éº‡éº®éº­é»•黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌åšåš†åš„嚃噾嚂噿åšå£–壔å£å£’å¬­å¬¥å¬²å¬£å¬¬å¬§å¬¦å¬¯å¬®å­»å¯±å¯²å¶·å¹¬å¹ªå¾¾å¾»æ‡ƒæ†µæ†¼æ‡§æ‡ æ‡¥æ‡¤æ‡¨æ‡žæ“¯æ“©æ“£æ“«æ“¤æ“¨æ–æ–€æ–¶æ—šæ›’æªæª–æªæª¥æª‰æªŸæª›æª¡æªžæª‡æª“檎"], +["ed40","æª•æªƒæª¨æª¤æª‘æ©¿æª¦æªšæª…æªŒæª’æ­›æ®­æ°‰æ¿Œæ¾©æ¿´æ¿”æ¿£æ¿œæ¿­æ¿§æ¿¦æ¿žæ¿²æ¿æ¿¢æ¿¨ç‡¡ç‡±ç‡¨ç‡²ç‡¤ç‡°ç‡¢ç³ç®ç¯ç’—璲璫ç’璪璭璱璥璯ç”甑甒ç”疄癃癈癉癇皤盩瞵瞫瞲瞷瞶"], +["eda1","瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀ç«ç°…ç°ç¯²ç°€ç¯¿ç¯»ç°Žç¯´ç°‹ç¯³ç°‚簉簃ç°ç¯¸ç¯½ç°†ç¯°ç¯±ç°ç°Šç³¨ç¸­ç¸¼ç¹‚縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀è–薧薕薠薋薣蕻薤薚薞"], +["ee40","蕷蕼薉薡蕺蕸蕗薎薖薆è–è–™è–è–薢薂薈薅蕹蕶薘è–薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾è¥è¥’褷襂覭覯覮觲觳謞"], +["eea1","謘謖謑謅謋謢è¬è¬’謕謇è¬è¬ˆè¬†è¬œè¬“謚è±è±°è±²è±±è±¯è²•貔賹赯蹎è¹è¹“è¹è¹Œè¹‡è½ƒè½€é‚…é¾é„¸é†šé†¢é†›é†™é†Ÿé†¡é†é† éŽ¡éŽƒéŽ¯é¤é–é‡é¼é˜éœé¶é‰éé‘é é­éŽéŒéªé¹é—é•é’éé±é·é»é¡éžé£é§éŽ€éŽé™é—‡é—€é—‰é—ƒé—…閷隮隰隬霠霟霘éœéœ™éžšéž¡éžœ"], +["ef40","éžžéžéŸ•韔韱é¡é¡„顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽é¬é«¼é­ˆé®šé®¨é®žé®›é®¦é®¡é®¥é®¤é®†é®¢é® é®¯é´³éµéµ§é´¶é´®é´¯é´±é´¸é´°"], +["efa1","鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉éºéº°é»ˆé»šé»»é»¿é¼¤é¼£é¼¢é½”龠儱儭儮嚘嚜嚗嚚åšåš™å¥°å¬¼å±©å±ªå·€å¹­å¹®æ‡˜æ‡Ÿæ‡­æ‡®æ‡±æ‡ªæ‡°æ‡«æ‡–æ‡©æ“¿æ”„æ“½æ“¸æ”æ”ƒæ“¼æ–”旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌ç€ç€ç€…瀔瀎濿瀀濻瀦濼濷瀊çˆç‡¿ç‡¹çˆƒç‡½ç¶"], +["f040","璸瓀璵ç“璾璶璻瓂甔甓癜癤癙ç™ç™“癗癚皦皽盬矂瞺磿礌礓礔礉ç¤ç¤’礑禭禬穟簜簩簙簠簟簭ç°ç°¦ç°¨ç°¢ç°¥ç°°ç¹œç¹ç¹–繣繘繢繟繑繠繗繓羵羳翷翸èµè‡‘臒"], +["f0a1","è‡è‰Ÿè‰žè–´è—†è—€è—ƒè—‚薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙è èŸ´èŸ¨èŸè¥“襋è¥è¥Œè¥†è¥è¥‘襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧"], +["f140","蹛蹚蹡è¹è¹©è¹”轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛éŽéŽ‰éŽ§éŽŽéŽªéŽžéŽ¦éŽ•éŽˆéŽ™éŽŸéŽéŽ±éŽ‘éŽ²éŽ¤éŽ¨éŽ´éŽ£éŽ¥é—’é—“é—‘éš³é›—é›šå·‚é›Ÿé›˜é›éœ£éœ¢éœ¥éž¬éž®éž¨éž«éž¤éžª"], +["f1a1","鞢鞥韗韙韖韘韺é¡é¡‘顒颸é¥é¤¼é¤ºé¨é¨‹é¨‰é¨é¨„騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿é¯é®µé®¸é¯“鮶鯄鮹鮽鵜鵓éµéµŠéµ›éµ‹éµ™éµ–鵌鵗鵒鵔鵟鵘鵚麎麌黟é¼é¼€é¼–鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚å£å£›å¤’嬽嬾嬿巃幰"], +["f240","å¾¿æ‡»æ”‡æ”æ”æ”‰æ”Œæ”Žæ–„æ—žæ—æ›žæ«§æ« æ«Œæ«‘æ«™æ«‹æ«Ÿæ«œæ«æ««æ«æ«æ«žæ­ æ®°æ°Œç€™ç€§ç€ ç€–瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱ç¤ç¤›"], +["f2a1","礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾è¸è‡—臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘è¥è¥™è¦ˆè¦·è¦¶è§¶è­è­ˆè­Šè­€è­“譖譔譋譕"], +["f340","譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑è½è½è½“辴酀鄿醰醭éžé‡éé‚éšéé¹é¬éŒé™éŽ©é¦éŠé”é®é£é•é„éŽé€é’é§é•½é—šé—›é›¡éœ©éœ«éœ¬éœ¨éœ¦"], +["f3a1","鞳鞷鞶éŸéŸžéŸŸé¡œé¡™é¡é¡—颿颽颻颾饈饇饃馦馧騚騕騥é¨é¨¤é¨›é¨¢é¨ é¨§é¨£é¨žé¨œé¨”髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷é¶é¶Šé¶„鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀é½é½é½–齗齘匷嚲"], +["f440","åšµåš³å££å­…å·†å·‡å»®å»¯å¿€å¿æ‡¹æ”—攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱ç‚瀸瀿瀺瀹ç€ç€»ç€³ç爓爔犨ç½ç¼ç’ºçš«çšªçš¾ç›­çŸŒçŸŽçŸçŸçŸ²ç¤¥ç¤£ç¤§ç¤¨ç¤¤ç¤©"], +["f4a1","禲穮穬穭竷籉籈籊籇籅糮繻繾çºçº€ç¾ºç¿¿è¹è‡›è‡™èˆ‹è‰¨è‰©è˜¢è—¿è˜è—¾è˜›è˜€è—¶è˜„蘉蘅蘌藽蠙è è ‘蠗蠓蠖襣襦覹觷譠譪è­è­¨è­£è­¥è­§è­­è¶®èº†èºˆèº„轙轖轗轕轘轚é‚é…ƒé…醷醵醲醳é‹é“é»é éé”é¾é•éé¨é™ééµé€é·é‡éŽé–é’éºé‰é¸éŠé¿"], +["f540","é¼éŒé¶é‘é†é—žé— é—Ÿéœ®éœ¯éž¹éž»éŸ½éŸ¾é¡ é¡¢é¡£é¡Ÿé£é£‚é¥é¥Žé¥™é¥Œé¥‹é¥“騲騴騱騬騪騶騩騮騸騭髇髊髆é¬é¬’鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤é¶é¶’鶘é¶é¶›"], +["f5a1","鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞é½é½™é¾‘儺儹劘劗囃嚽嚾孈孇巋å·å»±æ‡½æ”›æ¬‚櫼欃櫸欀çƒç„çŠçˆç‰ç…ç†çˆçˆšçˆ™ç¾ç”—癪çŸç¤­ç¤±ç¤¯ç±”籓糲纊纇纈纋纆çºç½ç¾»è€°è‡è˜˜è˜ªè˜¦è˜Ÿè˜£è˜œè˜™è˜§è˜®è˜¡è˜ è˜©è˜žè˜¥"], +["f640","è ©è è ›è  è ¤è œè «è¡Šè¥­è¥©è¥®è¥«è§ºè­¹è­¸è­…譺譻è´è´”趯躎躌轞轛è½é…†é…„酅醹é¿é»é¶é©é½é¼é°é¹éªé·é¬é‘€é±é—¥é—¤é—£éœµéœºéž¿éŸ¡é¡¤é£‰é£†é£€é¥˜é¥–騹騽驆驄驂é©é¨º"], +["f6a1","騿é«é¬•鬗鬘鬖鬺魒鰫é°é°œé°¬é°£é°¨é°©é°¤é°¡é¶·é¶¶é¶¼é·é·‡é·Šé·é¶¾é·…鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳é·é¶²é¹ºéºœé»«é»®é»­é¼›é¼˜é¼šé¼±é½Žé½¥é½¤é¾’亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉æ°ç•ç–ç—ç’爞爟犩ç¿ç“˜ç“•瓙瓗癭皭礵禴穰穱籗籜籙籛籚"], +["f740","糴糱纑ç½ç¾‡è‡žè‰«è˜´è˜µè˜³è˜¬è˜²è˜¶è ¬è ¨è ¦è ªè ¥è¥±è¦¿è¦¾è§»è­¾è®„讂讆讅譿贕躕躔躚躒èºèº–躗轠轢酇鑌é‘鑊鑋é‘鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌é©é©ˆé©Š"], +["f7a1","驉驒é©é«é¬™é¬«é¬»é­–魕鱆鱈鰿鱄鰹鰳é±é°¼é°·é°´é°²é°½é°¶é·›é·’é·žé·šé·‹é·é·œé·‘鷟鷩鷙鷘鷖鷵鷕é·éº¶é»°é¼µé¼³é¼²é½‚齫龕龢儽劙壨壧奲å­å·˜è ¯å½æˆæˆƒæˆ„æ”©æ”¥æ––æ›«æ¬‘æ¬’æ¬æ¯Šç›çšçˆ¢çŽ‚çŽçŽƒç™°çŸ”ç±§ç±¦çº•è‰¬è˜ºè™€è˜¹è˜¼è˜±è˜»è˜¾è °è ²è ®è ³è¥¶è¥´è¥³è§¾"], +["f840","讌讎讋讈豅贙躘轤轣醼鑢鑕é‘鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘é±é±Šé±é±‹é±•鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂é»é»²é»³é¼†é¼œé¼¸é¼·é¼¶é½ƒé½"], +["f8a1","齱齰齮齯囓å›å­Žå±­æ”­æ›­æ›®æ¬“çŸç¡çç çˆ£ç“›ç“¥çŸ•礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠èºé†¾é†½é‡‚鑫鑨鑩雥é†éƒé‡éŸ‡éŸ¥é©žé«•魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀é¸é¸‰é·¿é·½é¸„麠鼞齆齴齵齶囔攮斸欘欙欗欚ç¢çˆ¦çŠªçŸ˜çŸ™ç¤¹ç±©ç±«ç³¶çºš"], +["f940","纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳é‰é¡²é¥Ÿé±¨é±®é±­é¸‹é¸é¸é¸é¸’鸑麡黵鼉齇齸齻齺齹圞ç¦ç±¯è ¼è¶²èº¦é‡ƒé‘´é‘¸é‘¶é‘µé© é±´é±³é±±é±µé¸”鸓黶鼊"], +["f9a1","龤ç¨ç¥ç³·è™ªè ¾è ½è ¿è®žè²œèº©è»‰é‹é¡³é¡´é£Œé¥¡é¦«é©¤é©¦é©§é¬¤é¸•鸗齈戇欞爧虌躨钂钀é’驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺é¸ç©çªéº¤é½¾é½‰é¾˜ç¢éйè£å¢»æ’粧嫺╔╦╗╠╬╣╚╩â•╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║â•╭╮╰╯▓"] +] diff --git a/node_modules/iconv-lite/encodings/tables/eucjp.json b/node_modules/iconv-lite/encodings/tables/eucjp.json new file mode 100644 index 00000000..4fa61ca1 --- /dev/null +++ b/node_modules/iconv-lite/encodings/tables/eucjp.json @@ -0,0 +1,182 @@ +[ +["0","\u0000",127], +["8ea1","。",62], +["a1a1"," ã€ã€‚,.・:;?ï¼ã‚›ã‚œÂ´ï½€Â¨ï¼¾ï¿£ï¼¿ãƒ½ãƒ¾ã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ï½žâˆ¥ï½œâ€¦â€¥â€˜â€™â€œâ€ï¼ˆï¼‰ã€”〕[]{ï½ã€ˆ",9,"+ï¼Â±Ã—÷ï¼â‰ ï¼œï¼žâ‰¦â‰§âˆžâˆ´â™‚♀°′″℃¥$¢£%#&*@§☆★○â—â—Žâ—‡"], +["a2a1","◆□■△▲▽▼※〒→â†â†‘↓〓"], +["a2ba","∈∋⊆⊇⊂⊃∪∩"], +["a2ca","∧∨¬⇒⇔∀∃"], +["a2dc","∠⊥⌒∂∇≡≒≪≫√∽âˆâˆµâˆ«âˆ¬"], +["a2f2","ʼn♯♭♪†‡¶"], +["a2fe","â—¯"], +["a3b0","ï¼",9], +["a3c1","A",25], +["a3e1","ï½",25], +["a4a1","ã",82], +["a5a1","ã‚¡",85], +["a6a1","Α",16,"Σ",6], +["a6c1","α",16,"σ",6], +["a7a1","Ð",5,"ÐЖ",25], +["a7d1","а",5,"ёж",25], +["a8a1","─│┌â”┘└├┬┤┴┼â”┃â”┓┛┗┣┳┫┻╋┠┯┨┷┿â”┰┥┸╂"], +["ada1","â‘ ",19,"â… ",9], +["adc0","ã‰ãŒ”㌢ã㌘㌧㌃㌶ã‘ã—ãŒãŒ¦ãŒ£ãŒ«ãŠãŒ»ãŽœãŽãŽžãŽŽãŽã„㎡"], +["addf","ã»ã€ã€Ÿâ„–ã℡㊤",4,"㈱㈲㈹ã¾ã½ã¼â‰’≡∫∮∑√⊥∠∟⊿∵∩∪"], +["b0a1","äºœå”–å¨ƒé˜¿å“€æ„›æŒ¨å§¶é€¢è‘µèŒœç©æ‚ªæ¡æ¸¥æ—­è‘¦èŠ¦é¯µæ¢“åœ§æ–¡æ‰±å®›å§è™»é£´çµ¢ç¶¾é®Žæˆ–ç²Ÿè¢·å®‰åºµæŒ‰æš—æ¡ˆé—‡éžæä»¥ä¼Šä½ä¾å‰å›²å¤·å§”å¨å°‰æƒŸæ„慰易椅為ç•異移維緯胃èŽè¡£è¬‚é•éºåŒ»äº•亥域育éƒç£¯ä¸€å£±æº¢é€¸ç¨²èŒ¨èЋ鰝å…å°å’½å“¡å› å§»å¼•飲淫胤蔭"], +["b1a1","院陰隠韻å‹å³å®‡çƒç¾½è¿‚雨å¯éµœçªºä¸‘碓臼渦嘘唄æ¬è”šé°»å§¥åŽ©æµ¦ç“œé–噂云é‹é›²è餌å¡å–¶å¬°å½±æ˜ æ›³æ „永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦è¬è¶Šé–²æ¦ŽåŽ­å††åœ’å °å¥„å®´å»¶æ€¨æŽ©æ´æ²¿æ¼”炎焔煙燕猿ç¸è‰¶è‹‘è–—é é‰›é´›å¡©æ–¼æ±šç”¥å‡¹å¤®å¥¥å¾€å¿œ"], +["b2a1","押旺横欧殴王ç¿è¥–鴬鴎黄岡沖è»å„„å±‹æ†¶è‡†æ¡¶ç‰¡ä¹™ä¿ºå¸æ©æ¸©ç©éŸ³ä¸‹åŒ–仮何伽価佳加å¯å˜‰å¤å«å®¶å¯¡ç§‘暇果架歌河ç«ç‚ç¦ç¦¾ç¨¼ç®‡èŠ±è‹›èŒ„è·è¯è“è¦èª²å˜©è²¨è¿¦éŽéœžèšŠä¿„å³¨æˆ‘ç‰™ç”»è‡¥èŠ½è›¾è³€é›…é¤“é§•ä»‹ä¼šè§£å›žå¡Šå£Šå»»å¿«æ€ªæ‚”æ¢æ‡æˆ’æ‹æ”¹"], +["b3a1","é­æ™¦æ¢°æµ·ç°ç•Œçš†çµµèŠ¥èŸ¹é–‹éšŽè²å‡±åŠ¾å¤–å’³å®³å´–æ…¨æ¦‚æ¶¯ç¢è“‹è¡—該鎧骸浬馨蛙垣柿蛎鈎劃嚇å„廓拡撹格核殻ç²ç¢ºç©«è¦šè§’赫較郭閣隔é©å­¦å²³æ¥½é¡é¡ŽæŽ›ç¬ æ¨«æ©¿æ¢¶é°æ½Ÿå‰²å–æ°æ‹¬æ´»æ¸‡æ»‘è‘›è¤è½„䏔鰹嶿¤›æ¨ºéž„株兜竃蒲釜鎌噛鴨栢茅è±"], +["b4a1","ç²¥åˆˆè‹…ç“¦ä¹¾ä¾ƒå† å¯’åˆŠå‹˜å‹§å·»å–šå ªå§¦å®Œå®˜å¯›å¹²å¹¹æ‚£æ„Ÿæ…£æ†¾æ›æ•¢æŸ‘桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰è‚艦莞観諌貫還鑑間閑関陥韓館舘丸å«å²¸å·ŒçŽ©ç™Œçœ¼å²©ç¿«è´‹é›é ‘顔願ä¼ä¼Žå±å–œå™¨åŸºå¥‡å¬‰å¯„å²å¸Œå¹¾å¿Œæ®æœºæ——既期棋棄"], +["b5a1","機帰毅気汽畿祈季稀紀徽è¦è¨˜è²´èµ·è»Œè¼é£¢é¨Žé¬¼äº€å½å„€å¦“宜戯技擬欺犠疑祇義蟻誼議掬èŠéž å‰åƒå–«æ¡”橘詰砧æµé»å´å®¢è„šè™é€†ä¸˜ä¹…仇休åŠå¸å®®å¼“急救朽求汲泣ç¸çƒç©¶çª®ç¬ˆç´šç³¾çµ¦æ—§ç‰›åŽ»å±…å·¨æ‹’æ‹ æŒ™æ¸ è™šè¨±è·é‹¸æ¼ç¦¦é­šäº¨äº«äº¬"], +["b6a1","供侠僑兇競共凶å”匡å¿å«å–¬å¢ƒå³¡å¼·å½Šæ€¯ææ­æŒŸæ•™æ©‹æ³ç‹‚狭矯胸脅興蕎郷é¡éŸ¿é¥—驚仰å‡å°­æšæ¥­å±€æ›²æ¥µçމæ¡ç²åƒ…勤å‡å·¾éŒ¦æ–¤æ¬£æ¬½ç´ç¦ç¦½ç­‹ç·ŠèйèŒè¡¿è¥Ÿè¬¹è¿‘金åŸéŠ€ä¹å€¶å¥åŒºç‹—玖矩苦躯駆駈駒具愚虞喰空å¶å¯“é‡éš…串櫛釧屑屈"], +["b7a1","掘窟沓é´è½¡çªªç†Šéšˆç²‚æ —ç¹°æ¡‘é¬å‹²å›è–«è¨“群è»éƒ¡å¦è¢ˆç¥ä¿‚傾刑兄啓圭çªåž‹å¥‘å½¢å¾„æµæ…¶æ…§æ†©æŽ²æºæ•¬æ™¯æ¡‚渓畦稽系経継繋罫茎èŠè›è¨ˆè©£è­¦è»½é šé¶èŠ¸è¿Žé¯¨åŠ‡æˆŸæ’ƒæ¿€éš™æ¡å‚‘欠決潔穴çµè¡€è¨£æœˆä»¶å€¹å€¦å¥å…¼åˆ¸å‰£å–§åœå …嫌建憲懸拳æ²"], +["b8a1","検権牽犬献研硯絹県肩見謙賢軒é£éµé™ºé¡•験鹸元原厳幻弦減æºçŽ„ç¾çµƒèˆ·è¨€è«ºé™ä¹Žå€‹å¤å‘¼å›ºå§‘孤己庫弧戸故枯湖ç‹ç³Šè¢´è‚¡èƒ¡è°è™Žèª‡è·¨éˆ·é›‡é¡§é¼“五互ä¼åˆå‘‰å¾å¨¯å¾Œå¾¡æ‚Ÿæ¢§æªŽç‘šç¢èªžèª¤è­·é†ä¹žé¯‰äº¤ä½¼ä¾¯å€™å€–光公功効勾厚å£å‘"], +["b9a1","åŽå–‰å‘垢好孔å­å®å·¥å·§å··å¹¸åºƒåºšåº·å¼˜æ’æ…ŒæŠ—æ‹˜æŽ§æ”»æ˜‚æ™ƒæ›´æ­æ ¡æ¢—構江洪浩港æºç”²çš‡ç¡¬ç¨¿ç³ ç´…紘絞綱耕考肯肱腔è†èˆªè’行衡講貢購郊酵鉱砿鋼閤é™é …香高鴻剛劫å·åˆå£•æ‹·æ¿ è±ªè½Ÿéº¹å…‹åˆ»å‘Šå›½ç©€é…·éµ é»’ç„æ¼‰è…°ç”‘忽惚骨狛込"], +["baa1","此頃今困å¤å¢¾å©šæ¨æ‡‡æ˜æ˜†æ ¹æ¢±æ··ç—•紺艮魂些ä½å‰å”†åµ¯å·¦å·®æŸ»æ²™ç‘³ç ‚è©éŽ–è£Ÿååº§æŒ«å‚µå‚¬å†æœ€å“‰å¡žå¦»å®°å½©æ‰æŽ¡æ ½æ­³æ¸ˆç½é‡‡çŠ€ç •ç ¦ç¥­æ–Žç´°èœè£è¼‰éš›å‰¤åœ¨æç½ªè²¡å†´å‚é˜ªå ºæ¦Šè‚´å’²å´ŽåŸ¼ç¢•é·ºä½œå‰Šå’‹æ¾æ˜¨æœ”柵窄策索錯桜鮭笹匙冊刷"], +["bba1","察拶撮擦札殺薩雑çšé¯–æŒéŒ†é®«çš¿æ™’三傘å‚山惨撒散桟燦çŠç”£ç®—çº‚èš•è®ƒè³›é…¸é¤æ–¬æš«æ®‹ä»•仔伺使刺å¸å²å—£å››å£«å§‹å§‰å§¿å­å±å¸‚å¸«å¿—æ€æŒ‡æ”¯å­œæ–¯æ–½æ—¨æžæ­¢æ­»æ°ç…祉ç§ç³¸ç´™ç´«è‚¢è„‚至視詞詩試誌諮資賜雌飼歯事似ä¾å…å­—å¯ºæ…ˆæŒæ™‚"], +["bca1","次滋治爾璽痔ç£ç¤ºè€Œè€³è‡ªè’”辞æ±é¹¿å¼è­˜é´«ç«ºè»¸å®é›«ä¸ƒå±åŸ·å¤±å«‰å®¤æ‚‰æ¹¿æ¼†ç–¾è³ªå®Ÿè”€ç¯ å²æŸ´èŠå±¡è•Šç¸žèˆŽå†™å°„æ¨èµ¦æ–œç…®ç¤¾ç´—者è¬è»Šé®è›‡é‚ªå€Ÿå‹ºå°ºæ“ç¼çˆµé…Œé‡ˆéŒ«è‹¥å¯‚弱惹主å–守手朱殊狩ç ç¨®è…«è¶£é…’首儒å—呪寿授樹綬需囚åŽå‘¨"], +["bda1","å®—å°±å·žä¿®æ„æ‹¾æ´²ç§€ç§‹çµ‚ç¹ç¿’臭舟è’衆襲è®è¹´è¼¯é€±é…‹é…¬é›†é†œä»€ä½å……åå¾“æˆŽæŸ”æ±æ¸‹ç£ç¸¦é‡éŠƒå”夙宿淑ç¥ç¸®ç²›å¡¾ç†Ÿå‡ºè¡“述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡éµé†‡é †å‡¦åˆæ‰€æš‘曙渚庶緒署書薯藷諸助å™å¥³åºå¾æ•鋤除傷償"], +["bea1","å‹åŒ å‡å¬å“¨å•†å”±å˜—奨妾娼宵将å°å°‘å°šåº„åºŠå» å½°æ‰¿æŠ„æ‹›æŽŒæ·æ˜‡æ˜Œæ˜­æ™¶æ¾æ¢¢æ¨Ÿæ¨µæ²¼æ¶ˆæ¸‰æ¹˜ç„¼ç„¦ç…§ç—‡çœç¡ç¤ç¥¥ç§°ç« ç¬‘粧紹肖è–蒋蕉è¡è£³è¨Ÿè¨¼è©”詳象賞醤鉦é¾é˜éšœéž˜ä¸Šä¸ˆä¸žä¹—å†—å‰°åŸŽå ´å£Œå¬¢å¸¸æƒ…æ“¾æ¡æ–浄状畳穣蒸譲醸錠嘱埴飾"], +["bfa1","æ‹­æ¤æ®–燭織è·è‰²è§¦é£Ÿè•辱尻伸信侵唇娠å¯å¯©å¿ƒæ…ŽæŒ¯æ–°æ™‹æ£®æ¦›æµ¸æ·±ç”³ç–¹çœŸç¥žç§¦ç´³è‡£èŠ¯è–ªè¦ªè¨ºèº«è¾›é€²é‡éœ‡äººä»åˆƒå¡µå£¬å°‹ç”šå°½è…Žè¨Šè¿…陣é­ç¬¥è«é ˆé…¢å›³åލ逗å¹åž‚帥推水炊ç¡ç²‹ç¿ è¡°é‚é…”éŒéŒ˜éšç‘žé«„å´‡åµ©æ•°æž¢è¶¨é››æ®æ‰æ¤™è…頗雀裾"], +["c0a1","æ¾„æ‘ºå¯¸ä¸–ç€¬ç•æ˜¯å‡„åˆ¶å‹¢å§“å¾æ€§æˆæ”¿æ•´æ˜Ÿæ™´æ£²æ –正清牲生盛精è–声製西誠誓請é€é†’é’陿–‰ç¨Žè„†éš»å¸­æƒœæˆšæ–¥æ˜”æžçŸ³ç©ç±ç¸¾è„Šè²¬èµ¤è·¡è¹Ÿç¢©åˆ‡æ‹™æŽ¥æ‘‚折設窃節説雪絶舌è‰ä»™å…ˆåƒå å®£å°‚å°–å·æˆ¦æ‰‡æ’°æ “栴泉浅洗染潜煎煽旋穿箭線"], +["c1a1","繊羨腺舛船薦詮賎践é¸é·éŠ­éŠ‘é–ƒé®®å‰å–„漸然全禅繕膳糎噌塑岨措曾曽楚狙ç–疎礎祖租粗素組蘇訴阻é¡é¼ åƒ§å‰µåŒå¢å€‰å–ªå£®å¥çˆ½å®‹å±¤åŒæƒ£æƒ³æœæŽƒæŒ¿æŽ»æ“æ—©æ›¹å·£æ§æ§½æ¼•燥争痩相窓糟ç·ç¶œè¡è‰è˜è‘¬è’¼è—»è£…èµ°é€é­éŽ—éœœé¨’åƒå¢—憎"], +["c2a1","臓蔵贈造促å´å‰‡å³æ¯æ‰æŸæ¸¬è¶³é€Ÿä¿—属賊æ—ç¶šå’袖其æƒå­˜å­«å°Šææ‘éœä»–多太汰詑唾堕妥惰打æŸèˆµæ¥•陀駄騨体堆対è€å²±å¸¯å¾…怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代å°å¤§ç¬¬é†é¡Œé·¹æ»ç€§å“啄宅托択拓沢濯ç¢è¨—鏿¿è«¾èŒ¸å‡§è›¸åª"], +["c3a1","å©ä½†é”辰奪脱巽竪辿棚谷狸鱈樽誰丹å˜å˜†å¦æ‹…探旦歎淡湛炭短端箪綻耽胆蛋誕é›å›£å£‡å¼¾æ–­æš–æª€æ®µç”·è«‡å€¤çŸ¥åœ°å¼›æ¥æ™ºæ± ç—´ç¨šç½®è‡´èœ˜é…馳築畜竹筑蓄é€ç§©çª’茶嫡ç€ä¸­ä»²å®™å¿ æŠ½æ˜¼æŸ±æ³¨è™«è¡·è¨»é…Žé‹³é§æ¨—瀦猪苧著貯ä¸å…†å‡‹å–‹å¯µ"], +["c4a1","帖帳åºå¼”å¼µå½«å¾´æ‡²æŒ‘æš¢æœæ½®ç‰’町眺è´è„¹è…¸è¶èª¿è«œè¶…跳銚長頂鳥勅æ—直朕沈çè³ƒéŽ®é™³æ´¥å¢œæ¤Žæ§Œè¿½éŽšç—›é€šå¡šæ ‚æŽ´æ§»ä½ƒæ¼¬æŸ˜è¾»è”¦ç¶´é”æ¤¿æ½°åªå£·å¬¬ç´¬çˆªåŠé‡£é¶´äº­ä½Žåœåµå‰ƒè²žå‘ˆå ¤å®šå¸åº•åº­å»·å¼Ÿæ‚ŒæŠµæŒºææ¢¯æ±€ç¢‡ç¦Žç¨‹ç· è‰‡è¨‚諦蹄逓"], +["c5a1","邸鄭釘鼎泥摘擢敵滴的笛é©é‘溺哲徹撤è½è¿­é‰„典填天展店添çºç”œè²¼è»¢é¡›ç‚¹ä¼æ®¿æ¾±ç”°é›»å…Žåå µå¡—å¦¬å± å¾’æ–—æœæ¸¡ç™»èŸè³­é€”都é砥砺努度土奴怒倒党冬å‡åˆ€å”å¡”å¡˜å¥—å®•å³¶å¶‹æ‚¼æŠ•æ­æ±æ¡ƒæ¢¼æ£Ÿç›—淘湯涛ç¯ç‡ˆå½“痘祷等答筒糖統到"], +["c6a1","董蕩藤討謄豆è¸é€ƒé€é™é™¶é ­é¨°é—˜åƒå‹•åŒå ‚導憧撞洞瞳童胴è„é“銅峠鴇匿得徳涜特ç£ç¦¿ç¯¤æ¯’ç‹¬èª­æ ƒæ©¡å‡¸çªæ¤´å±Šé³¶è‹«å¯…酉瀞噸屯惇敦沌豚é頓呑曇éˆå¥ˆé‚£å†…ä¹å‡ªè–™è¬Žç˜æºé‹æ¥¢é¦´ç¸„ç•·å—æ¥ è»Ÿé›£æ±äºŒå°¼å¼è¿©åŒ‚賑肉虹廿日乳入"], +["c7a1","如尿韮任妊å¿èªæ¿¡ç¦°ç¥¢å¯§è‘±çŒ«ç†±å¹´å¿µæ»æ’šç‡ƒç²˜ä¹ƒå»¼ä¹‹åŸœå𢿂©æ¿ƒç´èƒ½è„³è†¿è¾²è¦—èš¤å·´æŠŠæ’­è¦‡æ·æ³¢æ´¾ç¶ç ´å©†ç½µèŠ­é¦¬ä¿³å»ƒæ‹æŽ’æ•—æ¯ç›ƒç‰ŒèƒŒè‚ºè¼©é…å€åŸ¹åª’梅楳煤狽買売賠陪這è¿ç§¤çŸ§è©ä¼¯å‰¥å𿋿Ÿæ³Šç™½ç®”ç²•èˆ¶è–„è¿«æ›æ¼ çˆ†ç¸›èŽ«é§éº¦"], +["c8a1","函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪ä¼ç½°æŠœç­é–¥é³©å™ºå¡™è›¤éš¼ä¼´åˆ¤åŠåå›å¸†æ¬æ–‘æ¿æ°¾æ±Žç‰ˆçНç­ç•”ç¹èˆ¬è—©è²©ç¯„釆煩頒飯挽晩番盤ç£è•ƒè›®åŒªå‘å¦å¦ƒåº‡å½¼æ‚²æ‰‰æ‰¹æŠ«æ–比泌疲皮碑秘緋罷肥被誹費é¿éžé£›æ¨‹ç°¸å‚™å°¾å¾®æž‡æ¯˜çµçœ‰ç¾Ž"], +["c9a1","鼻柊稗匹疋髭彦è†è±è‚˜å¼¼å¿…畢筆逼桧姫媛ç´ç™¾è¬¬ä¿µå½ªæ¨™æ°·æ¼‚瓢票表評豹廟æç—…秒苗錨鋲蒜蛭鰭å“彬斌浜瀕貧賓頻æ•ç“¶ä¸ä»˜åŸ å¤«å©¦å¯Œå†¨å¸ƒåºœæ€–扶敷斧普浮父符è…è†šèŠ™è­œè² è³¦èµ´é˜œé™„ä¾®æ’«æ­¦èˆžè‘¡è•ªéƒ¨å°æ¥“風葺蕗ä¼å‰¯å¾©å¹…æœ"], +["caa1","ç¦è…¹è¤‡è¦†æ·µå¼—払沸ä»ç‰©é®’分å»å™´å¢³æ†¤æ‰®ç„šå¥®ç²‰ç³žç´›é›°æ–‡èžä¸™ä½µå…µå¡€å¹£å¹³å¼ŠæŸ„並蔽閉陛米é åƒ»å£ç™–碧別瞥蔑箆å変片篇編辺返é便勉娩å¼éž­ä¿èˆ—é‹ªåœƒæ•æ­©ç”«è£œè¼”穂募墓慕戊暮æ¯ç°¿è©å€£ä¿¸åŒ…呆報奉å®å³°å³¯å´©åº–æŠ±æ§æ”¾æ–¹æœ‹"], +["cba1","法泡烹砲縫胞芳èŒè“¬èœ‚褒訪豊邦鋒飽鳳鵬ä¹äº¡å‚剖åŠå¦¨å¸½å¿˜å¿™æˆ¿æš´æœ›æŸæ£’冒紡肪膨謀貌貿鉾防å é ¬åŒ—僕åœå¢¨æ’²æœ´ç‰§ç¦ç©†é‡¦å‹ƒæ²¡æ®†å €å¹Œå¥”本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒æ¡äº¦ä¿£åˆæŠ¹æœ«æ²«è¿„侭繭麿万慢満"], +["cca1","æ¼«è”“å‘³æœªé­…å·³ç®•å²¬å¯†èœœæ¹Šè“‘ç¨”è„ˆå¦™ç²æ°‘眠務夢無牟矛霧鵡椋婿娘冥åå‘½æ˜Žç›Ÿè¿·éŠ˜é³´å§ªç‰æ»…å…æ£‰ç¶¿ç·¬é¢éººæ‘¸æ¨¡èŒ‚妄孟毛猛盲網耗蒙儲木黙目æ¢å‹¿é¤…å°¤æˆ»ç±¾è²°å•æ‚¶ç´‹é–€åŒä¹Ÿå†¶å¤œçˆºè€¶é‡Žå¼¥çŸ¢åŽ„å½¹ç´„è–¬è¨³èºé–柳薮鑓愉愈油癒"], +["cda1","諭輸唯佑優勇å‹å®¥å¹½æ‚ æ†‚æ–æœ‰æŸšæ¹§æ¶ŒçŒ¶çŒ·ç”±ç¥è£•誘éŠé‚‘郵雄èžå¤•予余与誉輿é å‚­å¹¼å¦–å®¹åº¸æšæºæ“曜楊様洋溶熔用窯羊耀葉蓉è¦è¬¡è¸Šé¥é™½é¤Šæ…¾æŠ‘欲沃浴翌翼淀羅螺裸æ¥èŽ±é ¼é›·æ´›çµ¡è½é…ªä¹±åµåµæ¬„æ¿«è—蘭覧利åå±¥æŽæ¢¨ç†ç’ƒ"], +["cea1","ç—¢è£è£¡é‡Œé›¢é™¸å¾‹çŽ‡ç«‹è‘ŽæŽ ç•¥åŠ‰æµæºœç‰ç•™ç¡«ç²’隆竜é¾ä¾¶æ…®æ—…è™œäº†äº®åƒšä¸¡å‡Œå¯®æ–™æ¢æ¶¼çŒŸç™‚瞭稜糧良諒é¼é‡é™µé ˜åŠ›ç·‘å€«åŽ˜æž—æ·‹ç‡ç³è‡¨è¼ªéš£é±—éºŸç‘ å¡æ¶™ç´¯é¡žä»¤ä¼¶ä¾‹å†·åŠ±å¶ºæ€œçŽ²ç¤¼è‹“éˆ´éš·é›¶éœŠéº—é½¢æš¦æ­´åˆ—åŠ£çƒˆè£‚å»‰æ‹æ†æ¼£ç…‰ç°¾ç·´è¯"], +["cfa1","蓮連錬呂魯櫓炉賂路露労å©å»Šå¼„朗楼榔浪æ¼ç‰¢ç‹¼ç¯­è€è¾è‹éƒŽå…­éº“禄肋録論倭和話歪賄脇惑枠鷲亙亘é°è©«è—蕨椀湾碗腕"], +["d0a1","弌ä¸ä¸•个丱丶丼丿乂乖乘亂亅豫亊舒å¼äºŽäºžäºŸäº äº¢äº°äº³äº¶ä»Žä»ä»„仆仂仗仞仭仟价伉佚估佛ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆åƒå‡æœƒå•ååˆåšå–å¬å¸å‚€å‚šå‚…傴傲"], +["d1a1","僉僊傳僂僖僞僥僭僣僮價僵儉å„儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉å†å†‘冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹å‰å‰„剋剌剞剔剪剴剩剳剿剽åŠåŠ”åŠ’å‰±åŠˆåŠ‘è¾¨"], +["d2a1","辧劬劭劼劵å‹å‹å‹—勞勣勦飭勠勳勵勸勹匆匈甸åŒåŒåŒåŒ•匚匣匯匱匳匸å€å†å…丗å‰å凖åžå©å®å¤˜å»å·åŽ‚åŽ–åŽ åŽ¦åŽ¥åŽ®åŽ°åŽ¶åƒç°’é›™åŸæ›¼ç‡®å®å¨å­åºåå½å‘€å¬å­å¼å®å¶å©å呎å’呵咎呟呱呷呰咒呻咀呶咄å’咆哇咢咸咥咬哄哈咨"], +["d3a1","咫哂咤咾咼哘哥哦å”唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳å•喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎å™ç‡Ÿå˜´å˜¶å˜²å˜¸å™«å™¤å˜¯å™¬å™ªåš†åš€åšŠåš åš”åšåš¥åš®åš¶åš´å›‚åš¼å›å›ƒå›€å›ˆå›Žå›‘囓囗囮囹圀囿圄圉"], +["d4a1","圈國åœåœ“團圖嗇圜圦圷圸åŽåœ»å€åå©åŸ€åžˆå¡å¿åž‰åž“垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙å å¡²å ¡å¡¢å¡‹å¡°æ¯€å¡’堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊å¤å¤›æ¢¦å¤¥å¤¬å¤­å¤²å¤¸å¤¾ç«’奕å¥å¥Žå¥šå¥˜å¥¢å¥ å¥§å¥¬å¥©"], +["d5a1","奸å¦å¦ä½žä¾«å¦£å¦²å§†å§¨å§œå¦å§™å§šå¨¥å¨Ÿå¨‘娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲å«å¬ªå¬¶å¬¾å­ƒå­…孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔å¯å¯¤å¯¦å¯¢å¯žå¯¥å¯«å¯°å¯¶å¯³å°…將專å°å°“尠尢尨尸尹å±å±†å±Žå±“"], +["d6a1","å±å±å­±å±¬å±®ä¹¢å±¶å±¹å²Œå²‘岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢å¶å¶¬å¶®å¶½å¶å¶·å¶¼å·‰å·å·“巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠å»å»‚廈å»å»"], +["d7a1","廖廣å»å»šå»›å»¢å»¡å»¨å»©å»¬å»±å»³å»°å»´å»¸å»¾å¼ƒå¼‰å½å½œå¼‹å¼‘弖弩弭弸å½å½ˆå½Œå½Žå¼¯å½‘å½–å½—å½™å½¡å½­å½³å½·å¾ƒå¾‚å½¿å¾Šå¾ˆå¾‘å¾‡å¾žå¾™å¾˜å¾ å¾¨å¾­å¾¼å¿–å¿»å¿¤å¿¸å¿±å¿æ‚³å¿¿æ€¡æ æ€™æ€æ€©æ€Žæ€±æ€›æ€•æ€«æ€¦æ€æ€ºæšææªæ·æŸæŠæ†ææ£æƒæ¤æ‚æ¬æ«æ™æ‚æ‚æƒ§æ‚ƒæ‚š"], +["d8a1","æ‚„æ‚›æ‚–æ‚—æ‚’æ‚§æ‚‹æƒ¡æ‚¸æƒ æƒ“æ‚´å¿°æ‚½æƒ†æ‚µæƒ˜æ…æ„•æ„†æƒ¶æƒ·æ„€æƒ´æƒºæ„ƒæ„¡æƒ»æƒ±æ„æ„Žæ…‡æ„¾æ„¨æ„§æ…Šæ„¿æ„¼æ„¬æ„´æ„½æ…‚æ…„æ…³æ…·æ…˜æ…™æ…šæ…«æ…´æ…¯æ…¥æ…±æ…Ÿæ…æ…“æ…µæ†™æ†–æ†‡æ†¬æ†”æ†šæ†Šæ†‘æ†«æ†®æ‡Œæ‡Šæ‡‰æ‡·æ‡ˆæ‡ƒæ‡†æ†ºæ‡‹ç½¹æ‡æ‡¦æ‡£æ‡¶æ‡ºæ‡´æ‡¿æ‡½æ‡¼æ‡¾æˆ€æˆˆæˆ‰æˆæˆŒæˆ”戛"], +["d9a1","æˆžæˆ¡æˆªæˆ®æˆ°æˆ²æˆ³æ‰æ‰Žæ‰žæ‰£æ‰›æ‰ æ‰¨æ‰¼æŠ‚æŠ‰æ‰¾æŠ’æŠ“æŠ–æ‹”æŠƒæŠ”æ‹—æ‹‘æŠ»æ‹æ‹¿æ‹†æ“”æ‹ˆæ‹œæ‹Œæ‹Šæ‹‚æ‹‡æŠ›æ‹‰æŒŒæ‹®æ‹±æŒ§æŒ‚æŒˆæ‹¯æ‹µææŒ¾ææœææŽ–æŽŽæŽ€æŽ«æ¶æŽ£æŽæŽ‰æŽŸæŽµæ«æ©æŽ¾æ©æ€æ†æ£æ‰æ’æ¶æ„æ–æ´æ†æ“æ¦æ¶æ”æ—æ¨ææ‘§æ‘¯æ‘¶æ‘Žæ”ªæ’•撓撥撩撈撼"], +["daa1","æ“šæ“’æ“…æ“‡æ’»æ“˜æ“‚æ“±æ“§èˆ‰æ“ æ“¡æŠ¬æ“£æ“¯æ”¬æ“¶æ“´æ“²æ“ºæ”€æ“½æ”˜æ”œæ”…æ”¤æ”£æ”«æ”´æ”µæ”·æ”¶æ”¸ç•‹æ•ˆæ•–æ••æ•æ•˜æ•žæ•æ•²æ•¸æ–‚æ–ƒè®Šæ–›æ–Ÿæ–«æ–·æ—ƒæ—†æ—æ—„æ—Œæ—’æ—›æ—™æ— æ—¡æ—±æ²æ˜Šæ˜ƒæ—»æ³æ˜µæ˜¶æ˜´æ˜œæ™æ™„æ™‰æ™æ™žæ™æ™¤æ™§æ™¨æ™Ÿæ™¢æ™°æšƒæšˆæšŽæš‰æš„æš˜æšæ›æš¹æ›‰æš¾æš¼"], +["dba1","æ›„æš¸æ›–æ›šæ› æ˜¿æ›¦æ›©æ›°æ›µæ›·æœæœ–æœžæœ¦æœ§éœ¸æœ®æœ¿æœ¶ææœ¸æœ·æ†æžæ æ™æ£æ¤æž‰æ°æž©æ¼æªæžŒæž‹æž¦æž¡æž…æž·æŸ¯æž´æŸ¬æž³æŸ©æž¸æŸ¤æŸžæŸæŸ¢æŸ®æž¹æŸŽæŸ†æŸ§æªœæ žæ¡†æ ©æ¡€æ¡æ ²æ¡Žæ¢³æ «æ¡™æ¡£æ¡·æ¡¿æ¢Ÿæ¢æ¢­æ¢”æ¢æ¢›æ¢ƒæª®æ¢¹æ¡´æ¢µæ¢ æ¢ºæ¤æ¢æ¡¾æ¤æ£Šæ¤ˆæ£˜æ¤¢æ¤¦æ£¡æ¤Œæ£"], +["dca1","æ£”æ£§æ£•æ¤¶æ¤’æ¤„æ£—æ££æ¤¥æ£¹æ£ æ£¯æ¤¨æ¤ªæ¤šæ¤£æ¤¡æ£†æ¥¹æ¥·æ¥œæ¥¸æ¥«æ¥”æ¥¾æ¥®æ¤¹æ¥´æ¤½æ¥™æ¤°æ¥¡æ¥žæ¥æ¦æ¥ªæ¦²æ¦®æ§æ¦¿æ§æ§“æ¦¾æ§Žå¯¨æ§Šæ§æ¦»æ§ƒæ¦§æ¨®æ¦‘æ¦ æ¦œæ¦•æ¦´æ§žæ§¨æ¨‚æ¨›æ§¿æ¬Šæ§¹æ§²æ§§æ¨…æ¦±æ¨žæ§­æ¨”æ§«æ¨Šæ¨’æ«æ¨£æ¨“æ©„æ¨Œæ©²æ¨¶æ©¸æ©‡æ©¢æ©™æ©¦æ©ˆæ¨¸æ¨¢æªæªæª æª„檢檣"], +["dda1","æª—è˜—æª»æ«ƒæ«‚æª¸æª³æª¬æ«žæ«‘æ«Ÿæªªæ«šæ«ªæ«»æ¬…è˜–æ«ºæ¬’æ¬–é¬±æ¬Ÿæ¬¸æ¬·ç›œæ¬¹é£®æ­‡æ­ƒæ­‰æ­æ­™æ­”æ­›æ­Ÿæ­¡æ­¸æ­¹æ­¿æ®€æ®„æ®ƒæ®æ®˜æ®•æ®žæ®¤æ®ªæ®«æ®¯æ®²æ®±æ®³æ®·æ®¼æ¯†æ¯‹æ¯“æ¯Ÿæ¯¬æ¯«æ¯³æ¯¯éº¾æ°ˆæ°“æ°”æ°›æ°¤æ°£æ±žæ±•æ±¢æ±ªæ²‚æ²æ²šæ²æ²›æ±¾æ±¨æ±³æ²’æ²æ³„æ³±æ³“æ²½æ³—æ³…æ³æ²®æ²±æ²¾"], +["dea1","æ²ºæ³›æ³¯æ³™æ³ªæ´Ÿè¡æ´¶æ´«æ´½æ´¸æ´™æ´µæ´³æ´’æ´Œæµ£æ¶“æµ¤æµšæµ¹æµ™æ¶Žæ¶•æ¿¤æ¶…æ·¹æ¸•æ¸Šæ¶µæ·‡æ·¦æ¶¸æ·†æ·¬æ·žæ·Œæ·¨æ·’æ·…æ·ºæ·™æ·¤æ·•æ·ªæ·®æ¸­æ¹®æ¸®æ¸™æ¹²æ¹Ÿæ¸¾æ¸£æ¹«æ¸«æ¹¶æ¹æ¸Ÿæ¹ƒæ¸ºæ¹Žæ¸¤æ»¿æ¸æ¸¸æº‚æºªæº˜æ»‰æº·æ»“æº½æº¯æ»„æº²æ»”æ»•æºæº¥æ»‚æºŸæ½æ¼‘çŒæ»¬æ»¸æ»¾æ¼¿æ»²æ¼±æ»¯æ¼²æ»Œ"], +["dfa1","æ¼¾æ¼“æ»·æ¾†æ½ºæ½¸æ¾æ¾€æ½¯æ½›æ¿³æ½­æ¾‚潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑ç€ç€æ¿¾ç€›ç€šæ½´ç€ç€˜ç€Ÿç€°ç€¾ç€²ç‘ç£ç‚™ç‚’炯烱炬炸炳炮烟烋çƒçƒ™ç„‰çƒ½ç„œç„™ç…¥ç…•熈煦煢煌煖煬ç†ç‡»ç†„熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼"], +["e0a1","燹燿çˆçˆçˆ›çˆ¨çˆ­çˆ¬çˆ°çˆ²çˆ»çˆ¼çˆ¿ç‰€ç‰†ç‰‹ç‰˜ç‰´ç‰¾çŠ‚çŠçŠ‡çŠ’çŠ–çŠ¢çŠ§çŠ¹çŠ²ç‹ƒç‹†ç‹„ç‹Žç‹’ç‹¢ç‹ ç‹¡ç‹¹ç‹·å€çŒ—猊猜猖çŒçŒ´çŒ¯çŒ©çŒ¥çŒ¾çŽç默ç—çªç¨ç°ç¸çµç»çºçˆç޳çŽçŽ»ç€ç¥ç®çžç’¢ç…瑯ç¥ç¸ç²çºç‘•ç¿ç‘Ÿç‘™ç‘瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊ç“ç“”ç±"], +["e1a1","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎ç”甕甓甞甦甬甼畄ç•畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚ç–疥疣痂疳痃疵疽疸疼疱ç—痊痒痙痣痞痾痿痼ç˜ç—°ç—ºç—²ç—³ç˜‹ç˜ç˜‰ç˜Ÿç˜§ç˜ ç˜¡ç˜¢ç˜¤ç˜´ç˜°ç˜»ç™‡ç™ˆç™†ç™œç™˜ç™¡ç™¢ç™¨ç™©ç™ªç™§ç™¬ç™°"], +["e2a1","癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂ç›ç›–盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸ç‡çšç¨ç«ç›ç¥ç¿ç¾ç¹çžŽçž‹çž‘瞠瞞瞰瞶瞹瞿瞼瞽瞻矇çŸçŸ—矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"], +["e3a1","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊ç¦ç¦§é½‹ç¦ªç¦®ç¦³ç¦¹ç¦ºç§‰ç§•秧秬秡秣稈ç¨ç¨˜ç¨™ç¨ ç¨Ÿç¦€ç¨±ç¨»ç¨¾ç¨·ç©ƒç©—穉穡穢穩é¾ç©°ç©¹ç©½çªˆçª—窕窘窖窩竈窰窶竅竄窿邃竇竊ç«ç«ç«•竓站竚ç«ç«¡ç«¢ç«¦ç«­ç«°ç¬‚ç¬ç¬Šç¬†ç¬³ç¬˜ç¬™ç¬žç¬µç¬¨ç¬¶ç­"], +["e4a1","筺笄ç­ç¬‹ç­Œç­…筵筥筴筧筰筱筬筮ç®ç®˜ç®Ÿç®ç®œç®šç®‹ç®’ç®ç­ç®™ç¯‹ç¯ç¯Œç¯ç®´ç¯†ç¯ç¯©ç°‘簔篦篥籠簀簇簓篳篷簗ç°ç¯¶ç°£ç°§ç°ªç°Ÿç°·ç°«ç°½ç±Œç±ƒç±”ç±ç±€ç±ç±˜ç±Ÿç±¤ç±–籥籬籵粃ç²ç²¤ç²­ç²¢ç²«ç²¡ç²¨ç²³ç²²ç²±ç²®ç²¹ç²½ç³€ç³…糂糘糒糜糢鬻糯糲糴糶糺紆"], +["e5a1","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮çµçµ£ç¶“綉絛ç¶çµ½ç¶›ç¶ºç¶®ç¶£ç¶µç·‡ç¶½ç¶«ç¸½ç¶¢ç¶¯ç·œç¶¸ç¶Ÿç¶°ç·˜ç·ç·¤ç·žç·»ç·²ç·¡ç¸…縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧ç¹ç¹–繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒çºçº“纔纖纎纛纜缸缺"], +["e6a1","罅罌ç½ç½Žç½ç½‘罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞ç¾ç¾šç¾£ç¾¯ç¾²ç¾¹ç¾®ç¾¶ç¾¸è­±ç¿…翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻èŠè†è’è˜èšèŸè¢è¨è³è²è°è¶è¹è½è¿è‚„肆肅肛肓肚肭å†è‚¬èƒ›èƒ¥èƒ™èƒèƒ„胚胖脉胯胱脛脩脣脯腋"], +["e7a1","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉è‡è‡‘臙臘臈臚臟臠臧臺臻臾èˆèˆ‚舅與舊èˆèˆèˆ–舩舫舸舳艀艙艘è‰è‰šè‰Ÿè‰¤è‰¢è‰¨è‰ªè‰«èˆ®è‰±è‰·è‰¸è‰¾èŠèŠ’èŠ«èŠŸèŠ»èŠ¬è‹¡è‹£è‹Ÿè‹’è‹´è‹³è‹ºèŽ“èŒƒè‹»è‹¹è‹žèŒ†è‹œèŒ‰è‹™"], +["e8a1","茵茴茖茲茱è€èŒ¹èè…茯茫茗茘莅莚莪莟莢莖茣莎莇莊è¼è޵è³èµèŽ èŽ‰èŽ¨è´è“è«èŽè½èƒè˜è‹èè·è‡è è²èè¢è è޽è¸è”†è»è‘­èªè¼è•šè’„葷葫蒭葮蒂葩葆è¬è‘¯è‘¹èµè“Šè‘¢è’¹è’¿è’Ÿè“™è“蒻蓚è“è“蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"], +["e9a1","è•蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾è–藉薺è—è–¹è—è—•è—藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿è™ä¹•虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉èœè›¹èœŠèœ´èœ¿èœ·èœ»èœ¥èœ©èœšè èŸè¸èŒèŽè´è—è¨è®è™"], +["eaa1","è“è£èªè …螢螟螂螯蟋螽蟀èŸé›–螫蟄螳蟇蟆螻蟯蟲蟠è è èŸ¾èŸ¶èŸ·è ŽèŸ’蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫è¢è¡¾è¢žè¡µè¡½è¢µè¡²è¢‚袗袒袮袙袢è¢è¢¤è¢°è¢¿è¢±è£ƒè£„裔裘裙è£è£¹è¤‚裼裴裨裲褄褌褊褓襃褞褥褪褫è¥è¥„褻褶褸襌è¤è¥ è¥ž"], +["eba1","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜è§è§§è§´è§¸è¨ƒè¨–è¨è¨Œè¨›è¨è¨¥è¨¶è©è©›è©’詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄è«è«‚諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖è¬è¬—謠謳鞫謦謫謾謨è­è­Œè­è­Žè­‰è­–譛譚譫"], +["eca1","譟譬譯譴譽讀讌讎讒讓讖讙讚谺è±è°¿è±ˆè±Œè±Žè±è±•豢豬豸豺貂貉貅貊è²è²Žè²”豼貘æˆè²­è²ªè²½è²²è²³è²®è²¶è³ˆè³è³¤è³£è³šè³½è³ºè³»è´„è´…è´Šè´‡è´è´è´é½Žè´“è³è´”贖赧赭赱赳è¶è¶™è·‚趾趺è·è·šè·–跌跛跋跪跫跟跣跼踈踉跿è¸è¸žè¸è¸Ÿè¹‚踵踰踴蹊"], +["eda1","蹇蹉蹌è¹è¹ˆè¹™è¹¤è¹ è¸ªè¹£è¹•蹶蹲蹼èºèº‡èº…躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡é€é€žé€–逋逧逶逵逹迸"], +["eea1","ééé‘é’逎é‰é€¾é–é˜éžé¨é¯é¶éš¨é²é‚‚é½é‚邀邊邉é‚邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀é‡é‡‰é‡‹é‡é‡–釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋é‰éŠœéŠ–éŠ“éŠ›é‰šé‹éŠ¹éŠ·é‹©éŒé‹ºé„錮"], +["efa1","錙錢錚錣錺錵錻éœé é¼é®é–鎰鎬鎭鎔鎹é–é—é¨é¥é˜éƒéééˆé¤éšé”é“éƒé‡éé¶é«éµé¡éºé‘鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾é’鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃é—闌闕闔闖關闡闥闢阡阨阮阯陂陌é™é™‹é™·é™œé™ž"], +["f0a1","é™é™Ÿé™¦é™²é™¬éšéš˜éš•隗險隧隱隲隰隴隶隸隹雎雋雉é›è¥é›œéœé›•雹霄霆霈霓霎霑éœéœ–霙霤霪霰霹霽霾é„é†éˆé‚é‰éœé é¤é¦é¨å‹’é«é±é¹éž…é¼éžéºéž†éž‹éžéžéžœéž¨éž¦éž£éž³éž´éŸƒéŸ†éŸˆéŸ‹éŸœéŸ­é½éŸ²ç«ŸéŸ¶éŸµé é Œé ¸é ¤é ¡é ·é ½é¡†é¡é¡‹é¡«é¡¯é¡°"], +["f1a1","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡é¤é¤žé¤¤é¤ é¤¬é¤®é¤½é¤¾é¥‚饉饅é¥é¥‹é¥‘饒饌饕馗馘馥馭馮馼駟駛é§é§˜é§‘駭駮駱駲駻駸é¨é¨é¨…駢騙騫騷驅驂驀驃騾驕é©é©›é©—驟驢驥驤驩驫驪骭骰骼髀é«é«‘髓體髞髟髢髣髦髯髫髮髴髱髷"], +["f2a1","髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃é­é­é­Žé­‘魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆é¯é¯‘鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒éµé´¿é´¾éµ†éµˆ"], +["f3a1","éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶»é¶¸é¶ºé·†é·é·‚鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽éºéºˆéº‹éºŒéº’麕麑éºéº¥éº©éº¸éºªéº­é¡é»Œé»Žé»é»é»”黜點é»é» é»¥é»¨é»¯é»´é»¶é»·é»¹é»»é»¼é»½é¼‡é¼ˆçš·é¼•鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠"], +["f4a1","堯槇é™ç‘¤å‡œç†™"], +["f9a1","纊褜éˆéŠˆè“œä¿‰ç‚»æ˜±æ£ˆé‹¹æ›»å½…ä¸¨ä»¡ä»¼ä¼€ä¼ƒä¼¹ä½–ä¾’ä¾Šä¾šä¾”ä¿å€å€¢ä¿¿å€žå†å°å‚傔僴僘兊兤å†å†¾å‡¬åˆ•劜劦勀勛匀匇匤å²åŽ“åŽ²å﨎咜咊咩哿喆å™å¥åž¬åŸˆåŸ‡ï¨ï¨å¢žå¢²å¤‹å¥“奛å¥å¥£å¦¤å¦ºå­–寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹å·å¼¡å¼´å½§å¾·"], +["faa1","å¿žææ‚…æ‚Šæƒžæƒ•æ„ æƒ²æ„‘æ„·æ„°æ†˜æˆ“æŠ¦æµæ‘ æ’æ“Žæ•Žæ˜€æ˜•æ˜»æ˜‰æ˜®æ˜žæ˜¤æ™¥æ™—æ™™ï¨’æ™³æš™æš æš²æš¿æ›ºæœŽï¤©æ¦æž»æ¡’æŸ€æ æ¡„æ£ï¨“æ¥¨ï¨”æ¦˜æ§¢æ¨°æ©«æ©†æ©³æ©¾æ«¢æ«¤æ¯–æ°¿æ±œæ²†æ±¯æ³šæ´„æ¶‡æµ¯æ¶–æ¶¬æ·æ·¸æ·²æ·¼æ¸¹æ¹œæ¸§æ¸¼æº¿æ¾ˆæ¾µæ¿µç€…瀇瀨炅炫ç„焄煜煆煇凞ç‡ç‡¾çб"], +["fba1","犾猤猪ç·ç޽ç‰ç–ç£ç’ç‡çµç¦çªç©ç®ç‘¢ç’‰ç’Ÿç”畯皂皜皞皛皦益ç†åŠ¯ç ¡ç¡Žç¡¤ç¡ºç¤°ï¨˜ï¨™ï¨šç¦”ï¨›ç¦›ç«‘ç«§ï¨œç««ç®žï¨çµˆçµœç¶·ç¶ ç·–繒罇羡羽èŒè¢è¿è‡è¶è‘ˆè’´è•“蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣è»ï¨¤ï¨¥é§éƒžï¨¦é„•鄧釚"], +["fca1","釗釞釭釮釤釥鈆éˆéˆŠéˆºé‰€éˆ¼é‰Žé‰™é‰‘鈹鉧銧鉷鉸鋧鋗鋙é‹ï¨§é‹•鋠鋓錥錡鋻﨨錞鋿éŒéŒ‚é°é—鎤é†éžé¸é±é‘…鑈閒隆﨩éšéš¯éœ³éœ»éƒééé‘é•顗顥飯飼餧館馞驎髙髜魵魲é®é®±é®»é°€éµ°éµ«ï¨­é¸™é»‘"], +["fcf1","â…°",9,"¬¦'""], +["8fa2af","˘ˇ¸˙˯˛˚~΄΅"], +["8fa2c2","¡¦¿"], +["8fa2eb","ºª©®™¤№"], +["8fa6e1","ΆΈΉΊΪ"], +["8fa6e7","ÎŒ"], +["8fa6e9","ΎΫ"], +["8fa6ec","Î"], +["8fa6f1","άέήίϊÎόςÏϋΰώ"], +["8fa7c2","Ђ",10,"ÐŽÐ"], +["8fa7f2","Ñ’",10,"ўџ"], +["8fa9a1","ÆÄ"], +["8fa9a4","Ħ"], +["8fa9a6","IJ"], +["8fa9a8","ÅÄ¿"], +["8fa9ab","ŊØŒ"], +["8fa9af","ŦÞ"], +["8fa9c1","æđðħıijĸłŀʼnŋøœßŧþ"], +["8faaa1","ÃÀÄÂĂÇĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ"], +["8faaba","ĜĞĢĠĤÃÃŒÃÃŽÇİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑÅŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴßŶŹŽŻ"], +["8faba1","áàäâăǎÄąåãćĉÄçċÄéèëêěėēęǵÄÄŸ"], +["8fabbd","ġĥíìïîÇ"], +["8fabc5","īįĩĵķĺľļńňņñóòöôǒőÅõŕřŗśÅšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż"], +["8fb0a1","丂丄丅丌丒丟丣两丨丫丮丯丰丵乀ä¹ä¹„乇乑乚乜乣乨乩乴乵乹乿äºäº–亗äºäº¯äº¹ä»ƒä»ä»šä»›ä» ä»¡ä»¢ä»¨ä»¯ä»±ä»³ä»µä»½ä»¾ä»¿ä¼€ä¼‚伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾ä¾ä¾‚侄"], +["8fb1a1","侅侉侊侌侎ä¾ä¾’侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀ä¿ä¿…俆俈俉俋俌ä¿ä¿ä¿’俜俠俢俰俲俼俽俿倀å€å€„倇倊倌倎å€å€“倗倘倛倜å€å€žå€¢å€§å€®å€°å€²å€³å€µå€åå‚å…å†åŠåŒåŽå‘å’å“å—å™åŸå å¢å£å¦å§åªå­å°å±å€»å‚傃傄傆傊傎å‚å‚"], +["8fb2a1","傒傓傔傖傛傜傞",4,"傪傯傰傹傺傽僀僃僄僇僌僎åƒåƒ“僔僘僜åƒåƒŸåƒ¢åƒ¤åƒ¦åƒ¨åƒ©åƒ¯åƒ±åƒ¶åƒºåƒ¾å„ƒå„†å„‡å„ˆå„‹å„Œå„儎僲å„儗儙儛儜å„儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊å…兓兕兗兘兟兤兦兾冃冄冋冎冘å†å†¡å†£å†­å†¸å†ºå†¼å†¾å†¿å‡‚"], +["8fb3a1","凈å‡å‡‘凒凓凕凘凞凢凥凮凲凳凴凷åˆåˆ‚刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌å‹å‹‘勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋"], +["8fb4a1","匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾å‚åŒå‹å™å›å¡å£å¥å¬å­å²å¹å¾åŽƒåŽ‡åŽˆåŽŽåŽ“åŽ”åŽ™åŽåŽ¡åŽ¤åŽªåŽ«åŽ¯åŽ²åŽ´åŽµåŽ·åŽ¸åŽºåŽ½å€å…åå’å“å•åšååžå å¦å§åµå‚å“åšå¡å§å¨åªå¯å±å´åµå‘ƒå‘„呇å‘å‘呞呢呤呦呧呩呫呭呮呴呿"], +["8fb5a1","å’咃咅咈咉å’咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊å“哎哠哪哬哯哶哼哾哿唀å”唅唈唉唌å”唎唕唪唫唲唵唶唻唼唽å•啇啉啊å•å•啑啘啚啛啞啠啡啤啦啿å–喂喆喈喎å–喑喒喓喔喗喣喤喭喲喿å—嗃嗆嗉嗋嗌嗎嗑嗒"], +["8fb6a1","嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊å˜",5,"嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀å™å™ƒå™„噆噉噋å™å™å™”噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚åšåšžåšŸåš¦åš§åš¨åš©åš«åš¬åš­åš±åš³åš·åš¾å›…囉囊囋å›å›å›Œå›å›™å›œå›å›Ÿå›¡å›¤",4,"囱囫园"], +["8fb7a1","å›¶å›·åœåœ‚圇圊圌圑圕圚圛åœåœ åœ¢åœ£åœ¤åœ¥åœ©åœªåœ¬åœ®åœ¯åœ³åœ´åœ½åœ¾åœ¿å…å†åŒåå’å¢å¥å§å¨å«å­",4,"å³å´åµå·å¹åºå»å¼å¾åžåžƒåžŒåž”垗垙垚垜åžåžžåžŸåž¡åž•垧垨垩垬垸垽埇埈埌åŸåŸ•åŸåŸžåŸ¤åŸ¦åŸ§åŸ©åŸ­åŸ°åŸµåŸ¶åŸ¸åŸ½åŸ¾åŸ¿å ƒå „堈堉埡"], +["8fb8a1","å Œå å ›å žå Ÿå  å ¦å §å ­å ²å ¹å ¿å¡‰å¡Œå¡å¡å¡å¡•塟塡塤塧塨塸塼塿墀å¢å¢‡å¢ˆå¢‰å¢Šå¢Œå¢å¢å¢å¢”墖å¢å¢ å¢¡å¢¢å¢¦å¢©å¢±å¢²å£„墼壂壈å£å£Žå£å£’壔壖壚å£å£¡å£¢å£©å£³å¤…夆夋夌夒夓夔è™å¤å¤¡å¤£å¤¤å¤¨å¤¯å¤°å¤³å¤µå¤¶å¤¿å¥ƒå¥†å¥’奓奙奛å¥å¥žå¥Ÿå¥¡å¥£å¥«å¥­"], +["8fb9a1","奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼å§å§ƒå§„姈姊å§å§’å§å§žå§Ÿå§£å§¤å§§å§®å§¯å§±å§²å§´å§·å¨€å¨„娌å¨å¨Žå¨’娓娞娣娤娧娨娪娭娰婄婅婇婈婌å©å©•婞婣婥婧婭婷婺婻婾媋åªåª“媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿"], +["8fbaa1","嫄嫆嫈å«å«šå«œå« å«¥å«ªå«®å«µå«¶å«½å¬€å¬å¬ˆå¬—嬴嬙嬛å¬å¬¡å¬¥å¬­å¬¸å­å­‹å­Œå­’孖孞孨孮孯孼孽孾孿å®å®„宆宊宎å®å®‘宓宔宖宨宩宬宭宯宱宲宷宺宼寀å¯å¯å¯å¯–",4,"寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩"], +["8fbba1","屭屰屴屵屺屻屼屽岇岈岊å²å²’å²å²Ÿå² å²¢å²£å²¦å²ªå²²å²´å²µå²ºå³‰å³‹å³’å³å³—峮峱峲峴å´å´†å´å´’崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿å¶å¶ƒå¶ˆå¶Šå¶’嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋å·å·Žå·˜å·™å· å·¤"], +["8fbca1","巩巸巹帀帇å¸å¸’帔帕帘帟帠帮帨帲帵帾幋å¹å¹‰å¹‘幖幘幛幜幞幨幪",4,"幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜å¼å¼¡å¼¢å¼£å¼¤å¼¨å¼«å¼¬å¼®å¼°å¼´å¼¶å¼»å¼½å¼¿å½€å½„彅彇å½å½å½”彘彛彠彣彤彧"], +["8fbda1","彯彲彴彵彸彺彽彾徉å¾å¾å¾–徜å¾å¾¢å¾§å¾«å¾¤å¾¬å¾¯å¾°å¾±å¾¸å¿„忇忈忉忋å¿",4,"å¿žå¿¡å¿¢å¿¨å¿©å¿ªå¿¬å¿­å¿®å¿¯å¿²å¿³å¿¶å¿ºå¿¼æ€‡æ€Šæ€æ€“æ€”æ€—æ€˜æ€šæ€Ÿæ€¤æ€­æ€³æ€µæ€æ‡æˆæ‰æŒæ‘æ”æ–æ—ææ¡æ§æ±æ¾æ¿æ‚‚æ‚†æ‚ˆæ‚Šæ‚Žæ‚‘æ‚“æ‚•æ‚˜æ‚æ‚žæ‚¢æ‚¤æ‚¥æ‚¨æ‚°æ‚±æ‚·"], +["8fbea1","æ‚»æ‚¾æƒ‚æƒ„æƒˆæƒ‰æƒŠæƒ‹æƒŽæƒæƒ”æƒ•æƒ™æƒ›æƒæƒžæƒ¢æƒ¥æƒ²æƒµæƒ¸æƒ¼æƒ½æ„‚愇愊愌æ„",4,"æ„–æ„—æ„™æ„œæ„žæ„¢æ„ªæ„«æ„°æ„±æ„µæ„¶æ„·æ„¹æ…æ……æ…†æ…‰æ…žæ… æ…¬æ…²æ…¸æ…»æ…¼æ…¿æ†€æ†æ†ƒæ†„æ†‹æ†æ†’æ†“æ†—æ†˜æ†œæ†æ†Ÿæ† æ†¥æ†¨æ†ªæ†­æ†¸æ†¹æ†¼æ‡€æ‡æ‡‚æ‡Žæ‡æ‡•æ‡œæ‡æ‡žæ‡Ÿæ‡¡æ‡¢æ‡§æ‡©æ‡¥"], +["8fbfa1","æ‡¬æ‡­æ‡¯æˆæˆƒæˆ„æˆ‡æˆ“æˆ•æˆœæˆ æˆ¢æˆ£æˆ§æˆ©æˆ«æˆ¹æˆ½æ‰‚æ‰ƒæ‰„æ‰†æ‰Œæ‰æ‰‘æ‰’æ‰”æ‰–æ‰šæ‰œæ‰¤æ‰­æ‰¯æ‰³æ‰ºæ‰½æŠæŠŽæŠæŠæŠ¦æŠ¨æŠ³æŠ¶æŠ·æŠºæŠ¾æŠ¿æ‹„æ‹Žæ‹•æ‹–æ‹šæ‹ªæ‹²æ‹´æ‹¼æ‹½æŒƒæŒ„æŒŠæŒ‹æŒæŒæŒ“æŒ–æŒ˜æŒ©æŒªæŒ­æŒµæŒ¶æŒ¹æŒ¼ææ‚æƒæ„æ†æŠæ‹æŽæ’æ“æ”æ˜æ›æ¥æ¦æ¬æ­æ±æ´æµ"], +["8fc0a1","æ¸æ¼æ½æ¿æŽ‚æŽ„æŽ‡æŽŠæŽæŽ”æŽ•æŽ™æŽšæŽžæŽ¤æŽ¦æŽ­æŽ®æŽ¯æŽ½ææ…æˆæŽæ‘æ“æ”æ•æœæ æ¥æªæ¬æ²æ³æµæ¸æ¹æ‰æŠææ’æ”æ˜æžæ æ¢æ¤æ¥æ©æªæ¯æ°æµæ½æ¿æ‘‹æ‘æ‘‘æ‘’æ‘“æ‘”æ‘šæ‘›æ‘œæ‘æ‘Ÿæ‘ æ‘¡æ‘£æ‘­æ‘³æ‘´æ‘»æ‘½æ’…æ’‡æ’æ’æ’‘æ’˜æ’™æ’›æ’æ’Ÿæ’¡æ’£æ’¦æ’¨æ’¬æ’³æ’½æ’¾æ’¿"], +["8fc1a1","æ“„æ“‰æ“Šæ“‹æ“Œæ“Žæ“æ“‘æ“•æ“—æ“¤æ“¥æ“©æ“ªæ“­æ“°æ“µæ“·æ“»æ“¿æ”æ”„æ”ˆæ”‰æ”Šæ”æ”“æ””æ”–æ”™æ”›æ”žæ”Ÿæ”¢æ”¦æ”©æ”®æ”±æ”ºæ”¼æ”½æ•ƒæ•‡æ•‰æ•æ•’æ•”æ•Ÿæ• æ•§æ•«æ•ºæ•½æ–æ–…æ–Šæ–’æ–•æ–˜æ–æ– æ–£æ–¦æ–®æ–²æ–³æ–´æ–¿æ—‚æ—ˆæ—‰æ—Žæ—æ—”æ—–æ—˜æ—Ÿæ—°æ—²æ—´æ—µæ—¹æ—¾æ—¿æ˜€æ˜„æ˜ˆæ˜‰æ˜æ˜‘昒昕昖æ˜"], +["8fc2a1","æ˜žæ˜¡æ˜¢æ˜£æ˜¤æ˜¦æ˜©æ˜ªæ˜«æ˜¬æ˜®æ˜°æ˜±æ˜³æ˜¹æ˜·æ™€æ™…æ™†æ™Šæ™Œæ™‘æ™Žæ™—æ™˜æ™™æ™›æ™œæ™ æ™¡æ›»æ™ªæ™«æ™¬æ™¾æ™³æ™µæ™¿æ™·æ™¸æ™¹æ™»æš€æ™¼æš‹æšŒæšæšæš’æš™æššæš›æšœæšŸæš æš¤æš­æš±æš²æšµæš»æš¿æ›€æ›‚æ›ƒæ›ˆæ›Œæ›Žæ›æ›”æ››æ›Ÿæ›¨æ›«æ›¬æ›®æ›ºæœ…æœ‡æœŽæœ“æœ™æœœæœ æœ¢æœ³æœ¾æ…æ‡æˆæŒæ”æ•æ"], +["8fc3a1","æ¦æ¬æ®æ´æ¶æ»æžæž„æžŽæžæž‘æž“æž–æž˜æž™æž›æž°æž±æž²æžµæž»æž¼æž½æŸ¹æŸ€æŸ‚æŸƒæŸ…æŸˆæŸ‰æŸ’æŸ—æŸ™æŸœæŸ¡æŸ¦æŸ°æŸ²æŸ¶æŸ·æ¡’æ ”æ ™æ æ Ÿæ ¨æ §æ ¬æ ­æ ¯æ °æ ±æ ³æ »æ ¿æ¡„桅桊桌桕桗桘桛桫桮",4,"桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌æ£"], +["8fc4a1","æ£æ£‘æ£“æ£–æ£™æ£œæ£æ£¥æ£¨æ£ªæ£«æ£¬æ£­æ£°æ£±æ£µæ£¶æ£»æ£¼æ£½æ¤†æ¤‰æ¤Šæ¤æ¤‘æ¤“æ¤–æ¤—æ¤±æ¤³æ¤µæ¤¸æ¤»æ¥‚æ¥…æ¥‰æ¥Žæ¥—æ¥›æ¥£æ¥¤æ¥¥æ¥¦æ¥¨æ¥©æ¥¬æ¥°æ¥±æ¥²æ¥ºæ¥»æ¥¿æ¦€æ¦æ¦’æ¦–æ¦˜æ¦¡æ¦¥æ¦¦æ¦¨æ¦«æ¦­æ¦¯æ¦·æ¦¸æ¦ºæ¦¼æ§…æ§ˆæ§‘æ§–æ§—æ§¢æ§¥æ§®æ§¯æ§±æ§³æ§µæ§¾æ¨€æ¨æ¨ƒæ¨æ¨‘æ¨•æ¨šæ¨æ¨ æ¨¤æ¨¨æ¨°æ¨²"], +["8fc5a1","æ¨´æ¨·æ¨»æ¨¾æ¨¿æ©…æ©†æ©‰æ©Šæ©Žæ©æ©‘æ©’æ©•æ©–æ©›æ©¤æ©§æ©ªæ©±æ©³æ©¾æªæªƒæª†æª‡æª‰æª‹æª‘æª›æªæªžæªŸæª¥æª«æª¯æª°æª±æª´æª½æª¾æª¿æ«†æ«‰æ«ˆæ«Œæ«æ«”æ«•æ«–æ«œæ«æ«¤æ«§æ«¬æ«°æ«±æ«²æ«¼æ«½æ¬‚æ¬ƒæ¬†æ¬‡æ¬‰æ¬æ¬æ¬‘æ¬—æ¬›æ¬žæ¬¤æ¬¨æ¬«æ¬¬æ¬¯æ¬µæ¬¶æ¬»æ¬¿æ­†æ­Šæ­æ­’æ­–æ­˜æ­æ­ æ­§æ­«æ­®æ­°æ­µæ­½"], +["8fc6a1","æ­¾æ®‚æ®…æ®—æ®›æ®Ÿæ® æ®¢æ®£æ®¨æ®©æ®¬æ®­æ®®æ®°æ®¸æ®¹æ®½æ®¾æ¯ƒæ¯„æ¯‰æ¯Œæ¯–æ¯šæ¯¡æ¯£æ¯¦æ¯§æ¯®æ¯±æ¯·æ¯¹æ¯¿æ°‚æ°„æ°…æ°‰æ°æ°Žæ°æ°’æ°™æ°Ÿæ°¦æ°§æ°¨æ°¬æ°®æ°³æ°µæ°¶æ°ºæ°»æ°¿æ±Šæ±‹æ±æ±æ±’æ±”æ±™æ±›æ±œæ±«æ±­æ±¯æ±´æ±¶æ±¸æ±¹æ±»æ²…æ²†æ²‡æ²‰æ²”æ²•æ²—æ²˜æ²œæ²Ÿæ²°æ²²æ²´æ³‚æ³†æ³æ³æ³æ³‘泒泔泖"], +["8fc7a1","æ³šæ³œæ³ æ³§æ³©æ³«æ³¬æ³®æ³²æ³´æ´„æ´‡æ´Šæ´Žæ´æ´‘æ´“æ´šæ´¦æ´§æ´¨æ±§æ´®æ´¯æ´±æ´¹æ´¼æ´¿æµ—æµžæµŸæµ¡æµ¥æµ§æµ¯æµ°æµ¼æ¶‚æ¶‡æ¶‘æ¶’æ¶”æ¶–æ¶—æ¶˜æ¶ªæ¶¬æ¶´æ¶·æ¶¹æ¶½æ¶¿æ·„æ·ˆæ·Šæ·Žæ·æ·–æ·›æ·æ·Ÿæ· æ·¢æ·¥æ·©æ·¯æ·°æ·´æ·¶æ·¼æ¸€æ¸„æ¸žæ¸¢æ¸§æ¸²æ¸¶æ¸¹æ¸»æ¸¼æ¹„æ¹…æ¹ˆæ¹‰æ¹‹æ¹æ¹‘æ¹’æ¹“æ¹”æ¹—æ¹œæ¹æ¹ž"], +["8fc8a1","æ¹¢æ¹£æ¹¨æ¹³æ¹»æ¹½æºæº“æº™æº æº§æº­æº®æº±æº³æº»æº¿æ»€æ»æ»ƒæ»‡æ»ˆæ»Šæ»æ»Žæ»æ»«æ»­æ»®æ»¹æ»»æ»½æ¼„æ¼ˆæ¼Šæ¼Œæ¼æ¼–æ¼˜æ¼šæ¼›æ¼¦æ¼©æ¼ªæ¼¯æ¼°æ¼³æ¼¶æ¼»æ¼¼æ¼­æ½æ½‘æ½’æ½“æ½—æ½™æ½šæ½æ½žæ½¡æ½¢æ½¨æ½¬æ½½æ½¾æ¾ƒæ¾‡æ¾ˆæ¾‹æ¾Œæ¾æ¾æ¾’澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊"], +["8fc9a1","濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇ç€ç€—瀠瀣瀯瀴瀷瀹瀼çƒç„çˆç‰çŠç‹ç”ç•ççžçŽç¤ç¥ç¬ç®çµç¶ç¾ç‚炅炆炔",4,"炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃",4,"焋焌ç„焞焠焫焭焯焰焱焸ç…煅煆煇煊煋ç…煒煗煚煜煞煠"], +["8fcaa1","煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀ç‡ç‡„燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚çˆçˆŸçˆ¤çˆ«çˆ¯çˆ´çˆ¸çˆ¹ç‰ç‰‚牃牅牎ç‰ç‰ç‰“牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉çŠçŠŽçŠ“çŠ›çŠ¨çŠ­çŠ®çŠ±çŠ´çŠ¾ç‹ç‹‡ç‹‰ç‹Œç‹•狖狘狟狥狳狴狺狻"], +["8fcba1","狾猂猄猅猇猋çŒçŒ’猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽çƒççç’ç–ç˜ççžçŸç ç¦ç§ç©ç«ç¬ç®ç¯ç±ç·ç¹ç¼çŽ€çŽçŽƒçŽ…çŽ†çŽŽçŽçŽ“çŽ•çŽ—çŽ˜çŽœçŽžçŽŸçŽ çŽ¢çŽ¥çŽ¦çŽªçŽ«çŽ­çŽµçŽ·çŽ¹çŽ¼çŽ½çŽ¿ç…ç†ç‰ç‹çŒçç’ç“ç–ç™çç¡ç£ç¦ç§ç©ç´çµç·ç¹çºç»ç½"], +["8fcca1","ç¿ç€çç„ç‡çŠç‘çšç›ç¤ç¦ç¨",9,"ç¹ç‘€ç‘ƒç‘„瑆瑇瑋ç‘ç‘‘ç‘’ç‘—ç‘瑢瑦瑧瑨瑫瑭瑮瑱瑲璀ç’璅璆璇璉ç’ç’璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌ç“瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆"], +["8fcda1","甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎ç•畒畗畞畟畡畯畱畹",5,"ç–ç–…ç–疒疓疕疙疜疢疤疴疺疿痀ç—痄痆痌痎ç—痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌ç˜ç˜’瘓瘕瘖瘙瘛瘜ç˜ç˜žç˜£ç˜¥ç˜¦ç˜©ç˜­ç˜²ç˜³ç˜µç˜¸ç˜¹"], +["8fcea1","瘺瘼癊癀ç™ç™ƒç™„癅癉癋癕癙癟癤癥癭癮癯癱癴çšçš…皌çšçš•皛皜çšçšŸçš çš¢",6,"皪皭皽ç›ç›…盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾ç‚ç…ç†çŠççŽçç’ç–ç—çœçžçŸç ç¢"], +["8fcfa1","ç¤ç§çªç¬ç°ç²ç³ç´çºç½çž€çž„瞌çžçž”瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉ç ç Žç ‘ç ç ¡ç ¢ç £ç ­ç ®ç °ç µç ·ç¡ƒç¡„硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊ç¢ç¢”碘碡ç¢ç¢žç¢Ÿç¢¤ç¢¨ç¢¬ç¢­ç¢°ç¢±ç¢²ç¢³"], +["8fd0a1","碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌ç¤ç¤šç¤œç¤žç¤Ÿç¤ ç¤¥ç¤§ç¤©ç¤­ç¤±ç¤´ç¤µç¤»ç¤½ç¤¿ç¥„祅祆祊祋ç¥ç¥‘祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊ç§ç§”ç§–ç§šç§ç§ž"], +["8fd1a1","秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜ç©ç©Ÿç© ç©¥ç©§ç©ªç©­ç©µç©¸ç©¾çª€çª‚窅窆窊窋çªçª‘窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰"], +["8fd2a1","笱笴笽笿筀ç­ç­‡ç­Žç­•筠筤筦筩筪筭筯筲筳筷箄箉箎ç®ç®‘箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾ç°ç°‚簃簄簆簉簋簌簎ç°ç°™ç°›ç° ç°¥ç°¦ç°¨ç°¬ç°±ç°³ç°´ç°¶ç°¹ç°ºç±†ç±Šç±•籑籒籓籙",5], +["8fd3a1","籡籣籧籩籭籮籰籲籹籼籽粆粇ç²ç²”粞粠粦粰粶粷粺粻粼粿糄糇糈糉ç³ç³ç³“糔糕糗糙糚ç³ç³¦ç³©ç³«ç³µç´ƒç´‡ç´ˆç´‰ç´ç´‘ç´’ç´“ç´–ç´ç´žç´£ç´¦ç´ªç´­ç´±ç´¼ç´½ç´¾çµ€çµçµ‡çµˆçµçµ‘絓絗絙絚絜çµçµ¥çµ§çµªçµ°çµ¸çµºçµ»çµ¿ç¶ç¶‚綃綅綆綈綋綌ç¶ç¶‘ç¶–ç¶—ç¶"], +["8fd4a1","綞綦綧綪綳綶綷綹緂",4,"ç·Œç·ç·Žç·—緙縀緢緥緦緪緫緭緱緵緶緹緺縈ç¸ç¸‘縕縗縜ç¸ç¸ ç¸§ç¸¨ç¸¬ç¸­ç¸¯ç¸³ç¸¶ç¸¿ç¹„繅繇繎ç¹ç¹’繘繟繡繢繥繫繮繯繳繸繾çºçº†çº‡çºŠçºçº‘纕纘纚çºçºžç¼¼ç¼»ç¼½ç¼¾ç¼¿ç½ƒç½„罇ç½ç½’罓罛罜ç½ç½¡ç½£ç½¤ç½¥ç½¦ç½­"], +["8fd5a1","罱罽罾罿羀羋ç¾ç¾ç¾ç¾‘羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎ç¿ç¿›ç¿Ÿç¿£ç¿¥ç¿¨ç¿¬ç¿®ç¿¯ç¿²ç¿ºç¿½ç¿¾ç¿¿è€‡è€ˆè€Šè€è€Žè€è€‘耓耔耖è€è€žè€Ÿè€ è€¤è€¦è€¬è€®è€°è€´è€µè€·è€¹è€ºè€¼è€¾è€è„è è¤è¦è­è±èµè‚肈肎肜肞肦肧肫肸肹胈èƒèƒèƒ’胔胕胗胘胠胭胮"], +["8fd6a1","胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷è†è†è†„膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎è‡è‡•臗臛è‡è‡žè‡¡è‡¤è‡«è‡¬è‡°è‡±è‡²è‡µè‡¶è‡¸è‡¹è‡½è‡¿èˆ€èˆƒèˆèˆ“舔舙舚èˆèˆ¡èˆ¢èˆ¨èˆ²èˆ´èˆºè‰ƒè‰„艅艆"], +["8fd7a1","艋艎è‰è‰‘艖艜艠艣艧艭艴艻艽艿芀èŠèŠƒèŠ„èŠ‡èŠ‰èŠŠèŠŽèŠ‘èŠ”èŠ–èŠ˜èŠšèŠ›èŠ èŠ¡èŠ£èŠ¤èŠ§èŠ¨èŠ©èŠªèŠ®èŠ°èŠ²èŠ´èŠ·èŠºèŠ¼èŠ¾èŠ¿è‹†è‹è‹•苚苠苢苤苨苪苭苯苶苷苽苾茀èŒèŒ‡èŒˆèŒŠèŒ‹è”茛èŒèŒžèŒŸèŒ¡èŒ¢èŒ¬èŒ­èŒ®èŒ°èŒ³èŒ·èŒºèŒ¼èŒ½è‚èƒè„è‡èèŽè‘è•è–è—è°è¸"], +["8fd8a1","è½è¿èŽ€èŽ‚èŽ„èŽ†èŽèŽ’èŽ”èŽ•èŽ˜èŽ™èŽ›èŽœèŽèŽ¦èŽ§èŽ©èŽ¬èŽ¾èŽ¿è€è‡è‰èèè‘è”èè“è¨èªè¶è¸è¹è¼èè†èŠèè‘è•è™èŽ­è¯è¹è‘…葇葈葊è‘è‘葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽è’蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌è“è““"], +["8fd9a1","蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎è”蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆è•",4,"蕖蕙蕜",6,"蕤蕫蕯蕹蕺蕻蕽蕿è–薅薆薉薋薌è–è–“è–˜è–薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼"], +["8fdaa1","藿蘀蘄蘅è˜è˜Žè˜è˜‘蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙è™è™ ",4,"虩虬虯虵虶虷虺èšèš‘蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀è›è›ƒè›…蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎èœèœèœ“蜔蜙蜞蜟蜡蜣"], +["8fdba1","蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾è€èƒè…èè˜èè¡è¤è¥è¯è±è²è»èžƒ",6,"螋螌èžèž“螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿èŸèŸˆèŸ‰èŸŠèŸŽèŸ•蟖蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿è è ƒè †è ‰è Šè ‹è è ™è ’蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵"], +["8fdca1","蠺蠼è¡è¡ƒè¡…衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊",4,"裑裒裓裛裞裧裯裰裱裵裷è¤è¤†è¤è¤Žè¤è¤•褖褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉è¥è¥’襗襚襛襜襡襢襣襫襮襰襳襵襺"], +["8fdda1","襻襼襽覉è¦è¦è¦”覕覛覜覟覠覥覰覴覵覶覷覼觔",4,"觥觩觫觭觱觳觶觹觽觿訄訅訇è¨è¨‘訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉è©è©Žè©“詖詗詘詜è©è©¡è©¥è©§è©µè©¶è©·è©¹è©ºè©»è©¾è©¿èª€èªƒèª†èª‹èªèªèª’誖誗誙誟誧誩誮誯誳"], +["8fdea1","誶誷誻誾諃諆諈諉諊諑諓諔諕諗è«è«Ÿè«¬è«°è«´è«µè«¶è«¼è«¿è¬…謆謋謑謜謞謟謊謭謰謷謼譂",4,"譈譒譓譔譙è­è­žè­£è­­è­¶è­¸è­¹è­¼è­¾è®è®„讅讋è®è®è®”讕讜讞讟谸谹谽谾豅豇豉豋è±è±‘豓豔豗豘豛è±è±™è±£è±¤è±¦è±¨è±©è±­è±³è±µè±¶è±»è±¾è²†"], +["8fdfa1","貇貋è²è²’貓貙貛貜貤貹貺賅賆賉賋è³è³–賕賙è³è³¡è³¨è³¬è³¯è³°è³²è³µè³·è³¸è³¾è³¿è´è´ƒè´‰è´’贗贛赥赩赬赮赿趂趄趈è¶è¶è¶‘趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽è¸è¸„踅踆踋踑踔踖踠踡踢"], +["8fe0a1","踣踦踧踱踳踶踷踸踹踽蹀è¹è¹‹è¹è¹Žè¹è¹”蹛蹜è¹è¹žè¹¡è¹¢è¹©è¹¬è¹­è¹¯è¹°è¹±è¹¹è¹ºè¹»èº‚躃躉èºèº’躕躚躛èºèºžèº¢èº§èº©èº­èº®èº³èºµèººèº»è»€è»è»ƒè»„軇è»è»‘軔軜軨軮軰軱軷軹軺軭輀輂輇輈è¼è¼è¼–輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀è½"], +["8fe1a1","轃轇è½è½‘",4,"轘è½è½žè½¥è¾è¾ è¾¡è¾¤è¾¥è¾¦è¾µè¾¶è¾¸è¾¾è¿€è¿è¿†è¿Šè¿‹è¿è¿è¿’迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿éƒé„éŒé›éé¢é¦é§é¬é°é´é¹é‚…邈邋邌邎é‚邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃"], +["8fe2a1","郄郅郇郈郕郗郘郙郜éƒéƒŸéƒ¥éƒ’郶郫郯郰郴郾郿鄀鄄鄅鄆鄈é„é„鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈é…酓酗酙酚酛酡酤酧酭酴酹酺酻é†é†ƒé†…醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿"], +["8fe3a1","釂釃釅釓釔釗釙釚釞釤釥釩釪釬",5,"釷釹釻釽鈀éˆéˆ„鈅鈆鈇鈉鈊鈌éˆéˆ’鈓鈖鈘鈜éˆéˆ£éˆ¤éˆ¥éˆ¦éˆ¨éˆ®éˆ¯éˆ°éˆ³éˆµéˆ¶éˆ¸éˆ¹éˆºéˆ¼éˆ¾é‰€é‰‚鉃鉆鉇鉊é‰é‰Žé‰é‰‘鉘鉙鉜é‰é‰ é‰¡é‰¥é‰§é‰¨é‰©é‰®é‰¯é‰°é‰µ",4,"鉻鉼鉽鉿銈銉銊éŠéŠŽéŠ’éŠ—"], +["8fe4a1","銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿",4,"鋅鋆鋇鋈鋋鋌é‹é‹Žé‹é‹“鋕鋗鋘鋙鋜é‹é‹Ÿé‹ é‹¡é‹£é‹¥é‹§é‹¨é‹¬é‹®é‹°é‹¹é‹»é‹¿éŒ€éŒ‚錈éŒéŒ‘錔錕錜éŒéŒžéŒŸéŒ¡éŒ¤éŒ¥éŒ§éŒ©éŒªéŒ³éŒ´éŒ¶éŒ·é‡éˆé‰éé‘é’é•é—é˜éšéžé¤é¥é§é©éªé­é¯é°é±é³é´é¶"], +["8fe5a1","éºé½é¿éŽ€éŽéŽ‚éŽˆéŽŠéŽ‹éŽéŽéŽ’éŽ•éŽ˜éŽ›éŽžéŽ¡éŽ£éŽ¤éŽ¦éŽ¨éŽ«éŽ´éŽµéŽ¶éŽºéŽ©éé„é…é†é‡é‰",4,"é“é™éœéžéŸé¢é¦é§é¹é·é¸éºé»é½éé‚é„éˆé‰ééŽéé•é–é—éŸé®é¯é±é²é³é´é»é¿é½é‘ƒé‘…鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹"], +["8fe6a1","镾閄閈閌é–é–Žé–閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋é—闑闒闓闙闚é—闞闟闠闤闦é˜é˜žé˜¢é˜¤é˜¥é˜¦é˜¬é˜±é˜³é˜·é˜¸é˜¹é˜ºé˜¼é˜½é™é™’陔陖陗陘陡陮陴陻陼陾陿éšéš‚隃隄隉隑隖隚éšéšŸéš¤éš¥éš¦éš©éš®éš¯éš³éšºé›Šé›’嶲雘雚é›é›žé›Ÿé›©é›¯é›±é›ºéœ‚"], +["8fe7a1","霃霅霉霚霛éœéœ¡éœ¢éœ£éœ¨éœ±éœ³ééƒéŠéŽéé•é—é˜éšé›é£é§éªé®é³é¶é·é¸é»é½é¿éž€éž‰éž•鞖鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿éŸéŸ„韅韇韉韊韌éŸéŸŽéŸéŸ‘韔韗韘韙éŸéŸžéŸ éŸ›éŸ¡éŸ¤éŸ¯éŸ±éŸ´éŸ·éŸ¸éŸºé ‡é Šé ™é é Žé ”頖頜頞頠頣頦"], +["8fe8a1","頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱",4,"餹餺餻餼饀é¥é¥†é¥‡é¥ˆé¥é¥Žé¥”饘饙饛饜饞饟饠馛é¦é¦Ÿé¦¦é¦°é¦±é¦²é¦µ"], +["8fe9a1","馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌é¨é¨‘騖騞騠騢騣騤騧騭騮騳騵騶騸驇é©é©„驊驋驌驎驑驔驖é©éªªéª¬éª®éª¯éª²éª´éªµéª¶éª¹éª»éª¾éª¿é«é«ƒé«†é«ˆé«Žé«é«’髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿",4], +["8feaa1","鬄鬅鬈鬉鬋鬌é¬é¬Žé¬é¬’鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪",4,"魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋é®é®é®é®”鮚é®é®žé®¦é®§é®©é®¬é®°é®±é®²é®·é®¸é®»é®¼é®¾é®¿é¯é¯‡é¯ˆé¯Žé¯é¯—鯘é¯é¯Ÿé¯¥é¯§é¯ªé¯«é¯¯é¯³é¯·é¯¸"], +["8feba1","鯹鯺鯽鯿鰀鰂鰋é°é°‘鰖鰘鰙鰚鰜鰞鰢鰣鰦",4,"鰱鰵鰶鰷鰽é±é±ƒé±„鱅鱉鱊鱎é±é±é±“鱔鱖鱘鱛é±é±žé±Ÿé±£é±©é±ªé±œé±«é±¨é±®é±°é±²é±µé±·é±»é³¦é³²é³·é³¹é´‹é´‚鴑鴗鴘鴜é´é´žé´¯é´°é´²é´³é´´é´ºé´¼éµ…鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻"], +["8feca1","鵼鵾鶃鶄鶆鶊é¶é¶Žé¶’鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎é¸é¸‘鸒鸕鸖鸙鸜é¸é¹ºé¹»é¹¼éº€éº‚麃麄麅麇麎éºéº–麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵"], +["8feda1","黸黿鼂鼃鼉é¼é¼é¼‘鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿é½é½ƒ",4,"齓齕齖齗齘齚é½é½žé½¨é½©é½­",4,"齳齵齺齽é¾é¾é¾‘龒龔龖龗龞龡龢龣龥"] +] diff --git a/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json b/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json new file mode 100644 index 00000000..85c69347 --- /dev/null +++ b/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json @@ -0,0 +1 @@ +{"uChars":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],"gbChars":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]} \ No newline at end of file diff --git a/node_modules/iconv-lite/encodings/tables/gbk-added.json b/node_modules/iconv-lite/encodings/tables/gbk-added.json new file mode 100644 index 00000000..8abfa9f7 --- /dev/null +++ b/node_modules/iconv-lite/encodings/tables/gbk-added.json @@ -0,0 +1,55 @@ +[ +["a140","",62], +["a180","î”…",32], +["a240","",62], +["a280","î•¥",32], +["a2ab","î¦",5], +["a2e3","€î­"], +["a2ef","î®î¯"], +["a2fd","î°î±"], +["a340","î–†",62], +["a380","î—…",31," "], +["a440","î—¦",62], +["a480","",32], +["a4f4","î²",10], +["a540","",62], +["a580","îš…",32], +["a5f7","î½",7], +["a640","",62], +["a680","",32], +["a6b9","îž…",7], +["a6d9","îž",6], +["a6ec",""], +["a6f3","îž–"], +["a6f6","îž—",8], +["a740","",62], +["a780","î…",32], +["a7c2","îž ",14], +["a7f2","",12], +["a896","îž¼",10], +["a8bc",""], +["a8bf","ǹ"], +["a8c1",""], +["a8ea","îŸ",20], +["a958",""], +["a95b",""], +["a95d",""], +["a989","〾⿰",11], +["a997","",12], +["a9f0","î ",14], +["aaa1","",93], +["aba1","îž",93], +["aca1","",93], +["ada1","",93], +["aea1","î…¸",93], +["afa1","",93], +["d7fa","î ",4], +["f8a1","",93], +["f9a1","",93], +["faa1","î‹°",93], +["fba1","îŽ",93], +["fca1","",93], +["fda1","îŠ",93], +["fe50","âºî –⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘ã§ã§Ÿã©³ã§î «î ¬ã­Žã±®ã³ âº§î ±î ²âºªä–䅟⺮䌷⺳⺶⺷䎱䎬⺻ä䓖䙡䙌"], +["fe80","䜣䜩ä¼äžâ»Šä¥‡ä¥ºä¥½ä¦‚䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓",6,"䶮",93] +] diff --git a/node_modules/iconv-lite/encodings/tables/shiftjis.json b/node_modules/iconv-lite/encodings/tables/shiftjis.json new file mode 100644 index 00000000..5a3a43cf --- /dev/null +++ b/node_modules/iconv-lite/encodings/tables/shiftjis.json @@ -0,0 +1,125 @@ +[ +["0","\u0000",128], +["a1","。",62], +["8140"," ã€ã€‚,.・:;?ï¼ã‚›ã‚œÂ´ï½€Â¨ï¼¾ï¿£ï¼¿ãƒ½ãƒ¾ã‚ゞ〃ä»ã€…〆〇ー―â€ï¼ï¼¼ï½žâˆ¥ï½œâ€¦â€¥â€˜â€™â€œâ€ï¼ˆï¼‰ã€”〕[]{ï½ã€ˆ",9,"+ï¼Â±Ã—"], +["8180","÷ï¼â‰ ï¼œï¼žâ‰¦â‰§âˆžâˆ´â™‚♀°′″℃¥$¢£%#&*@§☆★○â—◎◇◆□■△▲▽▼※〒→â†â†‘↓〓"], +["81b8","∈∋⊆⊇⊂⊃∪∩"], +["81c8","∧∨¬⇒⇔∀∃"], +["81da","∠⊥⌒∂∇≡≒≪≫√∽âˆâˆµâˆ«âˆ¬"], +["81f0","ʼn♯♭♪†‡¶"], +["81fc","â—¯"], +["824f","ï¼",9], +["8260","A",25], +["8281","ï½",25], +["829f","ã",82], +["8340","ã‚¡",62], +["8380","ム",22], +["839f","Α",16,"Σ",6], +["83bf","α",16,"σ",6], +["8440","Ð",5,"ÐЖ",25], +["8470","а",5,"ёж",7], +["8480","о",17], +["849f","─│┌â”┘└├┬┤┴┼â”┃â”┓┛┗┣┳┫┻╋┠┯┨┷┿â”┰┥┸╂"], +["8740","â‘ ",19,"â… ",9], +["875f","ã‰ãŒ”㌢ã㌘㌧㌃㌶ã‘ã—ãŒãŒ¦ãŒ£ãŒ«ãŠãŒ»ãŽœãŽãŽžãŽŽãŽã„㎡"], +["877e","ã»"], +["8780","ã€ã€Ÿâ„–ã℡㊤",4,"㈱㈲㈹ã¾ã½ã¼â‰’≡∫∮∑√⊥∠∟⊿∵∩∪"], +["889f","äºœå”–å¨ƒé˜¿å“€æ„›æŒ¨å§¶é€¢è‘µèŒœç©æ‚ªæ¡æ¸¥æ—­è‘¦èŠ¦é¯µæ¢“åœ§æ–¡æ‰±å®›å§è™»é£´çµ¢ç¶¾é®Žæˆ–ç²Ÿè¢·å®‰åºµæŒ‰æš—æ¡ˆé—‡éžæä»¥ä¼Šä½ä¾å‰å›²å¤·å§”å¨å°‰æƒŸæ„慰易椅為ç•異移維緯胃èŽè¡£è¬‚é•éºåŒ»äº•亥域育éƒç£¯ä¸€å£±æº¢é€¸ç¨²èŒ¨èЋ鰝å…å°å’½å“¡å› å§»å¼•飲淫胤蔭"], +["8940","院陰隠韻å‹å³å®‡çƒç¾½è¿‚雨å¯éµœçªºä¸‘碓臼渦嘘唄æ¬è”šé°»å§¥åŽ©æµ¦ç“œé–噂云é‹é›²è餌å¡å–¶å¬°å½±æ˜ æ›³æ „永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦è¬è¶Šé–²æ¦Žåޭ円"], +["8980","åœ’å °å¥„å®´å»¶æ€¨æŽ©æ´æ²¿æ¼”炎焔煙燕猿ç¸è‰¶è‹‘è–—é é‰›é´›å¡©æ–¼æ±šç”¥å‡¹å¤®å¥¥å¾€å¿œæŠ¼æ—ºæ¨ªæ¬§æ®´çŽ‹ç¿è¥–鴬鴎黄岡沖è»å„„å±‹æ†¶è‡†æ¡¶ç‰¡ä¹™ä¿ºå¸æ©æ¸©ç©éŸ³ä¸‹åŒ–仮何伽価佳加å¯å˜‰å¤å«å®¶å¯¡ç§‘暇果架歌河ç«ç‚ç¦ç¦¾ç¨¼ç®‡èŠ±è‹›èŒ„è·è¯è“è¦èª²å˜©è²¨è¿¦éŽéœžèšŠä¿„å³¨æˆ‘ç‰™ç”»è‡¥èŠ½è›¾è³€é›…é¤“é§•ä»‹ä¼šè§£å›žå¡Šå£Šå»»å¿«æ€ªæ‚”æ¢æ‡æˆ’æ‹æ”¹"], +["8a40","é­æ™¦æ¢°æµ·ç°ç•Œçš†çµµèŠ¥èŸ¹é–‹éšŽè²å‡±åŠ¾å¤–å’³å®³å´–æ…¨æ¦‚æ¶¯ç¢è“‹è¡—該鎧骸浬馨蛙垣柿蛎鈎劃嚇å„廓拡撹格核殻ç²ç¢ºç©«è¦šè§’赫較郭閣隔é©å­¦å²³æ¥½é¡é¡ŽæŽ›ç¬ æ¨«"], +["8a80","æ©¿æ¢¶é°æ½Ÿå‰²å–æ°æ‹¬æ´»æ¸‡æ»‘è‘›è¤è½„䏔鰹嶿¤›æ¨ºéž„株兜竃蒲釜鎌噛鴨栢茅è±ç²¥åˆˆè‹…ç“¦ä¹¾ä¾ƒå† å¯’åˆŠå‹˜å‹§å·»å–šå ªå§¦å®Œå®˜å¯›å¹²å¹¹æ‚£æ„Ÿæ…£æ†¾æ›æ•¢æŸ‘桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰è‚艦莞観諌貫還鑑間閑関陥韓館舘丸å«å²¸å·ŒçŽ©ç™Œçœ¼å²©ç¿«è´‹é›é ‘顔願ä¼ä¼Žå±å–œå™¨åŸºå¥‡å¬‰å¯„å²å¸Œå¹¾å¿Œæ®æœºæ——既期棋棄"], +["8b40","機帰毅気汽畿祈季稀紀徽è¦è¨˜è²´èµ·è»Œè¼é£¢é¨Žé¬¼äº€å½å„€å¦“宜戯技擬欺犠疑祇義蟻誼議掬èŠéž å‰åƒå–«æ¡”橘詰砧æµé»å´å®¢è„šè™é€†ä¸˜ä¹…仇休åŠå¸å®®å¼“急救"], +["8b80","朽求汲泣ç¸çƒç©¶çª®ç¬ˆç´šç³¾çµ¦æ—§ç‰›åŽ»å±…å·¨æ‹’æ‹ æŒ™æ¸ è™šè¨±è·é‹¸æ¼ç¦¦é­šäº¨äº«äº¬ä¾›ä¾ åƒ‘兇競共凶å”匡å¿å«å–¬å¢ƒå³¡å¼·å½Šæ€¯ææ­æŒŸæ•™æ©‹æ³ç‹‚狭矯胸脅興蕎郷é¡éŸ¿é¥—驚仰å‡å°­æšæ¥­å±€æ›²æ¥µçމæ¡ç²åƒ…勤å‡å·¾éŒ¦æ–¤æ¬£æ¬½ç´ç¦ç¦½ç­‹ç·ŠèйèŒè¡¿è¥Ÿè¬¹è¿‘金åŸéŠ€ä¹å€¶å¥åŒºç‹—玖矩苦躯駆駈駒具愚虞喰空å¶å¯“é‡éš…串櫛釧屑屈"], +["8c40","掘窟沓é´è½¡çªªç†Šéšˆç²‚æ —ç¹°æ¡‘é¬å‹²å›è–«è¨“群è»éƒ¡å¦è¢ˆç¥ä¿‚傾刑兄啓圭çªåž‹å¥‘å½¢å¾„æµæ…¶æ…§æ†©æŽ²æºæ•¬æ™¯æ¡‚渓畦稽系経継繋罫茎èŠè›è¨ˆè©£è­¦è»½é šé¶èŠ¸è¿Žé¯¨"], +["8c80","劇戟撃激隙æ¡å‚‘欠決潔穴çµè¡€è¨£æœˆä»¶å€¹å€¦å¥å…¼åˆ¸å‰£å–§åœå …å«Œå»ºæ†²æ‡¸æ‹³æ²æ¤œæ¨©ç‰½çŠ¬çŒ®ç ”ç¡¯çµ¹çœŒè‚©è¦‹è¬™è³¢è»’é£éµé™ºé¡•験鹸元原厳幻弦減æºçŽ„ç¾çµƒèˆ·è¨€è«ºé™ä¹Žå€‹å¤å‘¼å›ºå§‘孤己庫弧戸故枯湖ç‹ç³Šè¢´è‚¡èƒ¡è°è™Žèª‡è·¨éˆ·é›‡é¡§é¼“五互ä¼åˆå‘‰å¾å¨¯å¾Œå¾¡æ‚Ÿæ¢§æªŽç‘šç¢èªžèª¤è­·é†ä¹žé¯‰äº¤ä½¼ä¾¯å€™å€–光公功効勾厚å£å‘"], +["8d40","åŽå–‰å‘垢好孔å­å®å·¥å·§å··å¹¸åºƒåºšåº·å¼˜æ’æ…ŒæŠ—æ‹˜æŽ§æ”»æ˜‚æ™ƒæ›´æ­æ ¡æ¢—構江洪浩港æºç”²çš‡ç¡¬ç¨¿ç³ ç´…紘絞綱耕考肯肱腔è†èˆªè’行衡講貢購郊酵鉱砿鋼閤é™"], +["8d80","項香高鴻剛劫å·åˆå£•æ‹·æ¿ è±ªè½Ÿéº¹å…‹åˆ»å‘Šå›½ç©€é…·éµ é»’ç„æ¼‰è…°ç”‘忽惚骨狛込此頃今困å¤å¢¾å©šæ¨æ‡‡æ˜æ˜†æ ¹æ¢±æ··ç—•紺艮魂些ä½å‰å”†åµ¯å·¦å·®æŸ»æ²™ç‘³ç ‚è©éŽ–è£Ÿååº§æŒ«å‚µå‚¬å†æœ€å“‰å¡žå¦»å®°å½©æ‰æŽ¡æ ½æ­³æ¸ˆç½é‡‡çŠ€ç •ç ¦ç¥­æ–Žç´°èœè£è¼‰éš›å‰¤åœ¨æç½ªè²¡å†´å‚é˜ªå ºæ¦Šè‚´å’²å´ŽåŸ¼ç¢•é·ºä½œå‰Šå’‹æ¾æ˜¨æœ”柵窄策索錯桜鮭笹匙冊刷"], +["8e40","察拶撮擦札殺薩雑çšé¯–æŒéŒ†é®«çš¿æ™’三傘å‚山惨撒散桟燦çŠç”£ç®—çº‚èš•è®ƒè³›é…¸é¤æ–¬æš«æ®‹ä»•仔伺使刺å¸å²å—£å››å£«å§‹å§‰å§¿å­å±å¸‚å¸«å¿—æ€æŒ‡æ”¯å­œæ–¯æ–½æ—¨æžæ­¢"], +["8e80","æ­»æ°ç…祉ç§ç³¸ç´™ç´«è‚¢è„‚至視詞詩試誌諮資賜雌飼歯事似ä¾å…å­—å¯ºæ…ˆæŒæ™‚次滋治爾璽痔ç£ç¤ºè€Œè€³è‡ªè’”辞æ±é¹¿å¼è­˜é´«ç«ºè»¸å®é›«ä¸ƒå±åŸ·å¤±å«‰å®¤æ‚‰æ¹¿æ¼†ç–¾è³ªå®Ÿè”€ç¯ å²æŸ´èŠå±¡è•Šç¸žèˆŽå†™å°„æ¨èµ¦æ–œç…®ç¤¾ç´—者è¬è»Šé®è›‡é‚ªå€Ÿå‹ºå°ºæ“ç¼çˆµé…Œé‡ˆéŒ«è‹¥å¯‚弱惹主å–守手朱殊狩ç ç¨®è…«è¶£é…’首儒å—呪寿授樹綬需囚åŽå‘¨"], +["8f40","å®—å°±å·žä¿®æ„æ‹¾æ´²ç§€ç§‹çµ‚ç¹ç¿’臭舟è’衆襲è®è¹´è¼¯é€±é…‹é…¬é›†é†œä»€ä½å……åå¾“æˆŽæŸ”æ±æ¸‹ç£ç¸¦é‡éŠƒå”夙宿淑ç¥ç¸®ç²›å¡¾ç†Ÿå‡ºè¡“述俊峻春瞬竣舜駿准循旬楯殉淳"], +["8f80","準潤盾純巡éµé†‡é †å‡¦åˆæ‰€æš‘曙渚庶緒署書薯藷諸助å™å¥³åºå¾æ•鋤除傷償å‹åŒ å‡å¬å“¨å•†å”±å˜—奨妾娼宵将å°å°‘å°šåº„åºŠå» å½°æ‰¿æŠ„æ‹›æŽŒæ·æ˜‡æ˜Œæ˜­æ™¶æ¾æ¢¢æ¨Ÿæ¨µæ²¼æ¶ˆæ¸‰æ¹˜ç„¼ç„¦ç…§ç—‡çœç¡ç¤ç¥¥ç§°ç« ç¬‘粧紹肖è–蒋蕉è¡è£³è¨Ÿè¨¼è©”詳象賞醤鉦é¾é˜éšœéž˜ä¸Šä¸ˆä¸žä¹—å†—å‰°åŸŽå ´å£Œå¬¢å¸¸æƒ…æ“¾æ¡æ–浄状畳穣蒸譲醸錠嘱埴飾"], +["9040","æ‹­æ¤æ®–燭織è·è‰²è§¦é£Ÿè•辱尻伸信侵唇娠å¯å¯©å¿ƒæ…ŽæŒ¯æ–°æ™‹æ£®æ¦›æµ¸æ·±ç”³ç–¹çœŸç¥žç§¦ç´³è‡£èŠ¯è–ªè¦ªè¨ºèº«è¾›é€²é‡éœ‡äººä»åˆƒå¡µå£¬å°‹ç”šå°½è…Žè¨Šè¿…陣é­ç¬¥è«é ˆé…¢å›³åލ"], +["9080","逗å¹åž‚帥推水炊ç¡ç²‹ç¿ è¡°é‚é…”éŒéŒ˜éšç‘žé«„å´‡åµ©æ•°æž¢è¶¨é››æ®æ‰æ¤™è…é —é›€è£¾æ¾„æ‘ºå¯¸ä¸–ç€¬ç•æ˜¯å‡„åˆ¶å‹¢å§“å¾æ€§æˆæ”¿æ•´æ˜Ÿæ™´æ£²æ –正清牲生盛精è–声製西誠誓請é€é†’é’陿–‰ç¨Žè„†éš»å¸­æƒœæˆšæ–¥æ˜”æžçŸ³ç©ç±ç¸¾è„Šè²¬èµ¤è·¡è¹Ÿç¢©åˆ‡æ‹™æŽ¥æ‘‚折設窃節説雪絶舌è‰ä»™å…ˆåƒå å®£å°‚å°–å·æˆ¦æ‰‡æ’°æ “栴泉浅洗染潜煎煽旋穿箭線"], +["9140","繊羨腺舛船薦詮賎践é¸é·éŠ­éŠ‘é–ƒé®®å‰å–„漸然全禅繕膳糎噌塑岨措曾曽楚狙ç–疎礎祖租粗素組蘇訴阻é¡é¼ åƒ§å‰µåŒå¢å€‰å–ªå£®å¥çˆ½å®‹å±¤åŒæƒ£æƒ³æœæŽƒæŒ¿æŽ»"], +["9180","æ“æ—©æ›¹å·£æ§æ§½æ¼•燥争痩相窓糟ç·ç¶œè¡è‰è˜è‘¬è’¼è—»è£…èµ°é€é­éŽ—éœœé¨’åƒå¢—憎臓蔵贈造促å´å‰‡å³æ¯æ‰æŸæ¸¬è¶³é€Ÿä¿—属賊æ—ç¶šå’袖其æƒå­˜å­«å°Šææ‘éœä»–多太汰詑唾堕妥惰打æŸèˆµæ¥•陀駄騨体堆対è€å²±å¸¯å¾…怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代å°å¤§ç¬¬é†é¡Œé·¹æ»ç€§å“啄宅托択拓沢濯ç¢è¨—鏿¿è«¾èŒ¸å‡§è›¸åª"], +["9240","å©ä½†é”辰奪脱巽竪辿棚谷狸鱈樽誰丹å˜å˜†å¦æ‹…探旦歎淡湛炭短端箪綻耽胆蛋誕é›å›£å£‡å¼¾æ–­æš–æª€æ®µç”·è«‡å€¤çŸ¥åœ°å¼›æ¥æ™ºæ± ç—´ç¨šç½®è‡´èœ˜é…馳築畜竹筑蓄"], +["9280","é€ç§©çª’茶嫡ç€ä¸­ä»²å®™å¿ æŠ½æ˜¼æŸ±æ³¨è™«è¡·è¨»é…Žé‹³é§æ¨—瀦猪苧著貯ä¸å…†å‡‹å–‹å¯µå¸–帳åºå¼”å¼µå½«å¾´æ‡²æŒ‘æš¢æœæ½®ç‰’町眺è´è„¹è…¸è¶èª¿è«œè¶…跳銚長頂鳥勅æ—直朕沈çè³ƒéŽ®é™³æ´¥å¢œæ¤Žæ§Œè¿½éŽšç—›é€šå¡šæ ‚æŽ´æ§»ä½ƒæ¼¬æŸ˜è¾»è”¦ç¶´é”æ¤¿æ½°åªå£·å¬¬ç´¬çˆªåŠé‡£é¶´äº­ä½Žåœåµå‰ƒè²žå‘ˆå ¤å®šå¸åº•åº­å»·å¼Ÿæ‚ŒæŠµæŒºææ¢¯æ±€ç¢‡ç¦Žç¨‹ç· è‰‡è¨‚諦蹄逓"], +["9340","邸鄭釘鼎泥摘擢敵滴的笛é©é‘溺哲徹撤è½è¿­é‰„典填天展店添çºç”œè²¼è»¢é¡›ç‚¹ä¼æ®¿æ¾±ç”°é›»å…Žåå µå¡—å¦¬å± å¾’æ–—æœæ¸¡ç™»èŸè³­é€”都é砥砺努度土奴怒倒党冬"], +["9380","å‡åˆ€å”å¡”å¡˜å¥—å®•å³¶å¶‹æ‚¼æŠ•æ­æ±æ¡ƒæ¢¼æ£Ÿç›—淘湯涛ç¯ç‡ˆå½“痘祷等答筒糖統到董蕩藤討謄豆è¸é€ƒé€é™é™¶é ­é¨°é—˜åƒå‹•åŒå ‚導憧撞洞瞳童胴è„é“銅峠鴇匿得徳涜特ç£ç¦¿ç¯¤æ¯’ç‹¬èª­æ ƒæ©¡å‡¸çªæ¤´å±Šé³¶è‹«å¯…酉瀞噸屯惇敦沌豚é頓呑曇éˆå¥ˆé‚£å†…ä¹å‡ªè–™è¬Žç˜æºé‹æ¥¢é¦´ç¸„ç•·å—æ¥ è»Ÿé›£æ±äºŒå°¼å¼è¿©åŒ‚賑肉虹廿日乳入"], +["9440","如尿韮任妊å¿èªæ¿¡ç¦°ç¥¢å¯§è‘±çŒ«ç†±å¹´å¿µæ»æ’šç‡ƒç²˜ä¹ƒå»¼ä¹‹åŸœå𢿂©æ¿ƒç´èƒ½è„³è†¿è¾²è¦—èš¤å·´æŠŠæ’­è¦‡æ·æ³¢æ´¾ç¶ç ´å©†ç½µèŠ­é¦¬ä¿³å»ƒæ‹æŽ’æ•—æ¯ç›ƒç‰ŒèƒŒè‚ºè¼©é…å€åŸ¹åª’梅"], +["9480","楳煤狽買売賠陪這è¿ç§¤çŸ§è©ä¼¯å‰¥å𿋿Ÿæ³Šç™½ç®”ç²•èˆ¶è–„è¿«æ›æ¼ çˆ†ç¸›èŽ«é§éº¦å‡½ç®±ç¡²ç®¸è‚‡ç­ˆæ«¨å¹¡è‚Œç•‘畠八鉢溌発醗髪ä¼ç½°æŠœç­é–¥é³©å™ºå¡™è›¤éš¼ä¼´åˆ¤åŠåå›å¸†æ¬æ–‘æ¿æ°¾æ±Žç‰ˆçНç­ç•”ç¹èˆ¬è—©è²©ç¯„釆煩頒飯挽晩番盤ç£è•ƒè›®åŒªå‘å¦å¦ƒåº‡å½¼æ‚²æ‰‰æ‰¹æŠ«æ–比泌疲皮碑秘緋罷肥被誹費é¿éžé£›æ¨‹ç°¸å‚™å°¾å¾®æž‡æ¯˜çµçœ‰ç¾Ž"], +["9540","鼻柊稗匹疋髭彦è†è±è‚˜å¼¼å¿…畢筆逼桧姫媛ç´ç™¾è¬¬ä¿µå½ªæ¨™æ°·æ¼‚瓢票表評豹廟æç—…秒苗錨鋲蒜蛭鰭å“彬斌浜瀕貧賓頻æ•ç“¶ä¸ä»˜åŸ å¤«å©¦å¯Œå†¨å¸ƒåºœæ€–扶敷"], +["9580","斧普浮父符è…è†šèŠ™è­œè² è³¦èµ´é˜œé™„ä¾®æ’«æ­¦èˆžè‘¡è•ªéƒ¨å°æ¥“風葺蕗ä¼å‰¯å¾©å¹…æœç¦è…¹è¤‡è¦†æ·µå¼—払沸ä»ç‰©é®’分å»å™´å¢³æ†¤æ‰®ç„šå¥®ç²‰ç³žç´›é›°æ–‡èžä¸™ä½µå…µå¡€å¹£å¹³å¼ŠæŸ„並蔽閉陛米é åƒ»å£ç™–碧別瞥蔑箆å変片篇編辺返é便勉娩å¼éž­ä¿èˆ—é‹ªåœƒæ•æ­©ç”«è£œè¼”穂募墓慕戊暮æ¯ç°¿è©å€£ä¿¸åŒ…呆報奉å®å³°å³¯å´©åº–æŠ±æ§æ”¾æ–¹æœ‹"], +["9640","法泡烹砲縫胞芳èŒè“¬èœ‚褒訪豊邦鋒飽鳳鵬ä¹äº¡å‚剖åŠå¦¨å¸½å¿˜å¿™æˆ¿æš´æœ›æŸæ£’冒紡肪膨謀貌貿鉾防å é ¬åŒ—僕åœå¢¨æ’²æœ´ç‰§ç¦ç©†é‡¦å‹ƒæ²¡æ®†å €å¹Œå¥”本翻凡盆"], +["9680","摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒æ¡äº¦ä¿£åˆæŠ¹æœ«æ²«è¿„ä¾­ç¹­éº¿ä¸‡æ…¢æº€æ¼«è”“å‘³æœªé­…å·³ç®•å²¬å¯†èœœæ¹Šè“‘ç¨”è„ˆå¦™ç²æ°‘眠務夢無牟矛霧鵡椋婿娘冥åå‘½æ˜Žç›Ÿè¿·éŠ˜é³´å§ªç‰æ»…å…æ£‰ç¶¿ç·¬é¢éººæ‘¸æ¨¡èŒ‚妄孟毛猛盲網耗蒙儲木黙目æ¢å‹¿é¤…å°¤æˆ»ç±¾è²°å•æ‚¶ç´‹é–€åŒä¹Ÿå†¶å¤œçˆºè€¶é‡Žå¼¥çŸ¢åŽ„å½¹ç´„è–¬è¨³èºé–柳薮鑓愉愈油癒"], +["9740","諭輸唯佑優勇å‹å®¥å¹½æ‚ æ†‚æ–æœ‰æŸšæ¹§æ¶ŒçŒ¶çŒ·ç”±ç¥è£•誘éŠé‚‘郵雄èžå¤•予余与誉輿é å‚­å¹¼å¦–å®¹åº¸æšæºæ“曜楊様洋溶熔用窯羊耀葉蓉è¦è¬¡è¸Šé¥é™½é¤Šæ…¾æŠ‘欲"], +["9780","沃浴翌翼淀羅螺裸æ¥èŽ±é ¼é›·æ´›çµ¡è½é…ªä¹±åµåµæ¬„æ¿«è—蘭覧利åå±¥æŽæ¢¨ç†ç’ƒç—¢è£è£¡é‡Œé›¢é™¸å¾‹çŽ‡ç«‹è‘ŽæŽ ç•¥åŠ‰æµæºœç‰ç•™ç¡«ç²’隆竜é¾ä¾¶æ…®æ—…è™œäº†äº®åƒšä¸¡å‡Œå¯®æ–™æ¢æ¶¼çŒŸç™‚瞭稜糧良諒é¼é‡é™µé ˜åŠ›ç·‘å€«åŽ˜æž—æ·‹ç‡ç³è‡¨è¼ªéš£é±—éºŸç‘ å¡æ¶™ç´¯é¡žä»¤ä¼¶ä¾‹å†·åŠ±å¶ºæ€œçŽ²ç¤¼è‹“éˆ´éš·é›¶éœŠéº—é½¢æš¦æ­´åˆ—åŠ£çƒˆè£‚å»‰æ‹æ†æ¼£ç…‰ç°¾ç·´è¯"], +["9840","蓮連錬呂魯櫓炉賂路露労å©å»Šå¼„朗楼榔浪æ¼ç‰¢ç‹¼ç¯­è€è¾è‹éƒŽå…­éº“禄肋録論倭和話歪賄脇惑枠鷲亙亘é°è©«è—蕨椀湾碗腕"], +["989f","弌ä¸ä¸•个丱丶丼丿乂乖乘亂亅豫亊舒å¼äºŽäºžäºŸäº äº¢äº°äº³äº¶ä»Žä»ä»„仆仂仗仞仭仟价伉佚估佛ä½ä½—佇佶侈ä¾ä¾˜ä½»ä½©ä½°ä¾‘佯來侖儘俔俟俎俘俛俑俚ä¿ä¿¤ä¿¥å€šå€¨å€”倪倥倅伜俶倡倩倬俾俯們倆åƒå‡æœƒå•ååˆåšå–å¬å¸å‚€å‚šå‚…傴傲"], +["9940","僉僊傳僂僖僞僥僭僣僮價僵儉å„儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉å†å†‘冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭"], +["9980","凰凵凾刄刋刔刎刧刪刮刳刹å‰å‰„剋剌剞剔剪剴剩剳剿剽åŠåŠ”åŠ’å‰±åŠˆåŠ‘è¾¨è¾§åŠ¬åŠ­åŠ¼åŠµå‹å‹å‹—勞勣勦飭勠勳勵勸勹匆匈甸åŒåŒåŒåŒ•匚匣匯匱匳匸å€å†å…丗å‰å凖åžå©å®å¤˜å»å·åŽ‚åŽ–åŽ åŽ¦åŽ¥åŽ®åŽ°åŽ¶åƒç°’é›™åŸæ›¼ç‡®å®å¨å­åºåå½å‘€å¬å­å¼å®å¶å©å呎å’呵咎呟呱呷呰咒呻咀呶咄å’咆哇咢咸咥咬哄哈咨"], +["9a40","咫哂咤咾咼哘哥哦å”唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳å•喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎å™ç‡Ÿå˜´å˜¶å˜²å˜¸"], +["9a80","噫噤嘯噬噪嚆嚀嚊嚠嚔åšåš¥åš®åš¶åš´å›‚åš¼å›å›ƒå›€å›ˆå›Žå›‘囓囗囮囹圀囿圄圉圈國åœåœ“團圖嗇圜圦圷圸åŽåœ»å€åå©åŸ€åžˆå¡å¿åž‰åž“垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙å å¡²å ¡å¡¢å¡‹å¡°æ¯€å¡’堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊å¤å¤›æ¢¦å¤¥å¤¬å¤­å¤²å¤¸å¤¾ç«’奕å¥å¥Žå¥šå¥˜å¥¢å¥ å¥§å¥¬å¥©"], +["9b40","奸å¦å¦ä½žä¾«å¦£å¦²å§†å§¨å§œå¦å§™å§šå¨¥å¨Ÿå¨‘娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲å«å¬ªå¬¶å¬¾å­ƒå­…孀孑孕孚孛孥孩孰孳孵學斈孺宀"], +["9b80","它宦宸寃寇寉寔å¯å¯¤å¯¦å¯¢å¯žå¯¥å¯«å¯°å¯¶å¯³å°…將專å°å°“尠尢尨尸尹å±å±†å±Žå±“å±å±å­±å±¬å±®ä¹¢å±¶å±¹å²Œå²‘岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢å¶å¶¬å¶®å¶½å¶å¶·å¶¼å·‰å·å·“巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠å»å»‚廈å»å»"], +["9c40","廖廣å»å»šå»›å»¢å»¡å»¨å»©å»¬å»±å»³å»°å»´å»¸å»¾å¼ƒå¼‰å½å½œå¼‹å¼‘弖弩弭弸å½å½ˆå½Œå½Žå¼¯å½‘å½–å½—å½™å½¡å½­å½³å½·å¾ƒå¾‚å½¿å¾Šå¾ˆå¾‘å¾‡å¾žå¾™å¾˜å¾ å¾¨å¾­å¾¼å¿–å¿»å¿¤å¿¸å¿±å¿æ‚³å¿¿æ€¡æ "], +["9c80","æ€™æ€æ€©æ€Žæ€±æ€›æ€•æ€«æ€¦æ€æ€ºæšææªæ·æŸæŠæ†ææ£æƒæ¤æ‚æ¬æ«æ™æ‚æ‚æƒ§æ‚ƒæ‚šæ‚„æ‚›æ‚–æ‚—æ‚’æ‚§æ‚‹æƒ¡æ‚¸æƒ æƒ“æ‚´å¿°æ‚½æƒ†æ‚µæƒ˜æ…æ„•æ„†æƒ¶æƒ·æ„€æƒ´æƒºæ„ƒæ„¡æƒ»æƒ±æ„æ„Žæ…‡æ„¾æ„¨æ„§æ…Šæ„¿æ„¼æ„¬æ„´æ„½æ…‚æ…„æ…³æ…·æ…˜æ…™æ…šæ…«æ…´æ…¯æ…¥æ…±æ…Ÿæ…æ…“æ…µæ†™æ†–æ†‡æ†¬æ†”æ†šæ†Šæ†‘æ†«æ†®æ‡Œæ‡Šæ‡‰æ‡·æ‡ˆæ‡ƒæ‡†æ†ºæ‡‹ç½¹æ‡æ‡¦æ‡£æ‡¶æ‡ºæ‡´æ‡¿æ‡½æ‡¼æ‡¾æˆ€æˆˆæˆ‰æˆæˆŒæˆ”戛"], +["9d40","æˆžæˆ¡æˆªæˆ®æˆ°æˆ²æˆ³æ‰æ‰Žæ‰žæ‰£æ‰›æ‰ æ‰¨æ‰¼æŠ‚æŠ‰æ‰¾æŠ’æŠ“æŠ–æ‹”æŠƒæŠ”æ‹—æ‹‘æŠ»æ‹æ‹¿æ‹†æ“”æ‹ˆæ‹œæ‹Œæ‹Šæ‹‚æ‹‡æŠ›æ‹‰æŒŒæ‹®æ‹±æŒ§æŒ‚æŒˆæ‹¯æ‹µææŒ¾ææœææŽ–æŽŽæŽ€æŽ«æ¶æŽ£æŽæŽ‰æŽŸæŽµæ«"], +["9d80","æ©æŽ¾æ©æ€æ†æ£æ‰æ’æ¶æ„æ–æ´æ†æ“æ¦æ¶æ”æ—æ¨ææ‘§æ‘¯æ‘¶æ‘Žæ”ªæ’•æ’“æ’¥æ’©æ’ˆæ’¼æ“šæ“’æ“…æ“‡æ’»æ“˜æ“‚æ“±æ“§èˆ‰æ“ æ“¡æŠ¬æ“£æ“¯æ”¬æ“¶æ“´æ“²æ“ºæ”€æ“½æ”˜æ”œæ”…æ”¤æ”£æ”«æ”´æ”µæ”·æ”¶æ”¸ç•‹æ•ˆæ•–æ••æ•æ•˜æ•žæ•æ•²æ•¸æ–‚æ–ƒè®Šæ–›æ–Ÿæ–«æ–·æ—ƒæ—†æ—æ—„æ—Œæ—’æ—›æ—™æ— æ—¡æ—±æ²æ˜Šæ˜ƒæ—»æ³æ˜µæ˜¶æ˜´æ˜œæ™æ™„æ™‰æ™æ™žæ™æ™¤æ™§æ™¨æ™Ÿæ™¢æ™°æšƒæšˆæšŽæš‰æš„æš˜æšæ›æš¹æ›‰æš¾æš¼"], +["9e40","æ›„æš¸æ›–æ›šæ› æ˜¿æ›¦æ›©æ›°æ›µæ›·æœæœ–æœžæœ¦æœ§éœ¸æœ®æœ¿æœ¶ææœ¸æœ·æ†æžæ æ™æ£æ¤æž‰æ°æž©æ¼æªæžŒæž‹æž¦æž¡æž…æž·æŸ¯æž´æŸ¬æž³æŸ©æž¸æŸ¤æŸžæŸæŸ¢æŸ®æž¹æŸŽæŸ†æŸ§æªœæ žæ¡†æ ©æ¡€æ¡æ ²æ¡Ž"], +["9e80","æ¢³æ «æ¡™æ¡£æ¡·æ¡¿æ¢Ÿæ¢æ¢­æ¢”æ¢æ¢›æ¢ƒæª®æ¢¹æ¡´æ¢µæ¢ æ¢ºæ¤æ¢æ¡¾æ¤æ£Šæ¤ˆæ£˜æ¤¢æ¤¦æ£¡æ¤Œæ£æ£”æ£§æ£•æ¤¶æ¤’æ¤„æ£—æ££æ¤¥æ£¹æ£ æ£¯æ¤¨æ¤ªæ¤šæ¤£æ¤¡æ£†æ¥¹æ¥·æ¥œæ¥¸æ¥«æ¥”æ¥¾æ¥®æ¤¹æ¥´æ¤½æ¥™æ¤°æ¥¡æ¥žæ¥æ¦æ¥ªæ¦²æ¦®æ§æ¦¿æ§æ§“æ¦¾æ§Žå¯¨æ§Šæ§æ¦»æ§ƒæ¦§æ¨®æ¦‘æ¦ æ¦œæ¦•æ¦´æ§žæ§¨æ¨‚æ¨›æ§¿æ¬Šæ§¹æ§²æ§§æ¨…æ¦±æ¨žæ§­æ¨”æ§«æ¨Šæ¨’æ«æ¨£æ¨“æ©„æ¨Œæ©²æ¨¶æ©¸æ©‡æ©¢æ©™æ©¦æ©ˆæ¨¸æ¨¢æªæªæª æª„檢檣"], +["9f40","æª—è˜—æª»æ«ƒæ«‚æª¸æª³æª¬æ«žæ«‘æ«Ÿæªªæ«šæ«ªæ«»æ¬…è˜–æ«ºæ¬’æ¬–é¬±æ¬Ÿæ¬¸æ¬·ç›œæ¬¹é£®æ­‡æ­ƒæ­‰æ­æ­™æ­”æ­›æ­Ÿæ­¡æ­¸æ­¹æ­¿æ®€æ®„æ®ƒæ®æ®˜æ®•殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯"], +["9f80","éº¾æ°ˆæ°“æ°”æ°›æ°¤æ°£æ±žæ±•æ±¢æ±ªæ²‚æ²æ²šæ²æ²›æ±¾æ±¨æ±³æ²’æ²æ³„æ³±æ³“æ²½æ³—æ³…æ³æ²®æ²±æ²¾æ²ºæ³›æ³¯æ³™æ³ªæ´Ÿè¡æ´¶æ´«æ´½æ´¸æ´™æ´µæ´³æ´’æ´Œæµ£æ¶“æµ¤æµšæµ¹æµ™æ¶Žæ¶•æ¿¤æ¶…æ·¹æ¸•æ¸Šæ¶µæ·‡æ·¦æ¶¸æ·†æ·¬æ·žæ·Œæ·¨æ·’æ·…æ·ºæ·™æ·¤æ·•æ·ªæ·®æ¸­æ¹®æ¸®æ¸™æ¹²æ¹Ÿæ¸¾æ¸£æ¹«æ¸«æ¹¶æ¹æ¸Ÿæ¹ƒæ¸ºæ¹Žæ¸¤æ»¿æ¸æ¸¸æº‚æºªæº˜æ»‰æº·æ»“æº½æº¯æ»„æº²æ»”æ»•æºæº¥æ»‚æºŸæ½æ¼‘çŒæ»¬æ»¸æ»¾æ¼¿æ»²æ¼±æ»¯æ¼²æ»Œ"], +["e040","æ¼¾æ¼“æ»·æ¾†æ½ºæ½¸æ¾æ¾€æ½¯æ½›æ¿³æ½­æ¾‚潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑ç€ç€æ¿¾ç€›ç€šæ½´ç€ç€˜ç€Ÿç€°ç€¾ç€²ç‘ç£ç‚™ç‚’炯烱炬炸炳炮烟烋çƒ"], +["e080","烙焉烽焜焙煥煕熈煦煢煌煖煬ç†ç‡»ç†„熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿çˆçˆçˆ›çˆ¨çˆ­çˆ¬çˆ°çˆ²çˆ»çˆ¼çˆ¿ç‰€ç‰†ç‰‹ç‰˜ç‰´ç‰¾çŠ‚çŠçŠ‡çŠ’çŠ–çŠ¢çŠ§çŠ¹çŠ²ç‹ƒç‹†ç‹„ç‹Žç‹’ç‹¢ç‹ ç‹¡ç‹¹ç‹·å€çŒ—猊猜猖çŒçŒ´çŒ¯çŒ©çŒ¥çŒ¾çŽç默ç—çªç¨ç°ç¸çµç»çºçˆç޳çŽçŽ»ç€ç¥ç®çžç’¢ç…瑯ç¥ç¸ç²çºç‘•ç¿ç‘Ÿç‘™ç‘瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊ç“ç“”ç±"], +["e140","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎ç”甕甓甞甦甬甼畄ç•畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚ç–疥疣痂疳痃疵疽疸疼疱ç—痊痒痙痣痞痾痿"], +["e180","ç—¼ç˜ç—°ç—ºç—²ç—³ç˜‹ç˜ç˜‰ç˜Ÿç˜§ç˜ ç˜¡ç˜¢ç˜¤ç˜´ç˜°ç˜»ç™‡ç™ˆç™†ç™œç™˜ç™¡ç™¢ç™¨ç™©ç™ªç™§ç™¬ç™°ç™²ç™¶ç™¸ç™¼çš€çšƒçšˆçš‹çšŽçš–皓皙皚皰皴皸皹皺盂ç›ç›–盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸ç‡çšç¨ç«ç›ç¥ç¿ç¾ç¹çžŽçž‹çž‘瞠瞞瞰瞶瞹瞿瞼瞽瞻矇çŸçŸ—矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"], +["e240","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊ç¦ç¦§é½‹ç¦ªç¦®ç¦³ç¦¹ç¦ºç§‰ç§•秧秬秡秣稈ç¨ç¨˜ç¨™ç¨ ç¨Ÿç¦€ç¨±ç¨»ç¨¾ç¨·ç©ƒç©—穉穡穢穩é¾ç©°ç©¹ç©½çªˆçª—窕窘窖窩竈窰"], +["e280","窶竅竄窿邃竇竊ç«ç«ç«•竓站竚ç«ç«¡ç«¢ç«¦ç«­ç«°ç¬‚ç¬ç¬Šç¬†ç¬³ç¬˜ç¬™ç¬žç¬µç¬¨ç¬¶ç­ç­ºç¬„ç­ç¬‹ç­Œç­…筵筥筴筧筰筱筬筮ç®ç®˜ç®Ÿç®ç®œç®šç®‹ç®’ç®ç­ç®™ç¯‹ç¯ç¯Œç¯ç®´ç¯†ç¯ç¯©ç°‘簔篦篥籠簀簇簓篳篷簗ç°ç¯¶ç°£ç°§ç°ªç°Ÿç°·ç°«ç°½ç±Œç±ƒç±”ç±ç±€ç±ç±˜ç±Ÿç±¤ç±–籥籬籵粃ç²ç²¤ç²­ç²¢ç²«ç²¡ç²¨ç²³ç²²ç²±ç²®ç²¹ç²½ç³€ç³…糂糘糒糜糢鬻糯糲糴糶糺紆"], +["e340","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮çµçµ£ç¶“綉絛ç¶çµ½ç¶›ç¶ºç¶®ç¶£ç¶µç·‡ç¶½ç¶«ç¸½ç¶¢ç¶¯ç·œç¶¸ç¶Ÿç¶°ç·˜ç·ç·¤ç·žç·»ç·²ç·¡ç¸…縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷"], +["e380","縲縺繧ç¹ç¹–繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒çºçº“纔纖纎纛纜缸缺罅罌ç½ç½Žç½ç½‘罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞ç¾ç¾šç¾£ç¾¯ç¾²ç¾¹ç¾®ç¾¶ç¾¸è­±ç¿…翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻èŠè†è’è˜èšèŸè¢è¨è³è²è°è¶è¹è½è¿è‚„肆肅肛肓肚肭å†è‚¬èƒ›èƒ¥èƒ™èƒèƒ„胚胖脉胯胱脛脩脣脯腋"], +["e440","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉è‡è‡‘臙臘臈臚臟臠臧臺臻臾èˆèˆ‚舅與舊èˆèˆèˆ–舩舫舸舳艀艙艘è‰è‰šè‰Ÿè‰¤"], +["e480","艢艨艪艫舮艱艷艸艾èŠèŠ’èŠ«èŠŸèŠ»èŠ¬è‹¡è‹£è‹Ÿè‹’è‹´è‹³è‹ºèŽ“èŒƒè‹»è‹¹è‹žèŒ†è‹œèŒ‰è‹™èŒµèŒ´èŒ–èŒ²èŒ±è€èŒ¹èè…茯茫茗茘莅莚莪莟莢莖茣莎莇莊è¼è޵è³èµèŽ èŽ‰èŽ¨è´è“è«èŽè½èƒè˜è‹èè·è‡è è²èè¢è è޽è¸è”†è»è‘­èªè¼è•šè’„葷葫蒭葮蒂葩葆è¬è‘¯è‘¹èµè“Šè‘¢è’¹è’¿è’Ÿè“™è“蒻蓚è“è“蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"], +["e540","è•蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾è–藉薺è—è–¹è—è—•è—藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿è™ä¹•虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬"], +["e580","蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉èœè›¹èœŠèœ´èœ¿èœ·èœ»èœ¥èœ©èœšè èŸè¸èŒèŽè´è—è¨è®è™è“è£èªè …螢螟螂螯蟋螽蟀èŸé›–螫蟄螳蟇蟆螻蟯蟲蟠è è èŸ¾èŸ¶èŸ·è ŽèŸ’蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫è¢è¡¾è¢žè¡µè¡½è¢µè¡²è¢‚袗袒袮袙袢è¢è¢¤è¢°è¢¿è¢±è£ƒè£„裔裘裙è£è£¹è¤‚裼裴裨裲褄褌褊褓襃褞褥褪褫è¥è¥„褻褶褸襌è¤è¥ è¥ž"], +["e640","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜è§è§§è§´è§¸è¨ƒè¨–è¨è¨Œè¨›è¨è¨¥è¨¶è©è©›è©’詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄è«è«‚諚諫諳諧"], +["e680","諤諱謔諠諢諷諞諛謌謇謚諡謖è¬è¬—謠謳鞫謦謫謾謨è­è­Œè­è­Žè­‰è­–譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺è±è°¿è±ˆè±Œè±Žè±è±•豢豬豸豺貂貉貅貊è²è²Žè²”豼貘æˆè²­è²ªè²½è²²è²³è²®è²¶è³ˆè³è³¤è³£è³šè³½è³ºè³»è´„è´…è´Šè´‡è´è´è´é½Žè´“è³è´”贖赧赭赱赳è¶è¶™è·‚趾趺è·è·šè·–跌跛跋跪跫跟跣跼踈踉跿è¸è¸žè¸è¸Ÿè¹‚踵踰踴蹊"], +["e740","蹇蹉蹌è¹è¹ˆè¹™è¹¤è¹ è¸ªè¹£è¹•蹶蹲蹼èºèº‡èº…躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜"], +["e780","轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡é€é€žé€–逋逧逶逵逹迸ééé‘é’逎é‰é€¾é–é˜éžé¨é¯é¶éš¨é²é‚‚é½é‚邀邊邉é‚邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀é‡é‡‰é‡‹é‡é‡–釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋é‰éŠœéŠ–éŠ“éŠ›é‰šé‹éŠ¹éŠ·é‹©éŒé‹ºé„錮"], +["e840","錙錢錚錣錺錵錻éœé é¼é®é–鎰鎬鎭鎔鎹é–é—é¨é¥é˜éƒéééˆé¤éšé”é“éƒé‡éé¶é«éµé¡éºé‘鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾é’鑿閂閇閊閔閖閘閙"], +["e880","閠閨閧閭閼閻閹閾闊濶闃é—闌闕闔闖關闡闥闢阡阨阮阯陂陌é™é™‹é™·é™œé™žé™é™Ÿé™¦é™²é™¬éšéš˜éš•隗險隧隱隲隰隴隶隸隹雎雋雉é›è¥é›œéœé›•雹霄霆霈霓霎霑éœéœ–霙霤霪霰霹霽霾é„é†éˆé‚é‰éœé é¤é¦é¨å‹’é«é±é¹éž…é¼éžéºéž†éž‹éžéžéžœéž¨éž¦éž£éž³éž´éŸƒéŸ†éŸˆéŸ‹éŸœéŸ­é½éŸ²ç«ŸéŸ¶éŸµé é Œé ¸é ¤é ¡é ·é ½é¡†é¡é¡‹é¡«é¡¯é¡°"], +["e940","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡é¤é¤žé¤¤é¤ é¤¬é¤®é¤½é¤¾é¥‚饉饅é¥é¥‹é¥‘饒饌饕馗馘馥馭馮馼駟駛é§é§˜é§‘駭駮駱駲駻駸é¨é¨é¨…駢騙騫騷驅驂驀驃"], +["e980","騾驕é©é©›é©—驟驢驥驤驩驫驪骭骰骼髀é«é«‘髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃é­é­é­Žé­‘魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆é¯é¯‘鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒éµé´¿é´¾éµ†éµˆ"], +["ea40","éµéµžéµ¤éµ‘éµéµ™éµ²é¶‰é¶‡é¶«éµ¯éµºé¶šé¶¤é¶©é¶²é·„é·é¶»é¶¸é¶ºé·†é·é·‚鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽éºéºˆéº‹éºŒéº’麕麑éºéº¥éº©éº¸éºªéº­é¡é»Œé»Žé»é»é»”黜點é»é» é»¥é»¨é»¯"], +["ea80","黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇é™ç‘¤å‡œç†™"], +["ed40","纊褜éˆéŠˆè“œä¿‰ç‚»æ˜±æ£ˆé‹¹æ›»å½…ä¸¨ä»¡ä»¼ä¼€ä¼ƒä¼¹ä½–ä¾’ä¾Šä¾šä¾”ä¿å€å€¢ä¿¿å€žå†å°å‚傔僴僘兊兤å†å†¾å‡¬åˆ•劜劦勀勛匀匇匤å²åŽ“åŽ²å﨎咜咊咩哿喆å™å¥åž¬åŸˆåŸ‡ï¨"], +["ed80","ï¨å¢žå¢²å¤‹å¥“奛å¥å¥£å¦¤å¦ºå­–寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹å·å¼¡å¼´å½§å¾·å¿žææ‚…æ‚Šæƒžæƒ•æ„ æƒ²æ„‘æ„·æ„°æ†˜æˆ“æŠ¦æµæ‘ æ’æ“Žæ•Žæ˜€æ˜•æ˜»æ˜‰æ˜®æ˜žæ˜¤æ™¥æ™—æ™™ï¨’æ™³æš™æš æš²æš¿æ›ºæœŽï¤©æ¦æž»æ¡’æŸ€æ æ¡„æ£ï¨“æ¥¨ï¨”æ¦˜æ§¢æ¨°æ©«æ©†æ©³æ©¾æ«¢æ«¤æ¯–æ°¿æ±œæ²†æ±¯æ³šæ´„æ¶‡æµ¯æ¶–æ¶¬æ·æ·¸æ·²æ·¼æ¸¹æ¹œæ¸§æ¸¼æº¿æ¾ˆæ¾µæ¿µç€…瀇瀨炅炫ç„焄煜煆煇凞ç‡ç‡¾çб"], +["ee40","犾猤猪ç·ç޽ç‰ç–ç£ç’ç‡çµç¦çªç©ç®ç‘¢ç’‰ç’Ÿç”畯皂皜皞皛皦益ç†åŠ¯ç ¡ç¡Žç¡¤ç¡ºç¤°ï¨˜ï¨™ï¨šç¦”ï¨›ç¦›ç«‘ç«§ï¨œç««ç®žï¨çµˆçµœç¶·ç¶ ç·–繒罇羡羽èŒè¢è¿è‡è¶è‘ˆè’´è•“è•™"], +["ee80","蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣è»ï¨¤ï¨¥é§éƒžï¨¦é„•鄧釚釗釞釭釮釤釥鈆éˆéˆŠéˆºé‰€éˆ¼é‰Žé‰™é‰‘鈹鉧銧鉷鉸鋧鋗鋙é‹ï¨§é‹•鋠鋓錥錡鋻﨨錞鋿éŒéŒ‚é°é—鎤é†éžé¸é±é‘…鑈閒隆﨩éšéš¯éœ³éœ»éƒééé‘é•顗顥飯飼餧館馞驎髙髜魵魲é®é®±é®»é°€éµ°éµ«ï¨­é¸™é»‘"], +["eeef","â…°",9,"¬¦'""], +["f040","",62], +["f080","",124], +["f140","",62], +["f180","",124], +["f240","î…¸",62], +["f280","",124], +["f340","",62], +["f380","",124], +["f440","î‹°",62], +["f480","",124], +["f540","",62], +["f580","î«",124], +["f640","",62], +["f680","î’§",124], +["f740","",62], +["f780","î•£",124], +["f840","î— ",62], +["f880","",124], +["f940","îšœ"], +["fa40","â…°",9,"â… ",9,"¬¦'"㈱№℡∵纊褜éˆéŠˆè“œä¿‰ç‚»æ˜±æ£ˆé‹¹æ›»å½…ä¸¨ä»¡ä»¼ä¼€ä¼ƒä¼¹ä½–ä¾’ä¾Šä¾šä¾”ä¿å€å€¢ä¿¿å€žå†å°å‚傔僴僘兊"], +["fa80","å…¤å†å†¾å‡¬åˆ•劜劦勀勛匀匇匤å²åŽ“åŽ²å﨎咜咊咩哿喆å™å¥åž¬åŸˆåŸ‡ï¨ï¨å¢žå¢²å¤‹å¥“奛å¥å¥£å¦¤å¦ºå­–寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹å·å¼¡å¼´å½§å¾·å¿žææ‚…æ‚Šæƒžæƒ•æ„ æƒ²æ„‘æ„·æ„°æ†˜æˆ“æŠ¦æµæ‘ æ’æ“Žæ•Žæ˜€æ˜•æ˜»æ˜‰æ˜®æ˜žæ˜¤æ™¥æ™—æ™™ï¨’æ™³æš™æš æš²æš¿æ›ºæœŽï¤©æ¦æž»æ¡’æŸ€æ æ¡„æ£ï¨“楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯"], +["fb40","æ¶–æ¶¬æ·æ·¸æ·²æ·¼æ¸¹æ¹œæ¸§æ¸¼æº¿æ¾ˆæ¾µæ¿µç€…瀇瀨炅炫ç„焄煜煆煇凞ç‡ç‡¾çŠ±çŠ¾çŒ¤ï¨–ç·ç޽ç‰ç–ç£ç’ç‡çµç¦çªç©ç®ç‘¢ç’‰ç’Ÿç”畯皂皜皞皛皦益ç†åŠ¯ç ¡ç¡Žç¡¤ç¡ºç¤°ï¨˜ï¨™"], +["fb80","祥禔福禛竑竧靖竫箞ï¨çµˆçµœç¶·ç¶ ç·–繒罇羡羽èŒè¢è¿è‡è¶è‘ˆè’´è•“蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣è»ï¨¤ï¨¥é§éƒžï¨¦é„•鄧釚釗釞釭釮釤釥鈆éˆéˆŠéˆºé‰€éˆ¼é‰Žé‰™é‰‘鈹鉧銧鉷鉸鋧鋗鋙é‹ï¨§é‹•鋠鋓錥錡鋻﨨錞鋿éŒéŒ‚é°é—鎤é†éžé¸é±é‘…鑈閒隆﨩éšéš¯éœ³éœ»éƒééé‘é•顗顥飯飼餧館馞驎髙"], +["fc40","髜魵魲é®é®±é®»é°€éµ°éµ«ï¨­é¸™é»‘"] +] diff --git a/node_modules/iconv-lite/encodings/utf16.js b/node_modules/iconv-lite/encodings/utf16.js new file mode 100644 index 00000000..54765aee --- /dev/null +++ b/node_modules/iconv-lite/encodings/utf16.js @@ -0,0 +1,177 @@ +"use strict"; +var Buffer = require("safer-buffer").Buffer; + +// Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js + +// == UTF16-BE codec. ========================================================== + +exports.utf16be = Utf16BECodec; +function Utf16BECodec() { +} + +Utf16BECodec.prototype.encoder = Utf16BEEncoder; +Utf16BECodec.prototype.decoder = Utf16BEDecoder; +Utf16BECodec.prototype.bomAware = true; + + +// -- Encoding + +function Utf16BEEncoder() { +} + +Utf16BEEncoder.prototype.write = function(str) { + var buf = Buffer.from(str, 'ucs2'); + for (var i = 0; i < buf.length; i += 2) { + var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp; + } + return buf; +} + +Utf16BEEncoder.prototype.end = function() { +} + + +// -- Decoding + +function Utf16BEDecoder() { + this.overflowByte = -1; +} + +Utf16BEDecoder.prototype.write = function(buf) { + if (buf.length == 0) + return ''; + + var buf2 = Buffer.alloc(buf.length + 1), + i = 0, j = 0; + + if (this.overflowByte !== -1) { + buf2[0] = buf[0]; + buf2[1] = this.overflowByte; + i = 1; j = 2; + } + + for (; i < buf.length-1; i += 2, j+= 2) { + buf2[j] = buf[i+1]; + buf2[j+1] = buf[i]; + } + + this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1; + + return buf2.slice(0, j).toString('ucs2'); +} + +Utf16BEDecoder.prototype.end = function() { +} + + +// == UTF-16 codec ============================================================= +// Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic. +// Defaults to UTF-16LE, as it's prevalent and default in Node. +// http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le +// Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'}); + +// Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false). + +exports.utf16 = Utf16Codec; +function Utf16Codec(codecOptions, iconv) { + this.iconv = iconv; +} + +Utf16Codec.prototype.encoder = Utf16Encoder; +Utf16Codec.prototype.decoder = Utf16Decoder; + + +// -- Encoding (pass-through) + +function Utf16Encoder(options, codec) { + options = options || {}; + if (options.addBOM === undefined) + options.addBOM = true; + this.encoder = codec.iconv.getEncoder('utf-16le', options); +} + +Utf16Encoder.prototype.write = function(str) { + return this.encoder.write(str); +} + +Utf16Encoder.prototype.end = function() { + return this.encoder.end(); +} + + +// -- Decoding + +function Utf16Decoder(options, codec) { + this.decoder = null; + this.initialBytes = []; + this.initialBytesLen = 0; + + this.options = options || {}; + this.iconv = codec.iconv; +} + +Utf16Decoder.prototype.write = function(buf) { + if (!this.decoder) { + // Codec is not chosen yet. Accumulate initial bytes. + this.initialBytes.push(buf); + this.initialBytesLen += buf.length; + + if (this.initialBytesLen < 16) // We need more bytes to use space heuristic (see below) + return ''; + + // We have enough bytes -> detect endianness. + var buf = Buffer.concat(this.initialBytes), + encoding = detectEncoding(buf, this.options.defaultEncoding); + this.decoder = this.iconv.getDecoder(encoding, this.options); + this.initialBytes.length = this.initialBytesLen = 0; + } + + return this.decoder.write(buf); +} + +Utf16Decoder.prototype.end = function() { + if (!this.decoder) { + var buf = Buffer.concat(this.initialBytes), + encoding = detectEncoding(buf, this.options.defaultEncoding); + this.decoder = this.iconv.getDecoder(encoding, this.options); + + var res = this.decoder.write(buf), + trail = this.decoder.end(); + + return trail ? (res + trail) : res; + } + return this.decoder.end(); +} + +function detectEncoding(buf, defaultEncoding) { + var enc = defaultEncoding || 'utf-16le'; + + if (buf.length >= 2) { + // Check BOM. + if (buf[0] == 0xFE && buf[1] == 0xFF) // UTF-16BE BOM + enc = 'utf-16be'; + else if (buf[0] == 0xFF && buf[1] == 0xFE) // UTF-16LE BOM + enc = 'utf-16le'; + else { + // No BOM found. Try to deduce encoding from initial content. + // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon. + // So, we count ASCII as if it was LE or BE, and decide from that. + var asciiCharsLE = 0, asciiCharsBE = 0, // Counts of chars in both positions + _len = Math.min(buf.length - (buf.length % 2), 64); // Len is always even. + + for (var i = 0; i < _len; i += 2) { + if (buf[i] === 0 && buf[i+1] !== 0) asciiCharsBE++; + if (buf[i] !== 0 && buf[i+1] === 0) asciiCharsLE++; + } + + if (asciiCharsBE > asciiCharsLE) + enc = 'utf-16be'; + else if (asciiCharsBE < asciiCharsLE) + enc = 'utf-16le'; + } + } + + return enc; +} + + diff --git a/node_modules/iconv-lite/encodings/utf7.js b/node_modules/iconv-lite/encodings/utf7.js new file mode 100644 index 00000000..b7631c23 --- /dev/null +++ b/node_modules/iconv-lite/encodings/utf7.js @@ -0,0 +1,290 @@ +"use strict"; +var Buffer = require("safer-buffer").Buffer; + +// UTF-7 codec, according to https://tools.ietf.org/html/rfc2152 +// See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3 + +exports.utf7 = Utf7Codec; +exports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7 +function Utf7Codec(codecOptions, iconv) { + this.iconv = iconv; +}; + +Utf7Codec.prototype.encoder = Utf7Encoder; +Utf7Codec.prototype.decoder = Utf7Decoder; +Utf7Codec.prototype.bomAware = true; + + +// -- Encoding + +var nonDirectChars = /[^A-Za-z0-9'\(\),-\.\/:\? \n\r\t]+/g; + +function Utf7Encoder(options, codec) { + this.iconv = codec.iconv; +} + +Utf7Encoder.prototype.write = function(str) { + // Naive implementation. + // Non-direct chars are encoded as "+-"; single "+" char is encoded as "+-". + return Buffer.from(str.replace(nonDirectChars, function(chunk) { + return "+" + (chunk === '+' ? '' : + this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, '')) + + "-"; + }.bind(this))); +} + +Utf7Encoder.prototype.end = function() { +} + + +// -- Decoding + +function Utf7Decoder(options, codec) { + this.iconv = codec.iconv; + this.inBase64 = false; + this.base64Accum = ''; +} + +var base64Regex = /[A-Za-z0-9\/+]/; +var base64Chars = []; +for (var i = 0; i < 256; i++) + base64Chars[i] = base64Regex.test(String.fromCharCode(i)); + +var plusChar = '+'.charCodeAt(0), + minusChar = '-'.charCodeAt(0), + andChar = '&'.charCodeAt(0); + +Utf7Decoder.prototype.write = function(buf) { + var res = "", lastI = 0, + inBase64 = this.inBase64, + base64Accum = this.base64Accum; + + // The decoder is more involved as we must handle chunks in stream. + + for (var i = 0; i < buf.length; i++) { + if (!inBase64) { // We're in direct mode. + // Write direct chars until '+' + if (buf[i] == plusChar) { + res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars. + lastI = i+1; + inBase64 = true; + } + } else { // We decode base64. + if (!base64Chars[buf[i]]) { // Base64 ended. + if (i == lastI && buf[i] == minusChar) {// "+-" -> "+" + res += "+"; + } else { + var b64str = base64Accum + buf.slice(lastI, i).toString(); + res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be"); + } + + if (buf[i] != minusChar) // Minus is absorbed after base64. + i--; + + lastI = i+1; + inBase64 = false; + base64Accum = ''; + } + } + } + + if (!inBase64) { + res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars. + } else { + var b64str = base64Accum + buf.slice(lastI).toString(); + + var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars. + base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future. + b64str = b64str.slice(0, canBeDecoded); + + res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be"); + } + + this.inBase64 = inBase64; + this.base64Accum = base64Accum; + + return res; +} + +Utf7Decoder.prototype.end = function() { + var res = ""; + if (this.inBase64 && this.base64Accum.length > 0) + res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be"); + + this.inBase64 = false; + this.base64Accum = ''; + return res; +} + + +// UTF-7-IMAP codec. +// RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3) +// Differences: +// * Base64 part is started by "&" instead of "+" +// * Direct characters are 0x20-0x7E, except "&" (0x26) +// * In Base64, "," is used instead of "/" +// * Base64 must not be used to represent direct characters. +// * No implicit shift back from Base64 (should always end with '-') +// * String must end in non-shifted position. +// * "-&" while in base64 is not allowed. + + +exports.utf7imap = Utf7IMAPCodec; +function Utf7IMAPCodec(codecOptions, iconv) { + this.iconv = iconv; +}; + +Utf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder; +Utf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder; +Utf7IMAPCodec.prototype.bomAware = true; + + +// -- Encoding + +function Utf7IMAPEncoder(options, codec) { + this.iconv = codec.iconv; + this.inBase64 = false; + this.base64Accum = Buffer.alloc(6); + this.base64AccumIdx = 0; +} + +Utf7IMAPEncoder.prototype.write = function(str) { + var inBase64 = this.inBase64, + base64Accum = this.base64Accum, + base64AccumIdx = this.base64AccumIdx, + buf = Buffer.alloc(str.length*5 + 10), bufIdx = 0; + + for (var i = 0; i < str.length; i++) { + var uChar = str.charCodeAt(i); + if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'. + if (inBase64) { + if (base64AccumIdx > 0) { + bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx); + base64AccumIdx = 0; + } + + buf[bufIdx++] = minusChar; // Write '-', then go to direct mode. + inBase64 = false; + } + + if (!inBase64) { + buf[bufIdx++] = uChar; // Write direct character + + if (uChar === andChar) // Ampersand -> '&-' + buf[bufIdx++] = minusChar; + } + + } else { // Non-direct character + if (!inBase64) { + buf[bufIdx++] = andChar; // Write '&', then go to base64 mode. + inBase64 = true; + } + if (inBase64) { + base64Accum[base64AccumIdx++] = uChar >> 8; + base64Accum[base64AccumIdx++] = uChar & 0xFF; + + if (base64AccumIdx == base64Accum.length) { + bufIdx += buf.write(base64Accum.toString('base64').replace(/\//g, ','), bufIdx); + base64AccumIdx = 0; + } + } + } + } + + this.inBase64 = inBase64; + this.base64AccumIdx = base64AccumIdx; + + return buf.slice(0, bufIdx); +} + +Utf7IMAPEncoder.prototype.end = function() { + var buf = Buffer.alloc(10), bufIdx = 0; + if (this.inBase64) { + if (this.base64AccumIdx > 0) { + bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx); + this.base64AccumIdx = 0; + } + + buf[bufIdx++] = minusChar; // Write '-', then go to direct mode. + this.inBase64 = false; + } + + return buf.slice(0, bufIdx); +} + + +// -- Decoding + +function Utf7IMAPDecoder(options, codec) { + this.iconv = codec.iconv; + this.inBase64 = false; + this.base64Accum = ''; +} + +var base64IMAPChars = base64Chars.slice(); +base64IMAPChars[','.charCodeAt(0)] = true; + +Utf7IMAPDecoder.prototype.write = function(buf) { + var res = "", lastI = 0, + inBase64 = this.inBase64, + base64Accum = this.base64Accum; + + // The decoder is more involved as we must handle chunks in stream. + // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end). + + for (var i = 0; i < buf.length; i++) { + if (!inBase64) { // We're in direct mode. + // Write direct chars until '&' + if (buf[i] == andChar) { + res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars. + lastI = i+1; + inBase64 = true; + } + } else { // We decode base64. + if (!base64IMAPChars[buf[i]]) { // Base64 ended. + if (i == lastI && buf[i] == minusChar) { // "&-" -> "&" + res += "&"; + } else { + var b64str = base64Accum + buf.slice(lastI, i).toString().replace(/,/g, '/'); + res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be"); + } + + if (buf[i] != minusChar) // Minus may be absorbed after base64. + i--; + + lastI = i+1; + inBase64 = false; + base64Accum = ''; + } + } + } + + if (!inBase64) { + res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars. + } else { + var b64str = base64Accum + buf.slice(lastI).toString().replace(/,/g, '/'); + + var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars. + base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future. + b64str = b64str.slice(0, canBeDecoded); + + res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be"); + } + + this.inBase64 = inBase64; + this.base64Accum = base64Accum; + + return res; +} + +Utf7IMAPDecoder.prototype.end = function() { + var res = ""; + if (this.inBase64 && this.base64Accum.length > 0) + res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be"); + + this.inBase64 = false; + this.base64Accum = ''; + return res; +} + + diff --git a/node_modules/iconv-lite/lib/bom-handling.js b/node_modules/iconv-lite/lib/bom-handling.js new file mode 100644 index 00000000..10508723 --- /dev/null +++ b/node_modules/iconv-lite/lib/bom-handling.js @@ -0,0 +1,52 @@ +"use strict"; + +var BOMChar = '\uFEFF'; + +exports.PrependBOM = PrependBOMWrapper +function PrependBOMWrapper(encoder, options) { + this.encoder = encoder; + this.addBOM = true; +} + +PrependBOMWrapper.prototype.write = function(str) { + if (this.addBOM) { + str = BOMChar + str; + this.addBOM = false; + } + + return this.encoder.write(str); +} + +PrependBOMWrapper.prototype.end = function() { + return this.encoder.end(); +} + + +//------------------------------------------------------------------------------ + +exports.StripBOM = StripBOMWrapper; +function StripBOMWrapper(decoder, options) { + this.decoder = decoder; + this.pass = false; + this.options = options || {}; +} + +StripBOMWrapper.prototype.write = function(buf) { + var res = this.decoder.write(buf); + if (this.pass || !res) + return res; + + if (res[0] === BOMChar) { + res = res.slice(1); + if (typeof this.options.stripBOM === 'function') + this.options.stripBOM(); + } + + this.pass = true; + return res; +} + +StripBOMWrapper.prototype.end = function() { + return this.decoder.end(); +} + diff --git a/node_modules/iconv-lite/lib/extend-node.js b/node_modules/iconv-lite/lib/extend-node.js new file mode 100644 index 00000000..87f5394a --- /dev/null +++ b/node_modules/iconv-lite/lib/extend-node.js @@ -0,0 +1,217 @@ +"use strict"; +var Buffer = require("buffer").Buffer; +// Note: not polyfilled with safer-buffer on a purpose, as overrides Buffer + +// == Extend Node primitives to use iconv-lite ================================= + +module.exports = function (iconv) { + var original = undefined; // Place to keep original methods. + + // Node authors rewrote Buffer internals to make it compatible with + // Uint8Array and we cannot patch key functions since then. + // Note: this does use older Buffer API on a purpose + iconv.supportsNodeEncodingsExtension = !(Buffer.from || new Buffer(0) instanceof Uint8Array); + + iconv.extendNodeEncodings = function extendNodeEncodings() { + if (original) return; + original = {}; + + if (!iconv.supportsNodeEncodingsExtension) { + console.error("ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node"); + console.error("See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility"); + return; + } + + var nodeNativeEncodings = { + 'hex': true, 'utf8': true, 'utf-8': true, 'ascii': true, 'binary': true, + 'base64': true, 'ucs2': true, 'ucs-2': true, 'utf16le': true, 'utf-16le': true, + }; + + Buffer.isNativeEncoding = function(enc) { + return enc && nodeNativeEncodings[enc.toLowerCase()]; + } + + // -- SlowBuffer ----------------------------------------------------------- + var SlowBuffer = require('buffer').SlowBuffer; + + original.SlowBufferToString = SlowBuffer.prototype.toString; + SlowBuffer.prototype.toString = function(encoding, start, end) { + encoding = String(encoding || 'utf8').toLowerCase(); + + // Use native conversion when possible + if (Buffer.isNativeEncoding(encoding)) + return original.SlowBufferToString.call(this, encoding, start, end); + + // Otherwise, use our decoding method. + if (typeof start == 'undefined') start = 0; + if (typeof end == 'undefined') end = this.length; + return iconv.decode(this.slice(start, end), encoding); + } + + original.SlowBufferWrite = SlowBuffer.prototype.write; + SlowBuffer.prototype.write = function(string, offset, length, encoding) { + // Support both (string, offset, length, encoding) + // and the legacy (string, encoding, offset, length) + if (isFinite(offset)) { + if (!isFinite(length)) { + encoding = length; + length = undefined; + } + } else { // legacy + var swap = encoding; + encoding = offset; + offset = length; + length = swap; + } + + offset = +offset || 0; + var remaining = this.length - offset; + if (!length) { + length = remaining; + } else { + length = +length; + if (length > remaining) { + length = remaining; + } + } + encoding = String(encoding || 'utf8').toLowerCase(); + + // Use native conversion when possible + if (Buffer.isNativeEncoding(encoding)) + return original.SlowBufferWrite.call(this, string, offset, length, encoding); + + if (string.length > 0 && (length < 0 || offset < 0)) + throw new RangeError('attempt to write beyond buffer bounds'); + + // Otherwise, use our encoding method. + var buf = iconv.encode(string, encoding); + if (buf.length < length) length = buf.length; + buf.copy(this, offset, 0, length); + return length; + } + + // -- Buffer --------------------------------------------------------------- + + original.BufferIsEncoding = Buffer.isEncoding; + Buffer.isEncoding = function(encoding) { + return Buffer.isNativeEncoding(encoding) || iconv.encodingExists(encoding); + } + + original.BufferByteLength = Buffer.byteLength; + Buffer.byteLength = SlowBuffer.byteLength = function(str, encoding) { + encoding = String(encoding || 'utf8').toLowerCase(); + + // Use native conversion when possible + if (Buffer.isNativeEncoding(encoding)) + return original.BufferByteLength.call(this, str, encoding); + + // Slow, I know, but we don't have a better way yet. + return iconv.encode(str, encoding).length; + } + + original.BufferToString = Buffer.prototype.toString; + Buffer.prototype.toString = function(encoding, start, end) { + encoding = String(encoding || 'utf8').toLowerCase(); + + // Use native conversion when possible + if (Buffer.isNativeEncoding(encoding)) + return original.BufferToString.call(this, encoding, start, end); + + // Otherwise, use our decoding method. + if (typeof start == 'undefined') start = 0; + if (typeof end == 'undefined') end = this.length; + return iconv.decode(this.slice(start, end), encoding); + } + + original.BufferWrite = Buffer.prototype.write; + Buffer.prototype.write = function(string, offset, length, encoding) { + var _offset = offset, _length = length, _encoding = encoding; + // Support both (string, offset, length, encoding) + // and the legacy (string, encoding, offset, length) + if (isFinite(offset)) { + if (!isFinite(length)) { + encoding = length; + length = undefined; + } + } else { // legacy + var swap = encoding; + encoding = offset; + offset = length; + length = swap; + } + + encoding = String(encoding || 'utf8').toLowerCase(); + + // Use native conversion when possible + if (Buffer.isNativeEncoding(encoding)) + return original.BufferWrite.call(this, string, _offset, _length, _encoding); + + offset = +offset || 0; + var remaining = this.length - offset; + if (!length) { + length = remaining; + } else { + length = +length; + if (length > remaining) { + length = remaining; + } + } + + if (string.length > 0 && (length < 0 || offset < 0)) + throw new RangeError('attempt to write beyond buffer bounds'); + + // Otherwise, use our encoding method. + var buf = iconv.encode(string, encoding); + if (buf.length < length) length = buf.length; + buf.copy(this, offset, 0, length); + return length; + + // TODO: Set _charsWritten. + } + + + // -- Readable ------------------------------------------------------------- + if (iconv.supportsStreams) { + var Readable = require('stream').Readable; + + original.ReadableSetEncoding = Readable.prototype.setEncoding; + Readable.prototype.setEncoding = function setEncoding(enc, options) { + // Use our own decoder, it has the same interface. + // We cannot use original function as it doesn't handle BOM-s. + this._readableState.decoder = iconv.getDecoder(enc, options); + this._readableState.encoding = enc; + } + + Readable.prototype.collect = iconv._collect; + } + } + + // Remove iconv-lite Node primitive extensions. + iconv.undoExtendNodeEncodings = function undoExtendNodeEncodings() { + if (!iconv.supportsNodeEncodingsExtension) + return; + if (!original) + throw new Error("require('iconv-lite').undoExtendNodeEncodings(): Nothing to undo; extendNodeEncodings() is not called.") + + delete Buffer.isNativeEncoding; + + var SlowBuffer = require('buffer').SlowBuffer; + + SlowBuffer.prototype.toString = original.SlowBufferToString; + SlowBuffer.prototype.write = original.SlowBufferWrite; + + Buffer.isEncoding = original.BufferIsEncoding; + Buffer.byteLength = original.BufferByteLength; + Buffer.prototype.toString = original.BufferToString; + Buffer.prototype.write = original.BufferWrite; + + if (iconv.supportsStreams) { + var Readable = require('stream').Readable; + + Readable.prototype.setEncoding = original.ReadableSetEncoding; + delete Readable.prototype.collect; + } + + original = undefined; + } +} diff --git a/node_modules/iconv-lite/lib/index.d.ts b/node_modules/iconv-lite/lib/index.d.ts new file mode 100644 index 00000000..0547eb34 --- /dev/null +++ b/node_modules/iconv-lite/lib/index.d.ts @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + * REQUIREMENT: This definition is dependent on the @types/node definition. + * Install with `npm install @types/node --save-dev` + *--------------------------------------------------------------------------------------------*/ + +declare module 'iconv-lite' { + export function decode(buffer: Buffer, encoding: string, options?: Options): string; + + export function encode(content: string, encoding: string, options?: Options): Buffer; + + export function encodingExists(encoding: string): boolean; + + export function decodeStream(encoding: string, options?: Options): NodeJS.ReadWriteStream; + + export function encodeStream(encoding: string, options?: Options): NodeJS.ReadWriteStream; +} + +export interface Options { + stripBOM?: boolean; + addBOM?: boolean; + defaultEncoding?: string; +} diff --git a/node_modules/iconv-lite/lib/index.js b/node_modules/iconv-lite/lib/index.js new file mode 100644 index 00000000..5391919c --- /dev/null +++ b/node_modules/iconv-lite/lib/index.js @@ -0,0 +1,153 @@ +"use strict"; + +// Some environments don't have global Buffer (e.g. React Native). +// Solution would be installing npm modules "buffer" and "stream" explicitly. +var Buffer = require("safer-buffer").Buffer; + +var bomHandling = require("./bom-handling"), + iconv = module.exports; + +// All codecs and aliases are kept here, keyed by encoding name/alias. +// They are lazy loaded in `iconv.getCodec` from `encodings/index.js`. +iconv.encodings = null; + +// Characters emitted in case of error. +iconv.defaultCharUnicode = '�'; +iconv.defaultCharSingleByte = '?'; + +// Public API. +iconv.encode = function encode(str, encoding, options) { + str = "" + (str || ""); // Ensure string. + + var encoder = iconv.getEncoder(encoding, options); + + var res = encoder.write(str); + var trail = encoder.end(); + + return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res; +} + +iconv.decode = function decode(buf, encoding, options) { + if (typeof buf === 'string') { + if (!iconv.skipDecodeWarning) { + console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding'); + iconv.skipDecodeWarning = true; + } + + buf = Buffer.from("" + (buf || ""), "binary"); // Ensure buffer. + } + + var decoder = iconv.getDecoder(encoding, options); + + var res = decoder.write(buf); + var trail = decoder.end(); + + return trail ? (res + trail) : res; +} + +iconv.encodingExists = function encodingExists(enc) { + try { + iconv.getCodec(enc); + return true; + } catch (e) { + return false; + } +} + +// Legacy aliases to convert functions +iconv.toEncoding = iconv.encode; +iconv.fromEncoding = iconv.decode; + +// Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache. +iconv._codecDataCache = {}; +iconv.getCodec = function getCodec(encoding) { + if (!iconv.encodings) + iconv.encodings = require("../encodings"); // Lazy load all encoding definitions. + + // Canonicalize encoding name: strip all non-alphanumeric chars and appended year. + var enc = iconv._canonicalizeEncoding(encoding); + + // Traverse iconv.encodings to find actual codec. + var codecOptions = {}; + while (true) { + var codec = iconv._codecDataCache[enc]; + if (codec) + return codec; + + var codecDef = iconv.encodings[enc]; + + switch (typeof codecDef) { + case "string": // Direct alias to other encoding. + enc = codecDef; + break; + + case "object": // Alias with options. Can be layered. + for (var key in codecDef) + codecOptions[key] = codecDef[key]; + + if (!codecOptions.encodingName) + codecOptions.encodingName = enc; + + enc = codecDef.type; + break; + + case "function": // Codec itself. + if (!codecOptions.encodingName) + codecOptions.encodingName = enc; + + // The codec function must load all tables and return object with .encoder and .decoder methods. + // It'll be called only once (for each different options object). + codec = new codecDef(codecOptions, iconv); + + iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later. + return codec; + + default: + throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')"); + } + } +} + +iconv._canonicalizeEncoding = function(encoding) { + // Canonicalize encoding name: strip all non-alphanumeric chars and appended year. + return (''+encoding).toLowerCase().replace(/:\d{4}$|[^0-9a-z]/g, ""); +} + +iconv.getEncoder = function getEncoder(encoding, options) { + var codec = iconv.getCodec(encoding), + encoder = new codec.encoder(options, codec); + + if (codec.bomAware && options && options.addBOM) + encoder = new bomHandling.PrependBOM(encoder, options); + + return encoder; +} + +iconv.getDecoder = function getDecoder(encoding, options) { + var codec = iconv.getCodec(encoding), + decoder = new codec.decoder(options, codec); + + if (codec.bomAware && !(options && options.stripBOM === false)) + decoder = new bomHandling.StripBOM(decoder, options); + + return decoder; +} + + +// Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json. +var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node; +if (nodeVer) { + + // Load streaming support in Node v0.10+ + var nodeVerArr = nodeVer.split(".").map(Number); + if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) { + require("./streams")(iconv); + } + + // Load Node primitive extensions. + require("./extend-node")(iconv); +} + +if ("Ä€" != "\u0100") { + console.error("iconv-lite warning: javascript files use encoding different from utf-8. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info."); +} diff --git a/node_modules/iconv-lite/lib/streams.js b/node_modules/iconv-lite/lib/streams.js new file mode 100644 index 00000000..44095529 --- /dev/null +++ b/node_modules/iconv-lite/lib/streams.js @@ -0,0 +1,121 @@ +"use strict"; + +var Buffer = require("buffer").Buffer, + Transform = require("stream").Transform; + + +// == Exports ================================================================== +module.exports = function(iconv) { + + // Additional Public API. + iconv.encodeStream = function encodeStream(encoding, options) { + return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options); + } + + iconv.decodeStream = function decodeStream(encoding, options) { + return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options); + } + + iconv.supportsStreams = true; + + + // Not published yet. + iconv.IconvLiteEncoderStream = IconvLiteEncoderStream; + iconv.IconvLiteDecoderStream = IconvLiteDecoderStream; + iconv._collect = IconvLiteDecoderStream.prototype.collect; +}; + + +// == Encoder stream ======================================================= +function IconvLiteEncoderStream(conv, options) { + this.conv = conv; + options = options || {}; + options.decodeStrings = false; // We accept only strings, so we don't need to decode them. + Transform.call(this, options); +} + +IconvLiteEncoderStream.prototype = Object.create(Transform.prototype, { + constructor: { value: IconvLiteEncoderStream } +}); + +IconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) { + if (typeof chunk != 'string') + return done(new Error("Iconv encoding stream needs strings as its input.")); + try { + var res = this.conv.write(chunk); + if (res && res.length) this.push(res); + done(); + } + catch (e) { + done(e); + } +} + +IconvLiteEncoderStream.prototype._flush = function(done) { + try { + var res = this.conv.end(); + if (res && res.length) this.push(res); + done(); + } + catch (e) { + done(e); + } +} + +IconvLiteEncoderStream.prototype.collect = function(cb) { + var chunks = []; + this.on('error', cb); + this.on('data', function(chunk) { chunks.push(chunk); }); + this.on('end', function() { + cb(null, Buffer.concat(chunks)); + }); + return this; +} + + +// == Decoder stream ======================================================= +function IconvLiteDecoderStream(conv, options) { + this.conv = conv; + options = options || {}; + options.encoding = this.encoding = 'utf8'; // We output strings. + Transform.call(this, options); +} + +IconvLiteDecoderStream.prototype = Object.create(Transform.prototype, { + constructor: { value: IconvLiteDecoderStream } +}); + +IconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) { + if (!Buffer.isBuffer(chunk)) + return done(new Error("Iconv decoding stream needs buffers as its input.")); + try { + var res = this.conv.write(chunk); + if (res && res.length) this.push(res, this.encoding); + done(); + } + catch (e) { + done(e); + } +} + +IconvLiteDecoderStream.prototype._flush = function(done) { + try { + var res = this.conv.end(); + if (res && res.length) this.push(res, this.encoding); + done(); + } + catch (e) { + done(e); + } +} + +IconvLiteDecoderStream.prototype.collect = function(cb) { + var res = ''; + this.on('error', cb); + this.on('data', function(chunk) { res += chunk; }); + this.on('end', function() { + cb(null, res); + }); + return this; +} + diff --git a/node_modules/iconv-lite/package.json b/node_modules/iconv-lite/package.json new file mode 100644 index 00000000..e5223487 --- /dev/null +++ b/node_modules/iconv-lite/package.json @@ -0,0 +1,77 @@ +{ + "_from": "iconv-lite@0.4.24", + "_id": "iconv-lite@0.4.24", + "_inBundle": false, + "_integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "_location": "/iconv-lite", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "iconv-lite@0.4.24", + "name": "iconv-lite", + "escapedName": "iconv-lite", + "rawSpec": "0.4.24", + "saveSpec": null, + "fetchSpec": "0.4.24" + }, + "_requiredBy": [ + "/express/body-parser", + "/raw-body" + ], + "_resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "_shasum": "2022b4b25fbddc21d2f524974a474aafe733908b", + "_spec": "iconv-lite@0.4.24", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express\\node_modules\\body-parser", + "author": { + "name": "Alexander Shtuchkin", + "email": "ashtuchkin@gmail.com" + }, + "browser": { + "./lib/extend-node": false, + "./lib/streams": false + }, + "bugs": { + "url": "https://github.com/ashtuchkin/iconv-lite/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "deprecated": false, + "description": "Convert character encodings in pure javascript.", + "devDependencies": { + "async": "*", + "errto": "*", + "iconv": "*", + "istanbul": "*", + "mocha": "^3.1.0", + "request": "~2.87.0", + "semver": "*", + "unorm": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "homepage": "https://github.com/ashtuchkin/iconv-lite", + "keywords": [ + "iconv", + "convert", + "charset", + "icu" + ], + "license": "MIT", + "main": "./lib/index.js", + "name": "iconv-lite", + "repository": { + "type": "git", + "url": "git://github.com/ashtuchkin/iconv-lite.git" + }, + "scripts": { + "coverage": "istanbul cover _mocha -- --grep .", + "coverage-open": "open coverage/lcov-report/index.html", + "test": "mocha --reporter spec --grep ." + }, + "typings": "./lib/index.d.ts", + "version": "0.4.24" +} diff --git a/node_modules/inherits/LICENSE b/node_modules/inherits/LICENSE new file mode 100644 index 00000000..dea3013d --- /dev/null +++ b/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/node_modules/inherits/README.md b/node_modules/inherits/README.md new file mode 100644 index 00000000..b1c56658 --- /dev/null +++ b/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/inherits/inherits.js b/node_modules/inherits/inherits.js new file mode 100644 index 00000000..3b94763a --- /dev/null +++ b/node_modules/inherits/inherits.js @@ -0,0 +1,7 @@ +try { + var util = require('util'); + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + module.exports = require('./inherits_browser.js'); +} diff --git a/node_modules/inherits/inherits_browser.js b/node_modules/inherits/inherits_browser.js new file mode 100644 index 00000000..c1e78a75 --- /dev/null +++ b/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/node_modules/inherits/package.json b/node_modules/inherits/package.json new file mode 100644 index 00000000..2db76c81 --- /dev/null +++ b/node_modules/inherits/package.json @@ -0,0 +1,61 @@ +{ + "_from": "inherits@2.0.3", + "_id": "inherits@2.0.3", + "_inBundle": false, + "_integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "_location": "/inherits", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "inherits@2.0.3", + "name": "inherits", + "escapedName": "inherits", + "rawSpec": "2.0.3", + "saveSpec": null, + "fetchSpec": "2.0.3" + }, + "_requiredBy": [ + "/http-errors" + ], + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "_shasum": "633c2c83e3da42a502f52466022480f4208261de", + "_spec": "inherits@2.0.3", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\http-errors", + "browser": "./inherits_browser.js", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "devDependencies": { + "tap": "^7.1.0" + }, + "files": [ + "inherits.js", + "inherits_browser.js" + ], + "homepage": "https://github.com/isaacs/inherits#readme", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "license": "ISC", + "main": "./inherits.js", + "name": "inherits", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits.git" + }, + "scripts": { + "test": "node test" + }, + "version": "2.0.3" +} diff --git a/node_modules/internmap/LICENSE b/node_modules/internmap/LICENSE new file mode 100644 index 00000000..6fca7113 --- /dev/null +++ b/node_modules/internmap/LICENSE @@ -0,0 +1,13 @@ +Copyright 2021 Mike Bostock + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/node_modules/internmap/README.md b/node_modules/internmap/README.md new file mode 100644 index 00000000..13993dfe --- /dev/null +++ b/node_modules/internmap/README.md @@ -0,0 +1,94 @@ +# InternMap + +*For live examples, see https://observablehq.com/@mbostock/internmap.* + +If you use dates as keys in a JavaScript Map (or as values in a Set), you may be surprised that it won’t work as you expect. + +```js +dateMap = new Map([ + [new Date(Date.UTC(2001, 0, 1)), "red"], + [new Date(Date.UTC(2001, 0, 1)), "green"] // distinct key! +]) +``` +```js +dateMap.get(new Date(Date.UTC(2001, 0, 1))) // undefined! +``` + +That’s because Map uses the [SameValueZero algorithm](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness) to determine key equality: for two dates to be considered the same, they must be the same instance (the same object), not just the same moment in time. This is true of the equality operator, too. + +```js +{ + const date1 = new Date(Date.UTC(2001, 0, 1)); + const date2 = new Date(Date.UTC(2001, 0, 1)); + return date1 === date2; // false! +} +``` + +You can avoid this issue by using primitive values such as numbers or strings as keys instead. But it’s tedious and easy to forget to coerce types. (You’ll also need to do the inverse type conversion when pulling keys out of the map, say when using *map*.keys or *map*.entries, or when iterating over the map. The inverse above is new Date(*key*). Also, if you forget to coerce your key to a number when using *map*.get, it’s easy not to notice because the map won’t throw an error; it’ll simply return undefined.) + +```js +numberMap = new Map([[978307200000, "red"]]) +numberMap.get(978307200000) // "red" +numberMap.get(new Date(978307200000)) // undefined; oops! +``` + +Wouldn’t it be easier if Map and Set “just worked†with dates? Or with any object that supports [*object*.valueOf](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf)? + +Enter **InternMap**. [*Interning*](https://en.wikipedia.org/wiki/String_interning) refers to storing only one copy of each distinct key. An InternMap considers two Date instances representing the same moment to be equal, storing only the first instance. + +```js +map = new InternMap([ + [new Date(Date.UTC(2001, 0, 1)), "red"], + [new Date(Date.UTC(2001, 0, 1)), "green"] // replaces previous entry +]) +``` +```js +map.get(new Date(Date.UTC(2001, 0, 1))) // "green" +``` +```js +[...map.keys()] // [2001-01-01] +``` + +InternMap extends Map, so you can simply drop it in whenever you’d prefer this behavior to the SameValueZero algorithm. Because InternMap calls *object*.valueOf only for non-primitive keys, note that you can pass primitive keys, too. + +```js +map.get(978307200000) // "green"; this works too! +``` + +InternMap keeps only the first distinct key according to its associated primitive value. Avoid adding keys to the map with inconsistent types. + +```js +map2 = new InternMap([ + [978307200000, "red"], // danger! + [new Date(Date.UTC(2001, 0, 1)), "blue"] +]) +``` +```js +map2.get(new Date(Date.UTC(2001, 0, 1))) // "blue"; this still works… +``` +```js +[...map2.keys()] // [978307200000]; but the key isn’t a Date +``` + +While InternMap uses *object*.valueOf by default to compute the intern key, you can pass a key function as a second argument to the constructor to change the behavior. For example, if you use JSON.stringify, you can use arrays as compound keys (assuming that the array elements can be serialized to JSON). + +```js +map3 = new InternMap([ + [["foo", "bar"], 1], + [["foo", "baz"], 2], + [["goo", "bee"], 3] +], JSON.stringify) +``` +```js +map3.get(["foo", "baz"]) // 2 +``` + +There’s an **InternSet** class, too. + +```js +set = new InternSet([ + new Date(Date.UTC(2000, 0, 1)), + new Date(Date.UTC(2001, 0, 1)), + new Date(Date.UTC(2001, 0, 1)) +]) +``` diff --git a/node_modules/internmap/dist/internmap.js b/node_modules/internmap/dist/internmap.js new file mode 100644 index 00000000..3608fa61 --- /dev/null +++ b/node_modules/internmap/dist/internmap.js @@ -0,0 +1,75 @@ +// https://github.com/mbostock/internmap/ v1.0.1 Copyright 2021 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.internmap = {})); +}(this, (function (exports) { 'use strict'; + +class InternMap extends Map { + constructor(entries, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (entries != null) for (const [key, value] of entries) this.set(key, value); + } + get(key) { + return super.get(intern_get(this, key)); + } + has(key) { + return super.has(intern_get(this, key)); + } + set(key, value) { + return super.set(intern_set(this, key), value); + } + delete(key) { + return super.delete(intern_delete(this, key)); + } +} + +class InternSet extends Set { + constructor(values, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (values != null) for (const value of values) this.add(value); + } + has(value) { + return super.has(intern_get(this, value)); + } + add(value) { + return super.add(intern_set(this, value)); + } + delete(value) { + return super.delete(intern_delete(this, value)); + } +} + +function intern_get({_intern, _key}, value) { + const key = _key(value); + return _intern.has(key) ? _intern.get(key) : value; +} + +function intern_set({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) return _intern.get(key); + _intern.set(key, value); + return value; +} + +function intern_delete({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) { + value = _intern.get(value); + _intern.delete(key); + } + return value; +} + +function keyof(value) { + return value !== null && typeof value === "object" ? value.valueOf() : value; +} + +exports.InternMap = InternMap; +exports.InternSet = InternSet; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/node_modules/internmap/dist/internmap.min.js b/node_modules/internmap/dist/internmap.min.js new file mode 100644 index 00000000..bb745e67 --- /dev/null +++ b/node_modules/internmap/dist/internmap.min.js @@ -0,0 +1,2 @@ +// https://github.com/mbostock/internmap/ v1.0.1 Copyright 2021 Mike Bostock +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).internmap={})}(this,(function(e){"use strict";class t extends Map{constructor(e,t=i){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:t}}),null!=e)for(const[t,n]of e)this.set(t,n)}get(e){return super.get(s(this,e))}has(e){return super.has(s(this,e))}set(e,t){return super.set(r(this,e),t)}delete(e){return super.delete(u(this,e))}}class n extends Set{constructor(e,t=i){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:t}}),null!=e)for(const t of e)this.add(t)}has(e){return super.has(s(this,e))}add(e){return super.add(r(this,e))}delete(e){return super.delete(u(this,e))}}function s({_intern:e,_key:t},n){const s=t(n);return e.has(s)?e.get(s):n}function r({_intern:e,_key:t},n){const s=t(n);return e.has(s)?e.get(s):(e.set(s,n),n)}function u({_intern:e,_key:t},n){const s=t(n);return e.has(s)&&(n=e.get(n),e.delete(s)),n}function i(e){return null!==e&&"object"==typeof e?e.valueOf():e}e.InternMap=t,e.InternSet=n,Object.defineProperty(e,"__esModule",{value:!0})})); diff --git a/node_modules/internmap/package.json b/node_modules/internmap/package.json new file mode 100644 index 00000000..1a2fb0dd --- /dev/null +++ b/node_modules/internmap/package.json @@ -0,0 +1,64 @@ +{ + "_from": "internmap@^1.0.0", + "_id": "internmap@1.0.1", + "_inBundle": false, + "_integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "_location": "/internmap", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "internmap@^1.0.0", + "name": "internmap", + "escapedName": "internmap", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/d3-array" + ], + "_resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "_shasum": "0017cc8a3b99605f0302f2b198d272e015e5df95", + "_spec": "internmap@^1.0.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3-array", + "author": { + "name": "Mike Bostock", + "url": "https://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/mbostock/internmap/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Map and Set with automatic key interning", + "devDependencies": { + "eslint": "^7.18.0", + "rollup": "^2.37.1", + "rollup-plugin-terser": "^7.0.2", + "tape": "^4.13.3", + "tape-await": "^0.1.2" + }, + "files": [ + "dist/**/*.js", + "src/**/*.js" + ], + "homepage": "https://github.com/mbostock/internmap/", + "license": "ISC", + "main": "dist/internmap.js", + "module": "src/index.js", + "name": "internmap", + "repository": { + "type": "git", + "url": "git+https://github.com/mbostock/internmap.git" + }, + "scripts": { + "postpublish": "git push && git push --tags", + "prepublishOnly": "rm -rf dist && yarn test", + "pretest": "rollup -c", + "test": "tape test/**/*-test.js && eslint src test" + }, + "sideEffects": false, + "unpkg": "dist/internmap.min.js", + "version": "1.0.1" +} diff --git a/node_modules/internmap/src/index.js b/node_modules/internmap/src/index.js new file mode 100644 index 00000000..0dac0d85 --- /dev/null +++ b/node_modules/internmap/src/index.js @@ -0,0 +1,61 @@ +export class InternMap extends Map { + constructor(entries, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (entries != null) for (const [key, value] of entries) this.set(key, value); + } + get(key) { + return super.get(intern_get(this, key)); + } + has(key) { + return super.has(intern_get(this, key)); + } + set(key, value) { + return super.set(intern_set(this, key), value); + } + delete(key) { + return super.delete(intern_delete(this, key)); + } +} + +export class InternSet extends Set { + constructor(values, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (values != null) for (const value of values) this.add(value); + } + has(value) { + return super.has(intern_get(this, value)); + } + add(value) { + return super.add(intern_set(this, value)); + } + delete(value) { + return super.delete(intern_delete(this, value)); + } +} + +function intern_get({_intern, _key}, value) { + const key = _key(value); + return _intern.has(key) ? _intern.get(key) : value; +} + +function intern_set({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) return _intern.get(key); + _intern.set(key, value); + return value; +} + +function intern_delete({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) { + value = _intern.get(value); + _intern.delete(key); + } + return value; +} + +function keyof(value) { + return value !== null && typeof value === "object" ? value.valueOf() : value; +} diff --git a/node_modules/ipaddr.js/LICENSE b/node_modules/ipaddr.js/LICENSE new file mode 100644 index 00000000..f6b37b52 --- /dev/null +++ b/node_modules/ipaddr.js/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2011-2017 whitequark + +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/node_modules/ipaddr.js/README.md b/node_modules/ipaddr.js/README.md new file mode 100644 index 00000000..f57725b0 --- /dev/null +++ b/node_modules/ipaddr.js/README.md @@ -0,0 +1,233 @@ +# ipaddr.js — an IPv6 and IPv4 address manipulation library [![Build Status](https://travis-ci.org/whitequark/ipaddr.js.svg)](https://travis-ci.org/whitequark/ipaddr.js) + +ipaddr.js is a small (1.9K minified and gzipped) library for manipulating +IP addresses in JavaScript environments. It runs on both CommonJS runtimes +(e.g. [nodejs]) and in a web browser. + +ipaddr.js allows you to verify and parse string representation of an IP +address, match it against a CIDR range or range list, determine if it falls +into some reserved ranges (examples include loopback and private ranges), +and convert between IPv4 and IPv4-mapped IPv6 addresses. + +[nodejs]: http://nodejs.org + +## Installation + +`npm install ipaddr.js` + +or + +`bower install ipaddr.js` + +## API + +ipaddr.js defines one object in the global scope: `ipaddr`. In CommonJS, +it is exported from the module: + +```js +var ipaddr = require('ipaddr.js'); +``` + +The API consists of several global methods and two classes: ipaddr.IPv6 and ipaddr.IPv4. + +### Global methods + +There are three global methods defined: `ipaddr.isValid`, `ipaddr.parse` and +`ipaddr.process`. All of them receive a string as a single parameter. + +The `ipaddr.isValid` method returns `true` if the address is a valid IPv4 or +IPv6 address, and `false` otherwise. It does not throw any exceptions. + +The `ipaddr.parse` method returns an object representing the IP address, +or throws an `Error` if the passed string is not a valid representation of an +IP address. + +The `ipaddr.process` method works just like the `ipaddr.parse` one, but it +automatically converts IPv4-mapped IPv6 addresses to their IPv4 counterparts +before returning. It is useful when you have a Node.js instance listening +on an IPv6 socket, and the `net.ivp6.bindv6only` sysctl parameter (or its +equivalent on non-Linux OS) is set to 0. In this case, you can accept IPv4 +connections on your IPv6-only socket, but the remote address will be mangled. +Use `ipaddr.process` method to automatically demangle it. + +### Object representation + +Parsing methods return an object which descends from `ipaddr.IPv6` or +`ipaddr.IPv4`. These objects share some properties, but most of them differ. + +#### Shared properties + +One can determine the type of address by calling `addr.kind()`. It will return +either `"ipv6"` or `"ipv4"`. + +An address can be converted back to its string representation with `addr.toString()`. +Note that this method: + * does not return the original string used to create the object (in fact, there is + no way of getting that string) + * returns a compact representation (when it is applicable) + +A `match(range, bits)` method can be used to check if the address falls into a +certain CIDR range. +Note that an address can be (obviously) matched only against an address of the same type. + +For example: + +```js +var addr = ipaddr.parse("2001:db8:1234::1"); +var range = ipaddr.parse("2001:db8::"); + +addr.match(range, 32); // => true +``` + +Alternatively, `match` can also be called as `match([range, bits])`. In this way, +it can be used together with the `parseCIDR(string)` method, which parses an IP +address together with a CIDR range. + +For example: + +```js +var addr = ipaddr.parse("2001:db8:1234::1"); + +addr.match(ipaddr.parseCIDR("2001:db8::/32")); // => true +``` + +A `range()` method returns one of predefined names for several special ranges defined +by IP protocols. The exact names (and their respective CIDR ranges) can be looked up +in the source: [IPv6 ranges] and [IPv4 ranges]. Some common ones include `"unicast"` +(the default one) and `"reserved"`. + +You can match against your own range list by using +`ipaddr.subnetMatch(address, rangeList, defaultName)` method. It can work with a mix of IPv6 or IPv4 addresses, and accepts a name-to-subnet map as the range list. For example: + +```js +var rangeList = { + documentationOnly: [ ipaddr.parse('2001:db8::'), 32 ], + tunnelProviders: [ + [ ipaddr.parse('2001:470::'), 32 ], // he.net + [ ipaddr.parse('2001:5c0::'), 32 ] // freenet6 + ] +}; +ipaddr.subnetMatch(ipaddr.parse('2001:470:8:66::1'), rangeList, 'unknown'); // => "tunnelProviders" +``` + +The addresses can be converted to their byte representation with `toByteArray()`. +(Actually, JavaScript mostly does not know about byte buffers. They are emulated with +arrays of numbers, each in range of 0..255.) + +```js +var bytes = ipaddr.parse('2a00:1450:8007::68').toByteArray(); // ipv6.google.com +bytes // => [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, , 0x00, 0x68 ] +``` + +The `ipaddr.IPv4` and `ipaddr.IPv6` objects have some methods defined, too. All of them +have the same interface for both protocols, and are similar to global methods. + +`ipaddr.IPvX.isValid(string)` can be used to check if the string is a valid address +for particular protocol, and `ipaddr.IPvX.parse(string)` is the error-throwing parser. + +`ipaddr.IPvX.isValid(string)` uses the same format for parsing as the POSIX `inet_ntoa` function, which accepts unusual formats like `0xc0.168.1.1` or `0x10000000`. The function `ipaddr.IPv4.isValidFourPartDecimal(string)` validates the IPv4 address and also ensures that it is written in four-part decimal format. + +[IPv6 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L186 +[IPv4 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L71 + +#### IPv6 properties + +Sometimes you will want to convert IPv6 not to a compact string representation (with +the `::` substitution); the `toNormalizedString()` method will return an address where +all zeroes are explicit. + +For example: + +```js +var addr = ipaddr.parse("2001:0db8::0001"); +addr.toString(); // => "2001:db8::1" +addr.toNormalizedString(); // => "2001:db8:0:0:0:0:0:1" +``` + +The `isIPv4MappedAddress()` method will return `true` if this address is an IPv4-mapped +one, and `toIPv4Address()` will return an IPv4 object address. + +To access the underlying binary representation of the address, use `addr.parts`. + +```js +var addr = ipaddr.parse("2001:db8:10::1234:DEAD"); +addr.parts // => [0x2001, 0xdb8, 0x10, 0, 0, 0, 0x1234, 0xdead] +``` + +A IPv6 zone index can be accessed via `addr.zoneId`: + +```js +var addr = ipaddr.parse("2001:db8::%eth0"); +addr.zoneId // => 'eth0' +``` + +#### IPv4 properties + +`toIPv4MappedAddress()` will return a corresponding IPv4-mapped IPv6 address. + +To access the underlying representation of the address, use `addr.octets`. + +```js +var addr = ipaddr.parse("192.168.1.1"); +addr.octets // => [192, 168, 1, 1] +``` + +`prefixLengthFromSubnetMask()` will return a CIDR prefix length for a valid IPv4 netmask or +null if the netmask is not valid. + +```js +ipaddr.IPv4.parse('255.255.255.240').prefixLengthFromSubnetMask() == 28 +ipaddr.IPv4.parse('255.192.164.0').prefixLengthFromSubnetMask() == null +``` + +`subnetMaskFromPrefixLength()` will return an IPv4 netmask for a valid CIDR prefix length. + +```js +ipaddr.IPv4.subnetMaskFromPrefixLength(24) == "255.255.255.0" +ipaddr.IPv4.subnetMaskFromPrefixLength(29) == "255.255.255.248" +``` + +`broadcastAddressFromCIDR()` will return the broadcast address for a given IPv4 interface and netmask in CIDR notation. +```js +ipaddr.IPv4.broadcastAddressFromCIDR("172.0.0.1/24") == "172.0.0.255" +``` +`networkAddressFromCIDR()` will return the network address for a given IPv4 interface and netmask in CIDR notation. +```js +ipaddr.IPv4.networkAddressFromCIDR("172.0.0.1/24") == "172.0.0.0" +``` + +#### Conversion + +IPv4 and IPv6 can be converted bidirectionally to and from network byte order (MSB) byte arrays. + +The `fromByteArray()` method will take an array and create an appropriate IPv4 or IPv6 object +if the input satisfies the requirements. For IPv4 it has to be an array of four 8-bit values, +while for IPv6 it has to be an array of sixteen 8-bit values. + +For example: +```js +var addr = ipaddr.fromByteArray([0x7f, 0, 0, 1]); +addr.toString(); // => "127.0.0.1" +``` + +or + +```js +var addr = ipaddr.fromByteArray([0x20, 1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]) +addr.toString(); // => "2001:db8::1" +``` + +Both objects also offer a `toByteArray()` method, which returns an array in network byte order (MSB). + +For example: +```js +var addr = ipaddr.parse("127.0.0.1"); +addr.toByteArray(); // => [0x7f, 0, 0, 1] +``` + +or + +```js +var addr = ipaddr.parse("2001:db8::1"); +addr.toByteArray(); // => [0x20, 1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] +``` diff --git a/node_modules/ipaddr.js/ipaddr.min.js b/node_modules/ipaddr.js/ipaddr.min.js new file mode 100644 index 00000000..b54a7cc4 --- /dev/null +++ b/node_modules/ipaddr.js/ipaddr.min.js @@ -0,0 +1 @@ +(function(){var r,t,n,e,i,o,a,s;t={},s=this,"undefined"!=typeof module&&null!==module&&module.exports?module.exports=t:s.ipaddr=t,a=function(r,t,n,e){var i,o;if(r.length!==t.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;e>0;){if((o=n-e)<0&&(o=0),r[i]>>o!=t[i]>>o)return!1;e-=n,i+=1}return!0},t.subnetMatch=function(r,t,n){var e,i,o,a,s;null==n&&(n="unicast");for(o in t)for(!(a=t[o])[0]||a[0]instanceof Array||(a=[a]),e=0,i=a.length;e=0;t=n+=-1){if(!((e=this.octets[t])in a))return null;if(o=a[e],i&&0!==o)return null;8!==o&&(i=!0),r+=o}return 32-r},r}(),n="(0?\\d+|0x[a-f0-9]+)",e={fourOctet:new RegExp("^"+n+"\\."+n+"\\."+n+"\\."+n+"$","i"),longValue:new RegExp("^"+n+"$","i")},t.IPv4.parser=function(r){var t,n,i,o,a;if(n=function(r){return"0"===r[0]&&"x"!==r[1]?parseInt(r,8):parseInt(r)},t=r.match(e.fourOctet))return function(){var r,e,o,a;for(a=[],r=0,e=(o=t.slice(1,6)).length;r4294967295||a<0)throw new Error("ipaddr: address outside defined range");return function(){var r,t;for(t=[],o=r=0;r<=24;o=r+=8)t.push(a>>o&255);return t}().reverse()}return null},t.IPv6=function(){function r(r,t){var n,e,i,o,a,s;if(16===r.length)for(this.parts=[],n=e=0;e<=14;n=e+=2)this.parts.push(r[n]<<8|r[n+1]);else{if(8!==r.length)throw new Error("ipaddr: ipv6 part count should be 8 or 16");this.parts=r}for(i=0,o=(s=this.parts).length;it&&(r=n.index,t=n[0].length);return t<0?i:i.substring(0,r)+"::"+i.substring(r+t)},r.prototype.toByteArray=function(){var r,t,n,e,i;for(r=[],t=0,n=(i=this.parts).length;t>8),r.push(255&e);return r},r.prototype.toNormalizedString=function(){var r,t,n;return r=function(){var r,n,e,i;for(i=[],r=0,n=(e=this.parts).length;r>8,255&r,n>>8,255&n])},r.prototype.prefixLengthFromSubnetMask=function(){var r,t,n,e,i,o,a;for(a={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},r=0,i=!1,t=n=7;n>=0;t=n+=-1){if(!((e=this.parts[t])in a))return null;if(o=a[e],i&&0!==o)return null;16!==o&&(i=!0),r+=o}return 128-r},r}(),i="(?:[0-9a-f]+::?)+",o={zoneIndex:new RegExp("%[0-9a-z]{1,}","i"),native:new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?(%[0-9a-z]{1,})?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+n+"\\."+n+"\\."+n+"\\."+n+"(%[0-9a-z]{1,})?$","i")},r=function(r,t){var n,e,i,a,s,p;if(r.indexOf("::")!==r.lastIndexOf("::"))return null;for((p=(r.match(o.zoneIndex)||[])[0])&&(p=p.substring(1),r=r.replace(/%.+$/,"")),n=0,e=-1;(e=r.indexOf(":",e+1))>=0;)n++;if("::"===r.substr(0,2)&&n--,"::"===r.substr(-2,2)&&n--,n>t)return null;for(s=t-n,a=":";s--;)a+="0:";return":"===(r=r.replace("::",a))[0]&&(r=r.slice(1)),":"===r[r.length-1]&&(r=r.slice(0,-1)),t=function(){var t,n,e,o;for(o=[],t=0,n=(e=r.split(":")).length;t=0&&t<=32)return e=[this.parse(n[1]),t],Object.defineProperty(e,"toString",{value:function(){return this.join("/")}}),e;throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range")},t.IPv4.subnetMaskFromPrefixLength=function(r){var t,n,e;if((r=parseInt(r))<0||r>32)throw new Error("ipaddr: invalid IPv4 prefix length");for(e=[0,0,0,0],n=0,t=Math.floor(r/8);n=0&&t<=128)return e=[this.parse(n[1]),t],Object.defineProperty(e,"toString",{value:function(){return this.join("/")}}),e;throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range")},t.isValid=function(r){return t.IPv6.isValid(r)||t.IPv4.isValid(r)},t.parse=function(r){if(t.IPv6.isValid(r))return t.IPv6.parse(r);if(t.IPv4.isValid(r))return t.IPv4.parse(r);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},t.parseCIDR=function(r){try{return t.IPv6.parseCIDR(r)}catch(n){n;try{return t.IPv4.parseCIDR(r)}catch(r){throw r,new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},t.fromByteArray=function(r){var n;if(4===(n=r.length))return new t.IPv4(r);if(16===n)return new t.IPv6(r);throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address")},t.process=function(r){var t;return t=this.parse(r),"ipv6"===t.kind()&&t.isIPv4MappedAddress()?t.toIPv4Address():t}}).call(this); \ No newline at end of file diff --git a/node_modules/ipaddr.js/lib/ipaddr.js b/node_modules/ipaddr.js/lib/ipaddr.js new file mode 100644 index 00000000..18bd93b5 --- /dev/null +++ b/node_modules/ipaddr.js/lib/ipaddr.js @@ -0,0 +1,673 @@ +(function() { + var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex; + + ipaddr = {}; + + root = this; + + if ((typeof module !== "undefined" && module !== null) && module.exports) { + module.exports = ipaddr; + } else { + root['ipaddr'] = ipaddr; + } + + matchCIDR = function(first, second, partSize, cidrBits) { + var part, shift; + if (first.length !== second.length) { + throw new Error("ipaddr: cannot match CIDR for objects with different lengths"); + } + part = 0; + while (cidrBits > 0) { + shift = partSize - cidrBits; + if (shift < 0) { + shift = 0; + } + if (first[part] >> shift !== second[part] >> shift) { + return false; + } + cidrBits -= partSize; + part += 1; + } + return true; + }; + + ipaddr.subnetMatch = function(address, rangeList, defaultName) { + var k, len, rangeName, rangeSubnets, subnet; + if (defaultName == null) { + defaultName = 'unicast'; + } + for (rangeName in rangeList) { + rangeSubnets = rangeList[rangeName]; + if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) { + rangeSubnets = [rangeSubnets]; + } + for (k = 0, len = rangeSubnets.length; k < len; k++) { + subnet = rangeSubnets[k]; + if (address.kind() === subnet[0].kind()) { + if (address.match.apply(address, subnet)) { + return rangeName; + } + } + } + } + return defaultName; + }; + + ipaddr.IPv4 = (function() { + function IPv4(octets) { + var k, len, octet; + if (octets.length !== 4) { + throw new Error("ipaddr: ipv4 octet count should be 4"); + } + for (k = 0, len = octets.length; k < len; k++) { + octet = octets[k]; + if (!((0 <= octet && octet <= 255))) { + throw new Error("ipaddr: ipv4 octet should fit in 8 bits"); + } + } + this.octets = octets; + } + + IPv4.prototype.kind = function() { + return 'ipv4'; + }; + + IPv4.prototype.toString = function() { + return this.octets.join("."); + }; + + IPv4.prototype.toNormalizedString = function() { + return this.toString(); + }; + + IPv4.prototype.toByteArray = function() { + return this.octets.slice(0); + }; + + IPv4.prototype.match = function(other, cidrRange) { + var ref; + if (cidrRange === void 0) { + ref = other, other = ref[0], cidrRange = ref[1]; + } + if (other.kind() !== 'ipv4') { + throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one"); + } + return matchCIDR(this.octets, other.octets, 8, cidrRange); + }; + + IPv4.prototype.SpecialRanges = { + unspecified: [[new IPv4([0, 0, 0, 0]), 8]], + broadcast: [[new IPv4([255, 255, 255, 255]), 32]], + multicast: [[new IPv4([224, 0, 0, 0]), 4]], + linkLocal: [[new IPv4([169, 254, 0, 0]), 16]], + loopback: [[new IPv4([127, 0, 0, 0]), 8]], + carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]], + "private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]], + reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]] + }; + + IPv4.prototype.range = function() { + return ipaddr.subnetMatch(this, this.SpecialRanges); + }; + + IPv4.prototype.toIPv4MappedAddress = function() { + return ipaddr.IPv6.parse("::ffff:" + (this.toString())); + }; + + IPv4.prototype.prefixLengthFromSubnetMask = function() { + var cidr, i, k, octet, stop, zeros, zerotable; + zerotable = { + 0: 8, + 128: 7, + 192: 6, + 224: 5, + 240: 4, + 248: 3, + 252: 2, + 254: 1, + 255: 0 + }; + cidr = 0; + stop = false; + for (i = k = 3; k >= 0; i = k += -1) { + octet = this.octets[i]; + if (octet in zerotable) { + zeros = zerotable[octet]; + if (stop && zeros !== 0) { + return null; + } + if (zeros !== 8) { + stop = true; + } + cidr += zeros; + } else { + return null; + } + } + return 32 - cidr; + }; + + return IPv4; + + })(); + + ipv4Part = "(0?\\d+|0x[a-f0-9]+)"; + + ipv4Regexes = { + fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'), + longValue: new RegExp("^" + ipv4Part + "$", 'i') + }; + + ipaddr.IPv4.parser = function(string) { + var match, parseIntAuto, part, shift, value; + parseIntAuto = function(string) { + if (string[0] === "0" && string[1] !== "x") { + return parseInt(string, 8); + } else { + return parseInt(string); + } + }; + if (match = string.match(ipv4Regexes.fourOctet)) { + return (function() { + var k, len, ref, results; + ref = match.slice(1, 6); + results = []; + for (k = 0, len = ref.length; k < len; k++) { + part = ref[k]; + results.push(parseIntAuto(part)); + } + return results; + })(); + } else if (match = string.match(ipv4Regexes.longValue)) { + value = parseIntAuto(match[1]); + if (value > 0xffffffff || value < 0) { + throw new Error("ipaddr: address outside defined range"); + } + return ((function() { + var k, results; + results = []; + for (shift = k = 0; k <= 24; shift = k += 8) { + results.push((value >> shift) & 0xff); + } + return results; + })()).reverse(); + } else { + return null; + } + }; + + ipaddr.IPv6 = (function() { + function IPv6(parts, zoneId) { + var i, k, l, len, part, ref; + if (parts.length === 16) { + this.parts = []; + for (i = k = 0; k <= 14; i = k += 2) { + this.parts.push((parts[i] << 8) | parts[i + 1]); + } + } else if (parts.length === 8) { + this.parts = parts; + } else { + throw new Error("ipaddr: ipv6 part count should be 8 or 16"); + } + ref = this.parts; + for (l = 0, len = ref.length; l < len; l++) { + part = ref[l]; + if (!((0 <= part && part <= 0xffff))) { + throw new Error("ipaddr: ipv6 part should fit in 16 bits"); + } + } + if (zoneId) { + this.zoneId = zoneId; + } + } + + IPv6.prototype.kind = function() { + return 'ipv6'; + }; + + IPv6.prototype.toString = function() { + return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::'); + }; + + IPv6.prototype.toRFC5952String = function() { + var bestMatchIndex, bestMatchLength, match, regex, string; + regex = /((^|:)(0(:|$)){2,})/g; + string = this.toNormalizedString(); + bestMatchIndex = 0; + bestMatchLength = -1; + while ((match = regex.exec(string))) { + if (match[0].length > bestMatchLength) { + bestMatchIndex = match.index; + bestMatchLength = match[0].length; + } + } + if (bestMatchLength < 0) { + return string; + } + return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength); + }; + + IPv6.prototype.toByteArray = function() { + var bytes, k, len, part, ref; + bytes = []; + ref = this.parts; + for (k = 0, len = ref.length; k < len; k++) { + part = ref[k]; + bytes.push(part >> 8); + bytes.push(part & 0xff); + } + return bytes; + }; + + IPv6.prototype.toNormalizedString = function() { + var addr, part, suffix; + addr = ((function() { + var k, len, ref, results; + ref = this.parts; + results = []; + for (k = 0, len = ref.length; k < len; k++) { + part = ref[k]; + results.push(part.toString(16)); + } + return results; + }).call(this)).join(":"); + suffix = ''; + if (this.zoneId) { + suffix = '%' + this.zoneId; + } + return addr + suffix; + }; + + IPv6.prototype.toFixedLengthString = function() { + var addr, part, suffix; + addr = ((function() { + var k, len, ref, results; + ref = this.parts; + results = []; + for (k = 0, len = ref.length; k < len; k++) { + part = ref[k]; + results.push(part.toString(16).padStart(4, '0')); + } + return results; + }).call(this)).join(":"); + suffix = ''; + if (this.zoneId) { + suffix = '%' + this.zoneId; + } + return addr + suffix; + }; + + IPv6.prototype.match = function(other, cidrRange) { + var ref; + if (cidrRange === void 0) { + ref = other, other = ref[0], cidrRange = ref[1]; + } + if (other.kind() !== 'ipv6') { + throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one"); + } + return matchCIDR(this.parts, other.parts, 16, cidrRange); + }; + + IPv6.prototype.SpecialRanges = { + unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128], + linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10], + multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8], + loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128], + uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7], + ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96], + rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96], + rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96], + '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16], + teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32], + reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]] + }; + + IPv6.prototype.range = function() { + return ipaddr.subnetMatch(this, this.SpecialRanges); + }; + + IPv6.prototype.isIPv4MappedAddress = function() { + return this.range() === 'ipv4Mapped'; + }; + + IPv6.prototype.toIPv4Address = function() { + var high, low, ref; + if (!this.isIPv4MappedAddress()) { + throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4"); + } + ref = this.parts.slice(-2), high = ref[0], low = ref[1]; + return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]); + }; + + IPv6.prototype.prefixLengthFromSubnetMask = function() { + var cidr, i, k, part, stop, zeros, zerotable; + zerotable = { + 0: 16, + 32768: 15, + 49152: 14, + 57344: 13, + 61440: 12, + 63488: 11, + 64512: 10, + 65024: 9, + 65280: 8, + 65408: 7, + 65472: 6, + 65504: 5, + 65520: 4, + 65528: 3, + 65532: 2, + 65534: 1, + 65535: 0 + }; + cidr = 0; + stop = false; + for (i = k = 7; k >= 0; i = k += -1) { + part = this.parts[i]; + if (part in zerotable) { + zeros = zerotable[part]; + if (stop && zeros !== 0) { + return null; + } + if (zeros !== 16) { + stop = true; + } + cidr += zeros; + } else { + return null; + } + } + return 128 - cidr; + }; + + return IPv6; + + })(); + + ipv6Part = "(?:[0-9a-f]+::?)+"; + + zoneIndex = "%[0-9a-z]{1,}"; + + ipv6Regexes = { + zoneIndex: new RegExp(zoneIndex, 'i'), + "native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?(" + zoneIndex + ")?$", 'i'), + transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + (ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part) + ("(" + zoneIndex + ")?$"), 'i') + }; + + expandIPv6 = function(string, parts) { + var colonCount, lastColon, part, replacement, replacementCount, zoneId; + if (string.indexOf('::') !== string.lastIndexOf('::')) { + return null; + } + zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0]; + if (zoneId) { + zoneId = zoneId.substring(1); + string = string.replace(/%.+$/, ''); + } + colonCount = 0; + lastColon = -1; + while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) { + colonCount++; + } + if (string.substr(0, 2) === '::') { + colonCount--; + } + if (string.substr(-2, 2) === '::') { + colonCount--; + } + if (colonCount > parts) { + return null; + } + replacementCount = parts - colonCount; + replacement = ':'; + while (replacementCount--) { + replacement += '0:'; + } + string = string.replace('::', replacement); + if (string[0] === ':') { + string = string.slice(1); + } + if (string[string.length - 1] === ':') { + string = string.slice(0, -1); + } + parts = (function() { + var k, len, ref, results; + ref = string.split(":"); + results = []; + for (k = 0, len = ref.length; k < len; k++) { + part = ref[k]; + results.push(parseInt(part, 16)); + } + return results; + })(); + return { + parts: parts, + zoneId: zoneId + }; + }; + + ipaddr.IPv6.parser = function(string) { + var addr, k, len, match, octet, octets, zoneId; + if (ipv6Regexes['native'].test(string)) { + return expandIPv6(string, 8); + } else if (match = string.match(ipv6Regexes['transitional'])) { + zoneId = match[6] || ''; + addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6); + if (addr.parts) { + octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])]; + for (k = 0, len = octets.length; k < len; k++) { + octet = octets[k]; + if (!((0 <= octet && octet <= 255))) { + return null; + } + } + addr.parts.push(octets[0] << 8 | octets[1]); + addr.parts.push(octets[2] << 8 | octets[3]); + return { + parts: addr.parts, + zoneId: addr.zoneId + }; + } + } + return null; + }; + + ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) { + return this.parser(string) !== null; + }; + + ipaddr.IPv4.isValid = function(string) { + var e; + try { + new this(this.parser(string)); + return true; + } catch (error1) { + e = error1; + return false; + } + }; + + ipaddr.IPv4.isValidFourPartDecimal = function(string) { + if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/)) { + return true; + } else { + return false; + } + }; + + ipaddr.IPv6.isValid = function(string) { + var addr, e; + if (typeof string === "string" && string.indexOf(":") === -1) { + return false; + } + try { + addr = this.parser(string); + new this(addr.parts, addr.zoneId); + return true; + } catch (error1) { + e = error1; + return false; + } + }; + + ipaddr.IPv4.parse = function(string) { + var parts; + parts = this.parser(string); + if (parts === null) { + throw new Error("ipaddr: string is not formatted like ip address"); + } + return new this(parts); + }; + + ipaddr.IPv6.parse = function(string) { + var addr; + addr = this.parser(string); + if (addr.parts === null) { + throw new Error("ipaddr: string is not formatted like ip address"); + } + return new this(addr.parts, addr.zoneId); + }; + + ipaddr.IPv4.parseCIDR = function(string) { + var maskLength, match, parsed; + if (match = string.match(/^(.+)\/(\d+)$/)) { + maskLength = parseInt(match[2]); + if (maskLength >= 0 && maskLength <= 32) { + parsed = [this.parse(match[1]), maskLength]; + Object.defineProperty(parsed, 'toString', { + value: function() { + return this.join('/'); + } + }); + return parsed; + } + } + throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range"); + }; + + ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) { + var filledOctetCount, j, octets; + prefix = parseInt(prefix); + if (prefix < 0 || prefix > 32) { + throw new Error('ipaddr: invalid IPv4 prefix length'); + } + octets = [0, 0, 0, 0]; + j = 0; + filledOctetCount = Math.floor(prefix / 8); + while (j < filledOctetCount) { + octets[j] = 255; + j++; + } + if (filledOctetCount < 4) { + octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8); + } + return new this(octets); + }; + + ipaddr.IPv4.broadcastAddressFromCIDR = function(string) { + var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets; + try { + cidr = this.parseCIDR(string); + ipInterfaceOctets = cidr[0].toByteArray(); + subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray(); + octets = []; + i = 0; + while (i < 4) { + octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255); + i++; + } + return new this(octets); + } catch (error1) { + error = error1; + throw new Error('ipaddr: the address does not have IPv4 CIDR format'); + } + }; + + ipaddr.IPv4.networkAddressFromCIDR = function(string) { + var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets; + try { + cidr = this.parseCIDR(string); + ipInterfaceOctets = cidr[0].toByteArray(); + subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray(); + octets = []; + i = 0; + while (i < 4) { + octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10)); + i++; + } + return new this(octets); + } catch (error1) { + error = error1; + throw new Error('ipaddr: the address does not have IPv4 CIDR format'); + } + }; + + ipaddr.IPv6.parseCIDR = function(string) { + var maskLength, match, parsed; + if (match = string.match(/^(.+)\/(\d+)$/)) { + maskLength = parseInt(match[2]); + if (maskLength >= 0 && maskLength <= 128) { + parsed = [this.parse(match[1]), maskLength]; + Object.defineProperty(parsed, 'toString', { + value: function() { + return this.join('/'); + } + }); + return parsed; + } + } + throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range"); + }; + + ipaddr.isValid = function(string) { + return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string); + }; + + ipaddr.parse = function(string) { + if (ipaddr.IPv6.isValid(string)) { + return ipaddr.IPv6.parse(string); + } else if (ipaddr.IPv4.isValid(string)) { + return ipaddr.IPv4.parse(string); + } else { + throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format"); + } + }; + + ipaddr.parseCIDR = function(string) { + var e; + try { + return ipaddr.IPv6.parseCIDR(string); + } catch (error1) { + e = error1; + try { + return ipaddr.IPv4.parseCIDR(string); + } catch (error1) { + e = error1; + throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format"); + } + } + }; + + ipaddr.fromByteArray = function(bytes) { + var length; + length = bytes.length; + if (length === 4) { + return new ipaddr.IPv4(bytes); + } else if (length === 16) { + return new ipaddr.IPv6(bytes); + } else { + throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address"); + } + }; + + ipaddr.process = function(string) { + var addr; + addr = this.parse(string); + if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) { + return addr.toIPv4Address(); + } else { + return addr; + } + }; + +}).call(this); diff --git a/node_modules/ipaddr.js/lib/ipaddr.js.d.ts b/node_modules/ipaddr.js/lib/ipaddr.js.d.ts new file mode 100644 index 00000000..52174b6b --- /dev/null +++ b/node_modules/ipaddr.js/lib/ipaddr.js.d.ts @@ -0,0 +1,68 @@ +declare module "ipaddr.js" { + type IPv4Range = 'unicast' | 'unspecified' | 'broadcast' | 'multicast' | 'linkLocal' | 'loopback' | 'carrierGradeNat' | 'private' | 'reserved'; + type IPv6Range = 'unicast' | 'unspecified' | 'linkLocal' | 'multicast' | 'loopback' | 'uniqueLocal' | 'ipv4Mapped' | 'rfc6145' | 'rfc6052' | '6to4' | 'teredo' | 'reserved'; + + interface RangeList { + [name: string]: [T, number] | [T, number][]; + } + + // Common methods/properties for IPv4 and IPv6 classes. + class IP { + prefixLengthFromSubnetMask(): number | null; + toByteArray(): number[]; + toNormalizedString(): string; + toString(): string; + } + + namespace Address { + export function isValid(addr: string): boolean; + export function fromByteArray(bytes: number[]): IPv4 | IPv6; + export function parse(addr: string): IPv4 | IPv6; + export function parseCIDR(mask: string): [IPv4 | IPv6, number]; + export function process(addr: string): IPv4 | IPv6; + export function subnetMatch(addr: IPv4, rangeList: RangeList, defaultName?: string): string; + export function subnetMatch(addr: IPv6, rangeList: RangeList, defaultName?: string): string; + + export class IPv4 extends IP { + static broadcastAddressFromCIDR(addr: string): IPv4; + static isIPv4(addr: string): boolean; + static isValidFourPartDecimal(addr: string): boolean; + static isValid(addr: string): boolean; + static networkAddressFromCIDR(addr: string): IPv4; + static parse(addr: string): IPv4; + static parseCIDR(addr: string): [IPv4, number]; + static subnetMaskFromPrefixLength(prefix: number): IPv4; + constructor(octets: number[]); + octets: number[] + + kind(): 'ipv4'; + match(addr: IPv4, bits: number): boolean; + match(mask: [IPv4, number]): boolean; + range(): IPv4Range; + subnetMatch(rangeList: RangeList, defaultName?: string): string; + toIPv4MappedAddress(): IPv6; + } + + export class IPv6 extends IP { + static broadcastAddressFromCIDR(addr: string): IPv6; + static isIPv6(addr: string): boolean; + static isValid(addr: string): boolean; + static parse(addr: string): IPv6; + static parseCIDR(addr: string): [IPv6, number]; + static subnetMaskFromPrefixLength(prefix: number): IPv6; + constructor(parts: number[]); + parts: number[] + zoneId?: string + + isIPv4MappedAddress(): boolean; + kind(): 'ipv6'; + match(addr: IPv6, bits: number): boolean; + match(mask: [IPv6, number]): boolean; + range(): IPv6Range; + subnetMatch(rangeList: RangeList, defaultName?: string): string; + toIPv4Address(): IPv4; + } + } + + export = Address; +} diff --git a/node_modules/ipaddr.js/package.json b/node_modules/ipaddr.js/package.json new file mode 100644 index 00000000..53d14df6 --- /dev/null +++ b/node_modules/ipaddr.js/package.json @@ -0,0 +1,70 @@ +{ + "_from": "ipaddr.js@1.9.1", + "_id": "ipaddr.js@1.9.1", + "_inBundle": false, + "_integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "_location": "/ipaddr.js", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ipaddr.js@1.9.1", + "name": "ipaddr.js", + "escapedName": "ipaddr.js", + "rawSpec": "1.9.1", + "saveSpec": null, + "fetchSpec": "1.9.1" + }, + "_requiredBy": [ + "/proxy-addr" + ], + "_resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "_shasum": "bff38543eeb8984825079ff3a2a8e6cbd46781b3", + "_spec": "ipaddr.js@1.9.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\proxy-addr", + "author": { + "name": "whitequark", + "email": "whitequark@whitequark.org" + }, + "bugs": { + "url": "https://github.com/whitequark/ipaddr.js/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "A library for manipulating IPv4 and IPv6 addresses in JavaScript.", + "devDependencies": { + "coffee-script": "~1.12.6", + "nodeunit": "^0.11.3", + "uglify-js": "~3.0.19" + }, + "directories": { + "lib": "./lib" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "lib/", + "LICENSE", + "ipaddr.min.js" + ], + "homepage": "https://github.com/whitequark/ipaddr.js#readme", + "keywords": [ + "ip", + "ipv4", + "ipv6" + ], + "license": "MIT", + "main": "./lib/ipaddr.js", + "name": "ipaddr.js", + "repository": { + "type": "git", + "url": "git://github.com/whitequark/ipaddr.js.git" + }, + "scripts": { + "test": "cake build test" + }, + "types": "./lib/ipaddr.js.d.ts", + "version": "1.9.1" +} diff --git a/node_modules/isarray/.npmignore b/node_modules/isarray/.npmignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/node_modules/isarray/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/isarray/.travis.yml b/node_modules/isarray/.travis.yml new file mode 100644 index 00000000..cc4dba29 --- /dev/null +++ b/node_modules/isarray/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" diff --git a/node_modules/isarray/Makefile b/node_modules/isarray/Makefile new file mode 100644 index 00000000..787d56e1 --- /dev/null +++ b/node_modules/isarray/Makefile @@ -0,0 +1,6 @@ + +test: + @node_modules/.bin/tape test.js + +.PHONY: test + diff --git a/node_modules/isarray/README.md b/node_modules/isarray/README.md new file mode 100644 index 00000000..16d2c59c --- /dev/null +++ b/node_modules/isarray/README.md @@ -0,0 +1,60 @@ + +# isarray + +`Array#isArray` for older browsers. + +[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray) +[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray) + +[![browser support](https://ci.testling.com/juliangruber/isarray.png) +](https://ci.testling.com/juliangruber/isarray) + +## Usage + +```js +var isArray = require('isarray'); + +console.log(isArray([])); // => true +console.log(isArray({})); // => false +``` + +## Installation + +With [npm](http://npmjs.org) do + +```bash +$ npm install isarray +``` + +Then bundle for the browser with +[browserify](https://github.com/substack/browserify). + +With [component](http://component.io) do + +```bash +$ component install juliangruber/isarray +``` + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +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/node_modules/isarray/component.json b/node_modules/isarray/component.json new file mode 100644 index 00000000..9e31b683 --- /dev/null +++ b/node_modules/isarray/component.json @@ -0,0 +1,19 @@ +{ + "name" : "isarray", + "description" : "Array#isArray for older browsers", + "version" : "0.0.1", + "repository" : "juliangruber/isarray", + "homepage": "https://github.com/juliangruber/isarray", + "main" : "index.js", + "scripts" : [ + "index.js" + ], + "dependencies" : {}, + "keywords": ["browser","isarray","array"], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT" +} diff --git a/node_modules/isarray/index.js b/node_modules/isarray/index.js new file mode 100644 index 00000000..a57f6349 --- /dev/null +++ b/node_modules/isarray/index.js @@ -0,0 +1,5 @@ +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; diff --git a/node_modules/isarray/package.json b/node_modules/isarray/package.json new file mode 100644 index 00000000..e86cfda6 --- /dev/null +++ b/node_modules/isarray/package.json @@ -0,0 +1,73 @@ +{ + "_from": "isarray@~1.0.0", + "_id": "isarray@1.0.0", + "_inBundle": false, + "_integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "_location": "/isarray", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "isarray@~1.0.0", + "name": "isarray", + "escapedName": "isarray", + "rawSpec": "~1.0.0", + "saveSpec": null, + "fetchSpec": "~1.0.0" + }, + "_requiredBy": [ + "/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "_shasum": "bb935d48582cba168c06834957a54a3e07124f11", + "_spec": "isarray@~1.0.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\readable-stream", + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "bugs": { + "url": "https://github.com/juliangruber/isarray/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Array#isArray for older browsers", + "devDependencies": { + "tape": "~2.13.4" + }, + "homepage": "https://github.com/juliangruber/isarray", + "keywords": [ + "browser", + "isarray", + "array" + ], + "license": "MIT", + "main": "index.js", + "name": "isarray", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/isarray.git" + }, + "scripts": { + "test": "tape test.js" + }, + "testling": { + "files": "test.js", + "browsers": [ + "ie/8..latest", + "firefox/17..latest", + "firefox/nightly", + "chrome/22..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "version": "1.0.0" +} diff --git a/node_modules/isarray/test.js b/node_modules/isarray/test.js new file mode 100644 index 00000000..e0c3444d --- /dev/null +++ b/node_modules/isarray/test.js @@ -0,0 +1,20 @@ +var isArray = require('./'); +var test = require('tape'); + +test('is array', function(t){ + t.ok(isArray([])); + t.notOk(isArray({})); + t.notOk(isArray(null)); + t.notOk(isArray(false)); + + var obj = {}; + obj[0] = true; + t.notOk(isArray(obj)); + + var arr = []; + arr.foo = 'bar'; + t.ok(isArray(arr)); + + t.end(); +}); + diff --git a/node_modules/media-typer/HISTORY.md b/node_modules/media-typer/HISTORY.md new file mode 100644 index 00000000..62c20031 --- /dev/null +++ b/node_modules/media-typer/HISTORY.md @@ -0,0 +1,22 @@ +0.3.0 / 2014-09-07 +================== + + * Support Node.js 0.6 + * Throw error when parameter format invalid on parse + +0.2.0 / 2014-06-18 +================== + + * Add `typer.format()` to format media types + +0.1.0 / 2014-06-17 +================== + + * Accept `req` as argument to `parse` + * Accept `res` as argument to `parse` + * Parse media type with extra LWS between type and first parameter + +0.0.0 / 2014-06-13 +================== + + * Initial implementation diff --git a/node_modules/media-typer/LICENSE b/node_modules/media-typer/LICENSE new file mode 100644 index 00000000..b7dce6cf --- /dev/null +++ b/node_modules/media-typer/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014 Douglas Christopher Wilson + +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/node_modules/media-typer/README.md b/node_modules/media-typer/README.md new file mode 100644 index 00000000..d8df6234 --- /dev/null +++ b/node_modules/media-typer/README.md @@ -0,0 +1,81 @@ +# media-typer + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Simple RFC 6838 media type parser + +## Installation + +```sh +$ npm install media-typer +``` + +## API + +```js +var typer = require('media-typer') +``` + +### typer.parse(string) + +```js +var obj = typer.parse('image/svg+xml; charset=utf-8') +``` + +Parse a media type string. This will return an object with the following +properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): + + - `type`: The type of the media type (always lower case). Example: `'image'` + + - `subtype`: The subtype of the media type (always lower case). Example: `'svg'` + + - `suffix`: The suffix of the media type (always lower case). Example: `'xml'` + + - `parameters`: An object of the parameters in the media type (name of parameter always lower case). Example: `{charset: 'utf-8'}` + +### typer.parse(req) + +```js +var obj = typer.parse(req) +``` + +Parse the `content-type` header from the given `req`. Short-cut for +`typer.parse(req.headers['content-type'])`. + +### typer.parse(res) + +```js +var obj = typer.parse(res) +``` + +Parse the `content-type` header set on the given `res`. Short-cut for +`typer.parse(res.getHeader('content-type'))`. + +### typer.format(obj) + +```js +var obj = typer.format({type: 'image', subtype: 'svg', suffix: 'xml'}) +``` + +Format an object into a media type string. This will return a string of the +mime type for the given object. For the properties of the object, see the +documentation for `typer.parse(string)`. + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/media-typer.svg?style=flat +[npm-url]: https://npmjs.org/package/media-typer +[node-version-image]: https://img.shields.io/badge/node.js-%3E%3D_0.6-brightgreen.svg?style=flat +[node-version-url]: http://nodejs.org/download/ +[travis-image]: https://img.shields.io/travis/jshttp/media-typer.svg?style=flat +[travis-url]: https://travis-ci.org/jshttp/media-typer +[coveralls-image]: https://img.shields.io/coveralls/jshttp/media-typer.svg?style=flat +[coveralls-url]: https://coveralls.io/r/jshttp/media-typer +[downloads-image]: https://img.shields.io/npm/dm/media-typer.svg?style=flat +[downloads-url]: https://npmjs.org/package/media-typer diff --git a/node_modules/media-typer/index.js b/node_modules/media-typer/index.js new file mode 100644 index 00000000..07f7295e --- /dev/null +++ b/node_modules/media-typer/index.js @@ -0,0 +1,270 @@ +/*! + * media-typer + * Copyright(c) 2014 Douglas Christopher Wilson + * MIT Licensed + */ + +/** + * RegExp to match *( ";" parameter ) in RFC 2616 sec 3.7 + * + * parameter = token "=" ( token | quoted-string ) + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) + * qdtext = > + * quoted-pair = "\" CHAR + * CHAR = + * TEXT = + * LWS = [CRLF] 1*( SP | HT ) + * CRLF = CR LF + * CR = + * LF = + * SP = + * SHT = + * CTL = + * OCTET = + */ +var paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u0020-\u007e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g; +var textRegExp = /^[\u0020-\u007e\u0080-\u00ff]+$/ +var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/ + +/** + * RegExp to match quoted-pair in RFC 2616 + * + * quoted-pair = "\" CHAR + * CHAR = + */ +var qescRegExp = /\\([\u0000-\u007f])/g; + +/** + * RegExp to match chars that must be quoted-pair in RFC 2616 + */ +var quoteRegExp = /([\\"])/g; + +/** + * RegExp to match type in RFC 6838 + * + * type-name = restricted-name + * subtype-name = restricted-name + * restricted-name = restricted-name-first *126restricted-name-chars + * restricted-name-first = ALPHA / DIGIT + * restricted-name-chars = ALPHA / DIGIT / "!" / "#" / + * "$" / "&" / "-" / "^" / "_" + * restricted-name-chars =/ "." ; Characters before first dot always + * ; specify a facet name + * restricted-name-chars =/ "+" ; Characters after last plus always + * ; specify a structured syntax suffix + * ALPHA = %x41-5A / %x61-7A ; A-Z / a-z + * DIGIT = %x30-39 ; 0-9 + */ +var subtypeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/ +var typeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/ +var typeRegExp = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/; + +/** + * Module exports. + */ + +exports.format = format +exports.parse = parse + +/** + * Format object to media type. + * + * @param {object} obj + * @return {string} + * @api public + */ + +function format(obj) { + if (!obj || typeof obj !== 'object') { + throw new TypeError('argument obj is required') + } + + var parameters = obj.parameters + var subtype = obj.subtype + var suffix = obj.suffix + var type = obj.type + + if (!type || !typeNameRegExp.test(type)) { + throw new TypeError('invalid type') + } + + if (!subtype || !subtypeNameRegExp.test(subtype)) { + throw new TypeError('invalid subtype') + } + + // format as type/subtype + var string = type + '/' + subtype + + // append +suffix + if (suffix) { + if (!typeNameRegExp.test(suffix)) { + throw new TypeError('invalid suffix') + } + + string += '+' + suffix + } + + // append parameters + if (parameters && typeof parameters === 'object') { + var param + var params = Object.keys(parameters).sort() + + for (var i = 0; i < params.length; i++) { + param = params[i] + + if (!tokenRegExp.test(param)) { + throw new TypeError('invalid parameter name') + } + + string += '; ' + param + '=' + qstring(parameters[param]) + } + } + + return string +} + +/** + * Parse media type to object. + * + * @param {string|object} string + * @return {Object} + * @api public + */ + +function parse(string) { + if (!string) { + throw new TypeError('argument string is required') + } + + // support req/res-like objects as argument + if (typeof string === 'object') { + string = getcontenttype(string) + } + + if (typeof string !== 'string') { + throw new TypeError('argument string is required to be a string') + } + + var index = string.indexOf(';') + var type = index !== -1 + ? string.substr(0, index) + : string + + var key + var match + var obj = splitType(type) + var params = {} + var value + + paramRegExp.lastIndex = index + + while (match = paramRegExp.exec(string)) { + if (match.index !== index) { + throw new TypeError('invalid parameter format') + } + + index += match[0].length + key = match[1].toLowerCase() + value = match[2] + + if (value[0] === '"') { + // remove quotes and escapes + value = value + .substr(1, value.length - 2) + .replace(qescRegExp, '$1') + } + + params[key] = value + } + + if (index !== -1 && index !== string.length) { + throw new TypeError('invalid parameter format') + } + + obj.parameters = params + + return obj +} + +/** + * Get content-type from req/res objects. + * + * @param {object} + * @return {Object} + * @api private + */ + +function getcontenttype(obj) { + if (typeof obj.getHeader === 'function') { + // res-like + return obj.getHeader('content-type') + } + + if (typeof obj.headers === 'object') { + // req-like + return obj.headers && obj.headers['content-type'] + } +} + +/** + * Quote a string if necessary. + * + * @param {string} val + * @return {string} + * @api private + */ + +function qstring(val) { + var str = String(val) + + // no need to quote tokens + if (tokenRegExp.test(str)) { + return str + } + + if (str.length > 0 && !textRegExp.test(str)) { + throw new TypeError('invalid parameter value') + } + + return '"' + str.replace(quoteRegExp, '\\$1') + '"' +} + +/** + * Simply "type/subtype+siffx" into parts. + * + * @param {string} string + * @return {Object} + * @api private + */ + +function splitType(string) { + var match = typeRegExp.exec(string.toLowerCase()) + + if (!match) { + throw new TypeError('invalid media type') + } + + var type = match[1] + var subtype = match[2] + var suffix + + // suffix after last + + var index = subtype.lastIndexOf('+') + if (index !== -1) { + suffix = subtype.substr(index + 1) + subtype = subtype.substr(0, index) + } + + var obj = { + type: type, + subtype: subtype, + suffix: suffix + } + + return obj +} diff --git a/node_modules/media-typer/package.json b/node_modules/media-typer/package.json new file mode 100644 index 00000000..1945d061 --- /dev/null +++ b/node_modules/media-typer/package.json @@ -0,0 +1,61 @@ +{ + "_from": "media-typer@0.3.0", + "_id": "media-typer@0.3.0", + "_inBundle": false, + "_integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "_location": "/media-typer", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "media-typer@0.3.0", + "name": "media-typer", + "escapedName": "media-typer", + "rawSpec": "0.3.0", + "saveSpec": null, + "fetchSpec": "0.3.0" + }, + "_requiredBy": [ + "/type-is" + ], + "_resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "_shasum": "8710d7af0aa626f8fffa1ce00168545263255748", + "_spec": "media-typer@0.3.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\type-is", + "author": { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + "bugs": { + "url": "https://github.com/jshttp/media-typer/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Simple RFC 6838 media type parser and formatter", + "devDependencies": { + "istanbul": "0.3.2", + "mocha": "~1.21.4", + "should": "~4.0.4" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "index.js" + ], + "homepage": "https://github.com/jshttp/media-typer#readme", + "license": "MIT", + "name": "media-typer", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/media-typer.git" + }, + "scripts": { + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "0.3.0" +} diff --git a/node_modules/memory-pager/.travis.yml b/node_modules/memory-pager/.travis.yml new file mode 100644 index 00000000..1c4ab31e --- /dev/null +++ b/node_modules/memory-pager/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - '4' + - '6' diff --git a/node_modules/memory-pager/LICENSE b/node_modules/memory-pager/LICENSE new file mode 100644 index 00000000..56fce089 --- /dev/null +++ b/node_modules/memory-pager/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Mathias Buus + +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/node_modules/memory-pager/README.md b/node_modules/memory-pager/README.md new file mode 100644 index 00000000..aed17614 --- /dev/null +++ b/node_modules/memory-pager/README.md @@ -0,0 +1,65 @@ +# memory-pager + +Access memory using small fixed sized buffers instead of allocating a huge buffer. +Useful if you are implementing sparse data structures (such as large bitfield). + +![travis](https://travis-ci.org/mafintosh/memory-pager.svg?branch=master) + +``` +npm install memory-pager +``` + +## Usage + +``` js +var pager = require('paged-memory') + +var pages = pager(1024) // use 1kb per page + +var page = pages.get(10) // get page #10 + +console.log(page.offset) // 10240 +console.log(page.buffer) // a blank 1kb buffer +``` + +## API + +#### `var pages = pager(pageSize)` + +Create a new pager. `pageSize` defaults to `1024`. + +#### `var page = pages.get(pageNumber, [noAllocate])` + +Get a page. The page will be allocated at first access. + +Optionally you can set the `noAllocate` flag which will make the +method return undefined if no page has been allocated already + +A page looks like this + +``` js +{ + offset: byteOffset, + buffer: bufferWithPageSize +} +``` + +#### `pages.set(pageNumber, buffer)` + +Explicitly set the buffer for a page. + +#### `pages.updated(page)` + +Mark a page as updated. + +#### `pages.lastUpdate()` + +Get the last page that was updated. + +#### `var buf = pages.toBuffer()` + +Concat all pages allocated pages into a single buffer + +## License + +MIT diff --git a/node_modules/memory-pager/index.js b/node_modules/memory-pager/index.js new file mode 100644 index 00000000..687f346f --- /dev/null +++ b/node_modules/memory-pager/index.js @@ -0,0 +1,160 @@ +module.exports = Pager + +function Pager (pageSize, opts) { + if (!(this instanceof Pager)) return new Pager(pageSize, opts) + + this.length = 0 + this.updates = [] + this.path = new Uint16Array(4) + this.pages = new Array(32768) + this.maxPages = this.pages.length + this.level = 0 + this.pageSize = pageSize || 1024 + this.deduplicate = opts ? opts.deduplicate : null + this.zeros = this.deduplicate ? alloc(this.deduplicate.length) : null +} + +Pager.prototype.updated = function (page) { + while (this.deduplicate && page.buffer[page.deduplicate] === this.deduplicate[page.deduplicate]) { + page.deduplicate++ + if (page.deduplicate === this.deduplicate.length) { + page.deduplicate = 0 + if (page.buffer.equals && page.buffer.equals(this.deduplicate)) page.buffer = this.deduplicate + break + } + } + if (page.updated || !this.updates) return + page.updated = true + this.updates.push(page) +} + +Pager.prototype.lastUpdate = function () { + if (!this.updates || !this.updates.length) return null + var page = this.updates.pop() + page.updated = false + return page +} + +Pager.prototype._array = function (i, noAllocate) { + if (i >= this.maxPages) { + if (noAllocate) return + grow(this, i) + } + + factor(i, this.path) + + var arr = this.pages + + for (var j = this.level; j > 0; j--) { + var p = this.path[j] + var next = arr[p] + + if (!next) { + if (noAllocate) return + next = arr[p] = new Array(32768) + } + + arr = next + } + + return arr +} + +Pager.prototype.get = function (i, noAllocate) { + var arr = this._array(i, noAllocate) + var first = this.path[0] + var page = arr && arr[first] + + if (!page && !noAllocate) { + page = arr[first] = new Page(i, alloc(this.pageSize)) + if (i >= this.length) this.length = i + 1 + } + + if (page && page.buffer === this.deduplicate && this.deduplicate && !noAllocate) { + page.buffer = copy(page.buffer) + page.deduplicate = 0 + } + + return page +} + +Pager.prototype.set = function (i, buf) { + var arr = this._array(i, false) + var first = this.path[0] + + if (i >= this.length) this.length = i + 1 + + if (!buf || (this.zeros && buf.equals && buf.equals(this.zeros))) { + arr[first] = undefined + return + } + + if (this.deduplicate && buf.equals && buf.equals(this.deduplicate)) { + buf = this.deduplicate + } + + var page = arr[first] + var b = truncate(buf, this.pageSize) + + if (page) page.buffer = b + else arr[first] = new Page(i, b) +} + +Pager.prototype.toBuffer = function () { + var list = new Array(this.length) + var empty = alloc(this.pageSize) + var ptr = 0 + + while (ptr < list.length) { + var arr = this._array(ptr, true) + for (var i = 0; i < 32768 && ptr < list.length; i++) { + list[ptr++] = (arr && arr[i]) ? arr[i].buffer : empty + } + } + + return Buffer.concat(list) +} + +function grow (pager, index) { + while (pager.maxPages < index) { + var old = pager.pages + pager.pages = new Array(32768) + pager.pages[0] = old + pager.level++ + pager.maxPages *= 32768 + } +} + +function truncate (buf, len) { + if (buf.length === len) return buf + if (buf.length > len) return buf.slice(0, len) + var cpy = alloc(len) + buf.copy(cpy) + return cpy +} + +function alloc (size) { + if (Buffer.alloc) return Buffer.alloc(size) + var buf = new Buffer(size) + buf.fill(0) + return buf +} + +function copy (buf) { + var cpy = Buffer.allocUnsafe ? Buffer.allocUnsafe(buf.length) : new Buffer(buf.length) + buf.copy(cpy) + return cpy +} + +function Page (i, buf) { + this.offset = i * buf.length + this.buffer = buf + this.updated = false + this.deduplicate = 0 +} + +function factor (n, out) { + n = (n - (out[0] = (n & 32767))) / 32768 + n = (n - (out[1] = (n & 32767))) / 32768 + out[3] = ((n - (out[2] = (n & 32767))) / 32768) & 32767 +} diff --git a/node_modules/memory-pager/package.json b/node_modules/memory-pager/package.json new file mode 100644 index 00000000..7fbf5398 --- /dev/null +++ b/node_modules/memory-pager/package.json @@ -0,0 +1,52 @@ +{ + "_from": "memory-pager@^1.0.2", + "_id": "memory-pager@1.5.0", + "_inBundle": false, + "_integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "_location": "/memory-pager", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "memory-pager@^1.0.2", + "name": "memory-pager", + "escapedName": "memory-pager", + "rawSpec": "^1.0.2", + "saveSpec": null, + "fetchSpec": "^1.0.2" + }, + "_requiredBy": [ + "/sparse-bitfield" + ], + "_resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "_shasum": "d8751655d22d384682741c972f2c3d6dfa3e66b5", + "_spec": "memory-pager@^1.0.2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\sparse-bitfield", + "author": { + "name": "Mathias Buus", + "url": "@mafintosh" + }, + "bugs": { + "url": "https://github.com/mafintosh/memory-pager/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Access memory using small fixed sized buffers", + "devDependencies": { + "standard": "^9.0.0", + "tape": "^4.6.3" + }, + "homepage": "https://github.com/mafintosh/memory-pager", + "license": "MIT", + "main": "index.js", + "name": "memory-pager", + "repository": { + "type": "git", + "url": "git+https://github.com/mafintosh/memory-pager.git" + }, + "scripts": { + "test": "standard && tape test.js" + }, + "version": "1.5.0" +} diff --git a/node_modules/memory-pager/test.js b/node_modules/memory-pager/test.js new file mode 100644 index 00000000..16382100 --- /dev/null +++ b/node_modules/memory-pager/test.js @@ -0,0 +1,80 @@ +var tape = require('tape') +var pager = require('./') + +tape('get page', function (t) { + var pages = pager(1024) + + var page = pages.get(0) + + t.same(page.offset, 0) + t.same(page.buffer, Buffer.alloc(1024)) + t.end() +}) + +tape('get page twice', function (t) { + var pages = pager(1024) + t.same(pages.length, 0) + + var page = pages.get(0) + + t.same(page.offset, 0) + t.same(page.buffer, Buffer.alloc(1024)) + t.same(pages.length, 1) + + var other = pages.get(0) + + t.same(other, page) + t.end() +}) + +tape('get no mutable page', function (t) { + var pages = pager(1024) + + t.ok(!pages.get(141, true)) + t.ok(pages.get(141)) + t.ok(pages.get(141, true)) + + t.end() +}) + +tape('get far out page', function (t) { + var pages = pager(1024) + + var page = pages.get(1000000) + + t.same(page.offset, 1000000 * 1024) + t.same(page.buffer, Buffer.alloc(1024)) + t.same(pages.length, 1000000 + 1) + + var other = pages.get(1) + + t.same(other.offset, 1024) + t.same(other.buffer, Buffer.alloc(1024)) + t.same(pages.length, 1000000 + 1) + t.ok(other !== page) + + t.end() +}) + +tape('updates', function (t) { + var pages = pager(1024) + + t.same(pages.lastUpdate(), null) + + var page = pages.get(10) + + page.buffer[42] = 1 + pages.updated(page) + + t.same(pages.lastUpdate(), page) + t.same(pages.lastUpdate(), null) + + page.buffer[42] = 2 + pages.updated(page) + pages.updated(page) + + t.same(pages.lastUpdate(), page) + t.same(pages.lastUpdate(), null) + + t.end() +}) diff --git a/node_modules/merge-descriptors/HISTORY.md b/node_modules/merge-descriptors/HISTORY.md new file mode 100644 index 00000000..486771f0 --- /dev/null +++ b/node_modules/merge-descriptors/HISTORY.md @@ -0,0 +1,21 @@ +1.0.1 / 2016-01-17 +================== + + * perf: enable strict mode + +1.0.0 / 2015-03-01 +================== + + * Add option to only add new descriptors + * Add simple argument validation + * Add jsdoc to source file + +0.0.2 / 2013-12-14 +================== + + * Move repository to `component` organization + +0.0.1 / 2013-10-29 +================== + + * Initial release diff --git a/node_modules/merge-descriptors/LICENSE b/node_modules/merge-descriptors/LICENSE new file mode 100644 index 00000000..274bfd82 --- /dev/null +++ b/node_modules/merge-descriptors/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +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/node_modules/merge-descriptors/README.md b/node_modules/merge-descriptors/README.md new file mode 100644 index 00000000..d593c0eb --- /dev/null +++ b/node_modules/merge-descriptors/README.md @@ -0,0 +1,48 @@ +# Merge Descriptors + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Merge objects using descriptors. + +```js +var thing = { + get name() { + return 'jon' + } +} + +var animal = { + +} + +merge(animal, thing) + +animal.name === 'jon' +``` + +## API + +### merge(destination, source) + +Redefines `destination`'s descriptors with `source`'s. + +### merge(destination, source, false) + +Defines `source`'s descriptors on `destination` if `destination` does not have +a descriptor by the same name. + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/merge-descriptors.svg +[npm-url]: https://npmjs.org/package/merge-descriptors +[travis-image]: https://img.shields.io/travis/component/merge-descriptors/master.svg +[travis-url]: https://travis-ci.org/component/merge-descriptors +[coveralls-image]: https://img.shields.io/coveralls/component/merge-descriptors/master.svg +[coveralls-url]: https://coveralls.io/r/component/merge-descriptors?branch=master +[downloads-image]: https://img.shields.io/npm/dm/merge-descriptors.svg +[downloads-url]: https://npmjs.org/package/merge-descriptors diff --git a/node_modules/merge-descriptors/index.js b/node_modules/merge-descriptors/index.js new file mode 100644 index 00000000..573b132e --- /dev/null +++ b/node_modules/merge-descriptors/index.js @@ -0,0 +1,60 @@ +/*! + * merge-descriptors + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = merge + +/** + * Module variables. + * @private + */ + +var hasOwnProperty = Object.prototype.hasOwnProperty + +/** + * Merge the property descriptors of `src` into `dest` + * + * @param {object} dest Object to add descriptors to + * @param {object} src Object to clone descriptors from + * @param {boolean} [redefine=true] Redefine `dest` properties with `src` properties + * @returns {object} Reference to dest + * @public + */ + +function merge(dest, src, redefine) { + if (!dest) { + throw new TypeError('argument dest is required') + } + + if (!src) { + throw new TypeError('argument src is required') + } + + if (redefine === undefined) { + // Default to true + redefine = true + } + + Object.getOwnPropertyNames(src).forEach(function forEachOwnPropertyName(name) { + if (!redefine && hasOwnProperty.call(dest, name)) { + // Skip desriptor + return + } + + // Copy descriptor + var descriptor = Object.getOwnPropertyDescriptor(src, name) + Object.defineProperty(dest, name, descriptor) + }) + + return dest +} diff --git a/node_modules/merge-descriptors/package.json b/node_modules/merge-descriptors/package.json new file mode 100644 index 00000000..b333acc0 --- /dev/null +++ b/node_modules/merge-descriptors/package.json @@ -0,0 +1,69 @@ +{ + "_from": "merge-descriptors@1.0.1", + "_id": "merge-descriptors@1.0.1", + "_inBundle": false, + "_integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "_location": "/merge-descriptors", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "merge-descriptors@1.0.1", + "name": "merge-descriptors", + "escapedName": "merge-descriptors", + "rawSpec": "1.0.1", + "saveSpec": null, + "fetchSpec": "1.0.1" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "_shasum": "b00aaa556dd8b44568150ec9d1b953f3f90cbb61", + "_spec": "merge-descriptors@1.0.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + }, + "bugs": { + "url": "https://github.com/component/merge-descriptors/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Mike Grabowski", + "email": "grabbou@gmail.com" + } + ], + "deprecated": false, + "description": "Merge objects using descriptors", + "devDependencies": { + "istanbul": "0.4.1", + "mocha": "1.21.5" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "index.js" + ], + "homepage": "https://github.com/component/merge-descriptors#readme", + "license": "MIT", + "name": "merge-descriptors", + "repository": { + "type": "git", + "url": "git+https://github.com/component/merge-descriptors.git" + }, + "scripts": { + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" + }, + "version": "1.0.1" +} diff --git a/node_modules/methods/HISTORY.md b/node_modules/methods/HISTORY.md new file mode 100644 index 00000000..c0ecf072 --- /dev/null +++ b/node_modules/methods/HISTORY.md @@ -0,0 +1,29 @@ +1.1.2 / 2016-01-17 +================== + + * perf: enable strict mode + +1.1.1 / 2014-12-30 +================== + + * Improve `browserify` support + +1.1.0 / 2014-07-05 +================== + + * Add `CONNECT` method + +1.0.1 / 2014-06-02 +================== + + * Fix module to work with harmony transform + +1.0.0 / 2014-05-08 +================== + + * Add `PURGE` method + +0.1.0 / 2013-10-28 +================== + + * Add `http.METHODS` support diff --git a/node_modules/methods/LICENSE b/node_modules/methods/LICENSE new file mode 100644 index 00000000..220dc1a2 --- /dev/null +++ b/node_modules/methods/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2013-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson + +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/node_modules/methods/README.md b/node_modules/methods/README.md new file mode 100644 index 00000000..672a32bf --- /dev/null +++ b/node_modules/methods/README.md @@ -0,0 +1,51 @@ +# Methods + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +HTTP verbs that Node.js core's HTTP parser supports. + +This module provides an export that is just like `http.METHODS` from Node.js core, +with the following differences: + + * All method names are lower-cased. + * Contains a fallback list of methods for Node.js versions that do not have a + `http.METHODS` export (0.10 and lower). + * Provides the fallback list when using tools like `browserify` without pulling + in the `http` shim module. + +## Install + +```bash +$ npm install methods +``` + +## API + +```js +var methods = require('methods') +``` + +### methods + +This is an array of lower-cased method names that Node.js supports. If Node.js +provides the `http.METHODS` export, then this is the same array lower-cased, +otherwise it is a snapshot of the verbs from Node.js 0.10. + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/methods.svg?style=flat +[npm-url]: https://npmjs.org/package/methods +[node-version-image]: https://img.shields.io/node/v/methods.svg?style=flat +[node-version-url]: https://nodejs.org/en/download/ +[travis-image]: https://img.shields.io/travis/jshttp/methods.svg?style=flat +[travis-url]: https://travis-ci.org/jshttp/methods +[coveralls-image]: https://img.shields.io/coveralls/jshttp/methods.svg?style=flat +[coveralls-url]: https://coveralls.io/r/jshttp/methods?branch=master +[downloads-image]: https://img.shields.io/npm/dm/methods.svg?style=flat +[downloads-url]: https://npmjs.org/package/methods diff --git a/node_modules/methods/index.js b/node_modules/methods/index.js new file mode 100644 index 00000000..667a50bd --- /dev/null +++ b/node_modules/methods/index.js @@ -0,0 +1,69 @@ +/*! + * methods + * Copyright(c) 2013-2014 TJ Holowaychuk + * Copyright(c) 2015-2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module dependencies. + * @private + */ + +var http = require('http'); + +/** + * Module exports. + * @public + */ + +module.exports = getCurrentNodeMethods() || getBasicNodeMethods(); + +/** + * Get the current Node.js methods. + * @private + */ + +function getCurrentNodeMethods() { + return http.METHODS && http.METHODS.map(function lowerCaseMethod(method) { + return method.toLowerCase(); + }); +} + +/** + * Get the "basic" Node.js methods, a snapshot from Node.js 0.10. + * @private + */ + +function getBasicNodeMethods() { + return [ + 'get', + 'post', + 'put', + 'head', + 'delete', + 'options', + 'trace', + 'copy', + 'lock', + 'mkcol', + 'move', + 'purge', + 'propfind', + 'proppatch', + 'unlock', + 'report', + 'mkactivity', + 'checkout', + 'merge', + 'm-search', + 'notify', + 'subscribe', + 'unsubscribe', + 'patch', + 'search', + 'connect' + ]; +} diff --git a/node_modules/methods/package.json b/node_modules/methods/package.json new file mode 100644 index 00000000..4c1dbc3e --- /dev/null +++ b/node_modules/methods/package.json @@ -0,0 +1,79 @@ +{ + "_from": "methods@~1.1.2", + "_id": "methods@1.1.2", + "_inBundle": false, + "_integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "_location": "/methods", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "methods@~1.1.2", + "name": "methods", + "escapedName": "methods", + "rawSpec": "~1.1.2", + "saveSpec": null, + "fetchSpec": "~1.1.2" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "_shasum": "5529a4d67654134edcc5266656835b0f851afcee", + "_spec": "methods@~1.1.2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "browser": { + "http": false + }, + "bugs": { + "url": "https://github.com/jshttp/methods/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + }, + { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "url": "http://tjholowaychuk.com" + } + ], + "deprecated": false, + "description": "HTTP methods that node supports", + "devDependencies": { + "istanbul": "0.4.1", + "mocha": "1.21.5" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "index.js", + "HISTORY.md", + "LICENSE" + ], + "homepage": "https://github.com/jshttp/methods#readme", + "keywords": [ + "http", + "methods" + ], + "license": "MIT", + "name": "methods", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/methods.git" + }, + "scripts": { + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "1.1.2" +} diff --git a/node_modules/mime-db/HISTORY.md b/node_modules/mime-db/HISTORY.md new file mode 100644 index 00000000..aff74740 --- /dev/null +++ b/node_modules/mime-db/HISTORY.md @@ -0,0 +1,466 @@ +1.46.0 / 2021-02-13 +=================== + + * Add extension `.amr` to `audio/amr` + * Add extension `.m4s` to `video/iso.segment` + * Add extension `.opus` to `audio/ogg` + * Add new upstream MIME types + +1.45.0 / 2020-09-22 +=================== + + * Add `application/ubjson` with extension `.ubj` + * Add `image/avif` with extension `.avif` + * Add `image/ktx2` with extension `.ktx2` + * Add extension `.dbf` to `application/vnd.dbf` + * Add extension `.rar` to `application/vnd.rar` + * Add extension `.td` to `application/urc-targetdesc+xml` + * Add new upstream MIME types + * Fix extension of `application/vnd.apple.keynote` to be `.key` + +1.44.0 / 2020-04-22 +=================== + + * Add charsets from IANA + * Add extension `.cjs` to `application/node` + * Add new upstream MIME types + +1.43.0 / 2020-01-05 +=================== + + * Add `application/x-keepass2` with extension `.kdbx` + * Add extension `.mxmf` to `audio/mobile-xmf` + * Add extensions from IANA for `application/*+xml` types + * Add new upstream MIME types + +1.42.0 / 2019-09-25 +=================== + + * Add `image/vnd.ms-dds` with extension `.dds` + * Add new upstream MIME types + * Remove compressible from `multipart/mixed` + +1.41.0 / 2019-08-30 +=================== + + * Add new upstream MIME types + * Add `application/toml` with extension `.toml` + * Mark `font/ttf` as compressible + +1.40.0 / 2019-04-20 +=================== + + * Add extensions from IANA for `model/*` types + * Add `text/mdx` with extension `.mdx` + +1.39.0 / 2019-04-04 +=================== + + * Add extensions `.siv` and `.sieve` to `application/sieve` + * Add new upstream MIME types + +1.38.0 / 2019-02-04 +=================== + + * Add extension `.nq` to `application/n-quads` + * Add extension `.nt` to `application/n-triples` + * Add new upstream MIME types + * Mark `text/less` as compressible + +1.37.0 / 2018-10-19 +=================== + + * Add extensions to HEIC image types + * Add new upstream MIME types + +1.36.0 / 2018-08-20 +=================== + + * Add Apple file extensions from IANA + * Add extensions from IANA for `image/*` types + * Add new upstream MIME types + +1.35.0 / 2018-07-15 +=================== + + * Add extension `.owl` to `application/rdf+xml` + * Add new upstream MIME types + - Removes extension `.woff` from `application/font-woff` + +1.34.0 / 2018-06-03 +=================== + + * Add extension `.csl` to `application/vnd.citationstyles.style+xml` + * Add extension `.es` to `application/ecmascript` + * Add new upstream MIME types + * Add `UTF-8` as default charset for `text/turtle` + * Mark all XML-derived types as compressible + +1.33.0 / 2018-02-15 +=================== + + * Add extensions from IANA for `message/*` types + * Add new upstream MIME types + * Fix some incorrect OOXML types + * Remove `application/font-woff2` + +1.32.0 / 2017-11-29 +=================== + + * Add new upstream MIME types + * Update `text/hjson` to registered `application/hjson` + * Add `text/shex` with extension `.shex` + +1.31.0 / 2017-10-25 +=================== + + * Add `application/raml+yaml` with extension `.raml` + * Add `application/wasm` with extension `.wasm` + * Add new `font` type from IANA + * Add new upstream font extensions + * Add new upstream MIME types + * Add extensions for JPEG-2000 images + +1.30.0 / 2017-08-27 +=================== + + * Add `application/vnd.ms-outlook` + * Add `application/x-arj` + * Add extension `.mjs` to `application/javascript` + * Add glTF types and extensions + * Add new upstream MIME types + * Add `text/x-org` + * Add VirtualBox MIME types + * Fix `source` records for `video/*` types that are IANA + * Update `font/opentype` to registered `font/otf` + +1.29.0 / 2017-07-10 +=================== + + * Add `application/fido.trusted-apps+json` + * Add extension `.wadl` to `application/vnd.sun.wadl+xml` + * Add new upstream MIME types + * Add `UTF-8` as default charset for `text/css` + +1.28.0 / 2017-05-14 +=================== + + * Add new upstream MIME types + * Add extension `.gz` to `application/gzip` + * Update extensions `.md` and `.markdown` to be `text/markdown` + +1.27.0 / 2017-03-16 +=================== + + * Add new upstream MIME types + * Add `image/apng` with extension `.apng` + +1.26.0 / 2017-01-14 +=================== + + * Add new upstream MIME types + * Add extension `.geojson` to `application/geo+json` + +1.25.0 / 2016-11-11 +=================== + + * Add new upstream MIME types + +1.24.0 / 2016-09-18 +=================== + + * Add `audio/mp3` + * Add new upstream MIME types + +1.23.0 / 2016-05-01 +=================== + + * Add new upstream MIME types + * Add extension `.3gpp` to `audio/3gpp` + +1.22.0 / 2016-02-15 +=================== + + * Add `text/slim` + * Add extension `.rng` to `application/xml` + * Add new upstream MIME types + * Fix extension of `application/dash+xml` to be `.mpd` + * Update primary extension to `.m4a` for `audio/mp4` + +1.21.0 / 2016-01-06 +=================== + + * Add Google document types + * Add new upstream MIME types + +1.20.0 / 2015-11-10 +=================== + + * Add `text/x-suse-ymp` + * Add new upstream MIME types + +1.19.0 / 2015-09-17 +=================== + + * Add `application/vnd.apple.pkpass` + * Add new upstream MIME types + +1.18.0 / 2015-09-03 +=================== + + * Add new upstream MIME types + +1.17.0 / 2015-08-13 +=================== + + * Add `application/x-msdos-program` + * Add `audio/g711-0` + * Add `image/vnd.mozilla.apng` + * Add extension `.exe` to `application/x-msdos-program` + +1.16.0 / 2015-07-29 +=================== + + * Add `application/vnd.uri-map` + +1.15.0 / 2015-07-13 +=================== + + * Add `application/x-httpd-php` + +1.14.0 / 2015-06-25 +=================== + + * Add `application/scim+json` + * Add `application/vnd.3gpp.ussd+xml` + * Add `application/vnd.biopax.rdf+xml` + * Add `text/x-processing` + +1.13.0 / 2015-06-07 +=================== + + * Add nginx as a source + * Add `application/x-cocoa` + * Add `application/x-java-archive-diff` + * Add `application/x-makeself` + * Add `application/x-perl` + * Add `application/x-pilot` + * Add `application/x-redhat-package-manager` + * Add `application/x-sea` + * Add `audio/x-m4a` + * Add `audio/x-realaudio` + * Add `image/x-jng` + * Add `text/mathml` + +1.12.0 / 2015-06-05 +=================== + + * Add `application/bdoc` + * Add `application/vnd.hyperdrive+json` + * Add `application/x-bdoc` + * Add extension `.rtf` to `text/rtf` + +1.11.0 / 2015-05-31 +=================== + + * Add `audio/wav` + * Add `audio/wave` + * Add extension `.litcoffee` to `text/coffeescript` + * Add extension `.sfd-hdstx` to `application/vnd.hydrostatix.sof-data` + * Add extension `.n-gage` to `application/vnd.nokia.n-gage.symbian.install` + +1.10.0 / 2015-05-19 +=================== + + * Add `application/vnd.balsamiq.bmpr` + * Add `application/vnd.microsoft.portable-executable` + * Add `application/x-ns-proxy-autoconfig` + +1.9.1 / 2015-04-19 +================== + + * Remove `.json` extension from `application/manifest+json` + - This is causing bugs downstream + +1.9.0 / 2015-04-19 +================== + + * Add `application/manifest+json` + * Add `application/vnd.micro+json` + * Add `image/vnd.zbrush.pcx` + * Add `image/x-ms-bmp` + +1.8.0 / 2015-03-13 +================== + + * Add `application/vnd.citationstyles.style+xml` + * Add `application/vnd.fastcopy-disk-image` + * Add `application/vnd.gov.sk.xmldatacontainer+xml` + * Add extension `.jsonld` to `application/ld+json` + +1.7.0 / 2015-02-08 +================== + + * Add `application/vnd.gerber` + * Add `application/vnd.msa-disk-image` + +1.6.1 / 2015-02-05 +================== + + * Community extensions ownership transferred from `node-mime` + +1.6.0 / 2015-01-29 +================== + + * Add `application/jose` + * Add `application/jose+json` + * Add `application/json-seq` + * Add `application/jwk+json` + * Add `application/jwk-set+json` + * Add `application/jwt` + * Add `application/rdap+json` + * Add `application/vnd.gov.sk.e-form+xml` + * Add `application/vnd.ims.imsccv1p3` + +1.5.0 / 2014-12-30 +================== + + * Add `application/vnd.oracle.resource+json` + * Fix various invalid MIME type entries + - `application/mbox+xml` + - `application/oscp-response` + - `application/vwg-multiplexed` + - `audio/g721` + +1.4.0 / 2014-12-21 +================== + + * Add `application/vnd.ims.imsccv1p2` + * Fix various invalid MIME type entries + - `application/vnd-acucobol` + - `application/vnd-curl` + - `application/vnd-dart` + - `application/vnd-dxr` + - `application/vnd-fdf` + - `application/vnd-mif` + - `application/vnd-sema` + - `application/vnd-wap-wmlc` + - `application/vnd.adobe.flash-movie` + - `application/vnd.dece-zip` + - `application/vnd.dvb_service` + - `application/vnd.micrografx-igx` + - `application/vnd.sealed-doc` + - `application/vnd.sealed-eml` + - `application/vnd.sealed-mht` + - `application/vnd.sealed-ppt` + - `application/vnd.sealed-tiff` + - `application/vnd.sealed-xls` + - `application/vnd.sealedmedia.softseal-html` + - `application/vnd.sealedmedia.softseal-pdf` + - `application/vnd.wap-slc` + - `application/vnd.wap-wbxml` + - `audio/vnd.sealedmedia.softseal-mpeg` + - `image/vnd-djvu` + - `image/vnd-svf` + - `image/vnd-wap-wbmp` + - `image/vnd.sealed-png` + - `image/vnd.sealedmedia.softseal-gif` + - `image/vnd.sealedmedia.softseal-jpg` + - `model/vnd-dwf` + - `model/vnd.parasolid.transmit-binary` + - `model/vnd.parasolid.transmit-text` + - `text/vnd-a` + - `text/vnd-curl` + - `text/vnd.wap-wml` + * Remove example template MIME types + - `application/example` + - `audio/example` + - `image/example` + - `message/example` + - `model/example` + - `multipart/example` + - `text/example` + - `video/example` + +1.3.1 / 2014-12-16 +================== + + * Fix missing extensions + - `application/json5` + - `text/hjson` + +1.3.0 / 2014-12-07 +================== + + * Add `application/a2l` + * Add `application/aml` + * Add `application/atfx` + * Add `application/atxml` + * Add `application/cdfx+xml` + * Add `application/dii` + * Add `application/json5` + * Add `application/lxf` + * Add `application/mf4` + * Add `application/vnd.apache.thrift.compact` + * Add `application/vnd.apache.thrift.json` + * Add `application/vnd.coffeescript` + * Add `application/vnd.enphase.envoy` + * Add `application/vnd.ims.imsccv1p1` + * Add `text/csv-schema` + * Add `text/hjson` + * Add `text/markdown` + * Add `text/yaml` + +1.2.0 / 2014-11-09 +================== + + * Add `application/cea` + * Add `application/dit` + * Add `application/vnd.gov.sk.e-form+zip` + * Add `application/vnd.tmd.mediaflex.api+xml` + * Type `application/epub+zip` is now IANA-registered + +1.1.2 / 2014-10-23 +================== + + * Rebuild database for `application/x-www-form-urlencoded` change + +1.1.1 / 2014-10-20 +================== + + * Mark `application/x-www-form-urlencoded` as compressible. + +1.1.0 / 2014-09-28 +================== + + * Add `application/font-woff2` + +1.0.3 / 2014-09-25 +================== + + * Fix engine requirement in package + +1.0.2 / 2014-09-25 +================== + + * Add `application/coap-group+json` + * Add `application/dcd` + * Add `application/vnd.apache.thrift.binary` + * Add `image/vnd.tencent.tap` + * Mark all JSON-derived types as compressible + * Update `text/vtt` data + +1.0.1 / 2014-08-30 +================== + + * Fix extension ordering + +1.0.0 / 2014-08-30 +================== + + * Add `application/atf` + * Add `application/merge-patch+json` + * Add `multipart/x-mixed-replace` + * Add `source: 'apache'` metadata + * Add `source: 'iana'` metadata + * Remove badly-assumed charset data diff --git a/node_modules/mime-db/LICENSE b/node_modules/mime-db/LICENSE new file mode 100644 index 00000000..a7ae8ee9 --- /dev/null +++ b/node_modules/mime-db/LICENSE @@ -0,0 +1,22 @@ + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + +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/node_modules/mime-db/README.md b/node_modules/mime-db/README.md new file mode 100644 index 00000000..8f1d8c4e --- /dev/null +++ b/node_modules/mime-db/README.md @@ -0,0 +1,102 @@ +# mime-db + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][ci-image]][ci-url] +[![Coverage Status][coveralls-image]][coveralls-url] + +This is a database of all mime types. +It consists of a single, public JSON file and does not include any logic, +allowing it to remain as un-opinionated as possible with an API. +It aggregates data from the following sources: + +- http://www.iana.org/assignments/media-types/media-types.xhtml +- http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types +- http://hg.nginx.org/nginx/raw-file/default/conf/mime.types + +## Installation + +```bash +npm install mime-db +``` + +### Database Download + +If you're crazy enough to use this in the browser, you can just grab the +JSON file using [jsDelivr](https://www.jsdelivr.com/). It is recommended to +replace `master` with [a release tag](https://github.com/jshttp/mime-db/tags) +as the JSON format may change in the future. + +``` +https://cdn.jsdelivr.net/gh/jshttp/mime-db@master/db.json +``` + +## Usage + + + +```js +var db = require('mime-db') + +// grab data on .js files +var data = db['application/javascript'] +``` + +## Data Structure + +The JSON file is a map lookup for lowercased mime types. +Each mime type has the following properties: + +- `.source` - where the mime type is defined. + If not set, it's probably a custom media type. + - `apache` - [Apache common media types](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types) + - `iana` - [IANA-defined media types](http://www.iana.org/assignments/media-types/media-types.xhtml) + - `nginx` - [nginx media types](http://hg.nginx.org/nginx/raw-file/default/conf/mime.types) +- `.extensions[]` - known extensions associated with this mime type. +- `.compressible` - whether a file of this type can be gzipped. +- `.charset` - the default charset associated with this type, if any. + +If unknown, every property could be `undefined`. + +## Contributing + +To edit the database, only make PRs against `src/custom-types.json` or +`src/custom-suffix.json`. + +The `src/custom-types.json` file is a JSON object with the MIME type as the +keys and the values being an object with the following keys: + +- `compressible` - leave out if you don't know, otherwise `true`/`false` to + indicate whether the data represented by the type is typically compressible. +- `extensions` - include an array of file extensions that are associated with + the type. +- `notes` - human-readable notes about the type, typically what the type is. +- `sources` - include an array of URLs of where the MIME type and the associated + extensions are sourced from. This needs to be a [primary source](https://en.wikipedia.org/wiki/Primary_source); + links to type aggregating sites and Wikipedia are _not acceptable_. + +To update the build, run `npm run build`. + +### Adding Custom Media Types + +The best way to get new media types included in this library is to register +them with the IANA. The community registration procedure is outlined in +[RFC 6838 section 5](http://tools.ietf.org/html/rfc6838#section-5). Types +registered with the IANA are automatically pulled into this library. + +If that is not possible / feasible, they can be added directly here as a +"custom" type. To do this, it is required to have a primary source that +definitively lists the media type. If an extension is going to be listed as +associateed with this media type, the source must definitively link the +media type and extension as well. + +[ci-image]: https://badgen.net/github/checks/jshttp/mime-db/master?label=ci +[ci-url]: https://github.com/jshttp/mime-db/actions?query=workflow%3Aci +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/mime-db/master +[coveralls-url]: https://coveralls.io/r/jshttp/mime-db?branch=master +[node-image]: https://badgen.net/npm/node/mime-db +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/mime-db +[npm-url]: https://npmjs.org/package/mime-db +[npm-version-image]: https://badgen.net/npm/v/mime-db diff --git a/node_modules/mime-db/db.json b/node_modules/mime-db/db.json new file mode 100644 index 00000000..4871607a --- /dev/null +++ b/node_modules/mime-db/db.json @@ -0,0 +1,8313 @@ +{ + "application/1d-interleaved-parityfec": { + "source": "iana" + }, + "application/3gpdash-qoe-report+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/3gpp-ims+xml": { + "source": "iana", + "compressible": true + }, + "application/a2l": { + "source": "iana" + }, + "application/activemessage": { + "source": "iana" + }, + "application/activity+json": { + "source": "iana", + "compressible": true + }, + "application/alto-costmap+json": { + "source": "iana", + "compressible": true + }, + "application/alto-costmapfilter+json": { + "source": "iana", + "compressible": true + }, + "application/alto-directory+json": { + "source": "iana", + "compressible": true + }, + "application/alto-endpointcost+json": { + "source": "iana", + "compressible": true + }, + "application/alto-endpointcostparams+json": { + "source": "iana", + "compressible": true + }, + "application/alto-endpointprop+json": { + "source": "iana", + "compressible": true + }, + "application/alto-endpointpropparams+json": { + "source": "iana", + "compressible": true + }, + "application/alto-error+json": { + "source": "iana", + "compressible": true + }, + "application/alto-networkmap+json": { + "source": "iana", + "compressible": true + }, + "application/alto-networkmapfilter+json": { + "source": "iana", + "compressible": true + }, + "application/alto-updatestreamcontrol+json": { + "source": "iana", + "compressible": true + }, + "application/alto-updatestreamparams+json": { + "source": "iana", + "compressible": true + }, + "application/aml": { + "source": "iana" + }, + "application/andrew-inset": { + "source": "iana", + "extensions": ["ez"] + }, + "application/applefile": { + "source": "iana" + }, + "application/applixware": { + "source": "apache", + "extensions": ["aw"] + }, + "application/atf": { + "source": "iana" + }, + "application/atfx": { + "source": "iana" + }, + "application/atom+xml": { + "source": "iana", + "compressible": true, + "extensions": ["atom"] + }, + "application/atomcat+xml": { + "source": "iana", + "compressible": true, + "extensions": ["atomcat"] + }, + "application/atomdeleted+xml": { + "source": "iana", + "compressible": true, + "extensions": ["atomdeleted"] + }, + "application/atomicmail": { + "source": "iana" + }, + "application/atomsvc+xml": { + "source": "iana", + "compressible": true, + "extensions": ["atomsvc"] + }, + "application/atsc-dwd+xml": { + "source": "iana", + "compressible": true, + "extensions": ["dwd"] + }, + "application/atsc-dynamic-event-message": { + "source": "iana" + }, + "application/atsc-held+xml": { + "source": "iana", + "compressible": true, + "extensions": ["held"] + }, + "application/atsc-rdt+json": { + "source": "iana", + "compressible": true + }, + "application/atsc-rsat+xml": { + "source": "iana", + "compressible": true, + "extensions": ["rsat"] + }, + "application/atxml": { + "source": "iana" + }, + "application/auth-policy+xml": { + "source": "iana", + "compressible": true + }, + "application/bacnet-xdd+zip": { + "source": "iana", + "compressible": false + }, + "application/batch-smtp": { + "source": "iana" + }, + "application/bdoc": { + "compressible": false, + "extensions": ["bdoc"] + }, + "application/beep+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/calendar+json": { + "source": "iana", + "compressible": true + }, + "application/calendar+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xcs"] + }, + "application/call-completion": { + "source": "iana" + }, + "application/cals-1840": { + "source": "iana" + }, + "application/captive+json": { + "source": "iana", + "compressible": true + }, + "application/cbor": { + "source": "iana" + }, + "application/cbor-seq": { + "source": "iana" + }, + "application/cccex": { + "source": "iana" + }, + "application/ccmp+xml": { + "source": "iana", + "compressible": true + }, + "application/ccxml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["ccxml"] + }, + "application/cdfx+xml": { + "source": "iana", + "compressible": true, + "extensions": ["cdfx"] + }, + "application/cdmi-capability": { + "source": "iana", + "extensions": ["cdmia"] + }, + "application/cdmi-container": { + "source": "iana", + "extensions": ["cdmic"] + }, + "application/cdmi-domain": { + "source": "iana", + "extensions": ["cdmid"] + }, + "application/cdmi-object": { + "source": "iana", + "extensions": ["cdmio"] + }, + "application/cdmi-queue": { + "source": "iana", + "extensions": ["cdmiq"] + }, + "application/cdni": { + "source": "iana" + }, + "application/cea": { + "source": "iana" + }, + "application/cea-2018+xml": { + "source": "iana", + "compressible": true + }, + "application/cellml+xml": { + "source": "iana", + "compressible": true + }, + "application/cfw": { + "source": "iana" + }, + "application/clr": { + "source": "iana" + }, + "application/clue+xml": { + "source": "iana", + "compressible": true + }, + "application/clue_info+xml": { + "source": "iana", + "compressible": true + }, + "application/cms": { + "source": "iana" + }, + "application/cnrp+xml": { + "source": "iana", + "compressible": true + }, + "application/coap-group+json": { + "source": "iana", + "compressible": true + }, + "application/coap-payload": { + "source": "iana" + }, + "application/commonground": { + "source": "iana" + }, + "application/conference-info+xml": { + "source": "iana", + "compressible": true + }, + "application/cose": { + "source": "iana" + }, + "application/cose-key": { + "source": "iana" + }, + "application/cose-key-set": { + "source": "iana" + }, + "application/cpl+xml": { + "source": "iana", + "compressible": true + }, + "application/csrattrs": { + "source": "iana" + }, + "application/csta+xml": { + "source": "iana", + "compressible": true + }, + "application/cstadata+xml": { + "source": "iana", + "compressible": true + }, + "application/csvm+json": { + "source": "iana", + "compressible": true + }, + "application/cu-seeme": { + "source": "apache", + "extensions": ["cu"] + }, + "application/cwt": { + "source": "iana" + }, + "application/cybercash": { + "source": "iana" + }, + "application/dart": { + "compressible": true + }, + "application/dash+xml": { + "source": "iana", + "compressible": true, + "extensions": ["mpd"] + }, + "application/dashdelta": { + "source": "iana" + }, + "application/davmount+xml": { + "source": "iana", + "compressible": true, + "extensions": ["davmount"] + }, + "application/dca-rft": { + "source": "iana" + }, + "application/dcd": { + "source": "iana" + }, + "application/dec-dx": { + "source": "iana" + }, + "application/dialog-info+xml": { + "source": "iana", + "compressible": true + }, + "application/dicom": { + "source": "iana" + }, + "application/dicom+json": { + "source": "iana", + "compressible": true + }, + "application/dicom+xml": { + "source": "iana", + "compressible": true + }, + "application/dii": { + "source": "iana" + }, + "application/dit": { + "source": "iana" + }, + "application/dns": { + "source": "iana" + }, + "application/dns+json": { + "source": "iana", + "compressible": true + }, + "application/dns-message": { + "source": "iana" + }, + "application/docbook+xml": { + "source": "apache", + "compressible": true, + "extensions": ["dbk"] + }, + "application/dots+cbor": { + "source": "iana" + }, + "application/dskpp+xml": { + "source": "iana", + "compressible": true + }, + "application/dssc+der": { + "source": "iana", + "extensions": ["dssc"] + }, + "application/dssc+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xdssc"] + }, + "application/dvcs": { + "source": "iana" + }, + "application/ecmascript": { + "source": "iana", + "compressible": true, + "extensions": ["ecma","es"] + }, + "application/edi-consent": { + "source": "iana" + }, + "application/edi-x12": { + "source": "iana", + "compressible": false + }, + "application/edifact": { + "source": "iana", + "compressible": false + }, + "application/efi": { + "source": "iana" + }, + "application/elm+json": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/elm+xml": { + "source": "iana", + "compressible": true + }, + "application/emergencycalldata.cap+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/emergencycalldata.comment+xml": { + "source": "iana", + "compressible": true + }, + "application/emergencycalldata.control+xml": { + "source": "iana", + "compressible": true + }, + "application/emergencycalldata.deviceinfo+xml": { + "source": "iana", + "compressible": true + }, + "application/emergencycalldata.ecall.msd": { + "source": "iana" + }, + "application/emergencycalldata.providerinfo+xml": { + "source": "iana", + "compressible": true + }, + "application/emergencycalldata.serviceinfo+xml": { + "source": "iana", + "compressible": true + }, + "application/emergencycalldata.subscriberinfo+xml": { + "source": "iana", + "compressible": true + }, + "application/emergencycalldata.veds+xml": { + "source": "iana", + "compressible": true + }, + "application/emma+xml": { + "source": "iana", + "compressible": true, + "extensions": ["emma"] + }, + "application/emotionml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["emotionml"] + }, + "application/encaprtp": { + "source": "iana" + }, + "application/epp+xml": { + "source": "iana", + "compressible": true + }, + "application/epub+zip": { + "source": "iana", + "compressible": false, + "extensions": ["epub"] + }, + "application/eshop": { + "source": "iana" + }, + "application/exi": { + "source": "iana", + "extensions": ["exi"] + }, + "application/expect-ct-report+json": { + "source": "iana", + "compressible": true + }, + "application/fastinfoset": { + "source": "iana" + }, + "application/fastsoap": { + "source": "iana" + }, + "application/fdt+xml": { + "source": "iana", + "compressible": true, + "extensions": ["fdt"] + }, + "application/fhir+json": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/fhir+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/fido.trusted-apps+json": { + "compressible": true + }, + "application/fits": { + "source": "iana" + }, + "application/flexfec": { + "source": "iana" + }, + "application/font-sfnt": { + "source": "iana" + }, + "application/font-tdpfr": { + "source": "iana", + "extensions": ["pfr"] + }, + "application/font-woff": { + "source": "iana", + "compressible": false + }, + "application/framework-attributes+xml": { + "source": "iana", + "compressible": true + }, + "application/geo+json": { + "source": "iana", + "compressible": true, + "extensions": ["geojson"] + }, + "application/geo+json-seq": { + "source": "iana" + }, + "application/geopackage+sqlite3": { + "source": "iana" + }, + "application/geoxacml+xml": { + "source": "iana", + "compressible": true + }, + "application/gltf-buffer": { + "source": "iana" + }, + "application/gml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["gml"] + }, + "application/gpx+xml": { + "source": "apache", + "compressible": true, + "extensions": ["gpx"] + }, + "application/gxf": { + "source": "apache", + "extensions": ["gxf"] + }, + "application/gzip": { + "source": "iana", + "compressible": false, + "extensions": ["gz"] + }, + "application/h224": { + "source": "iana" + }, + "application/held+xml": { + "source": "iana", + "compressible": true + }, + "application/hjson": { + "extensions": ["hjson"] + }, + "application/http": { + "source": "iana" + }, + "application/hyperstudio": { + "source": "iana", + "extensions": ["stk"] + }, + "application/ibe-key-request+xml": { + "source": "iana", + "compressible": true + }, + "application/ibe-pkg-reply+xml": { + "source": "iana", + "compressible": true + }, + "application/ibe-pp-data": { + "source": "iana" + }, + "application/iges": { + "source": "iana" + }, + "application/im-iscomposing+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/index": { + "source": "iana" + }, + "application/index.cmd": { + "source": "iana" + }, + "application/index.obj": { + "source": "iana" + }, + "application/index.response": { + "source": "iana" + }, + "application/index.vnd": { + "source": "iana" + }, + "application/inkml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["ink","inkml"] + }, + "application/iotp": { + "source": "iana" + }, + "application/ipfix": { + "source": "iana", + "extensions": ["ipfix"] + }, + "application/ipp": { + "source": "iana" + }, + "application/isup": { + "source": "iana" + }, + "application/its+xml": { + "source": "iana", + "compressible": true, + "extensions": ["its"] + }, + "application/java-archive": { + "source": "apache", + "compressible": false, + "extensions": ["jar","war","ear"] + }, + "application/java-serialized-object": { + "source": "apache", + "compressible": false, + "extensions": ["ser"] + }, + "application/java-vm": { + "source": "apache", + "compressible": false, + "extensions": ["class"] + }, + "application/javascript": { + "source": "iana", + "charset": "UTF-8", + "compressible": true, + "extensions": ["js","mjs"] + }, + "application/jf2feed+json": { + "source": "iana", + "compressible": true + }, + "application/jose": { + "source": "iana" + }, + "application/jose+json": { + "source": "iana", + "compressible": true + }, + "application/jrd+json": { + "source": "iana", + "compressible": true + }, + "application/jscalendar+json": { + "source": "iana", + "compressible": true + }, + "application/json": { + "source": "iana", + "charset": "UTF-8", + "compressible": true, + "extensions": ["json","map"] + }, + "application/json-patch+json": { + "source": "iana", + "compressible": true + }, + "application/json-seq": { + "source": "iana" + }, + "application/json5": { + "extensions": ["json5"] + }, + "application/jsonml+json": { + "source": "apache", + "compressible": true, + "extensions": ["jsonml"] + }, + "application/jwk+json": { + "source": "iana", + "compressible": true + }, + "application/jwk-set+json": { + "source": "iana", + "compressible": true + }, + "application/jwt": { + "source": "iana" + }, + "application/kpml-request+xml": { + "source": "iana", + "compressible": true + }, + "application/kpml-response+xml": { + "source": "iana", + "compressible": true + }, + "application/ld+json": { + "source": "iana", + "compressible": true, + "extensions": ["jsonld"] + }, + "application/lgr+xml": { + "source": "iana", + "compressible": true, + "extensions": ["lgr"] + }, + "application/link-format": { + "source": "iana" + }, + "application/load-control+xml": { + "source": "iana", + "compressible": true + }, + "application/lost+xml": { + "source": "iana", + "compressible": true, + "extensions": ["lostxml"] + }, + "application/lostsync+xml": { + "source": "iana", + "compressible": true + }, + "application/lpf+zip": { + "source": "iana", + "compressible": false + }, + "application/lxf": { + "source": "iana" + }, + "application/mac-binhex40": { + "source": "iana", + "extensions": ["hqx"] + }, + "application/mac-compactpro": { + "source": "apache", + "extensions": ["cpt"] + }, + "application/macwriteii": { + "source": "iana" + }, + "application/mads+xml": { + "source": "iana", + "compressible": true, + "extensions": ["mads"] + }, + "application/manifest+json": { + "charset": "UTF-8", + "compressible": true, + "extensions": ["webmanifest"] + }, + "application/marc": { + "source": "iana", + "extensions": ["mrc"] + }, + "application/marcxml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["mrcx"] + }, + "application/mathematica": { + "source": "iana", + "extensions": ["ma","nb","mb"] + }, + "application/mathml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["mathml"] + }, + "application/mathml-content+xml": { + "source": "iana", + "compressible": true + }, + "application/mathml-presentation+xml": { + "source": "iana", + "compressible": true + }, + "application/mbms-associated-procedure-description+xml": { + "source": "iana", + "compressible": true + }, + "application/mbms-deregister+xml": { + "source": "iana", + "compressible": true + }, + "application/mbms-envelope+xml": { + "source": "iana", + "compressible": true + }, + "application/mbms-msk+xml": { + "source": "iana", + "compressible": true + }, + "application/mbms-msk-response+xml": { + "source": "iana", + "compressible": true + }, + "application/mbms-protection-description+xml": { + "source": "iana", + "compressible": true + }, + "application/mbms-reception-report+xml": { + "source": "iana", + "compressible": true + }, + "application/mbms-register+xml": { + "source": "iana", + "compressible": true + }, + "application/mbms-register-response+xml": { + "source": "iana", + "compressible": true + }, + "application/mbms-schedule+xml": { + "source": "iana", + "compressible": true + }, + "application/mbms-user-service-description+xml": { + "source": "iana", + "compressible": true + }, + "application/mbox": { + "source": "iana", + "extensions": ["mbox"] + }, + "application/media-policy-dataset+xml": { + "source": "iana", + "compressible": true + }, + "application/media_control+xml": { + "source": "iana", + "compressible": true + }, + "application/mediaservercontrol+xml": { + "source": "iana", + "compressible": true, + "extensions": ["mscml"] + }, + "application/merge-patch+json": { + "source": "iana", + "compressible": true + }, + "application/metalink+xml": { + "source": "apache", + "compressible": true, + "extensions": ["metalink"] + }, + "application/metalink4+xml": { + "source": "iana", + "compressible": true, + "extensions": ["meta4"] + }, + "application/mets+xml": { + "source": "iana", + "compressible": true, + "extensions": ["mets"] + }, + "application/mf4": { + "source": "iana" + }, + "application/mikey": { + "source": "iana" + }, + "application/mipc": { + "source": "iana" + }, + "application/mmt-aei+xml": { + "source": "iana", + "compressible": true, + "extensions": ["maei"] + }, + "application/mmt-usd+xml": { + "source": "iana", + "compressible": true, + "extensions": ["musd"] + }, + "application/mods+xml": { + "source": "iana", + "compressible": true, + "extensions": ["mods"] + }, + "application/moss-keys": { + "source": "iana" + }, + "application/moss-signature": { + "source": "iana" + }, + "application/mosskey-data": { + "source": "iana" + }, + "application/mosskey-request": { + "source": "iana" + }, + "application/mp21": { + "source": "iana", + "extensions": ["m21","mp21"] + }, + "application/mp4": { + "source": "iana", + "extensions": ["mp4s","m4p"] + }, + "application/mpeg4-generic": { + "source": "iana" + }, + "application/mpeg4-iod": { + "source": "iana" + }, + "application/mpeg4-iod-xmt": { + "source": "iana" + }, + "application/mrb-consumer+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xdf"] + }, + "application/mrb-publish+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xdf"] + }, + "application/msc-ivr+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/msc-mixer+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/msword": { + "source": "iana", + "compressible": false, + "extensions": ["doc","dot"] + }, + "application/mud+json": { + "source": "iana", + "compressible": true + }, + "application/multipart-core": { + "source": "iana" + }, + "application/mxf": { + "source": "iana", + "extensions": ["mxf"] + }, + "application/n-quads": { + "source": "iana", + "extensions": ["nq"] + }, + "application/n-triples": { + "source": "iana", + "extensions": ["nt"] + }, + "application/nasdata": { + "source": "iana" + }, + "application/news-checkgroups": { + "source": "iana", + "charset": "US-ASCII" + }, + "application/news-groupinfo": { + "source": "iana", + "charset": "US-ASCII" + }, + "application/news-transmission": { + "source": "iana" + }, + "application/nlsml+xml": { + "source": "iana", + "compressible": true + }, + "application/node": { + "source": "iana", + "extensions": ["cjs"] + }, + "application/nss": { + "source": "iana" + }, + "application/ocsp-request": { + "source": "iana" + }, + "application/ocsp-response": { + "source": "iana" + }, + "application/octet-stream": { + "source": "iana", + "compressible": false, + "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"] + }, + "application/oda": { + "source": "iana", + "extensions": ["oda"] + }, + "application/odm+xml": { + "source": "iana", + "compressible": true + }, + "application/odx": { + "source": "iana" + }, + "application/oebps-package+xml": { + "source": "iana", + "compressible": true, + "extensions": ["opf"] + }, + "application/ogg": { + "source": "iana", + "compressible": false, + "extensions": ["ogx"] + }, + "application/omdoc+xml": { + "source": "apache", + "compressible": true, + "extensions": ["omdoc"] + }, + "application/onenote": { + "source": "apache", + "extensions": ["onetoc","onetoc2","onetmp","onepkg"] + }, + "application/opc-nodeset+xml": { + "source": "iana", + "compressible": true + }, + "application/oscore": { + "source": "iana" + }, + "application/oxps": { + "source": "iana", + "extensions": ["oxps"] + }, + "application/p2p-overlay+xml": { + "source": "iana", + "compressible": true, + "extensions": ["relo"] + }, + "application/parityfec": { + "source": "iana" + }, + "application/passport": { + "source": "iana" + }, + "application/patch-ops-error+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xer"] + }, + "application/pdf": { + "source": "iana", + "compressible": false, + "extensions": ["pdf"] + }, + "application/pdx": { + "source": "iana" + }, + "application/pem-certificate-chain": { + "source": "iana" + }, + "application/pgp-encrypted": { + "source": "iana", + "compressible": false, + "extensions": ["pgp"] + }, + "application/pgp-keys": { + "source": "iana" + }, + "application/pgp-signature": { + "source": "iana", + "extensions": ["asc","sig"] + }, + "application/pics-rules": { + "source": "apache", + "extensions": ["prf"] + }, + "application/pidf+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/pidf-diff+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/pkcs10": { + "source": "iana", + "extensions": ["p10"] + }, + "application/pkcs12": { + "source": "iana" + }, + "application/pkcs7-mime": { + "source": "iana", + "extensions": ["p7m","p7c"] + }, + "application/pkcs7-signature": { + "source": "iana", + "extensions": ["p7s"] + }, + "application/pkcs8": { + "source": "iana", + "extensions": ["p8"] + }, + "application/pkcs8-encrypted": { + "source": "iana" + }, + "application/pkix-attr-cert": { + "source": "iana", + "extensions": ["ac"] + }, + "application/pkix-cert": { + "source": "iana", + "extensions": ["cer"] + }, + "application/pkix-crl": { + "source": "iana", + "extensions": ["crl"] + }, + "application/pkix-pkipath": { + "source": "iana", + "extensions": ["pkipath"] + }, + "application/pkixcmp": { + "source": "iana", + "extensions": ["pki"] + }, + "application/pls+xml": { + "source": "iana", + "compressible": true, + "extensions": ["pls"] + }, + "application/poc-settings+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/postscript": { + "source": "iana", + "compressible": true, + "extensions": ["ai","eps","ps"] + }, + "application/ppsp-tracker+json": { + "source": "iana", + "compressible": true + }, + "application/problem+json": { + "source": "iana", + "compressible": true + }, + "application/problem+xml": { + "source": "iana", + "compressible": true + }, + "application/provenance+xml": { + "source": "iana", + "compressible": true, + "extensions": ["provx"] + }, + "application/prs.alvestrand.titrax-sheet": { + "source": "iana" + }, + "application/prs.cww": { + "source": "iana", + "extensions": ["cww"] + }, + "application/prs.cyn": { + "source": "iana", + "charset": "7-BIT" + }, + "application/prs.hpub+zip": { + "source": "iana", + "compressible": false + }, + "application/prs.nprend": { + "source": "iana" + }, + "application/prs.plucker": { + "source": "iana" + }, + "application/prs.rdf-xml-crypt": { + "source": "iana" + }, + "application/prs.xsf+xml": { + "source": "iana", + "compressible": true + }, + "application/pskc+xml": { + "source": "iana", + "compressible": true, + "extensions": ["pskcxml"] + }, + "application/pvd+json": { + "source": "iana", + "compressible": true + }, + "application/qsig": { + "source": "iana" + }, + "application/raml+yaml": { + "compressible": true, + "extensions": ["raml"] + }, + "application/raptorfec": { + "source": "iana" + }, + "application/rdap+json": { + "source": "iana", + "compressible": true + }, + "application/rdf+xml": { + "source": "iana", + "compressible": true, + "extensions": ["rdf","owl"] + }, + "application/reginfo+xml": { + "source": "iana", + "compressible": true, + "extensions": ["rif"] + }, + "application/relax-ng-compact-syntax": { + "source": "iana", + "extensions": ["rnc"] + }, + "application/remote-printing": { + "source": "iana" + }, + "application/reputon+json": { + "source": "iana", + "compressible": true + }, + "application/resource-lists+xml": { + "source": "iana", + "compressible": true, + "extensions": ["rl"] + }, + "application/resource-lists-diff+xml": { + "source": "iana", + "compressible": true, + "extensions": ["rld"] + }, + "application/rfc+xml": { + "source": "iana", + "compressible": true + }, + "application/riscos": { + "source": "iana" + }, + "application/rlmi+xml": { + "source": "iana", + "compressible": true + }, + "application/rls-services+xml": { + "source": "iana", + "compressible": true, + "extensions": ["rs"] + }, + "application/route-apd+xml": { + "source": "iana", + "compressible": true, + "extensions": ["rapd"] + }, + "application/route-s-tsid+xml": { + "source": "iana", + "compressible": true, + "extensions": ["sls"] + }, + "application/route-usd+xml": { + "source": "iana", + "compressible": true, + "extensions": ["rusd"] + }, + "application/rpki-ghostbusters": { + "source": "iana", + "extensions": ["gbr"] + }, + "application/rpki-manifest": { + "source": "iana", + "extensions": ["mft"] + }, + "application/rpki-publication": { + "source": "iana" + }, + "application/rpki-roa": { + "source": "iana", + "extensions": ["roa"] + }, + "application/rpki-updown": { + "source": "iana" + }, + "application/rsd+xml": { + "source": "apache", + "compressible": true, + "extensions": ["rsd"] + }, + "application/rss+xml": { + "source": "apache", + "compressible": true, + "extensions": ["rss"] + }, + "application/rtf": { + "source": "iana", + "compressible": true, + "extensions": ["rtf"] + }, + "application/rtploopback": { + "source": "iana" + }, + "application/rtx": { + "source": "iana" + }, + "application/samlassertion+xml": { + "source": "iana", + "compressible": true + }, + "application/samlmetadata+xml": { + "source": "iana", + "compressible": true + }, + "application/sarif+json": { + "source": "iana", + "compressible": true + }, + "application/sbe": { + "source": "iana" + }, + "application/sbml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["sbml"] + }, + "application/scaip+xml": { + "source": "iana", + "compressible": true + }, + "application/scim+json": { + "source": "iana", + "compressible": true + }, + "application/scvp-cv-request": { + "source": "iana", + "extensions": ["scq"] + }, + "application/scvp-cv-response": { + "source": "iana", + "extensions": ["scs"] + }, + "application/scvp-vp-request": { + "source": "iana", + "extensions": ["spq"] + }, + "application/scvp-vp-response": { + "source": "iana", + "extensions": ["spp"] + }, + "application/sdp": { + "source": "iana", + "extensions": ["sdp"] + }, + "application/secevent+jwt": { + "source": "iana" + }, + "application/senml+cbor": { + "source": "iana" + }, + "application/senml+json": { + "source": "iana", + "compressible": true + }, + "application/senml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["senmlx"] + }, + "application/senml-etch+cbor": { + "source": "iana" + }, + "application/senml-etch+json": { + "source": "iana", + "compressible": true + }, + "application/senml-exi": { + "source": "iana" + }, + "application/sensml+cbor": { + "source": "iana" + }, + "application/sensml+json": { + "source": "iana", + "compressible": true + }, + "application/sensml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["sensmlx"] + }, + "application/sensml-exi": { + "source": "iana" + }, + "application/sep+xml": { + "source": "iana", + "compressible": true + }, + "application/sep-exi": { + "source": "iana" + }, + "application/session-info": { + "source": "iana" + }, + "application/set-payment": { + "source": "iana" + }, + "application/set-payment-initiation": { + "source": "iana", + "extensions": ["setpay"] + }, + "application/set-registration": { + "source": "iana" + }, + "application/set-registration-initiation": { + "source": "iana", + "extensions": ["setreg"] + }, + "application/sgml": { + "source": "iana" + }, + "application/sgml-open-catalog": { + "source": "iana" + }, + "application/shf+xml": { + "source": "iana", + "compressible": true, + "extensions": ["shf"] + }, + "application/sieve": { + "source": "iana", + "extensions": ["siv","sieve"] + }, + "application/simple-filter+xml": { + "source": "iana", + "compressible": true + }, + "application/simple-message-summary": { + "source": "iana" + }, + "application/simplesymbolcontainer": { + "source": "iana" + }, + "application/sipc": { + "source": "iana" + }, + "application/slate": { + "source": "iana" + }, + "application/smil": { + "source": "iana" + }, + "application/smil+xml": { + "source": "iana", + "compressible": true, + "extensions": ["smi","smil"] + }, + "application/smpte336m": { + "source": "iana" + }, + "application/soap+fastinfoset": { + "source": "iana" + }, + "application/soap+xml": { + "source": "iana", + "compressible": true + }, + "application/sparql-query": { + "source": "iana", + "extensions": ["rq"] + }, + "application/sparql-results+xml": { + "source": "iana", + "compressible": true, + "extensions": ["srx"] + }, + "application/spirits-event+xml": { + "source": "iana", + "compressible": true + }, + "application/sql": { + "source": "iana" + }, + "application/srgs": { + "source": "iana", + "extensions": ["gram"] + }, + "application/srgs+xml": { + "source": "iana", + "compressible": true, + "extensions": ["grxml"] + }, + "application/sru+xml": { + "source": "iana", + "compressible": true, + "extensions": ["sru"] + }, + "application/ssdl+xml": { + "source": "apache", + "compressible": true, + "extensions": ["ssdl"] + }, + "application/ssml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["ssml"] + }, + "application/stix+json": { + "source": "iana", + "compressible": true + }, + "application/swid+xml": { + "source": "iana", + "compressible": true, + "extensions": ["swidtag"] + }, + "application/tamp-apex-update": { + "source": "iana" + }, + "application/tamp-apex-update-confirm": { + "source": "iana" + }, + "application/tamp-community-update": { + "source": "iana" + }, + "application/tamp-community-update-confirm": { + "source": "iana" + }, + "application/tamp-error": { + "source": "iana" + }, + "application/tamp-sequence-adjust": { + "source": "iana" + }, + "application/tamp-sequence-adjust-confirm": { + "source": "iana" + }, + "application/tamp-status-query": { + "source": "iana" + }, + "application/tamp-status-response": { + "source": "iana" + }, + "application/tamp-update": { + "source": "iana" + }, + "application/tamp-update-confirm": { + "source": "iana" + }, + "application/tar": { + "compressible": true + }, + "application/taxii+json": { + "source": "iana", + "compressible": true + }, + "application/td+json": { + "source": "iana", + "compressible": true + }, + "application/tei+xml": { + "source": "iana", + "compressible": true, + "extensions": ["tei","teicorpus"] + }, + "application/tetra_isi": { + "source": "iana" + }, + "application/thraud+xml": { + "source": "iana", + "compressible": true, + "extensions": ["tfi"] + }, + "application/timestamp-query": { + "source": "iana" + }, + "application/timestamp-reply": { + "source": "iana" + }, + "application/timestamped-data": { + "source": "iana", + "extensions": ["tsd"] + }, + "application/tlsrpt+gzip": { + "source": "iana" + }, + "application/tlsrpt+json": { + "source": "iana", + "compressible": true + }, + "application/tnauthlist": { + "source": "iana" + }, + "application/toml": { + "compressible": true, + "extensions": ["toml"] + }, + "application/trickle-ice-sdpfrag": { + "source": "iana" + }, + "application/trig": { + "source": "iana" + }, + "application/ttml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["ttml"] + }, + "application/tve-trigger": { + "source": "iana" + }, + "application/tzif": { + "source": "iana" + }, + "application/tzif-leap": { + "source": "iana" + }, + "application/ubjson": { + "compressible": false, + "extensions": ["ubj"] + }, + "application/ulpfec": { + "source": "iana" + }, + "application/urc-grpsheet+xml": { + "source": "iana", + "compressible": true + }, + "application/urc-ressheet+xml": { + "source": "iana", + "compressible": true, + "extensions": ["rsheet"] + }, + "application/urc-targetdesc+xml": { + "source": "iana", + "compressible": true, + "extensions": ["td"] + }, + "application/urc-uisocketdesc+xml": { + "source": "iana", + "compressible": true + }, + "application/vcard+json": { + "source": "iana", + "compressible": true + }, + "application/vcard+xml": { + "source": "iana", + "compressible": true + }, + "application/vemmi": { + "source": "iana" + }, + "application/vividence.scriptfile": { + "source": "apache" + }, + "application/vnd.1000minds.decision-model+xml": { + "source": "iana", + "compressible": true, + "extensions": ["1km"] + }, + "application/vnd.3gpp-prose+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp-prose-pc3ch+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp-v2x-local-service-information": { + "source": "iana" + }, + "application/vnd.3gpp.access-transfer-events+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.bsf+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.gmop+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.interworking-data": { + "source": "iana" + }, + "application/vnd.3gpp.mc-signalling-ear": { + "source": "iana" + }, + "application/vnd.3gpp.mcdata-affiliation-command+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcdata-info+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcdata-payload": { + "source": "iana" + }, + "application/vnd.3gpp.mcdata-service-config+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcdata-signalling": { + "source": "iana" + }, + "application/vnd.3gpp.mcdata-ue-config+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcdata-user-profile+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcptt-affiliation-command+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcptt-floor-request+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcptt-info+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcptt-location-info+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcptt-mbms-usage-info+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcptt-service-config+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcptt-signed+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcptt-ue-config+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcptt-ue-init-config+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcptt-user-profile+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcvideo-affiliation-command+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcvideo-affiliation-info+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcvideo-info+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcvideo-location-info+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcvideo-mbms-usage-info+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcvideo-service-config+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcvideo-transmission-request+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcvideo-ue-config+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mcvideo-user-profile+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.mid-call+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.pic-bw-large": { + "source": "iana", + "extensions": ["plb"] + }, + "application/vnd.3gpp.pic-bw-small": { + "source": "iana", + "extensions": ["psb"] + }, + "application/vnd.3gpp.pic-bw-var": { + "source": "iana", + "extensions": ["pvb"] + }, + "application/vnd.3gpp.sms": { + "source": "iana" + }, + "application/vnd.3gpp.sms+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.srvcc-ext+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.srvcc-info+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.state-and-event-info+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp.ussd+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp2.bcmcsinfo+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.3gpp2.sms": { + "source": "iana" + }, + "application/vnd.3gpp2.tcap": { + "source": "iana", + "extensions": ["tcap"] + }, + "application/vnd.3lightssoftware.imagescal": { + "source": "iana" + }, + "application/vnd.3m.post-it-notes": { + "source": "iana", + "extensions": ["pwn"] + }, + "application/vnd.accpac.simply.aso": { + "source": "iana", + "extensions": ["aso"] + }, + "application/vnd.accpac.simply.imp": { + "source": "iana", + "extensions": ["imp"] + }, + "application/vnd.acucobol": { + "source": "iana", + "extensions": ["acu"] + }, + "application/vnd.acucorp": { + "source": "iana", + "extensions": ["atc","acutc"] + }, + "application/vnd.adobe.air-application-installer-package+zip": { + "source": "apache", + "compressible": false, + "extensions": ["air"] + }, + "application/vnd.adobe.flash.movie": { + "source": "iana" + }, + "application/vnd.adobe.formscentral.fcdt": { + "source": "iana", + "extensions": ["fcdt"] + }, + "application/vnd.adobe.fxp": { + "source": "iana", + "extensions": ["fxp","fxpl"] + }, + "application/vnd.adobe.partial-upload": { + "source": "iana" + }, + "application/vnd.adobe.xdp+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xdp"] + }, + "application/vnd.adobe.xfdf": { + "source": "iana", + "extensions": ["xfdf"] + }, + "application/vnd.aether.imp": { + "source": "iana" + }, + "application/vnd.afpc.afplinedata": { + "source": "iana" + }, + "application/vnd.afpc.afplinedata-pagedef": { + "source": "iana" + }, + "application/vnd.afpc.cmoca-cmresource": { + "source": "iana" + }, + "application/vnd.afpc.foca-charset": { + "source": "iana" + }, + "application/vnd.afpc.foca-codedfont": { + "source": "iana" + }, + "application/vnd.afpc.foca-codepage": { + "source": "iana" + }, + "application/vnd.afpc.modca": { + "source": "iana" + }, + "application/vnd.afpc.modca-cmtable": { + "source": "iana" + }, + "application/vnd.afpc.modca-formdef": { + "source": "iana" + }, + "application/vnd.afpc.modca-mediummap": { + "source": "iana" + }, + "application/vnd.afpc.modca-objectcontainer": { + "source": "iana" + }, + "application/vnd.afpc.modca-overlay": { + "source": "iana" + }, + "application/vnd.afpc.modca-pagesegment": { + "source": "iana" + }, + "application/vnd.ah-barcode": { + "source": "iana" + }, + "application/vnd.ahead.space": { + "source": "iana", + "extensions": ["ahead"] + }, + "application/vnd.airzip.filesecure.azf": { + "source": "iana", + "extensions": ["azf"] + }, + "application/vnd.airzip.filesecure.azs": { + "source": "iana", + "extensions": ["azs"] + }, + "application/vnd.amadeus+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.amazon.ebook": { + "source": "apache", + "extensions": ["azw"] + }, + "application/vnd.amazon.mobi8-ebook": { + "source": "iana" + }, + "application/vnd.americandynamics.acc": { + "source": "iana", + "extensions": ["acc"] + }, + "application/vnd.amiga.ami": { + "source": "iana", + "extensions": ["ami"] + }, + "application/vnd.amundsen.maze+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.android.ota": { + "source": "iana" + }, + "application/vnd.android.package-archive": { + "source": "apache", + "compressible": false, + "extensions": ["apk"] + }, + "application/vnd.anki": { + "source": "iana" + }, + "application/vnd.anser-web-certificate-issue-initiation": { + "source": "iana", + "extensions": ["cii"] + }, + "application/vnd.anser-web-funds-transfer-initiation": { + "source": "apache", + "extensions": ["fti"] + }, + "application/vnd.antix.game-component": { + "source": "iana", + "extensions": ["atx"] + }, + "application/vnd.apache.thrift.binary": { + "source": "iana" + }, + "application/vnd.apache.thrift.compact": { + "source": "iana" + }, + "application/vnd.apache.thrift.json": { + "source": "iana" + }, + "application/vnd.api+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.aplextor.warrp+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.apothekende.reservation+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.apple.installer+xml": { + "source": "iana", + "compressible": true, + "extensions": ["mpkg"] + }, + "application/vnd.apple.keynote": { + "source": "iana", + "extensions": ["key"] + }, + "application/vnd.apple.mpegurl": { + "source": "iana", + "extensions": ["m3u8"] + }, + "application/vnd.apple.numbers": { + "source": "iana", + "extensions": ["numbers"] + }, + "application/vnd.apple.pages": { + "source": "iana", + "extensions": ["pages"] + }, + "application/vnd.apple.pkpass": { + "compressible": false, + "extensions": ["pkpass"] + }, + "application/vnd.arastra.swi": { + "source": "iana" + }, + "application/vnd.aristanetworks.swi": { + "source": "iana", + "extensions": ["swi"] + }, + "application/vnd.artisan+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.artsquare": { + "source": "iana" + }, + "application/vnd.astraea-software.iota": { + "source": "iana", + "extensions": ["iota"] + }, + "application/vnd.audiograph": { + "source": "iana", + "extensions": ["aep"] + }, + "application/vnd.autopackage": { + "source": "iana" + }, + "application/vnd.avalon+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.avistar+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.balsamiq.bmml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["bmml"] + }, + "application/vnd.balsamiq.bmpr": { + "source": "iana" + }, + "application/vnd.banana-accounting": { + "source": "iana" + }, + "application/vnd.bbf.usp.error": { + "source": "iana" + }, + "application/vnd.bbf.usp.msg": { + "source": "iana" + }, + "application/vnd.bbf.usp.msg+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.bekitzur-stech+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.bint.med-content": { + "source": "iana" + }, + "application/vnd.biopax.rdf+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.blink-idb-value-wrapper": { + "source": "iana" + }, + "application/vnd.blueice.multipass": { + "source": "iana", + "extensions": ["mpm"] + }, + "application/vnd.bluetooth.ep.oob": { + "source": "iana" + }, + "application/vnd.bluetooth.le.oob": { + "source": "iana" + }, + "application/vnd.bmi": { + "source": "iana", + "extensions": ["bmi"] + }, + "application/vnd.bpf": { + "source": "iana" + }, + "application/vnd.bpf3": { + "source": "iana" + }, + "application/vnd.businessobjects": { + "source": "iana", + "extensions": ["rep"] + }, + "application/vnd.byu.uapi+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.cab-jscript": { + "source": "iana" + }, + "application/vnd.canon-cpdl": { + "source": "iana" + }, + "application/vnd.canon-lips": { + "source": "iana" + }, + "application/vnd.capasystems-pg+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.cendio.thinlinc.clientconf": { + "source": "iana" + }, + "application/vnd.century-systems.tcp_stream": { + "source": "iana" + }, + "application/vnd.chemdraw+xml": { + "source": "iana", + "compressible": true, + "extensions": ["cdxml"] + }, + "application/vnd.chess-pgn": { + "source": "iana" + }, + "application/vnd.chipnuts.karaoke-mmd": { + "source": "iana", + "extensions": ["mmd"] + }, + "application/vnd.ciedi": { + "source": "iana" + }, + "application/vnd.cinderella": { + "source": "iana", + "extensions": ["cdy"] + }, + "application/vnd.cirpack.isdn-ext": { + "source": "iana" + }, + "application/vnd.citationstyles.style+xml": { + "source": "iana", + "compressible": true, + "extensions": ["csl"] + }, + "application/vnd.claymore": { + "source": "iana", + "extensions": ["cla"] + }, + "application/vnd.cloanto.rp9": { + "source": "iana", + "extensions": ["rp9"] + }, + "application/vnd.clonk.c4group": { + "source": "iana", + "extensions": ["c4g","c4d","c4f","c4p","c4u"] + }, + "application/vnd.cluetrust.cartomobile-config": { + "source": "iana", + "extensions": ["c11amc"] + }, + "application/vnd.cluetrust.cartomobile-config-pkg": { + "source": "iana", + "extensions": ["c11amz"] + }, + "application/vnd.coffeescript": { + "source": "iana" + }, + "application/vnd.collabio.xodocuments.document": { + "source": "iana" + }, + "application/vnd.collabio.xodocuments.document-template": { + "source": "iana" + }, + "application/vnd.collabio.xodocuments.presentation": { + "source": "iana" + }, + "application/vnd.collabio.xodocuments.presentation-template": { + "source": "iana" + }, + "application/vnd.collabio.xodocuments.spreadsheet": { + "source": "iana" + }, + "application/vnd.collabio.xodocuments.spreadsheet-template": { + "source": "iana" + }, + "application/vnd.collection+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.collection.doc+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.collection.next+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.comicbook+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.comicbook-rar": { + "source": "iana" + }, + "application/vnd.commerce-battelle": { + "source": "iana" + }, + "application/vnd.commonspace": { + "source": "iana", + "extensions": ["csp"] + }, + "application/vnd.contact.cmsg": { + "source": "iana", + "extensions": ["cdbcmsg"] + }, + "application/vnd.coreos.ignition+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.cosmocaller": { + "source": "iana", + "extensions": ["cmc"] + }, + "application/vnd.crick.clicker": { + "source": "iana", + "extensions": ["clkx"] + }, + "application/vnd.crick.clicker.keyboard": { + "source": "iana", + "extensions": ["clkk"] + }, + "application/vnd.crick.clicker.palette": { + "source": "iana", + "extensions": ["clkp"] + }, + "application/vnd.crick.clicker.template": { + "source": "iana", + "extensions": ["clkt"] + }, + "application/vnd.crick.clicker.wordbank": { + "source": "iana", + "extensions": ["clkw"] + }, + "application/vnd.criticaltools.wbs+xml": { + "source": "iana", + "compressible": true, + "extensions": ["wbs"] + }, + "application/vnd.cryptii.pipe+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.crypto-shade-file": { + "source": "iana" + }, + "application/vnd.ctc-posml": { + "source": "iana", + "extensions": ["pml"] + }, + "application/vnd.ctct.ws+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.cups-pdf": { + "source": "iana" + }, + "application/vnd.cups-postscript": { + "source": "iana" + }, + "application/vnd.cups-ppd": { + "source": "iana", + "extensions": ["ppd"] + }, + "application/vnd.cups-raster": { + "source": "iana" + }, + "application/vnd.cups-raw": { + "source": "iana" + }, + "application/vnd.curl": { + "source": "iana" + }, + "application/vnd.curl.car": { + "source": "apache", + "extensions": ["car"] + }, + "application/vnd.curl.pcurl": { + "source": "apache", + "extensions": ["pcurl"] + }, + "application/vnd.cyan.dean.root+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.cybank": { + "source": "iana" + }, + "application/vnd.cyclonedx+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.cyclonedx+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.d2l.coursepackage1p0+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.d3m-dataset": { + "source": "iana" + }, + "application/vnd.d3m-problem": { + "source": "iana" + }, + "application/vnd.dart": { + "source": "iana", + "compressible": true, + "extensions": ["dart"] + }, + "application/vnd.data-vision.rdz": { + "source": "iana", + "extensions": ["rdz"] + }, + "application/vnd.datapackage+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.dataresource+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.dbf": { + "source": "iana", + "extensions": ["dbf"] + }, + "application/vnd.debian.binary-package": { + "source": "iana" + }, + "application/vnd.dece.data": { + "source": "iana", + "extensions": ["uvf","uvvf","uvd","uvvd"] + }, + "application/vnd.dece.ttml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["uvt","uvvt"] + }, + "application/vnd.dece.unspecified": { + "source": "iana", + "extensions": ["uvx","uvvx"] + }, + "application/vnd.dece.zip": { + "source": "iana", + "extensions": ["uvz","uvvz"] + }, + "application/vnd.denovo.fcselayout-link": { + "source": "iana", + "extensions": ["fe_launch"] + }, + "application/vnd.desmume.movie": { + "source": "iana" + }, + "application/vnd.dir-bi.plate-dl-nosuffix": { + "source": "iana" + }, + "application/vnd.dm.delegation+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.dna": { + "source": "iana", + "extensions": ["dna"] + }, + "application/vnd.document+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.dolby.mlp": { + "source": "apache", + "extensions": ["mlp"] + }, + "application/vnd.dolby.mobile.1": { + "source": "iana" + }, + "application/vnd.dolby.mobile.2": { + "source": "iana" + }, + "application/vnd.doremir.scorecloud-binary-document": { + "source": "iana" + }, + "application/vnd.dpgraph": { + "source": "iana", + "extensions": ["dpg"] + }, + "application/vnd.dreamfactory": { + "source": "iana", + "extensions": ["dfac"] + }, + "application/vnd.drive+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.ds-keypoint": { + "source": "apache", + "extensions": ["kpxx"] + }, + "application/vnd.dtg.local": { + "source": "iana" + }, + "application/vnd.dtg.local.flash": { + "source": "iana" + }, + "application/vnd.dtg.local.html": { + "source": "iana" + }, + "application/vnd.dvb.ait": { + "source": "iana", + "extensions": ["ait"] + }, + "application/vnd.dvb.dvbisl+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.dvb.dvbj": { + "source": "iana" + }, + "application/vnd.dvb.esgcontainer": { + "source": "iana" + }, + "application/vnd.dvb.ipdcdftnotifaccess": { + "source": "iana" + }, + "application/vnd.dvb.ipdcesgaccess": { + "source": "iana" + }, + "application/vnd.dvb.ipdcesgaccess2": { + "source": "iana" + }, + "application/vnd.dvb.ipdcesgpdd": { + "source": "iana" + }, + "application/vnd.dvb.ipdcroaming": { + "source": "iana" + }, + "application/vnd.dvb.iptv.alfec-base": { + "source": "iana" + }, + "application/vnd.dvb.iptv.alfec-enhancement": { + "source": "iana" + }, + "application/vnd.dvb.notif-aggregate-root+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.dvb.notif-container+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.dvb.notif-generic+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.dvb.notif-ia-msglist+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.dvb.notif-ia-registration-request+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.dvb.notif-ia-registration-response+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.dvb.notif-init+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.dvb.pfr": { + "source": "iana" + }, + "application/vnd.dvb.service": { + "source": "iana", + "extensions": ["svc"] + }, + "application/vnd.dxr": { + "source": "iana" + }, + "application/vnd.dynageo": { + "source": "iana", + "extensions": ["geo"] + }, + "application/vnd.dzr": { + "source": "iana" + }, + "application/vnd.easykaraoke.cdgdownload": { + "source": "iana" + }, + "application/vnd.ecdis-update": { + "source": "iana" + }, + "application/vnd.ecip.rlp": { + "source": "iana" + }, + "application/vnd.ecowin.chart": { + "source": "iana", + "extensions": ["mag"] + }, + "application/vnd.ecowin.filerequest": { + "source": "iana" + }, + "application/vnd.ecowin.fileupdate": { + "source": "iana" + }, + "application/vnd.ecowin.series": { + "source": "iana" + }, + "application/vnd.ecowin.seriesrequest": { + "source": "iana" + }, + "application/vnd.ecowin.seriesupdate": { + "source": "iana" + }, + "application/vnd.efi.img": { + "source": "iana" + }, + "application/vnd.efi.iso": { + "source": "iana" + }, + "application/vnd.emclient.accessrequest+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.enliven": { + "source": "iana", + "extensions": ["nml"] + }, + "application/vnd.enphase.envoy": { + "source": "iana" + }, + "application/vnd.eprints.data+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.epson.esf": { + "source": "iana", + "extensions": ["esf"] + }, + "application/vnd.epson.msf": { + "source": "iana", + "extensions": ["msf"] + }, + "application/vnd.epson.quickanime": { + "source": "iana", + "extensions": ["qam"] + }, + "application/vnd.epson.salt": { + "source": "iana", + "extensions": ["slt"] + }, + "application/vnd.epson.ssf": { + "source": "iana", + "extensions": ["ssf"] + }, + "application/vnd.ericsson.quickcall": { + "source": "iana" + }, + "application/vnd.espass-espass+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.eszigno3+xml": { + "source": "iana", + "compressible": true, + "extensions": ["es3","et3"] + }, + "application/vnd.etsi.aoc+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.asic-e+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.etsi.asic-s+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.etsi.cug+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.iptvcommand+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.iptvdiscovery+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.iptvprofile+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.iptvsad-bc+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.iptvsad-cod+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.iptvsad-npvr+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.iptvservice+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.iptvsync+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.iptvueprofile+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.mcid+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.mheg5": { + "source": "iana" + }, + "application/vnd.etsi.overload-control-policy-dataset+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.pstn+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.sci+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.simservs+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.timestamp-token": { + "source": "iana" + }, + "application/vnd.etsi.tsl+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.etsi.tsl.der": { + "source": "iana" + }, + "application/vnd.eudora.data": { + "source": "iana" + }, + "application/vnd.evolv.ecig.profile": { + "source": "iana" + }, + "application/vnd.evolv.ecig.settings": { + "source": "iana" + }, + "application/vnd.evolv.ecig.theme": { + "source": "iana" + }, + "application/vnd.exstream-empower+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.exstream-package": { + "source": "iana" + }, + "application/vnd.ezpix-album": { + "source": "iana", + "extensions": ["ez2"] + }, + "application/vnd.ezpix-package": { + "source": "iana", + "extensions": ["ez3"] + }, + "application/vnd.f-secure.mobile": { + "source": "iana" + }, + "application/vnd.fastcopy-disk-image": { + "source": "iana" + }, + "application/vnd.fdf": { + "source": "iana", + "extensions": ["fdf"] + }, + "application/vnd.fdsn.mseed": { + "source": "iana", + "extensions": ["mseed"] + }, + "application/vnd.fdsn.seed": { + "source": "iana", + "extensions": ["seed","dataless"] + }, + "application/vnd.ffsns": { + "source": "iana" + }, + "application/vnd.ficlab.flb+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.filmit.zfc": { + "source": "iana" + }, + "application/vnd.fints": { + "source": "iana" + }, + "application/vnd.firemonkeys.cloudcell": { + "source": "iana" + }, + "application/vnd.flographit": { + "source": "iana", + "extensions": ["gph"] + }, + "application/vnd.fluxtime.clip": { + "source": "iana", + "extensions": ["ftc"] + }, + "application/vnd.font-fontforge-sfd": { + "source": "iana" + }, + "application/vnd.framemaker": { + "source": "iana", + "extensions": ["fm","frame","maker","book"] + }, + "application/vnd.frogans.fnc": { + "source": "iana", + "extensions": ["fnc"] + }, + "application/vnd.frogans.ltf": { + "source": "iana", + "extensions": ["ltf"] + }, + "application/vnd.fsc.weblaunch": { + "source": "iana", + "extensions": ["fsc"] + }, + "application/vnd.fujitsu.oasys": { + "source": "iana", + "extensions": ["oas"] + }, + "application/vnd.fujitsu.oasys2": { + "source": "iana", + "extensions": ["oa2"] + }, + "application/vnd.fujitsu.oasys3": { + "source": "iana", + "extensions": ["oa3"] + }, + "application/vnd.fujitsu.oasysgp": { + "source": "iana", + "extensions": ["fg5"] + }, + "application/vnd.fujitsu.oasysprs": { + "source": "iana", + "extensions": ["bh2"] + }, + "application/vnd.fujixerox.art-ex": { + "source": "iana" + }, + "application/vnd.fujixerox.art4": { + "source": "iana" + }, + "application/vnd.fujixerox.ddd": { + "source": "iana", + "extensions": ["ddd"] + }, + "application/vnd.fujixerox.docuworks": { + "source": "iana", + "extensions": ["xdw"] + }, + "application/vnd.fujixerox.docuworks.binder": { + "source": "iana", + "extensions": ["xbd"] + }, + "application/vnd.fujixerox.docuworks.container": { + "source": "iana" + }, + "application/vnd.fujixerox.hbpl": { + "source": "iana" + }, + "application/vnd.fut-misnet": { + "source": "iana" + }, + "application/vnd.futoin+cbor": { + "source": "iana" + }, + "application/vnd.futoin+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.fuzzysheet": { + "source": "iana", + "extensions": ["fzs"] + }, + "application/vnd.genomatix.tuxedo": { + "source": "iana", + "extensions": ["txd"] + }, + "application/vnd.gentics.grd+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.geo+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.geocube+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.geogebra.file": { + "source": "iana", + "extensions": ["ggb"] + }, + "application/vnd.geogebra.slides": { + "source": "iana" + }, + "application/vnd.geogebra.tool": { + "source": "iana", + "extensions": ["ggt"] + }, + "application/vnd.geometry-explorer": { + "source": "iana", + "extensions": ["gex","gre"] + }, + "application/vnd.geonext": { + "source": "iana", + "extensions": ["gxt"] + }, + "application/vnd.geoplan": { + "source": "iana", + "extensions": ["g2w"] + }, + "application/vnd.geospace": { + "source": "iana", + "extensions": ["g3w"] + }, + "application/vnd.gerber": { + "source": "iana" + }, + "application/vnd.globalplatform.card-content-mgt": { + "source": "iana" + }, + "application/vnd.globalplatform.card-content-mgt-response": { + "source": "iana" + }, + "application/vnd.gmx": { + "source": "iana", + "extensions": ["gmx"] + }, + "application/vnd.google-apps.document": { + "compressible": false, + "extensions": ["gdoc"] + }, + "application/vnd.google-apps.presentation": { + "compressible": false, + "extensions": ["gslides"] + }, + "application/vnd.google-apps.spreadsheet": { + "compressible": false, + "extensions": ["gsheet"] + }, + "application/vnd.google-earth.kml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["kml"] + }, + "application/vnd.google-earth.kmz": { + "source": "iana", + "compressible": false, + "extensions": ["kmz"] + }, + "application/vnd.gov.sk.e-form+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.gov.sk.e-form+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.gov.sk.xmldatacontainer+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.grafeq": { + "source": "iana", + "extensions": ["gqf","gqs"] + }, + "application/vnd.gridmp": { + "source": "iana" + }, + "application/vnd.groove-account": { + "source": "iana", + "extensions": ["gac"] + }, + "application/vnd.groove-help": { + "source": "iana", + "extensions": ["ghf"] + }, + "application/vnd.groove-identity-message": { + "source": "iana", + "extensions": ["gim"] + }, + "application/vnd.groove-injector": { + "source": "iana", + "extensions": ["grv"] + }, + "application/vnd.groove-tool-message": { + "source": "iana", + "extensions": ["gtm"] + }, + "application/vnd.groove-tool-template": { + "source": "iana", + "extensions": ["tpl"] + }, + "application/vnd.groove-vcard": { + "source": "iana", + "extensions": ["vcg"] + }, + "application/vnd.hal+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.hal+xml": { + "source": "iana", + "compressible": true, + "extensions": ["hal"] + }, + "application/vnd.handheld-entertainment+xml": { + "source": "iana", + "compressible": true, + "extensions": ["zmm"] + }, + "application/vnd.hbci": { + "source": "iana", + "extensions": ["hbci"] + }, + "application/vnd.hc+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.hcl-bireports": { + "source": "iana" + }, + "application/vnd.hdt": { + "source": "iana" + }, + "application/vnd.heroku+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.hhe.lesson-player": { + "source": "iana", + "extensions": ["les"] + }, + "application/vnd.hp-hpgl": { + "source": "iana", + "extensions": ["hpgl"] + }, + "application/vnd.hp-hpid": { + "source": "iana", + "extensions": ["hpid"] + }, + "application/vnd.hp-hps": { + "source": "iana", + "extensions": ["hps"] + }, + "application/vnd.hp-jlyt": { + "source": "iana", + "extensions": ["jlt"] + }, + "application/vnd.hp-pcl": { + "source": "iana", + "extensions": ["pcl"] + }, + "application/vnd.hp-pclxl": { + "source": "iana", + "extensions": ["pclxl"] + }, + "application/vnd.httphone": { + "source": "iana" + }, + "application/vnd.hydrostatix.sof-data": { + "source": "iana", + "extensions": ["sfd-hdstx"] + }, + "application/vnd.hyper+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.hyper-item+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.hyperdrive+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.hzn-3d-crossword": { + "source": "iana" + }, + "application/vnd.ibm.afplinedata": { + "source": "iana" + }, + "application/vnd.ibm.electronic-media": { + "source": "iana" + }, + "application/vnd.ibm.minipay": { + "source": "iana", + "extensions": ["mpy"] + }, + "application/vnd.ibm.modcap": { + "source": "iana", + "extensions": ["afp","listafp","list3820"] + }, + "application/vnd.ibm.rights-management": { + "source": "iana", + "extensions": ["irm"] + }, + "application/vnd.ibm.secure-container": { + "source": "iana", + "extensions": ["sc"] + }, + "application/vnd.iccprofile": { + "source": "iana", + "extensions": ["icc","icm"] + }, + "application/vnd.ieee.1905": { + "source": "iana" + }, + "application/vnd.igloader": { + "source": "iana", + "extensions": ["igl"] + }, + "application/vnd.imagemeter.folder+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.imagemeter.image+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.immervision-ivp": { + "source": "iana", + "extensions": ["ivp"] + }, + "application/vnd.immervision-ivu": { + "source": "iana", + "extensions": ["ivu"] + }, + "application/vnd.ims.imsccv1p1": { + "source": "iana" + }, + "application/vnd.ims.imsccv1p2": { + "source": "iana" + }, + "application/vnd.ims.imsccv1p3": { + "source": "iana" + }, + "application/vnd.ims.lis.v2.result+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.ims.lti.v2.toolconsumerprofile+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.ims.lti.v2.toolproxy+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.ims.lti.v2.toolproxy.id+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.ims.lti.v2.toolsettings+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.ims.lti.v2.toolsettings.simple+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.informedcontrol.rms+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.informix-visionary": { + "source": "iana" + }, + "application/vnd.infotech.project": { + "source": "iana" + }, + "application/vnd.infotech.project+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.innopath.wamp.notification": { + "source": "iana" + }, + "application/vnd.insors.igm": { + "source": "iana", + "extensions": ["igm"] + }, + "application/vnd.intercon.formnet": { + "source": "iana", + "extensions": ["xpw","xpx"] + }, + "application/vnd.intergeo": { + "source": "iana", + "extensions": ["i2g"] + }, + "application/vnd.intertrust.digibox": { + "source": "iana" + }, + "application/vnd.intertrust.nncp": { + "source": "iana" + }, + "application/vnd.intu.qbo": { + "source": "iana", + "extensions": ["qbo"] + }, + "application/vnd.intu.qfx": { + "source": "iana", + "extensions": ["qfx"] + }, + "application/vnd.iptc.g2.catalogitem+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.iptc.g2.conceptitem+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.iptc.g2.knowledgeitem+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.iptc.g2.newsitem+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.iptc.g2.newsmessage+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.iptc.g2.packageitem+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.iptc.g2.planningitem+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.ipunplugged.rcprofile": { + "source": "iana", + "extensions": ["rcprofile"] + }, + "application/vnd.irepository.package+xml": { + "source": "iana", + "compressible": true, + "extensions": ["irp"] + }, + "application/vnd.is-xpr": { + "source": "iana", + "extensions": ["xpr"] + }, + "application/vnd.isac.fcs": { + "source": "iana", + "extensions": ["fcs"] + }, + "application/vnd.iso11783-10+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.jam": { + "source": "iana", + "extensions": ["jam"] + }, + "application/vnd.japannet-directory-service": { + "source": "iana" + }, + "application/vnd.japannet-jpnstore-wakeup": { + "source": "iana" + }, + "application/vnd.japannet-payment-wakeup": { + "source": "iana" + }, + "application/vnd.japannet-registration": { + "source": "iana" + }, + "application/vnd.japannet-registration-wakeup": { + "source": "iana" + }, + "application/vnd.japannet-setstore-wakeup": { + "source": "iana" + }, + "application/vnd.japannet-verification": { + "source": "iana" + }, + "application/vnd.japannet-verification-wakeup": { + "source": "iana" + }, + "application/vnd.jcp.javame.midlet-rms": { + "source": "iana", + "extensions": ["rms"] + }, + "application/vnd.jisp": { + "source": "iana", + "extensions": ["jisp"] + }, + "application/vnd.joost.joda-archive": { + "source": "iana", + "extensions": ["joda"] + }, + "application/vnd.jsk.isdn-ngn": { + "source": "iana" + }, + "application/vnd.kahootz": { + "source": "iana", + "extensions": ["ktz","ktr"] + }, + "application/vnd.kde.karbon": { + "source": "iana", + "extensions": ["karbon"] + }, + "application/vnd.kde.kchart": { + "source": "iana", + "extensions": ["chrt"] + }, + "application/vnd.kde.kformula": { + "source": "iana", + "extensions": ["kfo"] + }, + "application/vnd.kde.kivio": { + "source": "iana", + "extensions": ["flw"] + }, + "application/vnd.kde.kontour": { + "source": "iana", + "extensions": ["kon"] + }, + "application/vnd.kde.kpresenter": { + "source": "iana", + "extensions": ["kpr","kpt"] + }, + "application/vnd.kde.kspread": { + "source": "iana", + "extensions": ["ksp"] + }, + "application/vnd.kde.kword": { + "source": "iana", + "extensions": ["kwd","kwt"] + }, + "application/vnd.kenameaapp": { + "source": "iana", + "extensions": ["htke"] + }, + "application/vnd.kidspiration": { + "source": "iana", + "extensions": ["kia"] + }, + "application/vnd.kinar": { + "source": "iana", + "extensions": ["kne","knp"] + }, + "application/vnd.koan": { + "source": "iana", + "extensions": ["skp","skd","skt","skm"] + }, + "application/vnd.kodak-descriptor": { + "source": "iana", + "extensions": ["sse"] + }, + "application/vnd.las": { + "source": "iana" + }, + "application/vnd.las.las+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.las.las+xml": { + "source": "iana", + "compressible": true, + "extensions": ["lasxml"] + }, + "application/vnd.laszip": { + "source": "iana" + }, + "application/vnd.leap+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.liberty-request+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.llamagraphics.life-balance.desktop": { + "source": "iana", + "extensions": ["lbd"] + }, + "application/vnd.llamagraphics.life-balance.exchange+xml": { + "source": "iana", + "compressible": true, + "extensions": ["lbe"] + }, + "application/vnd.logipipe.circuit+zip": { + "source": "iana", + "compressible": false + }, + "application/vnd.loom": { + "source": "iana" + }, + "application/vnd.lotus-1-2-3": { + "source": "iana", + "extensions": ["123"] + }, + "application/vnd.lotus-approach": { + "source": "iana", + "extensions": ["apr"] + }, + "application/vnd.lotus-freelance": { + "source": "iana", + "extensions": ["pre"] + }, + "application/vnd.lotus-notes": { + "source": "iana", + "extensions": ["nsf"] + }, + "application/vnd.lotus-organizer": { + "source": "iana", + "extensions": ["org"] + }, + "application/vnd.lotus-screencam": { + "source": "iana", + "extensions": ["scm"] + }, + "application/vnd.lotus-wordpro": { + "source": "iana", + "extensions": ["lwp"] + }, + "application/vnd.macports.portpkg": { + "source": "iana", + "extensions": ["portpkg"] + }, + "application/vnd.mapbox-vector-tile": { + "source": "iana" + }, + "application/vnd.marlin.drm.actiontoken+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.marlin.drm.conftoken+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.marlin.drm.license+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.marlin.drm.mdcf": { + "source": "iana" + }, + "application/vnd.mason+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.maxmind.maxmind-db": { + "source": "iana" + }, + "application/vnd.mcd": { + "source": "iana", + "extensions": ["mcd"] + }, + "application/vnd.medcalcdata": { + "source": "iana", + "extensions": ["mc1"] + }, + "application/vnd.mediastation.cdkey": { + "source": "iana", + "extensions": ["cdkey"] + }, + "application/vnd.meridian-slingshot": { + "source": "iana" + }, + "application/vnd.mfer": { + "source": "iana", + "extensions": ["mwf"] + }, + "application/vnd.mfmp": { + "source": "iana", + "extensions": ["mfm"] + }, + "application/vnd.micro+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.micrografx.flo": { + "source": "iana", + "extensions": ["flo"] + }, + "application/vnd.micrografx.igx": { + "source": "iana", + "extensions": ["igx"] + }, + "application/vnd.microsoft.portable-executable": { + "source": "iana" + }, + "application/vnd.microsoft.windows.thumbnail-cache": { + "source": "iana" + }, + "application/vnd.miele+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.mif": { + "source": "iana", + "extensions": ["mif"] + }, + "application/vnd.minisoft-hp3000-save": { + "source": "iana" + }, + "application/vnd.mitsubishi.misty-guard.trustweb": { + "source": "iana" + }, + "application/vnd.mobius.daf": { + "source": "iana", + "extensions": ["daf"] + }, + "application/vnd.mobius.dis": { + "source": "iana", + "extensions": ["dis"] + }, + "application/vnd.mobius.mbk": { + "source": "iana", + "extensions": ["mbk"] + }, + "application/vnd.mobius.mqy": { + "source": "iana", + "extensions": ["mqy"] + }, + "application/vnd.mobius.msl": { + "source": "iana", + "extensions": ["msl"] + }, + "application/vnd.mobius.plc": { + "source": "iana", + "extensions": ["plc"] + }, + "application/vnd.mobius.txf": { + "source": "iana", + "extensions": ["txf"] + }, + "application/vnd.mophun.application": { + "source": "iana", + "extensions": ["mpn"] + }, + "application/vnd.mophun.certificate": { + "source": "iana", + "extensions": ["mpc"] + }, + "application/vnd.motorola.flexsuite": { + "source": "iana" + }, + "application/vnd.motorola.flexsuite.adsi": { + "source": "iana" + }, + "application/vnd.motorola.flexsuite.fis": { + "source": "iana" + }, + "application/vnd.motorola.flexsuite.gotap": { + "source": "iana" + }, + "application/vnd.motorola.flexsuite.kmr": { + "source": "iana" + }, + "application/vnd.motorola.flexsuite.ttc": { + "source": "iana" + }, + "application/vnd.motorola.flexsuite.wem": { + "source": "iana" + }, + "application/vnd.motorola.iprm": { + "source": "iana" + }, + "application/vnd.mozilla.xul+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xul"] + }, + "application/vnd.ms-3mfdocument": { + "source": "iana" + }, + "application/vnd.ms-artgalry": { + "source": "iana", + "extensions": ["cil"] + }, + "application/vnd.ms-asf": { + "source": "iana" + }, + "application/vnd.ms-cab-compressed": { + "source": "iana", + "extensions": ["cab"] + }, + "application/vnd.ms-color.iccprofile": { + "source": "apache" + }, + "application/vnd.ms-excel": { + "source": "iana", + "compressible": false, + "extensions": ["xls","xlm","xla","xlc","xlt","xlw"] + }, + "application/vnd.ms-excel.addin.macroenabled.12": { + "source": "iana", + "extensions": ["xlam"] + }, + "application/vnd.ms-excel.sheet.binary.macroenabled.12": { + "source": "iana", + "extensions": ["xlsb"] + }, + "application/vnd.ms-excel.sheet.macroenabled.12": { + "source": "iana", + "extensions": ["xlsm"] + }, + "application/vnd.ms-excel.template.macroenabled.12": { + "source": "iana", + "extensions": ["xltm"] + }, + "application/vnd.ms-fontobject": { + "source": "iana", + "compressible": true, + "extensions": ["eot"] + }, + "application/vnd.ms-htmlhelp": { + "source": "iana", + "extensions": ["chm"] + }, + "application/vnd.ms-ims": { + "source": "iana", + "extensions": ["ims"] + }, + "application/vnd.ms-lrm": { + "source": "iana", + "extensions": ["lrm"] + }, + "application/vnd.ms-office.activex+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.ms-officetheme": { + "source": "iana", + "extensions": ["thmx"] + }, + "application/vnd.ms-opentype": { + "source": "apache", + "compressible": true + }, + "application/vnd.ms-outlook": { + "compressible": false, + "extensions": ["msg"] + }, + "application/vnd.ms-package.obfuscated-opentype": { + "source": "apache" + }, + "application/vnd.ms-pki.seccat": { + "source": "apache", + "extensions": ["cat"] + }, + "application/vnd.ms-pki.stl": { + "source": "apache", + "extensions": ["stl"] + }, + "application/vnd.ms-playready.initiator+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.ms-powerpoint": { + "source": "iana", + "compressible": false, + "extensions": ["ppt","pps","pot"] + }, + "application/vnd.ms-powerpoint.addin.macroenabled.12": { + "source": "iana", + "extensions": ["ppam"] + }, + "application/vnd.ms-powerpoint.presentation.macroenabled.12": { + "source": "iana", + "extensions": ["pptm"] + }, + "application/vnd.ms-powerpoint.slide.macroenabled.12": { + "source": "iana", + "extensions": ["sldm"] + }, + "application/vnd.ms-powerpoint.slideshow.macroenabled.12": { + "source": "iana", + "extensions": ["ppsm"] + }, + "application/vnd.ms-powerpoint.template.macroenabled.12": { + "source": "iana", + "extensions": ["potm"] + }, + "application/vnd.ms-printdevicecapabilities+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.ms-printing.printticket+xml": { + "source": "apache", + "compressible": true + }, + "application/vnd.ms-printschematicket+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.ms-project": { + "source": "iana", + "extensions": ["mpp","mpt"] + }, + "application/vnd.ms-tnef": { + "source": "iana" + }, + "application/vnd.ms-windows.devicepairing": { + "source": "iana" + }, + "application/vnd.ms-windows.nwprinting.oob": { + "source": "iana" + }, + "application/vnd.ms-windows.printerpairing": { + "source": "iana" + }, + "application/vnd.ms-windows.wsd.oob": { + "source": "iana" + }, + "application/vnd.ms-wmdrm.lic-chlg-req": { + "source": "iana" + }, + "application/vnd.ms-wmdrm.lic-resp": { + "source": "iana" + }, + "application/vnd.ms-wmdrm.meter-chlg-req": { + "source": "iana" + }, + "application/vnd.ms-wmdrm.meter-resp": { + "source": "iana" + }, + "application/vnd.ms-word.document.macroenabled.12": { + "source": "iana", + "extensions": ["docm"] + }, + "application/vnd.ms-word.template.macroenabled.12": { + "source": "iana", + "extensions": ["dotm"] + }, + "application/vnd.ms-works": { + "source": "iana", + "extensions": ["wps","wks","wcm","wdb"] + }, + "application/vnd.ms-wpl": { + "source": "iana", + "extensions": ["wpl"] + }, + "application/vnd.ms-xpsdocument": { + "source": "iana", + "compressible": false, + "extensions": ["xps"] + }, + "application/vnd.msa-disk-image": { + "source": "iana" + }, + "application/vnd.mseq": { + "source": "iana", + "extensions": ["mseq"] + }, + "application/vnd.msign": { + "source": "iana" + }, + "application/vnd.multiad.creator": { + "source": "iana" + }, + "application/vnd.multiad.creator.cif": { + "source": "iana" + }, + "application/vnd.music-niff": { + "source": "iana" + }, + "application/vnd.musician": { + "source": "iana", + "extensions": ["mus"] + }, + "application/vnd.muvee.style": { + "source": "iana", + "extensions": ["msty"] + }, + "application/vnd.mynfc": { + "source": "iana", + "extensions": ["taglet"] + }, + "application/vnd.ncd.control": { + "source": "iana" + }, + "application/vnd.ncd.reference": { + "source": "iana" + }, + "application/vnd.nearst.inv+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.nervana": { + "source": "iana" + }, + "application/vnd.netfpx": { + "source": "iana" + }, + "application/vnd.neurolanguage.nlu": { + "source": "iana", + "extensions": ["nlu"] + }, + "application/vnd.nimn": { + "source": "iana" + }, + "application/vnd.nintendo.nitro.rom": { + "source": "iana" + }, + "application/vnd.nintendo.snes.rom": { + "source": "iana" + }, + "application/vnd.nitf": { + "source": "iana", + "extensions": ["ntf","nitf"] + }, + "application/vnd.noblenet-directory": { + "source": "iana", + "extensions": ["nnd"] + }, + "application/vnd.noblenet-sealer": { + "source": "iana", + "extensions": ["nns"] + }, + "application/vnd.noblenet-web": { + "source": "iana", + "extensions": ["nnw"] + }, + "application/vnd.nokia.catalogs": { + "source": "iana" + }, + "application/vnd.nokia.conml+wbxml": { + "source": "iana" + }, + "application/vnd.nokia.conml+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.nokia.iptv.config+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.nokia.isds-radio-presets": { + "source": "iana" + }, + "application/vnd.nokia.landmark+wbxml": { + "source": "iana" + }, + "application/vnd.nokia.landmark+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.nokia.landmarkcollection+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.nokia.n-gage.ac+xml": { + "source": "iana", + "compressible": true, + "extensions": ["ac"] + }, + "application/vnd.nokia.n-gage.data": { + "source": "iana", + "extensions": ["ngdat"] + }, + "application/vnd.nokia.n-gage.symbian.install": { + "source": "iana", + "extensions": ["n-gage"] + }, + "application/vnd.nokia.ncd": { + "source": "iana" + }, + "application/vnd.nokia.pcd+wbxml": { + "source": "iana" + }, + "application/vnd.nokia.pcd+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.nokia.radio-preset": { + "source": "iana", + "extensions": ["rpst"] + }, + "application/vnd.nokia.radio-presets": { + "source": "iana", + "extensions": ["rpss"] + }, + "application/vnd.novadigm.edm": { + "source": "iana", + "extensions": ["edm"] + }, + "application/vnd.novadigm.edx": { + "source": "iana", + "extensions": ["edx"] + }, + "application/vnd.novadigm.ext": { + "source": "iana", + "extensions": ["ext"] + }, + "application/vnd.ntt-local.content-share": { + "source": "iana" + }, + "application/vnd.ntt-local.file-transfer": { + "source": "iana" + }, + "application/vnd.ntt-local.ogw_remote-access": { + "source": "iana" + }, + "application/vnd.ntt-local.sip-ta_remote": { + "source": "iana" + }, + "application/vnd.ntt-local.sip-ta_tcp_stream": { + "source": "iana" + }, + "application/vnd.oasis.opendocument.chart": { + "source": "iana", + "extensions": ["odc"] + }, + "application/vnd.oasis.opendocument.chart-template": { + "source": "iana", + "extensions": ["otc"] + }, + "application/vnd.oasis.opendocument.database": { + "source": "iana", + "extensions": ["odb"] + }, + "application/vnd.oasis.opendocument.formula": { + "source": "iana", + "extensions": ["odf"] + }, + "application/vnd.oasis.opendocument.formula-template": { + "source": "iana", + "extensions": ["odft"] + }, + "application/vnd.oasis.opendocument.graphics": { + "source": "iana", + "compressible": false, + "extensions": ["odg"] + }, + "application/vnd.oasis.opendocument.graphics-template": { + "source": "iana", + "extensions": ["otg"] + }, + "application/vnd.oasis.opendocument.image": { + "source": "iana", + "extensions": ["odi"] + }, + "application/vnd.oasis.opendocument.image-template": { + "source": "iana", + "extensions": ["oti"] + }, + "application/vnd.oasis.opendocument.presentation": { + "source": "iana", + "compressible": false, + "extensions": ["odp"] + }, + "application/vnd.oasis.opendocument.presentation-template": { + "source": "iana", + "extensions": ["otp"] + }, + "application/vnd.oasis.opendocument.spreadsheet": { + "source": "iana", + "compressible": false, + "extensions": ["ods"] + }, + "application/vnd.oasis.opendocument.spreadsheet-template": { + "source": "iana", + "extensions": ["ots"] + }, + "application/vnd.oasis.opendocument.text": { + "source": "iana", + "compressible": false, + "extensions": ["odt"] + }, + "application/vnd.oasis.opendocument.text-master": { + "source": "iana", + "extensions": ["odm"] + }, + "application/vnd.oasis.opendocument.text-template": { + "source": "iana", + "extensions": ["ott"] + }, + "application/vnd.oasis.opendocument.text-web": { + "source": "iana", + "extensions": ["oth"] + }, + "application/vnd.obn": { + "source": "iana" + }, + "application/vnd.ocf+cbor": { + "source": "iana" + }, + "application/vnd.oci.image.manifest.v1+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.oftn.l10n+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.oipf.contentaccessdownload+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oipf.contentaccessstreaming+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oipf.cspg-hexbinary": { + "source": "iana" + }, + "application/vnd.oipf.dae.svg+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oipf.dae.xhtml+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oipf.mippvcontrolmessage+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oipf.pae.gem": { + "source": "iana" + }, + "application/vnd.oipf.spdiscovery+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oipf.spdlist+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oipf.ueprofile+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oipf.userprofile+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.olpc-sugar": { + "source": "iana", + "extensions": ["xo"] + }, + "application/vnd.oma-scws-config": { + "source": "iana" + }, + "application/vnd.oma-scws-http-request": { + "source": "iana" + }, + "application/vnd.oma-scws-http-response": { + "source": "iana" + }, + "application/vnd.oma.bcast.associated-procedure-parameter+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.bcast.drm-trigger+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.bcast.imd+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.bcast.ltkm": { + "source": "iana" + }, + "application/vnd.oma.bcast.notification+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.bcast.provisioningtrigger": { + "source": "iana" + }, + "application/vnd.oma.bcast.sgboot": { + "source": "iana" + }, + "application/vnd.oma.bcast.sgdd+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.bcast.sgdu": { + "source": "iana" + }, + "application/vnd.oma.bcast.simple-symbol-container": { + "source": "iana" + }, + "application/vnd.oma.bcast.smartcard-trigger+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.bcast.sprov+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.bcast.stkm": { + "source": "iana" + }, + "application/vnd.oma.cab-address-book+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.cab-feature-handler+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.cab-pcc+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.cab-subs-invite+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.cab-user-prefs+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.dcd": { + "source": "iana" + }, + "application/vnd.oma.dcdc": { + "source": "iana" + }, + "application/vnd.oma.dd2+xml": { + "source": "iana", + "compressible": true, + "extensions": ["dd2"] + }, + "application/vnd.oma.drm.risd+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.group-usage-list+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.lwm2m+cbor": { + "source": "iana" + }, + "application/vnd.oma.lwm2m+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.lwm2m+tlv": { + "source": "iana" + }, + "application/vnd.oma.pal+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.poc.detailed-progress-report+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.poc.final-report+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.poc.groups+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.poc.invocation-descriptor+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.poc.optimized-progress-report+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.push": { + "source": "iana" + }, + "application/vnd.oma.scidm.messages+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.xcap-directory+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.omads-email+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/vnd.omads-file+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/vnd.omads-folder+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/vnd.omaloc-supl-init": { + "source": "iana" + }, + "application/vnd.onepager": { + "source": "iana" + }, + "application/vnd.onepagertamp": { + "source": "iana" + }, + "application/vnd.onepagertamx": { + "source": "iana" + }, + "application/vnd.onepagertat": { + "source": "iana" + }, + "application/vnd.onepagertatp": { + "source": "iana" + }, + "application/vnd.onepagertatx": { + "source": "iana" + }, + "application/vnd.openblox.game+xml": { + "source": "iana", + "compressible": true, + "extensions": ["obgx"] + }, + "application/vnd.openblox.game-binary": { + "source": "iana" + }, + "application/vnd.openeye.oeb": { + "source": "iana" + }, + "application/vnd.openofficeorg.extension": { + "source": "apache", + "extensions": ["oxt"] + }, + "application/vnd.openstreetmap.data+xml": { + "source": "iana", + "compressible": true, + "extensions": ["osm"] + }, + "application/vnd.openxmlformats-officedocument.custom-properties+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.drawing+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.extended-properties+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.presentation": { + "source": "iana", + "compressible": false, + "extensions": ["pptx"] + }, + "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.slide": { + "source": "iana", + "extensions": ["sldx"] + }, + "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.slideshow": { + "source": "iana", + "extensions": ["ppsx"] + }, + "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.template": { + "source": "iana", + "extensions": ["potx"] + }, + "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { + "source": "iana", + "compressible": false, + "extensions": ["xlsx"] + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.template": { + "source": "iana", + "extensions": ["xltx"] + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.theme+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.themeoverride+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.vmldrawing": { + "source": "iana" + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { + "source": "iana", + "compressible": false, + "extensions": ["docx"] + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.template": { + "source": "iana", + "extensions": ["dotx"] + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-package.core-properties+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.openxmlformats-package.relationships+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oracle.resource+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.orange.indata": { + "source": "iana" + }, + "application/vnd.osa.netdeploy": { + "source": "iana" + }, + "application/vnd.osgeo.mapguide.package": { + "source": "iana", + "extensions": ["mgp"] + }, + "application/vnd.osgi.bundle": { + "source": "iana" + }, + "application/vnd.osgi.dp": { + "source": "iana", + "extensions": ["dp"] + }, + "application/vnd.osgi.subsystem": { + "source": "iana", + "extensions": ["esa"] + }, + "application/vnd.otps.ct-kip+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.oxli.countgraph": { + "source": "iana" + }, + "application/vnd.pagerduty+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.palm": { + "source": "iana", + "extensions": ["pdb","pqa","oprc"] + }, + "application/vnd.panoply": { + "source": "iana" + }, + "application/vnd.paos.xml": { + "source": "iana" + }, + "application/vnd.patentdive": { + "source": "iana" + }, + "application/vnd.patientecommsdoc": { + "source": "iana" + }, + "application/vnd.pawaafile": { + "source": "iana", + "extensions": ["paw"] + }, + "application/vnd.pcos": { + "source": "iana" + }, + "application/vnd.pg.format": { + "source": "iana", + "extensions": ["str"] + }, + "application/vnd.pg.osasli": { + "source": "iana", + "extensions": ["ei6"] + }, + "application/vnd.piaccess.application-licence": { + "source": "iana" + }, + "application/vnd.picsel": { + "source": "iana", + "extensions": ["efif"] + }, + "application/vnd.pmi.widget": { + "source": "iana", + "extensions": ["wg"] + }, + "application/vnd.poc.group-advertisement+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.pocketlearn": { + "source": "iana", + "extensions": ["plf"] + }, + "application/vnd.powerbuilder6": { + "source": "iana", + "extensions": ["pbd"] + }, + "application/vnd.powerbuilder6-s": { + "source": "iana" + }, + "application/vnd.powerbuilder7": { + "source": "iana" + }, + "application/vnd.powerbuilder7-s": { + "source": "iana" + }, + "application/vnd.powerbuilder75": { + "source": "iana" + }, + "application/vnd.powerbuilder75-s": { + "source": "iana" + }, + "application/vnd.preminet": { + "source": "iana" + }, + "application/vnd.previewsystems.box": { + "source": "iana", + "extensions": ["box"] + }, + "application/vnd.proteus.magazine": { + "source": "iana", + "extensions": ["mgz"] + }, + "application/vnd.psfs": { + "source": "iana" + }, + "application/vnd.publishare-delta-tree": { + "source": "iana", + "extensions": ["qps"] + }, + "application/vnd.pvi.ptid1": { + "source": "iana", + "extensions": ["ptid"] + }, + "application/vnd.pwg-multiplexed": { + "source": "iana" + }, + "application/vnd.pwg-xhtml-print+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.qualcomm.brew-app-res": { + "source": "iana" + }, + "application/vnd.quarantainenet": { + "source": "iana" + }, + "application/vnd.quark.quarkxpress": { + "source": "iana", + "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"] + }, + "application/vnd.quobject-quoxdocument": { + "source": "iana" + }, + "application/vnd.radisys.moml+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-audit+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-audit-conf+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-audit-conn+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-audit-dialog+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-audit-stream+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-conf+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-dialog+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-dialog-base+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-dialog-fax-detect+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-dialog-group+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-dialog-speech+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.radisys.msml-dialog-transform+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.rainstor.data": { + "source": "iana" + }, + "application/vnd.rapid": { + "source": "iana" + }, + "application/vnd.rar": { + "source": "iana", + "extensions": ["rar"] + }, + "application/vnd.realvnc.bed": { + "source": "iana", + "extensions": ["bed"] + }, + "application/vnd.recordare.musicxml": { + "source": "iana", + "extensions": ["mxl"] + }, + "application/vnd.recordare.musicxml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["musicxml"] + }, + "application/vnd.renlearn.rlprint": { + "source": "iana" + }, + "application/vnd.restful+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.rig.cryptonote": { + "source": "iana", + "extensions": ["cryptonote"] + }, + "application/vnd.rim.cod": { + "source": "apache", + "extensions": ["cod"] + }, + "application/vnd.rn-realmedia": { + "source": "apache", + "extensions": ["rm"] + }, + "application/vnd.rn-realmedia-vbr": { + "source": "apache", + "extensions": ["rmvb"] + }, + "application/vnd.route66.link66+xml": { + "source": "iana", + "compressible": true, + "extensions": ["link66"] + }, + "application/vnd.rs-274x": { + "source": "iana" + }, + "application/vnd.ruckus.download": { + "source": "iana" + }, + "application/vnd.s3sms": { + "source": "iana" + }, + "application/vnd.sailingtracker.track": { + "source": "iana", + "extensions": ["st"] + }, + "application/vnd.sar": { + "source": "iana" + }, + "application/vnd.sbm.cid": { + "source": "iana" + }, + "application/vnd.sbm.mid2": { + "source": "iana" + }, + "application/vnd.scribus": { + "source": "iana" + }, + "application/vnd.sealed.3df": { + "source": "iana" + }, + "application/vnd.sealed.csf": { + "source": "iana" + }, + "application/vnd.sealed.doc": { + "source": "iana" + }, + "application/vnd.sealed.eml": { + "source": "iana" + }, + "application/vnd.sealed.mht": { + "source": "iana" + }, + "application/vnd.sealed.net": { + "source": "iana" + }, + "application/vnd.sealed.ppt": { + "source": "iana" + }, + "application/vnd.sealed.tiff": { + "source": "iana" + }, + "application/vnd.sealed.xls": { + "source": "iana" + }, + "application/vnd.sealedmedia.softseal.html": { + "source": "iana" + }, + "application/vnd.sealedmedia.softseal.pdf": { + "source": "iana" + }, + "application/vnd.seemail": { + "source": "iana", + "extensions": ["see"] + }, + "application/vnd.seis+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.sema": { + "source": "iana", + "extensions": ["sema"] + }, + "application/vnd.semd": { + "source": "iana", + "extensions": ["semd"] + }, + "application/vnd.semf": { + "source": "iana", + "extensions": ["semf"] + }, + "application/vnd.shade-save-file": { + "source": "iana" + }, + "application/vnd.shana.informed.formdata": { + "source": "iana", + "extensions": ["ifm"] + }, + "application/vnd.shana.informed.formtemplate": { + "source": "iana", + "extensions": ["itp"] + }, + "application/vnd.shana.informed.interchange": { + "source": "iana", + "extensions": ["iif"] + }, + "application/vnd.shana.informed.package": { + "source": "iana", + "extensions": ["ipk"] + }, + "application/vnd.shootproof+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.shopkick+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.shp": { + "source": "iana" + }, + "application/vnd.shx": { + "source": "iana" + }, + "application/vnd.sigrok.session": { + "source": "iana" + }, + "application/vnd.simtech-mindmapper": { + "source": "iana", + "extensions": ["twd","twds"] + }, + "application/vnd.siren+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.smaf": { + "source": "iana", + "extensions": ["mmf"] + }, + "application/vnd.smart.notebook": { + "source": "iana" + }, + "application/vnd.smart.teacher": { + "source": "iana", + "extensions": ["teacher"] + }, + "application/vnd.snesdev-page-table": { + "source": "iana" + }, + "application/vnd.software602.filler.form+xml": { + "source": "iana", + "compressible": true, + "extensions": ["fo"] + }, + "application/vnd.software602.filler.form-xml-zip": { + "source": "iana" + }, + "application/vnd.solent.sdkm+xml": { + "source": "iana", + "compressible": true, + "extensions": ["sdkm","sdkd"] + }, + "application/vnd.spotfire.dxp": { + "source": "iana", + "extensions": ["dxp"] + }, + "application/vnd.spotfire.sfs": { + "source": "iana", + "extensions": ["sfs"] + }, + "application/vnd.sqlite3": { + "source": "iana" + }, + "application/vnd.sss-cod": { + "source": "iana" + }, + "application/vnd.sss-dtf": { + "source": "iana" + }, + "application/vnd.sss-ntf": { + "source": "iana" + }, + "application/vnd.stardivision.calc": { + "source": "apache", + "extensions": ["sdc"] + }, + "application/vnd.stardivision.draw": { + "source": "apache", + "extensions": ["sda"] + }, + "application/vnd.stardivision.impress": { + "source": "apache", + "extensions": ["sdd"] + }, + "application/vnd.stardivision.math": { + "source": "apache", + "extensions": ["smf"] + }, + "application/vnd.stardivision.writer": { + "source": "apache", + "extensions": ["sdw","vor"] + }, + "application/vnd.stardivision.writer-global": { + "source": "apache", + "extensions": ["sgl"] + }, + "application/vnd.stepmania.package": { + "source": "iana", + "extensions": ["smzip"] + }, + "application/vnd.stepmania.stepchart": { + "source": "iana", + "extensions": ["sm"] + }, + "application/vnd.street-stream": { + "source": "iana" + }, + "application/vnd.sun.wadl+xml": { + "source": "iana", + "compressible": true, + "extensions": ["wadl"] + }, + "application/vnd.sun.xml.calc": { + "source": "apache", + "extensions": ["sxc"] + }, + "application/vnd.sun.xml.calc.template": { + "source": "apache", + "extensions": ["stc"] + }, + "application/vnd.sun.xml.draw": { + "source": "apache", + "extensions": ["sxd"] + }, + "application/vnd.sun.xml.draw.template": { + "source": "apache", + "extensions": ["std"] + }, + "application/vnd.sun.xml.impress": { + "source": "apache", + "extensions": ["sxi"] + }, + "application/vnd.sun.xml.impress.template": { + "source": "apache", + "extensions": ["sti"] + }, + "application/vnd.sun.xml.math": { + "source": "apache", + "extensions": ["sxm"] + }, + "application/vnd.sun.xml.writer": { + "source": "apache", + "extensions": ["sxw"] + }, + "application/vnd.sun.xml.writer.global": { + "source": "apache", + "extensions": ["sxg"] + }, + "application/vnd.sun.xml.writer.template": { + "source": "apache", + "extensions": ["stw"] + }, + "application/vnd.sus-calendar": { + "source": "iana", + "extensions": ["sus","susp"] + }, + "application/vnd.svd": { + "source": "iana", + "extensions": ["svd"] + }, + "application/vnd.swiftview-ics": { + "source": "iana" + }, + "application/vnd.sycle+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.symbian.install": { + "source": "apache", + "extensions": ["sis","sisx"] + }, + "application/vnd.syncml+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true, + "extensions": ["xsm"] + }, + "application/vnd.syncml.dm+wbxml": { + "source": "iana", + "charset": "UTF-8", + "extensions": ["bdm"] + }, + "application/vnd.syncml.dm+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true, + "extensions": ["xdm"] + }, + "application/vnd.syncml.dm.notification": { + "source": "iana" + }, + "application/vnd.syncml.dmddf+wbxml": { + "source": "iana" + }, + "application/vnd.syncml.dmddf+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true, + "extensions": ["ddf"] + }, + "application/vnd.syncml.dmtnds+wbxml": { + "source": "iana" + }, + "application/vnd.syncml.dmtnds+xml": { + "source": "iana", + "charset": "UTF-8", + "compressible": true + }, + "application/vnd.syncml.ds.notification": { + "source": "iana" + }, + "application/vnd.tableschema+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.tao.intent-module-archive": { + "source": "iana", + "extensions": ["tao"] + }, + "application/vnd.tcpdump.pcap": { + "source": "iana", + "extensions": ["pcap","cap","dmp"] + }, + "application/vnd.think-cell.ppttc+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.tmd.mediaflex.api+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.tml": { + "source": "iana" + }, + "application/vnd.tmobile-livetv": { + "source": "iana", + "extensions": ["tmo"] + }, + "application/vnd.tri.onesource": { + "source": "iana" + }, + "application/vnd.trid.tpt": { + "source": "iana", + "extensions": ["tpt"] + }, + "application/vnd.triscape.mxs": { + "source": "iana", + "extensions": ["mxs"] + }, + "application/vnd.trueapp": { + "source": "iana", + "extensions": ["tra"] + }, + "application/vnd.truedoc": { + "source": "iana" + }, + "application/vnd.ubisoft.webplayer": { + "source": "iana" + }, + "application/vnd.ufdl": { + "source": "iana", + "extensions": ["ufd","ufdl"] + }, + "application/vnd.uiq.theme": { + "source": "iana", + "extensions": ["utz"] + }, + "application/vnd.umajin": { + "source": "iana", + "extensions": ["umj"] + }, + "application/vnd.unity": { + "source": "iana", + "extensions": ["unityweb"] + }, + "application/vnd.uoml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["uoml"] + }, + "application/vnd.uplanet.alert": { + "source": "iana" + }, + "application/vnd.uplanet.alert-wbxml": { + "source": "iana" + }, + "application/vnd.uplanet.bearer-choice": { + "source": "iana" + }, + "application/vnd.uplanet.bearer-choice-wbxml": { + "source": "iana" + }, + "application/vnd.uplanet.cacheop": { + "source": "iana" + }, + "application/vnd.uplanet.cacheop-wbxml": { + "source": "iana" + }, + "application/vnd.uplanet.channel": { + "source": "iana" + }, + "application/vnd.uplanet.channel-wbxml": { + "source": "iana" + }, + "application/vnd.uplanet.list": { + "source": "iana" + }, + "application/vnd.uplanet.list-wbxml": { + "source": "iana" + }, + "application/vnd.uplanet.listcmd": { + "source": "iana" + }, + "application/vnd.uplanet.listcmd-wbxml": { + "source": "iana" + }, + "application/vnd.uplanet.signal": { + "source": "iana" + }, + "application/vnd.uri-map": { + "source": "iana" + }, + "application/vnd.valve.source.material": { + "source": "iana" + }, + "application/vnd.vcx": { + "source": "iana", + "extensions": ["vcx"] + }, + "application/vnd.vd-study": { + "source": "iana" + }, + "application/vnd.vectorworks": { + "source": "iana" + }, + "application/vnd.vel+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.verimatrix.vcas": { + "source": "iana" + }, + "application/vnd.veryant.thin": { + "source": "iana" + }, + "application/vnd.ves.encrypted": { + "source": "iana" + }, + "application/vnd.vidsoft.vidconference": { + "source": "iana" + }, + "application/vnd.visio": { + "source": "iana", + "extensions": ["vsd","vst","vss","vsw"] + }, + "application/vnd.visionary": { + "source": "iana", + "extensions": ["vis"] + }, + "application/vnd.vividence.scriptfile": { + "source": "iana" + }, + "application/vnd.vsf": { + "source": "iana", + "extensions": ["vsf"] + }, + "application/vnd.wap.sic": { + "source": "iana" + }, + "application/vnd.wap.slc": { + "source": "iana" + }, + "application/vnd.wap.wbxml": { + "source": "iana", + "charset": "UTF-8", + "extensions": ["wbxml"] + }, + "application/vnd.wap.wmlc": { + "source": "iana", + "extensions": ["wmlc"] + }, + "application/vnd.wap.wmlscriptc": { + "source": "iana", + "extensions": ["wmlsc"] + }, + "application/vnd.webturbo": { + "source": "iana", + "extensions": ["wtb"] + }, + "application/vnd.wfa.dpp": { + "source": "iana" + }, + "application/vnd.wfa.p2p": { + "source": "iana" + }, + "application/vnd.wfa.wsc": { + "source": "iana" + }, + "application/vnd.windows.devicepairing": { + "source": "iana" + }, + "application/vnd.wmc": { + "source": "iana" + }, + "application/vnd.wmf.bootstrap": { + "source": "iana" + }, + "application/vnd.wolfram.mathematica": { + "source": "iana" + }, + "application/vnd.wolfram.mathematica.package": { + "source": "iana" + }, + "application/vnd.wolfram.player": { + "source": "iana", + "extensions": ["nbp"] + }, + "application/vnd.wordperfect": { + "source": "iana", + "extensions": ["wpd"] + }, + "application/vnd.wqd": { + "source": "iana", + "extensions": ["wqd"] + }, + "application/vnd.wrq-hp3000-labelled": { + "source": "iana" + }, + "application/vnd.wt.stf": { + "source": "iana", + "extensions": ["stf"] + }, + "application/vnd.wv.csp+wbxml": { + "source": "iana" + }, + "application/vnd.wv.csp+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.wv.ssp+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.xacml+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.xara": { + "source": "iana", + "extensions": ["xar"] + }, + "application/vnd.xfdl": { + "source": "iana", + "extensions": ["xfdl"] + }, + "application/vnd.xfdl.webform": { + "source": "iana" + }, + "application/vnd.xmi+xml": { + "source": "iana", + "compressible": true + }, + "application/vnd.xmpie.cpkg": { + "source": "iana" + }, + "application/vnd.xmpie.dpkg": { + "source": "iana" + }, + "application/vnd.xmpie.plan": { + "source": "iana" + }, + "application/vnd.xmpie.ppkg": { + "source": "iana" + }, + "application/vnd.xmpie.xlim": { + "source": "iana" + }, + "application/vnd.yamaha.hv-dic": { + "source": "iana", + "extensions": ["hvd"] + }, + "application/vnd.yamaha.hv-script": { + "source": "iana", + "extensions": ["hvs"] + }, + "application/vnd.yamaha.hv-voice": { + "source": "iana", + "extensions": ["hvp"] + }, + "application/vnd.yamaha.openscoreformat": { + "source": "iana", + "extensions": ["osf"] + }, + "application/vnd.yamaha.openscoreformat.osfpvg+xml": { + "source": "iana", + "compressible": true, + "extensions": ["osfpvg"] + }, + "application/vnd.yamaha.remote-setup": { + "source": "iana" + }, + "application/vnd.yamaha.smaf-audio": { + "source": "iana", + "extensions": ["saf"] + }, + "application/vnd.yamaha.smaf-phrase": { + "source": "iana", + "extensions": ["spf"] + }, + "application/vnd.yamaha.through-ngn": { + "source": "iana" + }, + "application/vnd.yamaha.tunnel-udpencap": { + "source": "iana" + }, + "application/vnd.yaoweme": { + "source": "iana" + }, + "application/vnd.yellowriver-custom-menu": { + "source": "iana", + "extensions": ["cmp"] + }, + "application/vnd.youtube.yt": { + "source": "iana" + }, + "application/vnd.zul": { + "source": "iana", + "extensions": ["zir","zirz"] + }, + "application/vnd.zzazz.deck+xml": { + "source": "iana", + "compressible": true, + "extensions": ["zaz"] + }, + "application/voicexml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["vxml"] + }, + "application/voucher-cms+json": { + "source": "iana", + "compressible": true + }, + "application/vq-rtcpxr": { + "source": "iana" + }, + "application/wasm": { + "compressible": true, + "extensions": ["wasm"] + }, + "application/watcherinfo+xml": { + "source": "iana", + "compressible": true + }, + "application/webpush-options+json": { + "source": "iana", + "compressible": true + }, + "application/whoispp-query": { + "source": "iana" + }, + "application/whoispp-response": { + "source": "iana" + }, + "application/widget": { + "source": "iana", + "extensions": ["wgt"] + }, + "application/winhlp": { + "source": "apache", + "extensions": ["hlp"] + }, + "application/wita": { + "source": "iana" + }, + "application/wordperfect5.1": { + "source": "iana" + }, + "application/wsdl+xml": { + "source": "iana", + "compressible": true, + "extensions": ["wsdl"] + }, + "application/wspolicy+xml": { + "source": "iana", + "compressible": true, + "extensions": ["wspolicy"] + }, + "application/x-7z-compressed": { + "source": "apache", + "compressible": false, + "extensions": ["7z"] + }, + "application/x-abiword": { + "source": "apache", + "extensions": ["abw"] + }, + "application/x-ace-compressed": { + "source": "apache", + "extensions": ["ace"] + }, + "application/x-amf": { + "source": "apache" + }, + "application/x-apple-diskimage": { + "source": "apache", + "extensions": ["dmg"] + }, + "application/x-arj": { + "compressible": false, + "extensions": ["arj"] + }, + "application/x-authorware-bin": { + "source": "apache", + "extensions": ["aab","x32","u32","vox"] + }, + "application/x-authorware-map": { + "source": "apache", + "extensions": ["aam"] + }, + "application/x-authorware-seg": { + "source": "apache", + "extensions": ["aas"] + }, + "application/x-bcpio": { + "source": "apache", + "extensions": ["bcpio"] + }, + "application/x-bdoc": { + "compressible": false, + "extensions": ["bdoc"] + }, + "application/x-bittorrent": { + "source": "apache", + "extensions": ["torrent"] + }, + "application/x-blorb": { + "source": "apache", + "extensions": ["blb","blorb"] + }, + "application/x-bzip": { + "source": "apache", + "compressible": false, + "extensions": ["bz"] + }, + "application/x-bzip2": { + "source": "apache", + "compressible": false, + "extensions": ["bz2","boz"] + }, + "application/x-cbr": { + "source": "apache", + "extensions": ["cbr","cba","cbt","cbz","cb7"] + }, + "application/x-cdlink": { + "source": "apache", + "extensions": ["vcd"] + }, + "application/x-cfs-compressed": { + "source": "apache", + "extensions": ["cfs"] + }, + "application/x-chat": { + "source": "apache", + "extensions": ["chat"] + }, + "application/x-chess-pgn": { + "source": "apache", + "extensions": ["pgn"] + }, + "application/x-chrome-extension": { + "extensions": ["crx"] + }, + "application/x-cocoa": { + "source": "nginx", + "extensions": ["cco"] + }, + "application/x-compress": { + "source": "apache" + }, + "application/x-conference": { + "source": "apache", + "extensions": ["nsc"] + }, + "application/x-cpio": { + "source": "apache", + "extensions": ["cpio"] + }, + "application/x-csh": { + "source": "apache", + "extensions": ["csh"] + }, + "application/x-deb": { + "compressible": false + }, + "application/x-debian-package": { + "source": "apache", + "extensions": ["deb","udeb"] + }, + "application/x-dgc-compressed": { + "source": "apache", + "extensions": ["dgc"] + }, + "application/x-director": { + "source": "apache", + "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"] + }, + "application/x-doom": { + "source": "apache", + "extensions": ["wad"] + }, + "application/x-dtbncx+xml": { + "source": "apache", + "compressible": true, + "extensions": ["ncx"] + }, + "application/x-dtbook+xml": { + "source": "apache", + "compressible": true, + "extensions": ["dtb"] + }, + "application/x-dtbresource+xml": { + "source": "apache", + "compressible": true, + "extensions": ["res"] + }, + "application/x-dvi": { + "source": "apache", + "compressible": false, + "extensions": ["dvi"] + }, + "application/x-envoy": { + "source": "apache", + "extensions": ["evy"] + }, + "application/x-eva": { + "source": "apache", + "extensions": ["eva"] + }, + "application/x-font-bdf": { + "source": "apache", + "extensions": ["bdf"] + }, + "application/x-font-dos": { + "source": "apache" + }, + "application/x-font-framemaker": { + "source": "apache" + }, + "application/x-font-ghostscript": { + "source": "apache", + "extensions": ["gsf"] + }, + "application/x-font-libgrx": { + "source": "apache" + }, + "application/x-font-linux-psf": { + "source": "apache", + "extensions": ["psf"] + }, + "application/x-font-pcf": { + "source": "apache", + "extensions": ["pcf"] + }, + "application/x-font-snf": { + "source": "apache", + "extensions": ["snf"] + }, + "application/x-font-speedo": { + "source": "apache" + }, + "application/x-font-sunos-news": { + "source": "apache" + }, + "application/x-font-type1": { + "source": "apache", + "extensions": ["pfa","pfb","pfm","afm"] + }, + "application/x-font-vfont": { + "source": "apache" + }, + "application/x-freearc": { + "source": "apache", + "extensions": ["arc"] + }, + "application/x-futuresplash": { + "source": "apache", + "extensions": ["spl"] + }, + "application/x-gca-compressed": { + "source": "apache", + "extensions": ["gca"] + }, + "application/x-glulx": { + "source": "apache", + "extensions": ["ulx"] + }, + "application/x-gnumeric": { + "source": "apache", + "extensions": ["gnumeric"] + }, + "application/x-gramps-xml": { + "source": "apache", + "extensions": ["gramps"] + }, + "application/x-gtar": { + "source": "apache", + "extensions": ["gtar"] + }, + "application/x-gzip": { + "source": "apache" + }, + "application/x-hdf": { + "source": "apache", + "extensions": ["hdf"] + }, + "application/x-httpd-php": { + "compressible": true, + "extensions": ["php"] + }, + "application/x-install-instructions": { + "source": "apache", + "extensions": ["install"] + }, + "application/x-iso9660-image": { + "source": "apache", + "extensions": ["iso"] + }, + "application/x-java-archive-diff": { + "source": "nginx", + "extensions": ["jardiff"] + }, + "application/x-java-jnlp-file": { + "source": "apache", + "compressible": false, + "extensions": ["jnlp"] + }, + "application/x-javascript": { + "compressible": true + }, + "application/x-keepass2": { + "extensions": ["kdbx"] + }, + "application/x-latex": { + "source": "apache", + "compressible": false, + "extensions": ["latex"] + }, + "application/x-lua-bytecode": { + "extensions": ["luac"] + }, + "application/x-lzh-compressed": { + "source": "apache", + "extensions": ["lzh","lha"] + }, + "application/x-makeself": { + "source": "nginx", + "extensions": ["run"] + }, + "application/x-mie": { + "source": "apache", + "extensions": ["mie"] + }, + "application/x-mobipocket-ebook": { + "source": "apache", + "extensions": ["prc","mobi"] + }, + "application/x-mpegurl": { + "compressible": false + }, + "application/x-ms-application": { + "source": "apache", + "extensions": ["application"] + }, + "application/x-ms-shortcut": { + "source": "apache", + "extensions": ["lnk"] + }, + "application/x-ms-wmd": { + "source": "apache", + "extensions": ["wmd"] + }, + "application/x-ms-wmz": { + "source": "apache", + "extensions": ["wmz"] + }, + "application/x-ms-xbap": { + "source": "apache", + "extensions": ["xbap"] + }, + "application/x-msaccess": { + "source": "apache", + "extensions": ["mdb"] + }, + "application/x-msbinder": { + "source": "apache", + "extensions": ["obd"] + }, + "application/x-mscardfile": { + "source": "apache", + "extensions": ["crd"] + }, + "application/x-msclip": { + "source": "apache", + "extensions": ["clp"] + }, + "application/x-msdos-program": { + "extensions": ["exe"] + }, + "application/x-msdownload": { + "source": "apache", + "extensions": ["exe","dll","com","bat","msi"] + }, + "application/x-msmediaview": { + "source": "apache", + "extensions": ["mvb","m13","m14"] + }, + "application/x-msmetafile": { + "source": "apache", + "extensions": ["wmf","wmz","emf","emz"] + }, + "application/x-msmoney": { + "source": "apache", + "extensions": ["mny"] + }, + "application/x-mspublisher": { + "source": "apache", + "extensions": ["pub"] + }, + "application/x-msschedule": { + "source": "apache", + "extensions": ["scd"] + }, + "application/x-msterminal": { + "source": "apache", + "extensions": ["trm"] + }, + "application/x-mswrite": { + "source": "apache", + "extensions": ["wri"] + }, + "application/x-netcdf": { + "source": "apache", + "extensions": ["nc","cdf"] + }, + "application/x-ns-proxy-autoconfig": { + "compressible": true, + "extensions": ["pac"] + }, + "application/x-nzb": { + "source": "apache", + "extensions": ["nzb"] + }, + "application/x-perl": { + "source": "nginx", + "extensions": ["pl","pm"] + }, + "application/x-pilot": { + "source": "nginx", + "extensions": ["prc","pdb"] + }, + "application/x-pkcs12": { + "source": "apache", + "compressible": false, + "extensions": ["p12","pfx"] + }, + "application/x-pkcs7-certificates": { + "source": "apache", + "extensions": ["p7b","spc"] + }, + "application/x-pkcs7-certreqresp": { + "source": "apache", + "extensions": ["p7r"] + }, + "application/x-pki-message": { + "source": "iana" + }, + "application/x-rar-compressed": { + "source": "apache", + "compressible": false, + "extensions": ["rar"] + }, + "application/x-redhat-package-manager": { + "source": "nginx", + "extensions": ["rpm"] + }, + "application/x-research-info-systems": { + "source": "apache", + "extensions": ["ris"] + }, + "application/x-sea": { + "source": "nginx", + "extensions": ["sea"] + }, + "application/x-sh": { + "source": "apache", + "compressible": true, + "extensions": ["sh"] + }, + "application/x-shar": { + "source": "apache", + "extensions": ["shar"] + }, + "application/x-shockwave-flash": { + "source": "apache", + "compressible": false, + "extensions": ["swf"] + }, + "application/x-silverlight-app": { + "source": "apache", + "extensions": ["xap"] + }, + "application/x-sql": { + "source": "apache", + "extensions": ["sql"] + }, + "application/x-stuffit": { + "source": "apache", + "compressible": false, + "extensions": ["sit"] + }, + "application/x-stuffitx": { + "source": "apache", + "extensions": ["sitx"] + }, + "application/x-subrip": { + "source": "apache", + "extensions": ["srt"] + }, + "application/x-sv4cpio": { + "source": "apache", + "extensions": ["sv4cpio"] + }, + "application/x-sv4crc": { + "source": "apache", + "extensions": ["sv4crc"] + }, + "application/x-t3vm-image": { + "source": "apache", + "extensions": ["t3"] + }, + "application/x-tads": { + "source": "apache", + "extensions": ["gam"] + }, + "application/x-tar": { + "source": "apache", + "compressible": true, + "extensions": ["tar"] + }, + "application/x-tcl": { + "source": "apache", + "extensions": ["tcl","tk"] + }, + "application/x-tex": { + "source": "apache", + "extensions": ["tex"] + }, + "application/x-tex-tfm": { + "source": "apache", + "extensions": ["tfm"] + }, + "application/x-texinfo": { + "source": "apache", + "extensions": ["texinfo","texi"] + }, + "application/x-tgif": { + "source": "apache", + "extensions": ["obj"] + }, + "application/x-ustar": { + "source": "apache", + "extensions": ["ustar"] + }, + "application/x-virtualbox-hdd": { + "compressible": true, + "extensions": ["hdd"] + }, + "application/x-virtualbox-ova": { + "compressible": true, + "extensions": ["ova"] + }, + "application/x-virtualbox-ovf": { + "compressible": true, + "extensions": ["ovf"] + }, + "application/x-virtualbox-vbox": { + "compressible": true, + "extensions": ["vbox"] + }, + "application/x-virtualbox-vbox-extpack": { + "compressible": false, + "extensions": ["vbox-extpack"] + }, + "application/x-virtualbox-vdi": { + "compressible": true, + "extensions": ["vdi"] + }, + "application/x-virtualbox-vhd": { + "compressible": true, + "extensions": ["vhd"] + }, + "application/x-virtualbox-vmdk": { + "compressible": true, + "extensions": ["vmdk"] + }, + "application/x-wais-source": { + "source": "apache", + "extensions": ["src"] + }, + "application/x-web-app-manifest+json": { + "compressible": true, + "extensions": ["webapp"] + }, + "application/x-www-form-urlencoded": { + "source": "iana", + "compressible": true + }, + "application/x-x509-ca-cert": { + "source": "iana", + "extensions": ["der","crt","pem"] + }, + "application/x-x509-ca-ra-cert": { + "source": "iana" + }, + "application/x-x509-next-ca-cert": { + "source": "iana" + }, + "application/x-xfig": { + "source": "apache", + "extensions": ["fig"] + }, + "application/x-xliff+xml": { + "source": "apache", + "compressible": true, + "extensions": ["xlf"] + }, + "application/x-xpinstall": { + "source": "apache", + "compressible": false, + "extensions": ["xpi"] + }, + "application/x-xz": { + "source": "apache", + "extensions": ["xz"] + }, + "application/x-zmachine": { + "source": "apache", + "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"] + }, + "application/x400-bp": { + "source": "iana" + }, + "application/xacml+xml": { + "source": "iana", + "compressible": true + }, + "application/xaml+xml": { + "source": "apache", + "compressible": true, + "extensions": ["xaml"] + }, + "application/xcap-att+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xav"] + }, + "application/xcap-caps+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xca"] + }, + "application/xcap-diff+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xdf"] + }, + "application/xcap-el+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xel"] + }, + "application/xcap-error+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xer"] + }, + "application/xcap-ns+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xns"] + }, + "application/xcon-conference-info+xml": { + "source": "iana", + "compressible": true + }, + "application/xcon-conference-info-diff+xml": { + "source": "iana", + "compressible": true + }, + "application/xenc+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xenc"] + }, + "application/xhtml+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xhtml","xht"] + }, + "application/xhtml-voice+xml": { + "source": "apache", + "compressible": true + }, + "application/xliff+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xlf"] + }, + "application/xml": { + "source": "iana", + "compressible": true, + "extensions": ["xml","xsl","xsd","rng"] + }, + "application/xml-dtd": { + "source": "iana", + "compressible": true, + "extensions": ["dtd"] + }, + "application/xml-external-parsed-entity": { + "source": "iana" + }, + "application/xml-patch+xml": { + "source": "iana", + "compressible": true + }, + "application/xmpp+xml": { + "source": "iana", + "compressible": true + }, + "application/xop+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xop"] + }, + "application/xproc+xml": { + "source": "apache", + "compressible": true, + "extensions": ["xpl"] + }, + "application/xslt+xml": { + "source": "iana", + "compressible": true, + "extensions": ["xsl","xslt"] + }, + "application/xspf+xml": { + "source": "apache", + "compressible": true, + "extensions": ["xspf"] + }, + "application/xv+xml": { + "source": "iana", + "compressible": true, + "extensions": ["mxml","xhvml","xvml","xvm"] + }, + "application/yang": { + "source": "iana", + "extensions": ["yang"] + }, + "application/yang-data+json": { + "source": "iana", + "compressible": true + }, + "application/yang-data+xml": { + "source": "iana", + "compressible": true + }, + "application/yang-patch+json": { + "source": "iana", + "compressible": true + }, + "application/yang-patch+xml": { + "source": "iana", + "compressible": true + }, + "application/yin+xml": { + "source": "iana", + "compressible": true, + "extensions": ["yin"] + }, + "application/zip": { + "source": "iana", + "compressible": false, + "extensions": ["zip"] + }, + "application/zlib": { + "source": "iana" + }, + "application/zstd": { + "source": "iana" + }, + "audio/1d-interleaved-parityfec": { + "source": "iana" + }, + "audio/32kadpcm": { + "source": "iana" + }, + "audio/3gpp": { + "source": "iana", + "compressible": false, + "extensions": ["3gpp"] + }, + "audio/3gpp2": { + "source": "iana" + }, + "audio/aac": { + "source": "iana" + }, + "audio/ac3": { + "source": "iana" + }, + "audio/adpcm": { + "source": "apache", + "extensions": ["adp"] + }, + "audio/amr": { + "source": "iana", + "extensions": ["amr"] + }, + "audio/amr-wb": { + "source": "iana" + }, + "audio/amr-wb+": { + "source": "iana" + }, + "audio/aptx": { + "source": "iana" + }, + "audio/asc": { + "source": "iana" + }, + "audio/atrac-advanced-lossless": { + "source": "iana" + }, + "audio/atrac-x": { + "source": "iana" + }, + "audio/atrac3": { + "source": "iana" + }, + "audio/basic": { + "source": "iana", + "compressible": false, + "extensions": ["au","snd"] + }, + "audio/bv16": { + "source": "iana" + }, + "audio/bv32": { + "source": "iana" + }, + "audio/clearmode": { + "source": "iana" + }, + "audio/cn": { + "source": "iana" + }, + "audio/dat12": { + "source": "iana" + }, + "audio/dls": { + "source": "iana" + }, + "audio/dsr-es201108": { + "source": "iana" + }, + "audio/dsr-es202050": { + "source": "iana" + }, + "audio/dsr-es202211": { + "source": "iana" + }, + "audio/dsr-es202212": { + "source": "iana" + }, + "audio/dv": { + "source": "iana" + }, + "audio/dvi4": { + "source": "iana" + }, + "audio/eac3": { + "source": "iana" + }, + "audio/encaprtp": { + "source": "iana" + }, + "audio/evrc": { + "source": "iana" + }, + "audio/evrc-qcp": { + "source": "iana" + }, + "audio/evrc0": { + "source": "iana" + }, + "audio/evrc1": { + "source": "iana" + }, + "audio/evrcb": { + "source": "iana" + }, + "audio/evrcb0": { + "source": "iana" + }, + "audio/evrcb1": { + "source": "iana" + }, + "audio/evrcnw": { + "source": "iana" + }, + "audio/evrcnw0": { + "source": "iana" + }, + "audio/evrcnw1": { + "source": "iana" + }, + "audio/evrcwb": { + "source": "iana" + }, + "audio/evrcwb0": { + "source": "iana" + }, + "audio/evrcwb1": { + "source": "iana" + }, + "audio/evs": { + "source": "iana" + }, + "audio/flexfec": { + "source": "iana" + }, + "audio/fwdred": { + "source": "iana" + }, + "audio/g711-0": { + "source": "iana" + }, + "audio/g719": { + "source": "iana" + }, + "audio/g722": { + "source": "iana" + }, + "audio/g7221": { + "source": "iana" + }, + "audio/g723": { + "source": "iana" + }, + "audio/g726-16": { + "source": "iana" + }, + "audio/g726-24": { + "source": "iana" + }, + "audio/g726-32": { + "source": "iana" + }, + "audio/g726-40": { + "source": "iana" + }, + "audio/g728": { + "source": "iana" + }, + "audio/g729": { + "source": "iana" + }, + "audio/g7291": { + "source": "iana" + }, + "audio/g729d": { + "source": "iana" + }, + "audio/g729e": { + "source": "iana" + }, + "audio/gsm": { + "source": "iana" + }, + "audio/gsm-efr": { + "source": "iana" + }, + "audio/gsm-hr-08": { + "source": "iana" + }, + "audio/ilbc": { + "source": "iana" + }, + "audio/ip-mr_v2.5": { + "source": "iana" + }, + "audio/isac": { + "source": "apache" + }, + "audio/l16": { + "source": "iana" + }, + "audio/l20": { + "source": "iana" + }, + "audio/l24": { + "source": "iana", + "compressible": false + }, + "audio/l8": { + "source": "iana" + }, + "audio/lpc": { + "source": "iana" + }, + "audio/melp": { + "source": "iana" + }, + "audio/melp1200": { + "source": "iana" + }, + "audio/melp2400": { + "source": "iana" + }, + "audio/melp600": { + "source": "iana" + }, + "audio/mhas": { + "source": "iana" + }, + "audio/midi": { + "source": "apache", + "extensions": ["mid","midi","kar","rmi"] + }, + "audio/mobile-xmf": { + "source": "iana", + "extensions": ["mxmf"] + }, + "audio/mp3": { + "compressible": false, + "extensions": ["mp3"] + }, + "audio/mp4": { + "source": "iana", + "compressible": false, + "extensions": ["m4a","mp4a"] + }, + "audio/mp4a-latm": { + "source": "iana" + }, + "audio/mpa": { + "source": "iana" + }, + "audio/mpa-robust": { + "source": "iana" + }, + "audio/mpeg": { + "source": "iana", + "compressible": false, + "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"] + }, + "audio/mpeg4-generic": { + "source": "iana" + }, + "audio/musepack": { + "source": "apache" + }, + "audio/ogg": { + "source": "iana", + "compressible": false, + "extensions": ["oga","ogg","spx","opus"] + }, + "audio/opus": { + "source": "iana" + }, + "audio/parityfec": { + "source": "iana" + }, + "audio/pcma": { + "source": "iana" + }, + "audio/pcma-wb": { + "source": "iana" + }, + "audio/pcmu": { + "source": "iana" + }, + "audio/pcmu-wb": { + "source": "iana" + }, + "audio/prs.sid": { + "source": "iana" + }, + "audio/qcelp": { + "source": "iana" + }, + "audio/raptorfec": { + "source": "iana" + }, + "audio/red": { + "source": "iana" + }, + "audio/rtp-enc-aescm128": { + "source": "iana" + }, + "audio/rtp-midi": { + "source": "iana" + }, + "audio/rtploopback": { + "source": "iana" + }, + "audio/rtx": { + "source": "iana" + }, + "audio/s3m": { + "source": "apache", + "extensions": ["s3m"] + }, + "audio/scip": { + "source": "iana" + }, + "audio/silk": { + "source": "apache", + "extensions": ["sil"] + }, + "audio/smv": { + "source": "iana" + }, + "audio/smv-qcp": { + "source": "iana" + }, + "audio/smv0": { + "source": "iana" + }, + "audio/sofa": { + "source": "iana" + }, + "audio/sp-midi": { + "source": "iana" + }, + "audio/speex": { + "source": "iana" + }, + "audio/t140c": { + "source": "iana" + }, + "audio/t38": { + "source": "iana" + }, + "audio/telephone-event": { + "source": "iana" + }, + "audio/tetra_acelp": { + "source": "iana" + }, + "audio/tetra_acelp_bb": { + "source": "iana" + }, + "audio/tone": { + "source": "iana" + }, + "audio/tsvcis": { + "source": "iana" + }, + "audio/uemclip": { + "source": "iana" + }, + "audio/ulpfec": { + "source": "iana" + }, + "audio/usac": { + "source": "iana" + }, + "audio/vdvi": { + "source": "iana" + }, + "audio/vmr-wb": { + "source": "iana" + }, + "audio/vnd.3gpp.iufp": { + "source": "iana" + }, + "audio/vnd.4sb": { + "source": "iana" + }, + "audio/vnd.audiokoz": { + "source": "iana" + }, + "audio/vnd.celp": { + "source": "iana" + }, + "audio/vnd.cisco.nse": { + "source": "iana" + }, + "audio/vnd.cmles.radio-events": { + "source": "iana" + }, + "audio/vnd.cns.anp1": { + "source": "iana" + }, + "audio/vnd.cns.inf1": { + "source": "iana" + }, + "audio/vnd.dece.audio": { + "source": "iana", + "extensions": ["uva","uvva"] + }, + "audio/vnd.digital-winds": { + "source": "iana", + "extensions": ["eol"] + }, + "audio/vnd.dlna.adts": { + "source": "iana" + }, + "audio/vnd.dolby.heaac.1": { + "source": "iana" + }, + "audio/vnd.dolby.heaac.2": { + "source": "iana" + }, + "audio/vnd.dolby.mlp": { + "source": "iana" + }, + "audio/vnd.dolby.mps": { + "source": "iana" + }, + "audio/vnd.dolby.pl2": { + "source": "iana" + }, + "audio/vnd.dolby.pl2x": { + "source": "iana" + }, + "audio/vnd.dolby.pl2z": { + "source": "iana" + }, + "audio/vnd.dolby.pulse.1": { + "source": "iana" + }, + "audio/vnd.dra": { + "source": "iana", + "extensions": ["dra"] + }, + "audio/vnd.dts": { + "source": "iana", + "extensions": ["dts"] + }, + "audio/vnd.dts.hd": { + "source": "iana", + "extensions": ["dtshd"] + }, + "audio/vnd.dts.uhd": { + "source": "iana" + }, + "audio/vnd.dvb.file": { + "source": "iana" + }, + "audio/vnd.everad.plj": { + "source": "iana" + }, + "audio/vnd.hns.audio": { + "source": "iana" + }, + "audio/vnd.lucent.voice": { + "source": "iana", + "extensions": ["lvp"] + }, + "audio/vnd.ms-playready.media.pya": { + "source": "iana", + "extensions": ["pya"] + }, + "audio/vnd.nokia.mobile-xmf": { + "source": "iana" + }, + "audio/vnd.nortel.vbk": { + "source": "iana" + }, + "audio/vnd.nuera.ecelp4800": { + "source": "iana", + "extensions": ["ecelp4800"] + }, + "audio/vnd.nuera.ecelp7470": { + "source": "iana", + "extensions": ["ecelp7470"] + }, + "audio/vnd.nuera.ecelp9600": { + "source": "iana", + "extensions": ["ecelp9600"] + }, + "audio/vnd.octel.sbc": { + "source": "iana" + }, + "audio/vnd.presonus.multitrack": { + "source": "iana" + }, + "audio/vnd.qcelp": { + "source": "iana" + }, + "audio/vnd.rhetorex.32kadpcm": { + "source": "iana" + }, + "audio/vnd.rip": { + "source": "iana", + "extensions": ["rip"] + }, + "audio/vnd.rn-realaudio": { + "compressible": false + }, + "audio/vnd.sealedmedia.softseal.mpeg": { + "source": "iana" + }, + "audio/vnd.vmx.cvsd": { + "source": "iana" + }, + "audio/vnd.wave": { + "compressible": false + }, + "audio/vorbis": { + "source": "iana", + "compressible": false + }, + "audio/vorbis-config": { + "source": "iana" + }, + "audio/wav": { + "compressible": false, + "extensions": ["wav"] + }, + "audio/wave": { + "compressible": false, + "extensions": ["wav"] + }, + "audio/webm": { + "source": "apache", + "compressible": false, + "extensions": ["weba"] + }, + "audio/x-aac": { + "source": "apache", + "compressible": false, + "extensions": ["aac"] + }, + "audio/x-aiff": { + "source": "apache", + "extensions": ["aif","aiff","aifc"] + }, + "audio/x-caf": { + "source": "apache", + "compressible": false, + "extensions": ["caf"] + }, + "audio/x-flac": { + "source": "apache", + "extensions": ["flac"] + }, + "audio/x-m4a": { + "source": "nginx", + "extensions": ["m4a"] + }, + "audio/x-matroska": { + "source": "apache", + "extensions": ["mka"] + }, + "audio/x-mpegurl": { + "source": "apache", + "extensions": ["m3u"] + }, + "audio/x-ms-wax": { + "source": "apache", + "extensions": ["wax"] + }, + "audio/x-ms-wma": { + "source": "apache", + "extensions": ["wma"] + }, + "audio/x-pn-realaudio": { + "source": "apache", + "extensions": ["ram","ra"] + }, + "audio/x-pn-realaudio-plugin": { + "source": "apache", + "extensions": ["rmp"] + }, + "audio/x-realaudio": { + "source": "nginx", + "extensions": ["ra"] + }, + "audio/x-tta": { + "source": "apache" + }, + "audio/x-wav": { + "source": "apache", + "extensions": ["wav"] + }, + "audio/xm": { + "source": "apache", + "extensions": ["xm"] + }, + "chemical/x-cdx": { + "source": "apache", + "extensions": ["cdx"] + }, + "chemical/x-cif": { + "source": "apache", + "extensions": ["cif"] + }, + "chemical/x-cmdf": { + "source": "apache", + "extensions": ["cmdf"] + }, + "chemical/x-cml": { + "source": "apache", + "extensions": ["cml"] + }, + "chemical/x-csml": { + "source": "apache", + "extensions": ["csml"] + }, + "chemical/x-pdb": { + "source": "apache" + }, + "chemical/x-xyz": { + "source": "apache", + "extensions": ["xyz"] + }, + "font/collection": { + "source": "iana", + "extensions": ["ttc"] + }, + "font/otf": { + "source": "iana", + "compressible": true, + "extensions": ["otf"] + }, + "font/sfnt": { + "source": "iana" + }, + "font/ttf": { + "source": "iana", + "compressible": true, + "extensions": ["ttf"] + }, + "font/woff": { + "source": "iana", + "extensions": ["woff"] + }, + "font/woff2": { + "source": "iana", + "extensions": ["woff2"] + }, + "image/aces": { + "source": "iana", + "extensions": ["exr"] + }, + "image/apng": { + "compressible": false, + "extensions": ["apng"] + }, + "image/avci": { + "source": "iana" + }, + "image/avcs": { + "source": "iana" + }, + "image/avif": { + "source": "iana", + "compressible": false, + "extensions": ["avif"] + }, + "image/bmp": { + "source": "iana", + "compressible": true, + "extensions": ["bmp"] + }, + "image/cgm": { + "source": "iana", + "extensions": ["cgm"] + }, + "image/dicom-rle": { + "source": "iana", + "extensions": ["drle"] + }, + "image/emf": { + "source": "iana", + "extensions": ["emf"] + }, + "image/fits": { + "source": "iana", + "extensions": ["fits"] + }, + "image/g3fax": { + "source": "iana", + "extensions": ["g3"] + }, + "image/gif": { + "source": "iana", + "compressible": false, + "extensions": ["gif"] + }, + "image/heic": { + "source": "iana", + "extensions": ["heic"] + }, + "image/heic-sequence": { + "source": "iana", + "extensions": ["heics"] + }, + "image/heif": { + "source": "iana", + "extensions": ["heif"] + }, + "image/heif-sequence": { + "source": "iana", + "extensions": ["heifs"] + }, + "image/hej2k": { + "source": "iana", + "extensions": ["hej2"] + }, + "image/hsj2": { + "source": "iana", + "extensions": ["hsj2"] + }, + "image/ief": { + "source": "iana", + "extensions": ["ief"] + }, + "image/jls": { + "source": "iana", + "extensions": ["jls"] + }, + "image/jp2": { + "source": "iana", + "compressible": false, + "extensions": ["jp2","jpg2"] + }, + "image/jpeg": { + "source": "iana", + "compressible": false, + "extensions": ["jpeg","jpg","jpe"] + }, + "image/jph": { + "source": "iana", + "extensions": ["jph"] + }, + "image/jphc": { + "source": "iana", + "extensions": ["jhc"] + }, + "image/jpm": { + "source": "iana", + "compressible": false, + "extensions": ["jpm"] + }, + "image/jpx": { + "source": "iana", + "compressible": false, + "extensions": ["jpx","jpf"] + }, + "image/jxr": { + "source": "iana", + "extensions": ["jxr"] + }, + "image/jxra": { + "source": "iana", + "extensions": ["jxra"] + }, + "image/jxrs": { + "source": "iana", + "extensions": ["jxrs"] + }, + "image/jxs": { + "source": "iana", + "extensions": ["jxs"] + }, + "image/jxsc": { + "source": "iana", + "extensions": ["jxsc"] + }, + "image/jxsi": { + "source": "iana", + "extensions": ["jxsi"] + }, + "image/jxss": { + "source": "iana", + "extensions": ["jxss"] + }, + "image/ktx": { + "source": "iana", + "extensions": ["ktx"] + }, + "image/ktx2": { + "source": "iana", + "extensions": ["ktx2"] + }, + "image/naplps": { + "source": "iana" + }, + "image/pjpeg": { + "compressible": false + }, + "image/png": { + "source": "iana", + "compressible": false, + "extensions": ["png"] + }, + "image/prs.btif": { + "source": "iana", + "extensions": ["btif"] + }, + "image/prs.pti": { + "source": "iana", + "extensions": ["pti"] + }, + "image/pwg-raster": { + "source": "iana" + }, + "image/sgi": { + "source": "apache", + "extensions": ["sgi"] + }, + "image/svg+xml": { + "source": "iana", + "compressible": true, + "extensions": ["svg","svgz"] + }, + "image/t38": { + "source": "iana", + "extensions": ["t38"] + }, + "image/tiff": { + "source": "iana", + "compressible": false, + "extensions": ["tif","tiff"] + }, + "image/tiff-fx": { + "source": "iana", + "extensions": ["tfx"] + }, + "image/vnd.adobe.photoshop": { + "source": "iana", + "compressible": true, + "extensions": ["psd"] + }, + "image/vnd.airzip.accelerator.azv": { + "source": "iana", + "extensions": ["azv"] + }, + "image/vnd.cns.inf2": { + "source": "iana" + }, + "image/vnd.dece.graphic": { + "source": "iana", + "extensions": ["uvi","uvvi","uvg","uvvg"] + }, + "image/vnd.djvu": { + "source": "iana", + "extensions": ["djvu","djv"] + }, + "image/vnd.dvb.subtitle": { + "source": "iana", + "extensions": ["sub"] + }, + "image/vnd.dwg": { + "source": "iana", + "extensions": ["dwg"] + }, + "image/vnd.dxf": { + "source": "iana", + "extensions": ["dxf"] + }, + "image/vnd.fastbidsheet": { + "source": "iana", + "extensions": ["fbs"] + }, + "image/vnd.fpx": { + "source": "iana", + "extensions": ["fpx"] + }, + "image/vnd.fst": { + "source": "iana", + "extensions": ["fst"] + }, + "image/vnd.fujixerox.edmics-mmr": { + "source": "iana", + "extensions": ["mmr"] + }, + "image/vnd.fujixerox.edmics-rlc": { + "source": "iana", + "extensions": ["rlc"] + }, + "image/vnd.globalgraphics.pgb": { + "source": "iana" + }, + "image/vnd.microsoft.icon": { + "source": "iana", + "extensions": ["ico"] + }, + "image/vnd.mix": { + "source": "iana" + }, + "image/vnd.mozilla.apng": { + "source": "iana" + }, + "image/vnd.ms-dds": { + "extensions": ["dds"] + }, + "image/vnd.ms-modi": { + "source": "iana", + "extensions": ["mdi"] + }, + "image/vnd.ms-photo": { + "source": "apache", + "extensions": ["wdp"] + }, + "image/vnd.net-fpx": { + "source": "iana", + "extensions": ["npx"] + }, + "image/vnd.pco.b16": { + "source": "iana", + "extensions": ["b16"] + }, + "image/vnd.radiance": { + "source": "iana" + }, + "image/vnd.sealed.png": { + "source": "iana" + }, + "image/vnd.sealedmedia.softseal.gif": { + "source": "iana" + }, + "image/vnd.sealedmedia.softseal.jpg": { + "source": "iana" + }, + "image/vnd.svf": { + "source": "iana" + }, + "image/vnd.tencent.tap": { + "source": "iana", + "extensions": ["tap"] + }, + "image/vnd.valve.source.texture": { + "source": "iana", + "extensions": ["vtf"] + }, + "image/vnd.wap.wbmp": { + "source": "iana", + "extensions": ["wbmp"] + }, + "image/vnd.xiff": { + "source": "iana", + "extensions": ["xif"] + }, + "image/vnd.zbrush.pcx": { + "source": "iana", + "extensions": ["pcx"] + }, + "image/webp": { + "source": "apache", + "extensions": ["webp"] + }, + "image/wmf": { + "source": "iana", + "extensions": ["wmf"] + }, + "image/x-3ds": { + "source": "apache", + "extensions": ["3ds"] + }, + "image/x-cmu-raster": { + "source": "apache", + "extensions": ["ras"] + }, + "image/x-cmx": { + "source": "apache", + "extensions": ["cmx"] + }, + "image/x-freehand": { + "source": "apache", + "extensions": ["fh","fhc","fh4","fh5","fh7"] + }, + "image/x-icon": { + "source": "apache", + "compressible": true, + "extensions": ["ico"] + }, + "image/x-jng": { + "source": "nginx", + "extensions": ["jng"] + }, + "image/x-mrsid-image": { + "source": "apache", + "extensions": ["sid"] + }, + "image/x-ms-bmp": { + "source": "nginx", + "compressible": true, + "extensions": ["bmp"] + }, + "image/x-pcx": { + "source": "apache", + "extensions": ["pcx"] + }, + "image/x-pict": { + "source": "apache", + "extensions": ["pic","pct"] + }, + "image/x-portable-anymap": { + "source": "apache", + "extensions": ["pnm"] + }, + "image/x-portable-bitmap": { + "source": "apache", + "extensions": ["pbm"] + }, + "image/x-portable-graymap": { + "source": "apache", + "extensions": ["pgm"] + }, + "image/x-portable-pixmap": { + "source": "apache", + "extensions": ["ppm"] + }, + "image/x-rgb": { + "source": "apache", + "extensions": ["rgb"] + }, + "image/x-tga": { + "source": "apache", + "extensions": ["tga"] + }, + "image/x-xbitmap": { + "source": "apache", + "extensions": ["xbm"] + }, + "image/x-xcf": { + "compressible": false + }, + "image/x-xpixmap": { + "source": "apache", + "extensions": ["xpm"] + }, + "image/x-xwindowdump": { + "source": "apache", + "extensions": ["xwd"] + }, + "message/cpim": { + "source": "iana" + }, + "message/delivery-status": { + "source": "iana" + }, + "message/disposition-notification": { + "source": "iana", + "extensions": [ + "disposition-notification" + ] + }, + "message/external-body": { + "source": "iana" + }, + "message/feedback-report": { + "source": "iana" + }, + "message/global": { + "source": "iana", + "extensions": ["u8msg"] + }, + "message/global-delivery-status": { + "source": "iana", + "extensions": ["u8dsn"] + }, + "message/global-disposition-notification": { + "source": "iana", + "extensions": ["u8mdn"] + }, + "message/global-headers": { + "source": "iana", + "extensions": ["u8hdr"] + }, + "message/http": { + "source": "iana", + "compressible": false + }, + "message/imdn+xml": { + "source": "iana", + "compressible": true + }, + "message/news": { + "source": "iana" + }, + "message/partial": { + "source": "iana", + "compressible": false + }, + "message/rfc822": { + "source": "iana", + "compressible": true, + "extensions": ["eml","mime"] + }, + "message/s-http": { + "source": "iana" + }, + "message/sip": { + "source": "iana" + }, + "message/sipfrag": { + "source": "iana" + }, + "message/tracking-status": { + "source": "iana" + }, + "message/vnd.si.simp": { + "source": "iana" + }, + "message/vnd.wfa.wsc": { + "source": "iana", + "extensions": ["wsc"] + }, + "model/3mf": { + "source": "iana", + "extensions": ["3mf"] + }, + "model/e57": { + "source": "iana" + }, + "model/gltf+json": { + "source": "iana", + "compressible": true, + "extensions": ["gltf"] + }, + "model/gltf-binary": { + "source": "iana", + "compressible": true, + "extensions": ["glb"] + }, + "model/iges": { + "source": "iana", + "compressible": false, + "extensions": ["igs","iges"] + }, + "model/mesh": { + "source": "iana", + "compressible": false, + "extensions": ["msh","mesh","silo"] + }, + "model/mtl": { + "source": "iana", + "extensions": ["mtl"] + }, + "model/obj": { + "source": "iana", + "extensions": ["obj"] + }, + "model/stl": { + "source": "iana", + "extensions": ["stl"] + }, + "model/vnd.collada+xml": { + "source": "iana", + "compressible": true, + "extensions": ["dae"] + }, + "model/vnd.dwf": { + "source": "iana", + "extensions": ["dwf"] + }, + "model/vnd.flatland.3dml": { + "source": "iana" + }, + "model/vnd.gdl": { + "source": "iana", + "extensions": ["gdl"] + }, + "model/vnd.gs-gdl": { + "source": "apache" + }, + "model/vnd.gs.gdl": { + "source": "iana" + }, + "model/vnd.gtw": { + "source": "iana", + "extensions": ["gtw"] + }, + "model/vnd.moml+xml": { + "source": "iana", + "compressible": true + }, + "model/vnd.mts": { + "source": "iana", + "extensions": ["mts"] + }, + "model/vnd.opengex": { + "source": "iana", + "extensions": ["ogex"] + }, + "model/vnd.parasolid.transmit.binary": { + "source": "iana", + "extensions": ["x_b"] + }, + "model/vnd.parasolid.transmit.text": { + "source": "iana", + "extensions": ["x_t"] + }, + "model/vnd.rosette.annotated-data-model": { + "source": "iana" + }, + "model/vnd.usdz+zip": { + "source": "iana", + "compressible": false, + "extensions": ["usdz"] + }, + "model/vnd.valve.source.compiled-map": { + "source": "iana", + "extensions": ["bsp"] + }, + "model/vnd.vtu": { + "source": "iana", + "extensions": ["vtu"] + }, + "model/vrml": { + "source": "iana", + "compressible": false, + "extensions": ["wrl","vrml"] + }, + "model/x3d+binary": { + "source": "apache", + "compressible": false, + "extensions": ["x3db","x3dbz"] + }, + "model/x3d+fastinfoset": { + "source": "iana", + "extensions": ["x3db"] + }, + "model/x3d+vrml": { + "source": "apache", + "compressible": false, + "extensions": ["x3dv","x3dvz"] + }, + "model/x3d+xml": { + "source": "iana", + "compressible": true, + "extensions": ["x3d","x3dz"] + }, + "model/x3d-vrml": { + "source": "iana", + "extensions": ["x3dv"] + }, + "multipart/alternative": { + "source": "iana", + "compressible": false + }, + "multipart/appledouble": { + "source": "iana" + }, + "multipart/byteranges": { + "source": "iana" + }, + "multipart/digest": { + "source": "iana" + }, + "multipart/encrypted": { + "source": "iana", + "compressible": false + }, + "multipart/form-data": { + "source": "iana", + "compressible": false + }, + "multipart/header-set": { + "source": "iana" + }, + "multipart/mixed": { + "source": "iana" + }, + "multipart/multilingual": { + "source": "iana" + }, + "multipart/parallel": { + "source": "iana" + }, + "multipart/related": { + "source": "iana", + "compressible": false + }, + "multipart/report": { + "source": "iana" + }, + "multipart/signed": { + "source": "iana", + "compressible": false + }, + "multipart/vnd.bint.med-plus": { + "source": "iana" + }, + "multipart/voice-message": { + "source": "iana" + }, + "multipart/x-mixed-replace": { + "source": "iana" + }, + "text/1d-interleaved-parityfec": { + "source": "iana" + }, + "text/cache-manifest": { + "source": "iana", + "compressible": true, + "extensions": ["appcache","manifest"] + }, + "text/calendar": { + "source": "iana", + "extensions": ["ics","ifb"] + }, + "text/calender": { + "compressible": true + }, + "text/cmd": { + "compressible": true + }, + "text/coffeescript": { + "extensions": ["coffee","litcoffee"] + }, + "text/cql": { + "source": "iana" + }, + "text/cql-expression": { + "source": "iana" + }, + "text/cql-identifier": { + "source": "iana" + }, + "text/css": { + "source": "iana", + "charset": "UTF-8", + "compressible": true, + "extensions": ["css"] + }, + "text/csv": { + "source": "iana", + "compressible": true, + "extensions": ["csv"] + }, + "text/csv-schema": { + "source": "iana" + }, + "text/directory": { + "source": "iana" + }, + "text/dns": { + "source": "iana" + }, + "text/ecmascript": { + "source": "iana" + }, + "text/encaprtp": { + "source": "iana" + }, + "text/enriched": { + "source": "iana" + }, + "text/fhirpath": { + "source": "iana" + }, + "text/flexfec": { + "source": "iana" + }, + "text/fwdred": { + "source": "iana" + }, + "text/gff3": { + "source": "iana" + }, + "text/grammar-ref-list": { + "source": "iana" + }, + "text/html": { + "source": "iana", + "compressible": true, + "extensions": ["html","htm","shtml"] + }, + "text/jade": { + "extensions": ["jade"] + }, + "text/javascript": { + "source": "iana", + "compressible": true + }, + "text/jcr-cnd": { + "source": "iana" + }, + "text/jsx": { + "compressible": true, + "extensions": ["jsx"] + }, + "text/less": { + "compressible": true, + "extensions": ["less"] + }, + "text/markdown": { + "source": "iana", + "compressible": true, + "extensions": ["markdown","md"] + }, + "text/mathml": { + "source": "nginx", + "extensions": ["mml"] + }, + "text/mdx": { + "compressible": true, + "extensions": ["mdx"] + }, + "text/mizar": { + "source": "iana" + }, + "text/n3": { + "source": "iana", + "charset": "UTF-8", + "compressible": true, + "extensions": ["n3"] + }, + "text/parameters": { + "source": "iana", + "charset": "UTF-8" + }, + "text/parityfec": { + "source": "iana" + }, + "text/plain": { + "source": "iana", + "compressible": true, + "extensions": ["txt","text","conf","def","list","log","in","ini"] + }, + "text/provenance-notation": { + "source": "iana", + "charset": "UTF-8" + }, + "text/prs.fallenstein.rst": { + "source": "iana" + }, + "text/prs.lines.tag": { + "source": "iana", + "extensions": ["dsc"] + }, + "text/prs.prop.logic": { + "source": "iana" + }, + "text/raptorfec": { + "source": "iana" + }, + "text/red": { + "source": "iana" + }, + "text/rfc822-headers": { + "source": "iana" + }, + "text/richtext": { + "source": "iana", + "compressible": true, + "extensions": ["rtx"] + }, + "text/rtf": { + "source": "iana", + "compressible": true, + "extensions": ["rtf"] + }, + "text/rtp-enc-aescm128": { + "source": "iana" + }, + "text/rtploopback": { + "source": "iana" + }, + "text/rtx": { + "source": "iana" + }, + "text/sgml": { + "source": "iana", + "extensions": ["sgml","sgm"] + }, + "text/shaclc": { + "source": "iana" + }, + "text/shex": { + "extensions": ["shex"] + }, + "text/slim": { + "extensions": ["slim","slm"] + }, + "text/spdx": { + "source": "iana", + "extensions": ["spdx"] + }, + "text/strings": { + "source": "iana" + }, + "text/stylus": { + "extensions": ["stylus","styl"] + }, + "text/t140": { + "source": "iana" + }, + "text/tab-separated-values": { + "source": "iana", + "compressible": true, + "extensions": ["tsv"] + }, + "text/troff": { + "source": "iana", + "extensions": ["t","tr","roff","man","me","ms"] + }, + "text/turtle": { + "source": "iana", + "charset": "UTF-8", + "extensions": ["ttl"] + }, + "text/ulpfec": { + "source": "iana" + }, + "text/uri-list": { + "source": "iana", + "compressible": true, + "extensions": ["uri","uris","urls"] + }, + "text/vcard": { + "source": "iana", + "compressible": true, + "extensions": ["vcard"] + }, + "text/vnd.a": { + "source": "iana" + }, + "text/vnd.abc": { + "source": "iana" + }, + "text/vnd.ascii-art": { + "source": "iana" + }, + "text/vnd.curl": { + "source": "iana", + "extensions": ["curl"] + }, + "text/vnd.curl.dcurl": { + "source": "apache", + "extensions": ["dcurl"] + }, + "text/vnd.curl.mcurl": { + "source": "apache", + "extensions": ["mcurl"] + }, + "text/vnd.curl.scurl": { + "source": "apache", + "extensions": ["scurl"] + }, + "text/vnd.debian.copyright": { + "source": "iana", + "charset": "UTF-8" + }, + "text/vnd.dmclientscript": { + "source": "iana" + }, + "text/vnd.dvb.subtitle": { + "source": "iana", + "extensions": ["sub"] + }, + "text/vnd.esmertec.theme-descriptor": { + "source": "iana", + "charset": "UTF-8" + }, + "text/vnd.ficlab.flt": { + "source": "iana" + }, + "text/vnd.fly": { + "source": "iana", + "extensions": ["fly"] + }, + "text/vnd.fmi.flexstor": { + "source": "iana", + "extensions": ["flx"] + }, + "text/vnd.gml": { + "source": "iana" + }, + "text/vnd.graphviz": { + "source": "iana", + "extensions": ["gv"] + }, + "text/vnd.hans": { + "source": "iana" + }, + "text/vnd.hgl": { + "source": "iana" + }, + "text/vnd.in3d.3dml": { + "source": "iana", + "extensions": ["3dml"] + }, + "text/vnd.in3d.spot": { + "source": "iana", + "extensions": ["spot"] + }, + "text/vnd.iptc.newsml": { + "source": "iana" + }, + "text/vnd.iptc.nitf": { + "source": "iana" + }, + "text/vnd.latex-z": { + "source": "iana" + }, + "text/vnd.motorola.reflex": { + "source": "iana" + }, + "text/vnd.ms-mediapackage": { + "source": "iana" + }, + "text/vnd.net2phone.commcenter.command": { + "source": "iana" + }, + "text/vnd.radisys.msml-basic-layout": { + "source": "iana" + }, + "text/vnd.senx.warpscript": { + "source": "iana" + }, + "text/vnd.si.uricatalogue": { + "source": "iana" + }, + "text/vnd.sosi": { + "source": "iana" + }, + "text/vnd.sun.j2me.app-descriptor": { + "source": "iana", + "charset": "UTF-8", + "extensions": ["jad"] + }, + "text/vnd.trolltech.linguist": { + "source": "iana", + "charset": "UTF-8" + }, + "text/vnd.wap.si": { + "source": "iana" + }, + "text/vnd.wap.sl": { + "source": "iana" + }, + "text/vnd.wap.wml": { + "source": "iana", + "extensions": ["wml"] + }, + "text/vnd.wap.wmlscript": { + "source": "iana", + "extensions": ["wmls"] + }, + "text/vtt": { + "source": "iana", + "charset": "UTF-8", + "compressible": true, + "extensions": ["vtt"] + }, + "text/x-asm": { + "source": "apache", + "extensions": ["s","asm"] + }, + "text/x-c": { + "source": "apache", + "extensions": ["c","cc","cxx","cpp","h","hh","dic"] + }, + "text/x-component": { + "source": "nginx", + "extensions": ["htc"] + }, + "text/x-fortran": { + "source": "apache", + "extensions": ["f","for","f77","f90"] + }, + "text/x-gwt-rpc": { + "compressible": true + }, + "text/x-handlebars-template": { + "extensions": ["hbs"] + }, + "text/x-java-source": { + "source": "apache", + "extensions": ["java"] + }, + "text/x-jquery-tmpl": { + "compressible": true + }, + "text/x-lua": { + "extensions": ["lua"] + }, + "text/x-markdown": { + "compressible": true, + "extensions": ["mkd"] + }, + "text/x-nfo": { + "source": "apache", + "extensions": ["nfo"] + }, + "text/x-opml": { + "source": "apache", + "extensions": ["opml"] + }, + "text/x-org": { + "compressible": true, + "extensions": ["org"] + }, + "text/x-pascal": { + "source": "apache", + "extensions": ["p","pas"] + }, + "text/x-processing": { + "compressible": true, + "extensions": ["pde"] + }, + "text/x-sass": { + "extensions": ["sass"] + }, + "text/x-scss": { + "extensions": ["scss"] + }, + "text/x-setext": { + "source": "apache", + "extensions": ["etx"] + }, + "text/x-sfv": { + "source": "apache", + "extensions": ["sfv"] + }, + "text/x-suse-ymp": { + "compressible": true, + "extensions": ["ymp"] + }, + "text/x-uuencode": { + "source": "apache", + "extensions": ["uu"] + }, + "text/x-vcalendar": { + "source": "apache", + "extensions": ["vcs"] + }, + "text/x-vcard": { + "source": "apache", + "extensions": ["vcf"] + }, + "text/xml": { + "source": "iana", + "compressible": true, + "extensions": ["xml"] + }, + "text/xml-external-parsed-entity": { + "source": "iana" + }, + "text/yaml": { + "extensions": ["yaml","yml"] + }, + "video/1d-interleaved-parityfec": { + "source": "iana" + }, + "video/3gpp": { + "source": "iana", + "extensions": ["3gp","3gpp"] + }, + "video/3gpp-tt": { + "source": "iana" + }, + "video/3gpp2": { + "source": "iana", + "extensions": ["3g2"] + }, + "video/av1": { + "source": "iana" + }, + "video/bmpeg": { + "source": "iana" + }, + "video/bt656": { + "source": "iana" + }, + "video/celb": { + "source": "iana" + }, + "video/dv": { + "source": "iana" + }, + "video/encaprtp": { + "source": "iana" + }, + "video/flexfec": { + "source": "iana" + }, + "video/h261": { + "source": "iana", + "extensions": ["h261"] + }, + "video/h263": { + "source": "iana", + "extensions": ["h263"] + }, + "video/h263-1998": { + "source": "iana" + }, + "video/h263-2000": { + "source": "iana" + }, + "video/h264": { + "source": "iana", + "extensions": ["h264"] + }, + "video/h264-rcdo": { + "source": "iana" + }, + "video/h264-svc": { + "source": "iana" + }, + "video/h265": { + "source": "iana" + }, + "video/iso.segment": { + "source": "iana", + "extensions": ["m4s"] + }, + "video/jpeg": { + "source": "iana", + "extensions": ["jpgv"] + }, + "video/jpeg2000": { + "source": "iana" + }, + "video/jpm": { + "source": "apache", + "extensions": ["jpm","jpgm"] + }, + "video/mj2": { + "source": "iana", + "extensions": ["mj2","mjp2"] + }, + "video/mp1s": { + "source": "iana" + }, + "video/mp2p": { + "source": "iana" + }, + "video/mp2t": { + "source": "iana", + "extensions": ["ts"] + }, + "video/mp4": { + "source": "iana", + "compressible": false, + "extensions": ["mp4","mp4v","mpg4"] + }, + "video/mp4v-es": { + "source": "iana" + }, + "video/mpeg": { + "source": "iana", + "compressible": false, + "extensions": ["mpeg","mpg","mpe","m1v","m2v"] + }, + "video/mpeg4-generic": { + "source": "iana" + }, + "video/mpv": { + "source": "iana" + }, + "video/nv": { + "source": "iana" + }, + "video/ogg": { + "source": "iana", + "compressible": false, + "extensions": ["ogv"] + }, + "video/parityfec": { + "source": "iana" + }, + "video/pointer": { + "source": "iana" + }, + "video/quicktime": { + "source": "iana", + "compressible": false, + "extensions": ["qt","mov"] + }, + "video/raptorfec": { + "source": "iana" + }, + "video/raw": { + "source": "iana" + }, + "video/rtp-enc-aescm128": { + "source": "iana" + }, + "video/rtploopback": { + "source": "iana" + }, + "video/rtx": { + "source": "iana" + }, + "video/scip": { + "source": "iana" + }, + "video/smpte291": { + "source": "iana" + }, + "video/smpte292m": { + "source": "iana" + }, + "video/ulpfec": { + "source": "iana" + }, + "video/vc1": { + "source": "iana" + }, + "video/vc2": { + "source": "iana" + }, + "video/vnd.cctv": { + "source": "iana" + }, + "video/vnd.dece.hd": { + "source": "iana", + "extensions": ["uvh","uvvh"] + }, + "video/vnd.dece.mobile": { + "source": "iana", + "extensions": ["uvm","uvvm"] + }, + "video/vnd.dece.mp4": { + "source": "iana" + }, + "video/vnd.dece.pd": { + "source": "iana", + "extensions": ["uvp","uvvp"] + }, + "video/vnd.dece.sd": { + "source": "iana", + "extensions": ["uvs","uvvs"] + }, + "video/vnd.dece.video": { + "source": "iana", + "extensions": ["uvv","uvvv"] + }, + "video/vnd.directv.mpeg": { + "source": "iana" + }, + "video/vnd.directv.mpeg-tts": { + "source": "iana" + }, + "video/vnd.dlna.mpeg-tts": { + "source": "iana" + }, + "video/vnd.dvb.file": { + "source": "iana", + "extensions": ["dvb"] + }, + "video/vnd.fvt": { + "source": "iana", + "extensions": ["fvt"] + }, + "video/vnd.hns.video": { + "source": "iana" + }, + "video/vnd.iptvforum.1dparityfec-1010": { + "source": "iana" + }, + "video/vnd.iptvforum.1dparityfec-2005": { + "source": "iana" + }, + "video/vnd.iptvforum.2dparityfec-1010": { + "source": "iana" + }, + "video/vnd.iptvforum.2dparityfec-2005": { + "source": "iana" + }, + "video/vnd.iptvforum.ttsavc": { + "source": "iana" + }, + "video/vnd.iptvforum.ttsmpeg2": { + "source": "iana" + }, + "video/vnd.motorola.video": { + "source": "iana" + }, + "video/vnd.motorola.videop": { + "source": "iana" + }, + "video/vnd.mpegurl": { + "source": "iana", + "extensions": ["mxu","m4u"] + }, + "video/vnd.ms-playready.media.pyv": { + "source": "iana", + "extensions": ["pyv"] + }, + "video/vnd.nokia.interleaved-multimedia": { + "source": "iana" + }, + "video/vnd.nokia.mp4vr": { + "source": "iana" + }, + "video/vnd.nokia.videovoip": { + "source": "iana" + }, + "video/vnd.objectvideo": { + "source": "iana" + }, + "video/vnd.radgamettools.bink": { + "source": "iana" + }, + "video/vnd.radgamettools.smacker": { + "source": "iana" + }, + "video/vnd.sealed.mpeg1": { + "source": "iana" + }, + "video/vnd.sealed.mpeg4": { + "source": "iana" + }, + "video/vnd.sealed.swf": { + "source": "iana" + }, + "video/vnd.sealedmedia.softseal.mov": { + "source": "iana" + }, + "video/vnd.uvvu.mp4": { + "source": "iana", + "extensions": ["uvu","uvvu"] + }, + "video/vnd.vivo": { + "source": "iana", + "extensions": ["viv"] + }, + "video/vnd.youtube.yt": { + "source": "iana" + }, + "video/vp8": { + "source": "iana" + }, + "video/webm": { + "source": "apache", + "compressible": false, + "extensions": ["webm"] + }, + "video/x-f4v": { + "source": "apache", + "extensions": ["f4v"] + }, + "video/x-fli": { + "source": "apache", + "extensions": ["fli"] + }, + "video/x-flv": { + "source": "apache", + "compressible": false, + "extensions": ["flv"] + }, + "video/x-m4v": { + "source": "apache", + "extensions": ["m4v"] + }, + "video/x-matroska": { + "source": "apache", + "compressible": false, + "extensions": ["mkv","mk3d","mks"] + }, + "video/x-mng": { + "source": "apache", + "extensions": ["mng"] + }, + "video/x-ms-asf": { + "source": "apache", + "extensions": ["asf","asx"] + }, + "video/x-ms-vob": { + "source": "apache", + "extensions": ["vob"] + }, + "video/x-ms-wm": { + "source": "apache", + "extensions": ["wm"] + }, + "video/x-ms-wmv": { + "source": "apache", + "compressible": false, + "extensions": ["wmv"] + }, + "video/x-ms-wmx": { + "source": "apache", + "extensions": ["wmx"] + }, + "video/x-ms-wvx": { + "source": "apache", + "extensions": ["wvx"] + }, + "video/x-msvideo": { + "source": "apache", + "extensions": ["avi"] + }, + "video/x-sgi-movie": { + "source": "apache", + "extensions": ["movie"] + }, + "video/x-smv": { + "source": "apache", + "extensions": ["smv"] + }, + "x-conference/x-cooltalk": { + "source": "apache", + "extensions": ["ice"] + }, + "x-shader/x-fragment": { + "compressible": true + }, + "x-shader/x-vertex": { + "compressible": true + } +} diff --git a/node_modules/mime-db/index.js b/node_modules/mime-db/index.js new file mode 100644 index 00000000..551031f6 --- /dev/null +++ b/node_modules/mime-db/index.js @@ -0,0 +1,11 @@ +/*! + * mime-db + * Copyright(c) 2014 Jonathan Ong + * MIT Licensed + */ + +/** + * Module exports. + */ + +module.exports = require('./db.json') diff --git a/node_modules/mime-db/package.json b/node_modules/mime-db/package.json new file mode 100644 index 00000000..7a74a2df --- /dev/null +++ b/node_modules/mime-db/package.json @@ -0,0 +1,102 @@ +{ + "_from": "mime-db@1.46.0", + "_id": "mime-db@1.46.0", + "_inBundle": false, + "_integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", + "_location": "/mime-db", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "mime-db@1.46.0", + "name": "mime-db", + "escapedName": "mime-db", + "rawSpec": "1.46.0", + "saveSpec": null, + "fetchSpec": "1.46.0" + }, + "_requiredBy": [ + "/mime-types" + ], + "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", + "_shasum": "6267748a7f799594de3cbc8cde91def349661cee", + "_spec": "mime-db@1.46.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\mime-types", + "bugs": { + "url": "https://github.com/jshttp/mime-db/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + }, + { + "name": "Robert Kieffer", + "email": "robert@broofa.com", + "url": "http://github.com/broofa" + } + ], + "deprecated": false, + "description": "Media Type Database", + "devDependencies": { + "bluebird": "3.7.2", + "co": "4.6.0", + "cogent": "1.0.1", + "csv-parse": "4.15.1", + "eslint": "7.20.0", + "eslint-config-standard": "15.0.1", + "eslint-plugin-import": "2.22.1", + "eslint-plugin-markdown": "1.0.2", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "4.3.1", + "eslint-plugin-standard": "4.1.0", + "gnode": "0.1.2", + "mocha": "8.3.0", + "nyc": "15.1.0", + "raw-body": "2.4.1", + "stream-to-array": "2.3.0" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "db.json", + "index.js" + ], + "homepage": "https://github.com/jshttp/mime-db#readme", + "keywords": [ + "mime", + "db", + "type", + "types", + "database", + "charset", + "charsets" + ], + "license": "MIT", + "name": "mime-db", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/mime-db.git" + }, + "scripts": { + "build": "node scripts/build", + "fetch": "node scripts/fetch-apache && gnode scripts/fetch-iana && node scripts/fetch-nginx", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "update": "npm run fetch && npm run build", + "version": "node scripts/version-history.js && git add HISTORY.md" + }, + "version": "1.46.0" +} diff --git a/node_modules/mime-types/HISTORY.md b/node_modules/mime-types/HISTORY.md new file mode 100644 index 00000000..2e50fc84 --- /dev/null +++ b/node_modules/mime-types/HISTORY.md @@ -0,0 +1,355 @@ +2.1.29 / 2021-02-17 +=================== + + * deps: mime-db@1.46.0 + - Add extension `.amr` to `audio/amr` + - Add extension `.m4s` to `video/iso.segment` + - Add extension `.opus` to `audio/ogg` + - Add new upstream MIME types + +2.1.28 / 2021-01-01 +=================== + + * deps: mime-db@1.45.0 + - Add `application/ubjson` with extension `.ubj` + - Add `image/avif` with extension `.avif` + - Add `image/ktx2` with extension `.ktx2` + - Add extension `.dbf` to `application/vnd.dbf` + - Add extension `.rar` to `application/vnd.rar` + - Add extension `.td` to `application/urc-targetdesc+xml` + - Add new upstream MIME types + - Fix extension of `application/vnd.apple.keynote` to be `.key` + +2.1.27 / 2020-04-23 +=================== + + * deps: mime-db@1.44.0 + - Add charsets from IANA + - Add extension `.cjs` to `application/node` + - Add new upstream MIME types + +2.1.26 / 2020-01-05 +=================== + + * deps: mime-db@1.43.0 + - Add `application/x-keepass2` with extension `.kdbx` + - Add extension `.mxmf` to `audio/mobile-xmf` + - Add extensions from IANA for `application/*+xml` types + - Add new upstream MIME types + +2.1.25 / 2019-11-12 +=================== + + * deps: mime-db@1.42.0 + - Add new upstream MIME types + - Add `application/toml` with extension `.toml` + - Add `image/vnd.ms-dds` with extension `.dds` + +2.1.24 / 2019-04-20 +=================== + + * deps: mime-db@1.40.0 + - Add extensions from IANA for `model/*` types + - Add `text/mdx` with extension `.mdx` + +2.1.23 / 2019-04-17 +=================== + + * deps: mime-db@~1.39.0 + - Add extensions `.siv` and `.sieve` to `application/sieve` + - Add new upstream MIME types + +2.1.22 / 2019-02-14 +=================== + + * deps: mime-db@~1.38.0 + - Add extension `.nq` to `application/n-quads` + - Add extension `.nt` to `application/n-triples` + - Add new upstream MIME types + - Mark `text/less` as compressible + +2.1.21 / 2018-10-19 +=================== + + * deps: mime-db@~1.37.0 + - Add extensions to HEIC image types + - Add new upstream MIME types + +2.1.20 / 2018-08-26 +=================== + + * deps: mime-db@~1.36.0 + - Add Apple file extensions from IANA + - Add extensions from IANA for `image/*` types + - Add new upstream MIME types + +2.1.19 / 2018-07-17 +=================== + + * deps: mime-db@~1.35.0 + - Add extension `.csl` to `application/vnd.citationstyles.style+xml` + - Add extension `.es` to `application/ecmascript` + - Add extension `.owl` to `application/rdf+xml` + - Add new upstream MIME types + - Add UTF-8 as default charset for `text/turtle` + +2.1.18 / 2018-02-16 +=================== + + * deps: mime-db@~1.33.0 + - Add `application/raml+yaml` with extension `.raml` + - Add `application/wasm` with extension `.wasm` + - Add `text/shex` with extension `.shex` + - Add extensions for JPEG-2000 images + - Add extensions from IANA for `message/*` types + - Add new upstream MIME types + - Update font MIME types + - Update `text/hjson` to registered `application/hjson` + +2.1.17 / 2017-09-01 +=================== + + * deps: mime-db@~1.30.0 + - Add `application/vnd.ms-outlook` + - Add `application/x-arj` + - Add extension `.mjs` to `application/javascript` + - Add glTF types and extensions + - Add new upstream MIME types + - Add `text/x-org` + - Add VirtualBox MIME types + - Fix `source` records for `video/*` types that are IANA + - Update `font/opentype` to registered `font/otf` + +2.1.16 / 2017-07-24 +=================== + + * deps: mime-db@~1.29.0 + - Add `application/fido.trusted-apps+json` + - Add extension `.wadl` to `application/vnd.sun.wadl+xml` + - Add extension `.gz` to `application/gzip` + - Add new upstream MIME types + - Update extensions `.md` and `.markdown` to be `text/markdown` + +2.1.15 / 2017-03-23 +=================== + + * deps: mime-db@~1.27.0 + - Add new mime types + - Add `image/apng` + +2.1.14 / 2017-01-14 +=================== + + * deps: mime-db@~1.26.0 + - Add new mime types + +2.1.13 / 2016-11-18 +=================== + + * deps: mime-db@~1.25.0 + - Add new mime types + +2.1.12 / 2016-09-18 +=================== + + * deps: mime-db@~1.24.0 + - Add new mime types + - Add `audio/mp3` + +2.1.11 / 2016-05-01 +=================== + + * deps: mime-db@~1.23.0 + - Add new mime types + +2.1.10 / 2016-02-15 +=================== + + * deps: mime-db@~1.22.0 + - Add new mime types + - Fix extension of `application/dash+xml` + - Update primary extension for `audio/mp4` + +2.1.9 / 2016-01-06 +================== + + * deps: mime-db@~1.21.0 + - Add new mime types + +2.1.8 / 2015-11-30 +================== + + * deps: mime-db@~1.20.0 + - Add new mime types + +2.1.7 / 2015-09-20 +================== + + * deps: mime-db@~1.19.0 + - Add new mime types + +2.1.6 / 2015-09-03 +================== + + * deps: mime-db@~1.18.0 + - Add new mime types + +2.1.5 / 2015-08-20 +================== + + * deps: mime-db@~1.17.0 + - Add new mime types + +2.1.4 / 2015-07-30 +================== + + * deps: mime-db@~1.16.0 + - Add new mime types + +2.1.3 / 2015-07-13 +================== + + * deps: mime-db@~1.15.0 + - Add new mime types + +2.1.2 / 2015-06-25 +================== + + * deps: mime-db@~1.14.0 + - Add new mime types + +2.1.1 / 2015-06-08 +================== + + * perf: fix deopt during mapping + +2.1.0 / 2015-06-07 +================== + + * Fix incorrectly treating extension-less file name as extension + - i.e. `'path/to/json'` will no longer return `application/json` + * Fix `.charset(type)` to accept parameters + * Fix `.charset(type)` to match case-insensitive + * Improve generation of extension to MIME mapping + * Refactor internals for readability and no argument reassignment + * Prefer `application/*` MIME types from the same source + * Prefer any type over `application/octet-stream` + * deps: mime-db@~1.13.0 + - Add nginx as a source + - Add new mime types + +2.0.14 / 2015-06-06 +=================== + + * deps: mime-db@~1.12.0 + - Add new mime types + +2.0.13 / 2015-05-31 +=================== + + * deps: mime-db@~1.11.0 + - Add new mime types + +2.0.12 / 2015-05-19 +=================== + + * deps: mime-db@~1.10.0 + - Add new mime types + +2.0.11 / 2015-05-05 +=================== + + * deps: mime-db@~1.9.1 + - Add new mime types + +2.0.10 / 2015-03-13 +=================== + + * deps: mime-db@~1.8.0 + - Add new mime types + +2.0.9 / 2015-02-09 +================== + + * deps: mime-db@~1.7.0 + - Add new mime types + - Community extensions ownership transferred from `node-mime` + +2.0.8 / 2015-01-29 +================== + + * deps: mime-db@~1.6.0 + - Add new mime types + +2.0.7 / 2014-12-30 +================== + + * deps: mime-db@~1.5.0 + - Add new mime types + - Fix various invalid MIME type entries + +2.0.6 / 2014-12-30 +================== + + * deps: mime-db@~1.4.0 + - Add new mime types + - Fix various invalid MIME type entries + - Remove example template MIME types + +2.0.5 / 2014-12-29 +================== + + * deps: mime-db@~1.3.1 + - Fix missing extensions + +2.0.4 / 2014-12-10 +================== + + * deps: mime-db@~1.3.0 + - Add new mime types + +2.0.3 / 2014-11-09 +================== + + * deps: mime-db@~1.2.0 + - Add new mime types + +2.0.2 / 2014-09-28 +================== + + * deps: mime-db@~1.1.0 + - Add new mime types + - Add additional compressible + - Update charsets + +2.0.1 / 2014-09-07 +================== + + * Support Node.js 0.6 + +2.0.0 / 2014-09-02 +================== + + * Use `mime-db` + * Remove `.define()` + +1.0.2 / 2014-08-04 +================== + + * Set charset=utf-8 for `text/javascript` + +1.0.1 / 2014-06-24 +================== + + * Add `text/jsx` type + +1.0.0 / 2014-05-12 +================== + + * Return `false` for unknown types + * Set charset=utf-8 for `application/json` + +0.1.0 / 2014-05-02 +================== + + * Initial release diff --git a/node_modules/mime-types/LICENSE b/node_modules/mime-types/LICENSE new file mode 100644 index 00000000..06166077 --- /dev/null +++ b/node_modules/mime-types/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +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/node_modules/mime-types/README.md b/node_modules/mime-types/README.md new file mode 100644 index 00000000..c978ac27 --- /dev/null +++ b/node_modules/mime-types/README.md @@ -0,0 +1,113 @@ +# mime-types + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][ci-image]][ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +The ultimate javascript content-type utility. + +Similar to [the `mime@1.x` module](https://www.npmjs.com/package/mime), except: + +- __No fallbacks.__ Instead of naively returning the first available type, + `mime-types` simply returns `false`, so do + `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. +- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. +- No `.define()` functionality +- Bug fixes for `.lookup(path)` + +Otherwise, the API is compatible with `mime` 1.x. + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install mime-types +``` + +## Adding Types + +All mime types are based on [mime-db](https://www.npmjs.com/package/mime-db), +so open a PR there if you'd like to add mime types. + +## API + +```js +var mime = require('mime-types') +``` + +All functions return `false` if input is invalid or not found. + +### mime.lookup(path) + +Lookup the content-type associated with a file. + +```js +mime.lookup('json') // 'application/json' +mime.lookup('.md') // 'text/markdown' +mime.lookup('file.html') // 'text/html' +mime.lookup('folder/file.js') // 'application/javascript' +mime.lookup('folder/.htaccess') // false + +mime.lookup('cats') // false +``` + +### mime.contentType(type) + +Create a full content-type header given a content-type or extension. +When given an extension, `mime.lookup` is used to get the matching +content-type, otherwise the given content-type is used. Then if the +content-type does not already have a `charset` parameter, `mime.charset` +is used to get the default charset and add to the returned content-type. + +```js +mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' +mime.contentType('file.json') // 'application/json; charset=utf-8' +mime.contentType('text/html') // 'text/html; charset=utf-8' +mime.contentType('text/html; charset=iso-8859-1') // 'text/html; charset=iso-8859-1' + +// from a full path +mime.contentType(path.extname('/path/to/file.json')) // 'application/json; charset=utf-8' +``` + +### mime.extension(type) + +Get the default extension for a content-type. + +```js +mime.extension('application/octet-stream') // 'bin' +``` + +### mime.charset(type) + +Lookup the implied default charset of a content-type. + +```js +mime.charset('text/markdown') // 'UTF-8' +``` + +### var type = mime.types[extension] + +A map of content-types by extension. + +### [extensions...] = mime.extensions[type] + +A map of extensions by content-type. + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/jshttp/mime-types/master?label=ci +[ci-url]: https://github.com/jshttp/mime-types/actions?query=workflow%3Aci +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/mime-types/master +[coveralls-url]: https://coveralls.io/r/jshttp/mime-types?branch=master +[node-version-image]: https://badgen.net/npm/node/mime-types +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/mime-types +[npm-url]: https://npmjs.org/package/mime-types +[npm-version-image]: https://badgen.net/npm/v/mime-types diff --git a/node_modules/mime-types/index.js b/node_modules/mime-types/index.js new file mode 100644 index 00000000..b9f34d59 --- /dev/null +++ b/node_modules/mime-types/index.js @@ -0,0 +1,188 @@ +/*! + * mime-types + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var db = require('mime-db') +var extname = require('path').extname + +/** + * Module variables. + * @private + */ + +var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/ +var TEXT_TYPE_REGEXP = /^text\//i + +/** + * Module exports. + * @public + */ + +exports.charset = charset +exports.charsets = { lookup: charset } +exports.contentType = contentType +exports.extension = extension +exports.extensions = Object.create(null) +exports.lookup = lookup +exports.types = Object.create(null) + +// Populate the extensions/types maps +populateMaps(exports.extensions, exports.types) + +/** + * Get the default charset for a MIME type. + * + * @param {string} type + * @return {boolean|string} + */ + +function charset (type) { + if (!type || typeof type !== 'string') { + return false + } + + // TODO: use media-typer + var match = EXTRACT_TYPE_REGEXP.exec(type) + var mime = match && db[match[1].toLowerCase()] + + if (mime && mime.charset) { + return mime.charset + } + + // default text/* to utf-8 + if (match && TEXT_TYPE_REGEXP.test(match[1])) { + return 'UTF-8' + } + + return false +} + +/** + * Create a full Content-Type header given a MIME type or extension. + * + * @param {string} str + * @return {boolean|string} + */ + +function contentType (str) { + // TODO: should this even be in this module? + if (!str || typeof str !== 'string') { + return false + } + + var mime = str.indexOf('/') === -1 + ? exports.lookup(str) + : str + + if (!mime) { + return false + } + + // TODO: use content-type or other module + if (mime.indexOf('charset') === -1) { + var charset = exports.charset(mime) + if (charset) mime += '; charset=' + charset.toLowerCase() + } + + return mime +} + +/** + * Get the default extension for a MIME type. + * + * @param {string} type + * @return {boolean|string} + */ + +function extension (type) { + if (!type || typeof type !== 'string') { + return false + } + + // TODO: use media-typer + var match = EXTRACT_TYPE_REGEXP.exec(type) + + // get extensions + var exts = match && exports.extensions[match[1].toLowerCase()] + + if (!exts || !exts.length) { + return false + } + + return exts[0] +} + +/** + * Lookup the MIME type for a file path/extension. + * + * @param {string} path + * @return {boolean|string} + */ + +function lookup (path) { + if (!path || typeof path !== 'string') { + return false + } + + // get the extension ("ext" or ".ext" or full path) + var extension = extname('x.' + path) + .toLowerCase() + .substr(1) + + if (!extension) { + return false + } + + return exports.types[extension] || false +} + +/** + * Populate the extensions and types maps. + * @private + */ + +function populateMaps (extensions, types) { + // source preference (least -> most) + var preference = ['nginx', 'apache', undefined, 'iana'] + + Object.keys(db).forEach(function forEachMimeType (type) { + var mime = db[type] + var exts = mime.extensions + + if (!exts || !exts.length) { + return + } + + // mime -> extensions + extensions[type] = exts + + // extension -> mime + for (var i = 0; i < exts.length; i++) { + var extension = exts[i] + + if (types[extension]) { + var from = preference.indexOf(db[types[extension]].source) + var to = preference.indexOf(mime.source) + + if (types[extension] !== 'application/octet-stream' && + (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) { + // skip the remapping + continue + } + } + + // set the extension -> mime + types[extension] = type + } + }) +} diff --git a/node_modules/mime-types/package.json b/node_modules/mime-types/package.json new file mode 100644 index 00000000..3bef8f6a --- /dev/null +++ b/node_modules/mime-types/package.json @@ -0,0 +1,88 @@ +{ + "_from": "mime-types@~2.1.24", + "_id": "mime-types@2.1.29", + "_inBundle": false, + "_integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "_location": "/mime-types", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "mime-types@~2.1.24", + "name": "mime-types", + "escapedName": "mime-types", + "rawSpec": "~2.1.24", + "saveSpec": null, + "fetchSpec": "~2.1.24" + }, + "_requiredBy": [ + "/accepts", + "/type-is" + ], + "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", + "_shasum": "1d4ab77da64b91f5f72489df29236563754bb1b2", + "_spec": "mime-types@~2.1.24", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\accepts", + "bugs": { + "url": "https://github.com/jshttp/mime-types/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jeremiah Senkpiel", + "email": "fishrock123@rocketmail.com", + "url": "https://searchbeam.jit.su" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "dependencies": { + "mime-db": "1.46.0" + }, + "deprecated": false, + "description": "The ultimate javascript content-type utility.", + "devDependencies": { + "eslint": "7.20.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.22.1", + "eslint-plugin-markdown": "2.0.0", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "4.3.1", + "eslint-plugin-standard": "4.1.0", + "mocha": "8.3.0", + "nyc": "15.1.0" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "index.js" + ], + "homepage": "https://github.com/jshttp/mime-types#readme", + "keywords": [ + "mime", + "types" + ], + "license": "MIT", + "name": "mime-types", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/mime-types.git" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec test/test.js", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + }, + "version": "2.1.29" +} diff --git a/node_modules/mime/.npmignore b/node_modules/mime/.npmignore new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/mime/CHANGELOG.md b/node_modules/mime/CHANGELOG.md new file mode 100644 index 00000000..f1275350 --- /dev/null +++ b/node_modules/mime/CHANGELOG.md @@ -0,0 +1,164 @@ +# Changelog + +## v1.6.0 (24/11/2017) +*No changelog for this release.* + +--- + +## v2.0.4 (24/11/2017) +- [**closed**] Switch to mime-score module for resolving extension contention issues. [#182](https://github.com/broofa/node-mime/issues/182) +- [**closed**] Update mime-db to 1.31.0 in v1.x branch [#181](https://github.com/broofa/node-mime/issues/181) + +--- + +## v1.5.0 (22/11/2017) +- [**closed**] need ES5 version ready in npm package [#179](https://github.com/broofa/node-mime/issues/179) +- [**closed**] mime-db no trace of iWork - pages / numbers / etc. [#178](https://github.com/broofa/node-mime/issues/178) +- [**closed**] How it works in brownser ? [#176](https://github.com/broofa/node-mime/issues/176) +- [**closed**] Missing `./Mime` [#175](https://github.com/broofa/node-mime/issues/175) +- [**closed**] Vulnerable Regular Expression [#167](https://github.com/broofa/node-mime/issues/167) + +--- + +## v2.0.3 (25/09/2017) +*No changelog for this release.* + +--- + +## v1.4.1 (25/09/2017) +- [**closed**] Issue when bundling with webpack [#172](https://github.com/broofa/node-mime/issues/172) + +--- + +## v2.0.2 (15/09/2017) +- [**V2**] fs.readFileSync is not a function [#165](https://github.com/broofa/node-mime/issues/165) +- [**closed**] The extension for video/quicktime should map to .mov, not .qt [#164](https://github.com/broofa/node-mime/issues/164) +- [**V2**] [v2 Feedback request] Mime class API [#163](https://github.com/broofa/node-mime/issues/163) +- [**V2**] [v2 Feedback request] Resolving conflicts over extensions [#162](https://github.com/broofa/node-mime/issues/162) +- [**V2**] Allow callers to load module with official, full, or no defined types. [#161](https://github.com/broofa/node-mime/issues/161) +- [**V2**] Use "facets" to resolve extension conflicts [#160](https://github.com/broofa/node-mime/issues/160) +- [**V2**] Remove fs and path dependencies [#152](https://github.com/broofa/node-mime/issues/152) +- [**V2**] Default content-type should not be application/octet-stream [#139](https://github.com/broofa/node-mime/issues/139) +- [**V2**] reset mime-types [#124](https://github.com/broofa/node-mime/issues/124) +- [**V2**] Extensionless paths should return null or false [#113](https://github.com/broofa/node-mime/issues/113) + +--- + +## v2.0.1 (14/09/2017) +- [**closed**] Changelog for v2.0 does not mention breaking changes [#171](https://github.com/broofa/node-mime/issues/171) +- [**closed**] MIME breaking with 'class' declaration as it is without 'use strict mode' [#170](https://github.com/broofa/node-mime/issues/170) + +--- + +## v2.0.0 (12/09/2017) +- [**closed**] woff and woff2 [#168](https://github.com/broofa/node-mime/issues/168) + +--- + +## v1.4.0 (28/08/2017) +- [**closed**] support for ac3 voc files [#159](https://github.com/broofa/node-mime/issues/159) +- [**closed**] Help understanding change from application/xml to text/xml [#158](https://github.com/broofa/node-mime/issues/158) +- [**closed**] no longer able to override mimetype [#157](https://github.com/broofa/node-mime/issues/157) +- [**closed**] application/vnd.adobe.photoshop [#147](https://github.com/broofa/node-mime/issues/147) +- [**closed**] Directories should appear as something other than application/octet-stream [#135](https://github.com/broofa/node-mime/issues/135) +- [**closed**] requested features [#131](https://github.com/broofa/node-mime/issues/131) +- [**closed**] Make types.json loading optional? [#129](https://github.com/broofa/node-mime/issues/129) +- [**closed**] Cannot find module './types.json' [#120](https://github.com/broofa/node-mime/issues/120) +- [**V2**] .wav files show up as "audio/x-wav" instead of "audio/x-wave" [#118](https://github.com/broofa/node-mime/issues/118) +- [**closed**] Don't be a pain in the ass for node community [#108](https://github.com/broofa/node-mime/issues/108) +- [**closed**] don't make default_type global [#78](https://github.com/broofa/node-mime/issues/78) +- [**closed**] mime.extension() fails if the content-type is parameterized [#74](https://github.com/broofa/node-mime/issues/74) + +--- + +## v1.3.6 (11/05/2017) +- [**closed**] .md should be text/markdown as of March 2016 [#154](https://github.com/broofa/node-mime/issues/154) +- [**closed**] Error while installing mime [#153](https://github.com/broofa/node-mime/issues/153) +- [**closed**] application/manifest+json [#149](https://github.com/broofa/node-mime/issues/149) +- [**closed**] Dynamic adaptive streaming over HTTP (DASH) file extension typo [#141](https://github.com/broofa/node-mime/issues/141) +- [**closed**] charsets image/png undefined [#140](https://github.com/broofa/node-mime/issues/140) +- [**closed**] Mime-db dependency out of date [#130](https://github.com/broofa/node-mime/issues/130) +- [**closed**] how to support plist? [#126](https://github.com/broofa/node-mime/issues/126) +- [**closed**] how does .types file format look like? [#123](https://github.com/broofa/node-mime/issues/123) +- [**closed**] Feature: support for expanding MIME patterns [#121](https://github.com/broofa/node-mime/issues/121) +- [**closed**] DEBUG_MIME doesn't work [#117](https://github.com/broofa/node-mime/issues/117) + +--- + +## v1.3.4 (06/02/2015) +*No changelog for this release.* + +--- + +## v1.3.3 (06/02/2015) +*No changelog for this release.* + +--- + +## v1.3.1 (05/02/2015) +- [**closed**] Consider adding support for Handlebars .hbs file ending [#111](https://github.com/broofa/node-mime/issues/111) +- [**closed**] Consider adding support for hjson. [#110](https://github.com/broofa/node-mime/issues/110) +- [**closed**] Add mime type for Opus audio files [#94](https://github.com/broofa/node-mime/issues/94) +- [**closed**] Consider making the `Requesting New Types` information more visible [#77](https://github.com/broofa/node-mime/issues/77) + +--- + +## v1.3.0 (05/02/2015) +- [**closed**] Add common name? [#114](https://github.com/broofa/node-mime/issues/114) +- [**closed**] application/x-yaml [#104](https://github.com/broofa/node-mime/issues/104) +- [**closed**] Add mime type for WOFF file format 2.0 [#102](https://github.com/broofa/node-mime/issues/102) +- [**closed**] application/x-msi for .msi [#99](https://github.com/broofa/node-mime/issues/99) +- [**closed**] Add mimetype for gettext translation files [#98](https://github.com/broofa/node-mime/issues/98) +- [**closed**] collaborators [#88](https://github.com/broofa/node-mime/issues/88) +- [**closed**] getting errot in installation of mime module...any1 can help? [#87](https://github.com/broofa/node-mime/issues/87) +- [**closed**] should application/json's charset be utf8? [#86](https://github.com/broofa/node-mime/issues/86) +- [**closed**] Add "license" and "licenses" to package.json [#81](https://github.com/broofa/node-mime/issues/81) +- [**closed**] lookup with extension-less file on Windows returns wrong type [#68](https://github.com/broofa/node-mime/issues/68) + +--- + +## v1.2.11 (15/08/2013) +- [**closed**] Update mime.types [#65](https://github.com/broofa/node-mime/issues/65) +- [**closed**] Publish a new version [#63](https://github.com/broofa/node-mime/issues/63) +- [**closed**] README should state upfront that "application/octet-stream" is default for unknown extension [#55](https://github.com/broofa/node-mime/issues/55) +- [**closed**] Suggested improvement to the charset API [#52](https://github.com/broofa/node-mime/issues/52) + +--- + +## v1.2.10 (25/07/2013) +- [**closed**] Mime type for woff files should be application/font-woff and not application/x-font-woff [#62](https://github.com/broofa/node-mime/issues/62) +- [**closed**] node.types in conflict with mime.types [#51](https://github.com/broofa/node-mime/issues/51) + +--- + +## v1.2.9 (17/01/2013) +- [**closed**] Please update "mime" NPM [#49](https://github.com/broofa/node-mime/issues/49) +- [**closed**] Please add semicolon [#46](https://github.com/broofa/node-mime/issues/46) +- [**closed**] parse full mime types [#43](https://github.com/broofa/node-mime/issues/43) + +--- + +## v1.2.8 (10/01/2013) +- [**closed**] /js directory mime is application/javascript. Is it correct? [#47](https://github.com/broofa/node-mime/issues/47) +- [**closed**] Add mime types for lua code. [#45](https://github.com/broofa/node-mime/issues/45) + +--- + +## v1.2.7 (19/10/2012) +- [**closed**] cannot install 1.2.7 via npm [#41](https://github.com/broofa/node-mime/issues/41) +- [**closed**] Transfer ownership to @broofa [#36](https://github.com/broofa/node-mime/issues/36) +- [**closed**] it's wrong to set charset to UTF-8 for text [#30](https://github.com/broofa/node-mime/issues/30) +- [**closed**] Allow multiple instances of MIME types container [#27](https://github.com/broofa/node-mime/issues/27) + +--- + +## v1.2.5 (16/02/2012) +- [**closed**] When looking up a types, check hasOwnProperty [#23](https://github.com/broofa/node-mime/issues/23) +- [**closed**] Bump version to 1.2.2 [#18](https://github.com/broofa/node-mime/issues/18) +- [**closed**] No license [#16](https://github.com/broofa/node-mime/issues/16) +- [**closed**] Some types missing that are used by html5/css3 [#13](https://github.com/broofa/node-mime/issues/13) +- [**closed**] npm install fails for 1.2.1 [#12](https://github.com/broofa/node-mime/issues/12) +- [**closed**] image/pjpeg + image/x-png [#10](https://github.com/broofa/node-mime/issues/10) +- [**closed**] symlink [#8](https://github.com/broofa/node-mime/issues/8) +- [**closed**] gzip [#2](https://github.com/broofa/node-mime/issues/2) +- [**closed**] ALL CAPS filenames return incorrect mime type [#1](https://github.com/broofa/node-mime/issues/1) diff --git a/node_modules/mime/LICENSE b/node_modules/mime/LICENSE new file mode 100644 index 00000000..d3f46f7e --- /dev/null +++ b/node_modules/mime/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2010 Benjamin Thomas, Robert Kieffer + +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/node_modules/mime/README.md b/node_modules/mime/README.md new file mode 100644 index 00000000..506fbe55 --- /dev/null +++ b/node_modules/mime/README.md @@ -0,0 +1,90 @@ +# mime + +Comprehensive MIME type mapping API based on mime-db module. + +## Install + +Install with [npm](http://github.com/isaacs/npm): + + npm install mime + +## Contributing / Testing + + npm run test + +## Command Line + + mime [path_string] + +E.g. + + > mime scripts/jquery.js + application/javascript + +## API - Queries + +### mime.lookup(path) +Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. + +```js +var mime = require('mime'); + +mime.lookup('/path/to/file.txt'); // => 'text/plain' +mime.lookup('file.txt'); // => 'text/plain' +mime.lookup('.TXT'); // => 'text/plain' +mime.lookup('htm'); // => 'text/html' +``` + +### mime.default_type +Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) + +### mime.extension(type) +Get the default extension for `type` + +```js +mime.extension('text/html'); // => 'html' +mime.extension('application/octet-stream'); // => 'bin' +``` + +### mime.charsets.lookup() + +Map mime-type to charset + +```js +mime.charsets.lookup('text/plain'); // => 'UTF-8' +``` + +(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) + +## API - Defining Custom Types + +Custom type mappings can be added on a per-project basis via the following APIs. + +### mime.define() + +Add custom mime/extension mappings + +```js +mime.define({ + 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], + 'application/x-my-type': ['x-mt', 'x-mtt'], + // etc ... +}); + +mime.lookup('x-sft'); // => 'text/x-some-format' +``` + +The first entry in the extensions array is returned by `mime.extension()`. E.g. + +```js +mime.extension('text/x-some-format'); // => 'x-sf' +``` + +### mime.load(filepath) + +Load mappings from an Apache ".types" format file + +```js +mime.load('./my_project.types'); +``` +The .types file format is simple - See the `types` dir for examples. diff --git a/node_modules/mime/cli.js b/node_modules/mime/cli.js new file mode 100644 index 00000000..20b1ffeb --- /dev/null +++ b/node_modules/mime/cli.js @@ -0,0 +1,8 @@ +#!/usr/bin/env node + +var mime = require('./mime.js'); +var file = process.argv[2]; +var type = mime.lookup(file); + +process.stdout.write(type + '\n'); + diff --git a/node_modules/mime/mime.js b/node_modules/mime/mime.js new file mode 100644 index 00000000..d7efbde7 --- /dev/null +++ b/node_modules/mime/mime.js @@ -0,0 +1,108 @@ +var path = require('path'); +var fs = require('fs'); + +function Mime() { + // Map of extension -> mime type + this.types = Object.create(null); + + // Map of mime type -> extension + this.extensions = Object.create(null); +} + +/** + * Define mimetype -> extension mappings. Each key is a mime-type that maps + * to an array of extensions associated with the type. The first extension is + * used as the default extension for the type. + * + * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); + * + * @param map (Object) type definitions + */ +Mime.prototype.define = function (map) { + for (var type in map) { + var exts = map[type]; + for (var i = 0; i < exts.length; i++) { + if (process.env.DEBUG_MIME && this.types[exts[i]]) { + console.warn((this._loading || "define()").replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + + this.types[exts[i]] + ' to ' + type); + } + + this.types[exts[i]] = type; + } + + // Default extension is the first one we encounter + if (!this.extensions[type]) { + this.extensions[type] = exts[0]; + } + } +}; + +/** + * Load an Apache2-style ".types" file + * + * This may be called multiple times (it's expected). Where files declare + * overlapping types/extensions, the last file wins. + * + * @param file (String) path of file to load. + */ +Mime.prototype.load = function(file) { + this._loading = file; + // Read file and split into lines + var map = {}, + content = fs.readFileSync(file, 'ascii'), + lines = content.split(/[\r\n]+/); + + lines.forEach(function(line) { + // Clean up whitespace/comments, and split into fields + var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); + map[fields.shift()] = fields; + }); + + this.define(map); + + this._loading = null; +}; + +/** + * Lookup a mime type based on extension + */ +Mime.prototype.lookup = function(path, fallback) { + var ext = path.replace(/^.*[\.\/\\]/, '').toLowerCase(); + + return this.types[ext] || fallback || this.default_type; +}; + +/** + * Return file extension associated with a mime type + */ +Mime.prototype.extension = function(mimeType) { + var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); + return this.extensions[type]; +}; + +// Default instance +var mime = new Mime(); + +// Define built-in types +mime.define(require('./types.json')); + +// Default type +mime.default_type = mime.lookup('bin'); + +// +// Additional API specific to the default instance +// + +mime.Mime = Mime; + +/** + * Lookup a charset based on mime type. + */ +mime.charsets = { + lookup: function(mimeType, fallback) { + // Assume text types are utf8 + return (/^text\/|^application\/(javascript|json)/).test(mimeType) ? 'UTF-8' : fallback; + } +}; + +module.exports = mime; diff --git a/node_modules/mime/package.json b/node_modules/mime/package.json new file mode 100644 index 00000000..eb46730f --- /dev/null +++ b/node_modules/mime/package.json @@ -0,0 +1,73 @@ +{ + "_from": "mime@1.6.0", + "_id": "mime@1.6.0", + "_inBundle": false, + "_integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "_location": "/mime", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "mime@1.6.0", + "name": "mime", + "escapedName": "mime", + "rawSpec": "1.6.0", + "saveSpec": null, + "fetchSpec": "1.6.0" + }, + "_requiredBy": [ + "/send" + ], + "_resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "_shasum": "32cd9e5c64553bd58d19a568af452acff04981b1", + "_spec": "mime@1.6.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\send", + "author": { + "name": "Robert Kieffer", + "email": "robert@broofa.com", + "url": "http://github.com/broofa" + }, + "bin": { + "mime": "cli.js" + }, + "bugs": { + "url": "https://github.com/broofa/node-mime/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Benjamin Thomas", + "email": "benjamin@benjaminthomas.org", + "url": "http://github.com/bentomas" + } + ], + "dependencies": {}, + "deprecated": false, + "description": "A comprehensive library for mime-type mapping", + "devDependencies": { + "github-release-notes": "0.13.1", + "mime-db": "1.31.0", + "mime-score": "1.1.0" + }, + "engines": { + "node": ">=4" + }, + "homepage": "https://github.com/broofa/node-mime#readme", + "keywords": [ + "util", + "mime" + ], + "license": "MIT", + "main": "mime.js", + "name": "mime", + "repository": { + "url": "git+https://github.com/broofa/node-mime.git", + "type": "git" + }, + "scripts": { + "changelog": "gren changelog --tags=all --generate --override", + "prepare": "node src/build.js", + "test": "node src/test.js" + }, + "version": "1.6.0" +} diff --git a/node_modules/mime/src/build.js b/node_modules/mime/src/build.js new file mode 100644 index 00000000..4928e48b --- /dev/null +++ b/node_modules/mime/src/build.js @@ -0,0 +1,53 @@ +#!/usr/bin/env node + +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const mimeScore = require('mime-score'); + +let db = require('mime-db'); +let chalk = require('chalk'); + +const STANDARD_FACET_SCORE = 900; + +const byExtension = {}; + +// Clear out any conflict extensions in mime-db +for (let type in db) { + let entry = db[type]; + entry.type = type; + + if (!entry.extensions) continue; + + entry.extensions.forEach(ext => { + if (ext in byExtension) { + const e0 = entry; + const e1 = byExtension[ext]; + e0.pri = mimeScore(e0.type, e0.source); + e1.pri = mimeScore(e1.type, e1.source); + + let drop = e0.pri < e1.pri ? e0 : e1; + let keep = e0.pri >= e1.pri ? e0 : e1; + drop.extensions = drop.extensions.filter(e => e !== ext); + + console.log(`${ext}: Keeping ${chalk.green(keep.type)} (${keep.pri}), dropping ${chalk.red(drop.type)} (${drop.pri})`); + } + byExtension[ext] = entry; + }); +} + +function writeTypesFile(types, path) { + fs.writeFileSync(path, JSON.stringify(types)); +} + +// Segregate into standard and non-standard types based on facet per +// https://tools.ietf.org/html/rfc6838#section-3.1 +const types = {}; + +Object.keys(db).sort().forEach(k => { + const entry = db[k]; + types[entry.type] = entry.extensions; +}); + +writeTypesFile(types, path.join(__dirname, '..', 'types.json')); diff --git a/node_modules/mime/src/test.js b/node_modules/mime/src/test.js new file mode 100644 index 00000000..42958a20 --- /dev/null +++ b/node_modules/mime/src/test.js @@ -0,0 +1,60 @@ +/** + * Usage: node test.js + */ + +var mime = require('../mime'); +var assert = require('assert'); +var path = require('path'); + +// +// Test mime lookups +// + +assert.equal('text/plain', mime.lookup('text.txt')); // normal file +assert.equal('text/plain', mime.lookup('TEXT.TXT')); // uppercase +assert.equal('text/plain', mime.lookup('dir/text.txt')); // dir + file +assert.equal('text/plain', mime.lookup('.text.txt')); // hidden file +assert.equal('text/plain', mime.lookup('.txt')); // nameless +assert.equal('text/plain', mime.lookup('txt')); // extension-only +assert.equal('text/plain', mime.lookup('/txt')); // extension-less () +assert.equal('text/plain', mime.lookup('\\txt')); // Windows, extension-less +assert.equal('application/octet-stream', mime.lookup('text.nope')); // unrecognized +assert.equal('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default + +// +// Test extensions +// + +assert.equal('txt', mime.extension(mime.types.text)); +assert.equal('html', mime.extension(mime.types.htm)); +assert.equal('bin', mime.extension('application/octet-stream')); +assert.equal('bin', mime.extension('application/octet-stream ')); +assert.equal('html', mime.extension(' text/html; charset=UTF-8')); +assert.equal('html', mime.extension('text/html; charset=UTF-8 ')); +assert.equal('html', mime.extension('text/html; charset=UTF-8')); +assert.equal('html', mime.extension('text/html ; charset=UTF-8')); +assert.equal('html', mime.extension('text/html;charset=UTF-8')); +assert.equal('html', mime.extension('text/Html;charset=UTF-8')); +assert.equal(undefined, mime.extension('unrecognized')); + +// +// Test node.types lookups +// + +assert.equal('font/woff', mime.lookup('file.woff')); +assert.equal('application/octet-stream', mime.lookup('file.buffer')); +// TODO: Uncomment once #157 is resolved +// assert.equal('audio/mp4', mime.lookup('file.m4a')); +assert.equal('font/otf', mime.lookup('file.otf')); + +// +// Test charsets +// + +assert.equal('UTF-8', mime.charsets.lookup('text/plain')); +assert.equal('UTF-8', mime.charsets.lookup(mime.types.js)); +assert.equal('UTF-8', mime.charsets.lookup(mime.types.json)); +assert.equal(undefined, mime.charsets.lookup(mime.types.bin)); +assert.equal('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); + +console.log('\nAll tests passed'); diff --git a/node_modules/mime/types.json b/node_modules/mime/types.json new file mode 100644 index 00000000..bec78abd --- /dev/null +++ b/node_modules/mime/types.json @@ -0,0 +1 @@ +{"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomsvc+xml":["atomsvc"],"application/bdoc":["bdoc"],"application/ccxml+xml":["ccxml"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/font-tdpfr":["pfr"],"application/font-woff":[],"application/font-woff2":[],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/prs.cww":["cww"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":[],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":[],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":[],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":[],"application/x-msdownload":["com","bat"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["wmf","emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":[],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"application/xaml+xml":["xaml"],"application/xcap-diff+xml":["xdf"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":[],"audio/adpcm":["adp"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mp3":[],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/wav":["wav"],"audio/wave":[],"audio/webm":["weba"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":[],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":[],"audio/x-wav":[],"audio/xm":["xm"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/apng":["apng"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/g3fax":["g3"],"image/gif":["gif"],"image/ief":["ief"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/ktx":["ktx"],"image/png":["png"],"image/prs.btif":["btif"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/tiff":["tiff","tif"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":[],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/webp":["webp"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":[],"image/x-pcx":["pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/rfc822":["eml","mime"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.vtu":["vtu"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["x3db","x3dbz"],"model/x3d+vrml":["x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/hjson":["hjson"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/prs.lines.tag":["dsc"],"text/richtext":["rtx"],"text/rtf":[],"text/sgml":["sgml","sgm"],"text/slim":["slim","slm"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/vtt":["vtt"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":[],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"text/xml":[],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/jpeg":["jpgv"],"video/jpm":["jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/webm":["webm"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]} \ No newline at end of file diff --git a/node_modules/mongodb/HISTORY.md b/node_modules/mongodb/HISTORY.md new file mode 100644 index 00000000..2b1a797c --- /dev/null +++ b/node_modules/mongodb/HISTORY.md @@ -0,0 +1,2838 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +### [3.6.4](https://github.com/mongodb/node-mongodb-native/compare/v3.6.3...v3.6.4) (2021-02-02) + + +### Features + +* add explain support ([#2626](https://github.com/mongodb/node-mongodb-native/issues/2626)) ([a827807](https://github.com/mongodb/node-mongodb-native/commit/a8278070992d2de4134dc0841b4027a6cc745a93)) +* Deprecate top-level write concern option keys ([#2624](https://github.com/mongodb/node-mongodb-native/issues/2624)) ([0516d93](https://github.com/mongodb/node-mongodb-native/commit/0516d93f74de4b58a99e8455e59678d4b09cd4a7)) + + +### Bug Fixes + +* Allow GridFS write stream to destroy ([#2702](https://github.com/mongodb/node-mongodb-native/issues/2702)) ([b5e9d67](https://github.com/mongodb/node-mongodb-native/commit/b5e9d67d5cd9b1912a349789cf2a122e00a46d1b)) +* awaitable isMaster timeout must respect connectTimeoutMS ([#2627](https://github.com/mongodb/node-mongodb-native/issues/2627)) ([b365c50](https://github.com/mongodb/node-mongodb-native/commit/b365c5061ded832e1682167edac58e8a04b05fc4)) +* don't add empty query string items to connection string ([8897259](https://github.com/mongodb/node-mongodb-native/commit/889725980ec1e3b4be4a74170bea0a3e3d23cf13)) +* don't reset monitor if we aren't streaming topology changes ([a10171b](https://github.com/mongodb/node-mongodb-native/commit/a10171b57d2414f6df2aa8ffe9c2d3938ad838d1)) +* dont parse tls/ssl file paths in uri ([#2718](https://github.com/mongodb/node-mongodb-native/issues/2718)) ([f89e4c1](https://github.com/mongodb/node-mongodb-native/commit/f89e4c1bd59c64664e8c9aa218bcb856be325d34)) +* hasAtomicOperator check respects toBSON transformation ([#2696](https://github.com/mongodb/node-mongodb-native/issues/2696)) ([60936dc](https://github.com/mongodb/node-mongodb-native/commit/60936dca74167de239d1bb51a23cc9870860bdc4)) +* honor ignoreUndefined on findAndModify commands ([#2671](https://github.com/mongodb/node-mongodb-native/issues/2671)) ([a25b67c](https://github.com/mongodb/node-mongodb-native/commit/a25b67c6ac13b6347cb78c4fc56613f3daf44300)) +* ignore ENOTFOUND during TXT record lookup ([2036fe7](https://github.com/mongodb/node-mongodb-native/commit/2036fe7b298b9678e29ede87c1035c748ff89fcd)) +* respect readPreference and writeConcern from connection string ([#2711](https://github.com/mongodb/node-mongodb-native/issues/2711)) ([b657c8c](https://github.com/mongodb/node-mongodb-native/commit/b657c8c4f3f86018cc4824f84cb22e1527d9f9af)) +* restore auto direct connection behavior ([#2719](https://github.com/mongodb/node-mongodb-native/issues/2719)) ([617d9de](https://github.com/mongodb/node-mongodb-native/commit/617d9dec5180c5f7b67bd8c944c168d4cbd27e1c)) +* support empty TXT records in legacy url parser ([2fa5c5f](https://github.com/mongodb/node-mongodb-native/commit/2fa5c5f2a113920baa8e67a1c0d65432690d37fc)) +* transition topology state before async calls ([#2637](https://github.com/mongodb/node-mongodb-native/issues/2637)) ([9df093c](https://github.com/mongodb/node-mongodb-native/commit/9df093c1d46e1f8616c7a979324923205ac3dcd2)) +* **cursor:** don't use other operation's session for cloned cursor operation ([#2705](https://github.com/mongodb/node-mongodb-native/issues/2705)) ([8082c89](https://github.com/mongodb/node-mongodb-native/commit/8082c89f8ef3624d22f4bdd6066b6f72c44f763d)) +* **find:** correctly translate timeout option into noCursorTimeout ([#2700](https://github.com/mongodb/node-mongodb-native/issues/2700)) ([e257e6b](https://github.com/mongodb/node-mongodb-native/commit/e257e6b19d810920bafc579e725e09bd0607b74b)) + + +## [3.6.3](https://github.com/mongodb/node-mongodb-native/compare/v3.6.1...v3.6.3) (2020-11-06) + + +### Bug Fixes + +* add peerDependenciesMeta to mark optional deps ([#2606](https://github.com/mongodb/node-mongodb-native/issues/2606)) ([186090e](https://github.com/mongodb/node-mongodb-native/commit/186090e)) +* adds topology discovery for sharded cluster ([f8fd310](https://github.com/mongodb/node-mongodb-native/commit/f8fd310)) +* allow event loop to process during wait queue processing ([#2537](https://github.com/mongodb/node-mongodb-native/issues/2537)) ([4e03dfa](https://github.com/mongodb/node-mongodb-native/commit/4e03dfa)) +* Change socket timeout default to 0 ([#2572](https://github.com/mongodb/node-mongodb-native/issues/2572)) ([89b77ed](https://github.com/mongodb/node-mongodb-native/commit/89b77ed)) +* connection leak if wait queue member cancelled ([cafaa1b](https://github.com/mongodb/node-mongodb-native/commit/cafaa1b)) +* correctly assign username to X509 auth command ([#2587](https://github.com/mongodb/node-mongodb-native/issues/2587)) ([9110a45](https://github.com/mongodb/node-mongodb-native/commit/9110a45)) +* correctly re-establishes pipe destinations ([a6e7caf](https://github.com/mongodb/node-mongodb-native/commit/a6e7caf)) +* Fix test filters and revert mocha version ([#2558](https://github.com/mongodb/node-mongodb-native/issues/2558)) ([0e5c45a](https://github.com/mongodb/node-mongodb-native/commit/0e5c45a)) +* move kerberos client setup from prepare to auth ([#2608](https://github.com/mongodb/node-mongodb-native/issues/2608)) ([033b6e7](https://github.com/mongodb/node-mongodb-native/commit/033b6e7)) +* permit waking async interval with unreliable clock ([e0e11bb](https://github.com/mongodb/node-mongodb-native/commit/e0e11bb)) +* remove geoNear deprecation ([4955a52](https://github.com/mongodb/node-mongodb-native/commit/4955a52)) +* revert use of setImmediate to process.nextTick ([#2611](https://github.com/mongodb/node-mongodb-native/issues/2611)) ([c9f9d5e](https://github.com/mongodb/node-mongodb-native/commit/c9f9d5e)) +* sets primary read preference for writes ([ddcd03d](https://github.com/mongodb/node-mongodb-native/commit/ddcd03d)) +* use options for readPreference in client ([6acced0](https://github.com/mongodb/node-mongodb-native/commit/6acced0)) +* user roles take single string & DDL readPreference tests ([967de13](https://github.com/mongodb/node-mongodb-native/commit/967de13)) + + + + +## [3.6.2](https://github.com/mongodb/node-mongodb-native/compare/v3.6.1...v3.6.2) (2020-09-10) + + +### Bug Fixes + +* allow event loop to process during wait queue processing ([#2537](https://github.com/mongodb/node-mongodb-native/issues/2537)) ([4e03dfa](https://github.com/mongodb/node-mongodb-native/commit/4e03dfa)) + + + + +## [3.6.1](https://github.com/mongodb/node-mongodb-native/compare/v3.6.0...v3.6.1) (2020-09-02) + + +### Bug Fixes + +* add host/port to cmap connection ([06a2444](https://github.com/mongodb/node-mongodb-native/commit/06a2444)) +* update full list of index options ([0af3191](https://github.com/mongodb/node-mongodb-native/commit/0af3191)) + + +### Features + +* **db:** deprecate createCollection strict mode ([4cc6bcc](https://github.com/mongodb/node-mongodb-native/commit/4cc6bcc)) + + + + +# [3.6.0-beta.0](https://github.com/mongodb/node-mongodb-native/compare/v3.5.5...v3.6.0-beta.0) (2020-04-14) + +### Bug Fixes + +* always return empty array for selection on unknown topology ([af57b57](https://github.com/mongodb/node-mongodb-native/commit/af57b57)) +* always return empty array for selection on unknown topology ([f9e786a](https://github.com/mongodb/node-mongodb-native/commit/f9e786a)) +* correctly use template string for connection string error message ([814e278](https://github.com/mongodb/node-mongodb-native/commit/814e278)) +* createCollection only uses listCollections in strict mode ([d368f12](https://github.com/mongodb/node-mongodb-native/commit/d368f12)) +* don't depend on private node api for `Timeout` wrapper ([e6dc1f4](https://github.com/mongodb/node-mongodb-native/commit/e6dc1f4)) +* don't throw if `withTransaction()` callback rejects with a null reason ([153646c](https://github.com/mongodb/node-mongodb-native/commit/153646c)) +* **cursor:** transforms should only be applied once to documents ([704f30a](https://github.com/mongodb/node-mongodb-native/commit/704f30a)) +* only consider MongoError subclasses for retryability ([265fe40](https://github.com/mongodb/node-mongodb-native/commit/265fe40)) +* **ChangeStream:** whitelist change stream resumable errors ([8a9c108](https://github.com/mongodb/node-mongodb-native/commit/8a9c108)), closes [#17](https://github.com/mongodb/node-mongodb-native/issues/17) [#18](https://github.com/mongodb/node-mongodb-native/issues/18) +* **sdam:** use ObjectId comparison to track maxElectionId ([db991d6](https://github.com/mongodb/node-mongodb-native/commit/db991d6)) +* only mark server session dirty if the client session is alive ([611be8d](https://github.com/mongodb/node-mongodb-native/commit/611be8d)) +* pass options into `commandSupportsReadConcern` ([e855c83](https://github.com/mongodb/node-mongodb-native/commit/e855c83)) +* polyfill for util.promisify ([1c4cf6c](https://github.com/mongodb/node-mongodb-native/commit/1c4cf6c)) +* single `readPreferenceTags` should be parsed as an array ([a50611b](https://github.com/mongodb/node-mongodb-native/commit/a50611b)) +* store name of collection for more informative error messages ([979d41e](https://github.com/mongodb/node-mongodb-native/commit/979d41e)) +* support write concern provided as string in `fromOptions` ([637f428](https://github.com/mongodb/node-mongodb-native/commit/637f428)) +* use properly camel cased form of `mapReduce` for command ([c1ed2c1](https://github.com/mongodb/node-mongodb-native/commit/c1ed2c1)) + + +### Features + +* add MONGODB-AWS as a supported auth mechanism ([7f3cfba](https://github.com/mongodb/node-mongodb-native/commit/7f3cfba)) +* bump wire protocol version for 4.4 ([6d3f313](https://github.com/mongodb/node-mongodb-native/commit/6d3f313)) +* deprecate `oplogReplay` for find commands ([24155e7](https://github.com/mongodb/node-mongodb-native/commit/24155e7)) +* directConnection adds unify behavior for replica set discovery ([c5d60fc](https://github.com/mongodb/node-mongodb-native/commit/c5d60fc)) +* expand use of error labels for retryable writes ([c775a4a](https://github.com/mongodb/node-mongodb-native/commit/c775a4a)) +* support `allowDiskUse` for find commands ([dbc0b37](https://github.com/mongodb/node-mongodb-native/commit/dbc0b37)) +* support creating collections and indexes in transactions ([17e4c88](https://github.com/mongodb/node-mongodb-native/commit/17e4c88)) +* support passing a hint to findOneAndReplace/findOneAndUpdate ([faee15b](https://github.com/mongodb/node-mongodb-native/commit/faee15b)) +* support shorter SCRAM conversations ([6b9ff05](https://github.com/mongodb/node-mongodb-native/commit/6b9ff05)) +* use error labels for retryable writes in legacy topologies ([fefc165](https://github.com/mongodb/node-mongodb-native/commit/fefc165)) + + + + + +## [3.5.7](https://github.com/mongodb/node-mongodb-native/compare/v3.5.6...v3.5.7) (2020-04-29) + + +### Bug Fixes + +* limit growth of server sessions through lazy acquisition ([3d05a6d](https://github.com/mongodb/node-mongodb-native/commit/3d05a6d)) +* remove circular dependency warnings on node 14 ([56a1b8a](https://github.com/mongodb/node-mongodb-native/commit/56a1b8a)) + + + + +## [3.5.6](https://github.com/mongodb/node-mongodb-native/compare/v3.5.5...v3.5.6) (2020-04-14) + +### Bug Fixes + +* always return empty array for selection on unknown topology ([f9e786a](https://github.com/mongodb/node-mongodb-native/commit/f9e786a)) +* createCollection only uses listCollections in strict mode ([d368f12](https://github.com/mongodb/node-mongodb-native/commit/d368f12)) +* don't throw if `withTransaction()` callback rejects with a null reason ([153646c](https://github.com/mongodb/node-mongodb-native/commit/153646c)) +* only mark server session dirty if the client session is alive ([611be8d](https://github.com/mongodb/node-mongodb-native/commit/611be8d)) +* polyfill for util.promisify ([1c4cf6c](https://github.com/mongodb/node-mongodb-native/commit/1c4cf6c)) +* single `readPreferenceTags` should be parsed as an array ([a50611b](https://github.com/mongodb/node-mongodb-native/commit/a50611b)) +* **cursor:** transforms should only be applied once to documents ([704f30a](https://github.com/mongodb/node-mongodb-native/commit/704f30a)) + + + + +## [3.5.5](https://github.com/mongodb/node-mongodb-native/compare/v3.5.4...v3.5.5) (2020-03-11) + + +### Bug Fixes + +* correctly use template string for connection string error message ([6238c84](https://github.com/mongodb/node-mongodb-native/commit/6238c84)) +* don't depend on private node api for `Timeout` wrapper ([3ddaa3e](https://github.com/mongodb/node-mongodb-native/commit/3ddaa3e)) +* multiple concurrent attempts to process the queue may fail ([f69f51c](https://github.com/mongodb/node-mongodb-native/commit/f69f51c)) +* pass optional promise lib to maybePromise ([cde11ec](https://github.com/mongodb/node-mongodb-native/commit/cde11ec)) +* **cursor:** hasNext consumes documents on cursor with limit ([ef04d00](https://github.com/mongodb/node-mongodb-native/commit/ef04d00)) + + + + +## [3.5.4](https://github.com/mongodb/node-mongodb-native/compare/v3.5.3...v3.5.4) (2020-02-25) + + +### Bug Fixes + +* **cmap:** don't run min connection thread if no minimum specified ([2d1b713](https://github.com/mongodb/node-mongodb-native/commit/2d1b713)) +* **sdam:** use ObjectId comparison to track maxElectionId ([a1e0849](https://github.com/mongodb/node-mongodb-native/commit/a1e0849)) +* **topology:** ensure selection wait queue is always processed ([bf701d6](https://github.com/mongodb/node-mongodb-native/commit/bf701d6)) +* **topology:** enter `STATE_CLOSING` before draining waitQueue ([494dffb](https://github.com/mongodb/node-mongodb-native/commit/494dffb)) +* don't consume first document when calling `hasNext` on cursor ([bb359a1](https://github.com/mongodb/node-mongodb-native/commit/bb359a1)) + + +### Features + +* add utility helper for returning promises or using callbacks ([ac9e4c9](https://github.com/mongodb/node-mongodb-native/commit/ac9e4c9)) + + + + +## [3.5.3](https://github.com/mongodb/node-mongodb-native/compare/v3.5.2...v3.5.3) (2020-02-12) + + +### Bug Fixes + +* **message-stream:** support multiple inbound message packets ([8388443](https://github.com/mongodb/node-mongodb-native/commit/8388443)) +* **server:** non-timeout network errors transition to Unknown state ([fa4b01b](https://github.com/mongodb/node-mongodb-native/commit/fa4b01b)) + + +### Features + +* **connection:** support exhaust behavior at the transport level ([9ccf268](https://github.com/mongodb/node-mongodb-native/commit/9ccf268)) + + + + +## [3.5.2](https://github.com/mongodb/node-mongodb-native/compare/v3.5.1...v3.5.2) (2020-01-20) + + +### Bug Fixes + +* properly handle err messages in MongoDB 2.6 servers ([0f4ab38](https://github.com/mongodb/node-mongodb-native/commit/0f4ab38)) +* **topology:** always emit SDAM unrecoverable errors ([57f158f](https://github.com/mongodb/node-mongodb-native/commit/57f158f)) + + + + +## [3.5.1](https://github.com/mongodb/node-mongodb-native/compare/v3.5.0...v3.5.1) (2020-01-17) + + +### Bug Fixes + +* **cmap:** accept all node TLS options as pool options ([5995d1d](https://github.com/mongodb/node-mongodb-native/commit/5995d1d)) +* **cmap:** error wait queue members on failed connection creation ([d13b153](https://github.com/mongodb/node-mongodb-native/commit/d13b153)) +* **connect:** listen to `secureConnect` for tls connections ([f8bdb8d](https://github.com/mongodb/node-mongodb-native/commit/f8bdb8d)) +* **transactions:** use options helper to resolve read preference ([9698a76](https://github.com/mongodb/node-mongodb-native/commit/9698a76)) +* **uri_parser:** TLS uri variants imply `ssl=true` ([c8d182e](https://github.com/mongodb/node-mongodb-native/commit/c8d182e)) + + + + +# [3.5.0](https://github.com/mongodb/node-mongodb-native/compare/v3.4.1...v3.5.0) (2020-01-14) + + +### Bug Fixes + +* copy `ssl` option to pool connection options ([563ced6](https://github.com/mongodb/node-mongodb-native/commit/563ced6)) +* destroy connections marked as closed on checkIn / checkOut ([2bd17a6](https://github.com/mongodb/node-mongodb-native/commit/2bd17a6)) +* ensure sync errors are thrown, and don't callback twice ([cca5b49](https://github.com/mongodb/node-mongodb-native/commit/cca5b49)) +* ignore connection errors during pool destruction ([b8805dc](https://github.com/mongodb/node-mongodb-native/commit/b8805dc)) +* not all message payloads are arrays of Buffer ([e4df5f4](https://github.com/mongodb/node-mongodb-native/commit/e4df5f4)) +* recover on network error during initial connect ([a13dc68](https://github.com/mongodb/node-mongodb-native/commit/a13dc68)) +* remove servers with me mismatch in `updateRsFromPrimary` ([95a772e](https://github.com/mongodb/node-mongodb-native/commit/95a772e)) +* report the correct platform in client metadata ([35d0274](https://github.com/mongodb/node-mongodb-native/commit/35d0274)) +* reschedule monitoring before emitting heartbeat events ([7fcbeb5](https://github.com/mongodb/node-mongodb-native/commit/7fcbeb5)) +* socket timeout for handshake should be `connectTimeoutMS` ([c83af9a](https://github.com/mongodb/node-mongodb-native/commit/c83af9a)) +* timed out streams should be destroyed on `timeout` event ([5319ff9](https://github.com/mongodb/node-mongodb-native/commit/5319ff9)) +* use remote address for stream identifier ([f13c20b](https://github.com/mongodb/node-mongodb-native/commit/f13c20b)) +* used weighted RTT calculation for server selection ([d446be5](https://github.com/mongodb/node-mongodb-native/commit/d446be5)) +* **execute-operation:** don't swallow synchronous errors ([0a2d4e9](https://github.com/mongodb/node-mongodb-native/commit/0a2d4e9)) +* **gridfs:** make a copy of chunk before writing to server ([b4ec5b8](https://github.com/mongodb/node-mongodb-native/commit/b4ec5b8)) + + +### Features + +* add a `withConnection` helper to the connection pool ([d59dced](https://github.com/mongodb/node-mongodb-native/commit/d59dced)) +* include `connectionId` for APM with new CMAP connection pool ([9bd360c](https://github.com/mongodb/node-mongodb-native/commit/9bd360c)) +* integrate CMAP connection pool into unified topology ([9dd3939](https://github.com/mongodb/node-mongodb-native/commit/9dd3939)) +* introduce `MongoServerSelectionError` ([0cf7ec9](https://github.com/mongodb/node-mongodb-native/commit/0cf7ec9)) +* introduce a class for tracking stream specific attributes ([f6bf82c](https://github.com/mongodb/node-mongodb-native/commit/f6bf82c)) +* introduce a new `Monitor` type for server monitoring ([2bfe2a1](https://github.com/mongodb/node-mongodb-native/commit/2bfe2a1)) +* relay all CMAP events to MongoClient ([1aea4de](https://github.com/mongodb/node-mongodb-native/commit/1aea4de)) +* support socket timeouts on a per-connection level ([93e8ad0](https://github.com/mongodb/node-mongodb-native/commit/93e8ad0)) + + + + +## [3.4.1](https://github.com/mongodb/node-mongodb-native/compare/v3.4.0...v3.4.1) (2019-12-19) + + +### Bug Fixes + +* **bulk:** use original indexes as map for current op index ([20800ac](https://github.com/mongodb/node-mongodb-native/commit/20800ac)) +* always check for network errors during SCRAM conversation ([e46a70e](https://github.com/mongodb/node-mongodb-native/commit/e46a70e)) + + + + +# [3.4.0](https://github.com/mongodb/node-mongodb-native/compare/v3.3.5...v3.4.0) (2019-12-10) + + +### Bug Fixes + +* **bulk:** use operation index from input to report operation error ([f713b13](https://github.com/mongodb/node-mongodb-native/commit/f713b13)) +* **command:** only add TransientTransactionError label when in a transaction ([478d714](https://github.com/mongodb/node-mongodb-native/commit/478d714)) +* **compression:** recalculate opcode after determine OP_COMPRESSED ([022f51b](https://github.com/mongodb/node-mongodb-native/commit/022f51b)) +* **connect:** connect with family 0 instead of family 4 ([db07366](https://github.com/mongodb/node-mongodb-native/commit/db07366)) +* **connection:** timed out connections should not be half closed ([850f4f5](https://github.com/mongodb/node-mongodb-native/commit/850f4f5)) +* **cursor:** call `initialize` after session support check ([e50c51a](https://github.com/mongodb/node-mongodb-native/commit/e50c51a)) +* **encryption:** autoEncryption must error on mongodb < 4.2 ([c274615](https://github.com/mongodb/node-mongodb-native/commit/c274615)) +* **encryption:** do not attempt to merge autoEncryption options ([e27fdf9](https://github.com/mongodb/node-mongodb-native/commit/e27fdf9)) +* **encryption:** encryption uses smaller batch size ([cb78e69](https://github.com/mongodb/node-mongodb-native/commit/cb78e69)) +* **encryption:** respect bypassAutoEncryption ([e927499](https://github.com/mongodb/node-mongodb-native/commit/e927499)) +* **encryption:** respect user bson options when using autoEncryption ([cb7a3f7](https://github.com/mongodb/node-mongodb-native/commit/cb7a3f7)) +* add calculated duration to server as `roundTripTime` ([cb107a8](https://github.com/mongodb/node-mongodb-native/commit/cb107a8)) +* **mongodb+srv:** respect overriding SRV-provided properties ([ea83360](https://github.com/mongodb/node-mongodb-native/commit/ea83360)) +* **pool:** flush workItems after next tick to avoid dupe selection ([3ec49e5](https://github.com/mongodb/node-mongodb-native/commit/3ec49e5)) +* **pool:** support a `drain` event for use with unified topology ([da931ea](https://github.com/mongodb/node-mongodb-native/commit/da931ea)) +* **scram:** verify server digest, ensuring mutual authentication ([806cd62](https://github.com/mongodb/node-mongodb-native/commit/806cd62)) +* **srv-poller:** always provide a valid number for `intervalMS` ([afb125f](https://github.com/mongodb/node-mongodb-native/commit/afb125f)) +* **topology:** correct logic for checking for sessions support ([8d157c8](https://github.com/mongodb/node-mongodb-native/commit/8d157c8)) +* **topology:** don't drain iteration timers on server selection ([fed6a57](https://github.com/mongodb/node-mongodb-native/commit/fed6a57)) + + +### Features + +* add `MessageStream` for streamed wire protocol messaging ([8c44044](https://github.com/mongodb/node-mongodb-native/commit/8c44044)) +* introduce a modern `Connection` replacement for CMAP ([7890e48](https://github.com/mongodb/node-mongodb-native/commit/7890e48)) +* support connection establishment cancellation ([2014b7b](https://github.com/mongodb/node-mongodb-native/commit/2014b7b)) +* support driver info for drivers wrapping the node driver ([1b6670b](https://github.com/mongodb/node-mongodb-native/commit/1b6670b)) + + + + +## [3.3.5](https://github.com/mongodb/node-mongodb-native/compare/v3.3.4...v3.3.5) (2019-11-26) + + +### Bug Fixes + +* **bulk:** use operation index from input to report operation error ([08ee53e](https://github.com/mongodb/node-mongodb-native/commit/08ee53e)) +* **command:** only add TransientTransactionError label when in a transaction ([8bab074](https://github.com/mongodb/node-mongodb-native/commit/8bab074)) +* **connect:** connect with family 0 instead of family 4 ([7a41279](https://github.com/mongodb/node-mongodb-native/commit/7a41279)) +* **cursor:** call `initialize` after session support check ([3b076b3](https://github.com/mongodb/node-mongodb-native/commit/3b076b3)) +* **mongodb+srv:** respect overriding SRV-provided properties ([5ed4c07](https://github.com/mongodb/node-mongodb-native/commit/5ed4c07)) +* **pool:** support a `drain` event for use with unified topology ([3471c28](https://github.com/mongodb/node-mongodb-native/commit/3471c28)) +* **topology:** correct logic for checking for sessions support ([2d976bd](https://github.com/mongodb/node-mongodb-native/commit/2d976bd)) +* **topology:** don't drain iteration timers on server selection ([261f1e5](https://github.com/mongodb/node-mongodb-native/commit/261f1e5)) + + +### Features + +* support driver info for drivers wrapping the node driver ([d85c4a8](https://github.com/mongodb/node-mongodb-native/commit/d85c4a8)) + + + + +## [3.3.4](https://github.com/mongodb/node-mongodb-native/compare/v3.3.3...v3.3.4) (2019-11-11) + + +### Bug Fixes + +* **close:** the unified topology emits a close event on close now ([ee0db01](https://github.com/mongodb/node-mongodb-native/commit/ee0db01)) +* **connect:** prevent multiple callbacks in error scenarios ([5f6a787](https://github.com/mongodb/node-mongodb-native/commit/5f6a787)) +* **monitoring:** incorrect states used to determine rescheduling ([ec1e04c](https://github.com/mongodb/node-mongodb-native/commit/ec1e04c)) +* **pool:** don't reset a pool if we'not already connected ([32316e4](https://github.com/mongodb/node-mongodb-native/commit/32316e4)) +* **pool:** only transition to `DISCONNECTED` if reconnect enabled ([43d461e](https://github.com/mongodb/node-mongodb-native/commit/43d461e)) +* **replset:** don't leak servers failing to connect ([f209160](https://github.com/mongodb/node-mongodb-native/commit/f209160)) +* **replset:** use correct `topologyId` for event emission ([19549ff](https://github.com/mongodb/node-mongodb-native/commit/19549ff)) +* **sdam:** `minHeartbeatIntervalMS` => `minHeartbeatFrequencyMS` ([af9fb45](https://github.com/mongodb/node-mongodb-native/commit/af9fb45)) +* **sdam:** don't emit `close` every time a child server closes ([818055a](https://github.com/mongodb/node-mongodb-native/commit/818055a)) +* **sdam:** don't lose servers when they fail monitoring ([8a534bb](https://github.com/mongodb/node-mongodb-native/commit/8a534bb)) +* **sdam:** don't remove unknown servers in topology updates ([1147ebf](https://github.com/mongodb/node-mongodb-native/commit/1147ebf)) +* **sdam:** ignore server errors when closing/closed ([49d7235](https://github.com/mongodb/node-mongodb-native/commit/49d7235)) +* **server:** don't emit error in connect if closing/closed ([62ada2a](https://github.com/mongodb/node-mongodb-native/commit/62ada2a)) +* **server:** ensure state is transitioned to closed on connect fail ([a471707](https://github.com/mongodb/node-mongodb-native/commit/a471707)) +* **topology:** report unified topology as `nodejs` ([d126665](https://github.com/mongodb/node-mongodb-native/commit/d126665)) +* **topology:** set max listeners to infinity for db event relay ([edb1335](https://github.com/mongodb/node-mongodb-native/commit/edb1335)) + + +### Features + +* **sdam_viz:** add new tool for visualizing driver sdam changes ([738189a](https://github.com/mongodb/node-mongodb-native/commit/738189a)) +* **sdam_viz:** support legacy topologies in sdam_viz tool ([1a5537e](https://github.com/mongodb/node-mongodb-native/commit/1a5537e)) +* **update-hints:** add support for `hint` to all update methods ([720f5e5](https://github.com/mongodb/node-mongodb-native/commit/720f5e5)) + + + + +## [3.3.3](https://github.com/mongodb/node-mongodb-native/compare/v3.3.2...v3.3.3) (2019-10-16) + + +### Bug Fixes + +* **change_stream:** emit 'close' event if reconnecting failed ([f24c084](https://github.com/mongodb/node-mongodb-native/commit/f24c084)) +* **ChangeStream:** remove startAtOperationTime once we have resumeToken ([362afd8](https://github.com/mongodb/node-mongodb-native/commit/362afd8)) +* **connect:** Switch new Buffer(size) -> Buffer.alloc(size) ([da90c3a](https://github.com/mongodb/node-mongodb-native/commit/da90c3a)) +* **MongoClient:** only check own properties for valid options ([9cde4b9](https://github.com/mongodb/node-mongodb-native/commit/9cde4b9)) +* **mongos:** disconnect proxies which are not mongos instances ([ee53983](https://github.com/mongodb/node-mongodb-native/commit/ee53983)) +* **mongos:** force close servers during reconnect flow ([186263f](https://github.com/mongodb/node-mongodb-native/commit/186263f)) +* **monitoring:** correct spelling mistake for heartbeat event ([21aa117](https://github.com/mongodb/node-mongodb-native/commit/21aa117)) +* **replset:** correct server leak on initial connect ([da39d1e](https://github.com/mongodb/node-mongodb-native/commit/da39d1e)) +* **replset:** destroy primary before removing from replsetstate ([45ac09a](https://github.com/mongodb/node-mongodb-native/commit/45ac09a)) +* **replset:** destroy servers that are removed during SDAM flow ([9ea0190](https://github.com/mongodb/node-mongodb-native/commit/9ea0190)) +* **saslprep:** add in missing saslprep dependency ([41f1165](https://github.com/mongodb/node-mongodb-native/commit/41f1165)) +* **topology:** don't early abort server selection on network errors ([2b6a359](https://github.com/mongodb/node-mongodb-native/commit/2b6a359)) +* **topology:** don't emit server closed event on network error ([194dcf0](https://github.com/mongodb/node-mongodb-native/commit/194dcf0)) +* **topology:** include all BSON types in ctor for bson-ext support ([aa4c832](https://github.com/mongodb/node-mongodb-native/commit/aa4c832)) +* **topology:** respect the `force` parameter for topology close ([d6e8936](https://github.com/mongodb/node-mongodb-native/commit/d6e8936)) + +### Features + +* **Update:** add the ability to specify a pipeline to an update command ([#2017](https://github.com/mongodb/node-mongodb-native/issues/2017)) ([44a4110](https://github.com/mongodb/node-mongodb-native/commit/44a4110)) +* **urlParser:** default useNewUrlParser to true ([52d76e3](https://github.com/mongodb/node-mongodb-native/commit/52d76e3)) + + +## [3.2.7](https://github.com/mongodb/node-mongodb-native/compare/v3.2.6...v3.2.7) (2019-06-04) + + +### Bug Fixes + +* **core:** updating core to version 3.2.7 ([2f91466](https://github.com/mongodb/node-mongodb-native/commit/2f91466)) +* **findOneAndReplace:** throw error if atomic operators provided for findOneAndReplace ([6a860a3](https://github.com/mongodb/node-mongodb-native/commit/6a860a3)) + + + + +## [3.3.2](https://github.com/mongodb/node-mongodb-native/compare/v3.3.1...v3.3.2) (2019-08-28) + + +### Bug Fixes + +* **change-stream:** default to server default batch size ([b3ae4c5](https://github.com/mongodb/node-mongodb-native/commit/b3ae4c5)) +* **execute-operation:** return promise on session support check ([a976c14](https://github.com/mongodb/node-mongodb-native/commit/a976c14)) +* **gridfs-stream:** ensure `close` is emitted after last chunk ([ae94cb9](https://github.com/mongodb/node-mongodb-native/commit/ae94cb9)) + + + + +## [3.3.1](https://github.com/mongodb/node-mongodb-native/compare/v3.3.0...v3.3.1) (2019-08-23) + + +### Bug Fixes + +* **find:** respect client-level provided read preference ([fec4f15](https://github.com/mongodb/node-mongodb-native/commit/fec4f15)) +* correct inverted defaults for unified topology ([cf598e1](https://github.com/mongodb/node-mongodb-native/commit/cf598e1)) + + + + +# [3.3.0](https://github.com/mongodb/node-mongodb-native/compare/v3.3.0-alpha1...v3.3.0) (2019-08-13) + + +### Bug Fixes + +* **aggregate-operation:** move type assertions to constructor ([25b27ff](https://github.com/mongodb/node-mongodb-native/commit/25b27ff)) +* **autoEncryption:** tear down mongocryptd client when main client closes ([fe2f57e](https://github.com/mongodb/node-mongodb-native/commit/fe2f57e)) +* **autoEncryption:** use new url parser for autoEncryption client ([d3670c2](https://github.com/mongodb/node-mongodb-native/commit/d3670c2)) +* **Bulk:** change BulkWriteError message to first item from writeErrors ([#2013](https://github.com/mongodb/node-mongodb-native/issues/2013)) ([6bcf1e4](https://github.com/mongodb/node-mongodb-native/commit/6bcf1e4)) +* **change_stream:** emit 'close' event if reconnecting failed ([41aba90](https://github.com/mongodb/node-mongodb-native/commit/41aba90)) +* **change_stream:** emit close event after cursor is closed during error ([c2d80b2](https://github.com/mongodb/node-mongodb-native/commit/c2d80b2)) +* **change-streams:** don't copy irrelevant resume options ([f190072](https://github.com/mongodb/node-mongodb-native/commit/f190072)) +* **changestream:** removes all event listeners on close ([30eeeb5](https://github.com/mongodb/node-mongodb-native/commit/30eeeb5)) +* **ChangeStream:** remove startAtOperationTime once we have resumeToken ([8d27e6e](https://github.com/mongodb/node-mongodb-native/commit/8d27e6e)) +* **ClientSessions:** initialize clientOptions and cluster time ([b95d64e](https://github.com/mongodb/node-mongodb-native/commit/b95d64e)) +* **connect:** don't treat 'connect' as an error event ([170a011](https://github.com/mongodb/node-mongodb-native/commit/170a011)) +* **connect:** fixed syntax issue in connect error handler ([ff7166d](https://github.com/mongodb/node-mongodb-native/commit/ff7166d)) +* **connections_stepdown_tests:** use correct version of mongo for tests ([ce2c9af](https://github.com/mongodb/node-mongodb-native/commit/ce2c9af)) +* **createCollection:** Db.createCollection should pass readConcern to new collection ([#2026](https://github.com/mongodb/node-mongodb-native/issues/2026)) ([6145d4b](https://github.com/mongodb/node-mongodb-native/commit/6145d4b)) +* **cursor:** do not truncate an existing Long ([317055b](https://github.com/mongodb/node-mongodb-native/commit/317055b)), closes [mongodb-js/mongodb-core#441](https://github.com/mongodb-js/mongodb-core/issues/441) +* **distinct:** return full response if `full` option was specified ([95a7d05](https://github.com/mongodb/node-mongodb-native/commit/95a7d05)) +* **MongoClient:** allow Object.prototype items as db names ([dc6fc37](https://github.com/mongodb/node-mongodb-native/commit/dc6fc37)) +* **MongoClient:** only check own properties for valid options ([c9dc717](https://github.com/mongodb/node-mongodb-native/commit/c9dc717)) +* **OpMsg:** cap requestIds at 0x7fffffff ([c0e87d5](https://github.com/mongodb/node-mongodb-native/commit/c0e87d5)) +* **read-operations:** send sessions on all read operations ([4d45c8a](https://github.com/mongodb/node-mongodb-native/commit/4d45c8a)) +* **ReadPreference:** improve ReadPreference error message and remove irrelevant sharding test ([dd34ce4](https://github.com/mongodb/node-mongodb-native/commit/dd34ce4)) +* **ReadPreference:** only allow valid ReadPreference modes ([06bbef2](https://github.com/mongodb/node-mongodb-native/commit/06bbef2)) +* **replset:** correct legacy max staleness calculation ([2eab8aa](https://github.com/mongodb/node-mongodb-native/commit/2eab8aa)) +* **replset:** introduce a fixed-time server selection loop ([cf53299](https://github.com/mongodb/node-mongodb-native/commit/cf53299)) +* **server:** emit "first connect" error if initial connect fails due to ECONNREFUSED ([#2016](https://github.com/mongodb/node-mongodb-native/issues/2016)) ([5a7b15b](https://github.com/mongodb/node-mongodb-native/commit/5a7b15b)) +* **serverSelection:** make sure to pass session to serverSelection ([eb5cc6b](https://github.com/mongodb/node-mongodb-native/commit/eb5cc6b)) +* **sessions:** ensure an error is thrown when attempting sharded transactions ([3a1fdc1](https://github.com/mongodb/node-mongodb-native/commit/3a1fdc1)) +* **topology:** add new error for retryWrites on MMAPv1 ([392f5a6](https://github.com/mongodb/node-mongodb-native/commit/392f5a6)) +* don't check non-unified topologies for session support check ([2bccd3f](https://github.com/mongodb/node-mongodb-native/commit/2bccd3f)) +* maintain internal database name on collection rename ([884d46f](https://github.com/mongodb/node-mongodb-native/commit/884d46f)) +* only check for transaction state if session exists ([360975a](https://github.com/mongodb/node-mongodb-native/commit/360975a)) +* preserve aggregate explain support for legacy servers ([032b204](https://github.com/mongodb/node-mongodb-native/commit/032b204)) +* read concern only supported for `mapReduce` without inline ([51a36f3](https://github.com/mongodb/node-mongodb-native/commit/51a36f3)) +* reintroduce support for 2.6 listIndexes ([c3bfc05](https://github.com/mongodb/node-mongodb-native/commit/c3bfc05)) +* return `executeOperation` for explain, if promise is desired ([b4a7ad7](https://github.com/mongodb/node-mongodb-native/commit/b4a7ad7)) +* validate atomic operations in all update methods ([88bb77e](https://github.com/mongodb/node-mongodb-native/commit/88bb77e)) +* **transactions:** fix error message for attempting sharded ([eb5dfc9](https://github.com/mongodb/node-mongodb-native/commit/eb5dfc9)) +* **transactions:** fix sharded transaction error logic ([083e18a](https://github.com/mongodb/node-mongodb-native/commit/083e18a)) + + +### Features + +* **Aggregate:** support ReadConcern in aggregates with $out ([21cdcf0](https://github.com/mongodb/node-mongodb-native/commit/21cdcf0)) +* **AutoEncryption:** improve error message for missing mongodb-client-encryption ([583f29f](https://github.com/mongodb/node-mongodb-native/commit/583f29f)) +* **ChangeStream:** adds new resume functionality to ChangeStreams ([9ec9b8f](https://github.com/mongodb/node-mongodb-native/commit/9ec9b8f)) +* **ChangeStreamCursor:** introduce new cursor type for change streams ([8813eb0](https://github.com/mongodb/node-mongodb-native/commit/8813eb0)) +* **cryptdConnectionString:** makes mongocryptd uri configurable ([#2049](https://github.com/mongodb/node-mongodb-native/issues/2049)) ([a487be4](https://github.com/mongodb/node-mongodb-native/commit/a487be4)) +* **eachAsync:** dedupe async iteration with a common helper ([c296f3a](https://github.com/mongodb/node-mongodb-native/commit/c296f3a)) +* **execute-operation:** allow execution with server selection ([36bc1fd](https://github.com/mongodb/node-mongodb-native/commit/36bc1fd)) +* **pool:** add support for resetting the connection pool ([2d1ff40](https://github.com/mongodb/node-mongodb-native/commit/2d1ff40)) +* **sessions:** track dirty state of sessions, drop after use ([f61df16](https://github.com/mongodb/node-mongodb-native/commit/f61df16)) +* add concept of `data-bearing` type to `ServerDescription` ([852e14f](https://github.com/mongodb/node-mongodb-native/commit/852e14f)) +* **transaction:** allow applications to set maxTimeMS for commitTransaction ([b3948aa](https://github.com/mongodb/node-mongodb-native/commit/b3948aa)) +* **Update:** add the ability to specify a pipeline to an update command ([#2017](https://github.com/mongodb/node-mongodb-native/issues/2017)) ([dc1387e](https://github.com/mongodb/node-mongodb-native/commit/dc1387e)) +* add `known`, `data-bearing` filters to `TopologyDescription` ([d0ccb56](https://github.com/mongodb/node-mongodb-native/commit/d0ccb56)) +* perform selection before cursor operation execution if needed ([808cf37](https://github.com/mongodb/node-mongodb-native/commit/808cf37)) +* perform selection before operation execution if needed ([1a25876](https://github.com/mongodb/node-mongodb-native/commit/1a25876)) +* support explain operations in `CommandOperationV2` ([86f5ba5](https://github.com/mongodb/node-mongodb-native/commit/86f5ba5)) +* support operations passed to a `Cursor` or subclass ([b78bb89](https://github.com/mongodb/node-mongodb-native/commit/b78bb89)) + + + + +## [3.2.7](https://github.com/mongodb/node-mongodb-native/compare/v3.2.6...v3.2.7) (2019-06-04) + + +### Bug Fixes + +* **core:** updating core to version 3.2.7 ([2f91466](https://github.com/mongodb/node-mongodb-native/commit/2f91466)) +* **findOneAndReplace:** throw error if atomic operators provided for findOneAndReplace ([6a860a3](https://github.com/mongodb/node-mongodb-native/commit/6a860a3)) + + + + +## [3.2.6](https://github.com/mongodb/node-mongodb-native/compare/v3.2.5...v3.2.6) (2019-05-24) + + + + +## [3.2.5](https://github.com/mongodb/node-mongodb-native/compare/v3.2.4...v3.2.5) (2019-05-17) + + +### Bug Fixes + +* **core:** updating core to 3.2.5 ([a2766c1](https://github.com/mongodb/node-mongodb-native/commit/a2766c1)) + + + + +## [3.2.4](https://github.com/mongodb/node-mongodb-native/compare/v3.2.2...v3.2.4) (2019-05-08) + + +### Bug Fixes + +* **aggregation:** fix field name typo ([4235d04](https://github.com/mongodb/node-mongodb-native/commit/4235d04)) +* **async:** rewrote asyncGenerator in node < 10 syntax ([49c8cef](https://github.com/mongodb/node-mongodb-native/commit/49c8cef)) +* **BulkOp:** run unordered bulk ops in serial ([f548bd7](https://github.com/mongodb/node-mongodb-native/commit/f548bd7)) +* **bulkWrite:** fix issue with bulkWrite continuing w/ callback ([2a4a42c](https://github.com/mongodb/node-mongodb-native/commit/2a4a42c)) +* **docs:** correctly document that default for `sslValidate` is false ([1f8e7fa](https://github.com/mongodb/node-mongodb-native/commit/1f8e7fa)) +* **gridfs-stream:** honor chunk size ([9eeb114](https://github.com/mongodb/node-mongodb-native/commit/9eeb114)) +* **unified-topology:** only clone pool size if provided ([8dc2416](https://github.com/mongodb/node-mongodb-native/commit/8dc2416)) + + +### Features + +* update to mongodb-core v3.2.3 ([1c5357a](https://github.com/mongodb/node-mongodb-native/commit/1c5357a)) +* **core:** update to mongodb-core v3.2.4 ([2059260](https://github.com/mongodb/node-mongodb-native/commit/2059260)) +* **lib:** implement executeOperationV2 ([67d4edf](https://github.com/mongodb/node-mongodb-native/commit/67d4edf)) + + + + +## [3.2.3](https://github.com/mongodb/node-mongodb-native/compare/v3.2.2...v3.2.3) (2019-04-05) + + +### Bug Fixes + +* **aggregation:** fix field name typo ([4235d04](https://github.com/mongodb/node-mongodb-native/commit/4235d04)) +* **async:** rewrote asyncGenerator in node < 10 syntax ([49c8cef](https://github.com/mongodb/node-mongodb-native/commit/49c8cef)) +* **bulkWrite:** fix issue with bulkWrite continuing w/ callback ([2a4a42c](https://github.com/mongodb/node-mongodb-native/commit/2a4a42c)) +* **docs:** correctly document that default for `sslValidate` is false ([1f8e7fa](https://github.com/mongodb/node-mongodb-native/commit/1f8e7fa)) + + +### Features + +* update to mongodb-core v3.2.3 ([1c5357a](https://github.com/mongodb/node-mongodb-native/commit/1c5357a)) + + + + +## [3.2.2](https://github.com/mongodb/node-mongodb-native/compare/v3.2.1...v3.2.2) (2019-03-22) + + +### Bug Fixes + +* **asyncIterator:** stronger guard against importing async generator ([e0826fb](https://github.com/mongodb/node-mongodb-native/commit/e0826fb)) + + +### Features + +* update to mongodb-core v3.2.2 ([868cfc3](https://github.com/mongodb/node-mongodb-native/commit/868cfc3)) + + + + +## [3.2.1](https://github.com/mongodb/node-mongodb-native/compare/v3.2.0...v3.2.1) (2019-03-21) + + +### Features + +* **core:** update to mongodb-core v3.2.1 ([30b0100](https://github.com/mongodb/node-mongodb-native/commit/30b0100)) + + + + +# [3.2.0](https://github.com/mongodb/node-mongodb-native/compare/v3.1.13...v3.2.0) (2019-03-21) + + +### Bug Fixes + +* **aggregate:** do not send batchSize for aggregation with $out ([ddb8d90](https://github.com/mongodb/node-mongodb-native/commit/ddb8d90)) +* **bulkWrite:** always count undefined values in bson size for bulk ([436d340](https://github.com/mongodb/node-mongodb-native/commit/436d340)) +* **db_ops:** rename db to add user on ([79931af](https://github.com/mongodb/node-mongodb-native/commit/79931af)) +* **mongo_client_ops:** only skip authentication if no authMechanism is specified ([3b6957d](https://github.com/mongodb/node-mongodb-native/commit/3b6957d)) +* **mongo-client:** ensure close callback is called with client ([f39e881](https://github.com/mongodb/node-mongodb-native/commit/f39e881)) + + +### Features + +* **core:** pin to mongodb-core v3.2.0 ([22af15a](https://github.com/mongodb/node-mongodb-native/commit/22af15a)) +* **Cursor:** adds support for AsyncIterator in cursors ([b972c1e](https://github.com/mongodb/node-mongodb-native/commit/b972c1e)) +* **db:** add database-level aggregation ([b629b21](https://github.com/mongodb/node-mongodb-native/commit/b629b21)) +* **mongo-client:** remove deprecated `logout` and print warning ([542859d](https://github.com/mongodb/node-mongodb-native/commit/542859d)) +* **topology-base:** support passing callbacks to `close` method ([7c111e0](https://github.com/mongodb/node-mongodb-native/commit/7c111e0)) +* **transactions:** support pinning mongos for sharded txns ([3886127](https://github.com/mongodb/node-mongodb-native/commit/3886127)) +* **unified-sdam:** backport unified SDAM to master for v3.2.0 ([79f33ca](https://github.com/mongodb/node-mongodb-native/commit/79f33ca)) + + + + +## [3.1.13](https://github.com/mongodb/node-mongodb-native/compare/v3.1.12...v3.1.13) (2019-01-23) + + +### Bug Fixes + +* restore ability to webpack by removing `makeLazyLoader` ([050267d](https://github.com/mongodb/node-mongodb-native/commit/050267d)) +* **bulk:** honor ignoreUndefined in initializeUnorderedBulkOp ([e806be4](https://github.com/mongodb/node-mongodb-native/commit/e806be4)) +* **changeStream:** properly handle changeStream event mid-close ([#1902](https://github.com/mongodb/node-mongodb-native/issues/1902)) ([5ad9fa9](https://github.com/mongodb/node-mongodb-native/commit/5ad9fa9)) +* **db_ops:** ensure we async resolve errors in createCollection ([210c71d](https://github.com/mongodb/node-mongodb-native/commit/210c71d)) + + + + +## [3.1.12](https://github.com/mongodb/node-mongodb-native/compare/v3.1.11...v3.1.12) (2019-01-16) + + +### Features + +* **core:** update to mongodb-core v3.1.11 ([9bef6e7](https://github.com/mongodb/node-mongodb-native/commit/9bef6e7)) + + + + +## [3.1.11](https://github.com/mongodb/node-mongodb-native/compare/v3.1.10...v3.1.11) (2019-01-15) + + +### Bug Fixes + +* **bulk:** fix error propagation in empty bulk.execute ([a3adb3f](https://github.com/mongodb/node-mongodb-native/commit/a3adb3f)) +* **bulk:** make sure that any error in bulk write is propagated ([bedc2d2](https://github.com/mongodb/node-mongodb-native/commit/bedc2d2)) +* **bulk:** properly calculate batch size for bulk writes ([aafe71b](https://github.com/mongodb/node-mongodb-native/commit/aafe71b)) +* **operations:** do not call require in a hot path ([ff82ff4](https://github.com/mongodb/node-mongodb-native/commit/ff82ff4)) + + + + +## [3.1.10](https://github.com/mongodb/node-mongodb-native/compare/v3.1.9...v3.1.10) (2018-11-16) + + +### Bug Fixes + +* **auth:** remember to default to admin database ([c7dec28](https://github.com/mongodb/node-mongodb-native/commit/c7dec28)) + + +### Features + +* **core:** update to mongodb-core v3.1.9 ([bd3355b](https://github.com/mongodb/node-mongodb-native/commit/bd3355b)) + + + + +## [3.1.9](https://github.com/mongodb/node-mongodb-native/compare/v3.1.8...v3.1.9) (2018-11-06) + + +### Bug Fixes + +* **db:** move db constants to other file to avoid circular ref ([#1858](https://github.com/mongodb/node-mongodb-native/issues/1858)) ([239036f](https://github.com/mongodb/node-mongodb-native/commit/239036f)) +* **estimated-document-count:** support options other than maxTimeMs ([36c3c7d](https://github.com/mongodb/node-mongodb-native/commit/36c3c7d)) + + +### Features + +* **core:** update to mongodb-core v3.1.8 ([80d7c79](https://github.com/mongodb/node-mongodb-native/commit/80d7c79)) + + + + +## [3.1.8](https://github.com/mongodb/node-mongodb-native/compare/v3.1.7...v3.1.8) (2018-10-10) + + +### Bug Fixes + +* **connect:** use reported default databse from new uri parser ([811f8f8](https://github.com/mongodb/node-mongodb-native/commit/811f8f8)) + + +### Features + +* **core:** update to mongodb-core v3.1.7 ([dbfc905](https://github.com/mongodb/node-mongodb-native/commit/dbfc905)) + + + + +## [3.1.7](https://github.com/mongodb/node-mongodb-native/compare/v3.1.6...v3.1.7) (2018-10-09) + + +### Features + +* **core:** update mongodb-core to v3.1.6 ([61b054e](https://github.com/mongodb/node-mongodb-native/commit/61b054e)) + + + + +## [3.1.6](https://github.com/mongodb/node-mongodb-native/compare/v3.1.5...v3.1.6) (2018-09-15) + + +### Features + +* **core:** update to core v3.1.5 ([c5f823d](https://github.com/mongodb/node-mongodb-native/commit/c5f823d)) + + + + +## [3.1.5](https://github.com/mongodb/node-mongodb-native/compare/v3.1.4...v3.1.5) (2018-09-14) + + +### Bug Fixes + +* **cursor:** allow `$meta` based sort when passing an array to `sort()` ([f93a8c3](https://github.com/mongodb/node-mongodb-native/commit/f93a8c3)) +* **utils:** only set retryWrites to true for valid operations ([3b725ef](https://github.com/mongodb/node-mongodb-native/commit/3b725ef)) + + +### Features + +* **core:** bump core to v3.1.4 ([805d58a](https://github.com/mongodb/node-mongodb-native/commit/805d58a)) + + + + +## [3.1.4](https://github.com/mongodb/node-mongodb-native/compare/v3.1.3...v3.1.4) (2018-08-25) + + +### Bug Fixes + +* **buffer:** use safe-buffer polyfill to maintain compatibility ([327da95](https://github.com/mongodb/node-mongodb-native/commit/327da95)) +* **change-stream:** properly support resumablity in stream mode ([c43a34b](https://github.com/mongodb/node-mongodb-native/commit/c43a34b)) +* **connect:** correct replacement of topology on connect callback ([918a1e0](https://github.com/mongodb/node-mongodb-native/commit/918a1e0)) +* **cursor:** remove deprecated notice on forEach ([a474158](https://github.com/mongodb/node-mongodb-native/commit/a474158)) +* **url-parser:** bail early on validation when using domain socket ([3cb3da3](https://github.com/mongodb/node-mongodb-native/commit/3cb3da3)) + + +### Features + +* **client-ops:** allow bypassing creation of topologies on connect ([fe39b93](https://github.com/mongodb/node-mongodb-native/commit/fe39b93)) +* **core:** update mongodb-core to 3.1.3 ([a029047](https://github.com/mongodb/node-mongodb-native/commit/a029047)) +* **test:** use connection strings for all calls to `newClient` ([1dac18f](https://github.com/mongodb/node-mongodb-native/commit/1dac18f)) + + + + +## [3.1.3](https://github.com/mongodb/node-mongodb-native/compare/v3.1.2...v3.1.3) (2018-08-13) + + +### Features + +* **core:** update to mongodb-core 3.1.2 ([337cb79](https://github.com/mongodb/node-mongodb-native/commit/337cb79)) + + + + +## [3.1.2](https://github.com/mongodb/node-mongodb-native/compare/v3.0.6...v3.1.2) (2018-08-13) + + +### Bug Fixes + +* **aggregate:** support user-provided `batchSize` ([ad10dee](https://github.com/mongodb/node-mongodb-native/commit/ad10dee)) +* **buffer:** replace deprecated Buffer constructor ([759dd85](https://github.com/mongodb/node-mongodb-native/commit/759dd85)) +* **bulk:** fixing retryable writes for mass-change ops ([0604036](https://github.com/mongodb/node-mongodb-native/commit/0604036)) +* **bulk:** handle MongoWriteConcernErrors ([12ff392](https://github.com/mongodb/node-mongodb-native/commit/12ff392)) +* **change_stream:** do not check isGetMore if error[mongoErrorContextSymbol] is undefined ([#1720](https://github.com/mongodb/node-mongodb-native/issues/1720)) ([844c2c8](https://github.com/mongodb/node-mongodb-native/commit/844c2c8)) +* **change-stream:** fix change stream resuming with promises ([3063f00](https://github.com/mongodb/node-mongodb-native/commit/3063f00)) +* **client-ops:** return transform map to map rather than function ([cfb7d83](https://github.com/mongodb/node-mongodb-native/commit/cfb7d83)) +* **collection:** correctly shallow clone passed in options ([7727700](https://github.com/mongodb/node-mongodb-native/commit/7727700)) +* **collection:** countDocuments throws error when query doesn't match docs ([09c7d8e](https://github.com/mongodb/node-mongodb-native/commit/09c7d8e)) +* **collection:** depend on `resolveReadPreference` for inheritance ([a649e35](https://github.com/mongodb/node-mongodb-native/commit/a649e35)) +* **collection:** ensure findAndModify always use readPreference primary ([86344f4](https://github.com/mongodb/node-mongodb-native/commit/86344f4)) +* **collection:** isCapped returns false instead of undefined ([b8471f1](https://github.com/mongodb/node-mongodb-native/commit/b8471f1)) +* **collection:** only send bypassDocumentValidation if true ([fdb828b](https://github.com/mongodb/node-mongodb-native/commit/fdb828b)) +* **count-documents:** return callback on error case ([fca1185](https://github.com/mongodb/node-mongodb-native/commit/fca1185)) +* **cursor:** cursor count with collation fix ([71879c3](https://github.com/mongodb/node-mongodb-native/commit/71879c3)) +* **cursor:** cursor hasNext returns false when exhausted ([184b817](https://github.com/mongodb/node-mongodb-native/commit/184b817)) +* **cursor:** cursor.count not respecting parent readPreference ([5a9fdf0](https://github.com/mongodb/node-mongodb-native/commit/5a9fdf0)) +* **cursor:** set readPreference for cursor.count ([13d776f](https://github.com/mongodb/node-mongodb-native/commit/13d776f)) +* **db:** don't send session down to createIndex command ([559c195](https://github.com/mongodb/node-mongodb-native/commit/559c195)) +* **db:** throw readable error when creating `_id` with background: true ([b3ff3ed](https://github.com/mongodb/node-mongodb-native/commit/b3ff3ed)) +* **db_ops:** call collection.find() with correct parameters ([#1795](https://github.com/mongodb/node-mongodb-native/issues/1795)) ([36e92f1](https://github.com/mongodb/node-mongodb-native/commit/36e92f1)) +* **db_ops:** fix two incorrectly named variables ([15dc808](https://github.com/mongodb/node-mongodb-native/commit/15dc808)) +* **findOneAndUpdate:** ensure that update documents contain atomic operators ([eb68074](https://github.com/mongodb/node-mongodb-native/commit/eb68074)) +* **index:** export MongoNetworkError ([98ab29e](https://github.com/mongodb/node-mongodb-native/commit/98ab29e)) +* **mongo_client:** translate options for connectWithUrl ([78f6977](https://github.com/mongodb/node-mongodb-native/commit/78f6977)) +* **mongo-client:** pass arguments to ctor when new keyword is used ([d6c3417](https://github.com/mongodb/node-mongodb-native/commit/d6c3417)) +* **mongos:** bubble up close events after the first one ([#1713](https://github.com/mongodb/node-mongodb-native/issues/1713)) ([3e91d77](https://github.com/mongodb/node-mongodb-native/commit/3e91d77)), closes [Automattic/mongoose#6249](https://github.com/Automattic/mongoose/issues/6249) [#1685](https://github.com/mongodb/node-mongodb-native/issues/1685) +* **parallelCollectionScan:** do not use implicit sessions on cursors ([2de470a](https://github.com/mongodb/node-mongodb-native/commit/2de470a)) +* **retryWrites:** fixes more bulk ops to not use retryWrites ([69e5254](https://github.com/mongodb/node-mongodb-native/commit/69e5254)) +* **server:** remove unnecessary print statement ([2bcbc12](https://github.com/mongodb/node-mongodb-native/commit/2bcbc12)) +* **teardown:** properly destroy a topology when initial connect fails ([b8d2f1d](https://github.com/mongodb/node-mongodb-native/commit/b8d2f1d)) +* **topology-base:** sending `endSessions` is always skipped now ([a276cbe](https://github.com/mongodb/node-mongodb-native/commit/a276cbe)) +* **txns:** omit writeConcern when in a transaction ([b88c938](https://github.com/mongodb/node-mongodb-native/commit/b88c938)) +* **utils:** restructure inheritance rules for read preferences ([6a7dac1](https://github.com/mongodb/node-mongodb-native/commit/6a7dac1)) + + +### Features + +* **auth:** add support for SCRAM-SHA-256 ([f53195d](https://github.com/mongodb/node-mongodb-native/commit/f53195d)) +* **changeStream:** Adding new 4.0 ChangeStream features ([2cb4894](https://github.com/mongodb/node-mongodb-native/commit/2cb4894)) +* **changeStream:** allow resuming on getMore errors ([4ba5adc](https://github.com/mongodb/node-mongodb-native/commit/4ba5adc)) +* **changeStream:** expanding changeStream resumable errors ([49fbafd](https://github.com/mongodb/node-mongodb-native/commit/49fbafd)) +* **ChangeStream:** update default startAtOperationTime ([50a9f65](https://github.com/mongodb/node-mongodb-native/commit/50a9f65)) +* **collection:** add colleciton level document mapping/unmapping ([d03335e](https://github.com/mongodb/node-mongodb-native/commit/d03335e)) +* **collection:** Implement new count API ([a5240ae](https://github.com/mongodb/node-mongodb-native/commit/a5240ae)) +* **Collection:** warn if callback is not function in find and findOne ([cddaba0](https://github.com/mongodb/node-mongodb-native/commit/cddaba0)) +* **core:** bump core dependency to v3.1.0 ([4937240](https://github.com/mongodb/node-mongodb-native/commit/4937240)) +* **cursor:** new cursor.transformStream method ([397fcd2](https://github.com/mongodb/node-mongodb-native/commit/397fcd2)) +* **deprecation:** create deprecation function ([4f907a0](https://github.com/mongodb/node-mongodb-native/commit/4f907a0)) +* **deprecation:** wrap deprecated functions ([a5d0f1d](https://github.com/mongodb/node-mongodb-native/commit/a5d0f1d)) +* **GridFS:** add option to disable md5 in file upload ([704a88e](https://github.com/mongodb/node-mongodb-native/commit/704a88e)) +* **listCollections:** add support for nameOnly option ([d2d0367](https://github.com/mongodb/node-mongodb-native/commit/d2d0367)) +* **parallelCollectionScan:** does not allow user to pass a session ([4da9e03](https://github.com/mongodb/node-mongodb-native/commit/4da9e03)) +* **read-preference:** add transaction to inheritance rules ([18ca41d](https://github.com/mongodb/node-mongodb-native/commit/18ca41d)) +* **read-preference:** unify means of read preference resolution ([#1738](https://github.com/mongodb/node-mongodb-native/issues/1738)) ([2995e11](https://github.com/mongodb/node-mongodb-native/commit/2995e11)) +* **urlParser:** use core URL parser ([c1c5d8d](https://github.com/mongodb/node-mongodb-native/commit/c1c5d8d)) +* **withSession:** add top level helper for session lifetime ([9976b86](https://github.com/mongodb/node-mongodb-native/commit/9976b86)) + + +### Reverts + +* **collection:** reverting collection-mapping features ([7298c76](https://github.com/mongodb/node-mongodb-native/commit/7298c76)), closes [#1698](https://github.com/mongodb/node-mongodb-native/issues/1698) [mongodb/js-bson#253](https://github.com/mongodb/js-bson/issues/253) + + + + +## [3.1.1](https://github.com/mongodb/node-mongodb-native/compare/v3.1.0...v3.1.1) (2018-07-05) + + +### Bug Fixes + +* **client-ops:** return transform map to map rather than function ([b8b4bfa](https://github.com/mongodb/node-mongodb-native/commit/b8b4bfa)) +* **collection:** correctly shallow clone passed in options ([2e6c4fa](https://github.com/mongodb/node-mongodb-native/commit/2e6c4fa)) +* **collection:** countDocuments throws error when query doesn't match docs ([4e83556](https://github.com/mongodb/node-mongodb-native/commit/4e83556)) +* **server:** remove unnecessary print statement ([20e11b3](https://github.com/mongodb/node-mongodb-native/commit/20e11b3)) + + + + +# [3.1.0](https://github.com/mongodb/node-mongodb-native/compare/v3.0.6...v3.1.0) (2018-06-27) + + +### Bug Fixes + +* **aggregate:** support user-provided `batchSize` ([ad10dee](https://github.com/mongodb/node-mongodb-native/commit/ad10dee)) +* **bulk:** fixing retryable writes for mass-change ops ([0604036](https://github.com/mongodb/node-mongodb-native/commit/0604036)) +* **bulk:** handle MongoWriteConcernErrors ([12ff392](https://github.com/mongodb/node-mongodb-native/commit/12ff392)) +* **change_stream:** do not check isGetMore if error[mongoErrorContextSymbol] is undefined ([#1720](https://github.com/mongodb/node-mongodb-native/issues/1720)) ([844c2c8](https://github.com/mongodb/node-mongodb-native/commit/844c2c8)) +* **change-stream:** fix change stream resuming with promises ([3063f00](https://github.com/mongodb/node-mongodb-native/commit/3063f00)) +* **collection:** depend on `resolveReadPreference` for inheritance ([a649e35](https://github.com/mongodb/node-mongodb-native/commit/a649e35)) +* **collection:** only send bypassDocumentValidation if true ([fdb828b](https://github.com/mongodb/node-mongodb-native/commit/fdb828b)) +* **cursor:** cursor count with collation fix ([71879c3](https://github.com/mongodb/node-mongodb-native/commit/71879c3)) +* **cursor:** cursor hasNext returns false when exhausted ([184b817](https://github.com/mongodb/node-mongodb-native/commit/184b817)) +* **cursor:** cursor.count not respecting parent readPreference ([5a9fdf0](https://github.com/mongodb/node-mongodb-native/commit/5a9fdf0)) +* **db:** don't send session down to createIndex command ([559c195](https://github.com/mongodb/node-mongodb-native/commit/559c195)) +* **db:** throw readable error when creating `_id` with background: true ([b3ff3ed](https://github.com/mongodb/node-mongodb-native/commit/b3ff3ed)) +* **findOneAndUpdate:** ensure that update documents contain atomic operators ([eb68074](https://github.com/mongodb/node-mongodb-native/commit/eb68074)) +* **index:** export MongoNetworkError ([98ab29e](https://github.com/mongodb/node-mongodb-native/commit/98ab29e)) +* **mongo-client:** pass arguments to ctor when new keyword is used ([d6c3417](https://github.com/mongodb/node-mongodb-native/commit/d6c3417)) +* **mongos:** bubble up close events after the first one ([#1713](https://github.com/mongodb/node-mongodb-native/issues/1713)) ([3e91d77](https://github.com/mongodb/node-mongodb-native/commit/3e91d77)), closes [Automattic/mongoose#6249](https://github.com/Automattic/mongoose/issues/6249) [#1685](https://github.com/mongodb/node-mongodb-native/issues/1685) +* **parallelCollectionScan:** do not use implicit sessions on cursors ([2de470a](https://github.com/mongodb/node-mongodb-native/commit/2de470a)) +* **retryWrites:** fixes more bulk ops to not use retryWrites ([69e5254](https://github.com/mongodb/node-mongodb-native/commit/69e5254)) +* **topology-base:** sending `endSessions` is always skipped now ([a276cbe](https://github.com/mongodb/node-mongodb-native/commit/a276cbe)) +* **txns:** omit writeConcern when in a transaction ([b88c938](https://github.com/mongodb/node-mongodb-native/commit/b88c938)) +* **utils:** restructure inheritance rules for read preferences ([6a7dac1](https://github.com/mongodb/node-mongodb-native/commit/6a7dac1)) + + +### Features + +* **auth:** add support for SCRAM-SHA-256 ([f53195d](https://github.com/mongodb/node-mongodb-native/commit/f53195d)) +* **changeStream:** Adding new 4.0 ChangeStream features ([2cb4894](https://github.com/mongodb/node-mongodb-native/commit/2cb4894)) +* **changeStream:** allow resuming on getMore errors ([4ba5adc](https://github.com/mongodb/node-mongodb-native/commit/4ba5adc)) +* **changeStream:** expanding changeStream resumable errors ([49fbafd](https://github.com/mongodb/node-mongodb-native/commit/49fbafd)) +* **ChangeStream:** update default startAtOperationTime ([50a9f65](https://github.com/mongodb/node-mongodb-native/commit/50a9f65)) +* **collection:** add colleciton level document mapping/unmapping ([d03335e](https://github.com/mongodb/node-mongodb-native/commit/d03335e)) +* **collection:** Implement new count API ([a5240ae](https://github.com/mongodb/node-mongodb-native/commit/a5240ae)) +* **Collection:** warn if callback is not function in find and findOne ([cddaba0](https://github.com/mongodb/node-mongodb-native/commit/cddaba0)) +* **core:** bump core dependency to v3.1.0 ([855bfdb](https://github.com/mongodb/node-mongodb-native/commit/855bfdb)) +* **cursor:** new cursor.transformStream method ([397fcd2](https://github.com/mongodb/node-mongodb-native/commit/397fcd2)) +* **GridFS:** add option to disable md5 in file upload ([704a88e](https://github.com/mongodb/node-mongodb-native/commit/704a88e)) +* **listCollections:** add support for nameOnly option ([d2d0367](https://github.com/mongodb/node-mongodb-native/commit/d2d0367)) +* **parallelCollectionScan:** does not allow user to pass a session ([4da9e03](https://github.com/mongodb/node-mongodb-native/commit/4da9e03)) +* **read-preference:** add transaction to inheritance rules ([18ca41d](https://github.com/mongodb/node-mongodb-native/commit/18ca41d)) +* **read-preference:** unify means of read preference resolution ([#1738](https://github.com/mongodb/node-mongodb-native/issues/1738)) ([2995e11](https://github.com/mongodb/node-mongodb-native/commit/2995e11)) +* **urlParser:** use core URL parser ([c1c5d8d](https://github.com/mongodb/node-mongodb-native/commit/c1c5d8d)) +* **withSession:** add top level helper for session lifetime ([9976b86](https://github.com/mongodb/node-mongodb-native/commit/9976b86)) + + +### Reverts + +* **collection:** reverting collection-mapping features ([7298c76](https://github.com/mongodb/node-mongodb-native/commit/7298c76)), closes [#1698](https://github.com/mongodb/node-mongodb-native/issues/1698) [mongodb/js-bson#253](https://github.com/mongodb/js-bson/issues/253) + + + + +## [3.0.6](https://github.com/mongodb/node-mongodb-native/compare/v3.0.5...v3.0.6) (2018-04-09) + + +### Bug Fixes + +* **db:** ensure `dropDatabase` always uses primary read preference ([e62e5c9](https://github.com/mongodb/node-mongodb-native/commit/e62e5c9)) +* **driverBench:** driverBench has default options object now ([c557817](https://github.com/mongodb/node-mongodb-native/commit/c557817)) + + +### Features + +* **command-monitoring:** support enabling command monitoring ([5903680](https://github.com/mongodb/node-mongodb-native/commit/5903680)) +* **core:** update to mongodb-core v3.0.6 ([cfdd0ae](https://github.com/mongodb/node-mongodb-native/commit/cfdd0ae)) +* **driverBench:** Implementing DriverBench ([d10fbad](https://github.com/mongodb/node-mongodb-native/commit/d10fbad)) + + + + +## [3.0.5](https://github.com/mongodb/node-mongodb-native/compare/v3.0.4...v3.0.5) (2018-03-23) + + +### Bug Fixes + +* **AggregationCursor:** adding session tracking to AggregationCursor ([baca5b7](https://github.com/mongodb/node-mongodb-native/commit/baca5b7)) +* **Collection:** fix session leak in parallelCollectonScan ([3331ec9](https://github.com/mongodb/node-mongodb-native/commit/3331ec9)) +* **comments:** adding fixes for PR comments ([ee110ac](https://github.com/mongodb/node-mongodb-native/commit/ee110ac)) +* **url_parser:** support a default database on mongodb+srv uris ([6d39b2a](https://github.com/mongodb/node-mongodb-native/commit/6d39b2a)) + + +### Features + +* **sessions:** adding implicit cursor session support ([a81245b](https://github.com/mongodb/node-mongodb-native/commit/a81245b)) + + + + +## [3.0.4](https://github.com/mongodb/node-mongodb-native/compare/v3.0.2...v3.0.4) (2018-03-05) + + +### Bug Fixes + +* **collection:** fix error when calling remove with no args ([#1657](https://github.com/mongodb/node-mongodb-native/issues/1657)) ([4c9b0f8](https://github.com/mongodb/node-mongodb-native/commit/4c9b0f8)) +* **executeOperation:** don't mutate options passed to commands ([934a43a](https://github.com/mongodb/node-mongodb-native/commit/934a43a)) +* **jsdoc:** mark db.collection callback as optional + typo fix ([#1658](https://github.com/mongodb/node-mongodb-native/issues/1658)) ([c519b9b](https://github.com/mongodb/node-mongodb-native/commit/c519b9b)) +* **sessions:** move active session tracking to topology base ([#1665](https://github.com/mongodb/node-mongodb-native/issues/1665)) ([b1f296f](https://github.com/mongodb/node-mongodb-native/commit/b1f296f)) +* **utils:** fixes executeOperation to clean up sessions ([04e6ef6](https://github.com/mongodb/node-mongodb-native/commit/04e6ef6)) + + +### Features + +* **default-db:** use dbName from uri if none provided ([23b1938](https://github.com/mongodb/node-mongodb-native/commit/23b1938)) +* **mongodb-core:** update to mongodb-core 3.0.4 ([1fdbaa5](https://github.com/mongodb/node-mongodb-native/commit/1fdbaa5)) + + + + +## [3.0.3](https://github.com/mongodb/node-mongodb-native/compare/v3.0.2...v3.0.3) (2018-02-23) + + +### Bug Fixes + +* **collection:** fix error when calling remove with no args ([#1657](https://github.com/mongodb/node-mongodb-native/issues/1657)) ([4c9b0f8](https://github.com/mongodb/node-mongodb-native/commit/4c9b0f8)) +* **executeOperation:** don't mutate options passed to commands ([934a43a](https://github.com/mongodb/node-mongodb-native/commit/934a43a)) +* **jsdoc:** mark db.collection callback as optional + typo fix ([#1658](https://github.com/mongodb/node-mongodb-native/issues/1658)) ([c519b9b](https://github.com/mongodb/node-mongodb-native/commit/c519b9b)) +* **sessions:** move active session tracking to topology base ([#1665](https://github.com/mongodb/node-mongodb-native/issues/1665)) ([b1f296f](https://github.com/mongodb/node-mongodb-native/commit/b1f296f)) + + + + +## [3.0.2](https://github.com/mongodb/node-mongodb-native/compare/v3.0.1...v3.0.2) (2018-01-29) + + +### Bug Fixes + +* **collection:** ensure dynamic require of `db` is wrapped in parentheses ([efa78f0](https://github.com/mongodb/node-mongodb-native/commit/efa78f0)) +* **db:** only callback with MongoError NODE-1293 ([#1652](https://github.com/mongodb/node-mongodb-native/issues/1652)) ([45bc722](https://github.com/mongodb/node-mongodb-native/commit/45bc722)) +* **topology base:** allow more than 10 event listeners ([#1630](https://github.com/mongodb/node-mongodb-native/issues/1630)) ([d9fb750](https://github.com/mongodb/node-mongodb-native/commit/d9fb750)) +* **url parser:** preserve auth creds when composing conn string ([#1640](https://github.com/mongodb/node-mongodb-native/issues/1640)) ([eddca5e](https://github.com/mongodb/node-mongodb-native/commit/eddca5e)) + + +### Features + +* **bulk:** forward 'checkKeys' option for ordered and unordered bulk operations ([421a6b2](https://github.com/mongodb/node-mongodb-native/commit/421a6b2)) +* **collection:** expose `dbName` property of collection ([6fd05c1](https://github.com/mongodb/node-mongodb-native/commit/6fd05c1)) + + + + +## [3.0.1](https://github.com/mongodb/node-mongodb-native/compare/v3.0.0...v3.0.1) (2017-12-24) + +* update mongodb-core to 3.0.1 + + +# [3.0.0](https://github.com/mongodb/node-mongodb-native/compare/v3.0.0-rc0...v3.0.0) (2017-12-24) + + +### Bug Fixes + +* **aggregate:** remove support for inline results for aggregate ([#1620](https://github.com/mongodb/node-mongodb-native/issues/1620)) ([84457ec](https://github.com/mongodb/node-mongodb-native/commit/84457ec)) +* **topologies:** unify topologies connect API ([#1615](https://github.com/mongodb/node-mongodb-native/issues/1615)) ([0fb4658](https://github.com/mongodb/node-mongodb-native/commit/0fb4658)) + + +### Features + +* **keepAlive:** make keepAlive options consistent ([#1612](https://github.com/mongodb/node-mongodb-native/issues/1612)) ([f608f44](https://github.com/mongodb/node-mongodb-native/commit/f608f44)) + + +### BREAKING CHANGES + +* **topologies:** Function signature for `.connect` method on replset and mongos has changed. You shouldn't have been using this anyway, but if you were, you only should pass `options` and `callback`. + +Part of NODE-1089 +* **keepAlive:** option `keepAlive` is now split into boolean `keepAlive` and +number `keepAliveInitialDelay` + +Fixes NODE-998 + + + + +# [3.0.0-rc0](https://github.com/mongodb/node-mongodb-native/compare/v2.2.31...v3.0.0-rc0) (2017-12-05) + + +### Bug Fixes + +* **aggregation:** ensure that the `cursor` key is always present ([f16f314](https://github.com/mongodb/node-mongodb-native/commit/f16f314)) +* **apm:** give users access to raw server responses ([88b206b](https://github.com/mongodb/node-mongodb-native/commit/88b206b)) +* **apm:** only rebuilt cursor if reply is non-null ([96052c8](https://github.com/mongodb/node-mongodb-native/commit/96052c8)) +* **apm:** rebuild lost `cursor` info on pre-OP_QUERY responses ([4242d49](https://github.com/mongodb/node-mongodb-native/commit/4242d49)) +* **bulk-unordered:** add check for ignoreUndefined ([f38641a](https://github.com/mongodb/node-mongodb-native/commit/f38641a)) +* **change stream examples:** use timeouts, cleanup ([c5fec5f](https://github.com/mongodb/node-mongodb-native/commit/c5fec5f)) +* **change-streams:** ensure a majority read concern on initial agg ([23011e9](https://github.com/mongodb/node-mongodb-native/commit/23011e9)) +* **changeStreams:** fixing node4 issue with util.inherits ([#1587](https://github.com/mongodb/node-mongodb-native/issues/1587)) ([168bb3d](https://github.com/mongodb/node-mongodb-native/commit/168bb3d)) +* **collection:** allow { upsert: 1 } for findOneAndUpdate() and update() ([5bcedd6](https://github.com/mongodb/node-mongodb-native/commit/5bcedd6)) +* **collection:** allow passing `noCursorTimeout` as an option to `find()` ([e9c4ffc](https://github.com/mongodb/node-mongodb-native/commit/e9c4ffc)) +* **collection:** make the parameters of findOne very explicit ([3054f1a](https://github.com/mongodb/node-mongodb-native/commit/3054f1a)) +* **cursor:** `hasNext` should propagate errors when using callback ([6339625](https://github.com/mongodb/node-mongodb-native/commit/6339625)) +* **cursor:** close readable on `null` response for dead cursor ([6aca2c5](https://github.com/mongodb/node-mongodb-native/commit/6aca2c5)) +* **dns txt records:** check options are set ([e5caf4f](https://github.com/mongodb/node-mongodb-native/commit/e5caf4f)) +* **docs:** Represent each valid option in docs in both places ([fde6e5d](https://github.com/mongodb/node-mongodb-native/commit/fde6e5d)) +* **grid-store:** add missing callback ([66a9a05](https://github.com/mongodb/node-mongodb-native/commit/66a9a05)) +* **grid-store:** move into callback scope ([b53f65f](https://github.com/mongodb/node-mongodb-native/commit/b53f65f)) +* **GridFS:** fix TypeError: doc.data.length is not a function ([#1570](https://github.com/mongodb/node-mongodb-native/issues/1570)) ([22a4628](https://github.com/mongodb/node-mongodb-native/commit/22a4628)) +* **list-collections:** ensure default of primary ReadPreference ([4a0cfeb](https://github.com/mongodb/node-mongodb-native/commit/4a0cfeb)) +* **mongo client:** close client before calling done ([c828aab](https://github.com/mongodb/node-mongodb-native/commit/c828aab)) +* **mongo client:** do not connect if url parse error ([cd10084](https://github.com/mongodb/node-mongodb-native/commit/cd10084)) +* **mongo client:** send error to cb ([eafc9e2](https://github.com/mongodb/node-mongodb-native/commit/eafc9e2)) +* **mongo-client:** move to inside of callback ([68b0fca](https://github.com/mongodb/node-mongodb-native/commit/68b0fca)) +* **mongo-client:** options should not be passed to `connect` ([474ac65](https://github.com/mongodb/node-mongodb-native/commit/474ac65)) +* **tests:** migrate 2.x tests to 3.x ([3a5232a](https://github.com/mongodb/node-mongodb-native/commit/3a5232a)) +* **updateOne/updateMany:** ensure that update documents contain atomic operators ([8b4255a](https://github.com/mongodb/node-mongodb-native/commit/8b4255a)) +* **url parser:** add check for options as cb ([52b6039](https://github.com/mongodb/node-mongodb-native/commit/52b6039)) +* **url parser:** compare srv address and parent domains ([daa186d](https://github.com/mongodb/node-mongodb-native/commit/daa186d)) +* **url parser:** compare string from first period on ([9e5d77e](https://github.com/mongodb/node-mongodb-native/commit/9e5d77e)) +* **url parser:** default to ssl true for mongodb+srv ([0fbca4b](https://github.com/mongodb/node-mongodb-native/commit/0fbca4b)) +* **url parser:** error when multiple hostnames used ([c1aa681](https://github.com/mongodb/node-mongodb-native/commit/c1aa681)) +* **url parser:** keep original uri options and default to ssl true ([e876a72](https://github.com/mongodb/node-mongodb-native/commit/e876a72)) +* **url parser:** log instead of throw error for unsupported url options ([155de2d](https://github.com/mongodb/node-mongodb-native/commit/155de2d)) +* **url parser:** make sure uri has 3 parts ([aa9871b](https://github.com/mongodb/node-mongodb-native/commit/aa9871b)) +* **url parser:** only 1 txt record allowed with 2 possible options ([d9f4218](https://github.com/mongodb/node-mongodb-native/commit/d9f4218)) +* **url parser:** only check for multiple hostnames with srv protocol ([5542bcc](https://github.com/mongodb/node-mongodb-native/commit/5542bcc)) +* **url parser:** remove .only from test ([642e39e](https://github.com/mongodb/node-mongodb-native/commit/642e39e)) +* **url parser:** return callback ([6096afc](https://github.com/mongodb/node-mongodb-native/commit/6096afc)) +* **url parser:** support single text record with multiple strings ([356fa57](https://github.com/mongodb/node-mongodb-native/commit/356fa57)) +* **url parser:** try catch bug, not actually returning from try loop ([758892b](https://github.com/mongodb/node-mongodb-native/commit/758892b)) +* **url parser:** use warn instead of info ([40ed27d](https://github.com/mongodb/node-mongodb-native/commit/40ed27d)) +* **url-parser:** remove comment, send error to cb ([d44420b](https://github.com/mongodb/node-mongodb-native/commit/d44420b)) + + +### Features + +* **aggregate:** support hit field for aggregate command ([aa7da15](https://github.com/mongodb/node-mongodb-native/commit/aa7da15)) +* **aggregation:** adds support for comment in aggregation command ([#1571](https://github.com/mongodb/node-mongodb-native/issues/1571)) ([4ac475c](https://github.com/mongodb/node-mongodb-native/commit/4ac475c)) +* **aggregation:** fail aggregation on explain + readConcern/writeConcern ([e0ca1b4](https://github.com/mongodb/node-mongodb-native/commit/e0ca1b4)) +* **causal-consistency:** support `afterClusterTime` in readConcern ([a9097f7](https://github.com/mongodb/node-mongodb-native/commit/a9097f7)) +* **change-streams:** add support for change streams ([c02d25c](https://github.com/mongodb/node-mongodb-native/commit/c02d25c)) +* **collection:** updating find API ([f26362d](https://github.com/mongodb/node-mongodb-native/commit/f26362d)) +* **execute-operation:** implementation for common op execution ([67c344f](https://github.com/mongodb/node-mongodb-native/commit/67c344f)) +* **listDatabases:** add support for nameOnly option to listDatabases ([eb79b5a](https://github.com/mongodb/node-mongodb-native/commit/eb79b5a)) +* **maxTimeMS:** adding maxTimeMS option to createIndexes and dropIndexes ([90d4a63](https://github.com/mongodb/node-mongodb-native/commit/90d4a63)) +* **mongo-client:** implement `MongoClient.prototype.startSession` ([bce5adf](https://github.com/mongodb/node-mongodb-native/commit/bce5adf)) +* **retryable-writes:** add support for `retryWrites` cs option ([2321870](https://github.com/mongodb/node-mongodb-native/commit/2321870)) +* **sessions:** MongoClient will now track sessions and release ([6829f47](https://github.com/mongodb/node-mongodb-native/commit/6829f47)) +* **sessions:** support passing sessions via objects in all methods ([a531f05](https://github.com/mongodb/node-mongodb-native/commit/a531f05)) +* **shared:** add helper utilities for assertion and suite setup ([b6cc34e](https://github.com/mongodb/node-mongodb-native/commit/b6cc34e)) +* **ssl:** adds missing ssl options ssl options for `ciphers` and `ecdhCurve` ([441b7b1](https://github.com/mongodb/node-mongodb-native/commit/441b7b1)) +* **test-shared:** add `notEqual` assertion ([41d93fd](https://github.com/mongodb/node-mongodb-native/commit/41d93fd)) +* **test-shared:** add `strictEqual` assertion method ([cad8e19](https://github.com/mongodb/node-mongodb-native/commit/cad8e19)) +* **topologies:** expose underlaying `logicalSessionTimeoutMinutes' ([1609a37](https://github.com/mongodb/node-mongodb-native/commit/1609a37)) +* **url parser:** better error message for slash in hostname ([457bc29](https://github.com/mongodb/node-mongodb-native/commit/457bc29)) + + +### BREAKING CHANGES + +* **aggregation:** If you use aggregation, and try to use the explain flag while you +have a readConcern or writeConcern, your query will fail +* **collection:** `find` and `findOne` no longer support the `fields` parameter. +You can achieve the same results as the `fields` parameter by +either using `Cursor.prototype.project`, or by passing the `projection` +property in on the `options` object. Additionally, `find` does not +support individual options like `skip` and `limit` as positional +parameters. You must pass in these parameters in the `options` object + + + +3.0.0 2017-??-?? +---------------- +* NODE-1043 URI-escaping authentication and hostname details in connection string + +2.2.31 2017-08-08 +----------------- +* update mongodb-core to 2.2.15 +* allow auth option in MongoClient.connect +* remove duplicate option `promoteLongs` from MongoClient's `connect` +* bulk operations should not throw an error on empty batch + +2.2.30 2017-07-07 +----------------- +* Update mongodb-core to 2.2.14 +* MongoClient + * add `appname` to list of valid option names + * added test for passing appname as option +* NODE-1052 ensure user options are applied while parsing connection string uris + +2.2.29 2017-06-19 +----------------- +* Update mongodb-core to 2.1.13 + * NODE-1039 ensure we force destroy server instances, forcing queue to be flushed. + * Use actual server type in standalone SDAM events. +* Allow multiple map calls (Issue #1521, https://github.com/Robbilie). +* Clone insertMany options before mutating (Issue #1522, https://github.com/vkarpov15). +* NODE-1034 Fix GridStore issue caused by Node 8.0.0 breaking backward compatible fs.read API. +* NODE-1026, use operator instead of skip function in order to avoid useless fetch stage. + +2.2.28 2017-06-02 +----------------- +* Update mongodb-core to 2.1.12 + * NODE-1019 Set keepAlive to 300 seconds or 1/2 of socketTimeout if socketTimeout < keepAlive. + * Minor fix to report the correct state on error. + * NODE-1020 'family' was added to options to provide high priority for ipv6 addresses (Issue #1518, https://github.com/firej). + * Fix require_optional loading of bson-ext. + * Ensure no errors are thrown by replset if topology is destroyed before it finished connecting. + * NODE-999 SDAM fixes for Mongos and single Server event emitting. + * NODE-1014 Set socketTimeout to default to 360 seconds. + * NODE-1019 Set keepAlive to 300 seconds or 1/2 of socketTimeout if socketTimeout < keepAlive. +* Just handle Collection name errors distinctly from general callback errors avoiding double callbacks in Db.collection. +* NODE-999 SDAM fixes for Mongos and single Server event emitting. +* NODE-1000 Added guard condition for upload.js checkDone function in case of race condition caused by late arriving chunk write. + +2.2.27 2017-05-22 +----------------- +* Updated mongodb-core to 2.1.11 + * NODE-987 Clear out old intervalIds on when calling topologyMonitor. + * NODE-987 Moved filtering to pingServer method and added test case. + * Check for connection destroyed just before writing out and flush out operations correctly if it is (Issue #179, https://github.com/jmholzinger). + * NODE-989 Refactored Replicaset monitoring to correcly monitor newly added servers, Also extracted setTimeout and setInterval to use custom wrappers Timeout and Interval. +* NODE-985 Deprecated Db.authenticate and Admin.authenticate and moved auth methods into authenticate.js to ensure MongoClient.connect does not print deprecation warnings. +* NODE-988 Merged readConcern and hint correctly on collection(...).find(...).count() +* Fix passing the readConcern option to MongoClient.connect (Issue #1514, https://github.com/bausmeier). +* NODE-996 Propegate all events up to a MongoClient instance. +* Allow saving doc with null `_id` (Issue #1517, https://github.com/vkarpov15). +* NODE-993 Expose hasNext for command cursor and add docs for both CommandCursor and Aggregation Cursor. + +2.2.26 2017-04-18 +----------------- +* Updated mongodb-core to 2.1.10 + * NODE-981 delegate auth to replset/mongos if inTopology is set. + * NODE-978 Wrap connection.end in try/catch for node 0.10.x issue causing exceptions to be thrown, Also surfaced getConnection for mongos and replset. + * Remove dynamic require (Issue #175, https://github.com/tellnes). + * NODE-696 Handle interrupted error for createIndexes. + * Fixed isse when user is executing find command using Server.command and it get interpreted as a wire protcol message, #172. + * NODE-966 promoteValues not being promoted correctly to getMore. + * Merged in fix for flushing out monitoring operations. +* NODE-983 Add cursorId to aggregate and listCollections commands (Issue, #1510). +* Mark group and profilingInfo as deprecated methods +* NODE-956 DOCS Examples. +* Update readable-stream to version 2.2.7. +* NODE-978 Added test case to uncover connection.end issue for node 0.10.x. +* NODE-972 Fix(db): don't remove database name if collectionName == dbName (Issue, #1502) +* Fixed merging of writeConcerns on db.collection method. +* NODE-970 mix in readPreference for strict mode listCollections callback. +* NODE-966 added testcase for promoteValues being applied to getMore commands. +* NODE-962 Merge in ignoreUndefined from collection level for find/findOne. +* Remove multi option from updateMany tests/docs (Issue #1499, https://github.com/spratt). +* NODE-963 Correctly handle cursor.count when using APM. + +2.2.25 2017-03-17 +----------------- +* Don't rely on global toString() for checking if object (Issue #1494, https://github.com/vkarpov15). +* Remove obsolete option uri_decode_auth (Issue #1488, https://github.com/kamagatos). +* NODE-936 Correctly translate ReadPreference to CoreReadPreference for mongos queries. +* Exposed BSONRegExp type. +* NODE-950 push correct index for INSERT ops (https://github.com/mbroadst). +* NODE-951 Added support for sslCRL option and added a test case for it. +* NODE-953 Made batchSize issue general at cursor level. +* NODE-954 Remove write concern from reindex helper as it will not be supported in 3.6. +* Updated mongodb-core to 2.1.9. + * Return lastIsMaster correctly when connecting with secondaryOnlyConnectionAllowed is set to true and only a secondary is available in replica state. + * Clone options when passed to wireProtocol handler to avoid intermittent modifications causing errors. + * Ensure SSL error propegates better for Replset connections when there is a SSL validation error. + * NODE-957 Fixed issue where < batchSize not causing cursor to be closed on execution of first batch. + * NODE-958 Store reconnectConnection on pool object to allow destroy to close immediately. + +2.2.24 2017-02-14 +----------------- +* NODE-935, NODE-931 Make MongoClient strict options validation optional and instead print annoying console.warn entries. + +2.2.23 2017-02-13 +----------------- +* Updated mongodb-core to 2.1.8. + * NODE-925 ensure we reschedule operations while pool is < poolSize while pool is growing and there are no connections with not currently performing work. + * NODE-927 fixes issue where authentication was performed against arbiter instances. + * NODE-915 Normalize all host names to avoid comparison issues. + * Fixed issue where pool.destroy would never finish due to a single operation not being executed and keeping it open. +* NODE-931 Validates all the options for MongoClient.connect and fixes missing connection settings. +* NODE-929 Update SSL tutorial to correctly reflect the non-need for server/mongos/replset subobjects +* Fix sensitive command check (Issue #1473, https://github.com/Annoraaq) + +2.2.22 2017-01-24 +----------------- +* Updated mongodb-core to 2.1.7. + * NODE-919 ReplicaSet connection does not close immediately (Issue #156). + * NODE-901 Fixed bug when normalizing host names. + * NODE-909 Fixed readPreference issue caused by direct connection to primary. + * NODE-910 Fixed issue when bufferMaxEntries == 0 and read preference set to nearest. +* Add missing unref implementations for replset, mongos (Issue #1455, https://github.com/zbjornson) + +2.2.21 2017-01-13 +----------------- +* Updated mongodb-core to 2.1.6. + * NODE-908 Keep auth contexts in replset and mongos topology to ensure correct application of authentication credentials when primary is first server to be detected causing an immediate connect event to happen. + +2.2.20 2017-01-11 +----------------- +* Updated mongodb-core to 2.1.5 to include bson 1.0.4 and bson-ext 1.0.4 due to Buffer.from being broken in early node 4.x versions. + +2.2.19 2017-01-03 +----------------- +* Corrupted Npm release fix. + +2.2.18 2017-01-03 +----------------- +* Updated mongodb-core to 2.1.4 to fix bson ObjectId toString issue with utils.inspect messing with toString parameters in node 6. + +2.2.17 2017-01-02 +----------------- +* updated createCollection doc options and linked to create command. +* Updated mongodb-core to 2.1.3. + * Monitoring operations are re-scheduled in pool if it cannot find a connection that does not already have scheduled work on it, this is to avoid the monitoring socket timeout being applied to any existing operations on the socket due to pipelining + * Moved replicaset monitoring away from serial mode and to parallel mode. + * updated bson and bson-ext dependencies to 1.0.2. + +2.2.16 2016-12-13 +----------------- +* NODE-899 reversed upsertedId change to bring back old behavior. + +2.2.15 2016-12-10 +----------------- +* Updated mongodb-core to 2.1.2. + * Delay topologyMonitoring on successful attemptReconnect as no need to run a full scan immediately. + * Emit reconnect event in primary joining when in connected status for a replicaset (Fixes mongoose reconnect issue). + +2.2.14 2016-12-08 +----------------- +* Updated mongodb-core to 2.1.1. +* NODE-892 Passthrough options.readPreference to mongodb-core ReplSet instance. + +2.2.13 2016-12-05 +----------------- +* Updated mongodb-core to 2.1.0. +* NODE-889 Fixed issue where legacy killcursor wire protocol messages would not be sent when APM is enabled. +* Expose parserType as property on topology objects. + +2.2.12 2016-11-29 +----------------- +* Updated mongodb-core to 2.0.14. + * Updated bson library to 0.5.7. + * Dont leak connection.workItems elments when killCursor is called (Issue #150, https://github.com/mdlavin). + * Remove unnecessary errors formatting (Issue #149, https://github.com/akryvomaz). + * Only check isConnected against availableConnections (Issue #142). + * NODE-838 Provide better error message on failed to connect on first retry for Mongos topology. + * Set default servername to host is not passed through for sni. + * Made monitoring happen on exclusive connection and using connectionTimeout to handle the wait time before failure (Issue #148). + * NODE-859 Make minimum value of maxStalenessSeconds 90 seconds. + * NODE-852 Fix Kerberos module deprecations on linux and windows and release new kerberos version. + * NODE-850 Update Max Staleness implementation. + * NODE-849 username no longer required for MONGODB-X509 auth. + * NODE-848 BSON Regex flags must be alphabetically ordered. + * NODE-846 Create notice for all third party libraries. + * NODE-843 Executing bulk operations overwrites write concern parameter. + * NODE-842 Re-sync SDAM and SDAM Monitoring tests from Specs repo. + * NODE-840 Resync CRUD spec tests. + * Unescapable while(true) loop (Issue #152). +* NODE-864 close event not emits during network issues using single server topology. +* Introduced maxStalenessSeconds. +* NODE-840 Added CRUD specification test cases and fix minor issues with upserts reporting matchedCount > 0. +* Don't ignore Db-level authSource when using auth method. (https://github.com/donaldguy). + +2.2.11 2016-10-21 +----------------- +* Updated mongodb-core to 2.0.13. + - Fire callback when topology was destroyed (Issue #147, https://github.com/vkarpov15). + - Refactoring to support pipelining ala 1.4.x branch will retaining the benefits of the growing/shrinking pool (Issue #146). + - Fix typo in serverHeartbeatFailed event name (Issue #143, https://github.com/jakesjews). + - NODE-798 Driver hangs on count command in replica set with one member (Issue #141, https://github.com/isayme). +* Updated bson library to 0.5.6. + - Included cyclic dependency detection +* Fix typo in serverHeartbeatFailed event name (Issue #1418, https://github.com/jakesjews). +* NODE-824, readPreference "nearest" does not work when specified at collection level. +* NODE-822, GridFSBucketWriteStream end method does not handle optional parameters. +* NODE-823, GridFSBucketWriteStream end: callback is invoked with invalid parameters. +* NODE-829, Using Start/End offset option in GridFSBucketReadStream doesn't return the right sized buffer. + +2.2.10 2016-09-15 +----------------- +* Updated mongodb-core to 2.0.12. +* fix debug logging message not printing server name. +* fixed application metadata being sent by wrong ismaster. +* NODE-812 Fixed mongos stall due to proxy monitoring ismaster failure causing reconnect. +* NODE-818 Replicaset timeouts in initial connect sequence can "no primary found". +* Updated bson library to 0.5.5. +* Added DBPointer up conversion to DBRef. +* MongoDB 3.4-RC Pass **appname** through MongoClient.connect uri or options to allow metadata to be passed. +* MongoDB 3.4-RC Pass collation options on update, findOne, find, createIndex, aggregate. +* MongoDB 3.4-RC Allow write concerns to be passed to all supporting server commands. +* MongoDB 3.4-RC Allow passing of **servername** as SSL options to support SNI. + +2.2.9 2016-08-29 +---------------- +* Updated mongodb-core to 2.0.11. +* NODE-803, Fixed issue in how the latency window is calculated for Mongos topology causing issues for single proxy connections. +* Avoid timeout in attemptReconnect causing multiple attemptReconnect attempts to happen (Issue #134, https://github.com/dead-horse). +* Ensure promoteBuffers is propegated in same fashion as promoteValues and promoteLongs. +* Don't treat ObjectId as object for mapReduce scope (Issue #1397, https://github.com/vkarpov15). + +2.2.8 2016-08-23 +---------------- +* Updated mongodb-core to 2.0.10. +* Added promoteValues flag (default to true) to allow user to specify they only want wrapped BSON values back instead of promotion to native types. +* Do not close mongos proxy connection on failed ismaster check in ha process (Issue #130). + +2.2.7 2016-08-19 +---------------- +* If only a single mongos is provided in the seedlist, fix issue where it would be assigned as single standalone server instead of mongos topology (Issue #130). +* Updated mongodb-core to 2.0.9. +* Allow promoteLongs to be passed in through Response.parse method and overrides default set on the connection. +* NODE-798 Driver hangs on count command in replica set with one member. +* Allow promoteLongs to be passed in through Response.parse method and overrides default set on the connection. +* Allow passing in servername for TLS connections for SNI support. + +2.2.6 2016-08-16 +---------------- +* Updated mongodb-core to 2.0.8. +* Allow execution of store operations independent of having both a primary and secondary available (Issue #123). +* Fixed command execution issue for mongos to ensure buffering of commands when no mongos available. +* Allow passing in an array of tags to ReadPreference constructor (Issue #1382, https://github.com/vkarpov15) +* Added hashed connection names and fullResult. +* Updated bson library to 0.5.3. +* Enable maxTimeMS in count, distinct, findAndModify. + +2.2.5 2016-07-28 +---------------- +* Updated mongodb-core to 2.0.7. +* Allow primary to be returned when secondaryPreferred is passed (Issue #117, https://github.com/dhendo). +* Added better warnings when passing in illegal seed list members to a Mongos topology. +* Minor attemptReconnect bug that would cause multiple attemptReconnect to run in parallel. +* Fix wrong opType passed to disconnectHandler.add (Issue #121, https://github.com/adrian-gierakowski) +* Implemented domain backward comp support enabled via domainsEnabled options on Server/ReplSet/Mongos and MongoClient.connect. + +2.2.4 2016-07-19 +---------------- +* NPM corrupted upload fix. + +2.2.3 2016-07-19 +---------------- +* Updated mongodb-core to 2.0.6. +* Destroy connection on socket timeout due to newer node versions not closing the socket. + +2.2.2 2016-07-15 +---------------- +* Updated mongodb-core to 2.0.5. +* Minor fixes to handle faster MongoClient connectivity from the driver, allowing single server instances to detect if they are a proxy. +* Added numberOfConsecutiveTimeouts to pool that will destroy the pool if the number of consecutive timeouts > reconnectTries. +* Print warning if seedlist servers host name does not match the one provided in it's ismaster.me field for Replicaset members. +* Fix issue where Replicaset connection would not succeeed if there the replicaset was a single primary server setup. + +2.2.1 2016-07-11 +---------------- +* Updated mongodb-core to 2.0.4. +* handle situation where user is providing seedlist names that do not match host list. fix allows for a single full discovery connection sweep before erroring out. +* NODE-747 Polyfill for Object.assign for 0.12.x or 0.10.x. +* NODE-746 Improves replicaset errors for wrong setName. + +2.2.0 2016-07-05 +---------------- +* Updated mongodb-core to 2.0.3. +* Moved all authentication and handling of growing/shrinking of pool connections into actual pool. +* All authentication methods now handle both auth/reauthenticate and logout events. +* Introduced logout method to get rid of onAll option for logout command. +* Updated bson to 0.5.0 that includes Decimal128 support. +* Fixed logger error serialization issue. +* Documentation fixes. +* Implemented Server Selection Specification test suite. +* Added warning level to logger. +* Added warning message when sockeTimeout < haInterval for Replset/Mongos. +* Mongos emits close event on no proxies available or when reconnect attempt fails. +* Replset emits close event when no servers available or when attemptReconnect fails to reconnect. +* Don't throw in auth methods but return error in callback. + +2.1.21 2016-05-30 +----------------- +* Updated mongodb-core to 1.3.21. +* Pool gets stuck if a connection marked for immediateRelease times out (Issue #99, https://github.com/nbrachet). +* Make authentication process retry up to authenticationRetries at authenticationRetryIntervalMS interval. +* Made ismaster replicaset calls operate with connectTimeout or monitorSocketTimeout to lower impact of big socketTimeouts on monitoring performance. +* Make sure connections mark as "immediateRelease" don't linger the inUserConnections list. Otherwise, after that connection times out, getAll() incorrectly returns more connections than are effectively present, causing the pool to not get restarted by reconnectServer. (Issue #99, https://github.com/nbrachet). +* Make cursor getMore or killCursor correctly trigger pool reconnect to single server if pool has not been destroyed. +* Make ismaster monitoring for single server connection default to avoid user confusion due to change in behavior. + +2.1.20 2016-05-25 +----------------- +* Refactored MongoClient options handling to simplify the logic, unifying it. +* NODE-707 Implemented openUploadStreamWithId on GridFS to allow for custom fileIds so users are able to customize shard key and shard distribution. +* NODE-710 Allow setting driver loggerLevel and logger function from MongoClient options. +* Updated mongodb-core to 1.3.20. +* Minor fix for SSL errors on connection attempts, minor fix to reconnect handler for the server. +* Don't write to socket before having registered the callback for commands, work around for windows issuing error events twice on node.js when socket gets destroyed by firewall. +* Fix minor issue where connectingServers would not be removed correctly causing single server connections to not auto-reconnect. + +2.1.19 2016-05-17 +---------------- +* Handle situation where a server connection in a replicaset sometimes fails to be destroyed properly due to being in the middle of authentication when the destroy method is called on the replicaset causing it to be orphaned and never collected. +* Ensure replicaset topology destroy is never called by SDAM. +* Ensure all paths are correctly returned on inspectServer in replset. +* Updated mongodb-core to 1.3.19 to fix minor connectivity issue on quick open/close of MongoClient connections on auth enabled mongodb Replicasets. + +2.1.18 2016-04-27 +----------------- +* Updated mongodb-core to 1.3.18 to fix Node 6.0 issues. + +2.1.17 2016-04-26 +----------------- +* Updated mongodb-core to 1.3.16 to work around issue with early versions of node 0.10.x due to missing unref method on ClearText streams. +* INT-1308: Allow listIndexes to inherit readPreference from Collection or DB. +* Fix timeout issue using new flags #1361. +* Updated mongodb-core to 1.3.17. +* Better handling of unique createIndex error. +* Emit error only if db instance has an error listener. +* DEFAULT authMechanism; don't throw error if explicitly set by user. + +2.1.16 2016-04-06 +----------------- +* Updated mongodb-core to 1.3.16. + +2.1.15 2016-04-06 +----------------- +* Updated mongodb-core to 1.3.15. +* Set ssl, sslValidate etc to mongosOptions on url_parser (Issue #1352, https://github.com/rubenstolk). +- NODE-687 Fixed issue where a server object failed to be destroyed if the replicaset state did not update successfully. This could leave active connections accumulating over time. +- Fixed some situations where all connections are flushed due to a single connection in the connection pool closing. + +2.1.14 2016-03-29 +----------------- +* Updated mongodb-core to 1.3.13. +* Handle missing cursor on getMore when going through a mongos proxy by pinning to socket connection and not server. + +2.1.13 2016-03-29 +----------------- +* Updated mongodb-core to 1.3.12. + +2.1.12 2016-03-29 +----------------- +* Updated mongodb-core to 1.3.11. +* Mongos setting acceptableLatencyMS exposed to control the latency women for mongos selection. +* Mongos pickProxies fall back to closest mongos if no proxies meet latency window specified. +* isConnected method for mongos uses same selection code as getServer. +* Exceptions in cursor getServer trapped and correctly delegated to high level handler. + +2.1.11 2016-03-23 +----------------- +* Updated mongodb-core to 1.3.10. +* Introducing simplified connections settings. + +2.1.10 2016-03-21 +----------------- +* Updated mongodb-core to 1.3.9. +* Fixing issue that prevented mapReduce stats from being resolved (Issue #1351, https://github.com/davidgtonge) +* Forwards SDAM monitoring events from mongodb-core. + +2.1.9 2016-03-16 +---------------- +* Updated mongodb-core to 1.3.7 to fix intermittent race condition that causes some users to experience big amounts of socket connections. +* Makde bson parser in ordered/unordered bulk be directly from mongodb-core to avoid intermittent null error on mongoose. + +2.1.8 2016-03-14 +---------------- +* Updated mongodb-core to 1.3.5. +* NODE-660 TypeError: Cannot read property 'noRelease' of undefined. +* Harden MessageHandler in server.js to avoid issues where we cannot find a callback for an operation. +* Ensure RequestId can never be larger than Max Number integer size. +* NODE-661 typo in url_parser.js resulting in replSetServerOptions is not defined when connecting over ssl. +* Confusing error with invalid partial index filter (Issue #1341, https://github.com/vkarpov15). +* NODE-669 Should only error out promise for bulkWrite when error is a driver level error not a write error or write concern error. +* NODE-662 shallow copy options on methods that are not currently doing it to avoid passed in options mutiation. +* NODE-663 added lookup helper on aggregation cursor. +* NODE-585 Result object specified incorrectly for findAndModify?. +* NODE-666 harden validation for findAndModify CRUD methods. + +2.1.7 2016-02-09 +---------------- +* NODE-656 fixed corner case where cursor count command could be left without a connection available. +* NODE-658 Work around issue that bufferMaxEntries:-1 for js gets interpreted wrongly due to double nature of Javascript numbers. +* Fix: GridFS always returns the oldest version due to incorrect field name (Issue #1338, https://github.com/mdebruijne). +* NODE-655 GridFS stream support for cancelling upload streams and download streams (Issue #1339, https://github.com/vkarpov15). +* NODE-657 insertOne don`t return promise in some cases. +* Added destroy alias for abort function on GridFSBucketWriteStream. + +2.1.6 2016-02-05 +---------------- +* Updated mongodb-core to 1.3.1. + +2.1.5 2016-02-04 +---------------- +* Updated mongodb-core to 1.3.0. +* Added raw support for the command function on topologies. +* Fixed issue where raw results that fell on batchSize boundaries failed (Issue #72) +* Copy over all the properties to the callback returned from bindToDomain, (Issue #72) +* Added connection hash id to be able to reference connection host/name without leaking it outside of driver. +* NODE-638, Cannot authenticate database user with utf-8 password. +* Refactored pool to be worker queue based, minimizing the impact a slow query have on throughput as long as # slow queries < # connections in the pool. +* Pool now grows and shrinks correctly depending on demand not causing a full pool reconnect. +* Improvements in monitoring of a Replicaset where in certain situations the inquiry process could get exited. +* Switched to using Array.push instead of concat for use cases of a lot of documents. +* Fixed issue where re-authentication could loose the credentials if whole Replicaset disconnected at once. +* Added peer optional dependencies support using require_optional module. +* Bug is listCollections for collection names that start with db name (Issue #1333, https://github.com/flyingfisher) +* Emit error before closing stream (Issue #1335, https://github.com/eagleeye) + +2.1.4 2016-01-12 +---------------- +* Restricted node engine to >0.10.3 (https://jira.mongodb.org/browse/NODE-635). +* Multiple database names ignored without a warning (https://jira.mongodb.org/browse/NODE-636, Issue #1324, https://github.com/yousefhamza). +* Convert custom readPreference objects in collection.js (Issue #1326, https://github.com/Machyne). + +2.1.3 2016-01-04 +---------------- +* Updated mongodb-core to 1.2.31. +* Allow connection to secondary if primaryPreferred or secondaryPreferred (Issue #70, https://github.com/leichter) + +2.1.2 2015-12-23 +---------------- +* Updated mongodb-core to 1.2.30. +* Pool allocates size + 1 connections when using replicasets, reserving additional pool connection for monitoring exclusively. +* Fixes bug when all replicaset members are down, that would cause it to fail to reconnect using the originally provided seedlist. + +2.1.1 2015-12-13 +---------------- +* Surfaced checkServerIdentity options for MongoClient, Server, ReplSet and Mongos to allow for control of the checkServerIdentity method available in Node.s 0.12.x or higher. +* Added readPreference support to listCollections and listIndexes helpers. +* Updated mongodb-core to 1.2.28. + +2.1.0 2015-12-06 +---------------- +* Implements the connection string specification, https://github.com/mongodb/specifications/blob/master/source/connection-string/connection-string-spec.rst. +* Implements the new GridFS specification, https://github.com/mongodb/specifications/blob/master/source/gridfs/gridfs-spec.rst. +* Full MongoDB 3.2 support. +* NODE-601 Added maxAwaitTimeMS support for 3.2 getMore to allow for custom timeouts on tailable cursors. +* Updated mongodb-core to 1.2.26. +* Return destination in GridStore pipe function. +* NODE-606 better error handling on destroyed topology for db.js methods. +* Added isDestroyed method to server, replset and mongos topologies. +* Upgraded test suite to run using mongodb-topology-manager. + +2.0.53 2015-12-23 +----------------- +* Updated mongodb-core to 1.2.30. +* Pool allocates size + 1 connections when using replicasets, reserving additional pool connection for monitoring exclusively. +* Fixes bug when all replicaset members are down, that would cause it to fail to reconnect using the originally provided seedlist. + +2.0.52 2015-12-14 +----------------- +* removed remove from Gridstore.close. + +2.0.51 2015-12-13 +----------------- +* Surfaced checkServerIdentity options for MongoClient, Server, ReplSet and Mongos to allow for control of the checkServerIdentity method available in Node.s 0.12.x or higher. +* Added readPreference support to listCollections and listIndexes helpers. +* Updated mongodb-core to 1.2.28. + +2.0.50 2015-12-06 +----------------- +* Updated mongodb-core to 1.2.26. + +2.0.49 2015-11-20 +----------------- +* Updated mongodb-core to 1.2.24 with several fixes. + * Fix Automattic/mongoose#3481; flush callbacks on error, (Issue #57, https://github.com/vkarpov15). + * $explain query for wire protocol 2.6 and 2.4 does not set number of returned documents to -1 but to 0. + * ismaster runs against admin.$cmd instead of system.$cmd. + * Fixes to handle getMore command errors for MongoDB 3.2 + * Allows the process to properly close upon a Db.close() call on the replica set by shutting down the haTimer and closing arbiter connections. + +2.0.48 2015-11-07 +----------------- +* GridFS no longer performs any deletes when writing a brand new file that does not have any previous .fs.chunks or .fs.files documents. +* Updated mongodb-core to 1.2.21. +* Hardened the checking for replicaset equality checks. +* OpReplay flag correctly set on Wire protocol query. +* Mongos load balancing added, introduced localThresholdMS to control the feature. +* Kerberos now a peerDependency, making it not install it by default in Node 5.0 or higher. + +2.0.47 2015-10-28 +----------------- +* Updated mongodb-core to 1.2.20. +* Fixed bug in arbiter connection capping code. +* NODE-599 correctly handle arrays of server tags in order of priority. +* Fix for 2.6 wire protocol handler related to readPreference handling. +* Added maxAwaitTimeMS support for 3.2 getMore to allow for custom timeouts on tailable cursors. +* Make CoreCursor check for $err before saying that 'next' succeeded (Issue #53, https://github.com/vkarpov15). + +2.0.46 2015-10-15 +----------------- +* Updated mongodb-core to 1.2.19. +* NODE-578 Order of sort fields is lost for numeric field names. +* Expose BSON Map (ES6 Map or polyfill). +* Minor fixes for APM support to pass extended APM test suite. + +2.0.45 2015-09-30 +----------------- +* NODE-566 Fix issue with rewind on capped collections causing cursor state to be reset on connection loss. + +2.0.44 2015-09-28 +----------------- +* Bug fixes for APM upconverting of legacy INSERT/UPDATE/REMOVE wire protocol messages. +* NODE-562, fixed issue where a Replicaset MongoDB URI with a single seed and replSet name set would cause a single direct connection instead of topology discovery. +* Updated mongodb-core to 1.2.14. +* NODE-563 Introduced options.ignoreUndefined for db class and MongoClient db options, made serialize undefined to null default again but allowing for overrides on insert/update/delete operations. +* Use handleCallback if result is an error for count queries. (Issue #1298, https://github.com/agclever) +* Rewind cursor to correctly force reconnect on capped collections when first query comes back empty. +* NODE-571 added code 59 to legacy server errors when SCRAM-SHA-1 mechanism fails. +* NODE-572 Remove examples that use the second parameter to `find()`. + +2.0.43 2015-09-14 +----------------- +* Propagate timeout event correctly to db instances. +* Application Monitoring API (APM) implemented. +* NOT providing replSet name in MongoClient connection URI will force single server connection. Fixes issue where it was impossible to directly connect to a replicaset member server. +* Updated mongodb-core to 1.2.12. +* NODE-541 Initial Support "read committed" isolation level where "committed" means confimed by the voting majority of a replica set. +* GridStore doesn't share readPreference setting from connection string. (Issue #1295, https://github.com/zhangyaoxing) +* fixed forceServerObjectId calls (Issue #1292, https://github.com/d-mon-) +* Pass promise library through to DB function (Issue #1294, https://github.com/RovingCodeMonkey) + +2.0.42 2015-08-18 +----------------- +* Added test case to exercise all non-crud methods on mongos topologies, fixed numberOfConnectedServers on mongos topology instance. + +2.0.41 2015-08-14 +----------------- +* Added missing Mongos.prototype.parserType function. +* Updated mongodb-core to 1.2.10. + +2.0.40 2015-07-14 +----------------- +* Updated mongodb-core to 1.2.9 for 2.4 wire protocol error handler fix. +* NODE-525 Reset connectionTimeout after it's overwritten by tls.connect. +* NODE-518 connectTimeoutMS is doubled in 2.0.39. +* NODE-506 Ensures that errors from bulk unordered and ordered are instanceof Error (Issue #1282, https://github.com/owenallenaz). +* NODE-526 Unique index not throwing duplicate key error. +* NODE-528 Ignore undefined fields in Collection.find(). +* NODE-527 The API example for collection.createIndex shows Db.createIndex functionality. + +2.0.39 2015-07-14 +----------------- +* Updated mongodb-core to 1.2.6 for NODE-505. + +2.0.38 2015-07-14 +----------------- +* NODE-505 Query fails to find records that have a 'result' property with an array value. + +2.0.37 2015-07-14 +----------------- +* NODE-504 Collection * Default options when using promiseLibrary. +* NODE-500 Accidental repeat of hostname in seed list multiplies total connections persistently. +* Updated mongodb-core to 1.2.5 to fix NODE-492. + +2.0.36 2015-07-07 +----------------- +* Fully promisified allowing the use of ES6 generators and libraries like co. Also allows for BYOP (Bring your own promises). +* NODE-493 updated mongodb-core to 1.2.4 to ensure we cannot DDOS the mongod or mongos process on large connection pool sizes. + +2.0.35 2015-06-17 +----------------- +* Upgraded to mongodb-core 1.2.2 including removing warnings when C++ bson parser is not available and a fix for SCRAM authentication. + +2.0.34 2015-06-17 +----------------- +* Upgraded to mongodb-core 1.2.1 speeding up serialization and removing the need for the c++ bson extension. +* NODE-486 fixed issue related to limit and skip when calling toArray in 2.0 driver. +* NODE-483 throw error if capabilities of topology is queries before topology has performed connection setup. +* NODE-482 fixed issue where MongoClient.connect would incorrectly identify a replset seed list server as a non replicaset member. +* NODE-487 fixed issue where killcursor command was not being sent correctly on limit and skip queries. + +2.0.33 2015-05-20 +----------------- +* Bumped mongodb-core to 1.1.32. + +2.0.32 2015-05-19 +----------------- +* NODE-463 db.close immediately executes its callback. +* Don't only emit server close event once (Issue #1276, https://github.com/vkarpov15). +* NODE-464 Updated mongodb-core to 1.1.31 that uses a single socket connection to arbiters and hidden servers as well as emitting all event correctly. + +2.0.31 2015-05-08 +----------------- +* NODE-461 Tripping on error "no chunks found for file, possibly corrupt" when there is no error. + +2.0.30 2015-05-07 +----------------- +* NODE-460 fix; don't set authMechanism for user in db.authenticate() to avoid mongoose authentication issue. + +2.0.29 2015-05-07 +----------------- +* NODE-444 Possible memory leak, too many listeners added. +* NODE-459 Auth failure using Node 0.8.28, MongoDB 3.0.2 & mongodb-node-native 1.4.35. +* Bumped mongodb-core to 1.1.26. + +2.0.28 2015-04-24 +----------------- +* Bumped mongodb-core to 1.1.25 +* Added Cursor.prototype.setCursorOption to allow for setting node specific cursor options for tailable cursors. +* NODE-430 Cursor.count() opts argument masked by var opts = {} +* NODE-406 Implemented Cursor.prototype.map function tapping into MongoClient cursor transforms. +* NODE-438 replaceOne is not returning the result.ops property as described in the docs. +* NODE-433 _read, pipe and write all open gridstore automatically if not open. +* NODE-426 ensure drain event is emitted after write function returns, fixes intermittent issues in writing files to gridstore. +* NODE-440 GridStoreStream._read() doesn't check GridStore.read() error. +* Always use readPreference = primary for findAndModify command (ignore passed in read preferences) (Issue #1274, https://github.com/vkarpov15). +* Minor fix in GridStore.exists for dealing with regular expressions searches. + +2.0.27 2015-04-07 +----------------- +* NODE-410 Correctly handle issue with pause/resume in Node 0.10.x that causes exceptions when using the Node 0.12.0 style streams. + +2.0.26 2015-04-07 +----------------- +* Implements the Common Index specification Standard API at https://github.com/mongodb/specifications/blob/master/source/index-management.rst. +* NODE-408 Expose GridStore.currentChunk.chunkNumber. + +2.0.25 2015-03-26 +----------------- +* Upgraded mongodb-core to 1.1.21, making the C++ bson code an optional dependency to the bson module. + +2.0.24 2015-03-24 +----------------- +* NODE-395 Socket Not Closing, db.close called before full set finished initalizing leading to server connections in progress not being closed properly. +* Upgraded mongodb-core to 1.1.20. + +2.0.23 2015-03-21 +----------------- +* NODE-380 Correctly return MongoError from toError method. +* Fixed issue where addCursorFlag was not correctly setting the flag on the command for mongodb-core. +* NODE-388 Changed length from method to property on order.js/unordered.js bulk operations. +* Upgraded mongodb-core to 1.1.19. + +2.0.22 2015-03-16 +----------------- +* NODE-377, fixed issue where tags would correctly be checked on secondary and nearest to filter out eligible server candidates. +* Upgraded mongodb-core to 1.1.17. + +2.0.21 2015-03-06 +----------------- +* Upgraded mongodb-core to 1.1.16 making sslValidate default to true to force validation on connection unless overriden by the user. + +2.0.20 2015-03-04 +----------------- +* Updated mongodb-core 1.1.15 to relax pickserver method. + +2.0.19 2015-03-03 +----------------- +* NODE-376 Fixes issue * Unordered batch incorrectly tracks batch size when switching batch types (Issue #1261, https://github.com/meirgottlieb) +* NODE-379 Fixes bug in cursor.count() that causes the result to always be zero for dotted collection names (Issue #1262, https://github.com/vsivsi) +* Expose MongoError from mongodb-core (Issue #1260, https://github.com/tjconcept) + +2.0.18 2015-02-27 +----------------- +* Bumped mongodb-core 1.1.14 to ensure passives are correctly added as secondaries. + +2.0.17 2015-02-27 +----------------- +* NODE-336 Added length function to ordered and unordered bulk operations to be able know the amount of current operations in bulk. +* Bumped mongodb-core 1.1.13 to ensure passives are correctly added as secondaries. + +2.0.16 2015-02-16 +----------------- +* listCollection now returns filtered result correctly removing db name for 2.6 or earlier servers. +* Bumped mongodb-core 1.1.12 to correctly work for node 0.12.0 and io.js. +* Add ability to get collection name from cursor (Issue #1253, https://github.com/vkarpov15) + +2.0.15 2015-02-02 +----------------- +* Unified behavior of listCollections results so 3.0 and pre 3.0 return same type of results. +* Bumped mongodb-core to 1.1.11 to support per document tranforms in cursors as well as relaxing the setName requirement. +* NODE-360 Aggregation cursor and command correctly passing down the maxTimeMS property. +* Added ~1.0 mongodb-tools module for test running. +* Remove the required setName for replicaset connections, if not set it will pick the first setName returned. + +2.0.14 2015-01-21 +----------------- +* Fixed some MongoClient.connect options pass through issues and added test coverage. +* Bumped mongodb-core to 1.1.9 including fixes for io.js + +2.0.13 2015-01-09 +----------------- +* Bumped mongodb-core to 1.1.8. +* Optimized query path for performance, moving Object.defineProperty outside of constructors. + +2.0.12 2014-12-22 +----------------- +* Minor fixes to listCollections to ensure correct querying of a collection when using a string. + +2.0.11 2014-12-19 +----------------- +* listCollections filters out index namespaces on < 2.8 correctly +* Bumped mongo-client to 1.1.7 + +2.0.10 2014-12-18 +----------------- +* NODE-328 fixed db.open return when no callback available issue and added test. +* NODE-327 Refactored listCollections to return cursor to support 2.8. +* NODE-327 Added listIndexes method and refactored internal methods to use the new command helper. +* NODE-335 Cannot create index for nested objects fixed by relaxing key checking for createIndex helper. +* Enable setting of connectTimeoutMS (Issue #1235, https://github.com/vkarpov15) +* Bumped mongo-client to 1.1.6 + +2.0.9 2014-12-01 +---------------- +* Bumped mongodb-core to 1.1.3 fixing global leaked variables and introducing strict across all classes. +* All classes are now strict (Issue #1233) +* NODE-324 Refactored insert/update/remove and all other crud opts to rely on internal methods to avoid any recursion. +* Fixed recursion issues in debug logging due to JSON.stringify() +* Documentation fixes (Issue #1232, https://github.com/wsmoak) +* Fix writeConcern in Db.prototype.ensureIndex (Issue #1231, https://github.com/Qard) + +2.0.8 2014-11-28 +---------------- +* NODE-322 Finished up prototype refactoring of Db class. +* NODE-322 Exposed Cursor in index.js for New Relic. + +2.0.7 2014-11-20 +---------------- +* Bumped mongodb-core to 1.1.2 fixing a UTF8 encoding issue for collection names. +* NODE-318 collection.update error while setting a function with serializeFunctions option. +* Documentation fixes. + +2.0.6 2014-11-14 +---------------- +* Refactored code to be prototype based instead of privileged methods. +* Bumped mongodb-core to 1.1.1 to take advantage of the prototype based refactorings. +* Implemented missing aspects of the CRUD specification. +* Fixed documentation issues. +* Fixed global leak REFERENCE_BY_ID in gridfs grid_store (Issue #1225, https://github.com/j) +* Fix LearnBoost/mongoose#2313: don't let user accidentally clobber geoNear params (Issue #1223, https://github.com/vkarpov15) + +2.0.5 2014-10-29 +---------------- +* Minor fixes to documentation and generation of documentation. +* NODE-306 (No results in aggregation cursor when collection name contains a dot), Merged code for cursor and aggregation cursor. + +2.0.4 2014-10-23 +---------------- +* Allow for single replicaset seed list with no setName specified (Issue #1220, https://github.com/imaman) +* Made each rewind on each call allowing for re-using the cursor. +* Fixed issue where incorrect iterations would happen on each for extensive batchSizes. +* NODE-301 specifying maxTimeMS on find causes all fields to be omitted from result. + +2.0.3 2014-10-14 +---------------- +* NODE-297 Aggregate Broken for case of pipeline with no options. + +2.0.2 2014-10-08 +---------------- +* Bumped mongodb-core to 1.0.2. +* Fixed bson module dependency issue by relying on the mongodb-core one. +* Use findOne instead of find followed by nextObject (Issue #1216, https://github.com/sergeyksv) + +2.0.1 2014-10-07 +---------------- +* Dependency fix + +2.0.0 2014-10-07 +---------------- +* First release of 2.0 driver + +2.0.0-alpha2 2014-10-02 +----------------------- +* CRUD API (insertOne, insertMany, updateOne, updateMany, removeOne, removeMany, bulkWrite, findOneAndDelete, findOneAndUpdate, findOneAndReplace) +* Cluster Management Spec compatible. + +2.0.0-alpha1 2014-09-08 +----------------------- +* Insert method allows only up 1000 pr batch for legacy as well as 2.6 mode +* Streaming behavior is 0.10.x or higher with backwards compatibility using readable-stream npm package +* Gridfs stream only available through .stream() method due to overlapping names on Gridstore object and streams in 0.10.x and higher of node +* remove third result on update and remove and return the whole result document instead (getting rid of the weird 3 result parameters) + * Might break some application +* Returns the actual mongodb-core result instead of just the number of records changed for insert/update/remove +* MongoClient only has the connect method (no ability instantiate with Server, ReplSet or similar) +* Removed Grid class +* GridStore only supports w+ for metadata updates, no appending to file as it's not thread safe and can cause corruption of the data + + seek will fail if attempt to use with w or w+ + + write will fail if attempted with w+ or r + + w+ only works for updating metadata on a file +* Cursor toArray and each resets and re-runs the cursor +* FindAndModify returns whole result document instead of just value +* Extend cursor to allow for setting all the options via methods instead of dealing with the current messed up find +* Removed db.dereference method +* Removed db.cursorInfo method +* Removed db.stats method +* Removed db.collectionNames not needed anymore as it's just a specialized case of listCollections +* Removed db.collectionInfo removed due to not being compatible with new storage engines in 2.8 as they need to use the listCollections command due to system collections not working for namespaces. +* Added db.listCollections to replace several methods above + +1.4.10 2014-09-04 +----------------- +* Fixed BSON and Kerberos compilation issues +* Bumped BSON to ~0.2 always installing latest BSON 0.2.x series +* Fixed Kerberos and bumped to 0.0.4 + +1.4.9 2014-08-26 +---------------- +* Check _bsonType for Binary (Issue #1202, https://github.com/mchapman) +* Remove duplicate Cursor constructor (Issue #1201, https://github.com/KenPowers) +* Added missing parameter in the documentation (Issue #1199, https://github.com/wpjunior) +* Documented third parameter on the update callback(Issue #1196, https://github.com/gabmontes) +* NODE-240 Operations on SSL connection hang on node 0.11.x +* NODE-235 writeResult is not being passed on when error occurs in insert +* NODE-229 Allow count to work with query hints +* NODE-233 collection.save() does not support fullResult +* NODE-244 Should parseError also emit a `disconnected` event? +* NODE-246 Cursors are inefficiently constructed and consequently cannot be promisified. +* NODE-248 Crash with X509 auth +* NODE-252 Uncaught Exception in Base.__executeAllServerSpecificErrorCallbacks +* Bumped BSON parser to 0.2.12 + + +1.4.8 2014-08-01 +---------------- +* NODE-205 correctly emit authenticate event +* NODE-210 ensure no undefined connection error when checking server state +* NODE-212 correctly inherit socketTimeoutMS from replicaset when HA process adds new servers or reconnects to existing ones +* NODE-220 don't throw error if ensureIndex errors out in Gridstore +* Updated bson to 0.2.11 to ensure correct toBSON behavior when returning non object in nested classes +* Fixed test running filters +* Wrap debug log in a call to format (Issue #1187, https://github.com/andyroyle) +* False option values should not trigger w:1 (Issue #1186, https://github.com/jsdevel) +* Fix aggregatestream.close(Issue #1194, https://github.com/jonathanong) +* Fixed parsing issue for w:0 in url parser when in connection string +* Modified collection.geoNear to support a geoJSON point or legacy coordinate pair (Issue #1198, https://github.com/mmacmillan) + +1.4.7 2014-06-18 +---------------- +* Make callbacks to be executed in right domain when server comes back up (Issue #1184, https://github.com/anton-kotenko) +* Fix issue where currentOp query against mongos would fail due to mongos passing through $readPreference field to mongod (CS-X) + +1.4.6 2014-06-12 +---------------- +* Added better support for MongoClient IP6 parsing (Issue #1181, https://github.com/micovery) +* Remove options check on index creation (Issue #1179, Issue #1183, https://github.com/jdesboeufs, https://github.com/rubenvereecken) +* Added missing type check before calling optional callback function (Issue #1180) + +1.4.5 2014-05-21 +---------------- +* Added fullResult flag to insert/update/remove which will pass raw result document back. Document contents will vary depending on the server version the driver is talking to. No attempt is made to coerce a joint response. +* Fix to avoid MongoClient.connect hanging during auth when secondaries building indexes pre 2.6. +* return the destination stream in GridStore.pipe (Issue #1176, https://github.com/iamdoron) + +1.4.4 2014-05-13 +---------------- +* Bumped BSON version to use the NaN 1.0 package, fixed strict comparison issue for ObjectID +* Removed leaking global variable (Issue #1174, https://github.com/dainis) +* MongoClient respects connectTimeoutMS for initial discovery process (NODE-185) +* Fix bug with return messages larger than 16MB but smaller than max BSON Message Size (NODE-184) + +1.4.3 2014-05-01 +---------------- +* Clone options for commands to avoid polluting original options passed from Mongoose (Issue #1171, https://github.com/vkarpov15) +* Made geoNear and geoHaystackSearch only clean out allowed options from command generation (Issue #1167) +* Fixed typo for allowDiskUse (Issue #1168, https://github.com/joaofranca) +* A 'mapReduce' function changed 'function' to instance '\' of 'Code' class (Issue #1165, https://github.com/exabugs) +* Made findAndModify set sort only when explicitly set (Issue #1163, https://github.com/sars) +* Rewriting a gridStore file by id should use a new filename if provided (Issue #1169, https://github.com/vsivsi) + +1.4.2 2014-04-15 +---------------- +* Fix for inheritance of readPreferences from MongoClient NODE-168/NODE-169 +* Merged in fix for ping strategy to avoid hitting non-pinged servers (Issue #1161, https://github.com/vaseker) +* Merged in fix for correct debug output for connection messages (Issue #1158, https://github.com/vaseker) +* Fixed global variable leak (Issue #1160, https://github.com/vaseker) + +1.4.1 2014-04-09 +---------------- +* Correctly emit joined event when primary change +* Add _id to documents correctly when using bulk operations + +1.4.0 2014-04-03 +---------------- +* All node exceptions will no longer be caught if on('error') is defined +* Added X509 auth support +* Fix for MongoClient connection timeout issue (NODE-97) +* Pass through error messages from parseError instead of just text (Issue #1125) +* Close db connection on error (Issue #1128, https://github.com/benighted) +* Fixed documentation generation +* Added aggregation cursor for 2.6 and emulated cursor for pre 2.6 (uses stream2) +* New Bulk API implementation using write commands for 2.6 and down converts for pre 2.6 +* Insert/Update/Remove using new write commands when available +* Added support for new roles based API's in 2.6 for addUser/removeUser +* Added bufferMaxEntries to start failing if the buffer hits the specified number of entries +* Upgraded BSON parser to version 0.2.7 to work with < 0.11.10 C++ API changes +* Support for OP_LOG_REPLAY flag (NODE-94) +* Fixes for SSL HA ping and discovery. +* Uses createIndexes if available for ensureIndex/createIndex +* Added parallelCollectionScan method to collection returning CommandCursor instances for cursors +* Made CommandCursor behave as Readable stream. +* Only Db honors readPreference settings, removed Server.js legacy readPreference settings due to user confusion. +* Reconnect event emitted by ReplSet/Mongos/Server after reconnect and before replaying of buffered operations. +* GridFS buildMongoObject returns error on illegal md5 (NODE-157, https://github.com/iantocristian) +* Default GridFS chunk size changed to (255 * 1024) bytes to optimize for collections defaulting to power of 2 sizes on 2.6. +* Refactored commands to all go through command function ensuring consistent command execution. +* Fixed issues where readPreferences where not correctly passed to mongos. +* Catch error == null and make err detection more prominent (NODE-130) +* Allow reads from arbiter for single server connection (NODE-117) +* Handle error coming back with no documents (NODE-130) +* Correctly use close parameter in Gridstore.write() (NODE-125) +* Throw an error on a bulk find with no selector (NODE-129, https://github.com/vkarpov15) +* Use a shallow copy of options in find() (NODE-124, https://github.com/vkarpov15) +* Fix statistical strategy (NODE-158, https://github.com/vkarpov15) +* GridFS off-by-one bug in lastChunkNumber() causes uncaught throw and data loss (Issue #1154, https://github.com/vsivsi) +* GridStore drops passed `aliases` option, always results in `null` value in GridFS files (Issue #1152, https://github.com/vsivsi) +* Remove superfluous connect object copying in index.js (Issue #1145, https://github.com/thomseddon) +* Do not return false when the connection buffer is still empty (Issue #1143, https://github.com/eknkc) +* Check ReadPreference object on ReplSet.canRead (Issue #1142, https://github.com/eknkc) +* Fix unpack error on _executeQueryCommand (Issue #1141, https://github.com/eknkc) +* Close db on failed connect so node can exit (Issue #1128, https://github.com/benighted) +* Fix global leak with _write_concern (Issue #1126, https://github.com/shanejonas) + +1.3.19 2013-08-21 +----------------- +* Correctly rethrowing errors after change from event emission to callbacks, compatibility with 0.10.X domains without breaking 0.8.X support. +* Small fix to return the entire findAndModify result as the third parameter (Issue #1068) +* No removal of "close" event handlers on server reconnect, emits "reconnect" event when reconnection happens. Reconnect Only applies for single server connections as of now as semantics for ReplSet and Mongos is not clear (Issue #1056) + +1.3.18 2013-08-10 +----------------- +* Fixed issue when throwing exceptions in MongoClient.connect/Db.open (Issue #1057) +* Fixed an issue where _events is not cleaned up correctly causing a slow steady memory leak. + +1.3.17 2013-08-07 +----------------- +* Ignore return commands that have no registered callback +* Made collection.count not use the db.command function +* Fix throw exception on ping command (Issue #1055) + +1.3.16 2013-08-02 +----------------- +* Fixes connection issue where lots of connections would happen if a server is in recovery mode during connection (Issue #1050, NODE-50, NODE-51) +* Bug in unlink mulit filename (Issue #1054) + +1.3.15 2013-08-01 +----------------- +* Memory leak issue due to node Issue #4390 where _events[id] is set to undefined instead of deleted leading to leaks in the Event Emitter over time + +1.3.14 2013-08-01 +----------------- +* Fixed issue with checkKeys where it would error on X.X + +1.3.13 2013-07-31 +----------------- +* Added override for checkKeys on insert/update (Warning will expose you to injection attacks) (Issue #1046) +* BSON size checking now done pre serialization (Issue #1037) +* Added isConnected returns false when no connection Pool exists (Issue #1043) +* Unified command handling to ensure same handling (Issue #1041, #1042) +* Correctly emit "open" and "fullsetup" across all Db's associated with Mongos, ReplSet or Server (Issue #1040) +* Correctly handles bug in authentication when attempting to connect to a recovering node in a replicaset. +* Correctly remove recovering servers from available servers in replicaset. Piggybacks on the ping command. +* Removed findAndModify chaining to be compliant with behavior in other official drivers and to fix a known mongos issue. +* Fixed issue with Kerberos authentication on Windows for re-authentication. +* Fixed Mongos failover behavior to correctly throw out old servers. +* Ensure stored queries/write ops are executed correctly after connection timeout +* Added promoteLongs option for to allow for overriding the promotion of Longs to Numbers and return the actual Long. + +1.3.12 2013-07-19 +----------------- +* Fixed issue where timeouts sometimes would behave wrongly (Issue #1032) +* Fixed bug with callback third parameter on some commands (Issue #1033) +* Fixed possible issue where killcursor command might leave hanging functions +* Fixed issue where Mongos was not correctly removing dead servers from the pool of eligable servers +* Throw error if dbName or collection name contains null character (at command level and at collection level) +* Updated bson parser to 0.2.1 with security fix and non-promotion of Long values to javascript Numbers (once a long always a long) + +1.3.11 2013-07-04 +----------------- +* Fixed errors on geoNear and geoSearch (Issue #1024, https://github.com/ebensing) +* Add driver version to export (Issue #1021, https://github.com/aheckmann) +* Add text to readpreference obedient commands (Issue #1019) +* Drivers should check the query failure bit even on getmore response (Issue #1018) +* Map reduce has incorrect expectations of 'inline' value for 'out' option (Issue #1016, https://github.com/rcotter) +* Support SASL PLAIN authentication (Issue #1009) +* Ability to use different Service Name on the driver for Kerberos Authentication (Issue #1008) +* Remove unnecessary octal literal to allow the code to run in strict mode (Issue #1005, https://github.com/jamesallardice) +* Proper handling of recovering nodes (when they go into recovery and when they return from recovery, Issue #1027) + +1.3.10 2013-06-17 +----------------- +* Guard against possible undefined in server::canCheckoutWriter (Issue #992, https://github.com/willyaranda) +* Fixed some duplicate test names (Issue #993, https://github.com/kawanet) +* Introduced write and read concerns for GridFS (Issue #996) +* Fixed commands not correctly respecting Collection level read preference (Issue #995, #999) +* Fixed issue with pool size on replicaset connections (Issue #1000) +* Execute all query commands on master switch (Issue #1002, https://github.com/fogaztuc) + +1.3.9 2013-06-05 +---------------- +* Fixed memory leak when findAndModify errors out on w>1 and chained callbacks not properly cleaned up. + +1.3.8 2013-05-31 +---------------- +* Fixed issue with socket death on windows where it emits error event instead of close event (Issue #987) +* Emit authenticate event on db after authenticate method has finished on db instance (Issue #984) +* Allows creation of MongoClient and do new MongoClient().connect(..). Emits open event when connection correct allowing for apps to react on event. + +1.3.7 2013-05-29 +---------------- +* After reconnect, tailable getMores go on inconsistent connections (Issue #981, #982, https://github.com/glasser) +* Updated Bson to 0.1.9 to fix ARM support (Issue #985) + +1.3.6 2013-05-21 +---------------- +* Fixed issue where single server reconnect attempt would throw due to missing options variable (Issue #979) +* Fixed issue where difference in ismaster server name and seed list caused connections issues, (Issue #976) + +1.3.5 2013-05-14 +---------------- +* Fixed issue where HA for replicaset would pick the same broken connection when attempting to ping the replicaset causing the replicaset to never recover. + +1.3.4 2013-05-14 +---------------- +* Fixed bug where options not correctly passed in for uri parser (Issue #973, https://github.com/supershabam) +* Fixed bug when passing a named index hint (Issue #974) + +1.3.3 2013-05-09 +---------------- +* Fixed auto-reconnect issue with single server instance. + +1.3.2 2013-05-08 +---------------- +* Fixes for an issue where replicaset would be pronounced dead when high priority primary caused double elections. + +1.3.1 2013-05-06 +---------------- +* Fix for replicaset consisting of primary/secondary/arbiter with priority applied failing to reconnect properly +* Applied auth before server instance is set as connected when single server connection +* Throw error if array of documents passed to save method + +1.3.0 2013-04-25 +---------------- +* Whole High availability handling for Replicaset, Server and Mongos connections refactored to ensure better handling of failover cases. +* Fixed issue where findAndModify would not correctly skip issuing of chained getLastError (Issue #941) +* Fixed throw error issue on errors with findAndModify during write out operation (Issue #939, https://github.com/autopulated) +* Gridstore.prototype.writeFile now returns gridstore object correctly (Issue #938) +* Kerberos support is now an optional module that allows for use of GSSAPI authentication using MongoDB Subscriber edition +* Fixed issue where cursor.toArray could blow the stack on node 0.10.X (#950) + +1.2.14 2013-03-14 +----------------- +* Refactored test suite to speed up running of replicaset tests +* Fix of async error handling when error happens in callback (Issue #909, https://github.com/medikoo) +* Corrected a slaveOk setting issue (Issue #906, #905) +* Fixed HA issue where ping's would not go to correct server on HA server connection failure. +* Uses setImmediate if on 0.10 otherwise nextTick for cursor stream +* Fixed race condition in Cursor stream (NODE-31) +* Fixed issues related to node 0.10 and process.nextTick now correctly using setImmediate where needed on node 0.10 +* Added support for maxMessageSizeBytes if available (DRIVERS-1) +* Added support for authSource (2.4) to MongoClient URL and db.authenticate method (DRIVER-69/NODE-34) +* Fixed issue in GridStore seek and GridStore read to correctly work on multiple seeks (Issue #895) + +1.2.13 2013-02-22 +----------------- +* Allow strategy 'none' for repliaset if no strategy wanted (will default to round robin selection of servers on a set readPreference) +* Fixed missing MongoErrors on some cursor methods (Issue #882) +* Correctly returning a null for the db instance on MongoClient.connect when auth fails (Issue #890) +* Added dropTarget option support for renameCollection/rename (Issue #891, help from https://github.com/jbottigliero) +* Fixed issue where connection using MongoClient.connect would fail if first server did not exist (Issue #885) + +1.2.12 2013-02-13 +----------------- +* Added limit/skip options to Collection.count (Issue #870) +* Added applySkipLimit option to Cursor.count (Issue #870) +* Enabled ping strategy as default for Replicaset if none specified (Issue #876) +* Should correctly pick nearest server for SECONDARY/SECONDARY_PREFERRED/NEAREST (Issue #878) + +1.2.11 2013-01-29 +----------------- +* Added fixes for handling type 2 binary due to PHP driver (Issue #864) +* Moved callBackStore to Base class to have single unified store (Issue #866) +* Ping strategy now reuses sockets unless they are closed by the server to avoid overhead + +1.2.10 2013-01-25 +----------------- +* Merged in SSL support for 2.4 supporting certificate validation and presenting certificates to the server. +* Only open a new HA socket when previous one dead (Issue #859, #857) +* Minor fixes + +1.2.9 2013-01-15 +---------------- +* Fixed bug in SSL support for MongoClient/Db.connect when discovering servers (Issue #849) +* Connection string with no db specified should default to admin db (Issue #848) +* Support port passed as string to Server class (Issue #844) +* Removed noOpen support for MongoClient/Db.connect as auto discovery of servers for Mongod/Mongos makes it not possible (Issue #842) +* Included toError wrapper code moved to utils.js file (Issue #839, #840) +* Rewrote cursor handling to avoid process.nextTick using trampoline instead to avoid stack overflow, speedup about 40% + +1.2.8 2013-01-07 +---------------- +* Accept function in a Map Reduce scope object not only a function string (Issue #826, https://github.com/aheckmann) +* Typo in db.authenticate caused a check (for provided connection) to return false, causing a connection AND onAll=true to be passed into __executeQueryCommand downstream (Issue #831, https://github.com/m4tty) +* Allow gridfs objects to use non ObjectID ids (Issue #825, https://github.com/nailgun) +* Removed the double wrap, by not passing an Error object to the wrap function (Issue #832, https://github.com/m4tty) +* Fix connection leak (gh-827) for HA replicaset health checks (Issue #833, https://github.com/aheckmann) +* Modified findOne to use nextObject instead of toArray avoiding a nextTick operation (Issue #836) +* Fixes for cursor stream to avoid multiple getmore issues when one in progress (Issue #818) +* Fixes .open replaying all backed up commands correctly if called after operations performed, (Issue #829 and #823) + +1.2.7 2012-12-23 +---------------- +* Rolled back batches as they hang in certain situations +* Fixes for NODE-25, keep reading from secondaries when primary goes down + +1.2.6 2012-12-21 +---------------- +* domain sockets shouldn't require a port arg (Issue #815, https://github.com/aheckmann) +* Cannot read property 'info' of null (Issue #809, https://github.com/thesmart) +* Cursor.each should work in batches (Issue #804, https://github.com/Swatinem) +* Cursor readPreference bug for non-supported read preferences (Issue #817) + +1.2.5 2012-12-12 +---------------- +* Fixed ssl regression, added more test coverage (Issue #800) +* Added better error reporting to the Db.connect if no valid serverConfig setup found (Issue #798) + +1.2.4 2012-12-11 +---------------- +* Fix to ensure authentication is correctly applied across all secondaries when using MongoClient. + +1.2.3 2012-12-10 +---------------- +* Fix for new replicaset members correctly authenticating when being added (Issue #791, https://github.com/m4tty) +* Fixed seek issue in gridstore when using stream (Issue #790) + +1.2.2 2012-12-03 +---------------- +* Fix for journal write concern not correctly being passed under some circumstances. +* Fixed correct behavior and re-auth for servers that get stepped down (Issue #779). + +1.2.1 2012-11-30 +---------------- +* Fix for double callback on insert with w:0 specified (Issue #783) +* Small cleanup of urlparser. + +1.2.0 2012-11-27 +---------------- +* Honor connectTimeoutMS option for replicasets (Issue #750, https://github.com/aheckmann) +* Fix ping strategy regression (Issue #738, https://github.com/aheckmann) +* Small cleanup of code (Issue #753, https://github.com/sokra/node-mongodb-native) +* Fixed index declaration using objects/arrays from other contexts (Issue #755, https://github.com/sokra/node-mongodb-native) +* Intermittent (and rare) null callback exception when using ReplicaSets (Issue #752) +* Force correct setting of read_secondary based on the read preference (Issue #741) +* If using read preferences with secondaries queries will not fail if primary is down (Issue #744) +* noOpen connection for Db.connect removed as not compatible with autodetection of Mongo type +* Mongos connection with auth not working (Issue #737) +* Use the connect method directly from the require. require('mongodb')("mongodb://localhost:27017/db") +* new MongoClient introduced as the point of connecting to MongoDB's instead of the Db + * open/close/db/connect methods implemented +* Implemented common URL connection format using MongoClient.connect allowing for simialar interface across all drivers. +* Fixed a bug with aggregation helper not properly accepting readPreference + +1.1.11 2012-10-10 +----------------- +* Removed strict mode and introduced normal handling of safe at DB level. + +1.1.10 2012-10-08 +----------------- +* fix Admin.serverStatus (Issue #723, https://github.com/Contra) +* logging on connection open/close(Issue #721, https://github.com/asiletto) +* more fixes for windows bson install (Issue #724) + +1.1.9 2012-10-05 +---------------- +* Updated bson to 0.1.5 to fix build problem on sunos/windows. + +1.1.8 2012-10-01 +---------------- +* Fixed db.eval to correctly handle system.js global javascript functions (Issue #709) +* Cleanup of non-closing connections (Issue #706) +* More cleanup of connections under replicaset (Issue #707, https://github.com/elbert3) +* Set keepalive on as default, override if not needed +* Cleanup of jsbon install to correctly build without install.js script (https://github.com/shtylman) +* Added domain socket support new Server("/tmp/mongodb.sock") style + +1.1.7 2012-09-10 +---------------- +* Protect against starting PingStrategy being called more than once (Issue #694, https://github.com/aheckmann) +* Make PingStrategy interval configurable (was 1 second, relaxed to 5) (Issue #693, https://github.com/aheckmann) +* Made PingStrategy api more consistant, callback to start/stop methods are optional (Issue #693, https://github.com/aheckmann) +* Proper stopping of strategy on replicaset stop +* Throw error when gridstore file is not found in read mode (Issue #702, https://github.com/jbrumwell) +* Cursor stream resume now using nextTick to avoid duplicated records (Issue #696) + +1.1.6 2012-09-01 +---------------- +* Fix for readPreference NEAREST for replicasets (Issue #693, https://github.com/aheckmann) +* Emit end correctly on stream cursor (Issue #692, https://github.com/Raynos) + +1.1.5 2012-08-29 +---------------- +* Fix for eval on replicaset Issue #684 +* Use helpful error msg when native parser not compiled (Issue #685, https://github.com/aheckmann) +* Arbiter connect hotfix (Issue #681, https://github.com/fengmk2) +* Upgraded bson parser to 0.1.2 using gyp, deprecated support for node 0.4.X +* Added name parameter to createIndex/ensureIndex to be able to override index names larger than 128 bytes +* Added exhaust option for find for feature completion (not recommended for normal use) +* Added tailableRetryInterval to find for tailable cursors to allow to control getMore retry time interval +* Fixes for read preferences when using MongoS to correctly handle no read preference set when iterating over a cursor (Issue #686) + +1.1.4 2012-08-12 +---------------- +* Added Mongos connection type with a fallback list for mongos proxies, supports ha (on by default) and will attempt to reconnect to failed proxies. +* Documents can now have a toBSON method that lets the user control the serialization behavior for documents being saved. +* Gridstore instance object now works as a readstream or writestream (thanks to code from Aaron heckmann (https://github.com/aheckmann/gridfs-stream)). +* Fix gridfs readstream (Issue #607, https://github.com/tedeh). +* Added disableDriverBSONSizeCheck property to Server.js for people who wish to push the inserts to the limit (Issue #609). +* Fixed bug where collection.group keyf given as Code is processed as a regular object (Issue #608, https://github.com/rrusso2007). +* Case mismatch between driver's ObjectID and mongo's ObjectId, allow both (Issue #618). +* Cleanup map reduce (Issue #614, https://github.com/aheckmann). +* Add proper error handling to gridfs (Issue #615, https://github.com/aheckmann). +* Ensure cursor is using same connection for all operations to avoid potential jump of servers when using replicasets. +* Date identification handled correctly in bson js parser when running in vm context. +* Documentation updates +* GridStore filename not set on read (Issue #621) +* Optimizations on the C++ bson parser to fix a potential memory leak and avoid non-needed calls +* Added support for awaitdata for tailable cursors (Issue #624) +* Implementing read preference setting at collection and cursor level + * collection.find().setReadPreference(Server.SECONDARY_PREFERRED) + * db.collection("some", {readPreference:Server.SECONDARY}) +* Replicaset now returns when the master is discovered on db.open and lets the rest of the connections happen asynchronous. + * ReplSet/ReplSetServers emits "fullsetup" when all servers have been connected to +* Prevent callback from executing more than once in getMore function (Issue #631, https://github.com/shankar0306) +* Corrupt bson messages now errors out to all callbacks and closes up connections correctly, Issue #634 +* Replica set member status update when primary changes bug (Issue #635, https://github.com/alinsilvian) +* Fixed auth to work better when multiple connections are involved. +* Default connection pool size increased to 5 connections. +* Fixes for the ReadStream class to work properly with 0.8 of Node.js +* Added explain function support to aggregation helper +* Added socketTimeoutMS and connectTimeoutMS to socket options for repl_set.js and server.js +* Fixed addUser to correctly handle changes in 2.2 for getLastError authentication required +* Added index to gridstore chunks on file_id (Issue #649, https://github.com/jacobbubu) +* Fixed Always emit db events (Issue #657) +* Close event not correctly resets DB openCalled variable to allow reconnect +* Added open event on connection established for replicaset, mongos and server +* Much faster BSON C++ parser thanks to Lucasfilm Singapore. +* Refactoring of replicaset connection logic to simplify the code. +* Add `options.connectArbiter` to decide connect arbiters or not (Issue #675) +* Minor optimization for findAndModify when not using j,w or fsync for safe + +1.0.2 2012-05-15 +---------------- +* Reconnect functionality for replicaset fix for mongodb 2.0.5 + +1.0.1 2012-05-12 +---------------- +* Passing back getLastError object as 3rd parameter on findAndModify command. +* Fixed a bunch of performance regressions in objectId and cursor. +* Fixed issue #600 allowing for single document delete to be passed in remove command. + +1.0.0 2012-04-25 +---------------- +* Fixes to handling of failover on server error +* Only emits error messages if there are error listeners to avoid uncaught events +* Server.isConnected using the server state variable not the connection pool state + +0.9.9.8 2012-04-12 +------------------ +* _id=0 is being turned into an ObjectID (Issue #551) +* fix for error in GridStore write method (Issue #559) +* Fix for reading a GridStore from arbitrary, non-chunk aligned offsets, added test (Issue #563, https://github.com/subroutine) +* Modified limitRequest to allow negative limits to pass through to Mongo, added test (Issue #561) +* Corrupt GridFS files when chunkSize < fileSize, fixed concurrency issue (Issue #555) +* Handle dead tailable cursors (Issue #568, https://github.com/aheckmann) +* Connection pools handles closing themselves down and clearing the state +* Check bson size of documents against maxBsonSize and throw client error instead of server error, (Issue #553) +* Returning update status document at the end of the callback for updates, (Issue #569) +* Refactor use of Arguments object to gain performance (Issue #574, https://github.com/AaronAsAChimp) + +0.9.9.7 2012-03-16 +------------------ +* Stats not returned from map reduce with inline results (Issue #542) +* Re-enable testing of whether or not the callback is called in the multi-chunk seek, fix small GridStore bug (Issue #543, https://github.com/pgebheim) +* Streaming large files from GridFS causes truncation (Issue #540) +* Make callback type checks agnostic to V8 context boundaries (Issue #545) +* Correctly throw error if an attempt is made to execute an insert/update/remove/createIndex/ensureIndex with safe enabled and no callback +* Db.open throws if the application attemps to call open again without calling close first + +0.9.9.6 2012-03-12 +------------------ +* BSON parser is externalized in it's own repository, currently using git master +* Fixes for Replicaset connectivity issue (Issue #537) +* Fixed issues with node 0.4.X vs 0.6.X (Issue #534) +* Removed SimpleEmitter and replaced with standard EventEmitter +* GridStore.seek fails to change chunks and call callback when in read mode (Issue #532) + +0.9.9.5 2012-03-07 +------------------ +* Merged in replSetGetStatus helper to admin class (Issue #515, https://github.com/mojodna) +* Merged in serverStatus helper to admin class (Issue #516, https://github.com/mojodna) +* Fixed memory leak in C++ bson parser (Issue #526) +* Fix empty MongoError "message" property (Issue #530, https://github.com/aheckmann) +* Cannot save files with the same file name to GridFS (Issue #531) + +0.9.9.4 2012-02-26 +------------------ +* bugfix for findAndModify: Error: corrupt bson message < 5 bytes long (Issue #519) + +0.9.9.3 2012-02-23 +------------------ +* document: save callback arguments are both undefined, (Issue #518) +* Native BSON parser install error with npm, (Issue #517) + +0.9.9.2 2012-02-17 +------------------ +* Improved detection of Buffers using Buffer.isBuffer instead of instanceof. +* Added wrap error around db.dropDatabase to catch all errors (Issue #512) +* Added aggregate helper to collection, only for MongoDB >= 2.1 + +0.9.9.1 2012-02-15 +------------------ +* Better handling of safe when using some commands such as createIndex, ensureIndex, addUser, removeUser, createCollection. +* Mapreduce now throws error if out parameter is not specified. + +0.9.9 2012-02-13 +---------------- +* Added createFromTime method on ObjectID to allow for queries against _id more easily using the timestamp. +* Db.close(true) now makes connection unusable as it's been force closed by app. +* Fixed mapReduce and group functions to correctly send slaveOk on queries. +* Fixes for find method to correctly work with find(query, fields, callback) (Issue #506). +* A fix for connection error handling when using the SSL on MongoDB. + +0.9.8-7 2012-02-06 +------------------ +* Simplified findOne to use the find command instead of the custom code (Issue #498). +* BSON JS parser not also checks for _bsonType variable in case BSON object is in weird scope (Issue #495). + +0.9.8-6 2012-02-04 +------------------ +* Removed the check for replicaset change code as it will never work with node.js. + +0.9.8-5 2012-02-02 +------------------ +* Added geoNear command to Collection. +* Added geoHaystackSearch command to Collection. +* Added indexes command to collection to retrieve the indexes on a Collection. +* Added stats command to collection to retrieve the statistics on a Collection. +* Added listDatabases command to admin object to allow retrieval of all available dbs. +* Changed createCreateIndexCommand to work better with options. +* Fixed dereference method on Db class to correctly dereference Db reference objects. +* Moved connect object onto Db class(Db.connect) as well as keeping backward compatibility. +* Removed writeBuffer method from gridstore, write handles switching automatically now. +* Changed readBuffer to read on Gridstore, Gridstore now only supports Binary Buffers no Strings anymore. +* Moved Long class to bson directory. + +0.9.8-4 2012-01-28 +------------------ +* Added reIndex command to collection and db level. +* Added support for $returnKey, $maxScan, $min, $max, $showDiskLoc, $comment to cursor and find/findOne methods. +* Added dropDups and v option to createIndex and ensureIndex. +* Added isCapped method to Collection. +* Added indexExists method to Collection. +* Added findAndRemove method to Collection. +* Fixed bug for replicaset connection when no active servers in the set. +* Fixed bug for replicaset connections when errors occur during connection. +* Merged in patch for BSON Number handling from Lee Salzman, did some small fixes and added test coverage. + +0.9.8-3 2012-01-21 +------------------ +* Workaround for issue with Object.defineProperty (Issue #484) +* ObjectID generation with date does not set rest of fields to zero (Issue #482) + +0.9.8-2 2012-01-20 +------------------ +* Fixed a missing this in the ReplSetServers constructor. + +0.9.8-1 2012-01-17 +------------------ +* FindAndModify bug fix for duplicate errors (Issue #481) + +0.9.8 2012-01-17 +---------------- +* Replicasets now correctly adjusts to live changes in the replicaset configuration on the servers, reconnecting correctly. + * Set the interval for checking for changes setting the replicaSetCheckInterval property when creating the ReplSetServers instance or on db.serverConfig.replicaSetCheckInterval. (default 1000 miliseconds) +* Fixes formattedOrderClause in collection.js to accept a plain hash as a parameter (Issue #469) https://github.com/tedeh +* Removed duplicate code for formattedOrderClause and moved to utils module +* Pass in poolSize for ReplSetServers to set default poolSize for new replicaset members +* Bug fix for BSON JS deserializer. Isolating the eval functions in separate functions to avoid V8 deoptimizations +* Correct handling of illegal BSON messages during deserialization +* Fixed Infinite loop when reading GridFs file with no chunks (Issue #471) +* Correctly update existing user password when using addUser (Issue #470) + +0.9.7.3-5 2012-01-04 +-------------------- +* Fix for RegExp serialization for 0.4.X where typeof /regexp/ == 'function' vs in 0.6.X typeof /regexp/ == 'object' +* Don't allow keepAlive and setNoDelay for 0.4.X as it throws errors + +0.9.7.3-4 2012-01-04 +-------------------- +* Chased down potential memory leak on findAndModify, Issue #467 (node.js removeAllListeners leaves the key in the _events object, node.js bug on eventlistener?, leads to extremely slow memory leak on listener object) +* Sanity checks for GridFS performance with benchmark added + +0.9.7.3-3 2012-01-04 +-------------------- +* Bug fixes for performance issues going form 0.9.6.X to 0.9.7.X on linux +* BSON bug fixes for performance + +0.9.7.3-2 2012-01-02 +-------------------- +* Fixed up documentation to reflect the preferred way of instantiating bson types +* GC bug fix for JS bson parser to avoid stop-and-go GC collection + +0.9.7.3-1 2012-01-02 +-------------------- +* Fix to make db.bson_serializer and db.bson_deserializer work as it did previously + +0.9.7.3 2011-12-30 +-------------------- +* Moved BSON_BINARY_SUBTYPE_DEFAULT from BSON object to Binary object and removed the BSON_BINARY_ prefixes +* Removed Native BSON types, C++ parser uses JS types (faster due to cost of crossing the JS-C++ barrier for each call) +* Added build fix for 0.4.X branch of Node.js where GetOwnPropertyNames is not defined in v8 +* Fix for wire protocol parser for corner situation where the message is larger than the maximum socket buffer in node.js (Issue #464, #461, #447) +* Connection pool status set to connected on poolReady, isConnected returns false on anything but connected status (Issue #455) + +0.9.7.2-5 2011-12-22 +-------------------- +* Brand spanking new Streaming Cursor support Issue #458 (https://github.com/christkv/node-mongodb-native/pull/458) thanks to Mr Aaron Heckmann + +0.9.7.2-4 2011-12-21 +-------------------- +* Refactoring of callback code to work around performance regression on linux +* Fixed group function to correctly use the command mode as default + +0.9.7.2-3 2011-12-18 +-------------------- +* Fixed error handling for findAndModify while still working for mongodb 1.8.6 (Issue #450). +* Allow for force send query to primary, pass option (read:'primary') on find command. + * ``find({a:1}, {read:'primary'}).toArray(function(err, items) {});`` + +0.9.7.2-2 2011-12-16 +-------------------- +* Fixes infinite streamRecords QueryFailure fix when using Mongos (Issue #442) + +0.9.7.2-1 2011-12-16 +-------------------- +* ~10% perf improvement for ObjectId#toHexString (Issue #448, https://github.com/aheckmann) +* Only using process.nextTick on errors emitted on callbacks not on all parsing, reduces number of ticks in the driver +* Changed parsing off bson messages to use process.nextTick to do bson parsing in batches if the message is over 10K as to yield more time to the event look increasing concurrency on big mongoreply messages with multiple documents + +0.9.7.2 2011-12-15 +------------------ +* Added SSL support for future version of mongodb (VERY VERY EXPERIMENTAL) + * pass in the ssl:true option to the server or replicaset server config to enable + * a bug either in mongodb or node.js does not allow for more than 1 connection pr db instance (poolSize:1). +* Added getTimestamp() method to objectID that returns a date object +* Added finalize function to collection.group + * function group (keys, condition, initial, reduce, finalize, command, callback) +* Reaper no longer using setTimeout to handle reaping. Triggering is done in the general flow leading to predictable behavior. + * reaperInterval, set interval for reaper (default 10000 miliseconds) + * reaperTimeout, set timeout for calls (default 30000 miliseconds) + * reaper, enable/disable reaper (default false) +* Work around for issues with findAndModify during high concurrency load, insure that the behavior is the same across the 1.8.X branch and 2.X branch of MongoDb +* Reworked multiple db's sharing same connection pool to behave correctly on error, timeout and close +* EnsureIndex command can be executed without a callback (Issue #438) +* Eval function no accepts options including nolock (Issue #432) + * eval(code, parameters, options, callback) (where options = {nolock:true}) + +0.9.7.1-4 2011-11-27 +-------------------- +* Replaced install.sh with install.js to install correctly on all supported os's + +0.9.7.1-3 2011-11-27 +-------------------- +* Fixes incorrect scope for ensureIndex error wrapping (Issue #419) https://github.com/ritch + +0.9.7.1-2 2011-11-27 +-------------------- +* Set statistical selection strategy as default for secondary choice. + +0.9.7.1-1 2011-11-27 +-------------------- +* Better handling of single server reconnect (fixes some bugs) +* Better test coverage of single server failure +* Correct handling of callbacks on replicaset servers when firewall dropping packets, correct reconnect + +0.9.7.1 2011-11-24 +------------------ +* Better handling of dead server for single server instances +* FindOne and find treats selector == null as {}, Issue #403 +* Possible to pass in a strategy for the replicaset to pick secondary reader node + * parameter strategy + * ping (default), pings the servers and picks the one with the lowest ping time + * statistical, measures each request and pick the one with the lowest mean and std deviation +* Set replicaset read preference replicaset.setReadPreference() + * Server.READ_PRIMARY (use primary server for reads) + * Server.READ_SECONDARY (from a secondary server (uses the strategy set)) + * tags, {object of tags} +* Added replay of commands issued to a closed connection when the connection is re-established +* Fix isConnected and close on unopened connections. Issue #409, fix by (https://github.com/sethml) +* Moved reaper to db.open instead of constructor (Issue #406) +* Allows passing through of socket connection settings to Server or ReplSetServer under the option socketOptions + * timeout = set seconds before connection times out (default 0) + * noDelay = Disables the Nagle algorithm (default true) + * keepAlive = Set if keepAlive is used (default 0, which means no keepAlive, set higher than 0 for keepAlive) + * encoding = ['ascii', 'utf8', or 'base64'] (default null) +* Fixes for handling of errors during shutdown off a socket connection +* Correctly applies socket options including timeout +* Cleanup of test management code to close connections correctly +* Handle parser errors better, closing down the connection and emitting an error +* Correctly emit errors from server.js only wrapping errors that are strings + +0.9.7 2011-11-10 +---------------- +* Added priority setting to replicaset manager +* Added correct handling of passive servers in replicaset +* Reworked socket code for simpler clearer handling +* Correct handling of connections in test helpers +* Added control of retries on failure + * control with parameters retryMiliSeconds and numberOfRetries when creating a db instance +* Added reaper that will timeout and cleanup queries that never return + * control with parameters reaperInterval and reaperTimeout when creating a db instance +* Refactored test helper classes for replicaset tests +* Allows raw (no bson parser mode for insert, update, remove, find and findOne) + * control raw mode passing in option raw:true on the commands + * will return buffers with the binary bson objects +* Fixed memory leak in cursor.toArray +* Fixed bug in command creation for mongodb server with wrong scope of call +* Added db(dbName) method to db.js to allow for reuse of connections against other databases +* Serialization of functions in an object is off by default, override with parameter + * serializeFunctions [true/false] on db level, collection level or individual insert/update/findAndModify +* Added Long.fromString to c++ class and fixed minor bug in the code (Test case for $gt operator on 64-bit integers, Issue #394) +* FindOne and find now share same code execution and will work in the same manner, Issue #399 +* Fix for tailable cursors, Issue #384 +* Fix for Cursor rewind broken, Issue #389 +* Allow Gridstore.exist to query using regexp, Issue #387, fix by (https://github.com/kaij) +* Updated documentation on https://github.com/christkv/node-mongodb-native +* Fixed toJSON methods across all objects for BSON, Binary return Base64 Encoded data + +0.9.6-22 2011-10-15 +------------------- +* Fixed bug in js bson parser that could cause wrong object size on serialization, Issue #370 +* Fixed bug in findAndModify that did not throw error on replicaset timeout, Issue #373 + +0.9.6-21 2011-10-05 +------------------- +* Reworked reconnect code to work correctly +* Handling errors in different parts of the code to ensure that it does not lock the connection +* Consistent error handling for Object.createFromHexString for JS and C++ + +0.9.6-20 2011-10-04 +------------------- +* Reworked bson.js parser to get rid off Array.shift() due to it allocating new memory for each call. Speedup varies between 5-15% depending on doc +* Reworked bson.cc to throw error when trying to serialize js bson types +* Added MinKey, MaxKey and Double support for JS and C++ parser +* Reworked socket handling code to emit errors on unparsable messages +* Added logger option for Db class, lets you pass in a function in the shape + { + log : function(message, object) {}, + error : function(errorMessage, errorObject) {}, + debug : function(debugMessage, object) {}, + } + + Usage is new Db(new Server(..), {logger: loggerInstance}) + +0.9.6-19 2011-09-29 +------------------- +* Fixing compatibility issues between C++ bson parser and js parser +* Added Symbol support to C++ parser +* Fixed socket handling bug for seldom misaligned message from mongodb +* Correctly handles serialization of functions using the C++ bson parser + +0.9.6-18 2011-09-22 +------------------- +* Fixed bug in waitForConnection that would lead to 100% cpu usage, Issue #352 + +0.9.6-17 2011-09-21 +------------------- +* Fixed broken exception test causing bamboo to hang +* Handling correctly command+lastError when both return results as in findAndModify, Issue #351 + +0.9.6-16 2011-09-14 +------------------- +* Fixing a bunch of issues with compatibility with MongoDB 2.0.X branch. Some fairly big changes in behavior from 1.8.X to 2.0.X on the server. +* Error Connection MongoDB V2.0.0 with Auth=true, Issue #348 + +0.9.6-15 2011-09-09 +------------------- +* Fixed issue where pools would not be correctly cleaned up after an error, Issue #345 +* Fixed authentication issue with secondary servers in Replicaset, Issue #334 +* Duplicate replica-set servers when omitting port, Issue #341 +* Fixing findAndModify to correctly work with Replicasets ensuring proper error handling, Issue #336 +* Merged in code from (https://github.com/aheckmann) that checks for global variable leaks + +0.9.6-14 2011-09-05 +------------------- +* Minor fixes for error handling in cursor streaming (https://github.com/sethml), Issue #332 +* Minor doc fixes +* Some more cursor sort tests added, Issue #333 +* Fixes to work with 0.5.X branch +* Fix Db not removing reconnect listener from serverConfig, (https://github.com/sbrekken), Issue #337 +* Removed node_events.h includes (https://github.com/jannehietamaki), Issue #339 +* Implement correct safe/strict mode for findAndModify. + +0.9.6-13 2011-08-24 +------------------- +* Db names correctly error checked for illegal characters + +0.9.6-12 2011-08-24 +------------------- +* Nasty bug in GridFS if you changed the default chunk size +* Fixed error handling bug in findOne + +0.9.6-11 2011-08-23 +------------------- +* Timeout option not correctly making it to the cursor, Issue #320, Fix from (https://github.com/year2013) +* Fixes for memory leaks when using buffers and C++ parser +* Fixes to make tests pass on 0.5.X +* Cleanup of bson.js to remove duplicated code paths +* Fix for errors occurring in ensureIndex, Issue #326 +* Removing require.paths to make tests work with the 0.5.X branch + +0.9.6-10 2011-08-11 +------------------- +* Specific type Double for capped collections (https://github.com/mbostock), Issue #312 +* Decorating Errors with all all object info from Mongo (https://github.com/laurie71), Issue #308 +* Implementing fixes for mongodb 1.9.1 and higher to make tests pass +* Admin validateCollection now takes an options argument for you to pass in full option +* Implemented keepGoing parameter for mongodb 1.9.1 or higher, Issue #310 +* Added test for read_secondary count issue, merged in fix from (https://github.com/year2013), Issue #317 + +0.9.6-9 +------- +* Bug fix for bson parsing the key '':'' correctly without crashing + +0.9.6-8 +------- +* Changed to using node.js crypto library MD5 digest +* Connect method support documented mongodb: syntax by (https://github.com/sethml) +* Support Symbol type for BSON, serializes to it's own type Symbol, Issue #302, #288 +* Code object without scope serializing to correct BSON type +* Lot's of fixes to avoid double callbacks (https://github.com/aheckmann) Issue #304 +* Long deserializes as Number for values in the range -2^53 to 2^53, Issue #305 (https://github.com/sethml) +* Fixed C++ parser to reflect JS parser handling of long deserialization +* Bson small optimizations + +0.9.6-7 2011-07-13 +------------------ +* JS Bson deserialization bug #287 + +0.9.6-6 2011-07-12 +------------------ +* FindAndModify not returning error message as other methods Issue #277 +* Added test coverage for $push, $pushAll and $inc atomic operations +* Correct Error handling for non 12/24 bit ids on Pure JS ObjectID class Issue #276 +* Fixed terrible deserialization bug in js bson code #285 +* Fix by andrewjstone to avoid throwing errors when this.primary not defined + +0.9.6-5 2011-07-06 +------------------ +* Rewritten BSON js parser now faster than the C parser on my core2duo laptop +* Added option full to indexInformation to get all index info Issue #265 +* Passing in ObjectID for new Gridstore works correctly Issue #272 + +0.9.6-4 2011-07-01 +------------------ +* Added test and bug fix for insert/update/remove without callback supplied + +0.9.6-3 2011-07-01 +------------------ +* Added simple grid class called Grid with put, get, delete methods +* Fixed writeBuffer/readBuffer methods on GridStore so they work correctly +* Automatic handling of buffers when using write method on GridStore +* GridStore now accepts a ObjectID instead of file name for write and read methods +* GridStore.list accepts id option to return of file ids instead of filenames +* GridStore close method returns document for the file allowing user to reference _id field + +0.9.6-2 2011-06-30 +------------------ +* Fixes for reconnect logic for server object (replays auth correctly) +* More testcases for auth +* Fixes in error handling for replicaset +* Fixed bug with safe parameter that would fail to execute safe when passing w or wtimeout +* Fixed slaveOk bug for findOne method +* Implemented auth support for replicaset and test cases +* Fixed error when not passing in rs_name + +0.9.6-1 2011-06-25 +------------------ +* Fixes for test to run properly using c++ bson parser +* Fixes for dbref in native parser (correctly handles ref without db component) +* Connection fixes for replicasets to avoid runtime conditions in cygwin (https://github.com/vincentcr) +* Fixes for timestamp in js bson parser (distinct timestamp type now) + +0.9.6 2011-06-21 +---------------- +* Worked around npm version handling bug +* Race condition fix for cygwin (https://github.com/vincentcr) + +0.9.5-1 2011-06-21 +------------------ +* Extracted Timestamp as separate class for bson js parser to avoid instanceof problems +* Fixed driver strict mode issue + +0.9.5 2011-06-20 +---------------- +* Replicaset support (failover and reading from secondary servers) +* Removed ServerPair and ServerCluster +* Added connection pool functionality +* Fixed serious bug in C++ bson parser where bytes > 127 would generate 2 byte sequences +* Allows for forcing the server to assign ObjectID's using the option {forceServerObjectId: true} + +0.6.8 +----- +* Removed multiple message concept from bson +* Changed db.open(db) to be db.open(err, db) + +0.1 2010-01-30 +-------------- +* Initial release support of driver using native node.js interface +* Supports gridfs specification +* Supports admin functionality diff --git a/node_modules/mongodb/LICENSE.md b/node_modules/mongodb/LICENSE.md new file mode 100644 index 00000000..ad410e11 --- /dev/null +++ b/node_modules/mongodb/LICENSE.md @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/node_modules/mongodb/README.md b/node_modules/mongodb/README.md new file mode 100644 index 00000000..0be770ac --- /dev/null +++ b/node_modules/mongodb/README.md @@ -0,0 +1,497 @@ +[![npm](https://nodei.co/npm/mongodb.png?downloads=true&downloadRank=true)](https://nodei.co/npm/mongodb/) [![npm](https://nodei.co/npm-dl/mongodb.png?months=6&height=3)](https://nodei.co/npm/mongodb/) + +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mongodb/node-mongodb-native?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +# Description + +The official [MongoDB](https://www.mongodb.com/) driver for Node.js. Provides a high-level API on top of [mongodb-core](https://www.npmjs.com/package/mongodb-core) that is meant for end users. + +**NOTE: v3.x was recently released with breaking API changes. You can find a list of changes [here](CHANGES_3.0.0.md).** + +## MongoDB Node.JS Driver + +| what | where | +|---------------|------------------------------------------------| +| documentation | http://mongodb.github.io/node-mongodb-native | +| api-doc | http://mongodb.github.io/node-mongodb-native/3.6/api | +| source | https://github.com/mongodb/node-mongodb-native | +| mongodb | http://www.mongodb.org | + +### Bugs / Feature Requests + +Think you’ve found a bug? Want to see a new feature in `node-mongodb-native`? Please open a +case in our issue management tool, JIRA: + +- Create an account and login [jira.mongodb.org](https://jira.mongodb.org). +- Navigate to the NODE project [jira.mongodb.org/browse/NODE](https://jira.mongodb.org/browse/NODE). +- Click **Create Issue** - Please provide as much information as possible about the issue type and how to reproduce it. + +Bug reports in JIRA for all driver projects (i.e. NODE, PYTHON, CSHARP, JAVA) and the +Core Server (i.e. SERVER) project are **public**. + +### Support / Feedback + +For issues with, questions about, or feedback for the Node.js driver, please look into our [support channels](https://docs.mongodb.com/manual/support). Please do not email any of the driver developers directly with issues or questions - you're more likely to get an answer on the [MongoDB Community Forums](https://community.mongodb.com/tags/c/drivers-odms-connectors/7/node-js-driver). + +### Change Log + +Change history can be found in [`HISTORY.md`](HISTORY.md). + +### Compatibility + +For version compatibility matrices, please refer to the following links: + + * [MongoDB](https://docs.mongodb.com/ecosystem/drivers/driver-compatibility-reference/#reference-compatibility-mongodb-node) + * [NodeJS](https://docs.mongodb.com/ecosystem/drivers/driver-compatibility-reference/#reference-compatibility-language-node) + +# Installation + +The recommended way to get started using the Node.js 3.0 driver is by using the `npm` (Node Package Manager) to install the dependency in your project. + +## MongoDB Driver + +Given that you have created your own project using `npm init` we install the MongoDB driver and its dependencies by executing the following `npm` command. + +```bash +npm install mongodb --save +``` + +This will download the MongoDB driver and add a dependency entry in your `package.json` file. + +You can also use the [Yarn](https://yarnpkg.com/en) package manager. + +## Troubleshooting + +The MongoDB driver depends on several other packages. These are: + +* [mongodb-core](https://github.com/mongodb-js/mongodb-core) +* [bson](https://github.com/mongodb/js-bson) +* [kerberos](https://github.com/mongodb-js/kerberos) +* [node-gyp](https://github.com/nodejs/node-gyp) + +The `kerberos` package is a C++ extension that requires a build environment to be installed on your system. You must be able to build Node.js itself in order to compile and install the `kerberos` module. Furthermore, the `kerberos` module requires the MIT Kerberos package to correctly compile on UNIX operating systems. Consult your UNIX operation system package manager for what libraries to install. + +**Windows already contains the SSPI API used for Kerberos authentication. However, you will need to install a full compiler tool chain using Visual Studio C++ to correctly install the Kerberos extension.** + +### Diagnosing on UNIX + +If you don’t have the build-essentials, this module won’t build. In the case of Linux, you will need gcc, g++, Node.js with all the headers and Python. The easiest way to figure out what’s missing is by trying to build the Kerberos project. You can do this by performing the following steps. + +```bash +git clone https://github.com/mongodb-js/kerberos +cd kerberos +npm install +``` + +If all the steps complete, you have the right toolchain installed. If you get the error "node-gyp not found," you need to install `node-gyp` globally: + +```bash +npm install -g node-gyp +``` + +If it correctly compiles and runs the tests you are golden. We can now try to install the `mongod` driver by performing the following command. + +```bash +cd yourproject +npm install mongodb --save +``` + +If it still fails the next step is to examine the npm log. Rerun the command but in this case in verbose mode. + +```bash +npm --loglevel verbose install mongodb +``` + +This will print out all the steps npm is performing while trying to install the module. + +### Diagnosing on Windows + +A compiler tool chain known to work for compiling `kerberos` on Windows is the following. + +* Visual Studio C++ 2010 (do not use higher versions) +* Windows 7 64bit SDK +* Python 2.7 or higher + +Open the Visual Studio command prompt. Ensure `node.exe` is in your path and install `node-gyp`. + +```bash +npm install -g node-gyp +``` + +Next, you will have to build the project manually to test it. Clone the repo, install dependencies and rebuild: + +```bash +git clone https://github.com/christkv/kerberos.git +cd kerberos +npm install +node-gyp rebuild +``` + +This should rebuild the driver successfully if you have everything set up correctly. + +### Other possible issues + +Your Python installation might be hosed making gyp break. Test your deployment environment first by trying to build Node.js itself on the server in question, as this should unearth any issues with broken packages (and there are a lot of broken packages out there). + +Another tip is to ensure your user has write permission to wherever the Node.js modules are being installed. + +## Quick Start + +This guide will show you how to set up a simple application using Node.js and MongoDB. Its scope is only how to set up the driver and perform the simple CRUD operations. For more in-depth coverage, see the [tutorials](docs/reference/content/tutorials/main.md). + +### Create the `package.json` file + +First, create a directory where your application will live. + +```bash +mkdir myproject +cd myproject +``` + +Enter the following command and answer the questions to create the initial structure for your new project: + +```bash +npm init +``` + +Next, install the driver dependency. + +```bash +npm install mongodb --save +``` + +You should see **NPM** download a lot of files. Once it's done you'll find all the downloaded packages under the **node_modules** directory. + +### Start a MongoDB Server + +For complete MongoDB installation instructions, see [the manual](https://docs.mongodb.org/manual/installation/). + +1. Download the right MongoDB version from [MongoDB](https://www.mongodb.org/downloads) +2. Create a database directory (in this case under **/data**). +3. Install and start a ``mongod`` process. + +```bash +mongod --dbpath=/data +``` + +You should see the **mongod** process start up and print some status information. + +### Connect to MongoDB + +Create a new **app.js** file and add the following code to try out some basic CRUD +operations using the MongoDB driver. + +Add code to connect to the server and the database **myproject**: + +```js +const MongoClient = require('mongodb').MongoClient; +const assert = require('assert'); + +// Connection URL +const url = 'mongodb://localhost:27017'; + +// Database Name +const dbName = 'myproject'; + +// Use connect method to connect to the server +MongoClient.connect(url, function(err, client) { + assert.equal(null, err); + console.log("Connected successfully to server"); + + const db = client.db(dbName); + + client.close(); +}); +``` + +Run your app from the command line with: + +```bash +node app.js +``` + +The application should print **Connected successfully to server** to the console. + +### Insert a Document + +Add to **app.js** the following function which uses the **insertMany** +method to add three documents to the **documents** collection. + +```js +const insertDocuments = function(db, callback) { + // Get the documents collection + const collection = db.collection('documents'); + // Insert some documents + collection.insertMany([ + {a : 1}, {a : 2}, {a : 3} + ], function(err, result) { + assert.equal(err, null); + assert.equal(3, result.result.n); + assert.equal(3, result.ops.length); + console.log("Inserted 3 documents into the collection"); + callback(result); + }); +} +``` + +The **insert** command returns an object with the following fields: + +* **result** Contains the result document from MongoDB +* **ops** Contains the documents inserted with added **_id** fields +* **connection** Contains the connection used to perform the insert + +Add the following code to call the **insertDocuments** function: + +```js +const MongoClient = require('mongodb').MongoClient; +const assert = require('assert'); + +// Connection URL +const url = 'mongodb://localhost:27017'; + +// Database Name +const dbName = 'myproject'; + +// Use connect method to connect to the server +MongoClient.connect(url, function(err, client) { + assert.equal(null, err); + console.log("Connected successfully to server"); + + const db = client.db(dbName); + + insertDocuments(db, function() { + client.close(); + }); +}); +``` + +Run the updated **app.js** file: + +```bash +node app.js +``` + +The operation returns the following output: + +```bash +Connected successfully to server +Inserted 3 documents into the collection +``` + +### Find All Documents + +Add a query that returns all the documents. + +```js +const findDocuments = function(db, callback) { + // Get the documents collection + const collection = db.collection('documents'); + // Find some documents + collection.find({}).toArray(function(err, docs) { + assert.equal(err, null); + console.log("Found the following records"); + console.log(docs) + callback(docs); + }); +} +``` + +This query returns all the documents in the **documents** collection. Add the **findDocument** method to the **MongoClient.connect** callback: + +```js +const MongoClient = require('mongodb').MongoClient; +const assert = require('assert'); + +// Connection URL +const url = 'mongodb://localhost:27017'; + +// Database Name +const dbName = 'myproject'; + +// Use connect method to connect to the server +MongoClient.connect(url, function(err, client) { + assert.equal(null, err); + console.log("Connected correctly to server"); + + const db = client.db(dbName); + + insertDocuments(db, function() { + findDocuments(db, function() { + client.close(); + }); + }); +}); +``` + +### Find Documents with a Query Filter + +Add a query filter to find only documents which meet the query criteria. + +```js +const findDocuments = function(db, callback) { + // Get the documents collection + const collection = db.collection('documents'); + // Find some documents + collection.find({'a': 3}).toArray(function(err, docs) { + assert.equal(err, null); + console.log("Found the following records"); + console.log(docs); + callback(docs); + }); +} +``` + +Only the documents which match ``'a' : 3`` should be returned. + +### Update a document + +The following operation updates a document in the **documents** collection. + +```js +const updateDocument = function(db, callback) { + // Get the documents collection + const collection = db.collection('documents'); + // Update document where a is 2, set b equal to 1 + collection.updateOne({ a : 2 } + , { $set: { b : 1 } }, function(err, result) { + assert.equal(err, null); + assert.equal(1, result.result.n); + console.log("Updated the document with the field a equal to 2"); + callback(result); + }); +} +``` + +The method updates the first document where the field **a** is equal to **2** by adding a new field **b** to the document set to **1**. Next, update the callback function from **MongoClient.connect** to include the update method. + +```js +const MongoClient = require('mongodb').MongoClient; +const assert = require('assert'); + +// Connection URL +const url = 'mongodb://localhost:27017'; + +// Database Name +const dbName = 'myproject'; + +// Use connect method to connect to the server +MongoClient.connect(url, function(err, client) { + assert.equal(null, err); + console.log("Connected successfully to server"); + + const db = client.db(dbName); + + insertDocuments(db, function() { + updateDocument(db, function() { + client.close(); + }); + }); +}); +``` + +### Remove a document + +Remove the document where the field **a** is equal to **3**. + +```js +const removeDocument = function(db, callback) { + // Get the documents collection + const collection = db.collection('documents'); + // Delete document where a is 3 + collection.deleteOne({ a : 3 }, function(err, result) { + assert.equal(err, null); + assert.equal(1, result.result.n); + console.log("Removed the document with the field a equal to 3"); + callback(result); + }); +} +``` + +Add the new method to the **MongoClient.connect** callback function. + +```js +const MongoClient = require('mongodb').MongoClient; +const assert = require('assert'); + +// Connection URL +const url = 'mongodb://localhost:27017'; + +// Database Name +const dbName = 'myproject'; + +// Use connect method to connect to the server +MongoClient.connect(url, function(err, client) { + assert.equal(null, err); + console.log("Connected successfully to server"); + + const db = client.db(dbName); + + insertDocuments(db, function() { + updateDocument(db, function() { + removeDocument(db, function() { + client.close(); + }); + }); + }); +}); +``` + +### Index a Collection + +[Indexes](https://docs.mongodb.org/manual/indexes/) can improve your application's +performance. The following function creates an index on the **a** field in the +**documents** collection. + +```js +const indexCollection = function(db, callback) { + db.collection('documents').createIndex( + { "a": 1 }, + null, + function(err, results) { + console.log(results); + callback(); + } + ); +}; +``` + +Add the ``indexCollection`` method to your app: + +```js +const MongoClient = require('mongodb').MongoClient; +const assert = require('assert'); + +// Connection URL +const url = 'mongodb://localhost:27017'; + +const dbName = 'myproject'; + +// Use connect method to connect to the server +MongoClient.connect(url, function(err, client) { + assert.equal(null, err); + console.log("Connected successfully to server"); + + const db = client.db(dbName); + + insertDocuments(db, function() { + indexCollection(db, function() { + client.close(); + }); + }); +}); +``` + +For more detailed information, see the [tutorials](docs/reference/content/tutorials/main.md). + +## Next Steps + + * [MongoDB Documentation](http://mongodb.org) + * [Read about Schemas](http://learnmongodbthehardway.com) + * [Star us on GitHub](https://github.com/mongodb/node-mongodb-native) + +## License + +[Apache 2.0](LICENSE.md) + +© 2009-2012 Christian Amor Kvalheim +© 2012-present MongoDB [Contributors](CONTRIBUTORS.md) diff --git a/node_modules/mongodb/index.js b/node_modules/mongodb/index.js new file mode 100644 index 00000000..4e9e6359 --- /dev/null +++ b/node_modules/mongodb/index.js @@ -0,0 +1,73 @@ +'use strict'; + +// Core module +const core = require('./lib/core'); +const Instrumentation = require('./lib/apm'); + +// Set up the connect function +const connect = require('./lib/mongo_client').connect; + +// Expose error class +connect.MongoError = core.MongoError; +connect.MongoNetworkError = core.MongoNetworkError; +connect.MongoTimeoutError = core.MongoTimeoutError; +connect.MongoServerSelectionError = core.MongoServerSelectionError; +connect.MongoParseError = core.MongoParseError; +connect.MongoWriteConcernError = core.MongoWriteConcernError; +connect.MongoBulkWriteError = require('./lib/bulk/common').BulkWriteError; +connect.BulkWriteError = connect.MongoBulkWriteError; + +// Actual driver classes exported +connect.Admin = require('./lib/admin'); +connect.MongoClient = require('./lib/mongo_client'); +connect.Db = require('./lib/db'); +connect.Collection = require('./lib/collection'); +connect.Server = require('./lib/topologies/server'); +connect.ReplSet = require('./lib/topologies/replset'); +connect.Mongos = require('./lib/topologies/mongos'); +connect.ReadPreference = core.ReadPreference; +connect.GridStore = require('./lib/gridfs/grid_store'); +connect.Chunk = require('./lib/gridfs/chunk'); +connect.Logger = core.Logger; +connect.AggregationCursor = require('./lib/aggregation_cursor'); +connect.CommandCursor = require('./lib/command_cursor'); +connect.Cursor = require('./lib/cursor'); +connect.GridFSBucket = require('./lib/gridfs-stream'); +// Exported to be used in tests not to be used anywhere else +connect.CoreServer = core.Server; +connect.CoreConnection = core.Connection; + +// BSON types exported +connect.Binary = core.BSON.Binary; +connect.Code = core.BSON.Code; +connect.Map = core.BSON.Map; +connect.DBRef = core.BSON.DBRef; +connect.Double = core.BSON.Double; +connect.Int32 = core.BSON.Int32; +connect.Long = core.BSON.Long; +connect.MinKey = core.BSON.MinKey; +connect.MaxKey = core.BSON.MaxKey; +connect.ObjectID = core.BSON.ObjectID; +connect.ObjectId = core.BSON.ObjectID; +connect.Symbol = core.BSON.Symbol; +connect.Timestamp = core.BSON.Timestamp; +connect.BSONRegExp = core.BSON.BSONRegExp; +connect.Decimal128 = core.BSON.Decimal128; + +// Add connect method +connect.connect = connect; + +// Set up the instrumentation method +connect.instrument = function(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + const instrumentation = new Instrumentation(); + instrumentation.instrument(connect.MongoClient, callback); + return instrumentation; +}; + +// Set our exports to be the connect function +module.exports = connect; diff --git a/node_modules/mongodb/lib/admin.js b/node_modules/mongodb/lib/admin.js new file mode 100644 index 00000000..3c8164f9 --- /dev/null +++ b/node_modules/mongodb/lib/admin.js @@ -0,0 +1,296 @@ +'use strict'; + +const applyWriteConcern = require('./utils').applyWriteConcern; + +const AddUserOperation = require('./operations/add_user'); +const ExecuteDbAdminCommandOperation = require('./operations/execute_db_admin_command'); +const RemoveUserOperation = require('./operations/remove_user'); +const ValidateCollectionOperation = require('./operations/validate_collection'); +const ListDatabasesOperation = require('./operations/list_databases'); + +const executeOperation = require('./operations/execute_operation'); + +/** + * @fileOverview The **Admin** class is an internal class that allows convenient access to + * the admin functionality and commands for MongoDB. + * + * **ADMIN Cannot directly be instantiated** + * @example + * const MongoClient = require('mongodb').MongoClient; + * const test = require('assert'); + * // Connection url + * const url = 'mongodb://localhost:27017'; + * // Database Name + * const dbName = 'test'; + * + * // Connect using MongoClient + * MongoClient.connect(url, function(err, client) { + * // Use the admin database for the operation + * const adminDb = client.db(dbName).admin(); + * + * // List all the available databases + * adminDb.listDatabases(function(err, dbs) { + * test.equal(null, err); + * test.ok(dbs.databases.length > 0); + * client.close(); + * }); + * }); + */ + +/** + * Create a new Admin instance (INTERNAL TYPE, do not instantiate directly) + * @class + * @return {Admin} a collection instance. + */ +function Admin(db, topology, promiseLibrary) { + if (!(this instanceof Admin)) return new Admin(db, topology); + + // Internal state + this.s = { + db: db, + topology: topology, + promiseLibrary: promiseLibrary + }; +} + +/** + * The callback format for results + * @callback Admin~resultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {object} result The result object if the command was executed successfully. + */ + +/** + * Execute a command + * @method + * @param {object} command The command hash + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {number} [options.maxTimeMS] Number of milliseconds to wait before aborting the query. + * @param {Admin~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Admin.prototype.command = function(command, options, callback) { + const args = Array.prototype.slice.call(arguments, 1); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + options = args.length ? args.shift() : {}; + + const commandOperation = new ExecuteDbAdminCommandOperation(this.s.db, command, options); + + return executeOperation(this.s.db.s.topology, commandOperation, callback); +}; + +/** + * Retrieve the server information for the current + * instance of the db client + * + * @param {Object} [options] optional parameters for this operation + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Admin~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Admin.prototype.buildInfo = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const cmd = { buildinfo: 1 }; + + const buildInfoOperation = new ExecuteDbAdminCommandOperation(this.s.db, cmd, options); + + return executeOperation(this.s.db.s.topology, buildInfoOperation, callback); +}; + +/** + * Retrieve the server information for the current + * instance of the db client + * + * @param {Object} [options] optional parameters for this operation + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Admin~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Admin.prototype.serverInfo = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const cmd = { buildinfo: 1 }; + + const serverInfoOperation = new ExecuteDbAdminCommandOperation(this.s.db, cmd, options); + + return executeOperation(this.s.db.s.topology, serverInfoOperation, callback); +}; + +/** + * Retrieve this db's server status. + * + * @param {Object} [options] optional parameters for this operation + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Admin~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Admin.prototype.serverStatus = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const serverStatusOperation = new ExecuteDbAdminCommandOperation( + this.s.db, + { serverStatus: 1 }, + options + ); + + return executeOperation(this.s.db.s.topology, serverStatusOperation, callback); +}; + +/** + * Ping the MongoDB server and retrieve results + * + * @param {Object} [options] optional parameters for this operation + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Admin~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Admin.prototype.ping = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const cmd = { ping: 1 }; + + const pingOperation = new ExecuteDbAdminCommandOperation(this.s.db, cmd, options); + + return executeOperation(this.s.db.s.topology, pingOperation, callback); +}; + +/** + * Add a user to the database. + * @method + * @param {string} username The username. + * @param {string} password The password. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {boolean} [options.fsync=false] **Deprecated** Specify a file sync write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {object} [options.customData] Custom data associated with the user (only Mongodb 2.6 or higher) + * @param {object[]} [options.roles] Roles associated with the created user (only Mongodb 2.6 or higher) + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Admin~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Admin.prototype.addUser = function(username, password, options, callback) { + const args = Array.prototype.slice.call(arguments, 2); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + + // Special case where there is no password ($external users) + if (typeof username === 'string' && password != null && typeof password === 'object') { + options = password; + password = null; + } + + options = args.length ? args.shift() : {}; + options = Object.assign({}, options); + // Get the options + options = applyWriteConcern(options, { db: this.s.db }); + // Set the db name to admin + options.dbName = 'admin'; + + const addUserOperation = new AddUserOperation(this.s.db, username, password, options); + + return executeOperation(this.s.db.s.topology, addUserOperation, callback); +}; + +/** + * Remove a user from a database + * @method + * @param {string} username The username. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {boolean} [options.fsync=false] **Deprecated** Specify a file sync write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Admin~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Admin.prototype.removeUser = function(username, options, callback) { + const args = Array.prototype.slice.call(arguments, 1); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + + options = args.length ? args.shift() : {}; + options = Object.assign({}, options); + // Get the options + options = applyWriteConcern(options, { db: this.s.db }); + // Set the db name + options.dbName = 'admin'; + + const removeUserOperation = new RemoveUserOperation(this.s.db, username, options); + + return executeOperation(this.s.db.s.topology, removeUserOperation, callback); +}; + +/** + * Validate an existing collection + * + * @param {string} collectionName The name of the collection to validate. + * @param {object} [options] Optional settings. + * @param {boolean} [options.background] Validates a collection in the background, without interrupting read or write traffic (only in MongoDB 4.4+) + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Admin~resultCallback} [callback] The command result callback. + * @return {Promise} returns Promise if no callback passed + */ +Admin.prototype.validateCollection = function(collectionName, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const validateCollectionOperation = new ValidateCollectionOperation( + this, + collectionName, + options + ); + + return executeOperation(this.s.db.s.topology, validateCollectionOperation, callback); +}; + +/** + * List the available databases + * + * @param {object} [options] Optional settings. + * @param {boolean} [options.nameOnly=false] Whether the command should return only db names, or names and size info. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Admin~resultCallback} [callback] The command result callback. + * @return {Promise} returns Promise if no callback passed + */ +Admin.prototype.listDatabases = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + return executeOperation( + this.s.db.s.topology, + new ListDatabasesOperation(this.s.db, options), + callback + ); +}; + +/** + * Get ReplicaSet status + * + * @param {Object} [options] optional parameters for this operation + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Admin~resultCallback} [callback] The command result callback. + * @return {Promise} returns Promise if no callback passed + */ +Admin.prototype.replSetGetStatus = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const replSetGetStatusOperation = new ExecuteDbAdminCommandOperation( + this.s.db, + { replSetGetStatus: 1 }, + options + ); + + return executeOperation(this.s.db.s.topology, replSetGetStatusOperation, callback); +}; + +module.exports = Admin; diff --git a/node_modules/mongodb/lib/aggregation_cursor.js b/node_modules/mongodb/lib/aggregation_cursor.js new file mode 100644 index 00000000..92897334 --- /dev/null +++ b/node_modules/mongodb/lib/aggregation_cursor.js @@ -0,0 +1,369 @@ +'use strict'; + +const MongoError = require('./core').MongoError; +const Cursor = require('./cursor'); +const CursorState = require('./core/cursor').CursorState; + +/** + * @fileOverview The **AggregationCursor** class is an internal class that embodies an aggregation cursor on MongoDB + * allowing for iteration over the results returned from the underlying query. It supports + * one by one document iteration, conversion to an array or can be iterated as a Node 4.X + * or higher stream + * + * **AGGREGATIONCURSOR Cannot directly be instantiated** + * @example + * const MongoClient = require('mongodb').MongoClient; + * const test = require('assert'); + * // Connection url + * const url = 'mongodb://localhost:27017'; + * // Database Name + * const dbName = 'test'; + * // Connect using MongoClient + * MongoClient.connect(url, function(err, client) { + * // Create a collection we want to drop later + * const col = client.db(dbName).collection('createIndexExample1'); + * // Insert a bunch of documents + * col.insert([{a:1, b:1} + * , {a:2, b:2}, {a:3, b:3} + * , {a:4, b:4}], {w:1}, function(err, result) { + * test.equal(null, err); + * // Show that duplicate records got dropped + * col.aggregation({}, {cursor: {}}).toArray(function(err, items) { + * test.equal(null, err); + * test.equal(4, items.length); + * client.close(); + * }); + * }); + * }); + */ + +/** + * Namespace provided by the browser. + * @external Readable + */ + +/** + * Creates a new Aggregation Cursor instance (INTERNAL TYPE, do not instantiate directly) + * @class AggregationCursor + * @extends external:Readable + * @fires AggregationCursor#data + * @fires AggregationCursor#end + * @fires AggregationCursor#close + * @fires AggregationCursor#readable + * @return {AggregationCursor} an AggregationCursor instance. + */ +class AggregationCursor extends Cursor { + constructor(topology, operation, options) { + super(topology, operation, options); + } + + /** + * Set the batch size for the cursor. + * @method + * @param {number} value The number of documents to return per batch. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @throws {MongoError} + * @return {AggregationCursor} + */ + batchSize(value) { + if (this.s.state === CursorState.CLOSED || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + if (typeof value !== 'number') { + throw MongoError.create({ message: 'batchSize requires an integer', driver: true }); + } + + this.operation.options.batchSize = value; + this.setCursorBatchSize(value); + return this; + } + + /** + * Add a geoNear stage to the aggregation pipeline + * @method + * @param {object} document The geoNear stage document. + * @return {AggregationCursor} + */ + geoNear(document) { + this.operation.addToPipeline({ $geoNear: document }); + return this; + } + + /** + * Add a group stage to the aggregation pipeline + * @method + * @param {object} document The group stage document. + * @return {AggregationCursor} + */ + group(document) { + this.operation.addToPipeline({ $group: document }); + return this; + } + + /** + * Add a limit stage to the aggregation pipeline + * @method + * @param {number} value The state limit value. + * @return {AggregationCursor} + */ + limit(value) { + this.operation.addToPipeline({ $limit: value }); + return this; + } + + /** + * Add a match stage to the aggregation pipeline + * @method + * @param {object} document The match stage document. + * @return {AggregationCursor} + */ + match(document) { + this.operation.addToPipeline({ $match: document }); + return this; + } + + /** + * Add a maxTimeMS stage to the aggregation pipeline + * @method + * @param {number} value The state maxTimeMS value. + * @return {AggregationCursor} + */ + maxTimeMS(value) { + this.operation.options.maxTimeMS = value; + return this; + } + + /** + * Add a out stage to the aggregation pipeline + * @method + * @param {number} destination The destination name. + * @return {AggregationCursor} + */ + out(destination) { + this.operation.addToPipeline({ $out: destination }); + return this; + } + + /** + * Add a project stage to the aggregation pipeline + * @method + * @param {object} document The project stage document. + * @return {AggregationCursor} + */ + project(document) { + this.operation.addToPipeline({ $project: document }); + return this; + } + + /** + * Add a lookup stage to the aggregation pipeline + * @method + * @param {object} document The lookup stage document. + * @return {AggregationCursor} + */ + lookup(document) { + this.operation.addToPipeline({ $lookup: document }); + return this; + } + + /** + * Add a redact stage to the aggregation pipeline + * @method + * @param {object} document The redact stage document. + * @return {AggregationCursor} + */ + redact(document) { + this.operation.addToPipeline({ $redact: document }); + return this; + } + + /** + * Add a skip stage to the aggregation pipeline + * @method + * @param {number} value The state skip value. + * @return {AggregationCursor} + */ + skip(value) { + this.operation.addToPipeline({ $skip: value }); + return this; + } + + /** + * Add a sort stage to the aggregation pipeline + * @method + * @param {object} document The sort stage document. + * @return {AggregationCursor} + */ + sort(document) { + this.operation.addToPipeline({ $sort: document }); + return this; + } + + /** + * Add a unwind stage to the aggregation pipeline + * @method + * @param {(string|object)} field The unwind field name or stage document. + * @return {AggregationCursor} + */ + unwind(field) { + this.operation.addToPipeline({ $unwind: field }); + return this; + } + + /** + * Return the cursor logger + * @method + * @return {Logger} return the cursor logger + * @ignore + */ + getLogger() { + return this.logger; + } +} + +// aliases +AggregationCursor.prototype.get = AggregationCursor.prototype.toArray; + +/** + * AggregationCursor stream data event, fired for each document in the cursor. + * + * @event AggregationCursor#data + * @type {object} + */ + +/** + * AggregationCursor stream end event + * + * @event AggregationCursor#end + * @type {null} + */ + +/** + * AggregationCursor stream close event + * + * @event AggregationCursor#close + * @type {null} + */ + +/** + * AggregationCursor stream readable event + * + * @event AggregationCursor#readable + * @type {null} + */ + +/** + * Get the next available document from the cursor, returns null if no more documents are available. + * @function AggregationCursor.prototype.next + * @param {AggregationCursor~resultCallback} [callback] The result callback. + * @throws {MongoError} + * @return {Promise} returns Promise if no callback passed + */ + +/** + * Check if there is any document still available in the cursor + * @function AggregationCursor.prototype.hasNext + * @param {AggregationCursor~resultCallback} [callback] The result callback. + * @throws {MongoError} + * @return {Promise} returns Promise if no callback passed + */ + +/** + * The callback format for results + * @callback AggregationCursor~toArrayResultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {object[]} documents All the documents the satisfy the cursor. + */ + +/** + * Returns an array of documents. The caller is responsible for making sure that there + * is enough memory to store the results. Note that the array only contain partial + * results when this cursor had been previously accessed. In that case, + * cursor.rewind() can be used to reset the cursor. + * @method AggregationCursor.prototype.toArray + * @param {AggregationCursor~toArrayResultCallback} [callback] The result callback. + * @throws {MongoError} + * @return {Promise} returns Promise if no callback passed + */ + +/** + * The callback format for results + * @callback AggregationCursor~resultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {(object|null)} result The result object if the command was executed successfully. + */ + +/** + * Iterates over all the documents for this cursor. As with **{cursor.toArray}**, + * not all of the elements will be iterated if this cursor had been previously accessed. + * In that case, **{cursor.rewind}** can be used to reset the cursor. However, unlike + * **{cursor.toArray}**, the cursor will only hold a maximum of batch size elements + * at any given time if batch size is specified. Otherwise, the caller is responsible + * for making sure that the entire result can fit the memory. + * @method AggregationCursor.prototype.each + * @deprecated + * @param {AggregationCursor~resultCallback} callback The result callback. + * @throws {MongoError} + * @return {null} + */ + +/** + * Close the cursor, sending a AggregationCursor command and emitting close. + * @method AggregationCursor.prototype.close + * @param {AggregationCursor~resultCallback} [callback] The result callback. + * @return {Promise} returns Promise if no callback passed + */ + +/** + * Is the cursor closed + * @method AggregationCursor.prototype.isClosed + * @return {boolean} + */ + +/** + * Execute the explain for the cursor + * + * For backwards compatibility, a verbosity of true is interpreted as "allPlansExecution" + * and false as "queryPlanner". Prior to server version 3.6, aggregate() + * ignores the verbosity parameter and executes in "queryPlanner". + * + * @method AggregationCursor.prototype.explain + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [verbosity=true] - An optional mode in which to run the explain. + * @param {AggregationCursor~resultCallback} [callback] The result callback. + * @return {Promise} returns Promise if no callback passed + */ + +/** + * Clone the cursor + * @function AggregationCursor.prototype.clone + * @return {AggregationCursor} + */ + +/** + * Resets the cursor + * @function AggregationCursor.prototype.rewind + * @return {AggregationCursor} + */ + +/** + * The callback format for the forEach iterator method + * @callback AggregationCursor~iteratorCallback + * @param {Object} doc An emitted document for the iterator + */ + +/** + * The callback error format for the forEach iterator method + * @callback AggregationCursor~endCallback + * @param {MongoError} error An error instance representing the error during the execution. + */ + +/** + * Iterates over all the documents for this cursor using the iterator, callback pattern. + * @method AggregationCursor.prototype.forEach + * @param {AggregationCursor~iteratorCallback} iterator The iteration callback. + * @param {AggregationCursor~endCallback} callback The end callback. + * @throws {MongoError} + * @return {null} + */ + +module.exports = AggregationCursor; diff --git a/node_modules/mongodb/lib/apm.js b/node_modules/mongodb/lib/apm.js new file mode 100644 index 00000000..f78e4aaf --- /dev/null +++ b/node_modules/mongodb/lib/apm.js @@ -0,0 +1,31 @@ +'use strict'; +const EventEmitter = require('events').EventEmitter; + +class Instrumentation extends EventEmitter { + constructor() { + super(); + } + + instrument(MongoClient, callback) { + // store a reference to the original functions + this.$MongoClient = MongoClient; + const $prototypeConnect = (this.$prototypeConnect = MongoClient.prototype.connect); + + const instrumentation = this; + MongoClient.prototype.connect = function(callback) { + this.s.options.monitorCommands = true; + this.on('commandStarted', event => instrumentation.emit('started', event)); + this.on('commandSucceeded', event => instrumentation.emit('succeeded', event)); + this.on('commandFailed', event => instrumentation.emit('failed', event)); + return $prototypeConnect.call(this, callback); + }; + + if (typeof callback === 'function') callback(null, this); + } + + uninstrument() { + this.$MongoClient.prototype.connect = this.$prototypeConnect; + } +} + +module.exports = Instrumentation; diff --git a/node_modules/mongodb/lib/async/.eslintrc b/node_modules/mongodb/lib/async/.eslintrc new file mode 100644 index 00000000..93b2f643 --- /dev/null +++ b/node_modules/mongodb/lib/async/.eslintrc @@ -0,0 +1,5 @@ +{ + "parserOptions": { + "ecmaVersion": 2018 + } +} diff --git a/node_modules/mongodb/lib/async/async_iterator.js b/node_modules/mongodb/lib/async/async_iterator.js new file mode 100644 index 00000000..6021aadf --- /dev/null +++ b/node_modules/mongodb/lib/async/async_iterator.js @@ -0,0 +1,33 @@ +'use strict'; + +// async function* asyncIterator() { +// while (true) { +// const value = await this.next(); +// if (!value) { +// await this.close(); +// return; +// } + +// yield value; +// } +// } + +// TODO: change this to the async generator function above +function asyncIterator() { + const cursor = this; + + return { + next: function() { + return Promise.resolve() + .then(() => cursor.next()) + .then(value => { + if (!value) { + return cursor.close().then(() => ({ value, done: true })); + } + return { value, done: false }; + }); + } + }; +} + +exports.asyncIterator = asyncIterator; diff --git a/node_modules/mongodb/lib/bulk/common.js b/node_modules/mongodb/lib/bulk/common.js new file mode 100644 index 00000000..83a719a3 --- /dev/null +++ b/node_modules/mongodb/lib/bulk/common.js @@ -0,0 +1,1298 @@ +'use strict'; + +const Long = require('../core').BSON.Long; +const MongoError = require('../core').MongoError; +const ObjectID = require('../core').BSON.ObjectID; +const BSON = require('../core').BSON; +const MongoWriteConcernError = require('../core').MongoWriteConcernError; +const toError = require('../utils').toError; +const handleCallback = require('../utils').handleCallback; +const applyRetryableWrites = require('../utils').applyRetryableWrites; +const applyWriteConcern = require('../utils').applyWriteConcern; +const executeLegacyOperation = require('../utils').executeLegacyOperation; +const isPromiseLike = require('../utils').isPromiseLike; +const hasAtomicOperators = require('../utils').hasAtomicOperators; +const maxWireVersion = require('../core/utils').maxWireVersion; + +// Error codes +const WRITE_CONCERN_ERROR = 64; + +// Insert types +const INSERT = 1; +const UPDATE = 2; +const REMOVE = 3; + +const bson = new BSON([ + BSON.Binary, + BSON.Code, + BSON.DBRef, + BSON.Decimal128, + BSON.Double, + BSON.Int32, + BSON.Long, + BSON.Map, + BSON.MaxKey, + BSON.MinKey, + BSON.ObjectId, + BSON.BSONRegExp, + BSON.Symbol, + BSON.Timestamp +]); + +/** + * Keeps the state of a unordered batch so we can rewrite the results + * correctly after command execution + * @ignore + */ +class Batch { + constructor(batchType, originalZeroIndex) { + this.originalZeroIndex = originalZeroIndex; + this.currentIndex = 0; + this.originalIndexes = []; + this.batchType = batchType; + this.operations = []; + this.size = 0; + this.sizeBytes = 0; + } +} + +/** + * @classdesc + * The result of a bulk write. + */ +class BulkWriteResult { + /** + * Create a new BulkWriteResult instance + * + * **NOTE:** Internal Type, do not instantiate directly + */ + constructor(bulkResult) { + this.result = bulkResult; + } + + /** + * Evaluates to true if the bulk operation correctly executes + * @type {boolean} + */ + get ok() { + return this.result.ok; + } + + /** + * The number of inserted documents + * @type {number} + */ + get nInserted() { + return this.result.nInserted; + } + + /** + * Number of upserted documents + * @type {number} + */ + get nUpserted() { + return this.result.nUpserted; + } + + /** + * Number of matched documents + * @type {number} + */ + get nMatched() { + return this.result.nMatched; + } + + /** + * Number of documents updated physically on disk + * @type {number} + */ + get nModified() { + return this.result.nModified; + } + + /** + * Number of removed documents + * @type {number} + */ + get nRemoved() { + return this.result.nRemoved; + } + + /** + * Returns an array of all inserted ids + * + * @return {object[]} + */ + getInsertedIds() { + return this.result.insertedIds; + } + + /** + * Returns an array of all upserted ids + * + * @return {object[]} + */ + getUpsertedIds() { + return this.result.upserted; + } + + /** + * Returns the upserted id at the given index + * + * @param {number} index the number of the upserted id to return, returns undefined if no result for passed in index + * @return {object} + */ + getUpsertedIdAt(index) { + return this.result.upserted[index]; + } + + /** + * Returns raw internal result + * + * @return {object} + */ + getRawResponse() { + return this.result; + } + + /** + * Returns true if the bulk operation contains a write error + * + * @return {boolean} + */ + hasWriteErrors() { + return this.result.writeErrors.length > 0; + } + + /** + * Returns the number of write errors off the bulk operation + * + * @return {number} + */ + getWriteErrorCount() { + return this.result.writeErrors.length; + } + + /** + * Returns a specific write error object + * + * @param {number} index of the write error to return, returns null if there is no result for passed in index + * @return {WriteError} + */ + getWriteErrorAt(index) { + if (index < this.result.writeErrors.length) { + return this.result.writeErrors[index]; + } + return null; + } + + /** + * Retrieve all write errors + * + * @return {WriteError[]} + */ + getWriteErrors() { + return this.result.writeErrors; + } + + /** + * Retrieve lastOp if available + * + * @return {object} + */ + getLastOp() { + return this.result.lastOp; + } + + /** + * Retrieve the write concern error if any + * + * @return {WriteConcernError} + */ + getWriteConcernError() { + if (this.result.writeConcernErrors.length === 0) { + return null; + } else if (this.result.writeConcernErrors.length === 1) { + // Return the error + return this.result.writeConcernErrors[0]; + } else { + // Combine the errors + let errmsg = ''; + for (let i = 0; i < this.result.writeConcernErrors.length; i++) { + const err = this.result.writeConcernErrors[i]; + errmsg = errmsg + err.errmsg; + + // TODO: Something better + if (i === 0) errmsg = errmsg + ' and '; + } + + return new WriteConcernError({ errmsg: errmsg, code: WRITE_CONCERN_ERROR }); + } + } + + /** + * @return {object} + */ + toJSON() { + return this.result; + } + + /** + * @return {string} + */ + toString() { + return `BulkWriteResult(${this.toJSON(this.result)})`; + } + + /** + * @return {boolean} + */ + isOk() { + return this.result.ok === 1; + } +} + +/** + * @classdesc An error representing a failure by the server to apply the requested write concern to the bulk operation. + */ +class WriteConcernError { + /** + * Create a new WriteConcernError instance + * + * **NOTE:** Internal Type, do not instantiate directly + */ + constructor(err) { + this.err = err; + } + + /** + * Write concern error code. + * @type {number} + */ + get code() { + return this.err.code; + } + + /** + * Write concern error message. + * @type {string} + */ + get errmsg() { + return this.err.errmsg; + } + + /** + * @return {object} + */ + toJSON() { + return { code: this.err.code, errmsg: this.err.errmsg }; + } + + /** + * @return {string} + */ + toString() { + return `WriteConcernError(${this.err.errmsg})`; + } +} + +/** + * @classdesc An error that occurred during a BulkWrite on the server. + */ +class WriteError { + /** + * Create a new WriteError instance + * + * **NOTE:** Internal Type, do not instantiate directly + */ + constructor(err) { + this.err = err; + } + + /** + * WriteError code. + * @type {number} + */ + get code() { + return this.err.code; + } + + /** + * WriteError original bulk operation index. + * @type {number} + */ + get index() { + return this.err.index; + } + + /** + * WriteError message. + * @type {string} + */ + get errmsg() { + return this.err.errmsg; + } + + /** + * Returns the underlying operation that caused the error + * @return {object} + */ + getOperation() { + return this.err.op; + } + + /** + * @return {object} + */ + toJSON() { + return { code: this.err.code, index: this.err.index, errmsg: this.err.errmsg, op: this.err.op }; + } + + /** + * @return {string} + */ + toString() { + return `WriteError(${JSON.stringify(this.toJSON())})`; + } +} + +/** + * Merges results into shared data structure + * @ignore + */ +function mergeBatchResults(batch, bulkResult, err, result) { + // If we have an error set the result to be the err object + if (err) { + result = err; + } else if (result && result.result) { + result = result.result; + } else if (result == null) { + return; + } + + // Do we have a top level error stop processing and return + if (result.ok === 0 && bulkResult.ok === 1) { + bulkResult.ok = 0; + + const writeError = { + index: 0, + code: result.code || 0, + errmsg: result.message, + op: batch.operations[0] + }; + + bulkResult.writeErrors.push(new WriteError(writeError)); + return; + } else if (result.ok === 0 && bulkResult.ok === 0) { + return; + } + + // Deal with opTime if available + if (result.opTime || result.lastOp) { + const opTime = result.lastOp || result.opTime; + let lastOpTS = null; + let lastOpT = null; + + // We have a time stamp + if (opTime && opTime._bsontype === 'Timestamp') { + if (bulkResult.lastOp == null) { + bulkResult.lastOp = opTime; + } else if (opTime.greaterThan(bulkResult.lastOp)) { + bulkResult.lastOp = opTime; + } + } else { + // Existing TS + if (bulkResult.lastOp) { + lastOpTS = + typeof bulkResult.lastOp.ts === 'number' + ? Long.fromNumber(bulkResult.lastOp.ts) + : bulkResult.lastOp.ts; + lastOpT = + typeof bulkResult.lastOp.t === 'number' + ? Long.fromNumber(bulkResult.lastOp.t) + : bulkResult.lastOp.t; + } + + // Current OpTime TS + const opTimeTS = typeof opTime.ts === 'number' ? Long.fromNumber(opTime.ts) : opTime.ts; + const opTimeT = typeof opTime.t === 'number' ? Long.fromNumber(opTime.t) : opTime.t; + + // Compare the opTime's + if (bulkResult.lastOp == null) { + bulkResult.lastOp = opTime; + } else if (opTimeTS.greaterThan(lastOpTS)) { + bulkResult.lastOp = opTime; + } else if (opTimeTS.equals(lastOpTS)) { + if (opTimeT.greaterThan(lastOpT)) { + bulkResult.lastOp = opTime; + } + } + } + } + + // If we have an insert Batch type + if (batch.batchType === INSERT && result.n) { + bulkResult.nInserted = bulkResult.nInserted + result.n; + } + + // If we have an insert Batch type + if (batch.batchType === REMOVE && result.n) { + bulkResult.nRemoved = bulkResult.nRemoved + result.n; + } + + let nUpserted = 0; + + // We have an array of upserted values, we need to rewrite the indexes + if (Array.isArray(result.upserted)) { + nUpserted = result.upserted.length; + + for (let i = 0; i < result.upserted.length; i++) { + bulkResult.upserted.push({ + index: result.upserted[i].index + batch.originalZeroIndex, + _id: result.upserted[i]._id + }); + } + } else if (result.upserted) { + nUpserted = 1; + + bulkResult.upserted.push({ + index: batch.originalZeroIndex, + _id: result.upserted + }); + } + + // If we have an update Batch type + if (batch.batchType === UPDATE && result.n) { + const nModified = result.nModified; + bulkResult.nUpserted = bulkResult.nUpserted + nUpserted; + bulkResult.nMatched = bulkResult.nMatched + (result.n - nUpserted); + + if (typeof nModified === 'number') { + bulkResult.nModified = bulkResult.nModified + nModified; + } else { + bulkResult.nModified = null; + } + } + + if (Array.isArray(result.writeErrors)) { + for (let i = 0; i < result.writeErrors.length; i++) { + const writeError = { + index: batch.originalIndexes[result.writeErrors[i].index], + code: result.writeErrors[i].code, + errmsg: result.writeErrors[i].errmsg, + op: batch.operations[result.writeErrors[i].index] + }; + + bulkResult.writeErrors.push(new WriteError(writeError)); + } + } + + if (result.writeConcernError) { + bulkResult.writeConcernErrors.push(new WriteConcernError(result.writeConcernError)); + } +} + +function executeCommands(bulkOperation, options, callback) { + if (bulkOperation.s.batches.length === 0) { + return handleCallback(callback, null, new BulkWriteResult(bulkOperation.s.bulkResult)); + } + + const batch = bulkOperation.s.batches.shift(); + + function resultHandler(err, result) { + // Error is a driver related error not a bulk op error, terminate + if (((err && err.driver) || (err && err.message)) && !(err instanceof MongoWriteConcernError)) { + return handleCallback(callback, err); + } + + // If we have and error + if (err) err.ok = 0; + if (err instanceof MongoWriteConcernError) { + return handleMongoWriteConcernError(batch, bulkOperation.s.bulkResult, err, callback); + } + + // Merge the results together + const writeResult = new BulkWriteResult(bulkOperation.s.bulkResult); + const mergeResult = mergeBatchResults(batch, bulkOperation.s.bulkResult, err, result); + if (mergeResult != null) { + return handleCallback(callback, null, writeResult); + } + + if (bulkOperation.handleWriteError(callback, writeResult)) return; + + // Execute the next command in line + executeCommands(bulkOperation, options, callback); + } + + bulkOperation.finalOptionsHandler({ options, batch, resultHandler }, callback); +} + +/** + * handles write concern error + * + * @ignore + * @param {object} batch + * @param {object} bulkResult + * @param {boolean} ordered + * @param {WriteConcernError} err + * @param {function} callback + */ +function handleMongoWriteConcernError(batch, bulkResult, err, callback) { + mergeBatchResults(batch, bulkResult, null, err.result); + + const wrappedWriteConcernError = new WriteConcernError({ + errmsg: err.result.writeConcernError.errmsg, + code: err.result.writeConcernError.result + }); + return handleCallback( + callback, + new BulkWriteError(toError(wrappedWriteConcernError), new BulkWriteResult(bulkResult)), + null + ); +} + +/** + * @classdesc An error indicating an unsuccessful Bulk Write + */ +class BulkWriteError extends MongoError { + /** + * Creates a new BulkWriteError + * + * @param {Error|string|object} message The error message + * @param {BulkWriteResult} result The result of the bulk write operation + * @extends {MongoError} + */ + constructor(error, result) { + const message = error.err || error.errmsg || error.errMessage || error; + super(message); + + Object.assign(this, error); + + this.name = 'BulkWriteError'; + this.result = result; + } +} + +/** + * @classdesc A builder object that is returned from {@link BulkOperationBase#find}. + * Is used to build a write operation that involves a query filter. + */ +class FindOperators { + /** + * Creates a new FindOperators object. + * + * **NOTE:** Internal Type, do not instantiate directly + * @param {OrderedBulkOperation|UnorderedBulkOperation} bulkOperation + */ + constructor(bulkOperation) { + this.s = bulkOperation.s; + } + + /** + * Add a multiple update operation to the bulk operation + * + * @method + * @param {object} updateDocument An update field for an update operation. See {@link https://docs.mongodb.com/manual/reference/command/update/#update-command-u u documentation} + * @param {object} [options.hint] An optional hint for query optimization. See the {@link https://docs.mongodb.com/manual/reference/command/update/#update-command-hint|update command} reference for more information. + * @throws {MongoError} If operation cannot be added to bulk write + * @return {OrderedBulkOperation|UnorderedBulkOperation} A reference to the parent BulkOperation + */ + update(updateDocument) { + // Perform upsert + const upsert = typeof this.s.currentOp.upsert === 'boolean' ? this.s.currentOp.upsert : false; + + // Establish the update command + const document = { + q: this.s.currentOp.selector, + u: updateDocument, + multi: true, + upsert: upsert + }; + + if (updateDocument.hint) { + document.hint = updateDocument.hint; + } + + // Clear out current Op + this.s.currentOp = null; + return this.s.options.addToOperationsList(this, UPDATE, document); + } + + /** + * Add a single update operation to the bulk operation + * + * @method + * @param {object} updateDocument An update field for an update operation. See {@link https://docs.mongodb.com/manual/reference/command/update/#update-command-u u documentation} + * @param {object} [options.hint] An optional hint for query optimization. See the {@link https://docs.mongodb.com/manual/reference/command/update/#update-command-hint|update command} reference for more information. + * @throws {MongoError} If operation cannot be added to bulk write + * @return {OrderedBulkOperation|UnorderedBulkOperation} A reference to the parent BulkOperation + */ + updateOne(updateDocument) { + // Perform upsert + const upsert = typeof this.s.currentOp.upsert === 'boolean' ? this.s.currentOp.upsert : false; + + // Establish the update command + const document = { + q: this.s.currentOp.selector, + u: updateDocument, + multi: false, + upsert: upsert + }; + + if (updateDocument.hint) { + document.hint = updateDocument.hint; + } + + if (!hasAtomicOperators(updateDocument)) { + throw new TypeError('Update document requires atomic operators'); + } + + // Clear out current Op + this.s.currentOp = null; + return this.s.options.addToOperationsList(this, UPDATE, document); + } + + /** + * Add a replace one operation to the bulk operation + * + * @method + * @param {object} replacement the new document to replace the existing one with + * @throws {MongoError} If operation cannot be added to bulk write + * @return {OrderedBulkOperation|UnorderedBulkOperation} A reference to the parent BulkOperation + */ + replaceOne(replacement) { + // Perform upsert + const upsert = typeof this.s.currentOp.upsert === 'boolean' ? this.s.currentOp.upsert : false; + + // Establish the update command + const document = { + q: this.s.currentOp.selector, + u: replacement, + multi: false, + upsert: upsert + }; + + if (replacement.hint) { + document.hint = replacement.hint; + } + + if (hasAtomicOperators(replacement)) { + throw new TypeError('Replacement document must not use atomic operators'); + } + + // Clear out current Op + this.s.currentOp = null; + return this.s.options.addToOperationsList(this, UPDATE, document); + } + + /** + * Upsert modifier for update bulk operation, noting that this operation is an upsert. + * + * @method + * @throws {MongoError} If operation cannot be added to bulk write + * @return {FindOperators} reference to self + */ + upsert() { + this.s.currentOp.upsert = true; + return this; + } + + /** + * Add a delete one operation to the bulk operation + * + * @method + * @throws {MongoError} If operation cannot be added to bulk write + * @return {OrderedBulkOperation|UnorderedBulkOperation} A reference to the parent BulkOperation + */ + deleteOne() { + // Establish the update command + const document = { + q: this.s.currentOp.selector, + limit: 1 + }; + + // Clear out current Op + this.s.currentOp = null; + return this.s.options.addToOperationsList(this, REMOVE, document); + } + + /** + * Add a delete many operation to the bulk operation + * + * @method + * @throws {MongoError} If operation cannot be added to bulk write + * @return {OrderedBulkOperation|UnorderedBulkOperation} A reference to the parent BulkOperation + */ + delete() { + // Establish the update command + const document = { + q: this.s.currentOp.selector, + limit: 0 + }; + + // Clear out current Op + this.s.currentOp = null; + return this.s.options.addToOperationsList(this, REMOVE, document); + } + + /** + * backwards compatability for deleteOne + */ + removeOne() { + return this.deleteOne(); + } + + /** + * backwards compatability for delete + */ + remove() { + return this.delete(); + } +} + +/** + * @classdesc Parent class to OrderedBulkOperation and UnorderedBulkOperation + * + * **NOTE:** Internal Type, do not instantiate directly + */ +class BulkOperationBase { + /** + * Create a new OrderedBulkOperation or UnorderedBulkOperation instance + * @property {number} length Get the number of operations in the bulk. + */ + constructor(topology, collection, options, isOrdered) { + // determine whether bulkOperation is ordered or unordered + this.isOrdered = isOrdered; + + options = options == null ? {} : options; + // TODO Bring from driver information in isMaster + // Get the namespace for the write operations + const namespace = collection.s.namespace; + // Used to mark operation as executed + const executed = false; + + // Current item + const currentOp = null; + + // Handle to the bson serializer, used to calculate running sizes + const bson = topology.bson; + // Set max byte size + const isMaster = topology.lastIsMaster(); + + // If we have autoEncryption on, batch-splitting must be done on 2mb chunks, but single documents + // over 2mb are still allowed + const usingAutoEncryption = !!(topology.s.options && topology.s.options.autoEncrypter); + const maxBsonObjectSize = + isMaster && isMaster.maxBsonObjectSize ? isMaster.maxBsonObjectSize : 1024 * 1024 * 16; + const maxBatchSizeBytes = usingAutoEncryption ? 1024 * 1024 * 2 : maxBsonObjectSize; + const maxWriteBatchSize = + isMaster && isMaster.maxWriteBatchSize ? isMaster.maxWriteBatchSize : 1000; + + // Calculates the largest possible size of an Array key, represented as a BSON string + // element. This calculation: + // 1 byte for BSON type + // # of bytes = length of (string representation of (maxWriteBatchSize - 1)) + // + 1 bytes for null terminator + const maxKeySize = (maxWriteBatchSize - 1).toString(10).length + 2; + + // Final options for retryable writes and write concern + let finalOptions = Object.assign({}, options); + finalOptions = applyRetryableWrites(finalOptions, collection.s.db); + finalOptions = applyWriteConcern(finalOptions, { collection: collection }, options); + const writeConcern = finalOptions.writeConcern; + + // Get the promiseLibrary + const promiseLibrary = options.promiseLibrary || Promise; + + // Final results + const bulkResult = { + ok: 1, + writeErrors: [], + writeConcernErrors: [], + insertedIds: [], + nInserted: 0, + nUpserted: 0, + nMatched: 0, + nModified: 0, + nRemoved: 0, + upserted: [] + }; + + // Internal state + this.s = { + // Final result + bulkResult: bulkResult, + // Current batch state + currentBatch: null, + currentIndex: 0, + // ordered specific + currentBatchSize: 0, + currentBatchSizeBytes: 0, + // unordered specific + currentInsertBatch: null, + currentUpdateBatch: null, + currentRemoveBatch: null, + batches: [], + // Write concern + writeConcern: writeConcern, + // Max batch size options + maxBsonObjectSize, + maxBatchSizeBytes, + maxWriteBatchSize, + maxKeySize, + // Namespace + namespace: namespace, + // BSON + bson: bson, + // Topology + topology: topology, + // Options + options: finalOptions, + // Current operation + currentOp: currentOp, + // Executed + executed: executed, + // Collection + collection: collection, + // Promise Library + promiseLibrary: promiseLibrary, + // Fundamental error + err: null, + // check keys + checkKeys: typeof options.checkKeys === 'boolean' ? options.checkKeys : true + }; + + // bypass Validation + if (options.bypassDocumentValidation === true) { + this.s.bypassDocumentValidation = true; + } + } + + /** + * Add a single insert document to the bulk operation + * + * @param {object} document the document to insert + * @throws {MongoError} + * @return {BulkOperationBase} A reference to self + * + * @example + * const bulkOp = collection.initializeOrderedBulkOp(); + * // Adds three inserts to the bulkOp. + * bulkOp + * .insert({ a: 1 }) + * .insert({ b: 2 }) + * .insert({ c: 3 }); + * await bulkOp.execute(); + */ + insert(document) { + if (this.s.collection.s.db.options.forceServerObjectId !== true && document._id == null) + document._id = new ObjectID(); + return this.s.options.addToOperationsList(this, INSERT, document); + } + + /** + * Builds a find operation for an update/updateOne/delete/deleteOne/replaceOne. + * Returns a builder object used to complete the definition of the operation. + * + * @method + * @param {object} selector The selector for the bulk operation. See {@link https://docs.mongodb.com/manual/reference/command/update/#update-command-q q documentation} + * @throws {MongoError} if a selector is not specified + * @return {FindOperators} A helper object with which the write operation can be defined. + * + * @example + * const bulkOp = collection.initializeOrderedBulkOp(); + * + * // Add an updateOne to the bulkOp + * bulkOp.find({ a: 1 }).updateOne({ $set: { b: 2 } }); + * + * // Add an updateMany to the bulkOp + * bulkOp.find({ c: 3 }).update({ $set: { d: 4 } }); + * + * // Add an upsert + * bulkOp.find({ e: 5 }).upsert().updateOne({ $set: { f: 6 } }); + * + * // Add a deletion + * bulkOp.find({ g: 7 }).deleteOne(); + * + * // Add a multi deletion + * bulkOp.find({ h: 8 }).delete(); + * + * // Add a replaceOne + * bulkOp.find({ i: 9 }).replaceOne({ j: 10 }); + * + * // Update using a pipeline (requires Mongodb 4.2 or higher) + * bulk.find({ k: 11, y: { $exists: true }, z: { $exists: true } }).updateOne([ + * { $set: { total: { $sum: [ '$y', '$z' ] } } } + * ]); + * + * // All of the ops will now be executed + * await bulkOp.execute(); + */ + find(selector) { + if (!selector) { + throw toError('Bulk find operation must specify a selector'); + } + + // Save a current selector + this.s.currentOp = { + selector: selector + }; + + return new FindOperators(this); + } + + /** + * Specifies a raw operation to perform in the bulk write. + * + * @method + * @param {object} op The raw operation to perform. + * @param {object} [options.hint] An optional hint for query optimization. See the {@link https://docs.mongodb.com/manual/reference/command/update/#update-command-hint|update command} reference for more information. + * @return {BulkOperationBase} A reference to self + */ + raw(op) { + const key = Object.keys(op)[0]; + + // Set up the force server object id + const forceServerObjectId = + typeof this.s.options.forceServerObjectId === 'boolean' + ? this.s.options.forceServerObjectId + : this.s.collection.s.db.options.forceServerObjectId; + + // Update operations + if ( + (op.updateOne && op.updateOne.q) || + (op.updateMany && op.updateMany.q) || + (op.replaceOne && op.replaceOne.q) + ) { + op[key].multi = op.updateOne || op.replaceOne ? false : true; + return this.s.options.addToOperationsList(this, UPDATE, op[key]); + } + + // Crud spec update format + if (op.updateOne || op.updateMany || op.replaceOne) { + if (op.replaceOne && hasAtomicOperators(op[key].replacement)) { + throw new TypeError('Replacement document must not use atomic operators'); + } else if ((op.updateOne || op.updateMany) && !hasAtomicOperators(op[key].update)) { + throw new TypeError('Update document requires atomic operators'); + } + + const multi = op.updateOne || op.replaceOne ? false : true; + const operation = { + q: op[key].filter, + u: op[key].update || op[key].replacement, + multi: multi + }; + + if (op[key].hint) { + operation.hint = op[key].hint; + } + + if (this.isOrdered) { + operation.upsert = op[key].upsert ? true : false; + if (op.collation) operation.collation = op.collation; + } else { + if (op[key].upsert) operation.upsert = true; + } + if (op[key].arrayFilters) { + // TODO: this check should be done at command construction against a connection, not a topology + if (maxWireVersion(this.s.topology) < 6) { + throw new TypeError('arrayFilters are only supported on MongoDB 3.6+'); + } + + operation.arrayFilters = op[key].arrayFilters; + } + + return this.s.options.addToOperationsList(this, UPDATE, operation); + } + + // Remove operations + if ( + op.removeOne || + op.removeMany || + (op.deleteOne && op.deleteOne.q) || + (op.deleteMany && op.deleteMany.q) + ) { + op[key].limit = op.removeOne ? 1 : 0; + return this.s.options.addToOperationsList(this, REMOVE, op[key]); + } + + // Crud spec delete operations, less efficient + if (op.deleteOne || op.deleteMany) { + const limit = op.deleteOne ? 1 : 0; + const operation = { q: op[key].filter, limit: limit }; + if (op[key].hint) { + operation.hint = op[key].hint; + } + if (this.isOrdered) { + if (op.collation) operation.collation = op.collation; + } + return this.s.options.addToOperationsList(this, REMOVE, operation); + } + + // Insert operations + if (op.insertOne && op.insertOne.document == null) { + if (forceServerObjectId !== true && op.insertOne._id == null) + op.insertOne._id = new ObjectID(); + return this.s.options.addToOperationsList(this, INSERT, op.insertOne); + } else if (op.insertOne && op.insertOne.document) { + if (forceServerObjectId !== true && op.insertOne.document._id == null) + op.insertOne.document._id = new ObjectID(); + return this.s.options.addToOperationsList(this, INSERT, op.insertOne.document); + } + + if (op.insertMany) { + for (let i = 0; i < op.insertMany.length; i++) { + if (forceServerObjectId !== true && op.insertMany[i]._id == null) + op.insertMany[i]._id = new ObjectID(); + this.s.options.addToOperationsList(this, INSERT, op.insertMany[i]); + } + + return; + } + + // No valid type of operation + throw toError( + 'bulkWrite only supports insertOne, insertMany, updateOne, updateMany, removeOne, removeMany, deleteOne, deleteMany' + ); + } + + /** + * helper function to assist with promiseOrCallback behavior + * @ignore + * @param {*} err + * @param {*} callback + */ + _handleEarlyError(err, callback) { + if (typeof callback === 'function') { + callback(err, null); + return; + } + + return this.s.promiseLibrary.reject(err); + } + + /** + * An internal helper method. Do not invoke directly. Will be going away in the future + * + * @ignore + * @method + * @param {class} bulk either OrderedBulkOperation or UnorderdBulkOperation + * @param {object} writeConcern + * @param {object} options + * @param {function} callback + */ + bulkExecute(_writeConcern, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + if (typeof _writeConcern === 'function') { + callback = _writeConcern; + } else if (_writeConcern && typeof _writeConcern === 'object') { + this.s.writeConcern = _writeConcern; + } + + if (this.s.executed) { + const executedError = toError('batch cannot be re-executed'); + return this._handleEarlyError(executedError, callback); + } + + // If we have current batch + if (this.isOrdered) { + if (this.s.currentBatch) this.s.batches.push(this.s.currentBatch); + } else { + if (this.s.currentInsertBatch) this.s.batches.push(this.s.currentInsertBatch); + if (this.s.currentUpdateBatch) this.s.batches.push(this.s.currentUpdateBatch); + if (this.s.currentRemoveBatch) this.s.batches.push(this.s.currentRemoveBatch); + } + // If we have no operations in the bulk raise an error + if (this.s.batches.length === 0) { + const emptyBatchError = toError('Invalid Operation, no operations specified'); + return this._handleEarlyError(emptyBatchError, callback); + } + return { options, callback }; + } + + /** + * The callback format for results + * @callback BulkOperationBase~resultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {BulkWriteResult} result The bulk write result. + */ + + /** + * Execute the bulk operation + * + * @method + * @param {WriteConcern} [_writeConcern] Optional write concern. Can also be specified through options. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {boolean} [options.fsync=false] **Deprecated** Specify a file sync write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {BulkOperationBase~resultCallback} [callback] A callback that will be invoked when bulkWrite finishes/errors + * @throws {MongoError} Throws error if the bulk object has already been executed + * @throws {MongoError} Throws error if the bulk object does not have any operations + * @return {Promise|void} returns Promise if no callback passed + */ + execute(_writeConcern, options, callback) { + const ret = this.bulkExecute(_writeConcern, options, callback); + if (!ret || isPromiseLike(ret)) { + return ret; + } + + options = ret.options; + callback = ret.callback; + + return executeLegacyOperation(this.s.topology, executeCommands, [this, options, callback]); + } + + /** + * Handles final options before executing command + * + * An internal method. Do not invoke. Will not be accessible in the future + * + * @ignore + * @param {object} config + * @param {object} config.options + * @param {number} config.batch + * @param {function} config.resultHandler + * @param {function} callback + */ + finalOptionsHandler(config, callback) { + const finalOptions = Object.assign({ ordered: this.isOrdered }, config.options); + if (this.s.writeConcern != null) { + finalOptions.writeConcern = this.s.writeConcern; + } + + if (finalOptions.bypassDocumentValidation !== true) { + delete finalOptions.bypassDocumentValidation; + } + + // Set an operationIf if provided + if (this.operationId) { + config.resultHandler.operationId = this.operationId; + } + + // Serialize functions + if (this.s.options.serializeFunctions) { + finalOptions.serializeFunctions = true; + } + + // Ignore undefined + if (this.s.options.ignoreUndefined) { + finalOptions.ignoreUndefined = true; + } + + // Is the bypassDocumentValidation options specific + if (this.s.bypassDocumentValidation === true) { + finalOptions.bypassDocumentValidation = true; + } + + // Is the checkKeys option disabled + if (this.s.checkKeys === false) { + finalOptions.checkKeys = false; + } + + if (finalOptions.retryWrites) { + if (config.batch.batchType === UPDATE) { + finalOptions.retryWrites = + finalOptions.retryWrites && !config.batch.operations.some(op => op.multi); + } + + if (config.batch.batchType === REMOVE) { + finalOptions.retryWrites = + finalOptions.retryWrites && !config.batch.operations.some(op => op.limit === 0); + } + } + + try { + if (config.batch.batchType === INSERT) { + this.s.topology.insert( + this.s.namespace, + config.batch.operations, + finalOptions, + config.resultHandler + ); + } else if (config.batch.batchType === UPDATE) { + this.s.topology.update( + this.s.namespace, + config.batch.operations, + finalOptions, + config.resultHandler + ); + } else if (config.batch.batchType === REMOVE) { + this.s.topology.remove( + this.s.namespace, + config.batch.operations, + finalOptions, + config.resultHandler + ); + } + } catch (err) { + // Force top level error + err.ok = 0; + // Merge top level error and return + handleCallback(callback, null, mergeBatchResults(config.batch, this.s.bulkResult, err, null)); + } + } + + /** + * Handles the write error before executing commands + * + * An internal helper method. Do not invoke directly. Will be going away in the future + * + * @ignore + * @param {function} callback + * @param {BulkWriteResult} writeResult + * @param {class} self either OrderedBulkOperation or UnorderedBulkOperation + */ + handleWriteError(callback, writeResult) { + if (this.s.bulkResult.writeErrors.length > 0) { + const msg = this.s.bulkResult.writeErrors[0].errmsg + ? this.s.bulkResult.writeErrors[0].errmsg + : 'write operation failed'; + + handleCallback( + callback, + new BulkWriteError( + toError({ + message: msg, + code: this.s.bulkResult.writeErrors[0].code, + writeErrors: this.s.bulkResult.writeErrors + }), + writeResult + ), + null + ); + return true; + } + + if (writeResult.getWriteConcernError()) { + handleCallback( + callback, + new BulkWriteError(toError(writeResult.getWriteConcernError()), writeResult), + null + ); + return true; + } + } +} + +Object.defineProperty(BulkOperationBase.prototype, 'length', { + enumerable: true, + get: function() { + return this.s.currentIndex; + } +}); + +// Exports symbols +module.exports = { + Batch, + BulkOperationBase, + bson, + INSERT: INSERT, + UPDATE: UPDATE, + REMOVE: REMOVE, + BulkWriteError +}; diff --git a/node_modules/mongodb/lib/bulk/ordered.js b/node_modules/mongodb/lib/bulk/ordered.js new file mode 100644 index 00000000..a976bed2 --- /dev/null +++ b/node_modules/mongodb/lib/bulk/ordered.js @@ -0,0 +1,110 @@ +'use strict'; + +const common = require('./common'); +const BulkOperationBase = common.BulkOperationBase; +const Batch = common.Batch; +const bson = common.bson; +const utils = require('../utils'); +const toError = utils.toError; + +/** + * Add to internal list of Operations + * + * @ignore + * @param {OrderedBulkOperation} bulkOperation + * @param {number} docType number indicating the document type + * @param {object} document + * @return {OrderedBulkOperation} + */ +function addToOperationsList(bulkOperation, docType, document) { + // Get the bsonSize + const bsonSize = bson.calculateObjectSize(document, { + checkKeys: false, + + // Since we don't know what the user selected for BSON options here, + // err on the safe side, and check the size with ignoreUndefined: false. + ignoreUndefined: false + }); + + // Throw error if the doc is bigger than the max BSON size + if (bsonSize >= bulkOperation.s.maxBsonObjectSize) + throw toError('document is larger than the maximum size ' + bulkOperation.s.maxBsonObjectSize); + + // Create a new batch object if we don't have a current one + if (bulkOperation.s.currentBatch == null) + bulkOperation.s.currentBatch = new Batch(docType, bulkOperation.s.currentIndex); + + const maxKeySize = bulkOperation.s.maxKeySize; + + // Check if we need to create a new batch + if ( + // New batch if we exceed the max batch op size + bulkOperation.s.currentBatchSize + 1 >= bulkOperation.s.maxWriteBatchSize || + // New batch if we exceed the maxBatchSizeBytes. Only matters if batch already has a doc, + // since we can't sent an empty batch + (bulkOperation.s.currentBatchSize > 0 && + bulkOperation.s.currentBatchSizeBytes + maxKeySize + bsonSize >= + bulkOperation.s.maxBatchSizeBytes) || + // New batch if the new op does not have the same op type as the current batch + bulkOperation.s.currentBatch.batchType !== docType + ) { + // Save the batch to the execution stack + bulkOperation.s.batches.push(bulkOperation.s.currentBatch); + + // Create a new batch + bulkOperation.s.currentBatch = new Batch(docType, bulkOperation.s.currentIndex); + + // Reset the current size trackers + bulkOperation.s.currentBatchSize = 0; + bulkOperation.s.currentBatchSizeBytes = 0; + } + + if (docType === common.INSERT) { + bulkOperation.s.bulkResult.insertedIds.push({ + index: bulkOperation.s.currentIndex, + _id: document._id + }); + } + + // We have an array of documents + if (Array.isArray(document)) { + throw toError('operation passed in cannot be an Array'); + } + + bulkOperation.s.currentBatch.originalIndexes.push(bulkOperation.s.currentIndex); + bulkOperation.s.currentBatch.operations.push(document); + bulkOperation.s.currentBatchSize += 1; + bulkOperation.s.currentBatchSizeBytes += maxKeySize + bsonSize; + bulkOperation.s.currentIndex += 1; + + // Return bulkOperation + return bulkOperation; +} + +/** + * Create a new OrderedBulkOperation instance (INTERNAL TYPE, do not instantiate directly) + * @class + * @extends BulkOperationBase + * @property {number} length Get the number of operations in the bulk. + * @return {OrderedBulkOperation} a OrderedBulkOperation instance. + */ +class OrderedBulkOperation extends BulkOperationBase { + constructor(topology, collection, options) { + options = options || {}; + options = Object.assign(options, { addToOperationsList }); + + super(topology, collection, options, true); + } +} + +/** + * Returns an unordered batch object + * @ignore + */ +function initializeOrderedBulkOp(topology, collection, options) { + return new OrderedBulkOperation(topology, collection, options); +} + +initializeOrderedBulkOp.OrderedBulkOperation = OrderedBulkOperation; +module.exports = initializeOrderedBulkOp; +module.exports.Bulk = OrderedBulkOperation; diff --git a/node_modules/mongodb/lib/bulk/unordered.js b/node_modules/mongodb/lib/bulk/unordered.js new file mode 100644 index 00000000..c126c5bb --- /dev/null +++ b/node_modules/mongodb/lib/bulk/unordered.js @@ -0,0 +1,131 @@ +'use strict'; + +const common = require('./common'); +const BulkOperationBase = common.BulkOperationBase; +const Batch = common.Batch; +const bson = common.bson; +const utils = require('../utils'); +const toError = utils.toError; + +/** + * Add to internal list of Operations + * + * @ignore + * @param {UnorderedBulkOperation} bulkOperation + * @param {number} docType number indicating the document type + * @param {object} document + * @return {UnorderedBulkOperation} + */ +function addToOperationsList(bulkOperation, docType, document) { + // Get the bsonSize + const bsonSize = bson.calculateObjectSize(document, { + checkKeys: false, + + // Since we don't know what the user selected for BSON options here, + // err on the safe side, and check the size with ignoreUndefined: false. + ignoreUndefined: false + }); + // Throw error if the doc is bigger than the max BSON size + if (bsonSize >= bulkOperation.s.maxBsonObjectSize) + throw toError('document is larger than the maximum size ' + bulkOperation.s.maxBsonObjectSize); + // Holds the current batch + bulkOperation.s.currentBatch = null; + // Get the right type of batch + if (docType === common.INSERT) { + bulkOperation.s.currentBatch = bulkOperation.s.currentInsertBatch; + } else if (docType === common.UPDATE) { + bulkOperation.s.currentBatch = bulkOperation.s.currentUpdateBatch; + } else if (docType === common.REMOVE) { + bulkOperation.s.currentBatch = bulkOperation.s.currentRemoveBatch; + } + + const maxKeySize = bulkOperation.s.maxKeySize; + + // Create a new batch object if we don't have a current one + if (bulkOperation.s.currentBatch == null) + bulkOperation.s.currentBatch = new Batch(docType, bulkOperation.s.currentIndex); + + // Check if we need to create a new batch + if ( + // New batch if we exceed the max batch op size + bulkOperation.s.currentBatch.size + 1 >= bulkOperation.s.maxWriteBatchSize || + // New batch if we exceed the maxBatchSizeBytes. Only matters if batch already has a doc, + // since we can't sent an empty batch + (bulkOperation.s.currentBatch.size > 0 && + bulkOperation.s.currentBatch.sizeBytes + maxKeySize + bsonSize >= + bulkOperation.s.maxBatchSizeBytes) || + // New batch if the new op does not have the same op type as the current batch + bulkOperation.s.currentBatch.batchType !== docType + ) { + // Save the batch to the execution stack + bulkOperation.s.batches.push(bulkOperation.s.currentBatch); + + // Create a new batch + bulkOperation.s.currentBatch = new Batch(docType, bulkOperation.s.currentIndex); + } + + // We have an array of documents + if (Array.isArray(document)) { + throw toError('operation passed in cannot be an Array'); + } + + bulkOperation.s.currentBatch.operations.push(document); + bulkOperation.s.currentBatch.originalIndexes.push(bulkOperation.s.currentIndex); + bulkOperation.s.currentIndex = bulkOperation.s.currentIndex + 1; + + // Save back the current Batch to the right type + if (docType === common.INSERT) { + bulkOperation.s.currentInsertBatch = bulkOperation.s.currentBatch; + bulkOperation.s.bulkResult.insertedIds.push({ + index: bulkOperation.s.bulkResult.insertedIds.length, + _id: document._id + }); + } else if (docType === common.UPDATE) { + bulkOperation.s.currentUpdateBatch = bulkOperation.s.currentBatch; + } else if (docType === common.REMOVE) { + bulkOperation.s.currentRemoveBatch = bulkOperation.s.currentBatch; + } + + // Update current batch size + bulkOperation.s.currentBatch.size += 1; + bulkOperation.s.currentBatch.sizeBytes += maxKeySize + bsonSize; + + // Return bulkOperation + return bulkOperation; +} + +/** + * Create a new UnorderedBulkOperation instance (INTERNAL TYPE, do not instantiate directly) + * @class + * @extends BulkOperationBase + * @property {number} length Get the number of operations in the bulk. + * @return {UnorderedBulkOperation} a UnorderedBulkOperation instance. + */ +class UnorderedBulkOperation extends BulkOperationBase { + constructor(topology, collection, options) { + options = options || {}; + options = Object.assign(options, { addToOperationsList }); + + super(topology, collection, options, false); + } + + handleWriteError(callback, writeResult) { + if (this.s.batches.length) { + return false; + } + + return super.handleWriteError(callback, writeResult); + } +} + +/** + * Returns an unordered batch object + * @ignore + */ +function initializeUnorderedBulkOp(topology, collection, options) { + return new UnorderedBulkOperation(topology, collection, options); +} + +initializeUnorderedBulkOp.UnorderedBulkOperation = UnorderedBulkOperation; +module.exports = initializeUnorderedBulkOp; +module.exports.Bulk = UnorderedBulkOperation; diff --git a/node_modules/mongodb/lib/change_stream.js b/node_modules/mongodb/lib/change_stream.js new file mode 100644 index 00000000..b226702e --- /dev/null +++ b/node_modules/mongodb/lib/change_stream.js @@ -0,0 +1,623 @@ +'use strict'; + +const Denque = require('denque'); +const EventEmitter = require('events'); +const isResumableError = require('./error').isResumableError; +const MongoError = require('./core').MongoError; +const Cursor = require('./cursor'); +const relayEvents = require('./core/utils').relayEvents; +const maxWireVersion = require('./core/utils').maxWireVersion; +const maybePromise = require('./utils').maybePromise; +const now = require('./utils').now; +const calculateDurationInMs = require('./utils').calculateDurationInMs; +const AggregateOperation = require('./operations/aggregate'); + +const kResumeQueue = Symbol('resumeQueue'); + +const CHANGE_STREAM_OPTIONS = ['resumeAfter', 'startAfter', 'startAtOperationTime', 'fullDocument']; +const CURSOR_OPTIONS = ['batchSize', 'maxAwaitTimeMS', 'collation', 'readPreference'].concat( + CHANGE_STREAM_OPTIONS +); + +const CHANGE_DOMAIN_TYPES = { + COLLECTION: Symbol('Collection'), + DATABASE: Symbol('Database'), + CLUSTER: Symbol('Cluster') +}; + +/** + * @typedef ResumeToken + * @description Represents the logical starting point for a new or resuming {@link ChangeStream} on the server. + * @see https://docs.mongodb.com/master/changeStreams/#change-stream-resume-token + */ + +/** + * @typedef OperationTime + * @description Represents a specific point in time on a server. Can be retrieved by using {@link Db#command} + * @see https://docs.mongodb.com/manual/reference/method/db.runCommand/#response + */ + +/** + * @typedef ChangeStreamOptions + * @description Options that can be passed to a ChangeStream. Note that startAfter, resumeAfter, and startAtOperationTime are all mutually exclusive, and the server will error if more than one is specified. + * @property {string} [fullDocument='default'] Allowed values: ‘default’, ‘updateLookup’. When set to ‘updateLookup’, the change stream will include both a delta describing the changes to the document, as well as a copy of the entire document that was changed from some time after the change occurred. + * @property {number} [maxAwaitTimeMS] The maximum amount of time for the server to wait on new documents to satisfy a change stream query. + * @property {ResumeToken} [resumeAfter] Allows you to start a changeStream after a specified event. See {@link https://docs.mongodb.com/master/changeStreams/#resumeafter-for-change-streams|ChangeStream documentation}. + * @property {ResumeToken} [startAfter] Similar to resumeAfter, but will allow you to start after an invalidated event. See {@link https://docs.mongodb.com/master/changeStreams/#startafter-for-change-streams|ChangeStream documentation}. + * @property {OperationTime} [startAtOperationTime] Will start the changeStream after the specified operationTime. + * @property {number} [batchSize=1000] The number of documents to return per batch. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @property {object} [collation] Specify collation settings for operation. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @property {ReadPreference} [readPreference] The read preference. Defaults to the read preference of the database or collection. See {@link https://docs.mongodb.com/manual/reference/read-preference|read preference documentation}. + */ + +/** + * Creates a new Change Stream instance. Normally created using {@link Collection#watch|Collection.watch()}. + * @class ChangeStream + * @since 3.0.0 + * @param {(MongoClient|Db|Collection)} parent The parent object that created this change stream + * @param {Array} pipeline An array of {@link https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/|aggregation pipeline stages} through which to pass change stream documents + * @param {ChangeStreamOptions} [options] Optional settings + * @fires ChangeStream#close + * @fires ChangeStream#change + * @fires ChangeStream#end + * @fires ChangeStream#error + * @fires ChangeStream#resumeTokenChanged + * @return {ChangeStream} a ChangeStream instance. + */ +class ChangeStream extends EventEmitter { + constructor(parent, pipeline, options) { + super(); + const Collection = require('./collection'); + const Db = require('./db'); + const MongoClient = require('./mongo_client'); + + this.pipeline = pipeline || []; + this.options = options || {}; + + this.parent = parent; + this.namespace = parent.s.namespace; + if (parent instanceof Collection) { + this.type = CHANGE_DOMAIN_TYPES.COLLECTION; + this.topology = parent.s.db.serverConfig; + } else if (parent instanceof Db) { + this.type = CHANGE_DOMAIN_TYPES.DATABASE; + this.topology = parent.serverConfig; + } else if (parent instanceof MongoClient) { + this.type = CHANGE_DOMAIN_TYPES.CLUSTER; + this.topology = parent.topology; + } else { + throw new TypeError( + 'parent provided to ChangeStream constructor is not an instance of Collection, Db, or MongoClient' + ); + } + + this.promiseLibrary = parent.s.promiseLibrary; + if (!this.options.readPreference && parent.s.readPreference) { + this.options.readPreference = parent.s.readPreference; + } + + this[kResumeQueue] = new Denque(); + + // Create contained Change Stream cursor + this.cursor = createChangeStreamCursor(this, options); + + this.closed = false; + + // Listen for any `change` listeners being added to ChangeStream + this.on('newListener', eventName => { + if (eventName === 'change' && this.cursor && this.listenerCount('change') === 0) { + this.cursor.on('data', change => processNewChange(this, change)); + } + }); + + // Listen for all `change` listeners being removed from ChangeStream + this.on('removeListener', eventName => { + if (eventName === 'change' && this.listenerCount('change') === 0 && this.cursor) { + this.cursor.removeAllListeners('data'); + } + }); + } + + /** + * @property {ResumeToken} resumeToken + * The cached resume token that will be used to resume + * after the most recently returned change. + */ + get resumeToken() { + return this.cursor.resumeToken; + } + + /** + * Check if there is any document still available in the Change Stream + * @function ChangeStream.prototype.hasNext + * @param {ChangeStream~resultCallback} [callback] The result callback. + * @throws {MongoError} + * @returns {Promise|void} returns Promise if no callback passed + */ + hasNext(callback) { + return maybePromise(this.parent, callback, cb => { + getCursor(this, (err, cursor) => { + if (err) return cb(err); // failed to resume, raise an error + cursor.hasNext(cb); + }); + }); + } + + /** + * Get the next available document from the Change Stream, returns null if no more documents are available. + * @function ChangeStream.prototype.next + * @param {ChangeStream~resultCallback} [callback] The result callback. + * @throws {MongoError} + * @returns {Promise|void} returns Promise if no callback passed + */ + next(callback) { + return maybePromise(this.parent, callback, cb => { + getCursor(this, (err, cursor) => { + if (err) return cb(err); // failed to resume, raise an error + cursor.next((error, change) => { + if (error) { + this[kResumeQueue].push(() => this.next(cb)); + processError(this, error, cb); + return; + } + processNewChange(this, change, cb); + }); + }); + }); + } + + /** + * Is the change stream closed + * @method ChangeStream.prototype.isClosed + * @return {boolean} + */ + isClosed() { + return this.closed || (this.cursor && this.cursor.isClosed()); + } + + /** + * Close the Change Stream + * @method ChangeStream.prototype.close + * @param {ChangeStream~resultCallback} [callback] The result callback. + * @return {Promise} returns Promise if no callback passed + */ + close(callback) { + return maybePromise(this.parent, callback, cb => { + if (this.closed) return cb(); + + // flag the change stream as explicitly closed + this.closed = true; + + if (!this.cursor) return cb(); + + // Tidy up the existing cursor + const cursor = this.cursor; + + return cursor.close(err => { + ['data', 'close', 'end', 'error'].forEach(event => cursor.removeAllListeners(event)); + this.cursor = undefined; + + return cb(err); + }); + }); + } + + /** + * This method pulls all the data out of a readable stream, and writes it to the supplied destination, automatically managing the flow so that the destination is not overwhelmed by a fast readable stream. + * @method + * @param {Writable} destination The destination for writing data + * @param {object} [options] {@link https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options|Pipe options} + * @return {null} + */ + pipe(destination, options) { + if (!this.pipeDestinations) { + this.pipeDestinations = []; + } + this.pipeDestinations.push(destination); + return this.cursor.pipe(destination, options); + } + + /** + * This method will remove the hooks set up for a previous pipe() call. + * @param {Writable} [destination] The destination for writing data + * @return {null} + */ + unpipe(destination) { + if (this.pipeDestinations && this.pipeDestinations.indexOf(destination) > -1) { + this.pipeDestinations.splice(this.pipeDestinations.indexOf(destination), 1); + } + return this.cursor.unpipe(destination); + } + + /** + * Return a modified Readable stream including a possible transform method. + * @method + * @param {object} [options] Optional settings. + * @param {function} [options.transform] A transformation method applied to each document emitted by the stream. + * @return {Cursor} + */ + stream(options) { + this.streamOptions = options; + return this.cursor.stream(options); + } + + /** + * This method will cause a stream in flowing mode to stop emitting data events. Any data that becomes available will remain in the internal buffer. + * @return {null} + */ + pause() { + return this.cursor.pause(); + } + + /** + * This method will cause the readable stream to resume emitting data events. + * @return {null} + */ + resume() { + return this.cursor.resume(); + } +} + +class ChangeStreamCursor extends Cursor { + constructor(topology, operation, options) { + super(topology, operation, options); + + options = options || {}; + this._resumeToken = null; + this.startAtOperationTime = options.startAtOperationTime; + + if (options.startAfter) { + this.resumeToken = options.startAfter; + } else if (options.resumeAfter) { + this.resumeToken = options.resumeAfter; + } + } + + set resumeToken(token) { + this._resumeToken = token; + this.emit('resumeTokenChanged', token); + } + + get resumeToken() { + return this._resumeToken; + } + + get resumeOptions() { + const result = {}; + for (const optionName of CURSOR_OPTIONS) { + if (this.options[optionName]) result[optionName] = this.options[optionName]; + } + + if (this.resumeToken || this.startAtOperationTime) { + ['resumeAfter', 'startAfter', 'startAtOperationTime'].forEach(key => delete result[key]); + + if (this.resumeToken) { + const resumeKey = + this.options.startAfter && !this.hasReceived ? 'startAfter' : 'resumeAfter'; + result[resumeKey] = this.resumeToken; + } else if (this.startAtOperationTime && maxWireVersion(this.server) >= 7) { + result.startAtOperationTime = this.startAtOperationTime; + } + } + + return result; + } + + cacheResumeToken(resumeToken) { + if (this.bufferedCount() === 0 && this.cursorState.postBatchResumeToken) { + this.resumeToken = this.cursorState.postBatchResumeToken; + } else { + this.resumeToken = resumeToken; + } + this.hasReceived = true; + } + + _processBatch(batchName, response) { + const cursor = response.cursor; + if (cursor.postBatchResumeToken) { + this.cursorState.postBatchResumeToken = cursor.postBatchResumeToken; + + if (cursor[batchName].length === 0) { + this.resumeToken = cursor.postBatchResumeToken; + } + } + } + + _initializeCursor(callback) { + super._initializeCursor((err, result) => { + if (err || result == null) { + callback(err, result); + return; + } + + const response = result.documents[0]; + + if ( + this.startAtOperationTime == null && + this.resumeAfter == null && + this.startAfter == null && + maxWireVersion(this.server) >= 7 + ) { + this.startAtOperationTime = response.operationTime; + } + + this._processBatch('firstBatch', response); + + this.emit('init', result); + this.emit('response'); + callback(err, result); + }); + } + + _getMore(callback) { + super._getMore((err, response) => { + if (err) { + callback(err); + return; + } + + this._processBatch('nextBatch', response); + + this.emit('more', response); + this.emit('response'); + callback(err, response); + }); + } +} + +/** + * @event ChangeStreamCursor#response + * internal event DO NOT USE + * @ignore + */ + +// Create a new change stream cursor based on self's configuration +function createChangeStreamCursor(self, options) { + const changeStreamStageOptions = { fullDocument: options.fullDocument || 'default' }; + applyKnownOptions(changeStreamStageOptions, options, CHANGE_STREAM_OPTIONS); + if (self.type === CHANGE_DOMAIN_TYPES.CLUSTER) { + changeStreamStageOptions.allChangesForCluster = true; + } + + const pipeline = [{ $changeStream: changeStreamStageOptions }].concat(self.pipeline); + const cursorOptions = applyKnownOptions({}, options, CURSOR_OPTIONS); + + const changeStreamCursor = new ChangeStreamCursor( + self.topology, + new AggregateOperation(self.parent, pipeline, options), + cursorOptions + ); + + relayEvents(changeStreamCursor, self, ['resumeTokenChanged', 'end', 'close']); + + /** + * Fired for each new matching change in the specified namespace. Attaching a `change` + * event listener to a Change Stream will switch the stream into flowing mode. Data will + * then be passed as soon as it is available. + * + * @event ChangeStream#change + * @type {object} + */ + if (self.listenerCount('change') > 0) { + changeStreamCursor.on('data', function(change) { + processNewChange(self, change); + }); + } + + /** + * Change stream close event + * + * @event ChangeStream#close + * @type {null} + */ + + /** + * Change stream end event + * + * @event ChangeStream#end + * @type {null} + */ + + /** + * Emitted each time the change stream stores a new resume token. + * + * @event ChangeStream#resumeTokenChanged + * @type {ResumeToken} + */ + + /** + * Fired when the stream encounters an error. + * + * @event ChangeStream#error + * @type {Error} + */ + changeStreamCursor.on('error', function(error) { + processError(self, error); + }); + + if (self.pipeDestinations) { + const cursorStream = changeStreamCursor.stream(self.streamOptions); + for (let pipeDestination of self.pipeDestinations) { + cursorStream.pipe(pipeDestination); + } + } + + return changeStreamCursor; +} + +function applyKnownOptions(target, source, optionNames) { + optionNames.forEach(name => { + if (source[name]) { + target[name] = source[name]; + } + }); + + return target; +} + +// This method performs a basic server selection loop, satisfying the requirements of +// ChangeStream resumability until the new SDAM layer can be used. +const SELECTION_TIMEOUT = 30000; +function waitForTopologyConnected(topology, options, callback) { + setTimeout(() => { + if (options && options.start == null) { + options.start = now(); + } + + const start = options.start || now(); + const timeout = options.timeout || SELECTION_TIMEOUT; + const readPreference = options.readPreference; + if (topology.isConnected({ readPreference })) { + return callback(); + } + + if (calculateDurationInMs(start) > timeout) { + return callback(new MongoError('Timed out waiting for connection')); + } + + waitForTopologyConnected(topology, options, callback); + }, 500); // this is an arbitrary wait time to allow SDAM to transition +} + +function processNewChange(changeStream, change, callback) { + const cursor = changeStream.cursor; + + // a null change means the cursor has been notified, implicitly closing the change stream + if (change == null) { + changeStream.closed = true; + } + + if (changeStream.closed) { + if (callback) callback(new MongoError('ChangeStream is closed')); + return; + } + + if (change && !change._id) { + const noResumeTokenError = new Error( + 'A change stream document has been received that lacks a resume token (_id).' + ); + + if (!callback) return changeStream.emit('error', noResumeTokenError); + return callback(noResumeTokenError); + } + + // cache the resume token + cursor.cacheResumeToken(change._id); + + // wipe the startAtOperationTime if there was one so that there won't be a conflict + // between resumeToken and startAtOperationTime if we need to reconnect the cursor + changeStream.options.startAtOperationTime = undefined; + + // Return the change + if (!callback) return changeStream.emit('change', change); + return callback(undefined, change); +} + +function processError(changeStream, error, callback) { + const topology = changeStream.topology; + const cursor = changeStream.cursor; + + // If the change stream has been closed explictly, do not process error. + if (changeStream.closed) { + if (callback) callback(new MongoError('ChangeStream is closed')); + return; + } + + // if the resume succeeds, continue with the new cursor + function resumeWithCursor(newCursor) { + changeStream.cursor = newCursor; + processResumeQueue(changeStream); + } + + // otherwise, raise an error and close the change stream + function unresumableError(err) { + if (!callback) { + changeStream.emit('error', err); + changeStream.emit('close'); + } + processResumeQueue(changeStream, err); + changeStream.closed = true; + } + + if (cursor && isResumableError(error, maxWireVersion(cursor.server))) { + changeStream.cursor = undefined; + + // stop listening to all events from old cursor + ['data', 'close', 'end', 'error'].forEach(event => cursor.removeAllListeners(event)); + + // close internal cursor, ignore errors + cursor.close(); + + waitForTopologyConnected(topology, { readPreference: cursor.options.readPreference }, err => { + // if the topology can't reconnect, close the stream + if (err) return unresumableError(err); + + // create a new cursor, preserving the old cursor's options + const newCursor = createChangeStreamCursor(changeStream, cursor.resumeOptions); + + // attempt to continue in emitter mode + if (!callback) return resumeWithCursor(newCursor); + + // attempt to continue in iterator mode + newCursor.hasNext(err => { + // if there's an error immediately after resuming, close the stream + if (err) return unresumableError(err); + resumeWithCursor(newCursor); + }); + }); + return; + } + + if (!callback) return changeStream.emit('error', error); + return callback(error); +} + +/** + * Safely provides a cursor across resume attempts + * + * @param {ChangeStream} changeStream the parent ChangeStream + * @param {function} callback gets the cursor or error + * @param {ChangeStreamCursor} [oldCursor] when resuming from an error, carry over options from previous cursor + */ +function getCursor(changeStream, callback) { + if (changeStream.isClosed()) { + callback(new MongoError('ChangeStream is closed.')); + return; + } + + // if a cursor exists and it is open, return it + if (changeStream.cursor) { + callback(undefined, changeStream.cursor); + return; + } + + // no cursor, queue callback until topology reconnects + changeStream[kResumeQueue].push(callback); +} + +/** + * Drain the resume queue when a new has become available + * + * @param {ChangeStream} changeStream the parent ChangeStream + * @param {ChangeStreamCursor?} changeStream.cursor the new cursor + * @param {Error} [err] error getting a new cursor + */ +function processResumeQueue(changeStream, err) { + while (changeStream[kResumeQueue].length) { + const request = changeStream[kResumeQueue].pop(); + if (changeStream.isClosed() && !err) { + request(new MongoError('Change Stream is not open.')); + return; + } + request(err, changeStream.cursor); + } +} + +/** + * The callback format for results + * @callback ChangeStream~resultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {(object|null)} result The result object if the command was executed successfully. + */ + +module.exports = ChangeStream; diff --git a/node_modules/mongodb/lib/cmap/connection.js b/node_modules/mongodb/lib/cmap/connection.js new file mode 100644 index 00000000..bf715625 --- /dev/null +++ b/node_modules/mongodb/lib/cmap/connection.js @@ -0,0 +1,384 @@ +'use strict'; + +const EventEmitter = require('events'); +const MessageStream = require('./message_stream'); +const MongoError = require('../core/error').MongoError; +const MongoNetworkError = require('../core/error').MongoNetworkError; +const MongoNetworkTimeoutError = require('../core/error').MongoNetworkTimeoutError; +const MongoWriteConcernError = require('../core/error').MongoWriteConcernError; +const CommandResult = require('../core/connection/command_result'); +const StreamDescription = require('./stream_description').StreamDescription; +const wp = require('../core/wireprotocol'); +const apm = require('../core/connection/apm'); +const updateSessionFromResponse = require('../core/sessions').updateSessionFromResponse; +const uuidV4 = require('../core/utils').uuidV4; +const now = require('../utils').now; +const calculateDurationInMs = require('../utils').calculateDurationInMs; + +const kStream = Symbol('stream'); +const kQueue = Symbol('queue'); +const kMessageStream = Symbol('messageStream'); +const kGeneration = Symbol('generation'); +const kLastUseTime = Symbol('lastUseTime'); +const kClusterTime = Symbol('clusterTime'); +const kDescription = Symbol('description'); +const kIsMaster = Symbol('ismaster'); +const kAutoEncrypter = Symbol('autoEncrypter'); + +class Connection extends EventEmitter { + constructor(stream, options) { + super(options); + + this.id = options.id; + this.address = streamIdentifier(stream); + this.bson = options.bson; + this.socketTimeout = typeof options.socketTimeout === 'number' ? options.socketTimeout : 0; + this.host = options.host || 'localhost'; + this.port = options.port || 27017; + this.monitorCommands = + typeof options.monitorCommands === 'boolean' ? options.monitorCommands : false; + this.closed = false; + this.destroyed = false; + + this[kDescription] = new StreamDescription(this.address, options); + this[kGeneration] = options.generation; + this[kLastUseTime] = now(); + + // retain a reference to an `AutoEncrypter` if present + if (options.autoEncrypter) { + this[kAutoEncrypter] = options.autoEncrypter; + } + + // setup parser stream and message handling + this[kQueue] = new Map(); + this[kMessageStream] = new MessageStream(options); + this[kMessageStream].on('message', messageHandler(this)); + this[kStream] = stream; + stream.on('error', () => { + /* ignore errors, listen to `close` instead */ + }); + + stream.on('close', () => { + if (this.closed) { + return; + } + + this.closed = true; + this[kQueue].forEach(op => + op.cb(new MongoNetworkError(`connection ${this.id} to ${this.address} closed`)) + ); + this[kQueue].clear(); + + this.emit('close'); + }); + + stream.on('timeout', () => { + if (this.closed) { + return; + } + + stream.destroy(); + this.closed = true; + this[kQueue].forEach(op => + op.cb( + new MongoNetworkTimeoutError(`connection ${this.id} to ${this.address} timed out`, { + beforeHandshake: this[kIsMaster] == null + }) + ) + ); + + this[kQueue].clear(); + this.emit('close'); + }); + + // hook the message stream up to the passed in stream + stream.pipe(this[kMessageStream]); + this[kMessageStream].pipe(stream); + } + + get description() { + return this[kDescription]; + } + + get ismaster() { + return this[kIsMaster]; + } + + // the `connect` method stores the result of the handshake ismaster on the connection + set ismaster(response) { + this[kDescription].receiveResponse(response); + + // TODO: remove this, and only use the `StreamDescription` in the future + this[kIsMaster] = response; + } + + get generation() { + return this[kGeneration] || 0; + } + + get idleTime() { + return calculateDurationInMs(this[kLastUseTime]); + } + + get clusterTime() { + return this[kClusterTime]; + } + + get stream() { + return this[kStream]; + } + + markAvailable() { + this[kLastUseTime] = now(); + } + + destroy(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + options = Object.assign({ force: false }, options); + if (this[kStream] == null || this.destroyed) { + this.destroyed = true; + if (typeof callback === 'function') { + callback(); + } + + return; + } + + if (options.force) { + this[kStream].destroy(); + this.destroyed = true; + if (typeof callback === 'function') { + callback(); + } + + return; + } + + this[kStream].end(err => { + this.destroyed = true; + if (typeof callback === 'function') { + callback(err); + } + }); + } + + // Wire protocol methods + command(ns, cmd, options, callback) { + wp.command(makeServerTrampoline(this), ns, cmd, options, callback); + } + + query(ns, cmd, cursorState, options, callback) { + wp.query(makeServerTrampoline(this), ns, cmd, cursorState, options, callback); + } + + getMore(ns, cursorState, batchSize, options, callback) { + wp.getMore(makeServerTrampoline(this), ns, cursorState, batchSize, options, callback); + } + + killCursors(ns, cursorState, callback) { + wp.killCursors(makeServerTrampoline(this), ns, cursorState, callback); + } + + insert(ns, ops, options, callback) { + wp.insert(makeServerTrampoline(this), ns, ops, options, callback); + } + + update(ns, ops, options, callback) { + wp.update(makeServerTrampoline(this), ns, ops, options, callback); + } + + remove(ns, ops, options, callback) { + wp.remove(makeServerTrampoline(this), ns, ops, options, callback); + } +} + +/// This lets us emulate a legacy `Server` instance so we can work with the existing wire +/// protocol methods. Eventually, the operation executor will return a `Connection` to execute +/// against. +function makeServerTrampoline(connection) { + const server = { + description: connection.description, + clusterTime: connection[kClusterTime], + s: { + bson: connection.bson, + pool: { write: write.bind(connection), isConnected: () => true } + } + }; + + if (connection[kAutoEncrypter]) { + server.autoEncrypter = connection[kAutoEncrypter]; + } + + return server; +} + +function messageHandler(conn) { + return function messageHandler(message) { + // always emit the message, in case we are streaming + conn.emit('message', message); + if (!conn[kQueue].has(message.responseTo)) { + return; + } + + const operationDescription = conn[kQueue].get(message.responseTo); + const callback = operationDescription.cb; + + // SERVER-45775: For exhaust responses we should be able to use the same requestId to + // track response, however the server currently synthetically produces remote requests + // making the `responseTo` change on each response + conn[kQueue].delete(message.responseTo); + if (message.moreToCome) { + // requeue the callback for next synthetic request + conn[kQueue].set(message.requestId, operationDescription); + } else if (operationDescription.socketTimeoutOverride) { + conn[kStream].setTimeout(conn.socketTimeout); + } + + try { + // Pass in the entire description because it has BSON parsing options + message.parse(operationDescription); + } catch (err) { + callback(new MongoError(err)); + return; + } + + if (message.documents[0]) { + const document = message.documents[0]; + const session = operationDescription.session; + if (session) { + updateSessionFromResponse(session, document); + } + + if (document.$clusterTime) { + conn[kClusterTime] = document.$clusterTime; + conn.emit('clusterTimeReceived', document.$clusterTime); + } + + if (operationDescription.command) { + if (document.writeConcernError) { + callback(new MongoWriteConcernError(document.writeConcernError, document)); + return; + } + + if (document.ok === 0 || document.$err || document.errmsg || document.code) { + callback(new MongoError(document)); + return; + } + } + } + + // NODE-2382: reenable in our glorious non-leaky abstraction future + // callback(null, operationDescription.fullResult ? message : message.documents[0]); + + callback( + undefined, + new CommandResult( + operationDescription.fullResult ? message : message.documents[0], + conn, + message + ) + ); + }; +} + +function streamIdentifier(stream) { + if (typeof stream.address === 'function') { + return `${stream.remoteAddress}:${stream.remotePort}`; + } + + return uuidV4().toString('hex'); +} + +// Not meant to be called directly, the wire protocol methods call this assuming it is a `Pool` instance +function write(command, options, callback) { + if (typeof options === 'function') { + callback = options; + } + + options = options || {}; + const operationDescription = { + requestId: command.requestId, + cb: callback, + session: options.session, + fullResult: typeof options.fullResult === 'boolean' ? options.fullResult : false, + noResponse: typeof options.noResponse === 'boolean' ? options.noResponse : false, + documentsReturnedIn: options.documentsReturnedIn, + command: !!options.command, + + // for BSON parsing + promoteLongs: typeof options.promoteLongs === 'boolean' ? options.promoteLongs : true, + promoteValues: typeof options.promoteValues === 'boolean' ? options.promoteValues : true, + promoteBuffers: typeof options.promoteBuffers === 'boolean' ? options.promoteBuffers : false, + raw: typeof options.raw === 'boolean' ? options.raw : false + }; + + if (this[kDescription] && this[kDescription].compressor) { + operationDescription.agreedCompressor = this[kDescription].compressor; + + if (this[kDescription].zlibCompressionLevel) { + operationDescription.zlibCompressionLevel = this[kDescription].zlibCompressionLevel; + } + } + + if (typeof options.socketTimeout === 'number') { + operationDescription.socketTimeoutOverride = true; + this[kStream].setTimeout(options.socketTimeout); + } + + // if command monitoring is enabled we need to modify the callback here + if (this.monitorCommands) { + this.emit('commandStarted', new apm.CommandStartedEvent(this, command)); + + operationDescription.started = now(); + operationDescription.cb = (err, reply) => { + if (err) { + this.emit( + 'commandFailed', + new apm.CommandFailedEvent(this, command, err, operationDescription.started) + ); + } else { + if (reply && reply.result && (reply.result.ok === 0 || reply.result.$err)) { + this.emit( + 'commandFailed', + new apm.CommandFailedEvent(this, command, reply.result, operationDescription.started) + ); + } else { + this.emit( + 'commandSucceeded', + new apm.CommandSucceededEvent(this, command, reply, operationDescription.started) + ); + } + } + + if (typeof callback === 'function') { + callback(err, reply); + } + }; + } + + if (!operationDescription.noResponse) { + this[kQueue].set(operationDescription.requestId, operationDescription); + } + + try { + this[kMessageStream].writeCommand(command, operationDescription); + } catch (e) { + if (!operationDescription.noResponse) { + this[kQueue].delete(operationDescription.requestId); + operationDescription.cb(e); + return; + } + } + + if (operationDescription.noResponse) { + operationDescription.cb(); + } +} + +module.exports = { + Connection +}; diff --git a/node_modules/mongodb/lib/cmap/connection_pool.js b/node_modules/mongodb/lib/cmap/connection_pool.js new file mode 100644 index 00000000..4500d9a2 --- /dev/null +++ b/node_modules/mongodb/lib/cmap/connection_pool.js @@ -0,0 +1,591 @@ +'use strict'; + +const Denque = require('denque'); +const EventEmitter = require('events').EventEmitter; +const Logger = require('../core/connection/logger'); +const makeCounter = require('../utils').makeCounter; +const MongoError = require('../core/error').MongoError; +const Connection = require('./connection').Connection; +const eachAsync = require('../core/utils').eachAsync; +const connect = require('../core/connection/connect'); +const relayEvents = require('../core/utils').relayEvents; + +const errors = require('./errors'); +const PoolClosedError = errors.PoolClosedError; +const WaitQueueTimeoutError = errors.WaitQueueTimeoutError; + +const events = require('./events'); +const ConnectionPoolCreatedEvent = events.ConnectionPoolCreatedEvent; +const ConnectionPoolClosedEvent = events.ConnectionPoolClosedEvent; +const ConnectionCreatedEvent = events.ConnectionCreatedEvent; +const ConnectionReadyEvent = events.ConnectionReadyEvent; +const ConnectionClosedEvent = events.ConnectionClosedEvent; +const ConnectionCheckOutStartedEvent = events.ConnectionCheckOutStartedEvent; +const ConnectionCheckOutFailedEvent = events.ConnectionCheckOutFailedEvent; +const ConnectionCheckedOutEvent = events.ConnectionCheckedOutEvent; +const ConnectionCheckedInEvent = events.ConnectionCheckedInEvent; +const ConnectionPoolClearedEvent = events.ConnectionPoolClearedEvent; + +const kLogger = Symbol('logger'); +const kConnections = Symbol('connections'); +const kPermits = Symbol('permits'); +const kMinPoolSizeTimer = Symbol('minPoolSizeTimer'); +const kGeneration = Symbol('generation'); +const kConnectionCounter = Symbol('connectionCounter'); +const kCancellationToken = Symbol('cancellationToken'); +const kWaitQueue = Symbol('waitQueue'); +const kCancelled = Symbol('cancelled'); + +const VALID_POOL_OPTIONS = new Set([ + // `connect` options + 'ssl', + 'bson', + 'connectionType', + 'monitorCommands', + 'socketTimeout', + 'credentials', + 'compression', + + // node Net options + 'host', + 'port', + 'localAddress', + 'localPort', + 'family', + 'hints', + 'lookup', + 'path', + + // node TLS options + 'ca', + 'cert', + 'sigalgs', + 'ciphers', + 'clientCertEngine', + 'crl', + 'dhparam', + 'ecdhCurve', + 'honorCipherOrder', + 'key', + 'privateKeyEngine', + 'privateKeyIdentifier', + 'maxVersion', + 'minVersion', + 'passphrase', + 'pfx', + 'secureOptions', + 'secureProtocol', + 'sessionIdContext', + 'allowHalfOpen', + 'rejectUnauthorized', + 'pskCallback', + 'ALPNProtocols', + 'servername', + 'checkServerIdentity', + 'session', + 'minDHSize', + 'secureContext', + + // spec options + 'maxPoolSize', + 'minPoolSize', + 'maxIdleTimeMS', + 'waitQueueTimeoutMS' +]); + +function resolveOptions(options, defaults) { + const newOptions = Array.from(VALID_POOL_OPTIONS).reduce((obj, key) => { + if (Object.prototype.hasOwnProperty.call(options, key)) { + obj[key] = options[key]; + } + + return obj; + }, {}); + + return Object.freeze(Object.assign({}, defaults, newOptions)); +} + +/** + * Configuration options for drivers wrapping the node driver. + * + * @typedef {Object} ConnectionPoolOptions + * @property + * @property {string} [host] The host to connect to + * @property {number} [port] The port to connect to + * @property {bson} [bson] The BSON instance to use for new connections + * @property {number} [maxPoolSize=100] The maximum number of connections that may be associated with a pool at a given time. This includes in use and available connections. + * @property {number} [minPoolSize=0] The minimum number of connections that MUST exist at any moment in a single connection pool. + * @property {number} [maxIdleTimeMS] The maximum amount of time a connection should remain idle in the connection pool before being marked idle. + * @property {number} [waitQueueTimeoutMS=0] The maximum amount of time operation execution should wait for a connection to become available. The default is 0 which means there is no limit. + */ + +/** + * A pool of connections which dynamically resizes, and emit events related to pool activity + * + * @property {number} generation An integer representing the SDAM generation of the pool + * @property {number} totalConnectionCount An integer expressing how many total connections (active + in use) the pool currently has + * @property {number} availableConnectionCount An integer expressing how many connections are currently available in the pool. + * @property {string} address The address of the endpoint the pool is connected to + * + * @emits ConnectionPool#connectionPoolCreated + * @emits ConnectionPool#connectionPoolClosed + * @emits ConnectionPool#connectionCreated + * @emits ConnectionPool#connectionReady + * @emits ConnectionPool#connectionClosed + * @emits ConnectionPool#connectionCheckOutStarted + * @emits ConnectionPool#connectionCheckOutFailed + * @emits ConnectionPool#connectionCheckedOut + * @emits ConnectionPool#connectionCheckedIn + * @emits ConnectionPool#connectionPoolCleared + */ +class ConnectionPool extends EventEmitter { + /** + * Create a new Connection Pool + * + * @param {ConnectionPoolOptions} options + */ + constructor(options) { + super(); + options = options || {}; + + this.closed = false; + this.options = resolveOptions(options, { + connectionType: Connection, + maxPoolSize: typeof options.maxPoolSize === 'number' ? options.maxPoolSize : 100, + minPoolSize: typeof options.minPoolSize === 'number' ? options.minPoolSize : 0, + maxIdleTimeMS: typeof options.maxIdleTimeMS === 'number' ? options.maxIdleTimeMS : 0, + waitQueueTimeoutMS: + typeof options.waitQueueTimeoutMS === 'number' ? options.waitQueueTimeoutMS : 0, + autoEncrypter: options.autoEncrypter, + metadata: options.metadata + }); + + if (options.minSize > options.maxSize) { + throw new TypeError( + 'Connection pool minimum size must not be greater than maxiumum pool size' + ); + } + + this[kLogger] = Logger('ConnectionPool', options); + this[kConnections] = new Denque(); + this[kPermits] = this.options.maxPoolSize; + this[kMinPoolSizeTimer] = undefined; + this[kGeneration] = 0; + this[kConnectionCounter] = makeCounter(1); + this[kCancellationToken] = new EventEmitter(); + this[kCancellationToken].setMaxListeners(Infinity); + this[kWaitQueue] = new Denque(); + + process.nextTick(() => { + this.emit('connectionPoolCreated', new ConnectionPoolCreatedEvent(this)); + ensureMinPoolSize(this); + }); + } + + get address() { + return `${this.options.host}:${this.options.port}`; + } + + get generation() { + return this[kGeneration]; + } + + get totalConnectionCount() { + return this[kConnections].length + (this.options.maxPoolSize - this[kPermits]); + } + + get availableConnectionCount() { + return this[kConnections].length; + } + + get waitQueueSize() { + return this[kWaitQueue].length; + } + + /** + * Check a connection out of this pool. The connection will continue to be tracked, but no reference to it + * will be held by the pool. This means that if a connection is checked out it MUST be checked back in or + * explicitly destroyed by the new owner. + * + * @param {ConnectionPool~checkOutCallback} callback + */ + checkOut(callback) { + this.emit('connectionCheckOutStarted', new ConnectionCheckOutStartedEvent(this)); + + if (this.closed) { + this.emit('connectionCheckOutFailed', new ConnectionCheckOutFailedEvent(this, 'poolClosed')); + callback(new PoolClosedError(this)); + return; + } + + const waitQueueMember = { callback }; + + const pool = this; + const waitQueueTimeoutMS = this.options.waitQueueTimeoutMS; + if (waitQueueTimeoutMS) { + waitQueueMember.timer = setTimeout(() => { + waitQueueMember[kCancelled] = true; + waitQueueMember.timer = undefined; + + pool.emit('connectionCheckOutFailed', new ConnectionCheckOutFailedEvent(pool, 'timeout')); + waitQueueMember.callback(new WaitQueueTimeoutError(pool)); + }, waitQueueTimeoutMS); + } + + this[kWaitQueue].push(waitQueueMember); + process.nextTick(() => processWaitQueue(this)); + } + + /** + * Check a connection into the pool. + * + * @param {Connection} connection The connection to check in + */ + checkIn(connection) { + const poolClosed = this.closed; + const stale = connectionIsStale(this, connection); + const willDestroy = !!(poolClosed || stale || connection.closed); + + if (!willDestroy) { + connection.markAvailable(); + this[kConnections].push(connection); + } + + this.emit('connectionCheckedIn', new ConnectionCheckedInEvent(this, connection)); + + if (willDestroy) { + const reason = connection.closed ? 'error' : poolClosed ? 'poolClosed' : 'stale'; + destroyConnection(this, connection, reason); + } + + process.nextTick(() => processWaitQueue(this)); + } + + /** + * Clear the pool + * + * Pool reset is handled by incrementing the pool's generation count. Any existing connection of a + * previous generation will eventually be pruned during subsequent checkouts. + */ + clear() { + this[kGeneration] += 1; + this.emit('connectionPoolCleared', new ConnectionPoolClearedEvent(this)); + } + + /** + * Close the pool + * + * @param {object} [options] Optional settings + * @param {boolean} [options.force] Force close connections + * @param {Function} callback + */ + close(options, callback) { + if (typeof options === 'function') { + callback = options; + } + + options = Object.assign({ force: false }, options); + if (this.closed) { + return callback(); + } + + // immediately cancel any in-flight connections + this[kCancellationToken].emit('cancel'); + + // drain the wait queue + while (this.waitQueueSize) { + const waitQueueMember = this[kWaitQueue].pop(); + clearTimeout(waitQueueMember.timer); + if (!waitQueueMember[kCancelled]) { + waitQueueMember.callback(new MongoError('connection pool closed')); + } + } + + // clear the min pool size timer + if (this[kMinPoolSizeTimer]) { + clearTimeout(this[kMinPoolSizeTimer]); + } + + // end the connection counter + if (typeof this[kConnectionCounter].return === 'function') { + this[kConnectionCounter].return(); + } + + // mark the pool as closed immediately + this.closed = true; + + eachAsync( + this[kConnections].toArray(), + (conn, cb) => { + this.emit('connectionClosed', new ConnectionClosedEvent(this, conn, 'poolClosed')); + conn.destroy(options, cb); + }, + err => { + this[kConnections].clear(); + this.emit('connectionPoolClosed', new ConnectionPoolClosedEvent(this)); + callback(err); + } + ); + } + + /** + * Runs a lambda with an implicitly checked out connection, checking that connection back in when the lambda + * has completed by calling back. + * + * NOTE: please note the required signature of `fn` + * + * @param {ConnectionPool~withConnectionCallback} fn A function which operates on a managed connection + * @param {Function} callback The original callback + * @return {Promise} + */ + withConnection(fn, callback) { + this.checkOut((err, conn) => { + // don't callback with `err` here, we might want to act upon it inside `fn` + + fn(err, conn, (fnErr, result) => { + if (typeof callback === 'function') { + if (fnErr) { + callback(fnErr); + } else { + callback(undefined, result); + } + } + + if (conn) { + this.checkIn(conn); + } + }); + }); + } +} + +function ensureMinPoolSize(pool) { + if (pool.closed || pool.options.minPoolSize === 0) { + return; + } + + const minPoolSize = pool.options.minPoolSize; + for (let i = pool.totalConnectionCount; i < minPoolSize; ++i) { + createConnection(pool); + } + + pool[kMinPoolSizeTimer] = setTimeout(() => ensureMinPoolSize(pool), 10); +} + +function connectionIsStale(pool, connection) { + return connection.generation !== pool[kGeneration]; +} + +function connectionIsIdle(pool, connection) { + return !!(pool.options.maxIdleTimeMS && connection.idleTime > pool.options.maxIdleTimeMS); +} + +function createConnection(pool, callback) { + const connectOptions = Object.assign( + { + id: pool[kConnectionCounter].next().value, + generation: pool[kGeneration] + }, + pool.options + ); + + pool[kPermits]--; + connect(connectOptions, pool[kCancellationToken], (err, connection) => { + if (err) { + pool[kPermits]++; + pool[kLogger].debug(`connection attempt failed with error [${JSON.stringify(err)}]`); + if (typeof callback === 'function') { + callback(err); + } + + return; + } + + // The pool might have closed since we started trying to create a connection + if (pool.closed) { + connection.destroy({ force: true }); + return; + } + + // forward all events from the connection to the pool + relayEvents(connection, pool, [ + 'commandStarted', + 'commandFailed', + 'commandSucceeded', + 'clusterTimeReceived' + ]); + + pool.emit('connectionCreated', new ConnectionCreatedEvent(pool, connection)); + + connection.markAvailable(); + pool.emit('connectionReady', new ConnectionReadyEvent(pool, connection)); + + // if a callback has been provided, check out the connection immediately + if (typeof callback === 'function') { + callback(undefined, connection); + return; + } + + // otherwise add it to the pool for later acquisition, and try to process the wait queue + pool[kConnections].push(connection); + process.nextTick(() => processWaitQueue(pool)); + }); +} + +function destroyConnection(pool, connection, reason) { + pool.emit('connectionClosed', new ConnectionClosedEvent(pool, connection, reason)); + + // allow more connections to be created + pool[kPermits]++; + + // destroy the connection + process.nextTick(() => connection.destroy()); +} + +function processWaitQueue(pool) { + if (pool.closed) { + return; + } + + while (pool.waitQueueSize) { + const waitQueueMember = pool[kWaitQueue].peekFront(); + if (waitQueueMember[kCancelled]) { + pool[kWaitQueue].shift(); + continue; + } + + if (!pool.availableConnectionCount) { + break; + } + + const connection = pool[kConnections].shift(); + const isStale = connectionIsStale(pool, connection); + const isIdle = connectionIsIdle(pool, connection); + if (!isStale && !isIdle && !connection.closed) { + pool.emit('connectionCheckedOut', new ConnectionCheckedOutEvent(pool, connection)); + clearTimeout(waitQueueMember.timer); + pool[kWaitQueue].shift(); + waitQueueMember.callback(undefined, connection); + return; + } + + const reason = connection.closed ? 'error' : isStale ? 'stale' : 'idle'; + destroyConnection(pool, connection, reason); + } + + const maxPoolSize = pool.options.maxPoolSize; + if (pool.waitQueueSize && (maxPoolSize <= 0 || pool.totalConnectionCount < maxPoolSize)) { + createConnection(pool, (err, connection) => { + const waitQueueMember = pool[kWaitQueue].shift(); + if (waitQueueMember == null || waitQueueMember[kCancelled]) { + if (err == null) { + pool[kConnections].push(connection); + } + + return; + } + + if (err) { + pool.emit('connectionCheckOutFailed', new ConnectionCheckOutFailedEvent(pool, err)); + } else { + pool.emit('connectionCheckedOut', new ConnectionCheckedOutEvent(pool, connection)); + } + + clearTimeout(waitQueueMember.timer); + waitQueueMember.callback(err, connection); + }); + + return; + } +} + +/** + * A callback provided to `withConnection` + * + * @callback ConnectionPool~withConnectionCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Connection} connection The managed connection which was checked out of the pool. + * @param {Function} callback A function to call back after connection management is complete + */ + +/** + * A callback provided to `checkOut` + * + * @callback ConnectionPool~checkOutCallback + * @param {MongoError} error An error instance representing the error during checkout + * @param {Connection} connection A connection from the pool + */ + +/** + * Emitted once when the connection pool is created + * + * @event ConnectionPool#connectionPoolCreated + * @type {PoolCreatedEvent} + */ + +/** + * Emitted once when the connection pool is closed + * + * @event ConnectionPool#connectionPoolClosed + * @type {PoolClosedEvent} + */ + +/** + * Emitted each time a connection is created + * + * @event ConnectionPool#connectionCreated + * @type {ConnectionCreatedEvent} + */ + +/** + * Emitted when a connection becomes established, and is ready to use + * + * @event ConnectionPool#connectionReady + * @type {ConnectionReadyEvent} + */ + +/** + * Emitted when a connection is closed + * + * @event ConnectionPool#connectionClosed + * @type {ConnectionClosedEvent} + */ + +/** + * Emitted when an attempt to check out a connection begins + * + * @event ConnectionPool#connectionCheckOutStarted + * @type {ConnectionCheckOutStartedEvent} + */ + +/** + * Emitted when an attempt to check out a connection fails + * + * @event ConnectionPool#connectionCheckOutFailed + * @type {ConnectionCheckOutFailedEvent} + */ + +/** + * Emitted each time a connection is successfully checked out of the connection pool + * + * @event ConnectionPool#connectionCheckedOut + * @type {ConnectionCheckedOutEvent} + */ + +/** + * Emitted each time a connection is successfully checked into the connection pool + * + * @event ConnectionPool#connectionCheckedIn + * @type {ConnectionCheckedInEvent} + */ + +/** + * Emitted each time the connection pool is cleared and it's generation incremented + * + * @event ConnectionPool#connectionPoolCleared + * @type {PoolClearedEvent} + */ + +module.exports = { + ConnectionPool +}; diff --git a/node_modules/mongodb/lib/cmap/errors.js b/node_modules/mongodb/lib/cmap/errors.js new file mode 100644 index 00000000..d9330195 --- /dev/null +++ b/node_modules/mongodb/lib/cmap/errors.js @@ -0,0 +1,35 @@ +'use strict'; +const MongoError = require('../core/error').MongoError; + +/** + * An error indicating a connection pool is closed + * + * @property {string} address The address of the connection pool + * @extends MongoError + */ +class PoolClosedError extends MongoError { + constructor(pool) { + super('Attempted to check out a connection from closed connection pool'); + this.name = 'MongoPoolClosedError'; + this.address = pool.address; + } +} + +/** + * An error thrown when a request to check out a connection times out + * + * @property {string} address The address of the connection pool + * @extends MongoError + */ +class WaitQueueTimeoutError extends MongoError { + constructor(pool) { + super('Timed out while checking out a connection from connection pool'); + this.name = 'MongoWaitQueueTimeoutError'; + this.address = pool.address; + } +} + +module.exports = { + PoolClosedError, + WaitQueueTimeoutError +}; diff --git a/node_modules/mongodb/lib/cmap/events.js b/node_modules/mongodb/lib/cmap/events.js new file mode 100644 index 00000000..dcc8b675 --- /dev/null +++ b/node_modules/mongodb/lib/cmap/events.js @@ -0,0 +1,154 @@ +'use strict'; + +/** + * The base class for all monitoring events published from the connection pool + * + * @property {number} time A timestamp when the event was created + * @property {string} address The address (host/port pair) of the pool + */ +class ConnectionPoolMonitoringEvent { + constructor(pool) { + this.time = new Date(); + this.address = pool.address; + } +} + +/** + * An event published when a connection pool is created + * + * @property {Object} options The options used to create this connection pool + */ +class ConnectionPoolCreatedEvent extends ConnectionPoolMonitoringEvent { + constructor(pool) { + super(pool); + this.options = pool.options; + } +} + +/** + * An event published when a connection pool is closed + */ +class ConnectionPoolClosedEvent extends ConnectionPoolMonitoringEvent { + constructor(pool) { + super(pool); + } +} + +/** + * An event published when a connection pool creates a new connection + * + * @property {number} connectionId A monotonically increasing, per-pool id for the newly created connection + */ +class ConnectionCreatedEvent extends ConnectionPoolMonitoringEvent { + constructor(pool, connection) { + super(pool); + this.connectionId = connection.id; + } +} + +/** + * An event published when a connection is ready for use + * + * @property {number} connectionId The id of the connection + */ +class ConnectionReadyEvent extends ConnectionPoolMonitoringEvent { + constructor(pool, connection) { + super(pool); + this.connectionId = connection.id; + } +} + +/** + * An event published when a connection is closed + * + * @property {number} connectionId The id of the connection + * @property {string} reason The reason the connection was closed + */ +class ConnectionClosedEvent extends ConnectionPoolMonitoringEvent { + constructor(pool, connection, reason) { + super(pool); + this.connectionId = connection.id; + this.reason = reason || 'unknown'; + } +} + +/** + * An event published when a request to check a connection out begins + */ +class ConnectionCheckOutStartedEvent extends ConnectionPoolMonitoringEvent { + constructor(pool) { + super(pool); + } +} + +/** + * An event published when a request to check a connection out fails + * + * @property {string} reason The reason the attempt to check out failed + */ +class ConnectionCheckOutFailedEvent extends ConnectionPoolMonitoringEvent { + constructor(pool, reason) { + super(pool); + this.reason = reason; + } +} + +/** + * An event published when a connection is checked out of the connection pool + * + * @property {number} connectionId The id of the connection + */ +class ConnectionCheckedOutEvent extends ConnectionPoolMonitoringEvent { + constructor(pool, connection) { + super(pool); + this.connectionId = connection.id; + } +} + +/** + * An event published when a connection is checked into the connection pool + * + * @property {number} connectionId The id of the connection + */ +class ConnectionCheckedInEvent extends ConnectionPoolMonitoringEvent { + constructor(pool, connection) { + super(pool); + this.connectionId = connection.id; + } +} + +/** + * An event published when a connection pool is cleared + */ +class ConnectionPoolClearedEvent extends ConnectionPoolMonitoringEvent { + constructor(pool) { + super(pool); + } +} + +const CMAP_EVENT_NAMES = [ + 'connectionPoolCreated', + 'connectionPoolClosed', + 'connectionCreated', + 'connectionReady', + 'connectionClosed', + 'connectionCheckOutStarted', + 'connectionCheckOutFailed', + 'connectionCheckedOut', + 'connectionCheckedIn', + 'connectionPoolCleared' +]; + +module.exports = { + CMAP_EVENT_NAMES, + ConnectionPoolCreatedEvent, + ConnectionPoolClosedEvent, + ConnectionCreatedEvent, + ConnectionReadyEvent, + ConnectionClosedEvent, + ConnectionCheckOutStartedEvent, + ConnectionCheckOutFailedEvent, + ConnectionCheckedOutEvent, + ConnectionCheckedInEvent, + ConnectionPoolClearedEvent +}; diff --git a/node_modules/mongodb/lib/cmap/message_stream.js b/node_modules/mongodb/lib/cmap/message_stream.js new file mode 100644 index 00000000..c8f458e5 --- /dev/null +++ b/node_modules/mongodb/lib/cmap/message_stream.js @@ -0,0 +1,196 @@ +'use strict'; + +const Duplex = require('stream').Duplex; +const BufferList = require('bl'); +const MongoParseError = require('../core/error').MongoParseError; +const decompress = require('../core/wireprotocol/compression').decompress; +const Response = require('../core/connection/commands').Response; +const BinMsg = require('../core/connection/msg').BinMsg; +const MongoError = require('../core/error').MongoError; +const OP_COMPRESSED = require('../core/wireprotocol/shared').opcodes.OP_COMPRESSED; +const OP_MSG = require('../core/wireprotocol/shared').opcodes.OP_MSG; +const MESSAGE_HEADER_SIZE = require('../core/wireprotocol/shared').MESSAGE_HEADER_SIZE; +const COMPRESSION_DETAILS_SIZE = require('../core/wireprotocol/shared').COMPRESSION_DETAILS_SIZE; +const opcodes = require('../core/wireprotocol/shared').opcodes; +const compress = require('../core/wireprotocol/compression').compress; +const compressorIDs = require('../core/wireprotocol/compression').compressorIDs; +const uncompressibleCommands = require('../core/wireprotocol/compression').uncompressibleCommands; +const Msg = require('../core/connection/msg').Msg; + +const kDefaultMaxBsonMessageSize = 1024 * 1024 * 16 * 4; +const kBuffer = Symbol('buffer'); + +/** + * A duplex stream that is capable of reading and writing raw wire protocol messages, with + * support for optional compression + */ +class MessageStream extends Duplex { + constructor(options) { + options = options || {}; + super(options); + + this.bson = options.bson; + this.maxBsonMessageSize = options.maxBsonMessageSize || kDefaultMaxBsonMessageSize; + + this[kBuffer] = new BufferList(); + } + + _write(chunk, _, callback) { + const buffer = this[kBuffer]; + buffer.append(chunk); + + processIncomingData(this, callback); + } + + _read(/* size */) { + // NOTE: This implementation is empty because we explicitly push data to be read + // when `writeMessage` is called. + return; + } + + writeCommand(command, operationDescription) { + // TODO: agreed compressor should live in `StreamDescription` + const shouldCompress = operationDescription && !!operationDescription.agreedCompressor; + if (!shouldCompress || !canCompress(command)) { + const data = command.toBin(); + this.push(Array.isArray(data) ? Buffer.concat(data) : data); + return; + } + + // otherwise, compress the message + const concatenatedOriginalCommandBuffer = Buffer.concat(command.toBin()); + const messageToBeCompressed = concatenatedOriginalCommandBuffer.slice(MESSAGE_HEADER_SIZE); + + // Extract information needed for OP_COMPRESSED from the uncompressed message + const originalCommandOpCode = concatenatedOriginalCommandBuffer.readInt32LE(12); + + // Compress the message body + compress({ options: operationDescription }, messageToBeCompressed, (err, compressedMessage) => { + if (err) { + operationDescription.cb(err, null); + return; + } + + // Create the msgHeader of OP_COMPRESSED + const msgHeader = Buffer.alloc(MESSAGE_HEADER_SIZE); + msgHeader.writeInt32LE( + MESSAGE_HEADER_SIZE + COMPRESSION_DETAILS_SIZE + compressedMessage.length, + 0 + ); // messageLength + msgHeader.writeInt32LE(command.requestId, 4); // requestID + msgHeader.writeInt32LE(0, 8); // responseTo (zero) + msgHeader.writeInt32LE(opcodes.OP_COMPRESSED, 12); // opCode + + // Create the compression details of OP_COMPRESSED + const compressionDetails = Buffer.alloc(COMPRESSION_DETAILS_SIZE); + compressionDetails.writeInt32LE(originalCommandOpCode, 0); // originalOpcode + compressionDetails.writeInt32LE(messageToBeCompressed.length, 4); // Size of the uncompressed compressedMessage, excluding the MsgHeader + compressionDetails.writeUInt8(compressorIDs[operationDescription.agreedCompressor], 8); // compressorID + + this.push(Buffer.concat([msgHeader, compressionDetails, compressedMessage])); + }); + } +} + +// Return whether a command contains an uncompressible command term +// Will return true if command contains no uncompressible command terms +function canCompress(command) { + const commandDoc = command instanceof Msg ? command.command : command.query; + const commandName = Object.keys(commandDoc)[0]; + return !uncompressibleCommands.has(commandName); +} + +function processIncomingData(stream, callback) { + const buffer = stream[kBuffer]; + if (buffer.length < 4) { + callback(); + return; + } + + const sizeOfMessage = buffer.readInt32LE(0); + if (sizeOfMessage < 0) { + callback(new MongoParseError(`Invalid message size: ${sizeOfMessage}`)); + return; + } + + if (sizeOfMessage > stream.maxBsonMessageSize) { + callback( + new MongoParseError( + `Invalid message size: ${sizeOfMessage}, max allowed: ${stream.maxBsonMessageSize}` + ) + ); + return; + } + + if (sizeOfMessage > buffer.length) { + callback(); + return; + } + + const message = buffer.slice(0, sizeOfMessage); + buffer.consume(sizeOfMessage); + + const messageHeader = { + length: message.readInt32LE(0), + requestId: message.readInt32LE(4), + responseTo: message.readInt32LE(8), + opCode: message.readInt32LE(12) + }; + + let ResponseType = messageHeader.opCode === OP_MSG ? BinMsg : Response; + const responseOptions = stream.responseOptions; + if (messageHeader.opCode !== OP_COMPRESSED) { + const messageBody = message.slice(MESSAGE_HEADER_SIZE); + stream.emit( + 'message', + new ResponseType(stream.bson, message, messageHeader, messageBody, responseOptions) + ); + + if (buffer.length >= 4) { + processIncomingData(stream, callback); + } else { + callback(); + } + + return; + } + + messageHeader.fromCompressed = true; + messageHeader.opCode = message.readInt32LE(MESSAGE_HEADER_SIZE); + messageHeader.length = message.readInt32LE(MESSAGE_HEADER_SIZE + 4); + const compressorID = message[MESSAGE_HEADER_SIZE + 8]; + const compressedBuffer = message.slice(MESSAGE_HEADER_SIZE + 9); + + // recalculate based on wrapped opcode + ResponseType = messageHeader.opCode === OP_MSG ? BinMsg : Response; + + decompress(compressorID, compressedBuffer, (err, messageBody) => { + if (err) { + callback(err); + return; + } + + if (messageBody.length !== messageHeader.length) { + callback( + new MongoError( + 'Decompressing a compressed message from the server failed. The message is corrupt.' + ) + ); + + return; + } + + stream.emit( + 'message', + new ResponseType(stream.bson, message, messageHeader, messageBody, responseOptions) + ); + + if (buffer.length >= 4) { + processIncomingData(stream, callback); + } else { + callback(); + } + }); +} + +module.exports = MessageStream; diff --git a/node_modules/mongodb/lib/cmap/stream_description.js b/node_modules/mongodb/lib/cmap/stream_description.js new file mode 100644 index 00000000..e806a5f6 --- /dev/null +++ b/node_modules/mongodb/lib/cmap/stream_description.js @@ -0,0 +1,45 @@ +'use strict'; +const parseServerType = require('../core/sdam/server_description').parseServerType; + +const RESPONSE_FIELDS = [ + 'minWireVersion', + 'maxWireVersion', + 'maxBsonObjectSize', + 'maxMessageSizeBytes', + 'maxWriteBatchSize', + '__nodejs_mock_server__' +]; + +class StreamDescription { + constructor(address, options) { + this.address = address; + this.type = parseServerType(null); + this.minWireVersion = undefined; + this.maxWireVersion = undefined; + this.maxBsonObjectSize = 16777216; + this.maxMessageSizeBytes = 48000000; + this.maxWriteBatchSize = 100000; + this.compressors = + options && options.compression && Array.isArray(options.compression.compressors) + ? options.compression.compressors + : []; + } + + receiveResponse(response) { + this.type = parseServerType(response); + + RESPONSE_FIELDS.forEach(field => { + if (typeof response[field] !== 'undefined') { + this[field] = response[field]; + } + }); + + if (response.compression) { + this.compressor = this.compressors.filter(c => response.compression.indexOf(c) !== -1)[0]; + } + } +} + +module.exports = { + StreamDescription +}; diff --git a/node_modules/mongodb/lib/collection.js b/node_modules/mongodb/lib/collection.js new file mode 100644 index 00000000..5d1a1c68 --- /dev/null +++ b/node_modules/mongodb/lib/collection.js @@ -0,0 +1,2224 @@ +'use strict'; + +const deprecate = require('util').deprecate; +const deprecateOptions = require('./utils').deprecateOptions; +const checkCollectionName = require('./utils').checkCollectionName; +const ObjectID = require('./core').BSON.ObjectID; +const MongoError = require('./core').MongoError; +const normalizeHintField = require('./utils').normalizeHintField; +const decorateCommand = require('./utils').decorateCommand; +const decorateWithCollation = require('./utils').decorateWithCollation; +const decorateWithReadConcern = require('./utils').decorateWithReadConcern; +const formattedOrderClause = require('./utils').formattedOrderClause; +const ReadPreference = require('./core').ReadPreference; +const unordered = require('./bulk/unordered'); +const ordered = require('./bulk/ordered'); +const ChangeStream = require('./change_stream'); +const executeLegacyOperation = require('./utils').executeLegacyOperation; +const WriteConcern = require('./write_concern'); +const ReadConcern = require('./read_concern'); +const MongoDBNamespace = require('./utils').MongoDBNamespace; +const AggregationCursor = require('./aggregation_cursor'); +const CommandCursor = require('./command_cursor'); + +// Operations +const ensureIndex = require('./operations/collection_ops').ensureIndex; +const group = require('./operations/collection_ops').group; +const parallelCollectionScan = require('./operations/collection_ops').parallelCollectionScan; +const removeDocuments = require('./operations/common_functions').removeDocuments; +const save = require('./operations/collection_ops').save; +const updateDocuments = require('./operations/common_functions').updateDocuments; + +const AggregateOperation = require('./operations/aggregate'); +const BulkWriteOperation = require('./operations/bulk_write'); +const CountDocumentsOperation = require('./operations/count_documents'); +const CreateIndexesOperation = require('./operations/create_indexes'); +const DeleteManyOperation = require('./operations/delete_many'); +const DeleteOneOperation = require('./operations/delete_one'); +const DistinctOperation = require('./operations/distinct'); +const DropCollectionOperation = require('./operations/drop').DropCollectionOperation; +const DropIndexOperation = require('./operations/drop_index'); +const DropIndexesOperation = require('./operations/drop_indexes'); +const EstimatedDocumentCountOperation = require('./operations/estimated_document_count'); +const FindOperation = require('./operations/find'); +const FindOneOperation = require('./operations/find_one'); +const FindAndModifyOperation = require('./operations/find_and_modify'); +const FindOneAndDeleteOperation = require('./operations/find_one_and_delete'); +const FindOneAndReplaceOperation = require('./operations/find_one_and_replace'); +const FindOneAndUpdateOperation = require('./operations/find_one_and_update'); +const GeoHaystackSearchOperation = require('./operations/geo_haystack_search'); +const IndexesOperation = require('./operations/indexes'); +const IndexExistsOperation = require('./operations/index_exists'); +const IndexInformationOperation = require('./operations/index_information'); +const InsertManyOperation = require('./operations/insert_many'); +const InsertOneOperation = require('./operations/insert_one'); +const IsCappedOperation = require('./operations/is_capped'); +const ListIndexesOperation = require('./operations/list_indexes'); +const MapReduceOperation = require('./operations/map_reduce'); +const OptionsOperation = require('./operations/options_operation'); +const RenameOperation = require('./operations/rename'); +const ReIndexOperation = require('./operations/re_index'); +const ReplaceOneOperation = require('./operations/replace_one'); +const StatsOperation = require('./operations/stats'); +const UpdateManyOperation = require('./operations/update_many'); +const UpdateOneOperation = require('./operations/update_one'); + +const executeOperation = require('./operations/execute_operation'); + +/** + * @fileOverview The **Collection** class is an internal class that embodies a MongoDB collection + * allowing for insert/update/remove/find and other command operation on that MongoDB collection. + * + * **COLLECTION Cannot directly be instantiated** + * @example + * const MongoClient = require('mongodb').MongoClient; + * const test = require('assert'); + * // Connection url + * const url = 'mongodb://localhost:27017'; + * // Database Name + * const dbName = 'test'; + * // Connect using MongoClient + * MongoClient.connect(url, function(err, client) { + * // Create a collection we want to drop later + * const col = client.db(dbName).collection('createIndexExample1'); + * // Show that duplicate records got dropped + * col.find({}).toArray(function(err, items) { + * test.equal(null, err); + * test.equal(4, items.length); + * client.close(); + * }); + * }); + */ + +const mergeKeys = ['ignoreUndefined']; + +/** + * Create a new Collection instance (INTERNAL TYPE, do not instantiate directly) + * @class + */ +function Collection(db, topology, dbName, name, pkFactory, options) { + checkCollectionName(name); + + // Unpack variables + const internalHint = null; + const slaveOk = options == null || options.slaveOk == null ? db.slaveOk : options.slaveOk; + const serializeFunctions = + options == null || options.serializeFunctions == null + ? db.s.options.serializeFunctions + : options.serializeFunctions; + const raw = options == null || options.raw == null ? db.s.options.raw : options.raw; + const promoteLongs = + options == null || options.promoteLongs == null + ? db.s.options.promoteLongs + : options.promoteLongs; + const promoteValues = + options == null || options.promoteValues == null + ? db.s.options.promoteValues + : options.promoteValues; + const promoteBuffers = + options == null || options.promoteBuffers == null + ? db.s.options.promoteBuffers + : options.promoteBuffers; + const collectionHint = null; + + const namespace = new MongoDBNamespace(dbName, name); + + // Get the promiseLibrary + const promiseLibrary = options.promiseLibrary || Promise; + + // Set custom primary key factory if provided + pkFactory = pkFactory == null ? ObjectID : pkFactory; + + // Internal state + this.s = { + // Set custom primary key factory if provided + pkFactory: pkFactory, + // Db + db: db, + // Topology + topology: topology, + // Options + options: options, + // Namespace + namespace: namespace, + // Read preference + readPreference: ReadPreference.fromOptions(options), + // SlaveOK + slaveOk: slaveOk, + // Serialize functions + serializeFunctions: serializeFunctions, + // Raw + raw: raw, + // promoteLongs + promoteLongs: promoteLongs, + // promoteValues + promoteValues: promoteValues, + // promoteBuffers + promoteBuffers: promoteBuffers, + // internalHint + internalHint: internalHint, + // collectionHint + collectionHint: collectionHint, + // Promise library + promiseLibrary: promiseLibrary, + // Read Concern + readConcern: ReadConcern.fromOptions(options), + // Write Concern + writeConcern: WriteConcern.fromOptions(options) + }; +} + +/** + * The name of the database this collection belongs to + * @member {string} dbName + * @memberof Collection# + * @readonly + */ +Object.defineProperty(Collection.prototype, 'dbName', { + enumerable: true, + get: function() { + return this.s.namespace.db; + } +}); + +/** + * The name of this collection + * @member {string} collectionName + * @memberof Collection# + * @readonly + */ +Object.defineProperty(Collection.prototype, 'collectionName', { + enumerable: true, + get: function() { + return this.s.namespace.collection; + } +}); + +/** + * The namespace of this collection, in the format `${this.dbName}.${this.collectionName}` + * @member {string} namespace + * @memberof Collection# + * @readonly + */ +Object.defineProperty(Collection.prototype, 'namespace', { + enumerable: true, + get: function() { + return this.s.namespace.toString(); + } +}); + +/** + * The current readConcern of the collection. If not explicitly defined for + * this collection, will be inherited from the parent DB + * @member {ReadConcern} [readConcern] + * @memberof Collection# + * @readonly + */ +Object.defineProperty(Collection.prototype, 'readConcern', { + enumerable: true, + get: function() { + if (this.s.readConcern == null) { + return this.s.db.readConcern; + } + return this.s.readConcern; + } +}); + +/** + * The current readPreference of the collection. If not explicitly defined for + * this collection, will be inherited from the parent DB + * @member {ReadPreference} [readPreference] + * @memberof Collection# + * @readonly + */ +Object.defineProperty(Collection.prototype, 'readPreference', { + enumerable: true, + get: function() { + if (this.s.readPreference == null) { + return this.s.db.readPreference; + } + + return this.s.readPreference; + } +}); + +/** + * The current writeConcern of the collection. If not explicitly defined for + * this collection, will be inherited from the parent DB + * @member {WriteConcern} [writeConcern] + * @memberof Collection# + * @readonly + */ +Object.defineProperty(Collection.prototype, 'writeConcern', { + enumerable: true, + get: function() { + if (this.s.writeConcern == null) { + return this.s.db.writeConcern; + } + return this.s.writeConcern; + } +}); + +/** + * The current index hint for the collection + * @member {object} [hint] + * @memberof Collection# + */ +Object.defineProperty(Collection.prototype, 'hint', { + enumerable: true, + get: function() { + return this.s.collectionHint; + }, + set: function(v) { + this.s.collectionHint = normalizeHintField(v); + } +}); + +const DEPRECATED_FIND_OPTIONS = ['maxScan', 'fields', 'snapshot', 'oplogReplay']; + +/** + * Creates a cursor for a query that can be used to iterate over results from MongoDB + * @method + * @param {object} [query={}] The cursor query object. + * @param {object} [options] Optional settings. + * @param {number} [options.limit=0] Sets the limit of documents returned in the query. + * @param {(array|object)} [options.sort] Set to sort the documents coming back from the query. Array of indexes, [['a', 1]] etc. + * @param {object} [options.projection] The fields to return in the query. Object of fields to either include or exclude (one of, not both), {'a':1, 'b': 1} **or** {'a': 0, 'b': 0} + * @param {object} [options.fields] **Deprecated** Use `options.projection` instead + * @param {number} [options.skip=0] Set to skip N documents ahead in your query (useful for pagination). + * @param {Object} [options.hint] Tell the query to use specific indexes in the query. Object of indexes to use, {'_id':1} + * @param {boolean} [options.snapshot=false] DEPRECATED: Snapshot query. + * @param {boolean} [options.timeout=false] Specify if the cursor can timeout. + * @param {boolean} [options.tailable=false] Specify if the cursor is tailable. + * @param {boolean} [options.awaitData=false] Specify if the cursor is a a tailable-await cursor. Requires `tailable` to be true + * @param {number} [options.batchSize=1000] Set the batchSize for the getMoreCommand when iterating over the query results. + * @param {boolean} [options.returnKey=false] Only return the index key. + * @param {number} [options.maxScan] DEPRECATED: Limit the number of items to scan. + * @param {number} [options.min] Set index bounds. + * @param {number} [options.max] Set index bounds. + * @param {boolean} [options.showDiskLoc=false] Show disk location of results. + * @param {string} [options.comment] You can put a $comment field on a query to make looking in the profiler logs simpler. + * @param {boolean} [options.raw=false] Return document results as raw BSON buffers. + * @param {boolean} [options.promoteLongs=true] Promotes Long values to number if they fit inside the 53 bits resolution. + * @param {boolean} [options.promoteValues=true] Promotes BSON values to native types where possible, set to false to only receive wrapper types. + * @param {boolean} [options.promoteBuffers=false] Promotes Binary BSON values to native Node Buffers. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {boolean} [options.partial=false] Specify if the cursor should return partial results when querying against a sharded system + * @param {number} [options.maxTimeMS] Number of milliseconds to wait before aborting the query. + * @param {number} [options.maxAwaitTimeMS] The maximum amount of time for the server to wait on new documents to satisfy a tailable cursor query. Requires `tailable` and `awaitData` to be true + * @param {boolean} [options.noCursorTimeout] The server normally times out idle cursors after an inactivity period (10 minutes) to prevent excess memory use. Set this option to prevent that. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {boolean} [options.allowDiskUse] Enables writing to temporary files on the server. + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] optional session to use for this operation + * @throws {MongoError} + * @return {Cursor} + */ +Collection.prototype.find = deprecateOptions( + { + name: 'collection.find', + deprecatedOptions: DEPRECATED_FIND_OPTIONS, + optionsIndex: 1 + }, + function(query, options, callback) { + if (typeof callback === 'object') { + // TODO(MAJOR): throw in the future + console.warn('Third parameter to `find()` must be a callback or undefined'); + } + + let selector = query; + // figuring out arguments + if (typeof callback !== 'function') { + if (typeof options === 'function') { + callback = options; + options = undefined; + } else if (options == null) { + callback = typeof selector === 'function' ? selector : undefined; + selector = typeof selector === 'object' ? selector : undefined; + } + } + + // Ensure selector is not null + selector = selector == null ? {} : selector; + // Validate correctness off the selector + const object = selector; + if (Buffer.isBuffer(object)) { + const object_size = object[0] | (object[1] << 8) | (object[2] << 16) | (object[3] << 24); + if (object_size !== object.length) { + const error = new Error( + 'query selector raw message size does not match message header size [' + + object.length + + '] != [' + + object_size + + ']' + ); + error.name = 'MongoError'; + throw error; + } + } + + // Check special case where we are using an objectId + if (selector != null && selector._bsontype === 'ObjectID') { + selector = { _id: selector }; + } + + if (!options) options = {}; + + let projection = options.projection || options.fields; + + if (projection && !Buffer.isBuffer(projection) && Array.isArray(projection)) { + projection = projection.length + ? projection.reduce((result, field) => { + result[field] = 1; + return result; + }, {}) + : { _id: 1 }; + } + + // Make a shallow copy of options + let newOptions = Object.assign({}, options); + + // Make a shallow copy of the collection options + for (let key in this.s.options) { + if (mergeKeys.indexOf(key) !== -1) { + newOptions[key] = this.s.options[key]; + } + } + + // Unpack options + newOptions.skip = options.skip ? options.skip : 0; + newOptions.limit = options.limit ? options.limit : 0; + newOptions.raw = typeof options.raw === 'boolean' ? options.raw : this.s.raw; + newOptions.hint = + options.hint != null ? normalizeHintField(options.hint) : this.s.collectionHint; + newOptions.timeout = typeof options.timeout === 'undefined' ? undefined : options.timeout; + // // If we have overridden slaveOk otherwise use the default db setting + newOptions.slaveOk = options.slaveOk != null ? options.slaveOk : this.s.db.slaveOk; + + // Add read preference if needed + newOptions.readPreference = ReadPreference.resolve(this, newOptions); + + // Set slave ok to true if read preference different from primary + if ( + newOptions.readPreference != null && + (newOptions.readPreference !== 'primary' || newOptions.readPreference.mode !== 'primary') + ) { + newOptions.slaveOk = true; + } + + // Ensure the query is an object + if (selector != null && typeof selector !== 'object') { + throw MongoError.create({ message: 'query selector must be an object', driver: true }); + } + + // Build the find command + const findCommand = { + find: this.s.namespace.toString(), + limit: newOptions.limit, + skip: newOptions.skip, + query: selector + }; + + if (typeof options.allowDiskUse === 'boolean') { + findCommand.allowDiskUse = options.allowDiskUse; + } + + // Ensure we use the right await data option + if (typeof newOptions.awaitdata === 'boolean') { + newOptions.awaitData = newOptions.awaitdata; + } + + // Translate to new command option noCursorTimeout + if (typeof newOptions.timeout === 'boolean') newOptions.noCursorTimeout = !newOptions.timeout; + + decorateCommand(findCommand, newOptions, ['session', 'collation']); + + if (projection) findCommand.fields = projection; + + // Add db object to the new options + newOptions.db = this.s.db; + + // Add the promise library + newOptions.promiseLibrary = this.s.promiseLibrary; + + // Set raw if available at collection level + if (newOptions.raw == null && typeof this.s.raw === 'boolean') newOptions.raw = this.s.raw; + // Set promoteLongs if available at collection level + if (newOptions.promoteLongs == null && typeof this.s.promoteLongs === 'boolean') + newOptions.promoteLongs = this.s.promoteLongs; + if (newOptions.promoteValues == null && typeof this.s.promoteValues === 'boolean') + newOptions.promoteValues = this.s.promoteValues; + if (newOptions.promoteBuffers == null && typeof this.s.promoteBuffers === 'boolean') + newOptions.promoteBuffers = this.s.promoteBuffers; + + // Sort options + if (findCommand.sort) { + findCommand.sort = formattedOrderClause(findCommand.sort); + } + + // Set the readConcern + decorateWithReadConcern(findCommand, this, options); + + // Decorate find command with collation options + try { + decorateWithCollation(findCommand, this, options); + } catch (err) { + if (typeof callback === 'function') return callback(err, null); + throw err; + } + + const cursor = this.s.topology.cursor( + new FindOperation(this, this.s.namespace, findCommand, newOptions), + newOptions + ); + + // TODO: remove this when NODE-2074 is resolved + if (typeof callback === 'function') { + callback(null, cursor); + return; + } + + return cursor; + } +); + +/** + * Inserts a single document into MongoDB. If documents passed in do not contain the **_id** field, + * one will be added to each of the documents missing it by the driver, mutating the document. This behavior + * can be overridden by setting the **forceServerObjectId** flag. + * + * @method + * @param {object} doc Document to insert. + * @param {object} [options] Optional settings. + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {boolean} [options.forceServerObjectId=false] Force server to assign _id values instead of driver. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.checkKeys=true] If true, will throw if bson documents start with `$` or include a `.` in any key value + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~insertOneWriteOpCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.insertOne = function(doc, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + const insertOneOperation = new InsertOneOperation(this, doc, options); + + return executeOperation(this.s.topology, insertOneOperation, callback); +}; + +/** + * Inserts an array of documents into MongoDB. If documents passed in do not contain the **_id** field, + * one will be added to each of the documents missing it by the driver, mutating the document. This behavior + * can be overridden by setting the **forceServerObjectId** flag. + * + * @method + * @param {object[]} docs Documents to insert. + * @param {object} [options] Optional settings. + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {boolean} [options.ordered=true] If true, when an insert fails, don't execute the remaining writes. If false, continue with remaining inserts when one fails. + * @param {boolean} [options.forceServerObjectId=false] Force server to assign _id values instead of driver. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.checkKeys=true] If true, will throw if bson documents start with `$` or include a `.` in any key value + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~insertWriteOpCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.insertMany = function(docs, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options ? Object.assign({}, options) : { ordered: true }; + + const insertManyOperation = new InsertManyOperation(this, docs, options); + + return executeOperation(this.s.topology, insertManyOperation, callback); +}; + +/** + * @typedef {Object} Collection~BulkWriteOpResult + * @property {number} insertedCount Number of documents inserted. + * @property {number} matchedCount Number of documents matched for update. + * @property {number} modifiedCount Number of documents modified. + * @property {number} deletedCount Number of documents deleted. + * @property {number} upsertedCount Number of documents upserted. + * @property {object} insertedIds Inserted document generated Id's, hash key is the index of the originating operation + * @property {object} upsertedIds Upserted document generated Id's, hash key is the index of the originating operation + * @property {object} result The command result object. + */ + +/** + * The callback format for inserts + * @callback Collection~bulkWriteOpCallback + * @param {BulkWriteError} error An error instance representing the error during the execution. + * @param {Collection~BulkWriteOpResult} result The result object if the command was executed successfully. + */ + +/** + * Perform a bulkWrite operation without a fluent API + * + * Legal operation types are + * + * { insertOne: { document: { a: 1 } } } + * + * { updateOne: { filter: {a:2}, update: {$set: {a:2}}, upsert:true } } + * + * { updateMany: { filter: {a:2}, update: {$set: {a:2}}, upsert:true } } + * + * { updateMany: { filter: {}, update: {$set: {"a.$[i].x": 5}}, arrayFilters: [{ "i.x": 5 }]} } + * + * { deleteOne: { filter: {c:1} } } + * + * { deleteMany: { filter: {c:1} } } + * + * { replaceOne: { filter: {c:3}, replacement: {c:4}, upsert:true}} + * + * If documents passed in do not contain the **_id** field, + * one will be added to each of the documents missing it by the driver, mutating the document. This behavior + * can be overridden by setting the **forceServerObjectId** flag. + * + * @method + * @param {object[]} operations Bulk operations to perform. + * @param {object} [options] Optional settings. + * @param {boolean} [options.ordered=true] Execute write operation in ordered or unordered fashion. + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {object[]} [options.arrayFilters] Determines which array elements to modify for update operation in MongoDB 3.6 or higher. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.checkKeys=false] If true, will throw if bson documents start with `$` or include a `.` in any key value + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~bulkWriteOpCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.bulkWrite = function(operations, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || { ordered: true }; + + if (!Array.isArray(operations)) { + throw MongoError.create({ message: 'operations must be an array of documents', driver: true }); + } + + const bulkWriteOperation = new BulkWriteOperation(this, operations, options); + + return executeOperation(this.s.topology, bulkWriteOperation, callback); +}; + +/** + * @typedef {Object} Collection~WriteOpResult + * @property {object[]} ops All the documents inserted using insertOne/insertMany/replaceOne. Documents contain the _id field if forceServerObjectId == false for insertOne/insertMany + * @property {object} connection The connection object used for the operation. + * @property {object} result The command result object. + */ + +/** + * The callback format for inserts + * @callback Collection~writeOpCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Collection~WriteOpResult} result The result object if the command was executed successfully. + */ + +/** + * @typedef {Object} Collection~insertWriteOpResult + * @property {number} insertedCount The total amount of documents inserted. + * @property {object[]} ops All the documents inserted using insertOne/insertMany/replaceOne. Documents contain the _id field if forceServerObjectId == false for insertOne/insertMany + * @property {Object.} insertedIds Map of the index of the inserted document to the id of the inserted document. + * @property {object} connection The connection object used for the operation. + * @property {object} result The raw command result object returned from MongoDB (content might vary by server version). + * @property {number} result.ok Is 1 if the command executed correctly. + * @property {number} result.n The total count of documents inserted. + */ + +/** + * @typedef {Object} Collection~insertOneWriteOpResult + * @property {number} insertedCount The total amount of documents inserted. + * @property {object[]} ops All the documents inserted using insertOne/insertMany/replaceOne. Documents contain the _id field if forceServerObjectId == false for insertOne/insertMany + * @property {ObjectId} insertedId The driver generated ObjectId for the insert operation. + * @property {object} connection The connection object used for the operation. + * @property {object} result The raw command result object returned from MongoDB (content might vary by server version). + * @property {number} result.ok Is 1 if the command executed correctly. + * @property {number} result.n The total count of documents inserted. + */ + +/** + * The callback format for inserts + * @callback Collection~insertWriteOpCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Collection~insertWriteOpResult} result The result object if the command was executed successfully. + */ + +/** + * The callback format for inserts + * @callback Collection~insertOneWriteOpCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Collection~insertOneWriteOpResult} result The result object if the command was executed successfully. + */ + +/** + * Inserts a single document or a an array of documents into MongoDB. If documents passed in do not contain the **_id** field, + * one will be added to each of the documents missing it by the driver, mutating the document. This behavior + * can be overridden by setting the **forceServerObjectId** flag. + * + * @method + * @param {(object|object[])} docs Documents to insert. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.forceServerObjectId=false] Force server to assign _id values instead of driver. + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~insertWriteOpCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + * @deprecated Use insertOne, insertMany or bulkWrite + */ +Collection.prototype.insert = deprecate(function(docs, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || { ordered: false }; + docs = !Array.isArray(docs) ? [docs] : docs; + + if (options.keepGoing === true) { + options.ordered = false; + } + + return this.insertMany(docs, options, callback); +}, 'collection.insert is deprecated. Use insertOne, insertMany or bulkWrite instead.'); + +/** + * @typedef {Object} Collection~updateWriteOpResult + * @property {Object} result The raw result returned from MongoDB. Will vary depending on server version. + * @property {Number} result.ok Is 1 if the command executed correctly. + * @property {Number} result.n The total count of documents scanned. + * @property {Number} result.nModified The total count of documents modified. + * @property {Object} connection The connection object used for the operation. + * @property {Number} matchedCount The number of documents that matched the filter. + * @property {Number} modifiedCount The number of documents that were modified. + * @property {Number} upsertedCount The number of documents upserted. + * @property {Object} upsertedId The upserted id. + * @property {ObjectId} upsertedId._id The upserted _id returned from the server. + * @property {Object} message The raw msg response wrapped in an internal class + * @property {object[]} [ops] In a response to {@link Collection#replaceOne replaceOne}, contains the new value of the document on the server. This is the same document that was originally passed in, and is only here for legacy purposes. + */ + +/** + * The callback format for inserts + * @callback Collection~updateWriteOpCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Collection~updateWriteOpResult} result The result object if the command was executed successfully. + */ + +/** + * Update a single document in a collection + * @method + * @param {object} filter The Filter used to select the document to update + * @param {object} update The update operations to be applied to the document + * @param {object} [options] Optional settings. + * @param {Array} [options.arrayFilters] optional list of array filters referenced in filtered positional operators + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {object} [options.hint] An optional hint for query optimization. See the {@link https://docs.mongodb.com/manual/reference/command/update/#update-command-hint|update command} reference for more information. + * @param {boolean} [options.upsert=false] When true, creates a new document if no document matches the query.. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.checkKeys=false] If true, will throw if bson documents start with `$` or include a `.` in any key value + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~updateWriteOpCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.updateOne = function(filter, update, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = Object.assign({}, options); + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + return executeOperation( + this.s.topology, + new UpdateOneOperation(this, filter, update, options), + callback + ); +}; + +/** + * Replace a document in a collection with another document + * @method + * @param {object} filter The Filter used to select the document to replace + * @param {object} doc The Document that replaces the matching document + * @param {object} [options] Optional settings. + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {object} [options.hint] An optional hint for query optimization. See the {@link https://docs.mongodb.com/manual/reference/command/update/#update-command-hint|update command} reference for more information. + * @param {boolean} [options.upsert=false] When true, creates a new document if no document matches the query. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.checkKeys=false] If true, will throw if bson documents start with `$` or include a `.` in any key value + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~updateWriteOpCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.replaceOne = function(filter, doc, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = Object.assign({}, options); + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + return executeOperation( + this.s.topology, + new ReplaceOneOperation(this, filter, doc, options), + callback + ); +}; + +/** + * Update multiple documents in a collection + * @method + * @param {object} filter The Filter used to select the documents to update + * @param {object} update The update operations to be applied to the documents + * @param {object} [options] Optional settings. + * @param {Array} [options.arrayFilters] optional list of array filters referenced in filtered positional operators + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {object} [options.hint] An optional hint for query optimization. See the {@link https://docs.mongodb.com/manual/reference/command/update/#update-command-hint|update command} reference for more information. + * @param {boolean} [options.upsert=false] When true, creates a new document if no document matches the query.. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.checkKeys=false] If true, will throw if bson documents start with `$` or include a `.` in any key value + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~updateWriteOpCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.updateMany = function(filter, update, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = Object.assign({}, options); + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + return executeOperation( + this.s.topology, + new UpdateManyOperation(this, filter, update, options), + callback + ); +}; + +/** + * Updates documents. + * @method + * @param {object} selector The selector for the update operation. + * @param {object} update The update operations to be applied to the documents + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.upsert=false] Update operation is an upsert. + * @param {boolean} [options.multi=false] Update one/all documents with operation. + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {Array} [options.arrayFilters] optional list of array filters referenced in filtered positional operators + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {object} [options.hint] An optional hint for query optimization. See the {@link https://docs.mongodb.com/manual/reference/command/update/#update-command-hint|update command} reference for more information. + * @param {Collection~writeOpCallback} [callback] The command result callback + * @throws {MongoError} + * @return {Promise} returns Promise if no callback passed + * @deprecated use updateOne, updateMany or bulkWrite + */ +Collection.prototype.update = deprecate(function(selector, update, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + return executeLegacyOperation(this.s.topology, updateDocuments, [ + this, + selector, + update, + options, + callback + ]); +}, 'collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead.'); + +/** + * @typedef {Object} Collection~deleteWriteOpResult + * @property {Object} result The raw result returned from MongoDB. Will vary depending on server version. + * @property {Number} result.ok Is 1 if the command executed correctly. + * @property {Number} result.n The total count of documents deleted. + * @property {Object} connection The connection object used for the operation. + * @property {Number} deletedCount The number of documents deleted. + */ + +/** + * The callback format for deletes + * @callback Collection~deleteWriteOpCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Collection~deleteWriteOpResult} result The result object if the command was executed successfully. + */ + +/** + * Delete a document from a collection + * @method + * @param {object} filter The Filter used to select the document to remove + * @param {object} [options] Optional settings. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.checkKeys=false] If true, will throw if bson documents start with `$` or include a `.` in any key value + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {string|object} [options.hint] optional index hint for optimizing the filter query + * @param {Collection~deleteWriteOpCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.deleteOne = function(filter, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = Object.assign({}, options); + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + const deleteOneOperation = new DeleteOneOperation(this, filter, options); + + return executeOperation(this.s.topology, deleteOneOperation, callback); +}; + +Collection.prototype.removeOne = Collection.prototype.deleteOne; + +/** + * Delete multiple documents from a collection + * @method + * @param {object} filter The Filter used to select the documents to remove + * @param {object} [options] Optional settings. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.checkKeys=false] If true, will throw if bson documents start with `$` or include a `.` in any key value + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {string|object} [options.hint] optional index hint for optimizing the filter query + * @param {Collection~deleteWriteOpCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.deleteMany = function(filter, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = Object.assign({}, options); + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + const deleteManyOperation = new DeleteManyOperation(this, filter, options); + + return executeOperation(this.s.topology, deleteManyOperation, callback); +}; + +Collection.prototype.removeMany = Collection.prototype.deleteMany; + +/** + * Remove documents. + * @method + * @param {object} selector The selector for the update operation. + * @param {object} [options] Optional settings. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.single=false] Removes the first document found. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~writeOpCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + * @deprecated use deleteOne, deleteMany or bulkWrite + */ +Collection.prototype.remove = deprecate(function(selector, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + return executeLegacyOperation(this.s.topology, removeDocuments, [ + this, + selector, + options, + callback + ]); +}, 'collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.'); + +/** + * Save a document. Simple full document replacement function. Not recommended for efficiency, use atomic + * operators and update instead for more efficient operations. + * @method + * @param {object} doc Document to save + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~writeOpCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + * @deprecated use insertOne, insertMany, updateOne or updateMany + */ +Collection.prototype.save = deprecate(function(doc, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + return executeLegacyOperation(this.s.topology, save, [this, doc, options, callback]); +}, 'collection.save is deprecated. Use insertOne, insertMany, updateOne, or updateMany instead.'); + +/** + * The callback format for results + * @callback Collection~resultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {object} result The result object if the command was executed successfully. + */ + +/** + * The callback format for an aggregation call + * @callback Collection~aggregationCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {AggregationCursor} cursor The cursor if the aggregation command was executed successfully. + */ + +/** + * Fetches the first document that matches the query + * @method + * @param {object} query Query for find Operation + * @param {object} [options] Optional settings. + * @param {number} [options.limit=0] Sets the limit of documents returned in the query. + * @param {(array|object)} [options.sort] Set to sort the documents coming back from the query. Array of indexes, [['a', 1]] etc. + * @param {object} [options.projection] The fields to return in the query. Object of fields to include or exclude (not both), {'a':1} + * @param {object} [options.fields] **Deprecated** Use `options.projection` instead + * @param {number} [options.skip=0] Set to skip N documents ahead in your query (useful for pagination). + * @param {Object} [options.hint] Tell the query to use specific indexes in the query. Object of indexes to use, {'_id':1} + * @param {boolean} [options.snapshot=false] DEPRECATED: Snapshot query. + * @param {boolean} [options.timeout=false] Specify if the cursor can timeout. + * @param {boolean} [options.tailable=false] Specify if the cursor is tailable. + * @param {number} [options.batchSize=1] Set the batchSize for the getMoreCommand when iterating over the query results. + * @param {boolean} [options.returnKey=false] Only return the index key. + * @param {number} [options.maxScan] DEPRECATED: Limit the number of items to scan. + * @param {number} [options.min] Set index bounds. + * @param {number} [options.max] Set index bounds. + * @param {boolean} [options.showDiskLoc=false] Show disk location of results. + * @param {string} [options.comment] You can put a $comment field on a query to make looking in the profiler logs simpler. + * @param {boolean} [options.raw=false] Return document results as raw BSON buffers. + * @param {boolean} [options.promoteLongs=true] Promotes Long values to number if they fit inside the 53 bits resolution. + * @param {boolean} [options.promoteValues=true] Promotes BSON values to native types where possible, set to false to only receive wrapper types. + * @param {boolean} [options.promoteBuffers=false] Promotes Binary BSON values to native Node Buffers. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {boolean} [options.partial=false] Specify if the cursor should return partial results when querying against a sharded system + * @param {number} [options.maxTimeMS] Number of milliseconds to wait before aborting the query. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.findOne = deprecateOptions( + { + name: 'collection.find', + deprecatedOptions: DEPRECATED_FIND_OPTIONS, + optionsIndex: 1 + }, + function(query, options, callback) { + if (typeof callback === 'object') { + // TODO(MAJOR): throw in the future + console.warn('Third parameter to `findOne()` must be a callback or undefined'); + } + + if (typeof query === 'function') (callback = query), (query = {}), (options = {}); + if (typeof options === 'function') (callback = options), (options = {}); + query = query || {}; + options = options || {}; + + const findOneOperation = new FindOneOperation(this, query, options); + + return executeOperation(this.s.topology, findOneOperation, callback); + } +); + +/** + * The callback format for the collection method, must be used if strict is specified + * @callback Collection~collectionResultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Collection} collection The collection instance. + */ + +/** + * Rename the collection. + * + * @method + * @param {string} newName New name of of the collection. + * @param {object} [options] Optional settings. + * @param {boolean} [options.dropTarget=false] Drop the target name collection if it previously exists. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~collectionResultCallback} [callback] The results callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.rename = function(newName, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = Object.assign({}, options, { readPreference: ReadPreference.PRIMARY }); + + const renameOperation = new RenameOperation(this, newName, options); + + return executeOperation(this.s.topology, renameOperation, callback); +}; + +/** + * Drop the collection from the database, removing it permanently. New accesses will create a new collection. + * + * @method + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The results callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.drop = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const dropCollectionOperation = new DropCollectionOperation( + this.s.db, + this.collectionName, + options + ); + + return executeOperation(this.s.topology, dropCollectionOperation, callback); +}; + +/** + * Returns the options of the collection. + * + * @method + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The results callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.options = function(opts, callback) { + if (typeof opts === 'function') (callback = opts), (opts = {}); + opts = opts || {}; + + const optionsOperation = new OptionsOperation(this, opts); + + return executeOperation(this.s.topology, optionsOperation, callback); +}; + +/** + * Returns if the collection is a capped collection + * + * @method + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The results callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.isCapped = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const isCappedOperation = new IsCappedOperation(this, options); + + return executeOperation(this.s.topology, isCappedOperation, callback); +}; + +/** + * Creates an index on the db and collection collection. + * @method + * @param {(string|array|object)} fieldOrSpec Defines the index. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.unique=false] Creates an unique index. + * @param {boolean} [options.sparse=false] Creates a sparse index. + * @param {boolean} [options.background=false] Creates the index in the background, yielding whenever possible. + * @param {boolean} [options.dropDups=false] A unique index cannot be created on a key that has pre-existing duplicate values. If you would like to create the index anyway, keeping the first document the database indexes and deleting all subsequent documents that have duplicate value + * @param {number} [options.min] For geospatial indexes set the lower bound for the co-ordinates. + * @param {number} [options.max] For geospatial indexes set the high bound for the co-ordinates. + * @param {number} [options.v] Specify the format version of the indexes. + * @param {number} [options.expireAfterSeconds] Allows you to expire data on indexes applied to a data (MongoDB 2.2 or higher) + * @param {string} [options.name] Override the autogenerated index name (useful if the resulting name is larger than 128 bytes) + * @param {object} [options.partialFilterExpression] Creates a partial index based on the given filter object (MongoDB 3.2 or higher) + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {(number|string)} [options.commitQuorum] (MongoDB 4.4. or higher) Specifies how many data-bearing members of a replica set, including the primary, must complete the index builds successfully before the primary marks the indexes as ready. This option accepts the same values for the "w" field in a write concern plus "votingMembers", which indicates all voting data-bearing nodes. + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + * @example + * const collection = client.db('foo').collection('bar'); + * + * await collection.createIndex({ a: 1, b: -1 }); + * + * // Alternate syntax for { c: 1, d: -1 } that ensures order of indexes + * await collection.createIndex([ [c, 1], [d, -1] ]); + * + * // Equivalent to { e: 1 } + * await collection.createIndex('e'); + * + * // Equivalent to { f: 1, g: 1 } + * await collection.createIndex(['f', 'g']) + * + * // Equivalent to { h: 1, i: -1 } + * await collection.createIndex([ { h: 1 }, { i: -1 } ]); + * + * // Equivalent to { j: 1, k: -1, l: 2d } + * await collection.createIndex(['j', ['k', -1], { l: '2d' }]) + */ +Collection.prototype.createIndex = function(fieldOrSpec, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const createIndexesOperation = new CreateIndexesOperation( + this, + this.collectionName, + fieldOrSpec, + options + ); + + return executeOperation(this.s.topology, createIndexesOperation, callback); +}; + +/** + * @typedef {object} Collection~IndexDefinition + * @description A definition for an index. Used by the createIndex command. + * @see https://docs.mongodb.com/manual/reference/command/createIndexes/ + */ + +/** + * Creates multiple indexes in the collection, this method is only supported for + * MongoDB 2.6 or higher. Earlier version of MongoDB will throw a command not supported + * error. + * + * **Note**: Unlike {@link Collection#createIndex createIndex}, this function takes in raw index specifications. + * Index specifications are defined {@link http://docs.mongodb.org/manual/reference/command/createIndexes/ here}. + * + * @method + * @param {Collection~IndexDefinition[]} indexSpecs An array of index specifications to be created + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {(number|string)} [options.commitQuorum] (MongoDB 4.4. or higher) Specifies how many data-bearing members of a replica set, including the primary, must complete the index builds successfully before the primary marks the indexes as ready. This option accepts the same values for the "w" field in a write concern plus "votingMembers", which indicates all voting data-bearing nodes. + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + * @example + * const collection = client.db('foo').collection('bar'); + * await collection.createIndexes([ + * // Simple index on field fizz + * { + * key: { fizz: 1 }, + * } + * // wildcard index + * { + * key: { '$**': 1 } + * }, + * // named index on darmok and jalad + * { + * key: { darmok: 1, jalad: -1 } + * name: 'tanagra' + * } + * ]); + */ +Collection.prototype.createIndexes = function(indexSpecs, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + + options = options ? Object.assign({}, options) : {}; + + if (typeof options.maxTimeMS !== 'number') delete options.maxTimeMS; + + const createIndexesOperation = new CreateIndexesOperation( + this, + this.collectionName, + indexSpecs, + options + ); + + return executeOperation(this.s.topology, createIndexesOperation, callback); +}; + +/** + * Drops an index from this collection. + * @method + * @param {string} indexName Name of the index to drop. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {number} [options.maxTimeMS] Number of milliseconds to wait before aborting the query. + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.dropIndex = function(indexName, options, callback) { + const args = Array.prototype.slice.call(arguments, 1); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + + options = args.length ? args.shift() || {} : {}; + // Run only against primary + options.readPreference = ReadPreference.PRIMARY; + + const dropIndexOperation = new DropIndexOperation(this, indexName, options); + + return executeOperation(this.s.topology, dropIndexOperation, callback); +}; + +/** + * Drops all indexes from this collection. + * @method + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {number} [options.maxTimeMS] Number of milliseconds to wait before aborting the query. + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.dropIndexes = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options ? Object.assign({}, options) : {}; + + if (typeof options.maxTimeMS !== 'number') delete options.maxTimeMS; + + const dropIndexesOperation = new DropIndexesOperation(this, options); + + return executeOperation(this.s.topology, dropIndexesOperation, callback); +}; + +/** + * Drops all indexes from this collection. + * @method + * @deprecated use dropIndexes + * @param {Collection~resultCallback} callback The command result callback + * @return {Promise} returns Promise if no [callback] passed + */ +Collection.prototype.dropAllIndexes = deprecate( + Collection.prototype.dropIndexes, + 'collection.dropAllIndexes is deprecated. Use dropIndexes instead.' +); + +/** + * Reindex all indexes on the collection + * Warning: reIndex is a blocking operation (indexes are rebuilt in the foreground) and will be slow for large collections. + * @method + * @deprecated use db.command instead + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.reIndex = deprecate(function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const reIndexOperation = new ReIndexOperation(this, options); + + return executeOperation(this.s.topology, reIndexOperation, callback); +}, 'collection.reIndex is deprecated. Use db.command instead.'); + +/** + * Get the list of all indexes information for the collection. + * + * @method + * @param {object} [options] Optional settings. + * @param {number} [options.batchSize=1000] The batchSize for the returned command cursor or if pre 2.8 the systems batch collection + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {ClientSession} [options.session] optional session to use for this operation + * @return {CommandCursor} + */ +Collection.prototype.listIndexes = function(options) { + const cursor = new CommandCursor( + this.s.topology, + new ListIndexesOperation(this, options), + options + ); + + return cursor; +}; + +/** + * Ensures that an index exists, if it does not it creates it + * @method + * @deprecated use createIndexes instead + * @param {(string|object)} fieldOrSpec Defines the index. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.unique=false] Creates an unique index. + * @param {boolean} [options.sparse=false] Creates a sparse index. + * @param {boolean} [options.background=false] Creates the index in the background, yielding whenever possible. + * @param {boolean} [options.dropDups=false] A unique index cannot be created on a key that has pre-existing duplicate values. If you would like to create the index anyway, keeping the first document the database indexes and deleting all subsequent documents that have duplicate value + * @param {number} [options.min] For geospatial indexes set the lower bound for the co-ordinates. + * @param {number} [options.max] For geospatial indexes set the high bound for the co-ordinates. + * @param {number} [options.v] Specify the format version of the indexes. + * @param {number} [options.expireAfterSeconds] Allows you to expire data on indexes applied to a data (MongoDB 2.2 or higher) + * @param {number} [options.name] Override the autogenerated index name (useful if the resulting name is larger than 128 bytes) + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.ensureIndex = deprecate(function(fieldOrSpec, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + return executeLegacyOperation(this.s.topology, ensureIndex, [ + this, + fieldOrSpec, + options, + callback + ]); +}, 'collection.ensureIndex is deprecated. Use createIndexes instead.'); + +/** + * Checks if one or more indexes exist on the collection, fails on first non-existing index + * @method + * @param {(string|array)} indexes One or more index names to check. + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.indexExists = function(indexes, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const indexExistsOperation = new IndexExistsOperation(this, indexes, options); + + return executeOperation(this.s.topology, indexExistsOperation, callback); +}; + +/** + * Retrieves this collections index info. + * @method + * @param {object} [options] Optional settings. + * @param {boolean} [options.full=false] Returns the full raw index information. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.indexInformation = function(options, callback) { + const args = Array.prototype.slice.call(arguments, 0); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + options = args.length ? args.shift() || {} : {}; + + const indexInformationOperation = new IndexInformationOperation( + this.s.db, + this.collectionName, + options + ); + + return executeOperation(this.s.topology, indexInformationOperation, callback); +}; + +/** + * The callback format for results + * @callback Collection~countCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {number} result The count of documents that matched the query. + */ + +/** + * An estimated count of matching documents in the db to a query. + * + * **NOTE:** This method has been deprecated, since it does not provide an accurate count of the documents + * in a collection. To obtain an accurate count of documents in the collection, use {@link Collection#countDocuments countDocuments}. + * To obtain an estimated count of all documents in the collection, use {@link Collection#estimatedDocumentCount estimatedDocumentCount}. + * + * @method + * @param {object} [query={}] The query for the count. + * @param {object} [options] Optional settings. + * @param {object} [options.collation] Specify collation settings for operation. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {boolean} [options.limit] The limit of documents to count. + * @param {boolean} [options.skip] The number of documents to skip for the count. + * @param {string} [options.hint] An index name hint for the query. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {number} [options.maxTimeMS] Number of milliseconds to wait before aborting the query. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~countCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + * @deprecated use {@link Collection#countDocuments countDocuments} or {@link Collection#estimatedDocumentCount estimatedDocumentCount} instead + */ +Collection.prototype.count = deprecate(function(query, options, callback) { + const args = Array.prototype.slice.call(arguments, 0); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + query = args.length ? args.shift() || {} : {}; + options = args.length ? args.shift() || {} : {}; + + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + return executeOperation( + this.s.topology, + new EstimatedDocumentCountOperation(this, query, options), + callback + ); +}, 'collection.count is deprecated, and will be removed in a future version.' + + ' Use Collection.countDocuments or Collection.estimatedDocumentCount instead'); + +/** + * Gets an estimate of the count of documents in a collection using collection metadata. + * + * @method + * @param {object} [options] Optional settings. + * @param {number} [options.maxTimeMS] The maximum amount of time to allow the operation to run. + * @param {Collection~countCallback} [callback] The command result callback. + * @return {Promise} returns Promise if no callback passed. + */ +Collection.prototype.estimatedDocumentCount = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const estimatedDocumentCountOperation = new EstimatedDocumentCountOperation(this, options); + + return executeOperation(this.s.topology, estimatedDocumentCountOperation, callback); +}; + +/** + * Gets the number of documents matching the filter. + * For a fast count of the total documents in a collection see {@link Collection#estimatedDocumentCount estimatedDocumentCount}. + * **Note**: When migrating from {@link Collection#count count} to {@link Collection#countDocuments countDocuments} + * the following query operators must be replaced: + * + * | Operator | Replacement | + * | -------- | ----------- | + * | `$where` | [`$expr`][1] | + * | `$near` | [`$geoWithin`][2] with [`$center`][3] | + * | `$nearSphere` | [`$geoWithin`][2] with [`$centerSphere`][4] | + * + * [1]: https://docs.mongodb.com/manual/reference/operator/query/expr/ + * [2]: https://docs.mongodb.com/manual/reference/operator/query/geoWithin/ + * [3]: https://docs.mongodb.com/manual/reference/operator/query/center/#op._S_center + * [4]: https://docs.mongodb.com/manual/reference/operator/query/centerSphere/#op._S_centerSphere + * + * @param {object} [query] the query for the count + * @param {object} [options] Optional settings. + * @param {object} [options.collation] Specifies a collation. + * @param {string|object} [options.hint] The index to use. + * @param {number} [options.limit] The maximum number of document to count. + * @param {number} [options.maxTimeMS] The maximum amount of time to allow the operation to run. + * @param {number} [options.skip] The number of documents to skip before counting. + * @param {Collection~countCallback} [callback] The command result callback. + * @return {Promise} returns Promise if no callback passed. + * @see https://docs.mongodb.com/manual/reference/operator/query/expr/ + * @see https://docs.mongodb.com/manual/reference/operator/query/geoWithin/ + * @see https://docs.mongodb.com/manual/reference/operator/query/center/#op._S_center + * @see https://docs.mongodb.com/manual/reference/operator/query/centerSphere/#op._S_centerSphere + */ + +Collection.prototype.countDocuments = function(query, options, callback) { + const args = Array.prototype.slice.call(arguments, 0); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + query = args.length ? args.shift() || {} : {}; + options = args.length ? args.shift() || {} : {}; + + const countDocumentsOperation = new CountDocumentsOperation(this, query, options); + + return executeOperation(this.s.topology, countDocumentsOperation, callback); +}; + +/** + * The distinct command returns a list of distinct values for the given key across a collection. + * @method + * @param {string} key Field of the document to find distinct values for. + * @param {object} [query] The query for filtering the set of documents to which we apply the distinct filter. + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {number} [options.maxTimeMS] Number of milliseconds to wait before aborting the query. + * @param {object} [options.collation] Specify collation settings for operation. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.distinct = function(key, query, options, callback) { + const args = Array.prototype.slice.call(arguments, 1); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + const queryOption = args.length ? args.shift() || {} : {}; + const optionsOption = args.length ? args.shift() || {} : {}; + + const distinctOperation = new DistinctOperation(this, key, queryOption, optionsOption); + + return executeOperation(this.s.topology, distinctOperation, callback); +}; + +/** + * Retrieve all the indexes on the collection. + * @method + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.indexes = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const indexesOperation = new IndexesOperation(this, options); + + return executeOperation(this.s.topology, indexesOperation, callback); +}; + +/** + * Get all the collection statistics. + * + * @method + * @param {object} [options] Optional settings. + * @param {number} [options.scale] Divide the returned sizes by scale value. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The collection result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.stats = function(options, callback) { + const args = Array.prototype.slice.call(arguments, 0); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + options = args.length ? args.shift() || {} : {}; + + const statsOperation = new StatsOperation(this, options); + + return executeOperation(this.s.topology, statsOperation, callback); +}; + +/** + * @typedef {Object} Collection~findAndModifyWriteOpResult + * @property {object} value Document returned from the `findAndModify` command. If no documents were found, `value` will be `null` by default (`returnOriginal: true`), even if a document was upserted; if `returnOriginal` was false, the upserted document will be returned in that case. + * @property {object} lastErrorObject The raw lastErrorObject returned from the command. See {@link https://docs.mongodb.com/manual/reference/command/findAndModify/index.html#lasterrorobject|findAndModify command documentation}. + * @property {Number} ok Is 1 if the command executed correctly. + */ + +/** + * The callback format for inserts + * @callback Collection~findAndModifyCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Collection~findAndModifyWriteOpResult} result The result object if the command was executed successfully. + */ + +/** + * Find a document and delete it in one atomic operation. Requires a write lock for the duration of the operation. + * + * @method + * @param {object} filter The Filter used to select the document to remove + * @param {object} [options] Optional settings. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {object} [options.projection] Limits the fields to return for all matching documents. + * @param {object} [options.sort] Determines which document the operation modifies if the query selects multiple documents. + * @param {number} [options.maxTimeMS] The maximum amount of time to allow the query to run. + * @param {boolean} [options.checkKeys=false] If true, will throw if bson documents start with `$` or include a `.` in any key value + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~findAndModifyCallback} [callback] The collection result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.findOneAndDelete = function(filter, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + return executeOperation( + this.s.topology, + new FindOneAndDeleteOperation(this, filter, options), + callback + ); +}; + +/** + * Find a document and replace it in one atomic operation. Requires a write lock for the duration of the operation. + * + * @method + * @param {object} filter The Filter used to select the document to replace + * @param {object} replacement The Document that replaces the matching document + * @param {object} [options] Optional settings. + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {string|object} [options.hint] An optional index to use for this operation + * @param {number} [options.maxTimeMS] The maximum amount of time to allow the query to run. + * @param {object} [options.projection] Limits the fields to return for all matching documents. + * @param {object} [options.sort] Determines which document the operation modifies if the query selects multiple documents. + * @param {boolean} [options.upsert=false] Upsert the document if it does not exist. + * @param {boolean} [options.returnOriginal=true] When false, returns the updated document rather than the original. The default is true. + * @param {boolean} [options.checkKeys=false] If true, will throw if bson documents start with `$` or include a `.` in any key value + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~findAndModifyCallback} [callback] The collection result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.findOneAndReplace = function(filter, replacement, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + return executeOperation( + this.s.topology, + new FindOneAndReplaceOperation(this, filter, replacement, options), + callback + ); +}; + +/** + * Find a document and update it in one atomic operation. Requires a write lock for the duration of the operation. + * + * @method + * @param {object} filter The Filter used to select the document to update + * @param {object} update Update operations to be performed on the document + * @param {object} [options] Optional settings. + * @param {Array} [options.arrayFilters] optional list of array filters referenced in filtered positional operators + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {string|object} [options.hint] An optional index to use for this operation + * @param {number} [options.maxTimeMS] The maximum amount of time to allow the query to run. + * @param {object} [options.projection] Limits the fields to return for all matching documents. + * @param {object} [options.sort] Determines which document the operation modifies if the query selects multiple documents. + * @param {boolean} [options.upsert=false] Upsert the document if it does not exist. + * @param {boolean} [options.returnOriginal=true] When false, returns the updated document rather than the original. The default is true. + * @param {boolean} [options.checkKeys=false] If true, will throw if bson documents start with `$` or include a `.` in any key value + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] An ptional session to use for this operation + * @param {Collection~findAndModifyCallback} [callback] The collection result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.findOneAndUpdate = function(filter, update, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // Add ignoreUndefined + if (this.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + return executeOperation( + this.s.topology, + new FindOneAndUpdateOperation(this, filter, update, options), + callback + ); +}; + +/** + * Find and update a document. + * @method + * @param {object} query Query object to locate the object to modify. + * @param {array} sort If multiple docs match, choose the first one in the specified sort order as the object to manipulate. + * @param {object} doc The fields/vals to be updated. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.remove=false] Set to true to remove the object before returning. + * @param {boolean} [options.upsert=false] Perform an upsert operation. + * @param {boolean} [options.new=false] Set to true if you want to return the modified object rather than the original. Ignored for remove. + * @param {object} [options.projection] Object containing the field projection for the result returned from the operation. + * @param {object} [options.fields] **Deprecated** Use `options.projection` instead + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Array} [options.arrayFilters] optional list of array filters referenced in filtered positional operators + * @param {Collection~findAndModifyCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + * @deprecated use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead + */ +Collection.prototype.findAndModify = deprecate( + _findAndModify, + 'collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead.' +); + +/** + * @ignore + */ + +Collection.prototype._findAndModify = _findAndModify; + +function _findAndModify(query, sort, doc, options, callback) { + const args = Array.prototype.slice.call(arguments, 1); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + sort = args.length ? args.shift() || [] : []; + doc = args.length ? args.shift() : null; + options = args.length ? args.shift() || {} : {}; + + // Clone options + options = Object.assign({}, options); + // Force read preference primary + options.readPreference = ReadPreference.PRIMARY; + + return executeOperation( + this.s.topology, + new FindAndModifyOperation(this, query, sort, doc, options), + callback + ); +} + +/** + * Find and remove a document. + * @method + * @param {object} query Query object to locate the object to modify. + * @param {array} sort If multiple docs match, choose the first one in the specified sort order as the object to manipulate. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + * @deprecated use findOneAndDelete instead + */ +Collection.prototype.findAndRemove = deprecate(function(query, sort, options, callback) { + const args = Array.prototype.slice.call(arguments, 1); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + sort = args.length ? args.shift() || [] : []; + options = args.length ? args.shift() || {} : {}; + + // Add the remove option + options.remove = true; + + return executeOperation( + this.s.topology, + new FindAndModifyOperation(this, query, sort, null, options), + callback + ); +}, 'collection.findAndRemove is deprecated. Use findOneAndDelete instead.'); + +/** + * Execute an aggregation framework pipeline against the collection, needs MongoDB >= 2.2 + * @method + * @param {object} [pipeline=[]] Array containing all the aggregation framework commands for the execution. + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {number} [options.batchSize=1000] The number of documents to return per batch. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {object} [options.cursor] Return the query as cursor, on 2.6 > it returns as a real cursor on pre 2.6 it returns as an emulated cursor. + * @param {number} [options.cursor.batchSize=1000] Deprecated. Use `options.batchSize` + * @param {boolean} [options.allowDiskUse=false] allowDiskUse lets the server know if it can use disk to store temporary results for the aggregation (requires mongodb 2.6 >). + * @param {number} [options.maxTimeMS] maxTimeMS specifies a cumulative time limit in milliseconds for processing operations on the cursor. MongoDB interrupts the operation at the earliest following interrupt point. + * @param {number} [options.maxAwaitTimeMS] The maximum amount of time for the server to wait on new documents to satisfy a tailable cursor query. + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {boolean} [options.raw=false] Return document results as raw BSON buffers. + * @param {boolean} [options.promoteLongs=true] Promotes Long values to number if they fit inside the 53 bits resolution. + * @param {boolean} [options.promoteValues=true] Promotes BSON values to native types where possible, set to false to only receive wrapper types. + * @param {boolean} [options.promoteBuffers=false] Promotes Binary BSON values to native Node Buffers. + * @param {object} [options.collation] Specify collation settings for operation. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {string} [options.comment] Add a comment to an aggregation command + * @param {string|object} [options.hint] Add an index selection hint to an aggregation command + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~aggregationCallback} callback The command result callback + * @return {(null|AggregationCursor)} + */ +Collection.prototype.aggregate = function(pipeline, options, callback) { + if (Array.isArray(pipeline)) { + // Set up callback if one is provided + if (typeof options === 'function') { + callback = options; + options = {}; + } + + // If we have no options or callback we are doing + // a cursor based aggregation + if (options == null && callback == null) { + options = {}; + } + } else { + // Aggregation pipeline passed as arguments on the method + const args = Array.prototype.slice.call(arguments, 0); + // Get the callback + callback = args.pop(); + // Get the possible options object + const opts = args[args.length - 1]; + // If it contains any of the admissible options pop it of the args + options = + opts && + (opts.readPreference || + opts.explain || + opts.cursor || + opts.out || + opts.maxTimeMS || + opts.hint || + opts.allowDiskUse) + ? args.pop() + : {}; + // Left over arguments is the pipeline + pipeline = args; + } + + const cursor = new AggregationCursor( + this.s.topology, + new AggregateOperation(this, pipeline, options), + options + ); + + // TODO: remove this when NODE-2074 is resolved + if (typeof callback === 'function') { + callback(null, cursor); + return; + } + + return cursor; +}; + +/** + * Create a new Change Stream, watching for new changes (insertions, updates, replacements, deletions, and invalidations) in this collection. + * @method + * @since 3.0.0 + * @param {Array} [pipeline] An array of {@link https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/|aggregation pipeline stages} through which to pass change stream documents. This allows for filtering (using $match) and manipulating the change stream documents. + * @param {object} [options] Optional settings + * @param {string} [options.fullDocument='default'] Allowed values: ‘default’, ‘updateLookup’. When set to ‘updateLookup’, the change stream will include both a delta describing the changes to the document, as well as a copy of the entire document that was changed from some time after the change occurred. + * @param {object} [options.resumeAfter] Specifies the logical starting point for the new change stream. This should be the _id field from a previously returned change stream document. + * @param {number} [options.maxAwaitTimeMS] The maximum amount of time for the server to wait on new documents to satisfy a change stream query + * @param {number} [options.batchSize=1000] The number of documents to return per batch. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {object} [options.collation] Specify collation settings for operation. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {ReadPreference} [options.readPreference] The read preference. Defaults to the read preference of the database or collection. See {@link https://docs.mongodb.com/manual/reference/read-preference|read preference documentation}. + * @param {Timestamp} [options.startAtOperationTime] receive change events that occur after the specified timestamp + * @param {ClientSession} [options.session] optional session to use for this operation + * @return {ChangeStream} a ChangeStream instance. + */ +Collection.prototype.watch = function(pipeline, options) { + pipeline = pipeline || []; + options = options || {}; + + // Allow optionally not specifying a pipeline + if (!Array.isArray(pipeline)) { + options = pipeline; + pipeline = []; + } + + return new ChangeStream(this, pipeline, options); +}; + +/** + * The callback format for results + * @callback Collection~parallelCollectionScanCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Cursor[]} cursors A list of cursors returned allowing for parallel reading of collection. + */ + +/** + * Return N number of parallel cursors for a collection allowing parallel reading of entire collection. There are + * no ordering guarantees for returned results. + * @method + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {number} [options.batchSize=1000] Set the batchSize for the getMoreCommand when iterating over the query results. + * @param {number} [options.numCursors=1] The maximum number of parallel command cursors to return (the number of returned cursors will be in the range 1:numCursors) + * @param {boolean} [options.raw=false] Return all BSON documents as Raw Buffer documents. + * @param {Collection~parallelCollectionScanCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.parallelCollectionScan = deprecate(function(options, callback) { + if (typeof options === 'function') (callback = options), (options = { numCursors: 1 }); + // Set number of cursors to 1 + options.numCursors = options.numCursors || 1; + options.batchSize = options.batchSize || 1000; + + options = Object.assign({}, options); + // Ensure we have the right read preference inheritance + options.readPreference = ReadPreference.resolve(this, options); + + // Add a promiseLibrary + options.promiseLibrary = this.s.promiseLibrary; + + if (options.session) { + options.session = undefined; + } + + return executeLegacyOperation( + this.s.topology, + parallelCollectionScan, + [this, options, callback], + { skipSessions: true } + ); +}, 'parallelCollectionScan is deprecated in MongoDB v4.1'); + +/** + * Execute a geo search using a geo haystack index on a collection. + * + * @method + * @param {number} x Point to search on the x axis, ensure the indexes are ordered in the same order. + * @param {number} y Point to search on the y axis, ensure the indexes are ordered in the same order. + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {number} [options.maxDistance] Include results up to maxDistance from the point. + * @param {object} [options.search] Filter the results by a query. + * @param {number} [options.limit=false] Max number of results to return. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + * @deprecated See {@link https://docs.mongodb.com/manual/geospatial-queries/|geospatial queries docs} for current geospatial support + */ +Collection.prototype.geoHaystackSearch = deprecate(function(x, y, options, callback) { + const args = Array.prototype.slice.call(arguments, 2); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + options = args.length ? args.shift() || {} : {}; + + const geoHaystackSearchOperation = new GeoHaystackSearchOperation(this, x, y, options); + + return executeOperation(this.s.topology, geoHaystackSearchOperation, callback); +}, 'geoHaystackSearch is deprecated, and will be removed in a future version.'); + +/** + * Run a group command across a collection + * + * @method + * @param {(object|array|function|code)} keys An object, array or function expressing the keys to group by. + * @param {object} condition An optional condition that must be true for a row to be considered. + * @param {object} initial Initial value of the aggregation counter object. + * @param {(function|Code)} reduce The reduce function aggregates (reduces) the objects iterated + * @param {(function|Code)} finalize An optional function to be run on each item in the result set just before the item is returned. + * @param {boolean} command Specify if you wish to run using the internal group command or using eval, default is true. + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + * @deprecated MongoDB 3.6 or higher no longer supports the group command. We recommend rewriting using the aggregation framework. + */ +Collection.prototype.group = deprecate(function( + keys, + condition, + initial, + reduce, + finalize, + command, + options, + callback +) { + const args = Array.prototype.slice.call(arguments, 3); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + reduce = args.length ? args.shift() : null; + finalize = args.length ? args.shift() : null; + command = args.length ? args.shift() : null; + options = args.length ? args.shift() || {} : {}; + + // Make sure we are backward compatible + if (!(typeof finalize === 'function')) { + command = finalize; + finalize = null; + } + + if ( + !Array.isArray(keys) && + keys instanceof Object && + typeof keys !== 'function' && + !(keys._bsontype === 'Code') + ) { + keys = Object.keys(keys); + } + + if (typeof reduce === 'function') { + reduce = reduce.toString(); + } + + if (typeof finalize === 'function') { + finalize = finalize.toString(); + } + + // Set up the command as default + command = command == null ? true : command; + + return executeLegacyOperation(this.s.topology, group, [ + this, + keys, + condition, + initial, + reduce, + finalize, + command, + options, + callback + ]); +}, +'MongoDB 3.6 or higher no longer supports the group command. We recommend rewriting using the aggregation framework.'); + +/** + * Run Map Reduce across a collection. Be aware that the inline option for out will return an array of results not a collection. + * + * @method + * @param {(function|string)} map The mapping function. + * @param {(function|string)} reduce The reduce function. + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {object} [options.out] Sets the output target for the map reduce job. *{inline:1} | {replace:'collectionName'} | {merge:'collectionName'} | {reduce:'collectionName'}* + * @param {object} [options.query] Query filter object. + * @param {object} [options.sort] Sorts the input objects using this key. Useful for optimization, like sorting by the emit key for fewer reduces. + * @param {number} [options.limit] Number of objects to return from collection. + * @param {boolean} [options.keeptemp=false] Keep temporary data. + * @param {(function|string)} [options.finalize] Finalize function. + * @param {object} [options.scope] Can pass in variables that can be access from map/reduce/finalize. + * @param {boolean} [options.jsMode=false] It is possible to make the execution stay in JS. Provided in MongoDB > 2.0.X. + * @param {boolean} [options.verbose=false] Provide statistics on job execution time. + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Collection~resultCallback} [callback] The command result callback + * @throws {MongoError} + * @return {Promise} returns Promise if no callback passed + */ +Collection.prototype.mapReduce = function(map, reduce, options, callback) { + if ('function' === typeof options) (callback = options), (options = {}); + // Out must allways be defined (make sure we don't break weirdly on pre 1.8+ servers) + if (null == options.out) { + throw new Error( + 'the out option parameter must be defined, see mongodb docs for possible values' + ); + } + + if ('function' === typeof map) { + map = map.toString(); + } + + if ('function' === typeof reduce) { + reduce = reduce.toString(); + } + + if ('function' === typeof options.finalize) { + options.finalize = options.finalize.toString(); + } + const mapReduceOperation = new MapReduceOperation(this, map, reduce, options); + + return executeOperation(this.s.topology, mapReduceOperation, callback); +}; + +/** + * Initiate an Out of order batch write operation. All operations will be buffered into insert/update/remove commands executed out of order. + * + * @method + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session] optional session to use for this operation + * @return {UnorderedBulkOperation} + */ +Collection.prototype.initializeUnorderedBulkOp = function(options) { + options = options || {}; + // Give function's options precedence over session options. + if (options.ignoreUndefined == null) { + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + options.promiseLibrary = this.s.promiseLibrary; + return unordered(this.s.topology, this, options); +}; + +/** + * Initiate an In order bulk write operation. Operations will be serially executed in the order they are added, creating a new operation for each switch in types. + * + * @method + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {OrderedBulkOperation} callback The command result callback + * @return {null} + */ +Collection.prototype.initializeOrderedBulkOp = function(options) { + options = options || {}; + // Give function's options precedence over session's options. + if (options.ignoreUndefined == null) { + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + options.promiseLibrary = this.s.promiseLibrary; + return ordered(this.s.topology, this, options); +}; + +/** + * Return the db logger + * @method + * @return {Logger} return the db logger + * @ignore + */ +Collection.prototype.getLogger = function() { + return this.s.db.s.logger; +}; + +module.exports = Collection; diff --git a/node_modules/mongodb/lib/command_cursor.js b/node_modules/mongodb/lib/command_cursor.js new file mode 100644 index 00000000..cd0f9d7a --- /dev/null +++ b/node_modules/mongodb/lib/command_cursor.js @@ -0,0 +1,269 @@ +'use strict'; + +const ReadPreference = require('./core').ReadPreference; +const MongoError = require('./core').MongoError; +const Cursor = require('./cursor'); +const CursorState = require('./core/cursor').CursorState; + +/** + * @fileOverview The **CommandCursor** class is an internal class that embodies a + * generalized cursor based on a MongoDB command allowing for iteration over the + * results returned. It supports one by one document iteration, conversion to an + * array or can be iterated as a Node 0.10.X or higher stream + * + * **CommandCursor Cannot directly be instantiated** + * @example + * const MongoClient = require('mongodb').MongoClient; + * const test = require('assert'); + * // Connection url + * const url = 'mongodb://localhost:27017'; + * // Database Name + * const dbName = 'test'; + * // Connect using MongoClient + * MongoClient.connect(url, function(err, client) { + * // Create a collection we want to drop later + * const col = client.db(dbName).collection('listCollectionsExample1'); + * // Insert a bunch of documents + * col.insert([{a:1, b:1} + * , {a:2, b:2}, {a:3, b:3} + * , {a:4, b:4}], {w:1}, function(err, result) { + * test.equal(null, err); + * // List the database collections available + * db.listCollections().toArray(function(err, items) { + * test.equal(null, err); + * client.close(); + * }); + * }); + * }); + */ + +/** + * Namespace provided by the browser. + * @external Readable + */ + +/** + * Creates a new Command Cursor instance (INTERNAL TYPE, do not instantiate directly) + * @class CommandCursor + * @extends external:Readable + * @fires CommandCursor#data + * @fires CommandCursor#end + * @fires CommandCursor#close + * @fires CommandCursor#readable + * @return {CommandCursor} an CommandCursor instance. + */ +class CommandCursor extends Cursor { + constructor(topology, ns, cmd, options) { + super(topology, ns, cmd, options); + } + + /** + * Set the ReadPreference for the cursor. + * @method + * @param {(string|ReadPreference)} readPreference The new read preference for the cursor. + * @throws {MongoError} + * @return {Cursor} + */ + setReadPreference(readPreference) { + if (this.s.state === CursorState.CLOSED || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + if (this.s.state !== CursorState.INIT) { + throw MongoError.create({ + message: 'cannot change cursor readPreference after cursor has been accessed', + driver: true + }); + } + + if (readPreference instanceof ReadPreference) { + this.options.readPreference = readPreference; + } else if (typeof readPreference === 'string') { + this.options.readPreference = new ReadPreference(readPreference); + } else { + throw new TypeError('Invalid read preference: ' + readPreference); + } + + return this; + } + + /** + * Set the batch size for the cursor. + * @method + * @param {number} value The number of documents to return per batch. See {@link https://docs.mongodb.com/manual/reference/command/find/|find command documentation}. + * @throws {MongoError} + * @return {CommandCursor} + */ + batchSize(value) { + if (this.s.state === CursorState.CLOSED || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + if (typeof value !== 'number') { + throw MongoError.create({ message: 'batchSize requires an integer', driver: true }); + } + + if (this.cmd.cursor) { + this.cmd.cursor.batchSize = value; + } + + this.setCursorBatchSize(value); + return this; + } + + /** + * Add a maxTimeMS stage to the aggregation pipeline + * @method + * @param {number} value The state maxTimeMS value. + * @return {CommandCursor} + */ + maxTimeMS(value) { + if (this.topology.lastIsMaster().minWireVersion > 2) { + this.cmd.maxTimeMS = value; + } + + return this; + } + + /** + * Return the cursor logger + * @method + * @return {Logger} return the cursor logger + * @ignore + */ + getLogger() { + return this.logger; + } +} + +// aliases +CommandCursor.prototype.get = CommandCursor.prototype.toArray; + +/** + * CommandCursor stream data event, fired for each document in the cursor. + * + * @event CommandCursor#data + * @type {object} + */ + +/** + * CommandCursor stream end event + * + * @event CommandCursor#end + * @type {null} + */ + +/** + * CommandCursor stream close event + * + * @event CommandCursor#close + * @type {null} + */ + +/** + * CommandCursor stream readable event + * + * @event CommandCursor#readable + * @type {null} + */ + +/** + * Get the next available document from the cursor, returns null if no more documents are available. + * @function CommandCursor.prototype.next + * @param {CommandCursor~resultCallback} [callback] The result callback. + * @throws {MongoError} + * @return {Promise} returns Promise if no callback passed + */ + +/** + * Check if there is any document still available in the cursor + * @function CommandCursor.prototype.hasNext + * @param {CommandCursor~resultCallback} [callback] The result callback. + * @throws {MongoError} + * @return {Promise} returns Promise if no callback passed + */ + +/** + * The callback format for results + * @callback CommandCursor~toArrayResultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {object[]} documents All the documents the satisfy the cursor. + */ + +/** + * Returns an array of documents. The caller is responsible for making sure that there + * is enough memory to store the results. Note that the array only contain partial + * results when this cursor had been previously accessed. + * @method CommandCursor.prototype.toArray + * @param {CommandCursor~toArrayResultCallback} [callback] The result callback. + * @throws {MongoError} + * @return {Promise} returns Promise if no callback passed + */ + +/** + * The callback format for results + * @callback CommandCursor~resultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {(object|null)} result The result object if the command was executed successfully. + */ + +/** + * Iterates over all the documents for this cursor. As with **{cursor.toArray}**, + * not all of the elements will be iterated if this cursor had been previously accessed. + * In that case, **{cursor.rewind}** can be used to reset the cursor. However, unlike + * **{cursor.toArray}**, the cursor will only hold a maximum of batch size elements + * at any given time if batch size is specified. Otherwise, the caller is responsible + * for making sure that the entire result can fit the memory. + * @method CommandCursor.prototype.each + * @param {CommandCursor~resultCallback} callback The result callback. + * @throws {MongoError} + * @return {null} + */ + +/** + * Close the cursor, sending a KillCursor command and emitting close. + * @method CommandCursor.prototype.close + * @param {CommandCursor~resultCallback} [callback] The result callback. + * @return {Promise} returns Promise if no callback passed + */ + +/** + * Is the cursor closed + * @method CommandCursor.prototype.isClosed + * @return {boolean} + */ + +/** + * Clone the cursor + * @function CommandCursor.prototype.clone + * @return {CommandCursor} + */ + +/** + * Resets the cursor + * @function CommandCursor.prototype.rewind + * @return {CommandCursor} + */ + +/** + * The callback format for the forEach iterator method + * @callback CommandCursor~iteratorCallback + * @param {Object} doc An emitted document for the iterator + */ + +/** + * The callback error format for the forEach iterator method + * @callback CommandCursor~endCallback + * @param {MongoError} error An error instance representing the error during the execution. + */ + +/* + * Iterates over all the documents for this cursor using the iterator, callback pattern. + * @method CommandCursor.prototype.forEach + * @param {CommandCursor~iteratorCallback} iterator The iteration callback. + * @param {CommandCursor~endCallback} callback The end callback. + * @throws {MongoError} + * @return {null} + */ + +module.exports = CommandCursor; diff --git a/node_modules/mongodb/lib/constants.js b/node_modules/mongodb/lib/constants.js new file mode 100644 index 00000000..d6cc68ad --- /dev/null +++ b/node_modules/mongodb/lib/constants.js @@ -0,0 +1,10 @@ +'use strict'; + +module.exports = { + SYSTEM_NAMESPACE_COLLECTION: 'system.namespaces', + SYSTEM_INDEX_COLLECTION: 'system.indexes', + SYSTEM_PROFILE_COLLECTION: 'system.profile', + SYSTEM_USER_COLLECTION: 'system.users', + SYSTEM_COMMAND_COLLECTION: '$cmd', + SYSTEM_JS_COLLECTION: 'system.js' +}; diff --git a/node_modules/mongodb/lib/core/auth/auth_provider.js b/node_modules/mongodb/lib/core/auth/auth_provider.js new file mode 100644 index 00000000..a5f6e995 --- /dev/null +++ b/node_modules/mongodb/lib/core/auth/auth_provider.js @@ -0,0 +1,55 @@ +'use strict'; + +/** + * Context used during authentication + * + * @property {Connection} connection The connection to authenticate + * @property {MongoCredentials} credentials The credentials to use for authentication + * @property {object} options The options passed to the `connect` method + * @property {object?} response The response of the initial handshake + * @property {Buffer?} nonce A random nonce generated for use in an authentication conversation + */ +class AuthContext { + constructor(connection, credentials, options) { + this.connection = connection; + this.credentials = credentials; + this.options = options; + } +} + +class AuthProvider { + constructor(bson) { + this.bson = bson; + } + + /** + * Prepare the handshake document before the initial handshake. + * + * @param {object} handshakeDoc The document used for the initial handshake on a connection + * @param {AuthContext} authContext Context for authentication flow + * @param {function} callback + */ + prepare(handshakeDoc, context, callback) { + callback(undefined, handshakeDoc); + } + + /** + * Authenticate + * + * @param {AuthContext} context A shared context for authentication flow + * @param {authResultCallback} callback The callback to return the result from the authentication + */ + auth(context, callback) { + callback(new TypeError('`auth` method must be overridden by subclass')); + } +} + +/** + * This is a result from an authentication provider + * + * @callback authResultCallback + * @param {error} error An error object. Set to null if no error present + * @param {boolean} result The result of the authentication process + */ + +module.exports = { AuthContext, AuthProvider }; diff --git a/node_modules/mongodb/lib/core/auth/defaultAuthProviders.js b/node_modules/mongodb/lib/core/auth/defaultAuthProviders.js new file mode 100644 index 00000000..92ac6059 --- /dev/null +++ b/node_modules/mongodb/lib/core/auth/defaultAuthProviders.js @@ -0,0 +1,29 @@ +'use strict'; + +const MongoCR = require('./mongocr'); +const X509 = require('./x509'); +const Plain = require('./plain'); +const GSSAPI = require('./gssapi'); +const ScramSHA1 = require('./scram').ScramSHA1; +const ScramSHA256 = require('./scram').ScramSHA256; +const MongoDBAWS = require('./mongodb_aws'); + +/** + * Returns the default authentication providers. + * + * @param {BSON} bson Bson definition + * @returns {Object} a mapping of auth names to auth types + */ +function defaultAuthProviders(bson) { + return { + 'mongodb-aws': new MongoDBAWS(bson), + mongocr: new MongoCR(bson), + x509: new X509(bson), + plain: new Plain(bson), + gssapi: new GSSAPI(bson), + 'scram-sha-1': new ScramSHA1(bson), + 'scram-sha-256': new ScramSHA256(bson) + }; +} + +module.exports = { defaultAuthProviders }; diff --git a/node_modules/mongodb/lib/core/auth/gssapi.js b/node_modules/mongodb/lib/core/auth/gssapi.js new file mode 100644 index 00000000..9a6c110b --- /dev/null +++ b/node_modules/mongodb/lib/core/auth/gssapi.js @@ -0,0 +1,151 @@ +'use strict'; +const dns = require('dns'); + +const AuthProvider = require('./auth_provider').AuthProvider; +const retrieveKerberos = require('../utils').retrieveKerberos; +const MongoError = require('../error').MongoError; + +let kerberos; + +class GSSAPI extends AuthProvider { + auth(authContext, callback) { + const connection = authContext.connection; + const credentials = authContext.credentials; + if (credentials == null) return callback(new MongoError('credentials required')); + const username = credentials.username; + function externalCommand(command, cb) { + return connection.command('$external.$cmd', command, cb); + } + makeKerberosClient(authContext, (err, client) => { + if (err) return callback(err); + if (client == null) return callback(new MongoError('gssapi client missing')); + client.step('', (err, payload) => { + if (err) return callback(err); + externalCommand(saslStart(payload), (err, response) => { + if (err) return callback(err); + const result = response.result; + negotiate(client, 10, result.payload, (err, payload) => { + if (err) return callback(err); + externalCommand(saslContinue(payload, result.conversationId), (err, response) => { + if (err) return callback(err); + const result = response.result; + finalize(client, username, result.payload, (err, payload) => { + if (err) return callback(err); + externalCommand( + { + saslContinue: 1, + conversationId: result.conversationId, + payload + }, + (err, result) => { + if (err) return callback(err); + callback(undefined, result); + } + ); + }); + }); + }); + }); + }); + }); + } +} +module.exports = GSSAPI; + +function makeKerberosClient(authContext, callback) { + const host = authContext.options.host; + const port = authContext.options.port; + const credentials = authContext.credentials; + if (!host || !port || !credentials) { + return callback( + new MongoError( + `Connection must specify: ${host ? 'host' : ''}, ${port ? 'port' : ''}, ${ + credentials ? 'host' : 'credentials' + }.` + ) + ); + } + if (kerberos == null) { + try { + kerberos = retrieveKerberos(); + } catch (e) { + return callback(e); + } + } + const username = credentials.username; + const password = credentials.password; + const mechanismProperties = credentials.mechanismProperties; + const serviceName = + mechanismProperties['gssapiservicename'] || + mechanismProperties['gssapiServiceName'] || + 'mongodb'; + performGssapiCanonicalizeHostName(host, mechanismProperties, (err, host) => { + if (err) return callback(err); + const initOptions = {}; + if (password != null) { + Object.assign(initOptions, { user: username, password: password }); + } + kerberos.initializeClient( + `${serviceName}${process.platform === 'win32' ? '/' : '@'}${host}`, + initOptions, + (err, client) => { + if (err) return callback(new MongoError(err)); + callback(null, client); + } + ); + }); +} + +function saslStart(payload) { + return { + saslStart: 1, + mechanism: 'GSSAPI', + payload, + autoAuthorize: 1 + }; +} +function saslContinue(payload, conversationId) { + return { + saslContinue: 1, + conversationId, + payload + }; +} +function negotiate(client, retries, payload, callback) { + client.step(payload, (err, response) => { + // Retries exhausted, raise error + if (err && retries === 0) return callback(err); + // Adjust number of retries and call step again + if (err) return negotiate(client, retries - 1, payload, callback); + // Return the payload + callback(undefined, response || ''); + }); +} +function finalize(client, user, payload, callback) { + // GSS Client Unwrap + client.unwrap(payload, (err, response) => { + if (err) return callback(err); + // Wrap the response + client.wrap(response || '', { user }, (err, wrapped) => { + if (err) return callback(err); + // Return the payload + callback(undefined, wrapped); + }); + }); +} +function performGssapiCanonicalizeHostName(host, mechanismProperties, callback) { + const canonicalizeHostName = + typeof mechanismProperties.gssapiCanonicalizeHostName === 'boolean' + ? mechanismProperties.gssapiCanonicalizeHostName + : false; + if (!canonicalizeHostName) return callback(undefined, host); + // Attempt to resolve the host name + dns.resolveCname(host, (err, r) => { + if (err) return callback(err); + // Get the first resolve host id + if (Array.isArray(r) && r.length > 0) { + return callback(undefined, r[0]); + } + callback(undefined, host); + }); +} diff --git a/node_modules/mongodb/lib/core/auth/mongo_credentials.js b/node_modules/mongodb/lib/core/auth/mongo_credentials.js new file mode 100644 index 00000000..054e47d3 --- /dev/null +++ b/node_modules/mongodb/lib/core/auth/mongo_credentials.js @@ -0,0 +1,107 @@ +'use strict'; + +// Resolves the default auth mechanism according to +// https://github.com/mongodb/specifications/blob/master/source/auth/auth.rst +function getDefaultAuthMechanism(ismaster) { + if (ismaster) { + // If ismaster contains saslSupportedMechs, use scram-sha-256 + // if it is available, else scram-sha-1 + if (Array.isArray(ismaster.saslSupportedMechs)) { + return ismaster.saslSupportedMechs.indexOf('SCRAM-SHA-256') >= 0 + ? 'scram-sha-256' + : 'scram-sha-1'; + } + + // Fallback to legacy selection method. If wire version >= 3, use scram-sha-1 + if (ismaster.maxWireVersion >= 3) { + return 'scram-sha-1'; + } + } + + // Default for wireprotocol < 3 + return 'mongocr'; +} + +/** + * A representation of the credentials used by MongoDB + * @class + * @property {string} mechanism The method used to authenticate + * @property {string} [username] The username used for authentication + * @property {string} [password] The password used for authentication + * @property {string} [source] The database that the user should authenticate against + * @property {object} [mechanismProperties] Special properties used by some types of auth mechanisms + */ +class MongoCredentials { + /** + * Creates a new MongoCredentials object + * @param {object} [options] + * @param {string} [options.username] The username used for authentication + * @param {string} [options.password] The password used for authentication + * @param {string} [options.source] The database that the user should authenticate against + * @param {string} [options.mechanism] The method used to authenticate + * @param {object} [options.mechanismProperties] Special properties used by some types of auth mechanisms + */ + constructor(options) { + options = options || {}; + this.username = options.username; + this.password = options.password; + this.source = options.source || options.db; + this.mechanism = options.mechanism || 'default'; + this.mechanismProperties = options.mechanismProperties || {}; + + if (this.mechanism.match(/MONGODB-AWS/i)) { + if (this.username == null && process.env.AWS_ACCESS_KEY_ID) { + this.username = process.env.AWS_ACCESS_KEY_ID; + } + + if (this.password == null && process.env.AWS_SECRET_ACCESS_KEY) { + this.password = process.env.AWS_SECRET_ACCESS_KEY; + } + + if (this.mechanismProperties.AWS_SESSION_TOKEN == null && process.env.AWS_SESSION_TOKEN) { + this.mechanismProperties.AWS_SESSION_TOKEN = process.env.AWS_SESSION_TOKEN; + } + } + + Object.freeze(this.mechanismProperties); + Object.freeze(this); + } + + /** + * Determines if two MongoCredentials objects are equivalent + * @param {MongoCredentials} other another MongoCredentials object + * @returns {boolean} true if the two objects are equal. + */ + equals(other) { + return ( + this.mechanism === other.mechanism && + this.username === other.username && + this.password === other.password && + this.source === other.source + ); + } + + /** + * If the authentication mechanism is set to "default", resolves the authMechanism + * based on the server version and server supported sasl mechanisms. + * + * @param {Object} [ismaster] An ismaster response from the server + * @returns {MongoCredentials} + */ + resolveAuthMechanism(ismaster) { + // If the mechanism is not "default", then it does not need to be resolved + if (this.mechanism.match(/DEFAULT/i)) { + return new MongoCredentials({ + username: this.username, + password: this.password, + source: this.source, + mechanism: getDefaultAuthMechanism(ismaster), + mechanismProperties: this.mechanismProperties + }); + } + + return this; + } +} + +module.exports = { MongoCredentials }; diff --git a/node_modules/mongodb/lib/core/auth/mongocr.js b/node_modules/mongodb/lib/core/auth/mongocr.js new file mode 100644 index 00000000..0b1c341a --- /dev/null +++ b/node_modules/mongodb/lib/core/auth/mongocr.js @@ -0,0 +1,45 @@ +'use strict'; + +const crypto = require('crypto'); +const AuthProvider = require('./auth_provider').AuthProvider; + +class MongoCR extends AuthProvider { + auth(authContext, callback) { + const connection = authContext.connection; + const credentials = authContext.credentials; + const username = credentials.username; + const password = credentials.password; + const source = credentials.source; + + connection.command(`${source}.$cmd`, { getnonce: 1 }, (err, result) => { + let nonce = null; + let key = null; + + // Get nonce + if (err == null) { + const r = result.result; + nonce = r.nonce; + // Use node md5 generator + let md5 = crypto.createHash('md5'); + // Generate keys used for authentication + md5.update(username + ':mongo:' + password, 'utf8'); + const hash_password = md5.digest('hex'); + // Final key + md5 = crypto.createHash('md5'); + md5.update(nonce + username + hash_password, 'utf8'); + key = md5.digest('hex'); + } + + const authenticateCommand = { + authenticate: 1, + user: username, + nonce, + key + }; + + connection.command(`${source}.$cmd`, authenticateCommand, callback); + }); + } +} + +module.exports = MongoCR; diff --git a/node_modules/mongodb/lib/core/auth/mongodb_aws.js b/node_modules/mongodb/lib/core/auth/mongodb_aws.js new file mode 100644 index 00000000..af19d6dc --- /dev/null +++ b/node_modules/mongodb/lib/core/auth/mongodb_aws.js @@ -0,0 +1,256 @@ +'use strict'; +const AuthProvider = require('./auth_provider').AuthProvider; +const MongoCredentials = require('./mongo_credentials').MongoCredentials; +const MongoError = require('../error').MongoError; +const crypto = require('crypto'); +const http = require('http'); +const maxWireVersion = require('../utils').maxWireVersion; +const url = require('url'); + +let aws4; +try { + aws4 = require('aws4'); +} catch (e) { + // don't do anything; +} + +const ASCII_N = 110; +const AWS_RELATIVE_URI = 'http://169.254.170.2'; +const AWS_EC2_URI = 'http://169.254.169.254'; +const AWS_EC2_PATH = '/latest/meta-data/iam/security-credentials'; + +class MongoDBAWS extends AuthProvider { + auth(authContext, callback) { + const connection = authContext.connection; + const credentials = authContext.credentials; + + if (maxWireVersion(connection) < 9) { + callback(new MongoError('MONGODB-AWS authentication requires MongoDB version 4.4 or later')); + return; + } + + if (aws4 == null) { + callback( + new MongoError( + 'MONGODB-AWS authentication requires the `aws4` module, please install it as a dependency of your project' + ) + ); + + return; + } + + if (credentials.username == null) { + makeTempCredentials(credentials, (err, tempCredentials) => { + if (err) return callback(err); + + authContext.credentials = tempCredentials; + this.auth(authContext, callback); + }); + + return; + } + + const username = credentials.username; + const password = credentials.password; + const db = credentials.source; + const token = credentials.mechanismProperties.AWS_SESSION_TOKEN; + const bson = this.bson; + + crypto.randomBytes(32, (err, nonce) => { + if (err) { + callback(err); + return; + } + + const saslStart = { + saslStart: 1, + mechanism: 'MONGODB-AWS', + payload: bson.serialize({ r: nonce, p: ASCII_N }) + }; + + connection.command(`${db}.$cmd`, saslStart, (err, result) => { + if (err) return callback(err); + + const res = result.result; + const serverResponse = bson.deserialize(res.payload.buffer); + const host = serverResponse.h; + const serverNonce = serverResponse.s.buffer; + if (serverNonce.length !== 64) { + callback( + new MongoError(`Invalid server nonce length ${serverNonce.length}, expected 64`) + ); + return; + } + + if (serverNonce.compare(nonce, 0, nonce.length, 0, nonce.length) !== 0) { + callback(new MongoError('Server nonce does not begin with client nonce')); + return; + } + + if (host.length < 1 || host.length > 255 || host.indexOf('..') !== -1) { + callback(new MongoError(`Server returned an invalid host: "${host}"`)); + return; + } + + const body = 'Action=GetCallerIdentity&Version=2011-06-15'; + const options = aws4.sign( + { + method: 'POST', + host, + region: deriveRegion(serverResponse.h), + service: 'sts', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Content-Length': body.length, + 'X-MongoDB-Server-Nonce': serverNonce.toString('base64'), + 'X-MongoDB-GS2-CB-Flag': 'n' + }, + path: '/', + body + }, + { + accessKeyId: username, + secretAccessKey: password, + token + } + ); + + const authorization = options.headers.Authorization; + const date = options.headers['X-Amz-Date']; + const payload = { a: authorization, d: date }; + if (token) { + payload.t = token; + } + + const saslContinue = { + saslContinue: 1, + conversationId: 1, + payload: bson.serialize(payload) + }; + + connection.command(`${db}.$cmd`, saslContinue, err => { + if (err) return callback(err); + callback(); + }); + }); + }); + } +} + +function makeTempCredentials(credentials, callback) { + function done(creds) { + if (creds.AccessKeyId == null || creds.SecretAccessKey == null || creds.Token == null) { + callback(new MongoError('Could not obtain temporary MONGODB-AWS credentials')); + return; + } + + callback( + undefined, + new MongoCredentials({ + username: creds.AccessKeyId, + password: creds.SecretAccessKey, + source: credentials.source, + mechanism: 'MONGODB-AWS', + mechanismProperties: { + AWS_SESSION_TOKEN: creds.Token + } + }) + ); + } + + // If the environment variable AWS_CONTAINER_CREDENTIALS_RELATIVE_URI + // is set then drivers MUST assume that it was set by an AWS ECS agent + if (process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI) { + request( + `${AWS_RELATIVE_URI}${process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}`, + (err, res) => { + if (err) return callback(err); + done(res); + } + ); + + return; + } + + // Otherwise assume we are on an EC2 instance + + // get a token + + request( + `${AWS_EC2_URI}/latest/api/token`, + { method: 'PUT', json: false, headers: { 'X-aws-ec2-metadata-token-ttl-seconds': 30 } }, + (err, token) => { + if (err) return callback(err); + + // get role name + request( + `${AWS_EC2_URI}/${AWS_EC2_PATH}`, + { json: false, headers: { 'X-aws-ec2-metadata-token': token } }, + (err, roleName) => { + if (err) return callback(err); + + // get temp credentials + request( + `${AWS_EC2_URI}/${AWS_EC2_PATH}/${roleName}`, + { headers: { 'X-aws-ec2-metadata-token': token } }, + (err, creds) => { + if (err) return callback(err); + done(creds); + } + ); + } + ); + } + ); +} + +function deriveRegion(host) { + const parts = host.split('.'); + if (parts.length === 1 || parts[1] === 'amazonaws') { + return 'us-east-1'; + } + + return parts[1]; +} + +function request(uri, options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + options = Object.assign( + { + method: 'GET', + timeout: 10000, + json: true + }, + url.parse(uri), + options + ); + + const req = http.request(options, res => { + res.setEncoding('utf8'); + + let data = ''; + res.on('data', d => (data += d)); + res.on('end', () => { + if (options.json === false) { + callback(undefined, data); + return; + } + + try { + const parsed = JSON.parse(data); + callback(undefined, parsed); + } catch (err) { + callback(new MongoError(`Invalid JSON response: "${data}"`)); + } + }); + }); + + req.on('error', err => callback(err)); + req.end(); +} + +module.exports = MongoDBAWS; diff --git a/node_modules/mongodb/lib/core/auth/plain.js b/node_modules/mongodb/lib/core/auth/plain.js new file mode 100644 index 00000000..f8de3dd9 --- /dev/null +++ b/node_modules/mongodb/lib/core/auth/plain.js @@ -0,0 +1,28 @@ +'use strict'; +const retrieveBSON = require('../connection/utils').retrieveBSON; +const AuthProvider = require('./auth_provider').AuthProvider; + +// TODO: can we get the Binary type from this.bson instead? +const BSON = retrieveBSON(); +const Binary = BSON.Binary; + +class Plain extends AuthProvider { + auth(authContext, callback) { + const connection = authContext.connection; + const credentials = authContext.credentials; + const username = credentials.username; + const password = credentials.password; + + const payload = new Binary(`\x00${username}\x00${password}`); + const command = { + saslStart: 1, + mechanism: 'PLAIN', + payload: payload, + autoAuthorize: 1 + }; + + connection.command('$external.$cmd', command, callback); + } +} + +module.exports = Plain; diff --git a/node_modules/mongodb/lib/core/auth/scram.js b/node_modules/mongodb/lib/core/auth/scram.js new file mode 100644 index 00000000..7b8d7b34 --- /dev/null +++ b/node_modules/mongodb/lib/core/auth/scram.js @@ -0,0 +1,346 @@ +'use strict'; +const crypto = require('crypto'); +const Buffer = require('safe-buffer').Buffer; +const retrieveBSON = require('../connection/utils').retrieveBSON; +const MongoError = require('../error').MongoError; +const AuthProvider = require('./auth_provider').AuthProvider; + +const BSON = retrieveBSON(); +const Binary = BSON.Binary; + +let saslprep; +try { + saslprep = require('saslprep'); +} catch (e) { + // don't do anything; +} + +class ScramSHA extends AuthProvider { + constructor(bson, cryptoMethod) { + super(bson); + this.cryptoMethod = cryptoMethod || 'sha1'; + } + + prepare(handshakeDoc, authContext, callback) { + const cryptoMethod = this.cryptoMethod; + if (cryptoMethod === 'sha256' && saslprep == null) { + console.warn('Warning: no saslprep library specified. Passwords will not be sanitized'); + } + + crypto.randomBytes(24, (err, nonce) => { + if (err) { + return callback(err); + } + + // store the nonce for later use + Object.assign(authContext, { nonce }); + + const credentials = authContext.credentials; + const request = Object.assign({}, handshakeDoc, { + speculativeAuthenticate: Object.assign(makeFirstMessage(cryptoMethod, credentials, nonce), { + db: credentials.source + }) + }); + + callback(undefined, request); + }); + } + + auth(authContext, callback) { + const response = authContext.response; + if (response && response.speculativeAuthenticate) { + continueScramConversation( + this.cryptoMethod, + response.speculativeAuthenticate, + authContext, + callback + ); + + return; + } + + executeScram(this.cryptoMethod, authContext, callback); + } +} + +function cleanUsername(username) { + return username.replace('=', '=3D').replace(',', '=2C'); +} + +function clientFirstMessageBare(username, nonce) { + // NOTE: This is done b/c Javascript uses UTF-16, but the server is hashing in UTF-8. + // Since the username is not sasl-prep-d, we need to do this here. + return Buffer.concat([ + Buffer.from('n=', 'utf8'), + Buffer.from(username, 'utf8'), + Buffer.from(',r=', 'utf8'), + Buffer.from(nonce.toString('base64'), 'utf8') + ]); +} + +function makeFirstMessage(cryptoMethod, credentials, nonce) { + const username = cleanUsername(credentials.username); + const mechanism = cryptoMethod === 'sha1' ? 'SCRAM-SHA-1' : 'SCRAM-SHA-256'; + + // NOTE: This is done b/c Javascript uses UTF-16, but the server is hashing in UTF-8. + // Since the username is not sasl-prep-d, we need to do this here. + return { + saslStart: 1, + mechanism, + payload: new Binary( + Buffer.concat([Buffer.from('n,,', 'utf8'), clientFirstMessageBare(username, nonce)]) + ), + autoAuthorize: 1, + options: { skipEmptyExchange: true } + }; +} + +function executeScram(cryptoMethod, authContext, callback) { + const connection = authContext.connection; + const credentials = authContext.credentials; + const nonce = authContext.nonce; + const db = credentials.source; + + const saslStartCmd = makeFirstMessage(cryptoMethod, credentials, nonce); + connection.command(`${db}.$cmd`, saslStartCmd, (_err, result) => { + const err = resolveError(_err, result); + if (err) { + return callback(err); + } + + continueScramConversation(cryptoMethod, result.result, authContext, callback); + }); +} + +function continueScramConversation(cryptoMethod, response, authContext, callback) { + const connection = authContext.connection; + const credentials = authContext.credentials; + const nonce = authContext.nonce; + + const db = credentials.source; + const username = cleanUsername(credentials.username); + const password = credentials.password; + + let processedPassword; + if (cryptoMethod === 'sha256') { + processedPassword = saslprep ? saslprep(password) : password; + } else { + try { + processedPassword = passwordDigest(username, password); + } catch (e) { + return callback(e); + } + } + + const payload = Buffer.isBuffer(response.payload) + ? new Binary(response.payload) + : response.payload; + const dict = parsePayload(payload.value()); + + const iterations = parseInt(dict.i, 10); + if (iterations && iterations < 4096) { + callback(new MongoError(`Server returned an invalid iteration count ${iterations}`), false); + return; + } + + const salt = dict.s; + const rnonce = dict.r; + if (rnonce.startsWith('nonce')) { + callback(new MongoError(`Server returned an invalid nonce: ${rnonce}`), false); + return; + } + + // Set up start of proof + const withoutProof = `c=biws,r=${rnonce}`; + const saltedPassword = HI( + processedPassword, + Buffer.from(salt, 'base64'), + iterations, + cryptoMethod + ); + + const clientKey = HMAC(cryptoMethod, saltedPassword, 'Client Key'); + const serverKey = HMAC(cryptoMethod, saltedPassword, 'Server Key'); + const storedKey = H(cryptoMethod, clientKey); + const authMessage = [ + clientFirstMessageBare(username, nonce), + payload.value().toString('base64'), + withoutProof + ].join(','); + + const clientSignature = HMAC(cryptoMethod, storedKey, authMessage); + const clientProof = `p=${xor(clientKey, clientSignature)}`; + const clientFinal = [withoutProof, clientProof].join(','); + + const serverSignature = HMAC(cryptoMethod, serverKey, authMessage); + const saslContinueCmd = { + saslContinue: 1, + conversationId: response.conversationId, + payload: new Binary(Buffer.from(clientFinal)) + }; + + connection.command(`${db}.$cmd`, saslContinueCmd, (_err, result) => { + const err = resolveError(_err, result); + if (err) { + return callback(err); + } + + const r = result.result; + const parsedResponse = parsePayload(r.payload.value()); + if (!compareDigest(Buffer.from(parsedResponse.v, 'base64'), serverSignature)) { + callback(new MongoError('Server returned an invalid signature')); + return; + } + + if (!r || r.done !== false) { + return callback(err, r); + } + + const retrySaslContinueCmd = { + saslContinue: 1, + conversationId: r.conversationId, + payload: Buffer.alloc(0) + }; + + connection.command(`${db}.$cmd`, retrySaslContinueCmd, callback); + }); +} + +function parsePayload(payload) { + const dict = {}; + const parts = payload.split(','); + for (let i = 0; i < parts.length; i++) { + const valueParts = parts[i].split('='); + dict[valueParts[0]] = valueParts[1]; + } + + return dict; +} + +function passwordDigest(username, password) { + if (typeof username !== 'string') { + throw new MongoError('username must be a string'); + } + + if (typeof password !== 'string') { + throw new MongoError('password must be a string'); + } + + if (password.length === 0) { + throw new MongoError('password cannot be empty'); + } + + const md5 = crypto.createHash('md5'); + md5.update(`${username}:mongo:${password}`, 'utf8'); + return md5.digest('hex'); +} + +// XOR two buffers +function xor(a, b) { + if (!Buffer.isBuffer(a)) { + a = Buffer.from(a); + } + + if (!Buffer.isBuffer(b)) { + b = Buffer.from(b); + } + + const length = Math.max(a.length, b.length); + const res = []; + + for (let i = 0; i < length; i += 1) { + res.push(a[i] ^ b[i]); + } + + return Buffer.from(res).toString('base64'); +} + +function H(method, text) { + return crypto + .createHash(method) + .update(text) + .digest(); +} + +function HMAC(method, key, text) { + return crypto + .createHmac(method, key) + .update(text) + .digest(); +} + +let _hiCache = {}; +let _hiCacheCount = 0; +function _hiCachePurge() { + _hiCache = {}; + _hiCacheCount = 0; +} + +const hiLengthMap = { + sha256: 32, + sha1: 20 +}; + +function HI(data, salt, iterations, cryptoMethod) { + // omit the work if already generated + const key = [data, salt.toString('base64'), iterations].join('_'); + if (_hiCache[key] !== undefined) { + return _hiCache[key]; + } + + // generate the salt + const saltedData = crypto.pbkdf2Sync( + data, + salt, + iterations, + hiLengthMap[cryptoMethod], + cryptoMethod + ); + + // cache a copy to speed up the next lookup, but prevent unbounded cache growth + if (_hiCacheCount >= 200) { + _hiCachePurge(); + } + + _hiCache[key] = saltedData; + _hiCacheCount += 1; + return saltedData; +} + +function compareDigest(lhs, rhs) { + if (lhs.length !== rhs.length) { + return false; + } + + if (typeof crypto.timingSafeEqual === 'function') { + return crypto.timingSafeEqual(lhs, rhs); + } + + let result = 0; + for (let i = 0; i < lhs.length; i++) { + result |= lhs[i] ^ rhs[i]; + } + + return result === 0; +} + +function resolveError(err, result) { + if (err) return err; + + const r = result.result; + if (r.$err || r.errmsg) return new MongoError(r); +} + +class ScramSHA1 extends ScramSHA { + constructor(bson) { + super(bson, 'sha1'); + } +} + +class ScramSHA256 extends ScramSHA { + constructor(bson) { + super(bson, 'sha256'); + } +} + +module.exports = { ScramSHA1, ScramSHA256 }; diff --git a/node_modules/mongodb/lib/core/auth/x509.js b/node_modules/mongodb/lib/core/auth/x509.js new file mode 100644 index 00000000..4dafa3c6 --- /dev/null +++ b/node_modules/mongodb/lib/core/auth/x509.js @@ -0,0 +1,35 @@ +'use strict'; +const AuthProvider = require('./auth_provider').AuthProvider; + +class X509 extends AuthProvider { + prepare(handshakeDoc, authContext, callback) { + const credentials = authContext.credentials; + Object.assign(handshakeDoc, { + speculativeAuthenticate: x509AuthenticateCommand(credentials) + }); + + callback(undefined, handshakeDoc); + } + + auth(authContext, callback) { + const connection = authContext.connection; + const credentials = authContext.credentials; + const response = authContext.response; + if (response.speculativeAuthenticate) { + return callback(); + } + + connection.command('$external.$cmd', x509AuthenticateCommand(credentials), callback); + } +} + +function x509AuthenticateCommand(credentials) { + const command = { authenticate: 1, mechanism: 'MONGODB-X509' }; + if (credentials.username) { + Object.assign(command, { user: credentials.username }); + } + + return command; +} + +module.exports = X509; diff --git a/node_modules/mongodb/lib/core/connection/apm.js b/node_modules/mongodb/lib/core/connection/apm.js new file mode 100644 index 00000000..1acf22cb --- /dev/null +++ b/node_modules/mongodb/lib/core/connection/apm.js @@ -0,0 +1,251 @@ +'use strict'; +const Msg = require('../connection/msg').Msg; +const KillCursor = require('../connection/commands').KillCursor; +const GetMore = require('../connection/commands').GetMore; +const calculateDurationInMs = require('../../utils').calculateDurationInMs; + +/** Commands that we want to redact because of the sensitive nature of their contents */ +const SENSITIVE_COMMANDS = new Set([ + 'authenticate', + 'saslStart', + 'saslContinue', + 'getnonce', + 'createUser', + 'updateUser', + 'copydbgetnonce', + 'copydbsaslstart', + 'copydb' +]); + +// helper methods +const extractCommandName = commandDoc => Object.keys(commandDoc)[0]; +const namespace = command => command.ns; +const databaseName = command => command.ns.split('.')[0]; +const collectionName = command => command.ns.split('.')[1]; +const generateConnectionId = pool => + pool.options ? `${pool.options.host}:${pool.options.port}` : pool.address; +const maybeRedact = (commandName, result) => (SENSITIVE_COMMANDS.has(commandName) ? {} : result); +const isLegacyPool = pool => pool.s && pool.queue; + +const LEGACY_FIND_QUERY_MAP = { + $query: 'filter', + $orderby: 'sort', + $hint: 'hint', + $comment: 'comment', + $maxScan: 'maxScan', + $max: 'max', + $min: 'min', + $returnKey: 'returnKey', + $showDiskLoc: 'showRecordId', + $maxTimeMS: 'maxTimeMS', + $snapshot: 'snapshot' +}; + +const LEGACY_FIND_OPTIONS_MAP = { + numberToSkip: 'skip', + numberToReturn: 'batchSize', + returnFieldsSelector: 'projection' +}; + +const OP_QUERY_KEYS = [ + 'tailable', + 'oplogReplay', + 'noCursorTimeout', + 'awaitData', + 'partial', + 'exhaust' +]; + +/** + * Extract the actual command from the query, possibly upconverting if it's a legacy + * format + * + * @param {Object} command the command + */ +const extractCommand = command => { + if (command instanceof GetMore) { + return { + getMore: command.cursorId, + collection: collectionName(command), + batchSize: command.numberToReturn + }; + } + + if (command instanceof KillCursor) { + return { + killCursors: collectionName(command), + cursors: command.cursorIds + }; + } + + if (command instanceof Msg) { + return command.command; + } + + if (command.query && command.query.$query) { + let result; + if (command.ns === 'admin.$cmd') { + // upconvert legacy command + result = Object.assign({}, command.query.$query); + } else { + // upconvert legacy find command + result = { find: collectionName(command) }; + Object.keys(LEGACY_FIND_QUERY_MAP).forEach(key => { + if (typeof command.query[key] !== 'undefined') + result[LEGACY_FIND_QUERY_MAP[key]] = command.query[key]; + }); + } + + Object.keys(LEGACY_FIND_OPTIONS_MAP).forEach(key => { + if (typeof command[key] !== 'undefined') result[LEGACY_FIND_OPTIONS_MAP[key]] = command[key]; + }); + + OP_QUERY_KEYS.forEach(key => { + if (command[key]) result[key] = command[key]; + }); + + if (typeof command.pre32Limit !== 'undefined') { + result.limit = command.pre32Limit; + } + + if (command.query.$explain) { + return { explain: result }; + } + + return result; + } + + return command.query ? command.query : command; +}; + +const extractReply = (command, reply) => { + if (command instanceof GetMore) { + return { + ok: 1, + cursor: { + id: reply.message.cursorId, + ns: namespace(command), + nextBatch: reply.message.documents + } + }; + } + + if (command instanceof KillCursor) { + return { + ok: 1, + cursorsUnknown: command.cursorIds + }; + } + + // is this a legacy find command? + if (command.query && typeof command.query.$query !== 'undefined') { + return { + ok: 1, + cursor: { + id: reply.message.cursorId, + ns: namespace(command), + firstBatch: reply.message.documents + } + }; + } + + return reply && reply.result ? reply.result : reply; +}; + +const extractConnectionDetails = pool => { + if (isLegacyPool(pool)) { + return { + connectionId: generateConnectionId(pool) + }; + } + + // APM in the modern pool is done at the `Connection` level, so we rename it here for + // readability. + const connection = pool; + return { + address: connection.address, + connectionId: connection.id + }; +}; + +/** An event indicating the start of a given command */ +class CommandStartedEvent { + /** + * Create a started event + * + * @param {Pool} pool the pool that originated the command + * @param {Object} command the command + */ + constructor(pool, command) { + const cmd = extractCommand(command); + const commandName = extractCommandName(cmd); + const connectionDetails = extractConnectionDetails(pool); + + // NOTE: remove in major revision, this is not spec behavior + if (SENSITIVE_COMMANDS.has(commandName)) { + this.commandObj = {}; + this.commandObj[commandName] = true; + } + + Object.assign(this, connectionDetails, { + requestId: command.requestId, + databaseName: databaseName(command), + commandName, + command: cmd + }); + } +} + +/** An event indicating the success of a given command */ +class CommandSucceededEvent { + /** + * Create a succeeded event + * + * @param {Pool} pool the pool that originated the command + * @param {Object} command the command + * @param {Object} reply the reply for this command from the server + * @param {Array} started a high resolution tuple timestamp of when the command was first sent, to calculate duration + */ + constructor(pool, command, reply, started) { + const cmd = extractCommand(command); + const commandName = extractCommandName(cmd); + const connectionDetails = extractConnectionDetails(pool); + + Object.assign(this, connectionDetails, { + requestId: command.requestId, + commandName, + duration: calculateDurationInMs(started), + reply: maybeRedact(commandName, extractReply(command, reply)) + }); + } +} + +/** An event indicating the failure of a given command */ +class CommandFailedEvent { + /** + * Create a failure event + * + * @param {Pool} pool the pool that originated the command + * @param {Object} command the command + * @param {MongoError|Object} error the generated error or a server error response + * @param {Array} started a high resolution tuple timestamp of when the command was first sent, to calculate duration + */ + constructor(pool, command, error, started) { + const cmd = extractCommand(command); + const commandName = extractCommandName(cmd); + const connectionDetails = extractConnectionDetails(pool); + + Object.assign(this, connectionDetails, { + requestId: command.requestId, + commandName, + duration: calculateDurationInMs(started), + failure: maybeRedact(commandName, error) + }); + } +} + +module.exports = { + CommandStartedEvent, + CommandSucceededEvent, + CommandFailedEvent +}; diff --git a/node_modules/mongodb/lib/core/connection/command_result.js b/node_modules/mongodb/lib/core/connection/command_result.js new file mode 100644 index 00000000..762aa3f1 --- /dev/null +++ b/node_modules/mongodb/lib/core/connection/command_result.js @@ -0,0 +1,36 @@ +'use strict'; + +/** + * Creates a new CommandResult instance + * @class + * @param {object} result CommandResult object + * @param {Connection} connection A connection instance associated with this result + * @return {CommandResult} A cursor instance + */ +var CommandResult = function(result, connection, message) { + this.result = result; + this.connection = connection; + this.message = message; +}; + +/** + * Convert CommandResult to JSON + * @method + * @return {object} + */ +CommandResult.prototype.toJSON = function() { + let result = Object.assign({}, this, this.result); + delete result.message; + return result; +}; + +/** + * Convert CommandResult to String representation + * @method + * @return {string} + */ +CommandResult.prototype.toString = function() { + return JSON.stringify(this.toJSON()); +}; + +module.exports = CommandResult; diff --git a/node_modules/mongodb/lib/core/connection/commands.js b/node_modules/mongodb/lib/core/connection/commands.js new file mode 100644 index 00000000..b24ff848 --- /dev/null +++ b/node_modules/mongodb/lib/core/connection/commands.js @@ -0,0 +1,507 @@ +'use strict'; + +var retrieveBSON = require('./utils').retrieveBSON; +var BSON = retrieveBSON(); +var Long = BSON.Long; +const Buffer = require('safe-buffer').Buffer; + +// Incrementing request id +var _requestId = 0; + +// Wire command operation ids +var opcodes = require('../wireprotocol/shared').opcodes; + +// Query flags +var OPTS_TAILABLE_CURSOR = 2; +var OPTS_SLAVE = 4; +var OPTS_OPLOG_REPLAY = 8; +var OPTS_NO_CURSOR_TIMEOUT = 16; +var OPTS_AWAIT_DATA = 32; +var OPTS_EXHAUST = 64; +var OPTS_PARTIAL = 128; + +// Response flags +var CURSOR_NOT_FOUND = 1; +var QUERY_FAILURE = 2; +var SHARD_CONFIG_STALE = 4; +var AWAIT_CAPABLE = 8; + +/************************************************************** + * QUERY + **************************************************************/ +var Query = function(bson, ns, query, options) { + var self = this; + // Basic options needed to be passed in + if (ns == null) throw new Error('ns must be specified for query'); + if (query == null) throw new Error('query must be specified for query'); + + // Validate that we are not passing 0x00 in the collection name + if (ns.indexOf('\x00') !== -1) { + throw new Error('namespace cannot contain a null character'); + } + + // Basic options + this.bson = bson; + this.ns = ns; + this.query = query; + + // Additional options + this.numberToSkip = options.numberToSkip || 0; + this.numberToReturn = options.numberToReturn || 0; + this.returnFieldSelector = options.returnFieldSelector || null; + this.requestId = Query.getRequestId(); + + // special case for pre-3.2 find commands, delete ASAP + this.pre32Limit = options.pre32Limit; + + // Serialization option + this.serializeFunctions = + typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + this.ignoreUndefined = + typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : false; + this.maxBsonSize = options.maxBsonSize || 1024 * 1024 * 16; + this.checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : true; + this.batchSize = self.numberToReturn; + + // Flags + this.tailable = false; + this.slaveOk = typeof options.slaveOk === 'boolean' ? options.slaveOk : false; + this.oplogReplay = false; + this.noCursorTimeout = false; + this.awaitData = false; + this.exhaust = false; + this.partial = false; +}; + +// +// Assign a new request Id +Query.prototype.incRequestId = function() { + this.requestId = _requestId++; +}; + +// +// Assign a new request Id +Query.nextRequestId = function() { + return _requestId + 1; +}; + +// +// Uses a single allocated buffer for the process, avoiding multiple memory allocations +Query.prototype.toBin = function() { + var self = this; + var buffers = []; + var projection = null; + + // Set up the flags + var flags = 0; + if (this.tailable) { + flags |= OPTS_TAILABLE_CURSOR; + } + + if (this.slaveOk) { + flags |= OPTS_SLAVE; + } + + if (this.oplogReplay) { + flags |= OPTS_OPLOG_REPLAY; + } + + if (this.noCursorTimeout) { + flags |= OPTS_NO_CURSOR_TIMEOUT; + } + + if (this.awaitData) { + flags |= OPTS_AWAIT_DATA; + } + + if (this.exhaust) { + flags |= OPTS_EXHAUST; + } + + if (this.partial) { + flags |= OPTS_PARTIAL; + } + + // If batchSize is different to self.numberToReturn + if (self.batchSize !== self.numberToReturn) self.numberToReturn = self.batchSize; + + // Allocate write protocol header buffer + var header = Buffer.alloc( + 4 * 4 + // Header + 4 + // Flags + Buffer.byteLength(self.ns) + + 1 + // namespace + 4 + // numberToSkip + 4 // numberToReturn + ); + + // Add header to buffers + buffers.push(header); + + // Serialize the query + var query = self.bson.serialize(this.query, { + checkKeys: this.checkKeys, + serializeFunctions: this.serializeFunctions, + ignoreUndefined: this.ignoreUndefined + }); + + // Add query document + buffers.push(query); + + if (self.returnFieldSelector && Object.keys(self.returnFieldSelector).length > 0) { + // Serialize the projection document + projection = self.bson.serialize(this.returnFieldSelector, { + checkKeys: this.checkKeys, + serializeFunctions: this.serializeFunctions, + ignoreUndefined: this.ignoreUndefined + }); + // Add projection document + buffers.push(projection); + } + + // Total message size + var totalLength = header.length + query.length + (projection ? projection.length : 0); + + // Set up the index + var index = 4; + + // Write total document length + header[3] = (totalLength >> 24) & 0xff; + header[2] = (totalLength >> 16) & 0xff; + header[1] = (totalLength >> 8) & 0xff; + header[0] = totalLength & 0xff; + + // Write header information requestId + header[index + 3] = (this.requestId >> 24) & 0xff; + header[index + 2] = (this.requestId >> 16) & 0xff; + header[index + 1] = (this.requestId >> 8) & 0xff; + header[index] = this.requestId & 0xff; + index = index + 4; + + // Write header information responseTo + header[index + 3] = (0 >> 24) & 0xff; + header[index + 2] = (0 >> 16) & 0xff; + header[index + 1] = (0 >> 8) & 0xff; + header[index] = 0 & 0xff; + index = index + 4; + + // Write header information OP_QUERY + header[index + 3] = (opcodes.OP_QUERY >> 24) & 0xff; + header[index + 2] = (opcodes.OP_QUERY >> 16) & 0xff; + header[index + 1] = (opcodes.OP_QUERY >> 8) & 0xff; + header[index] = opcodes.OP_QUERY & 0xff; + index = index + 4; + + // Write header information flags + header[index + 3] = (flags >> 24) & 0xff; + header[index + 2] = (flags >> 16) & 0xff; + header[index + 1] = (flags >> 8) & 0xff; + header[index] = flags & 0xff; + index = index + 4; + + // Write collection name + index = index + header.write(this.ns, index, 'utf8') + 1; + header[index - 1] = 0; + + // Write header information flags numberToSkip + header[index + 3] = (this.numberToSkip >> 24) & 0xff; + header[index + 2] = (this.numberToSkip >> 16) & 0xff; + header[index + 1] = (this.numberToSkip >> 8) & 0xff; + header[index] = this.numberToSkip & 0xff; + index = index + 4; + + // Write header information flags numberToReturn + header[index + 3] = (this.numberToReturn >> 24) & 0xff; + header[index + 2] = (this.numberToReturn >> 16) & 0xff; + header[index + 1] = (this.numberToReturn >> 8) & 0xff; + header[index] = this.numberToReturn & 0xff; + index = index + 4; + + // Return the buffers + return buffers; +}; + +Query.getRequestId = function() { + return ++_requestId; +}; + +/************************************************************** + * GETMORE + **************************************************************/ +var GetMore = function(bson, ns, cursorId, opts) { + opts = opts || {}; + this.numberToReturn = opts.numberToReturn || 0; + this.requestId = _requestId++; + this.bson = bson; + this.ns = ns; + this.cursorId = cursorId; +}; + +// +// Uses a single allocated buffer for the process, avoiding multiple memory allocations +GetMore.prototype.toBin = function() { + var length = 4 + Buffer.byteLength(this.ns) + 1 + 4 + 8 + 4 * 4; + // Create command buffer + var index = 0; + // Allocate buffer + var _buffer = Buffer.alloc(length); + + // Write header information + // index = write32bit(index, _buffer, length); + _buffer[index + 3] = (length >> 24) & 0xff; + _buffer[index + 2] = (length >> 16) & 0xff; + _buffer[index + 1] = (length >> 8) & 0xff; + _buffer[index] = length & 0xff; + index = index + 4; + + // index = write32bit(index, _buffer, requestId); + _buffer[index + 3] = (this.requestId >> 24) & 0xff; + _buffer[index + 2] = (this.requestId >> 16) & 0xff; + _buffer[index + 1] = (this.requestId >> 8) & 0xff; + _buffer[index] = this.requestId & 0xff; + index = index + 4; + + // index = write32bit(index, _buffer, 0); + _buffer[index + 3] = (0 >> 24) & 0xff; + _buffer[index + 2] = (0 >> 16) & 0xff; + _buffer[index + 1] = (0 >> 8) & 0xff; + _buffer[index] = 0 & 0xff; + index = index + 4; + + // index = write32bit(index, _buffer, OP_GETMORE); + _buffer[index + 3] = (opcodes.OP_GETMORE >> 24) & 0xff; + _buffer[index + 2] = (opcodes.OP_GETMORE >> 16) & 0xff; + _buffer[index + 1] = (opcodes.OP_GETMORE >> 8) & 0xff; + _buffer[index] = opcodes.OP_GETMORE & 0xff; + index = index + 4; + + // index = write32bit(index, _buffer, 0); + _buffer[index + 3] = (0 >> 24) & 0xff; + _buffer[index + 2] = (0 >> 16) & 0xff; + _buffer[index + 1] = (0 >> 8) & 0xff; + _buffer[index] = 0 & 0xff; + index = index + 4; + + // Write collection name + index = index + _buffer.write(this.ns, index, 'utf8') + 1; + _buffer[index - 1] = 0; + + // Write batch size + // index = write32bit(index, _buffer, numberToReturn); + _buffer[index + 3] = (this.numberToReturn >> 24) & 0xff; + _buffer[index + 2] = (this.numberToReturn >> 16) & 0xff; + _buffer[index + 1] = (this.numberToReturn >> 8) & 0xff; + _buffer[index] = this.numberToReturn & 0xff; + index = index + 4; + + // Write cursor id + // index = write32bit(index, _buffer, cursorId.getLowBits()); + _buffer[index + 3] = (this.cursorId.getLowBits() >> 24) & 0xff; + _buffer[index + 2] = (this.cursorId.getLowBits() >> 16) & 0xff; + _buffer[index + 1] = (this.cursorId.getLowBits() >> 8) & 0xff; + _buffer[index] = this.cursorId.getLowBits() & 0xff; + index = index + 4; + + // index = write32bit(index, _buffer, cursorId.getHighBits()); + _buffer[index + 3] = (this.cursorId.getHighBits() >> 24) & 0xff; + _buffer[index + 2] = (this.cursorId.getHighBits() >> 16) & 0xff; + _buffer[index + 1] = (this.cursorId.getHighBits() >> 8) & 0xff; + _buffer[index] = this.cursorId.getHighBits() & 0xff; + index = index + 4; + + // Return buffer + return _buffer; +}; + +/************************************************************** + * KILLCURSOR + **************************************************************/ +var KillCursor = function(bson, ns, cursorIds) { + this.ns = ns; + this.requestId = _requestId++; + this.cursorIds = cursorIds; +}; + +// +// Uses a single allocated buffer for the process, avoiding multiple memory allocations +KillCursor.prototype.toBin = function() { + var length = 4 + 4 + 4 * 4 + this.cursorIds.length * 8; + + // Create command buffer + var index = 0; + var _buffer = Buffer.alloc(length); + + // Write header information + // index = write32bit(index, _buffer, length); + _buffer[index + 3] = (length >> 24) & 0xff; + _buffer[index + 2] = (length >> 16) & 0xff; + _buffer[index + 1] = (length >> 8) & 0xff; + _buffer[index] = length & 0xff; + index = index + 4; + + // index = write32bit(index, _buffer, requestId); + _buffer[index + 3] = (this.requestId >> 24) & 0xff; + _buffer[index + 2] = (this.requestId >> 16) & 0xff; + _buffer[index + 1] = (this.requestId >> 8) & 0xff; + _buffer[index] = this.requestId & 0xff; + index = index + 4; + + // index = write32bit(index, _buffer, 0); + _buffer[index + 3] = (0 >> 24) & 0xff; + _buffer[index + 2] = (0 >> 16) & 0xff; + _buffer[index + 1] = (0 >> 8) & 0xff; + _buffer[index] = 0 & 0xff; + index = index + 4; + + // index = write32bit(index, _buffer, OP_KILL_CURSORS); + _buffer[index + 3] = (opcodes.OP_KILL_CURSORS >> 24) & 0xff; + _buffer[index + 2] = (opcodes.OP_KILL_CURSORS >> 16) & 0xff; + _buffer[index + 1] = (opcodes.OP_KILL_CURSORS >> 8) & 0xff; + _buffer[index] = opcodes.OP_KILL_CURSORS & 0xff; + index = index + 4; + + // index = write32bit(index, _buffer, 0); + _buffer[index + 3] = (0 >> 24) & 0xff; + _buffer[index + 2] = (0 >> 16) & 0xff; + _buffer[index + 1] = (0 >> 8) & 0xff; + _buffer[index] = 0 & 0xff; + index = index + 4; + + // Write batch size + // index = write32bit(index, _buffer, this.cursorIds.length); + _buffer[index + 3] = (this.cursorIds.length >> 24) & 0xff; + _buffer[index + 2] = (this.cursorIds.length >> 16) & 0xff; + _buffer[index + 1] = (this.cursorIds.length >> 8) & 0xff; + _buffer[index] = this.cursorIds.length & 0xff; + index = index + 4; + + // Write all the cursor ids into the array + for (var i = 0; i < this.cursorIds.length; i++) { + // Write cursor id + // index = write32bit(index, _buffer, cursorIds[i].getLowBits()); + _buffer[index + 3] = (this.cursorIds[i].getLowBits() >> 24) & 0xff; + _buffer[index + 2] = (this.cursorIds[i].getLowBits() >> 16) & 0xff; + _buffer[index + 1] = (this.cursorIds[i].getLowBits() >> 8) & 0xff; + _buffer[index] = this.cursorIds[i].getLowBits() & 0xff; + index = index + 4; + + // index = write32bit(index, _buffer, cursorIds[i].getHighBits()); + _buffer[index + 3] = (this.cursorIds[i].getHighBits() >> 24) & 0xff; + _buffer[index + 2] = (this.cursorIds[i].getHighBits() >> 16) & 0xff; + _buffer[index + 1] = (this.cursorIds[i].getHighBits() >> 8) & 0xff; + _buffer[index] = this.cursorIds[i].getHighBits() & 0xff; + index = index + 4; + } + + // Return buffer + return _buffer; +}; + +var Response = function(bson, message, msgHeader, msgBody, opts) { + opts = opts || { promoteLongs: true, promoteValues: true, promoteBuffers: false }; + this.parsed = false; + this.raw = message; + this.data = msgBody; + this.bson = bson; + this.opts = opts; + + // Read the message header + this.length = msgHeader.length; + this.requestId = msgHeader.requestId; + this.responseTo = msgHeader.responseTo; + this.opCode = msgHeader.opCode; + this.fromCompressed = msgHeader.fromCompressed; + + // Read the message body + this.responseFlags = msgBody.readInt32LE(0); + this.cursorId = new Long(msgBody.readInt32LE(4), msgBody.readInt32LE(8)); + this.startingFrom = msgBody.readInt32LE(12); + this.numberReturned = msgBody.readInt32LE(16); + + // Preallocate document array + this.documents = new Array(this.numberReturned); + + // Flag values + this.cursorNotFound = (this.responseFlags & CURSOR_NOT_FOUND) !== 0; + this.queryFailure = (this.responseFlags & QUERY_FAILURE) !== 0; + this.shardConfigStale = (this.responseFlags & SHARD_CONFIG_STALE) !== 0; + this.awaitCapable = (this.responseFlags & AWAIT_CAPABLE) !== 0; + this.promoteLongs = typeof opts.promoteLongs === 'boolean' ? opts.promoteLongs : true; + this.promoteValues = typeof opts.promoteValues === 'boolean' ? opts.promoteValues : true; + this.promoteBuffers = typeof opts.promoteBuffers === 'boolean' ? opts.promoteBuffers : false; +}; + +Response.prototype.isParsed = function() { + return this.parsed; +}; + +Response.prototype.parse = function(options) { + // Don't parse again if not needed + if (this.parsed) return; + options = options || {}; + + // Allow the return of raw documents instead of parsing + var raw = options.raw || false; + var documentsReturnedIn = options.documentsReturnedIn || null; + var promoteLongs = + typeof options.promoteLongs === 'boolean' ? options.promoteLongs : this.opts.promoteLongs; + var promoteValues = + typeof options.promoteValues === 'boolean' ? options.promoteValues : this.opts.promoteValues; + var promoteBuffers = + typeof options.promoteBuffers === 'boolean' ? options.promoteBuffers : this.opts.promoteBuffers; + var bsonSize, _options; + + // Set up the options + _options = { + promoteLongs: promoteLongs, + promoteValues: promoteValues, + promoteBuffers: promoteBuffers + }; + + // Position within OP_REPLY at which documents start + // (See https://docs.mongodb.com/manual/reference/mongodb-wire-protocol/#wire-op-reply) + this.index = 20; + + // + // Parse Body + // + for (var i = 0; i < this.numberReturned; i++) { + bsonSize = + this.data[this.index] | + (this.data[this.index + 1] << 8) | + (this.data[this.index + 2] << 16) | + (this.data[this.index + 3] << 24); + + // If we have raw results specified slice the return document + if (raw) { + this.documents[i] = this.data.slice(this.index, this.index + bsonSize); + } else { + this.documents[i] = this.bson.deserialize( + this.data.slice(this.index, this.index + bsonSize), + _options + ); + } + + // Adjust the index + this.index = this.index + bsonSize; + } + + if (this.documents.length === 1 && documentsReturnedIn != null && raw) { + const fieldsAsRaw = {}; + fieldsAsRaw[documentsReturnedIn] = true; + _options.fieldsAsRaw = fieldsAsRaw; + + const doc = this.bson.deserialize(this.documents[0], _options); + this.documents = [doc]; + } + + // Set parsed + this.parsed = true; +}; + +module.exports = { + Query: Query, + GetMore: GetMore, + Response: Response, + KillCursor: KillCursor +}; diff --git a/node_modules/mongodb/lib/core/connection/connect.js b/node_modules/mongodb/lib/core/connection/connect.js new file mode 100644 index 00000000..05125a3d --- /dev/null +++ b/node_modules/mongodb/lib/core/connection/connect.js @@ -0,0 +1,352 @@ +'use strict'; +const net = require('net'); +const tls = require('tls'); +const Connection = require('./connection'); +const MongoError = require('../error').MongoError; +const MongoNetworkError = require('../error').MongoNetworkError; +const MongoNetworkTimeoutError = require('../error').MongoNetworkTimeoutError; +const defaultAuthProviders = require('../auth/defaultAuthProviders').defaultAuthProviders; +const AuthContext = require('../auth/auth_provider').AuthContext; +const WIRE_CONSTANTS = require('../wireprotocol/constants'); +const makeClientMetadata = require('../utils').makeClientMetadata; +const MAX_SUPPORTED_WIRE_VERSION = WIRE_CONSTANTS.MAX_SUPPORTED_WIRE_VERSION; +const MAX_SUPPORTED_SERVER_VERSION = WIRE_CONSTANTS.MAX_SUPPORTED_SERVER_VERSION; +const MIN_SUPPORTED_WIRE_VERSION = WIRE_CONSTANTS.MIN_SUPPORTED_WIRE_VERSION; +const MIN_SUPPORTED_SERVER_VERSION = WIRE_CONSTANTS.MIN_SUPPORTED_SERVER_VERSION; +let AUTH_PROVIDERS; + +function connect(options, cancellationToken, callback) { + if (typeof cancellationToken === 'function') { + callback = cancellationToken; + cancellationToken = undefined; + } + + const ConnectionType = options && options.connectionType ? options.connectionType : Connection; + if (AUTH_PROVIDERS == null) { + AUTH_PROVIDERS = defaultAuthProviders(options.bson); + } + + const family = options.family !== void 0 ? options.family : 0; + makeConnection(family, options, cancellationToken, (err, socket) => { + if (err) { + callback(err, socket); // in the error case, `socket` is the originating error event name + return; + } + + performInitialHandshake(new ConnectionType(socket, options), options, callback); + }); +} + +function isModernConnectionType(conn) { + return !(conn instanceof Connection); +} + +function checkSupportedServer(ismaster, options) { + const serverVersionHighEnough = + ismaster && + typeof ismaster.maxWireVersion === 'number' && + ismaster.maxWireVersion >= MIN_SUPPORTED_WIRE_VERSION; + const serverVersionLowEnough = + ismaster && + typeof ismaster.minWireVersion === 'number' && + ismaster.minWireVersion <= MAX_SUPPORTED_WIRE_VERSION; + + if (serverVersionHighEnough) { + if (serverVersionLowEnough) { + return null; + } + + const message = `Server at ${options.host}:${options.port} reports minimum wire version ${ismaster.minWireVersion}, but this version of the Node.js Driver requires at most ${MAX_SUPPORTED_WIRE_VERSION} (MongoDB ${MAX_SUPPORTED_SERVER_VERSION})`; + return new MongoError(message); + } + + const message = `Server at ${options.host}:${ + options.port + } reports maximum wire version ${ismaster.maxWireVersion || + 0}, but this version of the Node.js Driver requires at least ${MIN_SUPPORTED_WIRE_VERSION} (MongoDB ${MIN_SUPPORTED_SERVER_VERSION})`; + return new MongoError(message); +} + +function performInitialHandshake(conn, options, _callback) { + const callback = function(err, ret) { + if (err && conn) { + conn.destroy(); + } + _callback(err, ret); + }; + + const credentials = options.credentials; + if (credentials) { + if (!credentials.mechanism.match(/DEFAULT/i) && !AUTH_PROVIDERS[credentials.mechanism]) { + callback(new MongoError(`authMechanism '${credentials.mechanism}' not supported`)); + return; + } + } + + const authContext = new AuthContext(conn, credentials, options); + prepareHandshakeDocument(authContext, (err, handshakeDoc) => { + if (err) { + return callback(err); + } + + const handshakeOptions = Object.assign({}, options); + if (options.connectTimeoutMS || options.connectionTimeout) { + // The handshake technically is a monitoring check, so its socket timeout should be connectTimeoutMS + handshakeOptions.socketTimeout = options.connectTimeoutMS || options.connectionTimeout; + } + + const start = new Date().getTime(); + conn.command('admin.$cmd', handshakeDoc, handshakeOptions, (err, result) => { + if (err) { + callback(err); + return; + } + + const response = result.result; + if (response.ok === 0) { + callback(new MongoError(response)); + return; + } + + const supportedServerErr = checkSupportedServer(response, options); + if (supportedServerErr) { + callback(supportedServerErr); + return; + } + + if (!isModernConnectionType(conn)) { + // resolve compression + if (response.compression) { + const agreedCompressors = handshakeDoc.compression.filter( + compressor => response.compression.indexOf(compressor) !== -1 + ); + + if (agreedCompressors.length) { + conn.agreedCompressor = agreedCompressors[0]; + } + + if (options.compression && options.compression.zlibCompressionLevel) { + conn.zlibCompressionLevel = options.compression.zlibCompressionLevel; + } + } + } + + // NOTE: This is metadata attached to the connection while porting away from + // handshake being done in the `Server` class. Likely, it should be + // relocated, or at very least restructured. + conn.ismaster = response; + conn.lastIsMasterMS = new Date().getTime() - start; + + if (!response.arbiterOnly && credentials) { + // store the response on auth context + Object.assign(authContext, { response }); + + const resolvedCredentials = credentials.resolveAuthMechanism(response); + const authProvider = AUTH_PROVIDERS[resolvedCredentials.mechanism]; + authProvider.auth(authContext, err => { + if (err) return callback(err); + callback(undefined, conn); + }); + + return; + } + + callback(undefined, conn); + }); + }); +} + +function prepareHandshakeDocument(authContext, callback) { + const options = authContext.options; + const compressors = + options.compression && options.compression.compressors ? options.compression.compressors : []; + + const handshakeDoc = { + ismaster: true, + client: options.metadata || makeClientMetadata(options), + compression: compressors + }; + + const credentials = authContext.credentials; + if (credentials) { + if (credentials.mechanism.match(/DEFAULT/i) && credentials.username) { + Object.assign(handshakeDoc, { + saslSupportedMechs: `${credentials.source}.${credentials.username}` + }); + + AUTH_PROVIDERS['scram-sha-256'].prepare(handshakeDoc, authContext, callback); + return; + } + + const authProvider = AUTH_PROVIDERS[credentials.mechanism]; + authProvider.prepare(handshakeDoc, authContext, callback); + return; + } + + callback(undefined, handshakeDoc); +} + +const LEGAL_SSL_SOCKET_OPTIONS = [ + 'pfx', + 'key', + 'passphrase', + 'cert', + 'ca', + 'ciphers', + 'NPNProtocols', + 'ALPNProtocols', + 'servername', + 'ecdhCurve', + 'secureProtocol', + 'secureContext', + 'session', + 'minDHSize', + 'crl', + 'rejectUnauthorized' +]; + +function parseConnectOptions(family, options) { + const host = typeof options.host === 'string' ? options.host : 'localhost'; + if (host.indexOf('/') !== -1) { + return { path: host }; + } + + const result = { + family, + host, + port: typeof options.port === 'number' ? options.port : 27017, + rejectUnauthorized: false + }; + + return result; +} + +function parseSslOptions(family, options) { + const result = parseConnectOptions(family, options); + + // Merge in valid SSL options + for (const name in options) { + if (options[name] != null && LEGAL_SSL_SOCKET_OPTIONS.indexOf(name) !== -1) { + result[name] = options[name]; + } + } + + // Override checkServerIdentity behavior + if (options.checkServerIdentity === false) { + // Skip the identiy check by retuning undefined as per node documents + // https://nodejs.org/api/tls.html#tls_tls_connect_options_callback + result.checkServerIdentity = function() { + return undefined; + }; + } else if (typeof options.checkServerIdentity === 'function') { + result.checkServerIdentity = options.checkServerIdentity; + } + + // Set default sni servername to be the same as host + if (result.servername == null) { + result.servername = result.host; + } + + return result; +} + +const SOCKET_ERROR_EVENTS = new Set(['error', 'close', 'timeout', 'parseError']); +function makeConnection(family, options, cancellationToken, _callback) { + const useSsl = typeof options.ssl === 'boolean' ? options.ssl : false; + const keepAlive = typeof options.keepAlive === 'boolean' ? options.keepAlive : true; + let keepAliveInitialDelay = + typeof options.keepAliveInitialDelay === 'number' ? options.keepAliveInitialDelay : 120000; + const noDelay = typeof options.noDelay === 'boolean' ? options.noDelay : true; + const connectionTimeout = + typeof options.connectionTimeout === 'number' + ? options.connectionTimeout + : typeof options.connectTimeoutMS === 'number' + ? options.connectTimeoutMS + : 30000; + const socketTimeout = typeof options.socketTimeout === 'number' ? options.socketTimeout : 0; + const rejectUnauthorized = + typeof options.rejectUnauthorized === 'boolean' ? options.rejectUnauthorized : true; + + if (keepAliveInitialDelay > socketTimeout) { + keepAliveInitialDelay = Math.round(socketTimeout / 2); + } + + let socket; + const callback = function(err, ret) { + if (err && socket) { + socket.destroy(); + } + + _callback(err, ret); + }; + + try { + if (useSsl) { + socket = tls.connect(parseSslOptions(family, options)); + if (typeof socket.disableRenegotiation === 'function') { + socket.disableRenegotiation(); + } + } else { + socket = net.createConnection(parseConnectOptions(family, options)); + } + } catch (err) { + return callback(err); + } + + socket.setKeepAlive(keepAlive, keepAliveInitialDelay); + socket.setTimeout(connectionTimeout); + socket.setNoDelay(noDelay); + + const connectEvent = useSsl ? 'secureConnect' : 'connect'; + let cancellationHandler; + function errorHandler(eventName) { + return err => { + SOCKET_ERROR_EVENTS.forEach(event => socket.removeAllListeners(event)); + if (cancellationHandler) { + cancellationToken.removeListener('cancel', cancellationHandler); + } + + socket.removeListener(connectEvent, connectHandler); + callback(connectionFailureError(eventName, err)); + }; + } + + function connectHandler() { + SOCKET_ERROR_EVENTS.forEach(event => socket.removeAllListeners(event)); + if (cancellationHandler) { + cancellationToken.removeListener('cancel', cancellationHandler); + } + + if (socket.authorizationError && rejectUnauthorized) { + return callback(socket.authorizationError); + } + + socket.setTimeout(socketTimeout); + callback(null, socket); + } + + SOCKET_ERROR_EVENTS.forEach(event => socket.once(event, errorHandler(event))); + if (cancellationToken) { + cancellationHandler = errorHandler('cancel'); + cancellationToken.once('cancel', cancellationHandler); + } + + socket.once(connectEvent, connectHandler); +} + +function connectionFailureError(type, err) { + switch (type) { + case 'error': + return new MongoNetworkError(err); + case 'timeout': + return new MongoNetworkTimeoutError(`connection timed out`); + case 'close': + return new MongoNetworkError(`connection closed`); + case 'cancel': + return new MongoNetworkError(`connection establishment was cancelled`); + default: + return new MongoNetworkError(`unknown network error`); + } +} + +module.exports = connect; diff --git a/node_modules/mongodb/lib/core/connection/connection.js b/node_modules/mongodb/lib/core/connection/connection.js new file mode 100644 index 00000000..5b22513b --- /dev/null +++ b/node_modules/mongodb/lib/core/connection/connection.js @@ -0,0 +1,711 @@ +'use strict'; + +const EventEmitter = require('events').EventEmitter; +const crypto = require('crypto'); +const debugOptions = require('./utils').debugOptions; +const parseHeader = require('../wireprotocol/shared').parseHeader; +const decompress = require('../wireprotocol/compression').decompress; +const Response = require('./commands').Response; +const BinMsg = require('./msg').BinMsg; +const MongoNetworkError = require('../error').MongoNetworkError; +const MongoNetworkTimeoutError = require('../error').MongoNetworkTimeoutError; +const MongoError = require('../error').MongoError; +const Logger = require('./logger'); +const OP_COMPRESSED = require('../wireprotocol/shared').opcodes.OP_COMPRESSED; +const OP_MSG = require('../wireprotocol/shared').opcodes.OP_MSG; +const MESSAGE_HEADER_SIZE = require('../wireprotocol/shared').MESSAGE_HEADER_SIZE; +const Buffer = require('safe-buffer').Buffer; +const Query = require('./commands').Query; +const CommandResult = require('./command_result'); + +let _id = 0; + +const DEFAULT_MAX_BSON_MESSAGE_SIZE = 1024 * 1024 * 16 * 4; +const DEBUG_FIELDS = [ + 'host', + 'port', + 'size', + 'keepAlive', + 'keepAliveInitialDelay', + 'noDelay', + 'connectionTimeout', + 'socketTimeout', + 'ssl', + 'ca', + 'crl', + 'cert', + 'rejectUnauthorized', + 'promoteLongs', + 'promoteValues', + 'promoteBuffers', + 'checkServerIdentity' +]; + +let connectionAccountingSpy = undefined; +let connectionAccounting = false; +let connections = {}; + +/** + * A class representing a single connection to a MongoDB server + * + * @fires Connection#connect + * @fires Connection#close + * @fires Connection#error + * @fires Connection#timeout + * @fires Connection#parseError + * @fires Connection#message + */ +class Connection extends EventEmitter { + /** + * Creates a new Connection instance + * + * **NOTE**: Internal class, do not instantiate directly + * + * @param {Socket} socket The socket this connection wraps + * @param {Object} options Various settings + * @param {object} options.bson An implementation of bson serialize and deserialize + * @param {string} [options.host='localhost'] The host the socket is connected to + * @param {number} [options.port=27017] The port used for the socket connection + * @param {boolean} [options.keepAlive=true] TCP Connection keep alive enabled + * @param {number} [options.keepAliveInitialDelay=120000] Initial delay before TCP keep alive enabled + * @param {number} [options.connectionTimeout=30000] TCP Connection timeout setting + * @param {number} [options.socketTimeout=0] TCP Socket timeout setting + * @param {boolean} [options.promoteLongs] Convert Long values from the db into Numbers if they fit into 53 bits + * @param {boolean} [options.promoteValues] Promotes BSON values to native types where possible, set to false to only receive wrapper types. + * @param {boolean} [options.promoteBuffers] Promotes Binary BSON values to native Node Buffers. + * @param {number} [options.maxBsonMessageSize=0x4000000] Largest possible size of a BSON message (for legacy purposes) + */ + constructor(socket, options) { + super(); + + options = options || {}; + if (!options.bson) { + throw new TypeError('must pass in valid bson parser'); + } + + this.id = _id++; + this.options = options; + this.logger = Logger('Connection', options); + this.bson = options.bson; + this.tag = options.tag; + this.maxBsonMessageSize = options.maxBsonMessageSize || DEFAULT_MAX_BSON_MESSAGE_SIZE; + + this.port = options.port || 27017; + this.host = options.host || 'localhost'; + this.socketTimeout = typeof options.socketTimeout === 'number' ? options.socketTimeout : 0; + + // These values are inspected directly in tests, but maybe not necessary to keep around + this.keepAlive = typeof options.keepAlive === 'boolean' ? options.keepAlive : true; + this.keepAliveInitialDelay = + typeof options.keepAliveInitialDelay === 'number' ? options.keepAliveInitialDelay : 120000; + this.connectionTimeout = + typeof options.connectionTimeout === 'number' ? options.connectionTimeout : 30000; + if (this.keepAliveInitialDelay > this.socketTimeout) { + this.keepAliveInitialDelay = Math.round(this.socketTimeout / 2); + } + + // Debug information + if (this.logger.isDebug()) { + this.logger.debug( + `creating connection ${this.id} with options [${JSON.stringify( + debugOptions(DEBUG_FIELDS, options) + )}]` + ); + } + + // Response options + this.responseOptions = { + promoteLongs: typeof options.promoteLongs === 'boolean' ? options.promoteLongs : true, + promoteValues: typeof options.promoteValues === 'boolean' ? options.promoteValues : true, + promoteBuffers: typeof options.promoteBuffers === 'boolean' ? options.promoteBuffers : false + }; + + // Flushing + this.flushing = false; + this.queue = []; + + // Internal state + this.writeStream = null; + this.destroyed = false; + this.timedOut = false; + + // Create hash method + const hash = crypto.createHash('sha1'); + hash.update(this.address); + this.hashedName = hash.digest('hex'); + + // All operations in flight on the connection + this.workItems = []; + + // setup socket + this.socket = socket; + this.socket.once('error', errorHandler(this)); + this.socket.once('timeout', timeoutHandler(this)); + this.socket.once('close', closeHandler(this)); + this.socket.on('data', dataHandler(this)); + + if (connectionAccounting) { + addConnection(this.id, this); + } + } + + setSocketTimeout(value) { + if (this.socket) { + this.socket.setTimeout(value); + } + } + + resetSocketTimeout() { + if (this.socket) { + this.socket.setTimeout(this.socketTimeout); + } + } + + static enableConnectionAccounting(spy) { + if (spy) { + connectionAccountingSpy = spy; + } + + connectionAccounting = true; + connections = {}; + } + + static disableConnectionAccounting() { + connectionAccounting = false; + connectionAccountingSpy = undefined; + } + + static connections() { + return connections; + } + + get address() { + return `${this.host}:${this.port}`; + } + + /** + * Unref this connection + * @method + * @return {boolean} + */ + unref() { + if (this.socket == null) { + this.once('connect', () => this.socket.unref()); + return; + } + + this.socket.unref(); + } + + /** + * Flush all work Items on this connection + * + * @param {*} err The error to propagate to the flushed work items + */ + flush(err) { + while (this.workItems.length > 0) { + const workItem = this.workItems.shift(); + if (workItem.cb) { + workItem.cb(err); + } + } + } + + /** + * Destroy connection + * @method + */ + destroy(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + options = Object.assign({ force: false }, options); + + if (connectionAccounting) { + deleteConnection(this.id); + } + + if (this.socket == null) { + this.destroyed = true; + return; + } + + if (options.force || this.timedOut) { + this.socket.destroy(); + this.destroyed = true; + if (typeof callback === 'function') callback(null, null); + return; + } + + this.socket.end(err => { + this.destroyed = true; + if (typeof callback === 'function') callback(err, null); + }); + } + + /** + * Write to connection + * @method + * @param {Command} command Command to write out need to implement toBin and toBinUnified + */ + write(buffer) { + // Debug Log + if (this.logger.isDebug()) { + if (!Array.isArray(buffer)) { + this.logger.debug(`writing buffer [${buffer.toString('hex')}] to ${this.address}`); + } else { + for (let i = 0; i < buffer.length; i++) + this.logger.debug(`writing buffer [${buffer[i].toString('hex')}] to ${this.address}`); + } + } + + // Double check that the connection is not destroyed + if (this.socket.destroyed === false) { + // Write out the command + if (!Array.isArray(buffer)) { + this.socket.write(buffer, 'binary'); + return true; + } + + // Iterate over all buffers and write them in order to the socket + for (let i = 0; i < buffer.length; i++) { + this.socket.write(buffer[i], 'binary'); + } + + return true; + } + + // Connection is destroyed return write failed + return false; + } + + /** + * Return id of connection as a string + * @method + * @return {string} + */ + toString() { + return '' + this.id; + } + + /** + * Return json object of connection + * @method + * @return {object} + */ + toJSON() { + return { id: this.id, host: this.host, port: this.port }; + } + + /** + * Is the connection connected + * @method + * @return {boolean} + */ + isConnected() { + if (this.destroyed) return false; + return !this.socket.destroyed && this.socket.writable; + } + + /** + * @ignore + */ + command(ns, command, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + + const conn = this; + const socketTimeout = typeof options.socketTimeout === 'number' ? options.socketTimeout : 0; + const bson = conn.options.bson; + const query = new Query(bson, ns, command, { + numberToSkip: 0, + numberToReturn: 1 + }); + + const noop = () => {}; + function _callback(err, result) { + callback(err, result); + callback = noop; + } + + function errorHandler(err) { + conn.resetSocketTimeout(); + CONNECTION_ERROR_EVENTS.forEach(eventName => conn.removeListener(eventName, errorHandler)); + conn.removeListener('message', messageHandler); + + if (err == null) { + err = new MongoError(`runCommand failed for connection to '${conn.address}'`); + } + + // ignore all future errors + conn.on('error', noop); + _callback(err); + } + + function messageHandler(msg) { + if (msg.responseTo !== query.requestId) { + return; + } + + conn.resetSocketTimeout(); + CONNECTION_ERROR_EVENTS.forEach(eventName => conn.removeListener(eventName, errorHandler)); + conn.removeListener('message', messageHandler); + + msg.parse({ promoteValues: true }); + + const response = msg.documents[0]; + if (response.ok === 0 || response.$err || response.errmsg || response.code) { + _callback(new MongoError(response)); + return; + } + + _callback(undefined, new CommandResult(response, this, msg)); + } + + conn.setSocketTimeout(socketTimeout); + CONNECTION_ERROR_EVENTS.forEach(eventName => conn.once(eventName, errorHandler)); + conn.on('message', messageHandler); + conn.write(query.toBin()); + } +} + +const CONNECTION_ERROR_EVENTS = ['error', 'close', 'timeout', 'parseError']; + +function deleteConnection(id) { + // console.log("=== deleted connection " + id + " :: " + (connections[id] ? connections[id].port : '')) + delete connections[id]; + + if (connectionAccountingSpy) { + connectionAccountingSpy.deleteConnection(id); + } +} + +function addConnection(id, connection) { + // console.log("=== added connection " + id + " :: " + connection.port) + connections[id] = connection; + + if (connectionAccountingSpy) { + connectionAccountingSpy.addConnection(id, connection); + } +} + +// +// Connection handlers +function errorHandler(conn) { + return function(err) { + if (connectionAccounting) deleteConnection(conn.id); + // Debug information + if (conn.logger.isDebug()) { + conn.logger.debug( + `connection ${conn.id} for [${conn.address}] errored out with [${JSON.stringify(err)}]` + ); + } + + conn.emit('error', new MongoNetworkError(err), conn); + }; +} + +function timeoutHandler(conn) { + return function() { + if (connectionAccounting) deleteConnection(conn.id); + + if (conn.logger.isDebug()) { + conn.logger.debug(`connection ${conn.id} for [${conn.address}] timed out`); + } + + conn.timedOut = true; + conn.emit( + 'timeout', + new MongoNetworkTimeoutError(`connection ${conn.id} to ${conn.address} timed out`, { + beforeHandshake: conn.ismaster == null + }), + conn + ); + }; +} + +function closeHandler(conn) { + return function(hadError) { + if (connectionAccounting) deleteConnection(conn.id); + + if (conn.logger.isDebug()) { + conn.logger.debug(`connection ${conn.id} with for [${conn.address}] closed`); + } + + if (!hadError) { + conn.emit( + 'close', + new MongoNetworkError(`connection ${conn.id} to ${conn.address} closed`), + conn + ); + } + }; +} + +// Handle a message once it is received +function processMessage(conn, message) { + const msgHeader = parseHeader(message); + if (msgHeader.opCode !== OP_COMPRESSED) { + const ResponseConstructor = msgHeader.opCode === OP_MSG ? BinMsg : Response; + conn.emit( + 'message', + new ResponseConstructor( + conn.bson, + message, + msgHeader, + message.slice(MESSAGE_HEADER_SIZE), + conn.responseOptions + ), + conn + ); + + return; + } + + msgHeader.fromCompressed = true; + let index = MESSAGE_HEADER_SIZE; + msgHeader.opCode = message.readInt32LE(index); + index += 4; + msgHeader.length = message.readInt32LE(index); + index += 4; + const compressorID = message[index]; + index++; + + decompress(compressorID, message.slice(index), (err, decompressedMsgBody) => { + if (err) { + conn.emit('error', err); + return; + } + + if (decompressedMsgBody.length !== msgHeader.length) { + conn.emit( + 'error', + new MongoError( + 'Decompressing a compressed message from the server failed. The message is corrupt.' + ) + ); + + return; + } + + const ResponseConstructor = msgHeader.opCode === OP_MSG ? BinMsg : Response; + conn.emit( + 'message', + new ResponseConstructor( + conn.bson, + message, + msgHeader, + decompressedMsgBody, + conn.responseOptions + ), + conn + ); + }); +} + +function dataHandler(conn) { + return function(data) { + // Parse until we are done with the data + while (data.length > 0) { + // If we still have bytes to read on the current message + if (conn.bytesRead > 0 && conn.sizeOfMessage > 0) { + // Calculate the amount of remaining bytes + const remainingBytesToRead = conn.sizeOfMessage - conn.bytesRead; + // Check if the current chunk contains the rest of the message + if (remainingBytesToRead > data.length) { + // Copy the new data into the exiting buffer (should have been allocated when we know the message size) + data.copy(conn.buffer, conn.bytesRead); + // Adjust the number of bytes read so it point to the correct index in the buffer + conn.bytesRead = conn.bytesRead + data.length; + + // Reset state of buffer + data = Buffer.alloc(0); + } else { + // Copy the missing part of the data into our current buffer + data.copy(conn.buffer, conn.bytesRead, 0, remainingBytesToRead); + // Slice the overflow into a new buffer that we will then re-parse + data = data.slice(remainingBytesToRead); + + // Emit current complete message + const emitBuffer = conn.buffer; + // Reset state of buffer + conn.buffer = null; + conn.sizeOfMessage = 0; + conn.bytesRead = 0; + conn.stubBuffer = null; + + processMessage(conn, emitBuffer); + } + } else { + // Stub buffer is kept in case we don't get enough bytes to determine the + // size of the message (< 4 bytes) + if (conn.stubBuffer != null && conn.stubBuffer.length > 0) { + // If we have enough bytes to determine the message size let's do it + if (conn.stubBuffer.length + data.length > 4) { + // Prepad the data + const newData = Buffer.alloc(conn.stubBuffer.length + data.length); + conn.stubBuffer.copy(newData, 0); + data.copy(newData, conn.stubBuffer.length); + // Reassign for parsing + data = newData; + + // Reset state of buffer + conn.buffer = null; + conn.sizeOfMessage = 0; + conn.bytesRead = 0; + conn.stubBuffer = null; + } else { + // Add the the bytes to the stub buffer + const newStubBuffer = Buffer.alloc(conn.stubBuffer.length + data.length); + // Copy existing stub buffer + conn.stubBuffer.copy(newStubBuffer, 0); + // Copy missing part of the data + data.copy(newStubBuffer, conn.stubBuffer.length); + // Exit parsing loop + data = Buffer.alloc(0); + } + } else { + if (data.length > 4) { + // Retrieve the message size + const sizeOfMessage = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); + // If we have a negative sizeOfMessage emit error and return + if (sizeOfMessage < 0 || sizeOfMessage > conn.maxBsonMessageSize) { + const errorObject = { + err: 'socketHandler', + trace: '', + bin: conn.buffer, + parseState: { + sizeOfMessage: sizeOfMessage, + bytesRead: conn.bytesRead, + stubBuffer: conn.stubBuffer + } + }; + // We got a parse Error fire it off then keep going + conn.emit('parseError', errorObject, conn); + return; + } + + // Ensure that the size of message is larger than 0 and less than the max allowed + if ( + sizeOfMessage > 4 && + sizeOfMessage < conn.maxBsonMessageSize && + sizeOfMessage > data.length + ) { + conn.buffer = Buffer.alloc(sizeOfMessage); + // Copy all the data into the buffer + data.copy(conn.buffer, 0); + // Update bytes read + conn.bytesRead = data.length; + // Update sizeOfMessage + conn.sizeOfMessage = sizeOfMessage; + // Ensure stub buffer is null + conn.stubBuffer = null; + // Exit parsing loop + data = Buffer.alloc(0); + } else if ( + sizeOfMessage > 4 && + sizeOfMessage < conn.maxBsonMessageSize && + sizeOfMessage === data.length + ) { + const emitBuffer = data; + // Reset state of buffer + conn.buffer = null; + conn.sizeOfMessage = 0; + conn.bytesRead = 0; + conn.stubBuffer = null; + // Exit parsing loop + data = Buffer.alloc(0); + // Emit the message + processMessage(conn, emitBuffer); + } else if (sizeOfMessage <= 4 || sizeOfMessage > conn.maxBsonMessageSize) { + const errorObject = { + err: 'socketHandler', + trace: null, + bin: data, + parseState: { + sizeOfMessage: sizeOfMessage, + bytesRead: 0, + buffer: null, + stubBuffer: null + } + }; + // We got a parse Error fire it off then keep going + conn.emit('parseError', errorObject, conn); + + // Clear out the state of the parser + conn.buffer = null; + conn.sizeOfMessage = 0; + conn.bytesRead = 0; + conn.stubBuffer = null; + // Exit parsing loop + data = Buffer.alloc(0); + } else { + const emitBuffer = data.slice(0, sizeOfMessage); + // Reset state of buffer + conn.buffer = null; + conn.sizeOfMessage = 0; + conn.bytesRead = 0; + conn.stubBuffer = null; + // Copy rest of message + data = data.slice(sizeOfMessage); + // Emit the message + processMessage(conn, emitBuffer); + } + } else { + // Create a buffer that contains the space for the non-complete message + conn.stubBuffer = Buffer.alloc(data.length); + // Copy the data to the stub buffer + data.copy(conn.stubBuffer, 0); + // Exit parsing loop + data = Buffer.alloc(0); + } + } + } + } + }; +} + +/** + * A server connect event, used to verify that the connection is up and running + * + * @event Connection#connect + * @type {Connection} + */ + +/** + * The server connection closed, all pool connections closed + * + * @event Connection#close + * @type {Connection} + */ + +/** + * The server connection caused an error, all pool connections closed + * + * @event Connection#error + * @type {Connection} + */ + +/** + * The server connection timed out, all pool connections closed + * + * @event Connection#timeout + * @type {Connection} + */ + +/** + * The driver experienced an invalid message, all pool connections closed + * + * @event Connection#parseError + * @type {Connection} + */ + +/** + * An event emitted each time the connection receives a parsed message from the wire + * + * @event Connection#message + * @type {Connection} + */ + +module.exports = Connection; diff --git a/node_modules/mongodb/lib/core/connection/logger.js b/node_modules/mongodb/lib/core/connection/logger.js new file mode 100644 index 00000000..3b0be90d --- /dev/null +++ b/node_modules/mongodb/lib/core/connection/logger.js @@ -0,0 +1,251 @@ +'use strict'; + +var f = require('util').format, + MongoError = require('../error').MongoError; + +// Filters for classes +var classFilters = {}; +var filteredClasses = {}; +var level = null; +// Save the process id +var pid = process.pid; +// current logger +var currentLogger = null; + +/** + * @callback Logger~loggerCallback + * @param {string} msg message being logged + * @param {object} state an object containing more metadata about the logging message + */ + +/** + * Creates a new Logger instance + * @class + * @param {string} className The Class name associated with the logging instance + * @param {object} [options=null] Optional settings. + * @param {Logger~loggerCallback} [options.logger=null] Custom logger function; + * @param {string} [options.loggerLevel=error] Override default global log level. + */ +var Logger = function(className, options) { + if (!(this instanceof Logger)) return new Logger(className, options); + options = options || {}; + + // Current reference + this.className = className; + + // Current logger + if (options.logger) { + currentLogger = options.logger; + } else if (currentLogger == null) { + currentLogger = console.log; + } + + // Set level of logging, default is error + if (options.loggerLevel) { + level = options.loggerLevel || 'error'; + } + + // Add all class names + if (filteredClasses[this.className] == null) classFilters[this.className] = true; +}; + +/** + * Log a message at the debug level + * @method + * @param {string} message The message to log + * @param {object} object additional meta data to log + * @return {null} + */ +Logger.prototype.debug = function(message, object) { + if ( + this.isDebug() && + ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className]) || + (Object.keys(filteredClasses).length === 0 && classFilters[this.className])) + ) { + var dateTime = new Date().getTime(); + var msg = f('[%s-%s:%s] %s %s', 'DEBUG', this.className, pid, dateTime, message); + var state = { + type: 'debug', + message: message, + className: this.className, + pid: pid, + date: dateTime + }; + if (object) state.meta = object; + currentLogger(msg, state); + } +}; + +/** + * Log a message at the warn level + * @method + * @param {string} message The message to log + * @param {object} object additional meta data to log + * @return {null} + */ +(Logger.prototype.warn = function(message, object) { + if ( + this.isWarn() && + ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className]) || + (Object.keys(filteredClasses).length === 0 && classFilters[this.className])) + ) { + var dateTime = new Date().getTime(); + var msg = f('[%s-%s:%s] %s %s', 'WARN', this.className, pid, dateTime, message); + var state = { + type: 'warn', + message: message, + className: this.className, + pid: pid, + date: dateTime + }; + if (object) state.meta = object; + currentLogger(msg, state); + } +}), + /** + * Log a message at the info level + * @method + * @param {string} message The message to log + * @param {object} object additional meta data to log + * @return {null} + */ + (Logger.prototype.info = function(message, object) { + if ( + this.isInfo() && + ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className]) || + (Object.keys(filteredClasses).length === 0 && classFilters[this.className])) + ) { + var dateTime = new Date().getTime(); + var msg = f('[%s-%s:%s] %s %s', 'INFO', this.className, pid, dateTime, message); + var state = { + type: 'info', + message: message, + className: this.className, + pid: pid, + date: dateTime + }; + if (object) state.meta = object; + currentLogger(msg, state); + } + }), + /** + * Log a message at the error level + * @method + * @param {string} message The message to log + * @param {object} object additional meta data to log + * @return {null} + */ + (Logger.prototype.error = function(message, object) { + if ( + this.isError() && + ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className]) || + (Object.keys(filteredClasses).length === 0 && classFilters[this.className])) + ) { + var dateTime = new Date().getTime(); + var msg = f('[%s-%s:%s] %s %s', 'ERROR', this.className, pid, dateTime, message); + var state = { + type: 'error', + message: message, + className: this.className, + pid: pid, + date: dateTime + }; + if (object) state.meta = object; + currentLogger(msg, state); + } + }), + /** + * Is the logger set at info level + * @method + * @return {boolean} + */ + (Logger.prototype.isInfo = function() { + return level === 'info' || level === 'debug'; + }), + /** + * Is the logger set at error level + * @method + * @return {boolean} + */ + (Logger.prototype.isError = function() { + return level === 'error' || level === 'info' || level === 'debug'; + }), + /** + * Is the logger set at error level + * @method + * @return {boolean} + */ + (Logger.prototype.isWarn = function() { + return level === 'error' || level === 'warn' || level === 'info' || level === 'debug'; + }), + /** + * Is the logger set at debug level + * @method + * @return {boolean} + */ + (Logger.prototype.isDebug = function() { + return level === 'debug'; + }); + +/** + * Resets the logger to default settings, error and no filtered classes + * @method + * @return {null} + */ +Logger.reset = function() { + level = 'error'; + filteredClasses = {}; +}; + +/** + * Get the current logger function + * @method + * @return {Logger~loggerCallback} + */ +Logger.currentLogger = function() { + return currentLogger; +}; + +/** + * Set the current logger function + * @method + * @param {Logger~loggerCallback} logger Logger function. + * @return {null} + */ +Logger.setCurrentLogger = function(logger) { + if (typeof logger !== 'function') throw new MongoError('current logger must be a function'); + currentLogger = logger; +}; + +/** + * Set what classes to log. + * @method + * @param {string} type The type of filter (currently only class) + * @param {string[]} values The filters to apply + * @return {null} + */ +Logger.filter = function(type, values) { + if (type === 'class' && Array.isArray(values)) { + filteredClasses = {}; + + values.forEach(function(x) { + filteredClasses[x] = true; + }); + } +}; + +/** + * Set the current log level + * @method + * @param {string} level Set current log level (debug, info, error) + * @return {null} + */ +Logger.setLevel = function(_level) { + if (_level !== 'info' && _level !== 'error' && _level !== 'debug' && _level !== 'warn') { + throw new Error(f('%s is an illegal logging level', _level)); + } + + level = _level; +}; + +module.exports = Logger; diff --git a/node_modules/mongodb/lib/core/connection/msg.js b/node_modules/mongodb/lib/core/connection/msg.js new file mode 100644 index 00000000..9f15a811 --- /dev/null +++ b/node_modules/mongodb/lib/core/connection/msg.js @@ -0,0 +1,222 @@ +'use strict'; + +// Implementation of OP_MSG spec: +// https://github.com/mongodb/specifications/blob/master/source/message/OP_MSG.rst +// +// struct Section { +// uint8 payloadType; +// union payload { +// document document; // payloadType == 0 +// struct sequence { // payloadType == 1 +// int32 size; +// cstring identifier; +// document* documents; +// }; +// }; +// }; + +// struct OP_MSG { +// struct MsgHeader { +// int32 messageLength; +// int32 requestID; +// int32 responseTo; +// int32 opCode = 2013; +// }; +// uint32 flagBits; +// Section+ sections; +// [uint32 checksum;] +// }; + +const Buffer = require('safe-buffer').Buffer; +const opcodes = require('../wireprotocol/shared').opcodes; +const databaseNamespace = require('../wireprotocol/shared').databaseNamespace; +const ReadPreference = require('../topologies/read_preference'); + +// Incrementing request id +let _requestId = 0; + +// Msg Flags +const OPTS_CHECKSUM_PRESENT = 1; +const OPTS_MORE_TO_COME = 2; +const OPTS_EXHAUST_ALLOWED = 1 << 16; + +class Msg { + constructor(bson, ns, command, options) { + // Basic options needed to be passed in + if (command == null) throw new Error('query must be specified for query'); + + // Basic options + this.bson = bson; + this.ns = ns; + this.command = command; + this.command.$db = databaseNamespace(ns); + + if (options.readPreference && options.readPreference.mode !== ReadPreference.PRIMARY) { + this.command.$readPreference = options.readPreference.toJSON(); + } + + // Ensure empty options + this.options = options || {}; + + // Additional options + this.requestId = options.requestId ? options.requestId : Msg.getRequestId(); + + // Serialization option + this.serializeFunctions = + typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + this.ignoreUndefined = + typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : false; + this.checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : false; + this.maxBsonSize = options.maxBsonSize || 1024 * 1024 * 16; + + // flags + this.checksumPresent = false; + this.moreToCome = options.moreToCome || false; + this.exhaustAllowed = + typeof options.exhaustAllowed === 'boolean' ? options.exhaustAllowed : false; + } + + toBin() { + const buffers = []; + let flags = 0; + + if (this.checksumPresent) { + flags |= OPTS_CHECKSUM_PRESENT; + } + + if (this.moreToCome) { + flags |= OPTS_MORE_TO_COME; + } + + if (this.exhaustAllowed) { + flags |= OPTS_EXHAUST_ALLOWED; + } + + const header = Buffer.alloc( + 4 * 4 + // Header + 4 // Flags + ); + + buffers.push(header); + + let totalLength = header.length; + const command = this.command; + totalLength += this.makeDocumentSegment(buffers, command); + + header.writeInt32LE(totalLength, 0); // messageLength + header.writeInt32LE(this.requestId, 4); // requestID + header.writeInt32LE(0, 8); // responseTo + header.writeInt32LE(opcodes.OP_MSG, 12); // opCode + header.writeUInt32LE(flags, 16); // flags + return buffers; + } + + makeDocumentSegment(buffers, document) { + const payloadTypeBuffer = Buffer.alloc(1); + payloadTypeBuffer[0] = 0; + + const documentBuffer = this.serializeBson(document); + buffers.push(payloadTypeBuffer); + buffers.push(documentBuffer); + + return payloadTypeBuffer.length + documentBuffer.length; + } + + serializeBson(document) { + return this.bson.serialize(document, { + checkKeys: this.checkKeys, + serializeFunctions: this.serializeFunctions, + ignoreUndefined: this.ignoreUndefined + }); + } +} + +Msg.getRequestId = function() { + _requestId = (_requestId + 1) & 0x7fffffff; + return _requestId; +}; + +class BinMsg { + constructor(bson, message, msgHeader, msgBody, opts) { + opts = opts || { promoteLongs: true, promoteValues: true, promoteBuffers: false }; + this.parsed = false; + this.raw = message; + this.data = msgBody; + this.bson = bson; + this.opts = opts; + + // Read the message header + this.length = msgHeader.length; + this.requestId = msgHeader.requestId; + this.responseTo = msgHeader.responseTo; + this.opCode = msgHeader.opCode; + this.fromCompressed = msgHeader.fromCompressed; + + // Read response flags + this.responseFlags = msgBody.readInt32LE(0); + this.checksumPresent = (this.responseFlags & OPTS_CHECKSUM_PRESENT) !== 0; + this.moreToCome = (this.responseFlags & OPTS_MORE_TO_COME) !== 0; + this.exhaustAllowed = (this.responseFlags & OPTS_EXHAUST_ALLOWED) !== 0; + this.promoteLongs = typeof opts.promoteLongs === 'boolean' ? opts.promoteLongs : true; + this.promoteValues = typeof opts.promoteValues === 'boolean' ? opts.promoteValues : true; + this.promoteBuffers = typeof opts.promoteBuffers === 'boolean' ? opts.promoteBuffers : false; + + this.documents = []; + } + + isParsed() { + return this.parsed; + } + + parse(options) { + // Don't parse again if not needed + if (this.parsed) return; + options = options || {}; + + this.index = 4; + // Allow the return of raw documents instead of parsing + const raw = options.raw || false; + const documentsReturnedIn = options.documentsReturnedIn || null; + const promoteLongs = + typeof options.promoteLongs === 'boolean' ? options.promoteLongs : this.opts.promoteLongs; + const promoteValues = + typeof options.promoteValues === 'boolean' ? options.promoteValues : this.opts.promoteValues; + const promoteBuffers = + typeof options.promoteBuffers === 'boolean' + ? options.promoteBuffers + : this.opts.promoteBuffers; + + // Set up the options + const _options = { + promoteLongs: promoteLongs, + promoteValues: promoteValues, + promoteBuffers: promoteBuffers + }; + + while (this.index < this.data.length) { + const payloadType = this.data.readUInt8(this.index++); + if (payloadType === 1) { + console.error('TYPE 1'); + } else if (payloadType === 0) { + const bsonSize = this.data.readUInt32LE(this.index); + const bin = this.data.slice(this.index, this.index + bsonSize); + this.documents.push(raw ? bin : this.bson.deserialize(bin, _options)); + + this.index += bsonSize; + } + } + + if (this.documents.length === 1 && documentsReturnedIn != null && raw) { + const fieldsAsRaw = {}; + fieldsAsRaw[documentsReturnedIn] = true; + _options.fieldsAsRaw = fieldsAsRaw; + + const doc = this.bson.deserialize(this.documents[0], _options); + this.documents = [doc]; + } + + this.parsed = true; + } +} + +module.exports = { Msg, BinMsg }; diff --git a/node_modules/mongodb/lib/core/connection/pool.js b/node_modules/mongodb/lib/core/connection/pool.js new file mode 100644 index 00000000..f0061ee9 --- /dev/null +++ b/node_modules/mongodb/lib/core/connection/pool.js @@ -0,0 +1,1281 @@ +'use strict'; + +const inherits = require('util').inherits; +const EventEmitter = require('events').EventEmitter; +const MongoError = require('../error').MongoError; +const MongoTimeoutError = require('../error').MongoTimeoutError; +const MongoWriteConcernError = require('../error').MongoWriteConcernError; +const Logger = require('./logger'); +const f = require('util').format; +const Msg = require('./msg').Msg; +const CommandResult = require('./command_result'); +const MESSAGE_HEADER_SIZE = require('../wireprotocol/shared').MESSAGE_HEADER_SIZE; +const COMPRESSION_DETAILS_SIZE = require('../wireprotocol/shared').COMPRESSION_DETAILS_SIZE; +const opcodes = require('../wireprotocol/shared').opcodes; +const compress = require('../wireprotocol/compression').compress; +const compressorIDs = require('../wireprotocol/compression').compressorIDs; +const uncompressibleCommands = require('../wireprotocol/compression').uncompressibleCommands; +const apm = require('./apm'); +const Buffer = require('safe-buffer').Buffer; +const connect = require('./connect'); +const updateSessionFromResponse = require('../sessions').updateSessionFromResponse; +const eachAsync = require('../utils').eachAsync; +const makeStateMachine = require('../utils').makeStateMachine; +const now = require('../../utils').now; + +const DISCONNECTED = 'disconnected'; +const CONNECTING = 'connecting'; +const CONNECTED = 'connected'; +const DRAINING = 'draining'; +const DESTROYING = 'destroying'; +const DESTROYED = 'destroyed'; +const stateTransition = makeStateMachine({ + [DISCONNECTED]: [CONNECTING, DRAINING, DISCONNECTED], + [CONNECTING]: [CONNECTING, CONNECTED, DRAINING, DISCONNECTED], + [CONNECTED]: [CONNECTED, DISCONNECTED, DRAINING], + [DRAINING]: [DRAINING, DESTROYING, DESTROYED], + [DESTROYING]: [DESTROYING, DESTROYED], + [DESTROYED]: [DESTROYED] +}); + +const CONNECTION_EVENTS = new Set([ + 'error', + 'close', + 'timeout', + 'parseError', + 'connect', + 'message' +]); + +var _id = 0; + +/** + * Creates a new Pool instance + * @class + * @param {string} options.host The server host + * @param {number} options.port The server port + * @param {number} [options.size=5] Max server connection pool size + * @param {number} [options.minSize=0] Minimum server connection pool size + * @param {boolean} [options.reconnect=true] Server will attempt to reconnect on loss of connection + * @param {number} [options.reconnectTries=30] Server attempt to reconnect #times + * @param {number} [options.reconnectInterval=1000] Server will wait # milliseconds between retries + * @param {boolean} [options.keepAlive=true] TCP Connection keep alive enabled + * @param {number} [options.keepAliveInitialDelay=120000] Initial delay before TCP keep alive enabled + * @param {boolean} [options.noDelay=true] TCP Connection no delay + * @param {number} [options.connectionTimeout=30000] TCP Connection timeout setting + * @param {number} [options.socketTimeout=0] TCP Socket timeout setting + * @param {number} [options.monitoringSocketTimeout=0] TCP Socket timeout setting for replicaset monitoring socket + * @param {boolean} [options.ssl=false] Use SSL for connection + * @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function. + * @param {Buffer} [options.ca] SSL Certificate store binary buffer + * @param {Buffer} [options.crl] SSL Certificate revocation store binary buffer + * @param {Buffer} [options.cert] SSL Certificate binary buffer + * @param {Buffer} [options.key] SSL Key file binary buffer + * @param {string} [options.passphrase] SSL Certificate pass phrase + * @param {boolean} [options.rejectUnauthorized=false] Reject unauthorized server certificates + * @param {boolean} [options.promoteLongs=true] Convert Long values from the db into Numbers if they fit into 53 bits + * @param {boolean} [options.promoteValues=true] Promotes BSON values to native types where possible, set to false to only receive wrapper types. + * @param {boolean} [options.promoteBuffers=false] Promotes Binary BSON values to native Node Buffers. + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. + * @fires Pool#connect + * @fires Pool#close + * @fires Pool#error + * @fires Pool#timeout + * @fires Pool#parseError + * @return {Pool} A cursor instance + */ +var Pool = function(topology, options) { + // Add event listener + EventEmitter.call(this); + + // Store topology for later use + this.topology = topology; + + this.s = { + state: DISCONNECTED, + cancellationToken: new EventEmitter() + }; + + // we don't care how many connections are listening for cancellation + this.s.cancellationToken.setMaxListeners(Infinity); + + // Add the options + this.options = Object.assign( + { + // Host and port settings + host: 'localhost', + port: 27017, + // Pool default max size + size: 5, + // Pool default min size + minSize: 0, + // socket settings + connectionTimeout: 30000, + socketTimeout: 0, + keepAlive: true, + keepAliveInitialDelay: 120000, + noDelay: true, + // SSL Settings + ssl: false, + checkServerIdentity: true, + ca: null, + crl: null, + cert: null, + key: null, + passphrase: null, + rejectUnauthorized: false, + promoteLongs: true, + promoteValues: true, + promoteBuffers: false, + // Reconnection options + reconnect: true, + reconnectInterval: 1000, + reconnectTries: 30, + // Enable domains + domainsEnabled: false, + // feature flag for determining if we are running with the unified topology or not + legacyCompatMode: true + }, + options + ); + + // Identification information + this.id = _id++; + // Current reconnect retries + this.retriesLeft = this.options.reconnectTries; + this.reconnectId = null; + this.reconnectError = null; + // No bson parser passed in + if ( + !options.bson || + (options.bson && + (typeof options.bson.serialize !== 'function' || + typeof options.bson.deserialize !== 'function')) + ) { + throw new Error('must pass in valid bson parser'); + } + + // Logger instance + this.logger = Logger('Pool', options); + // Connections + this.availableConnections = []; + this.inUseConnections = []; + this.connectingConnections = 0; + // Currently executing + this.executing = false; + // Operation work queue + this.queue = []; + + // Number of consecutive timeouts caught + this.numberOfConsecutiveTimeouts = 0; + // Current pool Index + this.connectionIndex = 0; + + // event handlers + const pool = this; + this._messageHandler = messageHandler(this); + this._connectionCloseHandler = function(err) { + const connection = this; + connectionFailureHandler(pool, 'close', err, connection); + }; + + this._connectionErrorHandler = function(err) { + const connection = this; + connectionFailureHandler(pool, 'error', err, connection); + }; + + this._connectionTimeoutHandler = function(err) { + const connection = this; + connectionFailureHandler(pool, 'timeout', err, connection); + }; + + this._connectionParseErrorHandler = function(err) { + const connection = this; + connectionFailureHandler(pool, 'parseError', err, connection); + }; +}; + +inherits(Pool, EventEmitter); + +Object.defineProperty(Pool.prototype, 'size', { + enumerable: true, + get: function() { + return this.options.size; + } +}); + +Object.defineProperty(Pool.prototype, 'minSize', { + enumerable: true, + get: function() { + return this.options.minSize; + } +}); + +Object.defineProperty(Pool.prototype, 'connectionTimeout', { + enumerable: true, + get: function() { + return this.options.connectionTimeout; + } +}); + +Object.defineProperty(Pool.prototype, 'socketTimeout', { + enumerable: true, + get: function() { + return this.options.socketTimeout; + } +}); + +Object.defineProperty(Pool.prototype, 'state', { + enumerable: true, + get: function() { + return this.s.state; + } +}); + +// clears all pool state +function resetPoolState(pool) { + pool.inUseConnections = []; + pool.availableConnections = []; + pool.connectingConnections = 0; + pool.executing = false; + pool.numberOfConsecutiveTimeouts = 0; + pool.connectionIndex = 0; + pool.retriesLeft = pool.options.reconnectTries; + pool.reconnectId = null; +} + +function connectionFailureHandler(pool, event, err, conn) { + if (conn) { + if (conn._connectionFailHandled) { + return; + } + + conn._connectionFailHandled = true; + conn.destroy(); + + // Remove the connection + removeConnection(pool, conn); + + // flush remaining work items + conn.flush(err); + } + + // Did we catch a timeout, increment the numberOfConsecutiveTimeouts + if (event === 'timeout') { + pool.numberOfConsecutiveTimeouts = pool.numberOfConsecutiveTimeouts + 1; + + // Have we timed out more than reconnectTries in a row ? + // Force close the pool as we are trying to connect to tcp sink hole + if (pool.numberOfConsecutiveTimeouts > pool.options.reconnectTries) { + pool.numberOfConsecutiveTimeouts = 0; + // Destroy all connections and pool + pool.destroy(true); + // Emit close event + return pool.emit('close', pool); + } + } + + // No more socket available propegate the event + if (pool.socketCount() === 0) { + if (pool.state !== DESTROYED && pool.state !== DESTROYING && pool.state !== DRAINING) { + if (pool.options.reconnect) { + stateTransition(pool, DISCONNECTED); + } + } + + // Do not emit error events, they are always close events + // do not trigger the low level error handler in node + event = event === 'error' ? 'close' : event; + pool.emit(event, err); + } + + // Start reconnection attempts + if (!pool.reconnectId && pool.options.reconnect) { + pool.reconnectError = err; + pool.reconnectId = setTimeout(attemptReconnect(pool), pool.options.reconnectInterval); + } + + // Do we need to do anything to maintain the minimum pool size + const totalConnections = totalConnectionCount(pool); + if (totalConnections < pool.minSize) { + createConnection(pool); + } +} + +function attemptReconnect(pool, callback) { + return function() { + pool.emit('attemptReconnect', pool); + + if (pool.state === DESTROYED || pool.state === DESTROYING) { + if (typeof callback === 'function') { + callback(new MongoError('Cannot create connection when pool is destroyed')); + } + + return; + } + + pool.retriesLeft = pool.retriesLeft - 1; + if (pool.retriesLeft <= 0) { + pool.destroy(); + + const error = new MongoTimeoutError( + `failed to reconnect after ${pool.options.reconnectTries} attempts with interval ${pool.options.reconnectInterval} ms`, + pool.reconnectError + ); + + pool.emit('reconnectFailed', error); + if (typeof callback === 'function') { + callback(error); + } + + return; + } + + // clear the reconnect id on retry + pool.reconnectId = null; + + // now retry creating a connection + createConnection(pool, (err, conn) => { + if (err == null) { + pool.reconnectId = null; + pool.retriesLeft = pool.options.reconnectTries; + pool.emit('reconnect', pool); + } + + if (typeof callback === 'function') { + callback(err, conn); + } + }); + }; +} + +function moveConnectionBetween(connection, from, to) { + var index = from.indexOf(connection); + // Move the connection from connecting to available + if (index !== -1) { + from.splice(index, 1); + to.push(connection); + } +} + +function messageHandler(self) { + return function(message, connection) { + // workItem to execute + var workItem = null; + + // Locate the workItem + for (var i = 0; i < connection.workItems.length; i++) { + if (connection.workItems[i].requestId === message.responseTo) { + // Get the callback + workItem = connection.workItems[i]; + // Remove from list of workItems + connection.workItems.splice(i, 1); + } + } + + if (workItem && workItem.monitoring) { + moveConnectionBetween(connection, self.inUseConnections, self.availableConnections); + } + + // Reset timeout counter + self.numberOfConsecutiveTimeouts = 0; + + // Reset the connection timeout if we modified it for + // this operation + if (workItem && workItem.socketTimeout) { + connection.resetSocketTimeout(); + } + + // Log if debug enabled + if (self.logger.isDebug()) { + self.logger.debug( + f( + 'message [%s] received from %s:%s', + message.raw.toString('hex'), + self.options.host, + self.options.port + ) + ); + } + + function handleOperationCallback(self, cb, err, result) { + // No domain enabled + if (!self.options.domainsEnabled) { + return process.nextTick(function() { + return cb(err, result); + }); + } + + // Domain enabled just call the callback + cb(err, result); + } + + // Keep executing, ensure current message handler does not stop execution + if (!self.executing) { + process.nextTick(function() { + _execute(self)(); + }); + } + + // Time to dispatch the message if we have a callback + if (workItem && !workItem.immediateRelease) { + try { + // Parse the message according to the provided options + message.parse(workItem); + } catch (err) { + return handleOperationCallback(self, workItem.cb, new MongoError(err)); + } + + if (message.documents[0]) { + const document = message.documents[0]; + const session = workItem.session; + if (session) { + updateSessionFromResponse(session, document); + } + + if (self.topology && document.$clusterTime) { + self.topology.clusterTime = document.$clusterTime; + } + } + + // Establish if we have an error + if (workItem.command && message.documents[0]) { + const responseDoc = message.documents[0]; + + if (responseDoc.writeConcernError) { + const err = new MongoWriteConcernError(responseDoc.writeConcernError, responseDoc); + return handleOperationCallback(self, workItem.cb, err); + } + + if (responseDoc.ok === 0 || responseDoc.$err || responseDoc.errmsg || responseDoc.code) { + return handleOperationCallback(self, workItem.cb, new MongoError(responseDoc)); + } + } + + // Add the connection details + message.hashedName = connection.hashedName; + + // Return the documents + handleOperationCallback( + self, + workItem.cb, + null, + new CommandResult(workItem.fullResult ? message : message.documents[0], connection, message) + ); + } + }; +} + +/** + * Return the total socket count in the pool. + * @method + * @return {Number} The number of socket available. + */ +Pool.prototype.socketCount = function() { + return this.availableConnections.length + this.inUseConnections.length; + // + this.connectingConnections.length; +}; + +function totalConnectionCount(pool) { + return ( + pool.availableConnections.length + pool.inUseConnections.length + pool.connectingConnections + ); +} + +/** + * Return all pool connections + * @method + * @return {Connection[]} The pool connections + */ +Pool.prototype.allConnections = function() { + return this.availableConnections.concat(this.inUseConnections); +}; + +/** + * Get a pool connection (round-robin) + * @method + * @return {Connection} + */ +Pool.prototype.get = function() { + return this.allConnections()[0]; +}; + +/** + * Is the pool connected + * @method + * @return {boolean} + */ +Pool.prototype.isConnected = function() { + // We are in a destroyed state + if (this.state === DESTROYED || this.state === DESTROYING) { + return false; + } + + // Get connections + var connections = this.availableConnections.concat(this.inUseConnections); + + // Check if we have any connected connections + for (var i = 0; i < connections.length; i++) { + if (connections[i].isConnected()) return true; + } + + // Not connected + return false; +}; + +/** + * Was the pool destroyed + * @method + * @return {boolean} + */ +Pool.prototype.isDestroyed = function() { + return this.state === DESTROYED || this.state === DESTROYING; +}; + +/** + * Is the pool in a disconnected state + * @method + * @return {boolean} + */ +Pool.prototype.isDisconnected = function() { + return this.state === DISCONNECTED; +}; + +/** + * Connect pool + */ +Pool.prototype.connect = function(callback) { + if (this.state !== DISCONNECTED) { + throw new MongoError('connection in unlawful state ' + this.state); + } + + stateTransition(this, CONNECTING); + createConnection(this, (err, conn) => { + if (err) { + if (typeof callback === 'function') { + this.destroy(); + callback(err); + return; + } + + if (this.state === CONNECTING) { + this.emit('error', err); + } + + this.destroy(); + return; + } + + stateTransition(this, CONNECTED); + + // create min connections + if (this.minSize) { + for (let i = 0; i < this.minSize; i++) { + createConnection(this); + } + } + + if (typeof callback === 'function') { + callback(null, conn); + } else { + this.emit('connect', this, conn); + } + }); +}; + +/** + * Authenticate using a specified mechanism + * @param {authResultCallback} callback A callback function + */ +Pool.prototype.auth = function(credentials, callback) { + if (typeof callback === 'function') callback(null, null); +}; + +/** + * Logout all users against a database + * @param {authResultCallback} callback A callback function + */ +Pool.prototype.logout = function(dbName, callback) { + if (typeof callback === 'function') callback(null, null); +}; + +/** + * Unref the pool + * @method + */ +Pool.prototype.unref = function() { + // Get all the known connections + var connections = this.availableConnections.concat(this.inUseConnections); + + connections.forEach(function(c) { + c.unref(); + }); +}; + +// Destroy the connections +function destroy(self, connections, options, callback) { + stateTransition(self, DESTROYING); + + // indicate that in-flight connections should cancel + self.s.cancellationToken.emit('cancel'); + + eachAsync( + connections, + (conn, cb) => { + for (const eventName of CONNECTION_EVENTS) { + conn.removeAllListeners(eventName); + } + + // ignore any errors during destruction + conn.on('error', () => {}); + + conn.destroy(options, cb); + }, + err => { + if (err) { + if (typeof callback === 'function') callback(err, null); + return; + } + + resetPoolState(self); + self.queue = []; + + stateTransition(self, DESTROYED); + if (typeof callback === 'function') callback(null, null); + } + ); +} + +/** + * Destroy pool + * @method + */ +Pool.prototype.destroy = function(force, callback) { + var self = this; + if (typeof force === 'function') { + callback = force; + force = false; + } + + // Do not try again if the pool is already dead + if (this.state === DESTROYED || self.state === DESTROYING) { + if (typeof callback === 'function') callback(null, null); + return; + } + + // Set state to draining + stateTransition(this, DRAINING); + + // Are we force closing + if (force) { + // Get all the known connections + var connections = self.availableConnections.concat(self.inUseConnections); + + // Flush any remaining work items with + // an error + while (self.queue.length > 0) { + var workItem = self.queue.shift(); + if (typeof workItem.cb === 'function') { + workItem.cb(new MongoError('Pool was force destroyed')); + } + } + + // Destroy the topology + return destroy(self, connections, { force: true }, callback); + } + + // Clear out the reconnect if set + if (this.reconnectId) { + clearTimeout(this.reconnectId); + } + + // Wait for the operations to drain before we close the pool + function checkStatus() { + if (self.state === DESTROYED || self.state === DESTROYING) { + if (typeof callback === 'function') { + callback(); + } + + return; + } + + flushMonitoringOperations(self.queue); + + if (self.queue.length === 0) { + // Get all the known connections + var connections = self.availableConnections.concat(self.inUseConnections); + + // Check if we have any in flight operations + for (var i = 0; i < connections.length; i++) { + // There is an operation still in flight, reschedule a + // check waiting for it to drain + if (connections[i].workItems.length > 0) { + return setTimeout(checkStatus, 1); + } + } + + destroy(self, connections, { force: false }, callback); + } else { + // Ensure we empty the queue + _execute(self)(); + // Set timeout + setTimeout(checkStatus, 1); + } + } + + // Initiate drain of operations + checkStatus(); +}; + +/** + * Reset all connections of this pool + * + * @param {function} [callback] + */ +Pool.prototype.reset = function(callback) { + if (this.s.state !== CONNECTED) { + if (typeof callback === 'function') { + callback(new MongoError('pool is not connected, reset aborted')); + } + + return; + } + + // signal in-flight connections should be cancelled + this.s.cancellationToken.emit('cancel'); + + // destroy existing connections + const connections = this.availableConnections.concat(this.inUseConnections); + eachAsync( + connections, + (conn, cb) => { + for (const eventName of CONNECTION_EVENTS) { + conn.removeAllListeners(eventName); + } + + conn.destroy({ force: true }, cb); + }, + err => { + if (err) { + if (typeof callback === 'function') { + callback(err, null); + return; + } + } + + resetPoolState(this); + + // create a new connection, this will ultimately trigger execution + createConnection(this, () => { + if (typeof callback === 'function') { + callback(null, null); + } + }); + } + ); +}; + +// Prepare the buffer that Pool.prototype.write() uses to send to the server +function serializeCommand(self, command, callback) { + const originalCommandBuffer = command.toBin(); + + // Check whether we and the server have agreed to use a compressor + const shouldCompress = !!self.options.agreedCompressor; + if (!shouldCompress || !canCompress(command)) { + return callback(null, originalCommandBuffer); + } + + // Transform originalCommandBuffer into OP_COMPRESSED + const concatenatedOriginalCommandBuffer = Buffer.concat(originalCommandBuffer); + const messageToBeCompressed = concatenatedOriginalCommandBuffer.slice(MESSAGE_HEADER_SIZE); + + // Extract information needed for OP_COMPRESSED from the uncompressed message + const originalCommandOpCode = concatenatedOriginalCommandBuffer.readInt32LE(12); + + // Compress the message body + compress(self, messageToBeCompressed, function(err, compressedMessage) { + if (err) return callback(err, null); + + // Create the msgHeader of OP_COMPRESSED + const msgHeader = Buffer.alloc(MESSAGE_HEADER_SIZE); + msgHeader.writeInt32LE( + MESSAGE_HEADER_SIZE + COMPRESSION_DETAILS_SIZE + compressedMessage.length, + 0 + ); // messageLength + msgHeader.writeInt32LE(command.requestId, 4); // requestID + msgHeader.writeInt32LE(0, 8); // responseTo (zero) + msgHeader.writeInt32LE(opcodes.OP_COMPRESSED, 12); // opCode + + // Create the compression details of OP_COMPRESSED + const compressionDetails = Buffer.alloc(COMPRESSION_DETAILS_SIZE); + compressionDetails.writeInt32LE(originalCommandOpCode, 0); // originalOpcode + compressionDetails.writeInt32LE(messageToBeCompressed.length, 4); // Size of the uncompressed compressedMessage, excluding the MsgHeader + compressionDetails.writeUInt8(compressorIDs[self.options.agreedCompressor], 8); // compressorID + + return callback(null, [msgHeader, compressionDetails, compressedMessage]); + }); +} + +/** + * Write a message to MongoDB + * @method + * @return {Connection} + */ +Pool.prototype.write = function(command, options, cb) { + var self = this; + // Ensure we have a callback + if (typeof options === 'function') { + cb = options; + } + + // Always have options + options = options || {}; + + // We need to have a callback function unless the message returns no response + if (!(typeof cb === 'function') && !options.noResponse) { + throw new MongoError('write method must provide a callback'); + } + + // Pool was destroyed error out + if (this.state === DESTROYED || this.state === DESTROYING) { + cb(new MongoError('pool destroyed')); + return; + } + + if (this.state === DRAINING) { + cb(new MongoError('pool is draining, new operations prohibited')); + return; + } + + if (this.options.domainsEnabled && process.domain && typeof cb === 'function') { + // if we have a domain bind to it + var oldCb = cb; + cb = process.domain.bind(function() { + // v8 - argumentsToArray one-liner + var args = new Array(arguments.length); + for (var i = 0; i < arguments.length; i++) { + args[i] = arguments[i]; + } + // bounce off event loop so domain switch takes place + process.nextTick(function() { + oldCb.apply(null, args); + }); + }); + } + + // Do we have an operation + var operation = { + cb: cb, + raw: false, + promoteLongs: true, + promoteValues: true, + promoteBuffers: false, + fullResult: false + }; + + // Set the options for the parsing + operation.promoteLongs = typeof options.promoteLongs === 'boolean' ? options.promoteLongs : true; + operation.promoteValues = + typeof options.promoteValues === 'boolean' ? options.promoteValues : true; + operation.promoteBuffers = + typeof options.promoteBuffers === 'boolean' ? options.promoteBuffers : false; + operation.raw = typeof options.raw === 'boolean' ? options.raw : false; + operation.immediateRelease = + typeof options.immediateRelease === 'boolean' ? options.immediateRelease : false; + operation.documentsReturnedIn = options.documentsReturnedIn; + operation.command = typeof options.command === 'boolean' ? options.command : false; + operation.fullResult = typeof options.fullResult === 'boolean' ? options.fullResult : false; + operation.noResponse = typeof options.noResponse === 'boolean' ? options.noResponse : false; + operation.session = options.session || null; + + // Optional per operation socketTimeout + operation.socketTimeout = options.socketTimeout; + operation.monitoring = options.monitoring; + + // Get the requestId + operation.requestId = command.requestId; + + // If command monitoring is enabled we need to modify the callback here + if (self.options.monitorCommands) { + this.emit('commandStarted', new apm.CommandStartedEvent(this, command)); + + operation.started = now(); + operation.cb = (err, reply) => { + if (err) { + self.emit( + 'commandFailed', + new apm.CommandFailedEvent(this, command, err, operation.started) + ); + } else { + if (reply && reply.result && (reply.result.ok === 0 || reply.result.$err)) { + self.emit( + 'commandFailed', + new apm.CommandFailedEvent(this, command, reply.result, operation.started) + ); + } else { + self.emit( + 'commandSucceeded', + new apm.CommandSucceededEvent(this, command, reply, operation.started) + ); + } + } + + if (typeof cb === 'function') cb(err, reply); + }; + } + + // Prepare the operation buffer + serializeCommand(self, command, (err, serializedBuffers) => { + if (err) throw err; + + // Set the operation's buffer to the serialization of the commands + operation.buffer = serializedBuffers; + + // If we have a monitoring operation schedule as the very first operation + // Otherwise add to back of queue + if (options.monitoring) { + self.queue.unshift(operation); + } else { + self.queue.push(operation); + } + + // Attempt to execute the operation + if (!self.executing) { + process.nextTick(function() { + _execute(self)(); + }); + } + }); +}; + +// Return whether a command contains an uncompressible command term +// Will return true if command contains no uncompressible command terms +function canCompress(command) { + const commandDoc = command instanceof Msg ? command.command : command.query; + const commandName = Object.keys(commandDoc)[0]; + return !uncompressibleCommands.has(commandName); +} + +// Remove connection method +function remove(connection, connections) { + for (var i = 0; i < connections.length; i++) { + if (connections[i] === connection) { + connections.splice(i, 1); + return true; + } + } +} + +function removeConnection(self, connection) { + if (remove(connection, self.availableConnections)) return; + if (remove(connection, self.inUseConnections)) return; +} + +function createConnection(pool, callback) { + if (pool.state === DESTROYED || pool.state === DESTROYING) { + if (typeof callback === 'function') { + callback(new MongoError('Cannot create connection when pool is destroyed')); + } + + return; + } + + pool.connectingConnections++; + connect(pool.options, pool.s.cancellationToken, (err, connection) => { + pool.connectingConnections--; + + if (err) { + if (pool.logger.isDebug()) { + pool.logger.debug(`connection attempt failed with error [${JSON.stringify(err)}]`); + } + + // check if reconnect is enabled, and attempt retry if so + if (!pool.reconnectId && pool.options.reconnect) { + if (pool.state === CONNECTING && pool.options.legacyCompatMode) { + callback(err); + return; + } + + pool.reconnectError = err; + pool.reconnectId = setTimeout( + attemptReconnect(pool, callback), + pool.options.reconnectInterval + ); + + return; + } + + if (typeof callback === 'function') { + callback(err); + } + + return; + } + + // the pool might have been closed since we started creating the connection + if (pool.state === DESTROYED || pool.state === DESTROYING) { + if (typeof callback === 'function') { + callback(new MongoError('Pool was destroyed after connection creation')); + } + + connection.destroy(); + return; + } + + // otherwise, connect relevant event handlers and add it to our available connections + connection.on('error', pool._connectionErrorHandler); + connection.on('close', pool._connectionCloseHandler); + connection.on('timeout', pool._connectionTimeoutHandler); + connection.on('parseError', pool._connectionParseErrorHandler); + connection.on('message', pool._messageHandler); + + pool.availableConnections.push(connection); + + // if a callback was provided, return the connection + if (typeof callback === 'function') { + callback(null, connection); + } + + // immediately execute any waiting work + _execute(pool)(); + }); +} + +function flushMonitoringOperations(queue) { + for (var i = 0; i < queue.length; i++) { + if (queue[i].monitoring) { + var workItem = queue[i]; + queue.splice(i, 1); + workItem.cb( + new MongoError({ message: 'no connection available for monitoring', driver: true }) + ); + } + } +} + +function _execute(self) { + return function() { + if (self.state === DESTROYED) return; + // Already executing, skip + if (self.executing) return; + // Set pool as executing + self.executing = true; + + // New pool connections are in progress, wait them to finish + // before executing any more operation to ensure distribution of + // operations + if (self.connectingConnections > 0) { + self.executing = false; + return; + } + + // As long as we have available connections + // eslint-disable-next-line + while (true) { + // Total availble connections + const totalConnections = totalConnectionCount(self); + + // No available connections available, flush any monitoring ops + if (self.availableConnections.length === 0) { + // Flush any monitoring operations + flushMonitoringOperations(self.queue); + + // Try to create a new connection to execute stuck operation + if (totalConnections < self.options.size && self.queue.length > 0) { + createConnection(self); + } + + break; + } + + // No queue break + if (self.queue.length === 0) { + break; + } + + var connection = null; + const connections = self.availableConnections.filter(conn => conn.workItems.length === 0); + + // No connection found that has no work on it, just pick one for pipelining + if (connections.length === 0) { + connection = + self.availableConnections[self.connectionIndex++ % self.availableConnections.length]; + } else { + connection = connections[self.connectionIndex++ % connections.length]; + } + + // Is the connection connected + if (!connection.isConnected()) { + // Remove the disconnected connection + removeConnection(self, connection); + // Flush any monitoring operations in the queue, failing fast + flushMonitoringOperations(self.queue); + break; + } + + // Get the next work item + var workItem = self.queue.shift(); + + // If we are monitoring we need to use a connection that is not + // running another operation to avoid socket timeout changes + // affecting an existing operation + if (workItem.monitoring) { + var foundValidConnection = false; + + for (let i = 0; i < self.availableConnections.length; i++) { + // If the connection is connected + // And there are no pending workItems on it + // Then we can safely use it for monitoring. + if ( + self.availableConnections[i].isConnected() && + self.availableConnections[i].workItems.length === 0 + ) { + foundValidConnection = true; + connection = self.availableConnections[i]; + break; + } + } + + // No safe connection found, attempt to grow the connections + // if possible and break from the loop + if (!foundValidConnection) { + // Put workItem back on the queue + self.queue.unshift(workItem); + + // Attempt to grow the pool if it's not yet maxsize + if (totalConnections < self.options.size && self.queue.length > 0) { + // Create a new connection + createConnection(self); + } + + // Re-execute the operation + setTimeout(() => _execute(self)(), 10); + break; + } + } + + // Don't execute operation until we have a full pool + if (totalConnections < self.options.size) { + // Connection has work items, then put it back on the queue + // and create a new connection + if (connection.workItems.length > 0) { + // Lets put the workItem back on the list + self.queue.unshift(workItem); + // Create a new connection + createConnection(self); + // Break from the loop + break; + } + } + + // Get actual binary commands + var buffer = workItem.buffer; + + // If we are monitoring take the connection of the availableConnections + if (workItem.monitoring) { + moveConnectionBetween(connection, self.availableConnections, self.inUseConnections); + } + + // Track the executing commands on the mongo server + // as long as there is an expected response + if (!workItem.noResponse) { + connection.workItems.push(workItem); + } + + // We have a custom socketTimeout + if (!workItem.immediateRelease && typeof workItem.socketTimeout === 'number') { + connection.setSocketTimeout(workItem.socketTimeout); + } + + // Capture if write was successful + var writeSuccessful = true; + + // Put operation on the wire + if (Array.isArray(buffer)) { + for (let i = 0; i < buffer.length; i++) { + writeSuccessful = connection.write(buffer[i]); + } + } else { + writeSuccessful = connection.write(buffer); + } + + // if the command is designated noResponse, call the callback immeditely + if (workItem.noResponse && typeof workItem.cb === 'function') { + workItem.cb(null, null); + } + + if (writeSuccessful === false) { + // If write not successful put back on queue + self.queue.unshift(workItem); + // Remove the disconnected connection + removeConnection(self, connection); + // Flush any monitoring operations in the queue, failing fast + flushMonitoringOperations(self.queue); + break; + } + } + + self.executing = false; + }; +} + +// Make execution loop available for testing +Pool._execute = _execute; + +/** + * A server connect event, used to verify that the connection is up and running + * + * @event Pool#connect + * @type {Pool} + */ + +/** + * A server reconnect event, used to verify that pool reconnected. + * + * @event Pool#reconnect + * @type {Pool} + */ + +/** + * The server connection closed, all pool connections closed + * + * @event Pool#close + * @type {Pool} + */ + +/** + * The server connection caused an error, all pool connections closed + * + * @event Pool#error + * @type {Pool} + */ + +/** + * The server connection timed out, all pool connections closed + * + * @event Pool#timeout + * @type {Pool} + */ + +/** + * The driver experienced an invalid message, all pool connections closed + * + * @event Pool#parseError + * @type {Pool} + */ + +/** + * The driver attempted to reconnect + * + * @event Pool#attemptReconnect + * @type {Pool} + */ + +/** + * The driver exhausted all reconnect attempts + * + * @event Pool#reconnectFailed + * @type {Pool} + */ + +module.exports = Pool; diff --git a/node_modules/mongodb/lib/core/connection/utils.js b/node_modules/mongodb/lib/core/connection/utils.js new file mode 100644 index 00000000..2f3d889f --- /dev/null +++ b/node_modules/mongodb/lib/core/connection/utils.js @@ -0,0 +1,57 @@ +'use strict'; + +const require_optional = require('require_optional'); + +function debugOptions(debugFields, options) { + var finaloptions = {}; + debugFields.forEach(function(n) { + finaloptions[n] = options[n]; + }); + + return finaloptions; +} + +function retrieveBSON() { + var BSON = require('bson'); + BSON.native = false; + + try { + var optionalBSON = require_optional('bson-ext'); + if (optionalBSON) { + optionalBSON.native = true; + return optionalBSON; + } + } catch (err) {} // eslint-disable-line + + return BSON; +} + +// Throw an error if an attempt to use Snappy is made when Snappy is not installed +function noSnappyWarning() { + throw new Error( + 'Attempted to use Snappy compression, but Snappy is not installed. Install or disable Snappy compression and try again.' + ); +} + +// Facilitate loading Snappy optionally +function retrieveSnappy() { + var snappy = null; + try { + snappy = require_optional('snappy'); + } catch (error) {} // eslint-disable-line + if (!snappy) { + snappy = { + compress: noSnappyWarning, + uncompress: noSnappyWarning, + compressSync: noSnappyWarning, + uncompressSync: noSnappyWarning + }; + } + return snappy; +} + +module.exports = { + debugOptions, + retrieveBSON, + retrieveSnappy +}; diff --git a/node_modules/mongodb/lib/core/cursor.js b/node_modules/mongodb/lib/core/cursor.js new file mode 100644 index 00000000..48b60d1a --- /dev/null +++ b/node_modules/mongodb/lib/core/cursor.js @@ -0,0 +1,874 @@ +'use strict'; + +const Logger = require('./connection/logger'); +const retrieveBSON = require('./connection/utils').retrieveBSON; +const MongoError = require('./error').MongoError; +const MongoNetworkError = require('./error').MongoNetworkError; +const collationNotSupported = require('./utils').collationNotSupported; +const ReadPreference = require('./topologies/read_preference'); +const isUnifiedTopology = require('./utils').isUnifiedTopology; +const executeOperation = require('../operations/execute_operation'); +const Readable = require('stream').Readable; +const SUPPORTS = require('../utils').SUPPORTS; +const MongoDBNamespace = require('../utils').MongoDBNamespace; +const mergeOptions = require('../utils').mergeOptions; +const OperationBase = require('../operations/operation').OperationBase; + +const BSON = retrieveBSON(); +const Long = BSON.Long; + +// Possible states for a cursor +const CursorState = { + INIT: 0, + OPEN: 1, + CLOSED: 2, + GET_MORE: 3 +}; + +// +// Handle callback (including any exceptions thrown) +function handleCallback(callback, err, result) { + try { + callback(err, result); + } catch (err) { + process.nextTick(function() { + throw err; + }); + } +} + +/** + * This is a cursor results callback + * + * @callback resultCallback + * @param {error} error An error object. Set to null if no error present + * @param {object} document + */ + +/** + * @fileOverview The **Cursor** class is an internal class that embodies a cursor on MongoDB + * allowing for iteration over the results returned from the underlying query. + * + * **CURSORS Cannot directly be instantiated** + */ + +/** + * The core cursor class. All cursors in the driver build off of this one. + * + * @property {number} cursorBatchSize The current cursorBatchSize for the cursor + * @property {number} cursorLimit The current cursorLimit for the cursor + * @property {number} cursorSkip The current cursorSkip for the cursor + */ +class CoreCursor extends Readable { + /** + * Create a new core `Cursor` instance. + * **NOTE** Not to be instantiated directly + * + * @param {object} topology The server topology instance. + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {{object}|Long} cmd The selector (can be a command or a cursorId) + * @param {object} [options=null] Optional settings. + * @param {object} [options.batchSize=1000] The number of documents to return per batch. See {@link https://docs.mongodb.com/manual/reference/command/find/| find command documentation} and {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {array} [options.documents=[]] Initial documents list for cursor + * @param {object} [options.transforms=null] Transform methods for the cursor results + * @param {function} [options.transforms.query] Transform the value returned from the initial query + * @param {function} [options.transforms.doc] Transform each document returned from Cursor.prototype._next + */ + constructor(topology, ns, cmd, options) { + super({ objectMode: true }); + options = options || {}; + + if (ns instanceof OperationBase) { + this.operation = ns; + ns = this.operation.ns.toString(); + options = this.operation.options; + cmd = this.operation.cmd ? this.operation.cmd : {}; + } + + // Cursor pool + this.pool = null; + // Cursor server + this.server = null; + + // Do we have a not connected handler + this.disconnectHandler = options.disconnectHandler; + + // Set local values + this.bson = topology.s.bson; + this.ns = ns; + this.namespace = MongoDBNamespace.fromString(ns); + this.cmd = cmd; + this.options = options; + this.topology = topology; + + // All internal state + this.cursorState = { + cursorId: null, + cmd, + documents: options.documents || [], + cursorIndex: 0, + dead: false, + killed: false, + init: false, + notified: false, + limit: options.limit || cmd.limit || 0, + skip: options.skip || cmd.skip || 0, + batchSize: options.batchSize || cmd.batchSize || 1000, + currentLimit: 0, + // Result field name if not a cursor (contains the array of results) + transforms: options.transforms, + raw: options.raw || (cmd && cmd.raw) + }; + + if (typeof options.session === 'object') { + this.cursorState.session = options.session; + } + + // Add promoteLong to cursor state + const topologyOptions = topology.s.options; + if (typeof topologyOptions.promoteLongs === 'boolean') { + this.cursorState.promoteLongs = topologyOptions.promoteLongs; + } else if (typeof options.promoteLongs === 'boolean') { + this.cursorState.promoteLongs = options.promoteLongs; + } + + // Add promoteValues to cursor state + if (typeof topologyOptions.promoteValues === 'boolean') { + this.cursorState.promoteValues = topologyOptions.promoteValues; + } else if (typeof options.promoteValues === 'boolean') { + this.cursorState.promoteValues = options.promoteValues; + } + + // Add promoteBuffers to cursor state + if (typeof topologyOptions.promoteBuffers === 'boolean') { + this.cursorState.promoteBuffers = topologyOptions.promoteBuffers; + } else if (typeof options.promoteBuffers === 'boolean') { + this.cursorState.promoteBuffers = options.promoteBuffers; + } + + if (topologyOptions.reconnect) { + this.cursorState.reconnect = topologyOptions.reconnect; + } + + // Logger + this.logger = Logger('Cursor', topologyOptions); + + // + // Did we pass in a cursor id + if (typeof cmd === 'number') { + this.cursorState.cursorId = Long.fromNumber(cmd); + this.cursorState.lastCursorId = this.cursorState.cursorId; + } else if (cmd instanceof Long) { + this.cursorState.cursorId = cmd; + this.cursorState.lastCursorId = cmd; + } + + // TODO: remove as part of NODE-2104 + if (this.operation) { + this.operation.cursorState = this.cursorState; + } + } + + setCursorBatchSize(value) { + this.cursorState.batchSize = value; + } + + cursorBatchSize() { + return this.cursorState.batchSize; + } + + setCursorLimit(value) { + this.cursorState.limit = value; + } + + cursorLimit() { + return this.cursorState.limit; + } + + setCursorSkip(value) { + this.cursorState.skip = value; + } + + cursorSkip() { + return this.cursorState.skip; + } + + /** + * Retrieve the next document from the cursor + * @method + * @param {resultCallback} callback A callback function + */ + _next(callback) { + nextFunction(this, callback); + } + + /** + * Clone the cursor + * @method + * @return {Cursor} + */ + clone() { + const clonedOptions = mergeOptions({}, this.options); + delete clonedOptions.session; + return this.topology.cursor(this.ns, this.cmd, clonedOptions); + } + + /** + * Checks if the cursor is dead + * @method + * @return {boolean} A boolean signifying if the cursor is dead or not + */ + isDead() { + return this.cursorState.dead === true; + } + + /** + * Checks if the cursor was killed by the application + * @method + * @return {boolean} A boolean signifying if the cursor was killed by the application + */ + isKilled() { + return this.cursorState.killed === true; + } + + /** + * Checks if the cursor notified it's caller about it's death + * @method + * @return {boolean} A boolean signifying if the cursor notified the callback + */ + isNotified() { + return this.cursorState.notified === true; + } + + /** + * Returns current buffered documents length + * @method + * @return {number} The number of items in the buffered documents + */ + bufferedCount() { + return this.cursorState.documents.length - this.cursorState.cursorIndex; + } + + /** + * Returns current buffered documents + * @method + * @return {Array} An array of buffered documents + */ + readBufferedDocuments(number) { + const unreadDocumentsLength = this.cursorState.documents.length - this.cursorState.cursorIndex; + const length = number < unreadDocumentsLength ? number : unreadDocumentsLength; + let elements = this.cursorState.documents.slice( + this.cursorState.cursorIndex, + this.cursorState.cursorIndex + length + ); + + // Transform the doc with passed in transformation method if provided + if (this.cursorState.transforms && typeof this.cursorState.transforms.doc === 'function') { + // Transform all the elements + for (let i = 0; i < elements.length; i++) { + elements[i] = this.cursorState.transforms.doc(elements[i]); + } + } + + // Ensure we do not return any more documents than the limit imposed + // Just return the number of elements up to the limit + if ( + this.cursorState.limit > 0 && + this.cursorState.currentLimit + elements.length > this.cursorState.limit + ) { + elements = elements.slice(0, this.cursorState.limit - this.cursorState.currentLimit); + this.kill(); + } + + // Adjust current limit + this.cursorState.currentLimit = this.cursorState.currentLimit + elements.length; + this.cursorState.cursorIndex = this.cursorState.cursorIndex + elements.length; + + // Return elements + return elements; + } + + /** + * Resets local state for this cursor instance, and issues a `killCursors` command to the server + * + * @param {resultCallback} callback A callback function + */ + kill(callback) { + // Set cursor to dead + this.cursorState.dead = true; + this.cursorState.killed = true; + // Remove documents + this.cursorState.documents = []; + + // If no cursor id just return + if ( + this.cursorState.cursorId == null || + this.cursorState.cursorId.isZero() || + this.cursorState.init === false + ) { + if (callback) callback(null, null); + return; + } + + this.server.killCursors(this.ns, this.cursorState, callback); + } + + /** + * Resets the cursor + */ + rewind() { + if (this.cursorState.init) { + if (!this.cursorState.dead) { + this.kill(); + } + + this.cursorState.currentLimit = 0; + this.cursorState.init = false; + this.cursorState.dead = false; + this.cursorState.killed = false; + this.cursorState.notified = false; + this.cursorState.documents = []; + this.cursorState.cursorId = null; + this.cursorState.cursorIndex = 0; + } + } + + // Internal methods + _read() { + if ((this.s && this.s.state === CursorState.CLOSED) || this.isDead()) { + return this.push(null); + } + + // Get the next item + this._next((err, result) => { + if (err) { + if (this.listeners('error') && this.listeners('error').length > 0) { + this.emit('error', err); + } + if (!this.isDead()) this.close(); + + // Emit end event + this.emit('end'); + return this.emit('finish'); + } + + // If we provided a transformation method + if ( + this.cursorState.streamOptions && + typeof this.cursorState.streamOptions.transform === 'function' && + result != null + ) { + return this.push(this.cursorState.streamOptions.transform(result)); + } + + // Return the result + this.push(result); + + if (result === null && this.isDead()) { + this.once('end', () => { + this.close(); + this.emit('finish'); + }); + } + }); + } + + _endSession(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + options = options || {}; + + const session = this.cursorState.session; + + if (session && (options.force || session.owner === this)) { + this.cursorState.session = undefined; + + if (this.operation) { + this.operation.clearSession(); + } + + session.endSession(callback); + return true; + } + + if (callback) { + callback(); + } + + return false; + } + + _getMore(callback) { + if (this.logger.isDebug()) { + this.logger.debug(`schedule getMore call for query [${JSON.stringify(this.query)}]`); + } + + // Set the current batchSize + let batchSize = this.cursorState.batchSize; + if ( + this.cursorState.limit > 0 && + this.cursorState.currentLimit + batchSize > this.cursorState.limit + ) { + batchSize = this.cursorState.limit - this.cursorState.currentLimit; + } + + const cursorState = this.cursorState; + this.server.getMore(this.ns, cursorState, batchSize, this.options, (err, result, conn) => { + // NOTE: `getMore` modifies `cursorState`, would be very ideal not to do so in the future + if (err || (cursorState.cursorId && cursorState.cursorId.isZero())) { + this._endSession(); + } + + callback(err, result, conn); + }); + } + + _initializeCursor(callback) { + const cursor = this; + + // NOTE: this goes away once cursors use `executeOperation` + if (isUnifiedTopology(cursor.topology) && cursor.topology.shouldCheckForSessionSupport()) { + cursor.topology.selectServer(ReadPreference.primaryPreferred, err => { + if (err) { + callback(err); + return; + } + + this._initializeCursor(callback); + }); + + return; + } + + function done(err, result) { + const cursorState = cursor.cursorState; + if (err || (cursorState.cursorId && cursorState.cursorId.isZero())) { + cursor._endSession(); + } + + if ( + cursorState.documents.length === 0 && + cursorState.cursorId && + cursorState.cursorId.isZero() && + !cursor.cmd.tailable && + !cursor.cmd.awaitData + ) { + return setCursorNotified(cursor, callback); + } + + callback(err, result); + } + + const queryCallback = (err, r) => { + if (err) { + return done(err); + } + + const result = r.message; + + if (Array.isArray(result.documents) && result.documents.length === 1) { + const document = result.documents[0]; + + if (result.queryFailure) { + return done(new MongoError(document), null); + } + + // Check if we have a command cursor + if (!cursor.cmd.find || (cursor.cmd.find && cursor.cmd.virtual === false)) { + // We have an error document, return the error + if (document.$err || document.errmsg) { + return done(new MongoError(document), null); + } + + // We have a cursor document + if (document.cursor != null && typeof document.cursor !== 'string') { + const id = document.cursor.id; + // If we have a namespace change set the new namespace for getmores + if (document.cursor.ns) { + cursor.ns = document.cursor.ns; + } + // Promote id to long if needed + cursor.cursorState.cursorId = typeof id === 'number' ? Long.fromNumber(id) : id; + cursor.cursorState.lastCursorId = cursor.cursorState.cursorId; + cursor.cursorState.operationTime = document.operationTime; + + // If we have a firstBatch set it + if (Array.isArray(document.cursor.firstBatch)) { + cursor.cursorState.documents = document.cursor.firstBatch; //.reverse(); + } + + // Return after processing command cursor + return done(null, result); + } + } + } + + // Otherwise fall back to regular find path + const cursorId = result.cursorId || 0; + cursor.cursorState.cursorId = cursorId instanceof Long ? cursorId : Long.fromNumber(cursorId); + cursor.cursorState.documents = result.documents; + cursor.cursorState.lastCursorId = result.cursorId; + + // Transform the results with passed in transformation method if provided + if ( + cursor.cursorState.transforms && + typeof cursor.cursorState.transforms.query === 'function' + ) { + cursor.cursorState.documents = cursor.cursorState.transforms.query(result); + } + + done(null, result); + }; + + if (cursor.operation) { + if (cursor.logger.isDebug()) { + cursor.logger.debug( + `issue initial query [${JSON.stringify(cursor.cmd)}] with flags [${JSON.stringify( + cursor.query + )}]` + ); + } + + executeOperation(cursor.topology, cursor.operation, (err, result) => { + if (err) { + done(err); + return; + } + + cursor.server = cursor.operation.server; + cursor.cursorState.init = true; + + // NOTE: this is a special internal method for cloning a cursor, consider removing + if (cursor.cursorState.cursorId != null) { + return done(); + } + + queryCallback(err, result); + }); + + return; + } + + // Very explicitly choose what is passed to selectServer + const serverSelectOptions = {}; + if (cursor.cursorState.session) { + serverSelectOptions.session = cursor.cursorState.session; + } + + if (cursor.operation) { + serverSelectOptions.readPreference = cursor.operation.readPreference; + } else if (cursor.options.readPreference) { + serverSelectOptions.readPreference = cursor.options.readPreference; + } + + return cursor.topology.selectServer(serverSelectOptions, (err, server) => { + if (err) { + const disconnectHandler = cursor.disconnectHandler; + if (disconnectHandler != null) { + return disconnectHandler.addObjectAndMethod( + 'cursor', + cursor, + 'next', + [callback], + callback + ); + } + + return callback(err); + } + + cursor.server = server; + cursor.cursorState.init = true; + if (collationNotSupported(cursor.server, cursor.cmd)) { + return callback(new MongoError(`server ${cursor.server.name} does not support collation`)); + } + + // NOTE: this is a special internal method for cloning a cursor, consider removing + if (cursor.cursorState.cursorId != null) { + return done(); + } + + if (cursor.logger.isDebug()) { + cursor.logger.debug( + `issue initial query [${JSON.stringify(cursor.cmd)}] with flags [${JSON.stringify( + cursor.query + )}]` + ); + } + + if (cursor.cmd.find != null) { + server.query(cursor.ns, cursor.cmd, cursor.cursorState, cursor.options, queryCallback); + return; + } + + const commandOptions = Object.assign({ session: cursor.cursorState.session }, cursor.options); + server.command(cursor.ns, cursor.cmd, commandOptions, queryCallback); + }); + } +} + +if (SUPPORTS.ASYNC_ITERATOR) { + CoreCursor.prototype[Symbol.asyncIterator] = require('../async/async_iterator').asyncIterator; +} + +/** + * Validate if the pool is dead and return error + */ +function isConnectionDead(self, callback) { + if (self.pool && self.pool.isDestroyed()) { + self.cursorState.killed = true; + const err = new MongoNetworkError( + `connection to host ${self.pool.host}:${self.pool.port} was destroyed` + ); + + _setCursorNotifiedImpl(self, () => callback(err)); + return true; + } + + return false; +} + +/** + * Validate if the cursor is dead but was not explicitly killed by user + */ +function isCursorDeadButNotkilled(self, callback) { + // Cursor is dead but not marked killed, return null + if (self.cursorState.dead && !self.cursorState.killed) { + self.cursorState.killed = true; + setCursorNotified(self, callback); + return true; + } + + return false; +} + +/** + * Validate if the cursor is dead and was killed by user + */ +function isCursorDeadAndKilled(self, callback) { + if (self.cursorState.dead && self.cursorState.killed) { + handleCallback(callback, new MongoError('cursor is dead')); + return true; + } + + return false; +} + +/** + * Validate if the cursor was killed by the user + */ +function isCursorKilled(self, callback) { + if (self.cursorState.killed) { + setCursorNotified(self, callback); + return true; + } + + return false; +} + +/** + * Mark cursor as being dead and notified + */ +function setCursorDeadAndNotified(self, callback) { + self.cursorState.dead = true; + setCursorNotified(self, callback); +} + +/** + * Mark cursor as being notified + */ +function setCursorNotified(self, callback) { + _setCursorNotifiedImpl(self, () => handleCallback(callback, null, null)); +} + +function _setCursorNotifiedImpl(self, callback) { + self.cursorState.notified = true; + self.cursorState.documents = []; + self.cursorState.cursorIndex = 0; + + if (self.cursorState.session) { + self._endSession(callback); + return; + } + + return callback(); +} + +function nextFunction(self, callback) { + // We have notified about it + if (self.cursorState.notified) { + return callback(new Error('cursor is exhausted')); + } + + // Cursor is killed return null + if (isCursorKilled(self, callback)) return; + + // Cursor is dead but not marked killed, return null + if (isCursorDeadButNotkilled(self, callback)) return; + + // We have a dead and killed cursor, attempting to call next should error + if (isCursorDeadAndKilled(self, callback)) return; + + // We have just started the cursor + if (!self.cursorState.init) { + // Topology is not connected, save the call in the provided store to be + // Executed at some point when the handler deems it's reconnected + if (!self.topology.isConnected(self.options)) { + // Only need this for single server, because repl sets and mongos + // will always continue trying to reconnect + if (self.topology._type === 'server' && !self.topology.s.options.reconnect) { + // Reconnect is disabled, so we'll never reconnect + return callback(new MongoError('no connection available')); + } + + if (self.disconnectHandler != null) { + if (self.topology.isDestroyed()) { + // Topology was destroyed, so don't try to wait for it to reconnect + return callback(new MongoError('Topology was destroyed')); + } + + self.disconnectHandler.addObjectAndMethod('cursor', self, 'next', [callback], callback); + return; + } + } + + self._initializeCursor((err, result) => { + if (err || result === null) { + callback(err, result); + return; + } + + nextFunction(self, callback); + }); + + return; + } + + if (self.cursorState.limit > 0 && self.cursorState.currentLimit >= self.cursorState.limit) { + // Ensure we kill the cursor on the server + self.kill(() => + // Set cursor in dead and notified state + setCursorDeadAndNotified(self, callback) + ); + } else if ( + self.cursorState.cursorIndex === self.cursorState.documents.length && + !Long.ZERO.equals(self.cursorState.cursorId) + ) { + // Ensure an empty cursor state + self.cursorState.documents = []; + self.cursorState.cursorIndex = 0; + + // Check if topology is destroyed + if (self.topology.isDestroyed()) + return callback( + new MongoNetworkError('connection destroyed, not possible to instantiate cursor') + ); + + // Check if connection is dead and return if not possible to + // execute a getMore on this connection + if (isConnectionDead(self, callback)) return; + + // Execute the next get more + self._getMore(function(err, doc, connection) { + if (err) { + return handleCallback(callback, err); + } + + // Save the returned connection to ensure all getMore's fire over the same connection + self.connection = connection; + + // Tailable cursor getMore result, notify owner about it + // No attempt is made here to retry, this is left to the user of the + // core module to handle to keep core simple + if ( + self.cursorState.documents.length === 0 && + self.cmd.tailable && + Long.ZERO.equals(self.cursorState.cursorId) + ) { + // No more documents in the tailed cursor + return handleCallback( + callback, + new MongoError({ + message: 'No more documents in tailed cursor', + tailable: self.cmd.tailable, + awaitData: self.cmd.awaitData + }) + ); + } else if ( + self.cursorState.documents.length === 0 && + self.cmd.tailable && + !Long.ZERO.equals(self.cursorState.cursorId) + ) { + return nextFunction(self, callback); + } + + if (self.cursorState.limit > 0 && self.cursorState.currentLimit >= self.cursorState.limit) { + return setCursorDeadAndNotified(self, callback); + } + + nextFunction(self, callback); + }); + } else if ( + self.cursorState.documents.length === self.cursorState.cursorIndex && + self.cmd.tailable && + Long.ZERO.equals(self.cursorState.cursorId) + ) { + return handleCallback( + callback, + new MongoError({ + message: 'No more documents in tailed cursor', + tailable: self.cmd.tailable, + awaitData: self.cmd.awaitData + }) + ); + } else if ( + self.cursorState.documents.length === self.cursorState.cursorIndex && + Long.ZERO.equals(self.cursorState.cursorId) + ) { + setCursorDeadAndNotified(self, callback); + } else { + if (self.cursorState.limit > 0 && self.cursorState.currentLimit >= self.cursorState.limit) { + // Ensure we kill the cursor on the server + self.kill(() => + // Set cursor in dead and notified state + setCursorDeadAndNotified(self, callback) + ); + + return; + } + + // Increment the current cursor limit + self.cursorState.currentLimit += 1; + + // Get the document + let doc = self.cursorState.documents[self.cursorState.cursorIndex++]; + + // Doc overflow + if (!doc || doc.$err) { + // Ensure we kill the cursor on the server + self.kill(() => + // Set cursor in dead and notified state + setCursorDeadAndNotified(self, function() { + handleCallback(callback, new MongoError(doc ? doc.$err : undefined)); + }) + ); + + return; + } + + // Transform the doc with passed in transformation method if provided + if (self.cursorState.transforms && typeof self.cursorState.transforms.doc === 'function') { + doc = self.cursorState.transforms.doc(doc); + } + + // Return the document + handleCallback(callback, null, doc); + } +} + +module.exports = { + CursorState, + CoreCursor +}; diff --git a/node_modules/mongodb/lib/core/error.js b/node_modules/mongodb/lib/core/error.js new file mode 100644 index 00000000..b4816e60 --- /dev/null +++ b/node_modules/mongodb/lib/core/error.js @@ -0,0 +1,351 @@ +'use strict'; + +const kErrorLabels = Symbol('errorLabels'); + +/** + * Creates a new MongoError + * + * @augments Error + * @param {Error|string|object} message The error message + * @property {string} message The error message + * @property {string} stack The error call stack + */ +class MongoError extends Error { + constructor(message) { + if (message instanceof Error) { + super(message.message); + this.stack = message.stack; + } else { + if (typeof message === 'string') { + super(message); + } else { + super(message.message || message.errmsg || message.$err || 'n/a'); + if (message.errorLabels) { + this[kErrorLabels] = new Set(message.errorLabels); + } + + for (var name in message) { + if (name === 'errorLabels' || name === 'errmsg') { + continue; + } + + this[name] = message[name]; + } + } + + Error.captureStackTrace(this, this.constructor); + } + + this.name = 'MongoError'; + } + + /** + * Legacy name for server error responses + */ + get errmsg() { + return this.message; + } + + /** + * Creates a new MongoError object + * + * @param {Error|string|object} options The options used to create the error. + * @return {MongoError} A MongoError instance + * @deprecated Use `new MongoError()` instead. + */ + static create(options) { + return new MongoError(options); + } + + /** + * Checks the error to see if it has an error label + * @param {string} label The error label to check for + * @returns {boolean} returns true if the error has the provided error label + */ + hasErrorLabel(label) { + if (this[kErrorLabels] == null) { + return false; + } + + return this[kErrorLabels].has(label); + } + + addErrorLabel(label) { + if (this[kErrorLabels] == null) { + this[kErrorLabels] = new Set(); + } + + this[kErrorLabels].add(label); + } + + get errorLabels() { + return this[kErrorLabels] ? Array.from(this[kErrorLabels]) : []; + } +} + +const kBeforeHandshake = Symbol('beforeHandshake'); +function isNetworkErrorBeforeHandshake(err) { + return err[kBeforeHandshake] === true; +} + +/** + * An error indicating an issue with the network, including TCP + * errors and timeouts. + * + * @param {Error|string|object} message The error message + * @property {string} message The error message + * @property {string} stack The error call stack + * @extends MongoError + */ +class MongoNetworkError extends MongoError { + constructor(message, options) { + super(message); + this.name = 'MongoNetworkError'; + + if (options && options.beforeHandshake === true) { + this[kBeforeHandshake] = true; + } + } +} + +/** + * An error indicating a network timeout occurred + * + * @param {Error|string|object} message The error message + * @property {string} message The error message + * @property {object} [options.beforeHandshake] Indicates the timeout happened before a connection handshake completed + * @extends MongoError + */ +class MongoNetworkTimeoutError extends MongoNetworkError { + constructor(message, options) { + super(message, options); + this.name = 'MongoNetworkTimeoutError'; + } +} + +/** + * An error used when attempting to parse a value (like a connection string) + * + * @param {Error|string|object} message The error message + * @property {string} message The error message + * @extends MongoError + */ +class MongoParseError extends MongoError { + constructor(message) { + super(message); + this.name = 'MongoParseError'; + } +} + +/** + * An error signifying a client-side timeout event + * + * @param {Error|string|object} message The error message + * @param {string|object} [reason] The reason the timeout occured + * @property {string} message The error message + * @property {string} [reason] An optional reason context for the timeout, generally an error saved during flow of monitoring and selecting servers + * @extends MongoError + */ +class MongoTimeoutError extends MongoError { + constructor(message, reason) { + if (reason && reason.error) { + super(reason.error.message || reason.error); + } else { + super(message); + } + + this.name = 'MongoTimeoutError'; + if (reason) { + this.reason = reason; + } + } +} + +/** + * An error signifying a client-side server selection error + * + * @param {Error|string|object} message The error message + * @param {string|object} [reason] The reason the timeout occured + * @property {string} message The error message + * @property {string} [reason] An optional reason context for the timeout, generally an error saved during flow of monitoring and selecting servers + * @extends MongoError + */ +class MongoServerSelectionError extends MongoTimeoutError { + constructor(message, reason) { + super(message, reason); + this.name = 'MongoServerSelectionError'; + } +} + +function makeWriteConcernResultObject(input) { + const output = Object.assign({}, input); + + if (output.ok === 0) { + output.ok = 1; + delete output.errmsg; + delete output.code; + delete output.codeName; + } + + return output; +} + +/** + * An error thrown when the server reports a writeConcernError + * + * @param {Error|string|object} message The error message + * @param {object} result The result document (provided if ok: 1) + * @property {string} message The error message + * @property {object} [result] The result document (provided if ok: 1) + * @extends MongoError + */ +class MongoWriteConcernError extends MongoError { + constructor(message, result) { + super(message); + this.name = 'MongoWriteConcernError'; + + if (result && Array.isArray(result.errorLabels)) { + this[kErrorLabels] = new Set(result.errorLabels); + } + + if (result != null) { + this.result = makeWriteConcernResultObject(result); + } + } +} + +// see: https://github.com/mongodb/specifications/blob/master/source/retryable-writes/retryable-writes.rst#terms +const RETRYABLE_ERROR_CODES = new Set([ + 6, // HostUnreachable + 7, // HostNotFound + 89, // NetworkTimeout + 91, // ShutdownInProgress + 189, // PrimarySteppedDown + 9001, // SocketException + 10107, // NotMaster + 11600, // InterruptedAtShutdown + 11602, // InterruptedDueToReplStateChange + 13435, // NotMasterNoSlaveOk + 13436 // NotMasterOrSecondary +]); + +const RETRYABLE_WRITE_ERROR_CODES = new Set([ + 11600, // InterruptedAtShutdown + 11602, // InterruptedDueToReplStateChange + 10107, // NotMaster + 13435, // NotMasterNoSlaveOk + 13436, // NotMasterOrSecondary + 189, // PrimarySteppedDown + 91, // ShutdownInProgress + 7, // HostNotFound + 6, // HostUnreachable + 89, // NetworkTimeout + 9001, // SocketException + 262 // ExceededTimeLimit +]); + +function isRetryableWriteError(error) { + if (error instanceof MongoWriteConcernError) { + return ( + RETRYABLE_WRITE_ERROR_CODES.has(error.code) || + RETRYABLE_WRITE_ERROR_CODES.has(error.result.code) + ); + } + + return RETRYABLE_WRITE_ERROR_CODES.has(error.code); +} + +/** + * Determines whether an error is something the driver should attempt to retry + * + * @ignore + * @param {MongoError|Error} error + */ +function isRetryableError(error) { + return ( + RETRYABLE_ERROR_CODES.has(error.code) || + error instanceof MongoNetworkError || + error.message.match(/not master/) || + error.message.match(/node is recovering/) + ); +} + +const SDAM_RECOVERING_CODES = new Set([ + 91, // ShutdownInProgress + 189, // PrimarySteppedDown + 11600, // InterruptedAtShutdown + 11602, // InterruptedDueToReplStateChange + 13436 // NotMasterOrSecondary +]); + +const SDAM_NOTMASTER_CODES = new Set([ + 10107, // NotMaster + 13435 // NotMasterNoSlaveOk +]); + +const SDAM_NODE_SHUTTING_DOWN_ERROR_CODES = new Set([ + 11600, // InterruptedAtShutdown + 91 // ShutdownInProgress +]); + +function isRecoveringError(err) { + if (err.code && SDAM_RECOVERING_CODES.has(err.code)) { + return true; + } + + return err.message.match(/not master or secondary/) || err.message.match(/node is recovering/); +} + +function isNotMasterError(err) { + if (err.code && SDAM_NOTMASTER_CODES.has(err.code)) { + return true; + } + + if (isRecoveringError(err)) { + return false; + } + + return err.message.match(/not master/); +} + +function isNodeShuttingDownError(err) { + return err.code && SDAM_NODE_SHUTTING_DOWN_ERROR_CODES.has(err.code); +} + +/** + * Determines whether SDAM can recover from a given error. If it cannot + * then the pool will be cleared, and server state will completely reset + * locally. + * + * @ignore + * @see https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.rst#not-master-and-node-is-recovering + * @param {MongoError|Error} error + */ +function isSDAMUnrecoverableError(error) { + // NOTE: null check is here for a strictly pre-CMAP world, a timeout or + // close event are considered unrecoverable + if (error instanceof MongoParseError || error == null) { + return true; + } + + if (isRecoveringError(error) || isNotMasterError(error)) { + return true; + } + + return false; +} + +module.exports = { + MongoError, + MongoNetworkError, + MongoNetworkTimeoutError, + MongoParseError, + MongoTimeoutError, + MongoServerSelectionError, + MongoWriteConcernError, + isRetryableError, + isSDAMUnrecoverableError, + isNodeShuttingDownError, + isRetryableWriteError, + isNetworkErrorBeforeHandshake +}; diff --git a/node_modules/mongodb/lib/core/index.js b/node_modules/mongodb/lib/core/index.js new file mode 100644 index 00000000..28aca32e --- /dev/null +++ b/node_modules/mongodb/lib/core/index.js @@ -0,0 +1,50 @@ +'use strict'; + +let BSON = require('bson'); +const require_optional = require('require_optional'); +const EJSON = require('./utils').retrieveEJSON(); + +try { + // Attempt to grab the native BSON parser + const BSONNative = require_optional('bson-ext'); + // If we got the native parser, use it instead of the + // Javascript one + if (BSONNative) { + BSON = BSONNative; + } +} catch (err) {} // eslint-disable-line + +module.exports = { + // Errors + MongoError: require('./error').MongoError, + MongoNetworkError: require('./error').MongoNetworkError, + MongoParseError: require('./error').MongoParseError, + MongoTimeoutError: require('./error').MongoTimeoutError, + MongoServerSelectionError: require('./error').MongoServerSelectionError, + MongoWriteConcernError: require('./error').MongoWriteConcernError, + // Core + Connection: require('./connection/connection'), + Server: require('./topologies/server'), + ReplSet: require('./topologies/replset'), + Mongos: require('./topologies/mongos'), + Logger: require('./connection/logger'), + Cursor: require('./cursor').CoreCursor, + ReadPreference: require('./topologies/read_preference'), + Sessions: require('./sessions'), + BSON: BSON, + EJSON: EJSON, + Topology: require('./sdam/topology').Topology, + // Raw operations + Query: require('./connection/commands').Query, + // Auth mechanisms + MongoCredentials: require('./auth/mongo_credentials').MongoCredentials, + defaultAuthProviders: require('./auth/defaultAuthProviders').defaultAuthProviders, + MongoCR: require('./auth/mongocr'), + X509: require('./auth/x509'), + Plain: require('./auth/plain'), + GSSAPI: require('./auth/gssapi'), + ScramSHA1: require('./auth/scram').ScramSHA1, + ScramSHA256: require('./auth/scram').ScramSHA256, + // Utilities + parseConnectionString: require('./uri_parser') +}; diff --git a/node_modules/mongodb/lib/core/sdam/common.js b/node_modules/mongodb/lib/core/sdam/common.js new file mode 100644 index 00000000..3cfff427 --- /dev/null +++ b/node_modules/mongodb/lib/core/sdam/common.js @@ -0,0 +1,67 @@ +'use strict'; + +// shared state names +const STATE_CLOSING = 'closing'; +const STATE_CLOSED = 'closed'; +const STATE_CONNECTING = 'connecting'; +const STATE_CONNECTED = 'connected'; + +// An enumeration of topology types we know about +const TopologyType = { + Single: 'Single', + ReplicaSetNoPrimary: 'ReplicaSetNoPrimary', + ReplicaSetWithPrimary: 'ReplicaSetWithPrimary', + Sharded: 'Sharded', + Unknown: 'Unknown' +}; + +// An enumeration of server types we know about +const ServerType = { + Standalone: 'Standalone', + Mongos: 'Mongos', + PossiblePrimary: 'PossiblePrimary', + RSPrimary: 'RSPrimary', + RSSecondary: 'RSSecondary', + RSArbiter: 'RSArbiter', + RSOther: 'RSOther', + RSGhost: 'RSGhost', + Unknown: 'Unknown' +}; + +// helper to get a server's type that works for both legacy and unified topologies +function serverType(server) { + let description = server.s.description || server.s.serverDescription; + if (description.topologyType === TopologyType.Single) return description.servers[0].type; + return description.type; +} + +const TOPOLOGY_DEFAULTS = { + useUnifiedTopology: true, + localThresholdMS: 15, + serverSelectionTimeoutMS: 30000, + heartbeatFrequencyMS: 10000, + minHeartbeatFrequencyMS: 500 +}; + +function drainTimerQueue(queue) { + queue.forEach(clearTimeout); + queue.clear(); +} + +function clearAndRemoveTimerFrom(timer, timers) { + clearTimeout(timer); + return timers.delete(timer); +} + +module.exports = { + STATE_CLOSING, + STATE_CLOSED, + STATE_CONNECTING, + STATE_CONNECTED, + TOPOLOGY_DEFAULTS, + TopologyType, + ServerType, + serverType, + drainTimerQueue, + clearAndRemoveTimerFrom +}; diff --git a/node_modules/mongodb/lib/core/sdam/events.js b/node_modules/mongodb/lib/core/sdam/events.js new file mode 100644 index 00000000..08a14adc --- /dev/null +++ b/node_modules/mongodb/lib/core/sdam/events.js @@ -0,0 +1,124 @@ +'use strict'; + +/** + * Published when server description changes, but does NOT include changes to the RTT. + * + * @property {Object} topologyId A unique identifier for the topology + * @property {ServerAddress} address The address (host/port pair) of the server + * @property {ServerDescription} previousDescription The previous server description + * @property {ServerDescription} newDescription The new server description + */ +class ServerDescriptionChangedEvent { + constructor(topologyId, address, previousDescription, newDescription) { + Object.assign(this, { topologyId, address, previousDescription, newDescription }); + } +} + +/** + * Published when server is initialized. + * + * @property {Object} topologyId A unique identifier for the topology + * @property {ServerAddress} address The address (host/port pair) of the server + */ +class ServerOpeningEvent { + constructor(topologyId, address) { + Object.assign(this, { topologyId, address }); + } +} + +/** + * Published when server is closed. + * + * @property {ServerAddress} address The address (host/port pair) of the server + * @property {Object} topologyId A unique identifier for the topology + */ +class ServerClosedEvent { + constructor(topologyId, address) { + Object.assign(this, { topologyId, address }); + } +} + +/** + * Published when topology description changes. + * + * @property {Object} topologyId + * @property {TopologyDescription} previousDescription The old topology description + * @property {TopologyDescription} newDescription The new topology description + */ +class TopologyDescriptionChangedEvent { + constructor(topologyId, previousDescription, newDescription) { + Object.assign(this, { topologyId, previousDescription, newDescription }); + } +} + +/** + * Published when topology is initialized. + * + * @param {Object} topologyId A unique identifier for the topology + */ +class TopologyOpeningEvent { + constructor(topologyId) { + Object.assign(this, { topologyId }); + } +} + +/** + * Published when topology is closed. + * + * @param {Object} topologyId A unique identifier for the topology + */ +class TopologyClosedEvent { + constructor(topologyId) { + Object.assign(this, { topologyId }); + } +} + +/** + * Fired when the server monitor’s ismaster command is started - immediately before + * the ismaster command is serialized into raw BSON and written to the socket. + * + * @property {Object} connectionId The connection id for the command + */ +class ServerHeartbeatStartedEvent { + constructor(connectionId) { + Object.assign(this, { connectionId }); + } +} + +/** + * Fired when the server monitor’s ismaster succeeds. + * + * @param {Number} duration The execution time of the event in ms + * @param {Object} reply The command reply + * @param {Object} connectionId The connection id for the command + */ +class ServerHeartbeatSucceededEvent { + constructor(duration, reply, connectionId) { + Object.assign(this, { connectionId, duration, reply }); + } +} + +/** + * Fired when the server monitor’s ismaster fails, either with an “ok: 0†or a socket exception. + * + * @param {Number} duration The execution time of the event in ms + * @param {MongoError|Object} failure The command failure + * @param {Object} connectionId The connection id for the command + */ +class ServerHeartbeatFailedEvent { + constructor(duration, failure, connectionId) { + Object.assign(this, { connectionId, duration, failure }); + } +} + +module.exports = { + ServerDescriptionChangedEvent, + ServerOpeningEvent, + ServerClosedEvent, + TopologyDescriptionChangedEvent, + TopologyOpeningEvent, + TopologyClosedEvent, + ServerHeartbeatStartedEvent, + ServerHeartbeatSucceededEvent, + ServerHeartbeatFailedEvent +}; diff --git a/node_modules/mongodb/lib/core/sdam/monitor.js b/node_modules/mongodb/lib/core/sdam/monitor.js new file mode 100644 index 00000000..e86cba3d --- /dev/null +++ b/node_modules/mongodb/lib/core/sdam/monitor.js @@ -0,0 +1,408 @@ +'use strict'; + +const ServerType = require('./common').ServerType; +const EventEmitter = require('events'); +const connect = require('../connection/connect'); +const Connection = require('../../cmap/connection').Connection; +const common = require('./common'); +const makeStateMachine = require('../utils').makeStateMachine; +const MongoNetworkError = require('../error').MongoNetworkError; +const BSON = require('../connection/utils').retrieveBSON(); +const makeInterruptableAsyncInterval = require('../../utils').makeInterruptableAsyncInterval; +const calculateDurationInMs = require('../../utils').calculateDurationInMs; +const now = require('../../utils').now; + +const sdamEvents = require('./events'); +const ServerHeartbeatStartedEvent = sdamEvents.ServerHeartbeatStartedEvent; +const ServerHeartbeatSucceededEvent = sdamEvents.ServerHeartbeatSucceededEvent; +const ServerHeartbeatFailedEvent = sdamEvents.ServerHeartbeatFailedEvent; + +const kServer = Symbol('server'); +const kMonitorId = Symbol('monitorId'); +const kConnection = Symbol('connection'); +const kCancellationToken = Symbol('cancellationToken'); +const kRTTPinger = Symbol('rttPinger'); +const kRoundTripTime = Symbol('roundTripTime'); + +const STATE_CLOSED = common.STATE_CLOSED; +const STATE_CLOSING = common.STATE_CLOSING; +const STATE_IDLE = 'idle'; +const STATE_MONITORING = 'monitoring'; +const stateTransition = makeStateMachine({ + [STATE_CLOSING]: [STATE_CLOSING, STATE_IDLE, STATE_CLOSED], + [STATE_CLOSED]: [STATE_CLOSED, STATE_MONITORING], + [STATE_IDLE]: [STATE_IDLE, STATE_MONITORING, STATE_CLOSING], + [STATE_MONITORING]: [STATE_MONITORING, STATE_IDLE, STATE_CLOSING] +}); + +const INVALID_REQUEST_CHECK_STATES = new Set([STATE_CLOSING, STATE_CLOSED, STATE_MONITORING]); + +function isInCloseState(monitor) { + return monitor.s.state === STATE_CLOSED || monitor.s.state === STATE_CLOSING; +} + +class Monitor extends EventEmitter { + constructor(server, options) { + super(options); + + this[kServer] = server; + this[kConnection] = undefined; + this[kCancellationToken] = new EventEmitter(); + this[kCancellationToken].setMaxListeners(Infinity); + this[kMonitorId] = null; + this.s = { + state: STATE_CLOSED + }; + + this.address = server.description.address; + this.options = Object.freeze({ + connectTimeoutMS: + typeof options.connectionTimeout === 'number' + ? options.connectionTimeout + : typeof options.connectTimeoutMS === 'number' + ? options.connectTimeoutMS + : 10000, + heartbeatFrequencyMS: + typeof options.heartbeatFrequencyMS === 'number' ? options.heartbeatFrequencyMS : 10000, + minHeartbeatFrequencyMS: + typeof options.minHeartbeatFrequencyMS === 'number' ? options.minHeartbeatFrequencyMS : 500 + }); + + // TODO: refactor this to pull it directly from the pool, requires new ConnectionPool integration + const connectOptions = Object.assign( + { + id: '', + host: server.description.host, + port: server.description.port, + bson: server.s.bson, + connectionType: Connection + }, + server.s.options, + this.options, + + // force BSON serialization options + { + raw: false, + promoteLongs: true, + promoteValues: true, + promoteBuffers: true + } + ); + + // ensure no authentication is used for monitoring + delete connectOptions.credentials; + this.connectOptions = Object.freeze(connectOptions); + } + + connect() { + if (this.s.state !== STATE_CLOSED) { + return; + } + + // start + const heartbeatFrequencyMS = this.options.heartbeatFrequencyMS; + const minHeartbeatFrequencyMS = this.options.minHeartbeatFrequencyMS; + this[kMonitorId] = makeInterruptableAsyncInterval(monitorServer(this), { + interval: heartbeatFrequencyMS, + minInterval: minHeartbeatFrequencyMS, + immediate: true + }); + } + + requestCheck() { + if (INVALID_REQUEST_CHECK_STATES.has(this.s.state)) { + return; + } + + this[kMonitorId].wake(); + } + + reset() { + const topologyVersion = this[kServer].description.topologyVersion; + if (isInCloseState(this) || topologyVersion == null) { + return; + } + + stateTransition(this, STATE_CLOSING); + resetMonitorState(this); + + // restart monitor + stateTransition(this, STATE_IDLE); + + // restart monitoring + const heartbeatFrequencyMS = this.options.heartbeatFrequencyMS; + const minHeartbeatFrequencyMS = this.options.minHeartbeatFrequencyMS; + this[kMonitorId] = makeInterruptableAsyncInterval(monitorServer(this), { + interval: heartbeatFrequencyMS, + minInterval: minHeartbeatFrequencyMS + }); + } + + close() { + if (isInCloseState(this)) { + return; + } + + stateTransition(this, STATE_CLOSING); + resetMonitorState(this); + + // close monitor + this.emit('close'); + stateTransition(this, STATE_CLOSED); + } +} + +function resetMonitorState(monitor) { + if (monitor[kMonitorId]) { + monitor[kMonitorId].stop(); + monitor[kMonitorId] = null; + } + + if (monitor[kRTTPinger]) { + monitor[kRTTPinger].close(); + monitor[kRTTPinger] = undefined; + } + + monitor[kCancellationToken].emit('cancel'); + if (monitor[kMonitorId]) { + clearTimeout(monitor[kMonitorId]); + monitor[kMonitorId] = undefined; + } + + if (monitor[kConnection]) { + monitor[kConnection].destroy({ force: true }); + } +} + +function checkServer(monitor, callback) { + let start = now(); + monitor.emit('serverHeartbeatStarted', new ServerHeartbeatStartedEvent(monitor.address)); + + function failureHandler(err) { + if (monitor[kConnection]) { + monitor[kConnection].destroy({ force: true }); + monitor[kConnection] = undefined; + } + + monitor.emit( + 'serverHeartbeatFailed', + new ServerHeartbeatFailedEvent(calculateDurationInMs(start), err, monitor.address) + ); + + monitor.emit('resetServer', err); + monitor.emit('resetConnectionPool'); + callback(err); + } + + if (monitor[kConnection] != null && !monitor[kConnection].closed) { + const connectTimeoutMS = monitor.options.connectTimeoutMS; + const maxAwaitTimeMS = monitor.options.heartbeatFrequencyMS; + const topologyVersion = monitor[kServer].description.topologyVersion; + const isAwaitable = topologyVersion != null; + + const cmd = { ismaster: true }; + const options = { socketTimeout: connectTimeoutMS }; + + if (isAwaitable) { + cmd.maxAwaitTimeMS = maxAwaitTimeMS; + cmd.topologyVersion = makeTopologyVersion(topologyVersion); + if (connectTimeoutMS) { + options.socketTimeout = connectTimeoutMS + maxAwaitTimeMS; + } + options.exhaustAllowed = true; + if (monitor[kRTTPinger] == null) { + monitor[kRTTPinger] = new RTTPinger(monitor[kCancellationToken], monitor.connectOptions); + } + } + + monitor[kConnection].command('admin.$cmd', cmd, options, (err, result) => { + if (err) { + failureHandler(err); + return; + } + + const isMaster = result.result; + const duration = isAwaitable + ? monitor[kRTTPinger].roundTripTime + : calculateDurationInMs(start); + + monitor.emit( + 'serverHeartbeatSucceeded', + new ServerHeartbeatSucceededEvent(duration, isMaster, monitor.address) + ); + + // if we are using the streaming protocol then we immediately issue another `started` + // event, otherwise the "check" is complete and return to the main monitor loop + if (isAwaitable && isMaster.topologyVersion) { + monitor.emit('serverHeartbeatStarted', new ServerHeartbeatStartedEvent(monitor.address)); + start = now(); + } else { + if (monitor[kRTTPinger]) { + monitor[kRTTPinger].close(); + monitor[kRTTPinger] = undefined; + } + + callback(undefined, isMaster); + } + }); + + return; + } + + // connecting does an implicit `ismaster` + connect(monitor.connectOptions, monitor[kCancellationToken], (err, conn) => { + if (conn && isInCloseState(monitor)) { + conn.destroy({ force: true }); + return; + } + + if (err) { + monitor[kConnection] = undefined; + + // we already reset the connection pool on network errors in all cases + if (!(err instanceof MongoNetworkError)) { + monitor.emit('resetConnectionPool'); + } + + failureHandler(err); + return; + } + + monitor[kConnection] = conn; + monitor.emit( + 'serverHeartbeatSucceeded', + new ServerHeartbeatSucceededEvent( + calculateDurationInMs(start), + conn.ismaster, + monitor.address + ) + ); + + callback(undefined, conn.ismaster); + }); +} + +function monitorServer(monitor) { + return callback => { + stateTransition(monitor, STATE_MONITORING); + function done() { + if (!isInCloseState(monitor)) { + stateTransition(monitor, STATE_IDLE); + } + + callback(); + } + + // TODO: the next line is a legacy event, remove in v4 + process.nextTick(() => monitor.emit('monitoring', monitor[kServer])); + + checkServer(monitor, (err, isMaster) => { + if (err) { + // otherwise an error occured on initial discovery, also bail + if (monitor[kServer].description.type === ServerType.Unknown) { + monitor.emit('resetServer', err); + return done(); + } + } + + // if the check indicates streaming is supported, immediately reschedule monitoring + if (isMaster && isMaster.topologyVersion) { + setTimeout(() => { + if (!isInCloseState(monitor)) { + monitor[kMonitorId].wake(); + } + }); + } + + done(); + }); + }; +} + +function makeTopologyVersion(tv) { + return { + processId: tv.processId, + counter: BSON.Long.fromNumber(tv.counter) + }; +} + +class RTTPinger { + constructor(cancellationToken, options) { + this[kConnection] = null; + this[kCancellationToken] = cancellationToken; + this[kRoundTripTime] = 0; + this.closed = false; + + const heartbeatFrequencyMS = options.heartbeatFrequencyMS; + this[kMonitorId] = setTimeout(() => measureRoundTripTime(this, options), heartbeatFrequencyMS); + } + + get roundTripTime() { + return this[kRoundTripTime]; + } + + close() { + this.closed = true; + + clearTimeout(this[kMonitorId]); + this[kMonitorId] = undefined; + + if (this[kConnection]) { + this[kConnection].destroy({ force: true }); + } + } +} + +function measureRoundTripTime(rttPinger, options) { + const start = now(); + const cancellationToken = rttPinger[kCancellationToken]; + const heartbeatFrequencyMS = options.heartbeatFrequencyMS; + if (rttPinger.closed) { + return; + } + + function measureAndReschedule(conn) { + if (rttPinger.closed) { + conn.destroy({ force: true }); + return; + } + + if (rttPinger[kConnection] == null) { + rttPinger[kConnection] = conn; + } + + rttPinger[kRoundTripTime] = calculateDurationInMs(start); + rttPinger[kMonitorId] = setTimeout( + () => measureRoundTripTime(rttPinger, options), + heartbeatFrequencyMS + ); + } + + if (rttPinger[kConnection] == null) { + connect(options, cancellationToken, (err, conn) => { + if (err) { + rttPinger[kConnection] = undefined; + rttPinger[kRoundTripTime] = 0; + return; + } + + measureAndReschedule(conn); + }); + + return; + } + + rttPinger[kConnection].command('admin.$cmd', { ismaster: 1 }, err => { + if (err) { + rttPinger[kConnection] = undefined; + rttPinger[kRoundTripTime] = 0; + return; + } + + measureAndReschedule(); + }); +} + +module.exports = { + Monitor +}; diff --git a/node_modules/mongodb/lib/core/sdam/server.js b/node_modules/mongodb/lib/core/sdam/server.js new file mode 100644 index 00000000..26aeb5ed --- /dev/null +++ b/node_modules/mongodb/lib/core/sdam/server.js @@ -0,0 +1,564 @@ +'use strict'; +const EventEmitter = require('events'); +const ConnectionPool = require('../../cmap/connection_pool').ConnectionPool; +const CMAP_EVENT_NAMES = require('../../cmap/events').CMAP_EVENT_NAMES; +const MongoError = require('../error').MongoError; +const relayEvents = require('../utils').relayEvents; +const BSON = require('../connection/utils').retrieveBSON(); +const Logger = require('../connection/logger'); +const ServerDescription = require('./server_description').ServerDescription; +const compareTopologyVersion = require('./server_description').compareTopologyVersion; +const ReadPreference = require('../topologies/read_preference'); +const Monitor = require('./monitor').Monitor; +const MongoNetworkError = require('../error').MongoNetworkError; +const MongoNetworkTimeoutError = require('../error').MongoNetworkTimeoutError; +const collationNotSupported = require('../utils').collationNotSupported; +const debugOptions = require('../connection/utils').debugOptions; +const isSDAMUnrecoverableError = require('../error').isSDAMUnrecoverableError; +const isRetryableWriteError = require('../error').isRetryableWriteError; +const isNodeShuttingDownError = require('../error').isNodeShuttingDownError; +const isNetworkErrorBeforeHandshake = require('../error').isNetworkErrorBeforeHandshake; +const maxWireVersion = require('../utils').maxWireVersion; +const makeStateMachine = require('../utils').makeStateMachine; +const common = require('./common'); +const ServerType = common.ServerType; +const isTransactionCommand = require('../transactions').isTransactionCommand; + +// Used for filtering out fields for logging +const DEBUG_FIELDS = [ + 'reconnect', + 'reconnectTries', + 'reconnectInterval', + 'emitError', + 'cursorFactory', + 'host', + 'port', + 'size', + 'keepAlive', + 'keepAliveInitialDelay', + 'noDelay', + 'connectionTimeout', + 'checkServerIdentity', + 'socketTimeout', + 'ssl', + 'ca', + 'crl', + 'cert', + 'key', + 'rejectUnauthorized', + 'promoteLongs', + 'promoteValues', + 'promoteBuffers', + 'servername' +]; + +const STATE_CLOSING = common.STATE_CLOSING; +const STATE_CLOSED = common.STATE_CLOSED; +const STATE_CONNECTING = common.STATE_CONNECTING; +const STATE_CONNECTED = common.STATE_CONNECTED; +const stateTransition = makeStateMachine({ + [STATE_CLOSED]: [STATE_CLOSED, STATE_CONNECTING], + [STATE_CONNECTING]: [STATE_CONNECTING, STATE_CLOSING, STATE_CONNECTED, STATE_CLOSED], + [STATE_CONNECTED]: [STATE_CONNECTED, STATE_CLOSING, STATE_CLOSED], + [STATE_CLOSING]: [STATE_CLOSING, STATE_CLOSED] +}); + +const kMonitor = Symbol('monitor'); + +/** + * + * @fires Server#serverHeartbeatStarted + * @fires Server#serverHeartbeatSucceeded + * @fires Server#serverHeartbeatFailed + */ +class Server extends EventEmitter { + /** + * Create a server + * + * @param {ServerDescription} description + * @param {Object} options + */ + constructor(description, options, topology) { + super(); + + this.s = { + // the server description + description, + // a saved copy of the incoming options + options, + // the server logger + logger: Logger('Server', options), + // the bson parser + bson: + options.bson || + new BSON([ + BSON.Binary, + BSON.Code, + BSON.DBRef, + BSON.Decimal128, + BSON.Double, + BSON.Int32, + BSON.Long, + BSON.Map, + BSON.MaxKey, + BSON.MinKey, + BSON.ObjectId, + BSON.BSONRegExp, + BSON.Symbol, + BSON.Timestamp + ]), + // the server state + state: STATE_CLOSED, + credentials: options.credentials, + topology + }; + + // create the connection pool + // NOTE: this used to happen in `connect`, we supported overriding pool options there + const poolOptions = Object.assign( + { host: this.description.host, port: this.description.port, bson: this.s.bson }, + options + ); + + this.s.pool = new ConnectionPool(poolOptions); + relayEvents( + this.s.pool, + this, + ['commandStarted', 'commandSucceeded', 'commandFailed'].concat(CMAP_EVENT_NAMES) + ); + + this.s.pool.on('clusterTimeReceived', clusterTime => { + this.clusterTime = clusterTime; + }); + + // create the monitor + this[kMonitor] = new Monitor(this, this.s.options); + relayEvents(this[kMonitor], this, [ + 'serverHeartbeatStarted', + 'serverHeartbeatSucceeded', + 'serverHeartbeatFailed', + + // legacy events + 'monitoring' + ]); + + this[kMonitor].on('resetConnectionPool', () => { + this.s.pool.clear(); + }); + + this[kMonitor].on('resetServer', error => markServerUnknown(this, error)); + this[kMonitor].on('serverHeartbeatSucceeded', event => { + this.emit( + 'descriptionReceived', + new ServerDescription(this.description.address, event.reply, { + roundTripTime: calculateRoundTripTime(this.description.roundTripTime, event.duration) + }) + ); + + if (this.s.state === STATE_CONNECTING) { + stateTransition(this, STATE_CONNECTED); + this.emit('connect', this); + } + }); + } + + get description() { + return this.s.description; + } + + get name() { + return this.s.description.address; + } + + get autoEncrypter() { + if (this.s.options && this.s.options.autoEncrypter) { + return this.s.options.autoEncrypter; + } + return null; + } + + /** + * Initiate server connect + */ + connect() { + if (this.s.state !== STATE_CLOSED) { + return; + } + + stateTransition(this, STATE_CONNECTING); + this[kMonitor].connect(); + } + + /** + * Destroy the server connection + * + * @param {object} [options] Optional settings + * @param {Boolean} [options.force=false] Force destroy the pool + */ + destroy(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = Object.assign({}, { force: false }, options); + + if (this.s.state === STATE_CLOSED) { + if (typeof callback === 'function') { + callback(); + } + + return; + } + + stateTransition(this, STATE_CLOSING); + + this[kMonitor].close(); + this.s.pool.close(options, err => { + stateTransition(this, STATE_CLOSED); + this.emit('closed'); + if (typeof callback === 'function') { + callback(err); + } + }); + } + + /** + * Immediately schedule monitoring of this server. If there already an attempt being made + * this will be a no-op. + */ + requestCheck() { + this[kMonitor].requestCheck(); + } + + /** + * Execute a command + * + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object} cmd The command hash + * @param {object} [options] Optional settings + * @param {ReadPreference} [options.readPreference] Specify read preference if command supports it + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.checkKeys=false] Specify if the bson parser should validate keys. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {Boolean} [options.fullResult=false] Return the full envelope instead of just the result document. + * @param {ClientSession} [options.session] Session to use for the operation + * @param {opResultCallback} callback A callback function + */ + command(ns, cmd, options, callback) { + if (typeof options === 'function') { + (callback = options), (options = {}), (options = options || {}); + } + + if (this.s.state === STATE_CLOSING || this.s.state === STATE_CLOSED) { + callback(new MongoError('server is closed')); + return; + } + + const error = basicReadValidations(this, options); + if (error) { + return callback(error); + } + + // Clone the options + options = Object.assign({}, options, { wireProtocolCommand: false }); + + // Debug log + if (this.s.logger.isDebug()) { + this.s.logger.debug( + `executing command [${JSON.stringify({ + ns, + cmd, + options: debugOptions(DEBUG_FIELDS, options) + })}] against ${this.name}` + ); + } + + // error if collation not supported + if (collationNotSupported(this, cmd)) { + callback(new MongoError(`server ${this.name} does not support collation`)); + return; + } + + this.s.pool.withConnection((err, conn, cb) => { + if (err) { + markServerUnknown(this, err); + return cb(err); + } + + conn.command(ns, cmd, options, makeOperationHandler(this, conn, cmd, options, cb)); + }, callback); + } + + /** + * Execute a query against the server + * + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object} cmd The command document for the query + * @param {object} options Optional settings + * @param {function} callback + */ + query(ns, cmd, cursorState, options, callback) { + if (this.s.state === STATE_CLOSING || this.s.state === STATE_CLOSED) { + callback(new MongoError('server is closed')); + return; + } + + this.s.pool.withConnection((err, conn, cb) => { + if (err) { + markServerUnknown(this, err); + return cb(err); + } + + conn.query(ns, cmd, cursorState, options, makeOperationHandler(this, conn, cmd, options, cb)); + }, callback); + } + + /** + * Execute a `getMore` against the server + * + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object} cursorState State data associated with the cursor calling this method + * @param {object} options Optional settings + * @param {function} callback + */ + getMore(ns, cursorState, batchSize, options, callback) { + if (this.s.state === STATE_CLOSING || this.s.state === STATE_CLOSED) { + callback(new MongoError('server is closed')); + return; + } + + this.s.pool.withConnection((err, conn, cb) => { + if (err) { + markServerUnknown(this, err); + return cb(err); + } + + conn.getMore( + ns, + cursorState, + batchSize, + options, + makeOperationHandler(this, conn, null, options, cb) + ); + }, callback); + } + + /** + * Execute a `killCursors` command against the server + * + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object} cursorState State data associated with the cursor calling this method + * @param {function} callback + */ + killCursors(ns, cursorState, callback) { + if (this.s.state === STATE_CLOSING || this.s.state === STATE_CLOSED) { + if (typeof callback === 'function') { + callback(new MongoError('server is closed')); + } + + return; + } + + this.s.pool.withConnection((err, conn, cb) => { + if (err) { + markServerUnknown(this, err); + return cb(err); + } + + conn.killCursors(ns, cursorState, makeOperationHandler(this, conn, null, undefined, cb)); + }, callback); + } + + /** + * Insert one or more documents + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of documents to insert + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session] Session to use for the operation + * @param {opResultCallback} callback A callback function + */ + insert(ns, ops, options, callback) { + executeWriteOperation({ server: this, op: 'insert', ns, ops }, options, callback); + } + + /** + * Perform one or more update operations + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of updates + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session] Session to use for the operation + * @param {opResultCallback} callback A callback function + */ + update(ns, ops, options, callback) { + executeWriteOperation({ server: this, op: 'update', ns, ops }, options, callback); + } + + /** + * Perform one or more remove operations + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of removes + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session] Session to use for the operation + * @param {opResultCallback} callback A callback function + */ + remove(ns, ops, options, callback) { + executeWriteOperation({ server: this, op: 'remove', ns, ops }, options, callback); + } +} + +Object.defineProperty(Server.prototype, 'clusterTime', { + get: function() { + return this.s.topology.clusterTime; + }, + set: function(clusterTime) { + this.s.topology.clusterTime = clusterTime; + } +}); + +function supportsRetryableWrites(server) { + return ( + server.description.maxWireVersion >= 6 && + server.description.logicalSessionTimeoutMinutes && + server.description.type !== ServerType.Standalone + ); +} + +function calculateRoundTripTime(oldRtt, duration) { + if (oldRtt === -1) { + return duration; + } + + const alpha = 0.2; + return alpha * duration + (1 - alpha) * oldRtt; +} + +function basicReadValidations(server, options) { + if (options.readPreference && !(options.readPreference instanceof ReadPreference)) { + return new MongoError('readPreference must be an instance of ReadPreference'); + } +} + +function executeWriteOperation(args, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // TODO: once we drop Node 4, use destructuring either here or in arguments. + const server = args.server; + const op = args.op; + const ns = args.ns; + const ops = Array.isArray(args.ops) ? args.ops : [args.ops]; + + if (server.s.state === STATE_CLOSING || server.s.state === STATE_CLOSED) { + callback(new MongoError('server is closed')); + return; + } + + if (collationNotSupported(server, options)) { + callback(new MongoError(`server ${server.name} does not support collation`)); + return; + } + const unacknowledgedWrite = options.writeConcern && options.writeConcern.w === 0; + if (unacknowledgedWrite || maxWireVersion(server) < 5) { + if ((op === 'update' || op === 'remove') && ops.find(o => o.hint)) { + callback(new MongoError(`servers < 3.4 do not support hint on ${op}`)); + return; + } + } + + server.s.pool.withConnection((err, conn, cb) => { + if (err) { + markServerUnknown(server, err); + return cb(err); + } + + conn[op](ns, ops, options, makeOperationHandler(server, conn, ops, options, cb)); + }, callback); +} + +function markServerUnknown(server, error) { + if (error instanceof MongoNetworkError && !(error instanceof MongoNetworkTimeoutError)) { + server[kMonitor].reset(); + } + + server.emit( + 'descriptionReceived', + new ServerDescription(server.description.address, null, { + error, + topologyVersion: + error && error.topologyVersion ? error.topologyVersion : server.description.topologyVersion + }) + ); +} + +function connectionIsStale(pool, connection) { + return connection.generation !== pool.generation; +} + +function shouldHandleStateChangeError(server, err) { + const etv = err.topologyVersion; + const stv = server.description.topologyVersion; + + return compareTopologyVersion(stv, etv) < 0; +} + +function inActiveTransaction(session, cmd) { + return session && session.inTransaction() && !isTransactionCommand(cmd); +} + +function makeOperationHandler(server, connection, cmd, options, callback) { + const session = options && options.session; + + return function handleOperationResult(err, result) { + if (err && !connectionIsStale(server.s.pool, connection)) { + if (err instanceof MongoNetworkError) { + if (session && !session.hasEnded) { + session.serverSession.isDirty = true; + } + + if (supportsRetryableWrites(server) && !inActiveTransaction(session, cmd)) { + err.addErrorLabel('RetryableWriteError'); + } + + if (!(err instanceof MongoNetworkTimeoutError) || isNetworkErrorBeforeHandshake(err)) { + markServerUnknown(server, err); + server.s.pool.clear(); + } + } else { + // if pre-4.4 server, then add error label if its a retryable write error + if ( + maxWireVersion(server) < 9 && + isRetryableWriteError(err) && + !inActiveTransaction(session, cmd) + ) { + err.addErrorLabel('RetryableWriteError'); + } + + if (isSDAMUnrecoverableError(err)) { + if (shouldHandleStateChangeError(server, err)) { + if (maxWireVersion(server) <= 7 || isNodeShuttingDownError(err)) { + server.s.pool.clear(); + } + + markServerUnknown(server, err); + process.nextTick(() => server.requestCheck()); + } + } + } + } + + callback(err, result); + }; +} + +module.exports = { + Server +}; diff --git a/node_modules/mongodb/lib/core/sdam/server_description.js b/node_modules/mongodb/lib/core/sdam/server_description.js new file mode 100644 index 00000000..3bb7d269 --- /dev/null +++ b/node_modules/mongodb/lib/core/sdam/server_description.js @@ -0,0 +1,227 @@ +'use strict'; + +const arrayStrictEqual = require('../utils').arrayStrictEqual; +const tagsStrictEqual = require('../utils').tagsStrictEqual; +const errorStrictEqual = require('../utils').errorStrictEqual; +const ServerType = require('./common').ServerType; +const now = require('../../utils').now; + +const WRITABLE_SERVER_TYPES = new Set([ + ServerType.RSPrimary, + ServerType.Standalone, + ServerType.Mongos +]); + +const DATA_BEARING_SERVER_TYPES = new Set([ + ServerType.RSPrimary, + ServerType.RSSecondary, + ServerType.Mongos, + ServerType.Standalone +]); + +const ISMASTER_FIELDS = [ + 'minWireVersion', + 'maxWireVersion', + 'maxBsonObjectSize', + 'maxMessageSizeBytes', + 'maxWriteBatchSize', + 'compression', + 'me', + 'hosts', + 'passives', + 'arbiters', + 'tags', + 'setName', + 'setVersion', + 'electionId', + 'primary', + 'logicalSessionTimeoutMinutes', + 'saslSupportedMechs', + '__nodejs_mock_server__', + '$clusterTime' +]; + +/** + * The client's view of a single server, based on the most recent ismaster outcome. + * + * Internal type, not meant to be directly instantiated + */ +class ServerDescription { + /** + * Create a ServerDescription + * @param {String} address The address of the server + * @param {Object} [ismaster] An optional ismaster response for this server + * @param {Object} [options] Optional settings + * @param {Number} [options.roundTripTime] The round trip time to ping this server (in ms) + * @param {Error} [options.error] An Error used for better reporting debugging + * @param {any} [options.topologyVersion] The topologyVersion + */ + constructor(address, ismaster, options) { + options = options || {}; + ismaster = Object.assign( + { + minWireVersion: 0, + maxWireVersion: 0, + hosts: [], + passives: [], + arbiters: [], + tags: [] + }, + ismaster + ); + + this.address = address; + this.error = options.error; + this.roundTripTime = options.roundTripTime || -1; + this.lastUpdateTime = now(); + this.lastWriteDate = ismaster.lastWrite ? ismaster.lastWrite.lastWriteDate : null; + this.opTime = ismaster.lastWrite ? ismaster.lastWrite.opTime : null; + this.type = parseServerType(ismaster); + this.topologyVersion = options.topologyVersion || ismaster.topologyVersion; + + // direct mappings + ISMASTER_FIELDS.forEach(field => { + if (typeof ismaster[field] !== 'undefined') this[field] = ismaster[field]; + }); + + // normalize case for hosts + if (this.me) this.me = this.me.toLowerCase(); + this.hosts = this.hosts.map(host => host.toLowerCase()); + this.passives = this.passives.map(host => host.toLowerCase()); + this.arbiters = this.arbiters.map(host => host.toLowerCase()); + } + + get allHosts() { + return this.hosts.concat(this.arbiters).concat(this.passives); + } + + /** + * @return {Boolean} Is this server available for reads + */ + get isReadable() { + return this.type === ServerType.RSSecondary || this.isWritable; + } + + /** + * @return {Boolean} Is this server data bearing + */ + get isDataBearing() { + return DATA_BEARING_SERVER_TYPES.has(this.type); + } + + /** + * @return {Boolean} Is this server available for writes + */ + get isWritable() { + return WRITABLE_SERVER_TYPES.has(this.type); + } + + get host() { + const chopLength = `:${this.port}`.length; + return this.address.slice(0, -chopLength); + } + + get port() { + const port = this.address.split(':').pop(); + return port ? Number.parseInt(port, 10) : port; + } + + /** + * Determines if another `ServerDescription` is equal to this one per the rules defined + * in the {@link https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.rst#serverdescription|SDAM spec} + * + * @param {ServerDescription} other + * @return {Boolean} + */ + equals(other) { + const topologyVersionsEqual = + this.topologyVersion === other.topologyVersion || + compareTopologyVersion(this.topologyVersion, other.topologyVersion) === 0; + + return ( + other != null && + errorStrictEqual(this.error, other.error) && + this.type === other.type && + this.minWireVersion === other.minWireVersion && + this.me === other.me && + arrayStrictEqual(this.hosts, other.hosts) && + tagsStrictEqual(this.tags, other.tags) && + this.setName === other.setName && + this.setVersion === other.setVersion && + (this.electionId + ? other.electionId && this.electionId.equals(other.electionId) + : this.electionId === other.electionId) && + this.primary === other.primary && + this.logicalSessionTimeoutMinutes === other.logicalSessionTimeoutMinutes && + topologyVersionsEqual + ); + } +} + +/** + * Parses an `ismaster` message and determines the server type + * + * @param {Object} ismaster The `ismaster` message to parse + * @return {ServerType} + */ +function parseServerType(ismaster) { + if (!ismaster || !ismaster.ok) { + return ServerType.Unknown; + } + + if (ismaster.isreplicaset) { + return ServerType.RSGhost; + } + + if (ismaster.msg && ismaster.msg === 'isdbgrid') { + return ServerType.Mongos; + } + + if (ismaster.setName) { + if (ismaster.hidden) { + return ServerType.RSOther; + } else if (ismaster.ismaster) { + return ServerType.RSPrimary; + } else if (ismaster.secondary) { + return ServerType.RSSecondary; + } else if (ismaster.arbiterOnly) { + return ServerType.RSArbiter; + } else { + return ServerType.RSOther; + } + } + + return ServerType.Standalone; +} + +/** + * Compares two topology versions. + * + * @param {object} lhs + * @param {object} rhs + * @returns A negative number if `lhs` is older than `rhs`; positive if `lhs` is newer than `rhs`; 0 if they are equivalent. + */ +function compareTopologyVersion(lhs, rhs) { + if (lhs == null || rhs == null) { + return -1; + } + + if (lhs.processId.equals(rhs.processId)) { + // TODO: handle counters as Longs + if (lhs.counter === rhs.counter) { + return 0; + } else if (lhs.counter < rhs.counter) { + return -1; + } + + return 1; + } + + return -1; +} + +module.exports = { + ServerDescription, + parseServerType, + compareTopologyVersion +}; diff --git a/node_modules/mongodb/lib/core/sdam/server_selection.js b/node_modules/mongodb/lib/core/sdam/server_selection.js new file mode 100644 index 00000000..80d86ec8 --- /dev/null +++ b/node_modules/mongodb/lib/core/sdam/server_selection.js @@ -0,0 +1,238 @@ +'use strict'; +const ServerType = require('./common').ServerType; +const TopologyType = require('./common').TopologyType; +const ReadPreference = require('../topologies/read_preference'); +const MongoError = require('../error').MongoError; + +// max staleness constants +const IDLE_WRITE_PERIOD = 10000; +const SMALLEST_MAX_STALENESS_SECONDS = 90; + +/** + * Returns a server selector that selects for writable servers + */ +function writableServerSelector() { + return function(topologyDescription, servers) { + return latencyWindowReducer( + topologyDescription, + servers.filter(s => s.isWritable) + ); + }; +} + +/** + * Reduces the passed in array of servers by the rules of the "Max Staleness" specification + * found here: https://github.com/mongodb/specifications/blob/master/source/max-staleness/max-staleness.rst + * + * @param {ReadPreference} readPreference The read preference providing max staleness guidance + * @param {topologyDescription} topologyDescription The topology description + * @param {ServerDescription[]} servers The list of server descriptions to be reduced + * @return {ServerDescription[]} The list of servers that satisfy the requirements of max staleness + */ +function maxStalenessReducer(readPreference, topologyDescription, servers) { + if (readPreference.maxStalenessSeconds == null || readPreference.maxStalenessSeconds < 0) { + return servers; + } + + const maxStaleness = readPreference.maxStalenessSeconds; + const maxStalenessVariance = + (topologyDescription.heartbeatFrequencyMS + IDLE_WRITE_PERIOD) / 1000; + if (maxStaleness < maxStalenessVariance) { + throw new MongoError(`maxStalenessSeconds must be at least ${maxStalenessVariance} seconds`); + } + + if (maxStaleness < SMALLEST_MAX_STALENESS_SECONDS) { + throw new MongoError( + `maxStalenessSeconds must be at least ${SMALLEST_MAX_STALENESS_SECONDS} seconds` + ); + } + + if (topologyDescription.type === TopologyType.ReplicaSetWithPrimary) { + const primary = Array.from(topologyDescription.servers.values()).filter(primaryFilter)[0]; + return servers.reduce((result, server) => { + const stalenessMS = + server.lastUpdateTime - + server.lastWriteDate - + (primary.lastUpdateTime - primary.lastWriteDate) + + topologyDescription.heartbeatFrequencyMS; + + const staleness = stalenessMS / 1000; + if (staleness <= readPreference.maxStalenessSeconds) result.push(server); + return result; + }, []); + } + + if (topologyDescription.type === TopologyType.ReplicaSetNoPrimary) { + if (servers.length === 0) { + return servers; + } + + const sMax = servers.reduce((max, s) => (s.lastWriteDate > max.lastWriteDate ? s : max)); + return servers.reduce((result, server) => { + const stalenessMS = + sMax.lastWriteDate - server.lastWriteDate + topologyDescription.heartbeatFrequencyMS; + + const staleness = stalenessMS / 1000; + if (staleness <= readPreference.maxStalenessSeconds) result.push(server); + return result; + }, []); + } + + return servers; +} + +/** + * Determines whether a server's tags match a given set of tags + * + * @param {String[]} tagSet The requested tag set to match + * @param {String[]} serverTags The server's tags + */ +function tagSetMatch(tagSet, serverTags) { + const keys = Object.keys(tagSet); + const serverTagKeys = Object.keys(serverTags); + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + if (serverTagKeys.indexOf(key) === -1 || serverTags[key] !== tagSet[key]) { + return false; + } + } + + return true; +} + +/** + * Reduces a set of server descriptions based on tags requested by the read preference + * + * @param {ReadPreference} readPreference The read preference providing the requested tags + * @param {ServerDescription[]} servers The list of server descriptions to reduce + * @return {ServerDescription[]} The list of servers matching the requested tags + */ +function tagSetReducer(readPreference, servers) { + if ( + readPreference.tags == null || + (Array.isArray(readPreference.tags) && readPreference.tags.length === 0) + ) { + return servers; + } + + for (let i = 0; i < readPreference.tags.length; ++i) { + const tagSet = readPreference.tags[i]; + const serversMatchingTagset = servers.reduce((matched, server) => { + if (tagSetMatch(tagSet, server.tags)) matched.push(server); + return matched; + }, []); + + if (serversMatchingTagset.length) { + return serversMatchingTagset; + } + } + + return []; +} + +/** + * Reduces a list of servers to ensure they fall within an acceptable latency window. This is + * further specified in the "Server Selection" specification, found here: + * https://github.com/mongodb/specifications/blob/master/source/server-selection/server-selection.rst + * + * @param {topologyDescription} topologyDescription The topology description + * @param {ServerDescription[]} servers The list of servers to reduce + * @returns {ServerDescription[]} The servers which fall within an acceptable latency window + */ +function latencyWindowReducer(topologyDescription, servers) { + const low = servers.reduce( + (min, server) => (min === -1 ? server.roundTripTime : Math.min(server.roundTripTime, min)), + -1 + ); + + const high = low + topologyDescription.localThresholdMS; + + return servers.reduce((result, server) => { + if (server.roundTripTime <= high && server.roundTripTime >= low) result.push(server); + return result; + }, []); +} + +// filters +function primaryFilter(server) { + return server.type === ServerType.RSPrimary; +} + +function secondaryFilter(server) { + return server.type === ServerType.RSSecondary; +} + +function nearestFilter(server) { + return server.type === ServerType.RSSecondary || server.type === ServerType.RSPrimary; +} + +function knownFilter(server) { + return server.type !== ServerType.Unknown; +} + +/** + * Returns a function which selects servers based on a provided read preference + * + * @param {ReadPreference} readPreference The read preference to select with + */ +function readPreferenceServerSelector(readPreference) { + if (!readPreference.isValid()) { + throw new TypeError('Invalid read preference specified'); + } + + return function(topologyDescription, servers) { + const commonWireVersion = topologyDescription.commonWireVersion; + if ( + commonWireVersion && + readPreference.minWireVersion && + readPreference.minWireVersion > commonWireVersion + ) { + throw new MongoError( + `Minimum wire version '${readPreference.minWireVersion}' required, but found '${commonWireVersion}'` + ); + } + + if (topologyDescription.type === TopologyType.Unknown) { + return []; + } + + if ( + topologyDescription.type === TopologyType.Single || + topologyDescription.type === TopologyType.Sharded + ) { + return latencyWindowReducer(topologyDescription, servers.filter(knownFilter)); + } + + const mode = readPreference.mode; + if (mode === ReadPreference.PRIMARY) { + return servers.filter(primaryFilter); + } + + if (mode === ReadPreference.PRIMARY_PREFERRED) { + const result = servers.filter(primaryFilter); + if (result.length) { + return result; + } + } + + const filter = mode === ReadPreference.NEAREST ? nearestFilter : secondaryFilter; + const selectedServers = latencyWindowReducer( + topologyDescription, + tagSetReducer( + readPreference, + maxStalenessReducer(readPreference, topologyDescription, servers.filter(filter)) + ) + ); + + if (mode === ReadPreference.SECONDARY_PREFERRED && selectedServers.length === 0) { + return servers.filter(primaryFilter); + } + + return selectedServers; + }; +} + +module.exports = { + writableServerSelector, + readPreferenceServerSelector +}; diff --git a/node_modules/mongodb/lib/core/sdam/srv_polling.js b/node_modules/mongodb/lib/core/sdam/srv_polling.js new file mode 100644 index 00000000..2c0b6ee2 --- /dev/null +++ b/node_modules/mongodb/lib/core/sdam/srv_polling.js @@ -0,0 +1,135 @@ +'use strict'; + +const Logger = require('../connection/logger'); +const EventEmitter = require('events').EventEmitter; +const dns = require('dns'); +/** + * Determines whether a provided address matches the provided parent domain in order + * to avoid certain attack vectors. + * + * @param {String} srvAddress The address to check against a domain + * @param {String} parentDomain The domain to check the provided address against + * @return {Boolean} Whether the provided address matches the parent domain + */ +function matchesParentDomain(srvAddress, parentDomain) { + const regex = /^.*?\./; + const srv = `.${srvAddress.replace(regex, '')}`; + const parent = `.${parentDomain.replace(regex, '')}`; + return srv.endsWith(parent); +} + +class SrvPollingEvent { + constructor(srvRecords) { + this.srvRecords = srvRecords; + } + + addresses() { + return new Set(this.srvRecords.map(record => `${record.name}:${record.port}`)); + } +} + +class SrvPoller extends EventEmitter { + /** + * @param {object} options + * @param {string} options.srvHost + * @param {number} [options.heartbeatFrequencyMS] + * @param {function} [options.logger] + * @param {string} [options.loggerLevel] + */ + constructor(options) { + super(); + + if (!options || !options.srvHost) { + throw new TypeError('options for SrvPoller must exist and include srvHost'); + } + + this.srvHost = options.srvHost; + this.rescanSrvIntervalMS = 60000; + this.heartbeatFrequencyMS = options.heartbeatFrequencyMS || 10000; + this.logger = Logger('srvPoller', options); + + this.haMode = false; + this.generation = 0; + + this._timeout = null; + } + + get srvAddress() { + return `_mongodb._tcp.${this.srvHost}`; + } + + get intervalMS() { + return this.haMode ? this.heartbeatFrequencyMS : this.rescanSrvIntervalMS; + } + + start() { + if (!this._timeout) { + this.schedule(); + } + } + + stop() { + if (this._timeout) { + clearTimeout(this._timeout); + this.generation += 1; + this._timeout = null; + } + } + + schedule() { + clearTimeout(this._timeout); + this._timeout = setTimeout(() => this._poll(), this.intervalMS); + } + + success(srvRecords) { + this.haMode = false; + this.schedule(); + this.emit('srvRecordDiscovery', new SrvPollingEvent(srvRecords)); + } + + failure(message, obj) { + this.logger.warn(message, obj); + this.haMode = true; + this.schedule(); + } + + parentDomainMismatch(srvRecord) { + this.logger.warn( + `parent domain mismatch on SRV record (${srvRecord.name}:${srvRecord.port})`, + srvRecord + ); + } + + _poll() { + const generation = this.generation; + dns.resolveSrv(this.srvAddress, (err, srvRecords) => { + if (generation !== this.generation) { + return; + } + + if (err) { + this.failure('DNS error', err); + return; + } + + const finalAddresses = []; + srvRecords.forEach(record => { + if (matchesParentDomain(record.name, this.srvHost)) { + finalAddresses.push(record); + } else { + this.parentDomainMismatch(record); + } + }); + + if (!finalAddresses.length) { + this.failure('No valid addresses found at host'); + return; + } + + this.success(finalAddresses); + }); + } +} + +module.exports.SrvPollingEvent = SrvPollingEvent; +module.exports.SrvPoller = SrvPoller; diff --git a/node_modules/mongodb/lib/core/sdam/topology.js b/node_modules/mongodb/lib/core/sdam/topology.js new file mode 100644 index 00000000..82677692 --- /dev/null +++ b/node_modules/mongodb/lib/core/sdam/topology.js @@ -0,0 +1,1143 @@ +'use strict'; +const Denque = require('denque'); +const EventEmitter = require('events'); +const ServerDescription = require('./server_description').ServerDescription; +const ServerType = require('./common').ServerType; +const TopologyDescription = require('./topology_description').TopologyDescription; +const TopologyType = require('./common').TopologyType; +const events = require('./events'); +const Server = require('./server').Server; +const relayEvents = require('../utils').relayEvents; +const ReadPreference = require('../topologies/read_preference'); +const isRetryableWritesSupported = require('../topologies/shared').isRetryableWritesSupported; +const CoreCursor = require('../cursor').CoreCursor; +const deprecate = require('util').deprecate; +const BSON = require('../connection/utils').retrieveBSON(); +const createCompressionInfo = require('../topologies/shared').createCompressionInfo; +const ClientSession = require('../sessions').ClientSession; +const MongoError = require('../error').MongoError; +const MongoServerSelectionError = require('../error').MongoServerSelectionError; +const resolveClusterTime = require('../topologies/shared').resolveClusterTime; +const SrvPoller = require('./srv_polling').SrvPoller; +const getMMAPError = require('../topologies/shared').getMMAPError; +const makeStateMachine = require('../utils').makeStateMachine; +const eachAsync = require('../utils').eachAsync; +const emitDeprecationWarning = require('../../utils').emitDeprecationWarning; +const ServerSessionPool = require('../sessions').ServerSessionPool; +const makeClientMetadata = require('../utils').makeClientMetadata; +const CMAP_EVENT_NAMES = require('../../cmap/events').CMAP_EVENT_NAMES; +const compareTopologyVersion = require('./server_description').compareTopologyVersion; + +const common = require('./common'); +const drainTimerQueue = common.drainTimerQueue; +const clearAndRemoveTimerFrom = common.clearAndRemoveTimerFrom; + +const serverSelection = require('./server_selection'); +const readPreferenceServerSelector = serverSelection.readPreferenceServerSelector; +const writableServerSelector = serverSelection.writableServerSelector; + +// Global state +let globalTopologyCounter = 0; + +// events that we relay to the `Topology` +const SERVER_RELAY_EVENTS = [ + 'serverHeartbeatStarted', + 'serverHeartbeatSucceeded', + 'serverHeartbeatFailed', + 'commandStarted', + 'commandSucceeded', + 'commandFailed', + + // NOTE: Legacy events + 'monitoring' +].concat(CMAP_EVENT_NAMES); + +// all events we listen to from `Server` instances +const LOCAL_SERVER_EVENTS = ['connect', 'descriptionReceived', 'close', 'ended']; + +const STATE_CLOSING = common.STATE_CLOSING; +const STATE_CLOSED = common.STATE_CLOSED; +const STATE_CONNECTING = common.STATE_CONNECTING; +const STATE_CONNECTED = common.STATE_CONNECTED; +const stateTransition = makeStateMachine({ + [STATE_CLOSED]: [STATE_CLOSED, STATE_CONNECTING], + [STATE_CONNECTING]: [STATE_CONNECTING, STATE_CLOSING, STATE_CONNECTED, STATE_CLOSED], + [STATE_CONNECTED]: [STATE_CONNECTED, STATE_CLOSING, STATE_CLOSED], + [STATE_CLOSING]: [STATE_CLOSING, STATE_CLOSED] +}); + +const DEPRECATED_OPTIONS = new Set([ + 'autoReconnect', + 'reconnectTries', + 'reconnectInterval', + 'bufferMaxEntries' +]); + +const kCancelled = Symbol('cancelled'); +const kWaitQueue = Symbol('waitQueue'); + +/** + * A container of server instances representing a connection to a MongoDB topology. + * + * @fires Topology#serverOpening + * @fires Topology#serverClosed + * @fires Topology#serverDescriptionChanged + * @fires Topology#topologyOpening + * @fires Topology#topologyClosed + * @fires Topology#topologyDescriptionChanged + * @fires Topology#serverHeartbeatStarted + * @fires Topology#serverHeartbeatSucceeded + * @fires Topology#serverHeartbeatFailed + */ +class Topology extends EventEmitter { + /** + * Create a topology + * + * @param {Array|String} [seedlist] a string list, or array of Server instances to connect to + * @param {Object} [options] Optional settings + * @param {Number} [options.localThresholdMS=15] The size of the latency window for selecting among multiple suitable servers + * @param {Number} [options.serverSelectionTimeoutMS=30000] How long to block for server selection before throwing an error + * @param {Number} [options.heartbeatFrequencyMS=10000] The frequency with which topology updates are scheduled + */ + constructor(seedlist, options) { + super(); + if (typeof options === 'undefined' && typeof seedlist !== 'string') { + options = seedlist; + seedlist = []; + + // this is for legacy single server constructor support + if (options.host) { + seedlist.push({ host: options.host, port: options.port }); + } + } + + seedlist = seedlist || []; + if (typeof seedlist === 'string') { + seedlist = parseStringSeedlist(seedlist); + } + + options = Object.assign({}, common.TOPOLOGY_DEFAULTS, options); + options = Object.freeze( + Object.assign(options, { + metadata: makeClientMetadata(options), + compression: { compressors: createCompressionInfo(options) } + }) + ); + + DEPRECATED_OPTIONS.forEach(optionName => { + if (options[optionName]) { + emitDeprecationWarning( + `The option \`${optionName}\` is incompatible with the unified topology, please read more by visiting http://bit.ly/2D8WfT6`, + 'DeprecationWarning' + ); + } + }); + + const topologyType = topologyTypeFromSeedlist(seedlist, options); + const topologyId = globalTopologyCounter++; + const serverDescriptions = seedlist.reduce((result, seed) => { + if (seed.domain_socket) seed.host = seed.domain_socket; + const address = seed.port ? `${seed.host}:${seed.port}` : `${seed.host}:27017`; + result.set(address, new ServerDescription(address)); + return result; + }, new Map()); + + this[kWaitQueue] = new Denque(); + this.s = { + // the id of this topology + id: topologyId, + // passed in options + options, + // initial seedlist of servers to connect to + seedlist: seedlist, + // initial state + state: STATE_CLOSED, + // the topology description + description: new TopologyDescription( + topologyType, + serverDescriptions, + options.replicaSet, + null, + null, + null, + options + ), + serverSelectionTimeoutMS: options.serverSelectionTimeoutMS, + heartbeatFrequencyMS: options.heartbeatFrequencyMS, + minHeartbeatFrequencyMS: options.minHeartbeatFrequencyMS, + // allow users to override the cursor factory + Cursor: options.cursorFactory || CoreCursor, + // the bson parser + bson: + options.bson || + new BSON([ + BSON.Binary, + BSON.Code, + BSON.DBRef, + BSON.Decimal128, + BSON.Double, + BSON.Int32, + BSON.Long, + BSON.Map, + BSON.MaxKey, + BSON.MinKey, + BSON.ObjectId, + BSON.BSONRegExp, + BSON.Symbol, + BSON.Timestamp + ]), + // a map of server instances to normalized addresses + servers: new Map(), + // Server Session Pool + sessionPool: new ServerSessionPool(this), + // Active client sessions + sessions: new Set(), + // Promise library + promiseLibrary: options.promiseLibrary || Promise, + credentials: options.credentials, + clusterTime: null, + + // timer management + connectionTimers: new Set() + }; + + if (options.srvHost) { + this.s.srvPoller = + options.srvPoller || + new SrvPoller({ + heartbeatFrequencyMS: this.s.heartbeatFrequencyMS, + srvHost: options.srvHost, // TODO: GET THIS + logger: options.logger, + loggerLevel: options.loggerLevel + }); + this.s.detectTopologyDescriptionChange = ev => { + const previousType = ev.previousDescription.type; + const newType = ev.newDescription.type; + + if (previousType !== TopologyType.Sharded && newType === TopologyType.Sharded) { + this.s.handleSrvPolling = srvPollingHandler(this); + this.s.srvPoller.on('srvRecordDiscovery', this.s.handleSrvPolling); + this.s.srvPoller.start(); + } + }; + + this.on('topologyDescriptionChanged', this.s.detectTopologyDescriptionChange); + } + + // NOTE: remove this when NODE-1709 is resolved + this.setMaxListeners(Infinity); + } + + /** + * @return A `TopologyDescription` for this topology + */ + get description() { + return this.s.description; + } + + get parserType() { + return BSON.native ? 'c++' : 'js'; + } + + /** + * Initiate server connect + * + * @param {Object} [options] Optional settings + * @param {Array} [options.auth=null] Array of auth options to apply on connect + * @param {function} [callback] An optional callback called once on the first connected server + */ + connect(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + if (this.s.state === STATE_CONNECTED) { + if (typeof callback === 'function') { + callback(); + } + + return; + } + + stateTransition(this, STATE_CONNECTING); + + // emit SDAM monitoring events + this.emit('topologyOpening', new events.TopologyOpeningEvent(this.s.id)); + + // emit an event for the topology change + this.emit( + 'topologyDescriptionChanged', + new events.TopologyDescriptionChangedEvent( + this.s.id, + new TopologyDescription(TopologyType.Unknown), // initial is always Unknown + this.s.description + ) + ); + + // connect all known servers, then attempt server selection to connect + connectServers(this, Array.from(this.s.description.servers.values())); + + ReadPreference.translate(options); + const readPreference = options.readPreference || ReadPreference.primary; + const connectHandler = err => { + if (err) { + this.close(); + + if (typeof callback === 'function') { + callback(err); + } else { + this.emit('error', err); + } + + return; + } + + stateTransition(this, STATE_CONNECTED); + this.emit('open', err, this); + this.emit('connect', this); + + if (typeof callback === 'function') callback(err, this); + }; + + // TODO: NODE-2471 + if (this.s.credentials) { + this.command('admin.$cmd', { ping: 1 }, { readPreference }, connectHandler); + return; + } + + this.selectServer(readPreferenceServerSelector(readPreference), options, connectHandler); + } + + /** + * Close this topology + */ + close(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + if (typeof options === 'boolean') { + options = { force: options }; + } + + options = options || {}; + if (this.s.state === STATE_CLOSED || this.s.state === STATE_CLOSING) { + if (typeof callback === 'function') { + callback(); + } + + return; + } + + stateTransition(this, STATE_CLOSING); + + drainWaitQueue(this[kWaitQueue], new MongoError('Topology closed')); + drainTimerQueue(this.s.connectionTimers); + + if (this.s.srvPoller) { + this.s.srvPoller.stop(); + if (this.s.handleSrvPolling) { + this.s.srvPoller.removeListener('srvRecordDiscovery', this.s.handleSrvPolling); + delete this.s.handleSrvPolling; + } + } + + if (this.s.detectTopologyDescriptionChange) { + this.removeListener('topologyDescriptionChanged', this.s.detectTopologyDescriptionChange); + delete this.s.detectTopologyDescriptionChange; + } + + this.s.sessions.forEach(session => session.endSession()); + this.s.sessionPool.endAllPooledSessions(() => { + eachAsync( + Array.from(this.s.servers.values()), + (server, cb) => destroyServer(server, this, options, cb), + err => { + this.s.servers.clear(); + + // emit an event for close + this.emit('topologyClosed', new events.TopologyClosedEvent(this.s.id)); + + stateTransition(this, STATE_CLOSED); + this.emit('close'); + + if (typeof callback === 'function') { + callback(err); + } + } + ); + }); + } + + /** + * Selects a server according to the selection predicate provided + * + * @param {function} [selector] An optional selector to select servers by, defaults to a random selection within a latency window + * @param {object} [options] Optional settings related to server selection + * @param {number} [options.serverSelectionTimeoutMS] How long to block for server selection before throwing an error + * @param {function} callback The callback used to indicate success or failure + * @return {Server} An instance of a `Server` meeting the criteria of the predicate provided + */ + selectServer(selector, options, callback) { + if (typeof options === 'function') { + callback = options; + if (typeof selector !== 'function') { + options = selector; + + let readPreference; + if (selector instanceof ReadPreference) { + readPreference = selector; + } else if (typeof selector === 'string') { + readPreference = new ReadPreference(selector); + } else { + ReadPreference.translate(options); + readPreference = options.readPreference || ReadPreference.primary; + } + + selector = readPreferenceServerSelector(readPreference); + } else { + options = {}; + } + } + + options = Object.assign( + {}, + { serverSelectionTimeoutMS: this.s.serverSelectionTimeoutMS }, + options + ); + + const isSharded = this.description.type === TopologyType.Sharded; + const session = options.session; + const transaction = session && session.transaction; + + if (isSharded && transaction && transaction.server) { + callback(undefined, transaction.server); + return; + } + + // support server selection by options with readPreference + let serverSelector = selector; + if (typeof selector === 'object') { + const readPreference = selector.readPreference + ? selector.readPreference + : ReadPreference.primary; + + serverSelector = readPreferenceServerSelector(readPreference); + } + + const waitQueueMember = { + serverSelector, + transaction, + callback + }; + + const serverSelectionTimeoutMS = options.serverSelectionTimeoutMS; + if (serverSelectionTimeoutMS) { + waitQueueMember.timer = setTimeout(() => { + waitQueueMember[kCancelled] = true; + waitQueueMember.timer = undefined; + const timeoutError = new MongoServerSelectionError( + `Server selection timed out after ${serverSelectionTimeoutMS} ms`, + this.description + ); + + waitQueueMember.callback(timeoutError); + }, serverSelectionTimeoutMS); + } + + this[kWaitQueue].push(waitQueueMember); + processWaitQueue(this); + } + + // Sessions related methods + + /** + * @return Whether the topology should initiate selection to determine session support + */ + shouldCheckForSessionSupport() { + if (this.description.type === TopologyType.Single) { + return !this.description.hasKnownServers; + } + + return !this.description.hasDataBearingServers; + } + + /** + * @return Whether sessions are supported on the current topology + */ + hasSessionSupport() { + return this.description.logicalSessionTimeoutMinutes != null; + } + + /** + * Start a logical session + */ + startSession(options, clientOptions) { + const session = new ClientSession(this, this.s.sessionPool, options, clientOptions); + session.once('ended', () => { + this.s.sessions.delete(session); + }); + + this.s.sessions.add(session); + return session; + } + + /** + * Send endSessions command(s) with the given session ids + * + * @param {Array} sessions The sessions to end + * @param {function} [callback] + */ + endSessions(sessions, callback) { + if (!Array.isArray(sessions)) { + sessions = [sessions]; + } + + this.command( + 'admin.$cmd', + { endSessions: sessions }, + { readPreference: ReadPreference.primaryPreferred, noResponse: true }, + () => { + // intentionally ignored, per spec + if (typeof callback === 'function') callback(); + } + ); + } + + /** + * Update the internal TopologyDescription with a ServerDescription + * + * @param {object} serverDescription The server to update in the internal list of server descriptions + */ + serverUpdateHandler(serverDescription) { + if (!this.s.description.hasServer(serverDescription.address)) { + return; + } + + // ignore this server update if its from an outdated topologyVersion + if (isStaleServerDescription(this.s.description, serverDescription)) { + return; + } + + // these will be used for monitoring events later + const previousTopologyDescription = this.s.description; + const previousServerDescription = this.s.description.servers.get(serverDescription.address); + + // Driver Sessions Spec: "Whenever a driver receives a cluster time from + // a server it MUST compare it to the current highest seen cluster time + // for the deployment. If the new cluster time is higher than the + // highest seen cluster time it MUST become the new highest seen cluster + // time. Two cluster times are compared using only the BsonTimestamp + // value of the clusterTime embedded field." + const clusterTime = serverDescription.$clusterTime; + if (clusterTime) { + resolveClusterTime(this, clusterTime); + } + + // If we already know all the information contained in this updated description, then + // we don't need to emit SDAM events, but still need to update the description, in order + // to keep client-tracked attributes like last update time and round trip time up to date + const equalDescriptions = + previousServerDescription && previousServerDescription.equals(serverDescription); + + // first update the TopologyDescription + this.s.description = this.s.description.update(serverDescription); + if (this.s.description.compatibilityError) { + this.emit('error', new MongoError(this.s.description.compatibilityError)); + return; + } + + // emit monitoring events for this change + if (!equalDescriptions) { + this.emit( + 'serverDescriptionChanged', + new events.ServerDescriptionChangedEvent( + this.s.id, + serverDescription.address, + previousServerDescription, + this.s.description.servers.get(serverDescription.address) + ) + ); + } + + // update server list from updated descriptions + updateServers(this, serverDescription); + + // attempt to resolve any outstanding server selection attempts + if (this[kWaitQueue].length > 0) { + processWaitQueue(this); + } + + if (!equalDescriptions) { + this.emit( + 'topologyDescriptionChanged', + new events.TopologyDescriptionChangedEvent( + this.s.id, + previousTopologyDescription, + this.s.description + ) + ); + } + } + + auth(credentials, callback) { + if (typeof credentials === 'function') (callback = credentials), (credentials = null); + if (typeof callback === 'function') callback(null, true); + } + + logout(callback) { + if (typeof callback === 'function') callback(null, true); + } + + // Basic operation support. Eventually this should be moved into command construction + // during the command refactor. + + /** + * Insert one or more documents + * + * @param {String} ns The full qualified namespace for this operation + * @param {Array} ops An array of documents to insert + * @param {Boolean} [options.ordered=true] Execute in order or out of order + * @param {Object} [options.writeConcern] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields + * @param {ClientSession} [options.session] Session to use for the operation + * @param {boolean} [options.retryWrites] Enable retryable writes for this operation + * @param {opResultCallback} callback A callback function + */ + insert(ns, ops, options, callback) { + executeWriteOperation({ topology: this, op: 'insert', ns, ops }, options, callback); + } + + /** + * Perform one or more update operations + * + * @param {string} ns The fully qualified namespace for this operation + * @param {array} ops An array of updates + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields + * @param {ClientSession} [options.session] Session to use for the operation + * @param {boolean} [options.retryWrites] Enable retryable writes for this operation + * @param {opResultCallback} callback A callback function + */ + update(ns, ops, options, callback) { + executeWriteOperation({ topology: this, op: 'update', ns, ops }, options, callback); + } + + /** + * Perform one or more remove operations + * + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of removes + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {boolean} [options.retryWrites] Enable retryable writes for this operation + * @param {opResultCallback} callback A callback function + */ + remove(ns, ops, options, callback) { + executeWriteOperation({ topology: this, op: 'remove', ns, ops }, options, callback); + } + + /** + * Execute a command + * + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object} cmd The command hash + * @param {ReadPreference} [options.readPreference] Specify read preference if command supports it + * @param {Connection} [options.connection] Specify connection object to execute command against + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {opResultCallback} callback A callback function + */ + command(ns, cmd, options, callback) { + if (typeof options === 'function') { + (callback = options), (options = {}), (options = options || {}); + } + + ReadPreference.translate(options); + const readPreference = options.readPreference || ReadPreference.primary; + + this.selectServer(readPreferenceServerSelector(readPreference), options, (err, server) => { + if (err) { + callback(err); + return; + } + + const willRetryWrite = + !options.retrying && + !!options.retryWrites && + options.session && + isRetryableWritesSupported(this) && + !options.session.inTransaction() && + isWriteCommand(cmd); + + const cb = (err, result) => { + if (!err) return callback(null, result); + if (!shouldRetryOperation(err)) { + return callback(err); + } + + if (willRetryWrite) { + const newOptions = Object.assign({}, options, { retrying: true }); + return this.command(ns, cmd, newOptions, callback); + } + + return callback(err); + }; + + // increment and assign txnNumber + if (willRetryWrite) { + options.session.incrementTransactionNumber(); + options.willRetryWrite = willRetryWrite; + } + + server.command(ns, cmd, options, cb); + }); + } + + /** + * Create a new cursor + * + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object|Long} cmd Can be either a command returning a cursor or a cursorId + * @param {object} [options] Options for the cursor + * @param {object} [options.batchSize=0] Batchsize for the operation + * @param {array} [options.documents=[]] Initial documents list for cursor + * @param {ReadPreference} [options.readPreference] Specify read preference if command supports it + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {object} [options.topology] The internal topology of the created cursor + * @returns {Cursor} + */ + cursor(ns, cmd, options) { + options = options || {}; + const topology = options.topology || this; + const CursorClass = options.cursorFactory || this.s.Cursor; + ReadPreference.translate(options); + + return new CursorClass(topology, ns, cmd, options); + } + + get clientMetadata() { + return this.s.options.metadata; + } + + isConnected() { + return this.s.state === STATE_CONNECTED; + } + + isDestroyed() { + return this.s.state === STATE_CLOSED; + } + + unref() { + console.log('not implemented: `unref`'); + } + + // NOTE: There are many places in code where we explicitly check the last isMaster + // to do feature support detection. This should be done any other way, but for + // now we will just return the first isMaster seen, which should suffice. + lastIsMaster() { + const serverDescriptions = Array.from(this.description.servers.values()); + if (serverDescriptions.length === 0) return {}; + + const sd = serverDescriptions.filter(sd => sd.type !== ServerType.Unknown)[0]; + const result = sd || { maxWireVersion: this.description.commonWireVersion }; + return result; + } + + get logicalSessionTimeoutMinutes() { + return this.description.logicalSessionTimeoutMinutes; + } + + get bson() { + return this.s.bson; + } +} + +Object.defineProperty(Topology.prototype, 'clusterTime', { + enumerable: true, + get: function() { + return this.s.clusterTime; + }, + set: function(clusterTime) { + this.s.clusterTime = clusterTime; + } +}); + +// legacy aliases +Topology.prototype.destroy = deprecate( + Topology.prototype.close, + 'destroy() is deprecated, please use close() instead' +); + +const RETRYABLE_WRITE_OPERATIONS = ['findAndModify', 'insert', 'update', 'delete']; +function isWriteCommand(command) { + return RETRYABLE_WRITE_OPERATIONS.some(op => command[op]); +} + +function isStaleServerDescription(topologyDescription, incomingServerDescription) { + const currentServerDescription = topologyDescription.servers.get( + incomingServerDescription.address + ); + const currentTopologyVersion = currentServerDescription.topologyVersion; + return ( + compareTopologyVersion(currentTopologyVersion, incomingServerDescription.topologyVersion) > 0 + ); +} + +/** + * Destroys a server, and removes all event listeners from the instance + * + * @param {Server} server + */ +function destroyServer(server, topology, options, callback) { + options = options || {}; + LOCAL_SERVER_EVENTS.forEach(event => server.removeAllListeners(event)); + + server.destroy(options, () => { + topology.emit( + 'serverClosed', + new events.ServerClosedEvent(topology.s.id, server.description.address) + ); + + SERVER_RELAY_EVENTS.forEach(event => server.removeAllListeners(event)); + if (typeof callback === 'function') { + callback(); + } + }); +} + +/** + * Parses a basic seedlist in string form + * + * @param {string} seedlist The seedlist to parse + */ +function parseStringSeedlist(seedlist) { + return seedlist.split(',').map(seed => ({ + host: seed.split(':')[0], + port: seed.split(':')[1] || 27017 + })); +} + +function topologyTypeFromSeedlist(seedlist, options) { + if (options.directConnection) { + return TopologyType.Single; + } + + const replicaSet = options.replicaSet || options.setName || options.rs_name; + if (replicaSet == null) { + return TopologyType.Unknown; + } + + return TopologyType.ReplicaSetNoPrimary; +} + +function randomSelection(array) { + return array[Math.floor(Math.random() * array.length)]; +} + +function createAndConnectServer(topology, serverDescription, connectDelay) { + topology.emit( + 'serverOpening', + new events.ServerOpeningEvent(topology.s.id, serverDescription.address) + ); + + const server = new Server(serverDescription, topology.s.options, topology); + relayEvents(server, topology, SERVER_RELAY_EVENTS); + + server.on('descriptionReceived', topology.serverUpdateHandler.bind(topology)); + + if (connectDelay) { + const connectTimer = setTimeout(() => { + clearAndRemoveTimerFrom(connectTimer, topology.s.connectionTimers); + server.connect(); + }, connectDelay); + + topology.s.connectionTimers.add(connectTimer); + return server; + } + + server.connect(); + return server; +} + +/** + * Create `Server` instances for all initially known servers, connect them, and assign + * them to the passed in `Topology`. + * + * @param {Topology} topology The topology responsible for the servers + * @param {ServerDescription[]} serverDescriptions A list of server descriptions to connect + */ +function connectServers(topology, serverDescriptions) { + topology.s.servers = serverDescriptions.reduce((servers, serverDescription) => { + const server = createAndConnectServer(topology, serverDescription); + servers.set(serverDescription.address, server); + return servers; + }, new Map()); +} + +function updateServers(topology, incomingServerDescription) { + // update the internal server's description + if (incomingServerDescription && topology.s.servers.has(incomingServerDescription.address)) { + const server = topology.s.servers.get(incomingServerDescription.address); + server.s.description = incomingServerDescription; + } + + // add new servers for all descriptions we currently don't know about locally + for (const serverDescription of topology.description.servers.values()) { + if (!topology.s.servers.has(serverDescription.address)) { + const server = createAndConnectServer(topology, serverDescription); + topology.s.servers.set(serverDescription.address, server); + } + } + + // for all servers no longer known, remove their descriptions and destroy their instances + for (const entry of topology.s.servers) { + const serverAddress = entry[0]; + if (topology.description.hasServer(serverAddress)) { + continue; + } + + const server = topology.s.servers.get(serverAddress); + topology.s.servers.delete(serverAddress); + + // prepare server for garbage collection + destroyServer(server, topology); + } +} + +function executeWriteOperation(args, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // TODO: once we drop Node 4, use destructuring either here or in arguments. + const topology = args.topology; + const op = args.op; + const ns = args.ns; + const ops = args.ops; + + const willRetryWrite = + !args.retrying && + !!options.retryWrites && + options.session && + isRetryableWritesSupported(topology) && + !options.session.inTransaction() && + options.explain === undefined; + + topology.selectServer(writableServerSelector(), options, (err, server) => { + if (err) { + callback(err, null); + return; + } + + const handler = (err, result) => { + if (!err) return callback(null, result); + if (!shouldRetryOperation(err)) { + err = getMMAPError(err); + return callback(err); + } + + if (willRetryWrite) { + const newArgs = Object.assign({}, args, { retrying: true }); + return executeWriteOperation(newArgs, options, callback); + } + + return callback(err); + }; + + if (callback.operationId) { + handler.operationId = callback.operationId; + } + + // increment and assign txnNumber + if (willRetryWrite) { + options.session.incrementTransactionNumber(); + options.willRetryWrite = willRetryWrite; + } + + // execute the write operation + server[op](ns, ops, options, handler); + }); +} + +function shouldRetryOperation(err) { + return err instanceof MongoError && err.hasErrorLabel('RetryableWriteError'); +} + +function srvPollingHandler(topology) { + return function handleSrvPolling(ev) { + const previousTopologyDescription = topology.s.description; + topology.s.description = topology.s.description.updateFromSrvPollingEvent(ev); + if (topology.s.description === previousTopologyDescription) { + // Nothing changed, so return + return; + } + + updateServers(topology); + + topology.emit( + 'topologyDescriptionChanged', + new events.TopologyDescriptionChangedEvent( + topology.s.id, + previousTopologyDescription, + topology.s.description + ) + ); + }; +} + +function drainWaitQueue(queue, err) { + while (queue.length) { + const waitQueueMember = queue.shift(); + clearTimeout(waitQueueMember.timer); + if (!waitQueueMember[kCancelled]) { + waitQueueMember.callback(err); + } + } +} + +function processWaitQueue(topology) { + if (topology.s.state === STATE_CLOSED) { + drainWaitQueue(topology[kWaitQueue], new MongoError('Topology is closed, please connect')); + return; + } + + const serverDescriptions = Array.from(topology.description.servers.values()); + const membersToProcess = topology[kWaitQueue].length; + for (let i = 0; i < membersToProcess && topology[kWaitQueue].length; ++i) { + const waitQueueMember = topology[kWaitQueue].shift(); + if (waitQueueMember[kCancelled]) { + continue; + } + + let selectedDescriptions; + try { + const serverSelector = waitQueueMember.serverSelector; + selectedDescriptions = serverSelector + ? serverSelector(topology.description, serverDescriptions) + : serverDescriptions; + } catch (e) { + clearTimeout(waitQueueMember.timer); + waitQueueMember.callback(e); + continue; + } + + if (selectedDescriptions.length === 0) { + topology[kWaitQueue].push(waitQueueMember); + continue; + } + + const selectedServerDescription = randomSelection(selectedDescriptions); + const selectedServer = topology.s.servers.get(selectedServerDescription.address); + const transaction = waitQueueMember.transaction; + const isSharded = topology.description.type === TopologyType.Sharded; + if (isSharded && transaction && transaction.isActive) { + transaction.pinServer(selectedServer); + } + + clearTimeout(waitQueueMember.timer); + waitQueueMember.callback(undefined, selectedServer); + } + + if (topology[kWaitQueue].length > 0) { + // ensure all server monitors attempt monitoring soon + topology.s.servers.forEach(server => process.nextTick(() => server.requestCheck())); + } +} + +/** + * A server opening SDAM monitoring event + * + * @event Topology#serverOpening + * @type {ServerOpeningEvent} + */ + +/** + * A server closed SDAM monitoring event + * + * @event Topology#serverClosed + * @type {ServerClosedEvent} + */ + +/** + * A server description SDAM change monitoring event + * + * @event Topology#serverDescriptionChanged + * @type {ServerDescriptionChangedEvent} + */ + +/** + * A topology open SDAM event + * + * @event Topology#topologyOpening + * @type {TopologyOpeningEvent} + */ + +/** + * A topology closed SDAM event + * + * @event Topology#topologyClosed + * @type {TopologyClosedEvent} + */ + +/** + * A topology structure SDAM change event + * + * @event Topology#topologyDescriptionChanged + * @type {TopologyDescriptionChangedEvent} + */ + +/** + * A topology serverHeartbeatStarted SDAM event + * + * @event Topology#serverHeartbeatStarted + * @type {ServerHeartbeatStartedEvent} + */ + +/** + * A topology serverHeartbeatFailed SDAM event + * + * @event Topology#serverHeartbeatFailed + * @type {ServerHearbeatFailedEvent} + */ + +/** + * A topology serverHeartbeatSucceeded SDAM change event + * + * @event Topology#serverHeartbeatSucceeded + * @type {ServerHeartbeatSucceededEvent} + */ + +/** + * An event emitted indicating a command was started, if command monitoring is enabled + * + * @event Topology#commandStarted + * @type {object} + */ + +/** + * An event emitted indicating a command succeeded, if command monitoring is enabled + * + * @event Topology#commandSucceeded + * @type {object} + */ + +/** + * An event emitted indicating a command failed, if command monitoring is enabled + * + * @event Topology#commandFailed + * @type {object} + */ + +module.exports = { + Topology +}; diff --git a/node_modules/mongodb/lib/core/sdam/topology_description.js b/node_modules/mongodb/lib/core/sdam/topology_description.js new file mode 100644 index 00000000..91939c7a --- /dev/null +++ b/node_modules/mongodb/lib/core/sdam/topology_description.js @@ -0,0 +1,442 @@ +'use strict'; +const ServerType = require('./common').ServerType; +const ServerDescription = require('./server_description').ServerDescription; +const WIRE_CONSTANTS = require('../wireprotocol/constants'); +const TopologyType = require('./common').TopologyType; + +// contstants related to compatability checks +const MIN_SUPPORTED_SERVER_VERSION = WIRE_CONSTANTS.MIN_SUPPORTED_SERVER_VERSION; +const MAX_SUPPORTED_SERVER_VERSION = WIRE_CONSTANTS.MAX_SUPPORTED_SERVER_VERSION; +const MIN_SUPPORTED_WIRE_VERSION = WIRE_CONSTANTS.MIN_SUPPORTED_WIRE_VERSION; +const MAX_SUPPORTED_WIRE_VERSION = WIRE_CONSTANTS.MAX_SUPPORTED_WIRE_VERSION; + +// Representation of a deployment of servers +class TopologyDescription { + /** + * Create a TopologyDescription + * + * @param {string} topologyType + * @param {Map} serverDescriptions the a map of address to ServerDescription + * @param {string} setName + * @param {number} maxSetVersion + * @param {ObjectId} maxElectionId + */ + constructor( + topologyType, + serverDescriptions, + setName, + maxSetVersion, + maxElectionId, + commonWireVersion, + options + ) { + options = options || {}; + + // TODO: consider assigning all these values to a temporary value `s` which + // we use `Object.freeze` on, ensuring the internal state of this type + // is immutable. + this.type = topologyType || TopologyType.Unknown; + this.setName = setName || null; + this.maxSetVersion = maxSetVersion || null; + this.maxElectionId = maxElectionId || null; + this.servers = serverDescriptions || new Map(); + this.stale = false; + this.compatible = true; + this.compatibilityError = null; + this.logicalSessionTimeoutMinutes = null; + this.heartbeatFrequencyMS = options.heartbeatFrequencyMS || 0; + this.localThresholdMS = options.localThresholdMS || 0; + this.commonWireVersion = commonWireVersion || null; + + // save this locally, but don't display when printing the instance out + Object.defineProperty(this, 'options', { value: options, enumberable: false }); + + // determine server compatibility + for (const serverDescription of this.servers.values()) { + if (serverDescription.type === ServerType.Unknown) continue; + + if (serverDescription.minWireVersion > MAX_SUPPORTED_WIRE_VERSION) { + this.compatible = false; + this.compatibilityError = `Server at ${serverDescription.address} requires wire version ${serverDescription.minWireVersion}, but this version of the driver only supports up to ${MAX_SUPPORTED_WIRE_VERSION} (MongoDB ${MAX_SUPPORTED_SERVER_VERSION})`; + } + + if (serverDescription.maxWireVersion < MIN_SUPPORTED_WIRE_VERSION) { + this.compatible = false; + this.compatibilityError = `Server at ${serverDescription.address} reports wire version ${serverDescription.maxWireVersion}, but this version of the driver requires at least ${MIN_SUPPORTED_WIRE_VERSION} (MongoDB ${MIN_SUPPORTED_SERVER_VERSION}).`; + break; + } + } + + // Whenever a client updates the TopologyDescription from an ismaster response, it MUST set + // TopologyDescription.logicalSessionTimeoutMinutes to the smallest logicalSessionTimeoutMinutes + // value among ServerDescriptions of all data-bearing server types. If any have a null + // logicalSessionTimeoutMinutes, then TopologyDescription.logicalSessionTimeoutMinutes MUST be + // set to null. + const readableServers = Array.from(this.servers.values()).filter(s => s.isReadable); + this.logicalSessionTimeoutMinutes = readableServers.reduce((result, server) => { + if (server.logicalSessionTimeoutMinutes == null) return null; + if (result == null) return server.logicalSessionTimeoutMinutes; + return Math.min(result, server.logicalSessionTimeoutMinutes); + }, null); + } + + /** + * Returns a new TopologyDescription based on the SrvPollingEvent + * @param {SrvPollingEvent} ev The event + */ + updateFromSrvPollingEvent(ev) { + const newAddresses = ev.addresses(); + const serverDescriptions = new Map(this.servers); + for (const server of this.servers) { + if (newAddresses.has(server[0])) { + newAddresses.delete(server[0]); + } else { + serverDescriptions.delete(server[0]); + } + } + + if (serverDescriptions.size === this.servers.size && newAddresses.size === 0) { + return this; + } + + for (const address of newAddresses) { + serverDescriptions.set(address, new ServerDescription(address)); + } + + return new TopologyDescription( + this.type, + serverDescriptions, + this.setName, + this.maxSetVersion, + this.maxElectionId, + this.commonWireVersion, + this.options, + null + ); + } + + /** + * Returns a copy of this description updated with a given ServerDescription + * + * @param {ServerDescription} serverDescription + */ + update(serverDescription) { + const address = serverDescription.address; + // NOTE: there are a number of prime targets for refactoring here + // once we support destructuring assignments + + // potentially mutated values + let topologyType = this.type; + let setName = this.setName; + let maxSetVersion = this.maxSetVersion; + let maxElectionId = this.maxElectionId; + let commonWireVersion = this.commonWireVersion; + + if (serverDescription.setName && setName && serverDescription.setName !== setName) { + serverDescription = new ServerDescription(address, null); + } + + const serverType = serverDescription.type; + let serverDescriptions = new Map(this.servers); + + // update common wire version + if (serverDescription.maxWireVersion !== 0) { + if (commonWireVersion == null) { + commonWireVersion = serverDescription.maxWireVersion; + } else { + commonWireVersion = Math.min(commonWireVersion, serverDescription.maxWireVersion); + } + } + + // update the actual server description + serverDescriptions.set(address, serverDescription); + + if (topologyType === TopologyType.Single) { + // once we are defined as single, that never changes + return new TopologyDescription( + TopologyType.Single, + serverDescriptions, + setName, + maxSetVersion, + maxElectionId, + commonWireVersion, + this.options + ); + } + + if (topologyType === TopologyType.Unknown) { + if (serverType === ServerType.Standalone && this.servers.size !== 1) { + serverDescriptions.delete(address); + } else { + topologyType = topologyTypeForServerType(serverType); + } + } + + if (topologyType === TopologyType.Sharded) { + if ([ServerType.Mongos, ServerType.Unknown].indexOf(serverType) === -1) { + serverDescriptions.delete(address); + } + } + + if (topologyType === TopologyType.ReplicaSetNoPrimary) { + if ([ServerType.Standalone, ServerType.Mongos].indexOf(serverType) >= 0) { + serverDescriptions.delete(address); + } + + if (serverType === ServerType.RSPrimary) { + const result = updateRsFromPrimary( + serverDescriptions, + setName, + serverDescription, + maxSetVersion, + maxElectionId + ); + + (topologyType = result[0]), + (setName = result[1]), + (maxSetVersion = result[2]), + (maxElectionId = result[3]); + } else if ( + [ServerType.RSSecondary, ServerType.RSArbiter, ServerType.RSOther].indexOf(serverType) >= 0 + ) { + const result = updateRsNoPrimaryFromMember(serverDescriptions, setName, serverDescription); + (topologyType = result[0]), (setName = result[1]); + } + } + + if (topologyType === TopologyType.ReplicaSetWithPrimary) { + if ([ServerType.Standalone, ServerType.Mongos].indexOf(serverType) >= 0) { + serverDescriptions.delete(address); + topologyType = checkHasPrimary(serverDescriptions); + } else if (serverType === ServerType.RSPrimary) { + const result = updateRsFromPrimary( + serverDescriptions, + setName, + serverDescription, + maxSetVersion, + maxElectionId + ); + + (topologyType = result[0]), + (setName = result[1]), + (maxSetVersion = result[2]), + (maxElectionId = result[3]); + } else if ( + [ServerType.RSSecondary, ServerType.RSArbiter, ServerType.RSOther].indexOf(serverType) >= 0 + ) { + topologyType = updateRsWithPrimaryFromMember( + serverDescriptions, + setName, + serverDescription + ); + } else { + topologyType = checkHasPrimary(serverDescriptions); + } + } + + return new TopologyDescription( + topologyType, + serverDescriptions, + setName, + maxSetVersion, + maxElectionId, + commonWireVersion, + this.options + ); + } + + get error() { + const descriptionsWithError = Array.from(this.servers.values()).filter(sd => sd.error); + if (descriptionsWithError.length > 0) { + return descriptionsWithError[0].error; + } + return undefined; + } + + /** + * Determines if the topology description has any known servers + */ + get hasKnownServers() { + return Array.from(this.servers.values()).some(sd => sd.type !== ServerType.Unknown); + } + + /** + * Determines if this topology description has a data-bearing server available. + */ + get hasDataBearingServers() { + return Array.from(this.servers.values()).some(sd => sd.isDataBearing); + } + + /** + * Determines if the topology has a definition for the provided address + * + * @param {String} address + * @return {Boolean} Whether the topology knows about this server + */ + hasServer(address) { + return this.servers.has(address); + } +} + +function topologyTypeForServerType(serverType) { + if (serverType === ServerType.Standalone) { + return TopologyType.Single; + } + + if (serverType === ServerType.Mongos) { + return TopologyType.Sharded; + } + + if (serverType === ServerType.RSPrimary) { + return TopologyType.ReplicaSetWithPrimary; + } + + if (serverType === ServerType.RSGhost || serverType === ServerType.Unknown) { + return TopologyType.Unknown; + } + + return TopologyType.ReplicaSetNoPrimary; +} + +function compareObjectId(oid1, oid2) { + if (oid1 == null) { + return -1; + } + + if (oid2 == null) { + return 1; + } + + if (oid1.id instanceof Buffer && oid2.id instanceof Buffer) { + const oid1Buffer = oid1.id; + const oid2Buffer = oid2.id; + return oid1Buffer.compare(oid2Buffer); + } + + const oid1String = oid1.toString(); + const oid2String = oid2.toString(); + return oid1String.localeCompare(oid2String); +} + +function updateRsFromPrimary( + serverDescriptions, + setName, + serverDescription, + maxSetVersion, + maxElectionId +) { + setName = setName || serverDescription.setName; + if (setName !== serverDescription.setName) { + serverDescriptions.delete(serverDescription.address); + return [checkHasPrimary(serverDescriptions), setName, maxSetVersion, maxElectionId]; + } + + const electionId = serverDescription.electionId ? serverDescription.electionId : null; + if (serverDescription.setVersion && electionId) { + if (maxSetVersion && maxElectionId) { + if ( + maxSetVersion > serverDescription.setVersion || + compareObjectId(maxElectionId, electionId) > 0 + ) { + // this primary is stale, we must remove it + serverDescriptions.set( + serverDescription.address, + new ServerDescription(serverDescription.address) + ); + + return [checkHasPrimary(serverDescriptions), setName, maxSetVersion, maxElectionId]; + } + } + + maxElectionId = serverDescription.electionId; + } + + if ( + serverDescription.setVersion != null && + (maxSetVersion == null || serverDescription.setVersion > maxSetVersion) + ) { + maxSetVersion = serverDescription.setVersion; + } + + // We've heard from the primary. Is it the same primary as before? + for (const address of serverDescriptions.keys()) { + const server = serverDescriptions.get(address); + + if (server.type === ServerType.RSPrimary && server.address !== serverDescription.address) { + // Reset old primary's type to Unknown. + serverDescriptions.set(address, new ServerDescription(server.address)); + + // There can only be one primary + break; + } + } + + // Discover new hosts from this primary's response. + serverDescription.allHosts.forEach(address => { + if (!serverDescriptions.has(address)) { + serverDescriptions.set(address, new ServerDescription(address)); + } + }); + + // Remove hosts not in the response. + const currentAddresses = Array.from(serverDescriptions.keys()); + const responseAddresses = serverDescription.allHosts; + currentAddresses + .filter(addr => responseAddresses.indexOf(addr) === -1) + .forEach(address => { + serverDescriptions.delete(address); + }); + + return [checkHasPrimary(serverDescriptions), setName, maxSetVersion, maxElectionId]; +} + +function updateRsWithPrimaryFromMember(serverDescriptions, setName, serverDescription) { + if (setName == null) { + throw new TypeError('setName is required'); + } + + if ( + setName !== serverDescription.setName || + (serverDescription.me && serverDescription.address !== serverDescription.me) + ) { + serverDescriptions.delete(serverDescription.address); + } + + return checkHasPrimary(serverDescriptions); +} + +function updateRsNoPrimaryFromMember(serverDescriptions, setName, serverDescription) { + let topologyType = TopologyType.ReplicaSetNoPrimary; + + setName = setName || serverDescription.setName; + if (setName !== serverDescription.setName) { + serverDescriptions.delete(serverDescription.address); + return [topologyType, setName]; + } + + serverDescription.allHosts.forEach(address => { + if (!serverDescriptions.has(address)) { + serverDescriptions.set(address, new ServerDescription(address)); + } + }); + + if (serverDescription.me && serverDescription.address !== serverDescription.me) { + serverDescriptions.delete(serverDescription.address); + } + + return [topologyType, setName]; +} + +function checkHasPrimary(serverDescriptions) { + for (const addr of serverDescriptions.keys()) { + if (serverDescriptions.get(addr).type === ServerType.RSPrimary) { + return TopologyType.ReplicaSetWithPrimary; + } + } + + return TopologyType.ReplicaSetNoPrimary; +} + +module.exports = { + TopologyDescription +}; diff --git a/node_modules/mongodb/lib/core/sessions.js b/node_modules/mongodb/lib/core/sessions.js new file mode 100644 index 00000000..abc8d945 --- /dev/null +++ b/node_modules/mongodb/lib/core/sessions.js @@ -0,0 +1,780 @@ +'use strict'; + +const retrieveBSON = require('./connection/utils').retrieveBSON; +const EventEmitter = require('events'); +const BSON = retrieveBSON(); +const Binary = BSON.Binary; +const uuidV4 = require('./utils').uuidV4; +const MongoError = require('./error').MongoError; +const isRetryableError = require('././error').isRetryableError; +const MongoNetworkError = require('./error').MongoNetworkError; +const MongoWriteConcernError = require('./error').MongoWriteConcernError; +const Transaction = require('./transactions').Transaction; +const TxnState = require('./transactions').TxnState; +const isPromiseLike = require('./utils').isPromiseLike; +const ReadPreference = require('./topologies/read_preference'); +const maybePromise = require('../utils').maybePromise; +const isTransactionCommand = require('./transactions').isTransactionCommand; +const resolveClusterTime = require('./topologies/shared').resolveClusterTime; +const isSharded = require('./wireprotocol/shared').isSharded; +const maxWireVersion = require('./utils').maxWireVersion; +const now = require('./../utils').now; +const calculateDurationInMs = require('./../utils').calculateDurationInMs; +const minWireVersionForShardedTransactions = 8; + +function assertAlive(session, callback) { + if (session.serverSession == null) { + const error = new MongoError('Cannot use a session that has ended'); + if (typeof callback === 'function') { + callback(error, null); + return false; + } + + throw error; + } + + return true; +} + +/** + * Options to pass when creating a Client Session + * @typedef {Object} SessionOptions + * @property {boolean} [causalConsistency=true] Whether causal consistency should be enabled on this session + * @property {TransactionOptions} [defaultTransactionOptions] The default TransactionOptions to use for transactions started on this session. + */ + +/** + * A BSON document reflecting the lsid of a {@link ClientSession} + * @typedef {Object} SessionId + */ + +const kServerSession = Symbol('serverSession'); + +/** + * A class representing a client session on the server + * WARNING: not meant to be instantiated directly. + * @class + * @hideconstructor + */ +class ClientSession extends EventEmitter { + /** + * Create a client session. + * WARNING: not meant to be instantiated directly + * + * @param {Topology} topology The current client's topology (Internal Class) + * @param {ServerSessionPool} sessionPool The server session pool (Internal Class) + * @param {SessionOptions} [options] Optional settings + * @param {Object} [clientOptions] Optional settings provided when creating a client in the porcelain driver + */ + constructor(topology, sessionPool, options, clientOptions) { + super(); + + if (topology == null) { + throw new Error('ClientSession requires a topology'); + } + + if (sessionPool == null || !(sessionPool instanceof ServerSessionPool)) { + throw new Error('ClientSession requires a ServerSessionPool'); + } + + options = options || {}; + clientOptions = clientOptions || {}; + + this.topology = topology; + this.sessionPool = sessionPool; + this.hasEnded = false; + this.clientOptions = clientOptions; + this[kServerSession] = undefined; + + this.supports = { + causalConsistency: + typeof options.causalConsistency !== 'undefined' ? options.causalConsistency : true + }; + + this.clusterTime = options.initialClusterTime; + + this.operationTime = null; + this.explicit = !!options.explicit; + this.owner = options.owner; + this.defaultTransactionOptions = Object.assign({}, options.defaultTransactionOptions); + this.transaction = new Transaction(); + } + + /** + * The server id associated with this session + * @type {SessionId} + */ + get id() { + return this.serverSession.id; + } + + get serverSession() { + if (this[kServerSession] == null) { + this[kServerSession] = this.sessionPool.acquire(); + } + + return this[kServerSession]; + } + + /** + * Ends this session on the server + * + * @param {Object} [options] Optional settings. Currently reserved for future use + * @param {Function} [callback] Optional callback for completion of this operation + */ + endSession(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const session = this; + return maybePromise(this, callback, done => { + if (session.hasEnded) { + return done(); + } + + function completeEndSession() { + // release the server session back to the pool + session.sessionPool.release(session.serverSession); + session[kServerSession] = undefined; + + // mark the session as ended, and emit a signal + session.hasEnded = true; + session.emit('ended', session); + + // spec indicates that we should ignore all errors for `endSessions` + done(); + } + + if (session.serverSession && session.inTransaction()) { + session.abortTransaction(err => { + if (err) return done(err); + completeEndSession(); + }); + + return; + } + + completeEndSession(); + }); + } + + /** + * Advances the operationTime for a ClientSession. + * + * @param {Timestamp} operationTime the `BSON.Timestamp` of the operation type it is desired to advance to + */ + advanceOperationTime(operationTime) { + if (this.operationTime == null) { + this.operationTime = operationTime; + return; + } + + if (operationTime.greaterThan(this.operationTime)) { + this.operationTime = operationTime; + } + } + + /** + * Used to determine if this session equals another + * @param {ClientSession} session + * @return {boolean} true if the sessions are equal + */ + equals(session) { + if (!(session instanceof ClientSession)) { + return false; + } + + return this.id.id.buffer.equals(session.id.id.buffer); + } + + /** + * Increment the transaction number on the internal ServerSession + */ + incrementTransactionNumber() { + this.serverSession.txnNumber++; + } + + /** + * @returns {boolean} whether this session is currently in a transaction or not + */ + inTransaction() { + return this.transaction.isActive; + } + + /** + * Starts a new transaction with the given options. + * + * @param {TransactionOptions} options Options for the transaction + */ + startTransaction(options) { + assertAlive(this); + if (this.inTransaction()) { + throw new MongoError('Transaction already in progress'); + } + + const topologyMaxWireVersion = maxWireVersion(this.topology); + if ( + isSharded(this.topology) && + topologyMaxWireVersion != null && + topologyMaxWireVersion < minWireVersionForShardedTransactions + ) { + throw new MongoError('Transactions are not supported on sharded clusters in MongoDB < 4.2.'); + } + + // increment txnNumber + this.incrementTransactionNumber(); + + // create transaction state + this.transaction = new Transaction( + Object.assign({}, this.clientOptions, options || this.defaultTransactionOptions) + ); + + this.transaction.transition(TxnState.STARTING_TRANSACTION); + } + + /** + * Commits the currently active transaction in this session. + * + * @param {Function} [callback] optional callback for completion of this operation + * @return {Promise} A promise is returned if no callback is provided + */ + commitTransaction(callback) { + return maybePromise(this, callback, done => endTransaction(this, 'commitTransaction', done)); + } + + /** + * Aborts the currently active transaction in this session. + * + * @param {Function} [callback] optional callback for completion of this operation + * @return {Promise} A promise is returned if no callback is provided + */ + abortTransaction(callback) { + return maybePromise(this, callback, done => endTransaction(this, 'abortTransaction', done)); + } + + /** + * This is here to ensure that ClientSession is never serialized to BSON. + * @ignore + */ + toBSON() { + throw new Error('ClientSession cannot be serialized to BSON.'); + } + + /** + * A user provided function to be run within a transaction + * + * @callback WithTransactionCallback + * @param {ClientSession} session The parent session of the transaction running the operation. This should be passed into each operation within the lambda. + * @returns {Promise} The resulting Promise of operations run within this transaction + */ + + /** + * Runs a provided lambda within a transaction, retrying either the commit operation + * or entire transaction as needed (and when the error permits) to better ensure that + * the transaction can complete successfully. + * + * IMPORTANT: This method requires the user to return a Promise, all lambdas that do not + * return a Promise will result in undefined behavior. + * + * @param {WithTransactionCallback} fn + * @param {TransactionOptions} [options] Optional settings for the transaction + */ + withTransaction(fn, options) { + const startTime = now(); + return attemptTransaction(this, startTime, fn, options); + } +} + +const MAX_WITH_TRANSACTION_TIMEOUT = 120000; +const UNSATISFIABLE_WRITE_CONCERN_CODE = 100; +const UNKNOWN_REPL_WRITE_CONCERN_CODE = 79; +const MAX_TIME_MS_EXPIRED_CODE = 50; +const NON_DETERMINISTIC_WRITE_CONCERN_ERRORS = new Set([ + 'CannotSatisfyWriteConcern', + 'UnknownReplWriteConcern', + 'UnsatisfiableWriteConcern' +]); + +function hasNotTimedOut(startTime, max) { + return calculateDurationInMs(startTime) < max; +} + +function isUnknownTransactionCommitResult(err) { + return ( + isMaxTimeMSExpiredError(err) || + (!NON_DETERMINISTIC_WRITE_CONCERN_ERRORS.has(err.codeName) && + err.code !== UNSATISFIABLE_WRITE_CONCERN_CODE && + err.code !== UNKNOWN_REPL_WRITE_CONCERN_CODE) + ); +} + +function isMaxTimeMSExpiredError(err) { + if (err == null) return false; + return ( + err.code === MAX_TIME_MS_EXPIRED_CODE || + (err.writeConcernError && err.writeConcernError.code === MAX_TIME_MS_EXPIRED_CODE) + ); +} + +function attemptTransactionCommit(session, startTime, fn, options) { + return session.commitTransaction().catch(err => { + if ( + err instanceof MongoError && + hasNotTimedOut(startTime, MAX_WITH_TRANSACTION_TIMEOUT) && + !isMaxTimeMSExpiredError(err) + ) { + if (err.hasErrorLabel('UnknownTransactionCommitResult')) { + return attemptTransactionCommit(session, startTime, fn, options); + } + + if (err.hasErrorLabel('TransientTransactionError')) { + return attemptTransaction(session, startTime, fn, options); + } + } + + throw err; + }); +} + +const USER_EXPLICIT_TXN_END_STATES = new Set([ + TxnState.NO_TRANSACTION, + TxnState.TRANSACTION_COMMITTED, + TxnState.TRANSACTION_ABORTED +]); + +function userExplicitlyEndedTransaction(session) { + return USER_EXPLICIT_TXN_END_STATES.has(session.transaction.state); +} + +function attemptTransaction(session, startTime, fn, options) { + session.startTransaction(options); + + let promise; + try { + promise = fn(session); + } catch (err) { + promise = Promise.reject(err); + } + + if (!isPromiseLike(promise)) { + session.abortTransaction(); + throw new TypeError('Function provided to `withTransaction` must return a Promise'); + } + + return promise + .then(() => { + if (userExplicitlyEndedTransaction(session)) { + return; + } + + return attemptTransactionCommit(session, startTime, fn, options); + }) + .catch(err => { + function maybeRetryOrThrow(err) { + if ( + err instanceof MongoError && + err.hasErrorLabel('TransientTransactionError') && + hasNotTimedOut(startTime, MAX_WITH_TRANSACTION_TIMEOUT) + ) { + return attemptTransaction(session, startTime, fn, options); + } + + if (isMaxTimeMSExpiredError(err)) { + err.addErrorLabel('UnknownTransactionCommitResult'); + } + + throw err; + } + + if (session.transaction.isActive) { + return session.abortTransaction().then(() => maybeRetryOrThrow(err)); + } + + return maybeRetryOrThrow(err); + }); +} + +function endTransaction(session, commandName, callback) { + if (!assertAlive(session, callback)) { + // checking result in case callback was called + return; + } + + // handle any initial problematic cases + let txnState = session.transaction.state; + + if (txnState === TxnState.NO_TRANSACTION) { + callback(new MongoError('No transaction started')); + return; + } + + if (commandName === 'commitTransaction') { + if ( + txnState === TxnState.STARTING_TRANSACTION || + txnState === TxnState.TRANSACTION_COMMITTED_EMPTY + ) { + // the transaction was never started, we can safely exit here + session.transaction.transition(TxnState.TRANSACTION_COMMITTED_EMPTY); + callback(null, null); + return; + } + + if (txnState === TxnState.TRANSACTION_ABORTED) { + callback(new MongoError('Cannot call commitTransaction after calling abortTransaction')); + return; + } + } else { + if (txnState === TxnState.STARTING_TRANSACTION) { + // the transaction was never started, we can safely exit here + session.transaction.transition(TxnState.TRANSACTION_ABORTED); + callback(null, null); + return; + } + + if (txnState === TxnState.TRANSACTION_ABORTED) { + callback(new MongoError('Cannot call abortTransaction twice')); + return; + } + + if ( + txnState === TxnState.TRANSACTION_COMMITTED || + txnState === TxnState.TRANSACTION_COMMITTED_EMPTY + ) { + callback(new MongoError('Cannot call abortTransaction after calling commitTransaction')); + return; + } + } + + // construct and send the command + const command = { [commandName]: 1 }; + + // apply a writeConcern if specified + let writeConcern; + if (session.transaction.options.writeConcern) { + writeConcern = Object.assign({}, session.transaction.options.writeConcern); + } else if (session.clientOptions && session.clientOptions.w) { + writeConcern = { w: session.clientOptions.w }; + } + + if (txnState === TxnState.TRANSACTION_COMMITTED) { + writeConcern = Object.assign({ wtimeout: 10000 }, writeConcern, { w: 'majority' }); + } + + if (writeConcern) { + Object.assign(command, { writeConcern }); + } + + if (commandName === 'commitTransaction' && session.transaction.options.maxTimeMS) { + Object.assign(command, { maxTimeMS: session.transaction.options.maxTimeMS }); + } + + function commandHandler(e, r) { + if (commandName === 'commitTransaction') { + session.transaction.transition(TxnState.TRANSACTION_COMMITTED); + + if ( + e && + (e instanceof MongoNetworkError || + e instanceof MongoWriteConcernError || + isRetryableError(e) || + isMaxTimeMSExpiredError(e)) + ) { + if (isUnknownTransactionCommitResult(e)) { + e.addErrorLabel('UnknownTransactionCommitResult'); + + // per txns spec, must unpin session in this case + session.transaction.unpinServer(); + } + } + } else { + session.transaction.transition(TxnState.TRANSACTION_ABORTED); + } + + callback(e, r); + } + + // The spec indicates that we should ignore all errors on `abortTransaction` + function transactionError(err) { + return commandName === 'commitTransaction' ? err : null; + } + + if ( + // Assumption here that commandName is "commitTransaction" or "abortTransaction" + session.transaction.recoveryToken && + supportsRecoveryToken(session) + ) { + command.recoveryToken = session.transaction.recoveryToken; + } + + // send the command + session.topology.command('admin.$cmd', command, { session }, (err, reply) => { + if (err && isRetryableError(err)) { + // SPEC-1185: apply majority write concern when retrying commitTransaction + if (command.commitTransaction) { + // per txns spec, must unpin session in this case + session.transaction.unpinServer(); + + command.writeConcern = Object.assign({ wtimeout: 10000 }, command.writeConcern, { + w: 'majority' + }); + } + + return session.topology.command('admin.$cmd', command, { session }, (_err, _reply) => + commandHandler(transactionError(_err), _reply) + ); + } + + commandHandler(transactionError(err), reply); + }); +} + +function supportsRecoveryToken(session) { + const topology = session.topology; + return !!topology.s.options.useRecoveryToken; +} + +/** + * Reflects the existence of a session on the server. Can be reused by the session pool. + * WARNING: not meant to be instantiated directly. For internal use only. + * @ignore + */ +class ServerSession { + constructor() { + this.id = { id: new Binary(uuidV4(), Binary.SUBTYPE_UUID) }; + this.lastUse = now(); + this.txnNumber = 0; + this.isDirty = false; + } + + /** + * Determines if the server session has timed out. + * @ignore + * @param {Date} sessionTimeoutMinutes The server's "logicalSessionTimeoutMinutes" + * @return {boolean} true if the session has timed out. + */ + hasTimedOut(sessionTimeoutMinutes) { + // Take the difference of the lastUse timestamp and now, which will result in a value in + // milliseconds, and then convert milliseconds to minutes to compare to `sessionTimeoutMinutes` + const idleTimeMinutes = Math.round( + ((calculateDurationInMs(this.lastUse) % 86400000) % 3600000) / 60000 + ); + + return idleTimeMinutes > sessionTimeoutMinutes - 1; + } +} + +/** + * Maintains a pool of Server Sessions. + * For internal use only + * @ignore + */ +class ServerSessionPool { + constructor(topology) { + if (topology == null) { + throw new Error('ServerSessionPool requires a topology'); + } + + this.topology = topology; + this.sessions = []; + } + + /** + * Ends all sessions in the session pool. + * @ignore + */ + endAllPooledSessions(callback) { + if (this.sessions.length) { + this.topology.endSessions( + this.sessions.map(session => session.id), + () => { + this.sessions = []; + if (typeof callback === 'function') { + callback(); + } + } + ); + + return; + } + + if (typeof callback === 'function') { + callback(); + } + } + + /** + * Acquire a Server Session from the pool. + * Iterates through each session in the pool, removing any stale sessions + * along the way. The first non-stale session found is removed from the + * pool and returned. If no non-stale session is found, a new ServerSession + * is created. + * @ignore + * @returns {ServerSession} + */ + acquire() { + const sessionTimeoutMinutes = this.topology.logicalSessionTimeoutMinutes; + while (this.sessions.length) { + const session = this.sessions.shift(); + if (!session.hasTimedOut(sessionTimeoutMinutes)) { + return session; + } + } + + return new ServerSession(); + } + + /** + * Release a session to the session pool + * Adds the session back to the session pool if the session has not timed out yet. + * This method also removes any stale sessions from the pool. + * @ignore + * @param {ServerSession} session The session to release to the pool + */ + release(session) { + const sessionTimeoutMinutes = this.topology.logicalSessionTimeoutMinutes; + while (this.sessions.length) { + const pooledSession = this.sessions[this.sessions.length - 1]; + if (pooledSession.hasTimedOut(sessionTimeoutMinutes)) { + this.sessions.pop(); + } else { + break; + } + } + + if (!session.hasTimedOut(sessionTimeoutMinutes)) { + if (session.isDirty) { + return; + } + + // otherwise, readd this session to the session pool + this.sessions.unshift(session); + } + } +} + +// TODO: this should be codified in command construction +// @see https://github.com/mongodb/specifications/blob/master/source/read-write-concern/read-write-concern.rst#read-concern +function commandSupportsReadConcern(command, options) { + if ( + command.aggregate || + command.count || + command.distinct || + command.find || + command.parallelCollectionScan || + command.geoNear || + command.geoSearch + ) { + return true; + } + + if ( + command.mapReduce && + options && + options.out && + (options.out.inline === 1 || options.out === 'inline') + ) { + return true; + } + + return false; +} + +/** + * Optionally decorate a command with sessions specific keys + * + * @ignore + * @param {ClientSession} session the session tracking transaction state + * @param {Object} command the command to decorate + * @param {Object} topology the topology for tracking the cluster time + * @param {Object} [options] Optional settings passed to calling operation + * @return {MongoError|null} An error, if some error condition was met + */ +function applySession(session, command, options) { + if (session.hasEnded) { + // TODO: merge this with `assertAlive`, did not want to throw a try/catch here + return new MongoError('Cannot use a session that has ended'); + } + + // SPEC-1019: silently ignore explicit session with unacknowledged write for backwards compatibility + if (options && options.writeConcern && options.writeConcern.w === 0) { + return; + } + + const serverSession = session.serverSession; + serverSession.lastUse = now(); + command.lsid = serverSession.id; + + // first apply non-transaction-specific sessions data + const inTransaction = session.inTransaction() || isTransactionCommand(command); + const isRetryableWrite = options.willRetryWrite; + const shouldApplyReadConcern = commandSupportsReadConcern(command, options); + + if (serverSession.txnNumber && (isRetryableWrite || inTransaction)) { + command.txnNumber = BSON.Long.fromNumber(serverSession.txnNumber); + } + + // now attempt to apply transaction-specific sessions data + if (!inTransaction) { + if (session.transaction.state !== TxnState.NO_TRANSACTION) { + session.transaction.transition(TxnState.NO_TRANSACTION); + } + + // TODO: the following should only be applied to read operation per spec. + // for causal consistency + if (session.supports.causalConsistency && session.operationTime && shouldApplyReadConcern) { + command.readConcern = command.readConcern || {}; + Object.assign(command.readConcern, { afterClusterTime: session.operationTime }); + } + + return; + } + + if (options.readPreference && !options.readPreference.equals(ReadPreference.primary)) { + return new MongoError( + `Read preference in a transaction must be primary, not: ${options.readPreference.mode}` + ); + } + + // `autocommit` must always be false to differentiate from retryable writes + command.autocommit = false; + + if (session.transaction.state === TxnState.STARTING_TRANSACTION) { + session.transaction.transition(TxnState.TRANSACTION_IN_PROGRESS); + command.startTransaction = true; + + const readConcern = + session.transaction.options.readConcern || session.clientOptions.readConcern; + if (readConcern) { + command.readConcern = readConcern; + } + + if (session.supports.causalConsistency && session.operationTime) { + command.readConcern = command.readConcern || {}; + Object.assign(command.readConcern, { afterClusterTime: session.operationTime }); + } + } +} + +function updateSessionFromResponse(session, document) { + if (document.$clusterTime) { + resolveClusterTime(session, document.$clusterTime); + } + + if (document.operationTime && session && session.supports.causalConsistency) { + session.advanceOperationTime(document.operationTime); + } + + if (document.recoveryToken && session && session.inTransaction()) { + session.transaction._recoveryToken = document.recoveryToken; + } +} + +module.exports = { + ClientSession, + ServerSession, + ServerSessionPool, + TxnState, + applySession, + updateSessionFromResponse, + commandSupportsReadConcern +}; diff --git a/node_modules/mongodb/lib/core/tools/smoke_plugin.js b/node_modules/mongodb/lib/core/tools/smoke_plugin.js new file mode 100644 index 00000000..22d02986 --- /dev/null +++ b/node_modules/mongodb/lib/core/tools/smoke_plugin.js @@ -0,0 +1,61 @@ +'use strict'; + +var fs = require('fs'); + +/* Note: because this plugin uses process.on('uncaughtException'), only one + * of these can exist at any given time. This plugin and anything else that + * uses process.on('uncaughtException') will conflict. */ +exports.attachToRunner = function(runner, outputFile) { + var smokeOutput = { results: [] }; + var runningTests = {}; + + var integraPlugin = { + beforeTest: function(test, callback) { + test.startTime = Date.now(); + runningTests[test.name] = test; + callback(); + }, + afterTest: function(test, callback) { + smokeOutput.results.push({ + status: test.status, + start: test.startTime, + end: Date.now(), + test_file: test.name, + exit_code: 0, + url: '' + }); + delete runningTests[test.name]; + callback(); + }, + beforeExit: function(obj, callback) { + fs.writeFile(outputFile, JSON.stringify(smokeOutput), function() { + callback(); + }); + } + }; + + // In case of exception, make sure we write file + process.on('uncaughtException', function(err) { + // Mark all currently running tests as failed + for (var testName in runningTests) { + smokeOutput.results.push({ + status: 'fail', + start: runningTests[testName].startTime, + end: Date.now(), + test_file: testName, + exit_code: 0, + url: '' + }); + } + + // write file + fs.writeFileSync(outputFile, JSON.stringify(smokeOutput)); + + // Standard NodeJS uncaught exception handler + console.error(err.stack); + process.exit(1); + }); + + runner.plugin(integraPlugin); + return integraPlugin; +}; diff --git a/node_modules/mongodb/lib/core/topologies/mongos.js b/node_modules/mongodb/lib/core/topologies/mongos.js new file mode 100644 index 00000000..b07d14ec --- /dev/null +++ b/node_modules/mongodb/lib/core/topologies/mongos.js @@ -0,0 +1,1397 @@ +'use strict'; + +const inherits = require('util').inherits; +const f = require('util').format; +const EventEmitter = require('events').EventEmitter; +const CoreCursor = require('../cursor').CoreCursor; +const Logger = require('../connection/logger'); +const retrieveBSON = require('../connection/utils').retrieveBSON; +const MongoError = require('../error').MongoError; +const Server = require('./server'); +const diff = require('./shared').diff; +const cloneOptions = require('./shared').cloneOptions; +const SessionMixins = require('./shared').SessionMixins; +const isRetryableWritesSupported = require('./shared').isRetryableWritesSupported; +const relayEvents = require('../utils').relayEvents; +const BSON = retrieveBSON(); +const getMMAPError = require('./shared').getMMAPError; +const makeClientMetadata = require('../utils').makeClientMetadata; +const legacyIsRetryableWriteError = require('./shared').legacyIsRetryableWriteError; + +/** + * @fileOverview The **Mongos** class is a class that represents a Mongos Proxy topology and is + * used to construct connections. + */ + +// +// States +var DISCONNECTED = 'disconnected'; +var CONNECTING = 'connecting'; +var CONNECTED = 'connected'; +var UNREFERENCED = 'unreferenced'; +var DESTROYING = 'destroying'; +var DESTROYED = 'destroyed'; + +function stateTransition(self, newState) { + var legalTransitions = { + disconnected: [CONNECTING, DESTROYING, DESTROYED, DISCONNECTED], + connecting: [CONNECTING, DESTROYING, DESTROYED, CONNECTED, DISCONNECTED], + connected: [CONNECTED, DISCONNECTED, DESTROYING, DESTROYED, UNREFERENCED], + unreferenced: [UNREFERENCED, DESTROYING, DESTROYED], + destroyed: [DESTROYED] + }; + + // Get current state + var legalStates = legalTransitions[self.state]; + if (legalStates && legalStates.indexOf(newState) !== -1) { + self.state = newState; + } else { + self.s.logger.error( + f( + 'Mongos with id [%s] failed attempted illegal state transition from [%s] to [%s] only following state allowed [%s]', + self.id, + self.state, + newState, + legalStates + ) + ); + } +} + +// +// ReplSet instance id +var id = 1; +var handlers = ['connect', 'close', 'error', 'timeout', 'parseError']; + +/** + * Creates a new Mongos instance + * @class + * @param {array} seedlist A list of seeds for the replicaset + * @param {number} [options.haInterval=5000] The High availability period for replicaset inquiry + * @param {Cursor} [options.cursorFactory=Cursor] The cursor factory class used for all query cursors + * @param {number} [options.size=5] Server connection pool size + * @param {boolean} [options.keepAlive=true] TCP Connection keep alive enabled + * @param {number} [options.keepAliveInitialDelay=120000] Initial delay before TCP keep alive enabled + * @param {number} [options.localThresholdMS=15] Cutoff latency point in MS for MongoS proxy selection + * @param {boolean} [options.noDelay=true] TCP Connection no delay + * @param {number} [options.connectionTimeout=1000] TCP Connection timeout setting + * @param {number} [options.socketTimeout=0] TCP Socket timeout setting + * @param {boolean} [options.ssl=false] Use SSL for connection + * @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function. + * @param {Buffer} [options.ca] SSL Certificate store binary buffer + * @param {Buffer} [options.crl] SSL Certificate revocation store binary buffer + * @param {Buffer} [options.cert] SSL Certificate binary buffer + * @param {Buffer} [options.key] SSL Key file binary buffer + * @param {string} [options.passphrase] SSL Certificate pass phrase + * @param {string} [options.servername=null] String containing the server name requested via TLS SNI. + * @param {boolean} [options.rejectUnauthorized=true] Reject unauthorized server certificates + * @param {boolean} [options.promoteLongs=true] Convert Long values from the db into Numbers if they fit into 53 bits + * @param {boolean} [options.promoteValues=true] Promotes BSON values to native types where possible, set to false to only receive wrapper types. + * @param {boolean} [options.promoteBuffers=false] Promotes Binary BSON values to native Node Buffers. + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. + * @param {boolean} [options.monitorCommands=false] Enable command monitoring for this topology + * @return {Mongos} A cursor instance + * @fires Mongos#connect + * @fires Mongos#reconnect + * @fires Mongos#joined + * @fires Mongos#left + * @fires Mongos#failed + * @fires Mongos#fullsetup + * @fires Mongos#all + * @fires Mongos#serverHeartbeatStarted + * @fires Mongos#serverHeartbeatSucceeded + * @fires Mongos#serverHeartbeatFailed + * @fires Mongos#topologyOpening + * @fires Mongos#topologyClosed + * @fires Mongos#topologyDescriptionChanged + * @property {string} type the topology type. + * @property {string} parserType the parser type used (c++ or js). + */ +var Mongos = function(seedlist, options) { + options = options || {}; + + // Get replSet Id + this.id = id++; + + // deduplicate seedlist + if (Array.isArray(seedlist)) { + seedlist = seedlist.reduce((seeds, seed) => { + if (seeds.find(s => s.host === seed.host && s.port === seed.port)) { + return seeds; + } + + seeds.push(seed); + return seeds; + }, []); + } + + // Internal state + this.s = { + options: Object.assign({ metadata: makeClientMetadata(options) }, options), + // BSON instance + bson: + options.bson || + new BSON([ + BSON.Binary, + BSON.Code, + BSON.DBRef, + BSON.Decimal128, + BSON.Double, + BSON.Int32, + BSON.Long, + BSON.Map, + BSON.MaxKey, + BSON.MinKey, + BSON.ObjectId, + BSON.BSONRegExp, + BSON.Symbol, + BSON.Timestamp + ]), + // Factory overrides + Cursor: options.cursorFactory || CoreCursor, + // Logger instance + logger: Logger('Mongos', options), + // Seedlist + seedlist: seedlist, + // Ha interval + haInterval: options.haInterval ? options.haInterval : 10000, + // Disconnect handler + disconnectHandler: options.disconnectHandler, + // Server selection index + index: 0, + // Connect function options passed in + connectOptions: {}, + // Are we running in debug mode + debug: typeof options.debug === 'boolean' ? options.debug : false, + // localThresholdMS + localThresholdMS: options.localThresholdMS || 15 + }; + + // Log info warning if the socketTimeout < haInterval as it will cause + // a lot of recycled connections to happen. + if ( + this.s.logger.isWarn() && + this.s.options.socketTimeout !== 0 && + this.s.options.socketTimeout < this.s.haInterval + ) { + this.s.logger.warn( + f( + 'warning socketTimeout %s is less than haInterval %s. This might cause unnecessary server reconnections due to socket timeouts', + this.s.options.socketTimeout, + this.s.haInterval + ) + ); + } + + // Disconnected state + this.state = DISCONNECTED; + + // Current proxies we are connecting to + this.connectingProxies = []; + // Currently connected proxies + this.connectedProxies = []; + // Disconnected proxies + this.disconnectedProxies = []; + // Index of proxy to run operations against + this.index = 0; + // High availability timeout id + this.haTimeoutId = null; + // Last ismaster + this.ismaster = null; + + // Description of the Replicaset + this.topologyDescription = { + topologyType: 'Unknown', + servers: [] + }; + + // Highest clusterTime seen in responses from the current deployment + this.clusterTime = null; + + // Add event listener + EventEmitter.call(this); +}; + +inherits(Mongos, EventEmitter); +Object.assign(Mongos.prototype, SessionMixins); + +Object.defineProperty(Mongos.prototype, 'type', { + enumerable: true, + get: function() { + return 'mongos'; + } +}); + +Object.defineProperty(Mongos.prototype, 'parserType', { + enumerable: true, + get: function() { + return BSON.native ? 'c++' : 'js'; + } +}); + +Object.defineProperty(Mongos.prototype, 'logicalSessionTimeoutMinutes', { + enumerable: true, + get: function() { + if (!this.ismaster) return null; + return this.ismaster.logicalSessionTimeoutMinutes || null; + } +}); + +/** + * Emit event if it exists + * @method + */ +function emitSDAMEvent(self, event, description) { + if (self.listeners(event).length > 0) { + self.emit(event, description); + } +} + +const SERVER_EVENTS = ['serverDescriptionChanged', 'error', 'close', 'timeout', 'parseError']; +function destroyServer(server, options, callback) { + options = options || {}; + SERVER_EVENTS.forEach(event => server.removeAllListeners(event)); + server.destroy(options, callback); +} + +/** + * Initiate server connect + */ +Mongos.prototype.connect = function(options) { + var self = this; + // Add any connect level options to the internal state + this.s.connectOptions = options || {}; + + // Set connecting state + stateTransition(this, CONNECTING); + + // Create server instances + var servers = this.s.seedlist.map(function(x) { + const server = new Server( + Object.assign({}, self.s.options, x, options, { + reconnect: false, + monitoring: false, + parent: self + }) + ); + + relayEvents(server, self, ['serverDescriptionChanged']); + return server; + }); + + // Emit the topology opening event + emitSDAMEvent(this, 'topologyOpening', { topologyId: this.id }); + + // Start all server connections + connectProxies(self, servers); +}; + +/** + * Authenticate the topology. + * @method + * @param {MongoCredentials} credentials The credentials for authentication we are using + * @param {authResultCallback} callback A callback function + */ +Mongos.prototype.auth = function(credentials, callback) { + if (typeof callback === 'function') callback(null, null); +}; + +function handleEvent(self) { + return function() { + if (self.state === DESTROYED || self.state === DESTROYING) { + return; + } + + // Move to list of disconnectedProxies + moveServerFrom(self.connectedProxies, self.disconnectedProxies, this); + // Emit the initial topology + emitTopologyDescriptionChanged(self); + // Emit the left signal + self.emit('left', 'mongos', this); + // Emit the sdam event + self.emit('serverClosed', { + topologyId: self.id, + address: this.name + }); + }; +} + +function handleInitialConnectEvent(self, event) { + return function() { + var _this = this; + + // Destroy the instance + if (self.state === DESTROYED) { + // Emit the initial topology + emitTopologyDescriptionChanged(self); + // Move from connectingProxies + moveServerFrom(self.connectingProxies, self.disconnectedProxies, this); + return this.destroy(); + } + + // Check the type of server + if (event === 'connect') { + // Get last known ismaster + self.ismaster = _this.lastIsMaster(); + + // Is this not a proxy, remove t + if (self.ismaster.msg === 'isdbgrid') { + // Add to the connectd list + for (let i = 0; i < self.connectedProxies.length; i++) { + if (self.connectedProxies[i].name === _this.name) { + // Move from connectingProxies + moveServerFrom(self.connectingProxies, self.disconnectedProxies, _this); + // Emit the initial topology + emitTopologyDescriptionChanged(self); + _this.destroy(); + return self.emit('failed', _this); + } + } + + // Remove the handlers + for (let i = 0; i < handlers.length; i++) { + _this.removeAllListeners(handlers[i]); + } + + // Add stable state handlers + _this.on('error', handleEvent(self, 'error')); + _this.on('close', handleEvent(self, 'close')); + _this.on('timeout', handleEvent(self, 'timeout')); + _this.on('parseError', handleEvent(self, 'parseError')); + + // Move from connecting proxies connected + moveServerFrom(self.connectingProxies, self.connectedProxies, _this); + // Emit the joined event + self.emit('joined', 'mongos', _this); + } else { + // Print warning if we did not find a mongos proxy + if (self.s.logger.isWarn()) { + var message = 'expected mongos proxy, but found replicaset member mongod for server %s'; + // We have a standalone server + if (!self.ismaster.hosts) { + message = 'expected mongos proxy, but found standalone mongod for server %s'; + } + + self.s.logger.warn(f(message, _this.name)); + } + + // This is not a mongos proxy, destroy and remove it completely + _this.destroy(true); + removeProxyFrom(self.connectingProxies, _this); + // Emit the left event + self.emit('left', 'server', _this); + // Emit failed event + self.emit('failed', _this); + } + } else { + moveServerFrom(self.connectingProxies, self.disconnectedProxies, this); + // Emit the left event + self.emit('left', 'mongos', this); + // Emit failed event + self.emit('failed', this); + } + + // Emit the initial topology + emitTopologyDescriptionChanged(self); + + // Trigger topologyMonitor + if (self.connectingProxies.length === 0) { + // Emit connected if we are connected + if (self.connectedProxies.length > 0 && self.state === CONNECTING) { + // Set the state to connected + stateTransition(self, CONNECTED); + // Emit the connect event + self.emit('connect', self); + self.emit('fullsetup', self); + self.emit('all', self); + } else if (self.disconnectedProxies.length === 0) { + // Print warning if we did not find a mongos proxy + if (self.s.logger.isWarn()) { + self.s.logger.warn( + f('no mongos proxies found in seed list, did you mean to connect to a replicaset') + ); + } + + // Emit the error that no proxies were found + return self.emit('error', new MongoError('no mongos proxies found in seed list')); + } + + // Topology monitor + topologyMonitor(self, { firstConnect: true }); + } + }; +} + +function connectProxies(self, servers) { + // Update connectingProxies + self.connectingProxies = self.connectingProxies.concat(servers); + + // Index used to interleaf the server connects, avoiding + // runtime issues on io constrained vm's + var timeoutInterval = 0; + + function connect(server, timeoutInterval) { + setTimeout(function() { + // Emit opening server event + self.emit('serverOpening', { + topologyId: self.id, + address: server.name + }); + + // Emit the initial topology + emitTopologyDescriptionChanged(self); + + // Add event handlers + server.once('close', handleInitialConnectEvent(self, 'close')); + server.once('timeout', handleInitialConnectEvent(self, 'timeout')); + server.once('parseError', handleInitialConnectEvent(self, 'parseError')); + server.once('error', handleInitialConnectEvent(self, 'error')); + server.once('connect', handleInitialConnectEvent(self, 'connect')); + + // Command Monitoring events + relayEvents(server, self, ['commandStarted', 'commandSucceeded', 'commandFailed']); + + // Start connection + server.connect(self.s.connectOptions); + }, timeoutInterval); + } + + // Start all the servers + servers.forEach(server => connect(server, timeoutInterval++)); +} + +function pickProxy(self, session) { + // TODO: Destructure :) + const transaction = session && session.transaction; + + if (transaction && transaction.server) { + if (transaction.server.isConnected()) { + return transaction.server; + } else { + transaction.unpinServer(); + } + } + + // Get the currently connected Proxies + var connectedProxies = self.connectedProxies.slice(0); + + // Set lower bound + var lowerBoundLatency = Number.MAX_VALUE; + + // Determine the lower bound for the Proxies + for (var i = 0; i < connectedProxies.length; i++) { + if (connectedProxies[i].lastIsMasterMS < lowerBoundLatency) { + lowerBoundLatency = connectedProxies[i].lastIsMasterMS; + } + } + + // Filter out the possible servers + connectedProxies = connectedProxies.filter(function(server) { + if ( + server.lastIsMasterMS <= lowerBoundLatency + self.s.localThresholdMS && + server.isConnected() + ) { + return true; + } + }); + + let proxy; + + // We have no connectedProxies pick first of the connected ones + if (connectedProxies.length === 0) { + proxy = self.connectedProxies[0]; + } else { + // Get proxy + proxy = connectedProxies[self.index % connectedProxies.length]; + // Update the index + self.index = (self.index + 1) % connectedProxies.length; + } + + if (transaction && transaction.isActive && proxy && proxy.isConnected()) { + transaction.pinServer(proxy); + } + + // Return the proxy + return proxy; +} + +function moveServerFrom(from, to, proxy) { + for (var i = 0; i < from.length; i++) { + if (from[i].name === proxy.name) { + from.splice(i, 1); + } + } + + for (i = 0; i < to.length; i++) { + if (to[i].name === proxy.name) { + to.splice(i, 1); + } + } + + to.push(proxy); +} + +function removeProxyFrom(from, proxy) { + for (var i = 0; i < from.length; i++) { + if (from[i].name === proxy.name) { + from.splice(i, 1); + } + } +} + +function reconnectProxies(self, proxies, callback) { + // Count lefts + var count = proxies.length; + + // Handle events + var _handleEvent = function(self, event) { + return function() { + var _self = this; + count = count - 1; + + // Destroyed + if (self.state === DESTROYED || self.state === DESTROYING || self.state === UNREFERENCED) { + moveServerFrom(self.connectingProxies, self.disconnectedProxies, _self); + return this.destroy(); + } + + if (event === 'connect') { + // Destroyed + if (self.state === DESTROYED || self.state === DESTROYING || self.state === UNREFERENCED) { + moveServerFrom(self.connectingProxies, self.disconnectedProxies, _self); + return _self.destroy(); + } + + // Remove the handlers + for (var i = 0; i < handlers.length; i++) { + _self.removeAllListeners(handlers[i]); + } + + // Add stable state handlers + _self.on('error', handleEvent(self, 'error')); + _self.on('close', handleEvent(self, 'close')); + _self.on('timeout', handleEvent(self, 'timeout')); + _self.on('parseError', handleEvent(self, 'parseError')); + + // Move to the connected servers + moveServerFrom(self.connectingProxies, self.connectedProxies, _self); + // Emit topology Change + emitTopologyDescriptionChanged(self); + // Emit joined event + self.emit('joined', 'mongos', _self); + } else { + // Move from connectingProxies + moveServerFrom(self.connectingProxies, self.disconnectedProxies, _self); + this.destroy(); + } + + // Are we done finish up callback + if (count === 0) { + callback(); + } + }; + }; + + // No new servers + if (count === 0) { + return callback(); + } + + // Execute method + function execute(_server, i) { + setTimeout(function() { + // Destroyed + if (self.state === DESTROYED || self.state === DESTROYING || self.state === UNREFERENCED) { + return; + } + + // Create a new server instance + var server = new Server( + Object.assign({}, self.s.options, { + host: _server.name.split(':')[0], + port: parseInt(_server.name.split(':')[1], 10), + reconnect: false, + monitoring: false, + parent: self + }) + ); + + destroyServer(_server, { force: true }); + removeProxyFrom(self.disconnectedProxies, _server); + + // Relay the server description change + relayEvents(server, self, ['serverDescriptionChanged']); + + // Emit opening server event + self.emit('serverOpening', { + topologyId: server.s.topologyId !== -1 ? server.s.topologyId : self.id, + address: server.name + }); + + // Add temp handlers + server.once('connect', _handleEvent(self, 'connect')); + server.once('close', _handleEvent(self, 'close')); + server.once('timeout', _handleEvent(self, 'timeout')); + server.once('error', _handleEvent(self, 'error')); + server.once('parseError', _handleEvent(self, 'parseError')); + + // Command Monitoring events + relayEvents(server, self, ['commandStarted', 'commandSucceeded', 'commandFailed']); + + // Connect to proxy + self.connectingProxies.push(server); + server.connect(self.s.connectOptions); + }, i); + } + + // Create new instances + for (var i = 0; i < proxies.length; i++) { + execute(proxies[i], i); + } +} + +function topologyMonitor(self, options) { + options = options || {}; + + // no need to set up the monitor if we're already closed + if (self.state === DESTROYED || self.state === DESTROYING || self.state === UNREFERENCED) { + return; + } + + // Set momitoring timeout + self.haTimeoutId = setTimeout(function() { + if (self.state === DESTROYED || self.state === DESTROYING || self.state === UNREFERENCED) { + return; + } + + // If we have a primary and a disconnect handler, execute + // buffered operations + if (self.isConnected() && self.s.disconnectHandler) { + self.s.disconnectHandler.execute(); + } + + // Get the connectingServers + var proxies = self.connectedProxies.slice(0); + // Get the count + var count = proxies.length; + + // If the count is zero schedule a new fast + function pingServer(_self, _server, cb) { + // Measure running time + var start = new Date().getTime(); + + // Emit the server heartbeat start + emitSDAMEvent(self, 'serverHeartbeatStarted', { connectionId: _server.name }); + + // Execute ismaster + _server.command( + 'admin.$cmd', + { + ismaster: true + }, + { + monitoring: true, + socketTimeout: self.s.options.connectionTimeout || 2000 + }, + function(err, r) { + if ( + self.state === DESTROYED || + self.state === DESTROYING || + self.state === UNREFERENCED + ) { + // Move from connectingProxies + moveServerFrom(self.connectedProxies, self.disconnectedProxies, _server); + _server.destroy(); + return cb(err, r); + } + + // Calculate latency + var latencyMS = new Date().getTime() - start; + + // We had an error, remove it from the state + if (err) { + // Emit the server heartbeat failure + emitSDAMEvent(self, 'serverHeartbeatFailed', { + durationMS: latencyMS, + failure: err, + connectionId: _server.name + }); + // Move from connected proxies to disconnected proxies + moveServerFrom(self.connectedProxies, self.disconnectedProxies, _server); + } else { + // Update the server ismaster + _server.ismaster = r.result; + _server.lastIsMasterMS = latencyMS; + + // Server heart beat event + emitSDAMEvent(self, 'serverHeartbeatSucceeded', { + durationMS: latencyMS, + reply: r.result, + connectionId: _server.name + }); + } + + cb(err, r); + } + ); + } + + // No proxies initiate monitor again + if (proxies.length === 0) { + // Emit close event if any listeners registered + if (self.listeners('close').length > 0 && self.state === CONNECTING) { + self.emit('error', new MongoError('no mongos proxy available')); + } else { + self.emit('close', self); + } + + // Attempt to connect to any unknown servers + return reconnectProxies(self, self.disconnectedProxies, function() { + if (self.state === DESTROYED || self.state === DESTROYING || self.state === UNREFERENCED) { + return; + } + + // Are we connected ? emit connect event + if (self.state === CONNECTING && options.firstConnect) { + self.emit('connect', self); + self.emit('fullsetup', self); + self.emit('all', self); + } else if (self.isConnected()) { + self.emit('reconnect', self); + } else if (!self.isConnected() && self.listeners('close').length > 0) { + self.emit('close', self); + } + + // Perform topology monitor + topologyMonitor(self); + }); + } + + // Ping all servers + for (var i = 0; i < proxies.length; i++) { + pingServer(self, proxies[i], function() { + count = count - 1; + + if (count === 0) { + if ( + self.state === DESTROYED || + self.state === DESTROYING || + self.state === UNREFERENCED + ) { + return; + } + + // Attempt to connect to any unknown servers + reconnectProxies(self, self.disconnectedProxies, function() { + if ( + self.state === DESTROYED || + self.state === DESTROYING || + self.state === UNREFERENCED + ) { + return; + } + + // Perform topology monitor + topologyMonitor(self); + }); + } + }); + } + }, self.s.haInterval); +} + +/** + * Returns the last known ismaster document for this server + * @method + * @return {object} + */ +Mongos.prototype.lastIsMaster = function() { + return this.ismaster; +}; + +/** + * Unref all connections belong to this server + * @method + */ +Mongos.prototype.unref = function() { + // Transition state + stateTransition(this, UNREFERENCED); + // Get all proxies + var proxies = this.connectedProxies.concat(this.connectingProxies); + proxies.forEach(function(x) { + x.unref(); + }); + + clearTimeout(this.haTimeoutId); +}; + +/** + * Destroy the server connection + * @param {boolean} [options.force=false] Force destroy the pool + * @method + */ +Mongos.prototype.destroy = function(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + + stateTransition(this, DESTROYING); + if (this.haTimeoutId) { + clearTimeout(this.haTimeoutId); + } + + const proxies = this.connectedProxies.concat(this.connectingProxies); + let serverCount = proxies.length; + const serverDestroyed = () => { + serverCount--; + if (serverCount > 0) { + return; + } + + emitTopologyDescriptionChanged(this); + emitSDAMEvent(this, 'topologyClosed', { topologyId: this.id }); + stateTransition(this, DESTROYED); + if (typeof callback === 'function') { + callback(null, null); + } + }; + + if (serverCount === 0) { + serverDestroyed(); + return; + } + + // Destroy all connecting servers + proxies.forEach(server => { + // Emit the sdam event + this.emit('serverClosed', { + topologyId: this.id, + address: server.name + }); + + destroyServer(server, options, serverDestroyed); + moveServerFrom(this.connectedProxies, this.disconnectedProxies, server); + }); +}; + +/** + * Figure out if the server is connected + * @method + * @return {boolean} + */ +Mongos.prototype.isConnected = function() { + return this.connectedProxies.length > 0; +}; + +/** + * Figure out if the server instance was destroyed by calling destroy + * @method + * @return {boolean} + */ +Mongos.prototype.isDestroyed = function() { + return this.state === DESTROYED; +}; + +// +// Operations +// + +function executeWriteOperation(args, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // TODO: once we drop Node 4, use destructuring either here or in arguments. + const self = args.self; + const op = args.op; + const ns = args.ns; + const ops = args.ops; + + // Pick a server + let server = pickProxy(self, options.session); + // No server found error out + if (!server) return callback(new MongoError('no mongos proxy available')); + + const willRetryWrite = + !args.retrying && + !!options.retryWrites && + options.session && + isRetryableWritesSupported(self) && + !options.session.inTransaction() && + options.explain === undefined; + + const handler = (err, result) => { + if (!err) return callback(null, result); + if (!legacyIsRetryableWriteError(err, self) || !willRetryWrite) { + err = getMMAPError(err); + return callback(err); + } + + // Pick another server + server = pickProxy(self, options.session); + + // No server found error out with original error + if (!server) { + return callback(err); + } + + const newArgs = Object.assign({}, args, { retrying: true }); + return executeWriteOperation(newArgs, options, callback); + }; + + if (callback.operationId) { + handler.operationId = callback.operationId; + } + + // increment and assign txnNumber + if (willRetryWrite) { + options.session.incrementTransactionNumber(); + options.willRetryWrite = willRetryWrite; + } + + // rerun the operation + server[op](ns, ops, options, handler); +} + +/** + * Insert one or more documents + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of documents to insert + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {boolean} [options.retryWrites] Enable retryable writes for this operation + * @param {opResultCallback} callback A callback function + */ +Mongos.prototype.insert = function(ns, ops, options, callback) { + if (typeof options === 'function') { + (callback = options), (options = {}), (options = options || {}); + } + + if (this.state === DESTROYED) { + return callback(new MongoError(f('topology was destroyed'))); + } + + // Not connected but we have a disconnecthandler + if (!this.isConnected() && this.s.disconnectHandler != null) { + return this.s.disconnectHandler.add('insert', ns, ops, options, callback); + } + + // No mongos proxy available + if (!this.isConnected()) { + return callback(new MongoError('no mongos proxy available')); + } + + // Execute write operation + executeWriteOperation({ self: this, op: 'insert', ns, ops }, options, callback); +}; + +/** + * Perform one or more update operations + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of updates + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {boolean} [options.retryWrites] Enable retryable writes for this operation + * @param {opResultCallback} callback A callback function + */ +Mongos.prototype.update = function(ns, ops, options, callback) { + if (typeof options === 'function') { + (callback = options), (options = {}), (options = options || {}); + } + + if (this.state === DESTROYED) { + return callback(new MongoError(f('topology was destroyed'))); + } + + // Not connected but we have a disconnecthandler + if (!this.isConnected() && this.s.disconnectHandler != null) { + return this.s.disconnectHandler.add('update', ns, ops, options, callback); + } + + // No mongos proxy available + if (!this.isConnected()) { + return callback(new MongoError('no mongos proxy available')); + } + + // Execute write operation + executeWriteOperation({ self: this, op: 'update', ns, ops }, options, callback); +}; + +/** + * Perform one or more remove operations + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of removes + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {boolean} [options.retryWrites] Enable retryable writes for this operation + * @param {opResultCallback} callback A callback function + */ +Mongos.prototype.remove = function(ns, ops, options, callback) { + if (typeof options === 'function') { + (callback = options), (options = {}), (options = options || {}); + } + + if (this.state === DESTROYED) { + return callback(new MongoError(f('topology was destroyed'))); + } + + // Not connected but we have a disconnecthandler + if (!this.isConnected() && this.s.disconnectHandler != null) { + return this.s.disconnectHandler.add('remove', ns, ops, options, callback); + } + + // No mongos proxy available + if (!this.isConnected()) { + return callback(new MongoError('no mongos proxy available')); + } + + // Execute write operation + executeWriteOperation({ self: this, op: 'remove', ns, ops }, options, callback); +}; + +const RETRYABLE_WRITE_OPERATIONS = ['findAndModify', 'insert', 'update', 'delete']; + +function isWriteCommand(command) { + return RETRYABLE_WRITE_OPERATIONS.some(op => command[op]); +} + +/** + * Execute a command + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object} cmd The command hash + * @param {ReadPreference} [options.readPreference] Specify read preference if command supports it + * @param {Connection} [options.connection] Specify connection object to execute command against + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {opResultCallback} callback A callback function + */ +Mongos.prototype.command = function(ns, cmd, options, callback) { + if (typeof options === 'function') { + (callback = options), (options = {}), (options = options || {}); + } + + if (this.state === DESTROYED) { + return callback(new MongoError(f('topology was destroyed'))); + } + + var self = this; + + // Pick a proxy + var server = pickProxy(self, options.session); + + // Topology is not connected, save the call in the provided store to be + // Executed at some point when the handler deems it's reconnected + if ((server == null || !server.isConnected()) && this.s.disconnectHandler != null) { + return this.s.disconnectHandler.add('command', ns, cmd, options, callback); + } + + // No server returned we had an error + if (server == null) { + return callback(new MongoError('no mongos proxy available')); + } + + // Cloned options + var clonedOptions = cloneOptions(options); + clonedOptions.topology = self; + + const willRetryWrite = + !options.retrying && + options.retryWrites && + options.session && + isRetryableWritesSupported(self) && + !options.session.inTransaction() && + isWriteCommand(cmd); + + const cb = (err, result) => { + if (!err) return callback(null, result); + if (!legacyIsRetryableWriteError(err, self)) { + return callback(err); + } + + if (willRetryWrite) { + const newOptions = Object.assign({}, clonedOptions, { retrying: true }); + return this.command(ns, cmd, newOptions, callback); + } + + return callback(err); + }; + + // increment and assign txnNumber + if (willRetryWrite) { + clonedOptions.session.incrementTransactionNumber(); + clonedOptions.willRetryWrite = willRetryWrite; + } + + // Execute the command + server.command(ns, cmd, clonedOptions, cb); +}; + +/** + * Get a new cursor + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object|Long} cmd Can be either a command returning a cursor or a cursorId + * @param {object} [options] Options for the cursor + * @param {object} [options.batchSize=0] Batchsize for the operation + * @param {array} [options.documents=[]] Initial documents list for cursor + * @param {ReadPreference} [options.readPreference] Specify read preference if command supports it + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {object} [options.topology] The internal topology of the created cursor + * @returns {Cursor} + */ +Mongos.prototype.cursor = function(ns, cmd, options) { + options = options || {}; + const topology = options.topology || this; + + // Set up final cursor type + var FinalCursor = options.cursorFactory || this.s.Cursor; + + // Return the cursor + return new FinalCursor(topology, ns, cmd, options); +}; + +/** + * Selects a server + * + * @method + * @param {function} selector Unused + * @param {ReadPreference} [options.readPreference] Unused + * @param {ClientSession} [options.session] Specify a session if it is being used + * @param {function} callback + */ +Mongos.prototype.selectServer = function(selector, options, callback) { + if (typeof selector === 'function' && typeof callback === 'undefined') + (callback = selector), (selector = undefined), (options = {}); + if (typeof options === 'function') + (callback = options), (options = selector), (selector = undefined); + options = options || {}; + + const server = pickProxy(this, options.session); + if (server == null) { + callback(new MongoError('server selection failed')); + return; + } + + if (this.s.debug) this.emit('pickedServer', null, server); + callback(null, server); +}; + +/** + * All raw connections + * @method + * @return {Connection[]} + */ +Mongos.prototype.connections = function() { + var connections = []; + + for (var i = 0; i < this.connectedProxies.length; i++) { + connections = connections.concat(this.connectedProxies[i].connections()); + } + + return connections; +}; + +function emitTopologyDescriptionChanged(self) { + if (self.listeners('topologyDescriptionChanged').length > 0) { + var topology = 'Unknown'; + if (self.connectedProxies.length > 0) { + topology = 'Sharded'; + } + + // Generate description + var description = { + topologyType: topology, + servers: [] + }; + + // All proxies + var proxies = self.disconnectedProxies.concat(self.connectingProxies); + + // Add all the disconnected proxies + description.servers = description.servers.concat( + proxies.map(function(x) { + var description = x.getDescription(); + description.type = 'Unknown'; + return description; + }) + ); + + // Add all the connected proxies + description.servers = description.servers.concat( + self.connectedProxies.map(function(x) { + var description = x.getDescription(); + description.type = 'Mongos'; + return description; + }) + ); + + // Get the diff + var diffResult = diff(self.topologyDescription, description); + + // Create the result + var result = { + topologyId: self.id, + previousDescription: self.topologyDescription, + newDescription: description, + diff: diffResult + }; + + // Emit the topologyDescription change + if (diffResult.servers.length > 0) { + self.emit('topologyDescriptionChanged', result); + } + + // Set the new description + self.topologyDescription = description; + } +} + +/** + * A mongos connect event, used to verify that the connection is up and running + * + * @event Mongos#connect + * @type {Mongos} + */ + +/** + * A mongos reconnect event, used to verify that the mongos topology has reconnected + * + * @event Mongos#reconnect + * @type {Mongos} + */ + +/** + * A mongos fullsetup event, used to signal that all topology members have been contacted. + * + * @event Mongos#fullsetup + * @type {Mongos} + */ + +/** + * A mongos all event, used to signal that all topology members have been contacted. + * + * @event Mongos#all + * @type {Mongos} + */ + +/** + * A server member left the mongos list + * + * @event Mongos#left + * @type {Mongos} + * @param {string} type The type of member that left (mongos) + * @param {Server} server The server object that left + */ + +/** + * A server member joined the mongos list + * + * @event Mongos#joined + * @type {Mongos} + * @param {string} type The type of member that left (mongos) + * @param {Server} server The server object that joined + */ + +/** + * A server opening SDAM monitoring event + * + * @event Mongos#serverOpening + * @type {object} + */ + +/** + * A server closed SDAM monitoring event + * + * @event Mongos#serverClosed + * @type {object} + */ + +/** + * A server description SDAM change monitoring event + * + * @event Mongos#serverDescriptionChanged + * @type {object} + */ + +/** + * A topology open SDAM event + * + * @event Mongos#topologyOpening + * @type {object} + */ + +/** + * A topology closed SDAM event + * + * @event Mongos#topologyClosed + * @type {object} + */ + +/** + * A topology structure SDAM change event + * + * @event Mongos#topologyDescriptionChanged + * @type {object} + */ + +/** + * A topology serverHeartbeatStarted SDAM event + * + * @event Mongos#serverHeartbeatStarted + * @type {object} + */ + +/** + * A topology serverHeartbeatFailed SDAM event + * + * @event Mongos#serverHeartbeatFailed + * @type {object} + */ + +/** + * A topology serverHeartbeatSucceeded SDAM change event + * + * @event Mongos#serverHeartbeatSucceeded + * @type {object} + */ + +/** + * An event emitted indicating a command was started, if command monitoring is enabled + * + * @event Mongos#commandStarted + * @type {object} + */ + +/** + * An event emitted indicating a command succeeded, if command monitoring is enabled + * + * @event Mongos#commandSucceeded + * @type {object} + */ + +/** + * An event emitted indicating a command failed, if command monitoring is enabled + * + * @event Mongos#commandFailed + * @type {object} + */ + +module.exports = Mongos; diff --git a/node_modules/mongodb/lib/core/topologies/read_preference.js b/node_modules/mongodb/lib/core/topologies/read_preference.js new file mode 100644 index 00000000..d4627721 --- /dev/null +++ b/node_modules/mongodb/lib/core/topologies/read_preference.js @@ -0,0 +1,266 @@ +'use strict'; + +/** + * The **ReadPreference** class is a class that represents a MongoDB ReadPreference and is + * used to construct connections. + * @class + * @param {string} mode A string describing the read preference mode (primary|primaryPreferred|secondary|secondaryPreferred|nearest) + * @param {array} tags The tags object + * @param {object} [options] Additional read preference options + * @param {number} [options.maxStalenessSeconds] Max secondary read staleness in seconds, Minimum value is 90 seconds. + * @param {object} [options.hedge] Server mode in which the same query is dispatched in parallel to multiple replica set members. + * @param {boolean} [options.hedge.enabled] Explicitly enable or disable hedged reads. + * @see https://docs.mongodb.com/manual/core/read-preference/ + * @return {ReadPreference} + */ +const ReadPreference = function(mode, tags, options) { + if (!ReadPreference.isValid(mode)) { + throw new TypeError(`Invalid read preference mode ${mode}`); + } + + // TODO(major): tags MUST be an array of tagsets + if (tags && !Array.isArray(tags)) { + console.warn( + 'ReadPreference tags must be an array, this will change in the next major version' + ); + + const tagsHasMaxStalenessSeconds = typeof tags.maxStalenessSeconds !== 'undefined'; + const tagsHasHedge = typeof tags.hedge !== 'undefined'; + const tagsHasOptions = tagsHasMaxStalenessSeconds || tagsHasHedge; + if (tagsHasOptions) { + // this is likely an options object + options = tags; + tags = undefined; + } else { + tags = [tags]; + } + } + + this.mode = mode; + this.tags = tags; + this.hedge = options && options.hedge; + + options = options || {}; + if (options.maxStalenessSeconds != null) { + if (options.maxStalenessSeconds <= 0) { + throw new TypeError('maxStalenessSeconds must be a positive integer'); + } + + this.maxStalenessSeconds = options.maxStalenessSeconds; + + // NOTE: The minimum required wire version is 5 for this read preference. If the existing + // topology has a lower value then a MongoError will be thrown during server selection. + this.minWireVersion = 5; + } + + if (this.mode === ReadPreference.PRIMARY) { + if (this.tags && Array.isArray(this.tags) && this.tags.length > 0) { + throw new TypeError('Primary read preference cannot be combined with tags'); + } + + if (this.maxStalenessSeconds) { + throw new TypeError('Primary read preference cannot be combined with maxStalenessSeconds'); + } + + if (this.hedge) { + throw new TypeError('Primary read preference cannot be combined with hedge'); + } + } +}; + +// Support the deprecated `preference` property introduced in the porcelain layer +Object.defineProperty(ReadPreference.prototype, 'preference', { + enumerable: true, + get: function() { + return this.mode; + } +}); + +/* + * Read preference mode constants + */ +ReadPreference.PRIMARY = 'primary'; +ReadPreference.PRIMARY_PREFERRED = 'primaryPreferred'; +ReadPreference.SECONDARY = 'secondary'; +ReadPreference.SECONDARY_PREFERRED = 'secondaryPreferred'; +ReadPreference.NEAREST = 'nearest'; + +const VALID_MODES = [ + ReadPreference.PRIMARY, + ReadPreference.PRIMARY_PREFERRED, + ReadPreference.SECONDARY, + ReadPreference.SECONDARY_PREFERRED, + ReadPreference.NEAREST, + null +]; + +/** + * Construct a ReadPreference given an options object. + * + * @param {object} options The options object from which to extract the read preference. + * @return {ReadPreference} + */ +ReadPreference.fromOptions = function(options) { + if (!options) return null; + const readPreference = options.readPreference; + if (!readPreference) return null; + const readPreferenceTags = options.readPreferenceTags; + const maxStalenessSeconds = options.maxStalenessSeconds; + if (typeof readPreference === 'string') { + return new ReadPreference(readPreference, readPreferenceTags); + } else if (!(readPreference instanceof ReadPreference) && typeof readPreference === 'object') { + const mode = readPreference.mode || readPreference.preference; + if (mode && typeof mode === 'string') { + return new ReadPreference(mode, readPreference.tags, { + maxStalenessSeconds: readPreference.maxStalenessSeconds || maxStalenessSeconds, + hedge: readPreference.hedge + }); + } + } + + return readPreference; +}; + +/** + * Resolves a read preference based on well-defined inheritance rules. This method will not only + * determine the read preference (if there is one), but will also ensure the returned value is a + * properly constructed instance of `ReadPreference`. + * + * @param {Collection|Db|MongoClient} parent The parent of the operation on which to determine the read + * preference, used for determining the inherited read preference. + * @param {object} options The options passed into the method, potentially containing a read preference + * @returns {(ReadPreference|null)} The resolved read preference + */ +ReadPreference.resolve = function(parent, options) { + options = options || {}; + const session = options.session; + + const inheritedReadPreference = parent && parent.readPreference; + + let readPreference; + if (options.readPreference) { + readPreference = ReadPreference.fromOptions(options); + } else if (session && session.inTransaction() && session.transaction.options.readPreference) { + // The transaction’s read preference MUST override all other user configurable read preferences. + readPreference = session.transaction.options.readPreference; + } else if (inheritedReadPreference != null) { + readPreference = inheritedReadPreference; + } else { + readPreference = ReadPreference.primary; + } + + return typeof readPreference === 'string' ? new ReadPreference(readPreference) : readPreference; +}; + +/** + * Replaces options.readPreference with a ReadPreference instance + */ +ReadPreference.translate = function(options) { + if (options.readPreference == null) return options; + const r = options.readPreference; + + if (typeof r === 'string') { + options.readPreference = new ReadPreference(r); + } else if (r && !(r instanceof ReadPreference) && typeof r === 'object') { + const mode = r.mode || r.preference; + if (mode && typeof mode === 'string') { + options.readPreference = new ReadPreference(mode, r.tags, { + maxStalenessSeconds: r.maxStalenessSeconds + }); + } + } else if (!(r instanceof ReadPreference)) { + throw new TypeError('Invalid read preference: ' + r); + } + + return options; +}; + +/** + * Validate if a mode is legal + * + * @method + * @param {string} mode The string representing the read preference mode. + * @return {boolean} True if a mode is valid + */ +ReadPreference.isValid = function(mode) { + return VALID_MODES.indexOf(mode) !== -1; +}; + +/** + * Validate if a mode is legal + * + * @method + * @param {string} mode The string representing the read preference mode. + * @return {boolean} True if a mode is valid + */ +ReadPreference.prototype.isValid = function(mode) { + return ReadPreference.isValid(typeof mode === 'string' ? mode : this.mode); +}; + +const needSlaveOk = ['primaryPreferred', 'secondary', 'secondaryPreferred', 'nearest']; + +/** + * Indicates that this readPreference needs the "slaveOk" bit when sent over the wire + * @method + * @return {boolean} + * @see https://docs.mongodb.com/manual/reference/mongodb-wire-protocol/#op-query + */ +ReadPreference.prototype.slaveOk = function() { + return needSlaveOk.indexOf(this.mode) !== -1; +}; + +/** + * Are the two read preference equal + * @method + * @param {ReadPreference} readPreference The read preference with which to check equality + * @return {boolean} True if the two ReadPreferences are equivalent + */ +ReadPreference.prototype.equals = function(readPreference) { + return readPreference.mode === this.mode; +}; + +/** + * Return JSON representation + * @method + * @return {Object} A JSON representation of the ReadPreference + */ +ReadPreference.prototype.toJSON = function() { + const readPreference = { mode: this.mode }; + if (Array.isArray(this.tags)) readPreference.tags = this.tags; + if (this.maxStalenessSeconds) readPreference.maxStalenessSeconds = this.maxStalenessSeconds; + if (this.hedge) readPreference.hedge = this.hedge; + return readPreference; +}; + +/** + * Primary read preference + * @member + * @type {ReadPreference} + */ +ReadPreference.primary = new ReadPreference('primary'); +/** + * Primary Preferred read preference + * @member + * @type {ReadPreference} + */ +ReadPreference.primaryPreferred = new ReadPreference('primaryPreferred'); +/** + * Secondary read preference + * @member + * @type {ReadPreference} + */ +ReadPreference.secondary = new ReadPreference('secondary'); +/** + * Secondary Preferred read preference + * @member + * @type {ReadPreference} + */ +ReadPreference.secondaryPreferred = new ReadPreference('secondaryPreferred'); +/** + * Nearest read preference + * @member + * @type {ReadPreference} + */ +ReadPreference.nearest = new ReadPreference('nearest'); + +module.exports = ReadPreference; diff --git a/node_modules/mongodb/lib/core/topologies/replset.js b/node_modules/mongodb/lib/core/topologies/replset.js new file mode 100644 index 00000000..ff39ccbb --- /dev/null +++ b/node_modules/mongodb/lib/core/topologies/replset.js @@ -0,0 +1,1565 @@ +'use strict'; + +const inherits = require('util').inherits; +const f = require('util').format; +const EventEmitter = require('events').EventEmitter; +const ReadPreference = require('./read_preference'); +const CoreCursor = require('../cursor').CoreCursor; +const retrieveBSON = require('../connection/utils').retrieveBSON; +const Logger = require('../connection/logger'); +const MongoError = require('../error').MongoError; +const Server = require('./server'); +const ReplSetState = require('./replset_state'); +const Timeout = require('./shared').Timeout; +const Interval = require('./shared').Interval; +const SessionMixins = require('./shared').SessionMixins; +const isRetryableWritesSupported = require('./shared').isRetryableWritesSupported; +const relayEvents = require('../utils').relayEvents; +const BSON = retrieveBSON(); +const getMMAPError = require('./shared').getMMAPError; +const makeClientMetadata = require('../utils').makeClientMetadata; +const legacyIsRetryableWriteError = require('./shared').legacyIsRetryableWriteError; +const now = require('../../utils').now; +const calculateDurationInMs = require('../../utils').calculateDurationInMs; + +// +// States +var DISCONNECTED = 'disconnected'; +var CONNECTING = 'connecting'; +var CONNECTED = 'connected'; +var UNREFERENCED = 'unreferenced'; +var DESTROYED = 'destroyed'; + +function stateTransition(self, newState) { + var legalTransitions = { + disconnected: [CONNECTING, DESTROYED, DISCONNECTED], + connecting: [CONNECTING, DESTROYED, CONNECTED, DISCONNECTED], + connected: [CONNECTED, DISCONNECTED, DESTROYED, UNREFERENCED], + unreferenced: [UNREFERENCED, DESTROYED], + destroyed: [DESTROYED] + }; + + // Get current state + var legalStates = legalTransitions[self.state]; + if (legalStates && legalStates.indexOf(newState) !== -1) { + self.state = newState; + } else { + self.s.logger.error( + f( + 'Pool with id [%s] failed attempted illegal state transition from [%s] to [%s] only following state allowed [%s]', + self.id, + self.state, + newState, + legalStates + ) + ); + } +} + +// +// ReplSet instance id +var id = 1; +var handlers = ['connect', 'close', 'error', 'timeout', 'parseError']; + +/** + * Creates a new Replset instance + * @class + * @param {array} seedlist A list of seeds for the replicaset + * @param {boolean} options.setName The Replicaset set name + * @param {boolean} [options.secondaryOnlyConnectionAllowed=false] Allow connection to a secondary only replicaset + * @param {number} [options.haInterval=10000] The High availability period for replicaset inquiry + * @param {boolean} [options.emitError=false] Server will emit errors events + * @param {Cursor} [options.cursorFactory=Cursor] The cursor factory class used for all query cursors + * @param {number} [options.size=5] Server connection pool size + * @param {boolean} [options.keepAlive=true] TCP Connection keep alive enabled + * @param {number} [options.keepAliveInitialDelay=120000] Initial delay before TCP keep alive enabled + * @param {boolean} [options.noDelay=true] TCP Connection no delay + * @param {number} [options.connectionTimeout=10000] TCP Connection timeout setting + * @param {number} [options.socketTimeout=0] TCP Socket timeout setting + * @param {boolean} [options.ssl=false] Use SSL for connection + * @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function. + * @param {Buffer} [options.ca] SSL Certificate store binary buffer + * @param {Buffer} [options.crl] SSL Certificate revocation store binary buffer + * @param {Buffer} [options.cert] SSL Certificate binary buffer + * @param {Buffer} [options.key] SSL Key file binary buffer + * @param {string} [options.passphrase] SSL Certificate pass phrase + * @param {string} [options.servername=null] String containing the server name requested via TLS SNI. + * @param {boolean} [options.rejectUnauthorized=true] Reject unauthorized server certificates + * @param {boolean} [options.promoteLongs=true] Convert Long values from the db into Numbers if they fit into 53 bits + * @param {boolean} [options.promoteValues=true] Promotes BSON values to native types where possible, set to false to only receive wrapper types. + * @param {boolean} [options.promoteBuffers=false] Promotes Binary BSON values to native Node Buffers. + * @param {number} [options.pingInterval=5000] Ping interval to check the response time to the different servers + * @param {number} [options.localThresholdMS=15] Cutoff latency point in MS for Replicaset member selection + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. + * @param {boolean} [options.monitorCommands=false] Enable command monitoring for this topology + * @return {ReplSet} A cursor instance + * @fires ReplSet#connect + * @fires ReplSet#ha + * @fires ReplSet#joined + * @fires ReplSet#left + * @fires ReplSet#failed + * @fires ReplSet#fullsetup + * @fires ReplSet#all + * @fires ReplSet#error + * @fires ReplSet#serverHeartbeatStarted + * @fires ReplSet#serverHeartbeatSucceeded + * @fires ReplSet#serverHeartbeatFailed + * @fires ReplSet#topologyOpening + * @fires ReplSet#topologyClosed + * @fires ReplSet#topologyDescriptionChanged + * @property {string} type the topology type. + * @property {string} parserType the parser type used (c++ or js). + */ +var ReplSet = function(seedlist, options) { + var self = this; + options = options || {}; + + // Validate seedlist + if (!Array.isArray(seedlist)) throw new MongoError('seedlist must be an array'); + // Validate list + if (seedlist.length === 0) throw new MongoError('seedlist must contain at least one entry'); + // Validate entries + seedlist.forEach(function(e) { + if (typeof e.host !== 'string' || typeof e.port !== 'number') + throw new MongoError('seedlist entry must contain a host and port'); + }); + + // Add event listener + EventEmitter.call(this); + + // Get replSet Id + this.id = id++; + + // Get the localThresholdMS + var localThresholdMS = options.localThresholdMS || 15; + // Backward compatibility + if (options.acceptableLatency) localThresholdMS = options.acceptableLatency; + + // Create a logger + var logger = Logger('ReplSet', options); + + // Internal state + this.s = { + options: Object.assign({ metadata: makeClientMetadata(options) }, options), + // BSON instance + bson: + options.bson || + new BSON([ + BSON.Binary, + BSON.Code, + BSON.DBRef, + BSON.Decimal128, + BSON.Double, + BSON.Int32, + BSON.Long, + BSON.Map, + BSON.MaxKey, + BSON.MinKey, + BSON.ObjectId, + BSON.BSONRegExp, + BSON.Symbol, + BSON.Timestamp + ]), + // Factory overrides + Cursor: options.cursorFactory || CoreCursor, + // Logger instance + logger: logger, + // Seedlist + seedlist: seedlist, + // Replicaset state + replicaSetState: new ReplSetState({ + id: this.id, + setName: options.setName, + acceptableLatency: localThresholdMS, + heartbeatFrequencyMS: options.haInterval ? options.haInterval : 10000, + logger: logger + }), + // Current servers we are connecting to + connectingServers: [], + // Ha interval + haInterval: options.haInterval ? options.haInterval : 10000, + // Minimum heartbeat frequency used if we detect a server close + minHeartbeatFrequencyMS: 500, + // Disconnect handler + disconnectHandler: options.disconnectHandler, + // Server selection index + index: 0, + // Connect function options passed in + connectOptions: {}, + // Are we running in debug mode + debug: typeof options.debug === 'boolean' ? options.debug : false + }; + + // Add handler for topology change + this.s.replicaSetState.on('topologyDescriptionChanged', function(r) { + self.emit('topologyDescriptionChanged', r); + }); + + // Log info warning if the socketTimeout < haInterval as it will cause + // a lot of recycled connections to happen. + if ( + this.s.logger.isWarn() && + this.s.options.socketTimeout !== 0 && + this.s.options.socketTimeout < this.s.haInterval + ) { + this.s.logger.warn( + f( + 'warning socketTimeout %s is less than haInterval %s. This might cause unnecessary server reconnections due to socket timeouts', + this.s.options.socketTimeout, + this.s.haInterval + ) + ); + } + + // Add forwarding of events from state handler + var types = ['joined', 'left']; + types.forEach(function(x) { + self.s.replicaSetState.on(x, function(t, s) { + self.emit(x, t, s); + }); + }); + + // Connect stat + this.initialConnectState = { + connect: false, + fullsetup: false, + all: false + }; + + // Disconnected state + this.state = DISCONNECTED; + this.haTimeoutId = null; + // Last ismaster + this.ismaster = null; + // Contains the intervalId + this.intervalIds = []; + + // Highest clusterTime seen in responses from the current deployment + this.clusterTime = null; +}; + +inherits(ReplSet, EventEmitter); +Object.assign(ReplSet.prototype, SessionMixins); + +Object.defineProperty(ReplSet.prototype, 'type', { + enumerable: true, + get: function() { + return 'replset'; + } +}); + +Object.defineProperty(ReplSet.prototype, 'parserType', { + enumerable: true, + get: function() { + return BSON.native ? 'c++' : 'js'; + } +}); + +Object.defineProperty(ReplSet.prototype, 'logicalSessionTimeoutMinutes', { + enumerable: true, + get: function() { + return this.s.replicaSetState.logicalSessionTimeoutMinutes || null; + } +}); + +function rexecuteOperations(self) { + // If we have a primary and a disconnect handler, execute + // buffered operations + if (self.s.replicaSetState.hasPrimaryAndSecondary() && self.s.disconnectHandler) { + self.s.disconnectHandler.execute(); + } else if (self.s.replicaSetState.hasPrimary() && self.s.disconnectHandler) { + self.s.disconnectHandler.execute({ executePrimary: true }); + } else if (self.s.replicaSetState.hasSecondary() && self.s.disconnectHandler) { + self.s.disconnectHandler.execute({ executeSecondary: true }); + } +} + +function connectNewServers(self, servers, callback) { + // No new servers + if (servers.length === 0) { + return callback(); + } + + // Count lefts + var count = servers.length; + var error = null; + + function done() { + count = count - 1; + if (count === 0) { + callback(error); + } + } + + // Handle events + var _handleEvent = function(self, event) { + return function(err) { + var _self = this; + + // Destroyed + if (self.state === DESTROYED || self.state === UNREFERENCED) { + this.destroy({ force: true }); + return done(); + } + + if (event === 'connect') { + // Update the state + var result = self.s.replicaSetState.update(_self); + // Update the state with the new server + if (result) { + // Primary lastIsMaster store it + if (_self.lastIsMaster() && _self.lastIsMaster().ismaster) { + self.ismaster = _self.lastIsMaster(); + } + + // Remove the handlers + for (let i = 0; i < handlers.length; i++) { + _self.removeAllListeners(handlers[i]); + } + + // Add stable state handlers + _self.on('error', handleEvent(self, 'error')); + _self.on('close', handleEvent(self, 'close')); + _self.on('timeout', handleEvent(self, 'timeout')); + _self.on('parseError', handleEvent(self, 'parseError')); + + // Enalbe the monitoring of the new server + monitorServer(_self.lastIsMaster().me, self, {}); + + // Rexecute any stalled operation + rexecuteOperations(self); + } else { + _self.destroy({ force: true }); + } + } else if (event === 'error') { + error = err; + } + + // Rexecute any stalled operation + rexecuteOperations(self); + done(); + }; + }; + + // Execute method + function execute(_server, i) { + setTimeout(function() { + // Destroyed + if (self.state === DESTROYED || self.state === UNREFERENCED) { + return; + } + + // remove existing connecting server if it's failed to connect, otherwise + // wait for that server to connect + const existingServerIdx = self.s.connectingServers.findIndex(s => s.name === _server); + if (existingServerIdx >= 0) { + const connectingServer = self.s.connectingServers[existingServerIdx]; + connectingServer.destroy({ force: true }); + + self.s.connectingServers.splice(existingServerIdx, 1); + return done(); + } + + // Create a new server instance + var server = new Server( + Object.assign({}, self.s.options, { + host: _server.split(':')[0], + port: parseInt(_server.split(':')[1], 10), + reconnect: false, + monitoring: false, + parent: self + }) + ); + + // Add temp handlers + server.once('connect', _handleEvent(self, 'connect')); + server.once('close', _handleEvent(self, 'close')); + server.once('timeout', _handleEvent(self, 'timeout')); + server.once('error', _handleEvent(self, 'error')); + server.once('parseError', _handleEvent(self, 'parseError')); + + // SDAM Monitoring events + server.on('serverOpening', e => self.emit('serverOpening', e)); + server.on('serverDescriptionChanged', e => self.emit('serverDescriptionChanged', e)); + server.on('serverClosed', e => self.emit('serverClosed', e)); + + // Command Monitoring events + relayEvents(server, self, ['commandStarted', 'commandSucceeded', 'commandFailed']); + + self.s.connectingServers.push(server); + server.connect(self.s.connectOptions); + }, i); + } + + // Create new instances + for (var i = 0; i < servers.length; i++) { + execute(servers[i], i); + } +} + +// Ping the server +var pingServer = function(self, server, cb) { + // Measure running time + var start = new Date().getTime(); + + // Emit the server heartbeat start + emitSDAMEvent(self, 'serverHeartbeatStarted', { connectionId: server.name }); + + // Execute ismaster + // Set the socketTimeout for a monitoring message to a low number + // Ensuring ismaster calls are timed out quickly + server.command( + 'admin.$cmd', + { + ismaster: true + }, + { + monitoring: true, + socketTimeout: self.s.options.connectionTimeout || 2000 + }, + function(err, r) { + if (self.state === DESTROYED || self.state === UNREFERENCED) { + server.destroy({ force: true }); + return cb(err, r); + } + + // Calculate latency + var latencyMS = new Date().getTime() - start; + + // Set the last updatedTime + server.lastUpdateTime = now(); + + // We had an error, remove it from the state + if (err) { + // Emit the server heartbeat failure + emitSDAMEvent(self, 'serverHeartbeatFailed', { + durationMS: latencyMS, + failure: err, + connectionId: server.name + }); + + // Remove server from the state + self.s.replicaSetState.remove(server); + } else { + // Update the server ismaster + server.ismaster = r.result; + + // Check if we have a lastWriteDate convert it to MS + // and store on the server instance for later use + if (server.ismaster.lastWrite && server.ismaster.lastWrite.lastWriteDate) { + server.lastWriteDate = server.ismaster.lastWrite.lastWriteDate.getTime(); + } + + // Do we have a brand new server + if (server.lastIsMasterMS === -1) { + server.lastIsMasterMS = latencyMS; + } else if (server.lastIsMasterMS) { + // After the first measurement, average RTT MUST be computed using an + // exponentially-weighted moving average formula, with a weighting factor (alpha) of 0.2. + // If the prior average is denoted old_rtt, then the new average (new_rtt) is + // computed from a new RTT measurement (x) using the following formula: + // alpha = 0.2 + // new_rtt = alpha * x + (1 - alpha) * old_rtt + server.lastIsMasterMS = 0.2 * latencyMS + (1 - 0.2) * server.lastIsMasterMS; + } + + if (self.s.replicaSetState.update(server)) { + // Primary lastIsMaster store it + if (server.lastIsMaster() && server.lastIsMaster().ismaster) { + self.ismaster = server.lastIsMaster(); + } + } + + // Server heart beat event + emitSDAMEvent(self, 'serverHeartbeatSucceeded', { + durationMS: latencyMS, + reply: r.result, + connectionId: server.name + }); + } + + // Calculate the staleness for this server + self.s.replicaSetState.updateServerMaxStaleness(server, self.s.haInterval); + + // Callback + cb(err, r); + } + ); +}; + +// Each server is monitored in parallel in their own timeout loop +var monitorServer = function(host, self, options) { + // If this is not the initial scan + // Is this server already being monitoried, then skip monitoring + if (!options.haInterval) { + for (var i = 0; i < self.intervalIds.length; i++) { + if (self.intervalIds[i].__host === host) { + return; + } + } + } + + // Get the haInterval + var _process = options.haInterval ? Timeout : Interval; + var _haInterval = options.haInterval ? options.haInterval : self.s.haInterval; + + // Create the interval + var intervalId = new _process(function() { + if (self.state === DESTROYED || self.state === UNREFERENCED) { + // clearInterval(intervalId); + intervalId.stop(); + return; + } + + // Do we already have server connection available for this host + var _server = self.s.replicaSetState.get(host); + + // Check if we have a known server connection and reuse + if (_server) { + // Ping the server + return pingServer(self, _server, function(err) { + if (err) { + // NOTE: should something happen here? + return; + } + + if (self.state === DESTROYED || self.state === UNREFERENCED) { + intervalId.stop(); + return; + } + + // Filter out all called intervaliIds + self.intervalIds = self.intervalIds.filter(function(intervalId) { + return intervalId.isRunning(); + }); + + // Initial sweep + if (_process === Timeout) { + if ( + self.state === CONNECTING && + ((self.s.replicaSetState.hasSecondary() && + self.s.options.secondaryOnlyConnectionAllowed) || + self.s.replicaSetState.hasPrimary()) + ) { + stateTransition(self, CONNECTED); + + // Emit connected sign + process.nextTick(function() { + self.emit('connect', self); + }); + + // Start topology interval check + topologyMonitor(self, {}); + } + } else { + if ( + self.state === DISCONNECTED && + ((self.s.replicaSetState.hasSecondary() && + self.s.options.secondaryOnlyConnectionAllowed) || + self.s.replicaSetState.hasPrimary()) + ) { + stateTransition(self, CONNECTED); + + // Rexecute any stalled operation + rexecuteOperations(self); + + // Emit connected sign + process.nextTick(function() { + self.emit('reconnect', self); + }); + } + } + + if ( + self.initialConnectState.connect && + !self.initialConnectState.fullsetup && + self.s.replicaSetState.hasPrimaryAndSecondary() + ) { + // Set initial connect state + self.initialConnectState.fullsetup = true; + self.initialConnectState.all = true; + + process.nextTick(function() { + self.emit('fullsetup', self); + self.emit('all', self); + }); + } + }); + } + }, _haInterval); + + // Start the interval + intervalId.start(); + // Add the intervalId host name + intervalId.__host = host; + // Add the intervalId to our list of intervalIds + self.intervalIds.push(intervalId); +}; + +function topologyMonitor(self, options) { + if (self.state === DESTROYED || self.state === UNREFERENCED) return; + options = options || {}; + + // Get the servers + var servers = Object.keys(self.s.replicaSetState.set); + + // Get the haInterval + var _process = options.haInterval ? Timeout : Interval; + var _haInterval = options.haInterval ? options.haInterval : self.s.haInterval; + + if (_process === Timeout) { + return connectNewServers(self, self.s.replicaSetState.unknownServers, function(err) { + // Don't emit errors if the connection was already + if (self.state === DESTROYED || self.state === UNREFERENCED) { + return; + } + + if (!self.s.replicaSetState.hasPrimary() && !self.s.options.secondaryOnlyConnectionAllowed) { + if (err) { + return self.emit('error', err); + } + + self.emit( + 'error', + new MongoError('no primary found in replicaset or invalid replica set name') + ); + return self.destroy({ force: true }); + } else if ( + !self.s.replicaSetState.hasSecondary() && + self.s.options.secondaryOnlyConnectionAllowed + ) { + if (err) { + return self.emit('error', err); + } + + self.emit( + 'error', + new MongoError('no secondary found in replicaset or invalid replica set name') + ); + return self.destroy({ force: true }); + } + + for (var i = 0; i < servers.length; i++) { + monitorServer(servers[i], self, options); + } + }); + } else { + for (var i = 0; i < servers.length; i++) { + monitorServer(servers[i], self, options); + } + } + + // Run the reconnect process + function executeReconnect(self) { + return function() { + if (self.state === DESTROYED || self.state === UNREFERENCED) { + return; + } + + connectNewServers(self, self.s.replicaSetState.unknownServers, function() { + var monitoringFrequencey = self.s.replicaSetState.hasPrimary() + ? _haInterval + : self.s.minHeartbeatFrequencyMS; + + // Create a timeout + self.intervalIds.push(new Timeout(executeReconnect(self), monitoringFrequencey).start()); + }); + }; + } + + // Decide what kind of interval to use + var intervalTime = !self.s.replicaSetState.hasPrimary() + ? self.s.minHeartbeatFrequencyMS + : _haInterval; + + self.intervalIds.push(new Timeout(executeReconnect(self), intervalTime).start()); +} + +function addServerToList(list, server) { + for (var i = 0; i < list.length; i++) { + if (list[i].name.toLowerCase() === server.name.toLowerCase()) return true; + } + + list.push(server); +} + +function handleEvent(self, event) { + return function() { + if (self.state === DESTROYED || self.state === UNREFERENCED) return; + // Debug log + if (self.s.logger.isDebug()) { + self.s.logger.debug( + f('handleEvent %s from server %s in replset with id %s', event, this.name, self.id) + ); + } + + // Remove from the replicaset state + self.s.replicaSetState.remove(this); + + // Are we in a destroyed state return + if (self.state === DESTROYED || self.state === UNREFERENCED) return; + + // If no primary and secondary available + if ( + !self.s.replicaSetState.hasPrimary() && + !self.s.replicaSetState.hasSecondary() && + self.s.options.secondaryOnlyConnectionAllowed + ) { + stateTransition(self, DISCONNECTED); + } else if (!self.s.replicaSetState.hasPrimary()) { + stateTransition(self, DISCONNECTED); + } + + addServerToList(self.s.connectingServers, this); + }; +} + +function shouldTriggerConnect(self) { + const isConnecting = self.state === CONNECTING; + const hasPrimary = self.s.replicaSetState.hasPrimary(); + const hasSecondary = self.s.replicaSetState.hasSecondary(); + const secondaryOnlyConnectionAllowed = self.s.options.secondaryOnlyConnectionAllowed; + const readPreferenceSecondary = + self.s.connectOptions.readPreference && + self.s.connectOptions.readPreference.equals(ReadPreference.secondary); + + return ( + (isConnecting && + ((readPreferenceSecondary && hasSecondary) || (!readPreferenceSecondary && hasPrimary))) || + (hasSecondary && secondaryOnlyConnectionAllowed) + ); +} + +function handleInitialConnectEvent(self, event) { + return function() { + var _this = this; + // Debug log + if (self.s.logger.isDebug()) { + self.s.logger.debug( + f( + 'handleInitialConnectEvent %s from server %s in replset with id %s', + event, + this.name, + self.id + ) + ); + } + + // Destroy the instance + if (self.state === DESTROYED || self.state === UNREFERENCED) { + return this.destroy({ force: true }); + } + + // Check the type of server + if (event === 'connect') { + // Update the state + var result = self.s.replicaSetState.update(_this); + if (result === true) { + // Primary lastIsMaster store it + if (_this.lastIsMaster() && _this.lastIsMaster().ismaster) { + self.ismaster = _this.lastIsMaster(); + } + + // Debug log + if (self.s.logger.isDebug()) { + self.s.logger.debug( + f( + 'handleInitialConnectEvent %s from server %s in replset with id %s has state [%s]', + event, + _this.name, + self.id, + JSON.stringify(self.s.replicaSetState.set) + ) + ); + } + + // Remove the handlers + for (let i = 0; i < handlers.length; i++) { + _this.removeAllListeners(handlers[i]); + } + + // Add stable state handlers + _this.on('error', handleEvent(self, 'error')); + _this.on('close', handleEvent(self, 'close')); + _this.on('timeout', handleEvent(self, 'timeout')); + _this.on('parseError', handleEvent(self, 'parseError')); + + // Do we have a primary or primaryAndSecondary + if (shouldTriggerConnect(self)) { + // We are connected + stateTransition(self, CONNECTED); + + // Set initial connect state + self.initialConnectState.connect = true; + // Emit connect event + process.nextTick(function() { + self.emit('connect', self); + }); + + topologyMonitor(self, {}); + } + } else if (result instanceof MongoError) { + _this.destroy({ force: true }); + self.destroy({ force: true }); + return self.emit('error', result); + } else { + _this.destroy({ force: true }); + } + } else { + // Emit failure to connect + self.emit('failed', this); + + addServerToList(self.s.connectingServers, this); + // Remove from the state + self.s.replicaSetState.remove(this); + } + + if ( + self.initialConnectState.connect && + !self.initialConnectState.fullsetup && + self.s.replicaSetState.hasPrimaryAndSecondary() + ) { + // Set initial connect state + self.initialConnectState.fullsetup = true; + self.initialConnectState.all = true; + + process.nextTick(function() { + self.emit('fullsetup', self); + self.emit('all', self); + }); + } + + // Remove from the list from connectingServers + for (var i = 0; i < self.s.connectingServers.length; i++) { + if (self.s.connectingServers[i].equals(this)) { + self.s.connectingServers.splice(i, 1); + } + } + + // Trigger topologyMonitor + if (self.s.connectingServers.length === 0 && self.state === CONNECTING) { + topologyMonitor(self, { haInterval: 1 }); + } + }; +} + +function connectServers(self, servers) { + // Update connectingServers + self.s.connectingServers = self.s.connectingServers.concat(servers); + + // Index used to interleaf the server connects, avoiding + // runtime issues on io constrained vm's + var timeoutInterval = 0; + + function connect(server, timeoutInterval) { + setTimeout(function() { + // Add the server to the state + if (self.s.replicaSetState.update(server)) { + // Primary lastIsMaster store it + if (server.lastIsMaster() && server.lastIsMaster().ismaster) { + self.ismaster = server.lastIsMaster(); + } + } + + // Add event handlers + server.once('close', handleInitialConnectEvent(self, 'close')); + server.once('timeout', handleInitialConnectEvent(self, 'timeout')); + server.once('parseError', handleInitialConnectEvent(self, 'parseError')); + server.once('error', handleInitialConnectEvent(self, 'error')); + server.once('connect', handleInitialConnectEvent(self, 'connect')); + + // SDAM Monitoring events + server.on('serverOpening', e => self.emit('serverOpening', e)); + server.on('serverDescriptionChanged', e => self.emit('serverDescriptionChanged', e)); + server.on('serverClosed', e => self.emit('serverClosed', e)); + + // Command Monitoring events + relayEvents(server, self, ['commandStarted', 'commandSucceeded', 'commandFailed']); + + // Start connection + server.connect(self.s.connectOptions); + }, timeoutInterval); + } + + // Start all the servers + while (servers.length > 0) { + connect(servers.shift(), timeoutInterval++); + } +} + +/** + * Emit event if it exists + * @method + */ +function emitSDAMEvent(self, event, description) { + if (self.listeners(event).length > 0) { + self.emit(event, description); + } +} + +/** + * Initiate server connect + */ +ReplSet.prototype.connect = function(options) { + var self = this; + // Add any connect level options to the internal state + this.s.connectOptions = options || {}; + + // Set connecting state + stateTransition(this, CONNECTING); + + // Create server instances + var servers = this.s.seedlist.map(function(x) { + return new Server( + Object.assign({}, self.s.options, x, options, { + reconnect: false, + monitoring: false, + parent: self + }) + ); + }); + + // Error out as high availability interval must be < than socketTimeout + if ( + this.s.options.socketTimeout > 0 && + this.s.options.socketTimeout <= this.s.options.haInterval + ) { + return self.emit( + 'error', + new MongoError( + f( + 'haInterval [%s] MS must be set to less than socketTimeout [%s] MS', + this.s.options.haInterval, + this.s.options.socketTimeout + ) + ) + ); + } + + // Emit the topology opening event + emitSDAMEvent(this, 'topologyOpening', { topologyId: this.id }); + // Start all server connections + connectServers(self, servers); +}; + +/** + * Authenticate the topology. + * @method + * @param {MongoCredentials} credentials The credentials for authentication we are using + * @param {authResultCallback} callback A callback function + */ +ReplSet.prototype.auth = function(credentials, callback) { + if (typeof callback === 'function') callback(null, null); +}; + +/** + * Destroy the server connection + * @param {boolean} [options.force=false] Force destroy the pool + * @method + */ +ReplSet.prototype.destroy = function(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + + let destroyCount = this.s.connectingServers.length + 1; // +1 for the callback from `replicaSetState.destroy` + const serverDestroyed = () => { + destroyCount--; + if (destroyCount > 0) { + return; + } + + // Emit toplogy closing event + emitSDAMEvent(this, 'topologyClosed', { topologyId: this.id }); + + if (typeof callback === 'function') { + callback(null, null); + } + }; + + if (this.state === DESTROYED) { + if (typeof callback === 'function') callback(null, null); + return; + } + + // Transition state + stateTransition(this, DESTROYED); + + // Clear out any monitoring process + if (this.haTimeoutId) clearTimeout(this.haTimeoutId); + + // Clear out all monitoring + for (var i = 0; i < this.intervalIds.length; i++) { + this.intervalIds[i].stop(); + } + + // Reset list of intervalIds + this.intervalIds = []; + + if (destroyCount === 0) { + serverDestroyed(); + return; + } + + // Destroy the replicaset + this.s.replicaSetState.destroy(options, serverDestroyed); + + // Destroy all connecting servers + this.s.connectingServers.forEach(function(x) { + x.destroy(options, serverDestroyed); + }); +}; + +/** + * Unref all connections belong to this server + * @method + */ +ReplSet.prototype.unref = function() { + // Transition state + stateTransition(this, UNREFERENCED); + + this.s.replicaSetState.allServers().forEach(function(x) { + x.unref(); + }); + + clearTimeout(this.haTimeoutId); +}; + +/** + * Returns the last known ismaster document for this server + * @method + * @return {object} + */ +ReplSet.prototype.lastIsMaster = function() { + // If secondaryOnlyConnectionAllowed and no primary but secondary + // return the secondaries ismaster result. + if ( + this.s.options.secondaryOnlyConnectionAllowed && + !this.s.replicaSetState.hasPrimary() && + this.s.replicaSetState.hasSecondary() + ) { + return this.s.replicaSetState.secondaries[0].lastIsMaster(); + } + + return this.s.replicaSetState.primary + ? this.s.replicaSetState.primary.lastIsMaster() + : this.ismaster; +}; + +/** + * All raw connections + * @method + * @return {Connection[]} + */ +ReplSet.prototype.connections = function() { + var servers = this.s.replicaSetState.allServers(); + var connections = []; + for (var i = 0; i < servers.length; i++) { + connections = connections.concat(servers[i].connections()); + } + + return connections; +}; + +/** + * Figure out if the server is connected + * @method + * @param {ReadPreference} [options.readPreference] Specify read preference if command supports it + * @return {boolean} + */ +ReplSet.prototype.isConnected = function(options) { + options = options || {}; + + // If we specified a read preference check if we are connected to something + // than can satisfy this + if (options.readPreference && options.readPreference.equals(ReadPreference.secondary)) { + return this.s.replicaSetState.hasSecondary(); + } + + if (options.readPreference && options.readPreference.equals(ReadPreference.primary)) { + return this.s.replicaSetState.hasPrimary(); + } + + if (options.readPreference && options.readPreference.equals(ReadPreference.primaryPreferred)) { + return this.s.replicaSetState.hasSecondary() || this.s.replicaSetState.hasPrimary(); + } + + if (options.readPreference && options.readPreference.equals(ReadPreference.secondaryPreferred)) { + return this.s.replicaSetState.hasSecondary() || this.s.replicaSetState.hasPrimary(); + } + + if (this.s.options.secondaryOnlyConnectionAllowed && this.s.replicaSetState.hasSecondary()) { + return true; + } + + return this.s.replicaSetState.hasPrimary(); +}; + +/** + * Figure out if the replicaset instance was destroyed by calling destroy + * @method + * @return {boolean} + */ +ReplSet.prototype.isDestroyed = function() { + return this.state === DESTROYED; +}; + +const SERVER_SELECTION_TIMEOUT_MS = 10000; // hardcoded `serverSelectionTimeoutMS` for legacy topology +const SERVER_SELECTION_INTERVAL_MS = 1000; // time to wait between selection attempts +/** + * Selects a server + * + * @method + * @param {function} selector Unused + * @param {ReadPreference} [options.readPreference] Specify read preference if command supports it + * @param {ClientSession} [options.session] Unused + * @param {function} callback + */ +ReplSet.prototype.selectServer = function(selector, options, callback) { + if (typeof selector === 'function' && typeof callback === 'undefined') + (callback = selector), (selector = undefined), (options = {}); + if (typeof options === 'function') (callback = options), (options = selector); + options = options || {}; + + let readPreference; + if (selector instanceof ReadPreference) { + readPreference = selector; + } else { + readPreference = options.readPreference || ReadPreference.primary; + } + + let lastError; + const start = now(); + const _selectServer = () => { + if (calculateDurationInMs(start) >= SERVER_SELECTION_TIMEOUT_MS) { + if (lastError != null) { + callback(lastError, null); + } else { + callback(new MongoError('Server selection timed out')); + } + + return; + } + + const server = this.s.replicaSetState.pickServer(readPreference); + if (server == null) { + setTimeout(_selectServer, SERVER_SELECTION_INTERVAL_MS); + return; + } + + if (!(server instanceof Server)) { + lastError = server; + setTimeout(_selectServer, SERVER_SELECTION_INTERVAL_MS); + return; + } + + if (this.s.debug) this.emit('pickedServer', options.readPreference, server); + callback(null, server); + }; + + _selectServer(); +}; + +/** + * Get all connected servers + * @method + * @return {Server[]} + */ +ReplSet.prototype.getServers = function() { + return this.s.replicaSetState.allServers(); +}; + +// +// Execute write operation +function executeWriteOperation(args, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // TODO: once we drop Node 4, use destructuring either here or in arguments. + const self = args.self; + const op = args.op; + const ns = args.ns; + const ops = args.ops; + + if (self.state === DESTROYED) { + return callback(new MongoError(f('topology was destroyed'))); + } + + const willRetryWrite = + !args.retrying && + !!options.retryWrites && + options.session && + isRetryableWritesSupported(self) && + !options.session.inTransaction() && + options.explain === undefined; + + if (!self.s.replicaSetState.hasPrimary()) { + if (self.s.disconnectHandler) { + // Not connected but we have a disconnecthandler + return self.s.disconnectHandler.add(op, ns, ops, options, callback); + } else if (!willRetryWrite) { + // No server returned we had an error + return callback(new MongoError('no primary server found')); + } + } + + const handler = (err, result) => { + if (!err) return callback(null, result); + if (!legacyIsRetryableWriteError(err, self)) { + err = getMMAPError(err); + return callback(err); + } + + if (willRetryWrite) { + const newArgs = Object.assign({}, args, { retrying: true }); + return executeWriteOperation(newArgs, options, callback); + } + + // Per SDAM, remove primary from replicaset + if (self.s.replicaSetState.primary) { + self.s.replicaSetState.primary.destroy(); + self.s.replicaSetState.remove(self.s.replicaSetState.primary, { force: true }); + } + + return callback(err); + }; + + if (callback.operationId) { + handler.operationId = callback.operationId; + } + + // increment and assign txnNumber + if (willRetryWrite) { + options.session.incrementTransactionNumber(); + options.willRetryWrite = willRetryWrite; + } + + self.s.replicaSetState.primary[op](ns, ops, options, handler); +} + +/** + * Insert one or more documents + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of documents to insert + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {boolean} [options.retryWrites] Enable retryable writes for this operation + * @param {opResultCallback} callback A callback function + */ +ReplSet.prototype.insert = function(ns, ops, options, callback) { + // Execute write operation + executeWriteOperation({ self: this, op: 'insert', ns, ops }, options, callback); +}; + +/** + * Perform one or more update operations + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of updates + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {boolean} [options.retryWrites] Enable retryable writes for this operation + * @param {opResultCallback} callback A callback function + */ +ReplSet.prototype.update = function(ns, ops, options, callback) { + // Execute write operation + executeWriteOperation({ self: this, op: 'update', ns, ops }, options, callback); +}; + +/** + * Perform one or more remove operations + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of removes + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {boolean} [options.retryWrites] Enable retryable writes for this operation + * @param {opResultCallback} callback A callback function + */ +ReplSet.prototype.remove = function(ns, ops, options, callback) { + // Execute write operation + executeWriteOperation({ self: this, op: 'remove', ns, ops }, options, callback); +}; + +const RETRYABLE_WRITE_OPERATIONS = ['findAndModify', 'insert', 'update', 'delete']; + +function isWriteCommand(command) { + return RETRYABLE_WRITE_OPERATIONS.some(op => command[op]); +} + +/** + * Execute a command + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object} cmd The command hash + * @param {ReadPreference} [options.readPreference] Specify read preference if command supports it + * @param {Connection} [options.connection] Specify connection object to execute command against + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {opResultCallback} callback A callback function + */ +ReplSet.prototype.command = function(ns, cmd, options, callback) { + if (typeof options === 'function') { + (callback = options), (options = {}), (options = options || {}); + } + + if (this.state === DESTROYED) return callback(new MongoError(f('topology was destroyed'))); + var self = this; + + // Establish readPreference + var readPreference = options.readPreference ? options.readPreference : ReadPreference.primary; + + // If the readPreference is primary and we have no primary, store it + if ( + readPreference.preference === 'primary' && + !this.s.replicaSetState.hasPrimary() && + this.s.disconnectHandler != null + ) { + return this.s.disconnectHandler.add('command', ns, cmd, options, callback); + } else if ( + readPreference.preference === 'secondary' && + !this.s.replicaSetState.hasSecondary() && + this.s.disconnectHandler != null + ) { + return this.s.disconnectHandler.add('command', ns, cmd, options, callback); + } else if ( + readPreference.preference !== 'primary' && + !this.s.replicaSetState.hasSecondary() && + !this.s.replicaSetState.hasPrimary() && + this.s.disconnectHandler != null + ) { + return this.s.disconnectHandler.add('command', ns, cmd, options, callback); + } + + // Pick a server + var server = this.s.replicaSetState.pickServer(readPreference); + // We received an error, return it + if (!(server instanceof Server)) return callback(server); + // Emit debug event + if (self.s.debug) self.emit('pickedServer', ReadPreference.primary, server); + + // No server returned we had an error + if (server == null) { + return callback( + new MongoError( + f('no server found that matches the provided readPreference %s', readPreference) + ) + ); + } + + const willRetryWrite = + !options.retrying && + !!options.retryWrites && + options.session && + isRetryableWritesSupported(self) && + !options.session.inTransaction() && + isWriteCommand(cmd); + + const cb = (err, result) => { + if (!err) return callback(null, result); + if (!legacyIsRetryableWriteError(err, self)) { + return callback(err); + } + + if (willRetryWrite) { + const newOptions = Object.assign({}, options, { retrying: true }); + return this.command(ns, cmd, newOptions, callback); + } + + // Per SDAM, remove primary from replicaset + if (this.s.replicaSetState.primary) { + this.s.replicaSetState.primary.destroy(); + this.s.replicaSetState.remove(this.s.replicaSetState.primary, { force: true }); + } + + return callback(err); + }; + + // increment and assign txnNumber + if (willRetryWrite) { + options.session.incrementTransactionNumber(); + options.willRetryWrite = willRetryWrite; + } + + // Execute the command + server.command(ns, cmd, options, cb); +}; + +/** + * Get a new cursor + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object|Long} cmd Can be either a command returning a cursor or a cursorId + * @param {object} [options] Options for the cursor + * @param {object} [options.batchSize=0] Batchsize for the operation + * @param {array} [options.documents=[]] Initial documents list for cursor + * @param {ReadPreference} [options.readPreference] Specify read preference if command supports it + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {object} [options.topology] The internal topology of the created cursor + * @returns {Cursor} + */ +ReplSet.prototype.cursor = function(ns, cmd, options) { + options = options || {}; + const topology = options.topology || this; + + // Set up final cursor type + var FinalCursor = options.cursorFactory || this.s.Cursor; + + // Return the cursor + return new FinalCursor(topology, ns, cmd, options); +}; + +/** + * A replset connect event, used to verify that the connection is up and running + * + * @event ReplSet#connect + * @type {ReplSet} + */ + +/** + * A replset reconnect event, used to verify that the topology reconnected + * + * @event ReplSet#reconnect + * @type {ReplSet} + */ + +/** + * A replset fullsetup event, used to signal that all topology members have been contacted. + * + * @event ReplSet#fullsetup + * @type {ReplSet} + */ + +/** + * A replset all event, used to signal that all topology members have been contacted. + * + * @event ReplSet#all + * @type {ReplSet} + */ + +/** + * A replset failed event, used to signal that initial replset connection failed. + * + * @event ReplSet#failed + * @type {ReplSet} + */ + +/** + * A server member left the replicaset + * + * @event ReplSet#left + * @type {function} + * @param {string} type The type of member that left (primary|secondary|arbiter) + * @param {Server} server The server object that left + */ + +/** + * A server member joined the replicaset + * + * @event ReplSet#joined + * @type {function} + * @param {string} type The type of member that joined (primary|secondary|arbiter) + * @param {Server} server The server object that joined + */ + +/** + * A server opening SDAM monitoring event + * + * @event ReplSet#serverOpening + * @type {object} + */ + +/** + * A server closed SDAM monitoring event + * + * @event ReplSet#serverClosed + * @type {object} + */ + +/** + * A server description SDAM change monitoring event + * + * @event ReplSet#serverDescriptionChanged + * @type {object} + */ + +/** + * A topology open SDAM event + * + * @event ReplSet#topologyOpening + * @type {object} + */ + +/** + * A topology closed SDAM event + * + * @event ReplSet#topologyClosed + * @type {object} + */ + +/** + * A topology structure SDAM change event + * + * @event ReplSet#topologyDescriptionChanged + * @type {object} + */ + +/** + * A topology serverHeartbeatStarted SDAM event + * + * @event ReplSet#serverHeartbeatStarted + * @type {object} + */ + +/** + * A topology serverHeartbeatFailed SDAM event + * + * @event ReplSet#serverHeartbeatFailed + * @type {object} + */ + +/** + * A topology serverHeartbeatSucceeded SDAM change event + * + * @event ReplSet#serverHeartbeatSucceeded + * @type {object} + */ + +/** + * An event emitted indicating a command was started, if command monitoring is enabled + * + * @event ReplSet#commandStarted + * @type {object} + */ + +/** + * An event emitted indicating a command succeeded, if command monitoring is enabled + * + * @event ReplSet#commandSucceeded + * @type {object} + */ + +/** + * An event emitted indicating a command failed, if command monitoring is enabled + * + * @event ReplSet#commandFailed + * @type {object} + */ + +module.exports = ReplSet; diff --git a/node_modules/mongodb/lib/core/topologies/replset_state.js b/node_modules/mongodb/lib/core/topologies/replset_state.js new file mode 100644 index 00000000..24c16d6d --- /dev/null +++ b/node_modules/mongodb/lib/core/topologies/replset_state.js @@ -0,0 +1,1121 @@ +'use strict'; + +var inherits = require('util').inherits, + f = require('util').format, + diff = require('./shared').diff, + EventEmitter = require('events').EventEmitter, + Logger = require('../connection/logger'), + ReadPreference = require('./read_preference'), + MongoError = require('../error').MongoError, + Buffer = require('safe-buffer').Buffer; + +var TopologyType = { + Single: 'Single', + ReplicaSetNoPrimary: 'ReplicaSetNoPrimary', + ReplicaSetWithPrimary: 'ReplicaSetWithPrimary', + Sharded: 'Sharded', + Unknown: 'Unknown' +}; + +var ServerType = { + Standalone: 'Standalone', + Mongos: 'Mongos', + PossiblePrimary: 'PossiblePrimary', + RSPrimary: 'RSPrimary', + RSSecondary: 'RSSecondary', + RSArbiter: 'RSArbiter', + RSOther: 'RSOther', + RSGhost: 'RSGhost', + Unknown: 'Unknown' +}; + +var ReplSetState = function(options) { + options = options || {}; + // Add event listener + EventEmitter.call(this); + // Topology state + this.topologyType = TopologyType.ReplicaSetNoPrimary; + this.setName = options.setName; + + // Server set + this.set = {}; + + // Unpacked options + this.id = options.id; + this.setName = options.setName; + + // Replicaset logger + this.logger = options.logger || Logger('ReplSet', options); + + // Server selection index + this.index = 0; + // Acceptable latency + this.acceptableLatency = options.acceptableLatency || 15; + + // heartbeatFrequencyMS + this.heartbeatFrequencyMS = options.heartbeatFrequencyMS || 10000; + + // Server side + this.primary = null; + this.secondaries = []; + this.arbiters = []; + this.passives = []; + this.ghosts = []; + // Current unknown hosts + this.unknownServers = []; + // In set status + this.set = {}; + // Status + this.maxElectionId = null; + this.maxSetVersion = 0; + // Description of the Replicaset + this.replicasetDescription = { + topologyType: 'Unknown', + servers: [] + }; + + this.logicalSessionTimeoutMinutes = undefined; +}; + +inherits(ReplSetState, EventEmitter); + +ReplSetState.prototype.hasPrimaryAndSecondary = function() { + return this.primary != null && this.secondaries.length > 0; +}; + +ReplSetState.prototype.hasPrimaryOrSecondary = function() { + return this.hasPrimary() || this.hasSecondary(); +}; + +ReplSetState.prototype.hasPrimary = function() { + return this.primary != null; +}; + +ReplSetState.prototype.hasSecondary = function() { + return this.secondaries.length > 0; +}; + +ReplSetState.prototype.get = function(host) { + var servers = this.allServers(); + + for (var i = 0; i < servers.length; i++) { + if (servers[i].name.toLowerCase() === host.toLowerCase()) { + return servers[i]; + } + } + + return null; +}; + +ReplSetState.prototype.allServers = function(options) { + options = options || {}; + var servers = this.primary ? [this.primary] : []; + servers = servers.concat(this.secondaries); + if (!options.ignoreArbiters) servers = servers.concat(this.arbiters); + servers = servers.concat(this.passives); + return servers; +}; + +ReplSetState.prototype.destroy = function(options, callback) { + const serversToDestroy = this.secondaries + .concat(this.arbiters) + .concat(this.passives) + .concat(this.ghosts); + if (this.primary) serversToDestroy.push(this.primary); + + let serverCount = serversToDestroy.length; + const serverDestroyed = () => { + serverCount--; + if (serverCount > 0) { + return; + } + + // Clear out the complete state + this.secondaries = []; + this.arbiters = []; + this.passives = []; + this.ghosts = []; + this.unknownServers = []; + this.set = {}; + this.primary = null; + + // Emit the topology changed + emitTopologyDescriptionChanged(this); + + if (typeof callback === 'function') { + callback(null, null); + } + }; + + if (serverCount === 0) { + serverDestroyed(); + return; + } + + serversToDestroy.forEach(server => server.destroy(options, serverDestroyed)); +}; + +ReplSetState.prototype.remove = function(server, options) { + options = options || {}; + + // Get the server name and lowerCase it + var serverName = server.name.toLowerCase(); + + // Only remove if the current server is not connected + var servers = this.primary ? [this.primary] : []; + servers = servers.concat(this.secondaries); + servers = servers.concat(this.arbiters); + servers = servers.concat(this.passives); + + // Check if it's active and this is just a failed connection attempt + for (var i = 0; i < servers.length; i++) { + if ( + !options.force && + servers[i].equals(server) && + servers[i].isConnected && + servers[i].isConnected() + ) { + return; + } + } + + // If we have it in the set remove it + if (this.set[serverName]) { + this.set[serverName].type = ServerType.Unknown; + this.set[serverName].electionId = null; + this.set[serverName].setName = null; + this.set[serverName].setVersion = null; + } + + // Remove type + var removeType = null; + + // Remove from any lists + if (this.primary && this.primary.equals(server)) { + this.primary = null; + this.topologyType = TopologyType.ReplicaSetNoPrimary; + removeType = 'primary'; + } + + // Remove from any other server lists + removeType = removeFrom(server, this.secondaries) ? 'secondary' : removeType; + removeType = removeFrom(server, this.arbiters) ? 'arbiter' : removeType; + removeType = removeFrom(server, this.passives) ? 'secondary' : removeType; + removeFrom(server, this.ghosts); + removeFrom(server, this.unknownServers); + + // Push to unknownServers + this.unknownServers.push(serverName); + + // Do we have a removeType + if (removeType) { + this.emit('left', removeType, server); + } +}; + +const isArbiter = ismaster => ismaster.arbiterOnly && ismaster.setName; + +ReplSetState.prototype.update = function(server) { + var self = this; + // Get the current ismaster + var ismaster = server.lastIsMaster(); + + // Get the server name and lowerCase it + var serverName = server.name.toLowerCase(); + + // + // Add any hosts + // + if (ismaster) { + // Join all the possible new hosts + var hosts = Array.isArray(ismaster.hosts) ? ismaster.hosts : []; + hosts = hosts.concat(Array.isArray(ismaster.arbiters) ? ismaster.arbiters : []); + hosts = hosts.concat(Array.isArray(ismaster.passives) ? ismaster.passives : []); + hosts = hosts.map(function(s) { + return s.toLowerCase(); + }); + + // Add all hosts as unknownServers + for (var i = 0; i < hosts.length; i++) { + // Add to the list of unknown server + if ( + this.unknownServers.indexOf(hosts[i]) === -1 && + (!this.set[hosts[i]] || this.set[hosts[i]].type === ServerType.Unknown) + ) { + this.unknownServers.push(hosts[i].toLowerCase()); + } + + if (!this.set[hosts[i]]) { + this.set[hosts[i]] = { + type: ServerType.Unknown, + electionId: null, + setName: null, + setVersion: null + }; + } + } + } + + // + // Unknown server + // + if (!ismaster && !inList(ismaster, server, this.unknownServers)) { + self.set[serverName] = { + type: ServerType.Unknown, + setVersion: null, + electionId: null, + setName: null + }; + // Update set information about the server instance + self.set[serverName].type = ServerType.Unknown; + self.set[serverName].electionId = ismaster ? ismaster.electionId : ismaster; + self.set[serverName].setName = ismaster ? ismaster.setName : ismaster; + self.set[serverName].setVersion = ismaster ? ismaster.setVersion : ismaster; + + if (self.unknownServers.indexOf(server.name) === -1) { + self.unknownServers.push(serverName); + } + + // Set the topology + return false; + } + + // Update logicalSessionTimeoutMinutes + if (ismaster.logicalSessionTimeoutMinutes !== undefined && !isArbiter(ismaster)) { + if ( + self.logicalSessionTimeoutMinutes === undefined || + ismaster.logicalSessionTimeoutMinutes === null + ) { + self.logicalSessionTimeoutMinutes = ismaster.logicalSessionTimeoutMinutes; + } else { + self.logicalSessionTimeoutMinutes = Math.min( + self.logicalSessionTimeoutMinutes, + ismaster.logicalSessionTimeoutMinutes + ); + } + } + + // + // Is this a mongos + // + if (ismaster && ismaster.msg === 'isdbgrid') { + if (this.primary && this.primary.name === serverName) { + this.primary = null; + this.topologyType = TopologyType.ReplicaSetNoPrimary; + } + + return false; + } + + // A RSGhost instance + if (ismaster.isreplicaset) { + self.set[serverName] = { + type: ServerType.RSGhost, + setVersion: null, + electionId: null, + setName: ismaster.setName + }; + + if (this.primary && this.primary.name === serverName) { + this.primary = null; + } + + // Set the topology + this.topologyType = this.primary + ? TopologyType.ReplicaSetWithPrimary + : TopologyType.ReplicaSetNoPrimary; + if (ismaster.setName) this.setName = ismaster.setName; + + // Set the topology + return false; + } + + // A RSOther instance + if ( + (ismaster.setName && ismaster.hidden) || + (ismaster.setName && + !ismaster.ismaster && + !ismaster.secondary && + !ismaster.arbiterOnly && + !ismaster.passive) + ) { + self.set[serverName] = { + type: ServerType.RSOther, + setVersion: null, + electionId: null, + setName: ismaster.setName + }; + + // Set the topology + this.topologyType = this.primary + ? TopologyType.ReplicaSetWithPrimary + : TopologyType.ReplicaSetNoPrimary; + if (ismaster.setName) this.setName = ismaster.setName; + return false; + } + + // + // Standalone server, destroy and return + // + if (ismaster && ismaster.ismaster && !ismaster.setName) { + this.topologyType = this.primary ? TopologyType.ReplicaSetWithPrimary : TopologyType.Unknown; + this.remove(server, { force: true }); + return false; + } + + // + // Server in maintanance mode + // + if (ismaster && !ismaster.ismaster && !ismaster.secondary && !ismaster.arbiterOnly) { + this.remove(server, { force: true }); + return false; + } + + // + // If the .me field does not match the passed in server + // + if (ismaster.me && ismaster.me.toLowerCase() !== serverName) { + if (this.logger.isWarn()) { + this.logger.warn( + f( + 'the seedlist server was removed due to its address %s not matching its ismaster.me address %s', + server.name, + ismaster.me + ) + ); + } + + // Delete from the set + delete this.set[serverName]; + // Delete unknown servers + removeFrom(server, self.unknownServers); + + // Destroy the instance + server.destroy({ force: true }); + + // Set the type of topology we have + if (this.primary && !this.primary.equals(server)) { + this.topologyType = TopologyType.ReplicaSetWithPrimary; + } else { + this.topologyType = TopologyType.ReplicaSetNoPrimary; + } + + // + // We have a potential primary + // + if (!this.primary && ismaster.primary) { + this.set[ismaster.primary.toLowerCase()] = { + type: ServerType.PossiblePrimary, + setName: null, + electionId: null, + setVersion: null + }; + } + + return false; + } + + // + // Primary handling + // + if (!this.primary && ismaster.ismaster && ismaster.setName) { + var ismasterElectionId = server.lastIsMaster().electionId; + if (this.setName && this.setName !== ismaster.setName) { + this.topologyType = TopologyType.ReplicaSetNoPrimary; + return new MongoError( + f( + 'setName from ismaster does not match provided connection setName [%s] != [%s]', + ismaster.setName, + this.setName + ) + ); + } + + if (!this.maxElectionId && ismasterElectionId) { + this.maxElectionId = ismasterElectionId; + } else if (this.maxElectionId && ismasterElectionId) { + var result = compareObjectIds(this.maxElectionId, ismasterElectionId); + // Get the electionIds + var ismasterSetVersion = server.lastIsMaster().setVersion; + + if (result === 1) { + this.topologyType = TopologyType.ReplicaSetNoPrimary; + return false; + } else if (result === 0 && ismasterSetVersion) { + if (ismasterSetVersion < this.maxSetVersion) { + this.topologyType = TopologyType.ReplicaSetNoPrimary; + return false; + } + } + + this.maxSetVersion = ismasterSetVersion; + this.maxElectionId = ismasterElectionId; + } + + // Hande normalization of server names + var normalizedHosts = ismaster.hosts.map(function(x) { + return x.toLowerCase(); + }); + var locationIndex = normalizedHosts.indexOf(serverName); + + // Validate that the server exists in the host list + if (locationIndex !== -1) { + self.primary = server; + self.set[serverName] = { + type: ServerType.RSPrimary, + setVersion: ismaster.setVersion, + electionId: ismaster.electionId, + setName: ismaster.setName + }; + + // Set the topology + this.topologyType = TopologyType.ReplicaSetWithPrimary; + if (ismaster.setName) this.setName = ismaster.setName; + removeFrom(server, self.unknownServers); + removeFrom(server, self.secondaries); + removeFrom(server, self.passives); + self.emit('joined', 'primary', server); + } else { + this.topologyType = TopologyType.ReplicaSetNoPrimary; + } + + emitTopologyDescriptionChanged(self); + return true; + } else if (ismaster.ismaster && ismaster.setName) { + // Get the electionIds + var currentElectionId = self.set[self.primary.name.toLowerCase()].electionId; + var currentSetVersion = self.set[self.primary.name.toLowerCase()].setVersion; + var currentSetName = self.set[self.primary.name.toLowerCase()].setName; + ismasterElectionId = server.lastIsMaster().electionId; + ismasterSetVersion = server.lastIsMaster().setVersion; + var ismasterSetName = server.lastIsMaster().setName; + + // Is it the same server instance + if (this.primary.equals(server) && currentSetName === ismasterSetName) { + return false; + } + + // If we do not have the same rs name + if (currentSetName && currentSetName !== ismasterSetName) { + if (!this.primary.equals(server)) { + this.topologyType = TopologyType.ReplicaSetWithPrimary; + } else { + this.topologyType = TopologyType.ReplicaSetNoPrimary; + } + + return false; + } + + // Check if we need to replace the server + if (currentElectionId && ismasterElectionId) { + result = compareObjectIds(currentElectionId, ismasterElectionId); + + if (result === 1) { + return false; + } else if (result === 0 && currentSetVersion > ismasterSetVersion) { + return false; + } + } else if (!currentElectionId && ismasterElectionId && ismasterSetVersion) { + if (ismasterSetVersion < this.maxSetVersion) { + return false; + } + } + + if (!this.maxElectionId && ismasterElectionId) { + this.maxElectionId = ismasterElectionId; + } else if (this.maxElectionId && ismasterElectionId) { + result = compareObjectIds(this.maxElectionId, ismasterElectionId); + + if (result === 1) { + return false; + } else if (result === 0 && currentSetVersion && ismasterSetVersion) { + if (ismasterSetVersion < this.maxSetVersion) { + return false; + } + } else { + if (ismasterSetVersion < this.maxSetVersion) { + return false; + } + } + + this.maxElectionId = ismasterElectionId; + this.maxSetVersion = ismasterSetVersion; + } else { + this.maxSetVersion = ismasterSetVersion; + } + + // Modify the entry to unknown + self.set[self.primary.name.toLowerCase()] = { + type: ServerType.Unknown, + setVersion: null, + electionId: null, + setName: null + }; + + // Signal primary left + self.emit('left', 'primary', this.primary); + // Destroy the instance + self.primary.destroy({ force: true }); + // Set the new instance + self.primary = server; + // Set the set information + self.set[serverName] = { + type: ServerType.RSPrimary, + setVersion: ismaster.setVersion, + electionId: ismaster.electionId, + setName: ismaster.setName + }; + + // Set the topology + this.topologyType = TopologyType.ReplicaSetWithPrimary; + if (ismaster.setName) this.setName = ismaster.setName; + removeFrom(server, self.unknownServers); + removeFrom(server, self.secondaries); + removeFrom(server, self.passives); + self.emit('joined', 'primary', server); + emitTopologyDescriptionChanged(self); + return true; + } + + // A possible instance + if (!this.primary && ismaster.primary) { + self.set[ismaster.primary.toLowerCase()] = { + type: ServerType.PossiblePrimary, + setVersion: null, + electionId: null, + setName: null + }; + } + + // + // Secondary handling + // + if ( + ismaster.secondary && + ismaster.setName && + !inList(ismaster, server, this.secondaries) && + this.setName && + this.setName === ismaster.setName + ) { + addToList(self, ServerType.RSSecondary, ismaster, server, this.secondaries); + // Set the topology + this.topologyType = this.primary + ? TopologyType.ReplicaSetWithPrimary + : TopologyType.ReplicaSetNoPrimary; + if (ismaster.setName) this.setName = ismaster.setName; + removeFrom(server, self.unknownServers); + + // Remove primary + if (this.primary && this.primary.name.toLowerCase() === serverName) { + server.destroy({ force: true }); + this.primary = null; + self.emit('left', 'primary', server); + } + + // Emit secondary joined replicaset + self.emit('joined', 'secondary', server); + emitTopologyDescriptionChanged(self); + return true; + } + + // + // Arbiter handling + // + if ( + isArbiter(ismaster) && + !inList(ismaster, server, this.arbiters) && + this.setName && + this.setName === ismaster.setName + ) { + addToList(self, ServerType.RSArbiter, ismaster, server, this.arbiters); + // Set the topology + this.topologyType = this.primary + ? TopologyType.ReplicaSetWithPrimary + : TopologyType.ReplicaSetNoPrimary; + if (ismaster.setName) this.setName = ismaster.setName; + removeFrom(server, self.unknownServers); + self.emit('joined', 'arbiter', server); + emitTopologyDescriptionChanged(self); + return true; + } + + // + // Passive handling + // + if ( + ismaster.passive && + ismaster.setName && + !inList(ismaster, server, this.passives) && + this.setName && + this.setName === ismaster.setName + ) { + addToList(self, ServerType.RSSecondary, ismaster, server, this.passives); + // Set the topology + this.topologyType = this.primary + ? TopologyType.ReplicaSetWithPrimary + : TopologyType.ReplicaSetNoPrimary; + if (ismaster.setName) this.setName = ismaster.setName; + removeFrom(server, self.unknownServers); + + // Remove primary + if (this.primary && this.primary.name.toLowerCase() === serverName) { + server.destroy({ force: true }); + this.primary = null; + self.emit('left', 'primary', server); + } + + self.emit('joined', 'secondary', server); + emitTopologyDescriptionChanged(self); + return true; + } + + // + // Remove the primary + // + if (this.set[serverName] && this.set[serverName].type === ServerType.RSPrimary) { + self.emit('left', 'primary', this.primary); + this.primary.destroy({ force: true }); + this.primary = null; + this.topologyType = TopologyType.ReplicaSetNoPrimary; + return false; + } + + this.topologyType = this.primary + ? TopologyType.ReplicaSetWithPrimary + : TopologyType.ReplicaSetNoPrimary; + return false; +}; + +/** + * Recalculate single server max staleness + * @method + */ +ReplSetState.prototype.updateServerMaxStaleness = function(server, haInterval) { + // Locate the max secondary lastwrite + var max = 0; + // Go over all secondaries + for (var i = 0; i < this.secondaries.length; i++) { + max = Math.max(max, this.secondaries[i].lastWriteDate); + } + + // Perform this servers staleness calculation + if (server.ismaster.maxWireVersion >= 5 && server.ismaster.secondary && this.hasPrimary()) { + server.staleness = + server.lastUpdateTime - + server.lastWriteDate - + (this.primary.lastUpdateTime - this.primary.lastWriteDate) + + haInterval; + } else if (server.ismaster.maxWireVersion >= 5 && server.ismaster.secondary) { + server.staleness = max - server.lastWriteDate + haInterval; + } +}; + +/** + * Recalculate all the staleness values for secodaries + * @method + */ +ReplSetState.prototype.updateSecondariesMaxStaleness = function(haInterval) { + for (var i = 0; i < this.secondaries.length; i++) { + this.updateServerMaxStaleness(this.secondaries[i], haInterval); + } +}; + +/** + * Pick a server by the passed in ReadPreference + * @method + * @param {ReadPreference} readPreference The ReadPreference instance to use + */ +ReplSetState.prototype.pickServer = function(readPreference) { + // If no read Preference set to primary by default + readPreference = readPreference || ReadPreference.primary; + + // maxStalenessSeconds is not allowed with a primary read + if (readPreference.preference === 'primary' && readPreference.maxStalenessSeconds != null) { + return new MongoError('primary readPreference incompatible with maxStalenessSeconds'); + } + + // Check if we have any non compatible servers for maxStalenessSeconds + var allservers = this.primary ? [this.primary] : []; + allservers = allservers.concat(this.secondaries); + + // Does any of the servers not support the right wire protocol version + // for maxStalenessSeconds when maxStalenessSeconds specified on readPreference. Then error out + if (readPreference.maxStalenessSeconds != null) { + for (var i = 0; i < allservers.length; i++) { + if (allservers[i].ismaster.maxWireVersion < 5) { + return new MongoError( + 'maxStalenessSeconds not supported by at least one of the replicaset members' + ); + } + } + } + + // Do we have the nearest readPreference + if (readPreference.preference === 'nearest' && readPreference.maxStalenessSeconds == null) { + return pickNearest(this, readPreference); + } else if ( + readPreference.preference === 'nearest' && + readPreference.maxStalenessSeconds != null + ) { + return pickNearestMaxStalenessSeconds(this, readPreference); + } + + // Get all the secondaries + var secondaries = this.secondaries; + + // Check if we can satisfy and of the basic read Preferences + if (readPreference.equals(ReadPreference.secondary) && secondaries.length === 0) { + return new MongoError('no secondary server available'); + } + + if ( + readPreference.equals(ReadPreference.secondaryPreferred) && + secondaries.length === 0 && + this.primary == null + ) { + return new MongoError('no secondary or primary server available'); + } + + if (readPreference.equals(ReadPreference.primary) && this.primary == null) { + return new MongoError('no primary server available'); + } + + // Secondary preferred or just secondaries + if ( + readPreference.equals(ReadPreference.secondaryPreferred) || + readPreference.equals(ReadPreference.secondary) + ) { + if (secondaries.length > 0 && readPreference.maxStalenessSeconds == null) { + // Pick nearest of any other servers available + var server = pickNearest(this, readPreference); + // No server in the window return primary + if (server) { + return server; + } + } else if (secondaries.length > 0 && readPreference.maxStalenessSeconds != null) { + // Pick nearest of any other servers available + server = pickNearestMaxStalenessSeconds(this, readPreference); + // No server in the window return primary + if (server) { + return server; + } + } + + if (readPreference.equals(ReadPreference.secondaryPreferred)) { + return this.primary; + } + + return null; + } + + // Primary preferred + if (readPreference.equals(ReadPreference.primaryPreferred)) { + server = null; + + // We prefer the primary if it's available + if (this.primary) { + return this.primary; + } + + // Pick a secondary + if (secondaries.length > 0 && readPreference.maxStalenessSeconds == null) { + server = pickNearest(this, readPreference); + } else if (secondaries.length > 0 && readPreference.maxStalenessSeconds != null) { + server = pickNearestMaxStalenessSeconds(this, readPreference); + } + + // Did we find a server + if (server) return server; + } + + // Return the primary + return this.primary; +}; + +// +// Filter serves by tags +var filterByTags = function(readPreference, servers) { + if (readPreference.tags == null) return servers; + var filteredServers = []; + var tagsArray = Array.isArray(readPreference.tags) ? readPreference.tags : [readPreference.tags]; + + // Iterate over the tags + for (var j = 0; j < tagsArray.length; j++) { + var tags = tagsArray[j]; + + // Iterate over all the servers + for (var i = 0; i < servers.length; i++) { + var serverTag = servers[i].lastIsMaster().tags || {}; + + // Did we find the a matching server + var found = true; + // Check if the server is valid + for (var name in tags) { + if (serverTag[name] !== tags[name]) { + found = false; + } + } + + // Add to candidate list + if (found) { + filteredServers.push(servers[i]); + } + } + } + + // Returned filtered servers + return filteredServers; +}; + +function pickNearestMaxStalenessSeconds(self, readPreference) { + // Only get primary and secondaries as seeds + var servers = []; + + // Get the maxStalenessMS + var maxStalenessMS = readPreference.maxStalenessSeconds * 1000; + + // Check if the maxStalenessMS > 90 seconds + if (maxStalenessMS < 90 * 1000) { + return new MongoError('maxStalenessSeconds must be set to at least 90 seconds'); + } + + // Add primary to list if not a secondary read preference + if ( + self.primary && + readPreference.preference !== 'secondary' && + readPreference.preference !== 'secondaryPreferred' + ) { + servers.push(self.primary); + } + + // Add all the secondaries + for (var i = 0; i < self.secondaries.length; i++) { + servers.push(self.secondaries[i]); + } + + // If we have a secondaryPreferred readPreference and no server add the primary + if (self.primary && servers.length === 0 && readPreference.preference !== 'secondaryPreferred') { + servers.push(self.primary); + } + + // Filter by tags + servers = filterByTags(readPreference, servers); + + // Filter by latency + servers = servers.filter(function(s) { + return s.staleness <= maxStalenessMS; + }); + + // Sort by time + servers.sort(function(a, b) { + return a.lastIsMasterMS - b.lastIsMasterMS; + }); + + // No servers, default to primary + if (servers.length === 0) { + return null; + } + + // Ensure index does not overflow the number of available servers + self.index = self.index % servers.length; + + // Get the server + var server = servers[self.index]; + // Add to the index + self.index = self.index + 1; + // Return the first server of the sorted and filtered list + return server; +} + +function pickNearest(self, readPreference) { + // Only get primary and secondaries as seeds + var servers = []; + + // Add primary to list if not a secondary read preference + if ( + self.primary && + readPreference.preference !== 'secondary' && + readPreference.preference !== 'secondaryPreferred' + ) { + servers.push(self.primary); + } + + // Add all the secondaries + for (var i = 0; i < self.secondaries.length; i++) { + servers.push(self.secondaries[i]); + } + + // If we have a secondaryPreferred readPreference and no server add the primary + if (servers.length === 0 && self.primary && readPreference.preference !== 'secondaryPreferred') { + servers.push(self.primary); + } + + // Filter by tags + servers = filterByTags(readPreference, servers); + + // Sort by time + servers.sort(function(a, b) { + return a.lastIsMasterMS - b.lastIsMasterMS; + }); + + // Locate lowest time (picked servers are lowest time + acceptable Latency margin) + var lowest = servers.length > 0 ? servers[0].lastIsMasterMS : 0; + + // Filter by latency + servers = servers.filter(function(s) { + return s.lastIsMasterMS <= lowest + self.acceptableLatency; + }); + + // No servers, default to primary + if (servers.length === 0) { + return null; + } + + // Ensure index does not overflow the number of available servers + self.index = self.index % servers.length; + // Get the server + var server = servers[self.index]; + // Add to the index + self.index = self.index + 1; + // Return the first server of the sorted and filtered list + return server; +} + +function inList(ismaster, server, list) { + for (var i = 0; i < list.length; i++) { + if (list[i] && list[i].name && list[i].name.toLowerCase() === server.name.toLowerCase()) + return true; + } + + return false; +} + +function addToList(self, type, ismaster, server, list) { + var serverName = server.name.toLowerCase(); + // Update set information about the server instance + self.set[serverName].type = type; + self.set[serverName].electionId = ismaster ? ismaster.electionId : ismaster; + self.set[serverName].setName = ismaster ? ismaster.setName : ismaster; + self.set[serverName].setVersion = ismaster ? ismaster.setVersion : ismaster; + // Add to the list + list.push(server); +} + +function compareObjectIds(id1, id2) { + var a = Buffer.from(id1.toHexString(), 'hex'); + var b = Buffer.from(id2.toHexString(), 'hex'); + + if (a === b) { + return 0; + } + + if (typeof Buffer.compare === 'function') { + return Buffer.compare(a, b); + } + + var x = a.length; + var y = b.length; + var len = Math.min(x, y); + + for (var i = 0; i < len; i++) { + if (a[i] !== b[i]) { + break; + } + } + + if (i !== len) { + x = a[i]; + y = b[i]; + } + + return x < y ? -1 : y < x ? 1 : 0; +} + +function removeFrom(server, list) { + for (var i = 0; i < list.length; i++) { + if (list[i].equals && list[i].equals(server)) { + list.splice(i, 1); + return true; + } else if (typeof list[i] === 'string' && list[i].toLowerCase() === server.name.toLowerCase()) { + list.splice(i, 1); + return true; + } + } + + return false; +} + +function emitTopologyDescriptionChanged(self) { + if (self.listeners('topologyDescriptionChanged').length > 0) { + var topology = 'Unknown'; + var setName = self.setName; + + if (self.hasPrimaryAndSecondary()) { + topology = 'ReplicaSetWithPrimary'; + } else if (!self.hasPrimary() && self.hasSecondary()) { + topology = 'ReplicaSetNoPrimary'; + } + + // Generate description + var description = { + topologyType: topology, + setName: setName, + servers: [] + }; + + // Add the primary to the list + if (self.hasPrimary()) { + var desc = self.primary.getDescription(); + desc.type = 'RSPrimary'; + description.servers.push(desc); + } + + // Add all the secondaries + description.servers = description.servers.concat( + self.secondaries.map(function(x) { + var description = x.getDescription(); + description.type = 'RSSecondary'; + return description; + }) + ); + + // Add all the arbiters + description.servers = description.servers.concat( + self.arbiters.map(function(x) { + var description = x.getDescription(); + description.type = 'RSArbiter'; + return description; + }) + ); + + // Add all the passives + description.servers = description.servers.concat( + self.passives.map(function(x) { + var description = x.getDescription(); + description.type = 'RSSecondary'; + return description; + }) + ); + + // Get the diff + var diffResult = diff(self.replicasetDescription, description); + + // Create the result + var result = { + topologyId: self.id, + previousDescription: self.replicasetDescription, + newDescription: description, + diff: diffResult + }; + + // Emit the topologyDescription change + // if(diffResult.servers.length > 0) { + self.emit('topologyDescriptionChanged', result); + // } + + // Set the new description + self.replicasetDescription = description; + } +} + +module.exports = ReplSetState; diff --git a/node_modules/mongodb/lib/core/topologies/server.js b/node_modules/mongodb/lib/core/topologies/server.js new file mode 100644 index 00000000..c6a0bfa5 --- /dev/null +++ b/node_modules/mongodb/lib/core/topologies/server.js @@ -0,0 +1,991 @@ +'use strict'; + +var inherits = require('util').inherits, + f = require('util').format, + EventEmitter = require('events').EventEmitter, + ReadPreference = require('./read_preference'), + Logger = require('../connection/logger'), + debugOptions = require('../connection/utils').debugOptions, + retrieveBSON = require('../connection/utils').retrieveBSON, + Pool = require('../connection/pool'), + MongoError = require('../error').MongoError, + MongoNetworkError = require('../error').MongoNetworkError, + wireProtocol = require('../wireprotocol'), + CoreCursor = require('../cursor').CoreCursor, + sdam = require('./shared'), + createCompressionInfo = require('./shared').createCompressionInfo, + resolveClusterTime = require('./shared').resolveClusterTime, + SessionMixins = require('./shared').SessionMixins, + relayEvents = require('../utils').relayEvents; + +const collationNotSupported = require('../utils').collationNotSupported; +const makeClientMetadata = require('../utils').makeClientMetadata; + +// Used for filtering out fields for loggin +var debugFields = [ + 'reconnect', + 'reconnectTries', + 'reconnectInterval', + 'emitError', + 'cursorFactory', + 'host', + 'port', + 'size', + 'keepAlive', + 'keepAliveInitialDelay', + 'noDelay', + 'connectionTimeout', + 'checkServerIdentity', + 'socketTimeout', + 'ssl', + 'ca', + 'crl', + 'cert', + 'key', + 'rejectUnauthorized', + 'promoteLongs', + 'promoteValues', + 'promoteBuffers', + 'servername' +]; + +// Server instance id +var id = 0; +var serverAccounting = false; +var servers = {}; +var BSON = retrieveBSON(); + +function topologyId(server) { + return server.s.parent == null ? server.id : server.s.parent.id; +} + +/** + * Creates a new Server instance + * @class + * @param {boolean} [options.reconnect=true] Server will attempt to reconnect on loss of connection + * @param {number} [options.reconnectTries=30] Server attempt to reconnect #times + * @param {number} [options.reconnectInterval=1000] Server will wait # milliseconds between retries + * @param {number} [options.monitoring=true] Enable the server state monitoring (calling ismaster at monitoringInterval) + * @param {number} [options.monitoringInterval=5000] The interval of calling ismaster when monitoring is enabled. + * @param {Cursor} [options.cursorFactory=Cursor] The cursor factory class used for all query cursors + * @param {string} options.host The server host + * @param {number} options.port The server port + * @param {number} [options.size=5] Server connection pool size + * @param {boolean} [options.keepAlive=true] TCP Connection keep alive enabled + * @param {number} [options.keepAliveInitialDelay=120000] Initial delay before TCP keep alive enabled + * @param {boolean} [options.noDelay=true] TCP Connection no delay + * @param {number} [options.connectionTimeout=30000] TCP Connection timeout setting + * @param {number} [options.socketTimeout=0] TCP Socket timeout setting + * @param {boolean} [options.ssl=false] Use SSL for connection + * @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function. + * @param {Buffer} [options.ca] SSL Certificate store binary buffer + * @param {Buffer} [options.crl] SSL Certificate revocation store binary buffer + * @param {Buffer} [options.cert] SSL Certificate binary buffer + * @param {Buffer} [options.key] SSL Key file binary buffer + * @param {string} [options.passphrase] SSL Certificate pass phrase + * @param {boolean} [options.rejectUnauthorized=true] Reject unauthorized server certificates + * @param {string} [options.servername=null] String containing the server name requested via TLS SNI. + * @param {boolean} [options.promoteLongs=true] Convert Long values from the db into Numbers if they fit into 53 bits + * @param {boolean} [options.promoteValues=true] Promotes BSON values to native types where possible, set to false to only receive wrapper types. + * @param {boolean} [options.promoteBuffers=false] Promotes Binary BSON values to native Node Buffers. + * @param {string} [options.appname=null] Application name, passed in on ismaster call and logged in mongod server logs. Maximum size 128 bytes. + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. + * @param {boolean} [options.monitorCommands=false] Enable command monitoring for this topology + * @return {Server} A cursor instance + * @fires Server#connect + * @fires Server#close + * @fires Server#error + * @fires Server#timeout + * @fires Server#parseError + * @fires Server#reconnect + * @fires Server#reconnectFailed + * @fires Server#serverHeartbeatStarted + * @fires Server#serverHeartbeatSucceeded + * @fires Server#serverHeartbeatFailed + * @fires Server#topologyOpening + * @fires Server#topologyClosed + * @fires Server#topologyDescriptionChanged + * @property {string} type the topology type. + * @property {string} parserType the parser type used (c++ or js). + */ +var Server = function(options) { + options = options || {}; + + // Add event listener + EventEmitter.call(this); + + // Server instance id + this.id = id++; + + // Internal state + this.s = { + // Options + options: Object.assign({ metadata: makeClientMetadata(options) }, options), + // Logger + logger: Logger('Server', options), + // Factory overrides + Cursor: options.cursorFactory || CoreCursor, + // BSON instance + bson: + options.bson || + new BSON([ + BSON.Binary, + BSON.Code, + BSON.DBRef, + BSON.Decimal128, + BSON.Double, + BSON.Int32, + BSON.Long, + BSON.Map, + BSON.MaxKey, + BSON.MinKey, + BSON.ObjectId, + BSON.BSONRegExp, + BSON.Symbol, + BSON.Timestamp + ]), + // Pool + pool: null, + // Disconnect handler + disconnectHandler: options.disconnectHandler, + // Monitor thread (keeps the connection alive) + monitoring: typeof options.monitoring === 'boolean' ? options.monitoring : true, + // Is the server in a topology + inTopology: !!options.parent, + // Monitoring timeout + monitoringInterval: + typeof options.monitoringInterval === 'number' ? options.monitoringInterval : 5000, + compression: { compressors: createCompressionInfo(options) }, + // Optional parent topology + parent: options.parent + }; + + // If this is a single deployment we need to track the clusterTime here + if (!this.s.parent) { + this.s.clusterTime = null; + } + + // Curent ismaster + this.ismaster = null; + // Current ping time + this.lastIsMasterMS = -1; + // The monitoringProcessId + this.monitoringProcessId = null; + // Initial connection + this.initialConnect = true; + // Default type + this._type = 'server'; + + // Max Stalleness values + // last time we updated the ismaster state + this.lastUpdateTime = 0; + // Last write time + this.lastWriteDate = 0; + // Stalleness + this.staleness = 0; +}; + +inherits(Server, EventEmitter); +Object.assign(Server.prototype, SessionMixins); + +Object.defineProperty(Server.prototype, 'type', { + enumerable: true, + get: function() { + return this._type; + } +}); + +Object.defineProperty(Server.prototype, 'parserType', { + enumerable: true, + get: function() { + return BSON.native ? 'c++' : 'js'; + } +}); + +Object.defineProperty(Server.prototype, 'logicalSessionTimeoutMinutes', { + enumerable: true, + get: function() { + if (!this.ismaster) return null; + return this.ismaster.logicalSessionTimeoutMinutes || null; + } +}); + +Object.defineProperty(Server.prototype, 'clientMetadata', { + enumerable: true, + get: function() { + return this.s.options.metadata; + } +}); + +// In single server deployments we track the clusterTime directly on the topology, however +// in Mongos and ReplSet deployments we instead need to delegate the clusterTime up to the +// tracking objects so we can ensure we are gossiping the maximum time received from the +// server. +Object.defineProperty(Server.prototype, 'clusterTime', { + enumerable: true, + set: function(clusterTime) { + const settings = this.s.parent ? this.s.parent : this.s; + resolveClusterTime(settings, clusterTime); + }, + get: function() { + const settings = this.s.parent ? this.s.parent : this.s; + return settings.clusterTime || null; + } +}); + +Server.enableServerAccounting = function() { + serverAccounting = true; + servers = {}; +}; + +Server.disableServerAccounting = function() { + serverAccounting = false; +}; + +Server.servers = function() { + return servers; +}; + +Object.defineProperty(Server.prototype, 'name', { + enumerable: true, + get: function() { + return this.s.options.host + ':' + this.s.options.port; + } +}); + +function disconnectHandler(self, type, ns, cmd, options, callback) { + // Topology is not connected, save the call in the provided store to be + // Executed at some point when the handler deems it's reconnected + if ( + !self.s.pool.isConnected() && + self.s.options.reconnect && + self.s.disconnectHandler != null && + !options.monitoring + ) { + self.s.disconnectHandler.add(type, ns, cmd, options, callback); + return true; + } + + // If we have no connection error + if (!self.s.pool.isConnected()) { + callback(new MongoError(f('no connection available to server %s', self.name))); + return true; + } +} + +function monitoringProcess(self) { + return function() { + // Pool was destroyed do not continue process + if (self.s.pool.isDestroyed()) return; + // Emit monitoring Process event + self.emit('monitoring', self); + // Perform ismaster call + // Get start time + var start = new Date().getTime(); + + // Execute the ismaster query + self.command( + 'admin.$cmd', + { ismaster: true }, + { + socketTimeout: + typeof self.s.options.connectionTimeout !== 'number' + ? 2000 + : self.s.options.connectionTimeout, + monitoring: true + }, + (err, result) => { + // Set initial lastIsMasterMS + self.lastIsMasterMS = new Date().getTime() - start; + if (self.s.pool.isDestroyed()) return; + // Update the ismaster view if we have a result + if (result) { + self.ismaster = result.result; + } + // Re-schedule the monitoring process + self.monitoringProcessId = setTimeout(monitoringProcess(self), self.s.monitoringInterval); + } + ); + }; +} + +var eventHandler = function(self, event) { + return function(err, conn) { + // Log information of received information if in info mode + if (self.s.logger.isInfo()) { + var object = err instanceof MongoError ? JSON.stringify(err) : {}; + self.s.logger.info( + f('server %s fired event %s out with message %s', self.name, event, object) + ); + } + + // Handle connect event + if (event === 'connect') { + self.initialConnect = false; + self.ismaster = conn.ismaster; + self.lastIsMasterMS = conn.lastIsMasterMS; + if (conn.agreedCompressor) { + self.s.pool.options.agreedCompressor = conn.agreedCompressor; + } + + if (conn.zlibCompressionLevel) { + self.s.pool.options.zlibCompressionLevel = conn.zlibCompressionLevel; + } + + if (conn.ismaster.$clusterTime) { + const $clusterTime = conn.ismaster.$clusterTime; + self.clusterTime = $clusterTime; + } + + // It's a proxy change the type so + // the wireprotocol will send $readPreference + if (self.ismaster.msg === 'isdbgrid') { + self._type = 'mongos'; + } + + // Have we defined self monitoring + if (self.s.monitoring) { + self.monitoringProcessId = setTimeout(monitoringProcess(self), self.s.monitoringInterval); + } + + // Emit server description changed if something listening + sdam.emitServerDescriptionChanged(self, { + address: self.name, + arbiters: [], + hosts: [], + passives: [], + type: sdam.getTopologyType(self) + }); + + if (!self.s.inTopology) { + // Emit topology description changed if something listening + sdam.emitTopologyDescriptionChanged(self, { + topologyType: 'Single', + servers: [ + { + address: self.name, + arbiters: [], + hosts: [], + passives: [], + type: sdam.getTopologyType(self) + } + ] + }); + } + + // Log the ismaster if available + if (self.s.logger.isInfo()) { + self.s.logger.info( + f('server %s connected with ismaster [%s]', self.name, JSON.stringify(self.ismaster)) + ); + } + + // Emit connect + self.emit('connect', self); + } else if ( + event === 'error' || + event === 'parseError' || + event === 'close' || + event === 'timeout' || + event === 'reconnect' || + event === 'attemptReconnect' || + event === 'reconnectFailed' + ) { + // Remove server instance from accounting + if ( + serverAccounting && + ['close', 'timeout', 'error', 'parseError', 'reconnectFailed'].indexOf(event) !== -1 + ) { + // Emit toplogy opening event if not in topology + if (!self.s.inTopology) { + self.emit('topologyOpening', { topologyId: self.id }); + } + + delete servers[self.id]; + } + + if (event === 'close') { + // Closing emits a server description changed event going to unknown. + sdam.emitServerDescriptionChanged(self, { + address: self.name, + arbiters: [], + hosts: [], + passives: [], + type: 'Unknown' + }); + } + + // Reconnect failed return error + if (event === 'reconnectFailed') { + self.emit('reconnectFailed', err); + // Emit error if any listeners + if (self.listeners('error').length > 0) { + self.emit('error', err); + } + // Terminate + return; + } + + // On first connect fail + if ( + ['disconnected', 'connecting'].indexOf(self.s.pool.state) !== -1 && + self.initialConnect && + ['close', 'timeout', 'error', 'parseError'].indexOf(event) !== -1 + ) { + self.initialConnect = false; + return self.emit( + 'error', + new MongoNetworkError( + f('failed to connect to server [%s] on first connect [%s]', self.name, err) + ) + ); + } + + // Reconnect event, emit the server + if (event === 'reconnect') { + // Reconnecting emits a server description changed event going from unknown to the + // current server type. + sdam.emitServerDescriptionChanged(self, { + address: self.name, + arbiters: [], + hosts: [], + passives: [], + type: sdam.getTopologyType(self) + }); + return self.emit(event, self); + } + + // Emit the event + self.emit(event, err); + } + }; +}; + +/** + * Initiate server connect + */ +Server.prototype.connect = function(options) { + var self = this; + options = options || {}; + + // Set the connections + if (serverAccounting) servers[this.id] = this; + + // Do not allow connect to be called on anything that's not disconnected + if (self.s.pool && !self.s.pool.isDisconnected() && !self.s.pool.isDestroyed()) { + throw new MongoError(f('server instance in invalid state %s', self.s.pool.state)); + } + + // Create a pool + self.s.pool = new Pool(this, Object.assign(self.s.options, options, { bson: this.s.bson })); + + // Set up listeners + self.s.pool.on('close', eventHandler(self, 'close')); + self.s.pool.on('error', eventHandler(self, 'error')); + self.s.pool.on('timeout', eventHandler(self, 'timeout')); + self.s.pool.on('parseError', eventHandler(self, 'parseError')); + self.s.pool.on('connect', eventHandler(self, 'connect')); + self.s.pool.on('reconnect', eventHandler(self, 'reconnect')); + self.s.pool.on('reconnectFailed', eventHandler(self, 'reconnectFailed')); + + // Set up listeners for command monitoring + relayEvents(self.s.pool, self, ['commandStarted', 'commandSucceeded', 'commandFailed']); + + // Emit toplogy opening event if not in topology + if (!self.s.inTopology) { + this.emit('topologyOpening', { topologyId: topologyId(self) }); + } + + // Emit opening server event + self.emit('serverOpening', { topologyId: topologyId(self), address: self.name }); + + self.s.pool.connect(); +}; + +/** + * Authenticate the topology. + * @method + * @param {MongoCredentials} credentials The credentials for authentication we are using + * @param {authResultCallback} callback A callback function + */ +Server.prototype.auth = function(credentials, callback) { + if (typeof callback === 'function') callback(null, null); +}; + +/** + * Get the server description + * @method + * @return {object} + */ +Server.prototype.getDescription = function() { + var ismaster = this.ismaster || {}; + var description = { + type: sdam.getTopologyType(this), + address: this.name + }; + + // Add fields if available + if (ismaster.hosts) description.hosts = ismaster.hosts; + if (ismaster.arbiters) description.arbiters = ismaster.arbiters; + if (ismaster.passives) description.passives = ismaster.passives; + if (ismaster.setName) description.setName = ismaster.setName; + return description; +}; + +/** + * Returns the last known ismaster document for this server + * @method + * @return {object} + */ +Server.prototype.lastIsMaster = function() { + return this.ismaster; +}; + +/** + * Unref all connections belong to this server + * @method + */ +Server.prototype.unref = function() { + this.s.pool.unref(); +}; + +/** + * Figure out if the server is connected + * @method + * @return {boolean} + */ +Server.prototype.isConnected = function() { + if (!this.s.pool) return false; + return this.s.pool.isConnected(); +}; + +/** + * Figure out if the server instance was destroyed by calling destroy + * @method + * @return {boolean} + */ +Server.prototype.isDestroyed = function() { + if (!this.s.pool) return false; + return this.s.pool.isDestroyed(); +}; + +function basicWriteValidations(self) { + if (!self.s.pool) return new MongoError('server instance is not connected'); + if (self.s.pool.isDestroyed()) return new MongoError('server instance pool was destroyed'); +} + +function basicReadValidations(self, options) { + basicWriteValidations(self, options); + + if (options.readPreference && !(options.readPreference instanceof ReadPreference)) { + throw new Error('readPreference must be an instance of ReadPreference'); + } +} + +/** + * Execute a command + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object} cmd The command hash + * @param {ReadPreference} [options.readPreference] Specify read preference if command supports it + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.checkKeys=false] Specify if the bson parser should validate keys. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {Boolean} [options.fullResult=false] Return the full envelope instead of just the result document. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {opResultCallback} callback A callback function + */ +Server.prototype.command = function(ns, cmd, options, callback) { + var self = this; + if (typeof options === 'function') { + (callback = options), (options = {}), (options = options || {}); + } + + var result = basicReadValidations(self, options); + if (result) return callback(result); + + // Clone the options + options = Object.assign({}, options, { wireProtocolCommand: false }); + + // Debug log + if (self.s.logger.isDebug()) + self.s.logger.debug( + f( + 'executing command [%s] against %s', + JSON.stringify({ + ns: ns, + cmd: cmd, + options: debugOptions(debugFields, options) + }), + self.name + ) + ); + + // If we are not connected or have a disconnectHandler specified + if (disconnectHandler(self, 'command', ns, cmd, options, callback)) return; + + // error if collation not supported + if (collationNotSupported(this, cmd)) { + return callback(new MongoError(`server ${this.name} does not support collation`)); + } + + wireProtocol.command(self, ns, cmd, options, callback); +}; + +/** + * Execute a query against the server + * + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object} cmd The command document for the query + * @param {object} options Optional settings + * @param {function} callback + */ +Server.prototype.query = function(ns, cmd, cursorState, options, callback) { + wireProtocol.query(this, ns, cmd, cursorState, options, callback); +}; + +/** + * Execute a `getMore` against the server + * + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object} cursorState State data associated with the cursor calling this method + * @param {object} options Optional settings + * @param {function} callback + */ +Server.prototype.getMore = function(ns, cursorState, batchSize, options, callback) { + wireProtocol.getMore(this, ns, cursorState, batchSize, options, callback); +}; + +/** + * Execute a `killCursors` command against the server + * + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object} cursorState State data associated with the cursor calling this method + * @param {function} callback + */ +Server.prototype.killCursors = function(ns, cursorState, callback) { + wireProtocol.killCursors(this, ns, cursorState, callback); +}; + +/** + * Insert one or more documents + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of documents to insert + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {opResultCallback} callback A callback function + */ +Server.prototype.insert = function(ns, ops, options, callback) { + var self = this; + if (typeof options === 'function') { + (callback = options), (options = {}), (options = options || {}); + } + + var result = basicWriteValidations(self, options); + if (result) return callback(result); + + // If we are not connected or have a disconnectHandler specified + if (disconnectHandler(self, 'insert', ns, ops, options, callback)) return; + + // Setup the docs as an array + ops = Array.isArray(ops) ? ops : [ops]; + + // Execute write + return wireProtocol.insert(self, ns, ops, options, callback); +}; + +/** + * Perform one or more update operations + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of updates + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {opResultCallback} callback A callback function + */ +Server.prototype.update = function(ns, ops, options, callback) { + var self = this; + if (typeof options === 'function') { + (callback = options), (options = {}), (options = options || {}); + } + + var result = basicWriteValidations(self, options); + if (result) return callback(result); + + // If we are not connected or have a disconnectHandler specified + if (disconnectHandler(self, 'update', ns, ops, options, callback)) return; + + // error if collation not supported + if (collationNotSupported(this, options)) { + return callback(new MongoError(`server ${this.name} does not support collation`)); + } + + // Setup the docs as an array + ops = Array.isArray(ops) ? ops : [ops]; + // Execute write + return wireProtocol.update(self, ns, ops, options, callback); +}; + +/** + * Perform one or more remove operations + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {array} ops An array of removes + * @param {boolean} [options.ordered=true] Execute in order or out of order + * @param {object} [options.writeConcern={}] Write concern for the operation + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {opResultCallback} callback A callback function + */ +Server.prototype.remove = function(ns, ops, options, callback) { + var self = this; + if (typeof options === 'function') { + (callback = options), (options = {}), (options = options || {}); + } + + var result = basicWriteValidations(self, options); + if (result) return callback(result); + + // If we are not connected or have a disconnectHandler specified + if (disconnectHandler(self, 'remove', ns, ops, options, callback)) return; + + // error if collation not supported + if (collationNotSupported(this, options)) { + return callback(new MongoError(`server ${this.name} does not support collation`)); + } + + // Setup the docs as an array + ops = Array.isArray(ops) ? ops : [ops]; + // Execute write + return wireProtocol.remove(self, ns, ops, options, callback); +}; + +/** + * Get a new cursor + * @method + * @param {string} ns The MongoDB fully qualified namespace (ex: db1.collection1) + * @param {object|Long} cmd Can be either a command returning a cursor or a cursorId + * @param {object} [options] Options for the cursor + * @param {object} [options.batchSize=0] Batchsize for the operation + * @param {array} [options.documents=[]] Initial documents list for cursor + * @param {ReadPreference} [options.readPreference] Specify read preference if command supports it + * @param {Boolean} [options.serializeFunctions=false] Specify if functions on an object should be serialized. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {ClientSession} [options.session=null] Session to use for the operation + * @param {object} [options.topology] The internal topology of the created cursor + * @returns {Cursor} + */ +Server.prototype.cursor = function(ns, cmd, options) { + options = options || {}; + const topology = options.topology || this; + + // Set up final cursor type + var FinalCursor = options.cursorFactory || this.s.Cursor; + + // Return the cursor + return new FinalCursor(topology, ns, cmd, options); +}; + +/** + * Compare two server instances + * @method + * @param {Server} server Server to compare equality against + * @return {boolean} + */ +Server.prototype.equals = function(server) { + if (typeof server === 'string') return this.name.toLowerCase() === server.toLowerCase(); + if (server.name) return this.name.toLowerCase() === server.name.toLowerCase(); + return false; +}; + +/** + * All raw connections + * @method + * @return {Connection[]} + */ +Server.prototype.connections = function() { + return this.s.pool.allConnections(); +}; + +/** + * Selects a server + * @method + * @param {function} selector Unused + * @param {ReadPreference} [options.readPreference] Unused + * @param {ClientSession} [options.session] Unused + * @return {Server} + */ +Server.prototype.selectServer = function(selector, options, callback) { + if (typeof selector === 'function' && typeof callback === 'undefined') + (callback = selector), (selector = undefined), (options = {}); + if (typeof options === 'function') + (callback = options), (options = selector), (selector = undefined); + + callback(null, this); +}; + +var listeners = ['close', 'error', 'timeout', 'parseError', 'connect']; + +/** + * Destroy the server connection + * @method + * @param {boolean} [options.emitClose=false] Emit close event on destroy + * @param {boolean} [options.emitDestroy=false] Emit destroy event on destroy + * @param {boolean} [options.force=false] Force destroy the pool + */ +Server.prototype.destroy = function(options, callback) { + if (this._destroyed) { + if (typeof callback === 'function') callback(null, null); + return; + } + + if (typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + var self = this; + + // Set the connections + if (serverAccounting) delete servers[this.id]; + + // Destroy the monitoring process if any + if (this.monitoringProcessId) { + clearTimeout(this.monitoringProcessId); + } + + // No pool, return + if (!self.s.pool || this._destroyed) { + this._destroyed = true; + if (typeof callback === 'function') callback(null, null); + return; + } + + this._destroyed = true; + + // Emit close event + if (options.emitClose) { + self.emit('close', self); + } + + // Emit destroy event + if (options.emitDestroy) { + self.emit('destroy', self); + } + + // Remove all listeners + listeners.forEach(function(event) { + self.s.pool.removeAllListeners(event); + }); + + // Emit opening server event + if (self.listeners('serverClosed').length > 0) + self.emit('serverClosed', { topologyId: topologyId(self), address: self.name }); + + // Emit toplogy opening event if not in topology + if (self.listeners('topologyClosed').length > 0 && !self.s.inTopology) { + self.emit('topologyClosed', { topologyId: topologyId(self) }); + } + + if (self.s.logger.isDebug()) { + self.s.logger.debug(f('destroy called on server %s', self.name)); + } + + // Destroy the pool + this.s.pool.destroy(options.force, callback); +}; + +/** + * A server connect event, used to verify that the connection is up and running + * + * @event Server#connect + * @type {Server} + */ + +/** + * A server reconnect event, used to verify that the server topology has reconnected + * + * @event Server#reconnect + * @type {Server} + */ + +/** + * A server opening SDAM monitoring event + * + * @event Server#serverOpening + * @type {object} + */ + +/** + * A server closed SDAM monitoring event + * + * @event Server#serverClosed + * @type {object} + */ + +/** + * A server description SDAM change monitoring event + * + * @event Server#serverDescriptionChanged + * @type {object} + */ + +/** + * A topology open SDAM event + * + * @event Server#topologyOpening + * @type {object} + */ + +/** + * A topology closed SDAM event + * + * @event Server#topologyClosed + * @type {object} + */ + +/** + * A topology structure SDAM change event + * + * @event Server#topologyDescriptionChanged + * @type {object} + */ + +/** + * Server reconnect failed + * + * @event Server#reconnectFailed + * @type {Error} + */ + +/** + * Server connection pool closed + * + * @event Server#close + * @type {object} + */ + +/** + * Server connection pool caused an error + * + * @event Server#error + * @type {Error} + */ + +/** + * Server destroyed was called + * + * @event Server#destroy + * @type {Server} + */ + +module.exports = Server; diff --git a/node_modules/mongodb/lib/core/topologies/shared.js b/node_modules/mongodb/lib/core/topologies/shared.js new file mode 100644 index 00000000..1ec55919 --- /dev/null +++ b/node_modules/mongodb/lib/core/topologies/shared.js @@ -0,0 +1,456 @@ +'use strict'; +const ReadPreference = require('./read_preference'); +const TopologyType = require('../sdam/common').TopologyType; +const MongoError = require('../error').MongoError; +const isRetryableWriteError = require('../error').isRetryableWriteError; +const maxWireVersion = require('../utils').maxWireVersion; +const MongoNetworkError = require('../error').MongoNetworkError; +const MMAPv1_RETRY_WRITES_ERROR_CODE = 20; + +/** + * Emit event if it exists + * @method + */ +function emitSDAMEvent(self, event, description) { + if (self.listeners(event).length > 0) { + self.emit(event, description); + } +} + +function createCompressionInfo(options) { + if (!options.compression || !options.compression.compressors) { + return []; + } + + // Check that all supplied compressors are valid + options.compression.compressors.forEach(function(compressor) { + if (compressor !== 'snappy' && compressor !== 'zlib') { + throw new Error('compressors must be at least one of snappy or zlib'); + } + }); + + return options.compression.compressors; +} + +function clone(object) { + return JSON.parse(JSON.stringify(object)); +} + +var getPreviousDescription = function(self) { + if (!self.s.serverDescription) { + self.s.serverDescription = { + address: self.name, + arbiters: [], + hosts: [], + passives: [], + type: 'Unknown' + }; + } + + return self.s.serverDescription; +}; + +var emitServerDescriptionChanged = function(self, description) { + if (self.listeners('serverDescriptionChanged').length > 0) { + // Emit the server description changed events + self.emit('serverDescriptionChanged', { + topologyId: self.s.topologyId !== -1 ? self.s.topologyId : self.id, + address: self.name, + previousDescription: getPreviousDescription(self), + newDescription: description + }); + + self.s.serverDescription = description; + } +}; + +var getPreviousTopologyDescription = function(self) { + if (!self.s.topologyDescription) { + self.s.topologyDescription = { + topologyType: 'Unknown', + servers: [ + { + address: self.name, + arbiters: [], + hosts: [], + passives: [], + type: 'Unknown' + } + ] + }; + } + + return self.s.topologyDescription; +}; + +var emitTopologyDescriptionChanged = function(self, description) { + if (self.listeners('topologyDescriptionChanged').length > 0) { + // Emit the server description changed events + self.emit('topologyDescriptionChanged', { + topologyId: self.s.topologyId !== -1 ? self.s.topologyId : self.id, + address: self.name, + previousDescription: getPreviousTopologyDescription(self), + newDescription: description + }); + + self.s.serverDescription = description; + } +}; + +var changedIsMaster = function(self, currentIsmaster, ismaster) { + var currentType = getTopologyType(self, currentIsmaster); + var newType = getTopologyType(self, ismaster); + if (newType !== currentType) return true; + return false; +}; + +var getTopologyType = function(self, ismaster) { + if (!ismaster) { + ismaster = self.ismaster; + } + + if (!ismaster) return 'Unknown'; + if (ismaster.ismaster && ismaster.msg === 'isdbgrid') return 'Mongos'; + if (ismaster.ismaster && !ismaster.hosts) return 'Standalone'; + if (ismaster.ismaster) return 'RSPrimary'; + if (ismaster.secondary) return 'RSSecondary'; + if (ismaster.arbiterOnly) return 'RSArbiter'; + return 'Unknown'; +}; + +var inquireServerState = function(self) { + return function(callback) { + if (self.s.state === 'destroyed') return; + // Record response time + var start = new Date().getTime(); + + // emitSDAMEvent + emitSDAMEvent(self, 'serverHeartbeatStarted', { connectionId: self.name }); + + // Attempt to execute ismaster command + self.command('admin.$cmd', { ismaster: true }, { monitoring: true }, function(err, r) { + if (!err) { + // Legacy event sender + self.emit('ismaster', r, self); + + // Calculate latencyMS + var latencyMS = new Date().getTime() - start; + + // Server heart beat event + emitSDAMEvent(self, 'serverHeartbeatSucceeded', { + durationMS: latencyMS, + reply: r.result, + connectionId: self.name + }); + + // Did the server change + if (changedIsMaster(self, self.s.ismaster, r.result)) { + // Emit server description changed if something listening + emitServerDescriptionChanged(self, { + address: self.name, + arbiters: [], + hosts: [], + passives: [], + type: !self.s.inTopology ? 'Standalone' : getTopologyType(self) + }); + } + + // Updat ismaster view + self.s.ismaster = r.result; + + // Set server response time + self.s.isMasterLatencyMS = latencyMS; + } else { + emitSDAMEvent(self, 'serverHeartbeatFailed', { + durationMS: latencyMS, + failure: err, + connectionId: self.name + }); + } + + // Peforming an ismaster monitoring callback operation + if (typeof callback === 'function') { + return callback(err, r); + } + + // Perform another sweep + self.s.inquireServerStateTimeout = setTimeout(inquireServerState(self), self.s.haInterval); + }); + }; +}; + +// +// Clone the options +var cloneOptions = function(options) { + var opts = {}; + for (var name in options) { + opts[name] = options[name]; + } + return opts; +}; + +function Interval(fn, time) { + var timer = false; + + this.start = function() { + if (!this.isRunning()) { + timer = setInterval(fn, time); + } + + return this; + }; + + this.stop = function() { + clearInterval(timer); + timer = false; + return this; + }; + + this.isRunning = function() { + return timer !== false; + }; +} + +function Timeout(fn, time) { + var timer = false; + var func = () => { + if (timer) { + clearTimeout(timer); + timer = false; + + fn(); + } + }; + + this.start = function() { + if (!this.isRunning()) { + timer = setTimeout(func, time); + } + return this; + }; + + this.stop = function() { + clearTimeout(timer); + timer = false; + return this; + }; + + this.isRunning = function() { + return timer !== false; + }; +} + +function diff(previous, current) { + // Difference document + var diff = { + servers: [] + }; + + // Previous entry + if (!previous) { + previous = { servers: [] }; + } + + // Check if we have any previous servers missing in the current ones + for (var i = 0; i < previous.servers.length; i++) { + var found = false; + + for (var j = 0; j < current.servers.length; j++) { + if (current.servers[j].address.toLowerCase() === previous.servers[i].address.toLowerCase()) { + found = true; + break; + } + } + + if (!found) { + // Add to the diff + diff.servers.push({ + address: previous.servers[i].address, + from: previous.servers[i].type, + to: 'Unknown' + }); + } + } + + // Check if there are any severs that don't exist + for (j = 0; j < current.servers.length; j++) { + found = false; + + // Go over all the previous servers + for (i = 0; i < previous.servers.length; i++) { + if (previous.servers[i].address.toLowerCase() === current.servers[j].address.toLowerCase()) { + found = true; + break; + } + } + + // Add the server to the diff + if (!found) { + diff.servers.push({ + address: current.servers[j].address, + from: 'Unknown', + to: current.servers[j].type + }); + } + } + + // Got through all the servers + for (i = 0; i < previous.servers.length; i++) { + var prevServer = previous.servers[i]; + + // Go through all current servers + for (j = 0; j < current.servers.length; j++) { + var currServer = current.servers[j]; + + // Matching server + if (prevServer.address.toLowerCase() === currServer.address.toLowerCase()) { + // We had a change in state + if (prevServer.type !== currServer.type) { + diff.servers.push({ + address: prevServer.address, + from: prevServer.type, + to: currServer.type + }); + } + } + } + } + + // Return difference + return diff; +} + +/** + * Shared function to determine clusterTime for a given topology + * + * @param {*} topology + * @param {*} clusterTime + */ +function resolveClusterTime(topology, $clusterTime) { + if (topology.clusterTime == null) { + topology.clusterTime = $clusterTime; + } else { + if ($clusterTime.clusterTime.greaterThan(topology.clusterTime.clusterTime)) { + topology.clusterTime = $clusterTime; + } + } +} + +// NOTE: this is a temporary move until the topologies can be more formally refactored +// to share code. +const SessionMixins = { + endSessions: function(sessions, callback) { + if (!Array.isArray(sessions)) { + sessions = [sessions]; + } + + // TODO: + // When connected to a sharded cluster the endSessions command + // can be sent to any mongos. When connected to a replica set the + // endSessions command MUST be sent to the primary if the primary + // is available, otherwise it MUST be sent to any available secondary. + // Is it enough to use: ReadPreference.primaryPreferred ? + this.command( + 'admin.$cmd', + { endSessions: sessions }, + { readPreference: ReadPreference.primaryPreferred }, + () => { + // intentionally ignored, per spec + if (typeof callback === 'function') callback(); + } + ); + } +}; + +function topologyType(topology) { + if (topology.description) { + return topology.description.type; + } + + if (topology.type === 'mongos') { + return TopologyType.Sharded; + } else if (topology.type === 'replset') { + return TopologyType.ReplicaSetWithPrimary; + } + + return TopologyType.Single; +} + +const RETRYABLE_WIRE_VERSION = 6; + +/** + * Determines whether the provided topology supports retryable writes + * + * @param {Mongos|Replset} topology + */ +const isRetryableWritesSupported = function(topology) { + const maxWireVersion = topology.lastIsMaster().maxWireVersion; + if (maxWireVersion < RETRYABLE_WIRE_VERSION) { + return false; + } + + if (!topology.logicalSessionTimeoutMinutes) { + return false; + } + + if (topologyType(topology) === TopologyType.Single) { + return false; + } + + return true; +}; + +const MMAPv1_RETRY_WRITES_ERROR_MESSAGE = + 'This MongoDB deployment does not support retryable writes. Please add retryWrites=false to your connection string.'; + +function getMMAPError(err) { + if (err.code !== MMAPv1_RETRY_WRITES_ERROR_CODE || !err.errmsg.includes('Transaction numbers')) { + return err; + } + + // According to the retryable writes spec, we must replace the error message in this case. + // We need to replace err.message so the thrown message is correct and we need to replace err.errmsg to meet the spec requirement. + const newErr = new MongoError({ + message: MMAPv1_RETRY_WRITES_ERROR_MESSAGE, + errmsg: MMAPv1_RETRY_WRITES_ERROR_MESSAGE, + originalError: err + }); + return newErr; +} + +// NOTE: only used for legacy topology types +function legacyIsRetryableWriteError(err, topology) { + if (!(err instanceof MongoError)) { + return false; + } + + // if pre-4.4 server, then add error label if its a retryable write error + if ( + isRetryableWritesSupported(topology) && + (err instanceof MongoNetworkError || + (maxWireVersion(topology) < 9 && isRetryableWriteError(err))) + ) { + err.addErrorLabel('RetryableWriteError'); + } + + return err.hasErrorLabel('RetryableWriteError'); +} + +module.exports = { + SessionMixins, + resolveClusterTime, + inquireServerState, + getTopologyType, + emitServerDescriptionChanged, + emitTopologyDescriptionChanged, + cloneOptions, + createCompressionInfo, + clone, + diff, + Interval, + Timeout, + isRetryableWritesSupported, + getMMAPError, + topologyType, + legacyIsRetryableWriteError +}; diff --git a/node_modules/mongodb/lib/core/transactions.js b/node_modules/mongodb/lib/core/transactions.js new file mode 100644 index 00000000..d0b0b73d --- /dev/null +++ b/node_modules/mongodb/lib/core/transactions.js @@ -0,0 +1,179 @@ +'use strict'; +const MongoError = require('./error').MongoError; +const ReadPreference = require('./topologies/read_preference'); +const ReadConcern = require('../read_concern'); +const WriteConcern = require('../write_concern'); + +let TxnState; +let stateMachine; + +(() => { + const NO_TRANSACTION = 'NO_TRANSACTION'; + const STARTING_TRANSACTION = 'STARTING_TRANSACTION'; + const TRANSACTION_IN_PROGRESS = 'TRANSACTION_IN_PROGRESS'; + const TRANSACTION_COMMITTED = 'TRANSACTION_COMMITTED'; + const TRANSACTION_COMMITTED_EMPTY = 'TRANSACTION_COMMITTED_EMPTY'; + const TRANSACTION_ABORTED = 'TRANSACTION_ABORTED'; + + TxnState = { + NO_TRANSACTION, + STARTING_TRANSACTION, + TRANSACTION_IN_PROGRESS, + TRANSACTION_COMMITTED, + TRANSACTION_COMMITTED_EMPTY, + TRANSACTION_ABORTED + }; + + stateMachine = { + [NO_TRANSACTION]: [NO_TRANSACTION, STARTING_TRANSACTION], + [STARTING_TRANSACTION]: [ + TRANSACTION_IN_PROGRESS, + TRANSACTION_COMMITTED, + TRANSACTION_COMMITTED_EMPTY, + TRANSACTION_ABORTED + ], + [TRANSACTION_IN_PROGRESS]: [ + TRANSACTION_IN_PROGRESS, + TRANSACTION_COMMITTED, + TRANSACTION_ABORTED + ], + [TRANSACTION_COMMITTED]: [ + TRANSACTION_COMMITTED, + TRANSACTION_COMMITTED_EMPTY, + STARTING_TRANSACTION, + NO_TRANSACTION + ], + [TRANSACTION_ABORTED]: [STARTING_TRANSACTION, NO_TRANSACTION], + [TRANSACTION_COMMITTED_EMPTY]: [TRANSACTION_COMMITTED_EMPTY, NO_TRANSACTION] + }; +})(); + +/** + * The MongoDB ReadConcern, which allows for control of the consistency and isolation properties + * of the data read from replica sets and replica set shards. + * @typedef {Object} ReadConcern + * @property {'local'|'available'|'majority'|'linearizable'|'snapshot'} level The readConcern Level + * @see https://docs.mongodb.com/manual/reference/read-concern/ + */ + +/** + * A MongoDB WriteConcern, which describes the level of acknowledgement + * requested from MongoDB for write operations. + * @typedef {Object} WriteConcern + * @property {number|'majority'|string} [w=1] requests acknowledgement that the write operation has + * propagated to a specified number of mongod hosts + * @property {boolean} [j=false] requests acknowledgement from MongoDB that the write operation has + * been written to the journal + * @property {number} [wtimeout] a time limit, in milliseconds, for the write concern + * @see https://docs.mongodb.com/manual/reference/write-concern/ + */ + +/** + * Configuration options for a transaction. + * @typedef {Object} TransactionOptions + * @property {ReadConcern} [readConcern] A default read concern for commands in this transaction + * @property {WriteConcern} [writeConcern] A default writeConcern for commands in this transaction + * @property {ReadPreference} [readPreference] A default read preference for commands in this transaction + */ + +/** + * A class maintaining state related to a server transaction. Internal Only + * @ignore + */ +class Transaction { + /** + * Create a transaction + * + * @ignore + * @param {TransactionOptions} [options] Optional settings + */ + constructor(options) { + options = options || {}; + + this.state = TxnState.NO_TRANSACTION; + this.options = {}; + + const writeConcern = WriteConcern.fromOptions(options); + if (writeConcern) { + if (writeConcern.w <= 0) { + throw new MongoError('Transactions do not support unacknowledged write concern'); + } + + this.options.writeConcern = writeConcern; + } + + if (options.readConcern) { + this.options.readConcern = ReadConcern.fromOptions(options); + } + + if (options.readPreference) { + this.options.readPreference = ReadPreference.fromOptions(options); + } + + if (options.maxCommitTimeMS) { + this.options.maxTimeMS = options.maxCommitTimeMS; + } + + // TODO: This isn't technically necessary + this._pinnedServer = undefined; + this._recoveryToken = undefined; + } + + get server() { + return this._pinnedServer; + } + + get recoveryToken() { + return this._recoveryToken; + } + + get isPinned() { + return !!this.server; + } + + /** + * @ignore + * @return Whether this session is presently in a transaction + */ + get isActive() { + return ( + [TxnState.STARTING_TRANSACTION, TxnState.TRANSACTION_IN_PROGRESS].indexOf(this.state) !== -1 + ); + } + + /** + * Transition the transaction in the state machine + * @ignore + * @param {TxnState} state The new state to transition to + */ + transition(nextState) { + const nextStates = stateMachine[this.state]; + if (nextStates && nextStates.indexOf(nextState) !== -1) { + this.state = nextState; + if (this.state === TxnState.NO_TRANSACTION || this.state === TxnState.STARTING_TRANSACTION) { + this.unpinServer(); + } + return; + } + + throw new MongoError( + `Attempted illegal state transition from [${this.state}] to [${nextState}]` + ); + } + + pinServer(server) { + if (this.isActive) { + this._pinnedServer = server; + } + } + + unpinServer() { + this._pinnedServer = undefined; + } +} + +function isTransactionCommand(command) { + return !!(command.commitTransaction || command.abortTransaction); +} + +module.exports = { TxnState, Transaction, isTransactionCommand }; diff --git a/node_modules/mongodb/lib/core/uri_parser.js b/node_modules/mongodb/lib/core/uri_parser.js new file mode 100644 index 00000000..62584a88 --- /dev/null +++ b/node_modules/mongodb/lib/core/uri_parser.js @@ -0,0 +1,730 @@ +'use strict'; +const URL = require('url'); +const qs = require('querystring'); +const dns = require('dns'); +const MongoParseError = require('./error').MongoParseError; +const ReadPreference = require('./topologies/read_preference'); + +/** + * The following regular expression validates a connection string and breaks the + * provide string into the following capture groups: [protocol, username, password, hosts] + */ +const HOSTS_RX = /(mongodb(?:\+srv|)):\/\/(?: (?:[^:]*) (?: : ([^@]*) )? @ )?([^/?]*)(?:\/|)(.*)/; + +// Options that reference file paths should not be parsed +const FILE_PATH_OPTIONS = new Set( + ['sslCA', 'sslCert', 'sslKey', 'tlsCAFile', 'tlsCertificateKeyFile'].map(key => key.toLowerCase()) +); + +/** + * Determines whether a provided address matches the provided parent domain in order + * to avoid certain attack vectors. + * + * @param {String} srvAddress The address to check against a domain + * @param {String} parentDomain The domain to check the provided address against + * @return {Boolean} Whether the provided address matches the parent domain + */ +function matchesParentDomain(srvAddress, parentDomain) { + const regex = /^.*?\./; + const srv = `.${srvAddress.replace(regex, '')}`; + const parent = `.${parentDomain.replace(regex, '')}`; + return srv.endsWith(parent); +} + +/** + * Lookup a `mongodb+srv` connection string, combine the parts and reparse it as a normal + * connection string. + * + * @param {string} uri The connection string to parse + * @param {object} options Optional user provided connection string options + * @param {function} callback + */ +function parseSrvConnectionString(uri, options, callback) { + const result = URL.parse(uri, true); + + if (options.directConnection || options.directconnection) { + return callback(new MongoParseError('directConnection not supported with SRV URI')); + } + + if (result.hostname.split('.').length < 3) { + return callback(new MongoParseError('URI does not have hostname, domain name and tld')); + } + + result.domainLength = result.hostname.split('.').length; + if (result.pathname && result.pathname.match(',')) { + return callback(new MongoParseError('Invalid URI, cannot contain multiple hostnames')); + } + + if (result.port) { + return callback(new MongoParseError(`Ports not accepted with '${PROTOCOL_MONGODB_SRV}' URIs`)); + } + + // Resolve the SRV record and use the result as the list of hosts to connect to. + const lookupAddress = result.host; + dns.resolveSrv(`_mongodb._tcp.${lookupAddress}`, (err, addresses) => { + if (err) return callback(err); + + if (addresses.length === 0) { + return callback(new MongoParseError('No addresses found at host')); + } + + for (let i = 0; i < addresses.length; i++) { + if (!matchesParentDomain(addresses[i].name, result.hostname, result.domainLength)) { + return callback( + new MongoParseError('Server record does not share hostname with parent URI') + ); + } + } + + // Convert the original URL to a non-SRV URL. + result.protocol = 'mongodb'; + result.host = addresses.map(address => `${address.name}:${address.port}`).join(','); + + // Default to SSL true if it's not specified. + if ( + !('ssl' in options) && + (!result.search || !('ssl' in result.query) || result.query.ssl === null) + ) { + result.query.ssl = true; + } + + // Resolve TXT record and add options from there if they exist. + dns.resolveTxt(lookupAddress, (err, record) => { + if (err) { + if (err.code !== 'ENODATA' && err.code !== 'ENOTFOUND') { + return callback(err); + } + record = null; + } + + if (record) { + if (record.length > 1) { + return callback(new MongoParseError('Multiple text records not allowed')); + } + + record = qs.parse(record[0].join('')); + if (Object.keys(record).some(key => key !== 'authSource' && key !== 'replicaSet')) { + return callback( + new MongoParseError('Text record must only set `authSource` or `replicaSet`') + ); + } + + result.query = Object.assign({}, record, result.query); + } + + // Set completed options back into the URL object. + result.search = qs.stringify(result.query); + + const finalString = URL.format(result); + parseConnectionString(finalString, options, (err, ret) => { + if (err) { + callback(err); + return; + } + + callback(null, Object.assign({}, ret, { srvHost: lookupAddress })); + }); + }); + }); +} + +/** + * Parses a query string item according to the connection string spec + * + * @param {string} key The key for the parsed value + * @param {Array|String} value The value to parse + * @return {Array|Object|String} The parsed value + */ +function parseQueryStringItemValue(key, value) { + if (Array.isArray(value)) { + // deduplicate and simplify arrays + value = value.filter((v, idx) => value.indexOf(v) === idx); + if (value.length === 1) value = value[0]; + } else if (value.indexOf(':') > 0) { + value = value.split(',').reduce((result, pair) => { + const parts = pair.split(':'); + result[parts[0]] = parseQueryStringItemValue(key, parts[1]); + return result; + }, {}); + } else if (value.indexOf(',') > 0) { + value = value.split(',').map(v => { + return parseQueryStringItemValue(key, v); + }); + } else if (value.toLowerCase() === 'true' || value.toLowerCase() === 'false') { + value = value.toLowerCase() === 'true'; + } else if (!Number.isNaN(value) && !STRING_OPTIONS.has(key)) { + const numericValue = parseFloat(value); + if (!Number.isNaN(numericValue)) { + value = parseFloat(value); + } + } + + return value; +} + +// Options that are known boolean types +const BOOLEAN_OPTIONS = new Set([ + 'slaveok', + 'slave_ok', + 'sslvalidate', + 'fsync', + 'safe', + 'retrywrites', + 'j' +]); + +// Known string options, only used to bypass Number coercion in `parseQueryStringItemValue` +const STRING_OPTIONS = new Set(['authsource', 'replicaset']); + +// Supported text representations of auth mechanisms +// NOTE: this list exists in native already, if it is merged here we should deduplicate +const AUTH_MECHANISMS = new Set([ + 'GSSAPI', + 'MONGODB-AWS', + 'MONGODB-X509', + 'MONGODB-CR', + 'DEFAULT', + 'SCRAM-SHA-1', + 'SCRAM-SHA-256', + 'PLAIN' +]); + +// Lookup table used to translate normalized (lower-cased) forms of connection string +// options to their expected camelCase version +const CASE_TRANSLATION = { + replicaset: 'replicaSet', + connecttimeoutms: 'connectTimeoutMS', + sockettimeoutms: 'socketTimeoutMS', + maxpoolsize: 'maxPoolSize', + minpoolsize: 'minPoolSize', + maxidletimems: 'maxIdleTimeMS', + waitqueuemultiple: 'waitQueueMultiple', + waitqueuetimeoutms: 'waitQueueTimeoutMS', + wtimeoutms: 'wtimeoutMS', + readconcern: 'readConcern', + readconcernlevel: 'readConcernLevel', + readpreference: 'readPreference', + maxstalenessseconds: 'maxStalenessSeconds', + readpreferencetags: 'readPreferenceTags', + authsource: 'authSource', + authmechanism: 'authMechanism', + authmechanismproperties: 'authMechanismProperties', + gssapiservicename: 'gssapiServiceName', + localthresholdms: 'localThresholdMS', + serverselectiontimeoutms: 'serverSelectionTimeoutMS', + serverselectiontryonce: 'serverSelectionTryOnce', + heartbeatfrequencyms: 'heartbeatFrequencyMS', + retrywrites: 'retryWrites', + uuidrepresentation: 'uuidRepresentation', + zlibcompressionlevel: 'zlibCompressionLevel', + tlsallowinvalidcertificates: 'tlsAllowInvalidCertificates', + tlsallowinvalidhostnames: 'tlsAllowInvalidHostnames', + tlsinsecure: 'tlsInsecure', + tlscafile: 'tlsCAFile', + tlscertificatekeyfile: 'tlsCertificateKeyFile', + tlscertificatekeyfilepassword: 'tlsCertificateKeyFilePassword', + wtimeout: 'wTimeoutMS', + j: 'journal', + directconnection: 'directConnection' +}; + +/** + * Sets the value for `key`, allowing for any required translation + * + * @param {object} obj The object to set the key on + * @param {string} key The key to set the value for + * @param {*} value The value to set + * @param {object} options The options used for option parsing + */ +function applyConnectionStringOption(obj, key, value, options) { + // simple key translation + if (key === 'journal') { + key = 'j'; + } else if (key === 'wtimeoutms') { + key = 'wtimeout'; + } + + // more complicated translation + if (BOOLEAN_OPTIONS.has(key)) { + value = value === 'true' || value === true; + } else if (key === 'appname') { + value = decodeURIComponent(value); + } else if (key === 'readconcernlevel') { + obj['readConcernLevel'] = value; + key = 'readconcern'; + value = { level: value }; + } + + // simple validation + if (key === 'compressors') { + value = Array.isArray(value) ? value : [value]; + + if (!value.every(c => c === 'snappy' || c === 'zlib')) { + throw new MongoParseError( + 'Value for `compressors` must be at least one of: `snappy`, `zlib`' + ); + } + } + + if (key === 'authmechanism' && !AUTH_MECHANISMS.has(value)) { + throw new MongoParseError( + `Value for authMechanism must be one of: ${Array.from(AUTH_MECHANISMS).join( + ', ' + )}, found: ${value}` + ); + } + + if (key === 'readpreference' && !ReadPreference.isValid(value)) { + throw new MongoParseError( + 'Value for `readPreference` must be one of: `primary`, `primaryPreferred`, `secondary`, `secondaryPreferred`, `nearest`' + ); + } + + if (key === 'zlibcompressionlevel' && (value < -1 || value > 9)) { + throw new MongoParseError('zlibCompressionLevel must be an integer between -1 and 9'); + } + + // special cases + if (key === 'compressors' || key === 'zlibcompressionlevel') { + obj.compression = obj.compression || {}; + obj = obj.compression; + } + + if (key === 'authmechanismproperties') { + if (typeof value.SERVICE_NAME === 'string') obj.gssapiServiceName = value.SERVICE_NAME; + if (typeof value.SERVICE_REALM === 'string') obj.gssapiServiceRealm = value.SERVICE_REALM; + if (typeof value.CANONICALIZE_HOST_NAME !== 'undefined') { + obj.gssapiCanonicalizeHostName = value.CANONICALIZE_HOST_NAME; + } + } + + if (key === 'readpreferencetags') { + value = Array.isArray(value) ? splitArrayOfMultipleReadPreferenceTags(value) : [value]; + } + + // set the actual value + if (options.caseTranslate && CASE_TRANSLATION[key]) { + obj[CASE_TRANSLATION[key]] = value; + return; + } + + obj[key] = value; +} + +const USERNAME_REQUIRED_MECHANISMS = new Set([ + 'GSSAPI', + 'MONGODB-CR', + 'PLAIN', + 'SCRAM-SHA-1', + 'SCRAM-SHA-256' +]); + +function splitArrayOfMultipleReadPreferenceTags(value) { + const parsedTags = []; + + for (let i = 0; i < value.length; i++) { + parsedTags[i] = {}; + value[i].split(',').forEach(individualTag => { + const splitTag = individualTag.split(':'); + parsedTags[i][splitTag[0]] = splitTag[1]; + }); + } + + return parsedTags; +} + +/** + * Modifies the parsed connection string object taking into account expectations we + * have for authentication-related options. + * + * @param {object} parsed The parsed connection string result + * @return The parsed connection string result possibly modified for auth expectations + */ +function applyAuthExpectations(parsed) { + if (parsed.options == null) { + return; + } + + const options = parsed.options; + const authSource = options.authsource || options.authSource; + if (authSource != null) { + parsed.auth = Object.assign({}, parsed.auth, { db: authSource }); + } + + const authMechanism = options.authmechanism || options.authMechanism; + if (authMechanism != null) { + if ( + USERNAME_REQUIRED_MECHANISMS.has(authMechanism) && + (!parsed.auth || parsed.auth.username == null) + ) { + throw new MongoParseError(`Username required for mechanism \`${authMechanism}\``); + } + + if (authMechanism === 'GSSAPI') { + if (authSource != null && authSource !== '$external') { + throw new MongoParseError( + `Invalid source \`${authSource}\` for mechanism \`${authMechanism}\` specified.` + ); + } + + parsed.auth = Object.assign({}, parsed.auth, { db: '$external' }); + } + + if (authMechanism === 'MONGODB-AWS') { + if (authSource != null && authSource !== '$external') { + throw new MongoParseError( + `Invalid source \`${authSource}\` for mechanism \`${authMechanism}\` specified.` + ); + } + + parsed.auth = Object.assign({}, parsed.auth, { db: '$external' }); + } + + if (authMechanism === 'MONGODB-X509') { + if (parsed.auth && parsed.auth.password != null) { + throw new MongoParseError(`Password not allowed for mechanism \`${authMechanism}\``); + } + + if (authSource != null && authSource !== '$external') { + throw new MongoParseError( + `Invalid source \`${authSource}\` for mechanism \`${authMechanism}\` specified.` + ); + } + + parsed.auth = Object.assign({}, parsed.auth, { db: '$external' }); + } + + if (authMechanism === 'PLAIN') { + if (parsed.auth && parsed.auth.db == null) { + parsed.auth = Object.assign({}, parsed.auth, { db: '$external' }); + } + } + } + + // default to `admin` if nothing else was resolved + if (parsed.auth && parsed.auth.db == null) { + parsed.auth = Object.assign({}, parsed.auth, { db: 'admin' }); + } + + return parsed; +} + +/** + * Parses a query string according the connection string spec. + * + * @param {String} query The query string to parse + * @param {object} [options] The options used for options parsing + * @return {Object|Error} The parsed query string as an object, or an error if one was encountered + */ +function parseQueryString(query, options) { + const result = {}; + let parsedQueryString = qs.parse(query); + + checkTLSOptions(parsedQueryString); + + for (const key in parsedQueryString) { + const value = parsedQueryString[key]; + if (value === '' || value == null) { + throw new MongoParseError('Incomplete key value pair for option'); + } + + const normalizedKey = key.toLowerCase(); + const parsedValue = FILE_PATH_OPTIONS.has(normalizedKey) + ? value + : parseQueryStringItemValue(normalizedKey, value); + applyConnectionStringOption(result, normalizedKey, parsedValue, options); + } + + // special cases for known deprecated options + if (result.wtimeout && result.wtimeoutms) { + delete result.wtimeout; + console.warn('Unsupported option `wtimeout` specified'); + } + + return Object.keys(result).length ? result : null; +} + +/// Adds support for modern `tls` variants of out `ssl` options +function translateTLSOptions(queryString) { + if (queryString.tls) { + queryString.ssl = queryString.tls; + } + + if (queryString.tlsInsecure) { + queryString.checkServerIdentity = false; + queryString.sslValidate = false; + } else { + Object.assign(queryString, { + checkServerIdentity: queryString.tlsAllowInvalidHostnames ? false : true, + sslValidate: queryString.tlsAllowInvalidCertificates ? false : true + }); + } + + if (queryString.tlsCAFile) { + queryString.ssl = true; + queryString.sslCA = queryString.tlsCAFile; + } + + if (queryString.tlsCertificateKeyFile) { + queryString.ssl = true; + if (queryString.tlsCertificateFile) { + queryString.sslCert = queryString.tlsCertificateFile; + queryString.sslKey = queryString.tlsCertificateKeyFile; + } else { + queryString.sslKey = queryString.tlsCertificateKeyFile; + queryString.sslCert = queryString.tlsCertificateKeyFile; + } + } + + if (queryString.tlsCertificateKeyFilePassword) { + queryString.ssl = true; + queryString.sslPass = queryString.tlsCertificateKeyFilePassword; + } + + return queryString; +} + +/** + * Checks a query string for invalid tls options according to the URI options spec. + * + * @param {string} queryString The query string to check + * @throws {MongoParseError} + */ +function checkTLSOptions(queryString) { + const queryStringKeys = Object.keys(queryString); + if ( + queryStringKeys.indexOf('tlsInsecure') !== -1 && + (queryStringKeys.indexOf('tlsAllowInvalidCertificates') !== -1 || + queryStringKeys.indexOf('tlsAllowInvalidHostnames') !== -1) + ) { + throw new MongoParseError( + 'The `tlsInsecure` option cannot be used with `tlsAllowInvalidCertificates` or `tlsAllowInvalidHostnames`.' + ); + } + + const tlsValue = assertTlsOptionsAreEqual('tls', queryString, queryStringKeys); + const sslValue = assertTlsOptionsAreEqual('ssl', queryString, queryStringKeys); + + if (tlsValue != null && sslValue != null) { + if (tlsValue !== sslValue) { + throw new MongoParseError('All values of `tls` and `ssl` must be the same.'); + } + } +} + +/** + * Checks a query string to ensure all tls/ssl options are the same. + * + * @param {string} key The key (tls or ssl) to check + * @param {string} queryString The query string to check + * @throws {MongoParseError} + * @return The value of the tls/ssl option + */ +function assertTlsOptionsAreEqual(optionName, queryString, queryStringKeys) { + const queryStringHasTLSOption = queryStringKeys.indexOf(optionName) !== -1; + + let optionValue; + if (Array.isArray(queryString[optionName])) { + optionValue = queryString[optionName][0]; + } else { + optionValue = queryString[optionName]; + } + + if (queryStringHasTLSOption) { + if (Array.isArray(queryString[optionName])) { + const firstValue = queryString[optionName][0]; + queryString[optionName].forEach(tlsValue => { + if (tlsValue !== firstValue) { + throw new MongoParseError(`All values of ${optionName} must be the same.`); + } + }); + } + } + + return optionValue; +} + +const PROTOCOL_MONGODB = 'mongodb'; +const PROTOCOL_MONGODB_SRV = 'mongodb+srv'; +const SUPPORTED_PROTOCOLS = [PROTOCOL_MONGODB, PROTOCOL_MONGODB_SRV]; + +/** + * Parses a MongoDB connection string + * + * @param {*} uri the MongoDB connection string to parse + * @param {object} [options] Optional settings. + * @param {boolean} [options.caseTranslate] Whether the parser should translate options back into camelCase after normalization + * @param {parseCallback} callback + */ +function parseConnectionString(uri, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = Object.assign({}, { caseTranslate: true }, options); + + // Check for bad uris before we parse + try { + URL.parse(uri); + } catch (e) { + return callback(new MongoParseError('URI malformed, cannot be parsed')); + } + + const cap = uri.match(HOSTS_RX); + if (!cap) { + return callback(new MongoParseError('Invalid connection string')); + } + + const protocol = cap[1]; + if (SUPPORTED_PROTOCOLS.indexOf(protocol) === -1) { + return callback(new MongoParseError('Invalid protocol provided')); + } + + const dbAndQuery = cap[4].split('?'); + const db = dbAndQuery.length > 0 ? dbAndQuery[0] : null; + const query = dbAndQuery.length > 1 ? dbAndQuery[1] : null; + + let parsedOptions; + try { + parsedOptions = parseQueryString(query, options); + } catch (parseError) { + return callback(parseError); + } + + parsedOptions = Object.assign({}, parsedOptions, options); + + if (protocol === PROTOCOL_MONGODB_SRV) { + return parseSrvConnectionString(uri, parsedOptions, callback); + } + + const auth = { username: null, password: null, db: db && db !== '' ? qs.unescape(db) : null }; + if (parsedOptions.auth) { + // maintain support for legacy options passed into `MongoClient` + if (parsedOptions.auth.username) auth.username = parsedOptions.auth.username; + if (parsedOptions.auth.user) auth.username = parsedOptions.auth.user; + if (parsedOptions.auth.password) auth.password = parsedOptions.auth.password; + } else { + if (parsedOptions.username) auth.username = parsedOptions.username; + if (parsedOptions.user) auth.username = parsedOptions.user; + if (parsedOptions.password) auth.password = parsedOptions.password; + } + + if (cap[4].split('?')[0].indexOf('@') !== -1) { + return callback(new MongoParseError('Unescaped slash in userinfo section')); + } + + const authorityParts = cap[3].split('@'); + if (authorityParts.length > 2) { + return callback(new MongoParseError('Unescaped at-sign in authority section')); + } + + if (authorityParts[0] == null || authorityParts[0] === '') { + return callback(new MongoParseError('No username provided in authority section')); + } + + if (authorityParts.length > 1) { + const authParts = authorityParts.shift().split(':'); + if (authParts.length > 2) { + return callback(new MongoParseError('Unescaped colon in authority section')); + } + + if (authParts[0] === '') { + return callback(new MongoParseError('Invalid empty username provided')); + } + + if (!auth.username) auth.username = qs.unescape(authParts[0]); + if (!auth.password) auth.password = authParts[1] ? qs.unescape(authParts[1]) : null; + } + + let hostParsingError = null; + const hosts = authorityParts + .shift() + .split(',') + .map(host => { + let parsedHost = URL.parse(`mongodb://${host}`); + if (parsedHost.path === '/:') { + hostParsingError = new MongoParseError('Double colon in host identifier'); + return null; + } + + // heuristically determine if we're working with a domain socket + if (host.match(/\.sock/)) { + parsedHost.hostname = qs.unescape(host); + parsedHost.port = null; + } + + if (Number.isNaN(parsedHost.port)) { + hostParsingError = new MongoParseError('Invalid port (non-numeric string)'); + return; + } + + const result = { + host: parsedHost.hostname, + port: parsedHost.port ? parseInt(parsedHost.port) : 27017 + }; + + if (result.port === 0) { + hostParsingError = new MongoParseError('Invalid port (zero) with hostname'); + return; + } + + if (result.port > 65535) { + hostParsingError = new MongoParseError('Invalid port (larger than 65535) with hostname'); + return; + } + + if (result.port < 0) { + hostParsingError = new MongoParseError('Invalid port (negative number)'); + return; + } + + return result; + }) + .filter(host => !!host); + + if (hostParsingError) { + return callback(hostParsingError); + } + + if (hosts.length === 0 || hosts[0].host === '' || hosts[0].host === null) { + return callback(new MongoParseError('No hostname or hostnames provided in connection string')); + } + + const directConnection = !!parsedOptions.directConnection; + if (directConnection && hosts.length !== 1) { + // If the option is set to true, the driver MUST validate that there is exactly one host given + // in the host list in the URI, and fail client creation otherwise. + return callback(new MongoParseError('directConnection option requires exactly one host')); + } + + // NOTE: this behavior will go away in v4.0, we will always auto discover there + if ( + parsedOptions.directConnection == null && + hosts.length === 1 && + parsedOptions.replicaSet == null + ) { + parsedOptions.directConnection = true; + } + + const result = { + hosts: hosts, + auth: auth.db || auth.username ? auth : null, + options: Object.keys(parsedOptions).length ? parsedOptions : null + }; + + if (result.auth && result.auth.db) { + result.defaultDatabase = result.auth.db; + } else { + result.defaultDatabase = 'test'; + } + + // support modern `tls` variants to SSL options + result.options = translateTLSOptions(result.options); + + try { + applyAuthExpectations(result); + } catch (authError) { + return callback(authError); + } + + callback(null, result); +} + +module.exports = parseConnectionString; diff --git a/node_modules/mongodb/lib/core/utils.js b/node_modules/mongodb/lib/core/utils.js new file mode 100644 index 00000000..6043a512 --- /dev/null +++ b/node_modules/mongodb/lib/core/utils.js @@ -0,0 +1,297 @@ +'use strict'; +const os = require('os'); +const crypto = require('crypto'); +const requireOptional = require('require_optional'); + +/** + * Generate a UUIDv4 + */ +const uuidV4 = () => { + const result = crypto.randomBytes(16); + result[6] = (result[6] & 0x0f) | 0x40; + result[8] = (result[8] & 0x3f) | 0x80; + return result; +}; + +/** + * Relays events for a given listener and emitter + * + * @param {EventEmitter} listener the EventEmitter to listen to the events from + * @param {EventEmitter} emitter the EventEmitter to relay the events to + */ +function relayEvents(listener, emitter, events) { + events.forEach(eventName => listener.on(eventName, event => emitter.emit(eventName, event))); +} + +function retrieveKerberos() { + let kerberos; + + try { + kerberos = requireOptional('kerberos'); + } catch (err) { + if (err.code === 'MODULE_NOT_FOUND') { + throw new Error('The `kerberos` module was not found. Please install it and try again.'); + } + + throw err; + } + + return kerberos; +} + +// Throw an error if an attempt to use EJSON is made when it is not installed +const noEJSONError = function() { + throw new Error('The `mongodb-extjson` module was not found. Please install it and try again.'); +}; + +// Facilitate loading EJSON optionally +function retrieveEJSON() { + let EJSON = null; + try { + EJSON = requireOptional('mongodb-extjson'); + } catch (error) {} // eslint-disable-line + if (!EJSON) { + EJSON = { + parse: noEJSONError, + deserialize: noEJSONError, + serialize: noEJSONError, + stringify: noEJSONError, + setBSONModule: noEJSONError, + BSON: noEJSONError + }; + } + + return EJSON; +} + +/** + * A helper function for determining `maxWireVersion` between legacy and new topology + * instances + * + * @private + * @param {(Topology|Server)} topologyOrServer + */ +function maxWireVersion(topologyOrServer) { + if (topologyOrServer) { + if (topologyOrServer.ismaster) { + return topologyOrServer.ismaster.maxWireVersion; + } + + if (typeof topologyOrServer.lastIsMaster === 'function') { + const lastIsMaster = topologyOrServer.lastIsMaster(); + if (lastIsMaster) { + return lastIsMaster.maxWireVersion; + } + } + + if (topologyOrServer.description) { + return topologyOrServer.description.maxWireVersion; + } + } + + return 0; +} + +/* + * Checks that collation is supported by server. + * + * @param {Server} [server] to check against + * @param {object} [cmd] object where collation may be specified + * @param {function} [callback] callback function + * @return true if server does not support collation + */ +function collationNotSupported(server, cmd) { + return cmd && cmd.collation && maxWireVersion(server) < 5; +} + +/** + * Checks if a given value is a Promise + * + * @param {*} maybePromise + * @return true if the provided value is a Promise + */ +function isPromiseLike(maybePromise) { + return maybePromise && typeof maybePromise.then === 'function'; +} + +/** + * Applies the function `eachFn` to each item in `arr`, in parallel. + * + * @param {array} arr an array of items to asynchronusly iterate over + * @param {function} eachFn A function to call on each item of the array. The callback signature is `(item, callback)`, where the callback indicates iteration is complete. + * @param {function} callback The callback called after every item has been iterated + */ +function eachAsync(arr, eachFn, callback) { + arr = arr || []; + + let idx = 0; + let awaiting = 0; + for (idx = 0; idx < arr.length; ++idx) { + awaiting++; + eachFn(arr[idx], eachCallback); + } + + if (awaiting === 0) { + callback(); + return; + } + + function eachCallback(err) { + awaiting--; + if (err) { + callback(err); + return; + } + + if (idx === arr.length && awaiting <= 0) { + callback(); + } + } +} + +function eachAsyncSeries(arr, eachFn, callback) { + arr = arr || []; + + let idx = 0; + let awaiting = arr.length; + if (awaiting === 0) { + callback(); + return; + } + + function eachCallback(err) { + idx++; + awaiting--; + if (err) { + callback(err); + return; + } + + if (idx === arr.length && awaiting <= 0) { + callback(); + return; + } + + eachFn(arr[idx], eachCallback); + } + + eachFn(arr[idx], eachCallback); +} + +function isUnifiedTopology(topology) { + return topology.description != null; +} + +function arrayStrictEqual(arr, arr2) { + if (!Array.isArray(arr) || !Array.isArray(arr2)) { + return false; + } + + return arr.length === arr2.length && arr.every((elt, idx) => elt === arr2[idx]); +} + +function tagsStrictEqual(tags, tags2) { + const tagsKeys = Object.keys(tags); + const tags2Keys = Object.keys(tags2); + return tagsKeys.length === tags2Keys.length && tagsKeys.every(key => tags2[key] === tags[key]); +} + +function errorStrictEqual(lhs, rhs) { + if (lhs === rhs) { + return true; + } + + if ((lhs == null && rhs != null) || (lhs != null && rhs == null)) { + return false; + } + + if (lhs.constructor.name !== rhs.constructor.name) { + return false; + } + + if (lhs.message !== rhs.message) { + return false; + } + + return true; +} + +function makeStateMachine(stateTable) { + return function stateTransition(target, newState) { + const legalStates = stateTable[target.s.state]; + if (legalStates && legalStates.indexOf(newState) < 0) { + throw new TypeError( + `illegal state transition from [${target.s.state}] => [${newState}], allowed: [${legalStates}]` + ); + } + + target.emit('stateChanged', target.s.state, newState); + target.s.state = newState; + }; +} + +function makeClientMetadata(options) { + options = options || {}; + + const metadata = { + driver: { + name: 'nodejs', + version: require('../../package.json').version + }, + os: { + type: os.type(), + name: process.platform, + architecture: process.arch, + version: os.release() + }, + platform: `'Node.js ${process.version}, ${os.endianness} (${ + options.useUnifiedTopology ? 'unified' : 'legacy' + })` + }; + + // support optionally provided wrapping driver info + if (options.driverInfo) { + if (options.driverInfo.name) { + metadata.driver.name = `${metadata.driver.name}|${options.driverInfo.name}`; + } + + if (options.driverInfo.version) { + metadata.version = `${metadata.driver.version}|${options.driverInfo.version}`; + } + + if (options.driverInfo.platform) { + metadata.platform = `${metadata.platform}|${options.driverInfo.platform}`; + } + } + + if (options.appname) { + // MongoDB requires the appname not exceed a byte length of 128 + const buffer = Buffer.from(options.appname); + metadata.application = { + name: buffer.length > 128 ? buffer.slice(0, 128).toString('utf8') : options.appname + }; + } + + return metadata; +} + +const noop = () => {}; + +module.exports = { + uuidV4, + relayEvents, + collationNotSupported, + retrieveEJSON, + retrieveKerberos, + maxWireVersion, + isPromiseLike, + eachAsync, + eachAsyncSeries, + isUnifiedTopology, + arrayStrictEqual, + tagsStrictEqual, + errorStrictEqual, + makeStateMachine, + makeClientMetadata, + noop +}; diff --git a/node_modules/mongodb/lib/core/wireprotocol/command.js b/node_modules/mongodb/lib/core/wireprotocol/command.js new file mode 100644 index 00000000..fd581c84 --- /dev/null +++ b/node_modules/mongodb/lib/core/wireprotocol/command.js @@ -0,0 +1,177 @@ +'use strict'; + +const Query = require('../connection/commands').Query; +const Msg = require('../connection/msg').Msg; +const MongoError = require('../error').MongoError; +const getReadPreference = require('./shared').getReadPreference; +const isSharded = require('./shared').isSharded; +const databaseNamespace = require('./shared').databaseNamespace; +const isTransactionCommand = require('../transactions').isTransactionCommand; +const applySession = require('../sessions').applySession; +const MongoNetworkError = require('../error').MongoNetworkError; +const maxWireVersion = require('../utils').maxWireVersion; + +function isClientEncryptionEnabled(server) { + const wireVersion = maxWireVersion(server); + return wireVersion && server.autoEncrypter; +} + +function command(server, ns, cmd, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + if (cmd == null) { + return callback(new MongoError(`command ${JSON.stringify(cmd)} does not return a cursor`)); + } + + if (!isClientEncryptionEnabled(server)) { + _command(server, ns, cmd, options, callback); + return; + } + + const wireVersion = maxWireVersion(server); + if (typeof wireVersion !== 'number' || wireVersion < 8) { + callback(new MongoError('Auto-encryption requires a minimum MongoDB version of 4.2')); + return; + } + + _cryptCommand(server, ns, cmd, options, callback); +} + +function _command(server, ns, cmd, options, callback) { + const bson = server.s.bson; + const pool = server.s.pool; + const readPreference = getReadPreference(cmd, options); + const shouldUseOpMsg = supportsOpMsg(server); + const session = options.session; + + let clusterTime = server.clusterTime; + let finalCmd = Object.assign({}, cmd); + if (hasSessionSupport(server) && session) { + if ( + session.clusterTime && + session.clusterTime.clusterTime.greaterThan(clusterTime.clusterTime) + ) { + clusterTime = session.clusterTime; + } + + const err = applySession(session, finalCmd, options); + if (err) { + return callback(err); + } + } + + // if we have a known cluster time, gossip it + if (clusterTime) { + finalCmd.$clusterTime = clusterTime; + } + + if (isSharded(server) && !shouldUseOpMsg && readPreference && readPreference.mode !== 'primary') { + finalCmd = { + $query: finalCmd, + $readPreference: readPreference.toJSON() + }; + } + + const commandOptions = Object.assign( + { + command: true, + numberToSkip: 0, + numberToReturn: -1, + checkKeys: false + }, + options + ); + + // This value is not overridable + commandOptions.slaveOk = readPreference.slaveOk(); + + const cmdNs = `${databaseNamespace(ns)}.$cmd`; + const message = shouldUseOpMsg + ? new Msg(bson, cmdNs, finalCmd, commandOptions) + : new Query(bson, cmdNs, finalCmd, commandOptions); + + const inTransaction = session && (session.inTransaction() || isTransactionCommand(finalCmd)); + const commandResponseHandler = inTransaction + ? function(err) { + // We need to add a TransientTransactionError errorLabel, as stated in the transaction spec. + if ( + err && + err instanceof MongoNetworkError && + !err.hasErrorLabel('TransientTransactionError') + ) { + err.addErrorLabel('TransientTransactionError'); + } + + if ( + !cmd.commitTransaction && + err && + err instanceof MongoError && + err.hasErrorLabel('TransientTransactionError') + ) { + session.transaction.unpinServer(); + } + + return callback.apply(null, arguments); + } + : callback; + + try { + pool.write(message, commandOptions, commandResponseHandler); + } catch (err) { + commandResponseHandler(err); + } +} + +function hasSessionSupport(topology) { + if (topology == null) return false; + if (topology.description) { + return topology.description.maxWireVersion >= 6; + } + + return topology.ismaster == null ? false : topology.ismaster.maxWireVersion >= 6; +} + +function supportsOpMsg(topologyOrServer) { + const description = topologyOrServer.ismaster + ? topologyOrServer.ismaster + : topologyOrServer.description; + + if (description == null) { + return false; + } + + return description.maxWireVersion >= 6 && description.__nodejs_mock_server__ == null; +} + +function _cryptCommand(server, ns, cmd, options, callback) { + const autoEncrypter = server.autoEncrypter; + function commandResponseHandler(err, response) { + if (err || response == null) { + callback(err, response); + return; + } + + autoEncrypter.decrypt(response.result, options, (err, decrypted) => { + if (err) { + callback(err, null); + return; + } + + response.result = decrypted; + response.message.documents = [decrypted]; + callback(null, response); + }); + } + + autoEncrypter.encrypt(ns, cmd, options, (err, encrypted) => { + if (err) { + callback(err, null); + return; + } + + _command(server, ns, encrypted, options, commandResponseHandler); + }); +} + +module.exports = command; diff --git a/node_modules/mongodb/lib/core/wireprotocol/compression.js b/node_modules/mongodb/lib/core/wireprotocol/compression.js new file mode 100644 index 00000000..b1e15835 --- /dev/null +++ b/node_modules/mongodb/lib/core/wireprotocol/compression.js @@ -0,0 +1,73 @@ +'use strict'; + +const Snappy = require('../connection/utils').retrieveSnappy(); +const zlib = require('zlib'); + +const compressorIDs = { + snappy: 1, + zlib: 2 +}; + +const uncompressibleCommands = new Set([ + 'ismaster', + 'saslStart', + 'saslContinue', + 'getnonce', + 'authenticate', + 'createUser', + 'updateUser', + 'copydbSaslStart', + 'copydbgetnonce', + 'copydb' +]); + +// Facilitate compressing a message using an agreed compressor +function compress(self, dataToBeCompressed, callback) { + switch (self.options.agreedCompressor) { + case 'snappy': + Snappy.compress(dataToBeCompressed, callback); + break; + case 'zlib': + // Determine zlibCompressionLevel + var zlibOptions = {}; + if (self.options.zlibCompressionLevel) { + zlibOptions.level = self.options.zlibCompressionLevel; + } + zlib.deflate(dataToBeCompressed, zlibOptions, callback); + break; + default: + throw new Error( + 'Attempt to compress message using unknown compressor "' + + self.options.agreedCompressor + + '".' + ); + } +} + +// Decompress a message using the given compressor +function decompress(compressorID, compressedData, callback) { + if (compressorID < 0 || compressorID > compressorIDs.length) { + throw new Error( + 'Server sent message compressed using an unsupported compressor. (Received compressor ID ' + + compressorID + + ')' + ); + } + switch (compressorID) { + case compressorIDs.snappy: + Snappy.uncompress(compressedData, callback); + break; + case compressorIDs.zlib: + zlib.inflate(compressedData, callback); + break; + default: + callback(null, compressedData); + } +} + +module.exports = { + compressorIDs, + uncompressibleCommands, + compress, + decompress +}; diff --git a/node_modules/mongodb/lib/core/wireprotocol/constants.js b/node_modules/mongodb/lib/core/wireprotocol/constants.js new file mode 100644 index 00000000..49893f8f --- /dev/null +++ b/node_modules/mongodb/lib/core/wireprotocol/constants.js @@ -0,0 +1,13 @@ +'use strict'; + +const MIN_SUPPORTED_SERVER_VERSION = '2.6'; +const MAX_SUPPORTED_SERVER_VERSION = '4.4'; +const MIN_SUPPORTED_WIRE_VERSION = 2; +const MAX_SUPPORTED_WIRE_VERSION = 9; + +module.exports = { + MIN_SUPPORTED_SERVER_VERSION, + MAX_SUPPORTED_SERVER_VERSION, + MIN_SUPPORTED_WIRE_VERSION, + MAX_SUPPORTED_WIRE_VERSION +}; diff --git a/node_modules/mongodb/lib/core/wireprotocol/get_more.js b/node_modules/mongodb/lib/core/wireprotocol/get_more.js new file mode 100644 index 00000000..9e452f6e --- /dev/null +++ b/node_modules/mongodb/lib/core/wireprotocol/get_more.js @@ -0,0 +1,95 @@ +'use strict'; + +const GetMore = require('../connection/commands').GetMore; +const retrieveBSON = require('../connection/utils').retrieveBSON; +const MongoError = require('../error').MongoError; +const MongoNetworkError = require('../error').MongoNetworkError; +const BSON = retrieveBSON(); +const Long = BSON.Long; +const collectionNamespace = require('./shared').collectionNamespace; +const maxWireVersion = require('../utils').maxWireVersion; +const applyCommonQueryOptions = require('./shared').applyCommonQueryOptions; +const command = require('./command'); + +function getMore(server, ns, cursorState, batchSize, options, callback) { + options = options || {}; + + const wireVersion = maxWireVersion(server); + function queryCallback(err, result) { + if (err) return callback(err); + const response = result.message; + + // If we have a timed out query or a cursor that was killed + if (response.cursorNotFound) { + return callback(new MongoNetworkError('cursor killed or timed out'), null); + } + + if (wireVersion < 4) { + const cursorId = + typeof response.cursorId === 'number' + ? Long.fromNumber(response.cursorId) + : response.cursorId; + + cursorState.documents = response.documents; + cursorState.cursorId = cursorId; + + callback(null, null, response.connection); + return; + } + + // We have an error detected + if (response.documents[0].ok === 0) { + return callback(new MongoError(response.documents[0])); + } + + // Ensure we have a Long valid cursor id + const cursorId = + typeof response.documents[0].cursor.id === 'number' + ? Long.fromNumber(response.documents[0].cursor.id) + : response.documents[0].cursor.id; + + cursorState.documents = response.documents[0].cursor.nextBatch; + cursorState.cursorId = cursorId; + + callback(null, response.documents[0], response.connection); + } + + if (wireVersion < 4) { + const bson = server.s.bson; + const getMoreOp = new GetMore(bson, ns, cursorState.cursorId, { numberToReturn: batchSize }); + const queryOptions = applyCommonQueryOptions({}, cursorState); + server.s.pool.write(getMoreOp, queryOptions, queryCallback); + return; + } + + const cursorId = + cursorState.cursorId instanceof Long + ? cursorState.cursorId + : Long.fromNumber(cursorState.cursorId); + + const getMoreCmd = { + getMore: cursorId, + collection: collectionNamespace(ns), + batchSize: Math.abs(batchSize) + }; + + if (cursorState.cmd.tailable && typeof cursorState.cmd.maxAwaitTimeMS === 'number') { + getMoreCmd.maxTimeMS = cursorState.cmd.maxAwaitTimeMS; + } + + const commandOptions = Object.assign( + { + returnFieldSelector: null, + documentsReturnedIn: 'nextBatch' + }, + options + ); + + if (cursorState.session) { + commandOptions.session = cursorState.session; + } + + command(server, ns, getMoreCmd, commandOptions, queryCallback); +} + +module.exports = getMore; diff --git a/node_modules/mongodb/lib/core/wireprotocol/index.js b/node_modules/mongodb/lib/core/wireprotocol/index.js new file mode 100644 index 00000000..b6ffda7c --- /dev/null +++ b/node_modules/mongodb/lib/core/wireprotocol/index.js @@ -0,0 +1,18 @@ +'use strict'; +const writeCommand = require('./write_command'); + +module.exports = { + insert: function insert(server, ns, ops, options, callback) { + writeCommand(server, 'insert', 'documents', ns, ops, options, callback); + }, + update: function update(server, ns, ops, options, callback) { + writeCommand(server, 'update', 'updates', ns, ops, options, callback); + }, + remove: function remove(server, ns, ops, options, callback) { + writeCommand(server, 'delete', 'deletes', ns, ops, options, callback); + }, + killCursors: require('./kill_cursors'), + getMore: require('./get_more'), + query: require('./query'), + command: require('./command') +}; diff --git a/node_modules/mongodb/lib/core/wireprotocol/kill_cursors.js b/node_modules/mongodb/lib/core/wireprotocol/kill_cursors.js new file mode 100644 index 00000000..bb134773 --- /dev/null +++ b/node_modules/mongodb/lib/core/wireprotocol/kill_cursors.js @@ -0,0 +1,70 @@ +'use strict'; + +const KillCursor = require('../connection/commands').KillCursor; +const MongoError = require('../error').MongoError; +const MongoNetworkError = require('../error').MongoNetworkError; +const collectionNamespace = require('./shared').collectionNamespace; +const maxWireVersion = require('../utils').maxWireVersion; +const command = require('./command'); + +function killCursors(server, ns, cursorState, callback) { + callback = typeof callback === 'function' ? callback : () => {}; + const cursorId = cursorState.cursorId; + + if (maxWireVersion(server) < 4) { + const bson = server.s.bson; + const pool = server.s.pool; + const killCursor = new KillCursor(bson, ns, [cursorId]); + const options = { + immediateRelease: true, + noResponse: true + }; + + if (typeof cursorState.session === 'object') { + options.session = cursorState.session; + } + + if (pool && pool.isConnected()) { + try { + pool.write(killCursor, options, callback); + } catch (err) { + if (typeof callback === 'function') { + callback(err, null); + } else { + console.warn(err); + } + } + } + + return; + } + + const killCursorCmd = { + killCursors: collectionNamespace(ns), + cursors: [cursorId] + }; + + const options = {}; + if (typeof cursorState.session === 'object') options.session = cursorState.session; + + command(server, ns, killCursorCmd, options, (err, result) => { + if (err) { + return callback(err); + } + + const response = result.message; + if (response.cursorNotFound) { + return callback(new MongoNetworkError('cursor killed or timed out'), null); + } + + if (!Array.isArray(response.documents) || response.documents.length === 0) { + return callback( + new MongoError(`invalid killCursors result returned for cursor id ${cursorId}`) + ); + } + + callback(null, response.documents[0]); + }); +} + +module.exports = killCursors; diff --git a/node_modules/mongodb/lib/core/wireprotocol/query.js b/node_modules/mongodb/lib/core/wireprotocol/query.js new file mode 100644 index 00000000..66ba531c --- /dev/null +++ b/node_modules/mongodb/lib/core/wireprotocol/query.js @@ -0,0 +1,236 @@ +'use strict'; + +const Query = require('../connection/commands').Query; +const MongoError = require('../error').MongoError; +const getReadPreference = require('./shared').getReadPreference; +const collectionNamespace = require('./shared').collectionNamespace; +const isSharded = require('./shared').isSharded; +const maxWireVersion = require('../utils').maxWireVersion; +const applyCommonQueryOptions = require('./shared').applyCommonQueryOptions; +const command = require('./command'); +const decorateWithExplain = require('../../utils').decorateWithExplain; +const Explain = require('../../explain').Explain; + +function query(server, ns, cmd, cursorState, options, callback) { + options = options || {}; + if (cursorState.cursorId != null) { + return callback(); + } + + if (cmd == null) { + return callback(new MongoError(`command ${JSON.stringify(cmd)} does not return a cursor`)); + } + + if (maxWireVersion(server) < 4) { + const query = prepareLegacyFindQuery(server, ns, cmd, cursorState, options); + const queryOptions = applyCommonQueryOptions({}, cursorState); + if (typeof query.documentsReturnedIn === 'string') { + queryOptions.documentsReturnedIn = query.documentsReturnedIn; + } + + server.s.pool.write(query, queryOptions, callback); + return; + } + + const readPreference = getReadPreference(cmd, options); + let findCmd = prepareFindCommand(server, ns, cmd, cursorState, options); + + // If we have explain, we need to rewrite the find command + // to wrap it in the explain command + const explain = Explain.fromOptions(options); + if (explain) { + findCmd = decorateWithExplain(findCmd, explain); + } + + // NOTE: This actually modifies the passed in cmd, and our code _depends_ on this + // side-effect. Change this ASAP + cmd.virtual = false; + + const commandOptions = Object.assign( + { + documentsReturnedIn: 'firstBatch', + numberToReturn: 1, + slaveOk: readPreference.slaveOk() + }, + options + ); + + if (cmd.readPreference) { + commandOptions.readPreference = readPreference; + } + + if (cursorState.session) { + commandOptions.session = cursorState.session; + } + + command(server, ns, findCmd, commandOptions, callback); +} + +function prepareFindCommand(server, ns, cmd, cursorState) { + cursorState.batchSize = cmd.batchSize || cursorState.batchSize; + const findCmd = { + find: collectionNamespace(ns) + }; + + if (cmd.query) { + if (cmd.query['$query']) { + findCmd.filter = cmd.query['$query']; + } else { + findCmd.filter = cmd.query; + } + } + + let sortValue = cmd.sort; + if (Array.isArray(sortValue)) { + const sortObject = {}; + + if (sortValue.length > 0 && !Array.isArray(sortValue[0])) { + let sortDirection = sortValue[1]; + if (sortDirection === 'asc') { + sortDirection = 1; + } else if (sortDirection === 'desc') { + sortDirection = -1; + } + + sortObject[sortValue[0]] = sortDirection; + } else { + for (let i = 0; i < sortValue.length; i++) { + let sortDirection = sortValue[i][1]; + if (sortDirection === 'asc') { + sortDirection = 1; + } else if (sortDirection === 'desc') { + sortDirection = -1; + } + + sortObject[sortValue[i][0]] = sortDirection; + } + } + + sortValue = sortObject; + } + + if (typeof cmd.allowDiskUse === 'boolean') { + findCmd.allowDiskUse = cmd.allowDiskUse; + } + + if (cmd.sort) findCmd.sort = sortValue; + if (cmd.fields) findCmd.projection = cmd.fields; + if (cmd.hint) findCmd.hint = cmd.hint; + if (cmd.skip) findCmd.skip = cmd.skip; + if (cmd.limit) findCmd.limit = cmd.limit; + if (cmd.limit < 0) { + findCmd.limit = Math.abs(cmd.limit); + findCmd.singleBatch = true; + } + + if (typeof cmd.batchSize === 'number') { + if (cmd.batchSize < 0) { + if (cmd.limit !== 0 && Math.abs(cmd.batchSize) < Math.abs(cmd.limit)) { + findCmd.limit = Math.abs(cmd.batchSize); + } + + findCmd.singleBatch = true; + } + + findCmd.batchSize = Math.abs(cmd.batchSize); + } + + if (cmd.comment) findCmd.comment = cmd.comment; + if (cmd.maxScan) findCmd.maxScan = cmd.maxScan; + if (cmd.maxTimeMS) findCmd.maxTimeMS = cmd.maxTimeMS; + if (cmd.min) findCmd.min = cmd.min; + if (cmd.max) findCmd.max = cmd.max; + findCmd.returnKey = cmd.returnKey ? cmd.returnKey : false; + findCmd.showRecordId = cmd.showDiskLoc ? cmd.showDiskLoc : false; + if (cmd.snapshot) findCmd.snapshot = cmd.snapshot; + if (cmd.tailable) findCmd.tailable = cmd.tailable; + if (cmd.oplogReplay) findCmd.oplogReplay = cmd.oplogReplay; + if (cmd.noCursorTimeout) findCmd.noCursorTimeout = cmd.noCursorTimeout; + if (cmd.awaitData) findCmd.awaitData = cmd.awaitData; + if (cmd.awaitdata) findCmd.awaitData = cmd.awaitdata; + if (cmd.partial) findCmd.partial = cmd.partial; + if (cmd.collation) findCmd.collation = cmd.collation; + if (cmd.readConcern) findCmd.readConcern = cmd.readConcern; + + return findCmd; +} + +function prepareLegacyFindQuery(server, ns, cmd, cursorState, options) { + options = options || {}; + const bson = server.s.bson; + const readPreference = getReadPreference(cmd, options); + cursorState.batchSize = cmd.batchSize || cursorState.batchSize; + + let numberToReturn = 0; + if ( + cursorState.limit < 0 || + (cursorState.limit !== 0 && cursorState.limit < cursorState.batchSize) || + (cursorState.limit > 0 && cursorState.batchSize === 0) + ) { + numberToReturn = cursorState.limit; + } else { + numberToReturn = cursorState.batchSize; + } + + const numberToSkip = cursorState.skip || 0; + + const findCmd = {}; + if (isSharded(server) && readPreference) { + findCmd['$readPreference'] = readPreference.toJSON(); + } + + if (cmd.sort) findCmd['$orderby'] = cmd.sort; + if (cmd.hint) findCmd['$hint'] = cmd.hint; + if (cmd.snapshot) findCmd['$snapshot'] = cmd.snapshot; + if (typeof cmd.returnKey !== 'undefined') findCmd['$returnKey'] = cmd.returnKey; + if (cmd.maxScan) findCmd['$maxScan'] = cmd.maxScan; + if (cmd.min) findCmd['$min'] = cmd.min; + if (cmd.max) findCmd['$max'] = cmd.max; + if (typeof cmd.showDiskLoc !== 'undefined') findCmd['$showDiskLoc'] = cmd.showDiskLoc; + if (cmd.comment) findCmd['$comment'] = cmd.comment; + if (cmd.maxTimeMS) findCmd['$maxTimeMS'] = cmd.maxTimeMS; + if (options.explain !== undefined) { + // nToReturn must be 0 (match all) or negative (match N and close cursor) + // nToReturn > 0 will give explain results equivalent to limit(0) + numberToReturn = -Math.abs(cmd.limit || 0); + findCmd['$explain'] = true; + } + + findCmd['$query'] = cmd.query; + if (cmd.readConcern && cmd.readConcern.level !== 'local') { + throw new MongoError( + `server find command does not support a readConcern level of ${cmd.readConcern.level}` + ); + } + + if (cmd.readConcern) { + cmd = Object.assign({}, cmd); + delete cmd['readConcern']; + } + + const serializeFunctions = + typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false; + const ignoreUndefined = + typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : false; + + const query = new Query(bson, ns, findCmd, { + numberToSkip: numberToSkip, + numberToReturn: numberToReturn, + pre32Limit: typeof cmd.limit !== 'undefined' ? cmd.limit : undefined, + checkKeys: false, + returnFieldSelector: cmd.fields, + serializeFunctions: serializeFunctions, + ignoreUndefined: ignoreUndefined + }); + + if (typeof cmd.tailable === 'boolean') query.tailable = cmd.tailable; + if (typeof cmd.oplogReplay === 'boolean') query.oplogReplay = cmd.oplogReplay; + if (typeof cmd.noCursorTimeout === 'boolean') query.noCursorTimeout = cmd.noCursorTimeout; + if (typeof cmd.awaitData === 'boolean') query.awaitData = cmd.awaitData; + if (typeof cmd.partial === 'boolean') query.partial = cmd.partial; + + query.slaveOk = readPreference.slaveOk(); + return query; +} + +module.exports = query; diff --git a/node_modules/mongodb/lib/core/wireprotocol/shared.js b/node_modules/mongodb/lib/core/wireprotocol/shared.js new file mode 100644 index 00000000..c586f057 --- /dev/null +++ b/node_modules/mongodb/lib/core/wireprotocol/shared.js @@ -0,0 +1,115 @@ +'use strict'; + +const ReadPreference = require('../topologies/read_preference'); +const MongoError = require('../error').MongoError; +const ServerType = require('../sdam/common').ServerType; +const TopologyDescription = require('../sdam/topology_description').TopologyDescription; + +const MESSAGE_HEADER_SIZE = 16; +const COMPRESSION_DETAILS_SIZE = 9; // originalOpcode + uncompressedSize, compressorID + +// OPCODE Numbers +// Defined at https://docs.mongodb.com/manual/reference/mongodb-wire-protocol/#request-opcodes +var opcodes = { + OP_REPLY: 1, + OP_UPDATE: 2001, + OP_INSERT: 2002, + OP_QUERY: 2004, + OP_GETMORE: 2005, + OP_DELETE: 2006, + OP_KILL_CURSORS: 2007, + OP_COMPRESSED: 2012, + OP_MSG: 2013 +}; + +var getReadPreference = function(cmd, options) { + // Default to command version of the readPreference + var readPreference = cmd.readPreference || new ReadPreference('primary'); + // If we have an option readPreference override the command one + if (options.readPreference) { + readPreference = options.readPreference; + } + + if (typeof readPreference === 'string') { + readPreference = new ReadPreference(readPreference); + } + + if (!(readPreference instanceof ReadPreference)) { + throw new MongoError('read preference must be a ReadPreference instance'); + } + + return readPreference; +}; + +// Parses the header of a wire protocol message +var parseHeader = function(message) { + return { + length: message.readInt32LE(0), + requestId: message.readInt32LE(4), + responseTo: message.readInt32LE(8), + opCode: message.readInt32LE(12) + }; +}; + +function applyCommonQueryOptions(queryOptions, options) { + Object.assign(queryOptions, { + raw: typeof options.raw === 'boolean' ? options.raw : false, + promoteLongs: typeof options.promoteLongs === 'boolean' ? options.promoteLongs : true, + promoteValues: typeof options.promoteValues === 'boolean' ? options.promoteValues : true, + promoteBuffers: typeof options.promoteBuffers === 'boolean' ? options.promoteBuffers : false, + monitoring: typeof options.monitoring === 'boolean' ? options.monitoring : false, + fullResult: typeof options.fullResult === 'boolean' ? options.fullResult : false + }); + + if (typeof options.socketTimeout === 'number') { + queryOptions.socketTimeout = options.socketTimeout; + } + + if (options.session) { + queryOptions.session = options.session; + } + + if (typeof options.documentsReturnedIn === 'string') { + queryOptions.documentsReturnedIn = options.documentsReturnedIn; + } + + return queryOptions; +} + +function isSharded(topologyOrServer) { + if (topologyOrServer.type === 'mongos') return true; + if (topologyOrServer.description && topologyOrServer.description.type === ServerType.Mongos) { + return true; + } + + // NOTE: This is incredibly inefficient, and should be removed once command construction + // happens based on `Server` not `Topology`. + if (topologyOrServer.description && topologyOrServer.description instanceof TopologyDescription) { + const servers = Array.from(topologyOrServer.description.servers.values()); + return servers.some(server => server.type === ServerType.Mongos); + } + + return false; +} + +function databaseNamespace(ns) { + return ns.split('.')[0]; +} +function collectionNamespace(ns) { + return ns + .split('.') + .slice(1) + .join('.'); +} + +module.exports = { + getReadPreference, + MESSAGE_HEADER_SIZE, + COMPRESSION_DETAILS_SIZE, + opcodes, + parseHeader, + applyCommonQueryOptions, + isSharded, + databaseNamespace, + collectionNamespace +}; diff --git a/node_modules/mongodb/lib/core/wireprotocol/write_command.js b/node_modules/mongodb/lib/core/wireprotocol/write_command.js new file mode 100644 index 00000000..e6babc3b --- /dev/null +++ b/node_modules/mongodb/lib/core/wireprotocol/write_command.js @@ -0,0 +1,59 @@ +'use strict'; + +const MongoError = require('../error').MongoError; +const collectionNamespace = require('./shared').collectionNamespace; +const command = require('./command'); +const decorateWithExplain = require('../../utils').decorateWithExplain; +const Explain = require('../../explain').Explain; + +function writeCommand(server, type, opsField, ns, ops, options, callback) { + if (ops.length === 0) throw new MongoError(`${type} must contain at least one document`); + if (typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + const ordered = typeof options.ordered === 'boolean' ? options.ordered : true; + const writeConcern = options.writeConcern; + + let writeCommand = {}; + writeCommand[type] = collectionNamespace(ns); + writeCommand[opsField] = ops; + writeCommand.ordered = ordered; + + if (writeConcern && Object.keys(writeConcern).length > 0) { + writeCommand.writeConcern = writeConcern; + } + + if (options.collation) { + for (let i = 0; i < writeCommand[opsField].length; i++) { + if (!writeCommand[opsField][i].collation) { + writeCommand[opsField][i].collation = options.collation; + } + } + } + + if (options.bypassDocumentValidation === true) { + writeCommand.bypassDocumentValidation = options.bypassDocumentValidation; + } + + // If a command is to be explained, we need to reformat the command after + // the other command properties are specified. + const explain = Explain.fromOptions(options); + if (explain) { + writeCommand = decorateWithExplain(writeCommand, explain); + } + + const commandOptions = Object.assign( + { + checkKeys: type === 'insert', + numberToReturn: 1 + }, + options + ); + + command(server, ns, writeCommand, commandOptions, callback); +} + +module.exports = writeCommand; diff --git a/node_modules/mongodb/lib/cursor.js b/node_modules/mongodb/lib/cursor.js new file mode 100644 index 00000000..5c17f43d --- /dev/null +++ b/node_modules/mongodb/lib/cursor.js @@ -0,0 +1,1137 @@ +'use strict'; + +const Transform = require('stream').Transform; +const PassThrough = require('stream').PassThrough; +const deprecate = require('util').deprecate; +const handleCallback = require('./utils').handleCallback; +const ReadPreference = require('./core').ReadPreference; +const MongoError = require('./core').MongoError; +const CoreCursor = require('./core/cursor').CoreCursor; +const CursorState = require('./core/cursor').CursorState; +const Map = require('./core').BSON.Map; +const maybePromise = require('./utils').maybePromise; +const executeOperation = require('./operations/execute_operation'); +const formattedOrderClause = require('./utils').formattedOrderClause; +const Explain = require('./explain').Explain; +const Aspect = require('./operations/operation').Aspect; + +const each = require('./operations/cursor_ops').each; +const CountOperation = require('./operations/count'); + +/** + * @fileOverview The **Cursor** class is an internal class that embodies a cursor on MongoDB + * allowing for iteration over the results returned from the underlying query. It supports + * one by one document iteration, conversion to an array or can be iterated as a Node 4.X + * or higher stream + * + * **CURSORS Cannot directly be instantiated** + * @example + * const MongoClient = require('mongodb').MongoClient; + * const test = require('assert'); + * // Connection url + * const url = 'mongodb://localhost:27017'; + * // Database Name + * const dbName = 'test'; + * // Connect using MongoClient + * MongoClient.connect(url, function(err, client) { + * // Create a collection we want to drop later + * const col = client.db(dbName).collection('createIndexExample1'); + * // Insert a bunch of documents + * col.insert([{a:1, b:1} + * , {a:2, b:2}, {a:3, b:3} + * , {a:4, b:4}], {w:1}, function(err, result) { + * test.equal(null, err); + * // Show that duplicate records got dropped + * col.find({}).toArray(function(err, items) { + * test.equal(null, err); + * test.equal(4, items.length); + * client.close(); + * }); + * }); + * }); + */ + +/** + * Namespace provided by the code module + * @external CoreCursor + * @external Readable + */ + +// Flags allowed for cursor +const flags = ['tailable', 'oplogReplay', 'noCursorTimeout', 'awaitData', 'exhaust', 'partial']; +const fields = ['numberOfRetries', 'tailableRetryInterval']; + +/** + * Creates a new Cursor instance (INTERNAL TYPE, do not instantiate directly) + * @class Cursor + * @extends external:CoreCursor + * @extends external:Readable + * @property {string} sortValue Cursor query sort setting. + * @property {boolean} timeout Is Cursor able to time out. + * @property {ReadPreference} readPreference Get cursor ReadPreference. + * @fires Cursor#data + * @fires Cursor#end + * @fires Cursor#close + * @fires Cursor#readable + * @return {Cursor} a Cursor instance. + * @example + * Cursor cursor options. + * + * collection.find({}).project({a:1}) // Create a projection of field a + * collection.find({}).skip(1).limit(10) // Skip 1 and limit 10 + * collection.find({}).batchSize(5) // Set batchSize on cursor to 5 + * collection.find({}).filter({a:1}) // Set query on the cursor + * collection.find({}).comment('add a comment') // Add a comment to the query, allowing to correlate queries + * collection.find({}).addCursorFlag('tailable', true) // Set cursor as tailable + * collection.find({}).addCursorFlag('noCursorTimeout', true) // Set cursor as noCursorTimeout + * collection.find({}).addCursorFlag('awaitData', true) // Set cursor as awaitData + * collection.find({}).addCursorFlag('partial', true) // Set cursor as partial + * collection.find({}).addQueryModifier('$orderby', {a:1}) // Set $orderby {a:1} + * collection.find({}).max(10) // Set the cursor max + * collection.find({}).maxTimeMS(1000) // Set the cursor maxTimeMS + * collection.find({}).min(100) // Set the cursor min + * collection.find({}).returnKey(true) // Set the cursor returnKey + * collection.find({}).setReadPreference(ReadPreference.PRIMARY) // Set the cursor readPreference + * collection.find({}).showRecordId(true) // Set the cursor showRecordId + * collection.find({}).sort([['a', 1]]) // Sets the sort order of the cursor query + * collection.find({}).hint('a_1') // Set the cursor hint + * + * All options are chainable, so one can do the following. + * + * collection.find({}).maxTimeMS(1000).maxScan(100).skip(1).toArray(..) + */ +class Cursor extends CoreCursor { + constructor(topology, ns, cmd, options) { + super(topology, ns, cmd, options); + if (this.operation) { + options = this.operation.options; + } + + // Tailable cursor options + const numberOfRetries = options.numberOfRetries || 5; + const tailableRetryInterval = options.tailableRetryInterval || 500; + const currentNumberOfRetries = numberOfRetries; + + // Get the promiseLibrary + const promiseLibrary = options.promiseLibrary || Promise; + + // Internal cursor state + this.s = { + // Tailable cursor options + numberOfRetries: numberOfRetries, + tailableRetryInterval: tailableRetryInterval, + currentNumberOfRetries: currentNumberOfRetries, + // State + state: CursorState.INIT, + // Promise library + promiseLibrary, + // explicitlyIgnoreSession + explicitlyIgnoreSession: !!options.explicitlyIgnoreSession + }; + + // Optional ClientSession + if (!options.explicitlyIgnoreSession && options.session) { + this.cursorState.session = options.session; + } + + // Translate correctly + if (this.options.noCursorTimeout === true) { + this.addCursorFlag('noCursorTimeout', true); + } + + // Get the batchSize + let batchSize = 1000; + if (this.cmd.cursor && this.cmd.cursor.batchSize) { + batchSize = this.cmd.cursor.batchSize; + } else if (options.cursor && options.cursor.batchSize) { + batchSize = options.cursor.batchSize; + } else if (typeof options.batchSize === 'number') { + batchSize = options.batchSize; + } + + // Set the batchSize + this.setCursorBatchSize(batchSize); + } + + get readPreference() { + if (this.operation) { + return this.operation.readPreference; + } + + return this.options.readPreference; + } + + get sortValue() { + return this.cmd.sort; + } + + _initializeCursor(callback) { + if (this.operation && this.operation.session != null) { + this.cursorState.session = this.operation.session; + } else { + // implicitly create a session if one has not been provided + if ( + !this.s.explicitlyIgnoreSession && + !this.cursorState.session && + this.topology.hasSessionSupport() + ) { + this.cursorState.session = this.topology.startSession({ owner: this }); + + if (this.operation) { + this.operation.session = this.cursorState.session; + } + } + } + + super._initializeCursor(callback); + } + + /** + * Check if there is any document still available in the cursor + * @method + * @param {Cursor~resultCallback} [callback] The result callback. + * @throws {MongoError} + * @return {Promise} returns Promise if no callback passed + */ + hasNext(callback) { + if (this.s.state === CursorState.CLOSED || (this.isDead && this.isDead())) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + return maybePromise(this, callback, cb => { + const cursor = this; + if (cursor.isNotified()) { + return cb(null, false); + } + + cursor._next((err, doc) => { + if (err) return cb(err); + if (doc == null || cursor.s.state === Cursor.CLOSED || cursor.isDead()) { + return cb(null, false); + } + + cursor.s.state = CursorState.OPEN; + + // NODE-2482: merge this into the core cursor implementation + cursor.cursorState.cursorIndex--; + if (cursor.cursorState.limit > 0) { + cursor.cursorState.currentLimit--; + } + + cb(null, true); + }); + }); + } + + /** + * Get the next available document from the cursor, returns null if no more documents are available. + * @method + * @param {Cursor~resultCallback} [callback] The result callback. + * @throws {MongoError} + * @return {Promise} returns Promise if no callback passed + */ + next(callback) { + return maybePromise(this, callback, cb => { + const cursor = this; + if (cursor.s.state === CursorState.CLOSED || (cursor.isDead && cursor.isDead())) { + cb(MongoError.create({ message: 'Cursor is closed', driver: true })); + return; + } + + if (cursor.s.state === CursorState.INIT && cursor.cmd.sort) { + try { + cursor.cmd.sort = formattedOrderClause(cursor.cmd.sort); + } catch (err) { + return cb(err); + } + } + + cursor._next((err, doc) => { + if (err) return cb(err); + cursor.s.state = CursorState.OPEN; + cb(null, doc); + }); + }); + } + + /** + * Set the cursor query + * @method + * @param {object} filter The filter object used for the cursor. + * @return {Cursor} + */ + filter(filter) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.query = filter; + return this; + } + + /** + * Set the cursor maxScan + * @method + * @param {object} maxScan Constrains the query to only scan the specified number of documents when fulfilling the query + * @deprecated as of MongoDB 4.0 + * @return {Cursor} + */ + maxScan(maxScan) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.maxScan = maxScan; + return this; + } + + /** + * Set the cursor hint + * @method + * @param {object} hint If specified, then the query system will only consider plans using the hinted index. + * @return {Cursor} + */ + hint(hint) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.hint = hint; + return this; + } + + /** + * Set the cursor min + * @method + * @param {object} min Specify a $min value to specify the inclusive lower bound for a specific index in order to constrain the results of find(). The $min specifies the lower bound for all keys of a specific index in order. + * @return {Cursor} + */ + min(min) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.min = min; + return this; + } + + /** + * Set the cursor max + * @method + * @param {object} max Specify a $max value to specify the exclusive upper bound for a specific index in order to constrain the results of find(). The $max specifies the upper bound for all keys of a specific index in order. + * @return {Cursor} + */ + max(max) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.max = max; + return this; + } + + /** + * Set the cursor returnKey. If set to true, modifies the cursor to only return the index field or fields for the results of the query, rather than documents. If set to true and the query does not use an index to perform the read operation, the returned documents will not contain any fields. + * @method + * @param {bool} returnKey the returnKey value. + * @return {Cursor} + */ + returnKey(value) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.returnKey = value; + return this; + } + + /** + * Set the cursor showRecordId + * @method + * @param {object} showRecordId The $showDiskLoc option has now been deprecated and replaced with the showRecordId field. $showDiskLoc will still be accepted for OP_QUERY stye find. + * @return {Cursor} + */ + showRecordId(value) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.showDiskLoc = value; + return this; + } + + /** + * Set the cursor snapshot + * @method + * @param {object} snapshot The $snapshot operator prevents the cursor from returning a document more than once because an intervening write operation results in a move of the document. + * @deprecated as of MongoDB 4.0 + * @return {Cursor} + */ + snapshot(value) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.snapshot = value; + return this; + } + + /** + * Set a node.js specific cursor option + * @method + * @param {string} field The cursor option to set ['numberOfRetries', 'tailableRetryInterval']. + * @param {object} value The field value. + * @throws {MongoError} + * @return {Cursor} + */ + setCursorOption(field, value) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + if (fields.indexOf(field) === -1) { + throw MongoError.create({ + message: `option ${field} is not a supported option ${fields}`, + driver: true + }); + } + + this.s[field] = value; + if (field === 'numberOfRetries') this.s.currentNumberOfRetries = value; + return this; + } + + /** + * Add a cursor flag to the cursor + * @method + * @param {string} flag The flag to set, must be one of following ['tailable', 'oplogReplay', 'noCursorTimeout', 'awaitData', 'partial']. + * @param {boolean} value The flag boolean value. + * @throws {MongoError} + * @return {Cursor} + */ + addCursorFlag(flag, value) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + if (flags.indexOf(flag) === -1) { + throw MongoError.create({ + message: `flag ${flag} is not a supported flag ${flags}`, + driver: true + }); + } + + if (typeof value !== 'boolean') { + throw MongoError.create({ message: `flag ${flag} must be a boolean value`, driver: true }); + } + + this.cmd[flag] = value; + return this; + } + + /** + * Add a query modifier to the cursor query + * @method + * @param {string} name The query modifier (must start with $, such as $orderby etc) + * @param {string|boolean|number} value The modifier value. + * @throws {MongoError} + * @return {Cursor} + */ + addQueryModifier(name, value) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + if (name[0] !== '$') { + throw MongoError.create({ message: `${name} is not a valid query modifier`, driver: true }); + } + + // Strip of the $ + const field = name.substr(1); + // Set on the command + this.cmd[field] = value; + // Deal with the special case for sort + if (field === 'orderby') this.cmd.sort = this.cmd[field]; + return this; + } + + /** + * Add a comment to the cursor query allowing for tracking the comment in the log. + * @method + * @param {string} value The comment attached to this query. + * @throws {MongoError} + * @return {Cursor} + */ + comment(value) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.comment = value; + return this; + } + + /** + * Set a maxAwaitTimeMS on a tailing cursor query to allow to customize the timeout value for the option awaitData (Only supported on MongoDB 3.2 or higher, ignored otherwise) + * @method + * @param {number} value Number of milliseconds to wait before aborting the tailed query. + * @throws {MongoError} + * @return {Cursor} + */ + maxAwaitTimeMS(value) { + if (typeof value !== 'number') { + throw MongoError.create({ message: 'maxAwaitTimeMS must be a number', driver: true }); + } + + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.maxAwaitTimeMS = value; + return this; + } + + /** + * Set a maxTimeMS on the cursor query, allowing for hard timeout limits on queries (Only supported on MongoDB 2.6 or higher) + * @method + * @param {number} value Number of milliseconds to wait before aborting the query. + * @throws {MongoError} + * @return {Cursor} + */ + maxTimeMS(value) { + if (typeof value !== 'number') { + throw MongoError.create({ message: 'maxTimeMS must be a number', driver: true }); + } + + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.maxTimeMS = value; + return this; + } + + /** + * Sets a field projection for the query. + * @method + * @param {object} value The field projection object. + * @throws {MongoError} + * @return {Cursor} + */ + project(value) { + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + this.cmd.fields = value; + return this; + } + + /** + * Sets the sort order of the cursor query. + * @method + * @param {(string|array|object)} keyOrList The key or keys set for the sort. + * @param {number} [direction] The direction of the sorting (1 or -1). + * @throws {MongoError} + * @return {Cursor} + */ + sort(keyOrList, direction) { + if (this.options.tailable) { + throw MongoError.create({ message: "Tailable cursor doesn't support sorting", driver: true }); + } + + if (this.s.state === CursorState.CLOSED || this.s.state === CursorState.OPEN || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + let order = keyOrList; + + // We have an array of arrays, we need to preserve the order of the sort + // so we will us a Map + if (Array.isArray(order) && Array.isArray(order[0])) { + order = new Map( + order.map(x => { + const value = [x[0], null]; + if (x[1] === 'asc') { + value[1] = 1; + } else if (x[1] === 'desc') { + value[1] = -1; + } else if (x[1] === 1 || x[1] === -1 || x[1].$meta) { + value[1] = x[1]; + } else { + throw new MongoError( + "Illegal sort clause, must be of the form [['field1', '(ascending|descending)'], ['field2', '(ascending|descending)']]" + ); + } + + return value; + }) + ); + } + + if (direction != null) { + order = [[keyOrList, direction]]; + } + + this.cmd.sort = order; + return this; + } + + /** + * Set the batch size for the cursor. + * @method + * @param {number} value The number of documents to return per batch. See {@link https://docs.mongodb.com/manual/reference/command/find/|find command documentation}. + * @throws {MongoError} + * @return {Cursor} + */ + batchSize(value) { + if (this.options.tailable) { + throw MongoError.create({ + message: "Tailable cursor doesn't support batchSize", + driver: true + }); + } + + if (this.s.state === CursorState.CLOSED || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + if (typeof value !== 'number') { + throw MongoError.create({ message: 'batchSize requires an integer', driver: true }); + } + + this.cmd.batchSize = value; + this.setCursorBatchSize(value); + return this; + } + + /** + * Set the collation options for the cursor. + * @method + * @param {object} value The cursor collation options (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @throws {MongoError} + * @return {Cursor} + */ + collation(value) { + this.cmd.collation = value; + return this; + } + + /** + * Set the limit for the cursor. + * @method + * @param {number} value The limit for the cursor query. + * @throws {MongoError} + * @return {Cursor} + */ + limit(value) { + if (this.options.tailable) { + throw MongoError.create({ message: "Tailable cursor doesn't support limit", driver: true }); + } + + if (this.s.state === CursorState.OPEN || this.s.state === CursorState.CLOSED || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + if (typeof value !== 'number') { + throw MongoError.create({ message: 'limit requires an integer', driver: true }); + } + + this.cmd.limit = value; + this.setCursorLimit(value); + return this; + } + + /** + * Set the skip for the cursor. + * @method + * @param {number} value The skip for the cursor query. + * @throws {MongoError} + * @return {Cursor} + */ + skip(value) { + if (this.options.tailable) { + throw MongoError.create({ message: "Tailable cursor doesn't support skip", driver: true }); + } + + if (this.s.state === CursorState.OPEN || this.s.state === CursorState.CLOSED || this.isDead()) { + throw MongoError.create({ message: 'Cursor is closed', driver: true }); + } + + if (typeof value !== 'number') { + throw MongoError.create({ message: 'skip requires an integer', driver: true }); + } + + this.cmd.skip = value; + this.setCursorSkip(value); + return this; + } + + /** + * The callback format for results + * @callback Cursor~resultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {(object|null|boolean)} result The result object if the command was executed successfully. + */ + + /** + * Clone the cursor + * @function external:CoreCursor#clone + * @return {Cursor} + */ + + /** + * Resets the cursor + * @function external:CoreCursor#rewind + * @return {null} + */ + + /** + * Iterates over all the documents for this cursor. As with **{cursor.toArray}**, + * not all of the elements will be iterated if this cursor had been previously accessed. + * In that case, **{cursor.rewind}** can be used to reset the cursor. However, unlike + * **{cursor.toArray}**, the cursor will only hold a maximum of batch size elements + * at any given time if batch size is specified. Otherwise, the caller is responsible + * for making sure that the entire result can fit the memory. + * @method + * @deprecated + * @param {Cursor~resultCallback} callback The result callback. + * @throws {MongoError} + * @return {null} + */ + each(callback) { + // Rewind cursor state + this.rewind(); + // Set current cursor to INIT + this.s.state = CursorState.INIT; + // Run the query + each(this, callback); + } + + /** + * The callback format for the forEach iterator method + * @callback Cursor~iteratorCallback + * @param {Object} doc An emitted document for the iterator + */ + + /** + * The callback error format for the forEach iterator method + * @callback Cursor~endCallback + * @param {MongoError} error An error instance representing the error during the execution. + */ + + /** + * Iterates over all the documents for this cursor using the iterator, callback pattern. + * @method + * @param {Cursor~iteratorCallback} iterator The iteration callback. + * @param {Cursor~endCallback} callback The end callback. + * @throws {MongoError} + * @return {Promise} if no callback supplied + */ + forEach(iterator, callback) { + // Rewind cursor state + this.rewind(); + + // Set current cursor to INIT + this.s.state = CursorState.INIT; + + if (typeof callback === 'function') { + each(this, (err, doc) => { + if (err) { + callback(err); + return false; + } + if (doc != null) { + iterator(doc); + return true; + } + if (doc == null && callback) { + const internalCallback = callback; + callback = null; + internalCallback(null); + return false; + } + }); + } else { + return new this.s.promiseLibrary((fulfill, reject) => { + each(this, (err, doc) => { + if (err) { + reject(err); + return false; + } else if (doc == null) { + fulfill(null); + return false; + } else { + iterator(doc); + return true; + } + }); + }); + } + } + + /** + * Set the ReadPreference for the cursor. + * @method + * @param {(string|ReadPreference)} readPreference The new read preference for the cursor. + * @throws {MongoError} + * @return {Cursor} + */ + setReadPreference(readPreference) { + if (this.s.state !== CursorState.INIT) { + throw MongoError.create({ + message: 'cannot change cursor readPreference after cursor has been accessed', + driver: true + }); + } + + if (readPreference instanceof ReadPreference) { + this.options.readPreference = readPreference; + } else if (typeof readPreference === 'string') { + this.options.readPreference = new ReadPreference(readPreference); + } else { + throw new TypeError('Invalid read preference: ' + readPreference); + } + + return this; + } + + /** + * The callback format for results + * @callback Cursor~toArrayResultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {object[]} documents All the documents the satisfy the cursor. + */ + + /** + * Returns an array of documents. The caller is responsible for making sure that there + * is enough memory to store the results. Note that the array only contains partial + * results when this cursor had been previously accessed. In that case, + * cursor.rewind() can be used to reset the cursor. + * @method + * @param {Cursor~toArrayResultCallback} [callback] The result callback. + * @throws {MongoError} + * @return {Promise} returns Promise if no callback passed + */ + toArray(callback) { + if (this.options.tailable) { + throw MongoError.create({ + message: 'Tailable cursor cannot be converted to array', + driver: true + }); + } + + return maybePromise(this, callback, cb => { + const cursor = this; + const items = []; + + // Reset cursor + cursor.rewind(); + cursor.s.state = CursorState.INIT; + + // Fetch all the documents + const fetchDocs = () => { + cursor._next((err, doc) => { + if (err) { + return handleCallback(cb, err); + } + + if (doc == null) { + return cursor.close({ skipKillCursors: true }, () => handleCallback(cb, null, items)); + } + + // Add doc to items + items.push(doc); + + // Get all buffered objects + if (cursor.bufferedCount() > 0) { + let docs = cursor.readBufferedDocuments(cursor.bufferedCount()); + Array.prototype.push.apply(items, docs); + } + + // Attempt a fetch + fetchDocs(); + }); + }; + + fetchDocs(); + }); + } + + /** + * The callback format for results + * @callback Cursor~countResultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {number} count The count of documents. + */ + + /** + * Get the count of documents for this cursor + * @method + * @param {boolean} [applySkipLimit=true] Should the count command apply limit and skip settings on the cursor or in the passed in options. + * @param {object} [options] Optional settings. + * @param {number} [options.skip] The number of documents to skip. + * @param {number} [options.limit] The maximum amounts to count before aborting. + * @param {number} [options.maxTimeMS] Number of milliseconds to wait before aborting the query. + * @param {string} [options.hint] An index name hint for the query. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {Cursor~countResultCallback} [callback] The result callback. + * @return {Promise} returns Promise if no callback passed + */ + count(applySkipLimit, opts, callback) { + if (this.cmd.query == null) + throw MongoError.create({ + message: 'count can only be used with find command', + driver: true + }); + if (typeof opts === 'function') (callback = opts), (opts = {}); + opts = opts || {}; + + if (typeof applySkipLimit === 'function') { + callback = applySkipLimit; + applySkipLimit = true; + } + + if (this.cursorState.session) { + opts = Object.assign({}, opts, { session: this.cursorState.session }); + } + + const countOperation = new CountOperation(this, applySkipLimit, opts); + + return executeOperation(this.topology, countOperation, callback); + } + + /** + * Close the cursor, sending a KillCursor command and emitting close. + * @method + * @param {object} [options] Optional settings. + * @param {boolean} [options.skipKillCursors] Bypass calling killCursors when closing the cursor. + * @param {Cursor~resultCallback} [callback] The result callback. + * @return {Promise} returns Promise if no callback passed + */ + close(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = Object.assign({}, { skipKillCursors: false }, options); + + return maybePromise(this, callback, cb => { + this.s.state = CursorState.CLOSED; + if (!options.skipKillCursors) { + // Kill the cursor + this.kill(); + } + + this._endSession(() => { + this.emit('close'); + cb(null, this); + }); + }); + } + + /** + * Map all documents using the provided function + * @method + * @param {function} [transform] The mapping transformation method. + * @return {Cursor} + */ + map(transform) { + if (this.cursorState.transforms && this.cursorState.transforms.doc) { + const oldTransform = this.cursorState.transforms.doc; + this.cursorState.transforms.doc = doc => { + return transform(oldTransform(doc)); + }; + } else { + this.cursorState.transforms = { doc: transform }; + } + + return this; + } + + /** + * Is the cursor closed + * @method + * @return {boolean} + */ + isClosed() { + return this.isDead(); + } + + destroy(err) { + if (err) this.emit('error', err); + this.pause(); + this.close(); + } + + /** + * Return a modified Readable stream including a possible transform method. + * @method + * @param {object} [options] Optional settings. + * @param {function} [options.transform] A transformation method applied to each document emitted by the stream. + * @return {Cursor} + * TODO: replace this method with transformStream in next major release + */ + stream(options) { + this.cursorState.streamOptions = options || {}; + return this; + } + + /** + * Return a modified Readable stream that applies a given transform function, if supplied. If none supplied, + * returns a stream of unmodified docs. + * @method + * @param {object} [options] Optional settings. + * @param {function} [options.transform] A transformation method applied to each document emitted by the stream. + * @return {stream} + */ + transformStream(options) { + const streamOptions = options || {}; + if (typeof streamOptions.transform === 'function') { + const stream = new Transform({ + objectMode: true, + transform: function(chunk, encoding, callback) { + this.push(streamOptions.transform(chunk)); + callback(); + } + }); + + return this.pipe(stream); + } + + return this.pipe(new PassThrough({ objectMode: true })); + } + + /** + * Execute the explain for the cursor + * + * For backwards compatibility, a verbosity of true is interpreted as "allPlansExecution" + * and false as "queryPlanner". Prior to server version 3.6, aggregate() + * ignores the verbosity parameter and executes in "queryPlanner". + * + * @method + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [verbosity=true] - An optional mode in which to run the explain. + * @param {Cursor~resultCallback} [callback] The result callback. + * @return {Promise} returns Promise if no callback passed + */ + explain(verbosity, callback) { + if (typeof verbosity === 'function') (callback = verbosity), (verbosity = true); + if (verbosity === undefined) verbosity = true; + + if (!this.operation || !this.operation.hasAspect(Aspect.EXPLAINABLE)) { + throw new MongoError('This command cannot be explained'); + } + this.operation.explain = new Explain(verbosity); + + return maybePromise(this, callback, cb => { + CoreCursor.prototype._next.apply(this, [cb]); + }); + } + + /** + * Return the cursor logger + * @method + * @return {Logger} return the cursor logger + * @ignore + */ + getLogger() { + return this.logger; + } +} + +/** + * Cursor stream data event, fired for each document in the cursor. + * + * @event Cursor#data + * @type {object} + */ + +/** + * Cursor stream end event + * + * @event Cursor#end + * @type {null} + */ + +/** + * Cursor stream close event + * + * @event Cursor#close + * @type {null} + */ + +/** + * Cursor stream readable event + * + * @event Cursor#readable + * @type {null} + */ + +// aliases +Cursor.prototype.maxTimeMs = Cursor.prototype.maxTimeMS; + +// deprecated methods +deprecate(Cursor.prototype.each, 'Cursor.each is deprecated. Use Cursor.forEach instead.'); +deprecate( + Cursor.prototype.maxScan, + 'Cursor.maxScan is deprecated, and will be removed in a later version' +); + +deprecate( + Cursor.prototype.snapshot, + 'Cursor Snapshot is deprecated, and will be removed in a later version' +); + +/** + * The read() method pulls some data out of the internal buffer and returns it. If there is no data available, then it will return null. + * @function external:Readable#read + * @param {number} size Optional argument to specify how much data to read. + * @return {(String | Buffer | null)} + */ + +/** + * Call this function to cause the stream to return strings of the specified encoding instead of Buffer objects. + * @function external:Readable#setEncoding + * @param {string} encoding The encoding to use. + * @return {null} + */ + +/** + * This method will cause the readable stream to resume emitting data events. + * @function external:Readable#resume + * @return {null} + */ + +/** + * This method will cause a stream in flowing-mode to stop emitting data events. Any data that becomes available will remain in the internal buffer. + * @function external:Readable#pause + * @return {null} + */ + +/** + * This method pulls all the data out of a readable stream, and writes it to the supplied destination, automatically managing the flow so that the destination is not overwhelmed by a fast readable stream. + * @function external:Readable#pipe + * @param {Writable} destination The destination for writing data + * @param {object} [options] Pipe options + * @return {null} + */ + +/** + * This method will remove the hooks set up for a previous pipe() call. + * @function external:Readable#unpipe + * @param {Writable} [destination] The destination for writing data + * @return {null} + */ + +/** + * This is useful in certain cases where a stream is being consumed by a parser, which needs to "un-consume" some data that it has optimistically pulled out of the source, so that the stream can be passed on to some other party. + * @function external:Readable#unshift + * @param {(Buffer|string)} chunk Chunk of data to unshift onto the read queue. + * @return {null} + */ + +/** + * Versions of Node prior to v0.10 had streams that did not implement the entire Streams API as it is today. (See "Compatibility" below for more information.) + * @function external:Readable#wrap + * @param {Stream} stream An "old style" readable stream. + * @return {null} + */ + +module.exports = Cursor; diff --git a/node_modules/mongodb/lib/db.js b/node_modules/mongodb/lib/db.js new file mode 100644 index 00000000..40c51f9e --- /dev/null +++ b/node_modules/mongodb/lib/db.js @@ -0,0 +1,1048 @@ +'use strict'; + +const EventEmitter = require('events').EventEmitter; +const inherits = require('util').inherits; +const getSingleProperty = require('./utils').getSingleProperty; +const CommandCursor = require('./command_cursor'); +const handleCallback = require('./utils').handleCallback; +const filterOptions = require('./utils').filterOptions; +const toError = require('./utils').toError; +const ReadPreference = require('./core').ReadPreference; +const MongoError = require('./core').MongoError; +const ObjectID = require('./core').ObjectID; +const Logger = require('./core').Logger; +const Collection = require('./collection'); +const mergeOptionsAndWriteConcern = require('./utils').mergeOptionsAndWriteConcern; +const executeLegacyOperation = require('./utils').executeLegacyOperation; +const ChangeStream = require('./change_stream'); +const deprecate = require('util').deprecate; +const deprecateOptions = require('./utils').deprecateOptions; +const MongoDBNamespace = require('./utils').MongoDBNamespace; +const CONSTANTS = require('./constants'); +const WriteConcern = require('./write_concern'); +const ReadConcern = require('./read_concern'); +const AggregationCursor = require('./aggregation_cursor'); + +// Operations +const createListener = require('./operations/db_ops').createListener; +const ensureIndex = require('./operations/db_ops').ensureIndex; +const evaluate = require('./operations/db_ops').evaluate; +const profilingInfo = require('./operations/db_ops').profilingInfo; +const validateDatabaseName = require('./operations/db_ops').validateDatabaseName; + +const AggregateOperation = require('./operations/aggregate'); +const AddUserOperation = require('./operations/add_user'); +const CollectionsOperation = require('./operations/collections'); +const CommandOperation = require('./operations/command'); +const RunCommandOperation = require('./operations/run_command'); +const CreateCollectionOperation = require('./operations/create_collection'); +const CreateIndexesOperation = require('./operations/create_indexes'); +const DropCollectionOperation = require('./operations/drop').DropCollectionOperation; +const DropDatabaseOperation = require('./operations/drop').DropDatabaseOperation; +const ExecuteDbAdminCommandOperation = require('./operations/execute_db_admin_command'); +const IndexInformationOperation = require('./operations/index_information'); +const ListCollectionsOperation = require('./operations/list_collections'); +const ProfilingLevelOperation = require('./operations/profiling_level'); +const RemoveUserOperation = require('./operations/remove_user'); +const RenameOperation = require('./operations/rename'); +const SetProfilingLevelOperation = require('./operations/set_profiling_level'); + +const executeOperation = require('./operations/execute_operation'); + +/** + * @fileOverview The **Db** class is a class that represents a MongoDB Database. + * + * @example + * const MongoClient = require('mongodb').MongoClient; + * // Connection url + * const url = 'mongodb://localhost:27017'; + * // Database Name + * const dbName = 'test'; + * // Connect using MongoClient + * MongoClient.connect(url, function(err, client) { + * // Select the database by name + * const testDb = client.db(dbName); + * client.close(); + * }); + */ + +// Allowed parameters +const legalOptionNames = [ + 'w', + 'wtimeout', + 'fsync', + 'j', + 'writeConcern', + 'readPreference', + 'readPreferenceTags', + 'native_parser', + 'forceServerObjectId', + 'pkFactory', + 'serializeFunctions', + 'raw', + 'bufferMaxEntries', + 'authSource', + 'ignoreUndefined', + 'promoteLongs', + 'promiseLibrary', + 'readConcern', + 'retryMiliSeconds', + 'numberOfRetries', + 'parentDb', + 'noListener', + 'loggerLevel', + 'logger', + 'promoteBuffers', + 'promoteLongs', + 'promoteValues', + 'compression', + 'retryWrites' +]; + +/** + * Creates a new Db instance + * @class + * @param {string} databaseName The name of the database this instance represents. + * @param {(Server|ReplSet|Mongos)} topology The server topology for the database. + * @param {object} [options] Optional settings. + * @param {string} [options.authSource] If the database authentication is dependent on another databaseName. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.forceServerObjectId=false] Force server to assign _id values instead of driver. + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields. + * @param {boolean} [options.raw=false] Return document results as raw BSON buffers. + * @param {boolean} [options.promoteLongs=true] Promotes Long values to number if they fit inside the 53 bits resolution. + * @param {boolean} [options.promoteBuffers=false] Promotes Binary BSON values to native Node Buffers. + * @param {boolean} [options.promoteValues=true] Promotes BSON values to native types where possible, set to false to only receive wrapper types. + * @param {number} [options.bufferMaxEntries=-1] Sets a cap on how many operations the driver will buffer up before giving up on getting a working connection, default is -1 which is unlimited. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {object} [options.pkFactory] A primary key factory object for generation of custom _id keys. + * @param {object} [options.promiseLibrary] A Promise library class the application wishes to use such as Bluebird, must be ES6 compatible + * @param {object} [options.readConcern] Specify a read concern for the collection. (only MongoDB 3.2 or higher supported) + * @param {ReadConcernLevel} [options.readConcern.level='local'] Specify a read concern level for the collection operations (only MongoDB 3.2 or higher supported) + * @property {(Server|ReplSet|Mongos)} serverConfig Get the current db topology. + * @property {number} bufferMaxEntries Current bufferMaxEntries value for the database + * @property {string} databaseName The name of the database this instance represents. + * @property {object} options The options associated with the db instance. + * @property {boolean} native_parser The current value of the parameter native_parser. + * @property {boolean} slaveOk The current slaveOk value for the db instance. + * @property {object} writeConcern The current write concern values. + * @property {object} topology Access the topology object (single server, replicaset or mongos). + * @fires Db#close + * @fires Db#reconnect + * @fires Db#error + * @fires Db#timeout + * @fires Db#parseError + * @fires Db#fullsetup + * @return {Db} a Db instance. + */ +function Db(databaseName, topology, options) { + options = options || {}; + if (!(this instanceof Db)) return new Db(databaseName, topology, options); + EventEmitter.call(this); + + // Get the promiseLibrary + const promiseLibrary = options.promiseLibrary || Promise; + + // Filter the options + options = filterOptions(options, legalOptionNames); + + // Ensure we put the promiseLib in the options + options.promiseLibrary = promiseLibrary; + + // Internal state of the db object + this.s = { + // DbCache + dbCache: {}, + // Children db's + children: [], + // Topology + topology: topology, + // Options + options: options, + // Logger instance + logger: Logger('Db', options), + // Get the bson parser + bson: topology ? topology.bson : null, + // Unpack read preference + readPreference: ReadPreference.fromOptions(options), + // Set buffermaxEntries + bufferMaxEntries: typeof options.bufferMaxEntries === 'number' ? options.bufferMaxEntries : -1, + // Parent db (if chained) + parentDb: options.parentDb || null, + // Set up the primary key factory or fallback to ObjectID + pkFactory: options.pkFactory || ObjectID, + // Get native parser + nativeParser: options.nativeParser || options.native_parser, + // Promise library + promiseLibrary: promiseLibrary, + // No listener + noListener: typeof options.noListener === 'boolean' ? options.noListener : false, + // ReadConcern + readConcern: ReadConcern.fromOptions(options), + writeConcern: WriteConcern.fromOptions(options), + // Namespace + namespace: new MongoDBNamespace(databaseName) + }; + + // Ensure we have a valid db name + validateDatabaseName(databaseName); + + // Add a read Only property + getSingleProperty(this, 'serverConfig', this.s.topology); + getSingleProperty(this, 'bufferMaxEntries', this.s.bufferMaxEntries); + getSingleProperty(this, 'databaseName', this.s.namespace.db); + + // This is a child db, do not register any listeners + if (options.parentDb) return; + if (this.s.noListener) return; + + // Add listeners + topology.on('error', createListener(this, 'error', this)); + topology.on('timeout', createListener(this, 'timeout', this)); + topology.on('close', createListener(this, 'close', this)); + topology.on('parseError', createListener(this, 'parseError', this)); + topology.once('open', createListener(this, 'open', this)); + topology.once('fullsetup', createListener(this, 'fullsetup', this)); + topology.once('all', createListener(this, 'all', this)); + topology.on('reconnect', createListener(this, 'reconnect', this)); +} + +inherits(Db, EventEmitter); + +Db.prototype.on = deprecate(function() { + return Db.super_.prototype.on.apply(this, arguments); +}, 'Listening to events on the Db class has been deprecated and will be removed in the next major version.'); + +Db.prototype.once = deprecate(function() { + return Db.super_.prototype.once.apply(this, arguments); +}, 'Listening to events on the Db class has been deprecated and will be removed in the next major version.'); + +// Topology +Object.defineProperty(Db.prototype, 'topology', { + enumerable: true, + get: function() { + return this.s.topology; + } +}); + +// Options +Object.defineProperty(Db.prototype, 'options', { + enumerable: true, + get: function() { + return this.s.options; + } +}); + +// slaveOk specified +Object.defineProperty(Db.prototype, 'slaveOk', { + enumerable: true, + get: function() { + if ( + this.s.options.readPreference != null && + (this.s.options.readPreference !== 'primary' || + this.s.options.readPreference.mode !== 'primary') + ) { + return true; + } + return false; + } +}); + +Object.defineProperty(Db.prototype, 'readConcern', { + enumerable: true, + get: function() { + return this.s.readConcern; + } +}); + +Object.defineProperty(Db.prototype, 'readPreference', { + enumerable: true, + get: function() { + if (this.s.readPreference == null) { + // TODO: check client + return ReadPreference.primary; + } + + return this.s.readPreference; + } +}); + +// get the write Concern +Object.defineProperty(Db.prototype, 'writeConcern', { + enumerable: true, + get: function() { + return this.s.writeConcern; + } +}); + +Object.defineProperty(Db.prototype, 'namespace', { + enumerable: true, + get: function() { + return this.s.namespace.toString(); + } +}); + +/** + * Execute a command + * @method + * @param {object} command The command hash + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.command = function(command, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = Object.assign({}, options); + + const commandOperation = new RunCommandOperation(this, command, options); + + return executeOperation(this.s.topology, commandOperation, callback); +}; + +/** + * Execute an aggregation framework pipeline against the database, needs MongoDB >= 3.6 + * @method + * @param {object} [pipeline=[]] Array containing all the aggregation framework commands for the execution. + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {number} [options.batchSize=1000] The number of documents to return per batch. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {object} [options.cursor] Return the query as cursor, on 2.6 > it returns as a real cursor on pre 2.6 it returns as an emulated cursor. + * @param {number} [options.cursor.batchSize=1000] Deprecated. Use `options.batchSize` + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output. + * @param {boolean} [options.allowDiskUse=false] allowDiskUse lets the server know if it can use disk to store temporary results for the aggregation (requires mongodb 2.6 >). + * @param {number} [options.maxTimeMS] maxTimeMS specifies a cumulative time limit in milliseconds for processing operations on the cursor. MongoDB interrupts the operation at the earliest following interrupt point. + * @param {number} [options.maxAwaitTimeMS] The maximum amount of time for the server to wait on new documents to satisfy a tailable cursor query. + * @param {boolean} [options.bypassDocumentValidation=false] Allow driver to bypass schema validation in MongoDB 3.2 or higher. + * @param {boolean} [options.raw=false] Return document results as raw BSON buffers. + * @param {boolean} [options.promoteLongs=true] Promotes Long values to number if they fit inside the 53 bits resolution. + * @param {boolean} [options.promoteValues=true] Promotes BSON values to native types where possible, set to false to only receive wrapper types. + * @param {boolean} [options.promoteBuffers=false] Promotes Binary BSON values to native Node Buffers. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {string} [options.comment] Add a comment to an aggregation command + * @param {string|object} [options.hint] Add an index selection hint to an aggregation command + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Database~aggregationCallback} callback The command result callback + * @return {(null|AggregationCursor)} + */ +Db.prototype.aggregate = function(pipeline, options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + // If we have no options or callback we are doing + // a cursor based aggregation + if (options == null && callback == null) { + options = {}; + } + + const cursor = new AggregationCursor( + this.s.topology, + new AggregateOperation(this, pipeline, options), + options + ); + + // TODO: remove this when NODE-2074 is resolved + if (typeof callback === 'function') { + callback(null, cursor); + return; + } + + return cursor; +}; + +/** + * Return the Admin db instance + * @method + * @return {Admin} return the new Admin db instance + */ +Db.prototype.admin = function() { + const Admin = require('./admin'); + + return new Admin(this, this.s.topology, this.s.promiseLibrary); +}; + +/** + * The callback format for the collection method, must be used if strict is specified + * @callback Db~collectionResultCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Collection} collection The collection instance. + */ + +/** + * The callback format for an aggregation call + * @callback Database~aggregationCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {AggregationCursor} cursor The cursor if the aggregation command was executed successfully. + */ + +const collectionKeys = [ + 'pkFactory', + 'readPreference', + 'serializeFunctions', + 'strict', + 'readConcern', + 'ignoreUndefined', + 'promoteValues', + 'promoteBuffers', + 'promoteLongs' +]; + +/** + * Fetch a specific collection (containing the actual collection information). If the application does not use strict mode you + * can use it without a callback in the following way: `const collection = db.collection('mycollection');` + * + * @method + * @param {string} name the collection name we wish to access. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.raw=false] Return document results as raw BSON buffers. + * @param {object} [options.pkFactory] A primary key factory object for generation of custom _id keys. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.strict=false] Returns an error if the collection does not exist + * @param {object} [options.readConcern] Specify a read concern for the collection. (only MongoDB 3.2 or higher supported) + * @param {ReadConcernLevel} [options.readConcern.level='local'] Specify a read concern level for the collection operations (only MongoDB 3.2 or higher supported) + * @param {Db~collectionResultCallback} [callback] The collection result callback + * @return {Collection} return the new Collection instance if not in strict mode + */ +Db.prototype.collection = function(name, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + options = Object.assign({}, options); + + // Set the promise library + options.promiseLibrary = this.s.promiseLibrary; + + // If we have not set a collection level readConcern set the db level one + options.readConcern = options.readConcern + ? new ReadConcern(options.readConcern.level) + : this.readConcern; + + // Do we have ignoreUndefined set + if (this.s.options.ignoreUndefined) { + options.ignoreUndefined = this.s.options.ignoreUndefined; + } + + // Merge in all needed options and ensure correct writeConcern merging from db level + options = mergeOptionsAndWriteConcern(options, this.s.options, collectionKeys, true); + + // Execute + if (options == null || !options.strict) { + try { + const collection = new Collection( + this, + this.s.topology, + this.databaseName, + name, + this.s.pkFactory, + options + ); + if (callback) callback(null, collection); + return collection; + } catch (err) { + if (err instanceof MongoError && callback) return callback(err); + throw err; + } + } + + // Strict mode + if (typeof callback !== 'function') { + throw toError(`A callback is required in strict mode. While getting collection ${name}`); + } + + // Did the user destroy the topology + if (this.serverConfig && this.serverConfig.isDestroyed()) { + return callback(new MongoError('topology was destroyed')); + } + + const listCollectionOptions = Object.assign({}, options, { nameOnly: true }); + + // Strict mode + this.listCollections({ name: name }, listCollectionOptions).toArray((err, collections) => { + if (err != null) return handleCallback(callback, err, null); + if (collections.length === 0) + return handleCallback( + callback, + toError(`Collection ${name} does not exist. Currently in strict mode.`), + null + ); + + try { + return handleCallback( + callback, + null, + new Collection(this, this.s.topology, this.databaseName, name, this.s.pkFactory, options) + ); + } catch (err) { + return handleCallback(callback, err, null); + } + }); +}; + +/** + * Create a new collection on a server with the specified options. Use this to create capped collections. + * More information about command options available at https://docs.mongodb.com/manual/reference/command/create/ + * + * @method + * @param {string} name the collection name we wish to access. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.raw=false] Return document results as raw BSON buffers. + * @param {object} [options.pkFactory] A primary key factory object for generation of custom _id keys. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object. + * @param {boolean} [options.strict=false] DEPRECATED: Returns an error if the collection does not exist + * @param {boolean} [options.capped=false] Create a capped collection. + * @param {boolean} [options.autoIndexId=true] DEPRECATED: Create an index on the _id field of the document, True by default on MongoDB 2.6 - 3.0 + * @param {number} [options.size] The size of the capped collection in bytes. + * @param {number} [options.max] The maximum number of documents in the capped collection. + * @param {number} [options.flags] Optional. Available for the MMAPv1 storage engine only to set the usePowerOf2Sizes and the noPadding flag. + * @param {object} [options.storageEngine] Allows users to specify configuration to the storage engine on a per-collection basis when creating a collection on MongoDB 3.0 or higher. + * @param {object} [options.validator] Allows users to specify validation rules or expressions for the collection. For more information, see Document Validation on MongoDB 3.2 or higher. + * @param {string} [options.validationLevel] Determines how strictly MongoDB applies the validation rules to existing documents during an update on MongoDB 3.2 or higher. + * @param {string} [options.validationAction] Determines whether to error on invalid documents or just warn about the violations but allow invalid documents to be inserted on MongoDB 3.2 or higher. + * @param {object} [options.indexOptionDefaults] Allows users to specify a default configuration for indexes when creating a collection on MongoDB 3.2 or higher. + * @param {string} [options.viewOn] The name of the source collection or view from which to create the view. The name is not the full namespace of the collection or view; i.e. does not include the database name and implies the same database as the view to create on MongoDB 3.4 or higher. + * @param {array} [options.pipeline] An array that consists of the aggregation pipeline stage. Creates the view by applying the specified pipeline to the viewOn collection or view on MongoDB 3.4 or higher. + * @param {object} [options.collation] Specify collation (MongoDB 3.4 or higher) settings for update operation (see 3.4 documentation for available fields). + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~collectionResultCallback} [callback] The results callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.createCollection = deprecateOptions( + { + name: 'Db.createCollection', + deprecatedOptions: ['autoIndexId', 'strict', 'w', 'wtimeout', 'j'], + optionsIndex: 1 + }, + function(name, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + options.promiseLibrary = options.promiseLibrary || this.s.promiseLibrary; + options.readConcern = options.readConcern + ? new ReadConcern(options.readConcern.level) + : this.readConcern; + const createCollectionOperation = new CreateCollectionOperation(this, name, options); + + return executeOperation(this.s.topology, createCollectionOperation, callback); + } +); + +/** + * Get all the db statistics. + * + * @method + * @param {object} [options] Optional settings. + * @param {number} [options.scale] Divide the returned sizes by scale value. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The collection result callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.stats = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + // Build command object + const commandObject = { dbStats: true }; + // Check if we have the scale value + if (options['scale'] != null) commandObject['scale'] = options['scale']; + + // If we have a readPreference set + if (options.readPreference == null && this.s.readPreference) { + options.readPreference = this.s.readPreference; + } + + const statsOperation = new CommandOperation(this, options, null, commandObject); + + // Execute the command + return executeOperation(this.s.topology, statsOperation, callback); +}; + +/** + * Get the list of all collection information for the specified db. + * + * @method + * @param {object} [filter={}] Query to filter collections by + * @param {object} [options] Optional settings. + * @param {boolean} [options.nameOnly=false] Since 4.0: If true, will only return the collection name in the response, and will omit additional info + * @param {number} [options.batchSize=1000] The batchSize for the returned command cursor or if pre 2.8 the systems batch collection + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {ClientSession} [options.session] optional session to use for this operation + * @return {CommandCursor} + */ +Db.prototype.listCollections = function(filter, options) { + filter = filter || {}; + options = options || {}; + + return new CommandCursor( + this.s.topology, + new ListCollectionsOperation(this, filter, options), + options + ); +}; + +/** + * Evaluate JavaScript on the server + * + * @method + * @param {Code} code JavaScript to execute on server. + * @param {(object|array)} parameters The parameters for the call. + * @param {object} [options] Optional settings. + * @param {boolean} [options.nolock=false] Tell MongoDB not to block on the evaluation of the javascript. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The results callback + * @deprecated Eval is deprecated on MongoDB 3.2 and forward + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.eval = deprecate(function(code, parameters, options, callback) { + const args = Array.prototype.slice.call(arguments, 1); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + parameters = args.length ? args.shift() : parameters; + options = args.length ? args.shift() || {} : {}; + + return executeLegacyOperation(this.s.topology, evaluate, [ + this, + code, + parameters, + options, + callback + ]); +}, 'Db.eval is deprecated as of MongoDB version 3.2'); + +/** + * Rename a collection. + * + * @method + * @param {string} fromCollection Name of current collection to rename. + * @param {string} toCollection New name of of the collection. + * @param {object} [options] Optional settings. + * @param {boolean} [options.dropTarget=false] Drop the target name collection if it previously exists. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~collectionResultCallback} [callback] The results callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.renameCollection = function(fromCollection, toCollection, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = Object.assign({}, options, { readPreference: ReadPreference.PRIMARY }); + + // Add return new collection + options.new_collection = true; + + const renameOperation = new RenameOperation( + this.collection(fromCollection), + toCollection, + options + ); + + return executeOperation(this.s.topology, renameOperation, callback); +}; + +/** + * Drop a collection from the database, removing it permanently. New accesses will create a new collection. + * + * @method + * @param {string} name Name of collection to drop + * @param {Object} [options] Optional settings + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The results callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.dropCollection = function(name, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const dropCollectionOperation = new DropCollectionOperation(this, name, options); + + return executeOperation(this.s.topology, dropCollectionOperation, callback); +}; + +/** + * Drop a database, removing it permanently from the server. + * + * @method + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The results callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.dropDatabase = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const dropDatabaseOperation = new DropDatabaseOperation(this, options); + + return executeOperation(this.s.topology, dropDatabaseOperation, callback); +}; + +/** + * Fetch all collections for the current db. + * + * @method + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~collectionsResultCallback} [callback] The results callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.collections = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const collectionsOperation = new CollectionsOperation(this, options); + + return executeOperation(this.s.topology, collectionsOperation, callback); +}; + +/** + * Runs a command on the database as admin. + * @method + * @param {object} command The command hash + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.executeDbAdminCommand = function(selector, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + options.readPreference = ReadPreference.resolve(this, options); + + const executeDbAdminCommandOperation = new ExecuteDbAdminCommandOperation( + this, + selector, + options + ); + + return executeOperation(this.s.topology, executeDbAdminCommandOperation, callback); +}; + +/** + * Creates an index on the db and collection. + * @method + * @param {string} name Name of the collection to create the index on. + * @param {(string|object)} fieldOrSpec Defines the index. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.unique=false] Creates an unique index. + * @param {boolean} [options.sparse=false] Creates a sparse index. + * @param {boolean} [options.background=false] Creates the index in the background, yielding whenever possible. + * @param {boolean} [options.dropDups=false] A unique index cannot be created on a key that has pre-existing duplicate values. If you would like to create the index anyway, keeping the first document the database indexes and deleting all subsequent documents that have duplicate value + * @param {number} [options.min] For geospatial indexes set the lower bound for the co-ordinates. + * @param {number} [options.max] For geospatial indexes set the high bound for the co-ordinates. + * @param {number} [options.v] Specify the format version of the indexes. + * @param {number} [options.expireAfterSeconds] Allows you to expire data on indexes applied to a data (MongoDB 2.2 or higher) + * @param {string} [options.name] Override the autogenerated index name (useful if the resulting name is larger than 128 bytes) + * @param {object} [options.partialFilterExpression] Creates a partial index based on the given filter object (MongoDB 3.2 or higher) + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {(number|string)} [options.commitQuorum] (MongoDB 4.4. or higher) Specifies how many data-bearing members of a replica set, including the primary, must complete the index builds successfully before the primary marks the indexes as ready. This option accepts the same values for the "w" field in a write concern plus "votingMembers", which indicates all voting data-bearing nodes. + * @param {Db~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.createIndex = function(name, fieldOrSpec, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options ? Object.assign({}, options) : {}; + + const createIndexesOperation = new CreateIndexesOperation(this, name, fieldOrSpec, options); + + return executeOperation(this.s.topology, createIndexesOperation, callback); +}; + +/** + * Ensures that an index exists, if it does not it creates it + * @method + * @deprecated since version 2.0 + * @param {string} name The index name + * @param {(string|object)} fieldOrSpec Defines the index. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.unique=false] Creates an unique index. + * @param {boolean} [options.sparse=false] Creates a sparse index. + * @param {boolean} [options.background=false] Creates the index in the background, yielding whenever possible. + * @param {boolean} [options.dropDups=false] A unique index cannot be created on a key that has pre-existing duplicate values. If you would like to create the index anyway, keeping the first document the database indexes and deleting all subsequent documents that have duplicate value + * @param {number} [options.min] For geospatial indexes set the lower bound for the co-ordinates. + * @param {number} [options.max] For geospatial indexes set the high bound for the co-ordinates. + * @param {number} [options.v] Specify the format version of the indexes. + * @param {number} [options.expireAfterSeconds] Allows you to expire data on indexes applied to a data (MongoDB 2.2 or higher) + * @param {number} [options.name] Override the autogenerated index name (useful if the resulting name is larger than 128 bytes) + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.ensureIndex = deprecate(function(name, fieldOrSpec, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + return executeLegacyOperation(this.s.topology, ensureIndex, [ + this, + name, + fieldOrSpec, + options, + callback + ]); +}, 'Db.ensureIndex is deprecated as of MongoDB version 3.0 / driver version 2.0'); + +Db.prototype.addChild = function(db) { + if (this.s.parentDb) return this.s.parentDb.addChild(db); + this.s.children.push(db); +}; + +/** + * Add a user to the database. + * @method + * @param {string} username The username. + * @param {string} password The password. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {object} [options.customData] Custom data associated with the user (only Mongodb 2.6 or higher) + * @param {object[]} [options.roles] Roles associated with the created user (only Mongodb 2.6 or higher) + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.addUser = function(username, password, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + // Special case where there is no password ($external users) + if (typeof username === 'string' && password != null && typeof password === 'object') { + options = password; + password = null; + } + + const addUserOperation = new AddUserOperation(this, username, password, options); + + return executeOperation(this.s.topology, addUserOperation, callback); +}; + +/** + * Remove a user from a database + * @method + * @param {string} username The username. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.removeUser = function(username, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const removeUserOperation = new RemoveUserOperation(this, username, options); + + return executeOperation(this.s.topology, removeUserOperation, callback); +}; + +/** + * Set the current profiling level of MongoDB + * + * @param {string} level The new profiling level (off, slow_only, all). + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The command result callback. + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.setProfilingLevel = function(level, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const setProfilingLevelOperation = new SetProfilingLevelOperation(this, level, options); + + return executeOperation(this.s.topology, setProfilingLevelOperation, callback); +}; + +/** + * Retrieve the current profiling information for MongoDB + * + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The command result callback. + * @return {Promise} returns Promise if no callback passed + * @deprecated Query the system.profile collection directly. + */ +Db.prototype.profilingInfo = deprecate(function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + return executeLegacyOperation(this.s.topology, profilingInfo, [this, options, callback]); +}, 'Db.profilingInfo is deprecated. Query the system.profile collection directly.'); + +/** + * Retrieve the current profiling Level for MongoDB + * + * @param {Object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.profilingLevel = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const profilingLevelOperation = new ProfilingLevelOperation(this, options); + + return executeOperation(this.s.topology, profilingLevelOperation, callback); +}; + +/** + * Retrieves this collections index info. + * @method + * @param {string} name The name of the collection. + * @param {object} [options] Optional settings. + * @param {boolean} [options.full=false] Returns the full raw index information. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {Db~resultCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +Db.prototype.indexInformation = function(name, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + const indexInformationOperation = new IndexInformationOperation(this, name, options); + + return executeOperation(this.s.topology, indexInformationOperation, callback); +}; + +/** + * Unref all sockets + * @method + */ +Db.prototype.unref = function() { + this.s.topology.unref(); +}; + +/** + * Create a new Change Stream, watching for new changes (insertions, updates, replacements, deletions, and invalidations) in this database. Will ignore all changes to system collections. + * @method + * @since 3.1.0 + * @param {Array} [pipeline] An array of {@link https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/|aggregation pipeline stages} through which to pass change stream documents. This allows for filtering (using $match) and manipulating the change stream documents. + * @param {object} [options] Optional settings + * @param {string} [options.fullDocument='default'] Allowed values: ‘default’, ‘updateLookup’. When set to ‘updateLookup’, the change stream will include both a delta describing the changes to the document, as well as a copy of the entire document that was changed from some time after the change occurred. + * @param {object} [options.resumeAfter] Specifies the logical starting point for the new change stream. This should be the _id field from a previously returned change stream document. + * @param {number} [options.maxAwaitTimeMS] The maximum amount of time for the server to wait on new documents to satisfy a change stream query + * @param {number} [options.batchSize=1000] The number of documents to return per batch. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {object} [options.collation] Specify collation settings for operation. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {ReadPreference} [options.readPreference] The read preference. Defaults to the read preference of the database. See {@link https://docs.mongodb.com/manual/reference/read-preference|read preference documentation}. + * @param {Timestamp} [options.startAtOperationTime] receive change events that occur after the specified timestamp + * @param {ClientSession} [options.session] optional session to use for this operation + * @return {ChangeStream} a ChangeStream instance. + */ +Db.prototype.watch = function(pipeline, options) { + pipeline = pipeline || []; + options = options || {}; + + // Allow optionally not specifying a pipeline + if (!Array.isArray(pipeline)) { + options = pipeline; + pipeline = []; + } + + return new ChangeStream(this, pipeline, options); +}; + +/** + * Return the db logger + * @method + * @return {Logger} return the db logger + * @ignore + */ +Db.prototype.getLogger = function() { + return this.s.logger; +}; + +/** + * Db close event + * + * Emitted after a socket closed against a single server or mongos proxy. + * + * @event Db#close + * @type {MongoError} + */ + +/** + * Db reconnect event + * + * * Server: Emitted when the driver has reconnected and re-authenticated. + * * ReplicaSet: N/A + * * Mongos: Emitted when the driver reconnects and re-authenticates successfully against a Mongos. + * + * @event Db#reconnect + * @type {object} + */ + +/** + * Db error event + * + * Emitted after an error occurred against a single server or mongos proxy. + * + * @event Db#error + * @type {MongoError} + */ + +/** + * Db timeout event + * + * Emitted after a socket timeout occurred against a single server or mongos proxy. + * + * @event Db#timeout + * @type {MongoError} + */ + +/** + * Db parseError event + * + * The parseError event is emitted if the driver detects illegal or corrupt BSON being received from the server. + * + * @event Db#parseError + * @type {MongoError} + */ + +/** + * Db fullsetup event, emitted when all servers in the topology have been connected to at start up time. + * + * * Server: Emitted when the driver has connected to the single server and has authenticated. + * * ReplSet: Emitted after the driver has attempted to connect to all replicaset members. + * * Mongos: Emitted after the driver has attempted to connect to all mongos proxies. + * + * @event Db#fullsetup + * @type {Db} + */ + +// Constants +Db.SYSTEM_NAMESPACE_COLLECTION = CONSTANTS.SYSTEM_NAMESPACE_COLLECTION; +Db.SYSTEM_INDEX_COLLECTION = CONSTANTS.SYSTEM_INDEX_COLLECTION; +Db.SYSTEM_PROFILE_COLLECTION = CONSTANTS.SYSTEM_PROFILE_COLLECTION; +Db.SYSTEM_USER_COLLECTION = CONSTANTS.SYSTEM_USER_COLLECTION; +Db.SYSTEM_COMMAND_COLLECTION = CONSTANTS.SYSTEM_COMMAND_COLLECTION; +Db.SYSTEM_JS_COLLECTION = CONSTANTS.SYSTEM_JS_COLLECTION; + +module.exports = Db; diff --git a/node_modules/mongodb/lib/dynamic_loaders.js b/node_modules/mongodb/lib/dynamic_loaders.js new file mode 100644 index 00000000..c4610023 --- /dev/null +++ b/node_modules/mongodb/lib/dynamic_loaders.js @@ -0,0 +1,32 @@ +'use strict'; + +let collection; +let cursor; +let db; + +function loadCollection() { + if (!collection) { + collection = require('./collection'); + } + return collection; +} + +function loadCursor() { + if (!cursor) { + cursor = require('./cursor'); + } + return cursor; +} + +function loadDb() { + if (!db) { + db = require('./db'); + } + return db; +} + +module.exports = { + loadCollection, + loadCursor, + loadDb +}; diff --git a/node_modules/mongodb/lib/error.js b/node_modules/mongodb/lib/error.js new file mode 100644 index 00000000..b2d026ce --- /dev/null +++ b/node_modules/mongodb/lib/error.js @@ -0,0 +1,43 @@ +'use strict'; + +const MongoNetworkError = require('./core').MongoNetworkError; + +// From spec@https://github.com/mongodb/specifications/blob/f93d78191f3db2898a59013a7ed5650352ef6da8/source/change-streams/change-streams.rst#resumable-error +const GET_MORE_RESUMABLE_CODES = new Set([ + 6, // HostUnreachable + 7, // HostNotFound + 89, // NetworkTimeout + 91, // ShutdownInProgress + 189, // PrimarySteppedDown + 262, // ExceededTimeLimit + 9001, // SocketException + 10107, // NotMaster + 11600, // InterruptedAtShutdown + 11602, // InterruptedDueToReplStateChange + 13435, // NotMasterNoSlaveOk + 13436, // NotMasterOrSecondary + 63, // StaleShardVersion + 150, // StaleEpoch + 13388, // StaleConfig + 234, // RetryChangeStream + 133, // FailedToSatisfyReadPreference + 43 // CursorNotFound +]); + +function isResumableError(error, wireVersion) { + if (error instanceof MongoNetworkError) { + return true; + } + + if (wireVersion >= 9) { + // DRIVERS-1308: For 4.4 drivers running against 4.4 servers, drivers will add a special case to treat the CursorNotFound error code as resumable + if (error.code === 43) { + return true; + } + return error.hasErrorLabel('ResumableChangeStreamError'); + } + + return GET_MORE_RESUMABLE_CODES.has(error.code); +} + +module.exports = { GET_MORE_RESUMABLE_CODES, isResumableError }; diff --git a/node_modules/mongodb/lib/explain.js b/node_modules/mongodb/lib/explain.js new file mode 100644 index 00000000..14ec6f43 --- /dev/null +++ b/node_modules/mongodb/lib/explain.js @@ -0,0 +1,55 @@ +'use strict'; + +const MongoError = require('./core/error').MongoError; + +const ExplainVerbosity = { + queryPlanner: 'queryPlanner', + queryPlannerExtended: 'queryPlannerExtended', + executionStats: 'executionStats', + allPlansExecution: 'allPlansExecution' +}; + +/** + * @class + * @property {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'} verbosity The verbosity mode for the explain output. + */ +class Explain { + /** + * Constructs an Explain from the explain verbosity. + * + * For backwards compatibility, true is interpreted as "allPlansExecution" + * and false as "queryPlanner". Prior to server version 3.6, aggregate() + * ignores the verbosity parameter and executes in "queryPlanner". + * + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [verbosity] The verbosity mode for the explain output. + */ + constructor(verbosity) { + if (typeof verbosity === 'boolean') { + this.verbosity = verbosity ? 'allPlansExecution' : 'queryPlanner'; + } else { + this.verbosity = verbosity; + } + } + + /** + * Construct an Explain given an options object. + * + * @param {object} [options] The options object from which to extract the explain. + * @param {'queryPlanner'|'queryPlannerExtended'|'executionStats'|'allPlansExecution'|boolean} [options.explain] The verbosity mode for the explain output + * @return {Explain} + */ + static fromOptions(options) { + if (options == null || options.explain === undefined) { + return; + } + + const explain = options.explain; + if (typeof explain === 'boolean' || explain in ExplainVerbosity) { + return new Explain(options.explain); + } + + throw new MongoError(`explain must be one of ${Object.keys(ExplainVerbosity)} or a boolean`); + } +} + +module.exports = { Explain }; diff --git a/node_modules/mongodb/lib/gridfs-stream/download.js b/node_modules/mongodb/lib/gridfs-stream/download.js new file mode 100644 index 00000000..0aab5dc3 --- /dev/null +++ b/node_modules/mongodb/lib/gridfs-stream/download.js @@ -0,0 +1,433 @@ +'use strict'; + +var stream = require('stream'), + util = require('util'); + +module.exports = GridFSBucketReadStream; + +/** + * A readable stream that enables you to read buffers from GridFS. + * + * Do not instantiate this class directly. Use `openDownloadStream()` instead. + * + * @class + * @extends external:Readable + * @param {Collection} chunks Handle for chunks collection + * @param {Collection} files Handle for files collection + * @param {Object} readPreference The read preference to use + * @param {Object} filter The query to use to find the file document + * @param {Object} [options] Optional settings. + * @param {Number} [options.sort] Optional sort for the file find query + * @param {Number} [options.skip] Optional skip for the file find query + * @param {Number} [options.start] Optional 0-based offset in bytes to start streaming from + * @param {Number} [options.end] Optional 0-based offset in bytes to stop streaming before + * @fires GridFSBucketReadStream#error + * @fires GridFSBucketReadStream#file + */ +function GridFSBucketReadStream(chunks, files, readPreference, filter, options) { + this.s = { + bytesRead: 0, + chunks: chunks, + cursor: null, + expected: 0, + files: files, + filter: filter, + init: false, + expectedEnd: 0, + file: null, + options: options, + readPreference: readPreference + }; + + stream.Readable.call(this); +} + +util.inherits(GridFSBucketReadStream, stream.Readable); + +/** + * An error occurred + * + * @event GridFSBucketReadStream#error + * @type {Error} + */ + +/** + * Fires when the stream loaded the file document corresponding to the + * provided id. + * + * @event GridFSBucketReadStream#file + * @type {object} + */ + +/** + * Emitted when a chunk of data is available to be consumed. + * + * @event GridFSBucketReadStream#data + * @type {object} + */ + +/** + * Fired when the stream is exhausted (no more data events). + * + * @event GridFSBucketReadStream#end + * @type {object} + */ + +/** + * Fired when the stream is exhausted and the underlying cursor is killed + * + * @event GridFSBucketReadStream#close + * @type {object} + */ + +/** + * Reads from the cursor and pushes to the stream. + * Private Impl, do not call directly + * @ignore + * @method + */ + +GridFSBucketReadStream.prototype._read = function() { + var _this = this; + if (this.destroyed) { + return; + } + + waitForFile(_this, function() { + doRead(_this); + }); +}; + +/** + * Sets the 0-based offset in bytes to start streaming from. Throws + * an error if this stream has entered flowing mode + * (e.g. if you've already called `on('data')`) + * @method + * @param {Number} start Offset in bytes to start reading at + * @return {GridFSBucketReadStream} Reference to Self + */ + +GridFSBucketReadStream.prototype.start = function(start) { + throwIfInitialized(this); + this.s.options.start = start; + return this; +}; + +/** + * Sets the 0-based offset in bytes to start streaming from. Throws + * an error if this stream has entered flowing mode + * (e.g. if you've already called `on('data')`) + * @method + * @param {Number} end Offset in bytes to stop reading at + * @return {GridFSBucketReadStream} Reference to self + */ + +GridFSBucketReadStream.prototype.end = function(end) { + throwIfInitialized(this); + this.s.options.end = end; + return this; +}; + +/** + * Marks this stream as aborted (will never push another `data` event) + * and kills the underlying cursor. Will emit the 'end' event, and then + * the 'close' event once the cursor is successfully killed. + * + * @method + * @param {GridFSBucket~errorCallback} [callback] called when the cursor is successfully closed or an error occurred. + * @fires GridFSBucketWriteStream#close + * @fires GridFSBucketWriteStream#end + */ + +GridFSBucketReadStream.prototype.abort = function(callback) { + var _this = this; + this.push(null); + this.destroyed = true; + if (this.s.cursor) { + this.s.cursor.close(function(error) { + _this.emit('close'); + callback && callback(error); + }); + } else { + if (!this.s.init) { + // If not initialized, fire close event because we will never + // get a cursor + _this.emit('close'); + } + callback && callback(); + } +}; + +/** + * @ignore + */ + +function throwIfInitialized(self) { + if (self.s.init) { + throw new Error('You cannot change options after the stream has entered' + 'flowing mode!'); + } +} + +/** + * @ignore + */ + +function doRead(_this) { + if (_this.destroyed) { + return; + } + + _this.s.cursor.next(function(error, doc) { + if (_this.destroyed) { + return; + } + if (error) { + return __handleError(_this, error); + } + if (!doc) { + _this.push(null); + + process.nextTick(() => { + _this.s.cursor.close(function(error) { + if (error) { + __handleError(_this, error); + return; + } + + _this.emit('close'); + }); + }); + + return; + } + + var bytesRemaining = _this.s.file.length - _this.s.bytesRead; + var expectedN = _this.s.expected++; + var expectedLength = Math.min(_this.s.file.chunkSize, bytesRemaining); + + if (doc.n > expectedN) { + var errmsg = 'ChunkIsMissing: Got unexpected n: ' + doc.n + ', expected: ' + expectedN; + return __handleError(_this, new Error(errmsg)); + } + + if (doc.n < expectedN) { + errmsg = 'ExtraChunk: Got unexpected n: ' + doc.n + ', expected: ' + expectedN; + return __handleError(_this, new Error(errmsg)); + } + + var buf = Buffer.isBuffer(doc.data) ? doc.data : doc.data.buffer; + + if (buf.length !== expectedLength) { + if (bytesRemaining <= 0) { + errmsg = 'ExtraChunk: Got unexpected n: ' + doc.n; + return __handleError(_this, new Error(errmsg)); + } + + errmsg = + 'ChunkIsWrongSize: Got unexpected length: ' + buf.length + ', expected: ' + expectedLength; + return __handleError(_this, new Error(errmsg)); + } + + _this.s.bytesRead += buf.length; + + if (buf.length === 0) { + return _this.push(null); + } + + var sliceStart = null; + var sliceEnd = null; + + if (_this.s.bytesToSkip != null) { + sliceStart = _this.s.bytesToSkip; + _this.s.bytesToSkip = 0; + } + + const atEndOfStream = expectedN === _this.s.expectedEnd - 1; + const bytesLeftToRead = _this.s.options.end - _this.s.bytesToSkip; + if (atEndOfStream && _this.s.bytesToTrim != null) { + sliceEnd = _this.s.file.chunkSize - _this.s.bytesToTrim; + } else if (_this.s.options.end && bytesLeftToRead < doc.data.length()) { + sliceEnd = bytesLeftToRead; + } + + if (sliceStart != null || sliceEnd != null) { + buf = buf.slice(sliceStart || 0, sliceEnd || buf.length); + } + + _this.push(buf); + }); +} + +/** + * @ignore + */ + +function init(self) { + var findOneOptions = {}; + if (self.s.readPreference) { + findOneOptions.readPreference = self.s.readPreference; + } + if (self.s.options && self.s.options.sort) { + findOneOptions.sort = self.s.options.sort; + } + if (self.s.options && self.s.options.skip) { + findOneOptions.skip = self.s.options.skip; + } + + self.s.files.findOne(self.s.filter, findOneOptions, function(error, doc) { + if (error) { + return __handleError(self, error); + } + + if (!doc) { + var identifier = self.s.filter._id ? self.s.filter._id.toString() : self.s.filter.filename; + var errmsg = 'FileNotFound: file ' + identifier + ' was not found'; + var err = new Error(errmsg); + err.code = 'ENOENT'; + return __handleError(self, err); + } + + // If document is empty, kill the stream immediately and don't + // execute any reads + if (doc.length <= 0) { + self.push(null); + return; + } + + if (self.destroyed) { + // If user destroys the stream before we have a cursor, wait + // until the query is done to say we're 'closed' because we can't + // cancel a query. + self.emit('close'); + return; + } + + try { + self.s.bytesToSkip = handleStartOption(self, doc, self.s.options); + } catch (error) { + return __handleError(self, error); + } + + var filter = { files_id: doc._id }; + + // Currently (MongoDB 3.4.4) skip function does not support the index, + // it needs to retrieve all the documents first and then skip them. (CS-25811) + // As work around we use $gte on the "n" field. + if (self.s.options && self.s.options.start != null) { + var skip = Math.floor(self.s.options.start / doc.chunkSize); + if (skip > 0) { + filter['n'] = { $gte: skip }; + } + } + self.s.cursor = self.s.chunks.find(filter).sort({ n: 1 }); + + if (self.s.readPreference) { + self.s.cursor.setReadPreference(self.s.readPreference); + } + + self.s.expectedEnd = Math.ceil(doc.length / doc.chunkSize); + self.s.file = doc; + + try { + self.s.bytesToTrim = handleEndOption(self, doc, self.s.cursor, self.s.options); + } catch (error) { + return __handleError(self, error); + } + + self.emit('file', doc); + }); +} + +/** + * @ignore + */ + +function waitForFile(_this, callback) { + if (_this.s.file) { + return callback(); + } + + if (!_this.s.init) { + init(_this); + _this.s.init = true; + } + + _this.once('file', function() { + callback(); + }); +} + +/** + * @ignore + */ + +function handleStartOption(stream, doc, options) { + if (options && options.start != null) { + if (options.start > doc.length) { + throw new Error( + 'Stream start (' + + options.start + + ') must not be ' + + 'more than the length of the file (' + + doc.length + + ')' + ); + } + if (options.start < 0) { + throw new Error('Stream start (' + options.start + ') must not be ' + 'negative'); + } + if (options.end != null && options.end < options.start) { + throw new Error( + 'Stream start (' + + options.start + + ') must not be ' + + 'greater than stream end (' + + options.end + + ')' + ); + } + + stream.s.bytesRead = Math.floor(options.start / doc.chunkSize) * doc.chunkSize; + stream.s.expected = Math.floor(options.start / doc.chunkSize); + + return options.start - stream.s.bytesRead; + } +} + +/** + * @ignore + */ + +function handleEndOption(stream, doc, cursor, options) { + if (options && options.end != null) { + if (options.end > doc.length) { + throw new Error( + 'Stream end (' + + options.end + + ') must not be ' + + 'more than the length of the file (' + + doc.length + + ')' + ); + } + if (options.start < 0) { + throw new Error('Stream end (' + options.end + ') must not be ' + 'negative'); + } + + var start = options.start != null ? Math.floor(options.start / doc.chunkSize) : 0; + + cursor.limit(Math.ceil(options.end / doc.chunkSize) - start); + + stream.s.expectedEnd = Math.ceil(options.end / doc.chunkSize); + + return Math.ceil(options.end / doc.chunkSize) * doc.chunkSize - options.end; + } +} + +/** + * @ignore + */ + +function __handleError(_this, error) { + _this.emit('error', error); +} diff --git a/node_modules/mongodb/lib/gridfs-stream/index.js b/node_modules/mongodb/lib/gridfs-stream/index.js new file mode 100644 index 00000000..65098395 --- /dev/null +++ b/node_modules/mongodb/lib/gridfs-stream/index.js @@ -0,0 +1,359 @@ +'use strict'; + +var Emitter = require('events').EventEmitter; +var GridFSBucketReadStream = require('./download'); +var GridFSBucketWriteStream = require('./upload'); +var shallowClone = require('../utils').shallowClone; +var toError = require('../utils').toError; +var util = require('util'); +var executeLegacyOperation = require('../utils').executeLegacyOperation; + +var DEFAULT_GRIDFS_BUCKET_OPTIONS = { + bucketName: 'fs', + chunkSizeBytes: 255 * 1024 +}; + +module.exports = GridFSBucket; + +/** + * Constructor for a streaming GridFS interface + * @class + * @extends external:EventEmitter + * @param {Db} db A db handle + * @param {object} [options] Optional settings. + * @param {string} [options.bucketName="fs"] The 'files' and 'chunks' collections will be prefixed with the bucket name followed by a dot. + * @param {number} [options.chunkSizeBytes=255 * 1024] Number of bytes stored in each chunk. Defaults to 255KB + * @param {object} [options.writeConcern] Optional write concern to be passed to write operations, for instance `{ w: 1 }` + * @param {object} [options.readPreference] Optional read preference to be passed to read operations + * @fires GridFSBucketWriteStream#index + */ + +function GridFSBucket(db, options) { + Emitter.apply(this); + this.setMaxListeners(0); + + if (options && typeof options === 'object') { + options = shallowClone(options); + var keys = Object.keys(DEFAULT_GRIDFS_BUCKET_OPTIONS); + for (var i = 0; i < keys.length; ++i) { + if (!options[keys[i]]) { + options[keys[i]] = DEFAULT_GRIDFS_BUCKET_OPTIONS[keys[i]]; + } + } + } else { + options = DEFAULT_GRIDFS_BUCKET_OPTIONS; + } + + this.s = { + db: db, + options: options, + _chunksCollection: db.collection(options.bucketName + '.chunks'), + _filesCollection: db.collection(options.bucketName + '.files'), + checkedIndexes: false, + calledOpenUploadStream: false, + promiseLibrary: db.s.promiseLibrary || Promise + }; +} + +util.inherits(GridFSBucket, Emitter); + +/** + * When the first call to openUploadStream is made, the upload stream will + * check to see if it needs to create the proper indexes on the chunks and + * files collections. This event is fired either when 1) it determines that + * no index creation is necessary, 2) when it successfully creates the + * necessary indexes. + * + * @event GridFSBucket#index + * @type {Error} + */ + +/** + * Returns a writable stream (GridFSBucketWriteStream) for writing + * buffers to GridFS. The stream's 'id' property contains the resulting + * file's id. + * @method + * @param {string} filename The value of the 'filename' key in the files doc + * @param {object} [options] Optional settings. + * @param {number} [options.chunkSizeBytes] Optional overwrite this bucket's chunkSizeBytes for this file + * @param {object} [options.metadata] Optional object to store in the file document's `metadata` field + * @param {string} [options.contentType] Optional string to store in the file document's `contentType` field + * @param {array} [options.aliases] Optional array of strings to store in the file document's `aliases` field + * @param {boolean} [options.disableMD5=false] If true, disables adding an md5 field to file data + * @return {GridFSBucketWriteStream} + */ + +GridFSBucket.prototype.openUploadStream = function(filename, options) { + if (options) { + options = shallowClone(options); + } else { + options = {}; + } + if (!options.chunkSizeBytes) { + options.chunkSizeBytes = this.s.options.chunkSizeBytes; + } + return new GridFSBucketWriteStream(this, filename, options); +}; + +/** + * Returns a writable stream (GridFSBucketWriteStream) for writing + * buffers to GridFS for a custom file id. The stream's 'id' property contains the resulting + * file's id. + * @method + * @param {string|number|object} id A custom id used to identify the file + * @param {string} filename The value of the 'filename' key in the files doc + * @param {object} [options] Optional settings. + * @param {number} [options.chunkSizeBytes] Optional overwrite this bucket's chunkSizeBytes for this file + * @param {object} [options.metadata] Optional object to store in the file document's `metadata` field + * @param {string} [options.contentType] Optional string to store in the file document's `contentType` field + * @param {array} [options.aliases] Optional array of strings to store in the file document's `aliases` field + * @param {boolean} [options.disableMD5=false] If true, disables adding an md5 field to file data + * @return {GridFSBucketWriteStream} + */ + +GridFSBucket.prototype.openUploadStreamWithId = function(id, filename, options) { + if (options) { + options = shallowClone(options); + } else { + options = {}; + } + + if (!options.chunkSizeBytes) { + options.chunkSizeBytes = this.s.options.chunkSizeBytes; + } + + options.id = id; + + return new GridFSBucketWriteStream(this, filename, options); +}; + +/** + * Returns a readable stream (GridFSBucketReadStream) for streaming file + * data from GridFS. + * @method + * @param {ObjectId} id The id of the file doc + * @param {Object} [options] Optional settings. + * @param {Number} [options.start] Optional 0-based offset in bytes to start streaming from + * @param {Number} [options.end] Optional 0-based offset in bytes to stop streaming before + * @return {GridFSBucketReadStream} + */ + +GridFSBucket.prototype.openDownloadStream = function(id, options) { + var filter = { _id: id }; + options = { + start: options && options.start, + end: options && options.end + }; + + return new GridFSBucketReadStream( + this.s._chunksCollection, + this.s._filesCollection, + this.s.options.readPreference, + filter, + options + ); +}; + +/** + * Deletes a file with the given id + * @method + * @param {ObjectId} id The id of the file doc + * @param {GridFSBucket~errorCallback} [callback] + */ + +GridFSBucket.prototype.delete = function(id, callback) { + return executeLegacyOperation(this.s.db.s.topology, _delete, [this, id, callback], { + skipSessions: true + }); +}; + +/** + * @ignore + */ + +function _delete(_this, id, callback) { + _this.s._filesCollection.deleteOne({ _id: id }, function(error, res) { + if (error) { + return callback(error); + } + + _this.s._chunksCollection.deleteMany({ files_id: id }, function(error) { + if (error) { + return callback(error); + } + + // Delete orphaned chunks before returning FileNotFound + if (!res.result.n) { + var errmsg = 'FileNotFound: no file with id ' + id + ' found'; + return callback(new Error(errmsg)); + } + + callback(); + }); + }); +} + +/** + * Convenience wrapper around find on the files collection + * @method + * @param {Object} filter + * @param {Object} [options] Optional settings for cursor + * @param {number} [options.batchSize=1000] The number of documents to return per batch. See {@link https://docs.mongodb.com/manual/reference/command/find|find command documentation}. + * @param {number} [options.limit] Optional limit for cursor + * @param {number} [options.maxTimeMS] Optional maxTimeMS for cursor + * @param {boolean} [options.noCursorTimeout] Optionally set cursor's `noCursorTimeout` flag + * @param {number} [options.skip] Optional skip for cursor + * @param {object} [options.sort] Optional sort for cursor + * @return {Cursor} + */ + +GridFSBucket.prototype.find = function(filter, options) { + filter = filter || {}; + options = options || {}; + + var cursor = this.s._filesCollection.find(filter); + + if (options.batchSize != null) { + cursor.batchSize(options.batchSize); + } + if (options.limit != null) { + cursor.limit(options.limit); + } + if (options.maxTimeMS != null) { + cursor.maxTimeMS(options.maxTimeMS); + } + if (options.noCursorTimeout != null) { + cursor.addCursorFlag('noCursorTimeout', options.noCursorTimeout); + } + if (options.skip != null) { + cursor.skip(options.skip); + } + if (options.sort != null) { + cursor.sort(options.sort); + } + + return cursor; +}; + +/** + * Returns a readable stream (GridFSBucketReadStream) for streaming the + * file with the given name from GridFS. If there are multiple files with + * the same name, this will stream the most recent file with the given name + * (as determined by the `uploadDate` field). You can set the `revision` + * option to change this behavior. + * @method + * @param {String} filename The name of the file to stream + * @param {Object} [options] Optional settings + * @param {number} [options.revision=-1] The revision number relative to the oldest file with the given filename. 0 gets you the oldest file, 1 gets you the 2nd oldest, -1 gets you the newest. + * @param {Number} [options.start] Optional 0-based offset in bytes to start streaming from + * @param {Number} [options.end] Optional 0-based offset in bytes to stop streaming before + * @return {GridFSBucketReadStream} + */ + +GridFSBucket.prototype.openDownloadStreamByName = function(filename, options) { + var sort = { uploadDate: -1 }; + var skip = null; + if (options && options.revision != null) { + if (options.revision >= 0) { + sort = { uploadDate: 1 }; + skip = options.revision; + } else { + skip = -options.revision - 1; + } + } + + var filter = { filename: filename }; + options = { + sort: sort, + skip: skip, + start: options && options.start, + end: options && options.end + }; + return new GridFSBucketReadStream( + this.s._chunksCollection, + this.s._filesCollection, + this.s.options.readPreference, + filter, + options + ); +}; + +/** + * Renames the file with the given _id to the given string + * @method + * @param {ObjectId} id the id of the file to rename + * @param {String} filename new name for the file + * @param {GridFSBucket~errorCallback} [callback] + */ + +GridFSBucket.prototype.rename = function(id, filename, callback) { + return executeLegacyOperation(this.s.db.s.topology, _rename, [this, id, filename, callback], { + skipSessions: true + }); +}; + +/** + * @ignore + */ + +function _rename(_this, id, filename, callback) { + var filter = { _id: id }; + var update = { $set: { filename: filename } }; + _this.s._filesCollection.updateOne(filter, update, function(error, res) { + if (error) { + return callback(error); + } + if (!res.result.n) { + return callback(toError('File with id ' + id + ' not found')); + } + callback(); + }); +} + +/** + * Removes this bucket's files collection, followed by its chunks collection. + * @method + * @param {GridFSBucket~errorCallback} [callback] + */ + +GridFSBucket.prototype.drop = function(callback) { + return executeLegacyOperation(this.s.db.s.topology, _drop, [this, callback], { + skipSessions: true + }); +}; + +/** + * Return the db logger + * @method + * @return {Logger} return the db logger + * @ignore + */ +GridFSBucket.prototype.getLogger = function() { + return this.s.db.s.logger; +}; + +/** + * @ignore + */ + +function _drop(_this, callback) { + _this.s._filesCollection.drop(function(error) { + if (error) { + return callback(error); + } + _this.s._chunksCollection.drop(function(error) { + if (error) { + return callback(error); + } + + return callback(); + }); + }); +} + +/** + * Callback format for all GridFSBucket methods that can accept a callback. + * @callback GridFSBucket~errorCallback + * @param {MongoError|undefined} error If present, an error instance representing any errors that occurred + * @param {*} result If present, a returned result for the method + */ diff --git a/node_modules/mongodb/lib/gridfs-stream/upload.js b/node_modules/mongodb/lib/gridfs-stream/upload.js new file mode 100644 index 00000000..b1e6f90e --- /dev/null +++ b/node_modules/mongodb/lib/gridfs-stream/upload.js @@ -0,0 +1,540 @@ +'use strict'; + +var core = require('../core'); +var crypto = require('crypto'); +var stream = require('stream'); +var util = require('util'); +var Buffer = require('safe-buffer').Buffer; + +var ERROR_NAMESPACE_NOT_FOUND = 26; + +module.exports = GridFSBucketWriteStream; + +/** + * A writable stream that enables you to write buffers to GridFS. + * + * Do not instantiate this class directly. Use `openUploadStream()` instead. + * + * @class + * @extends external:Writable + * @param {GridFSBucket} bucket Handle for this stream's corresponding bucket + * @param {string} filename The value of the 'filename' key in the files doc + * @param {object} [options] Optional settings. + * @param {string|number|object} [options.id] Custom file id for the GridFS file. + * @param {number} [options.chunkSizeBytes] The chunk size to use, in bytes + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.disableMD5=false] If true, disables adding an md5 field to file data + * @fires GridFSBucketWriteStream#error + * @fires GridFSBucketWriteStream#finish + */ + +function GridFSBucketWriteStream(bucket, filename, options) { + options = options || {}; + stream.Writable.call(this, options); + this.bucket = bucket; + this.chunks = bucket.s._chunksCollection; + this.filename = filename; + this.files = bucket.s._filesCollection; + this.options = options; + // Signals the write is all done + this.done = false; + + this.id = options.id ? options.id : core.BSON.ObjectId(); + this.chunkSizeBytes = this.options.chunkSizeBytes; + this.bufToStore = Buffer.alloc(this.chunkSizeBytes); + this.length = 0; + this.md5 = !options.disableMD5 && crypto.createHash('md5'); + this.n = 0; + this.pos = 0; + this.state = { + streamEnd: false, + outstandingRequests: 0, + errored: false, + aborted: false, + promiseLibrary: this.bucket.s.promiseLibrary + }; + + if (!this.bucket.s.calledOpenUploadStream) { + this.bucket.s.calledOpenUploadStream = true; + + var _this = this; + checkIndexes(this, function() { + _this.bucket.s.checkedIndexes = true; + _this.bucket.emit('index'); + }); + } +} + +util.inherits(GridFSBucketWriteStream, stream.Writable); + +/** + * An error occurred + * + * @event GridFSBucketWriteStream#error + * @type {Error} + */ + +/** + * `end()` was called and the write stream successfully wrote the file + * metadata and all the chunks to MongoDB. + * + * @event GridFSBucketWriteStream#finish + * @type {object} + */ + +/** + * Write a buffer to the stream. + * + * @method + * @param {Buffer} chunk Buffer to write + * @param {String} encoding Optional encoding for the buffer + * @param {GridFSBucket~errorCallback} callback Function to call when the chunk was added to the buffer, or if the entire chunk was persisted to MongoDB if this chunk caused a flush. + * @return {Boolean} False if this write required flushing a chunk to MongoDB. True otherwise. + */ + +GridFSBucketWriteStream.prototype.write = function(chunk, encoding, callback) { + var _this = this; + return waitForIndexes(this, function() { + return doWrite(_this, chunk, encoding, callback); + }); +}; + +/** + * Places this write stream into an aborted state (all future writes fail) + * and deletes all chunks that have already been written. + * + * @method + * @param {GridFSBucket~errorCallback} callback called when chunks are successfully removed or error occurred + * @return {Promise} if no callback specified + */ + +GridFSBucketWriteStream.prototype.abort = function(callback) { + if (this.state.streamEnd) { + var error = new Error('Cannot abort a stream that has already completed'); + if (typeof callback === 'function') { + return callback(error); + } + return this.state.promiseLibrary.reject(error); + } + if (this.state.aborted) { + error = new Error('Cannot call abort() on a stream twice'); + if (typeof callback === 'function') { + return callback(error); + } + return this.state.promiseLibrary.reject(error); + } + this.state.aborted = true; + this.chunks.deleteMany({ files_id: this.id }, function(error) { + if (typeof callback === 'function') callback(error); + }); +}; + +/** + * Tells the stream that no more data will be coming in. The stream will + * persist the remaining data to MongoDB, write the files document, and + * then emit a 'finish' event. + * + * @method + * @param {Buffer} chunk Buffer to write + * @param {String} encoding Optional encoding for the buffer + * @param {GridFSBucket~errorCallback} callback Function to call when all files and chunks have been persisted to MongoDB + */ + +GridFSBucketWriteStream.prototype.end = function(chunk, encoding, callback) { + var _this = this; + if (typeof chunk === 'function') { + (callback = chunk), (chunk = null), (encoding = null); + } else if (typeof encoding === 'function') { + (callback = encoding), (encoding = null); + } + + if (checkAborted(this, callback)) { + return; + } + this.state.streamEnd = true; + + if (callback) { + this.once('finish', function(result) { + callback(null, result); + }); + } + + if (!chunk) { + waitForIndexes(this, function() { + writeRemnant(_this); + }); + return; + } + + this.write(chunk, encoding, function() { + writeRemnant(_this); + }); +}; + +/** + * @ignore + */ + +function __handleError(_this, error, callback) { + if (_this.state.errored) { + return; + } + _this.state.errored = true; + if (callback) { + return callback(error); + } + _this.emit('error', error); +} + +/** + * @ignore + */ + +function createChunkDoc(filesId, n, data) { + return { + _id: core.BSON.ObjectId(), + files_id: filesId, + n: n, + data: data + }; +} + +/** + * @ignore + */ + +function checkChunksIndex(_this, callback) { + _this.chunks.listIndexes().toArray(function(error, indexes) { + if (error) { + // Collection doesn't exist so create index + if (error.code === ERROR_NAMESPACE_NOT_FOUND) { + var index = { files_id: 1, n: 1 }; + _this.chunks.createIndex(index, { background: false, unique: true }, function(error) { + if (error) { + return callback(error); + } + + callback(); + }); + return; + } + return callback(error); + } + + var hasChunksIndex = false; + indexes.forEach(function(index) { + if (index.key) { + var keys = Object.keys(index.key); + if (keys.length === 2 && index.key.files_id === 1 && index.key.n === 1) { + hasChunksIndex = true; + } + } + }); + + if (hasChunksIndex) { + callback(); + } else { + index = { files_id: 1, n: 1 }; + var indexOptions = getWriteOptions(_this); + + indexOptions.background = false; + indexOptions.unique = true; + + _this.chunks.createIndex(index, indexOptions, function(error) { + if (error) { + return callback(error); + } + + callback(); + }); + } + }); +} + +/** + * @ignore + */ + +function checkDone(_this, callback) { + if (_this.done) return true; + if (_this.state.streamEnd && _this.state.outstandingRequests === 0 && !_this.state.errored) { + // Set done so we dont' trigger duplicate createFilesDoc + _this.done = true; + // Create a new files doc + var filesDoc = createFilesDoc( + _this.id, + _this.length, + _this.chunkSizeBytes, + _this.md5 && _this.md5.digest('hex'), + _this.filename, + _this.options.contentType, + _this.options.aliases, + _this.options.metadata + ); + + if (checkAborted(_this, callback)) { + return false; + } + + _this.files.insertOne(filesDoc, getWriteOptions(_this), function(error) { + if (error) { + return __handleError(_this, error, callback); + } + _this.emit('finish', filesDoc); + }); + + return true; + } + + return false; +} + +/** + * @ignore + */ + +function checkIndexes(_this, callback) { + _this.files.findOne({}, { _id: 1 }, function(error, doc) { + if (error) { + return callback(error); + } + if (doc) { + return callback(); + } + + _this.files.listIndexes().toArray(function(error, indexes) { + if (error) { + // Collection doesn't exist so create index + if (error.code === ERROR_NAMESPACE_NOT_FOUND) { + var index = { filename: 1, uploadDate: 1 }; + _this.files.createIndex(index, { background: false }, function(error) { + if (error) { + return callback(error); + } + + checkChunksIndex(_this, callback); + }); + return; + } + return callback(error); + } + + var hasFileIndex = false; + indexes.forEach(function(index) { + var keys = Object.keys(index.key); + if (keys.length === 2 && index.key.filename === 1 && index.key.uploadDate === 1) { + hasFileIndex = true; + } + }); + + if (hasFileIndex) { + checkChunksIndex(_this, callback); + } else { + index = { filename: 1, uploadDate: 1 }; + + var indexOptions = getWriteOptions(_this); + + indexOptions.background = false; + + _this.files.createIndex(index, indexOptions, function(error) { + if (error) { + return callback(error); + } + + checkChunksIndex(_this, callback); + }); + } + }); + }); +} + +/** + * @ignore + */ + +function createFilesDoc(_id, length, chunkSize, md5, filename, contentType, aliases, metadata) { + var ret = { + _id: _id, + length: length, + chunkSize: chunkSize, + uploadDate: new Date(), + filename: filename + }; + + if (md5) { + ret.md5 = md5; + } + + if (contentType) { + ret.contentType = contentType; + } + + if (aliases) { + ret.aliases = aliases; + } + + if (metadata) { + ret.metadata = metadata; + } + + return ret; +} + +/** + * @ignore + */ + +function doWrite(_this, chunk, encoding, callback) { + if (checkAborted(_this, callback)) { + return false; + } + + var inputBuf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding); + + _this.length += inputBuf.length; + + // Input is small enough to fit in our buffer + if (_this.pos + inputBuf.length < _this.chunkSizeBytes) { + inputBuf.copy(_this.bufToStore, _this.pos); + _this.pos += inputBuf.length; + + callback && callback(); + + // Note that we reverse the typical semantics of write's return value + // to be compatible with node's `.pipe()` function. + // True means client can keep writing. + return true; + } + + // Otherwise, buffer is too big for current chunk, so we need to flush + // to MongoDB. + var inputBufRemaining = inputBuf.length; + var spaceRemaining = _this.chunkSizeBytes - _this.pos; + var numToCopy = Math.min(spaceRemaining, inputBuf.length); + var outstandingRequests = 0; + while (inputBufRemaining > 0) { + var inputBufPos = inputBuf.length - inputBufRemaining; + inputBuf.copy(_this.bufToStore, _this.pos, inputBufPos, inputBufPos + numToCopy); + _this.pos += numToCopy; + spaceRemaining -= numToCopy; + if (spaceRemaining === 0) { + if (_this.md5) { + _this.md5.update(_this.bufToStore); + } + var doc = createChunkDoc(_this.id, _this.n, Buffer.from(_this.bufToStore)); + ++_this.state.outstandingRequests; + ++outstandingRequests; + + if (checkAborted(_this, callback)) { + return false; + } + + _this.chunks.insertOne(doc, getWriteOptions(_this), function(error) { + if (error) { + return __handleError(_this, error); + } + --_this.state.outstandingRequests; + --outstandingRequests; + + if (!outstandingRequests) { + _this.emit('drain', doc); + callback && callback(); + checkDone(_this); + } + }); + + spaceRemaining = _this.chunkSizeBytes; + _this.pos = 0; + ++_this.n; + } + inputBufRemaining -= numToCopy; + numToCopy = Math.min(spaceRemaining, inputBufRemaining); + } + + // Note that we reverse the typical semantics of write's return value + // to be compatible with node's `.pipe()` function. + // False means the client should wait for the 'drain' event. + return false; +} + +/** + * @ignore + */ + +function getWriteOptions(_this) { + var obj = {}; + if (_this.options.writeConcern) { + obj.w = _this.options.writeConcern.w; + obj.wtimeout = _this.options.writeConcern.wtimeout; + obj.j = _this.options.writeConcern.j; + } + return obj; +} + +/** + * @ignore + */ + +function waitForIndexes(_this, callback) { + if (_this.bucket.s.checkedIndexes) { + return callback(false); + } + + _this.bucket.once('index', function() { + callback(true); + }); + + return true; +} + +/** + * @ignore + */ + +function writeRemnant(_this, callback) { + // Buffer is empty, so don't bother to insert + if (_this.pos === 0) { + return checkDone(_this, callback); + } + + ++_this.state.outstandingRequests; + + // Create a new buffer to make sure the buffer isn't bigger than it needs + // to be. + var remnant = Buffer.alloc(_this.pos); + _this.bufToStore.copy(remnant, 0, 0, _this.pos); + if (_this.md5) { + _this.md5.update(remnant); + } + var doc = createChunkDoc(_this.id, _this.n, remnant); + + // If the stream was aborted, do not write remnant + if (checkAborted(_this, callback)) { + return false; + } + + _this.chunks.insertOne(doc, getWriteOptions(_this), function(error) { + if (error) { + return __handleError(_this, error); + } + --_this.state.outstandingRequests; + checkDone(_this); + }); +} + +/** + * @ignore + */ + +function checkAborted(_this, callback) { + if (_this.state.aborted) { + if (typeof callback === 'function') { + callback(new Error('this stream has been aborted')); + } + return true; + } + return false; +} diff --git a/node_modules/mongodb/lib/gridfs/chunk.js b/node_modules/mongodb/lib/gridfs/chunk.js new file mode 100644 index 00000000..d276d720 --- /dev/null +++ b/node_modules/mongodb/lib/gridfs/chunk.js @@ -0,0 +1,236 @@ +'use strict'; + +var Binary = require('../core').BSON.Binary, + ObjectID = require('../core').BSON.ObjectID; + +var Buffer = require('safe-buffer').Buffer; + +/** + * Class for representing a single chunk in GridFS. + * + * @class + * + * @param file {GridStore} The {@link GridStore} object holding this chunk. + * @param mongoObject {object} The mongo object representation of this chunk. + * + * @throws Error when the type of data field for {@link mongoObject} is not + * supported. Currently supported types for data field are instances of + * {@link String}, {@link Array}, {@link Binary} and {@link Binary} + * from the bson module + * + * @see Chunk#buildMongoObject + */ +var Chunk = function(file, mongoObject, writeConcern) { + if (!(this instanceof Chunk)) return new Chunk(file, mongoObject); + + this.file = file; + var mongoObjectFinal = mongoObject == null ? {} : mongoObject; + this.writeConcern = writeConcern || { w: 1 }; + this.objectId = mongoObjectFinal._id == null ? new ObjectID() : mongoObjectFinal._id; + this.chunkNumber = mongoObjectFinal.n == null ? 0 : mongoObjectFinal.n; + this.data = new Binary(); + + if (typeof mongoObjectFinal.data === 'string') { + var buffer = Buffer.alloc(mongoObjectFinal.data.length); + buffer.write(mongoObjectFinal.data, 0, mongoObjectFinal.data.length, 'binary'); + this.data = new Binary(buffer); + } else if (Array.isArray(mongoObjectFinal.data)) { + buffer = Buffer.alloc(mongoObjectFinal.data.length); + var data = mongoObjectFinal.data.join(''); + buffer.write(data, 0, data.length, 'binary'); + this.data = new Binary(buffer); + } else if (mongoObjectFinal.data && mongoObjectFinal.data._bsontype === 'Binary') { + this.data = mongoObjectFinal.data; + } else if (!Buffer.isBuffer(mongoObjectFinal.data) && !(mongoObjectFinal.data == null)) { + throw Error('Illegal chunk format'); + } + + // Update position + this.internalPosition = 0; +}; + +/** + * Writes a data to this object and advance the read/write head. + * + * @param data {string} the data to write + * @param callback {function(*, GridStore)} This will be called after executing + * this method. The first parameter will contain null and the second one + * will contain a reference to this object. + */ +Chunk.prototype.write = function(data, callback) { + this.data.write(data, this.internalPosition, data.length, 'binary'); + this.internalPosition = this.data.length(); + if (callback != null) return callback(null, this); + return this; +}; + +/** + * Reads data and advances the read/write head. + * + * @param length {number} The length of data to read. + * + * @return {string} The data read if the given length will not exceed the end of + * the chunk. Returns an empty String otherwise. + */ +Chunk.prototype.read = function(length) { + // Default to full read if no index defined + length = length == null || length === 0 ? this.length() : length; + + if (this.length() - this.internalPosition + 1 >= length) { + var data = this.data.read(this.internalPosition, length); + this.internalPosition = this.internalPosition + length; + return data; + } else { + return ''; + } +}; + +Chunk.prototype.readSlice = function(length) { + if (this.length() - this.internalPosition >= length) { + var data = null; + if (this.data.buffer != null) { + //Pure BSON + data = this.data.buffer.slice(this.internalPosition, this.internalPosition + length); + } else { + //Native BSON + data = Buffer.alloc(length); + length = this.data.readInto(data, this.internalPosition); + } + this.internalPosition = this.internalPosition + length; + return data; + } else { + return null; + } +}; + +/** + * Checks if the read/write head is at the end. + * + * @return {boolean} Whether the read/write head has reached the end of this + * chunk. + */ +Chunk.prototype.eof = function() { + return this.internalPosition === this.length() ? true : false; +}; + +/** + * Reads one character from the data of this chunk and advances the read/write + * head. + * + * @return {string} a single character data read if the the read/write head is + * not at the end of the chunk. Returns an empty String otherwise. + */ +Chunk.prototype.getc = function() { + return this.read(1); +}; + +/** + * Clears the contents of the data in this chunk and resets the read/write head + * to the initial position. + */ +Chunk.prototype.rewind = function() { + this.internalPosition = 0; + this.data = new Binary(); +}; + +/** + * Saves this chunk to the database. Also overwrites existing entries having the + * same id as this chunk. + * + * @param callback {function(*, GridStore)} This will be called after executing + * this method. The first parameter will contain null and the second one + * will contain a reference to this object. + */ +Chunk.prototype.save = function(options, callback) { + var self = this; + if (typeof options === 'function') { + callback = options; + options = {}; + } + + self.file.chunkCollection(function(err, collection) { + if (err) return callback(err); + + // Merge the options + var writeOptions = { upsert: true }; + for (var name in options) writeOptions[name] = options[name]; + for (name in self.writeConcern) writeOptions[name] = self.writeConcern[name]; + + if (self.data.length() > 0) { + self.buildMongoObject(function(mongoObject) { + var options = { forceServerObjectId: true }; + for (var name in self.writeConcern) { + options[name] = self.writeConcern[name]; + } + + collection.replaceOne({ _id: self.objectId }, mongoObject, writeOptions, function(err) { + callback(err, self); + }); + }); + } else { + callback(null, self); + } + // }); + }); +}; + +/** + * Creates a mongoDB object representation of this chunk. + * + * @param callback {function(Object)} This will be called after executing this + * method. The object will be passed to the first parameter and will have + * the structure: + * + *

+ *        {
+ *          '_id' : , // {number} id for this chunk
+ *          'files_id' : , // {number} foreign key to the file collection
+ *          'n' : , // {number} chunk number
+ *          'data' : , // {bson#Binary} the chunk data itself
+ *        }
+ *        
+ * + * @see MongoDB GridFS Chunk Object Structure + */ +Chunk.prototype.buildMongoObject = function(callback) { + var mongoObject = { + files_id: this.file.fileId, + n: this.chunkNumber, + data: this.data + }; + // If we are saving using a specific ObjectId + if (this.objectId != null) mongoObject._id = this.objectId; + + callback(mongoObject); +}; + +/** + * @return {number} the length of the data + */ +Chunk.prototype.length = function() { + return this.data.length(); +}; + +/** + * The position of the read/write head + * @name position + * @lends Chunk# + * @field + */ +Object.defineProperty(Chunk.prototype, 'position', { + enumerable: true, + get: function() { + return this.internalPosition; + }, + set: function(value) { + this.internalPosition = value; + } +}); + +/** + * The default chunk size + * @constant + */ +Chunk.DEFAULT_CHUNK_SIZE = 1024 * 255; + +module.exports = Chunk; diff --git a/node_modules/mongodb/lib/gridfs/grid_store.js b/node_modules/mongodb/lib/gridfs/grid_store.js new file mode 100644 index 00000000..4f229a03 --- /dev/null +++ b/node_modules/mongodb/lib/gridfs/grid_store.js @@ -0,0 +1,1925 @@ +'use strict'; + +/** + * @fileOverview GridFS is a tool for MongoDB to store files to the database. + * Because of the restrictions of the object size the database can hold, a + * facility to split a file into several chunks is needed. The {@link GridStore} + * class offers a simplified api to interact with files while managing the + * chunks of split files behind the scenes. More information about GridFS can be + * found here. + * + * @example + * const MongoClient = require('mongodb').MongoClient; + * const GridStore = require('mongodb').GridStore; + * const ObjectID = require('mongodb').ObjectID; + * const test = require('assert'); + * // Connection url + * const url = 'mongodb://localhost:27017'; + * // Database Name + * const dbName = 'test'; + * // Connect using MongoClient + * MongoClient.connect(url, function(err, client) { + * const db = client.db(dbName); + * const gridStore = new GridStore(db, null, "w"); + * gridStore.open(function(err, gridStore) { + * gridStore.write("hello world!", function(err, gridStore) { + * gridStore.close(function(err, result) { + * // Let's read the file using object Id + * GridStore.read(db, result._id, function(err, data) { + * test.equal('hello world!', data); + * client.close(); + * test.done(); + * }); + * }); + * }); + * }); + * }); + */ +const Chunk = require('./chunk'); +const ObjectID = require('../core').BSON.ObjectID; +const ReadPreference = require('../core').ReadPreference; +const Buffer = require('safe-buffer').Buffer; +const fs = require('fs'); +const f = require('util').format; +const util = require('util'); +const MongoError = require('../core').MongoError; +const inherits = util.inherits; +const Duplex = require('stream').Duplex; +const shallowClone = require('../utils').shallowClone; +const executeLegacyOperation = require('../utils').executeLegacyOperation; +const deprecate = require('util').deprecate; + +var REFERENCE_BY_FILENAME = 0, + REFERENCE_BY_ID = 1; + +const deprecationFn = deprecate(() => {}, +'GridStore is deprecated, and will be removed in a future version. Please use GridFSBucket instead'); + +/** + * Namespace provided by the core module + * @external Duplex + */ + +/** + * Create a new GridStore instance + * + * Modes + * - **"r"** - read only. This is the default mode. + * - **"w"** - write in truncate mode. Existing data will be overwritten. + * + * @class + * @param {Db} db A database instance to interact with. + * @param {object} [id] optional unique id for this file + * @param {string} [filename] optional filename for this file, no unique constrain on the field + * @param {string} mode set the mode for this file. + * @param {object} [options] Optional settings. + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {boolean} [options.fsync=false] **Deprecated** Specify a file sync write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {string} [options.root] Root collection to use. Defaults to **{GridStore.DEFAULT_ROOT_COLLECTION}**. + * @param {string} [options.content_type] MIME type of the file. Defaults to **{GridStore.DEFAULT_CONTENT_TYPE}**. + * @param {number} [options.chunk_size=261120] Size for the chunk. Defaults to **{Chunk.DEFAULT_CHUNK_SIZE}**. + * @param {object} [options.metadata] Arbitrary data the user wants to store. + * @param {object} [options.promiseLibrary] A Promise library class the application wishes to use such as Bluebird, must be ES6 compatible + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @property {number} chunkSize Get the gridstore chunk size. + * @property {number} md5 The md5 checksum for this file. + * @property {number} chunkNumber The current chunk number the gridstore has materialized into memory + * @return {GridStore} a GridStore instance. + * @deprecated Use GridFSBucket API instead + */ +var GridStore = function GridStore(db, id, filename, mode, options) { + deprecationFn(); + if (!(this instanceof GridStore)) return new GridStore(db, id, filename, mode, options); + this.db = db; + + // Handle options + if (typeof options === 'undefined') options = {}; + // Handle mode + if (typeof mode === 'undefined') { + mode = filename; + filename = undefined; + } else if (typeof mode === 'object') { + options = mode; + mode = filename; + filename = undefined; + } + + if (id && id._bsontype === 'ObjectID') { + this.referenceBy = REFERENCE_BY_ID; + this.fileId = id; + this.filename = filename; + } else if (typeof filename === 'undefined') { + this.referenceBy = REFERENCE_BY_FILENAME; + this.filename = id; + if (mode.indexOf('w') != null) { + this.fileId = new ObjectID(); + } + } else { + this.referenceBy = REFERENCE_BY_ID; + this.fileId = id; + this.filename = filename; + } + + // Set up the rest + this.mode = mode == null ? 'r' : mode; + this.options = options || {}; + + // Opened + this.isOpen = false; + + // Set the root if overridden + this.root = + this.options['root'] == null ? GridStore.DEFAULT_ROOT_COLLECTION : this.options['root']; + this.position = 0; + this.readPreference = + this.options.readPreference || db.options.readPreference || ReadPreference.primary; + this.writeConcern = _getWriteConcern(db, this.options); + // Set default chunk size + this.internalChunkSize = + this.options['chunkSize'] == null ? Chunk.DEFAULT_CHUNK_SIZE : this.options['chunkSize']; + + // Get the promiseLibrary + var promiseLibrary = this.options.promiseLibrary || Promise; + + // Set the promiseLibrary + this.promiseLibrary = promiseLibrary; + + Object.defineProperty(this, 'chunkSize', { + enumerable: true, + get: function() { + return this.internalChunkSize; + }, + set: function(value) { + if (!(this.mode[0] === 'w' && this.position === 0 && this.uploadDate == null)) { + // eslint-disable-next-line no-self-assign + this.internalChunkSize = this.internalChunkSize; + } else { + this.internalChunkSize = value; + } + } + }); + + Object.defineProperty(this, 'md5', { + enumerable: true, + get: function() { + return this.internalMd5; + } + }); + + Object.defineProperty(this, 'chunkNumber', { + enumerable: true, + get: function() { + return this.currentChunk && this.currentChunk.chunkNumber + ? this.currentChunk.chunkNumber + : null; + } + }); +}; + +/** + * The callback format for the Gridstore.open method + * @callback GridStore~openCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {GridStore} gridStore The GridStore instance if the open method was successful. + */ + +/** + * Opens the file from the database and initialize this object. Also creates a + * new one if file does not exist. + * + * @method + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~openCallback} [callback] this will be called after executing this method + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.open = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + if (this.mode !== 'w' && this.mode !== 'w+' && this.mode !== 'r') { + throw MongoError.create({ message: 'Illegal mode ' + this.mode, driver: true }); + } + + return executeLegacyOperation(this.db.s.topology, open, [this, options, callback], { + skipSessions: true + }); +}; + +var open = function(self, options, callback) { + // Get the write concern + var writeConcern = _getWriteConcern(self.db, self.options); + + // If we are writing we need to ensure we have the right indexes for md5's + if (self.mode === 'w' || self.mode === 'w+') { + // Get files collection + var collection = self.collection(); + // Put index on filename + collection.ensureIndex([['filename', 1]], writeConcern, function() { + // Get chunk collection + var chunkCollection = self.chunkCollection(); + // Make an unique index for compatibility with mongo-cxx-driver:legacy + var chunkIndexOptions = shallowClone(writeConcern); + chunkIndexOptions.unique = true; + // Ensure index on chunk collection + chunkCollection.ensureIndex( + [ + ['files_id', 1], + ['n', 1] + ], + chunkIndexOptions, + function() { + // Open the connection + _open(self, writeConcern, function(err, r) { + if (err) return callback(err); + self.isOpen = true; + callback(err, r); + }); + } + ); + }); + } else { + // Open the gridstore + _open(self, writeConcern, function(err, r) { + if (err) return callback(err); + self.isOpen = true; + callback(err, r); + }); + } +}; + +/** + * Verify if the file is at EOF. + * + * @method + * @return {boolean} true if the read/write head is at the end of this file. + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.eof = function() { + return this.position === this.length ? true : false; +}; + +/** + * The callback result format. + * @callback GridStore~resultCallback + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {MongoError} error An error instance representing the error during the execution. + * @param {object} result The result from the callback. + */ + +/** + * Retrieves a single character from this file. + * + * @method + * @param {GridStore~resultCallback} [callback] this gets called after this method is executed. Passes null to the first parameter and the character read to the second or null to the second if the read/write head is at the end of the file. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.getc = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + return executeLegacyOperation(this.db.s.topology, getc, [this, options, callback], { + skipSessions: true + }); +}; + +var getc = function(self, options, callback) { + if (self.eof()) { + callback(null, null); + } else if (self.currentChunk.eof()) { + nthChunk(self, self.currentChunk.chunkNumber + 1, function(err, chunk) { + self.currentChunk = chunk; + self.position = self.position + 1; + callback(err, self.currentChunk.getc()); + }); + } else { + self.position = self.position + 1; + callback(null, self.currentChunk.getc()); + } +}; + +/** + * Writes a string to the file with a newline character appended at the end if + * the given string does not have one. + * + * @method + * @param {string} string the string to write. + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~resultCallback} [callback] this will be called after executing this method. The first parameter will contain null and the second one will contain a reference to this object. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.puts = function(string, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + var finalString = string.match(/\n$/) == null ? string + '\n' : string; + return executeLegacyOperation( + this.db.s.topology, + this.write.bind(this), + [finalString, options, callback], + { skipSessions: true } + ); +}; + +/** + * Return a modified Readable stream including a possible transform method. + * + * @method + * @return {GridStoreStream} + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.stream = function() { + return new GridStoreStream(this); +}; + +/** + * Writes some data. This method will work properly only if initialized with mode "w" or "w+". + * + * @method + * @param {(string|Buffer)} data the data to write. + * @param {boolean} [close] closes this file after writing if set to true. + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~resultCallback} [callback] this will be called after executing this method. The first parameter will contain null and the second one will contain a reference to this object. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.write = function write(data, close, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + return executeLegacyOperation( + this.db.s.topology, + _writeNormal, + [this, data, close, options, callback], + { skipSessions: true } + ); +}; + +/** + * Handles the destroy part of a stream + * + * @method + * @result {null} + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.destroy = function destroy() { + // close and do not emit any more events. queued data is not sent. + if (!this.writable) return; + this.readable = false; + if (this.writable) { + this.writable = false; + this._q.length = 0; + this.emit('close'); + } +}; + +/** + * Stores a file from the file system to the GridFS database. + * + * @method + * @param {(string|Buffer|FileHandle)} file the file to store. + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~resultCallback} [callback] this will be called after executing this method. The first parameter will contain null and the second one will contain a reference to this object. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.writeFile = function(file, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + return executeLegacyOperation(this.db.s.topology, writeFile, [this, file, options, callback], { + skipSessions: true + }); +}; + +var writeFile = function(self, file, options, callback) { + if (typeof file === 'string') { + fs.open(file, 'r', function(err, fd) { + if (err) return callback(err); + self.writeFile(fd, callback); + }); + return; + } + + self.open(function(err, self) { + if (err) return callback(err, self); + + fs.fstat(file, function(err, stats) { + if (err) return callback(err, self); + + var offset = 0; + var index = 0; + + // Write a chunk + var writeChunk = function() { + // Allocate the buffer + var _buffer = Buffer.alloc(self.chunkSize); + // Read the file + fs.read(file, _buffer, 0, _buffer.length, offset, function(err, bytesRead, data) { + if (err) return callback(err, self); + + offset = offset + bytesRead; + + // Create a new chunk for the data + var chunk = new Chunk(self, { n: index++ }, self.writeConcern); + chunk.write(data.slice(0, bytesRead), function(err, chunk) { + if (err) return callback(err, self); + + chunk.save({}, function(err) { + if (err) return callback(err, self); + + self.position = self.position + bytesRead; + + // Point to current chunk + self.currentChunk = chunk; + + if (offset >= stats.size) { + fs.close(file, function(err) { + if (err) return callback(err); + + self.close(function(err) { + if (err) return callback(err, self); + return callback(null, self); + }); + }); + } else { + return process.nextTick(writeChunk); + } + }); + }); + }); + }; + + // Process the first write + process.nextTick(writeChunk); + }); + }); +}; + +/** + * Saves this file to the database. This will overwrite the old entry if it + * already exists. This will work properly only if mode was initialized to + * "w" or "w+". + * + * @method + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~resultCallback} [callback] this will be called after executing this method. The first parameter will contain null and the second one will contain a reference to this object. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.close = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + return executeLegacyOperation(this.db.s.topology, close, [this, options, callback], { + skipSessions: true + }); +}; + +var close = function(self, options, callback) { + if (self.mode[0] === 'w') { + // Set up options + options = Object.assign({}, self.writeConcern, options); + + if (self.currentChunk != null && self.currentChunk.position > 0) { + self.currentChunk.save({}, function(err) { + if (err && typeof callback === 'function') return callback(err); + + self.collection(function(err, files) { + if (err && typeof callback === 'function') return callback(err); + + // Build the mongo object + if (self.uploadDate != null) { + buildMongoObject(self, function(err, mongoObject) { + if (err) { + if (typeof callback === 'function') return callback(err); + else throw err; + } + + files.save(mongoObject, options, function(err) { + if (typeof callback === 'function') callback(err, mongoObject); + }); + }); + } else { + self.uploadDate = new Date(); + buildMongoObject(self, function(err, mongoObject) { + if (err) { + if (typeof callback === 'function') return callback(err); + else throw err; + } + + files.save(mongoObject, options, function(err) { + if (typeof callback === 'function') callback(err, mongoObject); + }); + }); + } + }); + }); + } else { + self.collection(function(err, files) { + if (err && typeof callback === 'function') return callback(err); + + self.uploadDate = new Date(); + buildMongoObject(self, function(err, mongoObject) { + if (err) { + if (typeof callback === 'function') return callback(err); + else throw err; + } + + files.save(mongoObject, options, function(err) { + if (typeof callback === 'function') callback(err, mongoObject); + }); + }); + }); + } + } else if (self.mode[0] === 'r') { + if (typeof callback === 'function') callback(null, null); + } else { + if (typeof callback === 'function') + callback(MongoError.create({ message: f('Illegal mode %s', self.mode), driver: true })); + } +}; + +/** + * The collection callback format. + * @callback GridStore~collectionCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Collection} collection The collection from the command execution. + */ + +/** + * Retrieve this file's chunks collection. + * + * @method + * @param {GridStore~collectionCallback} callback the command callback. + * @return {Collection} + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.chunkCollection = function(callback) { + if (typeof callback === 'function') return this.db.collection(this.root + '.chunks', callback); + return this.db.collection(this.root + '.chunks'); +}; + +/** + * Deletes all the chunks of this file in the database. + * + * @method + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~resultCallback} [callback] the command callback. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.unlink = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + return executeLegacyOperation(this.db.s.topology, unlink, [this, options, callback], { + skipSessions: true + }); +}; + +var unlink = function(self, options, callback) { + deleteChunks(self, function(err) { + if (err !== null) { + err.message = 'at deleteChunks: ' + err.message; + return callback(err); + } + + self.collection(function(err, collection) { + if (err !== null) { + err.message = 'at collection: ' + err.message; + return callback(err); + } + + collection.remove({ _id: self.fileId }, self.writeConcern, function(err) { + callback(err, self); + }); + }); + }); +}; + +/** + * Retrieves the file collection associated with this object. + * + * @method + * @param {GridStore~collectionCallback} callback the command callback. + * @return {Collection} + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.collection = function(callback) { + if (typeof callback === 'function') this.db.collection(this.root + '.files', callback); + return this.db.collection(this.root + '.files'); +}; + +/** + * The readlines callback format. + * @callback GridStore~readlinesCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {string[]} strings The array of strings returned. + */ + +/** + * Read the entire file as a list of strings splitting by the provided separator. + * + * @method + * @param {string} [separator] The character to be recognized as the newline separator. + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~readlinesCallback} [callback] the command callback. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.readlines = function(separator, options, callback) { + var args = Array.prototype.slice.call(arguments, 0); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + separator = args.length ? args.shift() : '\n'; + separator = separator || '\n'; + options = args.length ? args.shift() : {}; + + return executeLegacyOperation( + this.db.s.topology, + readlines, + [this, separator, options, callback], + { skipSessions: true } + ); +}; + +var readlines = function(self, separator, options, callback) { + self.read(function(err, data) { + if (err) return callback(err); + + var items = data.toString().split(separator); + items = items.length > 0 ? items.splice(0, items.length - 1) : []; + for (var i = 0; i < items.length; i++) { + items[i] = items[i] + separator; + } + + callback(null, items); + }); +}; + +/** + * Deletes all the chunks of this file in the database if mode was set to "w" or + * "w+" and resets the read/write head to the initial position. + * + * @method + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~resultCallback} [callback] this will be called after executing this method. The first parameter will contain null and the second one will contain a reference to this object. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.rewind = function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + return executeLegacyOperation(this.db.s.topology, rewind, [this, options, callback], { + skipSessions: true + }); +}; + +var rewind = function(self, options, callback) { + if (self.currentChunk.chunkNumber !== 0) { + if (self.mode[0] === 'w') { + deleteChunks(self, function(err) { + if (err) return callback(err); + self.currentChunk = new Chunk(self, { n: 0 }, self.writeConcern); + self.position = 0; + callback(null, self); + }); + } else { + self.currentChunk(0, function(err, chunk) { + if (err) return callback(err); + self.currentChunk = chunk; + self.currentChunk.rewind(); + self.position = 0; + callback(null, self); + }); + } + } else { + self.currentChunk.rewind(); + self.position = 0; + callback(null, self); + } +}; + +/** + * The read callback format. + * @callback GridStore~readCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {Buffer} data The data read from the GridStore object + */ + +/** + * Retrieves the contents of this file and advances the read/write head. Works with Buffers only. + * + * There are 3 signatures for this method: + * + * (callback) + * (length, callback) + * (length, buffer, callback) + * + * @method + * @param {number} [length] the number of characters to read. Reads all the characters from the read/write head to the EOF if not specified. + * @param {(string|Buffer)} [buffer] a string to hold temporary data. This is used for storing the string data read so far when recursively calling this method. + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~readCallback} [callback] the command callback. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.read = function(length, buffer, options, callback) { + var args = Array.prototype.slice.call(arguments, 0); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + length = args.length ? args.shift() : null; + buffer = args.length ? args.shift() : null; + options = args.length ? args.shift() : {}; + + return executeLegacyOperation( + this.db.s.topology, + read, + [this, length, buffer, options, callback], + { skipSessions: true } + ); +}; + +var read = function(self, length, buffer, options, callback) { + // The data is a c-terminated string and thus the length - 1 + var finalLength = length == null ? self.length - self.position : length; + var finalBuffer = buffer == null ? Buffer.alloc(finalLength) : buffer; + // Add a index to buffer to keep track of writing position or apply current index + finalBuffer._index = buffer != null && buffer._index != null ? buffer._index : 0; + + if (self.currentChunk.length() - self.currentChunk.position + finalBuffer._index >= finalLength) { + var slice = self.currentChunk.readSlice(finalLength - finalBuffer._index); + // Copy content to final buffer + slice.copy(finalBuffer, finalBuffer._index); + // Update internal position + self.position = self.position + finalBuffer.length; + // Check if we don't have a file at all + if (finalLength === 0 && finalBuffer.length === 0) + return callback(MongoError.create({ message: 'File does not exist', driver: true }), null); + // Else return data + return callback(null, finalBuffer); + } + + // Read the next chunk + slice = self.currentChunk.readSlice(self.currentChunk.length() - self.currentChunk.position); + // Copy content to final buffer + slice.copy(finalBuffer, finalBuffer._index); + // Update index position + finalBuffer._index += slice.length; + + // Load next chunk and read more + nthChunk(self, self.currentChunk.chunkNumber + 1, function(err, chunk) { + if (err) return callback(err); + + if (chunk.length() > 0) { + self.currentChunk = chunk; + self.read(length, finalBuffer, callback); + } else { + if (finalBuffer._index > 0) { + callback(null, finalBuffer); + } else { + callback( + MongoError.create({ + message: 'no chunks found for file, possibly corrupt', + driver: true + }), + null + ); + } + } + }); +}; + +/** + * The tell callback format. + * @callback GridStore~tellCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {number} position The current read position in the GridStore. + */ + +/** + * Retrieves the position of the read/write head of this file. + * + * @method + * @param {number} [length] the number of characters to read. Reads all the characters from the read/write head to the EOF if not specified. + * @param {(string|Buffer)} [buffer] a string to hold temporary data. This is used for storing the string data read so far when recursively calling this method. + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~tellCallback} [callback] the command callback. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.tell = function(callback) { + var self = this; + // We provided a callback leg + if (typeof callback === 'function') return callback(null, this.position); + // Return promise + return new self.promiseLibrary(function(resolve) { + resolve(self.position); + }); +}; + +/** + * The tell callback format. + * @callback GridStore~gridStoreCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {GridStore} gridStore The gridStore. + */ + +/** + * Moves the read/write head to a new location. + * + * There are 3 signatures for this method + * + * Seek Location Modes + * - **GridStore.IO_SEEK_SET**, **(default)** set the position from the start of the file. + * - **GridStore.IO_SEEK_CUR**, set the position from the current position in the file. + * - **GridStore.IO_SEEK_END**, set the position from the end of the file. + * + * @method + * @param {number} [position] the position to seek to + * @param {number} [seekLocation] seek mode. Use one of the Seek Location modes. + * @param {object} [options] Optional settings + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~gridStoreCallback} [callback] the command callback. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.prototype.seek = function(position, seekLocation, options, callback) { + var args = Array.prototype.slice.call(arguments, 1); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + seekLocation = args.length ? args.shift() : null; + options = args.length ? args.shift() : {}; + + return executeLegacyOperation( + this.db.s.topology, + seek, + [this, position, seekLocation, options, callback], + { skipSessions: true } + ); +}; + +var seek = function(self, position, seekLocation, options, callback) { + // Seek only supports read mode + if (self.mode !== 'r') { + return callback( + MongoError.create({ message: 'seek is only supported for mode r', driver: true }) + ); + } + + var seekLocationFinal = seekLocation == null ? GridStore.IO_SEEK_SET : seekLocation; + var finalPosition = position; + var targetPosition = 0; + + // Calculate the position + if (seekLocationFinal === GridStore.IO_SEEK_CUR) { + targetPosition = self.position + finalPosition; + } else if (seekLocationFinal === GridStore.IO_SEEK_END) { + targetPosition = self.length + finalPosition; + } else { + targetPosition = finalPosition; + } + + // Get the chunk + var newChunkNumber = Math.floor(targetPosition / self.chunkSize); + var seekChunk = function() { + nthChunk(self, newChunkNumber, function(err, chunk) { + if (err) return callback(err, null); + if (chunk == null) return callback(new Error('no chunk found')); + + // Set the current chunk + self.currentChunk = chunk; + self.position = targetPosition; + self.currentChunk.position = self.position % self.chunkSize; + callback(err, self); + }); + }; + + seekChunk(); +}; + +/** + * @ignore + */ +var _open = function(self, options, callback) { + var collection = self.collection(); + // Create the query + var query = + self.referenceBy === REFERENCE_BY_ID ? { _id: self.fileId } : { filename: self.filename }; + query = null == self.fileId && self.filename == null ? null : query; + options.readPreference = self.readPreference; + + // Fetch the chunks + if (query != null) { + collection.findOne(query, options, function(err, doc) { + if (err) { + return error(err); + } + + // Check if the collection for the files exists otherwise prepare the new one + if (doc != null) { + self.fileId = doc._id; + // Prefer a new filename over the existing one if this is a write + self.filename = + self.mode === 'r' || self.filename === undefined ? doc.filename : self.filename; + self.contentType = doc.contentType; + self.internalChunkSize = doc.chunkSize; + self.uploadDate = doc.uploadDate; + self.aliases = doc.aliases; + self.length = doc.length; + self.metadata = doc.metadata; + self.internalMd5 = doc.md5; + } else if (self.mode !== 'r') { + self.fileId = self.fileId == null ? new ObjectID() : self.fileId; + self.contentType = GridStore.DEFAULT_CONTENT_TYPE; + self.internalChunkSize = + self.internalChunkSize == null ? Chunk.DEFAULT_CHUNK_SIZE : self.internalChunkSize; + self.length = 0; + } else { + self.length = 0; + var txtId = self.fileId._bsontype === 'ObjectID' ? self.fileId.toHexString() : self.fileId; + return error( + MongoError.create({ + message: f( + 'file with id %s not opened for writing', + self.referenceBy === REFERENCE_BY_ID ? txtId : self.filename + ), + driver: true + }), + self + ); + } + + // Process the mode of the object + if (self.mode === 'r') { + nthChunk(self, 0, options, function(err, chunk) { + if (err) return error(err); + self.currentChunk = chunk; + self.position = 0; + callback(null, self); + }); + } else if (self.mode === 'w' && doc) { + // Delete any existing chunks + deleteChunks(self, options, function(err) { + if (err) return error(err); + self.currentChunk = new Chunk(self, { n: 0 }, self.writeConcern); + self.contentType = + self.options['content_type'] == null ? self.contentType : self.options['content_type']; + self.internalChunkSize = + self.options['chunk_size'] == null + ? self.internalChunkSize + : self.options['chunk_size']; + self.metadata = + self.options['metadata'] == null ? self.metadata : self.options['metadata']; + self.aliases = self.options['aliases'] == null ? self.aliases : self.options['aliases']; + self.position = 0; + callback(null, self); + }); + } else if (self.mode === 'w') { + self.currentChunk = new Chunk(self, { n: 0 }, self.writeConcern); + self.contentType = + self.options['content_type'] == null ? self.contentType : self.options['content_type']; + self.internalChunkSize = + self.options['chunk_size'] == null ? self.internalChunkSize : self.options['chunk_size']; + self.metadata = self.options['metadata'] == null ? self.metadata : self.options['metadata']; + self.aliases = self.options['aliases'] == null ? self.aliases : self.options['aliases']; + self.position = 0; + callback(null, self); + } else if (self.mode === 'w+') { + nthChunk(self, lastChunkNumber(self), options, function(err, chunk) { + if (err) return error(err); + // Set the current chunk + self.currentChunk = chunk == null ? new Chunk(self, { n: 0 }, self.writeConcern) : chunk; + self.currentChunk.position = self.currentChunk.data.length(); + self.metadata = + self.options['metadata'] == null ? self.metadata : self.options['metadata']; + self.aliases = self.options['aliases'] == null ? self.aliases : self.options['aliases']; + self.position = self.length; + callback(null, self); + }); + } + }); + } else { + // Write only mode + self.fileId = null == self.fileId ? new ObjectID() : self.fileId; + self.contentType = GridStore.DEFAULT_CONTENT_TYPE; + self.internalChunkSize = + self.internalChunkSize == null ? Chunk.DEFAULT_CHUNK_SIZE : self.internalChunkSize; + self.length = 0; + + // No file exists set up write mode + if (self.mode === 'w') { + // Delete any existing chunks + deleteChunks(self, options, function(err) { + if (err) return error(err); + self.currentChunk = new Chunk(self, { n: 0 }, self.writeConcern); + self.contentType = + self.options['content_type'] == null ? self.contentType : self.options['content_type']; + self.internalChunkSize = + self.options['chunk_size'] == null ? self.internalChunkSize : self.options['chunk_size']; + self.metadata = self.options['metadata'] == null ? self.metadata : self.options['metadata']; + self.aliases = self.options['aliases'] == null ? self.aliases : self.options['aliases']; + self.position = 0; + callback(null, self); + }); + } else if (self.mode === 'w+') { + nthChunk(self, lastChunkNumber(self), options, function(err, chunk) { + if (err) return error(err); + // Set the current chunk + self.currentChunk = chunk == null ? new Chunk(self, { n: 0 }, self.writeConcern) : chunk; + self.currentChunk.position = self.currentChunk.data.length(); + self.metadata = self.options['metadata'] == null ? self.metadata : self.options['metadata']; + self.aliases = self.options['aliases'] == null ? self.aliases : self.options['aliases']; + self.position = self.length; + callback(null, self); + }); + } + } + + // only pass error to callback once + function error(err) { + if (error.err) return; + callback((error.err = err)); + } +}; + +/** + * @ignore + */ +var writeBuffer = function(self, buffer, close, callback) { + if (typeof close === 'function') { + callback = close; + close = null; + } + var finalClose = typeof close === 'boolean' ? close : false; + + if (self.mode !== 'w') { + callback( + MongoError.create({ + message: f( + 'file with id %s not opened for writing', + self.referenceBy === REFERENCE_BY_ID ? self.referenceBy : self.filename + ), + driver: true + }), + null + ); + } else { + if (self.currentChunk.position + buffer.length >= self.chunkSize) { + // Write out the current Chunk and then keep writing until we have less data left than a chunkSize left + // to a new chunk (recursively) + var previousChunkNumber = self.currentChunk.chunkNumber; + var leftOverDataSize = self.chunkSize - self.currentChunk.position; + var firstChunkData = buffer.slice(0, leftOverDataSize); + var leftOverData = buffer.slice(leftOverDataSize); + // A list of chunks to write out + var chunksToWrite = [self.currentChunk.write(firstChunkData)]; + // If we have more data left than the chunk size let's keep writing new chunks + while (leftOverData.length >= self.chunkSize) { + // Create a new chunk and write to it + var newChunk = new Chunk(self, { n: previousChunkNumber + 1 }, self.writeConcern); + firstChunkData = leftOverData.slice(0, self.chunkSize); + leftOverData = leftOverData.slice(self.chunkSize); + // Update chunk number + previousChunkNumber = previousChunkNumber + 1; + // Write data + newChunk.write(firstChunkData); + // Push chunk to save list + chunksToWrite.push(newChunk); + } + + // Set current chunk with remaining data + self.currentChunk = new Chunk(self, { n: previousChunkNumber + 1 }, self.writeConcern); + // If we have left over data write it + if (leftOverData.length > 0) self.currentChunk.write(leftOverData); + + // Update the position for the gridstore + self.position = self.position + buffer.length; + // Total number of chunks to write + var numberOfChunksToWrite = chunksToWrite.length; + + for (var i = 0; i < chunksToWrite.length; i++) { + chunksToWrite[i].save({}, function(err) { + if (err) return callback(err); + + numberOfChunksToWrite = numberOfChunksToWrite - 1; + + if (numberOfChunksToWrite <= 0) { + // We care closing the file before returning + if (finalClose) { + return self.close(function(err) { + callback(err, self); + }); + } + + // Return normally + return callback(null, self); + } + }); + } + } else { + // Update the position for the gridstore + self.position = self.position + buffer.length; + // We have less data than the chunk size just write it and callback + self.currentChunk.write(buffer); + // We care closing the file before returning + if (finalClose) { + return self.close(function(err) { + callback(err, self); + }); + } + // Return normally + return callback(null, self); + } + } +}; + +/** + * Creates a mongoDB object representation of this object. + * + *

+ *        {
+ *          '_id' : , // {number} id for this file
+ *          'filename' : , // {string} name for this file
+ *          'contentType' : , // {string} mime type for this file
+ *          'length' : , // {number} size of this file?
+ *          'chunksize' : , // {number} chunk size used by this file
+ *          'uploadDate' : , // {Date}
+ *          'aliases' : , // {array of string}
+ *          'metadata' : , // {string}
+ *        }
+ *        
+ * + * @ignore + */ +var buildMongoObject = function(self, callback) { + // Calcuate the length + var mongoObject = { + _id: self.fileId, + filename: self.filename, + contentType: self.contentType, + length: self.position ? self.position : 0, + chunkSize: self.chunkSize, + uploadDate: self.uploadDate, + aliases: self.aliases, + metadata: self.metadata + }; + + var md5Command = { filemd5: self.fileId, root: self.root }; + self.db.command(md5Command, function(err, results) { + if (err) return callback(err); + + mongoObject.md5 = results.md5; + callback(null, mongoObject); + }); +}; + +/** + * Gets the nth chunk of this file. + * @ignore + */ +var nthChunk = function(self, chunkNumber, options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || self.writeConcern; + options.readPreference = self.readPreference; + // Get the nth chunk + self + .chunkCollection() + .findOne({ files_id: self.fileId, n: chunkNumber }, options, function(err, chunk) { + if (err) return callback(err); + + var finalChunk = chunk == null ? {} : chunk; + callback(null, new Chunk(self, finalChunk, self.writeConcern)); + }); +}; + +/** + * @ignore + */ +var lastChunkNumber = function(self) { + return Math.floor((self.length ? self.length - 1 : 0) / self.chunkSize); +}; + +/** + * Deletes all the chunks of this file in the database. + * + * @ignore + */ +var deleteChunks = function(self, options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || self.writeConcern; + + if (self.fileId != null) { + self.chunkCollection().remove({ files_id: self.fileId }, options, function(err) { + if (err) return callback(err, false); + callback(null, true); + }); + } else { + callback(null, true); + } +}; + +/** + * The collection to be used for holding the files and chunks collection. + * + * @classconstant DEFAULT_ROOT_COLLECTION + */ +GridStore.DEFAULT_ROOT_COLLECTION = 'fs'; + +/** + * Default file mime type + * + * @classconstant DEFAULT_CONTENT_TYPE + */ +GridStore.DEFAULT_CONTENT_TYPE = 'binary/octet-stream'; + +/** + * Seek mode where the given length is absolute. + * + * @classconstant IO_SEEK_SET + */ +GridStore.IO_SEEK_SET = 0; + +/** + * Seek mode where the given length is an offset to the current read/write head. + * + * @classconstant IO_SEEK_CUR + */ +GridStore.IO_SEEK_CUR = 1; + +/** + * Seek mode where the given length is an offset to the end of the file. + * + * @classconstant IO_SEEK_END + */ +GridStore.IO_SEEK_END = 2; + +/** + * Checks if a file exists in the database. + * + * @method + * @static + * @param {Db} db the database to query. + * @param {string} name The name of the file to look for. + * @param {string} [rootCollection] The root collection that holds the files and chunks collection. Defaults to **{GridStore.DEFAULT_ROOT_COLLECTION}**. + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {object} [options.promiseLibrary] A Promise library class the application wishes to use such as Bluebird, must be ES6 compatible + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~resultCallback} [callback] result from exists. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.exist = function(db, fileIdObject, rootCollection, options, callback) { + var args = Array.prototype.slice.call(arguments, 2); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + rootCollection = args.length ? args.shift() : null; + options = args.length ? args.shift() : {}; + options = options || {}; + + return executeLegacyOperation( + db.s.topology, + exists, + [db, fileIdObject, rootCollection, options, callback], + { skipSessions: true } + ); +}; + +var exists = function(db, fileIdObject, rootCollection, options, callback) { + // Establish read preference + var readPreference = options.readPreference || ReadPreference.PRIMARY; + // Fetch collection + var rootCollectionFinal = + rootCollection != null ? rootCollection : GridStore.DEFAULT_ROOT_COLLECTION; + db.collection(rootCollectionFinal + '.files', function(err, collection) { + if (err) return callback(err); + + // Build query + var query = + typeof fileIdObject === 'string' || + Object.prototype.toString.call(fileIdObject) === '[object RegExp]' + ? { filename: fileIdObject } + : { _id: fileIdObject }; // Attempt to locate file + + // We have a specific query + if ( + fileIdObject != null && + typeof fileIdObject === 'object' && + Object.prototype.toString.call(fileIdObject) !== '[object RegExp]' + ) { + query = fileIdObject; + } + + // Check if the entry exists + collection.findOne(query, { readPreference: readPreference }, function(err, item) { + if (err) return callback(err); + callback(null, item == null ? false : true); + }); + }); +}; + +/** + * Gets the list of files stored in the GridFS. + * + * @method + * @static + * @param {Db} db the database to query. + * @param {string} [rootCollection] The root collection that holds the files and chunks collection. Defaults to **{GridStore.DEFAULT_ROOT_COLLECTION}**. + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {object} [options.promiseLibrary] A Promise library class the application wishes to use such as Bluebird, must be ES6 compatible + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~resultCallback} [callback] result from exists. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.list = function(db, rootCollection, options, callback) { + var args = Array.prototype.slice.call(arguments, 1); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + rootCollection = args.length ? args.shift() : null; + options = args.length ? args.shift() : {}; + options = options || {}; + + return executeLegacyOperation(db.s.topology, list, [db, rootCollection, options, callback], { + skipSessions: true + }); +}; + +var list = function(db, rootCollection, options, callback) { + // Ensure we have correct values + if (rootCollection != null && typeof rootCollection === 'object') { + options = rootCollection; + rootCollection = null; + } + + // Establish read preference + var readPreference = options.readPreference || ReadPreference.primary; + // Check if we are returning by id not filename + var byId = options['id'] != null ? options['id'] : false; + // Fetch item + var rootCollectionFinal = + rootCollection != null ? rootCollection : GridStore.DEFAULT_ROOT_COLLECTION; + var items = []; + db.collection(rootCollectionFinal + '.files', function(err, collection) { + if (err) return callback(err); + + collection.find({}, { readPreference: readPreference }, function(err, cursor) { + if (err) return callback(err); + + cursor.each(function(err, item) { + if (item != null) { + items.push(byId ? item._id : item.filename); + } else { + callback(err, items); + } + }); + }); + }); +}; + +/** + * Reads the contents of a file. + * + * This method has the following signatures + * + * (db, name, callback) + * (db, name, length, callback) + * (db, name, length, offset, callback) + * (db, name, length, offset, options, callback) + * + * @method + * @static + * @param {Db} db the database to query. + * @param {string} name The name of the file. + * @param {number} [length] The size of data to read. + * @param {number} [offset] The offset from the head of the file of which to start reading from. + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {object} [options.promiseLibrary] A Promise library class the application wishes to use such as Bluebird, must be ES6 compatible + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~readCallback} [callback] the command callback. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.read = function(db, name, length, offset, options, callback) { + var args = Array.prototype.slice.call(arguments, 2); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + length = args.length ? args.shift() : null; + offset = args.length ? args.shift() : null; + options = args.length ? args.shift() : null; + options = options || {}; + + return executeLegacyOperation( + db.s.topology, + readStatic, + [db, name, length, offset, options, callback], + { skipSessions: true } + ); +}; + +var readStatic = function(db, name, length, offset, options, callback) { + new GridStore(db, name, 'r', options).open(function(err, gridStore) { + if (err) return callback(err); + // Make sure we are not reading out of bounds + if (offset && offset >= gridStore.length) + return callback('offset larger than size of file', null); + if (length && length > gridStore.length) + return callback('length is larger than the size of the file', null); + if (offset && length && offset + length > gridStore.length) + return callback('offset and length is larger than the size of the file', null); + + if (offset != null) { + gridStore.seek(offset, function(err, gridStore) { + if (err) return callback(err); + gridStore.read(length, callback); + }); + } else { + gridStore.read(length, callback); + } + }); +}; + +/** + * Read the entire file as a list of strings splitting by the provided separator. + * + * @method + * @static + * @param {Db} db the database to query. + * @param {(String|object)} name the name of the file. + * @param {string} [separator] The character to be recognized as the newline separator. + * @param {object} [options] Optional settings. + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). + * @param {object} [options.promiseLibrary] A Promise library class the application wishes to use such as Bluebird, must be ES6 compatible + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~readlinesCallback} [callback] the command callback. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.readlines = function(db, name, separator, options, callback) { + var args = Array.prototype.slice.call(arguments, 2); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + separator = args.length ? args.shift() : null; + options = args.length ? args.shift() : null; + options = options || {}; + + return executeLegacyOperation( + db.s.topology, + readlinesStatic, + [db, name, separator, options, callback], + { skipSessions: true } + ); +}; + +var readlinesStatic = function(db, name, separator, options, callback) { + var finalSeperator = separator == null ? '\n' : separator; + new GridStore(db, name, 'r', options).open(function(err, gridStore) { + if (err) return callback(err); + gridStore.readlines(finalSeperator, callback); + }); +}; + +/** + * Deletes the chunks and metadata information of a file from GridFS. + * + * @method + * @static + * @param {Db} db The database to query. + * @param {(string|array)} names The name/names of the files to delete. + * @param {object} [options] Optional settings. + * @param {object} [options.promiseLibrary] A Promise library class the application wishes to use such as Bluebird, must be ES6 compatible + * @param {ClientSession} [options.session] optional session to use for this operation + * @param {GridStore~resultCallback} [callback] the command callback. + * @return {Promise} returns Promise if no callback passed + * @deprecated Use GridFSBucket API instead + */ +GridStore.unlink = function(db, names, options, callback) { + var args = Array.prototype.slice.call(arguments, 2); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + options = args.length ? args.shift() : {}; + options = options || {}; + + return executeLegacyOperation(db.s.topology, unlinkStatic, [this, db, names, options, callback], { + skipSessions: true + }); +}; + +var unlinkStatic = function(self, db, names, options, callback) { + // Get the write concern + var writeConcern = _getWriteConcern(db, options); + + // List of names + if (names.constructor === Array) { + var tc = 0; + for (var i = 0; i < names.length; i++) { + ++tc; + GridStore.unlink(db, names[i], options, function() { + if (--tc === 0) { + callback(null, self); + } + }); + } + } else { + new GridStore(db, names, 'w', options).open(function(err, gridStore) { + if (err) return callback(err); + deleteChunks(gridStore, function(err) { + if (err) return callback(err); + gridStore.collection(function(err, collection) { + if (err) return callback(err); + collection.remove({ _id: gridStore.fileId }, writeConcern, function(err) { + callback(err, self); + }); + }); + }); + }); + } +}; + +/** + * @ignore + */ +var _writeNormal = function(self, data, close, options, callback) { + // If we have a buffer write it using the writeBuffer method + if (Buffer.isBuffer(data)) { + return writeBuffer(self, data, close, callback); + } else { + return writeBuffer(self, Buffer.from(data, 'binary'), close, callback); + } +}; + +/** + * @ignore + */ +var _setWriteConcernHash = function(options) { + const baseOptions = Object.assign(options, options.writeConcern); + var finalOptions = {}; + if (baseOptions.w != null) finalOptions.w = baseOptions.w; + if (baseOptions.journal === true) finalOptions.j = baseOptions.journal; + if (baseOptions.j === true) finalOptions.j = baseOptions.j; + if (baseOptions.fsync === true) finalOptions.fsync = baseOptions.fsync; + if (baseOptions.wtimeout != null) finalOptions.wtimeout = baseOptions.wtimeout; + return finalOptions; +}; + +/** + * @ignore + */ +var _getWriteConcern = function(self, options) { + // Final options + var finalOptions = { w: 1 }; + options = options || {}; + + // Local options verification + if ( + options.writeConcern != null || + options.w != null || + typeof options.j === 'boolean' || + typeof options.journal === 'boolean' || + typeof options.fsync === 'boolean' + ) { + finalOptions = _setWriteConcernHash(options); + } else if (options.safe != null && typeof options.safe === 'object') { + finalOptions = _setWriteConcernHash(options.safe); + } else if (typeof options.safe === 'boolean') { + finalOptions = { w: options.safe ? 1 : 0 }; + } else if ( + self.options.writeConcern != null || + self.options.w != null || + typeof self.options.j === 'boolean' || + typeof self.options.journal === 'boolean' || + typeof self.options.fsync === 'boolean' + ) { + finalOptions = _setWriteConcernHash(self.options); + } else if ( + self.safe && + (self.safe.w != null || + typeof self.safe.j === 'boolean' || + typeof self.safe.journal === 'boolean' || + typeof self.safe.fsync === 'boolean') + ) { + finalOptions = _setWriteConcernHash(self.safe); + } else if (typeof self.safe === 'boolean') { + finalOptions = { w: self.safe ? 1 : 0 }; + } + + // Ensure we don't have an invalid combination of write concerns + if ( + finalOptions.w < 1 && + (finalOptions.journal === true || finalOptions.j === true || finalOptions.fsync === true) + ) + throw MongoError.create({ + message: 'No acknowledgement using w < 1 cannot be combined with journal:true or fsync:true', + driver: true + }); + + // Return the options + return finalOptions; +}; + +/** + * Create a new GridStoreStream instance (INTERNAL TYPE, do not instantiate directly) + * + * @class + * @extends external:Duplex + * @return {GridStoreStream} a GridStoreStream instance. + * @deprecated Use GridFSBucket API instead + */ +var GridStoreStream = function(gs) { + // Initialize the duplex stream + Duplex.call(this); + + // Get the gridstore + this.gs = gs; + + // End called + this.endCalled = false; + + // If we have a seek + this.totalBytesToRead = this.gs.length - this.gs.position; + this.seekPosition = this.gs.position; +}; + +// +// Inherit duplex +inherits(GridStoreStream, Duplex); + +GridStoreStream.prototype._pipe = GridStoreStream.prototype.pipe; + +// Set up override +GridStoreStream.prototype.pipe = function(destination) { + var self = this; + + // Only open gridstore if not already open + if (!self.gs.isOpen) { + self.gs.open(function(err) { + if (err) return self.emit('error', err); + self.totalBytesToRead = self.gs.length - self.gs.position; + self._pipe.apply(self, [destination]); + }); + } else { + self.totalBytesToRead = self.gs.length - self.gs.position; + self._pipe.apply(self, [destination]); + } + + return destination; +}; + +// Called by stream +GridStoreStream.prototype._read = function() { + var self = this; + + var read = function() { + // Read data + self.gs.read(length, function(err, buffer) { + if (err && !self.endCalled) return self.emit('error', err); + + // Stream is closed + if (self.endCalled || buffer == null) return self.push(null); + // Remove bytes read + if (buffer.length <= self.totalBytesToRead) { + self.totalBytesToRead = self.totalBytesToRead - buffer.length; + self.push(buffer); + } else if (buffer.length > self.totalBytesToRead) { + self.totalBytesToRead = self.totalBytesToRead - buffer._index; + self.push(buffer.slice(0, buffer._index)); + } + + // Finished reading + if (self.totalBytesToRead <= 0) { + self.endCalled = true; + } + }); + }; + + // Set read length + var length = + self.gs.length < self.gs.chunkSize ? self.gs.length - self.seekPosition : self.gs.chunkSize; + if (!self.gs.isOpen) { + self.gs.open(function(err) { + self.totalBytesToRead = self.gs.length - self.gs.position; + if (err) return self.emit('error', err); + read(); + }); + } else { + read(); + } +}; + +GridStoreStream.prototype.destroy = function() { + this.pause(); + this.endCalled = true; + this.gs.close(); + this.emit('end'); +}; + +GridStoreStream.prototype.write = function(chunk) { + var self = this; + if (self.endCalled) + return self.emit( + 'error', + MongoError.create({ message: 'attempting to write to stream after end called', driver: true }) + ); + // Do we have to open the gridstore + if (!self.gs.isOpen) { + self.gs.open(function() { + self.gs.isOpen = true; + self.gs.write(chunk, function() { + process.nextTick(function() { + self.emit('drain'); + }); + }); + }); + return false; + } else { + self.gs.write(chunk, function() { + self.emit('drain'); + }); + return true; + } +}; + +GridStoreStream.prototype.end = function(chunk, encoding, callback) { + var self = this; + var args = Array.prototype.slice.call(arguments, 0); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + chunk = args.length ? args.shift() : null; + encoding = args.length ? args.shift() : null; + self.endCalled = true; + + if (chunk) { + self.gs.write(chunk, function() { + self.gs.close(function() { + if (typeof callback === 'function') callback(); + self.emit('end'); + }); + }); + } + + self.gs.close(function() { + if (typeof callback === 'function') callback(); + self.emit('end'); + }); +}; + +/** + * The read() method pulls some data out of the internal buffer and returns it. If there is no data available, then it will return null. + * @function external:Duplex#read + * @param {number} size Optional argument to specify how much data to read. + * @return {(String | Buffer | null)} + */ + +/** + * Call this function to cause the stream to return strings of the specified encoding instead of Buffer objects. + * @function external:Duplex#setEncoding + * @param {string} encoding The encoding to use. + * @return {null} + */ + +/** + * This method will cause the readable stream to resume emitting data events. + * @function external:Duplex#resume + * @return {null} + */ + +/** + * This method will cause a stream in flowing-mode to stop emitting data events. Any data that becomes available will remain in the internal buffer. + * @function external:Duplex#pause + * @return {null} + */ + +/** + * This method pulls all the data out of a readable stream, and writes it to the supplied destination, automatically managing the flow so that the destination is not overwhelmed by a fast readable stream. + * @function external:Duplex#pipe + * @param {Writable} destination The destination for writing data + * @param {object} [options] Pipe options + * @return {null} + */ + +/** + * This method will remove the hooks set up for a previous pipe() call. + * @function external:Duplex#unpipe + * @param {Writable} [destination] The destination for writing data + * @return {null} + */ + +/** + * This is useful in certain cases where a stream is being consumed by a parser, which needs to "un-consume" some data that it has optimistically pulled out of the source, so that the stream can be passed on to some other party. + * @function external:Duplex#unshift + * @param {(Buffer|string)} chunk Chunk of data to unshift onto the read queue. + * @return {null} + */ + +/** + * Versions of Node prior to v0.10 had streams that did not implement the entire Streams API as it is today. (See "Compatibility" below for more information.) + * @function external:Duplex#wrap + * @param {Stream} stream An "old style" readable stream. + * @return {null} + */ + +/** + * This method writes some data to the underlying system, and calls the supplied callback once the data has been fully handled. + * @function external:Duplex#write + * @param {(string|Buffer)} chunk The data to write + * @param {string} encoding The encoding, if chunk is a String + * @param {function} callback Callback for when this chunk of data is flushed + * @return {boolean} + */ + +/** + * Call this method when no more data will be written to the stream. If supplied, the callback is attached as a listener on the finish event. + * @function external:Duplex#end + * @param {(string|Buffer)} chunk The data to write + * @param {string} encoding The encoding, if chunk is a String + * @param {function} callback Callback for when this chunk of data is flushed + * @return {null} + */ + +/** + * GridStoreStream stream data event, fired for each document in the cursor. + * + * @event GridStoreStream#data + * @type {object} + */ + +/** + * GridStoreStream stream end event + * + * @event GridStoreStream#end + * @type {null} + */ + +/** + * GridStoreStream stream close event + * + * @event GridStoreStream#close + * @type {null} + */ + +/** + * GridStoreStream stream readable event + * + * @event GridStoreStream#readable + * @type {null} + */ + +/** + * GridStoreStream stream drain event + * + * @event GridStoreStream#drain + * @type {null} + */ + +/** + * GridStoreStream stream finish event + * + * @event GridStoreStream#finish + * @type {null} + */ + +/** + * GridStoreStream stream pipe event + * + * @event GridStoreStream#pipe + * @type {null} + */ + +/** + * GridStoreStream stream unpipe event + * + * @event GridStoreStream#unpipe + * @type {null} + */ + +/** + * GridStoreStream stream error event + * + * @event GridStoreStream#error + * @type {null} + */ + +/** + * @ignore + */ +module.exports = GridStore; diff --git a/node_modules/mongodb/lib/mongo_client.js b/node_modules/mongodb/lib/mongo_client.js new file mode 100644 index 00000000..cc8c8a39 --- /dev/null +++ b/node_modules/mongodb/lib/mongo_client.js @@ -0,0 +1,545 @@ +'use strict'; + +const ChangeStream = require('./change_stream'); +const Db = require('./db'); +const EventEmitter = require('events').EventEmitter; +const inherits = require('util').inherits; +const MongoError = require('./core').MongoError; +const deprecate = require('util').deprecate; +const WriteConcern = require('./write_concern'); +const MongoDBNamespace = require('./utils').MongoDBNamespace; +const ReadPreference = require('./core/topologies/read_preference'); +const maybePromise = require('./utils').maybePromise; +const NativeTopology = require('./topologies/native_topology'); +const connect = require('./operations/connect').connect; +const validOptions = require('./operations/connect').validOptions; + +/** + * @fileOverview The **MongoClient** class is a class that allows for making Connections to MongoDB. + * + * @example + * // Connect using a MongoClient instance + * const MongoClient = require('mongodb').MongoClient; + * const test = require('assert'); + * // Connection url + * const url = 'mongodb://localhost:27017'; + * // Database Name + * const dbName = 'test'; + * // Connect using MongoClient + * const mongoClient = new MongoClient(url); + * mongoClient.connect(function(err, client) { + * const db = client.db(dbName); + * client.close(); + * }); + * + * @example + * // Connect using the MongoClient.connect static method + * const MongoClient = require('mongodb').MongoClient; + * const test = require('assert'); + * // Connection url + * const url = 'mongodb://localhost:27017'; + * // Database Name + * const dbName = 'test'; + * // Connect using MongoClient + * MongoClient.connect(url, function(err, client) { + * const db = client.db(dbName); + * client.close(); + * }); + */ + +/** + * A string specifying the level of a ReadConcern + * @typedef {'local'|'available'|'majority'|'linearizable'|'snapshot'} ReadConcernLevel + * @see https://docs.mongodb.com/manual/reference/read-concern/index.html#read-concern-levels + */ + +/** + * Configuration options for drivers wrapping the node driver. + * + * @typedef {Object} DriverInfoOptions + * @property {string} [name] The name of the driver + * @property {string} [version] The version of the driver + * @property {string} [platform] Optional platform information + */ + +/** + * Configuration options for drivers wrapping the node driver. + * + * @typedef {Object} DriverInfoOptions + * @property {string} [name] The name of the driver + * @property {string} [version] The version of the driver + * @property {string} [platform] Optional platform information + */ + +/** + * Creates a new MongoClient instance + * @class + * @param {string} url The connection URI string + * @param {object} [options] Optional settings + * @param {number} [options.poolSize=5] The maximum size of the individual server pool + * @param {boolean} [options.ssl=false] Enable SSL connection. *deprecated* use `tls` variants + * @param {boolean} [options.sslValidate=false] Validate mongod server certificate against Certificate Authority + * @param {buffer} [options.sslCA=undefined] SSL Certificate store binary buffer *deprecated* use `tls` variants + * @param {buffer} [options.sslCert=undefined] SSL Certificate binary buffer *deprecated* use `tls` variants + * @param {buffer} [options.sslKey=undefined] SSL Key file binary buffer *deprecated* use `tls` variants + * @param {string} [options.sslPass=undefined] SSL Certificate pass phrase *deprecated* use `tls` variants + * @param {buffer} [options.sslCRL=undefined] SSL Certificate revocation list binary buffer *deprecated* use `tls` variants + * @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function. *deprecated* use `tls` variants + * @param {boolean} [options.tls=false] Enable TLS connections + * @param {boolean} [options.tlsInsecure=false] Relax TLS constraints, disabling validation + * @param {string} [options.tlsCAFile] A path to file with either a single or bundle of certificate authorities to be considered trusted when making a TLS connection + * @param {string} [options.tlsCertificateKeyFile] A path to the client certificate file or the client private key file; in the case that they both are needed, the files should be concatenated + * @param {string} [options.tlsCertificateKeyFilePassword] The password to decrypt the client private key to be used for TLS connections + * @param {boolean} [options.tlsAllowInvalidCertificates] Specifies whether or not the driver should error when the server’s TLS certificate is invalid + * @param {boolean} [options.tlsAllowInvalidHostnames] Specifies whether or not the driver should error when there is a mismatch between the server’s hostname and the hostname specified by the TLS certificate + * @param {boolean} [options.autoReconnect=true] Enable autoReconnect for single server instances + * @param {boolean} [options.noDelay=true] TCP Connection no delay + * @param {boolean} [options.keepAlive=true] TCP Connection keep alive enabled + * @param {number} [options.keepAliveInitialDelay=120000] The number of milliseconds to wait before initiating keepAlive on the TCP socket + * @param {number} [options.connectTimeoutMS=10000] How long to wait for a connection to be established before timing out + * @param {number} [options.socketTimeoutMS=0] How long a send or receive on a socket can take before timing out + * @param {number} [options.family] Version of IP stack. Can be 4, 6 or null (default). + * If null, will attempt to connect with IPv6, and will fall back to IPv4 on failure + * @param {number} [options.reconnectTries=30] Server attempt to reconnect #times + * @param {number} [options.reconnectInterval=1000] Server will wait # milliseconds between retries + * @param {boolean} [options.ha=true] Control if high availability monitoring runs for Replicaset or Mongos proxies + * @param {number} [options.haInterval=10000] The High availability period for replicaset inquiry + * @param {string} [options.replicaSet=undefined] The Replicaset set name + * @param {number} [options.secondaryAcceptableLatencyMS=15] Cutoff latency point in MS for Replicaset member selection + * @param {number} [options.acceptableLatencyMS=15] Cutoff latency point in MS for Mongos proxies selection + * @param {boolean} [options.connectWithNoPrimary=false] Sets if the driver should connect even if no primary is available + * @param {string} [options.authSource=undefined] Define the database to authenticate against + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {boolean} [options.fsync=false] **Deprecated** Specify a file sync write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.forceServerObjectId=false] Force server to assign _id values instead of driver + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields + * @param {boolean} [options.raw=false] Return document results as raw BSON buffers + * @param {number} [options.bufferMaxEntries=-1] Sets a cap on how many operations the driver will buffer up before giving up on getting a working connection, default is -1 which is unlimited + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST) + * @param {object} [options.pkFactory] A primary key factory object for generation of custom _id keys + * @param {object} [options.promiseLibrary] A Promise library class the application wishes to use such as Bluebird, must be ES6 compatible + * @param {object} [options.readConcern] Specify a read concern for the collection (only MongoDB 3.2 or higher supported) + * @param {ReadConcernLevel} [options.readConcern.level='local'] Specify a read concern level for the collection operations (only MongoDB 3.2 or higher supported) + * @param {number} [options.maxStalenessSeconds=undefined] The max staleness to secondary reads (values under 10 seconds cannot be guaranteed) + * @param {string} [options.loggerLevel=undefined] The logging level (error/warn/info/debug) + * @param {object} [options.logger=undefined] Custom logger object + * @param {boolean} [options.promoteValues=true] Promotes BSON values to native types where possible, set to false to only receive wrapper types + * @param {boolean} [options.promoteBuffers=false] Promotes Binary BSON values to native Node Buffers + * @param {boolean} [options.promoteLongs=true] Promotes long values to number if they fit inside the 53 bits resolution + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit + * @param {object} [options.validateOptions=false] Validate MongoClient passed in options for correctness + * @param {string} [options.appname=undefined] The name of the application that created this MongoClient instance. MongoDB 3.4 and newer will print this value in the server log upon establishing each connection. It is also recorded in the slow query log and profile collections + * @param {string} [options.auth.user=undefined] The username for auth + * @param {string} [options.auth.password=undefined] The password for auth + * @param {string} [options.authMechanism] An authentication mechanism to use for connection authentication, see the {@link https://docs.mongodb.com/manual/reference/connection-string/#urioption.authMechanism|authMechanism} reference for supported options. + * @param {object} [options.compression] Type of compression to use: snappy or zlib + * @param {array} [options.readPreferenceTags] Read preference tags + * @param {number} [options.numberOfRetries=5] The number of retries for a tailable cursor + * @param {boolean} [options.auto_reconnect=true] Enable auto reconnecting for single server instances + * @param {boolean} [options.monitorCommands=false] Enable command monitoring for this client + * @param {number} [options.minSize] If present, the connection pool will be initialized with minSize connections, and will never dip below minSize connections + * @param {boolean} [options.useNewUrlParser=true] Determines whether or not to use the new url parser. Enables the new, spec-compliant, url parser shipped in the core driver. This url parser fixes a number of problems with the original parser, and aims to outright replace that parser in the near future. Defaults to true, and must be explicitly set to false to use the legacy url parser. + * @param {boolean} [options.useUnifiedTopology] Enables the new unified topology layer + * @param {Number} [options.localThresholdMS=15] **Only applies to the unified topology** The size of the latency window for selecting among multiple suitable servers + * @param {Number} [options.serverSelectionTimeoutMS=30000] **Only applies to the unified topology** How long to block for server selection before throwing an error + * @param {Number} [options.heartbeatFrequencyMS=10000] **Only applies to the unified topology** The frequency with which topology updates are scheduled + * @param {number} [options.maxPoolSize=10] **Only applies to the unified topology** The maximum number of connections that may be associated with a pool at a given time. This includes in use and available connections. + * @param {number} [options.minPoolSize=0] **Only applies to the unified topology** The minimum number of connections that MUST exist at any moment in a single connection pool. + * @param {number} [options.maxIdleTimeMS] **Only applies to the unified topology** The maximum amount of time a connection should remain idle in the connection pool before being marked idle. The default is infinity. + * @param {number} [options.waitQueueTimeoutMS=0] **Only applies to the unified topology** The maximum amount of time operation execution should wait for a connection to become available. The default is 0 which means there is no limit. + * @param {AutoEncrypter~AutoEncryptionOptions} [options.autoEncryption] Optionally enable client side auto encryption + * @param {DriverInfoOptions} [options.driverInfo] Allows a wrapping driver to amend the client metadata generated by the driver to include information about the wrapping driver + * @param {boolean} [options.directConnection=false] Enable directConnection + * @param {MongoClient~connectCallback} [callback] The command result callback + * @return {MongoClient} a MongoClient instance + */ +function MongoClient(url, options) { + if (!(this instanceof MongoClient)) return new MongoClient(url, options); + // Set up event emitter + EventEmitter.call(this); + + // The internal state + this.s = { + url: url, + options: options || {}, + promiseLibrary: (options && options.promiseLibrary) || Promise, + dbCache: new Map(), + sessions: new Set(), + writeConcern: WriteConcern.fromOptions(options), + readPreference: ReadPreference.fromOptions(options) || ReadPreference.primary, + namespace: new MongoDBNamespace('admin') + }; +} + +/** + * @ignore + */ +inherits(MongoClient, EventEmitter); + +Object.defineProperty(MongoClient.prototype, 'writeConcern', { + enumerable: true, + get: function() { + return this.s.writeConcern; + } +}); + +Object.defineProperty(MongoClient.prototype, 'readPreference', { + enumerable: true, + get: function() { + return this.s.readPreference; + } +}); + +/** + * The callback format for results + * @callback MongoClient~connectCallback + * @param {MongoError} error An error instance representing the error during the execution. + * @param {MongoClient} client The connected client. + */ + +/** + * Connect to MongoDB using a url as documented at + * + * docs.mongodb.org/manual/reference/connection-string/ + * + * Note that for replicasets the replicaSet query parameter is required in the 2.0 driver + * + * @method + * @param {MongoClient~connectCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +MongoClient.prototype.connect = function(callback) { + if (typeof callback === 'string') { + throw new TypeError('`connect` only accepts a callback'); + } + + const client = this; + return maybePromise(this, callback, cb => { + const err = validOptions(client.s.options); + if (err) return cb(err); + + connect(client, client.s.url, client.s.options, err => { + if (err) return cb(err); + cb(null, client); + }); + }); +}; + +MongoClient.prototype.logout = deprecate(function(options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + if (typeof callback === 'function') callback(null, true); +}, 'Multiple authentication is prohibited on a connected client, please only authenticate once per MongoClient'); + +/** + * Close the db and its underlying connections + * @method + * @param {boolean} [force=false] Force close, emitting no events + * @param {Db~noResultCallback} [callback] The result callback + * @return {Promise} returns Promise if no callback passed + */ +MongoClient.prototype.close = function(force, callback) { + if (typeof force === 'function') { + callback = force; + force = false; + } + + const client = this; + return maybePromise(this, callback, cb => { + const completeClose = err => { + client.emit('close', client); + + if (!(client.topology instanceof NativeTopology)) { + for (const item of client.s.dbCache) { + item[1].emit('close', client); + } + } + + client.removeAllListeners('close'); + cb(err); + }; + + if (client.topology == null) { + completeClose(); + return; + } + + client.topology.close(force, err => { + const autoEncrypter = client.topology.s.options.autoEncrypter; + if (!autoEncrypter) { + completeClose(err); + return; + } + + autoEncrypter.teardown(force, err2 => completeClose(err || err2)); + }); + }); +}; + +/** + * Create a new Db instance sharing the current socket connections. Be aware that the new db instances are + * related in a parent-child relationship to the original instance so that events are correctly emitted on child + * db instances. Child db instances are cached so performing db('db1') twice will return the same instance. + * You can control these behaviors with the options noListener and returnNonCachedInstance. + * + * @method + * @param {string} [dbName] The name of the database we want to use. If not provided, use database name from connection string. + * @param {object} [options] Optional settings. + * @param {boolean} [options.noListener=false] Do not make the db an event listener to the original connection. + * @param {boolean} [options.returnNonCachedInstance=false] Control if you want to return a cached instance or have a new one created + * @return {Db} + */ +MongoClient.prototype.db = function(dbName, options) { + options = options || {}; + + // Default to db from connection string if not provided + if (!dbName) { + dbName = this.s.options.dbName; + } + + // Copy the options and add out internal override of the not shared flag + const finalOptions = Object.assign({}, this.s.options, options); + + // Do we have the db in the cache already + if (this.s.dbCache.has(dbName) && finalOptions.returnNonCachedInstance !== true) { + return this.s.dbCache.get(dbName); + } + + // Add promiseLibrary + finalOptions.promiseLibrary = this.s.promiseLibrary; + + // If no topology throw an error message + if (!this.topology) { + throw new MongoError('MongoClient must be connected before calling MongoClient.prototype.db'); + } + + // Return the db object + const db = new Db(dbName, this.topology, finalOptions); + + // Add the db to the cache + this.s.dbCache.set(dbName, db); + // Return the database + return db; +}; + +/** + * Check if MongoClient is connected + * + * @method + * @param {object} [options] Optional settings. + * @param {boolean} [options.noListener=false] Do not make the db an event listener to the original connection. + * @param {boolean} [options.returnNonCachedInstance=false] Control if you want to return a cached instance or have a new one created + * @return {boolean} + */ +MongoClient.prototype.isConnected = function(options) { + options = options || {}; + + if (!this.topology) return false; + return this.topology.isConnected(options); +}; + +/** + * Connect to MongoDB using a url as documented at + * + * docs.mongodb.org/manual/reference/connection-string/ + * + * Note that for replicasets the replicaSet query parameter is required in the 2.0 driver + * + * @method + * @static + * @param {string} url The connection URI string + * @param {object} [options] Optional settings + * @param {number} [options.poolSize=5] The maximum size of the individual server pool + * @param {boolean} [options.ssl=false] Enable SSL connection. *deprecated* use `tls` variants + * @param {boolean} [options.sslValidate=false] Validate mongod server certificate against Certificate Authority + * @param {buffer} [options.sslCA=undefined] SSL Certificate store binary buffer *deprecated* use `tls` variants + * @param {buffer} [options.sslCert=undefined] SSL Certificate binary buffer *deprecated* use `tls` variants + * @param {buffer} [options.sslKey=undefined] SSL Key file binary buffer *deprecated* use `tls` variants + * @param {string} [options.sslPass=undefined] SSL Certificate pass phrase *deprecated* use `tls` variants + * @param {buffer} [options.sslCRL=undefined] SSL Certificate revocation list binary buffer *deprecated* use `tls` variants + * @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function. *deprecated* use `tls` variants + * @param {boolean} [options.tls=false] Enable TLS connections + * @param {boolean} [options.tlsInsecure=false] Relax TLS constraints, disabling validation + * @param {string} [options.tlsCAFile] A path to file with either a single or bundle of certificate authorities to be considered trusted when making a TLS connection + * @param {string} [options.tlsCertificateKeyFile] A path to the client certificate file or the client private key file; in the case that they both are needed, the files should be concatenated + * @param {string} [options.tlsCertificateKeyFilePassword] The password to decrypt the client private key to be used for TLS connections + * @param {boolean} [options.tlsAllowInvalidCertificates] Specifies whether or not the driver should error when the server’s TLS certificate is invalid + * @param {boolean} [options.tlsAllowInvalidHostnames] Specifies whether or not the driver should error when there is a mismatch between the server’s hostname and the hostname specified by the TLS certificate + * @param {boolean} [options.autoReconnect=true] Enable autoReconnect for single server instances + * @param {boolean} [options.noDelay=true] TCP Connection no delay + * @param {boolean} [options.keepAlive=true] TCP Connection keep alive enabled + * @param {number} [options.keepAliveInitialDelay=120000] The number of milliseconds to wait before initiating keepAlive on the TCP socket + * @param {number} [options.connectTimeoutMS=10000] How long to wait for a connection to be established before timing out + * @param {number} [options.socketTimeoutMS=0] How long a send or receive on a socket can take before timing out + * @param {number} [options.family] Version of IP stack. Can be 4, 6 or null (default). + * If null, will attempt to connect with IPv6, and will fall back to IPv4 on failure + * @param {number} [options.reconnectTries=30] Server attempt to reconnect #times + * @param {number} [options.reconnectInterval=1000] Server will wait # milliseconds between retries + * @param {boolean} [options.ha=true] Control if high availability monitoring runs for Replicaset or Mongos proxies + * @param {number} [options.haInterval=10000] The High availability period for replicaset inquiry + * @param {string} [options.replicaSet=undefined] The Replicaset set name + * @param {number} [options.secondaryAcceptableLatencyMS=15] Cutoff latency point in MS for Replicaset member selection + * @param {number} [options.acceptableLatencyMS=15] Cutoff latency point in MS for Mongos proxies selection + * @param {boolean} [options.connectWithNoPrimary=false] Sets if the driver should connect even if no primary is available + * @param {string} [options.authSource=undefined] Define the database to authenticate against + * @param {(number|string)} [options.w] **Deprecated** The write concern. Use writeConcern instead. + * @param {number} [options.wtimeout] **Deprecated** The write concern timeout. Use writeConcern instead. + * @param {boolean} [options.j=false] **Deprecated** Specify a journal write concern. Use writeConcern instead. + * @param {boolean} [options.fsync=false] **Deprecated** Specify a file sync write concern. Use writeConcern instead. + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @param {boolean} [options.forceServerObjectId=false] Force server to assign _id values instead of driver + * @param {boolean} [options.serializeFunctions=false] Serialize functions on any object + * @param {Boolean} [options.ignoreUndefined=false] Specify if the BSON serializer should ignore undefined fields + * @param {boolean} [options.raw=false] Return document results as raw BSON buffers + * @param {number} [options.bufferMaxEntries=-1] Sets a cap on how many operations the driver will buffer up before giving up on getting a working connection, default is -1 which is unlimited + * @param {(ReadPreference|string)} [options.readPreference] The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST) + * @param {object} [options.pkFactory] A primary key factory object for generation of custom _id keys + * @param {object} [options.promiseLibrary] A Promise library class the application wishes to use such as Bluebird, must be ES6 compatible + * @param {object} [options.readConcern] Specify a read concern for the collection (only MongoDB 3.2 or higher supported) + * @param {ReadConcernLevel} [options.readConcern.level='local'] Specify a read concern level for the collection operations (only MongoDB 3.2 or higher supported) + * @param {number} [options.maxStalenessSeconds=undefined] The max staleness to secondary reads (values under 10 seconds cannot be guaranteed) + * @param {string} [options.loggerLevel=undefined] The logging level (error/warn/info/debug) + * @param {object} [options.logger=undefined] Custom logger object + * @param {boolean} [options.promoteValues=true] Promotes BSON values to native types where possible, set to false to only receive wrapper types + * @param {boolean} [options.promoteBuffers=false] Promotes Binary BSON values to native Node Buffers + * @param {boolean} [options.promoteLongs=true] Promotes long values to number if they fit inside the 53 bits resolution + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit + * @param {object} [options.validateOptions=false] Validate MongoClient passed in options for correctness + * @param {string} [options.appname=undefined] The name of the application that created this MongoClient instance. MongoDB 3.4 and newer will print this value in the server log upon establishing each connection. It is also recorded in the slow query log and profile collections + * @param {string} [options.auth.user=undefined] The username for auth + * @param {string} [options.auth.password=undefined] The password for auth + * @param {string} [options.authMechanism] An authentication mechanism to use for connection authentication, see the {@link https://docs.mongodb.com/manual/reference/connection-string/#urioption.authMechanism|authMechanism} reference for supported options. + * @param {object} [options.compression] Type of compression to use: snappy or zlib + * @param {array} [options.readPreferenceTags] Read preference tags + * @param {number} [options.numberOfRetries=5] The number of retries for a tailable cursor + * @param {boolean} [options.auto_reconnect=true] Enable auto reconnecting for single server instances + * @param {boolean} [options.monitorCommands=false] Enable command monitoring for this client + * @param {number} [options.minSize] If present, the connection pool will be initialized with minSize connections, and will never dip below minSize connections + * @param {boolean} [options.directConnection=false] Enable directConnection + * @param {boolean} [options.useNewUrlParser=true] Determines whether or not to use the new url parser. Enables the new, spec-compliant, url parser shipped in the core driver. This url parser fixes a number of problems with the original parser, and aims to outright replace that parser in the near future. Defaults to true, and must be explicitly set to false to use the legacy url parser. + * @param {boolean} [options.useUnifiedTopology] Enables the new unified topology layer + * @param {Number} [options.localThresholdMS=15] **Only applies to the unified topology** The size of the latency window for selecting among multiple suitable servers + * @param {Number} [options.serverSelectionTimeoutMS=30000] **Only applies to the unified topology** How long to block for server selection before throwing an error + * @param {Number} [options.heartbeatFrequencyMS=10000] **Only applies to the unified topology** The frequency with which topology updates are scheduled + * @param {number} [options.maxPoolSize=10] **Only applies to the unified topology** The maximum number of connections that may be associated with a pool at a given time. This includes in use and available connections. + * @param {number} [options.minPoolSize=0] **Only applies to the unified topology** The minimum number of connections that MUST exist at any moment in a single connection pool. + * @param {number} [options.maxIdleTimeMS] **Only applies to the unified topology** The maximum amount of time a connection should remain idle in the connection pool before being marked idle. The default is infinity. + * @param {number} [options.waitQueueTimeoutMS=0] **Only applies to the unified topology** The maximum amount of time operation execution should wait for a connection to become available. The default is 0 which means there is no limit. + * @param {AutoEncrypter~AutoEncryptionOptions} [options.autoEncryption] Optionally enable client side auto encryption + * @param {DriverInfoOptions} [options.driverInfo] Allows a wrapping driver to amend the client metadata generated by the driver to include information about the wrapping driver + * @param {MongoClient~connectCallback} [callback] The command result callback + * @return {Promise} returns Promise if no callback passed + */ +MongoClient.connect = function(url, options, callback) { + const args = Array.prototype.slice.call(arguments, 1); + callback = typeof args[args.length - 1] === 'function' ? args.pop() : undefined; + options = args.length ? args.shift() : null; + options = options || {}; + + // Create client + const mongoClient = new MongoClient(url, options); + // Execute the connect method + return mongoClient.connect(callback); +}; + +/** + * Starts a new session on the server + * + * @param {SessionOptions} [options] optional settings for a driver session + * @return {ClientSession} the newly established session + */ +MongoClient.prototype.startSession = function(options) { + options = Object.assign({ explicit: true }, options); + if (!this.topology) { + throw new MongoError('Must connect to a server before calling this method'); + } + + if (!this.topology.hasSessionSupport()) { + throw new MongoError('Current topology does not support sessions'); + } + + return this.topology.startSession(options, this.s.options); +}; + +/** + * Runs a given operation with an implicitly created session. The lifetime of the session + * will be handled without the need for user interaction. + * + * NOTE: presently the operation MUST return a Promise (either explicit or implicity as an async function) + * + * @param {Object} [options] Optional settings to be appled to implicitly created session + * @param {Function} operation An operation to execute with an implicitly created session. The signature of this MUST be `(session) => {}` + * @return {Promise} + */ +MongoClient.prototype.withSession = function(options, operation) { + if (typeof options === 'function') (operation = options), (options = undefined); + const session = this.startSession(options); + + let cleanupHandler = (err, result, opts) => { + // prevent multiple calls to cleanupHandler + cleanupHandler = () => { + throw new ReferenceError('cleanupHandler was called too many times'); + }; + + opts = Object.assign({ throw: true }, opts); + session.endSession(); + + if (err) { + if (opts.throw) throw err; + return Promise.reject(err); + } + }; + + try { + const result = operation(session); + return Promise.resolve(result) + .then(result => cleanupHandler(null, result)) + .catch(err => cleanupHandler(err, null, { throw: true })); + } catch (err) { + return cleanupHandler(err, null, { throw: false }); + } +}; +/** + * Create a new Change Stream, watching for new changes (insertions, updates, replacements, deletions, and invalidations) in this cluster. Will ignore all changes to system collections, as well as the local, admin, + * and config databases. + * @method + * @since 3.1.0 + * @param {Array} [pipeline] An array of {@link https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/|aggregation pipeline stages} through which to pass change stream documents. This allows for filtering (using $match) and manipulating the change stream documents. + * @param {object} [options] Optional settings + * @param {string} [options.fullDocument='default'] Allowed values: ‘default’, ‘updateLookup’. When set to ‘updateLookup’, the change stream will include both a delta describing the changes to the document, as well as a copy of the entire document that was changed from some time after the change occurred. + * @param {object} [options.resumeAfter] Specifies the logical starting point for the new change stream. This should be the _id field from a previously returned change stream document. + * @param {number} [options.maxAwaitTimeMS] The maximum amount of time for the server to wait on new documents to satisfy a change stream query + * @param {number} [options.batchSize=1000] The number of documents to return per batch. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {object} [options.collation] Specify collation settings for operation. See {@link https://docs.mongodb.com/manual/reference/command/aggregate|aggregation documentation}. + * @param {ReadPreference} [options.readPreference] The read preference. See {@link https://docs.mongodb.com/manual/reference/read-preference|read preference documentation}. + * @param {Timestamp} [options.startAtOperationTime] receive change events that occur after the specified timestamp + * @param {ClientSession} [options.session] optional session to use for this operation + * @return {ChangeStream} a ChangeStream instance. + */ +MongoClient.prototype.watch = function(pipeline, options) { + pipeline = pipeline || []; + options = options || {}; + + // Allow optionally not specifying a pipeline + if (!Array.isArray(pipeline)) { + options = pipeline; + pipeline = []; + } + + return new ChangeStream(this, pipeline, options); +}; + +/** + * Return the mongo client logger + * @method + * @return {Logger} return the mongo client logger + * @ignore + */ +MongoClient.prototype.getLogger = function() { + return this.s.options.logger; +}; + +module.exports = MongoClient; diff --git a/node_modules/mongodb/lib/operations/add_user.js b/node_modules/mongodb/lib/operations/add_user.js new file mode 100644 index 00000000..9c025107 --- /dev/null +++ b/node_modules/mongodb/lib/operations/add_user.js @@ -0,0 +1,98 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const CommandOperation = require('./command'); +const defineAspects = require('./operation').defineAspects; +const crypto = require('crypto'); +const handleCallback = require('../utils').handleCallback; +const toError = require('../utils').toError; + +class AddUserOperation extends CommandOperation { + constructor(db, username, password, options) { + super(db, options); + + this.username = username; + this.password = password; + } + + _buildCommand() { + const db = this.db; + const username = this.username; + const password = this.password; + const options = this.options; + + // Get additional values + let roles = []; + if (Array.isArray(options.roles)) roles = options.roles; + if (typeof options.roles === 'string') roles = [options.roles]; + + // If not roles defined print deprecated message + // TODO: handle deprecation properly + if (roles.length === 0) { + console.log('Creating a user without roles is deprecated in MongoDB >= 2.6'); + } + + // Check the db name and add roles if needed + if ( + (db.databaseName.toLowerCase() === 'admin' || options.dbName === 'admin') && + !Array.isArray(options.roles) + ) { + roles = ['root']; + } else if (!Array.isArray(options.roles)) { + roles = ['dbOwner']; + } + + const digestPassword = db.s.topology.lastIsMaster().maxWireVersion >= 7; + + let userPassword = password; + + if (!digestPassword) { + // Use node md5 generator + const md5 = crypto.createHash('md5'); + // Generate keys used for authentication + md5.update(username + ':mongo:' + password); + userPassword = md5.digest('hex'); + } + + // Build the command to execute + const command = { + createUser: username, + customData: options.customData || {}, + roles: roles, + digestPassword + }; + + // No password + if (typeof password === 'string') { + command.pwd = userPassword; + } + + return command; + } + + execute(callback) { + const options = this.options; + + // Error out if digestPassword set + if (options.digestPassword != null) { + return callback( + toError( + "The digestPassword option is not supported via add_user. Please use db.command('createUser', ...) instead for this option." + ) + ); + } + + // Attempt to execute auth command + super.execute((err, r) => { + if (!err) { + return handleCallback(callback, err, r); + } + + return handleCallback(callback, err, null); + }); + } +} + +defineAspects(AddUserOperation, Aspect.WRITE_OPERATION); + +module.exports = AddUserOperation; diff --git a/node_modules/mongodb/lib/operations/admin_ops.js b/node_modules/mongodb/lib/operations/admin_ops.js new file mode 100644 index 00000000..d5f3516e --- /dev/null +++ b/node_modules/mongodb/lib/operations/admin_ops.js @@ -0,0 +1,62 @@ +'use strict'; + +const executeCommand = require('./db_ops').executeCommand; +const executeDbAdminCommand = require('./db_ops').executeDbAdminCommand; + +/** + * Get ReplicaSet status + * + * @param {Admin} a collection instance. + * @param {Object} [options] Optional settings. See Admin.prototype.replSetGetStatus for a list of options. + * @param {Admin~resultCallback} [callback] The command result callback. + */ +function replSetGetStatus(admin, options, callback) { + executeDbAdminCommand(admin.s.db, { replSetGetStatus: 1 }, options, callback); +} + +/** + * Retrieve this db's server status. + * + * @param {Admin} a collection instance. + * @param {Object} [options] Optional settings. See Admin.prototype.serverStatus for a list of options. + * @param {Admin~resultCallback} [callback] The command result callback + */ +function serverStatus(admin, options, callback) { + executeDbAdminCommand(admin.s.db, { serverStatus: 1 }, options, callback); +} + +/** + * Validate an existing collection + * + * @param {Admin} a collection instance. + * @param {string} collectionName The name of the collection to validate. + * @param {Object} [options] Optional settings. See Admin.prototype.validateCollection for a list of options. + * @param {Admin~resultCallback} [callback] The command result callback. + */ +function validateCollection(admin, collectionName, options, callback) { + const command = { validate: collectionName }; + const keys = Object.keys(options); + + // Decorate command with extra options + for (let i = 0; i < keys.length; i++) { + if (Object.prototype.hasOwnProperty.call(options, keys[i]) && keys[i] !== 'session') { + command[keys[i]] = options[keys[i]]; + } + } + + executeCommand(admin.s.db, command, options, (err, doc) => { + if (err != null) return callback(err, null); + + if (doc.ok === 0) return callback(new Error('Error with validate command'), null); + if (doc.result != null && doc.result.constructor !== String) + return callback(new Error('Error with validation data'), null); + if (doc.result != null && doc.result.match(/exception|corrupt/) != null) + return callback(new Error('Error: invalid collection ' + collectionName), null); + if (doc.valid != null && !doc.valid) + return callback(new Error('Error: invalid collection ' + collectionName), null); + + return callback(null, doc); + }); +} + +module.exports = { replSetGetStatus, serverStatus, validateCollection }; diff --git a/node_modules/mongodb/lib/operations/aggregate.js b/node_modules/mongodb/lib/operations/aggregate.js new file mode 100644 index 00000000..ca69a52e --- /dev/null +++ b/node_modules/mongodb/lib/operations/aggregate.js @@ -0,0 +1,104 @@ +'use strict'; + +const CommandOperationV2 = require('./command_v2'); +const MongoError = require('../core').MongoError; +const maxWireVersion = require('../core/utils').maxWireVersion; +const ReadPreference = require('../core').ReadPreference; +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; + +const DB_AGGREGATE_COLLECTION = 1; +const MIN_WIRE_VERSION_$OUT_READ_CONCERN_SUPPORT = 8; + +class AggregateOperation extends CommandOperationV2 { + constructor(parent, pipeline, options) { + super(parent, options, { fullResponse: true }); + + this.target = + parent.s.namespace && parent.s.namespace.collection + ? parent.s.namespace.collection + : DB_AGGREGATE_COLLECTION; + + this.pipeline = pipeline; + + // determine if we have a write stage, override read preference if so + this.hasWriteStage = false; + if (typeof options.out === 'string') { + this.pipeline = this.pipeline.concat({ $out: options.out }); + this.hasWriteStage = true; + } else if (pipeline.length > 0) { + const finalStage = pipeline[pipeline.length - 1]; + if (finalStage.$out || finalStage.$merge) { + this.hasWriteStage = true; + } + } + + if (this.hasWriteStage) { + this.readPreference = ReadPreference.primary; + } + + if (this.explain && this.writeConcern) { + throw new MongoError('"explain" cannot be used on an aggregate call with writeConcern'); + } + + if (options.cursor != null && typeof options.cursor !== 'object') { + throw new MongoError('cursor options must be an object'); + } + } + + get canRetryRead() { + return !this.hasWriteStage; + } + + addToPipeline(stage) { + this.pipeline.push(stage); + } + + execute(server, callback) { + const options = this.options; + const serverWireVersion = maxWireVersion(server); + const command = { aggregate: this.target, pipeline: this.pipeline }; + + if (this.hasWriteStage && serverWireVersion < MIN_WIRE_VERSION_$OUT_READ_CONCERN_SUPPORT) { + this.readConcern = null; + } + + if (serverWireVersion >= 5) { + if (this.hasWriteStage && this.writeConcern) { + Object.assign(command, { writeConcern: this.writeConcern }); + } + } + + if (options.bypassDocumentValidation === true) { + command.bypassDocumentValidation = options.bypassDocumentValidation; + } + + if (typeof options.allowDiskUse === 'boolean') { + command.allowDiskUse = options.allowDiskUse; + } + + if (options.hint) { + command.hint = options.hint; + } + + if (this.explain) { + options.full = false; + } + + command.cursor = options.cursor || {}; + if (options.batchSize && !this.hasWriteStage) { + command.cursor.batchSize = options.batchSize; + } + + super.executeCommand(server, command, callback); + } +} + +defineAspects(AggregateOperation, [ + Aspect.READ_OPERATION, + Aspect.RETRYABLE, + Aspect.EXECUTE_WITH_SELECTION, + Aspect.EXPLAINABLE +]); + +module.exports = AggregateOperation; diff --git a/node_modules/mongodb/lib/operations/bulk_write.js b/node_modules/mongodb/lib/operations/bulk_write.js new file mode 100644 index 00000000..8f14f021 --- /dev/null +++ b/node_modules/mongodb/lib/operations/bulk_write.js @@ -0,0 +1,104 @@ +'use strict'; + +const applyRetryableWrites = require('../utils').applyRetryableWrites; +const applyWriteConcern = require('../utils').applyWriteConcern; +const MongoError = require('../core').MongoError; +const OperationBase = require('./operation').OperationBase; + +class BulkWriteOperation extends OperationBase { + constructor(collection, operations, options) { + super(options); + + this.collection = collection; + this.operations = operations; + } + + execute(callback) { + const coll = this.collection; + const operations = this.operations; + let options = this.options; + + // Add ignoreUndfined + if (coll.s.options.ignoreUndefined) { + options = Object.assign({}, options); + options.ignoreUndefined = coll.s.options.ignoreUndefined; + } + + // Create the bulk operation + const bulk = + options.ordered === true || options.ordered == null + ? coll.initializeOrderedBulkOp(options) + : coll.initializeUnorderedBulkOp(options); + + // Do we have a collation + let collation = false; + + // for each op go through and add to the bulk + try { + for (let i = 0; i < operations.length; i++) { + // Get the operation type + const key = Object.keys(operations[i])[0]; + // Check if we have a collation + if (operations[i][key].collation) { + collation = true; + } + + // Pass to the raw bulk + bulk.raw(operations[i]); + } + } catch (err) { + return callback(err, null); + } + + // Final options for retryable writes and write concern + let finalOptions = Object.assign({}, options); + finalOptions = applyRetryableWrites(finalOptions, coll.s.db); + finalOptions = applyWriteConcern(finalOptions, { db: coll.s.db, collection: coll }, options); + + const writeCon = finalOptions.writeConcern ? finalOptions.writeConcern : {}; + const capabilities = coll.s.topology.capabilities(); + + // Did the user pass in a collation, check if our write server supports it + if (collation && capabilities && !capabilities.commandsTakeCollation) { + return callback(new MongoError('server/primary/mongos does not support collation')); + } + + // Execute the bulk + bulk.execute(writeCon, finalOptions, (err, r) => { + // We have connection level error + if (!r && err) { + return callback(err, null); + } + + r.insertedCount = r.nInserted; + r.matchedCount = r.nMatched; + r.modifiedCount = r.nModified || 0; + r.deletedCount = r.nRemoved; + r.upsertedCount = r.getUpsertedIds().length; + r.upsertedIds = {}; + r.insertedIds = {}; + + // Update the n + r.n = r.insertedCount; + + // Inserted documents + const inserted = r.getInsertedIds(); + // Map inserted ids + for (let i = 0; i < inserted.length; i++) { + r.insertedIds[inserted[i].index] = inserted[i]._id; + } + + // Upserted documents + const upserted = r.getUpsertedIds(); + // Map upserted ids + for (let i = 0; i < upserted.length; i++) { + r.upsertedIds[upserted[i].index] = upserted[i]._id; + } + + // Return the results + callback(null, r); + }); + } +} + +module.exports = BulkWriteOperation; diff --git a/node_modules/mongodb/lib/operations/collection_ops.js b/node_modules/mongodb/lib/operations/collection_ops.js new file mode 100644 index 00000000..655bd70c --- /dev/null +++ b/node_modules/mongodb/lib/operations/collection_ops.js @@ -0,0 +1,353 @@ +'use strict'; + +const applyWriteConcern = require('../utils').applyWriteConcern; +const Code = require('../core').BSON.Code; +const createIndexDb = require('./db_ops').createIndex; +const decorateWithCollation = require('../utils').decorateWithCollation; +const decorateWithReadConcern = require('../utils').decorateWithReadConcern; +const ensureIndexDb = require('./db_ops').ensureIndex; +const evaluate = require('./db_ops').evaluate; +const executeCommand = require('./db_ops').executeCommand; +const handleCallback = require('../utils').handleCallback; +const indexInformationDb = require('./db_ops').indexInformation; +const Long = require('../core').BSON.Long; +const MongoError = require('../core').MongoError; +const ReadPreference = require('../core').ReadPreference; +const insertDocuments = require('./common_functions').insertDocuments; +const updateDocuments = require('./common_functions').updateDocuments; + +/** + * Group function helper + * @ignore + */ +// var groupFunction = function () { +// var c = db[ns].find(condition); +// var map = new Map(); +// var reduce_function = reduce; +// +// while (c.hasNext()) { +// var obj = c.next(); +// var key = {}; +// +// for (var i = 0, len = keys.length; i < len; ++i) { +// var k = keys[i]; +// key[k] = obj[k]; +// } +// +// var aggObj = map.get(key); +// +// if (aggObj == null) { +// var newObj = Object.extend({}, key); +// aggObj = Object.extend(newObj, initial); +// map.put(key, aggObj); +// } +// +// reduce_function(obj, aggObj); +// } +// +// return { "result": map.values() }; +// }.toString(); +const groupFunction = + 'function () {\nvar c = db[ns].find(condition);\nvar map = new Map();\nvar reduce_function = reduce;\n\nwhile (c.hasNext()) {\nvar obj = c.next();\nvar key = {};\n\nfor (var i = 0, len = keys.length; i < len; ++i) {\nvar k = keys[i];\nkey[k] = obj[k];\n}\n\nvar aggObj = map.get(key);\n\nif (aggObj == null) {\nvar newObj = Object.extend({}, key);\naggObj = Object.extend(newObj, initial);\nmap.put(key, aggObj);\n}\n\nreduce_function(obj, aggObj);\n}\n\nreturn { "result": map.values() };\n}'; + +/** + * Create an index on the db and collection. + * + * @method + * @param {Collection} a Collection instance. + * @param {(string|object)} fieldOrSpec Defines the index. + * @param {object} [options] Optional settings. See Collection.prototype.createIndex for a list of options. + * @param {Collection~resultCallback} [callback] The command result callback + */ +function createIndex(coll, fieldOrSpec, options, callback) { + createIndexDb(coll.s.db, coll.collectionName, fieldOrSpec, options, callback); +} + +/** + * Create multiple indexes in the collection. This method is only supported for + * MongoDB 2.6 or higher. Earlier version of MongoDB will throw a command not supported + * error. Index specifications are defined at http://docs.mongodb.org/manual/reference/command/createIndexes/. + * + * @method + * @param {Collection} a Collection instance. + * @param {array} indexSpecs An array of index specifications to be created + * @param {Object} [options] Optional settings. See Collection.prototype.createIndexes for a list of options. + * @param {Collection~resultCallback} [callback] The command result callback + */ +function createIndexes(coll, indexSpecs, options, callback) { + const capabilities = coll.s.topology.capabilities(); + + // Ensure we generate the correct name if the parameter is not set + for (let i = 0; i < indexSpecs.length; i++) { + if (indexSpecs[i].name == null) { + const keys = []; + + // Did the user pass in a collation, check if our write server supports it + if (indexSpecs[i].collation && capabilities && !capabilities.commandsTakeCollation) { + return callback(new MongoError('server/primary/mongos does not support collation')); + } + + for (let name in indexSpecs[i].key) { + keys.push(`${name}_${indexSpecs[i].key[name]}`); + } + + // Set the name + indexSpecs[i].name = keys.join('_'); + } + } + + options = Object.assign({}, options, { readPreference: ReadPreference.PRIMARY }); + + // Execute the index + executeCommand( + coll.s.db, + { + createIndexes: coll.collectionName, + indexes: indexSpecs + }, + options, + callback + ); +} + +/** + * Ensure that an index exists. If the index does not exist, this function creates it. + * + * @method + * @param {Collection} a Collection instance. + * @param {(string|object)} fieldOrSpec Defines the index. + * @param {object} [options] Optional settings. See Collection.prototype.ensureIndex for a list of options. + * @param {Collection~resultCallback} [callback] The command result callback + */ +function ensureIndex(coll, fieldOrSpec, options, callback) { + ensureIndexDb(coll.s.db, coll.collectionName, fieldOrSpec, options, callback); +} + +/** + * Run a group command across a collection. + * + * @method + * @param {Collection} a Collection instance. + * @param {(object|array|function|code)} keys An object, array or function expressing the keys to group by. + * @param {object} condition An optional condition that must be true for a row to be considered. + * @param {object} initial Initial value of the aggregation counter object. + * @param {(function|Code)} reduce The reduce function aggregates (reduces) the objects iterated + * @param {(function|Code)} finalize An optional function to be run on each item in the result set just before the item is returned. + * @param {boolean} command Specify if you wish to run using the internal group command or using eval, default is true. + * @param {object} [options] Optional settings. See Collection.prototype.group for a list of options. + * @param {Collection~resultCallback} [callback] The command result callback + * @deprecated MongoDB 3.6 or higher will no longer support the group command. We recommend rewriting using the aggregation framework. + */ +function group(coll, keys, condition, initial, reduce, finalize, command, options, callback) { + // Execute using the command + if (command) { + const reduceFunction = reduce && reduce._bsontype === 'Code' ? reduce : new Code(reduce); + + const selector = { + group: { + ns: coll.collectionName, + $reduce: reduceFunction, + cond: condition, + initial: initial, + out: 'inline' + } + }; + + // if finalize is defined + if (finalize != null) selector.group['finalize'] = finalize; + // Set up group selector + if ('function' === typeof keys || (keys && keys._bsontype === 'Code')) { + selector.group.$keyf = keys && keys._bsontype === 'Code' ? keys : new Code(keys); + } else { + const hash = {}; + keys.forEach(key => { + hash[key] = 1; + }); + selector.group.key = hash; + } + + options = Object.assign({}, options); + // Ensure we have the right read preference inheritance + options.readPreference = ReadPreference.resolve(coll, options); + + // Do we have a readConcern specified + decorateWithReadConcern(selector, coll, options); + + // Have we specified collation + try { + decorateWithCollation(selector, coll, options); + } catch (err) { + return callback(err, null); + } + + // Execute command + executeCommand(coll.s.db, selector, options, (err, result) => { + if (err) return handleCallback(callback, err, null); + handleCallback(callback, null, result.retval); + }); + } else { + // Create execution scope + const scope = reduce != null && reduce._bsontype === 'Code' ? reduce.scope : {}; + + scope.ns = coll.collectionName; + scope.keys = keys; + scope.condition = condition; + scope.initial = initial; + + // Pass in the function text to execute within mongodb. + const groupfn = groupFunction.replace(/ reduce;/, reduce.toString() + ';'); + + evaluate(coll.s.db, new Code(groupfn, scope), null, options, (err, results) => { + if (err) return handleCallback(callback, err, null); + handleCallback(callback, null, results.result || results); + }); + } +} + +/** + * Retrieve all the indexes on the collection. + * + * @method + * @param {Collection} a Collection instance. + * @param {Object} [options] Optional settings. See Collection.prototype.indexes for a list of options. + * @param {Collection~resultCallback} [callback] The command result callback + */ +function indexes(coll, options, callback) { + options = Object.assign({}, { full: true }, options); + indexInformationDb(coll.s.db, coll.collectionName, options, callback); +} + +/** + * Check if one or more indexes exist on the collection. This fails on the first index that doesn't exist. + * + * @method + * @param {Collection} a Collection instance. + * @param {(string|array)} indexes One or more index names to check. + * @param {Object} [options] Optional settings. See Collection.prototype.indexExists for a list of options. + * @param {Collection~resultCallback} [callback] The command result callback + */ +function indexExists(coll, indexes, options, callback) { + indexInformation(coll, options, (err, indexInformation) => { + // If we have an error return + if (err != null) return handleCallback(callback, err, null); + // Let's check for the index names + if (!Array.isArray(indexes)) + return handleCallback(callback, null, indexInformation[indexes] != null); + // Check in list of indexes + for (let i = 0; i < indexes.length; i++) { + if (indexInformation[indexes[i]] == null) { + return handleCallback(callback, null, false); + } + } + + // All keys found return true + return handleCallback(callback, null, true); + }); +} + +/** + * Retrieve this collection's index info. + * + * @method + * @param {Collection} a Collection instance. + * @param {object} [options] Optional settings. See Collection.prototype.indexInformation for a list of options. + * @param {Collection~resultCallback} [callback] The command result callback + */ +function indexInformation(coll, options, callback) { + indexInformationDb(coll.s.db, coll.collectionName, options, callback); +} + +/** + * Return N parallel cursors for a collection to allow parallel reading of the entire collection. There are + * no ordering guarantees for returned results. + * + * @method + * @param {Collection} a Collection instance. + * @param {object} [options] Optional settings. See Collection.prototype.parallelCollectionScan for a list of options. + * @param {Collection~parallelCollectionScanCallback} [callback] The command result callback + */ +function parallelCollectionScan(coll, options, callback) { + // Create command object + const commandObject = { + parallelCollectionScan: coll.collectionName, + numCursors: options.numCursors + }; + + // Do we have a readConcern specified + decorateWithReadConcern(commandObject, coll, options); + + // Store the raw value + const raw = options.raw; + delete options['raw']; + + // Execute the command + executeCommand(coll.s.db, commandObject, options, (err, result) => { + if (err) return handleCallback(callback, err, null); + if (result == null) + return handleCallback( + callback, + new Error('no result returned for parallelCollectionScan'), + null + ); + + options = Object.assign({ explicitlyIgnoreSession: true }, options); + + const cursors = []; + // Add the raw back to the option + if (raw) options.raw = raw; + // Create command cursors for each item + for (let i = 0; i < result.cursors.length; i++) { + const rawId = result.cursors[i].cursor.id; + // Convert cursorId to Long if needed + const cursorId = typeof rawId === 'number' ? Long.fromNumber(rawId) : rawId; + // Add a command cursor + cursors.push(coll.s.topology.cursor(coll.namespace, cursorId, options)); + } + + handleCallback(callback, null, cursors); + }); +} + +/** + * Save a document. + * + * @method + * @param {Collection} a Collection instance. + * @param {object} doc Document to save + * @param {object} [options] Optional settings. See Collection.prototype.save for a list of options. + * @param {Collection~writeOpCallback} [callback] The command result callback + * @deprecated use insertOne, insertMany, updateOne or updateMany + */ +function save(coll, doc, options, callback) { + // Get the write concern options + const finalOptions = applyWriteConcern( + Object.assign({}, options), + { db: coll.s.db, collection: coll }, + options + ); + // Establish if we need to perform an insert or update + if (doc._id != null) { + finalOptions.upsert = true; + return updateDocuments(coll, { _id: doc._id }, doc, finalOptions, callback); + } + + // Insert the document + insertDocuments(coll, [doc], finalOptions, (err, result) => { + if (callback == null) return; + if (doc == null) return handleCallback(callback, null, null); + if (err) return handleCallback(callback, err, null); + handleCallback(callback, null, result); + }); +} + +module.exports = { + createIndex, + createIndexes, + ensureIndex, + group, + indexes, + indexExists, + indexInformation, + parallelCollectionScan, + save +}; diff --git a/node_modules/mongodb/lib/operations/collections.js b/node_modules/mongodb/lib/operations/collections.js new file mode 100644 index 00000000..eac690a2 --- /dev/null +++ b/node_modules/mongodb/lib/operations/collections.js @@ -0,0 +1,55 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const handleCallback = require('../utils').handleCallback; + +let collection; +function loadCollection() { + if (!collection) { + collection = require('../collection'); + } + return collection; +} + +class CollectionsOperation extends OperationBase { + constructor(db, options) { + super(options); + + this.db = db; + } + + execute(callback) { + const db = this.db; + let options = this.options; + + let Collection = loadCollection(); + + options = Object.assign({}, options, { nameOnly: true }); + // Let's get the collection names + db.listCollections({}, options).toArray((err, documents) => { + if (err != null) return handleCallback(callback, err, null); + // Filter collections removing any illegal ones + documents = documents.filter(doc => { + return doc.name.indexOf('$') === -1; + }); + + // Return the collection objects + handleCallback( + callback, + null, + documents.map(d => { + return new Collection( + db, + db.s.topology, + db.databaseName, + d.name, + db.s.pkFactory, + db.s.options + ); + }) + ); + }); + } +} + +module.exports = CollectionsOperation; diff --git a/node_modules/mongodb/lib/operations/command.js b/node_modules/mongodb/lib/operations/command.js new file mode 100644 index 00000000..fd18a543 --- /dev/null +++ b/node_modules/mongodb/lib/operations/command.js @@ -0,0 +1,119 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const OperationBase = require('./operation').OperationBase; +const applyWriteConcern = require('../utils').applyWriteConcern; +const debugOptions = require('../utils').debugOptions; +const handleCallback = require('../utils').handleCallback; +const MongoError = require('../core').MongoError; +const ReadPreference = require('../core').ReadPreference; +const MongoDBNamespace = require('../utils').MongoDBNamespace; + +const debugFields = [ + 'authSource', + 'w', + 'wtimeout', + 'j', + 'native_parser', + 'forceServerObjectId', + 'serializeFunctions', + 'raw', + 'promoteLongs', + 'promoteValues', + 'promoteBuffers', + 'bufferMaxEntries', + 'numberOfRetries', + 'retryMiliSeconds', + 'readPreference', + 'pkFactory', + 'parentDb', + 'promiseLibrary', + 'noListener' +]; + +class CommandOperation extends OperationBase { + constructor(db, options, collection, command) { + super(options); + + if (!this.hasAspect(Aspect.WRITE_OPERATION)) { + if (collection != null) { + this.options.readPreference = ReadPreference.resolve(collection, options); + } else { + this.options.readPreference = ReadPreference.resolve(db, options); + } + } else { + if (collection != null) { + applyWriteConcern(this.options, { db, coll: collection }, this.options); + } else { + applyWriteConcern(this.options, { db }, this.options); + } + this.options.readPreference = ReadPreference.primary; + } + + this.db = db; + + if (command != null) { + this.command = command; + } + + if (collection != null) { + this.collection = collection; + } + } + + _buildCommand() { + if (this.command != null) { + return this.command; + } + } + + execute(callback) { + const db = this.db; + const options = Object.assign({}, this.options); + + // Did the user destroy the topology + if (db.serverConfig && db.serverConfig.isDestroyed()) { + return callback(new MongoError('topology was destroyed')); + } + + let command; + try { + command = this._buildCommand(); + } catch (e) { + return callback(e); + } + + // Get the db name we are executing against + const dbName = options.dbName || options.authdb || db.databaseName; + + // Convert the readPreference if its not a write + if (this.hasAspect(Aspect.WRITE_OPERATION)) { + if (options.writeConcern && (!options.session || !options.session.inTransaction())) { + command.writeConcern = options.writeConcern; + } + } + + // Debug information + if (db.s.logger.isDebug()) { + db.s.logger.debug( + `executing command ${JSON.stringify( + command + )} against ${dbName}.$cmd with options [${JSON.stringify( + debugOptions(debugFields, options) + )}]` + ); + } + + const namespace = + this.namespace != null ? this.namespace : new MongoDBNamespace(dbName, '$cmd'); + + // Execute command + db.s.topology.command(namespace, command, options, (err, result) => { + if (err) return handleCallback(callback, err); + if (options.full) return handleCallback(callback, null, result); + handleCallback(callback, null, result.result); + }); + } +} + +module.exports = CommandOperation; diff --git a/node_modules/mongodb/lib/operations/command_v2.js b/node_modules/mongodb/lib/operations/command_v2.js new file mode 100644 index 00000000..52f982b8 --- /dev/null +++ b/node_modules/mongodb/lib/operations/command_v2.js @@ -0,0 +1,119 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const OperationBase = require('./operation').OperationBase; +const ReadPreference = require('../core').ReadPreference; +const ReadConcern = require('../read_concern'); +const WriteConcern = require('../write_concern'); +const maxWireVersion = require('../core/utils').maxWireVersion; +const decorateWithExplain = require('../utils').decorateWithExplain; +const commandSupportsReadConcern = require('../core/sessions').commandSupportsReadConcern; +const MongoError = require('../core/error').MongoError; + +const SUPPORTS_WRITE_CONCERN_AND_COLLATION = 5; + +class CommandOperationV2 extends OperationBase { + constructor(parent, options, operationOptions) { + super(options); + + this.ns = parent.s.namespace.withCollection('$cmd'); + const propertyProvider = this.hasAspect(Aspect.NO_INHERIT_OPTIONS) ? undefined : parent; + this.readPreference = this.hasAspect(Aspect.WRITE_OPERATION) + ? ReadPreference.primary + : ReadPreference.resolve(propertyProvider, this.options); + this.readConcern = resolveReadConcern(propertyProvider, this.options); + this.writeConcern = resolveWriteConcern(propertyProvider, this.options); + + if (operationOptions && typeof operationOptions.fullResponse === 'boolean') { + this.fullResponse = true; + } + + // TODO: A lot of our code depends on having the read preference in the options. This should + // go away, but also requires massive test rewrites. + this.options.readPreference = this.readPreference; + + // TODO(NODE-2056): make logger another "inheritable" property + if (parent.s.logger) { + this.logger = parent.s.logger; + } else if (parent.s.db && parent.s.db.logger) { + this.logger = parent.s.db.logger; + } + } + + executeCommand(server, cmd, callback) { + // TODO: consider making this a non-enumerable property + this.server = server; + + const options = this.options; + const serverWireVersion = maxWireVersion(server); + const inTransaction = this.session && this.session.inTransaction(); + + if (this.readConcern && commandSupportsReadConcern(cmd) && !inTransaction) { + Object.assign(cmd, { readConcern: this.readConcern }); + } + + if (options.collation && serverWireVersion < SUPPORTS_WRITE_CONCERN_AND_COLLATION) { + callback( + new MongoError( + `Server ${server.name}, which reports wire version ${serverWireVersion}, does not support collation` + ) + ); + return; + } + + if (serverWireVersion >= SUPPORTS_WRITE_CONCERN_AND_COLLATION) { + if (this.writeConcern && this.hasAspect(Aspect.WRITE_OPERATION)) { + Object.assign(cmd, { writeConcern: this.writeConcern }); + } + + if (options.collation && typeof options.collation === 'object') { + Object.assign(cmd, { collation: options.collation }); + } + } + + if (typeof options.maxTimeMS === 'number') { + cmd.maxTimeMS = options.maxTimeMS; + } + + if (typeof options.comment === 'string') { + cmd.comment = options.comment; + } + + if (this.hasAspect(Aspect.EXPLAINABLE) && this.explain) { + if (serverWireVersion < 6 && cmd.aggregate) { + // Prior to 3.6, with aggregate, verbosity is ignored, and we must pass in "explain: true" + cmd.explain = true; + } else { + cmd = decorateWithExplain(cmd, this.explain); + } + } + + if (this.logger && this.logger.isDebug()) { + this.logger.debug(`executing command ${JSON.stringify(cmd)} against ${this.ns}`); + } + + server.command(this.ns.toString(), cmd, this.options, (err, result) => { + if (err) { + callback(err, null); + return; + } + + if (this.fullResponse) { + callback(null, result); + return; + } + + callback(null, result.result); + }); + } +} + +function resolveWriteConcern(parent, options) { + return WriteConcern.fromOptions(options) || (parent && parent.writeConcern); +} + +function resolveReadConcern(parent, options) { + return ReadConcern.fromOptions(options) || (parent && parent.readConcern); +} + +module.exports = CommandOperationV2; diff --git a/node_modules/mongodb/lib/operations/common_functions.js b/node_modules/mongodb/lib/operations/common_functions.js new file mode 100644 index 00000000..5b9c172f --- /dev/null +++ b/node_modules/mongodb/lib/operations/common_functions.js @@ -0,0 +1,399 @@ +'use strict'; + +const applyRetryableWrites = require('../utils').applyRetryableWrites; +const applyWriteConcern = require('../utils').applyWriteConcern; +const decorateWithCollation = require('../utils').decorateWithCollation; +const decorateWithReadConcern = require('../utils').decorateWithReadConcern; +const executeCommand = require('./db_ops').executeCommand; +const formattedOrderClause = require('../utils').formattedOrderClause; +const handleCallback = require('../utils').handleCallback; +const MongoError = require('../core').MongoError; +const ReadPreference = require('../core').ReadPreference; +const toError = require('../utils').toError; +const CursorState = require('../core/cursor').CursorState; +const maxWireVersion = require('../core/utils').maxWireVersion; + +/** + * Build the count command. + * + * @method + * @param {collectionOrCursor} an instance of a collection or cursor + * @param {object} query The query for the count. + * @param {object} [options] Optional settings. See Collection.prototype.count and Cursor.prototype.count for a list of options. + */ +function buildCountCommand(collectionOrCursor, query, options) { + const skip = options.skip; + const limit = options.limit; + let hint = options.hint; + const maxTimeMS = options.maxTimeMS; + query = query || {}; + + // Final query + const cmd = { + count: options.collectionName, + query: query + }; + + if (collectionOrCursor.s.numberOfRetries) { + // collectionOrCursor is a cursor + if (collectionOrCursor.options.hint) { + hint = collectionOrCursor.options.hint; + } else if (collectionOrCursor.cmd.hint) { + hint = collectionOrCursor.cmd.hint; + } + decorateWithCollation(cmd, collectionOrCursor, collectionOrCursor.cmd); + } else { + decorateWithCollation(cmd, collectionOrCursor, options); + } + + // Add limit, skip and maxTimeMS if defined + if (typeof skip === 'number') cmd.skip = skip; + if (typeof limit === 'number') cmd.limit = limit; + if (typeof maxTimeMS === 'number') cmd.maxTimeMS = maxTimeMS; + if (hint) cmd.hint = hint; + + // Do we have a readConcern specified + decorateWithReadConcern(cmd, collectionOrCursor); + + return cmd; +} + +/** + * Find and update a document. + * + * @method + * @param {Collection} a Collection instance. + * @param {object} query Query object to locate the object to modify. + * @param {array} sort If multiple docs match, choose the first one in the specified sort order as the object to manipulate. + * @param {object} doc The fields/vals to be updated. + * @param {object} [options] Optional settings. See Collection.prototype.findAndModify for a list of options. + * @param {Collection~findAndModifyCallback} [callback] The command result callback + * @deprecated use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead + */ +function findAndModify(coll, query, sort, doc, options, callback) { + // Create findAndModify command object + const queryObject = { + findAndModify: coll.collectionName, + query: query + }; + + sort = formattedOrderClause(sort); + if (sort) { + queryObject.sort = sort; + } + + queryObject.new = options.new ? true : false; + queryObject.remove = options.remove ? true : false; + queryObject.upsert = options.upsert ? true : false; + + const projection = options.projection || options.fields; + + if (projection) { + queryObject.fields = projection; + } + + if (options.arrayFilters) { + queryObject.arrayFilters = options.arrayFilters; + delete options.arrayFilters; + } + + if (doc && !options.remove) { + queryObject.update = doc; + } + + if (options.maxTimeMS) queryObject.maxTimeMS = options.maxTimeMS; + + // Either use override on the function, or go back to default on either the collection + // level or db + options.serializeFunctions = options.serializeFunctions || coll.s.serializeFunctions; + + // No check on the documents + options.checkKeys = false; + + // Final options for retryable writes and write concern + let finalOptions = Object.assign({}, options); + finalOptions = applyRetryableWrites(finalOptions, coll.s.db); + finalOptions = applyWriteConcern(finalOptions, { db: coll.s.db, collection: coll }, options); + + // Decorate the findAndModify command with the write Concern + if (finalOptions.writeConcern) { + queryObject.writeConcern = finalOptions.writeConcern; + } + + // Have we specified bypassDocumentValidation + if (finalOptions.bypassDocumentValidation === true) { + queryObject.bypassDocumentValidation = finalOptions.bypassDocumentValidation; + } + + finalOptions.readPreference = ReadPreference.primary; + + // Have we specified collation + try { + decorateWithCollation(queryObject, coll, finalOptions); + } catch (err) { + return callback(err, null); + } + + // Execute the command + executeCommand(coll.s.db, queryObject, finalOptions, (err, result) => { + if (err) return handleCallback(callback, err, null); + + return handleCallback(callback, null, result); + }); +} + +/** + * Retrieves this collections index info. + * + * @method + * @param {Db} db The Db instance on which to retrieve the index info. + * @param {string} name The name of the collection. + * @param {object} [options] Optional settings. See Db.prototype.indexInformation for a list of options. + * @param {Db~resultCallback} [callback] The command result callback + */ +function indexInformation(db, name, options, callback) { + // If we specified full information + const full = options['full'] == null ? false : options['full']; + + // Did the user destroy the topology + if (db.serverConfig && db.serverConfig.isDestroyed()) + return callback(new MongoError('topology was destroyed')); + // Process all the results from the index command and collection + function processResults(indexes) { + // Contains all the information + let info = {}; + // Process all the indexes + for (let i = 0; i < indexes.length; i++) { + const index = indexes[i]; + // Let's unpack the object + info[index.name] = []; + for (let name in index.key) { + info[index.name].push([name, index.key[name]]); + } + } + + return info; + } + + // Get the list of indexes of the specified collection + db.collection(name) + .listIndexes(options) + .toArray((err, indexes) => { + if (err) return callback(toError(err)); + if (!Array.isArray(indexes)) return handleCallback(callback, null, []); + if (full) return handleCallback(callback, null, indexes); + handleCallback(callback, null, processResults(indexes)); + }); +} + +function prepareDocs(coll, docs, options) { + const forceServerObjectId = + typeof options.forceServerObjectId === 'boolean' + ? options.forceServerObjectId + : coll.s.db.options.forceServerObjectId; + + // no need to modify the docs if server sets the ObjectId + if (forceServerObjectId === true) { + return docs; + } + + return docs.map(doc => { + if (forceServerObjectId !== true && doc._id == null) { + doc._id = coll.s.pkFactory.createPk(); + } + + return doc; + }); +} + +// Get the next available document from the cursor, returns null if no more documents are available. +function nextObject(cursor, callback) { + if (cursor.s.state === CursorState.CLOSED || (cursor.isDead && cursor.isDead())) { + return handleCallback( + callback, + MongoError.create({ message: 'Cursor is closed', driver: true }) + ); + } + + if (cursor.s.state === CursorState.INIT && cursor.cmd && cursor.cmd.sort) { + try { + cursor.cmd.sort = formattedOrderClause(cursor.cmd.sort); + } catch (err) { + return handleCallback(callback, err); + } + } + + // Get the next object + cursor._next((err, doc) => { + cursor.s.state = CursorState.OPEN; + if (err) return handleCallback(callback, err); + handleCallback(callback, null, doc); + }); +} + +function insertDocuments(coll, docs, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + // Ensure we are operating on an array op docs + docs = Array.isArray(docs) ? docs : [docs]; + + // Final options for retryable writes and write concern + let finalOptions = Object.assign({}, options); + finalOptions = applyRetryableWrites(finalOptions, coll.s.db); + finalOptions = applyWriteConcern(finalOptions, { db: coll.s.db, collection: coll }, options); + + // If keep going set unordered + if (finalOptions.keepGoing === true) finalOptions.ordered = false; + finalOptions.serializeFunctions = options.serializeFunctions || coll.s.serializeFunctions; + + docs = prepareDocs(coll, docs, options); + + // File inserts + coll.s.topology.insert(coll.s.namespace, docs, finalOptions, (err, result) => { + if (callback == null) return; + if (err) return handleCallback(callback, err); + if (result == null) return handleCallback(callback, null, null); + if (result.result.code) return handleCallback(callback, toError(result.result)); + if (result.result.writeErrors) + return handleCallback(callback, toError(result.result.writeErrors[0])); + // Add docs to the list + result.ops = docs; + // Return the results + handleCallback(callback, null, result); + }); +} + +function removeDocuments(coll, selector, options, callback) { + if (typeof options === 'function') { + (callback = options), (options = {}); + } else if (typeof selector === 'function') { + callback = selector; + options = {}; + selector = {}; + } + + // Create an empty options object if the provided one is null + options = options || {}; + + // Final options for retryable writes and write concern + let finalOptions = Object.assign({}, options); + finalOptions = applyRetryableWrites(finalOptions, coll.s.db); + finalOptions = applyWriteConcern(finalOptions, { db: coll.s.db, collection: coll }, options); + + // If selector is null set empty + if (selector == null) selector = {}; + + // Build the op + const op = { q: selector, limit: 0 }; + if (options.single) { + op.limit = 1; + } else if (finalOptions.retryWrites) { + finalOptions.retryWrites = false; + } + if (options.hint) { + op.hint = options.hint; + } + + // Have we specified collation + try { + decorateWithCollation(finalOptions, coll, options); + } catch (err) { + return callback(err, null); + } + + if (options.explain !== undefined && maxWireVersion(coll.s.topology) < 3) { + return callback + ? callback(new MongoError(`server does not support explain on remove`)) + : undefined; + } + + // Execute the remove + coll.s.topology.remove(coll.s.namespace, [op], finalOptions, (err, result) => { + if (callback == null) return; + if (err) return handleCallback(callback, err, null); + if (result == null) return handleCallback(callback, null, null); + if (result.result.code) return handleCallback(callback, toError(result.result)); + if (result.result.writeErrors) { + return handleCallback(callback, toError(result.result.writeErrors[0])); + } + + // Return the results + handleCallback(callback, null, result); + }); +} + +function updateDocuments(coll, selector, document, options, callback) { + if ('function' === typeof options) (callback = options), (options = null); + if (options == null) options = {}; + if (!('function' === typeof callback)) callback = null; + + // If we are not providing a selector or document throw + if (selector == null || typeof selector !== 'object') + return callback(toError('selector must be a valid JavaScript object')); + if (document == null || typeof document !== 'object') + return callback(toError('document must be a valid JavaScript object')); + + // Final options for retryable writes and write concern + let finalOptions = Object.assign({}, options); + finalOptions = applyRetryableWrites(finalOptions, coll.s.db); + finalOptions = applyWriteConcern(finalOptions, { db: coll.s.db, collection: coll }, options); + + // Do we return the actual result document + // Either use override on the function, or go back to default on either the collection + // level or db + finalOptions.serializeFunctions = options.serializeFunctions || coll.s.serializeFunctions; + + // Execute the operation + const op = { q: selector, u: document }; + op.upsert = options.upsert !== void 0 ? !!options.upsert : false; + op.multi = options.multi !== void 0 ? !!options.multi : false; + + if (options.hint) { + op.hint = options.hint; + } + + if (finalOptions.arrayFilters) { + op.arrayFilters = finalOptions.arrayFilters; + delete finalOptions.arrayFilters; + } + + if (finalOptions.retryWrites && op.multi) { + finalOptions.retryWrites = false; + } + + // Have we specified collation + try { + decorateWithCollation(finalOptions, coll, options); + } catch (err) { + return callback(err, null); + } + + if (options.explain !== undefined && maxWireVersion(coll.s.topology) < 3) { + return callback + ? callback(new MongoError(`server does not support explain on update`)) + : undefined; + } + + // Update options + coll.s.topology.update(coll.s.namespace, [op], finalOptions, (err, result) => { + if (callback == null) return; + if (err) return handleCallback(callback, err, null); + if (result == null) return handleCallback(callback, null, null); + if (result.result.code) return handleCallback(callback, toError(result.result)); + if (result.result.writeErrors) + return handleCallback(callback, toError(result.result.writeErrors[0])); + // Return the results + handleCallback(callback, null, result); + }); +} + +module.exports = { + buildCountCommand, + findAndModify, + indexInformation, + nextObject, + prepareDocs, + insertDocuments, + removeDocuments, + updateDocuments +}; diff --git a/node_modules/mongodb/lib/operations/connect.js b/node_modules/mongodb/lib/operations/connect.js new file mode 100644 index 00000000..2f3bff96 --- /dev/null +++ b/node_modules/mongodb/lib/operations/connect.js @@ -0,0 +1,829 @@ +'use strict'; + +const deprecate = require('util').deprecate; +const Logger = require('../core').Logger; +const MongoCredentials = require('../core').MongoCredentials; +const MongoError = require('../core').MongoError; +const Mongos = require('../topologies/mongos'); +const NativeTopology = require('../topologies/native_topology'); +const parse = require('../core').parseConnectionString; +const ReadConcern = require('../read_concern'); +const ReadPreference = require('../core').ReadPreference; +const ReplSet = require('../topologies/replset'); +const Server = require('../topologies/server'); +const ServerSessionPool = require('../core').Sessions.ServerSessionPool; +const emitDeprecationWarning = require('../utils').emitDeprecationWarning; +const fs = require('fs'); +const WriteConcern = require('../write_concern'); +const BSON = require('../core/connection/utils').retrieveBSON(); +const CMAP_EVENT_NAMES = require('../cmap/events').CMAP_EVENT_NAMES; + +let client; +function loadClient() { + if (!client) { + client = require('../mongo_client'); + } + return client; +} + +const legacyParse = deprecate( + require('../url_parser'), + 'current URL string parser is deprecated, and will be removed in a future version. ' + + 'To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.' +); + +const AUTH_MECHANISM_INTERNAL_MAP = { + DEFAULT: 'default', + PLAIN: 'plain', + GSSAPI: 'gssapi', + 'MONGODB-CR': 'mongocr', + 'MONGODB-X509': 'x509', + 'MONGODB-AWS': 'mongodb-aws', + 'SCRAM-SHA-1': 'scram-sha-1', + 'SCRAM-SHA-256': 'scram-sha-256' +}; + +const monitoringEvents = [ + 'timeout', + 'close', + 'serverOpening', + 'serverDescriptionChanged', + 'serverHeartbeatStarted', + 'serverHeartbeatSucceeded', + 'serverHeartbeatFailed', + 'serverClosed', + 'topologyOpening', + 'topologyClosed', + 'topologyDescriptionChanged', + 'commandStarted', + 'commandSucceeded', + 'commandFailed', + 'joined', + 'left', + 'ping', + 'ha', + 'all', + 'fullsetup', + 'open' +]; + +const VALID_AUTH_MECHANISMS = new Set([ + 'DEFAULT', + 'PLAIN', + 'GSSAPI', + 'MONGODB-CR', + 'MONGODB-X509', + 'MONGODB-AWS', + 'SCRAM-SHA-1', + 'SCRAM-SHA-256' +]); + +const validOptionNames = [ + 'poolSize', + 'ssl', + 'sslValidate', + 'sslCA', + 'sslCert', + 'sslKey', + 'sslPass', + 'sslCRL', + 'autoReconnect', + 'noDelay', + 'keepAlive', + 'keepAliveInitialDelay', + 'connectTimeoutMS', + 'family', + 'socketTimeoutMS', + 'reconnectTries', + 'reconnectInterval', + 'ha', + 'haInterval', + 'replicaSet', + 'secondaryAcceptableLatencyMS', + 'acceptableLatencyMS', + 'connectWithNoPrimary', + 'authSource', + 'w', + 'wtimeout', + 'j', + 'writeConcern', + 'forceServerObjectId', + 'serializeFunctions', + 'ignoreUndefined', + 'raw', + 'bufferMaxEntries', + 'readPreference', + 'pkFactory', + 'promiseLibrary', + 'readConcern', + 'maxStalenessSeconds', + 'loggerLevel', + 'logger', + 'promoteValues', + 'promoteBuffers', + 'promoteLongs', + 'domainsEnabled', + 'checkServerIdentity', + 'validateOptions', + 'appname', + 'auth', + 'user', + 'password', + 'authMechanism', + 'compression', + 'fsync', + 'readPreferenceTags', + 'numberOfRetries', + 'auto_reconnect', + 'minSize', + 'monitorCommands', + 'retryWrites', + 'retryReads', + 'useNewUrlParser', + 'useUnifiedTopology', + 'serverSelectionTimeoutMS', + 'useRecoveryToken', + 'autoEncryption', + 'driverInfo', + 'tls', + 'tlsInsecure', + 'tlsinsecure', + 'tlsAllowInvalidCertificates', + 'tlsAllowInvalidHostnames', + 'tlsCAFile', + 'tlsCertificateFile', + 'tlsCertificateKeyFile', + 'tlsCertificateKeyFilePassword', + 'minHeartbeatFrequencyMS', + 'heartbeatFrequencyMS', + 'directConnection', + 'appName', + + // CMAP options + 'maxPoolSize', + 'minPoolSize', + 'maxIdleTimeMS', + 'waitQueueTimeoutMS' +]; + +const ignoreOptionNames = ['native_parser']; +const legacyOptionNames = ['server', 'replset', 'replSet', 'mongos', 'db']; + +// Validate options object +function validOptions(options) { + const _validOptions = validOptionNames.concat(legacyOptionNames); + + for (const name in options) { + if (ignoreOptionNames.indexOf(name) !== -1) { + continue; + } + + if (_validOptions.indexOf(name) === -1) { + if (options.validateOptions) { + return new MongoError(`option ${name} is not supported`); + } else { + console.warn(`the options [${name}] is not supported`); + } + } + + if (legacyOptionNames.indexOf(name) !== -1) { + console.warn( + `the server/replset/mongos/db options are deprecated, ` + + `all their options are supported at the top level of the options object [${validOptionNames}]` + ); + } + } +} + +const LEGACY_OPTIONS_MAP = validOptionNames.reduce((obj, name) => { + obj[name.toLowerCase()] = name; + return obj; +}, {}); + +function addListeners(mongoClient, topology) { + topology.on('authenticated', createListener(mongoClient, 'authenticated')); + topology.on('error', createListener(mongoClient, 'error')); + topology.on('timeout', createListener(mongoClient, 'timeout')); + topology.on('close', createListener(mongoClient, 'close')); + topology.on('parseError', createListener(mongoClient, 'parseError')); + topology.once('open', createListener(mongoClient, 'open')); + topology.once('fullsetup', createListener(mongoClient, 'fullsetup')); + topology.once('all', createListener(mongoClient, 'all')); + topology.on('reconnect', createListener(mongoClient, 'reconnect')); +} + +function assignTopology(client, topology) { + client.topology = topology; + + if (!(topology instanceof NativeTopology)) { + topology.s.sessionPool = new ServerSessionPool(topology.s.coreTopology); + } +} + +// Clear out all events +function clearAllEvents(topology) { + monitoringEvents.forEach(event => topology.removeAllListeners(event)); +} + +// Collect all events in order from SDAM +function collectEvents(mongoClient, topology) { + let MongoClient = loadClient(); + const collectedEvents = []; + + if (mongoClient instanceof MongoClient) { + monitoringEvents.forEach(event => { + topology.on(event, (object1, object2) => { + if (event === 'open') { + collectedEvents.push({ event: event, object1: mongoClient }); + } else { + collectedEvents.push({ event: event, object1: object1, object2: object2 }); + } + }); + }); + } + + return collectedEvents; +} + +function resolveTLSOptions(options) { + if (options.tls == null) { + return; + } + + ['sslCA', 'sslKey', 'sslCert'].forEach(optionName => { + if (options[optionName]) { + options[optionName] = fs.readFileSync(options[optionName]); + } + }); +} + +const emitDeprecationForNonUnifiedTopology = deprecate(() => {}, +'current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. ' + 'To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.'); + +function connect(mongoClient, url, options, callback) { + options = Object.assign({}, options); + + // If callback is null throw an exception + if (callback == null) { + throw new Error('no callback function provided'); + } + + let didRequestAuthentication = false; + const logger = Logger('MongoClient', options); + + // Did we pass in a Server/ReplSet/Mongos + if (url instanceof Server || url instanceof ReplSet || url instanceof Mongos) { + return connectWithUrl(mongoClient, url, options, connectCallback); + } + + const useNewUrlParser = options.useNewUrlParser !== false; + + const parseFn = useNewUrlParser ? parse : legacyParse; + const transform = useNewUrlParser ? transformUrlOptions : legacyTransformUrlOptions; + + parseFn(url, options, (err, _object) => { + // Do not attempt to connect if parsing error + if (err) return callback(err); + + // Flatten + const object = transform(_object); + + // Parse the string + const _finalOptions = createUnifiedOptions(object, options); + + // Check if we have connection and socket timeout set + if (_finalOptions.socketTimeoutMS == null) _finalOptions.socketTimeoutMS = 0; + if (_finalOptions.connectTimeoutMS == null) _finalOptions.connectTimeoutMS = 10000; + if (_finalOptions.retryWrites == null) _finalOptions.retryWrites = true; + if (_finalOptions.useRecoveryToken == null) _finalOptions.useRecoveryToken = true; + if (_finalOptions.readPreference == null) _finalOptions.readPreference = 'primary'; + + if (_finalOptions.db_options && _finalOptions.db_options.auth) { + delete _finalOptions.db_options.auth; + } + + // resolve tls options if needed + resolveTLSOptions(_finalOptions); + + // Store the merged options object + mongoClient.s.options = _finalOptions; + + // Apply read and write concern from parsed url + mongoClient.s.readPreference = ReadPreference.fromOptions(_finalOptions); + mongoClient.s.writeConcern = WriteConcern.fromOptions(_finalOptions); + + // Failure modes + if (object.servers.length === 0) { + return callback(new Error('connection string must contain at least one seed host')); + } + + if (_finalOptions.auth && !_finalOptions.credentials) { + try { + didRequestAuthentication = true; + _finalOptions.credentials = generateCredentials( + mongoClient, + _finalOptions.auth.user, + _finalOptions.auth.password, + _finalOptions + ); + } catch (err) { + return callback(err); + } + } + + if (_finalOptions.useUnifiedTopology) { + return createTopology(mongoClient, 'unified', _finalOptions, connectCallback); + } + + emitDeprecationForNonUnifiedTopology(); + + // Do we have a replicaset then skip discovery and go straight to connectivity + if (_finalOptions.replicaSet || _finalOptions.rs_name) { + return createTopology(mongoClient, 'replicaset', _finalOptions, connectCallback); + } else if (object.servers.length > 1) { + return createTopology(mongoClient, 'mongos', _finalOptions, connectCallback); + } else { + return createServer(mongoClient, _finalOptions, connectCallback); + } + }); + + function connectCallback(err, topology) { + const warningMessage = `seed list contains no mongos proxies, replicaset connections requires the parameter replicaSet to be supplied in the URI or options object, mongodb://server:port/db?replicaSet=name`; + if (err && err.message === 'no mongos proxies found in seed list') { + if (logger.isWarn()) { + logger.warn(warningMessage); + } + + // Return a more specific error message for MongoClient.connect + return callback(new MongoError(warningMessage)); + } + + if (didRequestAuthentication) { + mongoClient.emit('authenticated', null, true); + } + + // Return the error and db instance + callback(err, topology); + } +} + +function connectWithUrl(mongoClient, url, options, connectCallback) { + // Set the topology + assignTopology(mongoClient, url); + + // Add listeners + addListeners(mongoClient, url); + + // Propagate the events to the client + relayEvents(mongoClient, url); + + let finalOptions = Object.assign({}, options); + + // If we have a readPreference passed in by the db options, convert it from a string + if (typeof options.readPreference === 'string' || typeof options.read_preference === 'string') { + finalOptions.readPreference = new ReadPreference( + options.readPreference || options.read_preference + ); + } + + const isDoingAuth = finalOptions.user || finalOptions.password || finalOptions.authMechanism; + if (isDoingAuth && !finalOptions.credentials) { + try { + finalOptions.credentials = generateCredentials( + mongoClient, + finalOptions.user, + finalOptions.password, + finalOptions + ); + } catch (err) { + return connectCallback(err, url); + } + } + + return url.connect(finalOptions, connectCallback); +} + +function createListener(mongoClient, event) { + const eventSet = new Set(['all', 'fullsetup', 'open', 'reconnect']); + return (v1, v2) => { + if (eventSet.has(event)) { + return mongoClient.emit(event, mongoClient); + } + + mongoClient.emit(event, v1, v2); + }; +} + +function createServer(mongoClient, options, callback) { + // Pass in the promise library + options.promiseLibrary = mongoClient.s.promiseLibrary; + + // Set default options + const servers = translateOptions(options); + + const server = servers[0]; + + // Propagate the events to the client + const collectedEvents = collectEvents(mongoClient, server); + + // Connect to topology + server.connect(options, (err, topology) => { + if (err) { + server.close(true); + return callback(err); + } + // Clear out all the collected event listeners + clearAllEvents(server); + + // Relay all the events + relayEvents(mongoClient, server); + // Add listeners + addListeners(mongoClient, server); + // Check if we are really speaking to a mongos + const ismaster = topology.lastIsMaster(); + + // Set the topology + assignTopology(mongoClient, topology); + + // Do we actually have a mongos + if (ismaster && ismaster.msg === 'isdbgrid') { + // Destroy the current connection + topology.close(); + // Create mongos connection instead + return createTopology(mongoClient, 'mongos', options, callback); + } + + // Fire all the events + replayEvents(mongoClient, collectedEvents); + // Otherwise callback + callback(err, topology); + }); +} + +const DEPRECATED_UNIFIED_EVENTS = new Set([ + 'reconnect', + 'reconnectFailed', + 'attemptReconnect', + 'joined', + 'left', + 'ping', + 'ha', + 'all', + 'fullsetup', + 'open' +]); + +function registerDeprecatedEventNotifiers(client) { + client.on('newListener', eventName => { + if (DEPRECATED_UNIFIED_EVENTS.has(eventName)) { + emitDeprecationWarning( + `The \`${eventName}\` event is no longer supported by the unified topology, please read more by visiting http://bit.ly/2D8WfT6`, + 'DeprecationWarning' + ); + } + }); +} + +function createTopology(mongoClient, topologyType, options, callback) { + // Pass in the promise library + options.promiseLibrary = mongoClient.s.promiseLibrary; + + const translationOptions = {}; + if (topologyType === 'unified') translationOptions.createServers = false; + + // Set default options + const servers = translateOptions(options, translationOptions); + + // determine CSFLE support + if (options.autoEncryption != null) { + let AutoEncrypter; + try { + require.resolve('mongodb-client-encryption'); + } catch (err) { + callback( + new MongoError( + 'Auto-encryption requested, but the module is not installed. Please add `mongodb-client-encryption` as a dependency of your project' + ) + ); + return; + } + + try { + let mongodbClientEncryption = require('mongodb-client-encryption'); + if (typeof mongodbClientEncryption.extension !== 'function') { + callback( + new MongoError( + 'loaded version of `mongodb-client-encryption` does not have property `extension`. Please make sure you are loading the correct version of `mongodb-client-encryption`' + ) + ); + } + AutoEncrypter = mongodbClientEncryption.extension(require('../../index')).AutoEncrypter; + } catch (err) { + callback(err); + return; + } + + const mongoCryptOptions = Object.assign( + { + bson: + options.bson || + new BSON([ + BSON.Binary, + BSON.Code, + BSON.DBRef, + BSON.Decimal128, + BSON.Double, + BSON.Int32, + BSON.Long, + BSON.Map, + BSON.MaxKey, + BSON.MinKey, + BSON.ObjectId, + BSON.BSONRegExp, + BSON.Symbol, + BSON.Timestamp + ]) + }, + options.autoEncryption + ); + + options.autoEncrypter = new AutoEncrypter(mongoClient, mongoCryptOptions); + } + + // Create the topology + let topology; + if (topologyType === 'mongos') { + topology = new Mongos(servers, options); + } else if (topologyType === 'replicaset') { + topology = new ReplSet(servers, options); + } else if (topologyType === 'unified') { + topology = new NativeTopology(options.servers, options); + registerDeprecatedEventNotifiers(mongoClient); + } + + // Add listeners + addListeners(mongoClient, topology); + + // Propagate the events to the client + relayEvents(mongoClient, topology); + + // Open the connection + assignTopology(mongoClient, topology); + + // initialize CSFLE if requested + if (options.autoEncrypter) { + options.autoEncrypter.init(err => { + if (err) { + callback(err); + return; + } + + topology.connect(options, err => { + if (err) { + topology.close(true); + callback(err); + return; + } + + callback(undefined, topology); + }); + }); + + return; + } + + // otherwise connect normally + topology.connect(options, err => { + if (err) { + topology.close(true); + return callback(err); + } + + callback(undefined, topology); + return; + }); +} + +function createUnifiedOptions(finalOptions, options) { + const childOptions = [ + 'mongos', + 'server', + 'db', + 'replset', + 'db_options', + 'server_options', + 'rs_options', + 'mongos_options' + ]; + const noMerge = ['readconcern', 'compression', 'autoencryption']; + const skip = ['w', 'wtimeout', 'j', 'journal', 'fsync', 'writeConcern']; + + for (const name in options) { + if (skip.indexOf(name.toLowerCase()) !== -1) { + continue; + } else if (noMerge.indexOf(name.toLowerCase()) !== -1) { + finalOptions[name] = options[name]; + } else if (childOptions.indexOf(name.toLowerCase()) !== -1) { + finalOptions = mergeOptions(finalOptions, options[name], false); + } else { + if ( + options[name] && + typeof options[name] === 'object' && + !Buffer.isBuffer(options[name]) && + !Array.isArray(options[name]) + ) { + finalOptions = mergeOptions(finalOptions, options[name], true); + } else { + finalOptions[name] = options[name]; + } + } + } + + // Handle write concern keys separately, since `options` may have the keys at the top level or + // under `options.writeConcern`. The final merged keys will be under `finalOptions.writeConcern`. + // This way, `fromOptions` will warn once if `options` is using deprecated write concern options + const optionsWriteConcern = WriteConcern.fromOptions(options); + if (optionsWriteConcern) { + finalOptions.writeConcern = Object.assign({}, finalOptions.writeConcern, optionsWriteConcern); + } + + return finalOptions; +} + +function generateCredentials(client, username, password, options) { + options = Object.assign({}, options); + + // the default db to authenticate against is 'self' + // if authententicate is called from a retry context, it may be another one, like admin + const source = options.authSource || options.authdb || options.dbName; + + // authMechanism + const authMechanismRaw = options.authMechanism || 'DEFAULT'; + const authMechanism = authMechanismRaw.toUpperCase(); + const mechanismProperties = options.authMechanismProperties; + + if (!VALID_AUTH_MECHANISMS.has(authMechanism)) { + throw MongoError.create({ + message: `authentication mechanism ${authMechanismRaw} not supported', options.authMechanism`, + driver: true + }); + } + + return new MongoCredentials({ + mechanism: AUTH_MECHANISM_INTERNAL_MAP[authMechanism], + mechanismProperties, + source, + username, + password + }); +} + +function legacyTransformUrlOptions(object) { + return mergeOptions(createUnifiedOptions({}, object), object, false); +} + +function mergeOptions(target, source, flatten) { + for (const name in source) { + if (source[name] && typeof source[name] === 'object' && flatten) { + target = mergeOptions(target, source[name], flatten); + } else { + target[name] = source[name]; + } + } + + return target; +} + +function relayEvents(mongoClient, topology) { + const serverOrCommandEvents = [ + // APM + 'commandStarted', + 'commandSucceeded', + 'commandFailed', + + // SDAM + 'serverOpening', + 'serverClosed', + 'serverDescriptionChanged', + 'serverHeartbeatStarted', + 'serverHeartbeatSucceeded', + 'serverHeartbeatFailed', + 'topologyOpening', + 'topologyClosed', + 'topologyDescriptionChanged', + + // Legacy + 'joined', + 'left', + 'ping', + 'ha' + ].concat(CMAP_EVENT_NAMES); + + serverOrCommandEvents.forEach(event => { + topology.on(event, (object1, object2) => { + mongoClient.emit(event, object1, object2); + }); + }); +} + +// +// Replay any events due to single server connection switching to Mongos +// +function replayEvents(mongoClient, events) { + for (let i = 0; i < events.length; i++) { + mongoClient.emit(events[i].event, events[i].object1, events[i].object2); + } +} + +function transformUrlOptions(_object) { + let object = Object.assign({ servers: _object.hosts }, _object.options); + for (let name in object) { + const camelCaseName = LEGACY_OPTIONS_MAP[name]; + if (camelCaseName) { + object[camelCaseName] = object[name]; + } + } + + const hasUsername = _object.auth && _object.auth.username; + const hasAuthMechanism = _object.options && _object.options.authMechanism; + if (hasUsername || hasAuthMechanism) { + object.auth = Object.assign({}, _object.auth); + if (object.auth.db) { + object.authSource = object.authSource || object.auth.db; + } + + if (object.auth.username) { + object.auth.user = object.auth.username; + } + } + + if (_object.defaultDatabase) { + object.dbName = _object.defaultDatabase; + } + + if (object.maxPoolSize) { + object.poolSize = object.maxPoolSize; + } + + if (object.readConcernLevel) { + object.readConcern = new ReadConcern(object.readConcernLevel); + } + + if (object.wTimeoutMS) { + object.wtimeout = object.wTimeoutMS; + object.wTimeoutMS = undefined; + } + + if (_object.srvHost) { + object.srvHost = _object.srvHost; + } + + // Any write concern options from the URL will be top-level, so we manually + // move them options under `object.writeConcern` to avoid warnings later + const wcKeys = ['w', 'wtimeout', 'j', 'journal', 'fsync']; + for (const key of wcKeys) { + if (object[key] !== undefined) { + if (object.writeConcern === undefined) object.writeConcern = {}; + object.writeConcern[key] = object[key]; + object[key] = undefined; + } + } + + return object; +} + +function translateOptions(options, translationOptions) { + translationOptions = Object.assign({}, { createServers: true }, translationOptions); + + // If we have a readPreference passed in by the db options + if (typeof options.readPreference === 'string' || typeof options.read_preference === 'string') { + options.readPreference = new ReadPreference(options.readPreference || options.read_preference); + } + + // Do we have readPreference tags, add them + if (options.readPreference && (options.readPreferenceTags || options.read_preference_tags)) { + options.readPreference.tags = options.readPreferenceTags || options.read_preference_tags; + } + + // Do we have maxStalenessSeconds + if (options.maxStalenessSeconds) { + options.readPreference.maxStalenessSeconds = options.maxStalenessSeconds; + } + + // Set the socket and connection timeouts + if (options.socketTimeoutMS == null) options.socketTimeoutMS = 0; + if (options.connectTimeoutMS == null) options.connectTimeoutMS = 10000; + + if (!translationOptions.createServers) { + return; + } + + // Create server instances + return options.servers.map(serverObj => { + return serverObj.domain_socket + ? new Server(serverObj.domain_socket, 27017, options) + : new Server(serverObj.host, serverObj.port, options); + }); +} + +module.exports = { validOptions, connect }; diff --git a/node_modules/mongodb/lib/operations/count.js b/node_modules/mongodb/lib/operations/count.js new file mode 100644 index 00000000..a7216d6a --- /dev/null +++ b/node_modules/mongodb/lib/operations/count.js @@ -0,0 +1,68 @@ +'use strict'; + +const buildCountCommand = require('./common_functions').buildCountCommand; +const OperationBase = require('./operation').OperationBase; + +class CountOperation extends OperationBase { + constructor(cursor, applySkipLimit, options) { + super(options); + + this.cursor = cursor; + this.applySkipLimit = applySkipLimit; + } + + execute(callback) { + const cursor = this.cursor; + const applySkipLimit = this.applySkipLimit; + const options = this.options; + + if (applySkipLimit) { + if (typeof cursor.cursorSkip() === 'number') options.skip = cursor.cursorSkip(); + if (typeof cursor.cursorLimit() === 'number') options.limit = cursor.cursorLimit(); + } + + // Ensure we have the right read preference inheritance + if (options.readPreference) { + cursor.setReadPreference(options.readPreference); + } + + if ( + typeof options.maxTimeMS !== 'number' && + cursor.cmd && + typeof cursor.cmd.maxTimeMS === 'number' + ) { + options.maxTimeMS = cursor.cmd.maxTimeMS; + } + + let finalOptions = {}; + finalOptions.skip = options.skip; + finalOptions.limit = options.limit; + finalOptions.hint = options.hint; + finalOptions.maxTimeMS = options.maxTimeMS; + + // Command + finalOptions.collectionName = cursor.namespace.collection; + + let command; + try { + command = buildCountCommand(cursor, cursor.cmd.query, finalOptions); + } catch (err) { + return callback(err); + } + + // Set cursor server to the same as the topology + cursor.server = cursor.topology.s.coreTopology; + + // Execute the command + cursor.topology.command( + cursor.namespace.withCollection('$cmd'), + command, + cursor.options, + (err, result) => { + callback(err, result ? result.result.n : null); + } + ); + } +} + +module.exports = CountOperation; diff --git a/node_modules/mongodb/lib/operations/count_documents.js b/node_modules/mongodb/lib/operations/count_documents.js new file mode 100644 index 00000000..d043abfa --- /dev/null +++ b/node_modules/mongodb/lib/operations/count_documents.js @@ -0,0 +1,41 @@ +'use strict'; + +const AggregateOperation = require('./aggregate'); + +class CountDocumentsOperation extends AggregateOperation { + constructor(collection, query, options) { + const pipeline = [{ $match: query }]; + if (typeof options.skip === 'number') { + pipeline.push({ $skip: options.skip }); + } + + if (typeof options.limit === 'number') { + pipeline.push({ $limit: options.limit }); + } + + pipeline.push({ $group: { _id: 1, n: { $sum: 1 } } }); + + super(collection, pipeline, options); + } + + execute(server, callback) { + super.execute(server, (err, result) => { + if (err) { + callback(err, null); + return; + } + + // NOTE: We're avoiding creating a cursor here to reduce the callstack. + const response = result.result; + if (response.cursor == null || response.cursor.firstBatch == null) { + callback(null, 0); + return; + } + + const docs = response.cursor.firstBatch; + callback(null, docs.length ? docs[0].n : 0); + }); + } +} + +module.exports = CountDocumentsOperation; diff --git a/node_modules/mongodb/lib/operations/create_collection.js b/node_modules/mongodb/lib/operations/create_collection.js new file mode 100644 index 00000000..c84adb02 --- /dev/null +++ b/node_modules/mongodb/lib/operations/create_collection.js @@ -0,0 +1,102 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const CommandOperation = require('./command'); +const applyWriteConcern = require('../utils').applyWriteConcern; +const loadCollection = require('../dynamic_loaders').loadCollection; +const MongoError = require('../core').MongoError; +const ReadPreference = require('../core').ReadPreference; + +const ILLEGAL_COMMAND_FIELDS = new Set([ + 'w', + 'wtimeout', + 'j', + 'fsync', + 'autoIndexId', + 'strict', + 'serializeFunctions', + 'pkFactory', + 'raw', + 'readPreference', + 'session', + 'readConcern', + 'writeConcern' +]); + +class CreateCollectionOperation extends CommandOperation { + constructor(db, name, options) { + super(db, options); + this.name = name; + } + + _buildCommand() { + const name = this.name; + const options = this.options; + + const cmd = { create: name }; + for (let n in options) { + if ( + options[n] != null && + typeof options[n] !== 'function' && + !ILLEGAL_COMMAND_FIELDS.has(n) + ) { + cmd[n] = options[n]; + } + } + + return cmd; + } + + execute(callback) { + const db = this.db; + const name = this.name; + const options = this.options; + const Collection = loadCollection(); + + let listCollectionOptions = Object.assign({ nameOnly: true, strict: false }, options); + listCollectionOptions = applyWriteConcern(listCollectionOptions, { db }, listCollectionOptions); + + function done(err) { + if (err) { + return callback(err); + } + + try { + callback( + null, + new Collection(db, db.s.topology, db.databaseName, name, db.s.pkFactory, options) + ); + } catch (err) { + callback(err); + } + } + + const strictMode = listCollectionOptions.strict; + if (strictMode) { + db.listCollections({ name }, listCollectionOptions) + .setReadPreference(ReadPreference.PRIMARY) + .toArray((err, collections) => { + if (err) { + return callback(err); + } + + if (collections.length > 0) { + return callback( + new MongoError(`Collection ${name} already exists. Currently in strict mode.`) + ); + } + + super.execute(done); + }); + + return; + } + + // otherwise just execute the command + super.execute(done); + } +} + +defineAspects(CreateCollectionOperation, Aspect.WRITE_OPERATION); +module.exports = CreateCollectionOperation; diff --git a/node_modules/mongodb/lib/operations/create_indexes.js b/node_modules/mongodb/lib/operations/create_indexes.js new file mode 100644 index 00000000..211b43cd --- /dev/null +++ b/node_modules/mongodb/lib/operations/create_indexes.js @@ -0,0 +1,137 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const CommandOperationV2 = require('./command_v2'); +const MongoError = require('../core').MongoError; +const parseIndexOptions = require('../utils').parseIndexOptions; +const maxWireVersion = require('../core/utils').maxWireVersion; + +const VALID_INDEX_OPTIONS = new Set([ + 'background', + 'unique', + 'name', + 'partialFilterExpression', + 'sparse', + 'expireAfterSeconds', + 'storageEngine', + 'collation', + + // text indexes + 'weights', + 'default_language', + 'language_override', + 'textIndexVersion', + + // 2d-sphere indexes + '2dsphereIndexVersion', + + // 2d indexes + 'bits', + 'min', + 'max', + + // geoHaystack Indexes + 'bucketSize', + + // wildcard indexes + 'wildcardProjection' +]); + +class CreateIndexesOperation extends CommandOperationV2 { + /** + * @ignore + */ + constructor(parent, collection, indexes, options) { + super(parent, options); + this.collection = collection; + + // createIndex can be called with a variety of styles: + // coll.createIndex('a'); + // coll.createIndex({ a: 1 }); + // coll.createIndex([['a', 1]]); + // createIndexes is always called with an array of index spec objects + if (!Array.isArray(indexes) || Array.isArray(indexes[0])) { + this.onlyReturnNameOfCreatedIndex = true; + // TODO: remove in v4 (breaking change); make createIndex return full response as createIndexes does + + const indexParameters = parseIndexOptions(indexes); + // Generate the index name + const name = typeof options.name === 'string' ? options.name : indexParameters.name; + // Set up the index + const indexSpec = { name, key: indexParameters.fieldHash }; + // merge valid index options into the index spec + for (let optionName in options) { + if (VALID_INDEX_OPTIONS.has(optionName)) { + indexSpec[optionName] = options[optionName]; + } + } + this.indexes = [indexSpec]; + return; + } + + this.indexes = indexes; + } + + /** + * @ignore + */ + execute(server, callback) { + const options = this.options; + const indexes = this.indexes; + + const serverWireVersion = maxWireVersion(server); + + // Ensure we generate the correct name if the parameter is not set + for (let i = 0; i < indexes.length; i++) { + // Did the user pass in a collation, check if our write server supports it + if (indexes[i].collation && serverWireVersion < 5) { + callback( + new MongoError( + `Server ${server.name}, which reports wire version ${serverWireVersion}, does not support collation` + ) + ); + return; + } + + if (indexes[i].name == null) { + const keys = []; + + for (let name in indexes[i].key) { + keys.push(`${name}_${indexes[i].key[name]}`); + } + + // Set the name + indexes[i].name = keys.join('_'); + } + } + + const cmd = { createIndexes: this.collection, indexes }; + + if (options.commitQuorum != null) { + if (serverWireVersion < 9) { + callback( + new MongoError('`commitQuorum` option for `createIndexes` not supported on servers < 4.4') + ); + return; + } + cmd.commitQuorum = options.commitQuorum; + } + + // collation is set on each index, it should not be defined at the root + this.options.collation = undefined; + + super.executeCommand(server, cmd, (err, result) => { + if (err) { + callback(err); + return; + } + + callback(null, this.onlyReturnNameOfCreatedIndex ? indexes[0].name : result); + }); + } +} + +defineAspects(CreateIndexesOperation, [Aspect.WRITE_OPERATION, Aspect.EXECUTE_WITH_SELECTION]); + +module.exports = CreateIndexesOperation; diff --git a/node_modules/mongodb/lib/operations/cursor_ops.js b/node_modules/mongodb/lib/operations/cursor_ops.js new file mode 100644 index 00000000..fda4c914 --- /dev/null +++ b/node_modules/mongodb/lib/operations/cursor_ops.js @@ -0,0 +1,167 @@ +'use strict'; + +const buildCountCommand = require('./collection_ops').buildCountCommand; +const handleCallback = require('../utils').handleCallback; +const MongoError = require('../core').MongoError; +const push = Array.prototype.push; +const CursorState = require('../core/cursor').CursorState; + +/** + * Get the count of documents for this cursor. + * + * @method + * @param {Cursor} cursor The Cursor instance on which to count. + * @param {boolean} [applySkipLimit=true] Specifies whether the count command apply limit and skip settings should be applied on the cursor or in the provided options. + * @param {object} [options] Optional settings. See Cursor.prototype.count for a list of options. + * @param {Cursor~countResultCallback} [callback] The result callback. + */ +function count(cursor, applySkipLimit, opts, callback) { + if (applySkipLimit) { + if (typeof cursor.cursorSkip() === 'number') opts.skip = cursor.cursorSkip(); + if (typeof cursor.cursorLimit() === 'number') opts.limit = cursor.cursorLimit(); + } + + // Ensure we have the right read preference inheritance + if (opts.readPreference) { + cursor.setReadPreference(opts.readPreference); + } + + if ( + typeof opts.maxTimeMS !== 'number' && + cursor.cmd && + typeof cursor.cmd.maxTimeMS === 'number' + ) { + opts.maxTimeMS = cursor.cmd.maxTimeMS; + } + + let options = {}; + options.skip = opts.skip; + options.limit = opts.limit; + options.hint = opts.hint; + options.maxTimeMS = opts.maxTimeMS; + + // Command + options.collectionName = cursor.namespace.collection; + + let command; + try { + command = buildCountCommand(cursor, cursor.cmd.query, options); + } catch (err) { + return callback(err); + } + + // Set cursor server to the same as the topology + cursor.server = cursor.topology.s.coreTopology; + + // Execute the command + cursor.topology.command( + cursor.namespace.withCollection('$cmd'), + command, + cursor.options, + (err, result) => { + callback(err, result ? result.result.n : null); + } + ); +} + +/** + * Iterates over all the documents for this cursor. See Cursor.prototype.each for more information. + * + * @method + * @deprecated + * @param {Cursor} cursor The Cursor instance on which to run. + * @param {Cursor~resultCallback} callback The result callback. + */ +function each(cursor, callback) { + if (!callback) throw MongoError.create({ message: 'callback is mandatory', driver: true }); + if (cursor.isNotified()) return; + if (cursor.s.state === CursorState.CLOSED || cursor.isDead()) { + return handleCallback( + callback, + MongoError.create({ message: 'Cursor is closed', driver: true }) + ); + } + + if (cursor.s.state === CursorState.INIT) { + cursor.s.state = CursorState.OPEN; + } + + // Define function to avoid global scope escape + let fn = null; + // Trampoline all the entries + if (cursor.bufferedCount() > 0) { + while ((fn = loop(cursor, callback))) fn(cursor, callback); + each(cursor, callback); + } else { + cursor.next((err, item) => { + if (err) return handleCallback(callback, err); + if (item == null) { + return cursor.close({ skipKillCursors: true }, () => handleCallback(callback, null, null)); + } + + if (handleCallback(callback, null, item) === false) return; + each(cursor, callback); + }); + } +} + +// Trampoline emptying the number of retrieved items +// without incurring a nextTick operation +function loop(cursor, callback) { + // No more items we are done + if (cursor.bufferedCount() === 0) return; + // Get the next document + cursor._next(callback); + // Loop + return loop; +} + +/** + * Returns an array of documents. See Cursor.prototype.toArray for more information. + * + * @method + * @param {Cursor} cursor The Cursor instance from which to get the next document. + * @param {Cursor~toArrayResultCallback} [callback] The result callback. + */ +function toArray(cursor, callback) { + const items = []; + + // Reset cursor + cursor.rewind(); + cursor.s.state = CursorState.INIT; + + // Fetch all the documents + const fetchDocs = () => { + cursor._next((err, doc) => { + if (err) { + return handleCallback(callback, err); + } + + if (doc == null) { + return cursor.close({ skipKillCursors: true }, () => handleCallback(callback, null, items)); + } + + // Add doc to items + items.push(doc); + + // Get all buffered objects + if (cursor.bufferedCount() > 0) { + let docs = cursor.readBufferedDocuments(cursor.bufferedCount()); + + // Transform the doc if transform method added + if (cursor.s.transforms && typeof cursor.s.transforms.doc === 'function') { + docs = docs.map(cursor.s.transforms.doc); + } + + push.apply(items, docs); + } + + // Attempt a fetch + fetchDocs(); + }); + }; + + fetchDocs(); +} + +module.exports = { count, each, toArray }; diff --git a/node_modules/mongodb/lib/operations/db_ops.js b/node_modules/mongodb/lib/operations/db_ops.js new file mode 100644 index 00000000..8f9b8904 --- /dev/null +++ b/node_modules/mongodb/lib/operations/db_ops.js @@ -0,0 +1,467 @@ +'use strict'; + +const applyWriteConcern = require('../utils').applyWriteConcern; +const Code = require('../core').BSON.Code; +const debugOptions = require('../utils').debugOptions; +const handleCallback = require('../utils').handleCallback; +const MongoError = require('../core').MongoError; +const parseIndexOptions = require('../utils').parseIndexOptions; +const ReadPreference = require('../core').ReadPreference; +const toError = require('../utils').toError; +const CONSTANTS = require('../constants'); +const MongoDBNamespace = require('../utils').MongoDBNamespace; + +const debugFields = [ + 'authSource', + 'w', + 'wtimeout', + 'j', + 'native_parser', + 'forceServerObjectId', + 'serializeFunctions', + 'raw', + 'promoteLongs', + 'promoteValues', + 'promoteBuffers', + 'bufferMaxEntries', + 'numberOfRetries', + 'retryMiliSeconds', + 'readPreference', + 'pkFactory', + 'parentDb', + 'promiseLibrary', + 'noListener' +]; + +/** + * Creates an index on the db and collection. + * @method + * @param {Db} db The Db instance on which to create an index. + * @param {string} name Name of the collection to create the index on. + * @param {(string|object)} fieldOrSpec Defines the index. + * @param {object} [options] Optional settings. See Db.prototype.createIndex for a list of options. + * @param {Db~resultCallback} [callback] The command result callback + */ +function createIndex(db, name, fieldOrSpec, options, callback) { + // Get the write concern options + let finalOptions = Object.assign({}, { readPreference: ReadPreference.PRIMARY }, options); + finalOptions = applyWriteConcern(finalOptions, { db }, options); + + // Ensure we have a callback + if (finalOptions.writeConcern && typeof callback !== 'function') { + throw MongoError.create({ + message: 'Cannot use a writeConcern without a provided callback', + driver: true + }); + } + + // Did the user destroy the topology + if (db.serverConfig && db.serverConfig.isDestroyed()) + return callback(new MongoError('topology was destroyed')); + + // Attempt to run using createIndexes command + createIndexUsingCreateIndexes(db, name, fieldOrSpec, finalOptions, (err, result) => { + if (err == null) return handleCallback(callback, err, result); + + /** + * The following errors mean that the server recognized `createIndex` as a command so we don't need to fallback to an insert: + * 67 = 'CannotCreateIndex' (malformed index options) + * 85 = 'IndexOptionsConflict' (index already exists with different options) + * 86 = 'IndexKeySpecsConflict' (index already exists with the same name) + * 11000 = 'DuplicateKey' (couldn't build unique index because of dupes) + * 11600 = 'InterruptedAtShutdown' (interrupted at shutdown) + * 197 = 'InvalidIndexSpecificationOption' (`_id` with `background: true`) + */ + if ( + err.code === 67 || + err.code === 11000 || + err.code === 85 || + err.code === 86 || + err.code === 11600 || + err.code === 197 + ) { + return handleCallback(callback, err, result); + } + + // Create command + const doc = createCreateIndexCommand(db, name, fieldOrSpec, options); + // Set no key checking + finalOptions.checkKeys = false; + // Insert document + db.s.topology.insert( + db.s.namespace.withCollection(CONSTANTS.SYSTEM_INDEX_COLLECTION), + doc, + finalOptions, + (err, result) => { + if (callback == null) return; + if (err) return handleCallback(callback, err); + if (result == null) return handleCallback(callback, null, null); + if (result.result.writeErrors) + return handleCallback(callback, MongoError.create(result.result.writeErrors[0]), null); + handleCallback(callback, null, doc.name); + } + ); + }); +} + +// Add listeners to topology +function createListener(db, e, object) { + function listener(err) { + if (object.listeners(e).length > 0) { + object.emit(e, err, db); + + // Emit on all associated db's if available + for (let i = 0; i < db.s.children.length; i++) { + db.s.children[i].emit(e, err, db.s.children[i]); + } + } + } + return listener; +} + +/** + * Ensures that an index exists. If it does not, creates it. + * + * @method + * @param {Db} db The Db instance on which to ensure the index. + * @param {string} name The index name + * @param {(string|object)} fieldOrSpec Defines the index. + * @param {object} [options] Optional settings. See Db.prototype.ensureIndex for a list of options. + * @param {Db~resultCallback} [callback] The command result callback + */ +function ensureIndex(db, name, fieldOrSpec, options, callback) { + // Get the write concern options + const finalOptions = applyWriteConcern({}, { db }, options); + // Create command + const selector = createCreateIndexCommand(db, name, fieldOrSpec, options); + const index_name = selector.name; + + // Did the user destroy the topology + if (db.serverConfig && db.serverConfig.isDestroyed()) + return callback(new MongoError('topology was destroyed')); + + // Merge primary readPreference + finalOptions.readPreference = ReadPreference.PRIMARY; + + // Check if the index already exists + indexInformation(db, name, finalOptions, (err, indexInformation) => { + if (err != null && err.code !== 26) return handleCallback(callback, err, null); + // If the index does not exist, create it + if (indexInformation == null || !indexInformation[index_name]) { + createIndex(db, name, fieldOrSpec, options, callback); + } else { + if (typeof callback === 'function') return handleCallback(callback, null, index_name); + } + }); +} + +/** + * Evaluate JavaScript on the server + * + * @method + * @param {Db} db The Db instance. + * @param {Code} code JavaScript to execute on server. + * @param {(object|array)} parameters The parameters for the call. + * @param {object} [options] Optional settings. See Db.prototype.eval for a list of options. + * @param {Db~resultCallback} [callback] The results callback + * @deprecated Eval is deprecated on MongoDB 3.2 and forward + */ +function evaluate(db, code, parameters, options, callback) { + let finalCode = code; + let finalParameters = []; + + // Did the user destroy the topology + if (db.serverConfig && db.serverConfig.isDestroyed()) + return callback(new MongoError('topology was destroyed')); + + // If not a code object translate to one + if (!(finalCode && finalCode._bsontype === 'Code')) finalCode = new Code(finalCode); + // Ensure the parameters are correct + if (parameters != null && !Array.isArray(parameters) && typeof parameters !== 'function') { + finalParameters = [parameters]; + } else if (parameters != null && Array.isArray(parameters) && typeof parameters !== 'function') { + finalParameters = parameters; + } + + // Create execution selector + let cmd = { $eval: finalCode, args: finalParameters }; + // Check if the nolock parameter is passed in + if (options['nolock']) { + cmd['nolock'] = options['nolock']; + } + + // Set primary read preference + options.readPreference = new ReadPreference(ReadPreference.PRIMARY); + + // Execute the command + executeCommand(db, cmd, options, (err, result) => { + if (err) return handleCallback(callback, err, null); + if (result && result.ok === 1) return handleCallback(callback, null, result.retval); + if (result) + return handleCallback( + callback, + MongoError.create({ message: `eval failed: ${result.errmsg}`, driver: true }), + null + ); + handleCallback(callback, err, result); + }); +} + +/** + * Execute a command + * + * @method + * @param {Db} db The Db instance on which to execute the command. + * @param {object} command The command hash + * @param {object} [options] Optional settings. See Db.prototype.command for a list of options. + * @param {Db~resultCallback} [callback] The command result callback + */ +function executeCommand(db, command, options, callback) { + // Did the user destroy the topology + if (db.serverConfig && db.serverConfig.isDestroyed()) + return callback(new MongoError('topology was destroyed')); + // Get the db name we are executing against + const dbName = options.dbName || options.authdb || db.databaseName; + + // Convert the readPreference if its not a write + options.readPreference = ReadPreference.resolve(db, options); + + // Debug information + if (db.s.logger.isDebug()) + db.s.logger.debug( + `executing command ${JSON.stringify( + command + )} against ${dbName}.$cmd with options [${JSON.stringify( + debugOptions(debugFields, options) + )}]` + ); + + // Execute command + db.s.topology.command(db.s.namespace.withCollection('$cmd'), command, options, (err, result) => { + if (err) return handleCallback(callback, err); + if (options.full) return handleCallback(callback, null, result); + handleCallback(callback, null, result.result); + }); +} + +/** + * Runs a command on the database as admin. + * + * @method + * @param {Db} db The Db instance on which to execute the command. + * @param {object} command The command hash + * @param {object} [options] Optional settings. See Db.prototype.executeDbAdminCommand for a list of options. + * @param {Db~resultCallback} [callback] The command result callback + */ +function executeDbAdminCommand(db, command, options, callback) { + const namespace = new MongoDBNamespace('admin', '$cmd'); + + db.s.topology.command(namespace, command, options, (err, result) => { + // Did the user destroy the topology + if (db.serverConfig && db.serverConfig.isDestroyed()) { + return callback(new MongoError('topology was destroyed')); + } + + if (err) return handleCallback(callback, err); + handleCallback(callback, null, result.result); + }); +} + +/** + * Retrieves this collections index info. + * + * @method + * @param {Db} db The Db instance on which to retrieve the index info. + * @param {string} name The name of the collection. + * @param {object} [options] Optional settings. See Db.prototype.indexInformation for a list of options. + * @param {Db~resultCallback} [callback] The command result callback + */ +function indexInformation(db, name, options, callback) { + // If we specified full information + const full = options['full'] == null ? false : options['full']; + + // Did the user destroy the topology + if (db.serverConfig && db.serverConfig.isDestroyed()) + return callback(new MongoError('topology was destroyed')); + // Process all the results from the index command and collection + function processResults(indexes) { + // Contains all the information + let info = {}; + // Process all the indexes + for (let i = 0; i < indexes.length; i++) { + const index = indexes[i]; + // Let's unpack the object + info[index.name] = []; + for (let name in index.key) { + info[index.name].push([name, index.key[name]]); + } + } + + return info; + } + + // Get the list of indexes of the specified collection + db.collection(name) + .listIndexes(options) + .toArray((err, indexes) => { + if (err) return callback(toError(err)); + if (!Array.isArray(indexes)) return handleCallback(callback, null, []); + if (full) return handleCallback(callback, null, indexes); + handleCallback(callback, null, processResults(indexes)); + }); +} + +/** + * Retrieve the current profiling information for MongoDB + * + * @method + * @param {Db} db The Db instance on which to retrieve the profiling info. + * @param {Object} [options] Optional settings. See Db.protoype.profilingInfo for a list of options. + * @param {Db~resultCallback} [callback] The command result callback. + * @deprecated Query the system.profile collection directly. + */ +function profilingInfo(db, options, callback) { + try { + db.collection('system.profile') + .find({}, options) + .toArray(callback); + } catch (err) { + return callback(err, null); + } +} + +// Validate the database name +function validateDatabaseName(databaseName) { + if (typeof databaseName !== 'string') + throw MongoError.create({ message: 'database name must be a string', driver: true }); + if (databaseName.length === 0) + throw MongoError.create({ message: 'database name cannot be the empty string', driver: true }); + if (databaseName === '$external') return; + + const invalidChars = [' ', '.', '$', '/', '\\']; + for (let i = 0; i < invalidChars.length; i++) { + if (databaseName.indexOf(invalidChars[i]) !== -1) + throw MongoError.create({ + message: "database names cannot contain the character '" + invalidChars[i] + "'", + driver: true + }); + } +} + +/** + * Create the command object for Db.prototype.createIndex. + * + * @param {Db} db The Db instance on which to create the command. + * @param {string} name Name of the collection to create the index on. + * @param {(string|object)} fieldOrSpec Defines the index. + * @param {Object} [options] Optional settings. See Db.prototype.createIndex for a list of options. + * @return {Object} The insert command object. + */ +function createCreateIndexCommand(db, name, fieldOrSpec, options) { + const indexParameters = parseIndexOptions(fieldOrSpec); + const fieldHash = indexParameters.fieldHash; + + // Generate the index name + const indexName = typeof options.name === 'string' ? options.name : indexParameters.name; + const selector = { + ns: db.s.namespace.withCollection(name).toString(), + key: fieldHash, + name: indexName + }; + + // Ensure we have a correct finalUnique + const finalUnique = options == null || 'object' === typeof options ? false : options; + // Set up options + options = options == null || typeof options === 'boolean' ? {} : options; + + // Add all the options + const keysToOmit = Object.keys(selector); + for (let optionName in options) { + if (keysToOmit.indexOf(optionName) === -1) { + selector[optionName] = options[optionName]; + } + } + + if (selector['unique'] == null) selector['unique'] = finalUnique; + + // Remove any write concern operations + const removeKeys = ['w', 'wtimeout', 'j', 'fsync', 'readPreference', 'session']; + for (let i = 0; i < removeKeys.length; i++) { + delete selector[removeKeys[i]]; + } + + // Return the command creation selector + return selector; +} + +/** + * Create index using the createIndexes command. + * + * @param {Db} db The Db instance on which to execute the command. + * @param {string} name Name of the collection to create the index on. + * @param {(string|object)} fieldOrSpec Defines the index. + * @param {Object} [options] Optional settings. See Db.prototype.createIndex for a list of options. + * @param {Db~resultCallback} [callback] The command result callback. + */ +function createIndexUsingCreateIndexes(db, name, fieldOrSpec, options, callback) { + // Build the index + const indexParameters = parseIndexOptions(fieldOrSpec); + // Generate the index name + const indexName = typeof options.name === 'string' ? options.name : indexParameters.name; + // Set up the index + const indexes = [{ name: indexName, key: indexParameters.fieldHash }]; + // merge all the options + const keysToOmit = Object.keys(indexes[0]).concat([ + 'writeConcern', + 'w', + 'wtimeout', + 'j', + 'fsync', + 'readPreference', + 'session' + ]); + + for (let optionName in options) { + if (keysToOmit.indexOf(optionName) === -1) { + indexes[0][optionName] = options[optionName]; + } + } + + // Get capabilities + const capabilities = db.s.topology.capabilities(); + + // Did the user pass in a collation, check if our write server supports it + if (indexes[0].collation && capabilities && !capabilities.commandsTakeCollation) { + // Create a new error + const error = new MongoError('server/primary/mongos does not support collation'); + error.code = 67; + // Return the error + return callback(error); + } + + // Create command, apply write concern to command + const cmd = applyWriteConcern({ createIndexes: name, indexes }, { db }, options); + + // ReadPreference primary + options.readPreference = ReadPreference.PRIMARY; + + // Build the command + executeCommand(db, cmd, options, (err, result) => { + if (err) return handleCallback(callback, err, null); + if (result.ok === 0) return handleCallback(callback, toError(result), null); + // Return the indexName for backward compatibility + handleCallback(callback, null, indexName); + }); +} + +module.exports = { + createListener, + createIndex, + ensureIndex, + evaluate, + executeCommand, + executeDbAdminCommand, + indexInformation, + profilingInfo, + validateDatabaseName +}; diff --git a/node_modules/mongodb/lib/operations/delete_many.js b/node_modules/mongodb/lib/operations/delete_many.js new file mode 100644 index 00000000..32ae500d --- /dev/null +++ b/node_modules/mongodb/lib/operations/delete_many.js @@ -0,0 +1,38 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const removeDocuments = require('./common_functions').removeDocuments; +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; + +class DeleteManyOperation extends OperationBase { + constructor(collection, filter, options) { + super(options); + + this.collection = collection; + this.filter = filter; + } + + execute(callback) { + const coll = this.collection; + const filter = this.filter; + const options = this.options; + + options.single = false; + removeDocuments(coll, filter, options, (err, r) => { + if (callback == null) return; + if (err && callback) return callback(err); + if (r == null) return callback(null, { result: { ok: 1 } }); + + // If an explain operation was executed, don't process the server results + if (this.explain) return callback(undefined, r.result); + + r.deletedCount = r.result.n; + callback(null, r); + }); + } +} + +defineAspects(DeleteManyOperation, [Aspect.EXPLAINABLE]); + +module.exports = DeleteManyOperation; diff --git a/node_modules/mongodb/lib/operations/delete_one.js b/node_modules/mongodb/lib/operations/delete_one.js new file mode 100644 index 00000000..9aec05b9 --- /dev/null +++ b/node_modules/mongodb/lib/operations/delete_one.js @@ -0,0 +1,38 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const removeDocuments = require('./common_functions').removeDocuments; +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; + +class DeleteOneOperation extends OperationBase { + constructor(collection, filter, options) { + super(options); + + this.collection = collection; + this.filter = filter; + } + + execute(callback) { + const coll = this.collection; + const filter = this.filter; + const options = this.options; + + options.single = true; + removeDocuments(coll, filter, options, (err, r) => { + if (callback == null) return; + if (err && callback) return callback(err); + if (r == null) return callback(null, { result: { ok: 1 } }); + + // If an explain operation was executed, don't process the server results + if (this.explain) return callback(undefined, r.result); + + r.deletedCount = r.result.n; + callback(null, r); + }); + } +} + +defineAspects(DeleteOneOperation, [Aspect.EXPLAINABLE]); + +module.exports = DeleteOneOperation; diff --git a/node_modules/mongodb/lib/operations/distinct.js b/node_modules/mongodb/lib/operations/distinct.js new file mode 100644 index 00000000..fcac930c --- /dev/null +++ b/node_modules/mongodb/lib/operations/distinct.js @@ -0,0 +1,93 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const CommandOperationV2 = require('./command_v2'); +const decorateWithCollation = require('../utils').decorateWithCollation; +const decorateWithReadConcern = require('../utils').decorateWithReadConcern; +const maxWireVersion = require('../core/utils').maxWireVersion; +const MongoError = require('../error').MongoError; + +/** + * Return a list of distinct values for the given key across a collection. + * + * @class + * @property {Collection} a Collection instance. + * @property {string} key Field of the document to find distinct values for. + * @property {object} query The query for filtering the set of documents to which we apply the distinct filter. + * @property {object} [options] Optional settings. See Collection.prototype.distinct for a list of options. + */ +class DistinctOperation extends CommandOperationV2 { + /** + * Construct a Distinct operation. + * + * @param {Collection} a Collection instance. + * @param {string} key Field of the document to find distinct values for. + * @param {object} query The query for filtering the set of documents to which we apply the distinct filter. + * @param {object} [options] Optional settings. See Collection.prototype.distinct for a list of options. + */ + constructor(collection, key, query, options) { + super(collection, options); + + this.collection = collection; + this.key = key; + this.query = query; + } + + /** + * Execute the operation. + * + * @param {Collection~resultCallback} [callback] The command result callback + */ + execute(server, callback) { + const coll = this.collection; + const key = this.key; + const query = this.query; + const options = this.options; + + // Distinct command + const cmd = { + distinct: coll.collectionName, + key: key, + query: query + }; + + // Add maxTimeMS if defined + if (typeof options.maxTimeMS === 'number') { + cmd.maxTimeMS = options.maxTimeMS; + } + + // Do we have a readConcern specified + decorateWithReadConcern(cmd, coll, options); + + // Have we specified collation + try { + decorateWithCollation(cmd, coll, options); + } catch (err) { + return callback(err, null); + } + + if (this.explain && maxWireVersion(server) < 4) { + callback(new MongoError(`server does not support explain on distinct`)); + return; + } + + super.executeCommand(server, cmd, (err, result) => { + if (err) { + callback(err); + return; + } + + callback(null, this.options.full || this.explain ? result : result.values); + }); + } +} + +defineAspects(DistinctOperation, [ + Aspect.READ_OPERATION, + Aspect.RETRYABLE, + Aspect.EXECUTE_WITH_SELECTION, + Aspect.EXPLAINABLE +]); + +module.exports = DistinctOperation; diff --git a/node_modules/mongodb/lib/operations/drop.js b/node_modules/mongodb/lib/operations/drop.js new file mode 100644 index 00000000..be03716f --- /dev/null +++ b/node_modules/mongodb/lib/operations/drop.js @@ -0,0 +1,53 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const CommandOperation = require('./command'); +const defineAspects = require('./operation').defineAspects; +const handleCallback = require('../utils').handleCallback; + +class DropOperation extends CommandOperation { + constructor(db, options) { + const finalOptions = Object.assign({}, options, db.s.options); + + if (options.session) { + finalOptions.session = options.session; + } + + super(db, finalOptions); + } + + execute(callback) { + super.execute((err, result) => { + if (err) return handleCallback(callback, err); + if (result.ok) return handleCallback(callback, null, true); + handleCallback(callback, null, false); + }); + } +} + +defineAspects(DropOperation, Aspect.WRITE_OPERATION); + +class DropCollectionOperation extends DropOperation { + constructor(db, name, options) { + super(db, options); + + this.name = name; + this.namespace = `${db.namespace}.${name}`; + } + + _buildCommand() { + return { drop: this.name }; + } +} + +class DropDatabaseOperation extends DropOperation { + _buildCommand() { + return { dropDatabase: 1 }; + } +} + +module.exports = { + DropOperation, + DropCollectionOperation, + DropDatabaseOperation +}; diff --git a/node_modules/mongodb/lib/operations/drop_index.js b/node_modules/mongodb/lib/operations/drop_index.js new file mode 100644 index 00000000..a6ca783d --- /dev/null +++ b/node_modules/mongodb/lib/operations/drop_index.js @@ -0,0 +1,42 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const CommandOperation = require('./command'); +const applyWriteConcern = require('../utils').applyWriteConcern; +const handleCallback = require('../utils').handleCallback; + +class DropIndexOperation extends CommandOperation { + constructor(collection, indexName, options) { + super(collection.s.db, options, collection); + + this.collection = collection; + this.indexName = indexName; + } + + _buildCommand() { + const collection = this.collection; + const indexName = this.indexName; + const options = this.options; + + let cmd = { dropIndexes: collection.collectionName, index: indexName }; + + // Decorate command with writeConcern if supported + cmd = applyWriteConcern(cmd, { db: collection.s.db, collection }, options); + + return cmd; + } + + execute(callback) { + // Execute command + super.execute((err, result) => { + if (typeof callback !== 'function') return; + if (err) return handleCallback(callback, err, null); + handleCallback(callback, null, result); + }); + } +} + +defineAspects(DropIndexOperation, Aspect.WRITE_OPERATION); + +module.exports = DropIndexOperation; diff --git a/node_modules/mongodb/lib/operations/drop_indexes.js b/node_modules/mongodb/lib/operations/drop_indexes.js new file mode 100644 index 00000000..ed404ee9 --- /dev/null +++ b/node_modules/mongodb/lib/operations/drop_indexes.js @@ -0,0 +1,23 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const DropIndexOperation = require('./drop_index'); +const handleCallback = require('../utils').handleCallback; + +class DropIndexesOperation extends DropIndexOperation { + constructor(collection, options) { + super(collection, '*', options); + } + + execute(callback) { + super.execute(err => { + if (err) return handleCallback(callback, err, false); + handleCallback(callback, null, true); + }); + } +} + +defineAspects(DropIndexesOperation, Aspect.WRITE_OPERATION); + +module.exports = DropIndexesOperation; diff --git a/node_modules/mongodb/lib/operations/estimated_document_count.js b/node_modules/mongodb/lib/operations/estimated_document_count.js new file mode 100644 index 00000000..e2d65563 --- /dev/null +++ b/node_modules/mongodb/lib/operations/estimated_document_count.js @@ -0,0 +1,58 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const CommandOperationV2 = require('./command_v2'); + +class EstimatedDocumentCountOperation extends CommandOperationV2 { + constructor(collection, query, options) { + if (typeof options === 'undefined') { + options = query; + query = undefined; + } + + super(collection, options); + this.collectionName = collection.s.namespace.collection; + if (query) { + this.query = query; + } + } + + execute(server, callback) { + const options = this.options; + const cmd = { count: this.collectionName }; + + if (this.query) { + cmd.query = this.query; + } + + if (typeof options.skip === 'number') { + cmd.skip = options.skip; + } + + if (typeof options.limit === 'number') { + cmd.limit = options.limit; + } + + if (options.hint) { + cmd.hint = options.hint; + } + + super.executeCommand(server, cmd, (err, response) => { + if (err) { + callback(err); + return; + } + + callback(null, response.n); + }); + } +} + +defineAspects(EstimatedDocumentCountOperation, [ + Aspect.READ_OPERATION, + Aspect.RETRYABLE, + Aspect.EXECUTE_WITH_SELECTION +]); + +module.exports = EstimatedDocumentCountOperation; diff --git a/node_modules/mongodb/lib/operations/execute_db_admin_command.js b/node_modules/mongodb/lib/operations/execute_db_admin_command.js new file mode 100644 index 00000000..d15fc8e6 --- /dev/null +++ b/node_modules/mongodb/lib/operations/execute_db_admin_command.js @@ -0,0 +1,34 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const handleCallback = require('../utils').handleCallback; +const MongoError = require('../core').MongoError; +const MongoDBNamespace = require('../utils').MongoDBNamespace; + +class ExecuteDbAdminCommandOperation extends OperationBase { + constructor(db, selector, options) { + super(options); + + this.db = db; + this.selector = selector; + } + + execute(callback) { + const db = this.db; + const selector = this.selector; + const options = this.options; + + const namespace = new MongoDBNamespace('admin', '$cmd'); + db.s.topology.command(namespace, selector, options, (err, result) => { + // Did the user destroy the topology + if (db.serverConfig && db.serverConfig.isDestroyed()) { + return callback(new MongoError('topology was destroyed')); + } + + if (err) return handleCallback(callback, err); + handleCallback(callback, null, result.result); + }); + } +} + +module.exports = ExecuteDbAdminCommandOperation; diff --git a/node_modules/mongodb/lib/operations/execute_operation.js b/node_modules/mongodb/lib/operations/execute_operation.js new file mode 100644 index 00000000..80d57857 --- /dev/null +++ b/node_modules/mongodb/lib/operations/execute_operation.js @@ -0,0 +1,186 @@ +'use strict'; + +const MongoError = require('../core/error').MongoError; +const Aspect = require('./operation').Aspect; +const OperationBase = require('./operation').OperationBase; +const ReadPreference = require('../core/topologies/read_preference'); +const isRetryableError = require('../core/error').isRetryableError; +const maxWireVersion = require('../core/utils').maxWireVersion; +const isUnifiedTopology = require('../core/utils').isUnifiedTopology; + +/** + * Executes the given operation with provided arguments. + * + * This method reduces large amounts of duplication in the entire codebase by providing + * a single point for determining whether callbacks or promises should be used. Additionally + * it allows for a single point of entry to provide features such as implicit sessions, which + * are required by the Driver Sessions specification in the event that a ClientSession is + * not provided + * + * @param {object} topology The topology to execute this operation on + * @param {Operation} operation The operation to execute + * @param {function} callback The command result callback + */ +function executeOperation(topology, operation, callback) { + if (topology == null) { + throw new TypeError('This method requires a valid topology instance'); + } + + if (!(operation instanceof OperationBase)) { + throw new TypeError('This method requires a valid operation instance'); + } + + if (isUnifiedTopology(topology) && topology.shouldCheckForSessionSupport()) { + return selectServerForSessionSupport(topology, operation, callback); + } + + const Promise = topology.s.promiseLibrary; + + // The driver sessions spec mandates that we implicitly create sessions for operations + // that are not explicitly provided with a session. + let session, owner; + if (topology.hasSessionSupport()) { + if (operation.session == null) { + owner = Symbol(); + session = topology.startSession({ owner }); + operation.session = session; + } else if (operation.session.hasEnded) { + throw new MongoError('Use of expired sessions is not permitted'); + } + } + + let result; + if (typeof callback !== 'function') { + result = new Promise((resolve, reject) => { + callback = (err, res) => { + if (err) return reject(err); + resolve(res); + }; + }); + } + + function executeCallback(err, result) { + if (session && session.owner === owner) { + session.endSession(); + if (operation.session === session) { + operation.clearSession(); + } + } + + callback(err, result); + } + + try { + if (operation.hasAspect(Aspect.EXECUTE_WITH_SELECTION)) { + executeWithServerSelection(topology, operation, executeCallback); + } else { + operation.execute(executeCallback); + } + } catch (e) { + if (session && session.owner === owner) { + session.endSession(); + if (operation.session === session) { + operation.clearSession(); + } + } + + throw e; + } + + return result; +} + +function supportsRetryableReads(server) { + return maxWireVersion(server) >= 6; +} + +function executeWithServerSelection(topology, operation, callback) { + const readPreference = operation.readPreference || ReadPreference.primary; + const inTransaction = operation.session && operation.session.inTransaction(); + + if (inTransaction && !readPreference.equals(ReadPreference.primary)) { + callback( + new MongoError( + `Read preference in a transaction must be primary, not: ${readPreference.mode}` + ) + ); + + return; + } + + const serverSelectionOptions = { + readPreference, + session: operation.session + }; + + function callbackWithRetry(err, result) { + if (err == null) { + return callback(null, result); + } + + if (!isRetryableError(err)) { + return callback(err); + } + + // select a new server, and attempt to retry the operation + topology.selectServer(serverSelectionOptions, (err, server) => { + if (err || !supportsRetryableReads(server)) { + callback(err, null); + return; + } + + operation.execute(server, callback); + }); + } + + // select a server, and execute the operation against it + topology.selectServer(serverSelectionOptions, (err, server) => { + if (err) { + callback(err, null); + return; + } + + const shouldRetryReads = + topology.s.options.retryReads !== false && + operation.session && + !inTransaction && + supportsRetryableReads(server) && + operation.canRetryRead; + + if (operation.hasAspect(Aspect.RETRYABLE) && shouldRetryReads) { + operation.execute(server, callbackWithRetry); + return; + } + + operation.execute(server, callback); + }); +} + +// TODO: This is only supported for unified topology, it should go away once +// we remove support for legacy topology types. +function selectServerForSessionSupport(topology, operation, callback) { + const Promise = topology.s.promiseLibrary; + + let result; + if (typeof callback !== 'function') { + result = new Promise((resolve, reject) => { + callback = (err, result) => { + if (err) return reject(err); + resolve(result); + }; + }); + } + + topology.selectServer(ReadPreference.primaryPreferred, err => { + if (err) { + callback(err); + return; + } + + executeOperation(topology, operation, callback); + }); + + return result; +} + +module.exports = executeOperation; diff --git a/node_modules/mongodb/lib/operations/find.js b/node_modules/mongodb/lib/operations/find.js new file mode 100644 index 00000000..4cf697f5 --- /dev/null +++ b/node_modules/mongodb/lib/operations/find.js @@ -0,0 +1,46 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const ReadPreference = require('../core').ReadPreference; +const maxWireVersion = require('../core/utils').maxWireVersion; +const MongoError = require('../core/error').MongoError; + +class FindOperation extends OperationBase { + constructor(collection, ns, command, options) { + super(options); + + this.ns = ns; + this.cmd = command; + this.readPreference = ReadPreference.resolve(collection, this.options); + } + + execute(server, callback) { + // copied from `CommandOperationV2`, to be subclassed in the future + this.server = server; + + if (typeof this.cmd.allowDiskUse !== 'undefined' && maxWireVersion(server) < 4) { + callback(new MongoError('The `allowDiskUse` option is not supported on MongoDB < 3.2')); + return; + } + + if (this.explain) { + // We need to manually ensure explain is in the options. + this.options.explain = this.explain.verbosity; + } + + // TOOD: use `MongoDBNamespace` through and through + const cursorState = this.cursorState || {}; + server.query(this.ns.toString(), this.cmd, cursorState, this.options, callback); + } +} + +defineAspects(FindOperation, [ + Aspect.READ_OPERATION, + Aspect.RETRYABLE, + Aspect.EXECUTE_WITH_SELECTION, + Aspect.EXPLAINABLE +]); + +module.exports = FindOperation; diff --git a/node_modules/mongodb/lib/operations/find_and_modify.js b/node_modules/mongodb/lib/operations/find_and_modify.js new file mode 100644 index 00000000..3886688e --- /dev/null +++ b/node_modules/mongodb/lib/operations/find_and_modify.js @@ -0,0 +1,128 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const applyRetryableWrites = require('../utils').applyRetryableWrites; +const applyWriteConcern = require('../utils').applyWriteConcern; +const decorateWithCollation = require('../utils').decorateWithCollation; +const executeCommand = require('./db_ops').executeCommand; +const formattedOrderClause = require('../utils').formattedOrderClause; +const handleCallback = require('../utils').handleCallback; +const ReadPreference = require('../core').ReadPreference; +const maxWireVersion = require('../core/utils').maxWireVersion; +const MongoError = require('../error').MongoError; +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const decorateWithExplain = require('../utils').decorateWithExplain; + +class FindAndModifyOperation extends OperationBase { + constructor(collection, query, sort, doc, options) { + super(options); + + this.collection = collection; + this.query = query; + this.sort = sort; + this.doc = doc; + } + + execute(callback) { + const coll = this.collection; + const query = this.query; + const sort = formattedOrderClause(this.sort); + const doc = this.doc; + let options = this.options; + + // Create findAndModify command object + let queryObject = { + findAndModify: coll.collectionName, + query: query + }; + + if (sort) { + queryObject.sort = sort; + } + + queryObject.new = options.new ? true : false; + queryObject.remove = options.remove ? true : false; + queryObject.upsert = options.upsert ? true : false; + + const projection = options.projection || options.fields; + + if (projection) { + queryObject.fields = projection; + } + + if (options.arrayFilters) { + queryObject.arrayFilters = options.arrayFilters; + } + + if (doc && !options.remove) { + queryObject.update = doc; + } + + if (options.maxTimeMS) queryObject.maxTimeMS = options.maxTimeMS; + + // Either use override on the function, or go back to default on either the collection + // level or db + options.serializeFunctions = options.serializeFunctions || coll.s.serializeFunctions; + + // No check on the documents + options.checkKeys = false; + + // Final options for retryable writes and write concern + options = applyRetryableWrites(options, coll.s.db); + options = applyWriteConcern(options, { db: coll.s.db, collection: coll }, options); + + // Decorate the findAndModify command with the write Concern + if (options.writeConcern) { + queryObject.writeConcern = options.writeConcern; + } + + // Have we specified bypassDocumentValidation + if (options.bypassDocumentValidation === true) { + queryObject.bypassDocumentValidation = options.bypassDocumentValidation; + } + + options.readPreference = ReadPreference.primary; + + // Have we specified collation + try { + decorateWithCollation(queryObject, coll, options); + } catch (err) { + return callback(err, null); + } + + if (options.hint) { + // TODO: once this method becomes a CommandOperationV2 we will have the server + // in place to check. + const unacknowledgedWrite = options.writeConcern && options.writeConcern.w === 0; + if (unacknowledgedWrite || maxWireVersion(coll.s.topology) < 8) { + callback( + new MongoError('The current topology does not support a hint on findAndModify commands') + ); + + return; + } + + queryObject.hint = options.hint; + } + + if (this.explain) { + if (maxWireVersion(coll.s.topology) < 4) { + callback(new MongoError(`server does not support explain on findAndModify`)); + return; + } + queryObject = decorateWithExplain(queryObject, this.explain); + } + + // Execute the command + executeCommand(coll.s.db, queryObject, options, (err, result) => { + if (err) return handleCallback(callback, err, null); + + return handleCallback(callback, null, result); + }); + } +} + +defineAspects(FindAndModifyOperation, [Aspect.EXPLAINABLE]); + +module.exports = FindAndModifyOperation; diff --git a/node_modules/mongodb/lib/operations/find_one.js b/node_modules/mongodb/lib/operations/find_one.js new file mode 100644 index 00000000..3e4b3cf8 --- /dev/null +++ b/node_modules/mongodb/lib/operations/find_one.js @@ -0,0 +1,41 @@ +'use strict'; + +const handleCallback = require('../utils').handleCallback; +const OperationBase = require('./operation').OperationBase; +const toError = require('../utils').toError; +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; + +class FindOneOperation extends OperationBase { + constructor(collection, query, options) { + super(options); + + this.collection = collection; + this.query = query; + } + + execute(callback) { + const coll = this.collection; + const query = this.query; + const options = this.options; + + try { + const cursor = coll + .find(query, options) + .limit(-1) + .batchSize(1); + + // Return the item + cursor.next((err, item) => { + if (err != null) return handleCallback(callback, toError(err), null); + handleCallback(callback, null, item); + }); + } catch (e) { + callback(e); + } + } +} + +defineAspects(FindOneOperation, [Aspect.EXPLAINABLE]); + +module.exports = FindOneOperation; diff --git a/node_modules/mongodb/lib/operations/find_one_and_delete.js b/node_modules/mongodb/lib/operations/find_one_and_delete.js new file mode 100644 index 00000000..eaf32877 --- /dev/null +++ b/node_modules/mongodb/lib/operations/find_one_and_delete.js @@ -0,0 +1,21 @@ +'use strict'; + +const FindAndModifyOperation = require('./find_and_modify'); + +class FindOneAndDeleteOperation extends FindAndModifyOperation { + constructor(collection, filter, options) { + // Final options + const finalOptions = Object.assign({}, options); + finalOptions.fields = options.projection; + finalOptions.remove = true; + + // Basic validation + if (filter == null || typeof filter !== 'object') { + throw new TypeError('Filter parameter must be an object'); + } + + super(collection, filter, finalOptions.sort, null, finalOptions); + } +} + +module.exports = FindOneAndDeleteOperation; diff --git a/node_modules/mongodb/lib/operations/find_one_and_replace.js b/node_modules/mongodb/lib/operations/find_one_and_replace.js new file mode 100644 index 00000000..f068cdfb --- /dev/null +++ b/node_modules/mongodb/lib/operations/find_one_and_replace.js @@ -0,0 +1,31 @@ +'use strict'; + +const FindAndModifyOperation = require('./find_and_modify'); +const hasAtomicOperators = require('../utils').hasAtomicOperators; + +class FindOneAndReplaceOperation extends FindAndModifyOperation { + constructor(collection, filter, replacement, options) { + // Final options + const finalOptions = Object.assign({}, options); + finalOptions.fields = options.projection; + finalOptions.update = true; + finalOptions.new = options.returnOriginal !== void 0 ? !options.returnOriginal : false; + finalOptions.upsert = options.upsert !== void 0 ? !!options.upsert : false; + + if (filter == null || typeof filter !== 'object') { + throw new TypeError('Filter parameter must be an object'); + } + + if (replacement == null || typeof replacement !== 'object') { + throw new TypeError('Replacement parameter must be an object'); + } + + if (hasAtomicOperators(replacement)) { + throw new TypeError('Replacement document must not contain atomic operators'); + } + + super(collection, filter, finalOptions.sort, replacement, finalOptions); + } +} + +module.exports = FindOneAndReplaceOperation; diff --git a/node_modules/mongodb/lib/operations/find_one_and_update.js b/node_modules/mongodb/lib/operations/find_one_and_update.js new file mode 100644 index 00000000..5ec8be57 --- /dev/null +++ b/node_modules/mongodb/lib/operations/find_one_and_update.js @@ -0,0 +1,32 @@ +'use strict'; + +const FindAndModifyOperation = require('./find_and_modify'); +const hasAtomicOperators = require('../utils').hasAtomicOperators; + +class FindOneAndUpdateOperation extends FindAndModifyOperation { + constructor(collection, filter, update, options) { + // Final options + const finalOptions = Object.assign({}, options); + finalOptions.fields = options.projection; + finalOptions.update = true; + finalOptions.new = + typeof options.returnOriginal === 'boolean' ? !options.returnOriginal : false; + finalOptions.upsert = typeof options.upsert === 'boolean' ? options.upsert : false; + + if (filter == null || typeof filter !== 'object') { + throw new TypeError('Filter parameter must be an object'); + } + + if (update == null || typeof update !== 'object') { + throw new TypeError('Update parameter must be an object'); + } + + if (!hasAtomicOperators(update)) { + throw new TypeError('Update document requires atomic operators'); + } + + super(collection, filter, finalOptions.sort, update, finalOptions); + } +} + +module.exports = FindOneAndUpdateOperation; diff --git a/node_modules/mongodb/lib/operations/geo_haystack_search.js b/node_modules/mongodb/lib/operations/geo_haystack_search.js new file mode 100644 index 00000000..7c8654d2 --- /dev/null +++ b/node_modules/mongodb/lib/operations/geo_haystack_search.js @@ -0,0 +1,79 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const OperationBase = require('./operation').OperationBase; +const decorateCommand = require('../utils').decorateCommand; +const decorateWithReadConcern = require('../utils').decorateWithReadConcern; +const executeCommand = require('./db_ops').executeCommand; +const handleCallback = require('../utils').handleCallback; +const ReadPreference = require('../core').ReadPreference; +const toError = require('../utils').toError; + +/** + * Execute a geo search using a geo haystack index on a collection. + * + * @class + * @property {Collection} a Collection instance. + * @property {number} x Point to search on the x axis, ensure the indexes are ordered in the same order. + * @property {number} y Point to search on the y axis, ensure the indexes are ordered in the same order. + * @property {object} [options] Optional settings. See Collection.prototype.geoHaystackSearch for a list of options. + */ +class GeoHaystackSearchOperation extends OperationBase { + /** + * Construct a GeoHaystackSearch operation. + * + * @param {Collection} a Collection instance. + * @param {number} x Point to search on the x axis, ensure the indexes are ordered in the same order. + * @param {number} y Point to search on the y axis, ensure the indexes are ordered in the same order. + * @param {object} [options] Optional settings. See Collection.prototype.geoHaystackSearch for a list of options. + */ + constructor(collection, x, y, options) { + super(options); + + this.collection = collection; + this.x = x; + this.y = y; + } + + /** + * Execute the operation. + * + * @param {Collection~resultCallback} [callback] The command result callback + */ + execute(callback) { + const coll = this.collection; + const x = this.x; + const y = this.y; + let options = this.options; + + // Build command object + let commandObject = { + geoSearch: coll.collectionName, + near: [x, y] + }; + + // Remove read preference from hash if it exists + commandObject = decorateCommand(commandObject, options, ['readPreference', 'session']); + + options = Object.assign({}, options); + // Ensure we have the right read preference inheritance + options.readPreference = ReadPreference.resolve(coll, options); + + // Do we have a readConcern specified + decorateWithReadConcern(commandObject, coll, options); + + // Execute the command + executeCommand(coll.s.db, commandObject, options, (err, res) => { + if (err) return handleCallback(callback, err); + if (res.err || res.errmsg) handleCallback(callback, toError(res)); + // should we only be returning res.results here? Not sure if the user + // should see the other return information + handleCallback(callback, null, res); + }); + } +} + +defineAspects(GeoHaystackSearchOperation, Aspect.READ_OPERATION); + +module.exports = GeoHaystackSearchOperation; diff --git a/node_modules/mongodb/lib/operations/index_exists.js b/node_modules/mongodb/lib/operations/index_exists.js new file mode 100644 index 00000000..bd9dc0e9 --- /dev/null +++ b/node_modules/mongodb/lib/operations/index_exists.js @@ -0,0 +1,39 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const handleCallback = require('../utils').handleCallback; +const indexInformationDb = require('./db_ops').indexInformation; + +class IndexExistsOperation extends OperationBase { + constructor(collection, indexes, options) { + super(options); + + this.collection = collection; + this.indexes = indexes; + } + + execute(callback) { + const coll = this.collection; + const indexes = this.indexes; + const options = this.options; + + indexInformationDb(coll.s.db, coll.collectionName, options, (err, indexInformation) => { + // If we have an error return + if (err != null) return handleCallback(callback, err, null); + // Let's check for the index names + if (!Array.isArray(indexes)) + return handleCallback(callback, null, indexInformation[indexes] != null); + // Check in list of indexes + for (let i = 0; i < indexes.length; i++) { + if (indexInformation[indexes[i]] == null) { + return handleCallback(callback, null, false); + } + } + + // All keys found return true + return handleCallback(callback, null, true); + }); + } +} + +module.exports = IndexExistsOperation; diff --git a/node_modules/mongodb/lib/operations/index_information.js b/node_modules/mongodb/lib/operations/index_information.js new file mode 100644 index 00000000..b18a603f --- /dev/null +++ b/node_modules/mongodb/lib/operations/index_information.js @@ -0,0 +1,23 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const indexInformation = require('./common_functions').indexInformation; + +class IndexInformationOperation extends OperationBase { + constructor(db, name, options) { + super(options); + + this.db = db; + this.name = name; + } + + execute(callback) { + const db = this.db; + const name = this.name; + const options = this.options; + + indexInformation(db, name, options, callback); + } +} + +module.exports = IndexInformationOperation; diff --git a/node_modules/mongodb/lib/operations/indexes.js b/node_modules/mongodb/lib/operations/indexes.js new file mode 100644 index 00000000..e29a88aa --- /dev/null +++ b/node_modules/mongodb/lib/operations/indexes.js @@ -0,0 +1,22 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const indexInformation = require('./common_functions').indexInformation; + +class IndexesOperation extends OperationBase { + constructor(collection, options) { + super(options); + + this.collection = collection; + } + + execute(callback) { + const coll = this.collection; + let options = this.options; + + options = Object.assign({}, { full: true }, options); + indexInformation(coll.s.db, coll.collectionName, options, callback); + } +} + +module.exports = IndexesOperation; diff --git a/node_modules/mongodb/lib/operations/insert_many.js b/node_modules/mongodb/lib/operations/insert_many.js new file mode 100644 index 00000000..460a535d --- /dev/null +++ b/node_modules/mongodb/lib/operations/insert_many.js @@ -0,0 +1,63 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const BulkWriteOperation = require('./bulk_write'); +const MongoError = require('../core').MongoError; +const prepareDocs = require('./common_functions').prepareDocs; + +class InsertManyOperation extends OperationBase { + constructor(collection, docs, options) { + super(options); + + this.collection = collection; + this.docs = docs; + } + + execute(callback) { + const coll = this.collection; + let docs = this.docs; + const options = this.options; + + if (!Array.isArray(docs)) { + return callback( + MongoError.create({ message: 'docs parameter must be an array of documents', driver: true }) + ); + } + + // If keep going set unordered + options['serializeFunctions'] = options['serializeFunctions'] || coll.s.serializeFunctions; + + docs = prepareDocs(coll, docs, options); + + // Generate the bulk write operations + const operations = [ + { + insertMany: docs + } + ]; + + const bulkWriteOperation = new BulkWriteOperation(coll, operations, options); + + bulkWriteOperation.execute((err, result) => { + if (err) return callback(err, null); + callback(null, mapInsertManyResults(docs, result)); + }); + } +} + +function mapInsertManyResults(docs, r) { + const finalResult = { + result: { ok: 1, n: r.insertedCount }, + ops: docs, + insertedCount: r.insertedCount, + insertedIds: r.insertedIds + }; + + if (r.getLastOp()) { + finalResult.result.opTime = r.getLastOp(); + } + + return finalResult; +} + +module.exports = InsertManyOperation; diff --git a/node_modules/mongodb/lib/operations/insert_one.js b/node_modules/mongodb/lib/operations/insert_one.js new file mode 100644 index 00000000..5e708801 --- /dev/null +++ b/node_modules/mongodb/lib/operations/insert_one.js @@ -0,0 +1,39 @@ +'use strict'; + +const MongoError = require('../core').MongoError; +const OperationBase = require('./operation').OperationBase; +const insertDocuments = require('./common_functions').insertDocuments; + +class InsertOneOperation extends OperationBase { + constructor(collection, doc, options) { + super(options); + + this.collection = collection; + this.doc = doc; + } + + execute(callback) { + const coll = this.collection; + const doc = this.doc; + const options = this.options; + + if (Array.isArray(doc)) { + return callback( + MongoError.create({ message: 'doc parameter must be an object', driver: true }) + ); + } + + insertDocuments(coll, [doc], options, (err, r) => { + if (callback == null) return; + if (err && callback) return callback(err); + // Workaround for pre 2.6 servers + if (r == null) return callback(null, { result: { ok: 1 } }); + // Add values to top level to ensure crud spec compatibility + r.insertedCount = r.result.n; + r.insertedId = doc._id; + if (callback) callback(null, r); + }); + } +} + +module.exports = InsertOneOperation; diff --git a/node_modules/mongodb/lib/operations/is_capped.js b/node_modules/mongodb/lib/operations/is_capped.js new file mode 100644 index 00000000..3bfd9ffa --- /dev/null +++ b/node_modules/mongodb/lib/operations/is_capped.js @@ -0,0 +1,19 @@ +'use strict'; + +const OptionsOperation = require('./options_operation'); +const handleCallback = require('../utils').handleCallback; + +class IsCappedOperation extends OptionsOperation { + constructor(collection, options) { + super(collection, options); + } + + execute(callback) { + super.execute((err, document) => { + if (err) return handleCallback(callback, err); + handleCallback(callback, null, !!(document && document.capped)); + }); + } +} + +module.exports = IsCappedOperation; diff --git a/node_modules/mongodb/lib/operations/list_collections.js b/node_modules/mongodb/lib/operations/list_collections.js new file mode 100644 index 00000000..ee01d31e --- /dev/null +++ b/node_modules/mongodb/lib/operations/list_collections.js @@ -0,0 +1,106 @@ +'use strict'; + +const CommandOperationV2 = require('./command_v2'); +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const maxWireVersion = require('../core/utils').maxWireVersion; +const CONSTANTS = require('../constants'); + +const LIST_COLLECTIONS_WIRE_VERSION = 3; + +function listCollectionsTransforms(databaseName) { + const matching = `${databaseName}.`; + + return { + doc: doc => { + const index = doc.name.indexOf(matching); + // Remove database name if available + if (doc.name && index === 0) { + doc.name = doc.name.substr(index + matching.length); + } + + return doc; + } + }; +} + +class ListCollectionsOperation extends CommandOperationV2 { + constructor(db, filter, options) { + super(db, options, { fullResponse: true }); + + this.db = db; + this.filter = filter; + this.nameOnly = !!this.options.nameOnly; + + if (typeof this.options.batchSize === 'number') { + this.batchSize = this.options.batchSize; + } + } + + execute(server, callback) { + if (maxWireVersion(server) < LIST_COLLECTIONS_WIRE_VERSION) { + let filter = this.filter; + const databaseName = this.db.s.namespace.db; + + // If we have legacy mode and have not provided a full db name filter it + if ( + typeof filter.name === 'string' && + !new RegExp('^' + databaseName + '\\.').test(filter.name) + ) { + filter = Object.assign({}, filter); + filter.name = this.db.s.namespace.withCollection(filter.name).toString(); + } + + // No filter, filter by current database + if (filter == null) { + filter.name = `/${databaseName}/`; + } + + // Rewrite the filter to use $and to filter out indexes + if (filter.name) { + filter = { $and: [{ name: filter.name }, { name: /^((?!\$).)*$/ }] }; + } else { + filter = { name: /^((?!\$).)*$/ }; + } + + const transforms = listCollectionsTransforms(databaseName); + server.query( + `${databaseName}.${CONSTANTS.SYSTEM_NAMESPACE_COLLECTION}`, + { query: filter }, + { batchSize: this.batchSize || 1000 }, + {}, + (err, result) => { + if ( + result && + result.message && + result.message.documents && + Array.isArray(result.message.documents) + ) { + result.message.documents = result.message.documents.map(transforms.doc); + } + + callback(err, result); + } + ); + + return; + } + + const command = { + listCollections: 1, + filter: this.filter, + cursor: this.batchSize ? { batchSize: this.batchSize } : {}, + nameOnly: this.nameOnly + }; + + return super.executeCommand(server, command, callback); + } +} + +defineAspects(ListCollectionsOperation, [ + Aspect.READ_OPERATION, + Aspect.RETRYABLE, + Aspect.EXECUTE_WITH_SELECTION +]); + +module.exports = ListCollectionsOperation; diff --git a/node_modules/mongodb/lib/operations/list_databases.js b/node_modules/mongodb/lib/operations/list_databases.js new file mode 100644 index 00000000..62b2606f --- /dev/null +++ b/node_modules/mongodb/lib/operations/list_databases.js @@ -0,0 +1,38 @@ +'use strict'; + +const CommandOperationV2 = require('./command_v2'); +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const MongoDBNamespace = require('../utils').MongoDBNamespace; + +class ListDatabasesOperation extends CommandOperationV2 { + constructor(db, options) { + super(db, options); + this.ns = new MongoDBNamespace('admin', '$cmd'); + } + + execute(server, callback) { + const cmd = { listDatabases: 1 }; + if (this.options.nameOnly) { + cmd.nameOnly = Number(cmd.nameOnly); + } + + if (this.options.filter) { + cmd.filter = this.options.filter; + } + + if (typeof this.options.authorizedDatabases === 'boolean') { + cmd.authorizedDatabases = this.options.authorizedDatabases; + } + + super.executeCommand(server, cmd, callback); + } +} + +defineAspects(ListDatabasesOperation, [ + Aspect.READ_OPERATION, + Aspect.RETRYABLE, + Aspect.EXECUTE_WITH_SELECTION +]); + +module.exports = ListDatabasesOperation; diff --git a/node_modules/mongodb/lib/operations/list_indexes.js b/node_modules/mongodb/lib/operations/list_indexes.js new file mode 100644 index 00000000..302a31b7 --- /dev/null +++ b/node_modules/mongodb/lib/operations/list_indexes.js @@ -0,0 +1,42 @@ +'use strict'; + +const CommandOperationV2 = require('./command_v2'); +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const maxWireVersion = require('../core/utils').maxWireVersion; + +const LIST_INDEXES_WIRE_VERSION = 3; + +class ListIndexesOperation extends CommandOperationV2 { + constructor(collection, options) { + super(collection, options, { fullResponse: true }); + + this.collectionNamespace = collection.s.namespace; + } + + execute(server, callback) { + const serverWireVersion = maxWireVersion(server); + if (serverWireVersion < LIST_INDEXES_WIRE_VERSION) { + const systemIndexesNS = this.collectionNamespace.withCollection('system.indexes').toString(); + const collectionNS = this.collectionNamespace.toString(); + + server.query(systemIndexesNS, { query: { ns: collectionNS } }, {}, this.options, callback); + return; + } + + const cursor = this.options.batchSize ? { batchSize: this.options.batchSize } : {}; + super.executeCommand( + server, + { listIndexes: this.collectionNamespace.collection, cursor }, + callback + ); + } +} + +defineAspects(ListIndexesOperation, [ + Aspect.READ_OPERATION, + Aspect.RETRYABLE, + Aspect.EXECUTE_WITH_SELECTION +]); + +module.exports = ListIndexesOperation; diff --git a/node_modules/mongodb/lib/operations/map_reduce.js b/node_modules/mongodb/lib/operations/map_reduce.js new file mode 100644 index 00000000..3a2cf261 --- /dev/null +++ b/node_modules/mongodb/lib/operations/map_reduce.js @@ -0,0 +1,209 @@ +'use strict'; + +const applyWriteConcern = require('../utils').applyWriteConcern; +const Code = require('../core').BSON.Code; +const decorateWithCollation = require('../utils').decorateWithCollation; +const decorateWithReadConcern = require('../utils').decorateWithReadConcern; +const executeCommand = require('./db_ops').executeCommand; +const handleCallback = require('../utils').handleCallback; +const isObject = require('../utils').isObject; +const loadDb = require('../dynamic_loaders').loadDb; +const OperationBase = require('./operation').OperationBase; +const ReadPreference = require('../core').ReadPreference; +const toError = require('../utils').toError; +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const decorateWithExplain = require('../utils').decorateWithExplain; +const maxWireVersion = require('../core/utils').maxWireVersion; +const MongoError = require('../error').MongoError; + +const exclusionList = [ + 'explain', + 'readPreference', + 'session', + 'bypassDocumentValidation', + 'w', + 'wtimeout', + 'j', + 'writeConcern' +]; + +/** + * Run Map Reduce across a collection. Be aware that the inline option for out will return an array of results not a collection. + * + * @class + * @property {Collection} a Collection instance. + * @property {(function|string)} map The mapping function. + * @property {(function|string)} reduce The reduce function. + * @property {object} [options] Optional settings. See Collection.prototype.mapReduce for a list of options. + */ +class MapReduceOperation extends OperationBase { + /** + * Constructs a MapReduce operation. + * + * @param {Collection} a Collection instance. + * @param {(function|string)} map The mapping function. + * @param {(function|string)} reduce The reduce function. + * @param {object} [options] Optional settings. See Collection.prototype.mapReduce for a list of options. + */ + constructor(collection, map, reduce, options) { + super(options); + + this.collection = collection; + this.map = map; + this.reduce = reduce; + } + + /** + * Execute the operation. + * + * @param {Collection~resultCallback} [callback] The command result callback + */ + execute(callback) { + const coll = this.collection; + const map = this.map; + const reduce = this.reduce; + let options = this.options; + + let mapCommandHash = { + mapReduce: coll.collectionName, + map: map, + reduce: reduce + }; + + // Add any other options passed in + for (let n in options) { + if ('scope' === n) { + mapCommandHash[n] = processScope(options[n]); + } else { + // Only include if not in exclusion list + if (exclusionList.indexOf(n) === -1) { + mapCommandHash[n] = options[n]; + } + } + } + + options = Object.assign({}, options); + + // Ensure we have the right read preference inheritance + options.readPreference = ReadPreference.resolve(coll, options); + + // If we have a read preference and inline is not set as output fail hard + if ( + options.readPreference !== false && + options.readPreference !== 'primary' && + options['out'] && + options['out'].inline !== 1 && + options['out'] !== 'inline' + ) { + // Force readPreference to primary + options.readPreference = 'primary'; + // Decorate command with writeConcern if supported + applyWriteConcern(mapCommandHash, { db: coll.s.db, collection: coll }, options); + } else { + decorateWithReadConcern(mapCommandHash, coll, options); + } + + // Is bypassDocumentValidation specified + if (options.bypassDocumentValidation === true) { + mapCommandHash.bypassDocumentValidation = options.bypassDocumentValidation; + } + + // Have we specified collation + try { + decorateWithCollation(mapCommandHash, coll, options); + } catch (err) { + return callback(err, null); + } + + if (this.explain) { + if (maxWireVersion(coll.s.topology) < 9) { + callback(new MongoError(`server does not support explain on mapReduce`)); + return; + } + mapCommandHash = decorateWithExplain(mapCommandHash, this.explain); + } + + // Execute command + executeCommand(coll.s.db, mapCommandHash, options, (err, result) => { + if (err) return handleCallback(callback, err); + // Check if we have an error + if (1 !== result.ok || result.err || result.errmsg) { + return handleCallback(callback, toError(result)); + } + + // If an explain operation was executed, don't process the server results + if (this.explain) return callback(undefined, result); + + // Create statistics value + const stats = {}; + if (result.timeMillis) stats['processtime'] = result.timeMillis; + if (result.counts) stats['counts'] = result.counts; + if (result.timing) stats['timing'] = result.timing; + + // invoked with inline? + if (result.results) { + // If we wish for no verbosity + if (options['verbose'] == null || !options['verbose']) { + return handleCallback(callback, null, result.results); + } + + return handleCallback(callback, null, { results: result.results, stats: stats }); + } + + // The returned collection + let collection = null; + + // If we have an object it's a different db + if (result.result != null && typeof result.result === 'object') { + const doc = result.result; + // Return a collection from another db + let Db = loadDb(); + collection = new Db(doc.db, coll.s.db.s.topology, coll.s.db.s.options).collection( + doc.collection + ); + } else { + // Create a collection object that wraps the result collection + collection = coll.s.db.collection(result.result); + } + + // If we wish for no verbosity + if (options['verbose'] == null || !options['verbose']) { + return handleCallback(callback, err, collection); + } + + // Return stats as third set of values + handleCallback(callback, err, { collection: collection, stats: stats }); + }); + } +} + +/** + * Functions that are passed as scope args must + * be converted to Code instances. + * @ignore + */ +function processScope(scope) { + if (!isObject(scope) || scope._bsontype === 'ObjectID') { + return scope; + } + + const keys = Object.keys(scope); + let key; + const new_scope = {}; + + for (let i = keys.length - 1; i >= 0; i--) { + key = keys[i]; + if ('function' === typeof scope[key]) { + new_scope[key] = new Code(String(scope[key])); + } else { + new_scope[key] = processScope(scope[key]); + } + } + + return new_scope; +} + +defineAspects(MapReduceOperation, [Aspect.EXPLAINABLE]); + +module.exports = MapReduceOperation; diff --git a/node_modules/mongodb/lib/operations/operation.js b/node_modules/mongodb/lib/operations/operation.js new file mode 100644 index 00000000..a8c86fbb --- /dev/null +++ b/node_modules/mongodb/lib/operations/operation.js @@ -0,0 +1,76 @@ +'use strict'; + +const Explain = require('../explain').Explain; +const MongoError = require('../core').MongoError; + +const Aspect = { + READ_OPERATION: Symbol('READ_OPERATION'), + WRITE_OPERATION: Symbol('WRITE_OPERATION'), + RETRYABLE: Symbol('RETRYABLE'), + EXECUTE_WITH_SELECTION: Symbol('EXECUTE_WITH_SELECTION'), + NO_INHERIT_OPTIONS: Symbol('NO_INHERIT_OPTIONS'), + EXPLAINABLE: Symbol('EXPLAINABLE') +}; + +/** + * This class acts as a parent class for any operation and is responsible for setting this.options, + * as well as setting and getting a session. + * Additionally, this class implements `hasAspect`, which determines whether an operation has + * a specific aspect. + */ +class OperationBase { + constructor(options) { + this.options = Object.assign({}, options); + + if (this.hasAspect(Aspect.EXPLAINABLE)) { + this.explain = Explain.fromOptions(options); + } else if (this.options.explain !== undefined) { + throw new MongoError(`explain is not supported on this command`); + } + } + + hasAspect(aspect) { + if (this.constructor.aspects == null) { + return false; + } + return this.constructor.aspects.has(aspect); + } + + set session(session) { + Object.assign(this.options, { session }); + } + + get session() { + return this.options.session; + } + + clearSession() { + delete this.options.session; + } + + get canRetryRead() { + return true; + } + + execute() { + throw new TypeError('`execute` must be implemented for OperationBase subclasses'); + } +} + +function defineAspects(operation, aspects) { + if (!Array.isArray(aspects) && !(aspects instanceof Set)) { + aspects = [aspects]; + } + aspects = new Set(aspects); + Object.defineProperty(operation, 'aspects', { + value: aspects, + writable: false + }); + return aspects; +} + +module.exports = { + Aspect, + defineAspects, + OperationBase +}; diff --git a/node_modules/mongodb/lib/operations/options_operation.js b/node_modules/mongodb/lib/operations/options_operation.js new file mode 100644 index 00000000..9a739a51 --- /dev/null +++ b/node_modules/mongodb/lib/operations/options_operation.js @@ -0,0 +1,32 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const handleCallback = require('../utils').handleCallback; +const MongoError = require('../core').MongoError; + +class OptionsOperation extends OperationBase { + constructor(collection, options) { + super(options); + + this.collection = collection; + } + + execute(callback) { + const coll = this.collection; + const opts = this.options; + + coll.s.db.listCollections({ name: coll.collectionName }, opts).toArray((err, collections) => { + if (err) return handleCallback(callback, err); + if (collections.length === 0) { + return handleCallback( + callback, + MongoError.create({ message: `collection ${coll.namespace} not found`, driver: true }) + ); + } + + handleCallback(callback, err, collections[0].options || null); + }); + } +} + +module.exports = OptionsOperation; diff --git a/node_modules/mongodb/lib/operations/profiling_level.js b/node_modules/mongodb/lib/operations/profiling_level.js new file mode 100644 index 00000000..3f7639b4 --- /dev/null +++ b/node_modules/mongodb/lib/operations/profiling_level.js @@ -0,0 +1,31 @@ +'use strict'; + +const CommandOperation = require('./command'); + +class ProfilingLevelOperation extends CommandOperation { + constructor(db, command, options) { + super(db, options); + } + + _buildCommand() { + const command = { profile: -1 }; + + return command; + } + + execute(callback) { + super.execute((err, doc) => { + if (err == null && doc.ok === 1) { + const was = doc.was; + if (was === 0) return callback(null, 'off'); + if (was === 1) return callback(null, 'slow_only'); + if (was === 2) return callback(null, 'all'); + return callback(new Error('Error: illegal profiling level value ' + was), null); + } else { + err != null ? callback(err, null) : callback(new Error('Error with profile command'), null); + } + }); + } +} + +module.exports = ProfilingLevelOperation; diff --git a/node_modules/mongodb/lib/operations/re_index.js b/node_modules/mongodb/lib/operations/re_index.js new file mode 100644 index 00000000..dc445222 --- /dev/null +++ b/node_modules/mongodb/lib/operations/re_index.js @@ -0,0 +1,33 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; +const CommandOperationV2 = require('./command_v2'); +const serverType = require('../core/sdam/common').serverType; +const ServerType = require('../core/sdam/common').ServerType; +const MongoError = require('../core').MongoError; + +class ReIndexOperation extends CommandOperationV2 { + constructor(collection, options) { + super(collection, options); + this.collectionName = collection.collectionName; + } + + execute(server, callback) { + if (serverType(server) !== ServerType.Standalone) { + callback(new MongoError(`reIndex can only be executed on standalone servers.`)); + return; + } + super.executeCommand(server, { reIndex: this.collectionName }, (err, result) => { + if (err) { + callback(err); + return; + } + callback(null, !!result.ok); + }); + } +} + +defineAspects(ReIndexOperation, [Aspect.EXECUTE_WITH_SELECTION]); + +module.exports = ReIndexOperation; diff --git a/node_modules/mongodb/lib/operations/remove_user.js b/node_modules/mongodb/lib/operations/remove_user.js new file mode 100644 index 00000000..9e8376b1 --- /dev/null +++ b/node_modules/mongodb/lib/operations/remove_user.js @@ -0,0 +1,52 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const CommandOperation = require('./command'); +const defineAspects = require('./operation').defineAspects; +const handleCallback = require('../utils').handleCallback; +const WriteConcern = require('../write_concern'); + +class RemoveUserOperation extends CommandOperation { + constructor(db, username, options) { + const commandOptions = {}; + + const writeConcern = WriteConcern.fromOptions(options); + if (writeConcern != null) { + commandOptions.writeConcern = writeConcern; + } + + if (options.dbName) { + commandOptions.dbName = options.dbName; + } + + // Add maxTimeMS to options if set + if (typeof options.maxTimeMS === 'number') { + commandOptions.maxTimeMS = options.maxTimeMS; + } + + super(db, commandOptions); + + this.username = username; + } + + _buildCommand() { + const username = this.username; + + // Build the command to execute + const command = { dropUser: username }; + + return command; + } + + execute(callback) { + // Attempt to execute command + super.execute((err, result) => { + if (err) return handleCallback(callback, err, null); + handleCallback(callback, err, result.ok ? true : false); + }); + } +} + +defineAspects(RemoveUserOperation, Aspect.WRITE_OPERATION); + +module.exports = RemoveUserOperation; diff --git a/node_modules/mongodb/lib/operations/rename.js b/node_modules/mongodb/lib/operations/rename.js new file mode 100644 index 00000000..8098fe6b --- /dev/null +++ b/node_modules/mongodb/lib/operations/rename.js @@ -0,0 +1,61 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const applyWriteConcern = require('../utils').applyWriteConcern; +const checkCollectionName = require('../utils').checkCollectionName; +const executeDbAdminCommand = require('./db_ops').executeDbAdminCommand; +const handleCallback = require('../utils').handleCallback; +const loadCollection = require('../dynamic_loaders').loadCollection; +const toError = require('../utils').toError; + +class RenameOperation extends OperationBase { + constructor(collection, newName, options) { + super(options); + + this.collection = collection; + this.newName = newName; + } + + execute(callback) { + const coll = this.collection; + const newName = this.newName; + const options = this.options; + + let Collection = loadCollection(); + // Check the collection name + checkCollectionName(newName); + // Build the command + const renameCollection = coll.namespace; + const toCollection = coll.s.namespace.withCollection(newName).toString(); + const dropTarget = typeof options.dropTarget === 'boolean' ? options.dropTarget : false; + const cmd = { renameCollection: renameCollection, to: toCollection, dropTarget: dropTarget }; + + // Decorate command with writeConcern if supported + applyWriteConcern(cmd, { db: coll.s.db, collection: coll }, options); + + // Execute against admin + executeDbAdminCommand(coll.s.db.admin().s.db, cmd, options, (err, doc) => { + if (err) return handleCallback(callback, err, null); + // We have an error + if (doc.errmsg) return handleCallback(callback, toError(doc), null); + try { + return handleCallback( + callback, + null, + new Collection( + coll.s.db, + coll.s.topology, + coll.s.namespace.db, + newName, + coll.s.pkFactory, + coll.s.options + ) + ); + } catch (err) { + return handleCallback(callback, toError(err), null); + } + }); + } +} + +module.exports = RenameOperation; diff --git a/node_modules/mongodb/lib/operations/replace_one.js b/node_modules/mongodb/lib/operations/replace_one.js new file mode 100644 index 00000000..93ec0ef3 --- /dev/null +++ b/node_modules/mongodb/lib/operations/replace_one.js @@ -0,0 +1,54 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const updateDocuments = require('./common_functions').updateDocuments; +const hasAtomicOperators = require('../utils').hasAtomicOperators; + +class ReplaceOneOperation extends OperationBase { + constructor(collection, filter, replacement, options) { + super(options); + + if (hasAtomicOperators(replacement)) { + throw new TypeError('Replacement document must not contain atomic operators'); + } + + this.collection = collection; + this.filter = filter; + this.replacement = replacement; + } + + execute(callback) { + const coll = this.collection; + const filter = this.filter; + const replacement = this.replacement; + const options = this.options; + + // Set single document update + options.multi = false; + + // Execute update + updateDocuments(coll, filter, replacement, options, (err, r) => + replaceCallback(err, r, replacement, callback) + ); + } +} + +function replaceCallback(err, r, doc, callback) { + if (callback == null) return; + if (err && callback) return callback(err); + if (r == null) return callback(null, { result: { ok: 1 } }); + + r.modifiedCount = r.result.nModified != null ? r.result.nModified : r.result.n; + r.upsertedId = + Array.isArray(r.result.upserted) && r.result.upserted.length > 0 + ? r.result.upserted[0] // FIXME(major): should be `r.result.upserted[0]._id` + : null; + r.upsertedCount = + Array.isArray(r.result.upserted) && r.result.upserted.length ? r.result.upserted.length : 0; + r.matchedCount = + Array.isArray(r.result.upserted) && r.result.upserted.length > 0 ? 0 : r.result.n; + r.ops = [doc]; // TODO: Should we still have this? + if (callback) callback(null, r); +} + +module.exports = ReplaceOneOperation; diff --git a/node_modules/mongodb/lib/operations/run_command.js b/node_modules/mongodb/lib/operations/run_command.js new file mode 100644 index 00000000..5525ba2a --- /dev/null +++ b/node_modules/mongodb/lib/operations/run_command.js @@ -0,0 +1,19 @@ +'use strict'; + +const CommandOperationV2 = require('./command_v2'); +const defineAspects = require('./operation').defineAspects; +const Aspect = require('./operation').Aspect; + +class RunCommandOperation extends CommandOperationV2 { + constructor(parent, command, options) { + super(parent, options); + this.command = command; + } + execute(server, callback) { + const command = this.command; + this.executeCommand(server, command, callback); + } +} +defineAspects(RunCommandOperation, [Aspect.EXECUTE_WITH_SELECTION, Aspect.NO_INHERIT_OPTIONS]); + +module.exports = RunCommandOperation; diff --git a/node_modules/mongodb/lib/operations/set_profiling_level.js b/node_modules/mongodb/lib/operations/set_profiling_level.js new file mode 100644 index 00000000..b31cc130 --- /dev/null +++ b/node_modules/mongodb/lib/operations/set_profiling_level.js @@ -0,0 +1,48 @@ +'use strict'; + +const CommandOperation = require('./command'); +const levelValues = new Set(['off', 'slow_only', 'all']); + +class SetProfilingLevelOperation extends CommandOperation { + constructor(db, level, options) { + let profile = 0; + + if (level === 'off') { + profile = 0; + } else if (level === 'slow_only') { + profile = 1; + } else if (level === 'all') { + profile = 2; + } + + super(db, options); + this.level = level; + this.profile = profile; + } + + _buildCommand() { + const profile = this.profile; + + // Set up the profile number + const command = { profile }; + + return command; + } + + execute(callback) { + const level = this.level; + + if (!levelValues.has(level)) { + return callback(new Error('Error: illegal profiling level value ' + level)); + } + + super.execute((err, doc) => { + if (err == null && doc.ok === 1) return callback(null, level); + return err != null + ? callback(err, null) + : callback(new Error('Error with profile command'), null); + }); + } +} + +module.exports = SetProfilingLevelOperation; diff --git a/node_modules/mongodb/lib/operations/stats.js b/node_modules/mongodb/lib/operations/stats.js new file mode 100644 index 00000000..ff79126e --- /dev/null +++ b/node_modules/mongodb/lib/operations/stats.js @@ -0,0 +1,45 @@ +'use strict'; + +const Aspect = require('./operation').Aspect; +const CommandOperation = require('./command'); +const defineAspects = require('./operation').defineAspects; + +/** + * Get all the collection statistics. + * + * @class + * @property {Collection} a Collection instance. + * @property {object} [options] Optional settings. See Collection.prototype.stats for a list of options. + */ +class StatsOperation extends CommandOperation { + /** + * Construct a Stats operation. + * + * @param {Collection} a Collection instance. + * @param {object} [options] Optional settings. See Collection.prototype.stats for a list of options. + */ + constructor(collection, options) { + super(collection.s.db, options, collection); + } + + _buildCommand() { + const collection = this.collection; + const options = this.options; + + // Build command object + const command = { + collStats: collection.collectionName + }; + + // Check if we have the scale value + if (options['scale'] != null) { + command['scale'] = options['scale']; + } + + return command; + } +} + +defineAspects(StatsOperation, Aspect.READ_OPERATION); + +module.exports = StatsOperation; diff --git a/node_modules/mongodb/lib/operations/update_many.js b/node_modules/mongodb/lib/operations/update_many.js new file mode 100644 index 00000000..6d2252d3 --- /dev/null +++ b/node_modules/mongodb/lib/operations/update_many.js @@ -0,0 +1,55 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const updateDocuments = require('./common_functions').updateDocuments; +const hasAtomicOperators = require('../utils').hasAtomicOperators; +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; + +class UpdateManyOperation extends OperationBase { + constructor(collection, filter, update, options) { + super(options); + + if (!hasAtomicOperators(update)) { + throw new TypeError('Update document requires atomic operators'); + } + + this.collection = collection; + this.filter = filter; + this.update = update; + } + + execute(callback) { + const coll = this.collection; + const filter = this.filter; + const update = this.update; + const options = this.options; + + // Set single document update + options.multi = true; + // Execute update + updateDocuments(coll, filter, update, options, (err, r) => { + if (callback == null) return; + if (err) return callback(err); + if (r == null) return callback(null, { result: { ok: 1 } }); + + // If an explain operation was executed, don't process the server results + if (this.explain) return callback(undefined, r.result); + + r.modifiedCount = r.result.nModified != null ? r.result.nModified : r.result.n; + r.upsertedId = + Array.isArray(r.result.upserted) && r.result.upserted.length > 0 + ? r.result.upserted[0] // FIXME(major): should be `r.result.upserted[0]._id` + : null; + r.upsertedCount = + Array.isArray(r.result.upserted) && r.result.upserted.length ? r.result.upserted.length : 0; + r.matchedCount = + Array.isArray(r.result.upserted) && r.result.upserted.length > 0 ? 0 : r.result.n; + callback(null, r); + }); + } +} + +defineAspects(UpdateManyOperation, [Aspect.EXPLAINABLE]); + +module.exports = UpdateManyOperation; diff --git a/node_modules/mongodb/lib/operations/update_one.js b/node_modules/mongodb/lib/operations/update_one.js new file mode 100644 index 00000000..e05cb93a --- /dev/null +++ b/node_modules/mongodb/lib/operations/update_one.js @@ -0,0 +1,55 @@ +'use strict'; + +const OperationBase = require('./operation').OperationBase; +const updateDocuments = require('./common_functions').updateDocuments; +const hasAtomicOperators = require('../utils').hasAtomicOperators; +const Aspect = require('./operation').Aspect; +const defineAspects = require('./operation').defineAspects; + +class UpdateOneOperation extends OperationBase { + constructor(collection, filter, update, options) { + super(options); + + if (!hasAtomicOperators(update)) { + throw new TypeError('Update document requires atomic operators'); + } + + this.collection = collection; + this.filter = filter; + this.update = update; + } + + execute(callback) { + const coll = this.collection; + const filter = this.filter; + const update = this.update; + const options = this.options; + + // Set single document update + options.multi = false; + // Execute update + updateDocuments(coll, filter, update, options, (err, r) => { + if (callback == null) return; + if (err) return callback(err); + if (r == null) return callback(null, { result: { ok: 1 } }); + + // If an explain operation was executed, don't process the server results + if (this.explain) return callback(undefined, r.result); + + r.modifiedCount = r.result.nModified != null ? r.result.nModified : r.result.n; + r.upsertedId = + Array.isArray(r.result.upserted) && r.result.upserted.length > 0 + ? r.result.upserted[0] // FIXME(major): should be `r.result.upserted[0]._id` + : null; + r.upsertedCount = + Array.isArray(r.result.upserted) && r.result.upserted.length ? r.result.upserted.length : 0; + r.matchedCount = + Array.isArray(r.result.upserted) && r.result.upserted.length > 0 ? 0 : r.result.n; + callback(null, r); + }); + } +} + +defineAspects(UpdateOneOperation, [Aspect.EXPLAINABLE]); + +module.exports = UpdateOneOperation; diff --git a/node_modules/mongodb/lib/operations/validate_collection.js b/node_modules/mongodb/lib/operations/validate_collection.js new file mode 100644 index 00000000..bc16cd22 --- /dev/null +++ b/node_modules/mongodb/lib/operations/validate_collection.js @@ -0,0 +1,39 @@ +'use strict'; + +const CommandOperation = require('./command'); + +class ValidateCollectionOperation extends CommandOperation { + constructor(admin, collectionName, options) { + // Decorate command with extra options + let command = { validate: collectionName }; + const keys = Object.keys(options); + for (let i = 0; i < keys.length; i++) { + if (Object.prototype.hasOwnProperty.call(options, keys[i]) && keys[i] !== 'session') { + command[keys[i]] = options[keys[i]]; + } + } + + super(admin.s.db, options, null, command); + this.collectionName = collectionName; + } + + execute(callback) { + const collectionName = this.collectionName; + + super.execute((err, doc) => { + if (err != null) return callback(err, null); + + if (doc.ok === 0) return callback(new Error('Error with validate command'), null); + if (doc.result != null && doc.result.constructor !== String) + return callback(new Error('Error with validation data'), null); + if (doc.result != null && doc.result.match(/exception|corrupt/) != null) + return callback(new Error('Error: invalid collection ' + collectionName), null); + if (doc.valid != null && !doc.valid) + return callback(new Error('Error: invalid collection ' + collectionName), null); + + return callback(null, doc); + }); + } +} + +module.exports = ValidateCollectionOperation; diff --git a/node_modules/mongodb/lib/read_concern.js b/node_modules/mongodb/lib/read_concern.js new file mode 100644 index 00000000..b48b8e0e --- /dev/null +++ b/node_modules/mongodb/lib/read_concern.js @@ -0,0 +1,61 @@ +'use strict'; + +/** + * The **ReadConcern** class is a class that represents a MongoDB ReadConcern. + * @class + * @property {string} level The read concern level + * @see https://docs.mongodb.com/manual/reference/read-concern/index.html + */ +class ReadConcern { + /** + * Constructs a ReadConcern from the read concern properties. + * @param {string} [level] The read concern level ({'local'|'available'|'majority'|'linearizable'|'snapshot'}) + */ + constructor(level) { + if (level != null) { + this.level = level; + } + } + + /** + * Construct a ReadConcern given an options object. + * + * @param {object} options The options object from which to extract the write concern. + * @return {ReadConcern} + */ + static fromOptions(options) { + if (options == null) { + return; + } + + if (options.readConcern) { + if (options.readConcern instanceof ReadConcern) { + return options.readConcern; + } + + return new ReadConcern(options.readConcern.level); + } + + if (options.level) { + return new ReadConcern(options.level); + } + } + + static get MAJORITY() { + return 'majority'; + } + + static get AVAILABLE() { + return 'available'; + } + + static get LINEARIZABLE() { + return 'linearizable'; + } + + static get SNAPSHOT() { + return 'snapshot'; + } +} + +module.exports = ReadConcern; diff --git a/node_modules/mongodb/lib/topologies/mongos.js b/node_modules/mongodb/lib/topologies/mongos.js new file mode 100644 index 00000000..bf30d20e --- /dev/null +++ b/node_modules/mongodb/lib/topologies/mongos.js @@ -0,0 +1,445 @@ +'use strict'; + +const TopologyBase = require('./topology_base').TopologyBase; +const MongoError = require('../core').MongoError; +const CMongos = require('../core').Mongos; +const Cursor = require('../cursor'); +const Server = require('./server'); +const Store = require('./topology_base').Store; +const MAX_JS_INT = require('../utils').MAX_JS_INT; +const translateOptions = require('../utils').translateOptions; +const filterOptions = require('../utils').filterOptions; +const mergeOptions = require('../utils').mergeOptions; + +/** + * @fileOverview The **Mongos** class is a class that represents a Mongos Proxy topology and is + * used to construct connections. + * + * **Mongos Should not be used, use MongoClient.connect** + */ + +// Allowed parameters +var legalOptionNames = [ + 'ha', + 'haInterval', + 'acceptableLatencyMS', + 'poolSize', + 'ssl', + 'checkServerIdentity', + 'sslValidate', + 'sslCA', + 'sslCRL', + 'sslCert', + 'ciphers', + 'ecdhCurve', + 'sslKey', + 'sslPass', + 'socketOptions', + 'bufferMaxEntries', + 'store', + 'auto_reconnect', + 'autoReconnect', + 'emitError', + 'keepAlive', + 'keepAliveInitialDelay', + 'noDelay', + 'connectTimeoutMS', + 'socketTimeoutMS', + 'loggerLevel', + 'logger', + 'reconnectTries', + 'appname', + 'domainsEnabled', + 'servername', + 'promoteLongs', + 'promoteValues', + 'promoteBuffers', + 'promiseLibrary', + 'monitorCommands' +]; + +/** + * Creates a new Mongos instance + * @class + * @deprecated + * @param {Server[]} servers A seedlist of servers participating in the replicaset. + * @param {object} [options] Optional settings. + * @param {booelan} [options.ha=true] Turn on high availability monitoring. + * @param {number} [options.haInterval=5000] Time between each replicaset status check. + * @param {number} [options.poolSize=5] Number of connections in the connection pool for each server instance, set to 5 as default for legacy reasons. + * @param {number} [options.acceptableLatencyMS=15] Cutoff latency point in MS for MongoS proxy selection + * @param {boolean} [options.ssl=false] Use ssl connection (needs to have a mongod server with ssl support) + * @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function. + * @param {boolean} [options.sslValidate=false] Validate mongod server certificate against ca (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {array} [options.sslCA] Array of valid certificates either as Buffers or Strings (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {array} [options.sslCRL] Array of revocation certificates either as Buffers or Strings (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {string} [options.ciphers] Passed directly through to tls.createSecureContext. See https://nodejs.org/dist/latest-v9.x/docs/api/tls.html#tls_tls_createsecurecontext_options for more info. + * @param {string} [options.ecdhCurve] Passed directly through to tls.createSecureContext. See https://nodejs.org/dist/latest-v9.x/docs/api/tls.html#tls_tls_createsecurecontext_options for more info. + * @param {(Buffer|string)} [options.sslCert] String or buffer containing the certificate we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {(Buffer|string)} [options.sslKey] String or buffer containing the certificate private key we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {(Buffer|string)} [options.sslPass] String or buffer containing the certificate password (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {string} [options.servername] String containing the server name requested via TLS SNI. + * @param {object} [options.socketOptions] Socket options + * @param {boolean} [options.socketOptions.noDelay=true] TCP Socket NoDelay option. + * @param {boolean} [options.socketOptions.keepAlive=true] TCP Connection keep alive enabled + * @param {number} [options.socketOptions.keepAliveInitialDelay=120000] The number of milliseconds to wait before initiating keepAlive on the TCP socket + * @param {number} [options.socketOptions.connectTimeoutMS=10000] How long to wait for a connection to be established before timing out + * @param {number} [options.socketOptions.socketTimeoutMS=0] How long a send or receive on a socket can take before timing out + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. + * @param {boolean} [options.monitorCommands=false] Enable command monitoring for this topology + * @fires Mongos#connect + * @fires Mongos#ha + * @fires Mongos#joined + * @fires Mongos#left + * @fires Mongos#fullsetup + * @fires Mongos#open + * @fires Mongos#close + * @fires Mongos#error + * @fires Mongos#timeout + * @fires Mongos#parseError + * @fires Mongos#commandStarted + * @fires Mongos#commandSucceeded + * @fires Mongos#commandFailed + * @property {string} parserType the parser type used (c++ or js). + * @return {Mongos} a Mongos instance. + */ +class Mongos extends TopologyBase { + constructor(servers, options) { + super(); + + options = options || {}; + var self = this; + + // Filter the options + options = filterOptions(options, legalOptionNames); + + // Ensure all the instances are Server + for (var i = 0; i < servers.length; i++) { + if (!(servers[i] instanceof Server)) { + throw MongoError.create({ + message: 'all seed list instances must be of the Server type', + driver: true + }); + } + } + + // Stored options + var storeOptions = { + force: false, + bufferMaxEntries: + typeof options.bufferMaxEntries === 'number' ? options.bufferMaxEntries : MAX_JS_INT + }; + + // Shared global store + var store = options.store || new Store(self, storeOptions); + + // Build seed list + var seedlist = servers.map(function(x) { + return { host: x.host, port: x.port }; + }); + + // Get the reconnect option + var reconnect = typeof options.auto_reconnect === 'boolean' ? options.auto_reconnect : true; + reconnect = typeof options.autoReconnect === 'boolean' ? options.autoReconnect : reconnect; + + // Clone options + var clonedOptions = mergeOptions( + {}, + { + disconnectHandler: store, + cursorFactory: Cursor, + reconnect: reconnect, + emitError: typeof options.emitError === 'boolean' ? options.emitError : true, + size: typeof options.poolSize === 'number' ? options.poolSize : 5, + monitorCommands: + typeof options.monitorCommands === 'boolean' ? options.monitorCommands : false + } + ); + + // Translate any SSL options and other connectivity options + clonedOptions = translateOptions(clonedOptions, options); + + // Socket options + var socketOptions = + options.socketOptions && Object.keys(options.socketOptions).length > 0 + ? options.socketOptions + : options; + + // Translate all the options to the core types + clonedOptions = translateOptions(clonedOptions, socketOptions); + + // Internal state + this.s = { + // Create the Mongos + coreTopology: new CMongos(seedlist, clonedOptions), + // Server capabilities + sCapabilities: null, + // Debug turned on + debug: clonedOptions.debug, + // Store option defaults + storeOptions: storeOptions, + // Cloned options + clonedOptions: clonedOptions, + // Actual store of callbacks + store: store, + // Options + options: options, + // Server Session Pool + sessionPool: null, + // Active client sessions + sessions: new Set(), + // Promise library + promiseLibrary: options.promiseLibrary || Promise + }; + } + + // Connect + connect(_options, callback) { + var self = this; + if ('function' === typeof _options) (callback = _options), (_options = {}); + if (_options == null) _options = {}; + if (!('function' === typeof callback)) callback = null; + _options = Object.assign({}, this.s.clonedOptions, _options); + self.s.options = _options; + + // Update bufferMaxEntries + self.s.storeOptions.bufferMaxEntries = + typeof _options.bufferMaxEntries === 'number' ? _options.bufferMaxEntries : -1; + + // Error handler + var connectErrorHandler = function() { + return function(err) { + // Remove all event handlers + var events = ['timeout', 'error', 'close']; + events.forEach(function(e) { + self.removeListener(e, connectErrorHandler); + }); + + self.s.coreTopology.removeListener('connect', connectErrorHandler); + // Force close the topology + self.close(true); + + // Try to callback + try { + callback(err); + } catch (err) { + process.nextTick(function() { + throw err; + }); + } + }; + }; + + // Actual handler + var errorHandler = function(event) { + return function(err) { + if (event !== 'error') { + self.emit(event, err); + } + }; + }; + + // Error handler + var reconnectHandler = function() { + self.emit('reconnect'); + self.s.store.execute(); + }; + + // relay the event + var relay = function(event) { + return function(t, server) { + self.emit(event, t, server); + }; + }; + + // Connect handler + var connectHandler = function() { + // Clear out all the current handlers left over + var events = ['timeout', 'error', 'close', 'fullsetup']; + events.forEach(function(e) { + self.s.coreTopology.removeAllListeners(e); + }); + + // Set up listeners + self.s.coreTopology.on('timeout', errorHandler('timeout')); + self.s.coreTopology.on('error', errorHandler('error')); + self.s.coreTopology.on('close', errorHandler('close')); + + // Set up serverConfig listeners + self.s.coreTopology.on('fullsetup', function() { + self.emit('fullsetup', self); + }); + + // Emit open event + self.emit('open', null, self); + + // Return correctly + try { + callback(null, self); + } catch (err) { + process.nextTick(function() { + throw err; + }); + } + }; + + // Clear out all the current handlers left over + var events = [ + 'timeout', + 'error', + 'close', + 'serverOpening', + 'serverDescriptionChanged', + 'serverHeartbeatStarted', + 'serverHeartbeatSucceeded', + 'serverHeartbeatFailed', + 'serverClosed', + 'topologyOpening', + 'topologyClosed', + 'topologyDescriptionChanged', + 'commandStarted', + 'commandSucceeded', + 'commandFailed' + ]; + events.forEach(function(e) { + self.s.coreTopology.removeAllListeners(e); + }); + + // Set up SDAM listeners + self.s.coreTopology.on('serverDescriptionChanged', relay('serverDescriptionChanged')); + self.s.coreTopology.on('serverHeartbeatStarted', relay('serverHeartbeatStarted')); + self.s.coreTopology.on('serverHeartbeatSucceeded', relay('serverHeartbeatSucceeded')); + self.s.coreTopology.on('serverHeartbeatFailed', relay('serverHeartbeatFailed')); + self.s.coreTopology.on('serverOpening', relay('serverOpening')); + self.s.coreTopology.on('serverClosed', relay('serverClosed')); + self.s.coreTopology.on('topologyOpening', relay('topologyOpening')); + self.s.coreTopology.on('topologyClosed', relay('topologyClosed')); + self.s.coreTopology.on('topologyDescriptionChanged', relay('topologyDescriptionChanged')); + self.s.coreTopology.on('commandStarted', relay('commandStarted')); + self.s.coreTopology.on('commandSucceeded', relay('commandSucceeded')); + self.s.coreTopology.on('commandFailed', relay('commandFailed')); + + // Set up listeners + self.s.coreTopology.once('timeout', connectErrorHandler('timeout')); + self.s.coreTopology.once('error', connectErrorHandler('error')); + self.s.coreTopology.once('close', connectErrorHandler('close')); + self.s.coreTopology.once('connect', connectHandler); + // Join and leave events + self.s.coreTopology.on('joined', relay('joined')); + self.s.coreTopology.on('left', relay('left')); + + // Reconnect server + self.s.coreTopology.on('reconnect', reconnectHandler); + + // Start connection + self.s.coreTopology.connect(_options); + } +} + +Object.defineProperty(Mongos.prototype, 'haInterval', { + enumerable: true, + get: function() { + return this.s.coreTopology.s.haInterval; + } +}); + +/** + * A mongos connect event, used to verify that the connection is up and running + * + * @event Mongos#connect + * @type {Mongos} + */ + +/** + * The mongos high availability event + * + * @event Mongos#ha + * @type {function} + * @param {string} type The stage in the high availability event (start|end) + * @param {boolean} data.norepeat This is a repeating high availability process or a single execution only + * @param {number} data.id The id for this high availability request + * @param {object} data.state An object containing the information about the current replicaset + */ + +/** + * A server member left the mongos set + * + * @event Mongos#left + * @type {function} + * @param {string} type The type of member that left (primary|secondary|arbiter) + * @param {Server} server The server object that left + */ + +/** + * A server member joined the mongos set + * + * @event Mongos#joined + * @type {function} + * @param {string} type The type of member that joined (primary|secondary|arbiter) + * @param {Server} server The server object that joined + */ + +/** + * Mongos fullsetup event, emitted when all proxies in the topology have been connected to. + * + * @event Mongos#fullsetup + * @type {Mongos} + */ + +/** + * Mongos open event, emitted when mongos can start processing commands. + * + * @event Mongos#open + * @type {Mongos} + */ + +/** + * Mongos close event + * + * @event Mongos#close + * @type {object} + */ + +/** + * Mongos error event, emitted if there is an error listener. + * + * @event Mongos#error + * @type {MongoError} + */ + +/** + * Mongos timeout event + * + * @event Mongos#timeout + * @type {object} + */ + +/** + * Mongos parseError event + * + * @event Mongos#parseError + * @type {object} + */ + +/** + * An event emitted indicating a command was started, if command monitoring is enabled + * + * @event Mongos#commandStarted + * @type {object} + */ + +/** + * An event emitted indicating a command succeeded, if command monitoring is enabled + * + * @event Mongos#commandSucceeded + * @type {object} + */ + +/** + * An event emitted indicating a command failed, if command monitoring is enabled + * + * @event Mongos#commandFailed + * @type {object} + */ + +module.exports = Mongos; diff --git a/node_modules/mongodb/lib/topologies/native_topology.js b/node_modules/mongodb/lib/topologies/native_topology.js new file mode 100644 index 00000000..cb7d91dc --- /dev/null +++ b/node_modules/mongodb/lib/topologies/native_topology.js @@ -0,0 +1,78 @@ +'use strict'; + +const Topology = require('../core').Topology; +const ServerCapabilities = require('./topology_base').ServerCapabilities; +const Cursor = require('../cursor'); +const translateOptions = require('../utils').translateOptions; + +class NativeTopology extends Topology { + constructor(servers, options) { + options = options || {}; + + let clonedOptions = Object.assign( + {}, + { + cursorFactory: Cursor, + reconnect: false, + emitError: typeof options.emitError === 'boolean' ? options.emitError : true, + maxPoolSize: + typeof options.maxPoolSize === 'number' + ? options.maxPoolSize + : typeof options.poolSize === 'number' + ? options.poolSize + : 10, + minPoolSize: + typeof options.minPoolSize === 'number' + ? options.minPoolSize + : typeof options.minSize === 'number' + ? options.minSize + : 0, + monitorCommands: + typeof options.monitorCommands === 'boolean' ? options.monitorCommands : false + } + ); + + // Translate any SSL options and other connectivity options + clonedOptions = translateOptions(clonedOptions, options); + + // Socket options + var socketOptions = + options.socketOptions && Object.keys(options.socketOptions).length > 0 + ? options.socketOptions + : options; + + // Translate all the options to the core types + clonedOptions = translateOptions(clonedOptions, socketOptions); + + super(servers, clonedOptions); + } + + capabilities() { + if (this.s.sCapabilities) return this.s.sCapabilities; + if (this.lastIsMaster() == null) return null; + this.s.sCapabilities = new ServerCapabilities(this.lastIsMaster()); + return this.s.sCapabilities; + } + + // Command + command(ns, cmd, options, callback) { + super.command(ns.toString(), cmd, options, callback); + } + + // Insert + insert(ns, ops, options, callback) { + super.insert(ns.toString(), ops, options, callback); + } + + // Update + update(ns, ops, options, callback) { + super.update(ns.toString(), ops, options, callback); + } + + // Remove + remove(ns, ops, options, callback) { + super.remove(ns.toString(), ops, options, callback); + } +} + +module.exports = NativeTopology; diff --git a/node_modules/mongodb/lib/topologies/replset.js b/node_modules/mongodb/lib/topologies/replset.js new file mode 100644 index 00000000..80701f5d --- /dev/null +++ b/node_modules/mongodb/lib/topologies/replset.js @@ -0,0 +1,489 @@ +'use strict'; + +const Server = require('./server'); +const Cursor = require('../cursor'); +const MongoError = require('../core').MongoError; +const TopologyBase = require('./topology_base').TopologyBase; +const Store = require('./topology_base').Store; +const CReplSet = require('../core').ReplSet; +const MAX_JS_INT = require('../utils').MAX_JS_INT; +const translateOptions = require('../utils').translateOptions; +const filterOptions = require('../utils').filterOptions; +const mergeOptions = require('../utils').mergeOptions; + +/** + * @fileOverview The **ReplSet** class is a class that represents a Replicaset topology and is + * used to construct connections. + * + * **ReplSet Should not be used, use MongoClient.connect** + */ + +// Allowed parameters +var legalOptionNames = [ + 'ha', + 'haInterval', + 'replicaSet', + 'rs_name', + 'secondaryAcceptableLatencyMS', + 'connectWithNoPrimary', + 'poolSize', + 'ssl', + 'checkServerIdentity', + 'sslValidate', + 'sslCA', + 'sslCert', + 'ciphers', + 'ecdhCurve', + 'sslCRL', + 'sslKey', + 'sslPass', + 'socketOptions', + 'bufferMaxEntries', + 'store', + 'auto_reconnect', + 'autoReconnect', + 'emitError', + 'keepAlive', + 'keepAliveInitialDelay', + 'noDelay', + 'connectTimeoutMS', + 'socketTimeoutMS', + 'strategy', + 'debug', + 'family', + 'loggerLevel', + 'logger', + 'reconnectTries', + 'appname', + 'domainsEnabled', + 'servername', + 'promoteLongs', + 'promoteValues', + 'promoteBuffers', + 'maxStalenessSeconds', + 'promiseLibrary', + 'minSize', + 'monitorCommands' +]; + +/** + * Creates a new ReplSet instance + * @class + * @deprecated + * @param {Server[]} servers A seedlist of servers participating in the replicaset. + * @param {object} [options] Optional settings. + * @param {boolean} [options.ha=true] Turn on high availability monitoring. + * @param {number} [options.haInterval=10000] Time between each replicaset status check. + * @param {string} [options.replicaSet] The name of the replicaset to connect to. + * @param {number} [options.secondaryAcceptableLatencyMS=15] Sets the range of servers to pick when using NEAREST (lowest ping ms + the latency fence, ex: range of 1 to (1 + 15) ms) + * @param {boolean} [options.connectWithNoPrimary=false] Sets if the driver should connect even if no primary is available + * @param {number} [options.poolSize=5] Number of connections in the connection pool for each server instance, set to 5 as default for legacy reasons. + * @param {boolean} [options.ssl=false] Use ssl connection (needs to have a mongod server with ssl support) + * @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function. + * @param {boolean} [options.sslValidate=false] Validate mongod server certificate against ca (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {array} [options.sslCA] Array of valid certificates either as Buffers or Strings (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {array} [options.sslCRL] Array of revocation certificates either as Buffers or Strings (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {(Buffer|string)} [options.sslCert] String or buffer containing the certificate we wish to present (needs to have a mongod server with ssl support, 2.4 or higher. + * @param {string} [options.ciphers] Passed directly through to tls.createSecureContext. See https://nodejs.org/dist/latest-v9.x/docs/api/tls.html#tls_tls_createsecurecontext_options for more info. + * @param {string} [options.ecdhCurve] Passed directly through to tls.createSecureContext. See https://nodejs.org/dist/latest-v9.x/docs/api/tls.html#tls_tls_createsecurecontext_options for more info. + * @param {(Buffer|string)} [options.sslKey] String or buffer containing the certificate private key we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {(Buffer|string)} [options.sslPass] String or buffer containing the certificate password (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {string} [options.servername] String containing the server name requested via TLS SNI. + * @param {object} [options.socketOptions] Socket options + * @param {boolean} [options.socketOptions.noDelay=true] TCP Socket NoDelay option. + * @param {boolean} [options.socketOptions.keepAlive=true] TCP Connection keep alive enabled + * @param {number} [options.socketOptions.keepAliveInitialDelay=120000] The number of milliseconds to wait before initiating keepAlive on the TCP socket + * @param {number} [options.socketOptions.connectTimeoutMS=10000] How long to wait for a connection to be established before timing out + * @param {number} [options.socketOptions.socketTimeoutMS=360000] How long a send or receive on a socket can take before timing out + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. + * @param {number} [options.maxStalenessSeconds=undefined] The max staleness to secondary reads (values under 10 seconds cannot be guaranteed); + * @param {boolean} [options.monitorCommands=false] Enable command monitoring for this topology + * @fires ReplSet#connect + * @fires ReplSet#ha + * @fires ReplSet#joined + * @fires ReplSet#left + * @fires ReplSet#fullsetup + * @fires ReplSet#open + * @fires ReplSet#close + * @fires ReplSet#error + * @fires ReplSet#timeout + * @fires ReplSet#parseError + * @fires ReplSet#commandStarted + * @fires ReplSet#commandSucceeded + * @fires ReplSet#commandFailed + * @property {string} parserType the parser type used (c++ or js). + * @return {ReplSet} a ReplSet instance. + */ +class ReplSet extends TopologyBase { + constructor(servers, options) { + super(); + + options = options || {}; + var self = this; + + // Filter the options + options = filterOptions(options, legalOptionNames); + + // Ensure all the instances are Server + for (var i = 0; i < servers.length; i++) { + if (!(servers[i] instanceof Server)) { + throw MongoError.create({ + message: 'all seed list instances must be of the Server type', + driver: true + }); + } + } + + // Stored options + var storeOptions = { + force: false, + bufferMaxEntries: + typeof options.bufferMaxEntries === 'number' ? options.bufferMaxEntries : MAX_JS_INT + }; + + // Shared global store + var store = options.store || new Store(self, storeOptions); + + // Build seed list + var seedlist = servers.map(function(x) { + return { host: x.host, port: x.port }; + }); + + // Clone options + var clonedOptions = mergeOptions( + {}, + { + disconnectHandler: store, + cursorFactory: Cursor, + reconnect: false, + emitError: typeof options.emitError === 'boolean' ? options.emitError : true, + size: typeof options.poolSize === 'number' ? options.poolSize : 5, + monitorCommands: + typeof options.monitorCommands === 'boolean' ? options.monitorCommands : false + } + ); + + // Translate any SSL options and other connectivity options + clonedOptions = translateOptions(clonedOptions, options); + + // Socket options + var socketOptions = + options.socketOptions && Object.keys(options.socketOptions).length > 0 + ? options.socketOptions + : options; + + // Translate all the options to the core types + clonedOptions = translateOptions(clonedOptions, socketOptions); + + // Create the ReplSet + var coreTopology = new CReplSet(seedlist, clonedOptions); + + // Listen to reconnect event + coreTopology.on('reconnect', function() { + self.emit('reconnect'); + store.execute(); + }); + + // Internal state + this.s = { + // Replicaset + coreTopology: coreTopology, + // Server capabilities + sCapabilities: null, + // Debug tag + tag: options.tag, + // Store options + storeOptions: storeOptions, + // Cloned options + clonedOptions: clonedOptions, + // Store + store: store, + // Options + options: options, + // Server Session Pool + sessionPool: null, + // Active client sessions + sessions: new Set(), + // Promise library + promiseLibrary: options.promiseLibrary || Promise + }; + + // Debug + if (clonedOptions.debug) { + // Last ismaster + Object.defineProperty(this, 'replset', { + enumerable: true, + get: function() { + return coreTopology; + } + }); + } + } + + // Connect method + connect(_options, callback) { + var self = this; + if ('function' === typeof _options) (callback = _options), (_options = {}); + if (_options == null) _options = {}; + if (!('function' === typeof callback)) callback = null; + _options = Object.assign({}, this.s.clonedOptions, _options); + self.s.options = _options; + + // Update bufferMaxEntries + self.s.storeOptions.bufferMaxEntries = + typeof _options.bufferMaxEntries === 'number' ? _options.bufferMaxEntries : -1; + + // Actual handler + var errorHandler = function(event) { + return function(err) { + if (event !== 'error') { + self.emit(event, err); + } + }; + }; + + // Clear out all the current handlers left over + var events = [ + 'timeout', + 'error', + 'close', + 'serverOpening', + 'serverDescriptionChanged', + 'serverHeartbeatStarted', + 'serverHeartbeatSucceeded', + 'serverHeartbeatFailed', + 'serverClosed', + 'topologyOpening', + 'topologyClosed', + 'topologyDescriptionChanged', + 'commandStarted', + 'commandSucceeded', + 'commandFailed', + 'joined', + 'left', + 'ping', + 'ha' + ]; + events.forEach(function(e) { + self.s.coreTopology.removeAllListeners(e); + }); + + // relay the event + var relay = function(event) { + return function(t, server) { + self.emit(event, t, server); + }; + }; + + // Replset events relay + var replsetRelay = function(event) { + return function(t, server) { + self.emit(event, t, server.lastIsMaster(), server); + }; + }; + + // Relay ha + var relayHa = function(t, state) { + self.emit('ha', t, state); + + if (t === 'start') { + self.emit('ha_connect', t, state); + } else if (t === 'end') { + self.emit('ha_ismaster', t, state); + } + }; + + // Set up serverConfig listeners + self.s.coreTopology.on('joined', replsetRelay('joined')); + self.s.coreTopology.on('left', relay('left')); + self.s.coreTopology.on('ping', relay('ping')); + self.s.coreTopology.on('ha', relayHa); + + // Set up SDAM listeners + self.s.coreTopology.on('serverDescriptionChanged', relay('serverDescriptionChanged')); + self.s.coreTopology.on('serverHeartbeatStarted', relay('serverHeartbeatStarted')); + self.s.coreTopology.on('serverHeartbeatSucceeded', relay('serverHeartbeatSucceeded')); + self.s.coreTopology.on('serverHeartbeatFailed', relay('serverHeartbeatFailed')); + self.s.coreTopology.on('serverOpening', relay('serverOpening')); + self.s.coreTopology.on('serverClosed', relay('serverClosed')); + self.s.coreTopology.on('topologyOpening', relay('topologyOpening')); + self.s.coreTopology.on('topologyClosed', relay('topologyClosed')); + self.s.coreTopology.on('topologyDescriptionChanged', relay('topologyDescriptionChanged')); + self.s.coreTopology.on('commandStarted', relay('commandStarted')); + self.s.coreTopology.on('commandSucceeded', relay('commandSucceeded')); + self.s.coreTopology.on('commandFailed', relay('commandFailed')); + + self.s.coreTopology.on('fullsetup', function() { + self.emit('fullsetup', self, self); + }); + + self.s.coreTopology.on('all', function() { + self.emit('all', null, self); + }); + + // Connect handler + var connectHandler = function() { + // Set up listeners + self.s.coreTopology.once('timeout', errorHandler('timeout')); + self.s.coreTopology.once('error', errorHandler('error')); + self.s.coreTopology.once('close', errorHandler('close')); + + // Emit open event + self.emit('open', null, self); + + // Return correctly + try { + callback(null, self); + } catch (err) { + process.nextTick(function() { + throw err; + }); + } + }; + + // Error handler + var connectErrorHandler = function() { + return function(err) { + ['timeout', 'error', 'close'].forEach(function(e) { + self.s.coreTopology.removeListener(e, connectErrorHandler); + }); + + self.s.coreTopology.removeListener('connect', connectErrorHandler); + // Destroy the replset + self.s.coreTopology.destroy(); + + // Try to callback + try { + callback(err); + } catch (err) { + if (!self.s.coreTopology.isConnected()) + process.nextTick(function() { + throw err; + }); + } + }; + }; + + // Set up listeners + self.s.coreTopology.once('timeout', connectErrorHandler('timeout')); + self.s.coreTopology.once('error', connectErrorHandler('error')); + self.s.coreTopology.once('close', connectErrorHandler('close')); + self.s.coreTopology.once('connect', connectHandler); + + // Start connection + self.s.coreTopology.connect(_options); + } + + close(forceClosed, callback) { + ['timeout', 'error', 'close', 'joined', 'left'].forEach(e => this.removeAllListeners(e)); + super.close(forceClosed, callback); + } +} + +Object.defineProperty(ReplSet.prototype, 'haInterval', { + enumerable: true, + get: function() { + return this.s.coreTopology.s.haInterval; + } +}); + +/** + * A replset connect event, used to verify that the connection is up and running + * + * @event ReplSet#connect + * @type {ReplSet} + */ + +/** + * The replset high availability event + * + * @event ReplSet#ha + * @type {function} + * @param {string} type The stage in the high availability event (start|end) + * @param {boolean} data.norepeat This is a repeating high availability process or a single execution only + * @param {number} data.id The id for this high availability request + * @param {object} data.state An object containing the information about the current replicaset + */ + +/** + * A server member left the replicaset + * + * @event ReplSet#left + * @type {function} + * @param {string} type The type of member that left (primary|secondary|arbiter) + * @param {Server} server The server object that left + */ + +/** + * A server member joined the replicaset + * + * @event ReplSet#joined + * @type {function} + * @param {string} type The type of member that joined (primary|secondary|arbiter) + * @param {Server} server The server object that joined + */ + +/** + * ReplSet open event, emitted when replicaset can start processing commands. + * + * @event ReplSet#open + * @type {Replset} + */ + +/** + * ReplSet fullsetup event, emitted when all servers in the topology have been connected to. + * + * @event ReplSet#fullsetup + * @type {Replset} + */ + +/** + * ReplSet close event + * + * @event ReplSet#close + * @type {object} + */ + +/** + * ReplSet error event, emitted if there is an error listener. + * + * @event ReplSet#error + * @type {MongoError} + */ + +/** + * ReplSet timeout event + * + * @event ReplSet#timeout + * @type {object} + */ + +/** + * ReplSet parseError event + * + * @event ReplSet#parseError + * @type {object} + */ + +/** + * An event emitted indicating a command was started, if command monitoring is enabled + * + * @event ReplSet#commandStarted + * @type {object} + */ + +/** + * An event emitted indicating a command succeeded, if command monitoring is enabled + * + * @event ReplSet#commandSucceeded + * @type {object} + */ + +/** + * An event emitted indicating a command failed, if command monitoring is enabled + * + * @event ReplSet#commandFailed + * @type {object} + */ + +module.exports = ReplSet; diff --git a/node_modules/mongodb/lib/topologies/server.js b/node_modules/mongodb/lib/topologies/server.js new file mode 100644 index 00000000..0abaad3d --- /dev/null +++ b/node_modules/mongodb/lib/topologies/server.js @@ -0,0 +1,448 @@ +'use strict'; + +const CServer = require('../core').Server; +const Cursor = require('../cursor'); +const TopologyBase = require('./topology_base').TopologyBase; +const Store = require('./topology_base').Store; +const MongoError = require('../core').MongoError; +const MAX_JS_INT = require('../utils').MAX_JS_INT; +const translateOptions = require('../utils').translateOptions; +const filterOptions = require('../utils').filterOptions; +const mergeOptions = require('../utils').mergeOptions; + +/** + * @fileOverview The **Server** class is a class that represents a single server topology and is + * used to construct connections. + * + * **Server Should not be used, use MongoClient.connect** + */ + +// Allowed parameters +var legalOptionNames = [ + 'ha', + 'haInterval', + 'acceptableLatencyMS', + 'poolSize', + 'ssl', + 'checkServerIdentity', + 'sslValidate', + 'sslCA', + 'sslCRL', + 'sslCert', + 'ciphers', + 'ecdhCurve', + 'sslKey', + 'sslPass', + 'socketOptions', + 'bufferMaxEntries', + 'store', + 'auto_reconnect', + 'autoReconnect', + 'emitError', + 'keepAlive', + 'keepAliveInitialDelay', + 'noDelay', + 'connectTimeoutMS', + 'socketTimeoutMS', + 'family', + 'loggerLevel', + 'logger', + 'reconnectTries', + 'reconnectInterval', + 'monitoring', + 'appname', + 'domainsEnabled', + 'servername', + 'promoteLongs', + 'promoteValues', + 'promoteBuffers', + 'compression', + 'promiseLibrary', + 'monitorCommands' +]; + +/** + * Creates a new Server instance + * @class + * @deprecated + * @param {string} host The host for the server, can be either an IP4, IP6 or domain socket style host. + * @param {number} [port] The server port if IP4. + * @param {object} [options] Optional settings. + * @param {number} [options.poolSize=5] Number of connections in the connection pool for each server instance, set to 5 as default for legacy reasons. + * @param {boolean} [options.ssl=false] Use ssl connection (needs to have a mongod server with ssl support) + * @param {boolean} [options.sslValidate=false] Validate mongod server certificate against ca (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {boolean|function} [options.checkServerIdentity=true] Ensure we check server identify during SSL, set to false to disable checking. Only works for Node 0.12.x or higher. You can pass in a boolean or your own checkServerIdentity override function. + * @param {array} [options.sslCA] Array of valid certificates either as Buffers or Strings (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {array} [options.sslCRL] Array of revocation certificates either as Buffers or Strings (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {(Buffer|string)} [options.sslCert] String or buffer containing the certificate we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {string} [options.ciphers] Passed directly through to tls.createSecureContext. See https://nodejs.org/dist/latest-v9.x/docs/api/tls.html#tls_tls_createsecurecontext_options for more info. + * @param {string} [options.ecdhCurve] Passed directly through to tls.createSecureContext. See https://nodejs.org/dist/latest-v9.x/docs/api/tls.html#tls_tls_createsecurecontext_options for more info. + * @param {(Buffer|string)} [options.sslKey] String or buffer containing the certificate private key we wish to present (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {(Buffer|string)} [options.sslPass] String or buffer containing the certificate password (needs to have a mongod server with ssl support, 2.4 or higher) + * @param {string} [options.servername] String containing the server name requested via TLS SNI. + * @param {object} [options.socketOptions] Socket options + * @param {boolean} [options.socketOptions.autoReconnect=true] Reconnect on error. + * @param {boolean} [options.socketOptions.noDelay=true] TCP Socket NoDelay option. + * @param {boolean} [options.socketOptions.keepAlive=true] TCP Connection keep alive enabled + * @param {number} [options.socketOptions.keepAliveInitialDelay=120000] The number of milliseconds to wait before initiating keepAlive on the TCP socket + * @param {number} [options.socketOptions.connectTimeoutMS=10000] How long to wait for a connection to be established before timing out + * @param {number} [options.socketOptions.socketTimeoutMS=0] How long a send or receive on a socket can take before timing out + * @param {number} [options.reconnectTries=30] Server attempt to reconnect #times + * @param {number} [options.reconnectInterval=1000] Server will wait # milliseconds between retries + * @param {boolean} [options.monitoring=true] Triggers the server instance to call ismaster + * @param {number} [options.haInterval=10000] The interval of calling ismaster when monitoring is enabled. + * @param {boolean} [options.domainsEnabled=false] Enable the wrapping of the callback in the current domain, disabled by default to avoid perf hit. + * @param {boolean} [options.monitorCommands=false] Enable command monitoring for this topology + * @fires Server#connect + * @fires Server#close + * @fires Server#error + * @fires Server#timeout + * @fires Server#parseError + * @fires Server#reconnect + * @fires Server#commandStarted + * @fires Server#commandSucceeded + * @fires Server#commandFailed + * @property {string} parserType the parser type used (c++ or js). + * @return {Server} a Server instance. + */ +class Server extends TopologyBase { + constructor(host, port, options) { + super(); + var self = this; + + // Filter the options + options = filterOptions(options, legalOptionNames); + + // Promise library + const promiseLibrary = options.promiseLibrary; + + // Stored options + var storeOptions = { + force: false, + bufferMaxEntries: + typeof options.bufferMaxEntries === 'number' ? options.bufferMaxEntries : MAX_JS_INT + }; + + // Shared global store + var store = options.store || new Store(self, storeOptions); + + // Detect if we have a socket connection + if (host.indexOf('/') !== -1) { + if (port != null && typeof port === 'object') { + options = port; + port = null; + } + } else if (port == null) { + throw MongoError.create({ message: 'port must be specified', driver: true }); + } + + // Get the reconnect option + var reconnect = typeof options.auto_reconnect === 'boolean' ? options.auto_reconnect : true; + reconnect = typeof options.autoReconnect === 'boolean' ? options.autoReconnect : reconnect; + + // Clone options + var clonedOptions = mergeOptions( + {}, + { + host: host, + port: port, + disconnectHandler: store, + cursorFactory: Cursor, + reconnect: reconnect, + emitError: typeof options.emitError === 'boolean' ? options.emitError : true, + size: typeof options.poolSize === 'number' ? options.poolSize : 5, + monitorCommands: + typeof options.monitorCommands === 'boolean' ? options.monitorCommands : false + } + ); + + // Translate any SSL options and other connectivity options + clonedOptions = translateOptions(clonedOptions, options); + + // Socket options + var socketOptions = + options.socketOptions && Object.keys(options.socketOptions).length > 0 + ? options.socketOptions + : options; + + // Translate all the options to the core types + clonedOptions = translateOptions(clonedOptions, socketOptions); + + // Define the internal properties + this.s = { + // Create an instance of a server instance from core module + coreTopology: new CServer(clonedOptions), + // Server capabilities + sCapabilities: null, + // Cloned options + clonedOptions: clonedOptions, + // Reconnect + reconnect: clonedOptions.reconnect, + // Emit error + emitError: clonedOptions.emitError, + // Pool size + poolSize: clonedOptions.size, + // Store Options + storeOptions: storeOptions, + // Store + store: store, + // Host + host: host, + // Port + port: port, + // Options + options: options, + // Server Session Pool + sessionPool: null, + // Active client sessions + sessions: new Set(), + // Promise library + promiseLibrary: promiseLibrary || Promise + }; + } + + // Connect + connect(_options, callback) { + var self = this; + if ('function' === typeof _options) (callback = _options), (_options = {}); + if (_options == null) _options = this.s.clonedOptions; + if (!('function' === typeof callback)) callback = null; + _options = Object.assign({}, this.s.clonedOptions, _options); + self.s.options = _options; + + // Update bufferMaxEntries + self.s.storeOptions.bufferMaxEntries = + typeof _options.bufferMaxEntries === 'number' ? _options.bufferMaxEntries : -1; + + // Error handler + var connectErrorHandler = function() { + return function(err) { + // Remove all event handlers + var events = ['timeout', 'error', 'close']; + events.forEach(function(e) { + self.s.coreTopology.removeListener(e, connectHandlers[e]); + }); + + self.s.coreTopology.removeListener('connect', connectErrorHandler); + + // Try to callback + try { + callback(err); + } catch (err) { + process.nextTick(function() { + throw err; + }); + } + }; + }; + + // Actual handler + var errorHandler = function(event) { + return function(err) { + if (event !== 'error') { + self.emit(event, err); + } + }; + }; + + // Error handler + var reconnectHandler = function() { + self.emit('reconnect', self); + self.s.store.execute(); + }; + + // Reconnect failed + var reconnectFailedHandler = function(err) { + self.emit('reconnectFailed', err); + self.s.store.flush(err); + }; + + // Destroy called on topology, perform cleanup + var destroyHandler = function() { + self.s.store.flush(); + }; + + // relay the event + var relay = function(event) { + return function(t, server) { + self.emit(event, t, server); + }; + }; + + // Connect handler + var connectHandler = function() { + // Clear out all the current handlers left over + ['timeout', 'error', 'close', 'destroy'].forEach(function(e) { + self.s.coreTopology.removeAllListeners(e); + }); + + // Set up listeners + self.s.coreTopology.on('timeout', errorHandler('timeout')); + self.s.coreTopology.once('error', errorHandler('error')); + self.s.coreTopology.on('close', errorHandler('close')); + // Only called on destroy + self.s.coreTopology.on('destroy', destroyHandler); + + // Emit open event + self.emit('open', null, self); + + // Return correctly + try { + callback(null, self); + } catch (err) { + process.nextTick(function() { + throw err; + }); + } + }; + + // Set up listeners + var connectHandlers = { + timeout: connectErrorHandler('timeout'), + error: connectErrorHandler('error'), + close: connectErrorHandler('close') + }; + + // Clear out all the current handlers left over + [ + 'timeout', + 'error', + 'close', + 'serverOpening', + 'serverDescriptionChanged', + 'serverHeartbeatStarted', + 'serverHeartbeatSucceeded', + 'serverHeartbeatFailed', + 'serverClosed', + 'topologyOpening', + 'topologyClosed', + 'topologyDescriptionChanged', + 'commandStarted', + 'commandSucceeded', + 'commandFailed' + ].forEach(function(e) { + self.s.coreTopology.removeAllListeners(e); + }); + + // Add the event handlers + self.s.coreTopology.once('timeout', connectHandlers.timeout); + self.s.coreTopology.once('error', connectHandlers.error); + self.s.coreTopology.once('close', connectHandlers.close); + self.s.coreTopology.once('connect', connectHandler); + // Reconnect server + self.s.coreTopology.on('reconnect', reconnectHandler); + self.s.coreTopology.on('reconnectFailed', reconnectFailedHandler); + + // Set up SDAM listeners + self.s.coreTopology.on('serverDescriptionChanged', relay('serverDescriptionChanged')); + self.s.coreTopology.on('serverHeartbeatStarted', relay('serverHeartbeatStarted')); + self.s.coreTopology.on('serverHeartbeatSucceeded', relay('serverHeartbeatSucceeded')); + self.s.coreTopology.on('serverHeartbeatFailed', relay('serverHeartbeatFailed')); + self.s.coreTopology.on('serverOpening', relay('serverOpening')); + self.s.coreTopology.on('serverClosed', relay('serverClosed')); + self.s.coreTopology.on('topologyOpening', relay('topologyOpening')); + self.s.coreTopology.on('topologyClosed', relay('topologyClosed')); + self.s.coreTopology.on('topologyDescriptionChanged', relay('topologyDescriptionChanged')); + self.s.coreTopology.on('commandStarted', relay('commandStarted')); + self.s.coreTopology.on('commandSucceeded', relay('commandSucceeded')); + self.s.coreTopology.on('commandFailed', relay('commandFailed')); + self.s.coreTopology.on('attemptReconnect', relay('attemptReconnect')); + self.s.coreTopology.on('monitoring', relay('monitoring')); + + // Start connection + self.s.coreTopology.connect(_options); + } +} + +Object.defineProperty(Server.prototype, 'poolSize', { + enumerable: true, + get: function() { + return this.s.coreTopology.connections().length; + } +}); + +Object.defineProperty(Server.prototype, 'autoReconnect', { + enumerable: true, + get: function() { + return this.s.reconnect; + } +}); + +Object.defineProperty(Server.prototype, 'host', { + enumerable: true, + get: function() { + return this.s.host; + } +}); + +Object.defineProperty(Server.prototype, 'port', { + enumerable: true, + get: function() { + return this.s.port; + } +}); + +/** + * Server connect event + * + * @event Server#connect + * @type {object} + */ + +/** + * Server close event + * + * @event Server#close + * @type {object} + */ + +/** + * Server reconnect event + * + * @event Server#reconnect + * @type {object} + */ + +/** + * Server error event + * + * @event Server#error + * @type {MongoError} + */ + +/** + * Server timeout event + * + * @event Server#timeout + * @type {object} + */ + +/** + * Server parseError event + * + * @event Server#parseError + * @type {object} + */ + +/** + * An event emitted indicating a command was started, if command monitoring is enabled + * + * @event Server#commandStarted + * @type {object} + */ + +/** + * An event emitted indicating a command succeeded, if command monitoring is enabled + * + * @event Server#commandSucceeded + * @type {object} + */ + +/** + * An event emitted indicating a command failed, if command monitoring is enabled + * + * @event Server#commandFailed + * @type {object} + */ + +module.exports = Server; diff --git a/node_modules/mongodb/lib/topologies/topology_base.js b/node_modules/mongodb/lib/topologies/topology_base.js new file mode 100644 index 00000000..938f1a22 --- /dev/null +++ b/node_modules/mongodb/lib/topologies/topology_base.js @@ -0,0 +1,417 @@ +'use strict'; + +const EventEmitter = require('events'), + MongoError = require('../core').MongoError, + f = require('util').format, + ReadPreference = require('../core').ReadPreference, + ClientSession = require('../core').Sessions.ClientSession; + +// The store of ops +var Store = function(topology, storeOptions) { + var self = this; + var storedOps = []; + storeOptions = storeOptions || { force: false, bufferMaxEntries: -1 }; + + // Internal state + this.s = { + storedOps: storedOps, + storeOptions: storeOptions, + topology: topology + }; + + Object.defineProperty(this, 'length', { + enumerable: true, + get: function() { + return self.s.storedOps.length; + } + }); +}; + +Store.prototype.add = function(opType, ns, ops, options, callback) { + if (this.s.storeOptions.force) { + return callback(MongoError.create({ message: 'db closed by application', driver: true })); + } + + if (this.s.storeOptions.bufferMaxEntries === 0) { + return callback( + MongoError.create({ + message: f( + 'no connection available for operation and number of stored operation > %s', + this.s.storeOptions.bufferMaxEntries + ), + driver: true + }) + ); + } + + if ( + this.s.storeOptions.bufferMaxEntries > 0 && + this.s.storedOps.length > this.s.storeOptions.bufferMaxEntries + ) { + while (this.s.storedOps.length > 0) { + var op = this.s.storedOps.shift(); + op.c( + MongoError.create({ + message: f( + 'no connection available for operation and number of stored operation > %s', + this.s.storeOptions.bufferMaxEntries + ), + driver: true + }) + ); + } + + return; + } + + this.s.storedOps.push({ t: opType, n: ns, o: ops, op: options, c: callback }); +}; + +Store.prototype.addObjectAndMethod = function(opType, object, method, params, callback) { + if (this.s.storeOptions.force) { + return callback(MongoError.create({ message: 'db closed by application', driver: true })); + } + + if (this.s.storeOptions.bufferMaxEntries === 0) { + return callback( + MongoError.create({ + message: f( + 'no connection available for operation and number of stored operation > %s', + this.s.storeOptions.bufferMaxEntries + ), + driver: true + }) + ); + } + + if ( + this.s.storeOptions.bufferMaxEntries > 0 && + this.s.storedOps.length > this.s.storeOptions.bufferMaxEntries + ) { + while (this.s.storedOps.length > 0) { + var op = this.s.storedOps.shift(); + op.c( + MongoError.create({ + message: f( + 'no connection available for operation and number of stored operation > %s', + this.s.storeOptions.bufferMaxEntries + ), + driver: true + }) + ); + } + + return; + } + + this.s.storedOps.push({ t: opType, m: method, o: object, p: params, c: callback }); +}; + +Store.prototype.flush = function(err) { + while (this.s.storedOps.length > 0) { + this.s.storedOps + .shift() + .c( + err || + MongoError.create({ message: f('no connection available for operation'), driver: true }) + ); + } +}; + +var primaryOptions = ['primary', 'primaryPreferred', 'nearest', 'secondaryPreferred']; +var secondaryOptions = ['secondary', 'secondaryPreferred']; + +Store.prototype.execute = function(options) { + options = options || {}; + // Get current ops + var ops = this.s.storedOps; + // Reset the ops + this.s.storedOps = []; + + // Unpack options + var executePrimary = typeof options.executePrimary === 'boolean' ? options.executePrimary : true; + var executeSecondary = + typeof options.executeSecondary === 'boolean' ? options.executeSecondary : true; + + // Execute all the stored ops + while (ops.length > 0) { + var op = ops.shift(); + + if (op.t === 'cursor') { + if (executePrimary && executeSecondary) { + op.o[op.m].apply(op.o, op.p); + } else if ( + executePrimary && + op.o.options && + op.o.options.readPreference && + primaryOptions.indexOf(op.o.options.readPreference.mode) !== -1 + ) { + op.o[op.m].apply(op.o, op.p); + } else if ( + !executePrimary && + executeSecondary && + op.o.options && + op.o.options.readPreference && + secondaryOptions.indexOf(op.o.options.readPreference.mode) !== -1 + ) { + op.o[op.m].apply(op.o, op.p); + } + } else if (op.t === 'auth') { + this.s.topology[op.t].apply(this.s.topology, op.o); + } else { + if (executePrimary && executeSecondary) { + this.s.topology[op.t](op.n, op.o, op.op, op.c); + } else if ( + executePrimary && + op.op && + op.op.readPreference && + primaryOptions.indexOf(op.op.readPreference.mode) !== -1 + ) { + this.s.topology[op.t](op.n, op.o, op.op, op.c); + } else if ( + !executePrimary && + executeSecondary && + op.op && + op.op.readPreference && + secondaryOptions.indexOf(op.op.readPreference.mode) !== -1 + ) { + this.s.topology[op.t](op.n, op.o, op.op, op.c); + } + } + } +}; + +Store.prototype.all = function() { + return this.s.storedOps; +}; + +// Server capabilities +var ServerCapabilities = function(ismaster) { + var setup_get_property = function(object, name, value) { + Object.defineProperty(object, name, { + enumerable: true, + get: function() { + return value; + } + }); + }; + + // Capabilities + var aggregationCursor = false; + var writeCommands = false; + var textSearch = false; + var authCommands = false; + var listCollections = false; + var listIndexes = false; + var maxNumberOfDocsInBatch = ismaster.maxWriteBatchSize || 1000; + var commandsTakeWriteConcern = false; + var commandsTakeCollation = false; + + if (ismaster.minWireVersion >= 0) { + textSearch = true; + } + + if (ismaster.maxWireVersion >= 1) { + aggregationCursor = true; + authCommands = true; + } + + if (ismaster.maxWireVersion >= 2) { + writeCommands = true; + } + + if (ismaster.maxWireVersion >= 3) { + listCollections = true; + listIndexes = true; + } + + if (ismaster.maxWireVersion >= 5) { + commandsTakeWriteConcern = true; + commandsTakeCollation = true; + } + + // If no min or max wire version set to 0 + if (ismaster.minWireVersion == null) { + ismaster.minWireVersion = 0; + } + + if (ismaster.maxWireVersion == null) { + ismaster.maxWireVersion = 0; + } + + // Map up read only parameters + setup_get_property(this, 'hasAggregationCursor', aggregationCursor); + setup_get_property(this, 'hasWriteCommands', writeCommands); + setup_get_property(this, 'hasTextSearch', textSearch); + setup_get_property(this, 'hasAuthCommands', authCommands); + setup_get_property(this, 'hasListCollectionsCommand', listCollections); + setup_get_property(this, 'hasListIndexesCommand', listIndexes); + setup_get_property(this, 'minWireVersion', ismaster.minWireVersion); + setup_get_property(this, 'maxWireVersion', ismaster.maxWireVersion); + setup_get_property(this, 'maxNumberOfDocsInBatch', maxNumberOfDocsInBatch); + setup_get_property(this, 'commandsTakeWriteConcern', commandsTakeWriteConcern); + setup_get_property(this, 'commandsTakeCollation', commandsTakeCollation); +}; + +class TopologyBase extends EventEmitter { + constructor() { + super(); + this.setMaxListeners(Infinity); + } + + // Sessions related methods + hasSessionSupport() { + return this.logicalSessionTimeoutMinutes != null; + } + + startSession(options, clientOptions) { + const session = new ClientSession(this, this.s.sessionPool, options, clientOptions); + + session.once('ended', () => { + this.s.sessions.delete(session); + }); + + this.s.sessions.add(session); + return session; + } + + endSessions(sessions, callback) { + return this.s.coreTopology.endSessions(sessions, callback); + } + + get clientMetadata() { + return this.s.coreTopology.s.options.metadata; + } + + // Server capabilities + capabilities() { + if (this.s.sCapabilities) return this.s.sCapabilities; + if (this.s.coreTopology.lastIsMaster() == null) return null; + this.s.sCapabilities = new ServerCapabilities(this.s.coreTopology.lastIsMaster()); + return this.s.sCapabilities; + } + + // Command + command(ns, cmd, options, callback) { + this.s.coreTopology.command(ns.toString(), cmd, ReadPreference.translate(options), callback); + } + + // Insert + insert(ns, ops, options, callback) { + this.s.coreTopology.insert(ns.toString(), ops, options, callback); + } + + // Update + update(ns, ops, options, callback) { + this.s.coreTopology.update(ns.toString(), ops, options, callback); + } + + // Remove + remove(ns, ops, options, callback) { + this.s.coreTopology.remove(ns.toString(), ops, options, callback); + } + + // IsConnected + isConnected(options) { + options = options || {}; + options = ReadPreference.translate(options); + + return this.s.coreTopology.isConnected(options); + } + + // IsDestroyed + isDestroyed() { + return this.s.coreTopology.isDestroyed(); + } + + // Cursor + cursor(ns, cmd, options) { + options = options || {}; + options = ReadPreference.translate(options); + options.disconnectHandler = this.s.store; + options.topology = this; + + return this.s.coreTopology.cursor(ns, cmd, options); + } + + lastIsMaster() { + return this.s.coreTopology.lastIsMaster(); + } + + selectServer(selector, options, callback) { + return this.s.coreTopology.selectServer(selector, options, callback); + } + + /** + * Unref all sockets + * @method + */ + unref() { + return this.s.coreTopology.unref(); + } + + /** + * All raw connections + * @method + * @return {array} + */ + connections() { + return this.s.coreTopology.connections(); + } + + close(forceClosed, callback) { + // If we have sessions, we want to individually move them to the session pool, + // and then send a single endSessions call. + this.s.sessions.forEach(session => session.endSession()); + + if (this.s.sessionPool) { + this.s.sessionPool.endAllPooledSessions(); + } + + // We need to wash out all stored processes + if (forceClosed === true) { + this.s.storeOptions.force = forceClosed; + this.s.store.flush(); + } + + this.s.coreTopology.destroy( + { + force: typeof forceClosed === 'boolean' ? forceClosed : false + }, + callback + ); + } +} + +// Properties +Object.defineProperty(TopologyBase.prototype, 'bson', { + enumerable: true, + get: function() { + return this.s.coreTopology.s.bson; + } +}); + +Object.defineProperty(TopologyBase.prototype, 'parserType', { + enumerable: true, + get: function() { + return this.s.coreTopology.parserType; + } +}); + +Object.defineProperty(TopologyBase.prototype, 'logicalSessionTimeoutMinutes', { + enumerable: true, + get: function() { + return this.s.coreTopology.logicalSessionTimeoutMinutes; + } +}); + +Object.defineProperty(TopologyBase.prototype, 'type', { + enumerable: true, + get: function() { + return this.s.coreTopology.type; + } +}); + +exports.Store = Store; +exports.ServerCapabilities = ServerCapabilities; +exports.TopologyBase = TopologyBase; diff --git a/node_modules/mongodb/lib/url_parser.js b/node_modules/mongodb/lib/url_parser.js new file mode 100644 index 00000000..3f17a1cf --- /dev/null +++ b/node_modules/mongodb/lib/url_parser.js @@ -0,0 +1,628 @@ +'use strict'; + +const ReadPreference = require('./core').ReadPreference; +const parser = require('url'); +const f = require('util').format; +const Logger = require('./core').Logger; +const dns = require('dns'); +const ReadConcern = require('./read_concern'); +const qs = require('querystring'); +const MongoParseError = require('./core/error').MongoParseError; + +module.exports = function(url, options, callback) { + if (typeof options === 'function') (callback = options), (options = {}); + options = options || {}; + + let result; + try { + result = parser.parse(url, true); + } catch (e) { + return callback(new Error('URL malformed, cannot be parsed')); + } + + if (result.protocol !== 'mongodb:' && result.protocol !== 'mongodb+srv:') { + return callback(new Error('Invalid schema, expected `mongodb` or `mongodb+srv`')); + } + + if (result.protocol === 'mongodb:') { + return parseHandler(url, options, callback); + } + + // Otherwise parse this as an SRV record + if (result.hostname.split('.').length < 3) { + return callback(new Error('URI does not have hostname, domain name and tld')); + } + + result.domainLength = result.hostname.split('.').length; + + if (result.pathname && result.pathname.match(',')) { + return callback(new Error('Invalid URI, cannot contain multiple hostnames')); + } + + if (result.port) { + return callback(new Error('Ports not accepted with `mongodb+srv` URIs')); + } + + let srvAddress = `_mongodb._tcp.${result.host}`; + dns.resolveSrv(srvAddress, function(err, addresses) { + if (err) return callback(err); + + if (addresses.length === 0) { + return callback(new Error('No addresses found at host')); + } + + for (let i = 0; i < addresses.length; i++) { + if (!matchesParentDomain(addresses[i].name, result.hostname, result.domainLength)) { + return callback(new Error('Server record does not share hostname with parent URI')); + } + } + + let base = result.auth ? `mongodb://${result.auth}@` : `mongodb://`; + let connectionStrings = addresses.map(function(address, i) { + if (i === 0) return `${base}${address.name}:${address.port}`; + else return `${address.name}:${address.port}`; + }); + + let connectionString = connectionStrings.join(',') + '/'; + let connectionStringOptions = []; + + // Add the default database if needed + if (result.path) { + let defaultDb = result.path.slice(1); + if (defaultDb.indexOf('?') !== -1) { + defaultDb = defaultDb.slice(0, defaultDb.indexOf('?')); + } + + connectionString += defaultDb; + } + + // Default to SSL true + if (!options.ssl && !result.search) { + connectionStringOptions.push('ssl=true'); + } else if (!options.ssl && result.search && !result.search.match('ssl')) { + connectionStringOptions.push('ssl=true'); + } + + // Keep original uri options + if (result.search) { + connectionStringOptions.push(result.search.replace('?', '')); + } + + dns.resolveTxt(result.host, function(err, record) { + if (err && err.code !== 'ENODATA' && err.code !== 'ENOTFOUND') return callback(err); + if (err && err.code === 'ENODATA') record = null; + + if (record) { + if (record.length > 1) { + return callback(new MongoParseError('Multiple text records not allowed')); + } + + record = record[0].join(''); + const parsedRecord = qs.parse(record); + const items = Object.keys(parsedRecord); + if (items.some(item => item !== 'authSource' && item !== 'replicaSet')) { + return callback( + new MongoParseError('Text record must only set `authSource` or `replicaSet`') + ); + } + + if (items.length > 0) { + connectionStringOptions.push(record); + } + } + + // Add any options to the connection string + if (connectionStringOptions.length) { + connectionString += `?${connectionStringOptions.join('&')}`; + } + + parseHandler(connectionString, options, callback); + }); + }); +}; + +function matchesParentDomain(srvAddress, parentDomain) { + let regex = /^.*?\./; + let srv = `.${srvAddress.replace(regex, '')}`; + let parent = `.${parentDomain.replace(regex, '')}`; + if (srv.endsWith(parent)) return true; + else return false; +} + +function parseHandler(address, options, callback) { + let result, err; + try { + result = parseConnectionString(address, options); + } catch (e) { + err = e; + } + + return err ? callback(err, null) : callback(null, result); +} + +function parseConnectionString(url, options) { + // Variables + let connection_part = ''; + let auth_part = ''; + let query_string_part = ''; + let dbName = 'admin'; + + // Url parser result + let result = parser.parse(url, true); + if ((result.hostname == null || result.hostname === '') && url.indexOf('.sock') === -1) { + throw new Error('No hostname or hostnames provided in connection string'); + } + + if (result.port === '0') { + throw new Error('Invalid port (zero) with hostname'); + } + + if (!isNaN(parseInt(result.port, 10)) && parseInt(result.port, 10) > 65535) { + throw new Error('Invalid port (larger than 65535) with hostname'); + } + + if ( + result.path && + result.path.length > 0 && + result.path[0] !== '/' && + url.indexOf('.sock') === -1 + ) { + throw new Error('Missing delimiting slash between hosts and options'); + } + + if (result.query) { + for (let name in result.query) { + if (name.indexOf('::') !== -1) { + throw new Error('Double colon in host identifier'); + } + + if (result.query[name] === '') { + throw new Error('Query parameter ' + name + ' is an incomplete value pair'); + } + } + } + + if (result.auth) { + let parts = result.auth.split(':'); + if (url.indexOf(result.auth) !== -1 && parts.length > 2) { + throw new Error('Username with password containing an unescaped colon'); + } + + if (url.indexOf(result.auth) !== -1 && result.auth.indexOf('@') !== -1) { + throw new Error('Username containing an unescaped at-sign'); + } + } + + // Remove query + let clean = url.split('?').shift(); + + // Extract the list of hosts + let strings = clean.split(','); + let hosts = []; + + for (let i = 0; i < strings.length; i++) { + let hostString = strings[i]; + + if (hostString.indexOf('mongodb') !== -1) { + if (hostString.indexOf('@') !== -1) { + hosts.push(hostString.split('@').pop()); + } else { + hosts.push(hostString.substr('mongodb://'.length)); + } + } else if (hostString.indexOf('/') !== -1) { + hosts.push(hostString.split('/').shift()); + } else if (hostString.indexOf('/') === -1) { + hosts.push(hostString.trim()); + } + } + + for (let i = 0; i < hosts.length; i++) { + let r = parser.parse(f('mongodb://%s', hosts[i].trim())); + if (r.path && r.path.indexOf('.sock') !== -1) continue; + if (r.path && r.path.indexOf(':') !== -1) { + // Not connecting to a socket so check for an extra slash in the hostname. + // Using String#split as perf is better than match. + if (r.path.split('/').length > 1 && r.path.indexOf('::') === -1) { + throw new Error('Slash in host identifier'); + } else { + throw new Error('Double colon in host identifier'); + } + } + } + + // If we have a ? mark cut the query elements off + if (url.indexOf('?') !== -1) { + query_string_part = url.substr(url.indexOf('?') + 1); + connection_part = url.substring('mongodb://'.length, url.indexOf('?')); + } else { + connection_part = url.substring('mongodb://'.length); + } + + // Check if we have auth params + if (connection_part.indexOf('@') !== -1) { + auth_part = connection_part.split('@')[0]; + connection_part = connection_part.split('@')[1]; + } + + // Check there is not more than one unescaped slash + if (connection_part.split('/').length > 2) { + throw new Error( + "Unsupported host '" + + connection_part.split('?')[0] + + "', hosts must be URL encoded and contain at most one unencoded slash" + ); + } + + // Check if the connection string has a db + if (connection_part.indexOf('.sock') !== -1) { + if (connection_part.indexOf('.sock/') !== -1) { + dbName = connection_part.split('.sock/')[1]; + // Check if multiple database names provided, or just an illegal trailing backslash + if (dbName.indexOf('/') !== -1) { + if (dbName.split('/').length === 2 && dbName.split('/')[1].length === 0) { + throw new Error('Illegal trailing backslash after database name'); + } + throw new Error('More than 1 database name in URL'); + } + connection_part = connection_part.split( + '/', + connection_part.indexOf('.sock') + '.sock'.length + ); + } + } else if (connection_part.indexOf('/') !== -1) { + // Check if multiple database names provided, or just an illegal trailing backslash + if (connection_part.split('/').length > 2) { + if (connection_part.split('/')[2].length === 0) { + throw new Error('Illegal trailing backslash after database name'); + } + throw new Error('More than 1 database name in URL'); + } + dbName = connection_part.split('/')[1]; + connection_part = connection_part.split('/')[0]; + } + + // URI decode the host information + connection_part = decodeURIComponent(connection_part); + + // Result object + let object = {}; + + // Pick apart the authentication part of the string + let authPart = auth_part || ''; + let auth = authPart.split(':', 2); + + // Decode the authentication URI components and verify integrity + let user = decodeURIComponent(auth[0]); + if (auth[0] !== encodeURIComponent(user)) { + throw new Error('Username contains an illegal unescaped character'); + } + auth[0] = user; + + if (auth[1]) { + let pass = decodeURIComponent(auth[1]); + if (auth[1] !== encodeURIComponent(pass)) { + throw new Error('Password contains an illegal unescaped character'); + } + auth[1] = pass; + } + + // Add auth to final object if we have 2 elements + if (auth.length === 2) object.auth = { user: auth[0], password: auth[1] }; + // if user provided auth options, use that + if (options && options.auth != null) object.auth = options.auth; + + // Variables used for temporary storage + let hostPart; + let urlOptions; + let servers; + let compression; + let serverOptions = { socketOptions: {} }; + let dbOptions = { read_preference_tags: [] }; + let replSetServersOptions = { socketOptions: {} }; + let mongosOptions = { socketOptions: {} }; + // Add server options to final object + object.server_options = serverOptions; + object.db_options = dbOptions; + object.rs_options = replSetServersOptions; + object.mongos_options = mongosOptions; + + // Let's check if we are using a domain socket + if (url.match(/\.sock/)) { + // Split out the socket part + let domainSocket = url.substring( + url.indexOf('mongodb://') + 'mongodb://'.length, + url.lastIndexOf('.sock') + '.sock'.length + ); + // Clean out any auth stuff if any + if (domainSocket.indexOf('@') !== -1) domainSocket = domainSocket.split('@')[1]; + domainSocket = decodeURIComponent(domainSocket); + servers = [{ domain_socket: domainSocket }]; + } else { + // Split up the db + hostPart = connection_part; + // Deduplicate servers + let deduplicatedServers = {}; + + // Parse all server results + servers = hostPart + .split(',') + .map(function(h) { + let _host, _port, ipv6match; + //check if it matches [IPv6]:port, where the port number is optional + if ((ipv6match = /\[([^\]]+)\](?::(.+))?/.exec(h))) { + _host = ipv6match[1]; + _port = parseInt(ipv6match[2], 10) || 27017; + } else { + //otherwise assume it's IPv4, or plain hostname + let hostPort = h.split(':', 2); + _host = hostPort[0] || 'localhost'; + _port = hostPort[1] != null ? parseInt(hostPort[1], 10) : 27017; + // Check for localhost?safe=true style case + if (_host.indexOf('?') !== -1) _host = _host.split(/\?/)[0]; + } + + // No entry returned for duplicate server + if (deduplicatedServers[_host + '_' + _port]) return null; + deduplicatedServers[_host + '_' + _port] = 1; + + // Return the mapped object + return { host: _host, port: _port }; + }) + .filter(function(x) { + return x != null; + }); + } + + // Get the db name + object.dbName = dbName || 'admin'; + // Split up all the options + urlOptions = (query_string_part || '').split(/[&;]/); + // Ugh, we have to figure out which options go to which constructor manually. + urlOptions.forEach(function(opt) { + if (!opt) return; + var splitOpt = opt.split('='), + name = splitOpt[0], + value = splitOpt[1]; + + // Options implementations + switch (name) { + case 'slaveOk': + case 'slave_ok': + serverOptions.slave_ok = value === 'true'; + dbOptions.slaveOk = value === 'true'; + break; + case 'maxPoolSize': + case 'poolSize': + serverOptions.poolSize = parseInt(value, 10); + replSetServersOptions.poolSize = parseInt(value, 10); + break; + case 'appname': + object.appname = decodeURIComponent(value); + break; + case 'autoReconnect': + case 'auto_reconnect': + serverOptions.auto_reconnect = value === 'true'; + break; + case 'ssl': + if (value === 'prefer') { + serverOptions.ssl = value; + replSetServersOptions.ssl = value; + mongosOptions.ssl = value; + break; + } + serverOptions.ssl = value === 'true'; + replSetServersOptions.ssl = value === 'true'; + mongosOptions.ssl = value === 'true'; + break; + case 'sslValidate': + serverOptions.sslValidate = value === 'true'; + replSetServersOptions.sslValidate = value === 'true'; + mongosOptions.sslValidate = value === 'true'; + break; + case 'replicaSet': + case 'rs_name': + replSetServersOptions.rs_name = value; + break; + case 'reconnectWait': + replSetServersOptions.reconnectWait = parseInt(value, 10); + break; + case 'retries': + replSetServersOptions.retries = parseInt(value, 10); + break; + case 'readSecondary': + case 'read_secondary': + replSetServersOptions.read_secondary = value === 'true'; + break; + case 'fsync': + dbOptions.fsync = value === 'true'; + break; + case 'journal': + dbOptions.j = value === 'true'; + break; + case 'safe': + dbOptions.safe = value === 'true'; + break; + case 'nativeParser': + case 'native_parser': + dbOptions.native_parser = value === 'true'; + break; + case 'readConcernLevel': + dbOptions.readConcern = new ReadConcern(value); + break; + case 'connectTimeoutMS': + serverOptions.socketOptions.connectTimeoutMS = parseInt(value, 10); + replSetServersOptions.socketOptions.connectTimeoutMS = parseInt(value, 10); + mongosOptions.socketOptions.connectTimeoutMS = parseInt(value, 10); + break; + case 'socketTimeoutMS': + serverOptions.socketOptions.socketTimeoutMS = parseInt(value, 10); + replSetServersOptions.socketOptions.socketTimeoutMS = parseInt(value, 10); + mongosOptions.socketOptions.socketTimeoutMS = parseInt(value, 10); + break; + case 'w': + dbOptions.w = parseInt(value, 10); + if (isNaN(dbOptions.w)) dbOptions.w = value; + break; + case 'authSource': + dbOptions.authSource = value; + break; + case 'gssapiServiceName': + dbOptions.gssapiServiceName = value; + break; + case 'authMechanism': + if (value === 'GSSAPI') { + // If no password provided decode only the principal + if (object.auth == null) { + let urlDecodeAuthPart = decodeURIComponent(authPart); + if (urlDecodeAuthPart.indexOf('@') === -1) + throw new Error('GSSAPI requires a provided principal'); + object.auth = { user: urlDecodeAuthPart, password: null }; + } else { + object.auth.user = decodeURIComponent(object.auth.user); + } + } else if (value === 'MONGODB-X509') { + object.auth = { user: decodeURIComponent(authPart) }; + } + + // Only support GSSAPI or MONGODB-CR for now + if ( + value !== 'GSSAPI' && + value !== 'MONGODB-X509' && + value !== 'MONGODB-CR' && + value !== 'DEFAULT' && + value !== 'SCRAM-SHA-1' && + value !== 'SCRAM-SHA-256' && + value !== 'PLAIN' + ) + throw new Error( + 'Only DEFAULT, GSSAPI, PLAIN, MONGODB-X509, or SCRAM-SHA-1 is supported by authMechanism' + ); + + // Authentication mechanism + dbOptions.authMechanism = value; + break; + case 'authMechanismProperties': + { + // Split up into key, value pairs + let values = value.split(','); + let o = {}; + // For each value split into key, value + values.forEach(function(x) { + let v = x.split(':'); + o[v[0]] = v[1]; + }); + + // Set all authMechanismProperties + dbOptions.authMechanismProperties = o; + // Set the service name value + if (typeof o.SERVICE_NAME === 'string') dbOptions.gssapiServiceName = o.SERVICE_NAME; + if (typeof o.SERVICE_REALM === 'string') dbOptions.gssapiServiceRealm = o.SERVICE_REALM; + if (typeof o.CANONICALIZE_HOST_NAME === 'string') + dbOptions.gssapiCanonicalizeHostName = + o.CANONICALIZE_HOST_NAME === 'true' ? true : false; + } + break; + case 'wtimeoutMS': + dbOptions.wtimeout = parseInt(value, 10); + break; + case 'readPreference': + if (!ReadPreference.isValid(value)) + throw new Error( + 'readPreference must be either primary/primaryPreferred/secondary/secondaryPreferred/nearest' + ); + dbOptions.readPreference = value; + break; + case 'maxStalenessSeconds': + dbOptions.maxStalenessSeconds = parseInt(value, 10); + break; + case 'readPreferenceTags': + { + // Decode the value + value = decodeURIComponent(value); + // Contains the tag object + let tagObject = {}; + if (value == null || value === '') { + dbOptions.read_preference_tags.push(tagObject); + break; + } + + // Split up the tags + let tags = value.split(/,/); + for (let i = 0; i < tags.length; i++) { + let parts = tags[i].trim().split(/:/); + tagObject[parts[0]] = parts[1]; + } + + // Set the preferences tags + dbOptions.read_preference_tags.push(tagObject); + } + break; + case 'compressors': + { + compression = serverOptions.compression || {}; + let compressors = value.split(','); + if ( + !compressors.every(function(compressor) { + return compressor === 'snappy' || compressor === 'zlib'; + }) + ) { + throw new Error('Compressors must be at least one of snappy or zlib'); + } + + compression.compressors = compressors; + serverOptions.compression = compression; + } + break; + case 'zlibCompressionLevel': + { + compression = serverOptions.compression || {}; + let zlibCompressionLevel = parseInt(value, 10); + if (zlibCompressionLevel < -1 || zlibCompressionLevel > 9) { + throw new Error('zlibCompressionLevel must be an integer between -1 and 9'); + } + + compression.zlibCompressionLevel = zlibCompressionLevel; + serverOptions.compression = compression; + } + break; + case 'retryWrites': + dbOptions.retryWrites = value === 'true'; + break; + case 'minSize': + dbOptions.minSize = parseInt(value, 10); + break; + default: + { + let logger = Logger('URL Parser'); + logger.warn(`${name} is not supported as a connection string option`); + } + break; + } + }); + + // No tags: should be null (not []) + if (dbOptions.read_preference_tags.length === 0) { + dbOptions.read_preference_tags = null; + } + + // Validate if there are an invalid write concern combinations + if ( + (dbOptions.w === -1 || dbOptions.w === 0) && + (dbOptions.journal === true || dbOptions.fsync === true || dbOptions.safe === true) + ) + throw new Error('w set to -1 or 0 cannot be combined with safe/w/journal/fsync'); + + // If no read preference set it to primary + if (!dbOptions.readPreference) { + dbOptions.readPreference = 'primary'; + } + + // make sure that user-provided options are applied with priority + dbOptions = Object.assign(dbOptions, options); + + // Add servers to result + object.servers = servers; + + // Returned parsed object + return object; +} diff --git a/node_modules/mongodb/lib/utils.js b/node_modules/mongodb/lib/utils.js new file mode 100644 index 00000000..0ebbb456 --- /dev/null +++ b/node_modules/mongodb/lib/utils.js @@ -0,0 +1,853 @@ +'use strict'; +const MongoError = require('./core/error').MongoError; +const WriteConcern = require('./write_concern'); + +var shallowClone = function(obj) { + var copy = {}; + for (var name in obj) copy[name] = obj[name]; + return copy; +}; + +// Set simple property +var getSingleProperty = function(obj, name, value) { + Object.defineProperty(obj, name, { + enumerable: true, + get: function() { + return value; + } + }); +}; + +var formatSortValue = (exports.formatSortValue = function(sortDirection) { + var value = ('' + sortDirection).toLowerCase(); + + switch (value) { + case 'ascending': + case 'asc': + case '1': + return 1; + case 'descending': + case 'desc': + case '-1': + return -1; + default: + throw new Error( + 'Illegal sort clause, must be of the form ' + + "[['field1', '(ascending|descending)'], " + + "['field2', '(ascending|descending)']]" + ); + } +}); + +var formattedOrderClause = (exports.formattedOrderClause = function(sortValue) { + var orderBy = {}; + if (sortValue == null) return null; + if (Array.isArray(sortValue)) { + if (sortValue.length === 0) { + return null; + } + + for (var i = 0; i < sortValue.length; i++) { + if (sortValue[i].constructor === String) { + orderBy[sortValue[i]] = 1; + } else { + orderBy[sortValue[i][0]] = formatSortValue(sortValue[i][1]); + } + } + } else if (sortValue != null && typeof sortValue === 'object') { + orderBy = sortValue; + } else if (typeof sortValue === 'string') { + orderBy[sortValue] = 1; + } else { + throw new Error( + 'Illegal sort clause, must be of the form ' + + "[['field1', '(ascending|descending)'], ['field2', '(ascending|descending)']]" + ); + } + + return orderBy; +}); + +var checkCollectionName = function checkCollectionName(collectionName) { + if ('string' !== typeof collectionName) { + throw new MongoError('collection name must be a String'); + } + + if (!collectionName || collectionName.indexOf('..') !== -1) { + throw new MongoError('collection names cannot be empty'); + } + + if ( + collectionName.indexOf('$') !== -1 && + collectionName.match(/((^\$cmd)|(oplog\.\$main))/) == null + ) { + throw new MongoError("collection names must not contain '$'"); + } + + if (collectionName.match(/^\.|\.$/) != null) { + throw new MongoError("collection names must not start or end with '.'"); + } + + // Validate that we are not passing 0x00 in the collection name + if (collectionName.indexOf('\x00') !== -1) { + throw new MongoError('collection names cannot contain a null character'); + } +}; + +var handleCallback = function(callback, err, value1, value2) { + try { + if (callback == null) return; + + if (callback) { + return value2 ? callback(err, value1, value2) : callback(err, value1); + } + } catch (err) { + process.nextTick(function() { + throw err; + }); + return false; + } + + return true; +}; + +/** + * Wrap a Mongo error document in an Error instance + * @ignore + * @api private + */ +var toError = function(error) { + if (error instanceof Error) return error; + + var msg = error.err || error.errmsg || error.errMessage || error; + var e = MongoError.create({ message: msg, driver: true }); + + // Get all object keys + var keys = typeof error === 'object' ? Object.keys(error) : []; + + for (var i = 0; i < keys.length; i++) { + try { + e[keys[i]] = error[keys[i]]; + } catch (err) { + // continue + } + } + + return e; +}; + +/** + * @ignore + */ +var normalizeHintField = function normalizeHintField(hint) { + var finalHint = null; + + if (typeof hint === 'string') { + finalHint = hint; + } else if (Array.isArray(hint)) { + finalHint = {}; + + hint.forEach(function(param) { + finalHint[param] = 1; + }); + } else if (hint != null && typeof hint === 'object') { + finalHint = {}; + for (var name in hint) { + finalHint[name] = hint[name]; + } + } + + return finalHint; +}; + +/** + * Create index name based on field spec + * + * @ignore + * @api private + */ +var parseIndexOptions = function(fieldOrSpec) { + var fieldHash = {}; + var indexes = []; + var keys; + + // Get all the fields accordingly + if ('string' === typeof fieldOrSpec) { + // 'type' + indexes.push(fieldOrSpec + '_' + 1); + fieldHash[fieldOrSpec] = 1; + } else if (Array.isArray(fieldOrSpec)) { + fieldOrSpec.forEach(function(f) { + if ('string' === typeof f) { + // [{location:'2d'}, 'type'] + indexes.push(f + '_' + 1); + fieldHash[f] = 1; + } else if (Array.isArray(f)) { + // [['location', '2d'],['type', 1]] + indexes.push(f[0] + '_' + (f[1] || 1)); + fieldHash[f[0]] = f[1] || 1; + } else if (isObject(f)) { + // [{location:'2d'}, {type:1}] + keys = Object.keys(f); + keys.forEach(function(k) { + indexes.push(k + '_' + f[k]); + fieldHash[k] = f[k]; + }); + } else { + // undefined (ignore) + } + }); + } else if (isObject(fieldOrSpec)) { + // {location:'2d', type:1} + keys = Object.keys(fieldOrSpec); + keys.forEach(function(key) { + indexes.push(key + '_' + fieldOrSpec[key]); + fieldHash[key] = fieldOrSpec[key]; + }); + } + + return { + name: indexes.join('_'), + keys: keys, + fieldHash: fieldHash + }; +}; + +var isObject = (exports.isObject = function(arg) { + return '[object Object]' === Object.prototype.toString.call(arg); +}); + +var debugOptions = function(debugFields, options) { + var finaloptions = {}; + debugFields.forEach(function(n) { + finaloptions[n] = options[n]; + }); + + return finaloptions; +}; + +var decorateCommand = function(command, options, exclude) { + for (var name in options) { + if (exclude.indexOf(name) === -1) command[name] = options[name]; + } + + return command; +}; + +var mergeOptions = function(target, source) { + for (var name in source) { + target[name] = source[name]; + } + + return target; +}; + +// Merge options with translation +var translateOptions = function(target, source) { + var translations = { + // SSL translation options + sslCA: 'ca', + sslCRL: 'crl', + sslValidate: 'rejectUnauthorized', + sslKey: 'key', + sslCert: 'cert', + sslPass: 'passphrase', + // SocketTimeout translation options + socketTimeoutMS: 'socketTimeout', + connectTimeoutMS: 'connectionTimeout', + // Replicaset options + replicaSet: 'setName', + rs_name: 'setName', + secondaryAcceptableLatencyMS: 'acceptableLatency', + connectWithNoPrimary: 'secondaryOnlyConnectionAllowed', + // Mongos options + acceptableLatencyMS: 'localThresholdMS' + }; + + for (var name in source) { + if (translations[name]) { + target[translations[name]] = source[name]; + } else { + target[name] = source[name]; + } + } + + return target; +}; + +var filterOptions = function(options, names) { + var filterOptions = {}; + + for (var name in options) { + if (names.indexOf(name) !== -1) filterOptions[name] = options[name]; + } + + // Filtered options + return filterOptions; +}; + +// Write concern keys +var writeConcernKeys = ['w', 'j', 'wtimeout', 'fsync']; + +// Merge the write concern options +var mergeOptionsAndWriteConcern = function(targetOptions, sourceOptions, keys, mergeWriteConcern) { + // Mix in any allowed options + for (var i = 0; i < keys.length; i++) { + if (!targetOptions[keys[i]] && sourceOptions[keys[i]] !== undefined) { + targetOptions[keys[i]] = sourceOptions[keys[i]]; + } + } + + // No merging of write concern + if (!mergeWriteConcern) return targetOptions; + + // Found no write Concern options + var found = false; + for (i = 0; i < writeConcernKeys.length; i++) { + if (targetOptions[writeConcernKeys[i]]) { + found = true; + break; + } + } + + if (!found) { + for (i = 0; i < writeConcernKeys.length; i++) { + if (sourceOptions[writeConcernKeys[i]]) { + targetOptions[writeConcernKeys[i]] = sourceOptions[writeConcernKeys[i]]; + } + } + } + + return targetOptions; +}; + +/** + * Executes the given operation with provided arguments. + * + * This method reduces large amounts of duplication in the entire codebase by providing + * a single point for determining whether callbacks or promises should be used. Additionally + * it allows for a single point of entry to provide features such as implicit sessions, which + * are required by the Driver Sessions specification in the event that a ClientSession is + * not provided + * + * @param {object} topology The topology to execute this operation on + * @param {function} operation The operation to execute + * @param {array} args Arguments to apply the provided operation + * @param {object} [options] Options that modify the behavior of the method + */ +const executeLegacyOperation = (topology, operation, args, options) => { + if (topology == null) { + throw new TypeError('This method requires a valid topology instance'); + } + + if (!Array.isArray(args)) { + throw new TypeError('This method requires an array of arguments to apply'); + } + + options = options || {}; + const Promise = topology.s.promiseLibrary; + let callback = args[args.length - 1]; + + // The driver sessions spec mandates that we implicitly create sessions for operations + // that are not explicitly provided with a session. + let session, opOptions, owner; + if (!options.skipSessions && topology.hasSessionSupport()) { + opOptions = args[args.length - 2]; + if (opOptions == null || opOptions.session == null) { + owner = Symbol(); + session = topology.startSession({ owner }); + const optionsIndex = args.length - 2; + args[optionsIndex] = Object.assign({}, args[optionsIndex], { session: session }); + } else if (opOptions.session && opOptions.session.hasEnded) { + throw new MongoError('Use of expired sessions is not permitted'); + } + } + + const makeExecuteCallback = (resolve, reject) => + function executeCallback(err, result) { + if (session && session.owner === owner && !options.returnsCursor) { + session.endSession(() => { + delete opOptions.session; + if (err) return reject(err); + resolve(result); + }); + } else { + if (err) return reject(err); + resolve(result); + } + }; + + // Execute using callback + if (typeof callback === 'function') { + callback = args.pop(); + const handler = makeExecuteCallback( + result => callback(null, result), + err => callback(err, null) + ); + args.push(handler); + + try { + return operation.apply(null, args); + } catch (e) { + handler(e); + throw e; + } + } + + // Return a Promise + if (args[args.length - 1] != null) { + throw new TypeError('final argument to `executeLegacyOperation` must be a callback'); + } + + return new Promise(function(resolve, reject) { + const handler = makeExecuteCallback(resolve, reject); + args[args.length - 1] = handler; + + try { + return operation.apply(null, args); + } catch (e) { + handler(e); + } + }); +}; + +/** + * Applies retryWrites: true to a command if retryWrites is set on the command's database. + * + * @param {object} target The target command to which we will apply retryWrites. + * @param {object} db The database from which we can inherit a retryWrites value. + */ +function applyRetryableWrites(target, db) { + if (db && db.s.options.retryWrites) { + target.retryWrites = true; + } + + return target; +} + +/** + * Applies a write concern to a command based on well defined inheritance rules, optionally + * detecting support for the write concern in the first place. + * + * @param {Object} target the target command we will be applying the write concern to + * @param {Object} sources sources where we can inherit default write concerns from + * @param {Object} [options] optional settings passed into a command for write concern overrides + * @returns {Object} the (now) decorated target + */ +function applyWriteConcern(target, sources, options) { + options = options || {}; + const db = sources.db; + const coll = sources.collection; + + if (options.session && options.session.inTransaction()) { + // writeConcern is not allowed within a multi-statement transaction + if (target.writeConcern) { + delete target.writeConcern; + } + + return target; + } + + const writeConcern = WriteConcern.fromOptions(options); + if (writeConcern) { + return Object.assign(target, { writeConcern }); + } + + if (coll && coll.writeConcern) { + return Object.assign(target, { writeConcern: Object.assign({}, coll.writeConcern) }); + } + + if (db && db.writeConcern) { + return Object.assign(target, { writeConcern: Object.assign({}, db.writeConcern) }); + } + + return target; +} + +/** + * Checks if a given value is a Promise + * + * @param {*} maybePromise + * @return true if the provided value is a Promise + */ +function isPromiseLike(maybePromise) { + return maybePromise && typeof maybePromise.then === 'function'; +} + +/** + * Applies collation to a given command. + * + * @param {object} [command] the command on which to apply collation + * @param {(Cursor|Collection)} [target] target of command + * @param {object} [options] options containing collation settings + */ +function decorateWithCollation(command, target, options) { + const topology = (target.s && target.s.topology) || target.topology; + + if (!topology) { + throw new TypeError('parameter "target" is missing a topology'); + } + + const capabilities = topology.capabilities(); + if (options.collation && typeof options.collation === 'object') { + if (capabilities && capabilities.commandsTakeCollation) { + command.collation = options.collation; + } else { + throw new MongoError(`Current topology does not support collation`); + } + } +} + +/** + * Applies a read concern to a given command. + * + * @param {object} command the command on which to apply the read concern + * @param {Collection} coll the parent collection of the operation calling this method + */ +function decorateWithReadConcern(command, coll, options) { + if (options && options.session && options.session.inTransaction()) { + return; + } + let readConcern = Object.assign({}, command.readConcern || {}); + if (coll.s.readConcern) { + Object.assign(readConcern, coll.s.readConcern); + } + + if (Object.keys(readConcern).length > 0) { + Object.assign(command, { readConcern: readConcern }); + } +} + +/** + * Applies an explain to a given command. + * @internal + * + * @param {object} command - the command on which to apply the explain + * @param {Explain} explain - the options containing the explain verbosity + * @return the new command + */ +function decorateWithExplain(command, explain) { + if (command.explain) { + return command; + } + + return { explain: command, verbosity: explain.verbosity }; +} + +const emitProcessWarning = msg => process.emitWarning(msg, 'DeprecationWarning'); +const emitConsoleWarning = msg => console.error(msg); +const emitDeprecationWarning = process.emitWarning ? emitProcessWarning : emitConsoleWarning; + +/** + * Default message handler for generating deprecation warnings. + * + * @param {string} name function name + * @param {string} option option name + * @return {string} warning message + * @ignore + * @api private + */ +function defaultMsgHandler(name, option) { + return `${name} option [${option}] is deprecated and will be removed in a later version.`; +} + +/** + * Deprecates a given function's options. + * + * @param {object} config configuration for deprecation + * @param {string} config.name function name + * @param {Array} config.deprecatedOptions options to deprecate + * @param {number} config.optionsIndex index of options object in function arguments array + * @param {function} [config.msgHandler] optional custom message handler to generate warnings + * @param {function} fn the target function of deprecation + * @return {function} modified function that warns once per deprecated option, and executes original function + * @ignore + * @api private + */ +function deprecateOptions(config, fn) { + if (process.noDeprecation === true) { + return fn; + } + + const msgHandler = config.msgHandler ? config.msgHandler : defaultMsgHandler; + + const optionsWarned = new Set(); + function deprecated() { + const options = arguments[config.optionsIndex]; + + // ensure options is a valid, non-empty object, otherwise short-circuit + if (!isObject(options) || Object.keys(options).length === 0) { + return fn.apply(this, arguments); + } + + config.deprecatedOptions.forEach(deprecatedOption => { + if ( + Object.prototype.hasOwnProperty.call(options, deprecatedOption) && + !optionsWarned.has(deprecatedOption) + ) { + optionsWarned.add(deprecatedOption); + const msg = msgHandler(config.name, deprecatedOption); + emitDeprecationWarning(msg); + if (this && this.getLogger) { + const logger = this.getLogger(); + if (logger) { + logger.warn(msg); + } + } + } + }); + + return fn.apply(this, arguments); + } + + // These lines copied from https://github.com/nodejs/node/blob/25e5ae41688676a5fd29b2e2e7602168eee4ceb5/lib/internal/util.js#L73-L80 + // The wrapper will keep the same prototype as fn to maintain prototype chain + Object.setPrototypeOf(deprecated, fn); + if (fn.prototype) { + // Setting this (rather than using Object.setPrototype, as above) ensures + // that calling the unwrapped constructor gives an instanceof the wrapped + // constructor. + deprecated.prototype = fn.prototype; + } + + return deprecated; +} + +const SUPPORTS = {}; +// Test asyncIterator support +try { + require('./async/async_iterator'); + SUPPORTS.ASYNC_ITERATOR = true; +} catch (e) { + SUPPORTS.ASYNC_ITERATOR = false; +} + +class MongoDBNamespace { + constructor(db, collection) { + this.db = db; + this.collection = collection; + } + + toString() { + return this.collection ? `${this.db}.${this.collection}` : this.db; + } + + withCollection(collection) { + return new MongoDBNamespace(this.db, collection); + } + + static fromString(namespace) { + if (!namespace) { + throw new Error(`Cannot parse namespace from "${namespace}"`); + } + + const index = namespace.indexOf('.'); + return new MongoDBNamespace(namespace.substring(0, index), namespace.substring(index + 1)); + } +} + +function* makeCounter(seed) { + let count = seed || 0; + while (true) { + const newCount = count; + count += 1; + yield newCount; + } +} + +/** + * Helper function for either accepting a callback, or returning a promise + * + * @param {Object} parent an instance of parent with promiseLibrary. + * @param {object} parent.s an object containing promiseLibrary. + * @param {function} parent.s.promiseLibrary an object containing promiseLibrary. + * @param {[Function]} callback an optional callback. + * @param {Function} fn A function that takes a callback + * @returns {Promise|void} Returns nothing if a callback is supplied, else returns a Promise. + */ +function maybePromise(parent, callback, fn) { + const PromiseLibrary = (parent && parent.s && parent.s.promiseLibrary) || Promise; + + let result; + if (typeof callback !== 'function') { + result = new PromiseLibrary((resolve, reject) => { + callback = (err, res) => { + if (err) return reject(err); + resolve(res); + }; + }); + } + + fn(function(err, res) { + if (err != null) { + try { + callback(err); + } catch (error) { + return process.nextTick(() => { + throw error; + }); + } + return; + } + + callback(err, res); + }); + + return result; +} + +function now() { + const hrtime = process.hrtime(); + return Math.floor(hrtime[0] * 1000 + hrtime[1] / 1000000); +} + +function calculateDurationInMs(started) { + if (typeof started !== 'number') { + throw TypeError('numeric value required to calculate duration'); + } + + const elapsed = now() - started; + return elapsed < 0 ? 0 : elapsed; +} + +/** + * Creates an interval timer which is able to be woken up sooner than + * the interval. The timer will also debounce multiple calls to wake + * ensuring that the function is only ever called once within a minimum + * interval window. + * + * @param {function} fn An async function to run on an interval, must accept a `callback` as its only parameter + * @param {object} [options] Optional settings + * @param {number} [options.interval] The interval at which to run the provided function + * @param {number} [options.minInterval] The minimum time which must pass between invocations of the provided function + * @param {boolean} [options.immediate] Execute the function immediately when the interval is started + */ +function makeInterruptableAsyncInterval(fn, options) { + let timerId; + let lastCallTime; + let lastWakeTime; + let stopped = false; + + options = options || {}; + const interval = options.interval || 1000; + const minInterval = options.minInterval || 500; + const immediate = typeof options.immediate === 'boolean' ? options.immediate : false; + const clock = typeof options.clock === 'function' ? options.clock : now; + + function wake() { + const currentTime = clock(); + const timeSinceLastWake = currentTime - lastWakeTime; + const timeSinceLastCall = currentTime - lastCallTime; + const timeUntilNextCall = interval - timeSinceLastCall; + lastWakeTime = currentTime; + + // For the streaming protocol: there is nothing obviously stopping this + // interval from being woken up again while we are waiting "infinitely" + // for `fn` to be called again`. Since the function effectively + // never completes, the `timeUntilNextCall` will continue to grow + // negatively unbounded, so it will never trigger a reschedule here. + + // debounce multiple calls to wake within the `minInterval` + if (timeSinceLastWake < minInterval) { + return; + } + + // reschedule a call as soon as possible, ensuring the call never happens + // faster than the `minInterval` + if (timeUntilNextCall > minInterval) { + reschedule(minInterval); + } + + // This is possible in virtualized environments like AWS Lambda where our + // clock is unreliable. In these cases the timer is "running" but never + // actually completes, so we want to execute immediately and then attempt + // to reschedule. + if (timeUntilNextCall < 0) { + executeAndReschedule(); + } + } + + function stop() { + stopped = true; + if (timerId) { + clearTimeout(timerId); + timerId = null; + } + + lastCallTime = 0; + lastWakeTime = 0; + } + + function reschedule(ms) { + if (stopped) return; + clearTimeout(timerId); + timerId = setTimeout(executeAndReschedule, ms || interval); + } + + function executeAndReschedule() { + lastWakeTime = 0; + lastCallTime = clock(); + + fn(err => { + if (err) throw err; + reschedule(interval); + }); + } + + if (immediate) { + executeAndReschedule(); + } else { + lastCallTime = clock(); + reschedule(); + } + + return { wake, stop }; +} + +function hasAtomicOperators(doc) { + if (Array.isArray(doc)) { + return doc.reduce((err, u) => err || hasAtomicOperators(u), null); + } + + return ( + Object.keys(typeof doc.toBSON !== 'function' ? doc : doc.toBSON()) + .map(k => k[0]) + .indexOf('$') >= 0 + ); +} + +module.exports = { + filterOptions, + mergeOptions, + translateOptions, + shallowClone, + getSingleProperty, + checkCollectionName, + toError, + formattedOrderClause, + parseIndexOptions, + normalizeHintField, + handleCallback, + decorateCommand, + isObject, + debugOptions, + MAX_JS_INT: Number.MAX_SAFE_INTEGER + 1, + mergeOptionsAndWriteConcern, + executeLegacyOperation, + applyRetryableWrites, + applyWriteConcern, + isPromiseLike, + decorateWithCollation, + decorateWithReadConcern, + decorateWithExplain, + deprecateOptions, + SUPPORTS, + MongoDBNamespace, + emitDeprecationWarning, + makeCounter, + maybePromise, + now, + calculateDurationInMs, + makeInterruptableAsyncInterval, + hasAtomicOperators +}; diff --git a/node_modules/mongodb/lib/write_concern.js b/node_modules/mongodb/lib/write_concern.js new file mode 100644 index 00000000..5d0e1701 --- /dev/null +++ b/node_modules/mongodb/lib/write_concern.js @@ -0,0 +1,90 @@ +'use strict'; + +const kWriteConcernKeys = new Set(['w', 'wtimeout', 'j', 'journal', 'fsync']); + +/** + * The **WriteConcern** class is a class that represents a MongoDB WriteConcern. + * @class + * @property {(number|string)} w The write concern + * @property {number} wtimeout The write concern timeout + * @property {boolean} j The journal write concern + * @property {boolean} fsync The file sync write concern + * @see https://docs.mongodb.com/manual/reference/write-concern/index.html + */ +class WriteConcern { + /** + * Constructs a WriteConcern from the write concern properties. + * @param {(number|string)} [w] The write concern + * @param {number} [wtimeout] The write concern timeout + * @param {boolean} [j] The journal write concern + * @param {boolean} [fsync] The file sync write concern + */ + constructor(w, wtimeout, j, fsync) { + if (w != null) { + this.w = w; + } + if (wtimeout != null) { + this.wtimeout = wtimeout; + } + if (j != null) { + this.j = j; + } + if (fsync != null) { + this.fsync = fsync; + } + } + + /** + * Construct a WriteConcern given an options object. + * + * @param {object} [options] The options object from which to extract the write concern. + * @param {(number|string)} [options.w] **Deprecated** Use `options.writeConcern` instead + * @param {number} [options.wtimeout] **Deprecated** Use `options.writeConcern` instead + * @param {boolean} [options.j] **Deprecated** Use `options.writeConcern` instead + * @param {boolean} [options.fsync] **Deprecated** Use `options.writeConcern` instead + * @param {object|WriteConcern} [options.writeConcern] Specify write concern settings. + * @return {WriteConcern} + */ + static fromOptions(options) { + if ( + options == null || + (options.writeConcern == null && + options.w == null && + options.wtimeout == null && + options.j == null && + options.journal == null && + options.fsync == null) + ) { + return; + } + + if (options.writeConcern) { + if (typeof options.writeConcern === 'string') { + return new WriteConcern(options.writeConcern); + } + + if (!Object.keys(options.writeConcern).some(key => kWriteConcernKeys.has(key))) { + return; + } + + return new WriteConcern( + options.writeConcern.w, + options.writeConcern.wtimeout, + options.writeConcern.j || options.writeConcern.journal, + options.writeConcern.fsync + ); + } + + console.warn( + `Top-level use of w, wtimeout, j, and fsync is deprecated. Use writeConcern instead.` + ); + return new WriteConcern( + options.w, + options.wtimeout, + options.j || options.journal, + options.fsync + ); + } +} + +module.exports = WriteConcern; diff --git a/node_modules/mongodb/package.json b/node_modules/mongodb/package.json new file mode 100644 index 00000000..02c121a5 --- /dev/null +++ b/node_modules/mongodb/package.json @@ -0,0 +1,133 @@ +{ + "_from": "mongodb@^3.6.3", + "_id": "mongodb@3.6.4", + "_inBundle": false, + "_integrity": "sha512-Y+Ki9iXE9jI+n9bVtbTOOdK0B95d6wVGSucwtBkvQ+HIvVdTCfpVRp01FDC24uhC/Q2WXQ8Lpq3/zwtB5Op9Qw==", + "_location": "/mongodb", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "mongodb@^3.6.3", + "name": "mongodb", + "escapedName": "mongodb", + "rawSpec": "^3.6.3", + "saveSpec": null, + "fetchSpec": "^3.6.3" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.4.tgz", + "_shasum": "ca59fd65b06831308262372ef9df6b78f9da97be", + "_spec": "mongodb@^3.6.3", + "_where": "C:\\Users\\rin\\Desktop\\final", + "bugs": { + "url": "https://github.com/mongodb/node-mongodb-native/issues" + }, + "bundleDependencies": false, + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + }, + "deprecated": false, + "description": "The official MongoDB driver for Node.js", + "devDependencies": { + "chai": "^4.1.1", + "chai-subset": "^1.6.0", + "chalk": "^2.4.2", + "co": "4.6.0", + "coveralls": "^2.11.6", + "eslint": "^7.10.0", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-es": "^3.0.1", + "eslint-plugin-prettier": "^3.1.3", + "istanbul": "^0.4.5", + "jsdoc": "3.5.5", + "lodash.camelcase": "^4.3.0", + "mocha": "5.2.0", + "mocha-sinon": "^2.1.0", + "mongodb-extjson": "^2.1.1", + "mongodb-mock-server": "^1.0.1", + "prettier": "^1.19.1", + "semver": "^5.5.0", + "sinon": "^4.3.0", + "sinon-chai": "^3.2.0", + "snappy": "^6.3.4", + "spec-xunit-file": "0.0.1-3", + "standard-version": "^8.0.2", + "util.promisify": "^1.0.1", + "worker-farm": "^1.5.0", + "wtfnode": "^0.8.0", + "yargs": "^14.2.0" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js", + "lib" + ], + "homepage": "https://github.com/mongodb/node-mongodb-native", + "keywords": [ + "mongodb", + "driver", + "official" + ], + "license": "Apache-2.0", + "main": "index.js", + "name": "mongodb", + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "aws4": { + "optional": true + } + }, + "peerOptionalDependencies": { + "kerberos": "^1.1.0", + "mongodb-client-encryption": "^1.0.0", + "mongodb-extjson": "^2.1.2", + "snappy": "^6.3.4", + "bson-ext": "^2.0.0" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/mongodb/node-mongodb-native.git" + }, + "scripts": { + "atlas": "mocha --opts '{}' ./test/manual/atlas_connectivity.test.js", + "bench": "node test/benchmarks/driverBench/", + "check:kerberos": "mocha --opts '{}' -t 60000 test/manual/kerberos.test.js", + "check:ldap": "mocha --opts '{}' test/manual/ldap.test.js", + "check:tls": "mocha --opts '{}' test/manual/tls_support.test.js", + "coverage": "istanbul cover mongodb-test-runner -- -t 60000 test/unit test/functional", + "format": "npm run lint -- --fix", + "generate-evergreen": "node .evergreen/generate_evergreen_tasks.js", + "lint": "eslint -v && eslint lib test", + "release": "standard-version -i HISTORY.md", + "test": "npm run lint && mocha --recursive test/functional test/unit", + "test-nolint": "mocha --recursive test/functional test/unit" + }, + "version": "3.6.4" +} diff --git a/node_modules/ms/index.js b/node_modules/ms/index.js new file mode 100644 index 00000000..6a522b16 --- /dev/null +++ b/node_modules/ms/index.js @@ -0,0 +1,152 @@ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isNaN(val) === false) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + if (ms >= d) { + return Math.round(ms / d) + 'd'; + } + if (ms >= h) { + return Math.round(ms / h) + 'h'; + } + if (ms >= m) { + return Math.round(ms / m) + 'm'; + } + if (ms >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + return plural(ms, d, 'day') || + plural(ms, h, 'hour') || + plural(ms, m, 'minute') || + plural(ms, s, 'second') || + ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, n, name) { + if (ms < n) { + return; + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name; + } + return Math.ceil(ms / n) + ' ' + name + 's'; +} diff --git a/node_modules/ms/license.md b/node_modules/ms/license.md new file mode 100644 index 00000000..69b61253 --- /dev/null +++ b/node_modules/ms/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +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/node_modules/ms/package.json b/node_modules/ms/package.json new file mode 100644 index 00000000..359e113a --- /dev/null +++ b/node_modules/ms/package.json @@ -0,0 +1,69 @@ +{ + "_from": "ms@2.0.0", + "_id": "ms@2.0.0", + "_inBundle": false, + "_integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "_location": "/ms", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ms@2.0.0", + "name": "ms", + "escapedName": "ms", + "rawSpec": "2.0.0", + "saveSpec": null, + "fetchSpec": "2.0.0" + }, + "_requiredBy": [ + "/debug" + ], + "_resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "_shasum": "5608aeadfc00be6c2901df5f9861788de0d597c8", + "_spec": "ms@2.0.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\debug", + "bugs": { + "url": "https://github.com/zeit/ms/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Tiny milisecond conversion utility", + "devDependencies": { + "eslint": "3.19.0", + "expect.js": "0.3.1", + "husky": "0.13.3", + "lint-staged": "3.4.1", + "mocha": "3.4.1" + }, + "eslintConfig": { + "extends": "eslint:recommended", + "env": { + "node": true, + "es6": true + } + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/zeit/ms#readme", + "license": "MIT", + "lint-staged": { + "*.js": [ + "npm run lint", + "prettier --single-quote --write", + "git add" + ] + }, + "main": "./index", + "name": "ms", + "repository": { + "type": "git", + "url": "git+https://github.com/zeit/ms.git" + }, + "scripts": { + "lint": "eslint lib/* bin/*", + "precommit": "lint-staged", + "test": "mocha tests.js" + }, + "version": "2.0.0" +} diff --git a/node_modules/ms/readme.md b/node_modules/ms/readme.md new file mode 100644 index 00000000..84a9974c --- /dev/null +++ b/node_modules/ms/readme.md @@ -0,0 +1,51 @@ +# ms + +[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms) +[![Slack Channel](http://zeit-slackin.now.sh/badge.svg)](https://zeit.chat/) + +Use this package to easily convert various time formats to milliseconds. + +## Examples + +```js +ms('2 days') // 172800000 +ms('1d') // 86400000 +ms('10h') // 36000000 +ms('2.5 hrs') // 9000000 +ms('2h') // 7200000 +ms('1m') // 60000 +ms('5s') // 5000 +ms('1y') // 31557600000 +ms('100') // 100 +``` + +### Convert from milliseconds + +```js +ms(60000) // "1m" +ms(2 * 60000) // "2m" +ms(ms('10 hours')) // "10h" +``` + +### Time format written-out + +```js +ms(60000, { long: true }) // "1 minute" +ms(2 * 60000, { long: true }) // "2 minutes" +ms(ms('10 hours'), { long: true }) // "10 hours" +``` + +## Features + +- Works both in [node](https://nodejs.org) and in the browser. +- If a number is supplied to `ms`, a string with a unit is returned. +- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`). +- If you pass a string with a number and a valid unit, the number of equivalent ms is returned. + +## Caught a bug? + +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device +2. Link the package to the global module directory: `npm link` +3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, node will now use your clone of ms! + +As always, you can run the tests using: `npm test` diff --git a/node_modules/negotiator/HISTORY.md b/node_modules/negotiator/HISTORY.md new file mode 100644 index 00000000..6d06c76a --- /dev/null +++ b/node_modules/negotiator/HISTORY.md @@ -0,0 +1,103 @@ +0.6.2 / 2019-04-29 +================== + + * Fix sorting charset, encoding, and language with extra parameters + +0.6.1 / 2016-05-02 +================== + + * perf: improve `Accept` parsing speed + * perf: improve `Accept-Charset` parsing speed + * perf: improve `Accept-Encoding` parsing speed + * perf: improve `Accept-Language` parsing speed + +0.6.0 / 2015-09-29 +================== + + * Fix including type extensions in parameters in `Accept` parsing + * Fix parsing `Accept` parameters with quoted equals + * Fix parsing `Accept` parameters with quoted semicolons + * Lazy-load modules from main entry point + * perf: delay type concatenation until needed + * perf: enable strict mode + * perf: hoist regular expressions + * perf: remove closures getting spec properties + * perf: remove a closure from media type parsing + * perf: remove property delete from media type parsing + +0.5.3 / 2015-05-10 +================== + + * Fix media type parameter matching to be case-insensitive + +0.5.2 / 2015-05-06 +================== + + * Fix comparing media types with quoted values + * Fix splitting media types with quoted commas + +0.5.1 / 2015-02-14 +================== + + * Fix preference sorting to be stable for long acceptable lists + +0.5.0 / 2014-12-18 +================== + + * Fix list return order when large accepted list + * Fix missing identity encoding when q=0 exists + * Remove dynamic building of Negotiator class + +0.4.9 / 2014-10-14 +================== + + * Fix error when media type has invalid parameter + +0.4.8 / 2014-09-28 +================== + + * Fix all negotiations to be case-insensitive + * Stable sort preferences of same quality according to client order + * Support Node.js 0.6 + +0.4.7 / 2014-06-24 +================== + + * Handle invalid provided languages + * Handle invalid provided media types + +0.4.6 / 2014-06-11 +================== + + * Order by specificity when quality is the same + +0.4.5 / 2014-05-29 +================== + + * Fix regression in empty header handling + +0.4.4 / 2014-05-29 +================== + + * Fix behaviors when headers are not present + +0.4.3 / 2014-04-16 +================== + + * Handle slashes on media params correctly + +0.4.2 / 2014-02-28 +================== + + * Fix media type sorting + * Handle media types params strictly + +0.4.1 / 2014-01-16 +================== + + * Use most specific matches + +0.4.0 / 2014-01-09 +================== + + * Remove preferred prefix from methods diff --git a/node_modules/negotiator/LICENSE b/node_modules/negotiator/LICENSE new file mode 100644 index 00000000..ea6b9e2e --- /dev/null +++ b/node_modules/negotiator/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2012-2014 Federico Romero +Copyright (c) 2012-2014 Isaac Z. Schlueter +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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/node_modules/negotiator/README.md b/node_modules/negotiator/README.md new file mode 100644 index 00000000..04a67ff7 --- /dev/null +++ b/node_modules/negotiator/README.md @@ -0,0 +1,203 @@ +# negotiator + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +An HTTP content negotiator for Node.js + +## Installation + +```sh +$ npm install negotiator +``` + +## API + +```js +var Negotiator = require('negotiator') +``` + +### Accept Negotiation + +```js +availableMediaTypes = ['text/html', 'text/plain', 'application/json'] + +// The negotiator constructor receives a request object +negotiator = new Negotiator(request) + +// Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8' + +negotiator.mediaTypes() +// -> ['text/html', 'image/jpeg', 'application/*'] + +negotiator.mediaTypes(availableMediaTypes) +// -> ['text/html', 'application/json'] + +negotiator.mediaType(availableMediaTypes) +// -> 'text/html' +``` + +You can check a working example at `examples/accept.js`. + +#### Methods + +##### mediaType() + +Returns the most preferred media type from the client. + +##### mediaType(availableMediaType) + +Returns the most preferred media type from a list of available media types. + +##### mediaTypes() + +Returns an array of preferred media types ordered by the client preference. + +##### mediaTypes(availableMediaTypes) + +Returns an array of preferred media types ordered by priority from a list of +available media types. + +### Accept-Language Negotiation + +```js +negotiator = new Negotiator(request) + +availableLanguages = ['en', 'es', 'fr'] + +// Let's say Accept-Language header is 'en;q=0.8, es, pt' + +negotiator.languages() +// -> ['es', 'pt', 'en'] + +negotiator.languages(availableLanguages) +// -> ['es', 'en'] + +language = negotiator.language(availableLanguages) +// -> 'es' +``` + +You can check a working example at `examples/language.js`. + +#### Methods + +##### language() + +Returns the most preferred language from the client. + +##### language(availableLanguages) + +Returns the most preferred language from a list of available languages. + +##### languages() + +Returns an array of preferred languages ordered by the client preference. + +##### languages(availableLanguages) + +Returns an array of preferred languages ordered by priority from a list of +available languages. + +### Accept-Charset Negotiation + +```js +availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5'] + +negotiator = new Negotiator(request) + +// Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2' + +negotiator.charsets() +// -> ['utf-8', 'iso-8859-1', 'utf-7'] + +negotiator.charsets(availableCharsets) +// -> ['utf-8', 'iso-8859-1'] + +negotiator.charset(availableCharsets) +// -> 'utf-8' +``` + +You can check a working example at `examples/charset.js`. + +#### Methods + +##### charset() + +Returns the most preferred charset from the client. + +##### charset(availableCharsets) + +Returns the most preferred charset from a list of available charsets. + +##### charsets() + +Returns an array of preferred charsets ordered by the client preference. + +##### charsets(availableCharsets) + +Returns an array of preferred charsets ordered by priority from a list of +available charsets. + +### Accept-Encoding Negotiation + +```js +availableEncodings = ['identity', 'gzip'] + +negotiator = new Negotiator(request) + +// Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5' + +negotiator.encodings() +// -> ['gzip', 'identity', 'compress'] + +negotiator.encodings(availableEncodings) +// -> ['gzip', 'identity'] + +negotiator.encoding(availableEncodings) +// -> 'gzip' +``` + +You can check a working example at `examples/encoding.js`. + +#### Methods + +##### encoding() + +Returns the most preferred encoding from the client. + +##### encoding(availableEncodings) + +Returns the most preferred encoding from a list of available encodings. + +##### encodings() + +Returns an array of preferred encodings ordered by the client preference. + +##### encodings(availableEncodings) + +Returns an array of preferred encodings ordered by priority from a list of +available encodings. + +## See Also + +The [accepts](https://npmjs.org/package/accepts#readme) module builds on +this module and provides an alternative interface, mime type validation, +and more. + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/negotiator.svg +[npm-url]: https://npmjs.org/package/negotiator +[node-version-image]: https://img.shields.io/node/v/negotiator.svg +[node-version-url]: https://nodejs.org/en/download/ +[travis-image]: https://img.shields.io/travis/jshttp/negotiator/master.svg +[travis-url]: https://travis-ci.org/jshttp/negotiator +[coveralls-image]: https://img.shields.io/coveralls/jshttp/negotiator/master.svg +[coveralls-url]: https://coveralls.io/r/jshttp/negotiator?branch=master +[downloads-image]: https://img.shields.io/npm/dm/negotiator.svg +[downloads-url]: https://npmjs.org/package/negotiator diff --git a/node_modules/negotiator/index.js b/node_modules/negotiator/index.js new file mode 100644 index 00000000..8d4f6a22 --- /dev/null +++ b/node_modules/negotiator/index.js @@ -0,0 +1,124 @@ +/*! + * negotiator + * Copyright(c) 2012 Federico Romero + * Copyright(c) 2012-2014 Isaac Z. Schlueter + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Cached loaded submodules. + * @private + */ + +var modules = Object.create(null); + +/** + * Module exports. + * @public + */ + +module.exports = Negotiator; +module.exports.Negotiator = Negotiator; + +/** + * Create a Negotiator instance from a request. + * @param {object} request + * @public + */ + +function Negotiator(request) { + if (!(this instanceof Negotiator)) { + return new Negotiator(request); + } + + this.request = request; +} + +Negotiator.prototype.charset = function charset(available) { + var set = this.charsets(available); + return set && set[0]; +}; + +Negotiator.prototype.charsets = function charsets(available) { + var preferredCharsets = loadModule('charset').preferredCharsets; + return preferredCharsets(this.request.headers['accept-charset'], available); +}; + +Negotiator.prototype.encoding = function encoding(available) { + var set = this.encodings(available); + return set && set[0]; +}; + +Negotiator.prototype.encodings = function encodings(available) { + var preferredEncodings = loadModule('encoding').preferredEncodings; + return preferredEncodings(this.request.headers['accept-encoding'], available); +}; + +Negotiator.prototype.language = function language(available) { + var set = this.languages(available); + return set && set[0]; +}; + +Negotiator.prototype.languages = function languages(available) { + var preferredLanguages = loadModule('language').preferredLanguages; + return preferredLanguages(this.request.headers['accept-language'], available); +}; + +Negotiator.prototype.mediaType = function mediaType(available) { + var set = this.mediaTypes(available); + return set && set[0]; +}; + +Negotiator.prototype.mediaTypes = function mediaTypes(available) { + var preferredMediaTypes = loadModule('mediaType').preferredMediaTypes; + return preferredMediaTypes(this.request.headers.accept, available); +}; + +// Backwards compatibility +Negotiator.prototype.preferredCharset = Negotiator.prototype.charset; +Negotiator.prototype.preferredCharsets = Negotiator.prototype.charsets; +Negotiator.prototype.preferredEncoding = Negotiator.prototype.encoding; +Negotiator.prototype.preferredEncodings = Negotiator.prototype.encodings; +Negotiator.prototype.preferredLanguage = Negotiator.prototype.language; +Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages; +Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType; +Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes; + +/** + * Load the given module. + * @private + */ + +function loadModule(moduleName) { + var module = modules[moduleName]; + + if (module !== undefined) { + return module; + } + + // This uses a switch for static require analysis + switch (moduleName) { + case 'charset': + module = require('./lib/charset'); + break; + case 'encoding': + module = require('./lib/encoding'); + break; + case 'language': + module = require('./lib/language'); + break; + case 'mediaType': + module = require('./lib/mediaType'); + break; + default: + throw new Error('Cannot find module \'' + moduleName + '\''); + } + + // Store to prevent invoking require() + modules[moduleName] = module; + + return module; +} diff --git a/node_modules/negotiator/lib/charset.js b/node_modules/negotiator/lib/charset.js new file mode 100644 index 00000000..cdd01480 --- /dev/null +++ b/node_modules/negotiator/lib/charset.js @@ -0,0 +1,169 @@ +/** + * negotiator + * Copyright(c) 2012 Isaac Z. Schlueter + * Copyright(c) 2014 Federico Romero + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +module.exports = preferredCharsets; +module.exports.preferredCharsets = preferredCharsets; + +/** + * Module variables. + * @private + */ + +var simpleCharsetRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/; + +/** + * Parse the Accept-Charset header. + * @private + */ + +function parseAcceptCharset(accept) { + var accepts = accept.split(','); + + for (var i = 0, j = 0; i < accepts.length; i++) { + var charset = parseCharset(accepts[i].trim(), i); + + if (charset) { + accepts[j++] = charset; + } + } + + // trim accepts + accepts.length = j; + + return accepts; +} + +/** + * Parse a charset from the Accept-Charset header. + * @private + */ + +function parseCharset(str, i) { + var match = simpleCharsetRegExp.exec(str); + if (!match) return null; + + var charset = match[1]; + var q = 1; + if (match[2]) { + var params = match[2].split(';') + for (var j = 0; j < params.length; j++) { + var p = params[j].trim().split('='); + if (p[0] === 'q') { + q = parseFloat(p[1]); + break; + } + } + } + + return { + charset: charset, + q: q, + i: i + }; +} + +/** + * Get the priority of a charset. + * @private + */ + +function getCharsetPriority(charset, accepted, index) { + var priority = {o: -1, q: 0, s: 0}; + + for (var i = 0; i < accepted.length; i++) { + var spec = specify(charset, accepted[i], index); + + if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { + priority = spec; + } + } + + return priority; +} + +/** + * Get the specificity of the charset. + * @private + */ + +function specify(charset, spec, index) { + var s = 0; + if(spec.charset.toLowerCase() === charset.toLowerCase()){ + s |= 1; + } else if (spec.charset !== '*' ) { + return null + } + + return { + i: index, + o: spec.i, + q: spec.q, + s: s + } +} + +/** + * Get the preferred charsets from an Accept-Charset header. + * @public + */ + +function preferredCharsets(accept, provided) { + // RFC 2616 sec 14.2: no header = * + var accepts = parseAcceptCharset(accept === undefined ? '*' : accept || ''); + + if (!provided) { + // sorted list of all charsets + return accepts + .filter(isQuality) + .sort(compareSpecs) + .map(getFullCharset); + } + + var priorities = provided.map(function getPriority(type, index) { + return getCharsetPriority(type, accepts, index); + }); + + // sorted list of accepted charsets + return priorities.filter(isQuality).sort(compareSpecs).map(function getCharset(priority) { + return provided[priorities.indexOf(priority)]; + }); +} + +/** + * Compare two specs. + * @private + */ + +function compareSpecs(a, b) { + return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; +} + +/** + * Get full charset string. + * @private + */ + +function getFullCharset(spec) { + return spec.charset; +} + +/** + * Check if a spec has any quality. + * @private + */ + +function isQuality(spec) { + return spec.q > 0; +} diff --git a/node_modules/negotiator/lib/encoding.js b/node_modules/negotiator/lib/encoding.js new file mode 100644 index 00000000..8432cd77 --- /dev/null +++ b/node_modules/negotiator/lib/encoding.js @@ -0,0 +1,184 @@ +/** + * negotiator + * Copyright(c) 2012 Isaac Z. Schlueter + * Copyright(c) 2014 Federico Romero + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +module.exports = preferredEncodings; +module.exports.preferredEncodings = preferredEncodings; + +/** + * Module variables. + * @private + */ + +var simpleEncodingRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/; + +/** + * Parse the Accept-Encoding header. + * @private + */ + +function parseAcceptEncoding(accept) { + var accepts = accept.split(','); + var hasIdentity = false; + var minQuality = 1; + + for (var i = 0, j = 0; i < accepts.length; i++) { + var encoding = parseEncoding(accepts[i].trim(), i); + + if (encoding) { + accepts[j++] = encoding; + hasIdentity = hasIdentity || specify('identity', encoding); + minQuality = Math.min(minQuality, encoding.q || 1); + } + } + + if (!hasIdentity) { + /* + * If identity doesn't explicitly appear in the accept-encoding header, + * it's added to the list of acceptable encoding with the lowest q + */ + accepts[j++] = { + encoding: 'identity', + q: minQuality, + i: i + }; + } + + // trim accepts + accepts.length = j; + + return accepts; +} + +/** + * Parse an encoding from the Accept-Encoding header. + * @private + */ + +function parseEncoding(str, i) { + var match = simpleEncodingRegExp.exec(str); + if (!match) return null; + + var encoding = match[1]; + var q = 1; + if (match[2]) { + var params = match[2].split(';'); + for (var j = 0; j < params.length; j++) { + var p = params[j].trim().split('='); + if (p[0] === 'q') { + q = parseFloat(p[1]); + break; + } + } + } + + return { + encoding: encoding, + q: q, + i: i + }; +} + +/** + * Get the priority of an encoding. + * @private + */ + +function getEncodingPriority(encoding, accepted, index) { + var priority = {o: -1, q: 0, s: 0}; + + for (var i = 0; i < accepted.length; i++) { + var spec = specify(encoding, accepted[i], index); + + if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { + priority = spec; + } + } + + return priority; +} + +/** + * Get the specificity of the encoding. + * @private + */ + +function specify(encoding, spec, index) { + var s = 0; + if(spec.encoding.toLowerCase() === encoding.toLowerCase()){ + s |= 1; + } else if (spec.encoding !== '*' ) { + return null + } + + return { + i: index, + o: spec.i, + q: spec.q, + s: s + } +}; + +/** + * Get the preferred encodings from an Accept-Encoding header. + * @public + */ + +function preferredEncodings(accept, provided) { + var accepts = parseAcceptEncoding(accept || ''); + + if (!provided) { + // sorted list of all encodings + return accepts + .filter(isQuality) + .sort(compareSpecs) + .map(getFullEncoding); + } + + var priorities = provided.map(function getPriority(type, index) { + return getEncodingPriority(type, accepts, index); + }); + + // sorted list of accepted encodings + return priorities.filter(isQuality).sort(compareSpecs).map(function getEncoding(priority) { + return provided[priorities.indexOf(priority)]; + }); +} + +/** + * Compare two specs. + * @private + */ + +function compareSpecs(a, b) { + return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; +} + +/** + * Get full encoding string. + * @private + */ + +function getFullEncoding(spec) { + return spec.encoding; +} + +/** + * Check if a spec has any quality. + * @private + */ + +function isQuality(spec) { + return spec.q > 0; +} diff --git a/node_modules/negotiator/lib/language.js b/node_modules/negotiator/lib/language.js new file mode 100644 index 00000000..62f737f0 --- /dev/null +++ b/node_modules/negotiator/lib/language.js @@ -0,0 +1,179 @@ +/** + * negotiator + * Copyright(c) 2012 Isaac Z. Schlueter + * Copyright(c) 2014 Federico Romero + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +module.exports = preferredLanguages; +module.exports.preferredLanguages = preferredLanguages; + +/** + * Module variables. + * @private + */ + +var simpleLanguageRegExp = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/; + +/** + * Parse the Accept-Language header. + * @private + */ + +function parseAcceptLanguage(accept) { + var accepts = accept.split(','); + + for (var i = 0, j = 0; i < accepts.length; i++) { + var language = parseLanguage(accepts[i].trim(), i); + + if (language) { + accepts[j++] = language; + } + } + + // trim accepts + accepts.length = j; + + return accepts; +} + +/** + * Parse a language from the Accept-Language header. + * @private + */ + +function parseLanguage(str, i) { + var match = simpleLanguageRegExp.exec(str); + if (!match) return null; + + var prefix = match[1], + suffix = match[2], + full = prefix; + + if (suffix) full += "-" + suffix; + + var q = 1; + if (match[3]) { + var params = match[3].split(';') + for (var j = 0; j < params.length; j++) { + var p = params[j].split('='); + if (p[0] === 'q') q = parseFloat(p[1]); + } + } + + return { + prefix: prefix, + suffix: suffix, + q: q, + i: i, + full: full + }; +} + +/** + * Get the priority of a language. + * @private + */ + +function getLanguagePriority(language, accepted, index) { + var priority = {o: -1, q: 0, s: 0}; + + for (var i = 0; i < accepted.length; i++) { + var spec = specify(language, accepted[i], index); + + if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { + priority = spec; + } + } + + return priority; +} + +/** + * Get the specificity of the language. + * @private + */ + +function specify(language, spec, index) { + var p = parseLanguage(language) + if (!p) return null; + var s = 0; + if(spec.full.toLowerCase() === p.full.toLowerCase()){ + s |= 4; + } else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) { + s |= 2; + } else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) { + s |= 1; + } else if (spec.full !== '*' ) { + return null + } + + return { + i: index, + o: spec.i, + q: spec.q, + s: s + } +}; + +/** + * Get the preferred languages from an Accept-Language header. + * @public + */ + +function preferredLanguages(accept, provided) { + // RFC 2616 sec 14.4: no header = * + var accepts = parseAcceptLanguage(accept === undefined ? '*' : accept || ''); + + if (!provided) { + // sorted list of all languages + return accepts + .filter(isQuality) + .sort(compareSpecs) + .map(getFullLanguage); + } + + var priorities = provided.map(function getPriority(type, index) { + return getLanguagePriority(type, accepts, index); + }); + + // sorted list of accepted languages + return priorities.filter(isQuality).sort(compareSpecs).map(function getLanguage(priority) { + return provided[priorities.indexOf(priority)]; + }); +} + +/** + * Compare two specs. + * @private + */ + +function compareSpecs(a, b) { + return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; +} + +/** + * Get full language string. + * @private + */ + +function getFullLanguage(spec) { + return spec.full; +} + +/** + * Check if a spec has any quality. + * @private + */ + +function isQuality(spec) { + return spec.q > 0; +} diff --git a/node_modules/negotiator/lib/mediaType.js b/node_modules/negotiator/lib/mediaType.js new file mode 100644 index 00000000..67309dd7 --- /dev/null +++ b/node_modules/negotiator/lib/mediaType.js @@ -0,0 +1,294 @@ +/** + * negotiator + * Copyright(c) 2012 Isaac Z. Schlueter + * Copyright(c) 2014 Federico Romero + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +module.exports = preferredMediaTypes; +module.exports.preferredMediaTypes = preferredMediaTypes; + +/** + * Module variables. + * @private + */ + +var simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/; + +/** + * Parse the Accept header. + * @private + */ + +function parseAccept(accept) { + var accepts = splitMediaTypes(accept); + + for (var i = 0, j = 0; i < accepts.length; i++) { + var mediaType = parseMediaType(accepts[i].trim(), i); + + if (mediaType) { + accepts[j++] = mediaType; + } + } + + // trim accepts + accepts.length = j; + + return accepts; +} + +/** + * Parse a media type from the Accept header. + * @private + */ + +function parseMediaType(str, i) { + var match = simpleMediaTypeRegExp.exec(str); + if (!match) return null; + + var params = Object.create(null); + var q = 1; + var subtype = match[2]; + var type = match[1]; + + if (match[3]) { + var kvps = splitParameters(match[3]).map(splitKeyValuePair); + + for (var j = 0; j < kvps.length; j++) { + var pair = kvps[j]; + var key = pair[0].toLowerCase(); + var val = pair[1]; + + // get the value, unwrapping quotes + var value = val && val[0] === '"' && val[val.length - 1] === '"' + ? val.substr(1, val.length - 2) + : val; + + if (key === 'q') { + q = parseFloat(value); + break; + } + + // store parameter + params[key] = value; + } + } + + return { + type: type, + subtype: subtype, + params: params, + q: q, + i: i + }; +} + +/** + * Get the priority of a media type. + * @private + */ + +function getMediaTypePriority(type, accepted, index) { + var priority = {o: -1, q: 0, s: 0}; + + for (var i = 0; i < accepted.length; i++) { + var spec = specify(type, accepted[i], index); + + if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { + priority = spec; + } + } + + return priority; +} + +/** + * Get the specificity of the media type. + * @private + */ + +function specify(type, spec, index) { + var p = parseMediaType(type); + var s = 0; + + if (!p) { + return null; + } + + if(spec.type.toLowerCase() == p.type.toLowerCase()) { + s |= 4 + } else if(spec.type != '*') { + return null; + } + + if(spec.subtype.toLowerCase() == p.subtype.toLowerCase()) { + s |= 2 + } else if(spec.subtype != '*') { + return null; + } + + var keys = Object.keys(spec.params); + if (keys.length > 0) { + if (keys.every(function (k) { + return spec.params[k] == '*' || (spec.params[k] || '').toLowerCase() == (p.params[k] || '').toLowerCase(); + })) { + s |= 1 + } else { + return null + } + } + + return { + i: index, + o: spec.i, + q: spec.q, + s: s, + } +} + +/** + * Get the preferred media types from an Accept header. + * @public + */ + +function preferredMediaTypes(accept, provided) { + // RFC 2616 sec 14.2: no header = */* + var accepts = parseAccept(accept === undefined ? '*/*' : accept || ''); + + if (!provided) { + // sorted list of all types + return accepts + .filter(isQuality) + .sort(compareSpecs) + .map(getFullType); + } + + var priorities = provided.map(function getPriority(type, index) { + return getMediaTypePriority(type, accepts, index); + }); + + // sorted list of accepted types + return priorities.filter(isQuality).sort(compareSpecs).map(function getType(priority) { + return provided[priorities.indexOf(priority)]; + }); +} + +/** + * Compare two specs. + * @private + */ + +function compareSpecs(a, b) { + return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; +} + +/** + * Get full type string. + * @private + */ + +function getFullType(spec) { + return spec.type + '/' + spec.subtype; +} + +/** + * Check if a spec has any quality. + * @private + */ + +function isQuality(spec) { + return spec.q > 0; +} + +/** + * Count the number of quotes in a string. + * @private + */ + +function quoteCount(string) { + var count = 0; + var index = 0; + + while ((index = string.indexOf('"', index)) !== -1) { + count++; + index++; + } + + return count; +} + +/** + * Split a key value pair. + * @private + */ + +function splitKeyValuePair(str) { + var index = str.indexOf('='); + var key; + var val; + + if (index === -1) { + key = str; + } else { + key = str.substr(0, index); + val = str.substr(index + 1); + } + + return [key, val]; +} + +/** + * Split an Accept header into media types. + * @private + */ + +function splitMediaTypes(accept) { + var accepts = accept.split(','); + + for (var i = 1, j = 0; i < accepts.length; i++) { + if (quoteCount(accepts[j]) % 2 == 0) { + accepts[++j] = accepts[i]; + } else { + accepts[j] += ',' + accepts[i]; + } + } + + // trim accepts + accepts.length = j + 1; + + return accepts; +} + +/** + * Split a string of parameters. + * @private + */ + +function splitParameters(str) { + var parameters = str.split(';'); + + for (var i = 1, j = 0; i < parameters.length; i++) { + if (quoteCount(parameters[j]) % 2 == 0) { + parameters[++j] = parameters[i]; + } else { + parameters[j] += ';' + parameters[i]; + } + } + + // trim parameters + parameters.length = j + 1; + + for (var i = 0; i < parameters.length; i++) { + parameters[i] = parameters[i].trim(); + } + + return parameters; +} diff --git a/node_modules/negotiator/package.json b/node_modules/negotiator/package.json new file mode 100644 index 00000000..3a6db029 --- /dev/null +++ b/node_modules/negotiator/package.json @@ -0,0 +1,84 @@ +{ + "_from": "negotiator@0.6.2", + "_id": "negotiator@0.6.2", + "_inBundle": false, + "_integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "_location": "/negotiator", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "negotiator@0.6.2", + "name": "negotiator", + "escapedName": "negotiator", + "rawSpec": "0.6.2", + "saveSpec": null, + "fetchSpec": "0.6.2" + }, + "_requiredBy": [ + "/accepts" + ], + "_resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "_shasum": "feacf7ccf525a77ae9634436a64883ffeca346fb", + "_spec": "negotiator@0.6.2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\accepts", + "bugs": { + "url": "https://github.com/jshttp/negotiator/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Federico Romero", + "email": "federico.romero@outboxlabs.com" + }, + { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + } + ], + "deprecated": false, + "description": "HTTP content negotiation", + "devDependencies": { + "eslint": "5.16.0", + "eslint-plugin-markdown": "1.0.0", + "mocha": "6.1.4", + "nyc": "14.0.0" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "lib/", + "HISTORY.md", + "LICENSE", + "index.js", + "README.md" + ], + "homepage": "https://github.com/jshttp/negotiator#readme", + "keywords": [ + "http", + "content negotiation", + "accept", + "accept-language", + "accept-encoding", + "accept-charset" + ], + "license": "MIT", + "name": "negotiator", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/negotiator.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "test-travis": "nyc --reporter=text npm test" + }, + "version": "0.6.2" +} diff --git a/node_modules/on-finished/HISTORY.md b/node_modules/on-finished/HISTORY.md new file mode 100644 index 00000000..98ff0e99 --- /dev/null +++ b/node_modules/on-finished/HISTORY.md @@ -0,0 +1,88 @@ +2.3.0 / 2015-05-26 +================== + + * Add defined behavior for HTTP `CONNECT` requests + * Add defined behavior for HTTP `Upgrade` requests + * deps: ee-first@1.1.1 + +2.2.1 / 2015-04-22 +================== + + * Fix `isFinished(req)` when data buffered + +2.2.0 / 2014-12-22 +================== + + * Add message object to callback arguments + +2.1.1 / 2014-10-22 +================== + + * Fix handling of pipelined requests + +2.1.0 / 2014-08-16 +================== + + * Check if `socket` is detached + * Return `undefined` for `isFinished` if state unknown + +2.0.0 / 2014-08-16 +================== + + * Add `isFinished` function + * Move to `jshttp` organization + * Remove support for plain socket argument + * Rename to `on-finished` + * Support both `req` and `res` as arguments + * deps: ee-first@1.0.5 + +1.2.2 / 2014-06-10 +================== + + * Reduce listeners added to emitters + - avoids "event emitter leak" warnings when used multiple times on same request + +1.2.1 / 2014-06-08 +================== + + * Fix returned value when already finished + +1.2.0 / 2014-06-05 +================== + + * Call callback when called on already-finished socket + +1.1.4 / 2014-05-27 +================== + + * Support node.js 0.8 + +1.1.3 / 2014-04-30 +================== + + * Make sure errors passed as instanceof `Error` + +1.1.2 / 2014-04-18 +================== + + * Default the `socket` to passed-in object + +1.1.1 / 2014-01-16 +================== + + * Rename module to `finished` + +1.1.0 / 2013-12-25 +================== + + * Call callback when called on already-errored socket + +1.0.1 / 2013-12-20 +================== + + * Actually pass the error to the callback + +1.0.0 / 2013-12-20 +================== + + * Initial release diff --git a/node_modules/on-finished/LICENSE b/node_modules/on-finished/LICENSE new file mode 100644 index 00000000..5931fd23 --- /dev/null +++ b/node_modules/on-finished/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2014 Douglas Christopher Wilson + +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/node_modules/on-finished/README.md b/node_modules/on-finished/README.md new file mode 100644 index 00000000..a0e11574 --- /dev/null +++ b/node_modules/on-finished/README.md @@ -0,0 +1,154 @@ +# on-finished + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Execute a callback when a HTTP request closes, finishes, or errors. + +## Install + +```sh +$ npm install on-finished +``` + +## API + +```js +var onFinished = require('on-finished') +``` + +### onFinished(res, listener) + +Attach a listener to listen for the response to finish. The listener will +be invoked only once when the response finished. If the response finished +to an error, the first argument will contain the error. If the response +has already finished, the listener will be invoked. + +Listening to the end of a response would be used to close things associated +with the response, like open files. + +Listener is invoked as `listener(err, res)`. + +```js +onFinished(res, function (err, res) { + // clean up open fds, etc. + // err contains the error is request error'd +}) +``` + +### onFinished(req, listener) + +Attach a listener to listen for the request to finish. The listener will +be invoked only once when the request finished. If the request finished +to an error, the first argument will contain the error. If the request +has already finished, the listener will be invoked. + +Listening to the end of a request would be used to know when to continue +after reading the data. + +Listener is invoked as `listener(err, req)`. + +```js +var data = '' + +req.setEncoding('utf8') +res.on('data', function (str) { + data += str +}) + +onFinished(req, function (err, req) { + // data is read unless there is err +}) +``` + +### onFinished.isFinished(res) + +Determine if `res` is already finished. This would be useful to check and +not even start certain operations if the response has already finished. + +### onFinished.isFinished(req) + +Determine if `req` is already finished. This would be useful to check and +not even start certain operations if the request has already finished. + +## Special Node.js requests + +### HTTP CONNECT method + +The meaning of the `CONNECT` method from RFC 7231, section 4.3.6: + +> The CONNECT method requests that the recipient establish a tunnel to +> the destination origin server identified by the request-target and, +> if successful, thereafter restrict its behavior to blind forwarding +> of packets, in both directions, until the tunnel is closed. Tunnels +> are commonly used to create an end-to-end virtual connection, through +> one or more proxies, which can then be secured using TLS (Transport +> Layer Security, [RFC5246]). + +In Node.js, these request objects come from the `'connect'` event on +the HTTP server. + +When this module is used on a HTTP `CONNECT` request, the request is +considered "finished" immediately, **due to limitations in the Node.js +interface**. This means if the `CONNECT` request contains a request entity, +the request will be considered "finished" even before it has been read. + +There is no such thing as a response object to a `CONNECT` request in +Node.js, so there is no support for for one. + +### HTTP Upgrade request + +The meaning of the `Upgrade` header from RFC 7230, section 6.1: + +> The "Upgrade" header field is intended to provide a simple mechanism +> for transitioning from HTTP/1.1 to some other protocol on the same +> connection. + +In Node.js, these request objects come from the `'upgrade'` event on +the HTTP server. + +When this module is used on a HTTP request with an `Upgrade` header, the +request is considered "finished" immediately, **due to limitations in the +Node.js interface**. This means if the `Upgrade` request contains a request +entity, the request will be considered "finished" even before it has been +read. + +There is no such thing as a response object to a `Upgrade` request in +Node.js, so there is no support for for one. + +## Example + +The following code ensures that file descriptors are always closed +once the response finishes. + +```js +var destroy = require('destroy') +var http = require('http') +var onFinished = require('on-finished') + +http.createServer(function onRequest(req, res) { + var stream = fs.createReadStream('package.json') + stream.pipe(res) + onFinished(res, function (err) { + destroy(stream) + }) +}) +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/on-finished.svg +[npm-url]: https://npmjs.org/package/on-finished +[node-version-image]: https://img.shields.io/node/v/on-finished.svg +[node-version-url]: http://nodejs.org/download/ +[travis-image]: https://img.shields.io/travis/jshttp/on-finished/master.svg +[travis-url]: https://travis-ci.org/jshttp/on-finished +[coveralls-image]: https://img.shields.io/coveralls/jshttp/on-finished/master.svg +[coveralls-url]: https://coveralls.io/r/jshttp/on-finished?branch=master +[downloads-image]: https://img.shields.io/npm/dm/on-finished.svg +[downloads-url]: https://npmjs.org/package/on-finished diff --git a/node_modules/on-finished/index.js b/node_modules/on-finished/index.js new file mode 100644 index 00000000..9abd98f9 --- /dev/null +++ b/node_modules/on-finished/index.js @@ -0,0 +1,196 @@ +/*! + * on-finished + * Copyright(c) 2013 Jonathan Ong + * Copyright(c) 2014 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = onFinished +module.exports.isFinished = isFinished + +/** + * Module dependencies. + * @private + */ + +var first = require('ee-first') + +/** + * Variables. + * @private + */ + +/* istanbul ignore next */ +var defer = typeof setImmediate === 'function' + ? setImmediate + : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } + +/** + * Invoke callback when the response has finished, useful for + * cleaning up resources afterwards. + * + * @param {object} msg + * @param {function} listener + * @return {object} + * @public + */ + +function onFinished(msg, listener) { + if (isFinished(msg) !== false) { + defer(listener, null, msg) + return msg + } + + // attach the listener to the message + attachListener(msg, listener) + + return msg +} + +/** + * Determine if message is already finished. + * + * @param {object} msg + * @return {boolean} + * @public + */ + +function isFinished(msg) { + var socket = msg.socket + + if (typeof msg.finished === 'boolean') { + // OutgoingMessage + return Boolean(msg.finished || (socket && !socket.writable)) + } + + if (typeof msg.complete === 'boolean') { + // IncomingMessage + return Boolean(msg.upgrade || !socket || !socket.readable || (msg.complete && !msg.readable)) + } + + // don't know + return undefined +} + +/** + * Attach a finished listener to the message. + * + * @param {object} msg + * @param {function} callback + * @private + */ + +function attachFinishedListener(msg, callback) { + var eeMsg + var eeSocket + var finished = false + + function onFinish(error) { + eeMsg.cancel() + eeSocket.cancel() + + finished = true + callback(error) + } + + // finished on first message event + eeMsg = eeSocket = first([[msg, 'end', 'finish']], onFinish) + + function onSocket(socket) { + // remove listener + msg.removeListener('socket', onSocket) + + if (finished) return + if (eeMsg !== eeSocket) return + + // finished on first socket event + eeSocket = first([[socket, 'error', 'close']], onFinish) + } + + if (msg.socket) { + // socket already assigned + onSocket(msg.socket) + return + } + + // wait for socket to be assigned + msg.on('socket', onSocket) + + if (msg.socket === undefined) { + // node.js 0.8 patch + patchAssignSocket(msg, onSocket) + } +} + +/** + * Attach the listener to the message. + * + * @param {object} msg + * @return {function} + * @private + */ + +function attachListener(msg, listener) { + var attached = msg.__onFinished + + // create a private single listener with queue + if (!attached || !attached.queue) { + attached = msg.__onFinished = createListener(msg) + attachFinishedListener(msg, attached) + } + + attached.queue.push(listener) +} + +/** + * Create listener on message. + * + * @param {object} msg + * @return {function} + * @private + */ + +function createListener(msg) { + function listener(err) { + if (msg.__onFinished === listener) msg.__onFinished = null + if (!listener.queue) return + + var queue = listener.queue + listener.queue = null + + for (var i = 0; i < queue.length; i++) { + queue[i](err, msg) + } + } + + listener.queue = [] + + return listener +} + +/** + * Patch ServerResponse.prototype.assignSocket for node.js 0.8. + * + * @param {ServerResponse} res + * @param {function} callback + * @private + */ + +function patchAssignSocket(res, callback) { + var assignSocket = res.assignSocket + + if (typeof assignSocket !== 'function') return + + // res.on('socket', callback) is broken in 0.8 + res.assignSocket = function _assignSocket(socket) { + assignSocket.call(this, socket) + callback(socket) + } +} diff --git a/node_modules/on-finished/package.json b/node_modules/on-finished/package.json new file mode 100644 index 00000000..b69f243a --- /dev/null +++ b/node_modules/on-finished/package.json @@ -0,0 +1,73 @@ +{ + "_from": "on-finished@~2.3.0", + "_id": "on-finished@2.3.0", + "_inBundle": false, + "_integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "_location": "/on-finished", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "on-finished@~2.3.0", + "name": "on-finished", + "escapedName": "on-finished", + "rawSpec": "~2.3.0", + "saveSpec": null, + "fetchSpec": "~2.3.0" + }, + "_requiredBy": [ + "/express", + "/express/body-parser", + "/finalhandler", + "/send" + ], + "_resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "_shasum": "20f1336481b083cd75337992a16971aa2d906947", + "_spec": "on-finished@~2.3.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "bugs": { + "url": "https://github.com/jshttp/on-finished/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "dependencies": { + "ee-first": "1.1.1" + }, + "deprecated": false, + "description": "Execute a callback when a request closes, finishes, or errors", + "devDependencies": { + "istanbul": "0.3.9", + "mocha": "2.2.5" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "index.js" + ], + "homepage": "https://github.com/jshttp/on-finished#readme", + "license": "MIT", + "name": "on-finished", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/on-finished.git" + }, + "scripts": { + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "2.3.0" +} diff --git a/node_modules/parseurl/HISTORY.md b/node_modules/parseurl/HISTORY.md new file mode 100644 index 00000000..8e409541 --- /dev/null +++ b/node_modules/parseurl/HISTORY.md @@ -0,0 +1,58 @@ +1.3.3 / 2019-04-15 +================== + + * Fix Node.js 0.8 return value inconsistencies + +1.3.2 / 2017-09-09 +================== + + * perf: reduce overhead for full URLs + * perf: unroll the "fast-path" `RegExp` + +1.3.1 / 2016-01-17 +================== + + * perf: enable strict mode + +1.3.0 / 2014-08-09 +================== + + * Add `parseurl.original` for parsing `req.originalUrl` with fallback + * Return `undefined` if `req.url` is `undefined` + +1.2.0 / 2014-07-21 +================== + + * Cache URLs based on original value + * Remove no-longer-needed URL mis-parse work-around + * Simplify the "fast-path" `RegExp` + +1.1.3 / 2014-07-08 +================== + + * Fix typo + +1.1.2 / 2014-07-08 +================== + + * Seriously fix Node.js 0.8 compatibility + +1.1.1 / 2014-07-08 +================== + + * Fix Node.js 0.8 compatibility + +1.1.0 / 2014-07-08 +================== + + * Incorporate URL href-only parse fast-path + +1.0.1 / 2014-03-08 +================== + + * Add missing `require` + +1.0.0 / 2014-03-08 +================== + + * Genesis from `connect` diff --git a/node_modules/parseurl/LICENSE b/node_modules/parseurl/LICENSE new file mode 100644 index 00000000..27653d3d --- /dev/null +++ b/node_modules/parseurl/LICENSE @@ -0,0 +1,24 @@ + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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/node_modules/parseurl/README.md b/node_modules/parseurl/README.md new file mode 100644 index 00000000..443e716b --- /dev/null +++ b/node_modules/parseurl/README.md @@ -0,0 +1,133 @@ +# parseurl + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Parse a URL with memoization. + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install parseurl +``` + +## API + +```js +var parseurl = require('parseurl') +``` + +### parseurl(req) + +Parse the URL of the given request object (looks at the `req.url` property) +and return the result. The result is the same as `url.parse` in Node.js core. +Calling this function multiple times on the same `req` where `req.url` does +not change will return a cached parsed object, rather than parsing again. + +### parseurl.original(req) + +Parse the original URL of the given request object and return the result. +This works by trying to parse `req.originalUrl` if it is a string, otherwise +parses `req.url`. The result is the same as `url.parse` in Node.js core. +Calling this function multiple times on the same `req` where `req.originalUrl` +does not change will return a cached parsed object, rather than parsing again. + +## Benchmark + +```bash +$ npm run-script bench + +> parseurl@1.3.3 bench nodejs-parseurl +> node benchmark/index.js + + http_parser@2.8.0 + node@10.6.0 + v8@6.7.288.46-node.13 + uv@1.21.0 + zlib@1.2.11 + ares@1.14.0 + modules@64 + nghttp2@1.32.0 + napi@3 + openssl@1.1.0h + icu@61.1 + unicode@10.0 + cldr@33.0 + tz@2018c + +> node benchmark/fullurl.js + + Parsing URL "http://localhost:8888/foo/bar?user=tj&pet=fluffy" + + 4 tests completed. + + fasturl x 2,207,842 ops/sec ±3.76% (184 runs sampled) + nativeurl - legacy x 507,180 ops/sec ±0.82% (191 runs sampled) + nativeurl - whatwg x 290,044 ops/sec ±1.96% (189 runs sampled) + parseurl x 488,907 ops/sec ±2.13% (192 runs sampled) + +> node benchmark/pathquery.js + + Parsing URL "/foo/bar?user=tj&pet=fluffy" + + 4 tests completed. + + fasturl x 3,812,564 ops/sec ±3.15% (188 runs sampled) + nativeurl - legacy x 2,651,631 ops/sec ±1.68% (189 runs sampled) + nativeurl - whatwg x 161,837 ops/sec ±2.26% (189 runs sampled) + parseurl x 4,166,338 ops/sec ±2.23% (184 runs sampled) + +> node benchmark/samerequest.js + + Parsing URL "/foo/bar?user=tj&pet=fluffy" on same request object + + 4 tests completed. + + fasturl x 3,821,651 ops/sec ±2.42% (185 runs sampled) + nativeurl - legacy x 2,651,162 ops/sec ±1.90% (187 runs sampled) + nativeurl - whatwg x 175,166 ops/sec ±1.44% (188 runs sampled) + parseurl x 14,912,606 ops/sec ±3.59% (183 runs sampled) + +> node benchmark/simplepath.js + + Parsing URL "/foo/bar" + + 4 tests completed. + + fasturl x 12,421,765 ops/sec ±2.04% (191 runs sampled) + nativeurl - legacy x 7,546,036 ops/sec ±1.41% (188 runs sampled) + nativeurl - whatwg x 198,843 ops/sec ±1.83% (189 runs sampled) + parseurl x 24,244,006 ops/sec ±0.51% (194 runs sampled) + +> node benchmark/slash.js + + Parsing URL "/" + + 4 tests completed. + + fasturl x 17,159,456 ops/sec ±3.25% (188 runs sampled) + nativeurl - legacy x 11,635,097 ops/sec ±3.79% (184 runs sampled) + nativeurl - whatwg x 240,693 ops/sec ±0.83% (189 runs sampled) + parseurl x 42,279,067 ops/sec ±0.55% (190 runs sampled) +``` + +## License + + [MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/pillarjs/parseurl/master +[coveralls-url]: https://coveralls.io/r/pillarjs/parseurl?branch=master +[node-image]: https://badgen.net/npm/node/parseurl +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/parseurl +[npm-url]: https://npmjs.org/package/parseurl +[npm-version-image]: https://badgen.net/npm/v/parseurl +[travis-image]: https://badgen.net/travis/pillarjs/parseurl/master +[travis-url]: https://travis-ci.org/pillarjs/parseurl diff --git a/node_modules/parseurl/index.js b/node_modules/parseurl/index.js new file mode 100644 index 00000000..ece72232 --- /dev/null +++ b/node_modules/parseurl/index.js @@ -0,0 +1,158 @@ +/*! + * parseurl + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var url = require('url') +var parse = url.parse +var Url = url.Url + +/** + * Module exports. + * @public + */ + +module.exports = parseurl +module.exports.original = originalurl + +/** + * Parse the `req` url with memoization. + * + * @param {ServerRequest} req + * @return {Object} + * @public + */ + +function parseurl (req) { + var url = req.url + + if (url === undefined) { + // URL is undefined + return undefined + } + + var parsed = req._parsedUrl + + if (fresh(url, parsed)) { + // Return cached URL parse + return parsed + } + + // Parse the URL + parsed = fastparse(url) + parsed._raw = url + + return (req._parsedUrl = parsed) +}; + +/** + * Parse the `req` original url with fallback and memoization. + * + * @param {ServerRequest} req + * @return {Object} + * @public + */ + +function originalurl (req) { + var url = req.originalUrl + + if (typeof url !== 'string') { + // Fallback + return parseurl(req) + } + + var parsed = req._parsedOriginalUrl + + if (fresh(url, parsed)) { + // Return cached URL parse + return parsed + } + + // Parse the URL + parsed = fastparse(url) + parsed._raw = url + + return (req._parsedOriginalUrl = parsed) +}; + +/** + * Parse the `str` url with fast-path short-cut. + * + * @param {string} str + * @return {Object} + * @private + */ + +function fastparse (str) { + if (typeof str !== 'string' || str.charCodeAt(0) !== 0x2f /* / */) { + return parse(str) + } + + var pathname = str + var query = null + var search = null + + // This takes the regexp from https://github.com/joyent/node/pull/7878 + // Which is /^(\/[^?#\s]*)(\?[^#\s]*)?$/ + // And unrolls it into a for loop + for (var i = 1; i < str.length; i++) { + switch (str.charCodeAt(i)) { + case 0x3f: /* ? */ + if (search === null) { + pathname = str.substring(0, i) + query = str.substring(i + 1) + search = str.substring(i) + } + break + case 0x09: /* \t */ + case 0x0a: /* \n */ + case 0x0c: /* \f */ + case 0x0d: /* \r */ + case 0x20: /* */ + case 0x23: /* # */ + case 0xa0: + case 0xfeff: + return parse(str) + } + } + + var url = Url !== undefined + ? new Url() + : {} + + url.path = str + url.href = str + url.pathname = pathname + + if (search !== null) { + url.query = query + url.search = search + } + + return url +} + +/** + * Determine if parsed is still fresh for url. + * + * @param {string} url + * @param {object} parsedUrl + * @return {boolean} + * @private + */ + +function fresh (url, parsedUrl) { + return typeof parsedUrl === 'object' && + parsedUrl !== null && + (Url === undefined || parsedUrl instanceof Url) && + parsedUrl._raw === url +} diff --git a/node_modules/parseurl/package.json b/node_modules/parseurl/package.json new file mode 100644 index 00000000..a456e350 --- /dev/null +++ b/node_modules/parseurl/package.json @@ -0,0 +1,81 @@ +{ + "_from": "parseurl@~1.3.3", + "_id": "parseurl@1.3.3", + "_inBundle": false, + "_integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "_location": "/parseurl", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "parseurl@~1.3.3", + "name": "parseurl", + "escapedName": "parseurl", + "rawSpec": "~1.3.3", + "saveSpec": null, + "fetchSpec": "~1.3.3" + }, + "_requiredBy": [ + "/express", + "/finalhandler", + "/serve-static" + ], + "_resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "_shasum": "9da19e7bee8d12dff0513ed5b76957793bc2e8d4", + "_spec": "parseurl@~1.3.3", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "bugs": { + "url": "https://github.com/pillarjs/parseurl/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "deprecated": false, + "description": "parse a url with memoization", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.1", + "eslint-plugin-node": "7.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "fast-url-parser": "1.1.3", + "istanbul": "0.4.5", + "mocha": "6.1.3" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "README.md", + "index.js" + ], + "homepage": "https://github.com/pillarjs/parseurl#readme", + "license": "MIT", + "name": "parseurl", + "repository": { + "type": "git", + "url": "git+https://github.com/pillarjs/parseurl.git" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint .", + "test": "mocha --check-leaks --bail --reporter spec test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec test/" + }, + "version": "1.3.3" +} diff --git a/node_modules/passport-strategy/.jshintrc b/node_modules/passport-strategy/.jshintrc new file mode 100644 index 00000000..a07354b1 --- /dev/null +++ b/node_modules/passport-strategy/.jshintrc @@ -0,0 +1,20 @@ +{ + "node": true, + + "bitwise": true, + "camelcase": true, + "curly": true, + "forin": true, + "immed": true, + "latedef": true, + "newcap": true, + "noarg": true, + "noempty": true, + "nonew": true, + "quotmark": "single", + "undef": true, + "unused": true, + "trailing": true, + + "laxcomma": true +} diff --git a/node_modules/passport-strategy/.travis.yml b/node_modules/passport-strategy/.travis.yml new file mode 100644 index 00000000..45f86244 --- /dev/null +++ b/node_modules/passport-strategy/.travis.yml @@ -0,0 +1,15 @@ +language: "node_js" +node_js: + - "0.4" + - "0.6" + - "0.8" + - "0.10" + +before_install: + - "npm install istanbul -g" + - "npm install coveralls -g" + +script: "make ci-travis" + +after_success: + - "make submit-coverage-to-coveralls" diff --git a/node_modules/passport-strategy/LICENSE b/node_modules/passport-strategy/LICENSE new file mode 100644 index 00000000..ec885b56 --- /dev/null +++ b/node_modules/passport-strategy/LICENSE @@ -0,0 +1,20 @@ +(The MIT License) + +Copyright (c) 2011-2013 Jared Hanson + +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/node_modules/passport-strategy/README.md b/node_modules/passport-strategy/README.md new file mode 100644 index 00000000..71de07f7 --- /dev/null +++ b/node_modules/passport-strategy/README.md @@ -0,0 +1,61 @@ +# passport-strategy + +[![Build](https://travis-ci.org/jaredhanson/passport-strategy.png)](http://travis-ci.org/jaredhanson/passport-strategy) +[![Coverage](https://coveralls.io/repos/jaredhanson/passport-strategy/badge.png)](https://coveralls.io/r/jaredhanson/passport-strategy) +[![Dependencies](https://david-dm.org/jaredhanson/passport-strategy.png)](http://david-dm.org/jaredhanson/passport-strategy) + + +An abstract class implementing [Passport](http://passportjs.org/)'s strategy +API. + +## Install + + $ npm install passport-strategy + +## Usage + +This module exports an abstract `Strategy` class that is intended to be +subclassed when implementing concrete authentication strategies. Once +implemented, such strategies can be used by applications that utilize Passport +middleware for authentication. + +#### Subclass Strategy + +Create a new `CustomStrategy` constructor which inherits from `Strategy`: + +```javascript +var util = require('util') + , Strategy = require('passport-strategy'); + +function CustomStrategy(...) { + Strategy.call(this); +} + +util.inherits(CustomStrategy, Strategy); +``` + +#### Implement Authentication + +Implement `autheticate()`, performing the necessary operations required by the +authentication scheme or protocol being implemented. + +```javascript +CustomStrategy.prototype.authenticate = function(req, options) { + // TODO: authenticate request +} +``` + +## Tests + + $ npm install + $ npm test + +## Credits + + - [Jared Hanson](http://github.com/jaredhanson) + +## License + +[The MIT License](http://opensource.org/licenses/MIT) + +Copyright (c) 2011-2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> diff --git a/node_modules/passport-strategy/lib/index.js b/node_modules/passport-strategy/lib/index.js new file mode 100644 index 00000000..a6fdfa74 --- /dev/null +++ b/node_modules/passport-strategy/lib/index.js @@ -0,0 +1,15 @@ +/** + * Module dependencies. + */ +var Strategy = require('./strategy'); + + +/** + * Expose `Strategy` directly from package. + */ +exports = module.exports = Strategy; + +/** + * Export constructors. + */ +exports.Strategy = Strategy; diff --git a/node_modules/passport-strategy/lib/strategy.js b/node_modules/passport-strategy/lib/strategy.js new file mode 100644 index 00000000..5a7eb28b --- /dev/null +++ b/node_modules/passport-strategy/lib/strategy.js @@ -0,0 +1,28 @@ +/** + * Creates an instance of `Strategy`. + * + * @constructor + * @api public + */ +function Strategy() { +} + +/** + * Authenticate request. + * + * This function must be overridden by subclasses. In abstract form, it always + * throws an exception. + * + * @param {Object} req The request to authenticate. + * @param {Object} [options] Strategy-specific options. + * @api public + */ +Strategy.prototype.authenticate = function(req, options) { + throw new Error('Strategy#authenticate must be overridden by subclass'); +}; + + +/** + * Expose `Strategy`. + */ +module.exports = Strategy; diff --git a/node_modules/passport-strategy/package.json b/node_modules/passport-strategy/package.json new file mode 100644 index 00000000..48f6db9d --- /dev/null +++ b/node_modules/passport-strategy/package.json @@ -0,0 +1,75 @@ +{ + "_from": "passport-strategy@1.x.x", + "_id": "passport-strategy@1.0.0", + "_inBundle": false, + "_integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=", + "_location": "/passport-strategy", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "passport-strategy@1.x.x", + "name": "passport-strategy", + "escapedName": "passport-strategy", + "rawSpec": "1.x.x", + "saveSpec": null, + "fetchSpec": "1.x.x" + }, + "_requiredBy": [ + "/passport" + ], + "_resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "_shasum": "b5539aa8fc225a3d1ad179476ddf236b440f52e4", + "_spec": "passport-strategy@1.x.x", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\passport", + "author": { + "name": "Jared Hanson", + "email": "jaredhanson@gmail.com", + "url": "http://www.jaredhanson.net/" + }, + "bugs": { + "url": "http://github.com/jaredhanson/passport-strategy/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "An abstract class implementing Passport's strategy API.", + "devDependencies": { + "chai": "1.x.x", + "mocha": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "homepage": "https://github.com/jaredhanson/passport-strategy#readme", + "keywords": [ + "passport", + "strategy" + ], + "licenses": [ + { + "type": "MIT", + "url": "http://www.opensource.org/licenses/MIT" + } + ], + "main": "./lib", + "name": "passport-strategy", + "repository": { + "type": "git", + "url": "git://github.com/jaredhanson/passport-strategy.git" + }, + "scripts": { + "test": "mocha --reporter spec --require test/bootstrap/node test/*.test.js" + }, + "testling": { + "browsers": [ + "chrome/latest" + ], + "harness": "mocha", + "files": [ + "test/bootstrap/testling.js", + "test/*.test.js" + ] + }, + "version": "1.0.0" +} diff --git a/node_modules/passport/LICENSE b/node_modules/passport/LICENSE new file mode 100644 index 00000000..ba9eb282 --- /dev/null +++ b/node_modules/passport/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2011-2019 Jared Hanson + +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/node_modules/passport/README.md b/node_modules/passport/README.md new file mode 100644 index 00000000..09524d7b --- /dev/null +++ b/node_modules/passport/README.md @@ -0,0 +1,160 @@ +[![passport banner](http://cdn.auth0.com/img/passport-banner-github.png)](http://passportjs.org) + +# Passport + +Passport is [Express](http://expressjs.com/)-compatible authentication +middleware for [Node.js](http://nodejs.org/). + +Passport's sole purpose is to authenticate requests, which it does through an +extensible set of plugins known as _strategies_. Passport does not mount +routes or assume any particular database schema, which maximizes flexibility and +allows application-level decisions to be made by the developer. The API is +simple: you provide Passport a request to authenticate, and Passport provides +hooks for controlling what occurs when authentication succeeds or fails. + +Status: +[![Build](https://travis-ci.org/jaredhanson/passport.svg?branch=master)](https://travis-ci.org/jaredhanson/passport) +[![Coverage](https://coveralls.io/repos/jaredhanson/passport/badge.svg?branch=master)](https://coveralls.io/r/jaredhanson/passport) +[![Dependencies](https://david-dm.org/jaredhanson/passport.svg)](https://david-dm.org/jaredhanson/passport) + + +## Install + +``` +$ npm install passport +``` + +## Usage + +#### Strategies + +Passport uses the concept of strategies to authenticate requests. Strategies +can range from verifying username and password credentials, delegated +authentication using [OAuth](http://oauth.net/) (for example, via [Facebook](http://www.facebook.com/) +or [Twitter](http://twitter.com/)), or federated authentication using [OpenID](http://openid.net/). + +Before authenticating requests, the strategy (or strategies) used by an +application must be configured. + +```javascript +passport.use(new LocalStrategy( + function(username, password, done) { + User.findOne({ username: username }, function (err, user) { + if (err) { return done(err); } + if (!user) { return done(null, false); } + if (!user.verifyPassword(password)) { return done(null, false); } + return done(null, user); + }); + } +)); +``` + +There are 480+ strategies. Find the ones you want at: [passportjs.org](http://passportjs.org) + +#### Sessions + +Passport will maintain persistent login sessions. In order for persistent +sessions to work, the authenticated user must be serialized to the session, and +deserialized when subsequent requests are made. + +Passport does not impose any restrictions on how your user records are stored. +Instead, you provide functions to Passport which implements the necessary +serialization and deserialization logic. In a typical application, this will be +as simple as serializing the user ID, and finding the user by ID when +deserializing. + +```javascript +passport.serializeUser(function(user, done) { + done(null, user.id); +}); + +passport.deserializeUser(function(id, done) { + User.findById(id, function (err, user) { + done(err, user); + }); +}); +``` + +#### Middleware + +To use Passport in an [Express](http://expressjs.com/) or +[Connect](http://senchalabs.github.com/connect/)-based application, configure it +with the required `passport.initialize()` middleware. If your application uses +persistent login sessions (recommended, but not required), `passport.session()` +middleware must also be used. + +```javascript +var app = express(); +app.use(require('serve-static')(__dirname + '/../../public')); +app.use(require('cookie-parser')()); +app.use(require('body-parser').urlencoded({ extended: true })); +app.use(require('express-session')({ secret: 'keyboard cat', resave: true, saveUninitialized: true })); +app.use(passport.initialize()); +app.use(passport.session()); +``` + +#### Authenticate Requests + +Passport provides an `authenticate()` function, which is used as route +middleware to authenticate requests. + +```javascript +app.post('/login', + passport.authenticate('local', { failureRedirect: '/login' }), + function(req, res) { + res.redirect('/'); + }); +``` + +## Strategies + +Passport has a comprehensive set of **over 480** authentication strategies +covering social networking, enterprise integration, API services, and more. + +## Search all strategies + +There is a **Strategy Search** at [passportjs.org](http://passportjs.org) + +The following table lists commonly used strategies: + +|Strategy | Protocol |Developer | +|---------------------------------------------------------------|--------------------------|------------------------------------------------| +|[Local](https://github.com/jaredhanson/passport-local) | HTML form |[Jared Hanson](https://github.com/jaredhanson) | +|[OpenID](https://github.com/jaredhanson/passport-openid) | OpenID |[Jared Hanson](https://github.com/jaredhanson) | +|[BrowserID](https://github.com/jaredhanson/passport-browserid) | BrowserID |[Jared Hanson](https://github.com/jaredhanson) | +|[Facebook](https://github.com/jaredhanson/passport-facebook) | OAuth 2.0 |[Jared Hanson](https://github.com/jaredhanson) | +|[Google](https://github.com/jaredhanson/passport-google) | OpenID |[Jared Hanson](https://github.com/jaredhanson) | +|[Google](https://github.com/jaredhanson/passport-google-oauth) | OAuth / OAuth 2.0 |[Jared Hanson](https://github.com/jaredhanson) | +|[Twitter](https://github.com/jaredhanson/passport-twitter) | OAuth |[Jared Hanson](https://github.com/jaredhanson) | +|[Azure Active Directory](https://github.com/AzureAD/passport-azure-ad) | OAuth 2.0 / OpenID / SAML |[Azure](https://github.com/azuread) | + +## Examples + +- For a complete, working example, refer to the [example](https://github.com/passport/express-4.x-local-example) +that uses [passport-local](https://github.com/jaredhanson/passport-local). +- **Local Strategy**: Refer to the following tutorials for setting up user authentication via LocalStrategy (`passport-local`): + - Mongo + - Express v3x - [Tutorial](http://mherman.org/blog/2016/09/25/node-passport-and-postgres/#.V-govpMrJE5) / [working example](https://github.com/mjhea0/passport-local-knex) + - Express v4x - [Tutorial](http://mherman.org/blog/2015/01/31/local-authentication-with-passport-and-express-4/) / [working example](https://github.com/mjhea0/passport-local-express4) + - Postgres + - [Tutorial](http://mherman.org/blog/2015/01/31/local-authentication-with-passport-and-express-4/) / [working example](https://github.com/mjhea0/passport-local-express4) +- **Social Authentication**: Refer to the following tutorials for setting up various social authentication strategies: + - Express v3x - [Tutorial](http://mherman.org/blog/2013/11/10/social-authentication-with-passport-dot-js/) / [working example](https://github.com/mjhea0/passport-examples) + - Express v4x - [Tutorial](http://mherman.org/blog/2015/09/26/social-authentication-in-node-dot-js-with-passport) / [working example](https://github.com/mjhea0/passport-social-auth) + +## Related Modules + +- [Locomotive](https://github.com/jaredhanson/locomotive) — Powerful MVC web framework +- [OAuthorize](https://github.com/jaredhanson/oauthorize) — OAuth service provider toolkit +- [OAuth2orize](https://github.com/jaredhanson/oauth2orize) — OAuth 2.0 authorization server toolkit +- [connect-ensure-login](https://github.com/jaredhanson/connect-ensure-login) — middleware to ensure login sessions + +The [modules](https://github.com/jaredhanson/passport/wiki/Modules) page on the +[wiki](https://github.com/jaredhanson/passport/wiki) lists other useful modules +that build upon or integrate with Passport. + +## License + +[The MIT License](http://opensource.org/licenses/MIT) + +Copyright (c) 2011-2019 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> diff --git a/node_modules/passport/lib/authenticator.js b/node_modules/passport/lib/authenticator.js new file mode 100644 index 00000000..01605469 --- /dev/null +++ b/node_modules/passport/lib/authenticator.js @@ -0,0 +1,471 @@ +/** + * Module dependencies. + */ +var SessionStrategy = require('./strategies/session') + , SessionManager = require('./sessionmanager'); + + +/** + * `Authenticator` constructor. + * + * @api public + */ +function Authenticator() { + this._key = 'passport'; + this._strategies = {}; + this._serializers = []; + this._deserializers = []; + this._infoTransformers = []; + this._framework = null; + this._userProperty = 'user'; + + this.init(); +} + +/** + * Initialize authenticator. + * + * @api protected + */ +Authenticator.prototype.init = function() { + this.framework(require('./framework/connect')()); + this.use(new SessionStrategy(this.deserializeUser.bind(this))); + this._sm = new SessionManager({ key: this._key }, this.serializeUser.bind(this)); +}; + +/** + * Utilize the given `strategy` with optional `name`, overridding the strategy's + * default name. + * + * Examples: + * + * passport.use(new TwitterStrategy(...)); + * + * passport.use('api', new http.BasicStrategy(...)); + * + * @param {String|Strategy} name + * @param {Strategy} strategy + * @return {Authenticator} for chaining + * @api public + */ +Authenticator.prototype.use = function(name, strategy) { + if (!strategy) { + strategy = name; + name = strategy.name; + } + if (!name) { throw new Error('Authentication strategies must have a name'); } + + this._strategies[name] = strategy; + return this; +}; + +/** + * Un-utilize the `strategy` with given `name`. + * + * In typical applications, the necessary authentication strategies are static, + * configured once and always available. As such, there is often no need to + * invoke this function. + * + * However, in certain situations, applications may need dynamically configure + * and de-configure authentication strategies. The `use()`/`unuse()` + * combination satisfies these scenarios. + * + * Examples: + * + * passport.unuse('legacy-api'); + * + * @param {String} name + * @return {Authenticator} for chaining + * @api public + */ +Authenticator.prototype.unuse = function(name) { + delete this._strategies[name]; + return this; +}; + +/** + * Setup Passport to be used under framework. + * + * By default, Passport exposes middleware that operate using Connect-style + * middleware using a `fn(req, res, next)` signature. Other popular frameworks + * have different expectations, and this function allows Passport to be adapted + * to operate within such environments. + * + * If you are using a Connect-compatible framework, including Express, there is + * no need to invoke this function. + * + * Examples: + * + * passport.framework(require('hapi-passport')()); + * + * @param {Object} name + * @return {Authenticator} for chaining + * @api public + */ +Authenticator.prototype.framework = function(fw) { + this._framework = fw; + return this; +}; + +/** + * Passport's primary initialization middleware. + * + * This middleware must be in use by the Connect/Express application for + * Passport to operate. + * + * Options: + * - `userProperty` Property to set on `req` upon login, defaults to _user_ + * + * Examples: + * + * app.use(passport.initialize()); + * + * app.use(passport.initialize({ userProperty: 'currentUser' })); + * + * @param {Object} options + * @return {Function} middleware + * @api public + */ +Authenticator.prototype.initialize = function(options) { + options = options || {}; + this._userProperty = options.userProperty || 'user'; + + return this._framework.initialize(this, options); +}; + +/** + * Middleware that will authenticate a request using the given `strategy` name, + * with optional `options` and `callback`. + * + * Examples: + * + * passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' })(req, res); + * + * passport.authenticate('local', function(err, user) { + * if (!user) { return res.redirect('/login'); } + * res.end('Authenticated!'); + * })(req, res); + * + * passport.authenticate('basic', { session: false })(req, res); + * + * app.get('/auth/twitter', passport.authenticate('twitter'), function(req, res) { + * // request will be redirected to Twitter + * }); + * app.get('/auth/twitter/callback', passport.authenticate('twitter'), function(req, res) { + * res.json(req.user); + * }); + * + * @param {String} strategy + * @param {Object} options + * @param {Function} callback + * @return {Function} middleware + * @api public + */ +Authenticator.prototype.authenticate = function(strategy, options, callback) { + return this._framework.authenticate(this, strategy, options, callback); +}; + +/** + * Middleware that will authorize a third-party account using the given + * `strategy` name, with optional `options`. + * + * If authorization is successful, the result provided by the strategy's verify + * callback will be assigned to `req.account`. The existing login session and + * `req.user` will be unaffected. + * + * This function is particularly useful when connecting third-party accounts + * to the local account of a user that is currently authenticated. + * + * Examples: + * + * passport.authorize('twitter-authz', { failureRedirect: '/account' }); + * + * @param {String} strategy + * @param {Object} options + * @return {Function} middleware + * @api public + */ +Authenticator.prototype.authorize = function(strategy, options, callback) { + options = options || {}; + options.assignProperty = 'account'; + + var fn = this._framework.authorize || this._framework.authenticate; + return fn(this, strategy, options, callback); +}; + +/** + * Middleware that will restore login state from a session. + * + * Web applications typically use sessions to maintain login state between + * requests. For example, a user will authenticate by entering credentials into + * a form which is submitted to the server. If the credentials are valid, a + * login session is established by setting a cookie containing a session + * identifier in the user's web browser. The web browser will send this cookie + * in subsequent requests to the server, allowing a session to be maintained. + * + * If sessions are being utilized, and a login session has been established, + * this middleware will populate `req.user` with the current user. + * + * Note that sessions are not strictly required for Passport to operate. + * However, as a general rule, most web applications will make use of sessions. + * An exception to this rule would be an API server, which expects each HTTP + * request to provide credentials in an Authorization header. + * + * Examples: + * + * app.use(connect.cookieParser()); + * app.use(connect.session({ secret: 'keyboard cat' })); + * app.use(passport.initialize()); + * app.use(passport.session()); + * + * Options: + * - `pauseStream` Pause the request stream before deserializing the user + * object from the session. Defaults to _false_. Should + * be set to true in cases where middleware consuming the + * request body is configured after passport and the + * deserializeUser method is asynchronous. + * + * @param {Object} options + * @return {Function} middleware + * @api public + */ +Authenticator.prototype.session = function(options) { + return this.authenticate('session', options); +}; + +// TODO: Make session manager pluggable +/* +Authenticator.prototype.sessionManager = function(mgr) { + this._sm = mgr; + return this; +} +*/ + +/** + * Registers a function used to serialize user objects into the session. + * + * Examples: + * + * passport.serializeUser(function(user, done) { + * done(null, user.id); + * }); + * + * @api public + */ +Authenticator.prototype.serializeUser = function(fn, req, done) { + if (typeof fn === 'function') { + return this._serializers.push(fn); + } + + // private implementation that traverses the chain of serializers, attempting + // to serialize a user + var user = fn; + + // For backwards compatibility + if (typeof req === 'function') { + done = req; + req = undefined; + } + + var stack = this._serializers; + (function pass(i, err, obj) { + // serializers use 'pass' as an error to skip processing + if ('pass' === err) { + err = undefined; + } + // an error or serialized object was obtained, done + if (err || obj || obj === 0) { return done(err, obj); } + + var layer = stack[i]; + if (!layer) { + return done(new Error('Failed to serialize user into session')); + } + + + function serialized(e, o) { + pass(i + 1, e, o); + } + + try { + var arity = layer.length; + if (arity == 3) { + layer(req, user, serialized); + } else { + layer(user, serialized); + } + } catch(e) { + return done(e); + } + })(0); +}; + +/** + * Registers a function used to deserialize user objects out of the session. + * + * Examples: + * + * passport.deserializeUser(function(id, done) { + * User.findById(id, function (err, user) { + * done(err, user); + * }); + * }); + * + * @api public + */ +Authenticator.prototype.deserializeUser = function(fn, req, done) { + if (typeof fn === 'function') { + return this._deserializers.push(fn); + } + + // private implementation that traverses the chain of deserializers, + // attempting to deserialize a user + var obj = fn; + + // For backwards compatibility + if (typeof req === 'function') { + done = req; + req = undefined; + } + + var stack = this._deserializers; + (function pass(i, err, user) { + // deserializers use 'pass' as an error to skip processing + if ('pass' === err) { + err = undefined; + } + // an error or deserialized user was obtained, done + if (err || user) { return done(err, user); } + // a valid user existed when establishing the session, but that user has + // since been removed + if (user === null || user === false) { return done(null, false); } + + var layer = stack[i]; + if (!layer) { + return done(new Error('Failed to deserialize user out of session')); + } + + + function deserialized(e, u) { + pass(i + 1, e, u); + } + + try { + var arity = layer.length; + if (arity == 3) { + layer(req, obj, deserialized); + } else { + layer(obj, deserialized); + } + } catch(e) { + return done(e); + } + })(0); +}; + +/** + * Registers a function used to transform auth info. + * + * In some circumstances authorization details are contained in authentication + * credentials or loaded as part of verification. + * + * For example, when using bearer tokens for API authentication, the tokens may + * encode (either directly or indirectly in a database), details such as scope + * of access or the client to which the token was issued. + * + * Such authorization details should be enforced separately from authentication. + * Because Passport deals only with the latter, this is the responsiblity of + * middleware or routes further along the chain. However, it is not optimal to + * decode the same data or execute the same database query later. To avoid + * this, Passport accepts optional `info` along with the authenticated `user` + * in a strategy's `success()` action. This info is set at `req.authInfo`, + * where said later middlware or routes can access it. + * + * Optionally, applications can register transforms to proccess this info, + * which take effect prior to `req.authInfo` being set. This is useful, for + * example, when the info contains a client ID. The transform can load the + * client from the database and include the instance in the transformed info, + * allowing the full set of client properties to be convieniently accessed. + * + * If no transforms are registered, `info` supplied by the strategy will be left + * unmodified. + * + * Examples: + * + * passport.transformAuthInfo(function(info, done) { + * Client.findById(info.clientID, function (err, client) { + * info.client = client; + * done(err, info); + * }); + * }); + * + * @api public + */ +Authenticator.prototype.transformAuthInfo = function(fn, req, done) { + if (typeof fn === 'function') { + return this._infoTransformers.push(fn); + } + + // private implementation that traverses the chain of transformers, + // attempting to transform auth info + var info = fn; + + // For backwards compatibility + if (typeof req === 'function') { + done = req; + req = undefined; + } + + var stack = this._infoTransformers; + (function pass(i, err, tinfo) { + // transformers use 'pass' as an error to skip processing + if ('pass' === err) { + err = undefined; + } + // an error or transformed info was obtained, done + if (err || tinfo) { return done(err, tinfo); } + + var layer = stack[i]; + if (!layer) { + // if no transformers are registered (or they all pass), the default + // behavior is to use the un-transformed info as-is + return done(null, info); + } + + + function transformed(e, t) { + pass(i + 1, e, t); + } + + try { + var arity = layer.length; + if (arity == 1) { + // sync + var t = layer(info); + transformed(null, t); + } else if (arity == 3) { + layer(req, info, transformed); + } else { + layer(info, transformed); + } + } catch(e) { + return done(e); + } + })(0); +}; + +/** + * Return strategy with given `name`. + * + * @param {String} name + * @return {Strategy} + * @api private + */ +Authenticator.prototype._strategy = function(name) { + return this._strategies[name]; +}; + + +/** + * Expose `Authenticator`. + */ +module.exports = Authenticator; diff --git a/node_modules/passport/lib/errors/authenticationerror.js b/node_modules/passport/lib/errors/authenticationerror.js new file mode 100644 index 00000000..2b1da147 --- /dev/null +++ b/node_modules/passport/lib/errors/authenticationerror.js @@ -0,0 +1,20 @@ +/** + * `AuthenticationError` error. + * + * @constructor + * @api private + */ +function AuthenticationError(message, status) { + Error.call(this); + Error.captureStackTrace(this, arguments.callee); + this.name = 'AuthenticationError'; + this.message = message; + this.status = status || 401; +} + +// Inherit from `Error`. +AuthenticationError.prototype.__proto__ = Error.prototype; + + +// Expose constructor. +module.exports = AuthenticationError; diff --git a/node_modules/passport/lib/framework/connect.js b/node_modules/passport/lib/framework/connect.js new file mode 100644 index 00000000..5c5beb09 --- /dev/null +++ b/node_modules/passport/lib/framework/connect.js @@ -0,0 +1,39 @@ +/** + * Module dependencies. + */ +var initialize = require('../middleware/initialize') + , authenticate = require('../middleware/authenticate'); + +/** + * Framework support for Connect/Express. + * + * This module provides support for using Passport with Express. It exposes + * middleware that conform to the `fn(req, res, next)` signature and extends + * Node's built-in HTTP request object with useful authentication-related + * functions. + * + * @return {Object} + * @api protected + */ +exports = module.exports = function() { + + // HTTP extensions. + exports.__monkeypatchNode(); + + return { + initialize: initialize, + authenticate: authenticate + }; +}; + +exports.__monkeypatchNode = function() { + var http = require('http'); + var IncomingMessageExt = require('../http/request'); + + http.IncomingMessage.prototype.login = + http.IncomingMessage.prototype.logIn = IncomingMessageExt.logIn; + http.IncomingMessage.prototype.logout = + http.IncomingMessage.prototype.logOut = IncomingMessageExt.logOut; + http.IncomingMessage.prototype.isAuthenticated = IncomingMessageExt.isAuthenticated; + http.IncomingMessage.prototype.isUnauthenticated = IncomingMessageExt.isUnauthenticated; +}; diff --git a/node_modules/passport/lib/http/request.js b/node_modules/passport/lib/http/request.js new file mode 100644 index 00000000..0206abb8 --- /dev/null +++ b/node_modules/passport/lib/http/request.js @@ -0,0 +1,100 @@ +/** + * Module dependencies. + */ +//var http = require('http') +// , req = http.IncomingMessage.prototype; + + +var req = exports = module.exports = {}; + +/** + * Initiate a login session for `user`. + * + * Options: + * - `session` Save login state in session, defaults to _true_ + * + * Examples: + * + * req.logIn(user, { session: false }); + * + * req.logIn(user, function(err) { + * if (err) { throw err; } + * // session saved + * }); + * + * @param {User} user + * @param {Object} options + * @param {Function} done + * @api public + */ +req.login = +req.logIn = function(user, options, done) { + if (typeof options == 'function') { + done = options; + options = {}; + } + options = options || {}; + + var property = 'user'; + if (this._passport && this._passport.instance) { + property = this._passport.instance._userProperty || 'user'; + } + var session = (options.session === undefined) ? true : options.session; + + this[property] = user; + if (session) { + if (!this._passport) { throw new Error('passport.initialize() middleware not in use'); } + if (typeof done != 'function') { throw new Error('req#login requires a callback function'); } + + var self = this; + this._passport.instance._sm.logIn(this, user, function(err) { + if (err) { self[property] = null; return done(err); } + done(); + }); + } else { + done && done(); + } +}; + +/** + * Terminate an existing login session. + * + * @api public + */ +req.logout = +req.logOut = function() { + var property = 'user'; + if (this._passport && this._passport.instance) { + property = this._passport.instance._userProperty || 'user'; + } + + this[property] = null; + if (this._passport) { + this._passport.instance._sm.logOut(this); + } +}; + +/** + * Test if request is authenticated. + * + * @return {Boolean} + * @api public + */ +req.isAuthenticated = function() { + var property = 'user'; + if (this._passport && this._passport.instance) { + property = this._passport.instance._userProperty || 'user'; + } + + return (this[property]) ? true : false; +}; + +/** + * Test if request is unauthenticated. + * + * @return {Boolean} + * @api public + */ +req.isUnauthenticated = function() { + return !this.isAuthenticated(); +}; diff --git a/node_modules/passport/lib/index.js b/node_modules/passport/lib/index.js new file mode 100644 index 00000000..ab174691 --- /dev/null +++ b/node_modules/passport/lib/index.js @@ -0,0 +1,26 @@ +/** + * Module dependencies. + */ +var Passport = require('./authenticator') + , SessionStrategy = require('./strategies/session'); + + +/** + * Export default singleton. + * + * @api public + */ +exports = module.exports = new Passport(); + +/** + * Expose constructors. + */ +exports.Passport = +exports.Authenticator = Passport; +exports.Strategy = require('passport-strategy'); + +/** + * Expose strategies. + */ +exports.strategies = {}; +exports.strategies.SessionStrategy = SessionStrategy; diff --git a/node_modules/passport/lib/middleware/authenticate.js b/node_modules/passport/lib/middleware/authenticate.js new file mode 100644 index 00000000..dc70cfc2 --- /dev/null +++ b/node_modules/passport/lib/middleware/authenticate.js @@ -0,0 +1,369 @@ +/** + * Module dependencies. + */ +var http = require('http') + , IncomingMessageExt = require('../http/request') + , AuthenticationError = require('../errors/authenticationerror'); + + +/** + * Authenticates requests. + * + * Applies the `name`ed strategy (or strategies) to the incoming request, in + * order to authenticate the request. If authentication is successful, the user + * will be logged in and populated at `req.user` and a session will be + * established by default. If authentication fails, an unauthorized response + * will be sent. + * + * Options: + * - `session` Save login state in session, defaults to _true_ + * - `successRedirect` After successful login, redirect to given URL + * - `successMessage` True to store success message in + * req.session.messages, or a string to use as override + * message for success. + * - `successFlash` True to flash success messages or a string to use as a flash + * message for success (overrides any from the strategy itself). + * - `failureRedirect` After failed login, redirect to given URL + * - `failureMessage` True to store failure message in + * req.session.messages, or a string to use as override + * message for failure. + * - `failureFlash` True to flash failure messages or a string to use as a flash + * message for failures (overrides any from the strategy itself). + * - `assignProperty` Assign the object provided by the verify callback to given property + * + * An optional `callback` can be supplied to allow the application to override + * the default manner in which authentication attempts are handled. The + * callback has the following signature, where `user` will be set to the + * authenticated user on a successful authentication attempt, or `false` + * otherwise. An optional `info` argument will be passed, containing additional + * details provided by the strategy's verify callback - this could be information about + * a successful authentication or a challenge message for a failed authentication. + * An optional `status` argument will be passed when authentication fails - this could + * be a HTTP response code for a remote authentication failure or similar. + * + * app.get('/protected', function(req, res, next) { + * passport.authenticate('local', function(err, user, info, status) { + * if (err) { return next(err) } + * if (!user) { return res.redirect('/signin') } + * res.redirect('/account'); + * })(req, res, next); + * }); + * + * Note that if a callback is supplied, it becomes the application's + * responsibility to log-in the user, establish a session, and otherwise perform + * the desired operations. + * + * Examples: + * + * passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }); + * + * passport.authenticate('basic', { session: false }); + * + * passport.authenticate('twitter'); + * + * @param {Strategy|String|Array} name + * @param {Object} options + * @param {Function} callback + * @return {Function} + * @api public + */ +module.exports = function authenticate(passport, name, options, callback) { + if (typeof options == 'function') { + callback = options; + options = {}; + } + options = options || {}; + + var multi = true; + + // Cast `name` to an array, allowing authentication to pass through a chain of + // strategies. The first strategy to succeed, redirect, or error will halt + // the chain. Authentication failures will proceed through each strategy in + // series, ultimately failing if all strategies fail. + // + // This is typically used on API endpoints to allow clients to authenticate + // using their preferred choice of Basic, Digest, token-based schemes, etc. + // It is not feasible to construct a chain of multiple strategies that involve + // redirection (for example both Facebook and Twitter), since the first one to + // redirect will halt the chain. + if (!Array.isArray(name)) { + name = [ name ]; + multi = false; + } + + return function authenticate(req, res, next) { + if (http.IncomingMessage.prototype.logIn + && http.IncomingMessage.prototype.logIn !== IncomingMessageExt.logIn) { + require('../framework/connect').__monkeypatchNode(); + } + + + // accumulator for failures from each strategy in the chain + var failures = []; + + function allFailed() { + if (callback) { + if (!multi) { + return callback(null, false, failures[0].challenge, failures[0].status); + } else { + var challenges = failures.map(function(f) { return f.challenge; }); + var statuses = failures.map(function(f) { return f.status; }); + return callback(null, false, challenges, statuses); + } + } + + // Strategies are ordered by priority. For the purpose of flashing a + // message, the first failure will be displayed. + var failure = failures[0] || {} + , challenge = failure.challenge || {} + , msg; + + if (options.failureFlash) { + var flash = options.failureFlash; + if (typeof flash == 'string') { + flash = { type: 'error', message: flash }; + } + flash.type = flash.type || 'error'; + + var type = flash.type || challenge.type || 'error'; + msg = flash.message || challenge.message || challenge; + if (typeof msg == 'string') { + req.flash(type, msg); + } + } + if (options.failureMessage) { + msg = options.failureMessage; + if (typeof msg == 'boolean') { + msg = challenge.message || challenge; + } + if (typeof msg == 'string') { + req.session.messages = req.session.messages || []; + req.session.messages.push(msg); + } + } + if (options.failureRedirect) { + return res.redirect(options.failureRedirect); + } + + // When failure handling is not delegated to the application, the default + // is to respond with 401 Unauthorized. Note that the WWW-Authenticate + // header will be set according to the strategies in use (see + // actions#fail). If multiple strategies failed, each of their challenges + // will be included in the response. + var rchallenge = [] + , rstatus, status; + + for (var j = 0, len = failures.length; j < len; j++) { + failure = failures[j]; + challenge = failure.challenge; + status = failure.status; + + rstatus = rstatus || status; + if (typeof challenge == 'string') { + rchallenge.push(challenge); + } + } + + res.statusCode = rstatus || 401; + if (res.statusCode == 401 && rchallenge.length) { + res.setHeader('WWW-Authenticate', rchallenge); + } + if (options.failWithError) { + return next(new AuthenticationError(http.STATUS_CODES[res.statusCode], rstatus)); + } + res.end(http.STATUS_CODES[res.statusCode]); + } + + (function attempt(i) { + var layer = name[i]; + // If no more strategies exist in the chain, authentication has failed. + if (!layer) { return allFailed(); } + + // Get the strategy, which will be used as prototype from which to create + // a new instance. Action functions will then be bound to the strategy + // within the context of the HTTP request/response pair. + var strategy, prototype; + if (typeof layer.authenticate == 'function') { + strategy = layer; + } else { + prototype = passport._strategy(layer); + if (!prototype) { return next(new Error('Unknown authentication strategy "' + layer + '"')); } + + strategy = Object.create(prototype); + } + + + // ----- BEGIN STRATEGY AUGMENTATION ----- + // Augment the new strategy instance with action functions. These action + // functions are bound via closure the the request/response pair. The end + // goal of the strategy is to invoke *one* of these action methods, in + // order to indicate successful or failed authentication, redirect to a + // third-party identity provider, etc. + + /** + * Authenticate `user`, with optional `info`. + * + * Strategies should call this function to successfully authenticate a + * user. `user` should be an object supplied by the application after it + * has been given an opportunity to verify credentials. `info` is an + * optional argument containing additional user information. This is + * useful for third-party authentication strategies to pass profile + * details. + * + * @param {Object} user + * @param {Object} info + * @api public + */ + strategy.success = function(user, info) { + if (callback) { + return callback(null, user, info); + } + + info = info || {}; + var msg; + + if (options.successFlash) { + var flash = options.successFlash; + if (typeof flash == 'string') { + flash = { type: 'success', message: flash }; + } + flash.type = flash.type || 'success'; + + var type = flash.type || info.type || 'success'; + msg = flash.message || info.message || info; + if (typeof msg == 'string') { + req.flash(type, msg); + } + } + if (options.successMessage) { + msg = options.successMessage; + if (typeof msg == 'boolean') { + msg = info.message || info; + } + if (typeof msg == 'string') { + req.session.messages = req.session.messages || []; + req.session.messages.push(msg); + } + } + if (options.assignProperty) { + req[options.assignProperty] = user; + return next(); + } + + req.logIn(user, options, function(err) { + if (err) { return next(err); } + + function complete() { + if (options.successReturnToOrRedirect) { + var url = options.successReturnToOrRedirect; + if (req.session && req.session.returnTo) { + url = req.session.returnTo; + delete req.session.returnTo; + } + return res.redirect(url); + } + if (options.successRedirect) { + return res.redirect(options.successRedirect); + } + next(); + } + + if (options.authInfo !== false) { + passport.transformAuthInfo(info, req, function(err, tinfo) { + if (err) { return next(err); } + req.authInfo = tinfo; + complete(); + }); + } else { + complete(); + } + }); + }; + + /** + * Fail authentication, with optional `challenge` and `status`, defaulting + * to 401. + * + * Strategies should call this function to fail an authentication attempt. + * + * @param {String} challenge + * @param {Number} status + * @api public + */ + strategy.fail = function(challenge, status) { + if (typeof challenge == 'number') { + status = challenge; + challenge = undefined; + } + + // push this failure into the accumulator and attempt authentication + // using the next strategy + failures.push({ challenge: challenge, status: status }); + attempt(i + 1); + }; + + /** + * Redirect to `url` with optional `status`, defaulting to 302. + * + * Strategies should call this function to redirect the user (via their + * user agent) to a third-party website for authentication. + * + * @param {String} url + * @param {Number} status + * @api public + */ + strategy.redirect = function(url, status) { + // NOTE: Do not use `res.redirect` from Express, because it can't decide + // what it wants. + // + // Express 2.x: res.redirect(url, status) + // Express 3.x: res.redirect(status, url) -OR- res.redirect(url, status) + // - as of 3.14.0, deprecated warnings are issued if res.redirect(url, status) + // is used + // Express 4.x: res.redirect(status, url) + // - all versions (as of 4.8.7) continue to accept res.redirect(url, status) + // but issue deprecated versions + + res.statusCode = status || 302; + res.setHeader('Location', url); + res.setHeader('Content-Length', '0'); + res.end(); + }; + + /** + * Pass without making a success or fail decision. + * + * Under most circumstances, Strategies should not need to call this + * function. It exists primarily to allow previous authentication state + * to be restored, for example from an HTTP session. + * + * @api public + */ + strategy.pass = function() { + next(); + }; + + /** + * Internal error while performing authentication. + * + * Strategies should call this function when an internal error occurs + * during the process of performing authentication; for example, if the + * user directory is not available. + * + * @param {Error} err + * @api public + */ + strategy.error = function(err) { + if (callback) { + return callback(err); + } + + next(err); + }; + + // ----- END STRATEGY AUGMENTATION ----- + + strategy.authenticate(req, options); + })(0); // attempt + }; +}; diff --git a/node_modules/passport/lib/middleware/initialize.js b/node_modules/passport/lib/middleware/initialize.js new file mode 100644 index 00000000..53ce3d86 --- /dev/null +++ b/node_modules/passport/lib/middleware/initialize.js @@ -0,0 +1,55 @@ +/** + * Passport initialization. + * + * Intializes Passport for incoming requests, allowing authentication strategies + * to be applied. + * + * If sessions are being utilized, applications must set up Passport with + * functions to serialize a user into and out of a session. For example, a + * common pattern is to serialize just the user ID into the session (due to the + * fact that it is desirable to store the minimum amount of data in a session). + * When a subsequent request arrives for the session, the full User object can + * be loaded from the database by ID. + * + * Note that additional middleware is required to persist login state, so we + * must use the `connect.session()` middleware _before_ `passport.initialize()`. + * + * If sessions are being used, this middleware must be in use by the + * Connect/Express application for Passport to operate. If the application is + * entirely stateless (not using sessions), this middleware is not necessary, + * but its use will not have any adverse impact. + * + * Examples: + * + * app.use(connect.cookieParser()); + * app.use(connect.session({ secret: 'keyboard cat' })); + * app.use(passport.initialize()); + * app.use(passport.session()); + * + * passport.serializeUser(function(user, done) { + * done(null, user.id); + * }); + * + * passport.deserializeUser(function(id, done) { + * User.findById(id, function (err, user) { + * done(err, user); + * }); + * }); + * + * @return {Function} + * @api public + */ +module.exports = function initialize(passport) { + + return function initialize(req, res, next) { + req._passport = {}; + req._passport.instance = passport; + + if (req.session && req.session[passport._key]) { + // load data from existing session + req._passport.session = req.session[passport._key]; + } + + next(); + }; +}; diff --git a/node_modules/passport/lib/sessionmanager.js b/node_modules/passport/lib/sessionmanager.js new file mode 100644 index 00000000..0fdbd8bd --- /dev/null +++ b/node_modules/passport/lib/sessionmanager.js @@ -0,0 +1,38 @@ +function SessionManager(options, serializeUser) { + if (typeof options == 'function') { + serializeUser = options; + options = undefined; + } + options = options || {}; + + this._key = options.key || 'passport'; + this._serializeUser = serializeUser; +} + +SessionManager.prototype.logIn = function(req, user, cb) { + var self = this; + this._serializeUser(user, req, function(err, obj) { + if (err) { + return cb(err); + } + if (!req._passport.session) { + req._passport.session = {}; + } + req._passport.session.user = obj; + if (!req.session) { + req.session = {}; + } + req.session[self._key] = req._passport.session; + cb(); + }); +} + +SessionManager.prototype.logOut = function(req, cb) { + if (req._passport && req._passport.session) { + delete req._passport.session.user; + } + cb && cb(); +} + + +module.exports = SessionManager; diff --git a/node_modules/passport/lib/strategies/session.js b/node_modules/passport/lib/strategies/session.js new file mode 100644 index 00000000..92b57923 --- /dev/null +++ b/node_modules/passport/lib/strategies/session.js @@ -0,0 +1,83 @@ +/** + * Module dependencies. + */ +var pause = require('pause') + , util = require('util') + , Strategy = require('passport-strategy'); + + +/** + * `SessionStrategy` constructor. + * + * @api public + */ +function SessionStrategy(options, deserializeUser) { + if (typeof options == 'function') { + deserializeUser = options; + options = undefined; + } + options = options || {}; + + Strategy.call(this); + this.name = 'session'; + this._deserializeUser = deserializeUser; +} + +/** + * Inherit from `Strategy`. + */ +util.inherits(SessionStrategy, Strategy); + +/** + * Authenticate request based on the current session state. + * + * The session authentication strategy uses the session to restore any login + * state across requests. If a login session has been established, `req.user` + * will be populated with the current user. + * + * This strategy is registered automatically by Passport. + * + * @param {Object} req + * @param {Object} options + * @api protected + */ +SessionStrategy.prototype.authenticate = function(req, options) { + if (!req._passport) { return this.error(new Error('passport.initialize() middleware not in use')); } + options = options || {}; + + var self = this, + su; + if (req._passport.session) { + su = req._passport.session.user; + } + + if (su || su === 0) { + // NOTE: Stream pausing is desirable in the case where later middleware is + // listening for events emitted from request. For discussion on the + // matter, refer to: https://github.com/jaredhanson/passport/pull/106 + + var paused = options.pauseStream ? pause(req) : null; + this._deserializeUser(su, req, function(err, user) { + if (err) { return self.error(err); } + if (!user) { + delete req._passport.session.user; + } else { + // TODO: Remove instance access + var property = req._passport.instance._userProperty || 'user'; + req[property] = user; + } + self.pass(); + if (paused) { + paused.resume(); + } + }); + } else { + self.pass(); + } +}; + + +/** + * Expose `SessionStrategy`. + */ +module.exports = SessionStrategy; diff --git a/node_modules/passport/package.json b/node_modules/passport/package.json new file mode 100644 index 00000000..10960664 --- /dev/null +++ b/node_modules/passport/package.json @@ -0,0 +1,76 @@ +{ + "_from": "passport@^0.4.1", + "_id": "passport@0.4.1", + "_inBundle": false, + "_integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "_location": "/passport", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "passport@^0.4.1", + "name": "passport", + "escapedName": "passport", + "rawSpec": "^0.4.1", + "saveSpec": null, + "fetchSpec": "^0.4.1" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "_shasum": "941446a21cb92fc688d97a0861c38ce9f738f270", + "_spec": "passport@^0.4.1", + "_where": "C:\\Users\\rin\\Desktop\\final", + "author": { + "name": "Jared Hanson", + "email": "jaredhanson@gmail.com", + "url": "http://www.jaredhanson.net/" + }, + "bugs": { + "url": "http://github.com/jaredhanson/passport/issues" + }, + "bundleDependencies": false, + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + }, + "deprecated": false, + "description": "Simple, unobtrusive authentication for Node.js.", + "devDependencies": { + "chai": "2.x.x", + "chai-connect-middleware": "0.3.x", + "chai-passport-strategy": "0.2.x", + "make-node": "0.3.x", + "mocha": "2.x.x", + "proxyquire": "1.4.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "homepage": "http://passportjs.org/", + "keywords": [ + "express", + "connect", + "auth", + "authn", + "authentication" + ], + "license": "MIT", + "licenses": [ + { + "type": "MIT", + "url": "http://opensource.org/licenses/MIT" + } + ], + "main": "./lib", + "name": "passport", + "repository": { + "type": "git", + "url": "git://github.com/jaredhanson/passport.git" + }, + "scripts": { + "test": "mocha --reporter spec --require test/bootstrap/node test/*.test.js test/**/*.test.js" + }, + "version": "0.4.1" +} diff --git a/node_modules/path-to-regexp/History.md b/node_modules/path-to-regexp/History.md new file mode 100644 index 00000000..7f658784 --- /dev/null +++ b/node_modules/path-to-regexp/History.md @@ -0,0 +1,36 @@ +0.1.7 / 2015-07-28 +================== + + * Fixed regression with escaped round brackets and matching groups. + +0.1.6 / 2015-06-19 +================== + + * Replace `index` feature by outputting all parameters, unnamed and named. + +0.1.5 / 2015-05-08 +================== + + * Add an index property for position in match result. + +0.1.4 / 2015-03-05 +================== + + * Add license information + +0.1.3 / 2014-07-06 +================== + + * Better array support + * Improved support for trailing slash in non-ending mode + +0.1.0 / 2014-03-06 +================== + + * add options.end + +0.0.2 / 2013-02-10 +================== + + * Update to match current express + * add .license property to component.json diff --git a/node_modules/path-to-regexp/LICENSE b/node_modules/path-to-regexp/LICENSE new file mode 100644 index 00000000..983fbe8a --- /dev/null +++ b/node_modules/path-to-regexp/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + +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/node_modules/path-to-regexp/Readme.md b/node_modules/path-to-regexp/Readme.md new file mode 100644 index 00000000..95452a6e --- /dev/null +++ b/node_modules/path-to-regexp/Readme.md @@ -0,0 +1,35 @@ +# Path-to-RegExp + +Turn an Express-style path string such as `/user/:name` into a regular expression. + +**Note:** This is a legacy branch. You should upgrade to `1.x`. + +## Usage + +```javascript +var pathToRegexp = require('path-to-regexp'); +``` + +### pathToRegexp(path, keys, options) + + - **path** A string in the express format, an array of such strings, or a regular expression + - **keys** An array to be populated with the keys present in the url. Once the function completes, this will be an array of strings. + - **options** + - **options.sensitive** Defaults to false, set this to true to make routes case sensitive + - **options.strict** Defaults to false, set this to true to make the trailing slash matter. + - **options.end** Defaults to true, set this to false to only match the prefix of the URL. + +```javascript +var keys = []; +var exp = pathToRegexp('/foo/:bar', keys); +//keys = ['bar'] +//exp = /^\/foo\/(?:([^\/]+?))\/?$/i +``` + +## Live Demo + +You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.com/express-route-tester/). + +## License + + MIT diff --git a/node_modules/path-to-regexp/index.js b/node_modules/path-to-regexp/index.js new file mode 100644 index 00000000..500d1dad --- /dev/null +++ b/node_modules/path-to-regexp/index.js @@ -0,0 +1,129 @@ +/** + * Expose `pathtoRegexp`. + */ + +module.exports = pathtoRegexp; + +/** + * Match matching groups in a regular expression. + */ +var MATCHING_GROUP_REGEXP = /\((?!\?)/g; + +/** + * Normalize the given path string, + * returning a regular expression. + * + * An empty array should be passed, + * which will contain the placeholder + * key names. For example "/user/:id" will + * then contain ["id"]. + * + * @param {String|RegExp|Array} path + * @param {Array} keys + * @param {Object} options + * @return {RegExp} + * @api private + */ + +function pathtoRegexp(path, keys, options) { + options = options || {}; + keys = keys || []; + var strict = options.strict; + var end = options.end !== false; + var flags = options.sensitive ? '' : 'i'; + var extraOffset = 0; + var keysOffset = keys.length; + var i = 0; + var name = 0; + var m; + + if (path instanceof RegExp) { + while (m = MATCHING_GROUP_REGEXP.exec(path.source)) { + keys.push({ + name: name++, + optional: false, + offset: m.index + }); + } + + return path; + } + + if (Array.isArray(path)) { + // Map array parts into regexps and return their source. We also pass + // the same keys and options instance into every generation to get + // consistent matching groups before we join the sources together. + path = path.map(function (value) { + return pathtoRegexp(value, keys, options).source; + }); + + return new RegExp('(?:' + path.join('|') + ')', flags); + } + + path = ('^' + path + (strict ? '' : path[path.length - 1] === '/' ? '?' : '/?')) + .replace(/\/\(/g, '/(?:') + .replace(/([\/\.])/g, '\\$1') + .replace(/(\\\/)?(\\\.)?:(\w+)(\(.*?\))?(\*)?(\?)?/g, function (match, slash, format, key, capture, star, optional, offset) { + slash = slash || ''; + format = format || ''; + capture = capture || '([^\\/' + format + ']+?)'; + optional = optional || ''; + + keys.push({ + name: key, + optional: !!optional, + offset: offset + extraOffset + }); + + var result = '' + + (optional ? '' : slash) + + '(?:' + + format + (optional ? slash : '') + capture + + (star ? '((?:[\\/' + format + '].+?)?)' : '') + + ')' + + optional; + + extraOffset += result.length - match.length; + + return result; + }) + .replace(/\*/g, function (star, index) { + var len = keys.length + + while (len-- > keysOffset && keys[len].offset > index) { + keys[len].offset += 3; // Replacement length minus asterisk length. + } + + return '(.*)'; + }); + + // This is a workaround for handling unnamed matching groups. + while (m = MATCHING_GROUP_REGEXP.exec(path)) { + var escapeCount = 0; + var index = m.index; + + while (path.charAt(--index) === '\\') { + escapeCount++; + } + + // It's possible to escape the bracket. + if (escapeCount % 2 === 1) { + continue; + } + + if (keysOffset + i === keys.length || keys[keysOffset + i].offset > m.index) { + keys.splice(keysOffset + i, 0, { + name: name++, // Unnamed matching groups must be consistently linear. + optional: false, + offset: m.index + }); + } + + i++; + } + + // If the path is non-ending, match until the end or a slash. + path += (end ? '$' : (path[path.length - 1] === '/' ? '' : '(?=\\/|$)')); + + return new RegExp(path, flags); +}; diff --git a/node_modules/path-to-regexp/package.json b/node_modules/path-to-regexp/package.json new file mode 100644 index 00000000..699e740b --- /dev/null +++ b/node_modules/path-to-regexp/package.json @@ -0,0 +1,59 @@ +{ + "_from": "path-to-regexp@0.1.7", + "_id": "path-to-regexp@0.1.7", + "_inBundle": false, + "_integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "_location": "/path-to-regexp", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "path-to-regexp@0.1.7", + "name": "path-to-regexp", + "escapedName": "path-to-regexp", + "rawSpec": "0.1.7", + "saveSpec": null, + "fetchSpec": "0.1.7" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "_shasum": "df604178005f522f15eb4490e7247a1bfaa67f8c", + "_spec": "path-to-regexp@0.1.7", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "bugs": { + "url": "https://github.com/component/path-to-regexp/issues" + }, + "bundleDependencies": false, + "component": { + "scripts": { + "path-to-regexp": "index.js" + } + }, + "deprecated": false, + "description": "Express style path to RegExp utility", + "devDependencies": { + "istanbul": "^0.2.6", + "mocha": "^1.17.1" + }, + "files": [ + "index.js", + "LICENSE" + ], + "homepage": "https://github.com/component/path-to-regexp#readme", + "keywords": [ + "express", + "regexp" + ], + "license": "MIT", + "name": "path-to-regexp", + "repository": { + "type": "git", + "url": "git+https://github.com/component/path-to-regexp.git" + }, + "scripts": { + "test": "istanbul cover _mocha -- -R spec" + }, + "version": "0.1.7" +} diff --git a/node_modules/pause/.npmignore b/node_modules/pause/.npmignore new file mode 100644 index 00000000..f1250e58 --- /dev/null +++ b/node_modules/pause/.npmignore @@ -0,0 +1,4 @@ +support +test +examples +*.sock diff --git a/node_modules/pause/History.md b/node_modules/pause/History.md new file mode 100644 index 00000000..c8aa68fa --- /dev/null +++ b/node_modules/pause/History.md @@ -0,0 +1,5 @@ + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/pause/Makefile b/node_modules/pause/Makefile new file mode 100644 index 00000000..4e9c8d36 --- /dev/null +++ b/node_modules/pause/Makefile @@ -0,0 +1,7 @@ + +test: + @./node_modules/.bin/mocha \ + --require should \ + --reporter spec + +.PHONY: test \ No newline at end of file diff --git a/node_modules/pause/Readme.md b/node_modules/pause/Readme.md new file mode 100644 index 00000000..1cdd68a2 --- /dev/null +++ b/node_modules/pause/Readme.md @@ -0,0 +1,29 @@ + +# pause + + Pause streams... + +## License + +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> + +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/node_modules/pause/index.js b/node_modules/pause/index.js new file mode 100644 index 00000000..1b7b3794 --- /dev/null +++ b/node_modules/pause/index.js @@ -0,0 +1,29 @@ + +module.exports = function(obj){ + var onData + , onEnd + , events = []; + + // buffer data + obj.on('data', onData = function(data, encoding){ + events.push(['data', data, encoding]); + }); + + // buffer end + obj.on('end', onEnd = function(data, encoding){ + events.push(['end', data, encoding]); + }); + + return { + end: function(){ + obj.removeListener('data', onData); + obj.removeListener('end', onEnd); + }, + resume: function(){ + this.end(); + for (var i = 0, len = events.length; i < len; ++i) { + obj.emit.apply(obj, events[i]); + } + } + }; +}; \ No newline at end of file diff --git a/node_modules/pause/package.json b/node_modules/pause/package.json new file mode 100644 index 00000000..142f496d --- /dev/null +++ b/node_modules/pause/package.json @@ -0,0 +1,41 @@ +{ + "_from": "pause@0.0.1", + "_id": "pause@0.0.1", + "_inBundle": false, + "_integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=", + "_location": "/pause", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "pause@0.0.1", + "name": "pause", + "escapedName": "pause", + "rawSpec": "0.0.1", + "saveSpec": null, + "fetchSpec": "0.0.1" + }, + "_requiredBy": [ + "/passport" + ], + "_resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "_shasum": "1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d", + "_spec": "pause@0.0.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\passport", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Pause streams...", + "devDependencies": { + "mocha": "*", + "should": "*" + }, + "keywords": [], + "main": "index", + "name": "pause", + "version": "0.0.1" +} diff --git a/node_modules/process-nextick-args/index.js b/node_modules/process-nextick-args/index.js new file mode 100644 index 00000000..3eecf114 --- /dev/null +++ b/node_modules/process-nextick-args/index.js @@ -0,0 +1,45 @@ +'use strict'; + +if (typeof process === 'undefined' || + !process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = { nextTick: nextTick }; +} else { + module.exports = process +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} + diff --git a/node_modules/process-nextick-args/license.md b/node_modules/process-nextick-args/license.md new file mode 100644 index 00000000..c67e3532 --- /dev/null +++ b/node_modules/process-nextick-args/license.md @@ -0,0 +1,19 @@ +# Copyright (c) 2015 Calvin Metcalf + +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/node_modules/process-nextick-args/package.json b/node_modules/process-nextick-args/package.json new file mode 100644 index 00000000..e8e9a931 --- /dev/null +++ b/node_modules/process-nextick-args/package.json @@ -0,0 +1,50 @@ +{ + "_from": "process-nextick-args@~2.0.0", + "_id": "process-nextick-args@2.0.1", + "_inBundle": false, + "_integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "_location": "/process-nextick-args", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "process-nextick-args@~2.0.0", + "name": "process-nextick-args", + "escapedName": "process-nextick-args", + "rawSpec": "~2.0.0", + "saveSpec": null, + "fetchSpec": "~2.0.0" + }, + "_requiredBy": [ + "/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "_shasum": "7820d9b16120cc55ca9ae7792680ae7dba6d7fe2", + "_spec": "process-nextick-args@~2.0.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\readable-stream", + "author": "", + "bugs": { + "url": "https://github.com/calvinmetcalf/process-nextick-args/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "process.nextTick but always with args", + "devDependencies": { + "tap": "~0.2.6" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/calvinmetcalf/process-nextick-args", + "license": "MIT", + "main": "index.js", + "name": "process-nextick-args", + "repository": { + "type": "git", + "url": "git+https://github.com/calvinmetcalf/process-nextick-args.git" + }, + "scripts": { + "test": "node test.js" + }, + "version": "2.0.1" +} diff --git a/node_modules/process-nextick-args/readme.md b/node_modules/process-nextick-args/readme.md new file mode 100644 index 00000000..ecb432c9 --- /dev/null +++ b/node_modules/process-nextick-args/readme.md @@ -0,0 +1,18 @@ +process-nextick-args +===== + +[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args) + +```bash +npm install --save process-nextick-args +``` + +Always be able to pass arguments to process.nextTick, no matter the platform + +```js +var pna = require('process-nextick-args'); + +pna.nextTick(function (a, b, c) { + console.log(a, b, c); +}, 'step', 3, 'profit'); +``` diff --git a/node_modules/proxy-addr/HISTORY.md b/node_modules/proxy-addr/HISTORY.md new file mode 100644 index 00000000..be765b7f --- /dev/null +++ b/node_modules/proxy-addr/HISTORY.md @@ -0,0 +1,155 @@ +2.0.6 / 2020-02-24 +================== + + * deps: ipaddr.js@1.9.1 + +2.0.5 / 2019-04-16 +================== + + * deps: ipaddr.js@1.9.0 + +2.0.4 / 2018-07-26 +================== + + * deps: ipaddr.js@1.8.0 + +2.0.3 / 2018-02-19 +================== + + * deps: ipaddr.js@1.6.0 + +2.0.2 / 2017-09-24 +================== + + * deps: forwarded@~0.1.2 + - perf: improve header parsing + - perf: reduce overhead when no `X-Forwarded-For` header + +2.0.1 / 2017-09-10 +================== + + * deps: forwarded@~0.1.1 + - Fix trimming leading / trailing OWS + - perf: hoist regular expression + * deps: ipaddr.js@1.5.2 + +2.0.0 / 2017-08-08 +================== + + * Drop support for Node.js below 0.10 + +1.1.5 / 2017-07-25 +================== + + * Fix array argument being altered + * deps: ipaddr.js@1.4.0 + +1.1.4 / 2017-03-24 +================== + + * deps: ipaddr.js@1.3.0 + +1.1.3 / 2017-01-14 +================== + + * deps: ipaddr.js@1.2.0 + +1.1.2 / 2016-05-29 +================== + + * deps: ipaddr.js@1.1.1 + - Fix IPv6-mapped IPv4 validation edge cases + +1.1.1 / 2016-05-03 +================== + + * Fix regression matching mixed versions against multiple subnets + +1.1.0 / 2016-05-01 +================== + + * Fix accepting various invalid netmasks + - IPv4 netmasks must be contingous + - IPv6 addresses cannot be used as a netmask + * deps: ipaddr.js@1.1.0 + +1.0.10 / 2015-12-09 +=================== + + * deps: ipaddr.js@1.0.5 + - Fix regression in `isValid` with non-string arguments + +1.0.9 / 2015-12-01 +================== + + * deps: ipaddr.js@1.0.4 + - Fix accepting some invalid IPv6 addresses + - Reject CIDRs with negative or overlong masks + * perf: enable strict mode + +1.0.8 / 2015-05-10 +================== + + * deps: ipaddr.js@1.0.1 + +1.0.7 / 2015-03-16 +================== + + * deps: ipaddr.js@0.1.9 + - Fix OOM on certain inputs to `isValid` + +1.0.6 / 2015-02-01 +================== + + * deps: ipaddr.js@0.1.8 + +1.0.5 / 2015-01-08 +================== + + * deps: ipaddr.js@0.1.6 + +1.0.4 / 2014-11-23 +================== + + * deps: ipaddr.js@0.1.5 + - Fix edge cases with `isValid` + +1.0.3 / 2014-09-21 +================== + + * Use `forwarded` npm module + +1.0.2 / 2014-09-18 +================== + + * Fix a global leak when multiple subnets are trusted + * Support Node.js 0.6 + * deps: ipaddr.js@0.1.3 + +1.0.1 / 2014-06-03 +================== + + * Fix links in npm package + +1.0.0 / 2014-05-08 +================== + + * Add `trust` argument to determine proxy trust on + * Accepts custom function + * Accepts IPv4/IPv6 address(es) + * Accepts subnets + * Accepts pre-defined names + * Add optional `trust` argument to `proxyaddr.all` to + stop at first untrusted + * Add `proxyaddr.compile` to pre-compile `trust` function + to make subsequent calls faster + +0.0.1 / 2014-05-04 +================== + + * Fix bad npm publish + +0.0.0 / 2014-05-04 +================== + + * Initial release diff --git a/node_modules/proxy-addr/LICENSE b/node_modules/proxy-addr/LICENSE new file mode 100644 index 00000000..cab251c2 --- /dev/null +++ b/node_modules/proxy-addr/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2016 Douglas Christopher Wilson + +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/node_modules/proxy-addr/README.md b/node_modules/proxy-addr/README.md new file mode 100644 index 00000000..8c176ea5 --- /dev/null +++ b/node_modules/proxy-addr/README.md @@ -0,0 +1,155 @@ +# proxy-addr + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Determine address of proxied request + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install proxy-addr +``` + +## API + + + +```js +var proxyaddr = require('proxy-addr') +``` + +### proxyaddr(req, trust) + +Return the address of the request, using the given `trust` parameter. + +The `trust` argument is a function that returns `true` if you trust +the address, `false` if you don't. The closest untrusted address is +returned. + + + +```js +proxyaddr(req, function (addr) { return addr === '127.0.0.1' }) +proxyaddr(req, function (addr, i) { return i < 1 }) +``` + +The `trust` arugment may also be a single IP address string or an +array of trusted addresses, as plain IP addresses, CIDR-formatted +strings, or IP/netmask strings. + + + +```js +proxyaddr(req, '127.0.0.1') +proxyaddr(req, ['127.0.0.0/8', '10.0.0.0/8']) +proxyaddr(req, ['127.0.0.0/255.0.0.0', '192.168.0.0/255.255.0.0']) +``` + +This module also supports IPv6. Your IPv6 addresses will be normalized +automatically (i.e. `fe80::00ed:1` equals `fe80:0:0:0:0:0:ed:1`). + + + +```js +proxyaddr(req, '::1') +proxyaddr(req, ['::1/128', 'fe80::/10']) +``` + +This module will automatically work with IPv4-mapped IPv6 addresses +as well to support node.js in IPv6-only mode. This means that you do +not have to specify both `::ffff:a00:1` and `10.0.0.1`. + +As a convenience, this module also takes certain pre-defined names +in addition to IP addresses, which expand into IP addresses: + + + +```js +proxyaddr(req, 'loopback') +proxyaddr(req, ['loopback', 'fc00:ac:1ab5:fff::1/64']) +``` + + * `loopback`: IPv4 and IPv6 loopback addresses (like `::1` and + `127.0.0.1`). + * `linklocal`: IPv4 and IPv6 link-local addresses (like + `fe80::1:1:1:1` and `169.254.0.1`). + * `uniquelocal`: IPv4 private addresses and IPv6 unique-local + addresses (like `fc00:ac:1ab5:fff::1` and `192.168.0.1`). + +When `trust` is specified as a function, it will be called for each +address to determine if it is a trusted address. The function is +given two arguments: `addr` and `i`, where `addr` is a string of +the address to check and `i` is a number that represents the distance +from the socket address. + +### proxyaddr.all(req, [trust]) + +Return all the addresses of the request, optionally stopping at the +first untrusted. This array is ordered from closest to furthest +(i.e. `arr[0] === req.connection.remoteAddress`). + + + +```js +proxyaddr.all(req) +``` + +The optional `trust` argument takes the same arguments as `trust` +does in `proxyaddr(req, trust)`. + + + +```js +proxyaddr.all(req, 'loopback') +``` + +### proxyaddr.compile(val) + +Compiles argument `val` into a `trust` function. This function takes +the same arguments as `trust` does in `proxyaddr(req, trust)` and +returns a function suitable for `proxyaddr(req, trust)`. + + + +```js +var trust = proxyaddr.compile('loopback') +var addr = proxyaddr(req, trust) +``` + +This function is meant to be optimized for use against every request. +It is recommend to compile a trust function up-front for the trusted +configuration and pass that to `proxyaddr(req, trust)` for each request. + +## Testing + +```sh +$ npm test +``` + +## Benchmarks + +```sh +$ npm run-script bench +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/proxy-addr/master +[coveralls-url]: https://coveralls.io/r/jshttp/proxy-addr?branch=master +[node-image]: https://badgen.net/npm/node/proxy-addr +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/proxy-addr +[npm-url]: https://npmjs.org/package/proxy-addr +[npm-version-image]: https://badgen.net/npm/v/proxy-addr +[travis-image]: https://badgen.net/travis/jshttp/proxy-addr/master +[travis-url]: https://travis-ci.org/jshttp/proxy-addr diff --git a/node_modules/proxy-addr/index.js b/node_modules/proxy-addr/index.js new file mode 100644 index 00000000..a909b050 --- /dev/null +++ b/node_modules/proxy-addr/index.js @@ -0,0 +1,327 @@ +/*! + * proxy-addr + * Copyright(c) 2014-2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = proxyaddr +module.exports.all = alladdrs +module.exports.compile = compile + +/** + * Module dependencies. + * @private + */ + +var forwarded = require('forwarded') +var ipaddr = require('ipaddr.js') + +/** + * Variables. + * @private + */ + +var DIGIT_REGEXP = /^[0-9]+$/ +var isip = ipaddr.isValid +var parseip = ipaddr.parse + +/** + * Pre-defined IP ranges. + * @private + */ + +var IP_RANGES = { + linklocal: ['169.254.0.0/16', 'fe80::/10'], + loopback: ['127.0.0.1/8', '::1/128'], + uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7'] +} + +/** + * Get all addresses in the request, optionally stopping + * at the first untrusted. + * + * @param {Object} request + * @param {Function|Array|String} [trust] + * @public + */ + +function alladdrs (req, trust) { + // get addresses + var addrs = forwarded(req) + + if (!trust) { + // Return all addresses + return addrs + } + + if (typeof trust !== 'function') { + trust = compile(trust) + } + + for (var i = 0; i < addrs.length - 1; i++) { + if (trust(addrs[i], i)) continue + + addrs.length = i + 1 + } + + return addrs +} + +/** + * Compile argument into trust function. + * + * @param {Array|String} val + * @private + */ + +function compile (val) { + if (!val) { + throw new TypeError('argument is required') + } + + var trust + + if (typeof val === 'string') { + trust = [val] + } else if (Array.isArray(val)) { + trust = val.slice() + } else { + throw new TypeError('unsupported trust argument') + } + + for (var i = 0; i < trust.length; i++) { + val = trust[i] + + if (!Object.prototype.hasOwnProperty.call(IP_RANGES, val)) { + continue + } + + // Splice in pre-defined range + val = IP_RANGES[val] + trust.splice.apply(trust, [i, 1].concat(val)) + i += val.length - 1 + } + + return compileTrust(compileRangeSubnets(trust)) +} + +/** + * Compile `arr` elements into range subnets. + * + * @param {Array} arr + * @private + */ + +function compileRangeSubnets (arr) { + var rangeSubnets = new Array(arr.length) + + for (var i = 0; i < arr.length; i++) { + rangeSubnets[i] = parseipNotation(arr[i]) + } + + return rangeSubnets +} + +/** + * Compile range subnet array into trust function. + * + * @param {Array} rangeSubnets + * @private + */ + +function compileTrust (rangeSubnets) { + // Return optimized function based on length + var len = rangeSubnets.length + return len === 0 + ? trustNone + : len === 1 + ? trustSingle(rangeSubnets[0]) + : trustMulti(rangeSubnets) +} + +/** + * Parse IP notation string into range subnet. + * + * @param {String} note + * @private + */ + +function parseipNotation (note) { + var pos = note.lastIndexOf('/') + var str = pos !== -1 + ? note.substring(0, pos) + : note + + if (!isip(str)) { + throw new TypeError('invalid IP address: ' + str) + } + + var ip = parseip(str) + + if (pos === -1 && ip.kind() === 'ipv6' && ip.isIPv4MappedAddress()) { + // Store as IPv4 + ip = ip.toIPv4Address() + } + + var max = ip.kind() === 'ipv6' + ? 128 + : 32 + + var range = pos !== -1 + ? note.substring(pos + 1, note.length) + : null + + if (range === null) { + range = max + } else if (DIGIT_REGEXP.test(range)) { + range = parseInt(range, 10) + } else if (ip.kind() === 'ipv4' && isip(range)) { + range = parseNetmask(range) + } else { + range = null + } + + if (range <= 0 || range > max) { + throw new TypeError('invalid range on address: ' + note) + } + + return [ip, range] +} + +/** + * Parse netmask string into CIDR range. + * + * @param {String} netmask + * @private + */ + +function parseNetmask (netmask) { + var ip = parseip(netmask) + var kind = ip.kind() + + return kind === 'ipv4' + ? ip.prefixLengthFromSubnetMask() + : null +} + +/** + * Determine address of proxied request. + * + * @param {Object} request + * @param {Function|Array|String} trust + * @public + */ + +function proxyaddr (req, trust) { + if (!req) { + throw new TypeError('req argument is required') + } + + if (!trust) { + throw new TypeError('trust argument is required') + } + + var addrs = alladdrs(req, trust) + var addr = addrs[addrs.length - 1] + + return addr +} + +/** + * Static trust function to trust nothing. + * + * @private + */ + +function trustNone () { + return false +} + +/** + * Compile trust function for multiple subnets. + * + * @param {Array} subnets + * @private + */ + +function trustMulti (subnets) { + return function trust (addr) { + if (!isip(addr)) return false + + var ip = parseip(addr) + var ipconv + var kind = ip.kind() + + for (var i = 0; i < subnets.length; i++) { + var subnet = subnets[i] + var subnetip = subnet[0] + var subnetkind = subnetip.kind() + var subnetrange = subnet[1] + var trusted = ip + + if (kind !== subnetkind) { + if (subnetkind === 'ipv4' && !ip.isIPv4MappedAddress()) { + // Incompatible IP addresses + continue + } + + if (!ipconv) { + // Convert IP to match subnet IP kind + ipconv = subnetkind === 'ipv4' + ? ip.toIPv4Address() + : ip.toIPv4MappedAddress() + } + + trusted = ipconv + } + + if (trusted.match(subnetip, subnetrange)) { + return true + } + } + + return false + } +} + +/** + * Compile trust function for single subnet. + * + * @param {Object} subnet + * @private + */ + +function trustSingle (subnet) { + var subnetip = subnet[0] + var subnetkind = subnetip.kind() + var subnetisipv4 = subnetkind === 'ipv4' + var subnetrange = subnet[1] + + return function trust (addr) { + if (!isip(addr)) return false + + var ip = parseip(addr) + var kind = ip.kind() + + if (kind !== subnetkind) { + if (subnetisipv4 && !ip.isIPv4MappedAddress()) { + // Incompatible IP addresses + return false + } + + // Convert IP to match subnet IP kind + ip = subnetisipv4 + ? ip.toIPv4Address() + : ip.toIPv4MappedAddress() + } + + return ip.match(subnetip, subnetrange) + } +} diff --git a/node_modules/proxy-addr/package.json b/node_modules/proxy-addr/package.json new file mode 100644 index 00000000..13d6e853 --- /dev/null +++ b/node_modules/proxy-addr/package.json @@ -0,0 +1,82 @@ +{ + "_from": "proxy-addr@~2.0.5", + "_id": "proxy-addr@2.0.6", + "_inBundle": false, + "_integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "_location": "/proxy-addr", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "proxy-addr@~2.0.5", + "name": "proxy-addr", + "escapedName": "proxy-addr", + "rawSpec": "~2.0.5", + "saveSpec": null, + "fetchSpec": "~2.0.5" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "_shasum": "fdc2336505447d3f2f2c638ed272caf614bbb2bf", + "_spec": "proxy-addr@~2.0.5", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + "bugs": { + "url": "https://github.com/jshttp/proxy-addr/issues" + }, + "bundleDependencies": false, + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "deprecated": false, + "description": "Determine address of proxied request", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "deep-equal": "1.0.1", + "eslint": "6.8.0", + "eslint-config-standard": "14.1.0", + "eslint-plugin-import": "2.20.1", + "eslint-plugin-markdown": "1.0.1", + "eslint-plugin-node": "11.0.0", + "eslint-plugin-promise": "4.2.1", + "eslint-plugin-standard": "4.0.1", + "mocha": "7.0.1", + "nyc": "15.0.0" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "README.md", + "index.js" + ], + "homepage": "https://github.com/jshttp/proxy-addr#readme", + "keywords": [ + "ip", + "proxy", + "x-forwarded-for" + ], + "license": "MIT", + "name": "proxy-addr", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/proxy-addr.git" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "nyc --reporter=text npm test", + "test-travis": "nyc --reporter=html --reporter=text npm test" + }, + "version": "2.0.6" +} diff --git a/node_modules/qs/.editorconfig b/node_modules/qs/.editorconfig new file mode 100644 index 00000000..a4893ddf --- /dev/null +++ b/node_modules/qs/.editorconfig @@ -0,0 +1,30 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 160 + +[test/*] +max_line_length = off + +[*.md] +max_line_length = off + +[*.json] +max_line_length = off + +[Makefile] +max_line_length = off + +[CHANGELOG.md] +indent_style = space +indent_size = 2 + +[LICENSE] +indent_size = 2 +max_line_length = off diff --git a/node_modules/qs/.eslintignore b/node_modules/qs/.eslintignore new file mode 100644 index 00000000..1521c8b7 --- /dev/null +++ b/node_modules/qs/.eslintignore @@ -0,0 +1 @@ +dist diff --git a/node_modules/qs/.eslintrc b/node_modules/qs/.eslintrc new file mode 100644 index 00000000..e3bde898 --- /dev/null +++ b/node_modules/qs/.eslintrc @@ -0,0 +1,21 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "complexity": 0, + "consistent-return": 1, + "func-name-matching": 0, + "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], + "indent": [2, 4], + "max-lines-per-function": [2, { "max": 150 }], + "max-params": [2, 14], + "max-statements": [2, 52], + "multiline-comment-style": 0, + "no-continue": 1, + "no-magic-numbers": 0, + "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], + "operator-linebreak": [2, "before"], + } +} diff --git a/node_modules/qs/CHANGELOG.md b/node_modules/qs/CHANGELOG.md new file mode 100644 index 00000000..50505c46 --- /dev/null +++ b/node_modules/qs/CHANGELOG.md @@ -0,0 +1,256 @@ +## **6.7.0** +- [New] `stringify`/`parse`: add `comma` as an `arrayFormat` option (#276, #219) +- [Fix] correctly parse nested arrays (#212) +- [Fix] `utils.merge`: avoid a crash with a null target and a truthy non-array source, also with an array source +- [Robustness] `stringify`: cache `Object.prototype.hasOwnProperty` +- [Refactor] `utils`: `isBuffer`: small tweak; add tests +- [Refactor] use cached `Array.isArray` +- [Refactor] `parse`/`stringify`: make a function to normalize the options +- [Refactor] `utils`: reduce observable [[Get]]s +- [Refactor] `stringify`/`utils`: cache `Array.isArray` +- [Tests] always use `String(x)` over `x.toString()` +- [Tests] fix Buffer tests to work in node < 4.5 and node < 5.10 +- [Tests] temporarily allow coverage to fail + +## **6.6.0** +- [New] Add support for iso-8859-1, utf8 "sentinel" and numeric entities (#268) +- [New] move two-value combine to a `utils` function (#189) +- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) +- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` (#260) +- [Fix] `stringify`: do not crash in an obscure combo of `interpretNumericEntities`, a bad custom `decoder`, & `iso-8859-1` +- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided +- [refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) +- [Refactor] `parse`: only need to reassign the var once +- [Refactor] `parse`/`stringify`: clean up `charset` options checking; fix defaults +- [Refactor] add missing defaults +- [Refactor] `parse`: one less `concat` call +- [Refactor] `utils`: `compactQueue`: make it explicitly side-effecting +- [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`, `iconv-lite`, `safe-publish-latest`, `tape` +- [Tests] up to `node` `v10.10`, `v9.11`, `v8.12`, `v6.14`, `v4.9`; pin included builds to LTS + +## **6.5.2** +- [Fix] use `safer-buffer` instead of `Buffer` constructor +- [Refactor] utils: `module.exports` one thing, instead of mutating `exports` (#230) +- [Dev Deps] update `browserify`, `eslint`, `iconv-lite`, `safer-buffer`, `tape`, `browserify` + +## **6.5.1** +- [Fix] Fix parsing & compacting very deep objects (#224) +- [Refactor] name utils functions +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` +- [Tests] up to `node` `v8.4`; use `nvm install-latest-npm` so newer npm doesn’t break older node +- [Tests] Use precise dist for Node.js 0.6 runtime (#225) +- [Tests] make 0.6 required, now that it’s passing +- [Tests] on `node` `v8.2`; fix npm on node 0.6 + +## **6.5.0** +- [New] add `utils.assign` +- [New] pass default encoder/decoder to custom encoder/decoder functions (#206) +- [New] `parse`/`stringify`: add `ignoreQueryPrefix`/`addQueryPrefix` options, respectively (#213) +- [Fix] Handle stringifying empty objects with addQueryPrefix (#217) +- [Fix] do not mutate `options` argument (#207) +- [Refactor] `parse`: cache index to reuse in else statement (#182) +- [Docs] add various badges to readme (#208) +- [Dev Deps] update `eslint`, `browserify`, `iconv-lite`, `tape` +- [Tests] up to `node` `v8.1`, `v7.10`, `v6.11`; npm v4.6 breaks on node < v1; npm v5+ breaks on node < v4 +- [Tests] add `editorconfig-tools` + +## **6.4.0** +- [New] `qs.stringify`: add `encodeValuesOnly` option +- [Fix] follow `allowPrototypes` option during merge (#201, #201) +- [Fix] support keys starting with brackets (#202, #200) +- [Fix] chmod a-x +- [Dev Deps] update `eslint` +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds +- [eslint] reduce warnings + +## **6.3.2** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Dev Deps] update `eslint` +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.3.1** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties (thanks, @snyk!) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `browserify`, `iconv-lite`, `qs-iconv`, `tape` +- [Tests] on all node minors; improve test matrix +- [Docs] document stringify option `allowDots` (#195) +- [Docs] add empty object and array values example (#195) +- [Docs] Fix minor inconsistency/typo (#192) +- [Docs] document stringify option `sort` (#191) +- [Refactor] `stringify`: throw faster with an invalid encoder +- [Refactor] remove unnecessary escapes (#184) +- Remove contributing.md, since `qs` is no longer part of `hapi` (#183) + +## **6.3.0** +- [New] Add support for RFC 1738 (#174, #173) +- [New] `stringify`: Add `serializeDate` option to customize Date serialization (#159) +- [Fix] ensure `utils.merge` handles merging two arrays +- [Refactor] only constructors should be capitalized +- [Refactor] capitalized var names are for constructors only +- [Refactor] avoid using a sparse array +- [Robustness] `formats`: cache `String#replace` +- [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`; add `safe-publish-latest` +- [Tests] up to `node` `v6.8`, `v4.6`; improve test matrix +- [Tests] flesh out arrayLimit/arrayFormat tests (#107) +- [Tests] skip Object.create tests when null objects are not available +- [Tests] Turn on eslint for test files (#175) + +## **6.2.3** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.2.2** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties + +## **6.2.1** +- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values +- [Refactor] Be explicit and use `Object.prototype.hasOwnProperty.call` +- [Tests] remove `parallelshell` since it does not reliably report failures +- [Tests] up to `node` `v6.3`, `v5.12` +- [Dev Deps] update `tape`, `eslint`, `@ljharb/eslint-config`, `qs-iconv` + +## [**6.2.0**](https://github.com/ljharb/qs/issues?milestone=36&state=closed) +- [New] pass Buffers to the encoder/decoder directly (#161) +- [New] add "encoder" and "decoder" options, for custom param encoding/decoding (#160) +- [Fix] fix compacting of nested sparse arrays (#150) + +## **6.1.2 +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.1.1** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties + +## [**6.1.0**](https://github.com/ljharb/qs/issues?milestone=35&state=closed) +- [New] allowDots option for `stringify` (#151) +- [Fix] "sort" option should work at a depth of 3 or more (#151) +- [Fix] Restore `dist` directory; will be removed in v7 (#148) + +## **6.0.4** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.0.3** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties +- [Fix] Restore `dist` directory; will be removed in v7 (#148) + +## [**6.0.2**](https://github.com/ljharb/qs/issues?milestone=33&state=closed) +- Revert ES6 requirement and restore support for node down to v0.8. + +## [**6.0.1**](https://github.com/ljharb/qs/issues?milestone=32&state=closed) +- [**#127**](https://github.com/ljharb/qs/pull/127) Fix engines definition in package.json + +## [**6.0.0**](https://github.com/ljharb/qs/issues?milestone=31&state=closed) +- [**#124**](https://github.com/ljharb/qs/issues/124) Use ES6 and drop support for node < v4 + +## **5.2.1** +- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values + +## [**5.2.0**](https://github.com/ljharb/qs/issues?milestone=30&state=closed) +- [**#64**](https://github.com/ljharb/qs/issues/64) Add option to sort object keys in the query string + +## [**5.1.0**](https://github.com/ljharb/qs/issues?milestone=29&state=closed) +- [**#117**](https://github.com/ljharb/qs/issues/117) make URI encoding stringified results optional +- [**#106**](https://github.com/ljharb/qs/issues/106) Add flag `skipNulls` to optionally skip null values in stringify + +## [**5.0.0**](https://github.com/ljharb/qs/issues?milestone=28&state=closed) +- [**#114**](https://github.com/ljharb/qs/issues/114) default allowDots to false +- [**#100**](https://github.com/ljharb/qs/issues/100) include dist to npm + +## [**4.0.0**](https://github.com/ljharb/qs/issues?milestone=26&state=closed) +- [**#98**](https://github.com/ljharb/qs/issues/98) make returning plain objects and allowing prototype overwriting properties optional + +## [**3.1.0**](https://github.com/ljharb/qs/issues?milestone=24&state=closed) +- [**#89**](https://github.com/ljharb/qs/issues/89) Add option to disable "Transform dot notation to bracket notation" + +## [**3.0.0**](https://github.com/ljharb/qs/issues?milestone=23&state=closed) +- [**#80**](https://github.com/ljharb/qs/issues/80) qs.parse silently drops properties +- [**#77**](https://github.com/ljharb/qs/issues/77) Perf boost +- [**#60**](https://github.com/ljharb/qs/issues/60) Add explicit option to disable array parsing +- [**#74**](https://github.com/ljharb/qs/issues/74) Bad parse when turning array into object +- [**#81**](https://github.com/ljharb/qs/issues/81) Add a `filter` option +- [**#68**](https://github.com/ljharb/qs/issues/68) Fixed issue with recursion and passing strings into objects. +- [**#66**](https://github.com/ljharb/qs/issues/66) Add mixed array and object dot notation support Closes: #47 +- [**#76**](https://github.com/ljharb/qs/issues/76) RFC 3986 +- [**#85**](https://github.com/ljharb/qs/issues/85) No equal sign +- [**#84**](https://github.com/ljharb/qs/issues/84) update license attribute + +## [**2.4.1**](https://github.com/ljharb/qs/issues?milestone=20&state=closed) +- [**#73**](https://github.com/ljharb/qs/issues/73) Property 'hasOwnProperty' of object # is not a function + +## [**2.4.0**](https://github.com/ljharb/qs/issues?milestone=19&state=closed) +- [**#70**](https://github.com/ljharb/qs/issues/70) Add arrayFormat option + +## [**2.3.3**](https://github.com/ljharb/qs/issues?milestone=18&state=closed) +- [**#59**](https://github.com/ljharb/qs/issues/59) make sure array indexes are >= 0, closes #57 +- [**#58**](https://github.com/ljharb/qs/issues/58) make qs usable for browser loader + +## [**2.3.2**](https://github.com/ljharb/qs/issues?milestone=17&state=closed) +- [**#55**](https://github.com/ljharb/qs/issues/55) allow merging a string into an object + +## [**2.3.1**](https://github.com/ljharb/qs/issues?milestone=16&state=closed) +- [**#52**](https://github.com/ljharb/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError". + +## [**2.3.0**](https://github.com/ljharb/qs/issues?milestone=15&state=closed) +- [**#50**](https://github.com/ljharb/qs/issues/50) add option to omit array indices, closes #46 + +## [**2.2.5**](https://github.com/ljharb/qs/issues?milestone=14&state=closed) +- [**#39**](https://github.com/ljharb/qs/issues/39) Is there an alternative to Buffer.isBuffer? +- [**#49**](https://github.com/ljharb/qs/issues/49) refactor utils.merge, fixes #45 +- [**#41**](https://github.com/ljharb/qs/issues/41) avoid browserifying Buffer, for #39 + +## [**2.2.4**](https://github.com/ljharb/qs/issues?milestone=13&state=closed) +- [**#38**](https://github.com/ljharb/qs/issues/38) how to handle object keys beginning with a number + +## [**2.2.3**](https://github.com/ljharb/qs/issues?milestone=12&state=closed) +- [**#37**](https://github.com/ljharb/qs/issues/37) parser discards first empty value in array +- [**#36**](https://github.com/ljharb/qs/issues/36) Update to lab 4.x + +## [**2.2.2**](https://github.com/ljharb/qs/issues?milestone=11&state=closed) +- [**#33**](https://github.com/ljharb/qs/issues/33) Error when plain object in a value +- [**#34**](https://github.com/ljharb/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty +- [**#24**](https://github.com/ljharb/qs/issues/24) Changelog? Semver? + +## [**2.2.1**](https://github.com/ljharb/qs/issues?milestone=10&state=closed) +- [**#32**](https://github.com/ljharb/qs/issues/32) account for circular references properly, closes #31 +- [**#31**](https://github.com/ljharb/qs/issues/31) qs.parse stackoverflow on circular objects + +## [**2.2.0**](https://github.com/ljharb/qs/issues?milestone=9&state=closed) +- [**#26**](https://github.com/ljharb/qs/issues/26) Don't use Buffer global if it's not present +- [**#30**](https://github.com/ljharb/qs/issues/30) Bug when merging non-object values into arrays +- [**#29**](https://github.com/ljharb/qs/issues/29) Don't call Utils.clone at the top of Utils.merge +- [**#23**](https://github.com/ljharb/qs/issues/23) Ability to not limit parameters? + +## [**2.1.0**](https://github.com/ljharb/qs/issues?milestone=8&state=closed) +- [**#22**](https://github.com/ljharb/qs/issues/22) Enable using a RegExp as delimiter + +## [**2.0.0**](https://github.com/ljharb/qs/issues?milestone=7&state=closed) +- [**#18**](https://github.com/ljharb/qs/issues/18) Why is there arrayLimit? +- [**#20**](https://github.com/ljharb/qs/issues/20) Configurable parametersLimit +- [**#21**](https://github.com/ljharb/qs/issues/21) make all limits optional, for #18, for #20 + +## [**1.2.2**](https://github.com/ljharb/qs/issues?milestone=6&state=closed) +- [**#19**](https://github.com/ljharb/qs/issues/19) Don't overwrite null values + +## [**1.2.1**](https://github.com/ljharb/qs/issues?milestone=5&state=closed) +- [**#16**](https://github.com/ljharb/qs/issues/16) ignore non-string delimiters +- [**#15**](https://github.com/ljharb/qs/issues/15) Close code block + +## [**1.2.0**](https://github.com/ljharb/qs/issues?milestone=4&state=closed) +- [**#12**](https://github.com/ljharb/qs/issues/12) Add optional delim argument +- [**#13**](https://github.com/ljharb/qs/issues/13) fix #11: flattened keys in array are now correctly parsed + +## [**1.1.0**](https://github.com/ljharb/qs/issues?milestone=3&state=closed) +- [**#7**](https://github.com/ljharb/qs/issues/7) Empty values of a POST array disappear after being submitted +- [**#9**](https://github.com/ljharb/qs/issues/9) Should not omit equals signs (=) when value is null +- [**#6**](https://github.com/ljharb/qs/issues/6) Minor grammar fix in README + +## [**1.0.2**](https://github.com/ljharb/qs/issues?milestone=2&state=closed) +- [**#5**](https://github.com/ljharb/qs/issues/5) array holes incorrectly copied into object on large index diff --git a/node_modules/qs/LICENSE b/node_modules/qs/LICENSE new file mode 100644 index 00000000..d4569487 --- /dev/null +++ b/node_modules/qs/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2014 Nathan LaFreniere and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors diff --git a/node_modules/qs/README.md b/node_modules/qs/README.md new file mode 100644 index 00000000..8590cfd3 --- /dev/null +++ b/node_modules/qs/README.md @@ -0,0 +1,570 @@ +# qs [![Version Badge][2]][1] + +[![Build Status][3]][4] +[![dependency status][5]][6] +[![dev dependency status][7]][8] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][11]][1] + +A querystring parsing and stringifying library with some added security. + +Lead Maintainer: [Jordan Harband](https://github.com/ljharb) + +The **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring). + +## Usage + +```javascript +var qs = require('qs'); +var assert = require('assert'); + +var obj = qs.parse('a=c'); +assert.deepEqual(obj, { a: 'c' }); + +var str = qs.stringify(obj); +assert.equal(str, 'a=c'); +``` + +### Parsing Objects + +[](#preventEval) +```javascript +qs.parse(string, [options]); +``` + +**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`. +For example, the string `'foo[bar]=baz'` converts to: + +```javascript +assert.deepEqual(qs.parse('foo[bar]=baz'), { + foo: { + bar: 'baz' + } +}); +``` + +When using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like: + +```javascript +var nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true }); +assert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } }); +``` + +By default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option. + +```javascript +var protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }); +assert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } }); +``` + +URI encoded strings work too: + +```javascript +assert.deepEqual(qs.parse('a%5Bb%5D=c'), { + a: { b: 'c' } +}); +``` + +You can also nest your objects, like `'foo[bar][baz]=foobarbaz'`: + +```javascript +assert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), { + foo: { + bar: { + baz: 'foobarbaz' + } + } +}); +``` + +By default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like +`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be: + +```javascript +var expected = { + a: { + b: { + c: { + d: { + e: { + f: { + '[g][h][i]': 'j' + } + } + } + } + } + } +}; +var string = 'a[b][c][d][e][f][g][h][i]=j'; +assert.deepEqual(qs.parse(string), expected); +``` + +This depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`: + +```javascript +var deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 }); +assert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } }); +``` + +The depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number. + +For similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option: + +```javascript +var limited = qs.parse('a=b&c=d', { parameterLimit: 1 }); +assert.deepEqual(limited, { a: 'b' }); +``` + +To bypass the leading question mark, use `ignoreQueryPrefix`: + +```javascript +var prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true }); +assert.deepEqual(prefixed, { a: 'b', c: 'd' }); +``` + +An optional delimiter can also be passed: + +```javascript +var delimited = qs.parse('a=b;c=d', { delimiter: ';' }); +assert.deepEqual(delimited, { a: 'b', c: 'd' }); +``` + +Delimiters can be a regular expression too: + +```javascript +var regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ }); +assert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' }); +``` + +Option `allowDots` can be used to enable dot notation: + +```javascript +var withDots = qs.parse('a.b=c', { allowDots: true }); +assert.deepEqual(withDots, { a: { b: 'c' } }); +``` + +If you have to deal with legacy browsers or services, there's +also support for decoding percent-encoded octets as iso-8859-1: + +```javascript +var oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' }); +assert.deepEqual(oldCharset, { a: '§' }); +``` + +Some services add an initial `utf8=✓` value to forms so that old +Internet Explorer versions are more likely to submit the form as +utf-8. Additionally, the server can check the value against wrong +encodings of the checkmark character and detect that a query string +or `application/x-www-form-urlencoded` body was *not* sent as +utf-8, eg. if the form had an `accept-charset` parameter or the +containing page had a different character set. + +**qs** supports this mechanism via the `charsetSentinel` option. +If specified, the `utf8` parameter will be omitted from the +returned object. It will be used to switch to `iso-8859-1`/`utf-8` +mode depending on how the checkmark is encoded. + +**Important**: When you specify both the `charset` option and the +`charsetSentinel` option, the `charset` will be overridden when +the request contains a `utf8` parameter from which the actual +charset can be deduced. In that sense the `charset` will behave +as the default charset rather than the authoritative charset. + +```javascript +var detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', { + charset: 'iso-8859-1', + charsetSentinel: true +}); +assert.deepEqual(detectedAsUtf8, { a: 'ø' }); + +// Browsers encode the checkmark as ✓ when submitting as iso-8859-1: +var detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', { + charset: 'utf-8', + charsetSentinel: true +}); +assert.deepEqual(detectedAsIso8859_1, { a: 'ø' }); +``` + +If you want to decode the `&#...;` syntax to the actual character, +you can specify the `interpretNumericEntities` option as well: + +```javascript +var detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', { + charset: 'iso-8859-1', + interpretNumericEntities: true +}); +assert.deepEqual(detectedAsIso8859_1, { a: '☺' }); +``` + +It also works when the charset has been detected in `charsetSentinel` +mode. + +### Parsing Arrays + +**qs** can also parse arrays using a similar `[]` notation: + +```javascript +var withArray = qs.parse('a[]=b&a[]=c'); +assert.deepEqual(withArray, { a: ['b', 'c'] }); +``` + +You may specify an index as well: + +```javascript +var withIndexes = qs.parse('a[1]=c&a[0]=b'); +assert.deepEqual(withIndexes, { a: ['b', 'c'] }); +``` + +Note that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number +to create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving +their order: + +```javascript +var noSparse = qs.parse('a[1]=b&a[15]=c'); +assert.deepEqual(noSparse, { a: ['b', 'c'] }); +``` + +Note that an empty string is also a value, and will be preserved: + +```javascript +var withEmptyString = qs.parse('a[]=&a[]=b'); +assert.deepEqual(withEmptyString, { a: ['', 'b'] }); + +var withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c'); +assert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] }); +``` + +**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will +instead be converted to an object with the index as the key. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array. + +```javascript +var withMaxIndex = qs.parse('a[100]=b'); +assert.deepEqual(withMaxIndex, { a: { '100': 'b' } }); +``` + +This limit can be overridden by passing an `arrayLimit` option: + +```javascript +var withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 }); +assert.deepEqual(withArrayLimit, { a: { '1': 'b' } }); +``` + +To disable array parsing entirely, set `parseArrays` to `false`. + +```javascript +var noParsingArrays = qs.parse('a[]=b', { parseArrays: false }); +assert.deepEqual(noParsingArrays, { a: { '0': 'b' } }); +``` + +If you mix notations, **qs** will merge the two items into an object: + +```javascript +var mixedNotation = qs.parse('a[0]=b&a[b]=c'); +assert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } }); +``` + +You can also create arrays of objects: + +```javascript +var arraysOfObjects = qs.parse('a[][b]=c'); +assert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] }); +``` + +Some people use comma to join array, **qs** can parse it: +```javascript +var arraysOfObjects = qs.parse('a=b,c', { comma: true }) +assert.deepEqual(arraysOfObjects, { a: ['b', 'c'] }) +``` +(_this cannot convert nested objects, such as `a={b:1},{c:d}`_) + +### Stringifying + +[](#preventEval) +```javascript +qs.stringify(object, [options]); +``` + +When stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect: + +```javascript +assert.equal(qs.stringify({ a: 'b' }), 'a=b'); +assert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); +``` + +This encoding can be disabled by setting the `encode` option to `false`: + +```javascript +var unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false }); +assert.equal(unencoded, 'a[b]=c'); +``` + +Encoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`: +```javascript +var encodedValues = qs.stringify( + { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, + { encodeValuesOnly: true } +); +assert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h'); +``` + +This encoding can also be replaced by a custom encoding method set as `encoder` option: + +```javascript +var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) { + // Passed in values `a`, `b`, `c` + return // Return encoded string +}}) +``` + +_(Note: the `encoder` option does not apply if `encode` is `false`)_ + +Analogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values: + +```javascript +var decoded = qs.parse('x=z', { decoder: function (str) { + // Passed in values `x`, `z` + return // Return decoded string +}}) +``` + +Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage. + +When arrays are stringified, by default they are given explicit indices: + +```javascript +qs.stringify({ a: ['b', 'c', 'd'] }); +// 'a[0]=b&a[1]=c&a[2]=d' +``` + +You may override this by setting the `indices` option to `false`: + +```javascript +qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }); +// 'a=b&a=c&a=d' +``` + +You may use the `arrayFormat` option to specify the format of the output array: + +```javascript +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }) +// 'a[0]=b&a[1]=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }) +// 'a[]=b&a[]=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }) +// 'a=b&a=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' }) +// 'a=b,c' +``` + +When objects are stringified, by default they use bracket notation: + +```javascript +qs.stringify({ a: { b: { c: 'd', e: 'f' } } }); +// 'a[b][c]=d&a[b][e]=f' +``` + +You may override this to use dot notation by setting the `allowDots` option to `true`: + +```javascript +qs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true }); +// 'a.b.c=d&a.b.e=f' +``` + +Empty strings and null values will omit the value, but the equals sign (=) remains in place: + +```javascript +assert.equal(qs.stringify({ a: '' }), 'a='); +``` + +Key with no values (such as an empty object or array) will return nothing: + +```javascript +assert.equal(qs.stringify({ a: [] }), ''); +assert.equal(qs.stringify({ a: {} }), ''); +assert.equal(qs.stringify({ a: [{}] }), ''); +assert.equal(qs.stringify({ a: { b: []} }), ''); +assert.equal(qs.stringify({ a: { b: {}} }), ''); +``` + +Properties that are set to `undefined` will be omitted entirely: + +```javascript +assert.equal(qs.stringify({ a: null, b: undefined }), 'a='); +``` + +The query string may optionally be prepended with a question mark: + +```javascript +assert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d'); +``` + +The delimiter may be overridden with stringify as well: + +```javascript +assert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); +``` + +If you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option: + +```javascript +var date = new Date(7); +assert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A')); +assert.equal( + qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }), + 'a=7' +); +``` + +You may use the `sort` option to affect the order of parameter keys: + +```javascript +function alphabeticalSort(a, b) { + return a.localeCompare(b); +} +assert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y'); +``` + +Finally, you can use the `filter` option to restrict which keys will be included in the stringified output. +If you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you +pass an array, it will be used to select properties and array indices for stringification: + +```javascript +function filterFunc(prefix, value) { + if (prefix == 'b') { + // Return an `undefined` value to omit a property. + return; + } + if (prefix == 'e[f]') { + return value.getTime(); + } + if (prefix == 'e[g][0]') { + return value * 2; + } + return value; +} +qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc }); +// 'a=b&c=d&e[f]=123&e[g][0]=4' +qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] }); +// 'a=b&e=f' +qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] }); +// 'a[0]=b&a[2]=d' +``` + +### Handling of `null` values + +By default, `null` values are treated like empty strings: + +```javascript +var withNull = qs.stringify({ a: null, b: '' }); +assert.equal(withNull, 'a=&b='); +``` + +Parsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings. + +```javascript +var equalsInsensitive = qs.parse('a&b='); +assert.deepEqual(equalsInsensitive, { a: '', b: '' }); +``` + +To distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null` +values have no `=` sign: + +```javascript +var strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true }); +assert.equal(strictNull, 'a&b='); +``` + +To parse values without `=` back to `null` use the `strictNullHandling` flag: + +```javascript +var parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true }); +assert.deepEqual(parsedStrictNull, { a: null, b: '' }); +``` + +To completely skip rendering keys with `null` values, use the `skipNulls` flag: + +```javascript +var nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true }); +assert.equal(nullsSkipped, 'a=b'); +``` + +If you're communicating with legacy systems, you can switch to `iso-8859-1` +using the `charset` option: + +```javascript +var iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' }); +assert.equal(iso, '%E6=%E6'); +``` + +Characters that don't exist in `iso-8859-1` will be converted to numeric +entities, similar to what browsers do: + +```javascript +var numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' }); +assert.equal(numeric, 'a=%26%239786%3B'); +``` + +You can use the `charsetSentinel` option to announce the character by +including an `utf8=✓` parameter with the proper encoding if the checkmark, +similar to what Ruby on Rails and others do when submitting forms. + +```javascript +var sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true }); +assert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA'); + +var isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' }); +assert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6'); +``` + +### Dealing with special character sets + +By default the encoding and decoding of characters is done in `utf-8`, +and `iso-8859-1` support is also built in via the `charset` parameter. + +If you wish to encode querystrings to a different character set (i.e. +[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the +[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library: + +```javascript +var encoder = require('qs-iconv/encoder')('shift_jis'); +var shiftJISEncoded = qs.stringify({ a: 'ã“ã‚“ã«ã¡ã¯ï¼' }, { encoder: encoder }); +assert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I'); +``` + +This also works for decoding of query strings: + +```javascript +var decoder = require('qs-iconv/decoder')('shift_jis'); +var obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder }); +assert.deepEqual(obj, { a: 'ã“ã‚“ã«ã¡ã¯ï¼' }); +``` + +### RFC 3986 and RFC 1738 space encoding + +RFC3986 used as default option and encodes ' ' to *%20* which is backward compatible. +In the same time, output can be stringified as per RFC1738 with ' ' equal to '+'. + +``` +assert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); +assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c'); +assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c'); +``` + +[1]: https://npmjs.org/package/qs +[2]: http://versionbadg.es/ljharb/qs.svg +[3]: https://api.travis-ci.org/ljharb/qs.svg +[4]: https://travis-ci.org/ljharb/qs +[5]: https://david-dm.org/ljharb/qs.svg +[6]: https://david-dm.org/ljharb/qs +[7]: https://david-dm.org/ljharb/qs/dev-status.svg +[8]: https://david-dm.org/ljharb/qs?type=dev +[9]: https://ci.testling.com/ljharb/qs.png +[10]: https://ci.testling.com/ljharb/qs +[11]: https://nodei.co/npm/qs.png?downloads=true&stars=true +[license-image]: http://img.shields.io/npm/l/qs.svg +[license-url]: LICENSE +[downloads-image]: http://img.shields.io/npm/dm/qs.svg +[downloads-url]: http://npm-stat.com/charts.html?package=qs diff --git a/node_modules/qs/dist/qs.js b/node_modules/qs/dist/qs.js new file mode 100644 index 00000000..17f4e600 --- /dev/null +++ b/node_modules/qs/dist/qs.js @@ -0,0 +1,782 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i -1) { + val = val.split(','); + } + + if (has.call(obj, key)) { + obj[key] = utils.combine(obj[key], val); + } else { + obj[key] = val; + } + } + + return obj; +}; + +var parseObject = function (chain, val, options) { + var leaf = val; + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]' && options.parseArrays) { + obj = [].concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var index = parseInt(cleanRoot, 10); + if (!options.parseArrays && cleanRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while ((segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options); +}; + +var normalizeParseOptions = function normalizeParseOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new Error('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; + + return { + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, + arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, + decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, + delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, + depth: typeof opts.depth === 'number' ? opts.depth : defaults.depth, + ignoreQueryPrefix: opts.ignoreQueryPrefix === true, + interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, + parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, + parseArrays: opts.parseArrays !== false, + plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (str, opts) { + var options = normalizeParseOptions(opts); + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options); + obj = utils.merge(obj, newObj, options); + } + + return utils.compact(obj); +}; + +},{"./utils":5}],4:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var formats = require('./formats'); +var has = Object.prototype.hasOwnProperty; + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { // eslint-disable-line func-name-matching + return prefix + '[]'; + }, + comma: 'comma', + indices: function indices(prefix, key) { // eslint-disable-line func-name-matching + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { // eslint-disable-line func-name-matching + return prefix; + } +}; + +var isArray = Array.isArray; +var push = Array.prototype.push; +var pushToArray = function (arr, valueOrArray) { + push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); +}; + +var toISO = Date.prototype.toISOString; + +var defaults = { + addQueryPrefix: false, + allowDots: false, + charset: 'utf-8', + charsetSentinel: false, + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + formatter: formats.formatters[formats['default']], + // deprecated + indices: false, + serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var stringify = function stringify( // eslint-disable-line func-name-matching + object, + prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset +) { + var obj = object; + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (generateArrayPrefix === 'comma' && isArray(obj)) { + obj = obj.join(','); + } + + if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset) : prefix; + } + + obj = ''; + } + + if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + if (isArray(obj)) { + pushToArray(values, stringify( + obj[key], + typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset + )); + } else { + pushToArray(values, stringify( + obj[key], + prefix + (allowDots ? '.' + key : '[' + key + ']'), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset + )); + } + } + + return values; +}; + +var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var charset = opts.charset || defaults.charset; + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + + var format = formats['default']; + if (typeof opts.format !== 'undefined') { + if (!has.call(formats.formatters, opts.format)) { + throw new TypeError('Unknown format option provided.'); + } + format = opts.format; + } + var formatter = formats.formatters[format]; + + var filter = defaults.filter; + if (typeof opts.filter === 'function' || isArray(opts.filter)) { + filter = opts.filter; + } + + return { + addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, + encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, + encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, + encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, + filter: filter, + formatter: formatter, + serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, + skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, + sort: typeof opts.sort === 'function' ? opts.sort : null, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = normalizeStringifyOptions(opts); + + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (opts && opts.arrayFormat in arrayPrefixGenerators) { + arrayFormat = opts.arrayFormat; + } else if (opts && 'indices' in opts) { + arrayFormat = opts.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (options.sort) { + objKeys.sort(options.sort); + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (options.skipNulls && obj[key] === null) { + continue; + } + pushToArray(keys, stringify( + obj[key], + key, + generateArrayPrefix, + options.strictNullHandling, + options.skipNulls, + options.encode ? options.encoder : null, + options.filter, + options.sort, + options.allowDots, + options.serializeDate, + options.formatter, + options.encodeValuesOnly, + options.charset + )); + } + + var joined = keys.join(options.delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + if (options.charsetSentinel) { + if (options.charset === 'iso-8859-1') { + // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark + prefix += 'utf8=%26%2310003%3B&'; + } else { + // encodeURIComponent('✓') + prefix += 'utf8=%E2%9C%93&'; + } + } + + return joined.length > 0 ? prefix + joined : ''; +}; + +},{"./formats":1,"./utils":5}],5:[function(require,module,exports){ +'use strict'; + +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; + +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; +}()); + +var compactQueue = function compactQueue(queue) { + while (queue.length > 1) { + var item = queue.pop(); + var obj = item.obj[item.prop]; + + if (isArray(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } +}; + +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; +}; + +var merge = function merge(target, source, options) { + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (isArray(target)) { + target.push(source); + } else if (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (isArray(target) && !isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (isArray(target) && isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; + +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; + +var decode = function (str, decoder, charset) { + var strWithoutPlus = str.replace(/\+/g, ' '); + if (charset === 'iso-8859-1') { + // unescape never throws, no try...catch needed: + return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); + } + // utf-8 + try { + return decodeURIComponent(strWithoutPlus); + } catch (e) { + return strWithoutPlus; + } +}; + +var encode = function encode(str, defaultEncoder, charset) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = typeof str === 'string' ? str : String(str); + + if (charset === 'iso-8859-1') { + return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { + return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; + }); + } + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; +}; + +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } + + compactQueue(queue); + + return value; +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (!obj || typeof obj !== 'object') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +var combine = function combine(a, b) { + return [].concat(a, b); +}; + +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + combine: combine, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + merge: merge +}; + +},{}]},{},[2])(2) +}); diff --git a/node_modules/qs/lib/formats.js b/node_modules/qs/lib/formats.js new file mode 100644 index 00000000..df459975 --- /dev/null +++ b/node_modules/qs/lib/formats.js @@ -0,0 +1,18 @@ +'use strict'; + +var replace = String.prototype.replace; +var percentTwenties = /%20/g; + +module.exports = { + 'default': 'RFC3986', + formatters: { + RFC1738: function (value) { + return replace.call(value, percentTwenties, '+'); + }, + RFC3986: function (value) { + return value; + } + }, + RFC1738: 'RFC1738', + RFC3986: 'RFC3986' +}; diff --git a/node_modules/qs/lib/index.js b/node_modules/qs/lib/index.js new file mode 100644 index 00000000..0d6a97dc --- /dev/null +++ b/node_modules/qs/lib/index.js @@ -0,0 +1,11 @@ +'use strict'; + +var stringify = require('./stringify'); +var parse = require('./parse'); +var formats = require('./formats'); + +module.exports = { + formats: formats, + parse: parse, + stringify: stringify +}; diff --git a/node_modules/qs/lib/parse.js b/node_modules/qs/lib/parse.js new file mode 100644 index 00000000..d81628b5 --- /dev/null +++ b/node_modules/qs/lib/parse.js @@ -0,0 +1,242 @@ +'use strict'; + +var utils = require('./utils'); + +var has = Object.prototype.hasOwnProperty; + +var defaults = { + allowDots: false, + allowPrototypes: false, + arrayLimit: 20, + charset: 'utf-8', + charsetSentinel: false, + comma: false, + decoder: utils.decode, + delimiter: '&', + depth: 5, + ignoreQueryPrefix: false, + interpretNumericEntities: false, + parameterLimit: 1000, + parseArrays: true, + plainObjects: false, + strictNullHandling: false +}; + +var interpretNumericEntities = function (str) { + return str.replace(/&#(\d+);/g, function ($0, numberStr) { + return String.fromCharCode(parseInt(numberStr, 10)); + }); +}; + +// This is what browsers will submit when the ✓ character occurs in an +// application/x-www-form-urlencoded body and the encoding of the page containing +// the form is iso-8859-1, or when the submitted form has an accept-charset +// attribute of iso-8859-1. Presumably also with other charsets that do not contain +// the ✓ character, such as us-ascii. +var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') + +// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. +var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') + +var parseValues = function parseQueryStringValues(str, options) { + var obj = {}; + var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; + var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; + var parts = cleanStr.split(options.delimiter, limit); + var skipIndex = -1; // Keep track of where the utf8 sentinel was found + var i; + + var charset = options.charset; + if (options.charsetSentinel) { + for (i = 0; i < parts.length; ++i) { + if (parts[i].indexOf('utf8=') === 0) { + if (parts[i] === charsetSentinel) { + charset = 'utf-8'; + } else if (parts[i] === isoSentinel) { + charset = 'iso-8859-1'; + } + skipIndex = i; + i = parts.length; // The eslint settings do not allow break; + } + } + } + + for (i = 0; i < parts.length; ++i) { + if (i === skipIndex) { + continue; + } + var part = parts[i]; + + var bracketEqualsPos = part.indexOf(']='); + var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; + + var key, val; + if (pos === -1) { + key = options.decoder(part, defaults.decoder, charset); + val = options.strictNullHandling ? null : ''; + } else { + key = options.decoder(part.slice(0, pos), defaults.decoder, charset); + val = options.decoder(part.slice(pos + 1), defaults.decoder, charset); + } + + if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { + val = interpretNumericEntities(val); + } + + if (val && options.comma && val.indexOf(',') > -1) { + val = val.split(','); + } + + if (has.call(obj, key)) { + obj[key] = utils.combine(obj[key], val); + } else { + obj[key] = val; + } + } + + return obj; +}; + +var parseObject = function (chain, val, options) { + var leaf = val; + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]' && options.parseArrays) { + obj = [].concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var index = parseInt(cleanRoot, 10); + if (!options.parseArrays && cleanRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while ((segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options); +}; + +var normalizeParseOptions = function normalizeParseOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new Error('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; + + return { + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, + arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, + decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, + delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, + depth: typeof opts.depth === 'number' ? opts.depth : defaults.depth, + ignoreQueryPrefix: opts.ignoreQueryPrefix === true, + interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, + parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, + parseArrays: opts.parseArrays !== false, + plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (str, opts) { + var options = normalizeParseOptions(opts); + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options); + obj = utils.merge(obj, newObj, options); + } + + return utils.compact(obj); +}; diff --git a/node_modules/qs/lib/stringify.js b/node_modules/qs/lib/stringify.js new file mode 100644 index 00000000..7455049c --- /dev/null +++ b/node_modules/qs/lib/stringify.js @@ -0,0 +1,269 @@ +'use strict'; + +var utils = require('./utils'); +var formats = require('./formats'); +var has = Object.prototype.hasOwnProperty; + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { // eslint-disable-line func-name-matching + return prefix + '[]'; + }, + comma: 'comma', + indices: function indices(prefix, key) { // eslint-disable-line func-name-matching + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { // eslint-disable-line func-name-matching + return prefix; + } +}; + +var isArray = Array.isArray; +var push = Array.prototype.push; +var pushToArray = function (arr, valueOrArray) { + push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); +}; + +var toISO = Date.prototype.toISOString; + +var defaults = { + addQueryPrefix: false, + allowDots: false, + charset: 'utf-8', + charsetSentinel: false, + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + formatter: formats.formatters[formats['default']], + // deprecated + indices: false, + serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var stringify = function stringify( // eslint-disable-line func-name-matching + object, + prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset +) { + var obj = object; + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (generateArrayPrefix === 'comma' && isArray(obj)) { + obj = obj.join(','); + } + + if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset) : prefix; + } + + obj = ''; + } + + if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + if (isArray(obj)) { + pushToArray(values, stringify( + obj[key], + typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset + )); + } else { + pushToArray(values, stringify( + obj[key], + prefix + (allowDots ? '.' + key : '[' + key + ']'), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly, + charset + )); + } + } + + return values; +}; + +var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var charset = opts.charset || defaults.charset; + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + + var format = formats['default']; + if (typeof opts.format !== 'undefined') { + if (!has.call(formats.formatters, opts.format)) { + throw new TypeError('Unknown format option provided.'); + } + format = opts.format; + } + var formatter = formats.formatters[format]; + + var filter = defaults.filter; + if (typeof opts.filter === 'function' || isArray(opts.filter)) { + filter = opts.filter; + } + + return { + addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, + encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, + encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, + encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, + filter: filter, + formatter: formatter, + serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, + skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, + sort: typeof opts.sort === 'function' ? opts.sort : null, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = normalizeStringifyOptions(opts); + + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (opts && opts.arrayFormat in arrayPrefixGenerators) { + arrayFormat = opts.arrayFormat; + } else if (opts && 'indices' in opts) { + arrayFormat = opts.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (options.sort) { + objKeys.sort(options.sort); + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (options.skipNulls && obj[key] === null) { + continue; + } + pushToArray(keys, stringify( + obj[key], + key, + generateArrayPrefix, + options.strictNullHandling, + options.skipNulls, + options.encode ? options.encoder : null, + options.filter, + options.sort, + options.allowDots, + options.serializeDate, + options.formatter, + options.encodeValuesOnly, + options.charset + )); + } + + var joined = keys.join(options.delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + if (options.charsetSentinel) { + if (options.charset === 'iso-8859-1') { + // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark + prefix += 'utf8=%26%2310003%3B&'; + } else { + // encodeURIComponent('✓') + prefix += 'utf8=%E2%9C%93&'; + } + } + + return joined.length > 0 ? prefix + joined : ''; +}; diff --git a/node_modules/qs/lib/utils.js b/node_modules/qs/lib/utils.js new file mode 100644 index 00000000..1b219cdd --- /dev/null +++ b/node_modules/qs/lib/utils.js @@ -0,0 +1,230 @@ +'use strict'; + +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; + +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; +}()); + +var compactQueue = function compactQueue(queue) { + while (queue.length > 1) { + var item = queue.pop(); + var obj = item.obj[item.prop]; + + if (isArray(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } +}; + +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; +}; + +var merge = function merge(target, source, options) { + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (isArray(target)) { + target.push(source); + } else if (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (isArray(target) && !isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (isArray(target) && isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; + +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; + +var decode = function (str, decoder, charset) { + var strWithoutPlus = str.replace(/\+/g, ' '); + if (charset === 'iso-8859-1') { + // unescape never throws, no try...catch needed: + return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); + } + // utf-8 + try { + return decodeURIComponent(strWithoutPlus); + } catch (e) { + return strWithoutPlus; + } +}; + +var encode = function encode(str, defaultEncoder, charset) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = typeof str === 'string' ? str : String(str); + + if (charset === 'iso-8859-1') { + return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { + return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; + }); + } + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; +}; + +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } + + compactQueue(queue); + + return value; +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (!obj || typeof obj !== 'object') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +var combine = function combine(a, b) { + return [].concat(a, b); +}; + +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + combine: combine, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + merge: merge +}; diff --git a/node_modules/qs/package.json b/node_modules/qs/package.json new file mode 100644 index 00000000..89b050f4 --- /dev/null +++ b/node_modules/qs/package.json @@ -0,0 +1,87 @@ +{ + "_from": "qs@6.7.0", + "_id": "qs@6.7.0", + "_inBundle": false, + "_integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "_location": "/qs", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "qs@6.7.0", + "name": "qs", + "escapedName": "qs", + "rawSpec": "6.7.0", + "saveSpec": null, + "fetchSpec": "6.7.0" + }, + "_requiredBy": [ + "/express", + "/express/body-parser" + ], + "_resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "_shasum": "41dc1a015e3d581f1621776be31afb2876a9b1bc", + "_spec": "qs@6.7.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "bugs": { + "url": "https://github.com/ljharb/qs/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Jordan Harband", + "email": "ljharb@gmail.com", + "url": "http://ljharb.codes" + } + ], + "dependencies": {}, + "deprecated": false, + "description": "A querystring parser that supports nesting and arrays, with a depth limit", + "devDependencies": { + "@ljharb/eslint-config": "^13.1.1", + "browserify": "^16.2.3", + "covert": "^1.1.1", + "editorconfig-tools": "^0.1.1", + "eslint": "^5.15.3", + "evalmd": "^0.0.17", + "for-each": "^0.3.3", + "iconv-lite": "^0.4.24", + "mkdirp": "^0.5.1", + "object-inspect": "^1.6.0", + "qs-iconv": "^1.0.4", + "safe-publish-latest": "^1.1.2", + "safer-buffer": "^2.1.2", + "tape": "^4.10.1" + }, + "engines": { + "node": ">=0.6" + }, + "homepage": "https://github.com/ljharb/qs", + "keywords": [ + "querystring", + "qs", + "query", + "url", + "parse", + "stringify" + ], + "license": "BSD-3-Clause", + "main": "lib/index.js", + "name": "qs", + "repository": { + "type": "git", + "url": "git+https://github.com/ljharb/qs.git" + }, + "scripts": { + "coverage": "covert test", + "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js", + "lint": "eslint lib/*.js test/*.js", + "postlint": "editorconfig-tools check * lib/* test/*", + "prepublish": "safe-publish-latest && npm run dist", + "pretest": "npm run --silent readme && npm run --silent lint", + "readme": "evalmd README.md", + "test": "npm run --silent coverage", + "tests-only": "node test" + }, + "version": "6.7.0" +} diff --git a/node_modules/qs/test/.eslintrc b/node_modules/qs/test/.eslintrc new file mode 100644 index 00000000..9ebbb921 --- /dev/null +++ b/node_modules/qs/test/.eslintrc @@ -0,0 +1,17 @@ +{ + "rules": { + "array-bracket-newline": 0, + "array-element-newline": 0, + "consistent-return": 2, + "function-paren-newline": 0, + "max-lines": 0, + "max-lines-per-function": 0, + "max-nested-callbacks": [2, 3], + "max-statements": 0, + "no-buffer-constructor": 0, + "no-extend-native": 0, + "no-magic-numbers": 0, + "object-curly-newline": 0, + "sort-keys": 0 + } +} diff --git a/node_modules/qs/test/index.js b/node_modules/qs/test/index.js new file mode 100644 index 00000000..5e6bc8fb --- /dev/null +++ b/node_modules/qs/test/index.js @@ -0,0 +1,7 @@ +'use strict'; + +require('./parse'); + +require('./stringify'); + +require('./utils'); diff --git a/node_modules/qs/test/parse.js b/node_modules/qs/test/parse.js new file mode 100644 index 00000000..89677899 --- /dev/null +++ b/node_modules/qs/test/parse.js @@ -0,0 +1,676 @@ +'use strict'; + +var test = require('tape'); +var qs = require('../'); +var utils = require('../lib/utils'); +var iconv = require('iconv-lite'); +var SaferBuffer = require('safer-buffer').Buffer; + +test('parse()', function (t) { + t.test('parses a simple string', function (st) { + st.deepEqual(qs.parse('0=foo'), { 0: 'foo' }); + st.deepEqual(qs.parse('foo=c++'), { foo: 'c ' }); + st.deepEqual(qs.parse('a[>=]=23'), { a: { '>=': '23' } }); + st.deepEqual(qs.parse('a[<=>]==23'), { a: { '<=>': '=23' } }); + st.deepEqual(qs.parse('a[==]=23'), { a: { '==': '23' } }); + st.deepEqual(qs.parse('foo', { strictNullHandling: true }), { foo: null }); + st.deepEqual(qs.parse('foo'), { foo: '' }); + st.deepEqual(qs.parse('foo='), { foo: '' }); + st.deepEqual(qs.parse('foo=bar'), { foo: 'bar' }); + st.deepEqual(qs.parse(' foo = bar = baz '), { ' foo ': ' bar = baz ' }); + st.deepEqual(qs.parse('foo=bar=baz'), { foo: 'bar=baz' }); + st.deepEqual(qs.parse('foo=bar&bar=baz'), { foo: 'bar', bar: 'baz' }); + st.deepEqual(qs.parse('foo2=bar2&baz2='), { foo2: 'bar2', baz2: '' }); + st.deepEqual(qs.parse('foo=bar&baz', { strictNullHandling: true }), { foo: 'bar', baz: null }); + st.deepEqual(qs.parse('foo=bar&baz'), { foo: 'bar', baz: '' }); + st.deepEqual(qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World'), { + cht: 'p3', + chd: 't:60,40', + chs: '250x100', + chl: 'Hello|World' + }); + st.end(); + }); + + t.test('allows enabling dot notation', function (st) { + st.deepEqual(qs.parse('a.b=c'), { 'a.b': 'c' }); + st.deepEqual(qs.parse('a.b=c', { allowDots: true }), { a: { b: 'c' } }); + st.end(); + }); + + t.deepEqual(qs.parse('a[b]=c'), { a: { b: 'c' } }, 'parses a single nested string'); + t.deepEqual(qs.parse('a[b][c]=d'), { a: { b: { c: 'd' } } }, 'parses a double nested string'); + t.deepEqual( + qs.parse('a[b][c][d][e][f][g][h]=i'), + { a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }, + 'defaults to a depth of 5' + ); + + t.test('only parses one level when depth = 1', function (st) { + st.deepEqual(qs.parse('a[b][c]=d', { depth: 1 }), { a: { b: { '[c]': 'd' } } }); + st.deepEqual(qs.parse('a[b][c][d]=e', { depth: 1 }), { a: { b: { '[c][d]': 'e' } } }); + st.end(); + }); + + t.deepEqual(qs.parse('a=b&a=c'), { a: ['b', 'c'] }, 'parses a simple array'); + + t.test('parses an explicit array', function (st) { + st.deepEqual(qs.parse('a[]=b'), { a: ['b'] }); + st.deepEqual(qs.parse('a[]=b&a[]=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a[]=c&a[]=d'), { a: ['b', 'c', 'd'] }); + st.end(); + }); + + t.test('parses a mix of simple and explicit arrays', function (st) { + st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[0]=b&a=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[0]=c'), { a: ['b', 'c'] }); + + st.deepEqual(qs.parse('a[1]=b&a=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); + + st.deepEqual(qs.parse('a=b&a[1]=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[]=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); + + st.end(); + }); + + t.test('parses a nested array', function (st) { + st.deepEqual(qs.parse('a[b][]=c&a[b][]=d'), { a: { b: ['c', 'd'] } }); + st.deepEqual(qs.parse('a[>=]=25'), { a: { '>=': '25' } }); + st.end(); + }); + + t.test('allows to specify array indices', function (st) { + st.deepEqual(qs.parse('a[1]=c&a[0]=b&a[2]=d'), { a: ['b', 'c', 'd'] }); + st.deepEqual(qs.parse('a[1]=c&a[0]=b'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 20 }), { a: ['c'] }); + st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 0 }), { a: { 1: 'c' } }); + st.deepEqual(qs.parse('a[1]=c'), { a: ['c'] }); + st.end(); + }); + + t.test('limits specific array indices to arrayLimit', function (st) { + st.deepEqual(qs.parse('a[20]=a', { arrayLimit: 20 }), { a: ['a'] }); + st.deepEqual(qs.parse('a[21]=a', { arrayLimit: 20 }), { a: { 21: 'a' } }); + st.end(); + }); + + t.deepEqual(qs.parse('a[12b]=c'), { a: { '12b': 'c' } }, 'supports keys that begin with a number'); + + t.test('supports encoded = signs', function (st) { + st.deepEqual(qs.parse('he%3Dllo=th%3Dere'), { 'he=llo': 'th=ere' }); + st.end(); + }); + + t.test('is ok with url encoded strings', function (st) { + st.deepEqual(qs.parse('a[b%20c]=d'), { a: { 'b c': 'd' } }); + st.deepEqual(qs.parse('a[b]=c%20d'), { a: { b: 'c d' } }); + st.end(); + }); + + t.test('allows brackets in the value', function (st) { + st.deepEqual(qs.parse('pets=["tobi"]'), { pets: '["tobi"]' }); + st.deepEqual(qs.parse('operators=[">=", "<="]'), { operators: '[">=", "<="]' }); + st.end(); + }); + + t.test('allows empty values', function (st) { + st.deepEqual(qs.parse(''), {}); + st.deepEqual(qs.parse(null), {}); + st.deepEqual(qs.parse(undefined), {}); + st.end(); + }); + + t.test('transforms arrays to objects', function (st) { + st.deepEqual(qs.parse('foo[0]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[0]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo'), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); + st.deepEqual(qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb'), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); + + st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: false }), { a: { 0: 'b', t: 'u' } }); + st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: true }), { a: { 0: 'b', t: 'u', hasOwnProperty: 'c' } }); + st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: false }), { a: { 0: 'b', x: 'y' } }); + st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: true }), { a: { 0: 'b', hasOwnProperty: 'c', x: 'y' } }); + st.end(); + }); + + t.test('transforms arrays to objects (dot notation)', function (st) { + st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: 'baz' } }); + st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad.boo=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } }); + st.deepEqual(qs.parse('foo[0][0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } }); + st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15'], bar: '2' }] }); + st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15', '16'], bar: '2' }] }); + st.deepEqual(qs.parse('foo.bad=baz&foo[0]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[]=bar&foo.bad=baz', { allowDots: true }), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); + st.deepEqual(qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb', { allowDots: true }), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); + st.end(); + }); + + t.test('correctly prunes undefined values when converting an array to an object', function (st) { + st.deepEqual(qs.parse('a[2]=b&a[99999999]=c'), { a: { 2: 'b', 99999999: 'c' } }); + st.end(); + }); + + t.test('supports malformed uri characters', function (st) { + st.deepEqual(qs.parse('{%:%}', { strictNullHandling: true }), { '{%:%}': null }); + st.deepEqual(qs.parse('{%:%}='), { '{%:%}': '' }); + st.deepEqual(qs.parse('foo=%:%}'), { foo: '%:%}' }); + st.end(); + }); + + t.test('doesn\'t produce empty keys', function (st) { + st.deepEqual(qs.parse('_r=1&'), { _r: '1' }); + st.end(); + }); + + t.test('cannot access Object prototype', function (st) { + qs.parse('constructor[prototype][bad]=bad'); + qs.parse('bad[constructor][prototype][bad]=bad'); + st.equal(typeof Object.prototype.bad, 'undefined'); + st.end(); + }); + + t.test('parses arrays of objects', function (st) { + st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); + st.deepEqual(qs.parse('a[0][b]=c'), { a: [{ b: 'c' }] }); + st.end(); + }); + + t.test('allows for empty strings in arrays', function (st) { + st.deepEqual(qs.parse('a[]=b&a[]=&a[]=c'), { a: ['b', '', 'c'] }); + + st.deepEqual( + qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true, arrayLimit: 20 }), + { a: ['b', null, 'c', ''] }, + 'with arrayLimit 20 + array indices: null then empty string works' + ); + st.deepEqual( + qs.parse('a[]=b&a[]&a[]=c&a[]=', { strictNullHandling: true, arrayLimit: 0 }), + { a: ['b', null, 'c', ''] }, + 'with arrayLimit 0 + array brackets: null then empty string works' + ); + + st.deepEqual( + qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true, arrayLimit: 20 }), + { a: ['b', '', 'c', null] }, + 'with arrayLimit 20 + array indices: empty string then null works' + ); + st.deepEqual( + qs.parse('a[]=b&a[]=&a[]=c&a[]', { strictNullHandling: true, arrayLimit: 0 }), + { a: ['b', '', 'c', null] }, + 'with arrayLimit 0 + array brackets: empty string then null works' + ); + + st.deepEqual( + qs.parse('a[]=&a[]=b&a[]=c'), + { a: ['', 'b', 'c'] }, + 'array brackets: empty strings work' + ); + st.end(); + }); + + t.test('compacts sparse arrays', function (st) { + st.deepEqual(qs.parse('a[10]=1&a[2]=2', { arrayLimit: 20 }), { a: ['2', '1'] }); + st.deepEqual(qs.parse('a[1][b][2][c]=1', { arrayLimit: 20 }), { a: [{ b: [{ c: '1' }] }] }); + st.deepEqual(qs.parse('a[1][2][3][c]=1', { arrayLimit: 20 }), { a: [[[{ c: '1' }]]] }); + st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { arrayLimit: 20 }), { a: [[[{ c: ['1'] }]]] }); + st.end(); + }); + + t.test('parses semi-parsed strings', function (st) { + st.deepEqual(qs.parse({ 'a[b]': 'c' }), { a: { b: 'c' } }); + st.deepEqual(qs.parse({ 'a[b]': 'c', 'a[d]': 'e' }), { a: { b: 'c', d: 'e' } }); + st.end(); + }); + + t.test('parses buffers correctly', function (st) { + var b = SaferBuffer.from('test'); + st.deepEqual(qs.parse({ a: b }), { a: b }); + st.end(); + }); + + t.test('parses jquery-param strings', function (st) { + // readable = 'filter[0][]=int1&filter[0][]==&filter[0][]=77&filter[]=and&filter[2][]=int2&filter[2][]==&filter[2][]=8' + var encoded = 'filter%5B0%5D%5B%5D=int1&filter%5B0%5D%5B%5D=%3D&filter%5B0%5D%5B%5D=77&filter%5B%5D=and&filter%5B2%5D%5B%5D=int2&filter%5B2%5D%5B%5D=%3D&filter%5B2%5D%5B%5D=8'; + var expected = { filter: [['int1', '=', '77'], 'and', ['int2', '=', '8']] }; + st.deepEqual(qs.parse(encoded), expected); + st.end(); + }); + + t.test('continues parsing when no parent is found', function (st) { + st.deepEqual(qs.parse('[]=&a=b'), { 0: '', a: 'b' }); + st.deepEqual(qs.parse('[]&a=b', { strictNullHandling: true }), { 0: null, a: 'b' }); + st.deepEqual(qs.parse('[foo]=bar'), { foo: 'bar' }); + st.end(); + }); + + t.test('does not error when parsing a very long array', function (st) { + var str = 'a[]=a'; + while (Buffer.byteLength(str) < 128 * 1024) { + str = str + '&' + str; + } + + st.doesNotThrow(function () { + qs.parse(str); + }); + + st.end(); + }); + + t.test('should not throw when a native prototype has an enumerable property', function (st) { + Object.prototype.crash = ''; + Array.prototype.crash = ''; + st.doesNotThrow(qs.parse.bind(null, 'a=b')); + st.deepEqual(qs.parse('a=b'), { a: 'b' }); + st.doesNotThrow(qs.parse.bind(null, 'a[][b]=c')); + st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); + delete Object.prototype.crash; + delete Array.prototype.crash; + st.end(); + }); + + t.test('parses a string with an alternative string delimiter', function (st) { + st.deepEqual(qs.parse('a=b;c=d', { delimiter: ';' }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('parses a string with an alternative RegExp delimiter', function (st) { + st.deepEqual(qs.parse('a=b; c=d', { delimiter: /[;,] */ }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('does not use non-splittable objects as delimiters', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { delimiter: true }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('allows overriding parameter limit', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: 1 }), { a: 'b' }); + st.end(); + }); + + t.test('allows setting the parameter limit to Infinity', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: Infinity }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('allows overriding array limit', function (st) { + st.deepEqual(qs.parse('a[0]=b', { arrayLimit: -1 }), { a: { 0: 'b' } }); + st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: -1 }), { a: { '-1': 'b' } }); + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 }), { a: { 0: 'b', 1: 'c' } }); + st.end(); + }); + + t.test('allows disabling array parsing', function (st) { + var indices = qs.parse('a[0]=b&a[1]=c', { parseArrays: false }); + st.deepEqual(indices, { a: { 0: 'b', 1: 'c' } }); + st.equal(Array.isArray(indices.a), false, 'parseArrays:false, indices case is not an array'); + + var emptyBrackets = qs.parse('a[]=b', { parseArrays: false }); + st.deepEqual(emptyBrackets, { a: { 0: 'b' } }); + st.equal(Array.isArray(emptyBrackets.a), false, 'parseArrays:false, empty brackets case is not an array'); + + st.end(); + }); + + t.test('allows for query string prefix', function (st) { + st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); + st.deepEqual(qs.parse('foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); + st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: false }), { '?foo': 'bar' }); + st.end(); + }); + + t.test('parses an object', function (st) { + var input = { + 'user[name]': { 'pop[bob]': 3 }, + 'user[email]': null + }; + + var expected = { + user: { + name: { 'pop[bob]': 3 }, + email: null + } + }; + + var result = qs.parse(input); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('parses string with comma as array divider', function (st) { + st.deepEqual(qs.parse('foo=bar,tee', { comma: true }), { foo: ['bar', 'tee'] }); + st.deepEqual(qs.parse('foo[bar]=coffee,tee', { comma: true }), { foo: { bar: ['coffee', 'tee'] } }); + st.deepEqual(qs.parse('foo=', { comma: true }), { foo: '' }); + st.deepEqual(qs.parse('foo', { comma: true }), { foo: '' }); + st.deepEqual(qs.parse('foo', { comma: true, strictNullHandling: true }), { foo: null }); + st.end(); + }); + + t.test('parses an object in dot notation', function (st) { + var input = { + 'user.name': { 'pop[bob]': 3 }, + 'user.email.': null + }; + + var expected = { + user: { + name: { 'pop[bob]': 3 }, + email: null + } + }; + + var result = qs.parse(input, { allowDots: true }); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('parses an object and not child values', function (st) { + var input = { + 'user[name]': { 'pop[bob]': { test: 3 } }, + 'user[email]': null + }; + + var expected = { + user: { + name: { 'pop[bob]': { test: 3 } }, + email: null + } + }; + + var result = qs.parse(input); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('does not blow up when Buffer global is missing', function (st) { + var tempBuffer = global.Buffer; + delete global.Buffer; + var result = qs.parse('a=b&c=d'); + global.Buffer = tempBuffer; + st.deepEqual(result, { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('does not crash when parsing circular references', function (st) { + var a = {}; + a.b = a; + + var parsed; + + st.doesNotThrow(function () { + parsed = qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a }); + }); + + st.equal('foo' in parsed, true, 'parsed has "foo" property'); + st.equal('bar' in parsed.foo, true); + st.equal('baz' in parsed.foo, true); + st.equal(parsed.foo.bar, 'baz'); + st.deepEqual(parsed.foo.baz, a); + st.end(); + }); + + t.test('does not crash when parsing deep objects', function (st) { + var parsed; + var str = 'foo'; + + for (var i = 0; i < 5000; i++) { + str += '[p]'; + } + + str += '=bar'; + + st.doesNotThrow(function () { + parsed = qs.parse(str, { depth: 5000 }); + }); + + st.equal('foo' in parsed, true, 'parsed has "foo" property'); + + var depth = 0; + var ref = parsed.foo; + while ((ref = ref.p)) { + depth += 1; + } + + st.equal(depth, 5000, 'parsed is 5000 properties deep'); + + st.end(); + }); + + t.test('parses null objects correctly', { skip: !Object.create }, function (st) { + var a = Object.create(null); + a.b = 'c'; + + st.deepEqual(qs.parse(a), { b: 'c' }); + var result = qs.parse({ a: a }); + st.equal('a' in result, true, 'result has "a" property'); + st.deepEqual(result.a, a); + st.end(); + }); + + t.test('parses dates correctly', function (st) { + var now = new Date(); + st.deepEqual(qs.parse({ a: now }), { a: now }); + st.end(); + }); + + t.test('parses regular expressions correctly', function (st) { + var re = /^test$/; + st.deepEqual(qs.parse({ a: re }), { a: re }); + st.end(); + }); + + t.test('does not allow overwriting prototype properties', function (st) { + st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: false }), {}); + st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: false }), {}); + + st.deepEqual( + qs.parse('toString', { allowPrototypes: false }), + {}, + 'bare "toString" results in {}' + ); + + st.end(); + }); + + t.test('can allow overwriting prototype properties', function (st) { + st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }), { a: { hasOwnProperty: 'b' } }); + st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: true }), { hasOwnProperty: 'b' }); + + st.deepEqual( + qs.parse('toString', { allowPrototypes: true }), + { toString: '' }, + 'bare "toString" results in { toString: "" }' + ); + + st.end(); + }); + + t.test('params starting with a closing bracket', function (st) { + st.deepEqual(qs.parse(']=toString'), { ']': 'toString' }); + st.deepEqual(qs.parse(']]=toString'), { ']]': 'toString' }); + st.deepEqual(qs.parse(']hello]=toString'), { ']hello]': 'toString' }); + st.end(); + }); + + t.test('params starting with a starting bracket', function (st) { + st.deepEqual(qs.parse('[=toString'), { '[': 'toString' }); + st.deepEqual(qs.parse('[[=toString'), { '[[': 'toString' }); + st.deepEqual(qs.parse('[hello[=toString'), { '[hello[': 'toString' }); + st.end(); + }); + + t.test('add keys to objects', function (st) { + st.deepEqual( + qs.parse('a[b]=c&a=d'), + { a: { b: 'c', d: true } }, + 'can add keys to objects' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString'), + { a: { b: 'c' } }, + 'can not overwrite prototype' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString', { allowPrototypes: true }), + { a: { b: 'c', toString: true } }, + 'can overwrite prototype with allowPrototypes true' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString', { plainObjects: true }), + { a: { b: 'c', toString: true } }, + 'can overwrite prototype with plainObjects true' + ); + + st.end(); + }); + + t.test('can return null objects', { skip: !Object.create }, function (st) { + var expected = Object.create(null); + expected.a = Object.create(null); + expected.a.b = 'c'; + expected.a.hasOwnProperty = 'd'; + st.deepEqual(qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true }), expected); + st.deepEqual(qs.parse(null, { plainObjects: true }), Object.create(null)); + var expectedArray = Object.create(null); + expectedArray.a = Object.create(null); + expectedArray.a[0] = 'b'; + expectedArray.a.c = 'd'; + st.deepEqual(qs.parse('a[]=b&a[c]=d', { plainObjects: true }), expectedArray); + st.end(); + }); + + t.test('can parse with custom encoding', function (st) { + st.deepEqual(qs.parse('%8c%a7=%91%e5%8d%e3%95%7b', { + decoder: function (str) { + var reg = /%([0-9A-F]{2})/ig; + var result = []; + var parts = reg.exec(str); + while (parts) { + result.push(parseInt(parts[1], 16)); + parts = reg.exec(str); + } + return String(iconv.decode(SaferBuffer.from(result), 'shift_jis')); + } + }), { 県: '大阪府' }); + st.end(); + }); + + t.test('receives the default decoder as a second argument', function (st) { + st.plan(1); + qs.parse('a', { + decoder: function (str, defaultDecoder) { + st.equal(defaultDecoder, utils.decode); + } + }); + st.end(); + }); + + t.test('throws error with wrong decoder', function (st) { + st['throws'](function () { + qs.parse({}, { decoder: 'string' }); + }, new TypeError('Decoder has to be a function.')); + st.end(); + }); + + t.test('does not mutate the options argument', function (st) { + var options = {}; + qs.parse('a[b]=true', options); + st.deepEqual(options, {}); + st.end(); + }); + + t.test('throws if an invalid charset is specified', function (st) { + st['throws'](function () { + qs.parse('a=b', { charset: 'foobar' }); + }, new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined')); + st.end(); + }); + + t.test('parses an iso-8859-1 string if asked to', function (st) { + st.deepEqual(qs.parse('%A2=%BD', { charset: 'iso-8859-1' }), { '¢': '½' }); + st.end(); + }); + + var urlEncodedCheckmarkInUtf8 = '%E2%9C%93'; + var urlEncodedOSlashInUtf8 = '%C3%B8'; + var urlEncodedNumCheckmark = '%26%2310003%3B'; + var urlEncodedNumSmiley = '%26%239786%3B'; + + t.test('prefers an utf-8 charset specified by the utf8 sentinel to a default charset of iso-8859-1', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedCheckmarkInUtf8 + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'iso-8859-1' }), { ø: 'ø' }); + st.end(); + }); + + t.test('prefers an iso-8859-1 charset specified by the utf8 sentinel to a default charset of utf-8', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedNumCheckmark + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'utf-8' }), { 'ø': 'ø' }); + st.end(); + }); + + t.test('does not require the utf8 sentinel to be defined before the parameters whose decoding it affects', function (st) { + st.deepEqual(qs.parse('a=' + urlEncodedOSlashInUtf8 + '&utf8=' + urlEncodedNumCheckmark, { charsetSentinel: true, charset: 'utf-8' }), { a: 'ø' }); + st.end(); + }); + + t.test('should ignore an utf8 sentinel with an unknown value', function (st) { + st.deepEqual(qs.parse('utf8=foo&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'utf-8' }), { ø: 'ø' }); + st.end(); + }); + + t.test('uses the utf8 sentinel to switch to utf-8 when no default charset is given', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedCheckmarkInUtf8 + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true }), { ø: 'ø' }); + st.end(); + }); + + t.test('uses the utf8 sentinel to switch to iso-8859-1 when no default charset is given', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedNumCheckmark + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true }), { 'ø': 'ø' }); + st.end(); + }); + + t.test('interprets numeric entities in iso-8859-1 when `interpretNumericEntities`', function (st) { + st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'iso-8859-1', interpretNumericEntities: true }), { foo: '☺' }); + st.end(); + }); + + t.test('handles a custom decoder returning `null`, in the `iso-8859-1` charset, when `interpretNumericEntities`', function (st) { + st.deepEqual(qs.parse('foo=&bar=' + urlEncodedNumSmiley, { + charset: 'iso-8859-1', + decoder: function (str, defaultDecoder, charset) { + return str ? defaultDecoder(str, defaultDecoder, charset) : null; + }, + interpretNumericEntities: true + }), { foo: null, bar: '☺' }); + st.end(); + }); + + t.test('does not interpret numeric entities in iso-8859-1 when `interpretNumericEntities` is absent', function (st) { + st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'iso-8859-1' }), { foo: '☺' }); + st.end(); + }); + + t.test('does not interpret numeric entities when the charset is utf-8, even when `interpretNumericEntities`', function (st) { + st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'utf-8', interpretNumericEntities: true }), { foo: '☺' }); + st.end(); + }); + + t.test('does not interpret %uXXXX syntax in iso-8859-1 mode', function (st) { + st.deepEqual(qs.parse('%u263A=%u263A', { charset: 'iso-8859-1' }), { '%u263A': '%u263A' }); + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/qs/test/stringify.js b/node_modules/qs/test/stringify.js new file mode 100644 index 00000000..53041c2e --- /dev/null +++ b/node_modules/qs/test/stringify.js @@ -0,0 +1,679 @@ +'use strict'; + +var test = require('tape'); +var qs = require('../'); +var utils = require('../lib/utils'); +var iconv = require('iconv-lite'); +var SaferBuffer = require('safer-buffer').Buffer; + +test('stringify()', function (t) { + t.test('stringifies a querystring object', function (st) { + st.equal(qs.stringify({ a: 'b' }), 'a=b'); + st.equal(qs.stringify({ a: 1 }), 'a=1'); + st.equal(qs.stringify({ a: 1, b: 2 }), 'a=1&b=2'); + st.equal(qs.stringify({ a: 'A_Z' }), 'a=A_Z'); + st.equal(qs.stringify({ a: '€' }), 'a=%E2%82%AC'); + st.equal(qs.stringify({ a: '' }), 'a=%EE%80%80'); + st.equal(qs.stringify({ a: '×' }), 'a=%D7%90'); + st.equal(qs.stringify({ a: 'ð·' }), 'a=%F0%90%90%B7'); + st.end(); + }); + + t.test('stringifies falsy values', function (st) { + st.equal(qs.stringify(undefined), ''); + st.equal(qs.stringify(null), ''); + st.equal(qs.stringify(null, { strictNullHandling: true }), ''); + st.equal(qs.stringify(false), ''); + st.equal(qs.stringify(0), ''); + st.end(); + }); + + t.test('adds query prefix', function (st) { + st.equal(qs.stringify({ a: 'b' }, { addQueryPrefix: true }), '?a=b'); + st.end(); + }); + + t.test('with query prefix, outputs blank string given an empty object', function (st) { + st.equal(qs.stringify({}, { addQueryPrefix: true }), ''); + st.end(); + }); + + t.test('stringifies nested falsy values', function (st) { + st.equal(qs.stringify({ a: { b: { c: null } } }), 'a%5Bb%5D%5Bc%5D='); + st.equal(qs.stringify({ a: { b: { c: null } } }, { strictNullHandling: true }), 'a%5Bb%5D%5Bc%5D'); + st.equal(qs.stringify({ a: { b: { c: false } } }), 'a%5Bb%5D%5Bc%5D=false'); + st.end(); + }); + + t.test('stringifies a nested object', function (st) { + st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); + st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }), 'a%5Bb%5D%5Bc%5D%5Bd%5D=e'); + st.end(); + }); + + t.test('stringifies a nested object with dots notation', function (st) { + st.equal(qs.stringify({ a: { b: 'c' } }, { allowDots: true }), 'a.b=c'); + st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }, { allowDots: true }), 'a.b.c.d=e'); + st.end(); + }); + + t.test('stringifies an array value', function (st) { + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'indices' }), + 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', + 'indices => indices' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'brackets' }), + 'a%5B%5D=b&a%5B%5D=c&a%5B%5D=d', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'comma' }), + 'a=b%2Cc%2Cd', + 'comma => comma' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }), + 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', + 'default => indices' + ); + st.end(); + }); + + t.test('omits nulls when asked', function (st) { + st.equal(qs.stringify({ a: 'b', c: null }, { skipNulls: true }), 'a=b'); + st.end(); + }); + + t.test('omits nested nulls when asked', function (st) { + st.equal(qs.stringify({ a: { b: 'c', d: null } }, { skipNulls: true }), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('omits array indices when asked', function (st) { + st.equal(qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }), 'a=b&a=c&a=d'); + st.end(); + }); + + t.test('stringifies a nested array value', function (st) { + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'indices' }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'brackets' }), 'a%5Bb%5D%5B%5D=c&a%5Bb%5D%5B%5D=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'comma' }), 'a%5Bb%5D=c%2Cd'); // a[b]=c,d + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + st.end(); + }); + + t.test('stringifies a nested array value with dots notation', function (st) { + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a.b[0]=c&a.b[1]=d', + 'indices: stringifies with dots + indices' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a.b[]=c&a.b[]=d', + 'brackets: stringifies with dots + brackets' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'comma' } + ), + 'a.b=c,d', + 'comma: stringifies with dots + comma' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false } + ), + 'a.b[0]=c&a.b[1]=d', + 'default: stringifies with dots + indices' + ); + st.end(); + }); + + t.test('stringifies an object inside an array', function (st) { + st.equal( + qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'indices' }), + 'a%5B0%5D%5Bb%5D=c', // a[0][b]=c + 'indices => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'brackets' }), + 'a%5B%5D%5Bb%5D=c', // a[][b]=c + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 'c' }] }), + 'a%5B0%5D%5Bb%5D=c', + 'default => indices' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'indices' }), + 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', + 'indices => indices' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'brackets' }), + 'a%5B%5D%5Bb%5D%5Bc%5D%5B%5D=1', + 'brackets => brackets' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }), + 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', + 'default => indices' + ); + + st.end(); + }); + + t.test('stringifies an array with mixed objects and primitives', function (st) { + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'indices' }), + 'a[0][b]=1&a[1]=2&a[2]=3', + 'indices => indices' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'brackets' }), + 'a[][b]=1&a[]=2&a[]=3', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }), + 'a[0][b]=1&a[1]=2&a[2]=3', + 'default => indices' + ); + + st.end(); + }); + + t.test('stringifies an object inside an array with dots notation', function (st) { + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a[0].b=c', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a[].b=c', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false } + ), + 'a[0].b=c', + 'default => indices' + ); + + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a[0].b.c[0]=1', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a[].b.c[]=1', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false } + ), + 'a[0].b.c[0]=1', + 'default => indices' + ); + + st.end(); + }); + + t.test('does not omit object keys when indices = false', function (st) { + st.equal(qs.stringify({ a: [{ b: 'c' }] }, { indices: false }), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when indices=true', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { indices: true }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when no arrayFormat is specified', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when no arrayFormat=indices', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses repeat notation for arrays when no arrayFormat=repeat', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }), 'a=b&a=c'); + st.end(); + }); + + t.test('uses brackets notation for arrays when no arrayFormat=brackets', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }), 'a%5B%5D=b&a%5B%5D=c'); + st.end(); + }); + + t.test('stringifies a complicated object', function (st) { + st.equal(qs.stringify({ a: { b: 'c', d: 'e' } }), 'a%5Bb%5D=c&a%5Bd%5D=e'); + st.end(); + }); + + t.test('stringifies an empty value', function (st) { + st.equal(qs.stringify({ a: '' }), 'a='); + st.equal(qs.stringify({ a: null }, { strictNullHandling: true }), 'a'); + + st.equal(qs.stringify({ a: '', b: '' }), 'a=&b='); + st.equal(qs.stringify({ a: null, b: '' }, { strictNullHandling: true }), 'a&b='); + + st.equal(qs.stringify({ a: { b: '' } }), 'a%5Bb%5D='); + st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: true }), 'a%5Bb%5D'); + st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: false }), 'a%5Bb%5D='); + + st.end(); + }); + + t.test('stringifies a null object', { skip: !Object.create }, function (st) { + var obj = Object.create(null); + obj.a = 'b'; + st.equal(qs.stringify(obj), 'a=b'); + st.end(); + }); + + t.test('returns an empty string for invalid input', function (st) { + st.equal(qs.stringify(undefined), ''); + st.equal(qs.stringify(false), ''); + st.equal(qs.stringify(null), ''); + st.equal(qs.stringify(''), ''); + st.end(); + }); + + t.test('stringifies an object with a null object as a child', { skip: !Object.create }, function (st) { + var obj = { a: Object.create(null) }; + + obj.a.b = 'c'; + st.equal(qs.stringify(obj), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('drops keys with a value of undefined', function (st) { + st.equal(qs.stringify({ a: undefined }), ''); + + st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true }), 'a%5Bc%5D'); + st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false }), 'a%5Bc%5D='); + st.equal(qs.stringify({ a: { b: undefined, c: '' } }), 'a%5Bc%5D='); + st.end(); + }); + + t.test('url encodes values', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.end(); + }); + + t.test('stringifies a date', function (st) { + var now = new Date(); + var str = 'a=' + encodeURIComponent(now.toISOString()); + st.equal(qs.stringify({ a: now }), str); + st.end(); + }); + + t.test('stringifies the weird object from qs', function (st) { + st.equal(qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' }), 'my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F'); + st.end(); + }); + + t.test('skips properties that are part of the object prototype', function (st) { + Object.prototype.crash = 'test'; + st.equal(qs.stringify({ a: 'b' }), 'a=b'); + st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); + delete Object.prototype.crash; + st.end(); + }); + + t.test('stringifies boolean values', function (st) { + st.equal(qs.stringify({ a: true }), 'a=true'); + st.equal(qs.stringify({ a: { b: true } }), 'a%5Bb%5D=true'); + st.equal(qs.stringify({ b: false }), 'b=false'); + st.equal(qs.stringify({ b: { c: false } }), 'b%5Bc%5D=false'); + st.end(); + }); + + t.test('stringifies buffer values', function (st) { + st.equal(qs.stringify({ a: SaferBuffer.from('test') }), 'a=test'); + st.equal(qs.stringify({ a: { b: SaferBuffer.from('test') } }), 'a%5Bb%5D=test'); + st.end(); + }); + + t.test('stringifies an object using an alternative delimiter', function (st) { + st.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); + st.end(); + }); + + t.test('doesn\'t blow up when Buffer global is missing', function (st) { + var tempBuffer = global.Buffer; + delete global.Buffer; + var result = qs.stringify({ a: 'b', c: 'd' }); + global.Buffer = tempBuffer; + st.equal(result, 'a=b&c=d'); + st.end(); + }); + + t.test('selects properties when filter=array', function (st) { + st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b'); + st.equal(qs.stringify({ a: 1 }, { filter: [] }), ''); + + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2], arrayFormat: 'indices' } + ), + 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2], arrayFormat: 'brackets' } + ), + 'a%5Bb%5D%5B%5D=1&a%5Bb%5D%5B%5D=3', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2] } + ), + 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', + 'default => indices' + ); + + st.end(); + }); + + t.test('supports custom representations when filter=function', function (st) { + var calls = 0; + var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } }; + var filterFunc = function (prefix, value) { + calls += 1; + if (calls === 1) { + st.equal(prefix, '', 'prefix is empty'); + st.equal(value, obj); + } else if (prefix === 'c') { + return void 0; + } else if (value instanceof Date) { + st.equal(prefix, 'e[f]'); + return value.getTime(); + } + return value; + }; + + st.equal(qs.stringify(obj, { filter: filterFunc }), 'a=b&e%5Bf%5D=1257894000000'); + st.equal(calls, 5); + st.end(); + }); + + t.test('can disable uri encoding', function (st) { + st.equal(qs.stringify({ a: 'b' }, { encode: false }), 'a=b'); + st.equal(qs.stringify({ a: { b: 'c' } }, { encode: false }), 'a[b]=c'); + st.equal(qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false }), 'a=b&c'); + st.end(); + }); + + t.test('can sort the keys', function (st) { + var sort = function (a, b) { + return a.localeCompare(b); + }; + st.equal(qs.stringify({ a: 'c', z: 'y', b: 'f' }, { sort: sort }), 'a=c&b=f&z=y'); + st.equal(qs.stringify({ a: 'c', z: { j: 'a', i: 'b' }, b: 'f' }, { sort: sort }), 'a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a'); + st.end(); + }); + + t.test('can sort the keys at depth 3 or more too', function (st) { + var sort = function (a, b) { + return a.localeCompare(b); + }; + st.equal( + qs.stringify( + { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, + { sort: sort, encode: false } + ), + 'a=a&b=b&z[zi][zia]=zia&z[zi][zib]=zib&z[zj][zja]=zja&z[zj][zjb]=zjb' + ); + st.equal( + qs.stringify( + { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, + { sort: null, encode: false } + ), + 'a=a&z[zj][zjb]=zjb&z[zj][zja]=zja&z[zi][zib]=zib&z[zi][zia]=zia&b=b' + ); + st.end(); + }); + + t.test('can stringify with custom encoding', function (st) { + st.equal(qs.stringify({ 県: '大阪府', '': '' }, { + encoder: function (str) { + if (str.length === 0) { + return ''; + } + var buf = iconv.encode(str, 'shiftjis'); + var result = []; + for (var i = 0; i < buf.length; ++i) { + result.push(buf.readUInt8(i).toString(16)); + } + return '%' + result.join('%'); + } + }), '%8c%a7=%91%e5%8d%e3%95%7b&='); + st.end(); + }); + + t.test('receives the default encoder as a second argument', function (st) { + st.plan(2); + qs.stringify({ a: 1 }, { + encoder: function (str, defaultEncoder) { + st.equal(defaultEncoder, utils.encode); + } + }); + st.end(); + }); + + t.test('throws error with wrong encoder', function (st) { + st['throws'](function () { + qs.stringify({}, { encoder: 'string' }); + }, new TypeError('Encoder has to be a function.')); + st.end(); + }); + + t.test('can use custom encoder for a buffer object', { skip: typeof Buffer === 'undefined' }, function (st) { + st.equal(qs.stringify({ a: SaferBuffer.from([1]) }, { + encoder: function (buffer) { + if (typeof buffer === 'string') { + return buffer; + } + return String.fromCharCode(buffer.readUInt8(0) + 97); + } + }), 'a=b'); + st.end(); + }); + + t.test('serializeDate option', function (st) { + var date = new Date(); + st.equal( + qs.stringify({ a: date }), + 'a=' + date.toISOString().replace(/:/g, '%3A'), + 'default is toISOString' + ); + + var mutatedDate = new Date(); + mutatedDate.toISOString = function () { + throw new SyntaxError(); + }; + st['throws'](function () { + mutatedDate.toISOString(); + }, SyntaxError); + st.equal( + qs.stringify({ a: mutatedDate }), + 'a=' + Date.prototype.toISOString.call(mutatedDate).replace(/:/g, '%3A'), + 'toISOString works even when method is not locally present' + ); + + var specificDate = new Date(6); + st.equal( + qs.stringify( + { a: specificDate }, + { serializeDate: function (d) { return d.getTime() * 7; } } + ), + 'a=42', + 'custom serializeDate function called' + ); + + st.end(); + }); + + t.test('RFC 1738 spaces serialization', function (st) { + st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC1738 }), 'a=b+c'); + st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC1738 }), 'a+b=c+d'); + st.end(); + }); + + t.test('RFC 3986 spaces serialization', function (st) { + st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC3986 }), 'a=b%20c'); + st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC3986 }), 'a%20b=c%20d'); + st.end(); + }); + + t.test('Backward compatibility to RFC 3986', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.end(); + }); + + t.test('Edge cases and unknown formats', function (st) { + ['UFO1234', false, 1234, null, {}, []].forEach( + function (format) { + st['throws']( + function () { + qs.stringify({ a: 'b c' }, { format: format }); + }, + new TypeError('Unknown format option provided.') + ); + } + ); + st.end(); + }); + + t.test('encodeValuesOnly', function (st) { + st.equal( + qs.stringify( + { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, + { encodeValuesOnly: true } + ), + 'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h' + ); + st.equal( + qs.stringify( + { a: 'b', c: ['d', 'e'], f: [['g'], ['h']] } + ), + 'a=b&c%5B0%5D=d&c%5B1%5D=e&f%5B0%5D%5B0%5D=g&f%5B1%5D%5B0%5D=h' + ); + st.end(); + }); + + t.test('encodeValuesOnly - strictNullHandling', function (st) { + st.equal( + qs.stringify( + { a: { b: null } }, + { encodeValuesOnly: true, strictNullHandling: true } + ), + 'a[b]' + ); + st.end(); + }); + + t.test('throws if an invalid charset is specified', function (st) { + st['throws'](function () { + qs.stringify({ a: 'b' }, { charset: 'foobar' }); + }, new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined')); + st.end(); + }); + + t.test('respects a charset of iso-8859-1', function (st) { + st.equal(qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' }), '%E6=%E6'); + st.end(); + }); + + t.test('encodes unrepresentable chars as numeric entities in iso-8859-1 mode', function (st) { + st.equal(qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' }), 'a=%26%239786%3B'); + st.end(); + }); + + t.test('respects an explicit charset of utf-8 (the default)', function (st) { + st.equal(qs.stringify({ a: 'æ' }, { charset: 'utf-8' }), 'a=%C3%A6'); + st.end(); + }); + + t.test('adds the right sentinel when instructed to and the charset is utf-8', function (st) { + st.equal(qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'utf-8' }), 'utf8=%E2%9C%93&a=%C3%A6'); + st.end(); + }); + + t.test('adds the right sentinel when instructed to and the charset is iso-8859-1', function (st) { + st.equal(qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' }), 'utf8=%26%2310003%3B&a=%E6'); + st.end(); + }); + + t.test('does not mutate the options argument', function (st) { + var options = {}; + qs.stringify({}, options); + st.deepEqual(options, {}); + st.end(); + }); + + t.test('strictNullHandling works with custom filter', function (st) { + var filter = function (prefix, value) { + return value; + }; + + var options = { strictNullHandling: true, filter: filter }; + st.equal(qs.stringify({ key: null }, options), 'key'); + st.end(); + }); + + t.test('strictNullHandling works with null serializeDate', function (st) { + var serializeDate = function () { + return null; + }; + var options = { strictNullHandling: true, serializeDate: serializeDate }; + var date = new Date(); + st.equal(qs.stringify({ key: date }, options), 'key'); + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/qs/test/utils.js b/node_modules/qs/test/utils.js new file mode 100644 index 00000000..da31ce53 --- /dev/null +++ b/node_modules/qs/test/utils.js @@ -0,0 +1,136 @@ +'use strict'; + +var test = require('tape'); +var inspect = require('object-inspect'); +var SaferBuffer = require('safer-buffer').Buffer; +var forEach = require('for-each'); +var utils = require('../lib/utils'); + +test('merge()', function (t) { + t.deepEqual(utils.merge(null, true), [null, true], 'merges true into null'); + + t.deepEqual(utils.merge(null, [42]), [null, 42], 'merges null into an array'); + + t.deepEqual(utils.merge({ a: 'b' }, { a: 'c' }), { a: ['b', 'c'] }, 'merges two objects with the same key'); + + var oneMerged = utils.merge({ foo: 'bar' }, { foo: { first: '123' } }); + t.deepEqual(oneMerged, { foo: ['bar', { first: '123' }] }, 'merges a standalone and an object into an array'); + + var twoMerged = utils.merge({ foo: ['bar', { first: '123' }] }, { foo: { second: '456' } }); + t.deepEqual(twoMerged, { foo: { 0: 'bar', 1: { first: '123' }, second: '456' } }, 'merges a standalone and two objects into an array'); + + var sandwiched = utils.merge({ foo: ['bar', { first: '123', second: '456' }] }, { foo: 'baz' }); + t.deepEqual(sandwiched, { foo: ['bar', { first: '123', second: '456' }, 'baz'] }, 'merges an object sandwiched by two standalones into an array'); + + var nestedArrays = utils.merge({ foo: ['baz'] }, { foo: ['bar', 'xyzzy'] }); + t.deepEqual(nestedArrays, { foo: ['baz', 'bar', 'xyzzy'] }); + + var noOptionsNonObjectSource = utils.merge({ foo: 'baz' }, 'bar'); + t.deepEqual(noOptionsNonObjectSource, { foo: 'baz', bar: true }); + + t.test( + 'avoids invoking array setters unnecessarily', + { skip: typeof Object.defineProperty !== 'function' }, + function (st) { + var setCount = 0; + var getCount = 0; + var observed = []; + Object.defineProperty(observed, 0, { + get: function () { + getCount += 1; + return { bar: 'baz' }; + }, + set: function () { setCount += 1; } + }); + utils.merge(observed, [null]); + st.equal(setCount, 0); + st.equal(getCount, 1); + observed[0] = observed[0]; // eslint-disable-line no-self-assign + st.equal(setCount, 1); + st.equal(getCount, 2); + st.end(); + } + ); + + t.end(); +}); + +test('assign()', function (t) { + var target = { a: 1, b: 2 }; + var source = { b: 3, c: 4 }; + var result = utils.assign(target, source); + + t.equal(result, target, 'returns the target'); + t.deepEqual(target, { a: 1, b: 3, c: 4 }, 'target and source are merged'); + t.deepEqual(source, { b: 3, c: 4 }, 'source is untouched'); + + t.end(); +}); + +test('combine()', function (t) { + t.test('both arrays', function (st) { + var a = [1]; + var b = [2]; + var combined = utils.combine(a, b); + + st.deepEqual(a, [1], 'a is not mutated'); + st.deepEqual(b, [2], 'b is not mutated'); + st.notEqual(a, combined, 'a !== combined'); + st.notEqual(b, combined, 'b !== combined'); + st.deepEqual(combined, [1, 2], 'combined is a + b'); + + st.end(); + }); + + t.test('one array, one non-array', function (st) { + var aN = 1; + var a = [aN]; + var bN = 2; + var b = [bN]; + + var combinedAnB = utils.combine(aN, b); + st.deepEqual(b, [bN], 'b is not mutated'); + st.notEqual(aN, combinedAnB, 'aN + b !== aN'); + st.notEqual(a, combinedAnB, 'aN + b !== a'); + st.notEqual(bN, combinedAnB, 'aN + b !== bN'); + st.notEqual(b, combinedAnB, 'aN + b !== b'); + st.deepEqual([1, 2], combinedAnB, 'first argument is array-wrapped when not an array'); + + var combinedABn = utils.combine(a, bN); + st.deepEqual(a, [aN], 'a is not mutated'); + st.notEqual(aN, combinedABn, 'a + bN !== aN'); + st.notEqual(a, combinedABn, 'a + bN !== a'); + st.notEqual(bN, combinedABn, 'a + bN !== bN'); + st.notEqual(b, combinedABn, 'a + bN !== b'); + st.deepEqual([1, 2], combinedABn, 'second argument is array-wrapped when not an array'); + + st.end(); + }); + + t.test('neither is an array', function (st) { + var combined = utils.combine(1, 2); + st.notEqual(1, combined, '1 + 2 !== 1'); + st.notEqual(2, combined, '1 + 2 !== 2'); + st.deepEqual([1, 2], combined, 'both arguments are array-wrapped when not an array'); + + st.end(); + }); + + t.end(); +}); + +test('isBuffer()', function (t) { + forEach([null, undefined, true, false, '', 'abc', 42, 0, NaN, {}, [], function () {}, /a/g], function (x) { + t.equal(utils.isBuffer(x), false, inspect(x) + ' is not a buffer'); + }); + + var fakeBuffer = { constructor: Buffer }; + t.equal(utils.isBuffer(fakeBuffer), false, 'fake buffer is not a buffer'); + + var saferBuffer = SaferBuffer.from('abc'); + t.equal(utils.isBuffer(saferBuffer), true, 'SaferBuffer instance is a buffer'); + + var buffer = Buffer.from ? Buffer.from('abc') : new Buffer('abc'); + t.equal(utils.isBuffer(buffer), true, 'real Buffer instance is a buffer'); + t.end(); +}); diff --git a/node_modules/range-parser/HISTORY.md b/node_modules/range-parser/HISTORY.md new file mode 100644 index 00000000..70a973d8 --- /dev/null +++ b/node_modules/range-parser/HISTORY.md @@ -0,0 +1,56 @@ +1.2.1 / 2019-05-10 +================== + + * Improve error when `str` is not a string + +1.2.0 / 2016-06-01 +================== + + * Add `combine` option to combine overlapping ranges + +1.1.0 / 2016-05-13 +================== + + * Fix incorrectly returning -1 when there is at least one valid range + * perf: remove internal function + +1.0.3 / 2015-10-29 +================== + + * perf: enable strict mode + +1.0.2 / 2014-09-08 +================== + + * Support Node.js 0.6 + +1.0.1 / 2014-09-07 +================== + + * Move repository to jshttp + +1.0.0 / 2013-12-11 +================== + + * Add repository to package.json + * Add MIT license + +0.0.4 / 2012-06-17 +================== + + * Change ret -1 for unsatisfiable and -2 when invalid + +0.0.3 / 2012-06-17 +================== + + * Fix last-byte-pos default to len - 1 + +0.0.2 / 2012-06-14 +================== + + * Add `.type` + +0.0.1 / 2012-06-11 +================== + + * Initial release diff --git a/node_modules/range-parser/LICENSE b/node_modules/range-parser/LICENSE new file mode 100644 index 00000000..35999543 --- /dev/null +++ b/node_modules/range-parser/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson + +```js +var parseRange = require('range-parser') +``` + +### parseRange(size, header, options) + +Parse the given `header` string where `size` is the maximum size of the resource. +An array of ranges will be returned or negative numbers indicating an error parsing. + + * `-2` signals a malformed header string + * `-1` signals an unsatisfiable range + + + +```js +// parse header from request +var range = parseRange(size, req.headers.range) + +// the type of the range +if (range.type === 'bytes') { + // the ranges + range.forEach(function (r) { + // do something with r.start and r.end + }) +} +``` + +#### Options + +These properties are accepted in the options object. + +##### combine + +Specifies if overlapping & adjacent ranges should be combined, defaults to `false`. +When `true`, ranges will be combined and returned as if they were specified that +way in the header. + + + +```js +parseRange(100, 'bytes=50-55,0-10,5-10,56-60', { combine: true }) +// => [ +// { start: 0, end: 10 }, +// { start: 50, end: 60 } +// ] +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/range-parser/master +[coveralls-url]: https://coveralls.io/r/jshttp/range-parser?branch=master +[node-image]: https://badgen.net/npm/node/range-parser +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/range-parser +[npm-url]: https://npmjs.org/package/range-parser +[npm-version-image]: https://badgen.net/npm/v/range-parser +[travis-image]: https://badgen.net/travis/jshttp/range-parser/master +[travis-url]: https://travis-ci.org/jshttp/range-parser diff --git a/node_modules/range-parser/index.js b/node_modules/range-parser/index.js new file mode 100644 index 00000000..b7dc5c0f --- /dev/null +++ b/node_modules/range-parser/index.js @@ -0,0 +1,162 @@ +/*! + * range-parser + * Copyright(c) 2012-2014 TJ Holowaychuk + * Copyright(c) 2015-2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = rangeParser + +/** + * Parse "Range" header `str` relative to the given file `size`. + * + * @param {Number} size + * @param {String} str + * @param {Object} [options] + * @return {Array} + * @public + */ + +function rangeParser (size, str, options) { + if (typeof str !== 'string') { + throw new TypeError('argument str must be a string') + } + + var index = str.indexOf('=') + + if (index === -1) { + return -2 + } + + // split the range string + var arr = str.slice(index + 1).split(',') + var ranges = [] + + // add ranges type + ranges.type = str.slice(0, index) + + // parse all ranges + for (var i = 0; i < arr.length; i++) { + var range = arr[i].split('-') + var start = parseInt(range[0], 10) + var end = parseInt(range[1], 10) + + // -nnn + if (isNaN(start)) { + start = size - end + end = size - 1 + // nnn- + } else if (isNaN(end)) { + end = size - 1 + } + + // limit last-byte-pos to current length + if (end > size - 1) { + end = size - 1 + } + + // invalid or unsatisifiable + if (isNaN(start) || isNaN(end) || start > end || start < 0) { + continue + } + + // add range + ranges.push({ + start: start, + end: end + }) + } + + if (ranges.length < 1) { + // unsatisifiable + return -1 + } + + return options && options.combine + ? combineRanges(ranges) + : ranges +} + +/** + * Combine overlapping & adjacent ranges. + * @private + */ + +function combineRanges (ranges) { + var ordered = ranges.map(mapWithIndex).sort(sortByRangeStart) + + for (var j = 0, i = 1; i < ordered.length; i++) { + var range = ordered[i] + var current = ordered[j] + + if (range.start > current.end + 1) { + // next range + ordered[++j] = range + } else if (range.end > current.end) { + // extend range + current.end = range.end + current.index = Math.min(current.index, range.index) + } + } + + // trim ordered array + ordered.length = j + 1 + + // generate combined range + var combined = ordered.sort(sortByRangeIndex).map(mapWithoutIndex) + + // copy ranges type + combined.type = ranges.type + + return combined +} + +/** + * Map function to add index value to ranges. + * @private + */ + +function mapWithIndex (range, index) { + return { + start: range.start, + end: range.end, + index: index + } +} + +/** + * Map function to remove index value from ranges. + * @private + */ + +function mapWithoutIndex (range) { + return { + start: range.start, + end: range.end + } +} + +/** + * Sort function to sort ranges by index. + * @private + */ + +function sortByRangeIndex (a, b) { + return a.index - b.index +} + +/** + * Sort function to sort ranges by start position. + * @private + */ + +function sortByRangeStart (a, b) { + return a.start - b.start +} diff --git a/node_modules/range-parser/package.json b/node_modules/range-parser/package.json new file mode 100644 index 00000000..6a2894f7 --- /dev/null +++ b/node_modules/range-parser/package.json @@ -0,0 +1,91 @@ +{ + "_from": "range-parser@~1.2.1", + "_id": "range-parser@1.2.1", + "_inBundle": false, + "_integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "_location": "/range-parser", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "range-parser@~1.2.1", + "name": "range-parser", + "escapedName": "range-parser", + "rawSpec": "~1.2.1", + "saveSpec": null, + "fetchSpec": "~1.2.1" + }, + "_requiredBy": [ + "/express", + "/send" + ], + "_resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "_shasum": "3cf37023d199e1c24d1a55b84800c2f3e6468031", + "_spec": "range-parser@~1.2.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "url": "http://tjholowaychuk.com" + }, + "bugs": { + "url": "https://github.com/jshttp/range-parser/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "James Wyatt Cready", + "email": "wyatt.cready@lanetix.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "deprecated": false, + "description": "Range header field string parser", + "devDependencies": { + "deep-equal": "1.0.1", + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "mocha": "6.1.4", + "nyc": "14.1.1" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "index.js" + ], + "homepage": "https://github.com/jshttp/range-parser#readme", + "keywords": [ + "range", + "parser", + "http" + ], + "license": "MIT", + "name": "range-parser", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/range-parser.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "test-travis": "nyc --reporter=text npm test" + }, + "version": "1.2.1" +} diff --git a/node_modules/raw-body/HISTORY.md b/node_modules/raw-body/HISTORY.md new file mode 100644 index 00000000..88c79fce --- /dev/null +++ b/node_modules/raw-body/HISTORY.md @@ -0,0 +1,270 @@ +2.4.0 / 2019-04-17 +================== + + * deps: bytes@3.1.0 + - Add petabyte (`pb`) support + * deps: http-errors@1.7.2 + - Set constructor name when possible + - deps: setprototypeof@1.1.1 + - deps: statuses@'>= 1.5.0 < 2' + * deps: iconv-lite@0.4.24 + - Added encoding MIK + +2.3.3 / 2018-05-08 +================== + + * deps: http-errors@1.6.3 + - deps: depd@~1.1.2 + - deps: setprototypeof@1.1.0 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.23 + - Fix loading encoding with year appended + - Fix deprecation warnings on Node.js 10+ + +2.3.2 / 2017-09-09 +================== + + * deps: iconv-lite@0.4.19 + - Fix ISO-8859-1 regression + - Update Windows-1255 + +2.3.1 / 2017-09-07 +================== + + * deps: bytes@3.0.0 + * deps: http-errors@1.6.2 + - deps: depd@1.1.1 + * perf: skip buffer decoding on overage chunk + +2.3.0 / 2017-08-04 +================== + + * Add TypeScript definitions + * Use `http-errors` for standard emitted errors + * deps: bytes@2.5.0 + * deps: iconv-lite@0.4.18 + - Add support for React Native + - Add a warning if not loaded as utf-8 + - Fix CESU-8 decoding in Node.js 8 + - Improve speed of ISO-8859-1 encoding + +2.2.0 / 2017-01-02 +================== + + * deps: iconv-lite@0.4.15 + - Added encoding MS-31J + - Added encoding MS-932 + - Added encoding MS-936 + - Added encoding MS-949 + - Added encoding MS-950 + - Fix GBK/GB18030 handling of Euro character + +2.1.7 / 2016-06-19 +================== + + * deps: bytes@2.4.0 + * perf: remove double-cleanup on happy path + +2.1.6 / 2016-03-07 +================== + + * deps: bytes@2.3.0 + - Drop partial bytes on all parsed units + - Fix parsing byte string that looks like hex + +2.1.5 / 2015-11-30 +================== + + * deps: bytes@2.2.0 + * deps: iconv-lite@0.4.13 + +2.1.4 / 2015-09-27 +================== + + * Fix masking critical errors from `iconv-lite` + * deps: iconv-lite@0.4.12 + - Fix CESU-8 decoding in Node.js 4.x + +2.1.3 / 2015-09-12 +================== + + * Fix sync callback when attaching data listener causes sync read + - Node.js 0.10 compatibility issue + +2.1.2 / 2015-07-05 +================== + + * Fix error stack traces to skip `makeError` + * deps: iconv-lite@0.4.11 + - Add encoding CESU-8 + +2.1.1 / 2015-06-14 +================== + + * Use `unpipe` module for unpiping requests + +2.1.0 / 2015-05-28 +================== + + * deps: iconv-lite@0.4.10 + - Improved UTF-16 endianness detection + - Leading BOM is now removed when decoding + - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails + +2.0.2 / 2015-05-21 +================== + + * deps: bytes@2.1.0 + - Slight optimizations + +2.0.1 / 2015-05-10 +================== + + * Fix a false-positive when unpiping in Node.js 0.8 + +2.0.0 / 2015-05-08 +================== + + * Return a promise without callback instead of thunk + * deps: bytes@2.0.1 + - units no longer case sensitive when parsing + +1.3.4 / 2015-04-15 +================== + + * Fix hanging callback if request aborts during read + * deps: iconv-lite@0.4.8 + - Add encoding alias UNICODE-1-1-UTF-7 + +1.3.3 / 2015-02-08 +================== + + * deps: iconv-lite@0.4.7 + - Gracefully support enumerables on `Object.prototype` + +1.3.2 / 2015-01-20 +================== + + * deps: iconv-lite@0.4.6 + - Fix rare aliases of single-byte encodings + +1.3.1 / 2014-11-21 +================== + + * deps: iconv-lite@0.4.5 + - Fix Windows-31J and X-SJIS encoding support + +1.3.0 / 2014-07-20 +================== + + * Fully unpipe the stream on error + - Fixes `Cannot switch to old mode now` error on Node.js 0.10+ + +1.2.3 / 2014-07-20 +================== + + * deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + +1.2.2 / 2014-06-19 +================== + + * Send invalid encoding error to callback + +1.2.1 / 2014-06-15 +================== + + * deps: iconv-lite@0.4.3 + - Added encodings UTF-16BE and UTF-16 with BOM + +1.2.0 / 2014-06-13 +================== + + * Passing string as `options` interpreted as encoding + * Support all encodings from `iconv-lite` + +1.1.7 / 2014-06-12 +================== + + * use `string_decoder` module from npm + +1.1.6 / 2014-05-27 +================== + + * check encoding for old streams1 + * support node.js < 0.10.6 + +1.1.5 / 2014-05-14 +================== + + * bump bytes + +1.1.4 / 2014-04-19 +================== + + * allow true as an option + * bump bytes + +1.1.3 / 2014-03-02 +================== + + * fix case when length=null + +1.1.2 / 2013-12-01 +================== + + * be less strict on state.encoding check + +1.1.1 / 2013-11-27 +================== + + * add engines + +1.1.0 / 2013-11-27 +================== + + * add err.statusCode and err.type + * allow for encoding option to be true + * pause the stream instead of dumping on error + * throw if the stream's encoding is set + +1.0.1 / 2013-11-19 +================== + + * dont support streams1, throw if dev set encoding + +1.0.0 / 2013-11-17 +================== + + * rename `expected` option to `length` + +0.2.0 / 2013-11-15 +================== + + * republish + +0.1.1 / 2013-11-15 +================== + + * use bytes + +0.1.0 / 2013-11-11 +================== + + * generator support + +0.0.3 / 2013-10-10 +================== + + * update repo + +0.0.2 / 2013-09-14 +================== + + * dump stream on bad headers + * listen to events after defining received and buffers + +0.0.1 / 2013-09-14 +================== + + * Initial release diff --git a/node_modules/raw-body/LICENSE b/node_modules/raw-body/LICENSE new file mode 100644 index 00000000..d695c8fd --- /dev/null +++ b/node_modules/raw-body/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2013-2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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/node_modules/raw-body/README.md b/node_modules/raw-body/README.md new file mode 100644 index 00000000..2ce79d27 --- /dev/null +++ b/node_modules/raw-body/README.md @@ -0,0 +1,219 @@ +# raw-body + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] + +Gets the entire buffer of a stream either as a `Buffer` or a string. +Validates the stream's length against an expected length and maximum limit. +Ideal for parsing request bodies. + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install raw-body +``` + +### TypeScript + +This module includes a [TypeScript](https://www.typescriptlang.org/) +declaration file to enable auto complete in compatible editors and type +information for TypeScript projects. This module depends on the Node.js +types, so install `@types/node`: + +```sh +$ npm install @types/node +``` + +## API + + + +```js +var getRawBody = require('raw-body') +``` + +### getRawBody(stream, [options], [callback]) + +**Returns a promise if no callback specified and global `Promise` exists.** + +Options: + +- `length` - The length of the stream. + If the contents of the stream do not add up to this length, + an `400` error code is returned. +- `limit` - The byte limit of the body. + This is the number of bytes or any string format supported by + [bytes](https://www.npmjs.com/package/bytes), + for example `1000`, `'500kb'` or `'3mb'`. + If the body ends up being larger than this limit, + a `413` error code is returned. +- `encoding` - The encoding to use to decode the body into a string. + By default, a `Buffer` instance will be returned when no encoding is specified. + Most likely, you want `utf-8`, so setting `encoding` to `true` will decode as `utf-8`. + You can use any type of encoding supported by [iconv-lite](https://www.npmjs.org/package/iconv-lite#readme). + +You can also pass a string in place of options to just specify the encoding. + +If an error occurs, the stream will be paused, everything unpiped, +and you are responsible for correctly disposing the stream. +For HTTP requests, no handling is required if you send a response. +For streams that use file descriptors, you should `stream.destroy()` or `stream.close()` to prevent leaks. + +## Errors + +This module creates errors depending on the error condition during reading. +The error may be an error from the underlying Node.js implementation, but is +otherwise an error created by this module, which has the following attributes: + + * `limit` - the limit in bytes + * `length` and `expected` - the expected length of the stream + * `received` - the received bytes + * `encoding` - the invalid encoding + * `status` and `statusCode` - the corresponding status code for the error + * `type` - the error type + +### Types + +The errors from this module have a `type` property which allows for the progamatic +determination of the type of error returned. + +#### encoding.unsupported + +This error will occur when the `encoding` option is specified, but the value does +not map to an encoding supported by the [iconv-lite](https://www.npmjs.org/package/iconv-lite#readme) +module. + +#### entity.too.large + +This error will occur when the `limit` option is specified, but the stream has +an entity that is larger. + +#### request.aborted + +This error will occur when the request stream is aborted by the client before +reading the body has finished. + +#### request.size.invalid + +This error will occur when the `length` option is specified, but the stream has +emitted more bytes. + +#### stream.encoding.set + +This error will occur when the given stream has an encoding set on it, making it +a decoded stream. The stream should not have an encoding set and is expected to +emit `Buffer` objects. + +## Examples + +### Simple Express example + +```js +var contentType = require('content-type') +var express = require('express') +var getRawBody = require('raw-body') + +var app = express() + +app.use(function (req, res, next) { + getRawBody(req, { + length: req.headers['content-length'], + limit: '1mb', + encoding: contentType.parse(req).parameters.charset + }, function (err, string) { + if (err) return next(err) + req.text = string + next() + }) +}) + +// now access req.text +``` + +### Simple Koa example + +```js +var contentType = require('content-type') +var getRawBody = require('raw-body') +var koa = require('koa') + +var app = koa() + +app.use(function * (next) { + this.text = yield getRawBody(this.req, { + length: this.req.headers['content-length'], + limit: '1mb', + encoding: contentType.parse(this.req).parameters.charset + }) + yield next +}) + +// now access this.text +``` + +### Using as a promise + +To use this library as a promise, simply omit the `callback` and a promise is +returned, provided that a global `Promise` is defined. + +```js +var getRawBody = require('raw-body') +var http = require('http') + +var server = http.createServer(function (req, res) { + getRawBody(req) + .then(function (buf) { + res.statusCode = 200 + res.end(buf.length + ' bytes submitted') + }) + .catch(function (err) { + res.statusCode = 500 + res.end(err.message) + }) +}) + +server.listen(3000) +``` + +### Using with TypeScript + +```ts +import * as getRawBody from 'raw-body'; +import * as http from 'http'; + +const server = http.createServer((req, res) => { + getRawBody(req) + .then((buf) => { + res.statusCode = 200; + res.end(buf.length + ' bytes submitted'); + }) + .catch((err) => { + res.statusCode = err.statusCode; + res.end(err.message); + }); +}); + +server.listen(3000); +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/raw-body.svg +[npm-url]: https://npmjs.org/package/raw-body +[node-version-image]: https://img.shields.io/node/v/raw-body.svg +[node-version-url]: https://nodejs.org/en/download/ +[travis-image]: https://img.shields.io/travis/stream-utils/raw-body/master.svg +[travis-url]: https://travis-ci.org/stream-utils/raw-body +[coveralls-image]: https://img.shields.io/coveralls/stream-utils/raw-body/master.svg +[coveralls-url]: https://coveralls.io/r/stream-utils/raw-body?branch=master +[downloads-image]: https://img.shields.io/npm/dm/raw-body.svg +[downloads-url]: https://npmjs.org/package/raw-body diff --git a/node_modules/raw-body/index.d.ts b/node_modules/raw-body/index.d.ts new file mode 100644 index 00000000..dcbbebd4 --- /dev/null +++ b/node_modules/raw-body/index.d.ts @@ -0,0 +1,87 @@ +import { Readable } from 'stream'; + +declare namespace getRawBody { + export type Encoding = string | true; + + export interface Options { + /** + * The expected length of the stream. + */ + length?: number | string | null; + /** + * The byte limit of the body. This is the number of bytes or any string + * format supported by `bytes`, for example `1000`, `'500kb'` or `'3mb'`. + */ + limit?: number | string | null; + /** + * The encoding to use to decode the body into a string. By default, a + * `Buffer` instance will be returned when no encoding is specified. Most + * likely, you want `utf-8`, so setting encoding to `true` will decode as + * `utf-8`. You can use any type of encoding supported by `iconv-lite`. + */ + encoding?: Encoding | null; + } + + export interface RawBodyError extends Error { + /** + * The limit in bytes. + */ + limit?: number; + /** + * The expected length of the stream. + */ + length?: number; + expected?: number; + /** + * The received bytes. + */ + received?: number; + /** + * The encoding. + */ + encoding?: string; + /** + * The corresponding status code for the error. + */ + status: number; + statusCode: number; + /** + * The error type. + */ + type: string; + } +} + +/** + * Gets the entire buffer of a stream either as a `Buffer` or a string. + * Validates the stream's length against an expected length and maximum + * limit. Ideal for parsing request bodies. + */ +declare function getRawBody( + stream: Readable, + callback: (err: getRawBody.RawBodyError, body: Buffer) => void +): void; + +declare function getRawBody( + stream: Readable, + options: (getRawBody.Options & { encoding: getRawBody.Encoding }) | getRawBody.Encoding, + callback: (err: getRawBody.RawBodyError, body: string) => void +): void; + +declare function getRawBody( + stream: Readable, + options: getRawBody.Options, + callback: (err: getRawBody.RawBodyError, body: Buffer) => void +): void; + +declare function getRawBody( + stream: Readable, + options: (getRawBody.Options & { encoding: getRawBody.Encoding }) | getRawBody.Encoding +): Promise; + +declare function getRawBody( + stream: Readable, + options?: getRawBody.Options +): Promise; + +export = getRawBody; diff --git a/node_modules/raw-body/index.js b/node_modules/raw-body/index.js new file mode 100644 index 00000000..7fe81860 --- /dev/null +++ b/node_modules/raw-body/index.js @@ -0,0 +1,286 @@ +/*! + * raw-body + * Copyright(c) 2013-2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var createError = require('http-errors') +var iconv = require('iconv-lite') +var unpipe = require('unpipe') + +/** + * Module exports. + * @public + */ + +module.exports = getRawBody + +/** + * Module variables. + * @private + */ + +var ICONV_ENCODING_MESSAGE_REGEXP = /^Encoding not recognized: / + +/** + * Get the decoder for a given encoding. + * + * @param {string} encoding + * @private + */ + +function getDecoder (encoding) { + if (!encoding) return null + + try { + return iconv.getDecoder(encoding) + } catch (e) { + // error getting decoder + if (!ICONV_ENCODING_MESSAGE_REGEXP.test(e.message)) throw e + + // the encoding was not found + throw createError(415, 'specified encoding unsupported', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } +} + +/** + * Get the raw body of a stream (typically HTTP). + * + * @param {object} stream + * @param {object|string|function} [options] + * @param {function} [callback] + * @public + */ + +function getRawBody (stream, options, callback) { + var done = callback + var opts = options || {} + + if (options === true || typeof options === 'string') { + // short cut for encoding + opts = { + encoding: options + } + } + + if (typeof options === 'function') { + done = options + opts = {} + } + + // validate callback is a function, if provided + if (done !== undefined && typeof done !== 'function') { + throw new TypeError('argument callback must be a function') + } + + // require the callback without promises + if (!done && !global.Promise) { + throw new TypeError('argument callback is required') + } + + // get encoding + var encoding = opts.encoding !== true + ? opts.encoding + : 'utf-8' + + // convert the limit to an integer + var limit = bytes.parse(opts.limit) + + // convert the expected length to an integer + var length = opts.length != null && !isNaN(opts.length) + ? parseInt(opts.length, 10) + : null + + if (done) { + // classic callback style + return readStream(stream, encoding, length, limit, done) + } + + return new Promise(function executor (resolve, reject) { + readStream(stream, encoding, length, limit, function onRead (err, buf) { + if (err) return reject(err) + resolve(buf) + }) + }) +} + +/** + * Halt a stream. + * + * @param {Object} stream + * @private + */ + +function halt (stream) { + // unpipe everything from the stream + unpipe(stream) + + // pause stream + if (typeof stream.pause === 'function') { + stream.pause() + } +} + +/** + * Read the data from the stream. + * + * @param {object} stream + * @param {string} encoding + * @param {number} length + * @param {number} limit + * @param {function} callback + * @public + */ + +function readStream (stream, encoding, length, limit, callback) { + var complete = false + var sync = true + + // check the length and limit options. + // note: we intentionally leave the stream paused, + // so users should handle the stream themselves. + if (limit !== null && length !== null && length > limit) { + return done(createError(413, 'request entity too large', { + expected: length, + length: length, + limit: limit, + type: 'entity.too.large' + })) + } + + // streams1: assert request encoding is buffer. + // streams2+: assert the stream encoding is buffer. + // stream._decoder: streams1 + // state.encoding: streams2 + // state.decoder: streams2, specifically < 0.10.6 + var state = stream._readableState + if (stream._decoder || (state && (state.encoding || state.decoder))) { + // developer error + return done(createError(500, 'stream encoding should not be set', { + type: 'stream.encoding.set' + })) + } + + var received = 0 + var decoder + + try { + decoder = getDecoder(encoding) + } catch (err) { + return done(err) + } + + var buffer = decoder + ? '' + : [] + + // attach listeners + stream.on('aborted', onAborted) + stream.on('close', cleanup) + stream.on('data', onData) + stream.on('end', onEnd) + stream.on('error', onEnd) + + // mark sync section complete + sync = false + + function done () { + var args = new Array(arguments.length) + + // copy arguments + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + + // mark complete + complete = true + + if (sync) { + process.nextTick(invokeCallback) + } else { + invokeCallback() + } + + function invokeCallback () { + cleanup() + + if (args[0]) { + // halt the stream on error + halt(stream) + } + + callback.apply(null, args) + } + } + + function onAborted () { + if (complete) return + + done(createError(400, 'request aborted', { + code: 'ECONNABORTED', + expected: length, + length: length, + received: received, + type: 'request.aborted' + })) + } + + function onData (chunk) { + if (complete) return + + received += chunk.length + + if (limit !== null && received > limit) { + done(createError(413, 'request entity too large', { + limit: limit, + received: received, + type: 'entity.too.large' + })) + } else if (decoder) { + buffer += decoder.write(chunk) + } else { + buffer.push(chunk) + } + } + + function onEnd (err) { + if (complete) return + if (err) return done(err) + + if (length !== null && received !== length) { + done(createError(400, 'request size did not match content length', { + expected: length, + length: length, + received: received, + type: 'request.size.invalid' + })) + } else { + var string = decoder + ? buffer + (decoder.end() || '') + : Buffer.concat(buffer) + done(null, string) + } + } + + function cleanup () { + buffer = null + + stream.removeListener('aborted', onAborted) + stream.removeListener('data', onData) + stream.removeListener('end', onEnd) + stream.removeListener('error', onEnd) + stream.removeListener('close', cleanup) + } +} diff --git a/node_modules/raw-body/package.json b/node_modules/raw-body/package.json new file mode 100644 index 00000000..63880352 --- /dev/null +++ b/node_modules/raw-body/package.json @@ -0,0 +1,90 @@ +{ + "_from": "raw-body@2.4.0", + "_id": "raw-body@2.4.0", + "_inBundle": false, + "_integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "_location": "/raw-body", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "raw-body@2.4.0", + "name": "raw-body", + "escapedName": "raw-body", + "rawSpec": "2.4.0", + "saveSpec": null, + "fetchSpec": "2.4.0" + }, + "_requiredBy": [ + "/express/body-parser" + ], + "_resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "_shasum": "a1ce6fb9c9bc356ca52e89256ab59059e13d0332", + "_spec": "raw-body@2.4.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express\\node_modules\\body-parser", + "author": { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + }, + "bugs": { + "url": "https://github.com/stream-utils/raw-body/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Raynos", + "email": "raynos2@gmail.com" + } + ], + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "deprecated": false, + "description": "Get and validate the raw body of a readable stream.", + "devDependencies": { + "bluebird": "3.5.4", + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.16.0", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "istanbul": "0.4.5", + "mocha": "6.1.3", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "index.d.ts", + "index.js" + ], + "homepage": "https://github.com/stream-utils/raw-body#readme", + "license": "MIT", + "name": "raw-body", + "repository": { + "type": "git", + "url": "git+https://github.com/stream-utils/raw-body.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --trace-deprecation --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --trace-deprecation --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --trace-deprecation --reporter spec --check-leaks test/" + }, + "version": "2.4.0" +} diff --git a/node_modules/readable-stream/.travis.yml b/node_modules/readable-stream/.travis.yml new file mode 100644 index 00000000..f62cdac0 --- /dev/null +++ b/node_modules/readable-stream/.travis.yml @@ -0,0 +1,34 @@ +sudo: false +language: node_js +before_install: + - (test $NPM_LEGACY && npm install -g npm@2 && npm install -g npm@3) || true +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: NPM_LEGACY=true + - node_js: '0.10' + env: NPM_LEGACY=true + - node_js: '0.11' + env: NPM_LEGACY=true + - node_js: '0.12' + env: NPM_LEGACY=true + - node_js: 1 + env: NPM_LEGACY=true + - node_js: 2 + env: NPM_LEGACY=true + - node_js: 3 + env: NPM_LEGACY=true + - node_js: 4 + - node_js: 5 + - node_js: 6 + - node_js: 7 + - node_js: 8 + - node_js: 9 +script: "npm run test" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 00000000..f478d58d --- /dev/null +++ b/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/readable-stream/GOVERNANCE.md b/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 00000000..16ffb93f --- /dev/null +++ b/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/node_modules/readable-stream/LICENSE b/node_modules/readable-stream/LICENSE new file mode 100644 index 00000000..2873b3b2 --- /dev/null +++ b/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +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/node_modules/readable-stream/README.md b/node_modules/readable-stream/README.md new file mode 100644 index 00000000..23fe3f3e --- /dev/null +++ b/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 00000000..83275f19 --- /dev/null +++ b/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state†+* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state†+* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data†approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/readable-stream/duplex-browser.js b/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 00000000..f8b2db83 --- /dev/null +++ b/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/readable-stream/duplex.js b/node_modules/readable-stream/duplex.js new file mode 100644 index 00000000..46924cbf --- /dev/null +++ b/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 00000000..57003c32 --- /dev/null +++ b/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 00000000..612edb4d --- /dev/null +++ b/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 00000000..0f807646 --- /dev/null +++ b/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 00000000..fcfc105a --- /dev/null +++ b/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 00000000..b0b02200 --- /dev/null +++ b/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 00000000..aefc68bd --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 00000000..5a0a0d88 --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 00000000..9332a3fd --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 00000000..ce2ad5b6 --- /dev/null +++ b/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/node_modules/readable-stream/package.json b/node_modules/readable-stream/package.json new file mode 100644 index 00000000..2ecf2476 --- /dev/null +++ b/node_modules/readable-stream/package.json @@ -0,0 +1,81 @@ +{ + "_from": "readable-stream@^2.3.5", + "_id": "readable-stream@2.3.7", + "_inBundle": false, + "_integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "_location": "/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@^2.3.5", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "^2.3.5", + "saveSpec": null, + "fetchSpec": "^2.3.5" + }, + "_requiredBy": [ + "/bl" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "_shasum": "1eca1cf711aef814c04f62252a36a62f6cb23b57", + "_spec": "readable-stream@^2.3.5", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\bl", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.7" +} diff --git a/node_modules/readable-stream/passthrough.js b/node_modules/readable-stream/passthrough.js new file mode 100644 index 00000000..ffd791d7 --- /dev/null +++ b/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/node_modules/readable-stream/readable-browser.js b/node_modules/readable-stream/readable-browser.js new file mode 100644 index 00000000..e5037259 --- /dev/null +++ b/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/readable-stream/readable.js b/node_modules/readable-stream/readable.js new file mode 100644 index 00000000..ec89ec53 --- /dev/null +++ b/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/node_modules/readable-stream/transform.js b/node_modules/readable-stream/transform.js new file mode 100644 index 00000000..b1baba26 --- /dev/null +++ b/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/node_modules/readable-stream/writable-browser.js b/node_modules/readable-stream/writable-browser.js new file mode 100644 index 00000000..ebdde6a8 --- /dev/null +++ b/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/readable-stream/writable.js b/node_modules/readable-stream/writable.js new file mode 100644 index 00000000..3211a6f8 --- /dev/null +++ b/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/node_modules/readline/.npmignore b/node_modules/readline/.npmignore new file mode 100644 index 00000000..1ca95717 --- /dev/null +++ b/node_modules/readline/.npmignore @@ -0,0 +1,2 @@ +node_modules/ +npm-debug.log diff --git a/node_modules/readline/README.md b/node_modules/readline/README.md new file mode 100644 index 00000000..88a116d4 --- /dev/null +++ b/node_modules/readline/README.md @@ -0,0 +1,66 @@ +## _readline_ +> Read a file line by line. + +## Install + +## Important. In node 10 there is a core module named readline. Please use linebyline instead, it is the same module just renamed: +[Npm linebyline](https://www.npmjs.com/package/linebyline) + +```sh +npm install linebyline +``` + +## Test +```sh +npm install . +npm test + +``` + + +## What's this? + +Simple streaming readline module for NodeJS. Reads a file and buffers new lines emitting a _line_ event for each line. + +## Usage +### Simple +```js + var readline = require('linebyline'), + rl = readline('./somefile.txt'); + rl.on('line', function(line, lineCount, byteCount) { + // do something with the line of text + }) + .on('error', function(e) { + // something went wrong + }); +``` + +### ASCII file decoding +As the underlying `fs.createReadStream` doesn't care about the specific ASCII encoding of the file, an alternative way to decode the file is by telling the `readline` library to retain buffer and then decoding it using a converter (e.g. [`iconv-lite`](https://www.npmjs.com/package/iconv-lite)). +```js + var readline = require('linebyline'), + rl = readline('./file-in-win1251.txt', { + retainBuffer: true //tell readline to retain buffer + }); + rl.on("line", function (data,linecount){ + var line = iconv.decode(data, 'win1251'); + // do something with the line of converted text + }); +``` +##API +## readLine(readingObject[, options]) +### Params: + +* `readingObject` - file path or stream object +* `options` can include: + * `maxLineLength` - override the default 4K buffer size (lines longer than this will not be read) + * `retainBuffer` - avoid converting to String prior to emitting 'line' event; will pass raw buffer with encoded data to the callback + +### Return: + +* **EventEmitter** + + +## License + +BSD © [Craig Brookes](http://craigbrookes.com/) diff --git a/node_modules/readline/package.json b/node_modules/readline/package.json new file mode 100644 index 00000000..55ff222b --- /dev/null +++ b/node_modules/readline/package.json @@ -0,0 +1,57 @@ +{ + "_from": "readline", + "_id": "readline@1.3.0", + "_inBundle": false, + "_integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw=", + "_location": "/readline", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "readline", + "name": "readline", + "escapedName": "readline", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "_shasum": "c580d77ef2cfc8752b132498060dc9793a7ac01c", + "_spec": "readline", + "_where": "C:\\Users\\rin\\Desktop\\final", + "author": { + "name": "craig brookes" + }, + "bugs": { + "url": "https://github.com/maleck13/readline/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Simple streaming readline module.", + "devDependencies": { + "iconv-lite": "0.4.13", + "tap": "0.4.3" + }, + "homepage": "https://github.com/maleck13/readline#readme", + "keywords": [ + "readline", + "line by line", + "file" + ], + "license": "BSD", + "main": "readline.js", + "name": "readline", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/maleck13/readline.git" + }, + "scripts": { + "test": "tap --tap --stderr --timeout=120 test/*.js" + }, + "version": "1.3.0" +} diff --git a/node_modules/readline/readline.js b/node_modules/readline/readline.js new file mode 100644 index 00000000..e11a7a56 --- /dev/null +++ b/node_modules/readline/readline.js @@ -0,0 +1,60 @@ +var fs = require('fs'), + EventEmitter = require('events').EventEmitter, + util = require('util'); + +var readLine = module.exports = function(file, opts) { + if (!(this instanceof readLine)) return new readLine(file, opts); + + EventEmitter.call(this); + opts = opts || {}; + opts.maxLineLength = opts.maxLineLength || 4096; // 4K + opts.retainBuffer = !!opts.retainBuffer; //do not convert to String prior to invoking emit 'line' event + var self = this, + lineBuffer = new Buffer(opts.maxLineLength), + lineLength = 0, + lineCount = 0, + byteCount = 0, + emit = function(lineCount, byteCount) { + try { + var line = lineBuffer.slice(0, lineLength); + self.emit('line', opts.retainBuffer? line : line.toString(), lineCount, byteCount); + } catch (err) { + self.emit('error', err); + } finally { + lineLength = 0; // Empty buffer. + } + }; + this.input = ('string' === typeof file) ? fs.createReadStream(file, opts) : file; + this.input.on('open', function(fd) { + self.emit('open', fd); + }) + .on('data', function(data) { + for (var i = 0; i < data.length; i++) { + if (data[i] == 10 || data[i] == 13) { // Newline char was found. + if (data[i] == 10) { + lineCount++; + emit(lineCount, byteCount); + } + } else { + lineBuffer[lineLength] = data[i]; // Buffer new line data. + lineLength++; + } + byteCount++; + } + }) + .on('error', function(err) { + self.emit('error', err); + }) + .on('end', function() { + // Emit last line if anything left over since EOF won't trigger it. + if (lineLength) { + lineCount++; + emit(lineCount, byteCount); + } + self.emit('end'); + }) + .on('close', function() { + self.emit('close'); + }); +}; +util.inherits(readLine, EventEmitter); diff --git a/node_modules/readline/test/fixtures/afile.txt b/node_modules/readline/test/fixtures/afile.txt new file mode 100644 index 00000000..08f8b67f --- /dev/null +++ b/node_modules/readline/test/fixtures/afile.txt @@ -0,0 +1,39773 @@ +The Project Gutenberg EBook of The Adventures of Sherlock Holmes +by Sir Arthur Conan Doyle +(#15 in our series by Sir Arthur Conan Doyle) + +Copyright laws are changing all over the world. Be sure to check the +copyright laws for your country before downloading or redistributing +this or any other Project Gutenberg eBook. + +This header should be the first thing seen when viewing this Project +Gutenberg file. Please do not remove it. Do not change or edit the +header without written permission. + +Please read the "legal small print," and other information about the +eBook and Project Gutenberg at the bottom of this file. Included is +important information about your specific rights and restrictions in +how the file may be used. You can also find out about how to make a +donation to Project Gutenberg, and how to get involved. + + +**Welcome To The World of Free Plain Vanilla Electronic Texts** + +**eBooks Readable By Both Humans and By Computers, Since 1971** + +*****These eBooks Were Prepared By Thousands of Volunteers!***** + + +Title: The Adventures of Sherlock Holmes + +Author: Sir Arthur Conan Doyle + +Release Date: March, 1999 [EBook #1661] +[Most recently updated: November 29, 2002] + +Edition: 12 + +Language: English + +Character set encoding: ASCII + +*** START OF THE PROJECT GUTENBERG EBOOK, THE ADVENTURES OF SHERLOCK HOLMES *** + + + + +(Additional editing by Jose Menendez) + + + +THE ADVENTURES OF +SHERLOCK HOLMES + +BY + +SIR ARTHUR CONAN DOYLE + +CONTENTS + +I. A Scandal in Bohemia +II. The Red-Headed League +III. A Case of Identity +IV. The Boscombe Valley Mystery +V. The Five Orange Pips +VI. The Man with the Twisted Lip +VII. The Adventure of the Blue Carbuncle +VIII. The Adventure of the Speckled Band +IX. The Adventure of the Engineer's Thumb +X. The Adventure of the Noble Bachelor +XI. The Adventure of the Beryl Coronet +XII. The Adventure of the Copper Beeches + + +ADVENTURE I. A SCANDAL IN BOHEMIA + +I. + + +To Sherlock Holmes she is always the woman. I have seldom heard him mention her under any other name. In his eyes she eclipses and predominates the whole of her sex. It was not that he felt any emotion akin to love for Irene Adler. All emotions, and that one particularly, were abhorrent to his cold, precise but admirably balanced mind. He was, I take it, the most perfect reasoning and observing machine that the world has seen, but as a lover he would have placed himself in a false position. He never spoke of the softer passions, save with a gibe and a sneer. They were admirable things for the observer--excellent for drawing the veil from men's motives and actions. But for the trained reasoner to admit such intrusions into his own delicate and finely adjusted temperament was to introduce a distracting factor which might throw a doubt upon all his mental results. Grit in a sensitive instrument, or a crack in one of his own high-power lenses, would not be more disturbing than a strong emotion in a nature such as his. And yet there was but one woman to him, and that woman was the late Irene Adler, of dubious and questionable memory. + +I had seen little of Holmes lately. My marriage had drifted us away from each other. My own complete happiness, and the home-centred interests which rise up around the man who first finds himself master of his own establishment, were sufficient to absorb all my attention, while Holmes, who loathed every form of society with his whole Bohemian soul, remained in our lodgings in Baker Street, buried among his old books, and alternating from week to week between cocaine and ambition, the drowsiness of the drug, and the fierce energy of his own keen nature. He was still, as ever, deeply attracted by the study of crime, and occupied his immense faculties and extraordinary powers of observation in following out those clues, and clearing up those mysteries which had been abandoned as hopeless by the official police. From time to time I heard some vague account of his doings: of his summons to Odessa in the case of the Trepoff murder, of his clearing up of the singular tragedy of the Atkinson brothers at Trincomalee, and finally of the mission which he had accomplished so delicately and successfully for the reigning family of Holland. Beyond these signs of his activity, however, which I merely shared with all the readers of the daily press, I knew little of my former friend and companion. + +One night--it was on the twentieth of March, 1888--I was returning from a journey to a patient (for I had now returned to civil practice), when my way led me through Baker Street. As I passed the well-remembered door, which must always be associated in my mind with my wooing, and with the dark incidents of the Study in Scarlet, I was seized with a keen desire to see Holmes again, and to know how he was employing his extraordinary powers. His rooms were brilliantly lit, and, even as I looked up, I saw his tall, spare figure pass twice in a dark silhouette against the blind. He was pacing the room swiftly, eagerly, with his head sunk upon his chest and his hands clasped behind him. To me, who knew his every mood and habit, his attitude and manner told their own story. He was at work again. He had risen out of his drug-created dreams and was hot upon the scent of some new problem. I rang the bell and was shown up to the chamber which had formerly been in part my own. + +His manner was not effusive. It seldom was; but he was glad, I think, to see me. With hardly a word spoken, but with a kindly eye, he waved me to an armchair, threw across his case of cigars, and indicated a spirit case and a gasogene in the corner. Then he stood before the fire and looked me over in his singular introspective fashion. + +"Wedlock suits you," he remarked. "I think, Watson, that you have put on seven and a half pounds since I saw you." + +"Seven!" I answered. + +"Indeed, I should have thought a little more. Just a trifle more, I fancy, Watson. And in practice again, I observe. You did not tell me that you intended to go into harness." + +"Then, how do you know?" + +"I see it, I deduce it. How do I know that you have been getting yourself very wet lately, and that you have a most clumsy and careless servant girl?" + +"My dear Holmes," said I, "this is too much. You would certainly have been burned, had you lived a few centuries ago. It is true that I had a country walk on Thursday and came home in a dreadful mess, but as I have changed my clothes I can't imagine how you deduce it. As to Mary Jane, she is incorrigible, and my wife has given her notice, but there, again, I fail to see how you work it out." + +He chuckled to himself and rubbed his long, nervous hands together. + +"It is simplicity itself," said he; "my eyes tell me that on the inside of your left shoe, just where the firelight strikes it, the leather is scored by six almost parallel cuts. Obviously they have been caused by someone who has very carelessly scraped round the edges of the sole in order to remove crusted mud from it. Hence, you see, my double deduction that you had been out in vile weather, and that you had a particularly malignant boot-slitting specimen of the London slavey. As to your practice, if a gentleman walks into my rooms smelling of iodoform, with a black mark of nitrate of silver upon his right forefinger, and a bulge on the right side of his top-hat to show where he has secreted his stethoscope, I must be dull, indeed, if I do not pronounce him to be an active member of the medical profession." + +I could not help laughing at the ease with which he explained his process of deduction. "When I hear you give your reasons," I remarked, "the thing always appears to me to be so ridiculously simple that I could easily do it myself, though at each successive instance of your reasoning I am baffled until you explain your process. And yet I believe that my eyes are as good as yours." + +"Quite so," he answered, lighting a cigarette, and throwing himself down into an armchair. "You see, but you do not observe. The distinction is clear. For example, you have frequently seen the steps which lead up from the hall to this room." + +"Frequently." + +"How often?" + +"Well, some hundreds of times." + +"Then how many are there?" + +"How many? I don't know." + +"Quite so! You have not observed. And yet you have seen. That is just my point. Now, I know that there are seventeen steps, because I have both seen and observed. By the way, since you are interested in these little problems, and since you are good enough to chronicle one or two of my trifling experiences, you may be interested in this." He threw over a sheet of thick, pink-tinted notepaper which had been lying open upon the table. "It came by the last post," said he. "Read it aloud." + +The note was undated, and without either signature or address. + +"There will call upon you to-night, at a quarter to eight o'clock," it said, "a gentleman who desires to consult you upon a matter of the very deepest moment. Your recent services to one of the royal houses of Europe have shown that you are one who may safely be trusted with matters which are of an importance which can hardly be exaggerated. This account of you we have from all quarters received. Be in your chamber then at that hour, and do not take it amiss if your visitor wear a mask." + +"This is indeed a mystery," I remarked. "What do you imagine that it means?" + +"I have no data yet. It is a capital mistake to theorise before one has data. Insensibly one begins to twist facts to suit theories, instead of theories to suit facts. But the note itself. What do you deduce from it?" + +I carefully examined the writing, and the paper upon which it was written. + +"The man who wrote it was presumably well to do," I remarked, endeavouring to imitate my companion's processes. "Such paper could not be bought under half a crown a packet. It is peculiarly strong and stiff." + +"Peculiar--that is the very word," said Holmes. "It is not an English paper at all. Hold it up to the light." + +I did so, and saw a large "E" with a small "g," a "P," and a large "G" with a small "t" woven into the texture of the paper. + +"What do you make of that?" asked Holmes. + +"The name of the maker, no doubt; or his monogram, rather." + +"Not at all. The 'G' with the small 't' stands for 'Gesellschaft,' which is the German for 'Company.' It is a customary contraction like our 'Co.' 'P,' of course, stands for 'Papier.' Now for the 'Eg.' Let us glance at our Continental Gazetteer." He took down a heavy brown volume from his shelves. "Eglow, Eglonitz--here we are, Egria. It is in a German-speaking country--in Bohemia, not far from Carlsbad. 'Remarkable as being the scene of the death of Wallenstein, and for its numerous glass-factories and paper-mills.' Ha, ha, my boy, what do you make of that?" His eyes sparkled, and he sent up a great blue triumphant cloud from his cigarette. + +"The paper was made in Bohemia," I said. + +"Precisely. And the man who wrote the note is a German. Do you note the peculiar construction of the sentence--'This account of you we have from all quarters received.' A Frenchman or Russian could not have written that. It is the German who is so uncourteous to his verbs. It only remains, therefore, to discover what is wanted by this German who writes upon Bohemian paper and prefers wearing a mask to showing his face. And here he comes, if I am not mistaken, to resolve all our doubts." + +As he spoke there was the sharp sound of horses' hoofs and grating wheels against the curb, followed by a sharp pull at the bell. Holmes whistled. + +"A pair, by the sound," said he. "Yes," he continued, glancing out of the window. "A nice little brougham and a pair of beauties. A hundred and fifty guineas apiece. There's money in this case, Watson, if there is nothing else." + +"I think that I had better go, Holmes." + +"Not a bit, Doctor. Stay where you are. I am lost without my Boswell. And this promises to be interesting. It would be a pity to miss it." + +"But your client--" + +"Never mind him. I may want your help, and so may he. Here he comes. Sit down in that armchair, Doctor, and give us your best attention." + +A slow and heavy step, which had been heard upon the stairs and in the passage, paused immediately outside the door. Then there was a loud and authoritative tap. + +"Come in!" said Holmes. + +A man entered who could hardly have been less than six feet six inches in height, with the chest and limbs of a Hercules. His dress was rich with a richness which would, in England, be looked upon as akin to bad taste. Heavy bands of astrakhan were slashed across the sleeves and fronts of his double-breasted coat, while the deep blue cloak which was thrown over his shoulders was lined with flame-coloured silk and secured at the neck with a brooch which consisted of a single flaming beryl. Boots which extended halfway up his calves, and which were trimmed at the tops with rich brown fur, completed the impression of barbaric opulence which was suggested by his whole appearance. He carried a broad-brimmed hat in his hand, while he wore across the upper part of his face, extending down past the cheekbones, a black vizard mask, which he had apparently adjusted that very moment, for his hand was still raised to it as he entered. From the lower part of the face he appeared to be a man of strong character, with a thick, hanging lip, and a long, straight chin suggestive of resolution pushed to the length of obstinacy. + +"You had my note?" he asked with a deep harsh voice and a strongly marked German accent. "I told you that I would call." He looked from one to the other of us, as if uncertain which to address. + +"Pray take a seat," said Holmes. "This is my friend and colleague, Dr. Watson, who is occasionally good enough to help me in my cases. Whom have I the honour to address?" + +"You may address me as the Count Von Kramm, a Bohemian nobleman. I understand that this gentleman, your friend, is a man of honour and discretion, whom I may trust with a matter of the most extreme importance. If not, I should much prefer to communicate with you alone." + +I rose to go, but Holmes caught me by the wrist and pushed me back into my chair. "It is both, or none," said he. "You may say before this gentleman anything which you may say to me." + +The Count shrugged his broad shoulders. "Then I must begin," said he, "by binding you both to absolute secrecy for two years; at the end of that time the matter will be of no importance. At present it is not too much to say that it is of such weight it may have an influence upon European history." + +"I promise," said Holmes. + +"And I." + +"You will excuse this mask," continued our strange visitor. "The august person who employs me wishes his agent to be unknown to you, and I may confess at once that the title by which I have just called myself is not exactly my own." + +"I was aware of it," said Holmes dryly. + +"The circumstances are of great delicacy, and every precaution has to be taken to quench what might grow to be an immense scandal and seriously compromise one of the reigning families of Europe. To speak plainly, the matter implicates the great House of Ormstein, hereditary kings of Bohemia." + +"I was also aware of that," murmured Holmes, settling himself down in his armchair and closing his eyes. + +Our visitor glanced with some apparent surprise at the languid, lounging figure of the man who had been no doubt depicted to him as the most incisive reasoner and most energetic agent in Europe. Holmes slowly reopened his eyes and looked impatiently at his gigantic client. + +"If your Majesty would condescend to state your case," he remarked, "I should be better able to advise you." + +The man sprang from his chair and paced up and down the room in uncontrollable agitation. Then, with a gesture of desperation, he tore the mask from his face and hurled it upon the ground. "You are right," he cried; "I am the King. Why should I attempt to conceal it?" + +"Why, indeed?" murmured Holmes. "Your Majesty had not spoken before I was aware that I was addressing Wilhelm Gottsreich Sigismond von Ormstein, Grand Duke of Cassel-Felstein, and hereditary King of Bohemia." + +"But you can understand," said our strange visitor, sitting down once more and passing his hand over his high white forehead, "you can understand that I am not accustomed to doing such business in my own person. Yet the matter was so delicate that I could not confide it to an agent without putting myself in his power. I have come incognito from Prague for the purpose of consulting you." + +"Then, pray consult," said Holmes, shutting his eyes once more. + +"The facts are briefly these: Some five years ago, during a lengthy visit to Warsaw, I made the acquaintance of the well-known adventuress, Irene Adler. The name is no doubt familiar to you." + +"Kindly look her up in my index, Doctor," murmured Holmes without opening his eyes. For many years he had adopted a system of docketing all paragraphs concerning men and things, so that it was difficult to name a subject or a person on which he could not at once furnish information. In this case I found her biography sandwiched in between that of a Hebrew rabbi and that of a staff-commander who had written a monograph upon the deep-sea fishes. + +"Let me see!" said Holmes. "Hum! Born in New Jersey in the year 1858. Contralto--hum! La Scala, hum! Prima donna Imperial Opera of Warsaw--yes! Retired from operatic stage--ha! Living in London--quite so! Your Majesty, as I understand, became entangled with this young person, wrote her some compromising letters, and is now desirous of getting those letters back." + +"Precisely so. But how--" + +"Was there a secret marriage?" + +"None." + +"No legal papers or certificates?" + +"None." + +"Then I fail to follow your Majesty. If this young person should produce her letters for blackmailing or other purposes, how is she to prove their authenticity?" + +"There is the writing." + +"Pooh, pooh! Forgery." + +"My private note-paper." + +"Stolen." + +"My own seal." + +"Imitated." + +"My photograph." + +"Bought." + +"We were both in the photograph." + +"Oh, dear! That is very bad! Your Majesty has indeed committed an indiscretion." + +"I was mad--insane." + +"You have compromised yourself seriously." + +"I was only Crown Prince then. I was young. I am but thirty now." + +"It must be recovered." + +"We have tried and failed." + +"Your Majesty must pay. It must be bought." + +"She will not sell." + +"Stolen, then." + +"Five attempts have been made. Twice burglars in my pay ransacked her house. Once we diverted her luggage when she travelled. Twice she has been waylaid. There has been no result." + + + +"On the contrary, Watson, you can see everything. You fail, however, to reason from what you see. You are too timid in drawing your inferences." + +"Then, pray tell me what it is that you can infer from this hat?" + +He picked it up and gazed at it in the peculiar introspective fashion which was characteristic of him. "It is perhaps less suggestive than it might have been," he remarked, "and yet there are a few inferences which are very distinct, and a few others which represent at least a strong balance of probability. That the man was highly intellectual is of course obvious upon the face of it, and also that he was fairly well-to-do within the last three years, although he has now fallen upon evil days. He had foresight, but has less now than formerly, pointing to a moral retrogression, which, when taken with the decline of his fortunes, seems to indicate some evil influence, probably drink, at work upon him. This may account also for the obvious fact that his wife has ceased to love him." + +"My dear Holmes!" + +"He has, however, retained some degree of self-respect," he continued, disregarding my remonstrance. "He is a man who leads a sedentary life, goes out little, is out of training entirely, is middle-aged, has grizzled hair which he has had cut within the last few days, and which he anoints with lime-cream. These are the more patent facts which are to be deduced from his hat. Also, by the way, that it is extremely improbable that he has gas laid on in his house." + +"You are certainly joking, Holmes." + +"Not in the least. Is it possible that even now, when I give you these results, you are unable to see how they are attained?" + +"I have no doubt that I am very stupid, but I must confess that I am unable to follow you. For example, how did you deduce that this man was intellectual?" + +For answer Holmes clapped the hat upon his head. It came right over the forehead and settled upon the bridge of his nose. "It is a question of cubic capacity," said he; "a man with so large a brain must have something in it." + +"The decline of his fortunes, then?" + +"This hat is three years old. These flat brims curled at the edge came in then. It is a hat of the very best quality. Look at the band of ribbed silk and the excellent lining. If this man could afford to buy so expensive a hat three years ago, and has had no hat since, then he has assuredly gone down in the world." + +"Well, that is clear enough, certainly. But how about the foresight and the moral retrogression?" + +Sherlock Holmes laughed. "Here is the foresight," said he putting his finger upon the little disc and loop of the hat-securer. "They are never sold upon hats. If this man ordered one, it is a sign of a certain amount of foresight, since he went out of his way to take this precaution against the wind. But since we see that he has broken the elastic and has not troubled to replace it, it is obvious that he has less foresight now than formerly, which is a distinct proof of a weakening nature. On the other hand, he has endeavoured to conceal some of these stains upon the felt by daubing them with ink, which is a sign that he has not entirely lost his self-respect." + +"Your reasoning is certainly plausible." + +"The further points, that he is middle-aged, that his hair is grizzled, that it has been recently cut, and that he uses lime-cream, are all to be gathered from a close examination of the lower part of the lining. The lens discloses a large number of hair-ends, clean cut by the scissors of the barber. They all appear to be adhesive, and there is a distinct odour of lime-cream. This dust, you will observe, is not the gritty, grey dust of the street but the fluffy brown dust of the house, showing that it has been hung up indoors most of the time, while the marks of moisture upon the inside are proof positive that the wearer perspired very freely, and could therefore, hardly be in the best of training." + +"But his wife--you said that she had ceased to love him." + +"This hat has not been brushed for weeks. When I see you, my dear Watson, with a week's accumulation of dust upon your hat, and when your wife allows you to go out in such a state, I shall fear that you also have been unfortunate enough to lose your wife's affection." + +"But he might be a bachelor." + +"Nay, he was bringing home the goose as a peace-offering to his wife. Remember the card upon the bird's leg." + +"You have an answer to everything. But how on earth do you deduce that the gas is not laid on in his house?" + +"One tallow stain, or even two, might come by chance; but when I see no less than five, I think that there can be little doubt that the individual must be brought into frequent contact with burning tallow--walks upstairs at night probably with his hat in one hand and a guttering candle in the other. Anyhow, he never got tallow-stains from a gas-jet. Are you satisfied?" + +"Well, it is very ingenious," said I, laughing; "but since, as you said just now, there has been no crime committed, and no harm done save the loss of a goose, all this seems to be rather a waste of energy." + +Sherlock Holmes had opened his mouth to reply, when the door flew open, and Peterson, the commissionaire, rushed into the apartment with flushed cheeks and the face of a man who is dazed with astonishment. + +"The goose, Mr. Holmes! The goose, sir!" he gasped. + +"Eh? What of it, then? Has it returned to life and flapped off through the kitchen window?" Holmes twisted himself round upon the sofa to get a fairer view of the man's excited face. + +"See here, sir! See what my wife found in its crop!" He held out his hand and displayed upon the centre of the palm a brilliantly scintillating blue stone, rather smaller than a bean in size, but of such purity and radiance that it twinkled like an electric point in the dark hollow of his hand. + +Sherlock Holmes sat up with a whistle. "By Jove, Peterson!" said he, "this is treasure trove indeed. I suppose you know what you have got?" + +"A diamond, sir? A precious stone. It cuts into glass as though it were putty." + +"It's more than a precious stone. It is the precious stone." + +"Not the Countess of Morcar's blue carbuncle!" I ejaculated. + +"Precisely so. I ought to know its size and shape, seeing that I have read the advertisement about it in The Times every day lately. It is absolutely unique, and its value can only be conjectured, but the reward offered of $1000 is certainly not within a twentieth part of the market price." + +"A thousand pounds! Great Lord of mercy!" The commissionaire plumped down into a chair and stared from one to the other of us. + +"That is the reward, and I have reason to know that there are sentimental considerations in the background which would induce the Countess to part with half her fortune if she could but recover the gem." + +"It was lost, if I remember aright, at the Hotel Cosmopolitan," I remarked. + +"Precisely so, on December 22nd, just five days ago. John Horner, a plumber, was accused of having abstracted it from the lady's jewel-case. The evidence against him was so strong that the case has been referred to the Assizes. I have some account of the matter here, I believe." He rummaged amid his newspapers, glancing over the dates, until at last he smoothed one out, doubled it over, and read the following paragraph: + +"Hotel Cosmopolitan Jewel Robbery. John Horner, 26, plumber, was brought up upon the charge of having upon the 22nd inst., abstracted from the jewel-case of the Countess of Morcar the valuable gem known as the blue carbuncle. James Ryder, upper-attendant at the hotel, gave his evidence to the effect that he had shown Horner up to the dressing-room of the Countess of Morcar upon the day of the robbery in order that he might solder the second bar of the grate, which was loose. He had remained with Horner some little time, but had finally been called away. On returning, he found that Horner had disappeared, that the bureau had been forced open, and that the small morocco casket in which, as it afterwards transpired, the Countess was accustomed to keep her jewel, was lying empty upon the dressing-table. Ryder instantly gave the alarm, and Horner was arrested the same evening; but the stone could not be found either upon his person or in his rooms. Catherine Cusack, maid to the Countess, deposed to having heard Ryder's cry of dismay on discovering the robbery, and to having rushed into the room, where she found matters as described by the last witness. Inspector Bradstreet, B division, gave evidence as to the arrest of Horner, who struggled frantically, and protested his innocence in the strongest terms. Evidence of a previous conviction for robbery having been given against the prisoner, the magistrate refused to deal summarily with the offence, but referred it to the Assizes. Horner, who had shown signs of intense emotion during the proceedings, fainted away at the conclusion and was carried out of court." + +"Hum! So much for the police-court," said Holmes thoughtfully, tossing aside the paper. "The question for us now to solve is the sequence of events leading from a rifled jewel-case at one end to the crop of a goose in Tottenham Court Road at the other. You see, Watson, our little deductions have suddenly assumed a much more important and less innocent aspect. Here is the stone; the stone came from the goose, and the goose came from Mr. Henry Baker, the gentleman with the bad hat and all the other characteristics with which I have bored you. So now we must set ourselves very seriously to finding this gentleman and ascertaining what part he has played in this little mystery. To do this, we must try the simplest means first, and these lie undoubtedly in an advertisement in all the evening papers. If this fail, I shall have recourse to other methods." + +"What will you say?" + +"Give me a pencil and that slip of paper. Now, then: 'Found at the corner of Goodge Street, a goose and a black felt hat. Mr. Henry Baker can have the same by applying at 6:30 this evening at 221B, Baker Street.' That is clear and concise." + +"Very. But will he see it?" + +"Well, he is sure to keep an eye on the papers, since, to a poor man, the loss was a heavy one. He was clearly so scared by his mischance in breaking the window and by the approach of Peterson that he thought of nothing but flight, but since then he must have bitterly regretted the impulse which caused him to drop his bird. Then, again, the introduction of his name will cause him to see it, for everyone who knows him will direct his attention to it. Here you are, Peterson, run down to the advertising agency and have this put in the evening papers." + +"In which, sir?" + +"Oh, in the Globe, Star, Pall Mall, St. James's, Evening News, Standard, Echo, and any others that occur to you." + +"Very well, sir. And this stone?" + +"Ah, yes, I shall keep the stone. Thank you. And, I say, Peterson, just buy a goose on your way back and leave it here with me, for we must have one to give to this gentleman in place of the one which your family is now devouring." + +When the commissionaire had gone, Holmes took up the stone and held it against the light. "It's a bonny thing," said he. "Just see how it glints and sparkles. Of course it is a nucleus and focus of crime. Every good stone is. They are the devil's pet baits. In the larger and older jewels every facet may stand for a bloody deed. This stone is not yet twenty years old. It was found in the banks of the Amoy River in southern China and is remarkable in having every characteristic of the carbuncle, save that it is blue in shade instead of ruby red. In spite of its youth, it has already a sinister history. There have been two murders, a vitriol-throwing, a suicide, and several robberies brought about for the sake of this forty-grain weight of crystallised charcoal. Who would think that so pretty a toy would be a purveyor to the gallows and the prison? I'll lock it up in my strong box now and drop a line to the Countess to say that we have it." + +"Do you think that this man Horner is innocent?" + +"I cannot tell." + +"Well, then, do you imagine that this other one, Henry Baker, had anything to do with the matter?" + +"It is, I think, much more likely that Henry Baker is an absolutely innocent man, who had no idea that the bird which he was carrying was of considerably more value than if it were made of solid gold. That, however, I shall determine by a very simple test if we have an answer to our advertisement." + +"And you can do nothing until then?" + +"Nothing." + +"In that case I shall continue my professional round. But I shall come back in the evening at the hour you have mentioned, for I should like to see the solution of so tangled a business." + +"Very glad to see you. I dine at seven. There is a woodcock, I believe. By the way, in view of recent occurrences, perhaps I ought to ask Mrs. Hudson to examine its crop." + +I had been delayed at a case, and it was a little after half-past six when I found myself in Baker Street once more. As I approached the house I saw a tall man in a Scotch bonnet with a coat which was buttoned up to his chin waiting outside in the bright semicircle which was thrown from the fanlight. Just as I arrived the door was opened, and we were shown up together to Holmes' room. + +"Mr. Henry Baker, I believe," said he, rising from his armchair and greeting his visitor with the easy air of geniality which he could so readily assume. "Pray take this chair by the fire, Mr. Baker. It is a cold night, and I observe that your circulation is more adapted for summer than for winter. Ah, Watson, you have just come at the right time. Is that your hat, Mr. Baker?" + +"Yes, sir, that is undoubtedly my hat." + +He was a large man with rounded shoulders, a massive head, and a broad, intelligent face, sloping down to a pointed beard of grizzled brown. A touch of red in nose and cheeks, with a slight tremor of his extended hand, recalled Holmes' surmise as to his habits. His rusty black frock-coat was buttoned right up in front, with the collar turned up, and his lank wrists protruded from his sleeves without a sign of cuff or shirt. He spoke in a slow staccato fashion, choosing his words with care, and gave the impression generally of a man of learning and letters who had had ill-usage at the hands of fortune. + +"We have retained these things for some days," said Holmes, "because we expected to see an advertisement from you giving your address. I am at a loss to know now why you did not advertise." + +Our visitor gave a rather shamefaced laugh. "Shillings have not been so plentiful with me as they once were," he remarked. "I had no doubt that the gang of roughs who assaulted me had carried off both my hat and the bird. I did not care to spend more money in a hopeless attempt at recovering them." + +"Very naturally. By the way, about the bird, we were compelled to eat it." + +"To eat it!" Our visitor half rose from his chair in his excitement. + +"Yes, it would have been of no use to anyone had we not done so. But I presume that this other goose upon the sideboard, which is about the same weight and perfectly fresh, will answer your purpose equally well?" + +"Oh, certainly, certainly," answered Mr. Baker with a sigh of relief. + +"Of course, we still have the feathers, legs, crop, and so on of your own bird, so if you wish--" + +The man burst into a hearty laugh. "They might be useful to me as relics of my adventure," said he, "but beyond that I can hardly see what use the disjecta membra of my late acquaintance are going to be to me. No, sir, I think that, with your permission, I will confine my attentions to the excellent bird which I perceive upon the sideboard." + +Sherlock Holmes glanced sharply across at me with a slight shrug of his shoulders. + +"There is your hat, then, and there your bird," said he. "By the way, would it bore you to tell me where you got the other one from? I am somewhat of a fowl fancier, and I have seldom seen a better grown goose." + +"Certainly, sir," said Baker, who had risen and tucked his newly gained property under his arm. "There are a few of us who frequent the Alpha Inn, near the Museum--we are to be found in the Museum itself during the day, you understand. This year our good host, Windigate by name, instituted a goose club, by which, on consideration of some few pence every week, we were each to receive a bird at Christmas. My pence were duly paid, and the rest is familiar to you. I am much indebted to you, sir, for a Scotch bonnet is fitted neither to my years nor my gravity." With a comical pomposity of manner he bowed solemnly to both of us and strode off upon his way. + +"So much for Mr. Henry Baker," said Holmes when he had closed the door behind him. "It is quite certain that he knows nothing whatever about the matter. Are you hungry, Watson?" + +"Not particularly." + +"Then I suggest that we turn our dinner into a supper and follow up this clue while it is still hot." + +"By all means." + +It was a bitter night, so we drew on our ulsters and wrapped cravats about our throats. Outside, the stars were shining coldly in a cloudless sky, and the breath of the passers-by blew out into smoke like so many pistol shots. Our footfalls rang out crisply and loudly as we swung through the doctors' quarter, Wimpole Street, Harley Street, and so through Wigmore Street into Oxford Street. In a quarter of an hour we were in Bloomsbury at the Alpha Inn, which is a small public-house at the corner of one of the streets which runs down into Holborn. Holmes pushed open the door of the private bar and ordered two glasses of beer from the ruddy-faced, white-aproned landlord. + +"Your beer should be excellent if it is as good as your geese," said he. + +"My geese!" The man seemed surprised. + +"Yes. I was speaking only half an hour ago to Mr. Henry Baker, who was a member of your goose club." + +"Ah! yes, I see. But you see, sir, them's not our geese." + +"Indeed! Whose, then?" + +"Well, I got the two dozen from a salesman in Covent Garden." + +"Indeed? I know some of them. Which was it?" + +"Breckinridge is his name." + +"Ah! I don't know him. Well, here's your good health landlord, and prosperity to your house. Good-night." + +"Now for Mr. Breckinridge," he continued, buttoning up his coat as we came out into the frosty air. "Remember, Watson that though we have so homely a thing as a goose at one end of this chain, we have at the other a man who will certainly get seven years' penal servitude unless we can establish his innocence. It is possible that our inquiry may but confirm his guilt; but, in any case, we have a line of investigation which has been missed by the police, and which a singular chance has placed in our hands. Let us follow it out to the bitter end. Faces to the south, then, and quick march!" + +We passed across Holborn, down Endell Street, and so through a zigzag of slums to Covent Garden Market. One of the largest stalls bore the name of Breckinridge upon it, and the proprietor a horsey-looking man, with a sharp face and trim side-whiskers was helping a boy to put up the shutters. + +"Good-evening. It's a cold night," said Holmes. + +The salesman nodded and shot a questioning glance at my companion. + +"Sold out of geese, I see," continued Holmes, pointing at the bare slabs of marble. + +"Let you have five hundred to-morrow morning." + +"That's no good." + +"Well, there are some on the stall with the gas-flare." + +"Ah, but I was recommended to you." + +"Who by?" + +"The landlord of the Alpha." + +"Oh, yes; I sent him a couple of dozen." + +"Fine birds they were, too. Now where did you get them from?" + +To my surprise the question provoked a burst of anger from the salesman. + +"Now, then, mister," said he, with his head cocked and his arms akimbo, "what are you driving at? Let's have it straight, now." + +"It is straight enough. I should like to know who sold you the geese which you supplied to the Alpha." + +"Well then, I shan't tell you. So now!" + +"Oh, it is a matter of no importance; but I don't know why you should be so warm over such a trifle." + +"Warm! You'd be as warm, maybe, if you were as pestered as I am. When I pay good money for a good article there should be an end of the business; but it's 'Where are the geese?' and 'Who did you sell the geese to?' and 'What will you take for the geese?' One would think they were the only geese in the world, to hear the fuss that is made over them." + +"Well, I have no connection with any other people who have been making inquiries," said Holmes carelessly. "If you won't tell us the bet is off, that is all. But I'm always ready to back my opinion on a matter of fowls, and I have a fiver on it that the bird I ate is country bred." + +"Well, then, you've lost your fiver, for it's town bred," snapped the salesman. + +"It's nothing of the kind." + +"I say it is." + +"I don't believe it." + +"D'you think you know more about fowls than I, who have handled them ever since I was a nipper? I tell you, all those birds that went to the Alpha were town bred." + +"You'll never persuade me to believe that." + +"Will you bet, then?" + +"It's merely taking your money, for I know that I am right. But I'll have a sovereign on with you, just to teach you not to be obstinate." + +The salesman chuckled grimly. "Bring me the books, Bill," said he. + +The small boy brought round a small thin volume and a great greasy-backed one, laying them out together beneath the hanging lamp. + +"Now then, Mr. Cocksure," said the salesman, "I thought that I was out of geese, but before I finish you'll find that there is still one left in my shop. You see this little book?" + +"Well?" + +"That's the list of the folk from whom I buy. D'you see? Well, then, here on this page are the country folk, and the numbers after their names are where their accounts are in the big ledger. Now, then! You see this other page in red ink? Well, that is a list of my town suppliers. Now, look at that third name. Just read it out to me." + +"Mrs. Oakshott, 117, Brixton Road--249," read Holmes. + +"Quite so. Now turn that up in the ledger." + +Holmes turned to the page indicated. "Here you are, 'Mrs. Oakshott, 117, Brixton Road, egg and poultry supplier.' " + +"Now, then, what's the last entry?" + +" 'December 22nd. Twenty-four geese at 7s. 6d.' " + +"Quite so. There you are. And underneath?" + +" 'Sold to Mr. Windigate of the Alpha, at 12s.' " + +"What have you to say now?" + +Sherlock Holmes looked deeply chagrined. He drew a sovereign from his pocket and threw it down upon the slab, turning away with the air of a man whose disgust is too deep for words. A few yards off he stopped under a lamp-post and laughed in the hearty, noiseless fashion which was peculiar to him. + +"When you see a man with whiskers of that cut and the 'Pink 'un' protruding out of his pocket, you can always draw him by a bet," said he. "I daresay that if I had put $100 down in front of him, that man would not have given me such complete information as was drawn from him by the idea that he was doing me on a wager. Well, Watson, we are, I fancy, nearing the end of our quest, and the only point which remains to be determined is whether we should go on to this Mrs. Oakshott to-night, or whether we should reserve it for to-morrow. It is clear from what that surly fellow said that there are others besides ourselves who are anxious about the matter, and I should--" + +His remarks were suddenly cut short by a loud hubbub which broke out from the stall which we had just left. Turning round we saw a little rat-faced fellow standing in the centre of the circle of yellow light which was thrown by the swinging lamp, while Breckinridge, the salesman, framed in the door of his stall, was shaking his fists fiercely at the cringing figure. + +"I've had enough of you and your geese," he shouted. "I wish you were all at the devil together. If you come pestering me any more with your silly talk I'll set the dog at you. You bring Mrs. Oakshott here and I'll answer her, but what have you to do with it? Did I buy the geese off you?" + +"No; but one of them was mine all the same," whined the little man. + +"Well, then, ask Mrs. Oakshott for it." + +"She told me to ask you." + +"Well, you can ask the King of Proosia, for all I care. I've had enough of it. Get out of this!" He rushed fiercely forward, and the inquirer flitted away into the darkness. + +"Ha! this may save us a visit to Brixton Road," whispered Holmes. "Come with me, and we will see what is to be made of this fellow." Striding through the scattered knots of people who lounged round the flaring stalls, my companion speedily overtook the little man and touched him upon the shoulder. He sprang round, and I could see in the gas-light that every vestige of colour had been driven from his face. + +"Who are you, then? What do you want?" he asked in a quavering voice. + +"You will excuse me," said Holmes blandly, "but I could not help overhearing the questions which you put to the salesman just now. I think that I could be of assistance to you." + +"You? Who are you? How could you know anything of the matter?" + +"My name is Sherlock Holmes. It is my business to know what other people don't know." + +"But you can know nothing of this?" + +"Excuse me, I know everything of it. You are endeavouring to trace some geese which were sold by Mrs. Oakshott, of Brixton Road, to a salesman named Breckinridge, by him in turn to Mr. Windigate, of the Alpha, and by him to his club, of which Mr. Henry Baker is a member." + +"Oh, sir, you are the very man whom I have longed to meet," cried the little fellow with outstretched hands and quivering fingers. "I can hardly explain to you how interested I am in this matter." + +Sherlock Holmes hailed a four-wheeler which was passing. "In that case we had better discuss it in a cosy room rather than in this wind-swept market-place," said he. "But pray tell me, before we go farther, who it is that I have the pleasure of assisting." + +The man hesitated for an instant. "My name is John Robinson," he answered with a sidelong glance. + +"No, no; the real name," said Holmes sweetly. "It is always awkward doing business with an alias." + +A flush sprang to the white cheeks of the stranger. "Well then," said he, "my real name is James Ryder." + +"Precisely so. Head attendant at the Hotel Cosmopolitan. Pray step into the cab, and I shall soon be able to tell you everything which you would wish to know." + +The little man stood glancing from one to the other of us with half-frightened, half-hopeful eyes, as one who is not sure whether he is on the verge of a windfall or of a catastrophe. Then he stepped into the cab, and in half an hour we were back in the sitting-room at Baker Street. Nothing had been said during our drive, but the high, thin breathing of our new companion, and the claspings and unclaspings of his hands, spoke of the nervous tension within him. + +"Here we are!" said Holmes cheerily as we filed into the room. "The fire looks very seasonable in this weather. You look cold, Mr. Ryder. Pray take the basket-chair. I will just put on my slippers before we settle this little matter of yours. Now, then! You want to know what became of those geese?" + +"Yes, sir." + +"Or rather, I fancy, of that goose. It was one bird, I imagine in which you were interested--white, with a black bar across the tail." + +Ryder quivered with emotion. "Oh, sir," he cried, "can you tell me where it went to?" + +"It came here." + +"Here?" + +"Yes, and a most remarkable bird it proved. I don't wonder that you should take an interest in it. It laid an egg after it was dead--the bonniest, brightest little blue egg that ever was seen. I have it here in my museum." + +Our visitor staggered to his feet and clutched the mantelpiece with his right hand. Holmes unlocked his strong-box and held up the blue carbuncle, which shone out like a star, with a cold, brilliant, many-pointed radiance. Ryder stood glaring with a drawn face, uncertain whether to claim or to disown it. + +"The game's up, Ryder," said Holmes quietly. "Hold up, man, or you'll be into the fire! Give him an arm back into his chair, Watson. He's not got blood enough to go in for felony with impunity. Give him a dash of brandy. So! Now he looks a little more human. What a shrimp it is, to be sure!" + +For a moment he had staggered and nearly fallen, but the brandy brought a tinge of colour into his cheeks, and he sat staring with frightened eyes at his accuser. + +"I have almost every link in my hands, and all the proofs which I could possibly need, so there is little which you need tell me. Still, that little may as well be cleared up to make the case complete. You had heard, Ryder, of this blue stone of the Countess of Morcar's?" + +"It was Catherine Cusack who told me of it," said he in a crackling voice. + +"I see--her ladyship's waiting-maid. Well, the temptation of sudden wealth so easily acquired was too much for you, as it has been for better men before you; but you were not very scrupulous in the means you used. It seems to me, Ryder, that there is the making of a very pretty villain in you. You knew that this man Horner, the plumber, had been concerned in some such matter before, and that suspicion would rest the more readily upon him. What did you do, then? You made some small job in my lady's room--you and your confederate Cusack--and you managed that he should be the man sent for. Then, when he had left, you rifled the jewel-case, raised the alarm, and had this unfortunate man arrested. You then--" + +Ryder threw himself down suddenly upon the rug and clutched at my companion's knees. "For God's sake, have mercy!" he shrieked. "Think of my father! Of my mother! It would break their hearts. I never went wrong before! I never will again. I swear it. I'll swear it on a Bible. Oh, don't bring it into court! For Christ's sake, don't!" + +"Get back into your chair!" said Holmes sternly. "It is very well to cringe and crawl now, but you thought little enough of this poor Horner in the dock for a crime of which he knew nothing." + +"I will fly, Mr. Holmes. I will leave the country, sir. Then the charge against him will break down." + +"Hum! We will talk about that. And now let us hear a true account of the next act. How came the stone into the goose, and how came the goose into the open market? Tell us the truth, for there lies your only hope of safety." + +Ryder passed his tongue over his parched lips. "I will tell you it just as it happened, sir," said he. "When Horner had been arrested, it seemed to me that it would be best for me to get away with the stone at once, for I did not know at what moment the police might not take it into their heads to search me and my room. There was no place about the hotel where it would be safe. I went out, as if on some commission, and I made for my sister's house. She had married a man named Oakshott, and lived in Brixton Road, where she fattened fowls for the market. All the way there every man I met seemed to me to be a policeman or a detective; and, for all that it was a cold night, the sweat was pouring down my face before I came to the Brixton Road. My sister asked me what was the matter, and why I was so pale; but I told her that I had been upset by the jewel robbery at the hotel. Then I went into the back yard and smoked a pipe and wondered what it would be best to do. + +"I had a friend once called Maudsley, who went to the bad, and has just been serving his time in Pentonville. One day he had met me, and fell into talk about the ways of thieves, and how they could get rid of what they stole. I knew that he would be true to me, for I knew one or two things about him; so I made up my mind to go right on to Kilburn, where he lived, and take him into my confidence. He would show me how to turn the stone into money. But how to get to him in safety? I thought of the agonies I had gone through in coming from the hotel. I might at any moment be seized and searched, and there would be the stone in my waistcoat pocket. I was leaning against the wall at the time and looking at the geese which were waddling about round my feet, and suddenly an idea came into my head which showed me how I could beat the best detective that ever lived. + +"My sister had told me some weeks before that I might have the pick of her geese for a Christmas present, and I knew that she was always as good as her word. I would take my goose now, and in it I would carry my stone to Kilburn. There was a little shed in the yard, and behind this I drove one of the birds--a fine big one, white, with a barred tail. I caught it, and prying its bill open, I thrust the stone down its throat as far as my finger could reach. The bird gave a gulp, and I felt the stone pass along its gullet and down into its crop. But the creature flapped and struggled, and out came my sister to know what was the matter. As I turned to speak to her the brute broke loose and fluttered off among the others. + +" 'Whatever were you doing with that bird, Jem?' says she. + +" 'Well,' said I, 'you said you'd give me one for Christmas, and I was feeling which was the fattest.' + +" 'Oh,' says she, 'we've set yours aside for you--Jem's bird, we call it. It's the big white one over yonder. There's twenty-six of them, which makes one for you, and one for us, and two dozen for the market.' + +" 'Thank you, Maggie,' says I; 'but if it is all the same to you, I'd rather have that one I was handling just now.' + +" 'The other is a good three pound heavier,' said she, 'and we fattened it expressly for you.' + +" 'Never mind. I'll have the other, and I'll take it now,' said I. + +" 'Oh, just as you like,' said she, a little huffed. 'Which is it you want, then?' + +" 'That white one with the barred tail, right in the middle of the flock.' + +" 'Oh, very well. Kill it and take it with you.' + +"Well, I did what she said, Mr. Holmes, and I carried the bird all the way to Kilburn. I told my pal what I had done, for he was a man that it was easy to tell a thing like that to. He laughed until he choked, and we got a knife and opened the goose. My heart turned to water, for there was no sign of the stone, and I knew that some terrible mistake had occurred. I left the bird, rushed back to my sister's, and hurried into the back yard. There was not a bird to be seen there. + +" 'Where are they all, Maggie?' I cried. + +" 'Gone to the dealer's, Jem.' + +" 'Which dealer's?' + +" 'Breckinridge, of Covent Garden.' + +" 'But was there another with a barred tail?' I asked, 'the same as the one I chose?' + +" 'Yes, Jem; there were two barred-tailed ones, and I could never tell them apart.' + +"Well, then, of course I saw it all, and I ran off as hard as my feet would carry me to this man Breckinridge; but he had sold the lot at once, and not one word would he tell me as to where they had gone. You heard him yourselves to-night. Well, he has always answered me like that. My sister thinks that I am going mad. Sometimes I think that I am myself. And now--and now I am myself a branded thief, without ever having touched the wealth for which I sold my character. God help me! God help me!" He burst into convulsive sobbing, with his face buried in his hands. + +There was a long silence, broken only by his heavy breathing and by the measured tapping of Sherlock Holmes' finger-tips upon the edge of the table. Then my friend rose and threw open the door. + +"Get out!" said he. + +"What, sir! Oh, Heaven bless you!" + +"No more words. Get out!" + +And no more words were needed. There was a rush, a clatter upon the stairs, the bang of a door, and the crisp rattle of running footfalls from the street. + +"After all, Watson," said Holmes, reaching up his hand for his clay pipe, "I am not retained by the police to supply their deficiencies. If Horner were in danger it would be another thing; but this fellow will not appear against him, and the case must collapse. I suppose that I am commuting a felony, but it is just possible that I am saving a soul. This fellow will not go wrong again; he is too terribly frightened. Send him to gaol now, and you make him a gaol-bird for life. Besides, it is the season of forgiveness. Chance has put in our way a most singular and whimsical problem, and its solution is its own reward. If you will have the goodness to touch the bell, Doctor, we will begin another investigation, in which, also a bird will be the chief feature." + +VIII. THE ADVENTURE OF THE SPECKLED BAND + + +On glancing over my notes of the seventy odd cases in which I have during the last eight years studied the methods of my friend Sherlock Holmes, I find many tragic, some comic, a large number merely strange, but none commonplace; for, working as he did rather for the love of his art than for the acquirement of wealth, he refused to associate himself with any investigation which did not tend towards the unusual, and even the fantastic. Of all these varied cases, however, I cannot recall any which presented more singular features than that which was associated with the well-known Surrey family of the Roylotts of Stoke Moran. The events in question occurred in the early days of my association with Holmes, when we were sharing rooms as bachelors in Baker Street. It is possible that I might have placed them upon record before, but a promise of secrecy was made at the time, from which I have only been freed during the last month by the untimely death of the lady to whom the pledge was given. It is perhaps as well that the facts should now come to light, for I have reasons to know that there are widespread rumours as to the death of Dr. Grimesby Roylott which tend to make the matter even more terrible than the truth. + +It was early in April in the year '83 that I woke one morning to find Sherlock Holmes standing, fully dressed, by the side of my bed. He was a late riser, as a rule, and as the clock on the mantelpiece showed me that it was only a quarter-past seven, I blinked up at him in some surprise, and perhaps just a little resentment, for I was myself regular in my habits. + +"Very sorry to knock you up, Watson," said he, "but it's the common lot this morning. Mrs. Hudson has been knocked up, she retorted upon me, and I on you." + +"What is it, then--a fire?" + +"No; a client. It seems that a young lady has arrived in a considerable state of excitement, who insists upon seeing me. She is waiting now in the sitting-room. Now, when young ladies wander about the metropolis at this hour of the morning, and knock sleepy people up out of their beds, I presume that it is something very pressing which they have to communicate. Should it prove to be an interesting case, you would, I am sure, wish to follow it from the outset. I thought, at any rate, that I should call you and give you the chance." + +"My dear fellow, I would not miss it for anything." + +I had no keener pleasure than in following Holmes in his professional investigations, and in admiring the rapid deductions, as swift as intuitions, and yet always founded on a logical basis with which he unravelled the problems which were submitted to him. I rapidly threw on my clothes and was ready in a few minutes to accompany my friend down to the sitting-room. A lady dressed in black and heavily veiled, who had been sitting in the window, rose as we entered. + +"Good-morning, madam," said Holmes cheerily. "My name is Sherlock Holmes. This is my intimate friend and associate, Dr. Watson, before whom you can speak as freely as before myself. Ha! I am glad to see that Mrs. Hudson has had the good sense to light the fire. Pray draw up to it, and I shall order you a cup of hot coffee, for I observe that you are shivering." + +"It is not cold which makes me shiver," said the woman in a low voice, changing her seat as requested. + +"What, then?" + +"It is fear, Mr. Holmes. It is terror." She raised her veil as she spoke, and we could see that she was indeed in a pitiable state of agitation, her face all drawn and grey, with restless frightened eyes, like those of some hunted animal. Her features and figure were those of a woman of thirty, but her hair was shot with premature grey, and her expression was weary and haggard. Sherlock Holmes ran her over with one of his quick, all-comprehensive glances. + +"You must not fear," said he soothingly, bending forward and patting her forearm. "We shall soon set matters right, I have no doubt. You have come in by train this morning, I see." + +"You know me, then?" + +"No, but I observe the second half of a return ticket in the palm of your left glove. You must have started early, and yet you had a good drive in a dog-cart, along heavy roads, before you reached the station." + +The lady gave a violent start and stared in bewilderment at my companion. + +"There is no mystery, my dear madam," said he, smiling. "The left arm of your jacket is spattered with mud in no less than seven places. The marks are perfectly fresh. There is no vehicle save a dog-cart which throws up mud in that way, and then only when you sit on the left-hand side of the driver." + +"Whatever your reasons may be, you are perfectly correct," said she. "I started from home before six, reached Leatherhead at twenty past, and came in by the first train to Waterloo. Sir, I can stand this strain no longer; I shall go mad if it continues. I have no one to turn to--none, save only one, who cares for me, and he, poor fellow, can be of little aid. I have heard of you, Mr. Holmes; I have heard of you from Mrs. Farintosh, whom you helped in the hour of her sore need. It was from her that I had your address. Oh, sir, do you not think that you could help me, too, and at least throw a little light through the dense darkness which surrounds me? At present it is out of my power to reward you for your services, but in a month or six weeks I shall be married, with the control of my own income, and then at least you shall not find me ungrateful." + +Holmes turned to his desk and, unlocking it, drew out a small case-book, which he consulted. + +"Farintosh," said he. "Ah yes, I recall the case; it was concerned with an opal tiara. I think it was before your time, Watson. I can only say, madam, that I shall be happy to devote the same care to your case as I did to that of your friend. As to reward, my profession is its own reward; but you are at liberty to defray whatever expenses I may be put to, at the time which suits you best. And now I beg that you will lay before us everything that may help us in forming an opinion upon the matter." + +"Alas!" replied our visitor, "the very horror of my situation lies in the fact that my fears are so vague, and my suspicions depend so entirely upon small points, which might seem trivial to another, that even he to whom of all others I have a right to look for help and advice looks upon all that I tell him about it as the fancies of a nervous woman. He does not say so, but I can read it from his soothing answers and averted eyes. But I have heard, Mr. Holmes, that you can see deeply into the manifold wickedness of the human heart. You may advise me how to walk amid the dangers which encompass me." + +"I am all attention, madam." + +"My name is Helen Stoner, and I am living with my stepfather, who is the last survivor of one of the oldest Saxon families in England, the Roylotts of Stoke Moran, on the western border of Surrey." + +Holmes nodded his head. "The name is familiar to me," said he. + + + +"I have very little difficulty in finding what I want," said I, "for the facts are quite recent, and the matter struck me as remarkable. I feared to refer them to you, however, as I knew that you had an inquiry on hand and that you disliked the intrusion of other matters." + +"Oh, you mean the little problem of the Grosvenor Square furniture van. That is quite cleared up now--though, indeed, it was obvious from the first. Pray give me the results of your newspaper selections." + +"Here is the first notice which I can find. It is in the personal column of the Morning Post, and dates, as you see, some weeks back: 'A marriage has been arranged,' it says, 'and will, if rumour is correct, very shortly take place, between Lord Robert St. Simon, second son of the Duke of Balmoral, and Miss Hatty Doran, the only daughter of Aloysius Doran. Esq., of San Francisco, Cal., U.S.A.' That is all." + +"Terse and to the point," remarked Holmes, stretching his long, thin legs towards the fire. + +"There was a paragraph amplifying this in one of the society papers of the same week. Ah, here it is: 'There will soon be a call for protection in the marriage market, for the present free-trade principle appears to tell heavily against our home product. One by one the management of the noble houses of Great Britain is passing into the hands of our fair cousins from across the Atlantic. An important addition has been made during the last week to the list of the prizes which have been borne away by these charming invaders. Lord St. Simon, who has shown himself for over twenty years proof against the little god's arrows, has now definitely announced his approaching marriage with Miss Hatty Doran, the fascinating daughter of a California millionaire. Miss Doran, whose graceful figure and striking face attracted much attention at the Westbury House festivities, is an only child, and it is currently reported that her dowry will run to considerably over the six figures, with expectancies for the future. As it is an open secret that the Duke of Balmoral has been compelled to sell his pictures within the last few years, and as Lord St. Simon has no property of his own save the small estate of Birchmoor, it is obvious that the Californian heiress is not the only gainer by an alliance which will enable her to make the easy and common transition from a Republican lady to a British peeress.' " + +"Anything else?" asked Holmes, yawning. + +"Oh, yes; plenty. Then there is another note in the Morning Post to say that the marriage would be an absolutely quiet one, that it would be at St. George's, Hanover Square, that only half a dozen intimate friends would be invited, and that the party would return to the furnished house at Lancaster Gate which has been taken by Mr. Aloysius Doran. Two days later--that is, on Wednesday last--there is a curt announcement that the wedding had taken place, and that the honeymoon would be passed at Lord Backwater's place, near Petersfield. Those are all the notices which appeared before the disappearance of the bride." + +"Before the what?" asked Holmes with a start. + +"The vanishing of the lady." + +"When did she vanish, then?" + +"At the wedding breakfast." + +"Indeed. This is more interesting than it promised to be; quite dramatic, in fact." + +"Yes; it struck me as being a little out of the common." + +"They often vanish before the ceremony, and occasionally during the honeymoon; but I cannot call to mind anything quite so prompt as this. Pray let me have the details." + +"I warn you that they are very incomplete." + +"Perhaps we may make them less so." + +"Such as they are, they are set forth in a single article of a morning paper of yesterday, which I will read to you. It is headed, 'Singular Occurrence at a Fashionable Wedding': + +" 'The family of Lord Robert St. Simon has been thrown into the greatest consternation by the strange and painful episodes which have taken place in connection with his wedding. The ceremony, as shortly announced in the papers of yesterday, occurred on the previous morning; but it is only now that it has been possible to confirm the strange rumours which have been so persistently floating about. In spite of the attempts of the friends to hush the matter up, so much public attention has now been drawn to it that no good purpose can be served by affecting to disregard what is a common subject for conversation. + +" 'The ceremony, which was performed at St. George's, Hanover Square, was a very quiet one, no one being present save the father of the bride, Mr. Aloysius Doran, the Duchess of Balmoral, Lord Backwater, Lord Eustace and Lady Clara St. Simon (the younger brother and sister of the bridegroom), and Lady Alicia Whittington. The whole party proceeded afterwards to the house of Mr. Aloysius Doran, at Lancaster Gate, where breakfast had been prepared. It appears that some little trouble was caused by a woman, whose name has not been ascertained, who endeavoured to force her way into the house after the bridal party, alleging that she had some claim upon Lord St. Simon. It was only after a painful and prolonged scene that she was ejected by the butler and the footman. The bride, who had fortunately entered the house before this unpleasant interruption, had sat down to breakfast with the rest, when she complained of a sudden indisposition and retired to her room. Her prolonged absence having caused some comment, her father followed her, but learned from her maid that she had only come up to her chamber for an instant, caught up an ulster and bonnet, and hurried down to the passage. One of the footmen declared that he had seen a lady leave the house thus apparelled, but had refused to credit that it was his mistress, believing her to be with the company. On ascertaining that his daughter had disappeared, Mr. Aloysius Doran, in conjunction with the bridegroom, instantly put themselves in communication with the police, and very energetic inquiries are being made, which will probably result in a speedy clearing up of this very singular business. Up to a late hour last night, however, nothing had transpired as to the whereabouts of the missing lady. There are rumours of foul play in the matter, and it is said that the police have caused the arrest of the woman who had caused the original disturbance, in the belief that, from jealousy or some other motive, she may have been concerned in the strange disappearance of the bride.' " + +"And is that all?" + +"Only one little item in another of the morning papers, but it is a suggestive one." + +"And it is--" + +"That Miss Flora Millar, the lady who had caused the disturbance, has actually been arrested. It appears that she was formerly a danseuse at the Allegro, and that she has known the bridegroom for some years. There are no further particulars, and the whole case is in your hands now--so far as it has been set forth in the public press." + +"And an exceedingly interesting case it appears to be. I would not have missed it for worlds. But there is a ring at the bell, Watson, and as the clock makes it a few minutes after four, I have no doubt that this will prove to be our noble client. Do not dream of going, Watson, for I very much prefer having a witness, if only as a check to my own memory." + +"Lord Robert St. Simon," announced our page-boy, throwing open the door. A gentleman entered, with a pleasant, cultured face, high-nosed and pale, with something perhaps of petulance about the mouth, and with the steady, well-opened eye of a man whose pleasant lot it had ever been to command and to be obeyed. His manner was brisk, and yet his general appearance gave an undue impression of age, for he had a slight forward stoop and a little bend of the knees as he walked. His hair, too, as he swept off his very curly-brimmed hat, was grizzled round the edges and thin upon the top. As to his dress, it was careful to the verge of foppishness, with high collar, black frock-coat, white waistcoat, yellow gloves, patent-leather shoes, and light-coloured gaiters. He advanced slowly into the room, turning his head from left to right, and swinging in his right hand the cord which held his golden eyeglasses. + +"Good-day, Lord St. Simon," said Holmes, rising and bowing. "Pray take the basket-chair. This is my friend and colleague, Dr. Watson. Draw up a little to the fire, and we will talk this matter over." + +"A most painful matter to me, as you can most readily imagine, Mr. Holmes. I have been cut to the quick. I understand that you have already managed several delicate cases of this sort, sir, though I presume that they were hardly from the same class of society." + +"No, I am descending." + +"I beg pardon." + +"My last client of the sort was a king." + +"Oh, really! I had no idea. And which king?" + +"The King of Scandinavia." + +"What! Had he lost his wife?" + +"You can understand," said Holmes suavely, "that I extend to the affairs of my other clients the same secrecy which I promise to you in yours." + +"Of course! Very right! very right! I'm sure I beg pardon. As to my own case, I am ready to give you any information which may assist you in forming an opinion." + +"Thank you. I have already learned all that is in the public prints, nothing more. I presume that I may take it as correct--this article, for example, as to the disappearance of the bride." + +Lord St. Simon glanced over it. "Yes, it is correct, as far as it goes." + +"But it needs a great deal of supplementing before anyone could offer an opinion. I think that I may arrive at my facts most directly by questioning you." + +"Pray do so." + +"When did you first meet Miss Hatty Doran?" + +"In San Francisco, a year ago." + +"You were travelling in the States?" + +"Yes." + +"Did you become engaged then?" + +"No." + +"But you were on a friendly footing?" + +"I was amused by her society, and she could see that I was amused." + +"Her father is very rich?" + +"He is said to be the richest man on the Pacific slope." + +"And how did he make his money?" + +"In mining. He had nothing a few years ago. Then he struck gold, invested it, and came up by leaps and bounds." + +"Now, what is your own impression as to the young lady's--your wife's character?" + +The nobleman swung his glasses a little faster and stared down into the fire. "You see, Mr. Holmes," said he, "my wife was twenty before her father became a rich man. During that time she ran free in a mining camp and wandered through woods or mountains, so that her education has come from Nature rather than from the schoolmaster. She is what we call in England a tomboy, with a strong nature, wild and free, unfettered by any sort of traditions. She is impetuous--volcanic, I was about to say. She is swift in making up her mind and fearless in carrying out her resolutions. On the other hand, I would not have given her the name which I have the honour to bear"--he gave a little stately cough--"had I not thought her to be at bottom a noble woman. I believe that she is capable of heroic self-sacrifice and that anything dishonourable would be repugnant to her." + +"Have you her photograph?" + +"I brought this with me." He opened a locket and showed us the full face of a very lovely woman. It was not a photograph but an ivory miniature, and the artist had brought out the full effect of the lustrous black hair, the large dark eyes, and the exquisite mouth. Holmes gazed long and earnestly at it. Then he closed the locket and handed it back to Lord St. Simon. + +"The young lady came to London, then, and you renewed your acquaintance?" + +"Yes, her father brought her over for this last London season. I met her several times, became engaged to her, and have now married her." + +"She brought, I understand, a considerable dowry?" + +"A fair dowry. Not more than is usual in my family." + +"And this, of course, remains to you, since the marriage is a fait accompli?" + +"I really have made no inquiries on the subject." + +"Very naturally not. Did you see Miss Doran on the day before the wedding?" + +"Yes." + +"Was she in good spirits?" + +"Never better. She kept talking of what we should do in our future lives." + +"Indeed! That is very interesting. And on the morning of the wedding?" + +"She was as bright as possible--at least until after the ceremony." + +"And did you observe any change in her then?" + +"Well, to tell the truth, I saw then the first signs that I had ever seen that her temper was just a little sharp. The incident however, was too trivial to relate and can have no possible bearing upon the case." + +"Pray let us have it, for all that." + +"Oh, it is childish. She dropped her bouquet as we went towards the vestry. She was passing the front pew at the time, and it fell over into the pew. There was a moment's delay, but the gentleman in the pew handed it up to her again, and it did not appear to be the worse for the fall. Yet when I spoke to her of the matter, she answered me abruptly; and in the carriage, on our way home, she seemed absurdly agitated over this trifling cause." + +"Indeed! You say that there was a gentleman in the pew. Some of the general public were present, then?" + +"Oh, yes. It is impossible to exclude them when the church is open." + +"This gentleman was not one of your wife's friends?" + +"No, no; I call him a gentleman by courtesy, but he was quite a common-looking person. I hardly noticed his appearance. But really I think that we are wandering rather far from the point." + +"Lady St. Simon, then, returned from the wedding in a less cheerful frame of mind than she had gone to it. What did she do on re-entering her father's house?" + +"I saw her in conversation with her maid." + +"And who is her maid?" + +"Alice is her name. She is an American and came from California with her." + +"A confidential servant?" + +"A little too much so. It seemed to me that her mistress allowed her to take great liberties. Still, of course, in America they look upon these things in a different way." + +"How long did she speak to this Alice?" + +"Oh, a few minutes. I had something else to think of." + +"You did not overhear what they said?" + +"Lady St. Simon said something about 'jumping a claim.' She was accustomed to use slang of the kind. I have no idea what she meant." + +"American slang is very expressive sometimes. And what did your wife do when she finished speaking to her maid?" + +"She walked into the breakfast-room." + +"On your arm?" + +"No, alone. She was very independent in little matters like that. Then, after we had sat down for ten minutes or so, she rose hurriedly, muttered some words of apology, and left the room. She never came back." + +"But this maid, Alice, as I understand, deposes that she went to her room, covered her bride's dress with a long ulster, put on a bonnet, and went out." + +"Quite so. And she was afterwards seen walking into Hyde Park in company with Flora Millar, a woman who is now in custody, and who had already made a disturbance at Mr. Doran's house that morning." + +"Ah, yes. I should like a few particulars as to this young lady, and your relations to her." + +Lord St. Simon shrugged his shoulders and raised his eyebrows. "We have been on a friendly footing for some years--I may say on a very friendly footing. She used to be at the Allegro. I have not treated her ungenerously, and she had no just cause of complaint against me, but you know what women are, Mr. Holmes. Flora was a dear little thing, but exceedingly hot-headed and devotedly attached to me. She wrote me dreadful letters when she heard that I was about to be married, and, to tell the truth, the reason why I had the marriage celebrated so quietly was that I feared lest there might be a scandal in the church. She came to Mr. Doran's door just after we returned, and she endeavoured to push her way in, uttering very abusive expressions towards my wife, and even threatening her, but I had foreseen the possibility of something of the sort, and I had two police fellows there in private clothes, who soon pushed her out again. She was quiet when she saw that there was no good in making a row." + +"Did your wife hear all this?" + +"No, thank goodness, she did not." + +"And she was seen walking with this very woman afterwards?" + +"Yes. That is what Mr. Lestrade, of Scotland Yard, looks upon as so serious. It is thought that Flora decoyed my wife out and laid some terrible trap for her." + +"Well, it is a possible supposition." + +"You think so, too?" + +"I did not say a probable one. But you do not yourself look upon this as likely?" + +"I do not think Flora would hurt a fly." + +"Still, jealousy is a strange transformer of characters. Pray what is your own theory as to what took place?" + +"Well, really, I came to seek a theory, not to propound one. I have given you all the facts. Since you ask me, however, I may say that it has occurred to me as possible that the excitement of this affair, the consciousness that she had made so immense a social stride, had the effect of causing some little nervous disturbance in my wife." + +"In short, that she had become suddenly deranged?" + +"Well, really, when I consider that she has turned her back--I will not say upon me, but upon so much that many have aspired to without success--I can hardly explain it in any other fashion." + +"Well, certainly that is also a conceivable hypothesis," said Holmes, smiling. "And now, Lord St. Simon, I think that I have nearly all my data. May I ask whether you were seated at the breakfast-table so that you could see out of the window?" + +"We could see the other side of the road and the Park." + +"Quite so. Then I do not think that I need to detain you longer. I shall communicate with you." + +"Should you be fortunate enough to solve this problem," said our client, rising. + +"I have solved it." + +"Eh? What was that?" + +"I say that I have solved it." + +"Where, then, is my wife?" + +"That is a detail which I shall speedily supply." + +Lord St. Simon shook his head. "I am afraid that it will take wiser heads than yours or mine," he remarked, and bowing in a stately, old-fashioned manner he departed. + +"It is very good of Lord St. Simon to honour my head by putting it on a level with his own," said Sherlock Holmes, laughing. "I think that I shall have a whisky and soda and a cigar after all this cross-questioning. I had formed my conclusions as to the case before our client came into the room." + +"My dear Holmes!" + +"I have notes of several similar cases, though none, as I remarked before, which were quite as prompt. My whole examination served to turn my conjecture into a certainty. Circumstantial evidence is occasionally very convincing, as when you find a trout in the milk, to quote Thoreau's example." + +"But I have heard all that you have heard." + +"Without, however, the knowledge of pre-existing cases which serves me so well. There was a parallel instance in Aberdeen some years back, and something on very much the same lines at Munich the year after the Franco-Prussian War. It is one of these cases--but, hullo, here is Lestrade! Good-afternoon, Lestrade! You will find an extra tumbler upon the sideboard, and there are cigars in the box." + +The official detective was attired in a pea-jacket and cravat, which gave him a decidedly nautical appearance, and he carried a black canvas bag in his hand. With a short greeting he seated himself and lit the cigar which had been offered to him. + +"What's up, then?" asked Holmes with a twinkle in his eye. "You look dissatisfied." + +"And I feel dissatisfied. It is this infernal St. Simon marriage case. I can make neither head nor tail of the business." + +"Really! You surprise me." + +"Who ever heard of such a mixed affair? Every clue seems to slip through my fingers. I have been at work upon it all day." + +"And very wet it seems to have made you," said Holmes laying his hand upon the arm of the pea-jacket. + +"Yes, I have been dragging the Serpentine." + +"In heaven's name, what for?" + +"In search of the body of Lady St. Simon." + +Sherlock Holmes leaned back in his chair and laughed heartily. + +"Have you dragged the basin of Trafalgar Square fountain?" he asked. + +"Why? What do you mean?" + +"Because you have just as good a chance of finding this lady in the one as in the other." + +Lestrade shot an angry glance at my companion. "I suppose you know all about it," he snarled. + +"Well, I have only just heard the facts, but my mind is made up." + +"Oh, indeed! Then you think that the Serpentine plays no part in the matter?" + +"I think it very unlikely." + +"Then perhaps you will kindly explain how it is that we found this in it?" He opened his bag as he spoke, and tumbled onto the floor a wedding-dress of watered silk, a pair of white satin shoes and a bride's wreath and veil, all discoloured and soaked in water. "There," said he, putting a new wedding-ring upon the top of the pile. "There is a little nut for you to crack, Master Holmes." + +"Oh, indeed!" said my friend, blowing blue rings into the air. "You dragged them from the Serpentine?" + +"No. They were found floating near the margin by a park-keeper. They have been identified as her clothes, and it seemed to me that if the clothes were there the body would not be far off." + +"By the same brilliant reasoning, every man's body is to be found in the neighbourhood of his wardrobe. And pray what did you hope to arrive at through this?" + +"At some evidence implicating Flora Millar in the disappearance." + +"I am afraid that you will find it difficult." + +"Are you, indeed, now?" cried Lestrade with some bitterness. "I am afraid, Holmes, that you are not very practical with your deductions and your inferences. You have made two blunders in as many minutes. This dress does implicate Miss Flora Millar." + +"And how?" + +"In the dress is a pocket. In the pocket is a card-case. In the card-case is a note. And here is the very note." He slapped it down upon the table in front of him. "Listen to this: 'You will see me when all is ready. Come at once. F. H. M.' Now my theory all along has been that Lady St. Simon was decoyed away by Flora Millar, and that she, with confederates, no doubt, was responsible for her disappearance. Here, signed with her initials, is the very note which was no doubt quietly slipped into her hand at the door and which lured her within their reach." + +"Very good, Lestrade," said Holmes, laughing. "You really are very fine indeed. Let me see it." He took up the paper in a listless way, but his attention instantly became riveted, and he gave a little cry of satisfaction. "This is indeed important," said he. + +"Ha! you find it so?" + +"Extremely so. I congratulate you warmly." + +Lestrade rose in his triumph and bent his head to look. "Why," he shrieked, "you're looking at the wrong side!" + +"On the contrary, this is the right side." + +"The right side? You're mad! Here is the note written in pencil over here." + +"And over here is what appears to be the fragment of a hotel bill, which interests me deeply." + +"There's nothing in it. I looked at it before," said Lestrade. " 'Oct. 4th, rooms 8s., breakfast 2s. 6d., cocktail 1s., lunch 2s. 6d., glass sherry, 8d.' I see nothing in that." + +"Very likely not. It is most important, all the same. As to the note, it is important also, or at least the initials are, so I congratulate you again." + +"I've wasted time enough," said Lestrade, rising. "I believe in hard work and not in sitting by the fire spinning fine theories. Good-day, Mr. Holmes, and we shall see which gets to the bottom of the matter first." He gathered up the garments, thrust them into the bag, and made for the door. + +"Just one hint to you, Lestrade," drawled Holmes before his rival vanished; "I will tell you the true solution of the matter. Lady St. Simon is a myth. There is not, and there never has been, any such person." + +Lestrade looked sadly at my companion. Then he turned to me, tapped his forehead three times, shook his head solemnly, and hurried away. + +He had hardly shut the door behind him when Holmes rose to put on his overcoat. "There is something in what the fellow says about outdoor work," he remarked, "so I think, Watson, that I must leave you to your papers for a little." + +It was after five o'clock when Sherlock Holmes left me, but I had no time to be lonely, for within an hour there arrived a confectioner's man with a very large flat box. This he unpacked with the help of a youth whom he had brought with him, and presently, to my very great astonishment, a quite epicurean little cold supper began to be laid out upon our humble lodging-house mahogany. There were a couple of brace of cold woodcock, a pheasant, a pate de foie gras pie with a group of ancient and cobwebby bottles. Having laid out all these luxuries, my two visitors vanished away, like the genii of the Arabian Nights, with no explanation save that the things had been paid for and were ordered to this address. + +Just before nine o'clock Sherlock Holmes stepped briskly into the room. His features were gravely set, but there was a light in his eye which made me think that he had not been disappointed in his conclusions. + +"They have laid the supper, then," he said, rubbing his hands. + +"You seem to expect company. They have laid for five." + +"Yes, I fancy we may have some company dropping in," said he. "I am surprised that Lord St. Simon has not already arrived. Ha! I fancy that I hear his step now upon the stairs." + +It was indeed our visitor of the afternoon who came bustling in, dangling his glasses more vigorously than ever, and with a very perturbed expression upon his aristocratic features. + + + +To conserve the patient's strength by preventing or diminishing the +severity of the spasms, he should be placed in a quiet room, and every +form of disturbance avoided. Sedatives, such as bromides, paraldehyde, +or opium, must be given in large doses. Chloral is perhaps the best, and +the patient should rarely have less than 150 grains in twenty-four +hours. When he is unable to swallow, it should be given by the rectum. +The administration of chloroform is of value in conserving the strength +of the patient, by abolishing the spasms, and enabling the attendants to +administer nourishment or drugs either through a stomach tube or by the +rectum. Extreme elevation of temperature is met by tepid sponging. It is +necessary to use the catheter if retention of urine occurs. + + +HYDROPHOBIA + +Hydrophobia is an acute infective disease following on the bite of a +rabid animal. It most commonly follows the bite or lick of a rabid dog +or cat. The virus appears to be communicated through the saliva of the +animal, and to show a marked affinity for nerve tissues; and the disease +is most likely to develop when the patient is infected on the face or +other uncovered part, or in a part richly endowed with nerves. + +A dog which has bitten a person should on no account be killed until its +condition has been proved one way or the other. Should rabies develop +and its destruction become necessary, the head and spinal cord should be +retained and forwarded, packed in ice, to a competent observer. Much +anxiety to the person bitten and to his friends would be avoided if +these rules were observed, because in many cases it will be shown that +the animal did not after all suffer from rabies, and that the patient +consequently runs no risk. If, on the other hand, rabies is proved to be +present, the patient should be submitted to the Pasteur treatment. + +_Clinical Features._--There is almost always a history of the patient +having been bitten or licked by an animal supposed to suffer from +rabies. The incubation period averages about forty days, but varies from +a fortnight to seven or eight months, and is shorter in young than in +old persons. The original wound has long since healed, and beyond a +slight itchiness or pain shooting along the nerves of the part, shows no +sign of disturbance. A few days of general malaise, with chills and +giddiness precede the onset of the acute manifestations, which affect +chiefly the muscles of deglutition and respiration. One of the earliest +signs is that the patient has periodically a sudden catch in his +breathing "resembling what often occurs when a person goes into a cold +bath." This is due to spasm of the diaphragm, and is frequently +accompanied by a loud-sounding hiccough, likened by the laity to the +barking of a dog. Difficulty in swallowing fluids may be the first +symptom. + +The spasms rapidly spread to all the muscles of deglutition and +respiration, so that the patient not only has the greatest difficulty in +swallowing, but has a constant sense of impending suffocation. To add to +his distress, a copious secretion of viscid saliva fills his mouth. Any +voluntary effort, as well as all forms of external stimuli, only serve +to aggravate the spasms which are always induced by the attempt to +swallow fluid, or even by the sound of running water. + +The temperature is raised; the pulse is small, rapid, and intermittent; +and the urine may contain sugar and albumen. + +The mind may remain clear to the end, or the patient may have delusions, +supposing himself to be surrounded by terrifying forms. There is always +extreme mental agitation and despair, and the sufferer is in constant +fear of his impending fate. Happily the inevitable issue is not long +delayed, death usually occurring in from two to four days from the +onset. The symptoms of the disease are so characteristic that there is +no difficulty in diagnosis. The only condition with which it is liable +to be confused is the variety of cephalic tetanus in which the muscles +of deglutition are specially involved--the so-called tetanus +hydrophobicus. + +_Prophylaxis._--The bite of an animal suspected of being rabid should be +cauterised at once by means of the actual or Paquelin cautery, or by a +strong chemical escharotic such as pure carbolic acid, after which +antiseptic dressings are applied. + +It is, however, to Pasteur's _preventive inoculation_ that we must look +for our best hope of averting the onset of symptoms. "It may now be +taken as established that a grave responsibility rests on those +concerned if a person bitten by a mad animal is not subjected to the +Pasteur treatment" (Muir and Ritchie). + +This method is based on the fact that the long incubation period of the +disease admits of the patient being inoculated with a modified virus +producing a mild attack, which protects him from the natural disease. + +_Treatment._--When the symptoms have once developed they can only be +palliated. The patient must be kept absolutely quiet and free from all +sources of irritation. The spasms may be diminished by means of chloral +and bromides, or by chloroform inhalation. + + +ANTHRAX + +Anthrax is a comparatively rare disease, communicable to man from +certain of the lower animals, such as sheep, oxen, horses, deer, and +other herbivora. In animals it is characterised by symptoms of acute +general poisoning, and, from the fact that it produces a marked +enlargement of the spleen, is known in veterinary surgery as "splenic +fever." + +The _bacillus anthracis_ (Fig. 27), the largest of the known pathogenic +bacteria, occurs in groups or in chains made up of numerous bacilli, +each bacillus measuring from 6 to 8 u in length. The organisms are found +in enormous numbers throughout the bodies of animals that have died of +anthrax, and are readily recognised and cultivated. Sporulation only +takes place outside the body, probably because free oxygen is necessary +to the process. In the spore-free condition, the organisms are readily +destroyed by ordinary germicides, and by the gastric juice. The spores, +on the other hand, have a high degree of resistance. Not only do they +remain viable in the dry state for long periods, even up to a year, but +they survive boiling for five minutes, and must be subjected to dry heat +at 140 o C. for several hours before they are destroyed. + +[Illustration: FIG. 27.--Bacillus of Anthrax in section of skin, from a +case of malignant pustule; shows vesicle containing bacilli. x 400 diam. +Gram's stain.] + +_Clinical Varieties of Anthrax._--In man, anthrax may manifest itself in +one of three clinical forms. + +It may be transmitted by means of spores or bacilli directly from a +diseased animal to those who, by their occupation or otherwise, are +brought into contact with it--for example, shepherds, butchers, +veterinary surgeons, or hide-porters. Infection may occur on the face by +the use of a shaving-brush contaminated by spores. The path of infection +is usually through an abrasion of the skin, and the primary +manifestations are local, constituting what is known as _the malignant +pustule_. + +In other cases the disease is contracted through the inhalation of the +dried spores into the respiratory passages. This occurs oftenest in +those who work amongst wool, fur, and rags, and a form of acute +pneumonia of great virulence ensues. This affection is known as +_wool-sorter's disease_, and is almost universally fatal. + +There is reason to believe that infection may also take place by means +of spores ingested into the alimentary canal in meat or milk derived +from diseased animals, or in infected water. + + +become associated with branches from the musculo-cutaneous is followed +by a loss of sensibility on the radial side of the hand and thumb. Wounds +on the dorsal surface of the wrist and forearm are often followed by +loss of sensibility over a larger area, because the musculo-cutaneous +nerve is divided as well, and some of the fibres of the lower lateral +cutaneous branch of the radial. + +[Illustration: FIG. 91.--To illustrate the Loss of Sensation produced by +Division of the Median Nerve. The area of complete cutaneous +insensibility is shaded black. The parts insensitive to light touch and +to intermediate degrees of temperature are enclosed within the dotted +line. + +(After Head and Sherren.)] + +#The Median Nerve# is most frequently injured in wounds made by broken +glass in the region of the wrist. It may also be injured in fractures of +the lower end of the humerus, in fractures of both bones of the forearm, +and as a result of pressure by splints. After _division at the elbow_, +there is impairment of mobility which affects the thumb, and to a less +extent the index finger: the terminal phalanx of the thumb cannot be +flexed owing to the paralysis of the flexor pollicis longus, and the +index can only be flexed at its metacarpo-phalangeal joint by the +interosseous muscles attached to it. Pronation of the forearm is feeble, +and is completed by the weight of the hand. After _division at the +wrist_, the abductor-opponens group of muscles and the two lateral +lumbricals only are affected; the abduction of the thumb can be feebly +imitated by the short extensor and the long abductor (ext. ossis +metacarpi pollicis), while opposition may be simulated by contraction of +the long flexor and the short abductor of the thumb; the paralysis of +the two medial lumbricals produces no symptoms that can be recognised. +It is important to remember that when the median nerve is divided at the +wrist, deep touch can be appreciated over the whole of the area +supplied by the nerve; the injury, therefore, is liable to be over +looked. If, however, the tendons are divided as well as the nerve, there +is insensibility to deep touch. The areas of epicritic and of +protopathic insensibility are illustrated in Fig. 91. The division of +the nerve at the elbow, or even at the axilla, does not increase the +extent of the loss of epicritic or protopathic sensibility, but usually +affects deep sensibility. + +[Illustration: FIG. 92.--To illustrate Loss of Sensation produced by +complete Division of Ulnar Nerve. Loss of all forms of cutaneous +sensibility is represented by the shaded area. The parts insensitive to +light touch and to intermediate degrees of heat and cold are enclosed +within the dotted line. + +(Head and Sherren.)] + +#The Ulnar Nerve.#--The most common injury of this nerve is its division +in transverse accidental wounds just above the wrist. In the arm it may +be contused, along with the radial, in crutch paralysis; in the region +of the elbow it may be injured in fractures or dislocations, or it may +be accidentally divided in the operation for excising the elbow-joint. + + +same class as himself and possessed the same breeding and +traditions, Bolkonski would soon have discovered his weak, human, +unheroic sides; but as it was, Speranski's strange and logical turn of +mind inspired him with respect all the more because he did not quite +understand him. Moreover, Speranski, either because he appreciated the +other's capacity or because he considered it necessary to win him to +his side, showed off his dispassionate calm reasonableness before +Prince Andrew and flattered him with that subtle flattery which goes +hand in hand with self-assurance and consists in a tacit assumption +that one's companion is the only man besides oneself capable of +understanding the folly of the rest of mankind and the +reasonableness and profundity of one's own ideas. + +During their long conversation on Wednesday evening, Speranski +more than once remarked: "We regard everything that is above the +common level of rooted custom..." or, with a smile: "But we want the +wolves to be fed and the sheep to be safe..." or: "They cannot +understand this..." and all in a way that seemed to say: "We, you +and I, understand what they are and who we are." + +This first long conversation with Speranski only strengthened in +Prince Andrew the feeling he had experienced toward him at their first +meeting. He saw in him a remarkable, clear-thinking man of vast +intellect who by his energy and persistence had attained power, +which he was using solely for the welfare of Russia. In Prince +Andrew's eyes Speranski was the man he would himself have wished to +be--one who explained all the facts of life reasonably, considered +important only what was rational, and was capable of applying the +standard of reason to everything. Everything seemed so simple and +clear in Speranski's exposition that Prince Andrew involuntarily +agreed with him about everything. If he replied and argued, it was +only because he wished to maintain his independence and not submit +to Speranski's opinions entirely. Everything was right and +everything was as it should be: only one thing disconcerted Prince +Andrew. This was Speranski's cold, mirrorlike look, which did not +allow one to penetrate to his soul, and his delicate white hands, +which Prince Andrew involuntarily watched as one does watch the +hands of those who possess power. This mirrorlike gaze and those +delicate hands irritated Prince Andrew, he knew not why. He was +unpleasantly struck, too, by the excessive contempt for others that he +observed in Speranski, and by the diversity of lines of argument he +used to support his opinions. He made use of every kind of mental +device, except analogy, and passed too boldly, it seemed to Prince +Andrew, from one to another. Now he would take up the position of a +practical man and condemn dreamers; now that of a satirist, and +laugh ironically at his opponents; now grow severely logical, or +suddenly rise to the realm of metaphysics. (This last resource was one +he very frequently employed.) He would transfer a question to +metaphysical heights, pass on to definitions of space, time, and +thought, and, having deduced the refutation he needed, would again +descend to the level of the original discussion. + +In general the trait of Speranski's mentality which struck Prince +Andrew most was his absolute and unshakable belief in the power and +authority of reason. It was evident that the thought could never occur +to him which to Prince Andrew seemed so natural, namely, that it is +after all impossible to express all one thinks; and that he had +never felt the doubt, "Is not all I think and believe nonsense?" And +it was just this peculiarity of Speranski's mind that particularly +attracted Prince Andrew. + +During the first period of their acquaintance Bolkonski felt a +passionate admiration for him similar to that which he had once felt +for Bonaparte. The fact that Speranski was the son of a village +priest, and that stupid people might meanly despise him on account +of his humble origin (as in fact many did), caused Prince Andrew to +cherish his sentiment for him the more, and unconsciously to +strengthen it. + +On that first evening Bolkonski spent with him, having mentioned the +Commission for the Revision of the Code of Laws, Speranski told him +sarcastically that the Commission had existed for a hundred and +fifty years, had cost millions, and had done nothing except that +Rosenkampf had stuck labels on the corresponding paragraphs of the +different codes. + +"And that is all the state has for the millions it has spent," +said he. "We want to give the Senate new juridical powers, but we have +no laws. That is why it is a sin for men like you, Prince, not to +serve in these times!" + +Prince Andrew said that for that work an education in +jurisprudence was needed which he did not possess. + +"But nobody possesses it, so what would you have? It is a vicious +circle from which we must break a way out." + +A week later Prince Andrew was a member of the Committee on Army +Regulations and--what he had not at all expected--was chairman of a +section of the committee for the revision of the laws. At +Speranski's request he took the first part of the Civil Code that +was being drawn up and, with the aid of the Code Napoleon and the +Institutes of Justinian, he worked at formulating the section on +Personal Rights. + + + + + +CHAPTER VII + + +Nearly two years before this, in 1808, Pierre on returning to +Petersburg after visiting his estates had involuntarily found +himself in a leading position among the Petersburg Freemasons. He +arranged dining and funeral lodge meetings, enrolled new members, +and busied himself uniting various lodges and acquiring authentic +charters. He gave money for the erection of temples and supplemented +as far as he could the collection of alms, in regard to which the +majority of members were stingy and irregular. He supported almost +singlehanded a poorhouse the order had founded in Petersburg. + +His life meanwhile continued as before, with the same infatuations +and dissipations. He liked to dine and drink well, and though he +considered it immoral and humiliating could not resist the temptations +of the bachelor circles in which he moved. + +Amid the turmoil of his activities and distractions, however, Pierre +at the end of a year began to feel that the more firmly he tried to +rest upon it, the more Masonic ground on which he stood gave way under +him. At the same time he felt that the deeper the ground sank under +him the closer bound he involuntarily became to the order. When he had +joined the Freemasons he had experienced the feeling of one who +confidently steps onto the smooth surface of a bog. When he put his +foot down it sank in. To make quite sure of the firmness the ground, +he put his other foot down and sank deeper still, became stuck in +it, and involuntarily waded knee-deep in the bog. + +Joseph Alexeevich was not in Petersburg--he had of late stood +aside from the affairs of the Petersburg lodges, and lived almost +entirely in Moscow. All the members of the lodges were men Pierre knew +in ordinary life, and it was difficult for him to regard them merely +as Brothers in Freemasonry and not as Prince B. or Ivan Vasilevich D., +whom he knew in society mostly as weak and insignificant men. Under +the Masonic aprons and insignia he saw the uniforms and decorations at +which they aimed in ordinary life. Often after collecting alms, and +reckoning up twenty to thirty rubles received for the most part in +promises from a dozen members, of whom half were as well able to pay +as himself, Pierre remembered the Masonic vow in which each Brother +promised to devote all his belongings to his neighbor, and doubts on +which he tried not to dwell arose in his soul. + +He divided the Brothers he knew into four categories. In the first +he put those who did not take an active part in the affairs of the +lodges or in human affairs, but were exclusively occupied with the +mystical science of the order: with questions of the threefold +designation of God, the three primordial elements--sulphur, mercury, +and salt--or the meaning of the square and all the various figures +of the temple of Solomon. Pierre respected this class of Brothers to +which the elder ones chiefly belonged, including, Pierre thought, +Joseph Alexeevich himself, but he did not share their interests. His +heart was not in the mystical aspect of Freemasonry. + +In the second category Pierre reckoned himself and others like +him, seeking and vacillating, who had not yet found in Freemasonry a +straight and comprehensible path, but hoped to do so. + +In the third category he included those Brothers (the majority) +who saw nothing in Freemasonry but the external forms and +ceremonies, and prized the strict performance of these forms without +troubling about their purport or significance. Such were Willarski and +even the Grand Master of the principal lodge. + +Finally, to the fourth category also a great many Brothers belonged, +particularly those who had lately joined. These according to +Pierre's observations were men who had no belief in anything, nor +desire for anything, but joined the Freemasons merely to associate +with the wealthy young Brothers who were influential through their +connections or rank, and of whom there were very many in the lodge. + +Pierre began to feel dissatisfied with what he was doing. +Freemasonry, at any rate as he saw it here, sometimes seemed to him +based merely on externals. He did not think of doubting Freemasonry +itself, but suspected that Russian Masonry had taken a wrong path +and deviated from its original principles. And so toward the end of +the year he went abroad to be initiated into the higher secrets of the +order. + +In the summer of 1809 Pierre returned to Petersburg. Our +Freemasons knew from correspondence with those abroad that Bezukhov +had obtained the confidence of many highly placed persons, had been +initiated into many mysteries, had been raised to a higher grade, +and was bringing back with him much that might conduce to the +advantage of the Masonic cause in Russia. The Petersburg Freemasons +all came to see him, tried to ingratiate themselves with him, and it +seemed to them all that he was preparing something for them and +concealing it. + +A solemn meeting of the lodge of the second degree was convened, +at which Pierre promised to communicate to the Petersburg Brothers +what he had to deliver to them from the highest leaders of their +order. The meeting was a full one. After the usual ceremonies Pierre +rose and began his address. + +"Dear Brothers," he began, blushing and stammering, with a written +speech in his hand, "it is not sufficient to observe our mysteries +in the seclusion of our lodge--we must act--act! We are drowsing, +but we must act." Pierre raised his notebook and began to read. + +"For the dissemination of pure truth and to secure the triumph of +virtue," he read, "we must cleanse men from prejudice, diffuse +principles in harmony with the spirit of the times, undertake the +education of the young, unite ourselves in indissoluble bonds with the +wisest men, boldly yet prudently overcome superstitions, infidelity, +and folly, and form of those devoted to us a body linked together by +unity of purpose and possessed of authority and power. + +"To attain this end we must secure a preponderance of virtue over +vice and must endeavor to secure that the honest man may, even in this +world, receive a lasting reward for his virtue. But in these great +endeavors we are gravely hampered by the political institutions of +today. What is to be done in these circumstances? To favor +revolutions, overthrow everything, repel force by force?... No! We are +very far from that. Every violent reform deserves censure, for it +quite fails to remedy evil while men remain what they are, and also +because wisdom needs no violence. + +"The whole plan of our order should be based on the idea of +preparing men of firmness and virtue bound together by unity of +conviction--aiming at the punishment of vice and folly, and +patronizing talent and virtue: raising worthy men from the dust and +attaching them to our Brotherhood. Only then will our order have the +power unobtrusively to bind the hands of the protectors of disorder +and to control them without their being aware of it. In a word, we +must found a form of government holding universal sway, which should +be diffused over the whole world without destroying the bonds of +citizenship, and beside which all other governments can continue in +their customary course and do everything except what impedes the great +aim of our order, which is to obtain for virtue the victory over vice. +This aim was that of Christianity itself. It taught men to be wise and +good and for their own benefit to follow the example and instruction +of the best and wisest men. + +"At that time, when everything was plunged in darkness, preaching +alone was of course sufficient. The novelty of Truth endowed her +with special strength, but now we need much more powerful methods. +It is now necessary that man, governed by his senses, should find in +virtue a charm palpable to those senses. It is impossible to eradicate +the passions; but we must strive to direct them to a noble aim, and it +is therefore necessary that everyone should be able to satisfy his +passions within the limits of virtue. Our order should provide means +to that end. + +"As soon as we have a certain number of worthy men in every state, +each of them again training two others and all being closely united, +everything will be possible for our order, which has already in secret +accomplished much for the welfare of mankind." + +This speech not only made a strong impression, but created +excitement in the lodge. The majority of the Brothers, seeing in it +dangerous designs of Illuminism,* met it with a coldness that +surprised Pierre. The Grand Master began answering him, and Pierre +began developing his views with more and more warmth. It was long +since there had been so stormy a meeting. Parties were formed, some +accusing Pierre of Illuminism, others supporting him. At that +meeting he was struck for the first time by the endless variety of +men's minds, which prevents a truth from ever presenting itself +identically to two persons. Even those members who seemed to be on his +side understood him in their own way with limitations and +alterations he could not agree to, as what he always wanted most was +to convey his thought to others just as he himself understood it. + + +*The Illuminati sought to substitute republican for monarchical +institutions. + + +At the end of the meeting the Grand Master with irony and ill-will +reproved Bezukhov for his vehemence and said it was not love of virtue +alone, but also a love of strife that had moved him in the dispute. +Pierre did not answer him and asked briefly whether his proposal would +be accepted. He was told that it would not, and without waiting for +the usual formalities he left the lodge and went home. + + + + + +CHAPTER VIII + + +Again Pierre was overtaken by the depression he so dreaded. For +three days after the delivery of his speech at the lodge he lay on a +sofa at home receiving no one and going nowhere. + +It was just then that he received a letter from his wife, who +implored him to see her, telling him how grieved she was about him and +how she wished to devote her whole life to him. + +At the end of the letter she informed him that in a few days she +would return to Petersburg from abroad. + +Following this letter one of the Masonic Brothers whom Pierre +respected less than the others forced his way in to see him and, +turning the conversation upon Pierre's matrimonial affairs, by way +of fraternal advice expressed the opinion that his severity to his +wife was wrong and that he was neglecting one of the first rules of +Freemasonry by not forgiving the penitent. + +At the same time his mother-in-law, Prince Vasili's wife, sent to +him imploring him to come if only for a few minutes to discuss a +most important matter. Pierre saw that there was a conspiracy +against him and that they wanted to reunite him with his wife, and +in the mood he then was, this was not even unpleasant to him. +Nothing mattered to him. Nothing in life seemed to him of much +importance, and under the influence of the depression that possessed +him he valued neither his liberty nor his resolution to punish his +wife. + +"No one is right and no one is to blame; so she too is not to +blame," he thought. + +If he did not at once give his consent to a reunion with his wife, +it was only because in his state of depression he did not feel able to +take any step. Had his wife come to him, he would not have turned +her away. Compared to what preoccupied him, was it not a matter of +indifference whether he lived with his wife or not? + +Without replying either to his wife or his mother-in-law, Pierre +late one night prepared for a journey and started for Moscow to see +Joseph Alexeevich. This is what he noted in his diary: + + +Moscow, 17th November + +I have just returned from my benefactor, and hasten to write down +what I have experienced. Joseph Alexeevich is living poorly and has +for three years been suffering from a painful disease of the +bladder. No one has ever heard him utter a groan or a word of +complaint. From morning till late at night, except when he eats his +very plain food, he is working at science. He received me graciously +and made me sit down on the bed on which he lay. I made the sign of +the Knights of the East and of Jerusalem, and he responded in the same +manner, asking me with a mild smile what I had learned and gained in +the Prussian and Scottish lodges. I told him everything as best I +could, and told him what I had proposed to our Petersburg lodge, of +the bad reception I had encountered, and of my rupture with the +Brothers. Joseph Alexeevich, having remained silent and thoughtful for +a good while, told me his view of the matter, which at once lit up for +me my whole past and the future path I should follow. He surprised +me by asking whether I remembered the threefold aim of the order: +(1) The preservation and study of the mystery. (2) The purification +and reformation of oneself for its reception, and (3) The +improvement of the human race by striving for such purification. Which +is the principal aim of these three? Certainly self-reformation and +self-purification. Only to this aim can we always strive independently +of circumstances. But at the same time just this aim demands the +greatest efforts of us; and so, led astray by pride, losing sight of +this aim, we occupy ourselves either with the mystery which in our +impurity we are unworthy to receive, or seek the reformation of the +human race while ourselves setting an example of baseness and +profligacy. Illuminism is not a pure doctrine, just because it is +attracted by social activity and puffed up by pride. On this ground +Joseph Alexeevich condemned my speech and my whole activity, and in +the depth of my soul I agreed with him. Talking of my family affairs +he said to me, "the chief duty of a true Mason, as I have told you, +lies in perfecting himself. We often think that by removing all the +difficulties of our life we shall more quickly reach our aim, but on +the contrary, my dear sir, it is only in the midst of worldly cares +that we can attain our three chief aims: (1) Self-knowledge--for man +can only know himself by comparison, (2) Self-perfecting, which can +only be attained by conflict, and (3) The attainment of the chief +virtue--love of death. Only the vicissitudes of life can show us its +vanity and develop our innate love of death or of rebirth to a new +life." These words are all the more remarkable because, in spite of +his great physical sufferings, Joseph Alexeevich is never weary of +life though he loves death, for which--in spite of the purity and +loftiness of his inner man--he does not yet feel himself +sufficiently prepared. My benefactor then explained to me fully the +meaning of the Great Square of creation and pointed out to me that the +numbers three and seven are the basis of everything. He advised me not +to avoid intercourse with the Petersburg Brothers, but to take up only +second-grade posts in the lodge, to try, while diverting the +Brothers from pride, to turn them toward the true path +self-knowledge and self-perfecting. Besides this he advised me for +myself personally above all to keep a watch over myself, and to that +end he gave me a notebook, the one I am now writing in and in which +I will in future note down all my actions. + + +Petersburg, 23rd November + +I am again living with my wife. My mother-in-law came to me in tears +and said that Helene was here and that she implored me to hear her; +that she was innocent and unhappy at my desertion, and much more. I +knew that if I once let myself see her I should not have strength to +go on refusing what she wanted. In my perplexity I did not know +whose aid and advice to seek. Had my benefactor been here he would +have told me what to do. I went to my room and reread Joseph +Alexeevich's letters and recalled my conversations with him, and +deduced from it all that I ought not to refuse a suppliant, and +ought to reach a helping hand to everyone--especially to one so +closely bound to me--and that I must bear my cross. But if I forgive +her for the sake of doing right, then let union with her have only a +spiritual aim. That is what I decided, and what I wrote to Joseph +Alexeevich. I told my wife that I begged her to forget the past, to +forgive me whatever wrong I may have done her, and that I had +nothing to forgive. It gave me joy to tell her this. She need not know +how hard it was for me to see her again. I have settled on the upper +floor of this big house and am experiencing a happy feeling of +regeneration. + + + + + +CHAPTER IX + + +At that time, as always happens, the highest society that met at +court and at the grand balls was divided into several circles, each +with its own particular tone. The largest of these was the French +circle of the Napoleonic alliance, the circle of Count Rumyantsev +and Caulaincourt. In this group Helene, as soon as she had settled +in Petersburg with her husband, took a very prominent place. She was +visited by the members of the French embassy and by many belonging +to that circle and noted for their intellect and polished manners. + +Helene had been at Erfurt during the famous meeting of the +Emperors and had brought from there these connections with the +Napoleonic notabilities. At Erfurt her success had been brilliant. +Napoleon himself had noticed her in the theater and said of her: +"C'est un superbe animal."* Her success as a beautiful and elegant +woman did not surprise Pierre, for she had become even handsomer +than before. What did surprise him was that during these last two +years his wife had succeeded in gaining the reputation "d' une femme +charmante, aussi spirituelle que belle."*[2] The distinguished +Prince de Ligne wrote her eight-page letters. Bilibin saved up his +epigrams to produce them in Countess Bezukhova's presence. To be +received in the Countess Bezukhova's salon was regarded as a diploma +of intellect. Young men read books before attending Helene's evenings, +to have something to say in her salon, and secretaries of the embassy, +and even ambassadors, confided diplomatic secrets to her, so that in a +way Helene was a power. Pierre, who knew she was very stupid, +sometimes attended, with a strange feeling of perplexity and fear, her +evenings and dinner parties, where politics, poetry, and philosophy +were discussed. At these parties his feelings were like those of a +conjuror who always expects his trick to be found out at any moment. +But whether because stupidity was just what was needed to run such a +salon, or because those who were deceived found pleasure in the +deception, at any rate it remained unexposed and Helene Bezukhova's +reputation as a lovely and clever woman became so firmly established +that she could say the emptiest and stupidest things and everybody +would go into raptures over every word of hers and look for a profound +meaning in it of which she herself had no conception. + + +*"That's a superb animal." + +*[2] "Of a charming woman, as witty as she is lovely." + + +Pierre was just the husband needed for a brilliant society woman. He +was that absent-minded crank, a grand seigneur husband who was in no +one's way, and far from spoiling the high tone and general +impression of the drawing room, he served, by the contrast he +presented to her, as an advantageous background to his elegant and +tactful wife. Pierre during the last two years, as a result of his +continual absorption in abstract interests and his sincere contempt +for all else, had acquired in his wife's circle, which did not +interest him, that air of unconcern, indifference, and benevolence +toward all, which cannot be acquired artificially and therefore +inspires involuntary respect. He entered his wife's drawing room as +one enters a theater, was acquainted with everybody, equally pleased +to see everyone, and equally indifferent to them all. Sometimes he +joined in a conversation which interested him and, regardless of +whether any "gentlemen of the embassy" were present or not, +lispingly expressed his views, which were sometimes not at all in +accord with the accepted tone of the moment. But the general opinion +concerning the queer husband of "the most distinguished woman in +Petersburg" was so well established that no one took his freaks +seriously. + +Among the many young men who frequented her house every day, Boris +Drubetskoy, who had already achieved great success in the service, was +the most intimate friend of the Bezukhov household since Helene's +return from Erfurt. Helene spoke of him as "mon page" and treated +him like a child. Her smile for him was the same as for everybody, but +sometimes that smile made Pierre uncomfortable. Toward him Boris +behaved with a particularly dignified and sad deference. This shade of +deference also disturbed Pierre. He had suffered so painfully three +years before from the mortification to which his wife had subjected +him that he now protected himself from the danger of its repetition, +first by not being a husband to his wife, and secondly by not allowing +himself to suspect. + +"No, now that she has become a bluestocking she has finally +renounced her former infatuations," he told himself. "There has +never been an instance of a bluestocking being carried away by affairs +of the heart"--a statement which, though gathered from an unknown +source, he believed implicitly. Yet strange to say Boris' presence +in his wife's drawing room (and he was almost always there) had a +physical effect upon Pierre; it constricted his limbs and destroyed +the unconsciousness and freedom of his movements. + +"What a strange antipathy," thought Pierre, "yet I used to like +him very much." + +In the eyes of the world Pierre was a great gentleman, the rather +blind and absurd husband of a distinguished wife, a clever crank who +did nothing but harmed nobody and was a first-rate, good-natured +fellow. But a complex and difficult process of internal development +was taking place all this time in Pierre's soul, revealing much to him +and causing him many spiritual doubts and joys. + + + + + +CHAPTER X + + +Pierre went on with his diary, and this is what he wrote in it +during that time: + + +24th November + +Got up at eight, read the Scriptures, then went to my duties. [By +Joseph Alexeevich's advice Pierre had entered the service of the state +and served on one of the committees.] Returned home for dinner and +dined alone--the countess had many visitors I do not like. I ate and +drank moderately and after dinner copied out some passages for the +Brothers. In the evening I went down to the countess and told a +funny story about B., and only remembered that I ought not to have +done so when everybody laughed loudly at it. + +I am going to bed with a happy and tranquil mind. Great God, help me +to walk in Thy paths, (1) to conquer anger by calmness and +deliberation, (2) to vanquish lust by self-restraint and repulsion, +(3) to withdraw from worldliness, but not avoid (a) the service of the +state, (b) family duties, (c) relations with my friends, and the +management of my affairs. + + +27th November + +I got up late. On waking I lay long in bed yielding to sloth. O God, +help and strengthen me that I may walk in Thy ways! Read the +Scriptures, but without proper feeling. Brother Urusov came and we +talked about worldly vanities. He told me of the Emperor's new +projects. I began to criticize them, but remembered my rules and my +benefactor's words--that a true Freemason should be a zealous worker +for the state when his aid is required and a quiet onlooker when not +called on to assist. My tongue is my enemy. Brothers G. V. and O. +visited me and we had a preliminary talk about the reception of a +new Brother. They laid on me the duty of Rhetor. I feel myself weak +and unworthy. Then our talk turned to the interpretation of the +seven pillars and steps of the Temple, the seven sciences, the seven +virtues, the seven vices, and the seven gifts of the Holy Spirit. +Brother O. was very eloquent. In the evening the admission took place. +The new decoration of the Premises contributed much to the +magnificence of the spectacle. It was Boris Drubetskoy who was +admitted. I nominated him and was the Rhetor. A strange feeling +agitated me all the time I was alone with him in the dark chamber. I +caught myself harboring a feeling of hatred toward him which I +vainly tried to overcome. That is why I should really like to save him +from evil and lead him into the path of truth, but evil thoughts of +him did not leave me. It seemed to me that his object in entering +the Brotherhood was merely to be intimate and in favor with members of +our lodge. Apart from the fact that he had asked me several times +whether N. and S. were members of our lodge (a question to which I +could not reply) and that according to my observation he is +incapable of feeling respect for our holy order and is too preoccupied +and satisfied with the outer man to desire spiritual improvement, I +had no cause to doubt him, but he seemed to me insincere, and all +the time I stood alone with him in the dark temple it seemed to me +that he was smiling contemptuously at my words, and I wished really to +stab his bare breast with the sword I held to it. I could not be +eloquent, nor could I frankly mention my doubts to the Brothers and to +the Grand Master. Great Architect of Nature, help me to find the +true path out of the labyrinth of lies! + + + After this, three pages were left blank in the diary, and then +the following was written: + + +I have had a long and instructive talk alone with Brother V., who +advised me to hold fast by brother A. Though I am unworthy, much was +revealed to me. Adonai is the name of the creator of the world. Elohim +is the name of the ruler of all. The third name is the name +unutterable which means the All. Talks with Brother V. strengthen, +refresh, and support me in the path of virtue. In his presence doubt +has no place. The distinction between the poor teachings of mundane +science and our sacred all-embracing teaching is clear to me. Human +sciences dissect everything to comprehend it, and kill everything to +examine it. In the holy science of our order all is one, all is +known in its entirety and life. The Trinity--the three elements of +matter--are sulphur, mercury, and salt. Sulphur is of an oily and +fiery nature; in combination with salt by its fiery nature it +arouses a desire in the latter by means of which it attracts +mercury, seizes it, holds it, and in combination produces other +bodies. Mercury is a fluid, volatile, spiritual essence. Christ, the +Holy Spirit, Him!... + + +3rd December + +Awoke late, read the Scriptures but was apathetic. Afterwards went +and paced up and down the large hall. I wished to meditate, but +instead my imagination pictured an occurrence of four years ago, +when Dolokhov, meeting me in Moscow after our duel, said he hoped I +was enjoying perfect peace of mind in spite of my wife's absence. At +the time I gave him no answer. Now I recalled every detail of that +meeting and in my mind gave him the most malevolent and bitter +replies. I recollected myself and drove away that thought only when +I found myself glowing with anger, but I did not sufficiently +repent. Afterwards Boris Drubetskoy came and began relating various +adventures. His coming vexed me from the first, and I said something +disagreeable to him. He replied. I flared up and said much that was +unpleasant and even rude to him. He became silent, and I recollected +myself only when it was too late. My God, I cannot get on with him +at all. The cause of this is my egotism. I set myself above him and so +become much worse than he, for he is lenient to my rudeness while I on +the contrary nourish contempt for him. O God, grant that in his +presence I may rather see my own vileness, and behave so that he too +may benefit. After dinner I fell asleep and as I was drowsing off I +clearly heard a voice saying in my left ear, "Thy day!" + +I dreamed that I was walking in the dark and was suddenly surrounded +by dogs, but I went on undismayed. Suddenly a smallish dog seized my +left thigh with its teeth and would not let go. I began to throttle it +with my hands. Scarcely had I torn it off before another, a bigger +one, began biting me. I lifted it up, but the higher I lifted it the +bigger and heavier it grew. And suddenly Brother A. came and, taking +my arm, led me to a building to enter which we had to pass along a +narrow plank. I stepped on it, but it bent and gave way and I began to +clamber up a fence which I could scarcely reach with my hands. After +much effort I dragged myself up, so that my leg hung down on one +side and my body on the other. I looked round and saw Brother A. +standing on the fence and pointing me to a broad avenue and garden, +and in the garden was a large and beautiful building. I woke up. O +Lord, great Architect of Nature, help me to tear from myself these +dogs--my passions especially the last, which unites in itself the +strength of all the former ones, and aid me to enter that temple of +virtue to a vision of which I attained in my dream. + + +7th December + +I dreamed that Joseph Alexeevich was sitting in my house, and that I +was very glad and wished to entertain him. It seemed as if I chattered +incessantly with other people and suddenly remembered that this +could not please him, and I wished to come close to him and embrace +him. But as soon as I drew near I saw that his face had changed and +grown young, and he was quietly telling me something about the +teaching of our order, but so softly that I could not hear it. Then it +seemed that we all left the room and something strange happened. We +were sitting or lying on the floor. He was telling me something, and I +wished to show him my sensibility, and not listening to what he was +saying I began picturing to myself the condition of my inner man and +the grace of God sanctifying me. And tears came into my eyes, and I +was glad he noticed this. But he looked at me with vexation and jumped +up, breaking off his remarks. I felt abashed and asked whether what he +had been saying did not concern me; but he did not reply, gave me a +kind look, and then we suddenly found ourselves in my bedroom where +there is a double bed. He lay down on the edge of it and I burned with +longing to caress him and lie down too. And he said, "Tell me +frankly what is your chief temptation? Do you know it? I think you +know it already." Abashed by this question, I replied that sloth was +my chief temptation. He shook his head incredulously; and even more +abashed, I said that though I was living with my wife as he advised, I +was not living with her as her husband. To this he replied that one +should not deprive a wife of one's embraces and gave me to +understand that that was my duty. But I replied that I should be +ashamed to do it, and suddenly everything vanished. And I awoke and +found in my mind the text from the Gospel: "The life was the light +of men. And the light shineth in darkness; and the darkness +comprehended it not." Joseph Alexeevich's face had looked young and +bright. That day I received a letter from my benefactor in which he +wrote about "conjugal duties." + + +9th December + +I had a dream from which I awoke with a throbbing heart. I saw +that I was in Moscow in my house, in the big sitting room, and +Joseph Alexeevich came in from the drawing room. I seemed to know at +once that the process of regeneration had already taken place in +him, and I rushed to meet him. I embraced him and kissed his hands, +and he said, "Hast thou noticed that my face is different?" I looked +at him, still holding him in my arms, and saw that his face was young, +but that he had no hair on his head and his features were quite +changed. And I said, "I should have known you had I met you by +chance," and I thought to myself, "Am I telling the truth?" And +suddenly I saw him lying like a dead body; then he gradually recovered +and went with me into my study carrying a large book of sheets of +drawing paper; I said, "I drew that," and he answered by bowing his +head. I opened the book, and on all the pages there were excellent +drawings. And in my dream I knew that these drawings represented the +love adventures of the soul with its beloved. And on its pages I saw a +beautiful representation of a maiden in transparent garments and +with a transparent body, flying up to the clouds. And I seemed to know +that this maiden was nothing else than a representation of the Song of +Songs. And looking at those drawings I dreamed I felt that I was doing +wrong, but could not tear myself away from them. Lord, help me! My +God, if Thy forsaking me is Thy doing, Thy will be done; but if I am +myself the cause, teach me what I should do! I shall perish of my +debauchery if Thou utterly desertest me! + + + + + +CHAPTER XI + + +The Rostovs' monetary affairs had not improved during the two +years they had spent in the country. + +Though Nicholas Rostov had kept firmly to his resolution and was +still serving modestly in an obscure regiment, spending +comparatively little, the way of life at Otradnoe--Mitenka's +management of affairs, in particular--was such that the debts +inevitably increased every year. The only resource obviously +presenting itself to the old count was to apply for an official +post, so he had come to Petersburg to look for one and also, as he +said, to let the lassies enjoy themselves for the last time. + +Soon after their arrival in Petersburg Berg proposed to Vera and was +accepted. + +Though in Moscow the Rostovs belonged to the best society without +themselves giving it a thought, yet in Petersburg their circle of +acquaintances was a mixed and indefinite one. In Petersburg they +were provincials, and the very people they had entertained in Moscow +without inquiring to what set they belonged, here looked down on them. + +The Rostovs lived in the same hospitable way in Petersburg as in +Moscow, and the most diverse people met at their suppers. Country +neighbors from Otradnoe, impoverished old squires and their daughters, +Peronskaya a maid of honor, Pierre Bezukhov, and the son of their +district postmaster who had obtained a post in Petersburg. Among the +men who very soon became frequent visitors at the Rostovs' house in +Petersburg were Boris, Pierre whom the count had met in the street and +dragged home with him, and Berg who spent whole days at the Rostovs' +and paid the eldest daughter, Countess Vera, the attentions a young +man pays when he intends to propose. + +Not in vain had Berg shown everybody his right hand wounded at +Austerlitz and held a perfectly unnecessary sword in his left. He +narrated that episode so persistently and with so important an air +that everyone believed in the merit and usefulness of his deed, and he +had obtained two decorations for Austerlitz. + +In the Finnish war he also managed to distinguish himself. He had +picked up the scrap of a grenade that had killed an aide-de-camp +standing near the commander in chief and had taken it to his +commander. Just as he had done after Austerlitz, he related this +occurrence at such length and so insistently that everyone again +believed it had been necessary to do this, and he received two +decorations for the Finnish war also. In 1809 he was a captain in +the Guards, wore medals, and held some special lucrative posts in +Petersburg. + +Though some skeptics smiled when told of Berg's merits, it could not +be denied that he was a painstaking and brave officer, on excellent +terms with his superiors, and a moral young man with a brilliant +career before him and an assured position in society. + +Four years before, meeting a German comrade in the stalls of a +Moscow theater, Berg had pointed out Vera Rostova to him and had +said in German, "das soll mein Weib werden,"* and from that moment had +made up his mind to marry her. Now in Petersburg, having considered +the Rostovs' position and his own, he decided that the time had come +to propose. + + +*"That girl shall be my wife." + + +Berg's proposal was at first received with a perplexity that was not +flattering to him. At first it seemed strange that the son of an +obscure Livonian gentleman should propose marriage to a Countess +Rostova; but Berg's chief characteristic was such a naive and good +natured egotism that the Rostovs involuntarily came to think it +would be a good thing, since he himself was so firmly convinced that +it was good, indeed excellent. Moreover, the Rostovs' affairs were +seriously embarrassed, as the suitor could not but know; and above +all, Vera was twenty-four, had been taken out everywhere, and though +she was certainly good-looking and sensible, no one up to now had +proposed to her. So they gave their consent. + +"You see," said Berg to his comrade, whom he called "friend" only +because he knew that everyone has friends, "you see, I have considered +it all, and should not marry if I had not thought it all out or if +it were in any way unsuitable. But on the contrary, my papa and +mamma are now provided for--I have arranged that rent for them in +the Baltic Provinces--and I can live in Petersburg on my pay, and with +her fortune and my good management we can get along nicely. I am not +marrying for money--I consider that dishonorable--but a wife should +bring her share and a husband his. I have my position in the +service, she has connections and some means. In our times that is +worth something, isn't it? But above all, she is a handsome, estimable +girl, and she loves me..." + +Berg blushed and smiled. + +"And I love her, because her character is sensible and very good. +Now the other sister, though they are the same family, is quite +different--an unpleasant character and has not the same +intelligence. She is so... you know?... Unpleasant... But my +fiancee!... Well, you will be coming," he was going to say, "to dine," +but changed his mind and said "to take tea with us," and quickly +doubling up his tongue he blew a small round ring of tobacco smoke, +perfectly embodying his dream of happiness. + +After the first feeling of perplexity aroused in the parents by +Berg's proposal, the holiday tone of joyousness usual at such times +took possession of the family, but the rejoicing was external and +insincere. In the family's feeling toward this wedding a certain +awkwardness and constraint was evident, as if they were ashamed of not +having loved Vera sufficiently and of being so ready to get her off +their hands. The old count felt this most. He would probably have been +unable to state the cause of his embarrassment, but it resulted from +the state of his affairs. He did not know at all how much he had, what +his debts amounted to, or what dowry he could give Vera. When his +daughters were born he had assigned to each of them, for her dowry, an +estate with three hundred serfs; but one of these estates had +already been sold, and the other was mortgaged and the interest so +much in arrears that it would have to be sold, so that it was +impossible to give it to Vera. Nor had he any money. + +Berg had already been engaged a month, and only a week remained +before the wedding, but the count had not yet decided in his own +mind the question of the dowry, nor spoken to his wife about it. At +one time the count thought of giving her the Ryazan estate or of +selling a forest, at another time of borrowing money on a note of +hand. A few days before the wedding Berg entered the count's study +early one morning and, with a pleasant smile, respectfully asked his +future father-in-law to let him know what Vera's dowry would be. The +count was so disconcerted by this long-foreseen inquiry that without +consideration he gave the first reply that came into his head. "I like +your being businesslike about it.... I like it. You shall be +satisfied...." + +And patting Berg on the shoulder he got up, wishing to end the +conversation. But Berg, smiling pleasantly, explained that if he did +not know for certain how much Vera would have and did not receive at +least part of the dowry in advance, he would have to break matters +off. + +"Because, consider, Count--if I allowed myself to marry now +without having definite means to maintain my wife, I should be +acting badly...." + +The conversation ended by the count, who wished to be generous and +to avoid further importunity, saying that he would give a note of hand +for eighty thousand rubles. Berg smiled meekly, kissed the count on +the shoulder, and said that he was very grateful, but that it was +impossible for him to arrange his new life without receiving thirty +thousand in ready money. "Or at least twenty thousand, Count," he +added, "and then a note of hand for only sixty thousand." + +"Yes, yes, all right!" said the count hurriedly. "Only excuse me, my + +dear fellow, I'll give you twenty thousand and a note of hand for +eighty thousand as well. Yes, yes! Kiss me." + + + + + +CHAPTER XII + + +Natasha was sixteen and it was the year 1809, the very year to which +she had counted on her fingers with Boris after they had kissed four +years ago. Since then she had not seen him. Before Sonya and her +mother, if Boris happened to be mentioned, she spoke quite freely of +that episode as of some childish, long-forgotten matter that was not +worth mentioning. But in the secret depths of her soul the question +whether her engagement to Boris was a jest or an important, binding +promise tormented her. + +Since Boris left Moscow in 1805 to join the army he had had not seen +the Rostovs. He had been in Moscow several times, and had passed +near Otradnoe, but had never been to see them. + +Sometimes it occurred to Natasha that he not wish to see her, and +this conjecture was confirmed by the sad tone in which her elders +spoke of him. + +"Nowadays old friends are not remembered," the countess would say +when Boris was mentioned. + +Anna Mikhaylovna also had of late visited them less frequently, +seemed to hold herself with particular dignity, and always spoke +rapturously and gratefully of the merits of her son and the +brilliant career on which he had entered. When the Rostovs came to +Petersburg Boris called on them. + +He drove to their house in some agitation. The memory of Natasha was +his most poetic recollection. But he went with the firm intention of +letting her and her parents feel that the childish relations between +himself and Natasha could not be binding either on her or on him. He +had a brilliant position in society thanks to his intimacy with +Countess Bezukhova, a brilliant position in the service thanks to +the patronage of an important personage whose complete confidence he +enjoyed, and he was beginning to make plans for marrying one of the +richest heiresses in Petersburg, plans which might very easily be +realized. When he entered the Rostovs' drawing room Natasha was in her +own room. When she heard of his arrival she almost ran into the +drawing room, flushed and beaming with a more than cordial smile. + +Boris remembered Natasha in a short dress, with dark eyes shining +from under her curls and boisterous, childish laughter, as he had +known her four years before; and so he was taken aback when quite a +different Natasha entered, and his face expressed rapturous +astonishment. This expression on his face pleased Natasha. + +"Well, do you recognize your little madcap playmate?" asked the +countess. + +Boris kissed Natasha's hand and said that he was astonished at the +change in her. + +"How handsome you have grown!" + +"I should think so!" replied Natasha's laughing eyes. + +"And is Papa older?" she asked. + +Natasha sat down and, without joining in Boris' conversation with +the countess, silently and minutely studied her childhood's suitor. He +felt the weight of that resolute and affectionate scrutiny and glanced +at her occasionally. + +Boris' uniform, spurs, tie, and the way his hair was brushed were +all comme il faut and in the latest fashion. This Natasha noticed at +once. He sat rather sideways in the armchair next to the countess, +arranging with his right hand the cleanest of gloves that fitted his +left hand like a skin, and he spoke with a particularly refined +compression of his lips about the amusements of the highest Petersburg +society, recalling with mild irony old times in Moscow and Moscow +acquaintances. It was not accidentally, Natasha felt, that he alluded, +when speaking of the highest aristocracy, to an ambassador's ball he +had attended, and to invitations he had received from N.N. and S.S. + +All this time Natasha sat silent, glancing up at him from under +her brows. This gaze disturbed and confused Boris more and more. He +looked round more frequently toward her, and broke off in what he +was saying. He did not stay more than ten minutes, then rose and +took his leave. The same inquisitive, challenging, and rather +mocking eyes still looked at him. After his first visit Boris said +to himself that Natasha attracted him just as much as ever, but that +he must not yield to that feeling, because to marry her, a girl almost +without fortune, would mean ruin to his career, while to renew their +former relations without intending to marry her would be dishonorable. +Boris made up his mind to avoid meeting Natasha, but despite that +resolution he called again a few days later and began calling often +and spending whole days at the Rostovs'. It seemed to him that he +ought to have an explanation with Natasha and tell her that the old +times must be forgotten, that in spite of everything... she could +not be his wife, that he had no means, and they would never let her +marry him. But he failed to do so and felt awkward about entering on +such an explanation. From day to day he became more and more +entangled. It seemed to her mother and Sonya that Natasha was in +love with Boris as of old. She sang him his favorite songs, showed him +her album, making him write in it, did not allow him to allude to +the past, letting it be understood how was the present; and every +day he went away in a fog, without having said what he meant to, and +not knowing what he was doing or why he came, or how it would all end. +He left off visiting Helene and received reproachful notes from her +every day, and yet he continued to spend whole days with the Rostovs. + + + + + +CHAPTER XIII + + +One night when the old countess, in nightcap and dressing jacket, +without her false curls, and with her poor little knob of hair showing +under her white cotton cap, knelt sighing and groaning on a rug and +bowing to the ground in prayer, her door creaked and Natasha, also +in a dressing jacket with slippers on her bare feet and her hair in +curlpapers, ran in. The countess--her prayerful mood dispelled--looked +round and frowned. She was finishing her last prayer: "Can it be +that this couch will be my grave?" Natasha, flushed and eager, +seeing her mother in prayer, suddenly checked her rush, half sat down, +and unconsciously put out her tongue as if chiding herself. Seeing +that her mother was still praying she ran on tiptoe to the bed and, +rapidly slipping one little foot against the other, pushed off her +slippers and jumped onto the bed the countess had feared might +become her grave. This couch was high, with a feather bed and five +pillows each smaller than the one below. Natasha jumped on it, sank +into the feather bed, rolled over to the wall, and began snuggling +up the bedclothes as she settled down, raising her knees to her +chin, kicking out and laughing almost inaudibly, now covering +herself up head and all, and now peeping at her mother. The countess +finished her prayers and came to the bed with a stern face, but +seeing, that Natasha's head was covered, she smiled in her kind, +weak way. + +"Now then, now then!" said she. + +"Mamma, can we have a talk? Yes?" said Natasha. "Now, just one on +your throat and another... that'll do!" And seizing her mother round +the neck, she kissed her on the throat. In her behavior to her +mother Natasha seemed rough, but she was so sensitive and tactful that +however she clasped her mother she always managed to do it without +hurting her or making her feel uncomfortable or displeased. + +"Well, what is it tonight?" said the mother, having arranged her +pillows and waited until Natasha, after turning over a couple of +times, had settled down beside her under the quilt, spread out her +arms, and assumed a serious expression. + +These visits of Natasha's at night before the count returned from +his club were one of the greatest pleasures of both mother, and +daughter. + +"What is it tonight?--But I have to tell you..." + +Natasha put her hand on her mother's mouth. + +"About Boris... I know," she said seriously; "that's what I have +come about. Don't say it--I know. No, do tell me!" and she removed her +hand. "Tell me, Mamma! He's nice?" + +"Natasha, you are sixteen. At your age I was married. You say +Boris is nice. He is very nice, and I love him like a son. But what +then?... What are you thinking about? You have quite turned his +head, I can see that...." + +As she said this the countess looked round at her daughter. +Natasha was lying looking steadily straight before her at one of the +mahogany sphinxes carved on the corners of the bedstead, so that the +countess only saw her daughter's face in profile. That face struck her +by its peculiarly serious and concentrated expression. + +Natasha was listening and considering. + +"Well, what then?" said she. + +"You have quite turned his head, and why? What do you want of him? +You know you can't marry him." + +"Why not?" said Natasha, without changing her position. + +"Because he is young, because he is poor, because he is a +relation... and because you yourself don't love him." + +"How do you know?" + +"I know. It is not right, darling!" + + "But if I want to..." said Natasha. + +"Leave off talking nonsense," said the countess. + +"But if I want to..." + +"Natasha, I am in earnest..." + +Natasha did not let her finish. She drew the countess' large hand to +her, kissed it on the back and then on the palm, then again turned +it over and began kissing first one knuckle, then the space between +the knuckles, then the next knuckle, whispering, "January, February, +March, April, May. Speak, Mamma, why don't you say anything? Speak!" +said she, turning to her mother, who was tenderly gazing at her +daughter and in that contemplation seemed to have forgotten all she +had wished to say. + +"It won't do, my love! Not everyone will understand this +friendship dating from your childish days, and to see him so +intimate with you may injure you in the eyes of other young men who +visit us, and above all it torments him for nothing. He may already +have found a suitable and wealthy match, and now he's half crazy." + +"Crazy?" repeated Natasha. + +"I'll tell you some things about myself. I had a cousin..." + +"I know! Cyril Matveich... but he is old." + +"He was not always old. But this is what I'll do, Natasha, I'll have +a talk with Boris. He need not come so often...." + +"Why not, if he likes to?" + +"Because I know it will end in nothing...." + +"How can you know? No, Mamma, don't speak to him! What nonsense!" +said Natasha in the tone of one being deprived of her property. "Well, +I won't marry, but let him come if he enjoys it and I enjoy it." +Natasha smiled and looked at her mother. "Not to marry, but just +so," she added. + +"How so, my pet?" + +"Just so. There's no need for me to marry him. But... just so." + +"Just so, just so," repeated the countess, and shaking all over, she +went off into a good humored, unexpected, elderly laugh. + +"Don't laugh, stop!" cried Natasha. "You're shaking the whole bed! +You're awfully like me, just such another giggler.... Wait..." and she +seized the countess' hands and kissed a knuckle of the little +finger, saying, "June," and continued, kissing, "July, August," on the +other hand. "But, Mamma, is he very much in love? What do you think? +Was anybody ever so much in love with you? And he's very nice, very, +very nice. Only not quite my taste--he is so narrow, like the +dining-room clock.... Don't you understand? Narrow, you know--gray, +light gray..." + +"What rubbish you're talking!" said the countess. + +Natasha continued: "Don't you really understand? Nicholas would +understand.... Bezukhov, now, is blue, dark-blue and red, and he is +square." + +"You flirt with him too," said the countess, laughing. + +"No, he is a Freemason, I have found out. He is fine, dark-blue +and red.... How can I explain it to you?" + +"Little countess!" the count's voice called from behind the door. +"You're not asleep?" Natasha jumped up, snatched up her slippers, +and ran barefoot to her own room. + +It was a long time before she could sleep. She kept thinking that no +one could understand all that she understood and all there was in her. + +"Sonya?" she thought, glancing at that curled-up, sleeping little +kitten with her enormous plait of hair. "No, how could she? She's +virtuous. She fell in love with Nicholas and does not wish to know +anything more. Even Mamma does not understand. It is wonderful how +clever I am and how... charming she is," she went on, speaking of +herself in the third person, and imagining it was some very wise +man--the wisest and best of men--who was saying it of her. "There is +everything, everything in her," continued this man. "She is +unusually intelligent, charming... and then she is pretty, +uncommonly pretty, and agile--she swims and rides splendidly... and +her voice! One can really say it's a wonderful voice!" + +She hummed a scrap from her favorite opera by Cherubini, threw +herself on her bed, laughed at the pleasant thought that she would +immediately fall asleep, called Dunyasha the maid to put out the +candle, and before Dunyasha had left the room had already passed +into yet another happier world of dreams, where everything was as +light and beautiful as in reality, and even more so because it was +different. + + +Next day the countess called Boris aside and had a talk with him, +after which he ceased coming to the Rostovs'. + + + + + +CHAPTER XIV + + +On the thirty-first of December, New Year's Eve, 1809 --10 an old +grandee of Catherine's day was giving a ball and midnight supper. +The diplomatic corps and the Emperor himself were to be present. + +The grandee's well-known mansion on the English Quay glittered +with innumerable lights. Police were stationed at the brightly lit +entrance which was carpeted with red baize, and not only gendarmes but +dozens of police officers and even the police master himself stood +at the porch. Carriages kept driving away and fresh ones arriving, +with red-liveried footmen and footmen in plumed hats. From the +carriages emerged men wearing uniforms, stars, and ribbons, while +ladies in satin and ermine cautiously descended the carriage steps +which were let down for them with a clatter, and then walked hurriedly +and noiselessly over the baize at the entrance. + +Almost every time a new carriage drove up a whisper ran through +the crowd and caps were doffed. + +"The Emperor?... No, a minister.... prince... ambassador. Don't +you see the plumes?..." was whispered among the crowd. + +One person, better dressed than the rest, seemed to know everyone +and mentioned by name the greatest dignitaries of the day. + +A third of the visitors had already arrived, but the Rostovs, who +were to be present, were still hurrying to get dressed. + +There had been many discussions and preparations for this ball in +the Rostov family, many fears that the invitation would not arrive, +that the dresses would not be ready, or that something would not be +arranged as it should be. + +Marya Ignatevna Peronskaya, a thin and shallow maid of honor at +the court of the Dowager Empress, who was a friend and relation of the +countess and piloted the provincial Rostovs in Petersburg high +society, was to accompany them to the ball. + +They were to call for her at her house in the Taurida Gardens at ten +o'clock, but it was already five minutes to ten, and the girls were +not yet dressed. + +Natasha was going to her first grand ball. She had got up at eight +that morning and had been in a fever of excitement and activity all +day. All her powers since morning had been concentrated on ensuring +that they all--she herself, Mamma, and Sonya--should be as well +dressed as possible. Sonya and her mother put themselves entirely in +her hands. The countess was to wear a claret-colored velvet dress, and +the two girls white gauze over pink silk slips, with roses on their +bodices and their hair dressed a la grecque. + +Everything essential had already been done; feet, hands, necks, +and ears washed, perfumed, and powdered, as befits a ball; the +openwork silk stockings and white satin shoes with ribbons were +already on; the hairdressing was almost done. Sonya was finishing +dressing and so was the countess, but Natasha, who had bustled about +helping them all, was behindhand. She was still sitting before a +looking-glass with a dressing jacket thrown over her slender +shoulders. Sonya stood ready dressed in the middle of the room and, +pressing the head of a pin till it hurt her dainty finger, was +fixing on a last ribbon that squeaked as the pin went through it. + +"That's not the way, that's not the way, Sonya!" cried Natasha +turning her head and clutching with both hands at her hair which the +maid who was dressing it had not time to release. "That bow is not +right. Come here!" + +Sonya sat down and Natasha pinned the ribbon on differently. + +"Allow me, Miss! I can't do it like that," said the maid who was +holding Natasha's hair. + +"Oh, dear! Well then, wait. That's right, Sonya." + +"Aren't you ready? It is nearly ten," came the countess' voice. + +"Directly! Directly! And you, Mamma?" + +"I have only my cap to pin on." + +"Don't do it without me!" called Natasha. "You won't do it right." + +"But it's already ten." + +They had decided to be at the ball by half past ten, and Natasha had +still to get dressed and they had to call at the Taurida Gardens. + +When her hair was done, Natasha, in her short petticoat from under +which her dancing shoes showed, and in her mother's dressing jacket, +ran up to Sonya, scrutinized her, and then ran to her mother. +Turning her mother's head this way and that, she fastened on the cap +and, hurriedly kissing her gray hair, ran back to the maids who were +turning up the hem of her skirt. + +The cause of the delay was Natasha's skirt, which was too long. +Two maids were turning up the hem and hurriedly biting off the ends of +thread. A third with pins in her mouth was running about between the +countess and Sonya, and a fourth held the whole of the gossamer +garment up high on one uplifted hand. + +"Mavra, quicker, darling!" + +"Give me my thimble, Miss, from there..." + +"Whenever will you be ready?" asked the count coming to the door. +"Here is here is some scent. Peronskaya must be tired of waiting." + +"It's ready, Miss," said the maid, holding up the shortened gauze +dress with two fingers, and blowing and shaking something off it, as +if by this to express a consciousness of the airiness and purity of +what she held. + +Natasha began putting on the dress. + +"In a minute! In a minute! Don't come in, Papa!" she cried to her +father as he opened the door--speaking from under the filmy skirt +which still covered her whole face. + +Sonya slammed the door to. A minute later they let the count in. +He was wearing a blue swallow-tail coat, shoes and stockings, and +was perfumed and his hair pomaded. + +"Oh, Papa! how nice you look! Charming!" cried Natasha, as she stood +in the middle of the room smoothing out the folds of the gauze. + +"If you please, Miss! allow me," said the maid, who on her knees was +pulling the skirt straight and shifting the pins from one side of +her mouth to the other with her tongue. + +"Say what you like," exclaimed Sonya, in a despairing voice as she +looked at Natasha, "say what you like, it's still too long." + +Natasha stepped back to look at herself in the pier glass. The dress +was too long. + +"Really, madam, it is not at all too long," said Mavra, crawling +on her knees after her young lady. + +"Well, if it's too long we'll take it up... we'll tack it up in +one minute," said the resolute Dunyasha taking a needle that was stuck +on the front of her little shawl and, still kneeling on the floor, set +to work once more. + +At that moment, with soft steps, the countess came in shyly, in +her cap and velvet gown. + +"Oo-oo, my beauty!" exclaimed the count, "she looks better than +any of you!" + +He would have embraced her but, blushing, she stepped aside +fearing to be rumpled. + +"Mamma, your cap, more to this side," said Natasha. "I'll arrange +it," and she rushed forward so that the maids who were tacking up +her skirt could not move fast enough and a piece of gauze was torn +off. + +"Oh goodness! What has happened? Really it was not my fault!" + +"Never mind, I'll run it up, it won't show," said Dunyasha. + +"What a beauty--a very queen!" said the nurse as she came to the +door. "And Sonya! They are lovely!" + +At a quarter past ten they at last got into their carriages and +started. But they had still to call at the Taurida Gardens. + +Peronskaya was quite ready. In spite of her age and plainness she +had gone through the same process as the Rostovs, but with less +flurry--for to her it was a matter of routine. Her ugly old body was +washed, perfumed, and powdered in just the same way. She had washed +behind her ears just as carefully, and when she entered her drawing +room in her yellow dress, wearing her badge as maid of honor, her +old lady's maid was as full of rapturous admiration as the Rostovs' +servants had been. + +She praised the Rostovs' toilets. They praised her taste and toilet, +and at eleven o'clock, careful of their coiffures and dresses, they +settled themselves in their carriages and drove off. + + + + + +CHAPTER XV + + +Natasha had not had a moment free since early morning and had not +once had time to think of what lay before her. + +In the damp chill air and crowded closeness of the swaying carriage, +she for the first time vividly imagined what was in store for her +there at the ball, in those brightly lighted rooms--with music, +flowers, dances, the Emperor, and all the brilliant young people of +Petersburg. The prospect was so splendid that she hardly believed it +would come true, so out of keeping was it with the chill darkness +and closeness of the carriage. She understood all that awaited her +only when, after stepping over the red baize at the entrance, she +entered the hall, took off her fur cloak, and, beside Sonya and in +front of her mother, mounted the brightly illuminated stairs between +the flowers. Only then did she remember how she must behave at a ball, +and tried to assume the majestic air she considered indispensable +for a girl on such an occasion. But, fortunately for her, she felt her +eyes growing misty, she saw nothing clearly, her pulse beat a +hundred to the minute, and the blood throbbed at her heart. She +could not assume that pose, which would have made her ridiculous, +and she moved on almost fainting from excitement and trying with all +her might to conceal it. And this was the very attitude that became +her best. Before and behind them other visitors were entering, also +talking in low tones and wearing ball dresses. The mirrors on the +landing reflected ladies in white, pale-blue, and pink dresses, with +diamonds and pearls on their bare necks and arms. + +Natasha looked in the mirrors and could not distinguish her +reflection from the others. All was blended into one brilliant +procession. On entering the ballroom the regular hum of voices, +footsteps, and greetings deafened Natasha, and the light and glitter +dazzled her still more. The host and hostess, who had already been +standing at the door for half an hour repeating the same words to +the various arrivals, "Charme de vous voir,"* greeted the Rostovs +and Peronskaya in the same manner. + + +*"Delighted to see you." + + +The two girls in their white dresses, each with a rose in her +black hair, both curtsied in the same way, but the hostess' eye +involuntarily rested longer on the slim Natasha. She looked at her and +gave her alone a special smile in addition to her usual smile as +hostess. Looking at her she may have recalled the golden, +irrecoverable days of her own girlhood and her own first ball. The +host also followed Natasha with his eyes and asked the count which was +his daughter. + +"Charming!" said he, kissing the tips of his fingers. + +In the ballroom guests stood crowding at the entrance doors awaiting +the Emperor. The countess took up a position in one of the front +rows of that crowd. Natasha heard and felt that several people were +asking about her and looking at her. She realized that those +noticing her liked her, and this observation helped to calm her. + +"There are some like ourselves and some worse," she thought. + +Peronskaya was pointing out to the countess the most important +people at the ball. + +"That is the Dutch ambassador, do you see? That gray-haired man," +she said, indicating an old man with a profusion of silver-gray +curly hair, who was surrounded by ladies laughing at something he +said. + +"Ah, here she is, the Queen of Petersburg, Countess Bezukhova," said +Peronskaya, indicating Helene who had just entered. "How lovely! She +is quite equal to Marya Antonovna. See how the men, young and old, pay +court to her. Beautiful and clever... they say Prince--is quite mad +about her. But see, those two, though not good-looking, are even +more run after." + +She pointed to a lady who was crossing the room followed by a very +plain daughter. + +"She is a splendid match, a millionairess," said Peronskaya. "And +look, here come her suitors." + +"That is Bezukhova's brother, Anatole Kuragin," she said, indicating +a handsome officer of the Horse Guards who passed by them with head +erect, looking at something over the heads of the ladies. "He's +handsome, isn't he? I hear they will marry him to that rich girl. +But your cousin, Drubetskoy, is also very attentive to her. They say +she has millions. Oh yes, that's the French ambassador himself!" she +replied to the countess' inquiry about Caulaincourt. "Looks as if he +were a king! All the same, the French are charming, very charming. +No one more charming in society. Ah, here she is! Yes, she is still +the most beautiful of them all, our Marya Antonovna! And how simply +she is dressed! Lovely! And that stout one in spectacles is the +universal Freemason," she went on, indicating Pierre. "Put him +beside his wife and he looks a regular buffoon!" + +Pierre, swaying his stout body, advanced, making way through the +crowd and nodding to right and left as casually and good-naturedly +as if he were passing through a crowd at a fair. He pushed through, +evidently looking for someone. + +Natasha looked joyfully at the familiar face of Pierre, "the +buffoon," as Peronskaya had called him, and knew he was looking for +them, and for her in particular. He had promised to be at the ball and +introduce partners to her. + +But before he reached them Pierre stopped beside a very handsome, +dark man of middle height, and in a white uniform, who stood by a +window talking to a tall man wearing stars and a ribbon. Natasha at +once recognized the shorter and younger man in the white uniform: it +was Bolkonski, who seemed to her to have grown much younger, +happier, and better-looking. + +"There's someone else we know--Bolkonski, do you see, Mamma?" said +Natasha, pointing out Prince Andrew. "You remember, he stayed a +night with us at Otradnoe." + +"Oh, you know him?" said Peronskaya. "I can't bear him. Il fait a +present la pluie et le beau temps.* He's too proud for anything. +Takes after his father. And he's hand in glove with Speranski, writing +some project or other. Just look how he treats the ladies! There's one +talking to him and he has turned away," she said, pointing at him. +"I'd give it to him if he treated me as he does those ladies." + + +*"He is all the rage just now. + + + + + +CHAPTER XVI + + +Suddenly everybody stirred, began talking, and pressed forward and +then back, and between the two rows, which separated, the Emperor +entered to the sounds of music that had immediately struck up. +Behind him walked his host and hostess. He walked in rapidly, bowing +to right and left as if anxious to get the first moments of the +reception over. The band played the polonaise in vogue at that time on +account of the words that had been set to it, beginning: "Alexander, +Elisaveta, all our hearts you ravish quite..." The Emperor passed on +to the drawing room, the crowd made a rush for the doors, and +several persons with excited faces hurried there and back again. +Then the crowd hastily retired from the drawing-room door, at which +the Emperor reappeared talking to the hostess. A young man, looking +distraught, pounced down on the ladies, asking them to move aside. +Some ladies, with faces betraying complete forgetfulness of all the +rules of decorum, pushed forward to the detriment of their toilets. +The men began to choose partners and take their places for the +polonaise. + +Everyone moved back, and the Emperor came smiling out of the drawing +room leading his hostess by the hand but not keeping time to the +music. The host followed with Marya Antonovna Naryshkina; then came +ambassadors, ministers, and various generals, whom Peronskaya +diligently named. More than half the ladies already had partners and +were taking up, or preparing to take up, their positions for the +polonaise. Natasha felt that she would be left with her mother and +Sonya among a minority of women who crowded near the wall, not +having been invited to dance. She stood with her slender arms +hanging down, her scarcely defined bosom rising and falling regularly, +and with bated breath and glittering, frightened eyes gazed straight +before her, evidently prepared for the height of joy or misery. She +was not concerned about the Emperor or any of those great people +whom Peronskaya was pointing out--she had but one thought: "Is it +possible no one will ask me, that I shall not be among the first to +dance? Is it possible that not one of all these men will notice me? +They do not even seem to see me, or if they do they look as if they +were saying, 'Ah, she's not the one I'm after, so it's not worth +looking at her!' No, it's impossible," she thought. "They must know +how I long to dance, how splendidly I dance, and how they would +enjoy dancing with me." + +The strains of the polonaise, which had continued for a considerable +time, had begun to sound like a sad reminiscence to Natasha's ears. +She wanted to cry. Peronskaya had left them. The count was at the +other end of the room. She and the countess and Sonya were standing by +themselves as in the depths of a forest amid that crowd of +strangers, with no one interested in them and not wanted by anyone. +Prince Andrew with a lady passed by, evidently not recognizing them. +The handsome Anatole was smilingly talking to a partner on his arm and +looked at Natasha as one looks at a wall. Boris passed them twice +and each time turned away. Berg and his wife, who were not dancing, +came up to them. + +This family gathering seemed humiliating to Natasha--as if there +were nowhere else for the family to talk but here at the ball. She did +not listen to or look at Vera, who was telling her something about her +own green dress. + +At last the Emperor stopped beside his last partner (he had danced +with three) and the music ceased. A worried aide-de-camp ran up to the +Rostovs requesting them to stand farther back, though as it was they +were already close to the wall, and from the gallery resounded the +distinct, precise, enticingly rhythmical strains of a waltz. The +Emperor looked smilingly down the room. A minute passed but no one had +yet begun dancing. An aide-de-camp, the Master of Ceremonies, went +up to Countess Bezukhova and asked her to dance. She smilingly +raised her hand and laid it on his shoulder without looking at him. +The aide-de-camp, an adept in his art, grasping his partner firmly +round her waist, with confident deliberation started smoothly, gliding +first round the edge of the circle, then at the corner of the room +he caught Helene's left hand and turned her, the only sound audible, +apart from the ever-quickening music, being the rhythmic click of +the spurs on his rapid, agile feet, while at every third beat his +partner's velvet dress spread out and seemed to flash as she whirled +round. Natasha gazed at them and was ready to cry because it was not +she who was dancing that first turn of the waltz. + +Prince Andrew, in the white uniform of a cavalry colonel, wearing +stockings and dancing shoes, stood looking animated and bright in +the front row of the circle not far from the Rostovs. Baron Firhoff +was talking to him about the first sitting of the Council of State +to be held next day. Prince Andrew, as one closely connected with +Speranski and participating in the work of the legislative commission, +could give reliable information about that sitting, concerning which +various rumors were current. But not listening to what Firhoff was +saying, he was gazing now at the sovereign and now at the men +intending to dance who had not yet gathered courage to enter the +circle. + +Prince Andrew was watching these men abashed by the Emperor's +presence, and the women who were breathlessly longing to be asked to +dance. + +Pierre came up to him and caught him by the arm. + +"You always dance. I have a protegee, the young Rostova, here. Ask +her," he said. + +"Where is she?" asked Bolkonski. "Excuse me!" he added, turning to +the baron, "we will finish this conversation elsewhere--at a ball +one must dance." He stepped forward in the direction Pierre indicated. +The despairing, dejected expression of Natasha's face caught his +eye. He recognized her, guessed her feelings, saw that it was her +debut, remembered her conversation at the window, and with an +expression of pleasure on his face approached Countess Rostova. + +"Allow me to introduce you to my daughter," said the countess, +with heightened color. + +"I have the pleasure of being already acquainted, if the countess +remembers me," said Prince Andrew with a low and courteous bow quite +belying Peronskaya's remarks about his rudeness, and approaching +Natasha he held out his arm to grasp her waist before he had completed +his invitation. He asked her to waltz. That tremulous expression on +Natasha's face, prepared either for despair or rapture, suddenly +brightened into a happy, grateful, childlike smile. + +"I have long been waiting for you," that frightened happy little +girl seemed to say by the smile that replaced the threatened tears, as +she raised her hand to Prince Andrew's shoulder. They were the +second couple to enter the circle. Prince Andrew was one of the best +dancers of his day and Natasha danced exquisitely. Her little feet +in their white satin dancing shoes did their work swiftly, lightly, +and independently of herself, while her face beamed with ecstatic +happiness. Her slender bare arms and neck were not beautiful--compared +to Helene's her shoulders looked thin and her bosom undeveloped. But +Helene seemed, as it were, hardened by a varnish left by the thousands +of looks that had scanned her person, while Natasha was like a girl +exposed for the first time, who would have felt very much ashamed +had she not been assured that this was absolutely necessary. + +Prince Andrew liked dancing, and wishing to escape as quickly as +possible from the political and clever talk which everyone addressed +to him, wishing also to break up the circle of restraint he +disliked, caused by the Emperor's presence, he danced, and had +chosen Natasha because Pierre pointed her out to him and because she +was the first pretty girl who caught his eye; but scarcely had he +embraced that slender supple figure and felt her stirring so close +to him and smiling so near him than the wine of her charm rose to +his head, and he felt himself revived and rejuvenated when after +leaving her he stood breathing deeply and watching the other dancers. + + + + + +CHAPTER XVII + + +After Prince Andrew, Boris came up to ask Natasha for dance, and +then the aide-de-camp who had opened the ball, and several other young +men, so that, flushed and happy, and passing on her superfluous +partners to Sonya, she did not cease dancing all the evening. She +noticed and saw nothing of what occupied everyone else. Not only did +she fail to notice that the Emperor talked a long time with the French +ambassador, and how particularly gracious he was to a certain lady, or +that Prince So-and-so and So-and-so did and said this and that, and +that Helene had great success and was honored was by the special +attention of So-and-so, but she did not even see the Emperor, and only +noticed that he had gone because the ball became livelier after his +departure. For one of the merry cotillions before supper Prince Andrew +was again her partner. He reminded her of their first encounter in the +Otradnoe avenue, and how she had been unable to sleep that moonlight +night, and told her how he had involuntarily overheard her. Natasha +blushed at that recollection and tried to excuse herself, as if +there had been something to be ashamed of in what Prince Andrew had +overheard. + +Like all men who have grown up in society, Prince Andrew liked +meeting someone there not of the conventional society stamp. And +such was Natasha, with her surprise, her delight, her shyness, and +even her mistakes in speaking French. With her he behaved with special +care and tenderness, sitting beside her and talking of the simplest +and most unimportant matters; he admired her shy grace. In the +middle of the cotillion, having completed one of the figures, Natasha, +still out of breath, was returning to her seat when another dancer +chose her. She was tired and panting and evidently thought of +declining, but immediately put her hand gaily on the man's shoulder, +smiling at Prince Andrew. + +"I'd be glad to sit beside you and rest: I'm tired; but you see +how they keep asking me, and I'm glad of it, I'm happy and I love +everybody, and you and I understand it all," and much, much more was +said in her smile. When her partner left her Natasha ran across the +room to choose two ladies for the figure. + +"If she goes to her cousin first and then to another lady, she +will be my wife," said Prince Andrew to himself quite to his own +surprise, as he watched her. She did go first to her cousin. + +"What rubbish sometimes enters one's head!" thought Prince Andrew, +"but what is certain is that that girl is so charming, so original, +that she won't be dancing here a month before she will be +married.... Such as she are rare here," he thought, as Natasha, +readjusting a rose that was slipping on her bodice, settled herself +beside him. + +When the cotillion was over the old count in his blue coat came up +to the dancers. He invited Prince Andrew to come and see them, and +asked his daughter whether she was enjoying herself. Natasha did not +answer at once but only looked up with a smile that said +reproachfully: "How can you ask such a question?" + +"I have never enjoyed myself so much before!" she said, and Prince +Andrew noticed how her thin arms rose quickly as if to embrace her +father and instantly dropped again. Natasha was happier than she had +ever been in her life. She was at that height of bliss when one +becomes completely kind and good and does not believe in the +possibility of evil, unhappiness, or sorrow. + +At that ball Pierre for the first time felt humiliated by the +position his wife occupied in court circles. He was gloomy and +absent-minded. A deep furrow ran across his forehead, and standing +by a window he stared over his spectacles seeing no one. + +On her way to supper Natasha passed him. + +Pierre's gloomy, unhappy look struck her. She stopped in front of +him. She wished to help him, to bestow on him the superabundance of +her own happiness. + +"How delightful it is, Count!" said she. "Isn't it?" + +Pierre smiled absent-mindedly, evidently not grasping what she said. + +"Yes, I am very glad," he said. + +"How can people be dissatisfied with anything?" thought Natasha. +"Especially such a capital fellow as Bezukhov!" In Natasha's eyes +all the people at the ball alike were good, kind, and splendid people, +loving one another; none of them capable of injuring another--and so +they ought all to be happy. + + + + + +CHAPTER XVIII + + +Next day Prince Andrew thought of the ball, but his mind did not +dwell on it long. "Yes, it was a very brilliant ball," and then... +"Yes, that little Rostova is very charming. There's something fresh, +original, un-Petersburg-like about her that distinguishes her." That +was all he thought about yesterday's ball, and after his morning tea +he set to work. + +But either from fatigue or want of sleep he was ill-disposed for +work and could get nothing done. He kept criticizing his own work, +as he often did, and was glad when he heard someone coming. + +The visitor was Bitski, who served on various committees, frequented +all the societies in Petersburg, and a passionate devotee of the new +ideas and of Speranski, and a diligent Petersburg newsmonger--one of +those men who choose their opinions like their clothes according to +the fashion, but who for that very reason appear to be the warmest +partisans. Hardly had he got rid of his hat before he ran into +Prince Andrew's room with a preoccupied air and at once began talking. +He had just heard particulars of that morning's sitting of the Council +of State opened by the Emperor, and he spoke of it enthusiastically. +The Emperor's speech had been extraordinary. It had been a speech such +as only constitutional monarchs deliver. "The Sovereign plainly said +that the Council and Senate are estates of the realm, he said that the +government must rest not on authority but on secure bases. The Emperor +said that the fiscal system must be reorganized and the accounts +published," recounted Bitski, emphasizing certain words and opening +his eyes significantly. + +"Ah, yes! Today's events mark an epoch, the greatest epoch in our +history," he concluded. + +Prince Andrew listened to the account of the opening of the +Council of State, which he had so impatiently awaited and to which +he had attached such importance, and was surprised that this event, +now that it had taken place, did not affect him, and even seemed quite +insignificant. He listened with quiet irony to Bitski's enthusiastic +account of it. A very simple thought occurred to him: "What does it +matter to me or to Bitski what the Emperor was pleased to say at the +Council? Can all that make me any happier or better?" + +And this simple reflection suddenly destroyed all the interest +Prince Andrew had felt in the impending reforms. He was going to +dine that evening at Speranski's, "with only a few friends," as the +host had said when inviting him. The prospect of that dinner in the +intimate home circle of the man he so admired had greatly interested +Prince Andrew, especially as he had not yet seen Speranski in his +domestic surroundings, but now he felt disinclined to go to it. + +At the appointed hour, however, he entered the modest house +Speranski owned in the Taurida Gardens. In the parqueted dining room +this small house, remarkable for its extreme cleanliness (suggesting +that of a monastery), Prince Andrew, who was rather late, found the +friendly gathering of Speranski's intimate acquaintances already +assembled at five o'clock. There were no ladies present except +Speranski's little daughter (long-faced like her father) and her +governess. The other guests were Gervais, Magnitski, and Stolypin. +While still in the anteroom Prince Andrew heard loud voices and a +ringing staccato laugh--a laugh such as one hears on the stage. +Someone--it sounded like Speranski--was distinctly ejaculating +ha-ha-ha. Prince Andrew had never before heard Speranski's famous +laugh, and this ringing, high pitched laughter from a statesman made a +strange impression on him. + +He entered the dining room. The whole company were standing +between two windows at a small table laid with hors-d'oeuvres. +Speranski, wearing a gray swallow-tail coat with a star on the breast, +and evidently still the same waistcoat and high white stock he had +worn at the meeting of the Council of State, stood at the table with a +beaming countenance. His guests surrounded him. Magnitski, +addressing himself to Speranski, was relating an anecdote, and +Speranski was laughing in advance at what Magnitski was going to +say. When Prince Andrew entered the room Magnitski's words were +again crowned by laughter. Stolypin gave a deep bass guffaw as he +munched a piece of bread and cheese. Gervais laughed softly with a +hissing chuckle, and Speranski in a high-pitched staccato manner. + +Still laughing, Speranski held out his soft white hand to Prince +Andrew. + +"Very pleased to see you, Prince," he said. "One moment..." he +went on, turning to Magnitski and interrupting his story. "We have +agreed that this is a dinner for recreation, with not a word about +business!" and turning again to the narrator he began to laugh afresh. + +Prince Andrew looked at the laughing Speranski with astonishment, +regret, and disillusionment. It seemed to him that this was not +Speranski but someone else. Everything that had formerly appeared +mysterious and fascinating in Speranski suddenly became plain and +unattractive. + +At dinner the conversation did not cease for a moment and seemed +to consist of the contents of a book of funny anecdotes. Before +Magnitski had finished his story someone else was anxious to relate +something still funnier. Most of the anecdotes, if not relating to the +state service, related to people in the service. It seemed that in +this company the insignificance of those people was so definitely +accepted that the only possible attitude toward them was one of good +humored ridicule. Speranski related how at the Council that morning +a deaf dignitary, when asked his opinion, replied that he thought so +too. Gervais gave a long account of an official revision, remarkable +for the stupidity of everybody concerned. Stolypin, stuttering, +broke into the conversation and began excitedly talking of the +abuses that existed under the former order of things--threatening to +give a serious turn to the conversation. Magnitski starting quizzing +Stolypin about his vehemence. Gervais intervened with a joke, and +the talk reverted to its former lively tone. + +Evidently Speranski liked to rest after his labors and find +amusement in a circle of friends, and his guests, understanding his +wish, tried to enliven him and amuse themselves. But their gaiety +seemed to Prince Andrew mirthless and tiresome. Speranski's +high-pitched voice struck him unpleasantly, and the incessant laughter +grated on him like a false note. Prince Andrew did not laugh and +feared that he would be a damper on the spirits of the company, but no +one took any notice of his being out of harmony with the general mood. +They all seemed very gay. + +He tried several times to join in the conversation, but his +remarks were tossed aside each time like a cork thrown out of the +water, and he could not jest with them. + +There was nothing wrong or unseemly in what they said, it was +witty and might have been funny, but it lacked just that something +which is the salt of mirth, and they were not even aware that such a +thing existed. + +After dinner Speranski's daughter and her governess rose. He +patted the little girl with his white hand and kissed her. And that +gesture, too, seemed unnatural to Prince Andrew. + +The men remained at table over their port--English fashion. In the +midst of a conversation that was started about Napoleon's Spanish +affairs, which they all agreed in approving, Prince Andrew began to +express a contrary opinion. Speranski smiled and, with an evident wish +to prevent the conversation from taking an unpleasant course, told a +story that had no connection with the previous conversation. For a few +moments all were silent. + +Having sat some time at table, Speranski corked a bottle of wine +and, remarking, "Nowadays good wine rides in a carriage and pair," +passed it to the servant and got up. All rose and continuing to talk +loudly went into the drawing room. Two letters brought by a courier +were handed to Speranski and he took them to his study. As soon as +he had left the room the general merriment stopped and the guests +began to converse sensibly and quietly with one another. + +"Now for the recitation!" said Speranski on returning from his +study. "A wonderful talent!" he said to Prince Andrew, and Magnitski +immediately assumed a pose and began reciting some humorous verses +in French which he had composed about various well-known Petersburg +people. He was interrupted several times by applause. When the +verses were finished Prince Andrew went up to Speranski and took his +leave. + +"Where are you off to so early?" asked Speranski. + +"I promised to go to a reception." + +They said no more. Prince Andrew looked closely into those +mirrorlike, impenetrable eyes, and felt that it had been ridiculous of +him to have expected anything from Speranski and from any of his own +activities connected with him, or ever to have attributed importance +to what Speranski was doing. That precise, mirthless laughter rang +in Prince Andrew's ears long after he had left the house. + +When he reached home Prince Andrew began thinking of his life in +Petersburg during those last four months as if it were something +new. He recalled his exertions and solicitations, and the history of +his project of army reform, which had been accepted for +consideration and which they were trying to pass over in silence +simply because another, a very poor one, had already been prepared and +submitted to the Emperor. He thought of the meetings of a committee of +which Berg was a member. He remembered how carefully and at what +length everything relating to form and procedure was discussed at +those meetings, and how sedulously and promptly all that related to +the gist of the business was evaded. He recalled his labors on the +Legal Code, and how painstakingly he had translated the articles of +the Roman and French codes into Russian, and he felt ashamed of +himself. Then he vividly pictured to himself Bogucharovo, his +occupations in the country, his journey to Ryazan; he remembered the +peasants and Dron the village elder, and mentally applying to them the +Personal Rights he had divided into paragraphs, he felt astonished +that he could have spent so much time on such useless work. + + + + + +CHAPTER XIX + + +Next day Prince Andrew called at a few houses he had not visited +before, and among them at the Rostovs' with whom he had renewed +acquaintance at the ball. Apart from considerations of politeness +which demanded the call, he wanted to see that original, eager girl +who had left such a pleasant impression on his mind, in her own home. + +Natasha was one of the first to meet him. She was wearing a +dark-blue house dress in which Prince Andrew thought her even prettier +than in her ball dress. She and all the Rostov family welcomed him +as an old friend, simply and cordially. The whole family, whom he +had formerly judged severely, now seemed to him to consist of +excellent, simple, and kindly people. The old count's hospitality +and good nature, which struck one especially in Petersburg as a +pleasant surprise, were such that Prince Andrew could not refuse to +stay to dinner. "Yes," he thought, "they are capital people, who of +course have not the slightest idea what a treasure they possess in +Natasha; but they are kindly folk and form the best possible setting +for this strikingly poetic, charming girl, overflowing with life!" + +In Natasha Prince Andrew was conscious of a strange world completely +alien to him and brimful of joys unknown to him, a different world, +that in the Otradnoe avenue and at the window that moonlight night had +already begun to disconcert him. Now this world disconcerted him no +longer and was no longer alien to him, but he himself having entered +it found in it a new enjoyment. + +After dinner Natasha, at Prince Andrew's request, went to the +clavichord and began singing. Prince Andrew stood by a window +talking to the ladies and listened to her. In the midst of a phrase he +ceased speaking and suddenly felt tears choking him, a thing he had +thought impossible for him. He looked at Natasha as she sang, and +something new and joyful stirred in his soul. He felt happy and at the +same time sad. He had absolutely nothing to weep about yet he was +ready to weep. What about? His former love? The little princess? His +disillusionments?... His hopes for the future?... Yes and no. The +chief reason was a sudden, vivid sense of the terrible contrast +between something infinitely great and illimitable within him and that +limited and material something that he, and even she, was. This +contrast weighed on and yet cheered him while she sang. + +As soon as Natasha had finished she went up to him and asked how +he liked her voice. She asked this and then became confused, feeling +that she ought not to have asked it. He smiled, looking at her, and +said he liked her singing as he liked everything she did. + +Prince Andrew left the Rostovs' late in the evening. He went to +bed from habit, but soon realized that he could not sleep. Having +lit his candle he sat up in bed, then got up, then lay down again +not at all troubled by his sleeplessness: his soul was as fresh and +joyful as if he had stepped out of a stuffy room into God's own +fresh air. It did not enter his head that he was in love with Natasha; +he was not thinking about her, but only picturing her to himself, +and in consequence all life appeared in a new light. "Why do I strive, +why do I toil in this narrow, confined frame, when life, all life with +all its joys, is open to me?" said he to himself. And for the first +time for a very long while he began making happy plans for the future. +He decided that he must attend to his son's education by finding a +tutor and putting the boy in his charge, then he ought to retire +from the service and go abroad, and see England, Switzerland and +Italy. "I must use my freedom while I feel so much strength and +youth in me," he said to himself. "Pierre was right when he said one +must believe in the possibility of happiness in order to be happy, and +now I do believe in it. Let the dead bury their dead, but while one +has life one must live and be happy!" thought he. + + + + + +CHAPTER XX + + +One morning Colonel Berg, whom Pierre knew as he knew everybody in +Moscow and Petersburg, came to see him. Berg arrived in an +immaculate brand-new uniform, with his hair pomaded and brushed +forward over his temples as the Emperor Alexander wore his hair. + +"I have just been to see the countess, your wife. Unfortunately +she could not grant my request, but I hope, Count, I shall be more +fortunate with you," he said with a smile. + +"What is it you wish, Colonel? I am at your service." + +"I have now quite settled in my new rooms, Count" (Berg said this +with perfect conviction that this information could not but be +agreeable), "and so I wish to arrange just a small party for my own +and my wife's friends." (He smiled still more pleasantly.) "I wished +to ask the countess and you to do me the honor of coming to tea and to +supper." + +Only Countess Helene, considering the society of such people as +the Bergs beneath her, could be cruel enough to refuse such an +invitation. Berg explained so clearly why he wanted to collect at +his house a small but select company, and why this would give him +pleasure, and why though he grudged spending money on cards or +anything harmful, he was prepared to run into some expense for the +sake of good society--that Pierre could not refuse, and promised to +come. + +"But don't be late, Count, if I may venture to ask; about ten +minutes to eight, please. We shall make up a rubber. Our general is +coming. He is very good to me. We shall have supper, Count. So you +will do me the favor." + +Contrary to his habit of being late, Pierre on that day arrived at +the Bergs' house, not at ten but at fifteen minutes to eight. + +Having prepared everything necessary for the party, the Bergs were +ready for their guests' arrival. + +In their new, clean, and light study with its small busts and +pictures and new furniture sat Berg and his wife. Berg, closely +buttoned up in his new uniform, sat beside his wife explaining to +her that one always could and should be acquainted with people above +one, because only then does one get satisfaction from acquaintances. + +"You can get to know something, you can ask for something. See how I +managed from my first promotion." (Berg measured his life not by years +but by promotions.) "My comrades are still nobodies, while I am only +waiting for a vacancy to command a regiment, and have the happiness to +be your husband." (He rose and kissed Vera's hand, and on the way to +her straightened out a turned-up corner of the carpet.) "And how +have I obtained all this? Chiefly by knowing how to choose my +aquaintances. It goes without saying that one must be conscientious +and methodical." + +Berg smiled with a sense of his superiority over a weak woman, and +paused, reflecting that this dear wife of his was after all but a weak +woman who could not understand all that constitutes a man's dignity, +what it was ein Mann zu sein.* Vera at the same time smiling with a +sense of superiority over her good, conscientious husband, who all the +same understood life wrongly, as according to Vera all men did. +Berg, judging by his wife, thought all women weak and foolish. Vera, +judging only by her husband and generalizing from that observation, +supposed that all men, though they understand nothing and are +conceited and selfish, ascribe common sense to themselves alone. + + +*To be a man. + + +Berg rose and embraced his wife carefully, so as not to crush her +lace fichu for which he had paid a good price, kissing her straight on +the lips. + +"The only thing is, we mustn't have children too soon," he +continued, following an unconscious sequence of ideas. + +"Yes," answered Vera, "I don't at all want that. We must live for +society." + +"Princess Yusupova wore one exactly like this," said Berg, +pointing to the fichu with a happy and kindly smile. + +Just then Count Bezukhov was announced. Husband and wife glanced +at one another, both smiling with self-satisfaction, and each mentally +claiming the honor of this visit. + +"This is what what comes of knowing how to make acquaintances," +thought Berg. "This is what comes of knowing how to conduct oneself." + +"But please don't interrupt me when I am entertaining the guests," +said Vera, "because I know what interests each of them and what to say +to different people." + +Berg smiled again. + +"It can't be helped: men must sometimes have masculine +conversation," said he. + +They received Pierre in their small, new drawing-room, where it +was impossible to sit down anywhere without disturbing its symmetry, +neatness, and order; so it was quite comprehensible and not strange +that Berg, having generously offered to disturb the symmetry of an +armchair or of the sofa for his dear guest, but being apparently +painfully undecided on the matter himself, eventually left the visitor +to settle the question of selection. Pierre disturbed the symmetry +by moving a chair for himself, and Berg and Vera immediately began +their evening party, interrupting each other in their efforts to +entertain their guest. + +Vera, having decided in her own mind that Pierre ought to be +entertained with conversation about the French embassy, at once +began accordingly. Berg, having decided that masculine conversation +was required, interrupted his wife's remarks and touched on the +question of the war with Austria, and unconsciously jumped from the +general subject to personal considerations as to the proposals made +him to take part in the Austrian campaign and the reasons why he had +declined them. Though the conversation was very incoherent and Vera +was angry at the intrusion of the masculine element, both husband +and wife felt with satisfaction that, even if only one guest was +present, their evening had begun very well and was as like as two peas +to every other evening party with its talk, tea, and lighted candles. + +Before long Boris, Berg's old comrade, arrived. There was a shade of +condescension and patronage in his treatment of Berg and Vera. After +Boris came a lady with the colonel, then the general himself, then the +Rostovs, and the party became unquestionably exactly like all other +evening parties. Berg and Vera could not repress their smiles of +satisfaction at the sight of all this movement in their drawing +room, at the sound of the disconnected talk, the rustling of +dresses, and the bowing and scraping. Everything was just as everybody +always has it, especially so the general, who admired the apartment, +patted Berg on the shoulder, and with parental authority superintended +the setting out of the table for boston. The general sat down by Count +Ilya Rostov, who was next to himself the most important guest. The old +people sat with the old, the young with the young, and the hostess +at the tea table, on which stood exactly the same kind of cakes in a +silver cake basket as the Panins had at their party. Everything was +just as it was everywhere else. + + + + + +CHAPTER XXI + + +Pierre, as one of the principal guests, had to sit down to boston +with Count Rostov, the general, and the colonel. At the card table +he happened to be directly facing Natasha, and was struck by a curious +change that had come over her since the ball. She was silent, and +not only less pretty than at the ball, but only redeemed from +plainness by her look of gentle indifference to everything around. + +"What's the matter with her?" thought Pierre, glancing at her. She +was sitting by her sister at the tea table, and reluctantly, without +looking at him, made some reply to Boris who sat down beside her. +After playing out a whole suit and to his partner's delight taking +five tricks, Pierre, hearing greetings and the steps of someone who +had entered the room while he was picking up his tricks, glanced again +at Natasha. + +"What has happened to her?" he asked himself with still greater +surprise. + +Prince Andrew was standing before her, saying something to her +with a look of tender solicitude. She, having raised her head, was +looking up at him, flushed and evidently trying to master her rapid +breathing. And the bright glow of some inner fire that had been +suppressed was again alight in her. She was completely transformed and +from a plain girl had again become what she had been at the ball. + +Prince Andrew went up to Pierre, and the latter noticed a new and +youthful expression in his friend's face. + +Pierre changed places several times during the game, sitting now +with his back to Natasha and now facing her, but during the whole of +the six rubbers he watched her and his friend. + +"Something very important is happening between them," thought +Pierre, and a feeling that was both joyful and painful agitated him +and made him neglect the game. + +After six rubbers the general got up, saying that it was no use +playing like that, and Pierre was released. Natasha on one side was +talking with Sonya and Boris, and Vera with a subtle smile was +saying something to Prince Andrew. Pierre went up to his friend and, +asking whether they were talking secrets, sat down beside them. +Vera, having noticed Prince Andrew's attentions to Natasha, decided +that at a party, a real evening party, subtle allusions to the +tender passion were absolutely necessary and, seizing a moment when +Prince Andrew was alone, began a conversation with him about +feelings in general and about her sister. With so intellectual a guest +as she considered Prince Andrew to be, she felt that she had to employ +her diplomatic tact. + +When Pierre went up to them he noticed that Vera was being carried +away by her self-satisfied talk, but that Prince Andrew seemed +embarrassed, a thing that rarely happened with him. + +"What do you think?" Vera was saying with an arch smile. "You are so +discerning, Prince, and understand people's characters so well at a +glance. What do you think of Natalie? Could she be constant in her +attachments? Could she, like other women" (Vera meant herself), +"love a man once for all and remain true to him forever? That is +what I consider true love. What do you think, Prince?" + +"I know your sister too little," replied Prince Andrew, with a +sarcastic smile under which he wished to hide his embarrassment, "to +be able to solve so delicate a question, and then I have noticed +that the less attractive a woman is the more constant she is likely to +be," he added, and looked up Pierre who was just approaching them. + +"Yes, that is true, Prince. In our days," continued Vera--mentioning +"our days" as people of limited intelligence are fond of doing, +imagining that they have discovered and appraised the peculiarities of +"our days" and that human characteristics change with the times--"in +our days a girl has so much freedom that the pleasure of being courted +often stifles real feeling in her. And it must be confessed that +Natalie is very susceptible." This return to the subject of Natalie +caused Prince Andrew to knit his brows with discomfort: he was about +to rise, but Vera continued with a still more subtle smile: + +"I think no one has been more courted than she," she went on, "but +till quite lately she never cared seriously for anyone. Now you +know, Count," she said to Pierre, "even our dear cousin Boris, who, +between ourselves, was very far gone in the land of tenderness..." +(alluding to a map of love much in vogue at that time). + +Prince Andrew frowned and remained silent. + +"You are friendly with Boris, aren't you?" asked Vera. + +"Yes, I know him..." + +"I expect he has told you of his childish love for Natasha?" + +"Oh, there was childish love?" suddenly asked Prince Andrew, +blushing unexpectedly. + +"Yes, you know between cousins intimacy often leads to love. Le +cousinage est un dangereux voisinage.* Don't you think so?" + + +*"Cousinhood is a dangerous neighborhood." + + +"Oh, undoubtedly!" said Prince Andrew, and with sudden and unnatural +liveliness he began chaffing Pierre about the need to be very +careful with his fifty-year-old Moscow cousins, and in the midst of +these jesting remarks he rose, taking Pierre by the arm, and drew +him aside. + +"Well?" asked Pierre, seeing his friend's strange animation with +surprise, and noticing the glance he turned on Natasha as he rose. + +"I must... I must have a talk with you," said Prince Andrew. "You +know that pair of women's gloves?" (He referred to the Masonic +gloves given to a newly initiated Brother to present to the woman he +loved.) "I... but no, I will talk to you later on," and with a strange +light in his eyes and restlessness in his movements, Prince Andrew +approached Natasha and sat down beside her. Pierre saw how Prince +Andrew asked her something and how she flushed as she replied. + +But at that moment Berg came to Pierre and began insisting that he +should take part in an argument between the general and the colonel on +the affairs in Spain. + +Berg was satisfied and happy. The smile of pleasure never left his +face. The party was very successful and quite like other parties he +had seen. Everything was similar: the ladies' subtle talk, the +cards, the general raising his voice at the card table, and the +samovar and the tea cakes; only one thing was lacking that he had +always seen at the evening parties he wished to imitate. They had +not yet had a loud conversation among the men and a dispute about +something important and clever. Now the general had begun such a +discussion and so Berg drew Pierre to it. + + + + + +CHAPTER XXII + + +Next day, having been invited by the count, Prince Andrew dined with +the Rostovs and spent the rest of the day there. + +Everyone in the house realized for whose sake Prince Andrew came, +and without concealing it he tried to be with Natasha all day. Not +only in the soul of the frightened yet happy and enraptured Natasha, +but in the whole house, there was a feeling of awe at something +important that was bound to happen. The countess looked with sad and +sternly serious eyes at Prince Andrew when he talked to Natasha and +timidly started some artificial conversation about trifles as soon +as he looked her way. Sonya was afraid to leave Natasha and afraid +of being in the way when she was with them. Natasha grew pale, in a +panic of expectation, when she remained alone with him for a moment. +Prince Andrew surprised her by his timidity. She felt that he wanted +to say something to her but could not bring himself to do so. + +In the evening, when Prince Andrew had left, the countess went up to +Natasha and whispered: "Well, what?" + +"Mamma! For heaven's sake don't ask me anything now! One can't +talk about that," said Natasha. + +But all the same that night Natasha, now agitated and now +frightened, lay a long time in her mother's bed gazing straight +before her. She told her how he had complimented her, how he told +her he was going abroad, asked her where they were going to spend +the summer, and then how he had asked her about Boris. + +"But such a... such a... never happened to me before!" she said. +"Only I feel afraid in his presence. I am always afraid when I'm +with him. What does that mean? Does it mean that it's the real +thing? Yes? Mamma, are you asleep?" + +"No, my love; I am frightened myself," answered her mother. "Now +go!" + +"All the same I shan't sleep. What silliness, to sleep! Mummy! +Mummy! such a thing never happened to me before," she said, +surprised and alarmed at the feeling she was aware of in herself. "And +could we ever have thought!..." + +It seemed to Natasha that even at the time she first saw Prince +Andrew at Otradnoe she had fallen in love with him. It was as if she +feared this strange, unexpected happiness of meeting again the very +man she had then chosen (she was firmly convinced she had done so) and +of finding him, as it seemed, not indifferent to her. + +"And it had to happen that he should come specially to Petersburg +while we are here. And it had to happen that we should meet at that +ball. It is fate. Clearly it is fate that everything led up to this! +Already then, directly I saw him I felt something peculiar." + +"What else did he say to you? What are those verses? Read them..." +said her mother, thoughtfully, referring to some verses Prince +Andrew had written in Natasha's album. + +"Mamma, one need not be ashamed of his being a widower?" + +"Don't, Natasha! Pray to God. 'Marriages are made in heaven,'" +said her mother. + +"Darling Mummy, how I love you! How happy I am!" cried Natasha, +shedding tears of joy and excitement and embracing her mother. + +At that very time Prince Andrew was sitting with Pierre and +telling him of his love for Natasha and his firm resolve to make her +his wife. + +That day Countess Helene had a reception at her house. The French +ambassador was there, and a foreign prince of the blood who had of +late become a frequent visitor of hers, and many brilliant ladies +and gentlemen. Pierre, who had come downstairs, walked through the +rooms and struck everyone by his preoccupied, absent-minded, and +morose air. + +Since the ball he had felt the approach of a fit of nervous +depression and had made desperate efforts to combat it. Since the +intimacy of his wife with the royal prince, Pierre had unexpectedly +been made a gentleman of the bedchamber, and from that time he had +begun to feel oppressed and ashamed in court society, and dark +thoughts of the vanity of all things human came to him oftener than +before. At the same time the feeling he had noticed between his +protegee Natasha and Prince Andrew accentuated his gloom by the +contrast between his own position and his friend's. He tried equally +to avoid thinking about his wife, and about Natasha and Prince Andrew; +and again everything seemed to him insignificant in comparison with +eternity; again the question: for what? presented itself; and he +forced himself to work day and night at Masonic labors, hoping to +drive away the evil spirit that threatened him. Toward midnight, after +he had left the countess' apartments, he was sitting upstairs in a +shabby dressing gown, copying out the original transaction of the +Scottish lodge of Freemasons at a table in his low room cloudy with +tobacco smoke, when someone came in. It was Prince Andrew. + +"Ah, it's you!" said Pierre with a preoccupied, dissatisfied air. +"And I, you see, am hard at it." He pointed to his manuscript book +with that air of escaping from the ills of life with which unhappy +people look at their work. + +Prince Andrew, with a beaming, ecstatic expression of renewed life +on his face, paused in front of Pierre and, not noticing his sad look, +smiled at him with the egotism of joy. + +"Well, dear heart," said he, "I wanted to tell you about it +yesterday and I have come to do so today. I never experienced anything +like it before. I am in love, my friend!" + +Suddenly Pierre heaved a deep sigh and dumped his heavy person +down on the sofa beside Prince Andrew. + +"With Natasha Rostova, yes?" said he. + +"Yes, yes! Who else should it be? I should never have believed it, +but the feeling is stronger than I. Yesterday I tormented myself and +suffered, but I would not exchange even that torment for anything in +the world, I have not lived till now. At last I live, but I can't live +without her! But can she love me?... I am too old for her.... Why +don't you speak?" + +"I? I? What did I tell you?" said Pierre suddenly, rising and +beginning to pace up and down the room. "I always thought it.... +That girl is such a treasure... she is a rare girl.... My dear friend, +I entreat you, don't philosophize, don't doubt, marry, marry, +marry.... And I am sure there will not be a happier man than you." + +"But what of her?" + +"She loves you." + +"Don't talk rubbish..." said Prince Andrew, smiling and looking into +Pierre's eyes. + +"She does, I know," Pierre cried fiercely. + +"But do listen," returned Prince Andrew, holding him by the arm. "Do +you know the condition I am in? I must talk about it to someone." + +"Well, go on, go on. I am very glad," said Pierre, and his face +really changed, his brow became smooth, and he listened gladly to +Prince Andrew. Prince Andrew seemed, and really was, quite a +different, quite a new man. Where was his spleen, his contempt for +life, his disillusionment? Pierre was the only person to whom he +made up his mind to speak openly; and to him he told all that was in +his soul. Now he boldly and lightly made plans for an extended future, +said he could not sacrifice his own happiness to his father's caprice, +and spoke of how he would either make his father consent to this +marriage and love her, or would do without his consent; then he +marveled at the feeling that had mastered him as at something strange, +apart from and independent of himself. + +"I should not have believed anyone who told me that I was capable of +such love," said Prince Andrew. "It is not at all the same feeling +that I knew in the past. The whole world is now for me divided into +two halves: one half is she, and there all is joy, hope, light: the +other half is everything where she is not, and there is all gloom +and darkness...." + +"Darkness and gloom," reiterated Pierre: "yes, yes, I understand +that." + +"I cannot help loving the light, it is not my fault. And I am very +happy! You understand me? I know you are glad for my sake." + +"Yes, yes," Pierre assented, looking at his friend with a touched +and sad expression in his eyes. The brighter Prince Andrew's lot +appeared to him, the gloomier seemed his own. + + + + + +CHAPTER XXIII + + +Prince Andrew needed his father's consent to his marriage, and to +obtain this he started for the country next day. + +His father received his son's communication with external composure, +but inward wrath. He could not comprehend how anyone could wish to +alter his life or introduce anything new into it, when his own life +was already ending. "If only they would let me end my days as I want +to," thought the old man, "then they might do as they please." With +his son, however, he employed the diplomacy he reserved for +important occasions and, adopting a quiet tone, discussed the whole +matter. + +In the first place the marriage was not a brilliant one as regards +birth, wealth, or rank. Secondly, Prince Andrew was no longer as young +as he had been and his health was poor (the old man laid special +stress on this), while she was very young. Thirdly, he had a son +whom it would be a pity to entrust to a chit of a girl. "Fourthly +and finally," the father said, looking ironically at his son, "I beg +you to put it off for a year: go abroad, take a cure, look out as +you wanted to for a German tutor for Prince Nicholas. Then if your +love or passion or obstinacy--as you please--is still as great, marry! +And that's my last word on it. Mind, the last..." concluded the +prince, in a tone which showed that nothing would make him alter his +decision. + +Prince Andrew saw clearly that the old man hoped that his +feelings, or his fiancee's, would not stand a year's test, or that +he (the old prince himself) would die before then, and he decided to +conform to his father's wish--to propose, and postpone the wedding for +a year. + +Three weeks after the last evening he had spent with the Rostovs, +Prince Andrew returned to Petersburg. + + +Next day after her talk with her mother Natasha expected Bolkonski +all day, but he did not come. On the second and third day it was the +same. Pierre did not come either and Natasha, not knowing that +Prince Andrew had gone to see his father, could not explain his +absence to herself. + +Three weeks passed in this way. Natasha had no desire to go out +anywhere and wandered from room to room like a shadow, idle and +listless; she wept secretly at night and did not go to her mother in +the evenings. She blushed continually and was irritable. It seemed +to her that everybody knew about her disappointment and was laughing +at her and pitying her. Strong as was her inward grief, this wound +to her vanity intensified her misery. + +Once she came to her mother, tried to say something, and suddenly +began to cry. Her tears were those of an offended child who does not +know why it is being punished. + +The countess began to soothe Natasha, who after first listening to +her mother's words, suddenly interrupted her: + +"Leave off, Mamma! I don't think, and don't want to think about +it! He just came and then left off, left off..." + +Her voice trembled, and she again nearly cried, but recovered and +went on quietly: + +"And I don't at all want to get married. And I am afraid of him; I +have now become quite calm, quite calm." + +The day after this conversation Natasha put on the old dress which +she knew had the peculiar property of conducing to cheerfulness in the +mornings, and that day she returned to the old way of life which she +had abandoned since the ball. Having finished her morning tea she went +to the ballroom, which she particularly liked for its loud +resonance, and began singing her solfeggio. When she had finished +her first exercise she stood still in the middle of the room and +sang a musical phrase that particularly pleased her. She listened +joyfully (as though she had not expected it) to the charm of the notes +reverberating, filling the whole empty ballroom, and slowly dying +away; and all at once she felt cheerful. "What's the good of making so +much of it? Things are nice as it is," she said to herself, and she +began walking up and down the room, not stepping simply on the +resounding parquet but treading with each step from the heel to the +toe (she had on a new and favorite pair of shoes) and listening to the +regular tap of the heel and creak of the toe as gladly as she had to +the sounds of her own voice. Passing a mirror she glanced into it. +"There, that's me!" the expression of her face seemed to say as she +caught sight of herself. "Well, and very nice too! I need nobody." + +A footman wanted to come in to clear away something in the room +but she would not let him, and having closed the door behind him +continued her walk. That morning she had returned to her favorite +mood--love of, and delight in, herself. "How charming that Natasha +is!" she said again, speaking as some third, collective, male +person. "Pretty, a good voice, young, and in nobody's way if only they +leave her in peace." But however much they left her in peace she could +not now be at peace, and immediately felt this. + +In the hall the porch door opened, and someone asked, "At home?" and +then footsteps were heard. Natasha was looking at the mirror, but +did not see herself. She listened to the sounds in the hall. When +she saw herself, her face was pale. It was he. She knew this for +certain, though she hardly heard his voice through the closed doors. + +Pale and agitated, Natasha ran into the drawing room. + +"Mamma! Bolkonski has come!" she said. "Mamma, it is awful, it is +unbearable! I don't want... to be tormented? What am I to do?..." + +Before the countess could answer, Prince Andrew entered the room +with an agitated and serious face. As soon as he saw Natasha his +face brightened. He kissed the countess' hand and Natasha's, and sat +down beside the sofa. + +"It is long since we had the pleasure..." began the countess, but +Prince Andrew interrupted her by answering her intended question, +obviously in haste to say what he had to. + +"I have not been to see all this time because I have been at my +father's. I had to talk over a very important matter with him. I +only got back last night," he said glancing at Natasha; "I want to +have a talk with you, Countess," he added after a moment's pause. + +The countess lowered her eyes, sighing deeply. + +"I am at your disposal," she murmured. + +Natasha knew that she ought to go away, but was unable to do so: +something gripped her throat, and regardless of manners she stared +straight at Prince Andrew with wide-open eyes. + +"At once? This instant!... No, it can't be!" she thought. + +Again he glanced at her, and that glance convinced her that she +was not mistaken. Yes, at once, that very instant, her fate would be +decided. + +"Go, Natasha! I will call you," said the countess in a whisper. + +Natasha glanced with frightened imploring eyes at Prince Andrew +and at her mother and went out. + +"I have come, Countess, to ask for your daughter's hand," said +Prince Andrew. + +The countess' face flushed hotly, but she said nothing. + +"Your offer..." she began at last sedately. He remained silent, +looking into her eyes. "Your offer..." (she grew confused) "is +agreeable to us, and I accept your offer. I am glad. And my husband... +I hope... but it will depend on her...." + +"I will speak to her when I have your consent.... Do you give it +to me?" said Prince Andrew. + +"Yes," replied the countess. She held out her hand to him, and +with a mixed feeling of estrangement and tenderness pressed her lips +to his forehead as he stooped to kiss her hand. She wished to love him +as a son, but felt that to her he was a stranger and a terrifying man. +"I am sure my husband will consent," said the countess, "but your +father..." + +"My father, to whom I have told my plans, has made it an express +condition of his consent that the wedding is not to take place for a +year. And I wished to tell you of that," said Prince Andrew. + +"It is true that Natasha is still young, but--so long as that?..." + +"It is unavoidable," said Prince Andrew with a sigh. + +"I will send her to you," said the countess, and left the room. + +"Lord have mercy upon us!" she repeated while seeking her daughter. + +Sonya said that Natasha was in her bedroom. Natasha was sitting on +the bed, pale and dry eyed, and was gazing at the icons and whispering +something as she rapidly crossed herself. Seeing her mother she jumped +up and flew to her. + +"Well, Mamma?... Well?..." + +"Go, go to him. He is asking for your hand," said the countess, +coldly it seemed to Natasha. "Go... go," said the mother, sadly and +reproachfully, with a deep sigh, as her daughter ran away. + +Natasha never remembered how she entered the drawing room. When +she came in and saw him she paused. "Is it possible that this stranger +has now become everything to me?" she asked herself, and immediately +answered, "Yes, everything! He alone is now dearer to me than +everything in the world." Prince Andrew came up to her with downcast +eyes. + +"I have loved you from the very first moment I saw you. May I hope?" + +He looked at her and was struck by the serious impassioned +expression of her face. Her face said: "Why ask? Why doubt what you +cannot but know? Why speak, when words cannot express what one feels?" + +She drew near to him and stopped. He took her hand and kissed it. + +"Do you love me?" + +"Yes, yes!" Natasha murmured as if in vexation. Then she sighed +loudly and, catching her breath more and more quickly, began to sob. + +"What is it? What's the matter?" + +"Oh, I am so happy!" she replied, smiled through her tears, bent +over closer to him, paused for an instant as if asking herself whether +she might, and then kissed him. + +Prince Andrew held her hands, looked into her eyes, and did not find +in his heart his former love for her. Something in him had suddenly +changed; there was no longer the former poetic and mystic charm of +desire, but there was pity for her feminine and childish weakness, +fear at her devotion and trustfulness, and an oppressive yet joyful +sense of the duty that now bound him to her forever. The present +feeling, though not so bright and poetic as the former, was stronger +and more serious. + +"Did your mother tell you that it cannot be for a year?" asked +Prince Andrew, still looking into her eyes. + +"Is it possible that I--the 'chit of a girl,' as everybody called +me," thought Natasha--"is it possible that I am now to be the wife and +the equal of this strange, dear, clever man whom even my father +looks up to? Can it be true? Can it be true that there can be no +more playing with life, that now I am grown up, that on me now lies +a responsibility for my every word and deed? Yes, but what did he +ask me?" + +"No," she replied, but she had not understood his question. + +"Forgive me!" he said. "But you are so young, and I have already +been through so much in life. I am afraid for you, you do not yet know +yourself." + +Natasha listened with concentrated attention, trying but failing +to take in the meaning of his words. + +"Hard as this year which delays my happiness will be," continued +Prince Andrew, "it will give you time to be sure of yourself. I ask +you to make me happy in a year, but you are free: our engagement shall +remain a secret, and should you find that you do not love me, or +should you come to love..." said Prince Andrew with an unnatural +smile. + +"Why do you say that?" Natasha interrupted him. "You know that +from the very day you first came to Otradnoe I have loved you," she +cried, quite convinced that she spoke the truth. + +"In a year you will learn to know yourself...." + +"A whole year!" Natasha repeated suddenly, only now realizing that +the marriage was to be postponed for a year. "But why a year? Why a +year?..." + +Prince Andrew began to explain to her the reasons for this delay. +Natasha did not hear him. + +"And can't it be helped?" she asked. Prince Andrew did not reply, +but his face expressed the impossibility of altering that decision. + +"It's awful! Oh, it's awful! awful!" Natasha suddenly cried, and +again burst into sobs. "I shall die, waiting a year: it's +impossible, it's awful!" She looked into her lover's face and saw in +it a look of commiseration and perplexity. + +"No, no! I'll do anything!" she said, suddenly checking her tears. +"I am so happy." + +The father and mother came into the room and gave the betrothed +couple their blessing. + +From that day Prince Andrew began to frequent the Rostovs' as +Natasha's affianced lover. + + + + + +CHAPTER XXIV + +No betrothal ceremony took place and Natasha's engagement to +Bolkonski was not announced; Prince Andrew insisted on that. He said +that as he was responsible for the delay he ought to bear the whole +burden of it; that he had given his word and bound himself forever, +but that he did not wish to bind Natasha and gave her perfect freedom. +If after six months she felt that she did not love him she would +have full right to reject him. Naturally neither Natasha nor her +parents wished to hear of this, but Prince Andrew was firm. He came +every day to the Rostovs', but did not behave to Natasha as an +affianced lover: he did not use the familiar thou, but said you to +her, and kissed only her hand. After their engagement, quite +different, intimate, and natural relations sprang up between them. +It was as if they had not known each other till now. Both liked to +recall how they had regarded each other when as yet they were +nothing to one another; they felt themselves now quite different +beings: then they were artificial, now natural and sincere. At first +the family felt some constraint in intercourse with Prince Andrew; +he seemed a man from another world, and for a long time Natasha +trained the family to get used to him, proudly assuring them all +that he only appeared to be different, but was really just like all of +them, and that she was not afraid of him and no one else ought to +be. After a few days they grew accustomed to him, and without +restraint in his presence pursued their usual way of life, in which he +took his part. He could talk about rural economy with the count, +fashions with the countess and Natasha, and about albums and fancywork +with Sonya. Sometimes the household both among themselves and in his +presence expressed their wonder at how it had all happened, and at the +evident omens there had been of it: Prince Andrew's coming to Otradnoe +and their coming to Petersburg, and the likeness between Natasha and +Prince Andrew which her nurse had noticed on his first visit, and +Andrew's encounter with Nicholas in 1805, and many other incidents +betokening that it had to be. + +In the house that poetic dullness and quiet reigned which always +accompanies the presence of a betrothed couple. Often when all sitting +together everyone kept silent. Sometimes the others would get up and +go away and the couple, left alone, still remained silent. They rarely +spoke of their future life. Prince Andrew was afraid and ashamed to +speak of it. Natasha shared this as she did all his feelings, which +she constantly divined. Once she began questioning him about his +son. Prince Andrew blushed, as he often did now--Natasha +particularly liked it in him--and said that his son would not live +with them. + +"Why not?" asked Natasha in a frightened tone. + +"I cannot take him away from his grandfather, and besides..." + +"How I should have loved him!" said Natasha, immediately guessing +his thought; "but I know you wish to avoid any pretext for finding +fault with us." + +Sometimes the old count would come up, kiss Prince Andrew, and ask +his advice about Petya's education or Nicholas' service. The old +countess sighed as she looked at them; Sonya was always getting +frightened lest she should be in the way and tried to find excuses for +leaving them alone, even when they did not wish it. When Prince Andrew +spoke (he could tell a story very well), Natasha listened to him +with pride; when she spoke she noticed with fear and joy that he gazed +attentively and scrutinizingly at her. She asked herself in +perplexity: "What does he look for in me? He is trying to discover +something by looking at me! What if what he seeks in me is not there?" +Sometimes she fell into one of the mad, merry moods characteristic +of her, and then she particularly loved to hear and see how Prince +Andrew laughed. He seldom laughed, but when he did he abandoned +himself entirely to his laughter, and after such a laugh she always +felt nearer to him. Natasha would have been completely happy if the +thought of the separation awaiting her and drawing near had not +terrified her, just as the mere thought of it made him turn pale and +cold. + +On the eve of his departure from Petersburg Prince Andrew brought +with him Pierre, who had not been to the Rostovs' once since the ball. +Pierre seemed disconcerted and embarrassed. He was talking to the +countess, and Natasha sat down beside a little chess table with Sonya, +thereby inviting Prince Andrew to come too. He did so. + +"You have known Bezukhov a long time?" he asked. "Do you like him?" + +"Yes, he's a dear, but very absurd." + +And as usual when speaking of Pierre, she began to tell anecdotes of +his absent-mindedness, some of which had even been invented about him. + +"Do you know I have entrusted him with our secret? I have known +him from childhood. He has a heart of gold. I beg you, Natalie," +Prince Andrew said with sudden seriousness--"I am going away and +heaven knows what may happen. You may cease to... all right, I know +I am not to say that. Only this, then: whatever may happen to you when +I am not here..." + +"What can happen?" + +"Whatever trouble may come," Prince Andrew continued, "I beg you, +Mademoiselle Sophie, whatever may happen, to turn to him alone for +advice and help! He is a most absent-minded and absurd fellow, but +he has a heart of gold." + +Neither her father, nor her mother, nor Sonya, nor Prince Andrew +himself could have foreseen how the separation from her lover would +act on Natasha. Flushed and agitated she went about the house all that +day, dry-eyed, occupied with most trivial matters as if not +understanding what awaited her. She did not even cry when, on taking +leave, he kissed her hand for the last time. "Don't go!" she said in a +tone that made him wonder whether he really ought not to stay and +which he remembered long afterwards. Nor did she cry when he was gone; +but for several days she sat in her room dry-eyed, taking no +interest in anything and only saying now and then, "Oh, why did he +go away?" + +But a fortnight after his departure, to the surprise of those around +her, she recovered from her mental sickness just as suddenly and +became her old self again, but with a change in her moral physiognomy, +as a child gets up after a long illness with a changed expression of +face. + + + + + +CHAPTER XXV + + +During that year after his son's departure, Prince Nicholas +Bolkonski's health and temper became much worse. He grew still more +irritable, and it was Princess Mary who generally bore the brunt of +his frequent fits of unprovoked anger. He seemed carefully to seek out +her tender spots so as to torture her mentally as harshly as possible. +Princess Mary had two passions and consequently two joys--her +nephew, little Nicholas, and religion--and these were the favorite +subjects of the prince's attacks and ridicule. Whatever was spoken +of he would bring round to the superstitiousness of old maids, or +the petting and spoiling of children. "You want to make him"--little +Nicholas--"into an old maid like yourself! A pity! Prince Andrew wants +a son and not an old maid," he would say. Or, turning to +Mademoiselle Bourienne, he would ask her in Princess Mary's presence +how she liked our village priests and icons and would joke about them. + +He continually hurt Princess Mary's feelings and tormented her, +but it cost her no effort to forgive him. Could he be to blame +toward her, or could her father, whom she knew loved her in spite of +it all, be unjust? And what is justice? The princess never thought +of that proud word "justice." All the complex laws of man centered for +her in one clear and simple law--the law of love and self-sacrifice +taught us by Him who lovingly suffered for mankind though He Himself +was God. What had she to do with the justice or injustice of other +people? She had to endure and love, and that she did. + +During the winter Prince Andrew had come to Bald Hills and had +been gay, gentle, and more affectionate than Princess Mary had known +him for a long time past. She felt that something had happened to him, +but he said nothing to her about his love. Before he left he had a +long talk with his father about something, and Princess Mary noticed +that before his departure they were dissatisfied with one another. + +Soon after Prince Andrew had gone, Princess Mary wrote to her friend +Julie Karagina in Petersburg, whom she had dreamed (as all girls +dream) of marrying to her brother, and who was at that time in +mourning for her own brother, killed in Turkey. + + +Sorrow, it seems, is our common lot, my dear, tender friend Julie. + +Your loss is so terrible that I can only explain it to myself as a +special providence of God who, loving you, wishes to try you and +your excellent mother. Oh, my friend! Religion, and religion alone, +can--I will not say comfort us--but save us from despair. Religion +alone can explain to us what without its help man cannot comprehend: +why, for what cause, kind and noble beings able to find happiness in +life--not merely harming no one but necessary to the happiness of +others--are called away to God, while cruel, useless, harmful persons, +or such as are a burden to themselves and to others, are left +living. The first death I saw, and one I shall never forget--that of +my dear sister-in-law--left that impression on me. Just as you ask +destiny why your splendid brother had to die, so I asked why that +angel Lise, who not only never wronged anyone, but in whose soul there +were never any unkind thoughts, had to die. And what do you think, +dear friend? Five years have passed since then, and already I, with my +petty understanding, begin to see clearly why she had to die, and in +what way that death was but an expression of the infinite goodness +of the Creator, whose every action, though generally +incomprehensible to us, is but a manifestation of His infinite love +for His creatures. Perhaps, I often think, she was too angelically +innocent to have the strength to perform all a mother's duties. As a +young wife she was irreproachable; perhaps she could not have been +so as a mother. As it is, not only has she left us, and particularly +Prince Andrew, with the purest regrets and memories, but probably +she will there receive a place I dare not hope for myself. But not +to speak of her alone, that early and terrible death has had the +most beneficent influence on me and on my brother in spite of all +our grief. Then, at the moment of our loss, these thoughts could not +occur to me; I should then have dismissed them with horror, but now +they are very clear and certain. I write all this to you, dear friend, +only to convince you of the Gospel truth which has become for me a +principle of life: not a single hair of our heads will fall without +His will. And His will is governed only by infinite love for us, and +so whatever befalls us is for our good. + +You ask whether we shall spend next winter in Moscow. In spite of my +wish to see you, I do not think so and do not want to do so. You +will be surprised to hear that the reason for this is Buonaparte! +The case is this: my father's health is growing noticeably worse, he +cannot stand any contradiction and is becoming irritable. This +irritability is, as you know, chiefly directed to political questions. +He cannot endure the notion that Buonaparte is negotiating on equal +terms with all the sovereigns of Europe and particularly with our own, +the grandson of the Great Catherine! As you know, I am quite +indifferent to politics, but from my father's remarks and his talks +with Michael Ivanovich I know all that goes on in the world and +especially about the honors conferred on Buonaparte, who only at +Bald Hills in the whole world, it seems, is not accepted as a great +man, still less as Emperor of France. And my father cannot stand this. +It seems to me that it is chiefly because of his political views +that my father is reluctant to speak of going to Moscow; for he +foresees the encounters that would result from his way of expressing +his views regardless of anybody. All the benefit he might derive +from a course of treatment he would lose as a result of the disputes +about Buonaparte which would be inevitable. In any case it will be +decided very shortly. + +Our family life goes on in the old way except for my brother +Andrew's absence. He, as I wrote you before, has changed very much +of late. After his sorrow he only this year quite recovered his +spirits. He has again become as I used to know him when a child: kind, +affectionate, with that heart of gold to which I know no equal. He has +realized, it seems to me, that life is not over for him. But +together with this mental change he has grown physically much +weaker. He has become thinner and more nervous. I am anxious about him +and glad he is taking this trip abroad which the doctors recommended +long ago. I hope it will cure him. You write that in Petersburg he +is spoken of as one of the most active, cultivated, and capable of the +young men. Forgive my vanity as a relation, but I never doubted it. +The good he has done to everybody here, from his peasants up to the +gentry, is incalculable. On his arrival in Petersburg he received only +his due. I always wonder at the way rumors fly from Petersburg to +Moscow, especially such false ones as that you write about--I mean the +report of my brother's betrothal to the little Rostova. I do not think +my brother will ever marry again, and certainly not her; and this is +why: first, I know that though he rarely speaks about the wife he +has lost, the grief of that loss has gone too deep in his heart for +him ever to decide to give her a successor and our little angel a +stepmother. Secondly because, as far as I know, that girl is not the +kind of girl who could please Prince Andrew. I do not think he would +choose her for a wife, and frankly I do not wish it. But I am +running on too long and am at the end of my second sheet. Good-by, +my dear friend. May God keep you in His holy and mighty care. My +dear friend, Mademoiselle Bourienne, sends you kisses. + +MARY + + + + + +CHAPTER XXVI + + +In the middle of the summer Princess Mary received an unexpected +letter from Prince Andrew in Switzerland in which he gave her +strange and surprising news. He informed her of his engagement to +Natasha Rostova. The whole letter breathed loving rapture for his +betrothed and tender and confiding affection for his sister. He +wrote that he had never loved as he did now and that only now did he +understand and know what life was. He asked his sister to forgive +him for not having told her of his resolve when he had last visited +Bald Hills, though he had spoken of it to his father. He had not +done so for fear Princess Mary should ask her father to give his +consent, irritating him and having to bear the brunt of his +displeasure without attaining her object. "Besides," he wrote, "the +matter was not then so definitely settled as it is now. My father then +insisted on a delay of a year and now already six months, half of that +period, have passed, and my resolution is firmer than ever. If the +doctors did not keep me here at the spas I should be back in Russia, +but as it is I have to postpone my return for three months. You know +me and my relations with Father. I want nothing from him. I have +been and always shall be independent; but to go against his will and +arouse his anger, now that he may perhaps remain with us such a +short time, would destroy half my happiness. I am now writing to him +about the same question, and beg you to choose a good moment to hand +him the letter and to let me know how he looks at the whole matter and +whether there is hope that he may consent to reduce the term by four +months." + +After long hesitations, doubts, and prayers, Princess Mary gave +the letter to her father. The next day the old prince said to her +quietly: + +"Write and tell your brother to wait till I am dead.... It won't +be long--I shall soon set him free." + +The princess was about to reply, but her father would not let her +speak and, raising his voice more and more, cried: + +"Marry, marry, my boy!... A good family!... Clever people, eh? Rich, +eh? Yes, a nice stepmother little Nicholas will have! Write and tell +him that he may marry tomorrow if he likes. She will be little +Nicholas' stepmother and I'll marry Bourienne!... Ha, ha, ha! He +mustn't be without a stepmother either! Only one thing, no more +women are wanted in my house--let him marry and live by himself. +Perhaps you will go and live with him too?" he added, turning to +Princess Mary. "Go in heavens name! Go out into the frost... the +frost... the frost! + +After this outburst the prince did not speak any more about the +matter. But repressed vexation at his son's poor-spirited behavior +found expression in his treatment of his daughter. To his former +pretexts for irony a fresh one was now added--allusions to stepmothers +and amiabilities to Mademoiselle Bourienne. + +"Why shouldn't I marry her?" he asked his daughter. "She'll make a +splendid princess!" + +And latterly, to her surprise and bewilderment, Princess Mary +noticed that her father was really associating more and more with +the Frenchwoman. She wrote to Prince Andrew about the reception of his +letter, but comforted him with hopes of reconciling their father to +the idea. + +Little Nicholas and his education, her brother Andrew, and +religion were Princess Mary's joys and consolations; but besides that, +since everyone must have personal hopes, Princess Mary in the +profoundest depths of her heart had a hidden dream and hope that +supplied the chief consolation of her life. This comforting dream +and hope were given her by God's folk--the half-witted and other +pilgrims who visited her without the prince's knowledge. The longer +she lived, the more experience and observation she had of life, the +greater was her wonder at the short-sightedness of men who seek +enjoyment and happiness here on earth: toiling, suffering, struggling, +and harming one another, to obtain that impossible, visionary, +sinful happiness. Prince Andrew had loved his wife, she died, but that +was not enough: he wanted to bind his happiness to another woman. +Her father objected to this because he wanted a more distinguished and +wealthier match for Andrew. And they all struggled and suffered and +tormented one another and injured their souls, their eternal souls, +for the attainment of benefits which endure but for an instant. Not +only do we know this ourselves, but Christ, the Son of God, came +down to earth and told us that this life is but for a moment and is +a probation; yet we cling to it and think to find happiness in it. +"How is it that no one realizes this?" thought Princess Mary. "No +one except these despised God's folk who, wallet on back, come to me +by the back door, afraid of being seen by the prince, not for fear +of ill-usage by him but for fear of causing him to sin. To leave +family, home, and all the cares of worldly welfare, in order without +clinging to anything to wander in hempen rags from place to place +under an assumed name, doing no one any harm but praying for all- +for those who drive one away as well as for those who protect one: +higher than that life and truth there is no life or truth!" + +There was one pilgrim, a quiet pockmarked little woman of fifty +called Theodosia, who for over thirty years had gone about barefoot +and worn heavy chains. Princess Mary was particularly fond of her. +Once, when in a room with a lamp dimly lit before the icon Theodosia +was talking of her life, the thought that Theodosia alone had found +the true path of life suddenly came to Princess Mary with such force +that she resolved to become a pilgrim herself. When Theodosia had gone +to sleep Princess Mary thought about this for a long time, and at last +made up her mind that, strange as it might seem, she must go on a +pilgrimage. She disclosed this thought to no one but to her confessor, +Father Akinfi, the monk, and he approved of her intention. Under guise +of a present for the pilgrims, Princess Mary prepared a pilgrim's +complete costume for herself: a coarse smock, bast shoes, a rough +coat, and a black kerchief. Often, approaching the chest of drawers +containing this secret treasure, Princess Mary paused, uncertain +whether the time had not already come to put her project into +execution. + +Often, listening to the pilgrims' tales, she was so stimulated by +their simple speech, mechanical to them but to her so full of deep +meaning, that several times she was on the point of abandoning +everything and running away from home. In imagination she already +pictured herself by Theodosia's side, dressed in coarse rags, +walking with a staff, a wallet on her back, along the dusty road, +directing her wanderings from one saint's shrine to another, free from +envy, earthly love, or desire, and reaching at last the place where +there is no more sorrow or sighing, but eternal joy and bliss. + +"I shall come to a place and pray there, and before having time to +get used to it or getting to love it, I shall go farther. I will go on +till my legs fail, and I'll lie down and die somewhere, and shall at +last reach that eternal, quiet haven, where there is neither sorrow +nor sighing..." thought Princess Mary. + +But afterwards, when she saw her father and especially little Koko +(Nicholas), her resolve weakened. She wept quietly, and felt that +she was a sinner who loved her father and little nephew more than God. + + + + + +BOOK SEVEN: 1810 --11 + + + + + +CHAPTER I + + +The Bible legend tells us that the absence of labor--idleness--was a +condition of the first man's blessedness before the Fall. Fallen man +has retained a love of idleness, but the curse weighs on the race +not only because we have to seek our bread in the sweat of our +brows, but because our moral nature is such that we cannot be both +idle and at ease. An inner voice tells us we are in the wrong if we +are idle. If man could find a state in which he felt that though +idle he was fulfilling his duty, he would have found one of the +conditions of man's primitive blessedness. And such a state of +obligatory and irreproachable idleness is the lot of a whole class- +the military. The chief attraction of military service has consisted +and will consist in this compulsory and irreproachable idleness. + +Nicholas Rostov experienced this blissful condition to the full +when, after 1807, he continued to serve in the Pavlograd regiment, +in which he already commanded the squadron he had taken over from +Denisov. + +Rostov had become a bluff, good-natured fellow, whom his Moscow +acquaintances would have considered rather bad form, but who was liked +and respected by his comrades, subordinates, and superiors, and was +well contented with his life. Of late, in 1809, he found in letters +from home more frequent complaints from his mother that their +affairs were falling into greater and greater disorder, and that it +was time for him to come back to gladden and comfort his old parents. + +Reading these letters, Nicholas felt a dread of their wanting to +take him away from surroundings in which, protected from all the +entanglements of life, he was living so calmly and quietly. He felt +that sooner or later he would have to re-enter that whirlpool of life, +with its embarrassments and affairs to be straightened out, its +accounts with stewards, quarrels, and intrigues, its ties, society, +and with Sonya's love and his promise to her. It was all dreadfully +difficult and complicated; and he replied to his mother in cold, +formal letters in French, beginning: "My dear Mamma," and ending: +"Your obedient son," which said nothing of when he would return. In +1810 he received letters from his parents, in which they told him of +Natasha's engagement to Bolkonski, and that the wedding would be in +a year's time because the old prince made difficulties. This letter +grieved and mortified Nicholas. In the first place he was sorry that +Natasha, for whom he cared more than for anyone else in the family, +should be lost to the home; and secondly, from his hussar point of +view, he regretted not to have been there to show that fellow +Bolkonski that connection with him was no such great honor after +all, and that if he loved Natasha he might dispense with permission +from his dotard father. For a moment he hesitated whether he should +not apply for leave in order to see Natasha before she was married, +but then came the maneuvers, and considerations about Sonya and +about the confusion of their affairs, and Nicholas again put it off. +But in the spring of that year, he received a letter from his +mother, written without his father's knowledge, and that letter +persuaded him to return. She wrote that if he did not come and take +matters in hand, their whole property would be sold by auction and +they would all have to go begging. The count was so weak, and +trusted Mitenka so much, and was so good-natured, that everybody +took advantage of him and things were going from bad to worse. "For +God's sake, I implore you, come at once if you do not wish to make +me and the whole family wretched," wrote the countess. + +This letter touched Nicholas. He had that common sense of a +matter-of-fact man which showed him what he ought to do. + +The right thing now was, if not to retire from the service, at any +rate to go home on leave. Why he had to go he did not know; but +after his after-dinner nap he gave orders to saddle Mars, an extremely +vicious gray stallion that had not been ridden for a long time, and +when he returned with the horse all in a lather, he informed Lavrushka +(Denisov's servant who had remained with him) and his comrades who +turned up in the evening that he was applying for leave and was +going home. Difficult and strange as it was for him to reflect that he +would go away without having heard from the staff--and this interested +him extremely--whether he was promoted to a captaincy or would receive +the Order of St. Anne for the last maneuvers; strange as it was to +think that he would go away without having sold his three roans to the +Polish Count Golukhovski, who was bargaining for the horses Rostov had +betted he would sell for two thousand rubles; incomprehensible as it +seemed that the ball the hussars were giving in honor of the Polish +Mademoiselle Przazdziecka (out of rivalry to the Uhlans who had +given one in honor of their Polish Mademoiselle Borzozowska) would +take place without him--he knew he must go away from this good, bright +world to somewhere where everything was stupid and confused. A week +later he obtained his leave. His hussar comrades--not only those of +his own regiment, but the whole brigade--gave Rostov a dinner to which +the subscription was fifteen rubles a head, and at which there were +two bands and two choirs of singers. Rostov danced the Trepak with +Major Basov; the tipsy officers tossed, embraced, and dropped +Rostov; the soldiers of the third squadron tossed him too, and shouted +"hurrah!" and then they put him in his sleigh and escorted him as +far as the first post station. + +During the first half of the journey--from Kremenchug to Kiev--all +Rostov's thoughts, as is usual in such cases, were behind him, with +the squadron; but when he had gone more than halfway he began to +forget his three roans and Dozhoyveyko, his quartermaster, and to +wonder anxiously how things would be at Otradnoe and what he would +find there. Thoughts of home grew stronger the nearer he approached +it--far stronger, as though this feeling of his was subject to the law +by which the force of attraction is in inverse proportion to the +square of the distance. At the last post station before Otradnoe he +gave the driver a three-ruble tip, and on arriving he ran +breathlessly, like a boy, up the steps of his home. + +After the rapture of meeting, and after that odd feeling of +unsatisfied expectation--the feeling that "everything is just the +same, so why did I hurry?"--Nicholas began to settle down in his old +home world. His father and mother were much the same, only a little +older. What was new in them was a certain uneasiness and occasional +discord, which there used not to be, and which, as Nicholas soon found +out, was due to the bad state of their affairs. Sonya was nearly +twenty; she had stopped growing prettier and promised nothing more +than she was already, but that was enough. She exhaled happiness and +love from the time Nicholas returned, and the faithful, unalterable +love of this girl had a gladdening effect on him. Petya and Natasha +surprised Nicholas most. Petya was a big handsome boy of thirteen, +merry, witty, and mischievous, with a voice that was already breaking. +As for Natasha, for a long while Nicholas wondered and laughed +whenever he looked at her. + +"You're not the same at all," he said. + +"How? Am I uglier?" + +"On the contrary, but what dignity? A princess!" he whispered to +her. + +"Yes, yes, yes!" cried Natasha, joyfully. + +She told him about her romance with Prince Andrew and of his visit +to Otradnoe and showed him his last letter. + +"Well, are you glad?" Natasha asked. "I am so tranquil and happy +now." + +"Very glad," answered Nicholas. "He is an excellent fellow.... And +are you very much in love?" + +"How shall I put it?" replied Natasha. "I was in love with Boris, +with my teacher, and with Denisov, but this is quite different. I feel +at peace and settled. I know that no better man than he exists, and +I am calm and contented now. Not at all as before." + +Nicholas expressed his disapproval of the postponement of the +marriage for a year; but Natasha attacked her brother with +exasperation, proving to him that it could not be otherwise, and +that it would be a bad thing to enter a family against the father's +will, and that she herself wished it so. + +"You don't at all understand," she said. + +Nicholas was silent and agreed with her. + +Her brother often wondered as he looked at her. She did not seem +at all like a girl in love and parted from her affianced husband. +She was even-tempered and calm and quite as cheerful as of old. This +amazed Nicholas and even made him regard Bolkonski's courtship +skeptically. He could not believe that her fate was sealed, especially +as he had not seen her with Prince Andrew. It always seemed to him +that there was something not quite right about this intended marriage. + +"Why this delay? Why no betrothal?" he thought. Once, when he had +touched on this topic with his mother, he discovered, to his +surprise and somewhat to his satisfaction, that in the depth of her +soul she too had doubts about this marriage. + +"You see he writes," said she, showing her son a letter of Prince +Andrew's, with that latent grudge a mother always has in regard to a +daughter's future married happiness, "he writes that he won't come +before December. What can be keeping him? Illness, probably! His +health is very delicate. Don't tell Natasha. And don't attach +importance to her being so bright: that's because she's living through +the last days of her girlhood, but I know what she is like every +time we receive a letter from him! However, God grant that +everything turns out well!" (She always ended with these words.) "He +is an excellent man!" + + + + + +CHAPTER II + + +After reaching home Nicholas was at first serious and even dull. +He was worried by the impending necessity of interfering in the stupid +business matters for which his mother had called him home. To throw +off this burden as quickly as possible, on the third day after his +arrival he went, angry and scowling and without answering questions as +to where he was going, to Mitenka's lodge and demanded an account of +everything. But what an account of everything might be Nicholas knew +even less than the frightened and bewildered Mitenka. The conversation +and the examination of the accounts with Mitenka did not last long. +The village elder, a peasant delegate, and the village clerk, who were +waiting in the passage, heard with fear and delight first the young +count's voice roaring and snapping and rising louder and louder, and +then words of abuse, dreadful words, ejaculated one after the other. + +"Robber!... Ungrateful wretch!... I'll hack the dog to pieces! I'm +not my father!... Robbing us!..." and so on. + +Then with no less fear and delight they saw how the young count, red +in the face and with bloodshot eyes, dragged Mitenka out by the scruff +of the neck and applied his foot and knee to his behind with great +agility at convenient moments between the words, shouting, "Be off! +Never let me see your face here again, you villain!" + +Mitenka flew headlong down the six steps and ran away into the +shrubbery. (This shrubbery was a well-known haven of refuge for +culprits at Otradnoe. Mitenka himself, returning tipsy from the +town, used to hide there, and many of the residents at Otradnoe, +hiding from Mitenka, knew of its protective qualities.) + +Mitenka's wife and sisters-in-law thrust their heads and +frightened faces out of the door of a room where a bright samovar +was boiling and where the steward's high bedstead stood with its +patchwork quilt. + +The young count paid no heed to them, but, breathing hard, passed by +with resolute strides and went into the house. + +The countess, who heard at once from the maids what had happened +at the lodge, was calmed by the thought that now their affairs would +certainly improve, but on the other hand felt anxious as to the effect +this excitement might have on her son. She went several times to his +door on tiptoe and listened, as he lighted one pipe after another. + +Next day the old count called his son aside and, with an embarrassed +smile, said to him: + +"But you know, my dear boy, it's a pity you got excited! Mitenka has +told me all about it." + +"I knew," thought Nicholas, "that I should never understand anything +in this crazy world." + +"You were angry that he had not entered those 700 rubles. But they +were carried forward--and you did not look at the other page." + +"Papa, he is a blackguard and a thief! I know he is! And what I have +done, I have done; but, if you like, I won't speak to him again." + +"No, my dear boy" (the count, too, felt embarrassed. He knew he +had mismanaged his wife's property and was to blame toward his +children, but he did not know how to remedy it). "No, I beg you to +attend to the business. I am old. I..." + +"No, Papa. Forgive me if I have caused you unpleasantness. I +understand it all less than you do." + +"Devil take all these peasants, and money matters, and carryings +forward from page to page," he thought. "I used to understand what a +'corner' and the stakes at cards meant, but carrying forward to +another page I don't understand at all," said he to himself, and after +that he did not meddle in business affairs. But once the countess +called her son and informed him that she had a promissory note from +Anna Mikhaylovna for two thousand rubles, and asked him what he +thought of doing with it. + +"This," answered Nicholas. "You say it rests with me. Well, I +don't like Anna Mikhaylovna and I don't like Boris, but they were +our friends and poor. Well then, this!" and he tore up the note, and +by so doing caused the old countess to weep tears of joy. After +that, young Rostov took no further part in any business affairs, but +devoted himself with passionate enthusiasm to what was to him a new +pursuit--the chase--for which his father kept a large establishment. + + + + + +CHAPTER III + + +The weather was already growing wintry and morning frosts +congealed an earth saturated by autumn rains. The verdure had +thickened and its bright green stood out sharply against the +brownish strips of winter rye trodden down by the cattle, and +against the pale-yellow stubble of the spring buckwheat. The wooded +ravines and the copses, which at the end of August had still been +green islands amid black fields and stubble, had become golden and +bright-red islands amid the green winter rye. The hares had already +half changed their summer coats, the fox cubs were beginning to +scatter, and the young wolves were bigger than dogs. It was the best +time of the year for the chase. The hounds of that ardent young +sportsman Rostov had not merely reached hard winter condition, but +were so jaded that at a meeting of the huntsmen it was decided to give +them a three days' rest and then, on the sixteenth of September, to go +on a distant expedition, starting from the oak grove where there was +an undisturbed litter of wolf cubs. + +All that day the hounds remained at home. It was frosty and the +air was sharp, but toward evening the sky became overcast and it began +to thaw. On the fifteenth, when young Rostov, in his dressing gown, +looked out of the window, he saw it was an unsurpassable morning for +hunting: it was as if the sky were melting and sinking to the earth +without any wind. The only motion in the air was that of the dripping, +microscopic particles of drizzling mist. The bare twigs in the +garden were hung with transparent drops which fell on the freshly +fallen leaves. The earth in the kitchen garden looked wet and black +and glistened like poppy seed and at a short distance merged into +the dull, moist veil of mist. Nicholas went out into the wet and muddy +porch. There was a smell of decaying leaves and of dog. Milka, a +black-spotted, broad-haunched bitch with prominent black eyes, got +up on seeing her master, stretched her hind legs, lay down like a +hare, and then suddenly jumped up and licked him right on his nose and +mustache. Another borzoi, a dog, catching sight of his master from the +garden path, arched his back and, rushing headlong toward the porch +with lifted tail, began rubbing himself against his legs. + +"O-hoy!" came at that moment, that inimitable huntsman's call +which unites the deepest bass with the shrillest tenor, and round +the corner came Daniel the head huntsman and head kennelman, a gray, +wrinkled old man with hair cut straight over his forehead, Ukrainian +fashion, a long bent whip in his hand, and that look of independence +and scorn of everything that is only seen in huntsmen. He doffed his +Circassian cap to his master and looked at him scornfully. This +scorn was not offensive to his master. Nicholas knew that this Daniel, +disdainful of everybody and who considered himself above them, was all +the same his serf and huntsman. + +"Daniel!" Nicholas said timidly, conscious at the sight of the +weather, the hounds, and the huntsman that he was being carried away +by that irresistible passion for sport which makes a man forget all +his previous resolutions, as a lover forgets in the presence of his +mistress. + +"What orders, your excellency?" said the huntsman in his deep +bass, deep as a proto-deacon's and hoarse with hallooing--and two +flashing black eyes gazed from under his brows at his master, who +was silent. "Can you resist it?" those eyes seemed to be asking. + +"It's a good day, eh? For a hunt and a gallop, eh?" asked +Nicholas, scratching Milka behind the ears. + +Daniel did not answer, but winked instead. + +"I sent Uvarka at dawn to listen," his bass boomed out after a +minute's pause. "He says she's moved them into the Otradnoe enclosure. +They were howling there." (This meant that the she-wolf, about whom +they both knew, had moved with her cubs to the Otradnoe copse, a small +place a mile and a half from the house.) + +"We ought to go, don't you think so?" said Nicholas. "Come to me +with Uvarka." + +"As you please." + +"Then put off feeding them." + +"Yes, sir." + +Five minutes later Daniel and Uvarka were standing in Nicholas' +big study. Though Daniel was not a big man, to see him in a room was +like seeing a horse or a bear on the floor among the furniture and +surroundings of human life. Daniel himself felt this, and as usual +stood just inside the door, trying to speak softly and not move, for +fear of breaking something in the master's apartment, and he +hastened to say all that was necessary so as to get from under that +ceiling, out into the open under the sky once more. + +Having finished his inquiries and extorted from Daniel an opinion +that the hounds were fit (Daniel himself wished to go hunting), +Nicholas ordered the horses to be saddled. But just as Daniel was +about to go Natasha came in with rapid steps, not having done up her +hair or finished dressing and with her old nurse's big shawl wrapped +round her. Petya ran in at the same time. + +"You are going?" asked Natasha. "I knew you would! Sonya said you +wouldn't go, but I knew that today is the sort of day when you +couldn't help going." + +"Yes, we are going," replied Nicholas reluctantly, for today, as +he intended to hunt seriously, he did not want to take Natasha and +Petya. "We are going, but only wolf hunting: it would be dull for +you." + +"You know it is my greatest pleasure," said Natasha. "It's not fair; +you are going by yourself, are having the horses saddled and said +nothing to us about it." + +"'No barrier bars a Russian's path'--we'll go!" shouted Petya. + +"But you can't. Mamma said you mustn't," said Nicholas to Natasha. + +"Yes, I'll go. I shall certainly go," said Natasha decisively. +"Daniel, tell them to saddle for us, and Michael must come with my +dogs," she added to the huntsman. + +It seemed to Daniel irksome and improper to be in a room at all, but +to have anything to do with a young lady seemed to him impossible. +He cast down his eyes and hurried out as if it were none of his +business, careful as he went not to inflict any accidental injury on +the young lady. + + + + + +CHAPTER IV + + +The old count, who had always kept up an enormous hunting +establishment but had now handed it all completely over to his son's +care, being in very good spirits on this fifteenth of September, +prepared to go out with the others. + +In an hour's time the whole hunting party was at the porch. +Nicholas, with a stern and serious air which showed that now was no +time for attending to trifles, went past Natasha and Petya who were +trying to tell him something. He had a look at all the details of +the hunt, sent a pack of hounds and huntsmen on ahead to find the +quarry, mounted his chestnut Donets, and whistling to his own leash of +borzois, set off across the threshing ground to a field leading to the +Otradnoe wood. The old count's horse, a sorrel gelding called +Viflyanka, was led by the groom in attendance on him, while the +count himself was to drive in a small trap straight to a spot reserved +for him. + +They were taking fifty-four hounds, with six hunt attendants and +whippers-in. Besides the family, there were eight borzoi kennelmen and +more than forty borzois, so that, with the borzois on the leash +belonging to members of the family, there were about a hundred and +thirty dogs and twenty horsemen. + +Each dog knew its master and its call. Each man in the hunt knew his +business, his place, what he had to do. As soon as they had passed the +fence they all spread out evenly and quietly, without noise or talk, +along the road and field leading to the Otradnoe covert. + +The horses stepped over the field as over a thick carpet, now and +then splashing into puddles as they crossed a road. The misty sky +still seemed to descend evenly and imperceptibly toward the earth, the +air was still, warm, and silent. Occasionally the whistle of a +huntsman, the snort of a horse, the crack of a whip, or the whine of a +straggling hound could be heard. + +When they had gone a little less than a mile, five more riders +with dogs appeared out of the mist, approaching the Rostovs. In +front rode a fresh-looking, handsome old man with a large gray +mustache. + +"Good morning, Uncle!" said Nicholas, when the old man drew near. + +"That's it. Come on!... I was sure of it," began "Uncle." (He was +a distant relative of the Rostovs', a man of small means, and their +neighbor.) "I knew you wouldn't be able to resist it and it's a good +thing you're going. That's it! Come on! (This was "Uncle's" favorite +expression.) "Take the covert at once, for my Girchik says the Ilagins +are at Korniki with their hounds. That's it. Come on!... They'll +take the cubs from under your very nose." + +"That's where I'm going. Shall we join up our packs?" asked +Nicholas. + +The hounds were joined into one pack, and "Uncle" and Nicholas +rode on side by side. Natasha, muffled up in shawls which did not hide +her eager face and shining eyes, galloped up to them. She was followed +by Petya who always kept close to her, by Michael, a huntsman, and +by a groom appointed to look after her. Petya, who was laughing, +whipped and pulled at his horse. Natasha sat easily and confidently on +her black Arabchik and reined him in without effort with a firm hand. + +"Uncle" looked round disapprovingly at Petya and Natasha. He did not +like to combine frivolity with the serious business of hunting. + +"Good morning, Uncle! We are going too!" shouted Petya. + +"Good morning, good morning! But don't go overriding the hounds," +said "Uncle" sternly. + +"Nicholas, what a fine dog Trunila is! He knew me," said Natasha, +referring to her favorite hound. + +"In the first place, Trunila is not a 'dog,' but a harrier," thought +Nicholas, and looked sternly at his sister, trying to make her feel +the distance that ought to separate them at that moment. Natasha +understood it. + +"You mustn't think we'll be in anyone's way, Uncle," she said. +"We'll go to our places and won't budge." + +"A good thing too, little countess," said "Uncle," "only mind you +don't fall off your horse," he added, "because--that's it, come on!- +you've nothing to hold on to." + +The oasis of the Otradnoe covert came in sight a few hundred yards +off, the huntsmen were already nearing it. Rostov, having finally +settled with "Uncle" where they should set on the hounds, and having +shown Natasha where she was to stand--a spot where nothing could +possibly run out--went round above the ravine. + +"Well, nephew, you're going for a big wolf," said "Uncle." "Mind and +don't let her slip!" + +"That's as may happen," answered Rostov. "Karay, here!" he +shouted, answering "Uncle's" remark by this call to his borzoi. +Karay was a shaggy old dog with a hanging jowl, famous for having +tackled a big wolf unaided. They all took up their places. + +The old count, knowing his son's ardor in the hunt, hurried so as +not to be late, and the huntsmen had not yet reached their places when +Count Ilya Rostov, cheerful, flushed, and with quivering cheeks, drove +up with his black horses over the winter rye to the place reserved for +him, where a wolf might come out. Having straightened his coat and +fastened on his hunting knives and horn, he mounted his good, sleek, +well-fed, and comfortable horse, Viflyanka, which was turning gray, +like himself. His horses and trap were sent home. Count Ilya Rostov, +though not at heart a keen sportsman, knew the rules of the hunt well, +and rode to the bushy edge of the road where he was to stand, arranged +his reins, settled himself in the saddle, and, feeling that he was +ready, looked about with a smile. + +Beside him was Simon Chekmar, his personal attendant, an old +horseman now somewhat stiff in the saddle. Chekmar held in leash three +formidable wolfhounds, who had, however, grown fat like their master +and his horse. Two wise old dogs lay down unleashed. Some hundred +paces farther along the edge of the wood stood Mitka, the count's +other groom, a daring horseman and keen rider to hounds. Before the +hunt, by old custom, the count had drunk a silver cupful of mulled +brandy, taken a snack, and washed it down with half a bottle of his +favorite Bordeaux. + +He was somewhat flushed with the wine and the drive. His eyes were +rather moist and glittered more than usual, and as he sat in his +saddle, wrapped up in his fur coat, he looked like a child taken out +for an outing. + +The thin, hollow-cheeked Chekmar, having got everything ready, +kept glancing at his master with whom he had lived on the best of +terms for thirty years, and understanding the mood he was in +expected a pleasant chat. A third person rode up circumspectly through +the wood (it was plain that he had had a lesson) and stopped behind +the count. This person was a gray-bearded old man in a woman's +cloak, with a tall peaked cap on his head. He was the buffoon, who +went by a woman's name, Nastasya Ivanovna. + +"Well, Nastasya Ivanovna!" whispered the count, winking at him. +"If you scare away the beast, Daniel'll give it you!" + +"I know a thing or two myself!" said Nastasya Ivanovna. + +"Hush!" whispered the count and turned to Simon. "Have you seen +the young countess?" he asked. "Where is she?" + +"With young Count Peter, by the Zharov rank grass," answered +Simon, smiling. "Though she's a lady, she's very fond of hunting." + +"And you're surprised at the way she rides, Simon, eh?" said the +count. "She's as good as many a man!" + +"Of course! It's marvelous. So bold, so easy!" + +"And Nicholas? Where is he? By the Lyadov upland, isn't he?" + +"Yes, sir. He knows where to stand. He understands the matter so +well that Daniel and I are often quite astounded," said Simon, well +knowing what would please his master. + +"Rides well, eh? And how well he looks on his horse, eh?" + +"A perfect picture! How he chased a fox out of the rank grass by the +Zavarzinsk thicket the other day! Leaped a fearful place; what a sight +when they rushed from the covert... the horse worth a thousand +rubles and the rider beyond all price! Yes, one would have to search +far to find another as smart." + +"To search far..." repeated the count, evidently sorry Simon had not +said more. "To search far," he said, turning back the skirt of his +coat to get at his snuffbox. + +"The other day when he came out from Mass in full uniform, Michael +Sidorych..." Simon did not finish, for on the still air he had +distinctly caught the music of the hunt with only two or three +hounds giving tongue. He bent down his head and listened, shaking a +warning finger at his master. "They are on the scent of the cubs..." +he whispered, "straight to the Lyadov uplands." + +The count, forgetting to smooth out the smile on his face, looked +into the distance straight before him, down the narrow open space, +holding the snuffbox in his hand but not taking any. After the cry +of the hounds came the deep tones of the wolf call from Daniel's +hunting horn; the pack joined the first three hounds and they could be +heard in full cry, with that peculiar lift in the note that +indicates that they are after a wolf. The whippers-in no longer set on +the hounds, but changed to the cry of ulyulyu, and above the others +rose Daniel's voice, now a deep bass, now piercingly shrill. His voice +seemed to fill the whole wood and carried far beyond out into the open +field. + +After listening a few moments in silence, the count and his +attendant convinced themselves that the hounds had separated into +two packs: the sound of the larger pack, eagerly giving tongue, +began to die away in the distance, the other pack rushed by the wood +past the count, and it was with this that Daniel's voice was heard +calling ulyulyu. The sounds of both packs mingled and broke apart +again, but both were becoming more distant. + +Simon sighed and stooped to straighten the leash a young borzoi +had entangled; the count too sighed and, noticing the snuffbox in +his hand, opened it and took a pinch. "Back!" cried Simon to a +borzoi that was pushing forward out of the wood. The count started and +dropped the snuffbox. Nastasya Ivanovna dismounted to pick it up. +The count and Simon were looking at him. + +Then, unexpectedly, as often happens, the sound of the hunt suddenly +approached, as if the hounds in full cry and Daniel ulyulyuing were +just in front of them. + +The count turned and saw on his right Mitka staring at him with eyes +starting out of his head, raising his cap and pointing before him to +the other side. + +"Look out!" he shouted, in a voice plainly showing that he had +long fretted to utter that word, and letting the borzois slip he +galloped toward the count. + +The count and Simon galloped out of the wood and saw on their left a +wolf which, softly swaying from side to side, was coming at a quiet +lope farther to the left to the very place where they were standing. +The angry borzois whined and getting free of the leash rushed past the +horses' feet at the wolf. + +The wolf paused, turned its heavy forehead toward the dogs +awkwardly, like a man suffering from the quinsy, and, still slightly +swaying from side to side, gave a couple of leaps and with a swish +of its tail disappeared into the skirt of the wood. At the same +instant, with a cry like a wail, first one hound, then another, and +then another, sprang helter-skelter from the wood opposite and the +whole pack rushed across the field toward the very spot where the wolf +had disappeared. The hazel bushes parted behind the hounds and +Daniel's chestnut horse appeared, dark with sweat. On its long back +sat Daniel, hunched forward, capless, his disheveled gray hair hanging +over his flushed, perspiring face. + +"Ulyulyulyu! ulyulyu!..." he cried. When he caught sight of the +count his eyes flashed lightning. + +"Blast you!" he shouted, holding up his whip threateningly at the +count. + +"You've let the wolf go!... What sportsmen!" and as if scorning to +say more to the frightened and shamefaced count, he lashed the heaving +flanks of his sweating chestnut gelding with all the anger the count +had aroused and flew off after the hounds. The count, like a +punished schoolboy, looked round, trying by a smile to win Simon's +sympathy for his plight. But Simon was no longer there. He was +galloping round by the bushes while the field was coming up on both +sides, all trying to head the wolf, but it vanished into the wood +before they could do so. + + + + + +CHAPTER V + + +Nicholas Rostov meanwhile remained at his post, waiting for the +wolf. By the way the hunt approached and receded, by the cries of +the dogs whose notes were familiar to him, by the way the voices of +the huntsmen approached, receded, and rose, he realized what was +happening at the copse. He knew that young and old wolves were +there, that the hounds had separated into two packs, that somewhere +a wolf was being chased, and that something had gone wrong. He +expected the wolf to come his way any moment. He made thousands of +different conjectures as to where and from what side the beast would +come and how he would set upon it. Hope alternated with despair. +Several times he addressed a prayer to God that the wolf should come +his way. He prayed with that passionate and shame-faced feeling with +which men pray at moments of great excitement arising from trivial +causes. "What would it be to Thee to do this for me?" he said to +God. "I know Thou art great, and that it is a sin to ask this of Thee, +but for God's sake do let the old wolf come my way and let Karay +spring at it--in sight of 'Uncle' who is watching from over there--and +seize it by the throat in a death grip!" A thousand times during +that half-hour Rostov cast eager and restless glances over the edge of +the wood, with the two scraggy oaks rising above the aspen undergrowth +and the gully with its water-worn side and "Uncle's" cap just +visible above the bush on his right. + +"No, I shan't have such luck," thought Rostov, "yet what wouldn't it +be worth! It is not to be! Everywhere, at cards and in war, I am +always unlucky." Memories of Austerlitz and of Dolokhov flashed +rapidly and clearly through his mind. "Only once in my life to get +an old wolf, I want only that!" thought he, straining eyes and ears +and looking to the left and then to the right and listening to the +slightest variation of note in the cries of the dogs. + +Again he looked to the right and saw something running toward him +across the deserted field. "No, it can't be!" thought Rostov, taking a +deep breath, as a man does at the coming of something long hoped +for. The height of happiness was reached--and so simply, without +warning, or noise, or display, that Rostov could not believe his +eyes and remained in doubt for over a second. The wolf ran forward and +jumped heavily over a gully that lay in her path. She was an old +animal with a gray back and big reddish belly. She ran without +hurry, evidently feeling sure that no one saw her. Rostov, holding his +breath, looked round at the borzois. They stood or lay not seeing +the wolf or understanding the situation. Old Karay had turned his head +and was angrily searching for fleas, baring his yellow teeth and +snapping at his hind legs. + +"Ulyulyulyu!" whispered Rostov, pouting his lips. The borzois jumped +up, jerking the rings of the leashes and pricking their ears. Karay +finished scratching his hindquarters and, cocking his ears, got up +with quivering tail from which tufts of matted hair hung down. + +"Shall I loose them or not?" Nicholas asked himself as the wolf +approached him coming from the copse. Suddenly the wolf's whole +physiognomy changed: she shuddered, seeing what she had probably never +seen before--human eyes fixed upon her--and turning her head a +little toward Rostov, she paused. + +"Back or forward? Eh, no matter, forward..." the wolf seemed to +say to herself, and she moved forward without again looking round +and with a quiet, long, easy yet resolute lope. + +"Ulyulyu!" cried Nicholas, in a voice not his own, and of its own +accord his good horse darted headlong downhill, leaping over gullies +to head off the wolf, and the borzois passed it, running faster still. +Nicholas did not hear his own cry nor feel that he was galloping, +nor see the borzois, nor the ground over which he went: he saw only +the wolf, who, increasing her speed, bounded on in the same +direction along the hollow. The first to come into view was Milka, +with her black markings and powerful quarters, gaining upon the +wolf. Nearer and nearer... now she was ahead of it; but the wolf +turned its head to face her, and instead of putting on speed as she +usually did Milka suddenly raised her tail and stiffened her forelegs. + +"Ulyulyulyulyu!" shouted Nicholas. + +The reddish Lyubim rushed forward from behind Milka, sprang +impetuously at the wolf, and seized it by its hindquarters, but +immediately jumped aside in terror. The wolf crouched, gnashed her +teeth, and again rose and bounded forward, followed at the distance of +a couple of feet by all the borzois, who did not get any closer to +her. + +"She'll get away! No, it's impossible!" thought Nicholas, still +shouting with a hoarse voice. + +"Karay, ulyulyu!..." he shouted, looking round for the old borzoi +who was now his only hope. Karay, with all the strength age had left +him, stretched himself to the utmost and, watching the wolf, +galloped heavily aside to intercept it. But the quickness of the +wolf's lope and the borzoi's slower pace made it plain that Karay +had miscalculated. Nicholas could already see not far in front of +him the wood where the wolf would certainly escape should she reach +it. But, coming toward him, he saw hounds and a huntsman galloping +almost straight at the wolf. There was still hope. A long, yellowish + +young borzoi, one Nicholas did not know, from another leash, rushed +impetuously at the wolf from in front and almost knocked her over. But +the wolf jumped up more quickly than anyone could have expected and, +gnashing her teeth, flew at the yellowish borzoi, which, with a +piercing yelp, fell with its head on the ground, bleeding from a +gash in its side. + +"Karay? Old fellow!..." wailed Nicholas. + +Thanks to the delay caused by this crossing of the wolf's path, +the old dog with its felted hair hanging from its thigh was within +five paces of it. As if aware of her danger, the wolf turned her +eyes on Karay, tucked her tail yet further between her legs, and +increased her speed. But here Nicholas only saw that something +happened to Karay--the borzoi was suddenly on the wolf, and they +rolled together down into a gully just in front of them. + +That instant, when Nicholas saw the wolf struggling in the gully +with the dogs, while from under them could be seen her gray hair and +outstretched hind leg and her frightened choking head, with her ears +laid back (Karay was pinning her by the throat), was the happiest +moment of his life. With his hand on his saddlebow, he was ready to +dismount and stab the wolf, when she suddenly thrust her head up +from among that mass of dogs, and then her forepaws were on the edge +of the gully. She clicked her teeth (Karay no longer had her by the +throat), leaped with a movement of her hind legs out of the gully, and +having disengaged herself from the dogs, with tail tucked in again, +went forward. Karay, his hair bristling, and probably bruised or +wounded, climbed with difficulty out of the gully. + +"Oh my God! Why?" Nicholas cried in despair. + +"Uncle's" huntsman was galloping from the other side across the +wolf's path and his borzois once more stopped the animal's advance. +She was again hemmed in. + +Nicholas and his attendant, with "Uncle" and his huntsman, were +all riding round the wolf, crying "ulyulyu!" shouting and preparing to +dismount each moment that the wolf crouched back, and starting forward +again every time she shook herself and moved toward the wood where she +would be safe. + +Already, at the beginning of this chase, Daniel, hearing the +ulyulyuing, had rushed out from the wood. He saw Karay seize the wolf, +and checked his horse, supposing the affair to be over. But when he +saw that the horsemen did not dismount and that the wolf shook herself +and ran for safety, Daniel set his chestnut galloping, not at the wolf +but straight toward the wood, just as Karay had run to cut the +animal off. As a result of this, he galloped up to the wolf just +when she had been stopped a second time by "Uncle's" borzois. + +Daniel galloped up silently, holding a naked dagger in his left hand +and thrashing the laboring sides of his chestnut horse with his whip +as if it were a flail. + +Nicholas neither saw nor heard Daniel until the chestnut, +breathing heavily, panted past him, and he heard the fall of a body +and saw Daniel lying on the wolf's back among the dogs, trying to +seize her by the ears. It was evident to the dogs, the hunters, and to +the wolf herself that all was now over. The terrified wolf pressed +back her ears and tried to rise, but the borzois stuck to her. +Daniel rose a little, took a step, and with his whole weight, as if +lying down to rest, fell on the wolf, seizing her by the ears. +Nicholas was about to stab her, but Daniel whispered, "Don't! We'll +gag her!" and, changing his position, set his foot on the wolf's neck. +A stick was thrust between her jaws and she was fastened with a leash, +as if bridled, her legs were bound together, and Daniel rolled her +over once or twice from side to side. + +With happy, exhausted faces, they laid the old wolf, alive, on a +shying and snorting horse and, accompanied by the dogs yelping at her, +took her to the place where they were all to meet. The hounds had +killed two of the cubs and the borzois three. The huntsmen assembled +with their booty and their stories, and all came to look at the +wolf, which, with her broad-browed head hanging down and the bitten +stick between her jaws, gazed with great glassy eyes at this crowd +of dogs and men surrounding her. When she was touched, she jerked +her bound legs and looked wildly yet simply at everybody. Old Count +Rostov also rode up and touched the wolf. + +"Oh, what a formidable one!" said he. "A formidable one, eh?" he +asked Daniel, who was standing near. + +"Yes, your excellency," answered Daniel, quickly doffing his cap. + +The count remembered the wolf he had let slip and his encounter with +Daniel. + +"Ah, but you are a crusty fellow, friend!" said the count. + +For sole reply Daniel gave him a shy, childlike, meek, and amiable +smile. + + + + + +CHAPTER VI + + +The old count went home, and Natasha and Petya promised to return +very soon, but as it was still early the hunt went farther. At +midday they put the hounds into a ravine thickly overgrown with +young trees. Nicholas standing in a fallow field could see all his +whips. + +Facing him lay a field of winter rye, there his own huntsman stood +alone in a hollow behind a hazel bush. The hounds had scarcely been +loosed before Nicholas heard one he knew, Voltorn, giving tongue at +intervals; other hounds joined in, now pausing and now again giving +tongue. A moment later he heard a cry from the wooded ravine that a +fox had been found, and the whole pack, joining together, rushed along +the ravine toward the ryefield and away from Nicholas. + +He saw the whips in their red caps galloping along the edge of the +ravine, he even saw the hounds, and was expecting a fox to show itself +at any moment on the ryefield opposite. + +The huntsman standing in the hollow moved and loosed his borzois, +and Nicholas saw a queer, short-legged red fox with a fine brush going +hard across the field. The borzois bore down on it.... Now they drew +close to the fox which began to dodge between the field in sharper and +sharper curves, trailing its brush, when suddenly a strange white +borzoi dashed in followed by a black one, and everything was in +confusion; the borzois formed a star-shaped figure, scarcely swaying +their bodies and with tails turned away from the center of the +group. Two huntsmen galloped up to the dogs; one in a red cap, the +other, a stranger, in a green coat. + +"What's this?" thought Nicholas. "Where's that huntsman from? He +is not 'Uncle's' man." + +The huntsmen got the fox, but stayed there a long time without +strapping it to the saddle. Their horses, bridled and with high +saddles, stood near them and there too the dogs were lying. The +huntsmen waved their arms and did something to the fox. Then from that +spot came the sound of a horn, with the signal agreed on in case of +a fight. + +"That's Ilagin's huntsman having a row with our Ivan," said +Nicholas' groom. + +Nicholas sent the man to call Natasha and Petya to him, and rode +at a footpace to the place where the whips were getting the hounds +together. Several of the field galloped to the spot where the fight +was going on. + +Nicholas dismounted, and with Natasha and Petya, who had ridden +up, stopped near the hounds, waiting to see how the matter would +end. Out of the bushes came the huntsman who had been fighting and +rode toward his young master, with the fox tied to his crupper. +While still at a distance he took off his cap and tried to speak +respectfully, but he was pale and breathless and his face was angry. +One of his eyes was black, but he probably was not even aware of it. + +"What has happened?" asked Nicholas. + +"A likely thing, killing a fox our dogs had hunted! And it was my +gray bitch that caught it! Go to law, indeed!... He snatches at the +fox! I gave him one with the fox. Here it is on my saddle! Do you want +a taste of this?..." said the huntsman, pointing to his dagger and +probably imagining himself still speaking to his foe. + +Nicholas, not stopping to talk to the man, asked his sister and +Petya to wait for him and rode to the spot where the enemy's, +Ilagin's, hunting party was. + +The victorious huntsman rode off to join the field, and there, +surrounded by inquiring sympathizers, recounted his exploits. + +The facts were that Ilagin, with whom the Rostovs had a quarrel +and were at law, hunted over places that belonged by custom to the +Rostovs, and had now, as if purposely, sent his men to the very +woods the Rostovs were hunting and let his man snatch a fox their dogs +had chased. + +Nicholas, though he had never seen Ilagin, with his usual absence of +moderation in judgment, hated him cordially from reports of his +arbitrariness and violence, and regarded him as his bitterest foe. +He rode in angry agitation toward him, firmly grasping his whip and +fully prepared to take the most resolute and desperate steps to punish +his enemy. + +Hardly had he passed an angle of the wood before a stout gentleman +in a beaver cap came riding toward him on a handsome raven-black +horse, accompanied by two hunt servants. + +Instead of an enemy, Nicholas found in Ilagin a stately and +courteous gentleman who was particularly anxious to make the young +count's acquaintance. Having ridden up to Nicholas, Ilagin raised +his beaver cap and said he much regretted what had occurred and +would have the man punished who had allowed himself to seize a fox +hunted by someone else's borzois. He hoped to become better acquainted +with the count and invited him to draw his covert. + +Natasha, afraid that her brother would do something dreadful, had +followed him in some excitement. Seeing the enemies exchanging +friendly greetings, she rode up to them. Ilagin lifted his beaver +cap still higher to Natasha and said, with a pleasant smile, that +the young countess resembled Diana in her passion for the chase as +well as in her beauty, of which he had heard much. + +To expiate his huntsman's offense, Ilagin pressed the Rostovs to +come to an upland of his about a mile away which he usually kept for +himself and which, he said, swarmed with hares. Nicholas agreed, and +the hunt, now doubled, moved on. + +The way to Iligin's upland was across the fields. The hunt +servants fell into line. The masters rode together. "Uncle," Rostov, +and Ilagin kept stealthily glancing at one another's dogs, trying +not to be observed by their companions and searching uneasily for +rivals to their own borzois. + +Rostov was particularly struck by the beauty of a small, +pure-bred, red-spotted bitch on Ilagin's leash, slender but with +muscles like steel, a delicate muzzle, and prominent black eyes. He +had heard of the swiftness of Ilagin's borzois, and in that +beautiful bitch saw a rival to his own Milka. + +In the middle of a sober conversation begun by Ilagin about the +year's harvest, Nicholas pointed to the red-spotted bitch. + +"A fine little bitch, that!" said he in a careless tone. "Is she +swift?" + +"That one? Yes, she's a good dog, gets what she's after," answered +Ilagin indifferently, of the red-spotted bitch Erza, for which, a year +before, he had given a neighbor three families of house serfs. "So +in your parts, too, the harvest is nothing to boast of, Count?" he +went on, continuing the conversation they had begun. And considering +it polite to return the young count's compliment, Ilagin looked at his +borzois and picked out Milka who attracted his attention by her +breadth. "That black-spotted one of yours is fine--well shaped!" +said he. + +"Yes, she's fast enough," replied Nicholas, and thought: "If only +a full-grown hare would cross the field now I'd show you what sort +of borzoi she is," and turning to his groom, he said he would give a +ruble to anyone who found a hare. + +"I don't understand," continued Ilagin, "how some sportsmen can be +so jealous about game and dogs. For myself, I can tell you, Count, I +enjoy riding in company such as this... what could be better?" (he +again raised his cap to Natasha) "but as for counting skins and what +one takes, I don't care about that." + +"Of course not!" + +"Or being upset because someone else's borzoi and not mine catches +something. All I care about is to enjoy seeing the chase, is it not +so, Count? For I consider that..." + +"A-tu!" came the long-drawn cry of one of the borzoi whippers-in, +who had halted. He stood on a knoll in the stubble, holding his whip +aloft, and again repeated his long-drawn cry, "A-tu!" (This call and +the uplifted whip meant that he saw a sitting hare.) + +"Ah, he has found one, I think," said Ilagin carelessly. "Yes, we +must ride up.... Shall we both course it?" answered Nicholas, seeing +in Erza and "Uncle's" red Rugay two rivals he had never yet had a +chance of pitting against his own borzois. "And suppose they outdo +my Milka at once!" he thought as he rode with "Uncle" and Ilagin +toward the hare. + +"A full-grown one?" asked Ilagin as he approached the whip who had +sighted the hare--and not without agitation he looked round and +whistled to Erza. + +"And you, Michael Nikanorovich?" he said, addressing "Uncle." + +The latter was riding with a sullen expression on his face. + +"How can I join in? Why, you've given a village for each of your +borzois! That's it, come on! Yours are worth thousands. Try yours +against one another, you two, and I'll look on!" + +"Rugay, hey, hey!" he shouted. "Rugayushka!" he added, involuntarily +by this diminutive expressing his affection and the hopes he placed on +this red borzoi. Natasha saw and felt the agitation the two elderly +men and her brother were trying to conceal, and was herself excited by +it. + +The huntsman stood halfway up the knoll holding up his whip and +the gentlefolk rode up to him at a footpace; the hounds that were +far off on the horizon turned away from the hare, and the whips, but +not the gentlefolk, also moved away. All were moving slowly and +sedately. + +"How is it pointing?" asked Nicholas, riding a hundred paces +toward the whip who had sighted the hare. + +But before the whip could reply, the hare, scenting the frost coming +next morning, was unable to rest and leaped up. The pack on leash +rushed downhill in full cry after the hare, and from all sides the +borzois that were not on leash darted after the hounds and the hare. +All the hunt, who had been moving slowly, shouted, "Stop!" calling +in the hounds, while the borzoi whips, with a cry of "A-tu!" galloped +across the field setting the borzois on the hare. The tranquil Ilagin, +Nicholas, Natasha, and "Uncle" flew, reckless of where and how they +went, seeing only the borzois and the hare and fearing only to lose +sight even for an instant of the chase. The hare they had started +was a strong and swift one. When he jumped up he did not run at +once, but pricked his ears listening to the shouting and trampling +that resounded from all sides at once. He took a dozen bounds, not +very quickly, letting the borzois gain on him, and, finally having +chosen his direction and realized his danger, laid back his ears and +rushed off headlong. He had been lying in the stubble, but in front of +him was the autumn sowing where the ground was soft. The two borzois +of the huntsman who had sighted him, having been the nearest, were the +first to see and pursue him, but they had not gone far before Ilagin's +red-spotted Erza passed them, got within a length, flew at the hare +with terrible swiftness aiming at his scut, and, thinking she had +seized him, rolled over like a ball. The hare arched his back and +bounded off yet more swiftly. From behind Erza rushed the +broad-haunched, black-spotted Milka and began rapidly gaining on the +hare. + +"Milashka, dear!" rose Nicholas' triumphant cry. It looked as if +Milka would immediately pounce on the hare, but she overtook him and +flew past. The hare had squatted. Again the beautiful Erza reached +him, but when close to the hare's scut paused as if measuring the +distance, so as not to make a mistake this time but seize his hind +leg. + +"Erza, darling!" Ilagin wailed in a voice unlike his own. Erza did +not hearken to his appeal. At the very moment when she would have +seized her prey, the hare moved and darted along the balk between +the winter rye and the stubble. Again Erza and Milka were abreast, +running like a pair of carriage horses, and began to overtake the +hare, but it was easier for the hare to run on the balk and the +borzois did not overtake him so quickly. + +"Rugay, Rugayushka! That's it, come on!" came a third voice just +then, and "Uncle's" red borzoi, straining and curving its back, caught +up with the two foremost borzois, pushed ahead of them regardless of +the terrible strain, put on speed close to the hare, knocked it off +the balk onto the ryefield, again put on speed still more viciously, +sinking to his knees in the muddy field, and all one could see was +how, muddying his back, he rolled over with the hare. A ring of +borzois surrounded him. A moment later everyone had drawn up round the +crowd of dogs. Only the delighted "Uncle" dismounted, and cut off a +pad, shaking the hare for the blood to drip off, and anxiously +glancing round with restless eyes while his arms and legs twitched. He +spoke without himself knowing whom to or what about. "That's it, +come on! That's a dog!... There, it has beaten them all, the +thousand-ruble as well as the one-ruble borzois. That's it, come +on!" said he, panting and looking wrathfully around as if he were +abusing someone, as if they were all his enemies and had insulted him, +and only now had he at last succeeded in justifying himself. "There +are your thousand-ruble ones.... That's it, come on!..." + +"Rugay, here's a pad for you!" he said, throwing down the hare's +muddy pad. "You've deserved it, that's it, come on!" + +"She'd tired herself out, she'd run it down three times by herself," +said Nicholas, also not listening to anyone and regardless of +whether he were heard or not. + +"But what is there in running across it like that?" said Ilagin's +groom. + +"Once she had missed it and turned it away, any mongrel could take +it," Ilagin was saying at the same time, breathless from his gallop +and his excitement. At the same moment Natasha, without drawing +breath, screamed joyously, ecstatically, and so piercingly that it set +everyone's ear tingling. By that shriek she expressed what the +others expressed by all talking at once, and it was so strange that +she must herself have been ashamed of so wild a cry and everyone +else would have been amazed at it at any other time. "Uncle" himself +twisted up the hare, threw it neatly and smartly across his horse's +back as if by that gesture he meant to rebuke everybody, and, with +an air of not wishing to speak to anyone, mounted his bay and rode +off. The others all followed, dispirited and shamefaced, and only much +later were they able to regain their former affectation of +indifference. For a long time they continued to look at red Rugay who, +his arched back spattered with mud and clanking the ring of his leash, +walked along just behind "Uncle's" horse with the serene air of a +conqueror. + +"Well, I am like any other dog as long as it's not a question of +coursing. But when it is, then look out!" his appearance seemed to +Nicholas to be saying. + +When, much later, "Uncle" rode up to Nicholas and began talking to +him, he felt flattered that, after what had happened, "Uncle" +deigned to speak to him. + + + + + +CHAPTER VII + + +Toward evening Ilagin took leave of Nicholas, who found that they +were so far from home that he accepted "Uncle's" offer that the +hunting party should spend the night in his little village of +Mikhaylovna. + +"And if you put up at my house that will be better still. That's it, +come on!" said "Uncle." "You see it's damp weather, and you could +rest, and the little countess could be driven home in a trap." + +"Uncle's" offer was accepted. A huntsman was sent to Otradnoe for +a trap, while Nicholas rode with Natasha and Petya to "Uncle's" house. + +Some five male domestic serfs, big and little, rushed out to the +front porch to meet their master. A score of women serfs, old and +young, as well as children, popped out from the back entrance to +have a look at the hunters who were arriving. The presence of Natasha- +a woman, a lady, and on horseback--raised the curiosity of the serfs +to such a degree that many of them came up to her, stared her in the +face, and unabashed by her presence made remarks about her as though +she were some prodigy on show and not a human being able to hear or +understand what was said about her. + +"Arinka! Look, she sits sideways! There she sits and her skirt +dangles.... See, she's got a little hunting horn!" + +"Goodness gracious! See her knife?..." + +"Isn't she a Tartar!" + +"How is it you didn't go head over heels?" asked the boldest of all, +addressing Natasha directly. + +"Uncle" dismounted at the porch of his little wooden house which +stood in the midst of an overgrown garden and, after a glance at his +retainers, shouted authoritatively that the superfluous ones should +take themselves off and that all necessary preparations should be made +to receive the guests and the visitors. + +The serfs all dispersed. "Uncle" lifted Natasha off her horse and +taking her hand led her up the rickety wooden steps of the porch. +The house, with its bare, unplastered log walls, was not overclean--it +did not seem that those living in it aimed at keeping it spotless--but +neither was it noticeably neglected. In the entry there was a smell of +fresh apples, and wolf and fox skins hung about. + +"Uncle" led the visitors through the anteroom into a small hall with +a folding table and red chairs, then into the drawing room with a +round birchwood table and a sofa, and finally into his private room +where there was a tattered sofa, a worn carpet, and portraits of +Suvorov, of the host's father and mother, and of himself in military +uniform. The study smelt strongly of tobacco and dogs. "Uncle" asked +his visitors to sit down and make themselves at home, and then went +out of the room. Rugay, his back still muddy, came into the room and +lay down on the sofa, cleaning himself with his tongue and teeth. +Leading from the study was a passage in which a partition with +ragged curtains could be seen. From behind this came women's +laughter and whispers. Natasha, Nicholas, and Petya took off their +wraps and sat down on the sofa. Petya, leaning on his elbow, fell +asleep at once. Natasha and Nicholas were silent. Their faces +glowed, they were hungry and very cheerful. They looked at one another +(now that the hunt was over and they were in the house, Nicholas no +longer considered it necessary to show his manly superiority over +his sister), Natasha gave him a wink, and neither refrained long +from bursting into a peal of ringing laughter even before they had a +pretext ready to account for it. + +After a while "Uncle" came in, in a Cossack coat, blue trousers, and +small top boots. And Natasha felt that this costume, the very one +she had regarded with surprise and amusement at Otradnoe, was just the +right thing and not at all worse than a swallow-tail or frock coat. +"Uncle" too was in high spirits and far from being offended by the +brother's and sister's laughter (it could never enter his head that +they might be laughing at his way of life) he himself joined in the +merriment. + +"That's right, young countess, that's it, come on! I never saw +anyone like her!" said he, offering Nicholas a pipe with a long stem +and, with a practiced motion of three fingers, taking down another +that had been cut short. "She's ridden all day like a man, and is as +fresh as ever!" + +Soon after "Uncle's" reappearance the door was opened, evidently +from the sound by a barefooted girl, and a stout, rosy, good-looking +woman of about forty, with a double chin and full red lips, entered +carrying a large loaded tray. With hospitable dignity and cordiality +in her glance and in every motion, she looked at the visitors and, +with a pleasant smile, bowed respectfully. In spite of her exceptional +stoutness, which caused her to protrude her chest and stomach and +throw back her head, this woman (who was "Uncle's" housekeeper) trod +very lightly. She went to the table, set down the tray, and with her +plump white hands deftly took from it the bottles and various hors +d'oeuvres and dishes and arranged them on the table. When she had +finished, she stepped aside and stopped at the door with a smile on +her face. "Here I am. I am she! Now do you understand 'Uncle'?" her +expression said to Rostov. How could one help understanding? Not +only Nicholas, but even Natasha understood the meaning of his puckered +brow and the happy complacent smile that slightly puckered his lips +when Anisya Fedorovna entered. On the tray was a bottle of herb +wine, different kinds of vodka, pickled mushrooms, rye cakes made with +buttermilk, honey in the comb, still mead and sparkling mead, +apples, nuts (raw and roasted), and nut-and-honey sweets. Afterwards +she brought a freshly roasted chicken, ham, preserves made with honey, +and preserves made with sugar. + +All this was the fruit of Anisya Fedorovna's housekeeping, +gathered and prepared by her. The smell and taste of it all had a +smack of Anisya Fedorovna herself: a savor of juiciness, +cleanliness, whiteness, and pleasant smiles. + +"Take this, little Lady-Countess!" she kept saying, as she offered +Natasha first one thing and then another. + +Natasha ate of everything and thought she had never seen or eaten +such buttermilk cakes, such aromatic jam, such honey-and-nut sweets, +or such a chicken anywhere. Anisya Fedorovna left the room. + +After supper, over their cherry brandy, Rostov and "Uncle" talked of +past and future hunts, of Rugay and Ilagin's dogs, while Natasha sat +upright on the sofa and listened with sparkling eyes. She tried +several times to wake Petya that he might eat something, but he only +muttered incoherent words without waking up. Natasha felt so +lighthearted and happy in these novel surroundings that she only +feared the trap would come for her too soon. After a casual pause, +such as often occurs when receiving friends for the first time in +one's own house, "Uncle," answering a thought that was in his +visitors' mind, said: + +"This, you see, is how I am finishing my days... Death will come. +That's it, come on! Nothing will remain. Then why harm anyone?" + +"Uncle's" face was very significant and even handsome as he said +this. Involuntarily Rostov recalled all the good he had heard about +him from his father and the neighbors. Throughout the whole province +"Uncle" had the reputation of being the most honorable and +disinterested of cranks. They called him in to decide family disputes, +chose him as executor, confided secrets to him, elected him to be a +justice and to other posts; but he always persistently refused +public appointments, passing the autumn and spring in the fields on +his bay gelding, sitting at home in winter, and lying in his overgrown +garden in summer. + +"Why don't you enter the service, Uncle?" + +"I did once, but gave it up. I am not fit for it. That's it, come +on! I can't make head or tail of it. That's for you--I haven't +brains enough. Now, hunting is another matter--that's it, come on! +Open the door, there!" he shouted. "Why have you shut it?" + +The door at the end of the passage led to the huntsmen's room, as +they called the room for the hunt servants. + +There was a rapid patter of bare feet, and an unseen hand opened the +door into the huntsmen's room, from which came the clear sounds of a +balalayka on which someone, who was evidently a master of the art, was +playing. Natasha had been listening to those strains for some time and +now went out into the passage to hear better. + +"That's Mitka, my coachman.... I have got him a good balalayka. +I'm fond of it," said "Uncle." + +It was the custom for Mitka to play the balalayka in the +huntsmen's room when "Uncle" returned from the chase. "Uncle" was fond +of such music. + +"How good! Really very good!" said Nicholas with some +unintentional superciliousness, as if ashamed to confess that the +sounds pleased him very much. + +"Very good?" said Natasha reproachfully, noticing her brother's +tone. "Not 'very good' it's simply delicious!" + +Just as "Uncle's" pickled mushrooms, honey, and cherry brandy had +seemed to her the best in the world, so also that song, at that +moment, seemed to her the acme of musical delight. + +"More, please, more!" cried Natasha at the door as soon as the +balalayka ceased. Mitka tuned up afresh, and recommenced thrumming the +balalayka to the air of My Lady, with trills and variations. "Uncle" +sat listening, slightly smiling, with his head on one side. The air +was repeated a hundred times. The balalayka was retuned several +times and the same notes were thrummed again, but the listeners did +not grow weary of it and wished to hear it again and again. Anisya +Fedorovna came in and leaned her portly person against the doorpost. + +"You like listening?" she said to Natasha, with a smile extremely +like "Uncle's." "That's a good player of ours," she added. + +"He doesn't play that part right!" said "Uncle" suddenly, with an +energetic gesture. "Here he ought to burst out--that's it, come on!- +ought to burst out." + +"Do you play then?" asked Natasha. + +"Uncle" did not answer, but smiled. + +"Anisya, go and see if the strings of my guitar are all right. I +haven't touched it for a long time. That's it--come on! I've given +it up." + +Anisya Fedorovna, with her light step, willingly went to fulfill her +errand and brought back the guitar. + +Without looking at anyone, "Uncle" blew the dust off it and, tapping +the case with his bony fingers, tuned the guitar and settled himself +in his armchair. He took the guitar a little above the fingerboard, +arching his left elbow with a somewhat theatrical gesture, and, with a +wink at Anisya Fedorovna, struck a single chord, pure and sonorous, +and then quietly, smoothly, and confidently began playing in very slow +time, not My Lady, but the well-known song: Came a maiden down the +street. The tune, played with precision and in exact time, began to +thrill in the hearts of Nicholas and Natasha, arousing in them the +same kind of sober mirth as radiated from Anisya Fedorovna's whole +being. Anisya Fedorovna flushed, and drawing her kerchief over her +face went laughing out of the room. "Uncle" continued to play +correctly, carefully, with energetic firmness, looking with a +changed and inspired expression at the spot where Anisya Fedorovna had +just stood. Something seemed to be laughing a little on one side of +his face under his gray mustaches, especially as the song grew brisker +and the time quicker and when, here and there, as he ran his fingers +over the strings, something seemed to snap. + +"Lovely, lovely! Go on, Uncle, go on!" shouted Natasha as soon as he +had finished. She jumped up and hugged and kissed him. "Nicholas, +Nicholas!" she said, turning to her brother, as if asking him: "What +is it moves me so?" + +Nicholas too was greatly pleased by "Uncle's" playing, and "Uncle" +played the piece over again. Anisya Fedorovna's smiling face +reappeared in the doorway and behind hers other faces... + + Fetching water clear and sweet, + Stop, dear maiden, I entreat- + +played "Uncle" once more, running his fingers skillfully over the +strings, and then he stopped short and jerked his shoulders. + +"Go on, Uncle dear," Natasha wailed in an imploring tone as if her +life depended on it. + +"Uncle" rose, and it was as if there were two men in him: one of +them smiled seriously at the merry fellow, while the merry fellow +struck a naive and precise attitude preparatory to a folk dance. + +"Now then, niece!" he exclaimed, waving to Natasha the hand that had +just struck a chord. + +Natasha threw off the shawl from her shoulders, ran forward to +face "Uncle," and setting her arms akimbo also made a motion with +her shoulders and struck an attitude. + +Where, how, and when had this young countess, educated by an emigree +French governess, imbibed from the Russian air she breathed that +spirit and obtained that manner which the pas de chale* would, one +would have supposed, long ago have effaced? But the spirit and the +movements were those inimitable and unteachable Russian ones that +"Uncle" had expected of her. As soon as she had struck her pose, and +smiled triumphantly, proudly, and with sly merriment, the fear that +had at first seized Nicholas and the others that she might not do +the right thing was at an end, and they were already admiring her. + + +*The French shawl dance. + + +She did the right thing with such precision, such complete +precision, that Anisya Fedorovna, who had at once handed her the +handkerchief she needed for the dance, had tears in her eyes, though +she laughed as she watched this slim, graceful countess, reared in +silks and velvets and so different from herself, who yet was able to +understand all that was in Anisya and in Anisya's father and mother +and aunt, and in every Russian man and woman. + +"Well, little countess; that's it--come on!" cried "Uncle," with a +joyous laugh, having finished the dance. "Well done, niece! Now a fine +young fellow must be found as husband for you. That's it--come on!" + +"He's chosen already," said Nicholas smiling. + +"Oh?" said "Uncle" in surprise, looking inquiringly at Natasha, +who nodded her head with a happy smile. + +"And such a one!" she said. But as soon as she had said it a new +train of thoughts and feelings arose in her. "What did Nicholas' smile +mean when he said 'chosen already'? Is he glad of it or not? It is +as if he thought my Bolkonski would not approve of or understand our +gaiety. But he would understand it all. Where is he now?" she thought, +and her face suddenly became serious. But this lasted only a second. +"Don't dare to think about it," she said to herself, and sat down +again smilingly beside "Uncle," begging him to play something more. + +"Uncle" played another song and a valse; then after a pause he +cleared his throat and sang his favorite hunting song: + + As 'twas growing dark last night + Fell the snow so soft and light... + + +"Uncle" sang as peasants sing, with full and naive conviction that +the whole meaning of a song lies in the words and that the tune +comes of itself, and that apart from the words there is no tune, which +exists only to give measure to the words. As a result of this the +unconsidered tune, like the song of a bird, was extraordinarily +good. Natasha was in ecstasies over "Uncle's" singing. She resolved to +give up learning the harp and to play only the guitar. She asked +"Uncle" for his guitar and at once found the chords of the song. + +After nine o'clock two traps and three mounted men, who had been +sent to look for them, arrived to fetch Natasha and Petya. The count +and countess did not know where they were and were very anxious, +said one of the men. + +Petya was carried out like a log and laid in the larger of the two +traps. Natasha and Nicholas got into the other. "Uncle" wrapped +Natasha up warmly and took leave of her with quite a new tenderness. +He accompanied them on foot as far as the bridge that could not be +crossed, so that they had to go round by the ford, and he sent +huntsmen to ride in front with lanterns. + +"Good-by, dear niece," his voice called out of the darkness--not the +voice Natasha had known previously, but the one that had sung As 'twas +growing dark last night. + +In the village through which they passed there were red lights and a +cheerful smell of smoke. + +"What a darling Uncle is!" said Natasha, when they had come out onto +the highroad. + +"Yes," returned Nicholas. "You're not cold?" + +"No. I'm quite, quite all right. I feel so comfortable!" answered +Natasha, almost perplexed by her feelings. They remained silent a long +while. The night was dark and damp. They could not see the horses, but +only heard them splashing through the unseen mud. + +What was passing in that receptive childlike soul that so eagerly +caught and assimilated all the diverse impressions of life? How did +they all find place in her? But she was very happy. As they were +nearing home she suddenly struck up the air of As 'twas growing dark +last night--the tune of which she had all the way been trying to get +and had at last caught. + +"Got it?" said Nicholas. + +"What were you thinking about just now, Nicholas?" inquired Natasha. + +They were fond of asking one another that question. + +"I?" said Nicholas, trying to remember. "Well, you see, first I +thought that Rugay, the red hound, was like Uncle, and that if he were +a man he would always keep Uncle near him, if not for his riding, then +for his manner. What a good fellow Uncle is! Don't you think so?... +Well, and you?" + +"I? Wait a bit, wait.... Yes, first I thought that we are driving +along and imagining that we are going home, but that heaven knows +where we are really going in the darkness, and that we shall arrive +and suddenly find that we are not in Otradnoe, but in Fairyland. And +then I thought... No, nothing else." + +"I know, I expect you thought of him," said Nicholas, smiling as +Natasha knew by the sound of his voice. + +"No," said Natasha, though she had in reality been thinking about +Prince Andrew at the same time as of the rest, and of how he would +have liked "Uncle." "And then I was saying to myself all the way, 'How +well Anisya carried herself, how well!'" And Nicholas heard her +spontaneous, happy, ringing laughter. "And do you know," she +suddenly said, "I know that I shall never again be as happy and +tranquil as I am now." + +"Rubbish, nonsense, humbug!" exclaimed Nicholas, and he thought: +"How charming this Natasha of mine is! I have no other friend like her +and never shall have. Why should she marry? We might always drive +about together!" + +"What a darling this Nicholas of mine is!" thought Natasha. + +"Ah, there are still lights in the drawingroom!" she said, +pointing to the windows of the house that gleamed invitingly in the +moist velvety darkness of the night. + + + + + +CHAPTER VIII + + +Count Ilya Rostov had resigned the position of Marshal of the +Nobility because it involved him in too much expense, but still his +affairs did not improve. Natasha and Nicholas often noticed their +parents conferring together anxiously and privately and heard +suggestions of selling the fine ancestral Rostov house and estate near +Moscow. It was not necessary to entertain so freely as when the +count had been Marshal, and life at Otradnoe was quieter than in +former years, but still the enormous house and its lodges were full of +people and more than twenty sat down to table every day. These were +all their own people who had settled down in the house almost as +members of the family, or persons who were, it seemed, obliged to live +in the count's house. Such were Dimmler the musician and his wife, +Vogel the dancing master and his family, Belova, an old maiden lady, +an inmate of the house, and many others such as Petya's tutors, the +girls' former governess, and other people who simply found it +preferable and more advantageous to live in the count's house than +at home. They had not as many visitors as before, but the old habits +of life without which the count and countess could not conceive of +existence remained unchanged. There was still the hunting +establishment which Nicholas had even enlarged, the same fifty +horses and fifteen grooms in the stables, the same expensive +presents and dinner parties to the whole district on name days; +there were still the count's games of whist and boston, at which- +spreading out his cards so that everybody could see them--he let +himself be plundered of hundreds of rubles every day by his neighbors, +who looked upon an opportunity to play a rubber with Count Rostov as a +most profitable source of income. + +The count moved in his affairs as in a huge net, trying not to +believe that he was entangled but becoming more and more so at every +step, and feeling too feeble to break the meshes or to set to work +carefully and patiently to disentangle them. The countess, with her +loving heart, felt that her children were being ruined, that it was +not the count's fault for he could not help being what he was--that +(though he tried to hide it) he himself suffered from the +consciousness of his own and his children's ruin, and she tried to +find means of remedying the position. From her feminine point of +view she could see only one solution, namely, for Nicholas to marry +a rich heiress. She felt this to be their last hope and that if +Nicholas refused the match she had found for him, she would have to +abandon the hope of ever getting matters right. This match was with +Julie Karagina, the daughter of excellent and virtuous parents, a girl +the Rostovs had known from childhood, and who had now become a wealthy +heiress through the death of the last of her brothers. + +The countess had written direct to Julie's mother in Moscow +suggesting a marriage between their children and had received a +favorable answer from her. Karagina had replied that for her part +she was agreeable, and everything depend on her daughter's +inclination. She invited Nicholas to come to Moscow. + +Several times the countess, with tears in her eyes, told her son +that now both her daughters were settled, her only wish was to see him +married. She said she could lie down in her grave peacefully if that +were accomplished. Then she told him that she knew of a splendid +girl and tried to discover what he thought about marriage. + +At other times she praised Julie to him and advised him to go to +Moscow during the holidays to amuse himself. Nicholas guessed what his +mother's remarks were leading to and during one of these conversations +induced her to speak quite frankly. She told him that her only hope of +getting their affairs disentangled now lay in his marrying Julie +Karagina. + +"But, Mamma, suppose I loved a girl who has no fortune, would you +expect me to sacrifice my feelings and my honor for the sake of +money?" he asked his mother, not realizing the cruelty of his question +and only wishing to show his noble-mindedness. + +"No, you have not understood me," said his mother, not knowing how +to justify herself. "You have not understood me, Nikolenka. It is your +happiness I wish for," she added, feeling that she was telling an +untruth and was becoming entangled. She began to cry. + +"Mamma, don't cry! Only tell me that you wish it, and you know I +will give my life, anything, to put you at ease," said Nicholas. "I +would sacrifice anything for you--even my feelings." + +But the countess did not want the question put like that: she did +not want a sacrifice from her son, she herself wished to make a +sacrifice for him. + +"No, you have not understood me, don't let us talk about it," she +replied, wiping away her tears. + +"Maybe I do love a poor girl," said Nicholas to himself. "Am I to +sacrifice my feelings and my honor for money? I wonder how Mamma could +speak so to me. Because Sonya is poor I must not love her," he +thought, "must not respond to her faithful, devoted love? Yet I should +certainly be happier with her than with some doll-like Julie. I can +always sacrifice my feelings for my family's welfare," he said to +himself, "but I can't coerce my feelings. If I love Sonya, that +feeling is for me stronger and higher than all else." + +Nicholas did not go to Moscow, and the countess did not renew the +conversation with him about marriage. She saw with sorrow, and +sometimes with exasperation, symptoms of a growing attachment +between her son and the portionless Sonya. Though she blamed herself +for it, she could not refrain from grumbling at and worrying Sonya, +often pulling her up without reason, addressing her stiffly as "my +dear," and using the formal "you" instead of the intimate "thou" in +speaking to her. The kindhearted countess was the more vexed with +Sonya because that poor, dark-eyed niece of hers was so meek, so kind, +so devotedly grateful to her benefactors, and so faithfully, +unchangingly, and unselfishly in love with Nicholas, that there were +no grounds for finding fault with her. + +Nicholas was spending the last of his leave at home. A fourth letter +had come from Prince Andrew, from Rome, in which he wrote that he +would have been on his way back to Russia long ago had not his wound +unexpectedly reopened in the warm climate, which obliged him to +defer his return till the beginning of the new year. Natasha was still +as much in love with her betrothed, found the same comfort in that +love, and was still as ready to throw herself into all the pleasures +of life as before; but at the end of the fourth month of their +separation she began to have fits of depression which she could not +master. She felt sorry for herself: sorry that she was being wasted +all this time and of no use to anyone--while she felt herself so +capable of loving and being loved. + +Things were not cheerful in the Rostovs' home. + + + + + +CHAPTER IX + + +Christmas came and except for the ceremonial Mass, the solemn and +wearisome Christmas congratulations from neighbors and servants, and +the new dresses everyone put on, there were no special festivities, +though the calm frost of twenty degrees Reaumur, the dazzling sunshine +by day, and the starlight of the winter nights seemed to call for some +special celebration of the season. + +On the third day of Christmas week, after the midday dinner, all the +inmates of the house dispersed to various rooms. It was the dullest +time of the day. Nicholas, who had been visiting some neighbors that +morning, was asleep on the sitting-room sofa. The old count was +resting in his study. Sonya sat in the drawing room at the round +table, copying a design for embroidery. The countess was playing +patience. Nastasya Ivanovna the buffoon sat with a sad face at the +window with two old ladies. Natasha came into the room, went up to +Sonya, glanced at what she was doing, and then went up to her mother +and stood without speaking. + +"Why are you wandering about like an outcast?" asked her mother. +"What do you want?" + +"Him... I want him... now, this minute! I want him!" said Natasha, +with glittering eyes and no sign of a smile. + +The countess lifted her head and looked attentively at her daughter. + +"Don't look at me, Mamma! Don't look; I shall cry directly." + +"Sit down with me a little," said the countess. + +"Mamma, I want him. Why should I be wasted like this, Mamma?" + +Her voice broke, tears gushed from her eyes, and she turned +quickly to hide them and left the room. + +She passed into the sitting room, stood there thinking awhile, and +then went into the maids' room. There an old maidservant was grumbling +at a young girl who stood panting, having just run in through the cold +from the serfs' quarters. + +"Stop playing--there's a time for everything," said the old woman. + +"Let her alone, Kondratevna," said Natasha. "Go, Mavrushka, go." + +Having released Mavrushka, Natasha crossed the dancing hall and went +to the vestibule. There an old footman and two young ones were playing +cards. They broke off and rose as she entered. + +"What can I do with them?" thought Natasha. + +"Oh, Nikita, please go... where can I send him?... Yes, go to the +yard and fetch a fowl, please, a cock, and you, Misha, bring me some +oats." + +"Just a few oats?" said Misha, cheerfully and readily. + +"Go, go quickly," the old man urged him. + +"And you, Theodore, get me a piece of chalk." + +On her way past the butler's pantry she told them to set a +samovar, though it was not at all the time for tea. + +Foka, the butler, was the most ill-tempered person in the house. +Natasha liked to test her power over him. He distrusted the order +and asked whether the samovar was really wanted. + +"Oh dear, what a young lady!" said Foka, pretending to frown at +Natasha. + +No one in the house sent people about or gave them as much trouble +as Natasha did. She could not see people unconcernedly, but had to +send them on some errand. She seemed to be trying whether any of +them would get angry or sulky with her; but the serfs fulfilled no +one's orders so readily as they did hers. "What can I do, where can +I go?" thought she, as she went slowly along the passage. + +"Nastasya Ivanovna, what sort of children shall I have?" she asked +the buffoon, who was coming toward her in a woman's jacket. + +"Why, fleas, crickets, grasshoppers," answered the buffoon. + +"O Lord, O Lord, it's always the same! Oh, where am I to go? What am +I to do with myself?" And tapping with her heels, she ran quickly +upstairs to see Vogel and his wife who lived on the upper story. + +Two governesses were sitting with the Vogels at a table, on which +were plates of raisins, walnuts, and almonds. The governesses were +discussing whether it was cheaper to live in Moscow or Odessa. Natasha +sat down, listened to their talk with a serious and thoughtful air, +and then got up again. + +"The island of Madagascar," she said, "Ma-da-gas-car," she repeated, +articulating each syllable distinctly, and, not replying to Madame +Schoss who asked her what she was saying, she went out of the room. + +Her brother Petya was upstairs too; with the man in attendance on +him he was preparing fireworks to let off that night. + +"Petya! Petya!" she called to him. "Carry me downstairs." + +Petya ran up and offered her his back. She jumped on it, putting her +arms round his neck, and he pranced along with her. + +"No, don't... the island of Madagascar!" she said, and jumping off +his back she went downstairs. + +Having as it were reviewed her kingdom, tested her power, and made +sure that everyone was submissive, but that all the same it was +dull, Natasha betook herself to the ballroom, picked up her guitar, +sat down in a dark corner behind a bookcase, and began to run her +fingers over the strings in the bass, picking out a passage she +recalled from an opera she had heard in Petersburg with Prince Andrew. +What she drew from the guitar would have had no meaning for other +listeners, but in her imagination a whole series of reminiscences +arose from those sounds. She sat behind the bookcase with her eyes +fixed on a streak of light escaping from the pantry door and +listened to herself and pondered. She was in a mood for brooding on +the past. + +Sonya passed to the pantry with a glass in her hand. Natasha glanced +at her and at the crack in the pantry door, and it seemed to her +that she remembered the light failing through that crack once before +and Sonya passing with a glass in her hand. "Yes it was exactly the +same," thought Natasha. + +"Sonya, what is this?" she cried, twanging a thick string. + +"Oh, you are there!" said Sonya with a start, and came near and +listened. "I don't know. A storm?" she ventured timidly, afraid of +being wrong. + +"There! That's just how she started and just how she came up smiling +timidly when all this happened before," thought Natasha, "and in +just the same way I thought there was something lacking in her." + +"No, it's the chorus from The Water-Carrier, listen!" and Natasha +sang the air of the chorus so that Sonya should catch it. "Where +were you going?" she asked. + +"To change the water in this glass. I am just finishing the design." + +"You always find something to do, but I can't," said Natasha. "And +where's Nicholas?" + +"Asleep, I think." + +"Sonya, go and wake him," said Natasha. "Tell him I want him to come +and sing." + +She sat awhile, wondering what the meaning of it all having happened +before could be, and without solving this problem, or at all +regretting not having done so, she again passed in fancy to the time +when she was with him and he was looking at her with a lover's eyes. + +"Oh, if only he would come quicker! I am so afraid it will never be! +And, worst of all, I am growing old--that's the thing! There won't +then be in me what there is now. But perhaps he'll come today, will +come immediately. Perhaps he has come and is sitting in the drawing +room. Perhaps he came yesterday and I have forgotten it." She rose, +put down the guitar, and went to the drawing room. + +All the domestic circle, tutors, governesses, and guests, were +already at the tea table. The servants stood round the table--but +Prince Andrew was not there and life was going on as before. + +"Ah, here she is!" said the old count, when he saw Natasha enter. +"Well, sit down by me." But Natasha stayed by her mother and glanced +round as if looking for something. + +"Mamma!" she muttered, "give him to me, give him, Mamma, quickly, +quickly!" and she again had difficulty in repressing her sobs. + +She sat down at the table and listened to the conversation between +the elders and Nicholas, who had also come to the table. "My God, my +God! The same faces, the same talk, Papa holding his cup and blowing +in the same way!" thought Natasha, feeling with horror a sense of +repulsion rising up in her for the whole household, because they +were always the same. + +After tea, Nicholas, Sonya, and Natasha went to the sitting room, to +their favorite corner where their most intimate talks always began. + + + + + +CHAPTER X + + +"Does it ever happen to you," said Natasha to her brother, when +they settled down in the sitting room, "does it ever happen to you +to feel as if there were nothing more to come--nothing; that +everything good is past? And to feel not exactly dull, but sad?" + +"I should think so!" he replied. "I have felt like that when +everything was all right and everyone was cheerful. The thought has +come into my mind that I was already tired of it all, and that we must +all die. Once in the regiment I had not gone to some merrymaking where +there was music... and suddenly I felt so depressed..." + +"Oh yes, I know, I know, I know!" Natasha interrupted him. "When I +was quite little that used to be so with me. Do you remember when I +was punished once about some plums? You were all dancing, and I sat +sobbing in the schoolroom? I shall never forget it: I felt sad and +sorry for everyone, for myself, and for everyone. And I was +innocent--that was the chief thing," said Natasha. "Do you remember?" + +"I remember," answered Nicholas. "I remember that I came to you +afterwards and wanted to comfort you, but do you know, I felt +ashamed to. We were terribly absurd. I had a funny doll then and +wanted to give it to you. Do you remember?" + +"And do you remember," Natasha asked with a pensive smile, "how +once, long, long ago, when we were quite little, Uncle called us +into the study--that was in the old house--and it was dark--we went in +and suddenly there stood..." + +"A Negro," chimed in Nicholas with a smile of delight. "Of course +I remember. Even now I don't know whether there really was a Negro, or +if we only dreamed it or were told about him." + +"He was gray, you remember, and had white teeth, and stood and +looked at us..." + +"Sonya, do you remember?" asked Nicholas. + +"Yes, yes, I do remember something too," Sonya answered timidly. + +"You know I have asked Papa and Mamma about that Negro," said +Natasha, "and they say there was no Negro at all. But you see, you +remember!" + +"Of course I do, I remember his teeth as if I had just seen them." + +"How strange it is! It's as if it were a dream! I like that." + +"And do you remember how we rolled hard-boiled eggs in the ballroom, +and suddenly two old women began spinning round on the carpet? Was +that real or not? Do you remember what fun it was?" + +"Yes, and you remember how Papa in his blue overcoat fired a gun +in the porch?" + +So they went through their memories, smiling with pleasure: not +the sad memories of old age, but poetic, youthful ones--those +impressions of one's most distant past in which dreams and realities +blend--and they laughed with quiet enjoyment. + +Sonya, as always, did not quite keep pace with them, though they +shared the same reminiscences. + +Much that they remembered had slipped from her mind, and what she +recalled did not arouse the same poetic feeling as they experienced. +She simply enjoyed their pleasure and tried to fit in with it. + +She only really took part when they recalled Sonya's first +arrival. She told them how afraid she had been of Nicholas because +he had on a corded jacket and her nurse had told her that she, too, +would be sewn up with cords. + +"And I remember their telling me that you had been born under a +cabbage," said Natasha, "and I remember that I dared not disbelieve +it then, but knew that it was not true, and I felt so uncomfortable." + +While they were talking a maid thrust her head in at the other +door of the sitting room. + +"They have brought the cock, Miss," she said in a whisper. + +"It isn't wanted, Petya. Tell them to take it away," replied +Natasha. + +In the middle of their talk in the sitting room, Dimmler came in and +went up to the harp that stood there in a corner. He took off its +cloth covering, and the harp gave out a jarring sound. + +"Mr. Dimmler, please play my favorite nocturne by Field," came the +old countess' voice from the drawing room. + +Dimmler struck a chord and, turning to Natasha, Nicholas, and Sonya, +remarked: "How quiet you young people are!" + +"Yes, we're philosophizing," said Natasha, glancing round for a +moment and then continuing the conversation. They were now +discussing dreams. + +Dimmler began to play; Natasha went on tiptoe noiselessly to the +table, took up a candle, carried it out, and returned, seating herself +quietly in her former place. It was dark in the room especially +where they were sitting on the sofa, but through the big windows the +silvery light of the full moon fell on the floor. Dimmler had finished +the piece but still sat softly running his fingers over the strings, +evidently uncertain whether to stop or to play something else. + +"Do you know," said Natasha in a whisper, moving closer to +Nicholas and Sonya, "that when one goes on and on recalling +memories, one at last begins to remember what happened before one +was in the world..." + +"That is metempsychosis," said Sonya, who had always learned well, +and remembered everything. "The Egyptians believed that our souls have +lived in animals, and will go back into animals again." + +"No, I don't believe we ever were in animals," said Natasha, still +in a whisper though the music had ceased. "But I am certain that we +were angels somewhere there, and have been here, and that is why we +remember...." + +"May I join you?" said Dimmler who had come up quietly, and he sat +down by them. + +"If we have been angels, why have we fallen lower?" said Nicholas. +"No, that can't be!" + +"Not lower, who said we were lower?... How do I know what I was +before?" Natasha rejoined with conviction. "The soul is immortal--well +then, if I shall always live I must have lived before, lived for a +whole eternity." + +"Yes, but it is hard for us to imagine eternity," remarked +Dimmler, who had joined the young folk with a mildly condescending +smile but now spoke as quietly and seriously as they. + +"Why is it hard to imagine eternity?" said Natasha. "It is now +today, and it will be tomorrow, and always; and there was yesterday, +and the day before..." + +"Natasha! Now it's your turn. Sing me something," they heard the +countess say. "Why are you sitting there like conspirators?" + +"Mamma, I don't at all want to," replied Natasha, but all the same +she rose. + +None of them, not even the middle-aged Dimmler, wanted to break +off their conversation and quit that corner in the sitting room, but +Natasha got up and Nicholas sat down at the clavichord. Standing as +usual in the middle of the hall and choosing the place where the +resonance was best, Natasha began to sing her mother's favorite song. + +She had said she did not want to sing, but it was long since she had +sung, and long before she again sang, as she did that evening. The +count, from his study where he was talking to Mitenka, heard her +and, like a schoolboy in a hurry to run out to play, blundered in +his talk while giving orders to the steward, and at last stopped, +while Mitenka stood in front of him also listening and smiling. +Nicholas did not take his eyes off his sister and drew breath in +time with her. Sonya, as she listened, thought of the immense +difference there was between herself and her friend, and how +impossible it was for her to be anything like as bewitching as her +cousin. The old countess sat with a blissful yet sad smile and with +tears in her eyes, occasionally shaking her head. She thought of +Natasha and of her own youth, and of how there was something unnatural +and dreadful in this impending marriage of Natasha and Prince Andrew. + +Dimmler, who had seated himself beside the countess, listened with +closed eyes. + +"Ah, Countess," he said at last, "that's a European talent, she +has nothing to learn--what softness, tenderness, and strength...." + +"Ah, how afraid I am for her, how afraid I am!" said the countess, +not realizing to whom she was speaking. Her maternal instinct told her +that Natasha had too much of something, and that because of this she +would not be happy. Before Natasha had finished singing, +fourteen-year-old Petya rushed in delightedly, to say that some +mummers had arrived. + +Natasha stopped abruptly. + +"Idiot!" she screamed at her brother and, running to a chair, +threw herself on it, sobbing so violently that she could not stop +for a long time. + +"It's nothing, Mamma, really it's nothing; only Petya startled +me," she said, trying to smile, but her tears still flowed and sobs +still choked her. + +The mummers (some of the house serfs) dressed up as bears, Turks, +innkeepers, and ladies--frightening and funny--bringing in with them +the cold from outside and a feeling of gaiety, crowded, at first +timidly, into the anteroom, then hiding behind one another they pushed +into the ballroom where, shyly at first and then more and more merrily +and heartily, they started singing, dancing, and playing Christmas +games. The countess, when she had identified them and laughed at their +costumes, went into the drawing room. The count sat in the ballroom, +smiling radiantly and applauding the players. The young people had +disappeared. + +Half an hour later there appeared among the other mummers in the +ballroom an old lady in a hooped skirt--this was Nicholas. A Turkish +girl was Petya. A clown was Dimmler. An hussar was Natasha, and a +Circassian was Sonya with burnt-cork mustache and eyebrows. + +After the condescending surprise, nonrecognition, and praise, from +those who were not themselves dressed up, the young people decided +that their costumes were so good that they ought to be shown +elsewhere. + +Nicholas, who, as the roads were in splendid condition, wanted to +take them all for a drive in his troyka, proposed to take with them +about a dozen of the serf mummers and drive to "Uncle's." + +"No, why disturb the old fellow?" said the countess. "Besides, you +wouldn't have room to turn round there. If you must go, go to the +Melyukovs'." + +Melyukova was a widow, who, with her family and their tutors and +governesses, lived three miles from the Rostovs. + +"That's right, my dear," chimed in the old count, thoroughly +aroused. "I'll dress up at once and go with them. I'll make Pashette +open her eyes." + +But the countess would not agree to his going; he had had a bad +leg all these last days. It was decided that the count must not go, +but that if Louisa Ivanovna (Madame Schoss) would go with them, the +young ladies might go to the Melyukovs', Sonya, generally so timid and +shy, more urgently than anyone begging Louisa Ivanovna not to refuse. + +Sonya's costume was the best of all. Her mustache and eyebrows +were extraordinarily becoming. Everyone told her she looked very +handsome, and she was in a spirited and energetic mood unusual with +her. Some inner voice told her that now or never her fate would be +decided, and in her male attire she seemed quite a different person. +Louisa Ivanovna consented to go, and in half an hour four troyka +sleighs with large and small bells, their runners squeaking and +whistling over the frozen snow, drove up to the porch. + +Natasha was foremost in setting a merry holiday tone, which, passing +from one to another, grew stronger and reached its climax +when they all came out into the frost and got into the sleighs, +talking, calling to one another, laughing, and shouting. + +Two of the troykas were the usual household sleighs, the third was +the old count's with a trotter from the Orlov stud as shaft horse, the +fourth was Nicholas' own with a short shaggy black shaft horse. +Nicholas, in his old lady's dress over which he had belted his +hussar overcoat, stood in the middle of the sleigh, reins in hand. + +It was so light that he could see the moonlight reflected from the +metal harness disks and from the eyes of the horses, who looked +round in alarm at the noisy party under the shadow of the porch roof. + +Natasha, Sonya, Madame Schoss, and two maids got into Nicholas' +sleigh; Dimmler, his wife, and Petya, into the old count's, and the +rest of the mummers seated themselves in the other two sleighs. + +"You go ahead, Zakhar!" shouted Nicholas to his father's coachman, +wishing for a chance to race past him. + +The old count's troyka, with Dimmler and his party, started forward, +squeaking on its runners as though freezing to the snow, its +deep-toned bell clanging. The side horses, pressing against the shafts +of the middle horse, sank in the snow, which was dry and glittered +like sugar, and threw it up. + +Nicholas set off, following the first sleigh; behind him the +others moved noisily, their runners squeaking. At first they drove +at a steady trot along the narrow road. While they drove past the +garden the shadows of the bare trees often fell across the road and +hid the brilliant moonlight, but as soon as they were past the +fence, the snowy plain bathed in moonlight and motionless spread out +before them glittering like diamonds and dappled with bluish +shadows. Bang, bang! went the first sleigh over a cradle hole in the +snow of the road, and each of the other sleighs jolted in the same +way, and rudely breaking the frost-bound stillness, the troykas +began to speed along the road, one after the other. + +"A hare's track, a lot of tracks!" rang out Natasha's voice +through the frost-bound air. + +"How light it is, Nicholas!" came Sonya's voice. + +Nicholas glanced round at Sonya, and bent down to see her face +closer. Quite a new, sweet face with black eyebrows and mustaches +peeped up at him from her sable furs--so close and yet so distant- +in the moonlight. + +"That used to be Sonya," thought he, and looked at her closer and +smiled. + +"What is it, Nicholas?" + +"Nothing," said he and turned again to the horses. + +When they came out onto the beaten highroad--polished by sleigh +runners and cut up by rough-shod hoofs, the marks of which were +visible in the moonlight--the horses began to tug at the reins of +their own accord and increased their pace. The near side horse, +arching his head and breaking into a short canter, tugged at his +traces. The shaft horse swayed from side to side, moving his ears as +if asking: "Isn't it time to begin now?" In front, already far ahead +the deep bell of the sleigh ringing farther and farther off, the black +horses driven by Zakhar could be clearly seen against the white +snow. From that sleigh one could hear the shouts, laughter, and voices +of the mummers. + +"Gee up, my darlings!" shouted Nicholas, pulling the reins to one +side and flourishing the whip. + +It was only by the keener wind that met them and the jerks given +by the side horses who pulled harder--ever increasing their gallop- +that one noticed how fast the troyka was flying. Nicholas looked back. +With screams squeals, and waving of whips that caused even the shaft +horses to gallop--the other sleighs followed. The shaft horse swung +steadily beneath the bow over its head, with no thought of +slackening pace and ready to put on speed when required. + +Nicholas overtook the first sleigh. They were driving downhill and +coming out upon a broad trodden track across a meadow, near a river. + +"Where are we?" thought he. "It's the Kosoy meadow, I suppose. But +no--this is something new I've never seen before. This isn't the Kosoy +meadow nor the Demkin hill, and heaven only knows what it is! It is +something new and enchanted. Well, whatever it may be..." And shouting +to his horses, he began to pass the first sleigh. + +Zakhar held back his horses and turned his face, which was already +covered with hoarfrost to his eyebrows. + +Nicholas gave the horses the rein, and Zakhar, stretching out his +arms, clucked his tongue and let his horses go. + +"Now, look out, master!" he cried. + +Faster still the two troykas flew side by side, and faster moved the +feet of the galloping side horses. Nicholas began to draw ahead. +Zakhar, while still keeping his arms extended, raised one hand with +the reins. + +"No you won't, master!" he shouted. + +Nicholas put all his horses to a gallop and passed Zakhar. The +horses showered the fine dry snow on the faces of those in the sleigh- +beside them sounded quick ringing bells and they caught confused +glimpses of swiftly moving legs and the shadows of the troyka they +were passing. The whistling sound of the runners on the snow and the +voices of girls shrieking were heard from different sides. + +Again checking his horses, Nicholas looked around him. They were +still surrounded by the magic plain bathed in moonlight and spangled +with stars. + +"Zakhar is shouting that I should turn to the left, but why to the +left?" thought Nicholas. "Are we getting to the Melyukovs'? Is this +Melyukovka? Heaven only knows where we are going, and heaven knows +what is happening to us--but it is very strange and pleasant +whatever it is." And he looked round in the sleigh. + +"Look, his mustache and eyelashes are all white!" said one of the +strange, pretty, unfamiliar people--the one with fine eyebrows and +mustache. + +"I think this used to be Natasha," thought Nicholas, "and that was +Madame Schoss, but perhaps it's not, and this Circassian with the +mustache I don't know, but I love her." + +"Aren't you cold?" he asked. + +They did not answer but began to laugh. Dimmler from the sleigh +behind shouted something--probably something funny--but they could not +make out what he said. + +"Yes, yes!" some voices answered, laughing. + +"But here was a fairy forest with black moving shadows, and a +glitter of diamonds and a flight of marble steps and the silver +roofs of fairy buildings and the shrill yells of some animals. And +if this is really Melyukovka, it is still stranger that we drove +heaven knows where and have come to Melyukovka," thought Nicholas. + +It really was Melyukovka, and maids and footmen with merry faces +came running, out to the porch carrying candles. + +"Who is it?" asked someone in the porch. + +"The mummers from the count's. I know by the horses," replied some +voices. + + + + + +CHAPTER XI + + +Pelageya Danilovna Melyukova, a broadly built, energetic woman +wearing spectacles, sat in the drawing room in a loose dress, +surrounded by her daughters whom she was trying to keep from feeling +dull. They were quietly dropping melted wax into snow and looking at +the shadows the wax figures would throw on the wall, when they heard +the steps and voices of new arrivals in the vestibule. + +Hussars, ladies, witches, clowns, and bears, after clearing their +throats and wiping the hoarfrost from their faces in the vestibule, +came into the ballroom where candles were hurriedly lighted. The +clown--Dimmler--and the lady--Nicholas--started a dance. Surrounded by +the screaming children the mummers, covering their faces and +disguising their voices, bowed to their hostess and arranged +themselves about the room. + +"Dear me! there's no recognizing them! And Natasha! See whom she +looks like! She really reminds me of somebody. But Herr Dimmler--isn't +he good! I didn't know him! And how he dances. Dear me, there's a +Circassian. Really, how becoming it is to dear Sonya. And who is that? +Well, you have cheered us up! Nikita and Vanya--clear away the tables! +And we were sitting so quietly. Ha, ha, ha!... The hussar, the hussar! +Just like a boy! And the legs!... I can't look at him..." different +voices were saying. + +Natasha, the young Melyukovs' favorite, disappeared with them into +the back rooms where a cork and various dressing gowns and male +garments were called for and received from the footman by bare girlish +arms from behind the door. Ten minutes later, all the young +Melyukovs joined the mummers. + +Pelageya Danilovna, having given orders to clear the rooms for the +visitors and arranged about refreshments for the gentry and the serfs, +went about among the mummers without removing her spectacles, +peering into their faces with a suppressed smile and failing to +recognize any of them. It was not merely Dimmler and the Rostovs she +failed to recognize, she did not even recognize her own daughters, +or her late husband's, dressing gowns and uniforms, which they had put +on. + +"And who is is this?" she asked her governess, peering into the face +of her own daughter dressed up as a Kazan-Tartar. "I suppose it is one +of the Rostovs! Well, Mr. Hussar, and what regiment do you serve +in?" she asked Natasha. "Here, hand some fruit jelly to the Turk!" she +ordered the butler who was handing things round. "That's not forbidden +by his law." + +Sometimes, as she looked at the strange but amusing capers cut by +the dancers, who--having decided once for all that being disguised, no +one would recognize them--were not at all shy, Pelageya Danilovna +hid her face in her handkerchief, and her whole stout body shook +with irrepressible, kindly, elderly laughter. + +"My little Sasha! Look at Sasha!" she said. + +After Russian country dances and chorus dances, Pelageya Danilovna +made the serfs and gentry join in one large circle: a ring, a +string, and a silver ruble were fetched and they all played games +together. + +In an hour, all the costumes were crumpled and disordered. The +corked eyebrows and mustaches were smeared over the perspiring, +flushed, and merry faces. Pelageya Danilovna began to recognize the +mummers, admired their cleverly contrived costumes, and particularly +how they suited the young ladies, and she thanked them all for +having entertained her so well. The visitors were invited to supper in +the drawing room, and the serfs had something served to them in the +ballroom. + +"Now to tell one's fortune in the empty bathhouse is frightening!" +said an old maid who lived with the Melyukovs, during supper. + +"Why?" said the eldest Melyukov girl. + +"You wouldn't go, it takes courage..." + +"I'll go," said Sonya. + +"Tell what happened to the young lady!" said the second Melyukov +girl. + +"Well," began the old maid, "a young lady once went out, took a +cock, laid the table for two, all properly, and sat down. After +sitting a while, she suddenly hears someone coming... a sleigh +drives up with harness bells; she hears him coming! He comes in, +just in the shape of a man, like an officer--comes in and sits down to +table with her." + +"Ah! ah!" screamed Natasha, rolling her eyes with horror. + +"Yes? And how... did he speak?" + +"Yes, like a man. Everything quite all right, and he began +persuading her; and she should have kept him talking till cockcrow, +but she got frightened, just got frightened and hid her face in her +hands. Then he caught her up. It was lucky the maids ran in just +then..." + +"Now, why frighten them?" said Pelageya Danilovna. + +"Mamma, you used to try your fate yourself..." said her daughter. + +"And how does one do it in a barn?" inquired Sonya. + +"Well, say you went to the barn now, and listened. It depends on +what you hear; hammering and knocking--that's bad; but a sound of +shifting grain is good and one sometimes hears that, too." + +"Mamma, tell us what happened to you in the barn." + +Pelageya Danilovna smiled. + +"Oh, I've forgotten..." she replied. "But none of you would go?" + +"Yes, I will; Pelageya Danilovna, let me! I'll go," said Sonya. + +"Well, why not, if you're not afraid?" + +"Louisa Ivanovna, may I?" asked Sonya. + +Whether they were playing the ring and string game or the ruble game +or talking as now, Nicholas did not leave Sonya's side, and gazed at +her with quite new eyes. It seemed to him that it was only today, +thanks to that burnt-cork mustache, that he had fully learned to +know her. And really, that evening, Sonya was brighter, more animated, +and prettier than Nicholas had ever seen her before. + +"So that's what she is like; what a fool I have been!" he thought +gazing at her sparkling eyes, and under the mustache a happy rapturous +smile dimpled her cheeks, a smile he had never seen before. + +"I'm not afraid of anything," said Sonya. "May I go at once?" She +got up. + +They told her where the barn was and how she should stand and +listen, and they handed her a fur cloak. She threw this over her +head and shoulders and glanced at Nicholas. + +"What a darling that girl is!" thought he. "And what have I been +thinking of till now?" + +Sonya went out into the passage to go to the barn. Nicholas went +hastily to the front porch, saying he felt too hot. The crowd of +people really had made the house stuffy. + +Outside, there was the same cold stillness and the same moon, but +even brighter than before. The light was so strong and the snow +sparkled with so many stars that one did not wish to look up at the +sky and the real stars were unnoticed. The sky was black and dreary, +while the earth was gay. + +"I am a fool, a fool! what have I been waiting for?" thought +Nicholas, and running out from the porch he went round the corner of +the house and along the path that led to the back porch. He knew Sonya +would pass that way. Halfway lay some snow-covered piles of firewood +and across and along them a network of shadows from the bare old +lime trees fell on the snow and on the path. This path led to the +barn. The log walls of the barn and its snow-covered roof, that looked +as if hewn out of some precious stone, sparkled in the moonlight. A +tree in the garden snapped with the frost, and then all was again +perfectly silent. His bosom seemed to inhale not air but the +strength of eternal youth and gladness. + +From the back porch came the sound of feet descending the steps, the +bottom step upon which snow had fallen gave a ringing creak and he +heard the voice of an old maidservant saying, "Straight, straight, +along the path, Miss. Only, don't look back." + +"I am not afraid," answered Sonya's voice, and along the path toward +Nicholas came the crunching, whistling sound of Sonya's feet in her +thin shoes. + +Sonya came along, wrapped in her cloak. She was only a couple of +paces away when she saw him, and to her too he was not the Nicholas +she had known and always slightly feared. He was in a woman's dress, +with tousled hair and a happy smile new to Sonya. She ran rapidly +toward him. + +"Quite different and yet the same," thought Nicholas, looking at her +face all lit up by the moonlight. He slipped his arms under the +cloak that covered her head, embraced her, pressed her to him, and +kissed her on the lips that wore a mustache and had a smell of burnt +cork. Sonya kissed him full on the lips, and disengaging her little +hands pressed them to his cheeks. + +"Sonya!... Nicholas!"... was all they said. They ran to the barn and +then back again, re-entering, he by the front and she by the back +porch. + + + + + +CHAPTER XII + + +When they all drove back from Pelageya Danilovna's, Natasha, who +always saw and noticed everything, arranged that she and Madame Schoss +should go back in the sleigh with Dimmler, and Sonya with Nicholas and +the maids. + +On the way back Nicholas drove at a steady pace instead of racing +and kept peering by that fantastic all-transforming light into Sonya's +face and searching beneath the eyebrows and mustache for his former +and his present Sonya from whom he had resolved never to be parted +again. He looked and recognizing in her both the old and the new +Sonya, and being reminded by the smell of burnt cork of the +sensation of her kiss, inhaled the frosty air with a full breast +and, looking at the ground flying beneath him and at the sparkling +sky, felt himself again in fairyland. + +"Sonya, is it well with thee?" he asked from time to time. + +"Yes!" she replied. "And with thee?" + +When halfway home Nicholas handed the reins to the coachman and +ran for a moment to Natasha's sleigh and stood on its wing. + +"Natasha!" he whispered in French, "do you know I have made up my +mind about Sonya?" + +"Have you told her?" asked Natasha, suddenly beaming all over with +joy. + +"Oh, how strange you are with that mustache and those eyebrows!... +Natasha--are you glad?" + +"I am so glad, so glad! I was beginning to be vexed with you. I +did not tell you, but you have been treating her badly. What a heart +she has, Nicholas! I am horrid sometimes, but I was ashamed to be +happy while Sonya was not," continued Natasha. "Now I am so glad! +Well, run back to her." + +"No, wait a bit.... Oh, how funny you look!" cried Nicholas, peering +into her face and finding in his sister too something new, unusual, +and bewitchingly tender that he had not seen in her before. +"Natasha, it's magical, isn't it?" + +"Yes," she replied. "You have done splendidly." + +"Had I seen her before as she is now," thought Nicholas, "I should +long ago have asked her what to do and have done whatever she told me, +and all would have been well." + +"So you are glad and I have done right?" + +"Oh, quite right! I had a quarrel with Mamma some time ago about it. +Mamma said she was angling for you. How could she say such a thing! +I nearly stormed at Mamma. I will never let anyone say anything bad of +Sonya, for there is nothing but good in her." + +"Then it's all right?" said Nicholas, again scrutinizing the +expression of his sister's face to see if she was in earnest. Then +he jumped down and, his boots scrunching the snow, ran back to his +sleigh. The same happy, smiling Circassian, with mustache and +beaming eyes looking up from under a sable hood, was still sitting +there, and that Circassian was Sonya, and that Sonya was certainly his +future happy and loving wife. + +When they reached home and had told their mother how they had +spent the evening at the Melyukovs', the girls went to their +bedroom. When they had undressed, but without washing off the cork +mustaches, they sat a long time talking of their happiness. They +talked of how they would live when they were married, how their +husbands would be friends, and how happy they would be. On Natasha's +table stood two looking glasses which Dunyasha had prepared +beforehand. + +"Only when will all that be? I am afraid never.... It would be too +good!" said Natasha, rising and going to the looking glasses. + +"Sit down, Natasha; perhaps you'll see him," said Sonya. + +Natasha lit the candles, one on each side of one of the looking +glasses, and sat down. + +"I see someone with a mustache," said Natasha, seeing her own face. + +"You mustn't laugh, Miss," said Dunyasha. + +With Sonya's help and the maid's, Natasha got the glass she held +into the right position opposite the other; her face assumed a serious +expression and she sat silent. She sat a long time looking at the +receding line of candles reflected in the glasses and expecting +(from tales she had heard) to see a coffin, or him, Prince Andrew, +in that last dim, indistinctly outlined square. But ready as she was +to take the smallest speck for the image of a man or of a coffin, +she saw nothing. She began blinking rapidly and moved away from the +looking glasses. + +"Why is it others see things and I don't?" she said. "You sit down +now, Sonya. You absolutely must, tonight! Do it for me.... Today I +feel so frightened!" + +Sonya sat down before the glasses, got the right position, and began +looking. + +"Now, Miss Sonya is sure to see something," whispered Dunyasha; +"while you do nothing but laugh." + +Sonya heard this and Natasha's whisper: + +"I know she will. She saw something last year." + +For about three minutes all were silent. + +"Of course she will!" whispered Natasha, but did not finish... +suddenly Sonya pushed away the glass she was holding and covered her +eyes with her hand. + +"Oh, Natasha!" she cried. + +"Did you see? Did you? What was it?" exclaimed Natasha, holding up +the looking glass. + +Sonya had not seen anything, she was just wanting to blink and to +get up when she heard Natasha say, "Of course she will!" She did not +wish to disappoint either Dunyasha or Natasha, but it was hard to +sit still. She did not herself know how or why the exclamation escaped +her when she covered her eyes. + +"You saw him?" urged Natasha, seizing her hand. + +"Yes. Wait a bit... I... saw him," Sonya could not help saying, +not yet knowing whom Natasha meant by him, Nicholas or Prince Andrew. + +"But why shouldn't I say I saw something? Others do see! Besides who +can tell whether I saw anything or not?" flashed through Sonya's mind. + +"Yes, I saw him," she said. + +"How? Standing or lying?" + +"No, I saw... At first there was nothing, then I saw him lying +down." + +"Andrew lying? Is he ill?" asked Natasha, her frightened eyes +fixed on her friend. + +"No, on the contrary, on the contrary! His face was cheerful, and he +turned to me." And when saying this she herself fancied she had really +seen what she described. + +"Well, and then, Sonya?..." + +"After that, I could not make out what there was; something blue and +red..." + +"Sonya! When will he come back? When shall I see him! O, God, how +afraid I am for him and for myself and about everything!..." Natasha +began, and without replying to Sonya's words of comfort she got into +bed, and long after her candle was out lay open-eyed and motionless, +gazing at the moonlight through the frosty windowpanes. + + + + + +CHAPTER XIII + + +Soon after the Christmas holidays Nicholas told his mother of his +love for Sonya and of his firm resolve to marry her. The countess, who +had long noticed what was going on between them and was expecting this +declaration, listened to him in silence and then told her son that +he might marry whom he pleased, but that neither she nor his father +would give their blessing to such a marriage. Nicholas, for the +first time, felt that his mother was displeased with him and that, +despite her love for him, she would not give way. Coldly, without +looking at her son, she sent for her husband and, when he came, +tried briefly and coldly to inform him of the facts, in her son's +presence, but unable to restrain herself she burst into tears of +vexation and left the room. The old count began irresolutely to +admonish Nicholas and beg him to abandon his purpose. Nicholas replied +that he could not go back on his word, and his father, sighing and +evidently disconcerted, very soon became silent and went in to the +countess. In all his encounters with his son, the count was always +conscious of his own guilt toward him for having wasted the family +fortune, and so he could not be angry with him for refusing to marry +an heiress and choosing the dowerless Sonya. On this occasion, he +was only more vividly conscious of the fact that if his affairs had +not been in disorder, no better wife for Nicholas than Sonya could +have been wished for, and that no one but himself with his Mitenka and +his uncomfortable habits was to blame for the condition of the +family finances. + +The father and mother did not speak of the matter to their son +again, but a few days later the countess sent for Sonya and, with a +cruelty neither of them expected, reproached her niece for trying to +catch Nicholas and for ingratitude. Sonya listened silently with +downcast eyes to the countess' cruel words, without understanding what +was required of her. She was ready to sacrifice everything for her +benefactors. Self-sacrifice was her most cherished idea but in this +case she could not see what she ought to sacrifice, or for whom. She +could not help loving the countess and the whole Rostov family, but +neither could she help loving Nicholas and knowing that his +happiness depended on that love. She was silent and sad and did not +reply. Nicholas felt the situation to be intolerable and went to +have an explanation with his mother. He first implored her to +forgive him and Sonya and consent to their marriage, then he +threatened that if she molested Sonya he would at once marry her +secretly. + +The countess, with a coldness her son had never seen in her +before, replied that he was of age, that Prince Andrew was marrying +without his father's consent, and he could do the same, but that she +would never receive that intriguer as her daughter. + +Exploding at the word intriguer, Nicholas, raising his voice, told +his mother he had never expected her to try to force him to sell his +feelings, but if that were so, he would say for the last time.... +But he had no time to utter the decisive word which the expression +of his face caused his mother to await with terror, and which would +perhaps have forever remained a cruel memory to them both. He had +not time to say it, for Natasha, with a pale and set face, entered the +room from the door at which she had been listening. + +"Nicholas, you are talking nonsense! Be quiet, be quiet, be quiet, I +tell you!..." she almost screamed, so as to drown his voice. + +"Mamma darling, it's not at all so... my poor, sweet darling," she +said to her mother, who conscious that they had been on the brink of a +rupture gazed at her son with terror, but in the obstinacy and +excitement of the conflict could not and would not give way. + +"Nicholas, I'll explain to you. Go away! Listen, Mamma darling," +said Natasha. + +Her words were incoherent, but they attained the purpose at which +she was aiming. + +The countess, sobbing heavily, hid her face on her daughter's +breast, while Nicholas rose, clutching his head, and left the room. + +Natasha set to work to effect a reconciliation, and so far succeeded +that Nicholas received a promise from his mother that Sonya should not +be troubled, while he on his side promised not to undertake anything +without his parents' knowledge. + +Firmly resolved, after putting his affairs in order in the regiment, +to retire from the army and return and marry Sonya, Nicholas, serious, +sorrowful, and at variance with his parents, but, as it seemed to him, +passionately in love, left at the beginning of January to rejoin his +regiment. + +After Nicholas had gone things in the Rostov household were more +depressing than ever, and the countess fell ill from mental agitation. + +Sonya was unhappy at the separation from Nicholas and still more +so on account of the hostile tone the countess could not help adopting +toward her. The count was more perturbed than ever by the condition of +his affairs, which called for some decisive action. Their town house +and estate near Moscow had inevitably to be sold, and for this they +had to go to Moscow. But the countess' health obliged them to delay +their departure from day to day. + +Natasha, who had borne the first period of separation from her +betrothed lightly and even cheerfully, now grew more agitated and +impatient every day. The thought that her best days, which she would +have employed in loving him, were being vainly wasted, with no +advantage to anyone, tormented her incessantly. His letters for the +most part irritated her. It hurt her to think that while she lived +only in the thought of him, he was living a real life, seeing new +places and new people that interested him. The more interesting his +letters were the more vexed she felt. Her letters to him, far from +giving her any comfort, seemed to her a wearisome and artificial +obligation. She could not write, because she could not conceive the +possibility of expressing sincerely in a letter even a thousandth part +of what she expressed by voice, smile, and glance. She wrote to him +formal, monotonous, and dry letters, to which she attached no +importance herself, and in the rough copies of which the countess +corrected her mistakes in spelling. + +There was still no improvement in the countess' health, but it was +impossible to defer the journey to Moscow any longer. Natasha's +trousseau had to be ordered and the house sold. Moreover, Prince +Andrew was expected in Moscow, where old Prince Bolkonski was spending +the winter, and Natasha felt sure he had already arrived. + +So the countess remained in the country, and the count, taking Sonya +and Natasha with him, went to Moscow at the end of January. + + + + +BOOK EIGHT: 1811 --12 + + + + + +CHAPTER I + + +After Prince Andrews engagement to Natasha, Pierre without any +apparent cause suddenly felt it impossible to go on living as +before. Firmly convinced as he was of the truths revealed to him by +his benefactor, and happy as he had been in perfecting his inner +man, to which he had devoted himself with such ardor--all the zest +of such a life vanished after the engagement of Andrew and Natasha and +the death of Joseph Alexeevich, the news of which reached him almost +at the same time. Only the skeleton of life remained: his house, a +brilliant wife who now enjoyed the favors of a very important +personage, acquaintance with all Petersburg, and his court service +with its dull formalities. And this life suddenly seemed to Pierre +unexpectedly loathsome. He ceased keeping a diary, avoided the company +of the Brothers, began going to the Club again, drank a great deal, +and came once more in touch with the bachelor sets, leading such a +life that the Countess Helene thought it necessary to speak severely +to him about it. Pierre felt that she right, and to avoid compromising +her went away to Moscow. + +In Moscow as soon as he entered his huge house in which the faded +and fading princesses still lived, with its enormous retinue; as +soon as, driving through the town, he saw the Iberian shrine with +innumerable tapers burning before the golden covers of the icons, +the Kremlin Square with its snow undisturbed by vehicles, the sleigh +drivers and hovels of the Sivtsev Vrazhok, those old Moscovites who +desired nothing, hurried nowhere, and were ending their days +leisurely; when he saw those old Moscow ladies, the Moscow balls, +and the English Club, he felt himself at home in a quiet haven. In +Moscow he felt at peace, at home, warm and dirty as in an old dressing +gown. + +Moscow society, from the old women down to the children, received +Pierre like a long-expected guest whose place was always ready +awaiting him. For Moscow society Pierre was the nicest, kindest, +most intellectual, merriest, and most magnanimous of cranks, a +heedless, genial nobleman of the old Russian type. His purse was +always empty because it was open to everyone. + +Benefit performances, poor pictures, statues, benevolent +societies, gypsy choirs, schools, subscription dinners, sprees, +Freemasons, churches, and books--no one and nothing met with a refusal +from him, and had it not been for two friends who had borrowed large +sums from him and taken him under their protection, he would have +given everything away. There was never a dinner or soiree at the +Club without him. As soon as he sank into his place on the sofa +after two bottles of Margaux he was surrounded, and talking, +disputing, and joking began. When there were quarrels, his kindly +smile and well-timed jests reconciled the antagonists. The Masonic +dinners were dull and dreary when he was not there. + +When after a bachelor supper he rose with his amiable and kindly +smile, yielding to the entreaties of the festive company to drive +off somewhere with them, shouts of delight and triumph arose among the +young men. At balls he danced if a partner was needed. Young ladies, +married and unmarried, liked him because without making love to any of +them, he was equally amiable to all, especially after supper. "Il +est charmant; il n'a pas de sexe,"* they said of him. + + +*"He is charming; he has no sex." + + +Pierre was one of those retired gentlemen-in-waiting of whom there +were hundreds good-humoredly ending their days in Moscow. + +How horrified he would have been seven years before, when he first +arrived from abroad, had he been told that there was no need for him +to seek or plan anything, that his rut had long been shaped, eternally +predetermined, and that wriggle as he might, he would be what all in +his position were. He could not have believed it! Had he not at one +time longed with all his heart to establish a republic in Russia; then +himself to be a Napoleon; then to be a philosopher; and then a +strategist and the conqueror of Napoleon? Had he not seen the +possibility of, and passionately desired, the regeneration of the +sinful human race, and his own progress to the highest degree of +perfection? Had he not established schools and hospitals and liberated +his serfs? + +But instead of all that--here he was, the wealthy husband of an +unfaithful wife, a retired gentleman-in-waiting, fond of eating and +drinking and, as he unbuttoned his waistcoat, of abusing the +government a bit, a member of the Moscow English Club, and a universal +favorite in Moscow society. For a long time he could not reconcile +himself to the idea that he was one of those same retired Moscow +gentlemen-in-waiting he had so despised seven years before. + +Sometimes he consoled himself with the thought that he was only +living this life temporarily; but then he was shocked by the thought +of how many, like himself, had entered that life and that Club +temporarily, with all their teeth and hair, and had only left it +when not a single tooth or hair remained. + +In moments of pride, when he thought of his position it seemed to +him that he was quite different and distinct from those other +retired gentlemen-in-waiting he had formerly despised: they were +empty, stupid, contented fellows, satisfied with their position, +"while I am still discontented and want to do something for mankind. +But perhaps all these comrades of mine struggled just like me and +sought something new, a path in life of their own, and like me were +brought by force of circumstances, society, and race--by that +elemental force against which man is powerless--to the condition I +am in," said he to himself in moments of humility; and after living +some time in Moscow he no longer despised, but began to grow fond +of, to respect, and to pity his comrades in destiny, as he pitied +himself. + +Pierre longer suffered moments of despair, hypochondria, and disgust +with life, but the malady that had formerly found expression in such +acute attacks was driven inwards and never left him for a moment. +"What for? Why? What is going on in the world?" he would ask himself +in perplexity several times a day, involuntarily beginning to +reflect anew on the meaning of the phenomena of life; but knowing by +experience that there were no answers to these questions he made haste +to turn away from them, and took up a book, or hurried of to the +Club or to Apollon Nikolaevich's, to exchange the gossip of the town. + +"Helene, who has never cared for anything but her own body and is +one of the stupidest women in the world," thought Pierre, "is regarded +by people as the acme of intelligence and refinement, and they pay +homage to her. Napoleon Bonaparte was despised by all as long as he +was great, but now that he has become a wretched comedian the +Emperor Francis wants to offer him his daughter in an illegal +marriage. The Spaniards, through the Catholic clergy, offer praise +to God for their victory over the French on the fourteenth of June, +and the French, also through the Catholic clergy, offer praise because +on that same fourteenth of June they defeated the Spaniards. My +brother Masons swear by the blood that they are ready to sacrifice +everything for their neighbor, but they do not give a ruble each to +the collections for the poor, and they intrigue, the Astraea Lodge +against the Manna Seekers, and fuss about an authentic Scotch carpet +and a charter that nobody needs, and the meaning of which the very man +who wrote it does not understand. We all profess the Christian law +of forgiveness of injuries and love of our neighbors, the law in honor +of which we have built in Moscow forty times forty churches--but +yesterday a deserter was knouted to death and a minister of that +same law of love and forgiveness, a priest, gave the soldier a cross +to kiss before his execution." So thought Pierre, and the whole of +this general deception which everyone accepts, accustomed as he was to +it, astonished him each time as if it were something new. "I +understand the deception and confusion," he thought, "but how am I +to tell them all that I see? I have tried, and have always found +that they too in the depths of their souls understand it as I do, +and only try not to see it. So it appears that it must be so! But I- +what is to become of me?" thought he. He had the unfortunate +capacity many men, especially Russians, have of seeing and believing +in the possibility of goodness and truth, but of seeing the evil and +falsehood of life too clearly to be able to take a serious part in it. +Every sphere of work was connected, in his eyes, with evil and +deception. Whatever he tried to be, whatever he engaged in, the evil +and falsehood of it repulsed him and blocked every path of activity. +Yet he had to live and to find occupation. It was too dreadful to be +under the burden of these insoluble problems, so he abandoned +himself to any distraction in order to forget them. He frequented +every kind of society, drank much, bought pictures, engaged in +building, and above all--read. + +He read, and read everything that came to hand. On coming home, +while his valets were still taking off his things, he picked up a book +and began to read. From reading he passed to sleeping, from sleeping +to gossip in drawing rooms of the Club, from gossip to carousals and +women; from carousals back to gossip, reading, and wine. Drinking +became more and more a physical and also a moral necessity. Though the +doctors warned him that with his corpulence wine was dangerous for +him, he drank a great deal. He was only quite at ease when having +poured several glasses of wine mechanically into his large mouth he +felt a pleasant warmth in his body, an amiability toward all his +fellows, and a readiness to respond superficially to every idea +without probing it deeply. Only after emptying a bottle or two did +he feel dimly that the terribly tangled skein of life which previously +had terrified him was not as dreadful as he had thought. He was always +conscious of some aspect of that skein, as with a buzzing in his +head after dinner or supper he chatted or listened to conversation +or read. But under the influence of wine he said to himself: "It +doesn't matter. I'll get it unraveled. I have a solution ready, but +have no time now--I'll think it all out later on!" But the later on +never came. + +In the morning, on an empty stomach, all the old questions +appeared as insoluble and terrible as ever, and Pierre hastily +picked up a book, and if anyone came to see him he was glad. + +Sometimes he remembered how he had heard that soldiers in war when +entrenched under the enemy's fire, if they have nothing to do, try +hard to find some occupation the more easily to bear the danger. To +Pierre all men seemed like those soldiers, seeking refuge from life: +some in ambition, some in cards, some in framing laws, some in +women, some in toys, some in horses, some in politics, some in +sport, some in wine, and some in governmental affairs. "Nothing is +trivial, and nothing is important, it's all the same--only to save +oneself from it as best one can," thought Pierre. "Only not to see it, +that dreadful it!" + + + + + +CHAPTER II + + +At the beginning of winter Prince Nicholas Bolkonski and his +daughter moved to Moscow. At that time enthusiasm for the Emperor +Alexander's regime had weakened and a patriotic and anti-French +tendency prevailed there, and this, together with his past and his +intellect and his originality, at once made Prince Nicholas +Bolkonski an object of particular respect to the Moscovites and the +center of the Moscow opposition to the government. + +The prince had aged very much that year. He showed marked signs of +senility by a tendency to fall asleep, forgetfulness of quite recent +events, remembrance of remote ones, and the childish vanity with which +he accepted the role of head of the Moscow opposition. In spite of +this the old man inspired in all his visitors alike a feeling of +respectful veneration--especially of an evening when he came in to tea +in his old-fashioned coat and powdered wig and, aroused by anyone, +told his abrupt stories of the past, or uttered yet more abrupt and +scathing criticisms of the present. For them all, that old-fashioned +house with its gigantic mirrors, pre-Revolution furniture, powdered +footmen, and the stern shrewd old man (himself a relic of the past +century) with his gentle daughter and the pretty Frenchwoman who +were reverently devoted to him presented a majestic and agreeable +spectacle. But the visitors did not reflect that besides the couple of +hours during which they saw their host, there were also twenty-two +hours in the day during which the private and intimate life of the +house continued. + +Latterly that private life had become very trying for Princess Mary. +There in Moscow she was deprived of her greatest pleasures--talks with +the pilgrims and the solitude which refreshed her at Bald Hills--and +she had none of the advantages and pleasures of city life. She did not +go out into society; everyone knew that her father would not let her +go anywhere without him, and his failing health prevented his going +out himself, so that she was not invited to dinners and evening +parties. She had quite abandoned the hope of getting married. She +saw the coldness and malevolence with which the old prince received +and dismissed the young men, possible suitors, who sometimes +appeared at their house. She had no friends: during this visit to +Moscow she had been disappointed in the two who had been nearest to +her. Mademoiselle Bourienne, with whom she had never been able to be +quite frank, had now become unpleasant to her, and for various reasons +Princess Mary avoided her. Julie, with whom she had corresponded for +the last five years, was in Moscow, but proved to be quite alien to +her when they met. Just then Julie, who by the death of her brothers +had become one of the richest heiresses in Moscow, was in the full +whirl of society pleasures. She was surrounded by young men who, she +fancied, had suddenly learned to appreciate her worth. Julie was at +that stage in the life of a society woman when she feels that her last +chance of marrying has come and that her fate must be decided now or +never. On Thursdays Princess Mary remembered with a mournful smile +that she now had no one to write to, since Julie--whose presence +gave her no pleasure was here and they met every week. Like the old +emigre who declined to marry the lady with whom he had spent his +evenings for years, she regretted Julie's presence and having no one +to write to. In Moscow Princess Mary had no one to talk to, no one +to whom to confide her sorrow, and much sorrow fell to her lot just +then. The time for Prince Andrew's return and marriage was +approaching, but his request to her to prepare his father for it had +not been carried out; in fact, it seemed as if matters were quite +hopeless, for at every mention of the young Countess Rostova the old +prince (who apart from that was usually in a bad temper) lost +control of himself. Another lately added sorrow arose from the lessons +she gave her six year-old nephew. To her consternation she detected in +herself in relation to little Nicholas some symptoms of her father's +irritability. However often she told herself that she must not get +irritable when teaching her nephew, almost every time that, pointer in +hand, she sat down to show him the French alphabet, she so longed to +pour her own knowledge quickly and easily into the child--who was +already afraid that Auntie might at any moment get angry--that at +his slightest inattention she trembled, became flustered and heated, +raised her voice, and sometimes pulled him by the arm and put him in +the corner. Having put him in the corner she would herself begin to +cry over her cruel, evil nature, and little Nicholas, following her +example, would sob, and without permission would leave his corner, +come to her, pull her wet hands from her face, and comfort her. But +what distressed the princess most of all was her father's +irritability, which was always directed against her and had of late +amounted to cruelty. Had he forced her to prostrate herself to the +ground all night, had he beaten her or made her fetch wood or water, +it would never have entered her mind to think her position hard; but +this loving despot--the more cruel because he loved her and for that +reason tormented himself and her--knew how not merely to hurt and +humiliate her deliberately, but to show her that she was always to +blame for everything. Of late he had exhibited a new trait that +tormented Princess Mary more than anything else; this was his +ever-increasing intimacy with Mademoiselle Bourienne. The idea that at +the first moment of receiving the news of his son's intentions had +occurred to him in jest--that if Andrew got married he himself would +marry Bourienne--had evidently pleased him, and latterly he had +persistently, and as it seemed to Princess Mary merely to offend +her, shown special endearments to the companion and expressed his +dissatisfaction with his daughter by demonstrations of love of +Bourienne. + +One day in Moscow in Princess Mary's presence (she thought her +father did it purposely when she was there) the old prince kissed +Mademoiselle Bourienne's hand and, drawing her to him, embraced her +affectionately. Princess Mary flushed and ran out of the room. A few +minutes later Mademoiselle Bourienne came into Princess Mary's room +smiling and making cheerful remarks in her agreeable voice. Princess +Mary hastily wiped away her tears, went resolutely up to +Mademoiselle Bourienne, and evidently unconscious of what she was +doing began shouting in angry haste at the Frenchwoman, her voice +breaking: "It's horrible, vile, inhuman, to take advantage of the +weakness..." She did not finish. "Leave my room," she exclaimed, and +burst into sobs. + +Next day the prince did not say a word to his daughter, but she +noticed that at dinner he gave orders that Mademoiselle Bourienne +should be served first. After dinner, when the footman handed coffee +and from habit began with the princess, the prince suddenly grew +furious, threw his stick at Philip, and instantly gave instructions to +have him conscripted for the army. + +"He doesn't obey... I said it twice... and he doesn't obey! She is +the first person in this house; she's my best friend," cried the +prince. "And if you allow yourself," he screamed in a fury, addressing +Princess Mary for the first time, "to forget yourself again before her +as you dared to do yesterday, I will show you who is master in this +house. Go! Don't let me set eyes on you; beg her pardon!" + +Princess Mary asked Mademoiselle Bourienne's pardon, and also her +father's pardon for herself and for Philip the footman, who had begged +for her intervention. + +At such moments something like a pride of sacrifice gathered in +her soul. And suddenly that father whom she had judged would look +for his spectacles in her presence, fumbling near them and not +seeing them, or would forget something that had just occurred, or take +a false step with his failing legs and turn to see if anyone had +noticed his feebleness, or, worst of all, at dinner when there were no +visitors to excite him would suddenly fall asleep, letting his +napkin drop and his shaking head sink over his plate. "He is old and +feeble, and I dare to condemn him!" she thought at such moments, +with a feeling of revulsion against herself. + + + + + +CHAPTER III + + +In 1811 there was living in Moscow a French doctor--Metivier--who +had rapidly become the fashion. He was enormously tall, handsome, +amiable as Frenchmen are, and was, as all Moscow said, an +extraordinarily clever doctor. He was received in the best houses +not merely as a doctor, but as an equal. + +Prince Nicholas had always ridiculed medicine, but latterly on +Mademoiselle Bourienne's advice had allowed this doctor to visit him +and had grown accustomed to him. Metivier came to see the prince about +twice a week. + +On December 6--St. Nicholas' Day and the prince's name day--all +Moscow came to the prince's front door but he gave orders to admit +no one and to invite to dinner only a small number, a list of whom +he gave to Princess Mary. + +Metivier, who came in the morning with his felicitations, considered +it proper in his quality of doctor de forcer la consigne,* as he +told Princess Mary, and went in to see the prince. It happened that on +that morning of his name day the prince was in one of his worst moods. +He had been going about the house all the morning finding fault with +everyone and pretending not to understand what was said to him and not +to be understood himself. Princess Mary well knew this mood of quiet +absorbed querulousness, which generally culminated in a burst of rage, +and she went about all that morning as though facing a cocked and +loaded gun and awaited the inevitable explosion. Until the doctor's +arrival the morning had passed off safely. After admitting the doctor, +Princess Mary sat down with a book in the drawing room near the door +through which she could hear all that passed in the study. + + +*To force the guard. + + +At first she heard only Metivier's voice, then her father's, then +both voices began speaking at the same time, the door was flung +open, and on the threshold appeared the handsome figure of the +terrified Metivier with his shock of black hair, and the prince in his +dressing gown and fez, his face distorted with fury and the pupils +of his eyes rolled downwards. + +"You don't understand?" shouted the prince, "but I do! French spy, +slave of Buonaparte, spy, get out of my house! Be off, I tell you..." + +Metivier, shrugging his shoulders, went up to Mademoiselle Bourienne +who at the sound of shouting had run in from an adjoining room. + +"The prince is not very well: bile and rush of blood to the head. +Keep calm, I will call again tomorrow," said Metivier; and putting his +fingers to his lips he hastened away. + +Through the study door came the sound of slippered feet and the cry: +"Spies, traitors, traitors everywhere! Not a moment's peace in my +own house!" + +After Metivier's departure the old prince called his daughter in, +and the whole weight of his wrath fell on her. She was to blame that a +spy had been admitted. Had he not told her, yes, told her to make a +list, and not to admit anyone who was not on that list? Then why was +that scoundrel admitted? She was the cause of it all. With her, he +said, he could not have a moment's peace and could not die quietly. + +"No, ma'am! We must part, we must part! Understand that, +understand it! I cannot endure any more," he said, and left the +room. Then, as if afraid she might find some means of consolation, +he returned and trying to appear calm added: "And don't imagine I have +said this in a moment of anger. I am calm. I have thought it over, and +it will be carried out--we must part; so find some place for +yourself...." But he could not restrain himself and with the virulence +of which only one who loves is capable, evidently suffering himself, +he shook his fists at her and screamed: + +"If only some fool would marry her!" Then he slammed the door, +sent for Mademoiselle Bourienne, and subsided into his study. + +At two o'clock the six chosen guests assembled for dinner. + +These guests--the famous Count Rostopchin, Prince Lopukhin with +his nephew, General Chatrov an old war comrade of the prince's, and of +the younger generation Pierre and Boris Drubetskoy--awaited the prince +in the drawing room. + +Boris, who had come to Moscow on leave a few days before, had been +anxious to be presented to Prince Nicholas Bolkonski, and had +contrived to ingratiate himself so well that the old prince in his +case made an exception to the rule of not receiving bachelors in his +house. + +The prince's house did not belong to what is known as fashionable +society, but his little circle--though not much talked about in +town--was one it was more flattering to be received in than any other. +Boris had realized this the week before when the commander in chief in +his presence invited Rostopchin to dinner on St. Nicholas' Day, and +Rostopchin had replied that he could not come: + +"On that day I always go to pay my devotions to the relics of Prince +Nicholas Bolkonski." + +"Oh, yes, yes!" replied the commander in chief. "How is he?..." + +The small group that assembled before dinner in the lofty +old-fashioned drawing room with its old furniture resembled the solemn +gathering of a court of justice. All were silent or talked in low +tones. Prince Nicholas came in serious and taciturn. Princess Mary +seemed even quieter and more diffident than usual. The guests were +reluctant to address her, feeling that she was in no mood for their +conversation. Count Rostopchin alone kept the conversation going, +now relating the latest town news, and now the latest political +gossip. + +Lopukhin and the old general occasionally took part in the +conversation. Prince Bolkonski listened as a presiding judge +receives a report, only now and then, silently or by a brief word, +showing that he took heed of what was being reported to him. The +tone of the conversation was such as indicated that no one approved of +what was being done in the political world. Incidents were related +evidently confirming the opinion that everything was going from bad to +worse, but whether telling a story or giving an opinion the speaker +always stopped, or was stopped, at the point beyond which his +criticism might touch the sovereign himself. + +At dinner the talk turned on the latest political news: Napoleon's +seizure of the Duke of Oldenburg's territory, and the Russian Note, +hostile to Napoleon, which had been sent to all the European courts. + +"Bonaparte treats Europe as a pirate does a captured vessel," said +Count Rostopchin, repeating a phrase he had uttered several times +before. "One only wonders at the long-suffering or blindness of the +crowned heads. Now the Pope's turn has come and Bonaparte doesn't +scruple to depose the head of the Catholic Church--yet all keep +silent! Our sovereign alone has protested against the seizure of the +Duke of Oldenburg's territory, and even..." Count Rostopchin paused, +feeling that he had reached the limit beyond which censure was +impossible. + +"Other territories have been offered in exchange for the Duchy of +Oldenburg," said Prince Bolkonski. "He shifts the Dukes about as I +might move my serfs from Bald Hills to Bogucharovo or my Ryazan +estates." + +"The Duke of Oldenburg bears his misfortunes with admirable strength +of character and resignation," remarked Boris, joining in +respectfully. + +He said this because on his journey from Petersburg he had had the +honor of being presented to the Duke. Prince Bolkonski glanced at +the young man as if about to say something in reply, but changed his +mind, evidently considering him too young. + +"I have read our protests about the Oldenburg affair and was +surprised how badly the Note was worded," remarked Count Rostopchin in +the casual tone of a man dealing with a subject quite familiar to him. + +Pierre looked at Rostopchin with naive astonishment, not +understanding why he should be disturbed by the bad composition of the +Note. + +"Does it matter, Count, how the Note is worded," he asked, "so +long as its substance is forcible?" + +"My dear fellow, with our five hundred thousand troops it should +be easy to have a good style," returned Count Rostopchin. + +Pierre now understood the count's dissatisfaction with the wording +of the Note. + +"One would have thought quill drivers enough had sprung up," +remarked the old prince. "There in Petersburg they are always writing- +not notes only but even new laws. My Andrew there has written a +whole volume of laws for Russia. Nowadays they are always writing!" +and he laughed unnaturally. + +There was a momentary pause in the conversation; the old general +cleared his throat to draw attention. + +"Did you hear of the last event at the review in Petersburg? The +figure cut by the new French ambassador." + +"Eh? Yes, I heard something: he said something awkward in His +Majesty's presence." + +"His Majesty drew attention to the Grenadier division and to the +march past," continued the general, "and it seems the ambassador +took no notice and allowed himself to reply that: 'We in France pay no +attention to such trifles!' The Emperor did not condescend to reply. +At the next review, they say, the Emperor did not once deign to +address him." + +All were silent. On this fact relating to the Emperor personally, it +was impossible to pass any judgment. + +"Impudent fellows!" said the prince. "You know Metivier? I turned +him out of my house this morning. He was here; they admitted him spite +of my request that they should let no one in," he went on, glancing +angrily at his daughter. + +And he narrated his whole conversation with the French doctor and +the reasons that convinced him that Metivier was a spy. Though these +reasons were very insufficient and obscure, no one made any rejoinder. + +After the roast, champagne was served. The guests rose to +congratulate the old prince. Princess Mary, too, went round to him. + +He gave her a cold, angry look and offered her his wrinkled, +clean-shaven cheek to kiss. The whole expression of his face told +her that he had not forgotten the morning's talk, that his decision +remained in force, and only the presence of visitors hindered his +speaking of it to her now. + +When they went into the drawing room where coffee was served, the +old men sat together. + +Prince Nicholas grew more animated and expressed his views on the +impending war. + +He said that our wars with Bonaparte would be disastrous so long +as we sought alliances with the Germans and thrust ourselves into +European affairs, into which we had been drawn by the Peace of Tilsit. +"We ought not to fight either for or against Austria. Our political +interests are all in the East, and in regard to Bonaparte the only +thing is to have an armed frontier and a firm policy, and he will +never dare to cross the Russian frontier, as was the case in 1807!" + +"How can we fight the French, Prince?" said Count Rostopchin. "Can +we arm ourselves against our teachers and divinities? Look at our +youths, look at our ladies! The French are our Gods: Paris is our +Kingdom of Heaven." + +He began speaking louder, evidently to be heard by everyone. + +"French dresses, French ideas, French feelings! There now, you +turned Metivier out by the scruff of his neck because he is a +Frenchman and a scoundrel, but our ladies crawl after him on their +knees. I went to a party last night, and there out of five ladies +three were Roman Catholics and had the Pope's indulgence for doing +woolwork on Sundays. And they themselves sit there nearly naked, +like the signboards at our Public Baths if I may say so. Ah, when +one looks at our young people, Prince, one would like to take Peter +the Great's old cudgel out of the museum and belabor them in the +Russian way till all the nonsense jumps out of them." + +All were silent. The old prince looked at Rostopchin with a smile +and wagged his head approvingly. + +"Well, good-by, your excellency, keep well!" said Rostopchin, +getting up with characteristic briskness and holding out his hand to +the prince. + +"Good-by, my dear fellow.... His words are music, I never tire of +hearing him!" said the old prince, keeping hold of the hand and +offering his cheek to be kissed. + +Following Rostopchin's example the others also rose. + + + + + +CHAPTER IV + + +Princess Mary as she sat listening to the old men's talk and +faultfinding, understood nothing of what she heard; she only +wondered whether the guests had all observed her father's hostile +attitude toward her. She did not even notice the special attentions +and amiabilities shown her during dinner by Boris Drubetskoy, who +was visiting them for the third time already. + +Princess Mary turned with absent-minded questioning look to +Pierre, who hat in hand and with a smile on his face was the last of +the guests to approach her after the old prince had gone out and +they were left alone in the drawing room. + +"May I stay a little longer?" he said, letting his stout body sink +into an armchair beside her. + +"Oh yes," she answered. "You noticed nothing?" her look asked. + +Pierre was in an agreeable after-dinner mood. He looked straight +before him and smiled quietly. + +"Have you known that young man long, Princess?" he asked. + +"Who?" + +"Drubetskoy." + +"No, not long..." + +"Do you like him?" + +"Yes, he is an agreeable young man.... Why do you ask me that?" said +Princess Mary, still thinking of that morning's conversation with +her father. + +"Because I have noticed that when a young man comes on leave from +Petersburg to Moscow it is usually with the object of marrying an +heiress." + +"You have observed that?" said Princess Mary. + +"Yes," returned Pierre with a smile, "and this young man now manages +matters so that where there is a wealthy heiress there he is too. I +can read him like a book. At present he is hesitating whom to lay +siege to--you or Mademoiselle Julie Karagina. He is very attentive +to her." + +"He visits them?" + +"Yes, very often. And do you know the new way of courting?" said +Pierre with an amused smile, evidently in that cheerful mood of good +humored raillery for which he so often reproached himself in his +diary. + +"No," replied Princess Mary. + +"To please Moscow girls nowadays one has to be melancholy. He is +very melancholy with Mademoiselle Karagina," said Pierre. + +"Really?" asked Princess Mary, looking into Pierre's kindly face and +still thinking of her own sorrow. "It would be a relief," thought she, +"if I ventured to confide what I am feeling to someone. I should +like to tell everything to Pierre. He is kind and generous. It would +be a relief. He would give me advice." + +"Would you marry him?" + +"Oh, my God, Count, there are moments when I would marry anybody!" +she cried suddenly to her own surprise and with tears in her voice. +"Ah, how bitter it is to love someone near to you and to feel that..." +she went on in a trembling voice, "that you can do nothing for him but +grieve him, and to know that you cannot alter this. Then there is only +one thing left--to go away, but where could I go?" + +"What is wrong? What is it, Princess?" + +But without finishing what she was saying, Princess Mary burst +into tears. + +"I don't know what is the matter with me today. Don't take any +notice--forget what I have said!" + +Pierre's gaiety vanished completely. He anxiously questioned the +princess, asked her to speak out fully and confide her grief to him; +but she only repeated that she begged him to forget what she had said, +that she did not remember what she had said, and that she had no +trouble except the one he knew of--that Prince Andrew's marriage +threatened to cause a rupture between father and son. + +"Have you any news of the Rostovs?" she asked, to change the +subject. "I was told they are coming soon. I am also expecting +Andrew any day. I should like them to meet here." + +"And how does he now regard the matter?" asked Pierre, referring +to the old prince. + +Princess Mary shook her head. + +"What is to be done? In a few months the year will be up. The +thing is impossible. I only wish I could spare my brother the first +moments. I wish they would come sooner. I hope to be friends with her. +You have known them a long time," said Princess Mary. "Tell me +honestly the whole truth: what sort of girl is she, and what do you +think of her?--The real truth, because you know Andrew is risking so +much doing this against his father's will that I should like to +know..." + +An undefined instinct told Pierre that these explanations, and +repeated requests to be told the whole truth, expressed ill-will on +the princess' part toward her future sister-in-law and a wish that +he should disapprove of Andrew's choice; but in reply he said what +he felt rather than what he thought. + +"I don't know how to answer your question," he said, blushing +without knowing why. "I really don't know what sort of girl she is; +I can't analyze her at all. She is enchanting, but what makes her so I +don't know. That is all one can say about her." + +Princess Mary sighed, and the expression on her face said: "Yes, +that's what I expected and feared." + +"Is she clever?" she asked. + +Pierre considered. + +"I think not," he said, "and yet--yes. She does not deign to be +clever.... Oh no, she is simply enchanting, and that is all." + +Princess Mary again shook her head disapprovingly. + +"Ah, I so long to like her! Tell her so if you see her before I do." + +"I hear they are expected very soon," said Pierre. + +Princess Mary told Pierre of her plan to become intimate with her +future sister-in-law as soon as the Rostovs arrived and to try to +accustom the old prince to her. + + + + + +CHAPTER V + + +Boris had not succeeded in making a wealthy match in Petersburg, +so with the same object in view he came to Moscow. There he wavered +between the two richest heiresses, Julie and Princess Mary. Though +Princess Mary despite her plainness seemed to him more attractive than +Julie, he, without knowing why, felt awkward about paying court to +her. When they had last met on the old prince's name day, she had +answered at random all his attempts to talk sentimentally, evidently +not listening to what he was saying. + +Julie on the contrary accepted his attentions readily, though in a +manner peculiar to herself. + +She was twenty-seven. After the death of her brothers she had become +very wealthy. She was by now decidedly plain, but thought herself +not merely as good-looking as before but even far more attractive. She +was confirmed in this delusion by the fact that she had become a +very wealthy heiress and also by the fact that the older she grew +the less dangerous she became to men, and the more freely they could +associate with her and avail themselves of her suppers, soirees, and +the animated company that assembled at her house, without incurring +any obligation. A man who would have been afraid ten years before of +going every day to the house when there was a girl of seventeen there, +for fear of compromising her and committing himself, would now go +boldly every day and treat her not as a marriageable girl but as a +sexless acquaintance. + +That winter the Karagins' house was the most agreeable and +hospitable in Moscow. In addition to the formal evening and dinner +parties, a large company, chiefly of men, gathered there every day, +supping at midnight and staying till three in the morning. Julie never +missed a ball, a promenade, or a play. Her dresses were always of +the latest fashion. But in spite of that she seemed to be +disillusioned about everything and told everyone that she did not +believe either in friendship or in love, or any of the joys of life, +and expected peace only "yonder." She adopted the tone of one who +has suffered a great disappointment, like a girl who has either lost +the man she loved or been cruelly deceived by him. Though nothing of +the kind had happened to her she was regarded in that light, and had +even herself come to believe that she had suffered much in life. +This melancholy, which did not prevent her amusing herself, did not +hinder the young people who came to her house from passing the time +pleasantly. Every visitor who came to the house paid his tribute to +the melancholy mood of the hostess, and then amused himself with +society gossip, dancing, intellectual games, and bouts rimes, which +were in vogue at the Karagins'. Only a few of these young men, among +them Boris, entered more deeply into Julie's melancholy, and with +these she had prolonged conversations in private on the vanity of +all worldly things, and to them she showed her albums filled with +mournful sketches, maxims, and verses. + +To Boris, Julie was particularly gracious: she regretted his early +disillusionment with life, offered him such consolation of +friendship as she who had herself suffered so much could render, and +showed him her album. Boris sketched two trees in the album and wrote: +"Rustic trees, your dark branches shed gloom and melancholy upon me." + +On another page he drew a tomb, and wrote: + + La mort est secourable et la mort est tranquille. + Ah! contre les douleurs il n'y a pas d'autre asile.* + + +*Death gives relief and death is peaceful. + + Ah! from suffering there is no other refuge. + +Julia said this was charming + +"There is something so enchanting in the smile of melancholy," she +said to Boris, repeating word for word a passage she had copied from a +book. "It is a ray of light in the darkness, a shade between sadness +and despair, showing the possibility of consolation." + +In reply Boris wrote these lines: + + Aliment de poison d'une ame trop sensible, + Toi, sans qui le bonheur me serait impossible, + Tendre melancholie, ah, viens me consoler, + Viens calmer les tourments de ma sombre retraite, + Et mele une douceur secrete + A ces pleurs que je sens couler.* + + +*Poisonous nourishment of a too sensitive soul, + + Thou, without whom happiness would for me be impossible, + + Tender melancholy, ah, come to console me, + + Come to calm the torments of my gloomy retreat, + + And mingle a secret sweetness + + With these tears that I feel to be flowing. + + +For Boris, Julie played most doleful nocturnes on her harp. Boris +read Poor Liza aloud to her, and more than once interrupted the +reading because of the emotions that choked him. Meeting at large +gatherings Julie and Boris looked on one another as the only souls who +understood one another in a world of indifferent people. + +Anna Mikhaylovna, who often visited the Karagins, while playing +cards with the mother made careful inquiries as to Julie's dowry +(she was to have two estates in Penza and the Nizhegorod forests). +Anna Mikhaylovna regarded the refined sadness that united her son to +the wealthy Julie with emotion, and resignation to the Divine will. + +"You are always charming and melancholy, my dear Julie," she said to +the daughter. "Boris says his soul finds repose at your house. He +has suffered so many disappointments and is so sensitive," said she to +the mother. "Ah, my dear, I can't tell you how fond I have grown of +Julie latterly," she said to her son. "But who could help loving +her? She is an angelic being! Ah, Boris, Boris!"--she paused. "And how +I pity her mother," she went on; "today she showed me her accounts and +letters from Penza (they have enormous estates there), and she, poor +thing, has no one to help her, and they do cheat her so!" + +Boris smiled almost imperceptibly while listening to his mother. +He laughed blandly at her naive diplomacy but listened to what she had +to say, and sometimes questioned her carefully about the Penza and +Nizhegorod estates. + +Julie had long been expecting a proposal from her melancholy +adorer and was ready to accept it; but some secret feeling of +repulsion for her, for her passionate desire to get married, for her +artificiality, and a feeling of horror at renouncing the possibility +of real love still restrained Boris. His leave was expiring. He +spent every day and whole days at the Karagins', and every day on +thinking the matter over told himself that he would propose +tomorrow. But in Julie's presence, looking at her red face and chin +(nearly always powdered), her moist eyes, and her expression of +continual readiness to pass at once from melancholy to an unnatural +rapture of married bliss, Boris could not utter the decisive words, +though in imagination he had long regarded himself as the possessor of +those Penza and Nizhegorod estates and had apportioned the use of +the income from them. Julie saw Boris' indecision, and sometimes the +thought occurred to her that she was repulsive to him, but her +feminine self-deception immediately supplied her with consolation, and +she told herself that he was only shy from love. Her melancholy, +however, began to turn to irritability, and not long before Boris' +departure she formed a definite plan of action. Just as Boris' leave +of absence was expiring, Anatole Kuragin made his appearance in +Moscow, and of course in the Karagins' drawing room, and Julie, +suddenly abandoning her melancholy, became cheerful and very attentive +to Kuragin. + +"My dear," said Anna Mikhaylovna to her son, "I know from a reliable +source that Prince Vasili has sent his son to Moscow to get him +married to Julie. I am so fond of Julie that I should be sorry for +her. What do you think of it, my dear?" + +The idea of being made a fool of and of having thrown away that +whole month of arduous melancholy service to Julie, and of seeing +all the revenue from the Penza estates which he had already mentally +apportioned and put to proper use fall into the hands of another, +and especially into the hands of that idiot Anatole, pained Boris. +He drove to the Karagins' with the firm intention of proposing. +Julie met him in a gay, careless manner, spoke casually of how she had +enjoyed yesterday's ball, and asked when he was leaving. Though +Boris had come intentionally to speak of his love and therefore +meant to be tender, he began speaking irritably of feminine +inconstancy, of how easily women can turn from sadness to joy, and how +their moods depend solely on who happens to be paying court to them. +Julie was offended and replied that it was true that a woman needs +variety, and the same thing over and over again would weary anyone. + +"Then I should advise you..." Boris began, wishing to sting her; but +at that instant the galling thought occurred to him that he might have +to leave Moscow without having accomplished his aim, and have vainly +wasted his efforts--which was a thing he never allowed to happen. + +He checked himself in the middle of the sentence, lowered his eyes +to avoid seeing her unpleasantly irritated and irresolute face, and +said: + +"I did not come here at all to quarrel with you. On the contrary..." + +He glanced at her to make sure that he might go on. Her irritability +had suddenly quite vanished, and her anxious, imploring eyes were +fixed on him with greedy expectation. "I can always arrange so as +not to see her often," thought Boris. "The affair has been begun and +must be finished!" He blushed hotly, raised his eyes to hers, and +said: + +"You know my feelings for you!" + +There was no need to say more: Julie's face shone with triumph and +self-satisfaction; but she forced Boris to say all that is said on +such occasions--that he loved her and had never loved any other +woman more than her. She knew that for the Penza estates and +Nizhegorod forests she could demand this, and she received what she +demanded. + +The affianced couple, no longer alluding to trees that shed gloom +and melancholy upon them, planned the arrangements of a splendid house +in Petersburg, paid calls, and prepared everything for a brilliant +wedding. + + + + + +CHAPTER VI + + +At the end of January old Count Rostov went to Moscow with Natasha +and Sonya. The countess was still unwell and unable to travel but it +was impossible to wait for her recovery. Prince Andrew was expected in +Moscow any day, the trousseau had to be ordered and the estate near +Moscow had to be sold, besides which the opportunity of presenting his +future daughter-in-law to old Prince Bolkonski while he was in +Moscow could not be missed. The Rostovs' Moscow house had not been +heated that winter and, as they had come only for a short time and the +countess was not with them, the count decided to stay with Marya +Dmitrievna Akhrosimova, who had long been pressing her hospitality +on them. + +Late one evening the Rostovs' four sleighs drove into Marya +Dmitrievna's courtyard in the old Konyusheny street. Marya +Dmitrievna lived alone. She had already married off her daughter, +and her sons were all in the service. + +She held herself as erect, told everyone her opinion as candidly, +loudly, and bluntly as ever, and her whole bearing seemed a reproach +to others for any weakness, passion, or temptation--the possibility of +which she did not admit. From early in the morning, wearing a dressing +jacket, she attended to her household affairs, and then she drove out: +on holy days to church and after the service to jails and prisons on +affairs of which she never spoke to anyone. On ordinary days, after +dressing, she received petitioners of various classes, of whom there +were always some. Then she had dinner, a substantial and appetizing +meal at which there were always three or four guests; after dinner she +played a game of boston, and at night she had the newspapers or a +new book read to her while she knitted. She rarely made an exception +and went out to pay visits, and then only to the most important +persons in the town. + +She had not yet gone to bed when the Rostovs arrived and the +pulley of the hall door squeaked from the cold as it let in the +Rostovs and their servants. Marya Dmitrievna, with her spectacles +hanging down on her nose and her head flung back, stood in the hall +doorway looking with a stern, grim face at the new arrivals. One might +have thought she was angry with the travelers and would immediately +turn them out, had she not at the same time been giving careful +instructions to the servants for the accommodation of the visitors and +their belongings. + +"The count's things? Bring them here," she said, pointing to the +portmanteaus and not greeting anyone. "The young ladies'? There to the +left. Now what are you dawdling for?" she cried to the maids. "Get the +samovar ready!... You've grown plumper and prettier," she remarked, +drawing Natasha (whose cheeks were glowing from the cold) to her by +the hood. "Foo! You are cold! Now take off your things, quick!" she +shouted to the count who was going to kiss her hand. "You're half +frozen, I'm sure! Bring some rum for tea!... Bonjour, Sonya dear!" she +added, turning to Sonya and indicating by this French greeting her +slightly contemptuous though affectionate attitude toward her. + +When they came in to tea, having taken off their outdoor things +and tidied themselves up after their journey, Marya Dmitrievna +kissed them all in due order. + +"I'm heartily glad you have come and are staying with me. It was +high time," she said, giving Natasha a significant look. "The old +man is here and his son's expected any day. You'll have to make his +acquaintance. But we'll speak of that later on," she added, glancing at +Sonya with a look that showed she did not want to speak of it in her +presence. "Now listen," she said to the count. "What do you want +tomorrow? Whom will you send for? Shinshin?" she crooked one of her +fingers. "The sniveling Anna Mikhaylovna? That's two. She's here +with her son. The son is getting married! Then Bezukhov, eh? He is +here too, with his wife. He ran away from her and she came galloping +after him. He dined with me on Wednesday. As for them"--and she +pointed to the girls--"tomorrow I'll take them first to the Iberian +shrine of the Mother of God, and then we'll drive to the +Super-Rogue's. I suppose you'll have everything new. Don't judge by +me: sleeves nowadays are this size! The other day young Princess Irina +Vasilevna came to see me; she was an awful sight--looked as if she had +put two barrels on her arms. You know not a day passes now without +some new fashion.... And what have you to do yourself?" she asked +the count sternly. + +"One thing has come on top of another: her rags to buy, and now a +purchaser has turned up for the Moscow estate and for the house. If +you will be so kind, I'll fix a time and go down to the estate just +for a day, and leave my lassies with you." + +"All right. All right. They'll be safe with me, as safe as in +Chancery! I'll take them where they must go, scold them a bit, and pet +them a bit," said Marya Dmitrievna, touching her goddaughter and +favorite, Natasha, on the cheek with her large hand. + +Next morning Marya Dmitrievna took the young ladies to the Iberian +shrine of the Mother of God and to Madame Suppert-Roguet, who was so +afraid of Marya Dmitrievna that she always let her have costumes at +a loss merely to get rid of her. Marya Dmitrievna ordered almost the +whole trousseau. When they got home she turned everybody out of the +room except Nataisha, and then called her pet to her armchair. + +"Well, now we'll talk. I congratulate you on your betrothed. +You've hooked a fine fellow! I am glad for your sake and I've known +him since he was so high." She held her hand a couple of feet from the +ground. Natasha blushed happily. "I like him and all his family. Now +listen! You know that old Prince Nicholas much dislikes his son's +marrying. The old fellow's crotchety! Of course Prince Andrew is not a +child and can shift without him, but it's not nice to enter a family +against a father's will. One wants to do it peacefully and lovingly. +You're a clever girl and you'll know how to manage. Be kind, and use +your wits. Then all will be well." + +Natasha remained silent, from shyness Marya Dmitrievna supposed, but +really because she disliked anyone interfering in what touched her +love of Prince Andrew, which seemed to her so apart from all human +affairs that no one could understand it. She loved and knew Prince +Andrew, he loved her only, and was to come one of these days and +take her. She wanted nothing more. + +"You see I have known him a long time and am also fond of Mary, your +future sister-in-law. 'Husbands' sisters bring up blisters,' but +this one wouldn't hurt a fly. She has asked me to bring you two +together. Tomorrow you'll go with your father to see her. Be very nice +and affectionate to her: you're younger than she. When he comes, he'll +find you already know his sister and father and are liked by them. +Am I right or not? Won't that be best?" + +"Yes, it will," Natasha answered reluctantly. + + + + + +CHAPTER VII + + +Next day, by Marya Dmitrievna's advice, Count Rostov took Natasha to +call on Prince Nicholas Bolkonski. The count did not set out +cheerfully on this visit, at heart he felt afraid. He well +remembered the last interview he had had with the old prince at the +time of the enrollment, when in reply to an invitation to dinner he +had had to listen to an angry reprimand for not having provided his +full quota of men. Natasha, on the other hand, having put on her +best gown, was in the highest spirits. "They can't help liking me," +she thought. "Everybody always has liked me, and I am so willing to do +anything they wish, so ready to be fond of him--for being his +father--and of her--for being his sister--that there is no reason +for them not to like me..." + +They drove up to the gloomy old house on the Vozdvizhenka and +entered the vestibule. + +"Well, the Lord have mercy on us!" said the count, half in jest, +half in earnest; but Natasha noticed that her father was flurried on +entering the anteroom and inquired timidly and softly whether the +prince and princess were at home. + +When they had been announced a perturbation was noticeable among the +servants. The footman who had gone to announce them was stopped by +another in the large hall and they whispered to one another. Then a +maidservant ran into the hall and hurriedly said something, mentioning +the princess. At last an old, cross looking footman came and announced +to the Rostovs that the prince was not receiving, but that the +princess begged them to walk up. The first person who came to meet the +visitors was Mademoiselle Bourienne. She greeted the father and +daughter with special politeness and showed them to the princess' +room. The princess, looking excited and nervous, her face flushed in +patches, ran in to meet the visitors, treading heavily, and vainly +trying to appear cordial and at ease. From the first glance Princess +Mary did not like Natasha. She thought her too fashionably dressed, +frivolously gay and vain. She did not at all realize that before +having seen her future sister-in-law she was prejudiced against her by +involuntary envy of her beauty, youth, and happiness, as well as by +jealousy of her brother's love for her. Apart from this insuperable +antipathy to her, Princess Mary was agitated just then because on +the Rostovs' being announced, the old prince had shouted that he did +not wish to see them, that Princess Mary might do so if she chose, but +they were not to be admitted to him. She had decided to receive +them, but feared lest the prince might at any moment indulge in some +freak, as he seemed much upset by the Rostovs' visit. + +"There, my dear princess, I've brought you my songstress," said +the count, bowing and looking round uneasily as if afraid the old +prince might appear. "I am so glad you should get to know one +another... very sorry the prince is still ailing," and after a few +more commonplace remarks he rose. "If you'll allow me to leave my +Natasha in your hands for a quarter of an hour, Princess, I'll drive +round to see Anna Semenovna, it's quite near in the Dogs' Square, +and then I'll come back for her." + +The count had devised this diplomatic ruse (as he afterwards told +his daughter) to give the future sisters-in-law an opportunity to talk +to one another freely, but another motive was to avoid the danger of +encountering the old prince, of whom he was afraid. He did not mention +this to his daughter, but Natasha noticed her father's nervousness and +anxiety and felt mortified by it. She blushed for him, grew still +angrier at having blushed, and looked at the princess with a bold +and defiant expression which said that she was not afraid of +anybody. The princess told the count that she would be delighted, +and only begged him to stay longer at Anna Semenovna's, and he +departed. + +Despite the uneasy glances thrown at her by Princess Mary--who +wished to have a tete-a-tete with Natasha--Mademoiselle Bourienne +remained in the room and persistently talked about Moscow amusements +and theaters. Natasha felt offended by the hesitation she had +noticed in the anteroom, by her father's nervousness, and by the +unnatural manner of the princess who--she thought--was making a +favor of receiving her, and so everything displeased her. She did +not like Princess Mary, whom she thought very plain, affected, and +dry. Natasha suddenly shrank into herself and involuntarily assumed an +offhand air which alienated Princess Mary still more. After five +minutes of irksome, constrained conversation, they heard the sound +of slippered feet rapidly approaching. Princess Mary looked +frightened. + +The door opened and the old prince, in a dress, ing gown and a white +nightcap, came in. + +"Ah, madam!" he began. "Madam, Countess... Countess Rostova, if I am +not mistaken... I beg you to excuse me, to excuse me... I did not +know, madam. God is my witness, I did not know you had honored us with +a visit, and I came in such a costume only to see my daughter. I beg +you to excuse me... God is my witness, I didn't know-" he repeated, +stressing the word "God" so unnaturally and so unpleasantly that +Princess Mary stood with downcast eyes not daring to look either at +her father or at Natasha. + +Nor did the latter, having risen and curtsied, know what to do. +Mademoiselle Bourienne alone smiled agreeably. + +"I beg you to excuse me, excuse me! God is my witness, I did not +know," muttered the old man, and after looking Natasha over from +head to foot he went out. + +Mademoiselle Bourienne was the first to recover herself after this +apparition and began speaking about the prince's indisposition. +Natasha and Princess Mary looked at one another in silence, and the +longer they did so without saying what they wanted to say, the greater +grew their antipathy to one another. + +When the count returned, Natasha was impolitely pleased and hastened +to get away: at that moment she hated the stiff, elderly princess, who +could place her in such an embarrassing position and had spent half an +hour with her without once mentioning Prince Andrew. "I couldn't begin +talking about him in the presence of that Frenchwoman," thought +Natasha. The same thought was meanwhile tormenting Princess Mary. +She knew what she ought to have said to Natasha, but she had been +unable to say it because Mademoiselle Bourienne was in the way, and +because, without knowing why, she felt it very difficult to speak of +the marriage. When the count was already leaving the room, Princess +Mary went up hurriedly to Natasha, took her by the hand, and said with +a deep sigh: + +"Wait, I must..." + +Natasha glanced at her ironically without knowing why. + +"Dear Natalie," said Princess Mary, "I want you to know that I am +glad my brother has found happiness...." + +She paused, feeling that she was not telling the truth. Natasha +noticed this and guessed its reason. + +"I think, Princess, it is not convenient to speak of that now," +she said with external dignity and coldness, though she felt the tears +choking her. + +"What have I said and what have I done?" thought she, as soon as she +was out of the room. + +They waited a long time for Natasha to come to dinner that day. +She sat in her room crying like a child, blowing her nose and sobbing. +Sonya stood beside her, kissing her hair. + +"Natasha, what is it about?" she asked. "What do they matter to you? +It will all pass, Natasha." + +"But if you only knew how offensive it was... as if I..." + +"Don't talk about it, Natasha. It wasn't your fault so why should +you mind? Kiss me," said Sonya. + +Natasha raised her head and, kissing her friend on the lips, pressed +her wet face against her. + +"I can't tell you, I don't know. No one's to blame," said Natasha- +"It's my fault. But it all hurts terribly. Oh, why doesn't he +come?..." + +She came in to dinner with red eyes. Marya Dmitrievna, who knew +how the prince had received the Rostovs, pretended not to notice how +upset Natasha was and jested resolutely and loudly at table with the +count and the other guests. + + + + + +CHAPTER VIII + + +That evening the Rostovs went to the Opera, for which Marya +Dmitrievna had taken a box. + +Natasha did not want to go, but could not refuse Marya +Dmitrievna's kind offer which was intended expressly for her. When she +came ready dressed into the ballroom to await her father, and +looking in the large mirror there saw that she was pretty, very +pretty, she felt even more sad, but it was a sweet, tender sadness. + +"O God, if he were here now I would not behave as I did then, but +differently. I would not be silly and afraid of things, I would simply +embrace him, cling to him, and make him look at me with those +searching inquiring eyes with which he has so often looked at me, +and then I would make him laugh as he used to laugh. And his eyes--how +I see those eyes!" thought Natasha. "And what do his father and sister +matter to me? I love him alone, him, him, with that face and those +eyes, with his smile, manly and yet childlike.... No, I had better not +think of him; not think of him but forget him, quite forget him for +the present. I can't bear this waiting and I shall cry in a minute!" +and she turned away from the glass, making an effort not to cry. +"And how can Sonya love Nicholas so calmly and quietly and wait so +long and so patiently?" thought she, looking at Sonya, who also came +in quite ready, with a fan in her hand. "No, she's altogether +different. I can't!" + +Natasha at that moment felt so softened and tender that it was not +enough for her to love and know she was beloved, she wanted now, at +once, to embrace the man she loved, to speak and hear from him words +of love such as filled her heart. While she sat in the carriage beside +her father, pensively watching the lights of the street lamps +flickering on the frozen window, she felt still sadder and more in +love, and forgot where she was going and with whom. Having fallen into +the line of carriages, the Rostovs' carriage drove up to the +theater, its wheels squeaking over the snow. Natasha and Sonya, +holding up their dresses, jumped out quickly. The count got out helped +by the footmen, and, passing among men and women who were entering and +the program sellers, they all three went along the corridor to the +first row of boxes. Through the closed doors the music was already +audible. + +"Natasha, your hair!..." whispered Sonya. + +An attendant deferentially and quickly slipped before the ladies and +opened the door of their box. The music sounded louder and through the +door rows of brightly lit boxes in which ladies sat with bare arms and +shoulders, and noisy stalls brilliant with uniforms, glittered +before their eyes. A lady entering the next box shot a glance of +feminine envy at Natasha. The curtain had not yet risen and the +overture was being played. Natasha, smoothing her gown, went in with +Sonya and sat down, scanning the brilliant tiers of boxes opposite. +A sensation she had not experienced for a long time--that of +hundreds of eyes looking at her bare arms and neck--suddenly +affected her both agreeably and disagreeably and called up a whole +crowd of memories, desires and emotions associated with that feeling. + +The two remarkably pretty girls, Natasha and Sonya, with Count +Rostov who had not been seen in Moscow for a long time, attracted +general attention. Moreover, everybody knew vaguely of Natasha's +engagement to Prince Andrew, and knew that the Rostovs had lived in +the country ever since, and all looked with curiosity at a fiancee who +was making one of the best matches in Russia. + +Natasha's looks, as everyone told her, had improved in the +country, and that evening thanks to her agitation she was particularly +pretty. She struck those who saw her by her fullness of life and +beauty, combined with her indifference to everything about her. Her +black eyes looked at the crowd without seeking anyone, and her +delicate arm, bare to above the elbow, lay on the velvet edge of the +box, while, evidently unconsciously, she opened and closed her hand in +time to the music, crumpling her program. "Look, there's Alenina," +said Sonya, "with her mother, isn't it?" + +"Dear me, Michael Kirilovich has grown still stouter!" remarked +the count. + +"Look at our Anna Mikhaylovna--what a headdress she has on!" + +"The Karagins, Julie--and Boris with them. One can see at once +that they're engaged...." + +"Drubetskoy has proposed?" + +"Oh yes, I heard it today," said Shinshin, coming into the +Rostovs' box. + +Natasha looked in the direction in which her father's eyes were +turned and saw Julie sitting beside her mother with a happy look on +her face and a string of pearls round her thick red neck--which +Natasha knew was covered with powder. Behind them, wearing a smile and +leaning over with an ear to Julie's mouth, was Boris' handsome +smoothly brushed head. He looked the Rostovs from under his brows +and said something, smiling, to his betrothed. + +"They are talking about us, about me and him!" thought Natasha. "And +he no doubt is calming her jealousy of me. They needn't trouble +themselves! If only they knew how little I am concerned about any of +them." + +Behind them sat Anna Mikhaylovna wearing a green headdress and +with a happy look of resignation to the will of God on her face. Their +box was pervaded by that atmosphere of an affianced couple which +Natasha knew so well and liked so much. She turned away and suddenly +remembered all that had been so humiliating in her morning's visit. + +"What right has he not to wish to receive me into his family? Oh, +better not think of it--not till he comes back!" she told herself, and +began looking at the faces, some strange and some familiar, in the +stalls. In the front, in the very center, leaning back against the +orchestra rail, stood Dolokhov in a Persian dress, his curly hair +brushed up into a huge shock. He stood in full view of the audience, +well aware that he was attracting everyone's attention, yet as much at +ease as though he were in his own room. Around him thronged Moscow's +most brilliant young men, whom he evidently dominated. + +The count, laughing, nudged the blushing Sonya and pointed to her +former adorer. + +"Do you recognize him?" said he. "And where has he sprung from?" +he asked, turning to Shinshin. "Didn't he vanish somewhere?" + +"He did," replied Shinshin. "He was in the Caucasus and ran away +from there. They say he has been acting as minister to some ruling +prince in Persia, where he killed the Shah's brother. Now all the +Moscow ladies are mad about him! It's 'Dolokhov the Persian' that does +it! We never hear a word but Dolokhov is mentioned. They swear by him, +they offer him to you as they would a dish of choice sterlet. Dolokhov +and Anatole Kuragin have turned all our ladies' heads." + +A tall, beautiful woman with a mass of plaited hair and much exposed +plump white shoulders and neck, round which she wore a double string +of large pearls, entered the adjoining box rustling her heavy silk +dress and took a long time settling into her place. + +Natasha involuntarily gazed at that neck, those shoulders, and +pearls and coiffure, and admired the beauty of the shoulders and the +pearls. While Natasha was fixing her gaze on her for the second time +the lady looked round and, meeting the count's eyes, nodded to him and +smiled. She was the Countess Bezukhova, Pierre's wife, and the +count, who knew everyone in society, leaned over and spoke to her. + +"Have you been here long, Countess?" he inquired. "I'll call, I'll +call to kiss your hand. I'm here on business and have brought my girls +with me. They say Semenova acts marvelously. Count Pierre never used +to forget us. Is he here?" + +"Yes, he meant to look in," answered Helene, and glanced attentively +at Natasha. + +Count Rostov resumed his seat. + +"Handsome, isn't she?" he whispered to Natasha. + +"Wonderful!" answered Natasha. "She's a woman one could easily +fall in love with." + +Just then the last chords of the overture were heard and the +conductor tapped with his stick. Some latecomers took their seats in +the stalls, and the curtain rose. + +As soon as it rose everyone in the boxes and stalls became silent, +and all the men, old and young, in uniform and evening dress, and +all the women with gems on their bare flesh, turned their whole +attention with eager curiosity to the stage. Natasha too began to look +at it. + + + + + +CHAPTER IX + + +The floor of the stage consisted of smooth boards, at the sides +was some painted cardboard representing trees, and at the back was a +cloth stretched over boards. In the center of the stage sat some girls +in red bodices and white skirts. One very fat girl in a white silk +dress sat apart on a low bench, to the back of which a piece of +green cardboard was glued. They all sang something. When they had +finished their song the girl in white went up to the prompter's box +and a man with tight silk trousers over his stout legs, and holding +a plume and a dagger, went up to her and began singing, waving his +arms about. + +First the man in the tight trousers sang alone, then she sang, +then they both paused while the orchestra played and the man +fingered the hand of the girl in white, obviously awaiting the beat to +start singing with her. They sang together and everyone in the theater +began clapping and shouting, while the man and woman on the stage--who +represented lovers--began smiling, spreading out their arms, and +bowing. + +After her life in the country, and in her present serious mood, +all this seemed grotesque and amazing to Natasha. She could not follow +the opera nor even listen to the music; she saw only the painted +cardboard and the queerly dressed men and women who moved, spoke, +and sang so strangely in that brilliant light. She knew what it was +all meant to represent, but it was so pretentiously false and +unnatural that she first felt ashamed for the actors and then amused +at them. She looked at the faces of the audience, seeking in them +the same sense of ridicule and perplexity she herself experienced, but +they all seemed attentive to what was happening on the stage, and +expressed delight which to Natasha seemed feigned. "I suppose it has +to be like this!" she thought. She kept looking round in turn at the +rows of pomaded heads in the stalls and then at the seminude women +in the boxes, especially at Helene in the next box, who--apparently +quite unclothed--sat with a quiet tranquil smile, not taking her +eyes off the stage. And feeling the bright light that flooded the +whole place and the warm air heated by the crowd, Natasha little by +little began to pass into a state of intoxication she had not +experienced for a long while. She did not realize who and where she +was, nor what was going on before her. As she looked and thought, +the strangest fancies unexpectedly and disconnectedly passed through +her mind: the idea occurred to her of jumping onto the edge of the box +and singing the air the actress was singing, then she wished to +touch with her fan an old gentleman sitting not far from her, then +to lean over to Helene and tickle her. + +At a moment when all was quiet before the commencement of a song, +a door leading to the stalls on the side nearest the Rostovs' box +creaked, and the steps of a belated arrival were heard. "There's +Kuragin!" whispered Shinshin. Countess Bezukhova turned smiling to the +newcomer, and Natasha, following the direction of that look, saw an +exceptionally handsome adjutant approaching their box with a +self-assured yet courteous bearing. This was Anatole Kuragin whom +she had seen and noticed long ago at the ball in Petersburg. He was +now in an adjutant's uniform with one epaulet and a shoulder knot. +He moved with a restrained swagger which would have been ridiculous +had he not been so good-looking and had his handsome face not worn +such an expression of good-humored complacency and gaiety. Though +the performance was proceeding, he walked deliberately down the +carpeted gangway, his sword and spurs slightly jingling and his +handsome perfumed head held high. Having looked at Natasha he +approached his sister, laid his well gloved hand on the edge of her +box, nodded to her, and leaning forward asked a question, with a +motion toward Natasha. + +"Mais charmante!" said he, evidently referring to Natasha, who did +not exactly hear his words but understood them from the movement of +his lips. Then he took his place in the first row of the stalls and +sat down beside Dolokhov, nudging with his elbow in a friendly and +offhand way that Dolokhov whom others treated so fawningly. He +winked at him gaily, smiled, and rested his foot against the orchestra +screen. + +"How like the brother is to the sister," remarked the count. "And +how handsome they both are!" + +Shinshin, lowering his voice, began to tell the count of some +intrigue of Kuragin's in Moscow, and Natasha tried to overhear it just +because he had said she was "charmante." + +The first act was over. In the stalls everyone began moving about, +going out and coming in. + +Boris came to the Rostovs' box, received their congratulations +very simply, and raising his eyebrows with an absent-minded smile +conveyed to Natasha and Sonya his fiancee's invitation to her wedding, +and went away. Natasha with a gay, coquettish smile talked to him, and +congratulated on his approaching wedding that same Boris with whom she +had formerly been in love. In the state of intoxication she was in, +everything seemed simple and natural. + +The scantily clad Helene smiled at everyone in the same way, and +Natasha gave Boris a similar smile. + +Helene's box was filled and surrounded from the stalls by the most +distinguished and intellectual men, who seemed to vie with one another +in their wish to let everyone see that they knew her. + +During the whole of that entr'acte Kuragin stood with Dolokhov in +front of the orchestra partition, looking at the Rostovs' box. Natasha +knew he was talking about her and this afforded her pleasure. She even +turned so that he should see her profile in what she thought was its +most becoming aspect. Before the beginning of the second act Pierre +appeared in the stalls. The Rostovs had not seen him since their +arrival. His face looked sad, and he had grown still stouter since +Natasha last saw him. He passed up to the front rows, not noticing +anyone. Anatole went up to him and began speaking to him, looking at +and indicating the Rostovs' box. On seeing Natasha Pierre grew +animated and, hastily passing between the rows, came toward their box. +When he got there he leaned on his elbows and, smiling, talked to +her for a long time. While conversing with Pierre, Natasha heard a +man's voice in Countess Bezukhova's box and something told her it +was Kuragin. She turned and their eyes met. Almost smiling, he gazed +straight into her eyes with such an enraptured caressing look that +it seemed strange to be so near him, to look at him like that, to be +so sure he admired her, and not to be acquainted with him. + +In the second act there was scenery representing tombstones, there +was a round hole in the canvas to represent the moon, shades were +raised over the footlights, and from horns and contrabass came deep +notes while many people appeared from right and left wearing black +cloaks and holding things like daggers in their hands. They began +waving their arms. Then some other people ran in and began dragging +away the maiden who had been in white and was now in light blue. +They did not drag her away at once, but sang with her for a long +time and then at last dragged her off, and behind the scenes something +metallic was struck three times and everyone knelt down and sang a +prayer. All these things were repeatedly interrupted by the +enthusiastic shouts of the audience. + +During this act every time Natasha looked toward the stalls she +saw Anatole Kuragin with an arm thrown across the back of his chair, +staring at her. She was pleased to see that he was captivated by her +and it did not occur to her that there was anything wrong in it. + +When the second act was over Countess Bezukhova rose, turned to +the Rostovs' box--her whole bosom completely exposed--beckoned the old +count with a gloved finger, and paying no attention to those who had +entered her box began talking to him with an amiable smile. + +"Do make me acquainted with your charming daughters," said she. "The +whole town is singing their praises and I don't even know then!" + +Natasha rose and curtsied to the splendid countess. She was so +pleased by praise from this brilliant beauty that she blushed with +pleasure. + +"I want to become a Moscovite too, now," said Helene. "How is it +you're not ashamed to bury such pearls in the country?" + +Countess Bezukhova quite deserved her reputation of being a +fascinating woman. She could say what she did not think--especially +what was flattering--quite simply and naturally. + +"Dear count, you must let me look after your daughters! Though I +am not staying here long this time--nor are you--I will try to amuse +them. I have already heard much of you in Petersburg and wanted to get +to know you," said she to Natasha with her stereotyped and lovely +smile. "I had heard about you from my page, Drubetskoy. Have you heard +he is getting married? And also from my husband's friend Bolkonski, +Prince Andrew Bolkonski," she went on with special emphasis, +implying that she knew of his relation to Natasha. To get better +acquainted she asked that one of the young ladies should come into her +box for the rest of the performance, and Natasha moved over to it. + +The scene of the third act represented a palace in which many +candles were burning and pictures of knights with short beards hung on +the walls. In the middle stood what were probably a king and a +queen. The king waved his right arm and, evidently nervous, sang +something badly and sat down on a crimson throne. The maiden who had +been first in white and then in light blue, now wore only a smock, and +stood beside the throne with her hair down. She sang something +mournfully, addressing the queen, but the king waved his arm severely, +and men and women with bare legs came in from both sides and began +dancing all together. Then the violins played very shrilly and merrily +and one of the women with thick bare legs and thin arms, separating +from the others, went behind the wings, adjusted her bodice, +returned to the middle of the stage, and began jumping and striking +one foot rapidly against the other. In the stalls everyone clapped and +shouted "bravo!" Then one of the men went into a corner of the +stage. The cymbals and horns in the orchestra struck up more loudly, +and this man with bare legs jumped very high and waved his feet +about very rapidly. (He was Duport, who received sixty thousand rubles +a year for this art.) Everybody in the stalls, boxes, and galleries +began clapping and shouting with all their might, and the man +stopped and began smiling and bowing to all sides. Then other men +and women danced with bare legs. Then the king again shouted to the +sound of music, and they all began singing. But suddenly a storm +came on, chromatic scales and diminished sevenths were heard in the +orchestra, everyone ran off, again dragging one of their number +away, and the curtain dropped. Once more there was a terrible noise +and clatter among the audience, and with rapturous faces everyone +began shouting: "Duport! Duport! Duport!" Natasha no longer thought +this strange. She look about with pleasure, smiling joyfully. + +"Isn't Duport delightful?" Helene asked her. + +"Oh, yes," replied Natasha. + + + + + +CHAPTER X + + +During the entr'acte a whiff of cold air came into Helene's box, the +door opened, and Anatole entered, stooping and trying not to brush +against anyone. + +"Let me introduce my brother to you," said Helene, her eyes shifting +uneasily from Natasha to Anatole. + +Natasha turned her pretty little head toward the elegant young +officer and smiled at him over her bare shoulder. Anatole, who was +as handsome at close quarters as at a distance, sat down beside her +and told her he had long wished to have this happiness--ever since the +Naryshkins' ball in fact, at which he had had the well-remembered +pleasure of seeing her. Kuragin was much more sensible and simple with +women than among men. He talked boldly and naturally, and Natasha +was strangely and agreeably struck by the fact that there was +nothing formidable in this man about whom there was so much talk, +but that on the contrary his smile was most naive, cheerful, and +good-natured. + +Kuragin asked her opinion of the performance and told her how at a +previous performance Semenova had fallen down on the stage. + +"And do you know, Countess," he said, suddenly addressing her as +an old, familiar acquaintance, "we are getting up a costume +tournament; you ought to take part in it! It will be great fun. We +shall all meet at the Karagins'! Please come! No! Really, eh?" said +he. + +While saying this he never removed his smiling eyes from her face, +her neck, and her bare arms. Natasha knew for certain that he was +enraptured by her. This pleased her, yet his presence made her feel +constrained and oppressed. When she was not looking at him she felt +that he was looking at her shoulders, and she involuntarily caught his +eye so that he should look into hers rather than this. But looking +into his eyes she was frightened, realizing that there was not that +barrier of modesty she had always felt between herself and other +men. She did not know how it was that within five minutes she had come +to feel herself terribly near to this man. When she turned away she +feared he might seize her from behind by her bare arm and kiss her +on the neck. They spoke of most ordinary things, yet she felt that +they were closer to one another than she had ever been to any man. +Natasha kept turning to Helene and to her father, as if asking what it +all meant, but Helene was engaged in conversation with a general and +did not answer her look, and her father's eyes said nothing but what +they always said: "Having a good time? Well, I'm glad of it!" + +During one of these moments of awkward silence when Anatole's +prominent eyes were gazing calmly and fixedly at her, Natasha, to +break the silence, asked him how he liked Moscow. She asked the +question and blushed. She felt all the time that by talking to him she +was doing something improper. Anatole smiled as though to encourage +her. + +"At first I did not like it much, because what makes a town pleasant +ce sont les jolies femmes,* isn't that so? But now I like it very much +indeed," he said, looking at her significantly. "You'll come to the +costume tournament, Countess? Do come!" and putting out his hand to +her bouquet and dropping his voice, he added, "You will be the +prettiest there. Do come, dear countess, and give me this flower as +a pledge!" + + +*Are the pretty women. + + +Natasha did not understand what he was saying any more than he did +himself, but she felt that his incomprehensible words had an +improper intention. She did not know what to say and turned away as if +she had not heard his remark. But as soon as she had turned away she +felt that he was there, behind, so close behind her. + +"How is he now? Confused? Angry? Ought I to put it right?" she asked +herself, and she could not refrain from turning round. She looked +straight into his eyes, and his nearness, self-assurance, and the +good-natured tenderness of his smile vanquished her. She smiled just +as he was doing, gazing straight into his eyes. And again she felt +with horror that no barrier lay between him and her. + +The curtain rose again. Anatole left the box, serene and gay. +Natasha went back to her father in the other box, now quite submissive +to the world she found herself in. All that was going on before her +now seemed quite natural, but on the other hand all her previous +thoughts of her betrothed, of Princess Mary, or of life in the country +did not once recur to her mind and were as if belonging to a remote +past. + +In the fourth act there was some sort of devil who sang waving his +arm about, till the boards were withdrawn from under him and he +disappeared down below. That was the only part of the fourth act +that Natasha saw. She felt agitated and tormented, and the cause of +this was Kuragin whom she could not help watching. As they were +leaving the theater Anatole came up to them, called their carriage, +and helped them in. As he was putting Natasha in he pressed her arm +above the elbow. Agitated and flushed she turned round. He was looking +at her with glittering eyes, smiling tenderly. + + +Only after she had reached home was Natasha able clearly to think +over what had happened to her, and suddenly remembering Prince +Andrew she was horrified, and at tea to which all had sat down after +the opera, she gave a loud exclamation, flushed, and ran out of the +room. + +"O God! I am lost!" she said to herself. "How could I let him?" +She sat for a long time hiding her flushed face in her hands trying to +realize what had happened to her, but was unable either to +understand what had happened or what she felt. Everything seemed dark, +obscure, and terrible. There in that enormous, illuminated theater +where the bare-legged Duport, in a tinsel-decorated jacket, jumped +about to the music on wet boards, and young girls and old men, and the +nearly naked Helene with her proud, calm smile, rapturously cried +"bravo!"--there in the presence of that Helene it had all seemed clear +and simple; but now, alone by herself, it was incomprehensible. +"What is it? What was that terror I felt of him? What is this +gnawing of conscience I am feeling now?" she thought. + +Only to the old countess at night in bed could Natasha have told all +she was feeling. She knew that Sonya with her severe and simple +views would either not understand it at all or would be horrified at +such a confession. So Natasha tried to solve what was torturing her by +herself. + +"Am I spoiled for Andrew's love or not?" she asked herself, and with +soothing irony replied: "What a fool I am to ask that! What did happen +to me? Nothing! I have done nothing, I didn't lead him on at all. +Nobody will know and I shall never see him again," she told herself. +"So it is plain that nothing has happened and there is nothing to +repent of, and Andrew can love me still. But why 'still?' O God, why +isn't he here?" Natasha quieted herself for a moment, but again some +instinct told her that though all this was true, and though nothing +had happened, yet the former purity of her love for Prince Andrew +had perished. And again in imagination she went over her whole +conversation with Kuragin, and again saw the face, gestures, and +tender smile of that bold handsome man when he pressed her arm. + + + + + +CHAPTER XI + +Anatole Kuragin was staying in Moscow because his father had sent +him away from Petersburg, where he had been spending twenty thousand +rubles a year in cash, besides running up debts for as much more, +which his creditors demanded from his father. + +His father announced to him that he would now pay half his debts for +the last time, but only on condition that he went to Moscow as +adjutant to the commander in chief--a post his father had procured for +him--and would at last try to make a good match there. He indicated to +him Princess Mary and Julie Karagina. + +Anatole consented and went to Moscow, where he put up at Pierre's +house. Pierre received him unwillingly at first, but got used to him +after a while, sometimes even accompanied him on his carousals, and +gave him money under the guise of loans. + +As Shinshin had remarked, from the time of his arrival Anatole had +turned the heads of the Moscow ladies, especially by the fact that +he slighted them and plainly preferred the gypsy girls and French +actresses--with the chief of whom, Mademoiselle George, he was said to +be on intimate relations. He had never missed a carousal at +Danilov's or other Moscow revelers', drank whole nights through, +outvying everyone else, and was at all the balls and parties of the +best society. There was talk of his intrigues with some of the ladies, +and he flirted with a few of them at the balls. But he did not run +after the unmarried girls, especially the rich heiresses who were most +of them plain. There was a special reason for this, as he had got +married two years before--a fact known only to his most intimate +friends. At that time while with his regiment in Poland, a Polish +landowner of small means had forced him to marry his daughter. Anatole +had very soon abandoned his wife and, for a payment which he agreed to +send to his father-in-law, had arranged to be free to pass himself off +as a bachelor. + +Anatole was always content with his position, with himself, and with +others. He was instinctively and thoroughly convinced that was +impossible for him to live otherwise than as he did and that he had +never in his life done anything base. He was incapable of +considering how his actions might affect others or what the +consequences of this or that action of his might be. He was +convinced that, as a duck is so made that it must live in water, so +God had made him such that he must spend thirty thousand rubles a year +and always occupy a prominent position in society. He believed this so +firmly that others, looking at him, were persuaded of it too and did +not refuse him either a leading place in society or money, which he +borrowed from anyone and everyone and evidently would not repay. + +He was not a gambler, at any rate he did not care about winning. +He was not vain. He did not mind what people thought of him. Still +less could he be accused of ambition. More than once he had vexed +his father by spoiling his own career, and he laughed at +distinctions of all kinds. He was not mean, and did not refuse +anyone who asked of him. All he cared about was gaiety and women, +and as according to his ideas there was nothing dishonorable in +these tastes, and he was incapable of considering what the +gratification of his tastes entailed for others, he honestly +considered himself irreproachable, sincerely despised rogues and bad +people, and with a tranquil conscience carried his head high. + +Rakes, those male Magdalenes, have a secret feeling of innocence +similar to that which female Magdalenes have, based on the same hope +of forgiveness. "All will be forgiven her, for she loved much; and all +will be forgiven him, for he enjoyed much." + +Dolokhov, who had reappeared that year in Moscow after his exile and +his Persian adventures, and was leading a life of luxury, gambling, +and dissipation, associated with his old Petersburg comrade Kuragin +and made use of him for his own ends. + +Anatole was sincerely fond of Dolokhov for his cleverness and +audacity. Dolokhov, who needed Anatole Kuragin's name, position, and +connections as a bait to draw rich young men into his gambling set, +made use of him and amused himself at his expense without letting +the other feel it. Apart from the advantage he derived from Anatole, +the very process of dominating another's will was in itself a +pleasure, a habit, and a necessity to Dolokhov. + +Natasha had made a strong impression on Kuragin. At supper after the +opera he described to Dolokhov with the air of a connoisseur the +attractions of her arms, shoulders, feet, and hair and expressed his +intention of making love to her. Anatole had no notion and was +incapable of considering what might come of such love-making, as he +never had any notion of the outcome of any of his actions. + +"She's first-rate, my dear fellow, but not for us," replied +Dolokhov. + +"I will tell my sister to ask her to dinner," said Anatole. "Eh?" + +"You'd better wait till she's married...." + +"You know, I adore little girls, they lose their heads at once," +pursued Anatole. + +"You have been caught once already by a 'little girl,'" said +Dolokhov who knew of Kuragin's marriage. "Take care!" + +"Well, that can't happen twice! Eh?" said Anatole, with a +good-humored laugh. + + + + + +CHAPTER XII + + +The day after the opera the Rostovs went nowhere and nobody came +to see them. Marya Dmitrievna talked to the count about something +which they concealed from Natasha. Natasha guessed they were talking +about the old prince and planning something, and this disquieted and +offended her. She was expecting Prince Andrew any moment and twice +that day sent a manservant to the Vozdvizhenka to ascertain whether he +had come. He had not arrived. She suffered more now than during her +first days in Moscow. To her impatience and pining for him were now +added the unpleasant recollection of her interview with Princess +Mary and the old prince, and a fear and anxiety of which she did not +understand the cause. She continually fancied that either he would +never come or that something would happen to her before he came. She +could no longer think of him by herself calmly and continuously as she +had done before. As soon as she began to think of him, the +recollection of the old prince, of Princess Mary, of the theater, +and of Kuragin mingled with her thoughts. The question again presented +itself whether she was not guilty, whether she had not already +broken faith with Prince Andrew, and again she found herself recalling +to the minutest detail every word, every gesture, and every shade in +the play of expression on the face of the man who had been able to +arouse in her such an incomprehensible and terrifying feeling. To +the family Natasha seemed livelier than usual, but she was far less +tranquil and happy than before. + +On Sunday morning Marya Dmitrievna invited her visitors to Mass at +her parish church--the Church of the Assumption built over the +graves of victims of the plague. + +"I don't like those fashionable churches," she said, evidently +priding herself on her independence of thought. "God is the same every +where. We have an excellent priest, he conducts the service decently +and with dignity, and the deacon is the same. What holiness is there +in giving concerts in the choir? I don't like it, it's just +self-indulgence!" + +Marya Dmitrievna liked Sundays and knew how to keep them. Her +whole house was scrubbed and cleaned on Saturdays; neither she nor the +servants worked, and they all wore holiday dress and went to church. +At her table there were extra dishes at dinner, and the servants had +vodka and roast goose or suckling pig. But in nothing in the house was +the holiday so noticeable as in Marya Dmitrievna's broad, stern +face, which on that day wore an invariable look of solemn festivity. + +After Mass, when they had finished their coffee in the dining room +where the loose covers had been removed from the furniture, a +servant announced that the carriage was ready, and Marya Dmitrievna +rose with a stern air. She wore her holiday shawl, in which she paid +calls, and announced that she was going to see Prince Nicholas +Bolkonski to have an explanation with him about Natasha. + +After she had gone, a dressmaker from Madame Suppert-Roguet waited +on the Rostovs, and Natasha, very glad of this diversion, having +shut herself into a room adjoining the drawing room, occupied +herself trying on the new dresses. Just as she had put on a bodice +without sleeves and only tacked together, and was turning her head +to see in the glass how the back fitted, she heard in the drawing room +the animated sounds of her father's voice and another's--a woman's- +that made her flush. It was Helene. Natasha had not time to take off +the bodice before the door opened and Countess Bezukhova, dressed in a +purple velvet gown with a high collar, came into the room beaming with +good-humored amiable smiles. + +"Oh, my enchantress!" she cried to the blushing Natasha. +"Charming! No, this is really beyond anything, my dear count," said +she to Count Rostov who had followed her in. "How can you live in +Moscow and go nowhere? No, I won't let you off! Mademoiselle George +will recite at my house tonight and there'll be some people, and if +you don't bring your lovely girls--who are prettier than +Mademoiselle George--I won't know you! My husband is away in Tver or I +would send him to fetch you. You must come. You positively must! +Between eight and nine." + +She nodded to the dressmaker, whom she knew and who had curtsied +respectfully to her, and seated herself in an armchair beside the +looking glass, draping the folds of her velvet dress picturesquely. +She did not cease chattering good-naturedly and gaily, continually +praising Natasha's beauty. She looked at Natasha's dresses and praised +them, as well as a new dress of her own made of "metallic gauze," +which she had received from Paris, and advised Natasha to have one +like it. + +"But anything suits you, my charmer!" she remarked. + +A smile of pleasure never left Natasha's face. She felt happy and as +if she were blossoming under the praise of this dear Countess +Bezukhova who had formerly seemed to her so unapproachable and +important and was now so kind to her. Natasha brightened up and felt +almost in love with this woman, who was so beautiful and so kind. +Helene for her part was sincerely delighted with Natasha and wished to +give her a good time. Anatole had asked her to bring him and Natasha +together, and she was calling on the Rostovs for that purpose. The +idea of throwing her brother and Natasha together amused her. + +Though at one time, in Petersburg, she had been annoyed with Natasha +for drawing Boris away, she did not think of that now, and in her +own way heartily wished Natasha well. As she was leaving the Rostovs +she called her protegee aside. + +"My brother dined with me yesterday--we nearly died of laughter- +he ate nothing and kept sighing for you, my charmer! He is madly, +quite madly, in love with you, my dear." + +Natasha blushed scarlet when she heard this. + +"How she blushes, how she blushes, my pretty!" said Helene. "You +must certainly come. If you love somebody, my charmer, that is not a +reason to shut yourself up. Even if you are engaged, I am sure your +fiance would wish you to go into society rather than be bored to +death." + +"So she knows I am engaged, and she and her husband Pierre--that +good Pierre--have talked and laughed about this. So it's all right." +And again, under Helene's influence, what had seemed terrible now +seemed simple and natural. "And she is such a grande dame, so kind, +and evidently likes me so much. And why not enjoy myself?" thought +Natasha, gazing at Helene with wide-open, wondering eyes. + +Marya Dmitrievna came back to dinner taciturn and serious, having +evidently suffered a defeat at the old prince's. She was still too +agitated by the encounter to be able to talk of the affair calmly. +In answer to the count's inquiries she replied that things were all +right and that she would tell about it next day. On hearing of +Countess Bezukhova's visit and the invitation for that evening, +Marya Dmitrievna remarked: + +"I don't care to have anything to do with Bezukhova and don't advise +you to; however, if you've promised--go. It will divert your +thoughts," she added, addressing Natasha. + + + + + +CHAPTER XIII + + +Count Rostov took the girls to Countess Bezukhova's. There were a +good many people there, but nearly all strangers to Natasha. Count +Rostov was displeased to see that the company consisted almost +entirely of men and women known for the freedom of their conduct. +Mademoiselle George was standing in a corner of the drawing room +surrounded by young men. There were several Frenchmen present, among +them Metivier who from the time Helene reached Moscow had been an +intimate in her house. The count decided not to sit down to cards or +let his girls out of his sight and to get away as soon as Mademoiselle +George's performance was over. + +Anatole was at the door, evidently on the lookout for the Rostovs. +Immediately after greeting the count he went up to Natasha and +followed her. As soon as she saw him she was seized by the same +feeling she had had at the opera--gratified vanity at his admiration +of her and fear at the absence of a moral barrier between them. + +Helene welcomed Natasha delightedly and was loud in admiration of +her beauty and her dress. Soon after their arrival Mademoiselle George +went out of the room to change her costume. In the drawing room people +began arranging the chairs and taking their seats. Anatole moved a +chair for Natasha and was about to sit down beside her, but the count, +who never lost sight of her, took the seat himself. Anatole sat down +behind her. + +Mademoiselle George, with her bare, fat, dimpled arms, and a red +shawl draped over one shoulder, came into the space left vacant for +her, and assumed an unnatural pose. Enthusiastic whispering was +audible. + +Mademoiselle George looked sternly and gloomily at the audience +and began reciting some French verses describing her guilty love for +her son. In some places she raised her voice, in others she whispered, +lifting her head triumphantly; sometimes she paused and uttered hoarse +sounds, rolling her eyes. + +"Adorable! divine! delicious!" was heard from every side. + +Natasha looked at the fat actress, but neither saw nor heard nor +understood anything of what went on before her. She only felt +herself again completely borne away into this strange senseless world- +so remote from her old world--a world in which it was impossible to +know what was good or bad, reasonable or senseless. Behind her sat +Anatole, and conscious of his proximity she experienced a frightened +sense of expectancy. + +After the first monologue the whole company rose and surrounded +Mademoiselle George, expressing their enthusiasm. + +"How beautiful she is!" Natasha remarked to her father who had +also risen and was moving through the crowd toward the actress. + +"I don't think so when I look at you!" said Anatole, following +Natasha. He said this at a moment when she alone could hear him. +"You are enchanting... from the moment I saw you I have never +ceased..." + +"Come, come, Natasha!" said the count, as he turned back for his +daughter. "How beautiful she is!" Natasha without saying anything +stepped up to her father and looked at him with surprised inquiring +eyes. + +After giving several recitations, Mademoiselle George left, and +Countess Bezukhova asked her visitors into the ballroom. + +The count wished to go home, but Helene entreated him not to spoil +her improvised ball, and the Rostovs stayed on. Anatole asked +Natasha for a valse and as they danced he pressed her waist and hand +and told her she was bewitching and that he loved her. During the +ecossaise, which she also danced with him, Anatole said nothing when +they happened to be by themselves, but merely gazed at her. Natasha +lifted her frightened eyes to him, but there was such confident +tenderness in his affectionate look and smile that she could not, +whilst looking at him, say what she had to say. She lowered her eyes. + +"Don't say such things to me. I am betrothed and love another," +she said rapidly.... She glanced at him. + +Anatole was not upset or pained by what she had said. + +"Don't speak to me of that! What can I do?" said he. "I tell you I +am madly, madly, in love with you! Is it my fault that you are +enchanting?... It's our turn to begin." + +Natasha, animated and excited, looked about her with wide-open +frightened eyes and seemed merrier than usual. She understood hardly +anything that went on that evening. They danced the ecossaise and +the Grossvater. Her father asked her to come home, but she begged to +remain. Wherever she went and whomever she was speaking to, she felt +his eyes upon her. Later on she recalled how she had asked her +father to let her go to the dressing room to rearrange her dress, that +Helene had followed her and spoken laughingly of her brother's love, +and that she again met Anatole in the little sitting room. Helene +had disappeared leaving them alone, and Anatole had taken her hand and +said in a tender voice: + +"I cannot come to visit you but is it possible that I shall never +see you? I love you madly. Can I never...?" and, blocking her path, he +brought his face close to hers. + +His large, glittering, masculine eyes were so close to hers that she +saw nothing but them. + +"Natalie?" he whispered inquiringly while she felt her hands being +painfully pressed. "Natalie?" + +"I don't understand. I have nothing to say," her eyes replied. + +Burning lips were pressed to hers, and at the same instant she +felt herself released, and Helene's footsteps and the rustle of her +dress were heard in the room. Natasha looked round at her, and then, +red and trembling, threw a frightened look of inquiry at Anatole and +moved toward the door. + +"One word, just one, for God's sake!" cried Anatole. + +She paused. She so wanted a word from him that would explain to +her what had happened and to which she could find no answer. + +"Natalie, just a word, only one!" he kept repeating, evidently not +knowing what to say and he repeated it till Helene came up to them. + +Helene returned with Natasha to the drawing room. The Rostovs went +away without staying for supper. + +After reaching home Natasha did not sleep all night. She was +tormented by the insoluble question whether she loved Anatole or +Prince Andrew. She loved Prince Andrew--she remembered distinctly +how deeply she loved him. But she also loved Anatole, of that there +was no doubt. "Else how could all this have happened?" thought she. +"If, after that, I could return his smile when saying good-by, if I +was able to let it come to that, it means that I loved him from the +first. It means that he is kind, noble, and splendid, and I could +not help loving him. What am I to do if I love him and the other one +too?" she asked herself, unable to find an answer to these terrible +questions. + + + + + +CHAPTER XIV + + +Morning came with its cares and bustle. Everyone got up and began to +move about and talk, dressmakers came again. Marya Dmitrievna +appeared, and they were called to breakfast. Natasha kept looking +uneasily at everybody with wide-open eyes, as if wishing to +intercept every glance directed toward her, and tried to appear the +same as usual. + +After breakfast, which was her best time, Marya Dmitrievna sat +down in her armchair and called Natasha and the count to her. + +"Well, friends, I have now thought the whole matter over and this is +my advice," she began. "Yesterday, as you know, I went to see Prince +Bolkonski. Well, I had a talk with him.... He took it into his head to +begin shouting, but I am not one to be shouted down. I said what I had +to say!" + +"Well, and he?" asked the count. + +"He? He's crazy... he did not want to listen. But what's the use +of talking? As it is we have worn the poor girl out," said Marya +Dmitrievna. "My advice to you is finish your business and go back home +to Otradnoe... and wait there." + +"Oh, no!" exclaimed Natasha. + +"Yes, go back," said Marya Dmitrievna, "and wait there. If your +betrothed comes here now--there will be no avoiding a quarrel; but +alone with the old man he will talk things over and then come on to +you." + +Count Rostov approved of this suggestion, appreciating its +reasonableness. If the old man came round it would be all the better +to visit him in Moscow or at Bald Hills later on; and if not, the +wedding, against his wishes, could only be arranged at Otradnoe. + +"That is perfectly true. And I am sorry I went to see him and took +her," said the old count. + +"No, why be sorry? Being here, you had to pay your respects. But +if he won't--that's his affair," said Marya Dmitrievna, looking for +something in her reticule. "Besides, the trousseau is ready, so +there is nothing to wait for; and what is not ready I'll send after +you. Though I don't like letting you go, it is the best way. So go, +with God's blessing!" + +Having found what she was looking for in the reticule she handed +it to Natasha. It was a letter from Princess Mary. + +"She has written to you. How she torments herself, poor thing! She's +afraid you might think that she does not like you." + +"But she doesn't like me," said Natasha. + +"Don't talk nonsense!" cried Marya Dmitrievna. + +"I shan't believe anyone, I know she doesn't like me," replied +Natasha boldly as she took the letter, and her face expressed a cold +and angry resolution that caused Marya Dmitrievna to look at her +more intently and to frown. + +"Don't answer like that, my good girl!" she said. "What I say is +true! Write an answer!" Natasha did not reply and went to her own room +to read Princess Mary's letter. + +Princess Mary wrote that she was in despair at the +misunderstanding that had occurred between them. Whatever her father's +feelings might be, she begged Natasha to believe that she could not +help loving her as the one chosen by her brother, for whose +happiness she was ready to sacrifice everything. + +"Do not think, however," she wrote, "that my father is +ill-disposed toward you. He is an invalid and an old man who must be +forgiven; but he is good and magnanimous and will love her who makes +his son happy." Princess Mary went on to ask Natasha to fix a time +when she could see her again. + +After reading the letter Natasha sat down at the writing table to +answer it. "Dear Princess," she wrote in French quickly and +mechanically, and then paused. What more could she write after all +that had happened the evening before? "Yes, yes! All that has +happened, and now all is changed," she thought as she sat with the +letter she had begun before her. "Must I break off with him? Must I +really? That's awful..." and to escape from these dreadful thoughts +she went to Sonya and began sorting patterns with her. + +After dinner Natasha went to her room and again took up Princess +Mary's letter. "Can it be that it is all over?" she thought. "Can it +be that all this has happened so quickly and has destroyed all that +went before?" She recalled her love for Prince Andrew in all its +former strength, and at the same time felt that she loved Kuragin. She +vividly pictured herself as Prince Andrew's wife, and the scenes of +happiness with him she had so often repeated in her imagination, and +at the same time, aglow with excitement, recalled every detail of +yesterday's interview with Anatole. + +"Why could that not be as well?" she sometimes asked herself in +complete bewilderment. "Only so could I be completely happy; but now I +have to choose, and I can't be happy without either of them. Only," +she thought, "to tell Prince Andrew what has happened or to hide it +from him are both equally impossible. But with that one nothing is +spoiled. But am I really to abandon forever the joy of Prince Andrew's +love, in which I have lived so long?" + +"Please, Miss!" whispered a maid entering the room with a mysterious +air. "A man told me to give you this-" and she handed Natasha a +letter. + +"Only, for Christ's sake..." the girl went on, as Natasha, without +thinking, mechanically broke the seal and read a love letter from +Anatole, of which, without taking in a word, she understood only +that it was a letter from him--from the man she loved. Yes, she +loved him, or else how could that have happened which had happened? +And how could she have a love letter from him in her hand? + +With trembling hands Natasha held that passionate love letter +which Dolokhov had composed for Anatole, and as she read it she +found in it an echo of all that she herself imagined she was feeling. + +"Since yesterday evening my fate has been sealed; to be loved by you +or to die. There is no other way for me," the letter began. Then he +went on to say that he knew her parents would not give her to him--for +this there were secret reasons he could reveal only to her--but that +if she loved him she need only say the word yes, and no human power +could hinder their bliss. Love would conquer all. He would steal her +away and carry her off to the ends of the earth. + +"Yes, yes! I love him!" thought Natasha, reading the letter for +the twentieth time and finding some peculiarly deep meaning in each +word of it. + +That evening Marya Dmitrievna was going to the Akharovs' and +proposed to take the girls with her. Natasha, pleading a headache, +remained at home. + + + + + +CHAPTER XV + + +On returning late in the evening Sonya went to Natasha's room, and +to her surprise found her still dressed and asleep on the sofa. Open +on the table, beside her lay Anatole's letter. Sonya picked it up +and read it. + +As she read she glanced at the sleeping Natasha, trying to find in +her face an explanation of what she was reading, but did not find +it. Her face was calm, gentle, and happy. Clutching her breast to keep +herself from choking, Sonya, pale and trembling with fear and +agitation, sat down in an armchair and burst into tears. + +"How was it I noticed nothing? How could it go so far? Can she +have left off loving Prince Andrew? And how could she let Kuragin go +to such lengths? He is a deceiver and a villain, that's plain! What +will Nicholas, dear noble Nicholas, do when he hears of it? So this is +the meaning of her excited, resolute, unnatural look the day before +yesterday, yesterday, and today," thought Sonya. "But it can't be that +she loves him! She probably opened the letter without knowing who it +was from. Probably she is offended by it. She could not do such a +thing!" + +Sonya wiped away her tears and went up to Natasha, again scanning +her face. + +"Natasha!" she said, just audibly. + +Natasha awoke and saw Sonya. + +"Ah, you're back?" + +And with the decision and tenderness that often come at the moment +of awakening, she embraced her friend, but noticing Sonya's look of +embarrassment, her own face expressed confusion and suspicion. + +"Sonya, you've read that letter?" she demanded. + +"Yes," answered Sonya softly. + +Natasha smiled rapturously. + +"No, Sonya, I can't any longer!" she said. "I can't hide it from you +any longer. You know, we love one another! Sonya, darling, he +writes... Sonya..." + +Sonya stared open-eyed at Natasha, unable to believe her ears. + +"And Bolkonski?" she asked. + +"Ah, Sonya, if you only knew how happy I am!" cried Natasha. "You +don't know what love is...." + +"But, Natasha, can that be all over?" + +Natasha looked at Sonya with wide-open eyes as if she could not +grasp the question. + +"Well, then, are you refusing Prince Andrew?" said Sonya. + +"Oh, you don't understand anything! Don't talk nonsense, just +listen!" said Natasha, with momentary vexation. + +"But I can't believe it," insisted Sonya. "I don't understand. How +is it you have loved a man for a whole year and suddenly... Why, you +have only seen him three times! Natasha, I don't believe you, you're +joking! In three days to forget everything and so..." + +"Three days?" said Natasha. "It seems to me I've loved him a hundred +years. It seems to me that I have never loved anyone before. You can't +understand it.... Sonya, wait a bit, sit here," and Natasha embraced +and kissed her. + +"I had heard that it happens like this, and you must have heard it +too, but it's only now that I feel such love. It's not the same as +before. As soon as I saw him I felt he was my master and I his +slave, and that I could not help loving him. Yes, his slave! +Whatever he orders I shall do. You don't understand that. What can I +do? What can I do, Sonya?" cried Natasha with a happy yet frightened +expression. + +"But think what you are doing," cried Sonya. "I can't leave it +like this. This secret correspondence... How could you let him go so +far?" she went on, with a horror and disgust she could hardly conceal. + +"I told you that I have no will," Natasha replied. "Why can't you +understand? I love him!" + +"Then I won't let it come to that... I shall tell!" cried Sonya, +bursting into tears. + +"What do you mean? For God's sake... If you tell, you are my enemy!" +declared Natasha. "You want me to be miserable, you want us to be +separated...." + +When she saw Natasha's fright, Sonya shed tears of shame and pity +for her friend. + +"But what has happened between you?" she asked. "What has he said to +you? Why doesn't he come to the house?" + +Natasha did not answer her questions. + +"For God's sake, Sonya, don't tell anyone, don't torture me," +Natasha entreated. "Remember no one ought to interfere in such +matters! I have confided in you...." + +"But why this secrecy? Why doesn't he come to the house?" asked +Sonya. "Why doesn't he openly ask for your hand? You know Prince +Andrew gave you complete freedom--if it is really so; but I don't +believe it! Natasha, have you considered what these secret reasons can +be?" + +Natasha looked at Sonya with astonishment. Evidently this question +presented itself to her mind for the first time and she did not know +how to answer it. + +"I don't know what the reasons are. But there must be reasons!" + +Sonya sighed and shook her head incredulously. + +"If there were reasons..." she began. + +But Natasha, guessing her doubts, interrupted her in alarm. + +"Sonya, one can't doubt him! One can't, one can't! Don't you +understand?" she cried. + +"Does he love you?" + +"Does he love me?" Natasha repeated with a smile of pity at her +friend's lack of comprehension. "Why, you have read his letter and you +have seen him." + +"But if he is dishonorable?" + +"He! dishonorable? If you only knew!" exclaimed Natasha. + +"If he is an honorable man he should either declare his intentions +or cease seeing you; and if you won't do this, I will. I will write to +him, and I will tell Papa!" said Sonya resolutely. + +"But I can't live without him!" cried Natasha. + +"Natasha, I don't understand you. And what are you saying! Think +of your father and of Nicholas." + +"I don't want anyone, I don't love anyone but him. How dare you +say he is dishonorable? Don't you know that I love him?" screamed +Natasha. "Go away, Sonya! I don't want to quarrel with you, but go, +for God's sake go! You see how I am suffering!" Natasha cried angrily, +in a voice of despair and repressed irritation. Sonya burst into +sobs and ran from the room. + +Natasha went to the table and without a moment's reflection wrote +that answer to Princess Mary which she had been unable to write all +the morning. In this letter she said briefly that all their +misunderstandings were at an end; that availing herself of the +magnanimity of Prince Andrew who when he went abroad had given her her +freedom, she begged Princess Mary to forget everything and forgive her +if she had been to blame toward her, but that she could not be his wife. +At that moment this all seemed quite easy, simple, and clear to Natasha. + + +On Friday the Rostovs were to return to the country, but on +Wednesday the count went with the prospective purchaser to his +estate near Moscow. + +On the day the count left, Sonya and Natasha were invited to a big +dinner party at the Karagins', and Marya Dmitrievna took them there. +At that party Natasha again met Anatole, and Sonya noticed that she +spoke to him, trying not to be overheard, and that all through +dinner she was more agitated than ever. When they got home Natasha was +the first to begin the explanation Sonya expected. + +"There, Sonya, you were talking all sorts of nonsense about him," +Natasha began in a mild voice such as children use when they wish to +be praised. "We have had an explanation today." + +"Well, what happened? What did he say? Natasha, how glad I am you're +not angry with me! Tell me everything--the whole truth. What did he +say?" + +Natasha became thoughtful. + +"Oh, Sonya, if you knew him as I do! He said... He asked me what I +had promised Bolkonski. He was glad I was free to refuse him." + +Sonya sighed sorrowfully. + +"But you haven't refused Bolkonski?" said she. + +"Perhaps I have. Perhaps all is over between me and Bolkonski. Why +do you think so badly of me?" + +"I don't think anything, only I don't understand this..." + +"Wait a bit, Sonya, you'll understand everything. You'll see what +a man he is! Now don't think badly of me or of him. I don't think +badly of anyone: I love and pity everybody. But what am I to do?" + +Sonya did not succumb to the tender tone Natasha used toward her. +The more emotional and ingratiating the expression of Natasha's face +became, the more serious and stern grew Sonya's. + +"Natasha," said she, "you asked me not to speak to you, and I +haven't spoken, but now you yourself have begun. I don't trust him, +Natasha. Why this secrecy?" + +"Again, again!" interrupted Natasha. + +"Natasha, I am afraid for you!" + +"Afraid of what?" + +"I am afraid you're going to your ruin," said Sonya resolutely, +and was herself horrified at what she had said. + +Anger again showed in Natasha's face. + +"And I'll go to my ruin, I will, as soon as possible! It's not +your business! It won't be you, but I, who'll suffer. Leave me +alone, leave me alone! I hate you!" + +"Natasha!" moaned Sonya, aghast. + +"I hate you, I hate you! You're my enemy forever!" And Natasha ran +out of the room. + +Natasha did not speak to Sonya again and avoided her. With the +same expression of agitated surprise and guilt she went about the +house, taking up now one occupation, now another, and at once +abandoning them. + +Hard as it was for Sonya, she watched her friend and did not let her +out of her sight. + +The day before the count was to return, Sonya noticed that Natasha +sat by the drawingroom window all the morning as if expecting +something and that she made a sign to an officer who drove past, +whom Sonya took to be Anatole. + +Sonya began watching her friend still more attentively and noticed +that at dinner and all that evening Natasha was in a strange and +unnatural state. She answered questions at random, began sentences she +did not finish, and laughed at everything. + +After tea Sonya noticed a housemaid at Natasha's door timidly +waiting to let her pass. She let the girl go in, and then listening at +the door learned that another letter had been delivered. + +Then suddenly it became clear to Sonya that Natasha had some +dreadful plan for that evening. Sonya knocked at her door. Natasha did +not let her in. + +"She will run away with him!" thought Sonya. "She is capable of +anything. There was something particularly pathetic and resolute in +her face today. She cried as she said good-by to Uncle," Sonya +remembered. "Yes, that's it, she means to elope with him, but what +am I to do?" thought she, recalling all the signs that clearly +indicated that Natasha had some terrible intention. "The count is +away. What am I to do? Write to Kuragin demanding an explanation? +But what is there to oblige him to reply? Write to Pierre, as Prince +Andrew asked me to in case of some misfortune?... But perhaps she +really has already refused Bolkonski--she sent a letter to Princess +Mary yesterday. And Uncle is away...." To tell Marya Dmitrievna who +had such faith in Natasha seemed to Sonya terrible. "Well, anyway," +thought Sonya as she stood in the dark passage, "now or never I must +prove that I remember the family's goodness to me and that I love +Nicholas. Yes! If I don't sleep for three nights I'll not leave this +passage and will hold her back by force and will and not let the +family be disgraced," thought she. + + + + + +CHAPTER XVI + + +Anatole had lately moved to Dolokhov's. The plan for Natalie +Rostova's abduction had been arranged and the preparations made by +Dolokhov a few days before, and on the day that Sonya, after listening +at Natasha's door, resolved to safeguard her, it was to have been +put into execution. Natasha had promised to come out to Kuragin at the +back porch at ten that evening. Kuragin was to put her into a troyka +he would have ready and to drive her forty miles to the village of +Kamenka, where an unfrocked priest was in readiness to perform a +marriage ceremony over them. At Kamenka a relay of horses was to +wait which would take them to the Warsaw highroad, and from there they +would hasten abroad with post horses. + +Anatole had a passport, an order for post horses, ten thousand +rubles he had taken from his sister and another ten thousand +borrowed with Dolokhov's help. + +Two witnesses for the mock marriage--Khvostikov, a retired petty +official whom Dolokhov made use of in his gambling transactions, and +Makarin, a retired hussar, a kindly, weak fellow who had an +unbounded affection for Kuragin--were sitting at tea in Dolokhov's +front room. + +In his large study, the walls of which were hung to the ceiling with +Persian rugs, bearskins, and weapons, sat Dolokhov in a traveling +cloak and high boots, at an open desk on which lay abacus and some +bundles of paper money. Anatole, with uniform unbuttoned, walked to +and fro from the room where the witnesses were sitting, through the +study to the room behind, where his French valet and others were +packing the last of his things. Dolokhov was counting the money and +noting something down. + +"Well," he said, "Khvostikov must have two thousand." + +"Give it to him, then," said Anatole. + +"Makarka" (their name for Makarin) "will go through fire and water +for you for nothing. So here are our accounts all settled," said +Dolokhov, showing him the memorandum. "Is that right?" + +"Yes, of course," returned Anatole, evidently not listening to +Dolokhov and looking straight before him with a smile that did not +leave his face. + +Dolokhov banged down the or of his and turned to Anatole with an +ironic smile: + +"Do you know? You'd really better drop it all. There's still time!" + +"Fool," retorted Anatole. "Don't talk nonsense! If you only +knew... it's the devil knows what!" + +"No, really, give it up!" said Dolokhov. "I am speaking seriously. +It's no joke, this plot you've hatched." + +"What, teasing again? Go to the devil! Eh?" said Anatole, making a +grimace. "Really it's no time for your stupid jokes," and he left +the room. + +Dolokhov smiled contemptuously and condescendingly when Anatole +had gone out. + +"You wait a bit," he called after him. "I'm not joking, I'm +talking sense. Come here, come here!" + +Anatole returned and looked at Dolokhov, trying to give him his +attention and evidently submitting to him involuntarily. + +"Now listen to me. I'm telling you this for the last time. Why +should I joke about it? Did I hinder you? Who arranged everything +for you? Who found the priest and got the passport? Who raised the +money? I did it all." + +"Well, thank you for it. Do you think I am not grateful?" And +Anatole sighed and embraced Dolokhov. + +"I helped you, but all the same I must tell you the truth; it is a +dangerous business, and if you think about it--a stupid business. +Well, you'll carry her off--all right! Will they let it stop at +that? It will come out that you're already married. Why, they'll +have you in the criminal court...." + +"Oh, nonsense, nonsense!" Anatole ejaculated and again made a +grimace. "Didn't I explain to you? What?" And Anatole, with the +partiality dull-witted people have for any conclusion they have +reached by their own reasoning, repeated the argument he had already +put to Dolokhov a hundred times. "Didn't I explain to you that I +have come to this conclusion: if this marriage is invalid," he went +on, crooking one finger, "then I have nothing to answer for; but if it +is valid, no matter! Abroad no one will know anything about it. +Isn't that so? And don't talk to me, don't, don't." + +"Seriously, you'd better drop it! You'll only get yourself into a +mess!" + +"Go to the devil!" cried Anatole and, clutching his hair, left the +room, but returned at once and dropped into an armchair in front of +Dolokhov with his feet turned under him. "It's the very devil! What? +Feel how it beats!" He took Dolokhov's hand and put it on his heart. +"What a foot, my dear fellow! What a glance! A goddess!" he added in +French. "What?" + +Dolokhov with a cold smile and a gleam in his handsome insolent eyes +looked at him--evidently wishing to get some more amusement out of +him. + +"Well and when the money's gone, what then?" + +"What then? Eh?" repeated Anatole, sincerely perplexed by a +thought of the future. "What then?... Then, I don't know.... But why +talk nonsense!" He glanced at his watch. "It's time!" + +Anatole went into the back room. + +"Now then! Nearly ready? You're dawdling!" he shouted to the +servants. + +Dolokhov put away the money, called a footman whom he ordered to +bring something for them to eat and drink before the journey, and went +into the room where Khvostikov and Makarin were sitting. + +Anatole lay on the sofa in the study leaning on his elbow and +smiling pensively, while his handsome lips muttered tenderly to +himself. + +"Come and eat something. Have a drink!" Dolokhov shouted to him from +the other room. + +"I don't want to," answered Anatole continuing to smile. + +"Come! Balaga is here." + +Anatole rose and went into the dining room. Balaga was a famous +troyka driver who had known Dolokhov and Anatole some six years and +had given them good service with his troykas. More than once when +Anatole's regiment was stationed at Tver he had taken him from Tver in +the evening, brought him to Moscow by daybreak, and driven him back +again the next night. More than once he had enabled Dolokhov to escape +when pursued. More than once he had driven them through the town +with gypsies and "ladykins" as he called the cocottes. More than +once in their service he had run over pedestrians and upset vehicles +in the streets of Moscow and had always been protected from the +consequences by "my gentlemen" as he called them. He had ruined more +than one horse in their service. More than once they had beaten him, +and more than once they had made him drunk on champagne and Madeira, +which he loved; and he knew more than one thing about each of them +which would long ago have sent an ordinary man to Siberia. They +often called Balaga into their orgies and made him drink and dance +at the gypsies', and more than one thousand rubles of their money +had passed through his hands. In their service he risked his skin +and his life twenty times a year, and in their service had lost more +horses than the money he had from them would buy. But he liked them; +liked that mad driving at twelve miles an hour, liked upsetting a +driver or running down a pedestrian, and flying at full gallop through +the Moscow streets. He liked to hear those wild, tipsy shouts behind +him: "Get on! Get on!" when it was impossible to go any faster. He +liked giving a painful lash on the neck to some peasant who, more dead +than alive, was already hurrying out of his way. "Real gentlemen!" +he considered them. + +Anatole and Dolokhov liked Balaga too for his masterly driving and +because he liked the things they liked. With others Balaga +bargained, charging twenty-five rubles for a two hours' drive, and +rarely drove himself, generally letting his young men do so. But +with "his gentlemen" he always drove himself and never demanded +anything for his work. Only a couple of times a year--when he knew +from their valets that they had money in hand--he would turn up of a +morning quite sober and with a deep bow would ask them to help him. +The gentlemen always made him sit down. + +"Do help me out, Theodore Ivanych, sir," or "your excellency," he +would say. "I am quite out of horses. Let me have what you can to go +to the fair." + +And Anatole and Dolokhov, when they had money, would give him a +thousand or a couple of thousand rubles. + +Balaga was a fair-haired, short, and snub-nosed peasant of about +twenty-seven; red-faced, with a particularly red thick neck, +glittering little eyes, and a small beard. He wore a fine, +dark-blue, silk-lined cloth coat over a sheepskin. + +On entering the room now he crossed himself, turning toward the +front corner of the room, and went up to Dolokhov, holding out a +small, black hand. + +"Theodore Ivanych!" he said, bowing. + +"How d'you do, friend? Well, here he is!" + +"Good day, your excellency!" he said, again holding out his hand +to Anatole who had just come in. + +"I say, Balaga," said Anatole, putting his hands on the man's +shoulders, "do you care for me or not? Eh? Now, do me a service.... +What horses have you come with? Eh?" + +"As your messenger ordered, your special beasts," replied Balaga. + +"Well, listen, Balaga! Drive all three to death but get me there +in three hours. Eh?" + +"When they are dead, what shall I drive?" said Balaga with a wink. + +"Mind, I'll smash your face in! Don't make jokes!" cried Anatole, +suddenly rolling his eyes. + +"Why joke?" said the driver, laughing. "As if I'd grudge my +gentlemen anything! As fast as ever the horses can gallop, so fast +we'll go!" + +"Ah!" said Anatole. "Well, sit down." + +"Yes, sit down!" said Dolokhov. + +"I'll stand, Theodore Ivanych." + +"Sit down; nonsense! Have a drink!" said Anatole, and filled a large +glass of Madeira for him. + +The driver's eyes sparkled at the sight of the wine. After +refusing it for manners' sake, he drank it and wiped his mouth with +a red silk handkerchief he took out of his cap. + +"And when are we to start, your excellency?" + +"Well..." Anatole looked at his watch. "We'll start at once. Mind, +Balaga! You'll get there in time? Eh?" + +"That depends on our luck in starting, else why shouldn't we be +there in time?" replied Balaga. "Didn't we get you to Tver in seven +hours? I think you remember that, your excellency?" + +"Do you know, one Christmas I drove from Tver," said Anatole, +smilingly at the recollection and turning to Makarin who gazed +rapturously at him with wide-open eyes. "Will you believe it, Makarka, +it took one's breath away, the rate we flew. We came across a train of +loaded sleighs and drove right over two of them. Eh?" + +"Those were horses!" Balaga continued the tale. "That time I'd +harnessed two young side horses with the bay in the shafts," he went +on, turning to Dolokhov. "Will you believe it, Theodore Ivanych, those +animals flew forty miles? I couldn't hold them in, my hands grew +numb in the sharp frost so that I threw down the reins--'Catch hold +yourself, your excellency!' says I, and I just tumbled on the bottom +of the sleigh and sprawled there. It wasn't a case of urging them +on, there was no holding them in till we reached the place. The devils +took us there in three hours! Only the near one died of it." + + + + + +CHAPTER XVII + + +Anatole went out of the room and returned a few minutes later +wearing a fur coat girt with a silver belt, and a sable cap jauntily +set on one side and very becoming to his handsome face. Having +looked in a mirror, and standing before Dolokhov in the same pose he +had assumed before it, he lifted a glass of wine. + +"Well, good-by, Theodore. Thank you for everything and farewell!" +said Anatole. "Well, comrades and friends..." he considered for a +moment "...of my youth, farewell!" he said, turning to Makarin and the +others. + +Though they were all going with him, Anatole evidently wished to +make something touching and solemn out of this address to his +comrades. He spoke slowly in a loud voice and throwing out his chest +slightly swayed one leg. + +"All take glasses; you too, Balaga. Well, comrades and friends of my +youth, we've had our fling and lived and reveled. Eh? And now, when +shall we meet again? I am going abroad. We have had a good time--now +farewell, lads! To our health! Hurrah!..." he cried, and emptying +his glass flung it on the floor. + +"To your health!" said Balaga who also emptied his glass, and +wiped his mouth with his handkerchief. + +Makarin embraced Anatole with tears in his eyes. + +"Ah, Prince, how sorry I am to part from you! + +"Let's go. Let's go!" cried Anatole. + +Balaga was about to leave the room. + +"No, stop!" said Anatole. "Shut the door; we have first to sit down. +That's the way." + +They shut the door and all sat down. + +"Now, quick march, lads!" said Anatole, rising. + +Joseph, his valet, handed him his sabretache and saber, and they all +went out into the vestibule. + +"And where's the fur cloak?" asked Dolokhov. "Hey, Ignatka! Go to +Matrena Matrevna and ask her for the sable cloak. I have heard what +elopements are like," continued Dolokhov with a wink. "Why, she'll +rush out more dead than alive just in the things she is wearing; if +you delay at all there'll be tears and 'Papa' and 'Mamma,' and she's +frozen in a minute and must go back--but you wrap the fur cloak +round her first thing and carry her to the sleigh." + +The valet brought a woman's fox-lined cloak. + +"Fool, I told you the sable one! Hey, Matrena, the sable!" he +shouted so that his voice rang far through the rooms. + +A handsome, slim, and pale-faced gypsy girl with glittering black +eyes and curly blue-black hair, wearing a red shawl, ran out with a +sable mantle on her arm. + +"Here, I don't grudge it--take it!" she said, evidently afraid of +her master and yet regretful of her cloak. + +Dolokhov, without answering, took the cloak, threw it over +Matrena, and wrapped her up in it. + +"That's the way," said Dolokhov, "and then so!" and he turned the +collar up round her head, leaving only a little of the face uncovered. +"And then so, do you see?" and he pushed Anatole's head forward to +meet the gap left by the collar, through which Matrena's brilliant +smile was seen. + +"Well, good-by, Matrena," said Anatole, kissing her. "Ah, my +revels here are over. Remember me to Steshka. There, good-by! Good-by, +Matrena, wish me luck!" + +"Well, Prince, may God give you great luck!" said Matrena in her +gypsy accent. + +Two troykas were standing before the porch and two young drivers +were holding the horses. Balaga took his seat in the front one and +holding his elbows high arranged the reins deliberately. Anatole and +Dolokhov got in with him. Makarin, Khvostikov, and a valet seated +themselves in the other sleigh. + +"Well, are you ready?" asked Balaga. + +"Go!" he cried, twisting the reins round his hands, and the troyka +tore down the Nikitski Boulevard. + +"Tproo! Get out of the way! Hi!... Tproo!..." The shouting of Balaga +and of the sturdy young fellow seated on the box was all that could be +heard. On the Arbat Square the troyka caught against a carriage; +something cracked, shouts were heard, and the troyka flew along the +Arbat Street. + +After taking a turn along the Podnovinski Boulevard, Balaga began to +rein in, and turning back drew up at the crossing of the old +Konyusheny Street. + +The young fellow on the box jumped down to hold the horses and +Anatole and Dolokhov went along the pavement. When they reached the +gate Dolokhov whistled. The whistle was answered, and a maidservant +ran out. + +"Come into the courtyard or you'll be seen; she'll come out +directly," said she. + +Dolokhov stayed by the gate. Anatole followed the maid into the +courtyard, turned the corner, and ran up into the porch. + +He was met by Gabriel, Marya Dmitrievna's gigantic footman. + +"Come to the mistress, please," said the footman in his deep bass, +intercepting any retreat. + +"To what Mistress? Who are you?" asked Anatole in a breathless +whisper. + +"Kindly step in, my orders are to bring you in." + +"Kuragin! Come back!" shouted Dolokhov. "Betrayed! Back!" + +Dolokhov, after Anatole entered, had remained at the wicket gate and +was struggling with the yard porter who was trying to lock it. With +a last desperate effort Dolokhov pushed the porter aside, and when +Anatole ran back seized him by the arm, pulled him through the wicket, +and ran back with him to the troyka. + + + + + +CHAPTER XVIII + + +Marya Dmitrievna, having found Sonya weeping in the corridor, made +her confess everything, and intercepting the note to Natasha she +read it and went into Natasha's room with it in her hand. + +"You shameless good-for-nothing!" said she. "I won't hear a word." + +Pushing back Natasha who looked at her with astonished but +tearless eyes, she locked her in; and having given orders to the +yard porter to admit the persons who would be coming that evening, but +not to let them out again, and having told the footman to bring them +up to her, she seated herself in the drawing room to await the +abductors. + +When Gabriel came to inform her that the men who had come had run +away again, she rose frowning, and clasping her hands behind her paced +through the rooms a long time considering what she should do. Toward +midnight she went to Natasha's room fingering the key in her pocket. +Sonya was sitting sobbing in the corridor. "Marya Dmitrievna, for +God's sake let me in to her!" she pleaded, but Marya Dmitrievna +unlocked the door and went in without giving her an answer.... +"Disgusting, abominable... In my house... horrid girl, hussy! I'm only +sorry for her father!" thought she, trying to restrain her wrath. +"Hard as it may be, I'll tell them all to hold their tongues and +will hide it from the count." She entered the room with resolute +steps. Natasha lying on the sofa, her head hidden in her hands, and +she did not stir. She was in just the same position in which Marya +Dmitrievna had left her. + +"A nice girl! Very nice!" said Marya Dmitrievna. "Arranging meetings +with lovers in my house! It's no use pretending: you listen when I +speak to you!" And Marya Dmitrievna touched her arm. "Listen when when +I speak! You've disgraced yourself like the lowest of hussies. I'd +treat you differently, but I'm sorry for your father, so I will +conceal it." + +Natasha did not change her position, but her whole body heaved +with noiseless, convulsive sobs which choked her. Marya Dmitrievna +glanced round at Sonya and seated herself on the sofa beside Natasha. + +"It's lucky for him that he escaped me; but I'll find him!" she said +in her rough voice. "Do you hear what I am saying or not?" she added. + +She put her large hand under Natasha's face and turned it toward +her. Both Marya Dmitrievna and Sonya were amazed when they saw how +Natasha looked. Her eyes were dry and glistening, her lips compressed, +her cheeks sunken. + +"Let me be!... What is it to me?... I shall die!" she muttered, +wrenching herself from Marya Dmitrievna's hands with a vicious +effort and sinking down again into her former position. + +"Natalie!" said Marya Dmitrievna. "I wish for your good. Lie +still, stay like that then, I won't touch you. But listen. I won't +tell you how guilty you are. You know that yourself. But when your +father comes back tomorrow what am I to tell him? Eh?" + +Again Natasha's body shook with sobs. + +"Suppose he finds out, and your brother, and your betrothed?" + +"I have no betrothed: I have refused him!" cried Natasha. + +"That's all the same," continued Dmitrievna. "If they hear of +this, will they let it pass? He, your father, I know him... if he +challenges him to a duel will that be all right? Eh?" + +"Oh, let me be! Why have you interfered at all? Why? Why? Who +asked you to?" shouted Natasha, raising herself on the sofa and +looking malignantly at Marya Dmitrievna. + +"But what did you want?" cried Marya Dmitrievna, growing angry +again. "Were you kept under lock and key? Who hindered his coming to +the house? Why carry you off as if you were some gypsy singing +girl?... Well, if he had carried you off... do you think they wouldn't +have found him? Your father, or brother, or your betrothed? And he's a +scoundrel, a wretch--that's a fact!" + +"He is better than any of you!" exclaimed Natasha getting up. "If +you hadn't interfered... Oh, my God! What is it all? What is it? +Sonya, why?... Go away!" + +And she burst into sobs with the despairing vehemence with which +people bewail disasters they feel they have themselves occasioned. +Marya Dmitrievna was to speak again but Natasha cried out: + +"Go away! Go away! You all hate and despise me!" and she threw +herself back on the sofa. + +Marya Dmitrievna went on admonishing her for some time, enjoining on +her that it must all be kept from her father and assuring her that +nobody would know anything about it if only Natasha herself would +undertake to forget it all and not let anyone see that something had +happened. Natasha did not reply, nor did she sob any longer, but she +grew cold and had a shivering fit. Marya Dmitrievna put a pillow under +her head, covered her with two quilts, and herself brought her some +lime-flower water, but Natasha did not respond to her. + +"Well, let her sleep," said Marya Dmitrievna as she went of the room +supposing Natasha to be asleep. + +But Natasha was not asleep; with pale face and fixed wide-open +eyes she looked straight before her. All that night she did not +sleep or weep and did not speak to Sonya who got up and went to her +several times. + +Next day Count Rostov returned from his estate near Moscow in time +for lunch as he had promised. He was in very good spirits; the +affair with the purchaser was going on satisfactorily, and there was +nothing to keep him any longer in Moscow, away from the countess +whom he missed. Marya Dmitrievna met him and told him that Natasha had +been very unwell the day before and that they had sent for the doctor, +but that she was better now. Natasha had not left her room that +morning. With compressed and parched lips and dry fixed eyes, she +sat at the window, uneasily watching the people who drove past and +hurriedly glancing round at anyone who entered the room. She was +evidently expecting news of him and that he would come or would +write to her. + +When the count came to see her she turned anxiously round at the +sound of a man's footstep, and then her face resumed its cold and +malevolent expression. She did not even get up to greet him. "What +is the matter with you, my angel? Are you ill?" asked the count. + +After a moment's silence Natasha answered: "Yes, ill." + +In reply to the count's anxious inquiries as to why she was so +dejected and whether anything had happened to her betrothed, she +assured him that nothing had happened and asked him not to worry. +Marya Dmitrievna confirmed Natasha's assurances that nothing had +happened. From the pretense of illness, from his daughter's +distress, and by the embarrassed faces of Sonya and Marya +Dmitrievna, the count saw clearly that something had gone wrong during +his absence, but it was so terrible for him to think that anything +disgraceful had happened to his beloved daughter, and he so prized his +own cheerful tranquillity, that he avoided inquiries and tried to +assure himself that nothing particularly had happened; and he was only +dissatisfied that her indisposition delayed their return to the +country. + + + + + +CHAPTER XIX + + +From the day his wife arrived in Moscow Pierre had been intending to +go away somewhere, so as not to be near her. Soon after the Rostovs +came to Moscow the effect Natasha had on him made him hasten to +carry out his intention. He went to Tver to see Joseph Alexeevich's +widow, who had long since promised to hand over to him some papers +of her deceased husband's. + +When he returned to Moscow Pierre was handed a letter from Marya +Dmitrievna asking him to come and see her on a matter of great +importance relating to Andrew Bolkonski and his betrothed. Pierre +had been avoiding Natasha because it seemed to him that his feeling +for her was stronger than a married man's should be for his friend's +fiancee. Yet some fate constantly threw them together. + +"What can have happened? And what can they want with me?" thought he +as he dressed to go to Marya Dmitrievna's. "If only Prince Andrew +would hurry up and come and marry her!" thought he on his way to the +house. + +On the Tverskoy Boulevard a familiar voice called to him. + +"Pierre! Been back long?" someone shouted. Pierre raised his head. +In a sleigh drawn by two gray trotting-horses that were bespattering +the dashboard with snow, Anatole and his constant companion Makarin +dashed past. Anatole was sitting upright in the classic pose of +military dandies, the lower part of his face hidden by his beaver +collar and his head slightly bent. His face was fresh and rosy, his +white-plumed hat, tilted to one side, disclosed his curled and pomaded +hair besprinkled with powdery snow. + +"Yes, indeed, that's a true sage," thought Pierre. "He sees +nothing beyond the pleasure of the moment, nothing troubles him and so +he is always cheerful, satisfied, and serene. What wouldn't I give +to be like him!" he thought enviously. + +In Marya Dmitrievna's anteroom the footman who helped him off with +his fur coat said that the mistress asked him to come to her bedroom. + +When he opened the ballroom door Pierre saw Natasha sitting at the +window, with a thin, pale, and spiteful face. She glanced round at +him, frowned, and left the room with an expression of cold dignity. + +"What has happened?" asked Pierre, entering Marya Dmitrievna's room. + +"Fine doings!" answered Dmitrievna. "For fifty-eight years have I +lived in this world and never known anything so disgraceful!" + +And having put him on his honor not to repeat anything she told him, +Marya Dmitrievna informed him that Natasha had refused Prince Andrew +without her parents' knowledge and that the cause of this was +Anatole Kuragin into whose society Pierre's wife had thrown her and +with whom Natasha had tried to elope during her father's absence, in +order to be married secretly. + +Pierre raised his shoulders and listened open-mouthed to what was +told him, scarcely able to believe his own ears. That Prince +Andrew's deeply loved affianced wife--the same Natasha Rostova who +used to be so charming--should give up Bolkonski for that fool Anatole +who was already secretly married (as Pierre knew), and should be so in +love with him as to agree to run away with him, was something Pierre +could not conceive and could not imagine. + +He could not reconcile the charming impression he had of Natasha, +whom he had known from a child, with this new conception of her +baseness, folly, and cruelty. He thought of his wife. "They are all +alike!" he said to himself, reflecting that he was not the only man +unfortunate enough to be tied to a bad woman. But still he pitied +Prince Andrew to the point of tears and sympathized with his wounded +pride, and the more he pitied his friend the more did he think with +contempt and even with disgust of that Natasha who had just passed him +in the ballroom with such a look of cold dignity. He did not know that +Natasha's soul was overflowing with despair, shame, and humiliation, +and that it was not her fault that her face happened to assume an +expression of calm dignity and severity. + +"But how get married?" said Pierre, in answer to Marya Dmitrievna. +"He could not marry--he is married!" + +"Things get worse from hour to hour!" ejaculated Marya Dmitrievna. +"A nice youth! What a scoundrel! And she's expecting him--expecting +him since yesterday. She must be told! Then at least she won't go on +expecting him." + +After hearing the details of Anatole's marriage from Pierre, and +giving vent to her anger against Anatole in words of abuse, Marya +Dmitrievna told Pierre why she had sent for him. She was afraid that +the count or Bolkonski, who might arrive at any moment, if they knew +of this affair (which she hoped to hide from them) might challenge +Anatole to a duel, and she therefore asked Pierre to tell his +brother-in-law in her name to leave Moscow and not dare to let her set +eyes on him again. Pierre--only now realizing the danger to the old +count, Nicholas, and Prince Andrew--promised to do as she wished. +Having briefly and exactly explained her wishes to him, she let him go +to the drawing room. + +"Mind, the count knows nothing. Behave as if you know nothing +either," she said. "And I will go and tell her it is no use +expecting him! And stay to dinner if you care to!" she called after +Pierre. + +Pierre met the old count, who seemed nervous and upset. That morning +Natasha had told him that she had rejected Bolkonski. + +"Troubles, troubles, my dear fellow!" he said to Pierre. "What +troubles one has with these girls without their mother! I do so regret +having come here.... I will be frank with you. Have you heard she +has broken off her engagement without consulting anybody? It's true +this engagement never was much to my liking. Of course he is an +excellent man, but still, with his father's disapproval they +wouldn't have been happy, and Natasha won't lack suitors. Still, it +has been going on so long, and to take such a step without father's or +mother's consent! And now she's ill, and God knows what! It's hard, +Count, hard to manage daughters in their mother's absence...." + +Pierre saw that the count was much upset and tried to change the +subject, but the count returned to his troubles. + +Sonya entered the room with an agitated face. + +"Natasha is not quite well; she's in her room and would like to +see you. Marya Dmitrievna is with her and she too asks you to come." + +"Yes, you are a great friend of Bolkonski's, no doubt she wants to +send him a message," said the count. "Oh dear! Oh dear! How happy it +all was!" + +And clutching the spare gray locks on his temples the count left the +room. + +When Marya Dmitrievna told Natasha that Anatole was married, Natasha +did not wish to believe it and insisted on having it confirmed by +Pierre himself. Sonya told Pierre this as she led him along the +corridor to Natasha's room. + +Natasha, pale and stern, was sitting beside Marya Dmitrievna, and +her eyes, glittering feverishly, met Pierre with a questioning look +the moment he entered. She did not smile or nod, but only gazed +fixedly at him, and her look asked only one thing: was he a friend, or +like the others an enemy in regard to Anatole? As for Pierre, he +evidently did not exist for her. + +"He knows all about it," said Marya Dmitrievna pointing to Pierre +and addressing Natasha. "Let him tell you whether I have told the +truth." + +Natasha looked from one to the other as a hunted and wounded +animal looks at the approaching dogs and sportsmen. + +"Natalya Ilynichna," Pierre began, dropping his eyes with a +feeling of pity for her and loathing for the thing he had to do, +"whether it is true or not should make no difference to you, +because..." + +"Then it is not true that he's married!" + +"Yes, it is true." + +"Has he been married long?" she asked. "On your honor?..." + +Pierre gave his word of honor. + +"Is he still here?" she asked, quickly. + +"Yes, I have just seen him." + +She was evidently unable to speak and made a sign with her hands +that they should leave her alone. + + + + + +CHAPTER XX + + +Pierre did not stay for dinner, but left the room and went away at +once. He drove through the town seeking Anatole Kuragin, at the +thought of whom now the blood rushed to his heart and he felt a +difficulty in breathing. He was not at the ice hills, nor at the +gypsies', nor at Komoneno's. Pierre drove to the Club. In the Club all +was going on as usual. The members who were assembling for dinner were +sitting about in groups; they greeted Pierre and spoke of the town +news. The footman having greeted him, knowing his habits and his +acquaintances, told him there was a place left for him in the small +dining room and that Prince Michael Zakharych was in the library, +but Paul Timofeevich had not yet arrived. One of Pierre's +acquaintances, while they were talking about the weather, asked if +he had heard of Kuragin's abduction of Rostova which was talked of +in the town, and was it true? Pierre laughed and said it was +nonsense for he had just come from the Rostovs'. He asked everyone +about Anatole. One man told him he had not come yet, and another +that he was coming to dinner. Pierre felt it strange to see this calm, +indifferent crowd of people unaware of what was going on in his +soul. He paced through the ballroom, waited till everyone had come, +and as Anatole had not turned up did not stay for dinner but drove +home. + +Anatole, for whom Pierre was looking, dined that day with +Dolokhov, consulting him as to how to remedy this unfortunate +affair. It seemed to him essential to see Natasha. In the evening he +drove to his sister's to discuss with her how to arrange a meeting. +When Pierre returned home after vainly hunting all over Moscow, his +valet informed him that Prince Anatole was with the countess. The +countess' drawing room was full of guests. + +Pierre without greeting his wife whom he had not seen since his +return--at that moment she was more repulsive to him than ever- +entered the drawing room and seeing Anatole went up to him. + +"Ah, Pierre," said the countess going up to her husband. "You +don't know what a plight our Anatole..." + +She stopped, seeing in the forward thrust of her husband's head, +in his glowing eyes and his resolute gait, the terrible indications of +that rage and strength which she knew and had herself experienced +after his duel with Dolokhov. + +"Where you are, there is vice and evil!" said Pierre to his wife. +"Anatole, come with me! I must speak to you," he added in French. + +Anatole glanced round at his sister and rose submissively, ready +to follow Pierre. Pierre, taking him by the arm, pulled him toward +himself and was leading him from the room. + +"If you allow yourself in my drawing room..." whispered Helene, +but Pierre did not reply and went out of the room. + +Anatole followed him with his usual jaunty step but his face +betrayed anxiety. + +Having entered his study Pierre closed the door and addressed +Anatole without looking at him. + +"You promised Countess Rostova to marry her and were about to +elope with her, is that so?" + +"Mon cher," answered Anatole (their whole conversation was in +French), "I don't consider myself bound to answer questions put to +me in that tone." + +Pierre's face, already pale, became distorted by fury. He seized +Anatole by the collar of his uniform with his big hand and shook him +from side to side till Anatole's face showed a sufficient degree of +terror. + +"When I tell you that I must talk to you!..." repeated Pierre. + +"Come now, this is stupid. What?" said Anatole, fingering a button +of his collar that had been wrenched loose with a bit of the cloth. + +"You're a scoundrel and a blackguard, and I don't know what deprives +me from the pleasure of smashing your head with this!" said Pierre, +expressing himself so artificially because he was talking French. + +He took a heavy paperweight and lifted it threateningly, but at once +put it back in its place. + +"Did you promise to marry her?" + +"I... I didn't think of it. I never promised, because..." + +Pierre interrupted him. + +"Have you any letters of hers? Any letters?" he said, moving +toward Anatole. + +Anatole glanced at him and immediately thrust his hand into his +pocket and drew out his pocketbook. + +Pierre took the letter Anatole handed him and, pushing aside a table +that stood in his way, threw himself on the sofa. + +"I shan't be violent, don't be afraid!" said Pierre in answer to a +frightened gesture of Anatole's. "First, the letters," said he, as +if repeating a lesson to himself. "Secondly," he continued after a +short pause, again rising and again pacing the room, "tomorrow you +must get out of Moscow." + +"But how can I?..." + +"Thirdly," Pierre continued without listening to him, "you must +never breathe a word of what has passed between you and Countess +Rostova. I know I can't prevent your doing so, but if you have a spark +of conscience..." Pierre paced the room several times in silence. + +Anatole sat at a table frowning and biting his lips. + +"After all, you must understand that besides your pleasure there +is such a thing as other people's happiness and peace, and that you +are ruining a whole life for the sake of amusing yourself! Amuse +yourself with women like my wife--with them you are within your +rights, for they know what you want of them. They are armed against +you by the same experience of debauchery; but to promise a maid to +marry her... to deceive, to kidnap.... Don't you understand that it is +as mean as beating an old man or a child?..." + +Pierre paused and looked at Anatole no longer with an angry but with +a questioning look. + +"I don't know about that, eh?" said Anatole, growing more +confident as Pierre mastered his wrath. "I don't know that and don't +want to," he said, not looking at Pierre and with a slight tremor of +his lower jaw, "but you have used such words to me--'mean' and so +on--which as a man of honor I can't allow anyone to use." + +Pierre glanced at him with amazement, unable to understand what he +wanted. + +"Though it was tete-a-tete," Anatole continued, "still I can't..." + +"Is it satisfaction you want?" said Pierre ironically. + +"You could at least take back your words. What? If you want me to do +as you wish, eh?" + +"I take them back, I take them back!" said Pierre, "and I ask you to +forgive me." Pierre involuntarily glanced at the loose button. "And if +you require money for your journey..." + +Anatole smiled. The expression of that base and cringing smile, +which Pierre knew so well in his wife, revolted him. + +"Oh, vile and heartless brood!" he exclaimed, and left the room. + +Next day Anatole left for Petersburg. + + + + + +CHAPTER XXI + + +Pierre drove to Marya Dmitrievna's to tell her of the fulfillment of +her wish that Kuragin should be banished from Moscow. The whole +house was in a state of alarm and commotion. Natasha was very ill, +having, as Marya Dmitrievna told him in secret, poisoned herself the +night after she had been told that Anatole was married, with some +arsenic she had stealthily procured. After swallowing a little she had +been so frightened that she woke Sonya and told her what she had done. +The necessary antidotes had been administered in time and she was +now out of danger, though still so weak that it was out of the +question to move her to the country, and so the countess had been sent +for. Pierre saw the distracted count, and Sonya, who had a +tear-stained face, but he could not see Natasha. + +Pierre dined at the club that day and heard on all sides gossip +about the attempted abduction of Rostova. He resolutely denied these +rumors, assuring everyone that nothing had happened except that his +brother-in-law had proposed to her and been refused. It seemed to +Pierre that it was his duty to conceal the whole affair and +re-establish Natasha's reputation. + +He was awaiting Prince Andrew's return with dread and went every day +to the old prince's for news of him. + +Old Prince Bolkonski heard all the rumors current in the town from +Mademoiselle Bourienne and had read the note to Princess Mary in which +Natasha had broken off her engagement. He seemed in better spirits +than usual and awaited his son with great impatience. + +Some days after Anatole's departure Pierre received a note from +Prince Andrew, informing him of his arrival and asking him to come +to see him. + +As soon as he reached Moscow, Prince Andrew had received from his +father Natasha's note to Princess Mary breaking off her engagement +(Mademoiselle Bourienne had purloined it from Princess Mary and +given it to the old prince), and he heard from him the story of +Natasha's elopement, with additions. + +Prince Andrew had arrived in the evening and Pierre came to see +him next morning. Pierre expected to find Prince Andrew in almost +the same state as Natasha and was therefore surprised on entering +the drawing room to hear him in the study talking in a loud animated +voice about some intrigue going on in Petersburg. The old prince's +voice and another now and then interrupted him. Princess Mary came out +to meet Pierre. She sighed, looking toward the door of the room +where Prince Andrew was, evidently intending to express her sympathy +with his sorrow, but Pierre saw by her face that she was glad both +at what had happened and at the way her brother had taken the news +of Natasha's faithlessness. + +"He says he expected it," she remarked. "I know his pride will not +let him express his feelings, but still he has taken it better, far +better, than I expected. Evidently it had to be...." + +"But is it possible that all is really ended?" asked Pierre. + +Princess Mary looked at him with astonishment. She did not +understand how he could ask such a question. Pierre went into the +study. Prince Andrew, greatly changed and plainly in better health, +but with a fresh horizontal wrinkle between his brows, stood in +civilian dress facing his father and Prince Meshcherski, warmly +disputing and vigorously gesticulating. The conversation was about +Speranski--the news of whose sudden exile and alleged treachery had +just reached Moscow. + +"Now he is censured and accused by all who were enthusiastic about +him a month ago," Prince Andrew was saying, "and by those who were +unable to understand his aims. To judge a man who is in disfavor and +to throw on him all the blame of other men's mistakes is very easy, +but I maintain that if anything good has been accomplished in this +reign it was done by him, by him alone." + +He paused at the sight of Pierre. His face quivered and +immediately assumed a vindictive expression. + +"Posterity will do him justice," he concluded, and at once turned to +Pierre. + +"Well, how are you? Still getting stouter?" he said with +animation, but the new wrinkle on his forehead deepened. "Yes, I am +well," he said in answer to Pierre's question, and smiled. + +To Pierre that smile said plainly: "I am well, but my health is +now of no use to anyone." + +After a few words to Pierre about the awful roads from the Polish +frontier, about people he had met in Switzerland who knew Pierre, +and about M. Dessalles, whom he had brought from abroad to be his +son's tutor, Prince Andrew again joined warmly in the conversation +about Speranski which was still going on between the two old men. + +"If there were treason, or proofs of secret relations with Napoleon, +they would have been made public," he said with warmth and haste. "I +do not, and never did, like Speranski personally, but I like justice!" + +Pierre now recognized in his friend a need with which he was only +too familiar, to get excited and to have arguments about extraneous +matters in order to stifle thoughts that were too oppressive and too +intimate. When Prince Meshcherski had left, Prince Andrew took +Pierre's arm and asked him into the room that had been assigned him. A +bed had been made up there, and some open portmanteaus and trunks +stood about. Prince Andrew went to one and took out a small casket, +from which he drew a packet wrapped in paper. He did it all silently +and very quickly. He stood up and coughed. His face was gloomy and his +lips compressed. + +"Forgive me for troubling you..." + +Pierre saw that Prince Andrew was going to speak of Natasha, and his +broad face expressed pity and sympathy. This expression irritated +Prince Andrew, and in a determined, ringing, and unpleasant tone he +continued: + +"I have received a refusal from Countess Rostova and have heard +reports of your brother-in-law having sought her hand, or something of +that kind. Is that true?" + +"Both true and untrue," Pierre began; but Prince Andrew +interrupted him. + +"Here are her letters and her portrait," said he. + +He took the packet from the table and handed it to Pierre. + +"Give this to the countess... if you see her." + +"She is very ill," said Pierre. + +"Then she is here still?" said Prince Andrew. "And Prince +Kuragin?" he added quickly. + +"He left long ago. She has been at death's door." + +"I much regret her illness," said Prince Andrew; and he smiled +like his father, coldly, maliciously, and unpleasantly. + +"So Monsieur Kuragin has not honored Countess Rostova with his +hand?" said Prince Andrew, and he snorted several times. + +"He could not marry, for he was married already," said Pierre. + +Prince Andrew laughed disagreeably, again reminding one of his +father. + +"And where is your brother-in-law now, if I may ask?" he said. + +"He has gone to Peters... But I don't know," said Pierre. + +"Well, it doesn't matter," said Prince Andrew. "Tell Countess +Rostova that she was and is perfectly free and that I wish her all +that is good." + +Pierre took the packet. Prince Andrew, as if trying to remember +whether he had something more to say, or waiting to see if Pierre +would say anything, looked fixedly at him. + +"I say, do you remember our discussion in Petersburg?" asked Pierre, +"about..." + +"Yes," returned Prince Andrew hastily. "I said that a fallen woman +should be forgiven, but I didn't say I could forgive her. I can't." + +"But can this be compared...?" said Pierre. + +Prince Andrew interrupted him and cried sharply: "Yes, ask her +hand again, be magnanimous, and so on?... Yes, that would be very +noble, but I am unable to follow in that gentleman's footsteps. If you +wish to be my friend never speak to me of that... of all that! Well, +good-by. So you'll give her the packet?" + +Pierre left the room and went to the old prince and Princess Mary. + +The old man seemed livelier than usual. Princess Mary was the same +as always, but beneath her sympathy for her brother, Pierre noticed +her satisfaction that the engagement had been broken off. Looking at +them Pierre realized what contempt and animosity they all felt for the +Rostovs, and that it was impossible in their presence even to +mention the name of her who could give up Prince Andrew for anyone +else. + +At dinner the talk turned on the war, the approach of which was +becoming evident. Prince Andrew talked incessantly, arguing now with +his father, now with the Swiss tutor Dessalles, and showing an +unnatural animation, the cause of which Pierre so well understood. + + + + + +CHAPTER XXII + + +That same evening Pierre went to the Rostovs' to fulfill the +commission entrusted to him. Natasha was in bed, the count at the +Club, and Pierre, after giving the letters to Sonya, went to Marya +Dmitrievna who was interested to know how Prince Andrew had taken +the news. Ten minutes later Sonya came to Marya Dmitrievna. + +"Natasha insists on seeing Count Peter Kirilovich," said she. + +"But how? Are we to take him up to her? The room there has not +been tidied up." + +"No, she has dressed and gone into the drawing room," said Sonya. + +Marya Dmitrievna only shrugged her shoulders. + +"When will her mother come? She has worried me to death! Now mind, +don't tell her everything!" said she to Pierre. "One hasn't the +heart to scold her, she is so much to be pitied, so much to be +pitied." + +Natasha was standing in the middle of the drawing room, emaciated, +with a pale set face, but not at all shamefaced as Pierre expected +to find her. When he appeared at the door she grew flurried, evidently +undecided whether to go to meet him or to wait till he came up. + +Pierre hastened to her. He thought she would give him her hand as +usual; but she, stepping up to him, stopped, breathing heavily, her +arms hanging lifelessly just in the pose she used to stand in when she +went to the middle of the ballroom to sing, but with quite a different +expression of face. + +"Peter Kirilovich," she began rapidly, "Prince Bolkonski was your +friend--is your friend," she corrected herself. (It seemed to her that +everything that had once been must now be different.) "He told me once +to apply to you..." + +Pierre sniffed as he looked at her, but did not speak. Till then +he had reproached her in his heart and tried to despise her, but he +now felt so sorry for her that there was no room in his soul for +reproach. + +"He is here now: tell him... to for... forgive me!" She stopped +and breathed still more quickly, but did not shed tears. + +"Yes... I will tell him," answered Pierre; "but..." + +He did not know what to say. + +Natasha was evidently dismayed at the thought of what he might think +she had meant. + +"No, I know all is over," she said hurriedly. "No, that can never +be. I'm only tormented by the wrong I have done him. Tell him only +that I beg him to forgive, forgive, forgive me for everything...." + +She trembled all over and sat down on a chair. + +A sense of pity he had never before known overflowed Pierre's heart. + +"I will tell him, I will tell him everything once more," said +Pierre. "But... I should like to know one thing...." + +"Know what?" Natasha's eyes asked. + +"I should like to know, did you love..." Pierre did not know how +to refer to Anatole and flushed at the thought of him--"did you love +that bad man?" + +"Don't call him bad!" said Natasha. "But I don't know, don't know at +all...." + +She began to cry and a still greater sense of pity, tenderness, +and love welled up in Pierre. He felt the tears trickle under his +spectacles and hoped they would not be noticed. + +"We won't speak of it any more, my dear," said Pierre, and his +gentle, cordial tone suddenly seemed very strange to Natasha. + +"We won't speak of it, my dear--I'll tell him everything; but one +thing I beg of you, consider me your friend and if you want help, +advice, or simply to open your heart to someone--not now, but when +your mind is clearer think of me!" He took her hand and kissed it. +"I shall be happy if it's in my power..." + +Pierre grew confused. + +"Don't speak to me like that. I am not worth it!" exclaimed +Natasha and turned to leave the room, but Pierre held her hand. + +He knew he had something more to say to her. But when he said it +he was amazed at his own words. + +"Stop, stop! You have your whole life before you," said he to her. + +"Before me? No! All is over for me," she replied with shame and +self-abasement. + + "All over?" he repeated. "If I were not myself, but the handsomest, +cleverest, and best man in the world, and were free, I would this +moment ask on my knees for your hand and your love!" + +For the first time for many days Natasha wept tears of gratitude and +tenderness, and glancing at Pierre she went out of the room. + +Pierre too when she had gone almost ran into the anteroom, +restraining tears of tenderness and joy that choked him, and without +finding the sleeves of his fur cloak threw it on and got into his +sleigh. + +"Where to now, your excellency?" asked the coachman. + +"Where to?" Pierre asked himself. "Where can I go now? Surely not to +the Club or to pay calls?" All men seemed so pitiful, so poor, in +comparison with this feeling of tenderness and love he experienced: in +comparison with that softened, grateful, last look she had given him +through her tears. + +"Home!" said Pierre, and despite twenty-two degrees of frost +Fahrenheit he threw open the bearskin cloak from his broad chest and +inhaled the air with joy. + +It was clear and frosty. Above the dirty, ill-lit streets, above the +black roofs, stretched the dark starry sky. Only looking up at the sky +did Pierre cease to feel how sordid and humiliating were all mundane +things compared with the heights to which his soul had just been +raised. At the entrance to the Arbat Square an immense expanse of dark +starry sky presented itself to his eyes. Almost in the center of it, +above the Prechistenka Boulevard, surrounded and sprinkled on all +sides by stars but distinguished from them all by its nearness to +the earth, its white light, and its long uplifted tail, shone the +enormous and brilliant comet of 1812--the comet which was said to +portend all kinds of woes and the end of the world. In Pierre, +however, that comet with its long luminous tail aroused no feeling +of fear. On the contrary he gazed joyfully, his eyes moist with tears, +at this bright comet which, having traveled in its orbit with +inconceivable velocity through immeasurable space, seemed suddenly- +like an arrow piercing the earth--to remain fixed in a chosen spot, +vigorously holding its tail erect, shining and displaying its white +light amid countless other scintillating stars. It seemed to Pierre +that this comet fully responded to what was passing in his own +softened and uplifted soul, now blossoming into a new life. + + + + + +BOOK NINE: 1812 + + + + + +CHAPTER I + + +From the close of the year 1811 intensified arming and concentrating +of the forces of Western Europe began, and in 1812 these forces- +millions of men, reckoning those transporting and feeding the army- +moved from the west eastwards to the Russian frontier, toward which +since 1811 Russian forces had been similarly drawn. On the twelfth +of June, 1812, the forces of Western Europe crossed the Russian +frontier and war began, that is, an event took place opposed to +human reason and to human nature. Millions of men perpetrated +against one another such innumerable crimes, frauds, treacheries, +thefts, forgeries, issues of false money, burglaries, incendiarisms, +and murders as in whole centuries are not recorded in the annals of +all the law courts of the world, but which those who committed them +did not at the time regard as being crimes. + +What produced this extraordinary occurrence? What were its causes? +The historians tell us with naive assurance that its causes were the +wrongs inflicted on the Duke of Oldenburg, the nonobservance of the +Continental System, the ambition of Napoleon, the firmness of +Alexander, the mistakes of the diplomatists, and so on. + +Consequently, it would only have been necessary for Metternich, +Rumyantsev, or Talleyrand, between a levee and an evening party, to +have taken proper pains and written a more adroit note, or for +Napoleon to have written to Alexander: "My respected Brother, I +consent to restore the duchy to the Duke of Oldenburg"--and there +would have been no war. + +We can understand that the matter seemed like that to +contemporaries. It naturally seemed to Napoleon that the war was +caused by England's intrigues (as in fact he said on the island of St. +Helena). It naturally seemed to members of the English Parliament that +the cause of the war was Napoleon's ambition; to the Duke of +Oldenburg, that the cause of the war was the violence done to him; +to businessmen that the cause of the way was the Continental System +which was ruining Europe; to the generals and old soldiers that the +chief reason for the war was the necessity of giving them +employment; to the legitimists of that day that it was the need of +re-establishing les bons principes, and to the diplomatists of that +time that it all resulted from the fact that the alliance between +Russia and Austria in 1809 had not been sufficiently well concealed +from Napoleon, and from the awkward wording of Memorandum No. 178. +It is natural that these and a countless and infinite quantity of +other reasons, the number depending on the endless diversity of points +of view, presented themselves to the men of that day; but to us, to +posterity who view the thing that happened in all its magnitude and +perceive its plain and terrible meaning, these causes seem +insufficient. To us it is incomprehensible that millions of +Christian men killed and tortured each other either because Napoleon +was ambitious or Alexander was firm, or because England's policy was +astute or the Duke of Oldenburg wronged. We cannot grasp what +connection such circumstances have with the actual fact of slaughter +and violence: why because the Duke was wronged, thousands of men +from the other side of Europe killed and ruined the people of Smolensk +and Moscow and were killed by them. + +To us, their descendants, who are not historians and are not carried +away by the process of research and can therefore regard the event +with unclouded common sense, an incalculable number of causes +present themselves. The deeper we delve in search of these causes +the more of them we find; and each separate cause or whole series of +causes appears to us equally valid in itself and equally false by +its insignificance compared to the magnitude of the events, and by its +impotence--apart from the cooperation of all the other coincident +causes--to occasion the event. To us, the wish or objection of this or +that French corporal to serve a second term appears as much a cause as +Napoleon's refusal to withdraw his troops beyond the Vistula and to +restore the duchy of Oldenburg; for had he not wished to serve, and +had a second, a third, and a thousandth corporal and private also +refused, there would have been so many less men in Napoleon's army and +the war could not have occurred. + +Had Napoleon not taken offense at the demand that he should withdraw +beyond the Vistula, and not ordered his troops to advance, there would +have been no war; but had all his sergeants objected to serving a +second term then also there could have been no war. Nor could there +have been a war had there been no English intrigues and no Duke of +Oldenburg, and had Alexander not felt insulted, and had there not been +an autocratic government in Russia, or a Revolution in France and a +subsequent dictatorship and Empire, or all the things that produced +the French Revolution, and so on. Without each of these causes nothing +could have happened. So all these causes--myriads of causes--coincided +to bring it about. And so there was no one cause for that +occurrence, but it had to occur because it had to. Millions of men, +renouncing their human feelings and reason, had to go from west to +east to slay their fellows, just as some centuries previously hordes +of men had come from the east to the west, slaying their fellows. + +The actions of Napoleon and Alexander, on whose words the event +seemed to hang, were as little voluntary as the actions of any soldier +who was drawn into the campaign by lot or by conscription. This +could not be otherwise, for in order that the will of Napoleon and +Alexander (on whom the event seemed to depend) should be carried +out, the concurrence of innumerable circumstances was needed without +any one of which the event could not have taken place. It was +necessary that millions of men in whose hands lay the real power- +the soldiers who fired, or transported provisions and guns--should +consent to carry out the will of these weak individuals, and should +have been induced to do so by an infinite number of diverse and +complex causes. + +We are forced to fall back on fatalism as an explanation of +irrational events (that is to say, events the reasonableness of +which we do not understand). The more we try to explain such events in +history reasonably, the more unreasonable and incomprehensible do they +become to us. + +Each man lives for himself, using his freedom to attain his personal +aims, and feels with his whole being that he can now do or abstain +from doing this or that action; but as soon as he has done it, that +action performed at a certain moment in time becomes irrevocable and +belongs to history, in which it has not a free but a predestined +significance. + +There are two sides to the life of every man, his individual life, +which is the more free the more abstract its interests, and his +elemental hive life in which he inevitably obeys laws laid down for +him. + +Man lives consciously for himself, but is an unconscious +instrument in the attainment of the historic, universal, aims of +humanity. A deed done is irrevocable, and its result coinciding in +time with the actions of millions of other men assumes an historic +significance. The higher a man stands on the social ladder, the more +people he is connected with and the more power he has over others, the +more evident is the predestination and inevitability of his every +action. + +"The king's heart is in the hands of the Lord." + +A king is history's slave. + +History, that is, the unconscious, general, hive life of mankind, +uses every moment of the life of kings as a tool for its own purposes. + +Though Napoleon at that time, in 1812, was more convinced than +ever that it depended on him, verser (ou ne pas verser) le sang de ses +peuples*--as Alexander expressed it in the last letter he wrote him- +he had never been so much in the grip of inevitable laws, which +compelled him, while thinking that he was acting on his own +volition, to perform for the hive life--that is to say, for history- +whatever had to be performed. + + +*"To shed (or not to shed) the blood of his peoples." + + +The people of the west moved eastwards to slay their fellow men, and +by the law of coincidence thousands of minute causes fitted in and +co-ordinated to produce that movement and war: reproaches for the +nonobservance of the Continental System, the Duke of Oldenburg's +wrongs, the movement of troops into Prussia--undertaken (as it +seemed to Napoleon) only for the purpose of securing an armed peace, +the French Emperor's love and habit of war coinciding with his +people's inclinations, allurement by the grandeur of the preparations, +and the expenditure on those preparations and the need of obtaining +advantages to compensate for that expenditure, the intoxicating honors +he received in Dresden, the diplomatic negotiations which, in the +opinion of contemporaries, were carried on with a sincere desire to +attain peace, but which only wounded the self-love of both sides, +and millions of other causes that adapted themselves to +the event that was happening or coincided with it. + +When an apple has ripened and falls, why does it fall? Because of +its attraction to the earth, because its stalk withers, because it +is dried by the sun, because it grows heavier, because the wind shakes +it, or because the boy standing below wants to eat it? + +Nothing is the cause. All this is only the coincidence of conditions +in which all vital organic and elemental events occur. And the +botanist who finds that the apple falls because the cellular tissue +decays and so forth is equally right with the child who stands under +the tree and says the apple fell because he wanted to eat it and +prayed for it. Equally right or wrong is he who says that Napoleon +went to Moscow because he wanted to, and perished because Alexander +desired his destruction, and he who says that an undermined hill +weighing a million tons fell because the last navvy struck it for +the last time with his mattock. In historic events the so-called great +men are labels giving names to events, and like labels they have but +the smallest connection with the event itself. + +Every act of theirs, which appears to them an act of their own will, +is in an historical sense involuntary and is related to the whole +course of history and predestined from eternity. + + + + + +CHAPTER II + + +On the twenty-ninth of May Napoleon left Dresden, where he had spent +three weeks surrounded by a court that included princes, dukes, kings, +and even an emperor. Before leaving, Napoleon showed favor to the +emperor, kings, and princes who had deserved it, reprimanded the kings +and princes with whom he was dissatisfied, presented pearls and +diamonds of his own--that is, which he had taken from other kings- +to the Empress of Austria, and having, as his historian tells us, +tenderly embraced the Empress Marie Louise--who regarded him as her +husband, though he had left another wife in Paris--left her grieved by +the parting which she seemed hardly able to bear. Though the +diplomatists still firmly believed in the possibility of peace and +worked zealously to that end, and though the Emperor Napoleon +himself wrote a letter to Alexander, calling him Monsieur mon frere, +and sincerely assured him that he did not want war and would always +love and honor him--yet he set off to join his army, and at every +station gave fresh orders to accelerate the movement of his troops +from west to east. He went in a traveling coach with six horses, +surrounded by pages, aides-de-camp, and an escort, along the road to +Posen, Thorn, Danzig, and Konigsberg. At each of these towns thousands +of people met him with excitement and enthusiasm. + +The army was moving from west to east, and relays of six horses +carried him in the same direction. On the tenth of June,* coming up +with the army, he spent the night in apartments prepared for him on +the estate of a Polish count in the Vilkavisski forest. + + +*Old style. + + +Next day, overtaking the army, he went in a carriage to the +Niemen, and, changing into a Polish uniform, he drove to the riverbank +in order to select a place for the crossing. + +Seeing, on the other side, some Cossacks (les Cosaques) and the +wide-spreading steppes in the midst of which lay the holy city of +Moscow (Moscou, la ville sainte), the capital of a realm such as the +Scythia into which Alexander the Great had marched--Napoleon +unexpectedly, and contrary alike to strategic and diplomatic +considerations, ordered an advance, and the next day his army began to +cross the Niemen. + +Early in the morning of the twelfth of June he came out of his tent, +which was pitched that day on the steep left bank of the Niemen, and +looked through a spyglass at the streams of his troops pouring out +of the Vilkavisski forest and flowing over the three bridges thrown +across the river. The troops, knowing of the Emperor's presence, +were on the lookout for him, and when they caught sight of a figure in +an overcoat and a cocked hat standing apart from his suite in front of +his tent on the hill, they threw up their caps and shouted: "Vive +l'Empereur!" and one after another poured in a ceaseless stream out of +the vast forest that had concealed them and, separating, flowed on and +on by the three bridges to the other side. + +"Now we'll go into action. Oh, when he takes it in hand himself, +things get hot... by heaven!... There he is!... Vive l'Empereur! So +these are the steppes of Asia! It's a nasty country all the same. Au +revoir, Beauche; I'll keep the best palace in Moscow for you! Au +revoir. Good luck!... Did you see the Emperor? Vive l'Empereur!... +preur!--If they make me Governor of India, Gerard, I'll make you +Minister of Kashmir--that's settled. Vive l'Empereur! Hurrah! +hurrah! hurrah! The Cossacks--those rascals--see how they run! Vive +l'Empereur! There he is, do you see him? I've seen him twice, as I see +you now. The little corporal... I saw him give the cross to one of the +veterans.... Vive l'Empereur!" came the voices of men, old and +young, of most diverse characters and social positions. On the faces +of all was one common expression of joy at the commencement of the +long-expected campaign and of rapture and devotion to the man in the +gray coat who was standing on the hill. + +On the thirteenth of June a rather small, thoroughbred Arab horse +was brought to Napoleon. He mounted it and rode at a gallop to one +of the bridges over the Niemen, deafened continually by incessant +and rapturous acclamations which he evidently endured only because +it was impossible to forbid the soldiers to express their love of +him by such shouting, but the shouting which accompanied him +everywhere disturbed him and distracted him from the military cares +that had occupied him from the time he joined the army. He rode across +one of the swaying pontoon bridges to the farther side, turned sharply +to the left, and galloped in the direction of Kovno, preceded by +enraptured, mounted chasseurs of the Guard who, breathless with +delight, galloped ahead to clear a path for him through the troops. On +reaching the broad river Viliya, he stopped near a regiment of +Polish Uhlans stationed by the river. + +"Vivat!" shouted the Poles, ecstatically, breaking their ranks and +pressing against one another to see him. + +Napoleon looked up and down the river, dismounted, and sat down on a +log that lay on the bank. At a mute sign from him, a telescope was +handed him which he rested on the back of a happy page who had run +up to him, and he gazed at the opposite bank. Then he became +absorbed in a map laid out on the logs. Without lifting his head he +said something, and two of his aides-de-camp galloped off to the +Polish Uhlans. + +"What? What did he say?" was heard in the ranks of the Polish Uhlans +when one of the aides-de-camp rode up to them. + +The order was to find a ford and to cross the river. The colonel +of the Polish Uhlans, a handsome old man, flushed and, fumbling in his +speech from excitement, asked the aide-de-camp whether he would be +permitted to swim the river with his Uhlans instead of seeking a ford. +In evident fear of refusal, like a boy asking for permission to get on +a horse, he begged to be allowed to swim across the river before the +Emperor's eyes. The aide-de-camp replied that probably the Emperor +would not be displeased at this excess of zeal. + +As soon as the aide-de-camp had said this, the old mustached +officer, with happy face and sparkling eyes, raised his saber, shouted +"Vivat!" and, commanding the Uhlans to follow him, spurred his horse +and galloped into the river. He gave an angry thrust to his horse, +which had grown restive under him, and plunged into the water, heading +for the deepest part where the current was swift. Hundreds of Uhlans +galloped in after him. It was cold and uncanny in the rapid current in +the middle of the stream, and the Uhlans caught hold of one another as +they fell off their horses. Some of the horses were drowned and some +of the men; the others tried to swim on, some in the saddle and some +clinging to their horses' manes. They tried to make their way +forward to the opposite bank and, though there was a ford one third of +a mile away, were proud that they were swimming and drowning in this +river under the eyes of the man who sat on the log and was not even +looking at what they were doing. When the aide-de-camp, having +returned and choosing an opportune moment, ventured to draw the +Emperor's attention to the devotion of the Poles to his person, the +little man in the gray overcoat got up and, having summoned +Berthier, began pacing up and down the bank with him, giving him +instructions and occasionally glancing disapprovingly at the +drowning Uhlans who distracted his attention. + +For him it was no new conviction that his presence in any part of +the world, from Africa to the steppes of Muscovy alike, was enough +to dumfound people and impel them to insane self-oblivion. He called +for his horse and rode to his quarters. + +Some forty Uhlans were drowned in the river, though boats were +sent to their assistance. The majority struggled back to the bank from +which they had started. The colonel and some of his men got across and +with difficulty clambered out on the further bank. And as soon as they +had got out, in their soaked and streaming clothes, they shouted +"Vivat!" and looked ecstatically at the spot where Napoleon had been +but where he no longer was and at that moment considered themselves +happy. + +That evening, between issuing one order that the forged Russian +paper money prepared for use in Russia should be delivered as +quickly as possible and another that a Saxon should be shot, on whom a +letter containing information about the orders to the French army +had been found, Napoleon also gave instructions that the Polish +colonel who had needlessly plunged into the river should be enrolled +in the Legion d'honneur of which Napoleon was himself the head. + +Quos vult perdere dementat.* + + +*Those whom (God) wishes to destroy he drives mad. + + + + + +CHAPTER III + + +The Emperor of Russia had, meanwhile, been in Vilna for more than +a month, reviewing troops and holding maneuvers. Nothing was ready for +the war that everyone expected and to prepare for which the Emperor +had come from Petersburg. There was no general plan of action. The +vacillation between the various plans that were proposed had even +increased after the Emperor had been at headquarters for a month. Each +of the three armies had its own commander in chief, but there was no +supreme commander of all the forces, and the Emperor did not assume +that responsibility himself. + +The longer the Emperor remained in Vilna the less did everybody- +tired of waiting--prepare for the war. All the efforts of those who +surrounded the sovereign seemed directed merely to making him spend +his time pleasantly and forget that war was impending. + +In June, after many balls and fetes given by the Polish magnates, by +the courtiers, and by the Emperor himself, it occurred to one of the +Polish aides-de-camp in attendance that a dinner and ball should be +given for the Emperor by his aides-de-camp. This idea was eagerly +received. The Emperor gave his consent. The aides-de-camp collected +money by subscription. The lady who was thought to be most pleasing to +the Emperor was invited to act as hostess. Count Bennigsen, being a +landowner in the Vilna province, offered his country house for the +fete, and the thirteenth of June was fixed for a ball, dinner, +regatta, and fireworks at Zakret, Count Bennigsen's country seat. + + +The very day that Napoleon issued the order to cross the Niemen, and +his vanguard, driving off the Cossacks, crossed the Russian +frontier, Alexander spent the evening at the entertainment given by +his aides-de-camp at Bennigsen's country house. + +It was a gay and brilliant fete. Connoisseurs of such matters +declared that rarely had so many beautiful women been assembled in one +place. Countess Bezukhova was present among other Russian ladies who +had followed the sovereign from Petersburg to Vilna and eclipsed the +refined Polish ladies by her massive, so called Russian type of +beauty. The Emperor noticed her and honored her with a dance. + +Boris Drubetskoy, having left his wife in Moscow and being for the +present en garcon (as he phrased it), was also there and, though not +an aide-de-camp, had subscribed a large sum toward the expenses. Boris +was now a rich man who had risen to high honors and no longer sought +patronage but stood on an equal footing with the highest of those of +his own age. He was meeting Helene in Vilna after not having seen +her for a long time and did not recall the past, but as Helene was +enjoying the favors of a very important personage and Boris had only +recently married, they met as good friends of long standing. + +At midnight dancing was still going on. Helene, not having a +suitable partner, herself offered to dance the mazurka with Boris. +They were the third couple. Boris, coolly looking at Helene's dazzling +bare shoulders which emerged from a dark, gold-embroidered, gauze +gown, talked to her of old acquaintances and at the same time, unaware +of it himself and unnoticed by others, never for an instant ceased +to observe the Emperor who was in the same room. The Emperor was not +dancing, he stood in the doorway, stopping now one pair and now +another with gracious words which he alone knew how to utter. + +As the mazurka began, Boris saw that Adjutant General Balashev, +one of those in closest attendance on the Emperor, went up to him +and contrary to court etiquette stood near him while he was talking to +a Polish lady. Having finished speaking to her, the Emperor looked +inquiringly at Balashev and, evidently understanding that he only +acted thus because there were important reasons for so doing, nodded +slightly to the lady and turned to him. Hardly had Balashev begun to +speak before a look of amazement appeared on the Emperor's face. He +took Balashev by the arm and crossed the room with him, +unconsciously clearing a path seven yards wide as the people on both +sides made way for him. Boris noticed Arakcheev's excited face when +the sovereign went out with Balashev. Arakcheev looked at the +Emperor from under his brow and, sniffing with his red nose, stepped +forward from the crowd as if expecting the Emperor to address him. +(Boris understood that Arakcheev envied Balashev and was displeased +that evidently important news had reached the Emperor otherwise than +through himself.) + +But the Emperor and Balashev passed out into the illuminated +garden without noticing Arakcheev who, holding his sword and +glancing wrathfully around, followed some twenty paces behind them. + +All the time Boris was going through the figures of the mazurka, +he was worried by the question of what news Balashev had brought and +how he could find it out before others. In the figure in which he +had to choose two ladies, he whispered to Helene that he meant to +choose Countess Potocka who, he thought, had gone out onto the +veranda, and glided over the parquet to the door opening into the +garden, where, seeing Balashev and the Emperor returning to the +veranda, he stood still. They were moving toward the door. Boris, +fluttering as if he had not had time to withdraw, respectfully pressed +close to the doorpost with bowed head. + +The Emperor, with the agitation of one who has been personally +affronted, was finishing with these words: + +"To enter Russia without declaring war! I will not make peace as +long as a single armed enemy remains in my country!" It seemed to +Boris that it gave the Emperor pleasure to utter these words. He was +satisfied with the form in which he had expressed his thoughts, but +displeased that Boris had overheard it. + +"Let no one know of it!" the Emperor added with a frown. + +Boris understood that this was meant for him and, closing his +eyes, slightly bowed his head. The Emperor re-entered the ballroom and +remained there about another half-hour. + +Boris was thus the first to learn the news that the French army +had crossed the Niemen and, thanks to this, was able to show certain +important personages that much that was concealed from others was +usually known to him, and by this means he rose higher in their +estimation. + + +The unexpected news of the French having crossed the Niemen was +particularly startling after a month of unfulfilled expectations, +and at a ball. On first receiving the news, under the influence of +indignation and resentment the Emperor had found a phrase that pleased +him, fully expressed his feelings, and has since become famous. On +returning home at two o'clock that night he sent for his secretary, +Shishkov, and told him to write an order to the troops and a +rescript to Field Marshal Prince Saltykov, in which he insisted on the +words being inserted that he would not make peace so long as a +single armed Frenchman remained on Russian soil. + +Next day the following letter was sent to Napoleon: + + +Monsieur mon frere, + +Yesterday I learned that, despite the loyalty which I have kept my +engagements with Your Majesty, your troops have crossed the Russian +frontier, and I have this moment received from Petersburg a note, in +which Count Lauriston informs me, as a reason for this aggression, +that Your Majesty has considered yourself to be in a state of war with +me from the time Prince Kuragin asked for his passports. The reasons +on which the Duc de Bassano based his refusal to deliver them to him +would never have led me to suppose that that could serve as a +pretext for aggression. In fact, the ambassador, as he himself has +declared, was never authorized to make that demand, and as soon as I +was informed of it I let him know how much I disapproved of it and +ordered him to remain at his post. If Your Majesty does not intend +to shed the blood of our peoples for such a misunderstanding, and +consents to withdraw your troops from Russian territory, I will regard +what has passed as not having occurred and an understanding between us +will be possible. In the contrary case, Your Majesty, I shall see +myself forced to repel an attack that nothing on my part has provoked. +It still depends on Your Majesty to preserve humanity from the +calamity of another war. I am, etc., + (signed) Alexander + + + + + +CHAPTER IV + + +At two in the morning of the fourteenth of June, the Emperor, having +sent for Balashev and read him his letter to Napoleon, ordered him +to take it and hand it personally to the French Emperor. When +dispatching Balashev, the Emperor repeated to him the words that he +would not make peace so long as a single armed enemy remained on +Russian soil and told him to transmit those words to Napoleon. +Alexander did not insert them in his letter to Napoleon, because +with his characteristic tact he felt it would be injudicious to use +them at a moment when a last attempt at reconciliation was being made, +but he definitely instructed Balashev to repeat them personally to +Napoleon. + +Having set off in the small hours of the fourteenth, accompanied +by a bugler and two Cossacks, Balashev reached the French outposts +at the village of Rykonty, on the Russian side of the Niemen, by dawn. +There he was stopped by French cavalry sentinels. + +A French noncommissioned officer of hussars, in crimson uniform +and a shaggy cap, shouted to the approaching Balashev to halt. +Balashev did not do so at once, but continued to advance along the +road at a walking pace. + +The noncommissioned officer frowned and, muttering words of abuse, +advanced his horse's chest against Balashev, put his hand to his +saber, and shouted rudely at the Russian general, asking: was he +deaf that he did not do as he was told? Balashev mentioned who he was. +The noncommissioned officer began talking with his comrades about +regimental matters without looking at the Russian general. + +After living at the seat of the highest authority and power, after +conversing with the Emperor less than three hours before, and in +general being accustomed to the respect due to his rank in the +service, Balashev found it very strange here on Russian soil to +encounter this hostile, and still more this disrespectful, application +of brute force to himself. + +The sun was only just appearing from behind the clouds, the air +was fresh and dewy. A herd of cattle was being driven along the road +from the village, and over the fields the larks rose trilling, one +after another, like bubbles rising in water. + +Balashev looked around him, awaiting the arrival of an officer +from the village. The Russian Cossacks and bugler and the French +hussars looked silently at one another from time to time. + +A French colonel of hussars, who had evidently just left his bed, +came riding from the village on a handsome sleek gray horse, +accompanied by two hussars. The officer, the soldiers, and their +horses all looked smart and well kept. + +It was that first period of a campaign when troops are still in full +trim, almost like that of peacetime maneuvers, but with a shade of +martial swagger in their clothes, and a touch of the gaiety and spirit +of enterprise which always accompany the opening of a campaign. + +The French colonel with difficulty repressed a yawn, but was +polite and evidently understood Balashev's importance. He led him past +his soldiers and behind the outposts and told him that his wish to +be presented to the Emperor would most likely be satisfied +immediately, as the Emperor's quarters were, he believed, not far off. + +They rode through the village of Rykonty, past tethered French +hussar horses, past sentinels and men who saluted their colonel and +stared with curiosity at a Russian uniform, and came out at the +other end of the village. The colonel said that the commander of the +division was a mile and a quarter away and would receive Balashev +and conduct him to his destination. + +The sun had by now risen and shone gaily on the bright verdure. + +They had hardly ridden up a hill, past a tavern, before they saw a +group of horsemen coming toward them. In front of the group, on a +black horse with trappings that glittered in the sun, rode a tall +man with plumes in his hat and black hair curling down to his +shoulders. He wore a red mantle, and stretched his long legs forward +in French fashion. This man rode toward Balashev at a gallop, his +plumes flowing and his gems and gold lace glittering in the bright +June sunshine. + +Balashev was only two horses' length from the equestrian with the +bracelets, plunies, necklaces, and gold embroidery, who was +galloping toward him with a theatrically solemn countenance, when +Julner, the French colonel, whispered respectfully: "The King of +Naples!" It was, in fact, Murat, now called "King of Naples." Though +it was quite incomprehensible why he should be King of Naples, he +was called so, and was himself convinced that he was so, and therefore +assumed a more solemn and important air than formerly. He was so +sure that he really was the King of Naples that when, on the eve of +his departure from that city, while walking through the streets with +his wife, some Italians called out to him: "Viva il re!"* he turned to +his wife with a pensive smile and said: "Poor fellows, they don't know +that I am leaving them tomorrow!" + + +*"Long live the king." + + +But though he firmly believed himself to be King of Naples and +pitied the grief felt by the subjects he was abandoning, latterly, +after he had been ordered to return to military service--and +especially since his last interview with Napoleon in Danzig, when +his august brother-in-law had told him: "I made you King that you +should reign in my way, but not in yours!"--he had cheerfully taken up +his familiar business, and--like a well-fed but not overfat horse that +feels himself in harness and grows skittish between the shafts--he +dressed up in clothes as variegated and expensive as possible, and +gaily and contentedly galloped along the roads of Poland, without +himself knowing why or whither. + +On seeing the Russian general he threw back his head, with its +long hair curling to his shoulders, in a majestically royal manner, +and looked inquiringly at the French colonel. The colonel respectfully +informed His Majesty of Balashev's mission, whose name he could not +pronounce. + +"De Bal-macheve!" said the King (overcoming by his assurance the +difficulty that had presented itself to the colonel). "Charmed to make +your acquaintance, General!" he added, with a gesture of kingly +condescension. + +As soon as the King began to speak loud and fast his royal dignity +instantly forsook him, and without noticing it he passed into his +natural tone of good-natured familiarity. He laid his hand on the +withers of Balashev's horse and said: + +"Well, General, it all looks like war," as if regretting a +circumstance of which he was unable to judge. + +"Your Majesty," replied Balashev, "my master, the Emperor, does +not desire war and as Your Majesty sees..." said Balashev, using the +words Your Majesty at every opportunity, with the affectation +unavoidable in frequently addressing one to whom the title was still a +novelty. + +Murat's face beamed with stupid satisfaction as he listened to +"Monsieur de Bal-macheve." But royaute oblige!* and he felt it +incumbent on him, as a king and an ally, to confer on state affairs +with Alexander's envoy. He dismounted, took Balashev's arm, and moving +a few steps away from his suite, which waited respectfully, began to +pace up and down with him, trying to speak significantly. He +referred to the fact that the Emperor Napoleon had resented the demand +that he should withdraw his troops from Prussia, especially when +that demand became generally known and the dignity of France was +thereby offended. + + +*"Royalty has its obligations." + + +Balashev replied that there was "nothing offensive in the demand, +because..." but Murat interrupted him. + +"Then you don't consider the Emperor Alexander the aggressor?" he +asked unexpectedly, with a kindly and foolish smile. + +Balashev told him why he considered Napoleon to be the originator of +the war. + +"Oh, my dear general!" Murat again interrupted him, "with all my +heart I wish the Emperors may arrange the affair between them, and +that the war begun by no wish of mine may finish as quickly as +possible!" said he, in the tone of a servant who wants to remain +good friends with another despite a quarrel between their masters. + +And he went on to inquiries about the Grand Duke and the state of +his health, and to reminiscences of the gay and amusing times he had +spent with him in Naples. Then suddenly, as if remembering his royal +dignity, Murat solemnly drew himself up, assumed the pose in which +he had stood at his coronation, and, waving his right arm, said: + +"I won't detain you longer, General. I wish success to your +mission," and with his embroidered red mantle, his flowing feathers, +and his glittering ornaments, he rejoined his suite who were +respectfully awaiting him. + +Balashev rode on, supposing from Murat's words that he would very +soon be brought before Napoleon himself. But instead of that, at the +next village the sentinels of Davout's infantry corps detained him +as the pickets of the vanguard had done, and an adjutant of the +corps commander, who was fetched, conducted him into the village to +Marshal Davout. + + + + + +CHAPTER V + + +Davout was to Napoleon what Arakcheev was to Alexander--though not a +coward like Arakcheev, he was as precise, as cruel, and as unable to +express his devotion to his monarch except by cruelty. + +In the organism of states such men are necessary, as wolves are +necessary in the organism of nature, and they always exist, always +appear and hold their own, however incongruous their presence and +their proximity to the head of the government may be. This +inevitability alone can explain how the cruel Arakcheev, who tore +out a grenadier's mustache with his own hands, whose weak nerves +rendered him unable to face danger, and who was neither an educated +man nor a courtier, was able to maintain his powerful position with +Alexander, whose own character was chivalrous, noble, and gentle. + +Balashev found Davout seated on a barrel in the shed of a +peasant's hut, writing--he was auditing accounts. Better quarters +could have been found him, but Marshal Davout was one of those men who +purposely put themselves in most depressing conditions to have a +justification for being gloomy. For the same reason they are always +hard at work and in a hurry. "How can I think of the bright side of +life when, as you see, I am sitting on a barrel and working in a dirty +shed?" the expression of his face seemed to say. The chief pleasure +and necessity of such men, when they encounter anyone who shows +animation, is to flaunt their own dreary, persistent activity. +Davout allowed himself that pleasure when Balashev was brought in. +He became still more absorbed in his task when the Russian general +entered, and after glancing over his spectacles at Balashev's face, +which was animated by the beauty of the morning and by his talk with +Murat, he did not rise or even stir, but scowled still more and +sneered malevolently. + +When he noticed in Balashev's face the disagreeable impression +this reception produced, Davout raised his head and coldly asked +what he wanted. + +Thinking he could have been received in such a manner only because +Davout did not know that he was adjutant general to the Emperor +Alexander and even his envoy to Napoleon, Balashev hastened to +inform him of his rank and mission. Contrary to his expectation, +Davout, after hearing him, became still surlier and ruder. + +"Where is your dispatch?" he inquired. "Give it to me. I will send +it to the Emperor." + +Balashev replied that he had been ordered to hand it personally to +the Emperor. + +"Your Emperor's orders are obeyed in your army, but here," said +Davout, "you must do as you're told." + +And, as if to make the Russian general still more conscious of his +dependence on brute force, Davout sent an adjutant to call the officer +on duty. + +Balashev took out the packet containing the Emperor's letter and +laid it on the table (made of a door with its hinges still hanging +on it, laid across two barrels). Davout took the packet and read the +inscription. + +"You are perfectly at liberty to treat me with respect or not," +protested Balashev, "but permit me to observe that I have the honor to +be adjutant general to His Majesty...." + +Davout glanced at him silently and plainly derived pleasure from the +signs of agitation and confusion which appeared on Balashev's face. + +"You will be treated as is fitting," said he and, putting the packet +in his pocket, left the shed. + +A minute later the marshal's adjutant, de Castres, came in and +conducted Balashev to the quarters assigned him. + +That day he dined with the marshal, at the same board on the +barrels. + +Next day Davout rode out early and, after asking Balashev to come to +him, peremptorily requested him to remain there, to move on with the +baggage train should orders come for it to move, and to talk to no one +except Monsieur de Castres. + +After four days of solitude, ennui, and consciousness of his +impotence and insignificance--particularly acute by contrast with +the sphere of power in which he had so lately moved--and after several +marches with the marshal's baggage and the French army, which occupied +the whole district, Balashev was brought to Vilna--now occupied by the +French--through the very gate by which he had left it four days +previously. + +Next day the imperial gentleman-in-waiting, the Comte de Turenne, +came to Balashev and informed him of the Emperor Napoleon's wish to +honor him with an audience. + +Four days before, sentinels of the Preobrazhensk regiment had +stood in front of the house to which Balashev was conducted, and now +two French grenadiers stood there in blue uniforms unfastened in front +and with shaggy caps on their heads, and an escort of hussars and +Uhlans and a brilliant suite of aides-de-camp, pages, and generals, +who were waiting for Napoleon to come out, were standing at the porch, +round his saddle horse and his Mameluke, Rustan. Napoleon received +Balashev in the very house in Vilna from which Alexander had +dispatched him on his mission. + + + + + +CHAPTER VI + + +Though Balashev was used to imperial pomp, he was amazed at the +luxury and magnificence of Napoleon's court. + +The Comte de Turenne showed him into a big reception room where many +generals, gentlemen-in-waiting, and Polish magnates--several of whom +Balashev had seen at the court of the Emperor of Russia--were waiting. +Duroc said that Napoleon would receive the Russian general before +going for his ride. + +After some minutes, the gentleman-in-waiting who was on duty came +into the great reception room and, bowing politely, asked Balashev +to follow him. + +Balashev went into a small reception room, one door of which led +into a study, the very one from which the Russian Emperor had +dispatched him on his mission. He stood a minute or two, waiting. He +heard hurried footsteps beyond the door, both halves of it were opened +rapidly; all was silent and then from the study the sound was heard of +other steps, firm and resolute--they were those of Napoleon. He had +just finished dressing for his ride, and wore a blue uniform, +opening in front over a white waistcoat so long that it covered his +rotund stomach, white leather breeches tightly fitting the fat +thighs of his short legs, and Hessian boots. His short hair had +evidently just been brushed, but one lock hung down in the middle of +his broad forehead. His plump white neck stood out sharply above the +black collar of his uniform, and he smelled of Eau de Cologne. His +full face, rather young-looking, with its prominent chin, wore a +gracious and majestic expression of imperial welcome. + +He entered briskly, with a jerk at every step and his head +slightly thrown back. His whole short corpulent figure with broad +thick shoulders, and chest and stomach involuntarily protruding, had +that imposing and stately appearance one sees in men of forty who live +in comfort. It was evident, too, that he was in the best of spirits +that day. + +He nodded in answer to Balashav's low and respectful bow, and coming +up to him at once began speaking like a man who values every moment of +his time and does not condescend to prepare what he has to say but +is sure he will always say the right thing and say it well. + +"Good day, General!" said he. "I have received the letter you +brought from the Emperor Alexander and am very glad to see you." He +glanced with his large eyes into Balashav's face and immediately +looked past him. + +It was plain that Balashev's personality did not interest him at +all. Evidently only what took place within his own mind interested +him. Nothing outside himself had any significance for him, because +everything in the world, it seemed to him, depended entirely on his +will. + +"I do not, and did not, desire war," he continued, "but it has +been forced on me. Even now" (he emphasized the word) "I am ready to +receive any explanations you can give me." + +And he began clearly and concisely to explain his reasons for +dissatisfaction with the Russian government. Judging by the calmly +moderate and amicable tone in which the French Emperor spoke, Balashev +was firmly persuaded that he wished for peace and intended to enter +into negotiations. + +When Napoleon, having finished speaking, looked inquiringly at the +Russian envoy, Balashev began a speech he had prepared long before: +"Sire! The Emperor, my master..." but the sight of the Emperor's +eyes bent on him confused him. "You are flurried--compose yourself!" +Napoleon seemed to say, as with a scarcely perceptible smile he looked +at Balashev's uniform and sword. + +Balashev recovered himself and began to speak. He said that the +Emperor Alexander did not consider Kurakin's demand for his +passports a sufficient cause for war; that Kurakin had acted on his +own initiative and without his sovereign's assent, that the Emperor +Alexander did not desire war, and had no relations with England. + +"Not yet!" interposed Napoleon, and, as if fearing to give vent to +his feelings, he frowned and nodded slightly as a sign that Balashev +might proceed. + +After saying all he had been instructed to say, Balashev added +that the Emperor Alexander wished for peace, but would not enter +into negotiations except on condition that... Here Balashev hesitated: +he remembered the words the Emperor Alexander had not written in his +letter, but had specially inserted in the rescript to Saltykov and had +told Balashev to repeat to Napoleon. Balashev remembered these +words, "So long as a single armed foe remains on Russian soil," but +some complex feeling restrained him. He could not utter them, though +he wished to do so. He grew confused and said: "On condition that +the French army retires beyond the Niemen." + +Napoleon noticed Balashev's embarrassment when uttering these last +words; his face twitched and the calf of his left leg began to +quiver rhythmically. Without moving from where he stood he began +speaking in a louder tone and more hurriedly than before. During the +speech that followed, Balashev, who more than once lowered his eyes, +involuntarily noticed the quivering of Napoleon's left leg which +increased the more Napoleon raised his voice. + +"I desire peace, no less than the Emperor Alexander," he began. +"Have I not for eighteen months been doing everything to obtain it? +I have waited eighteen months for explanations. But in order to +begin negotiations, what is demanded of me?" he said, frowning and +making an energetic gesture of inquiry with his small white plump +hand. + +"The withdrawal of your army beyond the Niemen, sire," replied +Balashev. + +"The Niemen?" repeated Napoleon. "So now you want me to retire +beyond the Niemen--only the Niemen?" repeated Napoleon, looking +straight at Balashev. + +The latter bowed his head respectfully. + +Instead of the demand of four months earlier to withdraw from +Pomerania, only a withdrawal beyond the Niemen was now demanded. +Napoleon turned quickly and began to pace the room. + +"You say the demand now is that I am to withdraw beyond the Niemen +before commencing negotiations, but in just the same way two months +ago the demand was that I should withdraw beyond the Vistula and the +Oder, and yet you are willing to negotiate." + +He went in silence from one corner of the room to the other and +again stopped in front of Balashev. Balashev noticed that his left leg +was quivering faster than before and his face seemed petrified in +its stern expression. This quivering of his left leg was a thing +Napoleon was conscious of. "The vibration of my left calf is a great +sign with me," he remarked at a later date. + +"Such demands as to retreat beyond the Vistula and Oder may be +made to a Prince of Baden, but not to me!" Napoleon almost screamed, +quite to his own surprise. "If you gave me Petersburg and Moscow I +could not accept such conditions. You say I have begun this war! But +who first joined his army? The Emperor Alexander, not I! And you offer +me negotiations when I have expended millions, when you are in +alliance with England, and when your position is a bad one. You +offer me negotiations! But what is the aim of your alliance with +England? What has she given you?" he continued hurriedly, evidently no +longer trying to show the advantages of peace and discuss its +possibility, but only to prove his own rectitude and power and +Alexander's errors and duplicity. + +The commencement of his speech had obviously been made with the +intention of demonstrating the advantages of his position and +showing that he was nevertheless willing to negotiate. But he had +begun talking, and the more he talked the less could he control his +words. + +The whole purport of his remarks now was evidently to exalt +himself and insult Alexander--just what he had least desired at the +commencement of the interview. + +"I hear you have made peace with Turkey?" + +Balashev bowed his head affirmatively. + +"Peace has been concluded..." he began. + +But Napoleon did not let him speak. He evidently wanted to do all +the talking himself, and continued to talk with the sort of +eloquence and unrestrained irritability to which spoiled people are so +prone. + +"Yes, I know you have made peace with the Turks without obtaining +Moldavia and Wallachia; I would have given your sovereign those +provinces as I gave him Finland. Yes," he went on, "I promised and +would have given the Emperor Alexander Moldavia and Wallachia, and now +he won't have those splendid provinces. Yet he might have united +them to his empire and in a single reign would have extended Russia +from the Gulf of Bothnia to the mouths of the Danube. Catherine the +Great could not have done more," said Napoleon, growing more and +more excited as he paced up and down the room, repeating to Balashev +almost the very words he had used to Alexander himself at Tilsit. "All +that, he would have owed to my friendship. Oh, what a splendid reign!" +he repeated several times, then paused, drew from his pocket a gold +snuffbox, lifted it to his nose, and greedily sniffed at it. + +"What a splendid reign the Emperor Alexander's might have been!" + +He looked compassionately at Balashev, and as soon as the latter +tried to make some rejoinder hastily interrupted him. + +"What could he wish or look for that he would not have obtained +through my friendship?" demanded Napoleon, shrugging his shoulders +in perplexity. "But no, he has preferred to surround himself with my +enemies, and with whom? With Steins, Armfeldts, Bennigsens, and +Wintzingerodes! Stein, a traitor expelled from his own country; +Armfeldt, a rake and an intriguer; Wintzingerode, a fugitive French +subject; Bennigsen, rather more of a soldier than the others, but +all the same an incompetent who was unable to do anything in 1807 +and who should awaken terrible memories in the Emperor Alexander's +mind.... Granted that were they competent they might be made use +of," continued Napoleon--hardly able to keep pace in words with the +rush of thoughts that incessantly sprang up, proving how right and +strong he was (in his perception the two were one and the same)- +"but they are not even that! They are neither fit for war nor peace! +Barclay is said to be the most capable of them all, but I cannot say +so, judging by his first movements. And what are they doing, all these +courtiers? Pfuel proposes, Armfeldt disputes, Bennigsen considers, and +Barclay, called on to act, does not know what to decide on, and time +passes bringing no result. Bagration alone is a military man. He's +stupid, but he has experience, a quick eye, and resolution.... And +what role is your young monarch playing in that monstrous crowd? +They compromise him and throw on him the responsibility for all that +happens. A sovereign should not be with the army unless he is a +general!" said Napoleon, evidently uttering these words as a direct +challenge to the Emperor. He knew how Alexander desired to be a +military commander. + +"The campaign began only a week ago, and you haven't even been +able to defend Vilna. You are cut in two and have been driven out of +the Polish provinces. Your army is grumbling." + +"On the contrary, Your Majesty," said Balashev, hardly able to +remember what had been said to him and following these verbal +fireworks with difficulty, "the troops are burning with eagerness..." + +"I know everything!" Napoleon interrupted him. "I know everything. I +know the number of your battalions as exactly as I know my own. You +have not two hundred thousand men, and I have three times that number. +I give you my word of honor," said Napoleon, forgetting that his +word of honor could carry no weight--"I give you my word of honor that +I have five hundred and thirty thousand men this side of the +Vistula. The Turks will be of no use to you; they are worth nothing +and have shown it by making peace with you. As for the Swedes--it is +their fate to be governed by mad kings. Their king was insane and they +changed him for another--Bernadotte, who promptly went mad--for no +Swede would ally himself with Russia unless he were mad." + +Napoleon grinned maliciously and again raised his snuffbox to his +nose. + +Balashev knew how to reply to each of Napoleon's remarks, and +would have done so; he continually made the gesture of a man wishing +to say something, but Napoleon always interrupted him. To the +alleged insanity of the Swedes, Balashev wished to reply that when +Russia is on her side Sweden is practically an island: but Napoleon +gave an angry exclamation to drown his voice. Napoleon was in that +state of irritability in which a man has to talk, talk, and talk, +merely to convince himself that he is in the right. Balashev began +to feel uncomfortable: as envoy he feared to demean his dignity and +felt the necessity of replying; but, as a man, he shrank before the +transport of groundless wrath that had evidently seized Napoleon. He +knew that none of the words now uttered by Napoleon had any +significance, and that Napoleon himself would be ashamed of them +when he came to his senses. Balashev stood with downcast eyes, looking +at the movements of Napoleon's stout legs and trying to avoid +meeting his eyes. + +"But what do I care about your allies?" said Napoleon. "I have +allies--the Poles. There are eighty thousand of them and they fight +like lions. And there will be two hundred thousand of them." + +And probably still more perturbed by the fact that he had uttered +this obvious falsehood, and that Balashev still stood silently +before him in the same attitude of submission to fate, Napoleon +abruptly turned round, drew close to Balashev's face, and, +gesticulating rapidly and energetically with his white hands, almost +shouted: + +"Know that if you stir up Prussia against me, I'll wipe it off the +map of Europe!" he declared, his face pale and distorted by anger, and +he struck one of his small hands energetically with the other. "Yes, I +will throw you back beyond the Dvina and beyond the Dnieper, and +will re-erect against you that barrier which it was criminal and blind +of Europe to allow to be destroyed. Yes, that is what will happen to +you. That is what you have gained by alienating me!" And he walked +silently several times up and down the room, his fat shoulders +twitching. + +He put his snuffbox into his waistcoat pocket, took it out again, +lifted it several times to his nose, and stopped in front of Balashev. +He paused, looked ironically straight into Balashev's eyes, and said +in a quiet voice: + +"And yet what a splendid reign your master might have had!" + +Balashev, feeling it incumbent on him to reply, said that from the +Russian side things did not appear in so gloomy a light. Napoleon +was silent, still looking derisively at him and evidently not +listening to him. Balashev said that in Russia the best results were +expected from the war. Napoleon nodded condescendingly, as if to +say, "I know it's your duty to say that, but you don't believe it +yourself. I have convinced you." + +When Balashev had ended, Napoleon again took out his snuffbox, +sniffed at it, and stamped his foot twice on the floor as a signal. +The door opened, a gentleman-in-waiting, bending respectfully, +handed the Emperor his hat and gloves; another brought him a pocket +handkerchief. Napoleon, without giving them a glance, turned to +Balashev: + +"Assure the Emperor Alexander from me," said he, taking his hat, +"that I am as devoted to him as before: I know him thoroughly and very +highly esteem his lofty qualities. I will detain you no longer, +General; you shall receive my letter to the Emperor." + +And Napoleon went quickly to the door. Everyone in the reception +room rushed forward and descended the staircase. + + + + + +CHAPTER VII + + +After all that Napoleon had said to him--those bursts of anger and +the last dryly spoken words: "I will detain you no longer, General; +you shall receive my letter," Balashev felt convinced that Napoleon +would not wish to see him, and would even avoid another meeting with +him--an insulted envoy--especially as he had witnessed his unseemly +anger. But, to his surprise, Balashev received, through Duroc, an +invitation to dine with the Emperor that day. + +Bessieres, Caulaincourt, and Berthier were present at that dinner. + +Napoleon met Balashev cheerfully and amiably. He not only showed +no sign of constraint or self-reproach on account of his outburst that +morning, but, on the contrary, tried to reassure Balashev. It was +evident that he had long been convinced that it was impossible for him +to make a mistake, and that in his perception whatever he did was +right, not because it harmonized with any idea of right and wrong, but +because he did it. + +The Emperor was in very good spirits after his ride through Vilna, +where crowds of people had rapturously greeted and followed him. +From all the windows of the streets through which he rode, rugs, +flags, and his monogram were displayed, and the Polish ladies, +welcoming him, waved their handkerchiefs to him. + +At dinner, having placed Balashev beside him, Napoleon not only +treated him amiably but behaved as if Balashev were one of his own +courtiers, one of those who sympathized with his plans and ought to +rejoice at his success. In the course of conversation he mentioned +Moscow and questioned Balashev about the Russian capital, not merely +as an interested traveler asks about a new city he intends to visit, +but as if convinced that Balashev, as a Russian, must be flattered +by his curiosity. + +"How many inhabitants are there in Moscow? How many houses? Is it +true that Moscow is called 'Holy Moscow'? How many churches are +there in Moscow?" he asked. + +And receiving the reply that there were more than two hundred +churches, he remarked: + +"Why such a quantity of churches?" + +"The Russians are very devout," replied Balashev. + +"But a large number of monasteries and churches is always a sign +of the backwardness of a people," said Napoleon, turning to +Caulaincourt for appreciation of this remark. + +Balashev respectfully ventured to disagree with the French Emperor. + +"Every country has its own character," said he. + +"But nowhere in Europe is there anything like that," said Napoleon. + +"I beg your Majesty's pardon," returned Balashev, "besides Russia +there is Spain, where there are also many churches and monasteries." + +This reply of Balashev's, which hinted at the recent defeats of +the French in Spain, was much appreciated when he related it at +Alexander's court, but it was not much appreciated at Napoleon's +dinner, where it passed unnoticed. + +The uninterested and perplexed faces of the marshals showed that +they were puzzled as to what Balashev's tone suggested. "If there is a +point we don't see it, or it is not at all witty," their expressions +seemed to say. So little was his rejoinder appreciated that Napoleon +did not notice it at all and naively asked Balashev through what towns +the direct road from there to Moscow passed. Balashev, who was on +the alert all through the dinner, replied that just as "all roads lead +to Rome," so all roads lead to Moscow: there were many roads, and +"among them the road through Poltava, which Charles XII chose." +Balashev involuntarily flushed with pleasure at the aptitude of this +reply, but hardly had he uttered the word Poltava before +Caulaincourt began speaking of the badness of the road from Petersburg +to Moscow and of his Petersburg reminiscences. + +After dinner they went to drink coffee in Napoleon's study, which +four days previously had been that of the Emperor Alexander. +Napoleon sat down, toying with his Sevres coffee cup, and motioned +Balashev to a chair beside him. + +Napoleon was in that well-known after-dinner mood which, more than +any reasoned cause, makes a man contented with himself and disposed to +consider everyone his friend. It seemed to him that he was +surrounded by men who adored him: and he felt convinced that, after +his dinner, Balashev too was his friend and worshiper. Napoleon turned +to him with a pleasant, though slightly ironic, smile. + +"They tell me this is the room the Emperor Alexander occupied? +Strange, isn't it, General?" he said, evidently not doubting that this +remark would be agreeable to his hearer since it went to prove his, +Napoleon's, superiority to Alexander. + +Balashev made no reply and bowed his head in silence. + +"Yes. Four days ago in this room, Wintzingerode and Stein were +deliberating," continued Napoleon with the same derisive and +self-confident smile. "What I can't understand," he went on, "is +that the Emperor Alexander has surrounded himself with my personal +enemies. That I do not... understand. Has he not thought that I may +the same?" and he turned inquiringly to Balashev, and evidently this +thought turned him back on to the track of his morning's anger, +which was still fresh in him. + +"And let him know that I will do so!" said Napoleon, rising and +pushing his cup away with his hand. "I'll drive all his Wurttemberg, +Baden, and Weimar relations out of Germany.... Yes. I'll drive them +out. Let him prepare an asylum for them in Russia!" + +Balashev bowed his head with an air indicating that he would like to +make his bow and leave, and only listened because he could not help +hearing what was said to him. Napoleon did not notice this expression; +he treated Balashev not as an envoy from his enemy, but as a man now +fully devoted to him and who must rejoice at his former master's +humiliation. + +"And why has the Emperor Alexander taken command of the armies? What +is the good of that? War is my profession, but his business is to +reign and not to command armies! Why has he taken on himself such a +responsibility?" + +Again Napoleon brought out his snuffbox, paced several times up +and down the room in silence, and then, suddenly and unexpectedly, +went up to Balashev and with a slight smile, as confidently, +quickly, and simply as if he were doing something not merely +important but pleasing to Balashev, he raised his hand to the +forty-year-old Russian general's face and, taking him by the ear, +pulled it gently, smiling with his lips only. + +To have one's ear pulled by the Emperor was considered the +greatest honor and mark of favor at the French court. + +"Well, adorer and courtier of the Emperor Alexander, why don't you +say anything?" said he, as if it was ridiculous, in his presence, to +be the adorer and courtier of anyone but himself, Napoleon. "Are the +horses ready for the general?" he added, with a slight inclination +of his head in reply to Balashev's bow. "Let him have mine, he has a +long way to go!" + +The letter taken by Balashev was the last Napoleon sent to +Alexander. Every detail of the interview was communicated to the +Russian monarch, and the war began... + + + + + +CHAPTER VIII + + +After his interview with Pierre in Moscow, Prince Andrew went to +Petersburg, on business as he told his family, but really to meet +Anatole Kuragin whom he felt it necessary to encounter. On reaching +Petersburg he inquired for Kuragin but the latter had already left the +city. Pierre had warned his brother-in-law that Prince Andrew was on +his track. Anatole Kuragin promptly obtained an appointment from the +Minister of War and went to join the army in Moldavia. While in +Petersburg Prince Andrew met Kutuzov, his former commander who was +always well disposed toward him, and Kutuzov suggested that he +should accompany him to the army in Moldavia, to which the old general +had been appointed commander in chief. So Prince Andrew, having +received an appointment on the headquarters staff, left for Turkey. + +Prince Andrew did not think it proper to write and challenge +Kuragin. He thought that if he challenged him without some fresh cause +it might compromise the young Countess Rostova and so he wanted to +meet Kuragin personally in order to find a fresh pretext for a duel. +But he again failed to meet Kuragin in Turkey, for soon after Prince +Andrew arrived, the latter returned to Russia. In a new country, +amid new conditions, Prince Andrew found life easier to bear. After +his betrothed had broken faith with him--which he felt the more +acutely the more he tried to conceal its effects--the surroundings +in which he had been happy became trying to him, and the freedom and +independence he had once prized so highly were still more so. Not only +could he no longer think the thoughts that had first come to him as he +lay gazing at the sky on the field of Austerlitz and had later +enlarged upon with Pierre, and which had filled his solitude at +Bogucharovo and then in Switzerland and Rome, but he even dreaded to +recall them and the bright and boundless horizons they had +revealed. He was now concerned only with the nearest practical matters +unrelated to his past interests, and he seized on these the more +eagerly the more those past interests were closed to him. It was as if +that lofty, infinite canopy of heaven that had once towered above +him had suddenly turned into a low, solid vault that weighed him down, +in which all was clear, but nothing eternal or mysterious. + +Of the activities that presented themselves to him, army service was +the simplest and most familiar. As a general on duty on Kutuzov's +staff, he applied himself to business with zeal and perseverance and +surprised Kutuzov by his willingness and accuracy in work. Not +having found Kuragin in Turkey, Prince Andrew did not think it +necessary to rush back to Russia after him, but all the same he knew +that however long it might be before he met Kuragin, despite his +contempt for him and despite all the proofs he deduced to convince +himself that it was not worth stooping to a conflict with him--he knew +that when he did meet him he would not be able to resist calling him +out, any more than a ravenous man can help snatching at food. And +the consciousness that the insult was not yet avenged, that his rancor +was still unspent, weighed on his heart and poisoned the artificial +tranquillity which he managed to obtain in Turkey by means of +restless, plodding, and rather vainglorious and ambitious activity. + +In the year 1812, when news of the war with Napoleon reached +Bucharest--where Kutuzov had been living for two months, passing his +days and nights with a Wallachian woman--Prince Andrew asked Kutuzov +to transfer him to the Western Army. Kutuzov, who was already weary of +Bolkonski's activity which seemed to reproach his own idleness, very +readily let him go and gave him a mission to Barclay de Tolly. + +Before joining the Western Army which was then, in May, encamped +at Drissa, Prince Andrew visited Bald Hills which was directly on +his way, being only two miles off the Smolensk highroad. During the +last three years there had been so many changes in his life, he had +thought, felt, and seen so much (having traveled both in the east +and the west), that on reaching Bald Hills it struck him as strange +and unexpected to find the way of life there unchanged and still the +same in every detail. He entered through the gates with their stone +pillars and drove up the avenue leading to the house as if he were +entering an enchanted, sleeping castle. The same old stateliness, +the same cleanliness, the same stillness reigned there, and inside +there was the same furniture, the same walls, sounds, and smell, and +the same timid faces, only somewhat older. Princess Mary was still the +same timid, plain maiden getting on in years, uselessly and +joylessly passing the best years of her life in fear and constant +suffering. Mademoiselle Bourienne was the same coquettish, +self-satisfied girl, enjoying every moment of her existence and full +of joyous hopes for the future. She had merely become more +self-confident, Prince Andrew thought. Dessalles, the tutor he had +brought from Switzerland, was wearing a coat of Russian cut and +talking broken Russian to the servants, but was still the same +narrowly intelligent, conscientious, and pedantic preceptor. The old +prince had changed in appearance only by the loss of a tooth, which +left a noticeable gap on one side of his mouth; in character he was +the same as ever, only showing still more irritability and +skepticism as to what was happening in the world. Little Nicholas +alone had changed. He had grown, become rosier, had curly dark hair, +and, when merry and laughing, quite unconsciously lifted the upper lip +of his pretty little mouth just as the little princess used to do. +He alone did not obey the law of immutability in the enchanted, +sleeping castle. But though externally all remained as of old, the +inner relations of all these people had changed since Prince Andrew +had seen them last. The household was divided into two alien and +hostile camps, who changed their habits for his sake and only met +because he was there. To the one camp belonged the old prince, +Madmoiselle Bourienne, and the architect; to the other Princess +Mary, Dessalles, little Nicholas, and all the old nurses and maids. + +During his stay at Bald Hills all the family dined together, but +they were ill at ease and Prince Andrew felt that he was a visitor for +whose sake an exception was being made and that his presence made them +all feel awkward. Involuntarily feeling this at dinner on the first +day, he was taciturn, and the old prince noticing this also became +morosely dumb and retired to his apartments directly after dinner. +In the evening, when Prince Andrew went to him and, trying to rouse +him, began to tell him of the young Count Kamensky's campaign, the old +prince began unexpectedly to talk about Princess Mary, blaming her for +her superstitions and her dislike of Mademoiselle Bourienne, who, he +said, was the only person really attached to him. + +The old prince said that if he was ill it was only because of +Princess Mary: that she purposely worried and irritated him, and +that by indulgence and silly talk she was spoiling little Prince +Nicholas. The old prince knew very well that he tormented his daughter +and that her life was very hard, but he also knew that he could not +help tormenting her and that she deserved it. "Why does Prince Andrew, +who sees this, say nothing to me about his sister? Does he think me +a scoundrel, or an old fool who, without any reason, keeps his own +daughter at a distance and attaches this Frenchwoman to himself? He +doesn't understand, so I must explain it, and he must hear me out," +thought the old prince. And he began explaining why he could not put +up with his daughter's unreasonable character. + +"If you ask me," said Prince Andrew, without looking up (he was +censuring his father for the first time in his life), "I did not +wish to speak about it, but as you ask me I will give you my frank +opinion. If there is any misunderstanding and discord between you +and Mary, I can't blame her for it at all. I know how she loves and +respects you. Since you ask me," continued Prince Andrew, becoming +irritable--as he was always liable to do of late--"I can only say that +if there are any misunderstandings they are caused by that worthless +woman, who is not fit to be my sister's companion." + +The old man at first stared fixedly at his son, and an unnatural +smile disclosed the fresh gap between his teeth to which Prince Andrew +could not get accustomed. + +"What companion, my dear boy? Eh? You've already been talking it +over! Eh?" + +"Father, I did not want to judge," said Prince Andrew, in a hard and +bitter tone, "but you challenged me, and I have said, and always shall +say, that Mary is not to blame, but those to blame--the one to +blame--is that Frenchwoman." + +"Ah, he has passed judgment... passed judgement!" said the old man +in a low voice and, as it seemed to Prince Andrew, with some +embarrassment, but then he suddenly jumped up and cried: "Be off, be +off! Let not a trace of you remain here!..." + + +Prince Andrew wished to leave at once, but Princess Mary persuaded +him to stay another day. That day he did not see his father, who did +not leave his room and admitted no one but Mademoiselle Bourienne +and Tikhon, but asked several times whether his son had gone. Next +day, before leaving, Prince Andrew went to his son's rooms. The boy, +curly-headed like his mother and glowing with health, sat on his knee, +and Prince Andrew began telling him the story of Bluebeard, but fell +into a reverie without finishing the story. He thought not of this +pretty child, his son whom he held on his knee, but of himself. He +sought in himself either remorse for having angered his father or +regret at leaving home for the first time in his life on bad terms +with him, and was horrified to find neither. What meant still more +to him was that he sought and did not find in himself the former +tenderness for his son which he had hoped to reawaken by caressing the +boy and taking him on his knee. + +"Well, go on!" said his son. + +Prince Andrew, without replying, put him down from his knee and went +out of the room. + +As soon as Prince Andrew had given up his daily occupations, and +especially on returning to the old conditions of life amid which he +had been happy, weariness of life overcame him with its former +intensity, and he hastened to escape from these memories and to find +some work as soon as possible. + +"So you've decided to go, Andrew?" asked his sister. + +"Thank God that I can," replied Prince Andrew. "I am very sorry +you can't." + +"Why do you say that?" replied Princess Mary. "Why do you say +that, when you are going to this terrible war, and he is so old? +Mademoiselle Bourienne says he has been asking about you...." + +As soon as she began to speak of that, her lips trembled and her +tears began to fall. Prince Andrew turned away and began pacing the +room. + +"Ah, my God! my God! When one thinks who and what--what trash--can +cause people misery!" he said with a malignity that alarmed Princess +Mary. + +She understood that when speaking of "trash" he referred not only to +Mademoiselle Bourienne, the cause of her misery, but also to the man +who had ruined his own happiness. + +"Andrew! One thing I beg, I entreat of you!" she said, touching +his elbow and looking at him with eyes that shone through her tears. +"I understand you" (she looked down). "Don't imagine that sorrow is +the work of men. Men are His tools." She looked a little above +Prince Andrew's head with the confident, accustomed look with which +one looks at the place where a familiar portrait hangs. "Sorrow is +sent by Him, not by men. Men are His instruments, they are not to +blame. If you think someone has wronged you, forget it and forgive! We +have no right to punish. And then you will know the happiness of +forgiving." + +"If I were a woman I would do so, Mary. That is a woman's virtue. +But a man should not and cannot forgive and forget," he replied, and +though till that moment he had not been thinking of Kuragin, all his +unexpended anger suddenly swelled up in his heart. + +"If Mary is already persuading me forgive, it means that I ought +long ago to have punished him," he thought. And giving her no +further reply, he began thinking of the glad vindictive moment when he +would meet Kuragin who he knew was now in the army. + +Princess Mary begged him to stay one day more, saying that she +knew how unhappy her father would be if Andrew left without being +reconciled to him, but Prince Andrew replied that he would probably +soon be back again from the army and would certainly write to his +father, but that the longer he stayed now the more embittered their +differences would become. + +"Good-by, Andrew! Remember that misfortunes come from God, and men +are never to blame," were the last words he heard from his sister when +he took leave of her. + +"Then it must be so!" thought Prince Andrew as he drove out of the +avenue from the house at Bald Hills. "She, poor innocent creature, +is left to be victimized by an old man who has outlived his wits. +The old man feels he is guilty, but cannot change himself. My boy is +growing up and rejoices in life, in which like everybody else he +will deceive or be deceived. And I am off to the army. Why? I myself +don't know. I want to meet that man whom I despise, so as to give +him a chance to kill and laugh at me!" + +These conditions of life had been the same before, but then they +were all connected, while now they had all tumbled to pieces. Only +senseless things, lacking coherence, presented themselves one after +another to Prince Andrew's mind. + + + + + +CHAPTER IX + + +Prince Andrew reached the general headquarters of the army at the +end of June. The first army, with which was the Emperor, occupied +the fortified camp at Drissa; the second army was retreating, trying +to effect a junction with the first one from which it was said to be +cut off by large French forces. Everyone was dissatisfied with the +general course of affairs in the Russian army, but no one +anticipated any danger of invasion of the Russian provinces, and no +one thought the war would extend farther than the western, the Polish, +provinces. + +Prince Andrew found Barclay de Tolly, to whom he had been +assigned, on the bank of the Drissa. As there was not a single town or +large village in the vicinity of the camp, the immense number of +generals and courtiers accompanying the army were living in the best +houses of the villages on both sides of the river, over a radius of +six miles. Barclay de Tolly was quartered nearly three miles from +the Emperor. He received Bolkonski stiffly and coldly and told him +in his foreign accent that he would mention him to the Emperor for a +decision as to his employment, but asked him meanwhile to remain on +his staff. Anatole Kuragin, whom Prince Andrew had hoped to find +with the army, was not there. He had gone to Petersburg, but Prince +Andrew was glad to hear this. His mind was occupied by the interests +of the center that was conducting a gigantic war, and he was glad to +be free for a while from the distraction caused by the thought of +Kuragin. During the first four days, while no duties were required +of him, Prince Andrew rode round the whole fortified camp and, by +the aid of his own knowledge and by talks with experts, tried to +form a definite opinion about it. But the question whether the camp +was advantageous or disadvantageous remained for him undecided. +Already from his military experience and what he had seen in the +Austrian campaign, he had come to the conclusion that in war the +most deeply considered plans have no significance and that all depends +on the way unexpected movements of the enemy--that cannot be foreseen- +are met, and on how and by whom the whole matter is handled. To +clear up this last point for himself, Prince Andrew, utilizing his +position and acquaintances, tried to fathom the character of the +control of the army and of the men and parties engaged in it, and he +deduced for himself the following of the state of affairs. + +While the Emperor had still been at Vilna, the forces had been +divided into three armies. First, the army under Barclay de Tolly, +secondly, the army under Bagration, and thirdly, the one commanded +by Tormasov. The Emperor was with the first army, but not as commander +in chief. In the orders issued it was stated, not that the Emperor +would take command, but only that he would be with the army. The +Emperor, moreover, had with him not a commander in chief's staff but +the imperial headquarters staff. In attendance on him was the head +of the imperial staff, Quartermaster General Prince Volkonski, as well +as generals, imperial aides-de-camp, diplomatic officials, and a large +number of foreigners, but not the army staff. Besides these, there +were in attendance on the Emperor without any definite appointments: +Arakcheev, the ex-Minister of War; Count Bennigsen, the senior general +in rank; the Grand Duke Tsarevich Constantine Pavlovich; Count +Rumyantsev, the Chancellor; Stein, a former Prussian minister; +Armfeldt, a Swedish general; Pfuel, the chief author of the plan of +campaign; Paulucci, an adjutant general and Sardinian emigre; +Wolzogen--and many others. Though these men had no military +appointment in the army, their position gave them influence, and often +a corps commander, or even the commander in chief, did not know in +what capacity he was questioned by Bennigsen, the Grand Duke, +Arakcheev, or Prince Volkonski, or was given this or that advice and +did not know whether a certain order received in the form of advice +emanated from the man who gave it or from the Emperor and whether it +had to be executed or not. But this was only the external condition; +the essential significance of the presence of the Emperor and of all +these people, from a courtier's point of view (and in an Emperor's +vicinity all became courtiers), was clear to everyone. It was this: +the Emperor did not assume the title of commander in chief, but +disposed of all the armies; the men around him were his assistants. +Arakcheev was a faithful custodian to enforce order and acted as the +sovereign's bodyguard. Bennigsen was a landlord in the Vilna +province who appeared to be doing the honors of the district, but +was in reality a good general, useful as an adviser and ready at +hand to replace Barclay. The Grand Duke was there because it suited +him to be. The ex-Minister Stein was there because his advice was +useful and the Emperor Alexander held him in high esteem personally. +Armfeldt virulently hated Napoleon and was a general full of +self-confidence, a quality that always influenced Alexander. +Paulucci was there because he was bold and decided in speech. The +adjutants general were there because they always accompanied the +Emperor, and lastly and chiefly Pfuel was there because he had drawn +up the plan of campaign against Napoleon and, having induced Alexander +to believe in the efficacy of that plan, was directing the whole +business of the war. With Pfuel was Wolzogen, who expressed Pfuel's +thoughts in a more comprehensible way than Pfuel himself (who was a +harsh, bookish theorist, self-confident to the point of despising +everyone else) was able to do. + +Besides these Russians and foreigners who propounded new and +unexpected ideas every day--especially the foreigners, who did so with +a boldness characteristic of people employed in a country not their +own--there were many secondary personages accompanying the army +because their principals were there. + +Among the opinions and voices in this immense, restless, +brilliant, and proud sphere, Prince Andrew noticed the following +sharply defined subdivisions of and parties: + +The first party consisted of Pfuel and his adherents--military +theorists who believed in a science of war with immutable laws--laws +of oblique movements, outflankings, and so forth. Pfuel and his +adherents demanded a retirement into the depths of the country in +accordance with precise laws defined by a pseudo-theory of war, and +they saw only barbarism, ignorance, or evil intention in every +deviation from that theory. To this party belonged the foreign nobles, +Wolzogen, Wintzingerode, and others, chiefly Germans. + +The second party was directly opposed to the first; one extreme, +as always happens, was met by representatives of the other. The +members of this party were those who had demanded an advance from +Vilna into Poland and freedom from all prearranged plans. Besides +being advocates of bold action, this section also represented +nationalism, which made them still more one-sided in the dispute. They +were Russians: Bagration, Ermolov (who was beginning to come to the +front), and others. At that time a famous joke of Ermolov's was +being circulated, that as a great favor he had petitioned the +Emperor to make him a German. The men of that party, remembering +Suvorov, said that what one had to do was not to reason, or stick pins +into maps, but to fight, beat the enemy, keep him out of Russia, and +not let the army get discouraged. + +To the third party--in which the Emperor had most confidence- +belonged the courtiers who tried to arrange compromises between the +other two. The members of this party, chiefly civilians and to whom +Arakcheev belonged, thought and said what men who have no +convictions but wish to seem to have some generally say. They said +that undoubtedly war, particularly against such a genius as +Bonaparte (they called him Bonaparte now), needs most deeply devised +plans and profound scientific knowledge and in that respect Pfuel +was a genius, but at the same time it had to be acknowledged that +the theorists are often one sided, and therefore one should not +trust them absolutely, but should also listen to what Pfuel's +opponents and practical men of experience in warfare had to say, and +then choose a middle course. They insisted on the retention of the +camp at Drissa, according to Pfuel's plan, but on changing the +movements of the other armies. Though, by this course, neither one aim +nor the other could be attained, yet it seemed best to the adherents +of this third party. + +Of a fourth opinion the most conspicuous representative was the +Tsarevich, who could not forget his disillusionment at Austerlitz, +where he had ridden out at the head of the Guards, in his casque and +cavalry uniform as to a review, expecting to crush the French +gallantly; but unexpectedly finding himself in the front line had +narrowly escaped amid the general confusion. The men of this party had +both the quality and the defect of frankness in their opinions. They +feared Napoleon, recognized his strength and their own weakness, and +frankly said so. They said: "Nothing but sorrow, shame, and ruin +will come of all this! We have abandoned Vilna and Vitebsk and shall +abandon Drissa. The only reasonable thing left to do is to conclude +peace as soon as possible, before we are turned out of Petersburg." + +This view was very general in the upper army circles and found +support also in Petersburg and from the chancellor, Rumyantsev, who, +for other reasons of state, was in favor of peace. + +The fifth party consisted of those who were adherents of Barclay +de Tolly, not so much as a man but as minister of war and commander in +chief. "Be he what he may" (they always began like that), "he is an +honest, practical man and we have nobody better. Give him real +power, for war cannot be conducted successfully without unity of +command, and he will show what he can do, as he did in Finland. If our +army is well organized and strong and has withdrawn to Drissa +without suffering any defeats, we owe this entirely to Barclay. If +Barclay is now to be superseded by Bennigsen all will be lost, for +Bennigsen showed his incapacity already in 1807." + +The sixth party, the Bennigsenites, said, on the contrary, that at +any rate there was no one more active and experienced than +Bennigsen: "and twist about as you may, you will have to come to +Bennigsen eventually. Let the others make mistakes now!" said they, +arguing that our retirement to Drissa was a most shameful reverse +and an unbroken series of blunders. "The more mistakes that are made +the better. It will at any rate be understood all the sooner that +things cannot go on like this. What is wanted is not some Barclay or +other, but a man like Bennigsen, who made his mark in 1807, and to +whom Napoleon himself did justice--a man whose authority would be +willingly recognized, and Bennigsen is the only such man." + +The seventh party consisted of the sort of people who are always +to be found, especially around young sovereigns, and of whom there +were particularly many round Alexander--generals and imperial +aides-de-camp passionately devoted to the Emperor, not merely as a +monarch but as a man, adoring him sincerely and disinterestedly, as +Rostov had done in 1805, and who saw in him not only all the virtues +but all human capabilities as well. These men, though enchanted with +the sovereign for refusing the command of the army, yet blamed him for +such excessive modesty, and only desired and insisted that their +adored sovereign should abandon his diffidence and openly announce +that he would place himself at the head of the army, gather round +him a commander in chief's staff, and, consulting experienced +theoreticians and practical men where necessary, would himself lead +the troops, whose spirits would thereby be raised to the highest +pitch. + +The eighth and largest group, which in its enormous numbers was to +the others as ninety-nine to one, consisted of men who desired neither +peace nor war, neither an advance nor a defensive camp at the Drissa +or anywhere else, neither Barclay nor the Emperor, neither Pfuel nor +Bennigsen, but only the one most essential thing--as much advantage +and pleasure for themselves as possible. In the troubled waters of +conflicting and intersecting intrigues that eddied about the Emperor's +headquarters, it was possible to succeed in many ways unthinkable at +other times. A man who simply wished to retain his lucrative post +would today agree with Pfuel, tomorrow with his opponent, and the +day after, merely to avoid responsibility or to please the Emperor, +would declare that he had no opinion at all on the matter. Another who +wished to gain some advantage would attract the Emperor's attention by +loudly advocating the very thing the Emperor had hinted at the day +before, and would dispute and shout at the council, beating his breast +and challenging those who did not agree with him to duels, thereby +proving that he was prepared to sacrifice himself for the common good. +A third, in the absence of opponents, between two councils would +simply solicit a special gratuity for his faithful services, well +knowing that at that moment people would be too busy to refuse him. +A fourth while seemingly overwhelmed with work would often come +accidentally under the Emperor's eye. A fifth, to achieve his +long-cherished aim of dining with the Emperor, would stubbornly insist +on the correctness or falsity of some newly emerging opinion and for +this object would produce arguments more or less forcible and correct. + +All the men of this party were fishing for rubles, decorations, +and promotions, and in this pursuit watched only the weathercock of +imperial favor, and directly they noticed it turning in any direction, +this whole drone population of the army began blowing hard that way, +so that it was all the harder for the Emperor to turn it elsewhere. +Amid the uncertainties of the position, with the menace of serious +danger giving a peculiarly threatening character to everything, amid +this vortex of intrigue, egotism, conflict of views and feelings, +and the diversity of race among these people--this eighth and +largest party of those preoccupied with personal interests imparted +great confusion and obscurity to the common task. Whatever question +arose, a swarm of these drones, without having finished their +buzzing on a previous theme, flew over to the new one and by their hum +drowned and obscured the voices of those who were disputing honestly. + +From among all these parties, just at the time Prince Andrew reached +the army, another, a ninth party, was being formed and was beginning +to raise its voice. This was the party of the elders, reasonable men +experienced and capable in state affairs, who, without sharing any +of those conflicting opinions, were able to take a detached view of +what was going on at the staff at headquarters and to consider means +of escape from this muddle, indecision, intricacy, and weakness. + +The men of this party said and thought that what was wrong +resulted chiefly from the Emperor's presence in the army with his +military court and from the consequent presence there of an +indefinite, conditional, and unsteady fluctuation of relations, +which is in place at court but harmful in an army; that a sovereign +should reign but not command the army, and that the only way out of +the position would be for the Emperor and his court to leave the army; +that the mere presence of the Emperor paralyzed the action of fifty +thousand men required to secure his personal safety, and that the +worst commander in chief if independent would be better than the +very best one trammeled by the presence and authority of the monarch. + +Just at the time Prince Andrew was living unoccupied at Drissa, +Shishkov, the Secretary of State and one of the chief +representatives of this party, wrote a letter to the Emperor which +Arakcheev and Balashev agreed to sign. In this letter, availing +himself of permission given him by the Emperor to discuss the +general course of affairs, he respectfully suggested--on the plea that +it was necessary for the sovereign to arouse a warlike spirit in the +people of the capital--that the Emperor should leave the army. + +That arousing of the people by their sovereign and his call to +them to defend their country--the very incitement which was the +chief cause of Russia's triumph in so far as it was produced by the +Tsar's personal presence in Moscow--was suggested to the Emperor, +and accepted by him, as a pretext for quitting the army. + + + + + +CHAPTER X + + +This letter had not yet been presented to the Emperor when +Barclay, one day at dinner, informed Bolkonski that the sovereign +wished to see him personally, to question him about Turkey, and that +Prince Andrew was to present himself at Bennigsen's quarters at six +that evening. + +News was received at the Emperor's quarters that very day of a fresh +movement by Napoleon which might endanger the army--news +subsequently found to be false. And that morning Colonel Michaud had +ridden round the Drissa fortifications with the Emperor and had +pointed out to him that this fortified camp constructed by Pfuel, +and till then considered a chef-d'oeuvre of tactical science which +would ensure Napoleon's destruction, was an absurdity, threatening the +destruction of the Russian army. + +Prince Andrew arrived at Bennigsen's quarters--a country gentleman's +house of moderate size, situated on the very banks of the river. +Neither Bennigsen nor the Emperor was there, but Chernyshev, the +Emperor's aide-de-camp, received Bolkonski and informed him that the +Emperor, accompanied by General Bennigsen and Marquis Paulucci, had +gone a second time that day to inspect the fortifications of the +Drissa camp, of the suitability of which serious doubts were beginning +to be felt. + +Chernyshev was sitting at a window in the first room with a French +novel in his hand. This room had probably been a music room; there was +still an organ in it on which some rugs were piled, and in one +corner stood the folding bedstead of Bennigsen's adjutant. This +adjutant was also there and sat dozing on the rolled-up bedding, +evidently exhausted by work or by feasting. Two doors led from the +room, one straight on into what had been the drawing room, and +another, on the right, to the study. Through the first door came the +sound of voices conversing in German and occasionally in French. In +that drawing room were gathered, by the Emperor's wish, not a military +council (the Emperor preferred indefiniteness), but certain persons +whose opinions he wished to know in view of the impending +difficulties. It was not a council of war, but, as it were, a +council to elucidate certain questions for the Emperor personally. +To this semicouncil had been invited the Swedish General Armfeldt, +Adjutant General Wolzogen, Wintzingerode (whom Napoleon had referred +to as a renegade French subject), Michaud, Toll, Count Stein who was +not a military man at all, and Pfuel himself, who, as Prince Andrew +had heard, was the mainspring of the whole affair. Prince Andrew had +an opportunity of getting a good look at him, for Pfuel arrived soon +after himself and, in passing through to the drawing room, stopped a +minute to speak to Chernyshev. + +At first sight, Pfuel, in his ill-made uniform of a Russian general, +which fitted him badly like a fancy costume, seemed familiar to Prince +Andrew, though he saw him now for the first time. There was about +him something of Weyrother, Mack, and Schmidt, and many other German +theorist-generals whom Prince Andrew had seen in 1805, but he was more +typical than any of them. Prince Andrew had never yet seen a German +theorist in whom all the characteristics of those others were united +to such an extent. + +Pfuel was short and very thin but broad-boned, of coarse, robust +build, broad in the hips, and with prominent shoulder blades. His face +was much wrinkled and his eyes deep set. His hair had evidently been +hastily brushed smooth in front of the temples, but stuck up behind in +quaint little tufts. He entered the room, looking restlessly and +angrily around, as if afraid of everything in that large apartment. +Awkwardly holding up his sword, he addressed Chernyshev and asked in +German where the Emperor was. One could see that he wished to pass +through the rooms as quickly as possible, finish with the bows and +greetings, and sit down to business in front of a map, where he +would feel at home. He nodded hurriedly in reply to Chernyshev, and +smiled ironically on hearing that the sovereign was inspecting the +fortifications that he, Pfuel, had planned in accord with his +theory. He muttered something to himself abruptly and in a bass voice, +as self-assured Germans do--it might have been "stupid fellow"... or +"the whole affair will be ruined," or "something absurd will come of +it."... Prince Andrew did not catch what he said and would have passed +on, but Chernyshev introduced him to Pfuel, remarking that Prince +Andrew was just back from Turkey where the war had terminated so +fortunately. Pfuel barely glanced--not so much at Prince Andrew as +past him--and said, with a laugh: "That must have been a fine tactical +war"; and, laughing contemptuously, went on into the room from which +the sound of voices was heard. + +Pfuel, always inclined to be irritably sarcastic, was particularly +disturbed that day, evidently by the fact that they had dared to +inspect and criticize his camp in his absence. From this short +interview with Pfuel, Prince Andrew, thanks to his Austerlitz +experiences, was able to form a clear conception of the man. Pfuel was +one of those hopelessly and immutably self-confident men, +self-confident to the point of martyrdom as only Germans are, +because only Germans are self-confident on the basis of an abstract +notion--science, that is, the supposed knowledge of absolute truth. +A Frenchman is self-assured because he regards himself personally, +both in mind and body, as irresistibly attractive to men and women. An +Englishman is self-assured, as being a citizen of the best-organized +state in the world, and therefore as an Englishman always knows what +he should do and knows that all he does as an Englishman is +undoubtedly correct. An Italian is self-assured because he is +excitable and easily forgets himself and other people. A Russian is +self-assured just because he knows nothing does not want to know +anything, since he does not believe that anything can be known. The +German's self-assurance is worst of all, stronger and more repulsive +than any other, because he imagines that he knows the truth- +science--which he himself has invented but which is for him the +absolute truth. + +Pfuel was evidently of that sort. He had a science--the theory of +oblique movements deduced by him from the history of Frederick the +Great's wars, and all he came across in the history of more recent +warfare seemed to him absurd and barbarous--monstrous collisions in +which so many blunders were committed by both sides that these wars +could not be called wars, they did not accord with the theory, and +therefore could not serve as material for science. + +In 1806 Pfuel had been one of those responsible, for the plan of +campaign that ended in Jena and Auerstadt, but he did not see the +least proof of the fallibility of his theory in the disasters of +that war. On the contrary, the deviations made from his theory were, +in his opinion, the sole cause of the whole disaster, and with +characteristically gleeful sarcasm he would remark, "There, I said the +whole affair would go to the devil!" Pfuel was one of those +theoreticians who so love their theory that they lose sight of the +theory's object--its practical application. His love of theory made +him hate everything practical, and he would not listen to it. He was +even pleased by failures, for failures resulting from deviations in +practice from the theory only proved to him the accuracy of his +theory. + +He said a few words to Prince Andrew and Chernyshev about the +present war, with the air of a man who knows beforehand that all +will go wrong, and who is not displeased that it should be so. The +unbrushed tufts of hair sticking up behind and the hastily brushed +hair on his temples expressed this most eloquently. + +He passed into the next room, and the deep, querulous sounds of +his voice were at once heard from there. + + + + + +CHAPTER XI + + +Prince Andrew's eyes were still following Pfuel out of the room when +Count Bennigsen entered hurriedly, and nodding to Bolkonski, but not +pausing, went into the study, giving instructions to his adjutant as +he went. The Emperor was following him, and Bennigsen had hastened +on to make some preparations and to be ready to receive the sovereign. +Chernyshev and Prince Andrew went out into the porch, where the +Emperor, who looked fatigued, was dismounting. Marquis Paulucci was +talking to him with particular warmth and the Emperor, with his head +bent to the left, was listening with a dissatisfied air. The Emperor +moved forward evidently wishing to end the conversation, but the +flushed and excited Italian, oblivious of decorum, followed him and +continued to speak. + +"And as for the man who advised forming this camp--the Drissa camp," +said Paulucci, as the Emperor mounted the steps and noticing Prince +Andrew scanned his unfamiliar face, "as to that person, sire..." +continued Paulucci, desperately, apparently unable to restrain +himself, "the man who advised the Drissa camp--I see no alternative +but the lunatic asylum or the gallows!" + +Without heeding the end of the Italian's remarks, and as though +not hearing them, the Emperor, recognizing Bolkonski, addressed him +graciously. + +"I am very glad to see you! Go in there where they are meeting, +and wait for me." + +The Emperor went into the study. He was followed by Prince Peter +Mikhaylovich Volkonski and Baron Stein, and the door closed behind +them. Prince Andrew, taking advantage of the Emperor's permission, +accompanied Paulucci, whom he had known in Turkey, into the drawing +room where the council was assembled. + +Prince Peter Mikhaylovich Volkonski occupied the position, as it +were, of chief of the Emperor's staff. He came out of the study into +the drawing room with some maps which he spread on a table, and put +questions on which he wished to hear the opinion of the gentlemen +present. What had happened was that news (which afterwards proved to +be false) had been received during the night of a movement by the +French to outflank the Drissa camp. + +The first to speak was General Armfeldt who, to meet the +difficulty that presented itself, unexpectedly proposed a perfectly +new position away from the Petersburg and Moscow roads. The reason for +this was inexplicable (unless he wished to show that he, too, could +have an opinion), but he urged that at this point the army should +unite and there await the enemy. It was plain that Armfeldt had +thought out that plan long ago and now expounded it not so much to +answer the questions put--which, in fact, his plan did not answer- +as to avail himself of the opportunity to air it. It was one of the +millions of proposals, one as good as another, that could be made as +long as it was quite unknown what character the war would take. Some +disputed his arguments, others defended them. Young Count Toll +objected to the Swedish general's views more warmly than anyone +else, and in the course of the dispute drew from his side pocket a +well-filled notebook, which he asked permission to read to them. In +these voluminous notes Toll suggested another scheme, totally +different from Armfeldt's or Pfuel's plan of campaign. In answer to +Toll, Paulucci suggested an advance and an attack, which, he urged, +could alone extricate us from the present uncertainty and from the +trap (as he called the Drissa camp) in which we were situated. + +During all these discussions Pfuel and his interpreter, Wolzogen +(his "bridge" in court relations), were silent. Pfuel only snorted +contemptuously and turned away, to show that he would never demean +himself by replying to such nonsense as he was now hearing. So when +Prince Volkonski, who was in the chair, called on him to give his +opinion, he merely said: + +"Why ask me? General Armfeldt has proposed a splendid position +with an exposed rear, or why not this Italian gentleman's attack--very +fine, or a retreat, also good! Why ask me?" said he. "Why, you +yourselves know everything better than I do." + +But when Volkonski said, with a frown, that it was in the +Emperor's name that he asked his opinion, Pfuel rose and, suddenly +growing animated, began to speak: + +"Everything has been spoiled, everything muddled, everybody +thought they knew better than I did, and now you come to me! How +mend matters? There is nothing to mend! The principles laid down by me +must be strictly adhered to," said he, drumming on the table with +his bony fingers. "What is the difficulty? Nonsense, childishness!" + +He went up to the map and speaking rapidly began proving that no +eventuality could alter the efficiency of the Drissa camp, that +everything had been foreseen, and that if the enemy were really +going to outflank it, the enemy would inevitably be destroyed. + +Paulucci, who did not know German, began questioning him in +French. Wolzogen came to the assistance of his chief, who spoke French +badly, and began translating for him, hardly able to keep pace with +Pfuel, who was rapidly demonstrating that not only all that had +happened, but all that could happen, had been foreseen in his +scheme, and that if there were now any difficulties the whole fault +lay in the fact that his plan had not been precisely executed. He kept +laughing sarcastically, he demonstrated, and at last contemptuously +ceased to demonstrate, like a mathematician who ceases to prove in +various ways the accuracy of a problem that has already been proved. +Wolzogen took his place and continued to explain his views in +French, every now and then turning to Pfuel and saying, "Is it not so, +your excellency?" But Pfuel, like a man heated in a fight who + +strikes those on his own side, shouted angrily at his own supporter, +Wolzogen: + +"Well, of course, what more is there to explain?" + +Paulucci and Michaud both attacked Wolzogen simultaneously in +French. Armfeldt addressed Pfuel in German. Toll explained to +Volkonski in Russian. Prince Andrew listened and observed in silence. + +Of all these men Prince Andrew sympathized most with Pfuel, angry, +determined, and absurdly self-confident as he was. Of all those +present, evidently he alone was not seeking anything for himself, +nursed no hatred against anyone, and only desired that the plan, +formed on a theory arrived at by years of toil, should be carried out. +He was ridiculous, and unpleasantly sarcastic, but yet he inspired +involuntary respect by his boundless devotion to an idea. Besides +this, the remarks of all except Pfuel had one common trait that had +not been noticeable at the council of war in 1805: there was now a +panic fear of Napoleon's genius, which, though concealed, was +noticeable in every rejoinder. Everything was assumed to be possible +for Napoleon, they expected him from every side, and invoked his +terrible name to shatter each other's proposals. Pfuel alone seemed to +consider Napoleon a barbarian like everyone else who opposed his +theory. But besides this feeling of respect, Pfuel evoked pity in +Prince Andrew. From the tone in which the courtiers addressed him +and the way Paulucci had allowed himself to speak of him to the +Emperor, but above all from a certain desperation in Pfuel's own +expressions, it was clear that the others knew, and Pfuel himself +felt, that his fall was at hand. And despite his self-confidence and +grumpy German sarcasm he was pitiable, with his hair smoothly +brushed on the temples and sticking up in tufts behind. Though he +concealed the fact under a show of irritation and contempt, he was +evidently in despair that the sole remaining chance of verifying his +theory by a huge experiment and proving its soundness to the whole +world was slipping away from him. + +The discussions continued a long time, and the longer they lasted +the more heated became the disputes, culminating in shouts and +personalities, and the less was it possible to arrive at any general +conclusion from all that had been said. Prince Andrew, listening to +this polyglot talk and to these surmises, plans, refutations, and +shouts, felt nothing but amazement at what they were saying. A thought +that had long since and often occurred to him during his military +activities--the idea that there is not and cannot be any science of +war, and that therefore there can be no such thing as a military +genius--now appeared to him an obvious truth. "What theory and science +is possible about a matter the conditions and circumstances of which +are unknown and cannot be defined, especially when the strength of the +acting forces cannot be ascertained? No one was or is able to +foresee in what condition our or the enemy's armies will be in a day's +time, and no one can gauge the force of this or that detachment. +Sometimes--when there is not a coward at the front to shout, 'We are +cut off!' and start running, but a brave and jolly lad who shouts, +'Hurrah!'--a detachment of five thousand is worth thirty thousand, +as at Schon Grabern, while at times fifty thousand run from eight +thousand, as at Austerlitz. What science can there be in a matter in +which, as in all practical matters, nothing can be defined and +everything depends on innumerable conditions, the significance of +which is determined at a particular moment which arrives no one +knows when? Armfeldt says our army is cut in half, and Paulucci says +we have got the French army between two fires; Michaud says that the +worthlessness of the Drissa camp lies in having the river behind it, +and Pfuel says that is what constitutes its strength; Toll proposes +one plan, Armfeldt another, and they are all good and all bad, and the +advantages of any suggestions can be seen only at the moment of trial. +And why do they all speak of a 'military genius'? Is a man a genius +who can order bread to be brought up at the right time and say who +is to go to the right and who to the left? It is only because military +men are invested with pomp and power and crowds of sychophants flatter +power, attributing to it qualities of genius it does not possess. +The best generals I have known were, on the contrary, stupid or +absent-minded men. Bagration was the best, Napoleon himself admitted +that. And of Bonaparte himself! I remember his limited, self-satisfied +face on the field of Austerlitz. Not only does a good army commander +not need any special qualities, on the contrary he needs the absence +of the highest and best human attributes--love, poetry, tenderness, +and philosophic inquiring doubt. He should be limited, firmly +convinced that what he is doing is very important (otherwise he will +not have sufficient patience), and only then will he be a brave +leader. God forbid that he should be humane, should love, or pity, +or think of what is just and unjust. It is understandable that a +theory of their 'genius' was invented for them long ago because they +have power! The success of a military action depends not on them, +but on the man in the ranks who shouts, 'We are lost!' or who +shouts, 'Hurrah!' And only in the ranks can one serve with assurance +of being useful." + +So thought Prince Andrew as he listened to the talking, and he +roused himself only when Paulucci called him and everyone was leaving. + +At the review next day the Emperor asked Prince Andrew where he +would like to serve, and Prince Andrew lost his standing in court +circles forever by not asking to remain attached to the sovereign's +person, but for permission to serve in the army. + + + + + +CHAPTER XII + + +Before the beginning of the campaign, Rostov had received a letter +from his parents in which they told him briefly of Natasha's illness +and the breaking off of her engagement to Prince Andrew (which they +explained by Natasha's having rejected him) and again asked Nicholas +to retire from the army and return home. On receiving this letter, +Nicholas did not even make any attempt to get leave of absence or to +retire from the army, but wrote to his parents that he was sorry +Natasha was ill and her engagement broken off, and that he would do +all he could to meet their wishes. To Sonya he wrote separately. + +"Adored friend of my soul!" he wrote. "Nothing but honor could +keep me from returning to the country. But now, at the commencement of +the campaign, I should feel dishonored, not only in my comrades' +eyes but in my own, if I preferred my own happiness to my love and +duty to the Fatherland. But this shall be our last separation. Believe +me, directly the war is over, if I am still alive and still loved by +you, I will throw up everything and fly to you, to press you forever +to my ardent breast." + +It was, in fact, only the commencement of the campaign that +prevented Rostov from returning home as he had promised and marrying +Sonya. The autumn in Otradnoe with the hunting, and the winter with +the Christmas holidays and Sonya's love, had opened out to him a vista +of tranquil rural joys and peace such as he had never known before, +and which now allured him. "A splendid wife, children, a good pack +of hounds, a dozen leashes of smart borzois, agriculture, neighbors, +service by election..." thought he. But now the campaign was +beginning, and he had to remain with his regiment. And since it had to +be so, Nicholas Rostov, as was natural to him, felt contented with the +life he led in the regiment and was able to find pleasure in that +life. + +On his return from his furlough Nicholas, having been joyfully +welcomed by his comrades, was sent to obtain remounts and brought back +from the Ukraine excellent horses which pleased him and earned him +commendation from his commanders. During his absence he had been +promoted captain, and when the regiment was put on war footing with an +increase in numbers, he was again allotted his old squadron. + +The campaign began, the regiment was moved into Poland on double +pay, new officers arrived, new men and horses, and above all everybody +was infected with the merrily excited mood that goes with the +commencement of a war, and Rostov, conscious of his advantageous +position in the regiment, devoted himself entirely to the pleasures +and interests of military service, though he knew that sooner or later +he would have to relinquish them. + +The troops retired from Vilna for various complicated reasons of +state, political and strategic. Each step of the retreat was +accompanied by a complicated interplay of interests, arguments, and +passions at headquarters. For the Pavlograd hussars, however, the +whole of this retreat during the finest period of summer and with +sufficient supplies was a very simple and agreeable business. + +It was only at headquarters that there was depression, uneasiness, +and intriguing; in the body of the army they did not ask themselves +where they were going or why. If they regretted having to retreat, +it was only because they had to leave billets they had grown +accustomed to, or some pretty young Polish lady. If the thought that +things looked bad chanced to enter anyone's head, he tried to be as +cheerful as befits a good soldier and not to think of the general +trend of affairs, but only of the task nearest to hand. First they +camped gaily before Vilna, making acquaintance with the Polish +landowners, preparing for reviews and being reviewed by the Emperor +and other high commanders. Then came an order to retreat to Sventsyani +and destroy any provisions they could not carry away with them. +Sventsyani was remembered by the hussars only as the drunken camp, a +name the whole army gave to their encampment there, and because many +complaints were made against the troops, who, taking advantage of +the order to collect provisions, took also horses, carriages, and +carpets from the Polish proprietors. Rostov remembered Sventsyani, +because on the first day of their arrival at that small town he +changed his sergeant major and was unable to manage all the drunken +men of his squadron who, unknown to him, had appropriated five barrels +of old beer. From Sventsyani they retired farther and farther to +Drissa, and thence again beyond Drissa, drawing near to the frontier +of Russia proper. + +On the thirteenth of July the Pavlograds took part in a serious +action for the first time. + +On the twelfth of July, on the eve of that action, there was a heavy +storm of rain and hail. In general, the summer of 1812 was +remarkable for its storms. + +The two Pavlograd squadrons were bivouacking on a field of rye, +which was already in ear but had been completely trodden down by +cattle and horses. The rain was descending in torrents, and Rostov, +with a young officer named Ilyin, his protege, was sitting in a +hastily constructed shelter. An officer of their regiment, with long +mustaches extending onto his cheeks, who after riding to the staff had +been overtaken by the rain, entered Rostov's shelter. + +"I have come from the staff, Count. Have you heard of Raevski's +exploit?" + +And the officer gave them details of the Saltanov battle, which he +had heard at the staff. + +Rostov, smoking his pipe and turning his head about as the water +trickled down his neck, listened inattentively, with an occasional +glance at Ilyin, who was pressing close to him. This officer, a lad of +sixteen who had recently joined the regiment, was now in the same +relation to Nicholas that Nicholas had been to Denisov seven years +before. Ilyin tried to imitate Rostov in everything and adored him +as a girl might have done. + +Zdrzhinski, the officer with the long mustache, spoke +grandiloquently of the Saltanov dam being "a Russian Thermopylae," and +of how a deed worthy of antiquity had been performed by General +Raevski. He recounted how Raevski had led his two sons onto the dam +under terrific fire and had charged with them beside him. Rostov heard +the story and not only said nothing to encourage Zdrzhinski's +enthusiasm but, on the contrary, looked like a man ashamed of what +he was hearing, though with no intention of contradicting it. Since +the campaigns of Austerlitz and of 1807 Rostov knew by experience that +men always lie when describing military exploits, as he himself had +done when recounting them; besides that, he had experience enough to +know that nothing happens in war at all as we can imagine or relate +it. And so he did not like Zdrzhinski's tale, nor did he like +Zdrzhinski himself who, with his mustaches extending over his +cheeks, bent low over the face of his hearer, as was his habit, and +crowded Rostov in the narrow shanty. Rostov looked at him in +silence. "In the first place, there must have been such a confusion +and crowding on the dam that was being attacked that if Raevski did +lead his sons there, it could have had no effect except perhaps on +some dozen men nearest to him," thought he, "the rest could not have +seen how or with whom Raevski came onto the dam. And even those who +did see it would not have been much stimulated by it, for what had +they to do with Raevski's tender paternal feelings when their own +skins were in danger? And besides, the fate of the Fatherland did +not depend on whether they took the Saltanov dam or not, as we are +told was the case at Thermopylae. So why should he have made such a +sacrifice? And why expose his own children in the battle? I would +not have taken my brother Petya there, or even Ilyin, who's a stranger +to me but a nice lad, but would have tried to put them somewhere under +cover," Nicholas continued to think, as he listened to Zdrzhinski. But +he did not express his thoughts, for in such matters, too, he had +gained experience. He knew that this tale redounded to the glory of +our arms and so one had to pretend not to doubt it. And he acted +accordingly. + +"I can't stand this any more," said Ilyin, noticing that Rostov +did not relish Zdrzhinski's conversation. "My stockings and shirt... +and the water is running on my seat! I'll go and look for shelter. The +rain seems less heavy." + +Ilyin went out and Zdrzhinski rode away. + +Five minutes later Ilyin, splashing through the mud, came running +back to the shanty. + +"Hurrah! Rostov, come quick! I've found it! About two hundred +yards away there's a tavern where ours have already gathered. We can +at least get dry there, and Mary Hendrikhovna's there." + +Mary Hendrikhovna was the wife of the regimental doctor, a pretty +young German woman he had married in Poland. The doctor, whether +from lack of means or because he did not like to part from his young +wife in the early days of their marriage, took her about with him +wherever the hussar regiment went and his jealousy had become a +standing joke among the hussar officers. + +Rostov threw his cloak over his shoulders, shouted to Lavrushka to +follow with the things, and--now slipping in the mud, now splashing +right through it--set off with Ilyin in the lessening rain and the +darkness that was occasionally rent by distant lightning. + +"Rostov, where are you?" + +"Here. What lightning!" they called to one another. + + + + + +CHAPTER XIII + + +In the tavern, before which stood the doctor's covered cart, there +were already some five officers. Mary Hendrikhovna, a plump little +blonde German, in a dressing jacket and nightcap, was sitting on a +broad bench in the front corner. Her husband, the doctor, lay asleep +behind her. Rostov and Ilyin, on entering the room, were welcomed with +merry shouts and laughter. + +"Dear me, how jolly we are!" said Rostov laughing. + +"And why do you stand there gaping?" + +"What swells they are! Why, the water streams from them! Don't +make our drawing room so wet." + +"Don't mess Mary Hendrikhovna's dress!" cried other voices. + +Rostov and Ilyin hastened to find a corner where they could change +into dry clothes without offending Mary Hendrikhovna's modesty. They +were going into a tiny recess behind a partition to change, but +found it completely filled by three officers who sat playing cards +by the light of a solitary candle on an empty box, and these +officers would on no account yield their position. Mary Hendrikhovna +obliged them with the loan of a petticoat to be used as a curtain, and +behind that screen Rostov and Ilyin, helped by Lavrushka who had +brought their kits, changed their wet things for dry ones. + +A fire was made up in the dilapidated brick stove. A board was +found, fixed on two saddles and covered with a horsecloth, a small +samovar was produced and a cellaret and half a bottle of rum, and +having asked Mary Hendrikhovna to preside, they all crowded round her. +One offered her a clean handkerchief to wipe her charming hands, +another spread a jacket under her little feet to keep them from the +damp, another hung his coat over the window to keep out the draft, and +yet another waved the flies off her husband's face, lest he should +wake up. + +"Leave him alone," said Mary Hendrikhovna, smiling timidly and +happily. "He is sleeping well as it is, after a sleepless night." + +"Oh, no, Mary Hendrikhovna," replied the officer, "one must look +after the doctor. Perhaps he'll take pity on me someday, when it comes +to cutting off a leg or an arm for me." + +There were only three tumblers, the water was so muddy that one +could not make out whether the tea was strong or weak, and the samovar +held only six tumblers of water, but this made it all the pleasanter +to take turns in order of seniority to receive one's tumbler from Mary +Hendrikhovna's plump little hands with their short and not overclean +nails. All the officers appeared to be, and really were, in love +with her that evening. Even those playing cards behind the partition +soon left their game and came over to the samovar, yielding to the +general mood of courting Mary Hendrikhovna. She, seeing herself +surrounded by such brilliant and polite young men, beamed with +satisfaction, try as she might to hide it, and perturbed as she +evidently was each time her husband moved in his sleep behind her. + +There was only one spoon, sugar was more plentiful than anything +else, but it took too long to dissolve, so it was decided that Mary +Hendrikhovna should stir the sugar for everyone in turn. Rostov +received his tumbler, and adding some rum to it asked Mary +Hendrikhovna to stir it. + +"But you take it without sugar?" she said, smiling all the time, +as if everything she said and everything the others said was very +amusing and had a double meaning. + +"It is not the sugar I want, but only that your little hand should +stir my tea." + +Mary Hendrikhovna assented and began looking for the spoon which +someone meanwhile had pounced on. + +"Use your finger, Mary Hendrikhovna, it will be still nicer," said +Rostov. + +"Too hot!" she replied, blushing with pleasure. + +Ilyin put a few drops of rum into the bucket of water and brought it +to Mary Hendrikhovna, asking her to stir it with her finger. + +"This is my cup," said he. "Only dip your finger in it and I'll +drink it all up." + +When they had emptied the samovar, Rostov took a pack of cards and +proposed that they should play "Kings" with Mary Hendrikhovna. They +drew lots to settle who should make up her set. At Rostov's suggestion +it was agreed that whoever became "King" should have the right to kiss +Mary Hendrikhovna's hand, and that the "Booby" should go to refill and +reheat the samovar for the doctor when the latter awoke. + +"Well, but supposing Mary Hendrikhovna is 'King'?" asked Ilyin. + +"As it is, she is Queen, and her word is law!" + +They had hardly begun to play before the doctor's disheveled head +suddenly appeared from behind Mary Hendrikhovna. He had been awake for +some time, listening to what was being said, and evidently found +nothing entertaining or amusing in what was going on. His face was sad +and depressed. Without greeting the officers, he scratched himself and +asked to be allowed to pass as they were blocking the way. As soon +as he had left the room all the officers burst into loud laughter +and Mary Hendrikhovna blushed till her eyes filled with tears and +thereby became still more attractive to them. Returning from the yard, +the doctor told his wife (who had ceased to smile so happily, and +looked at him in alarm, awaiting her sentence) that the rain had +ceased and they must go to sleep in their covered cart, or +everything in it would be stolen. + +"But I'll send an orderly.... Two of them!" said Rostov. "What an +idea, doctor!" + +"I'll stand guard on it myself!" said Ilyin. + +"No, gentlemen, you have had your sleep, but I have not slept for +two nights," replied the doctor, and he sat down morosely beside his +wife, waiting for the game to end. + +Seeing his gloomy face as he frowned at his wife, the officers +grew still merrier, and some of them could not refrain from +laughter, for which they hurriedly sought plausible pretexts. When +he had gone, taking his wife with him, and had settled down with her +in their covered cart, the officers lay down in the tavern, covering +themselves with their wet cloaks, but they did not sleep for a long +time; now they exchanged remarks, recalling the doctor's uneasiness +and his wife's delight, now they ran out into the porch and reported +what was taking place in the covered trap. Several times Rostov, +covering his head, tried to go to sleep, but some remark would +arouse him and conversation would be resumed, to the accompaniment +of unreasoning, merry, childlike laughter. + + + + + +CHAPTER XIV + + +It was nearly three o'clock but no one was yet asleep, when the +quartermaster appeared with an order to move on to the little town +of Ostrovna. Still laughing and talking, the officers began +hurriedly getting ready and again boiled some muddy water +in the samovar. But Rostov went off to his squadron without waiting +for tea. Day was breaking, the rain had ceased, and the clouds were +dispersing. It felt damp and cold, especially in clothes that were +still moist. As they left the tavern in the twilight of the dawn, +Rostov and Ilyin both glanced under the wet and glistening leather +hood of the doctor's cart, from under the apron of which his feet were +sticking out, and in the middle of which his wife's nightcap was +visible and her sleepy breathing audible. + +"She really is a dear little thing," said Rostov to Ilyin, who was +following him. + +"A charming woman!" said Ilyin, with all the gravity of a boy of +sixteen. + +Half an hour later the squadron was lined up on the road. The +command was heard to "mount" and the soldiers crossed themselves and +mounted. Rostov riding in front gave the order "Forward!" and the +hussars, with clanking sabers and subdued talk, their horses' hoofs +splashing in the mud, defiled in fours and moved along the broad +road planted with birch trees on each side, following the infantry and +a battery that had gone on in front. + +Tattered, blue-purple clouds, reddening in the east, were scudding +before the wind. It was growing lighter and lighter. That curly +grass which always grows by country roadsides became clearly +visible, still wet with the night's rain; the drooping branches of the +birches, also wet, swayed in the wind and flung down bright drops of +water to one side. The soldiers' faces were more and more clearly +visible. Rostov, always closely followed by Ilyin, rode along the side +of the road between two rows of birch trees. + +When campaigning, Rostov allowed himself the indulgence of riding +not a regimental but a Cossack horse. A judge of horses and a +sportsman, he had lately procured himself a large, fine, mettlesome, +Donets horse, dun-colored, with light mane and tail, and when he +rode it no one could outgallop him. To ride this horse was a +pleasure to him, and he thought of the horse, of the morning, of the +doctor's wife, but not once of the impending danger. + +Formerly, when going into action, Rostov had felt afraid; now he had +not the least feeling of fear. He was fearless, not because he had +grown used to being under fire (one cannot grow used to danger), but +because he had learned how to manage his thoughts when in danger. He +had grown accustomed when going into action to think about anything +but what would seem most likely to interest him--the impending danger. +During the first period of his service, hard as he tried and much as +he reproached himself with cowardice, he had not been able to do this, +but with time it had come of itself. Now he rode beside Ilyin under +the birch trees, occasionally plucking leaves from a branch that met +his hand, sometimes touching his horse's side with his foot, or, +without turning round, handing a pipe he had finished to an hussar +riding behind him, with as calm and careless an air as though he +were merely out for a ride. He glanced with pity at the excited face +of Ilyin, who talked much and in great agitation. He knew from +experience the tormenting expectation of terror and death the cornet +was suffering and knew that only time could help him. + +As soon as the sun appeared in a clear strip of sky beneath the +clouds, the wind fell, as if it dared not spoil the beauty of the +summer morning after the storm; drops still continued to fall, but +vertically now, and all was still. The whole sun appeared on the +horizon and disappeared behind a long narrow cloud that hung above it. +A few minutes later it reappeared brighter still from behind the top +of the cloud, tearing its edge. Everything grew bright and +glittered. And with that light, and as if in reply to it, came the +sound of guns ahead of them. + +Before Rostov had had time to consider and determine the distance of +that firing, Count Ostermann-Tolstoy's adjutant came galloping from +Vitebsk with orders to advance at a trot along the road. + +The squadron overtook and passed the infantry and the battery--which +had also quickened their pace--rode down a hill, and passing through +an empty and deserted village again ascended. The horses began to +lather and the men to flush. + +"Halt! Dress your ranks!" the order of the regimental commander +was heard ahead. "Forward by the left. Walk, march!" came the order +from in front. + +And the hussars, passing along the line of troops on the left +flank of our position, halted behind our Uhlans who were in the +front line. To the right stood our infantry in a dense column: they +were the reserve. Higher up the hill, on the very horizon, our guns +were visible through the wonderfully clear air, brightly illuminated +by slanting morning sunbeams. In front, beyond a hollow dale, could be +seen the enemy's columns and guns. Our advanced line, already in +action, could be heard briskly exchanging shots with the enemy in +the dale. + +At these sounds, long unheard, Rostov's spirits rose, as at the +strains of the merriest music. Trap-ta-ta-tap! cracked the shots, +now together, now several quickly one after another. Again all was +silent and then again it sounded as if someone were walking on +detonators and exploding them. + +The hussars remained in the same place for about an hour. A +cannonade began. Count Ostermann with his suite rode up behind the +squadron, halted, spoke to the commander of the regiment, and rode +up the hill to the guns. + +After Ostermann had gone, a command rang out to the Uhlans. + +"Form column! Prepare to charge!" + +The infantry in front of them parted into platoons to allow the +cavalry to pass. The Uhlans started, the streamers on their spears +fluttering, and trotted downhill toward the French cavalry which was +seen below to the left. + +As soon as the Uhlans descended the hill, the hussars were ordered +up the hill to support the battery. As they took the places vacated by +the Uhlans, bullets came from the front, whining and whistling, but +fell spent without taking effect. + +The sounds, which he had not heard for so long, had an even more +pleasurable and exhilarating effect on Rostov than the previous sounds +of firing. Drawing himself up, he viewed the field of battle opening +out before him from the hill, and with his whole soul followed the +movement of the Uhlans. They swooped down close to the French +dragoons, something confused happened there amid the smoke, and five +minutes later our Uhlans were galloping back, not to the place they +had occupied but more to the left, and among the orange-colored Uhlans +on chestnut horses and behind them, in a large group, blue French +dragoons on gray horses could be seen. + + + + + +CHAPTER XV + + +Rostov, with his keen sportsman's eye, was one of the first to catch +sight of these blue French dragoons pursuing our Uhlans. Nearer and +nearer in disorderly crowds came the Uhlans and the French dragoons +pursuing them. He could already see how these men, who looked so small +at the foot of the hill, jostled and overtook one another, waving +their arms and their sabers in the air. + +Rostov gazed at what was happening before him as at a hunt. He +felt instinctively that if the hussars struck at the French dragoons +now, the latter could not withstand them, but if a charge was to be +made it must be done now, at that very moment, or it would be too +late. He looked around. A captain, standing beside him, was gazing +like himself with eyes fixed on the cavalry below them. + +"Andrew Sevastyanych!" said Rostov. "You know, we could crush +them...." + +"A fine thing too!" replied the captain, "and really..." + +Rostov, without waiting to hear him out, touched his horse, galloped +to the front of his squadron, and before he had time to finish +giving the word of command, the whole squadron, sharing his feeling, +was following him. Rostov himself did not know how or why he did it. +He acted as he did when hunting, without reflecting or considering. He +saw the dragoons near and that they were galloping in disorder; he +knew they could not withstand an attack--knew there was only that +moment and that if he let it slip it would not return. The bullets +were whining and whistling so stimulatingly around him and his horse +was so eager to go that he could not restrain himself. He touched +his horse, gave the word of command, and immediately, hearing behind +him the tramp of the horses of his deployed squadron, rode at full +trot downhill toward the dragoons. Hardly had they reached the +bottom of the hill before their pace instinctively changed to a +gallop, which grew faster and faster as they drew nearer to our Uhlans +and the French dragoons who galloped after them. The dragoons were now +close at hand. On seeing the hussars, the foremost began to turn, +while those behind began to halt. With the same feeling with which +he had galloped across the path of a wolf, Rostov gave rein to his +Donets horse and galloped to intersect the path of the dragoons' +disordered lines. One Uhlan stopped, another who was on foot flung +himself to the ground to avoid being knocked over, and a riderless +horse fell in among the hussars. Nearly all the French dragoons were +galloping back. Rostov, picking out one on a gray horse, dashed +after him. On the way he came upon a bush, his gallant horse cleared +it, and almost before he had righted himself in his saddle he saw that +he would immediately overtake the enemy he had selected. That +Frenchman, by his uniform an officer, was going at a gallop, crouching +on his gray horse and urging it on with his saber. In another moment +Rostov's horse dashed its breast against the hindquarters of the +officer's horse, almost knocking it over, and at the same instant +Rostov, without knowing why, raised his saber and struck the Frenchman +with it. + +The instant he had done this, all Rostov's animation vanished. The +officer fell, not so much from the blow--which had but slightly cut +his arm above the elbow--as from the shock to his horse and from +fright. Rostov reined in his horse, and his eyes sought his foe to see +whom he had vanquished. The French dragoon officer was hopping with +one foot on the ground, the other being caught in the stirrup. His +eyes, screwed up with fear as if he every moment expected another +blow, gazed up at Rostov with shrinking terror. His pale and +mud-stained face--fair and young, with a dimple in the chin and +light-blue eyes--was not an enemy's face at all suited to a +battlefield, but a most ordinary, homelike face. Before Rostov had +decided what to do with him, the officer cried, "I surrender!" He +hurriedly but vainly tried to get his foot out of the stirrup and +did not remove his frightened blue eyes from Rostov's face. Some +hussars who galloped up disengaged his foot and helped him into the +saddle. On all sides, the hussars were busy with the dragoons; one was +wounded, but though his face was bleeding, he would not give up his +horse; another was perched up behind an hussar with his arms round +him; a third was being helped by an hussar to mount his horse. In +front, the French infantry were firing as they ran. The hussars +galloped hastily back with their prisoners. Rostov galloped back +with the rest, aware of an unpleasant feeling of depression in his +heart. Something vague and confused, which he could not at all account +for, had come over him with the capture of that officer and the blow +he had dealt him. + +Count Ostermann-Tolstoy met the returning hussars, sent for +Rostov, thanked him, and said he would report his gallant deed to +the Emperor and would recommend him for a St. George's Cross. When +sent for by Count Ostermann, Rostov, remembering that he had charged +without orders, felt sure his commander was sending for him to +punish him for breach of discipline. Ostermann's flattering words +and promise of a reward should therefore have struck him all the +more pleasantly, but he still felt that same vaguely disagreeable +feeling of moral nausea. "But what on earth is worrying me?" he +asked himself as he rode back from the general. "Ilyin? No, he's safe. +Have I disgraced myself in any way? No, that's not it." Something +else, resembling remorse, tormented him. "Yes, oh yes, that French +officer with the dimple. And I remember how my arm paused when I +raised it." + +Rostov saw the prisoners being led away and galloped after them to +have a look at his Frenchman with the dimple on his chin. He was +sitting in his foreign uniform on an hussar packhorse and looked +anxiously about him; The sword cut on his arm could scarcely be called +a wound. He glanced at Rostov with a feigned smile and waved his +hand in greeting. Rostov still had the same indefinite feeling, as +of shame. + +All that day and the next his friends and comrades noticed that +Rostov, without being dull or angry, was silent, thoughtful, and +preoccupied. He drank reluctantly, tried to remain alone, and kept +turning something over in his mind. + +Rostov was always thinking about that brilliant exploit of his, +which to his amazement had gained him the St. George's Cross and +even given him a reputation for bravery, and there was something he +could not at all understand. "So others are even more afraid than I +am!" he thought. "So that's all there is in what is called heroism! +And heroism! And did I do it for my country's sake? And how was he +to blame, with his dimple and blue eyes? And how frightened he was! He +thought that I should kill him. Why should I kill him? My hand +trembled. And they have given me a St. George's Cross.... I can't make +it out at all." + +But while Nicholas was considering these questions and still could +reach no clear solution of what puzzled him so, the wheel of fortune +in the service, as often happens, turned in his favor. After the +affair at Ostrovna he was brought into notice, received command of +an hussar battalion, and when a brave officer was needed he was +chosen. + + + + + +CHAPTER XVI + + +On receiving news of Natasha's illness, the countess, though not +quite well yet and still weak, went to Moscow with Petya and the +rest of the household, and the whole family moved from Marya +Dmitrievna's house to their own and settled down in town. + +Natasha's illness was so serious that, fortunately for her and for +her parents, the consideration of all that had caused the illness, her +conduct and the breaking off of her engagement, receded into the +background. She was so ill that it was impossible for them to consider +in how far she was to blame for what had happened. She could not eat +or sleep, grew visibly thinner, coughed, and, as the doctors made them +feel, was in danger. They could not think of anything but how to +help her. Doctors came to see her singly and in consultation, talked +much in French, German, and Latin, blamed one another, and +prescribed a great variety of medicines for all the diseases known +to them, but the simple idea never occurred to any of them that they +could not know the disease Natasha was suffering from, as no disease +suffered by a live man can be known, for every living person has his +own peculiarities and always has his own peculiar, personal, novel, +complicated disease, unknown to medicine--not a disease of the +lungs, liver, skin, heart, nerves, and so on mentioned in medical +books, but a disease consisting of one of the innumerable combinations +of the maladies of those organs. This simple thought could not occur +to the doctors (as it cannot occur to a wizard that he is unable to +work his charms) because the business of their lives was to cure, +and they received money for it and had spent the best years of their +lives on that business. But, above all, that thought was kept out of +their minds by the fact that they saw they were really useful, as in +fact they were to the whole Rostov family. Their usefulness did not +depend on making the patient swallow substances for the most part +harmful (the harm was scarcely perceptible, as they were given in +small doses), but they were useful, necessary, and indispensable +because they satisfied a mental need of the invalid and of those who +loved her--and that is why there are, and always will be, +pseudo-healers, wise women, homeopaths, and allopaths. They +satisfied that eternal human need for hope of relief, for sympathy, +and that something should be done, which is felt by those who are +suffering. They satisfied the need seen in its most elementary form in +a child, when it wants to have a place rubbed that has been hurt. A +child knocks itself and runs at once to the arms of its mother or +nurse to have the aching spot rubbed or kissed, and it feels better +when this is done. The child cannot believe that the strongest and +wisest of its people have no remedy for its pain, and the hope of +relief and the expression of its mother's sympathy while she rubs +the bump comforts it. The doctors were of use to Natasha because +they kissed and rubbed her bump, assuring her that it would soon +pass if only the coachman went to the chemist's in the Arbat and got a +powder and some pills in a pretty box of a ruble and seventy kopeks, +and if she took those powders in boiled water at intervals of +precisely two hours, neither more nor less. + +What would Sonya and the count and countess have done, how would +they have looked, if nothing had been done, if there had not been +those pills to give by the clock, the warm drinks, the chicken +cutlets, and all the other details of life ordered by the doctors, the +carrying out of which supplied an occupation and consolation to the +family circle? How would the count have borne his dearly loved +daughter's illness had he not known that it was costing him a thousand +rubles, and that he would not grudge thousands more to benefit her, or +had he not known that if her illness continued he would not grudge yet +other thousands and would take her abroad for consultations there, and +had he not been able to explain the details of how Metivier and Feller +had not understood the symptoms, but Frise had, and Mudrov had +diagnosed them even better? What would the countess have done had +she not been able sometimes to scold the invalid for not strictly +obeying the doctor's orders? + +"You'll never get well like that," she would say, forgetting her +grief in her vexation, "if you won't obey the doctor and take your +medicine at the right time! You mustn't trifle with it, you know, or +it may turn to pneumonia," she would go on, deriving much comfort from +the utterance of that foreign word, incomprehensible to others as well +as to herself. + +What would Sonya have done without the glad consciousness that she +had not undressed during the first three nights, in order to be +ready to carry out all the doctor's injunctions with precision, and +that she still kept awake at night so as not to miss the proper time +when the slightly harmful pills in the little gilt box had to be +administered? Even to Natasha herself it was pleasant to see that so +many sacrifices were being made for her sake, and to know that she had +to take medicine at certain hours, though she declared that no +medicine would cure her and that it was all nonsense. And it was +even pleasant to be able to show, by disregarding the orders, that she +did not believe in medical treatment and did not value her life. + +The doctor came every day, felt her pulse, looked at her tongue, and +regardless of her grief-stricken face joked with her. But when he +had gone into another room, to which the countess hurriedly followed +him, he assumed a grave air and thoughtfully shaking his head said +that though there was danger, he had hopes of the effect of this +last medicine and one must wait and see, that the malady was chiefly +mental, but... And the countess, trying to conceal the action from +herself and from him, slipped a gold coin into his hand and always +returned to the patient with a more tranquil mind. + +The symptoms of Natasha's illness were that she ate little, slept +little, coughed, and was always low-spirited. The doctors said that +she could not get on without medical treatment, so they kept her in +the stifling atmosphere of the town, and the Rostovs did not move to +the country that summer of 1812. + +In spite of the many pills she swallowed and the drops and powders +out of the little bottles and boxes of which Madame Schoss who was +fond of such things made a large collection, and in spite of being +deprived of the country life to which she was accustomed, youth +prevailed. Natasha's grief began to be overlaid by the impressions +of daily life, it ceased to press so painfully on her heart, it +gradually faded into the past, and she began to recover physically. + + + + + +CHAPTER XVII + + +Natasha was calmer but no happier. She not merely avoided all +external forms of pleasure--balls, promenades, concerts, and theaters- +but she never laughed without a sound of tears in her laughter. She +could not sing. As soon as she began to laugh, or tried to sing by +herself, tears choked her: tears of remorse, tears at the recollection +of those pure times which could never return, tears of vexation that +she should so uselessly have ruined her young life which might have +been so happy. Laughter and singing in particular seemed to her like a +blasphemy, in face of her sorrow. Without any need of +self-restraint, no wish to coquet ever entered her head. She said +and felt at that time that no man was more to her than Nastasya +Ivanovna, the buffoon. Something stood sentinel within her and forbade +her every joy. Besides, she had lost all the old interests of her +carefree girlish life that had been so full of hope. The previous +autumn, the hunting, "Uncle," and the Christmas holidays spent with +Nicholas at Otradnoe were what she recalled oftenest and most +painfully. What would she not have given to bring back even a single +day of that time! But it was gone forever. Her presentiment at the +time had not deceived her--that that state of freedom and readiness +for any enjoyment would not return again. Yet it was necessary to live +on. + +It comforted her to reflect that she was not better as she had +formerly imagined, but worse, much worse, than anybody else in the +world. But this was not enough. She knew that, and asked herself, +"What next?" But there was nothing to come. There was no joy in +life, yet life was passing. Natasha apparently tried not to be a +burden or a hindrance to anyone, but wanted nothing for herself. She +kept away from everyone in the house and felt at ease only with her +brother Petya. She liked to be with him better than with the others, +and when alone with him she sometimes laughed. She hardly ever left +the house and of those who came to see them was glad to see only one +person, Pierre. It would have been impossible to treat her with more +delicacy, greater care, and at the same time more seriously than did +Count Bezukhov. Natasha unconsciously felt this delicacy and so +found great pleasure in his society. But she was not even grateful +to him for it; nothing good on Pierre's part seemed to her to be an +effort, it seemed so natural for him to be kind to everyone that there +was no merit in his kindness. Sometimes Natasha noticed +embarrassment and awkwardness on his part in her presence, +especially when he wanted to do something to please her, or feared +that something they spoke of would awaken memories distressing to her. +She noticed this and attributed it to his general kindness and +shyness, which she imagined must be the same toward everyone as it was +to her. After those involuntary words--that if he were free he would +have asked on his knees for her hand and her love--uttered at a moment +when she was so strongly agitated, Pierre never spoke to Natasha of +his feelings; and it seemed plain to her that those words, which had +then so comforted her, were spoken as all sorts of meaningless words +are spoken to comfort a crying child. It was not because Pierre was +a married man, but because Natasha felt very strongly with him that +moral barrier the absence of which she had experienced with Kuragin +that it never entered her head that the relations between him and +herself could lead to love on her part, still less on his, or even +to the kind of tender, self-conscious, romantic friendship between a +man and a woman of which she had known several instances. + +Before the end of the fast of St. Peter, Agrafena Ivanovna Belova, a +country neighbor of the Rostovs, came to Moscow to pay her devotions +at the shrines of the Moscow saints. She suggested that Natasha should +fast and prepare for Holy Communion, and Natasha gladly welcomed the +idea. Despite the doctor's orders that she should not go out early +in the morning, Natasha insisted on fasting and preparing for the +sacrament, not as they generally prepared for it in the Rostov +family by attending three services in their own house, but as Agrafena +Ivanovna did, by going to church every day for a week and not once +missing Vespers, Matins, or Mass. + +The countess was pleased with Natasha's zeal; after the poor results +of the medical treatment, in the depths of her heart she hoped that +prayer might help her daughter more than medicines and, though not +without fear and concealing it from the doctor, she agreed to +Natasha's wish and entrusted her to Belova. Agrafena Ivanovna used +to come to wake Natasha at three in the morning, but generally found +her already awake. She was afraid of being late for Matins. Hastily +washing, and meekly putting on her shabbiest dress and an old +mantilla, Natasha, shivering in the fresh air, went out into the +deserted streets lit by the clear light of dawn. By Agrafena +Ivanovna's advice Natasha prepared herself not in their own parish, +but at a church where, according to the devout Agrafena Ivanovna, +the priest was a man of very severe and lofty life. There were never +many people in the church; Natasha always stood beside Belova in the +customary place before an icon of the Blessed Virgin, let into the +screen before the choir on the left side, and a feeling, new to her, +of humility before something great and incomprehensible, seized her +when at that unusual morning hour, gazing at the dark face of the +Virgin illuminated by the candles burning before it and by the morning +light falling from the window, she listened to the words of the +service which she tried to follow with understanding. When she +understood them her personal feeling became interwoven in the +prayers with shades of its own. When she did not understand, it was +sweeter still to think that the wish to understand everything is +pride, that it is impossible to understand all, that it is only +necessary to believe and to commit oneself to God, whom she felt +guiding her soul at those moments. She crossed herself, bowed low, and +when she did not understand, in horror at her own vileness, simply +asked God to forgive her everything, everything, to have mercy upon +her. The prayers to which she surrendered herself most of all were +those of repentance. On her way home at an early hour when she met +no one but bricklayers going to work or men sweeping the street, and +everybody within the houses was still asleep, Natasha experienced a +feeling new to her, a sense of the possibility of correcting her +faults, the possibility of a new, clean life, and of happiness. + +During the whole week she spent in this way, that feeling grew every +day. And the happiness of taking communion, or "communing" as Agrafena +Ivanovna, joyously playing with the word, called it, seemed to Natasha +so great that she felt she should never live till that blessed Sunday. + +But the happy day came, and on that memorable Sunday, when, +dressed in white muslin, she returned home after communion, for the +first time for many months she felt calm and not oppressed by the +thought of the life that lay before her. + +The doctor who came to see her that day ordered her to continue +the powders he had prescribed a fortnight previously. + +"She must certainly go on taking them morning and evening," said he, +evidently sincerely satisfied with his success. "Only, please be +particular about it. + +"Be quite easy," he continued playfully, as he adroitly took the +gold coin in his palm. "She will soon be singing and frolicking about. +The last medicine has done her a very great deal of good. She has +freshened up very much." + +The countess, with a cheerful expression on her face, looked down at +her nails and spat a little for luck as she returned to the drawing +room. + + + + + +CHAPTER XVIII + + +At the beginning of July more and more disquieting reports about the +war began to spread in Moscow; people spoke of an appeal by the +Emperor to the people, and of his coming himself from the army to +Moscow. And as up to the eleventh of July no manifesto or appeal had +been received, exaggerated reports became current about them and about +the position of Russia. It was said that the Emperor was leaving the +army because it was in danger, it was said that Smolensk had +surrendered, that Napoleon had an army of a million and only a miracle +could save Russia. + +On the eleventh of July, which was Saturday, the manifesto was +received but was not yet in print, and Pierre, who was at the +Rostovs', promised to come to dinner next day, Sunday, and bring a +copy of the manifesto and appeal, which he would obtain from Count +Rostopchin. + +That Sunday, the Rostovs went to Mass at the Razumovskis' private +chapel as usual. It was a hot July day. Even at ten o'clock, when +the Rostovs got out of their carriage at the chapel, the sultry air, +the shouts of hawkers, the light and gay summer clothes of the +crowd, the dusty leaves of the trees on the boulevard, the sounds of +the band and the white trousers of a battalion marching to parade, the +rattling of wheels on the cobblestones, and the brilliant, hot +sunshine were all full of that summer languor, that content and +discontent with the present, which is most strongly felt on a +bright, hot day in town. All the Moscow notabilities, all the Rostovs' +acquaintances, were at the Razumovskis' chapel, for, as if expecting +something to happen, many wealthy families who usually left town for +their country estates had not gone away that summer. As Natasha, at +her mother's side, passed through the crowd behind a liveried +footman who cleared the way for them, she heard a young man speaking +about her in too loud a whisper. + +"That's Rostova, the one who..." + +"She's much thinner, but all the same she's pretty!" + +She heard, or thought she heard, the names of Kuragin and Bolkonski. +But she was always imagining that. It always seemed to her that +everyone who looked at her was thinking only of what had happened to +her. With a sinking heart, wretched as she always was now when she +found herself in a crowd, Natasha in her lilac silk dress trimmed with +black lace walked--as women can walk--with the more repose and +stateliness the greater the pain and shame in her soul. She knew for +certain that she was pretty, but this no longer gave her +satisfaction as it used to. On the contrary it tormented her more than +anything else of late, and particularly so on this bright, hot +summer day in town. "It's Sunday again--another week past," she +thought, recalling that she had been here the Sunday before, "and +always the same life that is no life, and the same surroundings in +which it used to be so easy to live. I'm pretty, I'm young, and I know +that now I am good. I used to be bad, but now I know I am good," she +thought, "but yet my best years are slipping by and are no good to +anyone." She stood by her mother's side and exchanged nods with +acquaintances near her. From habit she scrutinized the ladies' +dresses, condemned the bearing of a lady standing close by who was not +crossing herself properly but in a cramped manner, and again she +thought with vexation that she was herself being judged and was +judging others, and suddenly, at the sound of the service, she felt +horrified at her own vileness, horrified that the former purity of her +soul was again lost to her. + +A comely, fresh-looking old man was conducting the service with that +mild solemnity which has so elevating and soothing an effect on the +souls of the worshipers. The gates of the sanctuary screen were +closed, the curtain was slowly drawn, and from behind it a soft +mysterious voice pronounced some words. Tears, the cause of which +she herself did not understand, made Natasha's breast heave, and a +joyous but oppressive feeling agitated her. + +"Teach me what I should do, how to live my life, how I may grow good +forever, forever!" she pleaded. + +The deacon came out onto the raised space before the altar screen +and, holding his thumb extended, drew his long hair from under his +dalmatic and, making the sign of the cross on his breast, began in a +loud and solemn voice to recite the words of the prayer... + +"In peace let us pray unto the Lord." + +"As one community, without distinction of class, without enmity, +united by brotherly love--let us pray!" thought Natasha. + +"For the peace that is from above, and for the salvation of our +souls." + +"For the world of angels and all the spirits who dwell above us," +prayed Natasha. + +When they prayed for the warriors, she thought of her brother and +Denisov. When they prayed for all traveling by land and sea, she +remembered Prince Andrew, prayed for him, and asked God to forgive her +all the wrongs she had done him. When they prayed for those who love +us, she prayed for the members of her own family, her father and +mother and Sonya, realizing for the first time how wrongly she had +acted toward them, and feeling all the strength of her love for +them. When they prayed for those who hate us, she tried to think of +her enemies and people who hated her, in order to pray for them. She +included among her enemies the creditors and all who had business +dealings with her father, and always at the thought of enemies and +those who hated her she remembered Anatole who had done her so much +harm--and though he did not hate her she gladly prayed for him as +for an enemy. Only at prayer did she feel able to think clearly and +calmly of Prince Andrew and Anatole, as men for whom her feelings were +as nothing compared with her awe and devotion to God. When they prayed +for the Imperial family and the Synod, she bowed very low and made the +sign of the cross, saying to herself that even if she did not +understand, still she could not doubt, and at any rate loved the +governing Synod and prayed for it. + +When he had finished the Litany the deacon crossed the stole over +his breast and said, "Let us commit ourselves and our whole lives to +Christ the Lord!" + +"Commit ourselves to God," Natasha inwardly repeated. "Lord God, I +submit myself to Thy will!" she thought. "I want nothing, wish for +nothing; teach me what to do and how to use my will! Take me, take +me!" prayed Natasha, with impatient emotion in her heart, not crossing +herself but letting her slender arms hang down as if expecting some +invisible power at any moment to take her and deliver her from +herself, from her regrets, desires, remorse, hopes, and sins. + +The countess looked round several times at her daughter's softened +face and shining eyes and prayed God to help her. + +Unexpectedly, in the middle of the service, and not in the usual +order Natasha knew so well, the deacon brought out a small stool, +the one he knelt on when praying on Trinity Sunday, and placed it +before the doors of the sanctuary screen. The priest came out with his +purple velvet biretta on his head, adjusted his hair, and knelt down +with an effort. Everybody followed his example and they looked at +one another in surprise. Then came the prayer just received from the +Synod--a prayer for the deliverance of Russia from hostile invasion. + +"Lord God of might, God of our salvation!" began the priest in +that voice, clear, not grandiloquent but mild, in which only the +Slav clergy read and which acts so irresistibly on a Russian heart. + +"Lord God of might, God of our salvation! Look this day in mercy and +blessing on Thy humble people, and graciously hear us, spare us, and +have mercy upon us! This foe confounding Thy land, desiring to lay +waste the whole world, rises against us; these lawless men are +gathered together to overthrow Thy kingdom, to destroy Thy dear +Jerusalem, Thy beloved Russia; to defile Thy temples, to overthrow +Thine altars, and to desecrate our holy shrines. How long, O Lord, how +long shall the wicked triumph? How long shall they wield unlawful +power? + +"Lord God! Hear us when we pray to Thee; strengthen with Thy might +our most gracious sovereign lord, the Emperor Alexander Pavlovich; +be mindful of his uprightness and meekness, reward him according to +his righteousness, and let it preserve us, Thy chosen Israel! Bless +his counsels, his undertakings, and his work; strengthen his kingdom +by Thine almighty hand, and give him victory over his enemy, even as +Thou gavest Moses the victory over Amalek, Gideon over Midian, and +David over Goliath. Preserve his army, put a bow of brass in the hands +of those who have armed themselves in Thy Name, and gird their loins +with strength for the fight. Take up the spear and shield and arise to +help us; confound and put to shame those who have devised evil against +us, may they be before the faces of Thy faithful warriors as dust +before the wind, and may Thy mighty Angel confound them and put them +to flight; may they be ensnared when they know it not, and may the +plots they have laid in secret be turned against them; let them fall +before Thy servants' feet and be laid low by our hosts! Lord, Thou art +able to save both great and small; Thou art God, and man cannot +prevail against Thee! + +"God of our fathers! Remember Thy bounteous mercy and +loving-kindness which are from of old; turn not Thy face from us, +but be gracious to our unworthiness, and in Thy great goodness and Thy +many mercies regard not our transgressions and iniquities! Create in +us a clean heart and renew a right spirit within us, strengthen us all +in Thy faith, fortify our hope, inspire us with true love one for +another, arm us with unity of spirit in the righteous defense of the +heritage Thou gavest to us and to our fathers, and let not the scepter +of the wicked be exalted against the destiny of those Thou hast +sanctified. + +"O Lord our God, in whom we believe and in whom we put our trust, +let us not be confounded in our hope of Thy mercy, and give us a token +of Thy blessing, that those who hate us and our Orthodox faith may see +it and be put to shame and perish, and may all the nations know that +Thou art the Lord and we are Thy people. Show Thy mercy upon us this +day, O Lord, and grant us Thy salvation; make the hearts of Thy +servants to rejoice in Thy mercy; smite down our enemies and destroy +them swiftly beneath the feet of Thy faithful servants! For Thou art +the defense, the succor, and the victory of them that put their +trust in Thee, and to Thee be all glory, to Father, Son, and Holy +Ghost, now and forever, world without end. Amen." + +In Natasha's receptive condition of soul this prayer affected her +strongly. She listened to every word about the victory of Moses over +Amalek, of Gideon over Midian, and of David over Goliath, and about +the destruction of "Thy Jerusalem," and she prayed to God with the +tenderness and emotion with which her heart was overflowing, but +without fully understanding what she was asking of God in that prayer. +She shared with all her heart in the prayer for the spirit of +righteousness, for the strengthening of the heart by faith and hope, +and its animation by love. But she could not pray that her enemies +might be trampled under foot when but a few minutes before she had +been wishing she had more of them that she might pray for them. But +neither could she doubt the righteousness of the prayer that was being +read on bended knees. She felt in her heart a devout and tremulous awe +at the thought of the punishment that overtakes men for their sins, +and especially of her own sins, and she prayed to God to forgive +them all, and her too, and to give them all, and her too, peace and +happiness. And it seemed to her that God heard her prayer. + + + + + +CHAPTER XIX + + +From the day when Pierre, after leaving the Rostovs' with +Natasha's grateful look fresh in his mind, had gazed at the comet that +seemed to be fixed in the sky and felt that something new was +appearing on his own horizon--from that day the problem of the +vanity and uselessness of all earthly things, that had incessantly +tormented him, no longer presented itself. That terrible question +"Why?" "Wherefore?" which had come to him amid every occupation, was +now replaced, not by another question or by a reply to the former +question, but by her image. When he listened to, or himself took +part in, trivial conversations, when he read or heard of human +baseness or folly, he was not horrified as formerly, and did not ask +himself why men struggled so about these things when all is so +transient and incomprehensible--but he remembered her as he had last +seen her, and all his doubts vanished--not because she had answered +the questions that had haunted him, but because his conception of +her transferred him instantly to another, a brighter, realm of +spiritual activity in which no one could be justified or guilty--a +realm of beauty and love which it was worth living for. Whatever +worldly baseness presented itself to him, he said to himself: + +"Well, supposing N. N. swindled the country and the Tsar, and the +country and the Tsar confer honors upon him, what does that matter? +She smiled at me yesterday and asked me to come again, and I love her, +and no one will ever know it." And his soul felt calm and peaceful. + +Pierre still went into society, drank as much and led the same +idle and dissipated life, because besides the hours he spent at the +Rostovs' there were other hours he had to spend somehow, and the +habits and acquaintances he had made in Moscow formed a current that +bore him along irresistibly. But latterly, when more and more +disquieting reports came from the seat of war and Natasha's health +began to improve and she no longer aroused in him the former feeling +of careful pity, an ever-increasing restlessness, which he could not +explain, took possession of him. He felt that the condition he was +in could not continue long, that a catastrophe was coming which +would change his whole life, and he impatiently sought everywhere +for signs of that approaching catastrophe. One of his brother Masons +had revealed to Pierre the following prophecy concerning Napoleon, +drawn from the Revelation of St. John. + +In chapter 13, verse 18, of the Apocalypse, it is said: + + +Here is wisdom. Let him that hath understanding count the number +of the beast: for it is the number of a man; and his number is Six +hundred threescore and six. + +And in the fifth verse of the same chapter: + + +And there was given unto him a mouth speaking great things and +blasphemies; and power was given unto him to continue forty and two +months. + + +The French alphabet, written out with the same numerical values as +the Hebrew, in which the first nine letters denote units and the +others tens, will have the following significance: + + a b c d e f g h i k + 1 2 3 4 5 6 7 8 9 10 + l m n o p q r s + 20 30 40 50 60 70 80 90 + t u v w x y + 100 110 120 130 140 150 + z + 160 + + +Writing the words L'Empereur Napoleon in numbers, it appears that +the sum of them is 666, and that Napoleon therefore the beast foretold +in the Apocalypse. Moreover, by applying the same system to the +words quarante-deux,* which was the term allowed to the beast that +"spoke great things and blasphemies," the same number 666 was +obtained; from which it followed that the limit fixed for Napoleon's +power had come in the year 1812 when the French emperor was forty-two. +This prophecy pleased Pierre very much and he often asked himself what +would put an end to the power of the beast, that is, of Napoleon, +and tried by the same system of using letters as numbers and adding +them up, to find an answer to the question that engrossed him. He +wrote the words L'Empereur Alexandre, La nation russe and added up +their numbers, but the sums were either more or less than 666. Once +when making such calculations he wrote down his own name in French, +Comte Pierre Besouhoff, but the sum of the numbers did not come right. +Then he changed the spelling, substituting a z for the s and adding de +and the article le, still without obtaining the desired result. Then +it occurred to him: if the answer to the question were contained in +his name, his nationality would also be given in the answer. So he +wrote Le russe Besuhof and adding up the numbers got 671. This was +only five too much, and five was represented by e, the very letter +elided from the article le before the word Empereur. By omitting the +e, though incorrectly, Pierre got the answer he sought. L'russe +Besuhof made 666. This discovery excited him. How, or by what means, +he was connected with the great event foretold in the Apocalypse he +did not know, but he did not doubt that connection for a moment. His +love for Natasha, Antichrist, Napoleon, the invasion, the comet, +666, L'Empereur Napoleon, and L'russe Besuhof--all this had to +mature and culminate, to lift him out of that spellbound, petty sphere +of Moscow habits in which he felt himself held captive and lead him to +a great achievement and great happiness. + + +*Forty-two. + + + +On the eve of the Sunday when the special prayer was read, Pierre +had promised the Rostovs to bring them, from Count Rostopchin whom +he knew well, both the appeal to the people and the news from the +army. In the morning, when he went to call at Rostopchin's he met +there a courier fresh from the army, an acquaintance of his own, who +often danced at Moscow balls. + +"Do, please, for heaven's sake, relieve me of something!" said the +courier. "I have a sackful of letters to parents." + +Among these letters was one from Nicholas Rostov to his father. +Pierre took that letter, and Rostopchin also gave him the Emperor's +appeal to Moscow, which had just been printed, the last army orders, +and his own most recent bulletin. Glancing through the army orders, +Pierre found in one of them, in the lists of killed, wounded, and +rewarded, the name of Nicholas Rostov, awarded a St. George's Cross of +the Fourth Class for courage shown in the Ostrovna affair, and in +the same order the name of Prince Andrew Bolkonski, appointed to the +command of a regiment of Chasseurs. Though he did not want to remind +the Rostovs of Bolkonski, Pierre could not refrain from making them +happy by the news of their son's having received a decoration, so he +sent that printed army order and Nicholas' letter to the Rostovs, +keeping the appeal, the bulletin, and the other orders to take with +him when he went to dinner. + +His conversation with Count Rostopchin and the latter's tone of +anxious hurry, the meeting with the courier who talked casually of how +badly things were going in the army, the rumors of the discovery of +spies in Moscow and of a leaflet in circulation stating that +Napoleon promised to be in both the Russian capitals by the autumn, +and the talk of the Emperor's being expected to arrive next day--all +aroused with fresh force that feeling of agitation and expectation +in Pierre which he had been conscious of ever since the appearance +of the comet, and especially since the beginning of the war. + +He had long been thinking of entering the army and would have done +so had he not been hindered, first, by his membership of the Society +of Freemasons to which he was bound by oath and which preached +perpetual peace and the abolition of war, and secondly, by the fact +that when he saw the great mass of Muscovites who had donned uniform +and were talking patriotism, he somehow felt ashamed to take the step. +But the chief reason for not carrying out his intention to enter the +army lay in the vague idea that he was L'russe Besuhof who had the +number of the beast, 666; that his part in the great affair of setting +a limit to the power of the beast that spoke great and blasphemous +things had been predestined from eternity, and that therefore he ought +not to undertake anything, but wait for what was bound to come to +pass. + + + + + +CHAPTER XX + + +A few intimate friends were dining with the Rostovs that day, as +usual on Sundays. + +Pierre came early so as to find them alone. + +He had grown so stout this year that he would have been abnormal had +he not been so tall, so broad of limb, and so strong that he carried +his bulk with evident ease. + +He went up the stairs, puffing and muttering something. His coachman +did not even ask whether he was to wait. He knew that when his +master was at the Rostovs' he stayed till midnight. The Rostovs' +footman rushed eagerly forward to help him off with his cloak and take +his hat and stick. Pierre, from club habit, always left both hat and +stick in the anteroom. + +The first person he saw in the house was Natasha. Even before he saw +her, while taking off his cloak, he heard her. She was practicing +solfa exercises in the music room. He knew that she had not sung since +her illness, and so the sound of her voice surprised and delighted +him. He opened the door softly and saw her, in the lilac dress she had +worn at church, walking about the room singing. She had her back to +him when he opened the door, but when, turning quickly, she saw his +broad, surprised face, she blushed and came rapidly up to him. + +"I want to try to sing again," she said, adding as if by way of +excuse, "it is, at least, something to do." + +"That's capital!" + +"How glad I am you've come! I am so happy today," she said, with the +old animation Pierre had not seen in her for along time. "You know +Nicholas has received a St. George's Cross? I am so proud of him." + +"Oh yes, I sent that announcement. But I don't want to interrupt +you," he added, and was about to go to the drawing room. + +Natasha stopped him. + +"Count, is it wrong of me to sing?" she said blushing, and fixing +her eyes inquiringly on him. + +"No... Why should it be? On the contrary... But why do you ask me?" + +"I don't know myself," Natasha answered quickly, "but I should not +like to do anything you disapproved of. I believe in you completely. +You don't know how important you are to me, how much you've done for +me...." She spoke rapidly and did not notice how Pierre flushed at her +words. "I saw in that same army order that he, Bolkonski" (she +whispered the name hastily), "is in Russia, and in the army again. +What do you think?"--she was speaking hurriedly, evidently afraid +her strength might fail her--"Will he ever forgive me? Will he not +always have a bitter feeling toward me? What do you think? What do you +think?" + +"I think..." Pierre replied, "that he has nothing to forgive.... +If I were in his place..." + +By association of ideas, Pierre was at once carried back to the +day when, trying to comfort her, he had said that if he were not +himself but the best man in the world and free, he would ask on his +knees for her hand; and the same feeling of pity, tenderness, and love +took possession of him and the same words rose to his lips. But she +did not give him time to say them. + +"Yes, you... you..." she said, uttering the word you rapturously- +"that's a different thing. I know no one kinder, more generous, or +better than you; nobody could be! Had you not been there then, and now +too, I don't know what would have become of me, because..." + +Tears suddenly rose in her eyes, she turned away, lifted her music +before her eyes, began singing again, and again began walking up and +down the room. + +Just then Petya came running in from the drawing room. + +Petya was now a handsome rosy lad of fifteen with full red lips +and resembled Natasha. He was preparing to enter the university, but +he and his friend Obolenski had lately, in secret, agreed to join +the hussars. + +Petya had come rushing out to talk to his namesake about this +affair. He had asked Pierre to find out whether he would be accepted +in the hussars. + +Pierre walked up and down the drawing room, not listening to what +Petya was saying. + +Petya pulled him by the arm to attract his attention. + +"Well, what about my plan? Peter Kirilych, for heaven's sake! You +are my only hope," said Petya. + +"Oh yes, your plan. To join the hussars? I'll mention it, I'll bring +it all up today." + +"Well, mon cher, have you got the manifesto?" asked the old count. +"The countess has been to Mass at the Razumovskis' and heard the new +prayer. She says it's very fine." + +"Yes, I've got it," said Pierre. "The Emperor is to be here +tomorrow... there's to be an Extraordinary Meeting of the nobility, +and they are talking of a levy of ten men per thousand. Oh yes, let me +congratulate you!" + +"Yes, yes, thank God! Well, and what news from the army?" + +"We are again retreating. They say we're already near Smolensk," +replied Pierre. + +"O Lord, O Lord!" exclaimed the count. "Where is the manifesto?" + +"The Emperor's appeal? Oh yes!" + +Pierre began feeling in his pockets for the papers, but could not +find them. Still slapping his pockets, he kissed the hand of the +countess who entered the room and glanced uneasily around, evidently +expecting Natasha, who had left off singing but had not yet come +into the drawing room. + +"On my word, I don't know what I've done with it," he said. + +"There he is, always losing everything!" remarked the countess. + +Natasha entered with a softened and agitated expression of face +and sat down looking silently at Pierre. As soon as she entered, +Pierre's features, which had been gloomy, suddenly lighted up, and +while still searching for the papers he glanced at her several times. + +"No, really! I'll drive home, I must have left them there. I'll +certainly..." + +"But you'll be late for dinner." + +"Oh! And my coachman has gone." + +But Sonya, who had gone to look for the papers in the anteroom, +had found them in Pierre's hat, where he had carefully tucked them +under the lining. Pierre was about to begin reading. + +"No, after dinner," said the old count, evidently expecting much +enjoyment from that reading. + +At dinner, at which champagne was drunk to the health of the new +chevalier of St. George, Shinshin told them the town news, of the +illness of the old Georgian princess, of Metivier's disappearance from +Moscow, and of how some German fellow had been brought to Rostopchin +and accused of being a French "spyer" (so Count Rostopchin had told +the story), and how Rostopchin let him go and assured the people +that he was "not a spire at all, but only an old German ruin." + +"People are being arrested..." said the count. "I've told the +countess she should not speak French so much. It's not the time for it +now." + +"And have you heard?" Shinshin asked. "Prince Golitsyn has engaged a +master to teach him Russian. It is becoming dangerous to speak +French in the streets." + +"And how about you, Count Peter Kirilych? If they call up the +militia, you too will have to mount a horse," remarked the old +count, addressing Pierre. + +Pierre had been silent and preoccupied all through dinner, seeming +not to grasp what was said. He looked at the count. + +"Oh yes, the war," he said. "No! What sort of warrior should I make? +And yet everything is so strange, so strange! I can't make it out. I +don't know, I am very far from having military tastes, but in these +times no one can answer for himself." + +After dinner the count settled himself comfortably in an easy +chair and with a serious face asked Sonya, who was considered an +excellent reader, to read the appeal. + + +"To Moscow, our ancient Capital! + +"The enemy has entered the borders of Russia with immense forces. He +comes to despoil our beloved country," + + +Sonya read painstakingly in her high-pitched voice. The count +listened with closed eyes, heaving abrupt sighs at certain passages. + +Natasha sat erect, gazing with a searching look now at her father +and now at Pierre. + +Pierre felt her eyes on him and tried not to look round. The +countess shook her head disapprovingly and angrily at every solemn +expression in the manifesto. In all these words she saw only that +the danger threatening her son would not soon be over. Shinshin, +with a sarcastic smile on his lips, was evidently preparing to make +fun of anything that gave him the opportunity: Sonya's reading, any +remark of the count's, or even the manifesto itself should no better +pretext present itself. + +After reading about the dangers that threatened Russia, the hopes +the Emperor placed on Moscow and especially on its illustrious +nobility, Sonya, with a quiver in her voice due chiefly to the +attention that was being paid to her, read the last words: + + +"We ourselves will not delay to appear among our people in that +Capital and in others parts of our realm for consultation, and for the +direction of all our levies, both those now barring the enemy's path +and those freshly formed to defeat him wherever he may appear. May the +ruin he hopes to bring upon us recoil on his own head, and may +Europe delivered from bondage glorify the name of Russia!" + + +"Yes, that's it!" cried the count, opening his moist eyes and +sniffing repeatedly, as if a strong vinaigrette had been held to his +nose; and he added, "Let the Emperor but say the word and we'll +sacrifice everything and begrudge nothing." + +Before Shinshin had time to utter the joke he was ready to make on +the count's patriotism, Natasha jumped up from her place and ran to +her father. + +"What a darling our Papa is!" she cried, kissing him, and she +again looked at Pierre with the unconscious coquetry that had returned +to her with her better spirits. + +"There! Here's a patriot for you!" said Shinshin. + +"Not a patriot at all, but simply..." Natasha replied in an +injured tone. "Everything seems funny to you, but this isn't at all +a joke...." + +"A joke indeed!" put in the count. "Let him but say the word and +we'll all go.... We're not Germans!" + +"But did you notice, it says, 'for consultation'?" said Pierre. + +"Never mind what it's for...." + +At this moment, Petya, to whom nobody was paying any attention, came +up to his father with a very flushed face and said in his breaking +voice that was now deep and now shrill: + +"Well, Papa, I tell you definitely, and Mamma too, it's as you +please, but I say definitely that you must let me enter the army, +because I can't... that's all...." + +The countess, in dismay, looked up to heaven, clasped her hands, and +turned angrily to her husband. + +"That comes of your talking!" said she. + +But the count had already recovered from his excitement. + +"Come, come!" said he. "Here's a fine warrior! No! Nonsense! You +must study." + +"It's not nonsense, Papa. Fedya Obolenski is younger than I, and +he's going too. Besides, all the same I can't study now when..." Petya +stopped short, flushed till he perspired, but still got out the words, +"when our Fatherland is in danger." + +"That'll do, that'll do--nonsense...." + +"But you said yourself that we would sacrifice everything." + +"Petya! Be quiet, I tell you!" cried the count, with a glance at his +wife, who had turned pale and was staring fixedly at her son. + +"And I tell you--Peter Kirilych here will also tell you..." + +"Nonsense, I tell you. Your mother's milk has hardly dried on your +lips and you want to go into the army! There, there, I tell you," +and the count moved to go out of the room, taking the papers, probably +to reread them in his study before having a nap. + +"Well, Peter Kirilych, let's go and have a smoke," he said. + +Pierre was agitated and undecided. Natasha's unwontedly brilliant +eyes, continually glancing at him with a more than cordial look, had +reduced him to this condition. + +"No, I think I'll go home." + +"Home? Why, you meant to spend the evening with us.... You don't +often come nowadays as it is, and this girl of mine," said the count +good-naturedly, pointing to Natasha, "only brightens up when you're +here." + +"Yes, I had forgotten... I really must go home... business..." +said Pierre hurriedly. + +"Well, then, au revoir!" said the count, and went out of the room. + +"Why are you going? Why are you upset?" asked Natasha, and she +looked challengingly into Pierre's eyes. + +"Because I love you!" was what he wanted to say, but he did not +say it, and only blushed till the tears came, and lowered his eyes. + +"Because it is better for me to come less often... because... No, +simply I have business...." + +"Why? No, tell me!" Natasha began resolutely and suddenly stopped. + +They looked at each other with dismayed and embarrassed faces. He +tried to smile but could not: his smile expressed suffering, and he +silently kissed her hand and went out. + +Pierre made up his mind not to go to the Rostovs' any more. + + + + + +CHAPTER XXI + + +After the definite refusal he had received, Petya went to his room +and there locked himself in and wept bitterly. When he came in to tea, +silent, morose, and with tear-stained face, everybody pretended not to +notice anything. + +Next day the Emperor arrived in Moscow, and several of the +Rostovs' domestic serfs begged permission to go to have a look at him. +That morning Petya was a long time dressing and arranging his hair and +collar to look like a grown-up man. He frowned before his looking +glass, gesticulated, shrugged his shoulders, and finally, without +saying a word to anyone, took his cap and left the house by the back +door, trying to avoid notice. Petya decided to go straight to where +the Emperor was and to explain frankly to some gentleman-in-waiting +(he imagined the Emperor to be always surrounded by +gentlemen-in-waiting) that he, Count Rostov, in spite of his youth +wished to serve his country; that youth could be no hindrance to +loyalty, and that he was ready to... While dressing, Petya had +prepared many fine things he meant to say to the gentleman-in-waiting. + +It was on the very fact of being so young that Petya counted for +success in reaching the Emperor--he even thought how surprised +everyone would be at his youthfulness--and yet in the arrangement of +his collar and hair and by his sedate deliberate walk he wished to +appear a grown-up man. But the farther he went and the more his +attention was diverted by the ever-increasing crowds moving toward the +Kremlin, the less he remembered to walk with the sedateness and +deliberation of a man. As he approached the Kremlin he even began to +avoid being crushed and resolutely stuck out his elbows in a +menacing way. But within the Trinity Gateway he was so pressed to +the wall by people who probably were unaware of the patriotic +intentions with which he had come that in spite of all his +determination he had to give in, and stop while carriages passed in, +rumbling beneath the archway. Beside Petya stood a peasant woman, a +footman, two tradesmen, and a discharged soldier. After standing +some time in the gateway, Petya tried to move forward in front of +the others without waiting for all the carriages to pass, and he began +resolutely working his way with his elbows, but the woman just in +front of him, who was the first against whom he directed his +efforts, angrily shouted at him: + +"What are you shoving for, young lordling? Don't you see we're all +standing still? Then why push?" + +"Anybody can shove," said the footman, and also began working his +elbows to such effect that he pushed Petya into a very filthy corner +of the gateway. + +Petya wiped his perspiring face with his hands and pulled up the +damp collar which he had arranged so well at home to seem like a +man's. + +He felt that he no longer looked presentable, and feared that if +he were now to approach the gentlemen-in-waiting in that plight he +would not be admitted to the Emperor. But it was impossible to smarten +oneself up or move to another place, because of the crowd. One of +the generals who drove past was an acquaintance of the Rostovs', and +Petya thought of asking his help, but came to the conclusion that that +would not be a manly thing to do. When the carriages had all passed +in, the crowd, carrying Petya with it, streamed forward into the +Kremlin Square which was already full of people. There were people not +only in the square, but everywhere--on the slopes and on the roofs. As +soon as Petya found himself in the square he clearly heard the sound +of bells and the joyous voices of the crowd that filled the whole +Kremlin. + +For a while the crowd was less dense, but suddenly all heads were +bared, and everyone rushed forward in one direction. Petya was being +pressed so that he could scarcely breathe, and everybody shouted, +"Hurrah! hurrah! hurrah!" Petya stood on tiptoe and pushed and +pinched, but could see nothing except the people about him. + +All the faces bore the same expression of excitement and enthusiasm. +A tradesman's wife standing beside Petya sobbed, and the tears ran +down her cheeks. + +"Father! Angel! Dear one!" she kept repeating, wiping away her tears +with her fingers. + +"Hurrah!" was heard on all sides. + +For a moment the crowd stood still, but then it made another rush +forward. + +Quite beside himself, Petya, clinching his teeth and rolling his +eyes ferociously, pushed forward, elbowing his way and shouting +"hurrah!" as if he were prepared that instant to kill himself and +everyone else, but on both sides of him other people with similarly +ferocious faces pushed forward and everybody shouted "hurrah!" + +"So this is what the Emperor is!" thought Petya. "No, I can't +petition him myself--that would be too bold." But in spite of this +he continued to struggle desperately forward, and from between the +backs of those in front he caught glimpses of an open space with a +strip of red cloth spread out on it; but just then the crowd swayed +back--the police in front were pushing back those who had pressed +too close to the procession: the Emperor was passing from the palace +to the Cathedral of the Assumption--and Petya unexpectedly received +such a blow on his side and ribs and was squeezed so hard that +suddenly everything grew dim before his eyes and he lost +consciousness. When he came to himself, a man of clerical appearance +with a tuft of gray hair at the back of his head and wearing a +shabby blue cassock--probably a church clerk and chanter--was +holding him under the arm with one hand while warding off the pressure +of the crowd with the other. + +"You've crushed the young gentleman!" said the clerk. "What are +you up to? Gently!... They've crushed him, crushed him!" + +The Emperor entered the Cathedral of the Assumption. The crowd +spread out again more evenly, and the clerk led Petya--pale and +breathless--to the Tsar-cannon. Several people were sorry for Petya, +and suddenly a crowd turned toward him and pressed round him. Those +who stood nearest him attended to him, unbuttoned his coat, seated him +on the raised platform of the cannon, and reproached those others +(whoever they might be) who had crushed him. + +"One might easily get killed that way! What do they mean by it? +Killing people! Poor dear, he's as white as a sheet!"--various +voices were heard saying. + +Petya soon came to himself, the color returned to his face, the pain +had passed, and at the cost of that temporary unpleasantness he had +obtained a place by the cannon from where he hoped to see the +Emperor who would be returning that way. Petya no longer thought of +presenting his petition. If he could only see the Emperor he would +be happy! + +While the service was proceeding in the Cathedral of the Assumption- +it was a combined service of prayer on the occasion of the Emperor's +arrival and of thanksgiving for the conclusion of peace with the +Turks--the crowd outside spread out and hawkers appeared, selling +kvas, gingerbread, and poppyseed sweets (of which Petya was +particularly fond), and ordinary conversation could again be heard. +A tradesman's wife was showing a rent in her shawl and telling how +much the shawl had cost; another was saying that all silk goods had +now got dear. The clerk who had rescued Petya was talking to a +functionary about the priests who were officiating that day with the +bishop. The clerk several times used the word "plenary" (of the +service), a word Petya did not understand. Two young citizens were +joking with some serf girls who were cracking nuts. All these +conversations, especially the joking with the girls, were such as +might have had a particular charm for Petya at his age, but they did +not interest him now. He sat on his elevation--the pedestal of the +cannon--still agitated as before by the thought of the Emperor and +by his love for him. The feeling of pain and fear he had experienced +when he was being crushed, together with that of rapture, still +further intensified his sense of the importance of the occasion. + +Suddenly the sound of a firing of cannon was heard from the +embankment, to celebrate the signing of peace with the Turks, and +the crowd rushed impetuously toward the embankment to watch the +firing. Petya too would have run there, but the clerk who had taken +the young gentleman under his protection stopped him. The firing was +still proceeding when officers, generals, and gentlemen-in-waiting +came running out of the cathedral, and after them others in a more +leisurely manner: caps were again raised, and those who had run to +look at the cannon ran back again. At last four men in uniforms and +sashes emerged from the cathedral doors. "Hurrah! hurrah!" shouted the +crowd again. + +"Which is he? Which?" asked Petya in a tearful voice, of those +around him, but no one answered him, everybody was too excited; and +Petya, fixing on one of those four men, whom he could not clearly +see for the tears of joy that filled his eyes, concentrated all his +enthusiasm on him--though it happened not to be the Emperor- +frantically shouted "Hurrah!" and resolved that tomorrow, come what +might, he would join the army. + +The crowd ran after the Emperor, followed him to the palace, and +began to disperse. It was already late, and Petya had not eaten +anything and was drenched with perspiration, yet he did not go home +but stood with that diminishing, but still considerable, crowd +before the palace while the Emperor dined--looking in at the palace +windows, expecting he knew not what, and envying alike the notables he +saw arriving at the entrance to dine with the Emperor and the court +footmen who served at table, glimpses of whom could be seen through +the windows. + +While the Emperor was dining, Valuev, looking out of the window, +said: + +"The people are still hoping to see Your Majesty again." + +The dinner was nearly over, and the Emperor, munching a biscuit, +rose and went out onto the balcony. The people, with Petya among them, +rushed toward the balcony. + +"Angel! Dear one! Hurrah! Father!..." cried the crowd, and Petya +with it, and again the women and men of weaker mold, Petya among them, +wept with joy. + +A largish piece of the biscuit the Emperor was holding in his hand +broke off, fell on the balcony parapet, and then to the ground. A +coachman in a jerkin, who stood nearest, sprang forward and snatched +it up. Several people in the crowd rushed at the coachman. Seeing this +the Emperor had a plateful of biscuits brought him and began +throwing them down from the balcony. Petya's eyes grew bloodshot, +and still more excited by the danger of being crushed, he rushed at +the biscuits. He did not know why, but he had to have a biscuit from +the Tsar's hand and he felt that he must not give way. He sprang +forward and upset an old woman who was catching at a biscuit; the +old woman did not consider herself defeated though she was lying on +the ground--she grabbed at some biscuits but her hand did not reach +them. Petya pushed her hand away with his knee, seized a biscuit, +and as if fearing to be too late, again shouted "Hurrah!" with a voice +already hoarse. + +The Emperor went in, and after that the greater part of the crowd +began to disperse. + +"There! I said if only we waited--and so it was!" was being joyfully +said by various people. + +Happy as Petya was, he felt sad at having to go home knowing that +all the enjoyment of that day was over. He did not go straight home +from the Kremlin, but called on his friend Obolenski, who was +fifteen and was also entering the regiment. On returning home Petya +announced resolutely and firmly that if he was not allowed to enter +the service he would run away. And next day, Count Ilya Rostov--though +he had not yet quite yielded--went to inquire how he could arrange for +Petya to serve where there would be least danger. + + + + + +CHAPTER XXII + + +Two days later, on the fifteenth of July, an immense number of +carriages were standing outside the Sloboda Palace. + +The great halls were full. In the first were the nobility and gentry +in their uniforms, in the second bearded merchants in full-skirted +coats of blue cloth and wearing medals. In the noblemen's hall there +was an incessant movement and buzz of voices. The chief magnates sat +on high-backed chairs at a large table under the portrait of the +Emperor, but most of the gentry were strolling about the room. + +All these nobles, whom Pierre met every day at the Club or in +their own houses, were in uniform--some in that of Catherine's day, +others in that of Emperor Paul, others again in the new uniforms of +Alexander's time or the ordinary uniform of the nobility, and the +general characteristic of being in uniform imparted something +strange and fantastic to these diverse and familiar personalities, +both old and young. The old men, dim-eyed, toothless, bald, sallow, +and bloated, or gaunt and wrinkled, were especially striking. For +the most part they sat quietly in their places and were silent, or, if +they walked about and talked, attached themselves to someone +younger. On all these faces, as on the faces of the crowd Petya had +seen in the Square, there was a striking contradiction: the general +expectation of a solemn event, and at the same time the everyday +interests in a boston card party, Peter the cook, Zinaida Dmitrievna's +health, and so on. + +Pierre was there too, buttoned up since early morning in a +nobleman's uniform that had become too tight for him. He was agitated; +this extraordinary gathering not only of nobles but also of the +merchant-class--les etats generaux (States-General)--evoked in him a +whole series of ideas he had long laid aside but which were deeply +graven in his soul: thoughts of the Contrat social and the French +Revolution. The words that had struck him in the Emperor's appeal- +that the sovereign was coming to the capital for consultation with his +people--strengthened this idea. And imagining that in this direction +something important which he had long awaited was drawing near, he +strolled about watching and listening to conversations, but nowhere +finding any confirmation of the ideas that occupied him. + +The Emperor's manifesto was read, evoking enthusiasm, and then all +moved about discussing it. Besides the ordinary topics of +conversation, Pierre heard questions of where the marshals of the +nobility were to stand when the Emperor entered, when a ball should be +given in the Emperor's honor, whether they should group themselves +by districts or by whole provinces... and so on; but as soon as the +war was touched on, or what the nobility had been convened for, the +talk became undecided and indefinite. Then all preferred listening +to speaking. + +A middle-aged man, handsome and virile, in the uniform of a +retired naval officer, was speaking in one of the rooms, and a small +crowd was pressing round him. Pierre went up to the circle that had +formed round the speaker and listened. Count Ilya Rostov, in a +military uniform of Catherine's time, was sauntering with a pleasant +smile among the crowd, with all of whom he was acquainted. He too +approached that group and listened with a kindly smile and nods of +approval, as he always did, to what the speaker was saying. The +retired naval man was speaking very boldly, as was evident from the +expression on the faces of the listeners and from the fact that some +people Pierre knew as the meekest and quietest of men walked away +disapprovingly or expressed disagreement with him. Pierre pushed his +way into the middle of the group, listened, and convinced himself that +the man was indeed a liberal, but of views quite different from his +own. The naval officer spoke in a particularly sonorous, musical, +and aristocratic baritone voice, pleasantly swallowing his r's and +generally slurring his consonants: the voice of a man calling out to +his servant, "Heah! Bwing me my pipe!" It was indicative of +dissipation and the exercise of authority. + +"What if the Smolensk people have offahd to waise militia for the +Empewah? Ah we to take Smolensk as our patte'n? If the noble +awistocwacy of the pwovince of Moscow thinks fit, it can show its +loyalty to our sov'weign the Empewah in other ways. Have we +fo'gotten the waising of the militia in the yeah 'seven? All that +did was to enwich the pwiests' sons and thieves and wobbahs...." + +Count Ilya Rostov smiled blandly and nodded approval. + +"And was our militia of any use to the Empia? Not at all! It only +wuined our farming! Bettah have another conscwiption... o' ou' men +will wetu'n neithah soldiers no' peasants, and we'll get only +depwavity fwom them. The nobility don't gwudge theah lives--evewy +one of us will go and bwing in more wecwuits, and the sov'weign" (that +was the way he referred to the Emperor) "need only say the word and +we'll all die fo' him!" added the orator with animation. + +Count Rostov's mouth watered with pleasure and he nudged Pierre, but +Pierre wanted to speak himself. He pushed forward, feeling stirred, +but not yet sure what stirred him or what he would say. Scarcely had +he opened his mouth when one of the senators, a man without a tooth in +his head, with a shrewd though angry expression, standing near the +first speaker, interrupted him. Evidently accustomed to managing +debates and to maintaining an argument, he began in low but distinct +tones: + +"I imagine, sir," said he, mumbling with his toothless mouth, +"that we have been summoned here not to discuss whether it's best +for the empire at the present moment to adopt conscription or to +call out the militia. We have been summoned to reply to the appeal +with which our sovereign the Emperor has honored us. But to judge what +is best--conscription or the militia--we can leave to the supreme +authority...." + +Pierre suddenly saw an outlet for his excitement. He hardened his +heart against the senator who was introducing this set and narrow +attitude into the deliberations of the nobility. Pierre stepped +forward and interrupted him. He himself did not yet know what he would +say, but he began to speak eagerly, occasionally lapsing into French +or expressing himself in bookish Russian. + +"Excuse me, your excellency," he began. (He was well acquainted with +the senator, but thought it necessary on this occasion to address +him formally.) "Though I don't agree with the gentleman..." (he +hesitated: he wished to say, "Mon tres honorable preopinant"--"My very +honorable opponent") "with the gentleman... whom I have not the +honor of knowing, I suppose that the nobility have been summoned not +merely to express their sympathy and enthusiasm but also to consider +the means by which we can assist our Fatherland! I imagine," he went +on, warming to his subject, "that the Emperor himself would not be +satisfied to find in us merely owners of serfs whom we are willing +to devote to his service, and chair a canon* we are ready to make of +ourselves--and not to obtain from us any co-co-counsel." + + +*"Food for cannon." + + +Many persons withdrew from the circle, noticing the senator's +sarcastic smile and the freedom of Pierre's remarks. Only Count Rostov +was pleased with them as he had been pleased with those of the naval +officer, the senator, and in general with whatever speech he had +last heard. + +"I think that before discussing these questions," Pierre +continued, "we should ask the Emperor--most respectfully ask His +Majesty--to let us know the number of our troops and the position in +which our army and our forces now are, and then..." + +But scarcely had Pierre uttered these words before he was attacked +from three sides. The most vigorous attack came from an old +acquaintance, a boston player who had always been well disposed toward +him, Stepan Stepanovich Adraksin. Adraksin was in uniform, and whether +as a result of the uniform or from some other cause Pierre saw +before him quite a different man. With a sudden expression of +malevolence on his aged face, Adraksin shouted at Pierre: + +"In the first place, I tell you we have no right to question the +Emperor about that, and secondly, if the Russian nobility had that +right, the Emperor could not answer such a question. The troops are +moved according to the enemy's movements and the number of men +increases and decreases..." + +Another voice, that of a nobleman of medium height and about forty +years of age, whom Pierre had formerly met at the gypsies' and knew as +a bad cardplayer, and who, also transformed by his uniform, came up to +Pierre, interrupted Adraksin. + +"Yes, and this is not a time for discussing," he continued, "but for +acting: there is war in Russia! The enemy is advancing to destroy +Russia, to desecrate the tombs of our fathers, to carry off our +wives and children." The nobleman smote his breast. "We will all +arise, every one of us will go, for our father the Tsar!" he +shouted, rolling his bloodshot eyes. Several approving voices were +heard in the crowd. "We are Russians and will not grudge our blood +in defense of our faith, the throne, and the Fatherland! We must cease +raving if we are sons of our Fatherland! We will show Europe how +Russia rises to the defense of Russia!" + +Pierre wished to reply, but could not get in a word. He felt that +his words, apart from what meaning they conveyed, were less audible +than the sound of his opponent's voice. + +Count Rostov at the back of the crowd was expressing approval; +several persons, briskly turning a shoulder to the orator at the end +of a phrase, said: + +"That's right, quite right! Just so!" + +Pierre wished to say that he was ready to sacrifice his money, his +serfs, or himself, only one ought to know the state of affairs in +order to be able to improve it, but he was unable to speak. Many +voices shouted and talked at the same time, so that Count Rostov had +not time to signify his approval of them all, and the group increased, +dispersed, re-formed, and then moved with a hum of talk into the +largest hall and to the big table. Not only was Pierre's attempt to +speak unsuccessful, but he was rudely interrupted, pushed aside, and +people turned away from him as from a common enemy. This happened +not because they were displeased by the substance of his speech, which +had even been forgotten after the many subsequent speeches, but to +animate it the crowd needed a tangible object to love and a tangible +object to hate. Pierre became the latter. Many other orators spoke +after the excited nobleman, and all in the same tone. Many spoke +eloquently and with originality. + +Glinka, the editor of the Russian Messenger, who was recognized +(cries of "author! author!" were heard in the crowd), said that +"hell must be repulsed by hell," and that he had seen a child +smiling at lightning flashes and thunderclaps, but "we will not be +that child." + +"Yes, yes, at thunderclaps!" was repeated approvingly in the back +rows of the crowd. + +The crowd drew up to the large table, at which sat gray-haired or +bald seventy-year-old magnates, uniformed and besashed almost all of +whom Pierre had seen in their own homes with their buffoons, or +playing boston at the clubs. With an incessant hum of voices the crowd +advanced to the table. Pressed by the throng against the high backs of +the chairs, the orators spoke one after another and sometimes two +together. Those standing behind noticed what a speaker omitted to +say and hastened to supply it. Others in that heat and crush racked +their brains to find some thought and hastened to utter it. The old +magnates, whom Pierre knew, sat and turned to look first at one and +then at another, and their faces for the most part only expressed +the fact that they found it very hot. Pierre, however, felt excited, +and the general desire to show that they were ready to go to all +lengths--which found expression in the tones and looks more than in +the substance of the speeches--infected him too. He did not renounce +his opinions, but felt himself in some way to blame and wished to +justify himself. + +"I only said that it would be more to the purpose to make sacrifices +when we know what is needed!" said he, trying to be heard above the +other voices. + +One of the old men nearest to him looked round, but his attention +was immediately diverted by an exclamation at the other side of the +table. + +"Yes, Moscow will be surrendered! She will be our expiation!" +shouted one man. + +"He is the enemy of mankind!" cried another. "Allow me to speak...." +"Gentlemen, you are crushing me!..." + + + + + +CHAPTER XXIII + + +At that moment Count Rostopchin with his protruding chin and alert +eyes, wearing the uniform of a general with sash over his shoulder, +entered the room, stepping briskly to the front of the crowd of +gentry. + +"Our sovereign the Emperor will be here in a moment," said +Rostopchin. "I am straight from the palace. Seeing the position we are +in, I think there is little need for discussion. The Emperor has +deigned to summon us and the merchants. Millions will pour forth +from there"--he pointed to the merchants' hall--"but our business is +to supply men and not spare ourselves... That is the least we can do!" + +A conference took place confined to the magnates sitting at the +table. The whole consultation passed more than quietly. After all +the preceding noise the sound of their old voices saying one after +another, "I agree," or for variety, "I too am of that opinion," and so +on had even a mournful effect. + +The secretary was told to write down the resolution of the Moscow +nobility and gentry, that they would furnish ten men, fully +equipped, out of every thousand serfs, as the Smolensk gentry had +done. Their chairs made a scraping noise as the gentlemen who had +conferred rose with apparent relief, and began walking up and down, +arm in arm, to stretch their legs and converse in couples. + +"The Emperor! The Emperor!" a sudden cry resounded through the halls +and the whole throng hurried to the entrance. + +The Emperor entered the hall through a broad path between two +lines of nobles. Every face expressed respectful, awe-struck +curiosity. Pierre stood rather far off and could not hear all that the +Emperor said. From what he did hear he understood that the Emperor +spoke of the danger threatening the empire and of the hopes he +placed on the Moscow nobility. He was answered by a voice which +informed him of the resolution just arrived at. + +"Gentlemen!" said the Emperor with a quivering voice. + +There was a rustling among the crowd and it again subsided, so +that Pierre distinctly heard the pleasantly human voice of the Emperor +saying with emotion: + +"I never doubted the devotion of the Russian nobles, but today it +has surpassed my expectations. I thank you in the name of the +Fatherland! Gentlemen, let us act! Time is most precious..." + +The Emperor ceased speaking, the crowd began pressing round him, and +rapturous exclamations were heard from all sides. + +"Yes, most precious... a royal word," said Count Rostov, with a sob. +He stood at the back, and, though he had heard hardly anything, +understood everything in his own way. + +From the hall of the nobility the Emperor went to that of the +merchants. There he remained about ten minutes. Pierre was among those +who saw him come out from the merchants' hall with tears of emotion in +his eyes. As became known later, he had scarcely begun to address +the merchants before tears gushed from his eyes and he concluded in +a trembling voice. When Pierre saw the Emperor he was coming out +accompanied by two merchants, one of whom Pierre knew, a fat +otkupshchik. The other was the mayor, a man with a thin sallow face +and narrow beard. Both were weeping. Tears filled the thin man's eyes, +and the fat otkupshchik sobbed outright like a child and kept +repeating: + +"Our lives and property--take them, Your Majesty!" + +Pierre's one feeling at the moment was a desire to show that he +was ready to go all lengths and was prepared to sacrifice +everything. He now felt ashamed of his speech with its +constitutional tendency and sought an opportunity of effacing it. +Having heard that Count Mamonov was furnishing a regiment, Bezukhov at +once informed Rostopchin that he would give a thousand men and their +maintenance. + +Old Rostov could not tell his wife of what had passed without tears, +and at once consented to Petya's request and went himself to enter his +name. + +Next day the Emperor left Moscow. The assembled nobles all took +off their uniforms and settled down again in their homes and clubs, +and not without some groans gave orders to their stewards about the +enrollment, feeling amazed themselves at what they had done. + + + + + +BOOK TEN: 1812 + + + + + +CHAPTER I + + +Napoleon began the war with Russia because he could not resist going +to Dresden, could not help having his head turned by the homage he +received, could not help donning a Polish uniform and yielding to +the stimulating influence of a June morning, and could not refrain +from bursts of anger in the presence of Kurakin and then of Balashev. + +Alexander refused negotiations because he felt himself to be +personally insulted. Barclay de Tolly tried to command the army in the +best way, because he wished to fulfill his duty and earn fame as a +great commander. Rostov charged the French because he could not +restrain his wish for a gallop across a level field; and in the same +way the innumerable people who took part in the war acted in accord +with their personal characteristics, habits, circumstances, and +aims. They were moved by fear or vanity, rejoiced or were indignant, +reasoned, imagining that they knew what they were doing and did it +of their own free will, but they all were involuntary tools of +history, carrying on a work concealed from them but comprehensible +to us. Such is the inevitable fate of men of action, and the higher +they stand in the social hierarchy the less are they free. + +The actors of 1812 have long since left the stage, their personal +interests have vanished leaving no trace, and nothing remains of +that time but its historic results. + +Providence compelled all these men, striving to attain personal +aims, to further the accomplishment of a stupendous result no one of +them at all expected--neither Napoleon, nor Alexander, nor still +less any of those who did the actual fighting. + +The cause of the destruction of the French army in 1812 is clear +to us now. No one will deny that that cause was, on the one hand, +its advance into the heart of Russia late in the season without any +preparation for a winter campaign and, on the other, the character +given to the war by the burning of Russian towns and the hatred of the +foe this aroused among the Russian people. But no one at the time +foresaw (what now seems so evident) that this was the only way an army +of eight hundred thousand men--the best in the world and led by the +best general--could be destroyed in conflict with a raw army of half +its numerical strength, and led by inexperienced commanders as the +Russian army was. Not only did no one see this, but on the Russian +side every effort was made to hinder the only thing that could save +Russia, while on the French side, despite Napoleon's experience and +so-called military genius, every effort was directed to pushing on +to Moscow at the end of the summer, that is, to doing the very thing +that was bound to lead to destruction. + +In historical works on the year 1812 French writers are very fond of +saying that Napoleon felt the danger of extending his line, that he +sought a battle and that his marshals advised him to stop at Smolensk, +and of making similar statements to show that the danger of the +campaign was even then understood. Russian authors are still fonder of +telling us that from the commencement of the campaign a Scythian war +plan was adopted to lure Napoleon into the depths of Russia, and +this plan some of them attribute to Pfuel, others to a certain +Frenchman, others to Toll, and others again to Alexander himself- +pointing to notes, projects, and letters which contain hints of such a + +line of action. But all these hints at what happened, both from the +French side and the Russian, are advanced only because they fit in +with the event. Had that event not occurred these hints would have +been forgotten, as we have forgotten the thousands and millions of +hints and expectations to the contrary which were current then but +have now been forgotten because the event falsified them. There are +always so many conjectures as to the issue of any event that however +it may end there will always be people to say: "I said then that it +would be so," quite forgetting that amid their innumerable conjectures +many were to quite the contrary effect. + +Conjectures as to Napoleon's awareness of the danger of extending +his line, and (on the Russian side) as to luring the enemy into the +depths of Russia, are evidently of that kind, and only by much +straining can historians attribute such conceptions to Napoleon and +his marshals, or such plans to the Russian commanders. All the facts +are in flat contradiction to such conjectures. During the whole period +of the war not only was there no wish on the Russian side to draw +the French into the heart of the country, but from their first entry +into Russia everything was done to stop them. And not only was +Napoleon not afraid to extend his line, but he welcomed every step +forward as a triumph and did not seek battle as eagerly as in former +campaigns, but very lazily. + +At the very beginning of the war our armies were divided, and our +sole aim was to unite them, though uniting the armies was no advantage +if we meant to retire and lure the enemy into the depths of the +country. Our Emperor joined the army to encourage it to defend every +inch of Russian soil and not to retreat. The enormous Drissa camp +was formed on Pfuel's plan, and there was no intention of retiring +farther. The Emperor reproached the commanders in chief for every step +they retired. He could not bear the idea of letting the enemy even +reach Smolensk, still less could he contemplate the burning of Moscow, +and when our armies did unite he was displeased that Smolensk was +abandoned and burned without a general engagement having been fought +under its walls. + +So thought the Emperor, and the Russian commanders and people were +still more provoked at the thought that our forces were retreating +into the depths of the country. + +Napoleon having cut our armies apart advanced far into the country +and missed several chances of forcing an engagement. In August he +was at Smolensk and thought only of how to advance farther, though +as we now see that advance was evidently ruinous to him. + +The facts clearly show that Napoleon did not foresee the danger of +the advance on Moscow, nor did Alexander and the Russian commanders +then think of luring Napoleon on, but quite the contrary. The luring +of Napoleon into the depths of the country was not the result of any +plan, for no one believed it to be possible; it resulted from a most +complex interplay of intrigues, aims, and wishes among those who +took part in the war and had no perception whatever of the inevitable, +or of the one way of saving Russia. Everything came about +fortuitously. The armies were divided at the commencement of the +campaign. We tried to unite them, with the evident intention of giving +battle and checking the enemy's advance, and by this effort to unite +them while avoiding battle with a much stronger enemy, and necessarily +withdrawing the armies at an acute angle--we led the French on to +Smolensk. But we withdrew at an acute angle not only because the +French advanced between our two armies; the angle became still more +acute and we withdrew still farther, because Barclay de Tolly was an +unpopular foreigner disliked by Bagration (who would come his +command), and Bagration--being in command of the second army--tried to +postpone joining up and coming under Barclay's command as long as he +could. Bagration was slow in effecting the junction--though that was +the chief aim of all at headquarters--because, as he alleged, he +exposed his army to danger on this march, and it was best for him to +retire more to the left and more to the south, worrying the enemy from +flank and rear and securing from the Ukraine recruits for his army; +and it looks as if he planned this in order not to come under the +command of the detested foreigner Barclay, whose rank was inferior +to his own. + +The Emperor was with the army to encourage it, but his presence +and ignorance of what steps to take, and the enormous number of +advisers and plans, destroyed the first army's energy and it retired. + +The intention was to make a stand at the Drissa camp, but +Paulucci, aiming at becoming commander in chief, unexpectedly employed +his energy to influence Alexander, and Pfuel's whole plan was +abandoned and the command entrusted to Barclay. But as Barclay did not +inspire confidence his power was limited. The armies were divided, +there was no unity of command, and Barclay was unpopular; but from +this confusion, division, and the unpopularity of the foreign +commander in chief, there resulted on the one hand indecision and +the avoidance of a battle (which we could not have refrained from +had the armies been united and had someone else, instead of Barclay, +been in command) and on the other an ever-increasing indignation +against the foreigners and an increase in patriotic zeal. + +At last the Emperor left the army, and as the most convenient and +indeed the only pretext for his departure it was decided that it was +necessary for him to inspire the people in the capitals and arouse the +nation in general to a patriotic war. And by this visit of the Emperor +to Moscow the strength of the Russian army was trebled. + +He left in order not to obstruct the commander in chief's +undivided control of the army, and hoping that more decisive action +would then be taken, but the command of the armies became still more +confused and enfeebled. Bennigsen, the Tsarevich, and a swarm of +adjutants general remained with the army to keep the commander in +chief under observation and arouse his energy, and Barclay, feeling +less free than ever under the observation of all these "eyes of the +Emperor," became still more cautious of undertaking any decisive +action and avoided giving battle. + +Barclay stood for caution. The Tsarevich hinted at treachery and +demanded a general engagement. Lubomirski, Bronnitski, Wlocki, and the +others of that group stirred up so much trouble that Barclay, under +pretext of sending papers to the Emperor, dispatched these Polish +adjutants general to Petersburg and plunged into an open struggle with +Bennigsen and the Tsarevich. + +At Smolensk the armies at last reunited, much as Bagration +disliked it. + +Bagration drove up in a carriage to to the house occupied by +Barclay. Barclay donned his sash and came out to meet and report to +his senior officer Bagration. + +Despite his seniority in rank Bagration, in this contest of +magnanimity, took his orders from Barclay, but, having submitted, +agreed with him less than ever. By the Emperor's orders Bagration +reported direct to him. He wrote to Arakcheev, the Emperor's +confidant: "It must be as my sovereign pleases, but I cannot work with +the Minister (meaning Barclay). For God's sake send me somewhere +else if only in command of a regiment. I cannot stand it here. +Headquarters are so full of Germans that a Russian cannot exist and +there is no sense in anything. I thought I was really serving my +sovereign and the Fatherland, but it turns out that I am serving +Barclay. I confess I do not want to." + +The swarm of Bronnitskis and Wintzingerodes and their like still +further embittered the relations between the commanders in chief, +and even less unity resulted. Preparations were made to fight the +French before Smolensk. A general was sent to survey the position. +This general, hating Barclay, rode to visit a friend of his own, a +corps commander, and, having spent the day with him, returned to +Barclay and condemned, as unsuitable from every point of view, the +battleground he had not seen. + +While disputes and intrigues were going on about the future field of +battle, and while we were looking for the French--having lost touch +with them--the French stumbled upon Neverovski's division and +reached the walls of Smolensk. + +It was necessary to fight an unexpected battle at Smolensk to save +our lines of communication. The battle was fought and thousands were +killed on both sides. + +Smolensk was abandoned contrary to the wishes of the Emperor and +of the whole people. But Smolensk was burned by its own +inhabitants-who had been misled by their governor. And these ruined +inhabitants, setting an example to other Russians, went to Moscow +thinking only of their own losses but kindling hatred of the foe. +Napoleon advanced farther and we retired, thus arriving at the very +result which caused his destruction. + + + + + +CHAPTER II + + +The day after his son had left, Prince Nicholas sent for Princess +Mary to come to his study. + +"Well? Are you satisfied now?" said he. "You've made me quarrel with +my son! Satisfied, are you? That's all you wanted! Satisfied?... It +hurts me, it hurts. I'm old and weak and this is what you wanted. Well +then, gloat over it! Gloat over it!" + +After that Princess Mary did not see her father for a whole week. He +was ill and did not leave his study. + +Princess Mary noticed to her surprise that during this illness the +old prince not only excluded her from his room, but did not admit +Mademoiselle Bourienne either. Tikhon alone attended him. + +At the end of the week the prince reappeared and resumed his +former way of life, devoting himself with special activity to building +operations and the arrangement of the gardens and completely +breaking off his relations with Mademoiselle Bourienne. His looks +and cold tone to his daughter seemed to say: "There, you see? You +plotted against me, you lied to Prince Andrew about my relations +with that Frenchwoman and made me quarrel with him, but you see I need +neither her nor you!" + +Princess Mary spent half of every day with little Nicholas, watching +his lessons, teaching him Russian and music herself, and talking to +Dessalles; the rest of the day she spent over her books, with her +old nurse, or with "God's folk" who sometimes came by the back door to +see her. + +Of the war Princess Mary thought as women do think about wars. She +feared for her brother who was in it, was horrified by and amazed at +the strange cruelty that impels men to kill one another, but she did +not understand the significance of this war, which seemed to her +like all previous wars. She did not realize the significance of this +war, though Dessalles with whom she constantly conversed was +passionately interested in its progress and tried to explain his own +conception of it to her, and though the "God's folk" who came to see +her reported, in their own way, the rumors current among the people of +an invasion by Antichrist, and though Julie (now Princess +Drubetskaya), who had resumed correspondence with her, wrote patriotic +letters from Moscow. + +"I write you in Russian, my good friend," wrote Julie in her +Frenchified Russian, "because I have a detestation for all the French, +and the same for their language which I cannot support to hear +spoken.... We in Moscow are elated by enthusiasm for our adored +Emperor. + +"My poor husband is enduring pains and hunger in Jewish taverns, but +the news which I have inspires me yet more. + +"You heard probably of the heroic exploit of Raevski, embracing +his two sons and saying: 'I will perish with them but we will not be +shaken!' And truly though the enemy was twice stronger than we, we +were unshakable. We pass the time as we can, but in war as in war! The +princesses Aline and Sophie sit whole days with me, and we, unhappy +widows of live men, make beautiful conversations over our charpie, +only you, my friend, are missing..." and so on. + +The chief reason Princess Mary did not realize the full significance +of this war was that the old prince never spoke of it, did not +recognize it, and laughed at Dessalles when he mentioned it at dinner. +The prince's tone was so calm and confident that Princess Mary +unhesitatingly believed him. + +All that July the old prince was exceedingly active and even +animated. He planned another garden and began a new building for the +domestic serfs. The only thing that made Princess Mary anxious about +him was that he slept very little and, instead of sleeping in his +study as usual, changed his sleeping place every day. One day he would +order his camp bed to be set up in the glass gallery, another day he +remained on the couch or on the lounge chair in the drawing room and +dozed there without undressing, while--instead of Mademoiselle +Bourienne--a serf boy read to him. Then again he would spend a night +in the dining room. + +On August 1, a second letter was received from Prince Andrew. In his +first letter which came soon after he had left home, Prince Andrew had +dutifully asked his father's forgiveness for what he had allowed +himself to say and begged to be restored to his favor. To this +letter the old prince had replied affectionately, and from that time +had kept the Frenchwoman at a distance. Prince Andrew's second letter, +written near Vitebsk after the French had occupied that town, gave a +brief account of the whole campaign, enclosed for them a plan he had +drawn and forecasts as to the further progress of the war. In this +letter Prince Andrew pointed out to his father the danger of staying +at Bald Hills, so near the theater of war and on the army's direct +line of march, and advised him to move to Moscow. + +At dinner that day, on Dessalles' mentioning that the French were +said to have already entered Vitebsk, the old prince remembered his +son's letter. + +"There was a letter from Prince Andrew today," he said to Princess +Mary--"Haven't you read it?" + +"No, Father," she replied in a frightened voice. + +She could not have read the letter as she did not even know it had +arrived. + +"He writes about this war," said the prince, with the ironic smile +that had become habitual to him in speaking of the present war. + +"That must be very interesting," said Dessalles. "Prince Andrew is +in a position to know..." + +"Oh, very interesting!" said Mademoiselle Bourienne. + +"Go and get it for me," said the old prince to Mademoiselle +Bourienne. "You know--under the paperweight on the little table." + +Mademoiselle Bourienne jumped up eagerly. + +"No, don't!" he exclaimed with a frown. "You go, Michael Ivanovich." + +Michael Ivanovich rose and went to the study. But as soon as he +had left the room the old prince, looking uneasily round, threw down +his napkin and went himself. + +"They can't do anything... always make some muddle," he muttered. + +While he was away Princess Mary, Dessalles, Mademoiselle +Bourienne, and even little Nicholas exchanged looks in silence. The +old prince returned with quick steps, accompanied by Michael +Ivanovich, bringing the letter and a plan. These he put down beside +him--not letting anyone read them at dinner. + +On moving to the drawing room he handed the letter to Princess +Mary and, spreading out before him the plan of the new building and +fixing his eyes upon it, told her to read the letter aloud. When she +had done so Princess Mary looked inquiringly at her father. He was +examining the plan, evidently engrossed in his own ideas. + +"What do you think of it, Prince?" Dessalles ventured to ask. + +"I? I?..." said the prince as if unpleasantly awakened, and not +taking his eyes from the plan of the building. + +"Very possibly the theater of war will move so near to us that..." + +"Ha ha ha! The theater of war!" said the prince. "I have said and +still say that the theater of war is Poland and the enemy will never +get beyond the Niemen." + +Dessalles looked in amazement at the prince, who was talking of +the Niemen when the enemy was already at the Dnieper, but Princess +Mary, forgetting the geographical position of the Niemen, thought that +what her father was saying was correct. + +"When the snow melts they'll sink in the Polish swamps. Only they +could fail to see it," the prince continued, evidently thinking of the +campaign of 1807 which seemed to him so recent. "Bennigsen should have +advanced into Prussia sooner, then things would have taken a different +turn..." + +"But, Prince," Dessalles began timidly, "the letter mentions +Vitebsk...." + +"Ah, the letter? Yes..." replied the prince peevishly. "Yes... +yes..." His face suddenly took on a morose expression. He paused. +"Yes, he writes that the French were beaten at... at... what river +is it?" + +Dessalles dropped his eyes. + +"The prince says nothing about that," he remarked gently. + +"Doesn't he? But I didn't invent it myself." + +No one spoke for a long time. + +"Yes... yes... Well, Michael Ivanovich," he suddenly went on, +raising his head and pointing to the plan of the building, "tell me +how you mean to alter it...." + +Michael Ivanovich went up to the plan, and the prince after speaking +to him about the building looked angrily at Princess Mary and +Dessalles and went to his own room. + +Princess Mary saw Dessalles' embarrassed and astonished look fixed +on her father, noticed his silence, and was struck by the fact that +her father had forgotten his son's letter on the drawing-room table; +but she was not only afraid to speak of it and ask Dessalles the +reason of his confusion and silence, but was afraid even to think +about it. + +In the evening Michael Ivanovich, sent by the prince, came to +Princess Mary for Prince Andrew's letter which had been forgotten in +the drawing room. She gave it to him and, unpleasant as it was to +her to do so, ventured to ask him what her father was doing. + +"Always busy," replied Michael Ivanovich with a respectfully +ironic smile which caused Princess Mary to turn pale. "He's worrying +very much about the new building. He has been reading a little, but +now"--Michael Ivanovich went on, lowering his voice--"now he's at +his desk, busy with his will, I expect." (One of the prince's favorite +occupations of late had been the preparation of some papers he meant +to leave at his death and which he called his "will.") + +"And Alpatych is being sent to Smolensk?" asked Princess Mary. + +"Oh, yes, he has been waiting to start for some time." + + + + + +CHAPTER III + + +When Michael Ivanovich returned to the study with the letter, the +old prince, with spectacles on and a shade over his eyes, was +sitting at his open bureau with screened candles, holding a paper in +his outstretched hand, and in a somewhat dramatic attitude was reading +his manuscript--his "Remarks" as he termed it--which was to be +transmitted to the Emperor after his death. + +When Michael Ivanovich went in there were tears in the prince's eyes +evoked by the memory of the time when the paper he was now reading had +been written. He took the letter from Michael Ivanovich's hand, put it +in his pocket, folded up his papers, and called in Alpatych who had +long been waiting. + +The prince had a list of things to be bought in Smolensk and, +walking up and down the room past Alpatych who stood by the door, he +gave his instructions. + +"First, notepaper--do you hear? Eight quires, like this sample, +gilt-edged... it must be exactly like the sample. Varnish, sealing +wax, as in Michael Ivanovich's list." + +He paced up and down for a while and glanced at his notes. + +"Then hand to the governor in person a letter about the deed." + +Next, bolts for the doors of the new building were wanted and had to +be of a special shape the prince had himself designed, and a leather +case had to be ordered to keep the "will" in. + +The instructions to Alpatych took over two hours and still the +prince did not let him go. He sat down, sank into thought, closed +his eyes, and dozed off. Alpatych made a slight movement. + +"Well, go, go! If anything more is wanted I'll send after you." + +Alpatych went out. The prince again went to his bureau, glanced into +it, fingered his papers, closed the bureau again, and sat down at +the table to write to the governor. + +It was already late when he rose after sealing the letter. He wished +to sleep, but he knew he would not be able to and that most depressing +thoughts came to him in bed. So he called Tikhon and went through +the rooms with him to show him where to set up the bed for that night. + +He went about looking at every corner. Every place seemed +unsatisfactory, but worst of all was his customary couch in the study. +That couch was dreadful to him, probably because of the oppressive +thoughts he had had when lying there. It was unsatisfactory +everywhere, but the corner behind the piano in the sitting room was +better than other places: he had never slept there yet. + +With the help of a footman Tikhon brought in the bedstead and +began putting it up. + +"That's not right! That's not right!" cried the prince, and +himself pushed it a few inches from the corner and then closer in +again. + +"Well, at last I've finished, now I'll rest," thought the prince, +and let Tikhon undress him. + +Frowning with vexation at the effort necessary to divest himself +of his coat and trousers, the prince undressed, sat down heavily on +the bed, and appeared to be meditating as he looked contemptuously +at his withered yellow legs. He was not meditating, but only deferring +the moment of making the effort to lift those legs up and turn over on +the bed. "Ugh, how hard it is! Oh, that this toil might end and you +would release me!" thought he. Pressing his lips together he made that +effort for the twenty-thousandth time and lay down. But hardly had +he done so before he felt the bed rocking backwards and forwards +beneath him as if it were breathing heavily and jolting. This happened +to him almost every night. He opened his eyes as they were closing. + +"No peace, damn them!" he muttered, angry he knew not with whom. "Ah +yes, there was something else important, very important, that I was +keeping till I should be in bed. The bolts? No, I told him about them. +No, it was something, something in the drawing room. Princess Mary +talked some nonsense. Dessalles, that fool, said something. +Something in my pocket--can't remember..." + +"Tikhon, what did we talk about at dinner?" + +"About Prince Michael..." + +"Be quiet, quiet!" The prince slapped his hand on the table. "Yes, I +know, Prince Andrew's letter! Princess Mary read it. Dessalles said +something about Vitebsk. Now I'll read it." + +He had the letter taken from his pocket and the table--on which +stood a glass of lemonade and a spiral wax candle--moved close to +the bed, and putting on his spectacles he began reading. Only now in +the stillness of the night, reading it by the faint light under the +green shade, did he grasp its meaning for a moment. + +"The French at Vitebsk, in four days' march they may be at Smolensk; +perhaps are already there! Tikhon!" Tikhon jumped up. "No, no, I don't +want anything!" he shouted. + +He put the letter under the candlestick and closed his eyes. And +there rose before him the Danube at bright noonday: reeds, the Russian +camp, and himself a young general without a wrinkle on his ruddy face, +vigorous and alert, entering Potemkin's gaily colored tent, and a +burning sense of jealousy of "the favorite" agitated him now as +strongly as it had done then. He recalled all the words spoken at that +first meeting with Potemkin. And he saw before him a plump, rather +sallow-faced, short, stout woman, the Empress Mother, with her smile +and her words at her first gracious reception of him, and then that +same face on the catafalque, and the encounter he had with Zubov +over her coffin about his right to kiss her hand. + +"Oh, quicker, quicker! To get back to that time and have done with +all the present! Quicker, quicker--and that they should leave me in +peace!" + + + + + +CHAPTER IV + + +Bald Hills, Prince Nicholas Bolkonski's estate, lay forty miles east +from Smolensk and two miles from the main road to Moscow. + +The same evening that the prince gave his instructions to +Alpatych, Dessalles, having asked to see Princess Mary, told her that, +as the prince was not very well and was taking no steps to secure +his safety, though from Prince Andrew's letter it was evident that +to remain at Bald Hills might be dangerous, he respectfully advised +her to send a letter by Alpatych to the Provincial Governor at +Smolensk, asking him to let her know the state of affairs and the +extent of the danger to which Bald Hills was exposed. Dessalles +wrote this letter to the Governor for Princess Mary, she signed it, +and it was given to Alpatych with instructions to hand it to the +Governor and to come back as quickly as possible if there was danger. + +Having received all his orders Alpatych, wearing a white beaver hat- +a present from the prince--and carrying a stick as the prince did, +went out accompanied by his family. Three well-fed roans stood ready +harnessed to a small conveyance with a leather hood. + +The larger bell was muffled and the little bells on the harness +stuffed with paper. The prince allowed no one at Bald Hills to drive +with ringing bells; but on a long journey Alpatych liked to have them. +His satellites--the senior clerk, a countinghouse clerk, a scullery +maid, a cook, two old women, a little pageboy, the coachman, and +various domestic serfs--were seeing him off. + +His daughter placed chintz-covered down cushions for him to sit on +and behind his back. His old sister-in-law popped in a small bundle, +and one of the coachmen helped him into the vehicle. + +"There! There! Women's fuss! Women, women!" said Alpatych, puffing +and speaking rapidly just as the prince did, and he climbed into the +trap. + +After giving the clerk orders about the work to be done, Alpatych, +not trying to imitate the prince now, lifted the hat from his bald +head and crossed himself three times. + +"If there is anything... come back, Yakov Alpatych! For Christ's +sake think of us!" cried his wife, referring to the rumors of war +and the enemy. + +"Women, women! Women's fuss!" muttered Alpatych to himself and +started on his journey, looking round at the fields of yellow rye +and the still-green, thickly growing oats, and at other quite black +fields just being plowed a second time. + +As he went along he looked with pleasure at the year's splendid crop +of corn, scrutinized the strips of ryefield which here and there +were already being reaped, made his calculations as to the sowing +and the harvest, and asked himself whether he had not forgotten any of +the prince's orders. + +Having baited the horses twice on the way, he arrived at the town +toward evening on the fourth of August. + +Alpatych kept meeting and overtaking baggage trains and troops on +the road. As he approached Smolensk he heard the sounds of distant +firing, but these did not impress him. What struck him most was the +sight of a splendid field of oats in which a camp had been pitched and +which was being mown down by the soldiers, evidently for fodder. +This fact impressed Alpatych, but in thinking about his own business +he soon forgot it. + +All the interests of his life for more than thirty years had been +bounded by the will of the prince, and he never went beyond that +limit. Everything not connected with the execution of the prince's +orders did not interest and did not even exist for Alpatych. + +On reaching Smolensk on the evening of the fourth of August he put +up in the Gachina suburb across the Dnieper, at the inn kept by +Ferapontov, where he had been in the habit of putting up for the +last thirty years. Some thirty years ago Ferapontov, by Alpatych's +advice, had bought a wood from the prince, had begun to trade, and now +had a house, an inn, and a corn dealer's shop in that province. He was +a stout, dark, red-faced peasant in the forties, with thick lips, a +broad knob of a nose, similar knobs over his black frowning brows, and +a round belly. + +Wearing a waistcoat over his cotton shirt, Ferapontov was standing +before his shop which opened onto the street. On seeing Alpatych he +went up to him. + +"You're welcome, Yakov Alpatych. Folks are leaving the town, but you +have come to it," said he. + +"Why are they leaving the town?" asked Alpatych. + +"That's what I say. Folks are foolish! Always afraid of the French." + +"Women's fuss, women's fuss!" said Alpatych. + +"Just what I think, Yakov Alpatych. What I say is: orders have +been given not to let them in, so that must be right. And the peasants +are asking three rubles for carting--it isn't Christian!" + +Yakov Alpatych heard without heeding. He asked for a samovar and for +hay for his horses, and when he had had his tea he went to bed. + +All night long troops were moving past the inn. Next morning +Alpatych donned a jacket he wore only in town and went out on +business. It was a sunny morning and by eight o'clock it was already +hot. "A good day for harvesting," thought Alpatych. + +From beyond the town firing had been heard since early morning. At +eight o'clock the booming of cannon was added to the sound of +musketry. Many people were hurrying through the streets and there were +many soldiers, but cabs were still driving about, tradesmen stood at +their shops, and service was being held in the churches as usual. +Alpatych went to the shops, to government offices, to the post office, +and to the Governor's. In the offices and shops and at the post office +everyone was talking about the army and about the enemy who was +already attacking the town, everybody was asking what should be +done, and all were trying to calm one another. + +In front of the Governor's house Alpatych found a large number of +people, Cossacks, and a traveling carriage of the Governor's. At the +porch he met two of the landed gentry, one of whom he knew. This +man, an ex-captain of police, was saying angrily: + +"It's no joke, you know! It's all very well if you're single. 'One +man though undone is but one,' as the proverb says, but with +thirteen in your family and all the property... They've brought us +to utter ruin! What sort of governors are they to do that? They +ought to be hanged--the brigands!..." + +"Oh come, that's enough!" said the other. + +"What do I care? Let him hear! We're not dogs," said the +ex-captain of police, and looking round he noticed Alpatych. + +"Oh, Yakov Alpatych! What have you come for?" + +"To see the Governor by his excellency's order," answered +Alpatych, lifting his head and proudly thrusting his hand into the +bosom of his coat as he always did when he mentioned the prince.... +"He has ordered me to inquire into the position of affairs," he added. + +"Yes, go and find out!" shouted the angry gentleman. "They've +brought things to such a pass that there are no carts or +anything!... There it is again, do you hear?" said he, pointing +in the direction whence came the sounds of firing. + +"They've brought us all to ruin... the brigands!" he repeated, and +descended the porch steps. + +Alpatych swayed his head and went upstairs. In the waiting room were +tradesmen, women, and officials, looking silently at one another. +The door of the Governor's room opened and they all rose and moved +forward. An official ran out, said some words to a merchant, called +a stout official with a cross hanging on his neck to follow him, and +vanished again, evidently wishing to avoid the inquiring looks and +questions addressed to him. Alpatych moved forward and next time the +official came out addressed him, one hand placed in the breast of +his buttoned coat, and handed him two letters. + +"To his Honor Baron Asch, from General-in-Chief Prince Bolkonski," +he announced with such solemnity and significance that the official +turned to him and took the letters. + +A few minutes later the Governor received Alpatych and hurriedly +said to him: + +"Inform the prince and princess that I knew nothing: I acted on +the highest instructions--here..." and he handed a paper to +Alpatych. "Still, as the prince is unwell my advice is that they +should go to Moscow. I am just starting myself. Inform them..." + +But the Governor did not finish: a dusty perspiring officer ran into +the room and began to say something in French. The Governor's face +expressed terror. + +"Go," he said, nodding his head to Alpatych, and began questioning +the officer. + +Eager, frightened, helpless glances were turned on Alpatych when +he came out of the Governor's room. Involuntarily listening now to the +firing, which had drawn nearer and was increasing in strength, +Alpatych hurried to his inn. The paper handed to him by the Governor +said this: + + +"I assure you that the town of Smolensk is not in the slightest +danger as yet and it is unlikely that it will be threatened with +any. I from the one side and Prince Bagration from the other are +marching to unite our forces before Smolensk, which junction will be +effected on the 22nd instant, and both armies with their united forces +will defend our compatriots of the province entrusted to your care +till our efforts shall have beaten back the enemies of our Fatherland, +or till the last warrior in our valiant ranks has perished. From +this you will see that you have a perfect right to reassure the +inhabitants of Smolensk, for those defended by two such brave armies +may feel assured of victory." (Instructions from Barclay de Tolly to +Baron Asch, the civil governor of Smolensk, 1812.) + + +People were anxiously roaming about the streets. + +Carts piled high with household utensils, chairs, and cupboards kept +emerging from the gates of the yards and moving along the streets. +Loaded carts stood at the house next to Ferapontov's and women were +wailing and lamenting as they said good-by. A small watchdog ran round +barking in front of the harnessed horses. + +Alpatych entered the innyard at a quicker pace than usual and went +straight to the shed where his horses and trap were. The coachman +was asleep. He woke him up, told him to harness, and went into the +passage. From the host's room came the sounds of a child crying, the +despairing sobs of a woman, and the hoarse angry shouting of +Ferapontov. The cook began running hither and thither in the passage +like a frightened hen, just as Alpatych entered. + +"He's done her to death. Killed the mistress!... Beat her... dragged +her about so!..." + +"What for?" asked Alpatych. + +"She kept begging to go away. She's a woman! 'Take me away,' says +she, 'don't let me perish with my little children! Folks,' she says, +'are all gone, so why,' she says, 'don't we go?' And he began +beating and pulling her about so!" + +At these words Alpatych nodded as if in approval, and not wishing to +hear more went to the door of the room opposite the innkeeper's, where +he had left his purchases. + +"You brute, you murderer!" screamed a thin, pale woman who, with a +baby in her arms and her kerchief torn from her head, burst through +the door at that moment and down the steps into the yard. + +Ferapontov came out after her, but on seeing Alpatych adjusted his +waistcoat, smoothed his hair, yawned, and followed Alpatych into the +opposite room. + +"Going already?" said he. + +Alpatych, without answering or looking at his host, sorted his +packages and asked how much he owed. + +"We'll reckon up! Well, have you been to the Governor's?" asked +Ferapontov. "What has been decided?" + +Alpatych replied that the Governor had not told him anything +definite. + +"With our business, how can we get away?" said Ferapontov. "We'd +have to pay seven rubles a cartload to Dorogobuzh and I tell them +they're not Christians to ask it! Selivanov, now, did a good stroke +last Thursday--sold flour to the army at nine rubles a sack. Will +you have some tea?" he added. + +While the horses were being harnessed Alpatych and Ferapontov over +their tea talked of the price of corn, the crops, and the good weather +for harvesting. + +"Well, it seems to be getting quieter," remarked Ferapontov, +finishing his third cup of tea and getting up. "Ours must have got the +best of it. The orders were not to let them in. So we're in force, +it seems.... They say the other day Matthew Ivanych Platov drove +them into the river Marina and drowned some eighteen thousand in one +day." + +Alpatych collected his parcels, handed them to the coachman who +had come in, and settled up with the innkeeper. The noise of wheels, +hoofs, and bells was heard from the gateway as a little trap passed +out. + +It was by now late in the afternoon. Half the street was in +shadow, the other half brightly lit by the sun. Alpatych looked out of +the window and went to the door. Suddenly the strange sound of a +far-off whistling and thud was heard, followed by a boom of cannon +blending into a dull roar that set the windows rattling. + +He went out into the street: two men were running past toward the +bridge. From different sides came whistling sounds and the thud of +cannon balls and bursting shells falling on the town. But these sounds +were hardly heard in comparison with the noise of the firing outside +the town and attracted little attention from the inhabitants. The town +was being bombarded by a hundred and thirty guns which Napoleon had +ordered up after four o'clock. The people did not at once realize +the meaning of this bombardment. + +At first the noise of the falling bombs and shells only aroused +curiosity. Ferapontov's wife, who till then had not ceased wailing +under the shed, became quiet and with the baby in her arms went to the +gate, listening to the sounds and looking in silence at the people. + +The cook and a shop assistant came to the gate. With lively +curiosity everyone tried to get a glimpse of the projectiles as they +flew over their heads. Several people came round the corner talking +eagerly. + +"What force!" remarked one. "Knocked the roof and ceiling all to +splinters!" + +"Routed up the earth like a pig," said another. + +"That's grand, it bucks one up!" laughed the first. "Lucky you +jumped aside, or it would have wiped you out!" + +Others joined those men and stopped and told how cannon balls had +fallen on a house close to them. Meanwhile still more projectiles, now +with the swift sinister whistle of a cannon ball, now with the +agreeable intermittent whistle of a shell, flew over people's heads +incessantly, but not one fell close by, they all flew over. Alpatych +was getting into his trap. The innkeeper stood at the gate. + +"What are you staring at?" he shouted to the cook, who in her red +skirt, with sleeves rolled up, swinging her bare elbows, had stepped +to the corner to listen to what was being said. + +"What marvels!" she exclaimed, but hearing her master's voice she +turned back, pulling down her tucked-up skirt. + +Once more something whistled, but this time quite close, swooping +downwards like a little bird; a flame flashed in the middle of the +street, something exploded, and the street was shrouded in smoke. + +"Scoundrel, what are you doing?" shouted the innkeeper, rushing to +the cook. + +At that moment the pitiful wailing of women was heard from different +sides, the frightened baby began to cry, and people crowded silently +with pale faces round the cook. The loudest sound in that crowd was +her wailing. + +"Oh-h-h! Dear souls, dear kind souls! Don't let me die! My good +souls!..." + +Five minutes later no one remained in the street. The cook, with her +thigh broken by a shell splinter, had been carried into the kitchen. +Alpatych, his coachman, Ferapontov's wife and children and the house +porter were all sitting in the cellar, listening. The roar of guns, +the whistling of projectiles, and the piteous moaning of the cook, +which rose above the other sounds, did not cease for a moment. The +mistress rocked and hushed her baby and when anyone came into the +cellar asked in a pathetic whisper what had become of her husband +who had remained in the street. A shopman who entered told her that +her husband had gone with others to the cathedral, whence they were +fetching the wonder-working icon of Smolensk. + +Toward dusk the cannonade began to subside. Alpatych left the cellar +and stopped in the doorway. The evening sky that had been so clear was +clouded with smoke, through which, high up, the sickle of the new moon +shone strangely. Now that the terrible din of the guns had ceased a +hush seemed to reign over the town, broken only by the rustle of +footsteps, the moaning, the distant cries, and the crackle of fires +which seemed widespread everywhere. The cook's moans had now subsided. +On two sides black curling clouds of smoke rose and spread from the +fires. Through the streets soldiers in various uniforms walked or +ran confusedly in different directions like ants from a ruined +ant-hill. Several of them ran into Ferapontov's yard before Alpatych's +eyes. Alpatych went out to the gate. A retreating regiment, +thronging and hurrying, blocked the street. + +Noticing him, an officer said: "The town is being abandoned. Get +away, get away!" and then, turning to the soldiers, shouted: + +"I'll teach you to run into the yards!" + +Alpatych went back to the house, called the coachman, and told him +to set off. Ferapontov's whole household came out too, following +Alpatych and the coachman. The women, who had been silent till then, +suddenly began to wail as they looked at the fires--the smoke and even +the flames of which could be seen in the failing twilight--and as if +in reply the same kind of lamentation was heard from other parts of +the street. Inside the shed Alpatych and the coachman arranged the +tangled reins and traces of their horses with trembling hands. + +As Alpatych was driving out of the gate he saw some ten soldiers +in Ferapontov's open shop, talking loudly and filling their bags and +knapsacks with flour and sunflower seeds. Just then Ferapontov +returned and entered his shop. On seeing the soldiers he was about +to shout at them, but suddenly stopped and, clutching at his hair, +burst into sobs and laughter: + +"Loot everything, lads! Don't let those devils get it!" he cried, +taking some bags of flour himself and throwing them into the street. + +Some of the soldiers were frightened and ran away, others went on +filling their bags. On seeing Alpatych, Ferapontov turned to him: + +"Russia is done for!" he cried. "Alpatych, I'll set the place on +fire myself. We're done for!..." and Ferapontov ran into the yard. + +Soldiers were passing in a constant stream along the street blocking +it completely, so that Alpatych could not pass out and had to wait. +Ferapontov's wife and children were also sitting in a cart waiting +till it was possible to drive out. + +Night had come. There were stars in the sky and the new moon shone +out amid the smoke that screened it. On the sloping descent to the +Dnieper Alpatych's cart and that of the innkeeper's wife, which were +slowly moving amid the rows of soldiers and of other vehicles, had +to stop. In a side street near the crossroads where the vehicles had +stopped, a house and some shops were on fire. This fire was already +burning itself out. The flames now died down and were lost in the +black smoke, now suddenly flared up again brightly, lighting up with +strange distinctness the faces of the people crowding at the +crossroads. Black figures flitted about before the fire, and through +the incessant crackling of the flames talking and shouting could be +heard. Seeing that his trap would not be able to move on for some +time, Alpatych got down and turned into the side street to look at the +fire. Soldiers were continually rushing backwards and forwards near +it, and he saw two of them and a man in a frieze coat dragging burning +beams into another yard across the street, while others carried +bundles of hay. + +Alpatych went up to a large crowd standing before a high barn +which was blazing briskly. The walls were all on fire and the back +wall had fallen in, the wooden roof was collapsing, and the rafters +were alight. The crowd was evidently watching for the roof to fall in, +and Alpatych watched for it too. + +"Alpatych!" a familiar voice suddenly hailed the old man. + +"Mercy on us! Your excellency!" answered Alpatych, immediately +recognizing the voice of his young prince. + +Prince Andrew in his riding cloak, mounted on a black horse, was +looking at Alpatych from the back of the crowd. + +"Why are you here?" he asked. + +"Your... your excellency," stammered Alpatych and broke into sobs. +"Are we really lost? Master!..." + +"Why are you here?" Prince Andrew repeated. + +At that moment the flames flared up and showed his young master's +pale worn face. Alpatych told how he had been sent there and how +difficult it was to get away. + +"Are we really quite lost, your excellency?" he asked again. + +Prince Andrew without replying took out a notebook and raising his +knee began writing in pencil on a page he tore out. He wrote to his +sister: + + +"Smolensk is being abandoned. Bald Hills will be occupied by the +enemy within a week. Set off immediately for Moscow. Let me know at +once when you will start. Send by special messenger to Usvyazh." + + +Having written this and given the paper to Alpatych, he told him how +to arrange for departure of the prince, the princess, his son, and the +boy's tutor, and how and where to let him know immediately. Before +he had had time to finish giving these instructions, a chief of +staff followed by a suite galloped up to him. + +"You are a colonel?" shouted the chief of staff with a German +accent, in a voice familiar to Prince Andrew. "Houses are set on +fire in your presence and you stand by! What does this mean? You +will answer for it!" shouted Berg, who was now assistant to the +chief of staff of the commander of the left flank of the infantry of +the first army, a place, as Berg said, "very agreeable and well en +evidence." + +Prince Andrew looked at him and without replying went on speaking to +Alpatych. + +"So tell them that I shall await a reply till the tenth, and if by +the tenth I don't receive news that they have all got away I shall +have to throw up everything and come myself to Bald Hills." + +"Prince," said Berg, recognizing Prince Andrew, "I only spoke +because I have to obey orders, because I always do obey exactly.... +You must please excuse me," he went on apologetically. + +Something cracked in the flames. The fire died down for a moment and +wreaths of black smoke rolled from under the roof. There was another +terrible crash and something huge collapsed. + +"Ou-rou-rou!" yelled the crowd, echoing the crash of the +collapsing roof of the barn, the burning grain in which diffused a +cakelike aroma all around. The flames flared up again, lighting the +animated, delighted, exhausted faces of the spectators. + +The man in the frieze coat raised his arms and shouted: + +"It's fine, lads! Now it's raging... It's fine!" + +"That's the owner himself," cried several voices. + +"Well then," continued Prince Andrew to Alpatych, "report to them as +I have told you"; and not replying a word to Berg who was now mute +beside him, he touched his horse and rode down the side street. + + + + + +CHAPTER V + + +From Smolensk the troops continued to retreat, followed by the +enemy. On the tenth of August the regiment Prince Andrew commanded was +marching along the highroad past the avenue leading to Bald Hills. +Heat and drought had continued for more than three weeks. Each day +fleecy clouds floated across the sky and occasionally veiled the +sun, but toward evening the sky cleared again and the sun set in +reddish-brown mist. Heavy night dews alone refreshed the earth. The +unreaped corn was scorched and shed its grain. The marshes dried up. +The cattle lowed from hunger, finding no food on the sun-parched +meadows. Only at night and in the forests while the dew lasted was +there any freshness. But on the road, the highroad along which the +troops marched, there was no such freshness even at night or when +the road passed through the forest; the dew was imperceptible on the +sandy dust churned up more than six inches deep. As soon as day dawned +the march began. The artillery and baggage wagons moved noiselessly +through the deep dust that rose to the very hubs of the wheels, and +the infantry sank ankle-deep in that soft, choking, hot dust that +never cooled even at night. Some of this dust was kneaded by the +feet and wheels, while the rest rose and hung like a cloud over the +troops, settling in eyes, ears, hair, and nostrils, and worst of all +in the lungs of the men and beasts as they moved along that road. +The higher the sun rose the higher rose that cloud of dust, and +through the screen of its hot fine particles one could look with naked +eye at the sun, which showed like a huge crimson ball in the unclouded +sky. There was no wind, and the men choked in that motionless +atmosphere. They marched with handkerchiefs tied over their noses +and mouths. When they passed through a village they all rushed to +the wells and fought for the water and drank it down to the mud. + +Prince Andrew was in command of a regiment, and the management of +that regiment, the welfare of the men and the necessity of receiving +and giving orders, engrossed him. The burning of Smolensk and its +abandonment made an epoch in his life. A novel feeling of anger +against the foe made him forget his own sorrow. He was entirely +devoted to the affairs of his regiment and was considerate and kind to +his men and officers. In the regiment they called him "our prince," +were proud of him and loved him. But he was kind and gentle only to +those of his regiment, to Timokhin and the like--people quite new to +him, belonging to a different world and who could not know and +understand his past. As soon as he came across a former acquaintance +or anyone from the staff, he bristled up immediately and grew +spiteful, ironical, and contemptuous. Everything that reminded him +of his past was repugnant to him, and so in his relations with that +former circle he confined himself to trying to do his duty and not +to be unfair. + +In truth everything presented itself in a dark and gloomy light to +Prince Andrew, especially after the abandonment of Smolensk on the +sixth of August (he considered that it could and should have been +defended) and after his sick father had had to flee to Moscow, +abandoning to pillage his dearly beloved Bald Hills which he had built +and peopled. But despite this, thanks to his regiment, Prince Andrew +had something to think about entirely apart from general questions. +Two days previously he had received news that his father, son, and +sister had left for Moscow; and though there was nothing for him to do +at Bald Hills, Prince Andrew with a characteristic desire to foment +his own grief decided that he must ride there. + +He ordered his horse to be saddled and, leaving his regiment on +the march, rode to his father's estate where he had been born and +spent his childhood. Riding past the pond where there used always to +be dozens of women chattering as they rinsed their linen or beat it +with wooden beetles, Prince Andrew noticed that there was not a soul +about and that the little washing wharf, torn from its place and +half submerged, was floating on its side in the middle of the pond. He +rode to the keeper's lodge. No one at the stone entrance gates of +the drive and the door stood open. Grass had already begun to grow +on the garden paths, and horses and calves were straying in the +English park. Prince Andrew rode up to the hothouse; some of the glass +panes were broken, and of the trees in tubs some were overturned and +others dried up. He called for Taras the gardener, but no one replied. +Having gone round the corner of the hothouse to the ornamental garden, +he saw that the carved garden fence was broken and branches of the +plum trees had been torn off with the fruit. An old peasant whom +Prince Andrew in his childhood had often seen at the gate was +sitting on a green garden seat, plaiting a bast shoe. + +He was deaf and did not hear Prince Andrew ride up. He was sitting +on the seat the old prince used to like to sit on, and beside him +strips of bast were hanging on the broken and withered branch of a +magnolia. + +Prince Andrew rode up to the house. Several limes in the old +garden had been cut down and a piebald mare and her foal were +wandering in front of the house among the rosebushes. The shutters +were all closed, except at one window which was open. A little serf +boy, seeing Prince Andrew, ran into the house. Alpatych, having sent +his family away, was alone at Bald Hills and was sitting indoors +reading the Lives of the Saints. On hearing that Prince Andrew had +come, he went out with his spectacles on his nose, buttoning his coat, +and, hastily stepping up, without a word began weeping and kissing +Prince Andrew's knee. + +Then, vexed at his own weakness, he turned away and began to +report on the position of affairs. Everything precious and valuable +had been removed to Bogucharovo. Seventy quarters of grain had also +been carted away. The hay and the spring corn, of which Alpatych +said there had been a remarkable crop that year, had been commandeered +by the troops and mown down while still green. The peasants were +ruined; some of them too had gone to Bogucharovo, only a few remained. + +Without waiting to hear him out, Prince Andrew asked: + +"When did my father and sister leave?" meaning when did they leave +for Moscow. + +Alpatych, understanding the question to refer to their departure for +Bogucharovo, replied that they had left on the seventh and again +went into details concerning the estate management, asking for +instructions. + +"Am I to let the troops have the oats, and to take a receipt for +them? We have still six hundred quarters left," he inquired. + +"What am I to say to him?" thought Prince Andrew, looking down on +the old man's bald head shining in the sun and seeing by the +expression on his face that the old man himself understood how +untimely such questions were and only asked them to allay his grief. + +"Yes, let them have it," replied Prince Andrew. + +"If you noticed some disorder in the garden," said Alpatych, "it was +impossible to prevent it. Three regiments have been here and spent the +night, dragoons mostly. I took down the name and rank of their +commanding officer, to hand in a complaint about it." + +"Well, and what are you going to do? Will you stay here if the enemy +occupies the place?" asked Prince Andrew. + +Alpatych turned his face to Prince Andrew, looked at him, and +suddenly with a solemn gesture raised his arm. + +"He is my refuge! His will be done!" he exclaimed. + +A group of bareheaded peasants was approaching across the meadow +toward the prince. + +"Well, good-by!" said Prince Andrew, bending over to Alpatych. +"You must go away too, take away what you can and tell the serfs to go +to the Ryazan estate or to the one near Moscow." + +Alpatych clung to Prince Andrew's leg and burst into sobs. Gently +disengaging himself, the prince spurred his horse and rode down the +avenue at a gallop. + +The old man was still sitting in the ornamental garden, like a fly +impassive on the face of a loved one who is dead, tapping the last +on which he was making the bast shoe, and two little girls, running +out from the hot house carrying in their skirts plums they had plucked +from the trees there, came upon Prince Andrew. On seeing the young +master, the elder one frightened look clutched her younger companion +by the hand and hid with her behind a birch tree, not stopping to pick +up some green plums they had dropped. + +Prince Andrew turned away with startled haste, unwilling to let them +see that they had been observed. He was sorry for the pretty +frightened little girl, was afraid of looking at her, and yet felt +an irresistible desire to do so. A new sensation of comfort and relief +came over him when, seeing these girls, he realized the existence of +other human interests entirely aloof from his own and just as +legitimate as those that occupied him. Evidently these girls +passionately desired one thing--to carry away and eat those green +plums without being caught--and Prince Andrew shared their wish for +the success of their enterprise. He could not resist looking at them +once more. Believing their danger past, they sprang from their +ambush and, chirruping something in their shrill little voices and +holding up their skirts, their bare little sunburned feet scampered +merrily and quickly across the meadow grass. + +Prince Andrew was somewhat refreshed by having ridden off the +dusty highroad along which the troops were moving. But not far from +Bald Hills he again came out on the road and overtook his regiment +at its halting place by the dam of a small pond. It was past one +o'clock. The sun, a red ball through the dust, burned and scorched his +back intolerably through his black coat. The dust always hung +motionless above the buzz of talk that came from the resting troops. +There was no wind. As he crossed the dam Prince Andrew smelled the +ooze and freshness of the pond. He longed to get into that water, +however dirty it might be, and he glanced round at the pool from +whence came sounds of shrieks and laughter. The small, muddy, green +pond had risen visibly more than a foot, flooding the dam, because +it was full of the naked white bodies of soldiers with brick-red +hands, necks, and faces, who were splashing about in it. All this +naked white human flesh, laughing and shrieking, floundered about in +that dirty pool like carp stuffed into a watering can, and the +suggestion of merriment in that floundering mass rendered it specially +pathetic. + +One fair-haired young soldier of the third company, whom Prince +Andrew knew and who had a strap round the calf of one leg, crossed +himself, stepped back to get a good run, and plunged into the water; +another, a dark noncommissioned officer who was always shaggy, stood +up to his waist in the water joyfully wriggling his muscular figure +and snorted with satisfaction as he poured the water over his head +with hands blackened to the wrists. There were sounds of men +slapping one another, yelling, and puffing. + +Everywhere on the bank, on the dam, and in the pond, there was +healthy, white, muscular flesh. The officer, Timokhin, with his red +little nose, standing on the dam wiping himself with a towel, felt +confused at seeing the prince, but made up his mind to address him +nevertheless. + +"It's very nice, your excellency! Wouldn't you like to?" said he. + +"It's dirty," replied Prince Andrew, making a grimace. + +"We'll clear it out for you in a minute," said Timokhin, and, +still undressed, ran off to clear the men out of the pond. + +"The prince wants to bathe." + +"What prince? Ours?" said many voices, and the men were in such +haste to clear out that the prince could hardly stop them. He +decided that he would rather wash himself with water in the barn. + +"Flesh, bodies, cannon fodder!" he thought, and he looked at his own +naked body and shuddered, not from cold but from a sense of disgust +and horror he did not himself understand, aroused by the sight of that +immense number of bodies splashing about in the dirty pond. + + +On the seventh of August Prince Bagration wrote as follows from +his quarters at Mikhaylovna on the Smolensk road: + + +Dear Count Alexis Andreevich--(He was writing to Arakcheev but +knew that his letter would be read by the Emperor, and therefore +weighed every word in it to the best of his ability.) + +I expect the Minister [Barclay de Tolly] has already reported the +abandonment of Smolensk to the enemy. It is pitiable and sad, and +the whole army is in despair that this most important place has been +wantonly abandoned. I, for my part, begged him personally most +urgently and finally wrote him, but nothing would induce him to +consent. I swear to you on my honor that Napoleon was in such a fix as +never before and might have lost half his army but could not have +taken Smolensk. Our troops fought, and are fighting, as never +before. With fifteen thousand men I held the enemy at bay for +thirty-five hours and beat him; but he would not hold out even for +fourteen hours. It is disgraceful, a stain on our army, and as for +him, he ought, it seems to me, not to live. If he reports that our +losses were great, it is not true; perhaps about four thousand, not +more, and not even that; but even were they ten thousand, that's +war! But the enemy has lost masses... + +What would it have cost him to hold out for another two days? They +would have had to retire of their own accord, for they had no water +for men or horses. He gave me his word he would not retreat, but +suddenly sent instructions that he was retiring that night. We +cannot fight in this way, or we may soon bring the enemy to Moscow... + +There is a rumor that you are thinking of peace. God forbid that you +should make peace after all our sacrifices and such insane retreats! +You would set all Russia against you and every one of us would feel +ashamed to wear the uniform. If it has come to this--we must fight +as long as Russia can and as long as there are men able to stand... + +One man ought to be in command, and not two. Your Minister may +perhaps be good as a Minister, but as a general he is not merely bad +but execrable, yet to him is entrusted the fate of our whole +country.... I am really frantic with vexation; forgive my writing +boldly. It is clear that the man who advocates the conclusion of a +peace, and that the Minister should command the army, does not love +our sovereign and desires the ruin of us all. So I write you +frankly: call out the militia. For the Minister is leading these +visitors after him to Moscow in a most masterly way. The whole army +feels great suspicion of the Imperial aide-de-camp Wolzogen. He is +said to be more Napoleon's man than ours, and he is always advising +the Minister. I am not merely civil to him but obey him like a +corporal, though I am his senior. This is painful, but, loving my +benefactor and sovereign, I submit. Only I am sorry for the Emperor +that he entrusts our fine army to such as he. Consider that on our +retreat we have lost by fatigue and left in the hospital more than +fifteen thousand men, and had we attacked this would not have +happened. Tell me, for God's sake, what will Russia, our mother +Russia, say to our being so frightened, and why are we abandoning +our good and gallant Fatherland to such rabble and implanting feelings +of hatred and shame in all our subjects? What are we scared at and +of whom are we afraid? I am not to blame that the Minister is +vacillating, a coward, dense, dilatory, and has all bad qualities. The +whole army bewails it and calls down curses upon him... + + + + + +CHAPTER VI + + +Among the innumerable categories applicable to the phenomena of +human life one may discriminate between those in which substance +prevails and those in which form prevails. To the latter--as +distinguished from village, country, provincial, or even Moscow +life--we may allot Petersburg life, and especially the life of its +salons. That life of the salons is unchanging. Since the year 1805 +we had made peace and had again quarreled with Bonaparte and had +made constitutions and unmade them again, but the salons of Anna +Pavlovna Helene remained just as they had been--the one seven and +the other five years before. At Anna Pavlovna's they talked with +perplexity of Bonaparte's successes just as before and saw in them and +in the subservience shown to him by the European sovereigns a +malicious conspiracy, the sole object of which was to cause +unpleasantness and anxiety to the court circle of which Anna +Pavlovna was the representative. And in Helene's salon, which +Rumyantsev himself honored with his visits, regarding Helene as a +remarkably intelligent woman, they talked with the same ecstasy in +1812 as in 1808 of the "great nation" and the "great man," and +regretted our rupture with France, a rupture which, according to them, +ought to be promptly terminated by peace. + +Of late, since the Emperor's return from the army, there had been +some excitement in these conflicting salon circles and some +demonstrations of hostility to one another, but each camp retained its +own tendency. In Anna Pavlovna's circle only those Frenchmen were +admitted who were deep-rooted legitimists, and patriotic views were +expressed to the effect that one ought not to go to the French theater +and that to maintain the French troupe was costing the government as +much as a whole army corps. The progress of the war was eagerly +followed, and only the reports most flattering to our army were +circulated. In the French circle of Helene and Rumyantsev the +reports of the cruelty of the enemy and of the war were contradicted +and all Napoleon's attempts at conciliation were discussed. In that +circle they discountenanced those who advised hurried preparations for +a removal to Kazan of the court and the girls' educational +establishments under the patronage of the Dowager Empress. In Helene's +circle the war in general was regarded as a series of formal +demonstrations which would very soon end in peace, and the view +prevailed expressed by Bilibin--who now in Petersburg was quite at +home in Helene's house, which every clever man was obliged to visit- +that not by gunpowder but by those who invented it would matters be +settled. In that circle the Moscow enthusiasm--news of which had +reached Petersburg simultaneously with the Emperor's return--was +ridiculed sarcastically and very cleverly, though with much caution. + +Anna Pavlovna's circle on the contrary was enraptured by this +enthusiasm and spoke of it as Plutarch speaks of the deeds of the +ancients. Prince Vasili, who still occupied his former important +posts, formed a connecting link between these two circles. He +visited his "good friend Anna Pavlovna" as well as his daughter's +"diplomatic salon," and often in his constant comings and goings +between the two camps became confused and said at Helene's what he +should have said at Anna Pavlovna's and vice versa. + +Soon after the Emperor's return Prince Vasili in a conversation +about the war at Anna Pavlovna's severely condemned Barclay de +Tolly, but was undecided as to who ought to be appointed commander +in chief. One of the visitors, usually spoken of as "a man of great +merit," having described how he had that day seen Kutuzov, the newly +chosen chief of the Petersburg militia, presiding over the +enrollment of recruits at the Treasury, cautiously ventured to suggest +that Kutuzov would be the man to satisfy all requirements. + +Anna Pavlovna remarked with a melancholy smile that Kutuzov had done +nothing but cause the Emperor annoyance. + +"I have talked and talked at the Assembly of the Nobility," Prince +Vasili interrupted, "but they did not listen to me. I told them his +election as chief of the militia would not please the Emperor. They +did not listen to me. + +"It's all this mania for opposition," he went on. "And who for? It +is all because we want to ape the foolish enthusiasm of those +Muscovites," Prince Vasili continued, forgetting for a moment that +though at Helene's one had to ridicule the Moscow enthusiasm, at +Anna Pavlovna's one had to be ecstatic about it. But he retrieved +his mistake at once. "Now, is it suitable that Count Kutuzov, the +oldest general in Russia, should preside at that tribunal? He will get +nothing for his pains! How could they make a man commander in chief +who cannot mount a horse, who drops asleep at a council, and has the +very worst morals! A good reputation he made for himself at Bucharest! +I don't speak of his capacity as a general, but at a time like this +how they appoint a decrepit, blind old man, positively +blind? A fine idea to have a blind general! He can't see anything. +To play blindman's bluff? He can't see at all!" + +No one replied to his remarks. + +This was quite correct on the twenty-fourth of July. But on the +twenty-ninth of July Kutuzov received the title of Prince. This +might indicate a wish to get rid of him, and therefore Prince Vasili's +opinion continued to be correct though he was not now in any hurry +to express it. But on the eighth of August a committee, consisting +of Field Marshal Saltykov, Arakcheev, Vyazmitinov, Lopukhin, and +Kochubey met to consider the progress of the war. This committee +came to the conclusion that our failures were due to a want of unity +in the command and though the members of the committee were aware of +the Emperor's dislike of Kutuzov, after a short deliberation they +agreed to advise his appointment as commander in chief. That same +day Kutuzov was appointed commander in chief with full powers over the +armies and over the whole region occupied by them. + +On the ninth of August Prince Vasili at Anna Pavlovna's again met +the "man of great merit." The latter was very attentive to Anna +Pavlovna because he wanted to be appointed director of one of the +educational establishments for young ladies. Prince Vasili entered the +room with the air of a happy conqueror who has attained the object +of his desires. + +"Well, have you heard the great news? Prince Kutuzov is field +marshal! All dissensions are at an end! I am so glad, so delighted! At +last we have a man!" said he, glancing sternly and significantly round +at everyone in the drawing room. + +The "man of great merit," despite his desire to obtain the post of +director, could not refrain from reminding Prince Vasili of his former +opinion. Though this was impolite to Prince Vasili in Anna +Pavlovna's drawing room, and also to Anna Pavlovna herself who had +received the news with delight, he could not resist the temptation. + +"But, Prince, they say he is blind!" said he, reminding Prince +Vasili of his own words. + +"Eh? Nonsense! He sees well enough," said Prince Vasili rapidly, +in a deep voice and with a slight cough--the voice and cough with +which he was wont to dispose of all difficulties. + +"He sees well enough," he added. "And what I am so pleased about," +he went on, "is that our sovereign has given him full powers over +all the armies and the whole region--powers no commander in chief ever +had before. He is a second autocrat," he concluded with a victorious +smile. + +"God grant it! God grant it!" said Anna Pavlovna. + +The "man of great merit," who was still a novice in court circles, +wishing to flatter Anna Pavlovna by defending her former position on +this question, observed: + +"It is said that the Emperor was reluctant to give Kutuzov those +powers. They say he blushed like a girl to whom Joconde is read, +when he said to Kutuzov: 'Your Emperor and the Fatherland award you +this honor.'" + +"Perhaps the heart took no part in that speech," said Anna Pavlovna. + +"Oh, no, no!" warmly rejoined Prince Vasili, who would not now yield +Kutuzov to anyone; in his opinion Kutuzov was not only admirable +himself, but was adored by everybody. "No, that's impossible," said +he, "for our sovereign appreciated him so highly before." + +"God grant only that Prince Kutuzov assumes real power and does +not allow anyone to put a spoke in his wheel," observed Anna Pavlovna. + +Understanding at once to whom she alluded, Prince Vasili said in a +whisper: + +"I know for a fact that Kutuzov made it an absolute condition that +the Tsarevich should not be with the army. Do you know what he said to +the Emperor?" + +And Prince Vasili repeated the words supposed to have been spoken by +Kutuzov to the Emperor. "I can neither punish him if he does wrong nor +reward him if he does right." + +"Oh, a very wise man is Prince Kutuzov! I have known him a long +time!" + +"They even say," remarked the "man of great merit" who did not yet +possess courtly tact, "that his excellency made it an express +condition that the sovereign himself should not be with the army." + +As soon as he said this both Prince Vasili and Anna Pavlovna +turned away from him and glanced sadly at one another with a sigh at +his naivete. + + + + + +CHAPTER VII + + +While this was taking place in Petersburg the French had already +passed Smolensk and were drawing nearer and nearer to Moscow. +Napoleon's historian Thiers, like other of his historians, trying to +justify his hero says that he was drawn to the walls of Moscow against +his will. He is as right as other historians who look for the +explanation of historic events in the will of one man; he is as +right as the Russian historians who maintain that Napoleon was drawn +to Moscow by the skill of the Russian commanders. Here besides the law +of retrospection, which regards all the past as a preparation for +events that subsequently occur, the law of reciprocity comes in, +confusing the whole matter. A good chessplayer having lost a game is +sincerely convinced that his loss resulted from a mistake he made +and looks for that mistake in the opening, but forgets that at each +stage of the game there were similar mistakes and that none of his +moves were perfect. He only notices the mistake to which he pays +attention, because his opponent took advantage of it. How much more +complex than this is the game of war, which occurs under certain +limits of time, and where it is not one will that manipulates lifeless +objects, but everything results from innumerable conflicts of +various wills! + +After Smolensk Napoleon sought a battle beyond Dorogobuzh at Vyazma, +and then at Tsarevo-Zaymishche, but it happened that owing to a +conjunction of innumerable circumstances the Russians could not give +battle till they reached Borodino, seventy miles from Moscow. From +Vyazma Napoleon ordered a direct advance on Moscow. + +Moscou, la capitale asiatique de ce grand empire, la ville sacree +des peuples d'Alexandre, Moscou avec ses innombrables eglises en forme +de pagodes chinoises,* this Moscow gave Napoleon's imagination no +rest. On the march from Vyazma to Tsarevo-Zaymishche he rode his light +bay bobtailed ambler accompanied by his Guards, his bodyguard, his +pages, and aides-de-camp. Berthier, his chief of staff, dropped behind +to question a Russian prisoner captured by the cavalry. Followed by +Lelorgne d'Ideville, an interpreter, he overtook Napoleon at a +gallop and reined in his horse with an amused expression. + + +*"Moscow, the Asiatic capital of this great empire, the sacred +city of Alexander's people, Moscow with its innumerable churches +shaped like Chinese pagodas." + + +"Well?" asked Napoleon. + +"One of Platov's Cossacks says that Platov's corps is joining up +with the main army and that Kutuzov has been appointed commander in +chief. He is a very shrewd and garrulous fellow." + +Napoleon smiled and told them to give the Cossack a horse and +bring the man to him. He wished to talk to him himself. Several +adjutants galloped off, and an hour later, Lavrushka, the serf Denisov +had handed over to Rostov, rode up to Napoleon in an orderly's +jacket and on a French cavalry saddle, with a merry, and tipsy face. +Napoleon told him to ride by his side and began questioning him. + +"You are a Cossack?" + +"Yes, a Cossack, your Honor." + +"The Cossack, not knowing in what company he was, for Napoleon's +plain appearance had nothing about it that would reveal to an Oriental +mind the presence of a monarch, talked with extreme familiarity of the +incidents of the war," says Thiers, narrating this episode. In reality +Lavrushka, having got drunk the day before and left his master +dinnerless, had been whipped and sent to the village in quest of +chickens, where he engaged in looting till the French took him +prisoner. Lavrushka was one of those coarse, bare-faced lackeys who +have seen all sorts of things, consider it necessary to do +everything in a mean and cunning way, are ready to render any sort +of service to their master, and are keen at guessing their master's +baser impulses, especially those prompted by vanity and pettiness. + +Finding himself in the company of Napoleon, whose identity he had +easily and surely recognized, Lavrushka was not in the least abashed +but merely did his utmost to gain his new master's favor. + +He knew very well that this was Napoleon, but Napoleon's presence +could no more intimidate him than Rostov's, or a sergeant major's with +the rods, would have done, for he had nothing that either the sergeant +major or Napoleon could deprive him of. + +So he rattled on, telling all the gossip he had heard among the +orderlies. Much of it true. But when Napoleon asked him whether the +Russians thought they would beat Bonaparte or not, Lavrushka screwed +up his eyes and considered. + +In this question he saw subtle cunning, as men of his type see +cunning in everything, so he frowned and did not answer immediately. + +"It's like this," he said thoughtfully, "if there's a battle soon, +yours will win. That's right. But if three days pass, then after that, +well, then that same battle will not soon be over." + +Lelorgne d'Ideville smilingly interpreted this speech to Napoleon +thus: "If a battle takes place within the next three days the French +will win, but if later, God knows what will happen." Napoleon did +not smile, though he was evidently in high good humor, and he +ordered these words to be repeated. + +Lavrushka noticed this and to entertain him further, pretending +not to know who Napoleon was, added: + +"We know that you have Bonaparte and that he has beaten everybody in +the world, but we are a different matter..."--without knowing why or +how this bit of boastful patriotism slipped out at the end. + +The interpreter translated these words without the last phrase, +and Bonaparte smiled. "The young Cossack made his mighty +interlocutor smile," says Thiers. After riding a few paces in silence, +Napoleon turned to Berthier and said he wished to see how the news +that he was talking to the Emperor himself, to that very Emperor who +had written his immortally victorious name on the Pyramids, would +affect this enfant du Don.* + + +*"Child of the Don." + + +The fact was accordingly conveyed to Lavrushka. + +Lavrushka, understanding that this was done to perplex him and +that Napoleon expected him to be frightened, to gratify his new +masters promptly pretended to be astonished and awe-struck, opened his +eyes wide, and assumed the expression he usually put on when taken +to be whipped. "As soon as Napoleon's interpreter had spoken," says +Thiers, "the Cossack, seized by amazement, did not utter another word, +but rode on, his eyes fixed on the conqueror whose fame had reached +him across the steppes of the East. All his loquacity was suddenly +arrested and replaced by a naive and silent feeling of admiration. +Napoleon, after making the Cossack a present, had him set free like +a bird restored to its native fields." + +Napoleon rode on, dreaming of the Moscow that so appealed to his +imagination, and "the bird restored to its native fields" galloped +to our outposts, inventing on the way all that had not taken place but +that he meant to relate to his comrades. What had really taken place +he did not wish to relate because it seemed to him not worth +telling. He found the Cossacks, inquired for the regiment operating +with Platov's detachment and by evening found his master, Nicholas +Rostov, quartered at Yankovo. Rostov was just mounting to go for a +ride round the neighboring villages with Ilyin; he let Lavrushka +have another horse and took him along with him. + + + + + +CHAPTER VIII + + +Princess Mary was not in Moscow and out of danger as Prince Andrew +supposed. + +After the return of Alpatych from Smolensk the old prince suddenly +seemed to awake as from a dream. He ordered the militiamen to be +called up from the villages and armed, and wrote a letter to the +commander in chief informing him that he had resolved to remain at +Bald Hills to the last extremity and to defend it, leaving to the +commander in chief's discretion to take measures or not for the +defense of Bald Hills, where one of Russia's oldest generals would +be captured or killed, and he announced to his household that he would +remain at Bald Hills. + +But while himself remaining, he gave instructions for the +departure of the princess and Dessalles with the little prince to +Bogucharovo and thence to Moscow. Princess Mary, alarmed by her +father's feverish and sleepless activity after his previous apathy, +could not bring herself to leave him alone and for the first time in +her life ventured to disobey him. She refused to go away and her +father's fury broke over her in a terrible storm. He repeated every +injustice he had ever inflicted on her. Trying to convict her, he told +her she had worn him out, had caused his quarrel with his son, had +harbored nasty suspicions of him, making it the object of her life +to poison his existence, and he drove her from his study telling her +that if she did not go away it was all the same to him. He declared +that he did not wish to remember her existence and warned her not to +dare to let him see her. The fact that he did not, as she had +feared, order her to be carried away by force but only told her not to +let him see her cheered Princess Mary. She knew it was a proof that in +the depth of his soul he was glad she was remaining at home and had +not gone away. + +The morning after little Nicholas had left, the old prince donned +his full uniform and prepared to visit the commander in chief. His +caleche was already at the door. Princess Mary saw him walk out of the +house in his uniform wearing all his orders and go down the garden +to review his armed peasants and domestic serfs. She sat by the window +listening to his voice which reached her from the garden. Suddenly +several men came running up the avenue with frightened faces. + +Princess Mary ran out to the porch, down the flower-bordered path, +and into the avenue. A large crowd of militiamen and domestics were +moving toward her, and in their midst several men were supporting by +the armpits and dragging along a little old man in a uniform and +decorations. She ran up to him and, in the play of the sunlight that +fell in small round spots through the shade of the lime-tree avenue, +could not be sure what change there was in his face. All she could see +was that his former stern and determined expression had altered to one +of timidity and submission. On seeing his daughter he moved his +helpless lips and made a hoarse sound. It was impossible to make out +what he wanted. He was lifted up, carried to his study, and laid on +the very couch he had so feared of late. + +The doctor, who was fetched that same night, bled him and said +that the prince had had a seizure paralyzing his right side. + +It was becoming more and more dangerous to remain at Bald Hills, and +next day they moved the prince to Bogucharovo, the doctor accompanying +him. + +By the time they reached Bogucharovo, Dessalles and the little +prince had already left for Moscow. + +For three weeks the old prince lay stricken by paralysis in the +new house Prince Andrew had built at Bogucharovo, ever in the same +state, getting neither better nor worse. He was unconscious and lay +like a distorted corpse. He muttered unceasingly, his eyebrows and +lips twitching, and it was impossible to tell whether he understood +what was going on around him or not. One thing was certain--that he +was suffering and wished to say something. But what it was, no one +could tell: it might be some caprice of a sick and half-crazy man, +or it might relate to public affairs, or possibly to family concerns. + +The doctor said this restlessness did not mean anything and was +due to physical causes; but Princess Mary thought he wished to tell +her something, and the fact that her presence always increased his +restlessness confirmed her opinion. + +He was evidently suffering both physically and mentally. There was +no hope of recovery. It was impossible for him to travel, it would not +do to let him die on the road. "Would it not be better if the end +did come, the very end?" Princess Mary sometimes thought. Night and +day, hardly sleeping at all, she watched him and, terrible to say, +often watched him not with hope of finding signs of improvement but +wishing to find symptoms of the approach of the end. + +Strange as it was to her to acknowledge this feeling in herself, yet +there it was. And what seemed still more terrible to her was that +since her father's illness began (perhaps even sooner, when she stayed +with him expecting something to happen), all the personal desires +and hopes that had been forgotten or sleeping within her had awakened. +Thoughts that had not entered her mind for years--thoughts of a life +free from the fear of her father, and even the possibility of love and +of family happiness--floated continually in her imagination like +temptations of the devil. Thrust them aside as she would, questions +continually recurred to her as to how she would order her life now, +after that. These were temptations of the devil and Princess Mary knew +it. She knew that the sole weapon against him was prayer, and she +tried to pray. She assumed an attitude of prayer, looked at the icons, +repeated the words of a prayer, but she could not pray. She felt +that a different world had now taken possession of her--the life of +a world of strenuous and free activity, quite opposed to the spiritual +world in which till now she had been confined and in which her +greatest comfort had been prayer. She could not pray, could not +weep, and worldly cares took possession of her. + +It was becoming dangerous to remain in Bogucharovo. News of the +approach of the French came from all sides, and in one village, ten +miles from Bogucharovo, a homestead had been looted by French +marauders. + +The doctor insisted on the necessity of moving the prince; the +provincial Marshal of the Nobility sent an official to Princess Mary +to persuade her to get away as quickly as possible, and the head of +the rural police having come to Bogucharovo urged the same thing, +saying that the French were only some twenty-five miles away, that +French proclamations were circulating in the villages, and that if the +princess did not take her father away before the fifteenth, he could +not answer for the consequences. + +The princess decided to leave on the fifteenth. The cares of +preparation and giving orders, for which everyone came to her, +occupied her all day. She spent the night of the fourteenth as +usual, without undressing, in the room next to the one where the +prince lay. Several times, waking up, she heard his groans and +muttering, the creak of his bed, and the steps of Tikhon and the +doctor when they turned him over. Several times she listened at the +door, and it seemed to her that his mutterings were louder than +usual and that they turned him over oftener. She could not sleep and +several times went to the door and listened, wishing to enter but +not deciding to do so. Though he did not speak, Princess Mary saw +and knew how unpleasant every sign of anxiety on his account was to +him. She had noticed with what dissatisfaction he turned from the look +she sometimes involuntarily fixed on him. She knew that her going in +during the night at an unusual hour would irritate him. + +But never had she felt so grieved for him or so much afraid of +losing him. She recalled all her life with him and in every word and +act of his found an expression of his love of her. Occasionally amid +these memories temptations of the devil would surge into her +imagination: thoughts of how things would be after his death, and +how her new, liberated life would be ordered. But she drove these +thoughts away with disgust. Toward morning he became quiet and she +fell asleep. + +She woke late. That sincerity which often comes with waking showed +her clearly what chiefly concerned her about her father's illness. +On waking she listened to what was going on behind the door and, +hearing him groan, said to herself with a sigh that things were +still the same. + +"But what could have happened? What did I want? I want his death!" +she cried with a feeling of loathing for herself. + +She washed, dressed, said her prayers, and went out to the porch. In +front of it stood carriages without horses and things were being +packed into the vehicles. + +It was a warm, gray morning. Princess Mary stopped at the porch, +still horrified by her spiritual baseness and trying to arrange her +thoughts before going to her father. The doctor came downstairs and +went out to her. + +"He is a little better today," said he. "I was looking for you. +One can make out something of what he is saying. His head is +clearer. Come in, he is asking for you..." + +Princess Mary's heart beat so violently at this news that she grew +pale and leaned against the wall to keep from falling. To see him, +talk to him, feel his eyes on her now that her whole soul was +overflowing with those dreadful, wicked temptations, was a torment +of joy and terror. + +"Come," said the doctor. + +Princess Mary entered her father's room and went up to his bed. He +was lying on his back propped up high, and his small bony hands with +their knotted purple veins were lying on the quilt; his left eye gazed +straight before him, his right eye was awry, and his brows and lips +motionless. He seemed altogether so thin, small, and pathetic. His +face seemed to have shriveled or melted; his features had grown +smaller. Princess Mary went up and kissed his hand. His left hand +pressed hers so that she understood that he had long been waiting +for her to come. He twitched her hand, and his brows and lips quivered +angrily. + +She looked at him in dismay trying to guess what he wanted of her. +When she changed her position so that his left eye could see her +face he calmed down, not taking his eyes off her for some seconds. +Then his lips and tongue moved, sounds came, and he began to speak, +gazing timidly and imploringly at her, evidently afraid that she might +not understand. + +Straining all her faculties Princess Mary looked at him. The comic +efforts with which he moved his tongue made her drop her eyes and with +difficulty repress the sobs that rose to her throat. He said +something, repeating the same words several times. She could not +understand them, but tried to guess what he was saying and inquiringly +repeated the words he uttered. + +"Mmm...ar...ate...ate..." he repeated several times. + +It was quite impossible to understand these sounds. The doctor +thought he had guessed them, and inquiringly repeated: "Mary, are +you afraid?" The prince shook his head, again repeated the same +sounds. + +"My mind, my mind aches?" questioned Princess Mary. + +He made a mumbling sound in confirmation of this, took her hand, and +began pressing it to different parts of his breast as if trying to +find the right place for it. + +"Always thoughts... about you... thoughts..." he then uttered much +more clearly than he had done before, now that he was sure of being +understood. + +Princess Mary pressed her head against his hand, trying to hide +her sobs and tears. + +He moved his hand over her hair. + +"I have been calling you all night..." he brought out. + +"If only I had known..." she said through her tears. "I was afraid +to come in." + +He pressed her hand. + +"Weren't you asleep?" + +"No, I did not sleep," said Princess Mary, shaking her head. + +Unconsciously imitating her father, she now tried to express herself +as he did, as much as possible by signs, and her tongue too seemed +to move with difficulty. + +"Dear one... Dearest..." Princess Mary could not quite make out what +he had said, but from his look it was clear that he had uttered a +tender caressing word such as he had never used to her before. "Why +didn't you come in?" + +"And I was wishing for his death!" thought Princess Mary. + +He was silent awhile. + +"Thank you... daughter dear!... for all, for all... forgive!... +thank you!... forgive!... thank you!..." and tears began to flow +from his eyes. "Call Andrew!" he said suddenly, and a childish, +timid expression of doubt showed itself on his face as he spoke. + +He himself seemed aware that his demand was meaningless. So at least +it seemed to Princess Mary. + +"I have a letter from him," she replied. + +He glanced at her with timid surprise. + +"Where is he?" + +"He's with the army, Father, at Smolensk." + +He closed his eyes and remained silent a long time. Then as if in +answer to his doubts and to confirm the fact that now he understood +and remembered everything, he nodded his head and reopened his eyes. + +"Yes," he said, softly and distinctly. "Russia has perished. They've +destroyed her." + +And he began to sob, and again tears flowed from his eyes. +Princess Mary could no longer restrain herself and wept while she +gazed at his face. + +Again he closed his eyes. His sobs ceased, he pointed to his eyes, +and Tikhon, understanding him, wiped away the tears. + +Then he again opened his eyes and said something none of them +could understand for a long time, till at last Tikhon understood and +repeated it. Princess Mary had sought the meaning of his words in +the mood in which he had just been speaking. She thought he was +speaking of Russia, or Prince Andrew, of herself, of his grandson, +or of his own death, and so she could not guess his words. + +"Put on your white dress. I like it," was what he said. + +Having understood this Princess Mary sobbed still louder, and the +doctor taking her arm led her out to the veranda, soothing her and +trying to persuade her to prepare for her journey. When she had left +the room the prince again began speaking about his son, about the war, +and about the Emperor, angrily twitching his brows and raising his +hoarse voice, and then he had a second and final stroke. + +Princess Mary stayed on the veranda. The day had cleared, it was hot +and sunny. She could understand nothing, think of nothing and feel +nothing, except passionate love for her father, love such as she +thought she had never felt till that moment. She ran out sobbing +into the garden and as far as the pond, along the avenues of young +lime trees Prince Andrew had planted. + +"Yes... I... I... I wished for his death! Yes, I wanted it to end +quicker.... I wished to be at peace.... And what will become of me? +What use will peace be when he is no longer here?" Princess Mary +murmured, pacing the garden with hurried steps and pressing her +hands to her bosom which heaved with convulsive sobs. + +When she had completed the tour of the garden, which brought her +again to the house, she saw Mademoiselle Bourienne--who had remained +at Bogucharovo and did not wish to leave it--coming toward her with +a stranger. This was the Marshal of the Nobility of the district, +who had come personally to point out to the princess the necessity for +her prompt departure. Princess Mary listened without understanding +him; she led him to the house, offered him lunch, and sat down with +him. Then, excusing herself, she went to the door of the old +prince's room. The doctor came out with an agitated face and said +she could not enter. + +"Go away, Princess! Go away... go away!" + +She returned to the garden and sat down on the grass at the foot +of the slope by the pond, where no one could see her. She did not know +how long she had been there when she was aroused by the sound of a +woman's footsteps running along the path. She rose and saw Dunyasha +her maid, who was evidently looking for her, and who stopped +suddenly as if in alarm on seeing her mistress. + +"Please come, Princess... The Prince," said Dunyasha in a breaking +voice. + +"Immediately, I'm coming, I'm coming!" replied the princess +hurriedly, not giving Dunyasha time to finish what she was saying, and +trying to avoid seeing the girl she ran toward the house. + +"Princess, it's God's will! You must be prepared for everything," +said the Marshal, meeting her at the house door. + +"Let me alone; it's not true!" she cried angrily to him. + +The doctor tried to stop her. She pushed him aside and ran to her +father's door. "Why are these people with frightened faces stopping +me? I don't want any of them! And what are they doing here?" she +thought. She opened the door and the bright daylight in that +previously darkened room startled her. In the room were her nurse +and other women. They all drew back from the bed, making way for +her. He was still lying on the bed as before, but the stern expression +of his quiet face made Princess Mary stop short on the threshold. + +"No, he's not dead--it's impossible!" she told herself and +approached him, and repressing the terror that seized her, she pressed +her lips to his cheek. But she stepped back immediately. All the force +of the tenderness she had been feeling for him vanished instantly +and was replaced by a feeling of horror at what lay there before +her. "No, he is no more! He is not, but here where he was is something +unfamiliar and hostile, some dreadful, terrifying, and repellent +mystery!" And hiding her face in her hands, Princess Mary sank into +the arms of the doctor, who held her up. + + +In the presence of Tikhon and the doctor the women washed what had +been the prince, tied his head up with a handkerchief that the mouth +should not stiffen while open, and with another handkerchief tied +together the legs that were already spreading apart. Then they dressed +him in uniform with his decorations and placed his shriveled little +body on a table. Heaven only knows who arranged all this and when, but +it all got done as if of its own accord. Toward night candles were +burning round his coffin, a pall was spread over it, the floor was +strewn with sprays of juniper, a printed band was tucked in under +his shriveled head, and in a corner of the room sat a chanter +reading the psalms. + +Just as horses shy and snort and gather about a dead horse, so the +inmates of the house and strangers crowded into the drawing room round +the coffin--the Marshal, the village Elder, peasant women--and all +with fixed and frightened eyes, crossing themselves, bowed and +kissed the old prince's cold and stiffened hand. + + + + + +CHAPTER IX + + +Until Prince Andrew settled in Bogucharovo its owners had always +been absentees, and its peasants were of quite a different character +from those of Bald Hills. They differed from them in speech, dress, +and disposition. They were called steppe peasants. The old prince used +to approve of them for their endurance at work when they came to +Bald Hills to help with the harvest or to dig ponds, and ditches, +but he disliked them for their boorishness. + +Prince Andrew's last stay at Bogucharovo, when he introduced +hospitals and schools and reduced the quitrent the peasants had to +pay, had not softened their disposition but had on the contrary +strengthened in them the traits of character the old prince called +boorishness. Various obscure rumors were always current among them: at +one time a rumor that they would all be enrolled as Cossacks; at +another of a new religion to which they were all to be converted; then +of some proclamation of the Tsar's and of an oath to the Tsar Paul +in 1797 (in connection with which it was rumored that freedom had been +granted them but the landowners had stopped it), then of Peter +Fedorovich's return to the throne in seven years' time, when +everything would be made free and so "simple" that there would be no +restrictions. Rumors of the war with Bonaparte and his invasion were +connected in their minds with the same sort of vague notions of +Antichrist, the end of the world, and "pure freedom." + +In the vicinity of Bogucharovo were large villages belonging to +the crown or to owners whose serfs paid quitrent and could work +where they pleased. There were very few resident landlords in the +neighborhood and also very few domestic or literate serfs, and in +the lives of the peasantry of those parts the mysterious undercurrents +in the life of the Russian people, the causes and meaning of which are +so baffling to contemporaries, were more clearly and strongly +noticeable than among others. One instance, which had occurred some +twenty years before, was a movement among the peasants to emigrate +to some unknown "warm rivers." Hundreds of peasants, among them the +Bogucharovo folk, suddenly began selling their cattle and moving in +whole families toward the southeast. As birds migrate to somewhere +beyond the sea, so these men with their wives and children streamed to +the southeast, to parts where none of them had ever been. They set off +in caravans, bought their freedom one by one or ran away, and drove or +walked toward the "warm rivers." Many of them were punished, some sent +to Siberia, many died of cold and hunger on the road, many returned of +their own accord, and the movement died down of itself just as it +had sprung up, without apparent reason. But such undercurrents still +existed among the people and gathered new forces ready to manifest +themselves just as strangely, unexpectedly, and at the same time +simply, naturally, and forcibly. Now in 1812, to anyone living in +close touch with these people it was apparent that these undercurrents +were acting strongly and nearing an eruption. + +Alpatych, who had reached Bogucharovo shortly before the old +prince's death, noticed an agitation among the peasants, and that +contrary to what was happening in the Bald Hills district, where +over a radius of forty miles all the peasants were moving away and +leaving their villages to be devastated by the Cossacks, the +peasants in the steppe region round Bogucharovo were, it was +rumored, in touch with the French, received leaflets from them that +passed from hand to hand, and did not migrate. He learned from +domestic serfs loyal to him that the peasant Karp, who possessed great +influence in the village commune and had recently been away driving +a government transport, had returned with news that the Cossacks +were destroying deserted villages, but that the French did not harm +them. Alpatych also knew that on the previous day another peasant +had even brought from the village of Visloukhovo, which was occupied +by the French, a proclamation by a French general that no harm would +be done to the inhabitants, and if they remained they would be paid +for anything taken from them. As proof of this the peasant had brought +from Visloukhovo a hundred rubles in notes (he did not know that +they were false) paid to him in advance for hay. + +More important still, Alpatych learned that on the morning of the +very day he gave the village Elder orders to collect carts to move the +princess' luggage from Bogucharovo, there had been a village meeting +at which it had been decided not to move but to wait. Yet there was no +time to waste. On the fifteenth, the day of the old prince's death, +the Marshal had insisted on Princess Mary's leaving at once, as it was +becoming dangerous. He had told her that after the sixteenth he +could not be responsible for what might happen. On the evening of +the day the old prince died the Marshal went away, promising to return +next day for the funeral. But this he was unable to do, for he +received tidings that the French had unexpectedly advanced, and had +barely time to remove his own family and valuables from his estate. + +For some thirty years Bogucharovo had been managed by the village +Elder, Dron, whom the old prince called by the diminutive "Dronushka." + +Dron was one of those physically and mentally vigorous peasants +who grow big beards as soon as they are of age and go on unchanged +till they are sixty or seventy, without a gray hair or the loss of a +tooth, as straight and strong at sixty as at thirty. + +Soon after the migration to the "warm rivers," in which he had taken +part like the rest, Dron was made village Elder and overseer of +Bogucharovo, and had since filled that post irreproachably for +twenty-three years. The peasants feared him more than they did their +master. The masters, both the old prince and the young, and the +steward respected him and jestingly called him "the Minister." +During the whole time of his service Dron had never been drunk or ill, +never after sleepless nights or the hardest tasks had he shown the +least fatigue, and though he could not read he had never forgotten a +single money account or the number of quarters of flour in any of +the endless cartloads he sold for the prince, nor a single shock of +the whole corn crop on any single acre of the Bogucharovo fields. + +Alpatych, arriving from the devastated Bald Hills estate, sent for +his Dron on the day of the prince's funeral and told him to have +twelve horses got ready for the princess' carriages and eighteen carts +for the things to be removed from Bogucharovo. Though the peasants +paid quitrent, Alpatych thought no difficulty would be made about +complying with this order, for there were two hundred and thirty +households at work in Bogucharovo and the peasants were well to do. +But on hearing the order Dron lowered his eyes and remained silent. +Alpatych named certain peasants he knew, from whom he told him to take +the carts. + +Dron replied that the horses of these peasants were away carting. +Alpatych named others, but they too, according to Dron, had no +horses available: some horses were carting for the government, +others were too weak, and others had died for want of fodder. It +seemed that no horses could be had even for the carriages, much less +for the carting. + +Alpatych looked intently at Dron and frowned. Just as Dron was a +model village Elder, so Alpatych had not managed the prince's +estates for twenty years in vain. He a model steward, possessing in +the highest degree the faculty of divining the needs and instincts +of those he dealt with. Having glanced at Dron he at once understood +that his answers did not express his personal views but the general +mood of the Bogucharovo commune, by which the Elder had already been +carried away. But he also knew that Dron, who had acquired property +and was hated by the commune, must be hesitating between the two +camps: the masters' and the serfs'. He noticed this hesitation in +Dron's look and therefore frowned and moved closer up to him. + +"Now just listen, Dronushka," said he. "Don't talk nonsense to me. +His excellency Prince Andrew himself gave me orders to move all the +people away and not leave them with the enemy, and there is an order +from the Tsar about it too. Anyone who stays is a traitor to the Tsar. +Do you hear?" + +"I hear," Dron answered without lifting his eyes. + +Alpatych was not satisfied with this reply. + +"Eh, Dron, it will turn out badly!" he said, shaking his head. + +"The power is in your hands," Dron rejoined sadly. + +"Eh, Dron, drop it!" Alpatych repeated, withdrawing his hand from +his bosom and solemnly pointing to the floor at Dron's feet. "I can +see through you and three yards into the ground under you," he +continued, gazing at the floor in front of Dron. + +Dron was disconcerted, glanced furtively at Alpatych and again +lowered his eyes. + +"You drop this nonsense and tell the people to get ready to leave +their homes and go to Moscow and to get carts ready for tomorrow +morning for the princess' things. And don't go to any meeting +yourself, do you hear?" + +Dron suddenly fell on his knees. + +"Yakov Alpatych, discharge me! Take the keys from me and discharge +me, for Christ's sake!" + +"Stop that!" cried Alpatych sternly. "I see through you and three +yards under you," he repeated, knowing that his skill in beekeeping, +his knowledge of the right time to sow the oats, and the fact that +he had been able to retain the old prince's favor for twenty years had +long since gained him the reputation of being a wizard, and that the +power of seeing three yards under a man is considered an attribute +of wizards. + +Dron got up and was about to say something, but Alpatych interrupted +him. + +"What is it you have got into your heads, eh?... What are you +thinking of, eh?" + +"What am I to do with the people?" said Dron. "They're quite +beside themselves; I have already told them..." + +"'Told them,' I dare say!" said Alpatych. "Are they drinking?" he +asked abruptly. + +"Quite beside themselves, Yakov Alpatych; they've fetched another +barrel." + +"Well, then, listen! I'll go to the police officer, and you tell +them so, and that they must stop this and the carts must be got +ready." + +"I understand." + +Alpatych did not insist further. He had managed people for a long +time and knew that the chief way to make them obey is to show no +suspicion that they can possibly disobey. Having wrung a submissive "I +understand" from Dron, Alpatych contented himself with that, though he +not only doubted but felt almost certain that without the help of +troops the carts would not be forthcoming. + +And so it was, for when evening came no carts had been provided. +In the village, outside the drink shop, another meeting was being +held, which decided that the horses should be driven out into the +woods and the carts should not be provided. Without saying anything of +this to the princess, Alpatych had his own belongings taken out of the +carts which had arrived from Bald Hills and had those horses got ready +for the princess' carriages. Meanwhile he went himself to the police +authorities. + + + + + +CHAPTER X + + +After her father's funeral Princess Mary shut herself up in her room +and did not admit anyone. A maid came to the door to say that Alpatych +was asking for orders about their departure. (This was before his talk +with Dron.) Princess Mary raised herself on the sofa on which she +had been lying and replied through the closed door that she did not +mean to go away and begged to be left in peace. + +The windows of the room in which she was lying looked westward. +She lay on the sofa with her face to the wall, fingering the buttons +of the leather cushion and seeing nothing but that cushion, and her +confused thoughts were centered on one subject--the irrevocability +of death and her own spiritual baseness, which she had not +suspected, but which had shown itself during her father's illness. She +wished to pray but did not dare to, dared not in her present state +of mind address herself to God. She lay for a long time in that +position. + +The sun had reached the other side of the house, and its slanting +rays shone into the open window, lighting up the room and part of +the morocco cushion at which Princess Mary was looking. The flow of +her thoughts suddenly stopped. Unconsciously she sat up, smoothed +her hair, got up, and went to the window, involuntarily inhaling the +freshness of the clear but windy evening. + +"Yes, you can well enjoy the evening now! He is gone and no one will +hinder you," she said to herself, and sinking into a chair she let her +head fall on the window sill. + +Someone spoke her name in a soft and tender voice from the garden +and kissed her head. She looked up. It was Mademoiselle Bourienne in a +black dress and weepers. She softly approached Princess Mary, +sighed, kissed her, and immediately began to cry. The princess +looked up at her. All their former disharmony and her own jealousy +recurred to her mind. But she remembered too how he had changed of +late toward Mademoiselle Bourienne and could not bear to see her, +thereby showing how unjust were the reproaches Princess Mary had +mentally addressed to her. "Besides, is it for me, for me who +desired his death, to condemn anyone?" she thought. + +Princess Mary vividly pictured to herself the position of +Mademoiselle Bourienne, whom she had of late kept at a distance, but +who yet was dependent on her and living in her house. She felt sorry +for her and held out her hand with a glance of gentle inquiry. +Mademoiselle Bourienne at once began crying again and kissed that +hand, speaking of the princess' sorrow and making herself a partner in +it. She said her only consolation was the fact that the princess +allowed her to share her sorrow, that all the old misunderstandings +should sink into nothing but this great grief; that she felt herself +blameless in regard to everyone, and that he, from above, saw her +affection and gratitude. The princess heard her, not heeding her words +but occasionally looking up at her and listening to the sound of her +voice. + +"Your position is doubly terrible, dear princess," said Mademoiselle +Bourienne after a pause. "I understand that you could not, and cannot, +think of yourself, but with my love for you I must do so.... Has +Alpatych been to you? Has he spoken to you of going away?" she asked. + +Princess Mary did not answer. She did not understand who was to go +or where to. "Is it possible to plan or think of anything now? Is it +not all the same?" she thought, and did not reply. + +"You know, chere Marie," said Mademoiselle Bourienne, "that we are +in danger--are surrounded by the French. It would be dangerous to move +now. If we go we are almost sure to be taken prisoners, and God +knows..." + +Princess Mary looked at her companion without understanding what she +was talking about. + +"Oh, if anyone knew how little anything matters to me now," she +said. "Of course I would on no account wish to go away from him.... +Alpatych did say something about going.... Speak to him; I can do +nothing, nothing, and don't want to...." + +"I've spoken to him. He hopes we should be in time to get away +tomorrow, but I think it would now be better to stay here," said +Mademoiselle Bourienne. "Because, you will agree, chere Marie, to fall +into the hands of the soldiers or of riotous peasants would be +terrible." + +Mademoiselle Bourienne took from her reticule a proclamation (not +printed on ordinary Russian paper) of General Rameau's, telling people +not to leave their homes and that the French authorities would +afford them proper protection. She handed this to the princess. + +"I think it would be best to appeal to that general," she continued, +"and and am sure that all due respect would be shown you." + +Princess Mary read the paper, and her face began to quiver with +stifled sobs. + +"From whom did you get this?" she asked. + +"They probably recognized that I am French, by my name," replied +Mademoiselle Bourienne blushing. + +Princess Mary, with the paper in her hand, rose from the window +and with a pale face went out of the room and into what had been +Prince Andrew's study. + +"Dunyasha, send Alpatych, or Dronushka, or somebody to me!" she +said, "and tell Mademoiselle Bourienne not to come to me," she +added, hearing Mademoiselle Bourienne's voice. "We must go at once, at +once!" she said, appalled at the thought of being left in the hands of +the French. + +"If Prince Andrew heard that I was in the power of the French! +That I, the daughter of Prince Nicholas Bolkonski, asked General +Rameau for protection and accepted his favor!" This idea horrified +her, made her shudder, blush, and feel such a rush of anger and +pride as she had never experienced before. All that was distressing, +and especially all that was humiliating, in her position rose +vividly to her mind. "They, the French, would settle in this house: M. +le General Rameau would occupy Prince Andrew's study and amuse himself +by looking through and reading his letters and papers. Mademoiselle +Bourienne would do the honors of Bogucharovo for him. I should be +given a small room as a favor, the soldiers would violate my +father's newly dug grave to steal his crosses and stars, they would +tell me of their victories over the Russians, and would pretend to +sympathize with my sorrow..." thought Princess Mary, not thinking +her own thoughts but feeling bound to think like her father and her +brother. For herself she did not care where she remained or what +happened to her, but she felt herself the representative of her dead +father and of Prince Andrew. Involuntarily she thought their +thoughts and felt their feelings. What they would have said and what +they would have done she felt bound to say and do. She went into +Prince Andrew's study, trying to enter completely into his ideas, +and considered her position. + +The demands of life, which had seemed to her annihilated by her +father's death, all at once rose before her with a new, previously +unknown force and took possession of her. + +Agitated and flushed she paced the room, sending now for Michael +Ivanovich and now for Tikhon or Dron. Dunyasha, the nurse, and the +other maids could not say in how far Mademoiselle Bourienne's +statement was correct. Alpatych was not at home, he had gone to the +police. Neither could the architect Michael Ivanovich, who on being +sent for came in with sleepy eyes, tell Princess Mary anything. With +just the same smile of agreement with which for fifteen years he had +been accustomed to answer the old prince without expressing views of +his own, he now replied to Princess Mary, so that nothing definite +could be got from his answers. The old valet Tikhon, with sunken, +emaciated face that bore the stamp of inconsolable grief, replied: +"Yes, Princess" to all Princess Mary's questions and hardly +refrained from sobbing as he looked at her. + +At length Dron, the village Elder, entered the room and with a +deep bow to Princess Mary came to a halt by the doorpost. + +Princess Mary walked up and down the room and stopped in front of +him. + +"Dronushka," she said, regarding as a sure friend this Dronushka who +always used to bring a special kind of gingerbread from his visit to +the fair at Vyazma every year and smilingly offer it to her, +"Dronushka, now since our misfortune..." she began, but could not go +on. + +"We are all in God's hands," said he, with a sigh. + +They were silent for a while. + +"Dronushka, Alpatych has gone off somewhere and I have no one to +turn to. Is true, as they tell me, that I can't even go away?" + +"Why shouldn't you go away, your excellency? You can go," said Dron. + +"I was told it would be dangerous because of the enemy. Dear friend, +I can do nothing. I understand nothing. I have nobody! I want to go +away tonight or early tomorrow morning." + +Dron paused. He looked askance at Princess Mary and said: "There are +no horses; I told Yakov Alpatych so." + +"Why are there none?" asked the princess. + +"It's all God's scourge," said Dron. "What horses we had have been +taken for the army or have died--this is such a year! It's not a +case of feeding horses--we may die of hunger ourselves! As it is, some +go three days without eating. We've nothing, we've been ruined." + +Princess Mary listened attentively to what he told her. + +"The peasants are ruined? They have no bread?" she asked. + +"They're dying of hunger," said Dron. "It's not a case of carting." + +"But why didn't you tell me, Dronushka? Isn't it possible to help +them? I'll do all I can...." + +To Princess Mary it was strange that now, at a moment when such +sorrow was filling her soul, there could be rich people and poor, +and the rich could refrain from helping the poor. She had heard +vaguely that there was such a thing as "landlord's corn" which was +sometimes given to the peasants. She also knew that neither her father +nor her brother would refuse to help the peasants in need, she only +feared to make some mistake in speaking about the distribution of +the grain she wished to give. She was glad such cares presented +themselves, enabling her without scruple to forget her own grief. +She began asking Dron about the peasants' needs and what there was +in Bogucharovo that belonged to the landlord. + +"But we have grain belonging to my brother?" she said. + +"The landlord's grain is all safe," replied Dron proudly. "Our +prince did not order it to be sold." + +"Give it to the peasants, let them have all they need; I give you +leave in my brother's name," said she. + +Dron made no answer but sighed deeply. + +"Give them that corn if there is enough of it. Distribute it all. +I give this order in my brother's name; and tell them that what is +ours is theirs. We do not grudge them anything. Tell them so." + +Dron looked intently at the princess while she was speaking. + +"Discharge me, little mother, for God's sake! Order the keys to be +taken from me," said he. "I have served twenty-three years and have +done no wrong. Discharge me, for God's sake!" + +Princess Mary did not understand what he wanted of her or why he was +asking to be discharged. She replied that she had never doubted his +devotion and that she was ready to do anything for him and for the +peasants. + + + + + +CHAPTER XI + + +An hour later Dunyasha came to tell the princess that Dron had come, +and all the peasants had assembled at the barn by the princess' +order and wished to have word with their mistress. + +"But I never told them to come," said Princess Mary. "I only told +Dron to let them have the grain." + +"Only, for God's sake, Princess dear, have them sent away and +don't go out to them. It's all a trick," said Dunyasha, "and when +Yakov Alpatych returns let us get away... and please don't..." + +"What is a trick?" asked Princess Mary in surprise. + +"I know it is, only listen to me for God's sake! Ask nurse too. They +say they don't agree to leave Bogucharovo as you ordered." + +"You're making some mistake. I never ordered them to go away," +said Princess Mary. "Call Dronushka." + +Dron came and confirmed Dunyasha's words; the peasants had come by +the princess' order. + +"But I never sent for them," declared the princess. "You must have +given my message wrong. I only said that you were to give them the +grain." + +Dron only sighed in reply. + +"If you order it they will go away," said he. + +"No, no. I'll go out to them," said Princess Mary, and in spite of +the nurse's and Dunyasha's protests she went out into the porch; Dron, +Dunyasha, the nurse, and Michael Ivanovich following her. + +"They probably think I am offering them the grain to bribe them to +remain here, while I myself go away leaving them to the mercy of the +French," thought Princess Mary. "I will offer them monthly rations and +housing at our Moscow estate. I am sure Andrew would do even more in +my place," she thought as she went out in the twilight toward the +crowd standing on the pasture by the barn. + +The men crowded closer together, stirred, and rapidly took off their +hats. Princess Mary lowered her eyes and, tripping over her skirt, +came close up to them. So many different eyes, old and young, were +fixed on her, and there were so many different faces, that she could +not distinguish any of them and, feeling that she must speak to them +all at once, did not know how to do it. But again the sense that she +represented her father and her brother gave her courage, and she +boldly began her speech. + +"I am very glad you have come," she said without raising her eyes, +and feeling her heart beating quickly and violently. "Dronushka +tells me that the war has ruined you. That is our common misfortune, +and I shall grudge nothing to help you. I am myself going away because +it is dangerous here... the enemy is near... because... I am giving +you everything, my friends, and I beg you to take everything, all +our grain, so that you may not suffer want! And if you have been +told that I am giving you the grain to keep you here--that is not +true. On the contrary, I ask you to go with all your belongings to our +estate near Moscow, and I promise you I will see to it that there +you shall want for nothing. You shall be given food and lodging." + +The princess stopped. Sighs were the only sound heard in the crowd. + +"I am not doing this on my own account," she continued, "I do it +in the name of my dead father, who was a good master to you, and of my +brother and his son." + +Again she paused. No one broke the silence. + +"Ours is a common misfortune and we will share it together. All that +is mine is yours," she concluded, scanning the faces before her. + +All eyes were gazing at her with one and the same expression. She +could not fathom whether it was curiosity, devotion, gratitude, or +apprehension and distrust--but the expression on all the faces was +identical. + +"We are all very thankful for your bounty, but it won't do for us to +take the landlord's grain," said a voice at the back of the crowd. + +"But why not?" asked the princess. + +No one replied and Princess Mary, looking round at the crowd, +found that every eye she met now was immediately dropped. + +"But why don't you want to take it?" she asked again. + +No one answered. + +The silence began to oppress the princess and she tried to catch +someone's eye. + +"Why don't you speak?" she inquired of a very old man who stood just +in front of her leaning on his stick. "If you think something more +is wanted, tell me! I will do anything," said she, catching his eye. + +But as if this angered him, he bent his head quite low and muttered: + +"Why should we agree? We don't want the grain." + +"Why should we give up everything? We don't agree. Don't agree.... +We are sorry for you, but we're not willing. Go away yourself, +alone..." came from various sides of the crowd. + +And again all the faces in that crowd bore an identical +expression, though now it was certainly not an expression of curiosity +or gratitude, but of angry resolve. + +"But you can't have understood me," said Princess Mary with a sad +smile. "Why don't you want to go? I promise to house and feed you, +while here the enemy would ruin you..." + +But her voice was drowned by the voices of the crowd. + +"We're not willing. Let them ruin us! We won't take your grain. We +don't agree." + +Again Princess Mary tried to catch someone's eye, but not a single +eye in the crowd was turned to her; evidently they were all trying +to avoid her look. She felt strange and awkward. + +"Oh yes, an artful tale! Follow her into slavery! Pull down your +houses and go into bondage! I dare say! 'I'll give you grain, indeed!' +she says," voices in the crowd were heard saying. + +With drooping head Princess Mary left the crowd and went back to the +house. Having repeated her order to Dron to have horses ready for +her departure next morning, she went to her room and remained alone +with her own thoughts. + + + + + +CHAPTER XII + + +For a long time that night Princess Mary sat by the open window of +her room hearing the sound of the peasants' voices that reached her +from the village, but it was not of them she was thinking. She felt +that she could not understand them however much she might think +about them. She thought only of one thing, her sorrow, which, after +the break caused by cares for the present, seemed already to belong to +the past. Now she could remember it and weep or pray. + +After sunset the wind had dropped. The night was calm and fresh. +Toward midnight the voices began to subside, a cock crowed, the full +moon began to show from behind the lime trees, a fresh white dewy mist +began to rise, and stillness reigned over the village and the house. + +Pictures of the near past--her father's illness and last moments- +rose one after another to her memory. With mournful pleasure she now +lingered over these images, repelling with horror only the last one, +the picture of his death, which she felt she could not contemplate +even in imagination at this still and mystic hour of night. And +these pictures presented themselves to her so clearly and in such +detail that they seemed now present, now past, and now future. + +She vividly recalled the moment when he had his first stroke and was +being dragged along by his armpits through the garden at Bald Hills, +muttering something with his helpless tongue, twitching his gray +eyebrows and looking uneasily and timidly at her. + +"Even then he wanted to tell me what he told me the day he died," +she thought. "He had always thought what he said then." And she +recalled in all its detail the night at Bald Hills before he had the +last stroke, when with a foreboding of disaster she had remained at +home against his will. She had not slept and had stolen downstairs +on tiptoe, and going to the door of the conservatory where he slept +that night had listened at the door. In a suffering and weary voice he +was saying something to Tikhon, speaking of the Crimea and its warm +nights and of the Empress. Evidently he had wanted to talk. "And why +didn't he call me? Why didn't he let me be there instead of Tikhon?" +Princess Mary had thought and thought again now. "Now he will never +tell anyone what he had in his soul. Never will that moment return for +him or for me when he might have said all he longed to say, and not +Tikhon but I might have heard and understood him. Why didn't I enter +the room?" she thought. "Perhaps he would then have said to me what he +said the day he died. While talking to Tikhon he asked about me twice. +He wanted to see me, and I was standing close by, outside the door. It +was sad and painful for him to talk to Tikhon who did not understand +him. I remember how he began speaking to him about Lise as if she were +alive--he had forgotten she was dead--and Tikhon reminded him that she +was no more, and he shouted, 'Fool!' He was greatly depressed. From +behind the door I heard how he lay down on his bed groaning and loudly +exclaimed, 'My God!' Why didn't I go in then? What could he have +done to me? What could I have lost? And perhaps he would then have +been comforted and would have said that word to me." And Princess Mary +uttered aloud the caressing word he had said to her on the day of +his death. "Dear-est!" she repeated, and began sobbing, with tears +that relieved her soul. She now saw his face before her. And not the +face she had known ever since she could remember and had always seen +at a distance, but the timid, feeble face she had seen for the first +time quite closely, with all its wrinkles and details, when she +stooped near to his mouth to catch what he said. + +"Dear-est!" she repeated again. + +"What was he thinking when he uttered that word? What is he thinking +now?" This question suddenly presented itself to her, and in answer +she saw him before her with the expression that was on his face as +he lay in his coffin with his chin bound up with a white handkerchief. +And the horror that had seized her when she touched him and +convinced herself that that was not he, but something mysterious and +horrible, seized her again. She tried to think of something else and +to pray, but could do neither. With wide-open eyes she gazed at the +moonlight and the shadows, expecting every moment to see his dead +face, and she felt that the silence brooding over the house and within +it held her fast. + +"Dunyasha," she whispered. "Dunyasha!" she screamed wildly, and +tearing herself out of this silence she ran to the servants' +quarters to meet her old nurse and the maidservants who came running +toward her. + + + + + +CHAPTER XIII + + +On the seventeenth of August Rostov and Ilyin, accompanied by +Lavrushka who had just returned from captivity and by an hussar +orderly, left their quarters at Yankovo, ten miles from Bogucharovo, +and went for a ride--to try a new horse Ilyin had bought and to find +out whether there was any hay to be had in the villages. + +For the last three days Bogucharovo had lain between the two hostile +armies, so that it was as easy for the Russian rearguard to get to +it as for the French vanguard; Rostov, as a careful squadron +commander, wished to take such provisions as remained at Bogucharovo +before the French could get them. + +Rostov and Ilyin were in the merriest of moods. On the way to +Bogucharovo, a princely estate with a dwelling house and farm where +they hoped to find many domestic serfs and pretty girls, they +questioned Lavrushka about Napoleon and laughed at his stories, and +raced one another to try Ilyin's horse. + +Rostov had no idea that the village he was entering was the property +of that very Bolkonski who had been engaged to his sister. + +Rostov and Ilyin gave rein to their horses for a last race along the +incline before reaching Bogucharovo, and Rostov, outstripping Ilyin, +was the first to gallop into the village street. + +"You're first!" cried Ilyin, flushed. + +"Yes, always first both on the grassland and here," answered Rostov, +stroking his heated Donets horse. + +"And I'd have won on my Frenchy, your excellency," said Lavrushka +from behind, alluding to his shabby cart horse, "only I didn't wish to +mortify you." + +They rode at a footpace to the barn, where a large crowd of peasants +was standing. + +Some of the men bared their heads, others stared at the new arrivals +without doffing their caps. Two tall old peasants with wrinkled +faces and scanty beards emerged from the tavern, smiling, +staggering, and singing some incoherent song, and approached the +officers. + +"Fine fellows!" said Rostov laughing. "Is there any hay here?" + +"And how like one another," said Ilyin. + +"A mo-o-st me-r-r-y co-o-m-pa...!" sang one of the peasants with a +blissful smile. + +One of the men came out of the crowd and went up to Rostov. + +"Who do you belong to?" he asked. + +"The French," replied Ilyin jestingly, "and here is Napoleon +himself"--and he pointed to Lavrushka. + +"Then you are Russians?" the peasant asked again. + +"And is there a large force of you here?" said another, a short man, +coming up. + +"Very large," answered Rostov. "But why have you collected here?" he +added. "Is it a holiday?" + +"The old men have met to talk over the business of the commune," +replied the peasant, moving away. + +At that moment, on the road leading from the big house, two women +and a man in a white hat were seen coming toward the officers. + +"The one in pink is mine, so keep off!" said Ilyin on seeing +Dunyasha running resolutely toward him. + +"She'll be ours!" said Lavrushka to Ilyin, winking. + +"What do you want, my pretty?" said Ilyin with a smile. + +"The princess ordered me to ask your regiment and your name." + +"This is Count Rostov, squadron commander, and I am your humble +servant." + +"Co-o-om-pa-ny!" roared the tipsy peasant with a beatific smile as +he looked at Ilyin talking to the girl. Following Dunyasha, Alpatych +advanced to Rostov, having bared his head while still at a distance. + +"May I make bold to trouble your honor?" said he respectfully, but +with a shade of contempt for the youthfulness of this officer and with +a hand thrust into his bosom. "My mistress, daughter of General in +Chief Prince Nicholas Bolkonski who died on the fifteenth of this +month, finding herself in difficulties owing to the boorishness of +these people"--he pointed to the peasants--"asks you to come up to the +house.... Won't you, please, ride on a little farther," said +Alpatych with a melancholy smile, "as it is not convenient in the +presence of...?" He pointed to the two peasants who kept as close to +him as horseflies to a horse. + +"Ah!... Alpatych... Ah, Yakov Alpatych... Grand! Forgive us for +Christ's sake, eh?" said the peasants, smiling joyfully at him. + +Rostov looked at the tipsy peasants and smiled. + +"Or perhaps they amuse your honor?" remarked Alpatych with a staid +air, as he pointed at the old men with his free hand. + +"No, there's not much to be amused at here," said Rostov, and rode +on a little way. "What's the matter?" he asked. + +"I make bold to inform your honor that the rude peasants here +don't wish to let the mistress leave the estate, and threaten to +unharness her horses, so that though everything has been packed up +since morning, her excellency cannot get away." + +"Impossible!" exclaimed Rostov. + +"I have the honor to report to you the actual truth," said Alpatych. + +Rostov dismounted, gave his horse to the orderly, and followed +Alpatych to the house, questioning him as to the state of affairs. +It appeared that the princess' offer of corn to the peasants the +previous day, and her talk with Dron and at the meeting, had +actually had so bad an effect that Dron had finally given up the +keys and joined the peasants and had not appeared when Alpatych sent +for him; and that in the morning when the princess gave orders to +harness for her journey, the peasants had come in a large crowd to the +barn and sent word that they would not let her leave the village: that +there was an order not to move, and that they would unharness the +horses. Alpatych had gone out to admonish them, but was told (it was +chiefly Karp who did the talking, Dron not showing himself in the +crowd) that they could not let the princess go, that there was an +order to the contrary, but that if she stayed they would serve her +as before and obey her in everything. + +At the moment when Rostov and Ilyin were galloping along the road, +Princess Mary, despite the dissuasions of Alpatych, her nurse, and the +maids, had given orders to harness and intended to start, but when the +cavalrymen were espied they were taken for Frenchmen, the coachman ran +away, and the women in the house began to wail. + +"Father! Benefactor! God has sent you!" exclaimed deeply moved +voices as Rostov passed through the anteroom. + +Princess Mary was sitting helpless and bewildered in the large +sitting room, when Rostov was shown in. She could not grasp who he was +and why he had come, or what was happening to her. When she saw his +Russian face, and by his walk and the first words he uttered +recognized him as a man of her own class, she glanced at him with +her deep radiant look and began speaking in a voice that faltered +and trembled with emotion. This meeting immediately struck Rostov as a +romantic event. "A helpless girl overwhelmed with grief, left to the +mercy of coarse, rioting peasants! And what a strange fate sent me +here! What gentleness and nobility there are in her features and +expression!" thought he as he looked at her and listened to her +timid story. + +When she began to tell him that all this had happened the day +after her father's funeral, her voiced trembled. She turned away, +and then, as if fearing he might take her words as meant to move him +to pity, looked at him with an apprehensive glance of inquiry. There +were tears in Rostov's eyes. Princess Mary noticed this and glanced +gratefully at him with that radiant look which caused the plainness of +her face to be forgotten. + +"I cannot express, Princess, how glad I am that I happened to ride +here and am able to show my readiness to serve you," said Rostov, +rising. "Go when you please, and I give you my word of honor that no +one shall dare to cause you annoyance if only you will allow me to act +as your escort." And bowing respectfully, as if to a lady of royal +blood, he moved toward the door. + +Rostov's deferential tone seemed to indicate that though he would +consider himself happy to be acquainted with her, he did not wish to +take advantage of her misfortunes to intrude upon her. + +Princess Mary understood this and appreciated his delicacy. + +"I am very, very grateful to you," she said in French, "but I hope +it was all a misunderstanding and that no one is to blame for it." She +suddenly began to cry. + +"Excuse me!" she said. + +Rostov, knitting his brows, left the room with another low bow. + + + + + +CHAPTER XIV + + +"Well, is she pretty? Ah, friend--my pink one is delicious; her +name is Dunyasha...." + +But on glancing at Rostov's face Ilyin stopped short. He saw that +his hero and commander was following quite a different train of +thought. + +Rostov glanced angrily at Ilyin and without replying strode off with +rapid steps to the village. + +"I'll show them; I'll give it to them, the brigands!" said he to +himself. + +Alpatych at a gliding trot, only just managing not to run, kept up +with him with difficulty. + +"What decision have you been pleased to come to?" said he. + +Rostov stopped and, clenching his fists, suddenly and sternly turned +on Alpatych. + +"Decision? What decision? Old dotard!..." cried he. "What have you +been about? Eh? The peasants are rioting, and you can't manage them? +You're a traitor yourself! I know you. I'll flay you all alive!..." +And as if afraid of wasting his store of anger, he left Alpatych and +went rapidly forward. Alpatych, mastering his offended feelings, +kept pace with Rostov at a gliding gait and continued to impart his +views. He said the peasants were obdurate and that at the present +moment it would be imprudent to "overresist" them without an armed +force, and would it not be better first to send for the military? + +"I'll give them armed force... I'll 'overresist' them!" uttered +Rostov meaninglessly, breathless with irrational animal fury and the +need to vent it. + +Without considering what he would do he moved unconciously with +quick, resolute steps toward the crowd. And the nearer he drew to it +the more Alpatych felt that this unreasonable action might produce +good results. The peasants in the crowd were similarly impressed +when they saw Rostov's rapid, firm steps and resolute, frowning face. + +After the hussars had come to the village and Rostov had gone to see +the princess, a certain confusion and dissension had arisen among +the crowd. Some of the peasants said that these new arrivals were +Russians and might take it amiss that the mistress was being detained. +Dron was of this opinion, but as soon as he expressed it Karp and +others attacked their ex-Elder. + +"How many years have you been fattening on the commune?" Karp +shouted at him. "It's all one to you! You'll dig up your pot of +money and take it away with you.... What does it matter to you whether +our homes are ruined or not?" + +"We've been told to keep order, and that no one is to leave their +homes or take away a single grain, and that's all about it!" cried +another. + +"It was your son's turn to be conscripted, but no fear! You +begrudged your lump of a son," a little old man suddenly began +attacking Dron--"and so they took my Vanka to be shaved for a soldier! +But we all have to die." + +"To be sure, we all have to die. I'm not against the commune," +said Dron. + +"That's it--not against it! You've filled your belly...." + +The two tall peasants had their say. As soon as Rostov, followed +by Ilyin, Lavrushka, and Alpatych, came up to the crowd, Karp, +thrusting his fingers into his belt and smiling a little, walked to +the front. Dron on the contrary retired to the rear and the crowd drew +closer together. + +"Who is your Elder here? Hey?" shouted Rostov, coming up to the +crowd with quick steps. + +"The Elder? What do you want with him?..." asked Karp. + +But before the words were well out of his mouth, his cap flew off +and a fierce blow jerked his head to one side. + +"Caps off, traitors!" shouted Rostov in a wrathful voice. "Where's +the Elder?" he cried furiously. + +"The Elder.... He wants the Elder!... Dron Zakharych, you!" meek and +flustered voices here and there were heard calling and caps began to +come off their heads. + +"We don't riot, we're following the orders," declared Karp, and at +that moment several voices began speaking together. + +"It's as the old men have decided--there's too many of you giving +orders." + +"Arguing? Mutiny!... Brigands! Traitors!" cried Rostov unmeaningly +in a voice not his own, gripping Karp by the collar. "Bind him, bind +him!" he shouted, though there was no one to bind him but Lavrushka +and Alpatych. + +Lavrushka, however, ran up to Karp and seized him by the arms from +behind. + +"Shall I call up our men from beyond the hill?" he called out. + +Alpatych turned to the peasants and ordered two of them by name to +come and bind Karp. The men obediently came out of the crowd and began +taking off their belts. + +"Where's the Elder?" demanded Rostov in a loud voice. + +With a pale and frowning face Dron stepped out of the crowd. + +"Are you the Elder? Bind him, Lavrushka!" shouted Rostov, as if that +order, too, could not possibly meet with any opposition. + +And in fact two more peasants began binding Dron, who took off his +own belt and handed it to them, as if to aid them. + +"And you all listen to me!" said Rostov to the peasants. "Be off +to your houses at once, and don't let one of your voices be heard!" + +"Why, we've not done any harm! We did it just out of foolishness. +It's all nonsense... I said then that it was not in order," voices +were heard bickering with one another. + +"There! What did I say?" said Alpatych, coming into his own again. +"It's wrong, lads!" + + "All our stupidity, Yakov Alpatych," came the answers, and the +crowd began at once to disperse through the village. + +The two bound men were led off to the master's house. The two +drunken peasants followed them. + +"Aye, when I look at you!..." said one of them to Karp. + +"How can one talk to the masters like that? What were you thinking +of, you fool?" added the other--"A real fool!" + +Two hours later the carts were standing in the courtyard of the +Bogucharovo house. The peasants were briskly carrying out the +proprietor's goods and packing them on the carts, and Dron, +liberated at Princess Mary's wish from the cupboard where he had +been confined, was standing in the yard directing the men. + +"Don't put it in so carelessly," said one of the peasants, a man +with a round smiling face, taking a casket from a housemaid. "You know +it has cost money! How can you chuck it in like that or shove it under +the cord where it'll get rubbed? I don't like that way of doing +things. Let it all be done properly, according to rule. Look here, put +it under the bast matting and cover it with hay--that's the way!" + +"Eh, books, books!" said another peasant, bringing out Prince +Andrew's library cupboards. "Don't catch up against it! It's heavy, +lads--solid books." + +"Yes, they worked all day and didn't play!" remarked the tall, +round-faced peasant gravely, pointing with a significant wink at the +dictionaries that were on the top. + + +Unwilling to obtrude himself on the princess, Rostov did not go back +to the house but remained in the village awaiting her departure. +When her carriage drove out of the house, he mounted and accompanied +her eight miles from Bogucharovo to where the road was occupied by our +troops. At the inn at Yankovo he respectfully took leave of her, for +the first time permitting himself to kiss her hand. + +"How can you speak so!" he blushingly replied to Princess Mary's +expressions of gratitude for her deliverance, as she termed what had +occurred. "Any police officer would have done as much! If we had had +only peasants to fight, we should not have let the enemy come so far," +said he with a sense of shame and wishing to change the subject. "I am +only happy to have had the opportunity of making your acquaintance. +Good-by, Princess. I wish you happiness and consolation and hope to +meet you again in happier circumstances. If you don't want to make +me blush, please don't thank me!" + +But the princess, if she did not again thank him in words, thanked +him with the whole expression of her face, radiant with gratitude +and tenderness. She could not believe that there was nothing to +thank him for. On the contrary, it seemed to her certain that had he +not been there she would have perished at the hands of the mutineers +and of the French, and that he had exposed himself to terrible and +obvious danger to save her, and even more certain was it that he was a +man of lofty and noble soul, able to understand her position and her +sorrow. His kind, honest eyes, with the tears rising in them when +she herself had begun to cry as she spoke of her loss, did leave her +memory. + +When she had taken leave of him and remained alone she suddenly felt +her eyes filling with tears, and then not for the first time the +strange question presented itself to her: did she love him? + +On the rest of the way to Moscow, though the princess' position +was not a cheerful one, Dunyasha, who went with her in the carriage, +more than once noticed that her mistress leaned out of the window +and smiled at something with an expression of mingled joy and sorrow. + +"Well, supposing I do love him?" thought Princess Mary. + +Ashamed as she was of acknowledging to herself that she had fallen +in love with a man who would perhaps never love her, she comforted +herself with the thought that no one would ever know it and that she +would not be to blame if, without ever speaking of it to anyone, she +continued to the end of her life to love the man with whom she had +fallen in love for the first and last time in her life. + +Sometimes when she recalled his looks, his sympathy, and his +words, happiness did not appear impossible to her. It was at those +moments that Dunyasha noticed her smiling as she looked out of the +carriage window. + +"Was it not fate that brought him to Bogucharovo, and at that very +moment?" thought Princess Mary. "And that caused his sister to +refuse my brother?" And in all this Princess Mary saw the hand of +Providence. + +The impression the princess made on Rostov was a very agreeable one. +To remember her gave him pleasure, and when his comrades, hearing of +his adventure at Bogucharovo, rallied him on having gone to look for +hay and having picked up one of the wealthiest heiresses in Russia, he +grew angry. It made him angry just because the idea of marrying the +gentle Princess Mary, who was attractive to him and had an enormous +fortune, had against his will more than once entered his head. For +himself personally Nicholas could not wish for a better wife: by +marrying her he would make the countess his mother happy, would be +able to put his father's affairs in order, and would even--he felt it- +ensure Princess Mary's happiness. + +But Sonya? And his plighted word? That was why Rostov grew angry +when he was rallied about Princess Bolkonskaya. + + + + + +CHAPTER XV + + +On receiving command of the armies Kutuzov remembered Prince +Andrew and sent an order for him to report at headquarters. + +Prince Andrew arrived at Tsarevo-Zaymishche on the very day and at +the very hour that Kutuzov was reviewing the troops for the first +time. He stopped in the village at the priest's house in front of +which stood the commander in chief's carriage, and he sat down on +the bench at the gate awaiting his Serene Highness, as everyone now +called Kutuzov. From the field beyond the village came now sounds of +regimental music and now the roar of many voices shouting "Hurrah!" to +the new commander in chief. Two orderlies, a courier and a major-domo, +stood near by, some ten paces from Prince Andrew, availing +themselves of Kutuzov's absence and of the fine weather. A short, +swarthy lieutenant colonel of hussars with thick mustaches and +whiskers rode up to the gate and, glancing at Prince Andrew, +inquired whether his Serene Highness was putting up there and +whether he would soon be back. + +Prince Andrew replied that he was not on his Serene Highness' +staff but was himself a new arrival. The lieutenant colonel turned +to a smart orderly, who, with the peculiar contempt with which a +commander in chief's orderly speaks to officers, replied: + +"What? His Serene Highness? I expect he'll be here soon. What do you +want?" + +The lieutenant colonel of hussars smiled beneath his mustache at the +orderly's tone, dismounted, gave his horse to a dispatch runner, and +approached Bolkonski with a slight bow. Bolkonski made room for him on +the bench and the lieutenant colonel sat down beside him. + +"You're also waiting for the commander in chief?" said he. "They say +he weceives evewyone, thank God!... It's awful with those sausage +eaters! Ermolov had weason to ask to be pwomoted to be a German! Now +p'waps Wussians will get a look in. As it was, devil only knows what +was happening. We kept wetweating and wetweating. Did you take part in +the campaign?" he asked. + +"I had the pleasure," replied Prince Andrew, "not only of taking +part in the retreat but of losing in that retreat all I held dear--not +to mention the estate and home of my birth--my father, who died of +grief. I belong to the province of Smolensk." + +"Ah? You're Pwince Bolkonski? Vewy glad to make your acquaintance! +I'm Lieutenant Colonel Denisov, better known as 'Vaska,'" said +Denisov, pressing Prince Andrew's hand and looking into his face +with a particularly kindly attention. "Yes, I heard," said he +sympathetically, and after a short pause added: "Yes, it's Scythian +warfare. It's all vewy well--only not for those who get it in the +neck. So you are Pwince Andwew Bolkonski?" He swayed his head. "Vewy +pleased, Pwince, to make your acquaintance!" he repeated again, +smiling sadly, and he again pressed Prince Andrew's hand. + +Prince Andrew knew Denisov from what Natasha had told him of her +first suitor. This memory carried him sadly and sweetly back to +those painful feelings of which he had not thought lately, but which +still found place in his soul. Of late he had received so many new and +very serious impressions--such as the retreat from Smolensk, his visit +to Bald Hills, and the recent news of his father's death--and had +experienced so many emotions, that for a long time past those memories +had not entered his mind, and now that they did, they did not act on +him with nearly their former strength. For Denisov, too, the +memories awakened by the name of Bolkonski belonged to a distant, +romantic past, when after supper and after Natasha's singing he had +proposed to a little girl of fifteen without realizing what he was +doing. He smiled at the recollection of that time and of his love +for Natasha, and passed at once to what now interested him +passionately and exclusively. This was a plan of campaign he had +devised while serving at the outposts during the retreat. He had +proposed that plan to Barclay de Tolly and now wished to propose it to +Kutuzov. The plan was based on the fact that the French line of +operation was too extended, and it proposed that instead of, or +concurrently with, action on the front to bar the advance of the +French, we should attack their line of communication. He began +explaining his plan to Prince Andrew. + +"They can't hold all that line. It's impossible. I will undertake to +bweak thwough. Give me five hundwed men and I will bweak the line, +that's certain! There's only one way--guewilla warfare!" + +Denisov rose and began gesticulating as he explained his plan to +Bolkonski. In the midst of his explanation shouts were heard from +the army, growing more incoherent and more diffused, mingling with +music and songs and coming from the field where the review was held. +Sounds of hoofs and shouts were nearing the village. + +"He's coming! He's coming!" shouted a Cossack standing at the gate. + +Bolkonski and Denisov moved to the gate, at which a knot of soldiers +(a guard of honor) was standing, and they saw Kutuzov coming down +the street mounted on a rather small sorrel horse. A huge suite of +generals rode behind him. Barclay was riding almost beside him, and +a crowd of officers ran after and around them shouting, "Hurrah!" + +His adjutants galloped into the yard before him. Kutuzov was +impatiently urging on his horse, which ambled smoothly under his +weight, and he raised his hand to his white Horse Guard's cap with a +red band and no peak, nodding his head continually. When he came up to +the guard of honor, a fine set of Grenadiers mostly wearing +decorations, who were giving him the salute, he looked at them +silently and attentively for nearly a minute with the steady gaze of a +commander and then turned to the crowd of generals and officers +surrounding him. Suddenly his face assumed a subtle expression, he +shrugged his shoulders with an air of perplexity. + +"And with such fine fellows to retreat and retreat! Well, good-by, +General," he added, and rode into the yard past Prince Andrew and +Denisov. + +"Hurrah! hurrah! hurrah!" shouted those behind him. + +Since Prince Andrew had last seen him Kutuzov had grown still more +corpulent, flaccid, and fat. But the bleached eyeball, the scar, and +the familiar weariness of his expression were still the same. He was +wearing the white Horse Guard's cap and a military overcoat with a +whip hanging over his shoulder by a thin strap. He sat heavily and +swayed limply on his brisk little horse. + +"Whew... whew... whew!" he whistled just audibly as he rode into the +yard. His face expressed the relief of relaxed strain felt by a man +who means to rest after a ceremony. He drew his left foot out of the +stirrup and, lurching with his whole body and puckering his face +with the effort, raised it with difficulty onto the saddle, leaned +on his knee, groaned, and slipped down into the arms of the Cossacks +and adjutants who stood ready to assist him. + +He pulled himself together, looked round, screwing up his eyes, +glanced at Prince Andrew, and, evidently not recognizing him, moved +with his waddling gait to the porch. "Whew... whew... whew!" he +whistled, and again glanced at Prince Andrew. As often occurs with old +men, it was only after some seconds that the impression produced by +Prince Andrew's face linked itself up with Kutuzov's remembrance of +his personality. + +"Ah, how do you do, my dear prince? How do you do, my dear boy? Come +along..." said he, glancing wearily round, and he stepped onto the +porch which creaked under his weight. + +He unbuttoned his coat and sat down on a bench in the porch. + +"And how's your father?" + +"I received news of his death, yesterday," replied Prince Andrew +abruptly. + +Kutuzov looked at him with eyes wide open with dismay and then +took off his cap and crossed himself: + +"May the kingdom of Heaven be his! God's will be done to us all!" He +sighed deeply, his whole chest heaving, and was silent for a while. "I +loved him and respected him, and sympathize with you with all my +heart." + +He embraced Prince Andrew, pressing him to his fat breast, and for +some time did not let him go. When he released him Prince Andrew saw +that Kutuzov's flabby lips were trembling and that tears were in his +eyes. He sighed and pressed on the bench with both hands to raise +himself. + +"Come! Come with me, we'll have a talk," said he. + +But at that moment Denisov, no more intimidated by his superiors +than by the enemy, came with jingling spurs up the steps of the porch, +despite the angry whispers of the adjutants who tried to stop him. +Kutuzov, his hands still pressed on the seat, glanced at him glumly. +Denisov, having given his name, announced that he had to communicate +to his Serene Highness a matter of great importance for their +country's welfare. Kutuzov looked wearily at him and, lifting his +hands with a gesture of annoyance, folded them across his stomach, +repeating the words: "For our country's welfare? Well, what is it? +Speak!" Denisov blushed like a girl (it was strange to see the color +rise in that shaggy, bibulous, time-worn face) and boldly began to +expound his plan of cutting the enemy's lines of communication between +Smolensk and Vyazma. Denisov came from those parts and knew the +country well. His plan seemed decidedly a good one, especially from +the strength of conviction with which he spoke. Kutuzov looked down at +his own legs, occasionally glancing at the door of the adjoining hut +as if expecting something unpleasant to emerge from it. And from +that hut, while Denisov was speaking, a general with a portfolio under +his arm really did appear. + +"What?" said Kutuzov, in the midst of Denisov's explanations, "are +you ready so soon?" + +"Ready, your Serene Highness," replied the general. + +Kutuzov swayed his head, as much as to say: "How is one man to +deal with it all?" and again listened to Denisov. + +"I give my word of honor as a Wussian officer," said Denisov, +"that I can bweak Napoleon's line of communication!" + +"What relation are you to Intendant General Kiril Andreevich +Denisov?" asked Kutuzov, interrupting him. + +"He is my uncle, your Sewene Highness." + +"Ah, we were friends," said Kutuzov cheerfully. "All right, all +right, friend, stay here at the staff and tomorrow we'll have a talk." + +With a nod to Denisov he turned away and put out his hand for the +papers Konovnitsyn had brought him. + +"Would not your Serene Highness like to come inside?" said the +general on duty in a discontented voice, "the plans must be examined +and several papers have to be signed." + +An adjutant came out and announced that everything was in +readiness within. But Kutuzov evidently did not wish to enter that +room till he was disengaged. He made a grimace... + +"No, tell them to bring a small table out here, my dear boy. I'll +look at them here," said he. "Don't go away," he added, turning to +Prince Andrew, who remained in the porch and listened to the general's +report. + +While this was being given, Prince Andrew heard the whisper of a +woman's voice and the rustle of a silk dress behind the door. +Several times on glancing that way he noticed behind that door a +plump, rosy, handsome woman in a pink dress with a lilac silk kerchief +on her head, holding a dish and evidently awaiting the entrance of the +commander in chief. Kutuzov's adjutant whispered to Prince Andrew +that this was the wife of the priest whose home it was, and that she +intended to offer his Serene Highness bread and salt. "Her husband has +welcomed his Serene Highness with the cross at the church, and she +intends to welcome him in the house.... She's very pretty," added +the adjutant with a smile. At those words Kutuzov looked round. He was +listening to the general's report--which consisted chiefly of a +criticism of the position at Tsarevo-Zaymishche--as he had listened to +Denisov, and seven years previously had listened to the discussion +at the Austerlitz council of war. He evidently listened only because +he had ears which, though there was a piece of tow in one of them, +could not help hearing; but it was evident that nothing the general +could say would surprise or even interest him, that he knew all that +would be said beforehand, and heard it all only because he had to, +as one has to listen to the chanting of a service of prayer. All +that Denisov had said was clever and to the point. What the general +was saying was even more clever and to the point, but it was evident +that Kutuzov despised knowledge and cleverness, and knew of +something else that would decide the matter--something independent +of cleverness and knowledge. Prince Andrew watched the commander +in chief's face attentively, and the only expression he could see +there was one of boredom, curiosity as to the meaning of the +feminine whispering behind the door, and a desire to observe +propriety. It was evident that Kutuzov despised cleverness and +learning and even the patriotic feeling shown by Denisov, but despised +them not because of his own intellect, feelings, or knowledge--he +did not try to display any of these--but because of something else. He +despised them because of his old age and experience of life. The +only instruction Kutuzov gave of his own accord during that report +referred to looting by the Russian troops. At the end of the report +the general put before him for signature a paper relating to the +recovery of payment from army commanders for green oats mown down by +the soldiers, when landowners lodged petitions for compensation. + +After hearing the matter, Kutuzov smacked his lips together and +shook his head. + +"Into the stove... into the fire with it! I tell you once for all, +my dear fellow," said he, "into the fire with all such things! Let +them cut the crops and burn wood to their hearts' content. I don't +order it or allow it, but I don't exact compensation either. One can't +get on without it. 'When wood is chopped the chips will fly.'" He +looked at the paper again. "Oh, this German precision!" he muttered, +shaking his head. + + + + + +CHAPTER XVI + + +"Well, that's all!" said Kutuzov as he signed the last of the +documents, and rising heavily and smoothing out the folds in his fat +white neck he moved toward the door with a more cheerful expression. + +The priest's wife, flushing rosy red, caught up the dish she had +after all not managed to present at the right moment, though she had +so long been preparing for it, and with a low bow offered it to +Kutuzov. + +He screwed up his eyes, smiled, lifted her chin with his hand, and +said: + +"Ah, what a beauty! Thank you, sweetheart!" + +He took some gold pieces from his trouser pocket and put them on the +dish for her. "Well, my dear, and how are we getting on?" he asked, +moving to the door of the room assigned to him. The priest's wife +smiled, and with dimples in her rosy cheeks followed him into the +room. The adjutant came out to the porch and asked Prince Andrew to +lunch with him. Half an hour later Prince Andrew was again called to +Kutuzov. He found him reclining in an armchair, still in the same +unbuttoned overcoat. He had in his hand a French book which he +closed as Prince Andrew entered, marking the place with a knife. +Prince Andrew saw by the cover that it was Les Chevaliers du Cygne +by Madame de Genlis. + +"Well, sit down, sit down here. Let's have a talk," said Kutuzov. +"It's sad, very sad. But remember, my dear fellow, that I am a +father to you, a second father...." + +Prince Andrew told Kutuzov all he knew of his father's death, and +what he had seen at Bald Hills when he passed through it. + +"What... what they have brought us to!" Kutuzov suddenly cried in an +agitated voice, evidently picturing vividly to himself from Prince +Andrew's story the condition Russia was in. "But give me time, give me +time!" he said with a grim look, evidently not wishing to continue +this agitating conversation, and added: "I sent for you to keep you +with me." + +"I thank your Serene Highness, but I fear I am no longer fit for the +staff," replied Prince Andrew with a smile which Kutuzov noticed. + +Kutuzov glanced inquiringly at him. + +"But above all," added Prince Andrew, "I have grown used to my +regiment, am fond of the officers, and I fancy the men also like me. I +should be sorry to leave the regiment. If I decline the honor of being +with you, believe me..." + +A shrewd, kindly, yet subtly derisive expression lit up Kutuzov's +podgy face. He cut Bolkonski short. + +"I am sorry, for I need you. But you're right, you're right! It's +not here that men are needed. Advisers are always plentiful, but men +are not. The regiments would not be what they are if the would-be +advisers served there as you do. I remember you at Austerlitz.... I +remember, yes, I remember you with the standard!" said Kutuzov, and +a flush of pleasure suffused Prince Andrew's face at this +recollection. + +Taking his hand and drawing him downwards, Kutuzov offered his cheek +to be kissed, and again Prince Andrew noticed tears in the old man's +eyes. Though Prince Andrew knew that Kutuzov's tears came easily, +and that he was particularly tender to and considerate of him from a +wish to show sympathy with his loss, yet this reminder of Austerlitz +was both pleasant and flattering to him. + +"Go your way and God be with you. I know your path is the path of +honor!" He paused. "I missed you at Bucharest, but I needed someone to +send." And changing the subject, Kutuzov began to speak of the Turkish +war and the peace that had been concluded. "Yes, I have been much +blamed," he said, "both for that war and the peace... but everything +came at the right time. Tout vient a point a celui qui sait attendre.* +And there were as many advisers there as here..." he went on, +returning to the subject of "advisers" which evidently occupied him. +"Ah, those advisers!" said he. "If we had listened to them all we +should not have made peace with Turkey and should not have been +through with that war. Everything in haste, but more haste, less +speed. Kamenski would have been lost if he had not died. He stormed +fortresses with thirty thousand men. It is not difficult to capture +a fortress but it is difficult to win a campaign. For that, storming +and attacking but patience and time are wanted. Kamenski sent soldiers +to Rustchuk, but I only employed these two things and took more +fortresses than Kamenski and made them but eat horseflesh!" He swayed +his head. "And the French shall too, believe me," he went on, +growing warmer and beating his chest, "I'll make them eat horseflesh!" +And tears again dimmed his eyes. + + +*"Everything comes in time to him who knows how to wait." + + +"But shan't we have to accept battle?" remarked Prince Andrew. + +"We shall if everybody wants it; it can't be helped.... But +believe me, my dear boy, there is nothing stronger than those two: +patience and time, they will do it all. But the advisers n'entendent +pas de cette oreille, voila le mal.* Some want a thing--others +don't. What's one to do?" he asked, evidently expecting an answer. +"Well, what do you want us to do?" he repeated and his eye shone +with a deep, shrewd look. "I'll tell you what to do," he continued, as +Prince Andrew still did not reply: "I will tell you what to do, and +what I do. Dans le doute, mon cher," he paused, "abstiens-toi"*[2]--he +articulated the French proverb deliberately. + + +*"Don't see it that way, that's the trouble." + +*[2] "When in doubt, my dear fellow, do nothing." + + +"Well, good-by, my dear fellow; remember that with all my heart I +share your sorrow, and that for you I am not a Serene Highness, nor +a prince, nor a commander in chief, but a father! If you want anything +come straight to me. Good-by, my dear boy." + +Again he embraced and kissed Prince Andrew, but before the latter +had left the room Kutuzov gave a sigh of relief and went on with his +unfinished novel, Les Chevaliers du Cygne by Madame de Genlis. + +Prince Andrew could not have explained how or why it was, but +after that interview with Kutuzov he went back to his regiment +reassured as to the general course of affairs and as to the man to +whom it had been entrusted. The more he realized the absence of all +personal motive in that old man--in whom there seemed to remain only +the habit of passions, and in place of an intellect (grouping events +and drawing conclusions) only the capacity calmly to contemplate the +course of events--the more reassured he was that everything would be +as it should. "He will not bring in any plan of his own. He will not +devise or undertake anything," thought Prince Andrew, "but he will +hear everything, remember everything, and put everything in its place. +He will not hinder anything useful nor allow anything harmful. He +understands that there is something stronger and more important than +his own will--the inevitable course of events, and he can see them and +grasp their significance, and seeing that significance can refrain +from meddling and renounce his personal wish directed to something +else. And above all," thought Prince Andrew, "one believes in him +because he's Russian, despite the novel by Genlis and the French +proverbs, and because his voice shook when he said: 'What they have +brought us to!' and had a sob in it when he said he would 'make them +eat horseflesh!'" + +On such feelings, more or less dimly shared by all, the unanimity +and general approval were founded with which, despite court +influences, the popular choice of Kutuzov as commander in chief was +received. + + + + + +CHAPTER XVII + + +After the Emperor had left Moscow, life flowed on there in its usual +course, and its course was so very usual that it was difficult to +remember the recent days of patriotic elation and ardor, hard to +believe that Russia was really in danger and that the members of the +English Club were also sons of the Fatherland ready to sacrifice +everything for it. The one thing that recalled the patriotic fervor +everyone had displayed during the Emperor's stay was the call for +contributions of men and money, a necessity that as soon as the +promises had been made assumed a legal, official form and became +unavoidable. + +With the enemy's approach to Moscow, the Moscovites' view of their +situation did not grow more serious but on the contrary became even +more frivolous, as always happens with people who see a great danger +approaching. At the approach of danger there are always two voices +that speak with equal power in the human soul: one very reasonably +tells a man to consider the nature of the danger and the means of +escaping it; the other, still more reasonably, says that it is too +depressing and painful to think of the danger, since it is not in +man's power to foresee everything and avert the general course of +events, and it is therefore better to disregard what is painful till +it comes, and to think about what is pleasant. In solitude a man +generally listens to the first voice, but in society to the second. So +it was now with the inhabitants of Moscow. It was long since people +had been as gay in Moscow as that year. + +Rostopchin's broadsheets, headed by woodcuts of a drink shop, a +potman, and a Moscow burgher called Karpushka Chigirin, "who--having +been a militiaman and having had rather too much at the pub--heard +that Napoleon wished to come to Moscow, grew angry, abused the +French in very bad language, came out of the drink shop, and, under +the sign of the eagle, began to address the assembled people," were +read and discussed, together with the latest of Vasili Lvovich +Pushkin's bouts rimes. + +In the corner room at the Club, members gathered to read these +broadsheets, and some liked the way Karpushka jeered at the French, +saying: "They will swell up with Russian cabbage, burst with our +buckwheat porridge, and choke themselves with cabbage soup. They are +all dwarfs and one peasant woman will toss three of them with a +hayfork." Others did not like that tone and said it was stupid and +vulgar. It was said that Rostopchin had expelled all Frenchmen and +even all foreigners from Moscow, and that there had been some spies +and agents of Napoleon among them; but this was told chiefly to +introduce Rostopchin's witty remark on that occasion. The foreigners +were deported to Nizhni by boat, and Rostopchin had said to them in +French: "Rentrez en vousmemes; entrez dans la barque, et n'en faites +pas une barque de Charon."* There was talk of all the government +offices having been already removed from Moscow, and to this +Shinshin's witticism was added--that for that alone Moscow ought to be +grateful to Napoleon. It was said that Mamonov's regiment would cost +him eight hundred thousand rubles, and that Bezukhov had spent even +more on his, but that the best thing about Bezukhov's action was +that he himself was going to don a uniform and ride at the head of his +regiment without charging anything for the show. + + +*"Think it over; get into the barque, and take care not to make it a +barque of Charon." + + +"You don't spare anyone," said Julie Drubetskaya as she collected +and pressed together a bunch of raveled lint with her thin, beringed +fingers. + +Julie was preparing to leave Moscow next day and was giving a +farewell soiree. + +"Bezukhov est ridicule, but he is so kind and good-natured. What +pleasure is there to be so caustique?" + +"A forfeit!" cried a young man in militia uniform whom Julie +called "mon chevalier," and who was going with her to Nizhni. + +In Julie's set, as in many other circles in Moscow, it had been +agreed that they would speak nothing but Russian and that those who +made a slip and spoke French should pay fines to the Committee of +Voluntary Contributions. + +"Another forfeit for a Gallicism," said a Russian writer who was +present. "'What pleasure is there to be' is not Russian!" + +"You spare no one," continued Julie to the young man without heeding +the author's remark. + +"For caustique--I am guilty and will pay, and I am prepared to pay +again for the pleasure of telling you the truth. For Gallicisms I +won't be responsible," she remarked, turning to the author: "I have +neither the money nor the time, like Prince Galitsyn, to engage a +master to teach me Russian!" + +"Ah, here he is!" she added. "Quand on... No, no," she said to the +militia officer, "you won't catch me. Speak of the sun and you see its +rays!" and she smiled amiably at Pierre. "We were just talking of +you," she said with the facility in lying natural to a society +woman. "We were saying that your regiment would be sure to be better +than Mamonov's." + +"Oh, don't talk to me of my regiment," replied Pierre, kissing his +hostess' hand and taking a seat beside her. "I am so sick of it." + +"You will, of course, command it yourself?" said Julie, directing +a sly, sarcastic glance toward the militia officer. + +The latter in Pierre's presence had ceased to be caustic, and his +face expressed perplexity as to what Julie's smile might mean. In +spite of his absent-mindedness and good nature, Pierre's personality +immediately checked any attempt to ridicule him to his face. + +"No," said Pierre, with a laughing glance at his big, stout body. "I +should make too good a target for the French, besides I am afraid I +should hardly be able to climb onto a horse." + +Among those whom Julie's guests happened to choose to gossip about +were the Rostovs. + +"I hear that their affairs are in a very bad way," said Julie. +"And he is so unreasonable, the count himself I mean. The +Razumovskis wanted to buy his house and his estate near Moscow, but it +drags on and on. He asks too much." + +"No, I think the sale will come off in a few days," said someone. +"Though it is madness to buy anything in Moscow now." + +"Why?" asked Julie. "You don't think Moscow is in danger?" + +"Then why are you leaving?" + +"I? What a question! I am going because... well, because everyone is +going: and besides--I am not Joan of Arc or an Amazon." + +"Well, of course, of course! Let me have some more strips of linen." + +"If he manages the business properly he will be able to pay off +all his debts," said the militia officer, speaking of Rostov. + +"A kindly old man but not up to much. And why do they stay on so +long in Moscow? They meant to leave for the country long ago. +Natalie is quite well again now, isn't she?" Julie asked Pierre with a +knowing smile. + +"They are waiting for their younger son," Pierre replied. "He joined +Obolenski's Cossacks and went to Belaya Tserkov where the regiment +is being formed. But now they have had him transferred to my +regiment and are expecting him every day. The count wanted to leave +long ago, but the countess won't on any account leave Moscow till +her son returns." + +"I met them the day before yesterday at the Arkharovs'. Natalie +has recovered her looks and is brighter. She sang a song. How easily +some people get over everything!" + +"Get over what?" inquired Pierre, looking displeased. + +Julie smiled. + +"You know, Count, such knights as you are only found in Madame de +Souza's novels." + +"What knights? What do you mean?" demanded Pierre, blushing. + +"Oh, come, my dear count! C'est la fable de tout Moscou. Je vous +admire, ma parole d'honneur!"* + + +*"It is the talk of all Moscow. My word, I admire you!" + + +"Forfeit, forfeit!" cried the militia officer. + +"All right, one can't talk--how tiresome!" + +"What is 'the talk of all Moscow'?" Pierre asked angrily, rising +to his feet. + +"Come now, Count, you know!" + +"I don't know anything about it," said Pierre. + +"I know you were friendly with Natalie, and so... but I was always +more friendly with Vera--that dear Vera." + +"No, madame!" Pierre continued in a tone of displeasure, "I have not +taken on myself the role of Natalie Rostova's knight at all, and +have not been their house for nearly a month. But I cannot +understand the cruelty..." + +"Qui s'excuse s'accuse,"* said Julie, smiling and waving the lint +triumphantly, and to have the last word she promptly changed the +subject. "Do you know what I heard today? Poor Mary Bolkonskaya +arrived in Moscow yesterday. Do you know that she has lost her +father?" + + +*"Who excuses himself, accuses himself." + + +"Really? Where is she? I should like very much to see her," said +Pierre. + +"I spent the evening with her yesterday. She is going to their +estate near Moscow either today or tomorrow morning, with her nephew." + +"Well, and how is she?" asked Pierre. + +"She is well, but sad. But do you know who rescued her? It is +quite a romance. Nicholas Rostov! She was surrounded, and they +wanted to kill her and had wounded some of her people. He rushed in +and saved her...." + +"Another romance," said the militia officer. "Really, this general +flight has been arranged to get all the old maids married off. Catiche +is one and Princess Bolkonskaya another." + +"Do you know, I really believe she is un petit peu amoureuse du +jeune homme."* + + +*"A little bit in love with the young man." + + +"Forfeit, forfeit, forfeit!" + +"But how could one say that in Russian?" + + + + + +CHAPTER XVIII + + +When Pierre returned home he was handed two of Rostopchin's +broadsheets that had been brought that day. + +The first declared that the report that Count Rostopchin had +forbidden people to leave Moscow was false; on the contrary he was +glad that ladies and tradesmen's wives were leaving the city. "There +will be less panic and less gossip," ran the broadsheet "but I will +stake my life on it that that will not enter Moscow." These words +showed Pierre clearly for the first time that the French would enter +Moscow. The second broadsheet stated that our headquarters were at +Vyazma, that Count Wittgenstein had defeated the French, but that as +many of the inhabitants of Moscow wished to be armed, weapons were +ready for them at the arsenal: sabers, pistols, and muskets which +could be had at a low price. The tone of the proclamation was not as +jocose as in the former Chigirin talks. Pierre pondered over these +broadsheets. Evidently the terrible stormcloud he had desired with the +whole strength of his soul but which yet aroused involuntary horror in +him was drawing near. + +"Shall I join the army and enter the service, or wait?" he asked +himself for the hundredth time. He took a pack of cards that lay on +the table and began to lay them out for a game of patience. + +"If this patience comes out," he said to himself after shuffling the +cards, holding them in his hand, and lifting his head, "if it comes +out, it means... what does it mean?" + +He had not decided what it should mean when he heard the voice of +the eldest princess at the door asking whether she might come in. + +"Then it will mean that I must go to the army," said Pierre to +himself. "Come in, come in!" he added to the princess. + +Only the eldest princess, the one with the stony face and long +waist, was still living in Pierre's house. The two younger ones had +both married. + +"Excuse my coming to you, cousin," she said in a reproachful and +agitated voice. "You know some decision must be come to. What is going +to happen? Everyone has left Moscow and the people are rioting. How is +it that we are staying on?" + +"On the contrary, things seem satisfactory, ma cousine," said Pierre +in the bantering tone he habitually adopted toward her, always feeling +uncomfortable in the role of her benefactor. + +"Satisfactory, indeed! Very satisfactory! Barbara Ivanovna told me +today how our troops are distinguishing themselves. It certainly +does them credit! And the people too are quite mutinous--they no +longer obey, even my maid has taken to being rude. At this rate they +will soon begin beating us. One can't walk in the streets. But, +above all, the French will be here any day now, so what are we waiting +for? I ask just one thing of you, cousin," she went on, "arrange for +me to be taken to Petersburg. Whatever I may be, I can't live under +Bonaparte's rule." + +"Oh, come, ma cousine! Where do you get your information from? On +the contrary..." + +"I won't submit to your Napoleon! Others may if they please.... If +you don't want to do this..." + +"But I will, I'll give the order at once." + +The princess was apparently vexed at not having anyone to be angry +with. Muttering to herself, she sat down on a chair. + +"But you have been misinformed," said Pierre. "Everything is quiet +in the city and there is not the slightest danger. See! I've just been +reading..." He showed her the broadsheet. "Count Rostopchin writes +that he will stake his life on it that the enemy will not enter +Moscow." + +"Oh, that count of yours!" said the princess malevolently. "He is +a hypocrite, a rascal who has himself roused the people to riot. +Didn't he write in those idiotic broadsheets that anyone, 'whoever +it might be, should be dragged to the lockup by his hair'? (How +silly!) 'And honor and glory to whoever captures him,' he says. This +is what his cajolery has brought us to! Barbara Ivanovna told me the +mob near killed her because she said something in French." + +"Oh, but it's so... You take everything so to heart," said Pierre, +and began laying out his cards for patience. + +Although that patience did come out, Pierre did not join the army, +but remained in deserted Moscow ever in the same state of agitation, +irresolution, and alarm, yet at the same time joyfully expecting +something terrible. + +Next day toward evening the princess set off, and Pierre's head +steward came to inform him that the money needed for the equipment +of his regiment could not be found without selling one of the estates. +In general the head steward made out to Pierre that his project of +raising a regiment would ruin him. Pierre listened to him, scarcely +able to repress a smile. + +"Well then, sell it," said he. "What's to be done? I can't draw back +now!" + +The worse everything became, especially his own affairs, the +better was Pierre pleased and the more evident was it that the +catastrophe he expected was approaching. Hardly anyone he knew was +left in town. Julie had gone, and so had Princess Mary. Of his +intimate friends only the Rostovs remained, but he did not go to see +them. + +To distract his thoughts he drove that day to the village of +Vorontsovo to see the great balloon Leppich was constructing to +destroy the foe, and a trial balloon that was to go up next day. The +balloon was not yet ready, but Pierre learned that it was being +constructed by the Emperor's desire. The Emperor had written to +Count Rostopchin as follows: + + +As soon as Leppich is ready, get together a crew of reliable and +intelligent men for his car and send a courier to General Kutuzov to +let him know. I have informed him of the matter. + +Please impress upon Leppich to be very careful where he descends for +the first time, that he may not make a mistake and fall into the +enemy's hands. It is essential for him to combine his movements with +those of the commander in chief. + + +On his way home from Vorontsovo, as he was passing the Bolotnoe +Place Pierre, seeing a large crowd round the Lobnoe Place, stopped and +got out of his trap. A French cook accused of being a spy was being +flogged. The flogging was only just over, and the executioner was +releasing from the flogging bench a stout man with red whiskers, in +blue stockings and a green jacket, who was moaning piteously. +Another criminal, thin and pale, stood near. Judging by their faces +they were both Frenchmen. With a frightened and suffering look +resembling that on the thin Frenchman's face, Pierre pushed his way in +through the crowd. + +"What is it? Who is it? What is it for?" he kept asking. + +But the attention of the crowd--officials, burghers, shopkeepers, +peasants, and women in cloaks and in pelisses--was so eagerly centered +on what was passing in Lobnoe Place that no one answered him. The +stout man rose, frowned, shrugged his shoulders, and evidently +trying to appear firm began to pull on his jacket without looking +about him, but suddenly his lips trembled and he began to cry, in +the way full-blooded grown-up men cry, though angry with himself for +doing so. In the crowd people began talking loudly, to stifle their +feelings of pity as it seemed to Pierre. + +"He's cook to some prince." + +"Eh, mounseer, Russian sauce seems to be sour to a Frenchman... sets +his teeth on edge!" said a wrinkled clerk who was standing behind +Pierre, when the Frenchman began to cry. + +The clerk glanced round, evidently hoping that his joke would be +appreciated. Some people began to laugh, others continued to watch +in dismay the executioner who was undressing the other man. + +Pierre choked, his face puckered, and he turned hastily away, went +back to his trap muttering something to himself as he went, and took +his seat. As they drove along he shuddered and exclaimed several times +so audibly that the coachman asked him: + +"What is your pleasure?" + +"Where are you going?" shouted Pierre to the man, who was driving to +Lubyanka Street. + +"To the Governor's, as you ordered," answered the coachman. + +"Fool! Idiot!" shouted Pierre, abusing his coachman--a thing he +rarely did. "Home, I told you! And drive faster, blockhead!" "I must +get away this very day," he murmured to himself. + +At the sight of the tortured Frenchman and the crowd surrounding the +Lobnoe Place, Pierre had so definitely made up his mind that he +could no longer remain in Moscow and would leave for the army that +very day that it seemed to him that either he had told the coachman +this or that the man ought to have known it for himself. + +On reaching home Pierre gave orders to Evstafey--his head coachman +who knew everything, could do anything, and was known to all Moscow- +that he would leave that night for the army at Mozhaysk, and that +his saddle horses should be sent there. This could not all be arranged +that day, so on Evstafey's representation Pierre had to put off his +departure till next day to allow time for the relay horses to be +sent on in advance. + +On the twenty-fourth the weather cleared up after a spell of rain, +and after dinner Pierre left Moscow. When changing horses that night +in Perkhushkovo, he learned that there had been a great battle that +evening. (This was the battle of Shevardino.) He was told that there +in Perkhushkovo the earth trembled from the firing, but nobody could +answer his questions as to who had won. At dawn next day Pierre was +approaching Mozhaysk. + +Every house in Mozhaysk had soldiers quartered in it, and at the +hostel where Pierre was met by his groom and coachman there was no +room to be had. It was full of officers. + +Everywhere in Mozhaysk and beyond it, troops were stationed or on +the march. Cossacks, foot and horse soldiers, wagons, caissons, and +cannon were everywhere. Pierre pushed forward as fast as he could, and +the farther he left Moscow behind and the deeper he plunged into +that sea of troops the more was he overcome by restless agitation +and a new and joyful feeling he had not experienced before. It was a +feeling akin to what he had felt at the Sloboda Palace during the +Emperor's visit--a sense of the necessity of undertaking something and +sacrificing something. He now experienced a glad consciousness that +everything that constitutes men's happiness--the comforts of life, +wealth, even life itself--is rubbish it is pleasant to throw away, +compared with something... With what? Pierre could not say, and he did +not try to determine for whom and for what he felt such particular +delight in sacrificing everything. He was not occupied with the +question of what to sacrifice for; the fact of sacrificing in itself +afforded him a new and joyous sensation. + + + + + +CHAPTER XIX + + +On the twenty-fourth of August the battle of the Shevardino +Redoubt was fought, on the twenty-fifth not a shot was fired by either +side, and on the twenty-sixth the battle of Borodino itself took +place. + +Why and how were the battles of Shevardino and Borodino given and +accepted? Why was the battle of Borodino fought? There was not the +least sense in it for either the French or the Russians. Its immediate +result for the Russians was, and was bound to be, that we were brought +nearer to the destruction of Moscow--which we feared more than +anything in the world; and for the French its immediate result was +that they were brought nearer to the destruction of their whole +army--which they feared more than anything in the world. What the +result must be was quite obvious, and yet Napoleon offered and Kutuzov +accepted that battle. + +If the commanders had been guided by reason, it would seem that it +must have been obvious to Napoleon that by advancing thirteen +hundred miles and giving battle with a probability of losing a quarter +of his army, he was advancing to certain destruction, and it must have +been equally clear to Kutuzov that by accepting battle and risking the +loss of a quarter of his army he would certainly lose Moscow. For +Kutuzov this was mathematically clear, as it is that if when playing +draughts I have one man less and go on exchanging, I shall certainly +lose, and therefore should not exchange. When my opponent has +sixteen men and I have fourteen, I am only one eighth weaker than +he, but when I have exchanged thirteen more men he will be three times +as strong as I am. + +Before the battle of Borodino our strength in proportion to the +French was about as five to six, but after that battle it was little +more than one to two: previously we had a hundred thousand against a +hundred and twenty thousand; afterwards little more than fifty +thousand against a hundred thousand. Yet the shrewd and experienced +Kutuzov accepted the battle, while Napoleon, who was said to be a +commander of genius, gave it, losing a quarter of his army and +lengthening his lines of communication still more. If it is said +that he expected to end the campaign by occupying Moscow as he had +ended a previous campaign by occupying Vienna, there is much +evidence to the contrary. Napoleon's historians themselves tell us +that from Smolensk onwards he wished to stop, knew the danger of his +extended position, and knew that the occupation of Moscow would not be +the end of the campaign, for he had seen at Smolensk the state in +which Russian towns were left to him, and had not received a single +reply to his repeated announcements of his wish to negotiate. + +In giving and accepting battle at Borodino, Kutuzov acted +involuntarily and irrationally. But later on, to fit what had +occurred, the historians provided cunningly devised evidence of the +foresight and genius the generals who, of all the blind tools of +history were the most enslaved and involuntary. + +The ancients have left us model heroic poems in which the heroes +furnish the whole interest of the story, and we are still unable to +accustom ourselves to the fact that for our epoch histories of that +kind are meaningless. + +On the other question, how the battle of Borodino and the +preceding battle of Shevardino were fought, there also exists a +definite and well-known, but quite false, conception. All the +historians describe the affair as follows: + +The Russian army, they say, in its retreat from Smolensk sought +out for itself the best position for a general engagement and found +such a position at Borodino. + +The Russians, they say, fortified this position in advance on the +left of the highroad (from Moscow to Smolensk) and almost at a right +angle to it, from Borodino to Utitsa, at the very place where the +battle was fought. + +In front of this position, they say, a fortified outpost was set +up on the Shevardino mound to observe the enemy. On the twenty-fourth, +we are told, Napoleon attacked this advanced post and took it, and, on +the twenty-sixth, attacked the whole Russian army, which was in +position on the field of Borodino. + +So the histories say, and it is all quite wrong, as anyone who cares +to look into the matter can easily convince himself. + +The Russians did not seek out the best position but, on the +contrary, during the retreat passed many positions better than +Borodino. They did not stop at any one of these positions because +Kutuzov did not wish to occupy a position he had not himself chosen, +because the popular demand for a battle had not yet expressed itself +strongly enough, and because Miloradovich had not yet arrived with the +militia, and for many other reasons. The fact is that other +positions they had passed were stronger, and that the position at +Borodino (the one where the battle was fought), far from being strong, +was no more a position than any other spot one might find in the +Russian Empire by sticking a pin into the map at hazard. + +Not only did the Russians not fortify the position on the field of +Borodino to the left of, and at a right angle to, the highroad (that +is, the position on which the battle took place), but never till the +twenty-fifth of August, 1812, did they think that a battle might be +fought there. This was shown first by the fact that there were no +entrenchments there by the twenty fifth and that those begun on the +twenty-fifth and twenty-sixth were not completed, and secondly, by the +position of the Shevardino Redoubt. That redoubt was quite senseless +in front of the position where the battle was accepted. Why was it +more strongly fortified than any other post? And why were all +efforts exhausted and six thousand men sacrificed to defend it till +late at night on the twenty-fourth? A Cossack patrol would have +sufficed to observe the enemy. Thirdly, as proof that the position +on which the battle was fought had not been foreseen and that the +Shevardino Redoubt was not an advanced post of that position, we +have the fact that up to the twenty-fifth, Barclay de Tolly and +Bagration were convinced that the Shevardino Redoubt was the left +flank of the position, and that Kutuzov himself in his report, written +in hot haste after the battle, speaks of the Shevardino Redoubt as the +left flank of the position. It was much later, when reports on the +battle of Borodino were written at leisure, that the incorrect and +extraordinary statement was invented (probably to justify the mistakes +of a commander in chief who had to be represented as infallible) +that the Shevardino Redoubt was an advanced post--whereas in reality +it was simply a fortified point on the left flank--and that the battle +of Borodino was fought by us on an entrenched position previously +selected, where as it was fought on a quite unexpected spot which +was almost unentrenched. + +The case was evidently this: a position was selected along the river +Kolocha--which crosses the highroad not at a right angle but at an +acute angle--so that the left flank was at Shevardino, the right flank +near the village of Novoe, and the center at Borodino at the +confluence of the rivers Kolocha and Voyna. + +To anyone who looks at the field of Borodino without thinking of how +the battle was actually fought, this position, protected by the +river Kolocha, presents itself as obvious for an army whose object was +to prevent an enemy from advancing along the Smolensk road to Moscow. + +Napoleon, riding to Valuevo on the twenty-fourth, did not see (as +the history books say he did) the position of the Russians from Utitsa +to Borodino (he could not have seen that position because it did not +exist), nor did he see an advanced post of the Russian army, but while +pursuing the Russian rearguard he came upon the left flank of the +Russian position--at the Shevardino Redoubt--and unexpectedly for +the Russians moved his army across the Kolocha. And the Russians, +not having time to begin a general engagement, withdrew their left +wing from the position they had intended to occupy and took up a new +position which had not been foreseen and was not fortified. By +crossing to the other side of the Kolocha to the left of the highroad, +Napoleon shifted the whole forthcoming battle from right to left +(looking from the Russian side) and transferred it to the plain +between Utitsa, Semenovsk, and Borodino--a plain no more +advantageous as a position than any other plain in Russia--and there +the whole battle of the twenty-sixth of August took place. + +Had Napoleon not ridden out on the evening of the twenty-fourth to +the Kolocha, and had he not then ordered an immediate attack on the +redoubt but had begun the attack next morning, no one would have +doubted that the Shevardino Redoubt was the left flank of our and +the battle would have taken place where we expected it. In that case +we should probably have defended the Shevardino Redoubt--our left +flank--still more obstinately. We should have attacked Napoleon in the +center or on the right, and the engagement would have taken place on +the twenty-fifth, in the position we intended and had fortified. But +as the attack on our left flank took place in the evening after the +retreat of our rear guard (that is, immediately after the fight at +Gridneva), and as the Russian commanders did not wish, or were not +in time, to begin a general engagement then on the evening of the +twenty-fourth, the first and chief action of the battle of Borodino +was already lost on the twenty-fourth, and obviously led to the loss +of the one fought on the twenty-sixth. + +After the loss of the Shevardino Redoubt, we found ourselves on +the morning of the twenty-fifth without a position for our left flank, +and were forced to bend it back and hastily entrench it where it +chanced to be. + +Not only was the Russian army on the twenty-sixth defended by +weak, unfinished entrenchments, but the disadvantage of that +position was increased by the fact that the Russian commanders--not +having fully realized what had happened, namely the loss of our +position on the left flank and the shifting of the whole field of +the forthcoming battle from right to left--maintained their extended +position from the village of Novoe to Utitsa, and consequently had +to move their forces from right to left during the battle. So it +happened that throughout the whole battle the Russians opposed the +entire French army launched against our left flank with but half as +many men. (Poniatowski's action against Utitsa, and Uvarov's on the +right flank against the French, were actions distinct from the main +course of the battle.) So the battle of Borodino did not take place at +all as (in an effort to conceal our commanders' mistakes even at the +cost of diminishing the glory due to the Russian army and people) it +has been described. The battle of Borodino was not fought on a +chosen and entrenched position with forces only slightly weaker than +those of the enemy, but, as a result of the loss of the Shevardino +Redoubt, the Russians fought the battle of Borodino on an open and +almost unentrenched position, with forces only half as numerous as the +French; that is to say, under conditions in which it was not merely +unthinkable to fight for ten hours and secure an indecisive result, +but unthinkable to keep an army even from complete disintegration +and flight. + + + + + +CHAPTER XX + + +On the morning of the twenty-fifth Pierre was leaving Mozhaysk. At +the descent of the high steep hill, down which a winding road led +out of the town past the cathedral on the right, where a service was +being held and the bells were ringing, Pierre got out of his vehicle +and proceeded on foot. Behind him a cavalry regiment was coming down +the hill preceded by its singers. Coming up toward him was a train +of carts carrying men who had been wounded in the engagement the day +before. The peasant drivers, shouting and lashing their horses, kept +crossing from side to side. The carts, in each of which three or +four wounded soldiers were lying or sitting, jolted over the stones +that had been thrown on the steep incline to make it something like +a road. The wounded, bandaged with rags, with pale cheeks, +compressed lips, and knitted brows, held on to the sides of the +carts as they were jolted against one another. Almost all of them +stared with naive, childlike curiosity at Pierre's white hat and green +swallow-tail coat. + +Pierre's coachman shouted angrily at the convoy of wounded to keep +to one side of the road. The cavalry regiment, as it descended the +hill with its singers, surrounded Pierre's carriage and blocked the +road. Pierre stopped, being pressed against the side of the cutting in +which the road ran. The sunshine from behind the hill did not +penetrate into the cutting and there it was cold and damp, but above +Pierre's head was the bright August sunshine and the bells sounded +merrily. One of the carts with wounded stopped by the side of the road +close to Pierre. The driver in his bast shoes ran panting up to it, +placed a stone under one of its tireless hind wheels, and began +arranging the breech-band on his little horse. + +One of the wounded, an old soldier with a bandaged arm who was +following the cart on foot, caught hold of it with his sound hand +and turned to look at Pierre. + +"I say, fellow countryman! Will they set us down here or take us +on to Moscow?" he asked. + +Pierre was so deep in thought that he did not hear the question. +He was looking now at the cavalry regiment that had met the convoy +of wounded, now at the cart by which he was standing, in which two +wounded men were sitting and one was lying. One of those sitting up in +the cart had probably been wounded in the cheek. His whole head was +wrapped in rags and one cheek was swollen to the size of a baby's +head. His nose and mouth were twisted to one side. This soldier was +looking at the cathedral and crossing himself. Another, a young lad, a +fair-haired recruit as white as though there was no blood in his +thin face, looked at Pierre kindly, with a fixed smile. The third +lay prone so that his face was not visible. The cavalry singers were +passing close by: + + Ah lost, quite lost... is my head so keen, + Living in a foreign land. + +they sang their soldiers' dance song. + +As if responding to them but with a different sort of merriment, the +metallic sound of the bells reverberated high above and the hot rays +of the sun bathed the top of the opposite slope with yet another +sort of merriment. But beneath the slope, by the cart with the wounded +near the panting little nag where Pierre stood, it was damp, somber, +and sad. + +The soldier with the swollen cheek looked angrily at the cavalry +singers. + +"Oh, the coxcombs!" he muttered reproachfully. + +"It's not the soldiers only, but I've seen peasants today, too.... +The peasants--even they have to go," said the soldier behind the cart, +addressing Pierre with a sad smile. "No distinctions made nowadays.... +They want the whole nation to fall on them--in a word, it's Moscow! +They want to make an end of it." + +In spite of the obscurity of the soldier's words Pierre understood +what he wanted to say and nodded approval. + +The road was clear again; Pierre descended the hill and drove on. + +He kept looking to either side of the road for familiar faces, but +only saw everywhere the unfamiliar faces of various military men of +different branches of the service, who all looked with astonishment at +his white hat and green tail coat. + +Having gone nearly three miles he at last met an acquaintance and +eagerly addressed him. This was one of the head army doctors. He was +driving toward Pierre in a covered gig, sitting beside a young +surgeon, and on recognizing Pierre he told the Cossack who occupied +the driver's seat to pull up. + +"Count! Your excellency, how come you to be here?" asked the doctor. + +"Well, you know, I wanted to see..." + +"Yes, yes, there will be something to see...." + +Pierre got out and talked to the doctor, explaining his intention of +taking part in a battle. + +The doctor advised him to apply direct to Kutuzov. + +"Why should you be God knows where out of sight, during the battle?" +he said, exchanging glances with his young companion. "Anyhow his +Serene Highness knows you and will receive you graciously. That's what +you must do." + +The doctor seemed tired and in a hurry. + +"You think so?... Ah, I also wanted to ask you where our position is +exactly?" said Pierre. + +"The position?" repeated the doctor. "Well, that's not my line. +Drive past Tatarinova, a lot of digging is going on there. Go up the +hillock and you'll see." + +"Can one see from there?... If you would..." + +But the doctor interrupted him and moved toward his gig. + +"I would go with you but on my honor I'm up to here"--and he pointed +to his throat. "I'm galloping to the commander of the corps. How do +matters stand?... You know, Count, there'll be a battle tomorrow. +Out of an army of a hundred thousand we must expect at least twenty +thousand wounded, and we haven't stretchers, or bunks, or dressers, or +doctors enough for six thousand. We have ten thousand carts, but we +need other things as well--we must manage as best we can!" + +The strange thought that of the thousands of men, young and old, who +had stared with merry surprise at his hat (perhaps the very men he had +noticed), twenty thousand were inevitably doomed to wounds and death +amazed Pierre. + +"They may die tomorrow; why are they thinking of anything but +death?" And by some latent sequence of thought the descent of the +Mozhaysk hill, the carts with the wounded, the ringing bells, the +slanting rays of the sun, and the songs of the cavalrymen vividly +recurred to his mind. + +"The cavalry ride to battle and meet the wounded and do not for a +moment think of what awaits them, but pass by, winking at the wounded. +Yet from among these men twenty thousand are doomed to die, and they +wonder at my hat! Strange!" thought Pierre, continuing his way to +Tatarinova. + +In front of a landowner's house to the left of the road stood +carriages, wagons, and crowds of orderlies and sentinels. The +commander in chief was putting up there, but just when Pierre +arrived he was not in and hardly any of the staff were there--they had +gone to the church service. Pierre drove on toward Gorki. + +When he had ascended the hill and reached the little village street, +he saw for the first time peasant militiamen in their white shirts and +with crosses on their caps, who, talking and laughing loudly, animated +and perspiring, were at work on a huge knoll overgrown with grass to +the right of the road. + +Some of them were digging, others were wheeling barrowloads of earth +along planks, while others stood about doing nothing. + +Two officers were standing on the knoll, directing the men. On +seeing these peasants, who were evidently still amused by the +novelty of their position as soldiers, Pierre once more thought of the +wounded men at Mozhaysk and understood what the soldier had meant when +he said: "They want the whole nation to fall on them." The sight of +these bearded peasants at work on the battlefield, with their queer, +clumsy boots and perspiring necks, and their shirts opening from the +left toward the middle, unfastened, exposing their sunburned +collarbones, impressed Pierre more strongly with the solemnity and +importance of the moment than anything he had yet seen or heard. + + + + + +CHAPTER XXI + + +Pierre stepped out of his carriage and, passing the toiling +militiamen, ascended the knoll from which, according to the doctor, +the battlefield could be seen. + +It was about eleven o'clock. The sun shone somewhat to the left +and behind him and brightly lit up the enormous panorama which, rising +like an amphitheater, extended before him in the clear rarefied +atmosphere. + +From above on the left, bisecting that amphitheater, wound the +Smolensk highroad, passing through a village with a white church +some five hundred paces in front of the knoll and below it. This was +Borodino. Below the village the road crossed the river by a bridge +and, winding down and up, rose higher and higher to the village of +Valuevo visible about four miles away, where Napoleon was then +stationed. Beyond Valuevo the road disappeared into a yellowing forest +on the horizon. Far in the distance in that birch and fir forest to +the right of the road, the cross and belfry of the Kolocha Monastery +gleamed in the sun. Here and there over the whole of that blue +expanse, to right and left of the forest and the road, smoking +campfires could be seen and indefinite masses of troops--ours and +the enemy's. The ground to the right--along the course of the +Kolocha and Moskva rivers--was broken and hilly. Between the hollows +the villages of Bezubova and Zakharino showed in the distance. On +the left the ground was more level; there were fields of grain, and +the smoking ruins of Semenovsk, which had been burned down, could be +seen. + +All that Pierre saw was so indefinite that neither the left nor +the right side of the field fully satisfied his expectations. +Nowhere could he see the battlefield he had expected to find, but only +fields, meadows, troops, woods, the smoke of campfires, villages, +mounds, and streams; and try as he would he could descry no military +"position" in this place which teemed with life, nor could he even +distinguish our troops from the enemy's. + +"I must ask someone who knows," he thought, and addressed an officer +who was looking with curiosity at his huge unmilitary figure. + +"May I ask you," said Pierre, "what village that is in front?" + +"Burdino, isn't it?" said the officer, turning to his companion. + +"Borodino," the other corrected him. + +The officer, evidently glad of an opportunity for a talk, moved up +to Pierre. + +"Are those our men there?" Pierre inquired. + +"Yes, and there, further on, are the French," said the officer. +"There they are, there... you can see them." + +"Where? Where?" asked Pierre. + +"One can see them with the naked eye... Why, there!" + +The officer pointed with his hand to the smoke visible on the left +beyond the river, and the same stern and serious expression that +Pierre had noticed on many of the faces he had met came into his face. + +"Ah, those are the French! And over there?..." Pierre pointed to a +knoll on the left, near which some troops could be seen. + +"Those are ours." + +"Ah, ours! And there?..." Pierre pointed to another knoll in the +distance with a big tree on it, near a village that lay in a hollow +where also some campfires were smoking and something black was +visible. + +"That's his again," said the officer. (It was the Shevardino +Redoubt.) "It was ours yesterday, but now it is his." + +"Then how about our position?" + +"Our position?" replied the officer with a smile of satisfaction. "I +can tell you quite clearly, because I constructed nearly all our +entrenchments. There, you see? There's our center, at Borodino, just +there," and he pointed to the village in front of them with the +white church. "That's where one crosses the Kolocha. You see down +there where the rows of hay are lying in the hollow, there's the +bridge. That's our center. Our right flank is over there"--he +pointed sharply to the right, far away in the broken ground--"That's +where the Moskva River is, and we have thrown up three redoubts there, +very strong ones. The left flank..." here the officer paused. "Well, +you see, that's difficult to explain.... Yesterday our left flank +was there at Shevardino, you see, where the oak is, but now we have +withdrawn our left wing--now it is over there, do you see that village +and the smoke? That's Semenovsk, yes, there," he pointed to +Raevski's knoll. "But the battle will hardly be there. His having +moved his troops there is only a ruse; he will probably pass round +to the right of the Moskva. But wherever it may be, many a man will be +missing tomorrow!" he remarked. + +An elderly sergeant who had approached the officer while he was +giving these explanations had waited in silence for him to finish +speaking, but at this point, evidently not liking the officer's +remark, interrupted him. + +"Gabions must be sent for," said he sternly. + +The officer appeared abashed, as though he understood that one might +think of how many men would be missing tomorrow but ought not to speak +to speak of it. + +"Well, send number three company again," the officer replied +hurriedly. + +"And you, are you one of the doctors?" + +"No, I've come on my own," answered Pierre, and he went down the +hill again, passing the militiamen. + +"Oh, those damned fellows!" muttered the officer who followed him, +holding his nose as he ran past the men at work. + +"There they are... bringing her, coming... There they are... They'll +be here in a minute..." voices were suddenly heard saying; and +officers, soldiers, and militiamen began running forward along the +road. + +A church procession was coming up the hill from Borodino. First +along the dusty road came the infantry in ranks, bareheaded and with +arms reversed. From behind them came the sound of church singing. + +Soldiers and militiamen ran bareheaded past Pierre toward the +procession. + +"They are bringing her, our Protectress!... The Iberian Mother of +God!" someone cried. + +"The Smolensk Mother of God," another corrected him. + +The militiamen, both those who had been in the village and those who +had been at work on the battery, threw down their spades and ran to +meet the church procession. Following the battalion that marched along +the dusty road came priests in their vestments--one little old man +in a hood with attendants and singers. Behind them soldiers and +officers bore a large, dark-faced icon with an embossed metal cover. +This was the icon that had been brought from and had since accompanied +the army. Behind, before, and on both sides, crowds of militiamen with +bared heads walked, ran, and bowed to the ground. + +At the summit of the hill they stopped with the icon; the men who +had been holding it up by the linen bands attached to it were relieved +by others, the chanters relit their censers, and service began. The +hot rays of the sun beat down vertically and a fresh soft wind +played with the hair of the bared heads and with the ribbons +decorating the icon. The singing did not sound loud under the open +sky. An immense crowd of bareheaded officers, soldiers, and militiamen +surrounded the icon. Behind the priest and a chanter stood the +notabilities on a spot reserved for them. A bald general with +general with a St. George's Cross on his neck stood just behind the +priest's back, and without crossing himself (he was evidently a +German) patiently awaited the end of the service, which he +considered it necessary to hear to the end, probably to arouse the +patriotism of the Russian people. Another general stood in a martial +pose, crossing himself by shaking his hand in front of his chest while +looking about him. Standing among the crowd of peasants, Pierre +recognized several acquaintances among these notables, but did not +look at them--his whole attention was absorbed in watching the serious +expression on the faces of the crowd of soldiers and militiamen who +were all gazing eagerly at the icon. As soon as the tired chanters, +who were singing the service for the twentieth time that day, began +lazily and mechanically to sing: "Save from calamity Thy servants, O +Mother of God," and the priest and deacon chimed in: "For to Thee +under God we all flee as to an inviolable bulwark and protection," +there again kindled in all those faces the same expression of +consciousness of the solemnity of the impending moment that Pierre had +seen on the faces at the foot of the hill at Mozhaysk and +momentarily on many and many faces he had met that morning; and +heads were bowed more frequently and hair tossed back, and sighs and +the sound men made as they crossed themselves were heard. + +The crowd round the icon suddenly parted and pressed against Pierre. +Someone, a very important personage judging by the haste with which +way was made for him, was approaching the icon. + +It was Kutuzov, who had been riding round the position and on his +way back to Tatarinova had stopped where the service was being held. +Pierre recognized him at once by his peculiar figure, which +distinguished him from everybody else. + +With a long overcoat on his his exceedingly stout, +round-shouldered body, with uncovered white head and puffy face +showing the white ball of the eye he had lost, Kutuzov walked with +plunging, swaying gait into the crowd and stopped behind the priest. +He crossed himself with an accustomed movement, bent till he touched +the ground with his hand, and bowed his white head with a deep sigh. +Behind Kutuzov was Bennigsen and the suite. Despite the presence of +the commander in chief, who attracted the attention of all the +superior officers, the militiamen and soldiers continued their prayers +without looking at him. + +When the service was over, Kutuzov stepped up to the icon, sank +heavily to his knees, bowed to the ground, and for a long time tried +vainly to rise, but could not do so on account of his weakness and +weight. His white head twitched with the effort. At last he rose, +kissed the icon as a child does with naively pouting lips, and again +bowed till he touched the ground with his hand. The other generals +followed his example, then the officers, and after them with excited +faces, pressing on one another, crowding, panting, and pushing, +scrambled the soldiers and militiamen. + + + + + +CHAPTER XXII + + +Staggering amid the crush, Pierre looked about him. + +"Count Peter Kirilovich! How did you get here?" said a voice. + +Pierre looked round. Boris Drubetskoy, brushing his knees with his +hand (he had probably soiled them when he, too, had knelt before the +icon), came up to him smiling. Boris was elegantly dressed, with a +slightly martial touch appropriate to a campaign. He wore a long +coat and like Kutuzov had a whip slung across his shoulder. + +Meanwhile Kutuzov had reached the village and seated himself in +the shade of the nearest house, on a bench which one Cossack had run +to fetch and another had hastily covered with a rug. An immense and +brilliant suite surrounded him. + +The icon was carried further, accompanied by the throng. Pierre +stopped some thirty paces from Kutuzov, talking to Boris. + +He explained his wish to be present at the battle and to see the +position. + +"This is what you must do," said Boris. "I will do the honors of the +camp to you. You will see everything best from where Count Bennigsen +will be. I am in attendance on him, you know; I'll mention it to +him. But if you want to ride round the position, come along with us. +We are just going to the left flank. Then when we get back, do spend +the night with me and we'll arrange a game of cards. Of course you +know Dmitri Sergeevich? Those are his quarters," and he pointed to the +third house in the village of Gorki. + +"But I should like to see the right flank. They say it's very +strong," said Pierre. "I should like to start from the Moskva River +and ride round the whole position." + +"Well, you can do that later, but the chief thing is the left +flank." + +"Yes, yes. But where is Prince Bolkonski's regiment? Can you point +it out to me?" + +"Prince Andrew's? We shall pass it and I'll take you to him." + +"What about the left flank?" asked Pierre + +"To tell you the truth, between ourselves, God only knows what state +our left flank is in," said Boris confidentially lowering his voice. +"It is not at all what Count Bennigsen intended. He meant to fortify +that knoll quite differently, but..." Boris shrugged his shoulders, +"his Serene Highness would not have it, or someone persuaded him. +You see..." but Boris did not finish, for at that moment Kaysarov, +Kutuzov's adjutant, came up to Pierre. "Ah, Kaysarov!" said Boris, +addressing him with an unembarrassed smile, "I was just trying to +explain our position to the count. It is amazing how his Serene +Highness could so the intentions of the French!" + +"You mean the left flank?" asked Kaysarov. + + +"Yes, exactly; the left flank is now extremely strong." + +Though Kutuzov had dismissed all unnecessary men from the staff, +Boris had contrived to remain at headquarters after the changes. He +had established himself with Count Bennigsen, who, like all on whom +Boris had been in attendance, considered young Prince Drubetskoy an +invaluable man. + +In the higher command there were two sharply defined parties: +Kutuzov's party and that of Bennigsen, the chief of staff. Boris +belonged to the latter and no one else, while showing servile +respect to Kutuzov, could so create an impression that the old +fellow was not much good and that Bennigsen managed everything. Now +the decisive moment of battle had come when Kutuzov would be destroyed +and the power pass to Bennigsen, or even if Kutuzov won the battle +it would be felt that everything was done by Bennigsen. In any case +many great rewards would have to be given for tomorrow's action, and +new men would come to the front. So Boris was full of nervous vivacity +all day. + +After Kaysarov, others whom Pierre knew came up to him, and he had +not time to reply to all the questions about Moscow that were showered +upon him, or to listen to all that was told him. The faces all +expressed animation and apprehension, but it seemed to Pierre that the +cause of the excitement shown in some of these faces lay chiefly in +questions of personal success; his mind, however, was occupied by +the different expression he saw on other faces--an expression that +spoke not of personal matters but of the universal questions of life +and death. Kutuzov noticed Pierre's figure and the group gathered +round him. + +"Call him to me," said Kutuzov. + +An adjutant told Pierre of his Serene Highness' wish, and Pierre +went toward Kutuzov's bench. But a militiaman got there before him. It +was Dolokhov. + +"How did that fellow get here?" asked Pierre. + +"He's a creature that wriggles in anywhere!" was the answer. "He has +been degraded, you know. Now he wants to bob up again. He's been +proposing some scheme or other and has crawled into the enemy's picket +line at night.... He's a brave fellow." + +Pierre took off his hat and bowed respectfully to Kutuzov. + +"I concluded that if I reported to your Serene Highness you might +send me away or say that you knew what I was reporting, but then I +shouldn't lose anything..." Dolokhov was saying. + +"Yes, yes." + +"But if I were right, I should be rendering a service to my +Fatherland for which I am ready to die." + +"Yes, yes." + +"And should your Serene Highness require a man who will not spare +his skin, please think of me.... Perhaps I may prove useful to your +Serene Highness." + +"Yes... Yes..." Kutuzov repeated, his laughing eye narrowing more +and more as he looked at Pierre. + +Just then Boris, with his courtierlike adroitness, stepped up to +Pierre's side near Kutuzov and in a most natural manner, without +raising his voice, said to Pierre, as though continuing an interrupted +conversation: + +"The militia have put on clean white shirts to be ready to die. What +heroism, Count!" + +Boris evidently said this to Pierre in order to be overheard by +his Serene Highness. He knew Kutuzov's attention would be caught by +those words, and so it was. + +"What are you saying about the militia?" he asked Boris. + +"Preparing for tomorrow, your Serene Highness--for death--they +have put on clean shirts." + +"Ah... a wonderful, a matchless people!" said Kutuzov; and he closed +his eyes and swayed his head. "A matchless people!" he repeated with a +sigh. + +"So you want to smell gunpowder?" he said to Pierre. "Yes, it's a +pleasant smell. I have the honor to be one of your wife's adorers. +Is she well? My quarters are at your service." + +And as often happens with old people, Kutuzov began looking about +absent-mindedly as if forgetting all he wanted to say or do. + +Then, evidently remembering what he wanted, he beckoned to Andrew +Kaysarov, his adjutant's brother. + +"Those verses... those verses of Marin's... how do they go, eh? +Those he wrote about Gerakov: 'Lectures for the corps inditing'... +Recite them, recite them!" said he, evidently preparing to laugh. + +Kaysarov recited.... Kutuzov smilingly nodded his head to the rhythm +of the verses. + +When Pierre had left Kutuzov, Dolokhov came up to him and took his +hand. + +"I am very glad to meet you here, Count," he said aloud, +regardless of the presence of strangers and in a particularly resolute +and solemn tone. "On the eve of a day when God alone knows who of us +is fated to survive, I am glad of this opportunity to tell you that +I regret the misunderstandings that occurred between us and should +wish you not to have any ill feeling for me. I beg you to forgive me." + +Pierre looked at Dolokhov with a smile, not knowing what to say to +him. With tears in his eyes Dolokhov embraced Pierre and kissed him. + +Boris said a few words to his general, and Count Bennigsen turned to +Pierre and proposed that he should ride with him along the line. + +"It will interest you," said he. + +"Yes, very much," replied Pierre. + +Half an hour later Kutuzov left for Tatarinova, and Bennigsen and +his suite, with Pierre among them, set out on their ride along the +line. + + + + + +CHAPTER XXIII + + +From Gorki, Bennigsen descended the highroad to the bridge which, +when they had looked it from the hill, the officer had pointed out +as being the center of our position and where rows of fragrant +new-mown hay lay by the riverside. They rode across that bridge into +the village of Borodino and thence turned to the left, passing an +enormous number of troops and guns, and came to a high knoll where +militiamen were digging. This was the redoubt, as yet unnamed, which +afterwards became known as the Raevski Redoubt, or the Knoll +Battery, but Pierre paid no special attention to it. He did not know +that it would become more memorable to him than any other spot on +the plain of Borodino. + +They then crossed the hollow to Semenovsk, where the soldiers were +dragging away the last logs from the huts and barns. Then they rode +downhill and uphill, across a ryefield trodden and beaten down as if +by hail, following a track freshly made by the artillery over the +furrows of the plowed land, and reached some fleches* which were still +being dug. + + +*A kind of entrenchment. + + +At the fleches Bennigsen stopped and began looking at the Shevardino +Redoubt opposite, which had been ours the day before and where several +horsemen could be descried. The officers said that either Napoleon +or Murat was there, and they all gazed eagerly at this little group of +horsemen. Pierre also looked at them, trying to guess which of the +scarcely discernible figures was Napoleon. At last those mounted men +rode away from the mound and disappeared. + +Bennigsen spoke to a general who approached him, and began +explaining the whole position of our troops. Pierre listened to him, +straining each faculty to understand the essential points of the +impending battle, but was mortified to feel that his mental capacity +was inadequate for the task. He could make nothing of it. Bennigsen +stopped speaking and, noticing that Pierre was listening, suddenly +said to him: + +"I don't think this interests you?" + +"On the contrary it's very interesting!" replied Pierre not quite +truthfully. + +From the fleches they rode still farther to the left, along a road +winding through a thick, low-growing birch wood. In the middle of +the wood a brown hare with white feet sprang out and, scared by the +tramp of the many horses, grew so confused that it leaped along the +road in front of them for some time, arousing general attention and +laughter, and only when several voices shouted at it did it dart to +one side and disappear in the thicket. After going through the wood +for about a mile and a half they came out on a glade where troops of +Tuchkov's corps were stationed to defend the left flank. + +Here, at the extreme left flank, Bennigsen talked a great deal and +with much heat, and, as it seemed to Pierre, gave orders of great +military importance. In front of Tuchkov's troops was some high ground +not occupied by troops. Bennigsen loudly criticized this mistake, +saying that it was madness to leave a height which commanded the +country around unoccupied and to place troops below it. Some of the +generals expressed the same opinion. One in particular declared with +martial heat that they were put there to be slaughtered. Bennigsen +on his own authority ordered the troops to occupy the high ground. +This disposition on the left flank increased Pierre's doubt of his own +capacity to understand military matters. Listening to Bennigsen and +the generals criticizing the position of the troops behind the hill, +he quite understood them and shared their opinion, but for that very +reason he could not understand how the man who put them there behind +the hill could have made so gross and palpable a blunder. + +Pierre did not know that these troops were not, as Bennigsen +supposed, put there to defend the position, but were in a concealed +position as an ambush, that they should not be seen and might be +able to strike an approaching enemy unexpectedly. Bennigsen did not +know this and moved the troops forward according to his own ideas +without mentioning the matter to the commander in chief. + + + + + +CHAPTER XXIV + + +On that bright evening of August 25, Prince Andrew lay leaning on +his elbow in a broken-down shed in the village of Knyazkovo at the +further end of his regiment's encampment. Through a gap in the +broken wall he could see, beside the wooden fence, a row of thirty +year-old birches with their lower branches lopped off, a field on +which shocks of oats were standing, and some bushes near which rose +the smoke of campfires--the soldiers' kitchens. + +Narrow and burdensome and useless to anyone as his life now seemed +to him, Prince Andrew on the eve of battle felt agitated and irritable +as he had done seven years before at Austerlitz. + +He had received and given the orders for next day's battle and had +nothing more to do. But his thoughts--the simplest, clearest, and +therefore most terrible thoughts--would give him no peace. He knew +that tomorrow's battle would be the most terrible of all he had +taken part in, and for the first time in his life the possibility of +death presented itself to him--not in relation to any worldly matter +or with reference to its effect on others, but simply in relation to +himself, to his own soul--vividly, plainly, terribly, and almost as +a certainty. And from the height of this perception all that had +previously tormented and preoccupied him suddenly became illumined +by a cold white light without shadows, without perspective, without +distinction of outline. All life appeared to him like magic-lantern +pictures at which he had long been gazing by artificial light +through a glass. Now he suddenly saw those badly daubed pictures in +clear daylight and without a glass. "Yes, yes! There they are, those +false images that agitated, enraptured, and tormented me," said he +to himself, passing in review the principal pictures of the magic +lantern of life and regarding them now in the cold white daylight of +his clear perception of death. "There they are, those rudely painted +figures that once seemed splendid and mysterious. Glory, the good of +society, love of a woman, the Fatherland itself--how important these +pictures appeared to me, with what profound meaning they seemed to +be filled! And it is all so simple, pale, and crude in the cold +white light of this morning which I feel is dawning for me." The three +great sorrows of his life held his attention in particular: his love +for a woman, his father's death, and the French invasion which had +overrun half Russia. "Love... that little girl who seemed to me +brimming over with mystic forces! Yes, indeed, I loved her. I made +romantic plans of love and happiness with her! Oh, what a boy I +was!" he said aloud bitterly. "Ah me! I believed in some ideal love +which was to keep her faithful to me for the whole year of my absence! +Like the gentle dove in the fable she was to pine apart from me.... +But it was much simpler really.... It was all very simple and +horrible." + +"When my father built Bald Hills he thought the place was his: his +land, his air, his peasants. But Napoleon came and swept him aside, +unconscious of his existence, as he might brush a chip from his +path, and his Bald Hills and his whole life fell to pieces. Princess +Mary says it is a trial sent from above. What is the trial for, when +he is not here and will never return? He is not here! For whom then is +the trial intended? The Fatherland, the destruction of Moscow! And +tomorrow I shall be killed, perhaps not even by a Frenchman but by one +of our own men, by a soldier discharging a musket close to my ear as +one of them did yesterday, and the French will come and take me by +head and heels and fling me into a hole that I may not stink under +their noses, and new conditions of life will arise, which will seem +quite ordinary to others and about which I shall know nothing. I shall +not exist..." + +He looked at the row of birches shining in the sunshine, with +their motionless green and yellow foliage and white bark. "To die... +to be killed tomorrow... That I should not exist... That all this +should still be, but no me...." + +And the birches with their light and shade, the curly clouds, the +smoke of the campfires, and all that was around him changed and seemed +terrible and menacing. A cold shiver ran down his spine. He rose +quickly, went out of the shed, and began to walk about. + +After he had returned, voices were heard outside the shed. "Who's +that?" he cried. + +The red-nosed Captain Timokhin, formerly Dolokhov's squadron +commander, but now from lack of officers a battalion commander, + +shyly entered the shed followed by an adjutant and the regimental +paymaster. + +Prince Andrew rose hastily, listened to the business they had come +about, gave them some further instructions, and was about to dismiss +them when he heard a familiar, lisping, voice behind the shed. + +"Devil take it!" said the voice of a man stumbling over something. + +Prince Andrew looked out of the shed and saw Pierre, who had tripped +over a pole on the ground and had nearly fallen, coming his way. It +was unpleasant to Prince Andrew to meet people of his own set in +general, and Pierre especially, for he reminded him of all the painful +moments of his last visit to Moscow. + +"You? What a surprise!" said he. "What brings you here? This is +unexpected!" + +As he said this his eyes and face expressed more than coldness--they +expressed hostility, which Pierre noticed at once. He had approached +the shed full of animation, but on seeing Prince Andrew's face he felt +constrained and ill at ease. + +"I have come... simply... you know... come... it interests me," said +Pierre, who had so often that day senselessly repeated that word +"interesting." "I wish to see the battle." + +"Oh yes, and what do the Masonic brothers say about war? How would +they stop it?" said Prince Andrew sarcastically. "Well, and how's +Moscow? And my people? Have they reached Moscow at last?" he asked +seriously. + +"Yes, they have. Julie Drubetskaya told me so. I went to see them, +but missed them. They have gone to your estate near Moscow." + + + + + +CHAPTER XXV + + +The officers were about to take leave, but Prince Andrew, apparently +reluctant to be left alone with his friend, asked them to stay and +have tea. Seats were brought in and so was the tea. The officers gazed +with surprise at Pierre's huge stout figure and listened to his talk +of Moscow and the position of our army, round which he had ridden. +Prince Andrew remained silent, and his expression was so forbidding +that Pierre addressed his remarks chiefly to the good-natured +battalion commander. + +"So you understand the whole position of our troops?" Prince +Andrew interrupted him. + +"Yes--that is, how do you mean?" said Pierre. "Not being a +military man I can't say I have understood it fully, but I +understand the general position." + +"Well, then, you know more than anyone else, be it who it may," said +Prince Andrew. + +"Oh!" said Pierre, looking over his spectacles in perplexity at +Prince Andrew. "Well, and what do think of Kutuzov's appointment?" +he asked. + +"I was very glad of his appointment, that's all I know," replied +Prince Andrew. + +"And tell me your opinion of Barclay de Tolly. In Moscow they are +saying heaven knows what about him.... What do you think of him?" + +"Ask them," replied Prince Andrew, indicating the officers. + +Pierre looked at Timokhin with the condescendingly interrogative +smile with which everybody involuntarily addressed that officer. + +"We see light again, since his Serenity has been appointed, your +excellency," said Timokhin timidly, and continually turning to +glance at his colonel. + +"Why so?" asked Pierre. + +"Well, to mention only firewood and fodder, let me inform you. +Why, when we were retreating from Sventsyani we dare not touch a stick +or a wisp of hay or anything. You see, we were going away, so he would +get it all; wasn't it so, your excellency?" and again Timokhin +turned to the prince. "But we daren't. In our regiment two officers +were court-martialed for that kind of thing. But when his Serenity +took command everything became straight forward. Now we see light..." + +"Then why was it forbidden?" + +Timokhin looked about in confusion, not knowing what or how to +answer such a question. Pierre put the same question to Prince Andrew. + +"Why, so as not to lay waste the country we were abandoning to the +enemy," said Prince Andrew with venomous irony. "It is very sound: one +can't permit the land to be pillaged and accustom the troops to +marauding. At Smolensk too he judged correctly that the French might +outflank us, as they had larger forces. But he could not understand +this," cried Prince Andrew in a shrill voice that seemed to escape him +involuntarily: "he could not understand that there, for the first +time, we were fighting for Russian soil, and that there was a spirit +in the men such as I had never seen before, that we had held the +French for two days, and that that success had increased our +strength tenfold. He ordered us to retreat, and all our efforts and +losses went for nothing. He had no thought of betraying us, he tried +to do the best he could, he thought out everything, and that is why he +is unsuitable. He is unsuitable now, just because he plans out +everything very thoroughly and accurately as every German has to. +How can I explain?... Well, say your father has a German valet, and he +is a splendid valet and satisfies your father's requirements better +than you could, then it's all right to let him serve. But if your +father is mortally sick you'll send the valet away and attend to +your father with your own unpracticed, awkward hands, and will +soothe him better than a skilled man who is a stranger could. So it +has been with Barclay. While Russia was well, a foreigner could +serve her and be a splendid minister; but as soon as she is in +danger she needs one of her own kin. But in your Club they have been +making him out a traitor! They slander him as a traitor, and the +only result will be that afterwards, ashamed of their false +accusations, they will make him out a hero or a genius instead of a +traitor, and that will be still more unjust. He is an honest and +very punctilious German." + +"And they say he's a skillful commander," rejoined Pierre. + +"I don't understand what is meant by 'a skillful commander,'" +replied Prince Andrew ironically. + +"A skillful commander?" replied Pierre. "Why, one who foresees all +contingencies... and foresees the adversary's intentions." + +"But that's impossible," said Prince Andrew as if it were a matter +settled long ago. + +Pierre looked at him in surprise. + +"And yet they say that war is like a game of chess?" he remarked. + +"Yes," replied Prince Andrew, "but with this little difference, that +in chess you may think over each move as long as you please and are +not limited for time, and with this difference too, that a knight is +always stronger than a pawn, and two pawns are always stronger than +one, while in war a battalion is sometimes stronger than a division +and sometimes weaker than a company. The relative strength of bodies +of troops can never be known to anyone. Believe me," he went on, "if +things depended on arrangements made by the staff, I should be there +making arrangements, but instead of that I have the honor to serve +here in the regiment with these gentlemen, and I consider that on us +tomorrow's battle will depend and not on those others.... Success +never depends, and never will depend, on position, or equipment, or +even on numbers, and least of all on position." + +"But on what then?" + +"On the feeling that is in me and in him," he pointed to Timokhin, +"and in each soldier." + +Prince Andrew glanced at Timokhin, who looked at his commander in +alarm and bewilderment. In contrast to his former reticent taciturnity +Prince Andrew now seemed excited. He could apparently not refrain from +expressing the thoughts that had suddenly occurred to him. + +"A battle is won by those who firmly resolve to win it! Why did we +lose the battle at Austerlitz? The French losses were almost equal +to ours, but very early we said to ourselves that we were losing the +battle, and we did lose it. And we said so because we had nothing to +fight for there, we wanted to get away from the battlefield as soon as +we could. 'We've lost, so let us run,' and we ran. If we had not +said that till the evening, heaven knows what might not have happened. +But tomorrow we shan't say it! You talk about our position, the left +flank weak and the right flank too extended," he went on. "That's +all nonsense, there's nothing of the kind. But what awaits us +tomorrow? A hundred million most diverse chances which will be decided +on the instant by the fact that our men or theirs run or do not run, +and that this man or that man is killed, but all that is being done at +present is only play. The fact is that those men with whom you have +ridden round the position not only do not help matters, but hinder. +They are only concerned with their own petty interests." + +"At such a moment?" said Pierre reproachfully. + +"At such a moment!" Prince Andrew repeated. "To them it is only a +moment affording opportunities to undermine a rival and obtain an +extra cross or ribbon. For me tomorrow means this: a Russian army of a +hundred thousand and a French army of a hundred thousand have met to +fight, and the thing is that these two hundred thousand men will fight +and the side that fights more fiercely and spares itself least will +win. And if you like I will tell you that whatever happens and +whatever muddles those at the top may make, we shall win tomorrow's +battle. Tomorrow, happen what may, we shall win!" + +"There now, your excellency! That's the truth, the real truth," said +Timokhin. "Who would spare himself now? The soldiers in my +battalion, believe me, wouldn't drink their vodka! 'It's not the day +for that!' they say." + +All were silent. The officers rose. Prince Andrew went out of the +shed with them, giving final orders to the adjutant. After they had +gone Pierre approached Prince Andrew and was about to start a +conversation when they heard the clatter of three horses' hoofs on the +road not far from the shed, and looking in that direction Prince +Andrew recognized Wolzogen and Clausewitz accompanied by a Cossack. +They rode close by continuing to converse, and Prince Andrew +involuntarily heard these words: + +"Der Krieg muss in Raum verlegt werden. Der Ansicht kann ich nicht +genug Preis geben,"* said one of them. + + +*"The war must be extended widely. I cannot sufficiently commend +that view." + + +"Oh, ja," said the other, "der Zweck ist nur den Feind zu schwachen, +so kann man gewiss nicht den Verlust der Privat-Personen in Achtung +nehmen."* + + +*"Oh, yes, the only aim is to weaken the enemy, so of course one +cannot take into account the loss of private individuals." + + +"Oh, no," agreed the other. + +"Extend widely!" said Prince Andrew with an angry snort, when they +had ridden past. "In that 'extend' were my father, son, and sister, at +Bald Hills. That's all the same to him! That's what I was saying to +you--those German gentlemen won't win the battle tomorrow but will +only make all the mess they can, because they have nothing in their +German heads but theories not worth an empty eggshell and haven't in +their hearts the one thing needed tomorrow--that which Timokhin has. +They have yielded up all Europe to him, and have now come to teach us. +Fine teachers!" and again his voice grew shrill. + +"So you think we shall win tomorrow's battle?" asked Pierre. + +"Yes, yes," answered Prince Andrew absently. "One thing I would do + +if I had the power," he began again, "I would not take prisoners. +Why take prisoners? It's chivalry! The French have destroyed my home +and are on their way to destroy Moscow, they have outraged and are +outraging me every moment. They are my enemies. In my opinion they are +all criminals. And so thinks Timokhin and the whole army. They +should be executed! Since they are my foes they cannot be my +friends, whatever may have been said at Tilsit." + +"Yes, yes," muttered Pierre, looking with shining eyes at Prince +Andrew. "I quite agree with you!" + +The question that had perturbed Pierre on the Mozhaysk hill and +all that day now seemed to him quite clear and completely solved. He +now understood the whole meaning and importance of this war and of the +impending battle. All he had seen that day, all the significant and +stern expressions on the faces he had seen in passing, were lit up for +him by a new light. He understood that latent heat (as they say in +physics) of patriotism which was present in all these men he had seen, +and this explained to him why they all prepared for death calmly, +and as it were lightheartedly. + +"Not take prisoners," Prince Andrew continued: "That by itself would +quite change the whole war and make it less cruel. As it is we have +played at war--that's what's vile! We play at magnanimity and all that +stuff. Such magnanimity and sensibility are like the magnanimity and +sensibility of a lady who faints when she sees a calf being killed: +she is so kind-hearted that she can't look at blood, but enjoys eating +the calf served up with sauce. They talk to us of the rules of war, of +chivalry, of flags of truce, of mercy to the unfortunate and so on. +It's all rubbish! I saw chivalry and flags of truce in 1805; they +humbugged us and we humbugged them. They plunder other people's +houses, issue false paper money, and worst of all they kill my +children and my father, and then talk of rules of war and +magnanimity to foes! Take no prisoners, but kill and be killed! He who +has come to this as I have through the same sufferings..." + +Prince Andrew, who had thought it was all the same to him whether or +not Moscow was taken as Smolensk had been, was suddenly checked in his +speech by an unexpected cramp in his throat. He paced up and down a +few times in silence, but his eyes glittered feverishly and his lips +quivered as he began speaking. + +"If there was none of this magnanimity in war, we should go to war +only when it was worth while going to certain death, as now. Then +there would not be war because Paul Ivanovich had offended Michael +Ivanovich. And when there was a war, like this one, it would be war! +And then the determination of the troops would be quite different. +Then all these Westphalians and Hessians whom Napoleon is leading +would not follow him into Russia, and we should not go to fight in +Austria and Prussia without knowing why. War is not courtesy but the +most horrible thing in life; and we ought to understand that and not +play at war. We ought to accept this terrible necessity sternly and +seriously. It all lies in that: get rid of falsehood and let war be +war and not a game. As it is now, war is the favorite pastime of the +idle and frivolous. The military calling is the most highly honored. + +"But what is war? What is needed for success in warfare? What are +the habits of the military? The aim of war is murder; the methods of +war are spying, treachery, and their encouragement, the ruin of a +country's inhabitants, robbing them or stealing to provision the army, +and fraud and falsehood termed military craft. The habits of the +military class are the absence of freedom, that is, discipline, +idleness, ignorance, cruelty, debauchery, and drunkenness. And in +spite of all this it is the highest class, respected by everyone. +All the kings, except the Chinese, wear military uniforms, and he +who kills most people receives the highest rewards. + +"They meet, as we shall meet tomorrow, to murder one another; they +kill and maim tens of thousands, and then have thanksgiving services +for having killed so many people (they even exaggerate the number), +and they announce a victory, supposing that the more people they +have killed the greater their achievement. How does God above look +at them and hear them?" exclaimed Prince Andrew in a shrill, +piercing voice. "Ah, my friend, it has of late become hard for me to +live. I see that I have begun to understand too much. And it doesn't +do for man to taste of the tree of knowledge of good and evil.... +Ah, well, it's not for long!" he added. + +"However, you're sleepy, and it's time for me to sleep. Go back to +Gorki!" said Prince Andrew suddenly. + +"Oh no!" Pierre replied, looking at Prince Andrew with frightened, +compassionate eyes. + +"Go, go! Before a battle one must have one's sleep out," repeated +Prince Andrew. + +He came quickly up to Pierre and embraced and kissed him. +"Good-by, be off!" he shouted. "Whether we meet again or not..." +and turning away hurriedly he entered the shed. + +It was already dark, and Pierre could not make out whether the +expression of Prince Andrew's face was angry or tender. + +For some time he stood in silence considering whether he should +follow him or go away. "No, he does not want it!" Pierre concluded. +"And I know that this is our last meeting!" He sighed deeply and +rode back to Gorki. + +On re-entering the shed Prince Andrew lay down on a rug, but he +could not sleep. + +He closed his eyes. One picture succeeded another in his +imagination. On one of them he dwelt long and joyfully. He vividly +recalled an evening in Petersburg. Natasha with animated and excited +face was telling him how she had gone to look for mushrooms the +previous summer and had lost her way in the big forest. She +incoherently described the depths of the forest, her feelings, and a +talk with a beekeeper she met, and constantly interrupted her story to +say: "No, I can't! I'm not telling it right; no, you don't +understand," though he encouraged her by saying that he did +understand, and he really had understood all she wanted to say. But +Natasha was not satisfied with her own words: she felt that they did +not convey the passionately poetic feeling she had experienced that +day and wished to convey. "He was such a delightful old man, and it +was so dark in the forest... and he had such kind... No, I can't +describe it," she had said, flushed and excited. Prince Andrew +smiled now the same happy smile as then when he had looked into her +eyes. "I understood her," he thought. "I not only understood her, +but it was just that inner, spiritual force, that sincerity, that +frankness of soul--that very soul of hers which seemed to be +fettered by her body--it was that soul I loved in her... loved so +strongly and happily..." and suddenly he remembered how his love had +ended. "He did not need anything of that kind. He neither saw nor +understood anything of the sort. He only saw in her a pretty and fresh +young girl, with whom he did not deign to unite his fate. And I?... +and he is still alive and gay!" + +Prince Andrew jumped up as if someone had burned him, and again +began pacing up and down in front of the shed. + + + + + +CHAPTER XXVI + + +On August 25, the eve of the battle of Borodino, M. de Beausset, +prefect of the French Emperor's palace, arrived at Napoleon's quarters +at Valuevo with Colonel Fabvier, the former from Paris and the +latter from Madrid. + +Donning his court uniform, M. de Beausset ordered a box he had +brought for the Emperor to be carried before him and entered the first +compartment of Napoleon's tent, where he began opening the box while +conversing with Napoleon's aides-de-camp who surrounded him. + +Fabvier, not entering the tent, remained at the entrance talking +to some generals of his acquaintance. + +The Emperor Napoleon had not yet left his bedroom and was +finishing his toilet. Slightly snorting and grunting, he presented now +his back and now his plump hairy chest to the brush with which his +valet was rubbing him down. Another valet, with his finger over the +mouth of a bottle, was sprinkling Eau de Cologne on the Emperor's +pampered body with an expression which seemed to say that he alone +knew where and how much Eau de Cologne should be sprinkled. Napoleon's +short hair was wet and matted on the forehead, but his face, though +puffy and yellow, expressed physical satisfaction. "Go on, harder, +go on!" he muttered to the valet who was rubbing him, slightly +twitching and grunting. An aide-de-camp, who had entered the bedroom +to report to the Emperor the number of prisoners taken in +yesterday's action, was standing by the door after delivering his +message, awaiting permission to withdraw. Napoleon, frowning, looked +at him from under his brows. + +"No prisoners!" said he, repeating the aide-de-camp's words. "They +are forcing us to exterminate them. So much the worse for the +Russian army.... Go on... harder, harder!" he muttered, hunching his +back and presenting his fat shoulders. + +"All right. Let Monsieur de Beausset enter, and Fabvier too," he +said, nodding to the aide-de-camp. + +"Yes, sire," and the aide-de-camp disappeared through the door of +the tent. + +Two valets rapidly dressed His Majesty, and wearing the blue uniform +of the Guards he went with firm quick steps to the reception room. + +De Beausset's hands meanwhile were busily engaged arranging the +present he had brought from the Empress, on two chairs directly in +front of the entrance. But Napoleon had dressed and come out with such +unexpected rapidity that he had not time to finish arranging the +surprise. + +Napoleon noticed at once what they were about and guessed that +they were not ready. He did not wish to deprive them of the pleasure +of giving him a surprise, so he pretended not to see de Beausset and +called Fabvier to him, listening silently and with a stern frown to +what Fabvier told him of the heroism and devotion of his troops +fighting at Salamanca, at the other end of Europe, with but one +thought--to be worthy of their Emperor--and but one fear--to fail to +please him. The result of that battle had been deplorable. Napoleon +made ironic remarks during Fabvier's account, as if he had not +expected that matters could go otherwise in his absence. + +"I must make up for that in Moscow," said Napoleon. "I'll see you +later," he added, and summoned de Beausset, who by that time had +prepared the surprise, having placed something on the chairs and +covered it with a cloth. + +De Beausset bowed low, with that courtly French bow which only the +old retainers of the Bourbons knew how to make, and approached him, +presenting an envelope. + +Napoleon turned to him gaily and pulled his ear. + +"You have hurried here. I am very glad. Well, what is Paris saying?" +he asked, suddenly changing his former stern expression for a most +cordial tone. + +"Sire, all Paris regrets your absence," replied de Beausset as was +proper. + +But though Napoleon knew that de Beausset had to say something of +this kind, and though in his lucid moments he knew it was untrue, he +was pleased to hear it from him. Again he honored him by touching +his ear. + +"I am very sorry to have made you travel so far," said he. + +"Sire, I expected nothing less than to find you at the gates of +Moscow," replied de Beausset. + +Napoleon smiled and, lifting his head absentmindedly, glanced to the +right. An aide-de-camp approached with gliding steps and offered him a +gold snuffbox, which he took. + +"Yes, it has happened luckily for you," he said, raising the open +snuffbox to his nose. "You are fond of travel, and in three days you +will see Moscow. You surely did not expect to see that Asiatic +capital. You will have a pleasant journey." + +De Beausset bowed gratefully at this regard for his taste for travel +(of which he had not till then been aware). + +"Ha, what's this?" asked Napoleon, noticing that all the courtiers +were looking at something concealed under a cloth. + +With courtly adroitness de Beausset half turned and without +turning his back to the Emperor retired two steps, twitching off the +cloth at the same time, and said: + +"A present to Your Majesty from the Empress." + +It was a portrait, painted in bright colors by Gerard, of the son +borne to Napoleon by the daughter of the Emperor of Austria, the boy +whom for some reason everyone called "The King of Rome." + +A very pretty curly-headed boy with a look of the Christ in the +Sistine Madonna was depicted playing at stick and ball. The ball +represented the terrestrial globe and the stick in his other hand a +scepter. + +Though it was not clear what the artist meant to express by +depicting the so-called King of Rome spiking the earth with a stick, +the allegory apparently seemed to Napoleon, as it had done to all +who had seen it in Paris, quite clear and very pleasing. + +"The King of Rome!" he said, pointing to the portrait with a +graceful gesture. "Admirable!" + +With the natural capacity of an Italian for changing the +expression of his face at will, he drew nearer to the portrait and +assumed a look of pensive tenderness. He felt that what he now said +and did would be historical, and it seemed to him that it would now be +best for him--whose grandeur enabled his son to play stick and ball +with the terrestrial globe--to show, in contrast to that grandeur, the +simplest paternal tenderness. His eyes grew dim, he moved forward, +glanced round at a chair (which seemed to place itself under him), and +sat down on it before the portrait. At a single gesture from him +everyone went out on tiptoe, leaving the great man to himself and +his emotion. + +Having sat still for a while he touched--himself not knowing why- +the thick spot of paint representing the highest light in the +portrait, rose, and recalled de Beausset and the officer on duty. He +ordered the portrait to be carried outside his tent, that the Old +Guard, stationed round it, might not be deprived of the pleasure of +seeing the King of Rome, the son and heir of their adored monarch. + +And while he was doing M. de Beausset the honor of breakfasting with +him, they heard, as Napoleon had anticipated, the rapturous cries of +the officers and men of the Old Guard who had run up to see the +portrait. + +"Vive l'Empereur! Vive le roi de Rome! Vive l'Empereur!" came +those ecstatic cries. + +After breakfast Napoleon in de Beausset's presence dictated his +order of the day to the army. + +"Short and energetic!" he remarked when he had read over the +proclamation which he had dictated straight off without corrections. +It ran: + + +Soldiers! This is the battle you have so longed for. Victory depends +on you. It is essential for us; it will give us all we need: +comfortable quarters and a speedy return to our country. Behave as you +did at Austerlitz, Friedland, Vitebsk, and Smolensk. Let our +remotest posterity recall your achievements this day with pride. Let +it be said of each of you: "He was in the great battle before Moscow!" + + +"Before Moscow!" repeated Napoleon, and inviting M. de Beausset, who +was so fond of travel, to accompany him on his ride, he went out of +the tent to where the horses stood saddled. + +"Your Majesty is too kind!" replied de Beausset to the invitation to +accompany the Emperor; he wanted to sleep, did not know how to ride +and was afraid of doing so. + +But Napoleon nodded to the traveler, and de Beausset had to mount. +When Napoleon came out of the tent the shouting of the Guards before +his son's portrait grew still louder. Napoleon frowned. + +"Take him away!" he said, pointing with a gracefully majestic +gesture to the portrait. "It is too soon for him to see a field of +battle." + +De Beausset closed his eyes, bowed his head, and sighed deeply, to +indicate how profoundly he valued and comprehended the Emperor's +words. + + + + + +CHAPTER XXVII + + +On the twenty-fifth of August, so his historians tell us, Napoleon +spent the whole day on horseback inspecting the locality, +considering plans submitted to him by his marshals, and personally +giving commands to his generals. + +The original line of the Russian forces along the river Kolocha +had been dislocated by the capture of the Shevardino Redoubt on the +twenty-fourth, and part of the line--the left flank--had been drawn +back. That part of the line was not entrenched and in front of it +the ground was more open and level than elsewhere. It was evident to +anyone, military or not, that it was here the French should attack. It +would seem that not much consideration was needed to reach this +conclusion, nor any particular care or trouble on the part of the +Emperor and his marshals, nor was there any need of that special and +supreme quality called genius that people are so apt to ascribe to +Napoleon; yet the historians who described the event later and the men +who then surrounded Napoleon, and he himself, thought otherwise. + +Napoleon rode over the plain and surveyed the locality with a +profound air and in silence, nodded with approval or shook his head +dubiously, and without communicating to the generals around him the +profound course of ideas which guided his decisions merely gave them +his final conclusions in the form of commands. Having listened to a +suggestion from Davout, who was now called Prince d'Eckmuhl, to turn +the Russian left wing, Napoleon said it should not be done, without +explaining why not. To a proposal made by General Campan (who was to +attack the fleches) to lead his division through the woods, Napoleon +agreed, though the so-called Duke of Elchingen (Ney) ventured to +remark that a movement through the woods was dangerous and might +disorder the division. + +Having inspected the country opposite the Shevardino Redoubt, +Napoleon pondered a little in silence and then indicated the spots +where two batteries should be set up by the morrow to act against +the Russian entrenchments, and the places where, in line with them, +the field artillery should be placed. + +After giving these and other commands he returned to his tent, and +the dispositions for the battle were written down from his dictation. + +These dispositions, of which the French historians write with +enthusiasm and other historians with profound respect, were as +follows: + + +At dawn the two new batteries established during the night on the +plain occupied by the Prince d'Eckmuhl will open fire on the +opposing batteries of the enemy. + +At the same time the commander of the artillery of the 1st Corps, +General Pernetti, with thirty cannon of Campan's division and all +the howitzers of Dessaix's and Friant's divisions, will move +forward, open fire, and overwhelm with shellfire the enemy's +battery, against which will operate: + + 24 guns of the artillery of the Guards + 30 guns of Campan's division + +and 8 guns of Friant's and Dessaix's divisions + -- + +in all 62 guns. + + +The commander of the artillery of the 3rd Corps, General Fouche, +will place the howitzers of the 3rd and 8th Corps, sixteen in all, +on the flanks of the battery that is to bombard the entrenchment on +the left, which will have forty guns in all directed against it. + +General Sorbier must be ready at the first order to advance with all +the howitzers of the Guard's artillery against either one or other +of the entrenchments. + +During the cannonade Prince Poniatowski is to advance through the +wood on the village and turn the enemy's position. + +General Campan will move through the wood to seize the first +fortification. + +After the advance has begun in this manner, orders will be given +in accordance with the enemy's movements. + +The cannonade on the left flank will begin as soon as the guns of +the right wing are heard. The sharpshooters of Morand's division and +of the vice-King's division will open a heavy fire on seeing the +attack commence on the right wing. + +The vice-King will occupy the village and cross by its three +bridges, advancing to the same heights as Morand's and Gibrard's +divisions, which under his leadership will be directed against the +redoubt and come into line with the rest of the forces. + +All this must be done in good order (le tout se fera avec ordre et +methode) as far as possible retaining troops in reserve. + The Imperial Camp near Mozhaysk, + September, 6, 1812. + + +These dispositions, which are very obscure and confused if one +allows oneself to regard the arrangements without religious awe of his +genius, related to Napoleon's orders to deal with four points--four +different orders. Not one of these was, or could be, carried out. + +In the disposition it is said first that the batteries placed on the +spot chosen by Napoleon, with the guns of Pernetti and Fouche; which +were to come in line with them, 102 guns in all, were to open fire and +shower shells on the Russian fleches and redoubts. This could not be +done, as from the spots selected by Napoleon the projectiles did not +carry to the Russian works, and those 102 guns shot into the air until +the nearest commander, contrary to Napoleon's instructions, moved them +forward. + +The second order was that Poniatowski, moving to the village through +the wood, should turn the Russian left flank. This could not be done +and was not done, because Poniatowski, advancing on the village +through the wood, met Tuchkov there barring his way, and could not and +did not turn the Russian position. + +The third order was: General Campan will move through the wood to +seize the first fortification. General Campan's division did not seize +the first fortification but was driven back, for on emerging from +the wood it had to reform under grapeshot, of which Napoleon was +unaware. + +The fourth order was: The vice-King will occupy the village +(Borodino) and cross by its three bridges, advancing to the same +heights as Morand's and Gdrard's divisions (for whose movements no +directions are given), which under his leadership will be directed +against the redoubt and come into line with the rest of the forces. + +As far as one can make out, not so much from this unintelligible +sentence as from the attempts the vice-King made to execute the orders +given him, he was to advance from the left through Borodino to the +redoubt while the divisions of Morand and Gerard were to advance +simultaneously from the front. + +All this, like the other parts of the disposition, was not and could +not be executed. After passing through Borodino the vice-King was +driven back to the Kolocha and could get no farther; while the +divisions of Morand and Gerard did not take the redoubt but were +driven back, and the redoubt was only taken at the end of the battle +by the cavalry (a thing probably unforeseen and not heard of by +Napoleon). So not one of the orders in the disposition was, or could +be, executed. But in the disposition it is said that, after the +fight has commenced in this manner, orders will be given in accordance +with the enemy's movements, and so it might be supposed that all +necessary arrangements would be made by Napoleon during the battle. +But this was not and could not be done, for during the whole battle +Napoleon was so far away that, as appeared later, he could not know +the course of the battle and not one of his orders during the fight +could be executed. + + + + + +CHAPTER XXVIII + + +Many historians say that the French did not win the battle of +Borodino because Napoleon had a cold, and that if he had not had a +cold the orders he gave before and during the battle would have been +still more full of genius and Russia would have been lost and the face +of the world have been changed. To historians who believe that +Russia was shaped by the will of one man--Peter the Great--and that +France from a republic became an empire and French armies went to +Russia at the will of one man--Napoleon--to say that Russia remained a +power because Napoleon had a bad cold on the twenty-fourth of August +may seem logical and convincing. + +If it had depended on Napoleon's will to fight or not to fight the +battle of Borodino, and if this or that other arrangement depended +on his will, then evidently a cold affecting the manifestation of +his will might have saved Russia, and consequently the valet who +omitted to bring Napoleon his waterproof boots on the twenty-fourth +would have been the savior of Russia. Along that line of thought +such a deduction is indubitable, as indubitable as the deduction +Voltaire made in jest (without knowing what he was jesting at) when he +saw that the Massacre of St. Bartholomew was due to Charles IX's +stomach being deranged. But to men who do not admit that Russia was +formed by the will of one man, Peter I, or that the French Empire +was formed and the war with Russia begun by the will of one man, +Napoleon, that argument seems not merely untrue and irrational, but +contrary to all human reality. To the question of what causes historic +events another answer presents itself, namely, that the course of +human events is predetermined from on high--depends on the coincidence +of the wills of all who take part in the events, and that a Napoleon's +influence on the course of these events is purely external and +fictitious. + +Strange as at first glance it may seem to suppose that the +Massacre of St. Bartholomew was not due to Charles IX's will, though +he gave the order for it and thought it was done as a result of that +order; and strange as it may seem to suppose that the slaughter of +eighty thousand men at Borodino was not due to Napoleon's will, though +he ordered the commencement and conduct of the battle and thought it +was done because he ordered it; strange as these suppositions +appear, yet human dignity--which tells me that each of us is, if not +more at least not less a man than the great Napoleon--demands the +acceptance of that solution of the question, and historic +investigation abundantly confirms it. + +At the battle of Borodino Napoleon shot at no one and killed no one. +That was all done by the soldiers. Therefore it was not he who +killed people. + +The French soldiers went to kill and be killed at the battle of +Borodino not because of Napoleon's orders but by their own volition. +The whole army--French, Italian, German, Polish, and Dutch--hungry, +ragged, and weary of the campaign, felt at the sight of an army +blocking their road to Moscow that the wine was drawn and must be +drunk. Had Napoleon then forbidden them to fight the Russians, they +would have killed him and have proceeded to fight the Russians because +it was inevitable. + +When they heard Napoleon's proclamation offering them, as +compensation for mutilation and death, the words of posterity about +their having been in the battle before Moscow, they cried "Vive +l'Empereur!" just as they had cried "Vive l'Empereur!" at the sight of +the portrait of the boy piercing the terrestrial globe with a toy +stick, and just as they would have cried "Vive l'Empereur!" at any +nonsense that might be told them. There was nothing left for them to +do but cry "Vive l'Empereur!" and go to fight, in order to get food +and rest as conquerors in Moscow. So it was not because of +Napoleon's commands that they killed their fellow men. + +And it was not Napoleon who directed the course of the battle, for +none of his orders were executed and during the battle he did not know +what was going on before him. So the way in which these people +killed one another was not decided by Napoleon's will but occurred +independently of him, in accord with the will of hundreds of thousands +of people who took part in the common action. It only seemed to +Napoleon that it all took place by his will. And so the question +whether he had or had not a cold has no more historic interest than +the cold of the least of the transport soldiers. + +Moreover, the assertion made by various writers that his cold was +the cause of his dispositions not being as well planned as on former +occasions, and of his orders during the battle not being as good as +previously, is quite baseless, which again shows that Napoleon's +cold on the twenty-sixth of August was unimportant. + +The dispositions cited above are not at all worse, but are even +better, than previous dispositions by which he had won victories. +His pseudo-orders during the battle were also no worse than +formerly, but much the same as usual. These dispositions and orders +only seem worse than previous ones because the battle of Borodino +was the first Napoleon did not win. The profoundest and most excellent +dispositions and orders seem very bad, and every learned militarist +criticizes them with looks of importance, when they relate to a +battle that has been lost, and the very worst dispositions and +orders seem very good, and serious people fill whole volumes to +demonstrate their merits, when they relate to a battle that has been +won. + +The dispositions drawn up by Weyrother for the battle of +Austerlitz were a model of perfection for that kind of composition, +but still they were criticized--criticized for their very +perfection, for their excessive minuteness. + +Napoleon at the battle of Borodino fulfilled his office as +representative of authority as well as, and even better than, at other +battles. He did nothing harmful to the progress of the battle; he +inclined to the most reasonable opinions, he made no confusion, did +not contradict himself, did not get frightened or run away from the +field of battle, but with his great tact and military experience +carried out his role of appearing to command, calmly and with dignity. + + + + + +CHAPTER XXIX + + +On returning from a second inspection of the lines, Napoleon +remarked: + +"The chessmen are set up, the game will begin tomorrow!" + +Having ordered punch and summoned de Beausset, he began to talk to +him about Paris and about some changes he meant to make the Empress' +household, surprising the prefect by his memory of minute details +relating to the court. + +He showed an interest in trifles, joked about de Beausset's love +of travel, and chatted carelessly, as a famous, self-confident surgeon +who knows his job does when turning up his sleeves and putting on +his apron while a patient is being strapped to the operating table. +"The matter is in my hands and is clear and definite in my head. +When the times comes to set to work I shall do it as no one else +could, but now I can jest, and the more I jest and the calmer I am the +more tranquil and confident you ought to be, and the more amazed at my +genius." + +Having finished his second glass of punch, Napoleon went to rest +before the serious business which, he considered, awaited him next +day. He was so much interested in that task that he was unable to +sleep, and in spite of his cold which had grown worse from the +dampness of the evening, he went into the large division of the tent +at three o'clock in the morning, loudly blowing his nose. He asked +whether the Russians had not withdrawn, and was told that the +enemy's fires were still in the same places. He nodded approval. + +The adjutant in attendance came into the tent. + +"Well, Rapp, do you think we shall do good business today?" Napoleon +asked him. + +"Without doubt, sire," replied Rapp. + +Napoleon looked at him. + +"Do you remember, sire, what you did me the honor to say at +Smolensk?" continued Rapp. "The wine is drawn and must be drunk." + +Napoleon frowned and sat silent for a long time leaning his head +on his hand. + +"This poor army!" he suddenly remarked. "It has diminished greatly +since Smolensk. Fortune is frankly a courtesan, Rapp. I have always +said so and I am beginning to experience it. But the Guards, Rapp, the +Guards are intact?" he remarked interrogatively. + +"Yes, sire," replied Rapp. + +Napoleon took a lozenge, put it in his mouth, and glanced at his +watch. He was not sleepy and it was still not nearly morning. It was +impossible to give further orders for the sake of killing time, for +the orders had all been given and were now being executed. + +"Have the biscuits and rice been served out to the regiments of +the Guards?" asked Napoleon sternly. + +"Yes, sire." + +"The rice too?" + +Rapp replied that he had given the Emperor's order about the rice, +but Napoleon shook his head in dissatisfaction as if not believing +that his order had been executed. An attendant came in with punch. +Napoleon ordered another glass to be brought for Rapp, and silently +sipped his own. + +"I have neither taste nor smell," he remarked, sniffing at his +glass. "This cold is tiresome. They talk about medicine--what is the +good of medicine when it can't cure a cold! Corvisart gave me these +lozenges but they don't help at all. What can doctors cure? One +can't cure anything. Our body is a machine for living. It is organized +for that, it is its nature. Let life go on in it unhindered and let it +defend itself, it will do more than if you paralyze it by +encumbering it with remedies. Our body is like a perfect watch that +should go for a certain time; watchmaker cannot open it, he can only +adjust it by fumbling, and that blindfold.... Yes, our body is just +a machine for living, that is all." + +And having entered on the path of definition, of which he was +fond, Napoleon suddenly and unexpectedly gave a new one. + +"Do you know, Rapp, what military art is?" asked he. "It is the +art of being stronger than the enemy at a given moment. That's all." + +Rapp made no reply. + +"Tomorrow we shall have to deal with Kutuzov!" said Napoleon. "We +shall see! Do you remember at Braunau he commanded an army for three +weeks and did not once mount a horse to inspect his +entrenchments.... We shall see!" + +He looked at his watch. It was still only four o'clock. He did not +feel sleepy. The punch was finished and there was still nothing to do. +He rose, walked to and fro, put on a warm overcoat and a hat, and went +out of the tent. The night was dark and damp, a scarcely perceptible +moisture was descending from above. Near by, the campfires were +dimly burning among the French Guards, and in the distance those of +the Russian line shone through the smoke. The weather was calm, and +the rustle and tramp of the French troops already beginning to move to +take up their positions were clearly audible. + +Napoleon walked about in front of his tent, looked at the fires +and listened to these sounds, and as he was passing a tall guardsman +in a shaggy cap, who was standing sentinel before his tent and had +drawn himself up like a black pillar at sight of the Emperor, Napoleon +stopped in front of him. + +"What year did you enter the service?" he asked with that +affectation of military bluntness and geniality with which he always +addressed the soldiers. + +The man answered the question. + +"Ah! One of the old ones! Has your regiment had its rice?" + +"It has, Your Majesty." + +Napoleon nodded and walked away. + + +At half-past five Napoleon rode to the village of Shevardino. + +It was growing light, the sky was clearing, only a single cloud +lay in the east. The abandoned campfires were burning themselves out +in the faint morning light. + +On the right a single deep report of a cannon resounded and died +away in the prevailing silence. Some minutes passed. A second and a +third report shook the air, then a fourth and a fifth boomed +solemnly near by on the right. + +The first shots had not yet ceased to reverberate before others rang +out and yet more were heard mingling with and overtaking one another. + +Napoleon with his suite rode up to the Shevardino Redoubt where he +dismounted. The game had begun. + + + + + +CHAPTER XXX + + +On returning to Gorki after having seen Prince Andrew, Pierre +ordered his groom to get the horses ready and to call him early in the +morning, and then immediately fell asleep behind a partition in a +corner Boris had given up to him. + +Before he was thoroughly awake next morning everybody had already +left the hut. The panes were rattling in the little windows and his +groom was shaking him. + +"Your excellency! Your excellency! Your excellency!" he kept +repeating pertinaciously while he shook Pierre by the shoulder without +looking at him, having apparently lost hope of getting him to wake up. + +"What? Has it begun? Is it time?" Pierre asked, waking up. + +"Hear the firing," said the groom, a discharged soldier. "All the +gentlemen have gone out, and his Serene Highness himself rode past +long ago." + +Pierre dressed hastily and ran out to the porch. Outside all was +bright, fresh, dewy, and cheerful. The sun, just bursting forth from +behind a cloud that had concealed it, was shining, with rays still +half broken by the clouds, over the roofs of the street opposite, on +the dew-besprinkled dust of the road, on the walls of the houses, on +the windows, the fence, and on Pierre's horses standing before the +hut. The roar of guns sounded more distinct outside. An adjutant +accompanied by a Cossack passed by at a sharp trot. + +"It's time, Count; it's time!" cried the adjutant. + +Telling the groom to follow him with the horses, Pierre went down +the street to the knoll from which he had looked at the field of +battle the day before. A crowd of military men was assembled there, +members of the staff could be heard conversing in French, and +Kutuzov's gray head in a white cap with a red band was visible, his +gray nape sunk between his shoulders. He was looking through a field +glass down the highroad before him. + +Mounting the steps to the knoll Pierre looked at the scene before +him, spellbound by beauty. It was the same panorama he had admired +from that spot the day before, but now the whole place was full of +troops and covered by smoke clouds from the guns, and the slanting +rays of the bright sun, rising slightly to the left behind Pierre, +cast upon it through the clear morning air penetrating streaks of +rosy, golden tinted light and long dark shadows. The forest at the +farthest extremity of the panorama seemed carved in some precious +stone of a yellowish-green color; its undulating outline was +silhouetted against the horizon and was pierced beyond Valuevo by +the Smolensk highroad crowded with troops. Nearer at hand glittered +golden cornfields interspersed with copses. There were troops to be +seen everywhere, in front and to the right and left. All this was +vivid, majestic, and unexpected; but what impressed Pierre most of all +was the view of the battlefield itself, of Borodino and the hollows on +both sides of the Kolocha. + +Above the Kolocha, in Borodino and on both sides of it, especially +to the left where the Voyna flowing between its marshy banks falls +into the Kolocha, a mist had spread which seemed to melt, to dissolve, +and to become translucent when the brilliant sun appeared and +magically colored and outlined everything. The smoke of the guns +mingled with this mist, and over the whole expanse and through that +mist the rays of the morning sun were reflected, flashing back like +lightning from the water, from the dew, and from the bayonets of the +troops crowded together by the riverbanks and in Borodino. A white +church could be seen through the mist, and here and there the roofs of +huts in Borodino as well as dense masses of soldiers, or green +ammunition chests and ordnance. And all this moved, or seemed to move, +as the smoke and mist spread out over the whole space. Just as in +the mist-enveloped hollow near Borodino, so along the entire line +outside and above it and especially in the woods and fields to the +left, in the valleys and on the summits of the high ground, clouds +of powder smoke seemed continually to spring up out of nothing, now +singly, now several at a time, some translucent, others dense, +which, swelling, growing, rolling, and blending, extended over the +whole expanse. + +These puffs of smoke and (strange to say) the sound of +the firing produced the chief beauty of the spectacle. + +"Puff!"--suddenly a round compact cloud of smoke was seen merging +from violet into gray and milky white, and "boom!" came the report a +second later. + +"Puff! puff!"--and two clouds arose pushing one another and blending +together; and "boom, boom!" came the sounds confirming what the eye +had seen. + +Pierre glanced round at the first cloud, which he had seen as a +round compact ball, and in its place already were balloons of smoke +floating to one side, and--"puff" (with a pause)--"puff, puff!" +three and then four more appeared and then from each, with the same +interval--"boom--boom, boom!" came the fine, firm, precise sounds in +reply. It seemed as if those smoke clouds sometimes ran and +sometimes stood still while woods, fields, and glittering bayonets ran +past them. From the left, over fields and bushes, those large balls of +smoke were continually appearing followed by their solemn reports, +while nearer still, in the hollows and woods, there burst from the +muskets small cloudlets that had no time to become balls, but had +their little echoes in just the same way. "Trakh-ta-ta-takh!" came the +frequent crackle of musketry, but it was irregular and feeble in +comparison with the reports of the cannon. + +Pierre wished to be there with that smoke, those shining bayonets, +that movement, and those sounds. He turned to look at Kutuzov and +his suite, to compare his impressions with those of others. They +were all looking at the field of battle as he was, and, as it seemed +to him, with the same feelings. All their faces were now shining +with that latent warmth of feeling Pierre had noticed the day before +and had fully understood after his talk with Prince Andrew. + +"Go, my dear fellow, go... and Christ be with you!" Kutuzov was +saying to a general who stood beside him, not taking his eye from +the battlefield. + +Having received this order the general passed by Pierre on his way +down the knoll. + +"To the crossing!" said the general coldly and sternly in reply to +one of the staff who asked where he was going. + +"I'll go there too, I too!" thought Pierre, and followed the +general. + +The general mounted a horse a Cossack had brought him. Pierre went +to his groom who was holding his horses and, asking which was the +quietest, clambered onto it, seized it by the mane, and turning out +his toes pressed his heels against its sides and, feeling that his +spectacles were slipping off but unable to let go of the mane and +reins, he galloped after the general, causing the staff officers to +smile as they watched him from the knoll. + + + + + +CHAPTER XXXI + + +Having descended the hill the general after whom Pierre was +galloping turned sharply to the left, and Pierre, losing sight of him, +galloped in among some ranks of infantry marching ahead of him. He +tried to pass either in front of them or to the right or left, but +there were soldiers everywhere, all with expression and busy with some +unseen but evidently important task. They all gazed with the same +dissatisfied and inquiring expression at this stout man in a white +hat, who for some unknown reason threatened to trample them under +his horse's hoofs. + +"Why ride into the middle of the battalion?" one of them shouted +at him. + +Another prodded his horse with the butt end of a musket, and Pierre, +bending over his saddlebow and hardly able to control his shying +horse, galloped ahead of the soldiers where there was a free space. + +There was a bridge ahead of him, where other soldiers stood +firing. Pierre rode up to them. Without being aware of it he had +come to the bridge across the Kolocha between Gorki and Borodino, +which the French (having occupied Borodino) were attacking in the +first phase of the battle. Pierre saw that there was a bridge in front +of him and that soldiers were doing something on both sides of it +and in the meadow, among the rows of new-mown hay which he had taken +no notice of amid the smoke of the campfires the day before; but +despite the incessant firing going on there he had no idea that this +was the field of battle. He did not notice the sound of the bullets +whistling from every side, or the projectiles that flew over him, +did not see the enemy on the other side of the river, and for a long +time did not notice the killed and wounded, though many fell near him. +He looked about him with a smile which did not leave his face. + +"Why's that fellow in front of the line?" shouted somebody at him +again. + +"To the left!... Keep to the right!" the men shouted to him. + +Pierre went to the right, and unexpectedly encountered one of +Raevski's adjutants whom he knew. The adjutant looked angrily at +him, evidently also intending to shout at him, but on recognizing +him he nodded. + +"How have you got here?" he said, and galloped on. + +Pierre, feeling out of place there, having nothing to do, and afraid +of getting in someone's way again, galloped after the adjutant. + +"What's happening here? May I come with you?" he asked. + +"One moment, one moment!" replied the adjutant, and riding up to a +stout colonel who was standing in the meadow, he gave him some message +and then addressed Pierre. + +"Why have you come here, Count?" he asked with a smile. "Still +inquisitive?" + +"Yes, yes," assented Pierre. + +But the adjutant turned his horse about and rode on. + +"Here it's tolerable," said he, "but with Bagration on the left +flank they're getting it frightfully hot." + +"Really?" said Pierre. "Where is that?" + +"Come along with me to our knoll. We can get a view from there and +in our battery it is still bearable," said the adjutant. "Will you +come?" + +"Yes, I'll come with you," replied Pierre, looking round for his +groom. + +It was only now that he noticed wounded men staggering along or +being carried on stretchers. On that very meadow he had ridden over +the day before, a soldier was lying athwart the rows of scented hay, +with his head thrown awkwardly back and his shako off. + +"Why haven't they carried him away?" Pierre was about to ask, but +seeing the stern expression of the adjutant who was also looking +that way, he checked himself. + +Pierre did not find his groom and rode along the hollow with the +adjutant to Raevski's Redoubt. His horse lagged behind the +adjutant's and jolted him at every step. + +"You don't seem to be used to riding, Count?" remarked the adjutant. + +"No it's not that, but her action seems so jerky," said Pierre in +a puzzled tone. + +"Why... she's wounded!" said the adjutant. "In the off foreleg above +the knee. A bullet, no doubt. I congratulate you, Count, on your +baptism of fire!" + +Having ridden in the smoke past the Sixth Corps, behind the +artillery which had been moved forward and was in action, deafening +them with the noise of firing, they came to a small wood. There it was +cool and quiet, with a scent of autumn. Pierre and the adjutant +dismounted and walked up the hill on foot. + +"Is the general here?" asked the adjutant on reaching the knoll. + +"He was here a minute ago but has just gone that way," someone +told him, pointing to the right. + +The adjutant looked at Pierre as if puzzled what to do with him now. + +"Don't trouble about me," said Pierre. "I'll go up onto the knoll if +I may?" + +"Yes, do. You'll see everything from there and it's less +dangerous, and I'll come for you." + +Pierre went to the battery and the adjutant rode on. They did not +meet again, and only much later did Pierre learn that he lost an arm +that day. + +The knoll to which Pierre ascended was that famous one afterwards +known to the Russians as the Knoll Battery or Raevski's Redoubt, and +to the French as la grande redoute, la fatale redoute, la redoute du +centre, around which tens of thousands fell, and which the French +regarded as the key to the whole position. + +This redoubt consisted of a knoll, on three sides of which +trenches had been dug. Within the entrenchment stood ten guns that +were being fired through openings in the earthwork. + +In line with the knoll on both sides stood other guns which also +fired incessantly. A little behind the guns stood infantry. When +ascending that knoll Pierre had no notion that this spot, on which +small trenches had been dug and from which a few guns were firing, was +the most important point of the battle. + +On the contrary, just because he happened to be there he thought +it one of the least significant parts of the field. + +Having reached the knoll, Pierre sat down at one end of a trench +surrounding the battery and gazed at what was going on around him with +an unconsciously happy smile. Occasionally he rose and walked about +the battery still with that same smile, trying not to obstruct the +soldiers who were loading, hauling the guns, and continually running +past him with bags and charges. The guns of that battery were being +fired continually one after another with a deafening roar, +enveloping the whole neighborhood in powder smoke. + +In contrast with the dread felt by the infantrymen placed in +support, here in the battery where a small number of men busy at their +work were separated from the rest by a trench, everyone experienced +a common and as it were family feeling of animation. + +The intrusion of Pierre's nonmilitary figure in a white hat made +an unpleasant impression at first. The soldiers looked askance at +him with surprise and even alarm as they went past him. The senior +artillery officer, a tall, long-legged, pockmarked man, moved over +to Pierre as if to see the action of the farthest gun and looked at +him with curiosity. + +A young round-faced officer, quite a boy still and evidently only +just out of the Cadet College, who was zealously commanding the two +guns entrusted to him, addressed Pierre sternly. + +"Sir," he said, "permit me to ask you to stand aside. You must not +be here." + +The soldiers shook their heads disapprovingly as they looked at +Pierre. But when they had convinced themselves that this man in the +white hat was doing no harm, but either sat quietly on the slope of +the trench with a shy smile or, politely making way for the +soldiers, paced up and down the battery under fire as calmly as if +he were on a boulevard, their feeling of hostile distrust gradually +began to change into a kindly and bantering sympathy, such as soldiers +feel for their dogs, cocks, goats, and in general for the animals that +live with the regiment. The men soon accepted Pierre into their +family, adopted him, gave him a nickname ("our gentleman"), and made +kindly fun of him among themselves. + +A shell tore up the earth two paces from Pierre and he looked around +with a smile as he brushed from his clothes some earth it had thrown +up. + +"And how's it you're not afraid, sir, really now?" a red-faced, +broad-shouldered soldier asked Pierre, with a grin that disclosed a +set of sound, white teeth. + +"Are you afraid, then?" said Pierre. + +"What else do you expect?" answered the soldier. "She has no +mercy, you know! When she comes spluttering down, out go your innards. +One can't help being afraid," he said laughing. + +Several of the men, with bright kindly faces, stopped beside Pierre. +They seemed not to have expected him to talk like anybody else, and +the discovery that he did so delighted them. + +"It's the business of us soldiers. But in a gentleman it's +wonderful! There's a gentleman for you!" + +"To your places!" cried the young officer to the men gathered +round Pierre. + +The young officer was evidently exercising his duties for the +first or second time and therefore treated both his superiors and +the men with great precision and formality. + +The booming cannonade and the fusillade of musketry were growing +more intense over the whole field, especially to the left where +Bagration's fleches were, but where Pierre was the smoke of the firing +made it almost impossible to distinguish anything. Moreover, his whole +attention was engrossed by watching the family circle--separated +from all else--formed by the men in the battery. His first unconscious +feeling of joyful animation produced by the sights and sounds of the +battlefield was now replaced by another, especially since he had +seen that soldier lying alone in the hayfield. Now, seated on the +slope of the trench, he observed the faces of those around him. + +By ten o'clock some twenty men had already been carried away from +the battery; two guns were smashed and cannon balls fell more and more +frequently on the battery and spent bullets buzzed and whistled +around. But the men in the battery seemed not to notice this, and +merry voices and jokes were heard on all sides. + +"A live one!" shouted a man as a whistling shell approached. + +"Not this way! To the infantry!" added another with loud laughter, +seeing the shell fly past and fall into the ranks of the supports. + +"Are you bowing to a friend, eh?" remarked another, chaffing a +peasant who ducked low as a cannon ball flew over. + +Several soldiers gathered by the wall of the trench, looking out +to see what was happening in front. + +"They've withdrawn the front line, it has retired," said they, +pointing over the earthwork. + +"Mind your own business," an old sergeant shouted at them. "If +they've retired it's because there's work for them to do farther +back." + +And the sergeant, taking one of the men by the shoulders, gave him a +shove with his knee. This was followed by a burst of laughter. + +"To the fifth gun, wheel it up!" came shouts from one side. + +"Now then, all together, like bargees!" rose the merry voices of +those who were moving the gun. + +"Oh, she nearly knocked our gentleman's hat off!" cried the +red-faced humorist, showing his teeth chaffing Pierre. "Awkward +baggage!" he added reproachfully to a cannon ball that struck a cannon +wheel and a man's leg. + +"Now then, you foxes!" said another, laughing at some militiamen +who, stooping low, entered the battery to carry away the wounded man. + +"So this gruel isn't to your taste? Oh, you crows! You're scared!" +they shouted at the militiamen who stood hesitating before the man +whose leg had been torn off. + +"There, lads... oh, oh!" they mimicked the peasants, "they don't +like it at all!" + +Pierre noticed that after every ball that hit the redoubt, and after +every loss, the liveliness increased more and more. + +As the flames of the fire hidden within come more and more vividly +and rapidly from an approaching thundercloud, so, as if in +opposition to what was taking place, the lightning of hidden fire +growing more and more intense glowed in the faces of these men. + +Pierre did not look out at the battlefield and was not concerned +to know what was happening there; he was entirely absorbed in watching +this fire which burned ever more brightly and which he felt was +flaming up in the same way in his own soul. + +At ten o'clock the infantry that had been among the bushes in +front of the battery and along the Kamenka streamlet retreated. From +the battery they could be seen running back past it carrying their +wounded on their muskets. A general with his suite came to the +battery, and after speaking to the colonel gave Pierre an angry look +and went away again having ordered the infantry supports behind the +battery to lie down, so as to be less exposed to fire. After this from +amid the ranks of infantry to the right of the battery came the +sound of a drum and shouts of command, and from the battery one saw +how those ranks of infantry moved forward. + +Pierre looked over the wall of the trench and was particularly +struck by a pale young officer who, letting his sword hang down, was +walking backwards and kept glancing uneasily around. + +The ranks of the infantry disappeared amid the smoke but their +long-drawn shout and rapid musketry firing could still be heard. A few +minutes later crowds of wounded men and stretcher-bearers came back +from that direction. Projectiles began to fall still more frequently +in the battery. Several men were lying about who had not been removed. +Around the cannon the men moved still more briskly and busily. No +one any longer took notice of Pierre. Once or twice he was shouted +at for being in the way. The senior officer moved with big, rapid +strides from one gun to another with a frowning face. The young +officer, with his face still more flushed, commanded the men more +scrupulously than ever. The soldiers handed up the charges, turned, +loaded, and did their business with strained smartness. They gave +little jumps as they walked, as though they were on springs. + +The stormcloud had come upon them, and in every face the fire +which Pierre had watched kindle burned up brightly. Pierre standing +beside the commanding officer. The young officer, his hand to his +shako, ran up to his superior. + +"I have the honor to report, sir, that only eight rounds are left. +Are we to continue firing?" he asked. + +"Grapeshot!" the senior shouted, without answering the question, +looking over the wall of the trench. + +Suddenly something happened: the young officer gave a gasp and +bending double sat down on the ground like a bird shot on the wing. +Everything became strange, confused, and misty in Pierre's eyes. + +One cannon ball after another whistled by and struck the +earthwork, a soldier, or a gun. Pierre, who had not noticed these +sounds before, now heard nothing else. On the right of the battery +soldiers shouting "Hurrah!" were running not forwards but backwards, +it seemed to Pierre. + +A cannon ball struck the very end of the earth work by which he +was standing, crumbling down the earth; a black ball flashed before +his eyes and at the same instant plumped into something. Some +militiamen who were entering the battery ran back. + +"All with grapeshot!" shouted the officer. + +The sergeant ran up to the officer and in a frightened whisper +informed him (as a butler at dinner informs his master that there is +no more of some wine asked for) that there were no more charges. + +"The scoundrels! What are they doing?" shouted the officer, +turning to Pierre. + +The officer's face was red and perspiring and his eyes glittered +under his frowning brow. + +"Run to the reserves and bring up the ammunition boxes!" he +yelled, angrily avoiding Pierre with his eyes and speaking to his men. + +"I'll go," said Pierre. + +The officer, without answering him, strode across to the opposite +side. + +"Don't fire.... Wait!" he shouted. + +The man who had been ordered to go for ammunition stumbled against +Pierre. + +"Eh, sir, this is no place for you," said he, and ran down the +slope. + +Pierre ran after him, avoiding the spot where the young officer +was sitting. + +One cannon ball, another, and a third flew over him, falling in +front, beside, and behind him. Pierre ran down the slope. "Where am +I going?" he suddenly asked himself when he was already near the green +ammunition wagons. He halted irresolutely, not knowing whether to +return or go on. Suddenly a terrible concussion threw him backwards to +the ground. At the same instant he was dazzled by a great flash of +flame, and immediately a deafening roar, crackling, and whistling made +his ears tingle. + +When he came to himself he was sitting on the ground leaning on +his hands; the ammunition wagons he had been approaching no longer +existed, only charred green boards and rags littered the scorched +grass, and a horse, dangling fragments of its shaft behind it, +galloped past, while another horse lay, like Pierre, on the ground, +uttering prolonged and piercing cries. + + + + + +CHAPTER XXXII + + +Beside himself with terror Pierre jumped up and ran back to the +battery, as to the only refuge from the horrors that surrounded him. + +On entering the earthwork he noticed that there were men doing +something there but that no shots were being fired from the battery. +He had no time to realize who these men were. He saw the senior +officer lying on the earth wall with his back turned as if he were +examining something down below and that one of the soldiers he had +noticed before was struggling forward shouting "Brothers!" and +trying to free himself from some men who were holding him by the +arm. He also saw something else that was strange. + +But he had not time to realize that the colonel had been killed, +that the soldier shouting "Brothers!" was a prisoner, and that another +man had been bayoneted in the back before his eyes, for hardly had +he run into the redoubt before a thin, sallow-faced, perspiring man in +a blue uniform rushed on him sword in hand, shouting something. +Instinctively guarding against the shock--for they had been running +together at full speed before they saw one another--Pierre put out his +hands and seized the man (a French officer) by the shoulder with one +hand and by the throat with the other. The officer, dropping his +sword, seized Pierre by his collar. + +For some seconds they gazed with frightened eyes at one another's +unfamiliar faces and both were perplexed at what they had done and +what they were to do next. "Am I taken prisoner or have I taken him +prisoner?" each was thinking. But the French officer was evidently +more inclined to think he had been taken prisoner because Pierre's +strong hand, impelled by instinctive fear, squeezed his throat ever +tighter and tighter. The Frenchman was about to say something, when +just above their heads, terrible and low, a cannon ball whistled, +and it seemed to Pierre that the French officer's head had been torn +off, so swiftly had he ducked it. + +Pierre too bent his head and let his hands fall. Without further +thought as to who had taken whom prisoner, the Frenchman ran back to +the battery and Pierre ran down the slope stumbling over the dead +and wounded who, it seemed to him, caught at his feet. But before he +reached the foot of the knoll he was met by a dense crowd of Russian +soldiers who, stumbling, tripping up, and shouting, ran merrily and +wildly toward the battery. (This was the attack for which Ermolov +claimed the credit, declaring that only his courage and good luck made +such a feat possible: it was the attack in which he was said to have +thrown some St. George's Crosses he had in his pocket into the battery +for the first soldiers to take who got there.) + +The French who had occupied the battery fled, and our troops +shouting "Hurrah!" pursued them so far beyond the battery that it +was difficult to call them back. + +The prisoners were brought down from the battery and among them +was a wounded French general, whom the officers surrounded. Crowds +of wounded--some known to Pierre and some unknown--Russians and +French, with faces distorted by suffering, walked, crawled, and were +carried on stretchers from the battery. Pierre again went up onto +the knoll where he had spent over an hour, and of that family circle +which had received him as a member he did not find a single one. There +were many dead whom he did not know, but some he recognized. The young +officer still sat in the same way, bent double, in a pool of blood +at the edge of the earth wall. The red-faced man was still +twitching, but they did not carry him away. + +Pierre ran down the slope once more. + +"Now they will stop it, now they will be horrified at what they have +done!" he thought, aimlessly going toward a crowd of stretcher bearers +moving from the battlefield. + +But behind the veil of smoke the sun was still high, and in front +and especially to the left, near Semenovsk, something seemed to be +seething in the smoke, and the roar of cannon and musketry did not +diminish, but even increased to desperation like a man who, +straining himself, shrieks with all his remaining strength. + + + + + +CHAPTER XXXIII + + +The chief action of the battle of Borodino was fought within the +seven thousand feet between Borodino and Bagration's fleches. Beyond +that space there was, on the one side, a demonstration made by the +Russians with Uvarov's cavalry at midday, and on the other side, +beyond Utitsa, Poniatowski's collision with Tuchkov; but these two +were detached and feeble actions in comparison with what took place in +the center of the battlefield. On the field between Borodino and the +fleches, beside the wood, the chief action of the day took place on an +open space visible from both sides and was fought in the simplest +and most artless way. + +The battle began on both sides with a cannonade from several hundred +guns. + +Then when the whole field was covered with smoke, two divisions, +Campan's and Dessaix's, advanced from the French right, while +Murat's troops advanced on Borodino from their left. + +From the Shevardino Redoubt where Napoleon was standing the +fleches were two thirds of a mile away, and it was more than a mile as +the crow flies to Borodino, so that Napoleon could not see what was +happening there, especially as the smoke mingling with the mist hid +the whole locality. The soldiers of Dessaix's division advancing +against the fleches could only be seen till they had entered the +hollow that lay between them and the fleches. As soon as they had +descended into that hollow, the smoke of the guns and musketry on +the fleches grew so dense that it covered the whole approach on that +side of it. Through the smoke glimpses could be caught of something +black--probably men--and at times the glint of bayonets. But whether +they were moving or stationary, whether they were French or Russian, +could not be discovered from the Shevardino Redoubt. + +The sun had risen brightly and its slanting rays struck straight +into Napoleon's face as, shading his eyes with his hand, he looked +at the fleches. The smoke spread out before them, and at times it +looked as if the smoke were moving, at times as if the troops moved. +Sometimes shouts were heard through the firing, but it was +impossible to tell what was being done there. + +Napoleon, standing on the knoll, looked through a field glass, and +in its small circlet saw smoke and men, sometimes his own and +sometimes Russians, but when he looked again with the naked eye, he +could not tell where what he had seen was. + +He descended the knoll and began walking up and down before it. + +Occasionally he stopped, listened to the firing, and gazed +intently at the battlefield. + +But not only was it impossible to make out what was happening from +where he was standing down below, or from the knoll above on which +some of his generals had taken their stand, but even from the +fleches themselves--in which by this time there were now Russian and +now French soldiers, alternately or together, dead, wounded, alive, +frightened, or maddened--even at those fleches themselves it was +impossible to make out what was taking place. There for several +hours amid incessant cannon and musketry fire, now Russians were +seen alone, now Frenchmen alone, now infantry, and now cavalry: they +appeared, fired, fell, collided, not knowing what to do with one +another, screamed, and ran back again. + +From the battlefield adjutants he had sent out, and orderlies from +his marshals, kept galloping up to Napoleon with reports of the +progress of the action, but all these reports were false, both because +it was impossible in the heat of battle to say what was happening at +any given moment and because many of the adjutants did not go to the +actual place of conflict but reported what they had heard from others; +and also because while an adjutant was riding more than a mile to +Napoleon circumstances changed and the news he brought was already +becoming false. Thus an adjutant galloped up from Murat with tidings +that Borodino had been occupied and the bridge over the Kolocha was in +the hands of the French. The adjutant asked whether Napoleon wished +the troops to cross it? Napoleon gave orders that the troops should +form up on the farther side and wait. But before that order was given- +almost as soon in fact as the adjutant had left Borodino--the bridge +had been retaken by the Russians and burned, in the very skirmish at +which Pierre had been present at the beginning of the battle. + +An adjutant galloped up from the fleches with a pale and +frightened face and reported to Napoleon that their attack had been +repulsed, Campan wounded, and Davout killed; yet at the very time +the adjutant had been told that the French had been repulsed, the +fleches had in fact been recaptured by other French troops, and Davout +was alive and only slightly bruised. On the basis of these necessarily +untrustworthy reports Napoleon gave his orders, which had either +been executed before he gave them or could not be and were not +executed. + +The marshals and generals, who were nearer to the field of battle +but, like Napoleon, did not take part in the actual fighting and +only occasionally went within musket range, made their own +arrangements without asking Napoleon and issued orders where and in +what direction to fire and where cavalry should gallop and infantry +should run. But even their orders, like Napoleon's, were seldom +carried out, and then but partially. For the most part things happened +contrary to their orders. Soldiers ordered to advance ran back on +meeting grapeshot; soldiers ordered to remain where they were, +suddenly, seeing Russians unexpectedly before them, sometimes rushed +back and sometimes forward, and the cavalry dashed without orders in +pursuit of the flying Russians. In this way two cavalry regiments +galloped through the Semenovsk hollow and as soon as they reached +the top of the incline turned round and galloped full speed back +again. The infantry moved in the same way, sometimes running to +quite other places than those they were ordered to go to. All orders +as to where and when to move the guns, when to send infantry to +shoot or horsemen to ride down the Russian infantry--all such orders +were given by the officers on the spot nearest to the units concerned, +without asking either Ney, Davout, or Murat, much less Napoleon. +They did not fear getting into trouble for not fulfilling orders or +for acting on their own initiative, for in battle what is at stake +is what is dearest to man--his own life--and it sometimes seems that +safety lies in running back, sometimes in running forward; and these +men who were right in the heat of the battle acted according to the +mood of the moment. In reality, however, all these movements forward +and backward did not improve or alter the position of the troops. +All their rushing and galloping at one another did little harm, the +harm of disablement and death was caused by the balls and bullets that +flew over the fields on which these men were floundering about. As +soon as they left the place where the balls and bullets were flying +about, their superiors, located in the background, re-formed them +and brought them under discipline and under the influence of that +discipline led them back to the zone of fire, where under the +influence of fear of death they lost their discipline and rushed about +according to the chance promptings of the throng. + + + + + +CHAPTER XXXIV + + +Napoleon's generals--Davout, Ney, and Murat, who were near that +region of fire and sometimes even entered it--repeatedly led into it +huge masses of well-ordered troops. But contrary to what had always +happened in their former battles, instead of the news they expected of +the enemy's flight, these orderly masses returned thence as +disorganized and terrified mobs. The generals re-formed them, but +their numbers constantly decreased. In the middle of the day Murat +sent his adjutant to Napoleon to demand reinforcements. + +Napoleon sat at the foot of the knoll, drinking punch, when +Murat's adjutant galloped up with an assurance that the Russians would +be routed if His Majesty would let him have another division. + +"Reinforcements?" said Napoleon in a tone of stern surprise, looking +at the adjutant--a handsome lad with long black curls arranged like +Murat's own--as though he did not understand his words. + +"Reinforcements!" thought Napoleon to himself. "How can they need +reinforcements when they already have half the army directed against a +weak, unentrenched Russian wing?" + +"Tell the King of Naples," said he sternly, "that it is not noon +yet, and I don't yet see my chessboard clearly. Go!..." + +The handsome boy adjutant with the long hair sighed deeply without +removing his hand from his hat and galloped back to where men were +being slaughtered. + +Napoleon rose and having summoned Caulaincourt and Berthier began +talking to them about matters unconnected with the battle. + +In the midst of this conversation, which was beginning to interest +Napoleon, Berthier's eyes turned to look at a general with a suite, +who was galloping toward the knoll on a lathering horse. It was +Belliard. Having dismounted he went up to the Emperor with rapid +strides and in a loud voice began boldly demonstrating the necessity +of sending reinforcements. He swore on his honor that the Russians +were lost if the Emperor would give another division. + +Napoleon shrugged his shoulders and continued to pace up and down +without replying. Belliard began talking loudly and eagerly to the +generals of the suite around him. + +"You are very fiery, Belliard," said Napoleon, when he again came up +to the general. "In the heat of a battle it is easy to make a mistake. +Go and have another look and then come back to me." + +Before Belliard was out of sight, a messenger from another part of +the battlefield galloped up. + +"Now then, what do you want?" asked Napoleon in the tone of a man +irritated at being continually disturbed. + +"Sire, the prince..." began the adjutant. + +"Asks for reinforcements?" said Napoleon with an angry gesture. + +The adjutant bent his head affirmatively and began to report, but +the Emperor turned from him, took a couple of steps, stopped, came +back, and called Berthier. + +"We must give reserves," he said, moving his arms slightly apart. +"Who do you think should be sent there?" he asked of Berthier (whom he +subsequently termed "that gosling I have made an eagle"). + +"Send Claparede's division, sire," replied Berthier, who knew all +the divisions regiments, and battalions by heart. + +Napoleon nodded assent. + +The adjutant galloped to Claparede's division and a few minutes +later the Young Guards stationed behind the knoll moved forward. +Napoleon gazed silently in that direction. + +"No!" he suddenly said to Berthier. "I can't send Claparede. Send +Friant's division." + +Though there was no advantage in sending Friant's division instead +of Claparede's, and even in obvious inconvenience and delay in +stopping Claparede and sending Friant now, the order was carried out +exactly. Napoleon did not notice that in regard to his army he was +playing the part of a doctor who hinders by his medicines--a role he +so justly understood and condemned. + +Friant's division disappeared as the others had done into the +smoke of the battlefield. From all sides adjutants continued to arrive +at a gallop and as if by agreement all said the same thing. They all +asked for reinforcements and all said that the Russians were holding +their positions and maintaining a hellish fire under which the +French army was melting away. + +Napoleon sat on a campstool, wrapped in thought. + +M. de Beausset, the man so fond of travel, having fasted since +morning, came up to the Emperor and ventured respectfully to suggest +lunch to His Majesty. + +"I hope I may now congratulate Your Majesty on a victory?" said he. + +Napoleon silently shook his head in negation. Assuming the +negation to refer only to the victory and not to the lunch, M. de +Beausset ventured with respectful jocularity to remark that there is +no reason for not having lunch when one can get it. + +"Go away..." exclaimed Napoleon suddenly and morosely, and turned +aside. + +A beatific smile of regret, repentance, and ecstasy beamed on M. +de Beausset's face and he glided away to the other generals. + +Napoleon was experiencing a feeling of depression like that of an +ever-lucky gambler who, after recklessly flinging money about and +always winning, suddenly just when he has calculated all the chances +of the game, finds that the more he considers his play the more surely +he loses. + +His troops were the same, his generals the same, the same +preparations had been made, the same dispositions, and the same +proclamation courte et energique, he himself was still the same: he +knew that and knew that he was now even more experienced and +skillful than before. Even the enemy was the same as at Austerlitz and +Friedland--yet the terrible stroke of his arm had supernaturally +become impotent. + +All the old methods that had been unfailingly crowned with +success: the concentration of batteries on one point, an attack by +reserves to break the enemy's line, and a cavalry attack by "the men +of iron," all these methods had already been employed, yet not only +was there no victory, but from all sides came the same news of +generals killed and wounded, of reinforcements needed, of the +impossibility of driving back the Russians, and of disorganization +among his own troops. + +Formerly, after he had given two or three orders and uttered a few +phrases, marshals and adjutants had come galloping up with +congratulations and happy faces, announcing the trophies taken, the +corps of prisoners, bundles of enemy eagles and standards, cannon +and stores, and Murat had only begged leave to loose the cavalry to +gather in the baggage wagons. So it had been at Lodi, Marengo, Arcola, +Jena, Austerlitz, Wagram, and so on. But now something strange was +happening to his troops. + +Despite news of the capture of the fleches, Napoleon saw that this +was not the same, not at all the same, as what had happened in his +former battles. He saw that what he was feeling was felt by all the +men about him experienced in the art of war. All their faces looked +dejected, and they all shunned one another's eyes--only a de +Beausset could fail to grasp the meaning of what was happening. + +But Napoleon with his long experience of war well knew the meaning +of a battle not gained by the attacking side in eight hours, after all +efforts had been expended. He knew that it was a lost battle and +that the least accident might now--with the fight balanced on such a +strained center--destroy him and his army. + +When he ran his mind over the whole of this strange Russian campaign +in which not one battle had been won, and in which not a flag, or +cannon, or army corps had been captured in two months, when he +looked at the concealed depression on the faces around him and heard +reports of the Russians still holding their ground--a terrible feeling +like a nightmare took possession of him, and all the unlucky accidents +that might destroy him occurred to his mind. The Russians might fall +on his left wing, might break through his center, he himself might +be killed by a stray cannon ball. All this was possible. In former +battles he had only considered the possibilities of success, but now +innumerable unlucky chances presented themselves, and he expected them +all. Yes, it was like a dream in which a man fancies that a ruffian is +coming to attack him, and raises his arm to strike that ruffian a +terrible blow which he knows should annihilate him, but then feels +that his arm drops powerless and limp like a rag, and the horror of +unavoidable destruction seizes him in his helplessness. + +The news that the Russians were attacking the left flank of the +French army aroused that horror in Napoleon. He sat silently on a +campstool below the knoll, with head bowed and elbows on his knees. +Berthier approached and suggested that they should ride along the line +to ascertain the position of affairs. + +"What? What do you say?" asked Napoleon. "Yes, tell them to bring me +my horse." + +He mounted and rode toward Semenovsk. + +Amid the powder smoke, slowly dispersing over the whole space +through which Napoleon rode, horses and men were lying in pools of +blood, singly or in heaps. Neither Napoleon nor any of his generals +had ever before seen such horrors or so many slain in such a small +area. The roar of guns, that had not ceased for ten hours, wearied the +ear and gave a peculiar significance to the spectacle, as music does +to tableaux vivants. Napoleon rode up the high ground at Semenovsk, +and through the smoke saw ranks of men in uniforms of a color +unfamiliar to him. They were Russians. + +The Russians stood in serried ranks behind Semenovsk village and its +knoll, and their guns boomed incessantly along their line and sent +forth clouds of smoke. It was no longer a battle: it was a +continuous slaughter which could be of no avail either to the French +or the Russians. Napoleon stopped his horse and again fell into the +reverie from which Berthier had aroused him. He could not stop what +was going on before him and around him and was supposed to be directed +by him and to depend on him, and from its lack of success this affair, +for the first time, seemed to him unnecessary and horrible. + +One of the generals rode up to Napoleon and ventured to offer to +lead the Old Guard into action. Ney and Berthier, standing near +Napoleon, exchanged looks and smiled contemptuously at this +general's senseless offer. + +Napoleon bowed his head and remained silent a long time. + +"At eight hundred leagues from France, I will not have my Guard +destroyed!" he said, and turning his horse rode back to Shevardino. + + + + + +CHAPTER XXXV + + +On the rug-covered bench where Pierre had seen him in the morning +sat Kutuzov, his gray head hanging, his heavy body relaxed. He gave no +orders, but only assented to or dissented from what others suggested. + +"Yes, yes, do that," he replied to various proposals. "Yes, yes: go, +dear boy, and have a look," he would say to one or another of those +about him; or, "No, don't, we'd better wait!" He listened to the +reports that were brought him and gave directions when his +subordinates demanded that of him; but when listening to the reports +it seemed as if he were not interested in the import of the words +spoken, but rather in something else--in the expression of face and +tone of voice of those who were reporting. By long years of military +experience he knew, and with the wisdom of age understood, that it +is impossible for one man to direct hundreds of thousands of others +struggling with death, and he knew that the result of a battle is +decided not by the orders of a commander in chief, nor the place where +the troops are stationed, nor by the number of cannon or of +slaughtered men, but by that intangible force called the spirit of the +army, and he watched this force and guided it in as far as that was in +his power. + +Kutuzov's general expression was one of concentrated quiet +attention, and his face wore a strained look as if he found it +difficult to master the fatigue of his old and feeble body. + +At eleven o'clock they brought him news that the fleches captured by +the French had been retaken, but that Prince Bagration was wounded. +Kutuzov groaned and swayed his head. + +"Ride over to Prince Peter Ivanovich and find out about it exactly," +he said to one of his adjutants, and then turned to the Duke of +Wurttemberg who was standing behind him. + +"Will Your Highness please take command of the first army?" + +Soon after the duke's departure--before he could possibly have +reached Semenovsk--his adjutant came back from him and told Kutuzov +that the duke asked for more troops. + +Kutuzov made a grimace and sent an order to Dokhturov to take over +the command of the first army, and a request to the duke--whom he said +he could not spare at such an important moment--to return to him. When +they brought him news that Murat had been taken prisoner, and the +staff officers congratulated him, Kutuzov smiled. + +"Wait a little, gentlemen," said he. "The battle is won, and there +is nothing extraordinary in the capture of Murat. Still, it is +better to wait before we rejoice." + +But he sent an adjutant to take the news round the army. + +When Scherbinin came galloping from the left flank with news that +the French had captured the fleches and the village of Semenovsk, +Kutuzov, guessing by the sounds of the battle and by Scherbinin's +looks that the news was bad, rose as if to stretch his legs and, +taking Scherbinin's arm, led him aside. + +"Go, my dear fellow," he said to Ermolov, "and see whether something +can't be done." + +Kutuzov was in Gorki, near the center of the Russian position. The +attack directed by Napoleon against our left flank had been several +times repulsed. In the center the French had not got beyond +Borodino, and on their left flank Uvarov's cavalry had put the +French to flight. + +Toward three o'clock the French attacks ceased. On the faces of +all who came from the field of battle, and of those who stood around +him, Kutuzov noticed an expression of extreme tension. He was +satisfied with the day's success--a success exceeding his +expectations, but the old man's strength was failing him. Several +times his head dropped low as if it were falling and he dozed off. +Dinner was brought him. + +Adjutant General Wolzogen, the man who when riding past Prince +Andrew had said, "the war should be extended widely," and whom +Bagration so detested, rode up while Kutuzov was at dinner. Wolzogen +had come from Barclay de Tolly to report on the progress of affairs on +the left flank. The sagacious Barclay de Tolly, seeing crowds of +wounded men running back and the disordered rear of the army, +weighed all the circumstances, concluded that the battle was lost, and +sent his favorite officer to the commander in chief with that news. + +Kutuzov was chewing a piece of roast chicken with difficulty and +glanced at Wolzogen with eyes that brightened under their puckering +lids. + +Wolzogen, nonchalantly stretching his legs, approached Kutuzov +with a half-contemptuous smile on his lips, scarcely touching the peak +of his cap. + +He treated his Serene Highness with a somewhat affected +nonchalance intended to show that, as a highly trained military man, +he left it to Russians to make an idol of this useless old man, but +that he knew whom he was dealing with. "Der alte Herr" (as in their +own set the Germans called Kutuzov) "is making himself very +comfortable," thought Wolzogen, and looking severely at the dishes +in front of Kutuzov he began to report to "the old gentleman" the +position of affairs on the left flank as Barclay had ordered him to +and as he himself had seen and understood it. + +"All the points of our position are in the enemy's hands and we +cannot dislodge them for lack of troops, the men are running away +and it is impossible to stop them," he reported. + +Kutuzov ceased chewing and fixed an astonished gaze on Wolzogen, +as if not understand what was said to him. Wolzogen, noticing "the old +gentleman's" agitation, said with a smile: + +"I have not considered it right to conceal from your Serene Highness +what I have seen. The troops are in complete disorder..." + +"You have seen? You have seen?..." Kutuzov shouted frowning, and +rising quickly he went up to Wolzogen. + +"How... how dare you!..." he shouted, choking and making a +threatening gesture with his trembling arms: "How dare you, sir, say +that to me? You know nothing about it. Tell General Barclay from me +that his information is incorrect and that the real course of the +battle is better known to me, the commander in chief, than to him." + +Wolzogen was about to make a rejoinder, but Kutuzov interrupted him. + +"The enemy has been repulsed on the left and defeated on the right +flank. If you have seen amiss, sir, do not allow yourself to say +what you don't know! Be so good as to ride to General Barclay and +inform him of my firm intention to attack the enemy tomorrow," said +Kutuzov sternly. + +All were silent, and the only sound audible was the heavy +breathing of the panting old general. + +"They are repulsed everywhere, for which I thank God and our brave +army! The enemy is beaten, and tomorrow we shall drive him from the +sacred soil of Russia," said Kutuzov crossing himself, and he suddenly +sobbed as his eyes filled with tears. + +Wolzogen, shrugging his shoulders and curling his lips, stepped +silently aside, marveling at "the old gentleman's" conceited +stupidity. + +"Ah, here he is, my hero!" said Kutuzov to a portly, handsome, +dark-haired general who was just ascending the knoll. + +This was Raevski, who had spent the whole day at the most +important part of the field of Borodino. + +Raevski reported that the troops were firmly holding their ground +and that the French no longer ventured to attack. + +After hearing him, Kutuzov said in French: + +"Then you do not think, like some others, that we must retreat?" + +"On the contrary, your Highness, in indecisive actions it is +always the most stubborn who remain victors," replied Raevski, "and in +my opinion..." + +"Kaysarov!" Kutuzov called to his adjutant. "Sit down and write +out the order of the day for tomorrow. And you," he continued, +addressing another, "ride along the line and that tomorrow we attack." + +While Kutuzov was talking to Raevski and dictating the order of +the day, Wolzogen returned from Barclay and said that General +Barclay wished to have written confirmation of the order the field +marshal had given. + +Kutuzov, without looking at Wolzogen, gave directions for the +order to be written out which the former commander in chief, to +avoid personal responsibility, very judiciously wished to receive. + +And by means of that mysterious indefinable bond which maintains +throughout an army one and the same temper, known as "the spirit of +the army," and which constitutes the sinew of war, Kutuzov's words, +his order for a battle next day, immediately became known from one end +of the army to the other. + +It was far from being the same words or the same order that +reached the farthest links of that chain. The tales passing from mouth +to mouth at different ends of the army did not even resemble what +Kutuzov had said, but the sense of his words spread everywhere because +what he said was not the outcome of cunning calculations, but of a +feeling that lay in the commander in chief's soul as in that of +every Russian. + +And on learning that tomorrow they were to attack the enemy, and +hearing from the highest quarters a confirmation of what they wanted +to believe, the exhausted, wavering men felt comforted and inspirited. + + + + + +CHAPTER XXXVI + + +Prince Andrew's regiment was among the reserves which till after one +o'clock were stationed inactive behind Semenovsk, under heavy +artillery fire. Toward two o'clock the regiment, having already lost +more than two hundred men, was moved forward into a trampled +oatfield in the gap between Semenovsk and the Knoll Battery, where +thousands of men perished that day and on which an intense, +concentrated fire from several hundred enemy guns was directed between +one and two o'clock. + +Without moving from that spot or firing a single shot the regiment +here lost another third of its men. From in front and especially +from the right, in the unlifting smoke the guns boomed, and out of the +mysterious domain of smoke that overlay the whole space in front, +quick hissing cannon balls and slow whistling shells flew unceasingly. +At times, as if to allow them a respite, a quarter of an hour passed +during which the cannon balls and shells all flew overhead, but +sometimes several men were torn from the regiment in a minute and +the slain were continually being dragged away and the wounded +carried off. + +With each fresh blow less and less chance of life remained for those +not yet killed. The regiment stood in columns of battalion, three +hundred paces apart, but nevertheless the men were always in one and +the same mood. All alike were taciturn and morose. Talk was rarely +heard in the ranks, and it ceased altogether every time the thud of +a successful shot and the cry of "stretchers!" was heard. Most of +the time, by their officers' order, the men sat on the ground. One, +having taken off his shako, carefully loosened the gathers of its +lining and drew them tight again; another, rubbing some dry clay +between his palms, polished his bayonet; another fingered the strap +and pulled the buckle of his bandolier, while another smoothed and +refolded his leg bands and put his boots on again. Some built little +houses of the tufts in the plowed ground, or plaited baskets from +the straw in the cornfield. All seemed fully absorbed in these +pursuits. When men were killed or wounded, when rows of stretchers +went past, when some troops retreated, and when great masses of the +enemy came into view through the smoke, no one paid any attention to +these things. But when our artillery or cavalry advanced or some of +our infantry were seen to move forward, words of approval were heard +on all sides. But the liveliest attention was attracted by occurrences +quite apart from, and unconnected with, the battle. It was as if the +minds of these morally exhausted men found relief in everyday, +commonplace occurrences. A battery of artillery was passing in front +of the regiment. The horse of an ammunition cart put its leg over a +trace. "Hey, look at the trace horse!... Get her leg out! She'll +fall.... Ah, they don't see it!" came identical shouts from the +ranks all along the regiment. Another time, general attention was +attracted by a small brown dog, coming heaven knows whence, which +trotted in a preoccupied manner in front of the ranks with tail +stiffly erect till suddenly a shell fell close by, when it yelped, +tucked its tail between its legs, and darted aside. Yells and +shrieks of laughter rose from the whole regiment. But such +distractions lasted only a moment, and for eight hours the men had +been inactive, without food, in constant fear of death, and their pale +and gloomy faces grew ever paler and gloomier. + +Prince Andrew, pale and gloomy like everyone in the regiment, +paced up and down from the border of one patch to another, at the edge +of the meadow beside an oatfield, with head bowed and arms behind +his back. There was nothing for him to do and no orders to be given. +Everything went on of itself. The killed were dragged from the +front, the wounded carried away, and the ranks closed up. If any +soldiers ran to the rear they returned immediately and hastily. At +first Prince Andrew, considering it his duty to rouse the courage of +the men and to set them an example, walked about among the ranks, +but he soon became convinced that this was unnecessary and that +there was nothing he could teach them. All the powers of his soul, +as of every soldier there, were unconsciously bent on avoiding the +contemplation of the horrors of their situation. He walked along the +meadow, dragging his feet, rustling the grass, and gazing at the +dust that covered his boots; now he took big strides trying to keep to +the footprints left on the meadow by the mowers, then he counted his +steps, calculating how often he must walk from one strip to another to +walk a mile, then he stripped the flowers from the wormwood that +grew along a boundary rut, rubbed them in his palms, and smelled their +pungent, sweetly bitter scent. Nothing remained of the previous +day's thoughts. He thought of nothing. He listened with weary ears +to the ever-recurring sounds, distinguishing the whistle of flying +projectiles from the booming of the reports, glanced at the tiresomely +familiar faces of the men of the first battalion, and waited. "Here it +comes... this one is coming our way again!" he thought, listening to +an approaching whistle in the hidden region of smoke. "One, another! +Again! It has hit...." He stopped and looked at the ranks. "No, it has +gone over. But this one has hit!" And again he started trying to reach +the boundary strip in sixteen paces. A whizz and a thud! Five paces +from him, a cannon ball tore up the dry earth and disappeared. A chill +ran down his back. Again he glanced at the ranks. Probably many had +been hit--a large crowd had gathered near the second battalion. + +"Adjutant!" he shouted. "Order them not to crowd together." + +The adjutant, having obeyed this instruction, approached Prince +Andrew. From the other side a battalion commander rode up. + +"Look out!" came a frightened cry from a soldier and, like a bird +whirring in rapid flight and alighting on the ground, a shell +dropped with little noise within two steps of Prince Andrew and +close to the battalion commander's horse. The horse first, +regardless of whether it was right or wrong to show fear, snorted, +reared almost throwing the major, and galloped aside. The horse's +terror infected the men. + +"Lie down!" cried the adjutant, throwing himself flat on the ground. + +Prince Andrew hesitated. The smoking shell spun like a top between +him and the prostrate adjutant, near a wormwood plant between the +field and the meadow. + +"Can this be death?" thought Prince Andrew, looking with a quite +new, envious glance at the grass, the wormwood, and the streamlet of +smoke that curled up from the rotating black ball. "I cannot, I do not +wish to die. I love life--I love this grass, this earth, this air...." +He thought this, and at the same time remembered that people were +looking at him. + +"It's shameful, sir!" he said to the adjutant. "What..." + +He did not finish speaking. At one and the same moment came the +sound of an explosion, a whistle of splinters as from a breaking +window frame, a suffocating smell of powder, and Prince Andrew started +to one side, raising his arm, and fell on his chest. Several +officers ran up to him. From the right side of his abdomen, blood +was welling out making a large stain on the grass. + +The militiamen with stretchers who were called up stood behind the +officers. Prince Andrew lay on his chest with his face in the grass, +breathing heavily and noisily. + +"What are you waiting for? Come along!" + +The peasants went up and took him by his shoulders and legs, but +he moaned piteously and, exchanging looks, they set him down again. + +"Pick him up, lift him, it's all the same!" cried someone. + +They again took him by the shoulders and laid him on the stretcher. + +"Ah, God! My God! What is it? The stomach? That means death! My +God!"--voices among the officers were heard saying. + +"It flew a hair's breadth past my ear," said the adjutant. + +The peasants, adjusting the stretcher to their shoulders, started +hurriedly along the path they had trodden down, to the dressing +station. + +"Keep in step! Ah... those peasants!" shouted an officer, seizing by +their shoulders and checking the peasants, who were walking unevenly +and jolting the stretcher. + +"Get into step, Fedor... I say, Fedor!" said the foremost peasant. + +"Now that's right!" said the one behind joyfully, when he had got +into step. + +"Your excellency! Eh, Prince!" said the trembling voice of Timokhin, +who had run up and was looking down on the stretcher. + +Prince Andrew opened his eyes and looked up at the speaker from +the stretcher into which his head had sunk deep and again his +eyelids drooped. + + +The militiamen carried Prince Andrew to dressing station by the +wood, where wagons were stationed. The dressing station consisted of +three tents with flaps turned back, pitched at the edge of a birch +wood. In the wood, wagons and horses were standing. The horses were +eating oats from their movable troughs and sparrows flew down and +pecked the grains that fell. Some crows, scenting blood, flew among +the birch trees cawing impatiently. Around the tents, over more than +five acres, bloodstained men in various garbs stood, sat, or lay. +Around the wounded stood crowds of soldier stretcher-bearers with +dismal and attentive faces, whom the officers keeping order tried in +vain to drive from the spot. Disregarding the officers' orders, the +soldiers stood leaning against their stretchers and gazing intently, +as if trying to comprehend the difficult problem of what was taking +place before them. From the tents came now loud angry cries and now +plaintive groans. Occasionally dressers ran out to fetch water, or +to point out those who were to be brought in next. The wounded men +awaiting their turn outside the tents groaned, sighed, wept, screamed, +swore, or asked for vodka. Some were delirious. Prince Andrew's +bearers, stepping over the wounded who had not yet been bandaged, took +him, as a regimental commander, close up to one of the tents and there +stopped, awaiting instructions. Prince Andrew opened his eyes and +for a long time could not make out what was going on around him. He +remembered the meadow, the wormwood, the field, the whirling black +ball, and his sudden rush of passionate love of life. Two steps from +him, leaning against a branch and talking loudly and attracting +general attention, stood a tall, handsome, black-haired +noncommissioned officer with a bandaged head. He had been wounded in +the head and leg by bullets. Around him, eagerly listening to his +talk, a crowd of wounded and stretcher-bearers was gathered. + +"We kicked him out from there so that he chucked everything, we +grabbed the King himself!" cried he, looking around him with eyes that +glittered with fever. "If only reserves had come up just then, lads, +there wouldn't have been nothing left of him! I tell you surely..." + +Like all the others near the speaker, Prince Andrew looked at him +with shining eyes and experienced a sense of comfort. "But isn't it +all the same now?" thought he. "And what will be there, and what has +there been here? Why was I so reluctant to part with life? There was +something in this life I did not and do not understand." + + + + + +CHAPTER XXXVII + + +One of the doctors came out of the tent in a bloodstained apron, +holding a cigar between the thumb and little finger of one of his +small bloodstained hands, so as not to smear it. He raised his head +and looked about him, but above the level of the wounded men. He +evidently wanted a little respite. After turning his head from right +to left for some time, he sighed and looked down. + +"All right, immediately," he replied to a dresser who pointed Prince +Andrew out to him, and he told them to carry him into the tent. + +Murmurs arose among the wounded who were waiting. + +"It seems that even in the next world only the gentry are to have +a chance!" remarked one. + +Prince Andrew was carried in and laid on a table that had only +just been cleared and which a dresser was washing down. Prince +Andrew could not make out distinctly what was in that tent. The +pitiful groans from all sides and the torturing pain in his thigh, +stomach, and back distracted him. All he saw about him merged into a +general impression of naked, bleeding human bodies that seemed to fill +the whole of the low tent, as a few weeks previously, on that hot +August day, such bodies had filled the dirty pond beside the +Smolensk road. Yes, it was the same flesh, the same chair a canon, the +sight of which had even then filled him with horror, as by a +presentiment. + +There were three operating tables in the tent. Two were occupied, +and on the third they placed Prince Andrew. For a little while he +was left alone and involuntarily witnessed what was taking place on +the other two tables. On the nearest one sat a Tartar, probably a +Cossack, judging by the uniform thrown down beside him. Four +soldiers were holding him, and a spectacled doctor was cutting into +his muscular brown back. + +"Ooh, ooh, ooh!" grunted the Tartar, and suddenly lifting up his +swarthy snub-nosed face with its high cheekbones, and baring his white +teeth, he began to wriggle and twitch his body and utter piercing, +ringing, and prolonged yells. On the other table, round which many +people were crowding, a tall well-fed man lay on his back with his +head thrown back. His curly hair, its color, and the shape of his head +seemed strangely familiar to Prince Andrew. Several dressers were +pressing on his chest to hold him down. One large, white, plump leg +twitched rapidly all the time with a feverish tremor. The man was +sobbing and choking convulsively. Two doctors--one of whom was pale +and trembling--were silently doing something to this man's other, gory +leg. When he had finished with the Tartar, whom they covered with an +overcoat, the spectacled doctor came up to Prince Andrew, wiping his +hands. + +He glanced at Prince Andrew's face and quickly turned away. + +"Undress him! What are you waiting for?" he cried angrily to the +dressers. + +His very first, remotest recollections of childhood came back to +Prince Andrew's mind when the dresser with sleeves rolled up began +hastily to undo the buttons of his clothes and undressed him. The +doctor bent down over the wound, felt it, and sighed deeply. Then he +made a sign to someone, and the torturing pain in his abdomen caused +Prince Andrew to lose consciousness. When he came to himself the +splintered portions of his thighbone had been extracted, the torn +flesh cut away, and the wound bandaged. Water was being sprinkled on +his face. As soon as Prince Andrew opened his eyes, the doctor bent +over, kissed him silently on the lips, and hurried away. + +After the sufferings he had been enduring, Prince Andrew enjoyed a +blissful feeling such as he had not experienced for a long time. All +the best and happiest moments of his life--especially his earliest +childhood, when he used to be undressed and put to bed, and when +leaning over him his nurse sang him to sleep and he, burying his +head in the pillow, felt happy in the mere consciousness of life- +returned to his memory, not merely as something past but as +something present. + +The doctors were busily engaged with the wounded man the shape of +whose head seemed familiar to Prince Andrew: they were lifting him +up and trying to quiet him. + +"Show it to me.... Oh, ooh... Oh! Oh, ooh!" his frightened moans +could be heard, subdued by suffering and broken by sobs. + +Hearing those moans Prince Andrew wanted to weep. +Whether because he was dying without glory, or because he was sorry to +part with life, or because of those memories of a childhood that could +not return, or because he was suffering and others were suffering +and that man near him was groaning so piteously--he felt like +weeping childlike, kindly, and almost happy tears. + +The wounded man was shown his amputated leg stained with clotted +blood and with the boot still on. + +"Oh! Oh, ooh!" he sobbed, like a woman. + +The doctor who had been standing beside him, preventing Prince +Andrew from seeing his face, moved away. + +"My God! What is this? Why is he here?" said Prince Andrew to +himself. + +In the miserable, sobbing, enfeebled man whose leg had just been +amputated, he recognized Anatole Kuragin. Men were supporting him in +their arms and offering him a glass of water, but his trembling, +swollen lips could not grasp its rim. Anatole was sobbing painfully. +"Yes, it is he! Yes, that man is somehow closely and painfully +connected with me," thought Prince Andrew, not yet clearly grasping +what he saw before him. "What is the connection of that man with my +childhood and life?" he asked himself without finding an answer. And +suddenly a new unexpected memory from that realm of pure and loving +childhood presented itself to him. He remembered Natasha as he had +seen her for the first time at the ball in 1810, with her slender neck +and arms and with a frightened happy face ready for rapture, and +love and tenderness for her, stronger and more vivid than ever, +awoke in his soul. He now remembered the connection that existed +between himself and this man who was dimly gazing at him through tears +that filled his swollen eyes. He remembered everything, and ecstatic +pity and love for that man overflowed his happy heart. + +Prince Andrew could no longer restrain himself and wept tender +loving tears for his fellow men, for himself, and for his own and +their errors. + +"Compassion, love of our brothers, for those who love us and for +those who hate us, love of our enemies; yes, that love which God +preached on earth and which Princess Mary taught me and I did not +understand--that is what made me sorry to part with life, that is what +remained for me had I lived. But now it is too late. I know it!" + + + + + +CHAPTER XXXVIII + + +The terrible spectacle of the battlefield covered with dead and +wounded, together with the heaviness of his head and the news that +some twenty generals he knew personally had been killed or wounded, +and the consciousness of the impotence of his once mighty arm, +produced an unexpected impression on Napoleon who usually liked to +look at the killed and wounded, thereby, he considered, testing his +strength of mind. This day the horrible appearance of the +battlefield overcame that strength of mind which he thought +constituted his merit and his greatness. He rode hurriedly from the +battlefield and returned to the Shevardino knoll, where he sat on +his campstool, his sallow face swollen and heavy, his eyes dim, his +nose red, and his voice hoarse, involuntarily listening, with downcast +eyes, to the sounds of firing. With painful dejection he awaited the +end of this action, in which he regarded himself as a participant +and which he was unable to arrest. A personal, human feeling for a +brief moment got the better of the artificial phantasm of life he +had served so long. He felt in his own person the sufferings and death +he had witnessed on the battlefield. The heaviness of his head and +chest reminded him of the possibility of suffering and death for +himself. At that moment he did not desire Moscow, or victory, or glory +(what need had he for any more glory?). The one thing he wished for +was rest, tranquillity, and freedom. But when he had been on the +Semenovsk heights the artillery commander had proposed to him to bring +several batteries of artillery up to those heights to strengthen the +fire on the Russian troops crowded in front of Knyazkovo. Napoleon had +assented and had given orders that news should be brought to him of +the effect those batteries produced. + +An adjutant came now to inform him that the fire of two hundred guns +had been concentrated on the Russians, as he had ordered, but that +they still held their ground. + +"Our fire is mowing them down by rows, but still they hold on," said +the adjutant. + +"They want more!..." said Napoleon in a hoarse voice. + +"Sire?" asked the adjutant who had not heard the remark. + +"They want more!" croaked Napoleon frowning. "Let them have it!" + +Even before he gave that order the thing he did not desire, and +for which he gave the order only because he thought it was expected of +him, was being done. And he fell back into that artificial realm of +imaginary greatness, and again--as a horse walking a treadmill +thinks it is doing something for itself--he submissively fulfilled the +cruel, sad, gloomy, and inhuman role predestined for him. + +And not for that day and hour alone were the mind and conscience +darkened of this man on whom the responsibility for what was happening +lay more than on all the others who took part in it. Never to the +end of his life could he understand goodness, beauty, or truth, or the +significance of his actions which were too contrary to goodness and +truth, too remote from everything human, for him ever to be able to +grasp their meaning. He could not disavow his actions, belauded as +they were by half the world, and so he had to repudiate truth, +goodness, and all humanity. + +Not only on that day, as he rode over the battlefield strewn with +men killed and maimed (by his will as he believed), did he reckon as +he looked at them how many Russians there were for each Frenchman and, +deceiving himself, find reason for rejoicing in the calculation that +there were five Russians for every Frenchman. Not on that day alone +did he write in a letter to Paris that "the battle field was +superb," because fifty thousand corpses lay there, but even on the +island of St. Helena in the peaceful solitude where he said he +intended to devote his leisure to an account of the great deeds he had +done, he wrote: + + +The Russian war should have been the most popular war of modern +times: it was a war of good sense, for real interests, for the +tranquillity and security of all; it was purely pacific and +conservative. + +It was a war for a great cause, the end of uncertainties and the +beginning of security. A new horizon and new labors were opening +out, full of well-being and prosperity for all. The European system +was already founded; all that remained was to organize it. + +Satisfied on these great points and with tranquility everywhere, I +too should have had my Congress and my Holy Alliance. Those ideas were +stolen from me. In that reunion of great sovereigns we should have +discussed our interests like one family, and have rendered account +to the peoples as clerk to master. + +Europe would in this way soon have been, in fact, but one people, +and anyone who traveled anywhere would have found himself always in +the common fatherland. I should have demanded the freedom of all +navigable rivers for everybody, that the seas should be common to all, +and that the great standing armies should be reduced henceforth to +mere guards for the sovereigns. + +On returning to France, to the bosom of the great, strong, +magnificent, peaceful, and glorious fatherland, I should have +proclaimed her frontiers immutable; all future wars purely +defensive, all aggrandizement antinational. I should have associated +my son in the Empire; my dictatorship would have been finished, and +his constitutional reign would have begun. + +Paris would have been the capital of the world, and the French the +envy of the nations! + +My leisure then, and my old age, would have been devoted, in company +with the Empress and during the royal apprenticeship of my son, to +leisurely visiting, with our own horses and like a true country +couple, every corner of the Empire, receiving complaints, redressing +wrongs, and scattering public buildings and benefactions on all +sides and everywhere. + + +Napoleon, predestined by Providence for the gloomy role of +executioner of the peoples, assured himself that the aim of his +actions had been the peoples' welfare and that he could control the +fate of millions and by the employment of power confer benefactions. + + +"Of four hundred thousand who crossed the Vistula," he wrote further +of the Russian war, "half were Austrians, Prussians, Saxons, Poles, +Bavarians, Wurttembergers, Mecklenburgers, Spaniards, Italians, and +Neapolitans. The Imperial army, strictly speaking, was one third +composed of Dutch, Belgians, men from the borders of the Rhine, +Piedmontese, Swiss, Genevese, Tuscans, Romans, inhabitants of the +Thirty-second Military Division, of Bremen, of Hamburg, and so on: +it included scarcely a hundred and forty thousand who spoke French. +The Russian expedition actually cost France less than fifty thousand +men; the Russian army in its retreat from Vilna to Moscow lost in +the various battles four times more men than the French army; the +burning of Moscow cost the lives of a hundred thousand Russians who +died of cold and want in the woods; finally, in its march from +Moscow to the Oder the Russian army also suffered from the severity of +the season; so that by the the time it reached Vilna it numbered +only fifty thousand, and at Kalisch less than eighteen thousand." + + +He imagined that the war with Russia came about by his will, and the +horrors that occurred did not stagger his soul. He boldly took the +whole responsibility for what happened, and his darkened mind found +justification in the belief that among the hundreds of thousands who +perished there were fewer Frenchmen than Hessians and Bavarians. + + + + + +CHAPTER XXXIX + + +Several tens of thousands of the slain lay in diverse postures and +various uniforms on the fields and meadows belonging to the Davydov +family and to the crown serfs--those fields and meadows where for +hundreds of years the peasants of Borodino, Gorki, Shevardino, and +Semenovsk had reaped their harvests and pastured their cattle. At +the dressing stations the grass and earth were soaked with blood for a +space of some three acres around. Crowds of men of various arms, +wounded and unwounded, with frightened faces, dragged themselves +back to Mozhaysk from the one army and back to Valuevo from the other. +Other crowds, exhausted and hungry, went forward led by their +officers. Others held their ground and continued to fire. + +Over the whole field, previously so gaily beautiful with the glitter +of bayonets and cloudlets of smoke in the morning sun, there now +spread a mist of damp and smoke and a strange acid smell of +saltpeter and blood. Clouds gathered and drops of rain began to fall +on the dead and wounded, on the frightened, exhausted, and +hesitating men, as if to say: "Enough, men! Enough! Cease... bethink +yourselves! What are you doing?" + +To the men of both sides alike, worn out by want of food and rest, +it began equally to appear doubtful whether they should continue to +slaughter one another; all the faces expressed hesitation, and the +question arose in every soul: "For what, for whom, must I kill and +be killed?... You may go and kill whom you please, but I don't want to +do so anymore!" By evening this thought had ripened in every soul. +At any moment these men might have been seized with horror at what +they were doing and might have thrown up everything and run away +anywhere. + +But though toward the end of the battle the men felt all the +horror of what they were doing, though they would have been glad to +leave off, some incomprehensible, mysterious power continued to +control them, and they still brought up the charges, loaded, aimed, +and applied the match, though only one artilleryman survived out of +every three, and though they stumbled and panted with fatigue, +perspiring and stained with blood and powder. The cannon balls flew +just as swiftly and cruelly from both sides, crushing human bodies, +and that terrible work which was not done by the will of a man but +at the will of Him who governs men and worlds continued. + +Anyone looking at the disorganized rear of the Russian army would +have said that, if only the French made one more slight effort, it +would disappear; and anyone looking at the rear of the French army +would have said that the Russians need only make one more slight +effort and the French would be destroyed. But neither the French nor +the Russians made that effort, and the flame of battle burned slowly +out. + +The Russians did not make that effort because they were not +attacking the French. At the beginning of the battle they stood +blocking the way to Moscow and they still did so at the end of the +battle as at the beginning. But even had the aim of the Russians +been to drive the French from their positions, they could not have +made this last effort, for all the Russian troops had been broken +up, there was no part of the Russian army that had not suffered in the +battle, and though still holding their positions they had lost ONE +HALF of their army. + +The French, with the memory of all their former victories during +fifteen years, with the assurance of Napoleon's invincibility, with +the consciousness that they had captured part of the battlefield and +had lost only a quarter of their men and still had their Guards +intact, twenty thousand strong, might easily have made that effort. +The French had attacked the Russian army in order to drive it from its +position ought to have made that effort, for as long as the Russians +continued to block the road to Moscow as before, the aim of the French +had not been attained and all their efforts and losses were in vain. +But the French did not make that effort. Some historians say that +Napoleon need only have used his Old Guards, who were intact, and +the battle would have been won. To speak of what would have happened +had Napoleon sent his Guards is like talking of what would happen if +autumn became spring. It could not be. Napoleon did not give his +Guards, not because he did not want to, but because it could not be +done. All the generals, officers, and soldiers of the French army knew +it could not be done, because the flagging spirit of the troops +would not permit it. + +It was not Napoleon alone who had experienced that nightmare feeling +of the mighty arm being stricken powerless, but all the generals and +soldiers of his army whether they had taken part in the battle or not, +after all their experience of previous battles--when after one tenth +of such efforts the enemy had fled--experienced a similar feeling of +terror before an enemy who, after losing HALF his men, stood as +threateningly at the end as at the beginning of the battle. The +moral force of the attacking French army was exhausted. Not that +sort of victory which is defined by the capture of pieces of +material fastened to sticks, called standards, and of the ground on +which the troops had stood and were standing, but a moral victory that +convinces the enemy of the moral superiority of his opponent and of +his own impotence was gained by the Russians at Borodino. The French +invaders, like an infuriated animal that has in its onslaught received +a mortal wound, felt that they were perishing, but could not stop, any +more than the Russian army, weaker by one half, could help swerving. +By impetus gained, the French army was still able to roll forward to +Moscow, but there, without further effort on the part of the Russians, +it had to perish, bleeding from the mortal wound it had received at +Borodino. The direct consequence of the battle of Borodino was +Napoleon's senseless flight from Moscow, his retreat along the old +Smolensk road, the destruction of the invading army of five hundred +thousand men, and the downfall of Napoleonic France, on which at +Borodino for the first time the hand of an opponent of stronger spirit +had been laid. + + + + + +BOOK ELEVEN: 1812 + + + + + +CHAPTER I + + +Absolute continuity of motion is not comprehensible to the human +mind. Laws of motion of any kind become comprehensible to man only +when he examines arbitrarily selected elements of that motion; but +at the same time, a large proportion of human error comes from the +arbitrary division of continuous motion into discontinuous elements. +There is a well known, so-called sophism of the ancients consisting in +this, that Achilles could never catch up with a tortoise he was +following, in spite of the fact that he traveled ten times as fast +as the tortoise. By the time Achilles has covered the distance that +separated him from the tortoise, the tortoise has covered one tenth of +that distance ahead of him: when Achilles has covered that tenth, +the tortoise has covered another one hundredth, and so on forever. +This problem seemed to the ancients insoluble. The absurd answer (that +Achilles could never overtake the tortoise) resulted from this: that +motion was arbitrarily divided into discontinuous elements, whereas +the motion both of Achilles and of the tortoise was continuous. + +By adopting smaller and smaller elements of motion we only +approach a solution of the problem, but never reach it. Only when we +have admitted the conception of the infinitely small, and the +resulting geometrical progression with a common ratio of one tenth, +and have found the sum of this progression to infinity, do we reach +a solution of the problem. + +A modern branch of mathematics having achieved the art of dealing +with the infinitely small can now yield solutions in other more +complex problems of motion which used to appear insoluble. + +This modern branch of mathematics, unknown to the ancients, when +dealing with problems of motion admits the conception of the +infinitely small, and so conforms to the chief condition of motion +(absolute continuity) and thereby corrects the inevitable error +which the human mind cannot avoid when it deals with separate elements +of motion instead of examining continuous motion. + +In seeking the laws of historical movement just the same thing +happens. The movement of humanity, arising as it does from innumerable +arbitrary human wills, is continuous. + +To understand the laws of this continuous movement is the aim of +history. But to arrive at these laws, resulting from the sum of all +those human wills, man's mind postulates arbitrary and disconnected +units. The first method of history is to take an arbitrarily +selected series of continuous events and examine it apart from others, +though there is and can be no beginning to any event, for one event +always flows uninterruptedly from another. + +The second method is to consider the actions of some one man--a king +or a commander--as equivalent to the sum of many individual wills; +whereas the sum of individual wills is never expressed by the activity +of a single historic personage. + +Historical science in its endeavor to draw nearer to truth +continually takes smaller and smaller units for examination. But +however small the units it takes, we feel that to take any unit +disconnected from others, or to assume a beginning of any +phenomenon, or to say that the will of many men is expressed by the +actions of any one historic personage, is in itself false. + +It needs no critical exertion to reduce utterly to dust any +deductions drawn from history. It is merely necessary to select some +larger or smaller unit as the subject of observation--as criticism has +every right to do, seeing that whatever unit history observes must +always be arbitrarily selected. + +Only by taking infinitesimally small units for observation (the +differential of history, that is, the individual tendencies of men) +and attaining to the art of integrating them (that is, finding the sum +of these infinitesimals) can we hope to arrive at the laws of history. + +The first fifteen years of the nineteenth century in Europe +present an extraordinary movement of millions of people. Men leave +their customary pursuits, hasten from one side of Europe to the other, +plunder and slaughter one another, triumph and are plunged in despair, +and for some years the whole course of life is altered and presents an +intensive movement which first increases and then slackens. What was +the cause of this movement, by what laws was it governed? asks the +mind of man. + +The historians, replying to this question, lay before us the sayings +and doings of a few dozen men in a building in the city of Paris, +calling these sayings and doings "the Revolution"; then they give a +detailed biography of Napoleon and of certain people favorable or +hostile to him; tell of the influence some of these people had on +others, and say: that is why this movement took place and those are +its laws. + +But the mind of man not only refuses to believe this explanation, +but plainly says that this method of explanation is fallacious, +because in it a weaker phenomenon is taken as the cause of a stronger. +The sum of human wills produced the Revolution and Napoleon, and +only the sum of those wills first tolerated and then destroyed them. + +"But every time there have been conquests there have been +conquerors; every time there has been a revolution in any state +there have been great men," says history. And, indeed, human reason +replies: every time conquerors appear there have been wars, but this +does not prove that the conquerors caused the wars and that it is +possible to find the laws of a war in the personal activity of a +single man. Whenever I look at my watch and its hands point to ten, +I hear the bells of the neighboring church; but because the bells +begin to ring when the hands of the clock reach ten, I have no right +to assume that the movement of the bells is caused by the position +of the hands of the watch. + +Whenever I see the movement of a locomotive I hear the whistle and +see the valves opening and wheels turning; but I have no right to +conclude that the whistling and the turning of wheels are the cause of +the movement of the engine. + +The peasants say that a cold wind blows in late spring because the +oaks are budding, and really every spring cold winds do blow when +the oak is budding. But though I do not know what causes the cold +winds to blow when the oak buds unfold, I cannot agree with the +peasants that the unfolding of the oak buds is the cause of the cold +wind, for the force of the wind is beyond the influence of the buds. I +see only a coincidence of occurrences such as happens with all the +phenomena of life, and I see that however much and however carefully I +observe the hands of the watch, and the valves and wheels of the +engine, and the oak, I shall not discover the cause of the bells +ringing, the engine moving, or of the winds of spring. To that I +must entirely change my point of view and study the laws of the +movement of steam, of the bells, and of the wind. History must do +the same. And attempts in this direction have already been made. + +To study the laws of history we must completely change the subject +of our observation, must leave aside kings, ministers, and generals, +and the common, infinitesimally small elements by which the masses are +moved. No one can say in how far it is possible for man to advance +in this way toward an understanding of the laws of history; but it +is evident that only along that path does the possibility of +discovering the laws of history lie, and that as yet not a millionth +part as much mental effort has been applied in this direction by +historians as has been devoted to describing the actions of various +kings, commanders, and ministers and propounding the historians' own +reflections concerning these actions. + + + + + +CHAPTER II + + +The forces of a dozen European nations burst into Russia. The +Russian army and people avoided a collision till Smolensk was reached, +and again from Smolensk to Borodino. The French army pushed on to +Moscow, its goal, its impetus ever increasing as it neared its aim, +just as the velocity of a falling body increases as it approaches +the earth. Behind it were seven hundred miles of hunger-stricken, +hostile country; ahead were a few dozen miles separating it from its +goal. Every soldier in Napoleon's army felt this and the invasion +moved on by its own momentum. + +The more the Russian army retreated the more fiercely a spirit of +hatred of the enemy flared up, and while it retreated the army +increased and consolidated. At Borodino a collision took place. +Neither army was broken up, but the Russian army retreated immediately +after the collision as inevitably as a ball recoils after colliding +with another having a greater momentum, and with equal inevitability +the ball of invasion that had advanced with such momentum rolled on +for some distance, though the collision had deprived it of all its +force. + +The Russians retreated eighty miles--to beyond Moscow--and the +French reached Moscow and there came to a standstill. For five weeks +after that there was not a single battle. The French did not move. +As a bleeding, mortally wounded animal licks its wounds, they remained +inert in Moscow for five weeks, and then suddenly, with no fresh +reason, fled back: they made a dash for the Kaluga road, and (after +a victory--for at Malo-Yaroslavets the field of conflict again +remained theirs) without undertaking a single serious battle, they +fled still more rapidly back to Smolensk, beyond Smolensk, beyond +the Berezina, beyond Vilna, and farther still. + +On the evening of the twenty-sixth of August, Kutuzov and the +whole Russian army were convinced that the battle of Borodino was a +victory. Kutuzov reported so to the Emperor. He gave orders to prepare +for a fresh conflict to finish the enemy and did this not to deceive +anyone, but because he knew that the enemy was beaten, as everyone who +had taken part in the battle knew it. + +But all that evening and next day reports came in one after +another of unheard-of losses, of the loss of half the army, and a +fresh battle proved physically impossible. + +It was impossible to give battle before information had been +collected, the wounded gathered in, the supplies of ammunition +replenished, the slain reckoned up, new officers appointed to +replace those who had been killed, and before the men had had food and +sleep. And meanwhile, the very next morning after the battle, the +French army advanced of itself upon the Russians, carried forward by +the force of its own momentum now seemingly increased in inverse +proportion to the square of the distance from its aim. Kutuzov's +wish was to attack next day, and the whole army desired to do so. +But to make an attack the wish to do so is not sufficient, there +must also be a possibility of doing it, and that possibility did not +exist. It was impossible not to retreat a day's march, and then in the +same way it was impossible not to retreat another and a third day's +march, and at last, on the first of September when the army drew +near Moscow--despite the strength of the feeling that had arisen in +all ranks--the force of circumstances compelled it to retire beyond +Moscow. And the troops retired one more, last, day's march, and +abandoned Moscow to the enemy. + +For people accustomed to think that plans of campaign and battles +are made by generals--as any one of us sitting over a map in his study +may imagine how he would have arranged things in this or that +battle--the questions present themselves: Why did Kutuzov during the +retreat not do this or that? Why did he not take up a position +before reaching Fili? Why did he not retire at once by the Kaluga +road, abandoning Moscow? and so on. People accustomed to think in that +way forget, or do not know, the inevitable conditions which always +limit the activities of any commander in chief. The activity of a +commander in chief does not all resemble the activity we imagine to +ourselves when we sit at case in our studies examining some campaign +on the map, with a certain number of troops on this and that side in a +certain known locality, and begin our plans from some given moment. +A commander in chief is never dealing with the beginning of any event- +the position from which we always contemplate it. The commander in +chief is always in the midst of a series of shifting events and so +he never can at any moment consider the whole import of an event +that is occurring. Moment by moment the event is imperceptibly shaping +itself, and at every moment of this continuous, uninterrupted +shaping of events the commander in chief is in the midst of a most +complex play of intrigues, worries, contingencies, authorities, +projects, counsels, threats, and deceptions and is continually obliged +to reply to innumerable questions addressed to him, which constantly +conflict with one another. + +Learned military authorities quite seriously tell us that Kutuzov +should have moved his army to the Kaluga road long before reaching +Fili, and that somebody actually submitted such a proposal to him. But +a commander in chief, especially at a difficult moment, has always +before him not one proposal but dozens simultaneously. And all these +proposals, based on strategics and tactics, contradict each other. + +A commander in chief's business, it would seem, is simply to +choose one of these projects. But even that he cannot do. Events and +time do not wait. For instance, on the twenty-eighth it is suggested +to him to cross to the Kaluga road, but just then an adjutant +gallops up from Miloradovich asking whether he is to engage the French +or retire. An order must be given him at once, that instant. And the +order to retreat carries us past the turn to the Kaluga road. And +after the adjutant comes the commissary general asking where the +stores are to be taken, and the chief of the hospitals asks where +the wounded are to go, and a courier from Petersburg brings a letter +from the sovereign which does not admit of the possibility of +abandoning Moscow, and the commander in chief's rival, the man who +is undermining him (and there are always not merely one but several +such), presents a new project diametrically opposed to that of turning +to the Kaluga road, and the commander in chief himself needs sleep and +refreshment to maintain his energy and a respectable general who has +been overlooked in the distribution of rewards comes to complain, +and the inhabitants of the district pray to be defended, and an +officer sent to inspect the locality comes in and gives a report quite +contrary to what was said by the officer previously sent; and a spy, a +prisoner, and a general who has been on reconnaissance, all describe +the position of the enemy's army differently. People accustomed to +misunderstand or to forget these inevitable conditions of a +commander in chief's actions describe to us, for instance, the +position of the army at Fili and assume that the commander in chief +could, on the first of September, quite freely decide whether to +abandon Moscow or defend it; whereas, with the Russian army less +than four miles from Moscow, no such question existed. When had that +question been settled? At Drissa and at Smolensk and most palpably +of all on the twenty-fourth of August at Shevardino and on the +twenty-sixth at Borodino, and each day and hour and minute of the +retreat from Borodino to Fili. + + + + + +CHAPTER III + + +When Ermolov, having been sent by Kutuzov to inspect the position, +told the field marshal that it was impossible to fight there before +Moscow and that they must retreat, Kutuzov looked at him in silence. + +"Give me your hand," said he and, turning it over so as to feel +the pulse, added: "You are not well, my dear fellow. Think what you +are saying!" + +Kutuzov could not yet admit the possibility of retreating beyond +Moscow without a battle. + +On the Poklonny Hill, four miles from the Dorogomilov gate of +Moscow, Kutuzov got out of his carriage and sat down on a bench by the +roadside. A great crowd of generals gathered round him, and Count +Rostopchin, who had come out from Moscow, joined them. This +brilliant company separated into several groups who all discussed +the advantages and disadvantages of the position, the state of the +army, the plans suggested, the situation of Moscow, and military +questions generally. Though they had not been summoned for the +purpose, and though it was not so called, they all felt that this +was really a council of war. The conversations all dealt with public +questions. If anyone gave or asked for personal news, it was done in a +whisper and they immediately reverted to general matters. No jokes, or +laughter, or smiles even, were seen among all these men. They +evidently all made an effort to hold themselves at the height the +situation demanded. And all these groups, while talking among +themselves, tried to keep near the commander in chief (whose bench +formed the center of the gathering) and to speak so that he might +overhear them. The commander in chief listened to what was being +said and sometimes asked them to repeat their remarks, but did not +himself take part in the conversations or express any opinion. After +hearing what was being said by one or other of these groups he +generally turned away with an air of disappointment, as though they +were not speaking of anything he wished to hear. Some discussed the +position that had been chosen, criticizing not the position itself +so much as the mental capacity of those who had chosen it. Others +argued that a mistake had been made earlier and that a battle should +have been fought two days before. Others again spoke of the battle +of Salamanca, which was described by Crosart, a newly arrived +Frenchman in a Spanish uniform. (This Frenchman and one of the +German princes serving with the Russian army were discussing the siege +of Saragossa and considering the possibility of defending Moscow in +a similar manner.) Count Rostopchin was telling a fourth group that he +was prepared to die with the city train bands under the walls of the +capital, but that he still could not help regretting having been +left in ignorance of what was happening, and that had he known it +sooner things would have been different.... A fifth group, +displaying the profundity of their strategic perceptions, discussed +the direction the troops would now have to take. A sixth group was +talking absolute nonsense. Kutuzov's expression grew more and more +preoccupied and gloomy. From all this talk he saw only one thing: that +to defend Moscow was a physical impossibility in the full meaning of +those words, that is to say, so utterly impossible that if any +senseless commander were to give orders to fight, confusion would +result but the battle would still not take place. It would not take +place because the commanders not merely all recognized the position to +be impossible, but in their conversations were only discussing what +would happen after its inevitable abandonment. How could the +commanders lead their troops to a field of battle they considered +impossible to hold? The lower-grade officers and even the soldiers +(who too reason) also considered the position impossible and therefore +could not go to fight, fully convinced as they were of defeat. If +Bennigsen insisted on the position being defended and others still +discussed it, the question was no longer important in itself but +only as a pretext for disputes and intrigue. This Kutuzov knew well. + +Bennigsen, who had chosen the position, warmly displayed his Russian +patriotism (Kutuzov could not listen to this without wincing) by +insisting that Moscow must be defended. His aim was as clear as +daylight to Kutuzov: if the defense failed, to throw the blame on +Kutuzov who had brought the army as far as the Sparrow Hills without +giving battle; if it succeeded, to claim the success as his own; or if +battle were not given, to clear himself of the crime of abandoning +Moscow. But this intrigue did not now occupy the old man's mind. One +terrible question absorbed him and to that question he heard no +reply from anyone. The question for him now was: "Have I really +allowed Napoleon to reach Moscow, and when did I do so? When was it +decided? Can it have been yesterday when I ordered Platov to +retreat, or was it the evening before, when I had a nap and told +Bennigsen to issue orders? Or was it earlier still?... When, when +was this terrible affair decided? Moscow must be abandoned. The army +must retreat and the order to do so must be given." To give that +terrible order seemed to him equivalent to resigning the command of +the army. And not only did he love power to which he was accustomed +(the honours awarded to Prince Prozorovski, under whom he had served +in Turkey, galled him), but he was convinced that he was destined to +save Russia and that that was why, against the Emperor's wish and by +the will of the people, he had been chosen commander in chief. He +was convinced that he alone could maintain command of the army in +these difficult circumstances, and that in all the world he alone +could encounter the invincible Napoleon without fear, and he was +horrified at the thought of the order he had to issue. But something +had to be decided, and these conversations around him which were +assuming too free a character must be stopped. + +He called the most important generals to him. + +"My head, be it good or bad, must depend on itself," said he, rising +from the bench, and he rode to Fili where his carriages were waiting. + + + + + +CHAPTER IV + + +The Council of War began to assemble at two in the afternoon in +the better and roomier part of Andrew Savostyanov's hut. The men, +women, and children of the large peasant family crowded into the +back room across the passage. Only Malasha, Andrew's six-year-old +granddaughter whom his Serene Highness had petted and to whom he had +given a lump of sugar while drinking his tea, remained on the top of +the brick oven in the larger room. Malasha looked down from the oven +with shy delight at the faces, uniforms, and decorations of the +generals, who one after another came into the room and sat down on the +broad benches in the corner under the icons. "Granddad" himself, as +Malasha in her own mind called Kutuzov, sat apart in a dark corner +behind the oven. He sat, sunk deep in a folding armchair, and +continually cleared his throat and pulled at the collar of his coat +which, though it was unbuttoned, still seemed to pinch his neck. Those +who entered went up one by one to the field marshal; he pressed the +hands of some and nodded to others. His adjutant Kaysarov was about to +draw back the curtain of the window facing Kutuzov, but the latter +moved his hand angrily and Kaysarov understood that his Serene +Highness did not wish his face to be seen. + +Round the peasant's deal table, on which lay maps, plans, pencils, +and papers, so many people gathered that the orderlies brought in +another bench and put it beside the table. Ermolov, Kaysarov, and +Toll, who had just arrived, sat down on this bench. In the foremost +place, immediately under the icons, sat Barclay de Tolly, his high +forehead merging into his bald crown. He had a St. George's Cross +round his neck and looked pale and ill. He had been feverish for two +days and was now shivering and in pain. Beside him sat Uvarov, who +with rapid gesticulations was giving him some information, speaking in +low tones as they all did. Chubby little Dokhturov was listening +attentively with eyebrows raised and arms folded on his stomach. On +the other side sat Count Ostermann-Tolstoy, seemingly absorbed in +his own thoughts. His broad head with its bold features and glittering +eyes was resting on his hand. Raevski, twitching forward the black +hair on his temples as was his habit, glanced now at Kutuzov and now +at the door with a look of impatience. Konovnitsyn's firm, handsome, +and kindly face was lit up by a tender, sly smile. His glance met +Malasha's, and the expression of his eyes caused the little girl to +smile. + +They were all waiting for Bennigsen, who on the pretext of +inspecting the position was finishing his savory dinner. They waited +for him from four till six o'clock and did not begin their +deliberations all that time talked in low tones of other matters. + +Only when Bennigsen had entered the hut did Kutuzov leave his corner +and draw toward the table, but not near enough for the candles that +had been placed there to light up his face. + +Bennigsen opened the council with the question: "Are we to abandon +Russia's ancient and sacred capital without a struggle, or are we to +defend it?" A prolonged and general silence followed. There was a +frown on every face and only Kutuzov's angry grunts and occasional +cough broke the silence. All eyes were gazing at him. Malasha too +looked at "Granddad." She was nearest to him and saw how his face +puckered; he seemed about to cry, but this did not last long. + +"Russia's ancient and sacred capital!" he suddenly said, repeating +Bennigsen's words in an angry voice and thereby drawing attention to +the false note in them. "Allow me to tell you, your excellency, that +that question has no meaning for a Russian." (He lurched his heavy +body forward.) "Such a question cannot be put; it is senseless! The +question I have asked these gentlemen to meet to discuss is a military +one. The question is that of saving Russia. Is it better to give up +Moscow without a battle, or by accepting battle to risk losing the +army as well as Moscow? That is the question on which I want your +opinion," and he sank back in his chair. + +The discussion began. Bennigsen did not yet consider his game +lost. Admitting the view of Barclay and others that a defensive battle +at Fili was impossible, but imbued with Russian patriotism and the +love of Moscow, he proposed to move troops from the right to the +left flank during the night and attack the French right flank the +following day. Opinions were divided, and arguments were advanced +for and against that project. Ermolov, Dokhturov, and Raevski agreed +with Bennigsen. Whether feeling it necessary to make a sacrifice +before abandoning the capital or guided by other, personal +considerations, these generals seemed not to understand that this +council could not alter the inevitable course of events and that +Moscow was in effect already abandoned. The other generals, however, +understood it and, leaving aside the question of Moscow, of the +direction the army should take in its retreat. Malasha, who kept her +eyes fixed on what was going on before her, understood the meaning +of the council differently. It seemed to her that it was only a +personal struggle between "Granddad" and "Long-coat" as she termed +Bennigsen. She saw that they grew spiteful when they spoke to one +another, and in her heart she sided with "Granddad." In the midst of +the conversation she noticed "Granddad" give Bennigsen a quick, subtle +glance, and then to her joys he saw that "Granddad" said something +to "Long-coat" which settled him. Bennigsen suddenly reddened and +paced angrily up and down the room. What so affected him was Kutuzov's +calm and quiet comment on the advantage or disadvantage of Bennigsen's +proposal to move troops by night from the right to the left flank to +attack the French right wing. + +"Gentlemen," said Kutuzov, "I cannot approve of the count's plan. +Moving troops in close proximity to an enemy is always dangerous, +and military history supports that view. For instance..." Kutuzov +seemed to reflect, searching for an example, then with a clear, +naive look at Bennigsen he added: "Oh yes; take the battle of +Friedland, which I think the count well remembers, and which was... +not fully successful, only because our troops were rearranged too near +the enemy..." + +There followed a momentary pause, which seemed very long to them +all. + +The discussion recommenced, but pauses frequently occurred and +they all felt that there was no more to be said. + +During one of these pauses Kutuzov heaved a deep sigh as if +preparing to speak. They all looked at him. + +"Well, gentlemen, I see that it is I who will have to pay for the +broken crockery," said he, and rising slowly he moved to the table. +"Gentlemen, I have heard your views. Some of you will not agree with +me. But I," he paused, "by the authority entrusted to me by my +Sovereign and country, order a retreat." + +After that the generals began to disperse with the solemnity and +circumspect silence of people who are leaving, after a funeral. + +Some of the generals, in low tones and in a strain very different +from the way they had spoken during the council, communicated +something to their commander in chief. + +Malasha, who had long been expected for supper, climbed carefully +backwards down from the oven, her bare little feet catching at its +projections, and slipping between the legs of the generals she +darted out of the room. + +When he had dismissed the generals Kutuzov sat a long time with +his elbows on the table, thinking always of the same terrible +question: "When, when did the abandonment of Moscow become inevitable? +When was that done which settled the matter? And who was to blame +for it?" + +"I did not expect this," said he to his adjutant Schneider when +the latter came in late that night. "I did not expect this! I did +not think this would happen." + +"You should take some rest, your Serene Highness," replied +Schneider. + +"But no! They shall eat horseflesh yet, like the Turks!" exclaimed +Kutuzov without replying, striking the table with his podgy fist. +"They shall too, if only..." + + + + + +CHAPTER V + + +At that very time, in circumstances even more important than +retreating without a battle, namely the evacuation and burning of +Moscow, Rostopchin, who is usually represented as being the instigator +of that event, acted in an altogether different manner from Kutuzov. + +After the battle of Borodino the abandonment and burning of Moscow +was as inevitable as the retreat of the army beyond Moscow without +fighting. + +Every Russian might have predicted it, not by reasoning but by the +feeling implanted in each of us and in our fathers. + +The same thing that took place in Moscow had happened in all the +towns and villages on Russian soil beginning with Smolensk, without +the participation of Count Rostopchin and his broadsheets. The +people awaited the enemy unconcernedly, did not riot or become excited +or tear anyone to pieces, but faced its fate, feeling within it the +strength to find what it should do at that most difficult moment. +And as soon as the enemy drew near the wealthy classes went away +abandoning their property, while the poorer remained and burned and +destroyed what was left. + +The consciousness that this would be so and would always be so was +and is present in the heart of every Russian. And a consciousness of +this, and a foreboding that Moscow would be taken, was present in +Russian Moscow society in 1812. Those who had quitted Moscow already +in July and at the beginning of August showed that they expected this. +Those who went away, taking what they could and abandoning their +houses and half their belongings, did so from the latent patriotism +which expresses itself not by phrases or by giving one's children to +save the fatherland and similar unnatural exploits, but unobtrusively, +simply, organically, and therefore in the way that always produces the +most powerful results. + +"It is disgraceful to run away from danger; only cowards are running +away from Moscow," they were told. In his broadsheets Rostopchin +impressed on them that to leave Moscow was shameful. They were ashamed +to be called cowards, ashamed to leave, but still they left, knowing +it had to be done. Why did they go? It is impossible to suppose that +Rostopchin had scared them by his accounts of horrors Napoleon had +committed in conquered countries. The first people to go away were the +rich educated people who knew quite well that Vienna and Berlin had +remained intact and that during Napoleon's occupation the +inhabitants had spent their time pleasantly in the company of the +charming Frenchmen whom the Russians, and especially the Russian +ladies, then liked so much. + +They went away because for Russians there could be no question as to +whether things would go well or ill under French rule in Moscow. It +was out of the question to be under French rule, it would be the worst +thing that could happen. They went away even before the battle of +Borodino and still more rapidly after it, despite Rostopchin's calls +to defend Moscow or the announcement of his intention to take the +wonder-working icon of the Iberian Mother of God and go to fight, or +of the balloons that were to destroy the French, and despite all the +nonsense Rostopchin wrote in his broadsheets. They knew that it was +for the army to fight, and that if it could not succeed it would not +do to take young ladies and house serfs to the Three Hills quarter +of Moscow to fight Napoleon, and that they must go away, sorry as they +were to abandon their property to destruction. They went away +without thinking of the tremendous significance of that immense and +wealthy city being given over to destruction, for a great city with +wooden buildings was certain when abandoned by its inhabitants to be +burned. They went away each on his own account, and yet it was only in +consequence of their going away that the momentous event was +accomplished that will always remain the greatest glory of the Russian +people. The lady who, afraid of being stopped by Count Rostopchin's +orders, had already in June moved with her Negroes and her women +jesters from Moscow to her Saratov estate, with a vague +consciousness that she was not Bonaparte's servant, was really, +simply, and truly carrying out the great work which saved Russia. +But Count Rostopchin, who now taunted those who left Moscow and now +had the government offices removed; now distributed quite useless +weapons to the drunken rabble; now had processions displaying the +icons, and now forbade Father Augustin to remove icons or the relics +of saints; now seized all the private carts in Moscow and on one +hundred and thirty-six of them removed the balloon that was being +constructed by Leppich; now hinted that he would burn Moscow and +related how he had set fire to his own house; now wrote a proclamation +to the French solemnly upbraiding them for having destroyed his +Orphanage; now claimed the glory of having hinted that he would burn +Moscow and now repudiated the deed; now ordered the people to catch +all spies and bring them to him, and now reproached them for doing so; +now expelled all the French residents from Moscow, and now allowed +Madame Aubert-Chalme (the center of the whole French colony in Moscow) +to remain, but ordered the venerable old postmaster Klyucharev to be +arrested and exiled for no particular offense; now assembled the +people at the Three Hills to fight the French and now, to get rid of +them, handed over to them a man to be killed and himself drove away by +a back gate; now declared that he would not survive the fall of +Moscow, and now wrote French verses in albums concerning his share +in the affair--this man did not understand the meaning of what was +happening but merely wanted to do something himself that would +astonish people, to perform some patriotically heroic feat; and like a +child he made sport of the momentous, and unavoidable event--the +abandonment and burning of Moscow--and tried with his puny hand now to +speed and now to stay the enormous, popular tide that bore him along +with it. + + + + + +CHAPTER VI + + +Helene, having returned with the court from Vilna to Petersburg, +found herself in a difficult position. + +In Petersburg she had enjoyed the special protection of a grandee +who occupied one of the highest posts in the Empire. In Vilna she +had formed an intimacy with a young foreign prince. When she +returned to Petersburg both the magnate and the prince were there, and +both claimed their rights. Helene was faced by a new problem--how to +preserve her intimacy with both without offending either. + +What would have seemed difficult or even impossible to another woman +did not cause the least embarrassment to Countess Bezukhova, who +evidently deserved her reputation of being a very clever woman. Had +she attempted concealment, or tried to extricate herself from her +awkward position by cunning, she would have spoiled her case by +acknowledging herself guilty. But Helene, like a really great man +who can do whatever he pleases, at once assumed her own position to be +correct, as she sincerely believed it to be, and that everyone else +was to blame. + +The first time the young foreigner allowed himself to reproach +her, she lifted her beautiful head and, half turning to him, said +firmly: "That's just like a man--selfish and cruel! I expected nothing +else. A woman sacrifices herself for you, she suffers, and this is her +reward! What right have you, monseigneur, to demand an account of my +attachments and friendships? He is a man who has been more than a +father to me!" The prince was about to say something, but Helene +interrupted him. + +"Well, yes," said she, "it may be that he has other sentiments for +me than those of a father, but that is not a reason for me to shut +my door on him. I am not a man, that I should repay kindness with +ingratitude! Know, monseigneur, that in all that relates to my +intimate feelings I render account only to God and to my +conscience," she concluded, laying her hand on her beautiful, fully +expanded bosom and looking up to heaven. + +"But for heaven's sake listen to me!" + +"Marry me, and I will be your slave!" + +"But that's impossible." + +"You won't deign to demean yourself by marrying me, you..." said +Helene, beginning to cry. + +The prince tried to comfort her, but Helene, as if quite distraught, +said through her tears that there was nothing to prevent her marrying, +that there were precedents (there were up to that time very few, but +she mentioned Napoleon and some other exalted personages), that she +had never been her husband's wife, and that she had been sacrificed. + +"But the law, religion..." said the prince, already yielding. + +"The law, religion... What have they been invented for if they can't +arrange that?" said Helene. + +The prince was surprised that so simple an idea had not occurred +to him, and he applied for advice to the holy brethren of the +Society of Jesus, with whom he was on intimate terms. + +A few days later at one of those enchanting fetes which Helene +gave at her country house on the Stone Island, the charming Monsieur +de Jobert, a man no longer young, with snow white hair and brilliant +black eyes, a Jesuit a robe courte* was presented to her, and in the +garden by the light of the illuminations and to the sound of music +talked to her for a long time of the love of God, of Christ, of the +Sacred Heart, and of the consolations the one true Catholic religion +affords in this world and the next. Helene was touched, and more +than once tears rose to her eyes and to those of Monsieur de Jobert +and their voices trembled. A dance, for which her partner came to seek +her, put an end to her discourse with her future directeur de +conscience, but the next evening Monsieur de Jobert came to see Helene +when she was alone, and after that often came again. + + +*Lay member of the Society of Jesus. + + +One day he took the countess to a Roman Catholic church, where she +knelt down before the altar to which she was led. The enchanting, +middle-aged Frenchman laid his hands on her head and, as she herself +afterward described it, she felt something like a fresh breeze +wafted into her soul. It was explained to her that this was la grace. + +After that a long-frocked abbe was brought to her. She confessed +to him, and he absolved her from her sins. Next day she received a box +containing the Sacred Host, which was left at her house for her to +partake of. A few days later Helene learned with pleasure that she had +now been admitted to the true Catholic Church and that in a few days +the Pope himself would hear of her and would send her a certain +document. + +All that was done around her and to her at this time, all the +attention devoted to her by so many clever men and expressed in such +pleasant, refined ways, and the state of dove-like purity she was +now in (she wore only white dresses and white ribbons all that time) +gave her pleasure, but her pleasure did not cause her for a moment +to forget her aim. And as it always happens in contests of cunning +that a stupid person gets the better of cleverer ones, Helene- +having realized that the main object of all these words and all this +trouble was, after converting her to Catholicism, to obtain money from +her for Jesuit institutions (as to which she received indications)- +before parting with her money insisted that the various operations +necessary to free her from her husband should be performed. In her +view the aim of every religion was merely to preserve certain +proprieties while affording satisfaction to human desires. And with +this aim, in one of her talks with her Father Confessor, she +insisted on an answer to the question, in how far was she bound by her +marriage? + +They were sitting in the twilight by a window in the drawing room. +The scent of flowers came in at the window. Helene was wearing a white +dress, transparent over her shoulders and bosom. The abbe, a +well-fed man with a plump, clean-shaven chin, a pleasant firm mouth, +and white hands meekly folded on his knees, sat close to Helene and, +with a subtle smile on his lips and a peaceful look of delight at +her beauty, occasionally glanced at her face as he explained his +opinion on the subject. Helene with an uneasy smile looked at his +curly hair and his plump, clean-shaven, blackish cheeks and every +moment expected the conversation to take a fresh turn. But the abbe, +though he evidently enjoyed the beauty of his companion, was +absorbed in his mastery of the matter. + +The course of the Father Confessor's arguments ran as follows: +"Ignorant of the import of what you were undertaking, you made a vow +of conjugal fidelity to a man who on his part, by entering the married +state without faith in the religious significance of marriage, +committed an act of sacrilege. That marriage lacked the dual +significance it should have had. Yet in spite of this your vow was +binding. You swerved from it. What did you commit by so acting? A +venial, or a mortal, sin? A venial sin, for you acted without evil +intention. If now you married again with the object of bearing +children, your sin might be forgiven. But the question is again a +twofold one: firstly..." + +But suddenly Helene, who was getting bored, said with one of her +bewitching smiles: "But I think that having espoused the true religion +I cannot be bound by what a false religion laid upon me." + +The director of her conscience was astounded at having the case +presented to him thus with the simplicity of Columbus' egg. He was +delighted at the unexpected rapidity of his pupil's progress, but +could not abandon the edifice of argument he had laboriously +constructed. + +"Let us understand one another, Countess," said he with a smile, and +began refuting his spiritual daughter's arguments. + + + + + +CHAPTER VII + + +Helene understood that the question was very simple and easy from +the ecclesiastical point of view, and that her directors were making +difficulties only because they were apprehensive as to how the +matter would be regarded by the secular authorities. + +So she decided that it was necessary to prepare the opinion of +society. She provoked the jealousy of the elderly magnate and told him +what she had told her other suitor; that is, she put the matter so +that the only way for him to obtain a right over her was to marry her. +The elderly magnate was at first as much taken aback by this +suggestion of marriage with a woman whose husband was alive, as the +younger man had been, but Helene's imperturbable conviction that it +was as simple and natural as marrying a maiden had its effect on him +too. Had Helene herself shown the least sign of hesitation, shame, +or secrecy, her cause would certainly have been lost; but not only did +she show no signs of secrecy or shame, on the contrary, with +good-natured naivete she told her intimate friends (and these were all +Petersburg) that both the prince and the magnate had proposed to her +and that she loved both and was afraid of grieving either. + +A rumor immediately spread in Petersburg, not that Helene wanted +to be divorced from her husband (had such a report spread many would +have opposed so illegal an intention) but simply that the +unfortunate and interesting Helene was in doubt which of the two men +she should marry. The question was no longer whether this was +possible, but only which was the better match and how the matter would +be regarded at court. There were, it is true, some rigid individuals +unable to rise to the height of such a question, who saw in the +project a desecration of the sacrament of marriage, but there were not +many such and they remained silent, while the majority were interested +in Helene's good fortune and in the question which match would be +the more advantageous. Whether it was right or wrong to remarry +while one had a husband living they did not discuss, for that question +had evidently been settled by people "wiser than you or me," as they +said, and to doubt the correctness of that decision would be to risk +exposing one's stupidity and incapacity to live in society. + +Only Marya Dmitrievna Akhrosimova, had come to Petersburg that +summer to see one of her sons, allowed herself plainly to express an +opinion contrary to the general one. Meeting Helene at a ball she +stopped her in the middle of the room and, amid general silence, +said in her gruff voice: "So wives of living men have started marrying +again! Perhaps you think you have invented a novelty? You have been +forestalled, my dear! It was thought of long ago. It is done in all +the brothels," and with these words Marya Dmitrievna, turning up her +wide sleeves with her usual threatening gesture and glancing sternly +round, moved across the room. + +Though people were afraid of Marya Dmitrievna she was regarded in +Petersburg as a buffoon, and so of what she had said they only +noticed, and repeated in a whisper, the one coarse word she had +used, supposing the whole sting of her remark to lie in that word. + +Prince Vasili, who of late very often forgot what he had said and +repeated one and the same thing a hundred times, remarked to his +daughter whenever he chanced to see her: + +"Helene, I have a word to say to you," and he would lead her +aside, drawing her hand downward. "I have heard of certain projects +concerning... you know. Well my dear child, you know how your father's +heart rejoices to know that you... You have suffered so much.... +But, my dear child, consult only your own heart. That is all I have to +say," and concealing his unvarying emotion he would press his cheek +against his daughter's and move away. + +Bilibin, who had not lost his reputation of an exceedingly clever +man, and who was one of the disinterested friends so +brilliant a woman as Helene always has--men friends who can never +change into lovers--once gave her his view of the matter at a small +and intimate gathering. + +"Listen, Bilibin," said Helene (she always called friends of that +sort by their surnames), and she touched his coat sleeve with her +white, beringed fingers. "Tell me, as you would a sister, what I ought +to do. Which of the two?" + +Bilibin wrinkled up the skin over his eyebrows and pondered, with +a smile on his lips. + +"You are not taking me unawares, you know," said he. "As a true +friend, I have thought and thought again about your affair. You see, +if you marry the prince"--he meant the younger man--and he crooked one +finger, "you forever lose the chance of marrying the other, and you +will displease the court besides. (You know there is some kind of +connection.) But if you marry the old count you will make his last +days happy, and as widow of the Grand... the prince would no longer be +making a mesalliance by marrying you," and Bilibin smoothed out his +forehead. + +"That's a true friend!" said Helene beaming, and again touching +Bilibin's sleeve. "But I love them, you know, and don't want to +distress either of them. I would give my life for the happiness of +them both." + +Bilibin shrugged his shoulders, as much as to say that not even he +could help in that difficulty. + +"Une maitresse-femme!* That's what is called putting things +squarely. She would like to be married to all three at the same time," +thought he. + + +*A masterly woman. + + +"But tell me, how will your husband look at the matter?" Bilibin +asked, his reputation being so well established that he did not fear +to ask so naive a question. "Will he agree?" + +"Oh, he loves me so!" said Helene, who for some reason imagined that +Pierre too loved her. "He will do anything for me." + +Bilibin puckered his skin in preparation for something witty. + +"Even divorce you?" said he. + +Helene laughed. + +Among those who ventured to doubt the justifiability of the proposed +marriage was Helene's mother, Princess Kuragina. She was continually +tormented by jealousy of her daughter, and now that jealousy concerned +a subject near to her own heart, she could not reconcile herself to +the idea. She consulted a Russian priest as to the possibility of +divorce and remarriage during a husband's lifetime, and the priest +told her that it was impossible, and to her delight showed her a +text in the Gospel which (as it seemed to him) plainly remarriage +while the husband is alive. + +Armed with these arguments, which appeared to her unanswerable, +she drove to her daughter's early one morning so as to find her alone. + +Having listened to her mother's objections, Helene smiled blandly +and ironically. + +"But it says plainly: 'Whosoever shall marry her that is +divorced...'" said the old princess. + +"Ah, Maman, ne dites pas de betises. Vous ne comprenez rein. Dans ma +position j'ai des devoirs,"* said Helene changing from Russian, in +which language she always felt that her case did not sound quite +clear, into French which suited it better. + + +*"Oh, Mamma, don't talk nonsense! You don't understand anything. +In my position I have obligations. + + +"But, my dear...." + +"Oh, Mamma, how is it you don't understand that the Holy Father, who +has the right to grant dispensations..." + +Just then the lady companion who lived with Helene came in to +announce that His Highness was in the ballroom and wished to see her. + +"Non, dites-lui que je ne veux pas le voir, que je suis furieuse +contre lui, parce qu'il m' a manque parole."* + + +*"No, tell him I don't wish to see him, I am furious with him for +not keeping his word to me." + + +"Comtesse, a tout peche misericorde,"* said a fair-haired young +man with a long face and nose, as he entered the room. + + +*"Countess, there is mercy for every sin." + + +The old princess rose respectfully and curtsied. The young man who +had entered took no notice of her. The princess nodded to her daughter +and sidled out of the room. + +"Yes, she is right," thought the old princess, all her convictions +dissipated by the appearance of His Highness. "She is right, but how +is it that we in our irrecoverable youth did not know it? Yet it is so +simple," she thought as she got into her carriage. + + +By the beginning of August Helene's affairs were clearly defined and +she wrote a letter to her husband--who, as she imagined, loved her +very much--informing him of her intention to marry N.N. and of her +having embraced the one true faith, and asking him to carry out all +the formalities necessary for a divorce, which would be explained to +him by the bearer of the letter. + + +And so I pray God to have you, my friend, in His holy and powerful +keeping--Your friend Helene. + + +This letter was brought to Pierre's house when he was on the field +of Borodino. + + + + + +CHAPTER VIII + + +Toward the end of the battle of Borodino, Pierre, having run down +from Raevski's battery a second time, made his way through a gully +to Knyazkovo with a crowd of soldiers, reached the dressing station, +and seeing blood and hearing cries and groans hurried on, still +entangled in the crowds of soldiers. + +The one thing he now desired with his whole soul was to get away +quickly from the terrible sensations amid which he had lived that +day and return to ordinary conditions of life and sleep quietly in a +room in his own bed. He felt that only in the ordinary conditions of +life would he be able to understand himself and all he had seen and +felt. But such ordinary conditions of life were nowhere to be found. + +Though shells and bullets did not whistle over the road along +which he was going, still on all sides there was what there had been +on the field of battle. There were still the same suffering, +exhausted, and sometimes strangely indifferent faces, the same +blood, the same soldiers' overcoats, the same sounds of firing +which, though distant now, still aroused terror, and besides this +there were the foul air and the dust. + +Having gone a couple of miles along the Mozhaysk road, Pierre sat +down by the roadside. + +Dusk had fallen, and the roar of guns died away. Pierre lay +leaning on his elbow for a long time, gazing at the shadows that moved +past him in the darkness. He was continually imagining that a cannon +ball was flying toward him with a terrific whizz, and then he +shuddered and sat up. He had no idea how long he had been there. In +the middle of the night three soldiers, having brought some +firewood, settled down near him and began lighting a fire. + +The soldiers, who threw sidelong glances at Pierre, got the fire +to burn and placed an iron pot on it into which they broke some +dried bread and put a little dripping. The pleasant odor of greasy +viands mingled with the smell of smoke. Pierre sat up and sighed. +The three soldiers were eating and talking among themselves, taking no +notice of him. + +"And who may you be?" one of them suddenly asked Pierre, evidently +meaning what Pierre himself had in mind, namely: "If you want to eat +we'll give you some food, only let us know whether you are an honest +man." + +"I, I..." said Pierre, feeling it necessary to minimize his social +position as much as possible so as to be nearer to the soldiers and +better understood by them. "By rights I am a militia officer, but my +men are not here. I came to the battle and have lost them." + +"There now!" said one of the soldiers. + +Another shook his head. + +"Would you like a little mash?" the first soldier asked, and +handed Pierre a wooden spoon after licking it clean. + +Pierre sat down by the fire and began eating the mash, as they +called the food in the cauldron, and he thought it more delicious than +any food he had ever tasted. As he sat bending greedily over it, +helping himself to large spoonfuls and chewing one after another, +his was lit up by the fire and the soldiers looked at him in silence. + +"Where have you to go to? Tell us!" said one of them. + +"To Mozhaysk." + +"You're a gentleman, aren't you?" + +"Yes." + +"And what's your name?" + +"Peter Kirilych." + +"Well then, Peter Kirilych, come along with us, we'll take you +there." + +In the total darkness the soldiers walked with Pierre to Mozhaysk. + +By the time they got near Mozhaysk and began ascending the steep +hill into the town, the cocks were already crowing. Pierre went on +with the soldiers, quite forgetting that his inn was at the bottom +of the hill and that he had already passed it. He would not soon +have remembered this, such was his state of forgetfulness, had he +not halfway up the hill stumbled upon his groom, who had been to +look for him in the town and was returning to the inn. The groom +recognized Pierre in the darkness by his white hat. + +"Your excellency!" he said. "Why, we were beginning to despair! +How is it you are on foot? And where are you going, please?" + +"Oh, yes!" said Pierre. + +The soldiers stopped. + +"So you've found your folk?" said one of them. "Well, good-by, Peter +Kirilych--isn't it?" + +"Good-by, Peter Kirilych!" Pierre heard the other voices repeat. + +"Good-by!" he said and turned with his groom toward the inn. + +"I ought to give them something!" he thought, and felt in his +pocket. "No, better not!" said another, inner voice. + +There was not a room to be had at the inn, they were all occupied. +Pierre went out into the yard and, covering himself up head and all, +lay down in his carriage. + + + + + +CHAPTER IX + + +Scarcely had Pierre laid his head on the pillow before he felt +himself falling asleep, but suddenly, almost with the distinctness +of reality, he heard the boom, boom, boom of firing, the thud of +projectiles, groans and cries, and smelled blood and powder, and a +feeling of horror and dread of death seized him. Filled with fright he +opened his eyes and lifted his head from under his cloak. All was +tranquil in the yard. Only someone's orderly passed through the +gateway, splashing through the mud, and talked to the innkeeper. Above +Pierre's head some pigeons, disturbed by the movement he had made in +sitting up, fluttered under the dark roof of the penthouse. The +whole courtyard was permeated by a strong peaceful smell of stable +yards, delightful to Pierre at that moment. He could see the clear +starry sky between the dark roofs of two penthouses. + +"Thank God, there is no more of that!" he thought, covering up his +head again. "Oh, what a terrible thing is fear, and how shamefully I +yielded to it! But they... they were steady and calm all the time, +to the end..." thought he. + +They, in Pierre's mind, were the soldiers, those who had been at the +battery, those who had given him food, and those who had prayed before +the icon. They, those strange men he had not previously known, stood +out clearly and sharply from everyone else. + +"To be a soldier, just a soldier!" thought Pierre as he fell asleep, +"to enter communal life completely, to be imbued by what makes them +what they are. But how cast off all the superfluous, devilish burden +of my outer man? There was a time when I could have done it. I could +have run away from my father, as I wanted to. Or I might have been +sent to serve as a soldier after the duel with Dolokhov." And the +memory of the dinner at the English Club when he had challenged +Dolokhov flashed through Pierre's mind, and then he remembered his +benefactor at Torzhok. And now a picture of a solemn meeting of the +lodge presented itself to his mind. It was taking place at the English +Club and someone near and dear to him sat at the end of the table. +"Yes, that is he! It is my benefactor. But he died!" thought Pierre. +"Yes, he died, and I did not know he was alive. How sorry I am that he +died, and how glad I am that he is alive again!" On one side of the +table sat Anatole, Dolokhov, Nesvitski, Denisov, and others like +them (in his dream the category to which these men belonged was as +clearly defined in his mind as the category of those he termed +they), and he heard those people, Anatole and Dolokhov, shouting and +singing loudly; yet through their shouting the voice of his benefactor +was heard speaking all the time and the sound of his words was as +weighty and uninterrupted as the booming on the battlefield, but +pleasant and comforting. Pierre did not understand what his benefactor +was saying, but he knew (the categories of thoughts were also quite +distinct in his dream) that he was talking of goodness and the +possibility of being what they were. And they with their simple, kind, +firm faces surrounded his benefactor on all sides. But though they +were kindly they did not look at Pierre and did not know him. +Wishing to speak and to attract their attention, he got up, but at +that moment his legs grew cold and bare. + +He felt ashamed, and with one arm covered his legs from which his +cloak had in fact slipped. For a moment as he was rearranging his +cloak Pierre opened his eyes and saw the same penthouse roofs, +posts, and yard, but now they were all bluish, lit up, and +glittering with frost or dew. + +"It is dawn," thought Pierre. "But that's not what I want. I want to +hear and understand my benefactor's words." Again he covered himself +up with his cloak, but now neither the lodge nor his benefactor was +there. There were only thoughts clearly expressed in words, thoughts +that someone was uttering or that he himself was formulating. + +Afterwards when he recalled those thoughts Pierre was convinced that +someone outside himself had spoken them, though the impressions of +that day had evoked them. He had never, it seemed to him, been able to +think and express his thoughts like that when awake. + +"To endure war is the most difficult subordination of man's +freedom to the law of God," the voice had said. "Simplicity is +submission to the will of God; you cannot escape from Him. And they +are simple. They do not talk, but act. The spoken word is silver but +the unspoken is golden. Man can be master of nothing while he fears +death, but he who does not fear it possesses all. If there were no +suffering, man would not know his limitations, would not know himself. +The hardest thing [Pierre went on thinking, or hearing, in his +dream] is to be able in your soul to unite the meaning of all. To +unite all?" he asked himself. "No, not to unite. Thoughts cannot be +united, but to harness all these thoughts together is what we need! +Yes, one must harness them, must harness them!" he repeated to himself +with inward rapture, feeling that these words and they alone expressed +what he wanted to say and solved the question that tormented him. + +"Yes, one must harness, it is time to harness." + +"Time to harness, time to harness, your excellency! Your +excellency!" some voice was repeating. "We must harness, it is time to +harness...." + +It was the voice of the groom, trying to wake him. The sun shone +straight into Pierre's face. He glanced at the dirty innyard in the +middle of which soldiers were watering their lean horses at the pump +while carts were passing out of the gate. Pierre turned away with +repugnance, and closing his eyes quickly fell back on the carriage +seat. "No, I don't want that, I don't want to see and understand that. +I want to understand what was revealing itself to me in my dream. +One second more and I should have understood it all! But what am I +to do? Harness, but how can I harness everything?" and Pierre felt +with horror that the meaning of all he had seen and thought in the +dream had been destroyed. + +The groom, the coachman, and the innkeeper told Pierre that an +officer had come with news that the French were already near +Mozhaysk and that our men were leaving it. + +Pierre got up and, having told them to harness and overtake him, +went on foot through the town. + +The troops were moving on, leaving about ten thousand wounded behind +them. There were wounded in the yards, at the windows of the houses, +and the streets were crowded with them. In the streets, around carts +that were to take some of the wounded away, shouts, curses, and +blows could be heard. Pierre offered the use of his carriage, which +had overtaken him, to a wounded general he knew, and drove with him +to Moscow. On the way Pierre was told of the death of his +brother-in-law Anatole and of that of Prince Andrew. + + + + + +CHAPTER X + + +On the thirteenth of August Pierre reached Moscow. Close to the +gates of the city he was met by Count Rostopchin's adjutant. + +"We have been looking for you everywhere," said the adjutant. "The +count wants to see you particularly. He asks you to come to him at +once on a very important matter." + +Without going home, Pierre took a cab and drove to see the Moscow +commander in chief. + +Count Rostopchin had only that morning returned to town from his +summer villa at Sokolniki. The anteroom and reception room of his +house were full of officials who had been summoned or had come for +orders. Vasilchikov and Platov had already seen the count and +explained to him that it was impossible to defend Moscow and that it +would have to be surrendered. Though this news was being concealed +from the inhabitants, the officials--the heads of the various +government departments--knew that Moscow would soon be in the +enemy's hands, just as Count Rostopchin himself knew it, and to escape +personal responsibility they had all come to the governor to ask how +they were to deal with their various departments. + +As Pierre was entering the reception room a courier from the army +came out of Rostopchin's private room. + +In answer to questions with which he was greeted, the courier made a +despairing gesture with his hand and passed through the room. + +While waiting in the reception room Pierre with weary eyes watched +the various officials, old and young, military and civilian, who +were there. They all seemed dissatisfied and uneasy. Pierre went up to +a group of men, one of whom he knew. After greeting Pierre they +continued their conversation. + +"If they're sent out and brought back again later on it will do no +harm, but as things are now one can't answer for anything." + +"But you see what he writes..." said another, pointing to a +printed sheet he held in his hand. + +"That's another matter. That's necessary for the people," said the +first. + +"What is it?" asked Pierre. + +"Oh, it's a fresh broadsheet." + +Pierre took it and began reading. + + +His Serene Highness has passed through Mozhaysk in order to join +up with the troops moving toward him and has taken up a strong +position where the enemy will not soon attack him. Forty eight guns +with ammunition have been sent him from here, and his Serene +Highness says he will defend Moscow to the last drop of blood and is +even ready to fight in the streets. Do not be upset, brothers, that +the law courts are closed; things have to be put in order, and we will +deal with villains in our own way! When the time comes I shall want +both town and peasant lads and will raise the cry a day or two +beforehand, but they are not wanted yet so I hold my peace. An ax will +be useful, a hunting spear not bad, but a three-pronged fork will be +best of all: a Frenchman is no heavier than a sheaf of rye. Tomorrow +after dinner I shall take the Iberian icon of the Mother of God to the +wounded in the Catherine Hospital where we will have some water +blessed. That will help them to get well quicker. I, too, am well now: +one of my eyes was sore but now I am on the lookout with both. + + +"But military men have told me that it is impossible to fight in the +town," said Pierre, "and that the position..." + +"Well, of course! That's what we were saying," replied the first +speaker. + +"And what does he mean by 'One of my eyes was sore but now I am on +the lookout with both'?" asked Pierre. + +"The count had a sty," replied the adjutant smiling, "and was very +much upset when I told him people had come to ask what was the +matter with him. By the by, Count," he added suddenly, addressing +Pierre with a smile, "we heard that you have family troubles and +that the countess, your wife..." + +"I have heard nothing," Pierre replied unconcernedly. "But what have +you heard?" + +"Oh, well, you know people often invent things. I only say what I +heard." + +"But what did you hear?" + +"Well, they say," continued the adjutant with the same smile, +"that the countess, your wife, is preparing to go abroad. I expect +it's nonsense...." + +"Possibly," remarked Pierre, looking about him absent-mindedly. "And +who is that?" he asked, indicating a short old man in a clean blue +peasant overcoat, with a big snow-white beard and eyebrows and a ruddy +face. + +"He? That's a tradesman, that is to say, he's the restaurant keeper, +Vereshchagin. Perhaps you have heard of that affair with the +proclamation." + +"Oh, so that is Vereshchagin!" said Pierre, looking at the firm, +calm face of the old man and seeking any indication of his being a +traitor. + +"That's not he himself, that's the father of the fellow who wrote +the proclamation," said the adjutant. "The young man is in prison +and I expect it will go hard with him." + +An old gentleman wearing a star and another official, a German +wearing a cross round his neck, approached the speaker. + +"It's a complicated story, you know," said the adjutant. "That +proclamation appeared about two months ago. The count was informed +of it. He gave orders to investigate the matter. Gabriel Ivanovich +here made the inquiries. The proclamation had passed through exactly +sixty-three hands. He asked one, 'From whom did you get it?' 'From +so-and-so.' He went to the next one. 'From whom did you get it?' and +so on till he reached Vereshchagin, a half educated tradesman, you +know, 'a pet of a trader,'" said the adjutant smiling. "They asked +him, 'Who gave it you?' And the point is that we knew whom he had it +from. He could only have had it from the Postmaster. But evidently +they had come to some understanding. He replied: 'From no one; I +made it up myself.' They threatened and questioned him, but he stuck +to that: 'I made it up myself.' And so it was reported to the count, +who sent for the man. 'From whom did you get the proclamation?' 'I +wrote it myself.' Well, you know the count," said the adjutant +cheerfully, with a smile of pride, "he flared up dreadfully--and +just think of the fellow's audacity, lying, and obstinacy!" + + "And the count wanted him to say it was from Klyucharev? I +understand!" said Pierre. + +"Not at all," rejoined the adjutant in dismay. "Klyucharev had his +own sins to answer for without that and that is why he has been +banished. But the point is that the count was much annoyed. 'How could +you have written it yourself?' said he, and he took up the Hamburg +Gazette that was lying on the table. 'Here it is! You did not write it +yourself but translated it, and translated it abominably, because +you don't even know French, you fool.' And what do you think? 'No,' +said he, 'I have not read any papers, I made it up myself.' 'If that's +so, you're a traitor and I'll have you tried, and you'll be hanged! +Say from whom you had it.' 'I have seen no papers, I made it up +myself.' And that was the end of it. The count had the father fetched, +but the fellow stuck to it. He was sent for trial and condemned to +hard labor, I believe. Now the father has come to intercede for him. +But he's a good-for-nothing lad! You know that sort of tradesman's +son, a dandy and lady-killer. He attended some lectures somewhere +and imagines that the devil is no match for him. That's the sort of +fellow he is. His father keeps a cookshop here by the Stone Bridge, +and you know there was a large icon of God Almighty painted with a +scepter in one hand and an orb in the other. Well, he took that icon +home with him for a few days and what did he do? He found some +scoundrel of a painter..." + + + + + +CHAPTER XI + + +In the middle of this fresh tale Pierre was summoned to the +commander in chief. + +When he entered the private room Count Rostopchin, puckering his +face, was rubbing his forehead and eyes with his hand. A short man was +saying something, but when Pierre entered he stopped speaking and went +out. + +"Ah, how do you do, great warrior?" said Rostopchin as soon as the +short man had left the room. "We have heard of your prowess. But +that's not the point. Between ourselves, mon cher, do you belong to +the Masons?" he went on severely, as though there were something wrong +about it which he nevertheless intended to pardon. Pierre remained +silent. "I am well informed, my friend, but I am aware that there +are Masons and I hope that you are not one of those who +on pretense of saving mankind wish to ruin Russia." + +"Yes, I am a Mason," Pierre replied. + +"There, you see, mon cher! I expect you know that Messrs. +Speranski and Magnitski have been deported to their proper place. +Mr. Klyucharev has been treated in the same way, and so have others +who on the plea of building up the temple of Solomon have tried to +destroy the temple of their fatherland. You can understand that +there are reasons for this and that I could not have exiled the +Postmaster had he not been a harmful person. It has now come to my +knowledge that you lent him your carriage for his removal from town, +and that you have even accepted papers from him for safe custody. I +like you and don't wish you any harm and--as you are only half my age- +I advise you, as a father would, to cease all communication with men +of that stamp and to leave here as soon as possible." + +"But what did Klyucharev do wrong, Count?" asked Pierre. + +"That is for me to know, but not for you to ask," shouted +Rostopchin. + +"If he is accused of circulating Napoleon's proclamation it is not +proved that he did so," said Pierre without looking at Rostopchin, +"and Vereshchagin..." + +"There we are!" Rostopchin shouted at Pierre louder than before, +frowning suddenly. "Vereshchagin is a renegade and a traitor who +will be punished as he deserves," said he with the vindictive heat +with which people speak when recalling an insult. "But I did not +summon you to discuss my actions, but to give you advice--or an +order if you prefer it. I beg you to leave the town and break off +all communication with such men as Klyucharev. And I will knock the +nonsense out of anybody"--but probably realizing that he was +shouting at Bezukhov who so far was not guilty of anything, he +added, taking Pierre's hand in a friendly manner, "We are on the eve +of a public disaster and I haven't time to be polite to everybody +who has business with me. My head is sometimes in a whirl. Well, mon +cher, what are you doing personally?" + +"Why, nothing," answered Pierre without raising his eyes or changing +the thoughtful expression of his face. + +The count frowned. + +"A word of friendly advice, mon cher. Be off as soon as you can, +that's all I have to tell you. Happy he who has ears to hear. Good-by, +my dear fellow. Oh, by the by!" he shouted through the doorway after +Pierre, "is it true that the countess has fallen into the clutches +of the holy fathers of the Society of Jesus?" + +Pierre did not answer and left Rostopchin's room more sullen and +angry than he had ever before shown himself. + +When he reached home it was already getting dark. Some eight +people had come to see him that evening: the secretary of a committee, +the colonel of his battalion, his steward, his major-domo, and various +petitioners. They all had business with Pierre and wanted decisions +from him. Pierre did not understand and was not interested in any of +these questions and only answered them in order to get rid of these +people. When left alone at last he opened and read his wife's letter. + +"They, the soldiers at the battery, Prince Andrew killed... that old +man... Simplicity is submission to God. Suffering is necessary... +the meaning of all... one must harness... my wife is getting +married... One must forget and understand..." And going to his bed +he threw himself on it without undressing and immediately fell asleep. + +When he awoke next morning the major-domo came to inform him that +a special messenger, a police officer, had come from Count +Rostopchin to know whether Count Bezukhov had left or was leaving +the town. + +A dozen persons who had business with Pierre were awaiting him in +the drawing room. Pierre dressed hurriedly and, instead of going to +see them, went to the back porch and out through the gate. + +From that time till the end of the destruction of Moscow no one of +Bezukhov's household, despite all the search they made, saw Pierre +again or knew where he was. + + + + + +CHAPTER XII + + +The Rostovs remained in Moscow till the first of September, that is, +till the eve of the enemy's entry into the city. + +After Petya had joined Obolenski's regiment of Cossacks and left for +Belaya Tserkov where that regiment was forming, the countess was +seized with terror. The thought that both her sons were at the war, +had both gone from under her wing, that today or tomorrow either or +both of them might be killed like the three sons of one of her +acquaintances, struck her that summer for the first time with cruel +clearness. She tried to get Nicholas back and wished to go herself +to join Petya, or to get him an appointment somewhere in Petersburg, +but neither of these proved possible. Petya could not return unless +his regiment did so or unless he was transferred to another regiment +on active service. Nicholas was somewhere with the army and had not +sent a word since his last letter, in which he had given a detailed +account of his meeting with Princess Mary. The countess did not +sleep at night, or when she did fall asleep dreamed that she saw her +sons lying dead. After many consultations and conversations, the count +at last devised means to tranquillize her. He got Petya transferred +from Obolenski's regiment to Bezukhov's, which was in training near +Moscow. Though Petya would remain in the service, this transfer +would give the countess the consolation of seeing at least one of +her sons under her wing, and she hoped to arrange matters for her +Petya so as not to let him go again, but always get him appointed to +places where he could not possibly take part in a battle. As long as +Nicholas alone was in danger the countess imagined that she loved +her first-born more than all her other children and even reproached +herself for it; but when her youngest: the scapegrace who had been bad +at lessons, was always breaking things in the house and making himself +a nuisance to everybody, that snub-nosed Petya with his merry black +eyes and fresh rosy cheeks where soft down was just beginning to show- +when he was thrown amid those big, dreadful, cruel men who were +fighting somewhere about something and apparently finding pleasure +in it--then his mother thought she loved him more, much more, than all +her other children. The nearer the time came for Petya to return, +the more uneasy grew the countess. She began to think she would +never live to see such happiness. The presence of Sonya, of her +beloved Natasha, or even of her husband irritated her. "What do I want +with them? I want no one but Petya," she thought. + +At the end of August the Rostovs received another letter from +Nicholas. He wrote from the province of Voronezh where he had been +sent to procure remounts, but that letter did not set the countess +at ease. Knowing that one son was out of danger she became the more +anxious about Petya. + +Though by the twentieth of August nearly all the Rostovs' +acquaintances had left Moscow, and though everybody tried to +persuade the countess to get away as quickly as possible, she would +not bear of leaving before her treasure, her adored Petya, returned. +On the twenty-eighth of August he arrived. The passionate tenderness +with which his mother received him did not please the sixteen-year-old +officer. Though she concealed from him her intention of keeping him +under her wing, Petya guessed her designs, and instinctively fearing +that he might give way to emotion when with her--might "become +womanish" as he termed it to himself--he treated her coldly, avoided +her, and during his stay in Moscow attached himself exclusively to +Natasha for whom he had always had a particularly brotherly +tenderness, almost lover-like. + +Owing to the count's customary carelessness nothing was ready for +their departure by the twenty-eighth of August and the carts that were +to come from their Ryazan and Moscow estates to remove their household +belongings did not arrive till the thirtieth. + +From the twenty-eighth till the thirty-first all Moscow was in a +bustle and commotion. Every day thousands of men wounded at Borodino +were brought in by the Dorogomilov gate and taken to various parts +of Moscow, and thousands of carts conveyed the inhabitants and their +possessions out by the other gates. In spite of Rostopchin's +broadsheets, or because of them or independently of them, the +strangest and most contradictory rumors were current in the town. Some +said that no one was to be allowed to leave the city, others on the +contrary said that all the icons had been taken out of the churches +and everybody was to be ordered to leave. Some said there had been +another battle after Borodino at which the French had been routed, +while others on the contrary reported that the Russian army bad been +destroyed. Some talked about the Moscow militia which, preceded by the +clergy, would go to the Three Hills; others whispered that Augustin +had been forbidden to leave, that traitors had been seized, that the +peasants were rioting and robbing people on their way from Moscow, and +so on. But all this was only talk; in reality (though the Council of +Fili, at which it was decided to abandon Moscow, had not yet been +held) both those who went away and those who remained behind felt, +though they did not show it, that Moscow would certainly be abandoned, +and that they ought to get away as quickly as possible and save +their belongings. It was felt that everything would suddenly break +up and change, but up to the first of September nothing had done so. +As a criminal who is being led to execution knows that he must die +immediately, but yet looks about him and straightens the cap that is +awry on his head, so Moscow involuntarily continued its wonted life, +though it knew that the time of its destruction was near when the +conditions of life to which its people were accustomed to submit would +be completely upset. + +During the three days preceding the occupation of Moscow the whole +Rostov family was absorbed in various activities. The head of the +family, Count Ilya Rostov, continually drove about the city collecting +the current rumors from all sides and gave superficial and hasty +orders at home about the preparations for their departure. + +The countess watched the things being packed, was dissatisfied +with everything, was constantly in pursuit of Petya who was always +running away from her, and was jealous of Natasha with whom he spent +all his time. Sonya alone directed the practical side of matters by +getting things packed. But of late Sonya had been particularly sad and +silent. Nicholas' letter in which he mentioned Princess Mary had +elicited, in her presence, joyous comments from the countess, who +saw an intervention of Providence in this meeting of the princess +and Nicholas. + +"I was never pleased at Bolkonski's engagement to Natasha," said the +countess, "but I always wanted Nicholas to marry the princess, and had +a presentiment that it would happen. What a good thing it would be!" + +Sonya felt that this was true: that the only possibility of +retrieving the Rostovs' affairs was by Nicholas marrying a rich woman, +and that the princess was a good match. It was very bitter for her. +But despite her grief, or perhaps just because of it, she took on +herself all the difficult work of directing the storing and packing of +their things and was busy for whole days. The count and countess +turned to her when they had any orders to give. Petya and Natasha on +the contrary, far from helping their parents, were generally a +nuisance and a hindrance to everyone. Almost all day long the house +resounded with their running feet, their cries, and their +spontaneous laughter. They laughed and were gay not because there +was any reason to laugh, but because gaiety and mirth were in their +hearts and so everything that happened was a cause for gaiety and +laughter to them. Petya was in high spirits because having left home a +boy he had returned (as everybody told him) a fine young man, +because he was at home, because he had left Belaya Tserkov where there +was no hope of soon taking part in a battle and had come to Moscow +where there was to be fighting in a few days, and chiefly because +Natasha, whose lead he always followed, was in high spirits. Natasha +was gay because she had been sad too long and now nothing reminded her +of the cause of her sadness, and because she was feeling well. She was +also happy because she had someone to adore her: the adoration of +others was a lubricant the wheels of her machine needed to make them +run freely--and Petya adored her. Above all, they were gay because +there was a war near Moscow, there would be fighting at the town +gates, arms were being given out, everybody was escaping--going away +somewhere, and in general something extraordinary was happening, and +that is always exciting, especially to the young. + + + + + +CHAPTER XIII + + +On Saturday, the thirty-first of August, everything in the +Rostovs' house seemed topsy-turvy. All the doors were open, all the +furniture was being carried out or moved about, and the mirrors and +pictures had been taken down. There were trunks in the rooms, and hay, +wrapping paper, and ropes were scattered about. The peasants and house +serfs carrying out the things were treading heavily on the parquet +floors. The yard was crowded with peasant carts, some loaded high +and already corded up, others still empty. + +The voices and footsteps of the many servants and of the peasants +who had come with the carts resounded as they shouted to one another +in the yard and in the house. The count bad been out since morning. +The countess had a headache brought on by all the noise and turmoil +and was lying down in the new sitting room with a vinegar compress +on her head. Petya was not at home, he had gone to visit a friend with +whom he meant to obtain a transfer from the militia to the active +army. Sonya was in the ballroom looking after the packing of the glass +and china. Natasha was sitting on the floor of her dismantled room +with dresses, ribbons, and scarves strewn all about her, gazing +fixedly at the floor and holding in her hands the old ball dress +(already out of fashion) which she had worn at her first Petersburg +ball. + +Natasha was ashamed of doing nothing when everyone else was so busy, +and several times that morning had tried to set to work, but her heart +was not in it, and she could not and did not know how to do anything +except with all her heart and all her might. For a while she had stood +beside Sonya while the china was being packed and tried to help, but +soon gave it up and went to her room to pack her own things. At +first she found it amusing to give away dresses and ribbons to the +maids, but when that was done and what was left had still to be +packed, she found it dull. + +"Dunyasha, you pack! You will, won't you, dear?" And when Dunyasha +willingly promised to do it all for her, Natasha sat down on the +floor, took her old ball dress, and fell into a reverie quite +unrelated to what ought to have occupied her thoughts now. She was +roused from her reverie by the talk of the maids in the next room +(which was theirs) and by the sound of their hurried footsteps going +to the back porch. Natasha got up and looked out of the window. An +enormously long row of carts full of wounded men had stopped in the +street. + +The housekeeper, the old nurse, the cooks, coachmen, maids, footmen, +postilions, and scullions stood at the gate, staring at the wounded. + +Natasha, throwing a clean pocket handkerchief over her hair and +holding an end of it in each hand, went out into the street. + +The former housekeeper, old Mavra Kuzminichna, had stepped out of +the crowd by the gate, gone up to a cart with a hood constructed of +bast mats, and was speaking to a pale young officer who lay inside. +Natasha moved a few steps forward and stopped shyly, still holding her +handkerchief, and listened to what the housekeeper was saying. + +"Then you have nobody in Moscow?" she was saying. "You would be more +comfortable somewhere in a house... in ours, for instance... the +family are leaving." + +"I don't know if it would be allowed," replied the officer in a weak +voice. "Here is our commanding officer... ask him," and he pointed +to a stout major who was walking back along the street past the row of +carts. + +Natasha glanced with frightened eyes at the face of the wounded +officer and at once went to meet the major. + +"May the wounded men stay in our house?" she asked. + +The major raised his hand to his cap with a smile. + +"Which one do you want, Ma'am'selle?" said he, screwing up his +eyes and smiling. + +Natasha quietly repeated her question, and her face and whole manner +were so serious, though she was still holding the ends of her +handkerchief, that the major ceased smiling and after some reflection- +as if considering in how far the thing was possible--replied in the +affirmative. + +"Oh yes, why not? They may," he said. + +With a slight inclination of her head, Natasha stepped back +quickly to Mavra Kuzminichna, who stood talking compassionately to the +officer. + +"They may. He says they may!" whispered Natasha. + +The cart in which the officer lay was turned into the Rostovs' yard, +and dozens of carts with wounded men began at the invitation of the +townsfolk to turn into the yards and to draw up at the entrances of +the houses in Povarskaya Street. Natasha was evidently pleased to be +dealing with new people outside the ordinary routine of her life. +She and Mavra Kuzminichna tried to get as many of the wounded as +possible into their yard. + +"Your Papa must be told, though," said Mavra Kuzminichna. + +"Never mind, never mind, what does it matter? For one day we can +move into the drawing room. They can have all our half of the house." + +"There now, young lady, you do take things into your head! Even if +we put them into the wing, the men's room, or the nurse's room, we +must ask permission." + +"Well, I'll ask." + +Natasha ran into the house and went on tiptoe through the +half-open door into the sitting room, where there was a smell of +vinegar and Hoffman's drops. + +"Are you asleep, Mamma?" + +"Oh, what sleep-?" said the countess, waking up just as she was +dropping into a doze. + +"Mamma darling!" said Natasha, kneeling by her mother and bringing +her face close to her mother's, "I am sorry, forgive me, I'll never do +it again; I woke you up! Mavra Kuzminichna has sent me: they have +brought some wounded here--officers. Will you let them come? They have +nowhere to go. I knew you'd let them come!" she said quickly all in +one breath. + +"What officers? Whom have they brought? I don't understand +anything about it," said the countess. + +Natasha laughed, and the countess too smiled slightly. + +"I knew you'd give permission... so I'll tell them," and, having +kissed her mother, Natasha got up and went to the door. + +In the hall she met her father, who had returned with bad news. + +"We've stayed too long!" said the count with involuntary vexation. +"The Club is closed and the police are leaving." + +"Papa, is it all right--I've invited some of the wounded into the +house?" said Natasha. + +"Of course it is," he answered absently. "That's not the point. I +beg you not to indulge in trifles now, but to help to pack, and +tomorrow we must go, go, go!...." + +And the count gave a similar order to the major-domo and the +servants. + +At dinner Petya having returned home told them the news he had +heard. He said the people had been getting arms in the Kremlin, and +that though Rostopchin's broadsheet had said that he would sound a +call two or three days in advance, the order had certainly already +been given for everyone to go armed to the Three Hills tomorrow, and +that there would be a big battle there. + +The countess looked with timid horror at her son's eager, excited +face as he said this. She realized that if she said a word about his +not going to the battle (she knew he enjoyed the thought of the +impending engagement) he would say something about men, honor, and the +fatherland--something senseless, masculine, and obstinate which +there would be no contradicting, and her plans would be spoiled; and +so, hoping to arrange to leave before then and take Petya with her +as their protector and defender, she did not answer him, but after +dinner called the count aside and implored him with tears to take +her away quickly, that very night if possible. With a woman's +involuntary loving cunning she, who till then had not shown any alarm, +said that she would die of fright if they did not leave that very +night. Without any pretense she was now afraid of everything. + + + + + +CHAPTER XIV + + +Madame Schoss, who had been out to visit her daughter, increased the +countess' fears still more by telling what she had seen at a spirit +dealer's in Myasnitski Street. When returning by that street she had +been unable to pass because of a drunken crowd rioting in front of the +shop. She had taken a cab and driven home by a side street and the +cabman had told her that the people were breaking open the barrels +at the drink store, having received orders to do so. + +After dinner the whole Rostov household set to work with +enthusiastic haste packing their belongings and preparing for their +departure. The old count, suddenly setting to work, kept passing +from the yard to the house and back again, shouting confused +instructions to the hurrying people, and flurrying them still more. +Petya directed things in the yard. Sonya, owing to the count's +contradictory orders, lost her head and did not know what to do. The +servants ran noisily about the house and yard, shouting and disputing. +Natasha, with the ardor characteristic of all she did suddenly set +to work too. At first her intervention in the business of packing +was received skeptically. Everybody expected some prank from her and +did not wish to obey her; but she resolutely and passionately demanded +obedience, grew angry and nearly cried because they did not heed +her, and at last succeeded in making them believe her. Her first +exploit, which cost her immense effort and established her +authority, was the packing of the carpets. The count had valuable +Gobelin tapestries and Persian carpets in the house. When Natasha +set to work two cases were standing open in the ballroom, one almost +full up with crockery, the other with carpets. There was also much +china standing on the tables, and still more was being brought in from +the storeroom. A third case was needed and servants had gone to +fetch it. + +"Sonya, wait a bit--we'll pack everything into these," said Natasha. + +"You can't, Miss, we have tried to," said the butler's assistant. + +"No, wait a minute, please." + +And Natasha began rapidly taking out of the case dishes and plates +wrapped in paper. + +"The dishes must go in here among the carpets," said she. + +"Why, it's a mercy if we can get the carpets alone into three +cases," said the butler's assistant. + +"Oh, wait, please!" And Natasha began rapidly and deftly sorting out +the things. "These aren't needed," said she, putting aside some plates +of Kiev ware. "These--yes, these must go among the carpets," she said, +referring to the Saxony china dishes. + +"Don't, Natasha! Leave it alone! We'll get it all packed," urged +Sonya reproachfully. + +"What a young lady she is!" remarked the major-domo. + +But Natasha would not give in. She turned everything out and began +quickly repacking, deciding that the inferior Russian carpets and +unnecessary crockery should not be taken at all. When everything had +been taken out of the cases, they recommenced packing, and it turned +out that when the cheaper things not worth taking had nearly all +been rejected, the valuable ones really did all go into the two cases. +Only the lid of the case containing the carpets would not shut down. A +few more things might have been taken out, but Natasha insisted on +having her own way. She packed, repacked, pressed, made the butler's +assistant and Petya--whom she had drawn into the business of +packing--press on the lid, and made desperate efforts herself. + +"That's enough, Natasha," said Sonya. "I see you were right, but +just take out the top one." + +"I won't!" cried Natasha, with one hand bolding back the hair that +hung over her perspiring face, while with the other she pressed down +the carpets. "Now press, Petya! Press, Vasilich, press hard!" she +cried. + +The carpets yielded and the lid closed; Natasha, clapping her hands, +screamed with delight and tears fell from her eyes. But this only +lasted a moment. She at once set to work afresh and they now trusted +her completely. The count was not angry even when they told him that +Natasha had countermanded an order of his, and the servants now came +to her to ask whether a cart was sufficiently loaded, and whether it +might be corded up. Thanks to Natasha's directions the work now went +on expeditiously, unnecessary things were left, and the most +valuable packed as compactly as possible. + +But hard as they all worked till quite late that night, they could +not get everything packed. The countess had fallen asleep and the +count, having put off their departure till next morning, went to bed. + +Sonya and Natasha slept in the sitting room without undressing. + +That night another wounded man was driven down the Povarskaya, and +Mavra Kuzminichna, who was standing at the gate, had him brought +into the Rostovs' yard. Mavra Kuzminichna concluded that he was a very +important man. He was being conveyed in a caleche with a raised +hood, and was quite covered by an apron. On the box beside the +driver sat a venerable old attendant. A doctor and two soldiers +followed the carriage in a cart. + +"Please come in here. The masters are going away and the whole house +will be empty," said the old woman to the old attendant. + +"Well, perhaps," said he with a sigh. "We don't expect to get him +home alive! We have a house of our own in Moscow, but it's a long +way from here, and there's nobody living in it." + +"Do us the honor to come in, there's plenty of everything in the +master's house. Come in," said Mavra Kuzminichna. "Is he very ill?" +she asked. + +The attendant made a hopeless gesture. + +"We don't expect to get him home! We must ask the doctor." + +And the old servant got down from the box and went up to the cart. + +"All right!" said the doctor. + +The old servant returned to the caleche, looked into it, shook his +head disconsolately, told the driver to turn into the yard, and +stopped beside Mavra Kuzminichna. + +"O, Lord Jesus Christ!" she murmured. + +She invited them to take the wounded man into the house. + +"The masters won't object..." she said. + +But they had to avoid carrying the man upstairs, and so they took +him into the wing and put him in the room that had been Madame +Schoss'. + +This wounded man was Prince Andrew Bolkonski. + + + + + +CHAPTER XV + + +Moscow's last day had come. It was a clear bright autumn day, a +Sunday. The church bells everywhere were ringing for service, just +as usual on Sundays. Nobody seemed yet to realize what awaited the +city. + +Only two things indicated the social condition of Moscow--the +rabble, that is the poor people, and the price of commodities. An +enormous crowd of factory hands, house serfs, and peasants, with +whom some officials, seminarists, and gentry were mingled, had gone +early that morning to the Three Hills. Having waited there for +Rostopchin who did not turn up, they became convinced that Moscow +would be surrendered, and then dispersed all about the town to the +public houses and cookshops. Prices too that day indicated the state +of affairs. The price of weapons, of gold, of carts and horses, kept +rising, but the value of paper money and city articles kept falling, +so that by midday there were instances of carters removing valuable +goods, such as cloth, and receiving in payment a half of what they +carted, while peasant horses were fetching five hundred rubles each, +and furniture, mirrors, and bronzes were being given away for nothing. + +In the Rostovs' staid old-fashioned house the dissolution of +former conditions of life was but little noticeable. As to the serfs +the only indication was that three out of their huge retinue +disappeared during the night, but nothing was stolen; and as to the +value of their possessions, the thirty peasant carts that had come +in from their estates and which many people envied proved to be +extremely valuable and they were offered enormous sums of money for +them. Not only were huge sums offered for the horses and carts, but on +the previous evening and early in the morning of the first of +September, orderlies and servants sent by wounded officers came to the +Rostovs' and wounded men dragged themselves there from the Rostovs' +and from neighboring houses where they were accommodated, entreating +the servants to try to get them a lift out of Moscow. The major-domo +to whom these entreaties were addressed, though he was sorry for the +wounded, resolutely refused, saying that he dare not even mention +the matter to the count. Pity these wounded men as one might, it was +evident that if they were given one cart there would be no reason to +refuse another, or all the carts and one's own carriages as well. +Thirty carts could not save all the wounded and in the general +catastrophe one could not disregard oneself and one's own family. So +thought the major-domo on his master's behalf. + +On waking up that morning Count Ilya Rostov left his bedroom softly, +so as not to wake the countess who had fallen asleep only toward +morning, and came out to the porch in his lilac silk dressing gown. In +the yard stood the carts ready corded. The carriages were at the front +porch. The major-domo stood at the porch talking to an elderly orderly +and to a pale young officer with a bandaged arm. On seeing the count +the major-domo made a significant and stern gesture to them both to go +away. + +"Well, Vasilich, is everything ready?" asked the count, and stroking +his bald head he looked good-naturedly at the officer and the +orderly and nodded to them. (He liked to see new faces.) + +"We can harness at once, your excellency." + +"Well, that's right. As soon as the countess wakes we'll be off, God +willing! What is it, gentlemen?" he added, turning to the officer. +"Are you staying in my house?" + +The officer came nearer and suddenly his face flushed crimson. + +"Count, be so good as to allow me... for God's sake, to get into +some corner of one of your carts! I have nothing here with me.... I +shall be all right on a loaded cart..." + +Before the officer had finished speaking the orderly made the same +request on behalf of his master. + +"Oh, yes, yes, yes!" said the count hastily. "I shall be very +pleased, very pleased. Vasilich, you'll see to it. Just unload one +or two carts. Well, what of it... do what's necessary..." said the +count, muttering some indefinite order. + +But at the same moment an expression of warm gratitude on the +officer's face had already sealed the order. The count looked around +him. In the yard, at the gates, at the window of the wings, wounded +officers and their orderlies were to be seen. They were all looking at +the count and moving toward the porch. + +"Please step into the gallery, your excellency," said the +major-domo. "What are your orders about the pictures?" + +The count went into the house with him, repeating his order not to +refuse the wounded who asked for a lift. + +"Well, never mind, some of the things can be unloaded," he added +in a soft, confidential voice, as though afraid of being overheard. + +At nine o'clock the countess woke up, and Matrena Timofeevna, who +had been her lady's maid before her marriage and now performed a +sort of chief gendarme's duty for her, came to say that Madame +Schoss was much offended and the young ladies' summer dresses could +not be left behind. On inquiry, the countess learned that Madame +Schoss was offended because her trunk had been taken down from its +cart, and all the loads were being uncorded and the luggage taken +out of the carts to make room for wounded men whom the count in the +simplicity of his heart had ordered that they should take with them. +The countess sent for her husband. + +"What is this, my dear? I hear that the luggage is being unloaded." + +"You know, love, I wanted to tell you... Countess dear... an officer +came to me to ask for a few carts for the wounded. After all, ours are +things that can be bought but think what being left behind means to +them!... Really now, in our own yard--we asked them in ourselves and +there are officers among them.... You know, I think, my dear... let +them be taken... where's the hurry?" + +The count spoke timidly, as he always did when talking of money +matters. The countess was accustomed to this tone as a precursor of +news of something detrimental to the children's interests, such as the +building of a new gallery or conservatory, the inauguration of a +private theater or an orchestra. She was accustomed always to oppose +anything announced in that timid tone and considered it her duty to do +so. + +She assumed her dolefully submissive manner and said to her husband: +"Listen to me, Count, you have managed matters so that we are +getting nothing for the house, and now you wish to throw away all our- +all the children's property! You said yourself that we have a +hundred thousand rubles' worth of things in the house. I don't +consent, my dear, I don't! Do as you please! It's the government's +business to look after the wounded; they know that. Look at the +Lopukhins opposite, they cleared out everything two days ago. That's +what other people do. It's only we who are such fools. If you have +no pity on me, have some for the children." + +Flourishing his arms in despair the count left the room without +replying. + +"Papa, what are you doing that for?" asked Natasha, who had followed +him into her mother's room. + +"Nothing! What business is it of yours?" muttered the count angrily. + +"But I heard," said Natasha. "Why does Mamma object?" + +"What business is it of yours?" cried the count. + +Natasha stepped up to the window and pondered. + +"Papa! Here's Berg coming to see us," said she, looking out of the +window. + + + + + +CHAPTER XVI + + +Berg, the Rostovs' son-in-law, was already a colonel wearing the +orders of Vladimir and Anna, and he still filled the quiet and +agreeable post of assistant to the head of the staff of the +assistant commander of the first division of the Second Army. + +On the first of September he had come to Moscow from the army. + +He had nothing to do in Moscow, but he had noticed that everyone +in the army was asking for leave to visit Moscow and had something +to do there. So he considered it necessary to ask for leave of absence +for family and domestic reasons. + +Berg drove up to his father-in-law's house in his spruce little trap +with a pair of sleek roans, exactly like those of a certain prince. He +looked attentively at the carts in the yard and while going up to +the porch took out a clean pocket handkerchief and tied a knot in it. + +From the anteroom Berg ran with smooth though impatient steps into +the drawing room, where he embraced the count, kissed the hands of +Natasha and Sonya, and hastened to inquire after "Mamma's" health. + +"Health, at a time like this?" said the count. "Come, tell us the +news! Is the army retreating or will there be another battle?" + +"God Almighty alone can decide the fate of our fatherland, Papa," +said Berg. "The army is burning with a spirit of heroism and the +leaders, so to say, have now assembled in council. No one knows what +is coming. But in general I can tell you, Papa, that such a heroic +spirit, the truly antique valor of the Russian army, which they--which +it" (he corrected himself) "has shown or displayed in the battle of +the twenty-sixth--there are no words worthy to do it justice! I tell +you, Papa" (he smote himself on the breast as a general he had heard +speaking had done, but Berg did it a trifle late for he should have +struck his breast at the words "Russian army"), "I tell you frankly +that we, the commanders, far from having to urge the men on or +anything of that kind, could hardly restrain those... those... yes, +those exploits of antique valor," he went on rapidly. "General Barclay +de Tolly risked his life everywhere at the head of the troops, I can +assure you. Our corps was stationed on a hillside. You can imagine!" + +And Berg related all that he remembered of the various tales he +had heard those days. Natasha watched him with an intent gaze that +confused him, as if she were trying to find in his face the answer +to some question. + +"Altogether such heroism as was displayed by the Russian warriors +cannot be imagined or adequately praised!" said Berg, glancing round +at Natasha, and as if anxious to conciliate her, replying to her +intent look with a smile. "'Russia is not in Moscow, she lives in +the hearts of her sons!' Isn't it so, Papa?" said he. + +Just then the countess came in from the sitting room with a weary +and dissatisfied expression. Berg hurriedly jumped up, kissed her +hand, asked about her health, and, swaying his head from side to +side to express sympathy, remained standing beside her. + +"Yes, Mamma, I tell you sincerely that these are hard and sad +times for every Russian. But why are you so anxious? You have still +time to get away...." + +"I can't think what the servants are about," said the countess, +turning to her husband. "I have just been told that nothing is ready +yet. Somebody after all must see to things. One misses Mitenka at such +times. There won't be any end to it." + +The count was about to say something, but evidently restrained +himself. He got up from his chair and went to the door. + +At that moment Berg drew out his handkerchief as if to blow his nose +and, seeing the knot in it, pondered, shaking his head sadly and +significantly. + +"And I have a great favor to ask of you, Papa," said he. + +"Hm..." said the count, and stopped. + +"I was driving past Yusupov's house just now," said Berg with a +laugh, "when the steward, a man I know, ran out and asked me whether I +wouldn't buy something. I went in out of curiosity, you know, and +there is a small chiffonier and a dressing table. You know how dear +Vera wanted a chiffonier like that and how we had a dispute about it." +(At the mention of the chiffonier and dressing table Berg +involuntarily changed his tone to one of pleasure at his admirable +domestic arrangements.) "And it's such a beauty! It pulls out and +has a secret English drawer, you know! And dear Vera has long wanted +one. I wish to give her a surprise, you see. I saw so many of those +peasant carts in your yard. Please let me have one, I will pay the man +well, and..." + +The count frowned and coughed. + +"Ask the countess, I don't give orders." + +"If it's inconvenient, please don't," said Berg. "Only I so wanted +it, for dear Vera's sake." + +"Oh, go to the devil, all of you! To the devil, the devil, the +devil..." cried the old count. "My head's in a whirl!" + +And he left the room. The countess began to cry. + +"Yes, Mamma! Yes, these are very hard times!" said Berg. + +Natasha left the room with her father and, as if finding it +difficult to reach some decision, first followed him and then ran +downstairs. + +Petya was in the porch, engaged in giving out weapons to the +servants who were to leave Moscow. The loaded carts were still +standing in the yard. Two of them had been uncorded and a wounded +officer was climbing into one of them helped by an orderly. + +"Do you know what it's about?" Petya asked Natasha. + +She understood that he meant what were their parents quarreling +about. She did not answer. + +"It's because Papa wanted to give up all the carts to the +wounded," said Petya. "Vasilich told me. I consider..." + +"I consider," Natasha suddenly almost shouted, turning her angry +face to Petya, "I consider it so horrid, so abominable, so... I +don't know what. Are we despicable Germans?" + +Her throat quivered with convulsive sobs and, afraid of weakening +and letting the force of her anger run to waste, she turned and rushed +headlong up the stairs. + +Berg was sitting beside the countess consoling her with the +respectful attention of a relative. The count, pipe in hand, was +pacing up and down the room, when Natasha, her face distorted by +anger, burst in like a tempest and approached her mother with rapid +steps. + +"It's horrid! It's abominable!" she screamed. "You can't possibly +have ordered it!" + +Berg and the countess looked at her, perplexed and frightened. The +count stood still at the window and listened. + +"Mamma, it's impossible: see what is going on in the yard!" she +cried. "They will be left!..." + +"What's the matter with you? Who are 'they'? What do you want?" + +"Why, the wounded! It's impossible, Mamma. It's monstrous!... No, +Mamma darling, it's not the thing. Please forgive me, darling.... +Mamma, what does it matter what we take away? Only look what is +going on in the yard... Mamma!... It's impossible!" + +The count stood by the window and listened without turning round. +Suddenly he sniffed and put his face closer to the window. + +The countess glanced at her daughter, saw her face full of shame for +her mother, saw her agitation, and understood why her husband did +not turn to look at her now, and she glanced round quite disconcerted. + +"Oh, do as you like! Am I hindering anyone?" she said, not +surrendering at once. + +"Mamma, darling, forgive me!" + +But the countess pushed her daughter away and went up to her +husband. + +"My dear, you order what is right.... You know I don't understand +about it," said she, dropping her eyes shamefacedly. + +"The eggs... the eggs are teaching the hen," muttered the count +through tears of joy, and he embraced his wife who was glad to hide +her look of shame on his breast. + +"Papa! Mamma! May I see to it? May I?..." asked Natasha. "We will +still take all the most necessary things." + +The count nodded affirmatively, and Natasha, at the rapid pace at +which she used to run when playing at tag, ran through the ballroom to +the anteroom and downstairs into the yard. + +The servants gathered round Natasha, but could not believe the +strange order she brought them until the count himself, in his +wife's name, confirmed the order to give up all the carts to the +wounded and take the trunks to the storerooms. When they understood +that order the servants set to work at this new task with pleasure and +zeal. It no longer seemed strange to them but on the contrary it +seemed the only thing that could be done, just as a quarter of an hour +before it had not seemed strange to anyone that the wounded should +be left behind and the goods carted away but that had seemed the +only thing to do. + +The whole household, as if to atone for not having done it sooner, +set eagerly to work at the new task of placing the wounded in the +carts. The wounded dragged themselves out of their rooms and stood +with pale but happy faces round the carts. The news that carts were to +be had spread to the neighboring houses, from which wounded men +began to come into the Rostovs' yard. Many of the wounded asked them +not to unload the carts but only to let them sit on the top of the +things. But the work of unloading, once started, could not be +arrested. It seemed not to matter whether all or only half the +things were left behind. Cases full of china, bronzes, pictures, and +mirrors that had been so carefully packed the night before now lay +about the yard, and still they went on searching for and finding +possibilities of unloading this or that and letting the wounded have +another and yet another cart. + +"We can take four more men," said the steward. "They can have my +trap, or else what is to become of them?" + +"Let them have my wardrobe cart," said the countess. "Dunyasha can +go with me in the carriage." + +They unloaded the wardrobe cart and sent it to take wounded men from +a house two doors off. The whole household, servants included, was +bright and animated. Natasha was in a state of rapturous excitement +such as she had not known for a long time. + +"What could we fasten this onto?" asked the servants, trying to +fix a trunk on the narrow footboard behind a carriage. "We must keep +at least one cart." + +"What's in it?" asked Natasha. + +"The count's books." + +"Leave it, Vasilich will put it away. It's not wanted." + +The phaeton was full of people and there was a doubt as to where +Count Peter could sit. + +"On the box. You'll sit on the box, won't you, Petya?" cried +Natasha. + +Sonya too was busy all this time, but the aim of her efforts was +quite different from Natasha's. She was putting away the things that +had to be left behind and making a list of them as the countess +wished, and she tried to get as much taken away with them as possible. + + + + + +CHAPTER XVII + + +Before two o'clock in the afternoon the Rostovs' four carriages, +packed full and with the horses harnessed, stood at the front door. +One by one the carts with the wounded had moved out of the yard. + +The caleche in which Prince Andrew was being taken attracted Sonya's +attention as it passed the front porch. With the help of a maid she +was arranging a seat for the countess in the huge high coach that +stood at the entrance. + +"Whose caleche is that?" she inquired, leaning out of the carriage +window. + +"Why, didn't you know, Miss?" replied the maid. "The wounded prince: +he spent the night in our house and is going with us." + +"But who is it? What's his name?" + +"It's our intended that was--Prince Bolkonski himself! They say he +is dying," replied the maid with a sigh. + +Sonya jumped out of the coach and ran to the countess. The countess, +tired out and already dressed in shawl and bonnet for her journey, was +pacing up and down the drawing room, waiting for the household to +assemble for the usual silent prayer with closed doors before +starting. Natasha was not in the room. + +"Mamma," said Sonya, "Prince Andrew is here, mortally wounded. He is +going with us." + +The countess opened her eyes in dismay and, seizing Sonya's arm, +glanced around. + +"Natasha?" she murmured. + +At that moment this news had only one significance for both of them. +They knew their Natasha, and alarm as to what would happen if she +heard this news stifled all sympathy for the man they both liked. + +"Natasha does not know yet, but he is going with us," said Sonya. + +"You say he is dying?" + +Sonya nodded. + +The countess put her arms around Sonya and began to cry. + +"The ways of God are past finding out!" she thought, feeling that +the Almighty Hand, hitherto unseen, was becoming manifest in all +that was now taking place. + +"Well, Mamma? Everything is ready. What's the matter?" asked +Natasha, as with animated face she ran into the room. + +"Nothing," answered the countess. "If everything is ready let us +start." + +And the countess bent over her reticule to hide her agitated face. +Sonya embraced Natasha and kissed her. + +Natasha looked at her inquiringly. + +"What is it? What has happened?" + +"Nothing... No..." + +"Is it something very bad for me? What is it?" persisted Natasha +with her quick intuition. + +Sonya sighed and made no reply. The count, Petya, Madame Schoss, +Mavra Kuzminichna, and Vasilich came into the drawing room and, having +closed the doors, they all sat down and remained for some moments +silently seated without looking at one another. + +The count was the first to rise, and with a loud sigh crossed +himself before the icon. All the others did the same. Then the count +embraced Mavra Kuzminichna and Vasilich, who were to remain in Moscow, +and while they caught at his hand and kissed his shoulder he patted +their backs lightly with some vaguely affectionate and comforting +words. The countess went into the oratory and there Sonya found her on +her knees before the icons that had been left here and there hanging +on the wall. (The most precious ones, with which some family tradition +was connected, were being taken with them.) + +In the porch and in the yard the men whom Petya had armed with +swords and daggers, with trousers tucked inside their high boots and +with belts and girdles tightened, were taking leave of those remaining +behind. + +As is always the case at a departure, much had been forgotten or put +in the wrong place, and for a long time two menservants stood one on +each side of the open door and the carriage steps waiting to help +the countess in, while maids rushed with cushions and bundles from the +house to the carriages, the caleche, the phaeton, and back again. + +"They always will forget everything!" said the countess. "Don't +you know I can't sit like that?" + +And Dunyasha, with clenched teeth, without replying but with an +aggrieved look on her face, hastily got into the coach to rearrange +the seat. + +"Oh, those servants!" said the count, swaying his head. + +Efim, the old coachman, who was the only one the countess trusted to +drive her, sat perched up high on the box and did not so much as +glance round at what was going on behind him. From thirty years' +experience he knew it would be some time yet before the order, "Be +off, in God's name!" would be given him: and he knew that even when it +was said he would be stopped once or twice more while they sent back +to fetch something that had been forgotten, and even after that he +would again be stopped and the countess herself would lean out of +the window and beg him for the love of heaven to drive carefully +down the hill. He knew all this and therefore waited calmly for what +would happen, with more patience than the horses, especially the +near one, the chestnut Falcon, who was pawing the ground and +champing his bit. At last all were seated, the carriage steps were +folded and pulled up, the door was shut, somebody was sent for a +traveling case, and the countess leaned out and said what she had to +say. Then Efim deliberately doffed his hat and began crossing himself. +The postilion and all the other servants did the same. "Off, in +God's name!" said Efim, putting on his hat. "Start!" The postilion +started the horses, the off pole horse tugged at his collar, the +high springs creaked, and the body of the coach swayed. The footman +sprang onto the box of the moving coach which jolted as it passed +out of the yard onto the uneven roadway; the other vehicles jolted +in their turn, and the procession of carriages moved up the street. In +the carriages, the caleche, and the phaeton, all crossed themselves as +they passed the church opposite the house. Those who were to remain in +Moscow walked on either side of the vehicles seeing the travelers off. + +Rarely had Natasha experienced so joyful a feeling as now, sitting +in the carriage beside the countess and gazing at the slowly +receding walls of forsaken, agitated Moscow. Occasionally she leaned +out of the carriage window and looked back and then forward at the +long train of wounded in front of them. Almost at the head of the line +she could see the raised hood of Prince Andrew's caleche. She did +not know who was in it, but each time she looked at the procession her +eyes sought that caleche. She knew it was right in front. + +In Kudrino, from the Nikitski, Presnya, and Podnovinsk Streets +came several other trains of vehicles similar to the Rostovs', and +as they passed along the Sadovaya Street the carriages and carts +formed two rows abreast. + +As they were going round the Sukharev water tower Natasha, who was +inquisitively and alertly scrutinizing the people driving or walking +past, suddenly cried out in joyful surprise: + +"Dear me! Mamma, Sonya, look, it's he!" + +"Who? Who?" + +"Look! Yes, on my word, it's Bezukhov!" said Natasha, putting her +head out of the carriage and staring at a tall, stout man in a +coachman's long coat, who from his manner of walking and moving was +evidently a gentleman in disguise, and who was passing under the +arch of the Sukharev tower accompanied by a small, sallow-faced, +beardless old man in a frieze coat. + +"Yes, it really is Bezukhov in a coachman's coat, with a +queer-looking old boy. Really," said Natasha, "look, look!" + +"No, it's not he. How can you talk such nonsense?" + +"Mamma," screamed Natasha, "I'll stake my head it's he! I assure +you! Stop, stop!" she cried to the coachman. + +But the coachman could not stop, for from the Meshchanski Street +came more carts and carriages, and the Rostovs were being shouted at +to move on and not block the way. + +In fact, however, though now much farther off than before, the +Rostovs all saw Pierre--or someone extraordinarily like him--in a +coachman's coat, going down the street with head bent and a serious +face beside a small, beardless old man who looked like a footman. That +old man noticed a face thrust out of the carriage window gazing at +them, and respectfully touching Pierre's elbow said something to him +and pointed to the carriage. Pierre, evidently engrossed in thought, +could not at first understand him. At length when he had understood +and looked in the direction the old man indicated, he recognized +Natasha, and following his first impulse stepped instantly and rapidly +toward the coach. But having taken a dozen steps he seemed to remember +something and stopped. + +Natasha's face, leaning out of the window, beamed with quizzical +kindliness. + +"Peter Kirilovich, come here! We have recognized you! This is +wonderful!" she cried, holding out her hand to him. "What are you +doing? Why are you like this?" + +Pierre took her outstretched hand and kissed it awkwardly as he +walked along beside her while the coach still moved on. + +"What is the matter, Count?" asked the countess in a surprised and +commiserating tone. + +"What? What? Why? Don't ask me," said Pierre, and looked round at +Natasha whose radiant, happy expression--of which he was conscious +without looking at her--filled him with enchantment. + +"Are you remaining in Moscow, then?" + +Pierre hesitated. + +"In Moscow?" he said in a questioning tone. "Yes, in Moscow. +Goodby!" + +"Ah, if only I were a man? I'd certainly stay with you. How +splendid!" said Natasha. "Mamma, if you'll let me, I'll stay!" + +Pierre glanced absently at Natasha and was about to say something, +but the countess interrupted him. + +"You were at the battle, we heard." + +"Yes, I was," Pierre answered. "There will be another battle +tomorrow..." he began, but Natasha interrupted him. + +"But what is the matter with you, Count? You are not like +yourself...." + +"Oh, don't ask me, don't ask me! I don't know myself. Tomorrow... +But no! Good-by, good-by!" he muttered. "It's an awful time!" and +dropping behind the carriage he stepped onto the pavement. + +Natasha continued to lean out of the window for a long time, beaming +at him with her kindly, slightly quizzical, happy smile. + + + + + +CHAPTER XVIII + + +For the last two days, ever since leaving home, Pierre had been +living in the empty house of his deceased benefactor, Bazdeev. This is +how it happened. + +When he woke up on the morning after his return to Moscow and his +interview with Count Rostopchin, he could not for some time make out +where he was and what was expected of him. When he was informed that +among others awaiting him in his reception room there was a +Frenchman who had brought a letter from his wife, the Countess Helene, +he felt suddenly overcome by that sense of confusion and +hopelessness to which he was apt to succumb. He felt that everything +was now at an end, all was in confusion and crumbling to pieces, +that nobody was right or wrong, the future held nothing, and there was +no escape from this position. Smiling unnaturally and muttering to +himself, he first sat down on the sofa in an attitude of despair, then +rose, went to the door of the reception room and peeped through the +crack, returned flourishing his arms, and took up a book. His +major-domo came in a second time to say that the Frenchman who had +brought the letter from the countess was very anxious to see him if +only for a minute, and that someone from Bazdeev's widow had called to +ask Pierre to take charge of her husband's books, as she herself was +leaving for the country. + +"Oh, yes, in a minute; wait... or no! No, of course... go and say +I will come directly," Pierre replied to the major-domo. + +But as soon as the man had left the room Pierre took up his hat +which was lying on the table and went out of his study by the other +door. There was no one in the passage. He went along the whole +length of this passage to the stairs and, frowning and rubbing his +forehead with both hands, went down as far as the first landing. The +hall porter was standing at the front door. From the landing where +Pierre stood there was a second staircase leading to the back +entrance. He went down that staircase and out into the yard. No one +had seen him. But there were some carriages waiting, and as soon as +Pierre stepped out of the gate the coachmen and the yard porter +noticed him and raised their caps to him. When he felt he was being +looked at he behaved like an ostrich which hides its head in a bush in +order not to be seen: he hung his head and quickening his pace went +down the street. + +Of all the affairs awaiting Pierre that day the sorting of Joseph +Bazdeev's books and papers appeared to him the most necessary. + + +He hired the first cab he met and told the driver to go to the +Patriarch's Ponds, where the widow Bazdeev's house was. + +Continually turning round to look at the rows of loaded carts that +were making their way from all sides out of Moscow, and balancing +his bulky body so as not to slip out of the ramshackle old vehicle, +Pierre, experiencing the joyful feeling of a boy escaping from school, +began to talk to his driver. + +The man told him that arms were being distributed today at the +Kremlin and that tomorrow everyone would be sent out beyond the +Three Hills gates and a great battle would be fought there. + +Having reached the Patriarch's Ponds Pierre found the Bazdeevs' +house, where he had not been for a long time past. He went up to the +gate. Gerasim, that sallow beardless old man Pierre had seen at +Torzhok five years before with Joseph Bazdeev, came out in answer to +his knock. + +"At home?" asked Pierre. + +"Owing to the present state of things Sophia Danilovna has gone to +the Torzhok estate with the children, your excellency." + +"I will come in all the same, I have to look through the books," +said Pierre. + +"Be so good as to step in. Makar Alexeevich, the brother of my +late master--may the kingdom of heaven be his--has remained here, +but he is in a weak state as you know," said the old servant. + +Pierre knew that Makar Alexeevich was Joseph Bazdeev's half-insane +brother and a hard drinker. + +"Yes, yes, I know. Let us go in..." said Pierre and entered the +house. + +A tall, bald-headed old man with a red nose, wearing a dressing gown +and with galoshes on his bare feet, stood in the anteroom. On seeing +Pierre he muttered something angrily and went away along the passage. + +"He was a very clever man but has now grown quite feeble, as your +honor sees," said Gerasim. "Will you step into the study?" Pierre +nodded. "As it was sealed up so it has remained, but Sophia +Danilovna gave orders that if anyone should come from you they were to +have the books." + +Pierre went into that gloomy study which he had entered with such +trepidation in his benefactor's lifetime. The room, dusty and +untouched since the death of Joseph Bazdeev was now even gloomier. + +Gerasim opened one of the shutters and left the room on tiptoe. +Pierre went round the study, approached the cupboard in which the +manuscripts were kept, and took out what had once been one of the most +important, the holy of holies of the order. This was the authentic +Scotch Acts with Bazdeev's notes and explanations. He sat down at +the dusty writing table, and, having laid the manuscripts before +him, opened them out, closed them, finally pushed them away, and +resting his head on his hand sank into meditation. + +Gerasim looked cautiously into the study several times and saw +Pierre always sitting in the same attitude. + +More than two hours passed and Gerasim took the liberty of making +a slight noise at the door to attract his attention, but Pierre did +not hear him. + +"Is the cabman to be discharged, your honor?" + +"Oh yes!" said Pierre, rousing himself and rising hurriedly. "Look +here," he added, taking Gerasim by a button of his coat and looking +down at the old man with moist, shining, and ecstatic eyes, "I say, do +you know that there is going to be a battle tomorrow?" + +"We heard so," replied the man. + +"I beg you not to tell anyone who I am, and to do what I ask you." + +"Yes, your excellency," replied Gerasim. "Will you have something to +eat?" + +"No, but I want something else. I want peasant clothes and a +pistol," said Pierre, unexpectedly blushing. + +"Yes, your excellency," said Gerasim after thinking for a moment. + +All the rest of that day Pierre spent alone in his benefactor's +study, and Gerasim heard him pacing restlessly from one corner to +another and talking to himself. And he spent the night on a bed made +up for him there. + +Gerasim, being a servant who in his time had seen many strange +things, accepted Pierre's taking up his residence in the house without +surprise, and seemed pleased to have someone to wait on. That same +evening--without even asking himself what they were wanted for--he +procured a coachman's coat and cap for Pierre, and promised to get him +the pistol next day. Makar Alexeevich came twice that evening +shuffling along in his galoshes as far as the door and stopped and +looked ingratiatingly at Pierre. But as soon as Pierre turned toward +him he wrapped his dressing gown around him with a shamefaced and +angry look and hurried away. It was when Pierre (wearing the +coachman's coat which Gerasim had procured for him and had disinfected +by steam) was on his way with the old man to buy the pistol at the +Sukharev market that he met the Rostovs. + + + + + +CHAPTER XIX + + +Kutuzov's order to retreat through Moscow to the Ryazan road was +issued at night on the first of September. + +The first troops started at once, and during the night they +marched slowly and steadily without hurry. At daybreak, however, those +nearing the town at the Dorogomilov bridge saw ahead of them masses of +soldiers crowding and hurrying across the bridge, ascending on the +opposite side and blocking the streets and alleys, while endless +masses of troops were bearing down on them from behind, and an +unreasoning hurry and alarm overcame them. They all rushed forward +to the bridge, onto it, and to the fords and the boats. Kutuzov +himself had driven round by side streets to the other side of Moscow. + +By ten o'clock in the morning of the second of September, only the +rear guard remained in the Dorogomilov suburb, where they had ample +room. The main army was on the other side of Moscow or beyond it. + +At that very time, at ten in the morning of the second of September, +Napoleon was standing among his troops on the Poklonny Hill looking at +the panorama spread out before him. From the twenty-sixth of August to +the second of September, that is from the battle of Borodino to the +entry of the French into Moscow, during the whole of that agitating, +memorable week, there had been the extraordinary autumn weather that +always comes as a surprise, when the sun hangs low and gives more heat +than in spring, when everything shines so brightly in the rare clear +atmosphere that the eyes smart, when the lungs are strengthened and +refreshed by inhaling the aromatic autumn air, when even the nights +are warm, and when in those dark warm nights, golden stars startle and +delight us continually by falling from the sky. + +At ten in the morning of the second of September this weather +still held. + +The brightness of the morning was magical. Moscow seen from the +Poklonny Hill lay spaciously spread out with her river, her gardens, +and her churches, and she seemed to be living her usual life, her +cupolas glittering like stars in the sunlight. + +The view of the strange city with its peculiar architecture, such as +he had never seen before, filled Napoleon with the rather envious +and uneasy curiosity men feel when they see an alien form of life that +has no knowledge of them. This city was evidently living with the full +force of its own life. By the indefinite signs which, even at a +distance, distinguish a living body from a dead one, Napoleon from the +Poklonny Hill perceived the throb of life in the town and felt, as +it were, the breathing of that great and beautiful body. + +Every Russian looking at Moscow feels her to be a mother; every +foreigner who sees her, even if ignorant of her significance as the +mother city, must feel her feminine character, and Napoleon felt it. + +"Cette ville asiatique aux innombrables eglises, Moscou la sainte. +La voila done enfin, cette fameuse ville! Il etait temps,"* said he, +and dismounting he ordered a plan of Moscow to be spread out before +him, and summoned Lelorgne d'Ideville, the interpreter. + + +*"That Asiatic city of the innumerable churches, holy Moscow! Here +it is then at last, that famous city. It was high time." + + +"A town captured by the enemy is like a maid who has lost her +honor," thought he (he had said so to Tuchkov at Smolensk). From +that point of view he gazed at the Oriental beauty he had not seen +before. It seemed strange to him that his long-felt wish, which had +seemed unattainable, had at last been realized. In the clear morning +light he gazed now at the city and now at the plan, considering its +details, and the assurance of possessing it agitated and awed him. + +"But could it be otherwise?" he thought. "Here is this capital at my +feet. Where is Alexander now, and of what is he thinking? A strange, +beautiful, and majestic city; and a strange and majestic moment! In +what light must I appear to them!" thought he, thinking of his troops. +"Here she is, the reward for all those fainthearted men," he +reflected, glancing at those near him and at the troops who were +approaching and forming up. "One word from me, one movement of my +hand, and that ancient capital of the Tsars would perish. But my +clemency is always ready to descend upon the vanquished. I must be +magnanimous and truly great. But no, it can't be true that I am in +Moscow," he suddenly thought. "Yet here she is lying at my feet, +with her golden domes and crosses scintillating and twinkling in the +sunshine. But I shall spare her. On the ancient monuments of barbarism +and despotism I will inscribe great words of justice and mercy.... +It is just this which Alexander will feel most painfully, I know him." +(It seemed to Napoleon that the chief import of what was taking +place lay in the personal struggle between himself and Alexander.) +"From the height of the Kremlin--yes, there is the Kremlin, yes--I +will give them just laws; I will teach them the meaning of true +civilization, I will make generations of boyars remember their +conqueror with love. I will tell the deputation that I did not, and do +not, desire war, that I have waged war only against the false policy +of their court; that I love and respect Alexander and that in Moscow I +will accept terms of peace worthy of myself and of my people. I do not +wish to utilize the fortunes of war to humiliate an honored monarch. +'Boyars,' I will say to them, 'I do not desire war, I desire the peace +and welfare of all my subjects.' However, I know their presence will +inspire me, and I shall speak to them as I always do: clearly, +impressively, and majestically. But can it be true that I am in +Moscow? Yes, there she lies." + +"Qu'on m'amene les boyars,"* said he to his suite. + + +*"Bring the boyars to me." + + +A general with a brilliant suite galloped off at once to fetch the +boyars. + +Two hours passed. Napoleon had lunched and was again standing in the +same place on the Poklonny Hill awaiting the deputation. His speech to +the boyars had already taken definite shape in his imagination. That +speech was full of dignity and greatness as Napoleon understood it. + +He was himself carried away by the tone of magnanimity he intended +to adopt toward Moscow. In his imagination he appointed days for +assemblies at the palace of the Tsars, at which Russian notables and +his own would mingle. He mentally appointed a governor, one who +would win the hearts of the people. Having learned that there were +many charitable institutions in Moscow he mentally decided that he +would shower favors on them all. He thought that, as in Africa he +had to put on a burnoose and sit in a mosque, so in Moscow he must +be beneficent like the Tsars. And in order finally to touch the hearts +of the Russians--and being like all Frenchmen unable to imagine +anything sentimental without a reference to ma chere, ma tendre, ma +pauvre mere* --he decided that he would place an inscription on all +these establishments in large letters: "This establishment is +dedicated to my dear mother." Or no, it should be simply: Maison de ma +Mere,*[2] he concluded. "But am I really in Moscow? Yes, here it +lies before me, but why is the deputation from the city so long in +appearing?" he wondered. + + +*"My dear, my tender, my poor mother." + +*[2] "House of my Mother." + + +Meanwhile an agitated consultation was being carried on in +whispers among his generals and marshals at the rear of his suite. +Those sent to fetch the deputation had returned with the news that +Moscow was empty, that everyone had left it. The faces of those who +were not conferring together were pale and perturbed. They were not +alarmed by the fact that Moscow had been abandoned by its +inhabitants (grave as that fact seemed), but by the question how to +tell the Emperor--without putting him in the terrible position of +appearing ridiculous--that he had been awaiting the boyars so long +in vain: that there were drunken mobs left in Moscow but no one +else. Some said that a deputation of some sort must be scraped +together, others disputed that opinion and maintained that the Emperor +should first be carefully and skillfully prepared, and then told the +truth. + +"He will have to be told, all the same," said some gentlemen of +the suite. "But, gentlemen..." + +The position was the more awkward because the Emperor, meditating +upon his magnanimous plans, was pacing patiently up and down before +the outspread map, occasionally glancing along the road to Moscow from +under his lifted hand with a bright and proud smile. + +"But it's impossible..." declared the gentlemen of the suite, +shrugging their shoulders but not venturing to utter the implied word- +le ridicule... + +At last the Emperor, tired of futile expectation, his actor's +instinct suggesting to him that the sublime moment having been too +long drawn out was beginning to lose its sublimity, gave a sign with +his hand. A single report of a signaling gun followed, and the troops, +who were already spread out on different sides of Moscow, moved into +the city through Tver, Kaluga, and Dorogomilov gates. Faster and +faster, vying with one another, they moved at the double or at a trot, +vanishing amid the clouds of dust they raised and making the air +ring with a deafening roar of mingling shouts. + +Drawn on by the movement of his troops Napoleon rode with them as +far as the Dorogomilov gate, but there again stopped and, +dismounting from his horse, paced for a long time by the +Kammer-Kollezski rampart, awaiting the deputation. + + + + + +CHAPTER XX + +Meanwhile Moscow was empty. There were still people in it, perhaps a +fiftieth part of its former inhabitants had remained, but it was +empty. It was empty in the sense that a dying queenless hive is empty. + +In a queenless hive no life is left though to a superficial glance +it seems as much alive as other hives. + +The bees circle round a queenless hive in the hot beams of the +midday sun as gaily as around the living hives; from a distance it +smells of honey like the others, and bees fly in and out in the same +way. But one has only to observe that hive to realize that there is no +longer any life in it. The bees do not fly in the same way, the +smell and the sound that meet the beekeeper are not the same. To the +beekeeper's tap on the wall of the sick hive, instead of the former +instant unanimous humming of tens of thousands of bees with their +abdomens threateningly compressed, and producing by the rapid +vibration of their wings an aerial living sound, the only reply is a +disconnected buzzing from different parts of the deserted hive. From +the alighting board, instead of the former spirituous fragrant smell +of honey and venom, and the warm whiffs of crowded life, comes an odor +of emptiness and decay mingling with the smell of honey. There are +no longer sentinels sounding the alarm with their abdomens raised, and +ready to die in defense of the hive. There is no longer the measured +quiet sound of throbbing activity, like the sound of boiling water, +but diverse discordant sounds of disorder. In and out of the hive long +black robber bees smeared with honey fly timidly and shiftily. They do +not sting, but crawl away from danger. Formerly only bees laden with +honey flew into the hive, and they flew out empty; now they fly out +laden. The beekeeper opens the lower part of the hive and peers in. +Instead of black, glossy bees--tamed by toil, clinging to one +another's legs and drawing out the wax, with a ceaseless hum of labor- +that used to hang in long clusters down to the floor of the hive, +drowsy shriveled bees crawl about separately in various directions +on the floor and walls of the hive. Instead of a neatly glued floor, +swept by the bees with the fanning of their wings, there is a floor +littered with bits of wax, excrement, dying bees scarcely moving their +legs, and dead ones that have not been cleared away. + +The beekeeper opens the upper part of the hive and examines the +super. Instead of serried rows of bees sealing up every gap in the +combs and keeping the brood warm, he sees the skillful complex +structures of the combs, but no longer in their former state of +purity. All is neglected and foul. Black robber bees are swiftly and +stealthily prowling about the combs, and the short home bees, +shriveled and listless as if they were old, creep slowly about without +trying to hinder the robbers, having lost all motive and all sense +of life. Drones, bumblebees, wasps, and butterflies knock awkwardly +against the walls of the hive in their flight. Here and there among +the cells containing dead brood and honey an angry buzzing can +sometimes be heard. Here and there a couple of bees, by force of habit +and custom cleaning out the brood cells, with efforts beyond their +strength laboriously drag away a dead bee or bumblebee without knowing +why they do it. In another corner two old bees are languidly fighting, +or cleaning themselves, or feeding one another, without themselves +knowing whether they do it with friendly or hostile intent. In a third +place a crowd of bees, crushing one another, attack some victim and +fight and smother it, and the victim, enfeebled or killed, drops +from above slowly and lightly as a feather, among the heap of corpses. +The keeper opens the two center partitions to examine the brood cells. +In place of the former close dark circles formed by thousands of +bees sitting back to back and guarding the high mystery of generation, +he sees hundreds of dull, listless, and sleepy shells of bees. They +have almost all died unawares, sitting in the sanctuary they had +guarded and which is now no more. They reek of decay and death. Only a +few of them still move, rise, and feebly fly to settle on the +enemy's hand, lacking the spirit to die stinging him; the rest are +dead and fall as lightly as fish scales. The beekeeper closes the +hive, chalks a mark on it, and when he has time tears out its contents +and burns it clean. + +So in the same way Moscow was empty when Napoleon, weary, uneasy, +and morose, paced up and down in front of the Kammer-Kollezski +rampart, awaiting what to his mind was a necessary, if but formal, +observance of the proprieties--a deputation. + +In various corners of Moscow there still remained a few people +aimlessly moving about, following their old habits and hardly aware of +what they were doing. + +When with due circumspection Napoleon was informed that Moscow was +empty, he looked angrily at his informant, turned away, and silently +continued to walk to and fro. + +"My carriage!" he said. + +He took his seat beside the aide-de-camp on duty and drove into +the suburb. "Moscow deserted!" he said to himself. "What an incredible +event!" + +He did not drive into the town, but put up at an inn in the +Dorogomilov suburb. + +The coup de theatre had not come off. + + + + + +CHAPTER XXI + + +The Russian troops were passing through Moscow from two o'clock at +night till two in the afternoon and bore away with them the wounded +and the last of the inhabitants who were leaving. + +The greatest crush during the movement of the troops took place at +the Stone, Moskva, and Yauza bridges. + +While the troops, dividing into two parts when passing around the +Kremlin, were thronging the Moskva and the Stone bridges, a great many +soldiers, taking advantage of the stoppage and congestion, turned back +from the bridges and slipped stealthily and silently past the church +of Vasili the Beatified and under the Borovitski gate, back up the +hill to the Red Square where some instinct told them they could easily +take things not belonging to them. Crowds of the kind seen at cheap +sales filled all the passages and alleys of the Bazaar. But there were +no dealers with voices of ingratiating affability inviting customers +to enter; there were no hawkers, nor the usual motley crowd of +female purchasers--but only soldiers, in uniforms and overcoats though +without muskets, entering the Bazaar empty-handed and silently +making their way out through its passages with bundles. Tradesmen +and their assistants (of whom there were but few) moved about among +the soldiers quite bewildered. They unlocked their shops and locked +them up again, and themselves carried goods away with the help their +assistants. On the square in front of the Bazaar were drummers beating +the muster call. But the roll of the drums did not make the looting +soldiers run in the direction of the drum as formerly, but made +them, on the contrary, run farther away. Among the soldiers in the +shops and passages some men were to be seen in gray coats, with +closely shaven heads. Two officers, one with a scarf over his +uniform and mounted on a lean, dark-gray horse, the other in an +overcoat and on foot, stood at the corner of Ilyinka Street, +talking. A third officer galloped up to them. + +"The general orders them all to be driven out at once, without fail. +This is outrageous! Half the men have dispersed." + +"Where are you off to?... Where?..." he shouted to three infantrymen +without muskets who, holding up the skirts of their overcoats, were +slipping past him into the Bazaar passage. "Stop, you rascals!" + +"But how are you going to stop them?" replied another officer. +"There is no getting them together. The army should push on before the +rest bolt, that's all!" + +"How can one push on? They are stuck there, wedged on the bridge, +and don't move. Shouldn't we put a cordon round to prevent the rest +from running away?" + +"Come, go in there and drive them out!" shouted the senior officer. + +The officer in the scarf dismounted, called up a drummer, and went +with him into the arcade. Some soldiers started running away in a +group. A shopkeeper with red pimples on his cheeks near the nose, +and a calm, persistent, calculating expression on his plump face, +hurriedly and ostentatiously approached the officer, swinging his +arms. + +"Your honor!" said he. "Be so good as to protect us! We won't grudge +trifles, you are welcome to anything--we shall be delighted! +Pray!... I'll fetch a piece of cloth at once for such an honorable +gentleman, or even two pieces with pleasure. For we feel how it is; +but what's all this--sheer robbery! If you please, could not guards be +placed if only to let us close the shop...." + +Several shopkeepers crowded round the officer. + +"Eh, what twaddle!" said one of them, a thin, stern-looking man. +"When one's head is gone one doesn't weep for one's hair! Take what +any of you like!" And flourishing his arm energetically he turned +sideways to the officer. + +"It's all very well for you, Ivan Sidorych, to talk," said the first +tradesman angrily. "Please step inside, your honor!" + +"Talk indeed!" cried the thin one. "In my three shops here I have +a hundred thousand rubles' worth of goods. Can they be saved when +the army has gone? Eh, what people! 'Against God's might our hands +can't fight.'" + +"Come inside, your honor!" repeated the tradesman, bowing. + +The officer stood perplexed and his face showed indecision. + +"It's not my business!" he exclaimed, and strode on quickly down one +of the passages. + +From one open shop came the sound of blows and vituperation, and +just as the officer came up to it a man in a gray coat with a shaven +head was flung out violently. + +This man, bent double, rushed past the tradesman and the officer. +The officer pounced on the soldiers who were in the shops, but at that +moment fearful screams reached them from the huge crowd on the +Moskva bridge and the officer ran out into the square. + +"What is it? What is it?" he asked, but his comrade was already +galloping off past Vasili the Beatified in the direction from which +the screams came. + +The officer mounted his horse and rode after him. When he reached +the bridge he saw two unlimbered guns, the infantry crossing the +bridge, several overturned carts, and frightened and laughing faces +among the troops. Beside the cannon a cart was standing to which two +horses were harnessed. Four borzois with collars were pressing close +to the wheels. The cart was loaded high, and at the very top, beside a +child's chair with its legs in the air, sat a peasant woman uttering +piercing and desperate shrieks. He was told by his fellow officers +that the screams of the crowd and the shrieks of the woman were due to +the fact that General Ermolov, coming up to the crowd and learning +that soldiers were dispersing among the shops while crowds of +civilians blocked the bridge, had ordered two guns to be unlimbered +and made a show of firing at the bridge. The crowd, crushing one +another, upsetting carts, and shouting and squeezing desperately, +had cleared off the bridge and the troops were now moving forward. + + + + + +CHAPTER XXII + + +Meanwhile, the city itself was deserted. There was hardly anyone +in the streets. The gates and shops were all closed, only here and +there round the taverns solitary shouts or drunken songs could be +heard. Nobody drove through the streets and footsteps were rarely +heard. The Povarskaya was quite still and deserted. The huge courtyard +of the Rostovs' house was littered with wisps of hay and with dung +from the horses, and not a soul was to be seen there. In the great +drawing room of the house, which had been left with all it +contained, were two people. They were the yard porter Ignat, and the +page boy Mishka, Vasilich's grandson who had stayed in Moscow with his +grandfather. Mishka had opened the clavichord and was strumming on +it with one finger. The yard porter, his arms akimbo, stood smiling +with satisfaction before the large mirror. + +"Isn't it fine, eh, Uncle Ignat?" said the boy, suddenly beginning +to strike the keyboard with both hands. + +"Only fancy!" answered Ignat, surprised at the broadening grin on +his face in the mirror. + +"Impudence! Impudence!" they heard behind them the voice of Mavra +Kuzminichna who had entered silently. "How he's grinning, the fat mug! +Is that what you're here for? Nothing's cleared away down there and +Vasilich is worn out. Just you wait a bit!" + +Ignat left off smiling, adjusted his belt, and went out of the +room with meekly downcast eyes. + +"Aunt, I did it gently," said the boy. + +"I'll give you something gently, you monkey you!" cried Mavra +Kuzminichna, raising her arm threateningly. "Go and get the samovar to +boil for your grandfather." + +Mavra Kuzminichna flicked the dust off the clavichord and closed it, +and with a deep sigh left the drawing room and locked its main door. + +Going out into the yard she paused to consider where she should go +next--to drink tea in the servants' wing with Vasilich, or into the +storeroom to put away what still lay about. + +She heard the sound of quick footsteps in the quiet street. +Someone stopped at the gate, and the latch rattled as someone tried to +open it. Mavra Kuzminichna went to the gate. + +"Who do you want?" + +"The count--Count Ilya Andreevich Rostov." + +"And who are you?" + +"An officer, I have to see him," came the reply in a pleasant, +well-bred Russian voice. + +Mavra Kuzminichna opened the gate and an officer of eighteen, with +the round face of a Rostov, entered the yard. + +"They have gone away, sir. Went away yesterday at vespertime," +said Mavra Kuzminichna cordially. + +The young officer standing in the gateway, as if hesitating +whether to enter or not, clicked his tongue. + +"Ah, how annoying!" he muttered. "I should have come yesterday.... +Ah, what a pity." + +Meanwhile, Mavra Kuzminichna was attentively and sympathetically +examining the familiar Rostov features of the young man's face, his +tattered coat and trodden-down boots. + +"What did you want to see the count for?" she asked. + +"Oh well... it can't be helped!" said he in a tone of vexation and +placed his hand on the gate as if to leave. + +He again paused in indecision. + +"You see," he suddenly said, "I am a kinsman of the count's and he +has been very kind to me. As you see" (he glanced with an amused air +and good-natured smile at his coat and boots) "my things are worn +out and I have no money, so I was going to ask the count..." + +Mavra Kuzminichna did not let him finish. + +"Just wait a minute, sir. One little moment," said she. + +And as soon as the officer let go of the gate handle she turned and, +hurrying away on her old legs, went through the back yard to the +servants' quarters. + +While Mavra Kuzminichna was running to her room the officer walked +about the yard gazing at his worn-out boots with lowered head and a +faint smile on his lips. "What a pity I've missed Uncle! What a nice +old woman! Where has she run off to? And how am I to find the +nearest way to overtake my regiment, which must by now be getting near +the Rogozhski gate?" thought he. Just then Mavra Kuzminichna +appeared from behind the corner of the house with a frightened yet +resolute look, carrying a rolled-up check kerchief in her hand. +While still a few steps from the officer she unfolded the kerchief and +took out of it a white twenty-five-ruble assignat and hastily handed +it to him. + +"If his excellency had been at home, as a kinsman he would of +course... but as it is..." + +Mavra Kuzminichna grew abashed and confused. The officer did not +decline, but took the note quietly and thanked her. + +"If the count had been at home..." Mavra Kuzminichna went on +apologetically. "Christ be with you, sir! May God preserve you!" +said she, bowing as she saw him out. + +Swaying his head and smiling as if amused at himself, the officer +ran almost at a trot through the deserted streets toward the Yauza +bridge to overtake his regiment. + +But Mavra Kuzminichna stood at the closed gate for some time with +moist eyes, pensively swaying her head and feeling an unexpected +flow of motherly tenderness and pity for the unknown young officer. + + + + + +CHAPTER XXIII + + +From an unfinished house on the Varvarka, the ground floor of +which was a dramshop, came drunken shouts and songs. On benches +round the tables in a dirty little room sat some ten factory hands. +Tipsy and perspiring, with dim eyes and wide-open mouths, they were +all laboriously singing some song or other. They were singing +discordantly, arduously, and with great effort, evidently not +because they wished to sing, but because they wanted to show they were +drunk and on a spree. One, a tall, fair-haired lad in a clean blue +coat, was standing over the others. His face with its fine straight +nose would have been handsome had it not been for his thin, +compressed, twitching lips and dull, gloomy, fixed eyes. Evidently +possessed by some idea, he stood over those who were singing, and +solemnly and jerkily flourished above their heads his white arm with +the sleeve turned up to the elbow, trying unnaturally to spread out +his dirty fingers. The sleeve of his coat kept slipping down and he +always carefully rolled it up again with his left hand, as if it +were most important that the sinewy white arm he was flourishing +should be bare. In the midst of the song cries were heard, and +fighting and blows in the passage and porch. The tall lad waved his +arm. + +"Stop it!" he exclaimed peremptorily. "There's a fight, lads!" +And, still rolling up his sleeve, he went out to the porch. + +The factory hands followed him. These men, who under the +leadership of the tall lad were drinking in the dramshop that morning, +had brought the publican some skins from the factory and for this +had had drink served them. The blacksmiths from a neighboring +smithy, hearing the sounds of revelry in the tavern and supposing it +to have been broken into, wished to force their way in too and a fight +in the porch had resulted. + +The publican was fighting one of the smiths at the door, and when +the workmen came out the smith, wrenching himself free from the tavern +keeper, fell face downward on the pavement. + +Another smith tried to enter the doorway, pressing against the +publican with his chest. + +The lad with the turned-up sleeve gave the smith a blow in the +face and cried wildly: "They're fighting us, lads!" + +At that moment the first smith got up and, scratching his bruised +face to make it bleed, shouted in a tearful voice: "Police! Murder!... +They've killed a man, lads!" + +"Oh, gracious me, a man beaten to death--killed!..." screamed a +woman coming out of a gate close by. + +A crowd gathered round the bloodstained smith. + +"Haven't you robbed people enough--taking their last shirts?" said a +voice addressing the publican. "What have you killed a man for, you +thief?" + +The tall lad, standing in the porch, turned his bleared eyes from +the publican to the smith and back again as if considering whom he +ought to fight now. + +"Murderer!" he shouted suddenly to the publican. "Bind him, lads!" + +"I daresay you would like to bind me!" shouted the publican, pushing +away the men advancing on him, and snatching his cap from his head +he flung it on the ground. + +As if this action had some mysterious and menacing significance, the +workmen surrounding the publican paused in indecision. + +"I know the law very well, mates! I'll take the matter to the +captain of police. You think I won't get to him? Robbery is not +permitted to anybody now a days!" shouted the publican, picking up his +cap. + +"Come along then! Come along then!" the publican and the tall +young fellow repeated one after the other, and they moved up the +street together. + +The bloodstained smith went beside them. The factory hands and +others followed behind, talking and shouting. + +At the corner of the Moroseyka, opposite a large house with closed +shutters and bearing a bootmaker's signboard, stood a score of thin, +worn-out, gloomy-faced bootmakers, wearing overalls and long +tattered coats. + +"He should pay folks off properly," a thin workingman, with frowning +brows and a straggly beard, was saying. + +"But he's sucked our blood and now he thinks he's quit of us. He's +been misleading us all the week and now that he's brought us to this +pass he's made off." + +On seeing the crowd and the bloodstained man the workman ceased +speaking, and with eager curiosity all the bootmakers joined the +moving crowd. + +"Where are all the folks going?" + +"Why, to the police, of course!" + +"I say, is it true that we have been beaten?" "And what did you +think? Look what folks are saying." + +Questions and answers were heard. The publican, taking advantage +of the increased crowd, dropped behind and returned to his tavern. + +The tall youth, not noticing the disappearance of his foe, waved his +bare arm and went on talking incessantly, attracting general attention +to himself. It was around him that the people chiefly crowded, +expecting answers from him to the questions that occupied all their +minds. + +"He must keep order, keep the law, that's what the government is +there for. Am I not right, good Christians?" said the tall youth, with +a scarcely perceptible smile. "He thinks there's no government! How +can one do without government? Or else there would be plenty who'd rob +us." + +"Why talk nonsense?" rejoined voices in the crowd. "Will they give +up Moscow like this? They told you that for fun, and you believed +it! Aren't there plenty of troops on the march? Let him in, indeed! +That's what the government is for. You'd better listen to what +people are saying," said some of the mob pointing to the tall youth. + +By the wall of China-Town a smaller group of people were gathered +round a man in a frieze coat who held a paper in his hand. + +"An ukase, they are reading an ukase! Reading an ukase!" cried +voices in the crowd, and the people rushed toward the reader. + +The man in the frieze coat was reading the broadsheet of August 31 +When the crowd collected round him he seemed confused, but at the +demand of the tall lad who had pushed his way up to him, he began in a +rather tremulous voice to read the sheet from the beginning. + +"Early tomorrow I shall go to his Serene Highness," he read +("Sirin Highness," said the tall fellow with a triumphant smile on his +lips and a frown on his brow), "to consult with him to act, and to aid +the army to exterminate these scoundrels. We too will take part..." +the reader went on, and then paused ("Do you see," shouted the youth +victoriously, "he's going to clear up the whole affair for +you...."), "in destroying them, and will send these visitors to the +devil. I will come back to dinner, and we'll set to work. We will +do, completely do, and undo these scoundrels." + +The last words were read out in the midst of complete silence. The +tall lad hung his head gloomily. It was evident that no one had +understood the last part. In particular, the words "I will come back +to dinner," evidently displeased both reader and audience. The +people's minds were tuned to a high pitch and this was too simple +and needlessly comprehensible--it was what any one of them might +have said and therefore was what an ukase emanating from the highest +authority should not say. + +They all stood despondent and silent. The tall youth moved his +lips and swayed from side to side. + +"We should ask him... that's he himself?"... "Yes, ask him +indeed!... Why not? He'll explain"... voices in the rear of the +crowd were suddenly heard saying, and the general attention turned +to the police superintendent's trap which drove into the square +attended by two mounted dragoons. + +The superintendent of police, who had that morning by Count +Rostopchin's orders to burn the barges and had in connection with that +matter acquired a large sum of money which was at that moment in his +pocket, on seeing a crowd bearing down upon him told his coachman to +stop. + +"What people are these?" he shouted to the men, who were moving +singly and timidly in the direction of his trap. + +"What people are these?" he shouted again, receiving no answer. + +"Your honor..." replied the shopman in the frieze coat, "your honor, +in accord with the proclamation of his highest excellency the count, +they desire to serve, not sparing their lives, and it is not any +kind of riot, but as his highest excellence said..." + +"The count has not left, he is here, and an order will be issued +concerning you," said the superintendent of police. "Go on!" he +ordered his coachman. + +The crowd halted, pressing around those who had heard what the +superintendent had said, and looking at the departing trap. + +The superintendent of police turned round at that moment with a +scared look, said something to his coachman, and his horses +increased their speed. + +"It's a fraud, lads! Lead the way to him, himself!" shouted the tall +youth. "Don't let him go, lads! Let him answer us! Keep him!" +shouted different people and the people dashed in pursuit of the trap. + +Following the superintendent of police and talking loudly the +crowd went in the direction of the Lubyanka Street. + +"There now, the gentry and merchants have gone away and left us to +perish. Do they think we're dogs?" voices in the crowd were heard +saying more and more frequently. + + + + + +CHAPTER XXIV + + +On the evening of the first of September, after his interview with +Kutuzov, Count Rostopchin had returned to Moscow mortified and +offended because he had not been invited to attend the council of war, +and because Kutuzov had paid no attention to his offer to take part in +the defense of the city; amazed also at the novel outlook revealed +to him at the camp, which treated the tranquillity of the capital +and its patriotic fervor as not merely secondary but quite +irrelevant and unimportant matters. Distressed, offended, and +surprised by all this, Rostopchin had returned to Moscow. After supper +he lay down on a sofa without undressing, and was awakened soon +after midnight by a courier bringing him a letter from Kutuzov. This +letter requested the count to send police officers to guide the troops +through the town, as the army was retreating to the Ryazan road beyond +Moscow. This was not news to Rostopchin. He had known that Moscow +would be abandoned not merely since his interview the previous day +with Kutuzov on the Poklonny Hill but ever since the battle of +Borodino, for all the generals who came to Moscow after that battle +had said unanimously that it was impossible to fight another battle, +and since then the government property had been removed every night, +and half the inhabitants had left the city with Rostopchin's own +permission. Yet all the same this information astonished and irritated +the count, coming as it did in the form of a simple note with an order +from Kutuzov, and received at night, breaking in on his beauty sleep. + +When later on in his memoirs Count Rostopchin explained his +actions at this time, he repeatedly says that he was then actuated +by two important considerations: to maintain tranquillity in Moscow +and expedite the departure of the inhabitants. If one accepts this +twofold aim all Rostopchin's actions appear irreproachable. "Why +were the holy relics, the arms, ammunition, gunpowder, and stores of +corn not removed? Why were thousands of inhabitants deceived into +believing that Moscow would not be given up--and thereby ruined?" +"To presence the tranquillity of the city," explains Count Rostopchin. +"Why were bundles of useless papers from the government offices, and +Leppich's balloon and other articles removed?" "To leave the town +empty," explains Count Rostopchin. One need only admit that public +tranquillity is in danger and any action finds a justification. + +All the horrors of the reign of terror were based only on solicitude +for public tranquillity. + +On what, then, was Count Rostopchin's fear for the tranquillity of +Moscow based in 1812? What reason was there for assuming any +probability of an uprising in the city? The inhabitants were leaving +it and the retreating troops were filling it. Why should that cause +the masses to riot? + +Neither in Moscow nor anywhere in Russia did anything resembling +an insurrection ever occur when the enemy entered a town. More than +ten thousand people were still in Moscow on the first and second of +September, and except for a mob in the governor's courtyard, assembled +there at his bidding, nothing happened. It is obvious that there would +have been even less reason to expect a disturbance among the people if +after the battle of Borodino, when the surrender of Moscow became +certain or at least probable, Rostopchin instead of exciting the +people by distributing arms and broadsheets had taken steps to +remove all the holy relics, the gunpowder, munitions, and money, and +had told the population plainly that the town would be abandoned. + +Rostopchin, though he had patriotic sentiments, was a sanguine and +impulsive man who had always moved in the highest administrative +circles and had no understanding at all of the people he supposed +himself to be guiding. Ever since the enemy's entry into Smolensk he +had in imagination been playing the role of director of the popular +feeling of "the heart of Russia." Not only did it seem to him (as to +all administrators) that he controlled the external actions of +Moscow's inhabitants, but he also thought he controlled their mental +attitude by means of his broadsheets and posters, written in a +coarse tone which the people despise in their own class and do not +understand from those in authority. Rostopchin was so pleased with the +fine role of leader of popular feeling, and had grown so used to it, +that the necessity of relinquishing that role and abandoning Moscow +without any heroic display took him unawares and he suddenly felt +the ground slip away from under his feet, so that he positively did +not know what to do. Though he knew it was coming, he did not till the +last moment wholeheartedly believe that Moscow would be abandoned, and +did not prepare for it. The inhabitants left against his wishes. If +the government offices were removed, this was only done on the +demand of officials to whom the count yielded reluctantly. He was +absorbed in the role he had created for himself. As is often the +case with those gifted with an ardent imagination, though he had +long known that Moscow would be abandoned he knew it only with his +intellect, he did not believe it in his heart and did not adapt +himself mentally to this new position of affairs. + +All his painstaking and energetic activity (in how far it was useful +and had any effect on the people is another question) had been +simply directed toward arousing in the masses his own feeling of +patriotic hatred of the French. + +But when events assumed their true historical character, when +expressing hatred for the French in words proved insufficient, when it +was not even possible to express that hatred by fighting a battle, +when self-confidence was of no avail in relation to the one question +before Moscow, when the whole population streamed out of Moscow as one +man, abandoning their belongings and proving by that negative action +all the depth of their national feeling, then the role chosen by +Rostopchin suddenly appeared senseless. He unexpectedly felt himself +ridiculous, weak, and alone, with no ground to stand on. + +When, awakened from his sleep, he received that cold, peremptory +note from Kutuzov, he felt the more irritated the more he felt himself +to blame. All that he had been specially put in charge of, the state +property which he should have removed, was still in Moscow and it +was no longer possible to take the whole of it away. + +"Who is to blame for it? Who has let things come to such a pass?" he +ruminated. "Not I, of course. I had everything ready. I had Moscow +firmly in hand. And this is what they have let it come to! Villains! +Traitors!" he thought, without clearly defining who the villains and +traitors were, but feeling it necessary to hate those traitors whoever +they might be who were to blame for the false and ridiculous +position in which he found himself. + +All that night Count Rostopchin issued orders, for which people came +to him from all parts of Moscow. Those about him had never seen the +count so morose and irritable. + +"Your excellency, the Director of the Registrar's Department has +sent for instructions... From the Consistory, from the Senate, from +the University, from the Foundling Hospital, the Suffragan has sent... +asking for information.... What are your orders about the Fire +Brigade? From the governor of the prison... from the superintendent of +the lunatic asylum..." All night long such announcements were +continually being received by the count. + +To all these inquiries he gave brief and angry replies indicating +that orders from him were not now needed, that the whole affair, +carefully prepared by him, had now been ruined by somebody, and that +that somebody would have to bear the whole responsibility for all that +might happen. + +"Oh, tell that blockhead," he said in reply to the question from the +Registrar's Department, "that he should remain to guard his documents. +Now why are you asking silly questions about the Fire Brigade? They +have horses, let them be off to Vladimir, and not leave them to the +French." + +"Your excellency, the superintendent of the lunatic asylum has come: +what are your commands?" + +"My commands? Let them go away, that's all.... And let the +lunatics out into the town. When lunatics command our armies God +evidently means these other madmen to be free." + +In reply to an inquiry about the convicts in the prison, Count +Rostopchin shouted angrily at the governor: + +"Do you expect me to give you two battalions--which we have not got- +for a convoy? Release them, that's all about it!" + +"Your excellency, there are some political prisoners, Meshkov, +Vereshchagin..." + +"Vereshchagin! Hasn't he been hanged yet?" shouted Rostopchin. +"Bring him to me!" + + + + + +CHAPTER XXV + + +Toward nine o'clock in the morning, when the troops were already +moving through Moscow, nobody came to the count any more for +instructions. Those who were able to get away were going of their +own accord, those who remained behind decided for themselves what they +must do. + +The count ordered his carriage that he might drive to Sokolniki, and +sat in his study with folded hands, morose, sallow, and taciturn. + +In quiet and untroubled times it seems to every administrator that +it is only by his efforts that the whole population under his rule +is kept going, and in this consciousness of being indispensable +every administrator finds the chief reward of his labor and efforts. +While the sea of history remains calm the ruler-administrator in his +frail bark, holding on with a boat hook to the ship of the people +and himself moving, naturally imagines that his efforts move the +ship he is holding on to. But as soon as a storm arises and the sea +begins to heave and the ship to move, such a delusion is no longer +possible. The ship moves independently with its own enormous motion, +the boat hook no longer reaches the moving vessel, and suddenly the +administrator, instead of appearing a ruler and a source of power, +becomes an insignificant, useless, feeble man. + +Rostopchin felt this, and it was this which exasperated him. + +The superintendent of police, whom the crowd had stopped, went in to +see him at the same time as an adjutant who informed the count that +the horses were harnessed. They were both pale, and the superintendent +of police, after reporting that he had executed the instructions he +had received, informed the count that an immense crowd had collected +in the courtyard and wished to see him. + +Without saying a word Rostopchin rose and walked hastily to his +light, luxurious drawing room, went to the balcony door, took hold +of the handle, let it go again, and went to the window from which he +had a better view of the whole crowd. The tall lad was standing in +front, flourishing his arm and saying something with a stern look. The +blood stained smith stood beside him with a gloomy face. A drone of +voices was audible through the closed window. + +"Is my carriage ready?" asked Rostopchin, stepping back from the +window. + +"It is, your excellency," replied the adjutant. + +Rostopchin went again to the balcony door. + +"But what do they want?" he asked the superintendent of police. + +"Your excellency, they say they have got ready, according to your +orders, to go against the French, and they shouted something about +treachery. But it is a turbulent crowd, your excellency--I hardly +managed to get away from it. Your excellency, I venture to suggest..." + +"You may go. I don't need you to tell me what to do!" exclaimed +Rostopchin angrily. + +He stood by the balcony door looking at the crowd. + +"This is what they have done with Russia! This is what they have +done with me!" thought he, full of an irrepressible fury that welled +up within him against the someone to whom what was happening might +be attributed. As often happens with passionate people, he was +mastered by anger but was still seeking an object on which to vent it. +"Here is that mob, the dregs of the people," he thought as he gazed at +the crowd: "this rabble they have roused by their folly! They want a +victim," he thought as he looked at the tall lad flourishing his +arm. And this thought occurred to him just because he himself +desired a victim, something on which to vent his rage. + +"Is the carriage ready?" he asked again. + +"Yes, your excellency. What are your orders about Vereshchagin? He +is waiting at the porch," said the adjutant. + +"Ah!" exclaimed Rostopchin, as if struck by an unexpected +recollection. + +And rapidly opening the door he went resolutely out onto the +balcony. The talking instantly ceased, hats and caps were doffed, +and all eyes were raised to the count. + +"Good morning, lads!" said the count briskly and loudly. "Thank +you for coming. I'll come out to you in a moment, but we must first +settle with the villain. We must punish the villain who has caused the +ruin of Moscow. Wait for me!" + +And the count stepped as briskly back into the room and slammed +the door behind him. + +A murmur of approbation and satisfaction ran through the crowd. +"He'll settle with all the villains, you'll see! And you said the +French... He'll show you what law is!" the mob were saying as if +reproving one another for their lack of confidence. + +A few minutes later an officer came hurriedly out of the front door, +gave an order, and the dragoons formed up in line. The crowd moved +eagerly from the balcony toward the porch. Rostopchin, coming out +there with quick angry steps, looked hastily around as if seeking +someone. + +"Where is he?" he inquired. And as he spoke he saw a young man +coming round the corner of the house between two dragoons. He had a +long thin neck, and his head, that had been half shaved, was again +covered by short hair. This young man was dressed in a threadbare blue +cloth coat lined with fox fur, that had once been smart, and dirty +hempen convict trousers, over which were pulled his thin, dirty, +trodden-down boots. On his thin, weak legs were heavy chains which +hampered his irresolute movements. + +"Ah!" said Rostopchin, hurriedly turning away his eyes from the +young man in the fur-lined coat and pointing to the bottom step of the +porch. "Put him there." + +The young man in his clattering chains stepped clumsily to the +spot indicated, holding away with one finger the coat collar which +chafed his neck, turned his long neck twice this way and that, sighed, +and submissively folded before him his thin hands, unused to work. + +For several seconds while the young man was taking his place on +the step the silence continued. Only among the back rows of the +people, who were all pressing toward the one spot, could sighs, +groans, and the shuffling of feet be heard. + +While waiting for the young man to take his place on the step +Rostopchin stood frowning and rubbing his face with his hand. + +"Lads!" said he, with a metallic ring in his voice. "This man, +Vereshchagin, is the scoundrel by whose doing Moscow is perishing." + +The young man in the fur-lined coat, stooping a little, stood in a +submissive attitude, his fingers clasped before him. His emaciated +young face, disfigured by the half-shaven head, hung down +hopelessly. At the count's first words he raised it slowly and +looked up at him as if wishing to say something or at least to meet +his eye. But Rostopchin did not look at him. A vein in the young man's +long thin neck swelled like a cord and went blue behind the ear, and +suddenly his face flushed. + +All eyes were fixed on him. He looked at the crowd, and rendered +more hopeful by the expression he read on the faces there, he smiled +sadly and timidly, and lowering his head shifted his feet on the step. + +"He has betrayed his Tsar and his country, he had gone over to +Bonaparte. He alone of all the Russians has disgraced the Russian +name, he has caused Moscow to perish," said Rostopchin in a sharp, +even voice, but suddenly he glanced down at Vereshchagin who continued +to stand in the same submissive attitude. As if inflamed by the sight, +he raised his arm and addressed the people, almost shouting: + +"Deal with him as you think fit! I hand him over to you." + +The crowd remained silent and only pressed closer and closer to +one another. To keep one another back, to breathe in that stifling +atmosphere, to be unable to stir, and to await something unknown, +uncomprehended, and terrible, was becoming unbearable. Those +standing in front, who had seen and heard what had taken place +before them, all stood with wide open eyes and mouths, straining +with all their strength, and held back the crowd that was pushing +behind them. + +"Beat him!... Let the traitor perish and not disgrace the Russian +name!" shouted Rostopchin. "Cut him down. I command it." + +Hearing not so much the words as the angry tone of Rostopchin's +voice, the crowd moaned and heaved forward, but again paused. + +"Count!" exclaimed the timid yet theatrical voice of Vereshchagin in +the midst of the momentary silence that ensued, "Count! One God is +above us both...." He lifted his head and again the thick vein in +his thin neck filled with blood and the color rapidly came and went in +his face. + +He did not finish what he wished to say. + +"Cut him down! I command it..." shouted Rostopchin, suddenly growing +pale like Vereshchagin. + +"Draw sabers!" cried the dragoon officer, drawing his own. + +Another still stronger wave flowed through the crowd and reaching +the front ranks carried it swaying to the very steps of the porch. The +tall youth, with a stony look on his face, and rigid and uplifted arm, +stood beside Vereshchagin. + +"Saber him!" the dragoon officer almost whispered. + +And one of the soldiers, his face all at once distorted with fury, +struck Vereshchagin on the head with the blunt side of his saber. + +"Ah!" cried Vereshchagin in meek surprise, looking round with a +frightened glance as if not understanding why this was done to him. +A similar moan of surprise and horror ran through the crowd. "O Lord!" +exclaimed a sorrowful voice. + +But after the exclamation of surprise that had escaped from +Vereshchagin he uttered a plaintive cry of pain, and that cry was +fatal. The barrier of human feeling, strained to the utmost, that +had held the crowd in check suddenly broke. The crime had begun and +must now be completed. The plaintive moan of reproach was drowned by +the threatening and angry roar of the crowd. Like the seventh and last +wave that shatters a ship, that last irresistible wave burst from +the rear and reached the front ranks, carrying them off their feet and +engulfing them all. The dragoon was about to repeat his blow. +Vereshchagin with a cry of horror, covering his head with his hands, +rushed toward the crowd. The tall youth, against whom he stumbled, +seized his thin neck with his hands and, yelling wildly, fell with him +under the feet of the pressing, struggling crowd. + +Some beat and tore at Vereshchagin, others at the tall youth. And +the screams of those that were being trampled on and of those who +tried to rescue the tall lad only increased the fury of the crowd. +It was a long time before the dragoons could extricate the bleeding +youth, beaten almost to death. And for a long time, despite the +feverish haste with which the mob tried to end the work that had +been begun, those who were hitting, throttling, and tearing at +Vereshchagin were unable to kill him, for the crowd pressed from all +sides, swaying as one mass with them in the center and rendering it +impossible for them either to kill him or let him go. + +"Hit him with an ax, eh!... Crushed?... Traitor, he sold +Christ.... Still alive... tenacious... serves him right! Torture +serves a thief right. Use the hatchet!... What--still alive?" + +Only when the victim ceased to struggle and his cries changed to a +long-drawn, measured death rattle did the crowd around his +prostrate, bleeding corpse begin rapidly to change places. Each one +came up, glanced at what had been done, and with horror, reproach, and +astonishment pushed back again. + +"O Lord! The people are like wild beasts! How could he be alive?" +voices in the crowd could be heard saying. "Quite a young fellow +too... must have been a merchant's son. What men!... and they say he's +not the right one.... How not the right one?... O Lord! And there's +another has been beaten too--they say he's nearly done for.... Oh, the +people... Aren't they afraid of sinning?..." said the same mob now, +looking with pained distress at the dead body with its long, thin, +half-severed neck and its livid face stained with blood and dust. + +A painstaking police officer, considering the presence of a corpse +in his excellency's courtyard unseemly, told the dragoons to take it +away. Two dragoons took it by its distorted legs and dragged it +along the ground. The gory, dust-stained, half-shaven head with its +long neck trailed twisting along the ground. The crowd shrank back +from it. + +At the moment when Vereshchagin fell and the crowd closed in with +savage yells and swayed about him, Rostopchin suddenly turned pale +and, instead of going to the back entrance where his carriage +awaited him, went with hurried steps and bent head, not knowing +where and why, along the passage leading to the rooms on the ground +floor. The count's face was white and he could not control the +feverish twitching of his lower jaw. + + +"This way, your excellency... Where are you going?... This way, +please..." said a trembling, frightened voice behind him. + +Count Rostopchin was unable to reply and, turning obediently, went +in the direction indicated. At the back entrance stood his caleche. +The distant roar of the yelling crowd was audible even there. He +hastily took his seat and told the coachman to drive him to his +country house in Sokolniki. + +When they reached the Myasnitski Street and could no longer hear the +shouts of the mob, the count began to repent. He remembered with +dissatisfaction the agitation and fear he had betrayed before his +subordinates. "The mob is terrible--disgusting," he said to himself in +French. "They are like wolves whom nothing but flesh can appease." +"Count! One God is above us both!"--Vereshchagin's words suddenly +recurred to him, and a disagreeable shiver ran down his back. But this +was only a momentary feeling and Count Rostopchin smiled +disdainfully at himself. "I had other duties," thought he. "The people +had to be appeased. Many other victims have perished and are perishing +for the public good"--and he began thinking of his social duties to +his family and to the city entrusted to him, and of himself--not +himself as Theodore Vasilyevich Rostopchin (he fancied that Theodore +Vasilyevich Rostopchin was sacrificing himself for the public good) +but himself as governor, the representative of authority and of the +Tsar. "Had I been simply Theodore Vasilyevich my course of action +would have been quite different, but it was my duty to safeguard my +life and dignity as commander in chief." + +Lightly swaying on the flexible springs of his carriage and no +longer hearing the terrible sounds of the crowd, Rostopchin grew +physically calm and, as always happens, as soon as he became +physically tranquil his mind devised reasons why he should be mentally +tranquil too. The thought which tranquillized Rostopchin was not a new +one. Since the world began and men have killed one another no one +has ever committed such a crime against his fellow man without +comforting himself with this same idea. This idea is le bien public, +the hypothetical welfare of other people. + +To a man not swayed by passion that welfare is never certain, but he +who commits such a crime always knows just where that welfare lies. +And Rostopchin now knew it. + +Not only did his reason not reproach him for what he had done, but +he even found cause for self-satisfaction in having so successfully +contrived to avail himself of a convenient opportunity to punish a +criminal and at the same time pacify the mob. + +"Vereshchagin was tried and condemned to death," thought +Rostopchin (though the Senate had only condemned Vereshchagin to +hard labor), "he was a traitor and a spy. I could not let him go +unpunished and so I have killed two birds with one stone: to appease +the mob I gave them a victim and at the same time punished a +miscreant." + +Having reached his country house and begun to give orders about +domestic arrangements, the count grew quite tranquil. + +Half an hour later he was driving with his fast horses across the +Sokolniki field, no longer thinking of what had occurred but +considering what was to come. He was driving to the Yauza bridge where +he had heard that Kutuzov was. Count Rostopchin was mentally preparing +the angry and stinging reproaches he meant to address to Kutuzov for +his deception. He would make that foxy old courtier feel that the +responsibility for all the calamities that would follow the +abandonment of the city and the ruin of Russia (as Rostopchin regarded +it) would fall upon his doting old head. Planning beforehand what he +would say to Kutuzov, Rostopchin turned angrily in his caleche and +gazed sternly from side to side. + +The Sokolniki field was deserted. Only at the end of it, in front of +the almshouse and the lunatic asylum, could be seen some people in +white and others like them walking singly across the field shouting +and gesticulating. + +One of these was running to cross the path of Count Rostopchin's +carriage, and the count himself, his coachman, and his dragoons looked +with vague horror and curiosity at these released lunatics and +especially at the one running toward them. + +Swaying from side to side on his long, thin legs in his fluttering +dressing gown, this lunatic was running impetuously, his gaze fixed on +Rostopchin, shouting something in a hoarse voice and making signs to +him to stop. The lunatic's solemn, gloomy face was thin and yellow, +with its beard growing in uneven tufts. His black, agate pupils with +saffron-yellow whites moved restlessly near the lower eyelids. + +"Stop! Pull up, I tell you!" he cried in a piercing voice, and again +shouted something breathlessly with emphatic intonations and gestures. + +Coming abreast of the caleche he ran beside it. + +"Thrice have they slain me, thrice have I risen from the dead. +They stoned me, crucified me... I shall rise... shall rise... shall +rise. They have torn my body. The kingdom of God will be overthrown... +Thrice will I overthrow it and thrice re-establish it!" he cried, +raising his voice higher and higher. + +Count Rostopchin suddenly grew pale as he had done when the crowd +closed in on Vereshchagin. He turned away. "Go fas... faster!" he +cried in a trembling voice to his coachman. The caleche flew over +the ground as fast as the horses could draw it, but for a long time +Count Rostopchin still heard the insane despairing screams growing +fainter in the distance, while his eyes saw nothing but the +astonished, frightened, bloodstained face of "the traitor" in the +fur-lined coat. + +Recent as that mental picture was, Rostopchin already felt that it +had cut deep into his heart and drawn blood. Even now he felt +clearly that the gory trace of that recollection would not pass with +time, but that the terrible memory would, on the contrary, dwell in +his heart ever more cruelly and painfully to the end of his life. He +seemed still to hear the sound of his own words: "Cut him down! I +command it...." + +"Why did I utter those words? It was by some accident I said +them.... I need not have said them," he thought. "And then nothing +would have happened." He saw the frightened and then infuriated face +of the dragoon who dealt the blow, the look of silent, timid +reproach that boy in the fur-lined coat had turned upon him. "But I +did not do it for my own sake. I was bound to act that way.... The +mob, the traitor... the public welfare," thought he. + +Troops were still crowding at the Yauza bridge. It was hot. Kutuzov, +dejected and frowning, sat on a bench by the bridge toying with his +whip in the sand when a caleche dashed up noisily. A man in a +general's uniform with plumes in his hat went up to Kutuzov and said +something in French. It was Count Rostopchin. He told Kutuzov that +he had come because Moscow, the capital, was no more and only the army +remained. + +"Things would have been different if your Serene Highness had not +told me that you would not abandon Moscow without another battle; +all this would not have happened," he said. + +Kutuzov looked at Rostopchin as if, not grasping what was said to +him, he was trying to read something peculiar written at that moment +on the face of the man addressing him. Rostopchin grew confused and +became silent. Kutuzov slightly shook his head and not taking his +penetrating gaze from Rostopchin's face muttered softly: + +"No! I shall not give up Moscow without a battle!" + +Whether Kutuzov was thinking of something entirely different when he +spoke those words, or uttered them purposely, knowing them to be +meaningless, at any rate Rostopchin made no reply and hastily left +him. And strange to say, the Governor of Moscow, the proud Count +Rostopchin, took up a Cossack whip and went to the bridge where he +began with shouts to drive on the carts that blocked the way. + + + + + +CHAPTER XXVI + + +Toward four o'clock in the afternoon Murat's troops were entering +Moscow. In front rode a detachment of Wurttemberg hussars and behind +them rode the King of Naples himself accompanied by a numerous suite. + +About the middle of the Arbat Street, near the Church of the +Miraculous Icon of St. Nicholas, Murat halted to await news from the +advanced detachment as to the condition in which they had found the +citadel, le Kremlin. + +Around Murat gathered a group of those who had remained in Moscow. +They all stared in timid bewilderment at the strange, long-haired +commander dressed up in feathers and gold. + +"Is that their Tsar himself? He's not bad!" low voices could be +heard saying. + +An interpreter rode up to the group. + +"Take off your cap... your caps!" These words went from one to +another in the crowd. The interpreter addressed an old porter and +asked if it was far to the Kremlin. The porter, listening in +perplexity to the unfamiliar Polish accent and not realizing that +the interpreter was speaking Russian, did not understand what was +being said to him and slipped behind the others. + +Murat approached the interpreter and told him to ask where the +Russian army was. One of the Russians understood what was asked and +several voices at once began answering the interpreter. A French +officer, returning from the advanced detachment, rode up to Murat +and reported that the gates of the citadel had been barricaded and +that there was probably an ambuscade there. + +"Good!" said Murat and, turning to one of the gentlemen in his +suite, ordered four light guns to be moved forward to fire at the +gates. + +The guns emerged at a trot from the column following Murat and +advanced up the Arbat. When they reached the end of the Vozdvizhenka +Street they halted and drew in the Square. Several French officers +superintended the placing of the guns and looked at the Kremlin +through field glasses. + +The bells in the Kremlin were ringing for vespers, and this sound +troubled the French. They imagined it to be a call to arms. A few +infantrymen ran to the Kutafyev Gate. Beams and wooden screens had +been put there, and two musket shots rang out from under the gate as +soon as an officer and men began to run toward it. A general who was +standing by the guns shouted some words of command to the officer, and +the latter ran back again with his men. + +The sound of three more shots came from the gate. + +One shot struck a French soldier's foot, and from behind the screens +came the strange sound of a few voices shouting. Instantly as at a +word of command the expression of cheerful serenity on the faces of +the French general, officers, and men changed to one of determined +concentrated readiness for strife and suffering. To all of them from +the marshal to the least soldier, that place was not the Vozdvizhenka, +Mokhavaya, or Kutafyev Street, nor the Troitsa Gate (places familiar +in Moscow), but a new battlefield which would probably prove +sanguinary. And all made ready for that battle. The cries from the +gates ceased. The guns were advanced, the artillerymen blew the ash +off their linstocks, and an officer gave the word "Fire!" This was +followed by two whistling sounds of canister shot, one after +another. The shot rattled against the stone of the gate and upon the +wooden beams and screens, and two wavering clouds of smoke rose over +the Square. + +A few instants after the echo of the reports resounding over the +stone-built Kremlin had died away the French heard a strange sound +above their head. Thousands of crows rose above the walls and +circled in the air, cawing and noisily flapping their wings. +Together with that sound came a solitary human cry from the gateway +and amid the smoke appeared the figure of a bareheaded man in a +peasant's coat. He grasped a musket and took aim at the French. +"Fire!" repeated the officer once more, and the reports of a musket +and of two cannon shots were heard simultaneously. The gate again +hidden by smoke. + +Nothing more stirred behind the screens and the French infantry +soldiers and officers advanced to the gate. In the gateway lay three +wounded and four dead. Two men in peasant coats ran away at the foot +of the wall, toward the Znamenka. + +"Clear that away!" said the officer, pointing to the beams and the +corpses, and the French soldiers, after dispatching the wounded, threw +the corpses over the parapet. + +Who these men were nobody knew. "Clear that away!" was all that +was said of them, and they were thrown over the parapet and removed +later on that they might not stink. Thiers alone dedicates a few +eloquent lines to their memory: "These wretches had occupied the +sacred citadel, having supplied themselves with guns from the arsenal, +and fired" (the wretches) "at the French. Some of them were sabered +and the Kremlin was purged of their presence." + +Murat was informed that the way had been cleared. The French entered +the gates and began pitching their camp in the Senate Square. Out of +the windows of the Senate House the soldiers threw chairs into the +Square for fuel and kindled fires there. + +Other detachments passed through the Kremlin and encamped along +the Moroseyka, the Lubyanka, and Pokrovka Streets. Others quartered +themselves along the Vozdvizhenka, the Nikolski, and the Tverskoy +Streets. No masters of the houses being found anywhere, the French +were not billeted on the inhabitants as is usual in towns but lived in +it as in a camp. + +Though tattered, hungry, worn out, and reduced to a third of their +original number, the French entered Moscow in good marching order. +It was a weary and famished, but still a fighting and menacing army. +But it remained an army only until its soldiers had dispersed into +their different lodgings. As soon as the men of the various +regiments began to disperse among the wealthy and deserted houses, the +army was lost forever and there came into being something nondescript, +neither citizens nor soldiers but what are known as marauders. When +five weeks later these same men left Moscow, they no longer formed +an army. They were a mob of marauders, each carrying a quantity of +articles which seemed to him valuable or useful. The aim of each man +when he left Moscow was no longer, as it had been, to conquer, but +merely to keep what he had acquired. Like a monkey which puts its +paw into the narrow neck of a jug, and having seized a handful of nuts +will not open its fist for fear of losing what it holds, and therefore +perishes, the French when they left Moscow had inevitably to perish +because they carried their loot with them, yet to abandon what they +had stolen was as impossible for them as it is for the monkey to +open its paw and let go of its nuts. Ten minutes after each regiment +had entered a Moscow district, not a soldier or officer was left. +Men in military uniforms and Hessian boots could be seen through the +windows, laughing and walking through the rooms. In cellars and +storerooms similar men were busy among the provisions, and in the +yards unlocking or breaking open coach house and stable doors, +lighting fires in kitchens and kneading and baking bread with +rolled-up sleeves, and cooking; or frightening, amusing, or +caressing women and children. There were many such men both in the +shops and houses--but there was no army. + +Order after order was issued by the French commanders that day +forbidding the men to disperse about the town, sternly forbidding +any violence to the inhabitants or any looting, and announcing a +roll call for that very evening. But despite all these measures the +men, who had till then constituted an army, flowed all over the +wealthy, deserted city with its comforts and plentiful supplies. As +a hungry herd of cattle keeps well together when crossing a barren +field, but gets out of hand and at once disperses uncontrollably as +soon as it reaches rich pastures, so did the army disperse all over +the wealthy city. + +No residents were left in Moscow, and the soldiers--like water +percolating through sand--spread irresistibly through the city in +all directions from the Kremlin into which they had first marched. The +cavalry, on entering a merchant's house that had been abandoned and +finding there stabling more than sufficient for their horses, went on, +all the same, to the next house which seemed to them better. Many of +them appropriated several houses, chalked their names on them, and +quarreled and even fought with other companies for them. Before they +had had time to secure quarters the soldiers ran out into the +streets to see the city and, hearing that everything had been +abandoned, rushed to places where valuables were to be had for the +taking. The officers followed to check the soldiers and were +involuntarily drawn into doing the same. In Carriage Row carriages had +been left in the shops, and generals flocked there to select +caleches and coaches for themselves. The few inhabitants who had +remained invited commanding officers to their houses, hoping thereby +to secure themselves from being plundered. There were masses of wealth +and there seemed no end to it. All around the quarters occupied by the +French were other regions still unexplored and unoccupied where, +they thought, yet greater riches might be found. And Moscow engulfed +the army ever deeper and deeper. When water is spilled on dry ground +both the dry ground and the water disappear and mud results; and in +the same way the entry of the famished army into the rich and deserted +city resulted in fires and looting and the destruction of both the +army and the wealthy city. + + +The French attributed the Fire of Moscow au patriotisme feroce de +Rostopchine,* the Russians to the barbarity of the French. In reality, +however, it was not, and could not be, possible to explain the burning +of Moscow by making any individual, or any group of people, +responsible for it. Moscow was burned because it found itself in a +position in which any town built of wood was bound to burn, quite +apart from whether it had, or had not, a hundred and thirty inferior +fire engines. Deserted Moscow had to burn as inevitably as a heap of +shavings has to burn on which sparks continually fall for several +days. A town built of wood, where scarcely a day passes without +conflagrations when the house owners are in residence and a police +force is present, cannot help burning when its inhabitants have left +it and it is occupied by soldiers who smoke pipes, make campfires of +the Senate chairs in the Senate Square, and cook themselves meals +twice a day. In peacetime it is only necessary to billet troops in the +villages of any district and the number of fires in that district +immediately increases. How much then must the probability of fire be +increased in an abandoned, wooden town where foreign troops are +quartered. "Le patriotisme feroce de Rostopchine" and the barbarity of +the French were not to blame in the matter. Moscow was set on fire +by the soldiers' pipes, kitchens, and campfires, and by the +carelessness of enemy soldiers occupying houses they did not own. Even +if there was any arson (which is very doubtful, for no one had any +reason to burn the houses--in any case a troublesome and dangerous +thing to do), arson cannot be regarded as the cause, for the same +thing would have happened without any incendiarism. + + +*To Rostopchin's ferocious patriotism. + + +However tempting it might be for the French to blame Rostopchin's +ferocity and for Russians to blame the scoundrel Bonaparte, or later +on to place an heroic torch in the hands of their own people, it is +impossible not to see that there could be no such direct cause of +the fire, for Moscow had to burn as every village, factory, or house +must burn which is left by its owners and in which strangers are +allowed to live and cook their porridge. Moscow was burned by its +inhabitants, it is true, but by those who had abandoned it and not +by those who remained in it. Moscow when occupied by the enemy did not +remain intact like Berlin, Vienna, and other towns, simply because its +inhabitants abandoned it and did not welcome the French with bread and +salt, nor bring them the keys of the city. + + + + + +CHAPTER XXVII + + +The absorption of the French by Moscow, radiating starwise as it +did, only reached the quarter where Pierre was staying by the +evening of the second of September. + +After the last two days spent in solitude and unusual circumstances, +Pierre was in a state bordering on insanity. He was completely +obsessed by one persistent thought. He did not know how or when this +thought had taken such possession of him, but he remembered nothing of +the past, understood nothing of the present, and all he saw and +heard appeared to him like a dream. + +He had left home only to escape the intricate tangle of life's +demands that enmeshed him, and which in his present condition he was +unable to unravel. He had gone to Joseph Alexeevich's house, on the +plea of sorting the deceased's books and papers, only in search of +rest from life's turmoil, for in his mind the memory of Joseph +Alexeevich was connected with a world of eternal, solemn, and calm +thoughts, quite contrary to the restless confusion into which he +felt himself being drawn. He sought a quiet refuge, and in Joseph +Alexeevich's study he really found it. When he sat with his elbows +on the dusty writing table in the deathlike stillness of the study, +calm and significant memories of the last few days rose one after +another in his imagination, particularly of the battle of Borodino and +of that vague sense of his own insignificance and insincerity compared +with the truth, simplicity, and strength of the class of men he +mentally classed as they. When Gerasim roused him from his reverie the +idea occurred to him of taking part in the popular defense of Moscow +which he knew was projected. And with that object he had asked Gerasim +to get him a peasant's coat and a pistol, confiding to him his +intentions of remaining in Joseph Alexeevich's house and keeping his +name secret. Then during the first day spent in inaction and +solitude (he tried several times to fix his attention on the Masonic +manuscripts, but was unable to do so) the idea that had previously +occurred to him of the cabalistic significance of his name in +connection with Bonaparte's more than once vaguely presented itself. +But the idea that he, L'russe Besuhof, was destined to set a limit +to the power of the Beast was as yet only one of the fancies that +often passed through his mind and left no trace behind. + +When, having bought the coat merely with the object of taking part +among the people in the defense of Moscow, Pierre had met the +Rostovs and Natasha had said to him: "Are you remaining in +Moscow?... How splendid!" the thought flashed into his mind that it +really would be a good thing, even if Moscow were taken, for him to +remain there and do what he was predestined to do. + +Next day, with the sole idea of not sparing himself and not +lagging in any way behind them, Pierre went to the Three Hills gate. +But when he returned to the house convinced that Moscow would not be +defended, he suddenly felt that what before had seemed to him merely a +possibility had now become absolutely necessary and inevitable. He +must remain in Moscow, concealing his name, and must meet Napoleon and +kill him, and either perish or put an end to the misery of all Europe- +which it seemed to him was solely due to Napoleon. + +Pierre knew all the details of the attempt on Bonaparte's life in +1809 by a German student in Vienna, and knew that the student had been +shot. And the risk to which he would expose his life by carrying out +his design excited him still more. + +Two equally strong feelings drew Pierre irresistibly to this +purpose. The first was a feeling of the necessity of sacrifice and +suffering in view of the common calamity, the same feeling that had +caused him to go to Mozhaysk on the twenty-fifth and to make his way +to the very thick of the battle and had now caused him to run away +from his home and, in place of the luxury and comfort to which he +was accustomed, to sleep on a hard sofa without undressing and eat the +same food as Gerasim. The other was that vague and quite Russian +feeling of contempt for everything conventional, artificial, and +human--for everything the majority of men regard as the greatest +good in the world. Pierre had first experienced this strange and +fascinating feeling at the Sloboda Palace, when he had suddenly felt +that wealth, power, and life--all that men so painstakingly acquire +and guard--if it has any worth has so only by reason the joy with +which it can all be renounced. + +It was the feeling that induces a volunteer recruit to spend his +last penny on drink, and a drunken man to smash mirrors or glasses for +no apparent reason and knowing that it will cost him all the money +he possesses: the feeling which causes a man to perform actions +which from an ordinary point of view are insane, to test, as it +were, his personal power and strength, affirming the existence of a +higher, nonhuman criterion of life. + +From the very day Pierre had experienced this feeling for the +first time at the Sloboda Palace he had been continuously under its +influence, but only now found full satisfaction for it. Moreover, at +this moment Pierre was supported in his design and prevented from +renouncing it by what he had already done in that direction. If he +were now to leave Moscow like everyone else, his flight from home, the +peasant coat, the pistol, and his announcement to the Rostovs that +he would remain in Moscow would all become not merely meaningless +but contemptible and ridiculous, and to this Pierre was very +sensitive. + +Pierre's physical condition, as is always the case, corresponded +to his mental state. The unaccustomed coarse food, the vodka he +drank during those days, the absence of wine and cigars, his dirty +unchanged linen, two almost sleepless nights passed on a short sofa +without bedding--all this kept him in a state of excitement +bordering on insanity. + +It was two o'clock in the afternoon. The French had already +entered Moscow. Pierre knew this, but instead of acting he only +thought about his undertaking, going over its minutest details in +his mind. In his fancy he did not clearly picture to himself either +the striking of the blow or the death of Napoleon, but with +extraordinary vividness and melancholy enjoyment imagined his own +destruction and heroic endurance. + +"Yes, alone, for the sake of all, I must do it or perish!" he +thought. "Yes, I will approach... and then suddenly... with pistol +or dagger? But that is all the same! 'It is not I but the hand of +Providence that punishes thee,' I shall say," thought he, imagining +what he would say when killing Napoleon. "Well then, take me and +execute me!" he went on, speaking to himself and bowing his head +with a sad but firm expression. + +While Pierre, standing in the middle of the room, was talking to +himself in this way, the study door opened and on the threshold +appeared the figure of Makar Alexeevich, always so timid before but +now quite transformed. + +His dressing gown was unfastened, his face red and distorted. He was +obviously drunk. On seeing Pierre he grew confused at first, but +noticing embarrassment on Pierre's face immediately grew bold and, +staggering on his thin legs, advanced into the middle of the room. + +"They're frightened," he said confidentially in a hoarse voice. "I +say I won't surrender, I say... Am I not right, sir?" + +He paused and then suddenly seeing the pistol on the table seized it +with unexpected rapidity and ran out into the corridor. + +Gerasim and the porter, who had followed Makar Alexeevich, stopped +him in the vestibule and tried to take the pistol from him. Pierre, +coming out into the corridor, looked with pity and repulsion at the +half-crazy old man. Makar Alexeevich, frowning with exertion, held +on to the pistol and screamed hoarsely, evidently with some heroic +fancy in his head. + +"To arms! Board them! No, you shan't get it," he yelled. + +"That will do, please, that will do. Have the goodness--please, sir, +to let go! Please, sir..." pleaded Gerasim, trying carefully to +steer Makar Alexeevich by the elbows back to the door. + +"Who are you? Bonaparte!..." shouted Makar Alexeevich. + +"That's not right, sir. Come to your room, please, and rest. Allow +me to have the pistol." + +"Be off, thou base slave! Touch me not! See this?" shouted Makar +Alexeevich, brandishing the pistol. "Board them!" + +"Catch hold!" whispered Gerasim to the porter. + +They seized Makar Alexeevich by the arms and dragged him to the +door. + +The vestibule was filled with the discordant sounds of a struggle +and of a tipsy, hoarse voice. + +Suddenly a fresh sound, a piercing feminine scream, reverberated +from the porch and the cook came running into the vestibule. + +"It's them! Gracious heavens! O Lord, four of them, horsemen!" she +cried. + +Gerasim and the porter let Makar Alexeevich go, and in the now +silent corridor the sound of several hands knocking at the front +door could be heard. + + + + + +CHAPTER XXVIII + + +Pierre, having decided that until he had carried out his design he +would disclose neither his identity nor his knowledge of French, stood +at the half-open door of the corridor, intending to conceal himself as +soon as the French entered. But the French entered and still Pierre +did not retire--an irresistible curiosity kept him there. + +There were two of them. One was an officer--a tall, soldierly, +handsome man--the other evidently a private or an orderly, +sunburned, short, and thin, with sunken cheeks and a dull +expression. The officer walked in front, leaning on a stick and +slightly limping. When he had advanced a few steps he stopped, +having apparently decided that these were good quarters, turned +round to the soldiers standing at the entrance, and in a loud voice of +command ordered them to put up the horses. Having done that, the +officer, lifting his elbow with a smart gesture, stroked his +mustache and lightly touched his hat. + +"Bonjour, la compagnie!"* said he gaily, smiling and looking about +him. + + +*"Good day, everybody!" + + +No one gave any reply. + +"Vous etes le bourgeois?"* the officer asked Gerasim. + + +*"Are you the master here?" + + +Gerasim gazed at the officer with an alarmed and inquiring look. + +"Quartier, quartier, logement!" said the officer, looking down at +the little man with a condescending and good-natured smile. "Les +francais sont de bons enfants. Que diable! Voyons! Ne nous fachons +pas, mon vieux!"* added he, clapping the scared and silent Gerasim +on the shoulder. "Well, does no one speak French in this +establishment?" he asked again in French, looking around and meeting +Pierre's eyes. Pierre moved away from the door. + + +*"Quarters, quarters, lodgings! The French are good fellows. What +the devil! There, don't let us be cross, old fellow!" + + +Again the officer turned to Gerasim and asked him to show him the +rooms in the house. + +"Master, not here--don't understand... me, you..." said Gerasim, +trying to render his words more comprehensible by contorting them. + +Still smiling, the French officer spread out his hands before +Gerasim's nose, intimating that he did not understand him either, +and moved, limping, to the door at which Pierre was standing. Pierre +wished to go away and conceal himself, but at that moment he saw Makar +Alexeevich appearing at the open kitchen door with the pistol in his +hand. With a madman's cunning, Makar Alexeevich eyed the Frenchman, +raised his pistol, and took aim. + +"Board them!" yelled the tipsy man, trying to press the trigger. +Hearing the yell the officer turned round, and at the same moment +Pierre threw himself on the drunkard. Just when Pierre snatched at and +struck up the pistol Makar Alexeevich at last got his fingers on the +trigger, there was a deafening report, and all were enveloped in a +cloud of smoke. The Frenchman turned pale and rushed to the door. + +Forgetting his intention of concealing his knowledge of French, +Pierre, snatching away the pistol and throwing it down, ran up to +the officer and addressed him in French. + +"You are not wounded?" he asked. + +"I think not," answered the Frenchman, feeling himself over. "But +I have had a lucky escape this time," he added, pointing to the +damaged plaster of the wall. "Who is that man?" said he, looking +sternly at Pierre. + +"Oh, I am really in despair at what has occurred," said Pierre +rapidly, quite forgetting the part he had intended to play. "He is +an unfortunate madman who did not know what he was doing." + +The officer went up to Makar Alexeevich and took him by the collar. + +Makar Alexeevich was standing with parted lips, swaying, as if about +to fall asleep, as he leaned against the wall. + +"Brigand! You shall pay for this," said the Frenchman, letting go of +him. "We French are merciful after victory, but we do not pardon +traitors," he added, with a look of gloomy dignity and a fine +energetic gesture. + +Pierre continued, in French, to persuade the officer not to hold +that drunken imbecile to account. The Frenchman listened in silence +with the same gloomy expression, but suddenly turned to Pierre with +a smile. For a few seconds he looked at him in silence. His handsome +face assumed a melodramatically gentle expression and he held out +his hand. + +"You have saved my life. You are French," said he. + +For a Frenchman that deduction was indubitable. Only a Frenchman +could perform a great deed, and to save his life--the life of M. +Ramballe, captain of the 13th Light Regiment--was undoubtedly a very +great deed. + +But however indubitable that conclusion and the officer's conviction +based upon it, Pierre felt it necessary to disillusion him. + +"I am Russian," he said quickly. + +"Tut, tut, tut! Tell that to others," said the officer, waving his +finger before his nose and smiling. "You shall tell me all about +that presently. I am delighted to meet a compatriot. Well, and what +are we to do with this man?" he added, addressing himself to Pierre as +to a brother. + +Even if Pierre were not a Frenchman, having once received that +loftiest of human appellations he could not renounce it, said the +officer's look and tone. In reply to his last question Pierre again +explained who Makar Alexeevich was and how just before their arrival +that drunken imbecile had seized the loaded pistol which they had +not had time to recover from him, and begged the officer to let the +deed go unpunished. + +The Frenchman expanded his chest and made a majestic gesture with +his arm. + +"You have saved my life! You are French. You ask his pardon? I grant +it you. Lead that man away!" said he quickly and energetically, and +taking the arm of Pierre whom he had promoted to be a Frenchman for +saving his life, he went with him into the room. + +The soldiers in the yard, hearing the shot, came into the passage +asking what had happened, and expressed their readiness to punish +the culprits, but the officer sternly checked them. + +"You will be called in when you are wanted," he said. + +The soldiers went out again, and the orderly, who had meanwhile +had time to visit the kitchen, came up to his officer. + +"Captain, there is soup and a leg of mutton in the kitchen," said +he. "Shall I serve them up?" + +"Yes, and some wine," answered the captain. + + + + + +CHAPTER XXIX + + +When the French officer went into the room with Pierre the latter +again thought it his duty to assure him that he was not French and +wished to go away, but the officer would not hear of it. He was so +very polite, amiable, good-natured, and genuinely grateful to Pierre +for saving his life that Pierre had not the heart to refuse, and sat +down with him in the parlor--the first room they entered. To +Pierre's assurances that he was not a Frenchman, the captain, +evidently not understanding how anyone could decline so flattering +an appellation, shrugged his shoulders and said that if Pierre +absolutely insisted on passing for a Russian let it be so, but for all +that he would be forever bound to Pierre by gratitude for saving his +life. + +Had this man been endowed with the slightest capacity for perceiving +the feelings of others, and had he at all understood what Pierre's +feelings were, the latter would probably have left him, but the +man's animated obtuseness to everything other than himself disarmed +Pierre. + +"A Frenchman or a Russian prince incognito," said the officer, +looking at Pierre's fine though dirty linen and at the ring on his +finger. "I owe my life to you and offer you my friendship. A Frenchman +never forgets either an insult or a service. I offer you my +friendship. That is all I can say." + +There was so much good nature and nobility (in the French sense of +the word) in the officer's voice, in the expression of his face and in +his gestures, that Pierre, unconsciously smiling in response to the +Frenchman's smile, pressed the hand held out to him. + +"Captain Ramballe, of the 13th Light Regiment, Chevalier of the +Legion of Honor for the affair on the seventh of September," he +introduced himself, a self-satisfied irrepressible smile puckering his +lips under his mustache. "Will you now be so good as to tell me with +whom I have the honor of conversing so pleasantly, instead of being in +the ambulance with that maniac's bullet in my body?" + +Pierre replied that he could not tell him his name and, blushing, +began to try to invent a name and to say something about his reason +for concealing it, but the Frenchman hastily interrupted him. + +"Oh, please!" said he. "I understand your reasons. You are an +officer... a superior officer perhaps. You have borne arms against us. +That's not my business. I owe you my life. That is enough for me. I am +quite at your service. You belong to the gentry?" he concluded with +a shade of inquiry in his tone. Pierre bent his head. "Your +baptismal name, if you please. That is all I ask. Monsieur Pierre, you +say.... That's all I want to know." + +When the mutton and an omelet had been served and a samovar and +vodka brought, with some wine which the French had taken from a +Russian cellar and brought with them, Ramballe invited Pierre to share +his dinner, and himself began to eat greedily and quickly like a +healthy and hungry man, munching his food rapidly with his strong +teeth, continually smacking his lips, and repeating--"Excellent! +Delicious!" His face grew red and was covered with perspiration. +Pierre was hungry and shared the dinner with pleasure. Morel, the +orderly, brought some hot water in a saucepan and placed a bottle of +claret in it. He also brought a bottle of kvass, taken from the +kitchen for them to try. That beverage was already known to the French +and had been given a special name. They called it limonade de cochon +(pig's lemonade), and Morel spoke well of the limonade de cochon he +had found in the kitchen. But as the captain had the wine they had +taken while passing through Moscow, he left the kvass to Morel and +applied himself to the bottle of Bordeaux. He wrapped the bottle up to +its neck in a table napkin and poured out wine for himself and for +Pierre. The satisfaction of his hunger and the wine rendered the +captain still more lively and he chatted incessantly all through +dinner. + +"Yes, my dear Monsieur Pierre, I owe you a fine votive candle for +saving me from that maniac.... You see, I have bullets enough in my +body already. Here is one I got at Wagram" (he touched his side) +"and a second at Smolensk"--he showed a scar on his cheek--"and this +leg which as you see does not want to march, I got that on the seventh +at the great battle of la Moskowa. Sacre Dieu! It was splendid! That +deluge of fire was worth seeing. It was a tough job you set us +there, my word! You may be proud of it! And on my honor, in spite of +the cough I caught there, I should be ready to begin again. I pity +those who did not see it." + +"I was there," said Pierre. + +"Bah, really? So much the better! You are certainly brave foes. +The great redoubt held out well, by my pipe!" continued the Frenchman. +"And you made us pay dear for it. I was at it three times--sure as I +sit here. Three times we reached the guns and three times we were +thrown back like cardboard figures. Oh, it was beautiful, Monsieur +Pierre! Your grenadiers were splendid, by heaven! I saw them close +up their ranks six times in succession and march as if on parade. Fine +fellows! Our King of Naples, who knows what's what, cried 'Bravo!' Ha, +ha! So you are one of us soldiers!" he added, smiling, after a +momentary pause. "So much the better, so much the better, Monsieur +Pierre! Terrible in battle... gallant... with the fair" (he winked and +smiled), "that's what the French are, Monsieur Pierre, aren't they?" + +The captain was so naively and good-humoredly gay, so real, and so +pleased with himself that Pierre almost winked back as he looked +merrily at him. Probably the word "gallant" turned the captain's +thoughts to the state of Moscow. + +"Apropos, tell me please, is it true that the women have all left +Moscow? What a queer idea! What had they to be afraid of?" + +"Would not the French ladies leave Paris if the Russians entered +it?" asked Pierre. + +"Ha, ha, ha!" The Frenchman emitted a merry, sanguine chuckle, +patting Pierre on the shoulder. "What a thing to say!" he exclaimed. +"Paris?... But Paris, Paris..." + +"Paris--the capital of the world," Pierre finished his remark for +him. + +The captain looked at Pierre. He had a habit of stopping short in +the middle of his talk and gazing intently with his laughing, kindly +eyes. + +"Well, if you hadn't told me you were Russian, I should have wagered +that you were Parisian! You have that... I don't know what, that..." +and having uttered this compliment, he again gazed at him in silence. + +"I have been in Paris. I spent years there," said Pierre. + +"Oh yes, one sees that plainly. Paris!... A man who doesn't know +Paris is a savage. You can tell a Parisian two leagues off. Paris is +Talma, la Duchenois, Potier, the Sorbonne, the boulevards," and +noticing that his conclusion was weaker than what had gone before, +he added quickly: "There is only one Paris in the world. You have been +to Paris and have remained Russian. Well, I don't esteem you the +less for it." + +Under the influence of the wine he had drunk, and after the days +he had spent alone with his depressing thoughts, Pierre +involuntarily enjoyed talking with this cheerful and good-natured man. + +"To return to your ladies--I hear they are lovely. What a wretched +idea to go and bury themselves in the steppes when the French army +is in Moscow. What a chance those girls have missed! Your peasants, +now--that's another thing; but you civilized people, you ought to know +us better than that. We took Vienna, Berlin, Madrid, Naples, Rome, +Warsaw, all the world's capitals.... We are feared, but we are +loved. We are nice to know. And then the Emperor..." he began, but +Pierre interrupted him. + +"The Emperor," Pierre repeated, and his face suddenly became sad and +embarrassed, "is the Emperor...?" + +"The Emperor? He is generosity, mercy, justice, order, genius- +that's what the Emperor is! It is I, Ramballe, who tell you so.... I +assure you I was his enemy eight years ago. My father was an +emigrant count.... But that man has vanquished me. He has taken hold +of me. I could not resist the sight of the grandeur and glory with +which he has covered France. When I understood what he wanted--when +I saw that he was preparing a bed of laurels for us, you know, I +said to myself: 'That is a monarch,' and I devoted myself to him! So +there! Oh yes, mon cher, he is the greatest man of the ages past or +future." + +"Is he in Moscow?" Pierre stammered with a guilty look. + +The Frenchman looked at his guilty face and smiled. + +"No, he will make his entry tomorrow," he replied, and continued his +talk. + +Their conversation was interrupted by the cries of several voices at +the gate and by Morel, who came to say that some Wurttemberg hussars +had come and wanted to put up their horses in the yard where the +captain's horses were. This difficulty had arisen chiefly because +the hussars did not understand what was said to them in French. + +The captain had their senior sergeant called in, and in a stern +voice asked him to what regiment he belonged, who was his commanding +officer, and by what right he allowed himself to claim quarters that +were already occupied. The German who knew little French, answered the +two first questions by giving the names of his regiment and of his +commanding officer, but in reply to the third question which he did +not understand said, introducing broken French into his own German, +that he was the quartermaster of the regiment and his commander had +ordered him to occupy all the houses one after another. Pierre, who +knew German, translated what the German said to the captain and gave +the captain's reply to the Wurttemberg hussar in German. When he had +understood what was said to him, the German submitted and took his men +elsewhere. The captain went out into the porch and gave some orders in +a loud voice. + +When he returned to the room Pierre was sitting in the same place as +before, with his head in his hands. His face expressed suffering. He +really was suffering at that moment. When the captain went out and +he was left alone, suddenly he came to himself and realized the +position he was in. It was not that Moscow had been taken or that +the happy conquerors were masters in it and were patronizing him. +Painful as that was it was not that which tormented Pierre at the +moment. He was tormented by the consciousness of his own weakness. The +few glasses of wine he had drunk and the conversation with this +good-natured man had destroyed the mood of concentrated gloom in which +he had spent the last few days and which was essential for the +execution of his design. The pistol, dagger, and peasant coat were +ready. Napoleon was to enter the town next day. Pierre still +considered that it would be a useful and worthy action to slay the +evildoer, but now he felt that he would not do it. He did not know +why, but he felt a foreboding that he would not carry out his +intention. He struggled against the confession of his weakness but +dimly felt that he could not overcome it and that his former gloomy +frame of mind, concerning vengeance, killing, and self-sacrifice, +had been dispersed like dust by contact with the first man he met. + +The captain returned to the room, limping slightly and whistling a +tune. + +The Frenchman's chatter which had previously amused Pierre now +repelled him. The tune he was whistling, his gait, and the gesture +with which he twirled his mustache, all now seemed offensive. "I +will go away immediately. I won't say another word to him," thought +Pierre. He thought this, but still sat in the same place. A strange +feeling of weakness tied him to the spot; he wished to get up and go +away, but could not do so. + +The captain, on the other hand, seemed very cheerful. He paced up +and down the room twice. His eyes shone and his mustache twitched as +if he were smiling to himself at some amusing thought. + +"The colonel of those Wurttembergers is delightful," he suddenly +said. "He's a German, but a nice fellow all the same.... But he's a +German." He sat down facing Pierre. "By the way, you know German, +then?" + +Pierre looked at him in silence. + +"What is the German for 'shelter'?" + +"Shelter?" Pierre repeated. "The German for shelter is Unterkunft." + +"How do you say it?" the captain asked quickly and doubtfully. + +"Unterkunft," Pierre repeated. + +"Onterkoff," said the captain and looked at Pierre for some +seconds with laughing eyes. "These Germans are first-rate fools, don't +you think so, Monsieur Pierre?" he concluded. + +"Well, let's have another bottle of this Moscow Bordeaux, shall +we? Morel will warm us up another little bottle. Morel!" he called out +gaily. + +Morel brought candles and a bottle of wine. The captain looked at +Pierre by the candlelight and was evidently struck by the troubled +expression on his companion's face. Ramballe, with genuine distress +and sympathy in his face, went up to Pierre and bent over him. + +"There now, we're sad," said he, touching Pierre's hand. "Have I +upset you? No, really, have you anything against me?" he asked Pierre. +"Perhaps it's the state of affairs?" + +Pierre did not answer, but looked cordially into the Frenchman's +eyes whose expression of sympathy was pleasing to him. + +"Honestly, without speaking of what I owe you, I feel friendship for +you. Can I do anything for you? Dispose of me. It is for life and +death. I say it with my hand on my heart!" said he, striking his +chest. + +"Thank you," said Pierre. + +The captain gazed intently at him as he had done when he learned +that "shelter" was Unterkunft in German, and his face suddenly +brightened. + +"Well, in that case, I drink to our friendship!" he cried gaily, +filling two glasses with wine. + +Pierre took one of the glasses and emptied it. Ramballe emptied +his too, again pressed Pierre's hand, and leaned his elbows on the +table in a pensive attitude. + +"Yes, my dear friend," he began, "such is fortune's caprice. Who +would have said that I should be a soldier and a captain of dragoons +in the service of Bonaparte, as we used to call him? Yet here I am +in Moscow with him. I must tell you, mon cher," he continued in the +sad and measured tones of a man who intends to tell a long story, +"that our name is one of the most ancient in France." + +And with a Frenchman's easy and naive frankness the captain told +Pierre the story of his ancestors, his childhood, youth, and +manhood, and all about his relations and his financial and family +affairs, "ma pauvre mere" playing of course an important part in the +story. + +"But all that is only life's setting, the real thing is love- +love! Am I not right, Monsieur Pierre?" said he, growing animated. +"Another glass?" + +Pierre again emptied his glass and poured himself out a third. + +"Oh, women, women!" and the captain, looking with glistening eyes at +Pierre, began talking of love and of his love affairs. + +There were very many of these, as one could easily believe, +looking at the officer's handsome, self-satisfied face, and noting the +eager enthusiasm with which he spoke of women. Though all Ramballe's +love stories had the sensual character which Frenchmen regard as the +special charm and poetry of love, yet he told his story with such +sincere conviction that he alone had experienced and known all the +charm of love and he described women so alluringly that Pierre +listened to him with curiosity. + +It was plain that l'amour which the Frenchman was so fond of was not +that low and simple kind that Pierre had once felt for his wife, nor +was it the romantic love stimulated by himself that he experienced for +Natasha. (Ramballe despised both these kinds of love equally: the +one he considered the "love of clodhoppers" and the other the "love of +simpletons.") L'amour which the Frenchman worshiped consisted +principally in the unnaturalness of his relation to the woman and in a +combination of incongruities giving the chief charm to the feeling. + +Thus the captain touchingly recounted the story of his love for a +fascinating marquise of thirty-five and at the same time for a +charming, innocent child of seventeen, daughter of the bewitching +marquise. The conflict of magnanimity between the mother and the +daughter, ending in the mother's sacrificing herself and offering +her daughter in marriage to her lover, even now agitated the +captain, though it was the memory of a distant past. Then he recounted +an episode in which the husband played the part of the lover, and +he--the lover--assumed the role of the husband, as well as several +droll incidents from his recollections of Germany, where "shelter" +is called Unterkunft and where the husbands eat sauerkraut and the +young girls are "too blonde." + +Finally, the latest episode in Poland still fresh in the captain's +memory, and which he narrated with rapid gestures and glowing face, +was of how he had saved the life of a Pole (in general, the saving +of life continually occurred in the captain's stories) and the Pole +had entrusted to him his enchanting wife (parisienne de coeur) while +himself entering the French service. The captain was happy, the +enchanting Polish lady wished to elope with him, but, prompted by +magnanimity, the captain restored the wife to the husband, saying as +he did so: "I have saved your life, and I save your honor!" Having +repeated these words the captain wiped his eyes and gave himself a +shake, as if driving away the weakness which assailed him at this +touching recollection. + +Listening to the captain's tales, Pierre--as often happens late in +the evening and under the influence of wine--followed all that was +told him, understood it all, and at the same time followed a train +of personal memories which, he knew not why, suddenly arose in his +mind. While listening to these love stories his own love for Natasha +unexpectedly rose to his mind, and going over the pictures of that +love in his imagination he mentally compared them with Ramballe's +tales. Listening to the story of the struggle between love and duty, +Pierre saw before his eyes every minutest detail of his last meeting +with the object of his love at the Sukharev water tower. At the time +of that meeting it had not produced an effect upon him--he had not +even once recalled it. But now it seemed to him that that meeting +had had in it something very important and poetic. + +"Peter Kirilovich, come here! We have recognized you," he now seemed +to hear the words she had uttered and to see before him her eyes, +her smile, her traveling hood, and a stray lock of her hair... and +there seemed to him something pathetic and touching in all this. + +Having finished his tale about the enchanting Polish lady, the +captain asked Pierre if he had ever experienced a similar impulse to +sacrifice himself for love and a feeling of envy of the legitimate +husband. + +Challenged by this question Pierre raised his head and felt a need +to express the thoughts that filled his mind. He began to explain that +he understood love for a women somewhat differently. He said that in +all his life he had loved and still loved only one woman, and that she +could never be his. + +"Tiens!" said the captain. + +Pierre then explained that he had loved this woman from his earliest +years, but that he had not dared to think of her because she was too +young, and because he had been an illegitimate son without a name. +Afterwards when he had received a name and wealth he dared not think +of her because he loved her too well, placing her far above everything +in the world, and especially therefore above himself. + +When he had reached this point, Pierre asked the captain whether +he understood that. + +The captain made a gesture signifying that even if he did not +understand it he begged Pierre to continue. + +"Platonic love, clouds..." he muttered. + +Whether it was the wine he had drunk, or an impulse of frankness, or +the thought that this man did not, and never would, know any of +those who played a part in his story, or whether it was all these +things together, something loosened Pierre's tongue. Speaking +thickly and with a faraway look in his shining eyes, he told the whole +story of his life: his marriage, Natasha's love for his best friend, +her betrayal of him, and all his own simple relations with her. +Urged on by Ramballe's questions he also told what he had at first +concealed--his own position and even his name. + +More than anything else in Pierre's story the captain was +impressed by the fact that Pierre was very rich, had two mansions in +Moscow, and that he had abandoned everything and not left the city, +but remained there concealing his name and station. + +When it was late at night they went out together into the street. +The night was warm and light. To the left of the house on the Pokrovka +a fire glowed--the first of those that were beginning in Moscow. To +the right and high up in the sky was the sickle of the waning moon and +opposite to it hung that bright comet which was connected in +Pierre's heart with his love. At the gate stood Gerasim, the cook, and +two Frenchmen. Their laughter and their mutually incomprehensible +remarks in two languages could be heard. They were looking at the glow +seen in the town. + +There was nothing terrible in the one small, distant fire in the +immense city. + +Gazing at the high starry sky, at the moon, at the comet, and at the +glow from the fire, Pierre experienced a joyful emotion. "There now, +how good it is, what more does one need?" thought he. And suddenly +remembering his intention he grew dizzy and felt so faint that he +leaned against the fence to save himself from falling. + +Without taking leave of his new friend, Pierre left the gate with +unsteady steps and returning to his room lay down on the sofa and +immediately fell asleep. + + + + + +CHAPTER XXX + + +The glow of the first fire that began on the second of September was +watched from the various roads by the fugitive Muscovites and by the +retreating troops, with many different feelings. + +The Rostov party spent the night at Mytishchi, fourteen miles from +Moscow. They had started so late on the first of September, the road +had been so blocked by vehicles and troops, so many things had been +forgotten for which servants were sent back, that they had decided +to spend that night at a place three miles out of Moscow. The next +morning they woke late and were again delayed so often that they +only got as far as Great Mytishchi. At ten o'clock that evening the +Rostov family and the wounded traveling with them were all distributed +in the yards and huts of that large village. The Rostovs' servants and +coachmen and the orderlies of the wounded officers, after attending to +their masters, had supper, fed the horses, and came out into the +porches. + +In a neighboring hut lay Raevski's adjutant with a fractured +wrist. The awful pain he suffered made him moan incessantly and +piteously, and his moaning sounded terrible in the darkness of the +autumn night. He had spent the first night in the same yard as the +Rostovs. The countess said she had been unable to close her eyes on +account of his moaning, and at Mytishchi she moved into a worse hut +simply to be farther away from the wounded man. + +In the darkness of the night one of the servants noticed, above +the high body of a coach standing before the porch, the small glow +of another fire. One glow had long been visible and everybody knew +that it was Little Mytishchi burning--set on fire by Mamonov's +Cossacks. + +"But look here, brothers, there's another fire!" remarked an +orderly. + +All turned their attention to the glow. + +"But they told us Little Mytishchi had been set on fire by Mamonov's +Cossacks." + +"But that's not Mytishchi, it's farther away." + +"Look, it must be in Moscow!" + +Two of the gazers went round to the other side of the coach and +sat down on its steps. + +"It's more to the left, why, Little Mytishchi is over there, and +this is right on the other side." + +Several men joined the first two. + +"See how it's flaring," said one. "That's a fire in Moscow: either +in the Sushchevski or the Rogozhski quarter." + +No one replied to this remark and for some time they all gazed +silently at the spreading flames of the second fire in the distance. + +Old Daniel Terentich, the count's valet (as he was called), came +up to the group and shouted at Mishka. + +"What are you staring at, you good-for-nothing?... The count will be +calling and there's nobody there; go and gather the clothes together." + +"I only ran out to get some water," said Mishka. + +"But what do you think, Daniel Terentich? Doesn't it look as if that +glow were in Moscow?" remarked one of the footmen. + +Daniel Terentich made no reply, and again for a long time they +were all silent. The glow spread, rising and failing, farther and +farther still. + +"God have mercy.... It's windy and dry..." said another voice. + +"Just look! See what it's doing now. O Lord! You can even see the +crows flying. Lord have mercy on us sinners!" + +"They'll put it out, no fear!" + +"Who's to put it out?" Daniel Terentich, who had hitherto been +silent, was heard to say. His voice was calm and deliberate. "Moscow +it is, brothers," said he. "Mother Moscow, the white..." his voice +faltered, and he gave way to an old man's sob. + +And it was as if they had all only waited for this to realize the +significance for them of the glow they were watching. Sighs were +heard, words of prayer, and the sobbing of the count's old valet. + + + + + +CHAPTER XXXI + + +The valet, returning to the cottage, informed the count that +Moscow was burning. The count donned his dressing gown and went out to +look. Sonya and Madame Schoss, who had not yet undressed, went out +with him. Only Natasha and the countess remained in the room. Petya +was no longer with the family, he had gone on with his regiment +which was making for Troitsa. + +The countess, on hearing that Moscow was on fire, began to cry. +Natasha, pale, with a fixed look, was sitting on the bench under the +icons just where she had sat down on arriving and paid no attention to +her father's words. She was listening to the ceaseless moaning of +the adjutant, three houses off. + +"Oh, how terrible," said Sonya returning from the yard chilled and +frightened. "I believe the whole of Moscow will burn, there's an awful +glow! Natasha, do look! You can see it from the window," she said to +her cousin, evidently wishing to distract her mind. + +But Natasha looked at her as if not understanding what was said to +her and again fixed her eyes on the corner of the stove. She had +been in this condition of stupor since the morning, when Sonya, to the +surprise and annoyance of the countess, had for some unaccountable +reason found it necessary to tell Natasha of Prince Andrew's wound and +of his being with their party. The countess had seldom been so angry +with anyone as she was with Sonya. Sonya had cried and begged to be +forgiven and now, as if trying to atone for her fault, paid +unceasing attention to her cousin. + +"Look, Natasha, how dreadfully it is burning!" said she. + +"What's burning?" asked Natasha. "Oh, yes, Moscow." + +And as if in order not to offend Sonya and to get rid of her, she +turned her face to the window, looked out in such a way that it was +evident that she could not see anything, and again settled down in her +former attitude. + +"But you didn't see it!" + +"Yes, really I did," Natasha replied in a voice that pleaded to be +left in peace. + +Both the countess and Sonya understood that, naturally, neither +Moscow nor the burning of Moscow nor anything else could seem of +importance to Natasha. + +The count returned and lay down behind the partition. The countess +went up to her daughter and touched her head with the back of her hand +as she was wont to do when Natasha was ill, then touched her +forehead with her lips as if to feel whether she was feverish, and +finally kissed her. + +"You are cold. You are trembling all over. You'd better lie down," +said the countess. + +"Lie down? All right, I will. I'll lie down at once," said Natasha. + +When Natasha had been told that morning that Prince Andrew was +seriously wounded and was traveling with their party, she had at first +asked many questions: Where was he going? How was he wounded? Was it +serious? And could she see him? But after she had been told that she +could not see him, that he was seriously wounded but that his life was +not in danger, she ceased to ask questions or to speak at all, +evidently disbelieving what they told her, and convinced that say what +she might she would still be told the same. All the way she had sat +motionless in a corner of the coach with wide open eyes, and the +expression in them which the countess knew so well and feared so much, +and now she sat in the same way on the bench where she had seated +herself on arriving. She was planning something and either deciding or +had already decided something in her mind. The countess knew this, but +what it might be she did not know, and this alarmed and tormented her. + +"Natasha, undress, darling; lie down on my bed." + +A bed had been made on a bedstead for the countess only. Madame +Schoss and the two girls were to sleep on some hay on the floor. + +"No, Mamma, I will lie down here on the floor," Natasha replied +irritably and she went to the window and opened it. Through the open +window the moans of the adjutant could be heard more distinctly. She +put her head out into the damp night air, and the countess saw her +slim neck shaking with sobs and throbbing against the window frame. +Natasha knew it was not Prince Andrew who was moaning. She knew Prince +Andrew was in the same yard as themselves and in a part of the hut +across the passage; but this dreadful incessant moaning made her +sob. The countess exchanged a look with Sonya. + +"Lie down, darling; lie down, my pet," said the countess, softly +touching Natasha's shoulders. "Come, lie down." + +"Oh, yes... I'll lie down at once," said Natasha, and began +hurriedly undressing, tugging at the tapes of her petticoat. + +When she had thrown off her dress and put on a dressing jacket, +she sat down with her foot under her on the bed that had been made +up on the floor, jerked her thin and rather short plait of hair to the +front, and began replaiting it. Her long, thin, practiced fingers +rapidly unplaited, replaited, and tied up her plait. Her head moved +from side to side from habit, but her eyes, feverishly wide, looked +fixedly before her. When her toilet for the night was finished she +sank gently onto the sheet spread over the hay on the side nearest the +door. + +"Natasha, you'd better lie in the middle," said Sonya. + +"I'll stay here," muttered Natasha. "Do lie down," she added +crossly, and buried her face in the pillow. + +The countess, Madame Schoss, and Sonya undressed hastily and lay +down. The small lamp in front of the icons was the only light left +in the room. But in the yard there was a light from the fire at Little +Mytishchi a mile and a half away, and through the night came the noise +of people shouting at a tavern Mamonov's Cossacks had set up across +the street, and the adjutant's unceasing moans could still be heard. + +For a long time Natasha listened attentively to the sounds that +reached her from inside and outside the room and did not move. First +she heard her mother praying and sighing and the creaking of her bed +under her, then Madame Schoss' familiar whistling snore and Sonya's +gentle breathing. Then the countess called to Natasha. Natasha did not +answer. + +"I think she's asleep, Mamma," said Sonya softly. + +After short silence the countess spoke again but this time no one +replied. + +Soon after that Natasha heard her mother's even breathing. Natasha +did not move, though her little bare foot, thrust out from under the +quilt, was growing cold on the bare floor. + +As if to celebrate a victory over everybody, a cricket chirped in +a crack in the wall. A cock crowed far off and another replied near +by. The shouting in the tavern had died down; only the moaning of +the adjutant was heard. Natasha sat up. + +"Sonya, are you asleep? Mamma?" she whispered. + +No one replied. Natasha rose slowly and carefully, crossed +herself, and stepped cautiously on the cold and dirty floor with her +slim, supple, bare feet. The boards of the floor creaked. Stepping +cautiously from one foot to the other she ran like a kitten the few +steps to the door and grasped the cold door handle. + +It seemed to her that something heavy was beating rhythmically +against all the walls of the room: it was her own heart, sinking +with alarm and terror and overflowing with love. + +She opened the door and stepped across the threshold and onto the +cold, damp earthen floor of the passage. The cold she felt refreshed +her. With her bare feet she touched a sleeping man, stepped over +him, and opened the door into the part of the hut where Prince +Andrew lay. It was dark in there. In the farthest corner, on a bench +beside a bed on which something was lying, stood a tallow candle +with a long, thick, and smoldering wick. + +From the moment she had been told that of Prince Andrew's wound +and his presence there, Natasha had resolved to see him. She did not +know why she had to, she knew the meeting would be painful, but felt +the more convinced that it was necessary. + +All day she had lived only in hope of seeing him that night. But now +that the moment had come she was filled with dread of what she might +see. How was he maimed? What was left of him? Was he like that +incessant moaning of the adjutant's? Yes, he was altogether like that. +In her imagination he was that terrible moaning personified. When +she saw an indistinct shape in the corner, and mistook his knees +raised under the quilt for his shoulders, she imagined a horrible body +there, and stood still in terror. But an irresistible impulse drew her +forward. She cautiously took one step and then another, and found +herself in the middle of a small room containing baggage. Another man- +Timokhin--was lying in a corner on the benches beneath the icons, +and two others--the doctor and a valet--lay on the floor. + +The valet sat up and whispered something. Timokhin, kept awake by +the pain in his wounded leg, gazed with wide-open eyes at this strange +apparition of a girl in a white chemise, dressing jacket, and +nightcap. The valet's sleepy, frightened exclamation, "What do you +want? What's the matter?" made Natasha approach more swiftly to what +was lying in the corner. Horribly unlike a man as that body looked, +she must see him. She passed the valet, the snuff fell from the candle +wick, and she saw Prince Andrew clearly with his arms outside the +quilt, and such as she had always seen him. + +He was the same as ever, but the feverish color of his face, his +glittering eyes rapturously turned toward her, and especially his +neck, delicate as a child's, revealed by the turn-down collar of his +shirt, gave him a peculiarly innocent, childlike look, such as she had +never seen on him before. She went up to him and with a swift, +flexible, youthful movement dropped on her knees. + +He smiled and held out his hand to her. + + + + + +CHAPTER XXXII + + +Seven days had passed since Prince Andrew found himself in the +ambulance station on the field of Borodino. His feverish state and the +inflammation of his bowels, which were injured, were in the doctor's + +opinion sure to carry him off. But on the seventh day he ate with +pleasure a piece of bread with some tea, and the doctor noticed that +his temperature was lower. He had regained consciousness that morning. +The first night after they left Moscow had been fairly warm and he had +remained in the caleche, but at Mytishchi the wounded man himself +asked to be taken out and given some tea. The pain caused by his +removal into the hut had made him groan aloud and again lose +consciousness. When he had been placed on his camp bed he lay for a +long time motionless with closed eyes. Then he opened them and +whispered softly: "And the tea?" His remembering such a small detail +of everyday life astonished the doctor. He felt Prince Andrew's pulse, +and to his surprise and dissatisfaction found it had improved. He +was dissatisfied because he knew by experience that if his patient did +not die now, he would do so a little later with greater suffering. +Timokhin, the red-nosed major of Prince Andrew's regiment, had +joined him in Moscow and was being taken along with him, having been +wounded in the leg at the battle of Borodino. They were accompanied by +a doctor, Prince Andrew's valet, his coachman, and two orderlies. + +They gave Prince Andrew some tea. He drank it eagerly, looking +with feverish eyes at the door in front of him as if trying to +understand and remember something. + +"I don't want any more. Is Timokhin here?" he asked. + +Timokhin crept along the bench to him. + +"I am here, your excellency." + +"How's your wound?" + +"Mine, sir? All right. But how about you?" + +Prince Andrew again pondered as if trying to remember something. + +"Couldn't one get a book?" he asked. + +"What book?" + +"The Gospels. I haven't one." + +The doctor promised to procure it for him and began to ask how he +was feeling. Prince Andrew answered all his questions reluctantly +but reasonably, and then said he wanted a bolster placed under him +as he was uncomfortable and in great pain. The doctor and valet lifted +the cloak with which he was covered and, making wry faces at the +noisome smell of mortifying flesh that came from the wound, began +examining that dreadful place. The doctor was very much displeased +about something and made a change in the dressings, turning the +wounded man over so that he groaned again and grew unconscious and +delirious from the agony. He kept asking them to get him the book +and put it under him. + +"What trouble would it be to you?" he said. "I have not got one. +Please get it for me and put it under for a moment," he pleaded in a +piteous voice. + +The doctor went into the passage to wash his hands. + +"You fellows have no conscience," said he to the valet who was +pouring water over his hands. "For just one moment I didn't look after +you... It's such pain, you know, that I wonder how he can bear it." + +"By the Lord Jesus Christ, I thought we had put something under +him!" said the valet. + +The first time Prince Andrew understood where he was and what was +the matter with him and remembered being wounded and how was when he +asked to be carried into the hut after his caleche had stopped at +Mytishchi. After growing confused from pain while being carried into +the hut he again regained consciousness, and while drinking tea once +more recalled all that had happened to him, and above all vividly +remembered the moment at the ambulance station when, at the sight of +the sufferings of a man he disliked, those new thoughts had come to +him which promised him happiness. And those thoughts, though now vague +and indefinite, again possessed his soul. He remembered that he had +now a new source of happiness and that this happiness had something to +do with the Gospels. That was why he asked for a copy of them. The +uncomfortable position in which they had put him and turned him over +again confused his thoughts, and when he came to himself a third +time it was in the complete stillness of the night. Everybody near him +was sleeping. A cricket chirped from across the passage; someone was +shouting and singing in the street; cockroaches rustled on the +table, on the icons, and on the walls, and a big fly flopped at the +head of the bed and around the candle beside him, the wick of which +was charred and had shaped itself like a mushroom. + +His mind was not in a normal state. A healthy man usually thinks of, +feels, and remembers innumerable things simultaneously, but has the +power and will to select one sequence of thoughts or events on which +to fix his whole attention. A healthy man can tear himself away from +the deepest reflections to say a civil word to someone who comes in +and can then return again to his own thoughts. But Prince Andrew's +mind was not in a normal state in that respect. All the powers of +his mind were more active and clearer than ever, but they acted +apart from his will. Most diverse thoughts and images occupied him +simultaneously. At times his brain suddenly began to work with a +vigor, clearness, and depth it had never reached when he was in +health, but suddenly in the midst of its work it would turn to some +unexpected idea and he had not the strength to turn it back again. + +"Yes, a new happiness was revealed to me of which man cannot be +deprived," he thought as he lay in the semi-darkness of the quiet hut, +gazing fixedly before him with feverish wide open eyes. "A happiness +lying beyond material forces, outside the material influences that act +on man--a happiness of the soul alone, the happiness of loving. +Every man can understand it, but to conceive it and enjoin it was +possible only for God. But how did God enjoin that law? And why was +the Son...?" + +And suddenly the sequence of these thoughts broke off, and Prince +Andrew heard (without knowing whether it was a delusion or reality) +a soft whispering voice incessantly and rhythmically repeating +"piti-piti-piti," and then "titi," and then again "piti-piti-piti," +and "ti-ti" once more. At the same time he felt that above his face, +above the very middle of it, some strange airy structure was being +erected out of slender needles or splinters, to the sound of this +whispered music. He felt that he had to balance carefully (though it +was difficult) so that this airy structure should not collapse; but +nevertheless it kept collapsing and again slowly rising to the sound +of whispered rhythmic music--"it stretches, stretches, spreading out +and stretching," said Prince Andrew to himself. While listening to +this whispering and feeling the sensation of this drawing out and +the construction of this edifice of needles, he also saw by glimpses a +red halo round the candle, and heard the rustle of the cockroaches and +the buzzing of the fly that flopped against his pillow and his face. +Each time the fly touched his face it gave him a burning sensation and +yet to his surprise it did not destroy the structure, though it +knocked against the very region of his face where it was rising. But +besides this there was something else of importance. It was +something white by the door--the statue of a sphinx, which also +oppressed him. + +"But perhaps that's my shirt on the table," he thought, "and +that's my legs, and that is the door, but why is it always +stretching and drawing itself out, and 'piti-piti-piti' and 'ti-ti' +and 'piti-piti-piti'...? That's enough, please leave off!" Prince +Andrew painfully entreated someone. And suddenly thoughts and feelings +again swam to the surface of his mind with peculiar clearness and +force. + +"Yes--love," he thought again quite clearly. "But not love which +loves for something, for some quality, for some purpose, or for some +reason, but the love which I--while dying--first experienced when I +saw my enemy and yet loved him. I experienced that feeling of love +which is the very essence of the soul and does not require an +object. Now again I feel that bliss. To love one's neighbors, to +love one's enemies, to love everything, to love God in all His +manifestations. It is possible to love someone dear to you with +human love, but an enemy can only be loved by divine love. That is why +I experienced such joy when I felt that I loved that man. What has +become of him? Is he alive?... + +"When loving with human love one may pass from love to hatred, but +divine love cannot change. No, neither death nor anything else can +destroy it. It is the very essence of the soul. Yet how many people +have I hated in my life? And of them all, I loved and hated none as +I did her." And he vividly pictured to himself Natasha, not as he +had done in the past with nothing but her charms which gave him +delight, but for the first time picturing to himself her soul. And +he understood her feelings, her sufferings, shame, and remorse. He now +understood for the first time all the cruelty of his rejection of her, +the cruelty of his rupture with her. "If only it were possible for +me to see her once more! Just once, looking into those eyes to say..." + + +"Piti-piti-piti and ti-ti and piti-piti-piti boom!" flopped the +fly... And his attention was suddenly carried into another world, a +world of reality and delirium in which something particular was +happening. In that world some structure was still being erected and +did not fall, something was still stretching out, and the candle +with its red halo was still burning, and the same shirtlike sphinx lay +near the door; but besides all this something creaked, there was a +whiff of fresh air, and a new white sphinx appeared, standing at the +door. And that sphinx had the pale face and shining eyes of the very +Natasha of whom he had just been thinking. + +"Oh, how oppressive this continual delirium is," thought Prince +Andrew, trying to drive that face from his imagination. But the face +remained before him with the force of reality and drew nearer. +Prince Andrew wished to return that former world of pure thought, +but he could not, and delirium drew him back into its domain. The soft +whispering voice continued its rhythmic murmur, something oppressed +him and stretched out, and the strange face was before him. Prince +Andrew collected all his strength in an effort to recover his +senses, he moved a little, and suddenly there was a ringing in his +ears, a dimness in his eyes, and like a man plunged into water he lost +consciousness. When he came to himself, Natasha, that same living +Natasha whom of all people he most longed to love with this new pure +divine love that had been revealed to him, was kneeling before him. He +realized that it was the real living Natasha, and he was not surprised +but quietly happy. Natasha, motionless on her knees (she was unable to +stir), with frightened eyes riveted on him, was restraining her +sobs. Her face was pale and rigid. Only in the lower part of it +something quivered. + +Prince Andrew sighed with relief, smiled, and held out his hand. + +"You?" he said. "How fortunate!" + +With a rapid but careful movement Natasha drew nearer to him on +her knees and, taking his hand carefully, bent her face over it and +began kissing it, just touching it lightly with her lips. + +"Forgive me!" she whispered, raising her head and glancing at him. +"Forgive me!" + +"I love you," said Prince Andrew. + +"Forgive...!" + +"Forgive what?" he asked. + +"Forgive me for what I ha-ve do-ne!" faltered Natasha in a +scarcely audible, broken whisper, and began kissing his hand more +rapidly, just touching it with her lips. + +"I love you more, better than before," said Prince Andrew, lifting +her face with his hand so as to look into her eyes. + +Those eyes, filled with happy tears, gazed at him timidly, +compassionately, and with joyous love. Natasha's thin pale face, +with its swollen lips, was more than plain--it was dreadful. But +Prince Andrew did not see that, he saw her shining eyes which were +beautiful. They heard the sound of voices behind them. + +Peter the valet, who was now wide awake, had roused the doctor. +Timokhin, who had not slept at all because of the pain in his leg, had +long been watching all that was going on, carefully covering his +bare body with the sheet as he huddled up on his bench. + +"What's this?" said the doctor, rising from his bed. "Please go +away, madam!" + +At that moment a maid sent by the countess, who had noticed her +daughter's absence, knocked at the door. + +Like a somnambulist aroused from her sleep Natasha went out of the +room and, returning to her hut, fell sobbing on her bed. + + +From that time, during all the rest of the Rostovs' journey, at +every halting place and wherever they spent a night, Natasha never +left the wounded Bolkonski, and the doctor had to admit that he had +not expected from a young girl either such firmness or such skill in +nursing a wounded man. + +Dreadful as the countess imagined it would be should Prince Andrew +die in her daughter's arms during the journey--as, judging by what the +doctor said, it seemed might easily happen--she could not oppose +Natasha. Though with the intimacy now established between the +wounded man and Natasha the thought occurred that should he recover +their former engagement would be renewed, no one--least of all Natasha +and Prince Andrew--spoke of this: the unsettled question of life and +death, which hung not only over Bolkonski but over all Russia, shut +out all other considerations. + + + + + +CHAPTER XXXIII + + +On the third of September Pierre awoke late. His head was aching, +the clothes in which he had slept without undressing felt +uncomfortable on his body, and his mind had a dim consciousness of +something shameful he had done the day before. That something shameful +was his yesterday's conversation with Captain Ramballe. + +It was eleven by the clock, but it seemed peculiarly dark out of +doors. Pierre rose, rubbed his eyes, and seeing the pistol with an +engraved stock which Gerasim had replaced on the writing table, he +remembered where he was and what lay before him that very day. + +"Am I not too late?" he thought. "No, probably he won't make his +entry into Moscow before noon." + +Pierre did not allow himself to reflect on what lay before him, +but hastened to act. + +After arranging his clothes, he took the pistol and was about to +go out. But it then occurred to him for the first time that he +certainly could not carry the weapon in his hand through the +streets. It was difficult to hide such a big pistol even under his +wide coat. He could not carry it unnoticed in his belt or under his +arm. Besides, it had been discharged, and he had not had time to +reload it. "No matter, dagger will do," he said to himself, though +when planning his design he had more than once come to the +conclusion that the chief mistake made by the student in 1809 had been +to try to kill Napoleon with a dagger. But as his chief aim +consisted not in carrying out his design, but in proving to himself +that he would not abandon his intention and was doing all he could +to achieve it, Pierre hastily took the blunt jagged dagger in a +green sheath which he had bought at the Sukharev market with the +pistol, and hid it under his waistcoat. + +Having tied a girdle over his coat and pulled his cap low on his +head, Pierre went down the corridor, trying to avoid making a noise or +meeting the captain, and passed out into the street. + +The conflagration, at which he had looked with so much +indifference the evening before, had greatly increased during the +night. Moscow was on fire in several places. The buildings in Carriage +Row, across the river, in the Bazaar and the Povarskoy, as well as the +barges on the Moskva River and the timber yards by the Dorogomilov +Bridge, were all ablaze. + +Pierre's way led through side streets to the Povarskoy and from +there to the church of St. Nicholas on the Arbat, where he had long +before decided that the deed should should be done. The gates of +most of the houses were locked and the shutters up. The streets and +lanes were deserted. The air was full of smoke and the smell of +burning. Now and then he met Russians with anxious and timid faces, +and Frenchmen with an air not of the city but of the camp, walking +in the middle of the streets. Both the Russians and the French +looked at Pierre with surprise. Besides his height and stoutness, +and the strange morose look of suffering in his face and whole figure, +the Russians stared at Pierre because they could not make out to +what class he could belong. The French followed him with +astonishment in their eyes chiefly because Pierre, unlike all the +other Russians who gazed at the French with fear and curiosity, paid +no attention to them. At the gate of one house three Frenchmen, who +were explaining something to some Russians who did not understand +them, stopped Pierre asking if he did not know French. + +Pierre shook his head and went on. In another side street a sentinel +standing beside a green caisson shouted at him, but only when the +shout was threateningly repeated and he heard the click of the man's +musket as he raised it did Pierre understand that he had to pass on +the other side of the street. He heard nothing and saw nothing of what +went on around him. He carried his resolution within himself in terror +and haste, like something dreadful and alien to him, for, after the +previous night's experience, he was afraid of losing it. But he was +not destined to bring his mood safely to his destination. And even had +he not been hindered by anything on the way, his intention could not +now have been carried out, for Napoleon had passed the Arbat more than +four hours previously on his way from the Dorogomilov suburb to the +Kremlin, and was now sitting in a very gloomy frame of mind in a royal +study in the Kremlin, giving detailed and exact orders as to +measures to be taken immediately to extinguish the fire, to prevent +looting, and to reassure the inhabitants. But Pierre did not know +this; he was entirely absorbed in what lay before him, and was +tortured--as those are who obstinately undertake a task that is +impossible for them not because of its difficulty but because of its +incompatibility with their natures--by the fear of weakening at the +decisive moment and so losing his self-esteem. + +Though he heard and saw nothing around him he found his way by +instinct and did not go wrong in the side streets that led to the +Povarskoy. + +As Pierre approached that street the smoke became denser and denser- +he even felt the heat of the fire. Occasionally curly tongues of flame +rose from under the roofs of the houses. He met more people in the +streets and they were more excited. But Pierre, though he felt that +something unusual was happening around him, did not realize that he +was approaching the fire. As he was going along a foot path across a +wide-open space adjoining the Povarskoy on one side and the gardens of +Prince Gruzinski's house on the other, Pierre suddenly heard the +desperate weeping of a woman close to him. He stopped as if +awakening from a dream and lifted his head. + +By the side of the path, on the dusty dry grass, all sorts of +household goods lay in a heap: featherbeds, a samovar, icons, and +trunks. On the ground, beside the trunks, sat a thin woman no longer +young, with long, prominent upper teeth, and wearing a black cloak and +cap. This woman, swaying to and fro and muttering something, was +choking with sobs. Two girls of about ten and twelve, dressed in dirty +short frocks and cloaks, were staring at their mother with a look of +stupefaction on their pale frightened faces. The youngest child, a boy +of about seven, who wore an overcoat and an immense cap evidently +not his own, was crying in his old nurse's arms. A dirty, barefooted +maid was sitting on a trunk, and, having undone her pale-colored +plait, was pulling it straight and sniffing at her singed hair. The +woman's husband, a short, round-shouldered man in the undress +uniform of a civilian official, with sausage-shaped whiskers and +showing under his square-set cap the hair smoothly brushed forward +over his temples, with expressionless face was moving the trunks, +which were placed one on another, and was dragging some garments +from under them. + +As soon as she saw Pierre, the woman almost threw herself at his +feet. + +"Dear people, good Christians, save me, help me, dear friends... +help us, somebody," she muttered between her sobs. "My girl... My +daughter! My youngest daughter is left behind. She's burned! Ooh! +Was it for this I nursed you.... Ooh!" + +"Don't, Mary Nikolievna!" said her husband to her in a low voice, +evidently only to justify himself before the stranger. "Sister must +have taken her, or else where can she be?" he added. + +"Monster! Villain!" shouted the woman angrily, suddenly ceasing to +weep. "You have no heart, you don't feel for your own child! Another +man would have rescued her from the fire. But this is a monster and +neither a man nor a father! You, honored sir, are a noble man," she +went on, addressing Pierre rapidly between her sobs. "The fire broke +out alongside, and blew our way, the maid called out 'Fire!' and we +rushed to collect our things. We ran out just as we were.... This is +what we have brought away.... The icons, and my dowry bed, all the +rest is lost. We seized the children. But not Katie! Ooh! O +Lord!..." and again she began to sob. "My child, my dear one! +Burned, burned!" + +"But where was she left?" asked Pierre. + +From the expression of his animated face the woman saw that this man +might help her. + +"Oh, dear sir!" she cried, seizing him by the legs. "My +benefactor, set my heart at ease.... Aniska, go, you horrid girl, show +him the way!" she cried to the maid, angrily opening her mouth and +still farther exposing her long teeth. + +"Show me the way, show me, I... I'll do it," gasped Pierre rapidly. + +The dirty maidservant stepped from behind the trunk, put up her +plait, sighed, and went on her short, bare feet along the path. Pierre +felt as if he had come back to life after a heavy swoon. He held his +head higher, his eyes shone with the light of life, and with swift +steps he followed the maid, overtook her, and came out on the +Povarskoy. The whole street was full of clouds of black smoke. Tongues +of flame here and there broke through that cloud. A great number of +people crowded in front of the conflagration. In the middle of the +street stood a French general saying something to those around him. +Pierre, accompanied by the maid, was advancing to the spot where the +general stood, but the French soldiers stopped him. + +"On ne passe pas!"* cried a voice. + + +*"You can't pass! + + +"This way, uncle," cried the girl. "We'll pass through the side +street, by the Nikulins'!" + +Pierre turned back, giving a spring now and then to keep up with +her. She ran across the street, turned down a side street to the left, +and, passing three houses, turned into a yard on the right. + +"It's here, close by," said she and, running across the yard, opened +a gate in a wooden fence and, stopping, pointed out to him a small +wooden wing of the house, which was burning brightly and fiercely. One +of its sides had fallen in, another was on fire, and bright flames +issued from the openings of the windows and from under the roof. + +As Pierre passed through the fence gate, he was enveloped by hot air +and involuntarily stopped. + +"Which is it? Which is your house?" he asked. + +"Ooh!" wailed the girl, pointing to the wing. "That's it, that was +our lodging. You've burned to death, our treasure, Katie, my +precious little missy! Ooh!" lamented Aniska, who at the sight of +the fire felt that she too must give expression to her feelings. + +Pierre rushed to the wing, but the heat was so great that he +involuntarily passed round in a curve and came upon the large house +that was as yet burning only at one end, just below the roof, and +around which swarmed a crowd of Frenchmen. At first Pierre did not +realize what these men, who were dragging something out, were about; +but seeing before him a Frenchman hitting a peasant with a blunt saber +and trying to take from him a fox-fur coat, he vaguely understood that +looting was going on there, but he had no time to dwell on that idea. + +The sounds of crackling and the din of falling walls and ceilings, +the whistle and hiss of the flames, the excited shouts of the +people, and the sight of the swaying smoke, now gathering into thick +black clouds and now soaring up with glittering sparks, with here +and there dense sheaves of flame (now red and now like golden fish +scales creeping along the walls), and the heat and smoke and +rapidity of motion, produced on Pierre the usual animating effects +of a conflagration. It had a peculiarly strong effect on him because +at the sight of the fire he felt himself suddenly freed from the ideas +that had weighed him down. He felt young, bright, adroit, and +resolute. He ran round to the other side of the lodge and was about to +dash into that part of it which was still standing, when just above +his head he heard several voices shouting and then a cracking sound +and the ring of something heavy falling close beside him. + +Pierre looked up and saw at a window of the large house some +Frenchmen who had just thrown out the drawer of a chest, filled with +metal articles. Other French soldiers standing below went up to the +drawer. + +"What does this fellow want?" shouted one of them referring to +Pierre. + +"There's a child in that house. Haven't you seen a child?" cried +Pierre. + +"What's he talking about? Get along!" said several voices, and one +of the soldiers, evidently afraid that Pierre might want to take +from them some of the plate and bronzes that were in the drawer, moved +threateningly toward him. + +"A child?" shouted a Frenchman from above. "I did hear something +squealing in the garden. Perhaps it's his brat that the fellow is +looking for. After all, one must be human, you know...." + +"Where is it? Where?" said Pierre. + +"There! There!" shouted the Frenchman at the window, pointing to the +garden at the back of the house. "Wait a bit--I'm coming down." + +And a minute or two later the Frenchman, a black-eyed fellow with +a spot on his cheek, in shirt sleeves, really did jump out of a window +on the ground floor, and clapping Pierre on the shoulder ran with +him into the garden. + +"Hurry up, you others!" he called out to his comrades. "It's getting +hot." + +When they reached a gravel path behind the house the Frenchman +pulled Pierre by the arm and pointed to a round, graveled space +where a three-year-old girl in a pink dress was lying under a seat. + +"There is your child! Oh, a girl, so much the better!" said the +Frenchman. "Good-by, Fatty. We must be human, we are all mortal you +know!" and the Frenchman with the spot on his cheek ran back to his +comrades. + +Breathless with joy, Pierre ran to the little girl and was going +to take her in his arms. But seeing a stranger the sickly, +scrofulous-looking child, unattractively like her mother, began to +yell and run away. Pierre, however, seized her and lifted her in his +arms. She screamed desperately and angrily and tried with her little +hands to pull Pierre's hands away and to bite them with her slobbering +mouth. Pierre was seized by a sense of horror and repulsion such as he +had experienced when touching some nasty little animal. But he made an +effort not to throw the child down and ran with her to the large +house. It was now, however, impossible to get back the way he had +come; the maid, Aniska, was no longer there, and Pierre with a feeling +of pity and disgust pressed the wet, painfully sobbing child to +himself as tenderly as he could and ran with her through the garden +seeking another way out. + + + + + +CHAPTER XXXIV + + +Having run through different yards and side streets, Pierre got back +with his little burden to the Gruzinski garden at the corner of the +Povarskoy. He did not at first recognize the place from which he had +set out to look for the child, so crowded was it now with people and +goods that had been dragged out of the houses. Besides Russian +families who had taken refuge here from the fire with their +belongings, there were several French soldiers in a variety of +clothing. Pierre took no notice of them. He hurried to find the family +of that civil servant in order to restore the daughter to her mother +and go to save someone else. Pierre felt that he had still much to +do and to do quickly. Glowing with the heat and from running, he +felt at that moment more strongly than ever the sense of youth, +animation, and determination that had come on him when he ran to +save the child. She had now become quiet and, clinging with her little +hands to Pierre's coat, sat on his arm gazing about her like some +little wild animal. He glanced at her occasionally with a slight +smile. He fancied he saw something pathetically innocent in that +frightened, sickly little face. + +He did not find the civil servant or his wife where he had left +them. He walked among the crowd with rapid steps, scanning the various +faces he met. Involuntarily he noticed a Georgian or Armenian family +consisting of a very handsome old man of Oriental type, wearing a new, +cloth-covered, sheepskin coat and new boots, an old woman of similar +type, and a young woman. That very young woman seemed to Pierre the +perfection of Oriental beauty, with her sharply outlined, arched, +black eyebrows and the extraordinarily soft, bright color of her long, +beautiful, expressionless face. Amid the scattered property and the +crowd on the open space, she, in her rich satin cloak with a bright +lilac shawl on her head, suggested a delicate exotic plant thrown +out onto the snow. She was sitting on some bundles a little behind the +old woman, and looked from under her long lashes with motionless, +large, almond-shaped eyes at the ground before her. Evidently she +was aware of her beauty and fearful because of it. Her face struck +Pierre and, hurrying along by the fence, he turned several times to +look at her. When he had reached the fence, still without finding +those he sought, he stopped and looked about him. + +With the child in his arms his figure was now more conspicuous +than before, and a group of Russians, both men and women, gathered +about him. + +"Have you lost anyone, my dear fellow? You're of the gentry +yourself, aren't you? Whose child is it?" they asked him. + +Pierre replied that the child belonged to a woman in a black coat +who had been sitting there with her other children, and he asked +whether anyone knew where she had gone. + +"Why, that must be the Anferovs," said an old deacon, addressing a +pockmarked peasant woman. "Lord have mercy, Lord have mercy!" he added +in his customary bass. + +"The Anferovs? No," said the woman. "They left in the morning. +That must be either Mary Nikolievna's or the Ivanovs'!" + +"He says 'a woman,' and Mary Nikolievna is a lady," remarked a house +serf. + +"Do you know her? She's thin, with long teeth," said Pierre. + +"That's Mary Nikolievna! They went inside the garden when these +wolves swooped down," said the woman, pointing to the French soldiers. + +"O Lord, have mercy!" added the deacon. + +"Go over that way, they're there. It's she! She kept on lamenting +and crying," continued the woman. "It's she. Here, this way!" + +But Pierre was not listening to the woman. He had for some seconds +been intently watching what was going on a few steps away. He was +looking at the Armenian family and at two French soldiers who had gone +up to them. One of these, a nimble little man, was wearing a blue coat +tied round the waist with a rope. He had a nightcap on his head and +his feet were bare. The other, whose appearance particularly struck +Pierre, was a long, lank, round-shouldered, fair-haired man, slow in +his movements and with an idiotic expression of face. He wore a +woman's loose gown of frieze, blue trousers, and large torn Hessian +boots. The little barefooted Frenchman in the blue coat went up to the +Armenians and, saying something, immediately seized the old man by his +legs and the old man at once began pulling off his boots. The other in +the frieze gown stopped in front of the beautiful Armenian girl and +with his hands in his pockets stood staring at her, motionless and +silent. + +"Here, take the child!" said Pierre peremptorily and hurriedly to +the woman, handing the little girl to her. "Give her back to them, +give her back!" he almost shouted, putting the child, who began +screaming, on the ground, and again looking at the Frenchman and the +Armenian family. + +The old man was already sitting barefoot. The little Frenchman had +secured his second boot and was slapping one boot against the other. +The old man was saying something in a voice broken by sobs, but Pierre +caught but a glimpse of this, his whole attention was directed to +the Frenchman in the frieze gown who meanwhile, swaying slowly from +side to side, had drawn nearer to the young woman and taking his hands +from his pockets had seized her by the neck. + +The beautiful Armenian still sat motionless and in the same +attitude, with her long lashes drooping as if she did not see or +feel what the soldier was doing to her. + +While Pierre was running the few steps that separated him from the +Frenchman, the tall marauder in the frieze gown was already tearing +from her neck the necklace the young Armenian was wearing, and the +young woman, clutching at her neck, screamed piercingly. + +"Let that woman alone!" exclaimed Pierre hoarsely in a furious +voice, seizing the soldier by his round shoulders and throwing him +aside. + +The soldier fell, got up, and ran away. But his comrade, throwing +down the boots and drawing his sword, moved threateningly toward +Pierre. + +"Voyons, Pas de betises!"* he cried. + + +*"Look here, no nonsense!" + + +Pierre was in such a transport of rage that he remembered nothing +and his strength increased tenfold. He rushed at the barefooted +Frenchman and, before the latter had time to draw his sword, knocked +him off his feet and hammered him with his fists. Shouts of approval +were heard from the crowd around, and at the same moment a mounted +patrol of French Uhlans appeared from round the corner. The Uhlans +came up at a trot to Pierre and the Frenchman and surrounded them. +Pierre remembered nothing of what happened after that. He only +remembered beating someone and being beaten and finally feeling that +his hands were bound and that a crowd of French soldiers stood +around him and were searching him. + +"Lieutenant, he has a dagger," were the first words Pierre +understood. + +"Ah, a weapon?" said the officer and turned to the barefooted +soldier who had been arrested with Pierre. "All right, you can tell +all about it at the court-martial." Then he turned to Pierre. "Do +you speak French?" + +Pierre looked around him with bloodshot eyes and did not reply. +His face probably looked very terrible, for the officer said something +in a whisper and four more Uhlans left the ranks and placed themselves +on both sides of Pierre. + +"Do you speak French?" the officer asked again, keeping at a +distance from Pierre. "Call the interpreter." + +A little man in Russian civilian clothes rode out from the ranks, +and by his clothes and manner of speaking Pierre at once knew him to +be a French salesman from one of the Moscow shops. + +"He does not look like a common man," said the interpreter, after +a searching look at Pierre. + +"Ah, he looks very much like an incendiary," remarked the officer. +"And ask him who he is," he added. + +"Who are you?" asked the interpreter in poor Russian. "You must +answer the chief." + +"I will not tell you who I am. I am your prisoner--take me!" +Pierre suddenly replied in French. + +"Ah, ah!" muttered the officer with a frown. "Well then, march!" + +A crowd had collected round the Uhlans. Nearest to Pierre stood +the pockmarked peasant woman with the little girl, and when the patrol +started she moved forward. + +"Where are they taking you to, you poor dear?" said she. "And the +little girl, the little girl, what am I to do with her if she's not +theirs?" said the woman. + +"What does that woman want?" asked the officer. + +Pierre was as if intoxicated. His elation increased at the sight +of the little girl he had saved. + +"What does she want?" he murmured. "She is bringing me my daughter +whom I have just saved from the flames," said he. "Good-by!" And +without knowing how this aimless lie had escaped him, he went along +with resolute and triumphant steps between the French soldiers. + +The French patrol was one of those sent out through the various +streets of Moscow by Durosnel's order to put a stop to the pillage, +and especially to catch the incendiaries who, according to the general +opinion which had that day originated among the higher French +officers, were the cause of the conflagrations. After marching through +a number of streets the patrol arrested five more Russian suspects: +a small shopkeeper, two seminary students, a peasant, and a house +serf, besides several looters. But of all these various suspected +characters, Pierre was considered to be the most suspicious of all. +When they had all been brought for the night to a large house on the +Zubov Rampart that was being used as a guardhouse, Pierre was placed +apart under strict guard. + + + + + +BOOK TWELVE: 1812 + + + + + +CHAPTER I + + +In Petersburg at that time a complicated struggle was being +carried on with greater heat than ever in the highest circles, between +the parties of Rumyantsev, the French, Marya Fedorovna, the Tsarevich, +and others, drowned as usual by the buzzing of the court drones. But +the calm, luxurious life of Petersburg, concerned only about +phantoms and reflections of real life, went on in its old way and made +it hard, except by a great effort, to realize the danger and the +difficult position of the Russian people. There were the same +receptions and balls, the same French theater, the same court +interests and service interests and intrigues as usual. Only in the +very highest circles were attempts made to keep in mind the +difficulties of the actual position. Stories were whispered of how +differently the two Empresses behaved in these difficult +circumstances. The Empress Marya, concerned for the welfare of the +charitable and educational institutions under her patronage, had given +directions that they should all be removed to Kazan, and the things +belonging to these institutions had already been packed up. The +Empress Elisabeth, however, when asked what instructions she would +be pleased to give--with her characteristic Russian patriotism had +replied that she could give no directions about state institutions for +that was the affair of the sovereign, but as far as she personally was +concerned she would be the last to quit Petersburg. + +At Anna Pavlovna's on the twenty-sixth of August, the very day of +the battle of Borodino, there was a soiree, the chief feature of which +was to be the reading of a letter from His Lordship the Bishop when +sending the Emperor an icon of the Venerable Sergius. It was +regarded as a model of ecclesiastical, patriotic eloquence. Prince +Vasili himself, famed for his elocution, was to read it. (He used to +read at the Empress'.) The art of his reading was supposed to lie in +rolling out the words, quite independently of their meaning, in a loud +and singsong voice alternating between a despairing wail and a +tender murmur, so that the wail fell quite at random on one word and +the murmur on another. This reading, as was always the case at Anna +Pavlovna's soirees, had a political significance. That evening she +expected several important personages who had to be made ashamed of +their visits to the French theater and aroused to a patriotic +temper. A good many people had already arrived, but Anna Pavlovna, not +yet seeing all those whom she wanted in her drawing room, did not +let the reading begin but wound up the springs of a general +conversation. + +The news of the day in Petersburg was the illness of Countess +Bezukhova. She had fallen ill unexpectedly a few days previously, +had missed several gatherings of which she was usually ornament, and +was said to be receiving no one, and instead of the celebrated +Petersburg doctors who usually attended her had entrusted herself to +some Italian doctor who was treating her in some new and unusual way. + +They all knew very well that the enchanting countess' illness +arose from an inconvenience resulting from marrying two husbands at +the same time, and that the Italian's cure consisted in removing +such inconvenience; but in Anna Pavlovna's presence no one dared to +think of this or even appear to know it. + +"They say the poor countess is very ill. The doctor says it is +angina pectoris." + +"Angina? Oh, that's a terrible illness!" + +"They say that the rivals are reconciled, thanks to the angina..." +and the word angina was repeated with great satisfaction. + +"The count is pathetic, they say. He cried like a child when the +doctor told him the case was dangerous." + +"Oh, it would be a terrible loss, she is an enchanting woman." + +"You are speaking of the poor countess?" said Anna Pavlovna, +coming up just then. "I sent to ask for news, and hear that she is a +little better. Oh, she is certainly the most charming woman in the +world," she went on, with a smile at her own enthusiasm. "We belong to +different camps, but that does not prevent my esteeming her as she +deserves. She is very unfortunate!" added Anna Pavlovna. + +Supposing that by these words Anna Pavlovna was somewhat lifting the +veil from the secret of the countess' malady, an unwary young man +ventured to express surprise that well known doctors had not been +called in and that the countess was being attended by a charlatan +who might employ dangerous remedies. + +"Your information maybe better than mine," Anna Pavlovna suddenly +and venomously retorted on the inexperienced young man, "but I know on +good authority that this doctor is a very learned and able man. He +is private physician to the Queen of Spain." + +And having thus demolished the young man, Anna Pavlovna turned to +another group where Bilibin was talking about the Austrians: having +wrinkled up his face he was evidently preparing to smooth it out again +and utter one of his mots. + +"I think it is delightful," he said, referring to a diplomatic +note that had been sent to Vienna with some Austrian banners +captured from the French by Wittgenstein, "the hero of Petropol" as he +was then called in Petersburg. + +"What? What's that?" asked Anna Pavlovna, securing silence for the +mot, which she had heard before. + +And Bilibin repeated the actual words of the diplomatic dispatch, +which he had himself composed. + +"The Emperor returns these Austrian banners," said Bilibin, +"friendly banners gone astray and found on a wrong path," and his brow +became smooth again. + +"Charming, charming!" observed Prince Vasili. + +"The path to Warsaw, perhaps," Prince Hippolyte remarked loudly +and unexpectedly. Everybody looked at him, understanding what he +meant. Prince Hippolyte himself glanced around with amused surprise. +He knew no more than the others what his words meant. During his +diplomatic career he had more than once noticed that such utterances +were received as very witty, and at every opportunity he uttered in +that way the first words that entered his head. "It may turn out +very well," he thought, "but if not, they'll know how to arrange +matters." And really, during the awkward silence that ensued, that +insufficiently patriotic person entered whom Anna Pavlovna had been +waiting for and wished to convert, and she, smiling and shaking a +finger at Hippolyte, invited Prince Vasili to the table and bringing +him two candles and the manuscript begged him to begin. Everyone +became silent. + + +"Most Gracious Sovereign and Emperor!" Prince Vasili sternly +declaimed, looking round at his audience as if to inquire whether +anyone had anything to say to the contrary. But no one said +anything. "Moscow, our ancient capital, the New Jerusalem, receives +her Christ"--he placed a sudden emphasis on the word her--"as a mother +receives her zealous sons into her arms, and through the gathering +mists, foreseeing the brilliant glory of thy rule, sings in +exultation, 'Hosanna, blessed is he that cometh!'" + + +Prince Vasili pronounced these last words in a tearful voice. + +Bilibin attentively examined his nails, and many of those present +appeared intimidated, as if asking in what they were to blame. Anna +Pavlovna whispered the next words in advance, like an old woman +muttering the prayer at Communion: "Let the bold and insolent +Goliath..." she whispered. + +Prince Vasili continued. + + +"Let the bold and insolent Goliath from the borders of France +encompass the realms of Russia with death-bearing terrors; humble +Faith, the sling of the Russian David, shall suddenly smite his head +in his blood-thirsty pride. This icon of the Venerable Sergius, the +servant of God and zealous champion of old of our country's weal, is +offered to Your Imperial Majesty. I grieve that my waning strength +prevents rejoicing in the sight of your most gracious presence. I +raise fervent prayers to Heaven that the Almighty may exalt the race +of the just, and mercifully fulfill the desires of Your Majesty." + + +"What force! What a style!" was uttered in approval both of reader +and of author. + +Animated by that address Anna Pavlovna's guests talked for a long +time of the state of the fatherland and offered various conjectures as +to the result of the battle to be fought in a few days. + +"You will see," said Anna Pavlovna, "that tomorrow, on the Emperor's +birthday, we shall receive news. I have a favorable presentiment!" + + + + + +CHAPTER II + + +Anna Pavlovna's presentiment was in fact fulfilled. Next day +during the service at the palace church in honor of the Emperor's +birthday, Prince Volkonski was called out of the church and received a +dispatch from Prince Kutuzov. It was Kutuzov's report, written from +Tatarinova on the day of the battle. Kutuzov wrote that the Russians +had not retreated a step, that the French losses were much heavier +than ours, and that he was writing in haste from the field of battle +before collecting full information. It followed that there must have +been a victory. And at once, without leaving the church, thanks were +rendered to the Creator for His help and for the victory. + +Anna Pavlovna's presentiment was justified, and all that morning a +joyously festive mood reigned in the city. Everyone believed the +victory to have been complete, and some even spoke of Napoleon's +having been captured, of his deposition, and of the choice of a new +ruler for France. + +It is very difficult for events to be reflected in their real +strength and completeness amid the conditions of court life and far +from the scene of action. General events involuntarily group +themselves around some particular incident. So now the courtiers' +pleasure was based as much on the fact that the news had arrived on +the Emperor's birthday as on the fact of the victory itself. It was +like a successfully arranged surprise. Mention was made in Kutuzov's +report of the Russian losses, among which figured the names of +Tuchkov, Bagration, and Kutaysov. In the Petersburg world this sad +side of the affair again involuntarily centered round a single +incident: Kutaysov's death. Everybody knew him, the Emperor liked him, +and he was young and interesting. That day everyone met with the +words: + +"What a wonderful coincidence! Just during the service. But what a +loss Kutaysov is! How sorry I am!" + +"What did I tell about Kutuzov?" Prince Vasili now said with a +prophet's pride. "I always said he was the only man capable of +defeating Napoleon." + +But next day no news arrived from the army and the public mood +grew anxious. The courtiers suffered because of the suffering the +suspense occasioned the Emperor. + +"Fancy the Emperor's position!" said they, and instead of +extolling Kutuzov as they had done the day before, they condemned +him as the cause of the Emperor's anxiety. That day Prince Vasili no +longer boasted of his protege Kutuzov, but remained silent when the +commander in chief was mentioned. Moreover, toward evening, as if +everything conspired to make Petersburg society anxious and uneasy, +a terrible piece of news was added. Countess Helene Bezukhova had +suddenly died of that terrible malady it had been so agreeable to +mention. Officially, at large gatherings, everyone said that +Countess Bezukhova had died of a terrible attack of angina pectoris, +but in intimate circles details were mentioned of how the private +physician of the Queen of Spain had prescribed small doses of a +certain drug to produce a certain effect; but Helene, tortured by +the fact that the old count suspected her and that her husband to whom +she had written (that wretched, profligate Pierre) had not replied, +had suddenly taken a very large dose of the drug, and had died in +agony before assistance could be rendered her. It was said that Prince +Vasili and the old count had turned upon the Italian, but the latter +had produced such letters from the unfortunate deceased that they +had immediately let the matter drop. + +Talk in general centered round three melancholy facts: the Emperor's +lack of news, the loss of Kutuzov, and the death of Helene. + +On the third day after Kutuzov's report a country gentleman +arrived from Moscow, and news of the surrender of Moscow to the French +spread through the whole town. This was terrible! What a position +for the Emperor to be in! Kutuzov was a traitor, and Prince Vasili +during the visits of condolence paid to him on the occasion of his +daughter's death said of Kutuzov, whom he had formerly praised (it was +excusable for him in his grief to forget what he had said), that it +was impossible to expect anything else from a blind and depraved old +man. + +"I only wonder that the fate of Russia could have been entrusted +to such a man." + +As long as this news remained unofficial it was possible to doubt +it, but the next day the following communication was received from +Count Rostopchin: + + +Prince Kutuzov's adjutant has brought me a letter in which he +demands police officers to guide the army to the Ryazan road. He +writes that he is regretfully abandoning Moscow. Sire! Kutuzov's +action decides the fate of the capital and of your empire! Russia will +shudder to learn of the abandonment of the city in which her greatness +is centered and in which lie the ashes of your ancestors! I shall +follow the army. I have had everything removed, and it only remains +for me to weep over the fate of my fatherland. + + +On receiving this dispatch the Emperor sent Prince Volkonski to +Kutuzov with the following rescript: + + +Prince Michael Ilarionovich! Since the twenty-ninth of August I have +received no communication from you, yet on the first of September I +received from the commander in chief of Moscow, via Yaroslavl, the sad +news that you, with the army, have decided to abandon Moscow. You +can yourself imagine the effect this news has had on me, and your +silence increases my astonishment. I am sending this by +Adjutant-General Prince Volkonski, to hear from you the situation of +the army and the reasons that have induced you to take this melancholy +decision. + + + + + +CHAPTER III + + +Nine days after the abandonment of Moscow, a messenger from +Kutuzov reached Petersburg with the official announcement of that +event. This messenger was Michaud, a Frenchman who did not know +Russian, but who was quoique etranger, russe de coeur et d'ame,* as he +said of himself. + + +*Though a foreigner, Russian in heart and soul. + + +The Emperor at once received this messenger in his study at the +palace on Stone Island. Michaud, who had never seen Moscow before +the campaign and who did not know Russian, yet felt deeply moved (as +he wrote) when he appeared before notre tres gracieux souverain* +with the news of the burning of Moscow, dont les flammes eclairaient +sa route.*[2] + + +*Our most gracious sovereign. + +*[2] Whose flames illumined his route. + + +Though the source of M. Michaud's chagrin must have been different +from that which caused Russians to grieve, he had such a sad face when +shown into the Emperor's study that the latter at once asked: + +"Have you brought me sad news, Colonel?" + +"Very sad, sire," replied Michaud, lowering his eyes with a sigh. +"The abandonment of Moscow." + +"Have they surrendered my ancient capital without a battle?" asked +the Emperor quickly, his face suddenly flushing. + +Michaud respectfully delivered the message Kutuzov had entrusted +to him, which was that it had been impossible to fight before +Moscow, and that as the only remaining choice was between losing the +army as well as Moscow, or losing Moscow alone, the field marshal +had to choose the latter. + +The Emperor listened in silence, not looking at Michaud. + +"Has the enemy entered the city?" he asked. + +"Yes, sire, and Moscow is now in ashes. I left it all in flames," +replied Michaud in a decided tone, but glancing at the Emperor he +was frightened by what he had done. + +The Emperor began to breathe heavily and rapidly, his lower lip +trembled, and tears instantly appeared in his fine blue eyes. + +But this lasted only a moment. He suddenly frowned, as if blaming +himself for his weakness, and raising his head addressed Michaud in +a firm voice: + +"I see, Colonel, from all that is happening, that Providence +requires great sacrifices of us... I am ready to submit myself in +all things to His will; but tell me, Michaud, how did you leave the +army when it saw my ancient capital abandoned without a battle? Did +you not notice discouragement?..." + +Seeing that his most gracious ruler was calm once more, Michaud also +grew calm, but was not immediately ready to reply to the Emperor's +direct and relevant question which required a direct answer. + +"Sire, will you allow me to speak frankly as befits a loyal +soldier?" he asked to gain time. + +"Colonel, I always require it," replied the Emperor. "Conceal +nothing from me, I wish to know absolutely how things are." + +"Sire!" said Michaud with a subtle, scarcely perceptible smile on +his lips, having now prepared a well-phrased reply, "sire, I left +the whole army, from its chiefs to the lowest soldier, without +exception in desperate and agonized terror..." + +"How is that?" the Emperor interrupted him, frowning sternly. "Would +misfortune make my Russians lose heart?... Never!" + +Michaud had only waited for this to bring out the phrase he had +prepared. + +"Sire," he said, with respectful playfulness, "they are only +afraid lest Your Majesty, in the goodness of your heart, should +allow yourself to be persuaded to make peace. They are burning for the +combat," declared this representative of the Russian nation, "and to +prove to Your Majesty by the sacrifice of their lives how devoted they +are...." + +"Ah!" said the Emperor reassured, and with a kindly gleam in his +eyes, he patted Michaud on the shoulder. "You set me at ease, +Colonel." + +He bent his head and was silent for some time. + +"Well, then, go back to the army," he said, drawing himself up to +his full height and addressing Michaud with a gracious and majestic +gesture, "and tell our brave men and all my good subjects wherever you +go that when I have not a soldier left I shall put myself at the +head of my beloved nobility and my good peasants and so use the last +resources of my empire. It still offers me more than my enemies +suppose," said the Emperor growing more and more animated; "but should +it ever be ordained by Divine Providence," he continued, raising to +heaven his fine eyes shining with emotion, "that my dynasty should +cease to reign on the throne of my ancestors, then after exhausting +all the means at my command, I shall let my beard grow to here" (he +pointed halfway down his chest) "and go and eat potatoes with the +meanest of my peasants, rather than sign the disgrace of my country +and of my beloved people whose sacrifices I know how to appreciate." + +Having uttered these words in an agitated voice the Emperor suddenly +turned away as if to hide from Michaud the tears that rose to his +eyes, and went to the further end of his study. Having stood there a +few moments, he strode back to Michaud and pressed his arm below the +elbow with a vigorous movement. The Emperor's mild and handsome face +was flushed and his eyes gleamed with resolution and anger. + +"Colonel Michaud, do not forget what I say to you here, perhaps we +may recall it with pleasure someday... Napoleon or I," said the +Emperor, touching his breast. "We can no longer both reign together. I +have learned to know him, and he will not deceive me any more...." + +And the Emperor paused, with a frown. + +When he heard these words and saw the expression of firm +resolution in the Emperor's eyes, Michaud--quoique etranger, russe +de coeur et d'ame--at that solemn moment felt himself enraptured by +all that he had heard (as he used afterwards to say), and gave +expression to his own feelings and those of the Russian people whose +representative he considered himself to be, in the following words: + +"Sire!" said he, "Your Majesty is at this moment signing the glory +of the nation and the salvation of Europe!" + +With an inclination of the head the Emperor dismissed him. + + + + + +CHAPTER IV + + +It is natural for us who were not living in those days to imagine +that when half Russia had been conquered and the inhabitants were +fleeing to distant provinces, and one levy after another was being +raised for the defense of the fatherland, all Russians from the +greatest to the least were solely engaged in sacrificing themselves, +saving their fatherland, or weeping over its downfall. The tales and +descriptions of that time without exception speak only of the +self-sacrifice, patriotic devotion, despair, grief, and the heroism of +the Russians. But it was not really so. It appears so to us because we +see only the general historic interest of that time and do not see all +the personal human interests that people had. Yet in reality those +personal interests of the moment so much transcend the general +interests that they always prevent the public interest from being felt +or even noticed. Most of the people at that time paid no attention +to the general progress of events but were guided only by their +private interests, and they were the very people whose activities at +that period were most useful. + +Those who tried to understand the general course of events and to +take part in it by self-sacrifice and heroism were the most useless +members of society, they saw everything upside down, and all they +did for the common good turned out to be useless and foolish--like +Pierre's and Mamonov's regiments which looted Russian villages, and +the lint the young ladies prepared and that never reached the wounded, +and so on. Even those, fond of intellectual talk and of expressing +their feelings, who discussed Russia's position at the time +involuntarily introduced into their conversation either a shade of +pretense and falsehood or useless condemnation and anger directed +against people accused of actions no one could possibly be guilty +of. In historic events the rule forbidding us to eat of the fruit of +the Tree of Knowledge is specially applicable. Only unconscious action +bears fruit, and he who plays a part in an historic event never +understands its significance. If he tries to realize it his efforts +are fruitless. + +The more closely a man was engaged in the events then taking place +in Russia the less did he realize their significance. In Petersburg +and in the provinces at a distance from Moscow, ladies, and +gentlemen in militia uniforms, wept for Russia and its ancient capital +and talked of self-sacrifice and so on; but in the army which +retired beyond Moscow there was little talk or thought of Moscow, +and when they caught sight of its burned ruins no one swore to be +avenged on the French, but they thought about their next pay, their +next quarters, of Matreshka the vivandiere, and like matters. + +As the war had caught him in the service, Nicholas Rostov took a +close and prolonged part in the defense of his country, but did so +casually, without any aim at self-sacrifice, and he therefore looked +at what was going on in Russia without despair and without dismally +racking his brains over it. Had he been asked what he thought of the +state of Russia, he would have said that it was not his business to +think about it, that Kutuzov and others were there for that purpose, +but that he had heard that the regiments were to be made up to their +full strength, that fighting would probably go on for a long time yet, +and that things being so it was quite likely he might be in command of +a regiment in a couple of years' time. + +As he looked at the matter in this way, he learned that he was being +sent to Voronezh to buy remounts for his division, not only without +regret at being prevented from taking part in the coming battle, but +with the greatest pleasure--which he did not conceal and which his +comrades fully understood. + +A few days before the battle of Borodino, Nicholas received the +necessary money and warrants, and having sent some hussars on in +advance, he set out with post horses for Voronezh. + +Only a man who has experienced it--that is, has passed some months +continuously in an atmosphere of campaigning and war--can understand +the delight Nicholas felt when he escaped from the region covered by +the army's foraging operations, provision trains, and hospitals. When- +free from soldiers, wagons, and the filthy traces of a camp--he saw +villages with peasants and peasant women, gentlemen's country +houses, fields where cattle were grazing, posthouses with +stationmasters asleep in them, he rejoiced as though seeing all this +for the first time. What for a long while specially surprised and +delighted him were the women, young and healthy, without a dozen +officers making up to each of them; women, too, who were pleased and +flattered that a passing officer should joke with them. + +In the highest spirits Nicholas arrived at night at a hotel in +Voronezh, ordered things he had long been deprived of in camp, and +next day, very clean-shaven and in a full-dress uniform he had not +worn for a long time, went to present himself to the authorities. + +The commander of the militia was a civilian general, an old man +who was evidently pleased with his military designation and rank. He +received Nicholas brusquely (imagining this to be characteristically +military) and questioned him with an important air, as if +considering the general progress of affairs and approving and +disapproving with full right to do so. Nicholas was in such good +spirits that this merely amused him. + +From the commander of the militia he drove to the governor. The +governor was a brisk little man, very simple and affable. He indicated +the stud farms at which Nicholas might procure horses, recommended +to him a horse dealer in the town and a landowner fourteen miles out +of town who had the best horses, and promised to assist him in every +way. + +"You are Count Ilya Rostov's son? My wife was a great friend of your +mother's. We are at home on Thursdays--today is Thursday, so please +come and see us quite informally," said the governor, taking leave +of him. + +Immediately on leaving the governor's, Nicholas hired post horses +and, taking his squadron quartermaster with him, drove at a gallop +to the landowner, fourteen miles away, who had the stud. Everything +seemed to him pleasant and easy during that first part of his stay +in Voronezh and, as usually happens when a man is in a pleasant +state of mind, everything went well and easily. + +The landowner to whom Nicholas went was a bachelor, an old +cavalryman, a horse fancier, a sportsman, the possessor of some +century-old brandy and some old Hungarian wine, who had a snuggery +where he smoked, and who owned some splendid horses. + +In very few words Nicholas bought seventeen picked stallions for six +thousand rubles--to serve, as he said, as samples of his remounts. +After dining and taking rather too much of the Hungarian wine, +Nicholas--having exchanged kisses with the landowner, with whom he was +already on the friendliest terms--galloped back over abominable roads, +in the brightest frame of mind, continually urging on the driver so as +to be in time for the governor's party. + +When he had changed, poured water over his head, and scented +himself, Nicholas arrived at the governor's rather late, but with +the phrase "better late than never" on his lips. + +It was not a ball, nor had dancing been announced, but everyone knew +that Catherine Petrovna would play valses and the ecossaise on the +clavichord and that there would be dancing, and so everyone had come +as to a ball. + +Provincial life in 1812 went on very much as usual, but with this +difference, that it was livelier in the towns in consequence of the +arrival of many wealthy families from Moscow, and as in everything +that went on in Russia at that time a special recklessness was +noticeable, an "in for a penny, in for a pound--who cares?" spirit, +and the inevitable small talk, instead of turning on the weather and +mutual acquaintances, now turned on Moscow, the army, and Napoleon. + +The society gathered together at the governor's was the best in +Voronezh. + +There were a great many ladies and some of Nicholas' Moscow +acquaintances, but there were no men who could at all vie with the +cavalier of St. George, the hussar remount officer, the good-natured +and well-bred Count Rostov. Among the men was an Italian prisoner, +an officer of the French army; and Nicholas felt that the presence +of that prisoner enhanced his own importance as a Russian hero. The +Italian was, as it were, a war trophy. Nicholas felt this, it seemed +to him that everyone regarded the Italian in the same light, and he +treated him cordially though with dignity and restraint. + +As soon as Nicholas entered in his hussar uniform, diffusing +around him a fragrance of perfume and wine, and had uttered the +words "better late than never" and heard them repeated several times +by others, people clustered around him; all eyes turned on him, and he +felt at once that he had entered into his proper position in the +province--that of a universal favorite: a very pleasant position, +and intoxicatingly so after his long privations. At posting +stations, at inns, and in the landowner's snuggery, maidservants had +been flattered by his notice, and here too at the governor's party +there were (as it seemed to Nicholas) an inexhaustible number of +pretty young women, married and unmarried, impatiently awaiting his +notice. The women and girls flirted with him and, from the first +day, the people concerned themselves to get this fine young +daredevil of an hussar married and settled down. Among these was the +governor's wife herself, who welcomed Rostov as a near relative and +called him "Nicholas." + +Catherine Petrovna did actually play valses and the ecossaise, and +dancing began in which Nicholas still further captivated the +provincial society by his agility. His particularly free manner of +dancing even surprised them all. Nicholas was himself rather surprised +at the way he danced that evening. He had never danced like that in +Moscow and would even have considered such a very free and easy manner +improper and in bad form, but here he felt it incumbent on him to +astonish them all by something unusual, something they would have to +accept as the regular thing in the capital though new to them in the +provinces. + +All the evening Nicholas paid attention to a blue-eyed, plump and +pleasing little blonde, the wife of one of the provincial officials. +With the naive conviction of young men in a merry mood that other +men's wives were created for them, Rostov did not leave the lady's +side and treated her husband in a friendly and conspiratorial style, +as if, without speaking of it, they knew how capitally Nicholas and +the lady would get on together. The husband, however, did not seem +to share that conviction and tried to behave morosely with Rostov. But +the latter's good-natured naivete was so boundless that sometimes even +he involuntarily yielded to Nicholas' good humor. Toward the end of +the evening, however, as the wife's face grew more flushed and +animated, the husband's became more and more melancholy and solemn, as +though there were but a given amount of animation between them and +as the wife's share increased the husband's diminished. + + + + + +CHAPTER V + + +Nicholas sat leaning slightly forward in an armchair, bending +closely over the blonde lady and paying her mythological compliments +with a smile that never left his face. Jauntily shifting the +position of his legs in their tight riding breeches, diffusing an odor +of perfume, and admiring his partner, himself, and the fine outlines +of his legs in their well-fitting Hessian boots, Nicholas told the +blonde lady that he wished to run away with a certain lady here in +Voronezh. + +"Which lady?" + +"A charming lady, a divine one. Her eyes" (Nicholas looked at his +partner) "are blue, her mouth coral and ivory; her figure" (he glanced +at her shoulders) "like Diana's...." + +The husband came up and sullenly asked his wife what she was talking +about. + +"Ah, Nikita Ivanych!" cried Nicholas, rising politely, and as if +wishing Nikita Ivanych to share his joke, he began to tell him of +his intention to elope with a blonde lady. + +The husband smiled gloomily, the wife gaily. The governor's +good-natured wife came up with a look of disapproval. + +"Anna Ignatyevna wants to see you, Nicholas," said she, +pronouncing the name so that Nicholas at once understood that Anna +Ignatyevna was a very important person. "Come, Nicholas! You know +you let me call you so?" + +"Oh, yes, Aunt. Who is she?" + +"Anna Ignatyevna Malvintseva. She has heard from her niece how you +rescued her... Can you guess?" + +"I rescued such a lot of them!" said Nicholas. + +"Her niece, Princess Bolkonskaya. She is here in Voronezh with her +aunt. Oho! How you blush. Why, are...?" + +"Not a bit! Please don't, Aunt!" + +"Very well, very well!... Oh, what a fellow you are!" + +The governor's wife led him up to a tall and very stout old lady +with a blue headdress, who had just finished her game of cards with +the most important personages of the town. This was Malvintseva, +Princess Mary's aunt on her mother's side, a rich, childless widow who +always lived in Voronezh. When Rostov approached her she was +standing settling up for the game. She looked at him and, screwing +up her eyes sternly, continued to upbraid the general who had won from +her. + +"Very pleased, mon cher," she then said, holding out her hand to +Nicholas. "Pray come and see me." + +After a few words about Princess Mary and her late father, whom +Malvintseva had evidently not liked, and having asked what Nicholas +knew of Prince Andrew, who also was evidently no favorite of hers, the +important old lady dismissed Nicholas after repeating her invitation +to come to see her. + +Nicholas promised to come and blushed again as he bowed. At the +mention of Princess Mary he experienced a feeling of shyness and +even of fear, which he himself did not understand. + +When he had parted from Malvintseva Nicholas wished to return to the +dancing, but the governor's little wife placed her plump hand on his +sleeve and, saying that she wanted to have a talk with him, led him to +her sitting room, from which those who were there immediately withdrew +so as not to be in her way. + +"Do you know, dear boy," began the governor's wife with a serious +expression on her kind little face, "that really would be the match +for you: would you like me to arrange it?" + +"Whom do you mean, Aunt?" asked Nicholas. + +"I will make a match for you with the princess. Catherine Petrovna +speaks of Lily, but I say, no--the princess! Do you want me to do +it? I am sure your mother will be grateful to me. What a charming girl +she is, really! And she is not at all so plain, either." + +"Not at all," replied Nicholas as if offended at the idea. "As +befits a soldier, Aunt, I don't force myself on anyone or refuse +anything," he said before he had time to consider what he was saying. + +"Well then, remember, this is not a joke!" + +"Of course not!" + +"Yes, yes," the governor's wife said as if talking to herself. "But, +my dear boy, among other things you are too attentive to the other, +the blonde. One is sorry for the husband, really...." + +"Oh no, we are good friends with him," said Nicholas in the +simplicity of his heart; it did not enter his head that a pastime so +pleasant to himself might not be pleasant to someone else. + +"But what nonsense I have been saying to the governor's wife!" +thought Nicholas suddenly at supper. "She will really begin to arrange +a match... and Soyna...?" And on taking leave of the governor's +wife, when she again smilingly said to him, "Well then, remember!" +he drew her aside. + +"But see here, to tell the truth, Aunt..." + +"What is it, my dear? Come, let's sit down here," said she. + +Nicholas suddenly felt a desire and need to tell his most intimate +thoughts (which he would not have told to his mother, his sister, or +his friend) to this woman who was almost a stranger. When he +afterwards recalled that impulse to unsolicited and inexplicable +frankness which had very important results for him, it seemed to +him--as it seems to everyone in such cases--that it was merely some +silly whim that seized him: yet that burst of frankness, together with +other trifling events, had immense consequences for him and for all +his family. + +"You see, Aunt, Mamma has long wanted me to marry an heiress, but +the very idea of marrying for money is repugnant to me." + +"Oh yes, I understand," said the governor's wife. + +"But Princess Bolkonskaya--that's another matter. I will tell you +the truth. In the first place I like her very much, I feel drawn to +her; and then, after I met her under such circumstances--so strangely, +the idea often occurred to me: 'This is fate.' Especially if you +remember that Mamma had long been thinking of it; but I had never +happened to meet her before, somehow it had always happened that we +did not meet. And as long as my sister Natasha was engaged to her +brother it was of course out of the question for me to think of +marrying her. And it must needs happen that I should meet her just +when Natasha's engagement had been broken off... and then +everything... So you see... I never told this to anyone and never +will, only to you." + +The governor's wife pressed his elbow gratefully. + +"You know Sonya, my cousin? I love her, and promised to marry her, +and will do so.... So you see there can be no question about-" said +Nicholas incoherently and blushing. + +"My dear boy, what a way to look at it! You know Sonya has nothing +and you yourself say your Papa's affairs are in a very bad way. And +what about your mother? It would kill her, that's one thing. And +what sort of life would it be for Sonya--if she's a girl with a heart? +Your mother in despair, and you all ruined.... No, my dear, you and +Sonya ought to understand that." + +Nicholas remained silent. It comforted him to hear these arguments. + +"All the same, Aunt, it is impossible," he rejoined with a sigh, +after a short pause. "Besides, would the princess have me? And +besides, she is now in mourning. How can one think of it!" + +"But you don't suppose I'm going to get you married at once? There +is always a right way of doing things," replied the governor's wife. + +"What a matchmaker you are, Aunt..." said Nicholas, kissing her +plump little hand. + + + + + +CHAPTER VI + + +On reaching Moscow after her meeting with Rostov, Princess Mary +had found her nephew there with his tutor, and a letter from Prince +Andrew giving her instructions how to get to her Aunt Malvintseva at +Voronezh. That feeling akin to temptation which had tormented her +during her father's illness, since his death, and especially since her +meeting with Rostov was smothered by arrangements for the journey, +anxiety about her brother, settling in a new house, meeting new +people, and attending to her nephew's education. She was sad. Now, +after a month passed in quiet surroundings, she felt more and more +deeply the loss of her father which was associated in her mind with +the ruin of Russia. She was agitated and incessantly tortured by the +thought of the dangers to which her brother, the only intimate +person now remaining to her, was exposed. She was worried too about +her nephew's education for which she had always felt herself +incompetent, but in the depths of her soul she felt at peace--a +peace arising from consciousness of having stifled those personal +dreams and hopes that had been on the point of awakening within her +and were related to her meeting with Rostov. + +The day after her party the governor's wife came to see +Malvintseva and, after discussing her plan with the aunt, remarked +that though under present circumstances a formal betrothal was, of +course, not to be thought of, all the same the young people might be +brought together and could get to know one another. Malvintseva +expressed approval, and the governor's wife began to speak of Rostov +in Mary's presence, praising him and telling how he had blushed when +Princess Mary's name was mentioned. But Princess Mary experienced a +painful rather than a joyful feeling--her mental tranquillity was +destroyed, and desires, doubts, self-reproach, and hopes reawoke. + +During the two days that elapsed before Rostov called, Princess Mary +continually thought of how she ought to behave to him. First she +decided not to come to the drawing room when he called to see her +aunt--that it would not be proper for her, in her deep mourning, to +receive visitors; then she thought this would be rude after what he +had done for her; then it occurred to her that her aunt and the +governor's wife had intentions concerning herself and Rostov--their +looks and words at times seemed to confirm this supposition--then +she told herself that only she, with her sinful nature, could think +this of them: they could not forget that situated as she was, while +still wearing deep mourning, such matchmaking would be an insult to +her and to her father's memory. Assuming that she did go down to see +him, Princess Mary imagined the words he would say to her and what she +would say to him, and these words sometimes seemed undeservedly cold +and then to mean too much. More than anything she feared lest the +confusion she felt might overwhelm her and betray her as soon as she +saw him. + +But when on Sunday after church the footman announced in the drawing +room that Count Rostov had called, the princess showed no confusion, +only a slight blush suffused her cheeks and her eyes lit up with a new +and radiant light. + +"You have met him, Aunt?" said she in a calm voice, unable herself +to understand that she could be outwardly so calm and natural. + +When Rostov entered the room, the princess dropped her eyes for an +instant, as if to give the visitor time to greet her aunt, and then +just as Nicholas turned to her she raised her head and met his look +with shining eyes. With a movement full of dignity and grace she +half rose with a smile of pleasure, held out her slender, delicate +hand to him, and began to speak in a voice in which for the first time +new deep womanly notes vibrated. Mademoiselle Bourienne, who was in +the drawing room, looked at Princess Mary in bewildered surprise. +Herself a consummate coquette, she could not have maneuvered better on +meeting a man she wished to attract. + +"Either black is particularly becoming to her or she really has +greatly improved without my having noticed it. And above all, what +tact and grace!" thought Mademoiselle Bourienne. + +Had Princess Mary been capable of reflection at that moment, she +would have been more surprised than Mademoiselle Bourienne at the +change that had taken place in herself. From the moment she recognized +that dear, loved face, a new life force took possession of her and +compelled her to speak and act apart from her own will. From the +time Rostov entered, her face became suddenly transformed. It was as +if a light had been kindled in a carved and painted lantern and the +intricate, skillful, artistic work on its sides, that previously +seemed dark, coarse, and meaningless, was suddenly shown up in +unexpected and striking beauty. For the first time all that pure, +spiritual, inward travail through which she had lived appeared on +the surface. All her inward labor, her dissatisfaction with herself, +her sufferings, her strivings after goodness, her meekness, love, +and self-sacrifice--all this now shone in those radiant eyes, in her +delicate smile, and in every trait of her gentle face. + +Rostov saw all this as clearly as if he had known her whole life. He +felt that the being before him was quite different from, and better +than, anyone he had met before, and above all better than himself. + +Their conversation was very simple and unimportant. They spoke of +the war, and like everyone else unconsciously exaggerated their sorrow +about it; they spoke of their last meeting--Nicholas trying to +change the subject--they talked of the governor's kind wife, of +Nicholas' relations, and of Princess Mary's. + +She did not talk about her brother, diverting the conversation as +soon as her aunt mentioned Andrew. Evidently she could speak of +Russia's misfortunes with a certain artificiality, but her brother was +too near her heart and she neither could nor would speak lightly of +him. Nicholas noticed this, as he noticed every shade of Princess +Mary's character with an observation unusual to him, and everything +confirmed his conviction that she was a quite unusual and +extraordinary being. Nicholas blushed and was confused when people +spoke to him about the princess (as she did when he was mentioned) and +even when he thought of her, but in her presence he felt quite at +ease, and said not at all what he had prepared, but what, quite +appropriately, occurred to him at the moment. + +When a pause occurred during his short visit, Nicholas, as is +usual when there are children, turned to Prince Andrew's little son, +caressing him and asking whether he would like to be an hussar. He +took the boy on his knee, played with him, and looked round at +Princess Mary. With a softened, happy, timid look she watched the +boy she loved in the arms of the man she loved. Nicholas also +noticed that look and, as if understanding it, flushed with pleasure +and began to kiss the boy with good natured playfulness. + +As she was in mourning Princess Mary did not go out into society, +and Nicholas did not think it the proper thing to visit her again; but +all the same the governor's wife went on with her matchmaking, passing +on to Nicholas the flattering things Princess Mary said of him and +vice versa, and insisting on his declaring himself to Princess Mary. +For this purpose she arranged a meeting between the young people at +the bishop's house before Mass. + +Though Rostov told the governeor's wife that he would not make any +declaration to Princess Mary, he promised to go. + +As at Tilsit Rostov had not allowed himself to doubt that what +everybody considered right was right, so now, after a short but +sincere struggle between his effort to arrange his life by his own +sense of justice, and in obedient submission to circumstances, he +chose the latter and yielded to the power he felt irresistibly +carrying him he knew not where. He knew that after his promise to +Sonya it would be what he deemed base to declare his feelings to +Princess Mary. And he knew that he would never act basely. But he also +knew (or rather felt at the bottom of his heart) that by resigning +himself now to the force of circumstances and to those who were +guiding him, he was not only doing nothing wrong, but was doing +something very important--more important than anything he had ever +done in his life. + +After meeting Princess Mary, though the course of his life went on +externally as before, all his former amusements lost their charm for +him and he often thought about her. But he never thought about her +as he had thought of all the young ladies without exception whom he +had met in society, nor as he had for a long time, and at one time +rapturously, thought about Sonya. He had pictured each of those +young ladies as almost all honest-hearted young men do, that is, as +a possible wife, adapting her in his imagination to all the conditions +of married life: a white dressing gown, his wife at the tea table, his +wife's carriage, little ones, Mamma and Papa, their relations to +her, and so on--and these pictures of the future had given him +pleasure. But with Princess Mary, to whom they were trying to get +him engaged, he could never picture anything of future married life. +If he tried, his pictures seemed incongruous and false. It made him +afraid. + + + + + +CHAPTER VII + + +The dreadful news of the battle of Borodino, of our losses in killed +and wounded, and the still more terrible news of the loss of Moscow +reached Voronezh in the middle of September. Princess Mary, having +learned of her brother's wound only from the Gazette and having no +definite news of him, prepared (so Nicholas heard, he had not seen her +again himself) to set off in search of Prince Andrew. + +When he received the news of the battle of Borodino and the +abandonment of Moscow, Rostov was not seized with despair, anger, +the desire for vengeance, or any feeling of that kind, but +everything in Voronezh suddenly seemed to him dull and tiresome, and +he experienced an indefinite feeling of shame and awkwardness. The +conversations he heard seemed to him insincere; he did not know how to +judge all these affairs and felt that only in the regiment would +everything again become clear to him. He made haste to finish buying +the horses, and often became unreasonably angry with his servant and +squadron quartermaster. + +A few days before his departure a special thanksgiving, at which +Nicholas was present, was held in the cathedral for the Russian +victory. He stood a little behind the governor and held himself with +military decorum through the service, meditating on a great variety of +subjects. When the service was over the governor's wife beckoned him +to her. + +"Have you seen the princess?" she asked, indicating with a +movement of her head a lady standing on the opposite side, beyond +the choir. + +Nicholas immediately recognized Princess Mary not so much by the +profile he saw under her bonnet as by the feeling of solicitude, +timidity, and pity that immediately overcame him. Princess Mary, +evidently engrossed by her thoughts, was crossing herself for the last +time before leaving the church. + +Nicholas looked at her face with surprise. It was the same face he +had seen before, there was the same general expression of refined, +inner, spiritual labor, but now it was quite differently lit up. There +was a pathetic expression of sorrow, prayer, and hope in it. As had +occurred before when she was present, Nicholas went up to her +without waiting to be prompted by the governor's wife and not asking +himself whether or not it was right and proper to address her here +in church, and told her he had heard of her trouble and sympathized +with his whole soul. As soon as she heard his voice a vivid glow +kindled in her face, lighting up both her sorrow and her joy. + +"There is one thing I wanted to tell you, Princess," said Rostov. +"It is that if your brother, Prince Andrew Nikolievich, were not +living, it would have been at once announced in the Gazette, as he +is a colonel." + +The princess looked at him, not grasping what he was saying, but +cheered by the expression of regretful sympathy on his face. + +"And I have known so many cases of a splinter wound" (the Gazette +said it was a shell) "either proving fatal at once or being very +slight," continued Nicholas. "We must hope for the best, and I am +sure..." + +Princess Mary interrupted him. + +"Oh, that would be so dread..." she began and, prevented by +agitation from finishing, she bent her head with a movement as +graceful as everything she did in his presence and, looking up at +him gratefully, went out, following her aunt. + +That evening Nicholas did not go out, but stayed at home to settle +some accounts with the horse dealers. When he had finished that +business it was already too late to go anywhere but still too early to +go to bed, and for a long time he paced up and down the room, +reflecting on his life, a thing he rarely did. + +Princess Mary had made an agreeable impression on him when he had +met her in Smolensk province. His having encountered her in such +exceptional circumstances, and his mother having at one time mentioned +her to him as a good match, had drawn his particular attention to her. +When he met her again in Voronezh the impression she made on him was +not merely pleasing but powerful. Nicholas had been struck by the +peculiar moral beauty he observed in her at this time. He was, +however, preparing to go away and it had not entered his head to +regret that he was thus depriving himself of chances of meeting her. +But that day's encounter in church had, he felt, sunk deeper than +was desirable for his peace of mind. That pale, sad, refined face, +that radiant look, those gentle graceful gestures, and especially +the deep and tender sorrow expressed in all her features agitated +him and evoked his sympathy. In men Rostov could not bear to see the +expression of a higher spiritual life (that was why he did not like +Prince Andrew) and he referred to it contemptuously as philosophy +and dreaminess, but in Princess Mary that very sorrow which revealed +the depth of a whole spiritual world foreign to him was an +irresistible attraction. + +"She must be a wonderful woman. A real angel!" he said to himself. +"Why am I not free? Why was I in such a hurry with Sonya?" And he +involuntarily compared the two: the lack of spirituality in the one +and the abundance of it in the other--a spirituality he himself lacked +and therefore valued most highly. He tried to picture what would +happen were he free. How he would propose to her and how she would +become his wife. But no, he could not imagine that. He felt awed, +and no clear picture presented itself to his mind. He had long ago +pictured to himself a future with Sonya, and that was all clear and +simple just because it had all been thought out and he knew all +there was in Sonya, but it was impossible to picture a future with +Princess Mary, because he did not understand her but simply loved her. + +Reveries about Sonya had had something merry and playful in them, +but to dream of Princess Mary was always difficult and a little +frightening. + +"How she prayed!" he thought. "It was plain that her whole soul +was in her prayer. Yes, that was the prayer that moves mountains, +and I am sure her prayer will be answered. Why don't I pray for what I +want?" he suddenly thought. "What do I want? To be free, released from +Sonya... She was right," he thought, remembering what the governor's +wife had said: "Nothing but misfortune can come of marrying Sonya. +Muddles, grief for Mamma... business difficulties... muddles, terrible +muddles! Besides, I don't love her--not as I should. O, God! release +me from this dreadful, inextricable position!" he suddenly began to +pray. "Yes, prayer can move mountains, but one must have faith and not +pray as Natasha and I used to as children, that the snow might turn +into sugar--and then run out into the yard to see whether it had +done so. No, but I am not praying for trifles now," he thought as he +put his pipe down in a corner, and folding his hands placed himself +before the icon. Softened by memories of Princess Mary he began to +pray as he had not done for a long time. Tears were in his eyes and in +his throat when the door opened and Lavrushka came in with some +papers. + +"Blockhead! Why do you come in without being called?" cried +Nicholas, quickly changing his attitude. + +"From the governor," said Lavrushka in a sleepy voice. "A courier +has arrived and there's a letter for you." + +"Well, all right, thanks. You can go!" + +Nicholas took the two letters, one of which was from his mother +and the other from Sonya. He recognized them by the handwriting and +opened Sonya's first. He had read only a few lines when he turned pale +and his eyes opened wide with fear and joy. + +"No, it's not possible!" he cried aloud. + +Unable to sit still he paced up and down the room holding the letter +and reading it. He glanced through it, then read it again, and then +again, and standing still in the middle of the room he raised his +shoulders, stretching out his hands, with his mouth wide open and +his eyes fixed. What he had just been praying for with confidence that +God would hear him had come to pass; but Nicholas was as much +astonished as if it were something extraordinary and unexpected, and +as if the very fact that it had happened so quickly proved that it had +not come from God to whom he had prayed, but by some ordinary +coincidence. + +This unexpected and, as it seemed to Nicholas, quite voluntary +letter from Sonya freed him from the knot that fettered him and from +which there had seemed no escape. She wrote that the last +unfortunate events--the loss of almost the whole of the Rostovs' +Moscow property--and the countess' repeatedly expressed wish that +Nicholas should marry Princess Bolkonskaya, together with his +silence and coldness of late, had all combined to make her decide to +release him from his promise and set him completely free. + + +It would be too painful to me to think that I might be a cause of +sorrow or discord in the family that has been so good to me (she +wrote), and my love has no aim but the happiness of those I love; +so, Nicholas, I beg you to consider yourself free, and to be assured +that, in spite of everything, no one can love you more than does + +Your Sonya + + +Both letters were written from Troitsa. The other, from the +countess, described their last days in Moscow, their departure, the +fire, and the destruction of all their property. In this letter the +countess also mentioned that Prince Andrew was among the wounded +traveling with them; his state was very critical, but the doctor +said there was now more hope. Sonya and Natasha were nursing him. + +Next day Nicholas took his mother's letter and went to see +Princess Mary. Neither he nor she said a word about what "Natasha +nursing him" might mean, but thanks to this letter Nicholas suddenly +became almost as intimate with the princess as if they were relations. + +The following day he saw Princess Mary off on her journey to +Yaroslavl, and a few days later left to rejoin his regiment. + + + + + +CHAPTER VIII + + +Sonya's letter written from Troitsa, which had come as an answer +to Nicholas' prayer, was prompted by this: the thought of getting +Nicholas married to an heiress occupied the old countess' mind more +and more. She knew that Sonya was the chief obstacle to this +happening, and Sonya's life in the countess' house had grown harder +and harder, especially after they had received a letter from +Nicholas telling of his meeting with Princess Mary in Bogucharovo. The +countess let no occasion slip of making humiliating or cruel allusions +to Sonya. + +But a few days before they left Moscow, moved and excited by all +that was going on, she called Sonya to her and, instead of reproaching +and making demands on her, tearfully implored her to sacrifice herself +and repay all that the family had done for her by breaking off her +engagement with Nicholas. + +"I shall not be at peace till you promise me this." + +Sonya burst into hysterical tears and replied through her sobs +that she would do anything and was prepared for anything, but gave +no actual promise and could not bring herself to decide to do what was +demanded of her. She must sacrifice herself for the family that had +reared and brought her up. To sacrifice herself for others was Sonya's +habit. Her position in the house was such that only by sacrifice could +she show her worth, and she was accustomed to this and loved doing it. +But in all her former acts of self-sacrifice she had been happily +conscious that they raised her in her own esteem and in that of +others, and so made her more worthy of Nicholas whom she loved more +than anything in the world. But now they wanted her to sacrifice the +very thing that constituted the whole reward for her self-sacrifice +and the whole meaning of her life. And for the first time she felt +bitterness against those who had been her benefactors only to +torture her the more painfully; she felt jealous of Natasha who had +never experienced anything of this sort, had never needed to sacrifice +herself, but made others sacrifice themselves for her and yet was +beloved by everybody. And for the first time Sonya felt that out of +her pure, quiet love for Nicholas a passionate feeling was beginning +to grow up which was stronger than principle, virtue, or religion. +Under the influence of this feeling Sonya, whose life of dependence +had taught her involuntarily to be secretive, having answered the +countess in vague general terms, avoided talking with her and resolved +to wait till she should see Nicholas, not in order to set him free but +on the contrary at that meeting to bind him to her forever. + +The bustle and terror of the Rostovs' last days in Moscow stifled +the gloomy thoughts that oppressed Sonya. She was glad to find +escape from them in practical activity. But when she heard of Prince +Andrew's presence in their house, despite her sincere pity for him and +for Natasha, she was seized by a joyful and superstitious feeling that +God did not intend her to be separated from Nicholas. She knew that +Natasha loved no one but Prince Andrew and had never ceased to love +him. She knew that being thrown together again under such terrible +circumstances they would again fall in love with one another, and that +Nicholas would then not be able to marry Princess Mary as they would +be within the prohibited degrees of affinity. Despite all the terror +of what had happened during those last days and during the first +days of their journey, this feeling that Providence was intervening in +her personal affairs cheered Sonya. + +At the Troitsa monastery the Rostovs first broke their journey for a +whole day. + +Three large rooms were assigned to them in the monastery hostelry, +one of which was occupied by Prince Andrew. The wounded man was much +better that day and Natasha was sitting with him. In the next room sat +the count and countess respectfully conversing with the prior, who was +calling on them as old acquaintances and benefactors of the monastery. +Sonya was there too, tormented by curiosity as to what Prince Andrew +and Natasha were talking about. She heard the sound of their voices +through the door. That door opened and Natasha came out, looking +excited. Not noticing the monk, who had risen to greet her and was +drawing back the wide sleeve on his right arm, she went up to Sonya +and took her hand. + +"Natasha, what are you about? Come here!" said the countess. + +Natasha went up to the monk for his blessing, and advised her to +pray for aid to God and His saint. + +As soon as the prior withdrew, Natasha took her friend by the hand +and went with her into the unoccupied room. + +"Sonya, will he live?" she asked. "Sonya, how happy I am, and how +unhappy!... Sonya, dovey, everything is as it used to be. If only he +lives! He cannot... because... because... of" and Natasha burst into +tears. + +"Yes! I knew it! Thank God!" murmured Sonya. "He will live." + +Sonya was not less agitated than her friend by the latter's fear and +grief and by her own personal feelings which she shared with no one. +Sobbing, she kissed and comforted Natasha. "If only he lives!" she +thought. Having wept, talked, and wiped away their tears, the two +friends went together to Prince Andrew's door. Natasha opened it +cautiously and glanced into the room, Sonya standing beside her at the +half-open door. + +Prince Andrew was lying raised high on three pillows. His pale +face was calm, his eyes closed, and they could see his regular +breathing. + +"O, Natasha!" Sonya suddenly almost screamed, catching her +companion's arm and stepping back from the door. + +"What? What is it?" asked Natasha. + +"It's that, that..." said Sonya, with a white face and trembling +lips. + +Natasha softly closed the door and went with Sonya to the window, +not yet understanding what the latter was telling her. + +"You remember," said Sonya with a solemn and frightened +expression. "You remember when I looked in the mirror for you... at +Otradnoe at Christmas? Do you remember what I saw?" + +"Yes, yes!" cried Natasha opening her eyes wide, and vaguely +recalling that Sonya had told her something about Prince Andrew whom +she had seen lying down. + +"You remember?" Sonya went on. "I saw it then and told everybody, +you and Dunyasha. I saw him lying on a bed," said she, making a +gesture with her hand and a lifted finger at each detail, "and that he +had his eyes closed and was covered just with a pink quilt, and that +his hands were folded," she concluded, convincing herself that the +details she had just seen were exactly what she had seen in the +mirror. + +She had in fact seen nothing then but had mentioned the first +thing that came into her head, but what she had invented then seemed +to her now as real as any other recollection. She not only +remembered what she had then said--that he turned to look at her and +smiled and was covered with something red--but was firmly convinced +that she had then seen and said that he was covered with a pink +quilt and that his eyes were closed. + +"Yes, yes, it really was pink!" cried Natasha, who now thought she +too remembered the word pink being used, and saw in this the most +extraordinary and mysterious part of the prediction. + +"But what does it mean?" she added meditatively. + +"Oh, I don't know, it is all so strange," replied Sonya, clutching +at her head. + +A few minutes later Prince Andrew rang and Natasha went to him, +but Sonya, feeling unusually excited and touched, remained at the +window thinking about the strangeness of what had occurred. + + +They had an opportunity that day to send letters to the army, and +the countess was writing to her son. + +"Sonya!" said the countess, raising her eyes from her letter as +her niece passed, "Sonya, won't you write to Nicholas?" She spoke in a +soft, tremulous voice, and in the weary eyes that looked over her +spectacles Sonya read all that the countess meant to convey with these +words. Those eyes expressed entreaty, shame at having to ask, fear +of a refusal, and readiness for relentless hatred in case of such +refusal. + +Sonya went up to the countess and, kneeling down, kissed her hand. + +"Yes, Mamma, I will write," said she. + +Sonya was softened, excited, and touched by all that had occurred +that day, especially by the mysterious fulfillment she had just seen +of her vision. Now that she knew that the renewal of Natasha's +relations with Prince Andrew would prevent Nicholas from marrying +Princess Mary, she was joyfully conscious of a return of that +self-sacrificing spirit in which she was accustomed to live and +loved to live. So with a joyful consciousness of performing a +magnanimous deed--interrupted several times by the tears that dimmed +her velvety black eyes--she wrote that touching letter the arrival +of which had so amazed Nicholas. + + + + + +CHAPTER IX + + +The officer and soldiers who had arrested Pierre treated him with +hostility but yet with respect, in the guardhouse to which he was +taken. In their attitude toward him could still be felt both +uncertainty as to who he might be--perhaps a very important person- +and hostility as a result of their recent personal conflict with him. + +But when the guard was relieved next morning, Pierre felt that for +the new guard--both officers and men--he was not as interesting as +he had been to his captors; and in fact the guard of the second day +did not recognize in this big, stout man in a peasant coat the +vigorous person who had fought so desperately with the marauder and +the convoy and had uttered those solemn words about saving a child; +they saw in him only No. 17 of the captured Russians, arrested and +detained for some reason by order of the Higher Command. If they +noticed anything remarkable about Pierre, it was only his unabashed, +meditative concentration and thoughtfulness, and the way he spoke +French, which struck them as surprisingly good. In spite of this he +was placed that day with the other arrested suspects, as the +separate room he had occupied was required by an officer. + +All the Russians confined with Pierre were men of the lowest class +and, recognizing him as a gentleman, they all avoided him, more +especially as he spoke French. Pierre felt sad at hearing them +making fun of him. + +That evening he learned that all these prisoners (he, probably, +among them) were to be tried for incendiarism. On the third day he was +taken with the others to a house where a French general with a white +mustache sat with two colonels and other Frenchmen with scarves on +their arms. With the precision and definiteness customary in +addressing prisoners, and which is supposed to preclude human frailty, +Pierre like the others was questioned as to who he was, where he had +been, with what object, and so on. + +These questions, like questions put at trials generally, left the +essence of the matter aside, shut out the possibility of that +essence's being revealed, and were designed only to form a channel +through which the judges wished the answers of the accused to flow +so as to lead to the desired result, namely a conviction. As soon as +Pierre began to say anything that did not fit in with that aim, the +channel was removed and the water could flow to waste. Pierre felt, +moreover, what the accused always feel at their trial, perplexity as +to why these questions were put to him. He had a feeling that it was +only out of condescension or a kind of civility that this device of +placing a channel was employed. He knew he was in these men's power, +that only by force had they brought him there, that force alone gave +them the right to demand answers to their questions, and that the sole +object of that assembly was to inculpate him. And so, as they had +the power and wish to inculpate him, this expedient of an inquiry +and trial seemed unnecessary. It was evident that any answer would +lead to conviction. When asked what he was doing when he was arrested, +Pierre replied in a rather tragic manner that he was restoring to +its parents a child he had saved from the flames. Why had he fought +the marauder? Pierre answered that he "was protecting a woman," and +that "to protect a woman who was being insulted was the duty of +every man; that..." They interrupted him, for this was not to the +point. Why was he in the yard of a burning house where witnesses had +seen him? He replied that he had gone out to see what was happening in +Moscow. Again they interrupted him: they had not asked where he was +going, but why he was found near the fire? Who was he? they asked, +repeating their first question, which he had declined to answer. Again +he replied that he could not answer it. + +"Put that down, that's bad... very bad," sternly remarked the +general with the white mustache and red flushed face. + + +On the fourth day fires broke out on the Zubovski rampart. + +Pierre and thirteen others were moved to the coach house of a +merchant's house near the Crimean bridge. On his way through the +streets Pierre felt stifled by the smoke which seemed to hang over the +whole city. Fires were visible on all sides. He did not then realize +the significance of the burning of Moscow, and looked at the fires +with horror. + +He passed four days in the coach house near the Crimean bridge and +during that time learned, from the talk of the French soldiers, that +all those confined there were awaiting a decision which might come any +day from the marshal. What marshal this was, Pierre could not learn +from the soldiers. Evidently for them "the marshal" represented a very +high and rather mysterious power. + +These first days, before the eighth of September when the +prisoners were had up for a second examination, were the hardest of +all for Pierre. + + + + + +CHAPTER X + + +On the eighth of September an officer--a very important one +judging by the respect the guards showed him--entered the coach +house where the prisoners were. This officer, probably someone on +the staff, was holding a paper in his hand, and called over all the +Russians there, naming Pierre as "the man who does not give his name." +Glancing indolently and indifferently at all the prisoners, he ordered +the officer in charge to have them decently dressed and tidied up +before taking them to the marshal. An hour later a squad of soldiers +arrived and Pierre with thirteen others was led to the Virgin's Field. +It was a fine day, sunny after rain, and the air was unusually pure. +The smoke did not hang low as on the day when Pierre had been taken +from the guardhouse on the Zubovski rampart, but rose through the pure +air in columns. No flames were seen, but columns of smoke rose on +all sides, and all Moscow as far as Pierre could see was one vast +charred ruin. On all sides there were waste spaces with only stoves +and chimney stacks still standing, and here and there the blackened +walls of some brick houses. Pierre gazed at the ruins and did not +recognize districts he had known well. Here and there he could see +churches that had not been burned. The Kremlin, which was not +destroyed, gleamed white in the distance with its towers and the +belfry of Ivan the Great. The domes of the New Convent of the Virgin +glittered brightly and its bells were ringing particularly clearly. +These bells reminded Pierre that it was Sunday and the feast of the +Nativity of the Virgin. But there seemed to be no one to celebrate +this holiday: everywhere were blackened ruins, and the few Russians to +be seen were tattered and frightened people who tried to hide when +they saw the French. + +It was plain that the Russian nest was ruined and destroyed, but +in place of the Russian order of life that had been destroyed, +Pierre unconsciously felt that a quite different, firm, French order +had been established over this ruined nest. He felt this in the +looks of the soldiers who, marching in regular ranks briskly and +gaily, were escorting him and the other criminals; he felt it in the +looks of an important French official in a carriage and pair driven by +a soldier, whom they met on the way. He felt it in the merry sounds of +regimental music he heard from the left side of the field, and felt +and realized it especially from the list of prisoners the French +officer had read out when he came that morning. Pierre had been +taken by one set of soldiers and led first to one and then to +another place with dozens of other men, and it seemed that they +might have forgotten him, or confused him with the others. But no: the +answers he had given when questioned had come back to him in his +designation as "the man who does not give his name," and under that +appellation, which to Pierre seemed terrible, they were now leading +him somewhere with unhesitating assurance on their faces that he and +all the other prisoners were exactly the ones they wanted and that +they were being taken to the proper place. Pierre felt himself to be +an insignificant chip fallen among the wheels of a machine whose +action he did not understand but which was working well. + +He and the other prisoners were taken to the right side of the +Virgin's Field, to a large white house with an immense garden not +far from the convent. This was Prince Shcherbitov's house, where +Pierre had often been in other days, and which, as he learned from the +talk of the soldiers, was now occupied by the marshal, the Duke of +Eckmuhl (Davout). + +They were taken to the entrance and led into the house one by one. +Pierre was the sixth to enter. He was conducted through a glass +gallery, an anteroom, and a hall, which were familiar to him, into a +long low study at the door of which stood an adjutant. + +Davout, spectacles on nose, sat bent over a table at the further end +of the room. Pierre went close up to him, but Davout, evidently +consulting a paper that lay before him, did not look up. Without +raising his eyes, he said in a low voice: + +"Who are you?" + +Pierre was silent because he was incapable of uttering a word. To +him Davout was not merely a French general, but a man notorious for +his cruelty. Looking at his cold face, as he sat like a stern +schoolmaster who was prepared to wait awhile for an answer, Pierre +felt that every instant of delay might cost him his life; but he did +not know what to say. He did not venture to repeat what he had said at +his first examination, yet to disclose his rank and position was +dangerous and embarrassing. So he was silent. But before he had +decided what to do, Davout raised his head, pushed his spectacles back +on his forehead, screwed up his eyes, and looked intently at him. + +"I know that man," he said in a cold, measured tone, evidently +calculated to frighten Pierre. + +The chill that had been running down Pierre's back now seized his +head as in a vise. + +"You cannot know me, General, I have never seen you..." + +"He is a Russian spy," Davout interrupted, addressing another +general who was present, but whom Pierre had not noticed. + +Davout turned away. With an unexpected reverberation in his voice +Pierre rapidly began: + +"No, monseigneur," he said, suddenly remembering that Davout was a +duke. "No, monseigneur, you cannot have known me. I am a militia +officer and have not quitted Moscow." + +"Your name?" asked Davout. + +"Bezukhov." + +"What proof have I that you are not lying?" + +"Monseigneur!" exclaimed Pierre, not in an offended but in a +pleading voice. + +Davout looked up and gazed intently at him. For some seconds they +looked at one another, and that look saved Pierre. Apart from +conditions of war and law, that look established human relations +between the two men. At that moment an immense number of things passed +dimly through both their minds, and they realized that they were +both children of humanity and were brothers. + +At the first glance, when Davout had only raised his head from the +papers where human affairs and lives were indicated by numbers, Pierre +was merely a circumstance, and Davout could have shot him without +burdening his conscience with an evil deed, but now he saw in him a +human being. He reflected for a moment. + +"How can you show me that you are telling the truth?" said Davout +coldly. + +Pierre remembered Ramballe, and named him and his regiment and the +street where the house was. + +"You are not what you say," returned Davout. + +In a trembling, faltering voice Pierre began adducing proofs of +the truth of his statements. + +But at that moment an adjutant entered and reported something to +Davout. + +Davout brightened up at the news the adjutant brought, and began +buttoning up his uniform. It seemed that he had quite forgotten +Pierre. + +When the adjutant reminded him of the prisoner, he jerked his head +in Pierre's direction with a frown and ordered him to be led away. But +where they were to take him Pierre did not know: back to the coach +house or to the place of execution his companions had pointed out to +him as they crossed the Virgin's Field. + +He turned his head and saw that the adjutant was putting another +question to Davout. + +"Yes, of course!" replied Davout, but what this "yes" meant, +Pierre did not know. + +Pierre could not afterwards remember how he went, whether it was +far, or in which direction. His faculties were quite numbed, he was +stupefied, and noticing nothing around him went on moving his legs +as the others did till they all stopped and he stopped too. The only +thought in his mind at that time was: who was it that had really +sentenced him to death? Not the men on the commission that had first +examined him--not one of them wished to or, evidently, could have done +it. It was not Davout, who had looked at him in so human a way. In +another moment Davout would have realized that he was doing wrong, but +just then the adjutant had come in and interrupted him. The +adjutant, also, had evidently had no evil intent though he might +have refrained from coming in. Then who was executing him, killing +him, depriving him of life--him, Pierre, with all his memories, +aspirations, hopes, and thoughts? Who was doing this? And Pierre +felt that it was no one. + +It was a system--a concurrence of circumstances. + +A system of some sort was killing him--Pierre--depriving him of +life, of everything, annihilating him. + + + + + +CHAPTER XI + + +From Prince Shcherbatov's house the prisoners were led straight down +the Virgin's Field, to the left of the nunnery, as far as a kitchen +garden in which a post had been set up. Beyond that post a fresh pit +had been dug in the ground, and near the post and the pit a large +crowd stood in a semicircle. The crowd consisted of a few Russians and +many of Napoleon's soldiers who were not on duty--Germans, Italians, +and Frenchmen, in a variety of uniforms. To the right and left of +the post stood rows of French troops in blue uniforms with red +epaulets and high boots and shakos. + +The prisoners were placed in a certain order, according to the +list (Pierre was sixth), and were led to the post. Several drums +suddenly began to beat on both sides of them, and at that sound Pierre +felt as if part of his soul had been torn away. He lost the power of +thinking or understanding. He could only hear and see. And he had only +one wish--that the frightful thing that had to happen should happen +quickly. Pierre looked round at his fellow prisoners and scrutinized +them. + +The two first were convicts with shaven heads. One was tall and +thin, the other dark, shaggy, and sinewy, with a flat nose. The +third was a domestic serf, about forty-five years old, with grizzled +hair and a plump, well-nourished body. The fourth was a peasant, a +very handsome man with a broad, light-brown beard and black eyes. +The fifth was a factory hand, a thin, sallow-faced lad of eighteen +in a loose coat. + +Pierre heard the French consulting whether to shoot them +separately or two at a time. "In couples," replied the officer in +command in a calm voice. There was a stir in the ranks of the soldiers +and it was evident that they were all hurrying--not as men hurry to do +something they understand, but as people hurry to finish a necessary +but unpleasant and incomprehensible task. + +A French official wearing a scarf came up to the right of the row of +prisoners and read out the sentence in Russian and in French. + +Then two pairs of Frenchmen approached the criminals and at the +officer's command took the two convicts who stood first in the row. +The convicts stopped when they reached the post and, while sacks +were being brought, looked dumbly around as a wounded beast looks at +an approaching huntsman. One crossed himself continually, the other +scratched his back and made a movement of the lips resembling a smile. +With hurried hands the soldiers blindfolded them, drawing the sacks +over their heads, and bound them to the post. + +Twelve sharpshooters with muskets stepped out of the ranks with a +firm regular tread and halted eight paces from the post. Pierre turned +away to avoid seeing what was going to happen. Suddenly a crackling, +rolling noise was heard which seemed to him louder than the most +terrific thunder, and he looked round. There was some smoke, and the +Frenchmen were doing something near the pit, with pale faces and +trembling hands. Two more prisoners were led up. In the same way and +with similar looks, these two glanced vainly at the onlookers with +only a silent appeal for protection in their eyes, evidently unable to +understand or believe what was going to happen to them. They could not +believe it because they alone knew what their life meant to them, +and so they neither understood nor believed that it could be taken +from them. + +Again Pierre did not wish to look and again turned away; but again +the sound as of a frightful explosion struck his ear, and at the +same moment he saw smoke, blood, and the pale, scared faces of the +Frenchmen who were again doing something by the post, their +trembling hands impeding one another. Pierre, breathing heavily, +looked around as if asking what it meant. The same question was +expressed in all the looks that met his. + +On the faces of all the Russians and of the French soldiers and +officers without exception, he read the same dismay, horror, and +conflict that were in his own heart. "But who, after all, is doing +this? They are all suffering as I am. Who then is it? Who?" flashed +for an instant through his mind. + +"Sharpshooters of the 86th, forward!" shouted someone. The fifth +prisoner, the one next to Pierre, was led away--alone. Pierre did +not understand that he was saved, that he and the rest had been +brought there only to witness the execution. With ever-growing horror, +and no sense of joy or relief, he gazed at what was taking place. +The fifth man was the factory lad in the loose cloak. The moment +they laid hands on him he sprang aside in terror and clutched at +Pierre. (Pierre shuddered and shook himself free.) The lad was +unable to walk. They dragged him along, holding him up under the arms, +and he screamed. When they got him to the post he grew quiet, as if he +suddenly understood something. Whether he understood that screaming +was useless or whether he thought it incredible that men should kill +him, at any rate he took his stand at the post, waiting to be +blindfolded like the others, and like a wounded animal looked around +him with glittering eyes. + +Pierre was no longer able to turn away and close his eyes. His +curiosity and agitation, like that of the whole crowd, reached the +highest pitch at this fifth murder. Like the others this fifth man +seemed calm; he wrapped his loose cloak closer and rubbed one bare +foot with the other. + +When they began to blindfold him he himself adjusted the knot +which hurt the back of his head; then when they propped him against +the bloodstained post, he leaned back and, not being comfortable in +that position, straightened himself, adjusted his feet, and leaned +back again more comfortably. Pierre did not take his eyes from him and +did not miss his slightest movement. + +Probably a word of command was given and was followed by the reports +of eight muskets; but try as he would Pierre could not afterwards +remember having heard the slightest sound of the shots. He only saw +how the workman suddenly sank down on the cords that held him, how +blood showed itself in two places, how the ropes slackened under the +weight of the hanging body, and how the workman sat down, his head +hanging unnaturally and one leg bent under him. Pierre ran up to the +post. No one hindered him. Pale, frightened people were doing +something around the workman. The lower jaw of an old Frenchman with a +thick mustache trembled as he untied the ropes. The body collapsed. +The soldiers dragged it awkwardly from the post and began pushing it +into the pit. + +They all plainly and certainly knew that they were criminals who +must hide the traces of their guilt as quickly as possible. + +Pierre glanced into the pit and saw that the factory lad was lying +with his knees close up to his head and one shoulder higher than the +other. That shoulder rose and fell rhythmically and convulsively, +but spadefuls of earth were already being thrown over the whole +body. One of the soldiers, evidently suffering, shouted gruffly and +angrily at Pierre to go back. But Pierre did not understand him and +remained near the post, and no one drove him away. + +When the pit had been filled up a command was given. Pierre was +taken back to his place, and the rows of troops on both sides of the +post made a half turn and went past it at a measured pace. The +twenty-four sharpshooters with discharged muskets, standing in the +center of the circle, ran back to their places as the companies passed +by. + +Pierre gazed now with dazed eyes at these sharpshooters who ran in +couples out of the circle. All but one rejoined their companies. +This one, a young soldier, his face deadly pale, his shako pushed +back, and his musket resting on the ground, still stood near the pit +at the spot from which he had fired. He swayed like a drunken man, +taking some steps forward and back to save himself from falling. An +old, noncommissioned officer ran out of the ranks and taking him by +the elbow dragged him to his company. The crowd of Russians and +Frenchmen began to disperse. They all went away silently and with +drooping heads. + +"That will teach them to start fires," said one of the Frenchmen. + +Pierre glanced round at the speaker and saw that it was a soldier +who was trying to find some relief after what had been done, but was +not able to do so. Without finishing what he had begun to say he +made a hopeless movement with his arm and went away. + + + + + +CHAPTER XII + + +After the execution Pierre was separated from the rest of the +prisoners and placed alone in a small, ruined, and befouled church. + +Toward evening a noncommissioned officer entered with two soldiers +and told him that he had been pardoned and would now go to the +barracks for the prisoners of war. Without understanding what was said +to him, Pierre got up and went with the soldiers. They took him to the +upper end of the field, where there were some sheds built of charred +planks, beams, and battens, and led him into one of them. In the +darkness some twenty different men surrounded Pierre. He looked at +them without understanding who they were, why they were there, or what +they wanted of him. He heard what they said, but did not understand +the meaning of the words and made no kind of deduction from or +application of them. He replied to questions they put to him, but +did not consider who was listening to his replies, nor how they +would understand them. He looked at their faces and figures, but +they all seemed to him equally meaningless. + +From the moment Pierre had witnessed those terrible murders +committed by men who did not wish to commit them, it was as if the +mainspring of his life, on which everything depended and which made +everything appear alive, had suddenly been wrenched out and everything +had collapsed into a heap of meaningless rubbish. Though he did not +acknowledge it to himself, his faith in the right ordering of the +universe, in humanity, in his own soul, and in God, had been +destroyed. He had experienced this before, but never so strongly as +now. When similar doubts had assailed him before, they had been the +result of his own wrongdoing, and at the bottom of his heart he had +felt that relief from his despair and from those doubts was to be +found within himself. But now he felt that the universe had crumbled +before his eyes and only meaningless ruins remained, and this not by +any fault of his own. He felt that it was not in his power to regain +faith in the meaning of life. + +Around him in the darkness men were standing and evidently something +about him interested them greatly. They were telling him something and +asking him something. Then they led him away somewhere, and at last he +found himself in a corner of the shed among men who were laughing +and talking on all sides. + +"Well, then, mates... that very prince who..." some voice at the +other end of the shed was saying, with a strong emphasis on the word +who. + +Sitting silent and motionless on a heap of straw against the wall, +Pierre sometimes opened and sometimes closed his eyes. But as soon +as he closed them he saw before him the dreadful face of the factory +lad--especially dreadful because of its simplicity--and the faces of +the murderers, even more dreadful because of their disquiet. And he +opened his eyes again and stared vacantly into the darkness around +him. + +Beside him in a stooping position sat a small man of whose +presence he was first made aware by a strong smell of perspiration +which came from him every time he moved. This man was doing +something to his legs in the darkness, and though Pierre could not see +his face he felt that the man continually glanced at him. On growing +used to the darkness Pierre saw that the man was taking off his leg +bands, and the way he did it aroused Pierre's interest. + +Having unwound the string that tied the band on one leg, he +carefully coiled it up and immediately set to work on the other leg, +glancing up at Pierre. While one hand hung up the first string the +other was already unwinding the band on the second leg. In this way, +having carefully removed the leg bands by deft circular motions of his +arm following one another uninterruptedly, the man hung the leg +bands up on some pegs fixed above his head. Then he took out a +knife, cut something, closed the knife, placed it under the head of +his bed, and, seating himself comfortably, clasped his arms round +his lifted knees and fixed his eyes on Pierre. The latter was +conscious of something pleasant, comforting, and well rounded in these +deft movements, in the man's well-ordered arrangements in his +corner, and even in his very smell, and he looked at the man without +taking his eyes from him. + +"You've seen a lot of trouble, sir, eh?" the little man suddenly +said. + +And there was so much kindliness and simplicity in his singsong +voice that Pierre tried to reply, but his jaw trembled and he felt +tears rising to his eyes. The little fellow, giving Pierre no time +to betray his confusion, instantly continued in the same pleasant +tones: + +"Eh, lad, don't fret!" said he, in the tender singsong caressing +voice old Russian peasant women employ. "Don't fret, friend--'suffer +an hour, live for an age!' that's how it is, my dear fellow. And +here we live, thank heaven, without offense. Among these folk, too, +there are good men as well as bad," said he, and still speaking, he +turned on his knees with a supple movement, got up, coughed, and +went off to another part of the shed. + +"Eh, you rascal!" Pierre heard the same kind voice saying at the +other end of the shed. "So you've come, you rascal? She remembers... +Now, now, that'll do!" + +And the soldier, pushing away a little dog that was jumping up at +him, returned to his place and sat down. In his hands he had something +wrapped in a rag. + +"Here, eat a bit, sir," said he, resuming his former respectful tone +as he unwrapped and offered Pierre some baked potatoes. "We had soup +for dinner and the potatoes are grand!" + +Pierre had not eaten all day and the smell of the potatoes seemed +extremely pleasant to him. He thanked the soldier and began to eat. + +"Well, are they all right?" said the soldier with a smile. "You +should do like this." + +He took a potato, drew out his clasp knife, cut the potato into +two equal halves on the palm of his hand, sprinkled some salt on it +from the rag, and handed it to Pierre. + +"The potatoes are grand!" he said once more. "Eat some like that!" + +Pierre thought he had never eaten anything that tasted better. + +"Oh, I'm all right," said he, "but why did they shoot those poor +fellows? The last one was hardly twenty." + +"Tss, tt...!" said the little man. "Ah, what a sin... what a sin!" +he added quickly, and as if his words were always waiting ready in his +mouth and flew out involuntarily he went on: "How was it, sir, that +you stayed in Moscow?" + +"I didn't think they would come so soon. I stayed accidentally," +replied Pierre. + +"And how did they arrest you, dear lad? At your house?" + +"No, I went to look at the fire, and they arrested me there, and +tried me as an incendiary." + +"Where there's law there's injustice," put in the little man. + +"And have you been here long?" Pierre asked as he munched the last +of the potato. + +"I? It was last Sunday they took me, out of a hospital in Moscow." + +"Why, are you a soldier then?" + +"Yes, we are soldiers of the Apsheron regiment. I was dying of +fever. We weren't told anything. There were some twenty of us lying +there. We had no idea, never guessed at all." + +"And do you feel sad here?" Pierre inquired. + +"How can one help it, lad? My name is Platon, and the surname is +Karataev," he added, evidently wishing to make it easier for Pierre to +address him. "They call me 'little falcon' in the regiment. How is one +to help feeling sad? Moscow--she's the mother of cities. How can one +see all this and not feel sad? But 'the maggot gnaws the cabbage, +yet dies first'; that's what the old folks used to tell us," he +added rapidly. + +"What? What did you say?" asked Pierre. + +"Who? I?" said Karataev. "I say things happen not as we plan but +as God judges," he replied, thinking that he was repeating what he had +said before, and immediately continued: + +"Well, and you, have you a family estate, sir? And a house? So you +have abundance, then? And a housewife? And your old parents, are +they still living?" he asked. + +And though it was too dark for Pierre to see, he felt that a +suppressed smile of kindliness puckered the soldier's lips as he put +these questions. He seemed grieved that Pierre had no parents, +especially that he had no mother. + +"A wife for counsel, a mother-in-law for welcome, but there's none +as dear as one's own mother!" said he. "Well, and have you little +ones?" he went on asking. + +Again Pierre's negative answer seemed to distress him, and he +hastened to add: + +"Never mind! You're young folks yet, and please God may still have +some. The great thing is to live in harmony...." + +"But it's all the same now," Pierre could not help saying. + +"Ah, my dear fellow!" rejoined Karataev, "never decline a prison +or a beggar's sack!" + +He seated himself more comfortably and coughed, evidently +preparing to tell a long story. + +"Well, my dear fellow, I was still living at home," he began. "We +had a well-to-do homestead, plenty of land, we peasants lived well and +our house was one to thank God for. When Father and we went out mowing +there were seven of us. We lived well. We were real peasants. It so +happened..." + +And Platon Karataev told a long story of how he had gone into +someone's copse to take wood, how he had been caught by the keeper, +had been tried, flogged, and sent to serve as a soldier. + +"Well, lad," and a smile changed the tone of his voice "we thought +it was a misfortune but it turned out a blessing! If it had not been +for my sin, my brother would have had to go as a soldier. But he, my +younger brother, had five little ones, while I, you see, only left a +wife behind. We had a little girl, but God took her before I went as a +soldier. I come home on leave and I'll tell you how it was, I look and +see that they are living better than before. The yard full of +cattle, the women at home, two brothers away earning wages, and only +Michael the youngest, at home. Father, he says, 'All my children are +the same to me: it hurts the same whichever finger gets bitten. But if +Platon hadn't been shaved for a soldier, Michael would have had to +go.' called us all to him and, will you believe it, placed us in front +of the icons. 'Michael,' he says, 'come here and bow down to his feet; +and you, young woman, you bow down too; and you, grandchildren, also +bow down before him! Do you understand?' he says. That's how it is, +dear fellow. Fate looks for a head. But we are always judging, 'that's +not well--that's not right!' Our luck is like water in a dragnet: +you pull at it and it bulges, but when you've drawn it out it's empty! +That's how it is." + +And Platon shifted his seat on the straw. + +After a short silence he rose. + +"Well, I think you must be sleepy," said he, and began rapidly +crossing himself and repeating: + +"Lord Jesus Christ, holy Saint Nicholas, Frola and Lavra! Lord Jesus +Christ, holy Saint Nicholas, Frola and Lavra! Lord Jesus Christ, +have mercy on us and save us!" he concluded, then bowed to the ground, +got up, sighed, and sat down again on his heap of straw. "That's the +way. Lay me down like a stone, O God, and raise me up like a loaf," he +muttered as he lay down, pulling his coat over him. + +"What prayer was that you were saying?" asked Pierre. + +"Eh?" murmured Platon, who had almost fallen asleep. "What was I +saying? I was praying. Don't you pray?" + +"Yes, I do," said Pierre. "But what was that you said: Frola and +Lavra?" + +"Well, of course," replied Platon quickly, "the horses' saints. +One must pity the animals too. Eh, the rascal! Now you've curled up +and got warm, you daughter of a bitch!" said Karataev, touching the +dog that lay at his feet, and again turning over he fell asleep +immediately. + +Sounds of crying and screaming came from somewhere in the distance +outside, and flames were visible through the cracks of the shed, but +inside it was quiet and dark. For a long time Pierre did not sleep, +but lay with eyes open in the darkness, listening to the regular +snoring of Platon who lay beside him, and he felt that the world +that had been shattered was once more stirring in his soul with a +new beauty and on new and unshakable foundations. + + + + + +CHAPTER XIII + + +Twenty-three soldiers, three officers, and two officials were +confined in the shed in which Pierre had been placed and where he +remained for four weeks. + +When Pierre remembered them afterwards they all seemed misty figures +to him except Platon Karataev, who always remained in his mind a +most vivid and precious memory and the personification of everything +Russian, kindly, and round. When Pierre saw his neighbor next +morning at dawn the first impression of him, as of something round, +was fully confirmed: Platon's whole figure--in a French overcoat +girdled with a cord, a soldier's cap, and bast shoes--was round. His +head was quite round, his back, chest, shoulders, and even his arms, +which he held as if ever ready to embrace something, were rounded, his +pleasant smile and his large, gentle brown eyes were also round. + +Platon Karataev must have been fifty, judging by his stories of +campaigns he had been in, told as by an old soldier. He did not +himself know his age and was quite unable to determine it. But his +brilliantly white, strong teeth which showed in two unbroken +semicircles when he laughed--as he often did--were all sound and good, +there was not a gray hair in his beard or on his head, and his whole +body gave an impression of suppleness and especially of firmness and +endurance. + +His face, despite its fine, rounded wrinkles, had an expression of +innocence and youth, his voice was pleasant and musical. But the chief +peculiarity of his speech was its directness and appositeness. It +was evident that he never considered what he had said or was going +to say, and consequently the rapidity and justice of his intonation +had an irresistible persuasiveness. + +His physical strength and agility during the first days of his +imprisonment were such that he seemed not to know what fatigue and +sickness meant. Every night before lying down, he said: "Lord, lay +me down as a stone and raise me up as a loaf!" and every morning on +getting up, he said: "I lay down and curled up, I get up and shake +myself." And indeed he only had to lie down, to fall asleep like a +stone, and he only had to shake himself, to be ready without a +moment's delay for some work, just as children are ready to play +directly they awake. He could do everything, not very well but not +badly. He baked, cooked, sewed, planed, and mended boots. He was +always busy, and only at night allowed himself conversation--of +which he was fond--and songs. He did not sing like a trained singer +who knows he is listened to, but like the birds, evidently giving vent +to the sounds in the same way that one stretches oneself or walks +about to get rid of stiffness, and the sounds were always +high-pitched, mournful, delicate, and almost feminine, and his face at +such times was very serious. + +Having been taken prisoner and allowed his beard to grow, he +seemed to have thrown off all that had been forced upon him- +everything military and alien to himself--and had returned to his +former peasant habits. + +"A soldier on leave--a shirt outside breeches," he would say. + +He did not like talking about his life as a soldier, though he did +not complain, and often mentioned that he had not been flogged once +during the whole of his army service. When he related anything it +was generally some old and evidently precious memory of his +"Christian" life, as he called his peasant existence. The proverbs, of +which his talk was full, were for the most part not the coarse and +indecent saws soldiers employ, but those folk sayings which taken +without a context seem so insignificant, but when used appositely +suddenly acquire a significance of profound wisdom. + +He would often say the exact opposite of what he had said on a +previous occasion, yet both would be right. He liked to talk and he +talked well, adorning his speech with terms of endearment and with +folk sayings which Pierre thought he invented himself, but the chief +charm of his talk lay in the fact that the commonest events--sometimes +just such as Pierre had witnessed without taking notice of them- +assumed in Karataev's a character of solemn fitness. He liked to +hear the folk tales one of the soldiers used to tell of an evening +(they were always the same), but most of all he liked to hear +stories of real life. He would smile joyfully when listening to such +stories, now and then putting in a word or asking a question to make +the moral beauty of what he was told clear to himself. Karataev had no +attachments, friendships, or love, as Pierre understood them, but +loved and lived affectionately with everything life brought him in +contact with, particularly with man--not any particular man, but those +with whom he happened to be. He loved his dog, his comrades, the +French, and Pierre who was his neighbor, but Pierre felt that in spite +of Karataev's affectionate tenderness for him (by which he +unconsciously gave Pierre's spiritual life its due) he would not +have grieved for a moment at parting from him. And Pierre began to +feel in the same way toward Karataev. + +To all the other prisoners Platon Karataev seemed a most ordinary +soldier. They called him "little falcon" or "Platosha," chaffed him +good-naturedly, and sent him on errands. But to Pierre he always +remained what he had seemed that first night: an unfathomable, +rounded, eternal personification of the spirit of simplicity and +truth. + +Platon Karataev knew nothing by heart except his prayers. When he +began to speak he seemed not to know how he would conclude. + +Sometimes Pierre, struck by the meaning of his words, would ask +him to repeat them, but Platon could never recall what he had said a +moment before, just as he never could repeat to Pierre the words of +his favorite song: native and birch tree and my heart is sick occurred +in it, but when spoken and not sung, no meaning could be got out of +it. He did not, and could not, understand the meaning of words apart +from their context. Every word and action of his was the manifestation +of an activity unknown to him, which was his life. But his life, as he +regarded it, had no meaning as a separate thing. It had meaning only +as part of a whole of which he was always conscious. His words and +actions flowed from him as evenly, inevitably, and spontaneously as +fragrance exhales from a flower. He could not understand the value +or significance of any word or deed taken separately. + + + + + +CHAPTER XIV + + +When Princess Mary heard from Nicholas that her brother was with the +Rostovs at Yaroslavl she at once prepared to go there, in spite of her +aunt's efforts to dissuade her--and not merely to go herself but to +take her nephew with her. Whether it were difficult or easy, +possible or impossible, she did not ask and did not want to know: it +was her duty not only herself to be near her brother who was perhaps +dying, but to do everything possible to take his son to him, and so +she prepared to set off. That she had not heard from Prince Andrew +himself, Princess Mary attributed to his being too weak to write or to +his considering the long journey too hard and too dangerous for her +and his son. + +In a few days Princess Mary was ready to start. Her equipages were +the huge family coach in which she had traveled to Voronezh, a +semiopen trap, and a baggage cart. With her traveled Mademoiselle +Bourienne, little Nicholas and his tutor, her old nurse, three +maids, Tikhon, and a young footman and courier her aunt had sent to +accompany her. + +The usual route through Moscow could not be thought of, and the +roundabout way Princess Mary was obliged to take through Lipetsk, +Ryazan, Vladimir, and Shuya was very long and, as post horses were not +everywhere obtainable, very difficult, and near Ryazan where the +French were said to have shown themselves was even dangerous. + +During this difficult journey Mademoiselle Bourienne, Dessalles, and +Princess Mary's servants were astonished at her energy and firmness of +spirit. She went to bed later and rose earlier than any of them, and +no difficulties daunted her. Thanks to her activity and energy, +which infected her fellow travelers, they approached Yaroslavl by +the end of the second week. + +The last days of her stay in Voronezh had been the happiest of her +life. Her love for Rostov no longer tormented or agitated her. It +filled her whole soul, had become an integral part of herself, and she +no longer struggled against it. Latterly she had become convinced that +she loved and was beloved, though she never said this definitely to +herself in words. She had become convinced of it at her last interview +with Nicholas, when he had come to tell her that her brother was +with the Rostovs. Not by a single word had Nicholas alluded to the +fact that Prince Andrew's relations with Natasha might, if he +recovered, be renewed, but Princess Mary saw by his face that he +knew and thought of this. + +Yet in spite of that, his relation to her--considerate, delicate, +and loving--not only remained unchanged, but it sometimes seemed to +Princess Mary that he was even glad that the family connection between +them allowed him to express his friendship more freely. She knew +that she loved for the first and only time in her life and felt that +she was beloved, and was happy in regard to it. + +But this happiness on one side of her spiritual nature did not +prevent her feeling grief for her brother with full force; on the +contrary, that spiritual tranquility on the one side made it the +more possible for her to give full play to her feeling for her +brother. That feeling was so strong at the moment of leaving +Voronezh that those who saw her off, as they looked at her careworn, +despairing face, felt sure she would fall ill on the journey. But +the very difficulties and preoccupations of the journey, which she +took so actively in hand, saved her for a while from her grief and +gave her strength. + +As always happens when traveling, Princess Mary thought only of +the journey itself, forgetting its object. But as she approached +Yaroslavl the thought of what might await her there--not after many +days, but that very evening--again presented itself to her and her +agitation increased to its utmost limit. + +The courier who had been sent on in advance to find out where the +Rostovs were staying in Yaroslavl, and in what condition Prince Andrew +was, when he met the big coach just entering the town gates was +appalled by the terrible pallor of the princess' face that looked +out at him from the window. + +"I have found out everything, your excellency: the Rostovs are +staying at the merchant Bronnikov's house, in the Square not far +from here, right above the Volga," said the courier. + +Princess Mary looked at him with frightened inquiry, not +understanding why he did not reply to what she chiefly wanted to know: +how was her brother? Mademoiselle Bourienne put that question for her. + +"How is the prince?" she asked. + +"His excellency is staying in the same house with them." + +"Then he is alive," thought Princess Mary, and asked in a low voice: +"How is he?" + +"The servants say he is still the same." + +What "still the same" might mean Princess Mary did not ask, but with +an unnoticed glance at little seven-year-old Nicholas, who was sitting +in front of her looking with pleasure at the town, she bowed her +head and did not raise it again till the heavy coach, rumbling, +shaking and swaying, came to a stop. The carriage steps clattered as +they were let down. + +The carriage door was opened. On the left there was water--a great +river--and on the right a porch. There were people at the entrance: +servants, and a rosy girl with a large plait of black hair, smiling as +it seemed to Princess Mary in an unpleasantly affected way. (This +was Sonya.) Princess Mary ran up the steps. "This way, this way!" said +the girl, with the same artificial smile, and the princess found +herself in the hall facing an elderly woman of Oriental type, who came +rapidly to meet her with a look of emotion. This was the countess. She +embraced Princess Mary and kissed her. + +"Mon enfant!" she muttered, "je vous aime et vous connais depuis +longtemps."* + + +*"My child! I love you and have known you a long time." + + Despite her excitement, Princess Mary realized that this was the +countess and that it was necessary to say something to her. Hardly +knowing how she did it, she contrived to utter a few polite phrases in +French in the same tone as those that had been addressed to her, and +asked: "How is he?" + +"The doctor says that he is not in danger," said the countess, but +as she spoke she raised her eyes with a sigh, and her gesture conveyed +a contradiction of her words. + +"Where is he? Can I see him--can I?" asked the princess. + +"One moment, Princess, one moment, my dear! Is this his son?" said +the countess, turning to little Nicholas who was coming in with +Dessalles. "There will be room for everybody, this is a big house. Oh, +what a lovely boy!" + +The countess took Princess Mary into the drawing room, where Sonya +was talking to Mademoiselle Bourienne. The countess caressed the +boy, and the old count came in and welcomed the princess. He had +changed very much since Princess Mary had last seen him. Then he had +been a brisk, cheerful, self-assured old man; now he seemed a pitiful, +bewildered person. While talking to Princess Mary he continually +looked round as if asking everyone whether he was doing the right +thing. After the destruction of Moscow and of his property, thrown out +of his accustomed groove he seemed to have lost the sense of his own +significance and to feel that there was no longer a place for him in +life. + +In spite of her one desire to see her brother as soon as possible, +and her vexation that at the moment when all she wanted was to see him +they should be trying to entertain her and pretending to admire her +nephew, the princess noticed all that was going on around her and felt +the necessity of submitting, for a time, to this new order of things +which she had entered. She knew it to be necessary, and though it +was hard for her she was not vexed with these people. + +"This is my niece," said the count, introducing Sonya--"You don't +know her, Princess?" + +Princess Mary turned to Sonya and, trying to stifle the hostile +feeling that arose in her toward the girl, she kissed her. But she +felt oppressed by the fact that the mood of everyone around her was so +far from what was in her own heart. + +"Where is he?" she asked again, addressing them all. + +"He is downstairs. Natasha is with him," answered Sonya, flushing. +"We have sent to ask. I think you must be tired, Princess." + +Tears of vexation showed themselves in Princess Mary's eyes. She +turned away and was about to ask the countess again how to go to +him, when light, impetuous, and seemingly buoyant steps were heard +at the door. The princess looked round and saw Natasha coming in, +almost running--that Natasha whom she had liked so little at their +meeting in Moscow long since. + +But hardly had the princess looked at Natasha's face before she +realized that here was a real comrade in her grief, and consequently a +friend. She ran to meet her, embraced her, and began to cry on her +shoulder. + +As soon as Natasha, sitting at the head of Prince Andrew's bed, +heard of Princess Mary's arrival, she softly left his room and +hastened to her with those swift steps that had sounded buoyant to +Princess Mary. + +There was only one expression on her agitated face when she ran into +the drawing room--that of love--boundless love for him, for her, and +for all that was near to the man she loved; and of pity, suffering for +others, and passionate desire to give herself entirely to helping +them. It was plain that at that moment there was in Natasha's heart no +thought of herself or of her own relations with Prince Andrew. + +Princess Mary, with her acute sensibility, understood all this at +the first glance at Natasha's face, and wept on her shoulder with +sorrowful pleasure. + +"Come, come to him, Mary," said Natasha, leading her into the +other room. + +Princess Mary raised her head, dried her eyes, and turned to +Natasha. She felt that from her she would be able to understand and +learn everything. + +"How..." she began her question but stopped short. + +She felt that it was impossible to ask, or to answer, in words. +Natasha's face eyes would have to tell her all more clearly +and profoundly. + +Natasha was gazing at her, but seemed afraid and in doubt whether to +say all she knew or not; she seemed to feel that before those luminous +eyes which penetrated into the very depths of her heart, it was +impossible not to tell the whole truth which she saw. And suddenly, +Natasha's lips twitched, ugly wrinkles gathered round her mouth, and +covering her face with her hands she burst into sobs. + +Princess Mary understood. + +But she still hoped, and asked, in words she herself did not trust: + +"But how is his wound? What is his general condition?" + +"You, you... will see," was all Natasha could say. + +They sat a little while downstairs near his room till they had +left off crying and were able to go to him with calm faces. + +"How has his whole illness gone? Is it long since he grew worse? +When did this happen?" Princess Mary inquired. + +Natasha told her that at first there had been danger from his +feverish condition and the pain he suffered, but at Troitsa that had +passed and the doctor had only been afraid of gangrene. That danger +had also passed. When they reached Yaroslavl the wound had begun to +fester (Natasha knew all about such things as festering) and the +doctor had said that the festering might take a normal course. Then +fever set in, but the doctor had said the fever was not very serious. + +"But two days ago this suddenly happened," said Natasha, +struggling with her sobs. "I don't know why, but you will see what +he is like." + +"Is he weaker? Thinner?" asked the princess. + +"No, it's not that, but worse. You will see. O, Mary, he is too +good, he cannot, cannot live, because..." + + + + + +CHAPTER XV + + +When Natasha opened Prince Andrew's door with a familiar movement +and let Princess Mary pass into the room before her, the princess felt +the sobs in her throat. Hard as she had tried to prepare herself, +and now tried to remain tranquil, she knew that she would be unable to +look at him without tears. + +The princess understood what Natasha had meant by the words: "two +days ago this suddenly happened." She understood those words to mean +that he had suddenly softened and that this softening and gentleness +were signs of approaching death. As she stepped to the door she +already saw in imagination Andrew's face as she remembered it in +childhood, a gentle, mild, sympathetic face which he had rarely shown, +and which therefore affected her very strongly. She was sure he +would speak soft, tender words to her such as her father had uttered +before his death, and that she would not be able to bear it and +would burst into sobs in his presence. Yet sooner or later it had to +be, and she went in. The sobs rose higher and higher in her throat +as she more and more clearly distinguished his form and her +shortsighted eyes tried to make out his features, and then she saw his +face and met his gaze. + +He was lying in a squirrel-fur dressing gown on a divan, +surrounded by pillows. He was thin and pale. In one thin, +translucently white hand he held a handkerchief, while with the +other he stroked the delicate mustache he had grown, moving his +fingers slowly. His eyes gazed at them as they entered. + +On seeing his face and meeting his eyes Princess Mary's pace +suddenly slackened, she felt her tears dry up and her sobs ceased. She +suddenly felt guilty and grew timid on catching the expression of +his face and eyes. + +"But in what am I to blame?" she asked herself. And his cold, +stern look replied: "Because you are alive and thinking of the living, +while I..." + +In the deep gaze that seemed to look not outwards but +inwards there was an almost hostile expression as he slowly regarded +his sister and Natasha. + +He kissed his sister, holding her hand in his as was their wont. + +"How are you, Mary? How did you manage to get here?" said he in a +voice as calm and aloof as his look. + +Had he screamed in agony, that scream would not have struck such +horror into Princess Mary's heart as the tone of his voice. + +"And have you brought little Nicholas?" he asked in the same slow, +quiet manner and with an obvious effort to remember. + +"How are you now?" said Princess Mary, herself surprised at what she +was saying. + +"That, my dear, you must ask the doctor," he replied, and again +making an evident effort to be affectionate, he said with his lips +only (his words clearly did not correspond to his thoughts): + +"Merci, chere amie, d'etre venue."* + + +*"Thank you for coming, my dear." + + +Princess Mary pressed his hand. The pressure made him wince just +perceptibly. He was silent, and she did not know what to say. She +now understood what had happened to him two days before. In his words, +his tone, and especially in that calm, almost antagonistic look +could be felt an estrangement from everything belonging to this world, +terrible in one who is alive. Evidently only with an effort did he +understand anything living; but it was obvious that he failed to +understand, not because he lacked the power to do so but because he +understood something else--something the living did not and could +not understand--and which wholly occupied his mind. + +"There, you see how strangely fate has brought us together," said +he, breaking the silence and pointing to Natasha. "She looks after +me all the time." + +Princess Mary heard him and did not understand how he could say such +a thing. He, the sensitive, tender Prince Andrew, how could he say +that, before her whom he loved and who loved him? Had he expected to +live he could not have said those words in that offensively cold tone. +If he had not known that he was dying, how could he have failed to +pity her and how could he speak like that in her presence? The only +explanation was that he was indifferent, because something else, +much more important, had been revealed to him. + +The conversation was cold and disconnected and continually broke +off. + +"Mary came by way of Ryazan," said Natasha. + +Prince Andrew did not notice that she called his sister Mary, and +only after calling her so in his presence did Natasha notice it +herself. + +"Really?" he asked. + +"They told her that all Moscow has been burned down, and that..." + +Natasha stopped. It was impossible to talk. It was plain that he was +making an effort to listen, but could not do so. + +"Yes, they say it's burned," he said. "It's a great pity," and he +gazed straight before him, absently stroking his mustache with his +fingers. + +"And so you have met Count Nicholas, Mary?" Prince Andrew suddenly +said, evidently wishing to speak pleasantly to them. "He wrote here +that he took a great liking to you," he went on simply and calmly, +evidently unable to understand all the complex significance his +words had for living people. "If you liked him too, it would be a good +thing for you to get married," he added rather more quickly, as if +pleased at having found words he had long been seeking. + +Princess Mary heard his words but they had no meaning for her, +except as a proof of how far away he now was from everything living. + +"Why talk of me?" she said quietly and glanced at Natasha. + +Natasha, who felt her glance, did not look at her. All three were +again silent. + +"Andrew, would you like..." Princess Mary suddenly said in a +trembling voice, "would you like to see little Nicholas? He is +always talking about you!" + +Prince Andrew smiled just perceptibly and for the first time, but +Princess Mary, who knew his face so well, saw with horror that he +did not smile with pleasure or affection for his son, but with +quiet, gentle irony because he thought she was trying what she +believed to be the last means of arousing him. + +"Yes, I shall be very glad to see him. Is he quite well?" + +When little Nicholas was brought into Prince Andrew's room he looked +at his father with frightened eyes, but did not cry, because no one +else was crying. Prince Andrew kissed him and evidently did not know +what to say to him. + +When Nicholas had been led away, Princess Mary again went up to +her brother, kissed him, and unable to restrain her tears any longer +began to cry. + +He looked at her attentively. + +"Is it about Nicholas?" he asked. + +Princess Mary nodded her head, weeping. + +"Mary, you know the Gosp..." but he broke off. + +"What did you say?" + +"Nothing. You mustn't cry here," he said, looking at her with the +same cold expression. + + +When Princess Mary began to cry, he understood that she was crying +at the thought that little Nicholas would be left without a father. +With a great effort he tried to return to life and to see things +from their point of view. + +"Yes, to them it must seem sad!" he thought. "But how simple it is. + +"The fowls of the air sow not, neither do they reap, yet your Father +feedeth them," he said to himself and wished to say to Princess +Mary; "but no, they will take it their own way, they won't understand! +They can't understand that all those feelings they prize so--all our +feelings, all those ideas that seem so important to us, are +unnecessary. We cannot understand one another," and he remained +silent. + + +Prince Andrew's little son was seven. He could scarcely read, and +knew nothing. After that day he lived through many things, gaining +knowledge, observation, and experience, but had he possessed all the +faculties he afterwards acquired, he could not have had a better or +more profound understanding of the meaning of the scene he had +witnessed between his father, Mary, and Natasha, than he had then. +He understood it completely, and, leaving the room without crying, +went silently up to Natasha who had come out with him and looked shyly +at her with his beautiful, thoughtful eyes, then his uplifted, rosy +upper lip trembled and leaning his head against her he began to cry. + +After that he avoided Dessalles and the countess who caressed him +and either sat alone or came timidly to Princess Mary, or to Natasha +of whom he seemed even fonder than of his aunt, and clung to them +quietly and shyly. + +When Princess Mary had left Prince Andrew she fully understood +what Natasha's face had told her. She did not speak any more to +Natasha of hopes of saving his life. She took turns with her beside +his sofa, and did not cry any more, but prayed continually, turning in +soul to that Eternal and Unfathomable, whose presence above the +dying man was now so evident. + + + + + +CHAPTER XVI + + +Not only did Prince Andrew know he would die, but he felt that he +was dying and was already half dead. He was conscious of an +aloofness from everything earthly and a strange and joyous lightness +of existence. Without haste or agitation he awaited what was coming. +That inexorable, eternal, distant, and unknown the presence of which +he had felt continually all his life--was now near to him and, by +the strange lightness he experienced, almost comprehensible and +palpable... + + +Formerly he had feared the end. He had twice experienced that +terribly tormenting fear of death--the end--but now he no longer +understood that fear. + + He had felt it for the first time when the shell spun like a top +before him, and he looked at the fallow field, the bushes, and the +sky, and knew that he was face to face with death. When he came to +himself after being wounded and the flower of eternal, unfettered love +had instantly unfolded itself in his soul as if freed from the bondage +of life that had restrained it, he no longer feared death and ceased +to think about it. + +During the hours of solitude, suffering, and partial delirium he +spent after he was wounded, the more deeply he penetrated into the new +principle of eternal love revealed to him, the more he unconsciously +detached himself from earthly life. To love everything and everybody +and always to sacrifice oneself for love meant not to love anyone, not +to live this earthly life. And the more imbued he became with that +principle of love, the more he renounced life and the more +completely he destroyed that dreadful barrier which--in the absence of +such love--stands between life and death. When during those first days +he remembered that he would have to die, he said to himself: "Well, +what of it? So much the better!" + +But after the night in Mytishchi when, half delirious, he had seen +her for whom he longed appear before him and, having pressed her +hand to his lips, had shed gentle, happy tears, love for a +particular woman again crept unobserved into his heart and once more +bound him to life. And joyful and agitating thoughts began to occupy +his mind. Recalling the moment at the ambulance station when he had +seen Kuragin, he could not now regain the feeling he then had, but was +tormented by the question whether Kuragin was alive. And he dared +not inquire. + +His illness pursued its normal physical course, but what Natasha +referred to when she said: "This suddenly happened," had occurred +two days before Princess Mary arrived. It was the last spiritual +struggle between life and death, in which death gained the victory. It +was the unexpected realization of the fact that he still valued life +as presented to him in the form of his love for Natasha, and a last, +though ultimately vanquished, attack of terror before the unknown. + +It was evening. As usual after dinner he was slightly feverish, +and his thoughts were preternaturally clear. Sonya was sitting by +the table. He began to doze. Suddenly a feeling of happiness seized +him. + +"Ah, she has come!" thought he. + +And so it was: in Sonya's place sat Natasha who had just come in +noiselessly. + +Since she had begun looking after him, he had always experienced +this physical consciousness of her nearness. She was sitting in an +armchair placed sideways, screening the light of the candle from +him, and was knitting a stocking. She had learned to knit stockings +since Prince Andrew had casually mentioned that no one nursed the sick +so well as old nurses who knit stockings, and that there is +something soothing in the knitting of stockings. The needles clicked +lightly in her slender, rapidly moving hands, and he could clearly see +the thoughtful profile of her drooping face. She moved, and the ball +rolled off her knees. She started, glanced round at him, and screening +the candle with her hand stooped carefully with a supple and exact +movement, picked up the ball, and regained her former position. + +He looked at her without moving and saw that she wanted to draw a +deep breath after stooping, but refrained from doing so and breathed +cautiously. + +At the Troitsa monastery they had spoken of the past, and he had +told her that if he lived he would always thank God for his wound +which had brought them together again, but after that they never spoke +of the future. + +"Can it or can it not be?" he now thought as he looked at her and +listened to the light click of the steel needles. "Can fate have +brought me to her so strangely only for me to die?... Is it possible +that the truth of life has been revealed to me only to show me that +I have spent my life in falsity? I love her more than anything in +the world! But what am I to do if I love her?" he thought, and he +involuntarily groaned, from a habit acquired during his sufferings. + +On hearing that sound Natasha put down the stocking, leaned nearer +to him, and suddenly, noticing his shining eyes, stepped lightly up to +him and bent over him. + +"You are not asleep?" + +"No, I have been looking at you a long time. I felt you come in. +No one else gives me that sense of soft tranquillity that you do... +that light. I want to weep for joy." + +Natasha drew closer to him. Her face shone with rapturous joy. + +"Natasha, I love you too much! More than anything in the world." + +"And I!"--She turned away for an instant. "Why too much?" she asked. + +"Why too much?... Well, what do you, what do you feel in your +soul, your whole soul--shall I live? What do you think?" + +"I am sure of it, sure!" Natasha almost shouted, taking hold of both +his hands with a passionate movement. + +He remained silent awhile. + +"How good it would be!" and taking her hand he kissed it. + +Natasha felt happy and agitated, but at once remembered that this +would not do and that he had to be quiet. + +"But you have not slept," she said, repressing her joy. "Try to +sleep... please!" + +He pressed her hand and released it, and she went back to the candle +and sat down again in her former position. Twice she turned and looked +at him, and her eyes met his beaming at her. She set herself a task on +her stocking and resolved not to turn round till it was finished. + +Soon he really shut his eyes and fell asleep. He did not sleep +long and suddenly awoke with a start and in a cold perspiration. + +As he fell asleep he had still been thinking of the subject that now +always occupied his mind--about life and death, and chiefly about +death. He felt himself nearer to it. + +"Love? What is love?" he thought. + +"Love hinders death. Love is life. All, everything that I +understand, I understand only because I love. Everything is, +everything exists, only because I love. Everything is united by it +alone. Love is God, and to die means that I, a particle of love, shall +return to the general and eternal source." These thoughts seemed to +him comforting. But they were only thoughts. Something was lacking +in them, they were not clear, they were too one-sidedly personal and +brain-spun. And there was the former agitation and obscurity. He +fell asleep. + +He dreamed that he was lying in the room he really was in, but +that he was quite well and unwounded. Many various, indifferent, and +insignificant people appeared before him. He talked to them and +discussed something trivial. They were preparing to go away somewhere. +Prince Andrew dimly realized that all this was trivial and that he had +more important cares, but he continued to speak, surprising them by +empty witticisms. Gradually, unnoticed, all these persons began to +disappear and a single question, that of the closed door, superseded +all else. He rose and went to the door to bolt and lock it. Everything +depended on whether he was, or was not, in time to lock it. He went, +and tried to hurry, but his legs refused to move and he knew he +would not be in time to lock the door though he painfully strained all +his powers. He was seized by an agonizing fear. And that fear was +the fear of death. It stood behind the door. But just when he was +clumsily creeping toward the door, that dreadful something on the +other side was already pressing against it and forcing its way in. +Something not human--death--was breaking in through that door, and had +to be kept out. He seized the door, making a final effort to hold it +back--to lock it was no longer possible--but his efforts were weak and +clumsy and the door, pushed from behind by that terror, opened and +closed again. + +Once again it pushed from outside. His last superhuman efforts +were vain and both halves of the door noiselessly opened. It +entered, and it was death, and Prince Andrew died. + +But at the instant he died, Prince Andrew remembered that he was +asleep, and at the very instant he died, having made an effort, he +awoke. + +"Yes, it was death! I died--and woke up. Yes, death is an +awakening!" And all at once it grew light in his soul and the veil +that had till then concealed the unknown was lifted from his spiritual +vision. He felt as if powers till then confined within him had been +liberated, and that strange lightness did not again leave him. + +When, waking in a cold perspiration, he moved on the divan, +Natasha went up and asked him what was the matter. He did not answer +and looked at her strangely, not understanding. + +That was what had happened to him two days before Princess Mary's +arrival. From that day, as the doctor expressed it, the wasting +fever assumed a malignant character, but what the doctor said did +not interest Natasha, she saw the terrible moral symptoms which to her +were more convincing. + +From that day an awakening from life came to Prince Andrew +together with his awakening from sleep. And compared to the duration +of life it did not seem to him slower than an awakening from sleep +compared to the duration of a dream. + +There was nothing terrible or violent in this comparatively slow +awakening. + +His last days and hours passed in an ordinary and simple way. Both +Princess Mary and Natasha, who did not leave him, felt this. They +did not weep or shudder and during these last days they themselves +felt that they were not attending on him (he was no longer there, he +had left them) but on what reminded them most closely of him--his +body. Both felt this so strongly that the outward and terrible side of +death did not affect them and they did not feel it necessary to foment +their grief. Neither in his presence nor out of it did they weep, +nor did they ever talk to one another about him. They felt that they +could not express in words what they understood. + +They both saw that he was sinking slowly and quietly, deeper and +deeper, away from them, and they both knew that this had to be so +and that it was right. + +He confessed, and received communion: everyone came to take leave of +him. When they brought his son to him, he pressed his lips to the +boy's and turned away, not because he felt it hard and sad (Princess +Mary and Natasha understood that) but simply because he thought it was +all that was required of him, but when they told him to bless the boy, +he did what was demanded and looked round as if asking whether there +was anything else he should do. + +When the last convulsions of the body, which the spirit was leaving, +occurred, Princess Mary and Natasha were present. + +"Is it over?" said Princess Mary when his body had for a few minutes +lain motionless, growing cold before them. Natasha went up, looked +at the dead eyes, and hastened to close them. She closed them but +did not kiss them, but clung to that which reminded her most nearly of +him--his body. + +"Where has he gone? Where is he now?..." + +When the body, washed and dressed, lay in the coffin on a table, +everyone came to take leave of him and they all wept. + +Little Nicholas cried because his heart was rent by painful +perplexity. The countess and Sonya cried from pity for Natasha and +because he was no more. The old count cried because he felt that +before long, he, too, must take the same terrible step. + +Natasha and Princess Mary also wept now, but not because of their +own personal grief; they wept with a reverent and softening emotion +which had taken possession of their souls at the consciousness of +the simple and solemn mystery of death that had been accomplished in +their presence. + + + + + +BOOK THIRTEEN: 1812 + + + + + +CHAPTER I + + +Man's mind cannot grasp the causes of events in their +completeness, but the desire to find those causes is implanted in +man's soul. And without considering the multiplicity and complexity of +the conditions any one of which taken separately may seem to be the +cause, he snatches at the first approximation to a cause that seems to +him intelligible and says: "This is the cause!" In historical events +(where the actions of men are the subject of observation) the first +and most primitive approximation to present itself was the will of the +gods and, after that, the will of those who stood in the most +prominent position--the heroes of history. But we need only +penetrate to the essence of any historic event--which lies in the +activity of the general mass of men who take part in it--to be +convinced that the will of the historic hero does not control the +actions of the mass but is itself continually controlled. It may +seem to be a matter of indifference whether we understand the +meaning of historical events this way or that; yet there is the same +difference between a man who says that the people of the West moved on +the East because Napoleon wished it and a man who says that this +happened because it had to happen, as there is between those who +declared that the earth was stationary and that the planets moved +round it and those who admitted that they did not know what upheld the +earth, but knew there were laws directing its movement and that of the +other planets. There is, and can be, no cause of an historical event +except the one cause of all causes. But there are laws directing +events, and some of these laws are known to us while we are +conscious of others we cannot comprehend. The discovery of these +laws is only possible when we have quite abandoned the +attempt to find the cause in the will of some one man, just as the +discovery of the laws of the motion of the planets was possible only +when men abandoned the conception of the fixity of the earth. + +The historians consider that, next to the battle of Borodino and the +occupation of Moscow by the enemy and its destruction by fire, the +most important episode of the war of 1812 was the movement of the +Russian army from the Ryazana to the Kaluga road and to the Tarutino +camp--the so-called flank march across the Krasnaya Pakhra River. They +ascribe the glory of that achievement of genius to different men and +dispute as to whom the honor is due. Even foreign historians, +including the French, acknowledge the genius of the Russian commanders +when they speak of that flank march. But it is hard to understand +why military writers, and following them others, consider this flank +march to be the profound conception of some one man who saved Russia +and destroyed Napoleon. In the first place it is hard to understand +where the profundity and genius of this movement lay, for not much +mental effort was needed to see that the best position for an army +when it is not being attacked is where there are most provisions; +and even a dull boy of thirteen could have guessed that the best +position for an army after its retreat from Moscow in 1812 was on +the Kaluga road. So it is impossible to understand by what reasoning +the historians reach the conclusion that this maneuver was a +profound one. And it is even more difficult to understand just why +they think that this maneuver was calculated to save Russia and +destroy the French; for this flank march, had it been preceded, +accompanied, or followed by other circumstances, might have proved +ruinous to the Russians and salutary for the French. If the position +of the Russian army really began to improve from the time of that +march, it does not at all follow that the march was the cause of it. + +That flank march might not only have failed to give any advantage to +the Russian army, but might in other circumstances have led to its +destruction. What would have happened had Moscow not burned down? If +Murat had not lost sight of the Russians? If Napoleon had not remained +inactive? If the Russian army at Krasnaya Pakhra had given battle as +Bennigsen and Barclay advised? What would have happened had the French +attacked the Russians while they were marching beyond the Pakhra? What +would have happened if on approaching Tarutino, Napoleon had +attacked the Russians with but a tenth of the energy he had shown when +he attacked them at Smolensk? What would have happened had the +French moved on Petersburg?... In any of these eventualities the flank +march that brought salvation might have proved disastrous. + +The third and most incomprehensible thing is that people studying +history deliberately avoid seeing that this flank march cannot be +attributed to any one man, that no one ever foresaw it, and that in +reality, like the retreat from Fili, it did not suggest itself to +anyone in its entirety, but resulted--moment by moment, step by +step, event by event--from an endless number of most diverse +circumstances and was only seen in its entirety when it had been +accomplished and belonged to the past. + +At the council at Fili the prevailing thought in the minds of the +Russian commanders was the one naturally suggesting itself, namely, +a direct retreat by the Nizhni road. In proof of this there is the +fact that the majority of the council voted for such a retreat, and +above all there is the well-known conversation after the council, +between the commander in chief and Lanskoy, who was in charge of the +commissariat department. Lanskoy informed the commander in chief +that the army supplies were for the most part stored along the Oka +in the Tula and Ryazan provinces, and that if they retreated on Nizhni +the army would be separated from its supplies by the broad river +Oka, which cannot be crossed early in winter. This was the first +indication of the necessity of deviating from what had previously +seemed the most natural course--a direct retreat on Nizhni-Novgorod. +The army turned more to the south, along the Ryazan road and nearer to +its supplies. Subsequently the inactivity of the French (who even +lost sight of the Russian army), concern for the safety of the arsenal +at Tula, and especially the advantages of drawing nearer to its +supplies caused the army to turn still further south to the Tula road. +Having crossed over, by a forced march, to the Tula road beyond the +Pakhra, the Russian commanders intended to remain at Podolsk and had +no thought of the Tarutino position; but innumerable circumstances and +the reappearance of French troops who had for a time lost touch with +the Russians, and projects of giving battle, and above all the +abundance of provisions in Kaluga province, obliged our army to turn +still more to the south and to cross from the Tula to the Kaluga +road and go to Tarutino, which was between the roads along which those +supplies lay. Just as it is impossible to say when it was decided to +abandon Moscow, so it is impossible to say precisely when, or by whom, +it was decided to move to Tarutino. Only when the army had got +there, as the result of innumerable and varying forces, did people +begin to assure themselves that they had desired this movement and +long ago foreseen its result. + + + + + +CHAPTER II + + +The famous flank movement merely consisted in this: after the +advance of the French had ceased, the Russian army, which had been +continually retreating straight back from the invaders, deviated +from that direct course and, not finding itself pursued, was naturally +drawn toward the district where supplies were abundant. + +If instead of imagining to ourselves commanders of genius leading +the Russian army, we picture that army without any leaders, it could +not have done anything but make a return movement toward Moscow, +describing an arc in the direction where most provisions were to be +found and where the country was richest. + +That movement from the Nizhni to the Ryazan, Tula, and Kaluga +roads was so natural that even the Russian marauders moved in that +direction, and demands were sent from Petersburg for Kutuzov to take +his army that way. At Tarutino Kutuzov received what was almost a +reprimand from the Emperor for having moved his army along the +Ryazan road, and the Emperor's letter indicated to him the very +position he had already occupied near Kaluga. + +Having rolled like a ball in the direction of the impetus given by +the whole campaign and by the battle of Borodino, the Russian army- +when the strength of that impetus was exhausted and no fresh push +was received--assumed the position natural to it. + +Kutuzov's merit lay, not in any strategic maneuver of genius, as +it is called, but in the fact that he alone understood the +significance of what had happened. He alone then understood the +meaning of the French army's inactivity, he alone continued to +assert that the battle of Borodino had been a victory, he alone--who +as commander in chief might have been expected to be eager to +attack--employed his whole strength to restrain the Russian army +from useless engagements. + +The beast wounded at Borodino was lying where the fleeing hunter had +left him; but whether he was still alive, whether he was strong and +merely lying low, the hunter did not know. Suddenly the beast was +heard to moan. + +The moan of that wounded beast (the French army) which betrayed +its calamitous condition was the sending of Lauriston to Kutuzov's +camp with overtures for peace. + +Napoleon, with his usual assurance that whatever entered his head +was right, wrote to Kutuzov the first words that occurred to him, +though they were meaningless. + + +MONSIEUR LE PRINCE KOUTOUZOV: I am sending one of my +adjutants-general to discuss several interesting questions with you. I +beg your Highness to credit what he says to you, especially when he +expresses the sentiment of esteem and special regard I have long +entertained for your person. This letter having no other object, I +pray God, monsieur le Prince Koutouzov, to keep you in His holy and +gracious protection! + +NAPOLEON + +MOSCOW, OCTOBER 30, 1812 + + +Kutuzov replied: "I should be cursed by posterity were I looked on +as the initiator of a settlement of any sort. Such is the present +spirit of my nation." But he continued to exert all his powers to +restrain his troops from attacking. + +During the month that the French troops were pillaging in Moscow and +the Russian troops were quietly encamped at Tarutino, a change had +taken place in the relative strength of the two armies--both in spirit +and in number--as a result of which the superiority had passed to +the Russian side. Though the condition and numbers of the French +army were unknown to the Russians, as soon as that change occurred the +need of attacking at once showed itself by countless signs. These +signs were: Lauriston's mission; the abundance of provisions at +Tarutino; the reports coming in from all sides of the inactivity and +disorder of the French; the flow of recruits to our regiments; the +fine weather; the long rest the Russian soldiers had enjoyed, and +the impatience to do what they had been assembled for, which usually +shows itself in an army that has been resting; curiosity as to what +the French army, so long lost sight of, was doing; the boldness with +which our outposts now scouted close up to the French stationed at +Tarutino; the news of easy successes gained by peasants and +guerrilla troops over the French, the envy aroused by this; the desire +for revenge that lay in the heart of every Russian as long as the +French were in Moscow, and (above all) a dim consciousness in every +soldier's mind that the relative strength of the armies had changed +and that the advantage was now on our side. There was a substantial +change in the relative strength, and an advance had become inevitable. +And at once, as a clock begins to strike and chime as soon as the +minute hand has completed a full circle, this change was shown by an +increased activity, whirring, and chiming in the higher spheres. + + + + + +CHAPTER III + + +The Russian army was commanded by Kutuzov and his staff, and also by +the Emperor from Petersburg. Before the news of the abandonment of +Moscow had been received in Petersburg, a detailed plan of the whole +campaign had been drawn up and sent to Kutuzov for his guidance. +Though this plan had been drawn up on the supposition that Moscow +was still in our hands, it was approved by the staff and accepted as a +basis for action. Kutuzov only replied that movements arranged from +a distance were always difficult to execute. So fresh instructions +were sent for the solution of difficulties that might be +encountered, as well as fresh people who were to watch Kutuzov's +actions and report upon them. + +Besides this, the whole staff of the Russian army was now +reorganized. The posts left vacant by Bagration, who had been +killed, and by Barclay, who had gone away in dudgeon, had to be +filled. Very serious consideration was given to the question whether +it would be better to put A in B's place and B in D's, or on the +contrary to put D in A's place, and so on--as if anything more than +A's or B's satisfaction depended on this. + +As a result of the hostility between Kutuzov and Bennigsen, his +Chief of Staff, the presence of confidential representatives of the +Emperor, and these transfers, a more than usually complicated play +of parties was going on among the staff of the army. A was undermining +B, D was undermining C, and so on in all possible combinations and +permutations. In all these plottings the subject of intrigue was +generally the conduct of the war, which all these men believed they +were directing; but this affair of the war went on independently of +them, as it had to go: that is, never in the way people devised, but +flowing always from the essential attitude of the masses. Only in +the highest spheres did all these schemes, crossings, and +interminglings appear to be a true reflection of what had to happen. + + +Prince Michael Ilarionovich! (wrote the Emperor on the second of +October in a letter that reached Kutuzov after the battle at Tarutino) +Since September 2 Moscow has been in the hands of the enemy. Your last +reports were written on the twentieth, and during all this time not +only has no action been taken against the enemy or for the relief of +the ancient capital, but according to your last report you have even +retreated farther. Serpukhov is already occupied by an enemy +detachment and Tula with its famous arsenal so indispensable to the +army, is in danger. From General Wintzingerode's reports, I see that +an enemy corps of ten thousand men is moving on the Petersburg road. +Another corps of several thousand men is moving on Dmitrov. A third +has advanced along the Vladimir road, and a fourth, rather +considerable detachment is stationed between Ruza and Mozhaysk. +Napoleon himself was in Moscow as late as the twenty-fifth. In view of +all this information, when the enemy has scattered his forces in large +detachments, and with Napoleon and his Guards in Moscow, is it +possible that the enemy's forces confronting you are so considerable +as not to allow of your taking the offensive? On the contrary, he is +probably pursuing you with detachments, or at most with an army +corps much weaker than the army entrusted to you. It would seem +that, availing yourself of these circumstances, you might +advantageously attack a weaker one and annihilate him, or at least +oblige him to retreat, retaining in our hands an important part of the +provinces now occupied by the enemy, and thereby averting danger +from Tula and other towns in the interior. You will be responsible +if the enemy is able to direct a force of any size against +Petersburg to threaten this capital in which it has not been +possible to retain many troops; for with the army entrusted to you, +and acting with resolution and energy, you have ample means to avert +this fresh calamity. Remember that you have still to answer to our +offended country for the loss of Moscow. You have experienced my +readiness to reward you. That readiness will not weaken in me, but I +and Russia have a right to expect from you all the zeal, firmness, and +success which your intellect, military talent, and the courage of +the troops you command justify us in expecting. + + +But by the time this letter, which proved that the real relation +of the forces had already made itself felt in Petersburg, was +dispatched, Kutuzov had found himself unable any longer to restrain +the army he commanded from attacking and a battle had taken place. + +On the second of October a Cossack, Shapovalov, who was out +scouting, killed one hare and wounded another. Following the wounded +hare he made his way far into the forest and came upon the left +flank of Murat's army, encamped there without any precautions. The +Cossack laughingly told his comrades how he had almost fallen into the +hands of the French. A cornet, hearing the story, informed his +commander. + +The Cossack was sent for and questioned. The Cossack officers wished +to take advantage of this chance to capture some horses, but one of +the superior officers, who was acquainted with the higher authorities, +reported the incident to a general on the staff. The state of +things on the staff had of late been exceedingly strained. Ermolov had +been to see Bennigsen a few days previously and had entreated him to +use his influence with the commander in chief to induce him to take +the offensive. + +"If I did not know you I should think you did not want what you +are asking for. I need only advise anything and his Highness is sure +to do the opposite," replied Bennigsen. + +The Cossack's report, confirmed by horse patrols who were sent +out, was the final proof that events had matured. The tightly coiled +spring was released, the clock began to whirr and the chimes to +play. Despite all his supposed power, his intellect, his experience, +and his knowledge of men, Kutuzov--having taken into consideration the +Cossack's report, a note from Bennigsen who sent personal reports to +the Emperor, the wishes he supposed the Emperor to hold, and the +fact that all the generals expressed the same wish--could no longer +check the inevitable movement, and gave the order to do what he +regarded as useless and harmful--gave his approval, that is, to the +accomplished fact. + + + + + +CHAPTER IV + + +Bennigsen's note and the Cossack's information that the left flank +of the French was unguarded were merely final indications that it +was necessary to order an attack, and it was fixed for the fifth of +October. + +On the morning of the fourth of October Kutuzov signed the +dispositions. Toll read them to Ermolov, asking him to attend to the +further arrangements. + +"All right--all right. I haven't time just now," replied Ermolov, +and left the hut. + +The dispositions drawn up by Toll were very good. As in the +Austerlitz dispositions, it was written--though not in German this +time: + +"The First Column will march here and here," "the Second Column will +march there and there," and so on; and on paper, all these columns +arrived at their places at the appointed time and destroyed the enemy. +Everything had been admirably thought out as is usual in dispositions, +and as is always the case, not a single column reached its place at +the appointed time. + +When the necessary number of copies of the dispositions had been +prepared, an officer was summoned and sent to deliver them to +Ermolov to deal with. A young officer of the Horse Guards, Kutuzov's +orderly, pleased at the importance of the mission entrusted to him, +went to Ermolov's quarters. + +"Gone away," said Ermolov's orderly. + +The officer of the Horse Guards went to a general with whom +Ermolov was often to be found. + +"No, and the general's out too." + +The officer, mounting his horse, rode off to someone else. + +"No, he's gone out." + +"If only they don't make me responsible for this delay! What a +nuisance it is!" thought the officer, and he rode round the whole +camp. One man said he had seen Ermolov ride past with some other +generals, others said he must have returned home. The officer searched +till six o'clock in the evening without even stopping to eat. +Ermolov was nowhere to be found and no one knew where he was. The +officer snatched a little food at a comrade's, and rode again to the +vanguard to find Miloradovich. Miloradovich too was away, but here +he was told that he had gone to a ball at General Kikin's and that +Ermolov was probably there too. + +"But where is it?" + +"Why, there, over at Echkino," said a Cossack officer, pointing to a +country house in the far distance. + +"What, outside our line?" + +"They've put two regiments as outposts, and they're having such a +spree there, it's awful! Two bands and three sets of singers!" + +The officer rode out beyond our lines to Echkino. While still at a +distance he heard as he rode the merry sounds of a soldier's dance +song proceeding from the house. + +"In the meadows... in the meadows!" he heard, accompanied by +whistling and the sound of a torban, drowned every now and then by +shouts. These sounds made his spirits rise, but at the same time he +was afraid that he would be blamed for not having executed sooner +the important order entrusted to him. It was already past eight +o'clock. He dismounted and went up into the porch of a large country +house which had remained intact between the Russian and French forces. +In the refreshment room and the hall, footmen were bustling about with +wine and viands. Groups of singers stood outside the windows. The +officer was admitted and immediately saw all the chief generals of the +army together, and among them Ermolov's big imposing figure. They +all had their coats unbuttoned and were standing in a semicircle +with flushed and animated faces, laughing loudly. In the middle of the +room a short handsome general with a red face was dancing the trepak +with much spirit and agility. + +"Ha, ha, ha! Bravo, Nicholas Ivanych! Ha, ha, ha!" + +The officer felt that by arriving with important orders at such a +moment he was doubly to blame, and he would have preferred to wait; +but one of the generals espied him and, hearing what he had come +about, informed Ermolov. + +Ermolov came forward with a frown on his face and, hearing what +the officer had to say, took the papers from him without a word. + + +"You think he went off just by chance?" said a comrade, who was on +the staff that evening, to the officer of the Horse Guards, +referring to Ermolov. "It was a trick. It was done on purpose to get +Konovnitsyn into trouble. You'll see what a mess there'll be +tomorrow." + + + + + +CHAPTER V + + +Next day the decrepit Kutuzov, having given orders to be called +early, said his prayers, dressed, and, with an unpleasant +consciousness of having to direct a battle he did not approve of, +got into his caleche and drove from Letashovka (a village three and +a half miles from Tarutino) to the place where the attacking columns +were to meet. He sat in the caleche, dozing and waking up by turns, +and listening for any sound of firing on the right as an indication +that the action had begun. But all was still quiet. A damp dull autumn +morning was just dawning. On approaching Tarutino Kutuzov noticed +cavalrymen leading their horses to water across the road along which +he was driving. Kutuzov looked at them searchingly, stopped his +carriage, and inquired what regiment they belonged to. They belonged +to a column that should have been far in front and in ambush long +before then. "It may be a mistake," thought the old commander in +chief. But a little further on he saw infantry regiments with their +arms piled and the soldiers, only partly dressed, eating their rye +porridge and carrying fuel. He sent for an officer. The officer +reported that no order to advance had been received. + +"How! Not rec..." Kutuzov began, but checked himself immediately and +sent for a senior officer. Getting out of his caleche, he waited +with drooping head and breathing heavily, pacing silently up and down. +When Eykhen, the officer of the general staff whom he had summoned, +appeared, Kutuzov went purple in the face, not because that officer +was to blame for the mistake, but because he was an object of +sufficient importance for him to vent his wrath on. Trembling and +panting the old man fell into that state of fury in which he sometimes +used to roll on the ground, and he fell upon Eykhen, threatening him +with his hands, shouting and loading him with gross abuse. Another +man, Captain Brozin, who happened to turn up and who was not at all to +blame, suffered the same fate. + +"What sort of another blackguard are you? I'll have you shot! +Scoundrels!" yelled Kutuzov in a hoarse voice, waving his arms and +reeling. + +He was suffering physically. He, the commander in chief, a Serene +Highness who everybody said possessed powers such as no man had ever +had in Russia, to be placed in this position--made the laughingstock +of the whole army! "I needn't have been in such a hurry to pray +about today, or have kept awake thinking everything over all night," +thought he to himself. "When I was a chit of an officer no one would +have dared to mock me so... and now!" He was in a state of physical +suffering as if from corporal punishment, and could not avoid +expressing it by cries of anger and distress. But his strength soon +began to fail him, and looking about him, conscious of having said +much that was amiss, he again got into his caleche and drove back in +silence. + +His wrath, once expended, did not return, and blinking feebly he +listened to excuses and self-justifications (Ermolov did not come to +see him till the next day) and to the insistence of Bennigsen, +Konovnitsyn, and Toll that the movement that had miscarried should +be executed next day. And once more Kutuzov had to consent. + + + + + +CHAPTER VI + + +Next day the troops assembled in their appointed places in the +evening and advanced during the night. It was an autumn night with +dark purple clouds, but no rain. The ground was damp but not muddy, +and the troops advanced noiselessly, only occasionally a jingling of +the artillery could be faintly heard. The men were forbidden to talk +out loud, to smoke their pipes, or to strike a light, and they tried +to prevent their horses neighing. The secrecy of the undertaking +heightened its charm and they marched gaily. Some columns, +supposing they had reached their destination, halted, piled arms, and +settled down on the cold ground, but the majority marched all night +and arrived at places where they evidently should not have been. + +Only Count Orlov-Denisov with his Cossacks (the least important +detachment of all) got to his appointed place at the right time. +This detachment halted at the outskirts of a forest, on the path +leading from the village of Stromilova to Dmitrovsk. + +Toward dawn, Count Orlov-Denisov, who had dozed off, was awakened by +a deserter from the French army being brought to him. This was a +Polish sergeant of Poniatowski's corps, who explained in Polish that +he had come over because he had been slighted in the service: that +he ought long ago to have been made an officer, that he was braver +than any of them, and so he had left them and wished to pay them +out. He said that Murat was spending the night less than a mile from +where they were, and that if they would let him have a convoy of a +hundred men he would capture him alive. Count Orlov-Denisov +consulted his fellow officers. + +The offer was too tempting to be refused. Everyone volunteered to go +and everybody advised making the attempt. After much disputing and +arguing, Major-General Grekov with two Cossack regiments decided to go +with the Polish sergeant. + +"Now, remember," said Count Orlov-Denisov to the sergeant at +parting, "if you have been lying I'll have you hanged like a dog; +but if it's true you shall have a hundred gold pieces!" + +Without replying, the sergeant, with a resolute air, mounted and +rode away with Grekov whose men had quickly assembled. They +disappeared into the forest, and Count Orlov-Denisov, having seen +Grekov off, returned, shivering from the freshness of the early dawn +and excited by what he had undertaken on his own responsibility, and +began looking at the enemy camp, now just visible in the deceptive +light of dawn and the dying campfires. Our columns ought to have begun +to appear on an open declivity to his right. He looked in that +direction, but though the columns would have been visible quite far +off, they were not to be seen. It seemed to the count that things were +beginning to stir in the French camp, and his keen-sighted adjutant +confirmed this. + +"Oh, it is really too late," said Count Orlov, looking at the camp. + +As often happens when someone we have trusted is no longer before +our eyes, it suddenly seemed quite clear and obvious to him that the +sergeant was an impostor, that he had lied, and that the whole Russian +attack would be ruined by the absence of those two regiments, which he +would lead away heaven only knew where. How could one capture a +commander in chief from among such a mass of troops! + +"I am sure that rascal was lying," said the count. + +"They can still be called back," said one of his suite, who like +Count Orlov felt distrustful of the adventure when he looked at the +enemy's camp. + +"Eh? Really... what do you think? Should we let them go on or not?" + +"Will you have them fetched back?" + +"Fetch them back, fetch them back!" said Count Orlov with sudden +determination, looking at his watch. "It will be too late. It is quite +light." + +And the adjutant galloped through the forest after Grekov. When +Grekov returned, Count Orlov-Denisov, excited both by the abandoned +attempt and by vainly awaiting the infantry columns that still did not +appear, as well as by the proximity of the enemy, resolved to advance. +All his men felt the same excitement. + +"Mount!" he commanded in a whisper. The men took their places and +crossed themselves.... "Forward, with God's aid!" + +"Hurrah-ah-ah!" reverberated in the forest, and the Cossack +companies, trailing their lances and advancing one after another as if +poured out of a sack, dashed gaily across the brook toward the camp. + +One desperate, frightened yell from the first French soldier who saw +the Cossacks, and all who were in the camp, undressed and only just +waking up, ran off in all directions, abandoning cannons, muskets, and +horses. + +Had the Cossacks pursued the French, without heeding what was behind +and around them, they would have captured Murat and everything +there. That was what the officers desired. But it was impossible to +make the Cossacks budge when once they had got booty and prisoners. +None of them listened to orders. Fifteen hundred prisoners and +thirty-eight guns were taken on the spot, besides standards and +(what seemed most important to the Cossacks) horses, saddles, +horsecloths, and the like. All this had to be dealt with, the +prisoners and guns secured, the booty divided--not without some +shouting and even a little themselves--and it was on this that the +Cossacks all busied themselves. + +The French, not being farther pursued, began to recover +themselves: they formed into detachments and began firing. +Orlov-Denisov, still waiting for the other columns to arrive, advanced +no further. + +Meantime, according to the dispositions which said that "the First +Column will march" and so on, the infantry of the belated columns, +commanded by Bennigsen and directed by Toll, had started in due +order and, as always happens, had got somewhere, but not to their +appointed places. As always happens the men, starting cheerfully, +began to halt; murmurs were heard, there was a sense of confusion, and +finally a backward movement. Adjutants and generals galloped about, +shouted, grew angry, quarreled, said they had come quite wrong and +were late, gave vent to a little abuse, and at last gave it all up and +went forward, simply to get somewhere. "We shall get somewhere or +other!" And they did indeed get somewhere, though not to their right +places; a few eventually even got to their right place, but too late +to be of any use and only in time to be fired at. Toll, who in this +battle played the part of Weyrother at Austerlitz, galloped +assiduously from place to place, finding everything upside down +everywhere. Thus he stumbled on Bagovut's corps in a wood when it +was already broad daylight, though the corps should long before have +joined Orlov-Denisov. Excited and vexed by the failure and supposing +that someone must be responsible for it, Toll galloped up to the +commander of the corps and began upbraiding him severely, saying +that he ought to be shot. General Bagovut, a fighting old soldier of +placid temperament, being also upset by all the delay, confusion, +and cross-purposes, fell into a rage to everybody's surprise and quite +contrary to his usual character and said disagreeable things to Toll. + +"I prefer not to take lessons from anyone, but I can die with my men +as well as anybody," he said, and advanced with a single division. + +Coming out onto a field under the enemy's fire, this brave general +went straight ahead, leading his men under fire, without considering +in his agitation whether going into action now, with a single +division, would be of any use or no. Danger, cannon balls, and bullets +were just what he needed in his angry mood. One of the first bullets +killed him, and other bullets killed many of his men. And his division +remained under fire for some time quite uselessly. + + + + + +CHAPTER VII + + +Meanwhile another column was to have attacked the French from the +front, but Kutuzov accompanied that column. He well knew that +nothing but confusion would come of this battle undertaken against his +will, and as far as was in his power held the troops back. He did +not advance. + +He rode silently on his small gray horse, indolently answering +suggestions that they should attack. + +"The word attack is always on your tongue, but you don't see that we +are unable to execute complicated maneuvers," said he to +Miloradovich who asked permission to advance. + +"We couldn't take Murat prisoner this morning or get to the place in +time, and nothing can be done now!" he replied to someone else. + +When Kutuzov was informed that at the French rear--where according +to the reports of the Cossacks there had previously been nobody--there +were now two battalions of Poles, he gave a sidelong glance at Ermolov +who was behind him and to whom he had not spoken since the previous +day. + +"You see! They are asking to attack and making plans of all kinds, +but as soon as one gets to business nothing is ready, and the enemy, +forewarned, takes measures accordingly." + +Ermolov screwed up his eyes and smiled faintly on hearing these +words. He understood that for him the storm had blown over, and that +Kutuzov would content himself with that hint. + +"He's having a little fun at my expense," said Ermolov softly, +nudging with his knee Raevski who was at his side. + +Soon after this, Ermolov moved up to Kutuzov and respectfully +remarked: + +"It is not too late yet, your Highness--the enemy has not gone away- +if you were to order an attack! If not, the Guards will not so much as +see a little smoke." + +Kutuzov did not reply, but when they reported to him that Murat's +troops were in retreat he ordered an advance, though at every +hundred paces he halted for three quarters of an hour. + +The whole battle consisted in what Orlov-Denisov's Cossacks had +done: the rest of the army merely lost some hundreds of men uselessly. + +In consequence of this battle Kutuzov received a diamond decoration, +and Bennigsen some diamonds and a hundred thousand rubles, others also +received pleasant recognitions corresponding to their various +grades, and following the battle fresh changes were made in the staff. + +"That's how everything is done with us, all topsy-turvy!" said the +Russian officers and generals after the Tarutino battle, letting it be +understood that some fool there is doing things all wrong but that +we ourselves should not have done so, just as people speak today. +But people who talk like that either do not know what they are talking +about or deliberately deceive themselves. No battle--Tarutino, +Borodino, or Austerlitz--takes place as those who planned it +anticipated. That is an essential condition. + +A countless number of free forces (for nowhere is man freer than +during a battle, where it is a question of life and death) influence +the course taken by the fight, and that course never can be known in +advance and never coincides with the direction of any one force. + +If many simultaneously and variously directed forces act on a +given body, the direction of its motion cannot coincide with any one +of those forces, but will always be a mean--what in mechanics is +represented by the diagonal of a parallelogram of forces. + +If in the descriptions given by historians, especially French +ones, we find their wars and battles carried out in accordance with +previously formed plans, the only conclusion to be drawn is that those +descriptions are false. + +The battle of Tarutino obviously did not attain the aim Toll had +in view--to lead the troops into action in the order prescribed by the +dispositions; nor that which Count Orlov-Denisov may have had in view- +to take Murat prisoner; nor the result of immediately destroying the +whole corps, which Bennigsen and others may have had in view; nor +the aim of the officer who wished to go into action to distinguish +himself; nor that of the Cossack who wanted more booty than he got, +and so on. But if the aim of the battle was what actually resulted and +what all the Russians of that day desired--to drive the French out +of Russia and destroy their army--it is quite clear that the battle of +Tarutino, just because of its incongruities, was exactly what was +wanted at that stage of the campaign. It would be difficult and even +impossible to imagine any result more opportune than the actual +outcome of this battle. With a minimum of effort and insignificant +losses, despite the greatest confusion, the most important results +of the whole campaign were attained: the transition from retreat to +advance, an exposure of the weakness of the French, and the +administration of that shock which Napoleon's army had only awaited to +begin its flight. + + + + + +CHAPTER VIII + + +Napoleon enters Moscow after the brilliant victory de la Moskowa; +there can be no doubt about the victory for the battlefield remains in +the hands of the French. The Russians retreat and abandon their +ancient capital. Moscow, abounding in provisions, arms, munitions, and +incalculable wealth, is in Napoleon's hands. The Russian army, only +half the strength of the French, does not make a single attempt to +attack for a whole month. Napoleon's position is most brilliant. He +can either fall on the Russian army with double its strength and +destroy it; negotiate an advantageous peace, or in case of a refusal +make a menacing move on Petersburg, or even, in the case of a reverse, +return to Smolensk or Vilna; or remain in Moscow; in short, no special +genius would seem to be required to retain the brilliant position +the French held at that time. For that, only very simple and easy +steps were necessary: not to allow the troops to loot, to prepare +winter clothing--of which there was sufficient in Moscow for the whole +army--and methodically to collect the provisions, of which +(according to the French historians) there were enough in Moscow to +supply the whole army for six months. Yet Napoleon, that greatest of +all geniuses, who the historians declare had control of the army, took +none of these steps. + +He not merely did nothing of the kind, but on the contrary he used +his power to select the most foolish and ruinous of all the courses +open to him. Of all that Napoleon might have done: wintering in +Moscow, advancing on Petersburg or on Nizhni-Novgorod, or retiring +by a more northerly or more southerly route (say by the road Kutuzov +afterwards took), nothing more stupid or disastrous can be imagined +than what he actually did. He remained in Moscow till October, letting +the troops plunder the city; then, hesitating whether to leave a +garrison behind him, he quitted Moscow, approached Kutuzov without +joining battle, turned to the right and reached Malo-Yaroslavets, +again without attempting to break through and take the road Kutuzov +took, but retiring instead to Mozhaysk along the devastated Smolensk +road. Nothing more stupid than that could have been devised, or more +disastrous for the army, as the sequel showed. Had Napoleon's aim been +to destroy his army, the most skillful strategist could hardly have +devised any series of actions that would so completely have +accomplished that purpose, independently of anything the Russian +army might do. + + +Napoleon, the man of genius, did this! But to say that he +destroyed his army because he wished to, or because he was very +stupid, would be as unjust as to say that he had brought his troops to +Moscow because he wished to and because he was very clever and a +genius. + +In both cases his personal activity, having no more force than the +personal activity of any soldier, merely coincided with the laws +that guided the event. + +The historians quite falsely represent Napoleon's faculties as +having weakened in Moscow, and do so only because the results did +not justify his actions. He employed all his ability and strength to +do the best he could for himself and his army, as he had done +previously and as he did subsequently in 1813. His activity at that +time was no less astounding than it was in Egypt, in Italy, in +Austria, and in Prussia. We do not know for certain in how far his +genius was genuine in Egypt--where forty centuries looked down upon +his grandeur--for his great exploits there are all told us by +Frenchmen. We cannot accurately estimate his genius in Austria or +Prussia, for we have to draw our information from French or German +sources, and the incomprehensible surrender of whole corps without +fighting and of fortresses without a siege must incline Germans to +recognize his genius as the only explanation of the war carried on +in Germany. But we, thank God, have no need to recognize his genius in +order to hide our shame. We have paid for the right to look at the +matter plainly and simply, and we will not abandon that right. + +His activity in Moscow was as amazing and as full of genius as +elsewhere. Order after order order and plan after plan were issued +by him from the time he entered Moscow till the time he left it. The +absence of citizens and of a deputation, and even the burning of +Moscow, did not disconcert him. He did not lose sight either of the +welfare of his army or of the doings of the enemy, or of the welfare +of the people of Russia, or of the direction of affairs in Paris, or +of diplomatic considerations concerning the terms of the anticipated +peace. + + + + + +CHAPTER IX + + +With regard to military matters, Napoleon immediately on his entry +into Moscow gave General Sabastiani strict orders to observe the +movements of the Russian army, sent army corps out along the different +roads, and charged Murat to find Kutuzov. Then he gave careful +directions about the fortification of the Kremlin, and drew up a +brilliant plan for a future campaign over the whole map of Russia. + +With regard to diplomatic questions, Napoleon summoned Captain +Yakovlev, who had been robbed and was in rags and did not know how +to get out of Moscow, minutely explained to him his whole policy and +his magnanimity, and having written a letter to the Emperor +Alexander in which he considered it his duty to inform his Friend +and Brother that Rostopchin had managed affairs badly in Moscow, he +dispatched Yakovlev to Petersburg. + +Having similarly explained his views and his magnanimity to +Tutolmin, he dispatched that old man also to Petersburg to negotiate. + +With regard to legal matters, immediately after the fires he gave +orders to find and execute the incendiaries. And the scoundrel +Rostopchin was punished by an order to burn down his houses. + +With regard to administrative matters, Moscow was granted a +constitution. A municipality was established and the following +announcement issued: + + +INHABITANTS OF MOSCOW! + +Your misfortunes are cruel, but His Majesty the Emperor and King +desires to arrest their course. Terrible examples have taught you +how he punishes disobedience and crime. Strict measures have been +taken to put an end to disorder and to re-establish public security. A +paternal administration, chosen from among yourselves, will form +your municipality or city government. It will take care of you, of +your needs, and of your welfare. Its members will be distinguished +by a red ribbon worn across the shoulder, and the mayor of the city +will wear a white belt as well. But when not on duty they will only +wear a red ribbon round the left arm. + +The city police is established on its former footing, and better +order already prevails in consequence of its activity. The +government has appointed two commissaries general, or chiefs of +police, and twenty commissaries or captains of wards have been +appointed to the different wards of the city. You will recognize +them by the white ribbon they will wear on the left arm. Several +churches of different denominations are open, and divine service is +performed in them unhindered. Your fellow citizens are returning every +day to their homes. and orders have been given that they should find +in them the help and protection due to their misfortunes. These are +the measures the government has adopted to re-establish order and +relieve your condition. But to achieve this aim it is necessary that +you should add your efforts and should, if possible, forget the +misfortunes you have suffered, should entertain the hope of a less +cruel fate, should be certain that inevitable and ignominious death +awaits those who make any attempt on your persons or on what remains +of your property, and finally that you should not doubt that these +will be safeguarded, since such is the will of the greatest and most +just of monarchs. Soldiers and citizens, of whatever nation you may +be, re-establish public confidence, the source of the welfare of a +state, live like brothers, render mutual aid and protection one to +another, unite to defeat the intentions of the evil-minded, obey the +military and civil authorities, and your tears will soon cease to +flow! + + +With regard to supplies for the army, Napoleon decreed that all +the troops in turn should enter Moscow a la maraude* to obtain +provisions for themselves, so that the army might have its future +provided for. + + +*As looters. + + +With regard to religion, Napoleon ordered the priests to be +brought back and services to be again performed in the churches. + +With regard to commerce and to provisioning the army, the +following was placarded everywhere: + + +PROCLAMATION! + +You, peaceful inhabitants of Moscow, artisans and workmen whom +misfortune has driven from the city, and you scattered tillers of +the soil, still kept out in the fields by groundless fear, listen! +Tranquillity is returning to this capital and order is being +restored in it. Your fellow countrymen are emerging boldly from +their hiding places on finding that they are respected. Any violence +to them or to their property is promptly punished. His Majesty the +Emperor and King protects them, and considers no one among you his +enemy except those who disobey his orders. He desires to end your +misfortunes and restore you to your homes and families. Respond, +therefore, to his benevolent intentions and come to us without fear. +Inhabitants, return with confidence to your abodes! You will soon find +means of satisfying your needs. Craftsmen and industrious artisans, +return to your work, your houses, your shops, where the protection +of guards awaits you! You shall receive proper pay for your work. +And lastly you too, peasants, come from the forests where you are +hiding in terror, return to your huts without fear, in full +assurance that you will find protection! Markets are established in +the city where peasants can bring their surplus supplies and the +products of the soil. The government has taken the following steps +to ensure freedom of sale for them: (1) From today, peasants, +husbandmen, and those living in the neighborhood of Moscow may without +any danger bring their supplies of all kinds to two appointed markets, +of which one is on the Mokhovaya Street and the other at the Provision +Market. (2) Such supplies will be bought from them at such prices as +seller and buyer may agree on, and if a seller is unable to obtain a +fair price he will be free to take his goods back to his village and +no one may hinder him under any pretense. (3) Sunday and Wednesday +of each week are appointed as the chief market days and to that end +a sufficient number of troops will be stationed along the highroads on +Tuesdays and Saturdays at such distances from the town as to protect +the carts. (4) Similar measures will be taken that peasants with their +carts and horses may meet with no hindrance on their return journey. +(5) Steps will immediately be taken to re-establish ordinary trading. + +Inhabitants of the city and villages, and you, workingmen and +artisans, to whatever nation you belong, you are called on to carry +out the paternal intentions of His Majesty the Emperor and King and to +co-operate with him for the public welfare! Lay your respect and +confidence at his feet and do not delay to unite with us! + + +With the object of raising the spirits of the troops and of the +people, reviews were constantly held and rewards distributed. The +Emperor rode through the streets to comfort the inhabitants, and, +despite his preoccupation with state affairs, himself visited the +theaters that were established by his order. + +In regard to philanthropy, the greatest virtue of crowned heads, +Napoleon also did all in his power. He caused the words Maison de ma +Mere to be inscribed on the charitable institutions, thereby combining +tender filial affection with the majestic benevolence of a monarch. He +visited the Foundling Hospital and, allowing the orphans saved by +him to kiss his white hands, graciously conversed with Tutolmin. Then, +as Thiers eloquently recounts, he ordered his soldiers to be paid in +forged Russian money which he had prepared: "Raising the use of +these means by an act worthy of himself and of the French army, he let +relief be distributed to those who had been burned out. But as food +was too precious to be given to foreigners, who were for the most part +enemies, Napoleon preferred to supply them with money with which to +purchase food from outside, and had paper rubles distributed to them." + +With reference to army discipline, orders were continually being +issued to inflict severe punishment for the nonperformance of military +duties and to suppress robbery. + + + + + +CHAPTER X + + +But strange to say, all these measures, efforts, and plans--which +were not at all worse than others issued in similar circumstances--did +not affect the essence of the matter but, like the hands of a clock +detached from the mechanism, swung about in an arbitrary and aimless +way without engaging the cogwheels. + +With reference to the military side--the plan of campaign--that work +of genius of which Thiers remarks that, "His genius never devised +anything more profound, more skillful, or more admirable," and +enters into a polemic with M. Fain to prove that this work of genius +must be referred not to the fourth but to the fifteenth of October- +that plan never was or could be executed, for it was quite out of +touch with the facts of the case. The fortifying of the Kremlin, for +which la Mosquee (as Napoleon termed the church of Basil the +Beatified) was to have been razed to the ground, proved quite useless. +The mining of the Kremlin only helped toward fulfilling Napoleon's +wish that it should be blown up when he left Moscow--as a child +wants the floor on which he has hurt himself to be beaten. The pursuit +of the Russian army, about which Napoleon was so concerned, produced +an unheard-of result. The French generals lost touch with the +Russian army of sixty thousand men, and according to Thiers it was +only eventually found, like a lost pin, by the skill--and apparently +the genius--of Murat. + +With reference to diplomacy, all Napoleon's arguments as to his +magnanimity and justice, both to Tutolmin and to Yakovlev (whose chief +concern was to obtain a greatcoat and a conveyance), proved useless; +Alexander did not receive these envoys and did not reply to their +embassage. + +With regard to legal matters, after the execution of the supposed +incendiaries the rest of Moscow burned down. + +With regard to administrative matters, the establishment of a +municipality did not stop the robberies and was only of use to certain +people who formed part of that municipality and under pretext of +preserving order looted Moscow or saved their own property from +being looted. + +With regard to religion, as to which in Egypt matters had so +easily been settled by Napoleon's visit to a mosque, no results were +achieved. Two or three priests who were found in Moscow did try to +carry out Napoleon's wish, but one of them was slapped in the face +by a French soldier while conducting service, and a French official +reported of another that: "The priest whom I found and invited to +say Mass cleaned and locked up the church. That night the doors were +again broken open, the padlocks smashed, the books mutilated, and +other disorders perpetrated." + +With reference to commerce, the proclamation to industrious +workmen and to peasants evoked no response. There were no +industrious workmen, and the peasants caught the commissaries who +ventured too far out of town with the proclamation and killed them. + +As to the theaters for the entertainment of the people and the +troops, these did not meet with success either. The theaters set up in +the Kremlin and in Posnyakov's house were closed again at once because +the actors and actresses were robbed. + +Even philanthropy did not have the desired effect. The genuine as +well as the false paper money which flooded Moscow lost its value. The +French, collecting booty, cared only for gold. Not only was the +paper money valueless which Napoleon so graciously distributed to +the unfortunate, but even silver lost its value in relation to gold. + +But the most amazing example of the ineffectiveness of the orders +given by the authorities at that time was Napoleon's attempt to stop +the looting and re-establish discipline. + +This is what the army authorities were reporting: + +"Looting continues in the city despite the decrees against it. Order +is not yet restored and not a single merchant is carrying on trade +in a lawful manner. The sutlers alone venture to trade, and they +sell stolen goods." + +"The neighborhood of my ward continues to be pillaged by soldiers of +the 3rd Corps who, not satisfied with taking from the unfortunate +inhabitants hiding in the cellars the little they have left, even have +the ferocity to wound them with their sabers, as I have repeatedly +witnessed." + +"Nothing new, except that the soldiers are robbing and pillaging- +October 9." + +"Robbery and pillaging continue. There is a band of thieves in our +district who ought to be arrested by a strong force--October 11." + +"The Emperor is extremely displeased that despite the strict +orders to stop pillage, parties of marauding Guards are continually +seen returning to the Kremlin. Among the Old Guard disorder and +pillage were renewed more violently than ever yesterday evening, +last night, and today. The Emperor sees with regret that the picked +soldiers appointed to guard his person, who should set an example of +discipline, carry disobedience to such a point that they break into +the cellars and stores containing army supplies. Others have disgraced +themselves to the extent of disobeying sentinels and officers, and +have abused and beaten them." + +"The Grand Marshal of the palace," wrote the governor, "complains +bitterly that in spite of repeated orders, the soldiers continue to +commit nuisances in all the courtyards and even under the very windows +of the Emperor." + +That army, like a herd of cattle run wild and trampling underfoot +the provender which might have saved it from starvation, disintegrated +and perished with each additional day it remained in Moscow. But it +did not go away. + +It began to run away only when suddenly seized by a panic caused +by the capture of transport trains on the Smolensk road, and by the +battle of Tarutino. The news of that battle of Tarutino, +unexpectedly received by Napoleon at a review, evoked in him a +desire to punish the Russians (Thiers says), and he issued the order +for departure which the whole army was demanding. + +Fleeing from Moscow the soldiers took with them everything they +had stolen. Napoleon, too, carried away his own personal tresor, but +on seeing the baggage trains that impeded the army, he was (Thiers +says) horror-struck. And yet with his experience of war he did not +order all the superfluous vehicles to be burned, as he had done with +those of a certain marshal when approaching Moscow. He gazed at the +caleches and carriages in which soldiers were riding and remarked that +it was a very good thing, as those vehicles could be used to carry +provisions, the sick, and the wounded. + +The plight of the whole army resembled that of a wounded animal +which feels it is perishing and does not know what it is doing. To +study the skillful tactics and aims of Napoleon and his army from +the time it entered Moscow till it was destroyed is like studying +the dying leaps and shudders of a mortally wounded animal. Very +often a wounded animal, hearing a rustle, rushes straight at the +hunter's gun, runs forward and back again, and hastens its own end. +Napoleon, under pressure from his whole army, did the same thing. +The rustle of the battle of Tarutino frightened the beast, and it +rushed forward onto the hunter's gun, reached him, turned back, and +finally--like any wild beast--ran back along the most +disadvantageous and dangerous path, where the old scent was familiar. + +During the whole of that period Napoleon, who seems to us to have +been the leader of all these movements--as the figurehead of a ship +may seem to a savage to guide the vessel--acted like a child who, +holding a couple of strings inside a carriage, thinks he is driving +it. + + + + + +CHAPTER XI + + +Early in the morning of the sixth of October Pierre went out of +the shed, and on returning stopped by the door to play with a little +blue-gray dog, with a long body and short bandy legs, that jumped +about him. This little dog lived in their shed, sleeping beside +Karataev at night; it sometimes made excursions into the town but +always returned again. Probably it had never had an owner, and it +still belonged to nobody and had no name. The French called it Azor; +the soldier who told stories called it Femgalka; Karataev and others +called it Gray, or sometimes Flabby. Its lack of a master, a name, +or even of a breed or any definite color did not seem to trouble the +blue-gray dog in the least. Its furry tail stood up firm and round +as a plume, its bandy legs served it so well that it would often +gracefully lift a hind leg and run very easily and quickly on three +legs, as if disdaining to use all four. Everything pleased it. Now +it would roll on its back, yelping with delight, now bask in the sun +with a thoughtful air of importance, and now frolic about playing with +a chip of wood or a straw. + +Pierre's attire by now consisted of a dirty torn shirt (the only +remnant of his former clothing), a pair of soldier's trousers which by +Karataev's advice he tied with string round the ankles for warmth, and +a peasant coat and cap. Physically he had changed much during this +time. He no longer seemed stout, though he still had the appearance of +solidity and strength hereditary in his family. A beard and mustache +covered the lower part of his face, and a tangle of hair, infested +with lice, curled round his head like a cap. The look of his eyes +was resolute, calm, and animatedly alert, as never before. The +former slackness which had shown itself even in his eyes was now +replaced by an energetic readiness for action and resistance. His feet +were bare. + +Pierre first looked down the field across which vehicles and +horsemen were passing that morning, then into the distance across +the river, then at the dog who was pretending to be in earnest about +biting him, and then at his bare feet which he placed with pleasure in +various positions, moving his dirty thick big toes. Every time he +looked at his bare feet a smile of animated self-satisfaction +flitted across his face. The sight of them reminded him of all he +had experienced and learned during these weeks and this recollection +was pleasant to him. + +For some days the weather had been calm and clear with slight frosts +in the mornings--what is called an "old wives' summer." + +In the sunshine the air was warm, and that warmth was particularly +pleasant with the invigorating freshness of the morning frost still in +the air. + +On everything--far and near--lay the magic crystal glitter seen only +at that time autumn. The Sparrow Hills were visible in the distance, +with the village, the church, and the large white house. The bare +trees, the sand, the bricks and roofs of the houses, the green +church spire, and the corners of the white house in the distance, +all stood out in the transparent air in most delicate outline and with +unnatural clearness. Near by could be seen the familiar ruins of a +half-burned mansion occupied by the French, with lilac bushes still +showing dark green beside the fence. And even that ruined and befouled +house--which in dull weather was repulsively ugly--seemed quietly +beautiful now, in the clear, motionless brilliance. + +A French corporal, with coat unbuttoned in a homely way, a +skullcap on his head, and a short pipe in his mouth, came from +behind a corner of the shed and approached Pierre with a friendly +wink. + +"What sunshine, Monsieur Kiril!" (Their name for Pierre.) "Eh? +Just like spring!" + +And the corporal leaned against the door and offered Pierre his +pipe, though whenever he offered it Pierre always declined it. + +"To be on the march in such weather..." he began. + +Pierre inquired what was being said about leaving, and the +corporal told him that nearly all the troops were starting and there +ought to be an order about the prisoners that day. Sokolov, one of the +soldiers in the shed with Pierre, was dying, and Pierre told the +corporal that something should be done about him. The corporal replied +that Pierre need not worry about that as they had an ambulance and a +permanent hospital and arrangements would be made for the sick, and +that in general everything that could happen had been foreseen by +the authorities. + +"Besides, Monsieur Kiril, you have only to say a word to the +captain, you know. He is a man who never forgets anything. Speak to +the captain when he makes his round, he will do anything for you." + +(The captain of whom the corporal spoke often had long chats with +Pierre and showed him all sorts of favors.) + +"'You see, St. Thomas,' he said to me the other day. 'Monsieur Kiril +is a man of education, who speaks French. He is a Russian seigneur who +has had misfortunes, but he is a man. He knows what's what.... If he +wants anything and asks me, he won't get a refusal. When one has +studied, you see, one likes education and well-bred people.' It is for +your sake I mention it, Monsieur Kiril. The other day if it had not +been for you that affair would have ended ill." + +And after chatting a while longer, the corporal went away. (The +affair he had alluded to had happened a few days before--a fight +between the prisoners and the French soldiers, in which Pierre had +succeeded in pacifying his comrades.) Some of the prisoners who had +heard Pierre talking to the corporal immediately asked what the +Frenchman had said. While Pierre was repeating what he had been told +about the army leaving Moscow, a thin, sallow, tattered French soldier +came up to the door of the shed. Rapidly and timidly raising his +fingers to his forehead by way of greeting, he asked Pierre whether +the soldier Platoche to whom he had given a shirt to sew was in that +shed. + +A week before the French had had boot leather and linen issued to +them, which they had given out to the prisoners to make up into +boots and shirts for them. + +"Ready, ready, dear fellow!" said Karataev, coming out with a neatly +folded shirt. + +Karataev, on account of the warm weather and for convenience at +work, was wearing only trousers and a tattered shirt as black as soot. +His hair was bound round, workman fashion, with a wisp of lime-tree +bast, and his round face seemed rounder and pleasanter than ever. + +"A promise is own brother to performance! I said Friday and here +it is, ready," said Platon, smiling and unfolding the shirt he had +sewn. + +The Frenchman glanced around uneasily and then, as if overcoming his +hesitation, rapidly threw off his uniform and put on the shirt. He had +a long, greasy, flowered silk waistcoat next to his sallow, thin +bare body, but no shirt. He was evidently afraid the prisoners looking +on would laugh at him, and thrust his head into the shirt hurriedly. +None of the prisoners said a word. + +"See, it fits well!" Platon kept repeating, pulling the shirt +straight. + +The Frenchman, having pushed his head and hands through, without +raising his eyes, looked down at the shirt and examined the seams. + +"You see, dear man, this is not a sewing shop, and I had no proper +tools; and, as they say, one needs a tool even to kill a louse," +said Platon with one of his round smiles, obviously pleased with his +work. + +"It's good, quite good, thank you," said the Frenchman, in French, +"but there must be some linen left over. + +"It will fit better still when it sets to your body," said Karataev, +still admiring his handiwork. "You'll be nice and comfortable...." + +"Thanks, thanks, old fellow.... But the bits left over?" said the +Frenchman again and smiled. He took out an assignation ruble note +and gave it to Karataev. "But give me the pieces that are over." + +Pierre saw that Platon did not want to understand what the Frenchman +was saying, and he looked on without interfering. Karataev thanked the +Frenchman for the money and went on admiring his own work. The +Frenchman insisted on having the pieces returned that were left over +and asked Pierre to translate what he said. + +"What does he want the bits for?" said Karataev. "They'd make fine +leg bands for us. Well, never mind." + +And Karataev, with a suddenly changed and saddened expression, +took a small bundle of scraps from inside his shirt and gave it to the +Frenchman without looking at him. "Oh dear!" muttered Karataev and +went away. The Frenchman looked at the linen, considered for a moment, +then looked inquiringly at Pierre and, as if Pierre's look had told +him something, suddenly blushed and shouted in a squeaky voice: + +"Platoche! Eh, Platoche! Keep them yourself!" And handing back the +odd bits he turned and went out. + +"There, look at that," said Karataev, swaying his head. "People said +they were not Christians, but they too have souls. It's what the old +folk used to say: 'A sweating hand's an open hand, a dry hand's +close.' He's naked, but yet he's given it back." + +Karataev smiled thoughtfully and was silent awhile looking at the +pieces. + +"But they'll make grand leg bands, dear friend," he said, and went +back into the shed. + + + + + +CHAPTER XII + + +Four weeks had passed since Pierre had been taken prisoner and +though the French had offered to move him from the men's to the +officers' shed, he had stayed in the shed where he was first put. + +In burned and devastated Moscow Pierre experienced almost the +extreme limits of privation a man can endure; but thanks to his +physical strength and health, of which he had till then been +unconscious, and thanks especially to the fact that the privations +came so gradually that it was impossible to say when they began, he +endured his position not only lightly but joyfully. And just at this +time he obtained the tranquillity and ease of mind he had formerly +striven in vain to reach. He had long sought in different ways that +tranquillity of mind, that inner harmony which had so impressed him in +the soldiers at the battle of Borodino. He had sought it in +philanthropy, in Freemasonry, in the dissipations of town life, in +wine, in heroic feats of self-sacrifice, and in romantic love for +Natasha; he had sought it by reasoning--and all these quests and +experiments had failed him. And now without thinking about it he had +found that peace and inner harmony only through the horror of death, +through privation, and through what he recognized in Karataev. + +Those dreadful moments he had lived through at the executions had as +it were forever washed away from his imagination and memory the +agitating thoughts and feelings that had formerly seemed so important. +It did not now occur to him to think of Russia, or the war, or +politics, or Napoleon. It was plain to him that all these things +were no business of his, and that he was not called on to judge +concerning them and therefore could not do so. "Russia and summer +weather are not bound together," he thought, repeating words of +Karataev's which he found strangely consoling. His intention of +killing Napoleon and his calculations of the cabalistic number of +the beast of the Apocalypse now seemed to him meaningless and even +ridiculous. His anger with his wife and anxiety that his name should +not be smirched now seemed not merely trivial but even amusing. What +concern was it of his that somewhere or other that woman was leading +the life she preferred? What did it matter to anybody, and +especially to him, whether or not they found out that their prisoner's +name was Count Bezukhov? + +He now often remembered his conversation with Prince Andrew and +quite agreed with him, though he understood Prince Andrew's thoughts +somewhat differently. Prince Andrew had thought and said that +happiness could only be negative, but had said it with a shade of +bitterness and irony as though he was really saying that all desire +for positive happiness is implanted in us merely to torment us and +never be satisfied. But Pierre believed it without any mental +reservation. The absence of suffering, the satisfaction of one's needs +and consequent freedom in the choice of one's occupation, that is, +of one's way of life, now seemed to Pierre to be indubitably man's +highest happiness. Here and now for the first time he fully +appreciated the enjoyment of eating when he wanted to eat, drinking +when he wanted to drink, sleeping when he wanted to sleep, of warmth +when he was cold, of talking to a fellow man when he wished to talk +and to hear a human voice. The satisfaction of one's needs--good food, +cleanliness, and freedom--now that he was deprived of all this, seemed +to Pierre to constitute perfect happiness; and the choice of +occupation, that is, of his way of life--now that that was so +restricted--seemed to him such an easy matter that he forgot that a +superfluity of the comforts of life destroys all joy in satisfying +one's needs, while great freedom in the choice of occupation--such +freedom as his wealth, his education, and his social position had +given him in his own life--is just what makes the choice of occupation +insolubly difficult and destroys the desire and possibility of +having an occupation. + +All Pierre's daydreams now turned on the time when he would be free. +Yet subsequently, and for the rest of his life, he thought and spoke +with enthusiasm of that month of captivity, of those irrecoverable, +strong, joyful sensations, and chiefly of the complete peace of mind +and inner freedom which he experienced only during those weeks. + +When on the first day he got up early, went out of the shed at dawn, +and saw the cupolas and crosses of the New Convent of the Virgin still +dark at first, the hoarfrost on the dusty grass, the Sparrow Hills, +and the wooded banks above the winding river vanishing in the purple +distance, when he felt the contact of the fresh air and heard the +noise of the crows flying from Moscow across the field, and when +afterwards light gleamed from the east and the sun's rim appeared +solemnly from behind a cloud, and the cupolas and crosses, the +hoarfrost, the distance and the river, all began to sparkle in the +glad light--Pierre felt a new joy and strength in life such as he +had never before known. And this not only stayed with him during the +whole of his imprisonment, but even grew in strength as the +hardships of his position increased. + +That feeling of alertness and of readiness for anything was still +further strengthened in him by the high opinion his fellow prisoners +formed of him soon after his arrival at the shed. With his knowledge +of languages, the respect shown him by the French, his simplicity, his +readiness to give anything asked of him (he received the allowance +of three rubles a week made to officers); with his strength, which +he showed to the soldiers by pressing nails into the walls of the hut; +his gentleness to his companions, and his capacity for sitting still +and thinking without doing anything (which seemed to them +incomprehensible), he appeared to them a rather mysterious and +superior being. The very qualities that had been a hindrance, if not +actually harmful, to him in the world he had lived in--his strength, +his disdain for the comforts of life, his absent-mindedness and +simplicity--here among these people gave him almost the status of a +hero. And Pierre felt that their opinion placed responsibilities +upon him. + + + + +CHAPTER XIII + + +The French evacuation began on the night between the sixth and +seventh of October: kitchens and sheds were dismantled, carts +loaded, and troops and baggage trains started. + +At seven in the morning a French convoy in marching trim, wearing +shakos and carrying muskets, knapsacks, and enormous sacks, stood in +front of the sheds, and animated French talk mingled with curses +sounded all along the lines. + +In the shed everyone was ready, dressed, belted, shod, and only +awaited the order to start. The sick soldier, Sokolov, pale and thin +with dark shadows round his eyes, alone sat in his place barefoot +and not dressed. His eyes, prominent from the emaciation of his +face, gazed inquiringly at his comrades who were paying no attention +to him, and he moaned regularly and quietly. It was evidently not so +much his sufferings that caused him to moan (he had dysentery) as +his fear and grief at being left alone. + +Pierre, girt with a rope round his waist and wearing shoes +Karataev had made for him from some leather a French soldier had +torn off a tea chest and brought to have his boots mended with, went +up to the sick man and squatted down beside him. + +"You know, Sokolov, they are not all going away! They have a +hospital here. You may be better off than we others," said Pierre. + +"O Lord! Oh, it will be the death of me! O Lord!" moaned the man +in a louder voice. + +"I'll go and ask them again directly," said Pierre, rising and going +to the door of the shed. + +Just as Pierre reached the door, the corporal who had offered him +a pipe the day before came up to it with two soldiers. The corporal +and soldiers were in marching kit with knapsacks and shakos that had +metal straps, and these changed their familiar faces. + +The corporal came, according to orders, to shut the door. The +prisoners had to be counted before being let out. + +"Corporal, what will they do with the sick man?..." Pierre began. + +But even as he spoke he began to doubt whether this was the corporal +he knew or a stranger, so unlike himself did the corporal seem at that +moment. Moreover, just as Pierre was speaking a sharp rattle of +drums was suddenly heard from both sides. The corporal frowned at +Pierre's words and, uttering some meaningless oaths, slammed the door. +The shed became semidark, and the sharp rattle of the drums on two +sides drowned the sick man's groans. + +"There it is!... It again!..." said Pierre to himself, and an +involuntary shudder ran down his spine. In the corporal's changed +face, in the sound of his voice, in the stirring and deafening noise +of the drums, he recognized that mysterious, callous force which +compelled people against their will to kill their fellow men--that +force the effect of which he had witnessed during the executions. To +fear or to try to escape that force, to address entreaties or +exhortations to those who served as its tools, was useless. Pierre +knew this now. One had to wait and endure. He did not again go to +the sick man, nor turn to look at him, but stood frowning by the +door of the hut. + +When that door was opened and the prisoners, crowding against one +another like a flock of sheep, squeezed into the exit, Pierre pushed +his way forward and approached that very captain who as the corporal +had assured him was ready to do anything for him. The captain was also +in marching kit, and on his cold face appeared that same it which +Pierre had recognized in the corporal's words and in the roll of the +drums. + +"Pass on, pass on!" the captain reiterated, frowning sternly, and +looking at the prisoners who thronged past him. + +Pierre went up to him, though he knew his attempt would be vain. + +"What now?" the officer asked with a cold look as if not recognizing +Pierre. + +Pierre told him about the sick man. + +"He'll manage to walk, devil take him!" said the captain. "Pass +on, pass on!" he continued without looking at Pierre. + +"But he is dying," Pierre again began. + +"Be so good..." shouted the captain, frowning angrily. + +"Dram-da-da-dam, dam-dam..." rattled the drums, and Pierre +understood that this mysterious force completely controlled these +men and that it was now useless to say any more. + +The officer prisoners were separated from the soldiers and told to +march in front. There were about thirty officers, with Pierre among +them, and about three hundred men. + +The officers, who had come from the other sheds, were all +strangers to Pierre and much better dressed than he. They looked at +him and at his shoes mistrustfully, as at an alien. Not far from him +walked a fat major with a sallow, bloated, angry face, who was wearing +a Kazan dressing grown tied round with a towel, and who evidently +enjoyed the respect of his fellow prisoners. He kept one hand, in +which he clasped his tobacco pouch, inside the bosom of his dressing +gown and held the stem of his pipe firmly with the other. Panting +and puffing, the major grumbled and growled at everybody because he +thought he was being pushed and that they were all hurrying when +they had nowhere to hurry to and were all surprised at something +when there was nothing to be surprised at. Another, a thin little +officer, was speaking to everyone, conjecturing where they were now +being taken and how far they would get that day. An official in felt +boots and wearing a commissariat uniform ran round from side to side +and gazed at the ruins of Moscow, loudly announcing his observations +as to what had been burned down and what this or that part of the city +was that they could see. A third officer, who by his accent was a +Pole, disputed with the commissariat officer, arguing that he was +mistaken in his identification of the different wards of Moscow. + +"What are you disputing about?" said the major angrily. "What does +it matter whether it is St. Nicholas or St. Blasius? You see it's +burned down, and there's an end of it.... What are you pushing for? +Isn't the road wide enough?" said he, turning to a man behind him +who was not pushing him at all. + +"Oh, oh, oh! What have they done?" the prisoners on one side and +another were heard saying as they gazed on the charred ruins. "All +beyond the river, and Zubova, and in the Kremlin.... Just look! +There's not half of it left. Yes, I told you--the whole quarter beyond +the river, and so it is." + +"Well, you know it's burned, so what's the use of talking?" said the +major. + +As they passed near a church in the Khamovniki (one of the few +unburned quarters of Moscow) the whole mass of prisoners suddenly +started to one side and exclamations of horror and disgust were heard. + +"Ah, the villains! What heathens! Yes; dead, dead, so he is... And +smeared with something!" + +Pierre too drew near the church where the thing was that evoked +these exclamations, and dimly made out something leaning against the +palings surrounding the church. From the words of his comrades who saw +better than he did, he found that this was the body of a man, set +upright against the palings with its face smeared with soot. + +"Go on! What the devil... Go on! Thirty thousand devils!..." the +convoy guards began cursing and the French soldiers, with fresh +virulence, drove away with their swords the crowd of prisoners who +were gazing at the dead man. + + + + + +CHAPTER XIV + + +Through the cross streets of the Khamovniki quarter the prisoners +marched, followed only by their escort and the vehicles and wagons +belonging to that escort, but when they reached the supply stores they +came among a huge and closely packed train of artillery mingled with +private vehicles. + +At the bridge they all halted, waiting for those in front to get +across. From the bridge they had a view of endless lines of moving +baggage trains before and behind them. To the right, where the +Kaluga road turns near Neskuchny, endless rows of troops and carts +stretched away into the distance. These were troops of Beauharnais' +corps which had started before any of the others. Behind, along the +riverside and across the Stone Bridge, were Ney's troops and +transport. + +Davout's troops, in whose charge were the prisoners, were crossing +the Crimean bridge and some were already debouching into the Kaluga +road. But the baggage trains stretched out so that the last of +Beauharnais' train had not yet got out of Moscow and reached the +Kaluga road when the vanguard of Ney's army was already emerging +from the Great Ordynka Street. + +When they had crossed the Crimean bridge the prisoners moved a few +steps forward, halted, and again moved on, and from all sides vehicles +and men crowded closer and closer together. They advanced the few +hundred paces that separated the bridge from the Kaluga road, taking +more than an hour to do so, and came out upon the square where the +streets of the Transmoskva ward and the Kaluga road converge, and +the prisoners jammed close together had to stand for some hours at +that crossway. From all sides, like the roar of the sea, were heard +the rattle of wheels, the tramp of feet, and incessant shouts of anger +and abuse. Pierre stood pressed against the wall of a charred house, +listening to that noise which mingled in his imagination with the roll +of the drums. + +To get a better view, several officer prisoners climbed onto the +wall of the half-burned house against which Pierre was leaning. + +"What crowds! Just look at the crowds!... They've loaded goods +even on the cannon! Look there, those are furs!" they exclaimed. "Just +see what the blackguards have looted.... There! See what that one +has behind in the cart.... Why, those are settings taken from some +icons, by heaven!... Oh, the rascals!... See how that fellow has +loaded himself up, he can hardly walk! Good lord, they've even grabbed +those chaises!... See that fellow there sitting on the trunks.... +Heavens! They're fighting." + +"That's right, hit him on the snout--on his snout! Like this, we +shan't get away before evening. Look, look there.... Why, that must be +Napoleon's own. See what horses! And the monograms with a crown! +It's like a portable house.... That fellow's dropped his sack and +doesn't see it. Fighting again... A woman with a baby, and not +bad-looking either! Yes, I dare say, that's the way they'll let you +pass... Just look, there's no end to it. Russian wenches, by heaven, +so they are! In carriages--see how comfortably they've settled +themselves!" + +Again, as at the church in Khamovniki, a wave of general curiosity +bore all the prisoners forward onto the road, and Pierre, thanks to +his stature, saw over the heads of the others what so attracted +their curiosity. In three carriages involved among the munition carts, +closely squeezed together, sat women with rouged faces, dressed in +glaring colors, who were shouting something in shrill voices. + +From the moment Pierre had recognized the appearance of the +mysterious force nothing had seemed to him strange or dreadful: +neither the corpse smeared with soot for fun nor these women +hurrying away nor the burned ruins of Moscow. All that he now +witnessed scarcely made an impression on him--as if his soul, making +ready for a hard struggle, refused to receive impressions that might +weaken it. + +The women's vehicles drove by. Behind them came more carts, +soldiers, wagons, soldiers, gun carriages, carriages, soldiers, +ammunition carts, more soldiers, and now and then women. + +Pierre did not see the people as individuals but saw their movement. + +All these people and horses seemed driven forward by some +invisible power. During the hour Pierre watched them they all came +flowing from the different streets with one and the same desire to get +on quickly; they all jostled one another, began to grow angry and to +fight, white teeth gleamed, brows frowned, ever the same words of +abuse flew from side to side, and all the faces bore the same +swaggeringly resolute and coldly cruel expression that had struck +Pierre that morning on the corporal's face when the drums were +beating. + +It was not till nearly evening that the officer commanding the +escort collected his men and with shouts and quarrels forced his way +in among the baggage trains, and the prisoners, hemmed in on all +sides, emerged onto the Kaluga road. + +They marched very quickly, without resting, and halted only when the +sun began to set. The baggage carts drew up close together and the men +began to prepare for their night's rest. They all appeared angry and +dissatisfied. For a long time, oaths, angry shouts, and fighting could +be heard from all sides. A carriage that followed the escort ran +into one of the carts and knocked a hole in it with its pole. +Several soldiers ran toward the cart from different sides: some beat +the carriage horses on their heads, turning them aside, others +fought among themselves, and Pierre saw that one German was badly +wounded on the head by a sword. + +It seemed that all these men, now that they had stopped amid +fields in the chill dusk of the autumn evening, experienced one and +the same feeling of unpleasant awakening from the hurry and +eagerness to push on that had seized them at the start. Once at a +standstill they all seemed to understand that they did not yet know +where they were going, and that much that was painful and difficult +awaited them on this journey. + +During this halt the escort treated the prisoners even worse than +they had done at the start. It was here that the prisoners for the +first time received horseflesh for their meat ration. + +From the officer down to the lowest soldier they showed what +seemed like personal spite against each of the prisoners, in +unexpected contrast to their former friendly relations. + +This spite increased still more when, on calling over the roll of +prisoners, it was found that in the bustle of leaving Moscow one +Russian soldier, who had pretended to suffer from colic, had +escaped. Pierre saw a Frenchman beat a Russian soldier cruelly for +straying too far from the road, and heard his friend the captain +reprimand and threaten to court-martial a noncommissioned officer on +account of the escape of the Russian. To the noncommissioned officer's +excuse that the prisoner was ill and could not walk, the officer +replied that the order was to shoot those who lagged behind. Pierre +felt that that fatal force which had crushed him during the +executions, but which he had not felt during his imprisonment, now +again controlled his existence. It was terrible, but he felt that in +proportion to the efforts of that fatal force to crush him, there grew +and strengthened in his soul a power of life independent of it. + +He ate his supper of buckwheat soup with horseflesh and chatted with +his comrades. + +Neither Pierre nor any of the others spoke of what they had seen +in Moscow, or of the roughness of their treatment by the French, or of +the order to shoot them which had been announced to them. As if in +reaction against the worsening of their position they were all +particularly animated and gay. They spoke of personal reminiscences, +of amusing scenes they had witnessed during the campaign, and +avoided all talk of their present situation. + +The sun had set long since. Bright stars shone out here and there in +the sky. A red glow as of a conflagration spread above the horizon +from the rising full moon, and that vast red ball swayed strangely +in the gray haze. It grew light. The evening was ending, but the night +had not yet come. Pierre got up and left his new companions, +crossing between the campfires to the other side of the road where +he had been told the common soldier prisoners were stationed. He +wanted to talk to them. On the road he was stopped by a French +sentinel who ordered him back. + +Pierre turned back, not to his companions by the campfire, but to an +unharnessed cart where there was nobody. Tucking his legs under him +and dropping his head he sat down on the cold ground by the wheel of +the cart and remained motionless a long while sunk in thought. +Suddenly he burst out into a fit of his broad, good-natured +laughter, so loud that men from various sides turned with surprise +to see what this strange and evidently solitary laughter could mean. + +"Ha-ha-ha!" laughed Pierre. And he said aloud to himself: "The +soldier did not let me pass. They took me and shut me up. They hold me +captive. What, me? Me? My immortal soul? Ha-ha-ha! Ha-ha-ha!..." and +he laughed till tears started to his eyes. + +A man got up and came to see what this queer big fellow was laughing +at all by himself. Pierre stopped laughing, got up, went farther +away from the inquisitive man, and looked around him. + +The huge, endless bivouac that had previously resounded with the +crackling of campfires and the voices of many men had grown quiet, the +red campfires were growing paler and dying down. High up in the +light sky hung the full moon. Forests and fields beyond the camp, +unseen before, were now visible in the distance. And farther still, +beyond those forests and fields, the bright, oscillating, limitless +distance lured one to itself. Pierre glanced up at the sky and the +twinkling stars in its faraway depths. "And all that is me, all that +is within me, and it is all I!" thought Pierre. "And they caught all +that and put it into a shed boarded up with planks!" He smiled, and +went and lay down to sleep beside his companions. + + + + + +CHAPTER XV + + +In the early days of October another envoy came to Kutuzov with a +letter from Napoleon proposing peace and falsely dated from Moscow, +though Napoleon was already not far from Kutuzov on the old Kaluga +road. Kutuzov replied to this letter as he had done to the one +formerly brought by Lauriston, saying that there could be no +question of peace. + +Soon after that a report was received from Dorokhov's guerrilla +detachment operating to the left of Tarutino that troops of +Broussier's division had been seen at Forminsk and that being +separated from the rest of the French army they might easily be +destroyed. The soldiers and officers again demanded action. Generals +on the staff, excited by the memory of the easy victory at Tarutino, +urged Kutuzov to carry out Dorokhov's suggestion. Kutuzov did not +consider any offensive necessary. The result was a compromise which +was inevitable: a small detachment was sent to Forminsk to attack +Broussier. + +By a strange coincidence, this task, which turned out to be a most +difficult and important one, was entrusted to Dokhturov--that same +modest little Dokhturov whom no one had described to us as drawing +up plans of battles, dashing about in front of regiments, showering +crosses on batteries, and so on, and who was thought to be and was +spoken of as undecided and undiscerning--but whom we find commanding +wherever the position was most difficult all through the +Russo-French wars from Austerlitz to the year 1813. At Austerlitz he +remained last at the Augezd dam, rallying the regiments, saving what +was possible when all were flying and perishing and not a single +general was left in the rear guard. Ill with fever he went to Smolensk +with twenty thousand men to defend the town against Napoleon's whole +army. In Smolensk, at the Malakhov Gate, he had hardly dozed off in +a paroxysm of fever before he was awakened by the bombardment of the +town--and Smolensk held out all day long. At the battle of Borodino, +when Bagration was killed and nine tenths of the men of our left flank +had fallen and the full force of the French artillery fire was +directed against it, the man sent there was this same irresolute and +undiscerning Dokhturov--Kutuzov hastening to rectify a mistake he +had made by sending someone else there first. And the quiet little +Dokhturov rode thither, and Borodino became the greatest glory of +the Russian army. Many heroes have been described to us in verse and +prose, but of Dokhturov scarcely a word has been said. + +It was Dokhturov again whom they sent to Forminsk and from there +to Malo-Yaroslavets, the place where the last battle with the French +was fought and where the obvious disintegration of the French army +began; and we are told of many geniuses and heroes of that period of +the campaign, but of Dokhturov nothing or very little is said and that +dubiously. And this silence about Dokhturov is the clearest +testimony to his merit. + +It is natural for a man who does not understand the workings of a +machine to imagine that a shaving that has fallen into it by chance +and is interfering with its action and tossing about in it is its most +important part. The man who does not understand the construction of +the machine cannot conceive that the small connecting cogwheel which +revolves quietly is one of the most essential parts of the machine, +and not the shaving which merely harms and hinders the working. + +On the tenth of October when Dokhturov had gone halfway to +Forminsk and stopped at the village of Aristovo, preparing +faithfully to execute the orders he had received, the whole French +army having, in its convulsive movement, reached Murat's position +apparently in order to give battle--suddenly without any reason turned +off to the left onto the new Kaluga road and began to enter +Forminsk, where only Broussier had been till then. At that time +Dokhturov had under his command, besides Dorokhov's detachment, the +two small guerrilla detachments of Figner and Seslavin. + +On the evening of October 11 Seslavin came to the Aristovo +headquarters with a French guardsman he had captured. The prisoner +said that the troops that had entered Forminsk that day were the +vanguard of the whole army, that Napoleon was there and the whole army +had left Moscow four days previously. That same evening a house serf +who had come from Borovsk said he had seen an immense army entering +the town. Some Cossacks of Dokhturov's detachment reported having +sighted the French Guards marching along the road to Borovsk. From all +these reports it was evident that where they had expected to meet a +single division there was now the whole French army marching from +Moscow in an unexpected direction--along the Kaluga road. Dokhturov +was unwilling to undertake any action, as it was not clear to him +now what he ought to do. He had been ordered to attack Forminsk. But +only Broussier had been there at that time and now the whole French +army was there. Ermolov wished to act on his own judgment, but +Dokhturov insisted that he must have Kutuzov's instructions. So it was +decided to send a dispatch to the staff. + +For this purpose a capable officer, Bolkhovitinov, was chosen, who +was to explain the whole affair by word of mouth, besides delivering a +written report. Toward midnight Bolkhovitinov, having received the +dispatch and verbal instructions, galloped off to the General Staff +accompanied by a Cossack with spare horses. + + + + + +CHAPTER XVI + + +It was a warm, dark, autumn night. It had been raining for four +days. Having changed horses twice and galloped twenty miles in an hour +and a half over a sticky, muddy road, Bolkhovitinov reached Litashevka +after one o'clock at night. Dismounting at a cottage on whose wattle +fence hung a signboard, GENERAL STAFF, and throwing down his reins, he +entered a dark passage. + +"The general on duty, quick! It's very important!" said he to +someone who had risen and was sniffing in the dark passage. + +"He has been very unwell since the evening and this is the third +night he has not slept," said the orderly pleadingly in a whisper. +"You should wake the captain first." + +"But this is very important, from General Dokhturov," said +Bolkhovitinov, entering the open door which he had found by feeling in +the dark. + +The orderly had gone in before him and began waking somebody. + +"Your honor, your honor! A courier." + +"What? What's that? From whom?" came a sleepy voice. + +"From Dokhturov and from Alexey Petrovich. Napoleon is at Forminsk," +said Bolkhovitinov, unable to see in the dark who was speaking but +guessing by the voice that it was not Konovnitsyn. + +The man who had wakened yawned and stretched himself. + +"I don't like waking him," he said, fumbling for something. "He is +very ill. Perhaps this is only a rumor." + +"Here is the dispatch," said Bolkhovitinov. "My orders are to give +it at once to the general on duty." + +"Wait a moment, I'll light a candle. You damned rascal, where do you +always hide it?" said the voice of the man who was stretching himself, +to the orderly. (This was Shcherbinin, Konovnitsyn's adjutant.) +"I've found it, I've found it!" he added. + +The orderly was striking a light and Shcherbinin was fumbling for +something on the candlestick. + +"Oh, the nasty beasts!" said he with disgust. + +By the light of the sparks Bolkhovitinov saw Shcherbinin's +youthful face as he held the candle, and the face of another man who +was still asleep. This was Konovnitsyn. + +When the flame of the sulphur splinters kindled by the tinder burned +up, first blue and then red, Shcherbinin lit the tallow candle, from +the candlestick of which the cockroaches that had been gnawing it were +running away, and looked at the messenger. Bolkhovitinov was +bespattered all over with mud and had smeared his face by wiping it +with his sleeve. + +"Who gave the report?" inquired Shcherbinin, taking the envelope. + +"The news is reliable," said Bolkhovitinov. "Prisoners, Cossacks, +and the scouts all say the same thing." + +"There's nothing to be done, we'll have to wake him," said +Shcherbinin, rising and going up to the man in the nightcap who lay +covered by a greatcoat. "Peter Petrovich!" said he. (Konovnitsyn did +not stir.) "To the General Staff!" he said with a smile, knowing +that those words would be sure to arouse him. + +And in fact the head in the nightcap was lifted at once. On +Konovnitsyn's handsome, resolute face with cheeks flushed by fever, +there still remained for an instant a faraway dreamy expression remote +from present affairs, but then he suddenly started and his face +assumed its habitual calm and firm appearance. + +"Well, what is it? From whom?" he asked immediately but without +hurry, blinking at the light. + +While listening to the officer's report Konovnitsyn broke the seal +and read the dispatch. Hardly had he done so before he lowered his +legs in their woolen stockings to the earthen floor and began +putting on his boots. Then he took off his nightcap, combed his hair +over his temples, and donned his cap. + +"Did you get here quickly? Let us go to his Highness." + +Konovnitsyn had understood at once that the news brought was of +great importance and that no time must be lost. He did not consider or +ask himself whether the news was good or bad. That did not interest +him. He regarded the whole business of the war not with his +intelligence or his reason but by something else. There was within him +a deep unexpressed conviction that all would be well, but that one +must not trust to this and still less speak about it, but must only +attend to one's own work. And he did his work, giving his whole +strength to the task. + +Peter Petrovich Konovnitsyn, like Dokhturov, seems to have been +included merely for propriety's sake in the list of the so-called +heroes of 1812--the Barclays, Raevskis, Ermolovs, Platovs, and +Miloradoviches. Like Dokhturov he had the reputation of being a man of +very limited capacity and information, and like Dokhturov he never +made plans of battle but was always found where the situation was most +difficult. Since his appointment as general on duty he had always +slept with his door open, giving orders that every messenger should be +allowed to wake him up. In battle he was always under fire, so that +Kutuzov reproved him for it and feared to send him to the front, and +like Dokhturov he was one of those unnoticed cogwheels that, without +clatter or noise, constitute the most essential part of the machine. + +Coming out of the hut into the damp, dark night Konovnitsyn frowned- +partly from an increased pain in his head and partly at the unpleasant +thought that occurred to him, of how all that nest of influential +men on the staff would be stirred up by this news, especially +Bennigsen, who ever since Tarutino had been at daggers drawn with +Kutuzov; and how they would make suggestions, quarrel, issue orders, +and rescind them. And this premonition was disagreeable to him +though he knew it could not be helped. + +And in fact Toll, to whom he went to communicate the news, +immediately began to expound his plans to a general sharing his +quarters, until Konovnitsyn, who listened in weary silence, reminded +him that they must go to see his Highness. + + + + + +CHAPTER XVII + + +Kutuzov like all old people did not sleep much at night. He often +fell asleep unexpectedly in the daytime, but at night, lying on his +bed without undressing, he generally remained awake thinking. + +So he lay now on his bed, supporting his large, heavy, scarred +head on his plump hand, with his one eye open, meditating and +peering into the darkness. + +Since Bennigsen, who corresponded with the Emperor and had more +influence than anyone else on the staff, had begun to avoid him, +Kutuzov was more at ease as to the possibility of himself and his +troops being obliged to take part in useless aggressive movements. The +lesson of the Tarutino battle and of the day before it, which +Kutuzov remembered with pain, must, he thought, have some effect on +others too. + +"They must understand that we can only lose by taking the offensive. +Patience and time are my warriors, my champions," thought Kutuzov. +He knew that an apple should not be plucked while it is green. It will +fall of itself when ripe, but if picked unripe the apple is spoiled, +the tree is harmed, and your teeth are set on edge. Like an +experienced sportsman he knew that the beast was wounded, and +wounded as only the whole strength of Russia could have wounded it, +but whether it was mortally wounded or not was still an undecided +question. Now by the fact of Lauriston and Barthelemi having been +sent, and by the reports of the guerrillas, Kutuzov was almost sure +that the wound was mortal. But he needed further proofs and it was +necessary to wait. + +"They want to run to see how they have wounded it. Wait and we shall +see! Continual maneuvers, continual advances!" thought he. "What +for? Only to distinguish themselves! As if fighting were fun. They are +like children from whom one can't get any sensible account of what has +happened because they all want to show how well they can fight. But +that's not what is needed now. + +"And what ingenious maneuvers they all propose to me! It seems to +them that when they have thought of two or three contingencies" (he +remembered the general plan sent him from Petersburg) "they have +foreseen everything. But the contingencies are endless." + +The undecided question as to whether the wound inflicted at Borodino +was mortal or not had hung over Kutuzov's head for a whole month. On +the one hand the French had occupied Moscow. On the other Kutuzov felt +assured with all his being that the terrible blow into which he and +all the Russians had put their whole strength must have been mortal. +But in any case proofs were needed; he had waited a whole month for +them and grew more impatient the longer he waited. Lying on his bed +during those sleepless nights he did just what he reproached those +younger generals for doing. He imagined all sorts of possible +contingencies, just like the younger men, but with this difference, +that he saw thousands of contingencies instead of two or three and +based nothing on them. The longer he thought the more contingencies +presented themselves. He imagined all sorts of movements of the +Napoleonic army as a whole or in sections--against Petersburg, or +against him, or to outflank him. He thought too of the possibility +(which he feared most of all) that Napoleon might fight him with his +own weapon and remain in Moscow awaiting him. Kutuzov even imagined +that Napoleon's army might turn back through Medyn and Yukhnov, but +the one thing he could not foresee was what happened--the insane, +convulsive stampede of Napoleon's army during its first eleven days +after leaving Moscow: a stampede which made possible what Kutuzov +had not yet even dared to think of--the complete extermination of +the French. Dorokhov's report about Broussier's division, the +guerrillas' reports of distress in Napoleon's army, rumors of +preparations for leaving Moscow, all confirmed the supposition that +the French army was beaten and preparing for flight. But these were +only suppositions, which seemed important to the younger men but not +to Kutuzov. With his sixty years' experience he knew what value to +attach to rumors, knew how apt people who desire anything are to group +all news so that it appears to confirm what they desire, and he knew +how readily in such cases they omit all that makes for the contrary. +And the more he desired it the less he allowed himself to believe +it. This question absorbed all his mental powers. All else was to +him only life's customary routine. To such customary routine +belonged his conversations with the staff, the letters he wrote from +Tarutino to Madame de Stael, the reading of novels, the distribution +of awards, his correspondence with Petersburg, and so on. But the +destruction of the French, which he alone foresaw, was his heart's one +desire. + +On the night of the eleventh of October he lay leaning on his arm +and thinking of that. + +There was a stir in the next room and he heard the steps of Toll, +Konovnitsyn, and Bolkhovitinov. + +"Eh, who's there? Come in, come in! What news?" the field marshal +called out to them. + +While a footman was lighting a candle, Toll communicated the +substance of the news. + +"Who brought it?" asked Kutuzov with a look which, when the candle +was lit, struck Toll by its cold severity. + +"There can be no doubt about it, your Highness." + +"Call him in, call him here." + +Kutuzov sat up with one leg hanging down from the bed and his big +paunch resting against the other which was doubled under him. He +screwed up his seeing eye to scrutinize the messenger more +carefully, as if wishing to read in his face what preoccupied his +own mind. + +"Tell me, tell me, friend," said he to Bolkhovitinov in his low, +aged voice, as he pulled together the shirt which gaped open on his +chest, "come nearer--nearer. What news have you brought me? Eh? That +Napoleon has left Moscow? Are you sure? Eh?" + +Bolkhovitinov gave a detailed account from the beginning of all he +had been told to report. + +"Speak quicker, quicker! Don't torture me!" Kutuzov interrupted him. + +Bolkhovitinov told him everything and was then silent, awaiting +instructions. Toll was beginning to say something but Kutuzov +checked him. He tried to say something, but his face suddenly puckered +and wrinkled; he waved his arm at Toll and turned to the opposite side +of the room, to the corner darkened by the icons that hung there. + +"O Lord, my Creator, Thou has heard our prayer..." said he in a +tremulous voice with folded hands. "Russia is saved. I thank Thee, O +Lord!" and he wept. + + + + + +CHAPTER XVIII + + +From the time he received this news to the end of the campaign all +Kutuzov's activity was directed toward restraining his troops, by +authority, by guile, and by entreaty, from useless attacks, maneuvers, +or encounters with the perishing enemy. Dokhturov went to +Malo-Yaroslavets, but Kutuzov lingered with the main army and gave +orders for the evacuation of Kaluga--a retreat beyond which town +seemed to him quite possible. + +Everywhere Kutuzov retreated, but the enemy without waiting for +his retreat fled in the opposite direction. + +Napoleon's historians describe to us his skilled maneuvers at +Tarutino and Malo-Yaroslavets, and make conjectures as to what would +have happened had Napoleon been in time to penetrate into the rich +southern provinces. + +But not to speak of the fact that nothing prevented him from +advancing into those southern provinces (for the Russian army did +not bar his way), the historians forget that nothing could have +saved his army, for then already it bore within itself the germs of +inevitable ruin. How could that army--which had found abundant +supplies in Moscow and had trampled them underfoot instead of +keeping them, and on arriving at Smolensk had looted provisions +instead of storing them--how could that army recuperate in Kaluga +province, which was inhabited by Russians such as those who lived in +Moscow, and where fire had the same property of consuming what was set +ablaze? + +That army could not recover anywhere. Since the battle of Borodino +and the pillage of Moscow it had borne within itself, as it were, +the chemical elements of dissolution. + +The members of what had once been an army--Napoleon himself and +all his soldiers fled--without knowing whither, each concerned only to +make his escape as quickly as possible from this position, of the +hopelessness of which they were all more or less vaguely conscious. + +So it came about that at the council at Malo-Yaroslavets, when the +generals pretending to confer together expressed various opinions, all +mouths were closed by the opinion uttered by the simple-minded soldier +Mouton who, speaking last, said what they all felt: that the one thing +needful was to get away as quickly as possible; and no one, not even +Napoleon, could say anything against that truth which they all +recognized. + +But though they all realized that it was necessary to get away, +there still remained a feeling of shame at admitting that they must +flee. An external shock was needed to overcome that shame, and this +shock came in due time. It was what the French called "le hourra de +l'Empereur." + +The day after the council at Malo-Yaroslavets Napoleon rode out +early in the morning amid the lines of his army with his suite of +marshals and an escort, on the pretext of inspecting the army and +the scene of the previous and of the impending battle. Some Cossacks +on the prowl for booty fell in with the Emperor and very nearly +captured him. If the Cossacks did not capture Napoleon then, what +saved him was the very thing that was destroying the French army, +the booty on which the Cossacks fell. Here as at Tarutino they went +after plunder, leaving the men. Disregarding Napoleon they rushed +after the plunder and Napoleon managed to escape. + +When les enfants du Don might so easily have taken the Emperor +himself in the midst of his army, it was clear that there was +nothing for it but to fly as fast as possible along the nearest, +familiar road. Napoleon with his forty-year-old stomach understood +that hint, not feeling his former agility and boldness, and under +the influence of the fright the Cossacks had given him he at once +agreed with Mouton and issued orders--as the historians tell us--to +retreat by the Smolensk road. + +That Napoleon agreed with Mouton, and that the army retreated, +does not prove that Napoleon caused it to retreat, but that the forces +which influenced the whole army and directed it along the Mozhaysk +(that is, the Smolensk) road acted simultaneously on him also. + + + + + +CHAPTER XIX + + +A man in motion always devises an aim for that motion. To be able to +go a thousand miles he must imagine that something good awaits him +at the end of those thousand miles. One must have the prospect of a +promised land to have the strength to move. + +The promised land for the French during their advance had been +Moscow, during their retreat it was their native land. But that native +land was too far off, and for a man going a thousand miles it is +absolutely necessary to set aside his final goal and to say to +himself: "Today I shall get to a place twenty-five miles off where I +shall rest and spend the night," and during the first day's journey +that resting place eclipses his ultimate goal and attracts all his +hopes and desires. And the impulses felt by a single person are always +magnified in a crowd. + +For the French retreating along the old Smolensk road, the final +goal--their native land--was too remote, and their immediate goal +was Smolensk, toward which all their desires and hopes, enormously +intensified in the mass, urged them on. It was not that they knew that +much food and fresh troops awaited them in Smolensk, nor that they +were told so (on the contrary their superior officers, and Napoleon +himself, knew that provisions were scarce there), but because this +alone could give them strength to move on and endure their present +privations. So both those who knew and those who did not know deceived +themselves, and pushed on to Smolensk as to a promised land. + +Coming out onto the highroad the French fled with surprising +energy and unheard-of rapidity toward the goal they had fixed on. +Besides the common impulse which bound the whole crowd of French +into one mass and supplied them with a certain energy, there was +another cause binding them together--their great numbers. As with +the physical law of gravity, their enormous mass drew the individual +human atoms to itself. In their hundreds of thousands they moved +like a whole nation. + +Each of them desired nothing more than to give himself up as a +prisoner to escape from all this horror and misery; but on the one +hand the force of this common attraction to Smolensk, their goal, drew +each of them in the same direction; on the other hand an army corps +could not surrender to a company, and though the French availed +themselves of every convenient opportunity to detach themselves and to +surrender on the slightest decent pretext, such pretexts did not +always occur. Their very numbers and their crowded and swift +movement deprived them of that possibility and rendered it not only +difficult but impossible for the Russians to stop this movement, to +which the French were directing all their energies. Beyond a certain +limit no mechanical disruption of the body could hasten the process of +decomposition. + +A lump of snow cannot be melted instantaneously. There is a +certain limit of time in less than which no amount of heat can melt +the snow. On the contrary the greater the heat the more solidified the +remaining snow becomes. + +Of the Russian commanders Kutuzov alone understood this. When the +flight of the French army along the Smolensk road became well defined, +what Konovnitsyn had foreseen on the night of the eleventh of +October began to occur. The superior officers all wanted to +distinguish themselves, to cut off, to seize, to capture, and to +overthrow the French, and all clamored for action. + +Kutuzov alone used all his power (and such power is very limited +in the case of any commander in chief) to prevent an attack. + +He could not tell them what we say now: "Why fight, why block the +road, losing our own men and inhumanly slaughtering unfortunate +wretches? What is the use of that, when a third of their army has +melted away on the road from Moscow to Vyazma without any battle?" But +drawing from his aged wisdom what they could understand, he told +them of the golden bridge, and they laughed at and slandered him, +flinging themselves on, rending and exulting over the dying beast. + +Ermolov, Miloradovich, Platov, and others in proximity to the French +near Vyazma could not resist their desire to cut off and break up +two French corps, and by way of reporting their intention to Kutuzov +they sent him a blank sheet of paper in an envelope. + +And try as Kutuzov might to restrain the troops, our men attacked, +trying to bar the road. Infantry regiments, we are told, advanced to +the attack with music and with drums beating, and killed and lost +thousands of men. + +But they did not cut off or overthrow anybody and the French army, +closing up more firmly at the danger, continued, while steadily +melting away, to pursue its fatal path to Smolensk. + + + + + + +BOOK FOURTEEN: 1812 + + + + + +CHAPTER I + + +The Battle of Borodino, with the occupation of Moscow that +followed it and the flight of the French without further conflicts, is +one of the most instructive phenomena in history. + +All historians agree that the external activity of states and +nations in their conflicts with one another is expressed in wars, +and that as a direct result of greater or less success in war the +political strength of states and nations increases or decreases. + +Strange as may be the historical account of how some king or +emperor, having quarreled with another, collects an army, fights his +enemy's army, gains a victory by killing three, five, or ten +thousand men, and subjugates a kingdom and an entire nation of several +millions, all the facts of history (as far as we know it) confirm +the truth of the statement that the greater or lesser success of one +army against another is the cause, or at least an essential +indication, of an increase or decrease in the strength of the +nation--even though it is unintelligible why the defeat of an army- +a hundredth part of a nation--should oblige that whole nation to +submit. An army gains a victory, and at once the rights of the +conquering nation have increased to the detriment of the defeated. +An army has suffered defeat, and at once a people loses its rights +in proportion to the severity of the reverse, and if its army +suffers a complete defeat the nation is quite subjugated. + +So according to history it has been found from the most ancient +times, and so it is to our own day. All Napoleon's wars serve to +confirm this rule. In proportion to the defeat of the Austrian army +Austria loses its rights, and the rights and the strength of France +increase. The victories of the French at Jena and Auerstadt destroy +the independent existence of Prussia. + +But then, in 1812, the French gain a victory near Moscow. Moscow +is taken and after that, with no further battles, it is not Russia +that ceases to exist, but the French army of six hundred thousand, and +then Napoleonic France itself. To strain the facts to fit the rules of +history: to say that the field of battle at Borodino remained in the +hands of the Russians, or that after Moscow there were other battles +that destroyed Napoleon's army, is impossible. + +After the French victory at Borodino there was no general engagement +nor any that were at all serious, yet the French army ceased to exist. +What does this mean? If it were an example taken from the history of +China, we might say that it was not an historic phenomenon (which is +the historians' usual expedient when anything does not fit their +standards); if the matter concerned some brief conflict in which +only a small number of troops took part, we might treat it as an +exception; but this event occurred before our fathers' eyes, and for +them it was a question of the life or death of their fatherland, and +it happened in the greatest of all known wars. + +The period of the campaign of 1812 from the battle of Borodino to +the expulsion of the French proved that the winning of a battle does +not produce a conquest and is not even an invariable indication of +conquest; it proved that the force which decides the fate of peoples +lies not in the conquerors, nor even in armies and battles, but in +something else. + +The French historians, describing the condition of the French army +before it left Moscow, affirm that all was in order in the Grand Army, +except the cavalry, the artillery, and the transport--there was no +forage for the horses or the cattle. That was a misfortune no one +could remedy, for the peasants of the district burned their hay rather +than let the French have it. + +The victory gained did not bring the usual results because the +peasants Karp and Vlas (who after the French had evacuated Moscow +drove in their carts to pillage the town, and in general personally +failed to manifest any heroic feelings), and the whole innumerable +multitude of such peasants, did not bring their hay to Moscow for +the high price offered them, but burned it instead. + +Let us imagine two men who have come out to fight a duel with +rapiers according to all the rules of the art of fencing. The +fencing has gone on for some time; suddenly one of the combatants, +feeling himself wounded and understanding that the matter is no joke +but concerns his life, throws down his rapier, and seizing the first +cudgel that comes to hand begins to brandish it. Then let us imagine +that the combatant who so sensibly employed the best and simplest +means to attain his end was at the same time influenced by +traditions of chivalry and, desiring to conceal the facts of the case, +insisted that he had gained his victory with the rapier according to +all the rules of art. One can imagine what confusion and obscurity +would result from such an account of the duel. + +The fencer who demanded a contest according to the rules of +fencing was the French army; his opponent who threw away the rapier +and snatched up the cudgel was the Russian people; those who try to +explain the matter according to the rules of fencing are the +historians who have described the event. + +After the burning of Smolensk a war began which did not follow any +previous traditions of war. The burning of towns and villages, the +retreats after battles, the blow dealt at Borodino and the renewed +retreat, the burning of Moscow, the capture of marauders, the +seizure of transports, and the guerrilla war were all departures +from the rules. + +Napoleon felt this, and from the time he took up the correct fencing +attitude in Moscow and instead of his opponent's rapier saw a cudgel +raised above his head, he did not cease to complain to Kutuzov and +to the Emperor Alexander that the war was being carried on contrary to +all the rules--as if there were any rules for killing people. In spite +of the complaints of the French as to the nonobservance of the +rules, in spite of the fact that to some highly placed Russians it +seemed rather disgraceful to fight with a cudgel and they wanted to +assume a pose en quarte or en tierce according to all the rules, and +to make an adroit thrust en prime, and so on--the cudgel of the +people's war was lifted with all its menacing and majestic strength, +and without consulting anyone's tastes or rules and regardless of +anything else, it rose and fell with stupid simplicity, but +consistently, and belabored the French till the whole invasion had +perished. + +And it is well for a people who do not--as the French did in 1813- +salute according to all the rules of art, and, presenting the hilt +of their rapier gracefully and politely, hand it to their +magnanimous conqueror, but at the moment of trial, without asking what +rules others have adopted in similar cases, simply and easily pick +up the first cudgel that comes to hand and strike with it till the +feeling of resentment and revenge in their soul yields to a feeling of +contempt and compassion. + + + + + +CHAPTER II + + +One of the most obvious and advantageous departures from the +so-called laws of war is the action of scattered groups against men +pressed together in a mass. Such action always occurs in wars that +take on a national character. In such actions, instead of two crowds +opposing each other, the men disperse, attack singly, run away when +attacked by stronger forces, but again attack when opportunity offers. +This was done by the guerrillas in Spain, by the mountain tribes in +the Caucasus, and by the Russians in 1812. + +People have called this kind of war "guerrilla warfare" and assume +that by so calling it they have explained its meaning. But such a +war does not fit in under any rule and is directly opposed to a +well-known rule of tactics which is accepted as infallible. That +rule says that an attacker should concentrate his forces in order to +be stronger than his opponent at the moment of conflict. + +Guerrilla war (always successful, as history shows) directly +infringes that rule. + +This contradiction arises from the fact that military science +assumes the strength of an army to be identical with its numbers. +Military science says that the more troops the greater the strength. +Les gros bataillons ont toujours raison.* + + +*Large battalions are always victorious. + + +For military science to say this is like defining momentum in +mechanics by reference to the mass only: stating that momenta are +equal or unequal to each other simply because the masses involved +are equal or unequal. + +Momentum (quantity of motion) is the product of mass and velocity. + +In military affairs the strength of an army is the product of its +mass and some unknown x. + +Military science, seeing in history innumerable instances of the +fact that the size of any army does not coincide with its strength and +that small detachments defeat larger ones, obscurely admits the +existence of this unknown factor and tries to discover it--now in a +geometric formation, now in the equipment employed, now, and most +usually, in the genius of the commanders. But the assignment of +these various meanings to the factor does not yield results which +accord with the historic facts. + +Yet it is only necessary to abandon the false view (adopted to +gratify the "heroes") of the efficacy of the directions issued in +wartime by commanders, in order to find this unknown quantity. + +That unknown quantity is the spirit of the army, that is to say, the +greater or lesser readiness to fight and face danger felt by all the +men composing an army, quite independently of whether they are, or are +not, fighting under the command of a genius, in two--or three-line +formation, with cudgels or with rifles that repeat thirty times a +minute. Men who want to fight will always put themselves in the most +advantageous conditions for fighting. + +The spirit of an army is the factor which multiplied by the mass +gives the resulting force. To define and express the significance of +this unknown factor--the spirit of an army--is a problem for science. + +This problem is only solvable if we cease arbitrarily to +substitute for the unknown x itself the conditions under which that +force becomes apparent--such as the commands of the general, the +equipment employed, and so on--mistaking these for the real +significance of the factor, and if we recognize this unknown +quantity in its entirety as being the greater or lesser desire to +fight and to face danger. Only then, expressing known historic facts +by equations and comparing the relative significance of this factor, +can we hope to define the unknown. + +Ten men, battalions, or divisions, fighting fifteen men, battalions, +or divisions, conquer--that is, kill or take captive--all the +others, while themselves losing four, so that on the one side four and +on the other fifteen were lost. Consequently the four were equal to +the fifteen, and therefore 4x = 15y. Consequently x/y = 15/4. This +equation does not give us the value of the unknown factor but gives us +a ratio between two unknowns. And by bringing variously selected +historic units (battles, campaigns, periods of war) into such +equations, a series of numbers could be obtained in which certain laws +should exist and might be discovered. + +The tactical rule that an army should act in masses when +attacking, and in smaller groups in retreat, unconsciously confirms +the truth that the strength of an army depends on its spirit. To +lead men forward under fire more discipline (obtainable only by +movement in masses) is needed than is needed to resist attacks. But +this rule which leaves out of account the spirit of the army +continually proves incorrect and is in particularly striking +contrast to the facts when some strong rise or fall in the spirit of +the troops occurs, as in all national wars. + +The French, retreating in 1812--though according to tactics they +should have separated into detachments to defend themselves- +congregated into a mass because the spirit of the army had so fallen +that only the mass held the army together. The Russians, on the +contrary, ought according to tactics to have attacked in mass, but +in fact they split up into small units, because their spirit had so +risen that separate individuals, without orders, dealt blows at the +French without needing any compulsion to induce them to expose +themselves to hardships and dangers. + + + + + +CHAPTER III + + +The so-called partisan war began with the entry of the French into +Smolensk. + +Before partisan warfare had been officially recognized by the +government, thousands of enemy stragglers, marauders, and foragers had +been destroyed by the Cossacks and the peasants, who killed them off +as instinctively as dogs worry a stray mad dog to death. Denis +Davydov, with his Russian instinct, was the first to recognize the +value of this terrible cudgel which regardless of the rules of +military science destroyed the French, and to him belongs the credit +for taking the first step toward regularizing this method of warfare. + +On August 24 Davydov's first partisan detachment was formed and then +others were recognized. The further the campaign progressed the more +numerous these detachments became. + +The irregulars destroyed the great army piecemeal. They gathered the +fallen leaves that dropped of themselves from that withered tree- +the French army--and sometimes shook that tree itself. By October, +when the French were fleeing toward Smolensk, there were hundreds of +such companies, of various sizes and characters. There were some +that adopted all the army methods and had infantry, artillery, staffs, +and the comforts of life. Others consisted solely of Cossack +cavalry. There were also small scratch groups of foot and horse, and +groups of peasants and landowners that remained unknown. A sacristan +commanded one party which captured several hundred prisoners in the +course of a month; and there was Vasilisa, the wife of a village +elder, who slew hundreds of the French. + +The partisan warfare flamed up most fiercely in the latter days of +October. Its first period had passed: when the partisans themselves, +amazed at their own boldness, feared every minute to be surrounded and +captured by the French, and hid in the forests without unsaddling, +hardly daring to dismount and always expecting to be pursued. By the +end of October this kind of warfare had taken definite shape: it had +become clear to all what could be ventured against the French and what +could not. Now only the commanders of detachments with staffs, and +moving according to rules at a distance from the French, still +regarded many things as impossible. The small bands that had started +their activities long before and had already observed the French +closely considered things possible which the commanders of the big +detachments did not dare to contemplate. The Cossacks and peasants who +crept in among the French now considered everything possible. + +On October 22, Denisov (who was one of the irregulars) was with +his group at the height of the guerrilla enthusiasm. Since early +morning he and his party had been on the move. All day long he had +been watching from the forest that skirted the highroad a large French +convoy of cavalry baggage and Russian prisoners separated from the +rest of the army, which--as was learned from spies and prisoners- +was moving under a strong escort to Smolensk. Besides Denisov and +Dolokhov (who also led a small party and moved in Denisov's vicinity), +the commanders of some large divisions with staffs also knew of this +convoy and, as Denisov expressed it, were sharpening their teeth for +it. Two of the commanders of large parties--one a Pole and the other a +German--sent invitations to Denisov almost simultaneously, +requesting him to join up with their divisions to attack the convoy. + +"No, bwother, I have gwown mustaches myself," said Denisov on +reading these documents, and he wrote to the German that, despite +his heartfelt desire to serve under so valiant and renowned a general, +he had to forgo that pleasure because he was already under the command +of the Polish general. To the Polish general he replied to the same +effect, informing him that he was already under the command of the +German. + +Having arranged matters thus, Denisov and Dolokhov intended, without +reporting matters to the higher command, to attack and seize that +convoy with their own small forces. On October 22 it was moving from +the village of Mikulino to that of Shamshevo. To the left of the +road between Mikulino and Shamshevo there were large forests, +extending in some places up to the road itself though in others a mile +or more back from it. Through these forests Denisov and his party rode +all day, sometimes keeping well back in them and sometimes coming to +the very edge, but never losing sight of the moving French. That +morning, Cossacks of Denisov's party had seized and carried off into +the forest two wagons loaded with cavalry saddles, which had stuck +in the mud not far from Mikulino where the forest ran close to the +road. Since then, and until evening, the party had the movements of +the French without attacking. It was necessary to let the French reach +Shamshevo quietly without alarming them and then, after joining +Dolokhov who was to come that evening to a consultation at a +watchman's hut in the forest less than a mile from Shamshevo, to +surprise the French at dawn, falling like an avalanche on their +heads from two sides, and rout and capture them all at one blow. + +In their rear, more than a mile from Mikulino where the forest +came right up to the road, six Cossacks were posted to report if any +fresh columns of French should show themselves. + +Beyond Shamshevo, Dolokhov was to observe the road in the same +way, to find out at what distance there were other French troops. They +reckoned that the convoy had fifteen hundred men. Denisov had two +hundred, and Dolokhov might have as many more, but the disparity of +numbers did not deter Denisov. All that he now wanted to know was what +troops these were and to learn that he had to capture a "tongue"--that +is, a man from the enemy column. That morning's attack on the wagons +had been made so hastily that the Frenchmen with the wagons had all +been killed; only a little drummer boy had been taken alive, and as he +was a straggler he could tell them nothing definite about the troops +in that column. + +Denisov considered it dangerous to make a second attack for fear +of putting the whole column on the alert, so he sent Tikhon +Shcherbaty, a peasant of his party, to Shamshevo to try and seize at +least one of the French quartermasters who had been sent on in +advance. + + + + +CHAPTER IV + + +It was a warm rainy autumn day. The sky and the horizon were both +the color of muddy water. At times a sort of mist descended, and +then suddenly heavy slanting rain came down. + +Denisov in a felt cloak and a sheepskin cap from which the rain +ran down was riding a thin thoroughbred horse with sunken sides. +Like his horse, which turned its head and laid its ears back, he +shrank from the driving rain and gazed anxiously before him. His +thin face with its short, thick black beard looked angry. + +Beside Denisov rode an esaul,* Denisov's fellow worker, also in felt +cloak and sheepskin cap, and riding a large sleek Don horse. + + +*A captain of Cossacks. + + +Esaul Lovayski the Third was a tall man as straight as an arrow, +pale-faced, fair-haired, with narrow light eyes and with calm +self-satisfaction in his face and bearing. Though it was impossible to +say in what the peculiarity of the horse and rider lay, yet at first +glance at the esaul and Denisov one saw that the latter was wet and +uncomfortable and was a man mounted on a horse, while looking at the +esaul one saw that he was as comfortable and as much at ease as always +and that he was not a man who had mounted a horse, but a man who was +one with his horse, a being consequently possessed of twofold +strength. + +A little ahead of them walked a peasant guide, wet to the skin and +wearing a gray peasant coat and a white knitted cap. + +A little behind, on a poor, small, lean Kirghiz mount with an +enormous tail and mane and a bleeding mouth, rode a young officer in a +blue French overcoat. + +Beside him rode an hussar, with a boy in a tattered French uniform +and blue cap behind him on the crupper of his horse. The boy held on +to the hussar with cold, red hands, and raising his eyebrows gazed +about him with surprise. This was the French drummer boy captured that +morning. + +Behind them along the narrow, sodden, cutup forest road came hussars +in threes and fours, and then Cossacks: some in felt cloaks, some in +French greatcoats, and some with horsecloths over their heads. The +horses, being drenched by the rain, all looked black whether +chestnut or bay. Their necks, with their wet, close-clinging manes, +looked strangely thin. Steam rose from them. Clothes, saddles, +reins, were all wet, slippery, and sodden, like the ground and the +fallen leaves that strewed the road. The men sat huddled up trying not +to stir, so as to warm the water that had trickled to their bodies and +not admit the fresh cold water that was leaking in under their +seats, their knees, and at the back of their necks. In the midst of +the outspread line of Cossacks two wagons, drawn by French horses +and by saddled Cossack horses that had been hitched on in front, +rumbled over the tree stumps and branches and splashed through the +water that lay in the ruts. + +Denisov's horse swerved aside to avoid a pool in the track and +bumped his rider's knee against a tree. + +"Oh, the devil!" exclaimed Denisov angrily, and showing his teeth he +struck his horse three times with his whip, splashing himself and +his comrades with mud. + +Denisov was out of sorts both because of the rain and also from +hunger (none of them had eaten anything since morning), and yet more +because he still had no news from Dolokhov and the man sent to capture +a "tongue" had not returned. + +"There'll hardly be another such chance to fall on a transport as +today. It's too risky to attack them by oneself, and if we put it +off till another day one of the big guerrilla detachments will +snatch the prey from under our noses," thought Denisov, continually +peering forward, hoping to see a messenger from Dolokhov. + +On coming to a path in the forest along which he could see far to +the right, Denisov stopped. + +"There's someone coming," said he. + +The esaul looked in the direction Denisov indicated. + +"There are two, an officer and a Cossack. But it is not +presupposable that it is the lieutenant colonel himself," said the +esaul, who was fond of using words the Cossacks did not know. + +The approaching riders having descended a decline were no longer +visible, but they reappeared a few minutes later. In front, at a weary +gallop and using his leather whip, rode an officer, disheveled and +drenched, whose trousers had worked up to above his knees. Behind him, +standing in the stirrups, trotted a Cossack. The officer, a very young +lad with a broad rosy face and keen merry eyes, galloped up to Denisov +and handed him a sodden envelope. + +"From the general," said the officer. "Please excuse its not being +quite dry." + +Denisov, frowning, took the envelope and opened it. + +"There, they kept telling us: 'It's dangerous, it's dangerous,'" +said the officer, addressing the esaul while Denisov was reading the +dispatch. "But Komarov and I"--he pointed to the Cossack--"were +prepared. We have each of us two pistols.... But what's this?" he +asked, noticing the French drummer boy. "A prisoner? You've already +been in action? May I speak to him?" + +"Wostov! Petya!" exclaimed Denisov, having run through the dispatch. +"Why didn't you say who you were?" and turning with a smile he held +out his hand to the lad. + +The officer was Petya Rostov. + +All the way Petya had been preparing himself to behave with +Denisov as befitted a grownup man and an officer--without hinting at +their previous acquaintance. But as soon as Denisov smiled at him +Petya brightened up, blushed with pleasure, forgot the official manner +he had been rehearsing, and began telling him how he had already +been in a battle near Vyazma and how a certain hussar had +distinguished himself there. + +"Well, I am glad to see you," Denisov interrupted him, and his +face again assumed its anxious expression. + +"Michael Feoklitych," said he to the esaul, "this is again fwom that +German, you know. He"--he indicated Petya--"is serving under him." + +And Denisov told the esaul that the dispatch just delivered was a +repetition of the German general's demand that he should join forces +with him for an attack on the transport. + +"If we don't take it tomowwow, he'll snatch it fwom under our +noses," he added. + +While Denisov was talking to the esaul, Petya--abashed by +Denisov's cold tone and supposing that it was due to the condition +of his trousers--furtively tried to pull them down under his greatcoat +so that no one should notice it, while maintaining as martial an air +as possible. + +"Will there be any orders, your honor?" he asked Denisov, holding +his hand at the salute and resuming the game of adjutant and general +for which he had prepared himself, "or shall I remain with your +honor?" + +"Orders?" Denisov repeated thoughtfully. "But can you stay till +tomowwow?" + +"Oh, please... May I stay with you?" cried Petya. + +"But, just what did the genewal tell you? To weturn at once?" +asked Denisov. + +Petya blushed. + +"He gave me no instructions. I think I could?" he returned, +inquiringly. + +"Well, all wight," said Denisov. + +And turning to his men he directed a party to go on to the halting +place arranged near the watchman's hut in the forest, and told the +officer on the Kirghiz horse (who performed the duties of an adjutant) +to go and find out where Dolokhov was and whether he would come that +evening. Denisov himself intended going with the esaul and Petya to +the edge of the forest where it reached out to Shamshevo, to have a +look at the part of the French bivouac they were to attack next day. + +"Well, old fellow," said he to the peasant guide, "lead us to +Shamshevo." + +Denisov, Petya, and the esaul, accompanied by some Cossacks and +the hussar who had the prisoner, rode to the left across a ravine to +the edge of the forest. + + + + + +CHAPTER V + + +The rain had stopped, and only the mist was falling and drops from +the trees. Denisov, the esaul, and Petya rode silently, following +the peasant in the knitted cap who, stepping lightly with outturned +toes and moving noiselessly in his bast shoes over the roots and wet +leaves, silently led them to the edge of the forest. + +He ascended an incline, stopped, looked about him, and advanced to +where the screen of trees was less dense. On reaching a large oak tree +that had not yet shed its leaves, he stopped and beckoned mysteriously +to them with his hand. + +Denisov and Petya rode up to him. From the spot where the peasant +was standing they could see the French. Immediately beyond the forest, +on a downward slope, lay a field of spring rye. To the right, beyond a +steep ravine, was a small village and a landowner's house with a +broken roof. In the village, in the house, in the garden, by the well, +by the pond, over all the rising ground, and all along the road uphill +from the bridge leading to the village, not more than five hundred +yards away, crowds of men could be seen through the shimmering mist. +Their un-Russian shouting at their horses which were straining +uphill with the carts, and their calls to one another, could be +clearly heard. + +"Bwing the prisoner here," said Denisov in a low voice, not taking +his eyes off the French. + +A Cossack dismounted, lifted the boy down, and took him to +Denisov. Pointing to the French troops, Denisov asked him what these +and those of them were. The boy, thrusting his cold hands into his +pockets and lifting his eyebrows, looked at Denisov in affright, but +in spite of an evident desire to say all he knew gave confused +answers, merely assenting to everything Denisov asked him. Denisov +turned away from him frowning and addressed the esaul, conveying his +own conjectures to him. + +Petya, rapidly turning his head, looked now at the drummer boy, +now at Denisov, now at the esaul, and now at the French in the village +and along the road, trying not to miss anything of importance. + +"Whether Dolokhov comes or not, we must seize it, eh?" said +Denisov with a merry sparkle in his eyes. + +"It is a very suitable spot," said the esaul. + +"We'll send the infantwy down by the swamps," Denisov continued. +"They'll cweep up to the garden; you'll wide up fwom there with the +Cossacks"--he pointed to a spot in the forest beyond the village--"and +I with my hussars fwom here. And at the signal shot..." + +"The hollow is impassable--there's a swamp there," said the esaul. +"The horses would sink. We must ride round more to the left...." + +While they were talking in undertones the crack of a shot sounded +from the low ground by the pond, a puff of white smoke appeared, +then another, and the sound of hundreds of seemingly merry French +voices shouting together came up from the slope. For a moment +Denisov and the esaul drew back. They were so near that they thought +they were the cause of the firing and shouting. But the firing and +shouting did not relate to them. Down below, a man wearing something +red was running through the marsh. The French were evidently firing +and shouting at him. + +"Why, that's our Tikhon," said the esaul. + +"So it is! It is!" + +"The wascal!" said Denisov. + +"He'll get away!" said the esaul, screwing up his eyes. + +The man whom they called Tikhon, having run to the stream, plunged +in so that the water splashed in the air, and, having disappeared +for an instant, scrambled out on all fours, all black with the wet, +and ran on. The French who had been pursuing him stopped. + +"Smart, that!" said the esaul. + +"What a beast!" said Denisov with his former look of vexation. "What +has he been doing all this time?" + +"Who is he?" asked Petya. + +"He's our plastun. I sent him to capture a 'tongue.'" + +"Oh, yes," said Petya, nodding at the first words Denisov uttered as +if he understood it all, though he really did not understand +anything of it. + +Tikhon Shcherbaty was one of the most indispensable men in their +band. He was a peasant from Pokrovsk, near the river Gzhat. When +Denisov had come to Pokrovsk at the beginning of his operations and +had as usual summoned the village elder and asked him what he knew +about the French, the elder, as though shielding himself, had replied, +as all village elders did, that he had neither seen nor heard anything +of them. But when Denisov explained that his purpose was to kill the +French, and asked if no French had strayed that way, the elder replied +that some "more-orderers" had really been at their village, but that +Tikhon Shcherbaty was the only man who dealt with such matters. +Denisov had Tikhon called and, having praised him for his activity, +said a few words in the elder's presence about loyalty to the Tsar and +the country and the hatred of the French that all sons of the +fatherland should cherish. + +"We don't do the French any harm," said Tikhon, evidently frightened +by Denisov's words. "We only fooled about with the lads for fun, you +know! We killed a score or so of 'more-orderers,' but we did no harm +else..." + +Next day when Denisov had left Pokrovsk, having quite forgotten +about this peasant, it was reported to him that Tikhon had attached +himself to their party and asked to be allowed to remain with it. +Denisov gave orders to let him do so. + +Tikhon, who at first did rough work, laying campfires, fetching +water, flaying dead horses, and so on, soon showed a great liking +and aptitude for partisan warfare. At night he would go out for +booty and always brought back French clothing and weapons, and when +told to would bring in French captives also. Denisov then relieved him +from drudgery and began taking him with him when he went out on +expeditions and had him enrolled among the Cossacks. + +Tikhon did not like riding, and always went on foot, never lagging +behind the cavalry. He was armed with a musketoon (which he carried +rather as a joke), a pike and an ax, which latter he used as a wolf +uses its teeth, with equal case picking fleas out of its fur or +crunching thick bones. Tikhon with equal accuracy would split logs +with blows at arm's length, or holding the head of the ax would cut +thin little pegs or carve spoons. In Denisov's party he held a +peculiar and exceptional position. When anything particularly +difficult or nasty had to be done--to push a cart out of the mud +with one's shoulders, pull a horse out of a swamp by its tail, skin +it, slink in among the French, or walk more than thirty miles in a +day--everybody pointed laughingly at Tikhon. + +"It won't hurt that devil--he's as strong as a horse!" they said +of him. + +Once a Frenchman Tikhon was trying to capture fired a pistol at +him and shot him in the fleshy part of the back. That wound (which +Tikhon treated only with internal and external applications of +vodka) was the subject of the liveliest jokes by the whole detachment- +jokes in which Tikhon readily joined. + +"Hallo, mate! Never again? Gave you a twist?" the Cossacks would +banter him. And Tikhon, purposely writhing and making faces, pretended +to be angry and swore at the French with the funniest curses. The only +effect of this incident on Tikhon was that after being wounded he +seldom brought in prisoners. + +He was the bravest and most useful man in the party. No one found +more opportunities for attacking, no one captured or killed more +Frenchmen, and consequently he was made the buffoon of all the +Cossacks and hussars and willingly accepted that role. Now he had been +sent by Denisov overnight to Shamshevo to capture a "tongue." But +whether because he had not been content to take only one Frenchman +or because he had slept through the night, he had crept by day into +some bushes right among the French and, as Denisov had witnessed +from above, had been detected by them. + + + + + +CHAPTER VI + + +After talking for some time with the esaul about next day's +attack, which now, seeing how near they were to the French, he +seemed to have definitely decided on, Denisov turned his horse and +rode back. + +"Now, my lad, we'll go and get dwy," he said to Petya. + +As they approached the watchhouse Denisov stopped, peering into +the forest. Among the trees a man with long legs and long, swinging +arms, wearing a short jacket, bast shoes, and a Kazan hat, was +approaching with long, light steps. He had a musketoon over his +shoulder and an ax stuck in his girdle. When he espied Denisov he +hastily threw something into the bushes, removed his sodden hat by its +floppy brim, and approached his commander. It was Tikhon. His wrinkled +and pockmarked face and narrow little eyes beamed with +self-satisfied merriment. He lifted his head high and gazed at Denisov +as if repressing a laugh. + +"Well, where did you disappear to?" inquired Denisov. + +"Where did I disappear to? I went to get Frenchmen," answered Tikhon +boldly and hurriedly, in a husky but melodious bass voice. + +"Why did you push yourself in there by daylight? You ass! Well, +why haven't you taken one?" + +"Oh, I took one all right," said Tikhon. + +"Where is he?" + +"You see, I took him first thing at dawn," Tikhon continued, +spreading out his flat feet with outturned toes in their bast shoes. +"I took him into the forest. Then I see he's no good and think I'll go +and fetch a likelier one." + +"You see?... What a wogue--it's just as I thought," said Denisov +to the esaul. "Why didn't you bwing that one?" + +"What was the good of bringing him?" Tikhon interrupted hastily +and angrily--"that one wouldn't have done for you. As if I don't +know what sort you want!" + +"What a bwute you are!... Well?" + +"I went for another one," Tikhon continued, "and I crept like this +through the wood and lay down." (He suddenly lay down on his stomach +with a supple movement to show how he had done it.) "One turned up and +I grabbed him, like this." (He jumped up quickly and lightly.) +"'Come along to the colonel,' I said. He starts yelling, and +suddenly there were four of them. They rushed at me with their +little swords. So I went for them with my ax, this way: 'What are +you up to?' says I. 'Christ be with you!'" shouted Tikhon, waving +his arms with an angry scowl and throwing out his chest. + +"Yes, we saw from the hill how you took to your heels through the +puddles!" said the esaul, screwing up his glittering eyes. + +Petya badly wanted to laugh, but noticed that they all refrained +from laughing. He turned his eyes rapidly from Tikhon's face to the +esaul's and Denisov's, unable to make out what it all meant. + +"Don't play the fool!" said Denisov, coughing angrily. "Why didn't +you bwing the first one?" + +Tikhon scratched his back with one hand and his head with the other, +then suddenly his whole face expanded into a beaming, foolish grin, +disclosing a gap where he had lost a tooth (that was why he was called +Shcherbaty--the gap-toothed). Denisov smiled, and Petya burst into a +peal of merry laughter in which Tikhon himself joined. + +"Oh, but he was a regular good-for-nothing," said Tikhon. "The +clothes on him--poor stuff! How could I bring him? And so rude, your +honor! Why, he says: 'I'm a general's son myself, I won't go!' he +says." + +"You are a bwute!" said Denisov. "I wanted to question..." + +"But I questioned him," said Tikhon. "He said he didn't know much. +'There are a lot of us,' he says, 'but all poor stuff--only soldiers +in name,' he says. 'Shout loud at them,' he says, 'and you'll take +them all,'" Tikhon concluded, looking cheerfully and resolutely into +Denisov's eyes. + +"I'll give you a hundwed sharp lashes--that'll teach you to play the +fool!" said Denisov severely. + +"But why are you angry?" remonstrated Tikhon, "just as if I'd +never seen your Frenchmen! Only wait till it gets dark and I'll +fetch you any of them you want--three if you like." + +"Well, let's go," said Denisov, and rode all the way to the +watchhouse in silence and frowning angrily. + +Tikhon followed behind and Petya heard the Cossacks laughing with +him and at him, about some pair of boots he had thrown into the +bushes. + +When the fit of laughter that had seized him at Tikhon's words and +smile had passed and Petya realized for a moment that this Tikhon +had killed a man, he felt uneasy. He looked round at the captive +drummer boy and felt a pang in his heart. But this uneasiness lasted +only a moment. He felt it necessary to hold his head higher, to +brace himself, and to question the esaul with an air of importance +about tomorrow's undertaking, that he might not be unworthy of the +company in which he found himself. + +The officer who had been sent to inquire met Denisov on the way with +the news that Dolokhov was soon coming and that all was well with him. + +Denisov at once cheered up and, calling Petya to him, said: "Well, +tell me about yourself." + + + + + +CHAPTER VII + + +Petya, having left his people after their departure from Moscow, +joined his regiment and was soon taken as orderly by a general +commanding a large guerrilla detachment. From the time he received his +commission, and especially since he had joined the active army and +taken part in the battle of Vyazma, Petya had been in a constant state +of blissful excitement at being grown-up and in a perpetual ecstatic +hurry not to miss any chance to do something really heroic. He was +highly delighted with what he saw and experienced in the army, but +at the same time it always seemed to him that the really heroic +exploits were being performed just where he did not happen to be. +And he was always in a hurry to get where he was not. + +When on the twenty-first of October his general expressed a wish +to send somebody to Denisov's detachment, Petya begged so piteously to +be sent that the general could not refuse. But when dispatching him he +recalled Petya's mad action at the battle of Vyazma, where instead +of riding by the road to the place to which he had been sent, he had +galloped to the advanced line under the fire of the French and had +there twice fired his pistol. So now the general explicitly forbade +his taking part in any action whatever of Denisov's. That was why +Petya had blushed and grown confused when Denisov asked him whether he +could stay. Before they had ridden to the outskirts of the forest +Petya had considered he must carry out his instructions strictly and +return at once. But when he saw the French and saw Tikhon and +learned that there would certainly be an attack that night, he +decided, with the rapidity with which young people change their views, +that the general, whom he had greatly respected till then, was a +rubbishy German, that Denisov was a hero, the esaul a hero, and Tikhon +a hero too, and that it would be shameful for him to leave them at a +moment of difficulty. + +It was already growing dusk when Denisov, Petya, and the esaul +rode up to the watchhouse. In the twilight saddled horses could be +seen, and Cossacks and hussars who had rigged up rough shelters in the +glade and were kindling glowing fires in a hollow of the forest +where the French could not see the smoke. In the passage of the +small watchhouse a Cossack with sleeves rolled up was chopping some +mutton. In the room three officers of Denisov's band were converting a +door into a tabletop. Petya took off his wet clothes, gave them to +be dried, and at once began helping the officers to fix up the +dinner table. + +In ten minutes the table was ready and a napkin spread on it. On the +table were vodka, a flask of rum, white bread, roast mutton, and salt. + +Sitting at table with the officers and tearing the fat savory mutton +with his hands, down which the grease trickled, Petya was in an +ecstatic childish state of love for all men, and consequently of +confidence that others loved him in the same way. + +"So then what do you think, Vasili Dmitrich?" said he to Denisov. +"It's all right my staying a day with you?" And not waiting for a +reply he answered his own question: "You see I was told to find out- +well, I am finding out.... Only do let me into the very... into the +chief... I don't want a reward... But I want..." + +Petya clenched his teeth and looked around, throwing back his head +and flourishing his arms. + +"Into the vewy chief..." Denisov repeated with a smile. + +"Only, please let me command something, so that I may really +command..." Petya went on. "What would it be to you?... Oh, you want a +knife?" he said, turning to an officer who wished to cut himself a +piece of mutton. + +And he handed him his clasp knife. The officer admired it. + +"Please keep it. I have several like it," said Petya, blushing. +"Heavens! I was quite forgetting!" he suddenly cried. "I have some +raisins, fine ones; you know, seedless ones. We have a new sutler +and he has such capital things. I bought ten pounds. I am used to +something sweet. Would you like some?..." and Petya ran out into the +passage to his Cossack and brought back some bags which contained +about five pounds of raisins. "Have some, gentlemen, have some!" + +"You want a coffeepot, don't you?" he asked the esaul. "I bought a +capital one from our sutler! He has splendid things. And he's very +honest, that's the chief thing. I'll be sure to send it to you. Or +perhaps your flints are giving out, or are worn out--that happens +sometimes, you know. I have brought some with me, here they are"- +and he showed a bag--"a hundred flints. I bought them very cheap. +Please take as many as you want, or all if you like...." + +Then suddenly, dismayed lest he had said too much, Petya stopped and +blushed. + +He tried to remember whether he had not done anything else that +was foolish. And running over the events of the day he remembered +the French drummer boy. "It's capital for us here, but what of him? +Where have they put him? Have they fed him? Haven't they hurt his +feelings?" he thought. But having caught himself saying too much about +the flints, he was now afraid to speak out. + +"I might ask," he thought, "but they'll say: 'He's a boy himself and +so he pities the boy.' I'll show them tomorrow whether I'm a boy. Will +it seem odd if I ask?" Petya thought. "Well, never mind!" and +immediately, blushing and looking anxiously at the officers to see +if they appeared ironical, he said: + +"May I call in that boy who was taken prisoner and give him +something to eat?... Perhaps..." + +"Yes, he's a poor little fellow," said Denisov, who evidently saw +nothing shameful in this reminder. "Call him in. His name is Vincent +Bosse. Have him fetched." + +"I'll call him," said Petya. + +"Yes, yes, call him. A poor little fellow," Denisov repeated. + +Petya was standing at the door when Denisov said this. He slipped in +between the officers, came close to Denisov, and said: + +"Let me kiss you, dear old fellow! Oh, how fine, how splendid!" + +And having kissed Denisov he ran out of the hut. + +"Bosse! Vincent!" Petya cried, stopping outside the door. + +"Who do you want, sir?" asked a voice in the darkness. + +Petya replied that he wanted the French lad who had been captured +that day. + +"Ah, Vesenny?" said a Cossack. + +Vincent, the boy's name, had already been changed by the Cossacks +into Vesenny (vernal) and into Vesenya by the peasants and soldiers. +In both these adaptations the reference to spring (vesna) matched +the impression made by the young lad. + +"He is warming himself there by the bonfire. Ho, Vesenya! +Vesenya!--Vesenny!" laughing voices were heard calling to one +another in the darkness. + +"He's a smart lad," said an hussar standing near Petya. "We gave him +something to eat a while ago. He was awfully hungry!" + +The sound of bare feet splashing through the mud was heard in the +darkness, and the drummer boy came to the door. + +"Ah, c'est vous!" said Petya. "Voulez-vous manger? N'ayez pas +peur, on ne vous fera pas de mal,"* he added shyly and affectionately, +touching the boy's hand. "Entrez, entrez."*[2] + + +*"Ah, it's you! Do you want something to eat? Don't be afraid, +they won't hurt you." + +*[2] "Come in, come in." + + +"Merci, monsieur,"* said the drummer boy in a trembling almost +childish voice, and he began scraping his dirty feet on the threshold. + + +*"Thank you, sir." + + +There were many things Petya wanted to say to the drummer boy, but +did not dare to. He stood irresolutely beside him in the passage. Then +in the darkness he took the boy's hand and pressed it. + +"Come in, come in!" he repeated in a gentle whisper. "Oh, what can I +do for him?" he thought, and opening the door he let the boy pass in +first. + +When the boy had entered the hut, Petya sat down at a distance +from him, considering it beneath his dignity to pay attention to +him. But he fingered the money in his pocket and wondered whether it +would seem ridiculous to give some to the drummer boy. + + + + + +CHAPTER VIII + + +The arrival of Dolokhov diverted Petya's attention from the +drummer boy, to whom Denisov had had some mutton and vodka given, +and whom he had had dressed in a Russian coat so that he might be kept +with their band and not sent away with the other prisoners. Petya +had heard in the army many stories of Dolokhov's extraordinary bravery +and of his cruelty to the French, so from the moment he entered the +hut Petya did not take his eyes from him, but braced himself up more +and more and held his head high, that he might not be unworthy even of +such company. + +Dolokhov's appearance amazed Petya by its simplicity. + +Denisov wore a Cossack coat, had a beard, had an icon of Nicholas +the Wonder-Worker on his breast, and his way of speaking and +everything he did indicated his unusual position. But Dolokhov, who in +Moscow had worn a Persian costume, had now the appearance of a most +correct officer of the Guards. He was clean-shaven and wore a +Guardsman's padded coat with an Order of St. George at his +buttonhole and a plain forage cap set straight on his head. He took +off his wet felt cloak in a corner of the room, and without greeting +anyone went up to Denisov and began questioning him about the matter +in hand. Denisov told him of the designs the large detachments had +on the transport, of the message Petya had brought, and his own +replies to both generals. Then he told him all he knew of the French +detachment. + +"That's so. But we must know what troops they are and their +numbers," said Dolokhov. "It will be necessary to go there. We can't +start the affair without knowing for certain how many there are. I +like to work accurately. Here now--wouldn't one of these gentlemen +like to ride over to the French camp with me? I have brought a spare +uniform." + +"I, I... I'll go with you!" cried Petya. + +"There's no need for you to go at all," said Denisov, addressing +Dolokhov, "and as for him, I won't let him go on any account." + +"I like that!" exclaimed Petya. "Why shouldn't I go?" + +"Because it's useless." + +"Well, you must excuse me, because... because... I shall go, and +that's all. You'll take me, won't you?" he said, turning to Dolokhov. + +"Why not?" Dolokhov answered absently, scrutinizing the face of +the French drummer boy. "Have you had that youngster with you long?" +he asked Denisov. + +"He was taken today but he knows nothing. I'm keeping him with me." + +"Yes, and where do you put the others?" inquired Dolokhov. + +"Where? I send them away and take a weceipt for them," shouted +Denisov, suddenly flushing. "And I say boldly that I have not a single +man's life on my conscience. Would it be difficult for you to send +thirty or thwee hundwed men to town under escort, instead of staining- +I speak bluntly--staining the honor of a soldier?" + +"That kind of amiable talk would be suitable from this young count +of sixteen," said Dolokhov with cold irony, "but it's time for you +to drop it." + +"Why, I've not said anything! I only say that I'll certainly go with +you," said Petya shyly. + +"But for you and me, old fellow, it's time to drop these amenities," +continued Dolokhov, as if he found particular pleasure in speaking +of this subject which irritated Denisov. "Now, why have you kept +this lad?" he went on, swaying his head. "Because you are sorry for +him! Don't we know those 'receipts' of yours? You send a hundred men +away, and thirty get there. The rest either starve or get killed. So +isn't it all the same not to send them?" + +The esaul, screwing up his light-colored eyes, nodded approvingly. + +"That's not the point. I'm not going to discuss the matter. I do not +wish to take it on my conscience. You say they'll die. All wight. Only +not by my fault!" + +Dolokhov began laughing. + +"Who has told them not to capture me these twenty times over? But if +they did catch me they'd string me up to an aspen tree, and with all +your chivalry just the same." He paused. "However, we must get to +work. Tell the Cossack to fetch my kit. I have two French uniforms +in it. Well, are you coming with me?" he asked Petya. + +"I? Yes, yes, certainly!" cried Petya, blushing almost to tears +and glancing at Denisov. + +While Dolokhov had been disputing with Denisov what should be done +with prisoners, Petya had once more felt awkward and restless; but +again he had no time to grasp fully what they were talking about. +"If grown-up, distinguished men think so, it must be necessary and +right," thought he. "But above all Denisov must not dare to imagine +that I'll obey him and that he can order me about. I will certainly go +to the French camp with Dolokhov. If he can, so can I!" + +And to all Denisov's persuasions, Petya replied that he too was +accustomed to do everything accurately and not just anyhow, and that +he never considered personal danger. + +"For you'll admit that if we don't know for sure how many of them +there are... hundreds of lives may depend on it, while there are +only two of us. Besides, I want to go very much and certainly will go, +so don't hinder me," said he. "It will only make things worse..." + + + + + +CHAPTER IX + + +Having put on French greatcoats and shakos, Petya and Dolokhov +rode to the clearing from which Denisov had reconnoitered the French +camp, and emerging from the forest in pitch darkness they descended +into the hollow. On reaching the bottom, Dolokhov told the Cossacks +accompanying him to await him there and rode on at a quick trot +along the road to the bridge. Petya, his heart in his mouth with +excitement, rode by his side. + +"If we're caught, I won't be taken alive! I have a pistol," +whispered he. + +"Don't talk Russian," said Dolokhov in a hurried whisper, and at +that very moment they heard through the darkness the challenge: "Qui +vive?"* and the click of a musket. + + +*"Who goes there?" + + +The blood rushed to Petya's face and he grasped his pistol. + +"Lanciers du 6-me,"* replied Dolokhov, neither hastening nor +slackening his horse's pace. + + +*"Lancers of the 6th Regiment." + + +The black figure of a sentinel stood on the bridge. + +"Mot d'ordre."* + + +*"Password." + + +Dolokhov reined in his horse and advanced at a walk. + +"Dites donc, le colonel Gerard est ici?"* he asked. + + +*"Tell me, is Colonel Gerard here?" + + +"Mot d'ordre," repeated the sentinel, barring the way and not +replying. + +"Quand un officier fait sa ronde, les sentinelles ne demandent pas +le mot d'ordre..." cried Dolokhov suddenly flaring up and riding +straight at the sentinel. "Je vous demande si le colonel est ici."* + + +*"When an officer is making his round, sentinels don't ask him for +the password.... I am asking you if the colonel is here." + + +And without waiting for an answer from the sentinel, who had stepped +aside, Dolokhov rode up the incline at a walk. + +Noticing the black outline of a man crossing the road, Dolokhov +stopped him and inquired where the commander and officers were. The +man, a soldier with a sack over his shoulder, stopped, came close up +to Dolokhov's horse, touched it with his hand, and explained simply +and in a friendly way that the commander and the officers were +higher up the hill to the right in the courtyard of the farm, as he +called the landowner's house. + +Having ridden up the road, on both sides of which French talk +could be heard around the campfires, Dolokhov turned into the +courtyard of the landowner's house. Having ridden in, he dismounted +and approached a big blazing campfire, around which sat several men +talking noisily. Something was boiling in a small cauldron at the edge +of the fire and a soldier in a peaked cap and blue overcoat, lit up by +the fire, was kneeling beside it stirring its contents with a ramrod. + +"Oh, he's a hard nut to crack," said one of the officers who was +sitting in the shadow at the other side of the fire. + +"He'll make them get a move on, those fellows!" said another, +laughing. + +Both fell silent, peering out through the darkness at the sound of +Dolokhov's and Petya's steps as they advanced to the fire leading +their horses. + +"Bonjour, messieurs!"* said Dolokhov loudly and clearly. + + +*"Good day, gentlemen." + + +There was a stir among the officers in the shadow beyond the fire, +and one tall, long-necked officer, walking round the fire, came up +to Dolokhov. + +"Is that you, Clement?" he asked. "Where the devil...?" But, noticing +his mistake, he broke off short and, with a frown, greeted Dolokhov as +a stranger, asking what he could do for him. + +Dolokhov said that he and his companion were trying to overtake +their regiment, and addressing the company in general asked whether +they knew anything of the 6th Regiment. None of them knew anything, +and Petya thought the officers were beginning to look at him and +Dolokhov with hostility and suspicion. For some seconds all were +silent. + +"If you were counting on the evening soup, you have come too +late," said a voice from behind the fire with a repressed laugh. + +Dolokhov replied that they were not hungry and must push on +farther that night. + +He handed the horses over to the soldier who was stirring the pot +and squatted down on his heels by the fire beside the officer with the +long neck. That officer did not take his eyes from Dolokhov and +again asked to what regiment he belonged. Dolokhov, as if he had not +heard the question, did not reply, but lighting a short French pipe +which he took from his pocket began asking the officer in how far +the road before them was safe from Cossacks. + +"Those brigands are everywhere," replied an officer from behind +the fire. + +Dolokhov remarked that the Cossacks were a danger only to stragglers +such as his companion and himself, "but probably they would not dare +to attack large detachments?" he added inquiringly. No one replied. + +"Well, now he'll come away," Petya thought every moment as he +stood by the campfire listening to the talk. + +But Dolokhov restarted the conversation which had dropped and +began putting direct questions as to how many men there were in the +battalion, how many battalions, and how many prisoners. Asking about +the Russian prisoners with that detachment, Dolokhov said: + +"A horrid business dragging these corpses about with one! It would +be better to shoot such rabble," and burst into loud laughter, so +strange that Petya thought the French would immediately detect their +disguise, and involuntarily took a step back from the campfire. + +No one replied a word to Dolokhov's laughter, and a French officer +whom they could not see (he lay wrapped in a greatcoat) rose and +whispered something to a companion. Dolokhov got up and called to +the soldier who was holding their horses. + +"Will they bring our horses or not?" thought Petya, instinctively +drawing nearer to Dolokhov. + +The horses were brought. + +"Good evening, gentlemen," said Dolokhov. + +Petya wished to say "Good night" but could not utter a word. The +officers were whispering together. Dolokhov was a long time mounting +his horse which would not stand still, then he rode out of the yard at +a footpace. Petya rode beside him, longing to look round to see +whether or no the French were running after them, but not daring to. + +Coming out onto the road Dolokhov did not ride back across the +open country, but through the village. At one spot he stopped and +listened. "Do you hear?" he asked. Petya recognized the sound of +Russian voices and saw the dark figures of Russian prisoners round +their campfires. When they had descended to the bridge Petya and +Dolokhov rode past the sentinel, who without saying a word paced +morosely up and down it, then they descended into the hollow where the +Cossacks awaited them. + +"Well now, good-by. Tell Denisov, 'at the first shot at +daybreak,'" said Dolokhov and was about to ride away, but Petya seized +hold of him. + +"Really!" he cried, "you are such a hero! Oh, how fine, how +splendid! How I love you!" + +"All right, all right!" said Dolokhov. But Petya did not let go of +him and Dolokhov saw through the gloom that Petya was bending toward +him and wanted to kiss him. Dolokhov kissed him, laughed, turned his +horse, and vanished into the darkness. + + + + + +CHAPTER X + + +Having returned to the watchman's hut, Petya found Denisov in the +passage. He was awaiting Petya's return in a state of agitation, +anxiety, and self-reproach for having let him go. + +"Thank God!" he exclaimed. "Yes, thank God!" he repeated, +listening to Petya's rapturous account. "But, devil take you, I +haven't slept because of you! Well, thank God. Now lie down. We can +still get a nap before morning." + +"But... no," said Petya, "I don't want to sleep yet. Besides I +know myself, if I fall asleep it's finished. And then I am used to not +sleeping before a battle." + +He sat awhile in the hut joyfully recalling the details of his +expedition and vividly picturing to himself what would happen next +day. + +Then, noticing that Denisov was asleep, he rose and went out of +doors. + +It was still quite dark outside. The rain was over, but drops were +still falling from the trees. Near the watchman's hut the black shapes +of the Cossacks' shanties and of horses tethered together could be +seen. Behind the hut the dark shapes of the two wagons with their +horses beside them were discernible, and in the hollow the dying +campfire gleamed red. Not all the Cossacks and hussars were asleep; +here and there, amid the sounds of falling drops and the munching of +the horses near by, could be heard low voices which seemed to be +whispering. + +Petya came out, peered into the darkness, and went up to the wagons. +Someone was snoring under them, and around them stood saddled horses +munching their oats. In the dark Petya recognized his own horse, which +he called "Karabakh" though it was of Ukranian breed, and went up to +it. + +"Well, Karabakh! We'll do some service tomorrow," said he, +sniffing its nostrils and kissing it. + +"Why aren't you asleep, sir?" said a Cossack who was sitting under a +wagon. + +"No, ah... Likhachev--isn't that your name? Do you know I have +only just come back! We've been into the French camp." + +And Petya gave the Cossack a detailed account not only of his ride +but also of his object, and why he considered it better to risk his +life than to act "just anyhow." + +"Well, you should get some sleep now," said the Cossack. + +"No, I am used to this," said Petya. "I say, aren't the flints in +your pistols worn out? I brought some with me. Don't you want any? You +can have some." + + +The Cossack bent forward from under the wagon to get a closer look +at Petya. + +"Because I am accustomed to doing everything accurately," said +Petya. "Some fellows do things just anyhow, without preparation, and +then they're sorry for it afterwards. I don't like that." + +"Just so," said the Cossack. + +"Oh yes, another thing! Please, my dear fellow, will you sharpen +my saber for me? It's got bl..." (Petya feared to tell a lie, and +the saber never had been sharpened.) "Can you do it?" + +"Of course I can." + +Likhachev got up, rummaged in his pack, and soon Petya heard the +warlike sound of steel on whetstone. He climbed onto the wagon and sat +on its edge. The Cossack was sharpening the saber under the wagon. + +"I say! Are the lads asleep?" asked Petya. + +"Some are, and some aren't--like us." + +"Well, and that boy?" + +"Vesenny? Oh, he's thrown himself down there in the passage. Fast +asleep after his fright. He was that glad!" + +After that Petya remained silent for a long time, listening to the +sounds. He heard footsteps in the darkness and a black figure +appeared. + +"What are you sharpening?" asked a man coming up to the wagon. + +"Why, this gentleman's saber." + +"That's right," said the man, whom Petya took to be an hussar. +"Was the cup left here?" + +"There, by the wheel!" + +The hussar took the cup. + +"It must be daylight soon," said he, yawning, and went away. + +Petya ought to have known that he was in a forest with Denisov's +guerrilla band, less than a mile from the road, sitting on a wagon +captured from the French beside which horses were tethered, that under +it Likhachev was sitting sharpening a saber for him, that the big dark +blotch to the right was the watchman's hut, and the red blotch below +to the left was the dying embers of a campfire, that the man who had +come for the cup was an hussar who wanted a drink; but he neither knew +nor waited to know anything of all this. He was in a fairy kingdom +where nothing resembled reality. The big dark blotch might really be +the watchman's hut or it might be a cavern leading to the very +depths of the earth. Perhaps the red spot was a fire, or it might be +the eye of an enormous monster. Perhaps he was really sitting on a +wagon, but it might very well be that he was not sitting on a wagon +but on a terribly high tower from which, if he fell, he would have +to fall for a whole day or a whole month, or go on falling and never +reach the bottom. Perhaps it was just the Cossack, Likhachev, who +was sitting under the wagon, but it might be the kindest, bravest, +most wonderful, most splendid man in the world, whom no one knew of. +It might really have been that the hussar came for water and went back +into the hollow, but perhaps he had simply vanished--disappeared +altogether and dissolved into nothingness. + +Nothing Petya could have seen now would have surprised him. He was +in a fairy kingdom where everything was possible. + +He looked up at the sky. And the sky was a fairy realm like the +earth. It was clearing, and over the tops of the trees clouds were +swiftly sailing as if unveiling the stars. Sometimes it looked as if +the clouds were passing, and a clear black sky appeared. Sometimes +it seemed as if the black spaces were clouds. Sometimes the sky seemed +to be rising high, high overhead, and then it seemed to sink so low +that one could touch it with one's hand. + +Petya's eyes began to close and he swayed a little. + +The trees were dripping. Quiet talking was heard. The horses neighed +and jostled one another. Someone snored. + +"Ozheg-zheg, Ozheg-zheg..." hissed the saber against the +whetstone, and suddenly Petya heard an harmonious orchestra playing +some unknown, sweetly solemn hymn. Petya was as musical as Natasha and +more so than Nicholas, but had never learned music or thought about +it, and so the melody that unexpectedly came to his mind seemed to him +particularly fresh and attractive. The music became more and more +audible. The melody grew and passed from one instrument to another. +And what was played was a fugue--though Petya had not the least +conception of what a fugue is. Each instrument--now resembling a +violin and now a horn, but better and clearer than violin or horn- +played its own part, and before it had finished the melody merged with +another instrument that began almost the same air, and then with a +third and a fourth; and they all blended into one and again became +separate and again blended, now into solemn church music, now into +something dazzlingly brilliant and triumphant. + +"Oh--why, that was in a dream!" Petya said to himself, as he lurched +forward. "It's in my ears. But perhaps it's music of my own. Well, +go on, my music! Now!..." + +He closed his eyes, and, from all sides as if from a distance, +sounds fluttered, grew into harmonies, separated, blended, and again +all mingled into the same sweet and solemn hymn. "Oh, this is +delightful! As much as I like and as I like!" said Petya to himself. +He tried to conduct that enormous orchestra. + +"Now softly, softly die away!" and the sounds obeyed him. "Now +fuller, more joyful. Still more and more joyful!" And from an +unknown depth rose increasingly triumphant sounds. "Now voices join +in!" ordered Petya. And at first from afar he heard men's voices and +then women's. The voices grew in harmonious triumphant strength, and +Petya listened to their surpassing beauty in awe and joy. + +With a solemn triumphal march there mingled a song, the drip from +the trees, and the hissing of the saber, "Ozheg-zheg-zheg..." and +again the horses jostled one another and neighed, not disturbing the +choir but joining in it. + +Petya did not know how long this lasted: he enjoyed himself all +the time, wondered at his enjoyment and regretted that there was no +one to share it. He was awakened by Likhachev's kindly voice. + +"It's ready, your honor; you can split a Frenchman in half with it!" + +Petya woke up. + +"It's getting light, it's really getting light!" he exclaimed. + +The horses that had previously been invisible could now be seen to +their very tails, and a watery light showed itself through the bare +branches. Petya shook himself, jumped up, took a ruble from his pocket +and gave it to Likhachev; then he flourished the saber, tested it, and +sheathed it. The Cossacks were untying their horses and tightening +their saddle girths. + +"And here's the commander," said Likhachev. + +Denisov came out of the watchman's hut and, having called Petya, +gave orders to get ready. + + + + +CHAPTER XI + + +The men rapidly picked out their horses in the semidarkness, +tightened their saddle girths, and formed companies. Denisov stood +by the watchman's hut giving final orders. The infantry of the +detachment passed along the road and quickly disappeared amid the +trees in the mist of early dawn, hundreds of feet splashing through +the mud. The esaul gave some orders to his men. Petya held his horse +by the bridle, impatiently awaiting the order to mount. His face, +having been bathed in cold water, was all aglow, and his eyes were +particularly brilliant. Cold shivers ran down his spine and his +whole body pulsed rhythmically. + +"Well, is ev'wything weady?" asked Denisov. "Bwing the horses." + +The horses were brought. Denisov was angry with the Cossack +because the saddle girths were too slack, reproved him, and mounted. +Petya put his foot in the stirrup. His horse by habit made as if to +nip his leg, but Petya leaped quickly into the saddle unconscious of +his own weight and, turning to look at the hussars starting in the +darkness behind him, rode up to Denisov. + +"Vasili Dmitrich, entrust me with some commission! Please... for +God's sake...!" said he. + +Denisov seemed to have forgotten Petya's very existence. He turned +to glance at him. + +"I ask one thing of you," he said sternly, "to obey me and not shove +yourself forward anywhere." + +He did not say another word to Petya but rode in silence all the +way. When they had come to the edge of the forest it was noticeably +growing light over the field. Denisov talked in whispers with the +esaul and the Cossacks rode past Petya and Denisov. When they had +all ridden by, Denisov touched his horse and rode down the hill. +Slipping onto their haunches and sliding, the horses descended with +their riders into the ravine. Petya rode beside Denisov, the pulsation +of his body constantly increasing. It was getting lighter and lighter, +but the mist still hid distant objects. Having reached the valley, +Denisov looked back and nodded to a Cossack beside him. + +"The signal!" said he. + +The Cossack raised his arm and a shot rang out. In an instant the +tramp of horses galloping forward was heard, shouts came from +various sides, and then more shots. + +At the first sound of trampling hoofs and shouting, Petya lashed his +horse and loosening his rein galloped forward, not heeding Denisov who +shouted at him. It seemed to Petya that at the moment the shot was +fired it suddenly became as bright as noon. He galloped to the bridge. +Cossacks were galloping along the road in front of him. On the +bridge he collided with a Cossack who had fallen behind, but he +galloped on. In front of him soldiers, probably Frenchmen, were +running from right to left across the road. One of them fell in the +mud under his horse's feet. + +Cossacks were crowding about a hut, busy with something. From the +midst of that crowd terrible screams arose. Petya galloped up, and the +first thing he saw was the pale face and trembling jaw of a Frenchman, +clutching the handle of a lance that had been aimed at him. + +"Hurrah!... Lads!... ours!" shouted Petya, and giving rein to his +excited horse he galloped forward along the village street. + +He could hear shooting ahead of him. Cossacks, hussars, and ragged +Russian prisoners, who had come running from both sides of the road, +were shouting something loudly and incoherently. A gallant-looking +Frenchman, in a blue overcoat, capless, and with a frowning red +face, had been defending himself against the hussars. When Petya +galloped up the Frenchman had already fallen. "Too late again!" +flashed through Petya's mind and he galloped on to the place from +which the rapid firing could be heard. The shots came from the yard of +the landowner's house he had visited the night before with Dolokhov. +The French were making a stand there behind a wattle fence in a garden +thickly overgrown with bushes and were firing at the Cossacks who +crowded at the gateway. Through the smoke, as he approached the +gate, Petya saw Dolokhov, whose face was of a pale-greenish tint, +shouting to his men. "Go round! Wait for the infantry!" he exclaimed +as Petya rode up to him. + +"Wait?... Hurrah-ah-ah!" shouted Petya, and without pausing a moment +galloped to the place whence came the sounds of firing and where the +smoke was thickest. + +A volley was heard, and some bullets whistled past, while others +plashed against something. The Cossacks and Dolokhov galloped after +Petya into the gateway of the courtyard. In the dense wavering smoke +some of the French threw down their arms and ran out of the bushes +to meet the Cossacks, while others ran down the hill toward the +pond. Petya was galloping along the courtyard, but instead of +holding the reins he waved both his arms about rapidly and +strangely, slipping farther and farther to one side in his saddle. His +horse, having galloped up to a campfire that was smoldering in the +morning light, stopped suddenly, and Petya fell heavily on to the +wet ground. The Cossacks saw that his arms and legs jerked rapidly +though his head was quite motionless. A bullet had pierced his skull. + +After speaking to the senior French officer, who came out of the +house with a white handkerchief tied to his sword and announced that +they surrendered, Dolokhov dismounted and went up to Petya, who lay +motionless with outstretched arms. + +"Done for!" he said with a frown, and went to the gate to meet +Denisov who was riding toward him. + +"Killed?" cried Denisov, recognizing from a distance the +unmistakably lifeless attitude--very familiar to him--in which Petya's +body was lying. + +"Done for!" repeated Dolokhov as if the utterance of these words +afforded him pleasure, and he went quickly up to the prisoners, who +were surrounded by Cossacks who had hurried up. "We won't take +them!" he called out to Denisov. + +Denisov did not reply; he rode up to Petya, dismounted, and with +trembling hands turned toward himself the bloodstained, +mud-bespattered face which had already gone white. + +"I am used to something sweet. Raisins, fine ones... take them all!" +he recalled Petya's words. And the Cossacks looked round in surprise +at the sound, like the yelp of a dog, with which Denisov turned +away, walked to the wattle fence, and seized hold of it. + +Among the Russian prisoners rescued by Denisov and Dolokhov was +Pierre Bezukhov. + + + + + +CHAPTER XII + +During the whole of their march from Moscow no fresh orders had been +issued by the French authorities concerning the party of prisoners +among whom was Pierre. On the twenty-second of October that party +was no longer with the same troops and baggage trains with which it +had left Moscow. Half the wagons laden with hardtack that had traveled +the first stages with them had been captured by Cossacks, the other +half had gone on ahead. Not one of those dismounted cavalrymen who had +marched in front of the prisoners was left; they had all +disappeared. The artillery the prisoners had seen in front of them +during the first days was now replaced by Marshal Junot's enormous +baggage train, convoyed by Westphalians. Behind the prisoners came a +cavalry baggage train. + +From Vyazma onwards the French army, which had till then moved in +three columns, went on as a single group. The symptoms of disorder +that Pierre had noticed at their first halting place after leaving +Moscow had now reached the utmost limit. + +The road along which they moved was bordered on both sides by dead +horses; ragged men who had fallen behind from various regiments +continually changed about, now joining the moving column, now again +lagging behind it. + +Several times during the march false alarms had been given and the +soldiers of the escort had raised their muskets, fired, and run +headlong, crushing one another, but had afterwards reassembled and +abused each other for their causeless panic. + +These three groups traveling together--the cavalry stores, the +convoy of prisoners, and Junot's baggage train--still constituted a +separate and united whole, though each of the groups was rapidly +melting away. + +Of the artillery baggage train which had consisted of a hundred +and twenty wagons, not more than sixty now remained; the rest had been +captured or left behind. Some of Junot's wagons also had been captured +or abandoned. Three wagons had been raided and robbed by stragglers +from Davout's corps. From the talk of the Germans Pierre learned +that a larger guard had been allotted to that baggage train than to +the prisoners, and that one of their comrades, a German soldier, had +been shot by the marshal's own order because a silver spoon +belonging to the marshal had been found in his possession. + +The group of prisoners had melted away most of all. Of the three +hundred and thirty men who had set out from Moscow fewer than a +hundred now remained. The prisoners were more burdensome to the escort +than even the cavalry saddles or Junot's baggage. They understood that +the saddles and Junot's spoon might be of some use, but that cold +and hungry soldiers should have to stand and guard equally cold and +hungry Russians who froze and lagged behind on the road (in which case +the order was to shoot them) was not merely incomprehensible but +revolting. And the escort, as if afraid, in the grievous condition +they themselves were in, of giving way to the pity they felt for the +prisoners and so rendering their own plight still worse, treated +them with particular moroseness and severity. + +At Dorogobuzh while the soldiers of the convoy, after locking the +prisoners in a stable, had gone off to pillage their own stores, +several of the soldier prisoners tunneled under the wall and ran away, +but were recaptured by the French and shot. + +The arrangement adopted when they started, that the officer +prisoners should be kept separate from the rest, had long since been +abandoned. All who could walk went together, and after the third stage +Pierre had rejoined Karataev and the gray-blue bandy-legged dog that +had chosen Karataev for its master. + +On the third day after leaving Moscow Karataev again fell ill with +the fever he had suffered from in the hospital in Moscow, and as he +grew gradually weaker Pierre kept away from him. Pierre did not know +why, but since Karataev had begun to grow weaker it had cost him an +effort to go near him. When he did so and heard the subdued moaning +with which Karataev generally lay down at the halting places, and when +he smelled the odor emanating from him which was now stronger than +before, Pierre moved farther away and did not think about him. + +While imprisoned in the shed Pierre had learned not with his +intellect but with his whole being, by life itself, that man is +created for happiness, that happiness is within him, in the +satisfaction of simple human needs, and that all unhappiness arises +not from privation but from superfluity. And now during these last +three weeks of the march he had learned still another new, consolatory +truth--that nothing in this world is terrible. He had learned that +as there is no condition in which man can be happy and entirely +free, so there is no condition in which he need be unhappy and lack +freedom. He learned that suffering and freedom have their limits and +that those limits are very near together; that the person in a bed +of roses with one crumpled petal suffered as keenly as he now, +sleeping on the bare damp earth with one side growing chilled while +the other was warming; and that when he had put on tight dancing shoes +he had suffered just as he did now when he walked with bare feet +that were covered with sores--his footgear having long since fallen to +pieces. He discovered that when he had married his wife--of his own +free will as it had seemed to him--he had been no more free than now +when they locked him up at night in a stable. Of all that he himself +subsequently termed his sufferings, but which at the time he +scarcely felt, the worst was the state of his bare, raw, and +scab-covered feet. (The horseflesh was appetizing and nourishing, +the saltpeter flavor of the gunpowder they used instead of salt was +even pleasant; there was no great cold, it was always warm walking +in the daytime, and at night there were the campfires; the lice that +devoured him warmed his body.) The one thing that was at first hard to +bear was his feet. + +After the second day's march Pierre, having examined his feet by the +campfire, thought it would be impossible to walk on them; but when +everybody got up he went along, limping, and, when he had warmed up, +walked without feeling the pain, though at night his feet were more +terrible to look at than before. However, he did not look at them now, +but thought of other things. + +Only now did Pierre realize the full strength of life in man and the +saving power he has of transferring his attention from one thing to +another, which is like the safety valve of a boiler that allows +superfluous steam to blow off when the pressure exceeds a certain +limit. + +He did not see and did not hear how they shot the prisoners who +lagged behind, though more than a hundred perished in that way. He did +not think of Karataev who grew weaker every day and evidently would +soon have to share that fate. Still less did Pierre think about +himself. The harder his position became and the more terrible the +future, the more independent of that position in which he found +himself were the joyful and comforting thoughts, memories, and +imaginings that came to him. + + + + + +CHAPTER XIII + + +At midday on the twenty-second of October Pierre was going uphill +along the muddy, slippery road, looking at his feet and at the +roughness of the way. Occasionally he glanced at the familiar crowd +around him and then again at his feet. The former and the latter +were alike familiar and his own. The blue-gray bandy legged dog ran +merrily along the side of the road, sometimes in proof of its +agility and self-satisfaction lifting one hind leg and hopping along +on three, and then again going on all four and rushing to bark at +the crows that sat on the carrion. The dog was merrier and sleeker +than it had been in Moscow. All around lay the flesh of different +animals--from men to horses--in various stages of decomposition; and +as the wolves were kept off by the passing men the dog could eat all +it wanted. + +It had been raining since morning and had seemed as if at any moment +it might cease and the sky clear, but after a short break it began +raining harder than before. The saturated road no longer absorbed +the water, which ran along the ruts in streams. + +Pierre walked along, looking from side to side, counting his steps +in threes, and reckoning them off on his fingers. Mentally +addressing the rain, he repeated: "Now then, now then, go on! Pelt +harder!" + +It seemed to him that he was thinking of nothing, but far down and +deep within him his soul was occupied with something important and +comforting. This something was a most subtle spiritual deduction +from a conversation with Karataev the day before. + +At their yesterday's halting place, feeling chilly by a dying +campfire, Pierre had got up and gone to the next one, which was +burning better. There Platon Karataev was sitting covered up--head and +all--with his greatcoat as if it were a vestment, telling the soldiers +in his effective and pleasant though now feeble voice a story Pierre +knew. It was already past midnight, the hour when Karataev was usually +free of his fever and particularly lively. When Pierre reached the +fire and heard Platon's voice enfeebled by illness, and saw his +pathetic face brightly lit up by the blaze, he felt a painful prick at +his heart. His feeling of pity for this man frightened him and he +wished to go away, but there was no other fire, and Pierre sat down, +trying not to look at Platon. + +"Well, how are you?" he asked. + +"How am I? If we grumble at sickness, God won't grant us death," +replied Platon, and at once resumed the story he had begun. + +"And so, brother," he continued, with a smile on his pale +emaciated face and a particularly happy light in his eyes, "you +see, brother..." + +Pierre had long been familiar with that story. Karataev had told +it to him alone some half-dozen times and always with a specially +joyful emotion. But well as he knew it, Pierre now listened to that +tale as to something new, and the quiet rapture Karataev evidently +felt as he told it communicated itself also to Pierre. The story was +of an old merchant who lived a good and God-fearing life with his +family, and who went once to the Nizhni fair with a companion--a +rich merchant. + +Having put up at an inn they both went to sleep, and next morning +his companion was found robbed and with his throat cut. A bloodstained +knife was found under the old merchant's pillow. He was tried, +knouted, and his nostrils having been torn off, "all in due form" as +Karataev put it, he was sent to hard labor in Siberia. + +"And so, brother" (it was at this point that Pierre came up), "ten +years or more passed by. The old man was living as a convict, +submitting as he should and doing no wrong. Only he prayed to God +for death. Well, one night the convicts were gathered just as we +are, with the old man among them. And they began telling what each was +suffering for, and how they had sinned against God. One told how he +had taken a life, another had taken two, a third had set a house on +fire, while another had simply been a vagrant and had done nothing. So +they asked the old man: 'What are you being punished for, Daddy?'--'I, +my dear brothers,' said he, 'am being punished for my own and other +men's sins. But I have not killed anyone or taken anything that was +not mine, but have only helped my poorer brothers. I was a merchant, +my dear brothers, and had much property. 'And he went on to tell +them all about it in due order. 'I don't grieve for myself,' he +says, 'God, it seems, has chastened me. Only I am sorry for my old +wife and the children,' and the old man began to weep. Now it happened +that in the group was the very man who had killed the other +merchant. 'Where did it happen, Daddy?' he said. 'When, and in what +month?' He asked all about it and his heart began to ache. So he comes +up to the old man like this, and falls down at his feet! 'You are +perishing because of me, Daddy,' he says. 'It's quite true, lads, that +this man,' he says, 'is being tortured innocently and for nothing! I,' +he says, 'did that deed, and I put the knife under your head while you +were asleep. Forgive me, Daddy,' he says, 'for Christ's sake!'" + +Karataev paused, smiling joyously as he gazed into the fire, and +he drew the logs together. + +"And the old man said, 'God will forgive you, we are all sinners +in His sight. I suffer for my own sins,' and he wept bitter tears. +Well, and what do you think, dear friends?" Karataev continued, his +face brightening more and more with a rapturous smile as if what he +now had to tell contained the chief charm and the whole meaning of his +story: "What do you think, dear fellows? That murderer confessed to +the authorities. 'I have taken six lives,' he says (he was a great +sinner), 'but what I am most sorry for is this old man. Don't let +him suffer because of me.' So he confessed and it was all written down +and the papers sent off in due form. The place was a long way off, and +while they were judging, what with one thing and another, filling in +the papers all in due form--the authorities I mean--time passed. The +affair reached the Tsar. After a while the Tsar's decree came: to +set the merchant free and give him a compensation that had been +awarded. The paper arrived and they began to look for the old man. +'Where is the old man who has been suffering innocently and in vain? A +paper has come from the Tsar!' so they began looking for him," here +Karataev's lower jaw trembled, "but God had already forgiven him--he +was dead! That's how it was, dear fellows!" Karataev concluded and sat +for a long time silent, gazing before him with a smile. + +And Pierre's soul was dimly but joyfully filled not by the story +itself but by its mysterious significance: by the rapturous joy that +lit up Karataev's face as he told it, and the mystic significance of +that joy. + + + + + +CHAPTER XIV + + +"A vos places!"* suddenly cried a voice. + + +*"To your places." + + +A pleasant feeling of excitement and an expectation of something +joyful and solemn was aroused among the soldiers of the convoy and the +prisoners. From all sides came shouts of command, and from the left +came smartly dressed cavalrymen on good horses, passing the +prisoners at a trot. The expression on all faces showed the tension +people feel at the approach of those in authority. The prisoners +thronged together and were pushed off the road. The convoy formed up. + +"The Emperor! The Emperor! The Marshal! The Duke!" and hardly had +the sleek cavalry passed, before a carriage drawn by six gray horses +rattled by. Pierre caught a glimpse of a man in a three-cornered hat +with a tranquil look on his handsome, plump, white face. It was one of +the marshals. His eye fell on Pierre's large and striking figure, +and in the expression with which he frowned and looked away Pierre +thought he detected sympathy and a desire to conceal that sympathy. + +The general in charge of the stores galloped after the carriage with +a red and frightened face, whipping up his skinny horse. Several +officers formed a group and some soldiers crowded round them. Their +faces all looked excited and worried. + +"What did he say? What did he say?" Pierre heard them ask. + +While the marshal was passing, the prisoners had huddled together in +a crowd, and Pierre saw Karataev whom he had not yet seen that +morning. He sat in his short overcoat leaning against a birch tree. On +his face, besides the look of joyful emotion it had worn yesterday +while telling the tale of the merchant who suffered innocently, +there was now an expression of quiet solemnity. + +Karataev looked at Pierre with his kindly round eyes now filled with +tears, evidently wishing him to come near that he might say +something to him. But Pierre was not sufficiently sure of himself. +He made as if he did not notice that look and moved hastily away. + +When the prisoners again went forward Pierre looked round. +Karataev was still sitting at the side of the road under the birch +tree and two Frenchmen were talking over his head. Pierre did not look +round again but went limping up the hill. + +From behind, where Karataev had been sitting, came the sound of a +shot. Pierre heard it plainly, but at that moment he remembered that +he had not yet finished reckoning up how many stages still remained to +Smolensk--a calculation he had begun before the marshal went by. And +he again started reckoning. Two French soldiers ran past Pierre, one +of whom carried a lowered and smoking gun. They both looked pale, +and in the expression on their faces--one of them glanced timidly at +Pierre--there was something resembling what he had seen on the face of +the young soldier at the execution. Pierre looked at the soldier and +remembered that, two days before, that man had burned his shirt +while drying it at the fire and how they had laughed at him. + +Behind him, where Karataev had been sitting, the dog began to +howl. "What a stupid beast! Why is it howling?" thought Pierre. + +His comrades, the prisoner soldiers walking beside him, avoided +looking back at the place where the shot had been fired and the dog +was howling, just as Pierre did, but there was a set look on all their +faces. + + + + + +CHAPTER XV + + +The stores, the prisoners, and the marshal's baggage train stopped +at the village of Shamshevo. The men crowded together round the +campfires. Pierre went up to the fire, ate some roast horseflesh, +lay down with his back to the fire, and immediately fell asleep. He +again slept as he had done at Mozhaysk after the battle of Borodino. + +Again real events mingled with dreams and again someone, he or +another, gave expression to his thoughts, and even to the same +thoughts that had been expressed in his dream at Mozhaysk. + +"Life is everything. Life is God. Everything changes and moves and +that movement is God. And while there is life there is joy in +consciousness of the divine. To love life is to love God. Harder and +more blessed than all else is to love this life in one's sufferings, +in innocent sufferings." + +"Karataev!" came to Pierre's mind. + +And suddenly he saw vividly before him a long-forgotten, kindly +old man who had given him geography lessons in Switzerland. "Wait a +bit," said the old man, and showed Pierre a globe. This globe was +alive--a vibrating ball without fixed dimensions. Its whole surface +consisted of drops closely pressed together, and all these drops moved +and changed places, sometimes several of them merging into one, +sometimes one dividing into many. Each drop tried to spread out and +occupy as much space as possible, but others striving to do the same +compressed it, sometimes destroyed it, and sometimes merged with it. + +"That is life," said the old teacher. + +"How simple and clear it is," thought Pierre. "How is it I did not +know it before?" + +"God is in the midst, and each drop tries to expand so as to reflect +Him to the greatest extent. And it grows, merges, disappears from +the surface, sinks to the depths, and again emerges. There now, +Karataev has spread out and disappeared. Do you understand, my child?" +said the teacher. + +"Do you understand, damn you?" shouted a voice, and Pierre woke up. + +He lifted himself and sat up. A Frenchman who had just pushed a +Russian soldier away was squatting by the fire, engaged in roasting +a piece of meat stuck on a ramrod. His sleeves were rolled up and +his sinewy, hairy, red hands with their short fingers deftly turned +the ramrod. His brown morose face with frowning brows was clearly +visible by the glow of the charcoal. + +"It's all the same to him," he muttered, turning quickly to a +soldier who stood behind him. "Brigand! Get away!" + +And twisting the ramrod he looked gloomily at Pierre, who turned +away and gazed into the darkness. A prisoner, the Russian soldier +the Frenchman had pushed away, was sitting near the fire patting +something with his hand. Looking more closely Pierre recognized the +blue-gray dog, sitting beside the soldier, wagging its tail. + +"Ah, he's come?" said Pierre. "And Plat-" he began, but did not +finish. + +Suddenly and simultaneously a crowd of memories awoke in his +fancy--of the look Platon had given him as he sat under the tree, of +the shot heard from that spot, of the dog's howl, of the guilty +faces of the two Frenchmen as they ran past him, of the lowered and +smoking gun, and of Karataev's absence at this halt--and he was on the +point of realizing that Karataev had been killed, but just at that +instant, he knew not why, the recollection came to his mind of a +summer evening he had spent with a beautiful Polish lady on the +veranda of his house in Kiev. And without linking up the events of the +day or drawing a conclusion from them, Pierre closed his eyes, +seeing a vision of the country in summertime mingled with memories +of bathing and of the liquid, vibrating globe, and he sank into +water so that it closed over his head. + +Before sunrise he was awakened by shouts and loud and rapid +firing. French soldiers were running past him. + +"The Cossacks!" one of them shouted, and a moment later a crowd of +Russians surrounded Pierre. + +For a long time he could not understand what was happening to him. +All around he heard his comrades sobbing with joy. + +"Brothers! Dear fellows! Darlings!" old soldiers exclaimed, weeping, +as they embraced Cossacks and hussars. + +The hussars and Cossacks crowded round the prisoners; one offered +them clothes, another boots, and a third bread. Pierre sobbed as he +sat among them and could not utter a word. He hugged the first soldier +who approached him, and kissed him, weeping. + +Dolokhov stood at the gate of the ruined house, letting a crowd of +disarmed Frenchmen pass by. The French, excited by all that had +happened, were talking loudly among themselves, but as they passed +Dolokhov who gently switched his boots with his whip and watched +them with cold glassy eyes that boded no good, they became silent. +On the opposite side stood Dolokhov's Cossack, counting the +prisoners and marking off each hundred with a chalk line on the gate. + +"How many?" Dolokhov asked the Cossack. + +"The second hundred," replied the Cossack. + +"Filez, filez!"* Dolokhov kept saying, having adopted this +expression from the French, and when his eyes met those of the +prisoners they flashed with a cruel light. + + +*"Get along, get along!" + + +Denisov, bareheaded and with a gloomy face, walked behind some +Cossacks who were carrying the body of Petya Rostov to a hole that had +been dug in the garden. + + + + + +CHAPTER XVI + + +After the twenty-eighth of October when the frosts began, the flight +of the French assumed a still more tragic character, with men +freezing, or roasting themselves to death at the campfires, while +carriages with people dressed in furs continued to drive past, +carrying away the property that had been stolen by the Emperor, kings, +and dukes; but the process of the flight and disintegration of the +French army went on essentially as before. + +From Moscow to Vyazma the French army of seventy-three thousand +men not reckoning the Guards (who did nothing during the whole war but +pillage) was reduced to thirty-six thousand, though not more than five +thousand had fallen in battle. From this beginning the succeeding +terms of the progression could be determined mathematically. The +French army melted away and perished at the same rate from Moscow to +Vyazma, from Vyazma to Smolensk, from Smolensk to the Berezina, and +from the Berezina to Vilna--independently of the greater or lesser +intensity of the cold, the pursuit, the barring of the way, or any +other particular conditions. Beyond Vyazma the French army instead +of moving in three columns huddled together into one mass, and so went +on to the end. Berthier wrote to his Emperor (we know how far +commanding officers allow themselves to diverge from the truth in +describing the condition of an army) and this is what he said: + + +I deem it my duty to report to Your Majesty the condition of the +various corps I have had occasion to observe during different stages +of the last two or three days' march. They are almost disbanded. +Scarcely a quarter of the soldiers remain with the standards of +their regiments, the others go off by themselves in different +directions hoping to find food and escape discipline. In general +they regard Smolensk as the place where they hope to recover. During +the last few days many of the men have been seen to throw away their +cartridges and their arms. In such a state of affairs, whatever your +ultimate plans may be, the interest of Your Majesty's service +demands that the army should be rallied at Smolensk and should first +of all be freed from ineffectives, such as dismounted cavalry, +unnecessary baggage, and artillery material that is no longer in +proportion to the present forces. The soldiers, who are worn out +with hunger and fatigue, need these supplies as well as a few days' +rest. Many have died last days on the road or at the bivouacs. This +state of things is continually becoming worse and makes one fear +that unless a prompt remedy is applied the troops will no longer be +under control in case of an engagement. + +November 9: twenty miles from Smolensk. + + +After staggering into Smolensk which seemed to them a promised land, +the French, searching for food, killed one another, sacked their own +stores, and when everything had been plundered fled farther. + +They all went without knowing whither or why they were going. +Still less did that genius, Napoleon, know it, for no one issued any +orders to him. But still he and those about him retained their old +habits: wrote commands, letters, reports, and orders of the day; +called one another sire, mon cousin, prince d'Eckmuhl, roi de +Naples, and so on. But these orders and reports were only on paper, +nothing in them was acted upon for they could not be carried out, +and though they entitled one another Majesties, Highnesses, or +Cousins, they all felt that they were miserable wretches who had +done much evil for which they had now to pay. And though they +pretended to be concerned about the army, each was thinking only of +himself and of how to get away quickly and save himself. + + + + +CHAPTER XVII + + +The movements of the Russian and French armies during the campaign +from Moscow back to the Niemen were like those in a game of Russian +blindman's bluff, in which two players are blindfolded and one of them +occasionally rings a little bell to inform the catcher of his +whereabouts. First he rings his bell fearlessly, but when he gets into +a tight place he runs away as quietly as he can, and often thinking to +escape runs straight into his opponent's arms. + +At first while they were still moving along the Kaluga road, +Napoleon's armies made their presence known, but later when they +reached the Smolensk road they ran holding the clapper of their bell +tight--and often thinking they were escaping ran right into the +Russians. + +Owing to the rapidity of the French flight and the Russian pursuit +and the consequent exhaustion of the horses, the chief means of +approximately ascertaining the enemy's position--by cavalry +scouting--was not available. Besides, as a result of the frequent +and rapid change of position by each army, even what information was +obtained could not be delivered in time. If news was received one +day that the enemy had been in a certain position the day before, by +the third day when something could have been done, that army was +already two days' march farther on and in quite another position. + +One army fled and the other pursued. Beyond Smolensk there were +several different roads available for the French, and one would have +thought that during their stay of four days they might have learned +where the enemy was, might have arranged some more advantageous plan +and undertaken something new. But after a four days' halt the mob, +with no maneuvers or plans, again began running along the beaten +track, neither to the right nor to the left but along the old--the +worst--road, through Krasnoe and Orsha. + +Expecting the enemy from behind and not in front, the French +separated in their flight and spread out over a distance of +twenty-four hours. In front of them all fled the Emperor, then the +kings, then the dukes. The Russian army, expecting Napoleon to take +the road to the right beyond the Dnieper--which was the only +reasonable thing for him to do--themselves turned to the right and +came out onto the highroad at Krasnoe. And here as in a game of +blindman's buff the French ran into our vanguard. Seeing their enemy +unexpectedly the French fell into confusion and stopped short from the +sudden fright, but then they resumed their flight, abandoning their +comrades who were farther behind. Then for three days separate +portions of the French army--first Murat's (the vice-king's), then +Davout's, and then Ney's--ran, as it were, the gauntlet of the Russian +army. They abandoned one another, abandoned all their heavy baggage, +their artillery, and half their men, and fled, getting past the +Russians by night by making semicircles to the right. + +Ney, who came last, had been busying himself blowing up the walls of +Smolensk which were in nobody's way, because despite the unfortunate +plight of the French or because of it, they wished to punish the floor +against which they had hurt themselves. Ney, who had had a corps of +ten thousand men, reached Napoleon at Orsha with only one thousand men +left, having abandoned all the rest and all his cannon, and having +crossed the Dnieper at night by stealth at a wooded spot. + +From Orsha they fled farther along the road to Vilna, still +playing at blindman's buff with the pursuing army. At the Berezina +they again became disorganized, many were drowned and many +surrendered, but those who got across the river fled farther. Their +supreme chief donned a fur coat and, having seated himself in a +sleigh, galloped on alone, abandoning his companions. The others who +could do so drove away too, leaving those who could not to surrender +or die. + + + + + +CHAPTER XVIII + + +This campaign consisted in a flight of the French during which +they did all they could to destroy themselves. From the time they +turned onto the Kaluga road to the day their leader fled from the +army, none of the movements of the crowd had any sense. So one might +have thought that regarding this period of the campaign the +historians, who attributed the actions of the mass to the will of +one man, would have found it impossible to make the story of the +retreat fit their theory. But no! Mountains of books have been written +by the historians about this campaign, and everywhere are described +Napoleon's arrangements, the maneuvers, and his profound plans which +guided the army, as well as the military genius shown by his marshals. + +The retreat from Malo-Yaroslavets when he had a free road into a +well-supplied district and the parallel road was open to him along +which Kutuzov afterwards pursued him--this unnecessary retreat along a +devastated road--is explained to us as being due to profound +considerations. Similarly profound considerations are given for his +retreat from Smolensk to Orsha. Then his heroism at Krasnoe is +described, where he is reported to have been prepared to accept battle +and take personal command, and to have walked about with a birch stick +and said: + +"J'ai assez fait l'empereur; il est temps de faire le general,"* but +nevertheless immediately ran away again, abandoning to its fate the +scattered fragments of the army he left behind. + + +*"I have acted the Emperor long enough; it is time to act the +general." + + +Then we are told of the greatness of soul of the marshals, +especially of Ney--a greatness of soul consisting in this: that he +made his way by night around through the forest and across the Dnieper +and escaped to Orsha, abandoning standards, artillery, and nine tenths +of his men. + +And lastly, the final departure of the great Emperor from his heroic +army is presented to us by the historians as something great and +characteristic of genius. Even that final running away, described in +ordinary language as the lowest depth of baseness which every child is +taught to be ashamed of--even that act finds justification in the +historians' language. + +When it is impossible to stretch the very elastic threads of +historical ratiocination any farther, when actions are clearly +contrary to all that humanity calls right or even just, the historians +produce a saving conception of "greatness." "Greatness," it seems, +excludes the standards of right and wrong. For the "great" man nothing +is wrong, there is no atrocity for which a "great" man can be blamed. + +"C'est grand!"* say the historians, and there no longer exists +either good or evil but only "grand" and "not grand." Grand is good, +not grand is bad. Grand is the characteristic, in their conception, of +some special animals called "heroes." And Napoleon, escaping home in a +warm fur coat and leaving to perish those who were not merely his +comrades but were (in his opinion) men he had brought there, feels que +c'est grand,*[2] and his soul is tranquil. + + +*"It is great." + +*[2] That it is great. + + +"Du sublime (he saw something sublime in himself) au ridicule il n'y +a qu'un pas,"* said he. And the whole world for fifty years has been +repeating: "Sublime! Grand! Napoleon le Grand!" Du sublime au ridicule +il n'y a qu'un pas. + + +*"From the sublime to the ridiculous is but a step." + + +And it occurs to no one that to admit a greatness not +commensurable with the standard of right and wrong is merely to +admit one's own nothingness and immeasurable meanness. + +For us with the standard of good and evil given us by Christ, no +human actions are incommensurable. And there is no greatness where +simplicity, goodness, and truth are absent. + + + + + +CHAPTER XIX + + +What Russian, reading the account of the last part of the campaign +of 1812, has not experienced an uncomfortable feeling of regret, +dissatisfaction, and perplexity? Who has not asked himself how it is +that the French were not all captured or destroyed when our three +armies surrounded them in superior numbers, when the disordered +French, hungry and freezing, surrendered in crowds, and when (as the +historians relate) the aim of the Russians was to stop the French, +to cut them off, and capture them all? + +How was it that the Russian army, which when numerically weaker than +the French had given battle at Borodino, did not achieve its purpose +when it had surrounded the French on three sides and when its aim +was to capture them? Can the French be so enormously superior to us +that when we had surrounded them with superior forces we could not +beat them? How could that happen? + +History (or what is called by that name) replying to these questions +says that this occurred because Kutuzov and Tormasov and Chichagov, +and this man and that man, did not execute such and such maneuvers... + +But why did they not execute those maneuvers? And why if they were +guilty of not carrying out a prearranged plan were they not tried +and punished? But even if we admitted that Kutuzov, Chichagov, and +others were the cause of the Russian failures, it is still +incomprehensible why, the position of the Russian army being what it +was at Krasnoe and at the Berezina (in both cases we had superior +forces), the French army with its marshals, kings, and Emperor was not +captured, if that was what the Russians aimed at. + +The explanation of this strange fact given by Russian military +historians (to the effect that Kutuzov hindered an attack) is +unfounded, for we know that he could not restrain the troops from +attacking at Vyazma and Tarutino. + +Why was the Russian army--which with inferior forces had withstood +the enemy in full strength at Borodino--defeated at Krasnoe and the +Berezina by the disorganized crowds of the French when it was +numerically superior? + +If the aim of the Russians consisted in cutting off and capturing +Napoleon and his marshals--and that aim was not merely frustrated +but all attempts to attain it were most shamefully baffled--then +this last period of the campaign is quite rightly considered by the +French to be a series of victories, and quite wrongly considered +victorious by Russian historians. + +The Russian military historians in so far as they submit to claims +of logic must admit that conclusion, and in spite of their lyrical +rhapsodies about valor, devotion, and so forth, must reluctantly admit +that the French retreat from Moscow was a series of victories for +Napoleon and defeats for Kutuzov. + +But putting national vanity entirely aside one feels that such a +conclusion involves a contradiction, since the series of French +victories brought the French complete destruction, while the series of +Russian defeats led to the total destruction of their enemy and the +liberation of their country. + +The source of this contradiction lies in the fact that the +historians studying the events from the letters of the sovereigns +and the generals, from memoirs, reports, projects, and so forth, +have attributed to this last period of the war of 1812 an aim that +never existed, namely that of cutting off and capturing Napoleon +with his marshals and his army. + +There never was or could have been such an aim, for it would have +been senseless and its attainment quite impossible. + +It would have been senseless, first because Napoleon's +disorganized army was flying from Russia with all possible speed, that +is to say, was doing just what every Russian desired. So what was +the use of performing various operations on the French who were +running away as fast as they possibly could? + +Secondly, it would have been senseless to block the passage of men +whose whole energy was directed to flight. + +Thirdly, it would have been senseless to sacrifice one's own +troops in order to destroy the French army, which without external +interference was destroying itself at such a rate that, though its +path was not blocked, it could not carry across the frontier more than +it actually did in December, namely a hundredth part of the original +army. + +Fourthly, it would have been senseless to wish to take captive the +Emperor, kings, and dukes--whose capture would have been in the +highest degree embarrassing for the Russians, as the most adroit +diplomatists of the time (Joseph de Maistre and others) recognized. +Still more senseless would have been the wish to capture army corps of +the French, when our own army had melted away to half before +reaching Krasnoe and a whole division would have been needed to convoy +the corps of prisoners, and when our men were not always getting +full rations and the prisoners already taken were perishing of hunger. + +All the profound plans about cutting off and capturing Napoleon +and his army were like the plan of a market gardener who, when driving +out of his garden a cow that had trampled down the beds he had +planted, should run to the gate and hit the cow on the head. The +only thing to be said in excuse of that gardener would be that he +was very angry. But not even that could be said for those who drew +up this project, for it was not they who had suffered from the +trampled beds. + +But besides the fact that cutting off Napoleon with his army would +have been senseless, it was impossible. + +It was impossible first because--as experience shows that a +three-mile movement of columns on a battlefield never coincides with +the plans--the probability of Chichagov, Kutuzov, and Wittgenstein +effecting a junction on time at an appointed place was so remote as to +be tantamount to impossibility, as in fact thought Kutuzov, who when +he received the plan remarked that diversions planned over great +distances do not yield the desired results. + +Secondly it was impossible, because to paralyze the momentum with +which Napoleon's army was retiring, incomparably greater forces than +the Russians possessed would have been required. + +Thirdly it was impossible, because the military term "to cut off" +has no meaning. One can cut off a slice of bread, but not an army. +To cut off an army--to bar its road--is quite impossible, for there is +always plenty of room to avoid capture and there is the night when +nothing can be seen, as the military scientists might convince +themselves by the example of Krasnoe and of the Berezina. It is only +possible to capture prisoners if they agree to be captured, just as it +is only possible to catch a swallow if it settles on one's hand. Men +can only be taken prisoners if they surrender according to the rules +of strategy and tactics, as the Germans did. But the French troops +quite rightly did not consider that this suited them, since death by +hunger and cold awaited them in flight or captivity alike. + +Fourthly and chiefly it was impossible, because never since the +world began has a war been fought under such conditions as those +that obtained in 1812, and the Russian army in its pursuit of the +French strained its strength to the utmost and could not have done +more without destroying itself. + +During the movement of the Russian army from Tarutino to Krasnoe +it lost fifty thousand sick or stragglers, that is a number equal to +the population of a large provincial town. Half the men fell out of +the army without a battle. + +And it is of this period of the campaign--when the army lacked boots +and sheepskin coats, was short of provisions and without vodka, and +was camping out at night for months in the snow with fifteen degrees +of frost, when there were only seven or eight hours of daylight and +the rest was night in which the influence of discipline cannot be +maintained, when men were taken into that region of death where +discipline fails, not for a few hours only as in a battle, but for +months, where they were every moment fighting death from hunger and +cold, when half the army perished in a single month--it is of this +period of the campaign that the historians tell us how Miloradovich +should have made a flank march to such and such a place, Tormasov to +another place, and Chichagov should have crossed (more than +knee-deep in snow) to somewhere else, and how so-and-so "routed" and +"cut off" the French and so on and so on. + +The Russians, half of whom died, did all that could and should +have been done to attain an end worthy of the nation, and they are not +to blame because other Russians, sitting in warm rooms, proposed +that they should do what was impossible. + +All that strange contradiction now difficult to understand between +the facts and the historical accounts only arises because the +historians dealing with the matter have written the history of the +beautiful words and sentiments of various generals, and not the +history of the events. + +To them the words of Miloradovich seem very interesting, and so do +their surmises and the rewards this or that general received; but +the question of those fifty thousand men who were left in hospitals +and in graves does not even interest them, for it does not come within +the range of their investigation. + +Yet one need only discard the study of the reports and general plans +and consider the movement of those hundreds of thousands of men who +took a direct part in the events, and all the questions that seemed +insoluble easily and simply receive an immediate and certain solution. + +The aim of cutting off Napoleon and his army never existed except in +the imaginations of a dozen people. It could not exist because it +was senseless and unattainable. + +The people had a single aim: to free their land from invasion. +That aim was attained in the first place of itself, as the French +ran away, and so it was only necessary not to stop their flight. +Secondly it was attained by the guerrilla warfare which was destroying +the French, and thirdly by the fact that a large Russian army was +following the French, ready to use its strength in case their movement +stopped. + +The Russian army had to act like a whip to a running animal. And the +experienced driver knew it was better to hold the whip raised as a +menace than to strike the running animal on the head. + + + + + +BOOK FIFTEEN: 1812 --13 + + + + + +CHAPTER I + + +When seeing a dying animal a man feels a sense of horror: +substance similar to his own is perishing before his eyes. But when it +is a beloved and intimate human being that is dying, besides this +horror at the extinction of life there is a severance, a spiritual +wound, which like a physical wound is sometimes fatal and sometimes +heals, but always aches and shrinks at any external irritating touch. + +After Prince Andrew's death Natasha and Princess Mary alike felt +this. Drooping in spirit and closing their eyes before the menacing +cloud of death that overhung them, they dared not look life in the +face. They carefully guarded their open wounds from any rough and +painful contact. Everything: a carriage passing rapidly in the street, +a summons to dinner, the maid's inquiry what dress to prepare, or +worse still any word of insincere or feeble sympathy, seemed an +insult, painfully irritated the wound, interrupting that necessary +quiet in which they both tried to listen to the stern and dreadful +choir that still resounded in their imagination, and hindered their +gazing into those mysterious limitless vistas that for an instant +had opened out before them. + +Only when alone together were they free from such outrage and +pain. They spoke little even to one another, and when they did it +was of very unimportant matters. + +Both avoided any allusion to the future. To admit the possibility of +a future seemed to them to insult his memory. Still more carefully did +they avoid anything relating to him who was dead. It seemed to them +that what they had lived through and experienced could not be +expressed in words, and that any reference to the details of his +life infringed the majesty and sacredness of the mystery that had been +accomplished before their eyes. + +Continued abstention from speech, and constant avoidance of +everything that might lead up to the subject--this halting on all +sides at the boundary of what they might not mention--brought before +their minds with still greater purity and clearness what they were +both feeling. + +But pure and complete sorrow is as impossible as pure and complete +joy. Princess Mary, in her position as absolute and independent +arbiter of her own fate and guardian and instructor of her nephew, was +the first to be called back to life from that realm of sorrow in which +she had dwelt for the first fortnight. She received letters from her +relations to which she had to reply; the room in which little Nicholas +had been put was damp and he began to cough; Alpatych came to +Yaroslavl with reports on the state of their affairs and with advice +and suggestions that they should return to Moscow to the house on +the Vozdvizhenka Street, which had remained uninjured and needed +only slight repairs. Life did not stand still and it was necessary +to live. Hard as it was for Princess Mary to emerge from the realm +of secluded contemplation in which she had lived till then, and +sorry and almost ashamed as she felt to leave Natasha alone, yet the +cares of life demanded her attention and she involuntarily yielded +to them. She went through the accounts with Alpatych, conferred with +Dessalles about her nephew, and gave orders and made preparations +for the journey to Moscow. + +Natasha remained alone and, from the time Princess Mary began making +preparations for departure, held aloof from her too. + +Princess Mary asked the countess to let Natasha go with her to +Moscow, and both parents gladly accepted this offer, for they saw +their daughter losing strength every day and thought that a change +of scene and the advice of Moscow doctors would be good for her. + +"I am not going anywhere," Natasha replied when this was proposed to +her. "Do please just leave me alone!" And she ran out of the room, +with difficulty refraining from tears of vexation and irritation +rather than of sorrow. + +After she felt herself deserted by Princes Mary and alone in her +grief, Natasha spent most of the time in her room by herself, +sitting huddled up feet and all in the corner of the sofa, tearing and +twisting something with her slender nervous fingers and gazing +intently and fixedly at whatever her eyes chanced to fall on. This +solitude exhausted and tormented her but she was in absolute need of +it. As soon as anyone entered she got up quickly, changed her position +and expression, and picked up a book or some sewing, evidently waiting +impatiently for the intruder to go. + +She felt all the time as if she might at any moment penetrate that +on which--with a terrible questioning too great for her strength- +her spiritual gaze was fixed. + +One day toward the end of December Natasha, pale and thin, dressed +in a black woolen gown, her plaited hair negligently twisted into a +knot, was crouched feet and all in the corner of her sofa, nervously +crumpling and smoothing out the end of her sash while she looked at +a corner of the door. + +She was gazing in the direction in which he had gone--to the other +side of life. And that other side of life, of which she had never +before thought and which had formerly seemed to her so far away and +improbable, was now nearer and more akin and more comprehensible +than this side of life, where everything was either emptiness and +desolation or suffering and indignity. + +She was gazing where she knew him to be; but she could not imagine +him otherwise than as he had been here. She now saw him again as he +had been at Mytishchi, at Troitsa, and at Yaroslavl. + +She saw his face, heard his voice, repeated his words and her own, +and sometimes devised other words they might have spoken. + +There he is lying back in an armchair in his velvet cloak, leaning +his head on his thin pale hand. His chest is dreadfully hollow and his +shoulders raised. His lips are firmly closed, his eyes glitter, and +a wrinkle comes and goes on his pale forehead. One of his legs +twitches just perceptibly, but rapidly. Natasha knows that he is +struggling with terrible pain. "What is that pain like? Why does he +have that pain? What does he feel? How does it hurt him?" thought +Natasha. He noticed her watching him, raised his eyes, and began to +speak seriously: + +"One thing would be terrible," said he: "to bind oneself forever +to a suffering man. It would be continual torture." And he looked +searchingly at her. Natasha as usual answered before she had time to +think what she would say. She said: "This can't go on--it won't. You +will get well--quite well." + +She now saw him from the commencement of that scene and relived what +she had then felt. She recalled his long sad and severe look at +those words and understood the meaning of the rebuke and despair in +that protracted gaze. + +"I agreed," Natasha now said to herself, "that it would be +dreadful if he always continued to suffer. I said it then only because +it would have been dreadful for him, but he understood it differently. +He thought it would be dreadful for me. He then still wished to live +and feared death. And I said it so awkwardly and stupidly! I did not +say what I meant. I thought quite differently. Had I said what I +thought, I should have said: even if he had to go on dying, to die +continually before my eyes, I should have been happy compared with +what I am now. Now there is nothing... nobody. Did he know that? No, +he did not and never will know it. And now it will never, never be +possible to put it right." And now he again seemed to be saying the +same words to her, only in her imagination Natasha this time gave +him a different answer. She stopped him and said: "Terrible for you, +but not for me! You know that for me there is nothing in life but you, +and to suffer with you is the greatest happiness for me," and he +took her hand and pressed it as he had pressed it that terrible +evening four days before his death. And in her imagination she said +other tender and loving words which she might have said then but +only spoke now: "I love thee!... thee! I love, love..." she said, +convulsively pressing her hands and setting her teeth with a desperate +effort... + +She was overcome by sweet sorrow and tears were already rising in +her eyes; then she suddenly asked herself to whom she was saying this. +Again everything was shrouded in hard, dry perplexity, and again +with a strained frown she peered toward the world where he was. And +now, now it seemed to her she was penetrating the mystery.... But at +the instant when it seemed that the incomprehensible was revealing +itself to her a loud rattle of the door handle struck painfully on her +ears. Dunyasha, her maid, entered the room quickly and abruptly with a +frightened look on her face and showing no concern for her mistress. + +"Come to your Papa at once, please!" said she with a strange, +excited look. "A misfortune... about Peter Ilynich... a letter," she +finished with a sob. + + + + + +CHAPTER II + + +Besides a feeling of aloofness from everybody Natasha was feeling +a special estrangement from the members of her own family. All of +them--her father, mother, and Sonya--were so near to her, so familiar, +so commonplace, that all their words and feelings seemed an insult +to the world in which she had been living of late, and she felt not +merely indifferent to them but regarded them with hostility. She heard +Dunyasha's words about Peter Ilynich and a misfortune, but did not +grasp them. + +"What misfortune? What misfortune can happen to them? They just live +their own old, quiet, and commonplace life," thought Natasha. + +As she entered the ballroom her father was hurriedly coming out of +her mother's room. His face was puckered up and wet with tears. He had +evidently run out of that room to give vent to the sobs that were +choking him. When he saw Natasha he waved his arms despairingly and +burst into convulsively painful sobs that distorted his soft round +face. + +"Pe... Petya... Go, go, she... is calling..." and weeping like a +child and quickly shuffling on his feeble legs to a chair, he almost +fell into it, covering his face with his hands. + +Suddenly an electric shock seemed to run through Natasha's whole +being. Terrible anguish struck her heart, she felt a dreadful ache +as if something was being torn inside her and she were dying. But +the pain was immediately followed by a feeling of release from the +oppressive constraint that had prevented her taking part in life. +The sight of her father, the terribly wild cries of her mother that +she heard through the door, made her immediately forget herself and +her own grief. + +She ran to her father, but he feebly waved his arm, pointing to +her mother's door. Princess Mary, pale and with quivering chin, came +out from that room and taking Natasha by the arm said something to +her. Natasha neither saw nor heard her. She went in with rapid +steps, pausing at the door for an instant as if struggling with +herself, and then ran to her mother. + +The countess was lying in an armchair in a strange and awkward +position, stretching out and beating her head against the wall. +Sonya and the maids were holding her arms. + +"Natasha! Natasha!..." cried the countess. "It's not true... it's +not true... He's lying... Natasha!" she shrieked, pushing those around +her away. "Go away, all of you; it's not true! Killed!... ha, ha, +ha!... It's not true!" + +Natasha put one knee on the armchair, stooped over her mother, +embraced her, and with unexpected strength raised her, turned her face +toward herself, and clung to her. + +"Mummy!... darling!... I am here, my dearest Mummy," she kept on +whispering, not pausing an instant. + +She did not let go of her mother but struggled tenderly with her, +demanded a pillow and hot water, and unfastened and tore open her +mother's dress. + +"My dearest darling... Mummy, my precious!..." she whispered +incessantly, kissing her head, her hands, her face, and feeling her +own irrepressible and streaming tears tickling her nose and cheeks. + +The countess pressed her daughter's hand, closed her eyes, and +became quiet for a moment. Suddenly she sat up with unaccustomed +swiftness, glanced vacantly around her, and seeing Natasha began to +press her daughter's head with all her strength. Then she turned +toward her daughter's face which was wincing with pain and gazed +long at it. + +"Natasha, you love me?" she said in a soft trustful whisper. +"Natasha, you would not deceive me? You'll tell me the whole truth?" + +Natasha looked at her with eyes full of tears and in her look +there was nothing but love and an entreaty for forgiveness. + +"My darling Mummy!" she repeated, straining all the power of her +love to find some way of taking on herself the excess of grief that +crushed her mother. + +And again in a futile struggle with reality her mother, refusing +to believe that she could live when her beloved boy was killed in +the bloom of life, escaped from reality into a world of delirium. + +Natasha did not remember how that day passed nor that night, nor the +next day and night. She did not sleep and did not leave her mother. +Her persevering and patient love seemed completely to surround the +countess every moment, not explaining or consoling, but recalling +her to life. + +During the third night the countess kept very quiet for a few +minutes, and Natasha rested her head on the arm of her chair and +closed her eyes, but opened them again on hearing the bedstead +creak. The countess was sitting up in bed and speaking softly. + +"How glad I am you have come. You are tired. Won't you have some +tea?" Natasha went up to her. "You have improved in looks and grown +more manly," continued the countess, taking her daughter's hand. + +"Mamma! What are you saying..." + +"Natasha, he is no more, no more!" + +And embracing her daughter, the countess began to weep for the first +time. + + + + + +CHAPTER III + + +Princess Mary postponed her departure. Sonya and the count tried +to replace Natasha but could not. They saw that she alone was able +to restrain her mother from unreasoning despair. For three weeks +Natasha remained constantly at her mother's side, sleeping on a lounge +chair in her room, making her eat and drink, and talking to her +incessantly because the mere sound of her tender, caressing tones +soothed her mother. + +The mother's wounded spirit could not heal. Petya's +death had torn from her half her life. When the news of Petya's +death had come she had been a fresh and vigorous woman of fifty, but a +month later she left her room a listless old woman taking no +interest in life. But the same blow that almost killed the countess, +this second blow, restored Natasha to life. + +A spiritual wound produced by a rending of the spiritual body is +like a physical wound and, strange as it may seem, just as a deep +wound may heal and its edges join, physical and spiritual wounds alike +can yet heal completely only as the result of a vital force from +within. + +Natasha's wound healed in that way. She thought her life was +ended, but her love for her mother unexpectedly showed her that the +essence of life--love--was still active within her. Love awoke and +so did life. + +Prince Andrew's last days had bound Princess Mary and Natasha +together; this new sorrow brought them still closer to one another. +Princess Mary put off her departure, and for three weeks looked +after Natasha as if she had been a sick child. The last weeks passed +in her mother's bedroom had strained Natasha's physical strength. + +One afternoon noticing Natasha shivering with fever, Princess Mary +took her to her own room and made her lie down on the bed. Natasha lay +down, but when Princess Mary had drawn the blinds and was going away +she called her back. + +"I don't want to sleep, Mary, sit by me a little." + +"You are tired--try to sleep." + +"No, no. Why did you bring me away? She will be asking for me." + +"She is much better. She spoke so well today," said Princess Mary. + +Natasha lay on the bed and in the semidarkness of the room scanned +Princess Mary's face. + +"Is she like him?" thought Natasha. "Yes, like and yet not like. But +she is quite original, strange, new, and unknown. And she loves me. +What is in her heart? All that is good. But how? What is her mind +like? What does she think about me? Yes, she is splendid!" + +"Mary," she said timidly, drawing Princess Mary's hand to herself, +"Mary, you mustn't think me wicked. No? Mary darling, how I love +you! Let us be quite, quite friends." + +And Natasha, embracing her, began kissing her face and hands, making +Princess Mary feel shy but happy by this demonstration of her +feelings. + +From that day a tender and passionate friendship such as exists only +between women was established between Princess Mary and Natasha. +They were continually kissing and saying tender things to one +another and spent most of their time together. When one went out the +other became restless and hastened to rejoin her. Together they felt +more in harmony with one another than either of them felt with herself +when alone. A feeling stronger than friendship sprang up between them; +an exclusive feeling of life being possible only in each other's +presence. + +Sometimes they were silent for hours; sometimes after they were +already in bed they would begin talking and go on till morning. They +spoke most of what was long past. Princess Mary spoke of her +childhood, of her mother, her father, and her daydreams; and +Natasha, who with a passive lack of understanding had formerly +turned away from that life of devotion, submission, and the poetry +of Christian self-sacrifice, now feeling herself bound to Princess +Mary by affection, learned to love her past too and to understand a +side of life previously incomprehensible to her. She did not think +of applying submission and self-abnegation to her own life, for she +was accustomed to seek other joys, but she understood and loved in +another those previously incomprehensible virtues. For Princess +Mary, listening to Natasha's tales of childhood and early youth, there +also opened out a new and hitherto uncomprehended side of life: belief +in life and its enjoyment. + +Just as before, they never mentioned him so as not to lower (as they +thought) their exalted feelings by words; but this silence about him +had the effect of making them gradually begin to forget him without +being conscious of it. + +Natasha had grown thin and pale and physically so weak that they all +talked about her health, and this pleased her. But sometimes she was +suddenly overcome by fear not only of death but of sickness, weakness, +and loss of good looks, and involuntarily she examined her bare arm +carefully, surprised at its thinness, and in the morning noticed her +drawn and, as it seemed to her, piteous face in her glass. It seemed +to her that things must be so, and yet it was dreadfully sad. + +One day she went quickly upstairs and found herself out of breath. +Unconsciously she immediately invented a reason for going down, and +then, testing her strength, ran upstairs again, observing the result. + +Another time when she called Dunyasha her voice trembled, so she +called again--though she could hear Dunyasha coming--called her in the +deep chest tones in which she had been wont to sing, sing, and +listened attentively to herself. + +She did not know and would not have believed it, but beneath the +layer of slime that covered her soul and seemed to her impenetrable, +delicate young shoots of grass were already sprouting, which taking +root would so cover with their living verdure the grief that weighed +her down that it would soon no longer be seen or noticed. The wound +had begun to heal from within. + +At the end of January Princess Mary left for Moscow, and the count +insisted on Natasha's going with her to consult the doctors. + + + + + +CHAPTER IV + + +After the encounter at Vyazma, where Kutuzov had been unable to hold +back his troops in their anxiety to overwhelm and cut off the enemy +and so on, the farther movement of the fleeing French, and of the +Russians who pursued them, continued as far as Krasnoe without a +battle. The flight was so rapid that the Russian army pursuing the +French could not keep up with them; cavalry and artillery horses broke +down, and the information received of the movements of the French +was never reliable. + +The men in the Russian army were so worn out by this continuous +marching at the rate of twenty-seven miles a day that they could not +go any faster. + +To realize the degree of exhaustion of the Russian army it is only +necessary to grasp clearly the meaning of the fact that, while not +losing more than five thousand killed and wounded after Tarutino and +less than a hundred prisoners, the Russian army which left that +place a hundred thousand strong reached Krasnoe with only fifty +thousand. + +The rapidity of the Russian pursuit was just as destructive to our +army as the flight of the French was to theirs. The only difference +was that the Russian army moved voluntarily, with no such threat of +destruction as hung over the French, and that the sick Frenchmen +were left behind in enemy hands while the sick Russians left behind +were among their own people. The chief cause of the wastage of +Napoleon's army was the rapidity of its movement, and a convincing +proof of this is the corresponding decrease of the Russian army. + +Kutuzov as far as was in his power, instead of trying to check the +movement of the French as was desired in Petersburg and by the Russian +army generals, directed his whole activity here, as he had done at +Tarutino and Vyazma, to hastening it on while easing the movement of +our army. + +But besides this, since the exhaustion and enormous diminution of +the army caused by the rapidity of the advance had become evident, +another reason for slackening the pace and delaying presented itself +to Kutuzov. The aim of the Russian army was to pursue the French. +The road the French would take was unknown, and so the closer our +troops trod on their heels the greater distance they had to cover. +Only by following at some distance could one cut across the zigzag +path of the French. All the artful maneuvers suggested by our generals +meant fresh movements of the army and a lengthening of its marches, +whereas the only reasonable aim was to shorten those marches. To +that end Kutuzov's activity was directed during the whole campaign +from Moscow to Vilna--not casually or intermittently but so +consistently that he never once deviated from it. + +Kutuzov felt and knew--not by reasoning or science but with the +whole of his Russian being--what every Russian soldier felt: that +the French were beaten, that the enemy was flying and must be driven +out; but at the same time he like the soldiers realized all the +hardship of this march, the rapidity of which was unparalleled for +such a time of the year. + +But to the generals, especially the foreign ones in the Russian +army, who wished to distinguish themselves, to astonish somebody, +and for some reason to capture a king or a duke--it seemed that now- +when any battle must be horrible and senseless--was the very time to +fight and conquer somebody. Kutuzov merely shrugged his shoulders when +one after another they presented projects of maneuvers to be made with +those soldiers--ill-shod, insufficiently clad, and half starved--who +within a month and without fighting a battle had dwindled to half +their number, and who at the best if the flight continued would have +to go a greater distance than they had already traversed, before +they reached the frontier. + +This longing to distinguish themselves, to maneuver, to overthrow, +and to cut off showed itself particularly whenever the Russians +stumbled on the French army. + +So it was at Krasnoe, where they expected to find one of the three +French columns and stumbled instead on Napoleon himself with sixteen +thousand men. Despite all Kutuzov's efforts to avoid that ruinous +encounter and to preserve his troops, the massacre of the broken mob +of French soldiers by worn-out Russians continued at Krasnoe for three +days. + +Toll wrote a disposition: "The first column will march to so and +so," etc. And as usual nothing happened in accord with the +disposition. Prince Eugene of Wurttemberg fired from a hill over the +French crowds that were running past, and demanded reinforcements +which did not arrive. The French, avoiding the Russians, dispersed and +hid themselves in the forest by night, making their way round as +best they could, and continued their flight. + +Miloradovich, who said he did not want to know anything about the +commissariat affairs of his detachment, and could never be found +when he was wanted--that chevalier sans peur et sans reproche* as he +styled himself--who was fond of parleys with the French, sent envoys +demanding their surrender, wasted time, and did not do what he was +ordered to do. + + +*Knight without fear and without reproach. + + +"I give you that column, lads," he said, riding up to the troops and +pointing out the French to the cavalry. + +And the cavalry, with spurs and sabers urging on horses that could +scarcely move, trotted with much effort to the column presented to +them--that is to say, to a crowd of Frenchmen stark with cold, +frost-bitten, and starving--and the column that had been presented +to them threw down its arms and surrendered as it had long been +anxious to do. + +At Krasnoe they took twenty-six thousand prisoners, several +hundred cannon, and a stick called a "marshal's staff," and disputed +as to who had distinguished himself and were pleased with their +achievement--though they much regretted not having taken Napoleon, +or at least a marshal or a hero of some sort, and reproached one +another and especially Kutuzov for having failed to do so. + +These men, carried away by their passions, were but blind tools of +the most melancholy law of necessity, but considered themselves heroes +and imagined that they were accomplishing a most noble and honorable +deed. They blamed Kutuzov and said that from the very beginning of the +campaign he had prevented their vanquishing Napoleon, that he +thought nothing but satisfying his passions and would not advance from +the Linen Factories because he was comfortable there, that at +Krasnoe he checked the advance because on learning that Napoleon was +there he had quite lost his head, and that it was probable that he had +an understanding with Napoleon and had been bribed by him, and so +on, and so on. + +Not only did his contemporaries, carried away by their passions, +talk in this way, but posterity and history have acclaimed Napoleon as +grand, while Kutuzov is described by foreigners as a crafty, +dissolute, weak old courtier, and by Russians as something indefinite- +a sort of puppet useful only because he had a Russian name. + + + + + +CHAPTER V + + +In 1812 and 1813 Kutuzov was openly accused of blundering. The +Emperor was dissatisfied with him. And in a history recently written +by order of the Highest Authorities it is said that Kutuzov was a +cunning court liar, frightened of the name of Napoleon, and that by +his blunders at Krasnoe and the Berezina he deprived the Russian +army of the glory of complete victory over the French.* + + +*History of the year 1812. The character of Kutuzov and +reflections on the unsatisfactory results of the battles at Krasnoe, +by Bogdanovich. + + +Such is the fate not of great men (grands hommes) whom the Russian +mind does not acknowledge, but of those rare and always solitary +individuals who, discerning the will of Providence, submit their +personal will to it. The hatred and contempt of the crowd punish +such men for discerning the higher laws. + +For Russian historians, strange and terrible to say, Napoleon- +that most insignificant tool of history who never anywhere, even in +exile, showed human dignity--Napoleon is the object of adulation and +enthusiasm; he is grand. But Kutuzov--the man who from the beginning +to the end of his activity in 1812, never once swerving by word or +deed from Borodino to Vilna, presented an example exceptional in +history of self-sacrifice and a present consciousness of the future +importance of what was happening--Kutuzov seems to them something +indefinite and pitiful, and when speaking of him and of the year +1812 they always seem a little ashamed. + +And yet it is difficult to imagine an historical character whose +activity was so unswervingly directed to a single aim; and it would be +difficult to imagine any aim more worthy or more consonant with the +will of the whole people. Still more difficult would it be to find +an instance in history of the aim of an historical personage being +so completely accomplished as that to which all Kutuzov's efforts were +directed in 1812. + +Kutuzov never talked of "forty centuries looking down from the +Pyramids," of the sacrifices he offered for the fatherland, or of what +he intended to accomplish or had accomplished; in general he said +nothing about himself, adopted no prose, always appeared to be the +simplest and most ordinary of men, and said the simplest and most +ordinary things. He wrote letters to his daughters and to Madame de +Stael, read novels, liked the society of pretty women, jested with +generals, officers, and soldiers, and never contradicted those who +tried to prove anything to him. When Count Rostopchin at the Yauza +bridge galloped up to Kutuzov with personal reproaches for having +caused the destruction of Moscow, and said: "How was it you promised +not to abandon Moscow without a battle?" Kutuzov replied: "And I shall +not abandon Moscow without a battle," though Moscow was then already +abandoned. When Arakcheev, coming to him from the Emperor, said that +Ermolov ought to be appointed chief of the artillery, Kutuzov replied: +"Yes, I was just saying so myself," though a moment before he had said +quite the contrary. What did it matter to him--who then alone amid a +senseless crowd understood the whole tremendous significance of what +was happening--what did it matter to him whether Rostopchin attributed +the calamities of Moscow to him or to himself? Still less could it +matter to him who was appointed chief of the artillery. + +Not merely in these cases but continually did that old man--who by +experience of life had reached the conviction that thoughts and the +words serving as their expression are not what move people--use +quite meaningless words that happened to enter his head. + +But that man, so heedless of his words, did not once during the +whole time of his activity utter one word inconsistent with the single +aim toward which he moved throughout the whole war. Obviously in spite +of himself, in very diverse circumstances, he repeatedly expressed his +real thoughts with the bitter conviction that he would not be +understood. Beginning with the battle of Borodino, from which time his +disagreement with those about him began, he alone said that the battle +of Borodino was a victory, and repeated this both verbally and in +his dispatches and reports up to the time of his death. He alone +said that the loss of Moscow is not the loss of Russia. In reply to +Lauriston's proposal of peace, he said: There can be no peace, for +such is the people's will. He alone during the retreat of the French +said that all our maneuvers are useless, everything is being +accomplished of itself better than we could desire; that the enemy +must be offered "a golden bridge"; that neither the Tarutino, the +Vyazma, nor the Krasnoe battles were necessary; that we must keep some +force to reach the frontier with, and that he would not sacrifice a +single Russian for ten Frenchmen. + +And this courtier, as he is described to us, who lies to Arakcheev +to please the Emperor, he alone--incurring thereby the Emperor's +displeasure--said in Vilna that to carry the war beyond the frontier +is useless and harmful. + +Nor do words alone prove that only he understood the meaning of +the events. His actions--without the smallest deviation--were all +directed to one and the same threefold end: (1) to brace all his +strength for conflict with the French, (2) to defeat them, and (3) +to drive them out of Russia, minimizing as far as possible the +sufferings of our people and of our army. + +This procrastinator Kutuzov, whose motto was "Patience and Time," +this enemy of decisive action, gave battle at Borodino, investing +the preparations for it with unparalleled solemnity. This Kutuzov +who before the battle of Austerlitz began said that it would be +lost, he alone, in contradiction to everyone else, declared till his +death that Borodino was a victory, despite the assurance of generals +that the battle was lost and despite the fact that for an army to have +to retire after winning a battle was unprecedented. He alone during +the whole retreat insisted that battles, which were useless then, +should not be fought, and that a new war should not be begun nor the +frontiers of Russia crossed. + +It is easy now to understand the significance of these events--if +only we abstain from attributing to the activity of the mass aims that +existed only in the heads of a dozen individuals--for the events and +results now lie before us. + +But how did that old man, alone, in opposition to the general +opinion, so truly discern the importance of the people's view of the +events that in all his activity he was never once untrue to it? + +The source of that extraordinary power of penetrating the meaning of +the events then occuring lay in the national feeling which he +possessed in full purity and strength. + +Only the recognition of the fact that he possessed this feeling +caused the people in so strange a manner, contrary to the Tsar's wish, +to select him--an old man in disfavor--to be their representative in +the national war. And only that feeling placed him on that highest +human pedestal from which he, the commander in chief, devoted all +his powers not to slaying and destroying men but to saving and showing +pity on them. + +That simple, modest, and therefore truly great, figure could not +be cast in the false mold of a European hero--the supposed ruler of +men--that history has invented. + +To a lackey no man can be great, for a lackey has his own conception +of greatness. + + + + + +CHAPTER VI + + +The fifth of November was the first day of what is called the battle +of Krasnoe. Toward evening--after much disputing and many mistakes +made by generals who did not go to their proper places, and after +adjutants had been sent about with counterorders--when it had become +plain that the enemy was everywhere in flight and that there could and +would be no battle, Kutuzov left Krasnoe and went to Dobroe whither +his headquarters had that day been transferred. + +The day was clear and frosty. Kutuzov rode to Dobroe on his plump +little white horse, followed by an enormous suite of discontented +generals who whispered among themselves behind his back. All along the +road groups of French prisoners captured that day (there were seven +thousand of them) were crowding to warm themselves at campfires. +Near Dobroe an immense crowd of tattered prisoners, buzzing with +talk and wrapped and bandaged in anything they had been able to get +hold of, were standing in the road beside a long row of unharnessed +French guns. At the approach of the commander in chief the buzz of +talk ceased and all eyes were fixed on Kutuzov who, wearing a white +cap with a red band and a padded overcoat that bulged on his round +shoulders, moved slowly along the road on his white horse. One of +the generals was reporting to him where the guns and prisoners had +been captured. + +Kutuzov seemed preoccupied and did not listen to what the general +was saying. He screwed up his eyes with a dissatisfied look as he +gazed attentively and fixedly at these prisoners, who presented a +specially wretched appearance. Most of them were disfigured by +frost-bitten noses and cheeks, and nearly all had red, swollen and +festering eyes. + +One group of the French stood close to the road, and two of them, +one of whom had his face covered with sores, were tearing a piece of +raw flesh with their hands. There was something horrible and bestial +in the fleeting glance they threw at the riders and in the +malevolent expression with which, after a glance at Kutuzov, the +soldier with the sores immediately turned away and went on with what +he was doing. + +Kutuzov looked long and intently at these two soldiers. He +puckered his face, screwed up his eyes, and pensively swayed his head. +At another spot he noticed a Russian soldier laughingly patting a +Frenchman on the shoulder, saying something to him in a friendly +manner, and Kutuzov with the same expression on his face again +swayed his head. + +"What were you saying?" he asked the general, who continuing his +report directed the commander in chief's attention to some standards +captured from the French and standing in front of the Preobrazhensk +regiment. + +"Ah, the standards!" said Kutuzov, evidently detaching himself +with difficulty from the thoughts that preoccupied him. + +He looked about him absently. Thousands of eyes were looking at +him from all sides awaiting a word from him. + +He stopped in front of the Preobrazhensk regiment, sighed deeply, +and closed his eyes. One of his suite beckoned to the soldiers +carrying the standards to advance and surround the commander in +chief with them. Kutuzov was silent for a few seconds and then, +submitting with evident reluctance to the duty imposed by his +position, raised his head and began to speak. A throng of officers +surrounded him. He looked attentively around at the circle of +officers, recognizing several of them. + +"I thank you all!" he said, addressing the soldiers and then again +the officers. In the stillness around him his slowly uttered words +were distinctly heard. "I thank you all for your hard and faithful +service. The victory is complete and Russia will not forget you! Honor +to you forever." + +He paused and looked around. + +"Lower its head, lower it!" he said to a soldier who had +accidentally lowered the French eagle he was holding before the +Preobrazhensk standards. "Lower, lower, that's it. Hurrah lads!" he +added, addressing the men with a rapid movement of his chin. + +"Hur-r-rah!" roared thousands of voices. + +While the soldiers were shouting Kutuzov leaned forward in his +saddle and bowed his head, and his eye lit up with a mild and +apparently ironic gleam. + +"You see, brothers..." said he when the shouts had ceased... and all +at once his voice and the expression of his face changed. It was no +longer the commander in chief speaking but an ordinary old man who +wanted to tell his comrades something very important. + +There was a stir among the throng of officers and in the ranks of +the soldiers, who moved that they might hear better what he was +going to say. + +"You see, brothers, I know it's hard for you, but it can't be +helped! Bear up; it won't be for long now! We'll see our visitors +off and then we'll rest. The Tsar won't forget your service. It is +hard for you, but still you are at home while they--you see what +they have come to," said he, pointing to the prisoners. "Worse off +than our poorest beggars. While they were strong we didn't spare +ourselves, but now we may even pity them. They are human beings too. +Isn't it so, lads?" + +He looked around, and in the direct, respectful, wondering gaze +fixed upon him he read sympathy with what he had said. His face grew +brighter and brighter with an old man's mild smile, which drew the +corners of his lips and eyes into a cluster of wrinkles. He ceased +speaking and bowed his head as if in perplexity. + +"But after all who asked them here? Serves them right, the bloody +bastards!" he cried, suddenly lifting his head. + +And flourishing his whip he rode off at a gallop for the first +time during the whole campaign, and left the broken ranks of the +soldiers laughing joyfully and shouting "Hurrah!" + +Kutuzov's words were hardly understood by the troops. No one could +have repeated the field marshal's address, begun solemnly and then +changing into an old man's simplehearted talk; but the hearty +sincerity of that speech, the feeling of majestic triumph combined +with pity for the foe and consciousness of the justice of our cause, +exactly expressed by that old man's good-natured expletives, was not +merely understood but lay in the soul of every soldier and found +expression in their joyous and long-sustained shouts. Afterwards +when one of the generals addressed Kutuzov asking whether he wished +his caleche to be sent for, Kutuzov in answering unexpectedly gave a +sob, being evidently greatly moved. + + + + + +CHAPTER VII + + +When the troops reached their night's halting place on the eighth of +November, the last day of the Krasnoe battles, it was already +growing dusk. All day it had been calm and frosty with occasional +lightly falling snow and toward evening it began to clear. Through the +falling snow a purple-black and starry sky showed itself and the frost +grew keener. + +An infantry regiment which had left Tarutino three thousand strong +but now numbered only nine hundred was one of the first to arrive that +night at its halting place--a village on the highroad. The +quartermasters who met the regiment announced that all the huts were +full of sick and dead Frenchmen, cavalrymen, and members of the staff. +There was only one hut available for the regimental commander. + +The commander rode up to his hut. The regiment passed through the +village and stacked its arms in front of the last huts. + +Like some huge many-limbed animal, the regiment began to prepare its +lair and its food. One part of it dispersed and waded knee-deep +through the snow into a birch forest to the right of the village, +and immediately the sound of axes and swords, the crashing of +branches, and merry voices could be heard from there. Another +section amid the regimental wagons and horses which were standing in a +group was busy getting out caldrons and rye biscuit, and feeding the +horses. A third section scattered through the village arranging +quarters for the staff officers, carrying out the French corpses +that were in the huts, and dragging away boards, dry wood, and +thatch from the roofs, for the campfires, or wattle fences to serve +for shelter. + +Some fifteen men with merry shouts were shaking down the high wattle +wall of a shed, the roof of which had already been removed. + +"Now then, all together--shove!" cried the voices, and the huge +surface of the wall, sprinkled with snow and creaking with frost, +was seen swaying in the gloom of the night. The lower stakes cracked +more and more and at last the wall fell, and with it the men who had +been pushing it. Loud, coarse laughter and joyous shouts ensued. + +"Now then, catch hold in twos! Hand up the lever! That's it... Where +are you shoving to?" + +"Now, all together! But wait a moment, boys... With a song!" + +All stood silent, and a soft, pleasant velvety voice began to +sing. At the end of the third verse as the last note died away, twenty +voices roared out at once: "Oo-oo-oo-oo! That's it. All together! +Heave away, boys!..." but despite their united efforts the wattle +hardly moved, and in the silence that followed the heavy breathing +of the men was audible. + +"Here, you of the Sixth Company! Devils that you are! Lend a hand... +will you? You may want us one of these days." + +Some twenty men of the Sixth Company who were on their way into +the village joined the haulers, and the wattle wall, which was about +thirty-five feet long and seven feet high, moved forward along the +village street, swaying, pressing upon and cutting the shoulders of +the gasping men. + +"Get along... Falling? What are you stopping for? There now..." + +Merry senseless words of abuse flowed freely. + +"What are you up to?" suddenly came the authoritative voice of a +sergeant major who came upon the men who were hauling their burden. +"There are gentry here; the general himself is in that hut, and you +foul-mouthed devils, you brutes, I'll give it to you!" shouted he, +hitting the first man who came in his way a swinging blow on the back. +"Can't you make less noise?" + +The men became silent. The soldier who had been struck groaned and +wiped his face, which had been scratched till it bled by his falling +against the wattle. + +"There, how that devil hits out! He's made my face all bloody," said +he in a frightened whisper when the sergeant major had passed on. + +"Don't you like it?" said a laughing voice, and moderating their +tones the men moved forward. + +When they were out of the village they began talking again as loud +as before, interlarding their talk with the same aimless expletives. + +In the hut which the men had passed, the chief officers had gathered +and were in animated talk over their tea about the events of the day +and the maneuvers suggested for tomorrow. It was proposed to make a +flank march to the left, cut off the Vice-King (Murat) and capture +him. + +By the time the soldiers had dragged the wattle fence to its place +the campfires were blazing on all sides ready for cooking, the wood +crackled, the snow was melting, and black shadows of soldiers +flitted to and fro all over the occupied space where the snow had been +trodden down. + +Axes and choppers were plied all around. Everything was done without +any orders being given. Stores of wood were brought for the night, +shelters were rigged up for the officers, caldrons were being +boiled, and muskets and accouterments put in order. + +The wattle wall the men had brought was set up in a semicircle by +the Eighth Company as a shelter from the north, propped up by musket +rests, and a campfire was built before it. They beat the tattoo, +called the roll, had supper, and settled down round the fires for +the night--some repairing their footgear, some smoking pipes, and some +stripping themselves naked to steam the lice out of their shirts. + + + + + +CHAPTER VIII + + +One would have thought that under the almost incredibly wretched +conditions the Russian soldiers were in at that time--lacking warm +boots and sheepskin coats, without a roof over their heads, in the +snow with eighteen degrees of frost, and without even full rations +(the commissariat did not always keep up with the troops)--they +would have presented a very sad and depressing spectacle. + +On the contrary, the army had never under the best material +conditions presented a more cheerful and animated aspect. This was +because all who began to grow depressed or who lost strength were +sifted out of the army day by day. All the physically or morally +weak had long since been left behind and only the flower of the +army--physically and mentally--remained. + +More men collected behind the wattle fence of the Eighth Company +than anywhere else. Two sergeants major were sitting with them and +their campfire blazed brighter than others. For leave to sit by +their wattle they demanded contributions of fuel. + +"Eh, Makeev! What has become of you, you son of a bitch? Are you +lost or have the wolves eaten you? Fetch some more wood!" shouted a +red-haired and red-faced man, screwing up his eyes and blinking +because of the smoke but not moving back from the fire. "And you, +Jackdaw, go and fetch some wood!" said he to another soldier. + +This red-haired man was neither a sergeant nor a corporal, but being +robust he ordered about those weaker than himself. The soldier they +called "Jackdaw," a thin little fellow with a sharp nose, rose +obediently and was about to go but at that instant there came into the +light of the fire the slender, handsome figure of a young soldier +carrying a load of wood. + +"Bring it here--that's fine!" + +They split up the wood, pressed it down on the fire, blew at it with +their mouths, and fanned it with the skirts of their greatcoats, +making the flames hiss and crackle. The men drew nearer and lit +their pipes. The handsome young soldier who had brought the wood, +setting his arms akimbo, began stamping his cold feet rapidly and +deftly on the spot where he stood. + +"Mother! The dew is cold but clear.... It's well that I'm a +musketeer..." he sang, pretending to hiccough after each syllable. + +"Look out, your soles will fly off!" shouted the red-haired man, +noticing that the sole of the dancer's boot was hanging loose. "What a +fellow you are for dancing!" + +The dancer stopped, pulled off the loose piece of leather, and threw +it on the fire. + +"Right enough, friend," said he, and, having sat down, took out of +his knapsack a scrap of blue French cloth, and wrapped it round his +foot. "It's the steam that spoils them," he added, stretching out +his feet toward the fire. + +"They'll soon be issuing us new ones. They say that when we've +finished hammering them, we're to receive double kits!" + +"And that son of a bitch Petrov has lagged behind after all, it +seems," said one sergeant major. + +"I've had an eye on him this long while," said the other. + +"Well, he's a poor sort of soldier..." + +"But in the Third Company they say nine men were missing yesterday." + +"Yes, it's all very well, but when a man's feet are frozen how can +he walk?" + +"Eh? Don't talk nonsense!" said a sergeant major. + +"Do you want to be doing the same?" said an old soldier, turning +reproachfully to the man who had spoken of frozen feet. + +"Well, you know," said the sharp-nosed man they called Jackdaw in +a squeaky and unsteady voice, raising himself at the other side of the +fire, "a plump man gets thin, but for a thin one it's death. Take +me, now! I've got no strength left," he added, with sudden +resolution turning to the sergeant major. "Tell them to send me to + +hospital; I'm aching all over; anyway I shan't be able to keep up." + +"That'll do, that'll do!" replied the sergeant major quietly. + +The soldier said no more and the talk went on. + +"What a lot of those Frenchies were taken today, and the fact is +that not one of them had what you might call real boots on," said a +soldier, starting a new theme. "They were no more than make-believes." + +"The Cossacks have taken their boots. They were clearing the hut for +the colonel and carried them out. It was pitiful to see them, boys," +put in the dancer. "As they turned them over one seemed still alive +and, would you believe it, he jabbered something in their lingo." + +"But they're a clean folk, lads," the first man went on; "he was +white--as white as birchbark--and some of them are such fine +fellows, you might think they were nobles." + +"Well, what do you think? They make soldiers of all classes there." + +"But they don't understand our talk at all," said the dancer with +a puzzled smile. "I asked him whose subject he was, and he jabbered in +his own way. A queer lot!" + +"But it's strange, friends," continued the man who had wondered at +their whiteness, "the peasants at Mozhaysk were saying that when +they began burying the dead--where the battle was you know--well, +those dead had been lying there for nearly a month, and says the +peasant, 'they lie as white as paper, clean, and not as much smell +as a puff of powder smoke.'" + +"Was it from the cold?" asked someone. + +"You're a clever fellow! From the cold indeed! Why, it was hot. If +it had been from the cold, ours would not have rotted either. 'But,' +he says, 'go up to ours and they are all rotten and maggoty. So,' he +says, 'we tie our faces up with kerchiefs and turn our heads away as +we drag them off: we can hardly do it. But theirs,' he says, 'are +white as paper and not so much smell as a whiff of gunpowder.'" + +All were silent. + +"It must be from their food," said the sergeant major. "They used to +gobble the same food as the gentry." + +No one contradicted him. + +"That peasant near Mozhaysk where the battle was said the men were +all called up from ten villages around and they carted for twenty days +and still didn't finish carting the dead away. And as for the +wolves, he says..." + +"That was a real battle," said an old soldier. "It's the only one +worth remembering; but since that... it's only been tormenting folk." + +"And do you know, Daddy, the day before yesterday we ran at them +and, my word, they didn't let us get near before they just threw +down their muskets and went on their knees. 'Pardon!' they say. That's +only one case. They say Platov took 'Poleon himself twice. But he +didn't know the right charm. He catches him and catches him--no +good! He turns into a bird in his hands and flies away. And there's no +way of killing him either." + +"You're a first-class liar, Kiselev, when I come to look at you!" + +"Liar, indeed! It's the real truth." + +"If he fell into my hands, when I'd caught him I'd bury him in the +ground with an aspen stake to fix him down. What a lot of men he's +ruined!" + +"Well, anyhow we're going to end it. He won't come here again," +remarked the old soldier, yawning. + +The conversation flagged, and the soldiers began settling down to +sleep. + +"Look at the stars. It's wonderful how they shine! You would think +the women had spread out their linen," said one of the men, gazing +with admiration at the Milky Way. + +"That's a sign of a good harvest next year." + +"We shall want some more wood." + +"You warm your back and your belly gets frozen. That's queer." + +"O Lord!" + +"What are you pushing for? Is the fire only for you? Look how he's +sprawling!" + +In the silence that ensued, the snoring of those who had fallen +asleep could be heard. Others turned over and warmed themselves, now +and again exchanging a few words. From a campfire a hundred paces +off came a sound of general, merry laughter. + +"Hark at them roaring there in the Fifth Company!" said one of the +soldiers, "and what a lot of them there are!" + +One of the men got up and went over to the Fifth Company. + +"They're having such fun," said he, coming back. "Two Frenchies have +turned up. One's quite frozen and the other's an awful swaggerer. He's +singing songs...." + +"Oh, I'll go across and have a look...." + +And several of the men went over to the Fifth Company. + + + + + +CHAPTER IX + + +The fifth company was bivouacking at the very edge of the forest. +A huge campfire was blazing brightly in the midst of the snow, +lighting up the branches of trees heavy with hoarfrost. + +About midnight they heard the sound of steps in the snow of the +forest, and the crackling of dry branches. + +"A bear, lads," said one of the men. + +They all raised their heads to listen, and out of the forest into +the bright firelight stepped two strangely clad human figures clinging +to one another. + +These were two Frenchmen who had been hiding in the forest. They +came up to the fire, hoarsely uttering something in a language our +soldiers did not understand. One was taller than the other; he wore an +officer's hat and seemed quite exhausted. On approaching the fire he +had been going to sit down, but fell. The other, a short sturdy +soldier with a shawl tied round his head, was stronger. He raised +his companion and said something, pointing to his mouth. The +soldiers surrounded the Frenchmen, spread a greatcoat on the ground +for the sick man, and brought some buckwheat porridge and vodka for +both of them. + +The exhausted French officer was Ramballe and the man with his +head wrapped in the shawl was Morel, his orderly. + +When Morel had drunk some vodka and finished his bowl of porridge he +suddenly became unnaturally merry and chattered incessantly to the +soldiers, who could not understand him. Ramballe refused food and +resting his head on his elbow lay silent beside the campfire, +looking at the Russian soldiers with red and vacant eyes. Occasionally +he emitted a long-drawn groan and then again became silent. Morel, +pointing to his shoulders, tried to impress on the soldiers the fact +that Ramballe was an officer and ought to be warmed. A Russian officer +who had come up to the fire sent to ask his colonel whether he would +not take a French officer into his hut to warm him, and when the +messenger returned and said that the colonel wished the officer to +be brought to him, Ramballe was told to go. He rose and tried to walk, +but staggered and would have fallen had not a soldier standing by held +him up. + +"You won't do it again, eh?" said one of the soldiers, winking and +turning mockingly to Ramballe. + +"Oh, you fool! Why talk rubbish, lout that you are--a real peasant!" +came rebukes from all sides addressed to the jesting soldier. + +They surrounded Ramballe, lifted him on the crossed arms of two +soldiers, and carried him to the hut. Ramballe put his arms around +their necks while they carried him and began wailing plaintively: + +"Oh, you fine fellows, my kind, kind friends! These are men! Oh, +my brave, kind friends," and he leaned his head against the shoulder +of one of the men like a child. + +Meanwhile Morel was sitting in the best place by the fire, +surrounded by the soldiers. + +Morel, a short sturdy Frenchman with inflamed and streaming eyes, +was wearing a woman's cloak and had a shawl tied woman fashion round +his head over his cap. He was evidently tipsy, and was singing a +French song in a hoarse broken voice, with an arm thrown round the +nearest soldier. The soldiers simply held their sides as they +watched him. + +"Now then, now then, teach us how it goes! I'll soon pick it up. How +is it?" said the man--a singer and a wag--whom Morel was embracing. + +"Vive Henri Quatre! Vive ce roi valiant!" sang Morel, winking. "Ce +diable a quatre..."* + + +*"Long live Henry the Fourth, that valiant king! That rowdy devil." + + +"Vivarika! Vif-seruvaru! Sedyablyaka!" repeated the soldier, +flourishing his arm and really catching the tune. + +"Bravo! Ha, ha, ha!" rose their rough, joyous laughter from all +sides. + +Morel, wrinkling up his face, laughed too. + +"Well, go on, go on!" + + "Qui eut le triple talent, + De boire, de battre, + Et d'etre un vert galant."* + + +*Who had a triple talent + + For drinking, for fighting, + + And for being a gallant old boy... + + +"It goes smoothly, too. Well, now, Zaletaev!" + +"Ke..." Zaletaev, brought out with effort: "ke-e-e-e," he drawled, +laboriously pursing his lips, "le-trip-ta-la-de-bu-de-ba, e +de-tra-va-ga-la" he sang. + +"Fine! Just like the Frenchie! Oh, ho ho! Do you want some more to +eat?" + +"Give him some porridge: it takes a long time to get filled up after +starving." + +They gave him some more porridge and Morel with a laugh set to +work on his third bowl. All the young soldiers smiled gaily as they +watched him. The older men, who thought it undignified to amuse +themselves with such nonsense, continued to lie at the opposite side +of the fire, but one would occasionally raise himself on an elbow +and glance at Morel with a smile. + +"They are men too," said one of them as he wrapped himself up in his +coat. "Even wormwood grows on its own root." + +"O Lord, O Lord! How starry it is! Tremendous! That means a hard +frost...." + +They all grew silent. The stars, as if knowing that no one was +looking at them, began to disport themselves in the dark sky: now +flaring up, now vanishing, now trembling, they were busy whispering +something gladsome and mysterious to one another. + + + + + +CHAPTER X + + +The French army melted away at the uniform rate of a mathematical +progression; and that crossing of the Berezina about which so much has +been written was only one intermediate stage in its destruction, and +not at all the decisive episode of the campaign. If so much has been +and still is written about the Berezina, on the French side this is +only because at the broken bridge across that river the calamities +their army had been previously enduring were suddenly concentrated +at one moment into a tragic spectacle that remained in every memory, +and on the Russian side merely because in Petersburg--far from the +seat of war--a plan (again one of Pfuel's) had been devised to catch +Napoleon in a strategic trap at the Berezina River. Everyone assured +himself that all would happen according to plan, and therefore +insisted that it was just the crossing of the Berezina that +destroyed the French army. In reality the results of the crossing were +much less disastrous to the French--in guns and men lost--than Krasnoe +had been, as the figures show. + +The sole importance of the crossing of the Berezina lies in the fact +that it plainly and indubitably proved the fallacy of all the plans +for cutting off the enemy's retreat and the soundness of the only +possible line of action--the one Kutuzov and the general mass of the +army demanded--namely, simply to follow the enemy up. The French crowd +fled at a continually increasing speed and all its energy was directed +to reaching its goal. It fled like a wounded animal and it was +impossible to block its path. This was shown not so much by the +arrangements it made for crossing as by what took place at the +bridges. When the bridges broke down, unarmed soldiers, people from +Moscow and women with children who were with the French transport, +all--carried on by vis inertiae--pressed forward into boats and into +the ice-covered water and did not, surrender. + +That impulse was reasonable. The condition of fugitives and of +pursuers was equally bad. As long as they remained with their own +people each might hope for help from his fellows and the definite +place he held among them. But those who surrendered, while remaining +in the same pitiful plight, would be on a lower level to claim a share +in the necessities of life. The French did not need to be informed +of the fact that half the prisoners--with whom the Russians did not +know what to do--perished of cold and hunger despite their captors' +desire to save them; they felt that it could not be otherwise. The +most compassionate Russian commanders, those favorable to the +French--and even the Frenchmen in the Russian service--could do +nothing for the prisoners. The French perished from the conditions +to which the Russian army was itself exposed. It was impossible to +take bread and clothes from our hungry and indispensable soldiers to +give to the French who, though not harmful, or hated, or guilty, +were simply unnecessary. Some Russians even did that, but they were +exceptions. + +Certain destruction lay behind the French but in front there was +hope. Their ships had been burned, there was no salvation save in +collective flight, and on that the whole strength of the French was +concentrated. + +The farther they fled the more wretched became the plight of the +remnant, especially after the Berezina, on which (in consequence of +the Petersburg plan) special hopes had been placed by the Russians, +and the keener grew the passions of the Russian commanders, blamed one +another and Kutuzov most of all. Anticipation that the failure of +the Petersburg Berezina plan would be attributed to Kutuzov led to +dissatisfaction, contempt, and ridicule, more and more strongly +expressed. The ridicule and contempt were of course expressed in a +respectful form, making it impossible for him to ask wherein he was to +blame. They did not talk seriously to him; when reporting to him or +asking for his sanction they appeared to be fulfilling a regrettable +formality, but they winked behind his back and tried to mislead him at +every turn. + +Because they could not understand him all these people assumed +that it was useless to talk to the old man; that he would never +grasp the profundity of their plans, that he would answer with his +phrases (which they thought were mere phrases) about a "golden +bridge," about the impossibility of crossing the frontier with a crowd +of tatterdemalions, and so forth. They had heard all that before. +And all he said--that it was necessary to await provisions, or that +the men had no boots--was so simple, while what they proposed was so +complicated and clever, that it was evident that he was old and stupid +and that they, though not in power, were commanders of genius. + +After the junction with the army of the brilliant admiral and +Petersburg hero Wittgenstein, this mood and the gossip of the staff +reached their maximum. Kutuzov saw this and merely sighed and shrugged +his shoulders. Only once, after the affair of the Berezina, did he get +angry and write to Bennigsen (who reported separately to the +Emperor) the following letter: + +"On account of your spells of ill health, will your excellency +please be so good as to set off for Kaluga on receipt of this, and +there await further commands and appointments from His Imperial +Majesty." + +But after Bennigsen's departure, the Grand Duke Tsarevich +Constantine Pavlovich joined the army. He had taken part in the +beginning of the campaign but had subsequently been removed from the +army by Kutuzov. Now having come to the army, he informed Kutuzov of +the Emperor's displeasure at the poor success of our forces and the +slowness of their advance. The Emperor intended to join the army +personally in a few days' time. + +The old man, experienced in court as well as in military affairs- +this same Kutuzov who in August had been chosen commander in chief +against the sovereign's wishes and who had removed the Grand Duke +and heir--apparent from the army--who on his own authority and +contrary to the Emperor's will had decided on the abandonment of +Moscow, now realized at once that his day was over, that his part +was played, and that the power he was supposed to hold was no longer +his. And he understood this not merely from the attitude of the court. +He saw on the one hand that the military business in which he had +played his part was ended and felt that his mission was +accomplished; and at the same time he began to be conscious of the +physical weariness of his aged body and of the necessity of physical +rest. + +On the twenty-ninth of November Kutuzov entered Vilna--his "dear +Vilna" as he called it. Twice during his career Kutuzov had been +governor of Vilna. In that wealthy town, which had not been injured, +he found old friends and associations, besides the comforts of life of +which he had so long been deprived. And he suddenly turned from the +cares of army and state and, as far as the passions that seethed +around him allowed, immersed himself in the quiet life to which he had +formerly been accustomed, as if all that was taking place and all that +had still to be done in the realm of history did not concern him at +all. + +Chichagov, one of the most zealous "cutters-off" and +"breakers-up," who had first wanted to effect a diversion in Greece +and then in Warsaw but never wished to go where he was sent: +Chichagov, noted for the boldness with which he spoke to the +Emperor, and who considered Kutuzov to be under an obligation to him +because when he was sent to make peace with Turkey in 1811 +independently of Kutuzov, and found that peace had already been +concluded, he admitted to the Emperor that the merit of securing +that peace was really Kutuzov's; this Chichagov was the first to +meet Kutuzov at the castle where the latter was to stay. In undress +naval uniform, with a dirk, and holding his cap under his arm, he +handed Kutuzov a garrison report and the keys of the town. The +contemptuously respectful attitude of the younger men to the old man +in his dotage was expressed in the highest degree by the behavior of +Chichagov, who knew of the accusations that were being directed +against Kutuzov. + +When speaking to Chichagov, Kutuzov incidentally mentioned that +the vehicles packed with china that had been captured from him at +Borisov had been recovered and would be restored to him. + +"You mean to imply that I have nothing to eat out of.... On the +contrary, I can supply you with everything even if you want to give +dinner parties," warmly replied Chichagov, who tried by every word +he spoke to prove his own rectitude and therefore imagined Kutuzov +to be animated by the same desire. + +Kutuzov, shrugging his shoulders, replied with his subtle +penetrating smile: "I meant merely to say what I said." + +Contrary to the Emperor's wish Kutuzov detained the greater part +of the army at Vilna. Those about him said that he became +extraordinarily slack and physically feeble during his stay in that +town. He attended to army affairs reluctantly, left everything to +his generals, and while awaiting the Emperor's arrival led a +dissipated life. + +Having left Petersburg on the seventh of December with his suite- +Count Tolstoy, Prince Volkonski, Arakcheev, and others--the Emperor +reached Vilna on the eleventh, and in his traveling sleigh drove +straight to the castle. In spite of the severe frost some hundred +generals and staff officers in full parade uniform stood in front of +the castle, as well as a guard of honor of the Semenov regiment. + +A courier who galloped to the castle in advance, in a troyka with +three foam-flecked horses, shouted "Coming!" and Konovnitsyn rushed +into the vestibule to inform Kutuzov, who was waiting in the hall +porter's little lodge. + +A minute later the old man's large stout figure in full-dress +uniform, his chest covered with orders and a scarf drawn round his +stomach, waddled out into the porch. He put on his hat with its +peaks to the sides and, holding his gloves in his hand and walking +with an effort sideways down the steps to the level of the street, +took in his hand the report he had prepared for the Emperor. + +There was running to and fro and whispering; another troyka +furiously up, and then all eyes were turned on an approaching sleigh +in which the figures of the Emperor and Volkonski could already be +descried. + +From the habit of fifty years all this had a physically agitating +effect on the old general. He carefully and hastily felt himself all +over, readjusted his hat, and pulling himself together drew himself up +and, at the very moment when the Emperor, having alighted from the +sleigh, lifted his eyes to him, handed him the report and began +speaking in his smooth, ingratiating voice. + +The Emperor with a rapid glance scanned Kutuzov from head to foot, +frowned for an instant, but immediately mastering himself went up to +the old man, extended his arms and embraced him. And this embrace too, +owing to a long-standing impression related to his innermost feelings, +had its usual effect on Kutuzov and he gave a sob. + +The Emperor greeted the officers and the Semenov guard, and again +pressing the old man's hand went with him into the castle. + +When alone with the field marshal the Emperor expressed his +dissatisfaction at the slowness of the pursuit and at the mistakes +made at Krasnoe and the Berezina, and informed him of his intentions +for a future campaign abroad. Kutuzov made no rejoinder or remark. The +same submissive, expressionless look with which he had listened to the +Emperor's commands on the field of Austerlitz seven years before +settled on his face now. + +When Kutuzov came out of the study and with lowered head was +crossing the ballroom with his heavy waddling gait, he was arrested by +someone's voice saying: + +"Your Serene Highness!" + +Kutuzov raised his head and looked for a long while into the eyes of +Count Tolstoy, who stood before him holding a silver salver on which +lay a small object. Kutuzov seemed not to understand what was expected +of him. + +Suddenly he seemed to remember; a scarcely perceptible smile flashed +across his puffy face, and bowing low and respectfully he took the +object that lay on the salver. It was the Order of St. George of the +First Class. + + + + + +CHAPTER XI + + +Next day the field marshal gave a dinner and ball which the +Emperor honored by his presence. Kutuzov had received the Order of St. +George of the First Class and the Emperor showed him the highest +honors, but everyone knew of the imperial dissatisfaction with him. +The proprieties were observed and the Emperor was the first to set +that example, but everybody understood that the old man was +blameworthy and good-for-nothing. When Kutuzov, conforming to a custom +of Catherine's day, ordered the standards that had been captured to be +lowered at the Emperor's feet on his entering the ballroom, the +Emperor made a wry face and muttered something in which some people +caught the words, "the old comedian." + +The Emperor's displeasure with Kutuzov was specially increased at +Vilna by the fact that Kutuzov evidently could not or would not +understand the importance of the coming campaign. + +When on the following morning the Emperor said to the officers +assembled about him: "You have not only saved Russia, you have saved +Europe!" they all understood that the war was not ended. + +Kutuzov alone would not see this and openly expressed his opinion +that no fresh war could improve the position or add to the glory of +Russia, but could only spoil and lower the glorious position that +Russia had gained. He tried to prove to the Emperor the +impossibility of levying fresh troops, spoke of the hardships +already endured by the people, of the possibility of failure and so +forth. + +This being the field marshal's frame of mind he was naturally +regarded as merely a hindrance and obstacle to the impending war. + +To avoid unpleasant encounters with the old man, the natural +method was to do what had been done with him at Austerlitz and with +Barclay at the beginning of the Russian campaign--to transfer the +authority to the Emperor himself, thus cutting the ground from under +the commander in chief's feet without upsetting the old man by +informing him of the change. + +With this object his staff was gradually reconstructed and its +real strength removed and transferred to the Emperor. Toll, +Konovnitsyn, and Ermolov received fresh appointments. Everyone spoke +loudly of the field marshal's great weakness and failing health. + +His health had to be bad for his place to be taken away and given to +another. And in fact his health was poor. + +So naturally, simply, and gradually--just as he had come from Turkey +to the Treasury in Petersburg to recruit the militia, and then to +the army when he was needed there--now when his part was played out, +Kutuzov's place was taken by a new and necessary performer. + +The war 1812, besides its national significance dear to every +Russian heart, was now to assume another, a European, significance. + +The movement of peoples from west to east was to be succeeded by a +movement of peoples from east to west, and for this fresh war +another leader was necessary, having qualities and views differing +from Kutuzov's and animated by different motives. + +Alexander I was as necessary for the movement of the peoples from +east to west and for the refixing of national frontiers as Kutuzov had +been for the salvation and glory of Russia. + +Kutuzov did not understand what Europe, the balance of power, or +Napoleon meant. He could not understand it. For the representative +of the Russian people, after the enemy had been destroyed and Russia +had been liberated and raised to the summit of her glory, there was +nothing left to do as a Russian. Nothing remained for the +representative of the national war but to die, and Kutuzov died. + + + + + +CHAPTER XII + + +As generally happens, Pierre did not feel the full effects of the +physical privation and strain he had suffered as prisoner until +after they were over. After his liberation he reached Orel, and on the +third day there, when preparing to go to Kiev, he fell ill and was +laid up for three months. He had what the doctors termed "bilious +fever." But despite the fact that the doctors treated him, bled him, +and gave him medicines to drink, he recovered. + +Scarcely any impression was left on Pierre's mind by all that +happened to him from the time of his rescue till his illness. He +remembered only the dull gray weather now rainy and now snowy, +internal physical distress, and pains in his feet and side. He +remembered a general impression of the misfortunes and sufferings of +people and of being worried by the curiosity of officers and +generals who questioned him, he also remembered his difficulty in +procuring a conveyance and horses, and above all he remembered his +incapacity to think and feel all that time. On the day of his rescue +he had seen the body of Petya Rostov. That same day he had learned +that Prince Andrew, after surviving the battle of Borodino for more +than a month had recently died in the Rostovs' house at Yaroslavl, and +Denisov who told him this news also mentioned Helene's death, +supposing that Pierre had heard of it long before. All this at the +time seemed merely strange to Pierre: he felt he could not grasp its +significance. Just then he was only anxious to get away as quickly +as possible from places where people were killing one another, to some +peaceful refuge where he could recover himself, rest, and think over +all the strange new facts he had learned; but on reaching Orel he +immediately fell ill. When he came to himself after his illness he saw +in attendance on him two of his servants, Terenty and Vaska, who had +come from Moscow; and also his cousin the eldest princess, who had +been living on his estate at Elets and hearing of his rescue and +illness had come to look after him. + +It was only gradually during his convalescence that Pierre lost +the impressions he had become accustomed to during the last few months +and got used to the idea that no one would oblige him to go anywhere +tomorrow, that no one would deprive him of his warm bed, and that he +would be sure to get his dinner, tea, and supper. But for a long +time in his dreams he still saw himself in the conditions of +captivity. In the same way little by little he came to understand +the news he had been told after his rescue, about the death of +Prince Andrew, the death of his wife, and the destruction of the +French. + +A joyous feeling of freedom--that complete inalienable freedom +natural to man which he had first experienced at the first halt +outside Moscow--filled Pierre's soul during his convalescence. He +was surprised to find that this inner freedom, which was independent +of external conditions, now had as it were an additional setting of +external liberty. He was alone in a strange town, without +acquaintances. No one demanded anything of him or sent him anywhere. +He had all he wanted: the thought of his wife which had been a +continual torment to him was no longer there, since she was no more. + +"Oh, how good! How splendid!" said he to himself when a cleanly laid +table was moved up to him with savory beef tea, or when he lay down +for the night on a soft clean bed, or when he remembered that the +French had gone and that his wife was no more. "Oh, how good, how +splendid!" + +And by old habit he asked himself the question: "Well, and what +then? What am I going to do?" And he immediately gave himself the +answer: "Well, I shall live. Ah, how splendid!" + +The very question that had formerly tormented him, the thing he +had continually sought to find--the aim of life--no longer existed for +him now. That search for the aim of life had not merely disappeared +temporarily--he felt that it no longer existed for him and could not +present itself again. And this very absence of an aim gave him the +complete, joyous sense of freedom which constituted his happiness at +this time. + +He could not see an aim, for he now had faith--not faith in any kind +of rule, or words, or ideas, but faith in an ever-living, +ever-manifest God. Formerly he had sought Him in aims he set +himself. That search for an aim had been simply a search for God, +and suddenly in his captivity he had learned not by words or reasoning +but by direct feeling what his nurse had told him long ago: that God +is here and everywhere. In his captivity he had learned that in +Karataev God was greater, more infinite and unfathomable than in the +Architect of the Universe recognized by the Freemasons. He felt like a +man who after straining his eyes to see into the far distance finds +what he sought at his very feet. All his life he had looked over the +heads of the men around him, when he should have merely looked in +front of him without straining his eyes. + +In the past he had never been able to find that great inscrutable +infinite something. He had only felt that it must exist somewhere +and had looked for it. In everything near and comprehensible he had +only what was limited, petty, commonplace, and senseless. He had +equipped himself with a mental telescope and looked into remote space, +where petty worldliness hiding itself in misty distance had seemed +to him great and infinite merely because it was not clearly seen. +And such had European life, politics, Freemasonry, philosophy, and +philanthropy seemed to him. But even then, at moments of weakness as +he had accounted them, his mind had penetrated to those distances +and he had there seen the same pettiness, worldliness, and +senselessness. Now, however, he had learned to see the great, eternal, +and infinite in everything, and therefore--to see it and enjoy its +contemplation--he naturally threw away the telescope through which +he had till now gazed over men's heads, and gladly regarded the +ever-changing, eternally great, unfathomable, and infinite life around +him. And the closer he looked the more tranquil and happy he became. +That dreadful question, "What for?" which had formerly destroyed all +his mental edifices, no longer existed for him. To that question, +"What for?" a simple answer was now always ready in his soul: "Because +there is a God, that God without whose will not one hair falls from +a man's head." + + + + + +CHAPTER XIII + + +In external ways Pierre had hardly changed at all. In appearance +he was just what he used to be. As before he was absent-minded and +seemed occupied not with what was before his eyes but with something +special of his own. The difference between his former and present self +was that formerly when he did not grasp what lay before him or was +said to him, he had puckered his forehead painfully as if vainly +seeking to distinguish something at a distance. At present he still +forgot what was said to him and still did not see what was before +his eyes, but he now looked with a scarcely perceptible and +seemingly ironic smile at what was before him and listened to what was +said, though evidently seeing and hearing something quite different. +Formerly he had appeared to be a kindhearted but unhappy man, and so +people had been inclined to avoid him. Now a smile at the joy of +life always played round his lips, and sympathy for others, shone in +his eyes with a questioning look as to whether they were as +contented as he was, and people felt pleased by his presence. + +Previously he had talked a great deal, grew excited when he +talked, and seldom listened; now he was seldom carried away in +conversation and knew how to listen so that people readily told him +their most intimate secrets. + +The princess, who had never liked Pierre and had been particularly +hostile to him since she had felt herself under obligations to him +after the old count's death, now after staying a short time in Orel- +where she had come intending to show Pierre that in spite of his +ingratitude she considered it her duty to nurse him--felt to her +surprise and vexation that she had become fond of him. Pierre did +not in any way seek her approval, he merely studied her with interest. +Formerly she had felt that he regarded her with indifference and +irony, and so had shrunk into herself as she did with others and had +shown him only the combative side of her nature; but now he seemed +to be trying to understand the most intimate places of her heart, and, +mistrustfully at first but afterwards gratefully, she let him see +the hidden, kindly sides of her character. + +The most cunning man could not have crept into her confidence more +successfully, evoking memories of the best times of her youth and +showing sympathy with them. Yet Pierre's cunning consisted simply in +finding pleasure in drawing out the human qualities of the embittered, +hard, and (in her own way) proud princess. + +"Yes, he is a very, very kind man when he is not under the influence +of bad people but of people such as myself," thought she. + +His servants too--Terenty and Vaska--in their own way noticed the +change that had taken place in Pierre. They considered that he had +become much "simpler." Terenty, when he had helped him undress and +wished him good night, often lingered with his master's boots in his +hands and clothes over his arm, to see whether he would not start a +talk. And Pierre, noticing that Terenty wanted a chat, generally +kept him there. + +"Well, tell me... now, how did you get food?" he would ask. + +And Terenty would begin talking of the destruction of Moscow, and of +the old count, and would stand for a long time holding the clothes and +talking, or sometimes listening to Pierre's stories, and then would go +out into the hall with a pleasant sense of intimacy with his master +and affection for him. + +The doctor who attended Pierre and visited him every day, though +he considered it his duty as a doctor to pose as a man whose every +moment was of value to suffering humanity, would sit for hours with +Pierre telling him his favorite anecdotes and his observations on +the characters of his patients in general, and especially of the +ladies. + +"It's a pleasure to talk to a man like that; he is not like our +provincials," he would say. + +There were several prisoners from the French army in Orel, and the +doctor brought one of them, a young Italian, to see Pierre. + +This officer began visiting Pierre, and the princess used to make +fun of the tenderness the Italian expressed for him. + +The Italian seemed happy only when he could come to see Pierre, talk +with him, tell him about his past, his life at home, and his love, and +pour out to him his indignation against the French and especially +against Napoleon. + +"If all Russians are in the least like you, it is sacrilege to fight +such a nation," he said to Pierre. "You, who have suffered so from the +French, do not even feel animosity toward them." + +Pierre had evoked the passionate affection of the Italian merely +by evoking the best side of his nature and taking a pleasure in so +doing. + +During the last days of Pierre's stay in Orel his old Masonic +acquaintance Count Willarski, who had introduced him to the lodge in +1807, came to see him. Willarski was married to a Russian heiress +who had a large estate in Orel province, and he occupied a temporary +post in the commissariat department in that town. + +Hearing that Bezukhov was in Orel, Willarski, though they had +never been intimate, came to him with the professions of friendship +and intimacy that people who meet in a desert generally express for +one another. Willarski felt dull in Orel and was pleased to meet a man +of his own circle and, as he supposed, of similar interests. + +But to his surprise Willarski soon noticed that Pierre had lagged +much behind the times, and had sunk, as he expressed it to himself, +into apathy and egotism. + +"You are letting yourself go, my dear fellow," he said. + +But for all that Willarski found it pleasanter now than it had +been formerly to be with Pierre, and came to see him every day. To +Pierre as he looked at and listened to Willarski, it seemed strange to +think that he had been like that himself but a short time before. + +Willarski was a married man with a family, busy with his family +affairs, his wife's affairs, and his official duties. He regarded +all these occupations as hindrances to life, and considered that +they were all contemptible because their aim was the welfare of +himself and his family. Military, administrative, political, and +Masonic interests continually absorbed his attention. And Pierre, +without trying to change the other's views and without condemning him, +but with the quiet, joyful, and amused smile now habitual to him, +was interested in this strange though very familiar phenomenon. + +There was a new feature in Pierre's relations with Willarski, with +the princess, with the doctor, and with all the people he now met, +which gained for him the general good will. This was his +acknowledgment of the impossibility of changing a man's convictions by +words, and his recognition of the possibility of everyone thinking, +feeling, and seeing things each from his own point of view. This +legitimate peculiarity of each individual which used to excite and +irritate Pierre now became a basis of the sympathy he felt for, and +the interest he took in, other people. The difference, and sometimes +complete contradiction, between men's opinions and their lives, and +between one man and another, pleased him and drew from him an amused +and gentle smile. + +In practical matters Pierre unexpectedly felt within himself a +center of gravity he had previously lacked. Formerly all pecuniary +questions, especially requests for money to which, as an extremely +wealthy man, he was very exposed, produced in him a state of +hopeless agitation and perplexity. "To give or not to give?" he had +asked himself. "I have it and he needs it. But someone else needs it +still more. Who needs it most? And perhaps they are both impostors?" +In the old days he had been unable to find a way out of all these +surmises and had given to all who asked as long as he had anything +to give. Formerly he had been in a similar state of perplexity with +regard to every question concerning his property, when one person +advised one thing and another something else. + +Now to his surprise he found that he no longer felt either doubt +or perplexity about these questions. There was now within him a +judge who by some rule unknown to him decided what should or should +not be done. + +He was as indifferent as heretofore to money matters, but now he +felt certain of what ought and what ought not to be done. The first +time he had recourse to his new judge was when a French prisoner, a +colonel, came to him and, after talking a great deal about his +exploits, concluded by making what amounted to a demand that Pierre +should give him four thousand francs to send to his wife and children. +Pierre refused without the least difficulty or effort, and was +afterwards surprised how simple and easy had been what used to +appear so insurmountably difficult. At the same time that he refused +the colonel's demand he made up his mind that he must have recourse to +artifice when leaving Orel, to induce the Italian officer to accept +some money of which he was evidently in need. A further proof to +Pierre of his own more settled outlook on practical matters was +furnished by his decision with regard to his wife's debts and to the +rebuilding of his houses in and near Moscow. + +His head steward came to him at Orel and Pierre reckoned up with him +his diminished income. The burning of Moscow had cost him, according +to the head steward's calculation, about two million rubles. + +To console Pierre for these losses the head steward gave him an +estimate showing that despite these losses his income would not be +diminished but would even be increased if he refused to pay his wife's +debts which he was under no obligation to meet, and did not rebuild +his Moscow house and the country house on his Moscow estate, which had +cost him eighty thousand rubles a year and brought in nothing. + +"Yes, of course that's true," said Pierre with a cheerful smile. +"I don't need all that at all. By being ruined I have become much +richer." + +But in January Savelich came from Moscow and gave him an account +of the state of things there, and spoke of the estimate an architect +had made of the cost of rebuilding the town and country houses, +speaking of this as of a settled matter. About the same time he +received letters from Prince Vasili and other Petersburg acquaintances +speaking of his wife's debts. And Pierre decided that the steward's +proposals which had so pleased him were wrong and that he must go to +Petersburg and settle his wife's affairs and must rebuild in Moscow. +Why this was necessary he did not know, but he knew for certain that +it was necessary. His income would be reduced by three fourths, but he +felt it must be done. + +Willarski was going to Moscow and they agreed to travel together. + +During the whole time of his convalescence in Orel Pierre had +experienced a feeling of joy, freedom, and life; but when during his +journey he found himself in the open world and saw hundreds of new +faces, that feeling was intensified. Throughout his journey he felt +like a schoolboy on holiday. Everyone--the stagecoach driver, the +post-house overseers, the peasants on the roads and in the villages- +had a new significance for him. The presence and remarks of +Willarski who continually deplored the ignorance and poverty of Russia +and its backwardness compared with Europe only heightened Pierre's +pleasure. Where Willarski saw deadness Pierre saw an extraordinary +strength and vitality--the strength which in that vast space amid +the snows maintained the life of this original, peculiar, and unique +people. He did not contradict Willarski and even seemed to agree +with him--an apparent agreement being the simplest way to avoid +discussions that could lead to nothing--and he smiled joyfully as he +listened to him. + + + + + +CHAPTER XIV + + +It would be difficult to explain why and whither ants whose heap has +been destroyed are hurrying: some from the heap dragging bits of +rubbish, larvae, and corpses, others back to the heap, or why they +jostle, overtake one another, and fight, and it would be equally +difficult to explain what caused the Russians after the departure of +the French to throng to the place that had formerly been Moscow. But +when we watch the ants round their ruined heap, the tenacity, +energy, and immense number of the delving insects prove that despite +the destruction of the heap, something indestructible, which though +intangible is the real strength of the colony, still exists; and +similarly, though in Moscow in the month of October there was no +government no churches, shrines, riches, or houses--it was still the +Moscow it had been in August. All was destroyed, except something +intangible yet powerful and indestructible. + +The motives of those who thronged from all sides to Moscow after +it had been cleared of the enemy were most diverse and personal, and +at first for the most part savage and brutal. One motive only they all +had in common: a desire to get to the place that had been called +Moscow, to apply their activities there. + +Within a week Moscow already had fifteen thousand inhabitants, in +a fortnight twenty-five thousand, and so on. By the autumn of 1813 the +number, ever increasing and increasing, exceeded what it had been in +1812. + +The first Russians to enter Moscow were the Cossacks of +Wintzingerode's detachment, peasants from the adjacent villages, and +residents who had fled from Moscow and had been hiding in its +vicinity. The Russians who entered Moscow, finding it plundered, +plundered it in their turn. They continued what the French had +begun. Trains of peasant carts came to Moscow to carry off to the +villages what had been abandoned in the ruined houses and the streets. +The Cossacks carried off what they could to their camps, and the +householders seized all they could find in other houses and moved it +to their own, pretending that it was their property. + +But the first plunderers were followed by a second and a third +contingent, and with increasing numbers plundering became more and +more difficult and assumed more definite forms. + +The French found Moscow abandoned but with all the organizations +of regular life, with diverse branches of commerce and +craftsmanship, with luxury, and governmental and religious +institutions. These forms were lifeless but still existed. There +were bazaars, shops, warehouses, market stalls, granaries--for the +most part still stocked with goods--and there were factories and +workshops, palaces and wealthy houses filled with luxuries, hospitals, +prisons, government offices, churches, and cathedrals. The longer +the French remained the more these forms of town life perished, +until finally all was merged into one confused, lifeless scene of +plunder. + +The more the plundering by the French continued, the more both the +wealth of Moscow and the strength of its plunderers was destroyed. But +plundering by the Russians, with which the reoccupation of the city +began, had an opposite effect: the longer it continued and the greater +the number of people taking part in it the more rapidly was the wealth +of the city and its regular life restored. + +Besides the plunderers, very various people, some drawn by +curiosity, some by official duties, some by self-interest--house +owners, clergy, officials of all kinds, tradesmen, artisans, and +peasants--streamed into Moscow as blood flows to the heart. + +Within a week the peasants who came with empty carts to carry off +plunder were stopped by the authorities and made to cart the corpses +out of the town. Other peasants, having heard of their comrades' +discomfiture, came to town bringing rye, oats, and hay, and beat +down one another's prices to below what they had been in former +days. Gangs of carpenters hoping for high pay arrived in Moscow +every day, and on all sides logs were being hewn, new houses built, +and old, charred ones repaired. Tradesmen began trading in booths. +Cookshops and taverns were opened in partially burned houses. The +clergy resumed the services in many churches that had not been burned. +Donors contributed Church property that had been stolen. Government +clerks set up their baize-covered tables and their pigeonholes of +documents in small rooms. The higher authorities and the police +organized the distribution of goods left behind by the French. The +owners of houses in which much property had been left, brought there +from other houses, complained of the injustice of taking everything to +the Faceted Palace in the Kremlin; others insisted that as the +French had gathered things from different houses into this or that +house, it would be unfair to allow its owner to keep all that was +found there. They abused the police and bribed them, made out +estimates at ten times their value for government stores that had +perished in the fire, and demanded relief. And Count Rostopchin +wrote proclamations. + + + + + +CHAPTER XV + + +At the end of January Pierre went to Moscow and stayed in an annex +of his house which had not been burned. He called on Count +Rostopchin and on some acquaintances who were back in Moscow, and he +intended to leave for Petersburg two days later. Everybody was +celebrating the victory, everything was bubbling with life in the +ruined but reviving city. Everyone was pleased to see Pierre, everyone +wished to meet him, and everyone questioned him about what he had +seen. Pierre felt particularly well disposed toward them all, but +was now instinctively on his guard for fear of binding himself in +any way. To all questions put to him--whether important or quite +trifling--such as: Where would he live? Was he going to rebuild? +When was he going to Petersburg and would he mind taking a parcel +for someone?--he replied: "Yes, perhaps," or, "I think so," and so on. + +He had heard that the Rostovs were at Kostroma but the thought of +Natasha seldom occurred to him. If it did it was only as a pleasant +memory of the distant past. He felt himself not only free from +social obligations but also from that feeling which, it seemed to him, +he had aroused in himself. + +On the third day after his arrival he heard from the Drubetskoys +that Princess Mary was in Moscow. The death, sufferings, and last days +of Prince Andrew had often occupied Pierre's thoughts and now recurred +to him with fresh vividness. Having heard at dinner that Princess Mary +was in Moscow and living in her house--which had not been burned--in +Vozdvizhenka Street, he drove that same evening to see her. + +On his way to the house Pierre kept thinking of Prince Andrew, of +their friendship, of his various meetings with him, and especially +of the last one at Borodino. + +"Is it possible that he died in the bitter frame of mind he was then +in? Is it possible that the meaning of life was not disclosed to him +before he died?" thought Pierre. He recalled Karataev and his death +and involuntarily began to compare these two men, so different, and +yet so similar in that they had both lived and both died and in the +love he felt for both of them. + +Pierre drove up to the house of the old prince in a most serious +mood. The house had escaped the fire; it showed signs of damage but +its general aspect was unchanged. The old footman, who met Pierre with +a stern face as if wishing to make the visitor feel that the absence +of the old prince had not disturbed the order of things in the +house, informed him that the princess had gone to her own +apartments, and that she received on Sundays. + +"Announce me. Perhaps she will see me," said Pierre. + +"Yes, sir," said the man. "Please step into the portrait gallery." + +A few minutes later the footman returned with Dessalles, who brought +word from the princess that she would be very glad to see Pierre if he +would excuse her want of ceremony and come upstairs to her apartment. + +In a rather low room lit by one candle sat the princess and with her +another person dressed in black. Pierre remembered that the princess +always had lady companions, but who they were and what they were +like he never knew or remembered. "This must be one of her +companions," he thought, glancing at the lady in the black dress. + +The princess rose quickly to meet him and held out her hand. + +"Yes," she said, looking at his altered face after he had kissed her +hand, "so this is how we meet again. He spoke of you even at the +very last," she went on, turning her eyes from Pierre to her companion +with a shyness that surprised him for an instant. + +"I was so glad to hear of your safety. It was the first piece of +good news we had received for a long time." + +Again the princess glanced round at her companion with even more +uneasiness in her manner and was about to add something, but Pierre +interrupted her. + +"Just imagine--I knew nothing about him!" said he. "I thought he had +been killed. All I know I heard at second hand from others. I only +know that he fell in with the Rostovs.... What a strange coincidence!" + +Pierre spoke rapidly and with animation. He glanced once at the +companion's face, saw her attentive and kindly gaze fixed on him, and, +as often happens when one is talking, felt somehow that this companion +in the black dress was a good, kind, excellent creature who would +not hinder his conversing freely with Princess Mary. + +But when he mentioned the Rostovs, Princess Mary's face expressed +still greater embarrassment. She again glanced rapidly from Pierre's +face to that of the lady in the black dress and said: + +"Do you really not recognize her?" + +Pierre looked again at the companion's pale, delicate face with +its black eyes and peculiar mouth, and something near to him, long +forgotten and more than sweet, looked at him from those attentive +eyes. + +"But no, it can't be!" he thought. "This stern, thin, pale face that +looks so much older! It cannot be she. It merely reminds me of her." +But at that moment Princess Mary said, "Natasha!" And with difficulty, +effort, and stress, like the opening of a door grown rusty on its +hinges, a smile appeared on the face with the attentive eyes, and from +that opening door came a breath of fragrance which suffused Pierre +with a happiness he had long forgotten and of which he had not even +been thinking--especially at that moment. It suffused him, seized him, +and enveloped him completely. When she smiled doubt was no longer +possible, it was Natasha and he loved her. + +At that moment Pierre involuntarily betrayed to her, to Princess +Mary, and above all to himself, a secret of which he himself had +been unaware. He flushed joyfully yet with painful distress. He +tried to hide his agitation. But the more he tried to hide it the more +clearly--clearer than any words could have done--did he betray to +himself, to her, and to Princess Mary that he loved her. + +"No, it's only the unexpectedness of it," thought Pierre. But as +soon as he tried to continue the conversation he had begun with +Princess Mary he again glanced at Natasha, and a still-deeper flush +suffused his face and a still-stronger agitation of mingled joy and +fear seized his soul. He became confused in his speech and stopped +in the middle of what he was saying. + +Pierre had failed to notice Natasha because he did not at all expect +to see her there, but he had failed to recognize her because the +change in her since he last saw her was immense. She had grown thin +and pale, but that was not what made her unrecognizable; she was +unrecognizable at the moment he entered because on that face whose +eyes had always shone with a suppressed smile of the joy of life, +now when he first entered and glanced at her there was not the least +shadow of a smile: only her eyes were kindly attentive and sadly +interrogative. + +Pierre's confusion was not reflected by any confusion on Natasha's +part, but only by the pleasure that just perceptibly lit up her +whole face. + + + + + +CHAPTER XVI + + +"She has come to stay with me," said Princess Mary. "The count and +countess will be here in a few days. The countess is in a dreadful +state; but it was necessary for Natasha herself to see a doctor. +They insisted on her coming with me." + +"Yes, is there a family free from sorrow now?" said Pierre, +addressing Natasha. "You know it happened the very day we were +rescued. I saw him. What a delightful boy he was!" + +Natasha looked at him, and by way of answer to his words her eyes +widened and lit up. + +"What can one say or think of as a consolation?" said Pierre. +"Nothing! Why had such a splendid boy, so full of life, to die?" + +"Yes, in these days it would be hard to live without faith..." +remarked Princess Mary. + +"Yes, yes, that is really true," Pierre hastily interrupted her. + +"Why is it true?" Natasha asked, looking attentively into Pierre's +eyes. + +"How can you ask why?" said Princess Mary. "The thought alone of +what awaits..." + +Natasha without waiting for Princess Mary to finish again looked +inquiringly at Pierre. + +"And because," Pierre continued, "only one who believes that there +is a God ruling us can bear a loss such as hers and... yours." + +Natasha had already opened her mouth to speak but suddenly +stopped. Pierre hurriedly turned away from her and again addressed +Princess Mary, asking about his friend's last days. + +Pierre's confusion had now almost vanished, but at the same time +he felt that his freedom had also completely gone. He felt that +there was now a judge of his every word and action whose judgment +mattered more to him than that of all the rest of the world. As he +spoke now he was considering what impression his words would make on +Natasha. He did not purposely say things to please her, but whatever +he was saying he regarded from her standpoint. + +Princess Mary--reluctantly as is usual in such cases--began +telling of the condition in which she had found Prince Andrew. But +Pierre's face quivering with emotion, his questions and his eager +restless expression, gradually compelled her to go into details +which she feared to recall for her own sake. + +"Yes, yes, and so...?" Pierre kept saying as he leaned toward her +with his whole body and eagerly listened to her story. "Yes, yes... so +he grew tranquil and softened? With all his soul he had always +sought one thing--to be perfectly good--so he could not be afraid of +death. The faults he had--if he had any--were not of his making. So he +did soften?... What a happy thing that he saw you again," he added, +suddenly turning to Natasha and looking at her with eyes full of +tears. + +Natasha's face twitched. She frowned and lowered her eyes for a +moment. She hesitated for an instant whether to speak or not. + +"Yes, that was happiness," she then said in her quiet voice with its +deep chest notes. "For me it certainly was happiness." She paused. +"And he... he... he said he was wishing for it at the very moment I +entered the room...." + +Natasha's voice broke. She blushed, pressed her clasped hands on her +knees, and then controlling herself with an evident effort lifted +her head and began to speak rapidly. + +"We knew nothing of it when we started from Moscow. I did not dare +to ask about him. Then suddenly Sonya told me he was traveling with +us. I had no idea and could not imagine what state he was in, all I +wanted was to see him and be with him," she said, trembling, and +breathing quickly. + +And not letting them interrupt her she went on to tell what she +had never yet mentioned to anyone--all she had lived through during +those three weeks of their journey and life at Yaroslavl. + +Pierre listened to her with lips parted and eyes fixed upon her full +of tears. As he listened he did not think of Prince Andrew, nor of +death, nor of what she was telling. He listened to her and felt only +pity for her, for what she was suffering now while she was speaking. + +Princess Mary, frowning in her effort to hold back her tears, sat +beside Natasha, and heard for the first time the story of those last +days of her brother's and Natasha's love. + +Evidently Natasha needed to tell that painful yet joyful tale. + +She spoke, mingling most trifling details with the intimate +secrets of her soul, and it seemed as if she could never finish. +Several times she repeated the same thing twice. + +Dessalles' voice was heard outside the door asking whether little +Nicholas might come in to say good night. + +"Well, that's all--everything," said Natasha. + +She got up quickly just as Nicholas entered, almost ran to the +door which was hidden by curtains, struck her head against it, and +rushed from the room with a moan either of pain or sorrow. + +Pierre gazed at the door through which she had disappeared and did +not understand why he suddenly felt all alone in the world. + +Princess Mary roused him from his abstraction by drawing his +attention to her nephew who had entered the room. + +At that moment of emotional tenderness young Nicholas' face, which +resembled his father's, affected Pierre so much that when he had +kissed the boy he got up quickly, took out his handkerchief, and +went to the window. He wished to take leave of Princess Mary, but +she would not let him go. + +"No, Natasha and I sometimes don't go to sleep till after two, so +please don't go. I will order supper. Go downstairs, we will come +immediately." + +Before Pierre left the room Princess Mary told him: "This is the +first time she has talked of him like that." + + + + + +CHAPTER XVII + + +Pierre was shown into the large, brightly lit dining room; a few +minutes later he heard footsteps and Princess Mary entered with +Natasha. Natasha was calm, though a severe and grave expression had +again settled on her face. They all three of them now experienced that +feeling of awkwardness which usually follows after a serious and +heartfelt talk. It is impossible to go back to the same +conversation, to talk of trifles is awkward, and yet the desire to +speak is there and silence seems like affectation. They went +silently to table. The footmen drew back the chairs and pushed them up +again. Pierre unfolded his cold table napkin and, resolving to break +the silence, looked at Natasha and at Princess Mary. They had +evidently both formed the same resolution; the eyes of both shone with +satisfaction and a confession that besides sorrow life also has joy. + +"Do you take vodka, Count?" asked Princess Mary, and those words +suddenly banished the shadows of the past. "Now tell us about +yourself," said she. "One hears such improbable wonders about you." + +"Yes," replied Pierre with the smile of mild irony now habitual to +him. "They even tell me wonders I myself never dreamed of! Mary +Abramovna invited me to her house and kept telling me what had +happened, or ought to have happened, to me. Stepan Stepanych also +instructed me how I ought to tell of my experiences. In general I have +noticed that it is very easy to be an interesting man (I am an +interesting man now); people invite me out and tell me all about +myself." + +Natasha smiled and was on the point of speaking. + +"We have been told," Princess Mary interrupted her, "that you lost +two millions in Moscow. Is that true?" + +"But I am three times as rich as before," returned Pierre. + +Though the position was now altered by his decision to pay his +wife's debts and to rebuild his houses, Pierre still maintained that +he had become three times as rich as before. + +"What I have certainly gained is freedom," he began seriously, but +did not continue, noticing that this theme was too egotistic. + +"And are you building?" + +"Yes. Savelich says I must!" + +"Tell me, you did not know of the countess' death when you decided +to remain in Moscow?" asked Princess Mary and immediately blushed, +noticing that her question, following his mention of freedom, ascribed +to his words a meaning he had perhaps not intended. + +"No," answered Pierre, evidently not considering awkward the meaning +Princess Mary had given to his words. "I heard of it in Orel and you +cannot imagine how it shocked me. We were not an exemplary couple," he +added quickly, glancing at Natasha and noticing on her face +curiosity as to how he would speak of his wife, "but her death shocked +me terribly. When two people quarrel they are always both in fault, +and one's own guilt suddenly becomes terribly serious when the other +is no longer alive. And then such a death... without friends and +without consolation! I am very, very sorry for her," he concluded, and +was pleased to notice a look of glad approval on Natasha's face. + +"Yes, and so you are once more an eligible bachelor," said +Princess Mary. + +Pierre suddenly flushed crimson and for a long time tried not to +look at Natasha. When he ventured to glance her way again her face was +cold, stern, and he fancied even contemptuous. + +"And did you really see and speak to Napoleon, as we have been +told?" said Princess Mary. + +Pierre laughed. + +"No, not once! Everybody seems to imagine that being taken +prisoner means being Napoleon's guest. Not only did I never see him +but I heard nothing about him--I was in much lower company!" + +Supper was over, and Pierre who at first declined to speak about his +captivity was gradually led on to do so. + +"But it's true that you remained in Moscow to kill Napoleon?" +Natasha asked with a slight smile. "I guessed it then when we met at +the Sukharev tower, do you remember?" + +Pierre admitted that it was true, and from that was gradually led by +Princess Mary's questions and especially by Natasha's into giving a +detailed account of his adventures. + +At first he spoke with the amused and mild irony now customary +with him toward everybody and especially toward himself, but when he +came to describe the horrors and sufferings he had witnessed he was +unconsciously carried away and began speaking with the suppressed +emotion of a man re-experiencing in recollection strong impressions he +has lived through. + +Princess Mary with a gentle smile looked now at Pierre and now at +Natasha. In the whole narrative she saw only Pierre and his +goodness. Natasha, leaning on her elbow, the expression of her face +constantly changing with the narrative, watched Pierre with an +attention that never wandered--evidently herself experiencing all that +he described. Not only her look, but her exclamations and the brief +questions she put, showed Pierre that she understood just what he +wished to convey. It was clear that she understood not only what he +said but also what he wished to, but could not, express in words. +The account Pierre gave of the incident with the child and the woman +for protecting whom he was arrested was this: "It was an awful +sight--children abandoned, some in the flames... One was snatched +out before my eyes... and there were women who had their things +snatched off and their earrings torn out..." he flushed and grew +confused. "Then a patrol arrived and all the men--all those who were + +not looting, that is--were arrested, and I among them." + +"I am sure you're not telling us everything; I am sure you did +something..." said Natasha and pausing added, "something fine?" + +Pierre continued. When he spoke of the execution he wanted to pass +over the horrible details, but Natasha insisted that he should not +omit anything. + +Pierre began to tell about Karataev, but paused. By this time he had +risen from the table and was pacing the room, Natasha following him +with her eyes. Then he added: + +"No, you can't understand what I learned from that illiterate man- +that simple fellow." + +"Yes, yes, go on!" said Natasha. "Where is he?" + +"They killed him almost before my eyes." + +And Pierre, his voice trembling continually, went on to tell of +the last days of their retreat, of Karataev's illness and his death. + +He told of his adventures as he had never yet recalled them. He now, +as it were, saw a new meaning in all he had gone through. Now that +he was telling it all to Natasha he experienced that pleasure which +a man has when women listen to him--not clever women who when +listening either try to remember what they hear to enrich their +minds and when opportunity offers to retell it, or who wish to adopt +it to some thought of their own and promptly contribute their own +clever comments prepared in their little mental workshop--but the +pleasure given by real women gifted with a capacity to select and +absorb the very best a man shows of himself. Natasha without knowing +it was all attention: she did not lose a word, no single quiver in +Pierre's voice, no look, no twitch of a muscle in his face, nor a +single gesture. She caught the unfinished word in its flight and +took it straight into her open heart, divining the secret meaning of +all Pierre's mental travail. + +Princess Mary understood his story and sympathized with him, but she +now saw something else that absorbed all her attention. She saw the +possibility of love and happiness between Natasha and Pierre, and +the first thought of this filled her heart with gladness. + +It was three o'clock in the morning. The footmen came in with sad +and stern faces to change the candles, but no one noticed them. + +Pierre finished his story. Natasha continued to look at him intently +with bright, attentive, and animated eyes, as if trying to +understand something more which he had perhaps left untold. Pierre +in shamefaced and happy confusion glanced occasionally at her, and +tried to think what to say next to introduce a fresh subject. Princess +Mary was silent. It occurred to none of them that it was three o'clock +and time to go to bed. + +"People speak of misfortunes and sufferings," remarked Pierre, +"but if at this moment I were asked: 'Would you rather be what you +were before you were taken prisoner, or go through all this again?' +then for heaven's sake let me again have captivity and horseflesh! +We imagine that when we are thrown out of our usual ruts all is +lost, but it is only then that what is new and good begins. While +there is life there is happiness. There is much, much before us. I say +this to you," he added, turning to Natasha. + +"Yes, yes," she said, answering something quite different. "I too +should wish nothing but to relive it all from the beginning." + +Pierre looked intently at her. + +"Yes, and nothing more." said Natasha. + +"It's not true, not true!" cried Pierre. "I am not to blame for +being alive and wishing to live--nor you either." + +Suddenly Natasha bent her head, covered her face with her hands, and +began to cry. + +"What is it, Natasha?" said Princess Mary. + +"Nothing, nothing." She smiled at Pierre through her tears. "Good +night! It is time for bed." + +Pierre rose and took his leave. + + +Princess Mary and Natasha met as usual in the bedroom. They talked +of what Pierre had told them. Princess Mary did not express her +opinion of Pierre nor did Natasha speak of him. + +"Well, good night, Mary!" said Natasha. "Do you know, I am often +afraid that by not speaking of him" (she meant Prince Andrew) "for +fear of not doing justice to our feelings, we forget him." + +Princess Mary sighed deeply and thereby acknowledged the justice +of Natasha's remark, but she did not express agreement in words. + +"Is it possible to forget?" said she. + +"It did me so much good to tell all about it today. It was hard +and painful, but good, very good!" said Natasha. "I am sure he +really loved him. That is why I told him... Was it all right?" she +added, suddenly blushing. + +"To tell Pierre? Oh, yes. What a splendid man he is!" said +Princess Mary. + +"Do you know, Mary..." Natasha suddenly said with a mischievous +smile such as Princess Mary had not seen on her face for a long +time, "he has somehow grown so clean, smooth, and fresh--as if he +had just come out of a Russian bath; do you understand? Out of a moral +bath. Isn't it true?" + +"Yes," replied Princess Mary. "He has greatly improved." + +"With a short coat and his hair cropped; just as if, well, just as +if he had come straight from the bath... Papa used to..." + +"I understand why he" (Prince Andrew) "liked no one so much as him," +said Princess Mary. + +"Yes, and yet he is quite different. They say men are friends when +they are quite different. That must be true. Really he is quite unlike +him--in everything." + +"Yes, but he's wonderful." + +"Well, good night," said Natasha. + +And the same mischievous smile lingered for a long time on her +face as if it had been forgotten there. + + + + +CHAPTER XVIII + + +It was a long time before Pierre could fall asleep that night. He +paced up and down his room, now turning his thoughts on a difficult +problem and frowning, now suddenly shrugging his shoulders and +wincing, and now smiling happily. + +He was thinking of Prince Andrew, of Natasha, and of their love, +at one moment jealous of her past, then reproaching himself for that +feeling. It was already six in the morning and he still paced up and +down the room. + +"Well, what's to be done if it cannot be avoided? What's to be done? +Evidently it has to be so," said he to himself, and hastily undressing +he got into bed, happy and agitated but free from hesitation or +indecision. + +"Strange and impossible as such happiness seems, I must do +everything that she and I may be man and wife," he told himself. + +A few days previously Pierre had decided to go to Petersburg on +the Friday. When he awoke on the Thursday, Savelich came to ask him +about packing for the journey. + +"What, to Petersburg? What is Petersburg? Who is there in +Petersburg?" he asked involuntarily, though only to himself. "Oh, yes, +long ago before this happened I did for some reason mean to go to +Petersburg," he reflected. "Why? But perhaps I shall go. What a good +fellow he is and how attentive, and how he remembers everything," he +thought, looking at Savelich's old face, "and what a pleasant smile he +has!" + +"Well, Savelich, do you still not wish to accept your freedom?" +Pierre asked him. + +"What's the good of freedom to me, your excellency? We lived under +the late count--the kingdom of heaven be his!--and we have lived under +you too, without ever being wronged." + +"And your children?" + +"The children will live just the same. With such masters one can +live." + +"But what about my heirs?" said Pierre. "Supposing I suddenly +marry... it might happen," he added with an involuntary smile. + +"If I may take the liberty, your excellency, it would be a good +thing." + +"How easy he thinks it," thought Pierre. "He doesn't know how +terrible it is and how dangerous. Too soon or too late... it is +terrible!" + +"So what are your orders? Are you starting tomorrow?" asked +Savelich. + +"No, I'll put it off for a bit. I'll tell you later. You must +forgive the trouble I have put you to," said Pierre, and seeing +Savelich smile, he thought: "But how strange it is that he should +not know that now there is no Petersburg for me, and that that must be +settled first of all! But probably he knows it well enough and is only +pretending. Shall I have a talk with him and see what he thinks?" +Pierre reflected. "No, another time." + +At breakfast Pierre told the princess, his cousin, that he had +been to see Princess Mary the day before and had there met--"Whom do +you think? Natasha Rostova!" + +The princess seemed to see nothing more extraordinary in that than +if he had seen Anna Semenovna. + +"Do you know her?" asked Pierre. + +"I have seen the princess," she replied. "I heard that they were +arranging a match for her with young Rostov. It would be a very good +thing for the Rostovs, they are said to be utterly ruined." + +"No; I mean do you know Natasha Rostova?" + +"I heard about that affair of hers at the time. It was a great +pity." + +"No, she either doesn't understand or is pretending," thought +Pierre. "Better not say anything to her either." + +The princess too had prepared provisions for Pierre's journey. + +"How kind they all are," thought Pierre. "What is surprising is that +they should trouble about these things now when it can no longer be of +interest to them. And all for me!" + +On the same day the Chief of Police came to Pierre, inviting him +to send a representative to the Faceted Palace to recover things +that were to be returned to their owners that day. + +"And this man too," thought Pierre, looking into the face of the +Chief of Police. "What a fine, good-looking officer and how kind. +Fancy bothering about such trifies now! And they actually say he is +not honest and takes bribes. What nonsense! Besides, why shouldn't +he take bribes? That's the way he was brought up, and everybody does +it. But what a kind, pleasant face and how he smiles as he looks at +me." + +Pierre went to Princess Mary's to dinner. + +As he drove through the streets past the houses that had been burned +down, he was surprised by the beauty of those ruins. The +picturesqueness of the chimney stacks and tumble-down walls of the +burned-out quarters of the town, stretching out and concealing one +another, reminded him of the Rhine and the Colosseum. The cabmen he +met and their passengers, the carpenters cutting the timber for new +houses with axes, the women hawkers, and the shopkeepers, all looked +at him with cheerful beaming eyes that seemed to say: "Ah, there he +is! Let's see what will come of it!" + +At the entrance to Princess Mary's house Pierre felt doubtful +whether he had really been there the night before and really seen +Natasha and talked to her. "Perhaps I imagined it; perhaps I shall +go in and find no one there." But he had hardly entered the room +before he felt her presence with his whole being by the loss of his +sense of freedom. She was in the same black dress with soft folds +and her hair was done the same way as the day before, yet she was +quite different. Had she been like this when he entered the day before +he could not for a moment have failed to recognize her. + +She was as he had known her almost as a child and later on as Prince +Andrew's fiancee. A bright questioning light shone in her eyes, and on +her face was a friendly and strangely roguish expression. + +Pierre dined with them and would have spent the whole evening there, +but Princess Mary was going to vespers and Pierre left the house +with her. + +Next day he came early, dined, and stayed the whole evening. +Though Princess Mary and Natasha were evidently glad to see their +visitor and though all Pierre's interest was now centered in that +house, by the evening they had talked over everything and the +conversation passed from one trivial topic to another and repeatedly +broke off. He stayed so long that Princess Mary and Natasha +exchanged glances, evidently wondering when he would go. Pierre +noticed this but could not go. He felt uneasy and embarrassed, but sat +on because he simply could not get up and take his leave. + +Princess Mary, foreseeing no end to this, rose first, and +complaining of a headache began to say good night. + +"So you are going to Petersburg tomorrow?" she asked. + +"No, I am not going," Pierre replied hastily, in a surprised tone +and as though offended. "Yes... no... to Petersburg? Tomorrow--but I +won't say good-by yet. I will call round in case you have any +commissions for me," said he, standing before Princess Mary and +turning red, but not taking his departure. + +Natasha gave him her hand and went out. Princess Mary on the other +hand instead of going away sank into an armchair, and looked sternly +and intently at him with her deep, radiant eyes. The weariness she had +plainly shown before had now quite passed off. With a deep and +long-drawn sigh she seemed to be prepared for a lengthy talk. + +When Natasha left the room Pierre's confusion and awkwardness +immediately vanished and were replaced by eager excitement. He quickly +moved an armchair toward Princess Mary. + +"Yes, I wanted to tell you," said he, answering her look as if she +had spoken. "Princess, help me! What am I to do? Can I hope? Princess, +my dear friend, listen! I know it all. I know I am not worthy of +her, I know it's impossible to speak of it now. But I want to be a +brother to her. No, not that, I don't, I can't..." + +He paused and rubbed his face and eyes with his hands. + +"Well," he went on with an evident effort at self-control and +coherence. "I don't know when I began to love her, but I have loved +her and her alone all my life, and I love her so that I cannot imagine +life without her. I cannot propose to her at present, but the +thought that perhaps she might someday be my wife and that I may be +missing that possibility... that possibility... is terrible. Tell +me, can I hope? Tell me what I am to do, dear princess!" he added +after a pause, and touched her hand as she did not reply. + +"I am thinking of what you have told me," answered Princess Mary. +"This is what I will say. You are right that to speak to her of love +at present..." + +Princess Mary stopped. She was going to say that to speak of love +was impossible, but she stopped because she had seen by the sudden +change in Natasha two days before that she would not only not be +hurt if Pierre spoke of his love, but that it was the very thing she +wished for. + +"To speak to her now wouldn't do," said the princess all the same. + +"But what am I to do?" + +"Leave it to me," said Princess Mary. "I know..." + +Pierre was looking into Princess Mary's eyes. + +"Well?... Well?..." he said. + +"I know that she loves... will love you," Princess Mary corrected +herself. + +Before her words were out, Pierre had sprung up and with a +frightened expression seized Princess Mary's hand. + +"What makes you think so? You think I may hope? You think...?" + +"Yes, I think so," said Princess Mary with a smile. "Write to her +parents, and leave it to me. I will tell her when I can. I wish it +to happen and my heart tells me it will." + +"No, it cannot be! How happy I am! But it can't be.... How happy I +am! No, it can't be!" Pierre kept saying as he kissed Princess +Mary's hands. + +"Go to Petersburg, that will be best. And I will write to you," +she said. + +"To Petersburg? Go there? Very well, I'll go. But I may come again +tomorrow?" + +Next day Pierre came to say good-by. Natasha was less animated +than she had been the day before; but that day as he looked at her +Pierre sometimes felt as if he was vanishing and that neither he nor +she existed any longer, that nothing existed but happiness. "Is it +possible? No, it can't be," he told himself at every look, gesture, +and word that filled his soul with joy. + +When on saying good-by he took her thin, slender hand, he could +not help holding it a little longer in his own. + +"Is it possible that this hand, that face, those eyes, all this +treasure of feminine charm so strange to me now, is it possible that +it will one day be mine forever, as familiar to me as I am to +myself?... No, that's impossible!..." + +"Good-by, Count," she said aloud. "I shall look forward very much to +your return," she added in a whisper. + +And these simple words, her look, and the expression on her face +which accompanied them, formed for two months the subject of +inexhaustible memories, interpretations, and happy meditations for +Pierre. "'I shall look forward very much to your return....' Yes, yes, +how did she say it? Yes, 'I shall look forward very much to your +return.' Oh, how happy I am! What is happening to me? How happy I am!" +said Pierre to himself. + + + + + +CHAPTER XIX + + +There was nothing in Pierre's soul now at all like what had troubled +it during his courtship of Helene. + +He did not repeat to himself with a sickening feeling of shame the +words he had spoken, or say: "Oh, why did I not say that?" and, +"Whatever made me say 'Je vous aime'?" On the contrary, he now +repeated in imagination every word that he or Natasha had spoken and +pictured every detail of her face and smile, and did not wish to +diminish or add anything, but only to repeat it again and again. There +was now not a shadow of doubt in his mind as to whether what he had +undertaken was right or wrong. Only one terrible doubt sometimes +crossed his mind: "Wasn't it all a dream? Isn't Princess Mary +mistaken? Am I not too conceited and self-confident? I believe all +this--and suddenly Princess Mary will tell her, and she will be sure +to smile and say: 'How strange! He must be deluding himself. Doesn't +he know that he is a man, just a man, while I...? I am something +altogether different and higher.'" + +That was the only doubt often troubling Pierre. He did not now +make any plans. The happiness before him appeared so inconceivable +that if only he could attain it, it would be the end of all things. +Everything ended with that. + +A joyful, unexpected frenzy, of which he had thought himself +incapable, possessed him. The whole meaning of life--not for him alone +but for the whole world--seemed to him centered in his love and the +possibility of being loved by her. At times everybody seemed to him to +be occupied with one thing only--his future happiness. Sometimes it +seemed to him that other people were all as pleased as he was +himself and merely tried to hide that pleasure by pretending to be +busy with other interests. In every word and gesture he saw +allusions to his happiness. He often surprised those he met by his +significantly happy looks and smiles which seemed to express a +secret understanding between him and them. And when he realized that +people might not be aware of his happiness, he pitied them with his +whole heart and felt a desire somehow to explain to them that all that +occupied them was a mere frivolous trifle unworthy of attention. + +When it was suggested to him that he should enter the civil service, +or when the war or any general political affairs were discussed on the +assumption that everybody's welfare depended on this or that issue +of events, he would listen with a mild and pitying smile and +surprise people by his strange comments. But at this time he saw +everybody--both those who, as he imagined, understood the real meaning +of life (that is, what he was feeling) and those unfortunates who +evidently did not understand it--in the bright light of the emotion +that shone within himself, and at once without any effort saw in +everyone he met everything that was good and worthy of being loved. + +When dealing with the affairs and papers of his dead wife, her +memory aroused in him no feeling but pity that she had not known the +bliss he now knew. Prince Vasili, who having obtained a new post and +some fresh decorations was particularly proud at this time, seemed +to him a pathetic, kindly old man much to be pitied. + +Often in afterlife Pierre recalled this period of blissful insanity. +All the views he formed of men and circumstances at this time remained +true for him always. He not only did not renounce them subsequently, +but when he was in doubt or inwardly at variance, he referred to the +views he had held at this time of his madness and they always proved +correct. + +"I may have appeared strange and queer then," he thought, "but I was +not so mad as I seemed. On the contrary I was then wiser and had +more insight than at any other time, and understood all that is +worth understanding in life, because... because I was happy." + +Pierre's insanity consisted in not waiting, as he used to do, to +discover personal attributes which he termed "good qualities" in +people before loving them; his heart was now overflowing with love, +and by loving people without cause he discovered indubitable causes +for loving them. + + + + + +CHAPTER XX + + +After Pierre's departure that first evening, when Natasha had said +to Princess Mary with a gaily mocking smile: "He looks just, yes, just +as if he had come out of a Russian bath--in a short coat and with +his hair cropped," something hidden and unknown to herself, but +irrepressible, awoke in Natasha's soul. + +Everything: her face, walk, look, and voice, was suddenly altered. +To her own surprise a power of life and hope of happiness rose to +the surface and demanded satisfaction. From that evening she seemed to +have forgotten all that had happened to her. She no longer +complained of her position, did not say a word about the past, and +no longer feared to make happy plans for the future. She spoke +little of Pierre, but when Princess Mary mentioned him a +long-extinguished light once more kindled in her eyes and her lips +curved with a strange smile. + +The change that took place in Natasha at first surprised Princess +Mary; but when she understood its meaning it grieved her. "Can she +have loved my brother so little as to be able to forget him so +soon?" she thought when she reflected on the change. But when she +was with Natasha she was not vexed with her and did not reproach +her. The reawakened power of life that had seized Natasha was so +evidently irrepressible and unexpected by her that in her presence +Princess Mary felt that she had no right to reproach her even in her +heart. + + Natasha gave herself up so fully and frankly to this new feeling +that she did not try to hide the fact that she was no longer sad, +but bright and cheerful. + +When Princess Mary returned to her room after her nocturnal talk +with Pierre, Natasha met her on the threshold. + +"He has spoken? Yes? He has spoken?" she repeated. + +And a joyful yet pathetic expression which seemed to beg forgiveness +for her joy settled on Natasha's face. + +"I wanted to listen at the door, but I knew you would tell me." + +Understandable and touching as the look with which Natasha gazed +at her seemed to Princess Mary, and sorry as she was to see her +agitation, these words pained her for a moment. She remembered her +brother and his love. + +"But what's to be done? She can't help it," thought the princess. + +And with a sad and rather stern look she told Natasha all that +Pierre had said. On hearing that he was going to Petersburg Natasha +was astounded. + +"To Petersburg!" she repeated as if unable to understand. + +But noticing the grieved expression on Princess Mary's face she +guessed the reason of that sadness and suddenly began to cry. + +"Mary," said she, "tell me what I should do! I am afraid of being +bad. Whatever you tell me, I will do. Tell me...." + +"You love him?" + +"Yes," whispered Natasha. + +"Then why are you crying? I am happy for your sake," said Princess +Mary, who because of those tears quite forgave Natasha's joy. + +"It won't be just yet--someday. Think what fun it will be when I +am his wife and you marry Nicholas!" + +"Natasha, I have asked you not to speak of that. Let us talk about +you." + +They were silent awhile. + +"But why go to Petersburg?" Natasha suddenly asked, and hastily +replied to her own question. "But no, no, he must... Yes, Mary, He +must...." + + + + + + +FIRST EPILOGUE: 1813 --20 + + + + + +CHAPTER I + + +Seven years had passed. The storm-tossed sea of European history had +subsided within its shores and seemed to have become calm. But the +mysterious forces that move humanity (mysterious because the laws of +their motion are unknown to us) continued to operate. + +Though the surface of the sea of history seemed motionless, the +movement of humanity went on as unceasingly as the flow of time. +Various groups of people formed and dissolved, the coming formation +and dissolution of kingdoms and displacement of peoples was in +course of preparation. + +The sea of history was not driven spasmodically from shore to +shore as previously. It was seething in its depths. Historic figures +were not borne by the waves from one shore to another as before. +They now seemed to rotate on one spot. The historical figures at the +head of armies, who formerly reflected the movement of the masses by +ordering wars, campaigns, and battles, now reflected the restless +movement by political and diplomatic combinations, laws, and treaties. + +The historians call this activity of the historical figures "the +reaction." + +In dealing with this period they sternly condemn the historical +personages who, in their opinion, caused what they describe as the +reaction. All the well-known people of that period, from Alexander and +Napoleon to Madame de Stael, Photius, Schelling, Fichte, +Chateaubriand, and the rest, pass before their stern judgment seat and +are acquitted or condemned according to whether they conduced to +progress or to reaction. + +According to their accounts a reaction took place at that time in +Russia also, and the chief culprit was Alexander I, the same man who +according to them was the chief cause of the liberal movement at the +commencement of his reign, being the savior of Russia. + +There is no one in Russian literature now, from schoolboy essayist +to learned historian, who does not throw his little stone at Alexander +for things he did wrong at this period of his reign. + +"He ought to have acted in this way and in that way. In this case he +did well and in that case badly. He behaved admirably at the beginning +of his reign and during 1812, but acted badly by giving a constitution +to Poland, forming the Holy Alliance, entrusting power to Arakcheev, +favoring Golitsyn and mysticism, and afterwards Shishkov and +Photius. He also acted badly by concerning himself with the active +army and disbanding the Semenov regiment." + +It would take a dozen pages to enumerate all the reproaches the +historians address to him, based on their knowledge of what is good +for humanity. + +What do these reproaches mean? + +Do not the very actions for which the historians praise Alexander +I (the liberal attempts at the beginning of his reign, his struggle +with Napoleon, the firmness he displayed in 1812 and the campaign of +1813) flow from the same sources--the circumstances of his birth, +education, and life--that made his personality what it was and from +which the actions for which \ No newline at end of file diff --git a/node_modules/readline/test/fixtures/file-in-win1251.txt b/node_modules/readline/test/fixtures/file-in-win1251.txt new file mode 100644 index 00000000..9094c9c2 --- /dev/null +++ b/node_modules/readline/test/fixtures/file-in-win1251.txt @@ -0,0 +1,14 @@ +file n (folder for keeping information) ïàïêà æ +I have a file that I keep all my telephone bills in. +Ó ìåíÿ åñòü ïàïêà, â êîòîðîé ÿ õðàíþ âñå ñ÷åòà çà òåëåôîí. +file n (tool) íàïèëüíèê ì +He used a file to smooth the corner of the wood. +Îí çà÷èñòèë íàïèëüíèêîì êðàé äåðåâà. +file n (computer file) ôàéë ì +Can you send me the file as an attachment in an email? +Ìîæåøü ïîñëàòü ìíå ýòîò ôàéë êàê ïðèëîæåíèå ê ýëåêòðîííîìó ïèñüìó? +I file all my telephone bills together. +ß ïîäøèâàþ âñå ñ÷åòà çà ýëåêòðè÷åñòâî âìåñòå. +file vtr (smooth with a file) øëèôîâàòü, çà÷èùàòü íåñîâ + âèí +He filed the wood. +Îí øëèôîâàë äåðåâî. \ No newline at end of file diff --git a/node_modules/readline/test/fixtures/nmbr.txt b/node_modules/readline/test/fixtures/nmbr.txt new file mode 100644 index 00000000..0bce9e3a --- /dev/null +++ b/node_modules/readline/test/fixtures/nmbr.txt @@ -0,0 +1,7 @@ +1 +2 +3 +4 +5 +6 +7 \ No newline at end of file diff --git a/node_modules/readline/test/test_readline.js b/node_modules/readline/test/test_readline.js new file mode 100644 index 00000000..807cf722 --- /dev/null +++ b/node_modules/readline/test/test_readline.js @@ -0,0 +1,138 @@ +var fs = require('fs'); +var readLine = require('../readline.js'); +var test = require("tap").test; + +test("test reading lines",function(t){ + console.error("reading large file line by line asserts may take a while"); + var rl = readLine('./fixtures/afile.txt'); + rl.on("line", function (line,linecount){ + t.ok(null !== line && undefined !== line); + }); + rl.on("end",function (){ + t.end(); + }); + +}); + +test("numbers", function (t){ + var rl = readLine('./fixtures/nmbr.txt'); + var answer = 28; + var i=0; + rl.on("line", function (line){ + var num = Number(line); + console.error(num); + i+=num; + + }); + rl.on("end", function (){ + console.error(i,answer); + t.ok(answer === i, "answered"); + t.end(); + }); +}); + + +test("errors", function (t){ + var rl = readLine("./Idontexist"); + rl.on('error', function (e){ + t.ok(e); + t.end(); + }); + rl.on('end', function (){ + t.end(); + }); + rl.on('close', function(){ + t.end(); + }); +}); + + +test("line count", function(t){ + var rl = readLine('./fixtures/nmbr.txt'); + var expect = 7; + var actual = 0; + rl.on("line", function (line, ln){ + console.log("line",line,ln); + actual=ln; + }); + rl.on("end", function (){ + t.ok(actual === expect,"line count is correct"); + t.end(); + }); +}); + +test("byte count after first line", function(t){ + var rl = readLine('./fixtures/nmbr.txt'); + var actual = 0; + var expect; + rl.on("line", function (line, ln, byteCount){ + if (expect === undefined) { + expect = line.length; + console.log("byte count",byteCount); + actual=byteCount; + + t.ok(actual === expect,"byte count is correct"); + t.end(); + } + }); +}); + +test("byte count", function(t){ + var rl = readLine('./fixtures/nmbr.txt'); + var expect = fs.statSync('./fixtures/nmbr.txt').size; + var actual = 0; + rl.on("line", function (line, ln, byteCount){ + console.log("byte count",byteCount); + actual=byteCount; + }); + rl.on("end", function (){ + t.ok(actual === expect,"byte count is correct"); + t.end(); + }); +}); + +test("processing error passed on", function(t){ + var rl = readLine('./fixtures/nmbr.txt'); + var lastError; + var lineCalls = 0; + + rl.on("line", function (line, ln, byteCount){ + lineCalls++; + if (ln === 7) { + throw new Error('fake error'); + } + }); + rl.on("error", function (err){ + if (!lastError) { + lastError = err; + } + }); + + rl.on("end", function (){ + t.ok(lastError.message === 'fake error','error is passed on'); + t.ok(lineCalls === 7, 'line count ok'); + t.end(); + }); +}); + +test("test ascii file reading",function(t){ + var iconv = require('iconv-lite'); + var testFileValidationKeywords = { + 1: 'папка', + 3: 'телефон', + 11: 'ÑлектричеÑтво', + 14: 'дерево' + }; + + var rl = readLine('./fixtures/file-in-win1251.txt', { + retainBuffer: true + }); + rl.on("line", function (data,linecount){ + var line = iconv.decode(data, 'win1251'); + t.ok(!testFileValidationKeywords[linecount] || line.indexOf(testFileValidationKeywords[linecount]) > -1); + }); + rl.on("end",function (){ + t.end(); + }); + +}); \ No newline at end of file diff --git a/node_modules/require_optional/.npmignore b/node_modules/require_optional/.npmignore new file mode 100644 index 00000000..e920c167 --- /dev/null +++ b/node_modules/require_optional/.npmignore @@ -0,0 +1,33 @@ +# Logs +logs +*.log +npm-debug.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 +node_modules + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history diff --git a/node_modules/require_optional/.travis.yml b/node_modules/require_optional/.travis.yml new file mode 100644 index 00000000..72903c34 --- /dev/null +++ b/node_modules/require_optional/.travis.yml @@ -0,0 +1,9 @@ +language: node_js +node_js: + - "0.10" + - "0.12" + - "4" + - "6" + - "7" + - "8" +sudo: false diff --git a/node_modules/require_optional/HISTORY.md b/node_modules/require_optional/HISTORY.md new file mode 100644 index 00000000..7bee02fc --- /dev/null +++ b/node_modules/require_optional/HISTORY.md @@ -0,0 +1,7 @@ +1.0.1 03-02-2016 +================ +* Fix dependency resolution issue when a component in peerOptionalDependencies is installed at the level of the module declaring in peerOptionalDependencies. + +1.0.0 03-02-2016 +================ +* Initial release allowing us to optionally resolve dependencies in the package.json file under the peerOptionalDependencies tag. \ No newline at end of file diff --git a/node_modules/require_optional/LICENSE b/node_modules/require_optional/LICENSE new file mode 100644 index 00000000..8dada3ed --- /dev/null +++ b/node_modules/require_optional/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/node_modules/require_optional/README.md b/node_modules/require_optional/README.md new file mode 100644 index 00000000..c0323f06 --- /dev/null +++ b/node_modules/require_optional/README.md @@ -0,0 +1,2 @@ +# require_optional +Work around the problem that we do not have a optionalPeerDependencies concept in node.js making it a hassle to optionally include native modules diff --git a/node_modules/require_optional/index.js b/node_modules/require_optional/index.js new file mode 100644 index 00000000..3710319f --- /dev/null +++ b/node_modules/require_optional/index.js @@ -0,0 +1,128 @@ +var path = require('path'), + fs = require('fs'), + f = require('util').format, + resolveFrom = require('resolve-from'), + semver = require('semver'); + +var exists = fs.existsSync || path.existsSync; + +// Find the location of a package.json file near or above the given location +var find_package_json = function(location) { + var found = false; + + while(!found) { + if (exists(location + '/package.json')) { + found = location; + } else if (location !== '/') { + location = path.dirname(location); + } else { + return false; + } + } + + return location; +} + +// Find the package.json object of the module closest up the module call tree that contains name in that module's peerOptionalDependencies +var find_package_json_with_name = function(name) { + // Walk up the module call tree until we find a module containing name in its peerOptionalDependencies + var currentModule = module; + var found = false; + while (currentModule) { + // Check currentModule has a package.json + location = currentModule.filename; + var location = find_package_json(location) + if (!location) { + currentModule = currentModule.parent; + continue; + } + + // Read the package.json file + var object = JSON.parse(fs.readFileSync(f('%s/package.json', location))); + // Is the name defined by interal file references + var parts = name.split(/\//); + + // Check whether this package.json contains peerOptionalDependencies containing the name we're searching for + if (!object.peerOptionalDependencies || (object.peerOptionalDependencies && !object.peerOptionalDependencies[parts[0]])) { + currentModule = currentModule.parent; + continue; + } + found = true; + break; + } + + // Check whether name has been found in currentModule's peerOptionalDependencies + if (!found) { + throw new Error(f('no optional dependency [%s] defined in peerOptionalDependencies in any package.json', parts[0])); + } + + return { + object: object, + parts: parts + } +} + +var require_optional = function(name, options) { + options = options || {}; + options.strict = typeof options.strict == 'boolean' ? options.strict : true; + + var res = find_package_json_with_name(name) + var object = res.object; + var parts = res.parts; + + // Unpack the expected version + var expectedVersions = object.peerOptionalDependencies[parts[0]]; + // The resolved package + var moduleEntry = undefined; + // Module file + var moduleEntryFile = name; + + try { + // Validate if it's possible to read the module + moduleEntry = require(moduleEntryFile); + } catch(err) { + // Attempt to resolve in top level package + try { + // Get the module entry file + moduleEntryFile = resolveFrom(process.cwd(), name); + if(moduleEntryFile == null) return undefined; + // Attempt to resolve the module + moduleEntry = require(moduleEntryFile); + } catch(err) { + if(err.code === 'MODULE_NOT_FOUND') return undefined; + } + } + + // Resolve the location of the module's package.json file + var location = find_package_json(require.resolve(moduleEntryFile)); + if(!location) { + throw new Error('package.json can not be located'); + } + + // Read the module file + var dependentOnModule = JSON.parse(fs.readFileSync(f('%s/package.json', location))); + // Get the version + var version = dependentOnModule.version; + // Validate if the found module satisfies the version id + if(semver.satisfies(version, expectedVersions) == false + && options.strict) { + var error = new Error(f('optional dependency [%s] found but version [%s] did not satisfy constraint [%s]', parts[0], version, expectedVersions)); + error.code = 'OPTIONAL_MODULE_NOT_FOUND'; + throw error; + } + + // Satifies the module requirement + return moduleEntry; +} + +require_optional.exists = function(name) { + try { + var m = require_optional(name); + if(m === undefined) return false; + return true; + } catch(err) { + return false; + } +} + +module.exports = require_optional; diff --git a/node_modules/require_optional/package.json b/node_modules/require_optional/package.json new file mode 100644 index 00000000..3b70e01c --- /dev/null +++ b/node_modules/require_optional/package.json @@ -0,0 +1,67 @@ +{ + "_from": "require_optional@^1.0.1", + "_id": "require_optional@1.0.1", + "_inBundle": false, + "_integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "_location": "/require_optional", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "require_optional@^1.0.1", + "name": "require_optional", + "escapedName": "require_optional", + "rawSpec": "^1.0.1", + "saveSpec": null, + "fetchSpec": "^1.0.1" + }, + "_requiredBy": [ + "/mongodb" + ], + "_resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "_shasum": "4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e", + "_spec": "require_optional@^1.0.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\mongodb", + "author": { + "name": "Christian Kvalheim Amor" + }, + "bugs": { + "url": "https://github.com/christkv/require_optional/issues" + }, + "bundleDependencies": false, + "dependencies": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + }, + "deprecated": false, + "description": "Allows you declare optionalPeerDependencies that can be satisfied by the top level module but ignored if they are not.", + "devDependencies": { + "bson": "0.4.21", + "co": "4.6.0", + "es6-promise": "^3.0.2", + "mocha": "^2.4.5" + }, + "homepage": "https://github.com/christkv/require_optional", + "keywords": [ + "optional", + "require", + "optionalPeerDependencies" + ], + "license": "Apache-2.0", + "main": "index.js", + "name": "require_optional", + "peerOptionalDependencies": { + "co": ">=5.6.0", + "es6-promise": "^3.0.2", + "es6-promise2": "^4.0.2", + "bson": "0.4.21" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/christkv/require_optional.git" + }, + "scripts": { + "test": "mocha" + }, + "version": "1.0.1" +} diff --git a/node_modules/require_optional/test/nestedTest/index.js b/node_modules/require_optional/test/nestedTest/index.js new file mode 100644 index 00000000..76de2ab4 --- /dev/null +++ b/node_modules/require_optional/test/nestedTest/index.js @@ -0,0 +1,8 @@ +var require_optional = require('../../') + +function findPackage(packageName) { + var pkg = require_optional(packageName); + return pkg; +} + +module.exports.findPackage = findPackage diff --git a/node_modules/require_optional/test/nestedTest/package.json b/node_modules/require_optional/test/nestedTest/package.json new file mode 100644 index 00000000..4c456a6b --- /dev/null +++ b/node_modules/require_optional/test/nestedTest/package.json @@ -0,0 +1,11 @@ +{ + "name": "nestedtest", + "version": "1.0.0", + "description": "A dummy package that facilitates testing that require_optional correctly walks up the module call stack", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Sebastian Hallum Clarke", + "license": "ISC" +} diff --git a/node_modules/require_optional/test/require_optional_tests.js b/node_modules/require_optional/test/require_optional_tests.js new file mode 100644 index 00000000..c9cc2a36 --- /dev/null +++ b/node_modules/require_optional/test/require_optional_tests.js @@ -0,0 +1,59 @@ +var assert = require('assert'), + require_optional = require('../'), + nestedTest = require('./nestedTest'); + +describe('Require Optional', function() { + describe('top level require', function() { + it('should correctly require co library', function() { + var promise = require_optional('es6-promise'); + assert.ok(promise); + }); + + it('should fail to require es6-promise library', function() { + try { + require_optional('co'); + } catch(e) { + assert.equal('OPTIONAL_MODULE_NOT_FOUND', e.code); + return; + } + + assert.ok(false); + }); + + it('should ignore optional library not defined', function() { + assert.equal(undefined, require_optional('es6-promise2')); + }); + }); + + describe('internal module file require', function() { + it('should correctly require co library', function() { + var Long = require_optional('bson/lib/bson/long.js'); + assert.ok(Long); + }); + }); + + describe('top level resolve', function() { + it('should correctly use exists method', function() { + assert.equal(false, require_optional.exists('co')); + assert.equal(true, require_optional.exists('es6-promise')); + assert.equal(true, require_optional.exists('bson/lib/bson/long.js')); + assert.equal(false, require_optional.exists('es6-promise2')); + }); + }); + + describe('require_optional inside dependencies', function() { + it('should correctly walk up module call stack searching for peerOptionalDependencies', function() { + assert.ok(nestedTest.findPackage('bson')) + }); + it('should return null when a package is defined in top-level package.json but not installed', function() { + assert.equal(null, nestedTest.findPackage('es6-promise2')) + }); + it('should error when searching for an optional dependency that is not defined in any ancestor package.json', function() { + try { + nestedTest.findPackage('bison') + } catch (err) { + assert.equal(err.message, 'no optional dependency [bison] defined in peerOptionalDependencies in any package.json') + } + }) + }); +}); diff --git a/node_modules/resolve-from/index.js b/node_modules/resolve-from/index.js new file mode 100644 index 00000000..434159f1 --- /dev/null +++ b/node_modules/resolve-from/index.js @@ -0,0 +1,23 @@ +'use strict'; +var path = require('path'); +var Module = require('module'); + +module.exports = function (fromDir, moduleId) { + if (typeof fromDir !== 'string' || typeof moduleId !== 'string') { + throw new TypeError('Expected `fromDir` and `moduleId` to be a string'); + } + + fromDir = path.resolve(fromDir); + + var fromFile = path.join(fromDir, 'noop.js'); + + try { + return Module._resolveFilename(moduleId, { + id: fromFile, + filename: fromFile, + paths: Module._nodeModulePaths(fromDir) + }); + } catch (err) { + return null; + } +}; diff --git a/node_modules/resolve-from/license b/node_modules/resolve-from/license new file mode 100644 index 00000000..654d0bfe --- /dev/null +++ b/node_modules/resolve-from/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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/node_modules/resolve-from/package.json b/node_modules/resolve-from/package.json new file mode 100644 index 00000000..f053f0bc --- /dev/null +++ b/node_modules/resolve-from/package.json @@ -0,0 +1,66 @@ +{ + "_from": "resolve-from@^2.0.0", + "_id": "resolve-from@2.0.0", + "_inBundle": false, + "_integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "_location": "/resolve-from", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "resolve-from@^2.0.0", + "name": "resolve-from", + "escapedName": "resolve-from", + "rawSpec": "^2.0.0", + "saveSpec": null, + "fetchSpec": "^2.0.0" + }, + "_requiredBy": [ + "/require_optional" + ], + "_resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "_shasum": "9480ab20e94ffa1d9e80a804c7ea147611966b57", + "_spec": "resolve-from@^2.0.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\require_optional", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/resolve-from/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Resolve the path of a module like require.resolve() but from a given path", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/resolve-from#readme", + "keywords": [ + "require", + "resolve", + "path", + "module", + "from", + "like", + "path" + ], + "license": "MIT", + "name": "resolve-from", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/resolve-from.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "2.0.0" +} diff --git a/node_modules/resolve-from/readme.md b/node_modules/resolve-from/readme.md new file mode 100644 index 00000000..bb4ca91e --- /dev/null +++ b/node_modules/resolve-from/readme.md @@ -0,0 +1,58 @@ +# resolve-from [![Build Status](https://travis-ci.org/sindresorhus/resolve-from.svg?branch=master)](https://travis-ci.org/sindresorhus/resolve-from) + +> Resolve the path of a module like [`require.resolve()`](http://nodejs.org/api/globals.html#globals_require_resolve) but from a given path + +Unlike `require.resolve()` it returns `null` instead of throwing when the module can't be found. + + +## Install + +``` +$ npm install --save resolve-from +``` + + +## Usage + +```js +const resolveFrom = require('resolve-from'); + +// there's a file at `./foo/bar.js` + +resolveFrom('foo', './bar'); +//=> '/Users/sindresorhus/dev/test/foo/bar.js' +``` + + +## API + +### resolveFrom(fromDir, moduleId) + +#### fromDir + +Type: `string` + +Directory to resolve from. + +#### moduleId + +Type: `string` + +What you would use in `require()`. + + +## Tip + +Create a partial using a bound function if you want to require from the same `fromDir` multiple times: + +```js +const resolveFromFoo = resolveFrom.bind(null, 'foo'); + +resolveFromFoo('./bar'); +resolveFromFoo('./baz'); +``` + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/rw/.eslintrc b/node_modules/rw/.eslintrc new file mode 100644 index 00000000..bbad3806 --- /dev/null +++ b/node_modules/rw/.eslintrc @@ -0,0 +1,5 @@ +env: + node: true + +extends: + "eslint:recommended" diff --git a/node_modules/rw/.npmignore b/node_modules/rw/.npmignore new file mode 100644 index 00000000..e5c7a3b2 --- /dev/null +++ b/node_modules/rw/.npmignore @@ -0,0 +1,3 @@ +.DS_Store +node_modules +test/input.txt diff --git a/node_modules/rw/LICENSE b/node_modules/rw/LICENSE new file mode 100644 index 00000000..da8230d3 --- /dev/null +++ b/node_modules/rw/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2014-2016, Michael Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* The name Michael Bostock may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/rw/README.md b/node_modules/rw/README.md new file mode 100644 index 00000000..b3c2f713 --- /dev/null +++ b/node_modules/rw/README.md @@ -0,0 +1,120 @@ +# rw - Now stdin and stdout are files. + +How do you read a file from stdin? If you thought, + +```js +var contents = fs.readFileSync("/dev/stdin", "utf8"); +``` + +you’d be wrong, because Node only reads up to the size of the file reported by fs.stat rather than reading until it receives an EOF. So, if you redirect a file to your program (`cat file | program`), you’ll only read the first 65,536 bytes of your file. Oops. + +What about writing a file to stdout? If you thought, + +```js +fs.writeFileSync("/dev/stdout", contents, "utf8"); +``` + +you’d also be wrong, because this tries to close stdout, so you get this error: + +``` +Error: UNKNOWN, unknown error + at Object.fs.writeSync (fs.js:528:18) + at Object.fs.writeFileSync (fs.js:975:21) +``` + +(Also, this doesn’t work on Windows, because Windows doesn’t support /dev/stdout, /dev/stdin and /dev/stderr!) + +Shucks. So what should you do? + +You could use a different pattern for reading from stdin: + +```js +var chunks = []; + +process.stdin + .on("data", function(chunk) { chunks.push(chunk); }) + .on("end", function() { console.log(chunks.join("").length); }) + .setEncoding("utf8"); +``` + +But that’s a pain, since now your code has two different code paths for reading inputs depending on whether you’re reading a real file or stdin. And the code gets even more complex if you want to [read that file synchronously](https://github.com/mbostock/rw/blob/master/lib/rw/read-file-sync.js). + +You could also try a different pattern for writing to stdout: + +```js +process.stdout.write(contents); +``` + +Or even: + +```js +console.log(contents); +``` + +But if you try to pipe your output to `head`, you’ll get this error: + +``` +Error: write EPIPE + at errnoException (net.js:904:11) + at Object.afterWrite (net.js:720:19) +``` + +Huh. + +The **rw** module fixes these problems. It provides an interface just like readFile, readFileSync, writeFile and writeFileSync, but with implementations that work the way you expect on stdin and stdout. If you use these methods on files other than /dev/stdin or /dev/stdout, they simply delegate to the fs methods, so you can trust that they behave identically to the methods you’re used to. + +For example, now you can read stdin synchronously like so: + +```js +var contents = rw.readFileSync("/dev/stdin", "utf8"); +``` + +Or to write to stdout: + +```js +rw.writeFileSync("/dev/stdout", contents, "utf8"); +``` + +And rw automatically squashes EPIPE errors, so you can pipe the output of your program to `head` and you won’t get a spurious stack trace. + +To install, `npm install rw`. + +### Note + +If you want to read synchronously from stdin using [readFileSync](#readFileSync), you cannot also use process.stdin in the same program. Likewise, if you want to write synchronously to stdout or stderr using [writeFileSync](#writeFileSync), you cannot use process.stdout or process.stderr, respectively. (This includes using console.log and the like!) Failure to heed this warning may result in error: EAGAIN, resource temporarily unavailable. Unfortunately, it does not appear possible for this library to fix this issue automatically, so please use caution. + +Only the asynchronous methods [readFile](#readFile) and [writeFile](#writeFile) are supported on Windows. Node has no synchronous API for reading from process.[stdin](https://nodejs.org/api/process.html#process_process_stdin) or writing to process.[stdout](https://nodejs.org/api/process.html#process_process_stdout) or process.[stderr](https://nodejs.org/api/process.html#process_process_stderr), so you’re out of luck! + +## API Reference + +# rw.readFile(path[, options], callback) + +Reads the file at the specified *path* completely into memory, invoking the specified *callback* once the data is available and the file is closed. The *callback* is invoked with two arguments: the *error* that occurred during read (hopefully null), and the read data. If *options* is a string, it specifies the encoding to use, in which case the read data will be a string; otherwise *options* is an object, and may specify encoding and flag properties. This method is a drop-in replacement for [fs.readFile](https://nodejs.org/api/fs.html#fs_fs_readfile_file_options_callback) and fixes the behavior of special files such as /dev/stdin. + +# rw.readFileSync(path[, options]) + +Reads the file at the specified *path* completely into memory, synchronously, returning the data. If an error occurred during read, this function throws an error instead. If *options* is a string, it specifies the encoding to use, in which case the read data will be a string; otherwise *options* is an object, and may specify encoding and flag properties. This method is a drop-in replacement for [fs.readFileSync](https://nodejs.org/api/fs.html#fs_fs_readfilesync_file_options) and fixes the behavior of special files such as /dev/stdin. + +# rw.writeFile(path, data[, options], callback) + +Writes the specified *data* (completely in memory) to a file at the specified *path*, invoking the specified *callback* once the data is completely written and the file is closed. The *callback* is invoked with a single argument: the *error* that occurred during write (hopefully null). If *options* is a string, it specifies the encoding to use, in which case the *data* must be a string; otherwise *options* is an object, and may specify encoding, mode and flag properties. This method is a drop-in replacement for [fs.writeFile](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback) and fixes the behavior of special files such as /dev/stdout. + +# rw.writeFileSync(path, data[, options]) + +Writes the specified *data* (completely in memory) to a file at the specified *path*, synchronously, returning once the data is completely written and the file is closed. Throws an *error* if one occurs during write. If *options* is a string, it specifies the encoding to use, in which case the *data* must be a string; otherwise *options* is an object, and may specify encoding, mode and flag properties. This method is a drop-in replacement for [fs.writeFileSync](https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options) and fixes the behavior of special files such as /dev/stdout. + +# rw.dash.readFile(path[, options], callback) + +Equivalent to [rw.readFile](#readFile), except treats a *path* of `-` as `/dev/stdin`. Useful for command-line arguments. + +# rw.dash.readFileSync(path[, options]) + +Equivalent to [rw.readFileSync](#readFileSync), except treats a *path* of `-` as `/dev/stdin`. Useful for command-line arguments. + +# rw.dash.writeFile(path, data[, options], callback) + +Equivalent to [rw.writeFile](#writeFile), except treats a *path* of `-` as `/dev/stdout`. Useful for command-line arguments. + +# rw.dash.writeFileSync(path, data[, options]) + +Equivalent to [rw.writeFileSync](#writeFileSync), except treats a *path* of `-` as `/dev/stdout`. Useful for command-line arguments. diff --git a/node_modules/rw/index.js b/node_modules/rw/index.js new file mode 100644 index 00000000..b0c9dc6d --- /dev/null +++ b/node_modules/rw/index.js @@ -0,0 +1,5 @@ +exports.dash = require("./lib/rw/dash"); +exports.readFile = require("./lib/rw/read-file"); +exports.readFileSync = require("./lib/rw/read-file-sync"); +exports.writeFile = require("./lib/rw/write-file"); +exports.writeFileSync = require("./lib/rw/write-file-sync"); diff --git a/node_modules/rw/lib/rw/dash.js b/node_modules/rw/lib/rw/dash.js new file mode 100644 index 00000000..0c005f13 --- /dev/null +++ b/node_modules/rw/lib/rw/dash.js @@ -0,0 +1,14 @@ +var slice = Array.prototype.slice; + +function dashify(method, file) { + return function(path) { + var argv = arguments; + if (path == "-") (argv = slice.call(argv)).splice(0, 1, file); + return method.apply(null, argv); + }; +} + +exports.readFile = dashify(require("./read-file"), "/dev/stdin"); +exports.readFileSync = dashify(require("./read-file-sync"), "/dev/stdin"); +exports.writeFile = dashify(require("./write-file"), "/dev/stdout"); +exports.writeFileSync = dashify(require("./write-file-sync"), "/dev/stdout"); diff --git a/node_modules/rw/lib/rw/decode.js b/node_modules/rw/lib/rw/decode.js new file mode 100644 index 00000000..008779b1 --- /dev/null +++ b/node_modules/rw/lib/rw/decode.js @@ -0,0 +1,23 @@ +module.exports = function(options) { + if (options) { + if (typeof options === "string") return encoding(options); + if (options.encoding !== null) return encoding(options.encoding); + } + return identity(); +}; + +function identity() { + var chunks = []; + return { + push: function(chunk) { chunks.push(chunk); }, + value: function() { return Buffer.concat(chunks); } + }; +} + +function encoding(encoding) { + var chunks = []; + return { + push: function(chunk) { chunks.push(chunk); }, + value: function() { return Buffer.concat(chunks).toString(encoding); } + }; +} diff --git a/node_modules/rw/lib/rw/encode.js b/node_modules/rw/lib/rw/encode.js new file mode 100644 index 00000000..4a3926eb --- /dev/null +++ b/node_modules/rw/lib/rw/encode.js @@ -0,0 +1,7 @@ +module.exports = function(data, options) { + return typeof data === "string" + ? new Buffer(data, typeof options === "string" ? options + : options && options.encoding !== null ? options.encoding + : "utf8") + : data; +}; diff --git a/node_modules/rw/lib/rw/read-file-sync.js b/node_modules/rw/lib/rw/read-file-sync.js new file mode 100644 index 00000000..374c2a0c --- /dev/null +++ b/node_modules/rw/lib/rw/read-file-sync.js @@ -0,0 +1,29 @@ +var fs = require("fs"), + decode = require("./decode"); + +module.exports = function(filename, options) { + if (fs.statSync(filename).isFile()) { + return fs.readFileSync(filename, options); + } else { + var fd = fs.openSync(filename, options && options.flag || "r"), + decoder = decode(options); + + while (true) { // eslint-disable-line no-constant-condition + try { + var buffer = new Buffer(bufferSize), + bytesRead = fs.readSync(fd, buffer, 0, bufferSize); + } catch (e) { + if (e.code === "EOF") break; + fs.closeSync(fd); + throw e; + } + if (bytesRead === 0) break; + decoder.push(buffer.slice(0, bytesRead)); + } + + fs.closeSync(fd); + return decoder.value(); + } +}; + +var bufferSize = 1 << 16; diff --git a/node_modules/rw/lib/rw/read-file.js b/node_modules/rw/lib/rw/read-file.js new file mode 100644 index 00000000..02aa122e --- /dev/null +++ b/node_modules/rw/lib/rw/read-file.js @@ -0,0 +1,23 @@ +var fs = require("fs"), + decode = require("./decode"); + +module.exports = function(path, options, callback) { + if (arguments.length < 3) callback = options, options = null; + + switch (path) { + case "/dev/stdin": return readStream(process.stdin, options, callback); + } + + fs.stat(path, function(error, stat) { + if (error) return callback(error); + if (stat.isFile()) return fs.readFile(path, options, callback); + readStream(fs.createReadStream(path, options ? {flags: options.flag || "r"} : {}), options, callback); // N.B. flag / flags + }); +}; + +function readStream(stream, options, callback) { + var decoder = decode(options); + stream.on("error", callback); + stream.on("data", function(d) { decoder.push(d); }); + stream.on("end", function() { callback(null, decoder.value()); }); +} diff --git a/node_modules/rw/lib/rw/write-file-sync.js b/node_modules/rw/lib/rw/write-file-sync.js new file mode 100644 index 00000000..0b04a2a6 --- /dev/null +++ b/node_modules/rw/lib/rw/write-file-sync.js @@ -0,0 +1,32 @@ +var fs = require("fs"), + encode = require("./encode"); + +module.exports = function(filename, data, options) { + var stat; + + try { + stat = fs.statSync(filename); + } catch (error) { + if (error.code !== "ENOENT") throw error; + } + + if (!stat || stat.isFile()) { + fs.writeFileSync(filename, data, options); + } else { + var fd = fs.openSync(filename, options && options.flag || "w"), + bytesWritten = 0, + bytesTotal = (data = encode(data, options)).length; + + while (bytesWritten < bytesTotal) { + try { + bytesWritten += fs.writeSync(fd, data, bytesWritten, bytesTotal - bytesWritten, null); + } catch (error) { + if (error.code === "EPIPE") break; // ignore broken pipe, e.g., | head + fs.closeSync(fd); + throw error; + } + } + + fs.closeSync(fd); + } +}; diff --git a/node_modules/rw/lib/rw/write-file.js b/node_modules/rw/lib/rw/write-file.js new file mode 100644 index 00000000..2e2c0b26 --- /dev/null +++ b/node_modules/rw/lib/rw/write-file.js @@ -0,0 +1,22 @@ +var fs = require("fs"), + encode = require("./encode"); + +module.exports = function(path, data, options, callback) { + if (arguments.length < 4) callback = options, options = null; + + switch (path) { + case "/dev/stdout": return writeStream(process.stdout, "write", data, options, callback); + case "/dev/stderr": return writeStream(process.stderr, "write", data, options, callback); + } + + fs.stat(path, function(error, stat) { + if (error && error.code !== "ENOENT") return callback(error); + if (stat && stat.isFile()) return fs.writeFile(path, data, options, callback); + writeStream(fs.createWriteStream(path, options ? {flags: options.flag || "w"} : {}), "end", data, options, callback); // N.B. flag / flags + }); +}; + +function writeStream(stream, send, data, options, callback) { + stream.on("error", function(error) { callback(error.code === "EPIPE" ? null : error); }); // ignore broken pipe, e.g., | head + stream[send](encode(data, options), function(error) { callback(error && error.code === "EPIPE" ? null : error); }); +} diff --git a/node_modules/rw/package.json b/node_modules/rw/package.json new file mode 100644 index 00000000..5f32703f --- /dev/null +++ b/node_modules/rw/package.json @@ -0,0 +1,60 @@ +{ + "_from": "rw@1", + "_id": "rw@1.3.3", + "_inBundle": false, + "_integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=", + "_location": "/rw", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "rw@1", + "name": "rw", + "escapedName": "rw", + "rawSpec": "1", + "saveSpec": null, + "fetchSpec": "1" + }, + "_requiredBy": [ + "/d3-dsv" + ], + "_resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "_shasum": "3f862dfa91ab766b14885ef4d01124bfda074fb4", + "_spec": "rw@1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\d3-dsv", + "author": { + "name": "Mike Bostock", + "url": "http://bost.ocks.org/mike" + }, + "bugs": { + "url": "https://github.com/mbostock/rw/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Now stdin and stdout are files.", + "devDependencies": { + "d3-queue": "3", + "eslint": "3" + }, + "homepage": "https://github.com/mbostock/rw", + "keywords": [ + "fs", + "readFile", + "writeFile", + "stdin", + "stdout" + ], + "license": "BSD-3-Clause", + "main": "index.js", + "name": "rw", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/mbostock/rw.git" + }, + "scripts": { + "postpublish": "git push && git push --tags", + "prepublish": "npm test", + "test": "test/run-tests && eslint index.js lib" + }, + "version": "1.3.3" +} diff --git a/node_modules/rw/test/cat-async b/node_modules/rw/test/cat-async new file mode 100644 index 00000000..f229958d --- /dev/null +++ b/node_modules/rw/test/cat-async @@ -0,0 +1,10 @@ +#!/usr/bin/env node + +var rw = require("../").dash; + +rw.readFile(process.argv[2] || "-", "utf8", function(error, contents) { + if (error) throw error; + rw.writeFile("-", contents, "utf8", function(error) { + if (error) throw error; + }); +}); diff --git a/node_modules/rw/test/cat-sync b/node_modules/rw/test/cat-sync new file mode 100644 index 00000000..9ef307f4 --- /dev/null +++ b/node_modules/rw/test/cat-sync @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +var rw = require("../").dash; + +rw.writeFileSync("-", rw.readFileSync(process.argv[2] || "-", "utf8"), "utf8"); diff --git a/node_modules/rw/test/encode-object-async b/node_modules/rw/test/encode-object-async new file mode 100644 index 00000000..0351d636 --- /dev/null +++ b/node_modules/rw/test/encode-object-async @@ -0,0 +1,7 @@ +#!/usr/bin/env node + +var rw = require("../").dash; + +rw.writeFile(process.argv[2] || "-", "gréén\n", {encoding: process.argv[3]}, function(error) { + if (error) throw error; +}); diff --git a/node_modules/rw/test/encode-object-sync b/node_modules/rw/test/encode-object-sync new file mode 100644 index 00000000..60c641c8 --- /dev/null +++ b/node_modules/rw/test/encode-object-sync @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +var rw = require("../").dash; + +rw.writeFileSync(process.argv[2] || "-", "gréén\n", {encoding: process.argv[3]}); diff --git a/node_modules/rw/test/encode-string-async b/node_modules/rw/test/encode-string-async new file mode 100644 index 00000000..348e00ca --- /dev/null +++ b/node_modules/rw/test/encode-string-async @@ -0,0 +1,7 @@ +#!/usr/bin/env node + +var rw = require("../").dash; + +rw.writeFile(process.argv[2] || "-", "gréén\n", process.argv[3], function(error) { + if (error) throw error; +}); diff --git a/node_modules/rw/test/encode-string-sync b/node_modules/rw/test/encode-string-sync new file mode 100644 index 00000000..5fdc4c3c --- /dev/null +++ b/node_modules/rw/test/encode-string-sync @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +var rw = require("../").dash; + +rw.writeFileSync(process.argv[2] || "-", "gréén\n", process.argv[3]); diff --git a/node_modules/rw/test/encoding-async b/node_modules/rw/test/encoding-async new file mode 100644 index 00000000..9782c92a --- /dev/null +++ b/node_modules/rw/test/encoding-async @@ -0,0 +1,42 @@ +#!/usr/bin/env node + +var fs = require("fs"), + queue = require("d3-queue").queue, + rw = require("../"); + +var code = 0; + +queue(1) + .defer(testRead, "utf8", "gréén\n") + .defer(testRead, {encoding: "utf8"}, "gréén\n") + .defer(testRead, "ascii", "grC)C)n\n") + .defer(testRead, {encoding: "ascii"}, "grC)C)n\n") + .defer(testWrite, "utf8", "gréén\n") + .defer(testWrite, {encoding: "utf8"}, "gréén\n") + .defer(testWrite, "ascii", "gr��n\n") + .defer(testWrite, {encoding: "ascii"}, "gr��n\n") + .await(done); + +function testRead(options, expected, callback) { + rw.readFile("test/utf8.txt", options, function(error, actual) { + if (error) return void callback(error); + if (actual !== expected) console.warn(actual + " !== " + expected), code = 1; + callback(null); + }); +} + +function testWrite(options, expected, callback) { + rw.writeFile("test/encoding-async.out", "gréén\n", options, function(error) { + if (error) return void callback(error); + fs.readFile("test/encoding-async.out", "utf8", function(error, actual) { + if (error) return void callback(error); + if (actual !== expected) console.warn(actual + " !== " + expected), code = 1; + callback(null); + }); + }); +} + +function done(error) { + if (error) throw error; + process.exit(code); +} diff --git a/node_modules/rw/test/encoding-sync b/node_modules/rw/test/encoding-sync new file mode 100644 index 00000000..80f7e4e8 --- /dev/null +++ b/node_modules/rw/test/encoding-sync @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +var fs = require("fs"), + rw = require("../"); + +var code = 0, + actual, + expected; + +if ((actual = rw.readFileSync("test/utf8.txt", "utf8")) !== (expected = "gréén\n")) code = 1, console.warn(actual + " !== " + expected); +if ((actual = rw.readFileSync("test/utf8.txt", {encoding: "utf8"})) !== (expected = "gréén\n")) code = 1, console.warn(actual + " !== " + expected); +if ((actual = rw.readFileSync("test/utf8.txt", "ascii")) !== (expected = "grC)C)n\n")) code = 1, console.warn(actual + " !== " + expected); +if ((actual = rw.readFileSync("test/utf8.txt", {encoding: "ascii"})) !== (expected = "grC)C)n\n")) code = 1, console.warn(actual + " !== " + expected); + +rw.writeFileSync("test/encoding-sync.out", "gréén\n", "utf8"); if ((actual = fs.readFileSync("test/encoding-sync.out", "utf8")) !== (expected = "gréén\n")) code = 1, console.warn(actual + " !== " + expected); +rw.writeFileSync("test/encoding-sync.out", "gréén\n", {encoding: "utf8"}); if ((actual = fs.readFileSync("test/encoding-sync.out", "utf8")) !== (expected = "gréén\n")) code = 1, console.warn(actual + " !== " + expected); +rw.writeFileSync("test/encoding-sync.out", "gréén\n", "ascii"); if ((actual = fs.readFileSync("test/encoding-sync.out", "utf8")) !== (expected = "gr��n\n")) code = 1, console.warn(actual + " !== " + expected); +rw.writeFileSync("test/encoding-sync.out", "gréén\n", {encoding: "ascii"}); if ((actual = fs.readFileSync("test/encoding-sync.out", "utf8")) !== (expected = "gr��n\n")) code = 1, console.warn(actual + " !== " + expected); + +process.exit(code); diff --git a/node_modules/rw/test/run-tests b/node_modules/rw/test/run-tests new file mode 100644 index 00000000..5b3272fd --- /dev/null +++ b/node_modules/rw/test/run-tests @@ -0,0 +1,53 @@ +#!/bin/bash + +FILE=test/input.txt + +rm -f -- $FILE +for i in {1..10000}; do printf '%09X\n' $RANDOM >> $FILE; done + +function test() +{ + if [[ $1 -eq 0 ]] + then + echo -e "\x1B[1;32m✓ $2\x1B[0m" + else + echo -e "\x1B[1;31m✗ $2\x1B[0m" + fi +} + +test/encoding-sync; test $? "encoding-sync applies the specified encodings" +test/encoding-async; test $? "encoding-async applies the specified encodings" +[ "$(test/wc-async $FILE)" = "100000" ]; test $? "wc-async reads an entire file" +[ "$(test/wc-sync $FILE)" = "100000" ]; test $? "wc-sync reads an entire file" +[ "$(test/wc-async < $FILE)" = "100000" ]; test $? "wc-async reads an entire file from stdin" +[ "$(test/wc-sync < $FILE)" = "100000" ]; test $? "wc-sync reads an entire file from stdin" +[ "$(cat $FILE | test/wc-async)" = "100000" ]; test $? "wc-async reads an entire file from a pipe" +[ "$(cat $FILE | test/wc-sync)" = "100000" ]; test $? "wc-sync reads an entire file from a pipe" +[ "$(test/cat-async $FILE | wc -c | tr -d ' ')" = "100000" ]; test $? "cat-async reads an entire file and writes it to a pipe" +[ "$(test/cat-sync $FILE | wc -c | tr -d ' ')" = "100000" ]; test $? "cat-sync reads an entire file and writes it to a pipe" +[ "$(test/cat-async $FILE | test/wc-async)" = "100000" ]; test $? "cat-async reads an entire file and writes it to a pipe to wc-async " +[ "$(test/cat-async $FILE | test/wc-sync)" = "100000" ]; test $? "cat-async reads an entire file and writes it to a pipe to wc-sync " +[ "$(test/cat-sync $FILE | test/wc-async)" = "100000" ]; test $? "cat-sync reads an entire file and writes it to a pipe to wc-async " +[ "$(test/cat-sync $FILE | test/wc-sync)" = "100000" ]; test $? "cat-sync reads an entire file and writes it to a pipe to wc-sync " +[ "$(test/cat-async < $FILE | wc -c | tr -d ' ')" = "100000" ]; test $? "cat-async reads an entire file from stdin and writes it to a pipe" +[ "$(test/cat-sync < $FILE | wc -c | tr -d ' ')" = "100000" ]; test $? "cat-sync reads an entire file from stdin and writes it to a pipe" +[ "$(test/cat-async < $FILE | test/wc-async)" = "100000" ]; test $? "cat-async reads an entire file from stdin and writes it to a pipe to wc-async" +[ "$(test/cat-async < $FILE | test/wc-sync)" = "100000" ]; test $? "cat-async reads an entire file from stdin and writes it to a pipe to wc-sync" +[ "$(test/cat-sync < $FILE | test/wc-async)" = "100000" ]; test $? "cat-sync reads an entire file from stdin and writes it to a pipe to wc-async" +[ "$(test/cat-sync < $FILE | test/wc-sync)" = "100000" ]; test $? "cat-sync reads an entire file from stdin and writes it to a pipe to wc-sync" +[ "$(cat $FILE | test/cat-async | test/wc-async)" = "100000" ]; test $? "cat-async reads an entire file from a pipe and writes it to a pipe to wc-async" +[ "$(cat $FILE | test/cat-async | test/wc-sync)" = "100000" ]; test $? "cat-async reads an entire file from a pipe and writes it to a pipe to wc-sync" +[ "$(cat $FILE | test/cat-sync | test/wc-async)" = "100000" ]; test $? "cat-sync reads an entire file from a pipe and writes it to a pipe to wc-async" +[ "$(cat $FILE | test/cat-sync | test/wc-sync)" = "100000" ]; test $? "cat-sync reads an entire file from a pipe and writes it to a pipe to wc-sync" +[ "$(cat $FILE | test/cat-async | head -n 100 | test/wc-async)" = "1000" ]; test $? "cat-async reads an entire file from a pipe and writes it to a pipe to head to wc-async" +[ "$(cat $FILE | test/cat-async | head -n 100 | test/wc-sync)" = "1000" ]; test $? "cat-async reads an entire file from a pipe and writes it to a pipe to head to wc-sync" +[ "$(cat $FILE | test/cat-sync | head -n 100 | test/wc-async)" = "1000" ]; test $? "cat-sync reads an entire file from a pipe and writes it to a pipe to head to wc-async" +[ "$(cat $FILE | test/cat-sync | head -n 100 | test/wc-sync)" = "1000" ]; test $? "cat-sync reads an entire file from a pipe and writes it to a pipe to head to wc-sync" +[ "$(cat $FILE 2> /dev/null | head -n 100 | test/cat-async | test/wc-async)" = "1000" ]; test $? "cat-async reads the head of a file from a pipe and writes it to wc-async" +[ "$(cat $FILE 2> /dev/null | head -n 100 | test/cat-async | test/wc-sync)" = "1000" ]; test $? "cat-async reads the head of a file from a pipe and writes it to wc-sync" +[ "$(cat $FILE 2> /dev/null | head -n 100 | test/cat-sync | test/wc-async)" = "1000" ]; test $? "cat-sync reads the head of a file from a pipe and writes it to wc-async" +[ "$(cat $FILE 2> /dev/null | head -n 100 | test/cat-sync | test/wc-sync)" = "1000" ]; test $? "cat-sync reads the head of a file from a pipe and writes it to wc-sync" +[ "$(test/write-async test/write.out && cat test/write.out)" = "Hello, world!" ]; test $? "write-async writes an entire file" +[ "$(test/write-sync test/write.out && cat test/write.out)" = "Hello, world!" ]; test $? "write-sync writes an entire file" + +rm -f -- $FILE test/write.out test/encoding-sync.out test/encoding-async.out diff --git a/node_modules/rw/test/utf8.txt b/node_modules/rw/test/utf8.txt new file mode 100644 index 00000000..23bfe766 --- /dev/null +++ b/node_modules/rw/test/utf8.txt @@ -0,0 +1 @@ +gréén diff --git a/node_modules/rw/test/wc-async b/node_modules/rw/test/wc-async new file mode 100644 index 00000000..08102718 --- /dev/null +++ b/node_modules/rw/test/wc-async @@ -0,0 +1,8 @@ +#!/usr/bin/env node + +var rw = require("../").dash; + +rw.readFile(process.argv[2] || "-", function(error, contents) { + if (error) throw error; + console.log(contents.length); +}); diff --git a/node_modules/rw/test/wc-sync b/node_modules/rw/test/wc-sync new file mode 100644 index 00000000..6a8d1d79 --- /dev/null +++ b/node_modules/rw/test/wc-sync @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +var rw = require("../").dash; + +console.log(rw.readFileSync(process.argv[2] || "-", "utf8").length); diff --git a/node_modules/rw/test/write-async b/node_modules/rw/test/write-async new file mode 100644 index 00000000..2444ad0b --- /dev/null +++ b/node_modules/rw/test/write-async @@ -0,0 +1,7 @@ +#!/usr/bin/env node + +var rw = require("../").dash; + +rw.writeFile(process.argv[2] || "-", "Hello, world!", "utf8", function(error) { + if (error) throw error; +}); diff --git a/node_modules/rw/test/write-sync b/node_modules/rw/test/write-sync new file mode 100644 index 00000000..ef8d0d80 --- /dev/null +++ b/node_modules/rw/test/write-sync @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +var rw = require("../").dash; + +rw.writeFileSync(process.argv[2] || "-", "Hello, world!", "utf8"); diff --git a/node_modules/safe-buffer/LICENSE b/node_modules/safe-buffer/LICENSE new file mode 100644 index 00000000..0c068cee --- /dev/null +++ b/node_modules/safe-buffer/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +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/node_modules/safe-buffer/README.md b/node_modules/safe-buffer/README.md new file mode 100644 index 00000000..e9a81afd --- /dev/null +++ b/node_modules/safe-buffer/README.md @@ -0,0 +1,584 @@ +# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url] + +[travis-image]: https://img.shields.io/travis/feross/safe-buffer/master.svg +[travis-url]: https://travis-ci.org/feross/safe-buffer +[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg +[npm-url]: https://npmjs.org/package/safe-buffer +[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg +[downloads-url]: https://npmjs.org/package/safe-buffer +[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg +[standard-url]: https://standardjs.com + +#### Safer Node.js Buffer API + +**Use the new Node.js Buffer APIs (`Buffer.from`, `Buffer.alloc`, +`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in all versions of Node.js.** + +**Uses the built-in implementation when available.** + +## install + +``` +npm install safe-buffer +``` + +## usage + +The goal of this package is to provide a safe replacement for the node.js `Buffer`. + +It's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to +the top of your node.js modules: + +```js +var Buffer = require('safe-buffer').Buffer + +// Existing buffer code will continue to work without issues: + +new Buffer('hey', 'utf8') +new Buffer([1, 2, 3], 'utf8') +new Buffer(obj) +new Buffer(16) // create an uninitialized buffer (potentially unsafe) + +// But you can use these new explicit APIs to make clear what you want: + +Buffer.from('hey', 'utf8') // convert from many types to a Buffer +Buffer.alloc(16) // create a zero-filled buffer (safe) +Buffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe) +``` + +## api + +### Class Method: Buffer.from(array) + + +* `array` {Array} + +Allocates a new `Buffer` using an `array` of octets. + +```js +const buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]); + // creates a new Buffer containing ASCII bytes + // ['b','u','f','f','e','r'] +``` + +A `TypeError` will be thrown if `array` is not an `Array`. + +### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]]) + + +* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or + a `new ArrayBuffer()` +* `byteOffset` {Number} Default: `0` +* `length` {Number} Default: `arrayBuffer.length - byteOffset` + +When passed a reference to the `.buffer` property of a `TypedArray` instance, +the newly created `Buffer` will share the same allocated memory as the +TypedArray. + +```js +const arr = new Uint16Array(2); +arr[0] = 5000; +arr[1] = 4000; + +const buf = Buffer.from(arr.buffer); // shares the memory with arr; + +console.log(buf); + // Prints: + +// changing the TypedArray changes the Buffer also +arr[1] = 6000; + +console.log(buf); + // Prints: +``` + +The optional `byteOffset` and `length` arguments specify a memory range within +the `arrayBuffer` that will be shared by the `Buffer`. + +```js +const ab = new ArrayBuffer(10); +const buf = Buffer.from(ab, 0, 2); +console.log(buf.length); + // Prints: 2 +``` + +A `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`. + +### Class Method: Buffer.from(buffer) + + +* `buffer` {Buffer} + +Copies the passed `buffer` data onto a new `Buffer` instance. + +```js +const buf1 = Buffer.from('buffer'); +const buf2 = Buffer.from(buf1); + +buf1[0] = 0x61; +console.log(buf1.toString()); + // 'auffer' +console.log(buf2.toString()); + // 'buffer' (copy is not changed) +``` + +A `TypeError` will be thrown if `buffer` is not a `Buffer`. + +### Class Method: Buffer.from(str[, encoding]) + + +* `str` {String} String to encode. +* `encoding` {String} Encoding to use, Default: `'utf8'` + +Creates a new `Buffer` containing the given JavaScript string `str`. If +provided, the `encoding` parameter identifies the character encoding. +If not provided, `encoding` defaults to `'utf8'`. + +```js +const buf1 = Buffer.from('this is a tést'); +console.log(buf1.toString()); + // prints: this is a tést +console.log(buf1.toString('ascii')); + // prints: this is a tC)st + +const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex'); +console.log(buf2.toString()); + // prints: this is a tést +``` + +A `TypeError` will be thrown if `str` is not a string. + +### Class Method: Buffer.alloc(size[, fill[, encoding]]) + + +* `size` {Number} +* `fill` {Value} Default: `undefined` +* `encoding` {String} Default: `utf8` + +Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the +`Buffer` will be *zero-filled*. + +```js +const buf = Buffer.alloc(5); +console.log(buf); + // +``` + +The `size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +If `fill` is specified, the allocated `Buffer` will be initialized by calling +`buf.fill(fill)`. See [`buf.fill()`][] for more information. + +```js +const buf = Buffer.alloc(5, 'a'); +console.log(buf); + // +``` + +If both `fill` and `encoding` are specified, the allocated `Buffer` will be +initialized by calling `buf.fill(fill, encoding)`. For example: + +```js +const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64'); +console.log(buf); + // +``` + +Calling `Buffer.alloc(size)` can be significantly slower than the alternative +`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance +contents will *never contain sensitive data*. + +A `TypeError` will be thrown if `size` is not a number. + +### Class Method: Buffer.allocUnsafe(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* `Buffer` of `size` bytes. The `size` must +be less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit +architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is +thrown. A zero-length Buffer will be created if a `size` less than or equal to +0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +```js +const buf = Buffer.allocUnsafe(5); +console.log(buf); + // + // (octets will be different, every time) +buf.fill(0); +console.log(buf); + // +``` + +A `TypeError` will be thrown if `size` is not a number. + +Note that the `Buffer` module pre-allocates an internal `Buffer` instance of +size `Buffer.poolSize` that is used as a pool for the fast allocation of new +`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated +`new Buffer(size)` constructor) only when `size` is less than or equal to +`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default +value of `Buffer.poolSize` is `8192` but can be modified. + +Use of this pre-allocated internal memory pool is a key difference between +calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`. +Specifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer +pool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal +Buffer pool if `size` is less than or equal to half `Buffer.poolSize`. The +difference is subtle but can be important when an application requires the +additional performance that `Buffer.allocUnsafe(size)` provides. + +### Class Method: Buffer.allocUnsafeSlow(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes. The +`size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances, +allocations under 4KB are, by default, sliced from a single pre-allocated +`Buffer`. This allows applications to avoid the garbage collection overhead of +creating many individually allocated Buffers. This approach improves both +performance and memory usage by eliminating the need to track and cleanup as +many `Persistent` objects. + +However, in the case where a developer may need to retain a small chunk of +memory from a pool for an indeterminate amount of time, it may be appropriate +to create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then +copy out the relevant bits. + +```js +// need to keep around a few small chunks of memory +const store = []; + +socket.on('readable', () => { + const data = socket.read(); + // allocate for retained data + const sb = Buffer.allocUnsafeSlow(10); + // copy the data into the new allocation + data.copy(sb, 0, 0, 10); + store.push(sb); +}); +``` + +Use of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after* +a developer has observed undue memory retention in their applications. + +A `TypeError` will be thrown if `size` is not a number. + +### All the Rest + +The rest of the `Buffer` API is exactly the same as in node.js. +[See the docs](https://nodejs.org/api/buffer.html). + + +## Related links + +- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660) +- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4) + +## Why is `Buffer` unsafe? + +Today, the node.js `Buffer` constructor is overloaded to handle many different argument +types like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.), +`ArrayBuffer`, and also `Number`. + +The API is optimized for convenience: you can throw any type at it, and it will try to do +what you want. + +Because the Buffer constructor is so powerful, you often see code like this: + +```js +// Convert UTF-8 strings to hex +function toHex (str) { + return new Buffer(str).toString('hex') +} +``` + +***But what happens if `toHex` is called with a `Number` argument?*** + +### Remote Memory Disclosure + +If an attacker can make your program call the `Buffer` constructor with a `Number` +argument, then they can make it allocate uninitialized memory from the node.js process. +This could potentially disclose TLS private keys, user data, or database passwords. + +When the `Buffer` constructor is passed a `Number` argument, it returns an +**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like +this, you **MUST** overwrite the contents before returning it to the user. + +From the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size): + +> `new Buffer(size)` +> +> - `size` Number +> +> The underlying memory for `Buffer` instances created in this way is not initialized. +> **The contents of a newly created `Buffer` are unknown and could contain sensitive +> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes. + +(Emphasis our own.) + +Whenever the programmer intended to create an uninitialized `Buffer` you often see code +like this: + +```js +var buf = new Buffer(16) + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### Would this ever be a problem in real code? + +Yes. It's surprisingly common to forget to check the type of your variables in a +dynamically-typed language like JavaScript. + +Usually the consequences of assuming the wrong type is that your program crashes with an +uncaught exception. But the failure mode for forgetting to check the type of arguments to +the `Buffer` constructor is more catastrophic. + +Here's an example of a vulnerable service that takes a JSON payload and converts it to +hex: + +```js +// Take a JSON payload {str: "some string"} and convert it to hex +var server = http.createServer(function (req, res) { + var data = '' + req.setEncoding('utf8') + req.on('data', function (chunk) { + data += chunk + }) + req.on('end', function () { + var body = JSON.parse(data) + res.end(new Buffer(body.str).toString('hex')) + }) +}) + +server.listen(8080) +``` + +In this example, an http client just has to send: + +```json +{ + "str": 1000 +} +``` + +and it will get back 1,000 bytes of uninitialized memory from the server. + +This is a very serious bug. It's similar in severity to the +[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process +memory by remote attackers. + + +### Which real-world packages were vulnerable? + +#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht) + +[Mathias Buus](https://github.com/mafintosh) and I +([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages, +[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow +anyone on the internet to send a series of messages to a user of `bittorrent-dht` and get +them to reveal 20 bytes at a time of uninitialized memory from the node.js process. + +Here's +[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8) +that fixed it. We released a new fixed version, created a +[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all +vulnerable versions on npm so users will get a warning to upgrade to a newer version. + +#### [`ws`](https://www.npmjs.com/package/ws) + +That got us wondering if there were other vulnerable packages. Sure enough, within a short +period of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the +most popular WebSocket implementation in node.js. + +If certain APIs were called with `Number` parameters instead of `String` or `Buffer` as +expected, then uninitialized server memory would be disclosed to the remote peer. + +These were the vulnerable methods: + +```js +socket.send(number) +socket.ping(number) +socket.pong(number) +``` + +Here's a vulnerable socket server with some echo functionality: + +```js +server.on('connection', function (socket) { + socket.on('message', function (message) { + message = JSON.parse(message) + if (message.type === 'echo') { + socket.send(message.data) // send back the user's message + } + }) +}) +``` + +`socket.send(number)` called on the server, will disclose server memory. + +Here's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue +was fixed, with a more detailed explanation. Props to +[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the +[Node Security Project disclosure](https://nodesecurity.io/advisories/67). + + +### What's the solution? + +It's important that node.js offers a fast way to get memory otherwise performance-critical +applications would needlessly get a lot slower. + +But we need a better way to *signal our intent* as programmers. **When we want +uninitialized memory, we should request it explicitly.** + +Sensitive functionality should not be packed into a developer-friendly API that loosely +accepts many different types. This type of API encourages the lazy practice of passing +variables in without checking the type very carefully. + +#### A new API: `Buffer.allocUnsafe(number)` + +The functionality of creating buffers with uninitialized memory should be part of another +API. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that +frequently gets user input of all sorts of different types passed into it. + +```js +var buf = Buffer.allocUnsafe(16) // careful, uninitialized memory! + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### How do we fix node.js core? + +We sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as +`semver-major`) which defends against one case: + +```js +var str = 16 +new Buffer(str, 'utf8') +``` + +In this situation, it's implied that the programmer intended the first argument to be a +string, since they passed an encoding as a second argument. Today, node.js will allocate +uninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not +what the programmer intended. + +But this is only a partial solution, since if the programmer does `new Buffer(variable)` +(without an `encoding` parameter) there's no way to know what they intended. If `variable` +is sometimes a number, then uninitialized memory will sometimes be returned. + +### What's the real long-term fix? + +We could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when +we need uninitialized memory. But that would break 1000s of packages. + +~~We believe the best solution is to:~~ + +~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~ + +~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~ + +#### Update + +We now support adding three new APIs: + +- `Buffer.from(value)` - convert from any type to a buffer +- `Buffer.alloc(size)` - create a zero-filled buffer +- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size + +This solves the core problem that affected `ws` and `bittorrent-dht` which is +`Buffer(variable)` getting tricked into taking a number argument. + +This way, existing code continues working and the impact on the npm ecosystem will be +minimal. Over time, npm maintainers can migrate performance-critical code to use +`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`. + + +### Conclusion + +We think there's a serious design issue with the `Buffer` API as it exists today. It +promotes insecure software by putting high-risk functionality into a convenient API +with friendly "developer ergonomics". + +This wasn't merely a theoretical exercise because we found the issue in some of the +most popular npm packages. + +Fortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of +`buffer`. + +```js +var Buffer = require('safe-buffer').Buffer +``` + +Eventually, we hope that node.js core can switch to this new, safer behavior. We believe +the impact on the ecosystem would be minimal since it's not a breaking change. +Well-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while +older, insecure packages would magically become safe from this attack vector. + + +## links + +- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514) +- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67) +- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68) + + +## credit + +The original issues in `bittorrent-dht` +([disclosure](https://nodesecurity.io/advisories/68)) and +`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by +[Mathias Buus](https://github.com/mafintosh) and +[Feross Aboukhadijeh](http://feross.org/). + +Thanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues +and for his work running the [Node Security Project](https://nodesecurity.io/). + +Thanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and +auditing the code. + + +## license + +MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org) diff --git a/node_modules/safe-buffer/index.d.ts b/node_modules/safe-buffer/index.d.ts new file mode 100644 index 00000000..e9fed809 --- /dev/null +++ b/node_modules/safe-buffer/index.d.ts @@ -0,0 +1,187 @@ +declare module "safe-buffer" { + export class Buffer { + length: number + write(string: string, offset?: number, length?: number, encoding?: string): number; + toString(encoding?: string, start?: number, end?: number): string; + toJSON(): { type: 'Buffer', data: any[] }; + equals(otherBuffer: Buffer): boolean; + compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number; + copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; + slice(start?: number, end?: number): Buffer; + writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readUInt8(offset: number, noAssert?: boolean): number; + readUInt16LE(offset: number, noAssert?: boolean): number; + readUInt16BE(offset: number, noAssert?: boolean): number; + readUInt32LE(offset: number, noAssert?: boolean): number; + readUInt32BE(offset: number, noAssert?: boolean): number; + readInt8(offset: number, noAssert?: boolean): number; + readInt16LE(offset: number, noAssert?: boolean): number; + readInt16BE(offset: number, noAssert?: boolean): number; + readInt32LE(offset: number, noAssert?: boolean): number; + readInt32BE(offset: number, noAssert?: boolean): number; + readFloatLE(offset: number, noAssert?: boolean): number; + readFloatBE(offset: number, noAssert?: boolean): number; + readDoubleLE(offset: number, noAssert?: boolean): number; + readDoubleBE(offset: number, noAssert?: boolean): number; + swap16(): Buffer; + swap32(): Buffer; + swap64(): Buffer; + writeUInt8(value: number, offset: number, noAssert?: boolean): number; + writeUInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeInt8(value: number, offset: number, noAssert?: boolean): number; + writeInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeFloatLE(value: number, offset: number, noAssert?: boolean): number; + writeFloatBE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleLE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleBE(value: number, offset: number, noAssert?: boolean): number; + fill(value: any, offset?: number, end?: number): this; + indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean; + + /** + * Allocates a new buffer containing the given {str}. + * + * @param str String to store in buffer. + * @param encoding encoding to use, optional. Default is 'utf8' + */ + constructor (str: string, encoding?: string); + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + */ + constructor (size: number); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: Uint8Array); + /** + * Produces a Buffer backed by the same allocated memory as + * the given {ArrayBuffer}. + * + * + * @param arrayBuffer The ArrayBuffer with which to share memory. + */ + constructor (arrayBuffer: ArrayBuffer); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: any[]); + /** + * Copies the passed {buffer} data onto a new {Buffer} instance. + * + * @param buffer The buffer to copy. + */ + constructor (buffer: Buffer); + prototype: Buffer; + /** + * Allocates a new Buffer using an {array} of octets. + * + * @param array + */ + static from(array: any[]): Buffer; + /** + * When passed a reference to the .buffer property of a TypedArray instance, + * the newly created Buffer will share the same allocated memory as the TypedArray. + * The optional {byteOffset} and {length} arguments specify a memory range + * within the {arrayBuffer} that will be shared by the Buffer. + * + * @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer() + * @param byteOffset + * @param length + */ + static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer; + /** + * Copies the passed {buffer} data onto a new Buffer instance. + * + * @param buffer + */ + static from(buffer: Buffer): Buffer; + /** + * Creates a new Buffer containing the given JavaScript string {str}. + * If provided, the {encoding} parameter identifies the character encoding. + * If not provided, {encoding} defaults to 'utf8'. + * + * @param str + */ + static from(str: string, encoding?: string): Buffer; + /** + * Returns true if {obj} is a Buffer + * + * @param obj object to test. + */ + static isBuffer(obj: any): obj is Buffer; + /** + * Returns true if {encoding} is a valid encoding argument. + * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex' + * + * @param encoding string to test. + */ + static isEncoding(encoding: string): boolean; + /** + * Gives the actual byte length of a string. encoding defaults to 'utf8'. + * This is not the same as String.prototype.length since that returns the number of characters in a string. + * + * @param string string to test. + * @param encoding encoding used to evaluate (defaults to 'utf8') + */ + static byteLength(string: string, encoding?: string): number; + /** + * Returns a buffer which is the result of concatenating all the buffers in the list together. + * + * If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer. + * If the list has exactly one item, then the first item of the list is returned. + * If the list has more than one item, then a new Buffer is created. + * + * @param list An array of Buffer objects to concatenate + * @param totalLength Total length of the buffers when concatenated. + * If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly. + */ + static concat(list: Buffer[], totalLength?: number): Buffer; + /** + * The same as buf1.compare(buf2). + */ + static compare(buf1: Buffer, buf2: Buffer): number; + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + * @param fill if specified, buffer will be initialized by calling buf.fill(fill). + * If parameter is omitted, buffer will be filled with zeros. + * @param encoding encoding used for call to buf.fill while initalizing + */ + static alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer; + /** + * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafe(size: number): Buffer; + /** + * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafeSlow(size: number): Buffer; + } +} \ No newline at end of file diff --git a/node_modules/safe-buffer/index.js b/node_modules/safe-buffer/index.js new file mode 100644 index 00000000..22438dab --- /dev/null +++ b/node_modules/safe-buffer/index.js @@ -0,0 +1,62 @@ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} diff --git a/node_modules/safe-buffer/package.json b/node_modules/safe-buffer/package.json new file mode 100644 index 00000000..d56fa081 --- /dev/null +++ b/node_modules/safe-buffer/package.json @@ -0,0 +1,63 @@ +{ + "_from": "safe-buffer@5.1.2", + "_id": "safe-buffer@5.1.2", + "_inBundle": false, + "_integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "_location": "/safe-buffer", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "safe-buffer@5.1.2", + "name": "safe-buffer", + "escapedName": "safe-buffer", + "rawSpec": "5.1.2", + "saveSpec": null, + "fetchSpec": "5.1.2" + }, + "_requiredBy": [ + "/content-disposition", + "/express" + ], + "_resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "_shasum": "991ec69d296e0313747d59bdfd2b745c35f8828d", + "_spec": "safe-buffer@5.1.2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "Feross Aboukhadijeh", + "email": "feross@feross.org", + "url": "http://feross.org" + }, + "bugs": { + "url": "https://github.com/feross/safe-buffer/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Safer Node.js Buffer API", + "devDependencies": { + "standard": "*", + "tape": "^4.0.0" + }, + "homepage": "https://github.com/feross/safe-buffer", + "keywords": [ + "buffer", + "buffer allocate", + "node security", + "safe", + "safe-buffer", + "security", + "uninitialized" + ], + "license": "MIT", + "main": "index.js", + "name": "safe-buffer", + "repository": { + "type": "git", + "url": "git://github.com/feross/safe-buffer.git" + }, + "scripts": { + "test": "standard && tape test/*.js" + }, + "types": "index.d.ts", + "version": "5.1.2" +} diff --git a/node_modules/safer-buffer/LICENSE b/node_modules/safer-buffer/LICENSE new file mode 100644 index 00000000..4fe9e6f1 --- /dev/null +++ b/node_modules/safer-buffer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Nikita Skovoroda + +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/node_modules/safer-buffer/Porting-Buffer.md b/node_modules/safer-buffer/Porting-Buffer.md new file mode 100644 index 00000000..68d86bab --- /dev/null +++ b/node_modules/safer-buffer/Porting-Buffer.md @@ -0,0 +1,268 @@ +# Porting to the Buffer.from/Buffer.alloc API + + +## Overview + +- [Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x.](#variant-1) (*recommended*) +- [Variant 2: Use a polyfill](#variant-2) +- [Variant 3: manual detection, with safeguards](#variant-3) + +### Finding problematic bits of code using grep + +Just run `grep -nrE '[^a-zA-Z](Slow)?Buffer\s*\(' --exclude-dir node_modules`. + +It will find all the potentially unsafe places in your own code (with some considerably unlikely +exceptions). + +### Finding problematic bits of code using Node.js 8 + +If you’re using Node.js ≥ 8.0.0 (which is recommended), Node.js exposes multiple options that help with finding the relevant pieces of code: + +- `--trace-warnings` will make Node.js show a stack trace for this warning and other warnings that are printed by Node.js. +- `--trace-deprecation` does the same thing, but only for deprecation warnings. +- `--pending-deprecation` will show more types of deprecation warnings. In particular, it will show the `Buffer()` deprecation warning, even on Node.js 8. + +You can set these flags using an environment variable: + +```console +$ export NODE_OPTIONS='--trace-warnings --pending-deprecation' +$ cat example.js +'use strict'; +const foo = new Buffer('foo'); +$ node example.js +(node:7147) [DEP0005] DeprecationWarning: The Buffer() and new Buffer() constructors are not recommended for use due to security and usability concerns. Please use the new Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() construction methods instead. + at showFlaggedDeprecation (buffer.js:127:13) + at new Buffer (buffer.js:148:3) + at Object. (/path/to/example.js:2:13) + [... more stack trace lines ...] +``` + +### Finding problematic bits of code using linters + +Eslint rules [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +also find calls to deprecated `Buffer()` API. Those rules are included in some pre-sets. + +There is a drawback, though, that it doesn't always +[work correctly](https://github.com/chalker/safer-buffer#why-not-safe-buffer) when `Buffer` is +overriden e.g. with a polyfill, so recommended is a combination of this and some other method +described above. + + +## Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x. + +This is the recommended solution nowadays that would imply only minimal overhead. + +The Node.js 5.x release line has been unsupported since July 2016, and the Node.js 4.x release line reaches its End of Life in April 2018 (→ [Schedule](https://github.com/nodejs/Release#release-schedule)). This means that these versions of Node.js will *not* receive any updates, even in case of security issues, so using these release lines should be avoided, if at all possible. + +What you would do in this case is to convert all `new Buffer()` or `Buffer()` calls to use `Buffer.alloc()` or `Buffer.from()`, in the following way: + +- For `new Buffer(number)`, replace it with `Buffer.alloc(number)`. +- For `new Buffer(string)` (or `new Buffer(string, encoding)`), replace it with `Buffer.from(string)` (or `Buffer.from(string, encoding)`). +- For all other combinations of arguments (these are much rarer), also replace `new Buffer(...arguments)` with `Buffer.from(...arguments)`. + +Note that `Buffer.alloc()` is also _faster_ on the current Node.js versions than +`new Buffer(size).fill(0)`, which is what you would otherwise need to ensure zero-filling. + +Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +is recommended to avoid accidential unsafe Buffer API usage. + +There is also a [JSCodeshift codemod](https://github.com/joyeecheung/node-dep-codemod#dep005) +for automatically migrating Buffer constructors to `Buffer.alloc()` or `Buffer.from()`. +Note that it currently only works with cases where the arguments are literals or where the +constructor is invoked with two arguments. + +_If you currently support those older Node.js versions and dropping them would be a semver-major change +for you, or if you support older branches of your packages, consider using [Variant 2](#variant-2) +or [Variant 3](#variant-3) on older branches, so people using those older branches will also receive +the fix. That way, you will eradicate potential issues caused by unguarded Buffer API usage and +your users will not observe a runtime deprecation warning when running your code on Node.js 10._ + + +## Variant 2: Use a polyfill + +Utilize [safer-buffer](https://www.npmjs.com/package/safer-buffer) as a polyfill to support older +Node.js versions. + +You would take exacly the same steps as in [Variant 1](#variant-1), but with a polyfill +`const Buffer = require('safer-buffer').Buffer` in all files where you use the new `Buffer` api. + +Make sure that you do not use old `new Buffer` API — in any files where the line above is added, +using old `new Buffer()` API will _throw_. It will be easy to notice that in CI, though. + +Alternatively, you could use [buffer-from](https://www.npmjs.com/package/buffer-from) and/or +[buffer-alloc](https://www.npmjs.com/package/buffer-alloc) [ponyfills](https://ponyfill.com/) — +those are great, the only downsides being 4 deps in the tree and slightly more code changes to +migrate off them (as you would be using e.g. `Buffer.from` under a different name). If you need only +`Buffer.from` polyfilled — `buffer-from` alone which comes with no extra dependencies. + +_Alternatively, you could use [safe-buffer](https://www.npmjs.com/package/safe-buffer) — it also +provides a polyfill, but takes a different approach which has +[it's drawbacks](https://github.com/chalker/safer-buffer#why-not-safe-buffer). It will allow you +to also use the older `new Buffer()` API in your code, though — but that's arguably a benefit, as +it is problematic, can cause issues in your code, and will start emitting runtime deprecation +warnings starting with Node.js 10._ + +Note that in either case, it is important that you also remove all calls to the old Buffer +API manually — just throwing in `safe-buffer` doesn't fix the problem by itself, it just provides +a polyfill for the new API. I have seen people doing that mistake. + +Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +is recommended. + +_Don't forget to drop the polyfill usage once you drop support for Node.js < 4.5.0._ + + +## Variant 3 — manual detection, with safeguards + +This is useful if you create Buffer instances in only a few places (e.g. one), or you have your own +wrapper around them. + +### Buffer(0) + +This special case for creating empty buffers can be safely replaced with `Buffer.concat([])`, which +returns the same result all the way down to Node.js 0.8.x. + +### Buffer(notNumber) + +Before: + +```js +var buf = new Buffer(notNumber, encoding); +``` + +After: + +```js +var buf; +if (Buffer.from && Buffer.from !== Uint8Array.from) { + buf = Buffer.from(notNumber, encoding); +} else { + if (typeof notNumber === 'number') + throw new Error('The "size" argument must be of type number.'); + buf = new Buffer(notNumber, encoding); +} +``` + +`encoding` is optional. + +Note that the `typeof notNumber` before `new Buffer` is required (for cases when `notNumber` argument is not +hard-coded) and _is not caused by the deprecation of Buffer constructor_ — it's exactly _why_ the +Buffer constructor is deprecated. Ecosystem packages lacking this type-check caused numereous +security issues — situations when unsanitized user input could end up in the `Buffer(arg)` create +problems ranging from DoS to leaking sensitive information to the attacker from the process memory. + +When `notNumber` argument is hardcoded (e.g. literal `"abc"` or `[0,1,2]`), the `typeof` check can +be omitted. + +Also note that using TypeScript does not fix this problem for you — when libs written in +`TypeScript` are used from JS, or when user input ends up there — it behaves exactly as pure JS, as +all type checks are translation-time only and are not present in the actual JS code which TS +compiles to. + +### Buffer(number) + +For Node.js 0.10.x (and below) support: + +```js +var buf; +if (Buffer.alloc) { + buf = Buffer.alloc(number); +} else { + buf = new Buffer(number); + buf.fill(0); +} +``` + +Otherwise (Node.js ≥ 0.12.x): + +```js +const buf = Buffer.alloc ? Buffer.alloc(number) : new Buffer(number).fill(0); +``` + +## Regarding Buffer.allocUnsafe + +Be extra cautious when using `Buffer.allocUnsafe`: + * Don't use it if you don't have a good reason to + * e.g. you probably won't ever see a performance difference for small buffers, in fact, those + might be even faster with `Buffer.alloc()`, + * if your code is not in the hot code path — you also probably won't notice a difference, + * keep in mind that zero-filling minimizes the potential risks. + * If you use it, make sure that you never return the buffer in a partially-filled state, + * if you are writing to it sequentially — always truncate it to the actuall written length + +Errors in handling buffers allocated with `Buffer.allocUnsafe` could result in various issues, +ranged from undefined behaviour of your code to sensitive data (user input, passwords, certs) +leaking to the remote attacker. + +_Note that the same applies to `new Buffer` usage without zero-filling, depending on the Node.js +version (and lacking type checks also adds DoS to the list of potential problems)._ + + +## FAQ + + +### What is wrong with the `Buffer` constructor? + +The `Buffer` constructor could be used to create a buffer in many different ways: + +- `new Buffer(42)` creates a `Buffer` of 42 bytes. Before Node.js 8, this buffer contained + *arbitrary memory* for performance reasons, which could include anything ranging from + program source code to passwords and encryption keys. +- `new Buffer('abc')` creates a `Buffer` that contains the UTF-8-encoded version of + the string `'abc'`. A second argument could specify another encoding: For example, + `new Buffer(string, 'base64')` could be used to convert a Base64 string into the original + sequence of bytes that it represents. +- There are several other combinations of arguments. + +This meant that, in code like `var buffer = new Buffer(foo);`, *it is not possible to tell +what exactly the contents of the generated buffer are* without knowing the type of `foo`. + +Sometimes, the value of `foo` comes from an external source. For example, this function +could be exposed as a service on a web server, converting a UTF-8 string into its Base64 form: + +``` +function stringToBase64(req, res) { + // The request body should have the format of `{ string: 'foobar' }` + const rawBytes = new Buffer(req.body.string) + const encoded = rawBytes.toString('base64') + res.end({ encoded: encoded }) +} +``` + +Note that this code does *not* validate the type of `req.body.string`: + +- `req.body.string` is expected to be a string. If this is the case, all goes well. +- `req.body.string` is controlled by the client that sends the request. +- If `req.body.string` is the *number* `50`, the `rawBytes` would be 50 bytes: + - Before Node.js 8, the content would be uninitialized + - After Node.js 8, the content would be `50` bytes with the value `0` + +Because of the missing type check, an attacker could intentionally send a number +as part of the request. Using this, they can either: + +- Read uninitialized memory. This **will** leak passwords, encryption keys and other + kinds of sensitive information. (Information leak) +- Force the program to allocate a large amount of memory. For example, when specifying + `500000000` as the input value, each request will allocate 500MB of memory. + This can be used to either exhaust the memory available of a program completely + and make it crash, or slow it down significantly. (Denial of Service) + +Both of these scenarios are considered serious security issues in a real-world +web server context. + +when using `Buffer.from(req.body.string)` instead, passing a number will always +throw an exception instead, giving a controlled behaviour that can always be +handled by the program. + + +### The `Buffer()` constructor has been deprecated for a while. Is this really an issue? + +Surveys of code in the `npm` ecosystem have shown that the `Buffer()` constructor is still +widely used. This includes new code, and overall usage of such code has actually been +*increasing*. diff --git a/node_modules/safer-buffer/Readme.md b/node_modules/safer-buffer/Readme.md new file mode 100644 index 00000000..14b08229 --- /dev/null +++ b/node_modules/safer-buffer/Readme.md @@ -0,0 +1,156 @@ +# safer-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![javascript style guide][standard-image]][standard-url] [![Security Responsible Disclosure][secuirty-image]][secuirty-url] + +[travis-image]: https://travis-ci.org/ChALkeR/safer-buffer.svg?branch=master +[travis-url]: https://travis-ci.org/ChALkeR/safer-buffer +[npm-image]: https://img.shields.io/npm/v/safer-buffer.svg +[npm-url]: https://npmjs.org/package/safer-buffer +[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg +[standard-url]: https://standardjs.com +[secuirty-image]: https://img.shields.io/badge/Security-Responsible%20Disclosure-green.svg +[secuirty-url]: https://github.com/nodejs/security-wg/blob/master/processes/responsible_disclosure_template.md + +Modern Buffer API polyfill without footguns, working on Node.js from 0.8 to current. + +## How to use? + +First, port all `Buffer()` and `new Buffer()` calls to `Buffer.alloc()` and `Buffer.from()` API. + +Then, to achieve compatibility with outdated Node.js versions (`<4.5.0` and 5.x `<5.9.0`), use +`const Buffer = require('safer-buffer').Buffer` in all files where you make calls to the new +Buffer API. _Use `var` instead of `const` if you need that for your Node.js version range support._ + +Also, see the +[porting Buffer](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) guide. + +## Do I need it? + +Hopefully, not — dropping support for outdated Node.js versions should be fine nowdays, and that +is the recommended path forward. You _do_ need to port to the `Buffer.alloc()` and `Buffer.from()` +though. + +See the [porting guide](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) +for a better description. + +## Why not [safe-buffer](https://npmjs.com/safe-buffer)? + +_In short: while `safe-buffer` serves as a polyfill for the new API, it allows old API usage and +itself contains footguns._ + +`safe-buffer` could be used safely to get the new API while still keeping support for older +Node.js versions (like this module), but while analyzing ecosystem usage of the old Buffer API +I found out that `safe-buffer` is itself causing problems in some cases. + +For example, consider the following snippet: + +```console +$ cat example.unsafe.js +console.log(Buffer(20)) +$ ./node-v6.13.0-linux-x64/bin/node example.unsafe.js + +$ standard example.unsafe.js +standard: Use JavaScript Standard Style (https://standardjs.com) + /home/chalker/repo/safer-buffer/example.unsafe.js:2:13: 'Buffer()' was deprecated since v6. Use 'Buffer.alloc()' or 'Buffer.from()' (use 'https://www.npmjs.com/package/safe-buffer' for '<4.5.0') instead. +``` + +This is allocates and writes to console an uninitialized chunk of memory. +[standard](https://www.npmjs.com/package/standard) linter (among others) catch that and warn people +to avoid using unsafe API. + +Let's now throw in `safe-buffer`! + +```console +$ cat example.safe-buffer.js +const Buffer = require('safe-buffer').Buffer +console.log(Buffer(20)) +$ standard example.safe-buffer.js +$ ./node-v6.13.0-linux-x64/bin/node example.safe-buffer.js + +``` + +See the problem? Adding in `safe-buffer` _magically removes the lint warning_, but the behavior +remains identiÑal to what we had before, and when launched on Node.js 6.x LTS — this dumps out +chunks of uninitialized memory. +_And this code will still emit runtime warnings on Node.js 10.x and above._ + +That was done by design. I first considered changing `safe-buffer`, prohibiting old API usage or +emitting warnings on it, but that significantly diverges from `safe-buffer` design. After some +discussion, it was decided to move my approach into a separate package, and _this is that separate +package_. + +This footgun is not imaginary — I observed top-downloaded packages doing that kind of thing, +«fixing» the lint warning by blindly including `safe-buffer` without any actual changes. + +Also in some cases, even if the API _was_ migrated to use of safe Buffer API — a random pull request +can bring unsafe Buffer API usage back to the codebase by adding new calls — and that could go +unnoticed even if you have a linter prohibiting that (becase of the reason stated above), and even +pass CI. _I also observed that being done in popular packages._ + +Some examples: + * [webdriverio](https://github.com/webdriverio/webdriverio/commit/05cbd3167c12e4930f09ef7cf93b127ba4effae4#diff-124380949022817b90b622871837d56cR31) + (a module with 548 759 downloads/month), + * [websocket-stream](https://github.com/maxogden/websocket-stream/commit/c9312bd24d08271687d76da0fe3c83493871cf61) + (218 288 d/m, fix in [maxogden/websocket-stream#142](https://github.com/maxogden/websocket-stream/pull/142)), + * [node-serialport](https://github.com/node-serialport/node-serialport/commit/e8d9d2b16c664224920ce1c895199b1ce2def48c) + (113 138 d/m, fix in [node-serialport/node-serialport#1510](https://github.com/node-serialport/node-serialport/pull/1510)), + * [karma](https://github.com/karma-runner/karma/commit/3d94b8cf18c695104ca195334dc75ff054c74eec) + (3 973 193 d/m, fix in [karma-runner/karma#2947](https://github.com/karma-runner/karma/pull/2947)), + * [spdy-transport](https://github.com/spdy-http2/spdy-transport/commit/5375ac33f4a62a4f65bcfc2827447d42a5dbe8b1) + (5 970 727 d/m, fix in [spdy-http2/spdy-transport#53](https://github.com/spdy-http2/spdy-transport/pull/53)). + * And there are a lot more over the ecosystem. + +I filed a PR at +[mysticatea/eslint-plugin-node#110](https://github.com/mysticatea/eslint-plugin-node/pull/110) to +partially fix that (for cases when that lint rule is used), but it is a semver-major change for +linter rules and presets, so it would take significant time for that to reach actual setups. +_It also hasn't been released yet (2018-03-20)._ + +Also, `safer-buffer` discourages the usage of `.allocUnsafe()`, which is often done by a mistake. +It still supports it with an explicit concern barier, by placing it under +`require('safer-buffer/dangereous')`. + +## But isn't throwing bad? + +Not really. It's an error that could be noticed and fixed early, instead of causing havoc later like +unguarded `new Buffer()` calls that end up receiving user input can do. + +This package affects only the files where `var Buffer = require('safer-buffer').Buffer` was done, so +it is really simple to keep track of things and make sure that you don't mix old API usage with that. +Also, CI should hint anything that you might have missed. + +New commits, if tested, won't land new usage of unsafe Buffer API this way. +_Node.js 10.x also deals with that by printing a runtime depecation warning._ + +### Would it affect third-party modules? + +No, unless you explicitly do an awful thing like monkey-patching or overriding the built-in `Buffer`. +Don't do that. + +### But I don't want throwing… + +That is also fine! + +Also, it could be better in some cases when you don't comprehensive enough test coverage. + +In that case — just don't override `Buffer` and use +`var SaferBuffer = require('safer-buffer').Buffer` instead. + +That way, everything using `Buffer` natively would still work, but there would be two drawbacks: + +* `Buffer.from`/`Buffer.alloc` won't be polyfilled — use `SaferBuffer.from` and + `SaferBuffer.alloc` instead. +* You are still open to accidentally using the insecure deprecated API — use a linter to catch that. + +Note that using a linter to catch accidential `Buffer` constructor usage in this case is strongly +recommended. `Buffer` is not overriden in this usecase, so linters won't get confused. + +## «Without footguns»? + +Well, it is still possible to do _some_ things with `Buffer` API, e.g. accessing `.buffer` property +on older versions and duping things from there. You shouldn't do that in your code, probabably. + +The intention is to remove the most significant footguns that affect lots of packages in the +ecosystem, and to do it in the proper way. + +Also, this package doesn't protect against security issues affecting some Node.js versions, so for +usage in your own production code, it is still recommended to update to a Node.js version +[supported by upstream](https://github.com/nodejs/release#release-schedule). diff --git a/node_modules/safer-buffer/dangerous.js b/node_modules/safer-buffer/dangerous.js new file mode 100644 index 00000000..ca41fdc5 --- /dev/null +++ b/node_modules/safer-buffer/dangerous.js @@ -0,0 +1,58 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var buffer = require('buffer') +var Buffer = buffer.Buffer +var safer = require('./safer.js') +var Safer = safer.Buffer + +var dangerous = {} + +var key + +for (key in safer) { + if (!safer.hasOwnProperty(key)) continue + dangerous[key] = safer[key] +} + +var Dangereous = dangerous.Buffer = {} + +// Copy Safer API +for (key in Safer) { + if (!Safer.hasOwnProperty(key)) continue + Dangereous[key] = Safer[key] +} + +// Copy those missing unsafe methods, if they are present +for (key in Buffer) { + if (!Buffer.hasOwnProperty(key)) continue + if (Dangereous.hasOwnProperty(key)) continue + Dangereous[key] = Buffer[key] +} + +if (!Dangereous.allocUnsafe) { + Dangereous.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + return Buffer(size) + } +} + +if (!Dangereous.allocUnsafeSlow) { + Dangereous.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + return buffer.SlowBuffer(size) + } +} + +module.exports = dangerous diff --git a/node_modules/safer-buffer/package.json b/node_modules/safer-buffer/package.json new file mode 100644 index 00000000..3ad930e9 --- /dev/null +++ b/node_modules/safer-buffer/package.json @@ -0,0 +1,60 @@ +{ + "_from": "safer-buffer@>= 2.1.2 < 3", + "_id": "safer-buffer@2.1.2", + "_inBundle": false, + "_integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "_location": "/safer-buffer", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "safer-buffer@>= 2.1.2 < 3", + "name": "safer-buffer", + "escapedName": "safer-buffer", + "rawSpec": ">= 2.1.2 < 3", + "saveSpec": null, + "fetchSpec": ">= 2.1.2 < 3" + }, + "_requiredBy": [ + "/iconv-lite" + ], + "_resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "_shasum": "44fa161b0187b9549dd84bb91802f9bd8385cd6a", + "_spec": "safer-buffer@>= 2.1.2 < 3", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\iconv-lite", + "author": { + "name": "Nikita Skovoroda", + "email": "chalkerx@gmail.com", + "url": "https://github.com/ChALkeR" + }, + "bugs": { + "url": "https://github.com/ChALkeR/safer-buffer/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Modern Buffer API polyfill without footguns", + "devDependencies": { + "standard": "^11.0.1", + "tape": "^4.9.0" + }, + "files": [ + "Porting-Buffer.md", + "Readme.md", + "tests.js", + "dangerous.js", + "safer.js" + ], + "homepage": "https://github.com/ChALkeR/safer-buffer#readme", + "license": "MIT", + "main": "safer.js", + "name": "safer-buffer", + "repository": { + "type": "git", + "url": "git+https://github.com/ChALkeR/safer-buffer.git" + }, + "scripts": { + "browserify-test": "browserify --external tape tests.js > browserify-tests.js && tape browserify-tests.js", + "test": "standard && tape tests.js" + }, + "version": "2.1.2" +} diff --git a/node_modules/safer-buffer/safer.js b/node_modules/safer-buffer/safer.js new file mode 100644 index 00000000..37c7e1aa --- /dev/null +++ b/node_modules/safer-buffer/safer.js @@ -0,0 +1,77 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var buffer = require('buffer') +var Buffer = buffer.Buffer + +var safer = {} + +var key + +for (key in buffer) { + if (!buffer.hasOwnProperty(key)) continue + if (key === 'SlowBuffer' || key === 'Buffer') continue + safer[key] = buffer[key] +} + +var Safer = safer.Buffer = {} +for (key in Buffer) { + if (!Buffer.hasOwnProperty(key)) continue + if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue + Safer[key] = Buffer[key] +} + +safer.Buffer.prototype = Buffer.prototype + +if (!Safer.from || Safer.from === Uint8Array.from) { + Safer.from = function (value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value) + } + if (value && typeof value.length === 'undefined') { + throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value) + } + return Buffer(value, encodingOrOffset, length) + } +} + +if (!Safer.alloc) { + Safer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + var buf = Buffer(size) + if (!fill || fill.length === 0) { + buf.fill(0) + } else if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + return buf + } +} + +if (!safer.kStringMaxLength) { + try { + safer.kStringMaxLength = process.binding('buffer').kStringMaxLength + } catch (e) { + // we can't determine kStringMaxLength in environments where process.binding + // is unsupported, so let's not set it + } +} + +if (!safer.constants) { + safer.constants = { + MAX_LENGTH: safer.kMaxLength + } + if (safer.kStringMaxLength) { + safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength + } +} + +module.exports = safer diff --git a/node_modules/safer-buffer/tests.js b/node_modules/safer-buffer/tests.js new file mode 100644 index 00000000..7ed2777c --- /dev/null +++ b/node_modules/safer-buffer/tests.js @@ -0,0 +1,406 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var test = require('tape') + +var buffer = require('buffer') + +var index = require('./') +var safer = require('./safer') +var dangerous = require('./dangerous') + +/* Inheritance tests */ + +test('Default is Safer', function (t) { + t.equal(index, safer) + t.notEqual(safer, dangerous) + t.notEqual(index, dangerous) + t.end() +}) + +test('Is not a function', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(typeof impl, 'object') + t.equal(typeof impl.Buffer, 'object') + }); + [buffer].forEach(function (impl) { + t.equal(typeof impl, 'object') + t.equal(typeof impl.Buffer, 'function') + }) + t.end() +}) + +test('Constructor throws', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.throws(function () { impl.Buffer() }) + t.throws(function () { impl.Buffer(0) }) + t.throws(function () { impl.Buffer('a') }) + t.throws(function () { impl.Buffer('a', 'utf-8') }) + t.throws(function () { return new impl.Buffer() }) + t.throws(function () { return new impl.Buffer(0) }) + t.throws(function () { return new impl.Buffer('a') }) + t.throws(function () { return new impl.Buffer('a', 'utf-8') }) + }) + t.end() +}) + +test('Safe methods exist', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(typeof impl.Buffer.alloc, 'function', 'alloc') + t.equal(typeof impl.Buffer.from, 'function', 'from') + }) + t.end() +}) + +test('Unsafe methods exist only in Dangerous', function (t) { + [index, safer].forEach(function (impl) { + t.equal(typeof impl.Buffer.allocUnsafe, 'undefined') + t.equal(typeof impl.Buffer.allocUnsafeSlow, 'undefined') + }); + [dangerous].forEach(function (impl) { + t.equal(typeof impl.Buffer.allocUnsafe, 'function') + t.equal(typeof impl.Buffer.allocUnsafeSlow, 'function') + }) + t.end() +}) + +test('Generic methods/properties are defined and equal', function (t) { + ['poolSize', 'isBuffer', 'concat', 'byteLength'].forEach(function (method) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], buffer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Built-in buffer static methods/properties are inherited', function (t) { + Object.keys(buffer).forEach(function (method) { + if (method === 'SlowBuffer' || method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], buffer[method], method) + t.notEqual(typeof impl[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Built-in Buffer static methods/properties are inherited', function (t) { + Object.keys(buffer.Buffer).forEach(function (method) { + if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], buffer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('.prototype property of Buffer is inherited', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.prototype, buffer.Buffer.prototype, 'prototype') + t.notEqual(typeof impl.Buffer.prototype, 'undefined', 'prototype') + }) + t.end() +}) + +test('All Safer methods are present in Dangerous', function (t) { + Object.keys(safer).forEach(function (method) { + if (method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], safer[method], method) + if (method !== 'kStringMaxLength') { + t.notEqual(typeof impl[method], 'undefined', method) + } + }) + }) + Object.keys(safer.Buffer).forEach(function (method) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], safer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Safe methods from Dangerous methods are present in Safer', function (t) { + Object.keys(dangerous).forEach(function (method) { + if (method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], dangerous[method], method) + if (method !== 'kStringMaxLength') { + t.notEqual(typeof impl[method], 'undefined', method) + } + }) + }) + Object.keys(dangerous.Buffer).forEach(function (method) { + if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], dangerous.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +/* Behaviour tests */ + +test('Methods return Buffers', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 10))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 'a'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10, 'x'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(9, 'ab'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(''))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string', 'utf-8'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([0, 42, 3]))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(new Uint8Array([0, 42, 3])))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([]))) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](0))) + t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](10))) + }) + t.end() +}) + +test('Constructor is buffer.Buffer', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.alloc(0).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(0, 10).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(0, 'a').constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(10).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(10, 'x').constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(9, 'ab').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('string').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('string', 'utf-8').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').constructor, buffer.Buffer) + t.equal(impl.Buffer.from([0, 42, 3]).constructor, buffer.Buffer) + t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).constructor, buffer.Buffer) + t.equal(impl.Buffer.from([]).constructor, buffer.Buffer) + }); + [0, 10, 100].forEach(function (arg) { + t.equal(dangerous.Buffer.allocUnsafe(arg).constructor, buffer.Buffer) + t.equal(dangerous.Buffer.allocUnsafeSlow(arg).constructor, buffer.SlowBuffer(0).constructor) + }) + t.end() +}) + +test('Invalid calls throw', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.throws(function () { impl.Buffer.from(0) }) + t.throws(function () { impl.Buffer.from(10) }) + t.throws(function () { impl.Buffer.from(10, 'utf-8') }) + t.throws(function () { impl.Buffer.from('string', 'invalid encoding') }) + t.throws(function () { impl.Buffer.from(-10) }) + t.throws(function () { impl.Buffer.from(1e90) }) + t.throws(function () { impl.Buffer.from(Infinity) }) + t.throws(function () { impl.Buffer.from(-Infinity) }) + t.throws(function () { impl.Buffer.from(NaN) }) + t.throws(function () { impl.Buffer.from(null) }) + t.throws(function () { impl.Buffer.from(undefined) }) + t.throws(function () { impl.Buffer.from() }) + t.throws(function () { impl.Buffer.from({}) }) + t.throws(function () { impl.Buffer.alloc('') }) + t.throws(function () { impl.Buffer.alloc('string') }) + t.throws(function () { impl.Buffer.alloc('string', 'utf-8') }) + t.throws(function () { impl.Buffer.alloc('b25ldHdvdGhyZWU=', 'base64') }) + t.throws(function () { impl.Buffer.alloc(-10) }) + t.throws(function () { impl.Buffer.alloc(1e90) }) + t.throws(function () { impl.Buffer.alloc(2 * (1 << 30)) }) + t.throws(function () { impl.Buffer.alloc(Infinity) }) + t.throws(function () { impl.Buffer.alloc(-Infinity) }) + t.throws(function () { impl.Buffer.alloc(null) }) + t.throws(function () { impl.Buffer.alloc(undefined) }) + t.throws(function () { impl.Buffer.alloc() }) + t.throws(function () { impl.Buffer.alloc([]) }) + t.throws(function () { impl.Buffer.alloc([0, 42, 3]) }) + t.throws(function () { impl.Buffer.alloc({}) }) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.throws(function () { dangerous.Buffer[method]('') }) + t.throws(function () { dangerous.Buffer[method]('string') }) + t.throws(function () { dangerous.Buffer[method]('string', 'utf-8') }) + t.throws(function () { dangerous.Buffer[method](2 * (1 << 30)) }) + t.throws(function () { dangerous.Buffer[method](Infinity) }) + if (dangerous.Buffer[method] === buffer.Buffer.allocUnsafe) { + t.skip('Skipping, older impl of allocUnsafe coerced negative sizes to 0') + } else { + t.throws(function () { dangerous.Buffer[method](-10) }) + t.throws(function () { dangerous.Buffer[method](-1e90) }) + t.throws(function () { dangerous.Buffer[method](-Infinity) }) + } + t.throws(function () { dangerous.Buffer[method](null) }) + t.throws(function () { dangerous.Buffer[method](undefined) }) + t.throws(function () { dangerous.Buffer[method]() }) + t.throws(function () { dangerous.Buffer[method]([]) }) + t.throws(function () { dangerous.Buffer[method]([0, 42, 3]) }) + t.throws(function () { dangerous.Buffer[method]({}) }) + }) + t.end() +}) + +test('Buffers have appropriate lengths', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.alloc(0).length, 0) + t.equal(impl.Buffer.alloc(10).length, 10) + t.equal(impl.Buffer.from('').length, 0) + t.equal(impl.Buffer.from('string').length, 6) + t.equal(impl.Buffer.from('string', 'utf-8').length, 6) + t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').length, 11) + t.equal(impl.Buffer.from([0, 42, 3]).length, 3) + t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).length, 3) + t.equal(impl.Buffer.from([]).length, 0) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.equal(dangerous.Buffer[method](0).length, 0) + t.equal(dangerous.Buffer[method](10).length, 10) + }) + t.end() +}) + +test('Buffers have appropriate lengths (2)', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true; + [ safer.Buffer.alloc, + dangerous.Buffer.allocUnsafe, + dangerous.Buffer.allocUnsafeSlow + ].forEach(function (method) { + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 1e5) + var buf = method(length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + } + }) + t.ok(ok) + t.end() +}) + +test('.alloc(size) is zero-filled and has correct length', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var buf = index.Buffer.alloc(length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + var j + for (j = 0; j < length; j++) { + if (buf[j] !== 0) ok = false + } + buf.fill(1) + for (j = 0; j < length; j++) { + if (buf[j] !== 1) ok = false + } + } + t.ok(ok) + t.end() +}) + +test('.allocUnsafe / .allocUnsafeSlow are fillable and have correct lengths', function (t) { + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var buf = dangerous.Buffer[method](length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + buf.fill(0, 0, length) + var j + for (j = 0; j < length; j++) { + if (buf[j] !== 0) ok = false + } + buf.fill(1, 0, length) + for (j = 0; j < length; j++) { + if (buf[j] !== 1) ok = false + } + } + t.ok(ok, method) + }) + t.end() +}) + +test('.alloc(size, fill) is `fill`-filled', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var fill = Math.round(Math.random() * 255) + var buf = index.Buffer.alloc(length, fill) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + for (var j = 0; j < length; j++) { + if (buf[j] !== fill) ok = false + } + } + t.ok(ok) + t.end() +}) + +test('.alloc(size, fill) is `fill`-filled', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var fill = Math.round(Math.random() * 255) + var buf = index.Buffer.alloc(length, fill) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + for (var j = 0; j < length; j++) { + if (buf[j] !== fill) ok = false + } + } + t.ok(ok) + t.deepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 97)) + t.notDeepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 98)) + + var tmp = new buffer.Buffer(2) + tmp.fill('ok') + if (tmp[1] === tmp[0]) { + // Outdated Node.js + t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('ooooo')) + } else { + t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('okoko')) + } + t.notDeepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('kokok')) + + t.end() +}) + +test('safer.Buffer.from returns results same as Buffer constructor', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.deepEqual(impl.Buffer.from(''), new buffer.Buffer('')) + t.deepEqual(impl.Buffer.from('string'), new buffer.Buffer('string')) + t.deepEqual(impl.Buffer.from('string', 'utf-8'), new buffer.Buffer('string', 'utf-8')) + t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), new buffer.Buffer('b25ldHdvdGhyZWU=', 'base64')) + t.deepEqual(impl.Buffer.from([0, 42, 3]), new buffer.Buffer([0, 42, 3])) + t.deepEqual(impl.Buffer.from(new Uint8Array([0, 42, 3])), new buffer.Buffer(new Uint8Array([0, 42, 3]))) + t.deepEqual(impl.Buffer.from([]), new buffer.Buffer([])) + }) + t.end() +}) + +test('safer.Buffer.from returns consistent results', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.deepEqual(impl.Buffer.from(''), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from([]), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from(new Uint8Array([])), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from('string', 'utf-8'), impl.Buffer.from('string')) + t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from([115, 116, 114, 105, 110, 103])) + t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from(impl.Buffer.from('string'))) + t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), impl.Buffer.from('onetwothree')) + t.notDeepEqual(impl.Buffer.from('b25ldHdvdGhyZWU='), impl.Buffer.from('onetwothree')) + }) + t.end() +}) diff --git a/node_modules/saslprep/.editorconfig b/node_modules/saslprep/.editorconfig new file mode 100644 index 00000000..d1d8a417 --- /dev/null +++ b/node_modules/saslprep/.editorconfig @@ -0,0 +1,10 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/node_modules/saslprep/.gitattributes b/node_modules/saslprep/.gitattributes new file mode 100644 index 00000000..3ba45360 --- /dev/null +++ b/node_modules/saslprep/.gitattributes @@ -0,0 +1 @@ +*.mem binary diff --git a/node_modules/saslprep/.travis.yml b/node_modules/saslprep/.travis.yml new file mode 100644 index 00000000..0bca8265 --- /dev/null +++ b/node_modules/saslprep/.travis.yml @@ -0,0 +1,10 @@ +sudo: false +language: node_js +node_js: + - "6" + - "8" + - "10" + - "12" + +before_install: +- npm install -g npm@6 diff --git a/node_modules/saslprep/CHANGELOG.md b/node_modules/saslprep/CHANGELOG.md new file mode 100644 index 00000000..77980787 --- /dev/null +++ b/node_modules/saslprep/CHANGELOG.md @@ -0,0 +1,19 @@ +# Change Log +All notable changes to the "saslprep" package will be documented in this file. + +## [1.0.3] - 2019-05-01 + +- Correctly get code points >U+FFFF ([#5](https://github.com/reklatsmasters/saslprep/pull/5)) +- Fix perfomance downgrades from [#5](https://github.com/reklatsmasters/saslprep/pull/5). + +## [1.0.2] - 2018-09-13 + +- Reduced initialization time ([#3](https://github.com/reklatsmasters/saslprep/issues/3)) + +## [1.0.1] - 2018-06-20 + +- Reduced stack overhead of range creation ([#2](https://github.com/reklatsmasters/saslprep/pull/2)) + +## [1.0.0] - 2017-06-21 + +- First release diff --git a/node_modules/saslprep/LICENSE b/node_modules/saslprep/LICENSE new file mode 100644 index 00000000..481c7a50 --- /dev/null +++ b/node_modules/saslprep/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2014 Dmitry Tsvettsikh + +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/node_modules/saslprep/code-points.mem b/node_modules/saslprep/code-points.mem new file mode 100644 index 00000000..4781b066 Binary files /dev/null and b/node_modules/saslprep/code-points.mem differ diff --git a/node_modules/saslprep/generate-code-points.js b/node_modules/saslprep/generate-code-points.js new file mode 100644 index 00000000..c5162ca7 --- /dev/null +++ b/node_modules/saslprep/generate-code-points.js @@ -0,0 +1,51 @@ +'use strict'; + +const bitfield = require('sparse-bitfield'); +const codePoints = require('./lib/code-points'); + +const unassigned_code_points = bitfield(); +const commonly_mapped_to_nothing = bitfield(); +const non_ascii_space_characters = bitfield(); +const prohibited_characters = bitfield(); +const bidirectional_r_al = bitfield(); +const bidirectional_l = bitfield(); + +/** + * Iterare over code points and + * convert it into an buffer. + * @param {bitfield} bits + * @param {Array} src + * @returns {Buffer} + */ +function traverse(bits, src) { + for (const code of src.keys()) { + bits.set(code, true); + } + + const buffer = bits.toBuffer(); + return Buffer.concat([createSize(buffer), buffer]); +} + +/** + * @param {Buffer} buffer + * @returns {Buffer} + */ +function createSize(buffer) { + const buf = Buffer.alloc(4); + buf.writeUInt32BE(buffer.length); + + return buf; +} + +const memory = []; + +memory.push( + traverse(unassigned_code_points, codePoints.unassigned_code_points), + traverse(commonly_mapped_to_nothing, codePoints.commonly_mapped_to_nothing), + traverse(non_ascii_space_characters, codePoints.non_ASCII_space_characters), + traverse(prohibited_characters, codePoints.prohibited_characters), + traverse(bidirectional_r_al, codePoints.bidirectional_r_al), + traverse(bidirectional_l, codePoints.bidirectional_l) +); + +process.stdout.write(Buffer.concat(memory)); diff --git a/node_modules/saslprep/index.js b/node_modules/saslprep/index.js new file mode 100644 index 00000000..21bb0fed --- /dev/null +++ b/node_modules/saslprep/index.js @@ -0,0 +1,157 @@ +'use strict'; + +const { + unassigned_code_points, + commonly_mapped_to_nothing, + non_ASCII_space_characters, + prohibited_characters, + bidirectional_r_al, + bidirectional_l, +} = require('./lib/memory-code-points'); + +module.exports = saslprep; + +// 2.1. Mapping + +/** + * non-ASCII space characters [StringPrep, C.1.2] that can be + * mapped to SPACE (U+0020) + */ +const mapping2space = non_ASCII_space_characters; + +/** + * the "commonly mapped to nothing" characters [StringPrep, B.1] + * that can be mapped to nothing. + */ +const mapping2nothing = commonly_mapped_to_nothing; + +// utils +const getCodePoint = character => character.codePointAt(0); +const first = x => x[0]; +const last = x => x[x.length - 1]; + +/** + * Convert provided string into an array of Unicode Code Points. + * Based on https://stackoverflow.com/a/21409165/1556249 + * and https://www.npmjs.com/package/code-point-at. + * @param {string} input + * @returns {number[]} + */ +function toCodePoints(input) { + const codepoints = []; + const size = input.length; + + for (let i = 0; i < size; i += 1) { + const before = input.charCodeAt(i); + + if (before >= 0xd800 && before <= 0xdbff && size > i + 1) { + const next = input.charCodeAt(i + 1); + + if (next >= 0xdc00 && next <= 0xdfff) { + codepoints.push((before - 0xd800) * 0x400 + next - 0xdc00 + 0x10000); + i += 1; + continue; + } + } + + codepoints.push(before); + } + + return codepoints; +} + +/** + * SASLprep. + * @param {string} input + * @param {Object} opts + * @param {boolean} opts.allowUnassigned + * @returns {string} + */ +function saslprep(input, opts = {}) { + if (typeof input !== 'string') { + throw new TypeError('Expected string.'); + } + + if (input.length === 0) { + return ''; + } + + // 1. Map + const mapped_input = toCodePoints(input) + // 1.1 mapping to space + .map(character => (mapping2space.get(character) ? 0x20 : character)) + // 1.2 mapping to nothing + .filter(character => !mapping2nothing.get(character)); + + // 2. Normalize + const normalized_input = String.fromCodePoint + .apply(null, mapped_input) + .normalize('NFKC'); + + const normalized_map = toCodePoints(normalized_input); + + // 3. Prohibit + const hasProhibited = normalized_map.some(character => + prohibited_characters.get(character) + ); + + if (hasProhibited) { + throw new Error( + 'Prohibited character, see https://tools.ietf.org/html/rfc4013#section-2.3' + ); + } + + // Unassigned Code Points + if (opts.allowUnassigned !== true) { + const hasUnassigned = normalized_map.some(character => + unassigned_code_points.get(character) + ); + + if (hasUnassigned) { + throw new Error( + 'Unassigned code point, see https://tools.ietf.org/html/rfc4013#section-2.5' + ); + } + } + + // 4. check bidi + + const hasBidiRAL = normalized_map.some(character => + bidirectional_r_al.get(character) + ); + + const hasBidiL = normalized_map.some(character => + bidirectional_l.get(character) + ); + + // 4.1 If a string contains any RandALCat character, the string MUST NOT + // contain any LCat character. + if (hasBidiRAL && hasBidiL) { + throw new Error( + 'String must not contain RandALCat and LCat at the same time,' + + ' see https://tools.ietf.org/html/rfc3454#section-6' + ); + } + + /** + * 4.2 If a string contains any RandALCat character, a RandALCat + * character MUST be the first character of the string, and a + * RandALCat character MUST be the last character of the string. + */ + + const isFirstBidiRAL = bidirectional_r_al.get( + getCodePoint(first(normalized_input)) + ); + const isLastBidiRAL = bidirectional_r_al.get( + getCodePoint(last(normalized_input)) + ); + + if (hasBidiRAL && !(isFirstBidiRAL && isLastBidiRAL)) { + throw new Error( + 'Bidirectional RandALCat character must be the first and the last' + + ' character of the string, see https://tools.ietf.org/html/rfc3454#section-6' + ); + } + + return normalized_input; +} diff --git a/node_modules/saslprep/lib/code-points.js b/node_modules/saslprep/lib/code-points.js new file mode 100644 index 00000000..222182c8 --- /dev/null +++ b/node_modules/saslprep/lib/code-points.js @@ -0,0 +1,996 @@ +'use strict'; + +const { range } = require('./util'); + +/** + * A.1 Unassigned code points in Unicode 3.2 + * @link https://tools.ietf.org/html/rfc3454#appendix-A.1 + */ +const unassigned_code_points = new Set([ + 0x0221, + ...range(0x0234, 0x024f), + ...range(0x02ae, 0x02af), + ...range(0x02ef, 0x02ff), + ...range(0x0350, 0x035f), + ...range(0x0370, 0x0373), + ...range(0x0376, 0x0379), + ...range(0x037b, 0x037d), + ...range(0x037f, 0x0383), + 0x038b, + 0x038d, + 0x03a2, + 0x03cf, + ...range(0x03f7, 0x03ff), + 0x0487, + 0x04cf, + ...range(0x04f6, 0x04f7), + ...range(0x04fa, 0x04ff), + ...range(0x0510, 0x0530), + ...range(0x0557, 0x0558), + 0x0560, + 0x0588, + ...range(0x058b, 0x0590), + 0x05a2, + 0x05ba, + ...range(0x05c5, 0x05cf), + ...range(0x05eb, 0x05ef), + ...range(0x05f5, 0x060b), + ...range(0x060d, 0x061a), + ...range(0x061c, 0x061e), + 0x0620, + ...range(0x063b, 0x063f), + ...range(0x0656, 0x065f), + ...range(0x06ee, 0x06ef), + 0x06ff, + 0x070e, + ...range(0x072d, 0x072f), + ...range(0x074b, 0x077f), + ...range(0x07b2, 0x0900), + 0x0904, + ...range(0x093a, 0x093b), + ...range(0x094e, 0x094f), + ...range(0x0955, 0x0957), + ...range(0x0971, 0x0980), + 0x0984, + ...range(0x098d, 0x098e), + ...range(0x0991, 0x0992), + 0x09a9, + 0x09b1, + ...range(0x09b3, 0x09b5), + ...range(0x09ba, 0x09bb), + 0x09bd, + ...range(0x09c5, 0x09c6), + ...range(0x09c9, 0x09ca), + ...range(0x09ce, 0x09d6), + ...range(0x09d8, 0x09db), + 0x09de, + ...range(0x09e4, 0x09e5), + ...range(0x09fb, 0x0a01), + ...range(0x0a03, 0x0a04), + ...range(0x0a0b, 0x0a0e), + ...range(0x0a11, 0x0a12), + 0x0a29, + 0x0a31, + 0x0a34, + 0x0a37, + ...range(0x0a3a, 0x0a3b), + 0x0a3d, + ...range(0x0a43, 0x0a46), + ...range(0x0a49, 0x0a4a), + ...range(0x0a4e, 0x0a58), + 0x0a5d, + ...range(0x0a5f, 0x0a65), + ...range(0x0a75, 0x0a80), + 0x0a84, + 0x0a8c, + 0x0a8e, + 0x0a92, + 0x0aa9, + 0x0ab1, + 0x0ab4, + ...range(0x0aba, 0x0abb), + 0x0ac6, + 0x0aca, + ...range(0x0ace, 0x0acf), + ...range(0x0ad1, 0x0adf), + ...range(0x0ae1, 0x0ae5), + ...range(0x0af0, 0x0b00), + 0x0b04, + ...range(0x0b0d, 0x0b0e), + ...range(0x0b11, 0x0b12), + 0x0b29, + 0x0b31, + ...range(0x0b34, 0x0b35), + ...range(0x0b3a, 0x0b3b), + ...range(0x0b44, 0x0b46), + ...range(0x0b49, 0x0b4a), + ...range(0x0b4e, 0x0b55), + ...range(0x0b58, 0x0b5b), + 0x0b5e, + ...range(0x0b62, 0x0b65), + ...range(0x0b71, 0x0b81), + 0x0b84, + ...range(0x0b8b, 0x0b8d), + 0x0b91, + ...range(0x0b96, 0x0b98), + 0x0b9b, + 0x0b9d, + ...range(0x0ba0, 0x0ba2), + ...range(0x0ba5, 0x0ba7), + ...range(0x0bab, 0x0bad), + 0x0bb6, + ...range(0x0bba, 0x0bbd), + ...range(0x0bc3, 0x0bc5), + 0x0bc9, + ...range(0x0bce, 0x0bd6), + ...range(0x0bd8, 0x0be6), + ...range(0x0bf3, 0x0c00), + 0x0c04, + 0x0c0d, + 0x0c11, + 0x0c29, + 0x0c34, + ...range(0x0c3a, 0x0c3d), + 0x0c45, + 0x0c49, + ...range(0x0c4e, 0x0c54), + ...range(0x0c57, 0x0c5f), + ...range(0x0c62, 0x0c65), + ...range(0x0c70, 0x0c81), + 0x0c84, + 0x0c8d, + 0x0c91, + 0x0ca9, + 0x0cb4, + ...range(0x0cba, 0x0cbd), + 0x0cc5, + 0x0cc9, + ...range(0x0cce, 0x0cd4), + ...range(0x0cd7, 0x0cdd), + 0x0cdf, + ...range(0x0ce2, 0x0ce5), + ...range(0x0cf0, 0x0d01), + 0x0d04, + 0x0d0d, + 0x0d11, + 0x0d29, + ...range(0x0d3a, 0x0d3d), + ...range(0x0d44, 0x0d45), + 0x0d49, + ...range(0x0d4e, 0x0d56), + ...range(0x0d58, 0x0d5f), + ...range(0x0d62, 0x0d65), + ...range(0x0d70, 0x0d81), + 0x0d84, + ...range(0x0d97, 0x0d99), + 0x0db2, + 0x0dbc, + ...range(0x0dbe, 0x0dbf), + ...range(0x0dc7, 0x0dc9), + ...range(0x0dcb, 0x0dce), + 0x0dd5, + 0x0dd7, + ...range(0x0de0, 0x0df1), + ...range(0x0df5, 0x0e00), + ...range(0x0e3b, 0x0e3e), + ...range(0x0e5c, 0x0e80), + 0x0e83, + ...range(0x0e85, 0x0e86), + 0x0e89, + ...range(0x0e8b, 0x0e8c), + ...range(0x0e8e, 0x0e93), + 0x0e98, + 0x0ea0, + 0x0ea4, + 0x0ea6, + ...range(0x0ea8, 0x0ea9), + 0x0eac, + 0x0eba, + ...range(0x0ebe, 0x0ebf), + 0x0ec5, + 0x0ec7, + ...range(0x0ece, 0x0ecf), + ...range(0x0eda, 0x0edb), + ...range(0x0ede, 0x0eff), + 0x0f48, + ...range(0x0f6b, 0x0f70), + ...range(0x0f8c, 0x0f8f), + 0x0f98, + 0x0fbd, + ...range(0x0fcd, 0x0fce), + ...range(0x0fd0, 0x0fff), + 0x1022, + 0x1028, + 0x102b, + ...range(0x1033, 0x1035), + ...range(0x103a, 0x103f), + ...range(0x105a, 0x109f), + ...range(0x10c6, 0x10cf), + ...range(0x10f9, 0x10fa), + ...range(0x10fc, 0x10ff), + ...range(0x115a, 0x115e), + ...range(0x11a3, 0x11a7), + ...range(0x11fa, 0x11ff), + 0x1207, + 0x1247, + 0x1249, + ...range(0x124e, 0x124f), + 0x1257, + 0x1259, + ...range(0x125e, 0x125f), + 0x1287, + 0x1289, + ...range(0x128e, 0x128f), + 0x12af, + 0x12b1, + ...range(0x12b6, 0x12b7), + 0x12bf, + 0x12c1, + ...range(0x12c6, 0x12c7), + 0x12cf, + 0x12d7, + 0x12ef, + 0x130f, + 0x1311, + ...range(0x1316, 0x1317), + 0x131f, + 0x1347, + ...range(0x135b, 0x1360), + ...range(0x137d, 0x139f), + ...range(0x13f5, 0x1400), + ...range(0x1677, 0x167f), + ...range(0x169d, 0x169f), + ...range(0x16f1, 0x16ff), + 0x170d, + ...range(0x1715, 0x171f), + ...range(0x1737, 0x173f), + ...range(0x1754, 0x175f), + 0x176d, + 0x1771, + ...range(0x1774, 0x177f), + ...range(0x17dd, 0x17df), + ...range(0x17ea, 0x17ff), + 0x180f, + ...range(0x181a, 0x181f), + ...range(0x1878, 0x187f), + ...range(0x18aa, 0x1dff), + ...range(0x1e9c, 0x1e9f), + ...range(0x1efa, 0x1eff), + ...range(0x1f16, 0x1f17), + ...range(0x1f1e, 0x1f1f), + ...range(0x1f46, 0x1f47), + ...range(0x1f4e, 0x1f4f), + 0x1f58, + 0x1f5a, + 0x1f5c, + 0x1f5e, + ...range(0x1f7e, 0x1f7f), + 0x1fb5, + 0x1fc5, + ...range(0x1fd4, 0x1fd5), + 0x1fdc, + ...range(0x1ff0, 0x1ff1), + 0x1ff5, + 0x1fff, + ...range(0x2053, 0x2056), + ...range(0x2058, 0x205e), + ...range(0x2064, 0x2069), + ...range(0x2072, 0x2073), + ...range(0x208f, 0x209f), + ...range(0x20b2, 0x20cf), + ...range(0x20eb, 0x20ff), + ...range(0x213b, 0x213c), + ...range(0x214c, 0x2152), + ...range(0x2184, 0x218f), + ...range(0x23cf, 0x23ff), + ...range(0x2427, 0x243f), + ...range(0x244b, 0x245f), + 0x24ff, + ...range(0x2614, 0x2615), + 0x2618, + ...range(0x267e, 0x267f), + ...range(0x268a, 0x2700), + 0x2705, + ...range(0x270a, 0x270b), + 0x2728, + 0x274c, + 0x274e, + ...range(0x2753, 0x2755), + 0x2757, + ...range(0x275f, 0x2760), + ...range(0x2795, 0x2797), + 0x27b0, + ...range(0x27bf, 0x27cf), + ...range(0x27ec, 0x27ef), + ...range(0x2b00, 0x2e7f), + 0x2e9a, + ...range(0x2ef4, 0x2eff), + ...range(0x2fd6, 0x2fef), + ...range(0x2ffc, 0x2fff), + 0x3040, + ...range(0x3097, 0x3098), + ...range(0x3100, 0x3104), + ...range(0x312d, 0x3130), + 0x318f, + ...range(0x31b8, 0x31ef), + ...range(0x321d, 0x321f), + ...range(0x3244, 0x3250), + ...range(0x327c, 0x327e), + ...range(0x32cc, 0x32cf), + 0x32ff, + ...range(0x3377, 0x337a), + ...range(0x33de, 0x33df), + 0x33ff, + ...range(0x4db6, 0x4dff), + ...range(0x9fa6, 0x9fff), + ...range(0xa48d, 0xa48f), + ...range(0xa4c7, 0xabff), + ...range(0xd7a4, 0xd7ff), + ...range(0xfa2e, 0xfa2f), + ...range(0xfa6b, 0xfaff), + ...range(0xfb07, 0xfb12), + ...range(0xfb18, 0xfb1c), + 0xfb37, + 0xfb3d, + 0xfb3f, + 0xfb42, + 0xfb45, + ...range(0xfbb2, 0xfbd2), + ...range(0xfd40, 0xfd4f), + ...range(0xfd90, 0xfd91), + ...range(0xfdc8, 0xfdcf), + ...range(0xfdfd, 0xfdff), + ...range(0xfe10, 0xfe1f), + ...range(0xfe24, 0xfe2f), + ...range(0xfe47, 0xfe48), + 0xfe53, + 0xfe67, + ...range(0xfe6c, 0xfe6f), + 0xfe75, + ...range(0xfefd, 0xfefe), + 0xff00, + ...range(0xffbf, 0xffc1), + ...range(0xffc8, 0xffc9), + ...range(0xffd0, 0xffd1), + ...range(0xffd8, 0xffd9), + ...range(0xffdd, 0xffdf), + 0xffe7, + ...range(0xffef, 0xfff8), + ...range(0x10000, 0x102ff), + 0x1031f, + ...range(0x10324, 0x1032f), + ...range(0x1034b, 0x103ff), + ...range(0x10426, 0x10427), + ...range(0x1044e, 0x1cfff), + ...range(0x1d0f6, 0x1d0ff), + ...range(0x1d127, 0x1d129), + ...range(0x1d1de, 0x1d3ff), + 0x1d455, + 0x1d49d, + ...range(0x1d4a0, 0x1d4a1), + ...range(0x1d4a3, 0x1d4a4), + ...range(0x1d4a7, 0x1d4a8), + 0x1d4ad, + 0x1d4ba, + 0x1d4bc, + 0x1d4c1, + 0x1d4c4, + 0x1d506, + ...range(0x1d50b, 0x1d50c), + 0x1d515, + 0x1d51d, + 0x1d53a, + 0x1d53f, + 0x1d545, + ...range(0x1d547, 0x1d549), + 0x1d551, + ...range(0x1d6a4, 0x1d6a7), + ...range(0x1d7ca, 0x1d7cd), + ...range(0x1d800, 0x1fffd), + ...range(0x2a6d7, 0x2f7ff), + ...range(0x2fa1e, 0x2fffd), + ...range(0x30000, 0x3fffd), + ...range(0x40000, 0x4fffd), + ...range(0x50000, 0x5fffd), + ...range(0x60000, 0x6fffd), + ...range(0x70000, 0x7fffd), + ...range(0x80000, 0x8fffd), + ...range(0x90000, 0x9fffd), + ...range(0xa0000, 0xafffd), + ...range(0xb0000, 0xbfffd), + ...range(0xc0000, 0xcfffd), + ...range(0xd0000, 0xdfffd), + 0xe0000, + ...range(0xe0002, 0xe001f), + ...range(0xe0080, 0xefffd), +]); + +/** + * B.1 Commonly mapped to nothing + * @link https://tools.ietf.org/html/rfc3454#appendix-B.1 + */ +const commonly_mapped_to_nothing = new Set([ + 0x00ad, + 0x034f, + 0x1806, + 0x180b, + 0x180c, + 0x180d, + 0x200b, + 0x200c, + 0x200d, + 0x2060, + 0xfe00, + 0xfe01, + 0xfe02, + 0xfe03, + 0xfe04, + 0xfe05, + 0xfe06, + 0xfe07, + 0xfe08, + 0xfe09, + 0xfe0a, + 0xfe0b, + 0xfe0c, + 0xfe0d, + 0xfe0e, + 0xfe0f, + 0xfeff, +]); + +/** + * C.1.2 Non-ASCII space characters + * @link https://tools.ietf.org/html/rfc3454#appendix-C.1.2 + */ +const non_ASCII_space_characters = new Set([ + 0x00a0 /* NO-BREAK SPACE */, + 0x1680 /* OGHAM SPACE MARK */, + 0x2000 /* EN QUAD */, + 0x2001 /* EM QUAD */, + 0x2002 /* EN SPACE */, + 0x2003 /* EM SPACE */, + 0x2004 /* THREE-PER-EM SPACE */, + 0x2005 /* FOUR-PER-EM SPACE */, + 0x2006 /* SIX-PER-EM SPACE */, + 0x2007 /* FIGURE SPACE */, + 0x2008 /* PUNCTUATION SPACE */, + 0x2009 /* THIN SPACE */, + 0x200a /* HAIR SPACE */, + 0x200b /* ZERO WIDTH SPACE */, + 0x202f /* NARROW NO-BREAK SPACE */, + 0x205f /* MEDIUM MATHEMATICAL SPACE */, + 0x3000 /* IDEOGRAPHIC SPACE */, +]); + +/** + * 2.3. Prohibited Output + * @type {Set} + */ +const prohibited_characters = new Set([ + ...non_ASCII_space_characters, + + /** + * C.2.1 ASCII control characters + * @link https://tools.ietf.org/html/rfc3454#appendix-C.2.1 + */ + ...range(0, 0x001f) /* [CONTROL CHARACTERS] */, + 0x007f /* DELETE */, + + /** + * C.2.2 Non-ASCII control characters + * @link https://tools.ietf.org/html/rfc3454#appendix-C.2.2 + */ + ...range(0x0080, 0x009f) /* [CONTROL CHARACTERS] */, + 0x06dd /* ARABIC END OF AYAH */, + 0x070f /* SYRIAC ABBREVIATION MARK */, + 0x180e /* MONGOLIAN VOWEL SEPARATOR */, + 0x200c /* ZERO WIDTH NON-JOINER */, + 0x200d /* ZERO WIDTH JOINER */, + 0x2028 /* LINE SEPARATOR */, + 0x2029 /* PARAGRAPH SEPARATOR */, + 0x2060 /* WORD JOINER */, + 0x2061 /* FUNCTION APPLICATION */, + 0x2062 /* INVISIBLE TIMES */, + 0x2063 /* INVISIBLE SEPARATOR */, + ...range(0x206a, 0x206f) /* [CONTROL CHARACTERS] */, + 0xfeff /* ZERO WIDTH NO-BREAK SPACE */, + ...range(0xfff9, 0xfffc) /* [CONTROL CHARACTERS] */, + ...range(0x1d173, 0x1d17a) /* [MUSICAL CONTROL CHARACTERS] */, + + /** + * C.3 Private use + * @link https://tools.ietf.org/html/rfc3454#appendix-C.3 + */ + ...range(0xe000, 0xf8ff) /* [PRIVATE USE, PLANE 0] */, + ...range(0xf0000, 0xffffd) /* [PRIVATE USE, PLANE 15] */, + ...range(0x100000, 0x10fffd) /* [PRIVATE USE, PLANE 16] */, + + /** + * C.4 Non-character code points + * @link https://tools.ietf.org/html/rfc3454#appendix-C.4 + */ + ...range(0xfdd0, 0xfdef) /* [NONCHARACTER CODE POINTS] */, + ...range(0xfffe, 0xffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0x1fffe, 0x1ffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0x2fffe, 0x2ffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0x3fffe, 0x3ffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0x4fffe, 0x4ffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0x5fffe, 0x5ffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0x6fffe, 0x6ffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0x7fffe, 0x7ffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0x8fffe, 0x8ffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0x9fffe, 0x9ffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0xafffe, 0xaffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0xbfffe, 0xbffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0xcfffe, 0xcffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0xdfffe, 0xdffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0xefffe, 0xeffff) /* [NONCHARACTER CODE POINTS] */, + ...range(0x10fffe, 0x10ffff) /* [NONCHARACTER CODE POINTS] */, + + /** + * C.5 Surrogate codes + * @link https://tools.ietf.org/html/rfc3454#appendix-C.5 + */ + ...range(0xd800, 0xdfff), + + /** + * C.6 Inappropriate for plain text + * @link https://tools.ietf.org/html/rfc3454#appendix-C.6 + */ + 0xfff9 /* INTERLINEAR ANNOTATION ANCHOR */, + 0xfffa /* INTERLINEAR ANNOTATION SEPARATOR */, + 0xfffb /* INTERLINEAR ANNOTATION TERMINATOR */, + 0xfffc /* OBJECT REPLACEMENT CHARACTER */, + 0xfffd /* REPLACEMENT CHARACTER */, + + /** + * C.7 Inappropriate for canonical representation + * @link https://tools.ietf.org/html/rfc3454#appendix-C.7 + */ + ...range(0x2ff0, 0x2ffb) /* [IDEOGRAPHIC DESCRIPTION CHARACTERS] */, + + /** + * C.8 Change display properties or are deprecated + * @link https://tools.ietf.org/html/rfc3454#appendix-C.8 + */ + 0x0340 /* COMBINING GRAVE TONE MARK */, + 0x0341 /* COMBINING ACUTE TONE MARK */, + 0x200e /* LEFT-TO-RIGHT MARK */, + 0x200f /* RIGHT-TO-LEFT MARK */, + 0x202a /* LEFT-TO-RIGHT EMBEDDING */, + 0x202b /* RIGHT-TO-LEFT EMBEDDING */, + 0x202c /* POP DIRECTIONAL FORMATTING */, + 0x202d /* LEFT-TO-RIGHT OVERRIDE */, + 0x202e /* RIGHT-TO-LEFT OVERRIDE */, + 0x206a /* INHIBIT SYMMETRIC SWAPPING */, + 0x206b /* ACTIVATE SYMMETRIC SWAPPING */, + 0x206c /* INHIBIT ARABIC FORM SHAPING */, + 0x206d /* ACTIVATE ARABIC FORM SHAPING */, + 0x206e /* NATIONAL DIGIT SHAPES */, + 0x206f /* NOMINAL DIGIT SHAPES */, + + /** + * C.9 Tagging characters + * @link https://tools.ietf.org/html/rfc3454#appendix-C.9 + */ + 0xe0001 /* LANGUAGE TAG */, + ...range(0xe0020, 0xe007f) /* [TAGGING CHARACTERS] */, +]); + +/** + * D.1 Characters with bidirectional property "R" or "AL" + * @link https://tools.ietf.org/html/rfc3454#appendix-D.1 + */ +const bidirectional_r_al = new Set([ + 0x05be, + 0x05c0, + 0x05c3, + ...range(0x05d0, 0x05ea), + ...range(0x05f0, 0x05f4), + 0x061b, + 0x061f, + ...range(0x0621, 0x063a), + ...range(0x0640, 0x064a), + ...range(0x066d, 0x066f), + ...range(0x0671, 0x06d5), + 0x06dd, + ...range(0x06e5, 0x06e6), + ...range(0x06fa, 0x06fe), + ...range(0x0700, 0x070d), + 0x0710, + ...range(0x0712, 0x072c), + ...range(0x0780, 0x07a5), + 0x07b1, + 0x200f, + 0xfb1d, + ...range(0xfb1f, 0xfb28), + ...range(0xfb2a, 0xfb36), + ...range(0xfb38, 0xfb3c), + 0xfb3e, + ...range(0xfb40, 0xfb41), + ...range(0xfb43, 0xfb44), + ...range(0xfb46, 0xfbb1), + ...range(0xfbd3, 0xfd3d), + ...range(0xfd50, 0xfd8f), + ...range(0xfd92, 0xfdc7), + ...range(0xfdf0, 0xfdfc), + ...range(0xfe70, 0xfe74), + ...range(0xfe76, 0xfefc), +]); + +/** + * D.2 Characters with bidirectional property "L" + * @link https://tools.ietf.org/html/rfc3454#appendix-D.2 + */ +const bidirectional_l = new Set([ + ...range(0x0041, 0x005a), + ...range(0x0061, 0x007a), + 0x00aa, + 0x00b5, + 0x00ba, + ...range(0x00c0, 0x00d6), + ...range(0x00d8, 0x00f6), + ...range(0x00f8, 0x0220), + ...range(0x0222, 0x0233), + ...range(0x0250, 0x02ad), + ...range(0x02b0, 0x02b8), + ...range(0x02bb, 0x02c1), + ...range(0x02d0, 0x02d1), + ...range(0x02e0, 0x02e4), + 0x02ee, + 0x037a, + 0x0386, + ...range(0x0388, 0x038a), + 0x038c, + ...range(0x038e, 0x03a1), + ...range(0x03a3, 0x03ce), + ...range(0x03d0, 0x03f5), + ...range(0x0400, 0x0482), + ...range(0x048a, 0x04ce), + ...range(0x04d0, 0x04f5), + ...range(0x04f8, 0x04f9), + ...range(0x0500, 0x050f), + ...range(0x0531, 0x0556), + ...range(0x0559, 0x055f), + ...range(0x0561, 0x0587), + 0x0589, + 0x0903, + ...range(0x0905, 0x0939), + ...range(0x093d, 0x0940), + ...range(0x0949, 0x094c), + 0x0950, + ...range(0x0958, 0x0961), + ...range(0x0964, 0x0970), + ...range(0x0982, 0x0983), + ...range(0x0985, 0x098c), + ...range(0x098f, 0x0990), + ...range(0x0993, 0x09a8), + ...range(0x09aa, 0x09b0), + 0x09b2, + ...range(0x09b6, 0x09b9), + ...range(0x09be, 0x09c0), + ...range(0x09c7, 0x09c8), + ...range(0x09cb, 0x09cc), + 0x09d7, + ...range(0x09dc, 0x09dd), + ...range(0x09df, 0x09e1), + ...range(0x09e6, 0x09f1), + ...range(0x09f4, 0x09fa), + ...range(0x0a05, 0x0a0a), + ...range(0x0a0f, 0x0a10), + ...range(0x0a13, 0x0a28), + ...range(0x0a2a, 0x0a30), + ...range(0x0a32, 0x0a33), + ...range(0x0a35, 0x0a36), + ...range(0x0a38, 0x0a39), + ...range(0x0a3e, 0x0a40), + ...range(0x0a59, 0x0a5c), + 0x0a5e, + ...range(0x0a66, 0x0a6f), + ...range(0x0a72, 0x0a74), + 0x0a83, + ...range(0x0a85, 0x0a8b), + 0x0a8d, + ...range(0x0a8f, 0x0a91), + ...range(0x0a93, 0x0aa8), + ...range(0x0aaa, 0x0ab0), + ...range(0x0ab2, 0x0ab3), + ...range(0x0ab5, 0x0ab9), + ...range(0x0abd, 0x0ac0), + 0x0ac9, + ...range(0x0acb, 0x0acc), + 0x0ad0, + 0x0ae0, + ...range(0x0ae6, 0x0aef), + ...range(0x0b02, 0x0b03), + ...range(0x0b05, 0x0b0c), + ...range(0x0b0f, 0x0b10), + ...range(0x0b13, 0x0b28), + ...range(0x0b2a, 0x0b30), + ...range(0x0b32, 0x0b33), + ...range(0x0b36, 0x0b39), + ...range(0x0b3d, 0x0b3e), + 0x0b40, + ...range(0x0b47, 0x0b48), + ...range(0x0b4b, 0x0b4c), + 0x0b57, + ...range(0x0b5c, 0x0b5d), + ...range(0x0b5f, 0x0b61), + ...range(0x0b66, 0x0b70), + 0x0b83, + ...range(0x0b85, 0x0b8a), + ...range(0x0b8e, 0x0b90), + ...range(0x0b92, 0x0b95), + ...range(0x0b99, 0x0b9a), + 0x0b9c, + ...range(0x0b9e, 0x0b9f), + ...range(0x0ba3, 0x0ba4), + ...range(0x0ba8, 0x0baa), + ...range(0x0bae, 0x0bb5), + ...range(0x0bb7, 0x0bb9), + ...range(0x0bbe, 0x0bbf), + ...range(0x0bc1, 0x0bc2), + ...range(0x0bc6, 0x0bc8), + ...range(0x0bca, 0x0bcc), + 0x0bd7, + ...range(0x0be7, 0x0bf2), + ...range(0x0c01, 0x0c03), + ...range(0x0c05, 0x0c0c), + ...range(0x0c0e, 0x0c10), + ...range(0x0c12, 0x0c28), + ...range(0x0c2a, 0x0c33), + ...range(0x0c35, 0x0c39), + ...range(0x0c41, 0x0c44), + ...range(0x0c60, 0x0c61), + ...range(0x0c66, 0x0c6f), + ...range(0x0c82, 0x0c83), + ...range(0x0c85, 0x0c8c), + ...range(0x0c8e, 0x0c90), + ...range(0x0c92, 0x0ca8), + ...range(0x0caa, 0x0cb3), + ...range(0x0cb5, 0x0cb9), + 0x0cbe, + ...range(0x0cc0, 0x0cc4), + ...range(0x0cc7, 0x0cc8), + ...range(0x0cca, 0x0ccb), + ...range(0x0cd5, 0x0cd6), + 0x0cde, + ...range(0x0ce0, 0x0ce1), + ...range(0x0ce6, 0x0cef), + ...range(0x0d02, 0x0d03), + ...range(0x0d05, 0x0d0c), + ...range(0x0d0e, 0x0d10), + ...range(0x0d12, 0x0d28), + ...range(0x0d2a, 0x0d39), + ...range(0x0d3e, 0x0d40), + ...range(0x0d46, 0x0d48), + ...range(0x0d4a, 0x0d4c), + 0x0d57, + ...range(0x0d60, 0x0d61), + ...range(0x0d66, 0x0d6f), + ...range(0x0d82, 0x0d83), + ...range(0x0d85, 0x0d96), + ...range(0x0d9a, 0x0db1), + ...range(0x0db3, 0x0dbb), + 0x0dbd, + ...range(0x0dc0, 0x0dc6), + ...range(0x0dcf, 0x0dd1), + ...range(0x0dd8, 0x0ddf), + ...range(0x0df2, 0x0df4), + ...range(0x0e01, 0x0e30), + ...range(0x0e32, 0x0e33), + ...range(0x0e40, 0x0e46), + ...range(0x0e4f, 0x0e5b), + ...range(0x0e81, 0x0e82), + 0x0e84, + ...range(0x0e87, 0x0e88), + 0x0e8a, + 0x0e8d, + ...range(0x0e94, 0x0e97), + ...range(0x0e99, 0x0e9f), + ...range(0x0ea1, 0x0ea3), + 0x0ea5, + 0x0ea7, + ...range(0x0eaa, 0x0eab), + ...range(0x0ead, 0x0eb0), + ...range(0x0eb2, 0x0eb3), + 0x0ebd, + ...range(0x0ec0, 0x0ec4), + 0x0ec6, + ...range(0x0ed0, 0x0ed9), + ...range(0x0edc, 0x0edd), + ...range(0x0f00, 0x0f17), + ...range(0x0f1a, 0x0f34), + 0x0f36, + 0x0f38, + ...range(0x0f3e, 0x0f47), + ...range(0x0f49, 0x0f6a), + 0x0f7f, + 0x0f85, + ...range(0x0f88, 0x0f8b), + ...range(0x0fbe, 0x0fc5), + ...range(0x0fc7, 0x0fcc), + 0x0fcf, + ...range(0x1000, 0x1021), + ...range(0x1023, 0x1027), + ...range(0x1029, 0x102a), + 0x102c, + 0x1031, + 0x1038, + ...range(0x1040, 0x1057), + ...range(0x10a0, 0x10c5), + ...range(0x10d0, 0x10f8), + 0x10fb, + ...range(0x1100, 0x1159), + ...range(0x115f, 0x11a2), + ...range(0x11a8, 0x11f9), + ...range(0x1200, 0x1206), + ...range(0x1208, 0x1246), + 0x1248, + ...range(0x124a, 0x124d), + ...range(0x1250, 0x1256), + 0x1258, + ...range(0x125a, 0x125d), + ...range(0x1260, 0x1286), + 0x1288, + ...range(0x128a, 0x128d), + ...range(0x1290, 0x12ae), + 0x12b0, + ...range(0x12b2, 0x12b5), + ...range(0x12b8, 0x12be), + 0x12c0, + ...range(0x12c2, 0x12c5), + ...range(0x12c8, 0x12ce), + ...range(0x12d0, 0x12d6), + ...range(0x12d8, 0x12ee), + ...range(0x12f0, 0x130e), + 0x1310, + ...range(0x1312, 0x1315), + ...range(0x1318, 0x131e), + ...range(0x1320, 0x1346), + ...range(0x1348, 0x135a), + ...range(0x1361, 0x137c), + ...range(0x13a0, 0x13f4), + ...range(0x1401, 0x1676), + ...range(0x1681, 0x169a), + ...range(0x16a0, 0x16f0), + ...range(0x1700, 0x170c), + ...range(0x170e, 0x1711), + ...range(0x1720, 0x1731), + ...range(0x1735, 0x1736), + ...range(0x1740, 0x1751), + ...range(0x1760, 0x176c), + ...range(0x176e, 0x1770), + ...range(0x1780, 0x17b6), + ...range(0x17be, 0x17c5), + ...range(0x17c7, 0x17c8), + ...range(0x17d4, 0x17da), + 0x17dc, + ...range(0x17e0, 0x17e9), + ...range(0x1810, 0x1819), + ...range(0x1820, 0x1877), + ...range(0x1880, 0x18a8), + ...range(0x1e00, 0x1e9b), + ...range(0x1ea0, 0x1ef9), + ...range(0x1f00, 0x1f15), + ...range(0x1f18, 0x1f1d), + ...range(0x1f20, 0x1f45), + ...range(0x1f48, 0x1f4d), + ...range(0x1f50, 0x1f57), + 0x1f59, + 0x1f5b, + 0x1f5d, + ...range(0x1f5f, 0x1f7d), + ...range(0x1f80, 0x1fb4), + ...range(0x1fb6, 0x1fbc), + 0x1fbe, + ...range(0x1fc2, 0x1fc4), + ...range(0x1fc6, 0x1fcc), + ...range(0x1fd0, 0x1fd3), + ...range(0x1fd6, 0x1fdb), + ...range(0x1fe0, 0x1fec), + ...range(0x1ff2, 0x1ff4), + ...range(0x1ff6, 0x1ffc), + 0x200e, + 0x2071, + 0x207f, + 0x2102, + 0x2107, + ...range(0x210a, 0x2113), + 0x2115, + ...range(0x2119, 0x211d), + 0x2124, + 0x2126, + 0x2128, + ...range(0x212a, 0x212d), + ...range(0x212f, 0x2131), + ...range(0x2133, 0x2139), + ...range(0x213d, 0x213f), + ...range(0x2145, 0x2149), + ...range(0x2160, 0x2183), + ...range(0x2336, 0x237a), + 0x2395, + ...range(0x249c, 0x24e9), + ...range(0x3005, 0x3007), + ...range(0x3021, 0x3029), + ...range(0x3031, 0x3035), + ...range(0x3038, 0x303c), + ...range(0x3041, 0x3096), + ...range(0x309d, 0x309f), + ...range(0x30a1, 0x30fa), + ...range(0x30fc, 0x30ff), + ...range(0x3105, 0x312c), + ...range(0x3131, 0x318e), + ...range(0x3190, 0x31b7), + ...range(0x31f0, 0x321c), + ...range(0x3220, 0x3243), + ...range(0x3260, 0x327b), + ...range(0x327f, 0x32b0), + ...range(0x32c0, 0x32cb), + ...range(0x32d0, 0x32fe), + ...range(0x3300, 0x3376), + ...range(0x337b, 0x33dd), + ...range(0x33e0, 0x33fe), + ...range(0x3400, 0x4db5), + ...range(0x4e00, 0x9fa5), + ...range(0xa000, 0xa48c), + ...range(0xac00, 0xd7a3), + ...range(0xd800, 0xfa2d), + ...range(0xfa30, 0xfa6a), + ...range(0xfb00, 0xfb06), + ...range(0xfb13, 0xfb17), + ...range(0xff21, 0xff3a), + ...range(0xff41, 0xff5a), + ...range(0xff66, 0xffbe), + ...range(0xffc2, 0xffc7), + ...range(0xffca, 0xffcf), + ...range(0xffd2, 0xffd7), + ...range(0xffda, 0xffdc), + ...range(0x10300, 0x1031e), + ...range(0x10320, 0x10323), + ...range(0x10330, 0x1034a), + ...range(0x10400, 0x10425), + ...range(0x10428, 0x1044d), + ...range(0x1d000, 0x1d0f5), + ...range(0x1d100, 0x1d126), + ...range(0x1d12a, 0x1d166), + ...range(0x1d16a, 0x1d172), + ...range(0x1d183, 0x1d184), + ...range(0x1d18c, 0x1d1a9), + ...range(0x1d1ae, 0x1d1dd), + ...range(0x1d400, 0x1d454), + ...range(0x1d456, 0x1d49c), + ...range(0x1d49e, 0x1d49f), + 0x1d4a2, + ...range(0x1d4a5, 0x1d4a6), + ...range(0x1d4a9, 0x1d4ac), + ...range(0x1d4ae, 0x1d4b9), + 0x1d4bb, + ...range(0x1d4bd, 0x1d4c0), + ...range(0x1d4c2, 0x1d4c3), + ...range(0x1d4c5, 0x1d505), + ...range(0x1d507, 0x1d50a), + ...range(0x1d50d, 0x1d514), + ...range(0x1d516, 0x1d51c), + ...range(0x1d51e, 0x1d539), + ...range(0x1d53b, 0x1d53e), + ...range(0x1d540, 0x1d544), + 0x1d546, + ...range(0x1d54a, 0x1d550), + ...range(0x1d552, 0x1d6a3), + ...range(0x1d6a8, 0x1d7c9), + ...range(0x20000, 0x2a6d6), + ...range(0x2f800, 0x2fa1d), + ...range(0xf0000, 0xffffd), + ...range(0x100000, 0x10fffd), +]); + +module.exports = { + unassigned_code_points, + commonly_mapped_to_nothing, + non_ASCII_space_characters, + prohibited_characters, + bidirectional_r_al, + bidirectional_l, +}; diff --git a/node_modules/saslprep/lib/memory-code-points.js b/node_modules/saslprep/lib/memory-code-points.js new file mode 100644 index 00000000..cb0289c8 --- /dev/null +++ b/node_modules/saslprep/lib/memory-code-points.js @@ -0,0 +1,39 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const bitfield = require('sparse-bitfield'); + +/* eslint-disable-next-line security/detect-non-literal-fs-filename */ +const memory = fs.readFileSync(path.resolve(__dirname, '../code-points.mem')); +let offset = 0; + +/** + * Loads each code points sequence from buffer. + * @returns {bitfield} + */ +function read() { + const size = memory.readUInt32BE(offset); + offset += 4; + + const codepoints = memory.slice(offset, offset + size); + offset += size; + + return bitfield({ buffer: codepoints }); +} + +const unassigned_code_points = read(); +const commonly_mapped_to_nothing = read(); +const non_ASCII_space_characters = read(); +const prohibited_characters = read(); +const bidirectional_r_al = read(); +const bidirectional_l = read(); + +module.exports = { + unassigned_code_points, + commonly_mapped_to_nothing, + non_ASCII_space_characters, + prohibited_characters, + bidirectional_r_al, + bidirectional_l, +}; diff --git a/node_modules/saslprep/lib/util.js b/node_modules/saslprep/lib/util.js new file mode 100644 index 00000000..506bdc99 --- /dev/null +++ b/node_modules/saslprep/lib/util.js @@ -0,0 +1,21 @@ +'use strict'; + +/** + * Create an array of numbers. + * @param {number} from + * @param {number} to + * @returns {number[]} + */ +function range(from, to) { + // TODO: make this inlined. + const list = new Array(to - from + 1); + + for (let i = 0; i < list.length; i += 1) { + list[i] = from + i; + } + return list; +} + +module.exports = { + range, +}; diff --git a/node_modules/saslprep/package.json b/node_modules/saslprep/package.json new file mode 100644 index 00000000..0bab8ed5 --- /dev/null +++ b/node_modules/saslprep/package.json @@ -0,0 +1,100 @@ +{ + "_from": "saslprep@^1.0.0", + "_id": "saslprep@1.0.3", + "_inBundle": false, + "_integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "_location": "/saslprep", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "saslprep@^1.0.0", + "name": "saslprep", + "escapedName": "saslprep", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/mongodb" + ], + "_resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "_shasum": "4c02f946b56cf54297e347ba1093e7acac4cf226", + "_spec": "saslprep@^1.0.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\mongodb", + "author": { + "name": "Dmitry Tsvettsikh", + "email": "me@reklatsmasters.com" + }, + "bugs": { + "url": "https://github.com/reklatsmasters/saslprep/issues" + }, + "bundleDependencies": false, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "deprecated": false, + "description": "SASLprep: Stringprep Profile for User Names and Passwords, rfc4013.", + "devDependencies": { + "@nodertc/eslint-config": "^0.2.1", + "eslint": "^5.16.0", + "jest": "^23.6.0", + "prettier": "^1.14.3" + }, + "engines": { + "node": ">=6" + }, + "eslintConfig": { + "extends": "@nodertc", + "rules": { + "camelcase": "off", + "no-continue": "off" + }, + "overrides": [ + { + "files": [ + "test/*.js" + ], + "env": { + "jest": true + }, + "rules": { + "require-jsdoc": "off" + } + } + ] + }, + "homepage": "https://github.com/reklatsmasters/saslprep#readme", + "jest": { + "modulePaths": [ + "" + ], + "testMatch": [ + "**/test/*.js" + ], + "testPathIgnorePatterns": [ + "/node_modules/" + ] + }, + "keywords": [ + "sasl", + "saslprep", + "stringprep", + "rfc4013", + "4013" + ], + "license": "MIT", + "main": "index.js", + "name": "saslprep", + "repository": { + "type": "git", + "url": "git+https://github.com/reklatsmasters/saslprep.git" + }, + "scripts": { + "gen-code-points": "node generate-code-points.js > code-points.mem", + "lint": "npx eslint --quiet .", + "test": "npm run lint && npm run unit-test", + "unit-test": "npx jest" + }, + "version": "1.0.3" +} diff --git a/node_modules/saslprep/readme.md b/node_modules/saslprep/readme.md new file mode 100644 index 00000000..8ff3d70d --- /dev/null +++ b/node_modules/saslprep/readme.md @@ -0,0 +1,31 @@ +# saslprep +[![Build Status](https://travis-ci.org/reklatsmasters/saslprep.svg?branch=master)](https://travis-ci.org/reklatsmasters/saslprep) +[![npm](https://img.shields.io/npm/v/saslprep.svg)](https://npmjs.org/package/saslprep) +[![node](https://img.shields.io/node/v/saslprep.svg)](https://npmjs.org/package/saslprep) +[![license](https://img.shields.io/npm/l/saslprep.svg)](https://npmjs.org/package/saslprep) +[![downloads](https://img.shields.io/npm/dm/saslprep.svg)](https://npmjs.org/package/saslprep) + +Stringprep Profile for User Names and Passwords, [rfc4013](https://tools.ietf.org/html/rfc4013) + +### Usage + +```js +const saslprep = require('saslprep') + +saslprep('password\u00AD') // password +saslprep('password\u0007') // Error: prohibited character +``` + +### API + +##### `saslprep(input: String, opts: Options): String` + +Normalize user name or password. + +##### `Options.allowUnassigned: bool` + +A special behavior for unassigned code points, see https://tools.ietf.org/html/rfc4013#section-2.5. Disabled by default. + +## License + +MIT, 2017-2019 (c) Dmitriy Tsvettsikh diff --git a/node_modules/saslprep/test/index.js b/node_modules/saslprep/test/index.js new file mode 100644 index 00000000..80c71af5 --- /dev/null +++ b/node_modules/saslprep/test/index.js @@ -0,0 +1,76 @@ +'use strict'; + +const saslprep = require('..'); + +const chr = String.fromCodePoint; + +test('should work with liatin letters', () => { + const str = 'user'; + expect(saslprep(str)).toEqual(str); +}); + +test('should work be case preserved', () => { + const str = 'USER'; + expect(saslprep(str)).toEqual(str); +}); + +test('should work with high code points (> U+FFFF)', () => { + const str = '\uD83D\uDE00'; + expect(saslprep(str, { allowUnassigned: true })).toEqual(str); +}); + +test('should remove `mapped to nothing` characters', () => { + expect(saslprep('I\u00ADX')).toEqual('IX'); +}); + +test('should replace `Non-ASCII space characters` with space', () => { + expect(saslprep('a\u00A0b')).toEqual('a\u0020b'); +}); + +test('should normalize as NFKC', () => { + expect(saslprep('\u00AA')).toEqual('a'); + expect(saslprep('\u2168')).toEqual('IX'); +}); + +test('should throws when prohibited characters', () => { + // C.2.1 ASCII control characters + expect(() => saslprep('a\u007Fb')).toThrow(); + + // C.2.2 Non-ASCII control characters + expect(() => saslprep('a\u06DDb')).toThrow(); + + // C.3 Private use + expect(() => saslprep('a\uE000b')).toThrow(); + + // C.4 Non-character code points + expect(() => saslprep(`a${chr(0x1fffe)}b`)).toThrow(); + + // C.5 Surrogate codes + expect(() => saslprep('a\uD800b')).toThrow(); + + // C.6 Inappropriate for plain text + expect(() => saslprep('a\uFFF9b')).toThrow(); + + // C.7 Inappropriate for canonical representation + expect(() => saslprep('a\u2FF0b')).toThrow(); + + // C.8 Change display properties or are deprecated + expect(() => saslprep('a\u200Eb')).toThrow(); + + // C.9 Tagging characters + expect(() => saslprep(`a${chr(0xe0001)}b`)).toThrow(); +}); + +test('should not containt RandALCat and LCat bidi', () => { + expect(() => saslprep('a\u06DD\u00AAb')).toThrow(); +}); + +test('RandALCat should be first and last', () => { + expect(() => saslprep('\u0627\u0031\u0628')).not.toThrow(); + expect(() => saslprep('\u0627\u0031')).toThrow(); +}); + +test('should handle unassigned code points', () => { + expect(() => saslprep('a\u0487')).toThrow(); + expect(() => saslprep('a\u0487', { allowUnassigned: true })).not.toThrow(); +}); diff --git a/node_modules/saslprep/test/util.js b/node_modules/saslprep/test/util.js new file mode 100644 index 00000000..355db3f8 --- /dev/null +++ b/node_modules/saslprep/test/util.js @@ -0,0 +1,16 @@ +'use strict'; + +const { setFlagsFromString } = require('v8'); +const { range } = require('../lib/util'); + +// 984 by default. +setFlagsFromString('--stack_size=500'); + +test('should work', () => { + const list = range(1, 3); + expect(list).toEqual([1, 2, 3]); +}); + +test('should work for large ranges', () => { + expect(() => range(1, 1e6)).not.toThrow(); +}); diff --git a/node_modules/semver/CHANGELOG.md b/node_modules/semver/CHANGELOG.md new file mode 100644 index 00000000..66304fdd --- /dev/null +++ b/node_modules/semver/CHANGELOG.md @@ -0,0 +1,39 @@ +# changes log + +## 5.7 + +* Add `minVersion` method + +## 5.6 + +* Move boolean `loose` param to an options object, with + backwards-compatibility protection. +* Add ability to opt out of special prerelease version handling with + the `includePrerelease` option flag. + +## 5.5 + +* Add version coercion capabilities + +## 5.4 + +* Add intersection checking + +## 5.3 + +* Add `minSatisfying` method + +## 5.2 + +* Add `prerelease(v)` that returns prerelease components + +## 5.1 + +* Add Backus-Naur for ranges +* Remove excessively cute inspection methods + +## 5.0 + +* Remove AMD/Browserified build artifacts +* Fix ltr and gtr when using the `*` range +* Fix for range `*` with a prerelease identifier diff --git a/node_modules/semver/LICENSE b/node_modules/semver/LICENSE new file mode 100644 index 00000000..19129e31 --- /dev/null +++ b/node_modules/semver/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/semver/README.md b/node_modules/semver/README.md new file mode 100644 index 00000000..f8dfa5a0 --- /dev/null +++ b/node_modules/semver/README.md @@ -0,0 +1,412 @@ +semver(1) -- The semantic versioner for npm +=========================================== + +## Install + +```bash +npm install --save semver +```` + +## Usage + +As a node module: + +```js +const semver = require('semver') + +semver.valid('1.2.3') // '1.2.3' +semver.valid('a.b.c') // null +semver.clean(' =v1.2.3 ') // '1.2.3' +semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true +semver.gt('1.2.3', '9.8.7') // false +semver.lt('1.2.3', '9.8.7') // true +semver.minVersion('>=1.0.0') // '1.0.0' +semver.valid(semver.coerce('v2')) // '2.0.0' +semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' +``` + +As a command-line utility: + +``` +$ semver -h + +A JavaScript implementation of the https://semver.org/ specification +Copyright Isaac Z. Schlueter + +Usage: semver [options] [ [...]] +Prints valid versions sorted by SemVer precedence + +Options: +-r --range + Print versions that match the specified range. + +-i --increment [] + Increment a version by the specified level. Level can + be one of: major, minor, patch, premajor, preminor, + prepatch, or prerelease. Default level is 'patch'. + Only one version may be specified. + +--preid + Identifier to be used to prefix premajor, preminor, + prepatch or prerelease version increments. + +-l --loose + Interpret versions and ranges loosely + +-p --include-prerelease + Always include prerelease versions in range matching + +-c --coerce + Coerce a string into SemVer if possible + (does not imply --loose) + +Program exits successfully if any valid version satisfies +all supplied ranges, and prints all satisfying versions. + +If no satisfying versions are found, then exits failure. + +Versions are printed in ascending order, so supplying +multiple versions to the utility will just sort them. +``` + +## Versions + +A "version" is described by the `v2.0.0` specification found at +. + +A leading `"="` or `"v"` character is stripped off and ignored. + +## Ranges + +A `version range` is a set of `comparators` which specify versions +that satisfy the range. + +A `comparator` is composed of an `operator` and a `version`. The set +of primitive `operators` is: + +* `<` Less than +* `<=` Less than or equal to +* `>` Greater than +* `>=` Greater than or equal to +* `=` Equal. If no operator is specified, then equality is assumed, + so this operator is optional, but MAY be included. + +For example, the comparator `>=1.2.7` would match the versions +`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` +or `1.1.0`. + +Comparators can be joined by whitespace to form a `comparator set`, +which is satisfied by the **intersection** of all of the comparators +it includes. + +A range is composed of one or more comparator sets, joined by `||`. A +version matches a range if and only if every comparator in at least +one of the `||`-separated comparator sets is satisfied by the version. + +For example, the range `>=1.2.7 <1.3.0` would match the versions +`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, +or `1.1.0`. + +The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, +`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. + +### Prerelease Tags + +If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same `[major, minor, patch]` tuple also has a +prerelease tag. + +For example, the range `>1.2.3-alpha.3` would be allowed to match the +version `1.2.3-alpha.7`, but it would *not* be satisfied by +`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater +than" `1.2.3-alpha.3` according to the SemVer sort rules. The version +range only accepts prerelease tags on the `1.2.3` version. The +version `3.4.5` *would* satisfy the range, because it does not have a +prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. + +The purpose for this behavior is twofold. First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption. +Therefore, by default, they are excluded from range matching +semantics. + +Second, a user who has opted into using a prerelease version has +clearly indicated the intent to use *that specific* set of +alpha/beta/rc versions. By including a prerelease tag in the range, +the user is indicating that they are aware of the risk. However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the *next* set of prerelease versions. + +Note that this behavior can be suppressed (treating all prerelease +versions as if they were normal versions, for the purpose of range +matching) by setting the `includePrerelease` flag on the options +object to any +[functions](https://github.com/npm/node-semver#functions) that do +range matching. + +#### Prerelease Identifiers + +The method `.inc` takes an additional `identifier` string argument that +will append the value of the string as a prerelease identifier: + +```javascript +semver.inc('1.2.3', 'prerelease', 'beta') +// '1.2.4-beta.0' +``` + +command-line example: + +```bash +$ semver 1.2.3 -i prerelease --preid beta +1.2.4-beta.0 +``` + +Which then can be used to increment further: + +```bash +$ semver 1.2.4-beta.0 -i prerelease +1.2.4-beta.1 +``` + +### Advanced Range Syntax + +Advanced range syntax desugars to primitive comparators in +deterministic ways. + +Advanced ranges may be combined in the same way as primitive +comparators using white space or `||`. + +#### Hyphen Ranges `X.Y.Z - A.B.C` + +Specifies an inclusive set. + +* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` + +If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes. + +* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` + +If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts. + +* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0` +* `1.2.3 - 2` := `>=1.2.3 <3.0.0` + +#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` + +Any of `X`, `x`, or `*` may be used to "stand in" for one of the +numeric values in the `[major, minor, patch]` tuple. + +* `*` := `>=0.0.0` (Any version satisfies) +* `1.x` := `>=1.0.0 <2.0.0` (Matching major version) +* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions) + +A partial version range is treated as an X-Range, so the special +character is in fact optional. + +* `""` (empty string) := `*` := `>=0.0.0` +* `1` := `1.x.x` := `>=1.0.0 <2.0.0` +* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0` + +#### Tilde Ranges `~1.2.3` `~1.2` `~1` + +Allows patch-level changes if a minor version is specified on the +comparator. Allows minor-level changes if not. + +* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0` +* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`) +* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`) +* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0` +* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`) +* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`) +* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. + +#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` + +Allows changes that do not modify the left-most non-zero digit in the +`[major, minor, patch]` tuple. In other words, this allows patch and +minor updates for versions `1.0.0` and above, patch updates for +versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. + +Many authors treat a `0.x` version as if the `x` were the major +"breaking-change" indicator. + +Caret ranges are ideal when an author may make breaking changes +between `0.2.4` and `0.3.0` releases, which is a common practice. +However, it presumes that there will *not* be breaking changes between +`0.2.4` and `0.2.5`. It allows for changes that are presumed to be +additive (but non-breaking), according to commonly observed practices. + +* `^1.2.3` := `>=1.2.3 <2.0.0` +* `^0.2.3` := `>=0.2.3 <0.3.0` +* `^0.0.3` := `>=0.0.3 <0.0.4` +* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. +* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the + `0.0.3` version *only* will be allowed, if they are greater than or + equal to `beta`. So, `0.0.3-pr.2` would be allowed. + +When parsing caret ranges, a missing `patch` value desugars to the +number `0`, but will allow flexibility within that value, even if the +major and minor versions are both `0`. + +* `^1.2.x` := `>=1.2.0 <2.0.0` +* `^0.0.x` := `>=0.0.0 <0.1.0` +* `^0.0` := `>=0.0.0 <0.1.0` + +A missing `minor` and `patch` values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero. + +* `^1.x` := `>=1.0.0 <2.0.0` +* `^0.x` := `>=0.0.0 <1.0.0` + +### Range Grammar + +Putting all this together, here is a Backus-Naur grammar for ranges, +for the benefit of parser authors: + +```bnf +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ +``` + +## Functions + +All methods and classes take a final `options` object argument. All +options in this object are `false` by default. The options supported +are: + +- `loose` Be more forgiving about not-quite-valid semver strings. + (Any resulting output will always be 100% strict compliant, of + course.) For backwards compatibility reasons, if the `options` + argument is a boolean value instead of an object, it is interpreted + to be the `loose` param. +- `includePrerelease` Set to suppress the [default + behavior](https://github.com/npm/node-semver#prerelease-tags) of + excluding prerelease tagged versions from ranges unless they are + explicitly opted into. + +Strict-mode Comparators and Ranges will be strict about the SemVer +strings that they parse. + +* `valid(v)`: Return the parsed version, or null if it's not valid. +* `inc(v, release)`: Return the version incremented by the release + type (`major`, `premajor`, `minor`, `preminor`, `patch`, + `prepatch`, or `prerelease`), or null if it's not valid + * `premajor` in one call will bump the version up to the next major + version and down to a prerelease of that major version. + `preminor`, and `prepatch` work the same way. + * If called from a non-prerelease version, the `prerelease` will work the + same as `prepatch`. It increments the patch version, then makes a + prerelease. If the input version is already a prerelease it simply + increments it. +* `prerelease(v)`: Returns an array of prerelease components, or null + if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` +* `major(v)`: Return the major version number. +* `minor(v)`: Return the minor version number. +* `patch(v)`: Return the patch version number. +* `intersects(r1, r2, loose)`: Return true if the two supplied ranges + or comparators intersect. +* `parse(v)`: Attempt to parse a string as a semantic version, returning either + a `SemVer` object or `null`. + +### Comparison + +* `gt(v1, v2)`: `v1 > v2` +* `gte(v1, v2)`: `v1 >= v2` +* `lt(v1, v2)`: `v1 < v2` +* `lte(v1, v2)`: `v1 <= v2` +* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, + even if they're not the exact same string. You already know how to + compare strings. +* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. +* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call + the corresponding function above. `"==="` and `"!=="` do simple + string comparison, but are included for completeness. Throws if an + invalid comparison string is provided. +* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if + `v2` is greater. Sorts in ascending order if passed to `Array.sort()`. +* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions + in descending order when passed to `Array.sort()`. +* `diff(v1, v2)`: Returns difference between two versions by the release type + (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), + or null if the versions are the same. + +### Comparators + +* `intersects(comparator)`: Return true if the comparators intersect + +### Ranges + +* `validRange(range)`: Return the valid range or null if it's not valid +* `satisfies(version, range)`: Return true if the version satisfies the + range. +* `maxSatisfying(versions, range)`: Return the highest version in the list + that satisfies the range, or `null` if none of them do. +* `minSatisfying(versions, range)`: Return the lowest version in the list + that satisfies the range, or `null` if none of them do. +* `minVersion(range)`: Return the lowest version that can possibly match + the given range. +* `gtr(version, range)`: Return `true` if version is greater than all the + versions possible in the range. +* `ltr(version, range)`: Return `true` if version is less than all the + versions possible in the range. +* `outside(version, range, hilo)`: Return true if the version is outside + the bounds of the range in either the high or low direction. The + `hilo` argument must be either the string `'>'` or `'<'`. (This is + the function called by `gtr` and `ltr`.) +* `intersects(range)`: Return true if any of the ranges comparators intersect + +Note that, since ranges may be non-contiguous, a version might not be +greater than a range, less than a range, *or* satisfy a range! For +example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` +until `2.0.0`, so the version `1.2.10` would not be greater than the +range (because `2.0.1` satisfies, which is higher), nor less than the +range (since `1.2.8` satisfies, which is lower), and it also does not +satisfy the range. + +If you want to know if a version satisfies or does not satisfy a +range, use the `satisfies(version, range)` function. + +### Coercion + +* `coerce(version)`: Coerces a string to semver if possible + +This aims to provide a very forgiving translation of a non-semver string to +semver. It looks for the first digit in a string, and consumes all +remaining characters which satisfy at least a partial semver (e.g., `1`, +`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer +versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All +surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes +`3.4.0`). Only text which lacks digits will fail coercion (`version one` +is not valid). The maximum length for any semver component considered for +coercion is 16 characters; longer components will be ignored +(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any +semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value +components are invalid (`9999999999999999.4.7.4` is likely invalid). diff --git a/node_modules/semver/bin/semver b/node_modules/semver/bin/semver new file mode 100644 index 00000000..801e77f1 --- /dev/null +++ b/node_modules/semver/bin/semver @@ -0,0 +1,160 @@ +#!/usr/bin/env node +// Standalone semver comparison program. +// Exits successfully and prints matching version(s) if +// any supplied version is valid and passes all tests. + +var argv = process.argv.slice(2) + +var versions = [] + +var range = [] + +var inc = null + +var version = require('../package.json').version + +var loose = false + +var includePrerelease = false + +var coerce = false + +var identifier + +var semver = require('../semver') + +var reverse = false + +var options = {} + +main() + +function main () { + if (!argv.length) return help() + while (argv.length) { + var a = argv.shift() + var indexOfEqualSign = a.indexOf('=') + if (indexOfEqualSign !== -1) { + a = a.slice(0, indexOfEqualSign) + argv.unshift(a.slice(indexOfEqualSign + 1)) + } + switch (a) { + case '-rv': case '-rev': case '--rev': case '--reverse': + reverse = true + break + case '-l': case '--loose': + loose = true + break + case '-p': case '--include-prerelease': + includePrerelease = true + break + case '-v': case '--version': + versions.push(argv.shift()) + break + case '-i': case '--inc': case '--increment': + switch (argv[0]) { + case 'major': case 'minor': case 'patch': case 'prerelease': + case 'premajor': case 'preminor': case 'prepatch': + inc = argv.shift() + break + default: + inc = 'patch' + break + } + break + case '--preid': + identifier = argv.shift() + break + case '-r': case '--range': + range.push(argv.shift()) + break + case '-c': case '--coerce': + coerce = true + break + case '-h': case '--help': case '-?': + return help() + default: + versions.push(a) + break + } + } + + var options = { loose: loose, includePrerelease: includePrerelease } + + versions = versions.map(function (v) { + return coerce ? (semver.coerce(v) || { version: v }).version : v + }).filter(function (v) { + return semver.valid(v) + }) + if (!versions.length) return fail() + if (inc && (versions.length !== 1 || range.length)) { return failInc() } + + for (var i = 0, l = range.length; i < l; i++) { + versions = versions.filter(function (v) { + return semver.satisfies(v, range[i], options) + }) + if (!versions.length) return fail() + } + return success(versions) +} + +function failInc () { + console.error('--inc can only be used on a single version with no range') + fail() +} + +function fail () { process.exit(1) } + +function success () { + var compare = reverse ? 'rcompare' : 'compare' + versions.sort(function (a, b) { + return semver[compare](a, b, options) + }).map(function (v) { + return semver.clean(v, options) + }).map(function (v) { + return inc ? semver.inc(v, inc, options, identifier) : v + }).forEach(function (v, i, _) { console.log(v) }) +} + +function help () { + console.log(['SemVer ' + version, + '', + 'A JavaScript implementation of the https://semver.org/ specification', + 'Copyright Isaac Z. Schlueter', + '', + 'Usage: semver [options] [ [...]]', + 'Prints valid versions sorted by SemVer precedence', + '', + 'Options:', + '-r --range ', + ' Print versions that match the specified range.', + '', + '-i --increment []', + ' Increment a version by the specified level. Level can', + ' be one of: major, minor, patch, premajor, preminor,', + " prepatch, or prerelease. Default level is 'patch'.", + ' Only one version may be specified.', + '', + '--preid ', + ' Identifier to be used to prefix premajor, preminor,', + ' prepatch or prerelease version increments.', + '', + '-l --loose', + ' Interpret versions and ranges loosely', + '', + '-p --include-prerelease', + ' Always include prerelease versions in range matching', + '', + '-c --coerce', + ' Coerce a string into SemVer if possible', + ' (does not imply --loose)', + '', + 'Program exits successfully if any valid version satisfies', + 'all supplied ranges, and prints all satisfying versions.', + '', + 'If no satisfying versions are found, then exits failure.', + '', + 'Versions are printed in ascending order, so supplying', + 'multiple versions to the utility will just sort them.' + ].join('\n')) +} diff --git a/node_modules/semver/package.json b/node_modules/semver/package.json new file mode 100644 index 00000000..907079a2 --- /dev/null +++ b/node_modules/semver/package.json @@ -0,0 +1,60 @@ +{ + "_from": "semver@^5.1.0", + "_id": "semver@5.7.1", + "_inBundle": false, + "_integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "_location": "/semver", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "semver@^5.1.0", + "name": "semver", + "escapedName": "semver", + "rawSpec": "^5.1.0", + "saveSpec": null, + "fetchSpec": "^5.1.0" + }, + "_requiredBy": [ + "/require_optional" + ], + "_resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "_shasum": "a954f931aeba508d307bbf069eff0c01c96116f7", + "_spec": "semver@^5.1.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\require_optional", + "bin": { + "semver": "bin/semver" + }, + "bugs": { + "url": "https://github.com/npm/node-semver/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "The semantic version parser used by npm.", + "devDependencies": { + "tap": "^13.0.0-rc.18" + }, + "files": [ + "bin", + "range.bnf", + "semver.js" + ], + "homepage": "https://github.com/npm/node-semver#readme", + "license": "ISC", + "main": "semver.js", + "name": "semver", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/node-semver.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap" + }, + "tap": { + "check-coverage": true + }, + "version": "5.7.1" +} diff --git a/node_modules/semver/range.bnf b/node_modules/semver/range.bnf new file mode 100644 index 00000000..d4c6ae0d --- /dev/null +++ b/node_modules/semver/range.bnf @@ -0,0 +1,16 @@ +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | [1-9] ( [0-9] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ diff --git a/node_modules/semver/semver.js b/node_modules/semver/semver.js new file mode 100644 index 00000000..d315d5d6 --- /dev/null +++ b/node_modules/semver/semver.js @@ -0,0 +1,1483 @@ +exports = module.exports = SemVer + +var debug +/* istanbul ignore next */ +if (typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG)) { + debug = function () { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift('SEMVER') + console.log.apply(console, args) + } +} else { + debug = function () {} +} + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0' + +var MAX_LENGTH = 256 +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || + /* istanbul ignore next */ 9007199254740991 + +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16 + +// The actual regexps go on exports.re +var re = exports.re = [] +var src = exports.src = [] +var R = 0 + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +var NUMERICIDENTIFIER = R++ +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*' +var NUMERICIDENTIFIERLOOSE = R++ +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+' + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +var NONNUMERICIDENTIFIER = R++ +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' + +// ## Main Version +// Three dot-separated numeric identifiers. + +var MAINVERSION = R++ +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')' + +var MAINVERSIONLOOSE = R++ +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')' + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +var PRERELEASEIDENTIFIER = R++ +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')' + +var PRERELEASEIDENTIFIERLOOSE = R++ +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')' + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +var PRERELEASE = R++ +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))' + +var PRERELEASELOOSE = R++ +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))' + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +var BUILDIDENTIFIER = R++ +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+' + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +var BUILD = R++ +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))' + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +var FULL = R++ +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?' + +src[FULL] = '^' + FULLPLAIN + '$' + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?' + +var LOOSE = R++ +src[LOOSE] = '^' + LOOSEPLAIN + '$' + +var GTLT = R++ +src[GTLT] = '((?:<|>)?=?)' + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++ +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' +var XRANGEIDENTIFIER = R++ +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*' + +var XRANGEPLAIN = R++ +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?' + +var XRANGEPLAINLOOSE = R++ +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?' + +var XRANGE = R++ +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' +var XRANGELOOSE = R++ +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +var COERCE = R++ +src[COERCE] = '(?:^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])' + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++ +src[LONETILDE] = '(?:~>?)' + +var TILDETRIM = R++ +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+' +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g') +var tildeTrimReplace = '$1~' + +var TILDE = R++ +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$' +var TILDELOOSE = R++ +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$' + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++ +src[LONECARET] = '(?:\\^)' + +var CARETTRIM = R++ +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+' +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g') +var caretTrimReplace = '$1^' + +var CARET = R++ +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$' +var CARETLOOSE = R++ +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$' + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++ +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$' +var COMPARATOR = R++ +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$' + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++ +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')' + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g') +var comparatorTrimReplace = '$1$2$3' + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++ +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$' + +var HYPHENRANGELOOSE = R++ +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$' + +// Star ranges basically just allow anything at all. +var STAR = R++ +src[STAR] = '(<|>)?=?\\s*\\*' + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]) + if (!re[i]) { + re[i] = new RegExp(src[i]) + } +} + +exports.parse = parse +function parse (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + if (version.length > MAX_LENGTH) { + return null + } + + var r = options.loose ? re[LOOSE] : re[FULL] + if (!r.test(version)) { + return null + } + + try { + return new SemVer(version, options) + } catch (er) { + return null + } +} + +exports.valid = valid +function valid (version, options) { + var v = parse(version, options) + return v ? v.version : null +} + +exports.clean = clean +function clean (version, options) { + var s = parse(version.trim().replace(/^[=v]+/, ''), options) + return s ? s.version : null +} + +exports.SemVer = SemVer + +function SemVer (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + if (version instanceof SemVer) { + if (version.loose === options.loose) { + return version + } else { + version = version.version + } + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version) + } + + if (version.length > MAX_LENGTH) { + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + } + + if (!(this instanceof SemVer)) { + return new SemVer(version, options) + } + + debug('SemVer', version, options) + this.options = options + this.loose = !!options.loose + + var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]) + + if (!m) { + throw new TypeError('Invalid Version: ' + version) + } + + this.raw = version + + // these are actually numbers + this.major = +m[1] + this.minor = +m[2] + this.patch = +m[3] + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) { + throw new TypeError('Invalid major version') + } + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { + throw new TypeError('Invalid minor version') + } + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { + throw new TypeError('Invalid patch version') + } + + // numberify any prerelease numeric ids + if (!m[4]) { + this.prerelease = [] + } else { + this.prerelease = m[4].split('.').map(function (id) { + if (/^[0-9]+$/.test(id)) { + var num = +id + if (num >= 0 && num < MAX_SAFE_INTEGER) { + return num + } + } + return id + }) + } + + this.build = m[5] ? m[5].split('.') : [] + this.format() +} + +SemVer.prototype.format = function () { + this.version = this.major + '.' + this.minor + '.' + this.patch + if (this.prerelease.length) { + this.version += '-' + this.prerelease.join('.') + } + return this.version +} + +SemVer.prototype.toString = function () { + return this.version +} + +SemVer.prototype.compare = function (other) { + debug('SemVer.compare', this.version, this.options, other) + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return this.compareMain(other) || this.comparePre(other) +} + +SemVer.prototype.compareMain = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch) +} + +SemVer.prototype.comparePre = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) { + return -1 + } else if (!this.prerelease.length && other.prerelease.length) { + return 1 + } else if (!this.prerelease.length && !other.prerelease.length) { + return 0 + } + + var i = 0 + do { + var a = this.prerelease[i] + var b = other.prerelease[i] + debug('prerelease compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) +} + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function (release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0 + this.patch = 0 + this.minor = 0 + this.major++ + this.inc('pre', identifier) + break + case 'preminor': + this.prerelease.length = 0 + this.patch = 0 + this.minor++ + this.inc('pre', identifier) + break + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0 + this.inc('patch', identifier) + this.inc('pre', identifier) + break + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) { + this.inc('patch', identifier) + } + this.inc('pre', identifier) + break + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || + this.patch !== 0 || + this.prerelease.length === 0) { + this.major++ + } + this.minor = 0 + this.patch = 0 + this.prerelease = [] + break + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) { + this.minor++ + } + this.patch = 0 + this.prerelease = [] + break + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) { + this.patch++ + } + this.prerelease = [] + break + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) { + this.prerelease = [0] + } else { + var i = this.prerelease.length + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++ + i = -2 + } + } + if (i === -1) { + // didn't increment anything + this.prerelease.push(0) + } + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) { + this.prerelease = [identifier, 0] + } + } else { + this.prerelease = [identifier, 0] + } + } + break + + default: + throw new Error('invalid increment argument: ' + release) + } + this.format() + this.raw = this.version + return this +} + +exports.inc = inc +function inc (version, release, loose, identifier) { + if (typeof (loose) === 'string') { + identifier = loose + loose = undefined + } + + try { + return new SemVer(version, loose).inc(release, identifier).version + } catch (er) { + return null + } +} + +exports.diff = diff +function diff (version1, version2) { + if (eq(version1, version2)) { + return null + } else { + var v1 = parse(version1) + var v2 = parse(version2) + var prefix = '' + if (v1.prerelease.length || v2.prerelease.length) { + prefix = 'pre' + var defaultResult = 'prerelease' + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return prefix + key + } + } + } + return defaultResult // may be undefined + } +} + +exports.compareIdentifiers = compareIdentifiers + +var numeric = /^[0-9]+$/ +function compareIdentifiers (a, b) { + var anum = numeric.test(a) + var bnum = numeric.test(b) + + if (anum && bnum) { + a = +a + b = +b + } + + return a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 +} + +exports.rcompareIdentifiers = rcompareIdentifiers +function rcompareIdentifiers (a, b) { + return compareIdentifiers(b, a) +} + +exports.major = major +function major (a, loose) { + return new SemVer(a, loose).major +} + +exports.minor = minor +function minor (a, loose) { + return new SemVer(a, loose).minor +} + +exports.patch = patch +function patch (a, loose) { + return new SemVer(a, loose).patch +} + +exports.compare = compare +function compare (a, b, loose) { + return new SemVer(a, loose).compare(new SemVer(b, loose)) +} + +exports.compareLoose = compareLoose +function compareLoose (a, b) { + return compare(a, b, true) +} + +exports.rcompare = rcompare +function rcompare (a, b, loose) { + return compare(b, a, loose) +} + +exports.sort = sort +function sort (list, loose) { + return list.sort(function (a, b) { + return exports.compare(a, b, loose) + }) +} + +exports.rsort = rsort +function rsort (list, loose) { + return list.sort(function (a, b) { + return exports.rcompare(a, b, loose) + }) +} + +exports.gt = gt +function gt (a, b, loose) { + return compare(a, b, loose) > 0 +} + +exports.lt = lt +function lt (a, b, loose) { + return compare(a, b, loose) < 0 +} + +exports.eq = eq +function eq (a, b, loose) { + return compare(a, b, loose) === 0 +} + +exports.neq = neq +function neq (a, b, loose) { + return compare(a, b, loose) !== 0 +} + +exports.gte = gte +function gte (a, b, loose) { + return compare(a, b, loose) >= 0 +} + +exports.lte = lte +function lte (a, b, loose) { + return compare(a, b, loose) <= 0 +} + +exports.cmp = cmp +function cmp (a, op, b, loose) { + switch (op) { + case '===': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a === b + + case '!==': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError('Invalid operator: ' + op) + } +} + +exports.Comparator = Comparator +function Comparator (comp, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value + } + } + + if (!(this instanceof Comparator)) { + return new Comparator(comp, options) + } + + debug('comparator', comp, options) + this.options = options + this.loose = !!options.loose + this.parse(comp) + + if (this.semver === ANY) { + this.value = '' + } else { + this.value = this.operator + this.semver.version + } + + debug('comp', this) +} + +var ANY = {} +Comparator.prototype.parse = function (comp) { + var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var m = comp.match(r) + + if (!m) { + throw new TypeError('Invalid comparator: ' + comp) + } + + this.operator = m[1] + if (this.operator === '=') { + this.operator = '' + } + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) { + this.semver = ANY + } else { + this.semver = new SemVer(m[2], this.options.loose) + } +} + +Comparator.prototype.toString = function () { + return this.value +} + +Comparator.prototype.test = function (version) { + debug('Comparator.test', version, this.options.loose) + + if (this.semver === ANY) { + return true + } + + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } + + return cmp(version, this.operator, this.semver, this.options) +} + +Comparator.prototype.intersects = function (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } + + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + var rangeTmp + + if (this.operator === '') { + rangeTmp = new Range(comp.value, options) + return satisfies(this.value, rangeTmp, options) + } else if (comp.operator === '') { + rangeTmp = new Range(this.value, options) + return satisfies(comp.semver, rangeTmp, options) + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>') + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<') + var sameSemVer = this.semver.version === comp.semver.version + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<=') + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, options) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')) + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, options) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')) + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan +} + +exports.Range = Range +function Range (range, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (range instanceof Range) { + if (range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease) { + return range + } else { + return new Range(range.raw, options) + } + } + + if (range instanceof Comparator) { + return new Range(range.value, options) + } + + if (!(this instanceof Range)) { + return new Range(range, options) + } + + this.options = options + this.loose = !!options.loose + this.includePrerelease = !!options.includePrerelease + + // First, split based on boolean or || + this.raw = range + this.set = range.split(/\s*\|\|\s*/).map(function (range) { + return this.parseRange(range.trim()) + }, this).filter(function (c) { + // throw out any that are not relevant for whatever reason + return c.length + }) + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range) + } + + this.format() +} + +Range.prototype.format = function () { + this.range = this.set.map(function (comps) { + return comps.join(' ').trim() + }).join('||').trim() + return this.range +} + +Range.prototype.toString = function () { + return this.range +} + +Range.prototype.parseRange = function (range) { + var loose = this.options.loose + range = range.trim() + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE] + range = range.replace(hr, hyphenReplace) + debug('hyphen replace', range) + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace) + debug('comparator trim', range, re[COMPARATORTRIM]) + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace) + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace) + + // normalize spaces + range = range.split(/\s+/).join(' ') + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var set = range.split(' ').map(function (comp) { + return parseComparator(comp, this.options) + }, this).join(' ').split(/\s+/) + if (this.options.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function (comp) { + return !!comp.match(compRe) + }) + } + set = set.map(function (comp) { + return new Comparator(comp, this.options) + }, this) + + return set +} + +Range.prototype.intersects = function (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') + } + + return this.set.some(function (thisComparators) { + return thisComparators.every(function (thisComparator) { + return range.set.some(function (rangeComparators) { + return rangeComparators.every(function (rangeComparator) { + return thisComparator.intersects(rangeComparator, options) + }) + }) + }) + }) +} + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators +function toComparators (range, options) { + return new Range(range, options).set.map(function (comp) { + return comp.map(function (c) { + return c.value + }).join(' ').trim().split(' ') + }) +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator (comp, options) { + debug('comp', comp, options) + comp = replaceCarets(comp, options) + debug('caret', comp) + comp = replaceTildes(comp, options) + debug('tildes', comp) + comp = replaceXRanges(comp, options) + debug('xrange', comp) + comp = replaceStars(comp, options) + debug('stars', comp) + return comp +} + +function isX (id) { + return !id || id.toLowerCase() === 'x' || id === '*' +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceTilde(comp, options) + }).join(' ') +} + +function replaceTilde (comp, options) { + var r = options.loose ? re[TILDELOOSE] : re[TILDE] + return comp.replace(r, function (_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else if (pr) { + debug('replaceTilde pr', pr) + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } else { + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' + } + + debug('tilde return', ret) + return ret + }) +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceCaret(comp, options) + }).join(' ') +} + +function replaceCaret (comp, options) { + debug('caret', comp, options) + var r = options.loose ? re[CARETLOOSE] : re[CARET] + return comp.replace(r, function (_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + if (M === '0') { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else { + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' + } + } else if (pr) { + debug('replaceCaret pr', pr) + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + (+M + 1) + '.0.0' + } + } else { + debug('no pr') + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0' + } + } + + debug('caret return', ret) + return ret + }) +} + +function replaceXRanges (comp, options) { + debug('replaceXRanges', comp, options) + return comp.split(/\s+/).map(function (comp) { + return replaceXRange(comp, options) + }).join(' ') +} + +function replaceXRange (comp, options) { + comp = comp.trim() + var r = options.loose ? re[XRANGELOOSE] : re[XRANGE] + return comp.replace(r, function (ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr) + var xM = isX(M) + var xm = xM || isX(m) + var xp = xm || isX(p) + var anyX = xp + + if (gtlt === '=' && anyX) { + gtlt = '' + } + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0' + } else { + // nothing is forbidden + ret = '*' + } + } else if (gtlt && anyX) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0 + } + p = 0 + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>=' + if (xm) { + M = +M + 1 + m = 0 + p = 0 + } else { + m = +m + 1 + p = 0 + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<' + if (xm) { + M = +M + 1 + } else { + m = +m + 1 + } + } + + ret = gtlt + M + '.' + m + '.' + p + } else if (xm) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (xp) { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } + + debug('xRange return', ret) + + return ret + }) +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars (comp, options) { + debug('replaceStars', comp, options) + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], '') +} + +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace ($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + if (isX(fM)) { + from = '' + } else if (isX(fm)) { + from = '>=' + fM + '.0.0' + } else if (isX(fp)) { + from = '>=' + fM + '.' + fm + '.0' + } else { + from = '>=' + from + } + + if (isX(tM)) { + to = '' + } else if (isX(tm)) { + to = '<' + (+tM + 1) + '.0.0' + } else if (isX(tp)) { + to = '<' + tM + '.' + (+tm + 1) + '.0' + } else if (tpr) { + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr + } else { + to = '<=' + to + } + + return (from + ' ' + to).trim() +} + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function (version) { + if (!version) { + return false + } + + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } + + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true + } + } + return false +} + +function testSet (set, version, options) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false + } + } + + if (version.prerelease.length && !options.includePrerelease) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (i = 0; i < set.length; i++) { + debug(set[i].semver) + if (set[i].semver === ANY) { + continue + } + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) { + return true + } + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false + } + + return true +} + +exports.satisfies = satisfies +function satisfies (version, range, options) { + try { + range = new Range(range, options) + } catch (er) { + return false + } + return range.test(version) +} + +exports.maxSatisfying = maxSatisfying +function maxSatisfying (versions, range, options) { + var max = null + var maxSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v + maxSV = new SemVer(max, options) + } + } + }) + return max +} + +exports.minSatisfying = minSatisfying +function minSatisfying (versions, range, options) { + var min = null + var minSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v + minSV = new SemVer(min, options) + } + } + }) + return min +} + +exports.minVersion = minVersion +function minVersion (range, loose) { + range = new Range(range, loose) + + var minver = new SemVer('0.0.0') + if (range.test(minver)) { + return minver + } + + minver = new SemVer('0.0.0-0') + if (range.test(minver)) { + return minver + } + + minver = null + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] + + comparators.forEach(function (comparator) { + // Clone to avoid manipulating the comparator's semver object. + var compver = new SemVer(comparator.semver.version) + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++ + } else { + compver.prerelease.push(0) + } + compver.raw = compver.format() + /* fallthrough */ + case '': + case '>=': + if (!minver || gt(minver, compver)) { + minver = compver + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error('Unexpected operation: ' + comparator.operator) + } + }) + } + + if (minver && range.test(minver)) { + return minver + } + + return null +} + +exports.validRange = validRange +function validRange (range, options) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null + } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr +function ltr (version, range, options) { + return outside(version, range, '<', options) +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr +function gtr (version, range, options) { + return outside(version, range, '>', options) +} + +exports.outside = outside +function outside (version, range, hilo, options) { + version = new SemVer(version, options) + range = new Range(range, options) + + var gtfn, ltefn, ltfn, comp, ecomp + switch (hilo) { + case '>': + gtfn = gt + ltefn = lte + ltfn = lt + comp = '>' + ecomp = '>=' + break + case '<': + gtfn = lt + ltefn = gte + ltfn = gt + comp = '<' + ecomp = '<=' + break + default: + throw new TypeError('Must provide a hilo val of "<" or ">"') + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, options)) { + return false + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] + + var high = null + var low = null + + comparators.forEach(function (comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator + low = low || comparator + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator + } else if (ltfn(comparator.semver, low.semver, options)) { + low = comparator + } + }) + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false + } + } + return true +} + +exports.prerelease = prerelease +function prerelease (version, options) { + var parsed = parse(version, options) + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null +} + +exports.intersects = intersects +function intersects (r1, r2, options) { + r1 = new Range(r1, options) + r2 = new Range(r2, options) + return r1.intersects(r2) +} + +exports.coerce = coerce +function coerce (version) { + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + var match = version.match(re[COERCE]) + + if (match == null) { + return null + } + + return parse(match[1] + + '.' + (match[2] || '0') + + '.' + (match[3] || '0')) +} diff --git a/node_modules/send/HISTORY.md b/node_modules/send/HISTORY.md new file mode 100644 index 00000000..d14ac069 --- /dev/null +++ b/node_modules/send/HISTORY.md @@ -0,0 +1,496 @@ +0.17.1 / 2019-05-10 +=================== + + * Set stricter CSP header in redirect & error responses + * deps: range-parser@~1.2.1 + +0.17.0 / 2019-05-03 +=================== + + * deps: http-errors@~1.7.2 + - Set constructor name when possible + - Use `toidentifier` module to make class names + - deps: depd@~1.1.2 + - deps: setprototypeof@1.1.1 + - deps: statuses@'>= 1.5.0 < 2' + * deps: mime@1.6.0 + - Add extensions for JPEG-2000 images + - Add new `font/*` types from IANA + - Add WASM mapping + - Update `.bdoc` to `application/bdoc` + - Update `.bmp` to `image/bmp` + - Update `.m4a` to `audio/mp4` + - Update `.rtf` to `application/rtf` + - Update `.wav` to `audio/wav` + - Update `.xml` to `application/xml` + - Update generic extensions to `application/octet-stream`: + `.deb`, `.dll`, `.dmg`, `.exe`, `.iso`, `.msi` + - Use mime-score module to resolve extension conflicts + * deps: ms@2.1.1 + - Add `week`/`w` support + - Fix negative number handling + * deps: statuses@~1.5.0 + * perf: remove redundant `path.normalize` call + +0.16.2 / 2018-02-07 +=================== + + * Fix incorrect end tag in default error & redirects + * deps: depd@~1.1.2 + - perf: remove argument reassignment + * deps: encodeurl@~1.0.2 + - Fix encoding `%` as last character + * deps: statuses@~1.4.0 + +0.16.1 / 2017-09-29 +=================== + + * Fix regression in edge-case behavior for empty `path` + +0.16.0 / 2017-09-27 +=================== + + * Add `immutable` option + * Fix missing `` in default error & redirects + * Use instance methods on steam to check for listeners + * deps: mime@1.4.1 + - Add 70 new types for file extensions + - Set charset as "UTF-8" for .js and .json + * perf: improve path validation speed + +0.15.6 / 2017-09-22 +=================== + + * deps: debug@2.6.9 + * perf: improve `If-Match` token parsing + +0.15.5 / 2017-09-20 +=================== + + * deps: etag@~1.8.1 + - perf: replace regular expression with substring + * deps: fresh@0.5.2 + - Fix handling of modified headers with invalid dates + - perf: improve ETag match loop + - perf: improve `If-None-Match` token parsing + +0.15.4 / 2017-08-05 +=================== + + * deps: debug@2.6.8 + * deps: depd@~1.1.1 + - Remove unnecessary `Buffer` loading + * deps: http-errors@~1.6.2 + - deps: depd@1.1.1 + +0.15.3 / 2017-05-16 +=================== + + * deps: debug@2.6.7 + - deps: ms@2.0.0 + * deps: ms@2.0.0 + +0.15.2 / 2017-04-26 +=================== + + * deps: debug@2.6.4 + - Fix `DEBUG_MAX_ARRAY_LENGTH` + - deps: ms@0.7.3 + * deps: ms@1.0.0 + +0.15.1 / 2017-03-04 +=================== + + * Fix issue when `Date.parse` does not return `NaN` on invalid date + * Fix strict violation in broken environments + +0.15.0 / 2017-02-25 +=================== + + * Support `If-Match` and `If-Unmodified-Since` headers + * Add `res` and `path` arguments to `directory` event + * Remove usage of `res._headers` private field + - Improves compatibility with Node.js 8 nightly + * Send complete HTML document in redirect & error responses + * Set default CSP header in redirect & error responses + * Use `res.getHeaderNames()` when available + * Use `res.headersSent` when available + * deps: debug@2.6.1 + - Allow colors in workers + - Deprecated `DEBUG_FD` environment variable set to `3` or higher + - Fix error when running under React Native + - Use same color for same namespace + - deps: ms@0.7.2 + * deps: etag@~1.8.0 + * deps: fresh@0.5.0 + - Fix false detection of `no-cache` request directive + - Fix incorrect result when `If-None-Match` has both `*` and ETags + - Fix weak `ETag` matching to match spec + - perf: delay reading header values until needed + - perf: enable strict mode + - perf: hoist regular expressions + - perf: remove duplicate conditional + - perf: remove unnecessary boolean coercions + - perf: skip checking modified time if ETag check failed + - perf: skip parsing `If-None-Match` when no `ETag` header + - perf: use `Date.parse` instead of `new Date` + * deps: http-errors@~1.6.1 + - Make `message` property enumerable for `HttpError`s + - deps: setprototypeof@1.0.3 + +0.14.2 / 2017-01-23 +=================== + + * deps: http-errors@~1.5.1 + - deps: inherits@2.0.3 + - deps: setprototypeof@1.0.2 + - deps: statuses@'>= 1.3.1 < 2' + * deps: ms@0.7.2 + * deps: statuses@~1.3.1 + +0.14.1 / 2016-06-09 +=================== + + * Fix redirect error when `path` contains raw non-URL characters + * Fix redirect when `path` starts with multiple forward slashes + +0.14.0 / 2016-06-06 +=================== + + * Add `acceptRanges` option + * Add `cacheControl` option + * Attempt to combine multiple ranges into single range + * Correctly inherit from `Stream` class + * Fix `Content-Range` header in 416 responses when using `start`/`end` options + * Fix `Content-Range` header missing from default 416 responses + * Ignore non-byte `Range` headers + * deps: http-errors@~1.5.0 + - Add `HttpError` export, for `err instanceof createError.HttpError` + - Support new code `421 Misdirected Request` + - Use `setprototypeof` module to replace `__proto__` setting + - deps: inherits@2.0.1 + - deps: statuses@'>= 1.3.0 < 2' + - perf: enable strict mode + * deps: range-parser@~1.2.0 + - Fix incorrectly returning -1 when there is at least one valid range + - perf: remove internal function + * deps: statuses@~1.3.0 + - Add `421 Misdirected Request` + - perf: enable strict mode + * perf: remove argument reassignment + +0.13.2 / 2016-03-05 +=================== + + * Fix invalid `Content-Type` header when `send.mime.default_type` unset + +0.13.1 / 2016-01-16 +=================== + + * deps: depd@~1.1.0 + - Support web browser loading + - perf: enable strict mode + * deps: destroy@~1.0.4 + - perf: enable strict mode + * deps: escape-html@~1.0.3 + - perf: enable strict mode + - perf: optimize string replacement + - perf: use faster string coercion + * deps: range-parser@~1.0.3 + - perf: enable strict mode + +0.13.0 / 2015-06-16 +=================== + + * Allow Node.js HTTP server to set `Date` response header + * Fix incorrectly removing `Content-Location` on 304 response + * Improve the default redirect response headers + * Send appropriate headers on default error response + * Use `http-errors` for standard emitted errors + * Use `statuses` instead of `http` module for status messages + * deps: escape-html@1.0.2 + * deps: etag@~1.7.0 + - Improve stat performance by removing hashing + * deps: fresh@0.3.0 + - Add weak `ETag` matching support + * deps: on-finished@~2.3.0 + - Add defined behavior for HTTP `CONNECT` requests + - Add defined behavior for HTTP `Upgrade` requests + - deps: ee-first@1.1.1 + * perf: enable strict mode + * perf: remove unnecessary array allocations + +0.12.3 / 2015-05-13 +=================== + + * deps: debug@~2.2.0 + - deps: ms@0.7.1 + * deps: depd@~1.0.1 + * deps: etag@~1.6.0 + - Improve support for JXcore + - Support "fake" stats objects in environments without `fs` + * deps: ms@0.7.1 + - Prevent extraordinarily long inputs + * deps: on-finished@~2.2.1 + +0.12.2 / 2015-03-13 +=================== + + * Throw errors early for invalid `extensions` or `index` options + * deps: debug@~2.1.3 + - Fix high intensity foreground color for bold + - deps: ms@0.7.0 + +0.12.1 / 2015-02-17 +=================== + + * Fix regression sending zero-length files + +0.12.0 / 2015-02-16 +=================== + + * Always read the stat size from the file + * Fix mutating passed-in `options` + * deps: mime@1.3.4 + +0.11.1 / 2015-01-20 +=================== + + * Fix `root` path disclosure + +0.11.0 / 2015-01-05 +=================== + + * deps: debug@~2.1.1 + * deps: etag@~1.5.1 + - deps: crc@3.2.1 + * deps: ms@0.7.0 + - Add `milliseconds` + - Add `msecs` + - Add `secs` + - Add `mins` + - Add `hrs` + - Add `yrs` + * deps: on-finished@~2.2.0 + +0.10.1 / 2014-10-22 +=================== + + * deps: on-finished@~2.1.1 + - Fix handling of pipelined requests + +0.10.0 / 2014-10-15 +=================== + + * deps: debug@~2.1.0 + - Implement `DEBUG_FD` env variable support + * deps: depd@~1.0.0 + * deps: etag@~1.5.0 + - Improve string performance + - Slightly improve speed for weak ETags over 1KB + +0.9.3 / 2014-09-24 +================== + + * deps: etag@~1.4.0 + - Support "fake" stats objects + +0.9.2 / 2014-09-15 +================== + + * deps: depd@0.4.5 + * deps: etag@~1.3.1 + * deps: range-parser@~1.0.2 + +0.9.1 / 2014-09-07 +================== + + * deps: fresh@0.2.4 + +0.9.0 / 2014-09-07 +================== + + * Add `lastModified` option + * Use `etag` to generate `ETag` header + * deps: debug@~2.0.0 + +0.8.5 / 2014-09-04 +================== + + * Fix malicious path detection for empty string path + +0.8.4 / 2014-09-04 +================== + + * Fix a path traversal issue when using `root` + +0.8.3 / 2014-08-16 +================== + + * deps: destroy@1.0.3 + - renamed from dethroy + * deps: on-finished@2.1.0 + +0.8.2 / 2014-08-14 +================== + + * Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` + * deps: dethroy@1.0.2 + +0.8.1 / 2014-08-05 +================== + + * Fix `extensions` behavior when file already has extension + +0.8.0 / 2014-08-05 +================== + + * Add `extensions` option + +0.7.4 / 2014-08-04 +================== + + * Fix serving index files without root dir + +0.7.3 / 2014-07-29 +================== + + * Fix incorrect 403 on Windows and Node.js 0.11 + +0.7.2 / 2014-07-27 +================== + + * deps: depd@0.4.4 + - Work-around v8 generating empty stack traces + +0.7.1 / 2014-07-26 +================== + + * deps: depd@0.4.3 + - Fix exception when global `Error.stackTraceLimit` is too low + +0.7.0 / 2014-07-20 +================== + + * Deprecate `hidden` option; use `dotfiles` option + * Add `dotfiles` option + * deps: debug@1.0.4 + * deps: depd@0.4.2 + - Add `TRACE_DEPRECATION` environment variable + - Remove non-standard grey color from color output + - Support `--no-deprecation` argument + - Support `--trace-deprecation` argument + +0.6.0 / 2014-07-11 +================== + + * Deprecate `from` option; use `root` option + * Deprecate `send.etag()` -- use `etag` in `options` + * Deprecate `send.hidden()` -- use `hidden` in `options` + * Deprecate `send.index()` -- use `index` in `options` + * Deprecate `send.maxage()` -- use `maxAge` in `options` + * Deprecate `send.root()` -- use `root` in `options` + * Cap `maxAge` value to 1 year + * deps: debug@1.0.3 + - Add support for multiple wildcards in namespaces + +0.5.0 / 2014-06-28 +================== + + * Accept string for `maxAge` (converted by `ms`) + * Add `headers` event + * Include link in default redirect response + * Use `EventEmitter.listenerCount` to count listeners + +0.4.3 / 2014-06-11 +================== + + * Do not throw un-catchable error on file open race condition + * Use `escape-html` for HTML escaping + * deps: debug@1.0.2 + - fix some debugging output colors on node.js 0.8 + * deps: finished@1.2.2 + * deps: fresh@0.2.2 + +0.4.2 / 2014-06-09 +================== + + * fix "event emitter leak" warnings + * deps: debug@1.0.1 + * deps: finished@1.2.1 + +0.4.1 / 2014-06-02 +================== + + * Send `max-age` in `Cache-Control` in correct format + +0.4.0 / 2014-05-27 +================== + + * Calculate ETag with md5 for reduced collisions + * Fix wrong behavior when index file matches directory + * Ignore stream errors after request ends + - Goodbye `EBADF, read` + * Skip directories in index file search + * deps: debug@0.8.1 + +0.3.0 / 2014-04-24 +================== + + * Fix sending files with dots without root set + * Coerce option types + * Accept API options in options object + * Set etags to "weak" + * Include file path in etag + * Make "Can't set headers after they are sent." catchable + * Send full entity-body for multi range requests + * Default directory access to 403 when index disabled + * Support multiple index paths + * Support "If-Range" header + * Control whether to generate etags + * deps: mime@1.2.11 + +0.2.0 / 2014-01-29 +================== + + * update range-parser and fresh + +0.1.4 / 2013-08-11 +================== + + * update fresh + +0.1.3 / 2013-07-08 +================== + + * Revert "Fix fd leak" + +0.1.2 / 2013-07-03 +================== + + * Fix fd leak + +0.1.0 / 2012-08-25 +================== + + * add options parameter to send() that is passed to fs.createReadStream() [kanongil] + +0.0.4 / 2012-08-16 +================== + + * allow custom "Accept-Ranges" definition + +0.0.3 / 2012-07-16 +================== + + * fix normalization of the root directory. Closes #3 + +0.0.2 / 2012-07-09 +================== + + * add passing of req explicitly for now (YUCK) + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/send/LICENSE b/node_modules/send/LICENSE new file mode 100644 index 00000000..4aa69e83 --- /dev/null +++ b/node_modules/send/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2014-2016 Douglas Christopher Wilson + +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/node_modules/send/README.md b/node_modules/send/README.md new file mode 100644 index 00000000..179e8c32 --- /dev/null +++ b/node_modules/send/README.md @@ -0,0 +1,329 @@ +# send + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Linux Build][travis-image]][travis-url] +[![Windows Build][appveyor-image]][appveyor-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Send is a library for streaming files from the file system as a http response +supporting partial responses (Ranges), conditional-GET negotiation (If-Match, +If-Unmodified-Since, If-None-Match, If-Modified-Since), high test coverage, +and granular events which may be leveraged to take appropriate actions in your +application or framework. + +Looking to serve up entire folders mapped to URLs? Try [serve-static](https://www.npmjs.org/package/serve-static). + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```bash +$ npm install send +``` + +## API + + + +```js +var send = require('send') +``` + +### send(req, path, [options]) + +Create a new `SendStream` for the given path to send to a `res`. The `req` is +the Node.js HTTP request and the `path` is a urlencoded path to send (urlencoded, +not the actual file-system path). + +#### Options + +##### acceptRanges + +Enable or disable accepting ranged requests, defaults to true. +Disabling this will not send `Accept-Ranges` and ignore the contents +of the `Range` request header. + +##### cacheControl + +Enable or disable setting `Cache-Control` response header, defaults to +true. Disabling this will ignore the `immutable` and `maxAge` options. + +##### dotfiles + +Set how "dotfiles" are treated when encountered. A dotfile is a file +or directory that begins with a dot ("."). Note this check is done on +the path itself without checking if the path actually exists on the +disk. If `root` is specified, only the dotfiles above the root are +checked (i.e. the root itself can be within a dotfile when when set +to "deny"). + + - `'allow'` No special treatment for dotfiles. + - `'deny'` Send a 403 for any request for a dotfile. + - `'ignore'` Pretend like the dotfile does not exist and 404. + +The default value is _similar_ to `'ignore'`, with the exception that +this default will not ignore the files within a directory that begins +with a dot, for backward-compatibility. + +##### end + +Byte offset at which the stream ends, defaults to the length of the file +minus 1. The end is inclusive in the stream, meaning `end: 3` will include +the 4th byte in the stream. + +##### etag + +Enable or disable etag generation, defaults to true. + +##### extensions + +If a given file doesn't exist, try appending one of the given extensions, +in the given order. By default, this is disabled (set to `false`). An +example value that will serve extension-less HTML files: `['html', 'htm']`. +This is skipped if the requested file already has an extension. + +##### immutable + +Enable or diable the `immutable` directive in the `Cache-Control` response +header, defaults to `false`. If set to `true`, the `maxAge` option should +also be specified to enable caching. The `immutable` directive will prevent +supported clients from making conditional requests during the life of the +`maxAge` option to check if the file has changed. + +##### index + +By default send supports "index.html" files, to disable this +set `false` or to supply a new index pass a string or an array +in preferred order. + +##### lastModified + +Enable or disable `Last-Modified` header, defaults to true. Uses the file +system's last modified value. + +##### maxAge + +Provide a max-age in milliseconds for http caching, defaults to 0. +This can also be a string accepted by the +[ms](https://www.npmjs.org/package/ms#readme) module. + +##### root + +Serve files relative to `path`. + +##### start + +Byte offset at which the stream starts, defaults to 0. The start is inclusive, +meaning `start: 2` will include the 3rd byte in the stream. + +#### Events + +The `SendStream` is an event emitter and will emit the following events: + + - `error` an error occurred `(err)` + - `directory` a directory was requested `(res, path)` + - `file` a file was requested `(path, stat)` + - `headers` the headers are about to be set on a file `(res, path, stat)` + - `stream` file streaming has started `(stream)` + - `end` streaming has completed + +#### .pipe + +The `pipe` method is used to pipe the response into the Node.js HTTP response +object, typically `send(req, path, options).pipe(res)`. + +### .mime + +The `mime` export is the global instance of of the +[`mime` npm module](https://www.npmjs.com/package/mime). + +This is used to configure the MIME types that are associated with file extensions +as well as other options for how to resolve the MIME type of a file (like the +default type to use for an unknown file extension). + +## Error-handling + +By default when no `error` listeners are present an automatic response will be +made, otherwise you have full control over the response, aka you may show a 5xx +page etc. + +## Caching + +It does _not_ perform internal caching, you should use a reverse proxy cache +such as Varnish for this, or those fancy things called CDNs. If your +application is small enough that it would benefit from single-node memory +caching, it's small enough that it does not need caching at all ;). + +## Debugging + +To enable `debug()` instrumentation output export __DEBUG__: + +``` +$ DEBUG=send node app +``` + +## Running tests + +``` +$ npm install +$ npm test +``` + +## Examples + +### Serve a specific file + +This simple example will send a specific file to all requests. + +```js +var http = require('http') +var send = require('send') + +var server = http.createServer(function onRequest (req, res) { + send(req, '/path/to/index.html') + .pipe(res) +}) + +server.listen(3000) +``` + +### Serve all files from a directory + +This simple example will just serve up all the files in a +given directory as the top-level. For example, a request +`GET /foo.txt` will send back `/www/public/foo.txt`. + +```js +var http = require('http') +var parseUrl = require('parseurl') +var send = require('send') + +var server = http.createServer(function onRequest (req, res) { + send(req, parseUrl(req).pathname, { root: '/www/public' }) + .pipe(res) +}) + +server.listen(3000) +``` + +### Custom file types + +```js +var http = require('http') +var parseUrl = require('parseurl') +var send = require('send') + +// Default unknown types to text/plain +send.mime.default_type = 'text/plain' + +// Add a custom type +send.mime.define({ + 'application/x-my-type': ['x-mt', 'x-mtt'] +}) + +var server = http.createServer(function onRequest (req, res) { + send(req, parseUrl(req).pathname, { root: '/www/public' }) + .pipe(res) +}) + +server.listen(3000) +``` + +### Custom directory index view + +This is a example of serving up a structure of directories with a +custom function to render a listing of a directory. + +```js +var http = require('http') +var fs = require('fs') +var parseUrl = require('parseurl') +var send = require('send') + +// Transfer arbitrary files from within /www/example.com/public/* +// with a custom handler for directory listing +var server = http.createServer(function onRequest (req, res) { + send(req, parseUrl(req).pathname, { index: false, root: '/www/public' }) + .once('directory', directory) + .pipe(res) +}) + +server.listen(3000) + +// Custom directory handler +function directory (res, path) { + var stream = this + + // redirect to trailing slash for consistent url + if (!stream.hasTrailingSlash()) { + return stream.redirect(path) + } + + // get directory list + fs.readdir(path, function onReaddir (err, list) { + if (err) return stream.error(err) + + // render an index for the directory + res.setHeader('Content-Type', 'text/plain; charset=UTF-8') + res.end(list.join('\n') + '\n') + }) +} +``` + +### Serving from a root directory with custom error-handling + +```js +var http = require('http') +var parseUrl = require('parseurl') +var send = require('send') + +var server = http.createServer(function onRequest (req, res) { + // your custom error-handling logic: + function error (err) { + res.statusCode = err.status || 500 + res.end(err.message) + } + + // your custom headers + function headers (res, path, stat) { + // serve all files for download + res.setHeader('Content-Disposition', 'attachment') + } + + // your custom directory handling logic: + function redirect () { + res.statusCode = 301 + res.setHeader('Location', req.url + '/') + res.end('Redirecting to ' + req.url + '/') + } + + // transfer arbitrary files from within + // /www/example.com/public/* + send(req, parseUrl(req).pathname, { root: '/www/public' }) + .on('error', error) + .on('directory', redirect) + .on('headers', headers) + .pipe(res) +}) + +server.listen(3000) +``` + +## License + +[MIT](LICENSE) + +[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/send/master?label=windows +[appveyor-url]: https://ci.appveyor.com/project/dougwilson/send +[coveralls-image]: https://badgen.net/coveralls/c/github/pillarjs/send/master +[coveralls-url]: https://coveralls.io/r/pillarjs/send?branch=master +[node-image]: https://badgen.net/npm/node/send +[node-url]: https://nodejs.org/en/download/ +[npm-downloads-image]: https://badgen.net/npm/dm/send +[npm-url]: https://npmjs.org/package/send +[npm-version-image]: https://badgen.net/npm/v/send +[travis-image]: https://badgen.net/travis/pillarjs/send/master?label=linux +[travis-url]: https://travis-ci.org/pillarjs/send diff --git a/node_modules/send/index.js b/node_modules/send/index.js new file mode 100644 index 00000000..fca21121 --- /dev/null +++ b/node_modules/send/index.js @@ -0,0 +1,1129 @@ +/*! + * send + * Copyright(c) 2012 TJ Holowaychuk + * Copyright(c) 2014-2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var createError = require('http-errors') +var debug = require('debug')('send') +var deprecate = require('depd')('send') +var destroy = require('destroy') +var encodeUrl = require('encodeurl') +var escapeHtml = require('escape-html') +var etag = require('etag') +var fresh = require('fresh') +var fs = require('fs') +var mime = require('mime') +var ms = require('ms') +var onFinished = require('on-finished') +var parseRange = require('range-parser') +var path = require('path') +var statuses = require('statuses') +var Stream = require('stream') +var util = require('util') + +/** + * Path function references. + * @private + */ + +var extname = path.extname +var join = path.join +var normalize = path.normalize +var resolve = path.resolve +var sep = path.sep + +/** + * Regular expression for identifying a bytes Range header. + * @private + */ + +var BYTES_RANGE_REGEXP = /^ *bytes=/ + +/** + * Maximum value allowed for the max age. + * @private + */ + +var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1000 // 1 year + +/** + * Regular expression to match a path with a directory up component. + * @private + */ + +var UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/ + +/** + * Module exports. + * @public + */ + +module.exports = send +module.exports.mime = mime + +/** + * Return a `SendStream` for `req` and `path`. + * + * @param {object} req + * @param {string} path + * @param {object} [options] + * @return {SendStream} + * @public + */ + +function send (req, path, options) { + return new SendStream(req, path, options) +} + +/** + * Initialize a `SendStream` with the given `path`. + * + * @param {Request} req + * @param {String} path + * @param {object} [options] + * @private + */ + +function SendStream (req, path, options) { + Stream.call(this) + + var opts = options || {} + + this.options = opts + this.path = path + this.req = req + + this._acceptRanges = opts.acceptRanges !== undefined + ? Boolean(opts.acceptRanges) + : true + + this._cacheControl = opts.cacheControl !== undefined + ? Boolean(opts.cacheControl) + : true + + this._etag = opts.etag !== undefined + ? Boolean(opts.etag) + : true + + this._dotfiles = opts.dotfiles !== undefined + ? opts.dotfiles + : 'ignore' + + if (this._dotfiles !== 'ignore' && this._dotfiles !== 'allow' && this._dotfiles !== 'deny') { + throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') + } + + this._hidden = Boolean(opts.hidden) + + if (opts.hidden !== undefined) { + deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') + } + + // legacy support + if (opts.dotfiles === undefined) { + this._dotfiles = undefined + } + + this._extensions = opts.extensions !== undefined + ? normalizeList(opts.extensions, 'extensions option') + : [] + + this._immutable = opts.immutable !== undefined + ? Boolean(opts.immutable) + : false + + this._index = opts.index !== undefined + ? normalizeList(opts.index, 'index option') + : ['index.html'] + + this._lastModified = opts.lastModified !== undefined + ? Boolean(opts.lastModified) + : true + + this._maxage = opts.maxAge || opts.maxage + this._maxage = typeof this._maxage === 'string' + ? ms(this._maxage) + : Number(this._maxage) + this._maxage = !isNaN(this._maxage) + ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) + : 0 + + this._root = opts.root + ? resolve(opts.root) + : null + + if (!this._root && opts.from) { + this.from(opts.from) + } +} + +/** + * Inherits from `Stream`. + */ + +util.inherits(SendStream, Stream) + +/** + * Enable or disable etag generation. + * + * @param {Boolean} val + * @return {SendStream} + * @api public + */ + +SendStream.prototype.etag = deprecate.function(function etag (val) { + this._etag = Boolean(val) + debug('etag %s', this._etag) + return this +}, 'send.etag: pass etag as option') + +/** + * Enable or disable "hidden" (dot) files. + * + * @param {Boolean} path + * @return {SendStream} + * @api public + */ + +SendStream.prototype.hidden = deprecate.function(function hidden (val) { + this._hidden = Boolean(val) + this._dotfiles = undefined + debug('hidden %s', this._hidden) + return this +}, 'send.hidden: use dotfiles option') + +/** + * Set index `paths`, set to a falsy + * value to disable index support. + * + * @param {String|Boolean|Array} paths + * @return {SendStream} + * @api public + */ + +SendStream.prototype.index = deprecate.function(function index (paths) { + var index = !paths ? [] : normalizeList(paths, 'paths argument') + debug('index %o', paths) + this._index = index + return this +}, 'send.index: pass index as option') + +/** + * Set root `path`. + * + * @param {String} path + * @return {SendStream} + * @api public + */ + +SendStream.prototype.root = function root (path) { + this._root = resolve(String(path)) + debug('root %s', this._root) + return this +} + +SendStream.prototype.from = deprecate.function(SendStream.prototype.root, + 'send.from: pass root as option') + +SendStream.prototype.root = deprecate.function(SendStream.prototype.root, + 'send.root: pass root as option') + +/** + * Set max-age to `maxAge`. + * + * @param {Number} maxAge + * @return {SendStream} + * @api public + */ + +SendStream.prototype.maxage = deprecate.function(function maxage (maxAge) { + this._maxage = typeof maxAge === 'string' + ? ms(maxAge) + : Number(maxAge) + this._maxage = !isNaN(this._maxage) + ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) + : 0 + debug('max-age %d', this._maxage) + return this +}, 'send.maxage: pass maxAge as option') + +/** + * Emit error with `status`. + * + * @param {number} status + * @param {Error} [err] + * @private + */ + +SendStream.prototype.error = function error (status, err) { + // emit if listeners instead of responding + if (hasListeners(this, 'error')) { + return this.emit('error', createError(status, err, { + expose: false + })) + } + + var res = this.res + var msg = statuses[status] || String(status) + var doc = createHtmlDocument('Error', escapeHtml(msg)) + + // clear existing headers + clearHeaders(res) + + // add error headers + if (err && err.headers) { + setHeaders(res, err.headers) + } + + // send basic response + res.statusCode = status + res.setHeader('Content-Type', 'text/html; charset=UTF-8') + res.setHeader('Content-Length', Buffer.byteLength(doc)) + res.setHeader('Content-Security-Policy', "default-src 'none'") + res.setHeader('X-Content-Type-Options', 'nosniff') + res.end(doc) +} + +/** + * Check if the pathname ends with "/". + * + * @return {boolean} + * @private + */ + +SendStream.prototype.hasTrailingSlash = function hasTrailingSlash () { + return this.path[this.path.length - 1] === '/' +} + +/** + * Check if this is a conditional GET request. + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isConditionalGET = function isConditionalGET () { + return this.req.headers['if-match'] || + this.req.headers['if-unmodified-since'] || + this.req.headers['if-none-match'] || + this.req.headers['if-modified-since'] +} + +/** + * Check if the request preconditions failed. + * + * @return {boolean} + * @private + */ + +SendStream.prototype.isPreconditionFailure = function isPreconditionFailure () { + var req = this.req + var res = this.res + + // if-match + var match = req.headers['if-match'] + if (match) { + var etag = res.getHeader('ETag') + return !etag || (match !== '*' && parseTokenList(match).every(function (match) { + return match !== etag && match !== 'W/' + etag && 'W/' + match !== etag + })) + } + + // if-unmodified-since + var unmodifiedSince = parseHttpDate(req.headers['if-unmodified-since']) + if (!isNaN(unmodifiedSince)) { + var lastModified = parseHttpDate(res.getHeader('Last-Modified')) + return isNaN(lastModified) || lastModified > unmodifiedSince + } + + return false +} + +/** + * Strip content-* header fields. + * + * @private + */ + +SendStream.prototype.removeContentHeaderFields = function removeContentHeaderFields () { + var res = this.res + var headers = getHeaderNames(res) + + for (var i = 0; i < headers.length; i++) { + var header = headers[i] + if (header.substr(0, 8) === 'content-' && header !== 'content-location') { + res.removeHeader(header) + } + } +} + +/** + * Respond with 304 not modified. + * + * @api private + */ + +SendStream.prototype.notModified = function notModified () { + var res = this.res + debug('not modified') + this.removeContentHeaderFields() + res.statusCode = 304 + res.end() +} + +/** + * Raise error that headers already sent. + * + * @api private + */ + +SendStream.prototype.headersAlreadySent = function headersAlreadySent () { + var err = new Error('Can\'t set headers after they are sent.') + debug('headers already sent') + this.error(500, err) +} + +/** + * Check if the request is cacheable, aka + * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isCachable = function isCachable () { + var statusCode = this.res.statusCode + return (statusCode >= 200 && statusCode < 300) || + statusCode === 304 +} + +/** + * Handle stat() error. + * + * @param {Error} error + * @private + */ + +SendStream.prototype.onStatError = function onStatError (error) { + switch (error.code) { + case 'ENAMETOOLONG': + case 'ENOENT': + case 'ENOTDIR': + this.error(404, error) + break + default: + this.error(500, error) + break + } +} + +/** + * Check if the cache is fresh. + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isFresh = function isFresh () { + return fresh(this.req.headers, { + 'etag': this.res.getHeader('ETag'), + 'last-modified': this.res.getHeader('Last-Modified') + }) +} + +/** + * Check if the range is fresh. + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isRangeFresh = function isRangeFresh () { + var ifRange = this.req.headers['if-range'] + + if (!ifRange) { + return true + } + + // if-range as etag + if (ifRange.indexOf('"') !== -1) { + var etag = this.res.getHeader('ETag') + return Boolean(etag && ifRange.indexOf(etag) !== -1) + } + + // if-range as modified date + var lastModified = this.res.getHeader('Last-Modified') + return parseHttpDate(lastModified) <= parseHttpDate(ifRange) +} + +/** + * Redirect to path. + * + * @param {string} path + * @private + */ + +SendStream.prototype.redirect = function redirect (path) { + var res = this.res + + if (hasListeners(this, 'directory')) { + this.emit('directory', res, path) + return + } + + if (this.hasTrailingSlash()) { + this.error(403) + return + } + + var loc = encodeUrl(collapseLeadingSlashes(this.path + '/')) + var doc = createHtmlDocument('Redirecting', 'Redirecting to ' + + escapeHtml(loc) + '') + + // redirect + res.statusCode = 301 + res.setHeader('Content-Type', 'text/html; charset=UTF-8') + res.setHeader('Content-Length', Buffer.byteLength(doc)) + res.setHeader('Content-Security-Policy', "default-src 'none'") + res.setHeader('X-Content-Type-Options', 'nosniff') + res.setHeader('Location', loc) + res.end(doc) +} + +/** + * Pipe to `res. + * + * @param {Stream} res + * @return {Stream} res + * @api public + */ + +SendStream.prototype.pipe = function pipe (res) { + // root path + var root = this._root + + // references + this.res = res + + // decode the path + var path = decode(this.path) + if (path === -1) { + this.error(400) + return res + } + + // null byte(s) + if (~path.indexOf('\0')) { + this.error(400) + return res + } + + var parts + if (root !== null) { + // normalize + if (path) { + path = normalize('.' + sep + path) + } + + // malicious path + if (UP_PATH_REGEXP.test(path)) { + debug('malicious path "%s"', path) + this.error(403) + return res + } + + // explode path parts + parts = path.split(sep) + + // join / normalize from optional root dir + path = normalize(join(root, path)) + } else { + // ".." is malicious without "root" + if (UP_PATH_REGEXP.test(path)) { + debug('malicious path "%s"', path) + this.error(403) + return res + } + + // explode path parts + parts = normalize(path).split(sep) + + // resolve the path + path = resolve(path) + } + + // dotfile handling + if (containsDotFile(parts)) { + var access = this._dotfiles + + // legacy support + if (access === undefined) { + access = parts[parts.length - 1][0] === '.' + ? (this._hidden ? 'allow' : 'ignore') + : 'allow' + } + + debug('%s dotfile "%s"', access, path) + switch (access) { + case 'allow': + break + case 'deny': + this.error(403) + return res + case 'ignore': + default: + this.error(404) + return res + } + } + + // index file support + if (this._index.length && this.hasTrailingSlash()) { + this.sendIndex(path) + return res + } + + this.sendFile(path) + return res +} + +/** + * Transfer `path`. + * + * @param {String} path + * @api public + */ + +SendStream.prototype.send = function send (path, stat) { + var len = stat.size + var options = this.options + var opts = {} + var res = this.res + var req = this.req + var ranges = req.headers.range + var offset = options.start || 0 + + if (headersSent(res)) { + // impossible to send now + this.headersAlreadySent() + return + } + + debug('pipe "%s"', path) + + // set header fields + this.setHeader(path, stat) + + // set content-type + this.type(path) + + // conditional GET support + if (this.isConditionalGET()) { + if (this.isPreconditionFailure()) { + this.error(412) + return + } + + if (this.isCachable() && this.isFresh()) { + this.notModified() + return + } + } + + // adjust len to start/end options + len = Math.max(0, len - offset) + if (options.end !== undefined) { + var bytes = options.end - offset + 1 + if (len > bytes) len = bytes + } + + // Range support + if (this._acceptRanges && BYTES_RANGE_REGEXP.test(ranges)) { + // parse + ranges = parseRange(len, ranges, { + combine: true + }) + + // If-Range support + if (!this.isRangeFresh()) { + debug('range stale') + ranges = -2 + } + + // unsatisfiable + if (ranges === -1) { + debug('range unsatisfiable') + + // Content-Range + res.setHeader('Content-Range', contentRange('bytes', len)) + + // 416 Requested Range Not Satisfiable + return this.error(416, { + headers: { 'Content-Range': res.getHeader('Content-Range') } + }) + } + + // valid (syntactically invalid/multiple ranges are treated as a regular response) + if (ranges !== -2 && ranges.length === 1) { + debug('range %j', ranges) + + // Content-Range + res.statusCode = 206 + res.setHeader('Content-Range', contentRange('bytes', len, ranges[0])) + + // adjust for requested range + offset += ranges[0].start + len = ranges[0].end - ranges[0].start + 1 + } + } + + // clone options + for (var prop in options) { + opts[prop] = options[prop] + } + + // set read options + opts.start = offset + opts.end = Math.max(offset, offset + len - 1) + + // content-length + res.setHeader('Content-Length', len) + + // HEAD support + if (req.method === 'HEAD') { + res.end() + return + } + + this.stream(path, opts) +} + +/** + * Transfer file for `path`. + * + * @param {String} path + * @api private + */ +SendStream.prototype.sendFile = function sendFile (path) { + var i = 0 + var self = this + + debug('stat "%s"', path) + fs.stat(path, function onstat (err, stat) { + if (err && err.code === 'ENOENT' && !extname(path) && path[path.length - 1] !== sep) { + // not found, check extensions + return next(err) + } + if (err) return self.onStatError(err) + if (stat.isDirectory()) return self.redirect(path) + self.emit('file', path, stat) + self.send(path, stat) + }) + + function next (err) { + if (self._extensions.length <= i) { + return err + ? self.onStatError(err) + : self.error(404) + } + + var p = path + '.' + self._extensions[i++] + + debug('stat "%s"', p) + fs.stat(p, function (err, stat) { + if (err) return next(err) + if (stat.isDirectory()) return next() + self.emit('file', p, stat) + self.send(p, stat) + }) + } +} + +/** + * Transfer index for `path`. + * + * @param {String} path + * @api private + */ +SendStream.prototype.sendIndex = function sendIndex (path) { + var i = -1 + var self = this + + function next (err) { + if (++i >= self._index.length) { + if (err) return self.onStatError(err) + return self.error(404) + } + + var p = join(path, self._index[i]) + + debug('stat "%s"', p) + fs.stat(p, function (err, stat) { + if (err) return next(err) + if (stat.isDirectory()) return next() + self.emit('file', p, stat) + self.send(p, stat) + }) + } + + next() +} + +/** + * Stream `path` to the response. + * + * @param {String} path + * @param {Object} options + * @api private + */ + +SendStream.prototype.stream = function stream (path, options) { + // TODO: this is all lame, refactor meeee + var finished = false + var self = this + var res = this.res + + // pipe + var stream = fs.createReadStream(path, options) + this.emit('stream', stream) + stream.pipe(res) + + // response finished, done with the fd + onFinished(res, function onfinished () { + finished = true + destroy(stream) + }) + + // error handling code-smell + stream.on('error', function onerror (err) { + // request already finished + if (finished) return + + // clean up stream + finished = true + destroy(stream) + + // error + self.onStatError(err) + }) + + // end + stream.on('end', function onend () { + self.emit('end') + }) +} + +/** + * Set content-type based on `path` + * if it hasn't been explicitly set. + * + * @param {String} path + * @api private + */ + +SendStream.prototype.type = function type (path) { + var res = this.res + + if (res.getHeader('Content-Type')) return + + var type = mime.lookup(path) + + if (!type) { + debug('no content-type') + return + } + + var charset = mime.charsets.lookup(type) + + debug('content-type %s', type) + res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')) +} + +/** + * Set response header fields, most + * fields may be pre-defined. + * + * @param {String} path + * @param {Object} stat + * @api private + */ + +SendStream.prototype.setHeader = function setHeader (path, stat) { + var res = this.res + + this.emit('headers', res, path, stat) + + if (this._acceptRanges && !res.getHeader('Accept-Ranges')) { + debug('accept ranges') + res.setHeader('Accept-Ranges', 'bytes') + } + + if (this._cacheControl && !res.getHeader('Cache-Control')) { + var cacheControl = 'public, max-age=' + Math.floor(this._maxage / 1000) + + if (this._immutable) { + cacheControl += ', immutable' + } + + debug('cache-control %s', cacheControl) + res.setHeader('Cache-Control', cacheControl) + } + + if (this._lastModified && !res.getHeader('Last-Modified')) { + var modified = stat.mtime.toUTCString() + debug('modified %s', modified) + res.setHeader('Last-Modified', modified) + } + + if (this._etag && !res.getHeader('ETag')) { + var val = etag(stat) + debug('etag %s', val) + res.setHeader('ETag', val) + } +} + +/** + * Clear all headers from a response. + * + * @param {object} res + * @private + */ + +function clearHeaders (res) { + var headers = getHeaderNames(res) + + for (var i = 0; i < headers.length; i++) { + res.removeHeader(headers[i]) + } +} + +/** + * Collapse all leading slashes into a single slash + * + * @param {string} str + * @private + */ +function collapseLeadingSlashes (str) { + for (var i = 0; i < str.length; i++) { + if (str[i] !== '/') { + break + } + } + + return i > 1 + ? '/' + str.substr(i) + : str +} + +/** + * Determine if path parts contain a dotfile. + * + * @api private + */ + +function containsDotFile (parts) { + for (var i = 0; i < parts.length; i++) { + var part = parts[i] + if (part.length > 1 && part[0] === '.') { + return true + } + } + + return false +} + +/** + * Create a Content-Range header. + * + * @param {string} type + * @param {number} size + * @param {array} [range] + */ + +function contentRange (type, size, range) { + return type + ' ' + (range ? range.start + '-' + range.end : '*') + '/' + size +} + +/** + * Create a minimal HTML document. + * + * @param {string} title + * @param {string} body + * @private + */ + +function createHtmlDocument (title, body) { + return '\n' + + '\n' + + '\n' + + '\n' + + '' + title + '\n' + + '\n' + + '\n' + + '
' + body + '
\n' + + '\n' + + '\n' +} + +/** + * decodeURIComponent. + * + * Allows V8 to only deoptimize this fn instead of all + * of send(). + * + * @param {String} path + * @api private + */ + +function decode (path) { + try { + return decodeURIComponent(path) + } catch (err) { + return -1 + } +} + +/** + * Get the header names on a respnse. + * + * @param {object} res + * @returns {array[string]} + * @private + */ + +function getHeaderNames (res) { + return typeof res.getHeaderNames !== 'function' + ? Object.keys(res._headers || {}) + : res.getHeaderNames() +} + +/** + * Determine if emitter has listeners of a given type. + * + * The way to do this check is done three different ways in Node.js >= 0.8 + * so this consolidates them into a minimal set using instance methods. + * + * @param {EventEmitter} emitter + * @param {string} type + * @returns {boolean} + * @private + */ + +function hasListeners (emitter, type) { + var count = typeof emitter.listenerCount !== 'function' + ? emitter.listeners(type).length + : emitter.listenerCount(type) + + return count > 0 +} + +/** + * Determine if the response headers have been sent. + * + * @param {object} res + * @returns {boolean} + * @private + */ + +function headersSent (res) { + return typeof res.headersSent !== 'boolean' + ? Boolean(res._header) + : res.headersSent +} + +/** + * Normalize the index option into an array. + * + * @param {boolean|string|array} val + * @param {string} name + * @private + */ + +function normalizeList (val, name) { + var list = [].concat(val || []) + + for (var i = 0; i < list.length; i++) { + if (typeof list[i] !== 'string') { + throw new TypeError(name + ' must be array of strings or false') + } + } + + return list +} + +/** + * Parse an HTTP Date into a number. + * + * @param {string} date + * @private + */ + +function parseHttpDate (date) { + var timestamp = date && Date.parse(date) + + return typeof timestamp === 'number' + ? timestamp + : NaN +} + +/** + * Parse a HTTP token list. + * + * @param {string} str + * @private + */ + +function parseTokenList (str) { + var end = 0 + var list = [] + var start = 0 + + // gather tokens + for (var i = 0, len = str.length; i < len; i++) { + switch (str.charCodeAt(i)) { + case 0x20: /* */ + if (start === end) { + start = end = i + 1 + } + break + case 0x2c: /* , */ + list.push(str.substring(start, end)) + start = end = i + 1 + break + default: + end = i + 1 + break + } + } + + // final token + list.push(str.substring(start, end)) + + return list +} + +/** + * Set an object of headers on a response. + * + * @param {object} res + * @param {object} headers + * @private + */ + +function setHeaders (res, headers) { + var keys = Object.keys(headers) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + res.setHeader(key, headers[key]) + } +} diff --git a/node_modules/send/node_modules/ms/index.js b/node_modules/send/node_modules/ms/index.js new file mode 100644 index 00000000..72297501 --- /dev/null +++ b/node_modules/send/node_modules/ms/index.js @@ -0,0 +1,162 @@ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isNaN(val) === false) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\-?\d?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} diff --git a/node_modules/send/node_modules/ms/license.md b/node_modules/send/node_modules/ms/license.md new file mode 100644 index 00000000..69b61253 --- /dev/null +++ b/node_modules/send/node_modules/ms/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +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/node_modules/send/node_modules/ms/package.json b/node_modules/send/node_modules/ms/package.json new file mode 100644 index 00000000..9457c9f9 --- /dev/null +++ b/node_modules/send/node_modules/ms/package.json @@ -0,0 +1,69 @@ +{ + "_from": "ms@2.1.1", + "_id": "ms@2.1.1", + "_inBundle": false, + "_integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "_location": "/send/ms", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ms@2.1.1", + "name": "ms", + "escapedName": "ms", + "rawSpec": "2.1.1", + "saveSpec": null, + "fetchSpec": "2.1.1" + }, + "_requiredBy": [ + "/send" + ], + "_resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "_shasum": "30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a", + "_spec": "ms@2.1.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\send", + "bugs": { + "url": "https://github.com/zeit/ms/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Tiny millisecond conversion utility", + "devDependencies": { + "eslint": "4.12.1", + "expect.js": "0.3.1", + "husky": "0.14.3", + "lint-staged": "5.0.0", + "mocha": "4.0.1" + }, + "eslintConfig": { + "extends": "eslint:recommended", + "env": { + "node": true, + "es6": true + } + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/zeit/ms#readme", + "license": "MIT", + "lint-staged": { + "*.js": [ + "npm run lint", + "prettier --single-quote --write", + "git add" + ] + }, + "main": "./index", + "name": "ms", + "repository": { + "type": "git", + "url": "git+https://github.com/zeit/ms.git" + }, + "scripts": { + "lint": "eslint lib/* bin/*", + "precommit": "lint-staged", + "test": "mocha tests.js" + }, + "version": "2.1.1" +} diff --git a/node_modules/send/node_modules/ms/readme.md b/node_modules/send/node_modules/ms/readme.md new file mode 100644 index 00000000..bb767293 --- /dev/null +++ b/node_modules/send/node_modules/ms/readme.md @@ -0,0 +1,60 @@ +# ms + +[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms) +[![Slack Channel](http://zeit-slackin.now.sh/badge.svg)](https://zeit.chat/) + +Use this package to easily convert various time formats to milliseconds. + +## Examples + +```js +ms('2 days') // 172800000 +ms('1d') // 86400000 +ms('10h') // 36000000 +ms('2.5 hrs') // 9000000 +ms('2h') // 7200000 +ms('1m') // 60000 +ms('5s') // 5000 +ms('1y') // 31557600000 +ms('100') // 100 +ms('-3 days') // -259200000 +ms('-1h') // -3600000 +ms('-200') // -200 +``` + +### Convert from Milliseconds + +```js +ms(60000) // "1m" +ms(2 * 60000) // "2m" +ms(-3 * 60000) // "-3m" +ms(ms('10 hours')) // "10h" +``` + +### Time Format Written-Out + +```js +ms(60000, { long: true }) // "1 minute" +ms(2 * 60000, { long: true }) // "2 minutes" +ms(-3 * 60000, { long: true }) // "-3 minutes" +ms(ms('10 hours'), { long: true }) // "10 hours" +``` + +## Features + +- Works both in [Node.js](https://nodejs.org) and in the browser +- If a number is supplied to `ms`, a string with a unit is returned +- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`) +- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned + +## Related Packages + +- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time. + +## Caught a Bug? + +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device +2. Link the package to the global module directory: `npm link` +3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms! + +As always, you can run the tests using: `npm test` diff --git a/node_modules/send/package.json b/node_modules/send/package.json new file mode 100644 index 00000000..42126401 --- /dev/null +++ b/node_modules/send/package.json @@ -0,0 +1,106 @@ +{ + "_from": "send@0.17.1", + "_id": "send@0.17.1", + "_inBundle": false, + "_integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "_location": "/send", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "send@0.17.1", + "name": "send", + "escapedName": "send", + "rawSpec": "0.17.1", + "saveSpec": null, + "fetchSpec": "0.17.1" + }, + "_requiredBy": [ + "/express", + "/serve-static" + ], + "_resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "_shasum": "c1d8b059f7900f7466dd4938bdc44e11ddb376c8", + "_spec": "send@0.17.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "bugs": { + "url": "https://github.com/pillarjs/send/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "James Wyatt Cready", + "email": "jcready@gmail.com" + }, + { + "name": "Jesús Leganés Combarro", + "email": "piranna@gmail.com" + } + ], + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "deprecated": false, + "description": "Better streaming static file server with Range and conditional-GET support", + "devDependencies": { + "after": "0.8.2", + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "istanbul": "0.4.5", + "mocha": "6.1.4", + "supertest": "4.0.2" + }, + "engines": { + "node": ">= 0.8.0" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "index.js" + ], + "homepage": "https://github.com/pillarjs/send#readme", + "keywords": [ + "static", + "file", + "server" + ], + "license": "MIT", + "name": "send", + "repository": { + "type": "git", + "url": "git+https://github.com/pillarjs/send.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --check-leaks --reporter spec --bail", + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot" + }, + "version": "0.17.1" +} diff --git a/node_modules/serve-static/HISTORY.md b/node_modules/serve-static/HISTORY.md new file mode 100644 index 00000000..7203e4fb --- /dev/null +++ b/node_modules/serve-static/HISTORY.md @@ -0,0 +1,451 @@ +1.14.1 / 2019-05-10 +=================== + + * Set stricter CSP header in redirect response + * deps: send@0.17.1 + - deps: range-parser@~1.2.1 + +1.14.0 / 2019-05-07 +=================== + + * deps: parseurl@~1.3.3 + * deps: send@0.17.0 + - deps: http-errors@~1.7.2 + - deps: mime@1.6.0 + - deps: ms@2.1.1 + - deps: statuses@~1.5.0 + - perf: remove redundant `path.normalize` call + +1.13.2 / 2018-02-07 +=================== + + * Fix incorrect end tag in redirects + * deps: encodeurl@~1.0.2 + - Fix encoding `%` as last character + * deps: send@0.16.2 + - deps: depd@~1.1.2 + - deps: encodeurl@~1.0.2 + - deps: statuses@~1.4.0 + +1.13.1 / 2017-09-29 +=================== + + * Fix regression when `root` is incorrectly set to a file + * deps: send@0.16.1 + +1.13.0 / 2017-09-27 +=================== + + * deps: send@0.16.0 + - Add 70 new types for file extensions + - Add `immutable` option + - Fix missing `` in default error & redirects + - Set charset as "UTF-8" for .js and .json + - Use instance methods on steam to check for listeners + - deps: mime@1.4.1 + - perf: improve path validation speed + +1.12.6 / 2017-09-22 +=================== + + * deps: send@0.15.6 + - deps: debug@2.6.9 + - perf: improve `If-Match` token parsing + * perf: improve slash collapsing + +1.12.5 / 2017-09-21 +=================== + + * deps: parseurl@~1.3.2 + - perf: reduce overhead for full URLs + - perf: unroll the "fast-path" `RegExp` + * deps: send@0.15.5 + - Fix handling of modified headers with invalid dates + - deps: etag@~1.8.1 + - deps: fresh@0.5.2 + +1.12.4 / 2017-08-05 +=================== + + * deps: send@0.15.4 + - deps: debug@2.6.8 + - deps: depd@~1.1.1 + - deps: http-errors@~1.6.2 + +1.12.3 / 2017-05-16 +=================== + + * deps: send@0.15.3 + - deps: debug@2.6.7 + +1.12.2 / 2017-04-26 +=================== + + * deps: send@0.15.2 + - deps: debug@2.6.4 + +1.12.1 / 2017-03-04 +=================== + + * deps: send@0.15.1 + - Fix issue when `Date.parse` does not return `NaN` on invalid date + - Fix strict violation in broken environments + +1.12.0 / 2017-02-25 +=================== + + * Send complete HTML document in redirect response + * Set default CSP header in redirect response + * deps: send@0.15.0 + - Fix false detection of `no-cache` request directive + - Fix incorrect result when `If-None-Match` has both `*` and ETags + - Fix weak `ETag` matching to match spec + - Remove usage of `res._headers` private field + - Support `If-Match` and `If-Unmodified-Since` headers + - Use `res.getHeaderNames()` when available + - Use `res.headersSent` when available + - deps: debug@2.6.1 + - deps: etag@~1.8.0 + - deps: fresh@0.5.0 + - deps: http-errors@~1.6.1 + +1.11.2 / 2017-01-23 +=================== + + * deps: send@0.14.2 + - deps: http-errors@~1.5.1 + - deps: ms@0.7.2 + - deps: statuses@~1.3.1 + +1.11.1 / 2016-06-10 +=================== + + * Fix redirect error when `req.url` contains raw non-URL characters + * deps: send@0.14.1 + +1.11.0 / 2016-06-07 +=================== + + * Use status code 301 for redirects + * deps: send@0.14.0 + - Add `acceptRanges` option + - Add `cacheControl` option + - Attempt to combine multiple ranges into single range + - Correctly inherit from `Stream` class + - Fix `Content-Range` header in 416 responses when using `start`/`end` options + - Fix `Content-Range` header missing from default 416 responses + - Ignore non-byte `Range` headers + - deps: http-errors@~1.5.0 + - deps: range-parser@~1.2.0 + - deps: statuses@~1.3.0 + - perf: remove argument reassignment + +1.10.3 / 2016-05-30 +=================== + + * deps: send@0.13.2 + - Fix invalid `Content-Type` header when `send.mime.default_type` unset + +1.10.2 / 2016-01-19 +=================== + + * deps: parseurl@~1.3.1 + - perf: enable strict mode + +1.10.1 / 2016-01-16 +=================== + + * deps: escape-html@~1.0.3 + - perf: enable strict mode + - perf: optimize string replacement + - perf: use faster string coercion + * deps: send@0.13.1 + - deps: depd@~1.1.0 + - deps: destroy@~1.0.4 + - deps: escape-html@~1.0.3 + - deps: range-parser@~1.0.3 + +1.10.0 / 2015-06-17 +=================== + + * Add `fallthrough` option + - Allows declaring this middleware is the final destination + - Provides better integration with Express patterns + * Fix reading options from options prototype + * Improve the default redirect response headers + * deps: escape-html@1.0.2 + * deps: send@0.13.0 + - Allow Node.js HTTP server to set `Date` response header + - Fix incorrectly removing `Content-Location` on 304 response + - Improve the default redirect response headers + - Send appropriate headers on default error response + - Use `http-errors` for standard emitted errors + - Use `statuses` instead of `http` module for status messages + - deps: escape-html@1.0.2 + - deps: etag@~1.7.0 + - deps: fresh@0.3.0 + - deps: on-finished@~2.3.0 + - perf: enable strict mode + - perf: remove unnecessary array allocations + * perf: enable strict mode + * perf: remove argument reassignment + +1.9.3 / 2015-05-14 +================== + + * deps: send@0.12.3 + - deps: debug@~2.2.0 + - deps: depd@~1.0.1 + - deps: etag@~1.6.0 + - deps: ms@0.7.1 + - deps: on-finished@~2.2.1 + +1.9.2 / 2015-03-14 +================== + + * deps: send@0.12.2 + - Throw errors early for invalid `extensions` or `index` options + - deps: debug@~2.1.3 + +1.9.1 / 2015-02-17 +================== + + * deps: send@0.12.1 + - Fix regression sending zero-length files + +1.9.0 / 2015-02-16 +================== + + * deps: send@0.12.0 + - Always read the stat size from the file + - Fix mutating passed-in `options` + - deps: mime@1.3.4 + +1.8.1 / 2015-01-20 +================== + + * Fix redirect loop in Node.js 0.11.14 + * deps: send@0.11.1 + - Fix root path disclosure + +1.8.0 / 2015-01-05 +================== + + * deps: send@0.11.0 + - deps: debug@~2.1.1 + - deps: etag@~1.5.1 + - deps: ms@0.7.0 + - deps: on-finished@~2.2.0 + +1.7.2 / 2015-01-02 +================== + + * Fix potential open redirect when mounted at root + +1.7.1 / 2014-10-22 +================== + + * deps: send@0.10.1 + - deps: on-finished@~2.1.1 + +1.7.0 / 2014-10-15 +================== + + * deps: send@0.10.0 + - deps: debug@~2.1.0 + - deps: depd@~1.0.0 + - deps: etag@~1.5.0 + +1.6.5 / 2015-02-04 +================== + + * Fix potential open redirect when mounted at root + - Back-ported from v1.7.2 + +1.6.4 / 2014-10-08 +================== + + * Fix redirect loop when index file serving disabled + +1.6.3 / 2014-09-24 +================== + + * deps: send@0.9.3 + - deps: etag@~1.4.0 + +1.6.2 / 2014-09-15 +================== + + * deps: send@0.9.2 + - deps: depd@0.4.5 + - deps: etag@~1.3.1 + - deps: range-parser@~1.0.2 + +1.6.1 / 2014-09-07 +================== + + * deps: send@0.9.1 + - deps: fresh@0.2.4 + +1.6.0 / 2014-09-07 +================== + + * deps: send@0.9.0 + - Add `lastModified` option + - Use `etag` to generate `ETag` header + - deps: debug@~2.0.0 + +1.5.4 / 2014-09-04 +================== + + * deps: send@0.8.5 + - Fix a path traversal issue when using `root` + - Fix malicious path detection for empty string path + +1.5.3 / 2014-08-17 +================== + + * deps: send@0.8.3 + +1.5.2 / 2014-08-14 +================== + + * deps: send@0.8.2 + - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` + +1.5.1 / 2014-08-09 +================== + + * Fix parsing of weird `req.originalUrl` values + * deps: parseurl@~1.3.0 + * deps: utils-merge@1.0.0 + +1.5.0 / 2014-08-05 +================== + + * deps: send@0.8.1 + - Add `extensions` option + +1.4.4 / 2014-08-04 +================== + + * deps: send@0.7.4 + - Fix serving index files without root dir + +1.4.3 / 2014-07-29 +================== + + * deps: send@0.7.3 + - Fix incorrect 403 on Windows and Node.js 0.11 + +1.4.2 / 2014-07-27 +================== + + * deps: send@0.7.2 + - deps: depd@0.4.4 + +1.4.1 / 2014-07-26 +================== + + * deps: send@0.7.1 + - deps: depd@0.4.3 + +1.4.0 / 2014-07-21 +================== + + * deps: parseurl@~1.2.0 + - Cache URLs based on original value + - Remove no-longer-needed URL mis-parse work-around + - Simplify the "fast-path" `RegExp` + * deps: send@0.7.0 + - Add `dotfiles` option + - deps: debug@1.0.4 + - deps: depd@0.4.2 + +1.3.2 / 2014-07-11 +================== + + * deps: send@0.6.0 + - Cap `maxAge` value to 1 year + - deps: debug@1.0.3 + +1.3.1 / 2014-07-09 +================== + + * deps: parseurl@~1.1.3 + - faster parsing of href-only URLs + +1.3.0 / 2014-06-28 +================== + + * Add `setHeaders` option + * Include HTML link in redirect response + * deps: send@0.5.0 + - Accept string for `maxAge` (converted by `ms`) + +1.2.3 / 2014-06-11 +================== + + * deps: send@0.4.3 + - Do not throw un-catchable error on file open race condition + - Use `escape-html` for HTML escaping + - deps: debug@1.0.2 + - deps: finished@1.2.2 + - deps: fresh@0.2.2 + +1.2.2 / 2014-06-09 +================== + + * deps: send@0.4.2 + - fix "event emitter leak" warnings + - deps: debug@1.0.1 + - deps: finished@1.2.1 + +1.2.1 / 2014-06-02 +================== + + * use `escape-html` for escaping + * deps: send@0.4.1 + - Send `max-age` in `Cache-Control` in correct format + +1.2.0 / 2014-05-29 +================== + + * deps: send@0.4.0 + - Calculate ETag with md5 for reduced collisions + - Fix wrong behavior when index file matches directory + - Ignore stream errors after request ends + - Skip directories in index file search + - deps: debug@0.8.1 + +1.1.0 / 2014-04-24 +================== + + * Accept options directly to `send` module + * deps: send@0.3.0 + +1.0.4 / 2014-04-07 +================== + + * Resolve relative paths at middleware setup + * Use parseurl to parse the URL from request + +1.0.3 / 2014-03-20 +================== + + * Do not rely on connect-like environments + +1.0.2 / 2014-03-06 +================== + + * deps: send@0.2.0 + +1.0.1 / 2014-03-05 +================== + + * Add mime export for back-compat + +1.0.0 / 2014-03-05 +================== + + * Genesis from `connect` diff --git a/node_modules/serve-static/LICENSE b/node_modules/serve-static/LICENSE new file mode 100644 index 00000000..cbe62e8e --- /dev/null +++ b/node_modules/serve-static/LICENSE @@ -0,0 +1,25 @@ +(The MIT License) + +Copyright (c) 2010 Sencha Inc. +Copyright (c) 2011 LearnBoost +Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2014-2016 Douglas Christopher Wilson + +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/node_modules/serve-static/README.md b/node_modules/serve-static/README.md new file mode 100644 index 00000000..7cce428c --- /dev/null +++ b/node_modules/serve-static/README.md @@ -0,0 +1,259 @@ +# serve-static + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Linux Build][travis-image]][travis-url] +[![Windows Build][appveyor-image]][appveyor-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install serve-static +``` + +## API + + + +```js +var serveStatic = require('serve-static') +``` + +### serveStatic(root, options) + +Create a new middleware function to serve files from within a given root +directory. The file to serve will be determined by combining `req.url` +with the provided root directory. When a file is not found, instead of +sending a 404 response, this module will instead call `next()` to move on +to the next middleware, allowing for stacking and fall-backs. + +#### Options + +##### acceptRanges + +Enable or disable accepting ranged requests, defaults to true. +Disabling this will not send `Accept-Ranges` and ignore the contents +of the `Range` request header. + +##### cacheControl + +Enable or disable setting `Cache-Control` response header, defaults to +true. Disabling this will ignore the `immutable` and `maxAge` options. + +##### dotfiles + + Set how "dotfiles" are treated when encountered. A dotfile is a file +or directory that begins with a dot ("."). Note this check is done on +the path itself without checking if the path actually exists on the +disk. If `root` is specified, only the dotfiles above the root are +checked (i.e. the root itself can be within a dotfile when set +to "deny"). + + - `'allow'` No special treatment for dotfiles. + - `'deny'` Deny a request for a dotfile and 403/`next()`. + - `'ignore'` Pretend like the dotfile does not exist and 404/`next()`. + +The default value is similar to `'ignore'`, with the exception that this +default will not ignore the files within a directory that begins with a dot. + +##### etag + +Enable or disable etag generation, defaults to true. + +##### extensions + +Set file extension fallbacks. When set, if a file is not found, the given +extensions will be added to the file name and search for. The first that +exists will be served. Example: `['html', 'htm']`. + +The default value is `false`. + +##### fallthrough + +Set the middleware to have client errors fall-through as just unhandled +requests, otherwise forward a client error. The difference is that client +errors like a bad request or a request to a non-existent file will cause +this middleware to simply `next()` to your next middleware when this value +is `true`. When this value is `false`, these errors (even 404s), will invoke +`next(err)`. + +Typically `true` is desired such that multiple physical directories can be +mapped to the same web address or for routes to fill in non-existent files. + +The value `false` can be used if this middleware is mounted at a path that +is designed to be strictly a single file system directory, which allows for +short-circuiting 404s for less overhead. This middleware will also reply to +all methods. + +The default value is `true`. + +##### immutable + +Enable or disable the `immutable` directive in the `Cache-Control` response +header, defaults to `false`. If set to `true`, the `maxAge` option should +also be specified to enable caching. The `immutable` directive will prevent +supported clients from making conditional requests during the life of the +`maxAge` option to check if the file has changed. + +##### index + +By default this module will send "index.html" files in response to a request +on a directory. To disable this set `false` or to supply a new index pass a +string or an array in preferred order. + +##### lastModified + +Enable or disable `Last-Modified` header, defaults to true. Uses the file +system's last modified value. + +##### maxAge + +Provide a max-age in milliseconds for http caching, defaults to 0. This +can also be a string accepted by the [ms](https://www.npmjs.org/package/ms#readme) +module. + +##### redirect + +Redirect to trailing "/" when the pathname is a dir. Defaults to `true`. + +##### setHeaders + +Function to set custom headers on response. Alterations to the headers need to +occur synchronously. The function is called as `fn(res, path, stat)`, where +the arguments are: + + - `res` the response object + - `path` the file path that is being sent + - `stat` the stat object of the file that is being sent + +## Examples + +### Serve files with vanilla node.js http server + +```js +var finalhandler = require('finalhandler') +var http = require('http') +var serveStatic = require('serve-static') + +// Serve up public/ftp folder +var serve = serveStatic('public/ftp', { 'index': ['index.html', 'index.htm'] }) + +// Create server +var server = http.createServer(function onRequest (req, res) { + serve(req, res, finalhandler(req, res)) +}) + +// Listen +server.listen(3000) +``` + +### Serve all files as downloads + +```js +var contentDisposition = require('content-disposition') +var finalhandler = require('finalhandler') +var http = require('http') +var serveStatic = require('serve-static') + +// Serve up public/ftp folder +var serve = serveStatic('public/ftp', { + 'index': false, + 'setHeaders': setHeaders +}) + +// Set header to force download +function setHeaders (res, path) { + res.setHeader('Content-Disposition', contentDisposition(path)) +} + +// Create server +var server = http.createServer(function onRequest (req, res) { + serve(req, res, finalhandler(req, res)) +}) + +// Listen +server.listen(3000) +``` + +### Serving using express + +#### Simple + +This is a simple example of using Express. + +```js +var express = require('express') +var serveStatic = require('serve-static') + +var app = express() + +app.use(serveStatic('public/ftp', { 'index': ['default.html', 'default.htm'] })) +app.listen(3000) +``` + +#### Multiple roots + +This example shows a simple way to search through multiple directories. +Files are look for in `public-optimized/` first, then `public/` second as +a fallback. + +```js +var express = require('express') +var path = require('path') +var serveStatic = require('serve-static') + +var app = express() + +app.use(serveStatic(path.join(__dirname, 'public-optimized'))) +app.use(serveStatic(path.join(__dirname, 'public'))) +app.listen(3000) +``` + +#### Different settings for paths + +This example shows how to set a different max age depending on the served +file type. In this example, HTML files are not cached, while everything else +is for 1 day. + +```js +var express = require('express') +var path = require('path') +var serveStatic = require('serve-static') + +var app = express() + +app.use(serveStatic(path.join(__dirname, 'public'), { + maxAge: '1d', + setHeaders: setCustomCacheControl +})) + +app.listen(3000) + +function setCustomCacheControl (res, path) { + if (serveStatic.mime.lookup(path) === 'text/html') { + // Custom Cache-Control for HTML files + res.setHeader('Cache-Control', 'public, max-age=0') + } +} +``` + +## License + +[MIT](LICENSE) + +[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/serve-static/master?label=windows +[appveyor-url]: https://ci.appveyor.com/project/dougwilson/serve-static +[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/serve-static/master +[coveralls-url]: https://coveralls.io/r/expressjs/serve-static?branch=master +[node-image]: https://badgen.net/npm/node/serve-static +[node-url]: https://nodejs.org/en/download/ +[npm-downloads-image]: https://badgen.net/npm/dm/serve-static +[npm-url]: https://npmjs.org/package/serve-static +[npm-version-image]: https://badgen.net/npm/v/serve-static +[travis-image]: https://badgen.net/travis/expressjs/serve-static/master?label=linux +[travis-url]: https://travis-ci.org/expressjs/serve-static diff --git a/node_modules/serve-static/index.js b/node_modules/serve-static/index.js new file mode 100644 index 00000000..b7d3984c --- /dev/null +++ b/node_modules/serve-static/index.js @@ -0,0 +1,210 @@ +/*! + * serve-static + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * Copyright(c) 2014-2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var encodeUrl = require('encodeurl') +var escapeHtml = require('escape-html') +var parseUrl = require('parseurl') +var resolve = require('path').resolve +var send = require('send') +var url = require('url') + +/** + * Module exports. + * @public + */ + +module.exports = serveStatic +module.exports.mime = send.mime + +/** + * @param {string} root + * @param {object} [options] + * @return {function} + * @public + */ + +function serveStatic (root, options) { + if (!root) { + throw new TypeError('root path required') + } + + if (typeof root !== 'string') { + throw new TypeError('root path must be a string') + } + + // copy options object + var opts = Object.create(options || null) + + // fall-though + var fallthrough = opts.fallthrough !== false + + // default redirect + var redirect = opts.redirect !== false + + // headers listener + var setHeaders = opts.setHeaders + + if (setHeaders && typeof setHeaders !== 'function') { + throw new TypeError('option setHeaders must be function') + } + + // setup options for send + opts.maxage = opts.maxage || opts.maxAge || 0 + opts.root = resolve(root) + + // construct directory listener + var onDirectory = redirect + ? createRedirectDirectoryListener() + : createNotFoundDirectoryListener() + + return function serveStatic (req, res, next) { + if (req.method !== 'GET' && req.method !== 'HEAD') { + if (fallthrough) { + return next() + } + + // method not allowed + res.statusCode = 405 + res.setHeader('Allow', 'GET, HEAD') + res.setHeader('Content-Length', '0') + res.end() + return + } + + var forwardError = !fallthrough + var originalUrl = parseUrl.original(req) + var path = parseUrl(req).pathname + + // make sure redirect occurs at mount + if (path === '/' && originalUrl.pathname.substr(-1) !== '/') { + path = '' + } + + // create send stream + var stream = send(req, path, opts) + + // add directory handler + stream.on('directory', onDirectory) + + // add headers listener + if (setHeaders) { + stream.on('headers', setHeaders) + } + + // add file listener for fallthrough + if (fallthrough) { + stream.on('file', function onFile () { + // once file is determined, always forward error + forwardError = true + }) + } + + // forward errors + stream.on('error', function error (err) { + if (forwardError || !(err.statusCode < 500)) { + next(err) + return + } + + next() + }) + + // pipe + stream.pipe(res) + } +} + +/** + * Collapse all leading slashes into a single slash + * @private + */ +function collapseLeadingSlashes (str) { + for (var i = 0; i < str.length; i++) { + if (str.charCodeAt(i) !== 0x2f /* / */) { + break + } + } + + return i > 1 + ? '/' + str.substr(i) + : str +} + +/** + * Create a minimal HTML document. + * + * @param {string} title + * @param {string} body + * @private + */ + +function createHtmlDocument (title, body) { + return '\n' + + '\n' + + '\n' + + '\n' + + '' + title + '\n' + + '\n' + + '\n' + + '
' + body + '
\n' + + '\n' + + '\n' +} + +/** + * Create a directory listener that just 404s. + * @private + */ + +function createNotFoundDirectoryListener () { + return function notFound () { + this.error(404) + } +} + +/** + * Create a directory listener that performs a redirect. + * @private + */ + +function createRedirectDirectoryListener () { + return function redirect (res) { + if (this.hasTrailingSlash()) { + this.error(404) + return + } + + // get original URL + var originalUrl = parseUrl.original(this.req) + + // append trailing slash + originalUrl.path = null + originalUrl.pathname = collapseLeadingSlashes(originalUrl.pathname + '/') + + // reformat the URL + var loc = encodeUrl(url.format(originalUrl)) + var doc = createHtmlDocument('Redirecting', 'Redirecting to ' + + escapeHtml(loc) + '') + + // send redirect response + res.statusCode = 301 + res.setHeader('Content-Type', 'text/html; charset=UTF-8') + res.setHeader('Content-Length', Buffer.byteLength(doc)) + res.setHeader('Content-Security-Policy', "default-src 'none'") + res.setHeader('X-Content-Type-Options', 'nosniff') + res.setHeader('Location', loc) + res.end(doc) + } +} diff --git a/node_modules/serve-static/package.json b/node_modules/serve-static/package.json new file mode 100644 index 00000000..0c154ba4 --- /dev/null +++ b/node_modules/serve-static/package.json @@ -0,0 +1,77 @@ +{ + "_from": "serve-static@1.14.1", + "_id": "serve-static@1.14.1", + "_inBundle": false, + "_integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "_location": "/serve-static", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "serve-static@1.14.1", + "name": "serve-static", + "escapedName": "serve-static", + "rawSpec": "1.14.1", + "saveSpec": null, + "fetchSpec": "1.14.1" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "_shasum": "666e636dc4f010f7ef29970a88a674320898b2f9", + "_spec": "serve-static@1.14.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + "bugs": { + "url": "https://github.com/expressjs/serve-static/issues" + }, + "bundleDependencies": false, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "deprecated": false, + "description": "Serve static files", + "devDependencies": { + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "istanbul": "0.4.5", + "mocha": "6.1.4", + "safe-buffer": "5.1.2", + "supertest": "4.0.2" + }, + "engines": { + "node": ">= 0.8.0" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "index.js" + ], + "homepage": "https://github.com/expressjs/serve-static#readme", + "license": "MIT", + "name": "serve-static", + "repository": { + "type": "git", + "url": "git+https://github.com/expressjs/serve-static.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "version": "node scripts/version-history.js && git add HISTORY.md" + }, + "version": "1.14.1" +} diff --git a/node_modules/setprototypeof/LICENSE b/node_modules/setprototypeof/LICENSE new file mode 100644 index 00000000..61afa2f1 --- /dev/null +++ b/node_modules/setprototypeof/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2015, Wes Todd + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/setprototypeof/README.md b/node_modules/setprototypeof/README.md new file mode 100644 index 00000000..f120044b --- /dev/null +++ b/node_modules/setprototypeof/README.md @@ -0,0 +1,31 @@ +# Polyfill for `Object.setPrototypeOf` + +[![NPM Version](https://img.shields.io/npm/v/setprototypeof.svg)](https://npmjs.org/package/setprototypeof) +[![NPM Downloads](https://img.shields.io/npm/dm/setprototypeof.svg)](https://npmjs.org/package/setprototypeof) +[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/standard/standard) + +A simple cross platform implementation to set the prototype of an instianted object. Supports all modern browsers and at least back to IE8. + +## Usage: + +``` +$ npm install --save setprototypeof +``` + +```javascript +var setPrototypeOf = require('setprototypeof') + +var obj = {} +setPrototypeOf(obj, { + foo: function () { + return 'bar' + } +}) +obj.foo() // bar +``` + +TypeScript is also supported: + +```typescript +import setPrototypeOf = require('setprototypeof') +``` diff --git a/node_modules/setprototypeof/index.d.ts b/node_modules/setprototypeof/index.d.ts new file mode 100644 index 00000000..f108ecd0 --- /dev/null +++ b/node_modules/setprototypeof/index.d.ts @@ -0,0 +1,2 @@ +declare function setPrototypeOf(o: any, proto: object | null): any; +export = setPrototypeOf; diff --git a/node_modules/setprototypeof/index.js b/node_modules/setprototypeof/index.js new file mode 100644 index 00000000..81fd5d7a --- /dev/null +++ b/node_modules/setprototypeof/index.js @@ -0,0 +1,17 @@ +'use strict' +/* eslint no-proto: 0 */ +module.exports = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties) + +function setProtoOf (obj, proto) { + obj.__proto__ = proto + return obj +} + +function mixinProperties (obj, proto) { + for (var prop in proto) { + if (!obj.hasOwnProperty(prop)) { + obj[prop] = proto[prop] + } + } + return obj +} diff --git a/node_modules/setprototypeof/package.json b/node_modules/setprototypeof/package.json new file mode 100644 index 00000000..ad54d729 --- /dev/null +++ b/node_modules/setprototypeof/package.json @@ -0,0 +1,64 @@ +{ + "_from": "setprototypeof@1.1.1", + "_id": "setprototypeof@1.1.1", + "_inBundle": false, + "_integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "_location": "/setprototypeof", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "setprototypeof@1.1.1", + "name": "setprototypeof", + "escapedName": "setprototypeof", + "rawSpec": "1.1.1", + "saveSpec": null, + "fetchSpec": "1.1.1" + }, + "_requiredBy": [ + "/express", + "/http-errors" + ], + "_resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "_shasum": "7e95acb24aa92f5885e0abef5ba131330d4ae683", + "_spec": "setprototypeof@1.1.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "Wes Todd" + }, + "bugs": { + "url": "https://github.com/wesleytodd/setprototypeof/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "A small polyfill for Object.setprototypeof", + "devDependencies": { + "mocha": "^5.2.0", + "standard": "^12.0.1" + }, + "homepage": "https://github.com/wesleytodd/setprototypeof", + "keywords": [ + "polyfill", + "object", + "setprototypeof" + ], + "license": "ISC", + "main": "index.js", + "name": "setprototypeof", + "repository": { + "type": "git", + "url": "git+https://github.com/wesleytodd/setprototypeof.git" + }, + "scripts": { + "node010": "NODE_VER=0.10 MOCHA_VER=3 npm run testversion", + "node11": "NODE_VER=11 npm run testversion", + "node4": "NODE_VER=4 npm run testversion", + "node6": "NODE_VER=6 npm run testversion", + "node9": "NODE_VER=9 npm run testversion", + "test": "standard && mocha", + "testallversions": "npm run node010 && npm run node4 && npm run node6 && npm run node9 && npm run node11", + "testversion": "docker run -it --rm -v $(PWD):/usr/src/app -w /usr/src/app node:${NODE_VER} npm install mocha@${MOCHA_VER:-latest} && npm t" + }, + "typings": "index.d.ts", + "version": "1.1.1" +} diff --git a/node_modules/setprototypeof/test/index.js b/node_modules/setprototypeof/test/index.js new file mode 100644 index 00000000..afeb4ddb --- /dev/null +++ b/node_modules/setprototypeof/test/index.js @@ -0,0 +1,24 @@ +'use strict' +/* eslint-env mocha */ +/* eslint no-proto: 0 */ +var assert = require('assert') +var setPrototypeOf = require('..') + +describe('setProtoOf(obj, proto)', function () { + it('should merge objects', function () { + var obj = { a: 1, b: 2 } + var proto = { b: 3, c: 4 } + var mergeObj = setPrototypeOf(obj, proto) + + if (Object.getPrototypeOf) { + assert.strictEqual(Object.getPrototypeOf(obj), proto) + } else if ({ __proto__: [] } instanceof Array) { + assert.strictEqual(obj.__proto__, proto) + } else { + assert.strictEqual(obj.a, 1) + assert.strictEqual(obj.b, 2) + assert.strictEqual(obj.c, 4) + } + assert.strictEqual(mergeObj, obj) + }) +}) diff --git a/node_modules/sparse-bitfield/.npmignore b/node_modules/sparse-bitfield/.npmignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/node_modules/sparse-bitfield/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/sparse-bitfield/.travis.yml b/node_modules/sparse-bitfield/.travis.yml new file mode 100644 index 00000000..c0428217 --- /dev/null +++ b/node_modules/sparse-bitfield/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - '0.10' + - '0.12' + - '4.0' + - '5.0' diff --git a/node_modules/sparse-bitfield/LICENSE b/node_modules/sparse-bitfield/LICENSE new file mode 100644 index 00000000..bae9da7b --- /dev/null +++ b/node_modules/sparse-bitfield/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Mathias Buus + +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/node_modules/sparse-bitfield/README.md b/node_modules/sparse-bitfield/README.md new file mode 100644 index 00000000..7b6b8f9e --- /dev/null +++ b/node_modules/sparse-bitfield/README.md @@ -0,0 +1,62 @@ +# sparse-bitfield + +Bitfield implementation that allocates a series of 1kb buffers to support sparse bitfields +without allocating a massive buffer. If you want to simple implementation of a flat bitfield +see the [bitfield](https://github.com/fb55/bitfield) module. + +This module is mostly useful if you need a big bitfield where you won't nessecarily set every bit. + +``` +npm install sparse-bitfield +``` + +[![build status](http://img.shields.io/travis/mafintosh/sparse-bitfield.svg?style=flat)](http://travis-ci.org/mafintosh/sparse-bitfield) + +## Usage + +``` js +var bitfield = require('sparse-bitfield') +var bits = bitfield() + +bits.set(0, true) // set first bit +bits.set(1, true) // set second bit +bits.set(1000000000000, true) // set the 1.000.000.000.000th bit +``` + +Running the above example will allocate two 1kb buffers internally. +Each 1kb buffer can hold information about 8192 bits so the first one will be used to store information about the first two bits and the second will be used to store the 1.000.000.000.000th bit. + +## API + +#### `var bits = bitfield([options])` + +Create a new bitfield. Options include + +``` js +{ + pageSize: 1024, // how big should the partial buffers be + buffer: anExistingBitfield, + trackUpdates: false // track when pages are being updated in the pager +} +``` + +#### `bits.set(index, value)` + +Set a bit to true or false. + +#### `bits.get(index)` + +Get the value of a bit. + +#### `bits.pages` + +A [memory-pager](https://github.com/mafintosh/memory-pager) instance that is managing the underlying memory. +If you set `trackUpdates` to true in the constructor you can use `.lastUpdate()` on this instance to get the last updated memory page. + +#### `var buffer = bits.toBuffer()` + +Get a single buffer representing the entire bitfield. + +## License + +MIT diff --git a/node_modules/sparse-bitfield/index.js b/node_modules/sparse-bitfield/index.js new file mode 100644 index 00000000..ff458c97 --- /dev/null +++ b/node_modules/sparse-bitfield/index.js @@ -0,0 +1,95 @@ +var pager = require('memory-pager') + +module.exports = Bitfield + +function Bitfield (opts) { + if (!(this instanceof Bitfield)) return new Bitfield(opts) + if (!opts) opts = {} + if (Buffer.isBuffer(opts)) opts = {buffer: opts} + + this.pageOffset = opts.pageOffset || 0 + this.pageSize = opts.pageSize || 1024 + this.pages = opts.pages || pager(this.pageSize) + + this.byteLength = this.pages.length * this.pageSize + this.length = 8 * this.byteLength + + if (!powerOfTwo(this.pageSize)) throw new Error('The page size should be a power of two') + + this._trackUpdates = !!opts.trackUpdates + this._pageMask = this.pageSize - 1 + + if (opts.buffer) { + for (var i = 0; i < opts.buffer.length; i += this.pageSize) { + this.pages.set(i / this.pageSize, opts.buffer.slice(i, i + this.pageSize)) + } + this.byteLength = opts.buffer.length + this.length = 8 * this.byteLength + } +} + +Bitfield.prototype.get = function (i) { + var o = i & 7 + var j = (i - o) / 8 + + return !!(this.getByte(j) & (128 >> o)) +} + +Bitfield.prototype.getByte = function (i) { + var o = i & this._pageMask + var j = (i - o) / this.pageSize + var page = this.pages.get(j, true) + + return page ? page.buffer[o + this.pageOffset] : 0 +} + +Bitfield.prototype.set = function (i, v) { + var o = i & 7 + var j = (i - o) / 8 + var b = this.getByte(j) + + return this.setByte(j, v ? b | (128 >> o) : b & (255 ^ (128 >> o))) +} + +Bitfield.prototype.toBuffer = function () { + var all = alloc(this.pages.length * this.pageSize) + + for (var i = 0; i < this.pages.length; i++) { + var next = this.pages.get(i, true) + var allOffset = i * this.pageSize + if (next) next.buffer.copy(all, allOffset, this.pageOffset, this.pageOffset + this.pageSize) + } + + return all +} + +Bitfield.prototype.setByte = function (i, b) { + var o = i & this._pageMask + var j = (i - o) / this.pageSize + var page = this.pages.get(j, false) + + o += this.pageOffset + + if (page.buffer[o] === b) return false + page.buffer[o] = b + + if (i >= this.byteLength) { + this.byteLength = i + 1 + this.length = this.byteLength * 8 + } + + if (this._trackUpdates) this.pages.updated(page) + + return true +} + +function alloc (n) { + if (Buffer.alloc) return Buffer.alloc(n) + var b = new Buffer(n) + b.fill(0) + return b +} + +function powerOfTwo (x) { + return !(x & (x - 1)) +} diff --git a/node_modules/sparse-bitfield/package.json b/node_modules/sparse-bitfield/package.json new file mode 100644 index 00000000..ddf61a52 --- /dev/null +++ b/node_modules/sparse-bitfield/package.json @@ -0,0 +1,55 @@ +{ + "_from": "sparse-bitfield@^3.0.3", + "_id": "sparse-bitfield@3.0.3", + "_inBundle": false, + "_integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "_location": "/sparse-bitfield", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "sparse-bitfield@^3.0.3", + "name": "sparse-bitfield", + "escapedName": "sparse-bitfield", + "rawSpec": "^3.0.3", + "saveSpec": null, + "fetchSpec": "^3.0.3" + }, + "_requiredBy": [ + "/saslprep" + ], + "_resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "_shasum": "ff4ae6e68656056ba4b3e792ab3334d38273ca11", + "_spec": "sparse-bitfield@^3.0.3", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\saslprep", + "author": { + "name": "Mathias Buus", + "url": "@mafintosh" + }, + "bugs": { + "url": "https://github.com/mafintosh/sparse-bitfield/issues" + }, + "bundleDependencies": false, + "dependencies": { + "memory-pager": "^1.0.2" + }, + "deprecated": false, + "description": "Bitfield that allocates a series of small buffers to support sparse bits without allocating a massive buffer", + "devDependencies": { + "buffer-alloc": "^1.1.0", + "standard": "^9.0.0", + "tape": "^4.6.3" + }, + "homepage": "https://github.com/mafintosh/sparse-bitfield", + "license": "MIT", + "main": "index.js", + "name": "sparse-bitfield", + "repository": { + "type": "git", + "url": "git+https://github.com/mafintosh/sparse-bitfield.git" + }, + "scripts": { + "test": "standard && tape test.js" + }, + "version": "3.0.3" +} diff --git a/node_modules/sparse-bitfield/test.js b/node_modules/sparse-bitfield/test.js new file mode 100644 index 00000000..ae42ef46 --- /dev/null +++ b/node_modules/sparse-bitfield/test.js @@ -0,0 +1,79 @@ +var alloc = require('buffer-alloc') +var tape = require('tape') +var bitfield = require('./') + +tape('set and get', function (t) { + var bits = bitfield() + + t.same(bits.get(0), false, 'first bit is false') + bits.set(0, true) + t.same(bits.get(0), true, 'first bit is true') + t.same(bits.get(1), false, 'second bit is false') + bits.set(0, false) + t.same(bits.get(0), false, 'first bit is reset') + t.end() +}) + +tape('set large and get', function (t) { + var bits = bitfield() + + t.same(bits.get(9999999999999), false, 'large bit is false') + bits.set(9999999999999, true) + t.same(bits.get(9999999999999), true, 'large bit is true') + t.same(bits.get(9999999999999 + 1), false, 'large bit + 1 is false') + bits.set(9999999999999, false) + t.same(bits.get(9999999999999), false, 'large bit is reset') + t.end() +}) + +tape('get and set buffer', function (t) { + var bits = bitfield({trackUpdates: true}) + + t.same(bits.pages.get(0, true), undefined) + t.same(bits.pages.get(Math.floor(9999999999999 / 8 / 1024), true), undefined) + bits.set(9999999999999, true) + + var bits2 = bitfield() + var upd = bits.pages.lastUpdate() + bits2.pages.set(Math.floor(upd.offset / 1024), upd.buffer) + t.same(bits2.get(9999999999999), true, 'bit is set') + t.end() +}) + +tape('toBuffer', function (t) { + var bits = bitfield() + + t.same(bits.toBuffer(), alloc(0)) + + bits.set(0, true) + + t.same(bits.toBuffer(), bits.pages.get(0).buffer) + + bits.set(9000, true) + + t.same(bits.toBuffer(), Buffer.concat([bits.pages.get(0).buffer, bits.pages.get(1).buffer])) + t.end() +}) + +tape('pass in buffer', function (t) { + var bits = bitfield() + + bits.set(0, true) + bits.set(9000, true) + + var clone = bitfield(bits.toBuffer()) + + t.same(clone.get(0), true) + t.same(clone.get(9000), true) + t.end() +}) + +tape('set small buffer', function (t) { + var buf = alloc(1) + buf[0] = 255 + var bits = bitfield(buf) + + t.same(bits.get(0), true) + t.same(bits.pages.get(0).buffer.length, bits.pageSize) + t.end() +}) diff --git a/node_modules/statuses/HISTORY.md b/node_modules/statuses/HISTORY.md new file mode 100644 index 00000000..a1977b29 --- /dev/null +++ b/node_modules/statuses/HISTORY.md @@ -0,0 +1,65 @@ +1.5.0 / 2018-03-27 +================== + + * Add `103 Early Hints` + +1.4.0 / 2017-10-20 +================== + + * Add `STATUS_CODES` export + +1.3.1 / 2016-11-11 +================== + + * Fix return type in JSDoc + +1.3.0 / 2016-05-17 +================== + + * Add `421 Misdirected Request` + * perf: enable strict mode + +1.2.1 / 2015-02-01 +================== + + * Fix message for status 451 + - `451 Unavailable For Legal Reasons` + +1.2.0 / 2014-09-28 +================== + + * Add `208 Already Repored` + * Add `226 IM Used` + * Add `306 (Unused)` + * Add `415 Unable For Legal Reasons` + * Add `508 Loop Detected` + +1.1.1 / 2014-09-24 +================== + + * Add missing 308 to `codes.json` + +1.1.0 / 2014-09-21 +================== + + * Add `codes.json` for universal support + +1.0.4 / 2014-08-20 +================== + + * Package cleanup + +1.0.3 / 2014-06-08 +================== + + * Add 308 to `.redirect` category + +1.0.2 / 2014-03-13 +================== + + * Add `.retry` category + +1.0.1 / 2014-03-12 +================== + + * Initial release diff --git a/node_modules/statuses/LICENSE b/node_modules/statuses/LICENSE new file mode 100644 index 00000000..28a31618 --- /dev/null +++ b/node_modules/statuses/LICENSE @@ -0,0 +1,23 @@ + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2016 Douglas Christopher Wilson + +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/node_modules/statuses/README.md b/node_modules/statuses/README.md new file mode 100644 index 00000000..0fe5720d --- /dev/null +++ b/node_modules/statuses/README.md @@ -0,0 +1,127 @@ +# Statuses + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +HTTP status utility for node. + +This module provides a list of status codes and messages sourced from +a few different projects: + + * The [IANA Status Code Registry](https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml) + * The [Node.js project](https://nodejs.org/) + * The [NGINX project](https://www.nginx.com/) + * The [Apache HTTP Server project](https://httpd.apache.org/) + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install statuses +``` + +## API + + + +```js +var status = require('statuses') +``` + +### var code = status(Integer || String) + +If `Integer` or `String` is a valid HTTP code or status message, then the +appropriate `code` will be returned. Otherwise, an error will be thrown. + + + +```js +status(403) // => 403 +status('403') // => 403 +status('forbidden') // => 403 +status('Forbidden') // => 403 +status(306) // throws, as it's not supported by node.js +``` + +### status.STATUS_CODES + +Returns an object which maps status codes to status messages, in +the same format as the +[Node.js http module](https://nodejs.org/dist/latest/docs/api/http.html#http_http_status_codes). + +### status.codes + +Returns an array of all the status codes as `Integer`s. + +### var msg = status[code] + +Map of `code` to `status message`. `undefined` for invalid `code`s. + + + +```js +status[404] // => 'Not Found' +``` + +### var code = status[msg] + +Map of `status message` to `code`. `msg` can either be title-cased or +lower-cased. `undefined` for invalid `status message`s. + + + +```js +status['not found'] // => 404 +status['Not Found'] // => 404 +``` + +### status.redirect[code] + +Returns `true` if a status code is a valid redirect status. + + + +```js +status.redirect[200] // => undefined +status.redirect[301] // => true +``` + +### status.empty[code] + +Returns `true` if a status code expects an empty body. + + + +```js +status.empty[200] // => undefined +status.empty[204] // => true +status.empty[304] // => true +``` + +### status.retry[code] + +Returns `true` if you should retry the rest. + + + +```js +status.retry[501] // => undefined +status.retry[503] // => true +``` + +[npm-image]: https://img.shields.io/npm/v/statuses.svg +[npm-url]: https://npmjs.org/package/statuses +[node-version-image]: https://img.shields.io/node/v/statuses.svg +[node-version-url]: https://nodejs.org/en/download +[travis-image]: https://img.shields.io/travis/jshttp/statuses.svg +[travis-url]: https://travis-ci.org/jshttp/statuses +[coveralls-image]: https://img.shields.io/coveralls/jshttp/statuses.svg +[coveralls-url]: https://coveralls.io/r/jshttp/statuses?branch=master +[downloads-image]: https://img.shields.io/npm/dm/statuses.svg +[downloads-url]: https://npmjs.org/package/statuses diff --git a/node_modules/statuses/codes.json b/node_modules/statuses/codes.json new file mode 100644 index 00000000..a09283a2 --- /dev/null +++ b/node_modules/statuses/codes.json @@ -0,0 +1,66 @@ +{ + "100": "Continue", + "101": "Switching Protocols", + "102": "Processing", + "103": "Early Hints", + "200": "OK", + "201": "Created", + "202": "Accepted", + "203": "Non-Authoritative Information", + "204": "No Content", + "205": "Reset Content", + "206": "Partial Content", + "207": "Multi-Status", + "208": "Already Reported", + "226": "IM Used", + "300": "Multiple Choices", + "301": "Moved Permanently", + "302": "Found", + "303": "See Other", + "304": "Not Modified", + "305": "Use Proxy", + "306": "(Unused)", + "307": "Temporary Redirect", + "308": "Permanent Redirect", + "400": "Bad Request", + "401": "Unauthorized", + "402": "Payment Required", + "403": "Forbidden", + "404": "Not Found", + "405": "Method Not Allowed", + "406": "Not Acceptable", + "407": "Proxy Authentication Required", + "408": "Request Timeout", + "409": "Conflict", + "410": "Gone", + "411": "Length Required", + "412": "Precondition Failed", + "413": "Payload Too Large", + "414": "URI Too Long", + "415": "Unsupported Media Type", + "416": "Range Not Satisfiable", + "417": "Expectation Failed", + "418": "I'm a teapot", + "421": "Misdirected Request", + "422": "Unprocessable Entity", + "423": "Locked", + "424": "Failed Dependency", + "425": "Unordered Collection", + "426": "Upgrade Required", + "428": "Precondition Required", + "429": "Too Many Requests", + "431": "Request Header Fields Too Large", + "451": "Unavailable For Legal Reasons", + "500": "Internal Server Error", + "501": "Not Implemented", + "502": "Bad Gateway", + "503": "Service Unavailable", + "504": "Gateway Timeout", + "505": "HTTP Version Not Supported", + "506": "Variant Also Negotiates", + "507": "Insufficient Storage", + "508": "Loop Detected", + "509": "Bandwidth Limit Exceeded", + "510": "Not Extended", + "511": "Network Authentication Required" +} diff --git a/node_modules/statuses/index.js b/node_modules/statuses/index.js new file mode 100644 index 00000000..4df469a0 --- /dev/null +++ b/node_modules/statuses/index.js @@ -0,0 +1,113 @@ +/*! + * statuses + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var codes = require('./codes.json') + +/** + * Module exports. + * @public + */ + +module.exports = status + +// status code to message map +status.STATUS_CODES = codes + +// array of status codes +status.codes = populateStatusesMap(status, codes) + +// status codes for redirects +status.redirect = { + 300: true, + 301: true, + 302: true, + 303: true, + 305: true, + 307: true, + 308: true +} + +// status codes for empty bodies +status.empty = { + 204: true, + 205: true, + 304: true +} + +// status codes for when you should retry the request +status.retry = { + 502: true, + 503: true, + 504: true +} + +/** + * Populate the statuses map for given codes. + * @private + */ + +function populateStatusesMap (statuses, codes) { + var arr = [] + + Object.keys(codes).forEach(function forEachCode (code) { + var message = codes[code] + var status = Number(code) + + // Populate properties + statuses[status] = message + statuses[message] = status + statuses[message.toLowerCase()] = status + + // Add to array + arr.push(status) + }) + + return arr +} + +/** + * Get the status code. + * + * Given a number, this will throw if it is not a known status + * code, otherwise the code will be returned. Given a string, + * the string will be parsed for a number and return the code + * if valid, otherwise will lookup the code assuming this is + * the status message. + * + * @param {string|number} code + * @returns {number} + * @public + */ + +function status (code) { + if (typeof code === 'number') { + if (!status[code]) throw new Error('invalid status code: ' + code) + return code + } + + if (typeof code !== 'string') { + throw new TypeError('code must be a number or string') + } + + // '403' + var n = parseInt(code, 10) + if (!isNaN(n)) { + if (!status[n]) throw new Error('invalid status code: ' + n) + return n + } + + n = status[code.toLowerCase()] + if (!n) throw new Error('invalid status message: "' + code + '"') + return n +} diff --git a/node_modules/statuses/package.json b/node_modules/statuses/package.json new file mode 100644 index 00000000..89e0b15a --- /dev/null +++ b/node_modules/statuses/package.json @@ -0,0 +1,90 @@ +{ + "_from": "statuses@~1.5.0", + "_id": "statuses@1.5.0", + "_inBundle": false, + "_integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "_location": "/statuses", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "statuses@~1.5.0", + "name": "statuses", + "escapedName": "statuses", + "rawSpec": "~1.5.0", + "saveSpec": null, + "fetchSpec": "~1.5.0" + }, + "_requiredBy": [ + "/express", + "/finalhandler", + "/http-errors", + "/send" + ], + "_resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "_shasum": "161c7dac177659fd9811f43771fa99381478628c", + "_spec": "statuses@~1.5.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "bugs": { + "url": "https://github.com/jshttp/statuses/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "deprecated": false, + "description": "HTTP status utility", + "devDependencies": { + "csv-parse": "1.2.4", + "eslint": "4.19.1", + "eslint-config-standard": "11.0.0", + "eslint-plugin-import": "2.9.0", + "eslint-plugin-markdown": "1.0.0-beta.6", + "eslint-plugin-node": "6.0.1", + "eslint-plugin-promise": "3.7.0", + "eslint-plugin-standard": "3.0.1", + "istanbul": "0.4.5", + "mocha": "1.21.5", + "raw-body": "2.3.2", + "stream-to-array": "2.3.0" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "HISTORY.md", + "index.js", + "codes.json", + "LICENSE" + ], + "homepage": "https://github.com/jshttp/statuses#readme", + "keywords": [ + "http", + "status", + "code" + ], + "license": "MIT", + "name": "statuses", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/statuses.git" + }, + "scripts": { + "build": "node scripts/build.js", + "fetch": "node scripts/fetch-apache.js && node scripts/fetch-iana.js && node scripts/fetch-nginx.js && node scripts/fetch-node.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "update": "npm run fetch && npm run build" + }, + "version": "1.5.0" +} diff --git a/node_modules/string_decoder/.travis.yml b/node_modules/string_decoder/.travis.yml new file mode 100644 index 00000000..3347a725 --- /dev/null +++ b/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/node_modules/string_decoder/LICENSE b/node_modules/string_decoder/LICENSE new file mode 100644 index 00000000..778edb20 --- /dev/null +++ b/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +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/node_modules/string_decoder/README.md b/node_modules/string_decoder/README.md new file mode 100644 index 00000000..5fd58315 --- /dev/null +++ b/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/node_modules/string_decoder/lib/string_decoder.js b/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 00000000..2e89e63f --- /dev/null +++ b/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/node_modules/string_decoder/package.json b/node_modules/string_decoder/package.json new file mode 100644 index 00000000..398ebd89 --- /dev/null +++ b/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "_location": "/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/node_modules/toidentifier/LICENSE b/node_modules/toidentifier/LICENSE new file mode 100644 index 00000000..de22d159 --- /dev/null +++ b/node_modules/toidentifier/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Douglas Christopher Wilson + +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/node_modules/toidentifier/README.md b/node_modules/toidentifier/README.md new file mode 100644 index 00000000..7c8794e2 --- /dev/null +++ b/node_modules/toidentifier/README.md @@ -0,0 +1,61 @@ +# toidentifier + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][codecov-image]][codecov-url] + +> Convert a string of words to a JavaScript identifier + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```bash +$ npm install toidentifier +``` + +## Example + +```js +var toIdentifier = require('toidentifier') + +console.log(toIdentifier('Bad Request')) +// => "BadRequest" +``` + +## API + +This CommonJS module exports a single default function: `toIdentifier`. + +### toIdentifier(string) + +Given a string as the argument, it will be transformed according to +the following rules and the new string will be returned: + +1. Split into words separated by space characters (`0x20`). +2. Upper case the first character of each word. +3. Join the words together with no separator. +4. Remove all non-word (`[0-9a-z_]`) characters. + +## License + +[MIT](LICENSE) + +[codecov-image]: https://img.shields.io/codecov/c/github/component/toidentifier.svg +[codecov-url]: https://codecov.io/gh/component/toidentifier +[downloads-image]: https://img.shields.io/npm/dm/toidentifier.svg +[downloads-url]: https://npmjs.org/package/toidentifier +[npm-image]: https://img.shields.io/npm/v/toidentifier.svg +[npm-url]: https://npmjs.org/package/toidentifier +[travis-image]: https://img.shields.io/travis/component/toidentifier/master.svg +[travis-url]: https://travis-ci.org/component/toidentifier + + +## + +[npm]: https://www.npmjs.com/ + +[yarn]: https://yarnpkg.com/ diff --git a/node_modules/toidentifier/index.js b/node_modules/toidentifier/index.js new file mode 100644 index 00000000..bba54114 --- /dev/null +++ b/node_modules/toidentifier/index.js @@ -0,0 +1,30 @@ +/*! + * toidentifier + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + */ + +/** + * Module exports. + * @public + */ + +module.exports = toIdentifier + +/** + * Trasform the given string into a JavaScript identifier + * + * @param {string} str + * @returns {string} + * @public + */ + +function toIdentifier (str) { + return str + .split(' ') + .map(function (token) { + return token.slice(0, 1).toUpperCase() + token.slice(1) + }) + .join('') + .replace(/[^ _0-9a-z]/gi, '') +} diff --git a/node_modules/toidentifier/package.json b/node_modules/toidentifier/package.json new file mode 100644 index 00000000..225dd9ea --- /dev/null +++ b/node_modules/toidentifier/package.json @@ -0,0 +1,76 @@ +{ + "_from": "toidentifier@1.0.0", + "_id": "toidentifier@1.0.0", + "_inBundle": false, + "_integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "_location": "/toidentifier", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "toidentifier@1.0.0", + "name": "toidentifier", + "escapedName": "toidentifier", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/http-errors" + ], + "_resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "_shasum": "7e1be3470f1e77948bc43d94a3c8f4d7752ba553", + "_spec": "toidentifier@1.0.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\http-errors", + "author": { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + "bugs": { + "url": "https://github.com/component/toidentifier/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Nick Baugh", + "email": "niftylettuce@gmail.com", + "url": "http://niftylettuce.com/" + } + ], + "deprecated": false, + "description": "Convert a string of words to a JavaScript identifier", + "devDependencies": { + "eslint": "4.19.1", + "eslint-config-standard": "11.0.0", + "eslint-plugin-import": "2.11.0", + "eslint-plugin-markdown": "1.0.0-beta.6", + "eslint-plugin-node": "6.0.1", + "eslint-plugin-promise": "3.7.0", + "eslint-plugin-standard": "3.1.0", + "mocha": "1.21.5", + "nyc": "11.8.0" + }, + "engines": { + "node": ">=0.6" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/component/toidentifier#readme", + "license": "MIT", + "name": "toidentifier", + "repository": { + "type": "git", + "url": "git+https://github.com/component/toidentifier.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "nyc --reporter=html --reporter=text npm test" + }, + "version": "1.0.0" +} diff --git a/node_modules/type-is/HISTORY.md b/node_modules/type-is/HISTORY.md new file mode 100644 index 00000000..8de21f7a --- /dev/null +++ b/node_modules/type-is/HISTORY.md @@ -0,0 +1,259 @@ +1.6.18 / 2019-04-26 +=================== + + * Fix regression passing request object to `typeis.is` + +1.6.17 / 2019-04-25 +=================== + + * deps: mime-types@~2.1.24 + - Add Apple file extensions from IANA + - Add extension `.csl` to `application/vnd.citationstyles.style+xml` + - Add extension `.es` to `application/ecmascript` + - Add extension `.nq` to `application/n-quads` + - Add extension `.nt` to `application/n-triples` + - Add extension `.owl` to `application/rdf+xml` + - Add extensions `.siv` and `.sieve` to `application/sieve` + - Add extensions from IANA for `image/*` types + - Add extensions from IANA for `model/*` types + - Add extensions to HEIC image types + - Add new mime types + - Add `text/mdx` with extension `.mdx` + * perf: prevent internal `throw` on invalid type + +1.6.16 / 2018-02-16 +=================== + + * deps: mime-types@~2.1.18 + - Add `application/raml+yaml` with extension `.raml` + - Add `application/wasm` with extension `.wasm` + - Add `text/shex` with extension `.shex` + - Add extensions for JPEG-2000 images + - Add extensions from IANA for `message/*` types + - Add extension `.mjs` to `application/javascript` + - Add extension `.wadl` to `application/vnd.sun.wadl+xml` + - Add extension `.gz` to `application/gzip` + - Add glTF types and extensions + - Add new mime types + - Update extensions `.md` and `.markdown` to be `text/markdown` + - Update font MIME types + - Update `text/hjson` to registered `application/hjson` + +1.6.15 / 2017-03-31 +=================== + + * deps: mime-types@~2.1.15 + - Add new mime types + +1.6.14 / 2016-11-18 +=================== + + * deps: mime-types@~2.1.13 + - Add new mime types + +1.6.13 / 2016-05-18 +=================== + + * deps: mime-types@~2.1.11 + - Add new mime types + +1.6.12 / 2016-02-28 +=================== + + * deps: mime-types@~2.1.10 + - Add new mime types + - Fix extension of `application/dash+xml` + - Update primary extension for `audio/mp4` + +1.6.11 / 2016-01-29 +=================== + + * deps: mime-types@~2.1.9 + - Add new mime types + +1.6.10 / 2015-12-01 +=================== + + * deps: mime-types@~2.1.8 + - Add new mime types + +1.6.9 / 2015-09-27 +================== + + * deps: mime-types@~2.1.7 + - Add new mime types + +1.6.8 / 2015-09-04 +================== + + * deps: mime-types@~2.1.6 + - Add new mime types + +1.6.7 / 2015-08-20 +================== + + * Fix type error when given invalid type to match against + * deps: mime-types@~2.1.5 + - Add new mime types + +1.6.6 / 2015-07-31 +================== + + * deps: mime-types@~2.1.4 + - Add new mime types + +1.6.5 / 2015-07-16 +================== + + * deps: mime-types@~2.1.3 + - Add new mime types + +1.6.4 / 2015-07-01 +================== + + * deps: mime-types@~2.1.2 + - Add new mime types + * perf: enable strict mode + * perf: remove argument reassignment + +1.6.3 / 2015-06-08 +================== + + * deps: mime-types@~2.1.1 + - Add new mime types + * perf: reduce try block size + * perf: remove bitwise operations + +1.6.2 / 2015-05-10 +================== + + * deps: mime-types@~2.0.11 + - Add new mime types + +1.6.1 / 2015-03-13 +================== + + * deps: mime-types@~2.0.10 + - Add new mime types + +1.6.0 / 2015-02-12 +================== + + * fix false-positives in `hasBody` `Transfer-Encoding` check + * support wildcard for both type and subtype (`*/*`) + +1.5.7 / 2015-02-09 +================== + + * fix argument reassignment + * deps: mime-types@~2.0.9 + - Add new mime types + +1.5.6 / 2015-01-29 +================== + + * deps: mime-types@~2.0.8 + - Add new mime types + +1.5.5 / 2014-12-30 +================== + + * deps: mime-types@~2.0.7 + - Add new mime types + - Fix missing extensions + - Fix various invalid MIME type entries + - Remove example template MIME types + - deps: mime-db@~1.5.0 + +1.5.4 / 2014-12-10 +================== + + * deps: mime-types@~2.0.4 + - Add new mime types + - deps: mime-db@~1.3.0 + +1.5.3 / 2014-11-09 +================== + + * deps: mime-types@~2.0.3 + - Add new mime types + - deps: mime-db@~1.2.0 + +1.5.2 / 2014-09-28 +================== + + * deps: mime-types@~2.0.2 + - Add new mime types + - deps: mime-db@~1.1.0 + +1.5.1 / 2014-09-07 +================== + + * Support Node.js 0.6 + * deps: media-typer@0.3.0 + * deps: mime-types@~2.0.1 + - Support Node.js 0.6 + +1.5.0 / 2014-09-05 +================== + + * fix `hasbody` to be true for `content-length: 0` + +1.4.0 / 2014-09-02 +================== + + * update mime-types + +1.3.2 / 2014-06-24 +================== + + * use `~` range on mime-types + +1.3.1 / 2014-06-19 +================== + + * fix global variable leak + +1.3.0 / 2014-06-19 +================== + + * improve type parsing + + - invalid media type never matches + - media type not case-sensitive + - extra LWS does not affect results + +1.2.2 / 2014-06-19 +================== + + * fix behavior on unknown type argument + +1.2.1 / 2014-06-03 +================== + + * switch dependency from `mime` to `mime-types@1.0.0` + +1.2.0 / 2014-05-11 +================== + + * support suffix matching: + + - `+json` matches `application/vnd+json` + - `*/vnd+json` matches `application/vnd+json` + - `application/*+json` matches `application/vnd+json` + +1.1.0 / 2014-04-12 +================== + + * add non-array values support + * expose internal utilities: + + - `.is()` + - `.hasBody()` + - `.normalize()` + - `.match()` + +1.0.1 / 2014-03-30 +================== + + * add `multipart` as a shorthand diff --git a/node_modules/type-is/LICENSE b/node_modules/type-is/LICENSE new file mode 100644 index 00000000..386b7b69 --- /dev/null +++ b/node_modules/type-is/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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/node_modules/type-is/README.md b/node_modules/type-is/README.md new file mode 100644 index 00000000..b85ef8f7 --- /dev/null +++ b/node_modules/type-is/README.md @@ -0,0 +1,170 @@ +# type-is + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Infer the content-type of a request. + +### Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install type-is +``` + +## API + +```js +var http = require('http') +var typeis = require('type-is') + +http.createServer(function (req, res) { + var istext = typeis(req, ['text/*']) + res.end('you ' + (istext ? 'sent' : 'did not send') + ' me text') +}) +``` + +### typeis(request, types) + +Checks if the `request` is one of the `types`. If the request has no body, +even if there is a `Content-Type` header, then `null` is returned. If the +`Content-Type` header is invalid or does not matches any of the `types`, then +`false` is returned. Otherwise, a string of the type that matched is returned. + +The `request` argument is expected to be a Node.js HTTP request. The `types` +argument is an array of type strings. + +Each type in the `types` array can be one of the following: + +- A file extension name such as `json`. This name will be returned if matched. +- A mime type such as `application/json`. +- A mime type with a wildcard such as `*/*` or `*/json` or `application/*`. + The full mime type will be returned if matched. +- A suffix such as `+json`. This can be combined with a wildcard such as + `*/vnd+json` or `application/*+json`. The full mime type will be returned + if matched. + +Some examples to illustrate the inputs and returned value: + + + +```js +// req.headers.content-type = 'application/json' + +typeis(req, ['json']) // => 'json' +typeis(req, ['html', 'json']) // => 'json' +typeis(req, ['application/*']) // => 'application/json' +typeis(req, ['application/json']) // => 'application/json' + +typeis(req, ['html']) // => false +``` + +### typeis.hasBody(request) + +Returns a Boolean if the given `request` has a body, regardless of the +`Content-Type` header. + +Having a body has no relation to how large the body is (it may be 0 bytes). +This is similar to how file existence works. If a body does exist, then this +indicates that there is data to read from the Node.js request stream. + + + +```js +if (typeis.hasBody(req)) { + // read the body, since there is one + + req.on('data', function (chunk) { + // ... + }) +} +``` + +### typeis.is(mediaType, types) + +Checks if the `mediaType` is one of the `types`. If the `mediaType` is invalid +or does not matches any of the `types`, then `false` is returned. Otherwise, a +string of the type that matched is returned. + +The `mediaType` argument is expected to be a +[media type](https://tools.ietf.org/html/rfc6838) string. The `types` argument +is an array of type strings. + +Each type in the `types` array can be one of the following: + +- A file extension name such as `json`. This name will be returned if matched. +- A mime type such as `application/json`. +- A mime type with a wildcard such as `*/*` or `*/json` or `application/*`. + The full mime type will be returned if matched. +- A suffix such as `+json`. This can be combined with a wildcard such as + `*/vnd+json` or `application/*+json`. The full mime type will be returned + if matched. + +Some examples to illustrate the inputs and returned value: + + + +```js +var mediaType = 'application/json' + +typeis.is(mediaType, ['json']) // => 'json' +typeis.is(mediaType, ['html', 'json']) // => 'json' +typeis.is(mediaType, ['application/*']) // => 'application/json' +typeis.is(mediaType, ['application/json']) // => 'application/json' + +typeis.is(mediaType, ['html']) // => false +``` + +## Examples + +### Example body parser + +```js +var express = require('express') +var typeis = require('type-is') + +var app = express() + +app.use(function bodyParser (req, res, next) { + if (!typeis.hasBody(req)) { + return next() + } + + switch (typeis(req, ['urlencoded', 'json', 'multipart'])) { + case 'urlencoded': + // parse urlencoded body + throw new Error('implement urlencoded body parsing') + case 'json': + // parse json body + throw new Error('implement json body parsing') + case 'multipart': + // parse multipart body + throw new Error('implement multipart body parsing') + default: + // 415 error code + res.statusCode = 415 + res.end() + break + } +}) +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/type-is/master +[coveralls-url]: https://coveralls.io/r/jshttp/type-is?branch=master +[node-version-image]: https://badgen.net/npm/node/type-is +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/type-is +[npm-url]: https://npmjs.org/package/type-is +[npm-version-image]: https://badgen.net/npm/v/type-is +[travis-image]: https://badgen.net/travis/jshttp/type-is/master +[travis-url]: https://travis-ci.org/jshttp/type-is diff --git a/node_modules/type-is/index.js b/node_modules/type-is/index.js new file mode 100644 index 00000000..890ad76c --- /dev/null +++ b/node_modules/type-is/index.js @@ -0,0 +1,266 @@ +/*! + * type-is + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var typer = require('media-typer') +var mime = require('mime-types') + +/** + * Module exports. + * @public + */ + +module.exports = typeofrequest +module.exports.is = typeis +module.exports.hasBody = hasbody +module.exports.normalize = normalize +module.exports.match = mimeMatch + +/** + * Compare a `value` content-type with `types`. + * Each `type` can be an extension like `html`, + * a special shortcut like `multipart` or `urlencoded`, + * or a mime type. + * + * If no types match, `false` is returned. + * Otherwise, the first `type` that matches is returned. + * + * @param {String} value + * @param {Array} types + * @public + */ + +function typeis (value, types_) { + var i + var types = types_ + + // remove parameters and normalize + var val = tryNormalizeType(value) + + // no type or invalid + if (!val) { + return false + } + + // support flattened arguments + if (types && !Array.isArray(types)) { + types = new Array(arguments.length - 1) + for (i = 0; i < types.length; i++) { + types[i] = arguments[i + 1] + } + } + + // no types, return the content type + if (!types || !types.length) { + return val + } + + var type + for (i = 0; i < types.length; i++) { + if (mimeMatch(normalize(type = types[i]), val)) { + return type[0] === '+' || type.indexOf('*') !== -1 + ? val + : type + } + } + + // no matches + return false +} + +/** + * Check if a request has a request body. + * A request with a body __must__ either have `transfer-encoding` + * or `content-length` headers set. + * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 + * + * @param {Object} request + * @return {Boolean} + * @public + */ + +function hasbody (req) { + return req.headers['transfer-encoding'] !== undefined || + !isNaN(req.headers['content-length']) +} + +/** + * Check if the incoming request contains the "Content-Type" + * header field, and it contains any of the give mime `type`s. + * If there is no request body, `null` is returned. + * If there is no content type, `false` is returned. + * Otherwise, it returns the first `type` that matches. + * + * Examples: + * + * // With Content-Type: text/html; charset=utf-8 + * this.is('html'); // => 'html' + * this.is('text/html'); // => 'text/html' + * this.is('text/*', 'application/json'); // => 'text/html' + * + * // When Content-Type is application/json + * this.is('json', 'urlencoded'); // => 'json' + * this.is('application/json'); // => 'application/json' + * this.is('html', 'application/*'); // => 'application/json' + * + * this.is('html'); // => false + * + * @param {String|Array} types... + * @return {String|false|null} + * @public + */ + +function typeofrequest (req, types_) { + var types = types_ + + // no body + if (!hasbody(req)) { + return null + } + + // support flattened arguments + if (arguments.length > 2) { + types = new Array(arguments.length - 1) + for (var i = 0; i < types.length; i++) { + types[i] = arguments[i + 1] + } + } + + // request content type + var value = req.headers['content-type'] + + return typeis(value, types) +} + +/** + * Normalize a mime type. + * If it's a shorthand, expand it to a valid mime type. + * + * In general, you probably want: + * + * var type = is(req, ['urlencoded', 'json', 'multipart']); + * + * Then use the appropriate body parsers. + * These three are the most common request body types + * and are thus ensured to work. + * + * @param {String} type + * @private + */ + +function normalize (type) { + if (typeof type !== 'string') { + // invalid type + return false + } + + switch (type) { + case 'urlencoded': + return 'application/x-www-form-urlencoded' + case 'multipart': + return 'multipart/*' + } + + if (type[0] === '+') { + // "+json" -> "*/*+json" expando + return '*/*' + type + } + + return type.indexOf('/') === -1 + ? mime.lookup(type) + : type +} + +/** + * Check if `expected` mime type + * matches `actual` mime type with + * wildcard and +suffix support. + * + * @param {String} expected + * @param {String} actual + * @return {Boolean} + * @private + */ + +function mimeMatch (expected, actual) { + // invalid type + if (expected === false) { + return false + } + + // split types + var actualParts = actual.split('/') + var expectedParts = expected.split('/') + + // invalid format + if (actualParts.length !== 2 || expectedParts.length !== 2) { + return false + } + + // validate type + if (expectedParts[0] !== '*' && expectedParts[0] !== actualParts[0]) { + return false + } + + // validate suffix wildcard + if (expectedParts[1].substr(0, 2) === '*+') { + return expectedParts[1].length <= actualParts[1].length + 1 && + expectedParts[1].substr(1) === actualParts[1].substr(1 - expectedParts[1].length) + } + + // validate subtype + if (expectedParts[1] !== '*' && expectedParts[1] !== actualParts[1]) { + return false + } + + return true +} + +/** + * Normalize a type and remove parameters. + * + * @param {string} value + * @return {string} + * @private + */ + +function normalizeType (value) { + // parse the type + var type = typer.parse(value) + + // remove the parameters + type.parameters = undefined + + // reformat it + return typer.format(type) +} + +/** + * Try to normalize a type and remove parameters. + * + * @param {string} value + * @return {string} + * @private + */ + +function tryNormalizeType (value) { + if (!value) { + return null + } + + try { + return normalizeType(value) + } catch (err) { + return null + } +} diff --git a/node_modules/type-is/package.json b/node_modules/type-is/package.json new file mode 100644 index 00000000..13d61d2a --- /dev/null +++ b/node_modules/type-is/package.json @@ -0,0 +1,85 @@ +{ + "_from": "type-is@~1.6.18", + "_id": "type-is@1.6.18", + "_inBundle": false, + "_integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "_location": "/type-is", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "type-is@~1.6.18", + "name": "type-is", + "escapedName": "type-is", + "rawSpec": "~1.6.18", + "saveSpec": null, + "fetchSpec": "~1.6.18" + }, + "_requiredBy": [ + "/express", + "/express/body-parser" + ], + "_resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "_shasum": "4e552cd05df09467dcbc4ef739de89f2cf37c131", + "_spec": "type-is@~1.6.18", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "bugs": { + "url": "https://github.com/jshttp/type-is/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Jonathan Ong", + "email": "me@jongleberry.com", + "url": "http://jongleberry.com" + } + ], + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "deprecated": false, + "description": "Infer the content-type of a request.", + "devDependencies": { + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "mocha": "6.1.4", + "nyc": "14.0.0" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "index.js" + ], + "homepage": "https://github.com/jshttp/type-is#readme", + "keywords": [ + "content", + "type", + "checking" + ], + "license": "MIT", + "name": "type-is", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/type-is.git" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "test-travis": "nyc --reporter=text npm test" + }, + "version": "1.6.18" +} diff --git a/node_modules/unpipe/HISTORY.md b/node_modules/unpipe/HISTORY.md new file mode 100644 index 00000000..85e0f8d7 --- /dev/null +++ b/node_modules/unpipe/HISTORY.md @@ -0,0 +1,4 @@ +1.0.0 / 2015-06-14 +================== + + * Initial release diff --git a/node_modules/unpipe/LICENSE b/node_modules/unpipe/LICENSE new file mode 100644 index 00000000..aed01382 --- /dev/null +++ b/node_modules/unpipe/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +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/node_modules/unpipe/README.md b/node_modules/unpipe/README.md new file mode 100644 index 00000000..e536ad2c --- /dev/null +++ b/node_modules/unpipe/README.md @@ -0,0 +1,43 @@ +# unpipe + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Unpipe a stream from all destinations. + +## Installation + +```sh +$ npm install unpipe +``` + +## API + +```js +var unpipe = require('unpipe') +``` + +### unpipe(stream) + +Unpipes all destinations from a given stream. With stream 2+, this is +equivalent to `stream.unpipe()`. When used with streams 1 style streams +(typically Node.js 0.8 and below), this module attempts to undo the +actions done in `stream.pipe(dest)`. + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/unpipe.svg +[npm-url]: https://npmjs.org/package/unpipe +[node-image]: https://img.shields.io/node/v/unpipe.svg +[node-url]: http://nodejs.org/download/ +[travis-image]: https://img.shields.io/travis/stream-utils/unpipe.svg +[travis-url]: https://travis-ci.org/stream-utils/unpipe +[coveralls-image]: https://img.shields.io/coveralls/stream-utils/unpipe.svg +[coveralls-url]: https://coveralls.io/r/stream-utils/unpipe?branch=master +[downloads-image]: https://img.shields.io/npm/dm/unpipe.svg +[downloads-url]: https://npmjs.org/package/unpipe diff --git a/node_modules/unpipe/index.js b/node_modules/unpipe/index.js new file mode 100644 index 00000000..15c3d97a --- /dev/null +++ b/node_modules/unpipe/index.js @@ -0,0 +1,69 @@ +/*! + * unpipe + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = unpipe + +/** + * Determine if there are Node.js pipe-like data listeners. + * @private + */ + +function hasPipeDataListeners(stream) { + var listeners = stream.listeners('data') + + for (var i = 0; i < listeners.length; i++) { + if (listeners[i].name === 'ondata') { + return true + } + } + + return false +} + +/** + * Unpipe a stream from all destinations. + * + * @param {object} stream + * @public + */ + +function unpipe(stream) { + if (!stream) { + throw new TypeError('argument stream is required') + } + + if (typeof stream.unpipe === 'function') { + // new-style + stream.unpipe() + return + } + + // Node.js 0.8 hack + if (!hasPipeDataListeners(stream)) { + return + } + + var listener + var listeners = stream.listeners('close') + + for (var i = 0; i < listeners.length; i++) { + listener = listeners[i] + + if (listener.name !== 'cleanup' && listener.name !== 'onclose') { + continue + } + + // invoke the listener + listener.call(stream) + } +} diff --git a/node_modules/unpipe/package.json b/node_modules/unpipe/package.json new file mode 100644 index 00000000..552abe57 --- /dev/null +++ b/node_modules/unpipe/package.json @@ -0,0 +1,63 @@ +{ + "_from": "unpipe@1.0.0", + "_id": "unpipe@1.0.0", + "_inBundle": false, + "_integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "_location": "/unpipe", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "unpipe@1.0.0", + "name": "unpipe", + "escapedName": "unpipe", + "rawSpec": "1.0.0", + "saveSpec": null, + "fetchSpec": "1.0.0" + }, + "_requiredBy": [ + "/finalhandler", + "/raw-body" + ], + "_resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "_shasum": "b2bf4ee8514aae6165b4817829d21b2ef49904ec", + "_spec": "unpipe@1.0.0", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\raw-body", + "author": { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + "bugs": { + "url": "https://github.com/stream-utils/unpipe/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Unpipe a stream from all destinations", + "devDependencies": { + "istanbul": "0.3.15", + "mocha": "2.2.5", + "readable-stream": "1.1.13" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "index.js" + ], + "homepage": "https://github.com/stream-utils/unpipe#readme", + "license": "MIT", + "name": "unpipe", + "repository": { + "type": "git", + "url": "git+https://github.com/stream-utils/unpipe.git" + }, + "scripts": { + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "1.0.0" +} diff --git a/node_modules/util-deprecate/History.md b/node_modules/util-deprecate/History.md new file mode 100644 index 00000000..acc86753 --- /dev/null +++ b/node_modules/util-deprecate/History.md @@ -0,0 +1,16 @@ + +1.0.2 / 2015-10-07 +================== + + * use try/catch when checking `localStorage` (#3, @kumavis) + +1.0.1 / 2014-11-25 +================== + + * browser: use `console.warn()` for deprecation calls + * browser: more jsdocs + +1.0.0 / 2014-04-30 +================== + + * initial commit diff --git a/node_modules/util-deprecate/LICENSE b/node_modules/util-deprecate/LICENSE new file mode 100644 index 00000000..6a60e8c2 --- /dev/null +++ b/node_modules/util-deprecate/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +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/node_modules/util-deprecate/README.md b/node_modules/util-deprecate/README.md new file mode 100644 index 00000000..75622fa7 --- /dev/null +++ b/node_modules/util-deprecate/README.md @@ -0,0 +1,53 @@ +util-deprecate +============== +### The Node.js `util.deprecate()` function with browser support + +In Node.js, this module simply re-exports the `util.deprecate()` function. + +In the web browser (i.e. via browserify), a browser-specific implementation +of the `util.deprecate()` function is used. + + +## API + +A `deprecate()` function is the only thing exposed by this module. + +``` javascript +// setup: +exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead'); + + +// users see: +foo(); +// foo() is deprecated, use bar() instead +foo(); +foo(); +``` + + +## License + +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +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/node_modules/util-deprecate/browser.js b/node_modules/util-deprecate/browser.js new file mode 100644 index 00000000..549ae2f0 --- /dev/null +++ b/node_modules/util-deprecate/browser.js @@ -0,0 +1,67 @@ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} diff --git a/node_modules/util-deprecate/node.js b/node_modules/util-deprecate/node.js new file mode 100644 index 00000000..5e6fcff5 --- /dev/null +++ b/node_modules/util-deprecate/node.js @@ -0,0 +1,6 @@ + +/** + * For Node.js, simply re-export the core `util.deprecate` function. + */ + +module.exports = require('util').deprecate; diff --git a/node_modules/util-deprecate/package.json b/node_modules/util-deprecate/package.json new file mode 100644 index 00000000..f2a19a86 --- /dev/null +++ b/node_modules/util-deprecate/package.json @@ -0,0 +1,56 @@ +{ + "_from": "util-deprecate@~1.0.1", + "_id": "util-deprecate@1.0.2", + "_inBundle": false, + "_integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "_location": "/util-deprecate", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "util-deprecate@~1.0.1", + "name": "util-deprecate", + "escapedName": "util-deprecate", + "rawSpec": "~1.0.1", + "saveSpec": null, + "fetchSpec": "~1.0.1" + }, + "_requiredBy": [ + "/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "_shasum": "450d4dc9fa70de732762fbd2d4a28981419a0ccf", + "_spec": "util-deprecate@~1.0.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\readable-stream", + "author": { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://n8.io/" + }, + "browser": "browser.js", + "bugs": { + "url": "https://github.com/TooTallNate/util-deprecate/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "The Node.js `util.deprecate()` function with browser support", + "homepage": "https://github.com/TooTallNate/util-deprecate", + "keywords": [ + "util", + "deprecate", + "browserify", + "browser", + "node" + ], + "license": "MIT", + "main": "node.js", + "name": "util-deprecate", + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/util-deprecate.git" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "version": "1.0.2" +} diff --git a/node_modules/utils-merge/.npmignore b/node_modules/utils-merge/.npmignore new file mode 100644 index 00000000..3e538441 --- /dev/null +++ b/node_modules/utils-merge/.npmignore @@ -0,0 +1,9 @@ +CONTRIBUTING.md +Makefile +docs/ +examples/ +reports/ +test/ + +.jshintrc +.travis.yml diff --git a/node_modules/utils-merge/LICENSE b/node_modules/utils-merge/LICENSE new file mode 100644 index 00000000..76f6d083 --- /dev/null +++ b/node_modules/utils-merge/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013-2017 Jared Hanson + +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/node_modules/utils-merge/README.md b/node_modules/utils-merge/README.md new file mode 100644 index 00000000..0cb71171 --- /dev/null +++ b/node_modules/utils-merge/README.md @@ -0,0 +1,34 @@ +# utils-merge + +[![Version](https://img.shields.io/npm/v/utils-merge.svg?label=version)](https://www.npmjs.com/package/utils-merge) +[![Build](https://img.shields.io/travis/jaredhanson/utils-merge.svg)](https://travis-ci.org/jaredhanson/utils-merge) +[![Quality](https://img.shields.io/codeclimate/github/jaredhanson/utils-merge.svg?label=quality)](https://codeclimate.com/github/jaredhanson/utils-merge) +[![Coverage](https://img.shields.io/coveralls/jaredhanson/utils-merge.svg)](https://coveralls.io/r/jaredhanson/utils-merge) +[![Dependencies](https://img.shields.io/david/jaredhanson/utils-merge.svg)](https://david-dm.org/jaredhanson/utils-merge) + + +Merges the properties from a source object into a destination object. + +## Install + +```bash +$ npm install utils-merge +``` + +## Usage + +```javascript +var a = { foo: 'bar' } + , b = { bar: 'baz' }; + +merge(a, b); +// => { foo: 'bar', bar: 'baz' } +``` + +## License + +[The MIT License](http://opensource.org/licenses/MIT) + +Copyright (c) 2013-2017 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> + + Sponsor diff --git a/node_modules/utils-merge/index.js b/node_modules/utils-merge/index.js new file mode 100644 index 00000000..4265c694 --- /dev/null +++ b/node_modules/utils-merge/index.js @@ -0,0 +1,23 @@ +/** + * Merge object b with object a. + * + * var a = { foo: 'bar' } + * , b = { bar: 'baz' }; + * + * merge(a, b); + * // => { foo: 'bar', bar: 'baz' } + * + * @param {Object} a + * @param {Object} b + * @return {Object} + * @api public + */ + +exports = module.exports = function(a, b){ + if (a && b) { + for (var key in b) { + a[key] = b[key]; + } + } + return a; +}; diff --git a/node_modules/utils-merge/package.json b/node_modules/utils-merge/package.json new file mode 100644 index 00000000..6b69c4a8 --- /dev/null +++ b/node_modules/utils-merge/package.json @@ -0,0 +1,66 @@ +{ + "_from": "utils-merge@1.0.1", + "_id": "utils-merge@1.0.1", + "_inBundle": false, + "_integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "_location": "/utils-merge", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "utils-merge@1.0.1", + "name": "utils-merge", + "escapedName": "utils-merge", + "rawSpec": "1.0.1", + "saveSpec": null, + "fetchSpec": "1.0.1" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "_shasum": "9f95710f50a267947b2ccc124741c1028427e713", + "_spec": "utils-merge@1.0.1", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "Jared Hanson", + "email": "jaredhanson@gmail.com", + "url": "http://www.jaredhanson.net/" + }, + "bugs": { + "url": "http://github.com/jaredhanson/utils-merge/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "merge() utility function", + "devDependencies": { + "chai": "1.x.x", + "make-node": "0.3.x", + "mocha": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "homepage": "https://github.com/jaredhanson/utils-merge#readme", + "keywords": [ + "util" + ], + "license": "MIT", + "licenses": [ + { + "type": "MIT", + "url": "http://opensource.org/licenses/MIT" + } + ], + "main": "./index", + "name": "utils-merge", + "repository": { + "type": "git", + "url": "git://github.com/jaredhanson/utils-merge.git" + }, + "scripts": { + "test": "mocha --reporter spec --require test/bootstrap/node test/*.test.js" + }, + "version": "1.0.1" +} diff --git a/node_modules/vary/HISTORY.md b/node_modules/vary/HISTORY.md new file mode 100644 index 00000000..f6cbcf7f --- /dev/null +++ b/node_modules/vary/HISTORY.md @@ -0,0 +1,39 @@ +1.1.2 / 2017-09-23 +================== + + * perf: improve header token parsing speed + +1.1.1 / 2017-03-20 +================== + + * perf: hoist regular expression + +1.1.0 / 2015-09-29 +================== + + * Only accept valid field names in the `field` argument + - Ensures the resulting string is a valid HTTP header value + +1.0.1 / 2015-07-08 +================== + + * Fix setting empty header from empty `field` + * perf: enable strict mode + * perf: remove argument reassignments + +1.0.0 / 2014-08-10 +================== + + * Accept valid `Vary` header string as `field` + * Add `vary.append` for low-level string manipulation + * Move to `jshttp` orgainzation + +0.1.0 / 2014-06-05 +================== + + * Support array of fields to set + +0.0.0 / 2014-06-04 +================== + + * Initial release diff --git a/node_modules/vary/LICENSE b/node_modules/vary/LICENSE new file mode 100644 index 00000000..84441fbb --- /dev/null +++ b/node_modules/vary/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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/node_modules/vary/README.md b/node_modules/vary/README.md new file mode 100644 index 00000000..cc000b34 --- /dev/null +++ b/node_modules/vary/README.md @@ -0,0 +1,101 @@ +# vary + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Manipulate the HTTP Vary header + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install vary +``` + +## API + + + +```js +var vary = require('vary') +``` + +### vary(res, field) + +Adds the given header `field` to the `Vary` response header of `res`. +This can be a string of a single field, a string of a valid `Vary` +header, or an array of multiple fields. + +This will append the header if not already listed, otherwise leaves +it listed in the current location. + + + +```js +// Append "Origin" to the Vary header of the response +vary(res, 'Origin') +``` + +### vary.append(header, field) + +Adds the given header `field` to the `Vary` response header string `header`. +This can be a string of a single field, a string of a valid `Vary` header, +or an array of multiple fields. + +This will append the header if not already listed, otherwise leaves +it listed in the current location. The new header string is returned. + + + +```js +// Get header string appending "Origin" to "Accept, User-Agent" +vary.append('Accept, User-Agent', 'Origin') +``` + +## Examples + +### Updating the Vary header when content is based on it + +```js +var http = require('http') +var vary = require('vary') + +http.createServer(function onRequest (req, res) { + // about to user-agent sniff + vary(res, 'User-Agent') + + var ua = req.headers['user-agent'] || '' + var isMobile = /mobi|android|touch|mini/i.test(ua) + + // serve site, depending on isMobile + res.setHeader('Content-Type', 'text/html') + res.end('You are (probably) ' + (isMobile ? '' : 'not ') + 'a mobile user') +}) +``` + +## Testing + +```sh +$ npm test +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/vary.svg +[npm-url]: https://npmjs.org/package/vary +[node-version-image]: https://img.shields.io/node/v/vary.svg +[node-version-url]: https://nodejs.org/en/download +[travis-image]: https://img.shields.io/travis/jshttp/vary/master.svg +[travis-url]: https://travis-ci.org/jshttp/vary +[coveralls-image]: https://img.shields.io/coveralls/jshttp/vary/master.svg +[coveralls-url]: https://coveralls.io/r/jshttp/vary +[downloads-image]: https://img.shields.io/npm/dm/vary.svg +[downloads-url]: https://npmjs.org/package/vary diff --git a/node_modules/vary/index.js b/node_modules/vary/index.js new file mode 100644 index 00000000..5b5e7412 --- /dev/null +++ b/node_modules/vary/index.js @@ -0,0 +1,149 @@ +/*! + * vary + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + */ + +module.exports = vary +module.exports.append = append + +/** + * RegExp to match field-name in RFC 7230 sec 3.2 + * + * field-name = token + * token = 1*tchar + * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" + * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" + * / DIGIT / ALPHA + * ; any VCHAR, except delimiters + */ + +var FIELD_NAME_REGEXP = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/ + +/** + * Append a field to a vary header. + * + * @param {String} header + * @param {String|Array} field + * @return {String} + * @public + */ + +function append (header, field) { + if (typeof header !== 'string') { + throw new TypeError('header argument is required') + } + + if (!field) { + throw new TypeError('field argument is required') + } + + // get fields array + var fields = !Array.isArray(field) + ? parse(String(field)) + : field + + // assert on invalid field names + for (var j = 0; j < fields.length; j++) { + if (!FIELD_NAME_REGEXP.test(fields[j])) { + throw new TypeError('field argument contains an invalid header name') + } + } + + // existing, unspecified vary + if (header === '*') { + return header + } + + // enumerate current values + var val = header + var vals = parse(header.toLowerCase()) + + // unspecified vary + if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { + return '*' + } + + for (var i = 0; i < fields.length; i++) { + var fld = fields[i].toLowerCase() + + // append value (case-preserving) + if (vals.indexOf(fld) === -1) { + vals.push(fld) + val = val + ? val + ', ' + fields[i] + : fields[i] + } + } + + return val +} + +/** + * Parse a vary header into an array. + * + * @param {String} header + * @return {Array} + * @private + */ + +function parse (header) { + var end = 0 + var list = [] + var start = 0 + + // gather tokens + for (var i = 0, len = header.length; i < len; i++) { + switch (header.charCodeAt(i)) { + case 0x20: /* */ + if (start === end) { + start = end = i + 1 + } + break + case 0x2c: /* , */ + list.push(header.substring(start, end)) + start = end = i + 1 + break + default: + end = i + 1 + break + } + } + + // final token + list.push(header.substring(start, end)) + + return list +} + +/** + * Mark that a request is varied on a header field. + * + * @param {Object} res + * @param {String|Array} field + * @public + */ + +function vary (res, field) { + if (!res || !res.getHeader || !res.setHeader) { + // quack quack + throw new TypeError('res argument is required') + } + + // get existing header + var val = res.getHeader('Vary') || '' + var header = Array.isArray(val) + ? val.join(', ') + : String(val) + + // set new header + if ((val = append(header, field))) { + res.setHeader('Vary', val) + } +} diff --git a/node_modules/vary/package.json b/node_modules/vary/package.json new file mode 100644 index 00000000..3329a09c --- /dev/null +++ b/node_modules/vary/package.json @@ -0,0 +1,78 @@ +{ + "_from": "vary@~1.1.2", + "_id": "vary@1.1.2", + "_inBundle": false, + "_integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "_location": "/vary", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "vary@~1.1.2", + "name": "vary", + "escapedName": "vary", + "rawSpec": "~1.1.2", + "saveSpec": null, + "fetchSpec": "~1.1.2" + }, + "_requiredBy": [ + "/express" + ], + "_resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "_shasum": "2299f02c6ded30d4a5961b0b9f74524a18f634fc", + "_spec": "vary@~1.1.2", + "_where": "C:\\Users\\rin\\Desktop\\final\\node_modules\\express", + "author": { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + "bugs": { + "url": "https://github.com/jshttp/vary/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Manipulate the HTTP Vary header", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "3.19.0", + "eslint-config-standard": "10.2.1", + "eslint-plugin-import": "2.7.0", + "eslint-plugin-markdown": "1.0.0-beta.6", + "eslint-plugin-node": "5.1.1", + "eslint-plugin-promise": "3.5.0", + "eslint-plugin-standard": "3.0.1", + "istanbul": "0.4.5", + "mocha": "2.5.3", + "supertest": "1.1.0" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "index.js" + ], + "homepage": "https://github.com/jshttp/vary#readme", + "keywords": [ + "http", + "res", + "vary" + ], + "license": "MIT", + "name": "vary", + "repository": { + "type": "git", + "url": "git+https://github.com/jshttp/vary.git" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + }, + "version": "1.1.2" +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..701aa0be --- /dev/null +++ b/package-lock.json @@ -0,0 +1,829 @@ +{ + "name": "hello-express", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bson": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", + "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "csv-parse": { + "version": "4.15.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.15.3.tgz", + "integrity": "sha512-jlTqDvLdHnYMSr08ynNfk4IAUSJgJjTKy2U5CQBSu4cN9vQOJonLVZP4Qo4gKKrIgIQ5dr07UwOJdi+lRqT12w==" + }, + "d3": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-6.6.0.tgz", + "integrity": "sha512-fWyMfZDSOLksXeYuiHM/uHap7pKgypUnOGY8jiTfmmAWH1HM6ErPtnHiKEdqs7DtZqbombUgaKwq3B5Pjm7GOQ==", + "requires": { + "d3-array": "2", + "d3-axis": "2", + "d3-brush": "2", + "d3-chord": "2", + "d3-color": "2", + "d3-contour": "2", + "d3-delaunay": "5", + "d3-dispatch": "2", + "d3-drag": "2", + "d3-dsv": "2", + "d3-ease": "2", + "d3-fetch": "2", + "d3-force": "2", + "d3-format": "2", + "d3-geo": "2", + "d3-hierarchy": "2", + "d3-interpolate": "2", + "d3-path": "2", + "d3-polygon": "2", + "d3-quadtree": "2", + "d3-random": "2", + "d3-scale": "3", + "d3-scale-chromatic": "2", + "d3-selection": "2", + "d3-shape": "2", + "d3-time": "2", + "d3-time-format": "3", + "d3-timer": "2", + "d3-transition": "2", + "d3-zoom": "2" + } + }, + "d3-array": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.0.tgz", + "integrity": "sha512-T6H/qNldyD/1OlRkJbonb3u3MPhNwju8OPxYv0YSjDb/B2RUeeBEHzIpNrYiinwpmz8+am+puMrpcrDWgY9wRg==", + "requires": { + "internmap": "^1.0.0" + } + }, + "d3-axis": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-2.1.0.tgz", + "integrity": "sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw==" + }, + "d3-brush": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-2.1.0.tgz", + "integrity": "sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ==", + "requires": { + "d3-dispatch": "1 - 2", + "d3-drag": "2", + "d3-interpolate": "1 - 2", + "d3-selection": "2", + "d3-transition": "2" + } + }, + "d3-chord": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-2.0.0.tgz", + "integrity": "sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig==", + "requires": { + "d3-path": "1 - 2" + } + }, + "d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "d3-contour": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-2.0.0.tgz", + "integrity": "sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==", + "requires": { + "d3-array": "2" + } + }, + "d3-delaunay": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.3.0.tgz", + "integrity": "sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==", + "requires": { + "delaunator": "4" + } + }, + "d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + }, + "d3-drag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-2.0.0.tgz", + "integrity": "sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==", + "requires": { + "d3-dispatch": "1 - 2", + "d3-selection": "2" + } + }, + "d3-dsv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-2.0.0.tgz", + "integrity": "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-2.0.0.tgz", + "integrity": "sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==" + }, + "d3-fetch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-2.0.0.tgz", + "integrity": "sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw==", + "requires": { + "d3-dsv": "1 - 2" + } + }, + "d3-force": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz", + "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", + "requires": { + "d3-dispatch": "1 - 2", + "d3-quadtree": "1 - 2", + "d3-timer": "1 - 2" + } + }, + "d3-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", + "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" + }, + "d3-geo": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.1.tgz", + "integrity": "sha512-M6yzGbFRfxzNrVhxDJXzJqSLQ90q1cCyb3EWFZ1LF4eWOBYxFypw7I/NFVBNXKNqxv1bqLathhYvdJ6DC+th3A==", + "requires": { + "d3-array": ">=2.5" + } + }, + "d3-hierarchy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz", + "integrity": "sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==" + }, + "d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "requires": { + "d3-color": "1 - 2" + } + }, + "d3-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz", + "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" + }, + "d3-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==" + }, + "d3-quadtree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", + "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + }, + "d3-random": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-2.2.2.tgz", + "integrity": "sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==" + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-scale-chromatic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", + "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", + "requires": { + "d3-color": "1 - 2", + "d3-interpolate": "1 - 2" + } + }, + "d3-selection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-2.0.0.tgz", + "integrity": "sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==" + }, + "d3-shape": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz", + "integrity": "sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==", + "requires": { + "d3-path": "1 - 2" + } + }, + "d3-time": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.0.0.tgz", + "integrity": "sha512-2mvhstTFcMvwStWd9Tj3e6CEqtOivtD8AUiHT8ido/xmzrI9ijrUUihZ6nHuf/vsScRBonagOdj0Vv+SEL5G3Q==" + }, + "d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "requires": { + "d3-time": "1 - 2" + } + }, + "d3-timer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", + "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==" + }, + "d3-transition": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-2.0.0.tgz", + "integrity": "sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==", + "requires": { + "d3-color": "1 - 2", + "d3-dispatch": "1 - 2", + "d3-ease": "1 - 2", + "d3-interpolate": "1 - 2", + "d3-timer": "1 - 2" + } + }, + "d3-zoom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-2.0.0.tgz", + "integrity": "sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==", + "requires": { + "d3-dispatch": "1 - 2", + "d3-drag": "2", + "d3-interpolate": "1 - 2", + "d3-selection": "2", + "d3-transition": "2" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "delaunator": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", + "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + }, + "denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + } + } + }, + "filereader": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/filereader/-/filereader-0.10.3.tgz", + "integrity": "sha1-x0fUos2PYeVBinwH/hJXpD8KzbE=" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", + "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" + }, + "mime-types": { + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", + "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "requires": { + "mime-db": "1.46.0" + } + }, + "mongodb": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.4.tgz", + "integrity": "sha512-Y+Ki9iXE9jI+n9bVtbTOOdK0B95d6wVGSucwtBkvQ+HIvVdTCfpVRp01FDC24uhC/Q2WXQ8Lpq3/zwtB5Op9Qw==", + "requires": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "passport": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw=" + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..47acd740 --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "//1": "describes your app and its dependencies", + "//2": "https://docs.npmjs.com/files/package.json", + "//3": "updating this file will download and update your packages", + "name": "hello-express", + "version": "0.0.1", + "description": "A simple Node app built on Express, instantly up and running.", + "main": "server.js", + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "body-parser": "^1.19.0", + "csv-parse": "^4.15.3", + "d3": "^6.6.0", + "express": "^4.17.1", + "filereader": "^0.10.3", + "fs": "0.0.1-security", + "mongodb": "^3.6.3", + "passport": "^0.4.1", + "readline": "^1.3.0" + }, + "engines": { + "node": "12.x" + }, + "repository": { + "url": "https://glitch.com/edit/#!/hello-express" + }, + "license": "MIT", + "keywords": [ + "node", + "glitch", + "express" + ] +} diff --git a/public/script.js b/public/script.js new file mode 100644 index 00000000..e484f941 --- /dev/null +++ b/public/script.js @@ -0,0 +1,493 @@ +let margin = {top: 50, bottom: 50, left: (window.innerWidth-1000)/2, right: 50}, height = 600, width = 1000 +let tooltip = d3.select('#tooltip') +let perArea = d3.select('#perArea') +let page_stateName = document.getElementById('page_stateName') +console.log(d3) +let the_map = d3.select('#usMap') + .attr('width', width) + .attr('height', height) + .attr('transform', 'translate('+margin.left+','+margin.top+')') + .append('g') + +let positiveStats = d3.select('#positiveStats') + .attr('width', width) + .attr('height', height) + .attr('transform', 'translate('+margin.left+','+margin.top+')') + .append('g') + +let positiveStatsLine = d3.select('#positiveStatsLine') + .attr('width', window.innerWidth-100) + .attr('height', height) + .attr('transform', 'translate(50'+','+margin.top+')') + .append('g') +// perArea.attr('transform', 'translate('+String(margin.left-20)+','+margin.top+')') +let colors = d3.interpolateReds + +let projection = d3.geoAlbersUsa() + .translate([width/2, height/2]) + .scale(850) + +let stateMatchUp = {1:'AL', 2:'AK', 4:'AZ', 5:'AR', 6:'CA', 8:'CO', 9:'CT', + 10:'DE', 11:'DC', 12:'FL', 13:'GA', 15:'HI', 16:'ID', 17:'IL', 18:'IN', + 19:'IA', 20:'KS', 21:'KY', 22:'LA', 23:'ME', 24:'MD', 25:'MA', 26:'MI', + 27:'MN', 28:'MS', 29:'MO', 30:'MT', 31:'NE', 32:'NV', 33:'NH', 34:'NJ', + 35:'NM', 36:'NY', 37:'NC', 38:'ND', 39:'OH', 40:'OK', 41:'OR', 42:'PA', + 44:'RI', 45:'SC', 46:'SD', 47:'TN', 48:'TX', 49:'UT', 50:'VT', 51:'VA', + 53:'WA', 54:'WV', 55:'WI', 56:'WY'} + + +// console.log('35: ',values) + +let states + +let rawCsvArr + +let totalDeath + +let thisState + +let path = d3.geoPath() + .projection(projection) + + +d3.json('us.json', function(error, data) { + if (error) { + console.log(error) + } else { + states = topojson.feature(data, data.objects.states).features + console.log(states) + the_map.selectAll('.state') + .data(states) + .enter() + .append('path') + .attr('class', 'state') + .attr('d', path) + .attr('stroke-width', 0.5) + .on('click', function(d, i) { + console.log(states[i].id) + fetch("/postStateId", { + method: "POST", + body: JSON.stringify({ + stateId: states[i].id, + hello:'hello' + }), + headers: { + "Content-Type": "application/json" + } + }) + .then(response => response.json()) + .then(response => { + console.log("sent"); + // uid = response + console.log(response) + }) + }).append('title').text( + function(d, i){ + return stateMatchUp[d.id] + }) + + fetch("/getCsv", { + method: "Get", + }) + .then(response => response.json()) + .then(response => { + let deathArr = [] + rawCsvArr = response.rawCsv + the_map.selectAll('.state') + .attr('fill', function (d, i){ + thisState = '' + totalDeath = 0 + // console.log(d) + if (d.id !== 72 && d.id !== 78){ + thisState = stateMatchUp[d.id] + for (let j = 0; j < rawCsvArr.length; j++){ + if (thisState === rawCsvArr[j][1] + && rawCsvArr[j][0] === '2021-03-07'){ + totalDeath = parseInt(rawCsvArr[j][2]) + deathArr.push(totalDeath) + } + } + } + // deathArr.sort((a, b) => a - b) + // console.log(deathArr) + let start = 208 + let end = 54124 + let interval = (end-start)/6 + + return colors((totalDeath-start)*0.1167/interval+0.3) + }) + // console.log('arr',rawCsvArr) + }) + } + console.log(data) + }) + +function selectThis(id){ + document.getElementById("checkDeath").checked = false + document.getElementById("checkPositive").checked = false + document.getElementById("checkAirport").checked = false + + document.getElementById(id).checked = true; + fetch("/postType", { + method: "POST", + body: JSON.stringify({ + chartType: id + }), + headers: { + "Content-Type": "application/json" + } + }) + .then(response => response.json()) + .then(response => { + console.log("sent"); + uid = response + console.log(response) + }) +} + +function colorselectThis(id){ + document.getElementById("colorTotal").checked = false + document.getElementById("colorPerPpl").checked = false + document.getElementById(id).checked = true; + thisState = '' + totalDeath = 0 + if (document.getElementById("colorTotal").checked == true) { + the_map.selectAll('.state') + .attr('fill', function (d, i) { + // console.log(d) + if (d.id !== 72 && d.id !== 78) { + thisState = stateMatchUp[d.id] + for (let j = 0; j < rawCsvArr.length; j++) { + if (thisState === rawCsvArr[j][1] + && rawCsvArr[j][0] === '2021-03-07') { + totalDeath = parseInt(rawCsvArr[j][2]) + // deathArr.push(totalDeath) + } + } + } + // deathArr.sort((a, b) => a - b) + // console.log(deathArr) + let start = 208 + let end = 54124 + let interval = (end - start) / 6 + + return colors((totalDeath - start) * 0.1167 / interval + 0.3) + }) + } + else { + // let tmp = [] + // console.log('switch') + let rawPplArr = [] + totalDeath = 0 + let average + fetch("/getPopulationCsv", { + method: "Get", + }) + .then(response => response.json()) + .then(response => { + rawPplArr = response.rawPopulationCsv + // console.log(rawPplArr) + the_map.selectAll('.state') + .attr('fill', function (d, i) { + // console.log(d.id) + if (d.id !== 72 && d.id !== 78) { + thisState = stateMatchUp[d.id] + // console.log(thisState) + for (let j = 0; j < rawCsvArr.length; j++) { + if (thisState === rawCsvArr[j][1] + && rawCsvArr[j][0] === '2021-03-07') { + totalDeath = parseInt(rawCsvArr[j][2]) + // console.log(totalDeath) + // deathArr.push(totalDeath) + } + } + for (let j = 0; j < rawPplArr.length; j++) { + if (thisState === rawPplArr[j][0] + && rawPplArr[j][1] === 'total' && rawPplArr[j][2] === '2013') { + // console.log(thisState) + average = (totalDeath/parseInt(rawPplArr[j][3])*1000).toFixed(2) + // tmp.push(average) + // console.log(average) + // deathArr.push(totalDeath) + } + } + } + // console.log(tmp.sort((a, b) => a - b)) + // console.log(deathArr) + let start = 0.32 + let end = 2.65 + let interval = (end - start) / 6 + + return colors((average - start) * 0.1167 / interval + 0.3) + }) + }) + + } +} + +function redirectPage(){ + window.location.href="/redirectPage" +} + +let stateId +let chartType +let revisedCsvData +let keys = Object.keys(stateMatchUp); +let val = '' +let finalCsv = [] +let index = '01' +let total = 0 +let count = 1 +function getIdTypeCsv(){ + total = 0 + index = '01' + finalCsv = [] + fetch("/getIdTypeCsv", { + method: "Get", + }) + .then(response => response.json()) + .then(response => { + stateId = response.stateId + chartType = response.chartType + rawCsvArr = response.rawCsv + console.log('script stateId: '+stateId) + console.log('script chartType: '+chartType) + revisedCsvData = [] + + + + for (let i = 0; i < keys.length; i++) { + if (parseInt(keys[i]) === parseInt(stateId)){ + val = stateMatchUp[keys[i]] + } + } + console.log('stateId: ',stateId) + console.log('val: ', val) + for (let i = 0; i < rawCsvArr.length; i++){ + if (rawCsvArr[i][1] === String(val)){ + let csvItem = [] + csvItem.push((rawCsvArr[i][0].split('-'))[1]) + csvItem.push(rawCsvArr[i][1]) + // console.log('total: '+rawCsvArr[i][19]) + if (chartType === 'checkPositive') { + csvItem.push(rawCsvArr[i][21]) + } + // console.log('item: ',csvItem) + revisedCsvData.push(csvItem) + } + } + revisedCsvData.sort((a, b) => parseInt(a[0]) - parseInt(b[0])) + + page_stateName.innerText = 'The statistics you are looking at is '+val + + for (let i = 0; i < revisedCsvData.length-1; i++){ + if (revisedCsvData[i+1][0] !== index || i === revisedCsvData.length-2){ + if (revisedCsvData[i][2] === ''){ + total += 0 + } + else { + total += parseInt(revisedCsvData[i][2]) + } + let item = [] + item.push(index) + item.push(revisedCsvData[i][1]) + item.push(total) + finalCsv.push(item) + index = String(parseInt(index)+1) + if (index.length < 2){ + index = '0'+index + } + } + else { + if (revisedCsvData[i][2] === ''){ + total += 0 + } + else { + total += parseInt(revisedCsvData[i][2]) + } + } + } + + for (let i = 0; i < finalCsv.length; i++) { + console.log('final: ' + finalCsv[i]) + } + + if (chartType === 'checkPositive'){ + console.log('hello, checkPositive') + drawPositivePie() + drawPositiveLine() + } + }) +} + +let values = [] +let piekeys = [] +let monthArr = {0:'Jan', 1:'Feb', 2:'Mar', 3:'Apr', 4:'May', 5:'June', 6:'July', 7:'Aug', 8:'Sep', +9:'Oct', 10:'Nov', 11:'Dec'} +// let monthkeys = Object.keys(monthArr); +function drawPositivePie(){ + let pieData = d3.pie() + .sort(null) + .value(function(d) { + let value = d[2] + values.push(value) + let key = d[0] + piekeys.push(key) + return value + })(finalCsv) + + console.log('pie data: ',pieData) + + let totalValue = 0 + for (let i = 0; i < pieData.length; i++){ + totalValue += pieData[i].value + } + + let segments = d3.arc().innerRadius(0).outerRadius(250).padAngle(0.05).padRadius(50) + + positiveStats.append('g') + .attr('transform', 'translate(500, 300)') + .selectAll('path') + .data(pieData) + .enter() + .append('path') + .attr('d', segments) + .attr('class', 'pieState') + .attr('pieStateName', function (d, i){ + return piekeys[i] + }) + .attr('fill', function (d, i){ + + let start = Math.min.apply(null, values) + let end = Math.max.apply(null, values) + let interval = (end-start)/12 + + return colors((values[i]-start)*0.083/interval) + }) + .on('mouseover', function (d, i){ + positiveStats.append('g') + .append("text") + .attr('x', '730px') + .attr('y', '520px') + .attr('id', 'tooltip') + .text('# of Positive Increase: '+values[i]) + .attr('fill', 'yellow') + positiveStats.append('g') + .append("text") + .attr('x', '730px') + .attr('y', '570px') + .attr('id', 'tooltip3') + .text((100*values[i]/totalValue).toFixed(2)+'%') + .attr('fill', 'yellow') + }) + .on('mouseout', function (d, i){ + positiveStats.select('#tooltip').remove() + positiveStats.select('#tooltip3').remove() + }) + + positiveStats + .selectAll('mySlices') + .data(pieData) + .enter() + .append('text') + .text(function(d, i) { + if (i < 3){ + return '2021 '+monthArr[i] + } + else return '2020 '+monthArr[i] + }) + .attr("transform", function(d) { + let x = 2.3*segments.centroid(d)[0]+500 + let y = 2.3*segments.centroid(d)[1]+300 + return "translate(" +x+','+y + ")"; + }) + .style("text-anchor", "middle") + .style("font-size", 16) + .style('fill', function(d,i){ + let start = Math.min.apply(null, values) + let end = Math.max.apply(null, values) + let interval = (end-start)/12 + + return colors((values[i]-start)*0.083/interval) + }) +} + +function drawPositiveLine(){ + let csvArr1 = finalCsv.slice(0, 3) + let csvArr2 = finalCsv.slice(3, 12) + let csvBar = csvArr2.concat(csvArr1) + console.log('csv bar: ', csvBar) + let maxDeath = (finalCsv.sort((a, b) => parseInt(a[2]) - parseInt(b[2])))[11][2] + let minDeath = (finalCsv.sort((a, b) => parseInt(a[2]) - parseInt(b[2])))[0][2] + let orderedArr = [3,4,5,6,7,8,9,10,11,0,1,2] + // console.log('max death value: ',maxDeath) + + let yScale = d3.scaleLinear() + .domain([0, maxDeath]) + .range([550, 50]) + let xScale = d3.scaleBand() + .domain(orderedArr.map(function (d){ + if (d < 3) { + return '2021 '+monthArr[d] + } + return '2020 '+monthArr[d] + })) + .range([0, window.innerWidth-300]) + let yAxis = positiveStatsLine.append('g') + .classed('yAxis', true) + .attr('transform', 'translate(100, 0)') + .call(d3.axisLeft(yScale)) + let xAxis = positiveStatsLine.append('g') + .classed('xAxis', true) + .attr('transform', 'translate(100, 550)') + .call(d3.axisBottom(xScale)) + + let rectGrp = positiveStatsLine.append('g') + .attr('transform', 'translate(100, 50)') + + rectGrp.selectAll('rect') + .data(csvBar) + .enter() + .append('rect') + .attr('width', xScale.bandwidth()) + .attr('height', function (d, i){ + return 500-yScale(d[2]) + // return 50 + }) + .attr('x', function (d, i){ + // console.log('x: ',d[0]) + if (parseInt(d[0]) < 4) { + return xScale('2021 '+monthArr[parseInt(d[0]) - 1]) + } + else { + return xScale('2020 '+monthArr[parseInt(d[0]) - 1]) + } + }) + .attr('y', function (d, i){ + return yScale(parseInt(d[2])) + }) + .attr('fill', function (d, i){ + let interval = (maxDeath-minDeath)/12 + return colors((parseInt(d[2])-minDeath)*0.083/interval) + }) + + positiveStatsLine.selectAll('rect') + .on('mouseover', function (d, i){ + positiveStatsLine.append('g') + .append("text") + .attr('x', window.innerWidth-370) + .attr('y', '50px') + .attr('id', 'tooltip2') + .text('# of Positive Increase: '+d[2]) + .attr('fill', 'yellow') + }) + .on('mouseout', function (d, i){ + positiveStatsLine.select('#tooltip2').remove() + }) + + + +} + + + diff --git a/public/style.css b/public/style.css new file mode 100644 index 00000000..89fc6b44 --- /dev/null +++ b/public/style.css @@ -0,0 +1,43 @@ +body{ + font-size: 20px; + color: darkblue; +} + +#usMap, #deathStats{ + background-color: #efefef; +} +#positiveStats, #positiveStatsLine{ + background-color: dimgray; +} +#perArea{ + position: absolute; + left: 20px; + top: 20px; +} + +/*svg {*/ +/* font: 20px sans-serif;*/ +/*}*/ + +.area { + fill: steelblue; +} + +.axis path, +.axis line { + fill: black; + stroke: #100; + shape-rendering: crispEdges; +} + + + +.brush .extent { + stroke: #fff; + fill-opacity: .125; + shape-rendering: crispEdges; +} + +.state:hover{ + fill: yellow; +} \ No newline at end of file diff --git a/public/us.json b/public/us.json new file mode 100644 index 00000000..3a32d427 --- /dev/null +++ b/public/us.json @@ -0,0 +1 @@ +{"type":"Topology","objects":{"counties":{"type":"GeometryCollection","bbox":[-179.1473399999999,17.67439566600018,179.7784800000003,71.38921046500008],"geometries":[{"type":"MultiPolygon","id":53073,"arcs":[[[0,1,2]]]},{"type":"Polygon","id":30105,"arcs":[[3,4,5,6,7,8]]},{"type":"Polygon","id":30029,"arcs":[[9,10,11,12,13,14,15,16,17,18]]},{"type":"Polygon","id":16021,"arcs":[[19,20,21,22]]},{"type":"Polygon","id":30071,"arcs":[[-8,23,24,25,26,27]]},{"type":"Polygon","id":38079,"arcs":[[28,29,30,31]]},{"type":"Polygon","id":30053,"arcs":[[-18,32,33,-20,34]]},{"type":"Polygon","id":38009,"arcs":[[-30,35,36,37,38]]},{"type":"Polygon","id":30035,"arcs":[[39,40,-10,41]]},{"type":"Polygon","id":30041,"arcs":[[42,43,44,45]]},{"type":"Polygon","id":30005,"arcs":[[-27,46,47,-46,48]]},{"type":"Polygon","id":30019,"arcs":[[49,50,-4,51]]},{"type":"Polygon","id":38067,"arcs":[[52,53,54,55]]},{"type":"Polygon","id":27069,"arcs":[[56,57,-53,58]]},{"type":"Polygon","id":38095,"arcs":[[59,60,61,-32,62,63]]},{"type":"Polygon","id":38019,"arcs":[[-55,64,65,-64,66]]},{"type":"Polygon","id":53047,"arcs":[[67,68,69,70,71,72,-1,73]]},{"type":"Polygon","id":53065,"arcs":[[74,75,76,77,78]]},{"type":"Polygon","id":53051,"arcs":[[-22,79,80,-75,81]]},{"type":"Polygon","id":53019,"arcs":[[-78,82,-68,83]]},{"type":"Polygon","id":30051,"arcs":[[84,85,86,-44,87]]},{"type":"Polygon","id":38023,"arcs":[[88,89,90,91]]},{"type":"Polygon","id":38013,"arcs":[[92,93,94,95,-89,96]]},{"type":"Polygon","id":30101,"arcs":[[97,-86,98,-40]]},{"type":"Polygon","id":38075,"arcs":[[99,100,-93,101,-38]]},{"type":"Polygon","id":27135,"arcs":[[102,103,-57,104,105]]},{"type":"Polygon","id":30091,"arcs":[[-91,106,107,-50,108]]},{"type":"Polygon","id":16017,"arcs":[[-34,109,110,111,112,-80,-21]]},{"type":"Polygon","id":38101,"arcs":[[-101,113,114,115,-94]]},{"type":"MultiPolygon","id":53055,"arcs":[[[116]],[[117]],[[118]]]},{"type":"Polygon","id":27071,"arcs":[[119,120,121,122,123]]},{"type":"MultiPolygon","id":53057,"arcs":[[[124,-2,-73,125,126,127]]]},{"type":"Polygon","id":38105,"arcs":[[-96,128,129,130,-107,-90]]},{"type":"Polygon","id":38049,"arcs":[[131,132,133,-114,-100,-37]]},{"type":"Polygon","id":27137,"arcs":[[134,135,136,137,138,139,-120,140]]},{"type":"Polygon","id":30085,"arcs":[[-108,-131,141,142,-5,-51]]},{"type":"Polygon","id":53007,"arcs":[[-72,143,144,145,146,-126]]},{"type":"Polygon","id":38061,"arcs":[[147,148,149,-129,-95,-116]]},{"type":"Polygon","id":27089,"arcs":[[150,151,152,153,154,-58,-104]]},{"type":"Polygon","id":38069,"arcs":[[-62,155,156,157,-132,-36,-29]]},{"type":"MultiPolygon","id":38071,"arcs":[[[158]],[[159,160,161,-60,-66]]]},{"type":"Polygon","id":38099,"arcs":[[-54,-155,162,163,-160,-65]]},{"type":"Polygon","id":27007,"arcs":[[-122,164,165,166,167,168,-151,-103,169]]},{"type":"Polygon","id":30073,"arcs":[[-99,-85,170,171,-11,-41]]},{"type":"MultiPolygon","id":53029,"arcs":[[[172,173]],[[174]]]},{"type":"MultiPolygon","id":53009,"arcs":[[[175,176]]]},{"type":"Polygon","id":38005,"arcs":[[-61,-162,177,178,179,-156],[-159]]},{"type":"Polygon","id":30015,"arcs":[[-48,180,181,182,183,-171,-88,-43]]},{"type":"MultiPolygon","id":53061,"arcs":[[[-147,184,185,-173,186,-127]]]},{"type":"Polygon","id":30089,"arcs":[[-17,187,188,189,190,-110,-33]]},{"type":"Polygon","id":27075,"arcs":[[191,192,-135,193]]},{"type":"Polygon","id":38063,"arcs":[[194,195,196,197,-178,-161,-164]]},{"type":"Polygon","id":38035,"arcs":[[-154,198,199,200,-195,-163]]},{"type":"Polygon","id":27119,"arcs":[[201,202,203,204,205,206,207,-199,-153]]},{"type":"Polygon","id":27113,"arcs":[[-169,208,-204,209,-202,-152]]},{"type":"Polygon","id":30083,"arcs":[[210,211,212,213,-142]]},{"type":"Polygon","id":53017,"arcs":[[214,215,-144,-71]]},{"type":"Polygon","id":38053,"arcs":[[-150,216,217,218,219,-211,-130]]},{"type":"MultiPolygon","id":53031,"arcs":[[[220,221,222,-176,223]]]},{"type":"Polygon","id":30099,"arcs":[[-184,224,225,-12,-172]]},{"type":"Polygon","id":30055,"arcs":[[-214,226,227,228,-6,-143]]},{"type":"Polygon","id":16079,"arcs":[[-191,229,230,231,232,233,-111]]},{"type":"Polygon","id":30047,"arcs":[[234,-188,-16]]},{"type":"Polygon","id":53063,"arcs":[[-81,-113,235,236,237,238,-76]]},{"type":"Polygon","id":27029,"arcs":[[239,240,241,-205,-209,-168]]},{"type":"Polygon","id":16055,"arcs":[[-234,242,-236,-112]]},{"type":"Polygon","id":30033,"arcs":[[-229,243,244,245,246,-24,-7]]},{"type":"Polygon","id":27125,"arcs":[[-203,-210]]},{"type":"Polygon","id":53025,"arcs":[[-70,247,248,249,250,251,252,-215]]},{"type":"Polygon","id":53043,"arcs":[[-83,-77,-239,253,254,-248,-69]]},{"type":"Polygon","id":30049,"arcs":[[255,256,257,258,259,-13,-226]]},{"type":"MultiPolygon","id":53035,"arcs":[[[260]],[[261,262,263,264,265]]]},{"type":"Polygon","id":27061,"arcs":[[-140,266,267,-165,-121]]},{"type":"Polygon","id":38055,"arcs":[[268,269,270,271,272,-148,-115,-134]]},{"type":"Polygon","id":38027,"arcs":[[-198,273,274,275,-179]]},{"type":"Polygon","id":38103,"arcs":[[-180,-276,276,277,278,279,-157]]},{"type":"Polygon","id":38083,"arcs":[[-158,-280,280,281,-269,-133]]},{"type":"Polygon","id":38025,"arcs":[[-273,282,283,284,-217,-149]]},{"type":"Polygon","id":30027,"arcs":[[-26,285,286,287,288,289,-181,-47]]},{"type":"Polygon","id":30021,"arcs":[[-213,290,291,-227]]},{"type":"MultiPolygon","id":53033,"arcs":[[[292]],[[-146,293,294,295,-185]]]},{"type":"Polygon","id":30013,"arcs":[[296,297,-256,-225,-183]]},{"type":"Polygon","id":38091,"arcs":[[-201,298,299,300,301,-196]]},{"type":"Polygon","id":38039,"arcs":[[-302,302,303,304,-274,-197]]},{"type":"Polygon","id":38097,"arcs":[[305,306,-299,-200,-208]]},{"type":"MultiPolygon","id":53045,"arcs":[[[307,-265,308,309,310,311,-221]]]},{"type":"Polygon","id":30063,"arcs":[[-15,312,313,314,315,316,317,-189,-235]]},{"type":"Polygon","id":30077,"arcs":[[-260,318,319,320,-313,-14]]},{"type":"Polygon","id":30069,"arcs":[[-247,321,322,-286,-25]]},{"type":"Polygon","id":53037,"arcs":[[-216,-253,323,-294,-145]]},{"type":"Polygon","id":38031,"arcs":[[-305,324,-277,-275]]},{"type":"Polygon","id":38057,"arcs":[[325,326,327,-283,-272]]},{"type":"MultiPolygon","id":53027,"arcs":[[[-312,328,329,330,331,-222]]]},{"type":"Polygon","id":27087,"arcs":[[332,333,-206,-242]]},{"type":"Polygon","id":27107,"arcs":[[-207,-334,334,335,336,-306]]},{"type":"Polygon","id":30061,"arcs":[[-318,337,-230,-190]]},{"type":"Polygon","id":27021,"arcs":[[338,339,340,341,342,343,-166,-268]]},{"type":"Polygon","id":23003,"arcs":[[344,345,346,347,348]]},{"type":"Polygon","id":30045,"arcs":[[-290,349,350,-297,-182]]},{"type":"Polygon","id":16009,"arcs":[[-233,351,352,-237,-243]]},{"type":"Polygon","id":27057,"arcs":[[-344,353,354,-240,-167]]},{"type":"MultiPolygon","id":53053,"arcs":[[[-295,355,356,357,358]],[[-262,359]],[[-309,-264,360]]]},{"type":"Polygon","id":30109,"arcs":[[-220,361,362,363,-291,-212]]},{"type":"Polygon","id":38007,"arcs":[[-285,364,365,366,-218]]},{"type":"Polygon","id":38033,"arcs":[[-367,367,368,-362,-219]]},{"type":"Polygon","id":38043,"arcs":[[369,370,371,372,-281,-279]]},{"type":"Polygon","id":38093,"arcs":[[-304,373,374,375,-370,-278,-325]]},{"type":"Polygon","id":38015,"arcs":[[-373,376,377,378,-270,-282]]},{"type":"Polygon","id":38065,"arcs":[[-379,379,-326,-271]]},{"type":"Polygon","id":53001,"arcs":[[380,381,-249,-255]]},{"type":"Polygon","id":53075,"arcs":[[-238,-353,382,383,384,385,386,387,-381,-254]]},{"type":"Polygon","id":38003,"arcs":[[-301,388,389,390,-374,-303]]},{"type":"Polygon","id":38017,"arcs":[[-307,-337,391,392,393,-389,-300]]},{"type":"Polygon","id":53067,"arcs":[[-358,394,-329,-311,395]]},{"type":"Polygon","id":30079,"arcs":[[-364,396,397,-244,-228,-292]]},{"type":"Polygon","id":27005,"arcs":[[-355,398,399,400,-335,-333,-241]]},{"type":"Polygon","id":27027,"arcs":[[-401,401,402,403,-392,-336]]},{"type":"Polygon","id":16057,"arcs":[[-232,404,405,-383,-352]]},{"type":"Polygon","id":53077,"arcs":[[-252,406,407,408,409,-356,-324]]},{"type":"Polygon","id":30059,"arcs":[[-351,410,411,412,413,414,-257,-298]]},{"type":"Polygon","id":27001,"arcs":[[-139,415,416,417,418,419,-339,-267]]},{"type":"Polygon","id":26131,"arcs":[[420,421,422,423]]},{"type":"Polygon","id":38089,"arcs":[[-328,424,425,426,427,-365,-284]]},{"type":"Polygon","id":38059,"arcs":[[-378,428,429,430,-425,-327,-380]]},{"type":"Polygon","id":26013,"arcs":[[431,432,433,434]]},{"type":"Polygon","id":16035,"arcs":[[-338,-317,435,436,437,-405,-231]]},{"type":"Polygon","id":30017,"arcs":[[438,439,440,441,-245,-398]]},{"type":"Polygon","id":30087,"arcs":[[-442,442,443,444,445,446,-322,-246]]},{"type":"Polygon","id":30039,"arcs":[[447,448,-314,-321]]},{"type":"Polygon","id":27159,"arcs":[[-343,449,450,-399,-354]]},{"type":"Polygon","id":27035,"arcs":[[-420,451,452,-340]]},{"type":"MultiPolygon","id":53049,"arcs":[[[453,454,455,-331]]]},{"type":"Polygon","id":53041,"arcs":[[-395,-357,-410,456,457,458,-454,-330]]},{"type":"Polygon","id":30007,"arcs":[[-415,459,460,-258]]},{"type":"Polygon","id":27017,"arcs":[[461,462,-416,-138]]},{"type":"Polygon","id":26053,"arcs":[[463,464,465,466,-422]]},{"type":"Polygon","id":30065,"arcs":[[-447,467,468,-287,-323]]},{"type":"Polygon","id":26095,"arcs":[[469,470,471,472,473]]},{"type":"Polygon","id":30037,"arcs":[[-469,474,475,476,477,-288]]},{"type":"Polygon","id":30107,"arcs":[[-289,-478,478,-411,-350]]},{"type":"Polygon","id":53021,"arcs":[[479,480,481,-250,-382,-388]]},{"type":"Polygon","id":53005,"arcs":[[482,483,484,485,-407,-251,-482]]},{"type":"Polygon","id":27111,"arcs":[[-451,486,487,488,489,-402,-400]]},{"type":"Polygon","id":38037,"arcs":[[490,491,492,-426,-431]]},{"type":"Polygon","id":53023,"arcs":[[493,494,495,-386]]},{"type":"Polygon","id":30025,"arcs":[[-369,496,497,498,499,-439,-397,-363]]},{"type":"Polygon","id":16049,"arcs":[[500,501,502,503,504,505,506,-436,-316]]},{"type":"Polygon","id":30081,"arcs":[[-449,507,508,509,-501,-315]]},{"type":"Polygon","id":38029,"arcs":[[-372,510,511,512,513,-429,-377]]},{"type":"Polygon","id":38047,"arcs":[[-376,514,515,-511,-371]]},{"type":"Polygon","id":16069,"arcs":[[-438,516,-506,517,518,-384,-406]]},{"type":"Polygon","id":38087,"arcs":[[519,520,521,-497,-368,-366,-428]]},{"type":"Polygon","id":38045,"arcs":[[522,523,524,-515,-375,-391]]},{"type":"Polygon","id":38041,"arcs":[[-493,525,-520,-427]]},{"type":"Polygon","id":27167,"arcs":[[-490,526,527,528,-403]]},{"type":"Polygon","id":38073,"arcs":[[-394,529,530,531,-523,-390]]},{"type":"Polygon","id":38077,"arcs":[[-529,532,533,534,-530,-393,-404]]},{"type":"Polygon","id":53013,"arcs":[[535,536,537,-480,-387,-496]]},{"type":"Polygon","id":53071,"arcs":[[-538,538,-483,-481]]},{"type":"Polygon","id":55051,"arcs":[[-466,539,540,541,542]]},{"type":"Polygon","id":23025,"arcs":[[543,544,545,546,547,548,-348]]},{"type":"Polygon","id":23021,"arcs":[[549,-544,-347]]},{"type":"Polygon","id":30043,"arcs":[[-461,550,551,552,553,-319,-259]]},{"type":"Polygon","id":26153,"arcs":[[-472,554,555,556,557]]},{"type":"Polygon","id":30111,"arcs":[[558,559,560,561,-475,-468,-446]]},{"type":"Polygon","id":30103,"arcs":[[562,-559,-445]]},{"type":"Polygon","id":16061,"arcs":[[-437,-507,-517]]},{"type":"Polygon","id":53003,"arcs":[[-519,563,-494,-385]]},{"type":"Polygon","id":38085,"arcs":[[-514,564,565,-491,-430]]},{"type":"Polygon","id":26071,"arcs":[[-433,566,567,568,569,570,-464,-421,571]]},{"type":"Polygon","id":27115,"arcs":[[572,573,574,575,-417,-463]]},{"type":"Polygon","id":23019,"arcs":[[576,577,578,579,-545,-550,-346]]},{"type":"Polygon","id":53059,"arcs":[[-409,580,581,582,583,584,-457]]},{"type":"Polygon","id":53015,"arcs":[[-585,585,586,587,588,-458]]},{"type":"MultiPolygon","id":53069,"arcs":[[[-459,-589,589,-455]]]},{"type":"Polygon","id":27153,"arcs":[[-342,590,591,592,-487,-450]]},{"type":"Polygon","id":27097,"arcs":[[-453,593,594,595,-591,-341]]},{"type":"Polygon","id":55125,"arcs":[[596,597,-540,-465,-571,598]]},{"type":"MultiPolygon","id":41007,"arcs":[[[599,600,601]]]},{"type":"Polygon","id":38001,"arcs":[[-492,-566,602,603,604,605,-521,-526]]},{"type":"Polygon","id":38081,"arcs":[[-535,606,607,608,-531]]},{"type":"Polygon","id":38051,"arcs":[[-525,609,610,611,-512,-516]]},{"type":"Polygon","id":38021,"arcs":[[-532,-609,612,613,-610,-524]]},{"type":"Polygon","id":38011,"arcs":[[-606,614,-498,-522]]},{"type":"Polygon","id":30023,"arcs":[[-554,615,616,-508,-448,-320]]},{"type":"Polygon","id":26043,"arcs":[[617,618,619,-568,620]]},{"type":"Polygon","id":27095,"arcs":[[621,622,623,624,-594,-452,-419]]},{"type":"Polygon","id":30097,"arcs":[[-477,625,626,-412,-479]]},{"type":"Polygon","id":30031,"arcs":[[-414,627,628,629,630,631,-551,-460]]},{"type":"Polygon","id":30067,"arcs":[[-627,632,633,634,-628,-413]]},{"type":"Polygon","id":30093,"arcs":[[635,636,-616,-553]]},{"type":"MultiPolygon","id":41009,"arcs":[[[637,638,639,-600,640,-587]]]},{"type":"Polygon","id":27065,"arcs":[[-576,641,-622,-418]]},{"type":"Polygon","id":55013,"arcs":[[642,643,644,645,-574,646]]},{"type":"Polygon","id":55113,"arcs":[[647,648,649,650,651]]},{"type":"Polygon","id":55129,"arcs":[[-651,652,-643,653]]},{"type":"Polygon","id":30011,"arcs":[[654,655,656,657,-440,-500]]},{"type":"Polygon","id":30095,"arcs":[[-562,658,-633,-626,-476]]},{"type":"Polygon","id":27051,"arcs":[[-489,659,660,661,-527]]},{"type":"Polygon","id":27041,"arcs":[[-593,662,663,-660,-488]]},{"type":"Polygon","id":55041,"arcs":[[664,665,666,667,668,-599,-570]]},{"type":"Polygon","id":53011,"arcs":[[-584,669,-638,-586]]},{"type":"Polygon","id":53039,"arcs":[[-486,670,671,672,673,674,-581,-408]]},{"type":"Polygon","id":30003,"arcs":[[-444,675,676,677,678,-560,-563]]},{"type":"Polygon","id":27155,"arcs":[[-662,679,680,681,-533,-528]]},{"type":"Polygon","id":55037,"arcs":[[-620,682,-665,-569]]},{"type":"Polygon","id":41059,"arcs":[[-537,683,684,685,686,-484,-539]]},{"type":"Polygon","id":41063,"arcs":[[-495,-564,-518,-505,687,688,689,-684,-536]]},{"type":"Polygon","id":26109,"arcs":[[690,691,692,-618,693]]},{"type":"Polygon","id":55099,"arcs":[[-598,694,695,696,697,-649,698,-541]]},{"type":"Polygon","id":46105,"arcs":[[699,700,701,702,703,-604]]},{"type":"Polygon","id":46031,"arcs":[[704,705,706,707,-700,-603,-565]]},{"type":"Polygon","id":46063,"arcs":[[-605,-704,708,-655,-499,-615]]},{"type":"Polygon","id":46021,"arcs":[[-612,709,710,-705,-513]]},{"type":"Polygon","id":30001,"arcs":[[-637,711,712,713,714,-509,-617]]},{"type":"Polygon","id":46089,"arcs":[[-614,715,716,717,-710,-611]]},{"type":"Polygon","id":46013,"arcs":[[-608,718,719,720,721,722,-716,-613]]},{"type":"Polygon","id":46109,"arcs":[[-682,723,724,725,726,-534]]},{"type":"Polygon","id":46091,"arcs":[[-727,727,-719,-607]]},{"type":"Polygon","id":41049,"arcs":[[-687,728,729,730,-671,-485]]},{"type":"Polygon","id":55085,"arcs":[[-669,731,732,-695,-597]]},{"type":"Polygon","id":41061,"arcs":[[733,734,-685,-690]]},{"type":"Polygon","id":30057,"arcs":[[-632,735,-712,-636,-552]]},{"type":"Polygon","id":27009,"arcs":[[-625,736,737,-595]]},{"type":"Polygon","id":41021,"arcs":[[738,739,740,-672,-731]]},{"type":"Polygon","id":30075,"arcs":[[-658,741,742,743,-676,-443,-441]]},{"type":"Polygon","id":26031,"arcs":[[744,745,746,747,748,749]]},{"type":"MultiPolygon","id":41057,"arcs":[[[750,751,752,753,754,-601]]]},{"type":"Polygon","id":41067,"arcs":[[755,756,757,-751,-640]]},{"type":"Polygon","id":27145,"arcs":[[-738,758,759,760,761,762,-663,-592,-596]]},{"type":"Polygon","id":27149,"arcs":[[763,764,765,-680,-661]]},{"type":"Polygon","id":27121,"arcs":[[-763,766,767,-764,-664]]},{"type":"Polygon","id":41055,"arcs":[[768,-673,-741]]},{"type":"Polygon","id":27059,"arcs":[[769,770,771,-623,-642]]},{"type":"Polygon","id":27025,"arcs":[[-646,772,773,774,-770,-575]]},{"type":"Polygon","id":55095,"arcs":[[775,776,777,-773,-645]]},{"type":"Polygon","id":41051,"arcs":[[-670,-583,778,779,-756,-639]]},{"type":"Polygon","id":41027,"arcs":[[780,781,-779,-582,-675]]},{"type":"Polygon","id":41065,"arcs":[[-769,-740,782,783,784,785,-781,-674]]},{"type":"Polygon","id":16059,"arcs":[[-715,786,787,788,789,-502,-510]]},{"type":"MultiPolygon","id":23029,"arcs":[[[790,-577,-345,791]]]},{"type":"Polygon","id":23007,"arcs":[[792,793,794,795,-548]]},{"type":"Polygon","id":26141,"arcs":[[796,797,-745,798]]},{"type":"Polygon","id":55005,"arcs":[[-653,799,800,801,-776,-644]]},{"type":"Polygon","id":55107,"arcs":[[-698,802,803,-800,-650]]},{"type":"Polygon","id":30009,"arcs":[[-679,804,805,-634,-659,-561]]},{"type":"Polygon","id":46129,"arcs":[[-718,806,807,808,-706,-711]]},{"type":"Polygon","id":46045,"arcs":[[-723,809,810,-807,-717]]},{"type":"Polygon","id":46037,"arcs":[[-728,-726,811,812,813,814,-720]]},{"type":"Polygon","id":27011,"arcs":[[-681,-766,815,816,817,-724]]},{"type":"Polygon","id":27141,"arcs":[[-624,-772,818,819,820,-759,-737]]},{"type":"Polygon","id":55069,"arcs":[[821,822,823,-696,-733]]},{"type":"Polygon","id":46041,"arcs":[[-809,824,825,826,827,-707]]},{"type":"Polygon","id":46137,"arcs":[[-828,828,829,-701,-708]]},{"type":"Polygon","id":55067,"arcs":[[-668,830,831,832,833,-822,-732]]},{"type":"Polygon","id":41005,"arcs":[[-782,-786,834,835,-757,-780]]},{"type":"Polygon","id":41071,"arcs":[[-836,836,837,-752,-758]]},{"type":"Polygon","id":27171,"arcs":[[-821,838,839,840,841,-760]]},{"type":"Polygon","id":27003,"arcs":[[-775,842,843,844,-819,-771]]},{"type":"Polygon","id":27067,"arcs":[[845,846,847,848,-767,-762]]},{"type":"Polygon","id":27151,"arcs":[[-849,849,850,-816,-765,-768]]},{"type":"Polygon","id":55119,"arcs":[[-824,851,852,853,-803,-697]]},{"type":"Polygon","id":55083,"arcs":[[854,855,856,857,858,859,860,-831,-667]]},{"type":"Polygon","id":23017,"arcs":[[-795,861,862,863,864,865,866]]},{"type":"Polygon","id":46051,"arcs":[[-818,867,868,869,-812,-725]]},{"type":"Polygon","id":27093,"arcs":[[-842,870,871,-846,-761]]},{"type":"Polygon","id":33007,"arcs":[[872,873,874,875,-866]]},{"type":"Polygon","id":27163,"arcs":[[-778,876,877,878,879,-843,-774]]},{"type":"Polygon","id":55017,"arcs":[[-854,880,881,882,-801,-804]]},{"type":"Polygon","id":41047,"arcs":[[-835,-785,883,884,885,-837]]},{"type":"Polygon","id":16003,"arcs":[[886,887,888,889,-688,-504]]},{"type":"Polygon","id":27073,"arcs":[[-851,890,891,892,-868,-817]]},{"type":"MultiPolygon","id":23009,"arcs":[[[893]],[[894]],[[895,-578,-791]]]},{"type":"Polygon","id":46107,"arcs":[[-811,896,897,898,-825,-808]]},{"type":"Polygon","id":46049,"arcs":[[-722,899,900,901,-897,-810]]},{"type":"Polygon","id":27053,"arcs":[[-820,-845,902,903,904,905,-839]]},{"type":"Polygon","id":46115,"arcs":[[-815,906,907,908,-900,-721]]},{"type":"Polygon","id":16085,"arcs":[[-790,909,910,911,-887,-503]]},{"type":"Polygon","id":46019,"arcs":[[-703,912,913,914,-656,-709]]},{"type":"Polygon","id":55109,"arcs":[[915,916,-877,-777]]},{"type":"Polygon","id":55033,"arcs":[[-883,917,918,919,-916,-802]]},{"type":"Polygon","id":26009,"arcs":[[920,921,922,923,924]]},{"type":"Polygon","id":26137,"arcs":[[925,926,-921,927,-747]]},{"type":"Polygon","id":26119,"arcs":[[928,929,-926,-746,-798]]},{"type":"Polygon","id":46025,"arcs":[[930,931,932,933,-907,-814]]},{"type":"Polygon","id":46029,"arcs":[[-870,934,935,-931,-813]]},{"type":"Polygon","id":27023,"arcs":[[-848,936,937,-891,-850]]},{"type":"Polygon","id":27123,"arcs":[[-880,938,-903,-844]]},{"type":"Polygon","id":55073,"arcs":[[-823,-834,939,940,941,942,-852]]},{"type":"Polygon","id":55078,"arcs":[[-861,943,-832]]},{"type":"Polygon","id":41001,"arcs":[[-890,944,945,946,-734,-689]]},{"type":"Polygon","id":41053,"arcs":[[-886,947,948,949,-753,-838]]},{"type":"Polygon","id":41069,"arcs":[[-730,950,951,952,-783,-739]]},{"type":"Polygon","id":41041,"arcs":[[-950,953,954,955,-754]]},{"type":"Polygon","id":46093,"arcs":[[-830,956,957,958,-913,-702]]},{"type":"Polygon","id":55019,"arcs":[[-943,959,960,961,-881,-853]]},{"type":"Polygon","id":55115,"arcs":[[-944,-860,962,963,964,-940,-833]]},{"type":"Polygon","id":50011,"arcs":[[965,966,967,968,969]]},{"type":"Polygon","id":50009,"arcs":[[970,971,972,973,-875]]},{"type":"Polygon","id":50013,"arcs":[[974,975,976,-969]]},{"type":"Polygon","id":36019,"arcs":[[977,978,979,980,-976]]},{"type":"Polygon","id":50019,"arcs":[[-973,981,982,-966,983]]},{"type":"Polygon","id":56029,"arcs":[[984,985,986,987,988,-629,-635,-806]]},{"type":"Polygon","id":36089,"arcs":[[989,990,991,992,993,994]]},{"type":"Polygon","id":56003,"arcs":[[995,996,997,-985,-805,-678]]},{"type":"Polygon","id":56005,"arcs":[[998,999,1000,1001,1002,-743]]},{"type":"Polygon","id":56033,"arcs":[[-744,-1003,1003,-996,-677]]},{"type":"Polygon","id":36033,"arcs":[[-980,1004,1005,-990,1006]]},{"type":"Polygon","id":56011,"arcs":[[-657,-915,1007,1008,-999,-742]]},{"type":"Polygon","id":41023,"arcs":[[-735,-947,1009,1010,1011,-951,-729,-686]]},{"type":"Polygon","id":27085,"arcs":[[-841,1012,1013,1014,-871]]},{"type":"Polygon","id":27019,"arcs":[[-906,1015,1016,-1013,-840]]},{"type":"Polygon","id":46039,"arcs":[[-893,1017,1018,1019,1020,-935,-869]]},{"type":"Polygon","id":27173,"arcs":[[1021,1022,1023,1024,-1018,-892,-938]]},{"type":"Polygon","id":27037,"arcs":[[-879,1025,1026,1027,1028,-904,-939]]},{"type":"Polygon","id":46119,"arcs":[[1029,1030,1031,-826,-899]]},{"type":"Polygon","id":46069,"arcs":[[-902,1032,1033,1034,1035,-1030,-898]]},{"type":"Polygon","id":46059,"arcs":[[-909,1036,1037,1038,-1033,-901]]},{"type":"Polygon","id":27129,"arcs":[[-872,-1015,1039,1040,1041,1042,-1022,-937,-847]]},{"type":"Polygon","id":16037,"arcs":[[1043,1044,1045,1046,-910,-789]]},{"type":"Polygon","id":55093,"arcs":[[-920,1047,1048,-1026,-878,-917]]},{"type":"Polygon","id":26001,"arcs":[[1049,1050,1051,1052]]},{"type":"Polygon","id":26079,"arcs":[[1053,1054,1055,-922]]},{"type":"Polygon","id":26039,"arcs":[[1056,1057,-1054,-927]]},{"type":"Polygon","id":55035,"arcs":[[-962,1058,1059,1060,1061,-918,-882]]},{"type":"Polygon","id":26135,"arcs":[[-1052,1062,-1057,-930]]},{"type":"Polygon","id":16087,"arcs":[[1063,1064,1065,-945,-889]]},{"type":"Polygon","id":41031,"arcs":[[-953,1066,1067,1068,-884,-784]]},{"type":"Polygon","id":27139,"arcs":[[-1029,1069,1070,1071,-1016,-905]]},{"type":"Polygon","id":46057,"arcs":[[-1021,1072,1073,-932,-936]]},{"type":"Polygon","id":50015,"arcs":[[1074,1075,1076,-967,-983]]},{"type":"Polygon","id":41043,"arcs":[[-1069,1077,1078,1079,-948,-885]]},{"type":"Polygon","id":46117,"arcs":[[-1032,1080,1081,1082,1083,-827]]},{"type":"Polygon","id":26019,"arcs":[[1084,1085,1086,1087]]},{"type":"Polygon","id":50005,"arcs":[[1088,1089,1090,-1075,-982,-972]]},{"type":"MultiPolygon","id":23027,"arcs":[[[-580,1091,1092,1093,1094,-546]]]},{"type":"Polygon","id":16043,"arcs":[[1095,1096,1097,1098,1099,-713,-736,-631]]},{"type":"Polygon","id":46055,"arcs":[[1100,1101,1102,-957,-829,-1084]]},{"type":"Polygon","id":50007,"arcs":[[-1077,1103,1104,1105,-978,-975,-968]]},{"type":"Polygon","id":41003,"arcs":[[-1080,1106,-954,-949]]},{"type":"Polygon","id":23011,"arcs":[[1107,1108,1109,1110,-793,-547,-1095]]},{"type":"Polygon","id":27143,"arcs":[[-1017,-1072,1111,1112,-1040,-1014]]},{"type":"Polygon","id":27049,"arcs":[[1113,1114,1115,1116,1117,-1027,-1049]]},{"type":"Polygon","id":27127,"arcs":[[1118,1119,1120,1121,-1023,-1043]]},{"type":"Polygon","id":55097,"arcs":[[1122,1123,1124,1125,-941]]},{"type":"Polygon","id":55141,"arcs":[[-1126,1126,1127,1128,-960,-942]]},{"type":"MultiPolygon","id":55009,"arcs":[[[-857,1129]],[[-859,1130,1131,1132,1133,1134,-963]]]},{"type":"Polygon","id":55091,"arcs":[[-1062,1135,1136,-1114,-1048,-919]]},{"type":"Polygon","id":55135,"arcs":[[1137,1138,1139,-1123,-965]]},{"type":"Polygon","id":55061,"arcs":[[1140,1141,-1132,1142,1143]]},{"type":"Polygon","id":56039,"arcs":[[1144,1145,1146,1147,1148,-1096,-630,-989]]},{"type":"Polygon","id":46005,"arcs":[[-934,1149,1150,1151,-1037,-908]]},{"type":"Polygon","id":27081,"arcs":[[1152,1153,1154,-1019,-1025]]},{"type":"Polygon","id":27083,"arcs":[[-1122,1155,1156,-1153,-1024]]},{"type":"Polygon","id":46081,"arcs":[[-959,1157,1158,-1008,-914]]},{"type":"Polygon","id":55011,"arcs":[[-1061,1159,1160,1161,-1136]]},{"type":"Polygon","id":55121,"arcs":[[1162,1163,1164,-1160,-1060]]},{"type":"Polygon","id":55053,"arcs":[[-961,-1129,1165,1166,1167,-1163,-1059]]},{"type":"Polygon","id":55087,"arcs":[[-964,-1135,1168,1169,-1138]]},{"type":"Polygon","id":16033,"arcs":[[-1100,1170,1171,-787,-714]]},{"type":"Polygon","id":56019,"arcs":[[-1002,1172,1173,1174,-997,-1004]]},{"type":"Polygon","id":41013,"arcs":[[-952,-1012,1175,1176,-1067]]},{"type":"Polygon","id":46065,"arcs":[[-1036,1177,-1081,-1031]]},{"type":"Polygon","id":36031,"arcs":[[1178,1179,1180,1181,-1005,-979,-1106]]},{"type":"Polygon","id":27079,"arcs":[[1182,1183,1184,1185,-1112,-1071]]},{"type":"Polygon","id":27131,"arcs":[[-1028,-1118,1186,1187,1188,-1183,-1070]]},{"type":"Polygon","id":46077,"arcs":[[-1074,1189,1190,1191,1192,-1150,-933]]},{"type":"Polygon","id":46011,"arcs":[[-1155,1193,1194,1195,-1190,-1073,-1020]]},{"type":"Polygon","id":26101,"arcs":[[1196,1197,1198,1199,-1086]]},{"type":"Polygon","id":26165,"arcs":[[1200,1201,1202,-1197,1203]]},{"type":"Polygon","id":26143,"arcs":[[1204,1205,1206,1207,-1058]]},{"type":"Polygon","id":26113,"arcs":[[-1208,1208,1209,-1201,-1055]]},{"type":"Polygon","id":26069,"arcs":[[1210,1211,1212,-1051]]},{"type":"Polygon","id":26129,"arcs":[[-1213,1213,1214,-1205,-1063]]},{"type":"Polygon","id":16045,"arcs":[[-912,1215,1216,1217,1218,-1064,-888]]},{"type":"Polygon","id":46103,"arcs":[[-1103,1219,1220,1221,1222,-1158,-958]]},{"type":"Polygon","id":50023,"arcs":[[1223,1224,-1104,-1076,-1091]]},{"type":"Polygon","id":27015,"arcs":[[1225,1226,1227,1228,-1119,-1042]]},{"type":"Polygon","id":23001,"arcs":[[1229,1230,-862,-794,-1111]]},{"type":"Polygon","id":27103,"arcs":[[1231,-1226,-1041,-1113,-1186]]},{"type":"Polygon","id":27157,"arcs":[[-1137,-1162,1232,1233,-1115]]},{"type":"Polygon","id":41045,"arcs":[[-1066,1234,1235,1236,1237,1238,-1010,-946]]},{"type":"Polygon","id":33009,"arcs":[[1239,1240,1241,1242,1243,1244,-1089,-971,-874]]},{"type":"Polygon","id":41017,"arcs":[[-1177,1245,1246,1247,1248,-1078,-1068]]},{"type":"MultiPolygon","id":36045,"arcs":[[[1249,-994,1250,1251,1252,1253,1254]]]},{"type":"MultiPolygon","id":23013,"arcs":[[[1255,1256,-1093]]]},{"type":"Polygon","id":16015,"arcs":[[-1047,1257,1258,-1216,-911]]},{"type":"MultiPolygon","id":23015,"arcs":[[[-1094,-1257,1259,1260,1261,-1108]]]},{"type":"Polygon","id":55071,"arcs":[[-1142,1262,1263,1264,-1133]]},{"type":"Polygon","id":50001,"arcs":[[-1225,1265,1266,1267,1268,-1179,-1105]]},{"type":"MultiPolygon","id":41039,"arcs":[[[-1249,1269,1270,1271,-955,-1107,-1079]]]},{"type":"Polygon","id":33003,"arcs":[[-865,1272,1273,1274,-1240,-873]]},{"type":"Polygon","id":27013,"arcs":[[-1185,1275,1276,1277,1278,-1227,-1232]]},{"type":"Polygon","id":55057,"arcs":[[1279,1280,1281,1282,-1166,-1128]]},{"type":"Polygon","id":55001,"arcs":[[-1125,1283,1284,1285,-1280,-1127]]},{"type":"Polygon","id":55137,"arcs":[[-1140,1286,1287,1288,-1284,-1124]]},{"type":"Polygon","id":55139,"arcs":[[1289,1290,1291,-1287,-1139,-1170]]},{"type":"Polygon","id":55015,"arcs":[[-1134,-1265,1292,1293,-1290,-1169]]},{"type":"Polygon","id":16023,"arcs":[[-1172,1294,1295,1296,-1044,-788]]},{"type":"Polygon","id":50017,"arcs":[[-1245,1297,-1266,-1224,-1090]]},{"type":"Polygon","id":36049,"arcs":[[1298,1299,-1251,-993,1300]]},{"type":"Polygon","id":46085,"arcs":[[1301,1302,1303,1304,1305,-1082,-1178,-1035,1306]]},{"type":"Polygon","id":27117,"arcs":[[-1157,1307,1308,1309,-1194,-1154]]},{"type":"Polygon","id":27101,"arcs":[[-1121,1310,1311,1312,-1308,-1156]]},{"type":"Polygon","id":46073,"arcs":[[-1152,1313,1314,1315,1316,-1038]]},{"type":"Polygon","id":27147,"arcs":[[1317,1318,1319,1320,-1188]]},{"type":"Polygon","id":27039,"arcs":[[1321,1322,-1318,-1187,-1117]]},{"type":"Polygon","id":46101,"arcs":[[-1310,1323,1324,-1195]]},{"type":"Polygon","id":27161,"arcs":[[-1321,1325,1326,-1276,-1184,-1189]]},{"type":"Polygon","id":46017,"arcs":[[-1317,1327,-1307,-1034,-1039]]},{"type":"Polygon","id":46111,"arcs":[[-1193,1328,1329,1330,1331,-1314,-1151]]},{"type":"Polygon","id":27109,"arcs":[[-1234,1332,1333,1334,-1322,-1116]]},{"type":"Polygon","id":27033,"arcs":[[-1229,1335,1336,1337,-1311,-1120]]},{"type":"Polygon","id":46079,"arcs":[[-1196,-1325,1338,1339,1340,-1191]]},{"type":"Polygon","id":46097,"arcs":[[-1341,1341,1342,-1329,-1192]]},{"type":"Polygon","id":27169,"arcs":[[-1161,-1165,1343,1344,1345,-1333,-1233]]},{"type":"Polygon","id":56045,"arcs":[[-1159,-1223,1346,1347,1348,-1000,-1009]]},{"type":"Polygon","id":26105,"arcs":[[1349,1350,1351,-1199]]},{"type":"MultiPolygon","id":23005,"arcs":[[[-1231,1352,1353,1354,1355,1356,-863]]]},{"type":"Polygon","id":46075,"arcs":[[-1306,1357,1358,-1101,-1083]]},{"type":"Polygon","id":56043,"arcs":[[-1175,1359,1360,1361,-986,-998]]},{"type":"MultiPolygon","id":23023,"arcs":[[[-1355,1362]],[[1363,1364,-1261,1365]],[[1366,-1353,-1230,-1110]]]},{"type":"Polygon","id":26085,"arcs":[[-1198,-1203,1367,1368,-1350]]},{"type":"Polygon","id":26133,"arcs":[[-1210,1369,1370,-1368,-1202]]},{"type":"Polygon","id":26035,"arcs":[[-1207,1371,1372,-1370,-1209]]},{"type":"Polygon","id":26051,"arcs":[[1373,1374,1375,-1372,-1206,-1215]]},{"type":"Polygon","id":55081,"arcs":[[-1283,1376,1377,-1167]]},{"type":"Polygon","id":16075,"arcs":[[-1219,1378,-1235,-1065]]},{"type":"Polygon","id":36041,"arcs":[[1379,1380,1381,1382,-991,-1006,-1182]]},{"type":"Polygon","id":27165,"arcs":[[-1279,1383,1384,-1336,-1228]]},{"type":"Polygon","id":16039,"arcs":[[-1046,1385,1386,1387,1388,1389,1390,-1258]]},{"type":"Polygon","id":36043,"arcs":[[-1383,1391,1392,1393,1394,-1301,-992]]},{"type":"Polygon","id":55063,"arcs":[[-1168,-1378,1395,1396,-1344,-1164]]},{"type":"Polygon","id":56017,"arcs":[[-1362,1397,-987]]},{"type":"Polygon","id":16051,"arcs":[[-1099,1398,1399,1400,-1295,-1171]]},{"type":"Polygon","id":41025,"arcs":[[-1239,1401,1402,1403,-1246,-1176,-1011]]},{"type":"Polygon","id":56013,"arcs":[[-1398,-1361,1404,1405,1406,1407,-1145,-988]]},{"type":"Polygon","id":26017,"arcs":[[1408,1409,1410,1411,-1375,1412]]},{"type":"Polygon","id":46071,"arcs":[[-1359,1413,1414,1415,-1220,-1102]]},{"type":"Polygon","id":16013,"arcs":[[-1297,1416,1417,1418,1419,1420,1421,-1386,-1045]]},{"type":"Polygon","id":16081,"arcs":[[-1149,1422,1423,-1097]]},{"type":"Polygon","id":55047,"arcs":[[-1292,1424,1425,1426,1427,-1288]]},{"type":"Polygon","id":55077,"arcs":[[-1428,1428,-1285,-1289]]},{"type":"Polygon","id":50027,"arcs":[[-1244,1429,1430,1431,1432,-1267,-1298]]},{"type":"MultiPolygon","id":41019,"arcs":[[[1433,1434,1435,1436,1437,1438,-1271]]]},{"type":"Polygon","id":55039,"arcs":[[1439,1440,1441,-1425,-1291,-1294]]},{"type":"Polygon","id":46003,"arcs":[[-1332,1442,1443,1444,1445,-1315]]},{"type":"Polygon","id":46015,"arcs":[[-1446,1446,-1302,-1328,-1316]]},{"type":"Polygon","id":16065,"arcs":[[-1424,1447,-1399,-1098]]},{"type":"Polygon","id":55117,"arcs":[[1448,1449,1450,-1440,-1293,-1264]]},{"type":"Polygon","id":16027,"arcs":[[-1218,1451,1452,-1236,-1379]]},{"type":"Polygon","id":46095,"arcs":[[-1305,1453,1454,-1414,-1358]]},{"type":"Polygon","id":16025,"arcs":[[1455,1456,-1387,-1422]]},{"type":"Polygon","id":50021,"arcs":[[1457,1458,-1268,-1433]]},{"type":"Polygon","id":46033,"arcs":[[1459,1460,1461,-1347,-1222]]},{"type":"Polygon","id":27133,"arcs":[[-1313,1462,1463,1464,-1309]]},{"type":"Polygon","id":27105,"arcs":[[-1338,1465,1466,1467,-1463,-1312]]},{"type":"Polygon","id":27047,"arcs":[[1468,1469,1470,1471,-1326,-1320]]},{"type":"Polygon","id":27099,"arcs":[[-1335,1472,1473,1474,1475,-1469,-1319,-1323]]},{"type":"Polygon","id":27055,"arcs":[[-1397,1476,1477,1478,1479,-1345]]},{"type":"Polygon","id":46035,"arcs":[[1480,1481,1482,-1443,-1331]]},{"type":"Polygon","id":46061,"arcs":[[-1343,1483,1484,-1481,-1330]]},{"type":"Polygon","id":27045,"arcs":[[-1346,-1480,1485,1486,-1473,-1334]]},{"type":"Polygon","id":27063,"arcs":[[-1385,1487,1488,1489,1490,-1466,-1337]]},{"type":"Polygon","id":27043,"arcs":[[-1327,-1472,1491,1492,1493,-1277]]},{"type":"Polygon","id":46099,"arcs":[[1494,1495,1496,1497,-1339,-1324,-1465]]},{"type":"Polygon","id":27091,"arcs":[[-1278,-1494,1498,1499,-1488,-1384]]},{"type":"Polygon","id":46087,"arcs":[[-1340,-1498,1500,1501,-1484,-1342]]},{"type":"Polygon","id":26111,"arcs":[[-1412,1502,1503,1504,-1376]]},{"type":"Polygon","id":26127,"arcs":[[1505,1506,1507,-1351]]},{"type":"Polygon","id":26073,"arcs":[[-1505,1508,1509,1510,-1373]]},{"type":"MultiPolygon","id":23031,"arcs":[[[1511,1512,-1273,-864,-1357]]]},{"type":"Polygon","id":26107,"arcs":[[-1511,1513,1514,-1371]]},{"type":"Polygon","id":26123,"arcs":[[-1515,1515,1516,1517,-1506,-1369]]},{"type":"Polygon","id":36115,"arcs":[[-1459,1518,1519,1520,1521,-1180,-1269]]},{"type":"Polygon","id":16001,"arcs":[[-1259,-1391,1522,-1452,-1217]]},{"type":"Polygon","id":36113,"arcs":[[1523,-1380,-1181,-1522]]},{"type":"Polygon","id":46123,"arcs":[[1524,1525,1526,-1454,-1304]]},{"type":"Polygon","id":33001,"arcs":[[1527,1528,-1241,-1275]]},{"type":"Polygon","id":26157,"arcs":[[1529,1530,1531,1532,1533,-1410,1534]]},{"type":"Polygon","id":55123,"arcs":[[1535,1536,1537,1538,-1477,-1396,-1377,-1282]]},{"type":"MultiPolygon","id":36075,"arcs":[[[-1254,1539]],[[-1300,1540,1541,1542,1543,1544,-1252]]]},{"type":"Polygon","id":46113,"arcs":[[1545,1546,1547,1548,-1460,-1221,-1416]]},{"type":"Polygon","id":26151,"arcs":[[1549,1550,-1531,1551,1552]]},{"type":"Polygon","id":16073,"arcs":[[-1523,-1390,1553,1554,1555,-1237,-1453]]},{"type":"Polygon","id":55021,"arcs":[[1556,1557,1558,-1286,-1429,-1427]]},{"type":"Polygon","id":55111,"arcs":[[-1559,1559,1560,1561,-1536,-1281]]},{"type":"Polygon","id":55027,"arcs":[[1562,1563,1564,1565,-1557,-1426,-1442]]},{"type":"Polygon","id":16019,"arcs":[[-1448,-1423,-1148,1566,1567,1568,-1400]]},{"type":"Polygon","id":16011,"arcs":[[1569,1570,1571,-1417,-1296,-1401,-1569]]},{"type":"Polygon","id":41035,"arcs":[[1572,1573,1574,1575,-1434,-1270,-1248]]},{"type":"Polygon","id":41037,"arcs":[[1576,1577,-1573,-1247,-1404]]},{"type":"Polygon","id":36065,"arcs":[[1578,1579,-1541,-1299,-1395]]},{"type":"Polygon","id":33013,"arcs":[[-1529,1580,1581,1582,1583,-1242]]},{"type":"MultiPolygon","id":41011,"arcs":[[[1584,1585,-1438]]]},{"type":"Polygon","id":33019,"arcs":[[-1584,1586,1587,1588,-1430,-1243]]},{"type":"Polygon","id":33017,"arcs":[[-1513,1589,1590,-1581,-1528,-1274]]},{"type":"Polygon","id":26145,"arcs":[[-1534,1591,1592,1593,-1503,-1411]]},{"type":"Polygon","id":55103,"arcs":[[1594,1595,1596,-1537,-1562]]},{"type":"Polygon","id":55089,"arcs":[[1597,1598,1599,-1450]]},{"type":"Polygon","id":55131,"arcs":[[-1451,-1600,1600,-1563,-1441]]},{"type":"Polygon","id":19189,"arcs":[[1601,1602,1603,-1492,-1471]]},{"type":"Polygon","id":19109,"arcs":[[1604,1605,1606,-1499,-1493,-1604,1607]]},{"type":"Polygon","id":19059,"arcs":[[1608,1609,-1490,1610]]},{"type":"Polygon","id":19063,"arcs":[[1611,-1611,-1489,-1500,-1607]]},{"type":"Polygon","id":19195,"arcs":[[1612,-1602,-1470,-1476,1613]]},{"type":"Polygon","id":19143,"arcs":[[1614,1615,-1467,-1491,-1610]]},{"type":"Polygon","id":56027,"arcs":[[-1462,1616,1617,1618,1619,1620,-1348]]},{"type":"Polygon","id":19131,"arcs":[[1621,1622,-1614,-1475,1623]]},{"type":"Polygon","id":19119,"arcs":[[1624,1625,-1495,-1464,-1468,-1616]]},{"type":"Polygon","id":19089,"arcs":[[1626,1627,-1624,-1474,-1487]]},{"type":"Polygon","id":19005,"arcs":[[-1539,1628,1629,1630,-1478]]},{"type":"Polygon","id":19191,"arcs":[[1631,1632,-1627,-1486,-1479,-1631]]},{"type":"Polygon","id":46083,"arcs":[[-1626,1633,1634,1635,1636,-1496]]},{"type":"Polygon","id":56009,"arcs":[[-1621,1637,1638,1639,1640,-1173,-1001,-1349]]},{"type":"Polygon","id":46023,"arcs":[[-1445,1641,1642,1643,1644,1645,1646,-1447]]},{"type":"Polygon","id":46125,"arcs":[[-1497,-1637,1647,1648,1649,-1501]]},{"type":"Polygon","id":46067,"arcs":[[-1502,-1650,1650,1651,-1643,1652,-1482,-1485]]},{"type":"Polygon","id":56025,"arcs":[[-1174,-1641,1653,-1405,-1360]]},{"type":"Polygon","id":46043,"arcs":[[-1483,-1653,-1642,-1444]]},{"type":"Polygon","id":46053,"arcs":[[-1647,1654,1655,-1525,-1303]]},{"type":"Polygon","id":46047,"arcs":[[-1549,1656,1657,-1617,-1461]]},{"type":"Polygon","id":26121,"arcs":[[-1518,1658,1659,1660,-1507]]},{"type":"Polygon","id":26117,"arcs":[[-1510,1661,1662,1663,-1516,-1514]]},{"type":"Polygon","id":56035,"arcs":[[1664,1665,-1146,-1408]]},{"type":"Polygon","id":26057,"arcs":[[-1504,-1594,1666,1667,-1662,-1509]]},{"type":"Polygon","id":55023,"arcs":[[-1597,1668,1669,-1629,-1538]]},{"type":"Polygon","id":36011,"arcs":[[1670,1671,1672,1673,1674,1675,-1544]]},{"type":"Polygon","id":36091,"arcs":[[-1521,1676,1677,1678,1679,1680,-1381,-1524]]},{"type":"Polygon","id":46007,"arcs":[[1681,1682,-1546,-1415]]},{"type":"Polygon","id":46121,"arcs":[[-1527,1683,-1682,-1455]]},{"type":"Polygon","id":36073,"arcs":[[1684,1685,1686,1687]]},{"type":"Polygon","id":36063,"arcs":[[-1687,1688,1689,1690]]},{"type":"Polygon","id":36055,"arcs":[[1691,1692,1693,1694,-1685,1695]]},{"type":"MultiPolygon","id":36117,"arcs":[[[1696,1697,-1692,1698,-1675]]]},{"type":"Polygon","id":26087,"arcs":[[1699,1700,1701,1702,-1532,-1551]]},{"type":"Polygon","id":56023,"arcs":[[-1666,1703,1704,1705,1706,1707,-1567,-1147]]},{"type":"Polygon","id":50003,"arcs":[[-1432,1708,1709,1710,1711,-1519,-1458]]},{"type":"Polygon","id":55025,"arcs":[[-1566,1712,1713,1714,1715,-1560,-1558]]},{"type":"Polygon","id":26081,"arcs":[[1716,1717,1718,1719,-1659,-1517,-1664]]},{"type":"Polygon","id":36035,"arcs":[[-1681,1720,-1392,-1382]]},{"type":"MultiPolygon","id":33015,"arcs":[[[1721,1722,1723,-1582,-1591]]]},{"type":"Polygon","id":36067,"arcs":[[1724,1725,-1671,-1543]]},{"type":"Polygon","id":50025,"arcs":[[-1589,1726,1727,-1709,-1431]]},{"type":"Polygon","id":19167,"arcs":[[1728,1729,1730,-1634,-1625]]},{"type":"Polygon","id":19141,"arcs":[[1731,1732,-1729,-1615]]},{"type":"Polygon","id":19033,"arcs":[[-1623,1733,1734,1735,-1613]]},{"type":"Polygon","id":19081,"arcs":[[-1736,1736,-1608,-1603]]},{"type":"Polygon","id":19147,"arcs":[[-1606,1737,1738,-1612]]},{"type":"Polygon","id":19041,"arcs":[[-1739,1739,-1732,-1609]]},{"type":"Polygon","id":26049,"arcs":[[-1703,1740,1741,1742,-1592,-1533]]},{"type":"Polygon","id":19037,"arcs":[[-1633,1743,1744,1745,-1628]]},{"type":"Polygon","id":19067,"arcs":[[-1746,1746,-1734,-1622]]},{"type":"Polygon","id":55049,"arcs":[[-1561,-1716,1747,1748,1749,-1595]]},{"type":"Polygon","id":55043,"arcs":[[-1750,1750,1751,1752,1753,-1669,-1596]]},{"type":"Polygon","id":33011,"arcs":[[-1724,1754,1755,1756,1757,-1587,-1583]]},{"type":"Polygon","id":26139,"arcs":[[-1720,1758,1759,-1660]]},{"type":"Polygon","id":16063,"arcs":[[1760,1761,1762,-1456,-1421]]},{"type":"Polygon","id":16047,"arcs":[[-1763,1763,1764,-1388,-1457]]},{"type":"Polygon","id":55055,"arcs":[[1765,1766,1767,-1713,-1565]]},{"type":"Polygon","id":16067,"arcs":[[1768,1769,-1761,-1420]]},{"type":"Polygon","id":55133,"arcs":[[-1601,1770,1771,1772,-1766,-1564]]},{"type":"Polygon","id":55079,"arcs":[[1773,1774,-1771,-1599]]},{"type":"Polygon","id":36053,"arcs":[[-1580,1775,1776,1777,-1725,-1542]]},{"type":"Polygon","id":33005,"arcs":[[-1758,1778,1779,-1727,-1588]]},{"type":"Polygon","id":46135,"arcs":[[1780,1781,1782,1783,-1651,-1649]]},{"type":"Polygon","id":46009,"arcs":[[-1784,1784,-1644,-1652]]},{"type":"Polygon","id":26155,"arcs":[[-1743,1785,1786,1787,-1667,-1593]]},{"type":"Polygon","id":36037,"arcs":[[1788,1789,1790,-1689,-1686,-1695]]},{"type":"Polygon","id":26067,"arcs":[[1791,1792,1793,-1717,-1663]]},{"type":"Polygon","id":26037,"arcs":[[-1788,1794,1795,-1792,-1668]]},{"type":"Polygon","id":16077,"arcs":[[-1572,1796,1797,1798,-1418]]},{"type":"MultiPolygon","id":36029,"arcs":[[[1799]],[[-1791,1800,1801,1802,1803,-1690]]]},{"type":"Polygon","id":46127,"arcs":[[-1731,1804,1805,1806,1807,1808,-1635]]},{"type":"Polygon","id":46027,"arcs":[[-1809,1809,1810,-1781,-1648,-1636]]},{"type":"Polygon","id":19065,"arcs":[[1811,1812,1813,-1744,-1632]]},{"type":"Polygon","id":19043,"arcs":[[-1670,-1754,1814,1815,-1812,-1630]]},{"type":"Polygon","id":36057,"arcs":[[-1680,1816,1817,1818,-1393,-1721]]},{"type":"Polygon","id":36069,"arcs":[[1819,1820,1821,1822,-1693,-1698]]},{"type":"Polygon","id":16005,"arcs":[[1823,1824,1825,-1797,-1571]]},{"type":"Polygon","id":16029,"arcs":[[-1568,-1708,1826,1827,-1824,-1570]]},{"type":"Polygon","id":36099,"arcs":[[1828,1829,1830,-1820,-1697,-1674]]},{"type":"Polygon","id":31165,"arcs":[[1831,1832,1833,-1618,-1658,1834]]},{"type":"Polygon","id":31161,"arcs":[[1835,1836,1837,1838,1839,-1547,1840]]},{"type":"Polygon","id":31045,"arcs":[[1841,-1835,-1657,-1548,-1840]]},{"type":"Polygon","id":31015,"arcs":[[1842,1843,1844,-1655,-1646]]},{"type":"Polygon","id":31103,"arcs":[[-1845,1845,1846,1847,-1526,-1656]]},{"type":"Polygon","id":31031,"arcs":[[-1684,-1848,1848,1849,1850,1851,1852,-1841,-1683]]},{"type":"Polygon","id":41029,"arcs":[[-1576,1853,1854,-1435]]},{"type":"Polygon","id":36051,"arcs":[[-1823,1855,1856,1857,-1789,-1694]]},{"type":"Polygon","id":36083,"arcs":[[-1712,1858,1859,1860,-1677,-1520]]},{"type":"Polygon","id":36093,"arcs":[[1861,1862,-1817,-1679]]},{"type":"Polygon","id":41015,"arcs":[[-1437,1863,1864,1865,-1585]]},{"type":"Polygon","id":16083,"arcs":[[1866,1867,1868,-1554,-1389,-1765]]},{"type":"Polygon","id":19149,"arcs":[[1869,1870,-1805,-1730]]},{"type":"Polygon","id":19021,"arcs":[[1871,1872,1873,-1740]]},{"type":"Polygon","id":19035,"arcs":[[-1874,1874,1875,-1870,-1733]]},{"type":"Polygon","id":19151,"arcs":[[1876,1877,1878,-1872,-1738]]},{"type":"Polygon","id":19197,"arcs":[[1879,1880,1881,1882,-1737]]},{"type":"Polygon","id":19091,"arcs":[[-1883,1883,-1877,-1605]]},{"type":"Polygon","id":19069,"arcs":[[1884,1885,-1880,-1735]]},{"type":"Polygon","id":19023,"arcs":[[1886,1887,1888,-1885,-1747]]},{"type":"Polygon","id":19017,"arcs":[[-1814,1889,-1887,-1745]]},{"type":"Polygon","id":36077,"arcs":[[-1819,1890,1891,1892,-1776,-1579,-1394]]},{"type":"Polygon","id":31089,"arcs":[[1893,1894,1895,1896,1897,1898,-1844]]},{"type":"Polygon","id":26099,"arcs":[[1899,1900,1901,-1701,1902]]},{"type":"Polygon","id":26125,"arcs":[[1903,1904,1905,-1741,-1702,-1902]]},{"type":"MultiPolygon","id":25009,"arcs":[[[1906,1907,1908,-1755,-1723]]]},{"type":"Polygon","id":31107,"arcs":[[-1785,-1783,1909,1910,1911,-1894,-1843,-1645]]},{"type":"Polygon","id":31027,"arcs":[[-1811,1912,1913,1914,-1910,-1782]]},{"type":"Polygon","id":36121,"arcs":[[-1858,1915,1916,-1801,-1790]]},{"type":"Polygon","id":55045,"arcs":[[1917,1918,1919,1920,-1748,-1715]]},{"type":"Polygon","id":16053,"arcs":[[-1770,1921,-1867,-1764,-1762]]},{"type":"Polygon","id":55105,"arcs":[[-1768,1922,1923,1924,-1918,-1714]]},{"type":"Polygon","id":31017,"arcs":[[1925,1926,1927,-1849,-1847]]},{"type":"Polygon","id":55127,"arcs":[[-1773,1928,1929,1930,1931,-1923,-1767]]},{"type":"Polygon","id":55101,"arcs":[[1932,1933,-1929,-1772,-1775]]},{"type":"Polygon","id":36095,"arcs":[[-1863,1934,1935,1936,-1891,-1818]]},{"type":"Polygon","id":36001,"arcs":[[-1861,1937,-1935,-1862,-1678]]},{"type":"Polygon","id":55065,"arcs":[[-1921,1938,1939,-1751,-1749]]},{"type":"Polygon","id":31149,"arcs":[[1940,-1926,-1846,-1899]]},{"type":"Polygon","id":36023,"arcs":[[1941,1942,-1672,-1726,-1778,1943,1944]]},{"type":"Polygon","id":41033,"arcs":[[-1436,-1855,1945,1946,-1864]]},{"type":"Polygon","id":26093,"arcs":[[-1906,1947,1948,1949,-1786,-1742]]},{"type":"Polygon","id":26065,"arcs":[[-1950,1950,1951,-1795,-1787]]},{"type":"Polygon","id":26045,"arcs":[[-1796,-1952,1952,1953,1954,-1793]]},{"type":"Polygon","id":26015,"arcs":[[-1955,1955,1956,1957,-1718,-1794]]},{"type":"Polygon","id":26005,"arcs":[[-1719,-1958,1958,1959,1960,-1759]]},{"type":"Polygon","id":36123,"arcs":[[1961,1962,-1821,-1831]]},{"type":"Polygon","id":31051,"arcs":[[-1808,1963,1964,1965,-1913,-1810]]},{"type":"Polygon","id":25003,"arcs":[[1966,1967,1968,1969,1970,1971,-1859,-1711]]},{"type":"Polygon","id":36017,"arcs":[[-1893,1972,1973,-1944,-1777]]},{"type":"Polygon","id":25011,"arcs":[[1974,-1967,-1710,-1728,-1780,1975]]},{"type":"Polygon","id":25017,"arcs":[[1976,1977,1978,1979,1980,1981,1982,1983,1984,-1756,-1909]]},{"type":"Polygon","id":25027,"arcs":[[-1757,-1985,1985,1986,1987,1988,1989,1990,-1976,-1779]]},{"type":"Polygon","id":16031,"arcs":[[-1799,1991,1992,1993,-1868,-1922,-1769,-1419]]},{"type":"Polygon","id":19061,"arcs":[[1994,1995,1996,1997,-1815,-1753]]},{"type":"Polygon","id":55059,"arcs":[[1998,1999,2000,-1930,-1934]]},{"type":"Polygon","id":19055,"arcs":[[-1998,2001,2002,2003,-1816]]},{"type":"Polygon","id":19187,"arcs":[[-1882,2004,2005,2006,2007,-1878,-1884]]},{"type":"Polygon","id":19019,"arcs":[[-2004,2008,2009,2010,-1813]]},{"type":"Polygon","id":19013,"arcs":[[-2011,2011,2012,2013,-1888,-1890]]},{"type":"Polygon","id":36109,"arcs":[[-1943,2014,2015,2016,-1829,-1673]]},{"type":"Polygon","id":56015,"arcs":[[-1834,2017,2018,2019,2020,-1619]]},{"type":"Polygon","id":56031,"arcs":[[-2021,2021,2022,-1638,-1620]]},{"type":"Polygon","id":16007,"arcs":[[-1707,2023,2024,-1827]]},{"type":"Polygon","id":36101,"arcs":[[-1822,-1963,2025,2026,2027,2028,2029,-1856]]},{"type":"Polygon","id":36013,"arcs":[[2030,2031,2032,2033,-1803]]},{"type":"Polygon","id":19193,"arcs":[[-1876,2034,2035,2036,2037,-1806,-1871]]},{"type":"Polygon","id":19161,"arcs":[[2038,2039,2040,2041,-1873]]},{"type":"Polygon","id":19093,"arcs":[[-2042,2042,-2035,-1875]]},{"type":"Polygon","id":19025,"arcs":[[-2008,2043,2044,-2039,-1879]]},{"type":"Polygon","id":19079,"arcs":[[2045,2046,2047,-2005,-1881]]},{"type":"Polygon","id":19083,"arcs":[[-1886,2048,2049,2050,-2046]]},{"type":"Polygon","id":19075,"arcs":[[-2014,2051,2052,-2049,-1889]]},{"type":"Polygon","id":25015,"arcs":[[-1991,2053,-1968,-1975]]},{"type":"Polygon","id":36097,"arcs":[[-2017,2054,-2026,-1962,-1830]]},{"type":"Polygon","id":36009,"arcs":[[-1917,2055,2056,2057,-2031,-1802]]},{"type":"Polygon","id":31043,"arcs":[[-1807,-2038,2058,-1964]]},{"type":"Polygon","id":36003,"arcs":[[-1857,-2030,2059,2060,-2056,-1916]]},{"type":"Polygon","id":36025,"arcs":[[-1937,2061,2062,2063,2064,2065,-1973,-1892]]},{"type":"Polygon","id":17085,"arcs":[[-1940,2066,2067,2068,-1995,-1752]]},{"type":"Polygon","id":36021,"arcs":[[2069,2070,2071,-1860,-1972]]},{"type":"Polygon","id":17177,"arcs":[[2072,-2067,-1939,-1920,2073,2074]]},{"type":"Polygon","id":17201,"arcs":[[2075,2076,-2074,-1919,-1925]]},{"type":"Polygon","id":16071,"arcs":[[-1826,2077,2078,2079,-1992,-1798]]},{"type":"Polygon","id":17111,"arcs":[[2080,2081,2082,2083,2084,-1931,-2001]]},{"type":"Polygon","id":17007,"arcs":[[-1932,-2085,2085,-2076,-1924]]},{"type":"Polygon","id":17097,"arcs":[[2086,-2081,-2000,2087]]},{"type":"Polygon","id":36039,"arcs":[[2088,-2062,-1936,-1938,-2072]]},{"type":"MultiPolygon","id":25025,"arcs":[[[2089,2090,-1983,2091,-1981]],[[-1979,2092]],[[2093,-1977,-1908]]]},{"type":"Polygon","id":31139,"arcs":[[2094,2095,2096,-1911,-1915]]},{"type":"Polygon","id":31013,"arcs":[[2097,2098,-1832,-1842,-1839]]},{"type":"Polygon","id":31003,"arcs":[[-2097,2099,2100,2101,-1895,-1912]]},{"type":"Polygon","id":26161,"arcs":[[2102,2103,2104,-1948,-1905,2105]]},{"type":"Polygon","id":56007,"arcs":[[-1640,2106,2107,2108,2109,2110,-1406,-1654]]},{"type":"Polygon","id":56001,"arcs":[[-2023,2111,2112,2113,-2107,-1639]]},{"type":"Polygon","id":16041,"arcs":[[-2025,2114,-2078,-1825,-1828]]},{"type":"Polygon","id":26075,"arcs":[[-1949,-2105,2115,2116,2117,-1953,-1951]]},{"type":"Polygon","id":26025,"arcs":[[-2118,2118,2119,2120,-1956,-1954]]},{"type":"Polygon","id":26159,"arcs":[[2121,2122,2123,2124,-1960]]},{"type":"Polygon","id":26077,"arcs":[[-2121,2125,-2122,-1959,-1957]]},{"type":"Polygon","id":36007,"arcs":[[-2066,2126,2127,2128,-1945,-1974]]},{"type":"Polygon","id":36107,"arcs":[[-2129,2129,2130,2131,-2015,-1942]]},{"type":"Polygon","id":19097,"arcs":[[-2069,2132,2133,2134,-1996]]},{"type":"Polygon","id":31179,"arcs":[[-1966,2135,2136,2137,-2095,-1914]]},{"type":"MultiPolygon","id":25021,"arcs":[[[2138,2139]],[[-2091,2140,2141,2142,2143,-1986,-1984]],[[-1982,-2092]]]},{"type":"Polygon","id":25013,"arcs":[[-1990,2144,2145,2146,-1969,-2054]]},{"type":"MultiPolygon","id":25023,"arcs":[[[-2140,2147,2148,2149,2150,-2142,2151]]]},{"type":"Polygon","id":19011,"arcs":[[2152,2153,2154,-2012,-2010]]},{"type":"Polygon","id":19113,"arcs":[[-2003,2155,2156,2157,-2153,-2009]]},{"type":"Polygon","id":19171,"arcs":[[-2155,2158,2159,-2052,-2013]]},{"type":"Polygon","id":19105,"arcs":[[-1997,-2135,2160,2161,-2156,-2002]]},{"type":"Polygon","id":36015,"arcs":[[-2016,-2132,2162,2163,-2027,-2055]]},{"type":"Polygon","id":31173,"arcs":[[-2037,2164,2165,2166,-2136,-1965,-2059]]},{"type":"Polygon","id":56037,"arcs":[[-1407,-2111,2167,2168,2169,2170,-1704,-1665]]},{"type":"Polygon","id":42049,"arcs":[[2171,2172,2173,2174,-2033]]},{"type":"Polygon","id":26021,"arcs":[[2175,2176,2177,2178,-2124]]},{"type":"Polygon","id":19133,"arcs":[[2179,2180,2181,-2165,-2036]]},{"type":"Polygon","id":19127,"arcs":[[-2160,2182,2183,-2050,-2053]]},{"type":"Polygon","id":19027,"arcs":[[-2045,2184,2185,2186,2187,-2040]]},{"type":"Polygon","id":19047,"arcs":[[-2043,-2041,-2188,2188,2189,-2180]]},{"type":"Polygon","id":19015,"arcs":[[-2048,2190,2191,2192,2193,-2006]]},{"type":"Polygon","id":19073,"arcs":[[-2194,2194,2195,-2185,-2044,-2007]]},{"type":"Polygon","id":19169,"arcs":[[-2051,-2184,2196,2197,-2191,-2047]]},{"type":"Polygon","id":17141,"arcs":[[2198,2199,2200,2201,-2075,-2077]]},{"type":"Polygon","id":17015,"arcs":[[-2202,2202,2203,-2133,-2068,-2073]]},{"type":"Polygon","id":36111,"arcs":[[-2071,2204,2205,2206,-2063,-2089]]},{"type":"Polygon","id":17031,"arcs":[[-2087,2207,2208,2209,2210,2211,-2082]]},{"type":"Polygon","id":17037,"arcs":[[2212,2213,2214,2215,-2199,-2086,-2084]]},{"type":"Polygon","id":17089,"arcs":[[-2212,2216,2217,-2213,-2083]]},{"type":"Polygon","id":31075,"arcs":[[2218,2219,2220,-1836,-1853]]},{"type":"MultiPolygon","id":25005,"arcs":[[[2221,2222,2223,2224,2225,-2143,-2151]]]},{"type":"Polygon","id":31091,"arcs":[[2226,2227,2228,-2219,-1852]]},{"type":"Polygon","id":31039,"arcs":[[-2167,2229,2230,2231,2232,-2137]]},{"type":"Polygon","id":31119,"arcs":[[2233,2234,2235,-2100,-2096]]},{"type":"Polygon","id":31167,"arcs":[[-2233,2236,2237,-2234,-2138]]},{"type":"Polygon","id":31171,"arcs":[[2238,2239,2240,-2227,-1851]]},{"type":"Polygon","id":31183,"arcs":[[2241,2242,2243,2244,-1896,-2102]]},{"type":"Polygon","id":31009,"arcs":[[-1850,-1928,2245,2246,2247,-2239]]},{"type":"Polygon","id":31115,"arcs":[[2248,2249,-2246,-1927,-1941,-1898]]},{"type":"Polygon","id":31071,"arcs":[[-2245,2250,2251,-2249,-1897]]},{"type":"Polygon","id":26091,"arcs":[[2252,2253,2254,2255,-2116,-2104]]},{"type":"Polygon","id":36027,"arcs":[[-1971,2256,2257,2258,2259,-2205,-2070]]},{"type":"MultiPolygon","id":25001,"arcs":[[[2260,-2149,2261]]]},{"type":"Polygon","id":26023,"arcs":[[2262,2263,2264,2265,-2120]]},{"type":"Polygon","id":26059,"arcs":[[-2256,2266,2267,2268,-2263,-2119,-2117]]},{"type":"Polygon","id":26149,"arcs":[[-2266,2269,2270,2271,-2126]]},{"type":"Polygon","id":26027,"arcs":[[-2272,2272,2273,-2176,-2123]]},{"type":"Polygon","id":9005,"arcs":[[-2147,2274,2275,2276,-2257,-1970]]},{"type":"Polygon","id":31021,"arcs":[[2277,2278,2279,-2230,-2166,-2182]]},{"type":"Polygon","id":9003,"arcs":[[2280,2281,2282,2283,-2275,-2146]]},{"type":"Polygon","id":9013,"arcs":[[-1989,2284,2285,-2281,-2145]]},{"type":"Polygon","id":19045,"arcs":[[-2204,2286,2287,2288,2289,-2161,-2134]]},{"type":"Polygon","id":9015,"arcs":[[2290,2291,2292,-2285,-1988]]},{"type":"Polygon","id":44007,"arcs":[[-2226,2293,2294,2295,-2291,-1987,-2144]]},{"type":"Polygon","id":36105,"arcs":[[2296,2297,2298,-2064,-2207]]},{"type":"Polygon","id":6093,"arcs":[[-1575,2299,2300,2301,2302,2303,-1946,-1854]]},{"type":"Polygon","id":31069,"arcs":[[-2221,2304,2305,2306,2307,2308,-1837]]},{"type":"Polygon","id":31123,"arcs":[[-2309,2309,2310,2311,-2098,-1838]]},{"type":"Polygon","id":49005,"arcs":[[2312,2313,2314,-2079,-2115]]},{"type":"Polygon","id":31157,"arcs":[[-2312,2315,-2018,-1833,-2099]]},{"type":"Polygon","id":49033,"arcs":[[-1706,2316,2317,2318,2319,-2313,-2024]]},{"type":"Polygon","id":42015,"arcs":[[-2163,-2131,2320,2321,2322,2323,2324]]},{"type":"Polygon","id":42117,"arcs":[[-2164,-2325,2325,2326,-2028]]},{"type":"Polygon","id":49003,"arcs":[[2327,2328,2329,-1993,-2080,-2315]]},{"type":"Polygon","id":32013,"arcs":[[2330,2331,2332,-1402,-1238,-1556,2333]]},{"type":"Polygon","id":32007,"arcs":[[-1994,-2330,2334,2335,2336,2337,-2334,-1555,-1869]]},{"type":"Polygon","id":42083,"arcs":[[-2061,2338,2339,2340,2341,-2057]]},{"type":"Polygon","id":42105,"arcs":[[-2029,-2327,2342,2343,2344,-2339,-2060]]},{"type":"Polygon","id":6015,"arcs":[[-2304,2345,2346,-1865,-1947]]},{"type":"Polygon","id":42127,"arcs":[[-2065,-2299,2347,2348,2349,2350,-2127]]},{"type":"Polygon","id":42115,"arcs":[[2351,2352,-2321,-2130,-2128,-2351]]},{"type":"Polygon","id":42123,"arcs":[[-2342,2353,2354,2355,-2172,-2032,-2058]]},{"type":"Polygon","id":6049,"arcs":[[-1578,2356,2357,2358,-2300,-1574]]},{"type":"Polygon","id":32031,"arcs":[[2359,2360,2361,2362,2363,2364,2365,2366,2367,-2357,-1577,-1403,-2333]]},{"type":"Polygon","id":17043,"arcs":[[2368,2369,-2217,-2211]]},{"type":"Polygon","id":39007,"arcs":[[2370,2371,2372,2373,2374,-2174]]},{"type":"Polygon","id":19031,"arcs":[[-2162,-2290,2375,2376,2377,-2157]]},{"type":"Polygon","id":17195,"arcs":[[-2201,2378,2379,2380,2381,-2287,-2203]]},{"type":"Polygon","id":31011,"arcs":[[-2236,2382,2383,2384,-2242,-2101]]},{"type":"Polygon","id":17103,"arcs":[[-2216,2385,2386,-2379,-2200]]},{"type":"Polygon","id":19085,"arcs":[[-2190,2387,2388,2389,-2278,-2181]]},{"type":"Polygon","id":19095,"arcs":[[2390,2391,2392,2393,-2154]]},{"type":"Polygon","id":19049,"arcs":[[2394,2395,2396,-2195,-2193]]},{"type":"Polygon","id":19165,"arcs":[[2397,2398,2399,-2388,-2189]]},{"type":"Polygon","id":19009,"arcs":[[2400,2401,-2398,-2187]]},{"type":"Polygon","id":19157,"arcs":[[-2394,2402,2403,2404,-2159]]},{"type":"Polygon","id":19153,"arcs":[[-2198,2405,2406,2407,-2395,-2192]]},{"type":"Polygon","id":19099,"arcs":[[-2183,-2405,2408,2409,-2406,-2197]]},{"type":"Polygon","id":19077,"arcs":[[-2397,2410,-2401,-2186,-2196]]},{"type":"Polygon","id":19103,"arcs":[[-2378,2411,2412,2413,-2391,-2158]]},{"type":"Polygon","id":39085,"arcs":[[2414,2415,2416,-2374]]},{"type":"Polygon","id":42039,"arcs":[[-2356,2417,2418,2419,-2371,-2173]]},{"type":"Polygon","id":17161,"arcs":[[2420,2421,2422,2423,2424,-2288,-2382]]},{"type":"Polygon","id":44001,"arcs":[[2425,-2294,-2225]]},{"type":"Polygon","id":19163,"arcs":[[-2425,2426,-2376,-2289]]},{"type":"Polygon","id":44003,"arcs":[[2427,2428,2429,-2292,-2296]]},{"type":"Polygon","id":18039,"arcs":[[2430,2431,2432,2433,2434,-2273,-2271]]},{"type":"Polygon","id":18141,"arcs":[[2435,2436,2437,-2177,-2274,-2435]]},{"type":"Polygon","id":18091,"arcs":[[2438,2439,2440,-2178,-2438]]},{"type":"Polygon","id":18151,"arcs":[[2441,2442,-2264,-2269,2443]]},{"type":"Polygon","id":18087,"arcs":[[2444,-2431,-2270,-2265,-2443]]},{"type":"Polygon","id":31037,"arcs":[[-2232,2445,2446,2447,-2237]]},{"type":"Polygon","id":31141,"arcs":[[-2448,2448,2449,2450,2451,-2383,-2235,-2238]]},{"type":"Polygon","id":31053,"arcs":[[-2280,2452,2453,2454,2455,-2446,-2231]]},{"type":"Polygon","id":31117,"arcs":[[-2241,2456,2457,2458,2459,-2228]]},{"type":"Polygon","id":31005,"arcs":[[-2460,2460,-2305,-2220,-2229]]},{"type":"Polygon","id":31077,"arcs":[[2461,2462,2463,2464,-2243,-2385]]},{"type":"Polygon","id":31041,"arcs":[[-2252,2465,2466,2467,2468,2469,2470,-2247,-2250]]},{"type":"Polygon","id":31113,"arcs":[[-2248,-2471,2471,-2457,-2240]]},{"type":"Polygon","id":31175,"arcs":[[-2244,-2465,2472,-2466,-2251]]},{"type":"MultiPolygon","id":39095,"arcs":[[[2473,2474,2475,2476,-2254,2477,2478,2479,2480,2481,2482]]]},{"type":"Polygon","id":17197,"arcs":[[-2210,2483,2484,2485,2486,-2369]]},{"type":"MultiPolygon","id":39123,"arcs":[[[2487,2488,2489,2490,2491,-2474]]]},{"type":"Polygon","id":17093,"arcs":[[-2487,2492,2493,-2214,-2218,-2370]]},{"type":"Polygon","id":39051,"arcs":[[2494,2495,-2267,-2255,-2477]]},{"type":"Polygon","id":39055,"arcs":[[2496,2497,2498,-2415,-2373]]},{"type":"MultiPolygon","id":9011,"arcs":[[[-2430,2499,2500,2501,-2282,-2286,-2293]]]},{"type":"Polygon","id":18089,"arcs":[[2502,2503,2504,2505,-2484,-2209,2506]]},{"type":"Polygon","id":18127,"arcs":[[2507,-2503,2508,-2440]]},{"type":"Polygon","id":39171,"arcs":[[2509,2510,2511,-2444,-2268,-2496]]},{"type":"Polygon","id":31007,"arcs":[[-2311,2512,2513,2514,-2019,-2316]]},{"type":"Polygon","id":31177,"arcs":[[-2390,2515,2516,-2453,-2279]]},{"type":"MultiPolygon","id":44005,"arcs":[[[2517]],[[2518,-2223]]]},{"type":"MultiPolygon","id":9001,"arcs":[[[2519,2520,2521,2522,-2258,-2277]]]},{"type":"Polygon","id":56021,"arcs":[[-2020,-2515,2523,2524,2525,-2112,-2022]]},{"type":"MultiPolygon","id":44009,"arcs":[[[-2500,-2429,2526]]]},{"type":"Polygon","id":42131,"arcs":[[-2353,2527,2528,2529,-2322]]},{"type":"MultiPolygon","id":9007,"arcs":[[[2530,2531]],[[-2502,2532,2533,-2283]]]},{"type":"Polygon","id":9009,"arcs":[[-2534,2534,-2531,2535,-2520,-2276,-2284]]},{"type":"Polygon","id":42069,"arcs":[[-2350,2536,2537,-2528,-2352]]},{"type":"Polygon","id":36071,"arcs":[[-2260,2538,2539,2540,2541,2542,-2297,-2206]]},{"type":"Polygon","id":17099,"arcs":[[-2494,2543,2544,2545,2546,2547,2548,-2386,-2215]]},{"type":"Polygon","id":39035,"arcs":[[-2499,2549,2550,2551,2552,2553,-2416]]},{"type":"Polygon","id":42047,"arcs":[[2554,2555,2556,2557,-2341]]},{"type":"Polygon","id":42053,"arcs":[[-2558,2558,2559,2560,-2354]]},{"type":"Polygon","id":42121,"arcs":[[2561,2562,2563,-2418,-2355,-2561]]},{"type":"MultiPolygon","id":39043,"arcs":[[[2564,2565,2566,2567]]]},{"type":"Polygon","id":39173,"arcs":[[-2492,2568,2569,2570,2571,-2475]]},{"type":"Polygon","id":42023,"arcs":[[-2345,2572,2573,-2555,-2340]]},{"type":"Polygon","id":42103,"arcs":[[-2543,2574,2575,-2348,-2298]]},{"type":"Polygon","id":19139,"arcs":[[-2377,-2427,-2424,2576,-2412]]},{"type":"Polygon","id":42081,"arcs":[[2577,2578,2579,2580,2581,2582,-2343,-2326,-2324]]},{"type":"Polygon","id":42113,"arcs":[[-2578,-2323,-2530,2583,2584]]},{"type":"Polygon","id":17011,"arcs":[[-2549,2585,2586,2587,2588,-2380,-2387]]},{"type":"Polygon","id":17073,"arcs":[[-2589,2589,2590,2591,-2421,-2381]]},{"type":"Polygon","id":56041,"arcs":[[-2171,2592,-2317,-1705]]},{"type":"Polygon","id":18033,"arcs":[[2593,2594,2595,-2442,-2512]]},{"type":"Polygon","id":18113,"arcs":[[-2596,2596,2597,2598,-2432,-2445]]},{"type":"Polygon","id":31125,"arcs":[[2599,2600,-2462,-2384,-2452]]},{"type":"Polygon","id":36079,"arcs":[[2601,2602,-2539,-2259,-2523,2603]]},{"type":"MultiPolygon","id":25007,"arcs":[[[2604]]]},{"type":"Polygon","id":39093,"arcs":[[-2553,2605,2606,2607,-2565,2608]]},{"type":"Polygon","id":19183,"arcs":[[2609,2610,2611,2612,-2392,-2414]]},{"type":"Polygon","id":19181,"arcs":[[2613,2614,2615,2616,-2408]]},{"type":"Polygon","id":19107,"arcs":[[-2613,2617,2618,2619,-2403,-2393]]},{"type":"Polygon","id":19121,"arcs":[[2620,2621,2622,-2396,-2617]]},{"type":"Polygon","id":19123,"arcs":[[-2620,2623,2624,2625,-2409,-2404]]},{"type":"Polygon","id":19125,"arcs":[[-2626,2626,2627,-2614,-2407,-2410]]},{"type":"Polygon","id":19155,"arcs":[[-2400,2628,2629,2630,2631,2632,-2516,-2389]]},{"type":"Polygon","id":19029,"arcs":[[-2402,2633,2634,2635,-2629,-2399]]},{"type":"Polygon","id":19001,"arcs":[[-2411,-2623,2636,2637,-2634]]},{"type":"Polygon","id":39155,"arcs":[[-2420,2638,2639,2640,-2497,-2372]]},{"type":"MultiPolygon","id":39143,"arcs":[[[-2489,2641]],[[2642,-2567,2643,2644,-2569,-2491]]]},{"type":"Polygon","id":42085,"arcs":[[-2564,2645,2646,2647,-2639,-2419]]},{"type":"Polygon","id":39069,"arcs":[[-2476,-2572,2648,2649,-2510,-2495]]},{"type":"Polygon","id":18099,"arcs":[[-2434,2650,2651,2652,-2436]]},{"type":"Polygon","id":42035,"arcs":[[-2583,2653,2654,2655,-2573,-2344]]},{"type":"MultiPolygon","id":6023,"arcs":[[[-2303,2656,2657,2658,-2346]]]},{"type":"Polygon","id":17063,"arcs":[[2659,2660,-2544,-2493,-2486]]},{"type":"Polygon","id":31023,"arcs":[[-2456,2661,2662,2663,2664,-2449,-2447]]},{"type":"Polygon","id":31155,"arcs":[[2665,2666,2667,2668,-2662,-2455]]},{"type":"Polygon","id":18085,"arcs":[[-2599,2669,2670,2671,-2651,-2433]]},{"type":"Polygon","id":31033,"arcs":[[-2308,2672,2673,2674,2675,-2513,-2310]]},{"type":"Polygon","id":42031,"arcs":[[2676,2677,2678,-2562,-2560]]},{"type":"Polygon","id":49057,"arcs":[[-2314,-2320,2679,2680,-2328]]},{"type":"Polygon","id":18149,"arcs":[[-2653,2681,2682,-2439,-2437]]},{"type":"Polygon","id":42079,"arcs":[[2683,2684,2685,2686,-2584,-2529,-2538]]},{"type":"Polygon","id":39039,"arcs":[[2687,2688,2689,-2594,-2511,-2650]]},{"type":"Polygon","id":19115,"arcs":[[-2577,-2423,2690,2691,2692,-2610,-2413]]},{"type":"Polygon","id":31101,"arcs":[[2693,2694,2695,-2306,-2461,-2459]]},{"type":"Polygon","id":31111,"arcs":[[-2472,-2470,2696,2697,2698,2699,-2694,-2458]]},{"type":"MultiPolygon","id":25019,"arcs":[[[2700]]]},{"type":"Polygon","id":31143,"arcs":[[2701,2702,2703,-2450,-2665]]},{"type":"Polygon","id":31105,"arcs":[[-2676,2704,2705,-2524,-2514]]},{"type":"Polygon","id":31121,"arcs":[[-2704,2706,2707,2708,-2600,-2451]]},{"type":"Polygon","id":31093,"arcs":[[-2601,-2709,2709,2710,2711,-2463]]},{"type":"Polygon","id":31163,"arcs":[[-2464,-2712,2712,-2467,-2473]]},{"type":"Polygon","id":31055,"arcs":[[-2517,-2633,2713,-2666,-2454]]},{"type":"Polygon","id":49029,"arcs":[[2714,2715,2716,-2680,-2319]]},{"type":"Polygon","id":42065,"arcs":[[2717,2718,2719,-2677,-2559,-2557]]},{"type":"Polygon","id":6105,"arcs":[[2720,2721,2722,-2657,-2302]]},{"type":"MultiPolygon","id":36119,"arcs":[[[2723,2724,2725,-2604,-2522,2726]]]},{"type":"Polygon","id":34037,"arcs":[[2727,2728,2729,2730,-2575,-2542]]},{"type":"Polygon","id":39153,"arcs":[[2731,2732,2733,2734,-2551]]},{"type":"Polygon","id":39133,"arcs":[[-2641,2735,2736,-2732,-2550,-2498]]},{"type":"Polygon","id":17131,"arcs":[[-2592,2737,2738,2739,2740,-2691,-2422]]},{"type":"Polygon","id":17155,"arcs":[[-2548,2741,-2586]]},{"type":"Polygon","id":36087,"arcs":[[2742,2743,-2540,-2603,2744]]},{"type":"Polygon","id":42037,"arcs":[[2745,2746,2747,-2579,-2585,-2687]]},{"type":"Polygon","id":17091,"arcs":[[-2506,2748,2749,2750,2751,-2660,-2485]]},{"type":"Polygon","id":18183,"arcs":[[2752,2753,2754,-2670,-2598]]},{"type":"MultiPolygon","id":36103,"arcs":[[[2755,2756]],[[2757,2758]]]},{"type":"Polygon","id":39077,"arcs":[[-2608,2759,2760,2761,2762,-2644,-2566]]},{"type":"Polygon","id":18073,"arcs":[[-2683,2763,2764,2765,2766,-2504,-2508]]},{"type":"Polygon","id":39103,"arcs":[[-2735,2767,2768,-2606,-2552]]},{"type":"Polygon","id":18003,"arcs":[[2769,2770,2771,2772,2773,-2753,-2597,-2595,-2690]]},{"type":"Polygon","id":39147,"arcs":[[-2763,2774,2775,2776,-2570,-2645]]},{"type":"Polygon","id":42033,"arcs":[[2777,2778,2779,2780,-2718,-2556,-2574,-2656]]},{"type":"Polygon","id":49043,"arcs":[[-2593,-2170,2781,2782,2783,2784,-2715,-2318]]},{"type":"Polygon","id":42027,"arcs":[[2785,2786,2787,2788,-2778,-2655]]},{"type":"Polygon","id":42089,"arcs":[[-2731,2789,2790,2791,-2684,-2537,-2349,-2576]]},{"type":"Polygon","id":39125,"arcs":[[2792,2793,-2770,-2689]]},{"type":"Polygon","id":17175,"arcs":[[-2588,2794,2795,2796,-2590]]},{"type":"Polygon","id":31049,"arcs":[[-2696,2797,2798,-2673,-2307]]},{"type":"Polygon","id":18111,"arcs":[[2799,2800,-2749,-2505,-2767]]},{"type":"Polygon","id":34031,"arcs":[[2801,2802,-2728,-2541,-2744,2803]]},{"type":"Polygon","id":31153,"arcs":[[-2632,2804,2805,-2667,-2714]]},{"type":"Polygon","id":6035,"arcs":[[-2368,2806,2807,2808,-2358]]},{"type":"Polygon","id":6089,"arcs":[[-2359,-2809,2809,2810,-2721,-2301]]},{"type":"Polygon","id":42097,"arcs":[[2811,-2747,2812,2813,2814,2815,2816,-2581]]},{"type":"Polygon","id":18049,"arcs":[[2817,2818,2819,2820,-2652,-2672]]},{"type":"Polygon","id":31081,"arcs":[[2821,2822,2823,2824,-2707,-2703]]},{"type":"Polygon","id":18131,"arcs":[[-2821,2825,2826,-2764,-2682]]},{"type":"Polygon","id":42093,"arcs":[[-2748,-2812,-2580]]},{"type":"Polygon","id":42019,"arcs":[[-2679,2827,2828,2829,2830,-2646,-2563]]},{"type":"Polygon","id":42005,"arcs":[[-2720,2831,2832,2833,-2828,-2678]]},{"type":"Polygon","id":39063,"arcs":[[-2777,2834,2835,2836,2837,-2571]]},{"type":"Polygon","id":39137,"arcs":[[-2838,2838,2839,-2793,-2688,-2649]]},{"type":"Polygon","id":19101,"arcs":[[-2612,2840,2841,2842,-2618]]},{"type":"Polygon","id":19087,"arcs":[[-2693,2843,2844,2845,-2841,-2611]]},{"type":"Polygon","id":19179,"arcs":[[-2843,2846,2847,-2624,-2619]]},{"type":"Polygon","id":19039,"arcs":[[2848,2849,2850,-2621,-2616]]},{"type":"Polygon","id":19117,"arcs":[[-2628,2851,2852,-2849,-2615]]},{"type":"Polygon","id":19135,"arcs":[[-2848,2853,-2852,-2627,-2625]]},{"type":"Polygon","id":19129,"arcs":[[2854,2855,2856,-2805,-2631]]},{"type":"Polygon","id":19137,"arcs":[[-2636,2857,2858,-2855,-2630]]},{"type":"Polygon","id":19003,"arcs":[[-2638,2859,2860,-2858,-2635]]},{"type":"Polygon","id":19175,"arcs":[[-2622,-2851,2861,-2860,-2637]]},{"type":"Polygon","id":49011,"arcs":[[-2717,2862,2863,-2681]]},{"type":"Polygon","id":17095,"arcs":[[-2797,2864,2865,2866,-2738,-2591]]},{"type":"Polygon","id":42119,"arcs":[[2867,2868,-2786,-2654,-2582,-2817]]},{"type":"Polygon","id":17123,"arcs":[[-2742,-2547,2869,2870,-2795,-2587]]},{"type":"Polygon","id":34003,"arcs":[[2871,2872,-2804,-2743,2873]]},{"type":"Polygon","id":39099,"arcs":[[-2648,2874,2875,2876,-2736,-2640]]},{"type":"Polygon","id":42025,"arcs":[[-2792,2877,2878,2879,-2685]]},{"type":"Polygon","id":42073,"arcs":[[-2831,2880,2881,-2875,-2647]]},{"type":"Polygon","id":17105,"arcs":[[-2752,2882,2883,2884,-2545,-2661]]},{"type":"Polygon","id":34041,"arcs":[[2885,2886,2887,2888,-2790,-2730]]},{"type":"Polygon","id":34027,"arcs":[[2889,2890,2891,2892,-2886,-2729,-2803]]},{"type":"Polygon","id":49045,"arcs":[[2893,2894,2895,2896,-2335,-2329,-2864]]},{"type":"Polygon","id":19057,"arcs":[[-2741,2897,2898,-2844,-2692]]},{"type":"Polygon","id":17071,"arcs":[[2899,2900,2901,2902,-2898,-2740]]},{"type":"Polygon","id":17187,"arcs":[[-2867,2903,2904,-2900,-2739]]},{"type":"Polygon","id":39005,"arcs":[[-2769,2905,2906,2907,2908,-2760,-2607]]},{"type":"Polygon","id":31025,"arcs":[[-2857,2909,2910,2911,-2668,-2806]]},{"type":"Polygon","id":31185,"arcs":[[2912,2913,2914,-2822,-2702]]},{"type":"Polygon","id":31079,"arcs":[[-2708,-2825,2915,2916,-2710]]},{"type":"Polygon","id":31047,"arcs":[[2917,2918,2919,2920,-2697,-2469]]},{"type":"Polygon","id":31019,"arcs":[[-2711,-2917,2921,2922,2923,-2918,-2468,-2713]]},{"type":"Polygon","id":31159,"arcs":[[2924,2925,-2913,-2664]]},{"type":"Polygon","id":31109,"arcs":[[-2912,2926,2927,2928,-2925,-2663,-2669]]},{"type":"Polygon","id":18169,"arcs":[[-2755,2929,2930,2931,-2818,-2671]]},{"type":"Polygon","id":17075,"arcs":[[-2801,2932,2933,2934,-2750]]},{"type":"Polygon","id":18069,"arcs":[[-2774,2935,2936,-2930,-2754]]},{"type":"MultiPolygon","id":8123,"arcs":[[[2937]],[[2938,2939,2940,2941,2942,-2525,-2706,2943]]]},{"type":"Polygon","id":31135,"arcs":[[-2700,2944,2945,2946,2947,-2798,-2695]]},{"type":"Polygon","id":8107,"arcs":[[2948,2949,2950,2951,2952,-2109,2953]]},{"type":"Polygon","id":8057,"arcs":[[2954,-2954,-2108,-2114,2955]]},{"type":"Polygon","id":8081,"arcs":[[-2953,2956,2957,2958,-2168,-2110]]},{"type":"Polygon","id":8075,"arcs":[[2959,2960,2961,-2944,-2705,-2675,2962,2963]]},{"type":"Polygon","id":8115,"arcs":[[2964,-2963,-2674,-2799,-2948]]},{"type":"Polygon","id":49009,"arcs":[[2965,2966,-2782,-2169,-2959]]},{"type":"Polygon","id":32011,"arcs":[[2967,2968,2969,-2337]]},{"type":"Polygon","id":32015,"arcs":[[-2970,2970,2971,2972,-2331,-2338]]},{"type":"Polygon","id":8069,"arcs":[[2973,2974,-2956,-2113,-2526,-2943]]},{"type":"Polygon","id":18103,"arcs":[[-2932,2975,2976,2977,-2819]]},{"type":"Polygon","id":39033,"arcs":[[2978,2979,2980,2981,-2775,-2762]]},{"type":"Polygon","id":17053,"arcs":[[2982,2983,2984,-2883,-2751,-2935]]},{"type":"Polygon","id":39139,"arcs":[[-2909,2985,2986,-2979,-2761]]},{"type":"Polygon","id":39175,"arcs":[[-2982,2987,2988,-2835,-2776]]},{"type":"Polygon","id":39169,"arcs":[[-2734,2989,2990,-2906,-2768]]},{"type":"Polygon","id":39161,"arcs":[[-2840,2991,2992,2993,2994,-2771,-2794]]},{"type":"Polygon","id":39151,"arcs":[[-2877,2995,2996,2997,2998,-2990,-2733,-2737]]},{"type":"Polygon","id":17143,"arcs":[[-2871,2999,3000,3001,-2865,-2796]]},{"type":"Polygon","id":42095,"arcs":[[3002,3003,-2878,-2791,-2889]]},{"type":"Polygon","id":32027,"arcs":[[-2973,3004,-2360,-2332]]},{"type":"Polygon","id":42107,"arcs":[[-2880,3005,3006,3007,3008,-2813,-2746,-2686]]},{"type":"Polygon","id":39029,"arcs":[[-2882,3009,3010,3011,3012,-2996,-2876]]},{"type":"Polygon","id":17203,"arcs":[[3013,3014,-3000,-2870,-2546,-2885]]},{"type":"Polygon","id":18001,"arcs":[[3015,3016,3017,-2772,-2995]]},{"type":"Polygon","id":39003,"arcs":[[-2837,3018,3019,-2992,-2839]]},{"type":"Polygon","id":49035,"arcs":[[-2716,-2785,3020,3021,-2894,-2863]]},{"type":"MultiPolygon","id":36005,"arcs":[[[3022,3023,3024,-2725]]]},{"type":"Polygon","id":18179,"arcs":[[-3018,3025,3026,3027,-2936,-2773]]},{"type":"MultiPolygon","id":36059,"arcs":[[[-2756,3028]],[[-2758,3029,3030,3031,3032,3033]]]},{"type":"Polygon","id":18181,"arcs":[[3034,3035,3036,3037,-2765,-2827]]},{"type":"Polygon","id":18017,"arcs":[[-2820,-2978,3038,3039,-3035,-2826]]},{"type":"Polygon","id":42063,"arcs":[[-2781,3040,3041,-2832,-2719]]},{"type":"Polygon","id":34013,"arcs":[[-2802,-2873,3042,3043,3044,-2890]]},{"type":"Polygon","id":19071,"arcs":[[3045,3046,3047,-2910,-2856]]},{"type":"Polygon","id":19145,"arcs":[[3048,3049,3050,-3046,-2859]]},{"type":"Polygon","id":19173,"arcs":[[3051,3052,3053,-3049,-2861]]},{"type":"Polygon","id":19177,"arcs":[[-2846,3054,3055,3056,3057,-2842]]},{"type":"Polygon","id":19051,"arcs":[[-3058,3058,3059,3060,-2847]]},{"type":"Polygon","id":19159,"arcs":[[3061,3062,3063,-3052,-2862]]},{"type":"Polygon","id":19053,"arcs":[[3064,3065,3066,-3062,-2850]]},{"type":"Polygon","id":19185,"arcs":[[3067,3068,3069,-3065,-2853]]},{"type":"Polygon","id":19007,"arcs":[[-3061,3070,3071,-3068,-2854]]},{"type":"Polygon","id":42109,"arcs":[[-2816,3072,3073,-2868]]},{"type":"Polygon","id":36061,"arcs":[[3074,-3024]]},{"type":"Polygon","id":49047,"arcs":[[-2958,3075,3076,3077,3078,3079,3080,-2966]]},{"type":"Polygon","id":42007,"arcs":[[-2830,3081,3082,3083,-3010,-2881]]},{"type":"Polygon","id":42087,"arcs":[[3084,-2787,-2869,-3074,3085]]},{"type":"Polygon","id":49013,"arcs":[[-2967,-3081,3086,3087,3088,-2783]]},{"type":"Polygon","id":39065,"arcs":[[-2989,3089,3090,3091,3092,-3019,-2836]]},{"type":"Polygon","id":34017,"arcs":[[3093,-3043,-2872]]},{"type":"Polygon","id":19111,"arcs":[[-2899,-2903,3094,3095,-3055,-2845]]},{"type":"MultiPolygon","id":36081,"arcs":[[[3096,-3031]],[[3097,3098]],[[-3033,3099,3100,3101]]]},{"type":"Polygon","id":34019,"arcs":[[3102,3103,3104,-2887,-2893]]},{"type":"Polygon","id":42077,"arcs":[[3105,3106,3107,-3006,-2879,-3004]]},{"type":"Polygon","id":31131,"arcs":[[-3048,3108,3109,3110,-2927,-2911]]},{"type":"Polygon","id":34035,"arcs":[[3111,3112,3113,-3103,-2892]]},{"type":"Polygon","id":17113,"arcs":[[-2985,3114,3115,3116,3117,3118,-3014,-2884]]},{"type":"Polygon","id":8095,"arcs":[[-2947,3119,3120,-2964,-2965]]},{"type":"Polygon","id":17179,"arcs":[[-3119,3121,3122,3123,-3001,-3015]]},{"type":"Polygon","id":42061,"arcs":[[-3085,3124,3125,3126,3127,3128,-2788]]},{"type":"Polygon","id":42013,"arcs":[[3129,3130,-2779,-2789,-3129]]},{"type":"MultiPolygon","id":36047,"arcs":[[[3131,-3098]],[[3132,-3101]]]},{"type":"Polygon","id":18007,"arcs":[[-2766,-3038,3133,3134,3135,-2933,-2800]]},{"type":"Polygon","id":34039,"arcs":[[3136,3137,-3112,-2891,-3045]]},{"type":"Polygon","id":18015,"arcs":[[-3040,3138,3139,3140,-3036]]},{"type":"Polygon","id":39019,"arcs":[[-3013,3141,3142,3143,-2997]]},{"type":"Polygon","id":39107,"arcs":[[3144,3145,3146,3147,-3016,-2994]]},{"type":"Polygon","id":42021,"arcs":[[-3131,3148,3149,3150,-3041,-2780]]},{"type":"Polygon","id":17057,"arcs":[[-3002,-3124,3151,3152,3153,-2904,-2866]]},{"type":"Polygon","id":39117,"arcs":[[-2987,3154,3155,3156,-2980]]},{"type":"Polygon","id":39101,"arcs":[[-3157,3157,3158,-3090,-2988,-2981]]},{"type":"Polygon","id":31063,"arcs":[[-2921,3159,3160,3161,3162,3163,-2698]]},{"type":"Polygon","id":31001,"arcs":[[-2824,3164,3165,3166,-2922,-2916]]},{"type":"Polygon","id":31073,"arcs":[[3167,3168,-3160,-2920]]},{"type":"Polygon","id":31085,"arcs":[[-3164,3169,3170,3171,-2945,-2699]]},{"type":"Polygon","id":31029,"arcs":[[-3172,3172,3173,-3120,-2946]]},{"type":"Polygon","id":31059,"arcs":[[3174,3175,3176,3177,-2914]]},{"type":"Polygon","id":31151,"arcs":[[-2926,-2929,3178,3179,-3175]]},{"type":"Polygon","id":31035,"arcs":[[-3178,3180,3181,-3165,-2823,-2915]]},{"type":"Polygon","id":42067,"arcs":[[-2815,3182,3183,-3125,-3086,-3073]]},{"type":"Polygon","id":49051,"arcs":[[-3089,3184,-3021,-2784]]},{"type":"Polygon","id":31099,"arcs":[[3185,3186,3187,-2923,-3167]]},{"type":"Polygon","id":39011,"arcs":[[-3093,3188,3189,-3145,-2993,-3020]]},{"type":"Polygon","id":31137,"arcs":[[-2924,-3188,3190,3191,-3168,-2919]]},{"type":"Polygon","id":42129,"arcs":[[-3042,-3151,3192,3193,3194,3195,-2833]]},{"type":"Polygon","id":42011,"arcs":[[3196,3197,3198,3199,-3007,-3108]]},{"type":"Polygon","id":42003,"arcs":[[-2834,-3196,3200,-3082,-2829]]},{"type":"Polygon","id":39075,"arcs":[[-2999,3201,3202,3203,-2907,-2991]]},{"type":"Polygon","id":39157,"arcs":[[-3144,3204,3205,3206,-3202,-2998]]},{"type":"Polygon","id":42043,"arcs":[[-3009,3207,3208,3209,3210,3211,-2814]]},{"type":"Polygon","id":18053,"arcs":[[-3028,3212,3213,3214,3215,3216,-2976,-2931,-2937]]},{"type":"Polygon","id":36085,"arcs":[[3217]]},{"type":"Polygon","id":17067,"arcs":[[3218,3219,3220,3221,3222,-3095,-2902]]},{"type":"Polygon","id":54029,"arcs":[[3223,3224,3225,-3011,-3084]]},{"type":"Polygon","id":17109,"arcs":[[-3154,3226,-3219,-2901,-2905]]},{"type":"Polygon","id":42099,"arcs":[[3227,3228,-3183,-3212]]},{"type":"Polygon","id":29045,"arcs":[[-3223,3229,3230,3231,-3056,-3096]]},{"type":"Polygon","id":42017,"arcs":[[3232,3233,3234,3235,-3106,-3003,-2888,-3105]]},{"type":"Polygon","id":34023,"arcs":[[3236,3237,3238,-3113,-3138]]},{"type":"Polygon","id":29199,"arcs":[[-3232,3239,3240,3241,-3059,-3057]]},{"type":"Polygon","id":39081,"arcs":[[-3226,3242,3243,3244,3245,-3142,-3012]]},{"type":"Polygon","id":29197,"arcs":[[3246,3247,-3071,-3060,-3242]]},{"type":"Polygon","id":29171,"arcs":[[-3248,3248,3249,3250,-3069,-3072]]},{"type":"Polygon","id":29005,"arcs":[[-3051,3251,3252,3253,-3109,-3047]]},{"type":"Polygon","id":29129,"arcs":[[-3251,3254,3255,3256,-3066,-3070]]},{"type":"Polygon","id":29147,"arcs":[[-3054,3257,3258,3259,3260,-3252,-3050]]},{"type":"Polygon","id":49049,"arcs":[[-3088,3261,3262,3263,-2895,-3022,-3185]]},{"type":"Polygon","id":29081,"arcs":[[-3257,3264,3265,3266,3267,-3063,-3067]]},{"type":"Polygon","id":39083,"arcs":[[3268,3269,3270,-3155,-2986,-2908,-3204]]},{"type":"Polygon","id":18075,"arcs":[[3271,3272,3273,3274,-3026,-3017,-3148]]},{"type":"Polygon","id":29227,"arcs":[[-3268,3275,-3258,-3053,-3064]]},{"type":"Polygon","id":18009,"arcs":[[-3275,3276,-3213,-3027]]},{"type":"Polygon","id":18067,"arcs":[[3277,3278,-3139,-3039,-2977,-3217]]},{"type":"Polygon","id":18157,"arcs":[[-3141,3279,3280,3281,3282,-3134,-3037]]},{"type":"Polygon","id":31127,"arcs":[[3283,3284,3285,3286,-3110,-3254]]},{"type":"Polygon","id":42075,"arcs":[[-3208,-3008,-3200,3287]]},{"type":"Polygon","id":39091,"arcs":[[-3092,3288,3289,3290,-3189]]},{"type":"Polygon","id":8087,"arcs":[[-2962,3291,3292,-2939]]},{"type":"Polygon","id":31067,"arcs":[[3293,3294,3295,3296,3297,-3179,-2928]]},{"type":"Polygon","id":31097,"arcs":[[-3287,3298,-3294,-3111]]},{"type":"Polygon","id":39159,"arcs":[[3299,3300,3301,-3289,-3091,-3159,3302]]},{"type":"Polygon","id":17183,"arcs":[[-3136,3303,3304,3305,3306,-2983,-2934]]},{"type":"Polygon","id":8049,"arcs":[[3307,3308,3309,3310,3311,-2949,-2955,-2975]]},{"type":"Polygon","id":39149,"arcs":[[-3291,3312,3313,3314,-3146,-3190]]},{"type":"Polygon","id":42125,"arcs":[[-3201,-3195,3315,3316,3317,3318,3319,-3224,-3083]]},{"type":"Polygon","id":18171,"arcs":[[-3283,3320,3321,-3304,-3135]]},{"type":"Polygon","id":34025,"arcs":[[3322,3323,3324,-3238,3325]]},{"type":"Polygon","id":39031,"arcs":[[-3207,3326,3327,3328,-3269,-3203]]},{"type":"Polygon","id":42091,"arcs":[[3329,3330,3331,-3197,-3107,-3236]]},{"type":"Polygon","id":6103,"arcs":[[3332,3333,3334,3335,-2722,-2811]]},{"type":"Polygon","id":6063,"arcs":[[-2808,3336,3337,3338,-3333,-2810]]},{"type":"Polygon","id":39041,"arcs":[[-3271,3339,3340,-3303,-3158,-3156]]},{"type":"Polygon","id":8125,"arcs":[[-3174,3341,3342,3343,3344,-2960,-3121]]},{"type":"Polygon","id":8121,"arcs":[[-3345,3345,3346,3347,3348,-3292,-2961]]},{"type":"Polygon","id":17125,"arcs":[[3349,3350,3351,3352,-3152,-3123]]},{"type":"Polygon","id":39067,"arcs":[[-3246,3353,3354,-3205,-3143]]},{"type":"Polygon","id":18023,"arcs":[[-3279,3355,3356,3357,3358,-3280,-3140]]},{"type":"Polygon","id":34021,"arcs":[[-3239,-3325,3359,-3233,-3104,-3114]]},{"type":"Polygon","id":18159,"arcs":[[-3216,3360,3361,-3356,-3278]]},{"type":"Polygon","id":54009,"arcs":[[-3320,3362,-3243,-3225]]},{"type":"Polygon","id":17019,"arcs":[[-3307,3363,3364,-3115,-2984]]},{"type":"Polygon","id":29211,"arcs":[[3365,3366,3367,-3255,-3250]]},{"type":"Polygon","id":29075,"arcs":[[-3267,3368,3369,3370,-3259,-3276]]},{"type":"Polygon","id":18095,"arcs":[[3371,3372,3373,3374,-3361,-3215]]},{"type":"Polygon","id":18035,"arcs":[[-3277,-3274,3375,3376,-3372,-3214]]},{"type":"Polygon","id":18045,"arcs":[[-3282,3377,3378,3379,-3321]]},{"type":"Polygon","id":39037,"arcs":[[-3315,3380,3381,3382,3383,3384,-3272,-3147]]},{"type":"Polygon","id":31181,"arcs":[[-3182,3385,3386,3387,3388,-3186,-3166]]},{"type":"Polygon","id":31061,"arcs":[[-3389,3389,3390,3391,-3187]]},{"type":"Polygon","id":31129,"arcs":[[-3177,3392,3393,3394,-3386,-3181]]},{"type":"Polygon","id":31057,"arcs":[[3395,3396,3397,-3342,-3173,-3171]]},{"type":"Polygon","id":31065,"arcs":[[-3192,3398,3399,3400,3401,-3161,-3169]]},{"type":"Polygon","id":31169,"arcs":[[3402,3403,-3393,-3176]]},{"type":"Polygon","id":31095,"arcs":[[-3180,-3298,3404,-3403]]},{"type":"Polygon","id":31145,"arcs":[[-3402,3405,3406,3407,-3162]]},{"type":"Polygon","id":31087,"arcs":[[-3163,-3408,3408,-3396,-3170]]},{"type":"Polygon","id":31083,"arcs":[[-3392,3409,3410,-3399,-3191]]},{"type":"Polygon","id":29001,"arcs":[[-3241,3411,3412,3413,-3366,-3249,-3247]]},{"type":"Polygon","id":42041,"arcs":[[3414,3415,3416,-3228,-3211]]},{"type":"Polygon","id":17107,"arcs":[[3417,3418,3419,3420,-3350,-3122,-3118]]},{"type":"Polygon","id":42009,"arcs":[[-3128,3421,3422,3423,-3149,-3130]]},{"type":"Polygon","id":42071,"arcs":[[3424,3425,3426,3427,-3209,-3288,-3199]]},{"type":"Polygon","id":18135,"arcs":[[-3385,3428,3429,-3376,-3273]]},{"type":"Polygon","id":29103,"arcs":[[-3231,3430,3431,3432,-3412,-3240]]},{"type":"Polygon","id":42055,"arcs":[[-3417,3433,3434,3435,3436,-3126,-3184,-3229]]},{"type":"Polygon","id":42111,"arcs":[[-3424,3437,3438,3439,-3193,-3150]]},{"type":"Polygon","id":17039,"arcs":[[3440,3441,-3418,-3117]]},{"type":"Polygon","id":17169,"arcs":[[-3153,-3353,3442,3443,3444,-3220,-3227]]},{"type":"Polygon","id":17147,"arcs":[[-3365,3445,3446,3447,-3441,-3116]]},{"type":"Polygon","id":39089,"arcs":[[-3329,3448,3449,3450,3451,-3340,-3270]]},{"type":"Polygon","id":39021,"arcs":[[-3302,3452,3453,3454,-3313,-3290]]},{"type":"Polygon","id":29079,"arcs":[[-3368,3455,3456,3457,-3265,-3256]]},{"type":"Polygon","id":8013,"arcs":[[-2942,3458,3459,3460,-3308,-2974]]},{"type":"Polygon","id":31133,"arcs":[[-3286,3461,3462,3463,-3295,-3299]]},{"type":"Polygon","id":31147,"arcs":[[3464,3465,3466,3467,-3462,-3285]]},{"type":"Polygon","id":29087,"arcs":[[-3261,3468,3469,-3465,-3284,-3253]]},{"type":"Polygon","id":29111,"arcs":[[-3222,3470,3471,3472,-3431,-3230]]},{"type":"MultiPolygon","id":42029,"arcs":[[[3473,3474]],[[3475,3476,3477,-3425,-3198,-3332]]]},{"type":"Polygon","id":42133,"arcs":[[-3428,3478,3479,3480,3481,-3415,-3210]]},{"type":"Polygon","id":8103,"arcs":[[3482,-3076,-2957,-2952]]},{"type":"Polygon","id":39059,"arcs":[[3483,3484,-3327,-3206,-3355,3485]]},{"type":"Polygon","id":18057,"arcs":[[3486,3487,3488,-3357,-3362,-3375]]},{"type":"Polygon","id":18107,"arcs":[[-3359,3489,3490,3491,3492,-3378,-3281]]},{"type":"Polygon","id":17001,"arcs":[[-3445,3493,3494,3495,-3471,-3221]]},{"type":"Polygon","id":39109,"arcs":[[-3455,3496,3497,-3381,-3314]]},{"type":"Polygon","id":54069,"arcs":[[-3319,3498,3499,-3244,-3363]]},{"type":"Polygon","id":34005,"arcs":[[-3324,3500,3501,3502,3503,3504,3505,-3234,-3360]]},{"type":"Polygon","id":18011,"arcs":[[-3489,3506,3507,-3490,-3358]]},{"type":"Polygon","id":39013,"arcs":[[-3245,-3500,3508,3509,3510,-3486,-3354]]},{"type":"MultiPolygon","id":34029,"arcs":[[[3511,-3501,-3323]]]},{"type":"Polygon","id":39119,"arcs":[[-3485,3512,3513,3514,-3449,-3328]]},{"type":"Polygon","id":42057,"arcs":[[-3437,3515,3516,-3422,-3127]]},{"type":"Polygon","id":17129,"arcs":[[-3421,3517,3518,-3351]]},{"type":"Polygon","id":6007,"arcs":[[3519,3520,3521,3522,-3334,-3339]]},{"type":"Polygon","id":18165,"arcs":[[-3380,3523,3524,3525,-3305,-3322]]},{"type":"Polygon","id":42051,"arcs":[[-3440,3526,3527,3528,3529,-3316,-3194]]},{"type":"Polygon","id":39049,"arcs":[[-3452,3530,3531,3532,-3300,-3341]]},{"type":"Polygon","id":42101,"arcs":[[-3506,3533,3534,-3330,-3235]]},{"type":"Polygon","id":29061,"arcs":[[-3266,-3458,3535,3536,3537,-3369]]},{"type":"Polygon","id":29003,"arcs":[[-3371,3538,3539,3540,-3469,-3260]]},{"type":"Polygon","id":32033,"arcs":[[-2897,3541,3542,3543,3544,-2968,-2336]]},{"type":"Polygon","id":17017,"arcs":[[-3352,-3519,3545,3546,3547,-3443]]},{"type":"Polygon","id":39097,"arcs":[[3548,3549,3550,3551,-3453,-3301,-3533]]},{"type":"Polygon","id":17009,"arcs":[[-3548,3552,3553,-3494,-3444]]},{"type":"Polygon","id":8045,"arcs":[[-2951,3554,3555,3556,3557,-3077,-3483]]},{"type":"Polygon","id":18065,"arcs":[[-3430,3558,3559,3560,3561,-3373,-3377]]},{"type":"Polygon","id":42001,"arcs":[[3562,3563,-3434,-3416,-3482]]},{"type":"Polygon","id":42045,"arcs":[[-3535,3564,3565,-3474,3566,-3476,-3331]]},{"type":"Polygon","id":17115,"arcs":[[-3448,3567,3568,3569,3570,-3419,-3442]]},{"type":"Polygon","id":8014,"arcs":[[3571,3572,-3459,-2941],[-2938]]},{"type":"Polygon","id":29121,"arcs":[[-3433,3573,3574,3575,3576,3577,-3413]]},{"type":"Polygon","id":39023,"arcs":[[-3552,3578,3579,-3497,-3454]]},{"type":"Polygon","id":29115,"arcs":[[-3578,3580,3581,-3456,-3367,-3414]]},{"type":"Polygon","id":29063,"arcs":[[-3538,3582,3583,3584,-3539,-3370]]},{"type":"Polygon","id":54051,"arcs":[[3585,3586,-3509,-3499,-3318,3587]]},{"type":"Polygon","id":42059,"arcs":[[-3530,3588,3589,-3588,-3317]]},{"type":"Polygon","id":49023,"arcs":[[-3264,3590,3591,-3542,-2896]]},{"type":"Polygon","id":18177,"arcs":[[-3384,3592,3593,3594,-3559,-3429]]},{"type":"Polygon","id":20023,"arcs":[[3595,3596,3597,-3343,-3398]]},{"type":"Polygon","id":20153,"arcs":[[-3407,3598,3599,3600,-3596,-3397,-3409]]},{"type":"Polygon","id":6045,"arcs":[[-2723,-3336,3601,3602,3603,3604,-2658]]},{"type":"Polygon","id":20089,"arcs":[[3605,3606,3607,3608,3609,-3387,-3395]]},{"type":"Polygon","id":20183,"arcs":[[-3610,3610,3611,3612,-3390,-3388]]},{"type":"Polygon","id":20157,"arcs":[[3613,3614,-3606,-3394,-3404]]},{"type":"Polygon","id":20201,"arcs":[[-3297,3615,3616,3617,3618,-3614,-3405]]},{"type":"Polygon","id":20039,"arcs":[[-3401,3619,3620,3621,-3599,-3406]]},{"type":"Polygon","id":32001,"arcs":[[-2972,3622,3623,3624,-2361,-3005]]},{"type":"Polygon","id":20137,"arcs":[[3625,3626,3627,-3620,-3400,-3411]]},{"type":"Polygon","id":20147,"arcs":[[-3613,3628,3629,-3626,-3410,-3391]]},{"type":"Polygon","id":20117,"arcs":[[-3464,3630,3631,3632,-3616,-3296]]},{"type":"Polygon","id":8001,"arcs":[[-3349,3633,3634,3635,-3572,-2940,-3293]]},{"type":"Polygon","id":20013,"arcs":[[3636,3637,3638,3639,-3467]]},{"type":"Polygon","id":20131,"arcs":[[-3468,-3640,3640,3641,-3631,-3463]]},{"type":"Polygon","id":20043,"arcs":[[-3470,-3541,3642,3643,-3637,-3466]]},{"type":"MultiPolygon","id":34007,"arcs":[[[3644,3645,3646,-3504]]]},{"type":"Polygon","id":17167,"arcs":[[-3571,3647,3648,3649,3650,-3546,-3518,-3420]]},{"type":"Polygon","id":29117,"arcs":[[3651,3652,3653,-3536,-3457,-3582]]},{"type":"Polygon","id":29205,"arcs":[[-3473,3654,3655,-3574,-3432]]},{"type":"Polygon","id":18121,"arcs":[[-3493,3656,3657,3658,-3524,-3379]]},{"type":"Polygon","id":39121,"arcs":[[-3511,3659,3660,3661,-3513,-3484]]},{"type":"Polygon","id":29127,"arcs":[[-3496,3662,3663,3664,-3655,-3472]]},{"type":"Polygon","id":18059,"arcs":[[-3562,3665,3666,3667,-3487,-3374]]},{"type":"Polygon","id":39045,"arcs":[[-3451,3668,3669,3670,-3531]]},{"type":"Polygon","id":8047,"arcs":[[3671,3672,-3309,-3461]]},{"type":"Polygon","id":39127,"arcs":[[3673,3674,3675,-3669,-3450,-3515]]},{"type":"Polygon","id":18097,"arcs":[[-3668,3676,3677,3678,3679,-3507,-3488]]},{"type":"Polygon","id":8037,"arcs":[[3680,3681,3682,-3555,-2950,-3312]]},{"type":"Polygon","id":8117,"arcs":[[3683,3684,3685,-3681,-3311]]},{"type":"Polygon","id":18063,"arcs":[[-3680,3686,3687,-3491,-3508]]},{"type":"Polygon","id":39113,"arcs":[[-3580,3688,3689,3690,3691,-3382,-3498]]},{"type":"Polygon","id":39135,"arcs":[[-3692,3692,3693,-3593,-3383]]},{"type":"Polygon","id":8059,"arcs":[[-3636,3694,3695,3696,3697,3698,3699,-3672,-3460,-3573]]},{"type":"Polygon","id":8031,"arcs":[[3700,-3695,-3635]]},{"type":"MultiPolygon","id":34015,"arcs":[[[3701,3702,3703,3704,-3646]]]},{"type":"Polygon","id":17045,"arcs":[[3705,3706,3707,3708,-3306,-3526]]},{"type":"Polygon","id":17041,"arcs":[[-3709,3709,3710,-3446,-3364]]},{"type":"Polygon","id":17137,"arcs":[[-3651,3711,3712,3713,3714,-3553,-3547]]},{"type":"Polygon","id":39111,"arcs":[[-3587,3715,3716,3717,-3660,-3510]]},{"type":"Polygon","id":18133,"arcs":[[-3688,3718,3719,3720,-3657,-3492]]},{"type":"Polygon","id":8019,"arcs":[[-3700,3721,-3684,-3310,-3673]]},{"type":"Polygon","id":39057,"arcs":[[-3551,3722,3723,3724,-3689,-3579]]},{"type":"Polygon","id":17149,"arcs":[[-3715,3725,3726,3727,3728,3729,-3663,-3495,-3554]]},{"type":"MultiPolygon","id":10003,"arcs":[[[3730,3731]],[[3732,3733]],[[3734,3735,3736,3737,-3477,-3567,-3475,-3566]]]},{"type":"Polygon","id":17021,"arcs":[[-3570,3738,3739,-3648]]},{"type":"Polygon","id":29021,"arcs":[[-3585,3740,3741,3742,-3643,-3540]]},{"type":"Polygon","id":49007,"arcs":[[-3087,-3080,3743,3744,-3262]]},{"type":"Polygon","id":49039,"arcs":[[-3745,3745,3746,3747,-3591,-3263]]},{"type":"Polygon","id":39129,"arcs":[[-3671,3748,3749,3750,-3549,-3532]]},{"type":"Polygon","id":6021,"arcs":[[-3523,3751,3752,-3602,-3335]]},{"type":"Polygon","id":17139,"arcs":[[-3711,3753,3754,-3568,-3447]]},{"type":"Polygon","id":18041,"arcs":[[3755,3756,3757,-3560,-3595]]},{"type":"Polygon","id":18139,"arcs":[[-3758,3758,3759,3760,-3666,-3561]]},{"type":"Polygon","id":17171,"arcs":[[3761,-3726,-3714]]},{"type":"Polygon","id":29025,"arcs":[[-3654,3762,3763,3764,-3583,-3537]]},{"type":"MultiPolygon","id":34033,"arcs":[[[3765,3766]],[[3767,3768,-3732,3769,-3734,3770,-3704]]]},{"type":"Polygon","id":6091,"arcs":[[-2807,-2367,3771,3772,-3337]]},{"type":"Polygon","id":39115,"arcs":[[-3662,3773,3774,-3674,-3514]]},{"type":"Polygon","id":29049,"arcs":[[-3765,3775,3776,3777,-3741,-3584]]},{"type":"Polygon","id":8005,"arcs":[[-3348,3778,3779,3780,-3696,-3701,-3634]]},{"type":"Polygon","id":32019,"arcs":[[3781,3782,3783,3784,3785,-2362,-3625]]},{"type":"MultiPolygon","id":34001,"arcs":[[[3786,3787,3788,-3702,-3645,-3503]]]},{"type":"Polygon","id":18161,"arcs":[[-3694,3789,3790,-3756,-3594]]},{"type":"Polygon","id":24043,"arcs":[[-3436,3791,3792,3793,3794,3795,3796,-3516]]},{"type":"Polygon","id":24001,"arcs":[[-3517,-3797,3797,3798,3799,3800,-3438,-3423]]},{"type":"Polygon","id":24023,"arcs":[[-3801,3801,3802,3803,-3527,-3439]]},{"type":"MultiPolygon","id":24015,"arcs":[[[-3738,3804,3805,3806,-3426,-3478]]]},{"type":"Polygon","id":54061,"arcs":[[-3529,3807,3808,3809,3810,-3589]]},{"type":"Polygon","id":54077,"arcs":[[-3804,3811,3812,3813,3814,-3808,-3528]]},{"type":"MultiPolygon","id":24025,"arcs":[[[-3427,-3807,3815,3816,-3479]]]},{"type":"Polygon","id":54103,"arcs":[[-3590,-3811,3817,3818,3819,3820,-3716,-3586]]},{"type":"MultiPolygon","id":24005,"arcs":[[[-3817,3821,3822,3823,3824,3825,-3480]]]},{"type":"Polygon","id":24013,"arcs":[[-3826,3826,3827,-3563,-3481]]},{"type":"Polygon","id":24021,"arcs":[[-3828,3828,3829,3830,-3792,-3435,-3564]]},{"type":"Polygon","id":39047,"arcs":[[-3751,3831,3832,3833,-3723,-3550]]},{"type":"Polygon","id":49015,"arcs":[[-3079,3834,3835,3836,-3746,-3744]]},{"type":"Polygon","id":29041,"arcs":[[-3577,3837,3838,3839,3840,-3652,-3581]]},{"type":"Polygon","id":18145,"arcs":[[-3761,3841,3842,3843,-3677,-3667]]},{"type":"Polygon","id":54065,"arcs":[[3844,3845,3846,-3798,-3796]]},{"type":"Polygon","id":29173,"arcs":[[-3730,3847,3848,3849,-3664]]},{"type":"Polygon","id":17029,"arcs":[[-3708,3850,3851,3852,-3754,-3710]]},{"type":"Polygon","id":29137,"arcs":[[-3665,-3850,3853,3854,-3575,-3656]]},{"type":"Polygon","id":39073,"arcs":[[3855,3856,3857,-3749,-3670,-3676]]},{"type":"Polygon","id":20029,"arcs":[[-3619,3858,3859,3860,-3607,-3615]]},{"type":"Polygon","id":20085,"arcs":[[3861,3862,3863,3864,-3641,-3639]]},{"type":"Polygon","id":20005,"arcs":[[-3743,3865,3866,3867,-3862,-3638,-3644]]},{"type":"Polygon","id":17173,"arcs":[[-3755,-3853,3868,3869,3870,3871,-3739,-3569]]},{"type":"Polygon","id":54057,"arcs":[[3872,3873,-3802,-3800]]},{"type":"Polygon","id":39167,"arcs":[[-3718,3874,3875,3876,3877,-3774,-3661]]},{"type":"Polygon","id":54049,"arcs":[[-3810,3878,3879,-3818]]},{"type":"Polygon","id":18081,"arcs":[[-3844,3880,3881,3882,-3678]]},{"type":"Polygon","id":6115,"arcs":[[-3773,3883,3884,3885,-3520,-3338]]},{"type":"Polygon","id":18109,"arcs":[[-3883,3886,3887,3888,-3719,-3687,-3679]]},{"type":"Polygon","id":32029,"arcs":[[-2363,-3786]]},{"type":"Polygon","id":54003,"arcs":[[-3795,3889,3890,-3845]]},{"type":"Polygon","id":29033,"arcs":[[-3841,3891,3892,3893,-3763,-3653]]},{"type":"Polygon","id":29175,"arcs":[[-3855,3894,3895,3896,-3838,-3576]]},{"type":"Polygon","id":18167,"arcs":[[3897,3898,3899,-3706,-3525,-3659]]},{"type":"Polygon","id":18021,"arcs":[[-3721,3900,3901,3902,-3898,-3658]]},{"type":"Polygon","id":54095,"arcs":[[3903,3904,3905,-3875,-3717,-3821]]},{"type":"Polygon","id":29163,"arcs":[[3906,3907,3908,-3848,-3729,3909]]},{"type":"Polygon","id":39017,"arcs":[[3910,3911,3912,-3790,-3693,-3691]]},{"type":"Polygon","id":39165,"arcs":[[-3725,3913,3914,3915,-3911,-3690]]},{"type":"Polygon","id":6033,"arcs":[[3916,3917,3918,3919,-3603,-3753]]},{"type":"Polygon","id":8063,"arcs":[[-3598,3920,3921,3922,3923,-3346,-3344]]},{"type":"MultiPolygon","id":34011,"arcs":[[[3924,-3767,3925,-3768,-3703,-3789,3926,3927]]]},{"type":"Polygon","id":20163,"arcs":[[3928,3929,3930,3931,-3629,-3612]]},{"type":"Polygon","id":39027,"arcs":[[3932,3933,-3914,-3724,-3834,3934]]},{"type":"Polygon","id":20181,"arcs":[[-3601,3935,3936,3937,-3921,-3597]]},{"type":"Polygon","id":20193,"arcs":[[-3622,3938,3939,3940,-3936,-3600]]},{"type":"Polygon","id":20141,"arcs":[[-3609,3941,3942,3943,3944,-3929,-3611]]},{"type":"Polygon","id":20179,"arcs":[[-3628,3945,3946,-3939,-3621]]},{"type":"Polygon","id":20027,"arcs":[[3947,3948,3949,3950,-3859,-3618]]},{"type":"Polygon","id":20123,"arcs":[[-3861,3951,3952,-3942,-3608]]},{"type":"Polygon","id":20065,"arcs":[[-3932,3953,3954,-3946,-3627,-3630]]},{"type":"Polygon","id":20161,"arcs":[[3955,3956,3957,-3948,-3617,-3633]]},{"type":"Polygon","id":8035,"arcs":[[3958,3959,3960,-3697,-3781]]},{"type":"Polygon","id":8039,"arcs":[[3961,3962,-3959,-3780]]},{"type":"Polygon","id":20149,"arcs":[[-3642,-3865,3963,3964,-3956,-3632]]},{"type":"Polygon","id":8073,"arcs":[[-3924,3965,3966,3967,3968,-3962,-3779,-3347]]},{"type":"Polygon","id":8093,"arcs":[[-3699,3969,3970,3971,3972,-3685,-3722]]},{"type":"Polygon","id":39009,"arcs":[[-3878,3973,3974,3975,-3856,-3675,-3775]]},{"type":"Polygon","id":49027,"arcs":[[-3748,3976,3977,3978,-3543,-3592]]},{"type":"Polygon","id":54027,"arcs":[[-3847,3979,3980,-3873,-3799]]},{"type":"Polygon","id":29165,"arcs":[[-3742,-3778,3981,3982,3983,-3866]]},{"type":"Polygon","id":18047,"arcs":[[-3791,-3913,3984,3985,3986,-3759,-3757]]},{"type":"Polygon","id":29177,"arcs":[[-3894,3987,3988,3989,-3776,-3764]]},{"type":"Polygon","id":17135,"arcs":[[-3740,-3872,3990,3991,3992,3993,-3649]]},{"type":"Polygon","id":17117,"arcs":[[-3994,3994,3995,3996,-3712,-3650]]},{"type":"Polygon","id":6057,"arcs":[[-2366,3997,-3884,-3772]]},{"type":"Polygon","id":17061,"arcs":[[-3713,-3997,3998,3999,-3727,-3762]]},{"type":"Polygon","id":39141,"arcs":[[-3858,4000,4001,4002,4003,-3832,-3750]]},{"type":"Polygon","id":54037,"arcs":[[4004,4005,-3890,-3794]]},{"type":"Polygon","id":49019,"arcs":[[-3558,4006,4007,-3835,-3078]]},{"type":"Polygon","id":17023,"arcs":[[-3900,4008,4009,4010,4011,-3851,-3707]]},{"type":"Polygon","id":54073,"arcs":[[4012,4013,-3876,-3906]]},{"type":"Polygon","id":18119,"arcs":[[-3889,4014,4015,-3901,-3720]]},{"type":"Polygon","id":54033,"arcs":[[4016,4017,4018,4019,4020,-3819,-3880]]},{"type":"Polygon","id":51069,"arcs":[[4021,4022,4023,4024,-3980,-3846,-3891],[4025]]},{"type":"Polygon","id":29047,"arcs":[[-3777,-3990,4026,4027,-3982]]},{"type":"Polygon","id":18031,"arcs":[[-3987,4028,4029,4030,-3842,-3760]]},{"type":"Polygon","id":54091,"arcs":[[4031,-4017,-3879,-3809,-3815]]},{"type":"Polygon","id":54017,"arcs":[[-4021,4032,4033,4034,-3904,-3820]]},{"type":"Polygon","id":20087,"arcs":[[4035,4036,4037,-3863,-3868]]},{"type":"Polygon","id":20103,"arcs":[[-3984,4038,4039,4040,-4036,-3867]]},{"type":"Polygon","id":6011,"arcs":[[-3522,4041,4042,-3917,-3752]]},{"type":"Polygon","id":29195,"arcs":[[-3840,4043,4044,4045,4046,-3892]]},{"type":"Polygon","id":54107,"arcs":[[-4014,4047,4048,4049,4050,-3974,-3877]]},{"type":"Polygon","id":17013,"arcs":[[-4000,4051,4052,4053,-3910,-3728]]},{"type":"Polygon","id":39163,"arcs":[[-3976,4054,4055,4056,-4001,-3857]]},{"type":"Polygon","id":54085,"arcs":[[-4035,4057,4058,4059,-4048,-4013,-3905]]},{"type":"MultiPolygon","id":24029,"arcs":[[[-3737,4060,4061,4062,-3805]]]},{"type":"Polygon","id":8065,"arcs":[[-3686,-3973,4063,4064,-3682]]},{"type":"Polygon","id":17035,"arcs":[[-4012,4065,4066,-3869,-3852]]},{"type":"Polygon","id":39071,"arcs":[[-4004,4067,4068,4069,-3935,-3833]]},{"type":"MultiPolygon","id":24510,"arcs":[[[4070,4071]],[[4072,4073,-3823]]]},{"type":"Polygon","id":24027,"arcs":[[-3825,4074,4075,4076,-3829,-3827]]},{"type":"Polygon","id":8077,"arcs":[[4077,4078,4079,4080,-4007,-3557]]},{"type":"Polygon","id":8097,"arcs":[[-4065,4081,4082,-4078,-3556,-3683]]},{"type":"Polygon","id":10001,"arcs":[[4083,4084,4085,-4061,-3736,4086]]},{"type":"Polygon","id":18105,"arcs":[[4087,4088,4089,4090,-4015,-3888]]},{"type":"Polygon","id":18005,"arcs":[[-4031,4091,4092,4093,-3881,-3843]]},{"type":"Polygon","id":29007,"arcs":[[-3849,-3909,4094,4095,4096,-3895,-3854]]},{"type":"Polygon","id":24031,"arcs":[[4097,4098,4099,4100,-3830,-4077]]},{"type":"Polygon","id":18013,"arcs":[[-4094,4101,-4088,-3887,-3882]]},{"type":"Polygon","id":29089,"arcs":[[4102,-4044,-3839,-3897,4103]]},{"type":"Polygon","id":54023,"arcs":[[4104,4105,4106,4107,-3812,-3803,-3874]]},{"type":"MultiPolygon","id":34009,"arcs":[[[4108,-3927,-3788]]]},{"type":"Polygon","id":51107,"arcs":[[-4101,4109,4110,4111,4112,-4005,-3793,-3831]]},{"type":"Polygon","id":6061,"arcs":[[-2365,4113,4114,4115,4116,4117,-3885,-3998]]},{"type":"Polygon","id":39061,"arcs":[[-3916,4118,4119,4120,4121,4122,-3912]]},{"type":"Polygon","id":18137,"arcs":[[4123,4124,4125,4126,4127,-4029,-3986]]},{"type":"Polygon","id":18029,"arcs":[[-3985,-4123,4128,4129,-4124]]},{"type":"Polygon","id":20143,"arcs":[[-3951,4130,4131,4132,-3952,-3860]]},{"type":"Polygon","id":6101,"arcs":[[-3886,-4118,4133,4134,-4042,-3521]]},{"type":"Polygon","id":54001,"arcs":[[4135,4136,4137,-4018,-4032,-3814]]},{"type":"Polygon","id":29107,"arcs":[[4138,4139,4140,-3988,-3893,-4047]]},{"type":"Polygon","id":54093,"arcs":[[4141,-4136,-3813,-4108]]},{"type":"Polygon","id":39025,"arcs":[[4142,4143,4144,-4119,-3915,-3934,4145]]},{"type":"Polygon","id":51043,"arcs":[[-4113,4146,4147,-4022,-4006]]},{"type":"Polygon","id":17083,"arcs":[[-3996,4148,4149,-4052,-3999]]},{"type":"MultiPolygon","id":24035,"arcs":[[[4150]],[[-4086,4151,4152,4153,-4062]]]},{"type":"Polygon","id":18153,"arcs":[[-3903,4154,4155,4156,-4009,-3899]]},{"type":"Polygon","id":8051,"arcs":[[-4083,4157,4158,4159,4160,4161,4162,-4079]]},{"type":"Polygon","id":39015,"arcs":[[4163,4164,4165,-4146,-3933,-4070]]},{"type":"Polygon","id":29019,"arcs":[[-4097,4166,4167,4168,4169,-4104,-3896]]},{"type":"Polygon","id":32510,"arcs":[[4170,-4114,-2364,-3785]]},{"type":"Polygon","id":54031,"arcs":[[-4025,4171,4172,4173,-4105,-3981]]},{"type":"MultiPolygon","id":24003,"arcs":[[[4174,4175,4176,-4075,-3824,-4074,4177,-4071,4178]]]},{"type":"Polygon","id":29095,"arcs":[[-3989,-4141,4179,4180,4181,4182,-4027]]},{"type":"Polygon","id":29113,"arcs":[[-4054,4183,4184,4185,-3907]]},{"type":"Polygon","id":20061,"arcs":[[4186,4187,4188,-3949,-3958]]},{"type":"Polygon","id":8029,"arcs":[[-4163,4189,-4080]]},{"type":"Polygon","id":20105,"arcs":[[-4133,4190,4191,4192,-3943,-3953]]},{"type":"Polygon","id":20177,"arcs":[[-4038,4193,4194,4195,-3964,-3864]]},{"type":"Polygon","id":17051,"arcs":[[-3871,4196,4197,4198,4199,4200,-3991]]},{"type":"Polygon","id":17049,"arcs":[[-4067,4201,4202,-4197,-3870]]},{"type":"Polygon","id":20197,"arcs":[[-4196,4203,4204,4205,-4187,-3957,-3965]]},{"type":"Polygon","id":39079,"arcs":[[4206,4207,4208,4209,-4002,-4057]]},{"type":"Polygon","id":39105,"arcs":[[4210,4211,-4055,-3975,-4051,4212]]},{"type":"Polygon","id":51840,"arcs":[[-4026]]},{"type":"Polygon","id":20209,"arcs":[[-3983,-4028,-4183,4213,-4039]]},{"type":"Polygon","id":39131,"arcs":[[4214,4215,-4068,-4003,-4210]]},{"type":"Polygon","id":18079,"arcs":[[4216,4217,4218,-4092,-4030,-4128]]},{"type":"Polygon","id":54105,"arcs":[[4219,4220,4221,-4049,-4060]]},{"type":"Polygon","id":17033,"arcs":[[-4157,4222,4223,4224,4225,-4010]]},{"type":"Polygon","id":17079,"arcs":[[-4226,4226,4227,-4202,-4066,-4011]]},{"type":"Polygon","id":18055,"arcs":[[-4016,-4091,4228,4229,4230,4231,-4155,-3902]]},{"type":"Polygon","id":54041,"arcs":[[4232,4233,4234,4235,-4033,-4020]]},{"type":"Polygon","id":32023,"arcs":[[-2969,-3545,4236,4237,4238,4239,4240,-3623,-2971]]},{"type":"Polygon","id":29139,"arcs":[[-3908,-4186,4241,4242,4243,4244,-4095]]},{"type":"Polygon","id":21015,"arcs":[[4245,4246,4247,4248,4249,-4129,-4122]]},{"type":"Polygon","id":24011,"arcs":[[4250,4251,4252,4253,-4152,-4085]]},{"type":"Polygon","id":20109,"arcs":[[4254,4255,4256,4257,-3937,-3941]]},{"type":"Polygon","id":20199,"arcs":[[-4258,4258,4259,4260,-3922,-3938]]},{"type":"Polygon","id":20051,"arcs":[[-3945,4261,4262,4263,4264,-3930]]},{"type":"Polygon","id":20063,"arcs":[[-3947,-3955,4265,4266,4267,4268,-4255,-3940]]},{"type":"Polygon","id":20041,"arcs":[[-4189,4269,4270,4271,-4131,-3950]]},{"type":"Polygon","id":20167,"arcs":[[-4193,4272,4273,4274,-4262,-3944]]},{"type":"Polygon","id":20195,"arcs":[[-3931,-4265,4275,-4266,-3954]]},{"type":"Polygon","id":24033,"arcs":[[-4177,4276,4277,4278,4279,4280,-4098,-4076]]},{"type":"Polygon","id":8119,"arcs":[[4281,4282,-3970,-3698,-3961]]},{"type":"Polygon","id":8041,"arcs":[[-3963,-3969,4283,4284,-4282,-3960]]},{"type":"Polygon","id":21037,"arcs":[[-4145,4285,4286,-4120]]},{"type":"Polygon","id":54083,"arcs":[[-4107,4287,4288,4289,4290,-4137,-4142]]},{"type":"Polygon","id":32005,"arcs":[[-3784,4291,4292,4293,-4115,-4171]]},{"type":"Polygon","id":54097,"arcs":[[-4138,-4291,4294,-4233,-4019]]},{"type":"Polygon","id":54021,"arcs":[[-4236,4295,4296,-4058,-4034]]},{"type":"Polygon","id":51171,"arcs":[[4297,4298,4299,-4172,-4024]]},{"type":"Polygon","id":21117,"arcs":[[-4287,4300,4301,-4246,-4121]]},{"type":"Polygon","id":54035,"arcs":[[-4222,4302,4303,4304,4305,-4213,-4050]]},{"type":"Polygon","id":32021,"arcs":[[-4241,4306,4307,-3782,-3624]]},{"type":"Polygon","id":18071,"arcs":[[-4219,4308,4309,4310,-4089,-4102,-4093]]},{"type":"Polygon","id":20045,"arcs":[[-4041,4311,4312,4313,-4194,-4037]]},{"type":"Polygon","id":6017,"arcs":[[-4294,4314,4315,4316,-4116]]},{"type":"Polygon","id":29027,"arcs":[[-4096,-4245,4317,4318,-4167]]},{"type":"Polygon","id":29053,"arcs":[[-4170,4319,4320,4321,-4045,-4103]]},{"type":"MultiPolygon","id":51059,"arcs":[[[4322,4323,4324,4325,4326,4327,-4110,-4100],[4328]],[[4329]]]},{"type":"Polygon","id":8015,"arcs":[[-3972,4330,4331,-4158,-4082,-4064]]},{"type":"Polygon","id":20091,"arcs":[[-4182,4332,4333,-4312,-4040,-4214]]},{"type":"Polygon","id":39001,"arcs":[[4334,4335,4336,-4164,-4069,-4216]]},{"type":"Polygon","id":49041,"arcs":[[-3837,4337,4338,4339,-3977,-3747]]},{"type":"Polygon","id":8017,"arcs":[[-4261,4340,4341,-3966,-3923]]},{"type":"Polygon","id":54013,"arcs":[[-4297,4342,4343,4344,-4220,-4059]]},{"type":"Polygon","id":51187,"arcs":[[4345,4346,4347,-4298,-4023,-4148]]},{"type":"Polygon","id":39053,"arcs":[[4348,4349,4350,-4207,-4056,-4212]]},{"type":"Polygon","id":18115,"arcs":[[4351,-4125,-4130,-4250]]},{"type":"Polygon","id":54053,"arcs":[[-4306,4352,4353,-4349,-4211]]},{"type":"Polygon","id":17005,"arcs":[[-4201,4354,4355,-3992]]},{"type":"Polygon","id":39145,"arcs":[[-4209,4356,4357,4358,-4335,-4215]]},{"type":"Polygon","id":51061,"arcs":[[4359,4360,4361,4362,-4346,-4147,-4112]]},{"type":"Polygon","id":17119,"arcs":[[-3995,-3993,-4356,4363,4364,4365,4366,4367,-4149]]},{"type":"Polygon","id":29219,"arcs":[[4368,4369,4370,-4242,-4185]]},{"type":"MultiPolygon","id":11001,"arcs":[[[4371,4372,-4099,-4281]]]},{"type":"Polygon","id":18093,"arcs":[[-4311,4373,4374,4375,-4229,-4090]]},{"type":"Polygon","id":29183,"arcs":[[-4368,4376,4377,-4369,-4184,-4053,-4150]]},{"type":"Polygon","id":10005,"arcs":[[4378,4379,4380,4381,4382,4383,-4251,-4084]]},{"type":"Polygon","id":20169,"arcs":[[-4272,4384,4385,-4191,-4132]]},{"type":"Polygon","id":54071,"arcs":[[-4174,4386,4387,4388,4389,-4288,-4106]]},{"type":"Polygon","id":29159,"arcs":[[-4322,4390,4391,4392,4393,-4139,-4046]]},{"type":"MultiPolygon","id":24041,"arcs":[[[-4254,4394,-4153]]]},{"type":"Polygon","id":51153,"arcs":[[-4328,4395,4396,-4360,-4111],[4397,4398]]},{"type":"Polygon","id":54087,"arcs":[[-4345,4399,4400,-4303,-4221]]},{"type":"Polygon","id":29101,"arcs":[[-4394,4401,4402,-4180,-4140]]},{"type":"Polygon","id":51013,"arcs":[[4403,-4325,4404,-4323,-4373,4405]]},{"type":"Polygon","id":6003,"arcs":[[4406,4407,4408,4409,-4315,-4293]]},{"type":"Polygon","id":18155,"arcs":[[-4249,4410,4411,4412,-4126,-4352]]},{"type":"Polygon","id":29135,"arcs":[[4413,4414,4415,-4320,-4169]]},{"type":"Polygon","id":6113,"arcs":[[-4135,4416,4417,4418,-3918,-4043]]},{"type":"Polygon","id":18077,"arcs":[[-4413,4419,4420,4421,4422,-4217,-4127]]},{"type":"Polygon","id":17025,"arcs":[[-4228,4423,4424,4425,-4198,-4203]]},{"type":"Polygon","id":18083,"arcs":[[4426,4427,4428,4429,4430,-4223,-4156,-4232]]},{"type":"Polygon","id":18101,"arcs":[[-4376,4431,4432,4433,-4230]]},{"type":"Polygon","id":18027,"arcs":[[4434,4435,-4427,-4231,-4434]]},{"type":"Polygon","id":54007,"arcs":[[-4235,4436,4437,4438,-4343,-4296]]},{"type":"Polygon","id":51610,"arcs":[[-4324,-4405]]},{"type":"Polygon","id":29189,"arcs":[[-4367,4439,4440,4441,4442,4443,-4377]]},{"type":"Polygon","id":21191,"arcs":[[4444,4445,-4301,-4286,-4144,4446]]},{"type":"Polygon","id":20127,"arcs":[[-4206,4447,4448,4449,-4270,-4188]]},{"type":"Polygon","id":20053,"arcs":[[-4386,4450,4451,4452,-4273,-4192]]},{"type":"Polygon","id":20139,"arcs":[[-4314,4453,4454,4455,-4204,-4195]]},{"type":"Polygon","id":51600,"arcs":[[-4329],[-4330]]},{"type":"Polygon","id":6055,"arcs":[[4456,4457,4458,4459,4460,-3919,-4419]]},{"type":"Polygon","id":51157,"arcs":[[4461,4462,4463,-4347,-4363]]},{"type":"Polygon","id":21077,"arcs":[[4464,4465,4466,-4411,-4248]]},{"type":"Polygon","id":6097,"arcs":[[-3920,-4461,4467,4468,4469,-3604]]},{"type":"Polygon","id":17101,"arcs":[[4470,4471,-4224,-4431]]},{"type":"Polygon","id":51165,"arcs":[[-4300,4472,4473,4474,4475,-4387,-4173],[4476]]},{"type":"Polygon","id":17159,"arcs":[[-4225,-4472,4477,4478,4479,-4424,-4227]]},{"type":"Polygon","id":39087,"arcs":[[4480,4481,4482,4483,-4357,-4208,-4351]]},{"type":"Polygon","id":29037,"arcs":[[-4403,4484,4485,4486,-4333,-4181]]},{"type":"Polygon","id":51510,"arcs":[[4487,-4326,-4404]]},{"type":"Polygon","id":51139,"arcs":[[-4464,4488,4489,-4473,-4299,-4348]]},{"type":"Polygon","id":18143,"arcs":[[-4423,4490,4491,-4309,-4218]]},{"type":"Polygon","id":21023,"arcs":[[-4166,4492,4493,4494,-4447,-4143]]},{"type":"Polygon","id":17121,"arcs":[[-4426,4495,4496,4497,4498,-4199]]},{"type":"Polygon","id":21081,"arcs":[[-4302,-4446,4499,4500,4501,-4465,-4247]]},{"type":"Polygon","id":51685,"arcs":[[4502,-4398]]},{"type":"Polygon","id":18175,"arcs":[[-4492,4503,4504,4505,4506,4507,-4374,-4310]]},{"type":"Polygon","id":51683,"arcs":[[-4503,-4399]]},{"type":"Polygon","id":29510,"arcs":[[-4440,-4366,4508]]},{"type":"Polygon","id":24009,"arcs":[[4509,-4277,-4176]]},{"type":"Polygon","id":21161,"arcs":[[-4337,4510,4511,4512,-4493,-4165]]},{"type":"Polygon","id":21041,"arcs":[[4513,4514,4515,-4420,-4412,-4467]]},{"type":"Polygon","id":21089,"arcs":[[-4484,4516,4517,4518,-4358]]},{"type":"Polygon","id":17027,"arcs":[[-4200,-4499,4519,4520,-4364,-4355]]},{"type":"Polygon","id":54075,"arcs":[[-4390,4521,4522,4523,4524,-4289]]},{"type":"Polygon","id":29051,"arcs":[[-4319,4525,4526,-4414,-4168]]},{"type":"Polygon","id":20111,"arcs":[[-4456,4527,4528,4529,-4448,-4205]]},{"type":"Polygon","id":20059,"arcs":[[4530,4531,4532,-4454,-4313]]},{"type":"Polygon","id":20121,"arcs":[[-4487,4533,4534,-4531,-4334]]},{"type":"Polygon","id":54101,"arcs":[[-4295,-4290,-4525,4535,4536,-4437,-4234]]},{"type":"MultiPolygon","id":6067,"arcs":[[[4537,4538,4539,4540,-4417,-4134,-4117,-4317]]]},{"type":"Polygon","id":21223,"arcs":[[-4516,4541,4542,4543,-4421]]},{"type":"Polygon","id":21187,"arcs":[[-4502,4544,4545,4546,-4514,-4466]]},{"type":"Polygon","id":21135,"arcs":[[4547,4548,4549,-4511,-4336,-4359,-4519]]},{"type":"Polygon","id":29073,"arcs":[[-4371,4550,4551,4552,4553,4554,-4243]]},{"type":"Polygon","id":6051,"arcs":[[-3783,-4308,4555,4556,4557,4558,4559,-4407,-4292]]},{"type":"Polygon","id":29071,"arcs":[[-4378,-4444,4560,4561,4562,-4551,-4370]]},{"type":"Polygon","id":29151,"arcs":[[-4244,-4555,4563,4564,-4526,-4318]]},{"type":"Polygon","id":6005,"arcs":[[-4410,4565,4566,-4538,-4316]]},{"type":"MultiPolygon","id":24019,"arcs":[[[4567,-4252,-4384,4568,4569]]]},{"type":"Polygon","id":20171,"arcs":[[-4269,4570,4571,4572,4573,-4256]]},{"type":"Polygon","id":20101,"arcs":[[4574,4575,-4571,-4268]]},{"type":"Polygon","id":20071,"arcs":[[4576,4577,4578,4579,-4341,-4260]]},{"type":"Polygon","id":20203,"arcs":[[-4574,4580,4581,-4577,-4259,-4257]]},{"type":"Polygon","id":51047,"arcs":[[4582,4583,4584,4585,-4462,-4362]]},{"type":"Polygon","id":20135,"arcs":[[-4276,-4264,4586,4587,4588,4589,-4575,-4267]]},{"type":"Polygon","id":29141,"arcs":[[-4416,4590,4591,4592,-4391,-4321]]},{"type":"Polygon","id":20009,"arcs":[[-4453,4593,4594,4595,4596,-4274]]},{"type":"Polygon","id":8043,"arcs":[[-4285,4597,4598,4599,-4331,-3971,-4283]]},{"type":"Polygon","id":20165,"arcs":[[-4275,-4597,4600,-4587,-4263]]},{"type":"MultiPolygon","id":24017,"arcs":[[[-4279,4601,4602,4603]]]},{"type":"Polygon","id":18117,"arcs":[[-4508,4604,4605,-4432,-4375]]},{"type":"Polygon","id":54079,"arcs":[[4606,4607,-4353,-4305,4608]]},{"type":"Polygon","id":32017,"arcs":[[-3979,4609,4610,4611,4612,4613,-4237,-3544]]},{"type":"Polygon","id":8085,"arcs":[[-4162,4614,4615,4616,-4081,-4190]]},{"type":"Polygon","id":54015,"arcs":[[4617,4618,-4400,-4344,-4439]]},{"type":"Polygon","id":17163,"arcs":[[-4521,4619,4620,4621,-4441,-4509,-4365]]},{"type":"Polygon","id":51113,"arcs":[[-4586,4622,4623,-4489,-4463]]},{"type":"Polygon","id":54039,"arcs":[[-4401,-4619,4624,4625,4626,4627,4628,-4609,-4304]]},{"type":"Polygon","id":8061,"arcs":[[-4580,4629,4630,4631,4632,-3967,-4342]]},{"type":"Polygon","id":20113,"arcs":[[4633,4634,4635,4636,-4451,-4385]]},{"type":"Polygon","id":20115,"arcs":[[-4450,4637,4638,4639,-4634,-4271]]},{"type":"Polygon","id":21201,"arcs":[[-4513,4640,4641,4642,-4494]]},{"type":"Polygon","id":17191,"arcs":[[-4480,4643,4644,4645,4646,-4496,-4425]]},{"type":"Polygon","id":18019,"arcs":[[-4544,4647,4648,4649,-4504,-4491,-4422]]},{"type":"Polygon","id":54011,"arcs":[[-4354,-4608,4650,4651,-4481,-4350]]},{"type":"Polygon","id":21103,"arcs":[[4652,4653,4654,-4542,-4515,-4547]]},{"type":"Polygon","id":51091,"arcs":[[4655,4656,-4522,-4389]]},{"type":"Polygon","id":51179,"arcs":[[4657,4658,4659,4660,4661,4662,-4583,-4361,-4397]]},{"type":"Polygon","id":21097,"arcs":[[-4643,4663,4664,4665,-4500,-4445,-4495]]},{"type":"Polygon","id":49001,"arcs":[[-4340,4666,4667,4668,-4610,-3978]]},{"type":"Polygon","id":17047,"arcs":[[4669,4670,-4644,-4479]]},{"type":"Polygon","id":17185,"arcs":[[-4478,-4471,-4430,4671,4672,-4670]]},{"type":"Polygon","id":29083,"arcs":[[-4393,4673,4674,4675,-4485,-4402]]},{"type":"Polygon","id":24045,"arcs":[[4676,4677,4678,-4569,-4383]]},{"type":"Polygon","id":54067,"arcs":[[-4537,4679,4680,-4625,-4618,-4438]]},{"type":"Polygon","id":18125,"arcs":[[4681,4682,4683,-4428,-4436]]},{"type":"MultiPolygon","id":6095,"arcs":[[[4684,-4459]],[[-4541,4685,-4457,-4418]]]},{"type":"Polygon","id":29015,"arcs":[[-4593,4686,4687,4688,-4674,-4392]]},{"type":"Polygon","id":18051,"arcs":[[4689,4690,4691,4692,-4672,-4429,-4684]]},{"type":"Polygon","id":18037,"arcs":[[-4606,4693,4694,4695,4696,-4682,-4435,-4433]]},{"type":"Polygon","id":21069,"arcs":[[4697,4698,4699,-4641,-4512,-4550]]},{"type":"Polygon","id":21185,"arcs":[[-4655,4700,4701,-4648,-4543]]},{"type":"Polygon","id":20017,"arcs":[[-4530,4702,4703,-4638,-4449]]},{"type":"Polygon","id":8101,"arcs":[[4704,4705,4706,4707,4708,-4598,-4284]]},{"type":"Polygon","id":8025,"arcs":[[-4633,4709,-4705,-3968]]},{"type":"Polygon","id":20159,"arcs":[[-4637,4710,4711,-4594,-4452]]},{"type":"Polygon","id":17133,"arcs":[[4712,4713,4714,-4442,-4622]]},{"type":"Polygon","id":17189,"arcs":[[-4498,4715,4716,4717,-4620,-4520]]},{"type":"MultiPolygon","id":24037,"arcs":[[[4718,-4603,4719]]]},{"type":"Polygon","id":6009,"arcs":[[4720,4721,4722,-4566,-4409]]},{"type":"Polygon","id":49031,"arcs":[[4723,4724,-4667,-4339]]},{"type":"Polygon","id":49055,"arcs":[[-3836,4725,4726,-4724,-4338]]},{"type":"Polygon","id":29099,"arcs":[[-4715,4727,4728,4729,-4561,-4443]]},{"type":"Polygon","id":21019,"arcs":[[4730,4731,-4517,-4483,4732]]},{"type":"Polygon","id":21043,"arcs":[[-4732,4733,4734,4735,-4548,-4518]]},{"type":"Polygon","id":49037,"arcs":[[-4617,4736,4737,4738,4739,4740,4741,4742,4743,-4726,-4008]]},{"type":"Polygon","id":21209,"arcs":[[4744,4745,4746,4747,-4545,-4501,-4666]]},{"type":"Polygon","id":51660,"arcs":[[-4477]]},{"type":"Polygon","id":51079,"arcs":[[4748,4749,-4474,-4490,-4624]]},{"type":"Polygon","id":51015,"arcs":[[4750,4751,4752,4753,-4656,-4388,-4476],[4754],[4755]]},{"type":"Polygon","id":17081,"arcs":[[-4647,4756,4757,4758,-4716,-4497]]},{"type":"Polygon","id":29013,"arcs":[[-4676,4759,4760,4761,-4534,-4486]]},{"type":"Polygon","id":32009,"arcs":[[4762,-4556,-4307,-4240]]},{"type":"Polygon","id":21181,"arcs":[[-4700,4763,4764,-4664,-4642]]},{"type":"Polygon","id":8109,"arcs":[[-4600,4765,4766,4767,4768,4769,4770,-4159,-4332]]},{"type":"MultiPolygon","id":24047,"arcs":[[[4771,4772]],[[-4380,4773]],[[4774,4775,4776,4777,-4677,-4382,4778]]]},{"type":"Polygon","id":6109,"arcs":[[-4560,4779,4780,4781,-4721,-4408]]},{"type":"Polygon","id":20031,"arcs":[[-4533,4782,4783,4784,-4528,-4455]]},{"type":"Polygon","id":29131,"arcs":[[-4527,-4565,4785,4786,4787,-4591,-4415]]},{"type":"Polygon","id":18025,"arcs":[[4788,4789,4790,-4694,-4605,-4507]]},{"type":"Polygon","id":18061,"arcs":[[4791,4792,4793,4794,-4789,-4506]]},{"type":"Polygon","id":54099,"arcs":[[-4652,4795,4796,4797,4798,-4733,-4482]]},{"type":"Polygon","id":18043,"arcs":[[-4650,4799,-4792,-4505]]},{"type":"Polygon","id":51099,"arcs":[[4800,4801,4802,4803,-4659,4804]]},{"type":"Polygon","id":21205,"arcs":[[-4736,4805,4806,4807,4808,-4698,-4549]]},{"type":"Polygon","id":51137,"arcs":[[4809,4810,4811,-4749,-4623,-4585]]},{"type":"Polygon","id":20003,"arcs":[[4812,4813,-4783,-4532]]},{"type":"Polygon","id":20107,"arcs":[[-4762,4814,4815,-4813,-4535]]},{"type":"Polygon","id":21111,"arcs":[[4816,4817,4818,4819,-4793,-4800,-4649,-4702]]},{"type":"Polygon","id":51177,"arcs":[[-4663,4820,-4661,4821,4822,4823,-4810,-4584]]},{"type":"Polygon","id":54043,"arcs":[[-4607,-4629,4824,4825,4826,-4796,-4651]]},{"type":"Polygon","id":21073,"arcs":[[-4546,-4748,4827,4828,4829,-4653]]},{"type":"Polygon","id":21017,"arcs":[[4830,4831,4832,-4745,-4665,-4765]]},{"type":"Polygon","id":21211,"arcs":[[4833,4834,-4817,-4701,-4654,-4830]]},{"type":"Polygon","id":20145,"arcs":[[-4596,4835,4836,4837,-4588,-4601]]},{"type":"Polygon","id":8091,"arcs":[[-4161,4838,4839,4840,-4615]]},{"type":"Polygon","id":51630,"arcs":[[-4821,-4662]]},{"type":"MultiPolygon","id":6041,"arcs":[[[4841,-4469]]]},{"type":"Polygon","id":21011,"arcs":[[-4809,4842,4843,-4764,-4699]]},{"type":"Polygon","id":6077,"arcs":[[-4567,-4723,4844,4845,4846,4847,-4539]]},{"type":"Polygon","id":29125,"arcs":[[-4554,4848,4849,-4786,-4564]]},{"type":"MultiPolygon","id":24039,"arcs":[[[4850,4851]],[[4852,4853,4854,4855]],[[4856,4857,4858]],[[4859,-4678,-4778,4860]]]},{"type":"Polygon","id":51003,"arcs":[[-4812,4861,4862,4863,4864,-4751,-4475,-4750],[4865]]},{"type":"MultiPolygon","id":51193,"arcs":[[[4866,4867,4868,-4801,4869]]]},{"type":"Polygon","id":29029,"arcs":[[-4788,4870,4871,4872,4873,-4687,-4592]]},{"type":"Polygon","id":21127,"arcs":[[-4799,4874,4875,4876,4877,-4734,-4731]]},{"type":"Polygon","id":51017,"arcs":[[-4657,-4754,4878,4879,4880,-4523]]},{"type":"Polygon","id":8099,"arcs":[[-4579,4881,4882,4883,4884,-4630]]},{"type":"Polygon","id":54025,"arcs":[[-4881,4885,4886,4887,4888,-4680,-4536,-4524]]},{"type":"Polygon","id":21063,"arcs":[[-4878,4889,-4806,-4735]]},{"type":"Polygon","id":8027,"arcs":[[-4709,4890,-4766,-4599]]},{"type":"Polygon","id":8011,"arcs":[[-4885,4891,4892,4893,-4631]]},{"type":"Polygon","id":8089,"arcs":[[-4894,4894,-4706,-4710,-4632]]},{"type":"Polygon","id":18123,"arcs":[[4895,4896,4897,4898,-4695,-4791]]},{"type":"Polygon","id":54019,"arcs":[[-4681,-4889,4899,4900,-4626]]},{"type":"Polygon","id":20093,"arcs":[[4901,4902,4903,-4581,-4573]]},{"type":"Polygon","id":20055,"arcs":[[-4576,-4590,4904,4905,4906,-4902,-4572]]},{"type":"Polygon","id":20075,"arcs":[[-4904,4907,-4882,-4578,-4582]]},{"type":"Polygon","id":17193,"arcs":[[-4673,-4693,4908,4909,4910,-4645,-4671]]},{"type":"Polygon","id":20185,"arcs":[[-4712,4911,4912,4913,-4836,-4595]]},{"type":"Polygon","id":20083,"arcs":[[-4838,4914,4915,4916,-4905,-4589]]},{"type":"Polygon","id":17065,"arcs":[[-4911,4917,4918,4919,-4757,-4646]]},{"type":"Polygon","id":51033,"arcs":[[-4804,4920,4921,4922,4923,-4822,-4660]]},{"type":"Polygon","id":18173,"arcs":[[-4697,4924,4925,4926,4927,-4690,-4683]]},{"type":"Polygon","id":18129,"arcs":[[4928,4929,4930,4931,-4909,-4692]]},{"type":"Polygon","id":54005,"arcs":[[4932,4933,4934,-4825,-4628]]},{"type":"Polygon","id":17157,"arcs":[[-4621,-4718,4935,4936,4937,4938,-4713]]},{"type":"Polygon","id":29185,"arcs":[[-4689,4939,4940,4941,4942,-4760,-4675]]},{"type":"Polygon","id":17145,"arcs":[[-4717,-4759,4943,4944,-4936]]},{"type":"Polygon","id":29055,"arcs":[[-4563,4945,4946,4947,4948,-4552]]},{"type":"Polygon","id":21067,"arcs":[[4949,4950,4951,4952,-4746,-4833]]},{"type":"Polygon","id":29221,"arcs":[[-4730,4953,4954,-4946,-4562]]},{"type":"Polygon","id":18147,"arcs":[[-4899,4955,4956,-4925,-4696]]},{"type":"Polygon","id":21163,"arcs":[[4957,4958,-4896,-4790,-4795]]},{"type":"Polygon","id":51790,"arcs":[[-4755]]},{"type":"Polygon","id":21239,"arcs":[[-4953,4959,4960,4961,-4828,-4747]]},{"type":"Polygon","id":21173,"arcs":[[4962,4963,4964,-4831,-4844]]},{"type":"Polygon","id":20079,"arcs":[[4965,4966,4967,-4635,-4640]]},{"type":"Polygon","id":20073,"arcs":[[-4529,-4785,4968,4969,4970,4971,-4703]]},{"type":"Polygon","id":20155,"arcs":[[-4636,-4968,4972,4973,4974,-4912,-4711]]},{"type":"Polygon","id":18163,"arcs":[[-4928,4975,-4929,-4691]]},{"type":"Polygon","id":29161,"arcs":[[-4949,4976,4977,4978,-4849,-4553]]},{"type":"Polygon","id":49017,"arcs":[[-4744,4979,4980,-4668,-4725,-4727]]},{"type":"Polygon","id":51057,"arcs":[[4981,4982,-4921,-4803,4983]]},{"type":"Polygon","id":8113,"arcs":[[-4841,4984,4985,-4737,-4616]]},{"type":"Polygon","id":51109,"arcs":[[-4824,4986,4987,4988,-4862,-4811]]},{"type":"Polygon","id":49021,"arcs":[[-4981,4989,4990,-4611,-4669]]},{"type":"Polygon","id":21215,"arcs":[[4991,4992,4993,-4818,-4835]]},{"type":"Polygon","id":8053,"arcs":[[-4771,4994,4995,4996,4997,-4839,-4160]]},{"type":"Polygon","id":21005,"arcs":[[-4962,4998,4999,5000,-4992,-4834,-4829]]},{"type":"Polygon","id":17055,"arcs":[[-4920,5001,5002,5003,-4944,-4758]]},{"type":"Polygon","id":51159,"arcs":[[5004,5005,5006,-4868]]},{"type":"Polygon","id":29186,"arcs":[[-4939,5007,5008,-4728,-4714]]},{"type":"Polygon","id":21029,"arcs":[[5009,5010,-4819,-4994]]},{"type":"Polygon","id":21175,"arcs":[[-4877,5011,5012,5013,5014,-4807,-4890]]},{"type":"Polygon","id":21049,"arcs":[[5015,5016,5017,-4950,-4832,-4965]]},{"type":"MultiPolygon","id":6013,"arcs":[[[-4847,5018,5019]]]},{"type":"Polygon","id":51820,"arcs":[[-4756]]},{"type":"Polygon","id":20015,"arcs":[[-4704,-4972,5020,5021,5022,-4966,-4639]]},{"type":"Polygon","id":20047,"arcs":[[-4914,5023,5024,5025,-4915,-4837]]},{"type":"Polygon","id":51163,"arcs":[[5026,5027,5028,5029,-4879,-4753,5030],[5031],[5032]]},{"type":"Polygon","id":29187,"arcs":[[-5009,5033,5034,5035,-4954,-4729]]},{"type":"Polygon","id":6099,"arcs":[[5036,5037,5038,-4845,-4722,-4782]]},{"type":"Polygon","id":29085,"arcs":[[-4874,5039,5040,-4940,-4688]]},{"type":"Polygon","id":51540,"arcs":[[-4866]]},{"type":"Polygon","id":29217,"arcs":[[-4943,5041,5042,5043,5044,-4815,-4761]]},{"type":"Polygon","id":21165,"arcs":[[-4808,-5015,5045,5046,-4963,-4843]]},{"type":"Polygon","id":51125,"arcs":[[5047,5048,5049,-5031,-4752,-4865]]},{"type":"Polygon","id":21027,"arcs":[[5050,5051,5052,5053,-4897,-4959]]},{"type":"Polygon","id":20207,"arcs":[[5054,5055,-4969,-4784]]},{"type":"Polygon","id":20001,"arcs":[[5056,5057,-5055,-4814]]},{"type":"Polygon","id":20011,"arcs":[[-5045,5058,5059,-5057,-4816]]},{"type":"MultiPolygon","id":51001,"arcs":[[[5060,-4854]],[[5061,-4858]],[[-4851,5062]],[[5063,5064,5065,5066,-4776,5067]],[[-4772,5068]]]},{"type":"Polygon","id":54045,"arcs":[[-4935,5069,5070,-4826]]},{"type":"Polygon","id":51133,"arcs":[[5071,-5005,-4867,5072]]},{"type":"Polygon","id":29169,"arcs":[[-4850,-4979,5073,5074,-4871,-4787]]},{"type":"Polygon","id":8055,"arcs":[[-4708,5075,5076,5077,-4767,-4891]]},{"type":"Polygon","id":51085,"arcs":[[-4924,5078,5079,5080,5081,-4987,-4823]]},{"type":"Polygon","id":51065,"arcs":[[5082,5083,-4863,-4989,5084]]},{"type":"Polygon","id":21093,"arcs":[[5085,5086,5087,5088,-5051,-4958,-4794,-4820,-5011]]},{"type":"Polygon","id":21113,"arcs":[[5089,5090,5091,-4960,-4952]]},{"type":"Polygon","id":21115,"arcs":[[5092,5093,5094,-5012,-4876]]},{"type":"Polygon","id":20069,"arcs":[[-4917,5095,5096,5097,-4906]]},{"type":"Polygon","id":21091,"arcs":[[-5054,5098,5099,-4956,-4898]]},{"type":"Polygon","id":54081,"arcs":[[-4627,-4901,5100,5101,5102,-4933]]},{"type":"Polygon","id":21179,"arcs":[[-5001,5103,5104,5105,-5086,-5010,-4993]]},{"type":"Polygon","id":54059,"arcs":[[5106,5107,5108,5109,5110,-4797,-4827,-5071]]},{"type":"Polygon","id":21101,"arcs":[[-4927,5111,5112,5113,5114,-4930,-4976]]},{"type":"Polygon","id":51097,"arcs":[[-4983,5115,5116,5117,5118,-4922]]},{"type":"Polygon","id":8111,"arcs":[[-4998,5119,5120,-4985,-4840]]},{"type":"Polygon","id":21167,"arcs":[[-5092,5121,5122,5123,-4999,-4961]]},{"type":"Polygon","id":8079,"arcs":[[5124,5125,-4995,-4770]]},{"type":"Polygon","id":21159,"arcs":[[-4798,-5111,5126,5127,-5093,-4875]]},{"type":"Polygon","id":51005,"arcs":[[-5030,5128,5129,5130,-4886,-4880],[5131]]},{"type":"Polygon","id":17077,"arcs":[[-5004,5132,5133,5134,-4937,-4945]]},{"type":"Polygon","id":21197,"arcs":[[-5047,5135,5136,5137,-5016,-4964]]},{"type":"Polygon","id":21059,"arcs":[[5138,5139,-5112,-4926,-4957,-5100]]},{"type":"Polygon","id":21151,"arcs":[[5140,5141,5142,5143,-5090,-4951,-5018]]},{"type":"Polygon","id":17059,"arcs":[[-4932,5144,5145,5146,-4918,-4910]]},{"type":"Polygon","id":21229,"arcs":[[-5124,5147,5148,-5104,-5000]]},{"type":"Polygon","id":20057,"arcs":[[-5026,5149,5150,5151,-5096,-4916]]},{"type":"Polygon","id":20173,"arcs":[[-5023,5152,5153,-4973,-4967]]},{"type":"Polygon","id":17165,"arcs":[[-5147,5154,5155,5156,-5002,-4919]]},{"type":"Polygon","id":51101,"arcs":[[-5119,5157,5158,-5079,-4923]]},{"type":"Polygon","id":29059,"arcs":[[-4873,5159,5160,5161,5162,-5040]]},{"type":"MultiPolygon","id":6001,"arcs":[[[-4846,-5039,5163,5164,-5019]]]},{"type":"Polygon","id":51075,"arcs":[[5165,5166,5167,-5085,-4988,-5082]]},{"type":"Polygon","id":29157,"arcs":[[-5135,5168,5169,5170,5171,-5034,-5008,-4938]]},{"type":"Polygon","id":29039,"arcs":[[5172,5173,5174,-5042,-4942]]},{"type":"Polygon","id":6043,"arcs":[[5175,5176,-4781]]},{"type":"Polygon","id":21225,"arcs":[[5177,5178,5179,-5145,-4931,-5115]]},{"type":"Polygon","id":29105,"arcs":[[-5075,5180,5181,5182,-5160,-4872]]},{"type":"Polygon","id":8033,"arcs":[[-5121,5183,-4738,-4986]]},{"type":"Polygon","id":21153,"arcs":[[-5095,5184,5185,5186,5187,-5013]]},{"type":"Polygon","id":54089,"arcs":[[5188,5189,-5101,-4900,-4888,5190]]},{"type":"Polygon","id":17199,"arcs":[[-5157,5191,5192,-5133,-5003]]},{"type":"Polygon","id":21237,"arcs":[[-5188,5193,5194,-5136,-5046,-5014]]},{"type":"Polygon","id":21065,"arcs":[[-5138,5195,5196,-5141,-5017]]},{"type":"MultiPolygon","id":51103,"arcs":[[[5197,-5006,-5072,5198]]]},{"type":"Polygon","id":8105,"arcs":[[-4769,5199,5200,5201,-5125]]},{"type":"MultiPolygon","id":6075,"arcs":[[[5202,5203]]]},{"type":"Polygon","id":29167,"arcs":[[-5041,-5163,5204,5205,-5173,-4941]]},{"type":"Polygon","id":21079,"arcs":[[-5144,5206,5207,5208,-5122,-5091]]},{"type":"Polygon","id":20151,"arcs":[[-4975,5209,5210,5211,-5024,-4913]]},{"type":"Polygon","id":51580,"arcs":[[-5132]]},{"type":"Polygon","id":51009,"arcs":[[5212,5213,5214,5215,-5027,-5050]]},{"type":"Polygon","id":8071,"arcs":[[-4893,5216,5217,5218,5219,-5076,-4707,-4895]]},{"type":"Polygon","id":51023,"arcs":[[5220,5221,5222,-5129,-5029]]},{"type":"Polygon","id":51678,"arcs":[[-5032]]},{"type":"Polygon","id":29065,"arcs":[[-4948,5223,5224,5225,5226,-4977]]},{"type":"Polygon","id":54109,"arcs":[[5227,5228,-5107,-5070,-4934,-5103]]},{"type":"Polygon","id":51029,"arcs":[[5229,5230,5231,-5048,-4864,-5084]]},{"type":"Polygon","id":6039,"arcs":[[-4559,5232,5233,-5176,-4780]]},{"type":"MultiPolygon","id":51119,"arcs":[[[5234,-5116,-4982,5235]]]},{"type":"Polygon","id":51530,"arcs":[[-5033]]},{"type":"Polygon","id":21071,"arcs":[[-5128,5236,5237,-5185,-5094]]},{"type":"Polygon","id":8003,"arcs":[[-5078,5238,5239,-5200,-4768]]},{"type":"Polygon","id":51049,"arcs":[[-5168,5240,5241,5242,-5230,-5083]]},{"type":"Polygon","id":21195,"arcs":[[5243,5244,5245,5246,5247,-5237,-5127,-5110]]},{"type":"Polygon","id":29093,"arcs":[[-5036,5248,5249,5250,-5224,-4947,-4955]]},{"type":"Polygon","id":20187,"arcs":[[5251,5252,5253,5254,-4883,-4908]]},{"type":"Polygon","id":21183,"arcs":[[-5053,5255,5256,5257,5258,-5139,-5099]]},{"type":"Polygon","id":20067,"arcs":[[5259,5260,-5252,-4903]]},{"type":"Polygon","id":20081,"arcs":[[-5098,5261,5262,5263,-5260,-4907]]},{"type":"Polygon","id":20097,"arcs":[[-5212,5264,5265,5266,-5150,-5025]]},{"type":"Polygon","id":20095,"arcs":[[-5154,5267,5268,5269,-5210,-4974]]},{"type":"Polygon","id":20205,"arcs":[[5270,5271,5272,-4970,-5056]]},{"type":"Polygon","id":20133,"arcs":[[-5060,5273,5274,5275,-5271,-5058]]},{"type":"Polygon","id":21123,"arcs":[[5276,5277,5278,5279,-5087,-5106]]},{"type":"Polygon","id":21155,"arcs":[[-5149,5280,5281,5282,-5277,-5105]]},{"type":"Polygon","id":54063,"arcs":[[-5131,5283,5284,-5191,-4887]]},{"type":"Polygon","id":21129,"arcs":[[-5195,5285,5286,5287,-5196,-5137]]},{"type":"Polygon","id":21021,"arcs":[[-5209,5288,5289,-5281,-5148,-5123]]},{"type":"Polygon","id":51087,"arcs":[[5290,5291,5292,5293,5294,5295,-5166,-5081]]},{"type":"Polygon","id":6081,"arcs":[[5296,5297,5298,5299,-5203]]},{"type":"Polygon","id":21025,"arcs":[[-5187,5300,5301,5302,-5286,-5194]]},{"type":"Polygon","id":51145,"arcs":[[5303,5304,-5241,-5167]]},{"type":"Polygon","id":21149,"arcs":[[-5259,5305,5306,5307,-5113,-5140]]},{"type":"Polygon","id":20037,"arcs":[[-5044,5308,5309,5310,5311,-5274,-5059]]},{"type":"Polygon","id":51045,"arcs":[[5312,5313,5314,-5284,-5130,-5223]]},{"type":"Polygon","id":8023,"arcs":[[-5220,5315,5316,5317,-5239,-5077]]},{"type":"Polygon","id":29011,"arcs":[[-5175,5318,5319,-5309,-5043]]},{"type":"Polygon","id":21233,"arcs":[[5320,5321,5322,-5178,-5114,-5308]]},{"type":"Polygon","id":29123,"arcs":[[-5172,5323,5324,-5249,-5035]]},{"type":"Polygon","id":8009,"arcs":[[-5255,5325,5326,5327,-5217,-4892,-4884]]},{"type":"Polygon","id":8083,"arcs":[[5328,5329,-4739,-5184]]},{"type":"Polygon","id":8067,"arcs":[[-4997,5330,5331,-5329,-5120]]},{"type":"Polygon","id":6047,"arcs":[[-5234,5332,5333,5334,-5037,-5177]]},{"type":"Polygon","id":21137,"arcs":[[5335,5336,5337,-5289,-5208]]},{"type":"Polygon","id":51127,"arcs":[[5338,5339,5340,-5291,-5080,-5159]]},{"type":"Polygon","id":21085,"arcs":[[-5089,5341,5342,5343,-5256,-5052]]},{"type":"Polygon","id":51019,"arcs":[[5344,5345,5346,5347,5348,-5221,-5028,-5216],[5349]]},{"type":"Polygon","id":49053,"arcs":[[5350,5351,-4612,-4991]]},{"type":"Polygon","id":20049,"arcs":[[-5273,5352,5353,5354,-5021,-4971]]},{"type":"Polygon","id":29179,"arcs":[[5355,5356,5357,-5225,-5251]]},{"type":"Polygon","id":29031,"arcs":[[5358,5359,5360,5361,5362,-5170]]},{"type":"Polygon","id":29215,"arcs":[[-4978,-5227,5363,5364,5365,5366,-5181,-5074]]},{"type":"Polygon","id":17069,"arcs":[[-5146,-5180,5367,5368,5369,-5155]]},{"type":"Polygon","id":17151,"arcs":[[-5370,5370,5371,5372,-5156]]},{"type":"Polygon","id":51760,"arcs":[[5373,-5295]]},{"type":"Polygon","id":17087,"arcs":[[-5373,5374,5375,5376,-5192]]},{"type":"Polygon","id":17181,"arcs":[[-5193,-5377,5377,5378,-5359,-5169,-5134]]},{"type":"MultiPolygon","id":51073,"arcs":[[[5379,5380,5381,-5117,-5235]]]},{"type":"Polygon","id":29017,"arcs":[[-5363,5382,5383,-5324,-5171]]},{"type":"Polygon","id":54055,"arcs":[[-5190,5384,5385,5386,5387,-5228,-5102]]},{"type":"Polygon","id":6019,"arcs":[[5388,5389,5390,5391,5392,-5333,-5233,-4558]]},{"type":"Polygon","id":29057,"arcs":[[-5206,5393,5394,5395,-5319,-5174]]},{"type":"Polygon","id":21109,"arcs":[[-5288,5396,5397,5398,5399,-5142,-5197]]},{"type":"Polygon","id":21107,"arcs":[[5400,5401,5402,-5321,-5307]]},{"type":"MultiPolygon","id":51041,"arcs":[[[-5374,-5294,5403,5404,5405,5406,5407,5408,5409,5410,-5304,-5296]]]},{"type":"Polygon","id":51011,"arcs":[[5411,5412,5413,-5213,-5049,-5232]]},{"type":"MultiPolygon","id":51131,"arcs":[[[5414,-5065]]]},{"type":"Polygon","id":21045,"arcs":[[-5338,5415,5416,5417,5418,-5282,-5290]]},{"type":"Polygon","id":54047,"arcs":[[-5388,5419,5420,-5108,-5229]]},{"type":"Polygon","id":21055,"arcs":[[-5323,5421,5422,5423,-5368,-5179]]},{"type":"Polygon","id":49025,"arcs":[[-4980,-4743,5424,5425,-5351,-4990]]},{"type":"Polygon","id":21189,"arcs":[[-5303,5426,5427,-5397,-5287]]},{"type":"Polygon","id":21203,"arcs":[[-5400,5428,5429,-5336,-5207,-5143]]},{"type":"Polygon","id":51027,"arcs":[[-5421,5430,5431,5432,-5244,-5109]]},{"type":"MultiPolygon","id":51115,"arcs":[[[-5381,5433]]]},{"type":"Polygon","id":21119,"arcs":[[-5186,-5238,-5248,5434,5435,-5301]]},{"type":"Polygon","id":51007,"arcs":[[-5411,5436,5437,5438,-5242,-5305]]},{"type":"Polygon","id":51036,"arcs":[[5439,5440,-5292,-5341]]},{"type":"Polygon","id":29225,"arcs":[[-5183,5441,5442,5443,5444,-5161]]},{"type":"Polygon","id":6085,"arcs":[[-5038,-5335,5445,5446,-5298,5447,-5164]]},{"type":"Polygon","id":21217,"arcs":[[-5283,-5419,5448,5449,-5278]]},{"type":"Polygon","id":29229,"arcs":[[-5367,5450,-5442,-5182]]},{"type":"Polygon","id":51071,"arcs":[[-5315,5451,5452,5453,-5385,-5189,-5285]]},{"type":"Polygon","id":20035,"arcs":[[-5355,5454,5455,5456,5457,-5022]]},{"type":"Polygon","id":20191,"arcs":[[-5458,5458,5459,5460,-5268,-5153]]},{"type":"Polygon","id":20119,"arcs":[[-5152,5461,5462,5463,-5262,-5097]]},{"type":"Polygon","id":20025,"arcs":[[-5267,5464,5465,5466,-5462,-5151]]},{"type":"Polygon","id":20007,"arcs":[[-5270,5467,5468,5469,5470,-5265,-5211]]},{"type":"Polygon","id":21087,"arcs":[[-5450,5471,5472,5473,-5279]]},{"type":"Polygon","id":51680,"arcs":[[-5215,5474,-5345]]},{"type":"Polygon","id":6027,"arcs":[[-4763,-4239,5475,5476,5477,5478,-5389,-4557]]},{"type":"MultiPolygon","id":51095,"arcs":[[[5479,5480,5481,5482,-5440,-5340,5483,5484,5485]]]},{"type":"Polygon","id":21099,"arcs":[[-5280,-5474,5486,5487,5488,-5342,-5088]]},{"type":"Polygon","id":21193,"arcs":[[-5436,5489,5490,5491,5492,-5427,-5302]]},{"type":"Polygon","id":51031,"arcs":[[-5414,5493,5494,5495,-5346,-5475,-5214]]},{"type":"Polygon","id":29077,"arcs":[[-5162,-5445,5496,5497,-5394,-5205]]},{"type":"Polygon","id":21139,"arcs":[[-5424,5498,5499,5500,5501,-5371,-5369]]},{"type":"Polygon","id":29203,"arcs":[[-5358,5502,5503,5504,-5364,-5226]]},{"type":"Polygon","id":8007,"arcs":[[-5126,-5202,5505,5506,5507,-5331,-4996]]},{"type":"Polygon","id":51161,"arcs":[[-5349,5508,5509,5510,-5313,-5222],[5511,5512]]},{"type":"Polygon","id":21177,"arcs":[[5513,5514,5515,5516,-5401,-5306,-5258]]},{"type":"Polygon","id":51147,"arcs":[[-5243,-5439,5517,5518,5519,-5412,-5231]]},{"type":"Polygon","id":8021,"arcs":[[-5201,-5240,-5318,5520,5521,-5506]]},{"type":"Polygon","id":21031,"arcs":[[5522,5523,-5514,-5257,-5344,5524]]},{"type":"Polygon","id":20129,"arcs":[[5525,5526,5527,-5326,-5254]]},{"type":"Polygon","id":20189,"arcs":[[-5264,5528,5529,-5526,-5253,-5261]]},{"type":"Polygon","id":20175,"arcs":[[-5464,5530,5531,-5529,-5263]]},{"type":"Polygon","id":20125,"arcs":[[-5272,-5276,5532,5533,5534,5535,-5353]]},{"type":"Polygon","id":20077,"arcs":[[5536,5537,-5468,-5269,-5461]]},{"type":"Polygon","id":20033,"arcs":[[5538,5539,-5465,-5266,-5471]]},{"type":"Polygon","id":20099,"arcs":[[-5312,5540,5541,5542,-5533,-5275]]},{"type":"Polygon","id":21033,"arcs":[[-5403,5543,5544,5545,-5422,-5322]]},{"type":"MultiPolygon","id":51199,"arcs":[[[5546,5547,5548,5549,-5481,5550,-5485]]]},{"type":"Polygon","id":29097,"arcs":[[-5396,5551,5552,5553,-5310,-5320]]},{"type":"Polygon","id":51121,"arcs":[[5554,5555,5556,5557,-5452,-5314,-5511]]},{"type":"Polygon","id":51515,"arcs":[[-5350]]},{"type":"Polygon","id":21051,"arcs":[[-5493,5558,5559,5560,5561,-5398,-5428]]},{"type":"Polygon","id":21199,"arcs":[[5562,5563,5564,-5416,-5337,-5430,5565]]},{"type":"Polygon","id":20021,"arcs":[[-5554,5566,5567,5568,-5541,-5311]]},{"type":"Polygon","id":21061,"arcs":[[-5489,5569,5570,-5525,-5343]]},{"type":"Polygon","id":51770,"arcs":[[5571,-5513]]},{"type":"Polygon","id":17127,"arcs":[[-5502,5572,5573,-5375,-5372]]},{"type":"Polygon","id":51185,"arcs":[[-5387,5574,5575,5576,-5431,-5420]]},{"type":"Polygon","id":17003,"arcs":[[5577,5578,5579,5580,-5360,-5379]]},{"type":"Polygon","id":21125,"arcs":[[-5562,5581,5582,5583,-5566,-5429,-5399]]},{"type":"Polygon","id":17153,"arcs":[[-5376,-5574,5584,5585,-5578,-5378]]},{"type":"Polygon","id":51775,"arcs":[[-5572,-5512]]},{"type":"Polygon","id":21131,"arcs":[[5586,5587,-5559,-5492]]},{"type":"Polygon","id":51670,"arcs":[[5588,-5405,5589]]},{"type":"Polygon","id":29223,"arcs":[[-5384,5590,5591,5592,-5356,-5250,-5325]]},{"type":"Polygon","id":51149,"arcs":[[5593,5594,5595,5596,5597,-5406,-5589]]},{"type":"Polygon","id":51830,"arcs":[[5598,-5486,-5551,-5480]]},{"type":"Polygon","id":21001,"arcs":[[-5418,5599,5600,5601,-5472,-5449]]},{"type":"Polygon","id":51051,"arcs":[[5602,5603,-5245,-5433]]},{"type":"Polygon","id":20019,"arcs":[[-5536,5604,5605,-5455,-5354]]},{"type":"Polygon","id":51021,"arcs":[[5606,5607,5608,-5575,-5386,-5454]]},{"type":"Polygon","id":51570,"arcs":[[5609,-5408]]},{"type":"Polygon","id":51135,"arcs":[[5610,5611,-5518,-5438,5612]]},{"type":"Polygon","id":29109,"arcs":[[-5498,5613,5614,5615,5616,-5552,-5395]]},{"type":"Polygon","id":6087,"arcs":[[5617,5618,5619,-5299,-5447]]},{"type":"Polygon","id":51053,"arcs":[[5620,-5597,5621,5622,5623,-5613,-5437,-5410]]},{"type":"Polygon","id":21133,"arcs":[[-5247,5624,5625,-5490,-5435]]},{"type":"Polygon","id":29201,"arcs":[[5626,5627,5628,-5361,-5581]]},{"type":"Polygon","id":51037,"arcs":[[5629,5630,5631,-5494,-5413,-5520]]},{"type":"Polygon","id":51155,"arcs":[[5632,-5556,5633,5634,5635,-5607,-5453,-5558]]},{"type":"Polygon","id":51730,"arcs":[[-5621,-5409,-5610,-5407,-5598]]},{"type":"Polygon","id":51181,"arcs":[[5636,5637,5638,-5595,5639]]},{"type":"Polygon","id":51067,"arcs":[[5640,5641,5642,5643,-5509,-5348]]},{"type":"Polygon","id":21007,"arcs":[[5644,5645,-5579,-5586,5646]]},{"type":"Polygon","id":21145,"arcs":[[-5501,5647,5648,5649,-5647,-5585,-5573]]},{"type":"Polygon","id":51700,"arcs":[[5650,5651,-5482,-5550]]},{"type":"Polygon","id":51195,"arcs":[[5652,5653,5654,5655,-5625,-5246,-5604],[5656]]},{"type":"Polygon","id":21227,"arcs":[[-5571,5657,5658,5659,5660,-5523]]},{"type":"Polygon","id":21207,"arcs":[[-5565,5661,5662,5663,-5600,-5417]]},{"type":"Polygon","id":21169,"arcs":[[-5602,5664,5665,5666,-5487,-5473]]},{"type":"Polygon","id":21143,"arcs":[[-5546,5667,5668,-5499,-5423]]},{"type":"MultiPolygon","id":51735,"arcs":[[[5669,5670,-5548,5671]]]},{"type":"Polygon","id":21009,"arcs":[[5672,5673,-5658,-5570,-5488,-5667]]},{"type":"Polygon","id":21047,"arcs":[[-5517,5674,5675,5676,5677,-5544,-5402]]},{"type":"Polygon","id":51750,"arcs":[[-5633,-5557]]},{"type":"Polygon","id":51093,"arcs":[[5678,5679,5680,5681,-5637,5682]]},{"type":"Polygon","id":51167,"arcs":[[5683,5684,5685,-5653,-5603,-5432,-5577]]},{"type":"Polygon","id":51143,"arcs":[[5686,5687,5688,5689,5690,5691,-5641,-5347,-5496]]},{"type":"Polygon","id":51063,"arcs":[[-5644,5692,5693,-5634,-5555,-5510]]},{"type":"Polygon","id":29207,"arcs":[[-5362,-5629,5694,5695,5696,-5591,-5383]]},{"type":"Polygon","id":51111,"arcs":[[-5612,5697,5698,-5630,-5519]]},{"type":"Polygon","id":51650,"arcs":[[-5651,-5549,-5671,5699]]},{"type":"Polygon","id":51183,"arcs":[[5700,5701,-5622,-5596,-5639]]},{"type":"Polygon","id":29035,"arcs":[[-5593,5702,5703,5704,-5503,-5357]]},{"type":"Polygon","id":29043,"arcs":[[-5444,5705,5706,5707,-5614,-5497]]},{"type":"Polygon","id":51197,"arcs":[[5708,5709,5710,-5608,-5636]]},{"type":"Polygon","id":21141,"arcs":[[5711,5712,5713,-5515,-5524,-5661]]},{"type":"Polygon","id":21219,"arcs":[[-5714,5714,5715,-5675,-5516]]},{"type":"Polygon","id":29067,"arcs":[[-5451,-5366,5716,5717,5718,-5706,-5443]]},{"type":"Polygon","id":21157,"arcs":[[-5669,5719,5720,5721,-5648,-5500]]},{"type":"Polygon","id":29133,"arcs":[[-5646,5722,5723,5724,5725,-5627,-5580]]},{"type":"Polygon","id":51083,"arcs":[[-5632,5726,5727,5728,5729,-5687,-5495]]},{"type":"Polygon","id":29091,"arcs":[[-5505,5730,5731,5732,-5717,-5365]]},{"type":"Polygon","id":29145,"arcs":[[-5617,5733,5734,5735,-5567,-5553]]},{"type":"Polygon","id":21121,"arcs":[[5736,5737,-5582,-5561]]},{"type":"Polygon","id":51025,"arcs":[[-5624,5738,5739,5740,5741,-5698,-5611]]},{"type":"Polygon","id":21095,"arcs":[[-5626,-5656,5742,5743,-5587,-5491]]},{"type":"Polygon","id":51173,"arcs":[[-5609,-5711,5744,5745,-5684,-5576]]},{"type":"Polygon","id":4017,"arcs":[[5746,5747,5748,5749,-4741]]},{"type":"Polygon","id":4005,"arcs":[[-5750,5750,5751,5752,-5425,-4742]]},{"type":"Polygon","id":21221,"arcs":[[5753,5754,-5720,-5668,-5545,-5678]]},{"type":"Polygon","id":40105,"arcs":[[-5543,5755,5756,5757,-5534]]},{"type":"Polygon","id":40113,"arcs":[[5758,5759,5760,5761,5762,-5456,-5606]]},{"type":"Polygon","id":40151,"arcs":[[-5470,5763,5764,5765,5766,-5539]]},{"type":"Polygon","id":40035,"arcs":[[-5569,5767,5768,5769,5770,-5756,-5542]]},{"type":"Polygon","id":40147,"arcs":[[-5758,5771,5772,-5759,-5605,-5535]]},{"type":"Polygon","id":40053,"arcs":[[5773,5774,5775,-5537,-5460]]},{"type":"Polygon","id":40003,"arcs":[[-5538,-5776,5776,5777,-5764,-5469]]},{"type":"Polygon","id":40071,"arcs":[[-5763,5778,5779,-5774,-5459,-5457]]},{"type":"Polygon","id":40115,"arcs":[[-5736,5780,5781,-5768,-5568]]},{"type":"Polygon","id":40059,"arcs":[[-5540,-5767,5782,5783,5784,-5466]]},{"type":"Polygon","id":35039,"arcs":[[-5522,5785,5786,5787,5788,5789,5790,-5507]]},{"type":"Polygon","id":35045,"arcs":[[-5791,5791,5792,5793,-5330,-5332,-5508]]},{"type":"Polygon","id":4001,"arcs":[[-5794,5794,5795,5796,5797,5798,-5747,-4740]]},{"type":"Polygon","id":35059,"arcs":[[5799,5800,5801,5802,5803,5804,-5218,-5328]]},{"type":"Polygon","id":40025,"arcs":[[-5528,5805,5806,5807,-5800,-5327]]},{"type":"Polygon","id":40139,"arcs":[[5808,5809,5810,5811,-5806,-5527,-5530,-5532]]},{"type":"Polygon","id":40007,"arcs":[[-5467,-5785,5812,5813,5814,-5809,-5531,-5463]]},{"type":"Polygon","id":51175,"arcs":[[5815,-5680,5816,5817,5818,5819,5820,-5701,-5638,-5682]]},{"type":"Polygon","id":21231,"arcs":[[5821,5822,5823,5824,-5662,-5564]]},{"type":"Polygon","id":35055,"arcs":[[5825,5826,-5786,-5521,-5317]]},{"type":"Polygon","id":35007,"arcs":[[-5805,5827,5828,-5826,-5316,-5219]]},{"type":"Polygon","id":29209,"arcs":[[5829,5830,5831,-5615,-5708]]},{"type":"Polygon","id":6069,"arcs":[[-5334,-5393,5832,-5618,-5446]]},{"type":"Polygon","id":21235,"arcs":[[-5738,5833,5834,5835,5836,-5583]]},{"type":"MultiPolygon","id":51710,"arcs":[[[5837,5838,5839]],[[5840,5841]]]},{"type":"Polygon","id":21147,"arcs":[[-5837,5842,5843,-5822,-5563,-5584]]},{"type":"Polygon","id":51720,"arcs":[[-5657]]},{"type":"Polygon","id":21013,"arcs":[[-5588,-5744,5844,5845,-5834,-5737,-5560]]},{"type":"Polygon","id":21039,"arcs":[[-5650,5846,5847,-5723,-5645]]},{"type":"Polygon","id":21083,"arcs":[[-5722,5848,5849,5850,5851,-5847,-5649]]},{"type":"Polygon","id":21057,"arcs":[[5852,5853,5854,-5665,-5601,-5664]]},{"type":"Polygon","id":21003,"arcs":[[-5674,5855,5856,5857,5858,-5659]]},{"type":"Polygon","id":29009,"arcs":[[-5832,5859,5860,5861,-5734,-5616]]},{"type":"MultiPolygon","id":51810,"arcs":[[[5862,5863,5864]],[[5865,5866,5867,5868,5869,5870,5871,-5841,5872]]]},{"type":"Polygon","id":51035,"arcs":[[5873,5874,5875,5876,5877,-5709,-5635,-5694]]},{"type":"Polygon","id":51191,"arcs":[[5878,5879,5880,5881,-5685,-5746,5882,5883,5884,5885]]},{"type":"Polygon","id":29023,"arcs":[[-5697,5886,5887,5888,-5703,-5592]]},{"type":"MultiPolygon","id":51740,"arcs":[[[-5839,5889,5890]],[[5891,5892,5893]]]},{"type":"Polygon","id":51800,"arcs":[[-5893,5894,5895,5896,-5817,-5679,5897]]},{"type":"Polygon","id":6053,"arcs":[[-5833,-5392,5898,5899,5900,-5619]]},{"type":"Polygon","id":51081,"arcs":[[-5702,-5821,5901,-5739,-5623],[5902]]},{"type":"Polygon","id":51105,"arcs":[[5903,5904,5905,-5845,-5743,-5655]]},{"type":"Polygon","id":51117,"arcs":[[-5742,5906,5907,5908,-5727,-5631,-5699]]},{"type":"Polygon","id":21053,"arcs":[[-5825,5909,5910,-5853,-5663]]},{"type":"Polygon","id":29149,"arcs":[[-5705,5911,5912,5913,5914,-5731,-5504]]},{"type":"Polygon","id":51169,"arcs":[[-5686,-5882,5915,5916,5917,-5904,-5654]]},{"type":"Polygon","id":21213,"arcs":[[5918,5919,-5712,-5660,-5859]]},{"type":"Polygon","id":51141,"arcs":[[5920,5921,5922,-5874,-5693,-5643]]},{"type":"Polygon","id":29143,"arcs":[[-5726,5923,5924,5925,5926,5927,5928,-5695,-5628]]},{"type":"Polygon","id":51550,"arcs":[[5929,-5890,-5838,5930,-5871,5931,5932,-5895,-5892]]},{"type":"Polygon","id":51089,"arcs":[[5933,5934,-5921,-5642,-5692],[5935]]},{"type":"Polygon","id":32003,"arcs":[[5936,5937,-5476,-4238,-4614]]},{"type":"Polygon","id":21171,"arcs":[[-5855,5938,5939,-5856,-5673,-5666]]},{"type":"Polygon","id":29181,"arcs":[[-5889,5940,5941,-5912,-5704]]},{"type":"Polygon","id":29213,"arcs":[[-5719,5942,5943,5944,5945,-5830,-5707]]},{"type":"Polygon","id":40153,"arcs":[[5946,5947,5948,-5783,-5766]]},{"type":"Polygon","id":51077,"arcs":[[-5878,5949,-5876,5950,5951,5952,5953,-5883,-5745,-5710]]},{"type":"Polygon","id":29153,"arcs":[[-5733,5954,5955,5956,-5943,-5718]]},{"type":"Polygon","id":21105,"arcs":[[-5852,5957,5958,5959,-5724,-5848]]},{"type":"Polygon","id":29119,"arcs":[[-5862,5960,5961,-5781,-5735]]},{"type":"Polygon","id":21035,"arcs":[[-5755,5962,5963,-5849,-5721]]},{"type":"Polygon","id":6107,"arcs":[[5964,5965,-5390,-5479]]},{"type":"Polygon","id":51595,"arcs":[[-5903]]},{"type":"Polygon","id":51690,"arcs":[[-5936]]},{"type":"Polygon","id":51620,"arcs":[[-5816,-5681]]},{"type":"Polygon","id":51640,"arcs":[[-5950,-5877]]},{"type":"Polygon","id":47161,"arcs":[[-5677,5966,5967,5968,5969,-5963,-5754]]},{"type":"Polygon","id":40041,"arcs":[[-5962,5970,5971,5972,5973,-5769,-5782]]},{"type":"Polygon","id":47147,"arcs":[[5974,5975,5976,-5715,-5713,-5920,5977]]},{"type":"Polygon","id":47165,"arcs":[[5978,5979,5980,5981,-5978,-5919,-5858]]},{"type":"MultiPolygon","id":21075,"arcs":[[[5982,-5926]],[[5983,5984,-5924,-5725,-5960]]]},{"type":"Polygon","id":47125,"arcs":[[-5977,5985,5986,5987,-5967,-5676,-5716]]},{"type":"Polygon","id":51590,"arcs":[[5988,-5689]]},{"type":"Polygon","id":47111,"arcs":[[5989,5990,5991,-5979,-5857,-5940,5992]]},{"type":"MultiPolygon","id":51520,"arcs":[[[-5879]],[[-5886,5993,-5880]]]},{"type":"Polygon","id":29069,"arcs":[[-5929,5994,5995,5996,5997,5998,-5887,-5696]]},{"type":"Polygon","id":47137,"arcs":[[5999,6000,6001,6002,-5910,-5824]]},{"type":"Polygon","id":47027,"arcs":[[6003,6004,-5993,-5939,-5854,-5911,-6003]]},{"type":"Polygon","id":47163,"arcs":[[6005,6006,6007,-5916,-5881,-5994,-5885,6008]]},{"type":"Polygon","id":47091,"arcs":[[-5954,6009,6010,6011,6012,-6009,-5884]]},{"type":"Polygon","id":47151,"arcs":[[6013,6014,6015,6016,-6000,-5823,-5844]]},{"type":"Polygon","id":47025,"arcs":[[6017,6018,6019,6020,-5835,-5846,-5906]]},{"type":"Polygon","id":40103,"arcs":[[6021,6022,6023,6024,-5779,-5762]]},{"type":"Polygon","id":47067,"arcs":[[-5918,6025,6026,-6018,-5905]]},{"type":"Polygon","id":40131,"arcs":[[6027,6028,6029,-5772,-5757,-5771]]},{"type":"Polygon","id":47013,"arcs":[[6030,6031,-6014,-5843,-5836,-6021]]},{"type":"Polygon","id":47073,"arcs":[[-6008,6032,6033,6034,6035,-6026,-5917]]},{"type":"Polygon","id":40047,"arcs":[[-5780,-6025,6036,6037,6038,-5777,-5775]]},{"type":"Polygon","id":40045,"arcs":[[-5949,6039,6040,6041,6042,-5813,-5784]]},{"type":"Polygon","id":37009,"arcs":[[6043,6044,6045,-6010,-5953]]},{"type":"Polygon","id":47049,"arcs":[[-6017,6046,6047,6048,6049,-6001]]},{"type":"Polygon","id":37005,"arcs":[[6050,6051,-6044,-5952]]},{"type":"Polygon","id":40117,"arcs":[[6052,6053,6054,-6022,-5761]]},{"type":"Polygon","id":37171,"arcs":[[-5923,6055,6056,6057,6058,-6051,-5951,-5875]]},{"type":"Polygon","id":37073,"arcs":[[6059,6060,6061,6062,6063,6064,-5818,-5897]]},{"type":"MultiPolygon","id":37053,"arcs":[[[6065,6066,-5932,-5870,6067]],[[-5866,6068,6069,6070]],[[-6072,5863,-6073,5867]]]},{"type":"Polygon","id":37169,"arcs":[[-5935,6073,6074,-6056,-5922]]},{"type":"Polygon","id":37029,"arcs":[[-5896,-5933,-6067,6075,6076,-6060]]},{"type":"Polygon","id":37185,"arcs":[[6077,6078,6079,6080,-5907,-5741]]},{"type":"Polygon","id":37131,"arcs":[[6081,6082,-6078,-5740,-5902,-5820,6083]]},{"type":"Polygon","id":37091,"arcs":[[-6065,6084,6085,-6084,-5819]]},{"type":"Polygon","id":37145,"arcs":[[6086,6087,6088,6089,-5729]]},{"type":"Polygon","id":37181,"arcs":[[-6081,6090,6091,-5908]]},{"type":"Polygon","id":37077,"arcs":[[6092,6093,6094,-6087,-5728,-5909,-6092]]},{"type":"Polygon","id":37157,"arcs":[[-5691,6095,6096,6097,-6074,-5934]]},{"type":"Polygon","id":37033,"arcs":[[-6090,6098,6099,-6096,-5690,-5989,-5688,-5730]]},{"type":"Polygon","id":47133,"arcs":[[-6050,6100,6101,-6004,-6002]]},{"type":"Polygon","id":47087,"arcs":[[-6102,6102,6103,-5990,-6005]]},{"type":"Polygon","id":37083,"arcs":[[6104,6105,6106,6107,-6079,-6083]]},{"type":"Polygon","id":40097,"arcs":[[-5974,6108,6109,-6028,-5770]]},{"type":"Polygon","id":47019,"arcs":[[6110,6111,6112,6113,-6006,-6013]]},{"type":"Polygon","id":37139,"arcs":[[6114,6115,-6061,-6077]]},{"type":"Polygon","id":47131,"arcs":[[-5959,6116,6117,6118,6119,-5984]]},{"type":"Polygon","id":40093,"arcs":[[-5778,-6039,6120,6121,6122,-5947,-5765]]},{"type":"Polygon","id":47183,"arcs":[[6123,6124,6125,-6117,-5958,-5851]]},{"type":"Polygon","id":47095,"arcs":[[6126,6127,-5927,-5983,-5925,-5985,-6120]]},{"type":"Polygon","id":48421,"arcs":[[6128,6129,-5807,-5812,6130]]},{"type":"Polygon","id":47079,"arcs":[[-5970,6131,6132,-6124,-5850,-5964]]},{"type":"Polygon","id":48195,"arcs":[[6133,6134,-6131,-5811,6135]]},{"type":"Polygon","id":48111,"arcs":[[-5808,-6130,6136,-5801]]},{"type":"Polygon","id":48357,"arcs":[[6137,6138,-6136,-5810,-5815]]},{"type":"Polygon","id":48295,"arcs":[[6139,6140,-6138,-5814,-6043]]},{"type":"Polygon","id":5007,"arcs":[[-5861,6141,6142,6143,6144,-5971,-5961]]},{"type":"Polygon","id":5049,"arcs":[[6145,6146,6147,-5955,-5732,-5915]]},{"type":"Polygon","id":5015,"arcs":[[-5831,-5946,6148,6149,6150,-6142,-5860]]},{"type":"Polygon","id":5135,"arcs":[[-5914,6151,6152,6153,6154,-6146]]},{"type":"Polygon","id":5121,"arcs":[[6155,6156,-6152,-5913,-5942,6157]]},{"type":"Polygon","id":5009,"arcs":[[6158,6159,6160,-6149,-5945]]},{"type":"Polygon","id":5089,"arcs":[[6161,6162,-6159,-5944,-5957]]},{"type":"Polygon","id":5005,"arcs":[[-6148,6163,6164,6165,-6162,-5956]]},{"type":"Polygon","id":5021,"arcs":[[-5888,-5999,6166,-6158,-5941]]},{"type":"Polygon","id":6031,"arcs":[[6167,6168,-5899,-5391,-5966]]},{"type":"Polygon","id":47169,"arcs":[[-5992,6169,6170,-5980]]},{"type":"Polygon","id":47021,"arcs":[[6171,6172,6173,-5986,-5976],[6174]]},{"type":"Polygon","id":47179,"arcs":[[-6114,6175,6176,-6033,-6007]]},{"type":"Polygon","id":37193,"arcs":[[-6059,6177,6178,6179,6180,6181,-6045,-6052]]},{"type":"Polygon","id":47173,"arcs":[[6182,6183,6184,-6031,-6020]]},{"type":"Polygon","id":47159,"arcs":[[-6104,6185,6186,6187,-6170,-5991]]},{"type":"Polygon","id":29155,"arcs":[[-6128,6188,6189,-5995,-5928]]},{"type":"Polygon","id":40143,"arcs":[[-6030,6190,6191,6192,-6053,-5760,-5773]]},{"type":"Polygon","id":47057,"arcs":[[-6027,-6036,6193,6194,6195,-6183,-6019]]},{"type":"Polygon","id":47037,"arcs":[[-5982,6196,6197,6198,-6172,-5975]]},{"type":"Polygon","id":47059,"arcs":[[6199,6200,6201,6202,-6034,-6177]]},{"type":"Polygon","id":37189,"arcs":[[-6182,6203,6204,-6011,-6046]]},{"type":"Polygon","id":37143,"arcs":[[6205,6206,-6062,-6116]]},{"type":"Polygon","id":47129,"arcs":[[-6016,6207,6208,6209,-6047]]},{"type":"Polygon","id":47083,"arcs":[[-5988,6210,6211,6212,-5968]]},{"type":"Polygon","id":47005,"arcs":[[-6213,6213,6214,6215,6216,-6132,-5969]]},{"type":"Polygon","id":47189,"arcs":[[-6171,-6188,6217,6218,6219,-6197,-5981]]},{"type":"MultiPolygon","id":37041,"arcs":[[[6220,-6063,-6207]]]},{"type":"Polygon","id":47063,"arcs":[[-6203,6221,6222,-6194,-6035]]},{"type":"MultiPolygon","id":47043,"arcs":[[[-6175]],[[-6174,6223,6224,6225,-6211,-5987]]]},{"type":"Polygon","id":5087,"arcs":[[6226,6227,6228,6229,6230,-6143,-6151]]},{"type":"Polygon","id":47141,"arcs":[[-6049,6231,6232,6233,-6186,-6103,-6101]]},{"type":"Polygon","id":47001,"arcs":[[-6185,6234,6235,-6208,-6015,-6032]]},{"type":"Polygon","id":37197,"arcs":[[6236,6237,6238,-6178,-6058]]},{"type":"Polygon","id":37011,"arcs":[[6239,6240,6241,6242,-6111,-6012,-6205]]},{"type":"Polygon","id":37069,"arcs":[[6243,6244,-6093,-6091,-6080]]},{"type":"Polygon","id":5055,"arcs":[[-5998,6245,6246,-6156,-6167]]},{"type":"Polygon","id":35033,"arcs":[[-5829,6247,6248,6249,-5787,-5827]]},{"type":"Polygon","id":37067,"arcs":[[6250,6251,6252,-6237,-6057,-6075]]},{"type":"Polygon","id":5065,"arcs":[[-6155,6253,6254,-6164,-6147]]},{"type":"Polygon","id":47171,"arcs":[[6255,6256,6257,-6200,-6176,-6113]]},{"type":"Polygon","id":5075,"arcs":[[-6247,6258,6259,6260,-6153,-6157]]},{"type":"Polygon","id":37081,"arcs":[[6261,6262,6263,-6251,-6098]]},{"type":"Polygon","id":37001,"arcs":[[6264,6265,6266,-6262,-6097,-6100]]},{"type":"Polygon","id":40119,"arcs":[[6267,6268,6269,-6023,-6055]]},{"type":"Polygon","id":47085,"arcs":[[-6226,6270,6271,-6214,-6212]]},{"type":"Polygon","id":37015,"arcs":[[6272,6273,6274,-6105,-6082,-6086]]},{"type":"Polygon","id":37135,"arcs":[[-6089,6275,6276,-6265,-6099]]},{"type":"Polygon","id":37063,"arcs":[[-6095,6277,6278,-6276,-6088]]},{"type":"Polygon","id":5143,"arcs":[[6279,6280,-6144,-6231]]},{"type":"MultiPolygon","id":37055,"arcs":[[[6281,6282,6283]],[[6284,6285]],[[-6070,6286]]]},{"type":"Polygon","id":47053,"arcs":[[6287,6288,6289,6290,-6118,-6126]]},{"type":"MultiPolygon","id":35043,"arcs":[[[6291,6292]],[[6293,6294,6295,6296,6297,-5792,-5790]]]},{"type":"Polygon","id":35021,"arcs":[[-5804,6298,6299,-6248,-5828]]},{"type":"Polygon","id":47045,"arcs":[[6300,6301,6302,-6189,-6127,-6119,-6291]]},{"type":"Polygon","id":37127,"arcs":[[-6108,6303,6304,6305,-6244]]},{"type":"Polygon","id":47089,"arcs":[[-6223,6306,6307,6308,-6195]]},{"type":"Polygon","id":47093,"arcs":[[-6309,6309,6310,6311,6312,-6235,-6184,-6196]]},{"type":"Polygon","id":47029,"arcs":[[6313,6314,6315,-6307,-6222,-6202]]},{"type":"Polygon","id":47035,"arcs":[[-6210,6316,6317,6318,6319,6320,6321,6322,-6232,-6048]]},{"type":"Polygon","id":40073,"arcs":[[6323,6324,6325,-6121,-6038]]},{"type":"Polygon","id":40083,"arcs":[[-6024,-6270,6326,6327,-6324,-6037]]},{"type":"Polygon","id":40011,"arcs":[[-6326,6328,6329,6330,6331,-6122]]},{"type":"Polygon","id":40043,"arcs":[[6332,6333,-6040,-5948,-6123,-6332]]},{"type":"Polygon","id":40037,"arcs":[[-6193,6334,6335,6336,-6268,-6054]]},{"type":"Polygon","id":40145,"arcs":[[-6110,6337,6338,6339,-6191,-6029]]},{"type":"Polygon","id":40021,"arcs":[[-5973,6340,6341,6342,-6338,-6109]]},{"type":"Polygon","id":40001,"arcs":[[-6145,-6281,6343,6344,-6341,-5972]]},{"type":"Polygon","id":37121,"arcs":[[-6243,6345,6346,-6256,-6112]]},{"type":"Polygon","id":37065,"arcs":[[6347,6348,6349,-6304,-6107]]},{"type":"Polygon","id":47017,"arcs":[[-6217,6350,6351,6352,-6288,-6125,-6133]]},{"type":"Polygon","id":47041,"arcs":[[6353,6354,6355,-6218,-6187,-6234]]},{"type":"Polygon","id":5137,"arcs":[[6356,6357,6358,6359,-6165,-6255]]},{"type":"Polygon","id":5101,"arcs":[[-6161,6360,6361,6362,-6227,-6150]]},{"type":"Polygon","id":37027,"arcs":[[-6181,6363,6364,6365,-6240,-6204]]},{"type":"Polygon","id":5129,"arcs":[[-6166,-6360,6366,6367,-6361,-6160,-6163]]},{"type":"Polygon","id":47149,"arcs":[[6368,6369,6370,6371,6372,-6198,-6220]]},{"type":"Polygon","id":37199,"arcs":[[6373,6374,6375,-6257,-6347]]},{"type":"MultiPolygon","id":47185,"arcs":[[[6376,-6321]],[[-6323,6377,6378,-6354,-6233]]]},{"type":"Polygon","id":37183,"arcs":[[-6245,6379,6380,6381,-6278,-6094]]},{"type":"Polygon","id":37117,"arcs":[[6382,6383,6384,-6348,-6106,-6275]]},{"type":"Polygon","id":37115,"arcs":[[-6258,-6376,6385,6386,-6314,-6201]]},{"type":"Polygon","id":37059,"arcs":[[6387,6388,6389,-6238,-6253]]},{"type":"Polygon","id":48393,"arcs":[[-6141,6390,6391,6392,6393,-6134,-6139]]},{"type":"Polygon","id":48211,"arcs":[[-6140,-6042,6394,6395,-6391]]},{"type":"Polygon","id":48233,"arcs":[[-6135,-6394,6396,6397]]},{"type":"Polygon","id":48205,"arcs":[[6398,6399,6400,-5802,-6137]]},{"type":"Polygon","id":37097,"arcs":[[-6239,-6390,6401,6402,6403,6404,6405,6406,-6179]]},{"type":"Polygon","id":48341,"arcs":[[-6398,6407,6408,6409,-6399,-6129]]},{"type":"Polygon","id":47187,"arcs":[[-6373,6410,6411,6412,-6224,-6173,-6199]]},{"type":"Polygon","id":37003,"arcs":[[6413,-6364,-6180,-6407]]},{"type":"Polygon","id":47145,"arcs":[[6414,6415,6416,6417,6418,-6317,-6209,-6236,-6313,6419]]},{"type":"Polygon","id":47155,"arcs":[[-6316,6420,6421,6422,-6310,-6308]]},{"type":"Polygon","id":37057,"arcs":[[-6264,6423,6424,6425,-6388,-6252]]},{"type":"Polygon","id":40129,"arcs":[[-6334,6426,6427,6428,-6395,-6041]]},{"type":"Polygon","id":35031,"arcs":[[-6298,6429,-5795,-5793]]},{"type":"Polygon","id":35049,"arcs":[[-6250,6430,6431,6432,-6295,6433,-6293,6434,-5788]]},{"type":"Polygon","id":5093,"arcs":[[6435,6436,6437,6438,6439,6440,6441,-5996,-6190,-6303]]},{"type":"Polygon","id":37023,"arcs":[[-6366,6442,6443,6444,6445,6446,-6241]]},{"type":"Polygon","id":47033,"arcs":[[6447,6448,6449,-6301,-6290]]},{"type":"Polygon","id":5031,"arcs":[[-6442,6450,6451,-6259,-6246,-5997]]},{"type":"Polygon","id":37177,"arcs":[[6452,6453,6454]]},{"type":"Polygon","id":47081,"arcs":[[-6413,6455,6456,6457,-6271,-6225]]},{"type":"Polygon","id":37187,"arcs":[[-6454,6458,6459,-6383,-6274,6460]]},{"type":"Polygon","id":35028,"arcs":[[-5789,-6435,-6292,-6434,-6294]]},{"type":"Polygon","id":47015,"arcs":[[6461,6462,-6369,-6219,-6356]]},{"type":"Polygon","id":37111,"arcs":[[6463,6464,-6374,-6346,-6242,-6447]]},{"type":"Polygon","id":47097,"arcs":[[-6450,6465,6466,-6436,-6302]]},{"type":"Polygon","id":40081,"arcs":[[-6337,6467,6468,6469,-6327,-6269]]},{"type":"Polygon","id":5063,"arcs":[[-6261,6470,6471,6472,-6357,-6254,-6154]]},{"type":"Polygon","id":37151,"arcs":[[-6267,6473,6474,6475,-6424,-6263]]},{"type":"MultiPolygon","id":47105,"arcs":[[[6476,6477]],[[-6415]],[[-6420,-6312,6478,6479,6480,-6416]]]},{"type":"Polygon","id":5067,"arcs":[[-6260,-6452,6481,6482,6483,6484,-6471]]},{"type":"Polygon","id":47009,"arcs":[[6485,6486,6487,-6479,-6311,-6423]]},{"type":"Polygon","id":37037,"arcs":[[-6279,-6382,6488,6489,6490,-6474,-6266,-6277]]},{"type":"Polygon","id":35047,"arcs":[[-6300,6491,6492,6493,-6431,-6249]]},{"type":"Polygon","id":37195,"arcs":[[6494,6495,6496,6497,-6305,-6350]]},{"type":"Polygon","id":37159,"arcs":[[-6426,6498,6499,-6402,-6389]]},{"type":"Polygon","id":40111,"arcs":[[-6192,-6340,6500,6501,6502,-6335]]},{"type":"Polygon","id":40101,"arcs":[[-6343,6503,6504,6505,-6501,-6339]]},{"type":"Polygon","id":47177,"arcs":[[-6379,6506,6507,6508,6509,-6462,-6355]]},{"type":"Polygon","id":47119,"arcs":[[6510,6511,6512,6513,-6456,-6412]]},{"type":"Polygon","id":47039,"arcs":[[6514,6515,6516,6517,-6351,-6216]]},{"type":"Polygon","id":47135,"arcs":[[-6458,6518,6519,-6515,-6215,-6272]]},{"type":"Polygon","id":37147,"arcs":[[-6385,6520,6521,6522,6523,6524,6525,-6495,-6349]]},{"type":"Polygon","id":37035,"arcs":[[-6406,6526,-6443,-6365,-6414]]},{"type":"Polygon","id":37021,"arcs":[[-6465,6527,6528,6529,-6386,-6375]]},{"type":"Polygon","id":47143,"arcs":[[6530,6531,6532,-6318,-6419]]},{"type":"Polygon","id":47175,"arcs":[[-6322,-6377,-6320,6533,6534,-6507,-6378]]},{"type":"Polygon","id":47077,"arcs":[[-6518,6535,6536,6537,-6352]]},{"type":"Polygon","id":47075,"arcs":[[6538,6539,6540,6541,-6466,-6449]]},{"type":"Polygon","id":37101,"arcs":[[-6498,6542,6543,6544,-6380,-6306]]},{"type":"Polygon","id":40039,"arcs":[[-6331,6545,6546,6547,-6427,-6333]]},{"type":"Polygon","id":6071,"arcs":[[6548,6549,6550,6551,6552,6553,-5477,-5938]]},{"type":"Polygon","id":6079,"arcs":[[-6169,6554,6555,6556,-5900]]},{"type":"Polygon","id":6029,"arcs":[[-6554,6557,6558,6559,-6555,-6168,-5965,-5478]]},{"type":"Polygon","id":47113,"arcs":[[-6353,-6538,6560,6561,-6539,-6448,-6289]]},{"type":"Polygon","id":5141,"arcs":[[-6359,6562,6563,6564,6565,-6367]]},{"type":"Polygon","id":37087,"arcs":[[-6530,6566,6567,6568,-6421,-6315,-6387]]},{"type":"Polygon","id":5047,"arcs":[[6569,6570,6571,-6229,6572]]},{"type":"Polygon","id":47007,"arcs":[[-6533,6573,6574,-6534,-6319]]},{"type":"Polygon","id":5071,"arcs":[[-6228,-6363,6575,6576,-6573]]},{"type":"Polygon","id":5033,"arcs":[[6577,6578,-6344,-6280,-6230,-6572]]},{"type":"Polygon","id":47121,"arcs":[[6579,6580,6581,-6531,-6418]]},{"type":"Polygon","id":35037,"arcs":[[-6401,6582,6583,6584,6585,6586,6587,-6492,-6299,-5803]]},{"type":"MultiPolygon","id":37013,"arcs":[[[6588,6589,6590,-6523]],[[-6460,6591,6592,-6521,-6384]]]},{"type":"Polygon","id":5115,"arcs":[[-6368,-6566,6593,6594,6595,-6576,-6362]]},{"type":"Polygon","id":40017,"arcs":[[6596,6597,6598,6599,6600,-6329,-6325]]},{"type":"Polygon","id":40109,"arcs":[[-6470,6601,6602,-6597,-6328]]},{"type":"Polygon","id":5023,"arcs":[[-6473,6603,6604,-6563,-6358]]},{"type":"Polygon","id":47117,"arcs":[[6605,6606,6607,-6511,-6411,-6372]]},{"type":"Polygon","id":5111,"arcs":[[-6441,6608,6609,-6482,-6451]]},{"type":"MultiPolygon","id":37095,"arcs":[[[-6283,6610]],[[-6453,6611,-6285,6612,-6592,-6459]]]},{"type":"Polygon","id":47031,"arcs":[[-6463,-6510,6613,6614,6615,6616,-6370]]},{"type":"Polygon","id":47003,"arcs":[[-6617,6617,6618,-6606,-6371]]},{"type":"Polygon","id":37173,"arcs":[[6619,6620,6621,-6486,-6422,-6569]]},{"type":"Polygon","id":47123,"arcs":[[-6488,6622,6623,6624,6625,-6478,6626,-6480]]},{"type":"Polygon","id":47101,"arcs":[[-6514,6627,6628,-6519,-6457]]},{"type":"Polygon","id":37079,"arcs":[[6629,6630,-6496,-6526]]},{"type":"MultiPolygon","id":47167,"arcs":[[[6631,6632,-6439]],[[-6542,6633,6634,-6437,-6467]]]},{"type":"Polygon","id":47107,"arcs":[[-6481,-6627,-6477,-6626,6635,6636,-6580,-6417]]},{"type":"Polygon","id":40135,"arcs":[[-6345,-6579,6637,6638,6639,-6504,-6342]]},{"type":"Polygon","id":40107,"arcs":[[-6503,6640,6641,6642,6643,-6468,-6336]]},{"type":"Polygon","id":37105,"arcs":[[6644,6645,-6490]]},{"type":"Polygon","id":48359,"arcs":[[-6410,6646,6647,-6583,-6400]]},{"type":"Polygon","id":48065,"arcs":[[-6393,6648,6649,6650,-6408,-6397]]},{"type":"Polygon","id":48179,"arcs":[[6651,6652,-6649,-6392]]},{"type":"Polygon","id":48483,"arcs":[[-6429,6653,6654,-6652,-6396]]},{"type":"Polygon","id":48375,"arcs":[[-6651,6655,-6647,-6409]]},{"type":"Polygon","id":37161,"arcs":[[6656,6657,6658,6659,6660,-6528,-6464,-6446]]},{"type":"Polygon","id":37191,"arcs":[[-6631,6661,6662,6663,-6543,-6497]]},{"type":"Polygon","id":47023,"arcs":[[6664,6665,6666,-6561,-6537]]},{"type":"Polygon","id":37085,"arcs":[[-6545,6667,6668,6669,-6645,-6489,-6381]]},{"type":"Polygon","id":37045,"arcs":[[6670,6671,6672,6673,-6657,-6445]]},{"type":"Polygon","id":37109,"arcs":[[-6405,6674,6675,-6671,-6444,-6527]]},{"type":"Polygon","id":47153,"arcs":[[6676,6677,6678,-6508,-6535,-6575]]},{"type":"Polygon","id":40091,"arcs":[[6679,6680,6681,-6641,-6502,-6506]]},{"type":"Polygon","id":40015,"arcs":[[-6601,6682,6683,6684,6685,-6546,-6330]]},{"type":"Polygon","id":5145,"arcs":[[-6485,6686,6687,6688,6689,-6604,-6472]]},{"type":"Polygon","id":47061,"arcs":[[6690,6691,-6614,-6509,-6679]]},{"type":"Polygon","id":4025,"arcs":[[6692,6693,6694,6695,-5752]]},{"type":"Polygon","id":37099,"arcs":[[-6568,6696,6697,6698,6699,-6620]]},{"type":"Polygon","id":37119,"arcs":[[6700,6701,6702,6703,6704,-6675,-6404]]},{"type":"Polygon","id":37125,"arcs":[[-6646,-6670,6705,6706,6707,6708,-6475,-6491]]},{"type":"Polygon","id":37123,"arcs":[[-6709,6709,6710,-6425,-6476]]},{"type":"Polygon","id":37025,"arcs":[[6711,6712,-6701,-6403,-6500]]},{"type":"Polygon","id":40009,"arcs":[[-6548,6713,6714,6715,6716,6717,-6654,-6428]]},{"type":"Polygon","id":37167,"arcs":[[-6711,6718,6719,-6712,-6499]]},{"type":"Polygon","id":37089,"arcs":[[-6661,6720,6721,6722,-6529]]},{"type":"Polygon","id":47181,"arcs":[[6723,6724,6725,-6516,-6520,-6629]]},{"type":"Polygon","id":40133,"arcs":[[6726,6727,6728,-6643]]},{"type":"Polygon","id":37075,"arcs":[[6729,6730,-6623,-6487,-6622]]},{"type":"Polygon","id":40149,"arcs":[[-6686,6731,-6714,-6547]]},{"type":"Polygon","id":40125,"arcs":[[-6644,-6729,6732,6733,6734,-6602,-6469]]},{"type":"Polygon","id":5029,"arcs":[[6735,6736,6737,-6594,-6565]]},{"type":"Polygon","id":47099,"arcs":[[-6513,6738,6739,-6724,-6628]]},{"type":"Polygon","id":40061,"arcs":[[6740,6741,6742,-6680,-6505,-6640]]},{"type":"Polygon","id":47065,"arcs":[[-6582,6743,6744,6745,6746,6747,-6677,-6574,-6532]]},{"type":"Polygon","id":47055,"arcs":[[-6608,6748,6749,6750,-6739,-6512]]},{"type":"Polygon","id":5131,"arcs":[[-6571,6751,6752,6753,-6638,-6578]]},{"type":"Polygon","id":5037,"arcs":[[6754,6755,6756,-6483,-6610]]},{"type":"Polygon","id":5147,"arcs":[[-6757,6757,6758,6759,-6687,-6484]]},{"type":"Polygon","id":5035,"arcs":[[-6440,-6633,6760,6761,6762,6763,6764,-6755,-6609]]},{"type":"Polygon","id":47069,"arcs":[[-6562,-6667,6765,6766,6767,6768,6769,-6540]]},{"type":"Polygon","id":37107,"arcs":[[6770,6771,6772,-6662,-6630,-6525]]},{"type":"Polygon","id":5083,"arcs":[[-6577,-6596,6773,6774,-6752,-6570]]},{"type":"Polygon","id":37175,"arcs":[[6775,6776,6777,-6697,-6567,-6723]]},{"type":"Polygon","id":47071,"arcs":[[-6726,6778,6779,6780,6781,-6665,-6536,-6517]]},{"type":"Polygon","id":37071,"arcs":[[-6705,6782,-6672,-6676]]},{"type":"MultiPolygon","id":37049,"arcs":[[[6783,6784,6785]],[[-6591,6786,6787,6788,-6771,-6524]]]},{"type":"Polygon","id":47127,"arcs":[[6789,6790,-6618,-6616]]},{"type":"Polygon","id":47157,"arcs":[[6791,6792,6793,-6761,-6632,-6438,-6635]]},{"type":"Polygon","id":37149,"arcs":[[6794,6795,-6721,-6660]]},{"type":"Polygon","id":47047,"arcs":[[-6770,6796,6797,-6792,-6634,-6541]]},{"type":"Polygon","id":47109,"arcs":[[-6782,6798,-6766,-6666]]},{"type":"Polygon","id":40079,"arcs":[[6799,6800,6801,6802,6803,-6741,-6639,-6754]]},{"type":"Polygon","id":40051,"arcs":[[6804,6805,6806,6807,-6683,-6600]]},{"type":"Polygon","id":40027,"arcs":[[-6735,6808,-6598,-6603]]},{"type":"Polygon","id":47103,"arcs":[[-6791,6809,6810,6811,-6749,-6607,-6619]]},{"type":"Polygon","id":5045,"arcs":[[-6605,-6690,6812,6813,6814,-6736,-6564]]},{"type":"Polygon","id":47051,"arcs":[[-6692,6815,6816,6817,-6810,-6790,-6615]]},{"type":"Polygon","id":47011,"arcs":[[6818,6819,6820,-6744,-6581,-6637]]},{"type":"Polygon","id":35006,"arcs":[[-6297,6821,6822,6823,6824,-5796,-6430]]},{"type":"Polygon","id":40087,"arcs":[[-6734,6825,6826,-6805,-6599,-6809]]},{"type":"Polygon","id":37113,"arcs":[[6827,6828,6829,-6730,-6621,-6700]]},{"type":"MultiPolygon","id":37137,"arcs":[[[-6787,-6590,6830]]]},{"type":"Polygon","id":47115,"arcs":[[-6748,6831,6832,-6816,-6691,-6678]]},{"type":"Polygon","id":37163,"arcs":[[-6664,6833,6834,6835,6836,-6668,-6544]]},{"type":"Polygon","id":5149,"arcs":[[-6738,6837,6838,6839,6840,-6774,-6595]]},{"type":"Polygon","id":40121,"arcs":[[-6743,6841,6842,6843,6844,6845,-6681]]},{"type":"Polygon","id":37039,"arcs":[[-6830,6846,6847,6848,6849,-6624,-6731]]},{"type":"Polygon","id":40063,"arcs":[[-6682,-6846,6850,6851,-6727,-6642]]},{"type":"Polygon","id":47139,"arcs":[[-6850,6852,6853,-6819,-6636,-6625]]},{"type":"Polygon","id":37051,"arcs":[[-6837,6854,6855,6856,-6706,-6669]]},{"type":"Polygon","id":37103,"arcs":[[6857,-6785,6858,6859,6860,-6772,-6789]]},{"type":"Polygon","id":35001,"arcs":[[-6433,6861,6862,-6822,-6296]]},{"type":"Polygon","id":35019,"arcs":[[-6588,6863,6864,6865,-6493]]},{"type":"Polygon","id":45045,"arcs":[[-6796,6866,6867,6868,6869,-6776,-6722]]},{"type":"Polygon","id":37007,"arcs":[[6870,6871,6872,6873,-6719]]},{"type":"Polygon","id":37093,"arcs":[[-6857,6874,6875,-6707]]},{"type":"Polygon","id":37179,"arcs":[[-6874,6876,6877,-6702,-6713,-6720]]},{"type":"Polygon","id":45083,"arcs":[[6878,6879,-6867,-6795,-6659,6880]]},{"type":"Polygon","id":37061,"arcs":[[-6773,-6861,6881,6882,-6834,-6663]]},{"type":"Polygon","id":48117,"arcs":[[6883,6884,6885,6886,-6584,-6648]]},{"type":"Polygon","id":45021,"arcs":[[6887,-6881,-6658,-6674,6888]]},{"type":"Polygon","id":48129,"arcs":[[6889,6890,6891,6892,-6653]]},{"type":"Polygon","id":48087,"arcs":[[-6718,6893,6894,6895,-6890,-6655]]},{"type":"Polygon","id":48381,"arcs":[[6896,6897,6898,-6884,-6656]]},{"type":"Polygon","id":37153,"arcs":[[-6708,6899,6900,-6871,-6710]]},{"type":"Polygon","id":48011,"arcs":[[-6893,6901,6902,-6897,-6650]]},{"type":"Polygon","id":45091,"arcs":[[6903,6904,6905,-6889,-6673,-6783,-6704]]},{"type":"Polygon","id":37043,"arcs":[[-6829,6906,6907,6908,-6847]]},{"type":"Polygon","id":5123,"arcs":[[-6765,6909,6910,-6758,-6756]]},{"type":"Polygon","id":40075,"arcs":[[-6685,6911,6912,6913,6914,-6715,-6732]]},{"type":"MultiPolygon","id":37031,"arcs":[[[6915,-6859,-6784,6916]]]},{"type":"Polygon","id":40055,"arcs":[[-6915,6917,6918,-6716]]},{"type":"MultiPolygon","id":6083,"arcs":[[[6919]],[[6920]],[[-6560,6921,6922,-6556]]]},{"type":"Polygon","id":5105,"arcs":[[6923,6924,6925,-6838,-6737,-6815]]},{"type":"Polygon","id":5127,"arcs":[[-6841,6926,6927,-6800,-6753,-6775]]},{"type":"Polygon","id":5117,"arcs":[[-6760,6928,6929,6930,-6688]]},{"type":"Polygon","id":45077,"arcs":[[-6870,6931,6932,-6777]]},{"type":"Polygon","id":5085,"arcs":[[-6931,6933,6934,6935,-6813,-6689]]},{"type":"Polygon","id":45057,"arcs":[[-6878,6936,6937,6938,6939,-6904,-6703]]},{"type":"Polygon","id":40077,"arcs":[[-6804,6940,-6842,-6742]]},{"type":"Polygon","id":45073,"arcs":[[6941,6942,6943,6944,6945,6946,-6698,-6778,-6933]]},{"type":"Polygon","id":35057,"arcs":[[-6866,6947,6948,6949,-6862,-6432,-6494]]},{"type":"Polygon","id":37165,"arcs":[[6950,6951,-6900,-6876]]},{"type":"Polygon","id":40057,"arcs":[[-6919,6952,6953,6954,-6894,-6717]]},{"type":"Polygon","id":5119,"arcs":[[-6936,6955,6956,6957,-6924,-6814]]},{"type":"Polygon","id":1077,"arcs":[[6958,6959,6960,-6779,-6725,-6740,-6751,6961]]},{"type":"Polygon","id":5095,"arcs":[[-6911,6962,6963,6964,-6929,-6759]]},{"type":"Polygon","id":13241,"arcs":[[6965,6966,-6907,-6828,-6699,-6947]]},{"type":"Polygon","id":1083,"arcs":[[-6812,6967,6968,6969,-6962,-6750]]},{"type":"Polygon","id":28003,"arcs":[[6970,6971,-6767,-6799,-6781,6972]]},{"type":"Polygon","id":28141,"arcs":[[6973,6974,6975,-6973,-6780,-6961,6976]]},{"type":"Polygon","id":28139,"arcs":[[6977,6978,6979,-6768,-6972]]},{"type":"Polygon","id":28033,"arcs":[[6980,6981,-6762,-6794,6982]]},{"type":"Polygon","id":28009,"arcs":[[6983,6984,-6797,-6769,-6980]]},{"type":"Polygon","id":28093,"arcs":[[6985,6986,6987,-6983,-6793,-6798,-6985]]},{"type":"Polygon","id":13281,"arcs":[[-6967,6988,6989,6990,-6908]]},{"type":"Polygon","id":1089,"arcs":[[-6818,6991,6992,6993,-6968,-6811]]},{"type":"Polygon","id":1071,"arcs":[[6994,6995,-6992,-6817,-6833,6996]]},{"type":"Polygon","id":13213,"arcs":[[6997,6998,6999,-6820,-6854,7000]]},{"type":"Polygon","id":13111,"arcs":[[-6849,7001,7002,7003,7004,-7001,-6853]]},{"type":"Polygon","id":13313,"arcs":[[7005,7006,7007,-6821,-7000]]},{"type":"Polygon","id":13047,"arcs":[[7008,-6745,-7008]]},{"type":"Polygon","id":13291,"arcs":[[-6909,-6991,7009,7010,-7002,-6848]]},{"type":"MultiPolygon","id":37133,"arcs":[[[-6916,7011,7012,-6882,-6860]]]},{"type":"Polygon","id":13083,"arcs":[[-6832,-6747,7013,7014,-6997]]},{"type":"Polygon","id":13295,"arcs":[[-7007,7015,7016,7017,7018,-7014,-6746,-7009]]},{"type":"Polygon","id":40123,"arcs":[[-6728,-6852,7019,7020,7021,7022,-6826,-6733]]},{"type":"Polygon","id":35061,"arcs":[[-6863,-6950,7023,-6823]]},{"type":"Polygon","id":37155,"arcs":[[7024,7025,7026,7027,7028,-6951,-6875,-6856]]},{"type":"Polygon","id":35009,"arcs":[[-6887,7029,7030,7031,-6585]]},{"type":"Polygon","id":45087,"arcs":[[-6906,7032,7033,7034,7035,-6879,-6888]]},{"type":"Polygon","id":5077,"arcs":[[-6764,7036,7037,-6963,-6910]]},{"type":"Polygon","id":1033,"arcs":[[7038,7039,-6977,-6960]]},{"type":"MultiPolygon","id":6111,"arcs":[[[7040]],[[7041,-6922,-6559,7042]]]},{"type":"Polygon","id":28143,"arcs":[[-6763,-6982,7043,7044,7045,7046,7047,-7037]]},{"type":"Polygon","id":1049,"arcs":[[-7019,7048,7049,7050,7051,-6995,-7015]]},{"type":"Polygon","id":37017,"arcs":[[7052,7053,-7025,-6855,-6836]]},{"type":"Polygon","id":40065,"arcs":[[7054,7055,7056,-6953,-6918,-6914]]},{"type":"Polygon","id":5125,"arcs":[[-6958,7057,7058,7059,-6925]]},{"type":"Polygon","id":40031,"arcs":[[-6684,-6808,7060,7061,7062,-6912]]},{"type":"Polygon","id":40049,"arcs":[[-7023,7063,7064,7065,-6806,-6827]]},{"type":"Polygon","id":13123,"arcs":[[7066,7067,7068,-6998,-7005]]},{"type":"Polygon","id":13137,"arcs":[[-6946,7069,7070,7071,7072,-6989,-6966]]},{"type":"MultiPolygon","id":6037,"arcs":[[[7073]],[[7074]],[[-6553,7075,7076,-7043,-6558]]]},{"type":"Polygon","id":45023,"arcs":[[-6940,7077,-7033,-6905]]},{"type":"Polygon","id":45007,"arcs":[[7078,7079,7080,-6942,-6932,-6869]]},{"type":"Polygon","id":45025,"arcs":[[7081,7082,-6937,-6877,-6873,7083]]},{"type":"Polygon","id":45069,"arcs":[[-7029,7084,7085,7086,-7084,-6872,-6901,-6952]]},{"type":"Polygon","id":1079,"arcs":[[-6970,7087,7088,7089,7090,-7039,-6959]]},{"type":"Polygon","id":13311,"arcs":[[7091,7092,-7010,-6990,-7073]]},{"type":"Polygon","id":45059,"arcs":[[-7036,7093,7094,7095,-6868,-6880]]},{"type":"Polygon","id":35011,"arcs":[[7096,7097,7098,-6864,-6587]]},{"type":"Polygon","id":28137,"arcs":[[-6988,7099,7100,-7044,-6981]]},{"type":"Polygon","id":5051,"arcs":[[-7060,7101,7102,-6839,-6926]]},{"type":"Polygon","id":40029,"arcs":[[-6845,7103,7104,-7020,-6851]]},{"type":"Polygon","id":28117,"arcs":[[-6976,7105,7106,7107,-6978,-6971]]},{"type":"Polygon","id":48437,"arcs":[[-6903,7108,7109,7110,7111,-6898]]},{"type":"Polygon","id":48045,"arcs":[[-6892,7112,7113,7114,-7109,-6902]]},{"type":"Polygon","id":48069,"arcs":[[-7112,7115,7116,7117,-6885,-6899]]},{"type":"Polygon","id":48191,"arcs":[[-6896,7118,7119,7120,-7113,-6891]]},{"type":"Polygon","id":48075,"arcs":[[-6955,7121,7122,-7119,-6895]]},{"type":"Polygon","id":5097,"arcs":[[-7103,7123,7124,7125,7126,-6927,-6840]]},{"type":"Polygon","id":48369,"arcs":[[-7118,7127,7128,-7030,-6886]]},{"type":"Polygon","id":13187,"arcs":[[-7093,7129,7130,-7003,-7011]]},{"type":"MultiPolygon","id":37141,"arcs":[[[7131,7132]],[[-7013,7133,7134,7135,7136,-7053,-6835,-6883]]]},{"type":"Polygon","id":5113,"arcs":[[7137,7138,7139,-6801,-6928,-7127]]},{"type":"Polygon","id":1103,"arcs":[[-6994,7140,7141,-7088,-6969]]},{"type":"Polygon","id":13257,"arcs":[[7142,7143,-7070,-6945]]},{"type":"Polygon","id":40137,"arcs":[[-7066,7144,7145,7146,-7061,-6807]]},{"type":"Polygon","id":40005,"arcs":[[7147,7148,7149,7150,-7104,-6844]]},{"type":"Polygon","id":40127,"arcs":[[-6803,7151,7152,-7148,-6843,-6941]]},{"type":"Polygon","id":5107,"arcs":[[-7048,7153,7154,7155,7156,-6964,-7038]]},{"type":"Polygon","id":40099,"arcs":[[-7022,7157,7158,-7064]]},{"type":"Polygon","id":40141,"arcs":[[-7063,7159,7160,7161,-7055,-6913]]},{"type":"Polygon","id":13129,"arcs":[[-7069,7162,7163,7164,-7016,-7006,-6999]]},{"type":"Polygon","id":45033,"arcs":[[7165,7166,7167,-7085,-7028]]},{"type":"Polygon","id":13085,"arcs":[[-7131,7168,7169,7170,7171,-7067,-7004]]},{"type":"Polygon","id":45055,"arcs":[[7172,7173,7174,7175,7176,-6938,-7083]]},{"type":"Polygon","id":35041,"arcs":[[-7032,7177,7178,7179,7180,-7097,-6586]]},{"type":"Polygon","id":28145,"arcs":[[-7108,7181,7182,7183,-6986,-6984,-6979]]},{"type":"Polygon","id":1095,"arcs":[[-7052,7184,7185,7186,-7141,-6993,-6996]]},{"type":"Polygon","id":13055,"arcs":[[7187,7188,-7049,-7018]]},{"type":"Polygon","id":13115,"arcs":[[-7165,7189,7190,7191,-7188,-7017]]},{"type":"Polygon","id":35053,"arcs":[[-6949,7192,7193,7194,-6824,-7024]]},{"type":"Polygon","id":35003,"arcs":[[-7195,7195,7196,7197,-5797,-6825]]},{"type":"Polygon","id":1059,"arcs":[[-7091,7198,7199,7200,-6974,-7040]]},{"type":"Polygon","id":48197,"arcs":[[-7057,7201,7202,7203,-7122,-6954]]},{"type":"Polygon","id":45039,"arcs":[[-6939,-7177,7204,7205,-7034,-7078]]},{"type":"Polygon","id":5001,"arcs":[[-6965,-7157,7206,7207,7208,-6934,-6930]]},{"type":"Polygon","id":13227,"arcs":[[-7172,7209,-7163,-7068]]},{"type":"Polygon","id":28071,"arcs":[[-7184,7210,7211,7212,7213,-7100,-6987]]},{"type":"Polygon","id":28107,"arcs":[[-7214,7214,7215,7216,-7045,-7101]]},{"type":"Polygon","id":13119,"arcs":[[7217,7218,7219,-7143,-6944]]},{"type":"Polygon","id":45031,"arcs":[[-7087,7220,7221,-7173,-7082]]},{"type":"Polygon","id":45071,"arcs":[[-7206,7222,7223,7224,7225,-7094,-7035]]},{"type":"Polygon","id":1019,"arcs":[[-7192,7226,7227,7228,7229,-7050,-7189]]},{"type":"Polygon","id":28027,"arcs":[[7230,7231,7232,-7154,-7047,7233]]},{"type":"Polygon","id":28119,"arcs":[[-7217,7234,-7234,-7046]]},{"type":"Polygon","id":13139,"arcs":[[-7072,7235,7236,7237,7238,-7169,-7130,-7092]]},{"type":"Polygon","id":28081,"arcs":[[7239,7240,7241,7242,-7182,-7107]]},{"type":"Polygon","id":40019,"arcs":[[-7159,7243,7244,7245,7246,-7145,-7065]]},{"type":"Polygon","id":40069,"arcs":[[-7021,-7105,-7151,7247,7248,-7244,-7158]]},{"type":"Polygon","id":40033,"arcs":[[-7147,7249,7250,7251,-7160,-7062]]},{"type":"Polygon","id":40089,"arcs":[[-7140,7252,7253,7254,7255,7256,-7152,-6802]]},{"type":"Polygon","id":5059,"arcs":[[-7059,7257,7258,7259,-7124,-7102]]},{"type":"Polygon","id":4007,"arcs":[[-5749,7260,7261,7262,-6693,-5751]]},{"type":"Polygon","id":13147,"arcs":[[-7081,7263,7264,-7218,-6943]]},{"type":"Polygon","id":5053,"arcs":[[-6957,7265,7266,7267,-7258,-7058]]},{"type":"Polygon","id":5069,"arcs":[[-6935,-7209,7268,7269,-7266,-6956]]},{"type":"Polygon","id":13011,"arcs":[[7270,7271,-7236,-7071,-7144,-7220]]},{"type":"Polygon","id":37047,"arcs":[[-7137,7272,7273,-7026,-7054]]},{"type":"Polygon","id":45001,"arcs":[[7274,7275,7276,-7079,-7096]]},{"type":"Polygon","id":28057,"arcs":[[-6975,-7201,7277,7278,-7240,-7106]]},{"type":"Polygon","id":48487,"arcs":[[-7162,7279,7280,7281,-7202,-7056]]},{"type":"Polygon","id":13015,"arcs":[[7282,7283,7284,-7190,-7164,7285]]},{"type":"Polygon","id":13057,"arcs":[[-7171,7286,7287,7288,-7286,-7210]]},{"type":"Polygon","id":45047,"arcs":[[-7226,7289,7290,7291,-7275,-7095]]},{"type":"MultiPolygon","id":37129,"arcs":[[[7292,7293]],[[7294,-7132,7295,7296,-7135]]]},{"type":"Polygon","id":28115,"arcs":[[-7243,7297,7298,-7211,-7183]]},{"type":"Polygon","id":45061,"arcs":[[7299,7300,-7174,-7222]]},{"type":"MultiPolygon","id":37019,"arcs":[[[7301,7302]],[[-7293,7303]],[[-7297,7304,7305,7306,7307,-7273,-7136]]]},{"type":"Polygon","id":5061,"arcs":[[7308,7309,7310,7311,-7138]]},{"type":"Polygon","id":5109,"arcs":[[7312,7313,7314,-7309,-7126]]},{"type":"Polygon","id":35027,"arcs":[[-7099,7315,7316,7317,-7193,-6948,-6865]]},{"type":"Polygon","id":5019,"arcs":[[-7260,7318,7319,7320,-7313,-7125]]},{"type":"Polygon","id":13117,"arcs":[[-7239,7321,7322,-7287,-7170]]},{"type":"Polygon","id":1093,"arcs":[[7323,7324,7325,7326,7327,-7278,-7200]]},{"type":"Polygon","id":4012,"arcs":[[-6695,7328,7329,7330,7331,-6550,7332]]},{"type":"Polygon","id":48345,"arcs":[[7333,7334,7335,-7114,-7121]]},{"type":"Polygon","id":48101,"arcs":[[-7123,-7204,7336,7337,-7334,-7120]]},{"type":"Polygon","id":1043,"arcs":[[-7187,7338,7339,7340,-7089,-7142]]},{"type":"Polygon","id":48153,"arcs":[[-7336,7341,7342,-7110,-7115]]},{"type":"Polygon","id":48189,"arcs":[[-7116,-7111,-7343,7343,7344]]},{"type":"Polygon","id":48279,"arcs":[[-7345,7345,7346,-7128,-7117]]},{"type":"Polygon","id":45041,"arcs":[[7347,7348,7349,7350,-7300,-7221,-7086,-7168]]},{"type":"Polygon","id":48017,"arcs":[[-7347,7351,-7178,-7031,-7129]]},{"type":"Polygon","id":1133,"arcs":[[-7090,-7341,7352,-7324,-7199]]},{"type":"MultiPolygon","id":45051,"arcs":[[[-7302,7353]],[[-7306,7354]],[[-7274,-7308,7355,7356,7357,-7166,-7027]]]},{"type":"Polygon","id":45067,"arcs":[[-7358,7358,7359,-7348,-7167]]},{"type":"Polygon","id":13157,"arcs":[[7360,7361,7362,-7237,-7272]]},{"type":"Polygon","id":40067,"arcs":[[-7247,7363,7364,7365,-7250,-7146]]},{"type":"Polygon","id":13105,"arcs":[[-7277,7366,7367,7368,7369,7370,-7264,-7080]]},{"type":"Polygon","id":13195,"arcs":[[-7371,7371,7372,-7361,-7271,-7219,-7265]]},{"type":"Polygon","id":45079,"arcs":[[7373,7374,7375,-7223,-7205,-7176]]},{"type":"Polygon","id":1009,"arcs":[[-7186,7376,7377,7378,7379,-7339]]},{"type":"Polygon","id":48155,"arcs":[[-7203,-7282,7380,7381,7382,-7337]]},{"type":"Polygon","id":48485,"arcs":[[-7252,7383,7384,-7280,-7161]]},{"type":"Polygon","id":1055,"arcs":[[-7230,7385,7386,-7377,-7185,-7051]]},{"type":"Polygon","id":45063,"arcs":[[7387,7388,7389,7390,-7224,-7376]]},{"type":"Polygon","id":28161,"arcs":[[7391,7392,7393,-7215,-7213]]},{"type":"Polygon","id":5133,"arcs":[[7394,-7253,-7139,-7312]]},{"type":"Polygon","id":45081,"arcs":[[-7391,7395,7396,-7290,-7225]]},{"type":"Polygon","id":13121,"arcs":[[-7323,7397,7398,7399,7400,7401,7402,7403,7404,-7288]]},{"type":"Polygon","id":40095,"arcs":[[7405,7406,7407,-7245,-7249]]},{"type":"Polygon","id":5079,"arcs":[[-7208,7408,7409,7410,-7269]]},{"type":"Polygon","id":45085,"arcs":[[-7351,7411,7412,-7374,-7175,-7301]]},{"type":"Polygon","id":13135,"arcs":[[7413,7414,7415,7416,-7398,-7322,-7238]]},{"type":"Polygon","id":28135,"arcs":[[-7394,7417,7418,7419,-7231,-7235,-7216]]},{"type":"Polygon","id":28013,"arcs":[[-7299,7420,7421,7422,-7392,-7212]]},{"type":"Polygon","id":40013,"arcs":[[7423,7424,7425,7426,-7406,-7248,-7150]]},{"type":"Polygon","id":40023,"arcs":[[-7257,7427,7428,-7424,-7149,-7153]]},{"type":"Polygon","id":5039,"arcs":[[-7268,7429,7430,7431,-7319,-7259]]},{"type":"Polygon","id":48077,"arcs":[[-7366,7432,7433,7434,-7384,-7251]]},{"type":"Polygon","id":13013,"arcs":[[7435,7436,-7414,-7363]]},{"type":"Polygon","id":28011,"arcs":[[7437,7438,7439,7440,-7155,-7233]]},{"type":"Polygon","id":5041,"arcs":[[-7441,7441,7442,-7409,-7207,-7156]]},{"type":"Polygon","id":13233,"arcs":[[-7285,7443,7444,7445,-7227,-7191]]},{"type":"Polygon","id":28095,"arcs":[[-7279,-7328,7446,7447,7448,7449,-7241]]},{"type":"Polygon","id":35005,"arcs":[[-7181,7450,7451,7452,-7316,-7098]]},{"type":"Polygon","id":13067,"arcs":[[-7405,7453,7454,-7283,-7289]]},{"type":"Polygon","id":6065,"arcs":[[7455,7456,7457,-6551,-7332]]},{"type":"Polygon","id":13223,"arcs":[[-7455,7458,7459,7460,-7444,-7284]]},{"type":"Polygon","id":45065,"arcs":[[-7292,7461,7462,7463,-7367,-7276]]},{"type":"Polygon","id":28017,"arcs":[[-7242,-7450,7464,7465,-7421,-7298]]},{"type":"Polygon","id":40085,"arcs":[[-7408,7466,7467,7468,-7364,-7246]]},{"type":"Polygon","id":5025,"arcs":[[-7411,7469,7470,7471,-7430,-7267,-7270]]},{"type":"Polygon","id":1075,"arcs":[[7472,7473,7474,-7447,-7327]]},{"type":"Polygon","id":13221,"arcs":[[-7370,7475,7476,7477,7478,7479,-7372]]},{"type":"Polygon","id":4013,"arcs":[[-7263,7480,7481,7482,-7329,-6694]]},{"type":"Polygon","id":13059,"arcs":[[-7480,7483,-7362,-7373]]},{"type":"Polygon","id":5057,"arcs":[[7484,7485,7486,7487,-7310,-7315]]},{"type":"Polygon","id":1127,"arcs":[[-7340,-7380,7488,7489,7490,-7325,-7353]]},{"type":"Polygon","id":13317,"arcs":[[7491,7492,7493,7494,-7476,-7369]]},{"type":"Polygon","id":48337,"arcs":[[-7469,7495,7496,7497,-7433,-7365]]},{"type":"Polygon","id":1115,"arcs":[[7498,7499,7500,7501,-7378,-7387]]},{"type":"Polygon","id":28133,"arcs":[[-7420,7502,7503,7504,-7438,-7232]]},{"type":"Polygon","id":13181,"arcs":[[-7464,7505,7506,-7492,-7368]]},{"type":"Polygon","id":45037,"arcs":[[7507,7508,7509,-7462,-7291,-7397]]},{"type":"Polygon","id":13089,"arcs":[[-7417,7510,7511,7512,-7399]]},{"type":"Polygon","id":1015,"arcs":[[7513,-7499,-7386,-7229,7514]]},{"type":"Polygon","id":13219,"arcs":[[-7479,7515,7516,7517,-7436,-7484]]},{"type":"Polygon","id":1029,"arcs":[[-7446,7518,7519,7520,7521,7522,-7515,-7228]]},{"type":"Polygon","id":48387,"arcs":[[-7256,7523,7524,7525,7526,7527,7528,-7428]]},{"type":"Polygon","id":5099,"arcs":[[-7321,7529,7530,7531,-7485,-7314]]},{"type":"Polygon","id":48181,"arcs":[[-7427,7532,7533,7534,7535,-7467,-7407]]},{"type":"Polygon","id":48097,"arcs":[[-7536,7536,7537,-7496,-7468]]},{"type":"Polygon","id":5081,"arcs":[[-7311,-7488,7538,7539,-7254,-7395]]},{"type":"Polygon","id":45027,"arcs":[[7540,7541,7542,7543,-7412,-7350]]},{"type":"MultiPolygon","id":6059,"arcs":[[[-6552,-7458,7544,7545,-7076]]]},{"type":"Polygon","id":48277,"arcs":[[-7529,7546,7547,-7425,-7429]]},{"type":"Polygon","id":13297,"arcs":[[-7518,7548,7549,7550,-7415,-7437]]},{"type":"Polygon","id":1057,"arcs":[[-7491,7551,7552,-7473,-7326]]},{"type":"Polygon","id":13143,"arcs":[[7553,-7519,-7445,-7461]]},{"type":"Polygon","id":28043,"arcs":[[-7423,7554,7555,7556,7557,-7418,-7393]]},{"type":"Polygon","id":45089,"arcs":[[-7360,7558,7559,-7541,-7349]]},{"type":"Polygon","id":48147,"arcs":[[-7548,7560,7561,7562,-7533,-7426]]},{"type":"Polygon","id":45017,"arcs":[[-7413,-7544,7563,-7388,-7375]]},{"type":"Polygon","id":45003,"arcs":[[7564,7565,7566,7567,-7508,-7396,-7390]]},{"type":"Polygon","id":1073,"arcs":[[-7502,7568,7569,7570,-7489,-7379]]},{"type":"Polygon","id":48269,"arcs":[[-7383,7571,7572,7573,-7338]]},{"type":"Polygon","id":48275,"arcs":[[7574,7575,-7572,-7382]]},{"type":"Polygon","id":48009,"arcs":[[-7435,7576,7577,7578,-7385]]},{"type":"Polygon","id":48125,"arcs":[[-7574,7579,7580,-7335]]},{"type":"Polygon","id":48107,"arcs":[[-7581,7581,7582,-7342]]},{"type":"Polygon","id":48023,"arcs":[[-7579,7583,-7575,-7381,-7281]]},{"type":"Polygon","id":48303,"arcs":[[-7583,7584,7585,-7344]]},{"type":"Polygon","id":48079,"arcs":[[7586,7587,7588,-7179,-7352]]},{"type":"Polygon","id":48219,"arcs":[[-7586,7589,-7587,-7346]]},{"type":"Polygon","id":5103,"arcs":[[-7432,7590,7591,7592,-7530,-7320]]},{"type":"Polygon","id":13211,"arcs":[[7593,7594,7595,7596,-7549,-7517]]},{"type":"Polygon","id":13045,"arcs":[[-7403,7597,7598,7599,-7520,-7554,-7460,7600]]},{"type":"Polygon","id":28083,"arcs":[[-7558,7601,7602,7603,-7503,-7419]]},{"type":"Polygon","id":28025,"arcs":[[-7449,7604,7605,7606,-7465]]},{"type":"Polygon","id":13097,"arcs":[[-7404,-7601,-7459,-7454]]},{"type":"Polygon","id":5013,"arcs":[[7607,7608,-7591,-7431,-7472]]},{"type":"Polygon","id":5043,"arcs":[[-7443,7609,7610,7611,-7470,-7410]]},{"type":"Polygon","id":13247,"arcs":[[7612,-7511,-7416,-7551,7613]]},{"type":"MultiPolygon","id":45043,"arcs":[[[7614,7615]],[[-7357,7616,7617,7618,-7559,-7359]]]},{"type":"Polygon","id":4011,"arcs":[[-7198,7619,7620,7621,7622,-5798]]},{"type":"Polygon","id":13133,"arcs":[[7623,7624,7625,-7594,-7516,-7478]]},{"type":"Polygon","id":28087,"arcs":[[-7475,7626,7627,7628,-7605,-7448]]},{"type":"Polygon","id":13217,"arcs":[[-7597,7629,7630,7631,-7614,-7550]]},{"type":"Polygon","id":28155,"arcs":[[-7607,7632,7633,7634,-7555,-7422,-7466]]},{"type":"Polygon","id":13265,"arcs":[[7635,7636,-7624,-7477,-7495]]},{"type":"Polygon","id":48037,"arcs":[[-7540,7637,7638,7639,-7524,-7255]]},{"type":"Polygon","id":45075,"arcs":[[-7543,7640,7641,7642,7643,7644,-7565,-7389,-7564]]},{"type":"Polygon","id":5011,"arcs":[[-7612,7645,7646,-7608,-7471]]},{"type":"Polygon","id":13073,"arcs":[[-7463,-7510,7647,7648,-7506]]},{"type":"Polygon","id":1121,"arcs":[[-7514,-7523,7649,7650,7651,-7500]]},{"type":"Polygon","id":28097,"arcs":[[-7635,7652,7653,7654,-7556]]},{"type":"Polygon","id":28015,"arcs":[[-7655,7655,7656,-7602,-7557]]},{"type":"Polygon","id":13189,"arcs":[[-7507,-7649,7657,7658,7659,-7493]]},{"type":"Polygon","id":4009,"arcs":[[-7623,7660,7661,7662,-7261,-5748,-5799]]},{"type":"Polygon","id":13063,"arcs":[[-7513,7663,7664,7665,-7400]]},{"type":"Polygon","id":13151,"arcs":[[-7613,-7632,7666,7667,-7664,-7512]]},{"type":"Polygon","id":5091,"arcs":[[7668,7669,7670,7671,-7638,-7539,-7487]]},{"type":"Polygon","id":13301,"arcs":[[7672,7673,7674,-7636,-7494,-7660]]},{"type":"Polygon","id":1125,"arcs":[[-7490,-7571,7675,7676,7677,7678,-7552]]},{"type":"Polygon","id":35025,"arcs":[[-7589,7679,7680,7681,7682,7683,7684,-7451,-7180]]},{"type":"Polygon","id":28105,"arcs":[[-7629,7685,7686,7687,-7633,-7606]]},{"type":"Polygon","id":5017,"arcs":[[-7440,7688,7689,7690,7691,7692,7693,-7610,-7442]]},{"type":"Polygon","id":13113,"arcs":[[7694,7695,-7401,-7666]]},{"type":"Polygon","id":1117,"arcs":[[-7652,7696,7697,7698,-7569,-7501]]},{"type":"Polygon","id":13245,"arcs":[[7699,7700,-7658,-7648,-7509,-7568]]},{"type":"Polygon","id":1107,"arcs":[[-7553,-7679,7701,7702,7703,-7627,-7474]]},{"type":"Polygon","id":28019,"arcs":[[-7688,7704,7705,-7653,-7634]]},{"type":"Polygon","id":28151,"arcs":[[-7505,7706,7707,7708,-7689,-7439]]},{"type":"Polygon","id":13159,"arcs":[[7709,7710,7711,7712,-7630,-7596]]},{"type":"Polygon","id":13077,"arcs":[[-7696,7713,7714,7715,7716,-7598,-7402]]},{"type":"Polygon","id":45015,"arcs":[[-7619,7717,7718,7719,7720,-7641,-7542,-7560]]},{"type":"MultiPolygon","id":6073,"arcs":[[[7721,7722,-7545,-7457]]]},{"type":"Polygon","id":1111,"arcs":[[-7600,7723,7724,7725,7726,7727,-7521]]},{"type":"Polygon","id":1027,"arcs":[[-7728,7728,7729,-7650,-7522]]},{"type":"Polygon","id":48119,"arcs":[[-7528,7730,7731,7732,-7561,-7547]]},{"type":"Polygon","id":45011,"arcs":[[7733,7734,7735,-7566,-7645]]},{"type":"Polygon","id":13237,"arcs":[[7736,7737,7738,-7710,-7595,-7626]]},{"type":"Polygon","id":35051,"arcs":[[-7318,7739,7740,7741,7742,-7196,-7194]]},{"type":"Polygon","id":5073,"arcs":[[-7532,7743,7744,7745,-7669,-7486]]},{"type":"Polygon","id":13141,"arcs":[[-7675,7746,7747,7748,-7737,-7625,-7637]]},{"type":"Polygon","id":4027,"arcs":[[-7483,7749,7750,7751,-7330]]},{"type":"Polygon","id":4021,"arcs":[[-7262,-7663,7752,-7481]]},{"type":"Polygon","id":48237,"arcs":[[-7498,7753,7754,7755,7756,-7577,-7434]]},{"type":"Polygon","id":5027,"arcs":[[-7593,7757,7758,7759,-7744,-7531]]},{"type":"Polygon","id":13035,"arcs":[[-7713,7760,7761,7762,-7667,-7631]]},{"type":"Polygon","id":45009,"arcs":[[7763,7764,-7734,-7644]]},{"type":"Polygon","id":6025,"arcs":[[-7752,7765,-7722,-7456,-7331]]},{"type":"Polygon","id":48497,"arcs":[[-7538,7766,7767,7768,-7754,-7497]]},{"type":"Polygon","id":48121,"arcs":[[7769,7770,7771,-7767,-7537,-7535]]},{"type":"Polygon","id":13149,"arcs":[[-7717,7772,-7724,-7599]]},{"type":"Polygon","id":48231,"arcs":[[7773,7774,7775,7776,7777,-7562,-7733,7778]]},{"type":"Polygon","id":48085,"arcs":[[-7563,-7778,7779,7780,-7770,-7534]]},{"type":"Polygon","id":48263,"arcs":[[7781,7782,7783,7784,-7580]]},{"type":"Polygon","id":48433,"arcs":[[7785,7786,7787,-7782,-7573]]},{"type":"Polygon","id":48449,"arcs":[[7788,7789,7790,-7526]]},{"type":"Polygon","id":48169,"arcs":[[-7785,7791,7792,7793,-7582]]},{"type":"Polygon","id":48447,"arcs":[[7794,7795,7796,7797,-7584]]},{"type":"Polygon","id":48503,"arcs":[[-7757,7798,7799,-7795,-7578]]},{"type":"Polygon","id":48207,"arcs":[[-7798,7800,7801,-7786,-7576]]},{"type":"Polygon","id":5003,"arcs":[[-7694,7802,7803,-7646,-7611]]},{"type":"Polygon","id":48305,"arcs":[[-7794,7804,7805,7806,-7585]]},{"type":"Polygon","id":35035,"arcs":[[-7453,7807,7808,7809,7810,7811,-7740,-7317]]},{"type":"Polygon","id":48501,"arcs":[[7812,7813,-7680,-7588]]},{"type":"Polygon","id":48445,"arcs":[[-7807,7814,7815,-7813,-7590]]},{"type":"Polygon","id":48159,"arcs":[[-7791,7816,7817,7818,-7731,-7527]]},{"type":"Polygon","id":5139,"arcs":[[-7609,-7647,-7804,7819,7820,-7758,-7592]]},{"type":"Polygon","id":48223,"arcs":[[-7819,7821,7822,-7779,-7732]]},{"type":"Polygon","id":48343,"arcs":[[-7640,7823,7824,7825,7826,-7789,-7525]]},{"type":"Polygon","id":28051,"arcs":[[-7657,7827,7828,7829,-7603]]},{"type":"Polygon","id":13255,"arcs":[[-7763,7830,7831,7832,-7714,-7695,-7665,-7668]]},{"type":"Polygon","id":45035,"arcs":[[-7721,7833,7834,-7642]]},{"type":"Polygon","id":28053,"arcs":[[-7604,-7830,7835,7836,-7707,-7504]]},{"type":"Polygon","id":13125,"arcs":[[7837,7838,-7747,-7674]]},{"type":"Polygon","id":13163,"arcs":[[7839,7840,7841,7842,-7838,-7673,-7659,-7701]]},{"type":"Polygon","id":48067,"arcs":[[-7672,7843,7844,-7824,-7639]]},{"type":"Polygon","id":13033,"arcs":[[-7567,-7736,7845,7846,7847,7848,-7840,-7700]]},{"type":"Polygon","id":28103,"arcs":[[-7704,7849,7850,7851,-7686,-7628]]},{"type":"Polygon","id":28159,"arcs":[[-7852,7852,7853,7854,-7705,-7687]]},{"type":"Polygon","id":28007,"arcs":[[-7855,7855,7856,-7828,-7656,-7654,-7706]]},{"type":"Polygon","id":1007,"arcs":[[7857,7858,7859,-7676,-7570,-7699]]},{"type":"Polygon","id":13303,"arcs":[[-7839,-7843,7860,7861,7862,-7748]]},{"type":"Polygon","id":13199,"arcs":[[-7833,7863,7864,7865,7866,7867,-7715]]},{"type":"Polygon","id":13285,"arcs":[[-7868,7868,7869,-7725,-7773,-7716]]},{"type":"Polygon","id":35017,"arcs":[[-7743,7870,7871,-7620,-7197]]},{"type":"Polygon","id":13231,"arcs":[[7872,7873,-7864,-7832]]},{"type":"Polygon","id":13171,"arcs":[[7874,7875,-7873,-7831,-7762]]},{"type":"Polygon","id":13207,"arcs":[[-7712,7876,7877,7878,7879,-7875,-7761]]},{"type":"Polygon","id":13009,"arcs":[[-7749,-7863,7880,7881,-7738]]},{"type":"Polygon","id":13169,"arcs":[[-7882,7882,7883,7884,-7877,-7711,-7739]]},{"type":"MultiPolygon","id":45029,"arcs":[[[7885,7886]],[[-7835,7887,7888,7889,7890,-7764,-7643]]]},{"type":"Polygon","id":45005,"arcs":[[-7765,7891,7892,-7846,-7735]]},{"type":"Polygon","id":1063,"arcs":[[7893,7894,7895,-7702,-7678]]},{"type":"Polygon","id":1017,"arcs":[[-7870,7896,7897,7898,-7726]]},{"type":"Polygon","id":1123,"arcs":[[-7899,7899,7900,7901,7902,-7729,-7727]]},{"type":"Polygon","id":1037,"arcs":[[-7903,7903,7904,-7697,-7651,-7730]]},{"type":"Polygon","id":28125,"arcs":[[-7837,7905,7906,-7708]]},{"type":"Polygon","id":48063,"arcs":[[-7827,7907,7908,-7817,-7790]]},{"type":"Polygon","id":1021,"arcs":[[-7905,7909,7910,7911,7912,-7858,-7698]]},{"type":"Polygon","id":35013,"arcs":[[7913,7914,7915,-7741,-7812]]},{"type":"Polygon","id":13251,"arcs":[[7916,7917,7918,7919,-7847,-7893]]},{"type":"Polygon","id":45049,"arcs":[[7920,7921,7922,-7917,-7892,-7891]]},{"type":"Polygon","id":28163,"arcs":[[7923,7924,7925,7926,-7906,-7836,-7829]]},{"type":"Polygon","id":22017,"arcs":[[7927,7928,7929,7930,7931,-7844,-7671,7932]]},{"type":"Polygon","id":22015,"arcs":[[7933,7934,7935,-7933,-7670,-7746]]},{"type":"Polygon","id":22119,"arcs":[[7936,-7934,-7745,-7760,7937]]},{"type":"Polygon","id":22027,"arcs":[[7938,7939,-7938,-7759,-7821,7940]]},{"type":"Polygon","id":22111,"arcs":[[7941,7942,-7941,-7820,7943]]},{"type":"Polygon","id":48499,"arcs":[[7944,7945,7946,7947,-7822,-7818,-7909]]},{"type":"Polygon","id":28055,"arcs":[[-7907,-7927,7948,7949,-7690,-7709]]},{"type":"Polygon","id":13319,"arcs":[[-7862,7950,7951,7952,-7883,-7881]]},{"type":"Polygon","id":22067,"arcs":[[-7693,7953,7954,7955,-7944,-7803]]},{"type":"Polygon","id":1065,"arcs":[[-7860,7956,7957,-7894,-7677]]},{"type":"Polygon","id":22123,"arcs":[[7958,7959,-7954,-7692]]},{"type":"Polygon","id":48363,"arcs":[[7960,7961,7962,7963,7964,-7799,-7756]]},{"type":"Polygon","id":22035,"arcs":[[7965,7966,7967,-7959,-7691,-7950]]},{"type":"Polygon","id":48367,"arcs":[[7968,7969,7970,-7961,-7755,-7769]]},{"type":"Polygon","id":13293,"arcs":[[-7876,-7880,7971,7972,7973,-7865,-7874]]},{"type":"Polygon","id":1119,"arcs":[[7974,7975,7976,7977,-7850,-7703,-7896]]},{"type":"Polygon","id":48439,"arcs":[[-7768,-7772,7978,7979,7980,-7969]]},{"type":"Polygon","id":48113,"arcs":[[-7781,7981,7982,7983,-7979,-7771]]},{"type":"Polygon","id":48397,"arcs":[[-7777,7984,-7982,-7780]]},{"type":"Polygon","id":48379,"arcs":[[-7948,7985,-7774,-7823]]},{"type":"Polygon","id":48415,"arcs":[[7986,7987,7988,-7792,-7784]]},{"type":"Polygon","id":35015,"arcs":[[-7685,7989,7990,7991,-7808,-7452]]},{"type":"Polygon","id":48151,"arcs":[[-7788,7992,7993,-7987,-7783]]},{"type":"Polygon","id":48033,"arcs":[[-7989,7994,7995,7996,-7805,-7793]]},{"type":"Polygon","id":48115,"arcs":[[-7997,7997,7998,-7815,-7806]]},{"type":"Polygon","id":48165,"arcs":[[-7816,-7999,7999,8000,-7681,-7814]]},{"type":"Polygon","id":48253,"arcs":[[-7802,8001,8002,8003,-7993,-7787]]},{"type":"Polygon","id":48417,"arcs":[[8004,8005,8006,-8002,-7801,-7797]]},{"type":"Polygon","id":48429,"arcs":[[-7965,8007,-8005,-7796,-7800]]},{"type":"Polygon","id":13165,"arcs":[[-7920,8008,8009,-7848]]},{"type":"Polygon","id":13021,"arcs":[[8010,8011,8012,-7878,-7885]]},{"type":"Polygon","id":28099,"arcs":[[8013,8014,8015,-7854]]},{"type":"Polygon","id":28079,"arcs":[[-8016,8016,8017,8018,-7856]]},{"type":"Polygon","id":28069,"arcs":[[-7978,8019,-8014,-7853,-7851]]},{"type":"Polygon","id":48459,"arcs":[[-7826,8020,8021,8022,8023,-7945,-7908]]},{"type":"Polygon","id":13289,"arcs":[[8024,8025,-8011,-7884,-7953]]},{"type":"Polygon","id":13263,"arcs":[[8026,8027,8028,8029,8030,-7866,-7974]]},{"type":"Polygon","id":48315,"arcs":[[-7932,8031,-8021,-7825,-7845]]},{"type":"Polygon","id":28089,"arcs":[[-8019,8032,8033,8034,-7924,-7857]]},{"type":"Polygon","id":1105,"arcs":[[-7913,8035,8036,-7957,-7859]]},{"type":"Polygon","id":13145,"arcs":[[-8031,8037,8038,-7897,-7869,-7867]]},{"type":"Polygon","id":13079,"arcs":[[-8013,8039,8040,8041,-7972,-7879]]},{"type":"Polygon","id":48257,"arcs":[[8042,8043,8044,-7983,-7985,-7776]]},{"type":"Polygon","id":13107,"arcs":[[-7849,-8010,8045,8046,8047,8048,8049,8050,-7841]]},{"type":"Polygon","id":48467,"arcs":[[-7986,-7947,8051,8052,-8043,-7775]]},{"type":"Polygon","id":13167,"arcs":[[-8051,8053,-7951,-7861,-7842]]},{"type":"Polygon","id":48203,"arcs":[[-7931,8054,8055,8056,-8022,-8032]]},{"type":"Polygon","id":35023,"arcs":[[8057,8058,8059,-7621,-7872]]},{"type":"Polygon","id":1051,"arcs":[[8060,8061,8062,-7910,-7904,-7902]]},{"type":"Polygon","id":22061,"arcs":[[8063,8064,8065,-7939,-7943]]},{"type":"MultiPolygon","id":45053,"arcs":[[[8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,-7922]]]},{"type":"Polygon","id":13269,"arcs":[[-8042,8076,8077,8078,8079,-8027,-7973]]},{"type":"Polygon","id":1081,"arcs":[[-8039,8080,8081,8082,-7900,-7898]]},{"type":"Polygon","id":1047,"arcs":[[8083,8084,8085,8086,-8036,-7912]]},{"type":"Polygon","id":22073,"arcs":[[8087,8088,8089,-8064,-7942,-7956]]},{"type":"Polygon","id":13175,"arcs":[[8090,8091,8092,-7952,-8054,8093]]},{"type":"Polygon","id":1001,"arcs":[[-8063,8094,8095,-8084,-7911]]},{"type":"MultiPolygon","id":45013,"arcs":[[[8096]],[[-8073,8097]],[[-8071,8098]],[[-8069,8099]],[[8100]],[[8101]],[[8102,-8067,-7921,-7890]]]},{"type":"Polygon","id":13225,"arcs":[[8103,-8077,-8041,8104]]},{"type":"Polygon","id":13153,"arcs":[[-8026,8105,8106,8107,8108,-8105,-8040,-8012]]},{"type":"Polygon","id":48423,"arcs":[[-8024,8109,8110,8111,8112,-8052,-7946]]},{"type":"Polygon","id":22083,"arcs":[[-7968,8113,8114,8115,-8088,-7955,-7960]]},{"type":"Polygon","id":48183,"arcs":[[-8057,8116,-8110,-8023]]},{"type":"Polygon","id":13031,"arcs":[[8117,8118,8119,8120,-8046,-8009,-7919]]},{"type":"Polygon","id":28123,"arcs":[[-8018,8121,8122,8123,-8033]]},{"type":"Polygon","id":28149,"arcs":[[8124,8125,8126,8127,8128,8129,-7966,-7949,-7926]]},{"type":"Polygon","id":13215,"arcs":[[-8030,8130,8131,-8081,-8038]]},{"type":"Polygon","id":35029,"arcs":[[-7916,8132,-8058,-7871,-7742]]},{"type":"Polygon","id":13103,"arcs":[[-8076,8133,8134,-8118,-7918,-7923]]},{"type":"Polygon","id":1087,"arcs":[[8135,8136,8137,-8061,-7901,-8083]]},{"type":"Polygon","id":28121,"arcs":[[-8124,8138,8139,8140,-8034]]},{"type":"Polygon","id":22013,"arcs":[[-8066,8141,8142,8143,8144,-7935,-7937,-7940]]},{"type":"Polygon","id":13023,"arcs":[[8145,8146,-8106,-8025,-8093]]},{"type":"Polygon","id":28075,"arcs":[[-7977,8147,8148,8149,-8020]]},{"type":"Polygon","id":28101,"arcs":[[-8150,8150,-8122,-8017,-8015]]},{"type":"Polygon","id":28049,"arcs":[[-8141,8151,8152,-8125,-7925,-8035]]},{"type":"MultiPolygon","id":22065,"arcs":[[[8153,-8128]],[[8154,8155,-8114,-7967,-8130]]]},{"type":"Polygon","id":13197,"arcs":[[8156,8157,8158,8159,8160,-8028,-8080]]},{"type":"Polygon","id":13043,"arcs":[[8161,8162,-8047,-8121]]},{"type":"Polygon","id":48221,"arcs":[[8163,8164,8165,-7962,-7971]]},{"type":"Polygon","id":48251,"arcs":[[8166,8167,8168,8169,-8164,-7970,-7981]]},{"type":"Polygon","id":48139,"arcs":[[-7984,-8045,8170,8171,8172,-8167,-7980]]},{"type":"Polygon","id":1091,"arcs":[[-7958,-8037,-8087,8173,8174,8175,-7975,-7895]]},{"type":"Polygon","id":13053,"arcs":[[-8161,8176,8177,-8131,-8029]]},{"type":"Polygon","id":48227,"arcs":[[8178,8179,8180,8181,-7996]]},{"type":"Polygon","id":48335,"arcs":[[8182,8183,8184,-8179,-7995,-7988]]},{"type":"Polygon","id":48353,"arcs":[[8185,8186,8187,-8183,-7994]]},{"type":"Polygon","id":48317,"arcs":[[-8182,8188,8189,8190,-8000,-7998]]},{"type":"Polygon","id":48003,"arcs":[[-8191,8191,8192,8193,-7682,-8001]]},{"type":"Polygon","id":13193,"arcs":[[-8104,-8109,8194,8195,8196,-8078]]},{"type":"Polygon","id":48441,"arcs":[[8197,8198,8199,-8186,-8004]]},{"type":"Polygon","id":48133,"arcs":[[-7964,8200,8201,8202,8203,-8006,-8008]]},{"type":"Polygon","id":48143,"arcs":[[-7963,-8166,8204,8205,8206,8207,-8201]]},{"type":"Polygon","id":48059,"arcs":[[-8204,8208,8209,-8198,-8003,-8007]]},{"type":"Polygon","id":4019,"arcs":[[-7662,8210,8211,8212,-7750,-7482,-7753]]},{"type":"Polygon","id":13283,"arcs":[[8213,8214,-8094,-8050]]},{"type":"Polygon","id":1113,"arcs":[[-8132,-8178,8215,8216,8217,-8136,-8082]]},{"type":"Polygon","id":1101,"arcs":[[-8138,8218,8219,8220,8221,-8095,-8062]]},{"type":"Polygon","id":22049,"arcs":[[-8090,8222,8223,-8142,-8065]]},{"type":"Polygon","id":13091,"arcs":[[8224,8225,8226,8227,-8146,-8092]]},{"type":"Polygon","id":13249,"arcs":[[-8197,8228,-8157,-8079]]},{"type":"Polygon","id":4003,"arcs":[[-7622,-8060,8229,8230,-8211,-7661]]},{"type":"Polygon","id":1085,"arcs":[[-8222,8231,8232,8233,-8085,-8096]]},{"type":"Polygon","id":48401,"arcs":[[8234,8235,8236,8237,-8111,-8117,-8056]]},{"type":"Polygon","id":22041,"arcs":[[-8156,8238,8239,8240,-8115]]},{"type":"Polygon","id":13235,"arcs":[[-8147,-8228,8241,8242,-8107]]},{"type":"Polygon","id":48365,"arcs":[[-7930,8243,8244,-8235,-8055]]},{"type":"Polygon","id":48213,"arcs":[[-8053,-8113,8245,8246,8247,8248,-8171,-8044]]},{"type":"Polygon","id":13209,"arcs":[[8249,8250,-8214,8251]]},{"type":"Polygon","id":13279,"arcs":[[-8049,8252,8253,8254,-8252]]},{"type":"Polygon","id":22031,"arcs":[[8255,8256,8257,8258,-8244,-7929]]},{"type":"Polygon","id":48349,"arcs":[[8259,8260,8261,-8172,-8249]]},{"type":"Polygon","id":48425,"arcs":[[-8170,8262,-8205,-8165]]},{"type":"Polygon","id":13267,"arcs":[[8263,8264,8265,8266,8267,-8253,-8048,-8163]]},{"type":"Polygon","id":1023,"arcs":[[8268,8269,8270,8271,-8148,-7976,-8176]]},{"type":"Polygon","id":13309,"arcs":[[-8251,8272,8273,-8225,-8091,-8215]]},{"type":"Polygon","id":1011,"arcs":[[-8218,8274,8275,-8219,-8137]]},{"type":"Polygon","id":13093,"arcs":[[-8243,8276,8277,8278,-8195,-8108]]},{"type":"Polygon","id":13109,"arcs":[[-8120,8279,8280,-8264,-8162]]},{"type":"Polygon","id":22021,"arcs":[[-8116,-8241,8281,8282,8283,-8223,-8089]]},{"type":"Polygon","id":1131,"arcs":[[-8086,-8234,8284,8285,8286,-8174]]},{"type":"Polygon","id":48217,"arcs":[[-8262,8287,8288,8289,-8168,-8173]]},{"type":"Polygon","id":48093,"arcs":[[8290,8291,8292,-8202,-8208]]},{"type":"Polygon","id":22107,"arcs":[[-8129,-8154,-8127,8293,8294,8295,8296,8297,-8239,-8155]]},{"type":"MultiPolygon","id":13029,"arcs":[[[8298,8299,8300,-8280,-8119,-8135]]]},{"type":"Polygon","id":22081,"arcs":[[-7936,-8145,8301,-8256,-7928]]},{"type":"MultiPolygon","id":13051,"arcs":[[[8302]],[[8303]],[[8304,-8299,-8134,-8075]]]},{"type":"Polygon","id":13307,"arcs":[[8305,8306,8307,8308,-8159]]},{"type":"Polygon","id":13259,"arcs":[[-8309,8309,8310,8311,-8216,-8177,-8160]]},{"type":"Polygon","id":13261,"arcs":[[-8279,8312,8313,8314,-8306,-8158,-8229,-8196]]},{"type":"Polygon","id":28023,"arcs":[[-8272,8315,8316,-8149]]},{"type":"Polygon","id":28021,"arcs":[[-8153,8317,8318,-8294,-8126]]},{"type":"Polygon","id":28061,"arcs":[[-8317,8319,8320,8321,-8151]]},{"type":"Polygon","id":28129,"arcs":[[-8322,8322,8323,8324,-8139,-8123]]},{"type":"Polygon","id":48035,"arcs":[[-8169,-8290,8325,8326,8327,-8206,-8263]]},{"type":"Polygon","id":13271,"arcs":[[8328,8329,8330,8331,-8226,-8274]]},{"type":"Polygon","id":22127,"arcs":[[-8224,-8284,8332,8333,8334,-8143]]},{"type":"Polygon","id":22069,"arcs":[[-8335,8335,8336,8337,8338,-8257,-8302,-8144]]},{"type":"Polygon","id":1005,"arcs":[[-8312,8339,8340,8341,8342,8343,-8275,-8217]]},{"type":"Polygon","id":48073,"arcs":[[-8238,8344,8345,8346,8347,-8246,-8112]]},{"type":"Polygon","id":13315,"arcs":[[-8227,-8332,8348,8349,8350,-8277,-8242]]},{"type":"MultiPolygon","id":13179,"arcs":[[[8351]],[[8352,8353,8354,-8265,-8281,-8301,8355]]]},{"type":"Polygon","id":48431,"arcs":[[-8185,8356,8357,8358,8359,-8180]]},{"type":"Polygon","id":48173,"arcs":[[-8360,8360,8361,-8189,-8181]]},{"type":"Polygon","id":48329,"arcs":[[-8362,8362,8363,-8192,-8190]]},{"type":"Polygon","id":48135,"arcs":[[-8364,8364,8365,8366,8367,-8193]]},{"type":"Polygon","id":48495,"arcs":[[-8368,8368,8369,-7683,-8194]]},{"type":"Polygon","id":48081,"arcs":[[-8188,8370,8371,-8357,-8184]]},{"type":"Polygon","id":48001,"arcs":[[8372,8373,8374,-8247,-8348]]},{"type":"Polygon","id":48083,"arcs":[[-8210,8375,8376,8377,8378,-8199]]},{"type":"Polygon","id":48399,"arcs":[[-8379,8379,8380,-8371,-8187,-8200]]},{"type":"Polygon","id":48049,"arcs":[[-8293,8381,8382,8383,-8376,-8209,-8203]]},{"type":"Polygon","id":1109,"arcs":[[-8344,8384,8385,8386,-8220,-8276]]},{"type":"Polygon","id":1041,"arcs":[[-8387,8387,8388,8389,-8232,-8221]]},{"type":"Polygon","id":28029,"arcs":[[8390,8391,8392,8393,-8318,-8152]]},{"type":"Polygon","id":28127,"arcs":[[-8325,8394,8395,8396,-8391,-8140]]},{"type":"Polygon","id":13081,"arcs":[[-8351,8397,8398,8399,-8313,-8278]]},{"type":"Polygon","id":48193,"arcs":[[8400,-8291,-8207,-8328,8401,8402]]},{"type":"Polygon","id":13183,"arcs":[[8403,8404,-8266,-8355]]},{"type":"Polygon","id":48161,"arcs":[[8405,8406,-8260,-8248,-8375]]},{"type":"Polygon","id":48109,"arcs":[[8407,8408,8409,-7809,-7992]]},{"type":"Polygon","id":48229,"arcs":[[8410,8411,8412,-7810,-8410]]},{"type":"Polygon","id":48141,"arcs":[[8413,-7914,-7811,-8413]]},{"type":"Polygon","id":48301,"arcs":[[8414,8415,-7990,-7684,-8370]]},{"type":"Polygon","id":48389,"arcs":[[8416,8417,8418,-8408,-7991,-8416]]},{"type":"Polygon","id":13239,"arcs":[[8419,8420,-8340,-8311]]},{"type":"Polygon","id":1025,"arcs":[[-8287,8421,8422,8423,-8269,-8175]]},{"type":"Polygon","id":48419,"arcs":[[8424,8425,8426,8427,-8236,-8245,-8259]]},{"type":"Polygon","id":22025,"arcs":[[-8298,8428,8429,8430,-8282,-8240]]},{"type":"Polygon","id":13161,"arcs":[[8431,8432,8433,-8329,-8273,-8250,-8255]]},{"type":"Polygon","id":13273,"arcs":[[8434,8435,8436,8437,-8307,-8315]]},{"type":"Polygon","id":13001,"arcs":[[-8268,8438,8439,8440,-8432,-8254]]},{"type":"Polygon","id":1013,"arcs":[[-8390,8441,8442,8443,-8285,-8233]]},{"type":"Polygon","id":13243,"arcs":[[-8308,-8438,8444,8445,-8420,-8310]]},{"type":"Polygon","id":22059,"arcs":[[-8431,8446,8447,8448,-8333,-8283]]},{"type":"Polygon","id":13177,"arcs":[[-8400,8449,8450,-8435,-8314]]},{"type":"Polygon","id":28153,"arcs":[[8451,8452,8453,-8320,-8316,-8271,8454]]},{"type":"Polygon","id":28063,"arcs":[[-8394,8455,8456,8457,-8295,-8319]]},{"type":"Polygon","id":48309,"arcs":[[8458,-8326,-8289,8459,8460,8461]]},{"type":"Polygon","id":13287,"arcs":[[8462,8463,8464,8465,-8398,-8350]]},{"type":"Polygon","id":13017,"arcs":[[-8331,8466,8467,-8463,-8349]]},{"type":"Polygon","id":13321,"arcs":[[-8399,-8466,8468,8469,8470,8471,-8450]]},{"type":"Polygon","id":48347,"arcs":[[-8428,8472,8473,-8345,-8237]]},{"type":"Polygon","id":22085,"arcs":[[-8339,8474,8475,8476,-8425,-8258]]},{"type":"Polygon","id":13305,"arcs":[[-8267,-8405,8477,8478,8479,8480,-8439]]},{"type":"Polygon","id":1099,"arcs":[[-8444,8481,8482,8483,-8422,-8286]]},{"type":"Polygon","id":28067,"arcs":[[8484,8485,8486,-8323,-8321,-8454]]},{"type":"Polygon","id":48293,"arcs":[[8487,-8460,-8288,-8261,-8407,8488,8489]]},{"type":"Polygon","id":13069,"arcs":[[8490,8491,8492,8493,8494,-8467,-8330,-8434]]},{"type":"Polygon","id":22043,"arcs":[[-8449,8495,-8336,-8334]]},{"type":"Polygon","id":28031,"arcs":[[-8487,8496,8497,8498,-8395,-8324]]},{"type":"Polygon","id":13061,"arcs":[[-8446,8499,8500,8501,-8341,-8421]]},{"type":"Polygon","id":1067,"arcs":[[-8502,8502,8503,8504,-8342]]},{"type":"Polygon","id":28065,"arcs":[[8505,8506,8507,-8396,-8499]]},{"type":"Polygon","id":13155,"arcs":[[-8495,8508,8509,-8464,-8468]]},{"type":"Polygon","id":22029,"arcs":[[-8297,8510,8511,8512,8513,8514,8515,-8429]]},{"type":"Polygon","id":28077,"arcs":[[8516,8517,8518,-8392,-8397,-8508]]},{"type":"Polygon","id":1035,"arcs":[[8519,8520,-8482,-8443]]},{"type":"Polygon","id":28001,"arcs":[[8521,8522,-8511,-8296,-8458]]},{"type":"Polygon","id":4023,"arcs":[[-8231,8523,-8212]]},{"type":"Polygon","id":48333,"arcs":[[8524,8525,-8382,-8292,-8401]]},{"type":"Polygon","id":28085,"arcs":[[8526,8527,8528,8529,-8456,-8393,-8519]]},{"type":"Polygon","id":13005,"arcs":[[8530,8531,-8491,-8433,-8441]]},{"type":"Polygon","id":48099,"arcs":[[8532,-8402,-8327,-8459,8533]]},{"type":"Polygon","id":48451,"arcs":[[-8381,8534,8535,8536,8537,-8358,-8372]]},{"type":"Polygon","id":1129,"arcs":[[-8424,8538,8539,8540,-8455,-8270]]},{"type":"MultiPolygon","id":13191,"arcs":[[[8541,8542]],[[8543,8544]],[[8545]],[[8546,8547,-8478,-8404,-8354]]]},{"type":"Polygon","id":48289,"arcs":[[8548,8549,8550,-8489,-8406,-8374]]},{"type":"Polygon","id":48461,"arcs":[[8551,8552,8553,-8365,-8363]]},{"type":"Polygon","id":48103,"arcs":[[-8554,8554,8555,8556,-8366]]},{"type":"Polygon","id":48405,"arcs":[[8557,8558,8559,-8473,-8427]]},{"type":"Polygon","id":48383,"arcs":[[-8359,-8538,8560,8561,-8552,-8361]]},{"type":"Polygon","id":48475,"arcs":[[-8415,-8369,-8367,-8557,8562,-8417]]},{"type":"Polygon","id":13095,"arcs":[[-8472,8563,8564,8565,-8436,-8451]]},{"type":"Polygon","id":13037,"arcs":[[-8437,-8566,8566,8567,-8500,-8445]]},{"type":"Polygon","id":1045,"arcs":[[-8505,8568,8569,8570,-8385,-8343]]},{"type":"Polygon","id":1031,"arcs":[[8571,8572,-8388,-8386,-8571]]},{"type":"Polygon","id":28037,"arcs":[[-8530,8573,8574,-8522,-8457]]},{"type":"Polygon","id":48403,"arcs":[[-8477,8575,8576,-8558,-8426]]},{"type":"Polygon","id":13277,"arcs":[[-8510,8577,8578,8579,-8469,-8465]]},{"type":"Polygon","id":48225,"arcs":[[8580,8581,8582,8583,-8549,-8373,-8347]]},{"type":"Polygon","id":48095,"arcs":[[-8378,8584,8585,-8535,-8380]]},{"type":"Polygon","id":13229,"arcs":[[-8481,8586,8587,-8531,-8440]]},{"type":"Polygon","id":1039,"arcs":[[-8573,8588,8589,8590,8591,-8520,-8442,-8389]]},{"type":"Polygon","id":48235,"arcs":[[8592,8593,-8561,-8537]]},{"type":"Polygon","id":48005,"arcs":[[-8560,8594,8595,8596,8597,-8581,-8346,-8474]]},{"type":"Polygon","id":13099,"arcs":[[-8568,8598,8599,8600,8601,-8503,-8501]]},{"type":"Polygon","id":48145,"arcs":[[8602,8603,-8461,-8488,8604]]},{"type":"Polygon","id":22079,"arcs":[[-8448,8605,8606,8607,8608,-8337,-8496]]},{"type":"Polygon","id":48307,"arcs":[[-8384,8609,8610,8611,-8585,-8377]]},{"type":"Polygon","id":48411,"arcs":[[-8526,8612,8613,8614,8615,-8610,-8383]]},{"type":"Polygon","id":13019,"arcs":[[-8494,8616,8617,8618,8619,-8578,-8509]]},{"type":"Polygon","id":13299,"arcs":[[-8588,8620,8621,8622,8623,8624,-8492,-8532]]},{"type":"Polygon","id":48281,"arcs":[[8625,8626,-8613,-8525,-8403,-8533]]},{"type":"MultiPolygon","id":13127,"arcs":[[[-8542,8627]],[[8628,-8544,8629,8630,8631,-8479,-8548]]]},{"type":"Polygon","id":13007,"arcs":[[-8565,8632,8633,8634,-8599,-8567]]},{"type":"Polygon","id":13205,"arcs":[[-8471,8635,8636,8637,8638,-8633,-8564]]},{"type":"Polygon","id":28041,"arcs":[[-8541,8639,8640,8641,-8452]]},{"type":"Polygon","id":28035,"arcs":[[8642,8643,8644,8645,-8497,-8486]]},{"type":"Polygon","id":28073,"arcs":[[-8498,-8646,8646,8647,-8506]]},{"type":"Polygon","id":28111,"arcs":[[-8453,-8642,8648,8649,-8643,-8485]]},{"type":"Polygon","id":28091,"arcs":[[-8648,8650,8651,8652,-8517,-8507]]},{"type":"Polygon","id":13003,"arcs":[[-8625,8653,8654,-8617,-8493]]},{"type":"Polygon","id":48455,"arcs":[[8655,8656,8657,-8582,-8598]]},{"type":"Polygon","id":48371,"arcs":[[-8556,8658,8659,8660,8661,-8418,-8563]]},{"type":"Polygon","id":13025,"arcs":[[-8632,8662,8663,-8621,-8587,-8480]]},{"type":"Polygon","id":28157,"arcs":[[-8575,8664,8665,8666,-8512,-8523]]},{"type":"Polygon","id":22115,"arcs":[[-8609,8667,8668,8669,-8475,-8338]]},{"type":"Polygon","id":48395,"arcs":[[8670,8671,8672,-8605,-8490,-8551]]},{"type":"Polygon","id":13075,"arcs":[[8673,8674,8675,-8579,-8620]]},{"type":"Polygon","id":28005,"arcs":[[-8529,8676,8677,8678,8679,-8665,-8574]]},{"type":"Polygon","id":28113,"arcs":[[8680,8681,8682,-8677,-8528]]},{"type":"Polygon","id":28147,"arcs":[[-8653,8683,-8681,-8527,-8518]]},{"type":"Polygon","id":22009,"arcs":[[-8430,-8516,8684,8685,8686,8687,-8606,-8447]]},{"type":"Polygon","id":13071,"arcs":[[-8580,-8676,8688,8689,-8636,-8470]]},{"type":"Polygon","id":48027,"arcs":[[-8604,8690,8691,8692,-8626,-8534,-8462]]},{"type":"MultiPolygon","id":1003,"arcs":[[[8693,8694]],[[-8484,8695,8696,8697,8698,8699,8700,-8539,-8423]]]},{"type":"Polygon","id":1069,"arcs":[[-8602,8701,8702,8703,-8569,-8504]]},{"type":"Polygon","id":1053,"arcs":[[-8592,8704,8705,8706,-8696,-8483,-8521]]},{"type":"Polygon","id":13201,"arcs":[[-8635,8707,8708,-8600]]},{"type":"Polygon","id":1061,"arcs":[[8709,8710,8711,-8589,-8572,-8570,-8704]]},{"type":"Polygon","id":48351,"arcs":[[8712,8713,8714,8715,-8576,-8476,-8670]]},{"type":"Polygon","id":13065,"arcs":[[-8624,8716,8717,8718,8719,-8654]]},{"type":"Polygon","id":13173,"arcs":[[-8720,8720,8721,-8618,-8655]]},{"type":"MultiPolygon","id":1097,"arcs":[[[-8699,8722]],[[8723,8724,8725,-8640,-8540,-8701]]]},{"type":"MultiPolygon","id":13039,"arcs":[[[8726]],[[8727,8728,8729,-8663,-8631]]]},{"type":"Polygon","id":48241,"arcs":[[8730,8731,8732,-8595,-8559,-8577,-8716]]},{"type":"Polygon","id":48373,"arcs":[[8733,8734,8735,8736,-8656,-8597]]},{"type":"Polygon","id":48331,"arcs":[[8737,8738,8739,-8691,-8603,-8673]]},{"type":"Polygon","id":48243,"arcs":[[8740,-8411,-8409,-8419,-8662,8741]]},{"type":"Polygon","id":48313,"arcs":[[8742,8743,8744,-8550,-8584]]},{"type":"Polygon","id":48327,"arcs":[[-8612,8745,8746,8747,-8586]]},{"type":"Polygon","id":48413,"arcs":[[-8748,8748,8749,-8593,-8536]]},{"type":"Polygon","id":48105,"arcs":[[-8553,-8562,-8594,-8750,8750,8751,8752,-8659,-8555]]},{"type":"Polygon","id":13087,"arcs":[[-8634,-8639,8753,8754,8755,-8708]]},{"type":"Polygon","id":13131,"arcs":[[8756,8757,8758,-8754,-8638]]},{"type":"MultiPolygon","id":13027,"arcs":[[[8759,8760]],[[8761,8762,8763,8764,-8689,-8675]]]},{"type":"Polygon","id":13275,"arcs":[[-8690,-8765,8765,8766,-8757,-8637]]},{"type":"Polygon","id":13253,"arcs":[[-8756,8767,8768,-8702,-8601,-8709]]},{"type":"Polygon","id":13049,"arcs":[[8769,8770,-8622,-8664,-8730]]},{"type":"Polygon","id":48457,"arcs":[[-8733,8771,-8734,-8596]]},{"type":"Polygon","id":48471,"arcs":[[8772,8773,8774,-8743,-8583,-8658]]},{"type":"MultiPolygon","id":22125,"arcs":[[[8775,8776,-8513,-8667,8777]],[[8778,-8685,-8515]]]},{"type":"Polygon","id":48053,"arcs":[[-8693,8779,8780,8781,8782,-8614,-8627]]},{"type":"Polygon","id":13185,"arcs":[[-8619,-8722,8783,8784,-8761,8785,-8762,-8674]]},{"type":"Polygon","id":22077,"arcs":[[-8514,-8777,8786,8787,8788,8789,-8686,-8779]]},{"type":"Polygon","id":28109,"arcs":[[-8645,8790,8791,8792,8793,-8651,-8647]]},{"type":"Polygon","id":22117,"arcs":[[-8794,8794,8795,-8682,-8684,-8652]]},{"type":"Polygon","id":22039,"arcs":[[-8688,8796,8797,8798,8799,-8607]]},{"type":"Polygon","id":12063,"arcs":[[-8769,8800,8801,8802,8803,8804,-8710,-8703]]},{"type":"Polygon","id":22105,"arcs":[[-8796,8805,8806,8807,8808,8809,-8678,-8683]]},{"type":"MultiPolygon","id":12033,"arcs":[[[-8695,8810]],[[8811,8812]],[[8813,-8697,-8707,8814]]]},{"type":"MultiPolygon","id":12113,"arcs":[[[8815,-8812,8816,8817]],[[8818,8819,-8815,-8706]]]},{"type":"Polygon","id":28039,"arcs":[[-8726,8820,8821,-8649,-8641]]},{"type":"Polygon","id":22091,"arcs":[[-8810,8822,8823,8824,-8679]]},{"type":"MultiPolygon","id":12091,"arcs":[[[-8818,8825]],[[8826,8827]],[[-8591,8828,8829,-8819,-8705]]]},{"type":"Polygon","id":22037,"arcs":[[-8825,8830,8831,-8778,-8666,-8680]]},{"type":"Polygon","id":12059,"arcs":[[-8805,8832,8833,-8711]]},{"type":"Polygon","id":12131,"arcs":[[-8712,-8834,8834,8835,8836,-8827,8837,-8829,-8590]]},{"type":"Polygon","id":48041,"arcs":[[8838,8839,8840,-8671,-8745]]},{"type":"Polygon","id":48319,"arcs":[[-8616,8841,8842,8843,-8746,-8611]]},{"type":"Polygon","id":48299,"arcs":[[-8783,8844,8845,-8842,-8615]]},{"type":"Polygon","id":28131,"arcs":[[-8822,8846,8847,-8791,-8644,-8650]]},{"type":"Polygon","id":48491,"arcs":[[8848,8849,8850,-8780,-8692,-8740]]},{"type":"Polygon","id":48407,"arcs":[[-8737,8851,8852,-8773,-8657]]},{"type":"Polygon","id":22003,"arcs":[[-8800,8853,8854,-8668,-8608]]},{"type":"Polygon","id":22011,"arcs":[[-8855,8855,8856,-8713,-8669]]},{"type":"Polygon","id":13101,"arcs":[[8857,8858,-8784,-8721,-8719]]},{"type":"Polygon","id":48185,"arcs":[[-8775,8859,8860,8861,-8839,-8744]]},{"type":"Polygon","id":22097,"arcs":[[-8790,8862,8863,8864,-8797,-8687]]},{"type":"Polygon","id":12133,"arcs":[[8865,-8835,-8833,-8804]]},{"type":"MultiPolygon","id":12089,"arcs":[[[-8729,8866,8867,8868,-8770]]]},{"type":"MultiPolygon","id":28059,"arcs":[[[-8725,8869,8870,-8847,-8821]]]},{"type":"Polygon","id":48051,"arcs":[[-8841,8871,8872,-8738,-8672]]},{"type":"Polygon","id":22033,"arcs":[[8873,8874,8875,8876,-8831,-8824]]},{"type":"Polygon","id":22103,"arcs":[[-8793,8877,8878,8879,8880,-8806,-8795]]},{"type":"Polygon","id":12039,"arcs":[[-8759,8881,8882,-8801,-8768,-8755]]},{"type":"Polygon","id":48267,"arcs":[[8883,8884,8885,8886,-8747,-8844]]},{"type":"Polygon","id":48435,"arcs":[[-8887,8887,8888,-8751,-8749]]},{"type":"Polygon","id":12073,"arcs":[[-8767,8889,8890,8891,-8882,-8758]]},{"type":"MultiPolygon","id":28047,"arcs":[[[-8871,8892,8893,-8848]]]},{"type":"Polygon","id":12065,"arcs":[[-8764,8894,8895,8896,8897,-8890,-8766]]},{"type":"Polygon","id":48043,"arcs":[[8898,-8742,-8661,8899,8900]]},{"type":"Polygon","id":22121,"arcs":[[8901,-8787,-8776,-8832,-8877]]},{"type":"Polygon","id":48443,"arcs":[[8902,8903,-8900,-8660,-8753]]},{"type":"Polygon","id":22063,"arcs":[[-8809,8904,8905,-8874,-8823]]},{"type":"Polygon","id":12079,"arcs":[[-8786,-8760,8906,8907,8908,8909,-8895,-8763]]},{"type":"Polygon","id":28045,"arcs":[[-8894,8910,-8878,-8792]]},{"type":"Polygon","id":12047,"arcs":[[-8859,8911,8912,-8907,-8785]]},{"type":"Polygon","id":48377,"arcs":[[-8899,8913,-8741]]},{"type":"Polygon","id":48339,"arcs":[[-8853,8914,8915,8916,-8860,-8774]]},{"type":"Polygon","id":48453,"arcs":[[8917,8918,8919,8920,-8781,-8851]]},{"type":"Polygon","id":12013,"arcs":[[8921,8922,8923,-8802]]},{"type":"Polygon","id":12077,"arcs":[[-8892,8924,8925,8926,-8922,-8883]]},{"type":"Polygon","id":12023,"arcs":[[-8718,8927,8928,8929,8930,8931,-8912,-8858]]},{"type":"MultiPolygon","id":12031,"arcs":[[[8932,8933]],[[8934,8935]],[[8936,8937,8938,-8868]]]},{"type":"Polygon","id":12003,"arcs":[[-8869,-8939,8939,8940,8941,-8928,-8717,-8623,-8771]]},{"type":"MultiPolygon","id":12005,"arcs":[[[8942,8943]],[[-8924,8944,8945,-8836,-8866,-8803]]]},{"type":"Polygon","id":48287,"arcs":[[8946,8947,8948,-8849,-8739,-8873]]},{"type":"Polygon","id":48199,"arcs":[[-8732,8949,8950,8951,-8735,-8772]]},{"type":"Polygon","id":48171,"arcs":[[-8846,8952,8953,8954,-8884,-8843]]},{"type":"Polygon","id":48031,"arcs":[[-8782,-8921,8955,8956,8957,-8953,-8845]]},{"type":"MultiPolygon","id":22099,"arcs":[[[8958,8959,8960]],[[8961,8962,-8863,-8789,8963]]]},{"type":"Polygon","id":22047,"arcs":[[-8902,-8876,8964,8965,8966,-8964,-8788]]},{"type":"Polygon","id":48291,"arcs":[[-8952,8967,8968,8969,-8915,-8852,-8736]]},{"type":"Polygon","id":22019,"arcs":[[8970,8971,8972,-8714,-8857]]},{"type":"Polygon","id":22053,"arcs":[[-8799,8973,8974,8975,-8971,-8856,-8854]]},{"type":"Polygon","id":22001,"arcs":[[-8865,8976,8977,-8974,-8798]]},{"type":"Polygon","id":12121,"arcs":[[-8932,8978,8979,-8908,-8913]]},{"type":"Polygon","id":48021,"arcs":[[8980,8981,-8918,-8850,-8949]]},{"type":"Polygon","id":48477,"arcs":[[-8862,8982,8983,8984,-8947,-8872,-8840]]},{"type":"Polygon","id":22055,"arcs":[[-8963,8985,8986,-8977,-8864]]},{"type":"Polygon","id":48209,"arcs":[[8987,8988,-8956,-8920,8989]]},{"type":"Polygon","id":22005,"arcs":[[-8906,8990,8991,8992,-8965,-8875]]},{"type":"Polygon","id":12123,"arcs":[[8993,8994,8995,-8896,-8910]]},{"type":"MultiPolygon","id":12129,"arcs":[[[-8898,8996,8997,-8925,-8891]]]},{"type":"Polygon","id":22095,"arcs":[[8998,8999,9000,-8991,-8905,-8808]]},{"type":"Polygon","id":48465,"arcs":[[-8889,9001,9002,9003,-8903,-8752]]},{"type":"Polygon","id":48137,"arcs":[[9004,9005,9006,9007,-9002,-8888,-8886]]},{"type":"Polygon","id":48265,"arcs":[[9008,9009,9010,-9005,-8885,-8955]]},{"type":"Polygon","id":12067,"arcs":[[-8980,9011,9012,-8994,-8909]]},{"type":"MultiPolygon","id":12109,"arcs":[[[9013,9014]],[[9015,9016,9017,9018,9019,-8933,9020]],[[-8935,9021]]]},{"type":"Polygon","id":48361,"arcs":[[-8973,9022,9023,-8950,-8731,-8715]]},{"type":"Polygon","id":48473,"arcs":[[9024,9025,9026,-8983,-8861,-8917]]},{"type":"Polygon","id":22089,"arcs":[[9027,-8999,9028]]},{"type":"MultiPolygon","id":22051,"arcs":[[[9029,9030]],[[9031,9032,9033,9034,-9029,-8807,-8881]]]},{"type":"Polygon","id":12045,"arcs":[[-8927,9035,9036,9037,9038,-8943,9039,-8945,-8923]]},{"type":"Polygon","id":22071,"arcs":[[9040,9041,9042,-9032,-8880]]},{"type":"Polygon","id":12019,"arcs":[[9043,9044,9045,-8940,-8938]]},{"type":"Polygon","id":48245,"arcs":[[-9024,9046,9047,9048,-8968,-8951]]},{"type":"MultiPolygon","id":48201,"arcs":[[[9049,9050]],[[-8970,9051,9052,9053,9054,9055,-9025,-8916]]]},{"type":"MultiPolygon","id":22087,"arcs":[[[-9057,-9058,-9059,-9060]],[[9060,9061,9062,9063,9064,9065,9066,-9042,9067]]]},{"type":"Polygon","id":22093,"arcs":[[9068,9069,-8992,-9001]]},{"type":"Polygon","id":48149,"arcs":[[9070,9071,9072,9073,9074,-8981,-8948,-8985]]},{"type":"Polygon","id":22113,"arcs":[[-8987,9075,9076,9077,-8975,-8978]]},{"type":"Polygon","id":12007,"arcs":[[-9046,9078,9079,9080,-8941]]},{"type":"Polygon","id":12125,"arcs":[[-9081,9081,-8929,-8942]]},{"type":"Polygon","id":48259,"arcs":[[-8958,9082,9083,9084,-9009,-8954]]},{"type":"MultiPolygon","id":22045,"arcs":[[[9085]],[[-8967,9086,-8960,9087,9088,-9076,-8986,-8962]]]},{"type":"Polygon","id":48015,"arcs":[[-9027,9089,9090,9091,-9071,-8984]]},{"type":"Polygon","id":22007,"arcs":[[-9070,9092,9093,9094,-8961,-9087,-8966,-8993]]},{"type":"Polygon","id":48385,"arcs":[[-9011,9095,9096,-9006]]},{"type":"Polygon","id":48055,"arcs":[[-8982,-9075,9097,9098,-8990,-8919]]},{"type":"Polygon","id":22023,"arcs":[[-8976,-9078,9099,-9047,-9023,-8972]]},{"type":"Polygon","id":48091,"arcs":[[9100,9101,-9083,-8957,-8989]]},{"type":"MultiPolygon","id":12037,"arcs":[[[9102]],[[-9038,9103]],[[-8998,9104,-9036,-8926]]]},{"type":"Polygon","id":48089,"arcs":[[9105,9106,9107,-9072,-9092]]},{"type":"MultiPolygon","id":22101,"arcs":[[[-9095,9108,9109,-9088,-8959]]]},{"type":"Polygon","id":12001,"arcs":[[-9080,9110,9111,9112,9113,-8930,-9082]]},{"type":"Polygon","id":12041,"arcs":[[-9114,9114,9115,-9012,-8979,-8931]]},{"type":"MultiPolygon","id":22057,"arcs":[[[9116,9117]],[[9118,9119,9120,-9030,9121,9122,9123,9124,9125,9126,9127,-9093,-9069,-9000,-9028,-9035,9128]]]},{"type":"Polygon","id":48019,"arcs":[[9129,-9096,-9010,-9085,9130,9131]]},{"type":"MultiPolygon","id":22075,"arcs":[[[9132]],[[-9059,9133]],[[9134,-9058]],[[9135,-9065]],[[9136,9137,9138,9139,-9033,-9043,-9067,9140]]]},{"type":"MultiPolygon","id":48071,"arcs":[[[-9050,9141]],[[-9049,9142,9143,9144,-9052,-8969]]]},{"type":"Polygon","id":48187,"arcs":[[9145,9146,9147,-9101,-8988,-9099]]},{"type":"MultiPolygon","id":12107,"arcs":[[[-9019,9148,9149,9150]],[[9151,9152,-9111,-9079,-9045]]]},{"type":"Polygon","id":48157,"arcs":[[9153,9154,-9090,-9026,-9056]]},{"type":"Polygon","id":48177,"arcs":[[9155,9156,9157,9158,-9146,-9098,-9074]]},{"type":"MultiPolygon","id":22109,"arcs":[[[9159,-9117]],[[9160,-9124]],[[9161,-9126]],[[9162]],[[9163,9164,9165,9166,9167,-9109,-9094,-9128,9168]]]},{"type":"Polygon","id":48029,"arcs":[[-9148,9169,9170,9171,-9131,-9084,-9102]]},{"type":"Polygon","id":48325,"arcs":[[9172,9173,9174,-9132,-9172]]},{"type":"MultiPolygon","id":12035,"arcs":[[[9175,9176,-9149,-9018]],[[-9016,9177]],[[9178,9179,9180,-9015]]]},{"type":"Polygon","id":48481,"arcs":[[-9155,9181,9182,9183,-9106,-9091]]},{"type":"Polygon","id":48285,"arcs":[[9184,9185,9186,-9156,-9073,-9108]]},{"type":"Polygon","id":48463,"arcs":[[-9175,9187,9188,-9007,-9097,-9130]]},{"type":"Polygon","id":48271,"arcs":[[-9189,9189,9190,-9003,-9008]]},{"type":"MultiPolygon","id":48167,"arcs":[[[9191]],[[9192,9193,-9054,9194]],[[9195,-9144]]]},{"type":"MultiPolygon","id":48039,"arcs":[[[-9194,9196,9197,-9182,-9154,-9055]]]},{"type":"MultiPolygon","id":12075,"arcs":[[[-9113,9198,9199,9200,9201,9202,-9115]]]},{"type":"Polygon","id":12083,"arcs":[[9203,9204,9205,9206,-9199,-9112,-9153]]},{"type":"Polygon","id":48493,"arcs":[[-9159,9207,9208,-9170,-9147]]},{"type":"MultiPolygon","id":12127,"arcs":[[[9209,9210]],[[9211,9212,9213,9214,9215,9216,-9150,-9177,9217]],[[9218,-9180]]]},{"type":"Polygon","id":48123,"arcs":[[9219,9220,-9157,-9187,9221]]},{"type":"Polygon","id":12069,"arcs":[[-9216,9222,9223,9224,9225,-9205,9226]]},{"type":"Polygon","id":48239,"arcs":[[9227,9228,9229,9230,9231,9232,9233,9234,-9185,-9107,-9184]]},{"type":"Polygon","id":48013,"arcs":[[9235,9236,-9173,-9171,-9209,9237,9238]]},{"type":"MultiPolygon","id":48321,"arcs":[[[9239,9240,-9228,-9183,-9198,9241]]]},{"type":"Polygon","id":48255,"arcs":[[9242,9243,-9238,-9208,-9158,-9221,9244]]},{"type":"MultiPolygon","id":48469,"arcs":[[[-9233,9245]],[[-9235,9246,9247,9248,9249,-9222,-9186]]]},{"type":"Polygon","id":48163,"arcs":[[-9237,9250,9251,9252,-9174]]},{"type":"Polygon","id":48507,"arcs":[[-9253,9253,9254,-9188]]},{"type":"Polygon","id":48323,"arcs":[[-9255,9255,9256,9257,-9190]]},{"type":"MultiPolygon","id":12017,"arcs":[[[9258,-9201]],[[-9200,-9207,9259,9260,9261]]]},{"type":"Polygon","id":12119,"arcs":[[-9226,9262,9263,9264,-9260,-9206]]},{"type":"Polygon","id":48175,"arcs":[[-9250,9265,9266,-9245,-9220]]},{"type":"Polygon","id":12117,"arcs":[[9267,-9223,-9215]]},{"type":"MultiPolygon","id":12009,"arcs":[[[9268,9269,9270,9271,-9214]],[[9272,-9210,9273,-9212]]]},{"type":"Polygon","id":48297,"arcs":[[9274,9275,9276,-9239,-9244,9277,9278]]},{"type":"Polygon","id":12095,"arcs":[[-9268,-9272,9279,-9224]]},{"type":"MultiPolygon","id":48057,"arcs":[[[9280,9281,9282]],[[9283,9284,9285]],[[-9241,9286,-9229]],[[9287,-9248,9288]],[[9289,-9231,9290]]]},{"type":"Polygon","id":48025,"arcs":[[-9267,9291,9292,-9278,-9243]]},{"type":"Polygon","id":12053,"arcs":[[-9265,9293,9294,-9261]]},{"type":"Polygon","id":48283,"arcs":[[9295,9296,9297,-9251]]},{"type":"Polygon","id":48311,"arcs":[[-9277,9298,-9296,-9236]]},{"type":"Polygon","id":48127,"arcs":[[-9252,-9298,9299,-9256,-9254]]},{"type":"Polygon","id":48391,"arcs":[[-9288,9300,9301,9302,9303,9304,-9292,-9266,-9249]]},{"type":"MultiPolygon","id":12101,"arcs":[[[9305,9306]],[[-9264,9307,9308,9309,9310,-9294]]]},{"type":"Polygon","id":12105,"arcs":[[9311,9312,9313,9314,-9308,-9263,-9225]]},{"type":"Polygon","id":12097,"arcs":[[-9271,9315,9316,-9312,-9280]]},{"type":"MultiPolygon","id":48007,"arcs":[[[9317,9318]],[[9319]],[[9320,9321,-9304]],[[9322,9323]],[[-9285,9324]],[[9325,-9302,9326,-9282,9327]]]},{"type":"Polygon","id":48479,"arcs":[[9328,9329,9330,9331,-9257,-9300,-9297]]},{"type":"Polygon","id":48409,"arcs":[[-9322,9332,-9323,9333,9334,9335,9336,9337,-9279,-9293,-9305]]},{"type":"MultiPolygon","id":12103,"arcs":[[[-9306,9338]],[[9339,9340,-9310]]]},{"type":"MultiPolygon","id":12057,"arcs":[[[-9315,9341,9342,-9340,-9309]]]},{"type":"Polygon","id":48131,"arcs":[[9343,9344,9345,-9329,-9299,-9276]]},{"type":"Polygon","id":48249,"arcs":[[-9338,9346,9347,9348,-9344,-9275]]},{"type":"MultiPolygon","id":48355,"arcs":[[[9349,9350]],[[9351]],[[-9318,9352]],[[-9335,9353]],[[9354,9355,-9347,-9337,9356]]]},{"type":"MultiPolygon","id":12061,"arcs":[[[9357,9358,-9316,-9270,9359]],[[9360,9361]]]},{"type":"Polygon","id":12055,"arcs":[[9362,9363,9364,9365,-9313]]},{"type":"Polygon","id":12049,"arcs":[[-9366,9366,9367,-9314]]},{"type":"MultiPolygon","id":12081,"arcs":[[[9368,9369]],[[-9368,9370,9371,9372,-9342]]]},{"type":"Polygon","id":12093,"arcs":[[-9359,9373,9374,9375,-9363,-9317]]},{"type":"MultiPolygon","id":48273,"arcs":[[[9376,9377,-9350,9378]],[[9379,9380,9381,-9348,-9356]]]},{"type":"MultiPolygon","id":12111,"arcs":[[[9382,9383]],[[9384,-9361]],[[9385,9386,9387,9388,-9374,-9358]]]},{"type":"MultiPolygon","id":12115,"arcs":[[[9389,9390]],[[-9372,9391,9392,9393,9394,9395]],[[-9369,9396]]]},{"type":"Polygon","id":48247,"arcs":[[9397,9398,9399,-9330,-9346]]},{"type":"Polygon","id":12027,"arcs":[[-9365,9400,-9392,-9371,-9367]]},{"type":"Polygon","id":48505,"arcs":[[-9400,9401,9402,-9331]]},{"type":"MultiPolygon","id":48261,"arcs":[[[9403,9404]],[[9405,9406,9407,9408]],[[9409,9410,9411,9412]],[[9413,9414,-9377,9415]],[[9416,9417,9418,9419,9420,-9381,9421]]]},{"type":"Polygon","id":48047,"arcs":[[-9349,-9382,-9421,9422,9423,-9398,-9345]]},{"type":"MultiPolygon","id":12085,"arcs":[[[9424,9425]],[[9426,9427,9428,9429,9430,-9375,-9389,9431]],[[9432,-9383]],[[9433,-9387]]]},{"type":"Polygon","id":12043,"arcs":[[9434,9435,-9364,-9376]]},{"type":"MultiPolygon","id":12015,"arcs":[[[9436,9437]],[[-9390,9438]],[[-9395,9439]],[[-9436,9440,9441,-9393,-9401]]]},{"type":"MultiPolygon","id":12099,"arcs":[[[-9425,9442]],[[9443,-9427]],[[9444,-9429]],[[9445,9446,9447,-9431]]]},{"type":"Polygon","id":12051,"arcs":[[9448,9449,9450,-9435,-9448]]},{"type":"MultiPolygon","id":12071,"arcs":[[[9451]],[[-9451,9452,9453,-9441]],[[-9438,9454]]]},{"type":"Polygon","id":48427,"arcs":[[-9424,9455,9456,-9402,-9399]]},{"type":"Polygon","id":48215,"arcs":[[-9420,9457,9458,9459,-9456,-9423]]},{"type":"MultiPolygon","id":48489,"arcs":[[[9460,9461]],[[-9404,9462]],[[9463,9464,9465,-9407,9466]],[[9467,9468,9469,9470,-9458,-9419,9471]]]},{"type":"MultiPolygon","id":12021,"arcs":[[[9472,9473]],[[9474,9475,9476,9477,-9453,-9450]]]},{"type":"MultiPolygon","id":48061,"arcs":[[[9478,-9459,-9471,9479]],[[-9461,9480]]]},{"type":"Polygon","id":12011,"arcs":[[9481,9482,-9475,-9449,-9447]]},{"type":"MultiPolygon","id":12086,"arcs":[[[9483,9484,9485,9486,9487,9488,-9476,-9483,9489]]]},{"type":"MultiPolygon","id":12087,"arcs":[[[-9487,9490]],[[-9485,9491]],[[9492]],[[9493,-9474]],[[-9489,9494,-9477]]]},{"type":"Polygon","id":4015,"arcs":[[-5753,-6696,-7333,-6549,-5937,-4613,-5352,-5426]]},{"type":"Polygon","id":12029,"arcs":[[-9116,-9203,9495,-8995,-9013]]},{"type":"Polygon","id":27077,"arcs":[[-123,-170,-106,9496]]},{"type":"Polygon","id":27031,"arcs":[[-192,9497]]},{"type":"Polygon","id":55031,"arcs":[[9498,-654,-647,-573,-462,-137,9499]]},{"type":"Polygon","id":55007,"arcs":[[9500,-652,-9499,9501]]},{"id":55003,"type":"MultiPolygon","arcs":[[[-542,-699,-648,-9501,9502]],[[9503]]]},{"id":26083,"type":"MultiPolygon","arcs":[[[9504,9505,9506]],[[9507]]]},{"id":26061,"type":"MultiPolygon","arcs":[[[-434,-572,-424,9508]],[[9509,-9506]]]},{"type":"Polygon","id":26103,"arcs":[[9510,9511,-694,-621,-567,-432,9512]]},{"type":"Polygon","id":26003,"arcs":[[-558,9513,-9511,9514,-473]]},{"type":"Polygon","id":26041,"arcs":[[-9514,-557,9515,-691,-9512]]},{"type":"Polygon","id":55075,"arcs":[[-693,9516,-855,-666,-683,-619]]},{"type":"Polygon","id":55029,"arcs":[[-1144,9517]]},{"id":26033,"type":"MultiPolygon","arcs":[[[9518,9519]],[[9520]],[[9521,9522,9523,-470,9524]]]},{"id":26097,"type":"MultiPolygon","arcs":[[[9525]],[[9526,-9522]],[[9527,-555,-471,-9524]]]},{"type":"Polygon","id":26047,"arcs":[[-749,9528,9529]]},{"id":26029,"type":"MultiPolygon","arcs":[[[-9529,-748,-928,-925,9530]],[[9531]]]},{"id":26089,"type":"MultiPolygon","arcs":[[[9532]],[[9533,-1088,9534]]]},{"type":"Polygon","id":26055,"arcs":[[-923,-1056,-1204,-1085,-9534,9535]]},{"type":"Polygon","id":26007,"arcs":[[9536,-1053,-929,-797]]},{"type":"Polygon","id":26011,"arcs":[[9537,-1413,-1374,-1214,-1212]]},{"type":"Polygon","id":26063,"arcs":[[-1552,-1530,9538]]},{"type":"Polygon","id":26147,"arcs":[[-1903,-1700,-1550,9539]]},{"type":"Polygon","id":26163,"arcs":[[9540,9541,-2106,-1904,-1901]]},{"id":26115,"type":"MultiPolygon","arcs":[[[-2482,9542]],[[9543,-2480]],[[9544,-2478,-2253,-2103,-9542]]]},{"type":"MultiPolygon","id":45019,"arcs":[[[9545,-7886,9546,-7888,-7834,-7720]],[[9547,-7615]],[[9548,-7718,-7618,9549]]]},{"type":"Polygon","id":15005,"arcs":[[9550,9551]]},{"type":"Polygon","id":15001,"arcs":[[9552]]},{"id":15007,"type":"MultiPolygon","arcs":[[[9553]],[[9554]]]},{"id":15009,"type":"MultiPolygon","arcs":[[[-9551,9555]],[[9556]],[[9557]],[[9558]]]},{"type":"Polygon","id":15003,"arcs":[[9559]]},{"type":"MultiPolygon","id":2016,"arcs":[[[9560]],[[9561]],[[9562]],[[9563]],[[9564]],[[9565]],[[9566]],[[9567]],[[9568]],[[9569]],[[9570]],[[9571]],[[9572]],[[9573]],[[9574]],[[9575]],[[9576]],[[9577]],[[9578]],[[9579]],[[9580]],[[9581]],[[9582]],[[9583]]]},{"type":"MultiPolygon","id":2013,"arcs":[[[9584]],[[9585]],[[9586]],[[9587]],[[9588]],[[9589]],[[9590]],[[9591]],[[9592]],[[9593]],[[9594]],[[9595]],[[9596,9597,9598,9599]]]},{"type":"MultiPolygon","id":2130,"arcs":[[[9600]],[[9601]]]},{"type":"Polygon","id":2060,"arcs":[[9602,9603]]},{"type":"MultiPolygon","id":2070,"arcs":[[[9604]],[[9605,9606]],[[9607,9608,9609,9610,9611,9612]]]},{"type":"MultiPolygon","id":2164,"arcs":[[[9613]],[[-9597,9614]],[[9615,9616,9617,-9599,9618,-9604,9619,-9612,9620]]]},{"type":"MultiPolygon","id":2150,"arcs":[[[9621]],[[9622]],[[9623]],[[9624]],[[9625]],[[9626]],[[9627]],[[9628]],[[9629]],[[9630]],[[9631,-9617,9632,9633]]]},{"type":"MultiPolygon","id":2110,"arcs":[[[9634,9635]],[[9636,9637]],[[9638,9639,9640,9641]],[[9642]],[[9643,9644,9645,9646,9647,9648]],[[9649,9650]]]},{"type":"MultiPolygon","id":2280,"arcs":[[[9651]],[[9652,9653]],[[9654]],[[9655]],[[9656]],[[9657]],[[9658]],[[9659]],[[9660,9661,9662,9663]]]},{"type":"MultiPolygon","id":2232,"arcs":[[[-9647,9664]],[[9665,9666,9667,9668]],[[9669]],[[-9664,9670,-9635,9671,-9645,9672]],[[-9639,9673,-9637,9674]],[[9675,9676,9677,9678,9679]],[[9680,9681]],[[-9641,9682]],[[9683,9684,9685,9686,9687]],[[9688,9689,9690,9691]]]},{"type":"MultiPolygon","id":2100,"arcs":[[[-9681,9692]],[[-9649,9693,-9650,9694,-9689,9695]],[[9696,-9687,9697,-9691]]]},{"type":"MultiPolygon","id":2220,"arcs":[[[9698]],[[9699,-9653,9700]],[[-9668,9701]],[[9702,-9666,9703,-9679,9704]]]},{"type":"MultiPolygon","id":2270,"arcs":[[[9705]],[[9706]],[[9707]],[[9708,9709,9710,9711]]]},{"type":"MultiPolygon","id":2050,"arcs":[[[9712]],[[9713]],[[9714]],[[9715]],[[9716,-9711,9717,9718,9719,-9621,-9611,9720,-9607,9721]]]},{"type":"Polygon","id":2170,"arcs":[[9722,9723,9724,9725,-9719,9726,9727,9728]]},{"type":"Polygon","id":2068,"arcs":[[9729,9730,-9728,9731]]},{"type":"MultiPolygon","id":2020,"arcs":[[[-9724,9732,9733,9734]]]},{"type":"MultiPolygon","id":2261,"arcs":[[[9735]],[[9736]],[[9737]],[[9738]],[[9739]],[[9740]],[[9741]],[[9742]],[[9743,9744]],[[9745]],[[9746]],[[9747,9748]],[[9749]],[[9750,9751]],[[9752]],[[9753,9754,-9733,-9723,9755,9756,9757,9758]]]},{"type":"MultiPolygon","id":2122,"arcs":[[[9759,-9634]],[[9760]],[[9761]],[[9762]],[[9763,-9748]],[[-9734,-9755,9764,-9751,9765,-9744,9766]],[[-9633,-9616,-9720,-9726,9767]]]},{"type":"MultiPolygon","id":2282,"arcs":[[[9768,9769,-9758,9770,-9685,9771]]]},{"type":"Polygon","id":2290,"arcs":[[9772,9773,9774,-9732,-9727,-9718,-9710,9775,9776,9777]]},{"type":"Polygon","id":2090,"arcs":[[9778,-9730,-9775]]},{"type":"Polygon","id":2240,"arcs":[[-9756,-9729,-9731,-9779,-9774,9779]]},{"type":"MultiPolygon","id":2185,"arcs":[[[9780]],[[9781,-9778,9782,9783]]]},{"type":"MultiPolygon","id":2188,"arcs":[[[-9777,9784,9785,-9783]]]},{"type":"MultiPolygon","id":2180,"arcs":[[[9786]],[[9787]],[[9788]],[[9789,-9785,-9776,-9709,9790]]]},{"id":2201,"type":"MultiPolygon","arcs":[[[9791]],[[9792]],[[9793]],[[9794]],[[9795]],[[9796]],[[9797]],[[9798]],[[9799]],[[9800]],[[9801]],[[9802]],[[9803]],[[9804]],[[9805]],[[-9662,9806]]]},{"type":"Polygon","id":72125,"arcs":[[9807,9808,9809,9810,9811,9812]]},{"type":"Polygon","id":72003,"arcs":[[9813,9814,9815,9816,9817]]},{"type":"Polygon","id":72097,"arcs":[[9818,9819,-9813,9820,9821,9822,9823]]},{"type":"Polygon","id":72065,"arcs":[[9824,9825,9826,9827,9828]]},{"type":"Polygon","id":72055,"arcs":[[9829,9830,9831,9832]]},{"type":"Polygon","id":72083,"arcs":[[9833,9834,-9819,9835,9836]]},{"type":"Polygon","id":72025,"arcs":[[9837,9838,9839,9840,9841,9842,9843]]},{"type":"Polygon","id":72045,"arcs":[[9844,9845,9846,9847,9848]]},{"type":"Polygon","id":72133,"arcs":[[9849,9850,9851,9852]]},{"type":"Polygon","id":72121,"arcs":[[-9833,9853,-9809,9854,9855]]},{"type":"Polygon","id":72027,"arcs":[[-9828,9856,9857,9858,9859]]},{"type":"Polygon","id":72033,"arcs":[[9860,9861,9862,9863]]},{"type":"Polygon","id":72001,"arcs":[[9864,9865,9866,9867,9868,9869]]},{"type":"Polygon","id":72111,"arcs":[[9870,9871,9872,-9866]]},{"type":"Polygon","id":72047,"arcs":[[9873,9874,9875,9876,9877,9878]]},{"type":"Polygon","id":72091,"arcs":[[9879,9880,9881,9882,9883,9884]]},{"type":"Polygon","id":72013,"arcs":[[9885,9886,9887,9888,-9825,9889]]},{"type":"Polygon","id":72145,"arcs":[[9890,9891,-9880,9892]]},{"type":"Polygon","id":72031,"arcs":[[9893,9894,9895,9896,9897,9898]]},{"type":"Polygon","id":72061,"arcs":[[9899,9900,9901,-9861,9902]]},{"type":"Polygon","id":72129,"arcs":[[9903,9904,9905,9906,9907,-9840,9908]]},{"type":"MultiPolygon","id":72075,"arcs":[[[9909,9910,-9853,9911,9912,9913,9914]]]},{"type":"Polygon","id":72063,"arcs":[[-9895,9915,-9909,-9839,9916]]},{"type":"Polygon","id":72073,"arcs":[[9917,-9914,9918,9919,9920]]},{"type":"Polygon","id":72143,"arcs":[[9921,9922,-9878,9923,-9891,9924]]},{"type":"Polygon","id":72011,"arcs":[[9925,-9836,-9824,9926,9927,-9815,9928]]},{"type":"Polygon","id":72081,"arcs":[[-9827,9929,-9869,9930,9931,-9834,9932,-9857]]},{"type":"Polygon","id":72015,"arcs":[[9933,9934,9935]]},{"type":"Polygon","id":72079,"arcs":[[-9854,-9832,9936,9937,-9810]]},{"type":"Polygon","id":72009,"arcs":[[9938,9939,9940,9941,9942]]},{"type":"Polygon","id":72099,"arcs":[[9943,9944,-9929,-9814,9945]]},{"type":"Polygon","id":72023,"arcs":[[9946,-9811,-9938,9947,-9822]]},{"type":"Polygon","id":72109,"arcs":[[9948,9949,9950,-9936,9951,9952,-9907]]},{"type":"Polygon","id":72101,"arcs":[[-9924,-9877,9953,9954,-9881,-9892]]},{"type":"Polygon","id":72117,"arcs":[[-9928,9955,-9816]]},{"type":"Polygon","id":72005,"arcs":[[-9946,-9818,9956,9957]]},{"type":"Polygon","id":72059,"arcs":[[-9873,9958,9959,-9867]]},{"type":"Polygon","id":72021,"arcs":[[-9902,9960,-9845,9961,9962,9963,-9862]]},{"type":"Polygon","id":72141,"arcs":[[9964,-9920,9965,-9870,-9930,-9826,-9889]]},{"type":"Polygon","id":72041,"arcs":[[-9842,9966,-9943,9967,-9847,9968]]},{"type":"Polygon","id":72123,"arcs":[[9969,9970,-9851,9971,-9940,9972]]},{"type":"Polygon","id":72131,"arcs":[[9973,-9858,-9933,-9837,-9926,-9945,9974]]},{"type":"Polygon","id":72035,"arcs":[[-9908,-9953,9975,-9973,-9939,-9967,-9841]]},{"type":"Polygon","id":72135,"arcs":[[-9963,9976,-9879,-9923,9977,9978]]},{"type":"Polygon","id":72115,"arcs":[[-9859,-9974,9979,9980]]},{"type":"Polygon","id":72054,"arcs":[[-9883,9981,-9887,9982]]},{"type":"Polygon","id":72105,"arcs":[[-9962,-9849,9983,-9874,-9977]]},{"type":"Polygon","id":72017,"arcs":[[-9884,-9983,-9886,9984]]},{"type":"Polygon","id":72127,"arcs":[[-9897,9985,-9844,9986,-9900,9987]]},{"type":"Polygon","id":72139,"arcs":[[-9896,-9917,-9838,-9986]]},{"type":"Polygon","id":72057,"arcs":[[-9952,-9935,9988,-9970,-9976]]},{"type":"Polygon","id":72153,"arcs":[[-9868,-9960,9989,-9830,-9856,9990,-9931]]},{"type":"Polygon","id":72043,"arcs":[[9991,9992,-9941,-9972,-9850,-9911,9993]]},{"type":"Polygon","id":72149,"arcs":[[-9994,-9910,9994]]},{"type":"Polygon","id":72039,"arcs":[[-9955,9995,-9921,-9965,-9888,-9982,-9882]]},{"type":"MultiPolygon","id":72113,"arcs":[[[-9913,9996,-9871,-9865,-9966,-9919]]]},{"type":"Polygon","id":72107,"arcs":[[9997,-9992,-9995,-9915,-9918,-9996,-9954,-9876]]},{"type":"Polygon","id":72067,"arcs":[[-9812,-9947,-9821]]},{"type":"Polygon","id":72071,"arcs":[[-9980,-9975,-9944,-9958,9998]]},{"type":"Polygon","id":72007,"arcs":[[-9843,-9969,-9846,-9961,-9901,-9987]]},{"type":"Polygon","id":72019,"arcs":[[-9848,-9968,-9942,-9993,-9998,-9875,-9984]]},{"type":"Polygon","id":72093,"arcs":[[-9932,-9991,-9855,-9808,-9820,-9835]]},{"type":"Polygon","id":72151,"arcs":[[9999,10000,10001,-9949,-9906,10002]]},{"type":"Polygon","id":72137,"arcs":[[-9863,-9964,-9979,10003,10004]]},{"type":"Polygon","id":78030,"arcs":[[10005]]},{"type":"Polygon","id":72089,"arcs":[[10006,10007,10008,10009]]},{"type":"Polygon","id":72087,"arcs":[[10010,10011,-9899,10012]]},{"type":"Polygon","id":72095,"arcs":[[10013,-9950,-10002]]},{"type":"Polygon","id":72119,"arcs":[[-10009,10014,10015,10016,10017,-10011,10018]]},{"type":"Polygon","id":72103,"arcs":[[10019,10020,10021,10022,-10016]]},{"type":"Polygon","id":72085,"arcs":[[-10023,10023,-10003,-9905,10024,10025,-10017]]},{"type":"Polygon","id":72029,"arcs":[[-10018,-10026,10026,-9894,-10012]]},{"type":"MultiPolygon","id":72053,"arcs":[[[10027,-10007,10028]]]},{"type":"Polygon","id":72077,"arcs":[[-10025,-9904,-9916,-10027]]},{"type":"MultiPolygon","id":72037,"arcs":[[[10029,-10020,-10015,-10008,-10028]]]},{"type":"Polygon","id":72069,"arcs":[[10030,-10000,-10024,-10022]]},{"type":"Polygon","id":72147,"arcs":[[10031]]},{"type":"Polygon","id":78010,"arcs":[[10032]]},{"type":"Polygon","id":72051,"arcs":[[-10004,-9978,-9922,10033]]}]},"states":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","arcs":[[[6960,-6779,-6725,-6740,-6751,-6750,-6812,-6811,-6818,-6817,-6833,6996,-7015,-7019,7048,-7189,-7192,7226,-7446,7518,7519,-7600,7723,7724,-7870,7896,-8039,8080,-8132,-8178,8215,-8312,8339,8340,-8502,8502,-8602,8701,8702,8709,8710,8711,8589,8590,8704,8705,8706,8696,8697,8722,8699,8723,8724,8725,-8640,8540,-8455,8270,8271,-8148,7976,7977,-7850,7703,-7627,7474,-7447,7327,-7278,7200,-6974,-6977]],[[8693,8694]]],"id":1},{"type":"MultiPolygon","arcs":[[[9560]],[[9561]],[[9562]],[[9563]],[[9564]],[[9565]],[[9566]],[[9567]],[[9568]],[[9569]],[[9570]],[[9571]],[[9572]],[[9573]],[[9574]],[[9575]],[[9576]],[[9577]],[[9578]],[[9579]],[[9580]],[[9581]],[[9582]],[[9583]],[[9584]],[[9585]],[[9586]],[[9587]],[[9588]],[[9589]],[[9590]],[[9591]],[[9592]],[[9593]],[[9594]],[[9595]],[[9597,9618,9602,9619,9612,9607,9608,9609,9720,9605,9721,9716,9711,9790,9789,9785,9783,9781,9772,9779,9756,9770,9685,9697,9691,9695,9643,9672,9660,9806,9662,9670,9635,9671,9645,9664,9647,9693,9650,9694,9689,9696,9687,9683,9771,9768,9769,9758,9753,9764,9751,9765,9744,9766,9734,9724,9767,9759,9631,9617,9599,9614]],[[9600]],[[9601]],[[9604]],[[9613]],[[9621]],[[9622]],[[9623]],[[9624]],[[9625]],[[9626]],[[9627]],[[9628]],[[9629]],[[9630]],[[9641,9673,9637,9674,9639,9682]],[[9642]],[[9651]],[[9699,9653,9700]],[[9654]],[[9655]],[[9656]],[[9657]],[[9658]],[[9659]],[[9675,9676,9677,9704,9702,9666,9701,9668,9703,9679]],[[9669]],[[9681,9692]],[[9698]],[[9705]],[[9706]],[[9707]],[[9712]],[[9713]],[[9714]],[[9715]],[[9735]],[[9736]],[[9737]],[[9738]],[[9739]],[[9740]],[[9741]],[[9742]],[[9745]],[[9746]],[[9748,9763]],[[9749]],[[9752]],[[9760]],[[9761]],[[9762]],[[9780]],[[9786]],[[9787]],[[9788]],[[9791]],[[9792]],[[9793]],[[9794]],[[9795]],[[9796]],[[9797]],[[9798]],[[9799]],[[9800]],[[9801]],[[9802]],[[9803]],[[9804]],[[9805]]],"id":2},{"type":"MultiPolygon","arcs":[[[-5794,5794,5795,5796,-7198,7619,7620,-8060,8229,8523,8212,7750,7751,7330,7331,-6550,-6549,-5937,-4613,-5352,-5426,-5425,-4742,-4741,-4740]]],"id":4},{"type":"MultiPolygon","arcs":[[[-5831,-5946,-5945,-5944,-5957,-5956,-5955,-5732,-5915,-5914,-5913,-5942,-5941,-5888,-5999,-5998,-5997,-5996,-6190,-6303,6435,6436,6437,6438,-6633,6760,6761,6762,7036,-7048,7153,7154,-7441,-7440,7688,7689,7690,7691,7692,7802,7819,7820,7758,7759,7744,7745,7669,7670,7671,-7638,7539,-7254,-7253,7139,-6801,-6800,6753,-6638,6578,-6344,6280,6144,-5971,-5961,-5861,-5860]]],"id":5},{"type":"MultiPolygon","arcs":[[[-1578,2356,-2368,-2367,-2366,-2365,4113,4114,-4294,-4293,-4292,-3783,-4308,4555,-4763,-4239,5475,-5938,6548,6549,-7332,-7331,-7752,7765,7722,7545,7076,7041,6922,6556,5900,5619,5299,5203,5296,5447,5164,5019,4847,4539,4685,4457,4684,4459,4467,4841,4469,3604,2658,2346,-1865,-1947,-1946,-1854,-1575,-1574]],[[6919]],[[6920]],[[7040]],[[7073]],[[7074]]],"id":6},{"type":"MultiPolygon","arcs":[[[-2525,-2706,-2705,-2675,-2674,-2799,-2948,-2947,3119,-3174,3341,3342,-3598,3920,3921,-4261,4340,-4580,-4579,4881,4882,-5255,5325,5326,5327,5217,5218,5315,5316,5520,5521,5506,5507,5331,5329,-4739,-4738,-4737,4616,-4007,3557,-3077,-3076,2957,2958,-2168,-2110,-2109,-2108,-2114,-2113,-2526]]],"id":8},{"type":"MultiPolygon","arcs":[[[-2145,-1989,-1988,2290,2291,-2430,2499,2500,2532,2534,2531,2535,2520,2521,2522,-2258,-2257,-1970,-2147,-2146]]],"id":9},{"type":"MultiPolygon","arcs":[[[3730,3731]],[[3732,3733]],[[4084,4085,-4061,3736,3737,-3477,-3567,-3475,-3566,3734,4086,4378,4379,4380,4381,4382,4383,-4251]]],"id":10},{"type":"MultiPolygon","arcs":[[[4371,4372,-4099,-4281]]],"id":11},{"type":"MultiPolygon","arcs":[[[-8759,-8758,-8767,-8766,-8764,-8763,-8786,-8760,-8785,-8859,-8858,-8718,-8717,-8623,-8771,-8770,-8729,8866,8936,9043,9151,9203,9226,9216,9150,9019,8933,9020,9177,9016,9175,9217,9272,9210,9273,9212,9268,9359,9385,9433,9387,9431,9443,9427,9444,9429,9445,9481,9489,9483,9491,9485,9490,9487,9494,9477,9453,9441,9393,9439,9395,9372,9342,9340,9310,9294,9261,9258,9201,9495,8995,8896,8996,9104,9036,9103,9038,8943,9039,8945,8836,8827,8837,8829,8819,8813,-8697,-8707,-8706,-8705,-8591,-8590,-8712,-8711,-8710,-8703,-8769,-8768,-8755]],[[-8695,8810]],[[8815,8812,8816,8825]],[[8935,9021]],[[9180,9013,9178,9218]],[[9102]],[[9306,9338]],[[9361,9384]],[[9369,9396]],[[9383,9432]],[[9390,9438]],[[9425,9442]],[[9436,9454]],[[9451]],[[9472,9493]],[[9492]]],"id":12},{"type":"MultiPolygon","arcs":[[[-6945,-6944,-6943,-7081,-7080,-7277,7366,-7464,-7463,-7510,-7509,-7568,-7567,-7736,7845,-7893,7916,-7923,-8076,-8075,8304,8299,8355,8352,8546,8628,8544,8629,8727,8728,8769,8770,8622,8716,8717,8857,8858,8784,8759,8785,8762,8763,8765,8766,8757,8758,8754,8767,8768,-8702,8601,-8503,8501,-8341,-8340,8311,-8216,8177,8131,-8081,8038,-7897,7869,-7725,-7724,7599,-7520,-7519,7445,-7227,7191,7188,-7049,7018,7014,-6997,-6832,-6747,-6746,-6745,-6821,-6820,-6854,-6853,-6849,-6848,-6909,-6908,-6907,-6828,-6699,-6947,-6946]],[[8302]],[[8303]],[[8351]],[[8542,8627]],[[8545]],[[8726]]],"id":13},{"type":"MultiPolygon","arcs":[[[9551,9555]],[[9552]],[[9553]],[[9554]],[[9556]],[[9557]],[[9558]],[[9559]]],"id":15},{"type":"MultiPolygon","arcs":[[[-338,-317,-316,500,-510,-715,-714,-713,-736,-631,1095,-1149,-1148,1566,-1708,-1707,2023,2114,2078,2079,1992,1993,1868,1554,1555,-1237,-1236,-1235,1065,-945,889,-688,504,517,518,-384,-383,352,-237,-236,112,-80,21,22,19,-34,109,-191,229]]],"id":16},{"type":"MultiPolygon","arcs":[[[-1919,-1925,-1924,-1932,-1931,-2001,-2000,2087,2207,2208,2483,-2506,2748,-2801,2932,-3136,3303,3304,-3526,3705,-3900,4008,-4157,4222,-4431,-4430,4671,-4693,4908,-4932,5144,-5180,5367,5368,5370,-5502,5572,5584,5585,5578,5579,5580,-5360,-5359,-5169,5134,4937,4938,4713,4714,-4442,-4441,-4509,4365,4366,4367,4149,4052,4053,-3910,3728,3729,-3663,3495,-3471,3221,3222,-3095,2902,-2898,2740,-2691,2422,2423,2424,-2288,-2287,2203,-2133,2068,-1995,-1752,-1940,-1939,-1920]]],"id":17},{"type":"MultiPolygon","arcs":[[[-2264,-2269,2443,-2512,2593,-2690,2769,2770,-2995,3015,-3148,3271,-3385,-3384,3592,-3694,3789,-3913,-4123,4128,-4250,-4249,4410,4411,4419,4420,-4544,4647,4648,4799,4792,4793,4794,4789,4895,4896,4897,4955,4956,4925,4926,4975,4929,4930,4931,-4909,4692,-4672,4429,4430,-4223,4156,-4009,3899,-3706,3525,-3305,-3304,3135,-2933,2800,-2749,2505,-2484,-2209,2506,2508,2440,-2178,-2177,-2274,-2273,-2271,-2270,-2265]]],"id":18},{"type":"MultiPolygon","arcs":[[[-1475,-1474,-1487,-1486,-1479,-1478,-1539,1628,-1670,-1754,-1753,1994,-2069,2132,-2204,2286,2287,-2425,-2424,-2423,2690,-2741,2897,-2903,3094,3095,3055,3056,3058,3059,3070,3071,3068,3069,3065,3066,3062,3063,3052,3053,3049,3050,3046,3047,-2910,2856,-2805,2631,2632,-2516,2389,-2278,2181,-2165,2036,2037,-1806,-1805,1730,-1634,1625,-1495,-1464,-1468,-1467,-1491,-1490,-1489,-1500,-1499,-1493,-1492,-1471,-1470,-1476]]],"id":19},{"type":"MultiPolygon","arcs":[[[-3407,-3406,-3401,-3400,-3411,-3410,-3391,-3390,-3388,-3387,-3395,-3394,-3404,-3405,-3297,-3296,-3464,-3463,-3468,-3467,-3466,-3470,-3541,3642,-3743,3865,-3984,-3983,-4028,-4183,-4182,4332,-4487,4533,-4762,4814,-5045,-5044,5308,5309,-5554,5566,5567,5568,5541,5542,5533,5534,5604,5605,5455,5456,5458,5459,5536,5537,5468,5469,5538,5539,5465,5466,5462,5530,5531,5529,5526,5527,-5326,5254,-4883,-4882,4578,4579,-4341,4260,-3922,-3921,3597,-3343,-3398,-3397,-3409]]],"id":20},{"type":"MultiPolygon","arcs":[[[-4120,-4145,-4144,-4143,-4166,-4165,-4337,-4336,-4359,-4358,-4484,-4483,4732,-4799,-4798,-5111,-5110,5243,5244,5245,5624,-5656,5742,5844,5845,5834,5835,5842,5843,5822,5823,5909,5910,5853,5938,5939,5856,5857,5918,5919,5712,5714,5715,5675,5676,5753,5962,5963,5849,5850,5957,5958,5983,5984,-5924,-5725,-5724,-5723,5645,-5579,-5586,-5585,-5573,5501,-5371,-5369,-5368,5179,-5145,-4931,-4930,-4976,-4927,-4926,-4957,-4956,-4898,-4897,-4896,-4790,-4795,-4794,-4793,-4800,-4649,-4648,4543,-4421,-4420,-4412,-4411,4248,4249,-4129,-4122,-4121]],[[5982,-5926]]],"id":21},{"type":"MultiPolygon","arcs":[[[7929,7930,7931,-7844,-7671,-7670,-7746,-7745,-7760,-7759,-7821,-7820,-7803,-7693,-7692,-7691,-7950,7965,-8130,-8129,-8128,-8127,8293,8294,8295,8510,8511,-8667,-8666,-8680,-8679,-8678,-8683,-8682,-8684,-8652,-8794,-8793,8877,8878,9040,9067,9060,9061,9062,9063,9135,9065,9140,9136,9137,9138,9139,9033,9128,9118,9119,9120,9030,9121,9122,9160,9124,9161,9126,9168,9163,9164,9165,9166,9167,9109,9088,9076,9099,-9047,-9023,8972,-8714,-8713,8669,8475,8476,-8425,8258,-8244]],[[9133,9134],[-9057],[-9060]],[[9085]],[[9117,9159]],[[9132]],[[9162]]],"id":22},{"type":"MultiPolygon","arcs":[[[895,578,1091,1255,1259,1365,1363,1364,1261,1108,1366,1353,1362,1355,1511,1512,-1273,864,865,866,795,548,348,791]],[[893]],[[894]]],"id":23},{"type":"MultiPolygon","arcs":[[[-3480,-3479,-3427,-3426,-3478,-3738,-3737,4060,-4086,-4085,4250,-4384,-4383,-4382,4778,4774,4775,4776,4860,4859,4678,4569,4567,4252,4394,4153,4062,3805,3815,3821,4072,4177,4071,4178,4174,4509,4277,4601,4719,4718,4603,4279,4280,4098,4099,4100,3830,3792,3793,3794,3795,3797,3798,3799,3801,3802,3803,-3527,-3439,-3438,-3423,-3517,-3516,-3436,-3435,-3564,-3563,-3481]],[[4150]],[[4771,4772]],[[-4380,4773]],[[4850,4851]],[[4852,4853,4854,4855]],[[4856,4857,4858]]],"id":24},{"type":"MultiPolygon","arcs":[[[1977,2092,1979,2089,2140,2151,2138,2147,2261,2260,2149,2221,2222,2223,2224,2225,2143,1986,1987,1988,2144,2145,2146,1969,1970,1971,-1859,-1711,-1710,-1728,-1780,-1779,-1757,-1756,-1755,-1723,1906,2093]],[[2604]],[[2700]]],"id":25},{"type":"MultiPolygon","arcs":[[[464,465,466,422,9508,434,9512,9514,473,9524,9526,9522,9527,555,9515,691,692,618,619,568,569,570]],[[9536,1049,1210,9537,1408,1534,9538,1552,9539,1899,9540,9544,-2478,2253,2254,2266,2267,2268,2263,2264,2269,2270,2272,2273,2176,2177,2178,2124,1960,1759,1660,1507,1351,1199,1086,9534,9535,923,9530,9529,749,798]],[[9506,9504,9509]],[[9507]],[[9518,9519]],[[9520]],[[9525]],[[9531]],[[9532]],[[-2482,9542]],[[9543,-2480]]],"id":26},{"type":"MultiPolygon","arcs":[[[9496,123,140,193,9497,192,135,136,461,572,573,-646,772,-778,876,877,1025,-1049,1113,-1137,-1162,-1161,-1165,1343,-1397,1476,1477,1478,1485,1486,1473,1474,1475,1469,1470,1491,1492,1498,1499,1488,1489,1490,1466,1467,1463,1464,1309,-1194,1154,-1019,-1018,892,-868,817,-724,681,-533,528,403,-392,336,-306,207,-199,153,154,-53,58,104]]],"id":27},{"type":"MultiPolygon","arcs":[[[-6767,-6799,-6781,-6780,-6961,6976,6973,-7201,7277,-7328,7446,-7475,7626,-7704,7849,-7978,-7977,8147,-8272,-8271,8454,-8541,8639,-8726,-8725,8869,8892,8910,-8878,8792,8793,8651,8683,8681,8682,8677,8678,8679,8665,8666,-8512,-8511,-8296,-8295,-8294,8126,8127,8128,8129,-7966,7949,-7690,-7689,7439,7440,-7155,-7154,7047,-7037,-6763,-6762,-6794,-6793,-6798,-6797,-6769,-6768]]],"id":28},{"type":"MultiPolygon","arcs":[[[-3496,3662,-3730,-3729,3909,-4054,-4053,-4150,-4368,-4367,-4366,4508,4440,4441,-4715,-4714,-4939,-4938,-5135,5168,5358,5359,-5581,-5580,-5646,5722,5723,5724,5923,5924,5925,5926,-6128,6188,6189,5995,5996,5997,5998,5887,5940,5941,5912,5913,5914,5731,5954,5955,5956,5943,5944,5945,5830,5859,5860,5960,5961,-5781,5735,-5567,5553,-5310,-5309,5043,5044,-4815,4761,-4534,4486,-4333,4181,4182,4027,3982,3983,-3866,3742,-3643,3540,3469,-3465,-3284,3253,-3109,-3047,-3051,-3050,-3054,-3053,-3064,-3063,-3067,-3066,-3070,-3069,-3072,-3071,-3060,-3059,-3057,-3056,-3096,-3223,-3222,3470]]],"id":29},{"type":"MultiPolygon","arcs":[[[108,-91,106,-131,210,-220,361,-369,496,497,498,654,655,656,741,742,743,676,677,804,805,634,628,629,630,735,712,713,714,509,-501,315,316,337,-230,190,-110,33,-20,34,18,41,97,86,44,48,27,8,51]]],"id":30},{"type":"MultiPolygon","arcs":[[[1833,-1618,-1658,-1657,-1548,-1547,-1683,-1684,-1526,-1656,-1655,-1646,-1645,-1785,-1783,-1782,-1811,-1810,-1808,-1807,-2038,-2037,2164,-2182,2277,-2390,2515,-2633,-2632,2804,-2857,2909,-3048,3108,-3254,3283,3464,3465,3466,3467,3462,3463,3295,3296,3404,3403,3393,3394,3386,3387,3389,3390,3409,3410,3399,3400,3405,3406,3408,3396,3397,-3342,3173,-3120,2946,2947,2798,2673,2674,2704,2705,-2524,2514,-2019,-2018]]],"id":31},{"type":"MultiPolygon","arcs":[[[-1402,-1238,-1556,-1555,-1869,-1994,-2330,2334,-2897,3541,3542,-3979,4609,4610,4611,4612,5936,5937,-5476,4238,4762,-4556,4307,3782,4291,4292,4293,-4115,-4114,2364,2365,2366,2367,-2357,-1577,-1403]]],"id":32},{"type":"MultiPolygon","arcs":[[[-1513,1589,1721,1722,1754,1755,1756,1778,1779,-1727,1588,-1430,1243,1244,-1089,-971,874,875,-866,-865,1272]]],"id":33},{"type":"MultiPolygon","arcs":[[[-2743,2873,3093,3043,3136,3236,3325,3511,3501,3786,4108,3927,3924,3765,3925,3768,-3732,3769,-3734,3770,3704,3646,3504,3505,-3234,-3233,3104,2887,2888,-2790,2730,-2575,-2542,-2541,-2744]]],"id":34},{"type":"MultiPolygon","arcs":[[[-5316,-5219,-5218,-5328,5799,5800,5801,-6401,6582,6583,-6887,7029,7030,7177,7178,-7589,7679,7680,7681,7682,7683,7989,7990,7991,7808,7809,7810,7913,7914,8132,8058,8059,-7621,-7620,7197,-5797,-5796,-5795,5793,-5330,-5332,-5508,-5507,-5522,-5521,-5317]]],"id":35},{"type":"MultiPolygon","arcs":[[[1178,-1269,-1459,1518,-1712,1858,-1972,-1971,2256,2257,-2523,-2522,2726,2723,3022,3074,3024,2725,2601,2744,2742,2743,2540,2541,2542,2297,2298,2064,2126,2127,2129,2130,2162,2163,2027,2028,2059,2060,2056,2057,2031,2032,2033,1803,1690,1687,1695,1698,1675,1544,1252,1539,1254,1249,994,1006,980,-976,977,-1106]],[[1799]],[[2756,3028]],[[3031,3099,3132,3101,3033,2758,3029,3096]],[[3098,3131]],[[3217]]],"id":36},{"type":"MultiPolygon","arcs":[[[-5951,-5875,-5923,-5922,-5935,-5934,-5691,-5690,-5989,-5688,-5730,-5729,-5728,-5909,-5908,-5907,-5741,-5740,-5902,-5820,-5819,-5818,-5897,-5896,-5933,-5932,-5870,6067,6065,6075,6114,6205,6220,6063,6084,6272,6460,6454,6611,6285,6612,6592,6521,6588,6830,6787,6857,6785,6916,7011,7133,7294,7132,7295,7304,7305,7306,7307,7273,7026,7027,7028,6951,6900,6871,6872,6876,6877,6702,6703,6782,6672,6673,6657,6658,6794,6795,6721,6775,6776,6777,6697,6698,6827,6906,6907,6908,6847,6848,6849,-6624,-6623,-6487,-6486,-6422,-6421,-6315,-6314,-6201,-6258,-6257,-6256,-6112,-6111,-6012,-6011,-6010,-5953,-5952]],[[6070,-5866,6068,6286]],[[-6072,5863,-6073,5867]],[[6283,6281,6610]],[[7293,7303]],[[7301,7302]]],"id":37},{"type":"MultiPolygon","arcs":[[[30,62,66,55,52,-155,-154,198,-208,305,-337,391,-404,-529,532,533,606,607,612,613,610,611,512,564,602,603,604,614,-498,-497,368,-362,219,-211,130,-107,90,91,96,101,38]]],"id":38},{"type":"MultiPolygon","arcs":[[[-2648,2874,-2882,3009,3010,-3226,3242,3243,-3500,3508,-3587,3715,3716,3874,3875,3876,3973,-4051,4212,4210,4348,4349,4480,4481,4482,4483,4357,4358,4335,4336,4164,4165,4142,4143,4144,4119,4120,4121,4122,3912,-3790,3693,-3593,3383,3384,-3272,3147,-3016,2994,-2771,-2770,2689,-2594,2511,-2444,-2268,-2267,-2255,-2254,2477,2478,2479,2480,2481,2482,2487,2641,2489,2642,2567,2608,2553,2416,2374,-2174,2370,-2420,2638]]],"id":39},{"type":"MultiPolygon","arcs":[[[-5569,-5568,-5736,5780,-5962,5970,-6145,-6281,6343,-6579,6637,-6754,6799,6800,-7140,7252,7253,7254,7255,7427,7428,7424,7425,7426,7406,7466,7467,7468,7364,7365,7250,7251,7160,7161,7055,7056,6953,6954,-6894,6717,-6654,6428,-6395,6041,6042,5813,5814,5809,5810,5811,5806,5807,-5800,-5327,-5528,-5527,-5530,-5532,-5531,-5463,-5467,-5466,-5540,-5539,-5470,-5469,-5538,-5537,-5460,-5459,-5457,-5456,-5606,-5605,-5535,-5534,-5543,-5542]]],"id":40},{"type":"MultiPolygon","arcs":[[[637,-670,-583,-582,-675,-674,-673,-672,-671,-485,-484,-539,-537,-536,-495,-564,-518,-505,687,-890,944,-1066,1234,1235,1236,1237,1401,1402,1576,1577,1573,1574,1853,1945,1946,1864,1865,1585,1438,1271,955,754,601,640,-587]]],"id":41},{"type":"MultiPolygon","arcs":[[[-2057,-2061,-2060,-2029,-2028,-2164,-2163,-2131,-2130,-2128,-2127,-2065,-2299,-2298,-2543,2574,-2731,2789,-2889,-2888,-3105,3232,3233,-3506,3533,3564,3565,3474,3566,3476,3477,3425,3426,3478,3479,3480,3562,3563,3434,3435,3515,3516,3422,3437,3438,3526,3527,3528,3588,3589,-3588,3317,3318,3319,-3224,3083,-3010,2881,-2875,2647,-2639,2419,-2371,2173,2174,-2033,-2032,-2058]]],"id":42},{"type":"MultiPolygon","arcs":[[[2425,2294,2427,2526,-2500,2429,-2292,-2291,-1987,-2144,-2226,-2225]],[[2517]],[[2518,-2223]]],"id":44},{"type":"MultiPolygon","arcs":[[[-6658,-6674,-6673,-6783,-6704,-6703,-6878,-6877,-6873,-6872,-6901,-6952,-7029,-7028,-7027,-7274,-7308,7355,7616,9549,9548,7718,9545,7886,9546,7888,8102,8067,8099,8069,8098,8071,8097,8073,8074,8075,7922,-7917,7892,-7846,7735,7566,7567,7508,7509,7462,7463,-7367,7276,7079,7080,6942,6943,6944,6945,6946,-6698,-6778,-6777,-6776,-6722,-6796,-6795,-6659]],[[-7302,7353]],[[-7306,7354]],[[7615,9547]],[[8096]],[[8100]],[[8101]]],"id":45},{"type":"MultiPolygon","arcs":[[[-513,-612,-611,-614,-613,-608,-607,-534,-682,723,-818,867,-893,1017,1018,-1155,1193,-1310,-1465,1494,-1626,1633,-1731,1804,1805,1806,1807,1809,1810,1781,1782,1784,1644,1645,1654,1655,1525,1683,1682,1546,1547,1656,1657,-1617,1461,-1347,1222,1158,-1008,914,-656,-655,-499,-615,-605,-604,-603,-565]]],"id":46},{"type":"MultiPolygon","arcs":[[[-5715,-5713,-5920,-5919,-5858,-5857,-5940,-5939,-5854,-5911,-5910,-5824,-5823,-5844,-5843,-5836,-5835,-5846,-5906,-5905,-5918,-5917,-5916,-5881,-5994,-5885,-5884,-5954,6009,6010,6011,6110,6111,6255,6256,6257,6200,6313,6314,6420,6421,6485,6486,6622,6623,-6850,6852,6853,6819,6820,6744,6745,6746,6831,6832,6816,6817,6810,6811,6749,6750,6739,6724,6778,6779,6780,6798,6766,6767,6768,6796,6797,6792,6793,-6761,6632,-6439,-6438,-6437,-6436,6302,-6189,6127,-5927,-5983,-5925,-5985,-5984,-5959,-5958,-5851,-5850,-5964,-5963,-5754,-5677,-5676,-5716]]],"id":47},{"type":"MultiPolygon","arcs":[[[-5808,-5807,-5812,-5811,-5810,-5815,-5814,-6043,-6042,6394,-6429,6653,-6718,6893,-6955,-6954,-7057,-7056,-7162,-7161,-7252,-7251,-7366,-7365,-7469,-7468,-7467,-7407,-7427,-7426,-7425,-7429,-7428,-7256,-7255,-7540,7637,-7672,7843,-7932,-7931,-7930,8243,-8259,8424,-8477,-8476,-8670,8712,8713,-8973,9022,9046,9047,9142,9195,9144,9052,9194,9192,9196,9241,9239,9286,9229,9290,9289,9231,9245,9233,9246,9288,9300,9326,9282,9280,9327,9325,9302,9320,9332,9323,9333,9353,9335,9356,9354,9379,9421,9416,9417,9471,9467,9468,9469,9479,9478,9459,9456,9402,9331,9257,9190,9003,8903,8900,8913,8411,8413,-7914,-7811,-7810,-7809,-7992,-7991,-7990,-7684,-7683,-7682,-7681,-7680,7588,-7179,-7178,-7031,-7030,6886,-6584,-6583,6400,-5802,-5801]],[[9050,9141]],[[9191]],[[9285,9283,9324]],[[9318,9352]],[[9319]],[[9413,9414,9377,9350,9378,9415]],[[9351]],[[9404,9462]],[[9463,9464,9465,9407,9408,9405,9466]],[[9409,9410,9411,9412]],[[9461,9480]]],"id":48},{"type":"MultiPolygon","arcs":[[[-1706,2316,-2593,-2170,-2169,-2959,-2958,3075,3076,-3558,4006,-4617,4736,4737,4738,4739,4740,4741,5424,5425,5351,-4612,-4611,-4610,3978,-3543,-3542,2896,-2335,2329,-1993,-2080,-2079,-2115,-2024]]],"id":49},{"type":"MultiPolygon","arcs":[[[973,-875,970,1088,-1245,-1244,1429,-1589,1726,1727,1709,1710,1711,-1519,1458,1268,-1179,1105,-978,975,976,969,983]]],"id":50},{"type":"MultiPolygon","arcs":[[[-4005,-3793,-3831,-4101,-4100,-4373,4405,4487,4326,4395,4657,4804,4869,5072,5198,5197,5006,4868,4801,4983,5235,5379,5433,5381,5117,5157,5338,5483,5546,5671,5669,5699,5651,5482,5440,5292,5403,5589,5593,5639,5682,5897,5893,5929,5890,5839,5930,5871,5841,5872,5865,5866,5867,5868,5869,5931,5932,5895,5896,5817,5818,5819,5901,5739,5740,5906,5907,5908,5727,5728,5729,5687,5988,5689,5690,5933,5934,5921,5922,5874,5950,5951,5952,5953,5883,5884,5993,5880,5915,5916,5917,5904,5905,-5845,-5743,5655,-5625,-5246,-5245,-5244,-5109,-5421,-5420,-5387,-5386,-5385,-5189,-5285,-5284,5130,-4886,4880,-4523,-4522,-4389,-4388,-4387,-4173,-4172,4024,-3980,-3846,-3891,-4006],[5598]],[[5060,-4854]],[[5061,-4858]],[[-4851,5062]],[[5065,5066,-4776,5067,5063,5414]],[[-4772,5068]],[[5862,5863,5864]]],"id":51},{"type":"MultiPolygon","arcs":[[[83,78,81,-22,79,-113,235,236,-353,382,383,-519,563,494,535,536,538,483,484,670,671,672,673,674,581,582,669,-638,586,587,589,455,331,222,176,223,307,265,359,262,360,309,395,358,295,185,173,186,127,124,2,73]],[[116]],[[117]],[[118]],[[174]],[[260]],[[292]]],"id":53},{"type":"MultiPolygon","arcs":[[[-3529,-3528,-3804,-3803,-3802,-3800,-3799,-3798,-3796,-3795,-3794,4004,4005,3890,3845,3979,-4025,4171,4172,4386,4387,4388,4521,4522,-4881,4885,-5131,5283,5284,5188,5384,5385,5386,5419,5420,5108,5109,5110,4797,4798,-4733,-4482,-4481,-4350,-4349,-4211,-4213,4050,-3974,-3877,-3876,-3875,-3717,-3716,3586,-3509,3499,-3244,-3243,3225,-3011,-3084,3223,-3320,-3319,-3318,3587,-3590,-3589]]],"id":54},{"type":"MultiPolygon","arcs":[[[-570,-569,-620,-619,-693,9516,855,1129,857,1130,1142,9517,1140,1262,1448,1597,1773,1932,1998,1999,2000,1930,1931,1923,1924,1918,1919,1938,1939,1751,1752,1753,1669,-1629,1538,-1477,1396,-1344,1164,1160,1161,1136,-1114,1048,-1026,-878,-877,777,-773,645,-574,-573,-462,-137,9499,9501,9502,542,-466,-465,-571]],[[9503]]],"id":55},{"type":"MultiPolygon","arcs":[[[-677,-744,-743,-742,-657,-915,1007,-1159,-1223,1346,-1462,1616,1617,-1834,2017,2018,-2515,2523,2524,2525,2112,2113,2107,2108,2109,2167,2168,2169,2592,-2317,1705,1706,1707,-1567,1147,1148,-1096,-630,-629,-635,-806,-805,-678]]],"id":56},{"type":"MultiPolygon","arcs":[[[9947,9822,9926,9955,9816,9956,9998,9980,9859,9828,9889,9984,9884,9892,9924,10033,10004,9863,9902,9987,9897,10012,10018,10009,10028,10029,10020,10030,10000,10013,9950,9933,9988,9970,9851,9911,9996,9871,9958,9989,9830,9936]],[[10031]]],"id":72},{"type":"MultiPolygon","arcs":[[[10005]],[[10032]]],"id":78}]},"land":{"type":"MultiPolygon","arcs":[[[5868,6067,6065,6075,6114,6205,6220,6063,6084,6272,6460,6454,6611,6285,6612,6592,6521,6588,6830,6787,6857,6785,6916,7011,7133,7294,7132,7295,7304,7354,7306,7355,7616,9549,9548,7718,9545,7886,9546,7888,8102,8067,8099,8069,8098,8071,8097,8073,8304,8299,8355,8352,8546,8628,8544,8629,8727,8866,8936,9043,9151,9203,9226,9216,9150,9019,8933,9020,9177,9016,9175,9217,9272,9210,9273,9212,9268,9359,9385,9433,9387,9431,9443,9427,9444,9429,9445,9481,9489,9483,9491,9485,9490,9487,9494,9477,9453,9441,9393,9439,9395,9372,9342,9340,9310,9294,9261,9258,9201,9495,8995,8896,8996,9104,9036,9103,9038,8943,9039,8945,8836,8827,8837,8829,8819,8813,8697,8722,8699,8723,8869,8892,8910,8878,9040,9067,9060,9061,9062,9063,9135,9065,9140,9136,9137,9138,9139,9033,9128,9118,9119,9120,9030,9121,9122,9160,9124,9161,9126,9168,9163,9164,9165,9166,9167,9109,9088,9076,9099,9047,9142,9195,9144,9052,9194,9192,9196,9241,9239,9286,9229,9290,9289,9231,9245,9233,9246,9288,9300,9326,9282,9280,9327,9325,9302,9320,9332,9323,9333,9353,9335,9356,9354,9379,9421,9416,9417,9471,9467,9468,9469,9479,9478,9459,9456,9402,9331,9257,9190,9003,8903,8900,8913,8411,8413,7914,8132,8058,8229,8523,8212,7750,7765,7722,7545,7076,7041,6922,6556,5900,5619,5299,5203,5296,5447,5164,5019,4847,4539,4685,4457,4684,4459,4467,4841,4469,3604,2658,2346,1865,1585,1438,1271,955,754,601,640,587,589,455,331,222,176,223,307,265,359,262,360,309,395,358,295,185,173,186,127,124,2,73,83,78,81,22,34,18,41,97,86,44,48,27,8,51,108,91,96,101,38,30,62,66,55,58,104,9496,123,140,193,9497,192,135,9499,9501,9502,542,466,422,9508,434,9512,9514,473,9524,9526,9522,9527,555,9515,691,9516,855,1129,857,1130,1142,9517,1140,1262,1448,1597,1773,1932,1998,2087,2207,2506,2508,2440,2178,2124,1960,1759,1660,1507,1351,1199,1086,9534,9535,923,9530,9529,749,798,9536,1049,1210,9537,1408,1534,9538,1552,9539,1899,9540,9544,2478,9543,2480,9542,2482,2487,2641,2489,2642,2567,2608,2553,2416,2374,2174,2033,1803,1690,1687,1695,1698,1675,1544,1252,1539,1254,1249,994,1006,980,976,969,983,973,875,866,795,548,348,791,895,578,1091,1255,1259,1365,1363,1364,1261,1108,1366,1353,1362,1355,1511,1589,1721,1906,2093,1977,2092,1979,2089,2140,2151,2138,2147,2261,2260,2149,2221,2518,2223,2425,2294,2427,2526,2500,2532,2534,2531,2535,2520,2726,2723,3022,3074,3024,2725,2601,2744,2873,3093,3043,3136,3236,3325,3511,3501,3786,4108,3927,3924,3765,3925,3768,3730,3769,3732,3770,3704,3646,3504,3533,3564,3734,4086,4378,4773,4380,4778,4774,5067,5063,5414,5065,5066,4776,4860,4859,4678,4569,4567,4252,4394,4153,4062,3805,3815,3821,4072,4177,4071,4178,4174,4509,4277,4601,4719,4718,4603,4279,4371,4405,4487,4326,4395,4657,4804,4869,5072,5198,5197,5006,4868,4801,4983,5235,5379,5433,5381,5117,5157,5338,5483,5546,5671,5669,5699,5651,5482,5440,5292,5403,5589,5593,5639,5682,5897,5893,5929,5890,5839,5930,5871,5841,5872,6068,6286,6070,5866],[5598],[5864,5862],[-6072],[-6073]],[[8693,8810]],[[9560]],[[9561]],[[9562]],[[9563]],[[9564]],[[9565]],[[9566]],[[9567]],[[9568]],[[9569]],[[9570]],[[9571]],[[9572]],[[9573]],[[9574]],[[9575]],[[9576]],[[9577]],[[9578]],[[9579]],[[9580]],[[9581]],[[9582]],[[9583]],[[9584]],[[9585]],[[9586]],[[9587]],[[9588]],[[9589]],[[9590]],[[9591]],[[9592]],[[9593]],[[9594]],[[9595]],[[9597,9618,9602,9619,9612,9607,9608,9609,9720,9605,9721,9716,9711,9790,9789,9785,9783,9781,9772,9779,9756,9770,9685,9697,9691,9695,9643,9672,9660,9806,9662,9670,9635,9671,9645,9664,9647,9693,9650,9694,9689,9696,9687,9683,9771,9768,9769,9758,9753,9764,9751,9765,9744,9766,9734,9724,9767,9759,9631,9617,9599,9614]],[[9600]],[[9601]],[[9604]],[[9613]],[[9621]],[[9622]],[[9623]],[[9624]],[[9625]],[[9626]],[[9627]],[[9628]],[[9629]],[[9630]],[[9641,9673,9637,9674,9639,9682]],[[9642]],[[9651]],[[9699,9653,9700]],[[9654]],[[9655]],[[9656]],[[9657]],[[9658]],[[9659]],[[9675,9676,9677,9704,9702,9666,9701,9668,9703,9679]],[[9669]],[[9681,9692]],[[9698]],[[9705]],[[9706]],[[9707]],[[9712]],[[9713]],[[9714]],[[9715]],[[9735]],[[9736]],[[9737]],[[9738]],[[9739]],[[9740]],[[9741]],[[9742]],[[9745]],[[9746]],[[9748,9763]],[[9749]],[[9752]],[[9760]],[[9761]],[[9762]],[[9780]],[[9786]],[[9787]],[[9788]],[[9791]],[[9792]],[[9793]],[[9794]],[[9795]],[[9796]],[[9797]],[[9798]],[[9799]],[[9800]],[[9801]],[[9802]],[[9803]],[[9804]],[[9805]],[[6919]],[[6920]],[[7040]],[[7073]],[[7074]],[[8815,8812,8816,8825]],[[8935,9021]],[[9180,9013,9178,9218]],[[9102]],[[9306,9338]],[[9361,9384]],[[9369,9396]],[[9383,9432]],[[9390,9438]],[[9425,9442]],[[9436,9454]],[[9451]],[[9472,9493]],[[9492]],[[8302]],[[8303]],[[8351]],[[8542,8627]],[[8545]],[[8726]],[[9551,9555]],[[9552]],[[9553]],[[9554]],[[9556]],[[9557]],[[9558]],[[9559]],[[-9060,-9057],[9133],[9134]],[[9085]],[[9117,9159]],[[9132]],[[9162]],[[893]],[[894]],[[4150]],[[4772,5068]],[[4851,5062]],[[4854,4855,4852,5060]],[[4858,4856,5061]],[[2604]],[[2700]],[[9506,9504,9509]],[[9507]],[[9518,9519]],[[9520]],[[9525]],[[9531]],[[9532]],[[1799]],[[2756,3028]],[[3031,3099,3132,3101,3033,2758,3029,3096]],[[3098,3131]],[[3217]],[[6283,6281,6610]],[[7293,7303]],[[7302,7353]],[[2517]],[[7615,9547]],[[8096]],[[8100]],[[8101]],[[9050,9141]],[[9191]],[[9285,9283,9324]],[[9318,9352]],[[9319]],[[9413,9414,9377,9350,9378,9415]],[[9351]],[[9404,9462]],[[9463,9464,9465,9407,9408,9405,9466]],[[9409,9410,9411,9412]],[[9461,9480]],[[116]],[[117]],[[118]],[[174]],[[260]],[[292]],[[9503]],[[9947,9822,9926,9955,9816,9956,9998,9980,9859,9828,9889,9984,9884,9892,9924,10033,10004,9863,9902,9987,9897,10012,10018,10009,10028,10029,10020,10030,10000,10013,9950,9933,9988,9970,9851,9911,9996,9871,9958,9989,9830,9936]],[[10031]],[[10005]],[[10032]]]}},"arcs":[[[162416,583189],[236,-863],[95,-3199],[219,-1079],[-271,-1241]],[[162695,576807],[-442,-309],[-4397,83]],[[157856,576581],[-6,1800],[-436,606],[-476,3062],[168,1173],[2781,-89],[2529,56]],[[203483,583173],[-111,-3268],[363,0],[1,-4838],[604,-14]],[[204340,575053],[0,-6406],[-109,-3],[-1,-3886]],[[204230,564758],[-1074,300],[-477,661],[-50,-1946]],[[202629,563773],[-411,-2654],[-860,-2419],[-1043,-435],[-462,561]],[[199853,558826],[29,9804],[98,1617],[303,-7],[-114,3279],[302,529],[-36,7508],[73,1628]],[[200508,583184],[2975,-11]],[[181317,583162],[311,-3373],[318,707],[389,-2530],[-133,-1970],[788,-1235],[-38,-1636],[347,-662],[20,-2123]],[[183319,570340],[343,-1416],[-25,-1101],[608,-791]],[[184245,567032],[386,-2907],[-296,-415]],[[184335,563710],[-284,-667],[56,-2638],[-277,-1038],[59,-2315]],[[183889,557052],[-896,67]],[[182993,557119],[-467,-2]],[[182526,557117],[100,1562],[-233,2072],[31,1860],[-477,1550],[-122,1357],[-537,-515],[111,-1134],[-1263,-12],[41,-3203],[-354,-5]],[[179823,560649],[-1,1601],[-1073,-52],[-59,2655]],[[178690,564853],[-26,3920],[480,4],[-5,6467],[-109,1580],[659,10],[112,1730],[-222,1681],[-105,2947]],[[179474,583192],[1843,-30]],[[175797,583199],[0,-9287]],[[175797,573912],[-2052,-27],[-1,6456],[-689,-16]],[[173055,580325],[0,2843]],[[173055,583168],[2742,31]],[[199853,558826],[-98,-1296],[-681,144],[-597,-3335]],[[198477,554339],[-62,2205],[-374,544],[-689,-277]],[[197352,556811],[-1279,1156],[-333,1654]],[[195740,559621],[8,3507],[732,-36],[49,1308],[485,-270],[63,8718],[182,-420],[75,5957],[166,-2],[64,4793]],[[197564,583176],[2944,8]],[[221924,574709],[-1819,8]],[[220105,574717],[-103,3252],[0,5201]],[[220002,583170],[1831,2]],[[221833,583172],[2,-5232],[89,-3231]],[[178690,564853],[-400,43],[-118,-1893],[-228,-480],[-676,326],[-47,1381],[-616,5246],[-698,-1924],[-112,1019]],[[175795,568571],[2,5341]],[[175797,583199],[3677,-7]],[[220105,574717],[-364,-10]],[[219741,574707],[-362,-1],[-1,1624],[-1819,10],[0,-1619]],[[217559,574721],[-1091,11],[0,3239],[-126,10],[-1,5192]],[[216341,583173],[3661,-3]],[[186539,583158],[26,-9701]],[[186565,573457],[-1094,108],[-10,-3230],[-2142,5]],[[181317,583162],[5222,-4]],[[193948,567081],[-537,-46],[0,1653],[-331,-43],[0,1617],[-2172,10],[0,-1617],[-363,1]],[[190545,568656],[35,14501]],[[190580,583157],[3492,32]],[[194072,583189],[-44,-7981],[115,-2218],[-242,-2960],[47,-2949]],[[195740,559621],[-133,1040],[-934,56],[-434,-1362],[-302,350]],[[193937,559705],[11,7376]],[[194072,583189],[3492,-13]],[[206421,583169],[53,-6498],[181,-1619]],[[206655,575052],[-2315,1]],[[203483,583173],[2938,-4]],[[228232,583191],[206,-4516],[166,-1312],[-187,-2686]],[[228417,574677],[-2130,0]],[[226287,574677],[-64,8514]],[[226223,583191],[2009,0]],[[230526,583184],[49,-8486]],[[230575,574698],[-2158,-21]],[[228232,583191],[2294,-7]],[[223380,574698],[-1,-3220],[-639,-11]],[[222740,571467],[-816,5]],[[221924,571472],[0,3237]],[[221833,583172],[1465,10]],[[223298,583182],[0,-5247],[82,-3237]],[[226287,574677],[-1090,12]],[[225197,574689],[-1817,9]],[[223298,583182],[2925,9]],[[168030,583185],[-42,-19407]],[[167988,563778],[-338,-262]],[[167650,563516],[-25,343]],[[167625,563859],[88,1056],[-308,2218],[-250,148],[-799,-1281],[-586,-1450],[-104,1726],[-570,-649],[55,-1799]],[[165151,563828],[-497,4],[-263,1945],[-611,1931],[-82,1381],[-532,1417],[-331,3957]],[[162835,574463],[-140,2344]],[[162416,583189],[2209,-15],[3405,11]],[[171951,583192],[-373,-3049],[-183,-3367],[361,7],[-7,-9706],[182,-1632]],[[171931,565445],[-274,12],[-1,-4693],[-435,1680],[-360,-1132]],[[170861,561312],[-166,418],[-548,-890],[-371,2707],[-364,-947]],[[169412,562600],[-132,2358],[406,757],[-5,1210],[289,2381],[-186,3288],[316,4420],[-332,3951],[45,2219]],[[169813,583184],[2138,8]],[[173055,580325],[-26,-14911]],[[173029,565414],[-1098,31]],[[171951,583192],[1104,-24]],[[169412,562600],[-45,-983],[-485,620],[-109,1069],[-446,-598],[-339,1070]],[[168030,583185],[1783,-1]],[[188725,567028],[0,1624]],[[188725,568652],[374,0],[11,14480]],[[189110,583132],[1470,25]],[[190545,568656],[-199,-1611],[-1621,-17]],[[212324,583170],[-3,-5175],[150,-1639]],[[212471,576356],[-3238,15]],[[209233,576371],[-1,6810]],[[209232,583181],[3092,-11]],[[214880,583162],[-1,-3570]],[[214879,579592],[-364,-1],[-1,-1615],[-226,0],[0,-3239]],[[214288,574737],[-1816,1]],[[212472,574738],[-1,1618]],[[212324,583170],[2556,-8]],[[186539,583158],[2571,-26]],[[188725,568652],[-718,-1],[2,2422],[-362,804],[-543,30],[-81,1075],[-458,475]],[[217559,574721],[0,-1621]],[[217559,573100],[-2179,21],[-1,4852],[-499,6],[-1,1613]],[[214880,583162],[1461,11]],[[233488,574623],[-724,-26]],[[232764,574597],[-2189,101]],[[230526,583184],[3019,-21]],[[233545,583163],[240,-2188],[403,729],[4,-3863],[-704,-3],[0,-3215]],[[209233,576371],[4,-4555]],[[209237,571816],[-1620,-3],[1,1621],[-362,4],[0,1612],[-601,2]],[[206421,583169],[2811,12]],[[175795,568571],[0,-4401]],[[175795,564170],[-503,1655],[-278,-929],[18,-2373]],[[175032,562523],[-508,-3],[3,1886],[-1500,-263]],[[173027,564143],[2,1271]],[[217559,573100],[127,-1619],[-2,-6492],[124,-2],[-3,-3238]],[[217805,561749],[-2509,-20]],[[215296,561729],[1,3269],[-141,0],[0,6485],[-143,10],[1,3259],[-726,-15]],[[156776,574866],[145,-2337],[-336,700],[191,1637]],[[156018,576189],[368,-1161],[-54,-1922],[-275,764],[-39,2319]],[[156711,577874],[437,-1002],[-571,-1183],[-175,1060],[309,1125]],[[239768,576252],[-26,-7172],[46,-6527]],[[239788,562553],[-1935,132],[-2,-978],[-1789,-11]],[[236062,561696],[-28,9709]],[[236034,571405],[-5,6210]],[[236029,577615],[339,174],[235,-1132],[1048,-348],[153,-2131],[908,561],[5,841],[719,948],[332,-276]],[[157403,572219],[-141,1501],[247,575],[362,-1247],[-15,3533]],[[162835,574463],[-341,252],[-585,-931],[-105,-3299],[196,-417]],[[162000,570068],[-3852,30]],[[158148,570098],[-745,2121]],[[212472,574738],[0,-3235],[160,6],[-1,-4641]],[[212631,566868],[-1040,215],[-261,-1783],[-494,-877],[-372,2569],[-383,-709],[-219,-2109],[-618,321]],[[209244,564495],[-7,7321]],[[219741,574707],[109,-3230],[1,-6504],[110,0],[-1,-3243]],[[219960,561730],[-1079,-3]],[[218881,561727],[-1076,22]],[[243362,568345],[29,-12216],[-17,-11281]],[[243374,544848],[-834,-2840],[-305,-2385]],[[242235,539623],[-249,57]],[[241986,539680],[-26,1879],[-2117,44]],[[239843,541603],[15,4838]],[[239858,546441],[-15,12916],[-55,3196]],[[239768,576252],[1003,-1644],[260,59],[-216,-1482],[572,-281],[382,-4206],[280,489],[20,1987],[577,82],[136,-1749],[580,-1162]],[[209244,564495],[-258,1115],[-593,-179],[-307,1362],[-1057,19],[-145,560],[-288,-1582],[-558,-1]],[[206038,565789],[-93,497],[-752,103],[-963,-1631]],[[165151,563828],[-358,-3363],[-516,-331],[-140,-2995],[-194,-1515],[49,-2367],[561,-1042],[-26,-1385]],[[164527,550830],[-822,-17],[-768,1528],[-383,1475],[-339,202],[-528,3048]],[[161687,557066],[130,2031],[-145,1372]],[[161672,560469],[136,875],[-308,1331],[76,2649],[386,643],[303,1650],[-265,2451]],[[215296,561729],[-1431,3],[-1,-1673]],[[213864,560059],[-714,1226]],[[213150,561285],[-16,1450],[265,1806],[-308,1452],[-460,875]],[[232764,574597],[24,-6811]],[[232788,567786],[-2527,21]],[[230261,567807],[-1798,-6]],[[228463,567801],[13,367]],[[228476,568168],[71,2441],[-130,4068]],[[221924,571472],[-985,7],[-4,-6507],[100,-3249]],[[221035,561723],[-716,0]],[[220319,561723],[-359,7]],[[223962,564053],[0,0]],[[225197,574689],[73,-6488]],[[225270,568201],[-362,-8],[-2,-3234],[-287,1],[0,-1975]],[[224619,562985],[-263,25],[-571,2718],[-293,-1216],[-752,3114],[0,3841]],[[228476,568168],[-2123,27]],[[226353,568195],[-1083,6]],[[236062,561696],[6,-7465]],[[236068,554231],[0,-615],[-707,-31]],[[235361,553585],[-1430,49]],[[233931,553634],[-29,8560],[-224,1564],[125,1180],[-985,11]],[[232818,564949],[-30,2837]],[[233488,574623],[363,-5],[3,-3239],[2180,26]],[[188725,567028],[1,-2703]],[[188726,564325],[-1602,-42],[-179,1901],[-362,820],[-2338,28]],[[158090,569229],[27,-389]],[[158117,568840],[-233,-1009],[277,-1641],[-369,861],[-55,2156],[353,22]],[[157569,571941],[242,-1775],[-417,-308],[-219,-1058],[350,-340],[186,-3597],[44,1501],[415,-1154],[-2,-2382],[-642,2318],[-19,2344],[-435,1258],[298,3297],[199,-104]],[[156635,565779],[-61,-3686],[-1563,-8],[-1,265],[-3066,-4]],[[151944,562346],[-337,5364],[262,4073],[685,-1863],[396,-423],[748,-1863],[763,57],[868,-995],[776,701],[530,-1618]],[[224619,562985],[0,-1281]],[[224619,561704],[-2150,10]],[[222469,561714],[-1434,9]],[[193937,559705],[-803,-422],[-50,-3212],[-1028,-2365]],[[192056,553706],[-1187,-7]],[[190869,553699],[-361,553],[1,1468],[-266,4],[-517,1364],[204,1867],[-1205,-7]],[[188725,558948],[1,5377]],[[161672,560469],[-3555,-37]],[[158117,560432],[249,3191],[302,1598],[-408,1180],[-143,2439]],[[158090,569229],[58,869]],[[179823,560649],[58,-3498],[649,4],[-91,-2233],[239,252],[-155,-1950],[417,-649],[44,-4053]],[[180984,548522],[-292,-237],[-171,1187],[-551,1163],[-685,298]],[[179285,550933],[-478,836],[-38,1569],[-836,1676],[-964,-135]],[[176969,554879],[-353,1336],[183,799],[-96,1863],[-283,1074],[-625,4219]],[[245498,568092],[24,-13481]],[[245522,554611],[-1265,-6316],[-883,-3447]],[[243362,568345],[243,-1594],[424,-163],[-24,-1207],[886,751],[607,1960]],[[226353,568195],[59,-3242],[-1,-6490]],[[226411,558463],[-285,2]],[[226126,558465],[-1436,0]],[[224690,558465],[-71,3239]],[[228463,567801],[349,-5611],[345,-3679]],[[229157,558511],[-1604,-50]],[[227553,558461],[-1142,2]],[[230261,567807],[50,-3920]],[[230311,563887],[2,-2161],[360,-5],[3,-1615],[1434,5],[0,1629],[356,7],[-1,1624]],[[232465,563371],[355,-34]],[[232820,563337],[78,-8073]],[[232898,555264],[-1430,-21]],[[231468,555243],[-2182,14]],[[229286,555257],[-129,3254]],[[232818,564949],[2,-1612]],[[232465,563371],[-1,531],[-2153,-15]],[[209244,564495],[-2,-11146]],[[209242,553349],[-241,-807],[-805,9]],[[208196,552551],[-259,2],[1,3249],[-225,-5],[0,1619],[-1072,7],[1,1622],[-715,4],[0,1622]],[[205927,560671],[111,1441],[0,3677]],[[167625,563859],[-339,-5],[-301,-1380],[-1,-1619],[-240,-1347],[-120,-2159],[-533,-1577],[-2,-1607],[-954,-85],[-359,-2172],[-6,-1862]],[[164770,550046],[-243,784]],[[213150,561285],[-1,-2790],[-1274,10],[2,-6436]],[[211877,552069],[-1581,12]],[[210296,552081],[-1055,15]],[[209241,552096],[1,1253]],[[156466,557234],[-1440,16],[0,-1664]],[[155026,555586],[-1512,9],[-856,299]],[[152658,555894],[-216,4014],[-498,2438]],[[156635,565779],[272,1293],[567,-4576],[-189,-395],[-250,-3034],[-106,2479],[-245,-3231],[-218,-1081]],[[188725,558948],[-718,-7],[0,-1612],[-713,3],[0,-1972],[-347,194]],[[186947,555554],[-644,-185],[-425,1863],[-410,507],[-656,-490],[-280,1680],[6,2406],[-203,2375]],[[205927,560671],[-357,-7],[-2,-4859],[-120,-3],[1,-6473]],[[205449,549329],[-1188,-10],[0,-1636],[-355,-3],[0,1641],[-353,-3]],[[203553,549318],[-233,0],[-1,3235],[-355,-6],[105,3251],[-1,6317],[-271,1],[-168,1657]],[[176969,554879],[-257,-1008],[473,-1408],[60,-942],[526,-680],[549,-2997],[263,-2458],[251,-686]],[[178834,544700],[-3821,28]],[[175013,544728],[0,1637]],[[175013,546365],[0,7286]],[[175013,553651],[19,8872]],[[182526,557117],[-825,-26],[-59,-2280],[224,-1574],[136,-3906],[-311,-808],[-707,-1]],[[173027,564143],[7,-11380]],[[173034,552763],[0,-1987]],[[173034,550776],[-2181,21]],[[170853,550797],[8,10515]],[[233931,553634],[40,-4845]],[[233971,548789],[-1065,-20]],[[232906,548769],[-8,6495]],[[175013,553651],[-714,16],[-121,-799],[-1144,-105]],[[203553,549318],[1,-5970]],[[203554,543348],[0,-266]],[[203554,543082],[-1766,-14],[-2,268],[-3263,-151]],[[198523,543185],[-142,488],[173,2154],[-209,2560],[-11,4245],[143,1707]],[[167650,563516],[-17,-12699]],[[167633,550817],[-9,-6519],[-1075,22],[-3,-3262]],[[166546,541058],[-233,-1080]],[[166313,539978],[-187,856],[-295,-1494],[-690,-305]],[[165141,539035],[-276,2021]],[[164865,541056],[127,1141],[-311,5065],[89,2784]],[[170853,550797],[-380,1]],[[170473,550798],[-2840,19]],[[186947,555554],[7,-6012],[711,-1191],[-2,-4004],[368,-11]],[[188031,544336],[35,-1329],[411,-1480]],[[188477,541527],[-392,-449],[14,-3150],[-430,-3]],[[187669,537925],[-672,2],[-784,-2757]],[[186213,535170],[46,3441],[-325,1748],[-347,-22],[-1,2529],[-723,-49],[-4,6432],[-731,40],[-1,5728],[-238,2035]],[[157723,558953],[153,-2103],[-264,244],[111,1859]],[[157679,553460],[-209,2]],[[157470,553462],[-20,-1]],[[157450,553461],[-465,10]],[[156985,553471],[3,2162],[-620,2]],[[156368,555635],[296,1874],[456,872],[192,2438],[440,2118],[103,-3143],[-199,148],[-132,-3407],[313,-1094],[-158,-1981]],[[239858,546441],[-2004,75]],[[237854,546516],[-5,4597],[-695,1379],[-255,2407],[-570,-1212],[-261,544]],[[218881,561727],[0,-3232],[-241,5],[-5,-6449]],[[218635,552051],[-211,-1],[0,-3173],[-602,-11]],[[217822,548866],[-251,2540],[-562,-513]],[[217009,550893],[-256,567],[-257,3108],[37,1844],[-852,-555],[-223,-664],[-1091,1452]],[[214367,556645],[-155,784],[-3,3079],[-345,-449]],[[224690,558465],[0,-1585]],[[224690,556880],[-2133,9]],[[222557,556889],[-88,4825]],[[222557,556889],[-1,-4848]],[[222556,552041],[-598,-4]],[[221958,552037],[-1539,4]],[[220419,552041],[1,6449],[-101,3233]],[[220419,552041],[-222,0]],[[220197,552041],[-1562,10]],[[214367,556645],[0,-4588],[170,0],[-1,-5915]],[[214536,546142],[-1061,-2],[0,-539],[-1412,-13]],[[212063,545588],[-1,6481],[-185,0]],[[197352,556811],[-7,-4999],[-769,-161],[-357,-670],[-49,-3204],[357,-6],[-62,-6487]],[[196465,541284],[-1055,22]],[[195410,541306],[-1057,8],[-1,-1068]],[[194352,540246],[-993,3]],[[193359,540249],[-235,2015],[208,1753],[-4,5387],[-1034,1609],[0,1620],[-238,1073]],[[208196,552551],[219,-2029],[101,-3785],[-297,-2572],[-534,-806]],[[207685,543359],[-1181,12],[-117,1073],[-355,1],[1,1079],[-357,1],[0,3802],[-227,2]],[[157999,553531],[-252,-1157],[151,3089],[101,-1932]],[[161687,557066],[-282,-523],[-596,-2846],[-98,-1164],[461,-3838],[-226,-1130]],[[160946,547565],[-1160,1607],[-393,-641],[-440,1038],[-133,1180],[-534,2],[-231,1165]],[[158055,551916],[258,528],[-269,4233],[225,530],[-269,1061],[117,2164]],[[190869,553699],[1,-1066],[-357,2],[-14,-4901],[354,-2],[-21,-5066]],[[190832,542666],[-725,2921],[-441,463],[-27,1540],[-216,-1427],[-1062,-215],[1,-1610],[-331,-2]],[[227553,558461],[-3,-6470],[62,-1591]],[[227612,550400],[-709,17]],[[226903,550417],[-711,10]],[[226192,550427],[-71,1593],[5,6445]],[[226192,550427],[-1411,-1]],[[224781,550426],[-88,1602]],[[224693,552028],[-3,4852]],[[229286,555257],[52,-4884]],[[229338,550373],[-1726,27]],[[156466,557234],[-98,-1599]],[[156985,553471],[-2,-836]],[[156983,552635],[-348,-1456],[-55,-1446],[-357,-1953]],[[156223,547780],[-354,-250]],[[155869,547530],[-800,-41],[-43,8097]],[[182993,557119],[1,-7838],[455,9],[-1,-6466]],[[183448,542824],[-493,-547],[1,-1076],[-524,-538],[1,-1073],[-447,49]],[[181986,539639],[-1407,-5]],[[180579,539634],[-732,-499]],[[179847,539135],[-221,1916]],[[179626,541051],[351,195],[-48,4029],[320,549],[-90,1379],[-636,2137],[-238,1593]],[[186213,535170],[-690,-2887]],[[185523,532283],[-1333,17]],[[184190,532300],[-6,8737],[-214,-420],[-522,2207]],[[198523,543185],[180,-1781]],[[198703,541404],[-2238,-120]],[[164865,541056],[-1495,18],[1,1609],[-349,24],[-1,1604],[-1091,-12],[-177,1484],[-533,1821],[-274,-39]],[[224693,552028],[-2137,13]],[[217009,550893],[-2,-451],[-1411,-2],[0,-4839]],[[215596,545601],[-927,-4]],[[214669,545597],[-133,545]],[[155869,547530],[121,-1651],[-6,-3776]],[[155984,542103],[-586,-24]],[[155398,542079],[-2026,38]],[[153372,542117],[-109,2053],[252,-202],[623,1195],[-914,1191],[-230,4847],[-241,1362],[-95,3331]],[[232906,548769],[-1437,4]],[[231469,548773],[-1,6470]],[[231469,548773],[-356,-11]],[[231113,548762],[-1799,-4]],[[229314,548758],[24,1615]],[[179626,541051],[-762,2278],[-30,1371]],[[237854,546516],[-2,-4236]],[[237852,542280],[-1578,49],[42,-9604],[-40,-223]],[[236276,532502],[-231,1007],[-307,-539],[-331,854]],[[235407,533824],[-217,373]],[[235190,534197],[-133,485],[-22,7620]],[[235035,542302],[354,-11],[-28,11294]],[[310206,521389],[-674,-758]],[[309532,520631],[-1071,-1126],[-11,14937],[-1066,257]],[[307384,534699],[-8,3291],[-2505,26]],[[304871,538016],[-841,2]],[[304030,538018],[72,2263],[2153,14229],[505,-617],[6,-3382],[393,-1252],[815,1288],[76,747],[564,5],[41,1253],[358,12],[783,-2953],[455,-2410],[25,-20921],[-70,-4891]],[[193359,540249],[-620,1062],[-850,-749]],[[191889,540562],[-514,-597],[-543,2701]],[[175013,546365],[-1409,188],[-569,1764]],[[173035,548317],[-1,2459]],[[235035,542302],[-1047,14]],[[233988,542316],[-17,6473]],[[160946,547565],[-214,-3054],[-186,-928],[190,-1670]],[[160736,541913],[-846,11],[-206,-1039],[-1032,653]],[[158652,541538],[-352,1507],[-447,420],[-411,2054],[-166,2243]],[[157276,547762],[314,1630],[142,2452],[323,72]],[[157679,553460],[-93,-2779],[-243,609],[127,2172]],[[157450,553461],[-258,-1218],[-95,-3180],[-195,1415],[81,2157]],[[209241,552096],[0,-12822]],[[209241,539274],[-860,0],[-178,809],[-527,0]],[[207676,540083],[9,3276]],[[212063,545588],[-553,-13],[-2,-6517]],[[211508,539058],[-1052,-1]],[[210456,539057],[-1,6518],[-160,-2],[1,6508]],[[210456,539057],[-534,-4],[0,-1653],[-681,3]],[[209241,537403],[0,1871]],[[221958,552037],[-1,-6447],[97,4],[-9,-6501]],[[222045,539093],[-1299,23]],[[220746,539116],[-461,8]],[[220285,539124],[17,6480],[-110,4],[5,6433]],[[224781,550426],[0,-4857],[78,2],[1,-6489]],[[224860,539082],[-1665,-10]],[[223195,539072],[-1150,21]],[[220285,539124],[-1617,18]],[[218668,539142],[-334,973],[-96,2185],[-334,3330]],[[217904,545630],[153,619],[-235,2617]],[[217904,545630],[-2308,-29]],[[170473,550798],[4,-6433],[-150,-2316],[-550,-960]],[[169777,541089],[-3231,-31]],[[173035,548317],[0,-10900]],[[173035,537417],[-1,-2156]],[[173034,535261],[-434,-110],[-90,788]],[[172510,535939],[-70,1545],[-616,2886],[-768,-191],[-281,-1215]],[[170775,538964],[-894,-1263],[-120,595]],[[169761,538296],[16,2793]],[[226903,550417],[68,-4868],[-1,-6487]],[[226970,539062],[-981,13]],[[225989,539075],[-1129,7]],[[229314,548758],[6,-2652],[212,-1371],[-110,-2548],[11,-3117]],[[229433,539070],[-1343,-23]],[[228090,539047],[-1120,15]],[[158652,541538],[-2669,24],[1,541]],[[156223,547780],[371,1366],[-165,-1817],[270,11],[248,1910],[329,-1488]],[[207676,540083],[-351,-1344]],[[207325,538739],[-350,-4],[-351,-1338],[-710,7],[-584,557],[-128,1621],[-225,-2],[-117,3243],[-599,530],[-707,-5]],[[233988,542316],[-2,-1623]],[[233986,540693],[-2817,4]],[[231169,540697],[-56,8065]],[[231169,540697],[7,-1623],[-303,3]],[[230873,539077],[-1399,-8]],[[229474,539069],[-41,1]],[[175013,544728],[1,-5708],[-353,22]],[[174661,539042],[-461,-3],[-274,-1604],[-891,-18]],[[165141,539035],[21,-10945]],[[165162,528090],[-2024,0],[-2594,63]],[[160544,528153],[1,6416]],[[160545,534569],[358,11],[-157,2684],[251,3313],[-261,1336]],[[191889,540562],[-24,-9124]],[[191865,531438],[0,-676]],[[191865,530762],[-1399,153]],[[190466,530915],[-776,9]],[[189690,530924],[-179,1515],[195,2306],[-474,569],[-329,2182],[-426,4031]],[[239843,541603],[18,-6465]],[[239861,535138],[3,-4862]],[[239864,530276],[-1053,-77]],[[238811,530199],[4,1716],[-1019,-55]],[[237796,531860],[-43,6341],[94,109],[5,3970]],[[251183,535146],[2,-1610]],[[251185,533536],[-1045,-5],[1,3215],[-1046,-7],[1,1617],[-346,12],[-67,3222]],[[248683,541590],[281,994],[1035,453],[493,1189],[335,1615],[517,690]],[[251344,546531],[2,-4942],[190,-1609],[-348,14],[-5,-4848]],[[214669,545597],[2,-4901]],[[214671,540696],[-1,-1616]],[[214670,539080],[-2316,-18]],[[212354,539062],[-846,-4]],[[218668,539142],[261,-751],[-62,-3093]],[[218867,535298],[-369,-883],[-548,257],[-360,-2040]],[[217590,532632],[0,1615],[-698,1],[0,4816],[-1166,16],[-1,1620],[-1054,-4]],[[253820,544308],[0,-2727],[148,-1606],[-346,-13],[-2,-4818]],[[253620,535144],[-1568,10]],[[252052,535154],[1,8036],[354,0],[-1,1615],[281,8]],[[252687,544813],[-46,-3488],[634,3347],[545,-364]],[[179847,539135],[-2884,-2989],[-518,-3856],[-988,1959]],[[175457,534249],[-555,1774]],[[174902,536023],[-221,561],[-20,2458]],[[207325,538739],[0,-2429],[-482,-1],[56,-6431]],[[206899,529878],[-149,-3],[0,-6509],[-119,1]],[[206631,523367],[-3371,30]],[[203260,523397],[2,6486],[106,4],[-6,6446],[97,2],[-1,6474],[96,273]],[[203260,523397],[-118,-5],[-3,-8127],[-123,-28],[0,-3172]],[[203016,512065],[-1361,-4],[-1,3224],[108,-22],[0,5982],[-511,206],[100,2748],[-172,715]],[[201179,524914],[0,4963],[-191,-48],[-58,4865],[-348,2],[-60,1616],[-1571,-11]],[[198951,536301],[-119,265]],[[198832,536566],[-129,4838]],[[184190,532300],[-1,-814],[-687,-6],[16,-3298],[-667,-1968]],[[182851,526214],[-255,180],[-219,1599],[-324,48],[141,1392],[-197,1673],[207,1275],[-352,4420],[134,2838]],[[235190,534197],[-1182,4]],[[234008,534201],[-22,6492]],[[237796,531860],[-40,-1612]],[[237756,530248],[-1572,9],[92,2245]],[[155398,542079],[35,-7597]],[[155433,534482],[-1024,26],[-6,-1764]],[[154403,532744],[-413,-941],[-401,1402],[-173,-854],[164,5827],[40,-3886],[155,66],[162,3197],[-178,1201],[335,1945],[-444,-237],[-278,1653]],[[160545,534569],[-1999,-62]],[[158546,534507],[-2721,-5]],[[155825,534502],[-392,-20]],[[189690,530924],[-791,-90],[-193,-3456],[-681,-3145]],[[188025,524233],[-1,4020],[-345,10],[-10,9662]],[[241986,539680],[-2,-4580]],[[241984,535100],[-2123,38]],[[251185,533536],[-1,-4392]],[[251184,529144],[-281,766],[-2333,3002],[1,-217]],[[248571,532695],[-534,909],[-308,3219],[-519,1035]],[[247210,537858],[1092,2058],[381,1674]],[[198832,536566],[-2,-1875],[-408,1],[-281,-2448],[-812,5],[-234,-521],[0,-1925],[-1045,-3]],[[196050,529800],[2,2684],[-229,1641],[-121,3955],[-233,24],[-59,3202]],[[261640,541399],[0,-9498]],[[261640,531901],[-1747,-14]],[[259893,531887],[0,4842]],[[259893,536729],[1,3447]],[[259894,540176],[1066,-173],[680,1396]],[[196050,529800],[-402,-6]],[[195648,529794],[-1369,1],[-5,-1634]],[[194274,528161],[-523,16],[-137,3240]],[[193614,531417],[700,2],[38,8827]],[[193614,531417],[-1749,21]],[[169761,538296],[-37,88]],[[169724,538384],[-623,62],[-454,-1720],[-56,-1736],[-390,-2246],[-741,-1821]],[[167460,530923],[-633,1584],[-9,4567],[-505,2904]],[[167460,530923],[206,-1170],[-54,-2423]],[[167612,527330],[-388,-1247],[-851,-272]],[[166373,525811],[-390,134],[-274,-1277],[-552,-389]],[[165157,524279],[5,3811]],[[234008,534201],[28,-4881]],[[234036,529320],[-1739,14]],[[232297,529334],[-1380,21]],[[230917,529355],[-44,9722]],[[217590,532632],[-397,-2552],[-436,-1343],[-920,-1191],[-478,1151],[-416,-370]],[[214943,528327],[2,2829]],[[214945,531156],[-136,1457],[-12,6465],[-127,2]],[[172510,535939],[1,-949],[-532,-522],[0,-4866],[-168,2],[-1,-2311]],[[171810,527293],[-342,19]],[[171468,527312],[-25,6322],[-176,-16],[-173,2490],[-351,-8],[32,2864]],[[209241,537403],[-1,-4854]],[[209240,532549],[1,-6235]],[[209241,526314],[3,-1180]],[[209244,525134],[-252,2],[0,1618],[-714,26],[2,1575],[-351,-6],[1,1522],[-1031,7]],[[180579,539634],[-28,-2628],[-263,-4539],[-67,-3326],[-131,-1223],[266,-995],[6,-2349],[-249,-34],[-187,-1419],[188,-1950],[-181,-2072]],[[179933,519099],[-282,-1616],[-344,766],[-14,-1410],[527,-2617],[-250,-1838]],[[179570,512384],[-3571,-27],[-470,-1640]],[[175529,510717],[-390,423],[-163,2564],[-956,-4]],[[174020,513700],[363,4438],[258,2020],[-237,2562],[-686,1930]],[[173718,524650],[258,2609]],[[173976,527259],[447,45],[75,2435],[241,1363],[664,-892],[157,1127],[336,203],[-439,2709]],[[182851,526214],[3,-24]],[[182854,526190],[-34,-1070],[-471,-700],[-670,-2752]],[[181679,521668],[-944,-3979],[-194,-400],[-349,1947],[-259,-137]],[[220746,539116],[-2,-6512],[106,-6]],[[220850,532598],[-4,-6356]],[[220846,526242],[-1761,43]],[[219085,526285],[-327,3734],[198,1955],[-89,3324]],[[223195,539072],[-2,-6466]],[[223193,532606],[-2343,-8]],[[174902,536023],[1,-2306],[-958,-326],[31,-6132]],[[173718,524650],[-339,2599]],[[173379,527249],[-121,1925],[103,1310],[-372,3279],[45,1498]],[[212354,539062],[9,-6488]],[[212363,532574],[-197,-15]],[[212166,532559],[-2926,-10]],[[225989,539075],[-2,-6477]],[[225987,532598],[-2698,1]],[[223289,532599],[-96,7]],[[214945,531156],[-1392,13],[0,1436],[-1190,-31]],[[230917,529355],[-1,-1621]],[[230916,527734],[-866,4]],[[230050,527738],[45,1765],[-114,3994],[-380,2927],[-127,2645]],[[228090,539047],[-2,-6457]],[[228088,532590],[-2023,4]],[[226065,532594],[-78,4]],[[230050,527738],[35,-1611]],[[230085,526127],[-1851,-1]],[[228234,526126],[-88,1154],[-58,5310]],[[171468,527312],[-1044,34]],[[170424,527346],[-53,1]],[[170371,527347],[15,3855],[-349,1],[1,1630],[-349,-7],[35,5558]],[[170371,527347],[-2759,-17]],[[248571,532695],[0,-5698],[-321,-1]],[[248250,526996],[-719,-11]],[[247531,526985],[-3,3230],[-343,-15],[1,1609],[-352,7],[6,6374]],[[246840,538190],[370,-332]],[[304871,538016],[-24,-11134],[233,-2084],[-240,-2015],[-258,-234],[344,-2135],[-221,-1593],[445,-9902],[739,1165]],[[305889,510084],[248,-6544]],[[306137,503540],[-330,591],[-241,-1132]],[[305566,502999],[-450,139],[79,-2294],[-907,626]],[[304288,501470],[-183,1243],[-102,3478],[-276,-236],[62,1778],[-139,3374],[-376,-344],[-347,651],[-372,9721]],[[302555,521135],[466,1247],[-87,1101],[431,1781],[-152,2424],[219,2372],[-153,837],[286,2948],[372,1242],[93,2931]],[[307384,534699],[-16,-13241],[-374,-414],[-14,-2791],[297,275],[227,-5338],[-292,-285],[68,-1530],[-1391,-1291]],[[188025,524233],[-403,-667]],[[187622,523566],[-350,1101],[-489,-286],[-234,-1731]],[[186549,522650],[-588,1548],[-293,6521],[-197,-56]],[[185471,530663],[52,1620]],[[259893,531887],[-1,-5145]],[[259892,526742],[-133,-900],[-413,823],[-697,-828],[-157,-2486],[-258,-539]],[[258234,522812],[-83,2590],[0,4874],[-349,11]],[[257802,530287],[0,3250],[698,-25],[0,3238],[1393,-21]],[[198951,536301],[351,-3235],[408,-2428],[-126,-2500]],[[199584,528138],[-454,7],[0,-1079],[-345,0],[-232,-1614],[-462,6],[-62,-7075],[-689,-1094],[-914,67]],[[196426,517356],[-551,2735]],[[195875,520091],[-174,1330],[10,5160],[-63,3213]],[[201179,524914],[-661,1614],[-693,2],[0,1610],[-241,-2]],[[173379,527249],[-1569,44]],[[219085,526285],[-4142,17]],[[214943,526302],[0,2025]],[[253620,535144],[-3,-3220]],[[253617,531924],[2,-6051]],[[253619,525873],[-836,1000],[-325,853],[-417,-133]],[[252041,527593],[-695,1110]],[[251346,528703],[-162,441]],[[251183,535146],[869,8]],[[241984,535100],[-2,-4839]],[[241982,530261],[-158,-2624],[-996,-2261],[-371,-3070]],[[240457,522306],[-838,12]],[[239619,522318],[-4,4660],[246,5],[3,3293]],[[309532,520631],[304,-6937],[-325,-226]],[[309511,513468],[-690,-627],[93,-2259],[-353,-313],[61,-1593],[-355,-303],[157,-4051],[-1023,-1482]],[[307401,502840],[-7,-12]],[[307394,502828],[-61,340],[-964,-1079],[-232,1451]],[[160544,528153],[-247,-4],[10,-4864],[241,-1078]],[[160548,522207],[-795,-346],[-319,-1061]],[[159434,520800],[-910,-1887]],[[158524,518913],[9,9424]],[[158533,528337],[13,6170]],[[158533,528337],[-318,-1795],[-454,495],[-601,-1309],[-131,-1178]],[[157029,524550],[-330,4340],[-600,1895],[-259,-235]],[[155840,530550],[-2,54]],[[155838,530604],[-13,3898]],[[155838,530604],[-183,-462],[-495,2189],[-757,413]],[[235407,533824],[27,-10700]],[[235434,523124],[-1381,-10]],[[234053,523114],[-17,6206]],[[237756,530248],[0,-3231],[116,-9],[14,-2987]],[[237886,524021],[-1641,-2],[226,-871]],[[236471,523148],[-1037,-24]],[[251026,525384],[-2773,34]],[[248253,525418],[-3,1578]],[[251346,528703],[-2,-1704],[-318,2],[0,-1617]],[[155418,529962],[8,-6731]],[[155426,523231],[-1689,63]],[[153737,523294],[-68,3037],[184,1181],[-261,4092],[308,-881],[393,424],[493,-351],[259,901],[373,-1735]],[[214943,526302],[-5,-2]],[[214938,526300],[-2623,9]],[[212315,526309],[-150,2]],[[212165,526311],[1,6248]],[[228234,526126],[-2091,12]],[[226143,526138],[-82,1]],[[226061,526139],[4,6455]],[[223289,532599],[-7,-6388]],[[223282,526211],[-1985,21]],[[221297,526232],[-451,10]],[[226061,526139],[-1995,51]],[[224066,526190],[-784,21]],[[212165,526311],[-2924,3]],[[185471,530663],[-559,-802],[1,-1628],[-449,-1027],[40,-1092],[-450,-1375]],[[184054,524739],[-389,162],[-477,-1895],[-334,3184]],[[255011,527072],[0,-1623],[-222,0],[-1,-3274],[-416,-8]],[[254372,522167],[-588,1081]],[[253784,523248],[-213,795],[48,1830]],[[253617,531924],[1399,-8],[-5,-4844]],[[238811,530199],[-2,-3213],[-238,7],[12,-4605]],[[238583,522388],[8,-3269]],[[238591,519119],[-693,16]],[[237898,519135],[-12,4886]],[[194274,528161],[-17,-1569],[-232,-20],[-118,-1642],[-36,-4874],[-1029,-1611],[-3,-3240],[-365,3],[-1,-3288]],[[192473,511920],[-459,14],[21,11394],[-200,2],[30,7432]],[[190466,530915],[-30,-11210],[-346,-1209],[4,-3243],[-336,0],[-17,-6512]],[[189741,508741],[-31,-6238]],[[189710,502503],[18,-3578]],[[189728,498925],[-493,1904],[19,851],[-442,2414]],[[188812,504094],[13,11149],[64,-1],[-3,5424],[-517,4],[-342,1882],[-405,1014]],[[192473,511920],[740,-88]],[[193213,511832],[-2,-3076]],[[193211,508756],[-2525,-183],[-945,168]],[[186549,522650],[-756,-105],[-628,-2189]],[[185165,520356],[-202,2287],[-909,2096]],[[157029,524550],[64,-2277]],[[157093,522273],[-464,-110]],[[156629,522163],[-284,1059],[-919,9]],[[155418,529962],[422,588]],[[239619,522318],[-1036,70]],[[242662,530269],[51,-9640]],[[242713,520629],[-344,-3]],[[242369,520626],[1,1598],[-1042,58],[-2,-1612],[-997,38]],[[240329,520708],[128,1598]],[[241982,530261],[680,8]],[[245796,530213],[-1,-3233],[691,9]],[[246486,526989],[-5,-6391]],[[246481,520598],[-2400,-12]],[[244081,520586],[-31,9670]],[[244050,530256],[1746,-43]],[[244081,520586],[-1368,43]],[[242662,530269],[1388,-13]],[[209244,525134],[12,-12455]],[[209256,512679],[-50,-4012]],[[209206,508667],[-2732,55]],[[206474,508722],[1,6548],[142,-1],[14,8098]],[[195875,520091],[-795,-463],[-177,-2269],[-459,3],[-573,-1889],[-130,-1894],[-228,1],[-2,-1751],[-298,3]],[[232297,529334],[32,-6470]],[[232329,522864],[-1381,-3]],[[230948,522861],[-32,4873]],[[234053,523114],[0,-270]],[[234053,522844],[-1724,20]],[[252041,527593],[20,-5420],[699,-8]],[[252760,522165],[-8,-6431]],[[252752,515734],[-696,32]],[[252056,515766],[-691,-1],[8,1610],[-344,-7]],[[251029,517368],[-3,8016]],[[158524,518913],[-1068,1088],[-329,768],[-34,1504]],[[165157,524279],[-366,-437]],[[164791,523842],[-599,-1643],[-746,-545],[-477,787]],[[162969,522441],[-731,-1785]],[[162238,520656],[-782,-457],[-46,928],[-635,569]],[[160775,521696],[-227,511]],[[203016,512065],[45,-3465]],[[203061,508600],[-4592,140]],[[198469,508740],[-941,-34]],[[197528,508706],[338,4067],[-1592,0],[48,4005],[104,578]],[[230948,522861],[3,-3246]],[[230951,519615],[-1623,13]],[[229328,519628],[-7,1157],[513,1813],[251,3529]],[[253784,523248],[-5,-1257],[-1019,174]],[[170424,527346],[13,-2609]],[[170437,524737],[-401,-3204],[0,-4053],[-226,-812],[-642,33],[1,-1373],[-751,-187],[117,-2760],[304,1],[77,-3742]],[[168916,508640],[-1797,-1]],[[167119,508639],[49,1621],[3,8063],[-287,1],[0,1597],[-519,16],[8,5874]],[[174020,513700],[-270,-3513]],[[173750,510187],[-1345,33]],[[172405,510220],[-1,1583],[-585,-10],[-295,3221],[-170,-21],[-112,3313],[-288,3247],[112,3192],[-629,-8]],[[255706,527059],[117,-1614],[-5,-6481],[175,-7]],[[255993,518957],[-480,-4770],[-502,-3587]],[[255011,510600],[-348,1798],[263,2652],[-666,243],[263,2751],[-117,1109],[148,2102],[-182,912]],[[255011,527072],[695,-13]],[[248253,525418],[-2,-6368]],[[248251,519050],[4,-3225]],[[248255,515825],[-1774,-76]],[[246481,515749],[0,4849]],[[246486,526989],[1045,-4]],[[214938,526300],[2,-8789]],[[214940,517511],[-1,-8089]],[[214939,509422],[-2667,29]],[[212272,509451],[0,3227]],[[212272,512678],[43,13631]],[[219085,526285],[420,-1613],[146,-2779],[-338,-2104]],[[219313,519789],[-136,-1298],[382,-971]],[[219559,517520],[-3144,-9]],[[216415,517511],[-1475,0]],[[212272,512678],[-3016,1]],[[221297,526232],[2,-6469]],[[221299,519763],[-1986,26]],[[185165,520356],[-3,-2744],[506,-651],[135,-1730],[3,-4866],[343,-1],[-2,-1637],[399,-13],[67,-3224],[282,-800],[791,-49],[1,-1346],[860,8]],[[188547,503303],[-98,-3225],[-306,273]],[[188143,500351],[-567,-771],[-129,1023],[-637,-764],[-533,835],[-280,-2222],[-237,583],[-858,91],[-96,-2022]],[[184806,497104],[-526,1386],[-10,1397],[-347,4611],[-317,914],[-262,-705],[-322,1502],[12,3599],[-287,1010],[-383,2793],[-233,2701],[-86,3614],[-272,360],[-94,1382]],[[224066,526190],[-2,-6467]],[[224064,519723],[-2738,40]],[[221326,519763],[-27,0]],[[226143,526138],[-2,-6467]],[[226141,519671],[-6,-6480]],[[226135,513191],[-2051,62]],[[224084,513253],[-13,1]],[[224071,513254],[-7,6469]],[[229328,519628],[389,-3087],[628,-1746]],[[230345,514795],[-1456,6],[-40,-559],[-610,15]],[[228239,514257],[-2,4850]],[[228237,519107],[-3,7019]],[[228237,519107],[-408,549],[-1688,15]],[[167119,508639],[-1415,-27]],[[165704,508612],[-332,4],[2,1361]],[[165374,509977],[84,1859],[-342,38],[2,1607],[-347,28],[20,10333]],[[251029,517368],[-1054,47]],[[249975,517415],[-10,1640],[-1714,-5]],[[172405,510220],[-826,-23],[-2,-1616],[-596,-11],[-301,1240],[-304,-1199],[-378,943],[-318,-1615]],[[169680,507939],[-764,701]],[[188812,504094],[-265,-791]],[[237898,519135],[-1086,-11]],[[236812,519124],[-341,4024]],[[165374,509977],[-1964,15]],[[163410,509992],[-23,268]],[[163387,510260],[-111,2406],[144,4765],[366,767],[-140,1600],[-677,2643]],[[206474,508722],[-142,2]],[[206332,508724],[-2606,-128]],[[203726,508596],[-665,4]],[[264518,520374],[-131,-4],[15,-7955]],[[264402,512415],[-335,1]],[[264067,512416],[-1024,59]],[[263043,512475],[5,1628]],[[263048,514103],[0,9278]],[[263048,523381],[752,-2509],[718,-498]],[[155426,523231],[0,-1322],[-345,8],[171,-1358],[345,-537],[-450,-2154],[-11,-1076]],[[155136,516792],[5,-4050],[-895,-4],[-1,-2602],[169,-4]],[[154414,510132],[-4,-597]],[[154410,509535],[-766,17]],[[153644,509552],[191,6726],[-98,7016]],[[156629,522163],[0,-1647],[515,-2132],[2,-1597]],[[157146,516787],[-2,-1893],[-345,-270]],[[156799,514624],[-745,2158],[-918,10]],[[236812,519124],[284,-2536]],[[237096,516588],[-222,-1934],[-373,-651]],[[236501,514003],[-342,795],[-1058,-11]],[[235101,514787],[1,1614],[-1027,-8]],[[234075,516393],[-22,6451]],[[232329,522864],[30,-6471]],[[232359,516393],[-1029,-8]],[[231330,516385],[-347,13],[-32,3217]],[[234075,516393],[-344,3]],[[233731,516396],[-1372,-3]],[[163387,510260],[-630,17],[17,875],[-376,1202],[-462,444],[26,1607],[414,1539],[112,2268],[-250,2444]],[[239619,522318],[0,-3212],[334,-17],[7,-2705]],[[239960,516384],[-1367,54]],[[238593,516438],[-2,2681]],[[240329,520708],[8,-1269],[308,-145],[354,-2359],[-276,-2708]],[[240723,514227],[-762,15]],[[239961,514242],[-1,2142]],[[242369,520626],[-5,-8010]],[[242364,512616],[-1676,1]],[[240688,512617],[35,1610]],[[159434,520800],[0,-1906],[284,-1586]],[[159718,517308],[-2287,-7],[-285,-514]],[[160775,521696],[1,-3313],[-117,6],[3,-4865],[-600,-5]],[[160062,513519],[3,2150],[-347,1639]],[[163410,509992],[120,-3800],[224,-797]],[[163754,505395],[-3866,75]],[[159888,505470],[69,1165]],[[159957,506635],[-195,2311],[405,1008],[-240,2616],[135,949]],[[184806,497104],[3,-2717],[-506,66]],[[184303,494453],[-906,-18]],[[183397,494435],[-56,1597],[-348,2544],[-106,-613],[-845,1224],[-633,3399],[-141,1577],[-365,-188],[52,2182],[-181,-234],[-402,-2430],[55,-904],[-491,-1772],[-716,3193],[20,1138]],[[179240,505148],[217,1309],[9,5102],[104,825]],[[309697,499440],[-326,8144],[343,308],[-203,5576]],[[310206,521389],[551,-1389],[510,-516],[-213,-1646],[200,-1811],[-163,-2048],[408,-2916],[145,1141],[349,-534],[352,-3817],[161,-2744],[-592,-2997],[-880,-140],[-164,-1985],[-252,636],[-149,-1354],[-202,2089],[-181,-786],[-141,-3116],[-248,1984]],[[304288,501470],[-305,-405],[-9,-1933],[-241,39]],[[303733,499171],[-304,-528]],[[303429,498643],[-117,2061],[-640,1070],[-291,3136],[-430,-1180],[-152,5250],[122,81],[-151,4819]],[[301770,513880],[26,2282],[518,-340],[-235,2392],[476,2921]],[[266792,512571],[-1372,-94]],[[265420,512477],[-1018,-62]],[[264518,520374],[261,-2226],[563,-388],[377,-1459],[555,-1119],[218,171],[319,-1624],[-19,-1158]],[[244081,520586],[-3,-6434]],[[244078,514152],[-2,-1591],[-344,26]],[[243732,512587],[-1368,29]],[[246481,515749],[-686,31],[0,-1629]],[[245795,514151],[-1717,1]],[[197528,508706],[-1036,15]],[[196492,508721],[-3281,35]],[[221326,519763],[-4,-6470]],[[221322,513293],[-1536,18]],[[219786,513311],[-157,1348],[119,1153],[-189,1708]],[[224071,513254],[-2371,30]],[[221700,513284],[-378,9]],[[228239,514257],[0,-2714]],[[228239,511543],[-746,-4]],[[227493,511539],[-1359,31]],[[226134,511570],[1,1621]],[[231330,516385],[37,-4380]],[[231367,512005],[-502,1311],[-471,406]],[[230394,513722],[-49,1073]],[[238593,516438],[-6,-3148]],[[238587,513290],[-26,17]],[[238561,513307],[-163,844],[-522,100],[-780,2337]],[[249975,517415],[-3,-6481]],[[249972,510934],[-1721,19]],[[248251,510953],[4,4872]],[[219786,513311],[-178,-2703],[123,-1549],[-311,141],[-36,-2389]],[[219384,506811],[-387,-2543],[-370,1156],[-115,-973]],[[218512,504451],[-583,56],[-208,-833],[-377,334]],[[217344,504008],[2,4597],[-1015,-5],[84,8911]],[[217344,504008],[-269,-1031],[-620,-1015],[-211,-1237],[-503,175],[-264,-1034],[-539,-243]],[[214938,499623],[1,9799]],[[252056,515766],[-6,-3234],[108,-1632]],[[252158,510900],[-950,13],[2,-1662]],[[251210,509251],[-675,9]],[[250535,509260],[-1,1663],[-562,11]],[[159957,506635],[-1845,-55],[-388,968],[-168,1539],[-534,2059],[129,2389],[-301,15]],[[156850,513550],[-51,1074]],[[156850,513550],[-529,-701],[118,-1993],[-202,-742]],[[156237,510114],[-1823,18]],[[238561,513307],[-382,-977],[-277,-2080],[-23,-1945]],[[237879,508305],[-685,14]],[[237194,508319],[-679,14]],[[236515,508333],[-14,5670]],[[239961,514242],[-4,-3220]],[[239957,511022],[-577,12],[2,-1654]],[[239382,509380],[-216,1966],[-579,1944]],[[235101,514787],[15,-8081]],[[235116,506706],[-1366,-14]],[[233750,506692],[5,4861]],[[233755,511553],[-24,4843]],[[233755,511553],[-2201,-4]],[[231554,511549],[-187,456]],[[248251,510953],[-430,7],[1,-1618],[-327,3]],[[247495,509345],[-1695,-50]],[[245800,509295],[-5,4856]],[[252752,515734],[340,-45],[-9,-3220],[342,-69],[182,-3245],[999,-1069]],[[254606,508086],[-385,-2583],[-242,-2789]],[[253979,502714],[-8,-1]],[[253971,502713],[-10,-1]],[[253961,502712],[-693,39]],[[253268,502751],[-16,3220],[-670,52]],[[252582,506023],[15,4858],[-439,19]],[[303429,498643],[-266,-4622],[-406,-3326]],[[302757,490695],[-370,576],[-32,2012],[-647,-2107],[393,-1789],[-189,-2754]],[[301912,486633],[-573,-442]],[[301339,486191],[-59,9209]],[[301280,495400],[-86,9641],[-121,9365]],[[301073,514406],[217,752],[480,-1278]],[[230394,513722],[3,-5426]],[[230397,508296],[-1199,-11]],[[229198,508285],[-5,3227],[-954,31]],[[236515,508333],[-686,5],[-1,-1627]],[[235828,506711],[-712,-5]],[[301280,495400],[-90,-874],[-585,120],[-254,-2830],[-201,2231]],[[300150,494047],[-446,794],[-524,2812]],[[299180,497653],[520,1849],[112,1481],[-264,3053],[383,3039],[-19,1891]],[[299912,508966],[388,4731],[214,622],[386,-1122],[173,1209]],[[240688,512617],[-96,-2433],[64,-4037]],[[240656,506147],[-95,-2136]],[[240561,504011],[-562,444],[-37,2206]],[[239962,506661],[96,22],[-1,4337],[-100,2]],[[245800,509295],[3,-3236]],[[245803,506059],[-2029,-25]],[[243774,506034],[-42,6553]],[[159888,505470],[-166,-669],[69,-1969]],[[159791,502832],[-1153,206],[-233,1075],[-632,10],[-781,720],[-578,-1960],[-382,1172]],[[156032,504055],[-98,1558],[388,2207],[-85,2294]],[[175529,510717],[154,-826],[-339,-5246],[150,-1455],[0,-3804]],[[175494,499386],[-398,-1021]],[[175096,498365],[-633,867],[-4,2312],[-267,893],[-1,3275],[-764,34]],[[173427,505746],[188,1739],[-44,1635],[179,1067]],[[231554,511549],[662,-3749],[173,-272]],[[232389,507528],[-309,-828],[-3,-1608],[-1679,19]],[[230398,505111],[-1,3185]],[[307819,495119],[63,-2040],[-255,1149],[192,891]],[[308823,498240],[322,-1211],[-422,-2791],[-256,1683],[356,2319]],[[309697,499440],[-194,-3153],[-121,2655],[-613,1159],[154,-1191],[-465,-1334],[31,1761],[-402,-1706],[118,-3275],[-828,3345],[180,1912],[-237,2131],[81,1096]],[[221700,513284],[1,-6478]],[[221701,506806],[-279,1]],[[221422,506807],[-2038,4]],[[224084,513253],[3,-6454]],[[224087,506799],[-1658,3]],[[222429,506802],[-728,4]],[[239382,509380],[135,-2743]],[[239517,506637],[-427,-1841]],[[239090,504796],[-535,227]],[[238555,505023],[9,1658],[-687,3],[2,1621]],[[226134,511570],[12,-9713]],[[226146,501857],[-2029,50]],[[224117,501907],[-30,4892]],[[179240,505148],[-395,-1629],[-367,938],[-230,-2310],[-308,-656],[142,-3508],[-185,-1567]],[[177897,496416],[-297,-1464],[-332,-476],[-1622,26],[-30,-1654],[-276,67]],[[175340,492915],[1,3219],[164,2],[-11,3250]],[[212272,509451],[-19,-8102],[-1681,-4]],[[210572,501345],[-701,13],[-660,-630]],[[209211,500728],[-5,7939]],[[242364,512616],[56,-6547]],[[242420,506069],[-1764,78]],[[243774,506034],[0,-3209]],[[243774,502825],[-1350,15]],[[242424,502840],[-4,3229]],[[262700,510888],[28,-4815]],[[262728,506073],[-1239,26],[-114,-876]],[[261375,505223],[-304,883]],[[261071,506106],[219,4694],[-69,1784]],[[261221,512584],[458,-41],[1,-1633],[1020,-22]],[[264067,512416],[-14,-6399]],[[264053,506017],[-1325,56]],[[262700,510888],[342,-33],[1,1620]],[[265420,512477],[-20,-6430]],[[265400,506047],[-1347,-30]],[[227493,511539],[8,-6473]],[[227501,505066],[-3,-4842]],[[227498,500224],[-1005,10]],[[226493,500234],[-9,1613],[-338,10]],[[229198,508285],[-7,-3210]],[[229191,505075],[-1690,-9]],[[233750,506692],[-653,-11],[0,-2565]],[[233097,504116],[-708,3412]],[[239962,506661],[-445,-24]],[[250535,509260],[0,-6476]],[[250535,502784],[-1731,66]],[[248804,502850],[-1313,5]],[[247491,502855],[4,6490]],[[252582,506023],[-689,19],[2,1616],[-685,-6],[0,1599]],[[173427,505746],[-386,-1718],[-295,-3771],[-220,-1145],[9,-3402]],[[172535,495710],[-741,0],[0,1607],[-293,1056],[-1060,-21],[-726,-3486]],[[169715,494866],[-738,-18],[245,2193],[-29,1556],[315,2472],[-553,1434],[612,1573],[-28,2092],[141,1771]],[[156032,504055],[-16,-547]],[[156016,503508],[-1263,17]],[[154753,503525],[-341,333],[-2,5677]],[[165704,508612],[55,-3188],[-10,-9610]],[[165749,495814],[-676,-6],[-2,1543],[-342,912],[-1014,-18],[1,2353]],[[163716,500598],[38,4797]],[[154753,503525],[15,-5367],[-344,3],[15,-1349],[-284,-294],[116,-1140]],[[154271,495378],[-947,-136]],[[153324,495242],[89,2630],[44,7616],[170,1569],[17,2495]],[[214938,499623],[-2,-12]],[[214936,499611],[-312,-1407],[-473,240],[-223,-2776],[-71,-2959],[-2964,11]],[[210893,492720],[-2,2156],[-338,-10],[19,6479]],[[247491,502855],[1,-4850]],[[247492,498005],[-1354,-31],[0,1610],[-337,6],[2,1612]],[[245803,501202],[0,4857]],[[253268,502751],[-7,-1765]],[[253261,500986],[-1005,106]],[[252256,501092],[3,1635],[-1724,57]],[[296979,508865],[60,-3256],[-127,-959]],[[296912,504650],[-471,86],[-134,-1750],[-359,-1101]],[[295948,501885],[-849,1672]],[[295099,503557],[103,5409]],[[295202,508966],[1777,-101]],[[299180,497653],[-205,-1076]],[[298975,496577],[-266,1736],[213,1023],[-144,949],[183,1193],[-188,668],[204,1295],[-286,976]],[[298691,504417],[181,2000],[-64,2447]],[[298808,508864],[1104,102]],[[295099,503557],[-145,-2596],[-226,-367]],[[294728,500594],[-75,974],[149,3512],[-119,604],[97,3231]],[[294780,508915],[422,51]],[[294728,500594],[65,-314]],[[294793,500280],[-930,-2004],[-662,-178]],[[293201,498098],[-213,5177],[-115,5361]],[[292873,508636],[1907,279]],[[298691,504417],[-203,-1307],[-284,945],[-413,-3859],[-312,778]],[[297479,500974],[-299,925],[174,1659],[-442,1092]],[[296979,508865],[1829,-1]],[[196492,508721],[81,-2399],[-1,-6525],[53,-2],[-1,-6560],[65,0]],[[196689,493235],[-1,-1658]],[[196688,491577],[-673,4],[0,-1649],[-344,-3],[9,-1603],[-502,-5],[2,-1644],[-615,-56]],[[194565,486621],[-361,2183],[-278,575],[-277,-718],[-66,-1424],[-340,-839],[-198,2909],[-377,-147],[-166,1088]],[[192502,490248],[0,2320],[-270,2958],[-406,2562],[50,1662],[-272,1203],[-814,-4],[0,1554],[-1080,0]],[[290927,508616],[234,-782],[324,-14558],[-26,-1329]],[[291459,491947],[-889,-543]],[[290570,491404],[-581,-367],[-299,867]],[[289690,491904],[-769,2247]],[[288921,494151],[-1154,3457]],[[287767,497608],[260,2084],[1343,6200],[870,2516],[687,208]],[[198469,508740],[221,-3931],[453,-2059],[152,401],[684,-2630]],[[199979,500521],[185,-1796],[287,-397],[154,-2197],[-5,-2948]],[[200600,493183],[-3911,52]],[[206332,508724],[28,-15345]],[[206360,493379],[-1,-12617]],[[206359,480762],[-2612,-65]],[[203747,480697],[21,19901]],[[203768,500598],[-42,7998]],[[203768,500598],[-1168,-134],[-2621,57]],[[293201,498098],[-645,-417],[133,-5013],[-525,-325]],[[292164,492343],[-705,-396]],[[290927,508616],[1946,20]],[[209211,500728],[4,-7271]],[[209215,493457],[-2855,-78]],[[169715,494866],[13,-4023]],[[169728,490843],[-1637,144],[-4,-1633],[-2343,-17]],[[165744,489337],[5,6477]],[[237194,508319],[5,-4865]],[[237199,503454],[-679,9],[-2,-1632],[-677,-5],[-1,1626]],[[235840,503452],[-12,3259]],[[238555,505023],[-264,-1739],[-417,-1265]],[[237874,502019],[-336,1431],[-339,4]],[[230398,505111],[0,-3258]],[[230398,501853],[-1,-1635]],[[230397,500218],[-1208,4]],[[229189,500222],[2,4853]],[[233097,504116],[341,-1014]],[[233438,503102],[0,-2921],[-654,12]],[[232784,500193],[-25,1633],[-1362,10]],[[231397,501836],[-999,17]],[[240561,504011],[200,-613]],[[240761,503398],[-169,-3191],[-689,-567],[1,-756]],[[239904,498884],[-675,2],[1,1340]],[[239230,500226],[-140,4570]],[[221422,506807],[-9,-6504]],[[221413,500303],[-2368,-13]],[[219045,500290],[-317,676],[77,2216],[-293,1269]],[[222429,506802],[32,-13076]],[[222461,493726],[-769,-45]],[[221692,493681],[-243,467]],[[221449,494148],[-36,6155]],[[224117,501907],[15,-8146]],[[224132,493761],[-628,-3]],[[223504,493758],[-1043,-32]],[[235840,503452],[-367,-8],[16,-4852]],[[235489,498592],[-437,8]],[[235052,498600],[-236,772]],[[234816,499372],[-1378,3730]],[[183397,494435],[-268,4],[1,-3240],[-116,1],[10,-3445],[227,-983],[-559,-2336],[-480,-1253],[-145,-1113]],[[182067,482070],[-654,3911],[-113,-749],[-563,1718],[-9,880],[-657,321],[-39,-921],[-426,1522],[-370,1],[1,1213],[-439,-1021]],[[178798,488945],[-55,216]],[[178743,489161],[-155,1983],[62,1848],[-398,879],[-33,1744],[-322,801]],[[242424,502840],[-1,-2696],[-504,27]],[[241919,500171],[-648,507],[-510,2720]],[[266980,506081],[138,-2704],[-131,-3751]],[[266987,499626],[-1582,-52]],[[265405,499574],[-5,6473]],[[265400,506047],[1580,34]],[[262728,506073],[-10,-6460]],[[262718,499613],[-1346,23]],[[261372,499636],[3,5587]],[[264053,506017],[3,-6475]],[[264056,499542],[-1338,71]],[[245803,501202],[-678,11]],[[245125,501213],[-1013,-15]],[[244112,501198],[-337,9]],[[243775,501207],[-1,1618]],[[265405,499574],[-1349,-32]],[[175096,498365],[-132,-2276],[-32,-3180],[-260,7]],[[174672,492916],[-1240,21]],[[173432,492937],[-217,1683],[-680,1090]],[[163716,500598],[-1231,-21],[0,-1605],[-450,-3],[1,-1609],[-331,10]],[[161705,497370],[-2049,35]],[[159656,497405],[135,5427]],[[239230,500226],[-677,-7]],[[238553,500219],[-1077,-8]],[[237476,500211],[398,1808]],[[229189,500222],[-676,-12]],[[228513,500210],[-1015,14]],[[297479,500974],[-166,-1452]],[[297313,499522],[-157,-1497],[-296,998],[-160,-1509],[-420,995]],[[296280,498509],[-67,1872],[-265,1504]],[[159656,497405],[121,-2500]],[[159777,494905],[-1469,-90],[-166,-673],[-532,204],[-411,1118],[-498,-542],[-6,-1095],[-722,-4],[-54,1557]],[[155919,495380],[-124,1127],[44,2998],[-133,924],[521,1787],[-211,1292]],[[219045,500290],[-133,-1712],[523,-288],[58,-1572],[781,-877],[538,-1239],[-128,-869]],[[220684,493733],[-1196,-11],[0,-483]],[[219488,493239],[-1893,-6]],[[217595,493233],[-334,-5],[34,9715],[49,1065]],[[260032,504518],[-8,-4869]],[[260024,499649],[-1160,99]],[[258864,499748],[-13,3454],[458,1388]],[[259309,504590],[723,-72]],[[298975,496577],[-544,-513],[-20,-3063]],[[298411,493001],[-914,898]],[[297497,493899],[402,4107],[-586,1516]],[[307394,502828],[-140,-1574],[180,-625],[-64,-1886],[-523,-588],[177,-1427],[-225,-1985]],[[306799,494743],[-257,114],[-412,2029],[-390,-679]],[[305740,496207],[-272,275]],[[305468,496482],[309,2126],[8,3412],[-219,979]],[[189728,498925],[5,-9134]],[[189733,489791],[-389,-951],[-593,-175]],[[188751,488665],[-448,-740],[-1162,821]],[[187141,488746],[-1,810],[-499,8],[1,1607]],[[186642,491171],[339,-6],[1,1607],[490,821],[16,2405],[169,1558],[484,18],[2,2777]],[[217595,493233],[-48,-3229]],[[217547,490004],[-2628,-7]],[[214919,489997],[17,9614]],[[296280,498509],[-410,-5407]],[[295870,493102],[-68,2573],[-938,-658]],[[294864,495017],[48,3057],[-119,2206]],[[155919,495380],[-1648,-2]],[[305468,496482],[-133,-1504],[-266,328],[-18,-2929],[-277,308]],[[304774,492685],[-7,9]],[[304767,492694],[-269,530],[-119,-1120],[-300,314]],[[304079,492418],[-196,1521],[-150,5232]],[[237476,500211],[-51,-1567]],[[237425,498644],[-1936,-52]],[[241919,500171],[207,-1615]],[[242126,498556],[-525,16],[0,-1617],[-335,5],[-1,-3232]],[[241265,493728],[-356,11]],[[240909,493739],[-1010,22]],[[239899,493761],[5,5123]],[[234816,499372],[-1,-4019],[-672,-9],[-4,-1614]],[[234139,493730],[-985,19]],[[233154,493749],[-366,-7]],[[232788,493742],[-4,6451]],[[250535,502784],[-3,-8151]],[[250532,494633],[-1040,40]],[[249492,494673],[-353,36]],[[249139,494709],[-5,4907],[-328,5],[-2,3229]],[[249139,494709],[-495,34]],[[248644,494743],[-1141,-13]],[[247503,494730],[-11,3275]],[[253979,502714],[-8,-1]],[[253961,502712],[-152,-2104],[333,-531],[464,2017]],[[254606,502094],[-10,-5904]],[[254596,496190],[-339,8],[-1,-1624],[-432,11]],[[253824,494585],[-416,19]],[[253408,494604],[6,6419],[-153,-37]],[[243775,501207],[-1056,-193],[-152,-3332]],[[242567,497682],[-441,874]],[[252256,501092],[-364,1],[-9,-6465]],[[251883,494628],[-409,-12]],[[251474,494616],[-942,17]],[[255685,502676],[-302,-3068],[-168,-3412]],[[255215,496196],[-619,-6]],[[254606,502094],[73,609]],[[254679,502703],[1006,-27]],[[192502,490248],[5,-10113]],[[192507,480135],[-16,-1620],[-799,3],[0,-1615],[-653,8],[-1,-1050]],[[191038,475861],[-655,-1],[0,1503],[-643,-3]],[[189740,477360],[-2,3452]],[[189738,480812],[-5,8979]],[[226493,500234],[-2,-6499]],[[226491,493735],[-1332,24]],[[225159,493759],[-1027,2]],[[231397,501836],[40,-8076]],[[231437,493760],[-1042,2]],[[230395,493762],[2,6456]],[[232788,493742],[-1310,16]],[[231478,493758],[-41,2]],[[210893,492720],[-1678,5]],[[209215,492725],[0,732]],[[244112,501198],[-2,-6505],[-219,-856],[207,-1949],[-69,-1318]],[[244029,490570],[-834,3122]],[[243195,493692],[-279,3080],[-349,910]],[[245125,501213],[38,-9631]],[[245163,491582],[-433,-275],[-41,-1497],[-287,-3]],[[244402,489807],[-373,763]],[[247503,494730],[-1,-1740]],[[247502,492990],[-1654,56],[-187,-1630]],[[245661,491416],[-498,166]],[[253408,494604],[-589,39]],[[252819,494643],[-936,-15]],[[186642,491171],[-1501,14],[-1,-1610]],[[185140,489575],[-834,8],[-3,4870]],[[203747,480697],[-170,-9]],[[203577,480688],[-2877,-40],[0,148]],[[200700,480796],[-49,12388],[-51,-1]],[[165744,489337],[-329,0],[-5,-4859],[-337,5]],[[165073,484483],[-1002,8],[0,1610],[-336,-4],[-1,1618],[-1028,-13],[-1,1606],[-664,64],[-2,3219],[-321,78],[-13,4701]],[[221449,494148],[180,-1780],[-748,46],[-197,1319]],[[294864,495017],[-214,-1345],[-132,-2763],[162,-4374]],[[294680,486535],[-165,-91]],[[294515,486444],[-1724,-1102]],[[292791,485342],[28,960],[-465,275],[-343,2130],[225,833],[-72,2803]],[[238553,500219],[-2,-6472]],[[238551,493747],[-677,-2]],[[237874,493745],[1,808],[-680,-7]],[[237195,494546],[220,1969],[10,2129]],[[239899,493761],[-13,0]],[[239886,493761],[-1005,-6]],[[238881,493755],[-330,-8]],[[228513,500210],[-4,-6463]],[[228509,493747],[-670,-20]],[[227839,493727],[-1336,7]],[[226503,493734],[-12,1]],[[230395,493762],[0,-2]],[[230395,493760],[-1217,-20]],[[229178,493740],[-669,7]],[[260024,499649],[-9,-6493]],[[260015,493156],[-615,54]],[[259400,493210],[-964,215]],[[258436,493425],[364,3555],[64,2768]],[[261372,499636],[-2,-6463]],[[261370,493173],[-640,-4]],[[260730,493169],[-715,-13]],[[260024,499649],[1348,-13]],[[264056,499542],[8,-6454]],[[264064,493088],[-669,-1]],[[263395,493087],[-679,16]],[[262716,493103],[2,6510]],[[262716,493103],[-656,53]],[[262060,493156],[-690,17]],[[266987,499626],[-62,-3377],[-470,-1067],[-157,-2039]],[[266298,493143],[-886,-32]],[[265412,493111],[-7,6463]],[[265412,493111],[-786,0]],[[264626,493111],[-562,-23]],[[175340,492915],[-169,-3],[-24,-6409]],[[175147,486503],[-644,5]],[[174503,486508],[-557,-1]],[[173946,486507],[0,3241],[391,-17],[114,1595],[220,-13],[1,1603]],[[214919,489997],[-32,-5323],[-335,-145]],[[214552,484529],[-104,-245],[-1766,9]],[[212682,484293],[343,3116],[-3812,-38]],[[209213,487371],[2,5354]],[[297497,493899],[-208,-1404],[-408,589],[-262,-2738],[-163,304]],[[296456,490650],[-487,788],[-99,1664]],[[235052,498600],[862,-2186],[274,-1379]],[[236188,495035],[12,-2914]],[[236200,492121],[-1368,-13]],[[234832,492108],[-669,3],[-24,1619]],[[304079,492418],[-79,-2770]],[[304000,489648],[-229,-1286],[-556,2438],[-134,-953],[-324,848]],[[237195,494546],[-163,-1485],[-844,1974]],[[243195,493692],[-616,1],[0,-1602]],[[242579,492091],[-668,7],[-1,1620],[-645,10]],[[173432,492937],[-215,-1207],[111,-1864],[-135,-2003]],[[173193,487863],[-118,-728],[-1,-2989]],[[173074,484146],[-2,-31285]],[[173072,452861],[-3259,-52]],[[169813,452809],[-49,5195],[-6,11887],[-34,1],[4,20951]],[[300150,494047],[150,-5520],[-565,-418],[90,-2385]],[[299825,485724],[28,-1263],[-360,-305],[-213,-2183]],[[299280,481973],[-251,-348],[-88,1240],[-239,-1545]],[[298702,481320],[-1098,1335]],[[297604,482655],[73,1782],[273,1403]],[[297950,485840],[461,7161]],[[165073,484483],[-1,-1675]],[[165072,482808],[-3996,131]],[[161076,482939],[-1866,-3]],[[159210,482936],[77,4514],[296,1024],[283,3754],[-89,2677]],[[286590,490299],[-326,1891],[242,1614],[1261,3804]],[[288921,494151],[-278,-2135],[171,-536],[-163,-1981],[-600,-1657],[-229,97],[184,-3632]],[[288006,484307],[-698,337],[-439,-516]],[[286869,484128],[-30,11]],[[286839,484139],[-17,6]],[[286822,484145],[-93,2653],[-183,296],[473,1068],[-221,1527],[192,1727],[-400,-1117]],[[306799,494743],[-208,-3179],[83,-579],[-394,-2171],[-422,631],[40,936]],[[305898,490381],[198,677],[-157,2939],[-190,25],[-9,2185]],[[178743,489161],[-409,649],[-97,1866],[-374,-2892],[-523,-708],[-420,-3555],[-517,-1774],[-404,-258]],[[175999,482489],[-852,4014]],[[305898,490381],[-88,1150],[-333,-4457],[-153,1112],[-294,-802],[27,3033],[-191,-1421]],[[304866,488996],[63,1228],[-293,335]],[[304636,490559],[138,2126]],[[255215,496196],[9,-3137],[-283,-948],[-251,-4019]],[[254690,488092],[-862,-9]],[[253828,488083],[-4,6502]],[[296456,490650],[-138,-1260]],[[296318,489390],[-526,-1476],[60,-1043]],[[295852,486871],[-725,197],[35,-1310],[-435,-258]],[[294727,485500],[-47,1035]],[[159210,482936],[-357,-1082],[-3,-2172]],[[158850,479682],[-1696,-62],[-3,2000],[-1023,-131],[-80,4508],[-585,9],[-506,918],[-251,1688],[-580,464],[-273,-1479],[-649,-39]],[[153204,487558],[120,7684]],[[301339,486191],[74,-4637]],[[301413,481554],[-561,-31]],[[300852,481523],[-271,609],[-756,3592]],[[237874,493745],[1,-6477]],[[237875,487268],[-1335,-3]],[[236540,487265],[-340,-1]],[[236200,487264],[0,4857]],[[248644,494743],[4,-1204],[-356,-1774],[167,-1778],[17,-2211],[271,-1702],[222,-2658]],[[248969,483416],[-1467,-1]],[[247502,483415],[1,1682]],[[247503,485097],[-1,7893]],[[249492,494673],[0,-4905]],[[249492,489768],[-4,-6323]],[[249488,483445],[-519,-29]],[[251474,494616],[2,-4829]],[[251476,489787],[-786,-8]],[[250690,489779],[-1198,-11]],[[252819,494643],[-1,-5695]],[[252818,488948],[3,-842],[-1344,42]],[[251477,488148],[-1,1639]],[[253828,488083],[-336,-5]],[[253492,488078],[2,861],[-676,9]],[[185140,489575],[-7,-6496]],[[185133,483079],[-5,-1541],[-325,-81],[-2,-1617],[-333,6],[-31,-3058],[-167,-6]],[[184270,476782],[-988,-2],[0,1537],[-762,6],[71,2286],[-253,1758],[-271,-297]],[[297950,485840],[-1609,2938],[-23,612]],[[289857,482936],[-1180,-3639],[-620,942]],[[288057,480239],[-51,4068]],[[289690,491904],[167,-8968]],[[222306,488875],[139,-1400],[-276,-1472],[-156,-2285],[239,-7],[215,-2925]],[[222467,480786],[-656,1]],[[221811,480787],[-251,2],[-1,4521],[-205,287],[-400,-1289],[-686,-69],[-402,533]],[[219866,484772],[-299,60]],[[219567,484832],[-76,2418],[-3,5989]],[[221692,493681],[38,-1692],[582,-1978],[-6,-1136]],[[231478,493758],[-2,-6467]],[[231476,487291],[-1083,9]],[[230393,487300],[2,6460]],[[233154,493749],[0,-6482]],[[233154,487267],[-1644,21]],[[231510,487288],[-34,3]],[[225159,493759],[1,-4821]],[[225160,488938],[-1327,-45]],[[223833,488893],[-332,-2]],[[223501,488891],[3,4867]],[[239886,493761],[1,-6484]],[[239887,487277],[-11,1]],[[239876,487278],[-995,-7]],[[238881,487271],[0,6484]],[[240909,493739],[-31,-6461]],[[240878,487278],[-991,-1]],[[230393,487300],[-1213,-24]],[[229180,487276],[-2,6464]],[[238881,487271],[-673,1]],[[238208,487272],[-333,-4]],[[223501,488891],[-1195,-16]],[[226503,493734],[-5,-6430]],[[226498,487304],[-323,15]],[[226175,487319],[-997,7]],[[225178,487326],[-18,1612]],[[242579,492091],[0,-4839]],[[242579,487252],[-1030,-242]],[[241549,487010],[-671,268]],[[234832,492108],[2,-4840]],[[234834,487268],[-1653,0]],[[233181,487268],[-27,-1]],[[229180,487276],[-670,-7]],[[228510,487269],[-670,12]],[[227840,487281],[-1,6446]],[[227840,487281],[-666,8]],[[227174,487289],[-676,15]],[[244402,489807],[393,-2555]],[[244795,487252],[-1244,-3]],[[243551,487249],[-972,3]],[[209213,487371],[2,-6521]],[[209215,480850],[-2355,-66]],[[206860,480784],[-501,-22]],[[259400,493210],[11,-6544]],[[259411,486666],[-1095,71]],[[258316,486737],[-227,4106],[347,2582]],[[304000,489648],[314,-1030]],[[304314,488618],[155,528]],[[304469,489146],[-41,-1011]],[[304428,488135],[-42,-1969],[-144,1439],[-555,-1235],[-307,-2322],[164,-2049],[-435,-545]],[[303109,481454],[-386,1325],[-161,2029],[-306,-177],[3,1605],[-347,397]],[[219567,484832],[-690,962],[-260,-1067],[-280,233],[-415,1974],[-376,206]],[[217546,487140],[1,2864]],[[200700,480796],[-1181,20]],[[199519,480816],[-168,0]],[[199351,480816],[0,2700],[-338,-12],[1,1631],[-670,1],[0,1587],[-984,520],[1,1055],[-333,2],[5,1651],[-345,1626]],[[304469,489146],[96,425],[146,-4224],[-211,-752],[-72,3540]],[[304747,485718],[-31,9]],[[304716,485727],[-143,4024],[63,808]],[[304866,488996],[-144,-864],[186,-1284],[-161,-1130]],[[304767,492694],[-187,-2521],[-266,-1555]],[[260730,493169],[6,-6502]],[[260736,486667],[-1325,-1]],[[262060,493156],[-5,-6526]],[[262055,486630],[-1319,37]],[[263395,493087],[5,-6428]],[[263400,486659],[-1345,-29]],[[264626,493111],[-1,-3070]],[[264625,490041],[-2,-3183]],[[264623,486858],[-1223,-199]],[[247503,485097],[-1667,-111]],[[245836,484986],[-8,6442],[-167,-12]],[[173946,486507],[-392,-271],[-361,1627]],[[292791,485342],[-439,-294],[152,-6649]],[[292504,478399],[55,-2189]],[[292559,476210],[-1099,-481],[-496,1080]],[[290964,476809],[-432,1000],[257,2733],[-219,10862]],[[236200,487264],[-1352,5]],[[234848,487269],[-14,-1]],[[178798,488945],[-51,-1480]],[[178747,487465],[-147,-2107],[27,-2295],[-141,-364],[-9,-7525]],[[178477,475174],[-1,-5281],[148,-48]],[[178624,469845],[-11,-2675]],[[178613,467170],[-1161,-3],[35,3027],[-978,384],[-398,937],[-84,-1083],[-654,1956],[-183,1187]],[[175190,473575],[801,17],[8,8897]],[[290964,476809],[48,-2086],[-179,-2358]],[[290833,472365],[-10,-3429]],[[290823,468936],[-322,652],[-79,-1360],[-540,1548],[-309,-528]],[[289573,469248],[-20,3211],[418,3255],[-260,632],[239,1293],[-93,5297]],[[245836,484986],[-965,56]],[[244871,485042],[-76,2210]],[[199351,480816],[0,-542],[-2070,-233],[-331,808],[-664,542],[-332,1359],[-995,270],[0,1479],[-394,2122]],[[187141,488746],[-18,-3230],[156,229],[838,-2596]],[[188117,483149],[-2489,-4]],[[185628,483145],[-495,-66]],[[169813,452809],[-3140,-58]],[[166673,452751],[-101,8]],[[166572,452759],[-14,14051],[-1606,-147],[6,8084],[116,22],[-2,8039]],[[199519,480816],[49,-535],[44,-12867],[-117,0],[4,-6462],[53,0]],[[199552,460952],[1,-3214]],[[199553,457738],[-4238,36]],[[195315,457774],[-81,8002],[-208,644],[-621,4049],[-508,1246],[-388,4712],[-175,3678],[-827,30]],[[265345,488432],[-13,-4364],[594,-1608]],[[265926,482460],[2,-2061]],[[265928,480399],[-330,807],[-651,39],[-327,828]],[[264620,482073],[3,4785]],[[264625,490041],[337,2],[2,-1583],[381,-28]],[[217546,487140],[-458,-847],[2,-7566]],[[217090,478727],[-2459,14]],[[214631,478741],[-79,1615],[0,4173]],[[184270,476782],[-1,-3235]],[[184269,473547],[-657,2],[18,-6493],[161,-1616],[-161,-936]],[[183630,464504],[-371,1135],[-285,-316]],[[182974,465323],[1,3350],[164,1],[-2,6526],[-838,4]],[[182299,475204],[-1840,-8]],[[180459,475196],[-55,2307],[-389,209],[74,2719],[-486,2041],[-29,3598],[-455,236],[-372,1159]],[[189738,480812],[-430,715],[-125,1527],[-435,6]],[[188748,483060],[3,5605]],[[251477,488148],[-1,-4871]],[[251476,483277],[-337,-10]],[[251139,483267],[-664,187]],[[250475,483454],[215,6325]],[[250475,483454],[-987,-9]],[[297604,482655],[-139,-531],[-150,-6298]],[[297315,475826],[-695,-198],[-380,612]],[[296240,476240],[-135,842]],[[296105,477082],[40,1310],[261,-316],[91,2133],[-178,490],[251,3496],[-332,633],[104,1629],[-255,1002],[-235,-588]],[[158850,479682],[187,-616],[253,-2714],[-330,-3406],[-529,-206],[-3,-1355]],[[158428,471385],[-330,3],[-438,-1061],[-659,-2952],[-995,-473],[-214,-851]],[[155792,466051],[-606,-122],[-747,708],[-3,820]],[[154436,467457],[-267,105]],[[154169,467562],[-22,3823],[330,1722],[-6,3184],[-170,-24],[1,3264],[-310,1556],[0,1719],[-955,38]],[[153037,482844],[167,4714]],[[253492,488078],[4,-6488]],[[253496,481590],[-667,11]],[[252829,481601],[-2,1626],[-1351,50]],[[225178,487326],[13,-6561]],[[225191,480765],[-1074,13]],[[224117,480778],[-247,-3]],[[223870,480775],[-37,8118]],[[223870,480775],[-1403,11]],[[188748,483060],[-631,89]],[[254690,488092],[83,-3796],[-251,-2704]],[[254522,481592],[-691,-13]],[[253831,481579],[-335,11]],[[174503,486508],[-1,-3222],[108,-1],[2,-3245],[-111,-9],[5,-3147]],[[174506,476884],[-750,3480],[-170,2161],[-512,1621]],[[219866,484772],[49,-6023]],[[219915,478749],[-2825,-22]],[[180459,475196],[-612,-24]],[[179847,475172],[-1370,2]],[[296105,477082],[-1078,260]],[[295027,477342],[17,4427],[-151,1362],[-345,331],[179,2038]],[[212682,484293],[-532,-1540],[1,-2394]],[[212151,480359],[-2937,18]],[[209214,480377],[1,473]],[[231510,487288],[-2,-6495]],[[231508,480793],[-1114,5]],[[230394,480798],[-1,6502]],[[233181,487268],[-6,-6467]],[[233175,480801],[-1132,-10]],[[232043,480791],[-535,2]],[[239876,487278],[3,-6493]],[[239879,480785],[-1250,-4]],[[238629,480781],[-422,3]],[[238207,480784],[1,6488]],[[241549,487010],[0,-6211]],[[241549,480799],[-290,-4]],[[241259,480795],[-1313,-10]],[[239946,480785],[-67,0]],[[244871,485042],[-34,-2081],[143,-2160]],[[244980,480801],[-1096,2]],[[243884,480803],[-334,1]],[[243550,480804],[1,6445]],[[226175,487319],[6,-6546]],[[226181,480773],[-417,-14]],[[225764,480759],[-573,6]],[[227174,487289],[5,-6502]],[[227179,480787],[-998,-14]],[[243550,480804],[-972,-1]],[[242578,480803],[-1029,-4]],[[234848,487269],[-4,-6462]],[[234844,480807],[-164,-8]],[[234680,480799],[-1319,-4]],[[233361,480795],[-186,6]],[[238207,480784],[-898,-1]],[[237309,480783],[-772,10]],[[236537,480793],[3,6472]],[[230394,480798],[-407,0]],[[229987,480798],[-908,-8]],[[229079,480790],[-570,-5]],[[228509,480785],[1,6484]],[[236537,480793],[-543,5]],[[235994,480798],[-1150,9]],[[228509,480785],[-758,1]],[[227751,480786],[-572,1]],[[264620,482073],[-6,-1618],[-556,-297]],[[264058,480158],[-662,0]],[[263396,480158],[4,6501]],[[259411,486666],[-4,-6482]],[[259407,480184],[-1174,91]],[[258233,480275],[-220,3394],[303,3068]],[[263396,480158],[-664,2]],[[262732,480160],[-666,1]],[[262066,480161],[-11,6469]],[[303109,481454],[-237,-3363],[-309,-544],[-343,-4752],[-437,1186]],[[301783,473981],[56,1698],[-493,2897],[67,2978]],[[262066,480161],[-1330,38]],[[260736,480199],[0,6468]],[[260736,480199],[0,-3239]],[[260736,476960],[-635,-23]],[[260101,476937],[-693,9],[-1,3238]],[[295027,477342],[-54,-6909]],[[294973,470433],[-1008,-44]],[[293965,470389],[167,2590],[-54,4202]],[[294078,477181],[-94,3357],[378,3143],[153,2763]],[[175190,473575],[-334,1506],[-129,1914],[-221,-111]],[[294078,477181],[-671,-975],[-134,2686],[-769,-493]],[[221811,480787],[-2,-9342]],[[221809,471445],[-1850,12]],[[219959,471457],[-44,7292]],[[300852,481523],[10,-3416],[-211,-1324]],[[300651,476783],[-895,3174],[-123,-380],[-353,2396]],[[266573,485031],[2,-1115],[972,142]],[[267547,484058],[-7,-6487]],[[267540,477571],[-652,-90],[7,-1620],[-304,-225]],[[266591,475636],[-654,-32]],[[265937,475604],[-9,4795]],[[265926,482460],[509,2703],[138,-132]],[[247502,483415],[4,-1619]],[[247506,481796],[-1005,-19],[9,-2420]],[[246510,479357],[-1496,-1]],[[245014,479356],[-34,1445]],[[286839,484139],[-17,6]],[[288057,480239],[-163,246],[-201,-2952],[7,-3154]],[[287700,474379],[-304,517]],[[287396,474896],[-580,1634],[-156,-692],[-618,-120]],[[286042,475718],[-350,485],[-33,3060]],[[285659,479263],[575,1959],[489,118],[146,2788]],[[214631,478741],[5,-4840],[73,-2431]],[[214709,471470],[-1977,12]],[[212732,471482],[-581,14]],[[212151,471496],[0,8863]],[[269259,474627],[-1374,-276]],[[267885,474351],[-11,2435],[-334,785]],[[267547,484058],[1423,278]],[[268970,484336],[189,-4720],[100,-4989]],[[178613,467170],[-2,-14381]],[[178611,452789],[-3086,40],[-2428,19]],[[173097,452848],[-25,13]],[[251139,483267],[-6,-6482]],[[251133,476785],[-1981,150]],[[249152,476935],[333,1631],[5,3332],[-358,175],[-163,1343]],[[249152,476935],[-329,-1617]],[[248823,475318],[-991,-774]],[[247832,474544],[6,7270],[-332,-18]],[[252829,481601],[-49,-6494]],[[252780,475107],[-328,25]],[[252452,475132],[-1318,30]],[[251134,475162],[-1,1623]],[[189740,477360],[2,-5505]],[[189742,471855],[-1522,-1]],[[188220,471854],[5,4870],[-654,10],[0,1563],[-614,10],[-169,1087],[-1161,0],[1,3751]],[[188220,471854],[-1319,43]],[[186901,471897],[-1652,-8],[-264,-1313]],[[184985,470576],[-183,-1641],[-532,-4],[-1,4616]],[[161076,482939],[-46,-16196],[1299,-29],[10,-13964]],[[162339,452750],[-1582,69]],[[160757,452819],[-2346,191]],[[158411,453010],[17,18375]],[[166572,452759],[-1780,10]],[[164792,452769],[-2453,-19]],[[289573,469248],[-100,-158]],[[289473,469090],[-527,-153],[-20,1299],[-279,-24],[-23,1969],[-519,2369],[-405,-171]],[[300651,476783],[-32,-196]],[[300619,476587],[-404,-4938]],[[300215,471649],[-352,1116],[-342,-274],[-74,1832],[-524,-693],[-159,1711],[-267,-361]],[[298497,474980],[-226,2507],[101,2207],[330,1626]],[[154169,467562],[-316,-270],[-199,-1662],[-396,-276],[-61,3940],[-268,1346],[-619,4]],[[152310,470644],[269,5889],[458,6311]],[[298497,474980],[-81,-1100]],[[298416,473880],[-391,59],[61,931],[-822,-384]],[[297264,474486],[51,1340]],[[301783,473981],[-163,-963]],[[301620,473018],[-513,-14],[127,1049],[-615,2534]],[[265937,475604],[-658,-19],[7,-1631]],[[265286,473954],[-1222,-81]],[[264064,473873],[-6,6285]],[[247832,474544],[-657,679]],[[247175,475223],[-660,-543]],[[246515,474680],[-5,4677]],[[254522,481592],[-329,-5331],[50,-1204]],[[254243,475057],[-476,2]],[[253767,475059],[64,6520]],[[253767,475059],[-987,48]],[[238629,480781],[-1,-4543]],[[238628,476238],[-1318,-2]],[[237310,476236],[-1,4547]],[[237308,469765],[-1314,6]],[[235994,469771],[-1,6459]],[[235993,476230],[1,4568]],[[237310,476236],[-2,-6471]],[[234682,476230],[-1321,3]],[[233361,476233],[0,4562]],[[234680,480799],[2,-4569]],[[235993,476230],[-1311,0]],[[239947,476239],[-1319,-1]],[[239946,480785],[1,-4546]],[[233361,476233],[-1320,44]],[[232041,476277],[2,4514]],[[209214,480377],[5,-8812]],[[209219,471565],[1,-7313]],[[209220,464252],[-1680,-40]],[[207540,464212],[-659,-10]],[[206881,464202],[-21,16582]],[[241256,475444],[-1309,0]],[[239947,475444],[0,795]],[[241259,480795],[-3,-5351]],[[232041,476277],[-1932,42]],[[230109,476319],[87,2489],[-209,1990]],[[242578,480803],[-3,-5357]],[[242575,475446],[-1319,-2]],[[245014,479356],[4,-1361],[405,-1716],[-330,-3303]],[[245093,472976],[-1193,26]],[[243900,473002],[-16,7801]],[[243900,473002],[-1326,21]],[[242574,473023],[1,2423]],[[230109,476319],[223,-746],[59,-2539]],[[230391,473034],[-980,6]],[[229411,473040],[-330,1]],[[229081,473041],[-2,7749]],[[206881,464202],[-1098,-58],[7,-3247]],[[205790,460897],[-134,-6],[-121,-2624],[-664,266],[161,2348],[-1442,50]],[[203590,460931],[-6,-1]],[[203584,460930],[-7,19758]],[[224117,480778],[91,-2392],[1571,-3239]],[[225779,475147],[90,-531]],[[225869,474616],[-47,-3529],[-165,-2602]],[[225657,468485],[-436,812]],[[225221,469297],[-526,2161]],[[224695,471458],[-1032,3040],[-78,1581],[-470,1324],[-243,2027],[-405,1356]],[[229081,473041],[-659,-11]],[[228422,473030],[0,1617],[-664,-11]],[[227758,474636],[-7,6150]],[[227758,474636],[-664,-12]],[[227094,474624],[-1225,-8]],[[225779,475147],[-15,5612]],[[203584,460930],[-1530,-50],[-2502,72]],[[224695,471458],[-2109,-11]],[[222586,471447],[-777,-2]],[[212151,471496],[-1401,0]],[[210750,471496],[-1531,69]],[[260101,476937],[-1,-1635]],[[260100,475302],[-328,14],[3,-1620],[-1016,-10]],[[258759,473686],[-526,6589]],[[262732,480160],[25,-6465]],[[262757,473695],[-1325,-1]],[[261432,473694],[1,3265],[-697,1]],[[195315,457774],[-2814,132]],[[192501,457906],[-1359,125],[-5,3185],[-131,-2],[32,14647]],[[264064,473873],[0,-195]],[[264064,473678],[-1307,17]],[[246515,474680],[-1111,-3346],[-255,-72]],[[245149,471262],[-56,1714]],[[286042,475718],[-35,-4144],[115,-2963],[261,68],[229,-1455]],[[286612,467224],[26,-2750]],[[286638,464474],[-1117,-2]],[[285521,464472],[-187,1944],[55,5513]],[[285389,471929],[-24,5904]],[[285365,477833],[294,1430]],[[293965,470389],[-115,-2942]],[[293850,467447],[-369,-82]],[[293481,467365],[-266,2463],[-523,831]],[[292692,470659],[-14,505]],[[292678,471164],[-119,5046]],[[217090,478727],[0,-7284]],[[217090,471443],[-2381,27]],[[219959,471457],[-2869,-14]],[[281818,478275],[-5,-4317]],[[281813,473958],[-1305,-81]],[[280508,473877],[0,4511]],[[280508,478388],[1310,-113]],[[280508,473877],[4,-838]],[[280512,473039],[-752,7],[-414,-1124]],[[279346,471922],[-518,1158],[12,3306],[719,1122],[949,880]],[[283548,476628],[9,-4500]],[[283557,472128],[-318,-2],[8,-1702],[-272,15]],[[282975,470439],[-429,33],[9,794],[-498,-12]],[[282057,471254],[10,2715],[-254,-11]],[[281818,478275],[657,-443],[527,-1887],[546,683]],[[285389,471929],[-697,-202]],[[284692,471727],[-474,498],[-661,-97]],[[283548,476628],[635,251],[429,-526],[753,1480]],[[267885,474351],[36,-4847]],[[267921,469504],[-333,-95]],[[267588,469409],[-976,-153]],[[266612,469256],[-21,6380]],[[192501,457906],[16,-12908]],[[192517,444998],[-2780,45]],[[189737,445043],[-3,7851]],[[189734,452894],[0,9524]],[[189734,462418],[8,9437]],[[296240,476240],[-137,-2650],[-357,111],[-31,-3519],[241,-61],[-25,-3493]],[[295931,466628],[-259,36]],[[295672,466664],[-674,89]],[[294998,466753],[-25,3680]],[[251134,475162],[-13,-6522]],[[251121,468640],[-991,-43]],[[250130,468597],[-1307,230]],[[248823,468827],[0,6491]],[[261432,473694],[8,-6496]],[[261440,467198],[-657,-32]],[[260783,467166],[-660,1]],[[260123,467167],[-23,8135]],[[292678,471164],[-1239,48],[-606,1153]],[[301620,473018],[189,655],[301,-1389],[-295,-3187]],[[301815,469097],[-594,-238],[-94,-983],[-503,-1186]],[[300624,466690],[-506,1532],[-67,1970],[164,1457]],[[287396,474896],[215,-2006],[56,-5300]],[[287667,467590],[-1055,-366]],[[297264,474486],[21,-2797],[-310,-2919],[270,-2371]],[[297245,466399],[-1314,229]],[[232041,476277],[7,-6487]],[[232048,469790],[-1892,-6]],[[230156,469784],[78,2629],[157,621]],[[233361,476233],[0,-6428]],[[233361,469805],[-1313,-15]],[[239947,475444],[-3,-5679]],[[239944,469765],[-1319,14]],[[238625,469779],[3,6459]],[[238625,469779],[-1317,-14]],[[235994,469771],[-1312,30]],[[234682,469801],[0,6429]],[[234682,469801],[-1321,4]],[[266612,469256],[-658,-171],[8,-1638]],[[265962,467447],[-657,-45]],[[265305,467402],[-19,6552]],[[242574,473023],[-1,-3272]],[[242573,469751],[-1317,2]],[[241256,469753],[0,5691]],[[241256,469753],[-1312,12]],[[248823,468827],[0,-811]],[[248823,468016],[-1640,-18]],[[247183,467998],[-8,7225]],[[247183,467998],[1,-5693]],[[247184,462305],[-597,23]],[[246587,462328],[-172,2280],[-542,826]],[[245873,465434],[-469,1434],[-255,4394]],[[300624,466690],[-29,-121]],[[300595,466569],[-107,-728],[-1684,269]],[[298804,466110],[-84,15]],[[298720,466125],[-215,4313],[-157,17],[68,3425]],[[260123,467167],[-1187,-13]],[[258936,467154],[-49,4105],[-128,2427]],[[182299,475204],[2,-6521],[-141,-1591],[-469,14]],[[181691,467106],[-326,810],[-824,10],[-55,777],[-638,0]],[[179848,468703],[-1,6469]],[[179848,468703],[-62,-3750]],[[179786,464953],[-566,398],[-337,2246],[112,1245],[-371,1003]],[[252452,475132],[-16,-6574]],[[252436,468558],[-656,-5]],[[251780,468553],[-659,87]],[[182974,465323],[-238,-239],[-275,-2258],[-767,3]],[[181694,462829],[-3,4277]],[[253767,475059],[-17,-6494]],[[253750,468565],[-659,-23]],[[253091,468542],[-655,16]],[[254243,475057],[184,-6512]],[[254427,468545],[-677,20]],[[289473,469090],[-133,-2371]],[[289340,466719],[-1655,-378]],[[287685,466341],[-18,1249]],[[298720,466125],[-986,173]],[[297734,466298],[-489,101]],[[228422,473030],[1,-5277]],[[228423,467753],[-411,1263],[-493,-320]],[[227519,468696],[-420,21]],[[227099,468717],[-5,5907]],[[227099,468717],[-647,152],[-239,-1688],[-225,-92],[-331,1396]],[[265305,467402],[-657,-78]],[[264648,467324],[-572,-16]],[[264076,467308],[-12,6370]],[[282057,471254],[-126,-2331]],[[281931,468923],[-1419,92]],[[280512,469015],[0,4024]],[[262757,473695],[0,-6486]],[[262757,467209],[-661,6]],[[262096,467215],[-656,-17]],[[264076,467308],[-666,-110]],[[263410,467198],[-653,11]],[[184985,470576],[7,-702],[463,1104],[183,-1173],[54,-3295],[326,-1616],[-112,-2669]],[[185906,462225],[-218,4],[1,-1621],[-435,0],[0,-1622],[-966,-26]],[[184288,458960],[-6,4851],[-652,693]],[[279029,472686],[285,-724],[-124,-1251],[-161,1975]],[[280512,469015],[1,-6165]],[[280513,462850],[-1172,-1823],[-491,1851]],[[278850,462878],[-210,586]],[[278640,463464],[245,2249],[543,1799],[-163,3148],[81,1262]],[[230156,469784],[-257,-2656],[18,-1098],[319,-1424],[30,-1300]],[[230266,463306],[144,-1321]],[[230410,461985],[-513,642]],[[229897,462627],[-186,2346],[-301,1001]],[[229410,465974],[1,7066]],[[229410,465974],[-586,1070]],[[228824,467044],[-401,709]],[[243900,473002],[-5,-8148]],[[243895,464854],[-1322,-36]],[[242573,464818],[0,4933]],[[245873,465434],[-1,-548],[-656,3]],[[245216,464889],[-1321,-35]],[[292692,470659],[24,-1088],[-500,-1877]],[[292216,467694],[-534,-438],[-538,1053]],[[291144,468309],[-321,627]],[[284692,471727],[-24,-4635]],[[284668,467092],[-949,-54],[-149,-3443]],[[283570,463595],[-344,17]],[[283226,463612],[9,1732],[-312,31],[52,5064]],[[186901,471897],[-242,-2320],[147,-3747],[355,398],[147,-1874],[115,-3739]],[[187423,460615],[-60,-2973],[-639,534]],[[186724,458176],[-179,1226],[-381,-494],[84,2410],[-342,907]],[[189734,462418],[-524,-640],[35,1742],[-1063,342],[13,-3257]],[[188195,460605],[-772,10]],[[285521,464472],[224,-1369],[-308,-60]],[[285437,463043],[-555,-96]],[[284882,462947],[2,2099],[-216,2046]],[[210915,461007],[1,-6453],[118,-1623]],[[211034,452931],[-1814,-34]],[[209220,452897],[0,11355]],[[210750,471496],[65,-4017],[1,-6473],[99,1]],[[214922,454659],[-168,-1623]],[[214754,453036],[-1702,-72]],[[213052,452964],[-57,-9]],[[212995,452955],[-124,1630],[-20,6470],[-66,0]],[[212785,461055],[0,6429],[-53,3998]],[[214709,471470],[45,-10349],[76,-3],[-3,-6452],[95,-7]],[[212785,461055],[-1870,-48]],[[225221,469297],[13,-2261]],[[225234,467036],[-777,345],[-862,1235],[-166,869],[-848,-1646]],[[222581,467839],[5,3608]],[[222581,467839],[-781,-1614],[-391,247]],[[221409,466472],[-1271,1432],[-179,713]],[[219959,468617],[0,2840]],[[219959,468617],[86,-14154]],[[220045,454463],[-279,6]],[[219766,454469],[-1612,38]],[[218154,454507],[-1617,75]],[[216537,454582],[-1615,77]],[[158411,453010],[-2621,-73]],[[155790,452937],[2,13114]],[[283226,463612],[-473,57],[-176,-2031]],[[282577,461638],[-328,866],[-551,60]],[[281698,462564],[229,2735],[4,3624]],[[294998,466753],[-244,-4393]],[[294754,462360],[-1202,-852]],[[293552,461508],[61,2653],[237,3286]],[[293481,467365],[-1033,-910]],[[292448,466455],[-257,-292],[25,1531]],[[154436,467457],[-322,-2815],[-164,-2462],[-328,-79],[-48,-2548],[372,-119],[282,-2180],[-184,-1761],[99,-2712]],[[154143,452781],[-1087,56]],[[153056,452837],[-394,1953],[-208,4302],[105,4473],[-70,1599],[-265,1356],[-113,2029],[199,2095]],[[179786,464953],[673,-952],[683,-1920],[360,583]],[[181502,462664],[-185,-222],[-6,-1813],[-601,5],[9,-7878]],[[180719,452756],[-2108,33]],[[232048,469790],[-2,-6488]],[[232046,463302],[-1780,4]],[[234682,469801],[-2,-6505]],[[234680,463296],[-1319,27]],[[233361,463323],[0,6482]],[[233361,463323],[-985,-8]],[[232376,463315],[-330,-13]],[[235994,469771],[0,-4895]],[[235994,464876],[0,-1607]],[[235994,463269],[-1314,27]],[[238625,469779],[-2,-6531]],[[238623,463248],[-1316,8]],[[237307,463256],[0,1612]],[[237307,464868],[1,4897]],[[237307,464868],[-1313,8]],[[239944,469765],[-5,-6533]],[[239939,463232],[-1316,16]],[[241256,469753],[-1,-4930]],[[241255,464823],[1,-1610]],[[241256,463213],[-1317,19]],[[242573,464818],[-1318,5]],[[291144,468309],[49,-3777],[-226,-2027]],[[290967,462505],[-369,-97],[-984,-2871],[-607,-823]],[[289007,458714],[112,1789],[-67,1881],[190,1044],[98,3291]],[[225234,467036],[13,-6037]],[[225247,460999],[-1,-6480]],[[225246,454519],[-1283,-6]],[[223963,454513],[-1286,-11]],[[222677,454502],[-33,1]],[[222644,454503],[-31,12930],[-32,406]],[[268694,465642],[-316,-1304],[-142,-3077]],[[268236,461261],[-593,-71]],[[267643,461190],[-55,8219]],[[267921,469504],[681,71],[92,-3933]],[[267643,461190],[-1306,-223]],[[266337,460967],[-314,-75]],[[266023,460892],[-61,6555]],[[301815,469097],[129,-3011],[504,-1290],[-172,-917],[-656,-1010],[-20,-1435],[-247,-532]],[[301353,460902],[-115,246]],[[301238,461148],[-90,2974],[-550,962],[-3,1485]],[[227519,468696],[-1,-7666]],[[227518,461030],[-973,-16]],[[226545,461014],[-1298,-15]],[[228824,467044],[-4,-7638]],[[228820,459406],[-975,10]],[[227845,459416],[1,1618],[-328,-4]],[[281698,462564],[-753,1]],[[280945,462565],[-432,285]],[[250130,468597],[9,-6418]],[[250139,462179],[-99,3]],[[250040,462182],[-1215,98]],[[248825,462280],[-2,5736]],[[181694,462829],[-192,-165]],[[251780,468553],[1,-6528]],[[251781,462025],[-456,57]],[[251325,462082],[-1186,97]],[[221409,466472],[43,-12006]],[[221452,454466],[-68,2]],[[221384,454468],[-1339,-5]],[[253091,468542],[1,-4305]],[[253092,464237],[4,-2164]],[[253096,462073],[-1122,-19]],[[251974,462054],[-193,-29]],[[254427,468545],[185,-1078],[-127,-2165]],[[254485,465302],[-1064,31],[0,-1088],[-329,-8]],[[292448,466455],[-171,-3336],[-36,-2654]],[[292241,460465],[-527,-990]],[[291714,459475],[-489,1291],[-258,1739]],[[293552,461508],[-1311,-1043]],[[248825,462280],[-247,1]],[[248578,462281],[-1394,24]],[[222644,454503],[-1192,-37]],[[287015,460504],[-343,-51]],[[286672,460453],[-34,4021]],[[287685,466341],[71,-5737]],[[287756,460604],[-741,-100]],[[155790,452937],[-801,-56]],[[154989,452881],[-846,-100]],[[266023,460892],[-1299,-123]],[[264724,460769],[-27,1]],[[264697,460770],[-49,6554]],[[264697,460770],[-1281,-49]],[[263416,460721],[-6,6477]],[[263416,460721],[-329,-8]],[[263087,460713],[-984,-2]],[[262103,460711],[-7,6504]],[[262103,460711],[-633,-30]],[[261470,460681],[-681,30]],[[260789,460711],[-6,6455]],[[260789,460711],[-616,-16]],[[260173,460695],[-1419,-24]],[[258754,460671],[182,6483]],[[284882,462947],[17,-1461],[-606,385]],[[284293,461871],[-102,1734],[-621,-10]],[[229897,462627],[-253,6],[-13,-4592]],[[229631,458041],[-267,-255]],[[229364,457786],[-544,3],[0,1617]],[[295672,466664],[201,-1870],[-69,-1579]],[[295804,463215],[-69,-4535]],[[295735,458680],[-148,-5073]],[[295587,453607],[-1209,182]],[[294378,453789],[-26,1]],[[294352,453790],[-31,692],[433,7878]],[[289007,458714],[-9,-2218]],[[288998,456496],[-609,11],[-4,988],[-572,205],[-57,2904]],[[297645,459261],[-169,1431],[-916,-277],[9,882],[-474,582],[-291,1336]],[[297734,466298],[148,-1092],[-43,-2780],[-194,-3165]],[[301238,461148],[-70,-969]],[[301168,460179],[-67,-41]],[[301101,460138],[28,-398]],[[301129,459740],[-2,-4]],[[301127,459736],[-256,-725]],[[300871,459011],[-22,-492]],[[300849,458519],[-74,-391]],[[300775,458128],[-385,553],[-40,-2081],[-373,-818]],[[299977,455782],[-294,713],[-11,1199],[281,1311],[-388,367],[185,1163],[57,2437],[-390,-234],[39,1513],[-540,411],[-112,1448]],[[299977,455782],[-56,-2597]],[[299921,453185],[-840,-170]],[[299081,453015],[-844,386]],[[298237,453401],[-93,27]],[[298144,453428],[2,2448],[-359,413],[119,1141]],[[297906,457430],[27,1226],[-288,605]],[[184288,458960],[0,-6128]],[[184288,452832],[-2898,-85]],[[181390,452747],[-671,9]],[[246587,462328],[-37,-555],[502,-1806]],[[247052,459967],[-532,14],[-2,-1629],[-648,10]],[[245870,458362],[-646,9]],[[245224,458371],[-8,6518]],[[254485,465302],[3,-3266]],[[254488,462036],[-1092,47]],[[253396,462083],[-300,-10]],[[245224,458371],[-650,13]],[[244574,458384],[-651,-1]],[[243923,458383],[-28,6471]],[[237307,463256],[111,-1603],[1,-4876]],[[237419,456777],[-650,-3]],[[236769,456774],[-649,-15]],[[236120,456759],[0,4918],[-126,1592]],[[243923,458383],[-652,50]],[[243271,458433],[-651,-34]],[[242620,458399],[-47,6419]],[[242620,458399],[-652,5]],[[241968,458404],[-654,-10]],[[241314,458394],[-58,4819]],[[286672,460453],[9,-2065],[-460,404],[-3,-1031],[-340,350]],[[285878,458111],[-226,20]],[[285652,458131],[-201,28],[-14,4884]],[[209220,452897],[0,-5655]],[[209220,447242],[1,-2489]],[[209221,444753],[-1673,14],[-1,1638]],[[207547,446405],[-7,17807]],[[207547,446405],[-1741,68]],[[205806,446473],[-16,14424]],[[189734,452894],[-1285,-39]],[[188449,452855],[-244,1757],[-87,2140],[178,1265],[-101,2588]],[[284293,461871],[21,-3935],[375,114]],[[284689,458050],[-2,-5187]],[[284687,452863],[-1795,-1]],[[282892,452862],[-390,-48]],[[282502,452814],[75,8824]],[[278850,462878],[-1,-10015]],[[278849,452863],[-1529,-47]],[[277320,452816],[-423,27],[0,5035]],[[276897,457878],[602,1757],[633,2570],[508,1259]],[[232376,463315],[-1,-1600],[202,-13],[-4,-4901]],[[232573,456801],[-1911,67]],[[230662,456868],[1,1145]],[[230663,458013],[-154,1202],[39,2678],[-138,92]],[[234680,463296],[161,-1607],[-5,-4920]],[[234836,456769],[-647,13]],[[234189,456782],[-648,10]],[[233541,456792],[3,4901],[-183,1630]],[[233541,456792],[-968,9]],[[236120,456759],[-644,5]],[[235476,456764],[-640,5]],[[238623,463248],[102,-1618],[-1,-4868]],[[238724,456762],[-656,0]],[[238068,456762],[-649,15]],[[239939,463232],[70,-6471]],[[240009,456761],[-640,-7]],[[239369,456754],[-645,8]],[[241314,458394],[-654,-6],[2,-1611]],[[240662,456777],[-653,-16]],[[297906,457430],[-486,-1106],[-24,857],[-523,-375],[-118,1160],[-154,-1681],[-621,1035],[76,1737],[-321,-377]],[[285652,458131],[-963,-81]],[[280945,462565],[4,-9702]],[[280949,452863],[-1704,-50]],[[279245,452813],[-396,50]],[[230663,458013],[-1032,28]],[[282502,452814],[-1272,49]],[[281230,452863],[-281,0]],[[291714,459475],[-261,-2860],[238,-599]],[[291691,456016],[-916,-2846]],[[290775,453170],[-1003,-3057]],[[289772,450113],[-329,184],[-290,2566]],[[289153,452863],[-165,772],[10,2861]],[[248578,462281],[18,-5761]],[[248596,456520],[-1109,-47]],[[247487,456473],[-210,622],[-225,2872]],[[294352,453790],[-85,-1335],[-514,519],[-607,1358]],[[293146,454332],[53,903]],[[293199,455235],[352,2852],[1,3421]],[[249240,456572],[-644,-52]],[[250040,462182],[14,-5553]],[[250054,456629],[-814,-57]],[[251325,462082],[1,-6381]],[[251326,455701],[-650,-38],[2,1005],[-624,-39]],[[186724,458176],[47,-5357]],[[186771,452819],[-155,1]],[[186616,452820],[-2328,12]],[[253396,462083],[-8,-6346]],[[253388,455737],[-108,0]],[[253280,455737],[-976,-13]],[[252304,455724],[-325,0]],[[251979,455724],[-5,6330]],[[251979,455724],[-653,-23]],[[254614,455702],[-1226,35]],[[254488,462036],[-82,-3532],[208,-2802]],[[293199,455235],[-367,802],[-92,-1373],[-647,330],[-402,1022]],[[301127,459736],[69,-1616]],[[301196,458120],[-253,-1012],[-168,1020]],[[300849,458519],[22,492]],[[301101,460138],[28,-398]],[[301353,460902],[-185,-723]],[[227845,459416],[-2,-4858]],[[227843,454558],[-1298,-22]],[[226545,454536],[0,6478]],[[212995,452955],[-1853,-35]],[[211142,452920],[-108,11]],[[226545,454536],[3,-3229]],[[226548,451307],[-1288,-25]],[[225260,451282],[-14,3237]],[[266372,454459],[-653,-59]],[[265719,454400],[-998,-202]],[[264721,454198],[3,6571]],[[266337,460967],[35,-6508]],[[203590,460931],[14,-19328],[-709,2],[8,-7373]],[[202903,434232],[-1501,66]],[[201402,434298],[-1279,5]],[[200123,434303],[-1673,-17]],[[198450,434286],[-31,12242],[1170,-40],[16,8015],[-52,3235]],[[205806,446473],[3,-12257]],[[205809,434216],[-2545,-6]],[[203264,434210],[-361,22]],[[188449,452855],[-1678,-36]],[[264721,454198],[-644,35]],[[264077,454233],[-965,-58]],[[263112,454175],[-25,6538]],[[263112,454175],[-326,39]],[[262786,454214],[-1301,-17]],[[261485,454197],[-15,6484]],[[260173,460695],[4,-6539]],[[260177,454156],[-1281,40]],[[258896,454196],[-2,3200],[-392,-4]],[[258502,457392],[252,3279]],[[261485,454197],[-1308,-41]],[[289153,452863],[-334,-23]],[[288819,452840],[-1736,23]],[[287083,452863],[-29,3458],[98,835],[-137,3348]],[[287083,452863],[-115,0]],[[286968,452863],[-1145,0]],[[285823,452863],[55,5248]],[[247487,456473],[432,-1435],[26,-1576]],[[247945,453462],[-2076,28]],[[245869,453490],[1,4872]],[[229364,457786],[-3,-3238]],[[229361,454548],[-545,3]],[[228816,454551],[-973,7]],[[301793,457791],[116,-445]],[[301909,457346],[-116,445]],[[301196,458120],[304,-647]],[[301500,457473],[18,-1676],[-433,-1150]],[[301085,454647],[-839,-2061]],[[300246,452586],[-325,599]],[[298144,453428],[-1041,73]],[[297103,453501],[-1391,88]],[[295712,453589],[-125,18]],[[301909,457346],[403,-2846],[-196,-1500],[475,-1515],[5,-2151]],[[302596,449334],[-234,-1189]],[[302362,448145],[-280,-204],[-97,-1527],[-241,-453]],[[301744,445961],[-218,3011],[-291,-217],[146,1519],[-214,1940],[-82,2433]],[[301500,457473],[293,318]],[[243271,458433],[-1,-8140]],[[243270,450293],[-1301,18]],[[241969,450311],[-1,8093]],[[244574,458384],[-7,-6498]],[[244567,451886],[-1,-1626]],[[244566,450260],[-1296,33]],[[241969,450311],[-1303,-7]],[[240666,450304],[-4,6473]],[[245869,453490],[0,-1629]],[[245869,451861],[-1302,25]],[[285823,452863],[-1027,0]],[[284796,452863],[-109,0]],[[230662,456868],[249,-1941],[-15,-1182]],[[230896,453745],[-107,-597],[-679,13]],[[230110,453161],[-2,1379],[-747,8]],[[198450,434286],[-3153,-25]],[[195297,434261],[-2648,-56]],[[192649,434205],[-133,0]],[[192516,434205],[1,10793]],[[277320,452816],[-6,-2742]],[[277314,450074],[-2528,-14]],[[274786,450060],[0,2383]],[[274786,452443],[526,1090],[1585,4345]],[[258896,454196],[-9,-5791]],[[258887,448405],[-831,-14]],[[258056,448391],[-837,12]],[[257219,448403],[579,2539],[358,3965],[346,2485]],[[232573,456801],[-5,-6484]],[[232568,450317],[-1299,59]],[[231269,450376],[19,2011],[-392,1358]],[[240666,450304],[-1298,5]],[[239368,450309],[1,6445]],[[235476,456764],[0,-6454]],[[235476,450310],[-323,-7]],[[235153,450303],[-970,19]],[[234183,450322],[6,6460]],[[234183,450322],[-1294,1]],[[232889,450323],[-321,-6]],[[238068,456762],[1,-6440]],[[238069,450322],[-327,1]],[[237742,450323],[-971,-4]],[[236771,450319],[-2,6455]],[[236771,450319],[-324,-4]],[[236447,450315],[-971,-5]],[[239368,450309],[-323,8]],[[239045,450317],[-976,5]],[[251326,455701],[-4,-4851]],[[251322,450850],[-1168,-69],[-750,255]],[[249404,451036],[-159,538]],[[249245,451574],[-5,4998]],[[249245,451574],[-1296,-32]],[[247949,451542],[-4,1920]],[[293146,454332],[-66,-9100]],[[293080,445232],[-482,-138],[-384,934],[-288,-777]],[[291926,445251],[-77,1003],[-501,1869],[338,2426],[-911,2621]],[[254614,455702],[218,-1446],[203,-4308],[236,-2529]],[[255271,447419],[-5,-4485]],[[255266,442934],[-738,66],[-9,1648],[-322,-35],[-7,1623],[-327,775]],[[253863,447011],[320,581],[-17,5162],[-954,-145]],[[253212,452609],[68,3128]],[[252304,455724],[-36,-8080]],[[252268,447644],[-1,-1641]],[[252267,446003],[-938,-57]],[[251329,445946],[-7,4904]],[[253212,452609],[3,-4870]],[[253215,447739],[-947,-95]],[[216537,454582],[2,-6500]],[[216539,448082],[-1559,-14]],[[214980,448068],[-230,-4],[4,4972]],[[301744,445961],[-236,-1674],[-533,-780]],[[300975,443507],[-36,3035],[-176,276]],[[300763,446818],[-87,707]],[[300676,447525],[-253,1172]],[[300423,448697],[-177,3889]],[[218154,454507],[10,-6475]],[[218164,448032],[-1571,52]],[[216593,448084],[-54,-2]],[[230110,453161],[-1,-5099]],[[230109,448062],[-977,14]],[[229132,448076],[-318,4]],[[228814,448080],[2,6471]],[[227843,454558],[1,-6473]],[[227844,448085],[-1288,-18]],[[226556,448067],[-8,3240]],[[228814,448080],[-648,2]],[[228166,448082],[-322,3]],[[219766,454469],[6,-6447]],[[219772,448022],[-1243,-2]],[[218529,448020],[-365,12]],[[225260,451282],[0,-3235]],[[225260,448047],[-1272,-15]],[[223988,448032],[-19,0]],[[223969,448032],[-6,6481]],[[221384,454468],[0,-6437]],[[221384,448031],[-1572,-10]],[[219812,448021],[-40,1]],[[222677,454502],[3,-6462]],[[222680,448040],[-1296,-9]],[[223969,448032],[-1262,4]],[[222707,448036],[-27,4]],[[265719,454400],[30,-6681]],[[265749,447719],[-327,-65]],[[265422,447654],[-1337,-251]],[[264085,447403],[-8,6830]],[[294378,453789],[-86,-7126]],[[294292,446663],[-33,-2600]],[[294259,444063],[-1125,-724],[-133,-918]],[[293001,442421],[79,2811]],[[302989,445850],[-269,-1329],[-502,-404],[144,4028]],[[302596,449334],[321,-1189],[408,-370],[764,1511],[-341,4569],[401,-2137],[107,-3239],[-210,-1768],[-1057,-861]],[[262786,454214],[4,-5817]],[[262790,448397],[-1035,-6]],[[261755,448391],[-266,4]],[[261489,448395],[-4,5802]],[[264085,447403],[-109,-15]],[[263976,447388],[-1133,-180]],[[262843,447208],[-53,1189]],[[261489,448395],[-1024,-15]],[[260465,448380],[-348,0]],[[260117,448380],[68,740],[-8,5036]],[[260117,448380],[-775,27]],[[259342,448407],[-455,-2]],[[295712,453589],[-58,-1345],[397,121],[-173,-3103],[-189,-154],[94,-2952]],[[295783,446156],[-481,-2335],[-431,-845]],[[294871,442976],[-365,419],[-214,3268]],[[231269,450376],[205,-1282],[-160,-2130]],[[231314,446964],[-897,11]],[[230417,446975],[1,1083],[-309,4]],[[297103,453501],[5,-4179],[88,62],[182,-3932]],[[297378,445452],[-156,-333]],[[297222,445119],[-108,1174],[-581,-359],[-107,-908]],[[296426,445026],[-541,-412],[-102,1542]],[[298237,453401],[8,-1300],[-328,-15],[-2,-2289],[170,-1516],[-230,-737]],[[297855,447544],[-477,-2092]],[[247949,451542],[-252,-2717]],[[247697,448825],[-205,-1009]],[[247492,447816],[-439,832],[-669,-719],[-515,680]],[[245869,448609],[0,3252]],[[299081,453015],[27,-5278]],[[299108,447737],[6,-1575]],[[299114,446162],[-459,-103],[-560,582],[-240,903]],[[300423,448697],[-95,-429]],[[300328,448268],[-110,206]],[[300218,448474],[-189,-592],[-921,-145]],[[291926,445251],[-301,-1608],[-771,-203],[-6,-1281]],[[290848,442159],[-634,1016],[-245,2280]],[[289969,445455],[47,2798],[-244,1860]],[[160757,452819],[3,-15155]],[[160760,437664],[-2931,-15]],[[157829,437649],[51,2566],[-254,887],[-643,-3073],[-236,35],[-241,-1729],[155,-2198],[-334,193],[-289,1393],[-274,-64],[-470,1939]],[[155294,437598],[-187,3492],[-518,272]],[[154589,441362],[110,941],[-260,2964],[146,1892],[-112,2512],[386,1397],[130,1813]],[[214980,448068],[2,-6471]],[[214982,441597],[-197,8],[0,-3232]],[[214785,438373],[-1546,1]],[[213239,438374],[-74,4048]],[[213165,442422],[1,5661],[-117,1089],[3,3792]],[[213165,442422],[-2040,-26]],[[211125,442396],[-4,4869]],[[211121,447265],[21,5655]],[[188449,452855],[1,-2742],[226,-3238],[-46,-2736],[-189,-2015]],[[188441,442124],[-433,106],[-167,-982],[-443,939]],[[187398,442187],[-88,2092],[-182,-89],[-193,3079],[-3,3037],[-316,2514]],[[211121,447265],[-1901,-23]],[[189737,445043],[-2,-6108]],[[189735,438935],[-608,-2001]],[[189127,436934],[120,1271],[-305,2684],[-249,88]],[[188693,440977],[-252,1147]],[[286968,452863],[88,-6473]],[[287056,446390],[-234,-101],[-57,-1949]],[[286765,444340],[-1655,896]],[[285110,445236],[-170,121]],[[284940,445357],[-144,7506]],[[284940,445357],[-238,-844],[-1781,-169]],[[282921,444344],[-29,8518]],[[187398,442187],[-205,138],[-194,-1813],[-583,5],[-712,-4840]],[[185704,435677],[-852,-1424],[-3463,-5]],[[181389,434248],[1,18499]],[[173097,434253],[-1,-6650],[-636,-11],[-149,-2165]],[[172311,425427],[-25,2930],[-933,15],[0,3230],[-3183,-36],[0,1954],[-1457,-9]],[[166713,433511],[-56,0],[16,19240]],[[173097,452848],[0,-18595]],[[181389,434248],[-13,-16439]],[[181376,417809],[-3391,104],[-1591,99]],[[176394,418012],[-462,-9],[-438,10035],[-1,6209],[-1194,9]],[[174299,434256],[-1202,-3]],[[281230,452863],[9,-7106]],[[281239,445757],[-601,-298]],[[280638,445459],[-179,516],[-1317,-112]],[[279142,445863],[103,6950]],[[282921,444344],[4,-1186]],[[282925,443158],[-1089,-70]],[[281836,443088],[-171,12],[-426,2657]],[[154589,441362],[-304,-18],[-3,1572],[-819,-16]],[[153463,442900],[-268,5082],[-262,812],[123,4043]],[[289969,445455],[-804,-6747]],[[289165,438708],[-411,-131]],[[288754,438577],[180,478],[-59,7138]],[[288875,446193],[-56,6647]],[[288875,446193],[-721,12]],[[288154,446205],[-1098,185]],[[279142,445863],[-1549,13]],[[277593,445876],[-281,-13]],[[277312,445863],[2,4211]],[[164792,452769],[-2,-15096]],[[164790,437673],[-3709,-1]],[[161081,437672],[-321,-8]],[[166713,433511],[-9,-8230],[-71,-9],[-2,-9666],[318,14]],[[166949,415620],[46,-3526],[105,-404],[-51,-2899]],[[167049,408791],[-263,-205]],[[166786,408586],[-506,-709],[-437,-1338],[-205,182],[103,-3534],[-151,-1502]],[[165590,401685],[-468,-1589],[-344,2]],[[164778,400098],[-9,2800]],[[164769,402898],[12,2458]],[[164781,405356],[6,5108]],[[164787,410464],[3,27209]],[[253863,447011],[-4,808],[-643,-82]],[[253216,447737],[-1,2]],[[274786,450060],[0,-6513]],[[274786,443547],[-1348,41]],[[273438,443588],[-1,3974]],[[273437,447562],[3,2573]],[[273440,450135],[1346,2308]],[[245869,448609],[-4,-3244]],[[245865,445365],[-1300,23]],[[244565,445388],[1,4872]],[[249404,451036],[-5,-5897]],[[249399,445139],[-643,-17]],[[248756,445122],[-901,11]],[[247855,445133],[-158,3692]],[[226556,448067],[2,-4023]],[[226558,444044],[-753,-845],[-533,-1]],[[225272,443198],[-12,4849]],[[251329,445946],[-636,7],[1,-813]],[[250694,445140],[-1295,-1]],[[232889,450323],[0,-4862],[165,-1791]],[[233054,443670],[-1388,16]],[[231666,443686],[-257,439],[-95,2839]],[[243270,450293],[6,-6523]],[[243276,443770],[-325,-13]],[[242951,443757],[-980,-18]],[[241971,443739],[-2,6572]],[[237742,450323],[69,-6544]],[[237811,443779],[-1256,-154]],[[236555,443625],[-107,1818],[-1,4872]],[[234183,450322],[1,-4860],[144,-1818]],[[234328,443644],[-317,10]],[[234011,443654],[-957,16]],[[235153,450303],[2,-4797],[121,-1872]],[[235276,443634],[-948,10]],[[241971,443739],[-319,-4]],[[241652,443735],[-960,-14]],[[240692,443721],[-26,6583]],[[239045,450317],[54,-6615]],[[239099,443702],[0,-314]],[[239099,443388],[-1288,391]],[[240692,443721],[-320,-6]],[[240372,443715],[-1273,-13]],[[236555,443625],[-1279,9]],[[244565,445388],[-5,-3262]],[[244560,442126],[-322,13]],[[244238,442139],[-104,1623],[-858,8]],[[273437,447562],[-275,-15],[3,-1357],[-539,-11],[-3,-1320],[-265,-4]],[[272358,444855],[-272,1147]],[[272086,446002],[570,2451],[784,1682]],[[277312,445863],[-602,-34],[-476,-2457]],[[276234,443372],[-1448,-20]],[[274786,443352],[0,195]],[[247855,445133],[-29,-825],[-657,-1555],[-5,-2417]],[[247164,440336],[-1778,119]],[[245386,440455],[0,4]],[[245386,440459],[89,1581],[707,640]],[[246182,442680],[363,172],[871,2340],[76,2624]],[[300676,447525],[-94,-1308],[-254,2051]],[[246182,442680],[7,2674],[-324,11]],[[300218,448474],[-108,-2110]],[[300110,446364],[-154,-894],[-847,-110]],[[299109,445360],[5,802]],[[260465,448380],[14,-4389]],[[260479,443991],[3,-1610]],[[260482,442381],[-1130,-19]],[[259352,442362],[-1,806]],[[259351,443168],[-9,5239]],[[259351,443168],[-1136,-49],[2,-810]],[[258217,442309],[-162,-2]],[[258055,442307],[103,4030],[-102,2054]],[[258055,442307],[-491,-569],[-231,-2173],[-408,-905]],[[256925,438660],[-7,8809]],[[256918,447469],[301,934]],[[262847,444118],[-1085,-69]],[[261762,444049],[-7,4342]],[[262843,447208],[4,-3090]],[[261762,444049],[-1283,-58]],[[229132,448076],[0,-5330]],[[229132,442746],[-759,-1482],[-210,137]],[[228163,441401],[3,6681]],[[228163,441401],[-319,227]],[[227844,441628],[-642,-1180]],[[227202,440448],[0,1151],[-293,1]],[[226909,441600],[0,2456],[-351,-12]],[[230417,446975],[2,-2973],[320,-2435]],[[230739,441567],[-395,2]],[[230344,441569],[-276,747],[-936,373]],[[229132,442689],[0,57]],[[218529,448020],[-5,-6446]],[[218524,441574],[-1550,27]],[[216974,441601],[-383,9]],[[216591,441610],[2,6474]],[[216591,441610],[-1609,-13]],[[225272,443198],[0,-1617]],[[225272,441581],[-1262,6]],[[224010,441587],[-20,-2]],[[223990,441585],[-2,6447]],[[222707,448036],[24,-6450]],[[222731,441586],[-12,-6463]],[[222719,435123],[-608,-9]],[[222111,435114],[-2224,2]],[[219887,435116],[-75,6454]],[[219812,441570],[0,6451]],[[219812,441570],[-1288,4]],[[223990,441585],[-1259,1]],[[267414,445851],[-697,-80]],[[266717,445771],[-430,-33],[-394,-2264],[-479,-1509]],[[265414,441965],[1,1360]],[[265415,443325],[7,4329]],[[265749,447719],[781,160]],[[266530,447879],[6,1]],[[266536,447880],[30,6]],[[266566,447886],[16,1]],[[266582,447887],[26,6]],[[266608,447893],[806,-2042]],[[255266,442934],[-3,-3134]],[[255263,439800],[-1357,-110],[6,-1614],[-648,-79]],[[253264,437997],[-22,4868]],[[253242,442865],[-26,4872]],[[267414,445851],[546,-1925],[381,1255],[294,-1579],[-868,-836]],[[267767,442766],[-50,-4]],[[267717,442762],[-15,-1]],[[267702,442761],[-769,5],[-213,795]],[[266720,443561],[-3,2210]],[[253242,442865],[-957,-108]],[[252285,442757],[-18,3246]],[[265415,443325],[-1279,-38]],[[264136,443287],[-108,529],[-52,3572]],[[273438,443588],[0,-2864]],[[273438,440724],[-1081,8]],[[272357,440732],[1,4123]],[[299109,445360],[-23,-3357],[-140,-1618]],[[298946,440385],[-436,-421],[-482,288],[-416,-839],[-291,2723]],[[297321,442136],[350,235],[-50,1823],[-299,-180],[-100,1105]],[[256110,445861],[11,-7107]],[[256121,438754],[-158,-435]],[[255963,438319],[-386,-1051],[-314,72]],[[255263,437340],[0,2460]],[[255271,447419],[248,-1015],[591,-543]],[[256925,438660],[-559,918],[-245,-824]],[[256110,445861],[808,1608]],[[264136,443287],[1,-1079]],[[264137,442208],[-1288,-28]],[[262849,442180],[-2,1938]],[[211125,442396],[-24,-801]],[[211101,441595],[-1879,-26]],[[209222,441569],[-1,3184]],[[231666,443686],[163,-2163]],[[231829,441523],[-1090,44]],[[300704,446133],[-85,-2792],[-210,504],[295,2288]],[[300975,443507],[-208,-748],[-4,4059]],[[294871,442976],[348,-1153],[336,-2034],[-121,-1229]],[[295434,438560],[-200,-1187],[-705,-2090],[-626,-1184]],[[293903,434099],[-195,2024],[683,2086],[-173,2860]],[[294218,441069],[41,2994]],[[209222,441569],[-4,-7295]],[[209218,434274],[-2479,-59]],[[206739,434215],[-930,1]],[[300110,446364],[27,-3366],[-179,-1833],[-1042,-1242],[30,462]],[[288154,446205],[-316,-4003]],[[287838,442202],[-487,-794],[-761,-135]],[[286590,441273],[175,3067]],[[297027,438996],[-21,79]],[[297006,439075],[21,-79]],[[297321,442136],[207,-2885],[-531,-113]],[[296997,439138],[-298,3270],[-256,-279],[-17,2897]],[[296997,439138],[9,-63]],[[297027,438996],[-1112,58],[-473,-1600],[-8,1106]],[[288754,438577],[-264,-1321]],[[288490,437256],[-133,486],[-104,2828],[-415,1632]],[[293001,442421],[-13,-2191]],[[292988,440230],[-683,-3302]],[[292305,436928],[-373,1054]],[[291932,437982],[-934,2867]],[[290998,440849],[-150,1310]],[[252285,442757],[26,-6500]],[[252311,436257],[-960,-39],[-1,-3314]],[[251350,432904],[-324,-34]],[[251026,432870],[0,3329],[-319,-13]],[[250707,436186],[-5,3837]],[[250702,440023],[-8,5117]],[[272357,440732],[-1,0]],[[272356,440732],[-569,48],[73,-1359],[-321,-13]],[[271539,439408],[-538,-38]],[[271001,439370],[3,1405],[-263,14],[8,2860]],[[270749,443649],[623,-331],[714,2684]],[[280638,445459],[-3,-3672],[463,-4],[46,-3243]],[[281144,438540],[-1140,433],[-177,-967]],[[279827,438006],[-70,1137],[-624,1848],[-379,-397]],[[278754,440594],[88,2092],[292,-301],[8,3478]],[[278754,440594],[-317,-166]],[[278437,440428],[5,1839],[-538,104],[-216,-927]],[[277688,441444],[-95,4432]],[[277688,441444],[-1,-946],[-351,-263],[-253,-2768]],[[277083,437467],[-849,-19]],[[276234,437448],[0,5924]],[[269692,442196],[16,-2669]],[[269708,439527],[-1391,121]],[[268317,439648],[-18,2604],[-150,10]],[[268149,442262],[561,621],[551,-1528],[431,841]],[[266720,443561],[-15,-4584]],[[266705,438977],[-3,-1624]],[[266702,437353],[-1282,19]],[[265420,437372],[-6,4593]],[[281836,443088],[1,-1968],[-292,-2833]],[[281545,438287],[-401,253]],[[290998,440849],[-384,-1438],[-427,-3445]],[[290187,435966],[-461,1078],[82,1910],[-643,-246]],[[245386,440459],[-829,46],[3,1621]],[[285110,445236],[175,-3416],[441,-1905],[405,-535]],[[286131,439380],[-539,-2233]],[[285592,437147],[-256,304]],[[285336,437451],[-455,-614]],[[284881,436837],[-228,-952],[-463,-355]],[[284190,435530],[-1068,5402],[-197,2226]],[[286590,441273],[-78,-1278]],[[286512,439995],[-381,-615]],[[250702,440023],[-480,-175],[-57,-1257],[-306,11],[0,-1588]],[[249859,437014],[-479,1]],[[249380,437015],[-1,1587],[-610,12]],[[248769,438614],[-13,6508]],[[248769,438614],[-31,-1592],[-323,7]],[[248415,437029],[-1262,35]],[[247153,437064],[11,3272]],[[192516,434205],[-2782,5],[1,4725]],[[262849,442180],[1,-2881]],[[262850,439299],[-1082,-132]],[[261768,439167],[-6,4882]],[[261768,439167],[-323,-1]],[[261445,439166],[-639,37],[-320,533]],[[260486,439736],[-4,2645]],[[226909,441600],[-5,-1596],[-968,-299],[-620,-535],[-31,2412]],[[225285,441582],[-13,-1]],[[293006,440243],[-18,-18]],[[292988,440225],[0,5]],[[294218,441069],[-1212,-826]],[[302428,442673],[372,-1939],[-773,-264],[113,1841],[288,362]],[[271001,439370],[-263,5],[-6,-1404],[-273,-2],[-271,-1169],[-5,-1369]],[[270183,435431],[-459,42]],[[269724,435473],[-16,4054]],[[269692,442196],[936,1652],[121,-199]],[[244238,442139],[-5,-4867]],[[244233,437272],[-641,8]],[[243592,437280],[-640,14]],[[242952,437294],[-1,6463]],[[239099,443388],[2,-6149]],[[239101,437239],[-640,12]],[[238461,437251],[-646,14]],[[237815,437265],[-4,6514]],[[242952,437294],[-653,-17]],[[242299,437277],[-642,-14]],[[241657,437263],[-5,6472]],[[237815,437265],[-627,-98]],[[237188,437167],[-633,7]],[[236555,437174],[0,6451]],[[241657,437263],[-641,-12]],[[241016,437251],[-639,-8]],[[240377,437243],[-5,6472]],[[240377,437243],[-639,-2]],[[239738,437241],[-637,-2]],[[234011,443654],[-3,-6441]],[[234008,437213],[-637,14]],[[233371,437227],[-1382,-2]],[[231989,437225],[-120,576]],[[231869,437801],[88,2412],[-128,1310]],[[235276,443634],[0,-6443]],[[235276,437191],[-632,8]],[[234644,437199],[-636,14]],[[236555,437174],[-638,8]],[[235917,437182],[-641,9]],[[274786,443352],[1,-6623]],[[274787,436729],[-1339,18]],[[273448,436747],[-10,3977]],[[267767,442766],[-50,-4]],[[267702,442761],[447,-499]],[[268317,439648],[3,-646]],[[268320,439002],[-1615,-25]],[[276234,437448],[-271,-1900]],[[275963,435548],[-140,819],[-1037,201]],[[274786,436568],[1,161]],[[265420,437372],[-967,-36]],[[264453,437336],[-1,4877],[-315,-5]],[[259352,442362],[14,-4890],[-65,-5]],[[259301,437467],[-1086,-27]],[[258215,437440],[2,4869]],[[284190,435530],[0,-456]],[[284190,435074],[-1015,-1516],[-180,1961],[-470,731],[-132,1393],[-289,-76],[-14,1365],[-389,-1859]],[[281701,437073],[-156,1214]],[[155294,437598],[-138,-2080],[141,-716],[-208,-2139],[-386,312],[219,-3715],[-7,-13593]],[[154915,415667],[-1334,-12]],[[153581,415655],[-243,1900],[-703,2915],[-128,3411],[386,4770],[132,-280],[309,6363],[-132,874],[261,7292]],[[253264,437997],[-21,-1627]],[[253243,436370],[-932,-113]],[[229132,442689],[-7,-7583]],[[229125,435106],[-7,1]],[[229118,435107],[-1274,15]],[[227844,435122],[0,6506]],[[230344,441569],[400,-3783]],[[230744,437786],[23,-2700]],[[230767,435086],[-404,-539]],[[230363,434547],[0,541],[-1238,18]],[[260486,439736],[-89,-4618]],[[260397,435118],[-729,-71]],[[259668,435047],[-363,782],[-4,1638]],[[213239,438374],[-30,-4080]],[[213209,434294],[-90,-2]],[[213119,434292],[-2031,-1]],[[211088,434291],[13,7304]],[[278437,440428],[-17,-5242]],[[278420,435186],[-185,-771],[-669,-629],[-401,1395],[-70,2246]],[[277095,437427],[-12,40]],[[188693,440977],[-212,-2505],[-448,-762],[-414,553],[-140,-1426]],[[187479,436837],[-928,257],[-847,-1417]],[[258215,437440],[-1290,17]],[[256925,437457],[0,1203]],[[288490,437256],[-135,-732]],[[288355,436524],[-329,-580],[98,-1544],[-739,-1772]],[[287385,432628],[-586,685]],[[286799,433313],[-59,3513],[-251,1238],[23,1931]],[[264453,437336],[-316,-6]],[[264137,437330],[-325,1637],[-962,-17]],[[262850,438950],[0,349]],[[245386,440455],[-115,-1739],[344,-1569],[113,-1545]],[[245728,435602],[-1175,26]],[[244553,435628],[2,1613],[-322,31]],[[216974,441601],[-2,-6470],[57,-809]],[[217029,434322],[-2234,-1]],[[214795,434321],[-10,4052]],[[219887,435116],[2,-6448]],[[219889,428668],[-1545,-2]],[[218344,428666],[-1309,-44]],[[217035,428622],[-6,5700]],[[304069,440803],[121,-1847],[-424,-198],[303,2045]],[[227844,435122],[-1276,-6]],[[226568,435116],[-6,2365]],[[226562,437481],[640,2967]],[[211088,434291],[-535,-10]],[[210553,434281],[-1335,-7]],[[226562,437481],[-534,-2004],[-732,-3606]],[[225296,431871],[-12,3241]],[[225284,435112],[1,6470]],[[225284,435112],[-1212,5]],[[224072,435117],[-74,0]],[[223998,435117],[12,6470]],[[223998,435117],[-1279,6]],[[231869,437801],[-1125,-15]],[[189127,436934],[-680,-1517],[-235,-1306],[316,-2475],[-193,-1470],[-256,342]],[[188079,430508],[-272,1154]],[[187807,431662],[-214,1796],[-114,3379]],[[279827,438006],[-264,-1318],[-1,-4190]],[[279562,432498],[-1143,100]],[[278419,432598],[1,2588]],[[157829,437649],[146,-436],[-429,-4820],[-421,-4012],[146,-2151],[-836,-2814],[-186,-2443]],[[156249,420973],[222,-710],[144,-5038]],[[156615,415225],[-1701,-21],[1,463]],[[293900,433789],[-376,-1707]],[[293524,432082],[-325,588]],[[293199,432670],[123,2992],[-28,2071],[-288,2510]],[[293903,434099],[-3,-310]],[[291932,437982],[-383,-2133]],[[291549,435849],[-417,-3054],[-322,-187]],[[290810,432608],[-554,3400]],[[290256,436008],[-69,-42]],[[272356,440732],[-5,-6697]],[[272351,434035],[-74,-1524],[-634,144]],[[271643,432655],[-114,1381]],[[271529,434036],[10,5372]],[[273448,436747],[0,-2714],[-243,-5]],[[273205,434028],[-854,7]],[[247153,437064],[-5,-1624]],[[247148,435440],[-963,88]],[[246185,435528],[-457,35]],[[245728,435563],[0,39]],[[250707,436186],[-548,-8],[-300,836]],[[293219,434221],[-863,2534]],[[292356,436755],[-51,173]],[[292988,440225],[220,-3323],[11,-2681]],[[286799,433313],[-277,-2754],[-204,-490]],[[286318,430069],[-412,1992]],[[285906,432061],[44,1187],[-292,2181],[-66,1718]],[[255263,437340],[2,-2899]],[[255265,434441],[-1688,-234]],[[253577,434207],[-321,-56]],[[253256,434151],[-13,2219]],[[261445,439166],[-77,-4820]],[[261368,434346],[-859,-55]],[[260509,434291],[-112,827]],[[294555,427007],[-1,231]],[[294554,427238],[1,-231]],[[294554,427873],[-111,3760]],[[294443,431633],[-93,1192],[769,-305],[174,1129],[1072,-46],[376,297],[903,2986],[-441,-2839],[-371,-1388],[292,-372],[379,1926],[532,898],[205,-1022],[552,1761],[82,-626],[-1554,-3633],[-192,472],[-405,-1606],[-231,346],[-428,-1335],[-389,98],[-351,-945],[-238,353],[-532,-1101]],[[269724,435473],[-278,-7],[9,-1349]],[[269455,434117],[-813,50]],[[268642,434167],[-292,19]],[[268350,434186],[-30,4816]],[[256925,437457],[-1,-4839]],[[256924,432618],[-156,-1387],[-315,-5],[3,-1882]],[[256456,429344],[-470,-1]],[[255986,429343],[-23,8976]],[[271529,434036],[-1228,60]],[[270301,434096],[-118,1335]],[[262850,438950],[1,-4899]],[[262851,434051],[1,-1244]],[[262852,432807],[-755,-88]],[[262097,432719],[-730,-14]],[[261367,432705],[1,1641]],[[268350,434186],[-789,-60]],[[267561,434126],[-857,-29]],[[266704,434097],[-2,3256]],[[281701,437073],[-194,-835],[74,-2824],[-363,-706],[-462,-3036],[47,-402]],[[280803,429270],[26,-144]],[[280829,429126],[-1257,-6]],[[279572,429120],[-10,3378]],[[192649,434205],[0,-3424]],[[192649,430781],[-728,405],[-315,-879],[-787,-888],[-261,131],[-420,-1293]],[[190138,428257],[-340,-1865],[-343,-530],[-618,1479],[-69,1143],[-267,-1698],[-177,190]],[[188324,426976],[-245,3532]],[[284190,435074],[-613,-3675]],[[283577,431399],[-884,-2182]],[[282693,429217],[-399,260],[-333,-971],[-479,890]],[[281482,429396],[-679,-126]],[[290256,436008],[-428,-2350]],[[289828,433658],[-466,-1941],[-519,-917]],[[288843,430800],[-280,2542],[218,671],[-426,2511]],[[264137,437330],[-1,-3255],[-160,-7]],[[263976,434068],[-1125,-17]],[[249380,437015],[-1,-3256]],[[249379,433759],[-966,19]],[[248413,433778],[2,3251]],[[214795,434321],[-2,-29]],[[214793,434292],[-1584,2]],[[255986,429343],[-721,8]],[[255265,429351],[0,5090]],[[292587,430897],[-395,1442]],[[292192,432339],[-104,1880],[-539,1630]],[[292356,436755],[-165,-2166],[367,-970],[29,-2722]],[[231989,437225],[3,-1984]],[[231992,435241],[-431,236],[-484,-1310],[-310,919]],[[164787,410464],[-407,-275]],[[164380,410189],[102,1082],[5,3235],[-258,1376],[-23,1351],[-367,544],[-472,2489],[-707,1249],[-457,-2310],[-371,1200],[1,3540],[-743,-22]],[[161090,423923],[22,8573],[-31,5176]],[[161090,423923],[-473,4]],[[160617,423927],[-1427,-350],[-831,-1031],[-549,335],[-407,-1138],[-270,689],[-884,-1459]],[[285336,437451],[-167,-4196],[366,398],[371,-1592]],[[286318,430069],[-895,-2187]],[[285423,427882],[-525,-888],[-165,332]],[[284733,427326],[26,188]],[[284759,427514],[265,1448],[124,3090]],[[285148,432052],[-223,1660],[-44,3125]],[[259668,435047],[-2,-813]],[[259666,434234],[-619,-58],[-1,-1610]],[[259046,432566],[-835,5]],[[258211,432571],[4,4869]],[[226568,435116],[1,-6480]],[[226569,428636],[-1260,-4]],[[225309,428632],[-13,-1]],[[225296,428631],[0,3240]],[[258211,432571],[-314,19]],[[257897,432590],[-973,28]],[[277095,437427],[-6,-9327]],[[277089,428100],[-1270,89]],[[275819,428189],[-27,3363]],[[275792,431552],[-19,2705],[190,1291]],[[278419,432598],[1,-2521],[-655,-4576]],[[277765,425501],[-675,2581]],[[277090,428082],[-1,18]],[[266704,434097],[-266,-3234]],[[266438,430863],[-1015,33]],[[265423,430896],[-1,1871]],[[265422,432767],[-2,4605]],[[265422,432767],[-638,-292],[0,-814],[-644,-36]],[[264140,431625],[-164,2443]],[[243592,437280],[-7,-4878]],[[243585,432402],[-1284,-20]],[[242301,432382],[-2,4895]],[[244553,435628],[-3,-4868],[-104,1]],[[244446,430761],[-862,16]],[[243584,430777],[1,1625]],[[242301,432382],[-1281,-16]],[[241020,432366],[-4,4885]],[[238461,437251],[3,-4896]],[[238464,432355],[-1277,-24]],[[237187,432331],[1,4836]],[[239738,437241],[4,-4883]],[[239742,432358],[-1278,-3]],[[241020,432366],[-1278,-8]],[[233371,437227],[-2,-4811]],[[233369,432416],[-1193,2]],[[232176,432418],[-184,2823]],[[234644,437199],[-3,-4800]],[[234641,432399],[-1272,17]],[[235917,437182],[-1,-4805]],[[235916,432377],[-1275,22]],[[237187,432331],[-1271,46]],[[187807,431662],[-565,-723],[-182,1854],[-716,-2763]],[[186344,430030],[-640,5647]],[[248413,433778],[-2,-4886]],[[248411,428892],[-1277,44]],[[247134,428936],[14,6504]],[[285148,432052],[-398,108],[-1152,-1498]],[[283598,430662],[-21,737]],[[251026,432870],[-1183,-88]],[[249843,432782],[68,968],[-532,9]],[[292970,430541],[-431,-269]],[[292539,430272],[48,625]],[[293219,434221],[-249,-3680]],[[274786,436568],[0,-4189]],[[274786,432379],[-1580,38]],[[273206,432417],[-1,1611]],[[288843,430800],[-376,-510]],[[288467,430290],[-415,-967]],[[288052,429323],[-667,3305]],[[275792,431552],[-1004,-69]],[[274788,431483],[-2,896]],[[253256,434151],[34,-7012],[-625,-15]],[[252665,427124],[-321,-16],[-27,2627],[-962,-80]],[[251355,429655],[-5,3249]],[[290810,432608],[-339,-2310]],[[290471,430298],[-220,-1439],[-616,-2210]],[[289635,426649],[-20,312]],[[289615,426961],[68,3154],[341,1723],[-196,1820]],[[292192,432339],[-162,208],[-116,-3152]],[[291914,429395],[-248,-1212]],[[291666,428183],[-265,1560],[-471,-722]],[[290930,429021],[-459,1277]],[[186344,430030],[155,-1074],[97,-4631]],[[186596,424325],[-109,-153],[38,-2825],[149,-2529],[-96,-2970]],[[186578,415848],[-452,-1999],[-1271,-19],[-3480,52]],[[181375,413882],[1,3927]],[[245728,435563],[-37,-2695],[-356,-1884],[-62,-2389]],[[245273,428595],[-827,2166]],[[246185,435528],[-13,-8061]],[[246172,427467],[-319,64]],[[245853,427531],[-783,-26]],[[245070,427505],[203,1090]],[[247134,428936],[-3,-1616]],[[247131,427320],[-959,147]],[[270301,434096],[8,-6024]],[[270309,428072],[-263,-12],[2,-1850]],[[270048,426210],[-326,-246]],[[269722,425964],[-6,3196],[-215,1864],[-46,3093]],[[232176,432418],[-58,-2195]],[[232118,430223],[-1754,3]],[[230364,430226],[-1,4321]],[[227844,435122],[-1,-6484]],[[227843,428638],[-1271,-2]],[[226572,428636],[-3,0]],[[225296,428631],[-1222,12]],[[224074,428643],[-2,6474]],[[222111,435114],[24,-6994]],[[222135,428120],[-630,262]],[[221505,428382],[-943,281]],[[220562,428663],[-673,5]],[[224074,428643],[-9,-170]],[[224065,428473],[-506,-690],[-761,186]],[[222798,427969],[-663,151]],[[229118,435107],[-7,-6481]],[[229111,428626],[-1268,12]],[[230364,430226],[0,-4858]],[[230364,425368],[-1251,12]],[[229113,425380],[-2,3246]],[[260509,434291],[15,-6500]],[[260524,427791],[-631,-27]],[[259893,427764],[-208,-13],[-19,6483]],[[255265,429351],[-1,-4574]],[[255264,424777],[-1140,-99]],[[254124,424678],[-508,40],[-39,9489]],[[261367,432705],[3,-4890],[-318,-15]],[[261052,427800],[-528,-9]],[[206643,416247],[0,0]],[[210532,425375],[-1577,18],[-7,-9745]],[[208948,415648],[-2259,-10]],[[206689,415638],[-255,-1]],[[206434,415637],[-6,4869]],[[206428,420506],[-5,1628],[310,-3],[6,12084]],[[210553,434281],[-21,-8906]],[[217035,428622],[-272,6]],[[216763,428628],[-1967,-10]],[[214796,428618],[0,969]],[[214796,429587],[-3,4705]],[[201978,423908],[55,-1918],[16,-7759]],[[202049,414231],[-1129,-109]],[[200920,414122],[-15,3214]],[[200905,417336],[-2,2480],[-1118,-26]],[[199785,419790],[29,5936],[320,1081],[-11,7496]],[[201402,434298],[27,-1460],[436,-670],[158,-1783],[-185,-3986],[140,-2491]],[[204199,424684],[-292,-2571],[-164,468],[-589,-929],[-98,691],[-519,-163],[-107,1114],[-340,-603],[-112,1217]],[[203264,434210],[15,-1191],[530,-3757],[390,-4578]],[[199785,419790],[-1878,-32],[-2612,19]],[[195295,419777],[7,8023]],[[195302,427800],[-5,6461]],[[213087,423794],[-321,0]],[[212766,423794],[-1909,-39]],[[210857,423755],[-6,1618],[-319,2]],[[213119,434292],[6,-4708]],[[213125,429584],[-38,-5790]],[[214796,429587],[-1671,-3]],[[195302,427800],[-314,562],[-118,3255],[-532,-11],[-250,-2208],[-269,1599],[-807,-1145],[-299,856]],[[192713,430708],[-64,73]],[[176394,418012],[112,-5115],[-101,-2198],[49,-2635],[-263,-2403],[2,-5633]],[[176193,400028],[-1933,-7]],[[174260,400021],[29,16934],[-18,16297],[28,1004]],[[174260,400021],[-2037,36],[-1236,-1303]],[[170987,398754],[153,2224],[-118,2607],[482,3074],[266,297],[87,1838],[-89,2169],[75,3206],[-204,1482]],[[171639,415651],[672,9776]],[[206428,420506],[-1667,-25]],[[204761,420481],[-562,4203]],[[259893,427764],[3,-1603]],[[259896,426161],[-839,-54]],[[259057,426107],[-11,6459]],[[268642,434167],[-7,-5295]],[[268635,428872],[-365,-115]],[[268270,428757],[-705,-40]],[[267565,428717],[-4,5409]],[[254124,424678],[8,-1608]],[[254132,423070],[-1470,-13]],[[252662,423057],[3,4067]],[[269722,425964],[-798,-95]],[[268924,425869],[-10,2970],[-279,33]],[[267565,428717],[-860,-299]],[[266705,428418],[-211,275],[-56,2170]],[[271643,432655],[-7,-4585]],[[271636,428070],[-1327,2]],[[264140,431625],[-158,-803],[1,-2439]],[[263983,428383],[-165,-1]],[[263818,428382],[0,807],[-964,-2]],[[262854,429187],[-2,3620]],[[273206,432417],[-2,-3235]],[[273204,429182],[-418,-80],[-224,-1340]],[[272562,427762],[-923,-316]],[[271639,427446],[-3,624]],[[249843,432782],[-231,-3232]],[[249612,429550],[-356,-3635],[-528,-731]],[[248728,425184],[-3,2060],[-321,38],[7,1610]],[[289615,426961],[-382,-1336]],[[289233,425625],[-268,2542],[-150,-335],[-348,2458]],[[171639,415651],[-2673,-44],[-2017,13]],[[288052,429323],[-372,-1083]],[[287680,428240],[-781,-2649],[-748,-726]],[[286151,424865],[-265,1102]],[[285886,425967],[-463,1915]],[[274788,431483],[-1,-3962]],[[274787,427521],[-415,-1046]],[[274372,426475],[-540,316]],[[273832,426791],[-154,2374],[-474,17]],[[251355,429655],[-154,-1644],[-415,-1270],[-378,-46]],[[250408,426695],[-162,393],[-9,2476],[-625,-14]],[[262854,429187],[-1,-2903]],[[262853,426284],[-741,-74]],[[262112,426210],[-15,6509]],[[265423,430896],[0,-3262]],[[265423,427634],[-634,-31],[-321,799],[-485,-19]],[[188324,426976],[-114,-601]],[[188210,426375],[-465,-891],[-618,-2134],[-142,895],[-389,80]],[[293524,432082],[-12,-1259],[-325,-351]],[[293187,430472],[-27,1525]],[[293160,431997],[39,673]],[[262112,426210],[-370,-18]],[[261742,426192],[-685,-6]],[[261057,426186],[-5,1614]],[[294555,427007],[-1,231]],[[294554,427873],[-875,-1167]],[[293679,426706],[-79,470]],[[293600,427176],[63,322]],[[293663,427498],[119,2121],[-126,536]],[[293656,430155],[90,1669],[410,855],[287,-1046]],[[257897,432590],[-1,-3261]],[[257896,429329],[-463,33],[-65,-3266]],[[257368,426096],[-903,15]],[[256465,426111],[-9,3233]],[[259057,426107],[-583,-24]],[[258474,426083],[2,2440],[-422,-1],[-158,807]],[[279572,429120],[-482,-6117]],[[279090,423003],[-351,-509],[-158,819],[-661,807],[-155,1381]],[[292539,430272],[83,-963]],[[292622,429309],[-118,-889]],[[292504,428420],[-590,975]],[[233369,432416],[31,-5977]],[[233400,426439],[-1091,87]],[[232309,426526],[-329,3028],[138,669]],[[234641,432399],[38,-6061]],[[234679,426338],[-801,63]],[[233878,426401],[-478,38]],[[235916,432377],[-1,-6118]],[[235915,426259],[-448,10]],[[235467,426269],[-788,69]],[[243584,430777],[5,-4003]],[[243589,426774],[-630,136]],[[242959,426910],[-660,-98]],[[242299,426812],[2,5570]],[[242299,426812],[-476,-61]],[[241823,426751],[-800,-120]],[[241023,426631],[-3,5735]],[[237187,432331],[-2,-6015]],[[237185,426316],[-604,-37]],[[236581,426279],[-666,-20]],[[238464,432355],[-1,-5921]],[[238463,426434],[-606,-50]],[[237857,426384],[-672,-68]],[[239742,432358],[1,-5854]],[[239743,426504],[-772,-68]],[[238971,426436],[-508,-2]],[[241023,426631],[-213,-26]],[[240810,426605],[-1067,-101]],[[284759,427514],[-273,768],[-697,262]],[[283789,428544],[-185,150],[-6,1968]],[[293187,430472],[-271,-1807],[244,3332]],[[195295,419777],[-1,-10466]],[[195294,409311],[0,-3031]],[[195294,406280],[-155,-665],[-2556,-5]],[[192583,405610],[1,136]],[[192584,405746],[-39,1805],[122,2542],[304,1922],[-230,5]],[[192741,412020],[-28,18688]],[[275819,428189],[-81,-1216],[-510,-2451]],[[275228,424522],[-441,-3]],[[274787,424519],[0,3002]],[[282497,422685],[-451,360],[271,1887],[-71,939],[431,2360],[16,986]],[[283789,428544],[-584,-2082],[-708,-3777]],[[192741,412020],[-2481,120]],[[190260,412140],[-94,1614]],[[190166,413754],[-28,14503]],[[266705,428418],[4,-3381]],[[266709,425037],[-283,-21]],[[266426,425016],[-1003,645]],[[265423,425661],[0,1973]],[[292970,430541],[-211,-2552],[-210,-377],[73,1697]],[[245070,427505],[-470,-581],[-146,-1017],[115,-2813],[-151,-420]],[[244418,422674],[-829,4100]],[[293679,426706],[-79,470]],[[293412,427055],[2,251]],[[293414,427306],[-2,-251]],[[293663,427498],[-315,245]],[[293348,427743],[-288,1615]],[[293060,429358],[139,999],[457,-202]],[[290930,429021],[33,-2516],[-174,-1500],[76,-1477]],[[290865,423528],[-301,-1442],[-241,-93]],[[290323,421993],[-332,1497],[-16,2219],[-340,940]],[[289233,425625],[-418,-2203]],[[288815,423422],[-127,533]],[[288688,423955],[-1008,4285]],[[232309,426526],[155,-1143]],[[232464,425383],[-995,-12]],[[231469,425371],[-1105,-3]],[[291666,428183],[-6,-1402]],[[291660,426781],[-177,-792],[187,-1218],[-446,-2170]],[[291224,422601],[-359,927]],[[252662,423057],[2,-2183]],[[252664,420874],[-322,-1]],[[252342,420873],[-1598,9]],[[250744,420882],[-320,803]],[[250424,421685],[-16,5010]],[[214796,428618],[0,-4795]],[[214796,423823],[-1709,-29]],[[250424,421685],[-946,-94]],[[249478,421591],[-311,-17],[-6,2160],[-579,13]],[[248582,423747],[146,1437]],[[282497,422685],[136,-2142]],[[282633,420543],[-450,-3765]],[[282183,416778],[-753,1928]],[[281430,418706],[-282,1105],[-60,1366]],[[281088,421177],[343,3265],[-239,3445],[290,1509]],[[281088,421177],[-85,-1011],[-408,1093],[-38,-1088],[-480,1549]],[[280077,421720],[157,811],[68,2529],[527,4066]],[[293412,427055],[2,251]],[[293348,427743],[-53,-1236],[-451,496],[216,2355]],[[256465,426111],[5,-1623]],[[256470,424488],[-1206,27]],[[255264,424515],[0,262]],[[292504,428420],[-134,-1704]],[[292370,426716],[-710,65]],[[258474,426083],[-4,-2412]],[[258470,423671],[-889,5]],[[257581,423676],[-2,2416],[-211,4]],[[273832,426791],[-165,-803],[-57,-2450]],[[273610,423538],[-915,164]],[[272695,423702],[15,2449],[-148,1611]],[[263818,428382],[2,-6070],[59,-80]],[[263879,422232],[-1,-5]],[[263878,422227],[-1029,-28]],[[262849,422199],[4,4085]],[[280077,421720],[-106,-1566]],[[279971,420154],[-653,121],[-455,659]],[[278863,420934],[227,2069]],[[248582,423747],[-330,-1227],[-73,-1405],[-363,-2059]],[[247816,419056],[-702,92],[4,1628]],[[247118,420776],[13,6544]],[[268924,425869],[-64,-3813],[-274,84]],[[268586,422140],[-515,159],[-254,1409]],[[267817,423708],[174,1058],[2,2876],[277,1115]],[[267817,423708],[-635,189]],[[267182,423897],[2,1174],[-475,-34]],[[220562,428663],[2,-4872],[-317,7],[0,-1627]],[[220247,422171],[-287,-23]],[[219960,422148],[-1562,-10]],[[218398,422138],[-52,0]],[[218346,422138],[-2,6528]],[[225309,428632],[0,-6478]],[[225309,422154],[-1242,1]],[[224067,422155],[-2,6318]],[[221505,428382],[3,-6212]],[[221508,422170],[-1261,1]],[[218346,422138],[-1521,20]],[[216825,422158],[-55,-2]],[[216770,422156],[-7,6472]],[[216770,422156],[-1974,-23]],[[214796,422133],[0,1690]],[[227843,428638],[0,-6483]],[[227843,422155],[-1260,3]],[[226583,422158],[-9,0]],[[226574,422158],[-2,6478]],[[229113,425380],[-7,-3237]],[[229106,422143],[-1263,12]],[[226574,422158],[-1253,-4]],[[225321,422154],[-12,0]],[[284733,427326],[-651,-855],[-995,-3407],[-367,-2037]],[[282720,421027],[-87,-484]],[[190166,413754],[-531,19],[-2,801],[-456,2164],[59,2009],[-250,2239],[-310,-13],[-356,1411],[-184,1615],[74,2376]],[[224067,422155],[-8,0]],[[224059,422155],[-1261,5]],[[222798,422160],[0,5809]],[[265423,425661],[-341,-1035]],[[265082,424626],[-938,-41],[1,-1903],[-266,-450]],[[222798,422160],[-1257,8]],[[221541,422168],[-33,2]],[[278863,420934],[-360,-3257],[-302,-1293]],[[278201,416384],[-562,1959],[-401,-1171],[-297,845],[-366,-25]],[[276575,417992],[19,1315]],[[276594,419307],[179,811],[290,5227],[-200,1083],[227,1654]],[[288688,423955],[-466,-3821]],[[288222,420134],[-493,-1945]],[[287729,418189],[-773,3320]],[[286956,421509],[-805,3356]],[[276594,419307],[-123,1028],[-749,1490],[-494,2697]],[[271639,427446],[-58,-3551],[-110,17]],[[271471,423912],[-1324,214]],[[270147,424126],[-99,2084]],[[272695,423702],[-15,-2421],[-175,-1661]],[[272505,419620],[-793,132]],[[271712,419752],[19,2733],[-268,50],[8,1377]],[[285886,425967],[-397,-1498],[304,-5190]],[[285793,419279],[-424,-1382]],[[285369,417897],[-35,1119],[-345,857]],[[284989,419873],[-161,1874]],[[284828,421747],[-318,1084],[208,1376],[-107,1919],[122,1200]],[[261057,426186],[8,-3496]],[[261065,422690],[-374,7]],[[260691,422697],[-791,-21]],[[259900,422676],[1,530]],[[259901,423206],[-5,2955]],[[292731,427719],[-75,-1794],[-401,-1051],[179,2726],[297,119]],[[245853,427531],[-15,-6605]],[[245838,420926],[-7,-1699]],[[245831,419227],[-1653,137]],[[244178,419364],[23,899]],[[244201,420263],[217,2411]],[[274787,424519],[3,-1461]],[[274790,423058],[-309,-65]],[[274481,422993],[90,1246],[-199,2236]],[[247118,420776],[-1280,150]],[[284828,421747],[-989,-927],[-267,651],[-693,-2143]],[[282879,419328],[-159,1699]],[[244201,420263],[-1264,157]],[[242937,420420],[3,812]],[[242940,421232],[19,5678]],[[290323,421993],[609,-3619]],[[290932,418374],[-696,-1838]],[[290236,416536],[-114,1663]],[[290122,418199],[-1307,5223]],[[292370,426716],[-184,-1986],[143,-700]],[[292329,424030],[-474,-3179],[-254,-504]],[[291601,420347],[-383,1322],[6,932]],[[242940,421232],[-1109,36]],[[241831,421268],[-6,814]],[[241825,422082],[-2,4669]],[[274481,422993],[82,-1389],[-230,-2518]],[[274333,419086],[-58,-528]],[[274275,418558],[-502,43]],[[273773,418601],[49,4904],[-212,33]],[[241825,422082],[-931,-56]],[[240894,422026],[22,2915],[-106,1664]],[[240894,422026],[-478,-14]],[[240416,422012],[1,804],[-1425,-54]],[[238992,422762],[-21,3674]],[[233878,426401],[61,-5897]],[[233939,420504],[-1043,57]],[[232896,420561],[-163,921],[-269,3901]],[[238992,422762],[-1,-2172]],[[238991,420590],[-1104,-44]],[[237887,420546],[-30,5838]],[[235467,426269],[94,-3438]],[[235561,422831],[-21,-4851]],[[235540,417980],[-1218,74]],[[234322,418054],[-79,2429],[-304,21]],[[190260,412140],[-1085,15]],[[189175,412155],[-1095,-4]],[[188080,412151],[-519,2498],[-397,-2608],[-336,-472],[101,2059],[-351,2220]],[[237887,420546],[-2,-2440]],[[237885,418106],[-1261,69]],[[236624,418175],[7,4610]],[[236631,422785],[-50,3494]],[[270147,424126],[-32,-4044]],[[270115,420082],[-784,126],[-762,580]],[[268569,420788],[17,1352]],[[262849,422199],[1,-795]],[[262850,421404],[-1157,-63]],[[261693,421341],[-3,1350]],[[261690,422691],[52,3501]],[[236631,422785],[-1070,46]],[[261690,422691],[-625,-1]],[[259901,423206],[-1061,-73],[0,-541]],[[258840,422592],[-370,1079]],[[257581,423676],[-3,-4054]],[[257578,419622],[-1105,9]],[[256473,419631],[1,2822]],[[256474,422453],[-4,2035]],[[232896,420561],[7,-54]],[[232903,420507],[-1276,-7]],[[231627,420500],[-157,10]],[[231470,420510],[-1,4861]],[[286956,421509],[-435,-1129],[-728,-1101]],[[266426,425016],[-87,-5114]],[[266339,419902],[-1291,821]],[[265048,420723],[34,3903]],[[210857,423755],[-19,-8095],[-651,-3]],[[210187,415657],[-1239,-9]],[[230364,425368],[0,-4856]],[[230364,420512],[0,-4861]],[[230364,415651],[-953,8]],[[229411,415659],[-308,1]],[[229103,415660],[3,6483]],[[231470,420510],[-1106,2]],[[267401,418295],[-101,-658]],[[267300,417637],[-828,70]],[[266472,417707],[25,2122],[-158,73]],[[267182,423897],[1,-3714],[212,-4],[6,-1884]],[[255264,424515],[-14,-6128]],[[255250,418387],[-5,-4934]],[[255245,413453],[-1127,-59]],[[254118,413394],[14,9676]],[[204761,420481],[44,-3996],[-107,-2111]],[[204698,414374],[-40,-1498]],[[204658,412876],[-515,-983],[-138,-1866]],[[204005,410027],[-269,-196],[-186,2235],[-440,1922],[-526,246]],[[202584,414234],[-535,-3]],[[265048,420723],[-23,-1667]],[[265025,419056],[-1141,244]],[[263884,419300],[-6,2927]],[[276575,417992],[2,-1689],[-338,-982]],[[276239,415321],[-807,668],[-645,-1056]],[[274787,414933],[1,1005]],[[274788,415938],[-1,2668]],[[274787,418606],[3,4452]],[[256474,422453],[-391,-1025],[-571,-2641],[86,-782]],[[255598,418005],[-348,382]],[[292681,417934],[-413,-100],[-60,940],[-392,66],[-407,-1735]],[[291409,417105],[-97,1100]],[[291312,418205],[289,2142]],[[292329,424030],[617,-741],[71,-1974],[-164,-3756],[-172,375]],[[271712,419752],[-260,-1288]],[[271452,418464],[-1312,274]],[[270140,418738],[-25,1344]],[[290122,418199],[-264,-1711],[-318,871],[49,-1505],[-196,-651]],[[289393,415203],[-235,1649]],[[289158,416852],[-265,414],[-399,2752],[-272,116]],[[160617,423927],[82,-1784],[340,-681],[-60,-1870],[-213,-1153]],[[160766,418439],[-393,-946],[-168,-2180],[-363,-1739],[-738,-95],[-16,-1615]],[[159088,411864],[-2483,10]],[[156605,411874],[10,3351]],[[164380,410189],[-1412,-44],[-74,-532],[-534,1856],[-382,-2585]],[[161978,408884],[-186,-741]],[[161792,408143],[-928,5114],[-31,2656],[120,1726],[-187,800]],[[268569,420788],[-30,-2813]],[[268539,417975],[-1138,320]],[[214796,422133],[-1,-6444]],[[214795,415689],[6,-7987]],[[214801,407702],[-2099,-115]],[[212702,407587],[-2,8092],[66,8115]],[[212702,407587],[-979,-41]],[[211723,407546],[-1540,11]],[[210183,407557],[2,3232]],[[210185,410789],[2,4868]],[[249478,421591],[4,-3680]],[[249482,417911],[-1008,385],[-87,-647]],[[248387,417649],[-390,-863],[-421,-126],[-193,1285]],[[247383,417945],[433,1111]],[[273773,418601],[-955,197]],[[272818,418798],[-313,822]],[[258840,422592],[0,-2942]],[[258840,419650],[1,-653]],[[258841,418997],[-1263,-39]],[[257578,418958],[0,664]],[[291312,418205],[-380,169]],[[259900,422676],[1,-2968]],[[259901,419708],[-1061,-58]],[[274787,418606],[-454,480]],[[254118,413394],[-1462,-13]],[[252656,413381],[8,7493]],[[240416,422012],[-1,-5687]],[[240415,416325],[-1409,-77]],[[239006,416248],[-15,4342]],[[236624,418175],[-6,-1894]],[[236618,416281],[-1077,81]],[[235541,416362],[-1,1618]],[[260691,422697],[7,-5629]],[[260698,417068],[-1,-2446]],[[260697,414622],[-797,-40]],[[259900,414582],[1,5126]],[[261693,421341],[13,-4278]],[[261706,417063],[-1008,5]],[[256473,419631],[4,-4874]],[[256477,414757],[-917,-11]],[[255560,414746],[38,3259]],[[263884,419300],[17,-5165]],[[263901,414135],[-164,-21]],[[263737,414114],[-912,-29]],[[262825,414085],[5,1641]],[[262830,415726],[20,5678]],[[225321,422154],[-1,-6473]],[[225320,415681],[-642,-7]],[[224678,415674],[-618,2]],[[224060,415676],[-1,6479]],[[224060,415676],[-949,-1]],[[223111,415675],[-312,-4]],[[222799,415671],[-1,6489]],[[226583,422158],[-2,-6488]],[[226581,415670],[-307,0]],[[226274,415670],[-954,11]],[[216825,422158],[-7,-6476]],[[216818,415682],[-238,-3]],[[216580,415679],[-1785,10]],[[221541,422168],[6,-6502]],[[221547,415666],[-1531,-5]],[[220016,415661],[-44,2]],[[219972,415663],[-12,6485]],[[227843,422155],[-2,-6487]],[[227841,415668],[-1260,2]],[[229103,415660],[-1262,8]],[[219972,415663],[-1519,8]],[[218453,415671],[-56,3]],[[218397,415674],[1,6464]],[[218397,415674],[-1579,8]],[[222799,415671],[-1244,-5]],[[221555,415666],[-8,0]],[[241831,421268],[8,-4944]],[[241839,416324],[-1400,2]],[[240439,416326],[-24,-1]],[[284989,419873],[-135,-1158],[-365,-437],[-280,-1344]],[[284209,416934],[-135,-749],[-607,-656],[-188,-939]],[[283279,414590],[-400,4738]],[[250744,420882],[11,-4341]],[[250755,416541],[4,-2438],[-208,-17]],[[250551,414086],[-739,301],[-265,800]],[[249547,415187],[-65,2724]],[[281430,418706],[-459,-6339],[-226,-1900]],[[280745,410467],[-1192,6]],[[279553,410473],[143,1890],[-17,4331],[292,3460]],[[287729,418189],[-193,-523],[-134,-4476],[-402,-2750]],[[287000,410440],[-272,4]],[[286728,410444],[-19,0]],[[286709,410444],[-635,4132],[-197,2069],[-508,1252]],[[262830,415726],[-1089,-10]],[[261741,415716],[-35,1347]],[[242937,420420],[-5,-5730]],[[242932,414690],[-935,53]],[[241997,414743],[-158,1581]],[[283279,414590],[33,-4171]],[[283312,410419],[-28,0]],[[283284,410419],[-1756,39]],[[281528,410458],[270,1945],[385,4375]],[[279553,410473],[-342,-2]],[[279211,410471],[-1285,-23]],[[277926,410448],[-70,2461],[345,3475]],[[252342,420873],[-474,-4214]],[[251868,416659],[-1113,-118]],[[247383,417945],[-442,-2539]],[[246941,415406],[-262,-107],[-245,2264],[-607,13]],[[245827,417576],[4,1651]],[[252656,413381],[-30,-1626]],[[252626,411755],[-760,5]],[[251866,411760],[2,4899]],[[270140,418738],[-33,-4033],[-98,-688]],[[270009,414017],[-637,318]],[[269372,414335],[-891,173]],[[268481,414508],[58,3467]],[[266472,417707],[-35,-1886]],[[266437,415821],[-1449,559]],[[264988,416380],[37,2676]],[[239006,416248],[0,-1219]],[[239006,415029],[-1115,-150]],[[237891,414879],[-6,3227]],[[206434,415637],[-263,-1609]],[[206171,414028],[-698,-18]],[[205473,414010],[-2,411],[-773,-47]],[[231627,420500],[-1,-4856]],[[231626,415644],[-637,4]],[[230989,415648],[-625,3]],[[232903,420507],[433,-2548],[-67,-1277],[314,-1050]],[[233583,415632],[-88,0]],[[233495,415632],[-1249,8]],[[232246,415640],[-620,4]],[[234322,418054],[138,-4323]],[[234460,413731],[-255,-671],[-622,2572]],[[244178,419364],[30,-3036],[165,-1716]],[[244373,414612],[-1128,56]],[[243245,414668],[-313,22]],[[288510,412605],[38,24]],[[288548,412629],[-38,-24]],[[289158,416852],[-454,-2262],[-196,-1986]],[[288508,412604],[-541,-2144]],[[287967,410460],[-967,-20]],[[286709,410444],[-918,-3]],[[285791,410441],[-606,-7]],[[285185,410434],[-592,-13]],[[284593,410421],[124,2546],[-179,2927],[-329,1040]],[[200905,417336],[-779,-15],[-5,-3272],[-315,51],[0,-1663],[-1412,-63],[0,-2430],[-1717,-16],[1,-809],[-1384,192]],[[272795,414724],[-423,-10],[-218,-1046],[-319,59],[-5,-1091],[-317,66]],[[271513,412702],[-96,1662],[35,4100]],[[272818,418798],[-23,-4074]],[[259900,414582],[-209,-307]],[[259691,414275],[-842,-20]],[[258849,414255],[-8,4742]],[[257578,418958],[2,-4763]],[[257580,414195],[0,-1080]],[[257580,413115],[-876,35]],[[256704,413150],[-228,10],[1,1597]],[[245827,417576],[-8,-4829]],[[245819,412747],[1,-1636],[-1253,29]],[[244567,411140],[-193,1581],[-1,1891]],[[264988,416380],[-41,-2986]],[[264947,413394],[-298,808],[-748,-67]],[[274788,415938],[-600,318]],[[274188,416256],[87,2302]],[[291409,417105],[453,-5673],[-67,-3974]],[[291795,407458],[-8,-68]],[[291787,407390],[-674,1374],[-215,1839]],[[290898,410603],[-464,1138],[-81,1797],[-341,1920]],[[290012,415458],[-13,49]],[[289999,415507],[237,1029]],[[258849,414255],[-241,-37]],[[258608,414218],[-1028,-23]],[[274188,416256],[-53,-2244],[-194,-1196]],[[273941,412816],[-1155,355]],[[272786,413171],[9,1553]],[[292681,417934],[179,-419],[-159,-5398],[-46,2228],[-255,-3465],[103,-762],[-505,-2576],[-203,-84]],[[271513,412702],[-9,-1621]],[[271504,411081],[-1056,287]],[[270448,411368],[-261,927],[22,1648],[-200,74]],[[281528,410458],[-678,3]],[[280850,410461],[-105,6]],[[249547,415187],[-334,-14],[-10,-1089],[-815,-275]],[[248388,413809],[-1,3840]],[[161792,408143],[-202,-1300],[-433,-150],[-282,-3312],[-609,-862]],[[160266,402519],[-794,178]],[[159472,402697],[52,1462]],[[159524,404159],[106,2863],[-397,-48],[-8,2486],[153,591],[-290,1813]],[[255560,414746],[183,-1654],[-78,-4759]],[[255665,408333],[-417,-12]],[[255248,408321],[-3,5132]],[[277926,410448],[-234,-9]],[[277692,410439],[-800,-6]],[[276892,410433],[-426,0]],[[276466,410433],[-22,3775],[-205,1113]],[[268481,414508],[-116,-2693]],[[268365,411815],[-1169,326]],[[267196,412141],[-43,3579],[147,1917]],[[289999,415507],[-235,-1942],[-206,-351]],[[289558,413214],[-165,1989]],[[237891,414879],[8,-3256]],[[237899,411623],[-1244,80]],[[236655,411703],[-37,4578]],[[235541,416362],[8,-4089]],[[235549,412273],[-763,19]],[[234786,412292],[-326,1439]],[[181375,413882],[-2,-6763]],[[181373,407119],[-6,-16111]],[[181367,391008],[-2649,0]],[[178718,391008],[-2525,9020]],[[248388,413809],[0,-545]],[[248388,413264],[-1641,73]],[[246747,413337],[194,2069]],[[267196,412141],[-24,-2179]],[[267172,409962],[-1117,399]],[[266055,410361],[17,1045]],[[266072,411406],[162,-81],[203,4496]],[[246747,413337],[32,-697]],[[246779,412640],[-960,107]],[[200920,414122],[-228,4],[1,-10296]],[[200693,403830],[-885,2]],[[199808,403832],[-4513,9]],[[195295,403841],[-1,2439]],[[261741,415716],[-54,-4022]],[[261687,411694],[-224,-18]],[[261463,411676],[-823,-18]],[[260640,411658],[57,2964]],[[284593,410421],[-604,-5]],[[283989,410416],[-677,3]],[[289558,413214],[-576,-1173]],[[288982,412041],[-434,588]],[[288510,412605],[-2,-1]],[[251866,411760],[-181,-2586]],[[251685,409174],[-598,19]],[[251087,409193],[-316,20],[-8,2709],[-211,269]],[[250552,412191],[-1,1895]],[[206689,415638],[-255,-1611]],[[206434,414027],[-263,1]],[[241997,414743],[-31,-6459]],[[241966,408284],[-4,0]],[[241962,408284],[-1090,93]],[[240872,408377],[8,1624],[-470,45]],[[240410,410046],[29,6280]],[[266072,411406],[-502,924],[-631,518]],[[264939,412848],[8,546]],[[240410,410046],[-1140,67]],[[239270,410113],[-272,4],[8,4912]],[[236655,411703],[-1,-803]],[[236654,410900],[-1104,25]],[[235550,410925],[-1,1348]],[[274786,410447],[-874,-18]],[[273912,410429],[29,2387]],[[274787,414933],[-1,-4486]],[[276466,410433],[-1406,8]],[[275060,410441],[-274,6]],[[188080,412151],[154,-1357],[-372,-848],[15,-4365],[-94,-1439],[-489,-26],[-259,-1247]],[[187035,402869],[-501,282],[-67,4178],[-5094,-210]],[[262825,414085],[-5,-3543]],[[262820,410542],[-613,-224]],[[262207,410318],[-419,17],[-101,1359]],[[216580,415679],[-8,-8083]],[[216572,407596],[-1771,-3]],[[214801,407593],[0,109]],[[218453,415671],[-6,-8081]],[[218447,407590],[-1806,6]],[[216641,407596],[-69,0]],[[156605,411874],[135,-4012]],[[156740,407862],[1,-963],[-483,-512],[-37,-1772],[224,-3191],[-238,-1152],[-36,-1898],[296,-1404],[110,-1804],[361,-938]],[[156938,394228],[-728,41],[-164,-808],[-645,-63],[-455,-694]],[[154946,392704],[-541,2801],[109,2093],[-386,5926],[150,3428],[-35,2229],[-193,3367],[-469,3107]],[[226274,415670],[1,-6484]],[[226275,409186],[-1,-1617]],[[226274,407569],[-1548,10]],[[224726,407579],[-50,3]],[[224676,407582],[2,8092]],[[224676,407582],[-1502,8]],[[223174,407590],[-61,1]],[[223113,407591],[-2,8084]],[[227841,415668],[2,-6477]],[[227843,409191],[-1568,-5]],[[229411,415659],[-2,-8099]],[[229409,407560],[-425,-1]],[[228984,407559],[-1141,12]],[[227843,407571],[0,1620]],[[220016,415661],[-7,-8093]],[[220009,407568],[-1504,22]],[[218505,407590],[-58,0]],[[170987,398754],[-249,-368]],[[170738,398386],[-2476,18]],[[168262,398404],[-1,696],[-1014,5148],[112,6216],[-310,-1673]],[[221555,415666],[-7,-8087]],[[221548,407579],[-1487,-3]],[[220061,407576],[-52,-8]],[[223113,407591],[-1493,-14]],[[221620,407577],[-72,2]],[[230989,415648],[1,-8092]],[[230990,407556],[-955,2]],[[230035,407558],[-626,2]],[[210185,410789],[-3283,6]],[[206902,410795],[415,544],[-67,968],[390,100],[54,1353],[-365,-16],[-165,-1868],[-731,-134]],[[206433,411742],[1,2285]],[[233495,415632],[0,-6461]],[[233495,409171],[-625,0]],[[232870,409171],[-626,1]],[[232244,409172],[2,6468]],[[232244,409172],[-1,-1611],[-687,-7]],[[231556,407554],[-566,2]],[[234786,412292],[-21,-1747],[-200,349],[-276,-2271]],[[234289,408623],[-168,540],[-626,8]],[[290898,410603],[-392,-2264]],[[290506,408339],[-409,2275],[-302,2865]],[[289795,413479],[217,1979]],[[250552,412191],[-498,-1356],[-386,-1884],[4,-2170]],[[249672,406781],[-468,-23]],[[249204,406758],[-626,-24]],[[248578,406734],[-164,3649],[-26,2881]],[[239270,410113],[-31,-1637]],[[239239,408476],[-1338,-79]],[[237901,408397],[-2,3226]],[[243245,414668],[-18,-5394]],[[243227,409274],[-942,82],[-5,-1095],[-314,23]],[[256704,413150],[-10,-4876]],[[256694,408274],[-518,44]],[[256176,408318],[-511,15]],[[272786,413171],[-213,31],[-15,-3018],[100,-1891]],[[272658,408293],[-850,-351]],[[271808,407942],[-304,3139]],[[244567,411140],[169,-1392]],[[244736,409748],[-1143,47],[1,-537]],[[243594,409258],[-367,16]],[[260640,411658],[-101,-1640]],[[260539,410018],[-888,-25]],[[259651,409993],[40,4282]],[[269372,414335],[-25,-1734],[207,-77],[64,-3316]],[[269618,409208],[-318,123],[-21,-1093],[-338,107],[-318,-1008]],[[268623,407337],[-310,141],[52,4337]],[[205473,414010],[-1,-3087]],[[205472,410923],[-407,495],[-407,1458]],[[270448,411368],[146,-862],[-65,-3237]],[[270529,407269],[-311,107]],[[270218,407376],[-615,748],[15,1084]],[[259651,409993],[-1,-1094]],[[259650,408899],[-829,-88]],[[258821,408811],[-213,-27]],[[258608,408784],[0,5434]],[[202584,414234],[137,-2937],[562,-2151],[-209,-2932],[145,-2132]],[[203219,404082],[-612,-330]],[[202607,403752],[-1914,78]],[[204005,410027],[367,-1170],[-102,-1326]],[[204270,407531],[-525,-3718],[-328,268]],[[203417,404081],[-198,1]],[[258608,408784],[-389,-585],[-532,8]],[[257687,408207],[-86,542],[-21,4366]],[[264939,412848],[-109,-226],[-59,-4847]],[[264771,407775],[-700,214]],[[264071,407989],[-317,29]],[[263754,408018],[-17,6096]],[[263754,408018],[1,-414],[-936,-23]],[[262819,407581],[1,2961]],[[206433,411742],[-1,-3288]],[[206432,408454],[13,-902]],[[206445,407552],[-516,-5958],[-264,-2165]],[[205665,399429],[-5,0]],[[205660,399429],[-187,-2],[-3,8128]],[[205470,407555],[2,3368]],[[206902,410795],[-80,-2162],[-167,812],[-223,-991]],[[290506,408339],[-301,-1740]],[[290205,406599],[-214,1002]],[[289991,407601],[-385,1832],[-352,446],[-281,1742]],[[288973,411621],[822,1858]],[[255248,408321],[1,-2424]],[[255249,405897],[-1194,78]],[[254055,405975],[-17,3810]],[[254038,409785],[80,3609]],[[254038,409785],[-270,-622],[-1139,-18]],[[252629,409145],[-3,2610]],[[248578,406734],[-634,-33]],[[247944,406701],[-412,-2]],[[247532,406699],[3,2166],[-202,555],[5,1620],[-635,683]],[[246703,411723],[76,917]],[[273912,410429],[-309,-2118]],[[273603,408311],[-264,-1244]],[[273339,407067],[6,599],[-687,627]],[[257687,408207],[-84,-2441]],[[257603,405766],[-705,61]],[[256898,405827],[-209,8],[5,2439]],[[205470,407555],[-1200,-24]],[[266055,410361],[-47,-3102]],[[266008,407259],[-855,352]],[[265153,407611],[-382,164]],[[246703,411723],[-131,-1726],[182,-3269]],[[246754,406728],[-91,-2345]],[[246663,404383],[-901,73]],[[245762,404456],[-253,772],[-419,2923]],[[245090,408151],[-354,1597]],[[288652,406259],[12,7]],[[288664,406266],[-12,-7]],[[288613,408309],[-8,431]],[[288605,408740],[8,-431]],[[288982,412041],[-534,-3559],[147,-1016],[-73,-1880],[204,-1804]],[[288726,403782],[-376,-1333],[-304,88]],[[288046,402537],[-18,1506]],[[288028,404043],[-61,6417]],[[251087,409193],[1,-5735],[-319,52]],[[250769,403510],[-1089,3],[-8,3268]],[[235550,410925],[3,-4036]],[[235553,406889],[-1398,55]],[[234155,406944],[134,1679]],[[192584,405746],[-2935,11],[-153,2687],[-321,1687]],[[189175,410131],[0,2024]],[[189175,410131],[1,-4419],[-151,2],[5,-8099]],[[189030,397615],[-1544,14],[-447,229]],[[187039,397858],[-4,5011]],[[268623,407337],[-26,-1603]],[[268597,405734],[-717,218],[40,495],[-788,179]],[[267132,406626],[40,3336]],[[159524,404159],[-693,578],[2,-532],[-1674,-52]],[[157159,404153],[10,3692],[-429,17]],[[252629,409145],[5,-3808]],[[252634,405337],[-317,9],[-372,2453],[-255,17],[-5,1358]],[[262207,410318],[-5,-3507]],[[262202,406811],[-729,-13]],[[261473,406798],[-10,4878]],[[261473,406798],[1,-1345]],[[261474,405453],[-925,-9]],[[260549,405444],[-10,4574]],[[247532,406699],[-778,29]],[[237901,408397],[-2,-1616]],[[237899,406781],[-1252,49]],[[236647,406830],[7,4070]],[[289029,404123],[-16,44]],[[289013,404167],[16,-44]],[[289991,407601],[-61,-2065],[-434,1889],[-494,-3193]],[[289002,404232],[-350,2027]],[[288664,406266],[-51,2043]],[[288605,408740],[368,2881]],[[164781,405356],[-1401,-15],[-152,1284],[-273,169],[-234,-1182],[-772,-1245]],[[161949,404367],[29,4517]],[[271808,407942],[-352,-103],[16,-1873],[-379,-570]],[[271093,405396],[-587,184],[23,1689]],[[236647,406830],[-6,-1350]],[[236641,405480],[-1087,27]],[[235554,405507],[-1,1382]],[[210183,407557],[-20,1]],[[210163,407558],[-2636,-8]],[[207527,407550],[-1082,2]],[[168262,398404],[-491,-22],[-237,-2422],[1,-1714],[314,16],[-14,-8144],[-697,1]],[[167138,386119],[-481,2256]],[[166657,388375],[-56,3727],[-157,-51],[-41,4121],[307,670],[-3,1729],[-666,41]],[[166041,398612],[-32,2040],[-419,1033]],[[165590,401685],[652,1617],[544,5284]],[[291787,407390],[22,-3591],[-686,-1401]],[[291123,402398],[-572,644]],[[290551,403042],[14,1877],[-360,1680]],[[262819,407581],[-2,-849]],[[262817,406732],[-615,79]],[[283284,410419],[-281,-1862],[-298,-5500]],[[282705,403057],[-115,-74]],[[282590,402983],[-298,3218]],[[282292,406201],[-167,1077],[132,1025],[-513,247]],[[281744,408550],[-440,1436],[-237,-1383],[-192,274]],[[280875,408877],[-25,1584]],[[280875,408877],[-278,-307],[-96,-1936]],[[280501,406634],[-526,344]],[[279975,406978],[-386,1376],[-475,-3170],[-283,768]],[[278831,405952],[380,4519]],[[278831,405952],[-568,-2832]],[[278263,403120],[-600,-2269]],[[277663,400851],[29,9588]],[[288028,404043],[-186,-68]],[[287842,403975],[-578,293],[198,3147],[-296,-282]],[[287166,407133],[-438,3311]],[[276892,410433],[-365,-5307]],[[276527,405126],[-123,314]],[[276404,405440],[-598,2940],[-675,502]],[[275131,408882],[-71,1559]],[[277663,400851],[0,-206]],[[277663,400645],[-557,1423],[-342,-760]],[[276764,401308],[-239,1284]],[[276525,402592],[2,2534]],[[287166,407133],[-74,-2015],[-419,-1266],[83,1880],[-379,-1384]],[[286377,404348],[-194,1933],[-292,888],[-100,3272]],[[275131,408882],[-285,-1378],[11,-1745]],[[274857,405759],[-140,-754]],[[274717,405005],[-207,396]],[[274510,405401],[-283,562],[-368,2260],[-256,88]],[[286377,404348],[69,-1032],[-251,-2456],[-293,639]],[[285902,401499],[0,2434],[-506,6],[2,-1756],[256,-748]],[[285654,401435],[-221,-442]],[[285433,400993],[-513,2542]],[[284920,403535],[-27,1753],[292,5146]],[[284920,403535],[-797,69]],[[284123,403604],[171,2562],[-558,2377],[253,1873]],[[284123,403604],[-2,-8]],[[284121,403596],[-805,-2420]],[[283316,401176],[-301,1527],[-310,354]],[[267132,406626],[-296,-2586]],[[266836,404040],[-607,26]],[[266229,404066],[40,3087],[-261,106]],[[192583,405610],[37,-824],[-294,-4892],[-129,-5401],[227,-2018],[156,-4769]],[[192580,387706],[-3568,0],[0,190]],[[189012,387896],[18,9719]],[[240872,408377],[-43,-5375]],[[240829,403002],[-231,409],[-164,-2185]],[[240434,401226],[-711,2931]],[[239723,404157],[-346,980],[-138,3339]],[[260549,405444],[-153,-1912]],[[260396,403532],[-746,-50]],[[259650,403482],[0,5417]],[[281744,408550],[-325,-479],[-251,-3773]],[[281168,404298],[-330,1392]],[[280838,405690],[-337,944]],[[245090,408151],[-786,-2744],[61,-2459]],[[244365,402948],[-779,380]],[[243586,403328],[8,5930]],[[254055,405975],[-144,-1905]],[[253911,404070],[-1278,-83]],[[252633,403987],[1,1350]],[[243586,403328],[-1650,162]],[[241936,403490],[26,4794]],[[270218,407376],[-23,-1680],[-315,123],[-26,-1652]],[[269854,404167],[-626,216],[-9,-490],[-644,-24]],[[268575,403869],[22,1865]],[[227843,407571],[-4,-4859]],[[227839,402712],[-1559,8]],[[226280,402720],[-6,4849]],[[232870,409171],[-17,-4355]],[[232853,404816],[-53,-3775]],[[232800,401041],[-1243,5]],[[231557,401046],[-1,6508]],[[234155,406944],[373,-2131]],[[234528,404813],[-590,6]],[[233938,404819],[-1085,-3]],[[252633,403987],[0,-2969]],[[252633,401018],[-933,23]],[[251700,401041],[-932,31]],[[250768,401072],[1,2438]],[[279975,406978],[-539,-3797],[-360,-1740]],[[279076,401441],[-431,1393],[-382,286]],[[273339,407067],[-230,-1522]],[[273109,405545],[-695,-2160]],[[272414,403385],[-195,1248],[-314,-1222],[-55,-1446],[-293,114],[-131,-1044]],[[271426,401035],[10,998],[-367,905],[24,2458]],[[276404,405440],[-240,-950],[-479,-155]],[[275685,404335],[-828,1424]],[[259650,403482],[-372,-60]],[[259278,403422],[-462,-46]],[[258816,403376],[5,5435]],[[161949,404367],[-299,-279],[-425,-2782],[0,-3647]],[[161225,397659],[-377,-706]],[[160848,396953],[-363,-449],[-90,-982],[-129,6997]],[[258816,403376],[-362,-36]],[[258454,403340],[-695,149]],[[257759,403489],[-4,2280],[-152,-3]],[[282292,406201],[-394,-2354],[-185,-1907]],[[281713,401940],[-545,2358]],[[239723,404157],[-203,523],[-147,-1561],[-300,-405],[-194,-1442],[-195,1194]],[[238684,402466],[-29,-1190],[-453,360],[-301,-767]],[[237901,400869],[-2,5912]],[[241936,403490],[-12,-1887]],[[241924,401603],[-322,44]],[[241602,401647],[-773,1355]],[[256176,408318],[-109,-1613],[-6,-4868]],[[256061,401837],[-1014,8]],[[255047,401845],[202,1649],[0,2403]],[[256898,405827],[-7,-2442],[-310,8],[-2,-3249]],[[256579,400144],[-519,69]],[[256060,400213],[1,1624]],[[274510,405401],[-752,-2906]],[[273758,402495],[-136,1718],[-196,-664]],[[273426,403549],[-49,2100],[-268,-104]],[[246361,401187],[-1284,58],[-7,-1638],[-209,11]],[[244861,399618],[-414,50]],[[244447,399668],[-82,3280]],[[245762,404456],[468,-1904],[131,-1365]],[[264071,407989],[93,-711],[-59,-4822]],[[264105,402456],[-1299,241]],[[262806,402697],[11,4035]],[[265153,407611],[-83,-5848]],[[265070,401763],[-704,293]],[[264366,402056],[-261,400]],[[157159,404153],[-102,-1293],[315,-1811],[516,-796],[-42,-2231],[424,-2417]],[[158270,395605],[-153,-1117]],[[158117,394488],[-192,-2961],[-455,-702]],[[157470,390825],[-532,3403]],[[214801,407593],[7,-8099]],[[214808,399494],[2,-1604]],[[214810,397890],[-3111,-175]],[[211699,397715],[24,9831]],[[289145,403438],[-116,685]],[[289013,404167],[-11,65]],[[290551,403042],[-150,-2724]],[[290401,400318],[-713,1073],[-543,2047]],[[223174,407590],[-9,-8099]],[[223165,399491],[-1516,-10]],[[221649,399481],[-38,0]],[[221611,399481],[9,8096]],[[265463,401619],[-346,126]],[[265117,401745],[-47,18]],[[266229,404066],[-541,-2162],[-225,-285]],[[216641,407596],[-7,-8066]],[[216634,399530],[-241,-6]],[[216393,399524],[-1585,-30]],[[218505,407590],[-3,-8092]],[[218502,399498],[-252,0]],[[218250,399498],[-1616,32]],[[224726,407579],[-8,-6473]],[[224718,401106],[0,-1621]],[[224718,399485],[-1525,8]],[[223193,399493],[-28,-2]],[[220061,407576],[-7,-8104]],[[220054,399472],[-1552,26]],[[228984,407559],[-7,-6447]],[[228977,401112],[-5,-1634]],[[228972,399478],[-1136,-7]],[[227836,399471],[3,3241]],[[226280,402720],[-2,-1625]],[[226278,401095],[-1560,11]],[[221611,399481],[-1512,-5]],[[220099,399476],[-45,-4]],[[230035,407558],[-404,-3029],[469,-4113],[472,-186]],[[230572,400230],[-5,-2410],[-307,8]],[[230260,397828],[0,542],[-974,290],[4,2434],[-313,18]],[[207527,407550],[-7,-8123]],[[207520,399427],[-1032,5]],[[206488,399432],[-823,-3]],[[210163,407558],[-15,-13022],[-936,36]],[[209212,394572],[12,4831],[-1704,24]],[[231557,401046],[-18,-1625]],[[231539,399421],[-119,1201],[-442,280],[-406,-672]],[[211699,397715],[-28,-7915]],[[211671,389800],[1,-1622],[-925,-166]],[[210747,388012],[-1530,111]],[[209217,388123],[-5,6449]],[[205660,399429],[4,-8051]],[[205664,391378],[-1785,-68]],[[203879,391310],[176,2110],[-338,2531],[-236,-28],[-218,2136]],[[203263,398059],[20,4732],[134,1290]],[[271426,401035],[-87,-662]],[[271339,400373],[-1426,435]],[[269913,400808],[-59,3359]],[[187039,397858],[-587,-3354],[17,-2559],[-254,-958],[-384,92],[-188,-2026]],[[185643,389053],[-4276,11]],[[181367,389064],[0,1944]],[[280838,405690],[20,-2092],[-220,-1798],[43,-1668],[-291,-1467]],[[280390,398665],[-1091,2059],[-223,717]],[[235554,405507],[-2,-5521]],[[235552,399986],[-482,732]],[[235070,400718],[-348,1876],[57,1415],[-251,804]],[[262806,402697],[-686,37]],[[262120,402734],[-425,21],[-218,-745]],[[261477,402010],[-3,3443]],[[237901,400869],[-183,146],[-782,-1329]],[[236936,399686],[-300,1184]],[[236636,400870],[5,4610]],[[250768,401072],[-307,-8],[0,-3525]],[[250461,397539],[-935,2],[-151,-542]],[[249375,396999],[-163,-3]],[[249212,396996],[-8,9762]],[[249212,396996],[-1246,20]],[[247966,397016],[-6,4876]],[[247960,401892],[-16,4809]],[[164769,402898],[-1778,-16],[-231,-508],[-693,-3277],[-169,-1785],[-673,347]],[[247960,401892],[-463,-687],[1,-945],[-743,197],[-64,-1253]],[[246691,399204],[-28,5179]],[[268575,403869],[-39,-2983]],[[268536,400886],[-64,-729]],[[268472,400157],[-1582,536]],[[266890,400693],[-54,3347]],[[282590,402983],[-306,-3505]],[[282284,399478],[-571,2462]],[[195295,403841],[-25,-16135]],[[195270,387706],[-2690,0]],[[255047,401845],[-68,-1899]],[[254979,399946],[-896,325]],[[254083,400271],[-160,-18]],[[253923,400253],[-12,3817]],[[273426,403549],[-646,-1537]],[[272780,402012],[-366,1373]],[[257759,403489],[-152,-219],[7,-3170]],[[257614,400100],[-1035,44]],[[275685,404335],[85,-2808]],[[275770,401527],[-169,-2411]],[[275601,399116],[-203,-165]],[[275398,398951],[-825,1176]],[[274573,400127],[195,794],[-216,1514],[165,2570]],[[281713,401940],[-331,-4250]],[[281382,397690],[-453,-529]],[[280929,397161],[-54,1696],[-336,-1326],[-249,538]],[[280290,398069],[100,596]],[[281262,400644],[0,0]],[[236636,400870],[-257,453],[-437,-2067],[-406,-129]],[[235536,399127],[16,859]],[[261477,402010],[-400,-1353]],[[261077,400657],[-346,-1150],[-342,-60]],[[260389,399447],[7,4085]],[[276525,402592],[-354,-957],[-401,-108]],[[274573,400127],[-368,-1329]],[[274205,398798],[-236,255]],[[273969,399053],[-281,3045],[70,397]],[[233938,404819],[-17,-6983]],[[233921,397836],[-873,234]],[[233048,398070],[-272,169],[24,2802]],[[235070,400718],[-349,74],[-25,-3937]],[[234696,396855],[-411,-173]],[[234285,396682],[-361,-327],[-3,1481]],[[159472,402697],[-103,-2316],[298,-2192],[10,-2579]],[[159677,395610],[-1407,-5]],[[240434,401226],[-265,-1911],[27,-1099]],[[240196,398216],[-322,-2537]],[[239874,395679],[-1243,272]],[[238631,395951],[53,6515]],[[272780,402012],[-162,-1544]],[[272618,400468],[-357,-942],[-433,-2022]],[[271828,397504],[-465,1316]],[[271363,398820],[-24,1553]],[[246691,399204],[104,-2426],[318,-370]],[[247113,396408],[-268,-1766],[-327,1147]],[[246518,395789],[-157,5398]],[[269913,400808],[-106,32],[-45,-3310]],[[269762,397530],[-314,138]],[[269448,397668],[30,1912],[-311,800],[-631,506]],[[273969,399053],[-615,-1858]],[[273354,397195],[-359,391]],[[272995,397586],[-242,75],[-135,2807]],[[288046,402537],[11,-941]],[[288057,401596],[-639,-5]],[[287418,401591],[-372,-2533],[-163,577],[-139,-1618],[-138,1747],[461,4160],[775,51]],[[203263,398059],[-1078,34]],[[202185,398093],[231,2578],[24,2142],[167,939]],[[253923,400253],[-983,-52]],[[252940,400201],[-307,817]],[[266890,400693],[-89,-2651]],[[266801,398042],[-801,-647]],[[266000,397395],[-555,16],[18,4208]],[[285892,400881],[-123,-38]],[[285769,400843],[123,38]],[[285902,401499],[-150,-621]],[[285752,400878],[-98,557]],[[285433,400993],[-397,-2058]],[[285036,398935],[-134,518]],[[284902,399453],[-167,-26],[-614,4169]],[[199808,403832],[102,-2045]],[[199910,401787],[-296,-715]],[[199614,401072],[-738,-3251],[-270,662],[-334,-353],[-440,-2814],[-665,-1481],[1,-2999]],[[197168,390836],[-2,-3130],[-1896,0]],[[202185,398093],[-59,-1116]],[[202126,396977],[-415,808],[-150,-1174],[-541,1040],[-198,1576],[-600,-2],[-312,2562]],[[289289,396094],[-480,-882],[-190,-1250],[-469,-136]],[[288150,393826],[-70,5854]],[[288080,399680],[-23,1916]],[[288726,403782],[311,-1994],[21,-3695],[231,-1999]],[[258454,403340],[32,-5425],[144,8]],[[258630,397923],[2,-1078]],[[258632,396845],[-1016,28]],[[257616,396873],[-2,3227]],[[260389,399447],[-315,-33],[3,-1128]],[[260077,398286],[-173,-511],[-611,176]],[[259293,397951],[-15,5471]],[[244447,399668],[-615,99],[-12,-1653]],[[243820,398114],[-1327,96]],[[242493,398210],[15,3270],[-584,123]],[[284902,399453],[-317,-3074]],[[284585,396379],[-327,-587]],[[284258,395792],[-575,2284]],[[283683,398076],[-376,336],[-185,1328],[194,1436]],[[259293,397951],[-663,-28]],[[241246,396474],[-791,165],[-259,1577]],[[241602,401647],[-356,-5173]],[[279076,401441],[-306,-3713],[122,-2044],[-246,-2142]],[[278646,393542],[-601,2684]],[[278045,396226],[-22,130]],[[278023,396356],[164,2029],[-157,242],[174,1961],[-541,57]],[[291123,402398],[69,-688],[-433,-4686],[-217,-1125],[-299,-2],[197,2821],[-39,1600]],[[283683,398076],[-584,-3904]],[[283099,394172],[-333,1775]],[[282766,395947],[-855,1322]],[[281911,397269],[373,2209]],[[164778,400098],[2,-985]],[[164780,399113],[3,-842]],[[164783,398271],[-389,10],[-272,-829],[-495,64],[-430,-2100],[-547,1773],[-795,-2035],[-254,-3501]],[[161601,391653],[-949,430]],[[160652,392083],[47,3550],[149,1320]],[[264366,402056],[-167,-4639]],[[264199,397417],[-520,1367]],[[263679,398784],[-327,-385]],[[263352,398399],[-336,1361],[-212,-782]],[[262804,398978],[2,3719]],[[262120,402734],[-186,-6686]],[[261934,396048],[-10,-344]],[[261924,395704],[-187,-294]],[[261737,395410],[-674,-15]],[[261063,395395],[14,5262]],[[262804,398978],[-161,-1387]],[[262643,397591],[-709,-1543]],[[227836,399471],[-2,-3241]],[[227834,396230],[-1551,10]],[[226283,396240],[-5,4855]],[[160652,392083],[-329,7]],[[160323,392090],[-249,594],[-92,1588],[-305,1338]],[[276764,401308],[-43,-2135]],[[276721,399173],[-197,-2651],[-527,-488]],[[275997,396034],[78,1670],[-474,1412]],[[238631,395951],[-2,-269]],[[238629,395682],[-940,177],[-5,-541],[-774,157]],[[236910,395475],[26,4211]],[[278023,396356],[-421,199],[-771,1158],[-110,1460]],[[264942,392757],[-495,1045]],[[264447,393802],[-4,881]],[[264443,394683],[-244,2734]],[[265117,401745],[-175,-8988]],[[281911,397269],[-117,-636]],[[281794,396633],[-412,1057]],[[247966,397016],[-356,-13],[-6,-1412]],[[247604,395591],[-491,817]],[[286601,396690],[-270,-2438],[180,3428],[90,-990]],[[288080,399680],[-243,-644],[-318,-3542]],[[287519,395494],[-452,119]],[[287067,395613],[-237,-813],[-18,1649],[166,2200],[440,2942]],[[256060,400213],[0,-4914]],[[256060,395299],[-786,-99]],[[255274,395200],[-295,4746]],[[202126,396977],[391,-1636],[384,-265],[-241,-1240],[-125,-2429],[202,-1122],[71,-1957],[299,-2059]],[[203107,386269],[-2100,53],[-1,-5186]],[[201006,381136],[-1581,2]],[[199425,381138],[-185,2880]],[[199240,384018],[376,1],[-2,6825]],[[199614,390844],[0,10228]],[[266000,397395],[-90,-7128]],[[265910,390267],[-554,2429]],[[265356,392696],[-414,61]],[[242493,398210],[-120,-2235],[32,-2529],[-220,-3074]],[[242185,390372],[-394,741],[-91,1045]],[[241700,392158],[-288,3406]],[[241412,395564],[-166,910]],[[166041,398612],[-586,525],[-675,-24]],[[280290,398069],[-483,-2836],[-192,-318],[-231,-2313]],[[279384,392602],[-347,1620],[-177,-1640]],[[278860,392582],[-214,960]],[[286072,395357],[-240,-2629],[72,-1051]],[[285904,391677],[-438,652]],[[285466,392329],[40,2579],[-96,1946],[-374,2081]],[[285752,400878],[17,-35]],[[285892,400881],[302,-2196],[-274,-289],[359,-1162],[-228,-562],[21,-1315]],[[236910,395475],[-14,-1566]],[[236896,393909],[-1362,261]],[[235534,394170],[2,3666]],[[235536,397836],[0,1291]],[[246518,395789],[-459,-1048],[-357,-130]],[[245702,394611],[-426,37],[-426,2232]],[[244850,396880],[11,2738]],[[230260,397828],[-2,-3239]],[[230258,394589],[-1082,7]],[[229176,394596],[-204,1767],[0,3115]],[[199614,390844],[-2446,-8]],[[226283,396240],[-1,-1625]],[[226282,394615],[-1549,-6]],[[224733,394609],[-15,4876]],[[233048,398070],[-1,-3479]],[[233047,394591],[-1242,3]],[[231805,394594],[-1,4258],[-265,569]],[[251700,401041],[-3,-5671],[315,56]],[[252012,395426],[-4,-1645]],[[252008,393781],[-1234,-54],[-1,-1621]],[[250773,392106],[-323,106]],[[250450,392212],[11,5327]],[[252940,400201],[-3,-4846]],[[252937,395355],[-925,71]],[[231805,394594],[2,-2436]],[[231807,392158],[-1134,-2]],[[230673,392156],[-105,1611],[-310,822]],[[269448,397668],[-55,-3547],[-336,-2]],[[269057,394119],[-207,86]],[[268850,394205],[-308,108],[-130,1735]],[[268412,396048],[60,4109]],[[270916,394754],[20,1086],[-281,1702],[-269,-1234]],[[270386,396308],[9,758],[-633,464]],[[271363,398820],[-98,-3219],[-349,-847]],[[235536,397836],[-739,279],[-101,-1260]],[[268412,396048],[-1128,225],[-164,1036]],[[267120,397309],[-319,733]],[[261063,395395],[-665,-1817]],[[260398,393578],[-311,-147]],[[260087,393431],[-10,4855]],[[272995,397586],[-322,-2153]],[[272673,395433],[-626,51]],[[272047,395484],[-219,2020]],[[255274,395200],[-23,-931]],[[255251,394269],[-1050,-45]],[[254201,394224],[-106,0]],[[254095,394224],[-12,6047]],[[254095,394224],[-871,-48]],[[253224,394176],[-287,83],[0,1096]],[[257616,396873],[-2,-1632]],[[257614,395241],[-617,-10]],[[256997,395231],[-542,-4]],[[256455,395227],[-395,72]],[[275398,398951],[-49,-2704],[-193,-1561],[-17,-2747]],[[275139,391939],[-179,223]],[[274960,392162],[-177,2250],[-237,820]],[[274546,395232],[-309,1941],[-32,1625]],[[178718,391008],[0,-11659],[-2488,-10],[-9,-22497]],[[176221,356842],[9,-15661]],[[176230,341181],[-3544,18062]],[[172686,359243],[1,19187],[-1464,8789]],[[171223,387219],[-1407,8282],[-1,1512],[923,1373]],[[244850,396880],[-2,-2773],[-420,28],[-8,-2523]],[[244420,391612],[-356,-627],[-262,515]],[[243802,391500],[-19,-7]],[[243783,391493],[37,6621]],[[263352,398399],[22,-5065]],[[263374,393334],[-124,-465]],[[263250,392869],[-377,1491]],[[262873,394360],[-210,810]],[[262663,395170],[-20,2421]],[[288150,393826],[43,-3599]],[[288193,390227],[-151,927],[-491,-152]],[[287551,391002],[-166,1427],[180,785]],[[287565,393214],[-46,2280]],[[218250,399498],[-19,-8071]],[[218231,391427],[-863,14]],[[217368,391441],[-992,-7]],[[216376,391434],[17,8090]],[[216376,391434],[-231,-10]],[[216145,391424],[-1332,-40]],[[214813,391384],[-3,6506]],[[223193,399493],[-14,-8123]],[[223179,391370],[-1512,-4]],[[221667,391366],[-36,-1]],[[221631,391365],[18,8116]],[[220099,399476],[-16,-8096]],[[220083,391380],[-260,16]],[[219823,391396],[-1228,34]],[[218595,391430],[-364,-3]],[[229176,394596],[-104,-1078],[-8,-3776]],[[229064,389742],[-1230,0]],[[227834,389742],[0,6488]],[[224733,394609],[-4,-3237]],[[224729,391372],[-1523,-3]],[[223206,391369],[-27,1]],[[221631,391365],[-1548,15]],[[285466,392329],[-31,-1557]],[[285435,390772],[-7,-2276]],[[285428,388496],[-134,1401],[-606,810],[-230,-838],[-81,1376]],[[284377,391245],[169,2220]],[[284546,393465],[298,1555],[-259,1359]],[[206488,399432],[13,-4858],[-121,-1294],[371,-47],[-10,-2736]],[[206741,390497],[-830,-43],[-247,924]],[[209217,388123],[-2473,-52]],[[206744,388071],[-3,2426]],[[264443,394683],[-524,-1279]],[[263919,393404],[-110,900],[24,2588],[-154,1892]],[[278045,396226],[-294,-514],[-232,-1659],[80,-1120],[-325,-2167]],[[277274,390766],[-416,1407],[-243,-3512],[-463,-1712],[-244,275],[-358,-1592]],[[275550,385632],[171,2537],[-267,3167]],[[275454,391336],[428,949],[115,3749]],[[166657,388375],[-699,3239]],[[165958,391614],[-902,4160]],[[165056,395774],[-269,1239],[-4,1258]],[[275454,391336],[-315,603]],[[274546,395232],[-268,-471],[-788,-2996]],[[273490,391765],[-200,1393],[150,994],[-86,3043]],[[280929,397161],[39,-1198],[-240,-2110]],[[280728,393853],[-452,-1704],[-259,-2493]],[[280017,389656],[-633,2946]],[[263919,393404],[-308,-258]],[[263611,393146],[-237,188]],[[272047,395484],[-122,-4567],[68,-1110]],[[271993,389807],[-308,-1085],[-178,1340]],[[271507,390062],[-213,1013]],[[271294,391075],[-378,3679]],[[171223,387219],[-1840,-10800],[-214,47]],[[169169,376466],[-2031,9653]],[[260087,393431],[-260,-1361]],[[259827,392070],[-266,627],[-811,-80]],[[258750,392617],[-16,4231],[-102,-3]],[[234285,396682],[0,-4534]],[[234285,392148],[-1238,4]],[[233047,392152],[0,2439]],[[165056,395774],[67,-1277],[-535,-3016]],[[164588,391481],[-682,-2964],[-866,-752],[-371,962],[-735,-860]],[[161934,387867],[-256,3852],[-77,-66]],[[243783,391493],[-601,-672],[-237,-1354]],[[242945,389467],[-301,-675],[-459,1580]],[[241412,395564],[-331,-4506],[-621,73]],[[240460,391131],[-613,170]],[[239847,391301],[27,4378]],[[284258,395792],[-146,-763]],[[284112,395029],[62,-330]],[[284174,394699],[109,-599]],[[284283,394100],[166,-999]],[[284449,393101],[22,-1315],[-319,-1468],[-235,541]],[[283917,390859],[-818,3313]],[[283747,394572],[0,0]],[[283737,394153],[0,0]],[[203879,391310],[232,-1351],[-62,-2148],[-284,-1101]],[[203765,386710],[-658,-441]],[[235534,394170],[-3,-2031]],[[235531,392139],[-1246,9]],[[267120,397309],[10,-7398]],[[267130,389911],[-689,1521],[-363,-1183]],[[266078,390249],[-168,18]],[[189012,387896],[-1284,-153]],[[187728,387743],[-2094,147]],[[185634,387890],[9,1163]],[[214813,391384],[1,-1534]],[[214814,389850],[-3143,-50]],[[273490,391765],[-131,-932]],[[273359,390833],[-145,-1040]],[[273214,389793],[-209,605],[-29,1581],[-303,3454]],[[281794,396633],[-352,-2134]],[[281442,394499],[-181,-1569],[-249,-398]],[[281012,392532],[-284,1321]],[[270386,396308],[-126,-2312],[-210,-922],[124,-3421],[-112,-240]],[[270062,389413],[-201,-166]],[[269861,389247],[-208,45],[20,1692],[-328,120],[-31,1671],[-276,127],[19,1217]],[[262663,395170],[-751,43],[12,491]],[[271294,391075],[-509,-437],[-303,-920],[26,-2484]],[[270508,387234],[-446,2179]],[[250450,392212],[-956,23]],[[249494,392235],[-119,4764]],[[268850,394205],[-252,-4690],[-210,-491]],[[268388,389024],[-201,3414],[-398,-532]],[[267789,391906],[-350,-1992],[-309,-3]],[[282766,395947],[-168,-2056],[513,-5136]],[[283111,388755],[-288,-2729]],[[282823,386026],[-280,59],[-558,5268]],[[281985,391353],[-543,3146]],[[249494,392235],[6,-1626],[-311,-14]],[[249189,390595],[-1322,102]],[[247867,390697],[42,2085]],[[247909,392782],[135,616]],[[248044,393398],[7,862],[-447,1331]],[[245702,394611],[-17,-6019]],[[245685,388592],[-299,1157],[-435,348],[-393,1320]],[[244558,391417],[-138,195]],[[284546,393465],[-223,1828]],[[284323,395293],[-65,499]],[[258750,392617],[-93,-1409]],[[258657,391208],[-1043,-28]],[[257614,391180],[0,4061]],[[248044,393398],[-494,1528],[-406,-1104],[-259,-2536],[-553,-983]],[[246332,390303],[-514,-1949],[-133,238]],[[289289,396094],[351,-2735],[270,-53],[-16,-3322],[132,-3185]],[[290026,386799],[-57,0]],[[289969,386799],[-44,0]],[[289925,386799],[-712,13]],[[289213,386812],[-982,152],[-22,1873]],[[288209,388837],[-16,1390]],[[227834,389742],[-1541,10]],[[226293,389752],[-11,4863]],[[278860,392582],[-466,-5288]],[[278394,387294],[-254,-1223]],[[278140,386071],[-449,839],[-166,1724],[-310,767]],[[277215,389401],[59,1365]],[[239847,391301],[-20,-3034]],[[239827,388267],[-622,98],[-4,-541],[-615,115]],[[238586,387939],[4,814]],[[238590,388753],[39,6929]],[[287565,393214],[-230,-1317],[167,-933],[-195,-1782],[-402,1980],[-480,1174],[215,1899],[256,-1835],[-68,1744],[239,1469]],[[283917,390859],[-162,-3064]],[[283755,387795],[-414,1424],[-230,-464]],[[283312,392781],[-46,161]],[[283266,392942],[46,-161]],[[273214,389793],[-307,-1570]],[[272907,388223],[-755,414],[-159,1170]],[[238590,388753],[-1541,208]],[[237049,388961],[-152,25],[-1,4923]],[[284458,394060],[-175,40]],[[284174,394699],[-62,330]],[[284323,395293],[135,-1233]],[[165958,391614],[-111,-1811],[216,-2119],[-268,-3201]],[[165795,384483],[-318,1674],[-351,-1063],[-391,1452]],[[164735,386546],[-147,1346]],[[164588,387892],[0,3589]],[[262873,394360],[-58,-1367],[-578,-417]],[[262237,392576],[-496,-1309]],[[261741,391267],[-4,4143]],[[241700,392158],[-279,-5795]],[[241421,386363],[-363,55]],[[241058,386418],[-603,3090],[5,1623]],[[160323,392090],[-77,-1063],[333,-1451],[-117,-1633],[136,-803],[-47,-1999],[-216,-907]],[[160335,384234],[-267,44],[0,3908],[-681,142],[-457,-373]],[[158930,387955],[-515,6080],[-298,453]],[[261741,391267],[-366,838]],[[261375,392105],[-331,-490],[66,-2302]],[[261110,389313],[-395,370]],[[260715,389683],[-3,1350],[-313,1081],[-1,1464]],[[253224,394176],[-108,-3961],[133,-657]],[[253249,389558],[-1250,127]],[[251999,389685],[9,4096]],[[256455,395227],[-410,-1812],[-93,-2129],[104,-2737]],[[256056,388549],[-615,-232]],[[255441,388317],[-373,-1489],[-409,-715]],[[254659,386113],[-35,905],[308,954],[-17,1004]],[[254915,388976],[435,3214],[-99,2079]],[[257614,391180],[2,-2983]],[[257616,388197],[-674,-392]],[[256942,387805],[55,7426]],[[256942,387805],[-413,172]],[[256529,387977],[-473,572]],[[274960,392162],[-143,-1744],[-396,-2215]],[[274421,388203],[-376,576],[-266,-940]],[[273779,387839],[-420,2994]],[[247909,392782],[-238,-999],[-192,-2324],[176,-1160]],[[247655,388299],[-25,-168]],[[247630,388131],[-211,-2528]],[[247419,385603],[-176,2125],[-512,9],[-410,-651]],[[246321,387086],[11,3217]],[[264517,389239],[-755,-736]],[[263762,388503],[-151,4643]],[[264447,393802],[70,-4563]],[[230673,392156],[-3,-4046]],[[230670,388110],[-1298,15]],[[229372,388125],[-307,-1],[-1,1618]],[[226293,389752],[2,-1622]],[[226295,388130],[-1550,-17]],[[224745,388113],[-16,3259]],[[233047,392152],[-21,-5676]],[[233026,386476],[-1232,4]],[[231794,386480],[13,5678]],[[158930,387955],[-62,-1644],[169,-2032],[-400,3],[-19,-2538],[-216,-435]],[[158402,381309],[-24,5]],[[158378,381314],[-291,-20]],[[158087,381294],[-3,44]],[[158084,381338],[140,477],[-107,2272],[-521,4539],[-126,2199]],[[281985,391353],[-669,-3258],[-157,217]],[[281159,388312],[-296,1764]],[[280863,390076],[149,2456]],[[263250,392869],[-350,-1063]],[[262900,391806],[-413,-1089]],[[262487,390717],[-250,1859]],[[158084,381338],[-237,-852],[-152,858]],[[157695,381344],[-539,908],[-435,1971],[-295,-310]],[[156426,383913],[-354,2862],[-569,2151],[-557,3778]],[[254915,388976],[-726,35]],[[254189,389011],[12,5213]],[[280017,389656],[-138,-1763],[572,-1648]],[[280451,386245],[-493,-2673]],[[279958,383572],[-240,-1326]],[[279718,382246],[-1324,5048]],[[279335,387009],[0,0]],[[254189,389011],[-119,3]],[[254070,389014],[-537,-21]],[[253533,388993],[-284,565]],[[269861,389247],[-95,-2476],[-512,-708]],[[269254,386063],[-253,186]],[[269001,386249],[-194,1565]],[[268807,387814],[-419,1210]],[[237049,388961],[-4,-2241]],[[237045,386720],[-1525,569]],[[235520,387289],[11,4850]],[[284458,394060],[-9,-959]],[[280863,390076],[-319,-2826]],[[280544,387250],[-93,-1005]],[[260715,389683],[-623,-25],[-151,-811]],[[259941,388847],[-106,263],[-8,2960]],[[265356,392696],[-244,-3246]],[[265112,389450],[-475,-738]],[[264637,388712],[-120,527]],[[251999,389685],[-2,-2446]],[[251997,387239],[-1241,-18]],[[250756,387221],[2,543]],[[250758,387764],[15,4342]],[[263762,388503],[-226,-927]],[[263536,387576],[-64,-376]],[[263472,387200],[-541,2720],[-31,1886]],[[283312,392781],[-46,161]],[[259941,388847],[-406,-1354],[-3,-1307]],[[259532,386186],[-107,-8]],[[259425,386178],[-618,89]],[[258807,386267],[-150,4]],[[258657,386271],[0,4937]],[[247867,390697],[-212,-2398]],[[285904,391677],[33,-3346],[377,-2749],[-110,-1238],[-607,2727],[-162,3701]],[[266078,390249],[8,-2072]],[[266086,388177],[-605,-1280],[-198,665]],[[265283,387562],[-171,1888]],[[262487,390717],[-392,-1208]],[[262095,389509],[-261,-210]],[[261834,389299],[-459,2806]],[[268807,387814],[-424,-2456]],[[268383,385358],[-426,367],[-546,2055]],[[267411,387780],[397,3341],[-19,785]],[[250758,387764],[-585,209],[-360,-847],[-369,60],[-248,-998]],[[249196,386188],[-7,4407]],[[277215,389401],[-117,-2971],[-334,-2300],[41,-776]],[[276805,383354],[-350,-1566],[-111,-2182]],[[276344,379606],[-848,-338],[-274,1261],[9,2076]],[[275231,382605],[22,2224],[297,803]],[[242945,389467],[-266,-2385],[-345,60],[127,-1459],[-203,-1038]],[[242258,384645],[-596,108],[14,1563],[-255,47]],[[231794,386480],[-23,-4900]],[[231771,381580],[-1110,51]],[[230661,381631],[9,6479]],[[234285,392148],[-26,-6490]],[[234259,385658],[-1233,6]],[[233026,385664],[0,812]],[[235520,387289],[0,-1654]],[[235520,385635],[-1261,23]],[[275231,382605],[-213,772]],[[275018,383377],[-482,1699],[-115,3127]],[[161934,387867],[6,-3922]],[[161940,383945],[-1040,-1302],[-210,590],[-282,-2812]],[[160408,380421],[-311,-431],[76,1800]],[[160173,381790],[162,2444]],[[261834,389299],[-406,-1730]],[[261428,387569],[-332,583]],[[261096,388152],[14,1161]],[[263472,387200],[-446,-2245]],[[263026,384955],[-363,79]],[[262663,385034],[-258,1507],[-110,2136],[-200,832]],[[267411,387780],[-197,-1448],[23,-1522],[-313,-464]],[[266924,384346],[-311,1158]],[[266613,385504],[-354,897],[-173,1776]],[[244558,391417],[4,-9114]],[[244562,382303],[-467,23],[2,-1087]],[[244097,381239],[-267,17]],[[243830,381256],[-40,2513]],[[243790,383769],[12,7731]],[[169169,376466],[1659,-8029]],[[170828,368437],[-2625,-35]],[[168203,368402],[-689,2284]],[[167514,370686],[-267,2691],[-421,166]],[[166826,373543],[187,2774],[-291,1077],[-121,2597],[-312,216],[-475,1906],[-19,2370]],[[246321,387086],[-122,-4888]],[[246199,382198],[-880,-1]],[[245319,382197],[-757,106]],[[243790,383769],[-1535,69]],[[242255,383838],[3,807]],[[164588,387892],[-720,-833],[-260,132],[-515,-1390],[-61,-1061],[-1009,-2142]],[[162023,382598],[-83,1347]],[[286908,384389],[-189,474],[-264,2363],[218,1227],[-54,1256],[301,244],[335,-1095],[296,2144]],[[288209,388837],[-340,-1484],[-14,-1069]],[[287855,386284],[-365,-3226],[-582,1331]],[[218595,391430],[0,-8114]],[[218595,383316],[-1157,7]],[[217438,383323],[-62,-1]],[[217376,383322],[-8,8119]],[[219823,391396],[8,-8115]],[[219831,383281],[-1236,35]],[[216145,391424],[-1,-8127]],[[216144,383297],[-1330,-14]],[[214814,383283],[1,118]],[[214815,383401],[-1,6449]],[[217376,383322],[-1162,-24]],[[216214,383298],[-70,-1]],[[282823,386026],[45,-780]],[[282868,385246],[-236,-135]],[[282632,385111],[-191,603],[-899,-1519]],[[281542,384195],[7,1474],[-390,2643]],[[221667,391366],[1,-6464]],[[221668,384902],[2,-1623]],[[221670,383279],[-1791,1]],[[219879,383280],[-48,1]],[[241058,386418],[-180,-1533],[-17,-2354]],[[240861,382531],[-192,-605],[-545,142],[-327,1182]],[[239797,383250],[30,5017]],[[224745,388113],[2,-4860]],[[224747,383253],[-1206,6]],[[223541,383259],[-334,2],[0,1622]],[[223207,384883],[-1,6486]],[[206744,388071],[3,-4865],[-303,-5]],[[206444,383201],[-2083,131]],[[204361,383332],[-596,3378]],[[223207,384883],[-1539,19]],[[285428,388496],[2,-844]],[[285430,387652],[-211,220],[-263,-2217]],[[284956,385655],[81,-2289],[-234,434],[-329,2868],[-459,-1568],[-187,2280],[549,3865]],[[258657,386271],[-1,-537],[-1038,13]],[[257618,385747],[-2,2450]],[[270898,384461],[-214,-1052],[-154,1960]],[[270530,385369],[-22,1865]],[[271507,390062],[-150,-656],[68,-2319],[-484,-1260],[-43,-1366]],[[181367,389064],[0,-7900]],[[181367,381164],[-7,-10123]],[[181360,371041],[5,-11252]],[[181365,359789],[1,-2928]],[[181366,356861],[-1984,13],[0,179],[-2726,-7],[-435,-204]],[[199240,384018],[-2,564],[-1384,-11],[128,-1422],[415,-674],[-79,-1241]],[[198318,381234],[-2999,13]],[[195319,381247],[-49,6459]],[[273779,387839],[177,-533],[-261,-1184],[-892,-2813]],[[272803,383309],[-146,3878],[250,1036]],[[249196,386188],[3,-3707]],[[249199,382481],[-545,27]],[[248654,382508],[-40,1621],[-342,19],[-642,3983]],[[281542,384195],[-437,-1435],[-99,693]],[[281006,383453],[-396,1782],[-66,2015]],[[272803,383309],[-1,-6]],[[272802,383303],[-272,-1508],[-143,-3970]],[[272387,377825],[-212,339]],[[272175,378164],[-165,2328],[-356,2011],[-528,-202]],[[271126,382301],[46,1977],[-274,183]],[[214815,383401],[-1944,-33]],[[212871,383368],[-1832,-28]],[[211039,383340],[-284,-8]],[[210755,383332],[-8,4680]],[[227834,389742],[0,-8111]],[[227834,381631],[-920,3]],[[226914,381634],[-613,-2]],[[226301,381632],[-6,6498]],[[229372,388125],[-59,-8133]],[[229313,379992],[-869,39]],[[228444,380031],[-1,1618],[-609,-18]],[[265283,387562],[-139,-988]],[[265144,386574],[-341,378]],[[264803,386952],[-166,1760]],[[253533,388993],[-9,-5827]],[[253524,383166],[-611,-14]],[[252913,383152],[-925,24]],[[251988,383176],[9,4063]],[[261096,388152],[-572,-2670]],[[260524,385482],[-286,-2089],[-141,377]],[[260097,383770],[-46,2157],[-519,259]],[[270530,385369],[-363,-644],[-243,-2058]],[[269924,382667],[-670,3396]],[[262663,385034],[-353,-388]],[[262310,384646],[-796,417]],[[261514,385063],[-86,2506]],[[278140,386071],[-341,-3643],[-207,-671]],[[277592,381757],[-787,1597]],[[283755,387795],[-68,-3119]],[[283687,384676],[-6,-1714]],[[283681,382962],[-121,26]],[[283560,382988],[-214,707]],[[283346,383695],[-232,459]],[[283114,384154],[-246,1092]],[[264803,386952],[-255,-1635]],[[264548,385317],[-418,-1608],[-274,-40]],[[263856,383669],[-44,1680],[-276,2227]],[[185634,387890],[509,-3310],[-59,-2002],[-242,-1389]],[[185842,381189],[-97,-48]],[[185745,381141],[-4378,23]],[[254070,389014],[36,-2006],[-137,-3776]],[[253969,383232],[-445,-66]],[[254659,386113],[-464,-2724],[-218,-213]],[[253977,383176],[-8,56]],[[238586,387939],[-30,-5630]],[[238556,382309],[-1467,73]],[[237089,382382],[-71,9],[27,4329]],[[289213,386812],[95,-1817],[-160,-1191],[-692,-216]],[[288456,383588],[-506,-230]],[[287950,383358],[-283,-697],[-32,1164],[220,2459]],[[275018,383377],[-768,-3504],[-473,452]],[[273777,380325],[-279,2236],[-256,-553],[-440,1295]],[[256529,387977],[-2,-5249]],[[256527,382728],[-679,251]],[[255848,382979],[3,2497],[-256,-92],[-154,2933]],[[158378,381314],[146,-1463],[-437,1443]],[[160173,381790],[-408,-2224],[-354,-188],[-351,1518],[-215,-1697],[-283,501],[-160,1609]],[[239797,383250],[35,-3689]],[[239832,379561],[-1222,173]],[[238610,379734],[-54,2575]],[[255848,382979],[-1,-825],[-418,-676]],[[255429,381478],[-616,57]],[[254813,381535],[-309,1119],[-517,33]],[[253987,382687],[-10,489]],[[257618,385747],[6,-2451]],[[257624,383296],[-312,-1079]],[[257312,382217],[-630,-29]],[[256682,382188],[-155,540]],[[266613,385504],[-146,-2035],[-362,-1580]],[[266105,381889],[-246,1825],[-347,209]],[[265512,383923],[-368,2651]],[[261514,385063],[-513,-1353]],[[261001,383710],[-477,1772]],[[230661,381631],[-3,-1635],[-459,10]],[[230199,380006],[-886,-14]],[[209217,388123],[-12,-6998]],[[209205,381125],[-8,-7666]],[[209197,373459],[-808,1541]],[[208389,375000],[-823,1546],[-1023,-358],[-101,636]],[[206442,376824],[2,6377]],[[210755,383332],[-21,-1722],[-306,-20],[0,-1082],[-596,-8],[-627,625]],[[226301,381632],[-1535,-18]],[[224766,381614],[-19,1639]],[[248654,382508],[-383,35],[1,-1620],[-477,-883]],[[247795,380040],[-127,737]],[[247668,380777],[-303,1892],[54,2934]],[[250756,387221],[-8,-4860]],[[250748,382361],[-1241,119]],[[249507,382480],[-308,1]],[[286032,384373],[445,-3369],[-10,-1655],[-344,2010],[-710,2346],[-112,-1068],[-345,3018]],[[285430,387652],[602,-3279]],[[164735,386546],[-435,-1185],[-950,-7856],[-381,-2238]],[[162969,375267],[-759,4580]],[[162210,379847],[-187,2751]],[[187728,387743],[-228,-1435],[16,-5094]],[[187516,381214],[-1674,-25]],[[192580,387706],[28,-2493],[350,-3273],[-106,-714]],[[192852,381226],[-4142,-34],[-1194,22]],[[247668,380777],[-455,-1591]],[[247213,379186],[-466,-723],[-158,1359]],[[246589,379822],[-390,2376]],[[268978,383008],[-530,-70]],[[268448,382938],[-65,2420]],[[269001,386249],[-23,-3241]],[[268448,382938],[-363,-1281]],[[268085,381657],[-378,306],[-289,1389],[-223,-1372]],[[267195,381980],[-271,2366]],[[195319,381247],[2,-5061]],[[195321,376186],[-5,-7382]],[[195316,368804],[-5,-9040]],[[195311,359764],[-2662,-21]],[[192649,359743],[-2090,98]],[[190559,359841],[-1844,-32]],[[188715,359809],[653,1883],[604,385],[346,3276],[287,901],[-33,1955],[278,1645]],[[190850,369854],[446,2473],[227,3836],[527,219],[571,4056],[231,788]],[[263856,383669],[113,-1403]],[[263969,382266],[-621,-1697]],[[263348,380569],[-281,1464]],[[263067,382033],[-41,2922]],[[281006,383453],[-231,-1615]],[[280775,381838],[-817,1734]],[[279718,382246],[-89,-2345],[-162,-618]],[[279467,379283],[-168,-1840],[-296,-1250],[-422,176]],[[278581,376369],[-906,3632]],[[277675,380001],[127,1436],[-210,320]],[[278910,381985],[0,0]],[[279286,380244],[0,0]],[[251988,383176],[-7,-2447]],[[251981,380729],[-1184,-9]],[[250797,380720],[-49,1641]],[[237089,382382],[-23,-3302]],[[237066,379080],[-1549,436]],[[235517,379516],[3,6119]],[[172686,359243],[-1858,9194]],[[265512,383923],[-362,-1945]],[[265150,381978],[-326,1244],[-276,2095]],[[204361,383332],[336,-2213],[254,-3271],[312,-1387]],[[205263,376461],[44,-2691]],[[205307,373770],[-1620,-57]],[[203687,373713],[-1526,-10],[-2,1613],[-297,15]],[[201862,375331],[0,678],[-568,1791],[-287,-220]],[[201007,377580],[-1,3556]],[[289490,378912],[-53,-34]],[[289437,378878],[53,34]],[[290026,386799],[-57,0]],[[289865,385833],[-126,-2836],[-305,-809],[-323,-3508]],[[289111,378680],[-677,-383]],[[288434,378297],[-6,31]],[[288428,378328],[-108,835],[337,901],[-201,3524]],[[289925,386799],[-60,-966]],[[166826,373543],[-111,722]],[[166715,374265],[-627,2326],[-334,-1722],[-421,-936],[-390,89],[-379,1183],[-853,-3609]],[[163711,371596],[-742,3671]],[[233026,385664],[-30,-6554]],[[232996,379110],[-1226,36]],[[231770,379146],[1,2434]],[[242255,383838],[29,-5136]],[[242284,378702],[-616,90]],[[241668,378792],[-305,22],[-346,3550],[-156,167]],[[258807,386267],[-62,-3639],[-147,-850]],[[258598,381778],[-366,-1124]],[[258232,380654],[2,1594],[-308,13],[2,1095],[-304,-60]],[[259425,386178],[1,-1624],[368,-2836]],[[259794,381718],[-134,-3193]],[[259660,378525],[-140,-132]],[[259520,378393],[-502,215],[-245,853],[-175,2317]],[[269924,382667],[-59,-1572],[261,-1815],[-318,-1929]],[[269808,377351],[-304,-1660]],[[269504,375691],[-230,1692]],[[269274,377383],[-144,2308],[-237,1273],[85,2044]],[[260097,383770],[-303,-2052]],[[284512,383385],[-92,-1945]],[[284420,381440],[-8,-27]],[[284412,381413],[-144,-224]],[[284268,381189],[-437,1843],[-150,-70]],[[283687,384676],[250,-96],[535,1273],[40,-2468]],[[267195,381980],[-57,-1465]],[[267138,380515],[-472,-1482]],[[266666,379033],[-181,318]],[[266485,379351],[-380,2538]],[[282632,385111],[-701,-4527]],[[281931,380584],[-408,649],[-297,-356]],[[281226,380877],[-451,961]],[[234259,385658],[-34,-6558]],[[234225,379100],[-1229,10]],[[235517,379516],[0,-428]],[[235517,379088],[-1292,12]],[[261001,383710],[173,-405],[-53,-2162]],[[261121,381143],[-14,-545]],[[261107,380598],[-354,-821],[-435,244],[-629,-1650]],[[259689,378371],[-29,154]],[[283114,384154],[232,-459]],[[283560,382988],[-758,-4755]],[[282802,378233],[-126,314]],[[282676,378547],[-383,1648],[-362,389]],[[271126,382301],[-263,-1062],[-13,-2367]],[[270850,378872],[-720,-942]],[[270130,377930],[-322,-579]],[[263067,382033],[-389,-1466]],[[262678,380567],[-442,233]],[[262236,380800],[74,3846]],[[265150,381978],[-286,-1441]],[[264864,380537],[-573,-891]],[[264291,379646],[-263,849],[-59,1771]],[[262236,380800],[-219,-1713]],[[262017,379087],[-896,2056]],[[223541,383259],[-1,-4853],[-304,-4]],[[223236,378402],[-914,10],[-1,1609],[-610,4]],[[221711,380025],[-41,3254]],[[199425,381138],[158,-1618],[-159,-1773]],[[199424,377747],[-472,-1109]],[[198952,376638],[-30,887],[-420,1384],[23,1648],[-207,677]],[[157695,381344],[163,-971],[-42,-3300],[179,-855],[-251,-1183],[-370,1730],[-114,-335],[-478,2413],[-374,-283],[164,2872],[317,-1457],[-463,3938]],[[266485,379351],[-223,-717],[-503,-259]],[[265759,378375],[-341,2566],[-268,1037]],[[162210,379847],[3,-6325],[-189,423],[-596,-1236],[-739,-3959]],[[160689,368750],[-239,1114],[0,5132]],[[160450,374996],[-70,4168]],[[160380,379164],[28,1257]],[[243830,381256],[-6,-1909],[-732,4],[-351,-755]],[[242741,378596],[-457,106]],[[287272,377541],[-21,-6]],[[287251,377535],[21,6]],[[287356,378030],[36,-498]],[[287392,377532],[-31,2]],[[287361,377534],[-41,379]],[[287320,377913],[36,117]],[[287320,377913],[-5,-375]],[[287315,377538],[-19,-1]],[[287296,377537],[24,376]],[[287781,379692],[-1,1870],[-264,-794],[434,2590]],[[288428,378328],[-760,-1368],[113,2732]],[[281226,380877],[-275,-2360]],[[280951,378517],[-515,-3904]],[[280436,374613],[-425,-1183]],[[280011,373430],[-544,5853]],[[280484,379686],[0,0]],[[285766,378696],[-155,-919]],[[285611,377777],[-363,656],[-314,2280],[-163,-800]],[[284771,379913],[-351,1527]],[[284512,383385],[528,-1942],[635,-277],[253,-1943],[-162,-527]],[[241668,378792],[-8,-3016]],[[241660,375776],[-363,-1063],[-225,1684],[-655,60]],[[240417,376457],[-605,128]],[[239812,376585],[20,2976]],[[269274,377383],[-231,160],[-89,-1393]],[[268954,376150],[-910,2229],[-138,-652]],[[267906,377727],[-93,803]],[[267813,378530],[371,1947],[-99,1180]],[[277675,380001],[-469,-3994]],[[277206,376007],[-657,396],[-135,1144],[-337,-43]],[[276077,377504],[267,2102]],[[214814,383283],[8,-9753]],[[214822,373530],[1,-1754]],[[214823,371776],[-1967,-12]],[[212856,371764],[15,11604]],[[276077,377504],[-296,-1431],[-373,-3413]],[[275408,372660],[-430,-145],[-592,890]],[[274386,373405],[-399,2555]],[[273987,375960],[102,2168],[-312,2197]],[[267813,378530],[-479,65],[-196,1920]],[[206442,376824],[-331,1927],[-322,-2224],[-84,711],[-442,-777]],[[212856,371764],[-914,-4]],[[211942,371760],[-915,4]],[[211027,371764],[12,11576]],[[211027,371764],[-1822,7],[-8,1688]],[[258232,380654],[-83,-1403]],[[258149,379251],[-55,-2224],[-404,-1554]],[[257690,375473],[32,1004],[-294,274],[-178,1615]],[[257250,378366],[113,-4],[-51,3855]],[[273987,375960],[-386,-927]],[[273601,375033],[-357,1056],[-619,250],[-238,1486]],[[217438,383323],[-2,-8108],[40,-1726]],[[217476,373489],[-1219,0]],[[216257,373489],[-44,1699],[1,8110]],[[219879,383280],[1,-4863]],[[219880,378417],[-1219,28],[33,-4957]],[[218694,373488],[-1218,1]],[[216257,373489],[-1435,41]],[[253987,382687],[206,-1256],[-505,-5063]],[[253688,376368],[-787,325]],[[252901,376693],[12,6459]],[[224766,381614],[1,-6484]],[[224767,375130],[-1507,16]],[[223260,375146],[-24,3256]],[[221711,380025],[-1,-3246]],[[221710,376779],[-1831,18]],[[219879,376797],[1,1620]],[[252901,376693],[0,-14]],[[252901,376679],[-925,-16]],[[251976,376663],[5,4066]],[[284268,381189],[-150,-1310],[278,-2137]],[[284396,377742],[-309,-256],[-1,-1105]],[[284086,376381],[-456,-1904]],[[283630,374477],[-165,-177],[-222,1929],[-441,2004]],[[256682,382188],[-153,-1592],[-544,-3576],[-2,-876]],[[255983,376144],[-94,369]],[[255889,376513],[-415,787]],[[255474,377300],[-45,4178]],[[254813,381535],[-35,-5040]],[[254778,376495],[-630,72]],[[254148,376567],[55,-1760],[-337,-147]],[[253866,374660],[-178,1708]],[[272175,378164],[-318,-1099],[158,-2552]],[[272015,374513],[-260,-47]],[[271755,374466],[-295,397],[-169,2098],[-573,1279],[132,632]],[[249507,382480],[-6,-4914]],[[249501,377566],[-221,-2833]],[[249280,374733],[-473,1904],[-262,-566]],[[248545,376071],[-165,1642],[-585,2327]],[[238610,379734],[-22,-2902],[-171,-1635]],[[238417,375197],[-154,26]],[[238263,375223],[-509,95],[7,1075],[-716,162]],[[237045,376555],[21,2525]],[[250797,380720],[-133,-3247]],[[250664,377473],[-1163,93]],[[245319,382197],[-11,-8639]],[[245308,373558],[-149,-795]],[[245159,372763],[-438,51],[5,1622],[-613,34]],[[244113,374470],[-16,6769]],[[264291,379646],[-143,-3261]],[[264148,376385],[-273,-833]],[[263875,375552],[-122,1730],[-504,1186]],[[263249,378468],[99,2101]],[[246589,379822],[-14,-6361]],[[246575,373461],[-1267,97]],[[257250,378366],[-461,-1267]],[[256789,377099],[-280,-2533],[-526,1578]],[[259520,378393],[-23,-3366],[-403,-372]],[[259094,374655],[-945,4596]],[[263249,378468],[-138,-2639]],[[263111,375829],[-141,-279],[-100,2291]],[[262870,377841],[-192,2726]],[[265759,378375],[-26,-1496]],[[265733,376879],[-550,230]],[[265183,377109],[-319,3428]],[[228444,380031],[1,-3258]],[[228445,376773],[-1531,-4]],[[226914,376769],[0,4865]],[[231770,379146],[-5,-5694]],[[231765,373452],[0,-2431]],[[231765,371021],[-1573,61]],[[230192,371082],[7,8924]],[[226914,376769],[9,-3303],[-304,-23]],[[226619,373443],[-1830,-22]],[[224789,373421],[-22,1709]],[[255474,377300],[-169,-642],[-244,1256],[-44,-2642],[-239,1223]],[[244113,374470],[-771,42],[-10,-3582]],[[243332,370930],[-613,69]],[[242719,370999],[22,7597]],[[190850,369854],[-4778,-85],[-897,125]],[[185175,369894],[-17,4889],[309,-24],[-28,1599],[335,1],[-29,4782]],[[285474,374122],[-189,-777]],[[285285,373345],[-143,1233],[-392,-213],[-211,1145],[-143,2232]],[[284412,381413],[24,-1012],[357,-714],[24,-1757],[347,-1480],[310,-2328]],[[198952,376638],[-341,-2419]],[[198611,374219],[-359,1512],[-614,-665],[-130,1368],[-1561,19],[-626,-267]],[[282676,378547],[-305,-5181]],[[282371,373366],[-288,724],[-132,1442],[-320,1092]],[[281631,376624],[-680,1893]],[[185175,369894],[-607,4],[0,-813]],[[184568,369085],[-378,-469],[-604,143],[1,868],[-616,2],[-2,1663],[-315,-252],[-1294,1]],[[262017,379087],[-182,-1209]],[[261835,377878],[-646,-598],[-256,977]],[[260933,378257],[174,2341]],[[201007,377580],[-383,-320],[-19,-4903],[45,-4702]],[[200650,367655],[-984,-5]],[[199666,367650],[-1,4037]],[[199665,371687],[0,2392],[-241,3668]],[[262870,377841],[-381,-296],[-271,-1166]],[[262218,376379],[-341,113]],[[261877,376492],[-42,1386]],[[251976,376663],[-1,-809]],[[251975,375854],[-1238,-25]],[[250737,375829],[-73,1644]],[[285611,377777],[352,-2380]],[[285963,375397],[-300,-591]],[[285663,374806],[-240,292],[-546,3121],[-106,1694]],[[248545,376071],[-481,-3792]],[[248064,372279],[-249,-32],[-722,3897],[380,1914],[-260,1128]],[[260933,378257],[-419,-2943],[-266,-430]],[[260248,374884],[-559,3487]],[[267906,377727],[-44,-1950]],[[267862,375777],[-303,91],[-437,-1812],[23,-1008]],[[267145,373048],[-650,2775]],[[266495,375823],[171,3210]],[[265183,377109],[-100,-1733]],[[265083,375376],[-218,283]],[[264865,375659],[-717,726]],[[160450,374996],[-1124,-1844],[-235,1488],[-259,115],[-483,1735]],[[158349,376490],[-209,1238],[349,1656],[315,-572],[373,668],[783,-708],[357,1506],[63,-1114]],[[230192,371082],[-1,-2432]],[[230191,368650],[-1748,-16]],[[228443,368634],[2,8139]],[[223260,375146],[0,-1719]],[[223260,373427],[-1521,35]],[[221739,373462],[-29,3317]],[[278540,374733],[-257,-157],[-226,-2495],[-255,-813]],[[277802,371268],[-172,-1566]],[[277630,369702],[-515,2397],[26,1888]],[[277141,373987],[65,2020]],[[278581,376369],[-41,-1636]],[[277790,374553],[0,0]],[[278042,373830],[0,0]],[[248064,372279],[-101,-553]],[[247963,371726],[-1081,38]],[[246882,371764],[-315,-16],[8,1713]],[[163711,371596],[-1656,-4356],[43,-1065],[-726,-3845]],[[161372,362330],[-155,871],[-328,-611],[-162,2473],[145,499],[-185,3196]],[[160687,368758],[2,-8]],[[239812,376585],[-307,30],[-14,-1889]],[[239491,374726],[-1074,471]],[[237045,376555],[-22,-4864]],[[237023,371691],[-1516,258]],[[235507,371949],[0,363]],[[235507,372312],[10,6776]],[[266495,375823],[-378,-675]],[[266117,375148],[-384,1731]],[[280011,373430],[-196,-1764],[-242,63],[-67,-1661]],[[279506,370068],[-122,-195]],[[279384,369873],[-552,4225],[-292,635]],[[259094,374655],[-345,-3823]],[[258749,370832],[-373,-503],[-265,1039],[-246,-1076]],[[257865,370292],[-128,1809]],[[257737,372101],[-47,3372]],[[232996,379110],[-18,-5687]],[[232978,373423],[-1213,29]],[[234225,379100],[-28,-5680]],[[234197,373420],[-1219,3]],[[235507,372312],[-1310,27]],[[234197,372339],[0,1081]],[[287392,377532],[-31,2]],[[287315,377538],[-19,-1]],[[287272,377541],[-21,-6]],[[288876,376511],[119,-271],[-517,-3407],[-55,-2435],[-470,-1281]],[[287953,369117],[-126,1004]],[[287827,370121],[-283,134],[408,3843]],[[287952,374098],[291,1243],[191,2956]],[[289111,378680],[-235,-2169]],[[289490,378912],[-53,-34]],[[271755,374466],[-438,-677],[176,-948],[-282,-761]],[[271211,372080],[-347,406],[-184,-777],[-249,1135],[-83,2839],[-218,2247]],[[286401,372837],[-192,2274],[-246,286]],[[285766,378696],[289,-8],[647,-2450],[-301,-3401]],[[242719,370999],[-614,37]],[[242105,371036],[2,817],[-459,1220],[12,2703]],[[208389,375000],[-289,-1427],[-261,-3093],[-562,-3167],[-508,-171],[-617,-1904]],[[206152,365238],[46,2010],[-135,4024],[-310,765],[-525,-1497]],[[205228,370540],[79,3230]],[[283630,374477],[147,-1396],[514,-1037],[-44,-592]],[[284247,371452],[-292,-1688]],[[283955,369764],[-489,1286],[-105,1395],[-525,504]],[[282836,372949],[-465,417]],[[281362,373717],[-225,-1081]],[[281137,372636],[-621,1278],[-80,699]],[[281631,376624],[-269,-2907]],[[260248,374884],[159,-1472]],[[260407,373412],[-544,-3501],[-48,-1933]],[[259815,367978],[-430,176]],[[259385,368154],[-185,2177],[-451,501]],[[263875,375552],[-250,-1450]],[[263625,374102],[-126,-754],[-407,1614]],[[263092,374962],[19,867]],[[268954,376150],[-162,-516],[84,-2448]],[[268876,373186],[-340,667],[-495,-734]],[[268041,373119],[-179,2658]],[[219879,376797],[30,-8169]],[[219909,368628],[-1216,-7]],[[218693,368621],[1,4867]],[[257737,372101],[-515,1415]],[[257222,373516],[-85,1915],[-348,1668]],[[273601,375033],[187,-2460],[-193,530],[-410,-2364]],[[273185,370739],[-292,-249],[-64,-1204]],[[272829,369286],[-281,1662],[-394,3474],[-139,91]],[[261877,376492],[-288,-708],[-405,-2399]],[[261184,373385],[-333,-3287]],[[260851,370098],[-285,-39],[141,1604],[-300,1749]],[[271211,372080],[-148,-2078]],[[271063,370002],[-199,-676]],[[270864,369326],[-114,472]],[[270750,369798],[-437,240],[-582,3546]],[[269731,373584],[-227,2107]],[[255889,376513],[81,-2236],[-378,-1770]],[[255592,372507],[-241,-671]],[[255351,371836],[-666,-173]],[[254685,371663],[-57,1803],[-480,3101]],[[285285,373345],[270,-2335]],[[285555,371010],[-138,-2862]],[[285417,368148],[-256,2601]],[[285161,370749],[-819,3092],[-256,2540]],[[199665,371687],[-1364,1]],[[198301,371688],[8,1041],[302,1490]],[[263092,374962],[-79,-1906]],[[263013,373056],[-780,-638]],[[262233,372418],[68,3271],[-83,690]],[[201862,375331],[-47,-8024]],[[201815,367307],[-1165,-220],[0,568]],[[269731,373584],[-340,-1357],[-300,302]],[[269091,372529],[-215,657]],[[277141,373987],[-397,706],[-568,-2858]],[[276176,371835],[-345,-947],[-213,580]],[[275618,371468],[-210,1192]],[[276253,374852],[0,0]],[[250737,375829],[-7,-4869]],[[250730,370960],[-827,-8],[-198,-519]],[[249705,370433],[27,2110],[-434,1361],[-18,829]],[[266117,375148],[-215,-2029]],[[265902,373119],[-39,-3]],[[265863,373116],[-510,789],[-270,1471]],[[257222,373516],[17,-1185],[-615,-2106]],[[256624,370225],[-1032,2282]],[[264865,375659],[-28,-5332]],[[264837,370327],[-303,-812]],[[264534,369515],[-414,300]],[[264120,369815],[-495,4287]],[[253866,374660],[-364,-2527],[71,-1661]],[[253573,370472],[-674,471]],[[252899,370943],[2,5736]],[[262233,372418],[-14,-886]],[[262219,371532],[-865,379],[-170,1474]],[[221739,373462],[9,-4974]],[[221748,368488],[-1535,133]],[[220213,368621],[-304,7]],[[228443,368634],[-1823,-25]],[[226620,368609],[-1,4834]],[[252899,370943],[-103,7]],[[252796,370950],[-826,-12]],[[251970,370938],[5,4916]],[[285161,370749],[-468,-116]],[[284693,370633],[-446,819]],[[240417,376457],[5,-7664]],[[240422,368793],[-607,46],[-5,-1332]],[[239810,367507],[-304,42]],[[239506,367549],[-15,7177]],[[160687,368758],[-1094,45],[-338,-405]],[[159255,368398],[-342,754],[-149,3107],[-463,2405],[48,1826]],[[282836,372949],[-67,-2693]],[[282769,370256],[-815,2165],[-30,-1006],[-320,604]],[[281604,372019],[-242,1698]],[[249705,370433],[0,-111]],[[249705,370322],[-946,616]],[[248759,370938],[-796,-35]],[[247963,370903],[0,823]],[[238263,375223],[35,-4780]],[[238298,370443],[-1280,165]],[[237018,370608],[5,1083]],[[166715,374265],[-765,-4052],[-188,-2676],[-313,4],[-790,-4320]],[[164659,363221],[-270,1013],[-380,3367],[-298,3995]],[[254685,371663],[-553,-2946]],[[254132,368717],[-234,1247],[-124,-777]],[[253774,369187],[-201,1285]],[[242105,371036],[-8,-2450]],[[242097,368586],[-1210,160]],[[240887,368746],[-465,47]],[[198301,371688],[-2633,-143],[-352,-2741]],[[268041,373119],[135,-3677],[-93,-602]],[[268083,368840],[-64,308]],[[268019,369148],[-398,2375],[-439,725]],[[267182,372248],[-37,800]],[[273842,367755],[-4,20]],[[273838,367775],[-653,2964]],[[274386,373405],[-544,-5650]],[[251970,370938],[-927,-50]],[[251043,370888],[-313,72]],[[267182,372248],[-389,563],[-373,-1145]],[[266420,371666],[-518,1453]],[[265863,373116],[-284,-991],[-227,-2237]],[[265352,369888],[-515,439]],[[286401,371346],[-510,730],[-228,2730]],[[286401,372837],[0,-1491]],[[203687,373713],[-2,-6471]],[[203685,367242],[-1780,53]],[[201905,367295],[-90,12]],[[158120,372966],[-303,-2]],[[157817,372964],[-33,1343],[287,552],[49,-1893]],[[239506,367549],[-1222,189]],[[238284,367738],[14,2705]],[[264120,369815],[-276,-991]],[[263844,368824],[-589,2769]],[[263255,371593],[-242,1463]],[[224789,373421],[0,-4871]],[[224789,368550],[-1527,-11]],[[223262,368539],[-2,4888]],[[279384,369873],[-416,-2088]],[[278968,367785],[-186,-655]],[[278782,367130],[-282,1313]],[[278500,368443],[-442,1075],[-256,1750]],[[211942,371760],[-29,-11974]],[[211913,359786],[-2568,-75]],[[209345,359711],[-3196,-18]],[[206149,359693],[3,5545]],[[277630,369702],[-234,-1502],[-213,614],[-430,-1508],[-95,-1769]],[[276658,365537],[-630,2109]],[[276028,367646],[291,2274],[-143,1915]],[[245159,372763],[-5,-2033]],[[245154,370730],[-438,88],[-5,-1633],[288,-71],[-3,-1602]],[[244996,367512],[-1211,139]],[[243785,367651],[-302,26],[0,3251],[-151,2]],[[272829,369286],[-248,-1600]],[[272581,367686],[-815,1322],[-628,339],[-75,655]],[[281137,372636],[-25,-1023],[-602,-5508]],[[280510,366105],[-361,1085]],[[280149,367190],[-643,2878]],[[167514,370686],[-806,-4323],[-52,-2727],[-160,-1066],[-478,-109],[49,-889],[-436,-1628],[-318,-2892],[-1553,-1283],[-242,1461],[-239,3370]],[[163279,360600],[183,976],[522,1046],[675,599]],[[285850,370354],[-295,656]],[[285474,374122],[422,-2949],[651,-1010],[-346,-836],[-351,1027]],[[269091,372529],[-167,-3366],[109,-686],[-352,-3384]],[[268681,365093],[-160,2648],[-438,1099]],[[205228,370540],[-718,-4116]],[[204510,366424],[-823,2],[-2,816]],[[281604,372019],[-166,-3773]],[[281438,368246],[-287,-1612]],[[281151,366634],[-415,-1159],[-226,630]],[[270750,369798],[-954,-4451]],[[269796,365347],[-678,-1793]],[[269118,363554],[-32,-122]],[[269086,363432],[-466,1404]],[[268620,364836],[61,257]],[[246882,371764],[-41,-6070]],[[246841,365694],[-3,-838],[-515,-29]],[[246323,364827],[-104,1910],[11,4270],[-1076,-277]],[[216257,373489],[3,-6477]],[[216260,367012],[-85,2]],[[216175,367014],[-1352,13]],[[214823,367027],[0,4749]],[[257865,370292],[-200,-146],[146,-3006]],[[257811,367140],[-547,-1924],[-253,-1483]],[[257011,363733],[-559,3793]],[[256452,367526],[172,2699]],[[217476,373489],[0,-6490]],[[217476,366999],[-1216,13]],[[218693,368621],[0,-1623]],[[218693,366998],[-1157,2]],[[217536,367000],[-60,-1]],[[223262,368539],[4,-1604]],[[223266,366935],[-1482,-59]],[[221784,366876],[-36,1612]],[[226620,368609],[1,-1636]],[[226621,366973],[-1512,-42]],[[225109,366931],[-321,1],[1,1618]],[[232978,373423],[0,-6493]],[[232978,366930],[-1215,50]],[[231763,366980],[2,4041]],[[234197,372339],[-1,-5412]],[[234196,366927],[-1206,3]],[[232990,366930],[-12,0]],[[260851,370098],[153,-1651]],[[261004,368447],[-327,81]],[[260677,368528],[-206,-891]],[[260471,367637],[-656,341]],[[262219,371532],[-27,-1601]],[[262192,369931],[-95,-2448]],[[262097,367483],[-273,950],[-278,-893],[-215,1026],[-327,-119]],[[275618,371468],[-300,-1181],[80,-1043],[-490,-1589]],[[274908,367655],[-100,1093],[-720,-2035],[-246,1042]],[[266420,371666],[-159,-2460]],[[266261,369206],[-144,586],[-553,-948],[-155,569]],[[265409,369413],[-57,475]],[[263255,371593],[-527,-1618]],[[262728,369975],[-536,-44]],[[283955,369764],[143,-836]],[[284098,368928],[-199,-2026]],[[283899,366902],[-182,63]],[[283717,366965],[-298,1139]],[[283419,368104],[99,1639],[-146,1184],[-444,-782]],[[282928,370145],[-159,111]],[[158120,372966],[96,-2154],[271,-373],[409,-1982]],[[158896,368457],[-209,-644],[106,-2701]],[[158793,365112],[-4,-1305],[-464,-534],[77,-1486]],[[158402,361787],[-314,1660],[11,3041],[-319,2975],[37,3501]],[[268019,369148],[-408,283],[-84,-2105]],[[267527,367326],[-252,703],[-463,-1951],[-186,747],[-277,-815]],[[266349,366010],[-88,3196]],[[282769,370256],[-560,-2686]],[[282209,367570],[-433,1403],[-338,-727]],[[256452,367526],[-546,-453]],[[255906,367073],[-158,651],[-62,2672]],[[255686,370396],[-335,1440]],[[235507,371949],[0,-5388]],[[235507,366561],[0,-480]],[[235507,366081],[-1274,28]],[[234233,366109],[-37,818]],[[276028,367646],[-525,-1522]],[[275503,366124],[-183,485],[-294,-965]],[[275026,365644],[-118,2011]],[[206149,359693],[-183,-2]],[[205966,359691],[-1386,13]],[[204580,359704],[-148,938],[143,4467],[-65,1315]],[[237018,370608],[-19,-4324]],[[236999,366284],[-1492,277]],[[255686,370396],[-1221,-4086]],[[254465,366310],[33,525]],[[254498,366835],[-359,564],[-7,1318]],[[247963,370903],[3,-5312],[-200,54]],[[247766,365645],[-925,49]],[[214823,367027],[-1,-7366]],[[214822,359661],[-2675,122]],[[212147,359783],[-234,3]],[[198301,371688],[-141,-896],[-30,-2362],[-478,-2240],[-241,-2267],[2,-1425],[-247,-2726]],[[197166,359772],[-1855,-8]],[[199666,367650],[1,-7869]],[[199667,359781],[-2501,-9]],[[163279,360600],[-1048,-5633]],[[162231,354967],[-622,1773],[-205,2320]],[[161404,359060],[-32,3270]],[[263844,368824],[-156,-2928]],[[263688,365896],[-150,509],[-457,-2190]],[[263081,364215],[-5,2272],[-355,1235],[7,2253]],[[284693,370633],[402,-619],[175,-1717]],[[285270,368297],[-384,-511],[-28,-974]],[[284858,366812],[-760,2116]],[[259385,368154],[-66,-2032],[-241,-91]],[[259078,366031],[-868,-274]],[[258210,365757],[-399,1383]],[[278500,368443],[-229,-637],[32,-1405]],[[278303,366401],[-518,-5580]],[[277785,360821],[-108,-926],[-313,672]],[[277364,360567],[-363,2794],[-342,618]],[[276659,363979],[-1,1558]],[[277509,366213],[0,0]],[[184568,369085],[5,-9297]],[[184573,359788],[-3208,1]],[[231763,366980],[-8,-1628]],[[231755,365352],[-1561,65]],[[230194,365417],[-3,3233]],[[246323,364827],[-123,-4109]],[[246200,360718],[-515,61],[-148,783]],[[245537,361562],[-46,1372],[-349,1595],[-44,2975],[-102,8]],[[249705,370322],[275,-3107],[-171,-1185]],[[249809,366030],[-12,-1568]],[[249797,364462],[-367,-344],[-403,-1990]],[[249027,362128],[-283,3]],[[248744,362131],[15,8807]],[[243785,367651],[-25,-6959]],[[243760,360692],[-1207,136]],[[242553,360828],[-453,64]],[[242100,360892],[-3,7694]],[[253774,369187],[-63,-597],[-543,-371],[-221,-906]],[[252947,367313],[-159,351]],[[252788,367664],[8,3286]],[[252788,367664],[-169,-666],[-98,-2357],[240,-2056],[-183,-1538]],[[252578,361047],[0,1701],[-613,3309]],[[251965,366057],[5,4881]],[[283419,368104],[-491,2041]],[[251965,366057],[-546,-28],[-63,-614]],[[251356,365415],[-322,507]],[[251034,365922],[9,4966]],[[251034,365922],[-568,98]],[[250466,366020],[-657,10]],[[285850,370354],[308,-1052]],[[286158,369302],[-18,-1124]],[[286140,368178],[152,-3489],[-321,-310],[-554,3769]],[[248744,362131],[-259,19],[1,-1356],[-424,-246]],[[248062,360548],[-312,844],[16,4253]],[[273838,367775],[29,-1536],[-368,-994]],[[273499,365245],[-679,-1091]],[[272820,364154],[-382,1914]],[[272438,366068],[143,1618]],[[168203,368402],[-33,-2228],[201,-311],[167,-3441],[606,-1527],[213,-3239],[-23,-2583]],[[169334,355073],[-1716,-81],[-1,-1561],[-890,26],[-3,-1596],[-459,20],[-299,-1621]],[[165966,350260],[-246,-1295],[-814,-376],[-3,-4045],[-991,-5108]],[[163912,339436],[-929,3751],[57,1792],[-141,1162]],[[162899,346141],[229,1144],[-1,2966],[-896,4716]],[[238284,367738],[-14,-2706]],[[238270,365032],[-1188,149]],[[237082,365181],[-83,1103]],[[265409,369413],[279,-3141]],[[265688,366272],[-442,-1825]],[[265246,364447],[-535,1286]],[[264711,365733],[-177,3782]],[[255906,367073],[-251,-1811],[146,-2557]],[[255801,362705],[-529,-954],[-438,810]],[[254834,362561],[-346,1710],[-23,2039]],[[283717,366965],[-7,-1437]],[[283710,365528],[-51,70]],[[283659,365598],[-117,-1256]],[[283542,364342],[-75,-142]],[[283467,364200],[-36,-78]],[[283431,364122],[-87,-195]],[[283344,363927],[-565,790]],[[282779,364717],[-265,34],[-366,1828],[61,991]],[[280149,367190],[-243,-2778]],[[279906,364412],[-397,-808]],[[279509,363604],[-259,695],[-282,3486]],[[287953,369117],[-346,-3597],[-150,-3563],[-151,2650],[266,5441],[255,73]],[[263081,364215],[-502,-2274]],[[262579,361941],[-398,1305]],[[262181,363246],[-37,1321],[-302,1000]],[[261842,365567],[255,1916]],[[272438,366068],[-555,-2440],[-498,579]],[[271385,364207],[-316,930],[-383,3657],[178,532]],[[254498,366835],[-802,-2923],[-19,-787]],[[253677,363125],[-271,-607]],[[253406,362518],[-71,2345],[-388,2450]],[[188715,359809],[-3142,-15]],[[185573,359794],[-1000,-6]],[[266349,366010],[57,-1413]],[[266406,364597],[-349,1839],[-369,-164]],[[264711,365733],[-224,-683],[-203,-2440]],[[264284,362610],[-596,3286]],[[271385,364207],[-448,-1772]],[[270937,362435],[-326,-1378],[-364,-500]],[[270247,360557],[-283,4288],[-168,502]],[[286158,369302],[207,216],[310,-1576],[-73,-2371],[-462,2607]],[[268620,364836],[-243,-50],[-502,-1356]],[[267875,363430],[-354,1381],[6,2515]],[[282779,364717],[-405,-1350]],[[282374,363367],[-1213,1929]],[[281161,365296],[-10,1338]],[[284858,366812],[77,-164]],[[284935,366648],[-7,-2000],[-380,948],[-673,136],[24,1170]],[[240887,368746],[2,-7717]],[[240889,361029],[-605,67]],[[240284,361096],[-452,336]],[[239832,361432],[-22,6075]],[[161404,359060],[-763,407],[-257,-1537]],[[160384,357930],[-486,2766],[-658,1780],[-447,2636]],[[158896,368457],[359,-59]],[[261842,365567],[-522,-2203]],[[261320,363364],[-643,5164]],[[242100,360892],[-1211,137]],[[275026,365644],[-484,-1303]],[[274542,364341],[-690,-1814]],[[273852,362527],[-445,2381],[92,337]],[[230194,365417],[-2,-5660]],[[230192,359757],[-625,5]],[[229567,359762],[-1109,1]],[[228458,359763],[-15,8871]],[[228458,359763],[-876,-6]],[[227582,359757],[-948,0]],[[226634,359757],[-13,7216]],[[220213,368621],[49,-8798]],[[220262,359823],[-1515,-40]],[[218747,359783],[-1,7214],[-53,1]],[[221784,366876],[6,-7102]],[[221790,359774],[-1286,39]],[[220504,359813],[-242,10]],[[225109,366931],[7,-7184]],[[225116,359747],[-550,11]],[[224566,359758],[-1269,13]],[[223297,359771],[-31,7164]],[[261320,363364],[-485,-1545]],[[260835,361819],[-445,1353]],[[260390,363172],[-31,2226],[112,2239]],[[278782,367130],[-479,-729]],[[176230,341181],[676,-3534]],[[176906,337647],[-237,-294],[-2130,-6],[-3164,16]],[[171375,337363],[-1036,-167]],[[170339,337196],[74,1515],[-404,8051],[81,567],[-422,2802],[-73,2163],[-261,2779]],[[285316,364880],[167,-151]],[[285483,364729],[247,-950]],[[285730,363779],[-49,-868]],[[285681,362911],[-94,912],[-633,479],[-19,2346]],[[285270,368297],[233,-1659]],[[285503,366638],[-153,-1180]],[[285350,365458],[-34,-578]],[[260390,363172],[-160,-225]],[[260230,362947],[-453,-403],[-418,352]],[[259359,362896],[21,897],[-302,2238]],[[267875,363430],[-170,-1501],[19,-1797],[-189,-330]],[[267535,359802],[-167,367]],[[267368,360169],[-60,2883],[-338,936],[-80,1342],[-349,-222],[-82,-931]],[[266459,364177],[-53,420]],[[279509,363604],[-224,-3408]],[[279285,360196],[-519,776]],[[278766,360972],[-292,-176],[-159,1424],[-530,-1399]],[[239832,361432],[-1514,176]],[[238318,361608],[-48,3424]],[[253406,362518],[-128,-3094]],[[253278,359424],[-344,1548],[-334,-767]],[[252600,360205],[-233,1071]],[[252367,361276],[211,-229]],[[245537,361562],[-556,-176],[-16,-3767]],[[244965,357619],[-1212,98]],[[243753,357717],[7,2975]],[[201905,367295],[0,-3259],[563,-4371]],[[202468,359665],[-2632,116]],[[199836,359781],[-169,0]],[[276659,363979],[-321,-1646],[-128,662],[-334,-926]],[[275876,362069],[-139,-176]],[[275737,361893],[-37,2240],[-197,1991]],[[276171,365518],[-31,-844]],[[276140,364674],[211,-935],[217,1689],[-397,90]],[[257011,363733],[-117,-2666]],[[256894,361067],[-312,-151]],[[256582,360916],[-548,-371],[-28,566]],[[256006,361111],[-205,1594]],[[281161,365296],[-22,-3279]],[[281139,362017],[-569,-758]],[[280570,361259],[-694,2327],[30,826]],[[204580,359704],[-804,-10]],[[203776,359694],[-1308,-29]],[[258405,362945],[-625,205],[-142,-3375]],[[257638,359775],[-744,1292]],[[258210,365757],[195,-2812]],[[216175,367014],[3,-7320]],[[216178,359694],[-1317,-41]],[[214861,359653],[-39,8]],[[217536,367000],[3,-7258]],[[217539,359742],[-1361,-48]],[[218747,359783],[-870,-31]],[[217877,359752],[-338,-10]],[[232990,366930],[-4,-7162]],[[232986,359768],[-736,0]],[[232250,359768],[-495,-4]],[[231755,359764],[0,5588]],[[226634,359757],[-862,-11]],[[225772,359746],[-656,1]],[[223297,359771],[-1270,0]],[[222027,359771],[-237,3]],[[234233,366109],[4,-6336]],[[234237,359773],[-931,-5]],[[233306,359768],[-320,0]],[[254834,362561],[-147,-2742]],[[254687,359819],[-400,-773]],[[254287,359046],[-460,3989],[-150,90]],[[285503,366638],[154,-1165],[635,-2093],[-66,-1011]],[[286226,362369],[53,-610]],[[286279,361759],[-115,-211]],[[286164,361548],[-434,2231]],[[285483,364729],[-133,729]],[[237082,365181],[-19,-4504]],[[237063,360677],[-1556,162]],[[235507,360839],[0,5242]],[[275737,361893],[-473,-1710],[-546,-688]],[[274718,359495],[-101,1954]],[[274617,361449],[153,1098]],[[274770,362547],[-228,1794]],[[266459,364177],[-121,-2912],[119,-2629]],[[266457,358636],[-224,321]],[[266233,358957],[-784,1845]],[[265449,360802],[-274,2103],[71,1542]],[[264091,359038],[-613,-1731]],[[263478,357307],[-281,2109],[-435,319]],[[262762,359735],[-183,2206]],[[264284,362610],[-193,-3572]],[[235507,360839],[-1,-1078]],[[235506,359761],[-1085,11]],[[234421,359772],[-184,1]],[[259359,362896],[-159,-1977]],[[259200,360919],[-468,373],[-327,1653]],[[276140,364674],[31,844]],[[252367,361276],[-1008,2722]],[[251359,363998],[-3,1417]],[[272820,364154],[-287,-1785],[161,-863],[-535,-1063],[70,-474]],[[272229,359969],[-685,-1435],[-271,477]],[[271273,359011],[-336,3424]],[[250466,366020],[-48,-4181],[274,-849]],[[250692,360990],[92,-1565]],[[250784,359425],[-347,1557],[-155,-1006]],[[250282,359976],[-177,540],[-308,3946]],[[265449,360802],[-249,-1447],[-375,-411]],[[264825,358944],[-564,-169]],[[264261,358775],[-170,263]],[[251359,363998],[-14,-28]],[[251345,363970],[-427,-1200],[-226,-1780]],[[267368,360169],[-217,-969],[-641,-1367]],[[266510,357833],[-53,803]],[[283884,365227],[-225,371]],[[283710,365528],[174,-301]],[[248062,360548],[-410,-2218]],[[247652,358330],[-1170,83]],[[246482,358413],[-282,2305]],[[283884,365227],[441,266],[239,-1372]],[[284564,364121],[-405,-2254]],[[284159,361867],[-678,-2216]],[[283481,359651],[-2,3311]],[[283479,362962],[63,1380]],[[285316,364880],[0,0]],[[262181,363246],[-452,-3530],[-71,-1327]],[[261658,358389],[-614,241]],[[261044,358630],[-209,3189]],[[270247,360557],[-500,-1318]],[[269747,359239],[-387,951],[-242,3364]],[[231755,359764],[-101,-4]],[[231654,359760],[-1462,-3]],[[273852,362527],[-162,-1380]],[[273690,361147],[-561,-945],[-310,462],[-429,-1769]],[[272390,358895],[-161,1074]],[[283467,364200],[-36,-78]],[[282112,359573],[-317,632]],[[281795,360205],[-220,-114],[-436,1926]],[[282374,363367],[-290,-906],[28,-2888]],[[238318,361608],[-4,-1905]],[[238314,359703],[-2,-1358]],[[238312,358345],[-1259,166]],[[237053,358511],[10,2166]],[[160384,357930],[-174,-102]],[[160210,357828],[-281,264],[-163,-998]],[[159766,357094],[-380,2272],[-464,-405],[-520,2826]],[[283344,363927],[135,-965]],[[283481,359651],[-614,-2144]],[[282867,357507],[-109,310]],[[282758,357817],[-299,1492],[-347,264]],[[269086,363432],[-450,-1508],[10,-1311],[-407,-1312]],[[268239,359301],[-193,765],[-584,-1128],[73,864]],[[250282,359976],[-572,-2622]],[[249710,357354],[-478,-188]],[[249232,357166],[10,1268],[-274,2899],[59,795]],[[280570,361259],[-138,-3503]],[[280432,357756],[-433,-3599]],[[279999,354157],[-48,2703],[-666,3336]],[[274770,362547],[-153,-1098]],[[274718,359495],[-251,-984]],[[274467,358511],[-297,-982]],[[274170,357529],[-480,3618]],[[285497,362381],[-63,-1487],[-424,-1183]],[[285010,359711],[-289,-964]],[[284721,358747],[-34,2055],[-528,1065]],[[284564,364121],[581,-507],[352,-1233]],[[277364,360567],[-130,-3464]],[[277234,357103],[-337,-1260],[-663,787],[-116,-677]],[[276118,355953],[-70,869],[-471,579]],[[275577,357401],[360,2851],[-61,1817]],[[251671,358926],[-486,-648],[-308,443]],[[250877,358721],[-93,704]],[[251345,363970],[326,-5044]],[[252600,360205],[-4,-1497]],[[252596,358708],[-916,78]],[[251680,358786],[-9,140]],[[286164,361548],[133,-1959]],[[286297,359589],[-664,2557],[48,765]],[[269747,359239],[82,-1209],[-301,-551]],[[269528,357479],[-635,40],[-381,-1463]],[[268512,356056],[-298,1723]],[[268214,357779],[25,1522]],[[268976,359021],[0,0]],[[259200,360919],[-148,-2366]],[[259052,358553],[-666,-2939]],[[258386,355614],[14,578],[-508,429],[-79,979]],[[257813,357600],[-175,2175]],[[262762,359735],[-638,-2584]],[[262124,357151],[-421,-77]],[[261703,357074],[-45,1315]],[[261044,358630],[-402,-2235]],[[260642,356395],[-399,433]],[[260243,356828],[-13,6119]],[[254287,359046],[-781,-1739]],[[253506,357307],[-228,2117]],[[286374,362810],[-59,-945]],[[286315,361865],[-36,-106]],[[286226,362369],[148,441]],[[260243,356828],[-662,-2213]],[[259581,354615],[-529,3938]],[[256006,361111],[-211,-8003]],[[255795,353108],[-851,-65]],[[254944,353043],[-147,-18]],[[254797,353025],[95,6137],[-205,657]],[[285916,358061],[-1039,-4907]],[[284877,353154],[-34,77]],[[284843,353231],[-42,1109]],[[284801,354340],[305,3818],[-96,1553]],[[285497,362381],[59,-1872],[467,-1558],[-107,-890]],[[271273,359011],[-157,-551]],[[271116,358460],[-308,-1198],[-364,-180],[-73,-1054],[-635,-1658]],[[269736,354370],[-208,3109]],[[278766,360972],[-356,-9724]],[[278410,351248],[-345,-5]],[[278065,351243],[106,760],[-263,1161],[-285,-492],[86,-1439]],[[277709,351233],[-112,-1]],[[277597,351232],[-569,22]],[[277028,351254],[206,5849]],[[275577,357401],[-419,-1374],[-218,-1669]],[[274940,354358],[-473,4153]],[[249232,357166],[-26,-4320],[-719,34]],[[248487,352880],[-528,25]],[[247959,352905],[-9,1582],[-298,3843]],[[281795,360205],[-66,-4559]],[[281729,355646],[-596,560],[-701,1550]],[[286315,361865],[307,-510],[-325,-1766]],[[284721,358747],[-1328,-4408]],[[283393,354339],[-167,252],[88,2639],[-447,277]],[[246482,358413],[44,-2142]],[[246526,356271],[-1263,227]],[[245263,356498],[-303,38],[5,1083]],[[240284,361096],[-17,-4867]],[[240267,356229],[-1101,143]],[[239166,356372],[-105,8],[12,3261],[-759,62]],[[274170,357529],[-841,-1352]],[[273329,356177],[-156,-696],[-455,-110]],[[272718,355371],[-328,3524]],[[257813,357600],[-221,-728],[-202,-3628]],[[257390,353244],[-829,-106]],[[256561,353138],[21,7778]],[[256561,353138],[-151,-14]],[[256410,353124],[-615,-16]],[[242553,360828],[-66,-4878]],[[242487,355950],[-1818,221]],[[240669,356171],[-402,58]],[[253506,357307],[130,-2237]],[[253636,355070],[-1045,64]],[[252591,355134],[5,3574]],[[250877,358721],[-61,-2945]],[[250816,355776],[-215,-1257],[64,-1203]],[[250665,353316],[-203,-1647],[-216,1259]],[[250246,352928],[-536,4426]],[[279999,354157],[-151,-412],[-88,-2491]],[[279760,351254],[-173,-5]],[[279587,351249],[-953,1]],[[278634,351250],[-224,-2]],[[243753,357717],[-40,-7254]],[[243713,350463],[-1248,-11]],[[242465,350452],[22,5498]],[[237053,358511],[-17,-3425]],[[237036,355086],[-1531,349]],[[235505,355435],[1,4326]],[[266233,358957],[17,-975],[-599,-2206],[-221,-1817]],[[265430,353959],[-521,3091],[-84,1894]],[[282758,357817],[6,-3369],[-310,-3129]],[[282454,351319],[-369,-15]],[[282085,351304],[-408,-9]],[[281677,351295],[52,4351]],[[268214,357779],[-540,-707],[-177,-2081],[-906,-1449]],[[266591,353542],[-141,2662],[60,1629]],[[272718,355371],[-733,-1028],[-226,-1288]],[[271759,353055],[-261,2814],[-382,2591]],[[192649,359743],[0,-24859],[484,-3],[-47,-2692],[-3,-12919],[-57,-4901],[47,-1624],[-30,-12942],[-91,-9],[0,-3908]],[[192952,295886],[-303,170]],[[192649,296056],[0,7876],[-2090,0],[0,4901]],[[190559,308833],[0,51008]],[[190559,308833],[-267,68],[-549,2097],[-586,1352],[-625,-722],[-214,1094]],[[188318,312722],[8,6149],[-629,15],[-1,3314],[-1550,-155],[-3,3263],[-297,21],[4,2068],[-380,-318],[-149,1053],[-899,1045],[-616,2799],[-445,402]],[[183361,332378],[1,5119],[67,1656],[-123,2775],[363,944],[70,1118],[518,1618],[615,865],[469,2332],[-89,1927],[91,1456],[24,3833],[237,2875],[-31,898]],[[254797,353025],[-1049,764]],[[253748,353789],[-112,1281]],[[233306,359768],[-67,-1052],[1,-6427]],[[233240,352289],[-1054,-2]],[[232186,352287],[-1,6412],[65,1069]],[[231654,359760],[-1,-10708]],[[231653,349052],[-2,-4884],[-743,12]],[[230908,344180],[41,1148],[-278,232],[-357,1844],[-191,-673],[-230,2345],[-236,377],[-144,2237],[-300,-1766],[-371,678]],[[228842,350602],[273,1700],[-394,-68]],[[228721,352234],[-27,1706],[357,-36],[129,1256],[379,564],[8,4038]],[[224566,359758],[31,-9970]],[[224597,349788],[-210,-1342],[-482,1078],[-172,1065],[-325,12]],[[223408,350601],[-47,1717],[-453,3424],[-433,680]],[[222475,356422],[-448,3349]],[[234421,359772],[22,-6122]],[[234443,353650],[-17,-2995]],[[234426,350655],[-898,9]],[[233528,350664],[-1,1625],[-287,0]],[[232186,352287],[-8,-3237]],[[232178,349050],[-525,2]],[[227582,359757],[-1,-7541]],[[227581,352216],[-1788,-1]],[[225793,352215],[-21,7531]],[[225793,352215],[0,-2429]],[[225793,349786],[-1196,2]],[[228721,352234],[-1137,-18]],[[227584,352216],[-3,0]],[[235505,355435],[1,-1837]],[[235506,353598],[-1063,52]],[[222475,356422],[0,-4178],[-865,-44]],[[221610,352200],[-1107,8]],[[220503,352208],[1,7605]],[[203776,359694],[98,-2074],[-26,-3169],[117,-4650],[-91,-2221],[-239,-893],[559,-1234],[337,-2424],[573,-1622]],[[205104,341407],[-115,-752],[-407,114]],[[204582,340769],[2,439],[-988,-6],[48,-1326],[-533,2]],[[203111,339878],[-7,660]],[[203104,340538],[2,655],[-1777,-48],[0,4051],[-2059,60]],[[199270,345256],[16,10890],[481,2044],[69,1591]],[[199270,345256],[-7,-4086]],[[199263,341170],[-3954,38]],[[195309,341208],[2,18556]],[[195309,341208],[0,-19410]],[[195309,321798],[-1,-7083]],[[195308,314715],[-2,-14913]],[[195306,299802],[-838,-13],[-15,-899],[-397,-1422]],[[194056,297468],[-882,-3135],[-222,1553]],[[212147,359783],[-1,-9303]],[[212146,350480],[-110,1],[3,-8288]],[[212039,342193],[-1,-5881]],[[212038,336312],[-930,12]],[[211108,336324],[28,6448],[-1196,-11],[1,1643],[-599,9],[0,810]],[[209342,345223],[3,14488]],[[214861,359653],[-12,-9170]],[[214849,350483],[-362,-4]],[[214487,350479],[-2341,1]],[[217877,359752],[-24,-9286]],[[217853,350466],[-365,-7]],[[217488,350459],[-1501,5]],[[215987,350464],[-1138,19]],[[220503,352208],[-3,-1741]],[[220500,350467],[-1510,-6]],[[218990,350461],[-1137,5]],[[284801,354340],[42,-1109]],[[284877,353154],[-51,-1711]],[[284826,351443],[-1,-152]],[[284825,351291],[-691,43]],[[284134,351334],[-370,-26]],[[283764,351308],[-248,1790],[-323,549],[200,692]],[[263478,357307],[2,-789],[-559,-4123]],[[262921,352395],[-20,2]],[[262901,352397],[-528,227]],[[262373,352624],[-249,4527]],[[205966,359691],[58,-1481],[-86,-3571],[-387,-996],[-22,-2199],[163,-1117],[-61,-4280]],[[205631,346047],[-183,-448],[-37,-1983],[-307,-2209]],[[209342,345223],[-1191,14]],[[208151,345237],[-1195,-14],[1,803],[-1326,21]],[[239166,356372],[-30,-5934]],[[239136,350438],[-750,14]],[[238386,350452],[29,5979],[-103,1914]],[[162899,346141],[-231,-1190],[-456,1973],[-261,-927],[-61,1184],[-572,3412],[-183,-61],[-19,1981],[-417,1414],[44,778],[-533,3123]],[[265430,353959],[-148,-1854]],[[265282,352105],[-222,46]],[[265060,352151],[-603,36]],[[264457,352187],[-224,1543],[-135,2569],[163,2476]],[[286694,356681],[-124,-213]],[[286570,356468],[-12,177]],[[286558,356645],[136,36]],[[286870,358327],[-79,-1657]],[[286791,356670],[-328,768],[3,1657],[404,-768]],[[264457,352187],[-96,-2]],[[264361,352185],[-1440,210]],[[266591,353542],[-596,-1193]],[[265995,352349],[-713,-244]],[[251680,358786],[-1,-3231]],[[251679,355555],[-863,221]],[[252591,355134],[-9,-4639]],[[252582,350495],[-78,9]],[[252504,350504],[-835,20]],[[251669,350524],[10,5031]],[[261703,357074],[-225,-4257]],[[261478,352817],[-392,-140]],[[261086,352677],[-444,3718]],[[259581,354615],[12,-1748]],[[259593,352867],[-646,209]],[[258947,353076],[-577,206]],[[258370,353282],[16,2332]],[[238386,350452],[-787,-3]],[[237599,350449],[-586,0]],[[237013,350449],[23,4637]],[[287471,351575],[127,-159]],[[287598,351416],[-118,-4]],[[287480,351412],[-9,163]],[[287748,351418],[-69,0]],[[287679,351418],[-139,3115],[-110,-3119]],[[287430,351414],[-90,0]],[[287340,351414],[-61,2]],[[287279,351416],[-242,-2]],[[287037,351414],[1,2144],[150,496],[-378,1440],[-61,1239]],[[286749,356733],[42,-63]],[[286870,358327],[530,-179],[348,-6730]],[[274940,354358],[-364,-882],[-48,-1926]],[[274528,351550],[-629,24]],[[273899,351574],[-213,1696]],[[273686,353270],[-50,397]],[[273636,353667],[-307,2510]],[[270321,353193],[0,0]],[[270321,353193],[-338,-940]],[[269983,352253],[-141,1]],[[269842,352254],[-106,2116]],[[271759,353055],[-114,-499]],[[271645,352556],[-501,43]],[[271144,352599],[-890,-363]],[[270254,352236],[67,957]],[[247959,352905],[-202,-2472]],[[247757,350433],[-990,13]],[[246767,350446],[-44,3366],[-197,2459]],[[286570,356468],[-316,-133]],[[286254,356335],[304,310]],[[286305,356801],[-99,492]],[[286206,357293],[36,564]],[[286242,357857],[63,-1056]],[[286206,357293],[-103,-959],[-95,-4918]],[[286008,351416],[-140,0]],[[285868,351416],[-1042,27]],[[285916,358061],[-22,-1249],[348,1045]],[[163912,339436],[276,-2209]],[[164188,337227],[-3150,124]],[[161038,337351],[-326,1746],[-77,1735],[-231,787],[-396,3161],[-503,2053],[-222,5106],[442,1738],[41,3417]],[[283764,351308],[-1310,11]],[[283158,354580],[0,0]],[[268512,356056],[-491,-2310],[-105,-1528]],[[267916,352218],[-1356,66]],[[266560,352284],[-565,65]],[[281677,351295],[-774,-7]],[[280903,351288],[-371,-27]],[[280532,351261],[-772,-7]],[[262373,352624],[-838,204]],[[261535,352828],[-57,-11]],[[245263,356498],[-29,-6068]],[[245234,350430],[-782,-12]],[[244452,350418],[-119,11]],[[244333,350429],[-620,34]],[[269842,352254],[-878,-30]],[[268964,352224],[-617,-6]],[[268347,352218],[-431,0]],[[258370,353282],[-422,-315]],[[257948,352967],[-558,277]],[[276118,355953],[-148,-276],[114,-4413]],[[276084,351264],[-1077,151]],[[275007,351415],[-479,135]],[[250246,352928],[-253,-2473]],[[249993,350455],[-185,-21]],[[249808,350434],[-152,5]],[[249656,350439],[-17,-3004]],[[249639,347435],[-129,1228],[-367,441],[-80,-746],[-583,45]],[[248480,348403],[7,4477]],[[286305,356801],[-51,-466]],[[286694,356681],[55,52]],[[287037,351414],[-532,-2]],[[286505,351412],[-497,4]],[[277028,351254],[-871,10]],[[276157,351264],[-73,0]],[[276536,353676],[0,0]],[[181366,356861],[18,-12097],[-305,-3168],[-223,-193],[-381,2417],[-725,-8],[-350,-1052],[144,-4363],[76,-6300],[227,-3470],[73,-3058],[-216,-1125],[36,-1876]],[[179740,322568],[-2834,15079]],[[261086,352677],[-980,64]],[[260106,352741],[-513,126]],[[246767,350446],[-580,-1]],[[246187,350445],[-953,-15]],[[240669,356171],[-21,-5742]],[[240648,350429],[-227,4]],[[240421,350433],[-1233,7]],[[239188,350440],[-52,-2]],[[223408,350601],[13,-6429]],[[223421,344172],[-1188,51]],[[222233,344223],[-596,-4],[-27,7981]],[[273636,353667],[50,-397]],[[273899,351574],[-178,50]],[[273721,351624],[-1258,239]],[[272463,351863],[-903,251]],[[271560,352114],[85,442]],[[242465,350452],[-84,-5]],[[242381,350447],[-1055,0]],[[241326,350447],[-678,-18]],[[251669,350524],[-28,4]],[[251641,350528],[-22,-4]],[[251619,350524],[-191,1382],[-763,1410]],[[237013,350449],[-1507,13]],[[235506,350462],[0,3136]],[[253748,353789],[47,-3359]],[[253795,350430],[-1213,65]],[[170339,337196],[-4266,59]],[[166073,337255],[29,8918],[143,-17],[5,2474],[-284,1630]],[[254944,353043],[136,-5034]],[[255080,348009],[-639,-725],[-444,466]],[[253997,347750],[-26,131]],[[253971,347881],[-176,2549]],[[235506,350462],[154,-6283]],[[235660,344179],[-653,-10]],[[235007,344169],[-597,8]],[[234410,344177],[16,6478]],[[257414,348713],[-201,-1048],[-241,622]],[[256972,348287],[-208,-250],[-369,1607]],[[256395,349644],[15,3480]],[[257948,352967],[-373,-4226],[-161,-28]],[[258947,353076],[-67,-2837]],[[258880,350239],[-152,-2605]],[[258728,347634],[-470,-221],[-397,-1686]],[[257861,345727],[-447,2986]],[[249808,350434],[-152,5]],[[251619,350524],[-1425,9]],[[250194,350533],[-201,-78]],[[256395,349644],[-463,-2486]],[[255932,347158],[-632,238]],[[255300,347396],[-220,613]],[[278065,351243],[-356,-10]],[[260035,350463],[-39,-1632]],[[259996,348831],[-420,265]],[[259576,349096],[-528,340],[-168,803]],[[260106,352741],[-71,-2278]],[[270254,352236],[-271,17]],[[248480,348403],[6,-7255]],[[248486,341148],[-919,-50]],[[247567,341098],[-247,-14]],[[247320,341084],[522,3829]],[[247842,344913],[352,1893],[-43,1810],[-210,1819],[-184,-2]],[[262901,352397],[149,-1465]],[[263050,350932],[-592,1051],[-298,-537],[-193,-2702]],[[261967,348744],[-458,2312]],[[261509,351056],[26,1772]],[[261509,351056],[-433,-574],[-153,-1811]],[[260923,348671],[-582,2219],[-306,-427]],[[270706,350628],[-572,-2009],[-308,-73]],[[269826,348546],[-389,913],[-672,-256]],[[268765,349203],[199,3021]],[[271144,352599],[-438,-1971]],[[271560,352114],[-142,-3666]],[[271418,348448],[-528,-1943]],[[270890,346505],[-41,-397]],[[270849,346108],[-351,1893],[300,1976],[-92,651]],[[264361,352185],[5,-1439],[-252,-900],[56,-3382],[-120,-1264]],[[264050,345200],[-190,-992]],[[263860,344208],[-474,1990],[-250,1871]],[[263136,348069],[117,454],[-203,2409]],[[266560,352284],[206,-1169],[31,-2258]],[[266797,348857],[-174,-720],[-607,-561]],[[266016,347576],[-183,13],[-202,1690],[-279,-296]],[[265352,348983],[-292,3168]],[[228842,350602],[-61,-3232],[298,0],[0,-1617]],[[229079,345753],[-602,-1],[-1,-1624],[-593,-2]],[[227883,344126],[-297,100]],[[227586,344226],[-2,7990]],[[268347,352218],[-502,-560],[-752,-3146]],[[267093,348512],[-296,345]],[[233528,350664],[-299,-2],[-13,-8097]],[[233216,342565],[-366,1],[-131,1627],[-399,1]],[[232320,344194],[-150,-1],[8,4857]],[[265352,348983],[-275,-2785]],[[265077,346198],[-193,-791],[-429,316],[-38,-1253],[-367,730]],[[268765,349203],[-61,-398]],[[268704,348805],[-665,-1447],[-393,-1683]],[[267646,345675],[-224,1918],[-258,-1047]],[[267164,346546],[-71,1966]],[[227586,344226],[-599,4]],[[226987,344230],[-1193,4]],[[225794,344234],[-1,5552]],[[222233,344223],[3,-2818]],[[222236,341405],[-225,-158],[-276,-2614],[-162,-422],[-441,842],[-101,2155],[-521,-2268]],[[220510,338940],[0,3261]],[[220510,342201],[-10,8266]],[[272463,351863],[277,-3899]],[[272740,347964],[-622,-2325]],[[272118,345639],[-700,2809]],[[263136,348069],[-494,-1685],[-81,-2308]],[[262561,344076],[-537,-332]],[[262024,343744],[-54,115]],[[261970,343859],[103,957],[-106,3928]],[[273721,351624],[-182,-2986]],[[273539,348638],[-167,-516],[-189,1242],[-443,-1400]],[[230908,344180],[-82,5]],[[230826,344185],[-902,-43]],[[229924,344142],[-550,-15],[0,1626],[-295,0]],[[275007,351415],[-33,-5379]],[[274974,346036],[-1,-378]],[[274973,345658],[-247,763],[-926,-860]],[[273800,345561],[12,1685],[-273,1392]],[[285868,351416],[140,-749]],[[286008,350667],[106,-2464]],[[286114,348203],[-296,-486]],[[285818,347717],[-335,-961]],[[285483,346756],[-266,1180],[-452,775]],[[284765,348711],[60,2580]],[[287518,346134],[-187,1417]],[[287331,347551],[-272,272],[-554,3589]],[[287279,351416],[112,-2597],[320,-2366],[229,-3945],[-422,3626]],[[287748,351418],[261,-5943]],[[288009,345475],[-7,-9]],[[288002,345466],[-124,1107],[-199,4845]],[[287598,351416],[-258,-2]],[[287430,351414],[50,-2]],[[276157,351264],[-22,-5309]],[[276135,345955],[-1161,81]],[[287331,347551],[294,-3319],[-296,418],[-595,3435]],[[286734,348085],[-726,2582]],[[282085,351304],[5,-704]],[[282090,350600],[-40,-2323],[-263,-3338]],[[281787,344939],[-837,1178]],[[280950,346117],[82,751],[-129,4420]],[[284010,345760],[-232,-1458]],[[283778,344302],[-264,840],[-153,2057],[-292,-389],[-26,2141],[-250,1169],[-703,480]],[[284134,351334],[123,-1350],[-247,-4224]],[[284765,348711],[428,-836],[170,-2171]],[[285363,345704],[-1353,56]],[[279587,351249],[-16,-5692]],[[279571,345557],[-415,60]],[[279156,345617],[-565,56]],[[278591,345673],[43,5577]],[[280950,346117],[-322,-1897],[-207,205]],[[280421,344425],[-40,5196],[151,1640]],[[280421,344425],[-138,-2848]],[[280283,341577],[-564,914]],[[279719,342491],[-155,441],[7,2625]],[[277597,351232],[-60,-5440]],[[277537,345792],[-1,-133]],[[277536,345659],[-1401,296]],[[278591,345673],[-288,31]],[[278303,345704],[-766,88]],[[261970,343859],[-836,1715],[-211,1218]],[[260923,346792],[0,1879]],[[260923,346792],[-350,-1703],[-444,506]],[[260129,345595],[-184,949],[51,2287]],[[283778,344302],[137,-1340],[-235,-399]],[[283680,342563],[-211,-1306]],[[283469,341257],[-343,603],[-21,992],[-459,1162]],[[282646,344014],[-526,-168],[-333,1093]],[[234410,344177],[-298,-3],[1,-1624],[-250,5]],[[233863,342555],[-647,10]],[[270849,346108],[-412,-3021]],[[270437,343087],[-395,999]],[[270042,344086],[-95,1420],[-234,365]],[[269713,345871],[113,2675]],[[286734,348085],[37,-1381],[441,-2720],[-295,-510],[-337,1726]],[[286580,345200],[-247,782],[-219,2221]],[[251641,350528],[29,-1722],[-373,-22],[-27,-3471]],[[251270,345313],[-542,-338]],[[250728,344975],[-915,150]],[[249813,345125],[342,3659],[39,1749]],[[225794,344234],[-297,0]],[[225497,344234],[-1188,0]],[[224309,344234],[-888,-62]],[[252504,350504],[-37,-6508]],[[252467,343996],[-452,-1664]],[[252015,342332],[-416,1162],[-329,1819]],[[249813,345125],[-408,-509]],[[249405,344616],[-184,1254],[448,35],[-218,1039],[188,491]],[[215988,342196],[-1503,-3]],[[214485,342193],[2,8286]],[[215987,350464],[1,-8268]],[[253971,347881],[-287,-10],[29,-1851],[-361,-2613]],[[253352,343407],[3,475],[-888,114]],[[217487,342236],[0,-43]],[[217487,342193],[-1499,3]],[[217488,350459],[-1,-8223]],[[214485,342193],[-2446,0]],[[218990,350461],[-2,-8244]],[[218988,342217],[-1501,19]],[[220510,342201],[-1504,15]],[[219006,342216],[-18,1]],[[237599,350449],[-66,-2391],[209,-1186]],[[237742,346872],[-201,-1332]],[[237541,345540],[-237,-554],[-1005,172],[-161,-2143],[-448,53]],[[235690,343068],[-30,1111]],[[244333,350429],[-13,-3019],[-310,36],[-1,-1628],[-349,62]],[[243660,345880],[-1297,148]],[[242363,346028],[18,4419]],[[239188,350440],[-10,-7018]],[[239178,343422],[-500,71]],[[238678,343493],[-199,24],[-297,3290],[-440,65]],[[244452,350418],[274,-1428],[139,-3024]],[[244865,345966],[-253,-502],[-21,-6336]],[[244591,339128],[-295,861],[-689,91]],[[243607,340080],[78,1094],[-25,4706]],[[246125,346133],[-9,-2184]],[[246116,343949],[-922,327],[-329,1690]],[[246187,350445],[91,-4019],[-153,-293]],[[240421,350433],[-86,-130],[-16,-7014]],[[240319,343289],[-151,19]],[[240168,343308],[-990,114]],[[241326,350447],[-51,-4301],[214,-302],[163,-1657],[2,-1854]],[[241654,342333],[-1188,137],[-147,819]],[[242363,346028],[-108,-2388]],[[242255,343640],[-5,-1372],[-299,33],[-7,-1620],[-298,34]],[[241646,340715],[8,1618]],[[247842,344913],[-364,-14],[3,1093],[-1356,141]],[[166073,337255],[-1825,-23]],[[164248,337232],[-60,-5]],[[259576,349096],[-440,-2424]],[[259136,346672],[-408,962]],[[256972,348287],[-235,-4733],[-157,-1542]],[[256580,342012],[-358,78]],[[256222,342090],[89,2409],[-69,2509],[-310,150]],[[256334,346649],[0,0]],[[269713,345871],[-270,-1826],[-440,-1090]],[[269003,342955],[-147,935],[39,5066],[-191,-151]],[[273800,345561],[-24,-3359]],[[273776,342202],[-410,-186]],[[273366,342016],[-834,-920]],[[272532,341096],[-604,2255]],[[271928,343351],[190,2288]],[[266016,347576],[-182,-3348]],[[265834,344228],[-583,406]],[[265251,344634],[-174,1564]],[[260129,345595],[-76,-1981]],[[260053,343614],[-159,-706],[-544,-142]],[[259350,342766],[-214,3906]],[[249405,344616],[100,-1066],[-238,-810],[-78,-1541]],[[249189,341199],[-703,-51]],[[232320,344194],[0,-4873],[-163,-839]],[[232157,338482],[-593,17]],[[231564,338499],[9,4068],[-746,8],[-1,1610]],[[267164,346546],[-203,142],[-387,-2272]],[[266574,344416],[-254,92],[-305,-1843]],[[266015,342665],[-181,1563]],[[257861,345727],[219,-2690]],[[258080,343037],[-288,-2464]],[[257792,340573],[-469,1262],[-395,311],[-275,-1179],[-73,1045]],[[269003,342955],[-22,-1049]],[[268981,341906],[-95,483],[-414,-1436],[-99,-1242],[-215,431]],[[268158,340142],[-746,4390]],[[267412,344532],[234,1143]],[[271928,343351],[-738,-110]],[[271190,343241],[-274,1942],[-26,1322]],[[286580,345200],[260,-2059],[-166,-58],[-563,1793],[417,-1963],[-516,-158]],[[286012,342755],[-231,471],[37,4491]],[[263860,344208],[277,-2132]],[[264137,342076],[-291,-1173],[-653,-1443]],[[263193,339460],[-112,1610],[-520,3006]],[[255300,347396],[-148,-2919]],[[255152,344477],[-646,1244],[-421,-30]],[[254085,345691],[-88,2059]],[[254085,345691],[76,-2249],[-252,-3271],[243,-246],[-104,-1722]],[[254048,338203],[-22,-470]],[[254026,337733],[-577,561]],[[253449,338294],[-110,14],[13,5099]],[[259350,342766],[125,-2327]],[[259475,340439],[-385,-124]],[[259090,340315],[-438,450],[-572,2272]],[[286012,342755],[225,-327],[-290,-1136],[-496,1123],[-83,1530],[115,2811]],[[267412,344532],[-191,-1783]],[[267221,342749],[-165,989],[-482,678]],[[256222,342090],[-60,-1685]],[[256162,340405],[-921,637]],[[255241,341042],[-89,3435]],[[238678,343493],[80,-2934],[-203,-1599],[13,-2198]],[[238568,336762],[-493,95]],[[238075,336857],[-599,-165]],[[237476,336692],[-145,22]],[[237331,336714],[53,6146],[157,2680]],[[262024,343744],[-408,-705],[-49,-2263]],[[261567,340776],[-127,977],[-554,938],[-379,-1246]],[[260507,341445],[-454,2169]],[[265251,344634],[-424,-2187],[97,-598],[-378,-805],[-214,-1552]],[[264332,339492],[-195,2584]],[[274973,345658],[38,-1939],[-162,-1684]],[[274849,342035],[-546,78]],[[274303,342113],[-527,89]],[[271190,343241],[205,-849],[-197,-1934]],[[271198,340458],[-379,-47]],[[270819,340411],[-107,-893]],[[270712,339518],[-146,571],[-129,2998]],[[281787,344939],[-692,-7162]],[[281095,337777],[-139,1398],[-673,2402]],[[247320,341084],[-33,-576],[-1289,60]],[[245998,340568],[118,3381]],[[208151,345237],[293,-4777],[-163,-1891],[63,-1473]],[[208344,337096],[-1781,-187],[-951,1848],[-1038,6]],[[204574,338763],[8,2006]],[[276135,345955],[-22,-4592]],[[276113,341363],[-980,-698]],[[275133,340665],[-284,1370]],[[243607,340080],[-387,-1384]],[[243220,338696],[-296,1224],[-438,79],[156,1793],[-387,1848]],[[270042,344086],[-542,-1569]],[[269500,342517],[-247,-1769]],[[269253,340748],[-294,-190],[22,1348]],[[245998,340568],[-64,-1620],[-438,77]],[[245496,339025],[-463,92]],[[245033,339117],[-442,11]],[[277536,345659],[-27,-6363]],[[277509,339296],[-1406,391]],[[276103,339687],[10,1676]],[[278303,345704],[22,-6834]],[[278325,338870],[33,-603],[-850,-17]],[[277508,338250],[1,1046]],[[229924,344142],[1,-4066]],[[229925,340076],[-1447,8]],[[228478,340084],[-594,801],[-1,3241]],[[255241,341042],[-480,-1635],[-27,-1245]],[[254734,338162],[-379,-650],[-307,691]],[[285363,345704],[-90,-1720],[200,-3016],[-54,-1229]],[[285419,339739],[-161,-1091]],[[285258,338648],[-207,365],[-191,-1125],[-97,1432],[-186,-785],[-144,1522],[-394,-15],[-22,1229],[-337,1292]],[[279156,345617],[-183,-6998]],[[278973,338619],[-648,251]],[[279719,342491],[139,-1156],[-370,-2640],[-207,11]],[[279281,338706],[-308,-87]],[[237331,336714],[-1477,-33]],[[235854,336681],[-164,6387]],[[288818,335050],[63,-1480],[-197,-6894],[-610,-638]],[[288074,326038],[-5,98]],[[288069,326136],[643,1434],[149,5776],[-43,1704]],[[287690,334443],[-349,562]],[[287341,335005],[74,4092],[488,661],[174,-763],[41,-4813],[-337,-752],[-91,1013]],[[288009,345475],[568,-6869],[-469,3338],[-106,3522]],[[252015,342332],[-40,-5057]],[[251975,337275],[-583,117]],[[251392,337392],[-539,1205],[-221,2559]],[[250632,341156],[96,3819]],[[203103,338170],[0,312]],[[203103,338482],[0,-312]],[[203104,340538],[-422,-117],[-2,-2838],[423,-966]],[[203103,336617],[9,-10066]],[[203112,326551],[-2650,80]],[[200462,326631],[-119,1602],[-198,-3]],[[200145,328230],[5,12910],[-887,30]],[[211108,336324],[-13,-6367],[-717,-154]],[[210378,329803],[-244,605],[-702,7065],[-124,-377],[-964,0]],[[250632,341156],[-254,-2106],[-174,-102]],[[250204,338948],[-181,1222],[-661,-786]],[[249362,339384],[-173,1815]],[[282646,344014],[-362,-5323]],[[282284,338691],[-1014,-2547]],[[281270,336144],[-175,1633]],[[267221,342749],[-212,-3524]],[[267009,339225],[-457,518],[-553,2138]],[[265999,341881],[16,784]],[[265999,341881],[52,-1239],[-389,-1579]],[[265662,339063],[-165,-856],[-257,652],[-539,-385],[-75,-938]],[[264626,337536],[-271,1710]],[[264355,339246],[-23,246]],[[268158,340142],[-176,-2868]],[[267982,337274],[-326,-27],[-492,-1365]],[[267164,335882],[-155,3343]],[[263193,339460],[-282,-1554]],[[262911,337906],[-375,-1179]],[[262536,336727],[-941,74]],[[261595,336801],[1,25]],[[261596,336826],[-53,386]],[[261543,337212],[10,105]],[[261553,337317],[156,2179],[-142,1280]],[[226987,344230],[5,-8167]],[[226992,336063],[-1485,-16]],[[225507,336047],[-10,8187]],[[228478,340084],[-1,-4053]],[[228477,336031],[-1485,32]],[[225507,336047],[-296,-3],[0,-3229]],[[225211,332815],[-863,2]],[[224348,332817],[-25,4855]],[[224323,337672],[-14,6562]],[[224323,337672],[-2072,-4]],[[222251,337668],[-15,3737]],[[231564,338499],[-444,4],[-1,-4058]],[[231119,334445],[-1192,-1]],[[229927,334444],[-2,5632]],[[233863,342555],[-208,-1974],[146,-1820],[-99,-1073]],[[233702,337688],[-1043,-409],[-29,1219],[-323,-7]],[[232307,338491],[-150,-9]],[[235007,344169],[-28,-9733]],[[234979,334436],[-892,6]],[[234087,334442],[1,3236],[-386,10]],[[235854,336681],[57,-2246]],[[235911,334435],[-932,1]],[[270712,339518],[-422,-1622]],[[270290,337896],[-183,3519],[-607,1102]],[[283469,341257],[168,-1847],[-22,-1611]],[[283615,337799],[-112,244],[-755,-2883]],[[282748,335160],[-250,2798],[-214,733]],[[253449,338294],[-4,-541]],[[253445,337753],[-1088,149],[-103,-659]],[[252254,337243],[-279,32]],[[260507,341445],[21,-2479],[-126,-943]],[[260402,338023],[-565,156]],[[259837,338179],[-362,2260]],[[243220,338696],[34,-3025]],[[243254,335671],[-1124,135]],[[242130,335806],[-496,71],[5,1352]],[[241639,337229],[7,3486]],[[240168,343308],[-18,-7270]],[[240150,336038],[-594,78]],[[239556,336116],[-989,104],[1,542]],[[272532,341096],[-16,-3721]],[[272516,337375],[-83,-532]],[[272433,336843],[-535,176],[-700,3439]],[[241639,337229],[-594,41],[-3,-1349],[-498,75]],[[240544,335996],[-394,42]],[[259090,340315],[-150,-4665]],[[258940,335650],[-106,-1338]],[[258834,334312],[-300,532],[-141,-775],[-313,1294],[-345,-46]],[[257735,335317],[-130,449]],[[257605,335766],[203,1497],[-16,3310]],[[270290,337896],[-396,-2234]],[[269894,335662],[-202,1972],[-170,143]],[[269522,337777],[-269,2971]],[[261596,336826],[-53,386]],[[261553,337317],[-455,475],[-475,-445]],[[260623,337347],[-221,676]],[[281095,337777],[-585,-2047],[-679,-3519]],[[279831,332211],[-571,1186]],[[279260,333397],[-227,517],[248,4792]],[[285258,338648],[-235,-2967]],[[285023,335681],[-392,-875],[-524,1391]],[[284107,336197],[-492,1602]],[[269522,337777],[-293,-274],[-813,-2185],[-219,-149]],[[268197,335169],[-215,2105]],[[275133,340665],[83,-1449],[-296,-1328],[32,-1468]],[[274952,336420],[-480,1873],[-210,137]],[[274262,338430],[41,3683]],[[219006,342216],[1,-8139]],[[219007,334077],[-1521,-4]],[[217486,334073],[0,115]],[[217486,334188],[1,8005]],[[220510,338940],[0,-4867]],[[220510,334073],[-1503,4]],[[217486,334188],[-1496,-23]],[[215990,334165],[-2,8031]],[[214485,342193],[1,-7963]],[[214486,334230],[-2449,-96]],[[212037,334134],[1,2178]],[[274262,338430],[-178,-3319],[96,-3116]],[[274180,331995],[-135,-24]],[[274045,331971],[-450,-339]],[[273595,331632],[-36,1117]],[[273559,332749],[96,1381],[-522,2938]],[[273133,337068],[300,3340],[-67,1608]],[[215990,334165],[0,-71]],[[215990,334094],[-1504,-3]],[[214486,334091],[0,139]],[[257605,335766],[-267,-59]],[[257338,335707],[-1207,2677]],[[256131,338384],[31,2021]],[[273133,337068],[-79,883],[-538,-576]],[[263585,335029],[0,0]],[[263585,335029],[-124,-484]],[[263461,334545],[-99,4]],[[263362,334549],[-9,1250],[-281,765]],[[263072,336564],[-161,1342]],[[264355,339246],[-770,-4217]],[[267164,335882],[3,-378]],[[267167,335504],[-680,-2475],[-459,115]],[[266028,333144],[-109,2607],[-257,3312]],[[276103,339687],[-56,-7726]],[[276047,331961],[-323,-24]],[[275724,331937],[-70,1389],[-359,2653],[-343,441]],[[222251,337668],[32,-5648]],[[222283,332020],[-589,1],[-1,-1624],[-1183,13]],[[220510,330410],[0,3663]],[[200145,328230],[-3228,28],[-2,-6474],[-1606,14]],[[204574,338763],[16,-15442]],[[204590,323321],[-1474,-28]],[[203116,323293],[-4,3258]],[[203103,336617],[208,1297],[-208,256]],[[203103,338482],[8,1396]],[[249362,339384],[-275,31],[115,-1382],[-335,-1404],[-366,-377],[270,-1926],[-281,-846],[135,-918]],[[248625,332562],[-364,175],[-4,-2806]],[[248257,329931],[-36,-136]],[[248221,329795],[-36,1334],[-212,-483]],[[247973,330646],[-400,66]],[[247573,330712],[0,4866]],[[247573,335578],[-6,5520]],[[272433,336843],[-475,-3705]],[[271958,333138],[-10,-82]],[[271948,333056],[-430,281]],[[271518,333337],[-367,-86]],[[271151,333251],[-126,2692],[-326,1639],[222,1422],[-102,1407]],[[251392,337392],[-291,-2345],[-136,397]],[[250965,335444],[-553,1154],[-246,1169]],[[250166,337767],[38,1181]],[[247573,335578],[-2090,161]],[[245483,335739],[13,3286]],[[286926,335502],[-145,-1822],[-233,206],[79,1506],[-351,140]],[[286276,335532],[78,4358]],[[286354,339890],[552,1171],[303,-80],[50,-5635],[-333,156]],[[256131,338384],[-53,-2345],[-292,-1221]],[[255786,334818],[-336,-819],[-354,711],[-199,-818]],[[254897,333892],[-239,1016],[76,3254]],[[286276,335532],[-676,145]],[[285600,335677],[-577,4]],[[285419,339739],[847,1101],[88,-950]],[[259837,338179],[-278,-1956],[-1,-1386]],[[259558,334837],[-289,-248],[-329,1061]],[[271151,333251],[-416,-936],[-546,61]],[[270189,332376],[-338,1183],[43,2103]],[[250166,337767],[-127,96],[-281,-4503]],[[249758,333360],[-308,1168],[-405,125],[-420,-2091]],[[229927,334444],[-12,-3282]],[[229915,331162],[-1439,23]],[[228476,331185],[1,4846]],[[245033,339117],[-93,-1439],[-340,-1930],[-43,-3401],[-592,76]],[[243965,332423],[-591,68]],[[243374,332491],[12,3307],[-132,-127]],[[277508,338250],[-37,-6114]],[[277471,332136],[-595,-67]],[[276876,332069],[-829,-108]],[[263633,333862],[1,202]],[[263634,334064],[-1,-202]],[[264626,337536],[88,-2616],[-150,-1006]],[[264564,333914],[-285,822],[-464,206],[-191,-774]],[[263624,334168],[-163,377]],[[245483,335739],[-6,-4945]],[[245477,330794],[-2,-1650]],[[245475,329144],[-590,62],[-3,1642],[-263,-126]],[[244619,330722],[-662,63],[8,1638]],[[266028,333144],[-304,-143],[-504,-1878]],[[265220,331123],[-22,59]],[[265198,331182],[-124,1693],[-214,-288],[-296,1327]],[[279260,333397],[-157,-1140]],[[279103,332257],[-411,1984],[-648,-2053]],[[278044,332188],[-573,-52]],[[210378,329803],[0,-2771],[-614,432],[-745,-2269]],[[209019,325195],[-2,1368],[-3247,12],[1,-3244]],[[205771,323331],[-1181,-10]],[[282748,335160],[-108,-470]],[[282640,334690],[-343,-1480]],[[282297,333210],[-672,237]],[[281625,333447],[-169,331],[-186,2366]],[[275724,331937],[-313,-26]],[[275411,331911],[-1231,84]],[[232307,338491],[0,-2432],[148,-23],[1,-3216]],[[232456,332820],[-305,-2],[-149,-3257],[-294,2]],[[231708,329563],[-296,1],[-1,3262],[-292,-4],[0,1623]],[[234087,334442],[-14,-2089],[230,-1262]],[[234303,331091],[-538,-3686],[-283,599]],[[233482,328004],[-1,4815],[-1025,1]],[[260623,337347],[23,-3296],[103,-1581]],[[260749,332470],[-138,-25]],[[260611,332445],[-752,-140]],[[259859,332305],[-301,2532]],[[257338,335707],[-156,-2904],[-342,-2492]],[[256840,330311],[-446,715],[-239,-414]],[[256155,330612],[-245,215]],[[255910,330827],[24,1814],[-148,2177]],[[254026,337733],[-164,-1607],[-17,-2092],[167,-1717],[-89,-1887]],[[253923,330430],[-47,-579]],[[253876,329851],[-478,-216],[-127,792]],[[253271,330427],[-4,1966],[147,1494],[31,3866]],[[254897,333892],[-166,-2346]],[[254731,331546],[-712,-436],[-96,-680]],[[284107,336197],[0,-1816],[235,-1426]],[[284342,332955],[-25,-149]],[[284317,332806],[-216,-595],[-40,-1864]],[[284061,330347],[-198,-1249],[-361,-216]],[[283502,328882],[-237,1612]],[[283265,330494],[-76,1698],[-549,2498]],[[273559,332749],[-1601,389]],[[270189,332376],[-269,-1122]],[[269920,331254],[-1335,-829]],[[268585,330425],[-153,883],[95,1791],[-330,2070]],[[263072,336564],[-195,-3681],[-172,-21],[-175,-2136],[-273,-559]],[[262257,330167],[-331,919]],[[261926,331086],[77,2096],[533,3545]],[[261595,336801],[-473,-3690]],[[261122,333111],[-373,-641]],[[253271,330427],[-332,-80]],[[252939,330347],[-8,1375],[-394,358],[-302,1418]],[[252235,333498],[19,3745]],[[250965,335444],[-26,-4865]],[[250939,330579],[-293,-638]],[[250646,329941],[-809,110]],[[249837,330051],[-79,3309]],[[281625,333447],[-251,-3124],[4,-1252],[-421,-1196]],[[280957,327875],[-522,-413],[-138,955]],[[280297,328417],[-332,3369],[-134,425]],[[224348,332817],[-1,-1627]],[[224347,331190],[-2064,20]],[[222283,331210],[0,810]],[[179740,322568],[3,-2451],[444,-2895],[104,-2181],[266,-2705],[564,-2760]],[[181121,309576],[-326,-2417],[-494,-1592]],[[180301,305567],[-2460,-124],[1,-805],[-4499,-63],[2,-553],[-829,-8],[-928,527],[-315,-3026]],[[171273,301515],[-312,1400]],[[170961,302915],[145,1407],[238,4959],[-64,9968]],[[171280,319249],[98,4],[-3,18110]],[[164248,337232],[-2,-3233],[300,-23],[0,-1605],[244,-1640],[325,-34],[5,-1631],[193,12],[3,-1614],[397,-45],[3,-1614],[314,78],[-22,-1691],[246,-211],[0,-3299]],[[166254,320682],[-755,1375],[-936,2625],[-284,-1411],[-421,-724],[101,-1703],[-443,1647],[-537,-409]],[[162979,322082],[-5,3222],[-296,222],[-393,1772],[197,1534],[-165,1791],[-326,509],[-445,3198],[-340,589],[-168,2432]],[[171280,319249],[-3410,-90],[36,-551]],[[167906,318608],[-267,446],[-750,39],[-88,1202],[-462,376]],[[166339,320671],[-85,11]],[[252235,333498],[-176,-1852],[-459,-1134]],[[251600,330512],[-661,67]],[[242130,335806],[-34,-6487]],[[242096,329319],[-637,87]],[[241459,329406],[3,1623],[-1032,137]],[[240430,331166],[104,1602],[10,3228]],[[268585,330425],[-242,-1949],[-248,-495]],[[268095,327981],[-738,4146]],[[267357,332127],[82,739],[-272,2638]],[[238036,329533],[-270,1020],[-9,-2177],[-298,111],[-9,-1668],[-302,-291]],[[237148,326528],[-149,21],[20,4291]],[[237019,330840],[145,2397],[-141,1639],[249,-27],[204,1843]],[[238075,336857],[-39,-7324]],[[261926,331086],[-253,-1943]],[[261673,329143],[-493,2571],[-58,1397]],[[239556,336116],[-9,-2441],[-149,23],[-7,-2427],[-201,25],[-9,-2653]],[[239181,328643],[-294,242],[-94,1575],[-757,-927]],[[237019,330840],[-164,-1085],[-525,-532],[-176,1675],[-128,-957]],[[236026,329941],[-115,4494]],[[263362,334549],[-670,-5484]],[[262692,329065],[-240,-1164]],[[262452,327901],[-195,2266]],[[212037,334134],[-2,-8177]],[[212035,325957],[-1,-4264]],[[212034,321693],[-669,4],[-3,-1665],[-294,7],[-2,-1619],[-293,8],[-1,-1623],[-585,17],[-91,-1634]],[[210096,315188],[-586,7]],[[209510,315195],[-502,3],[-1,3241]],[[209007,318439],[12,6756]],[[284317,332806],[371,-2176],[955,-1729],[26,-1207]],[[285669,327694],[-54,-767],[-593,-357],[-140,698]],[[284882,327268],[-821,3079]],[[285600,335677],[126,-1604],[273,-883]],[[285999,333190],[-398,-1100],[175,-2296],[-1124,1767],[-310,1394]],[[240430,331166],[-12,-5402],[-114,-39]],[[240304,325725],[-549,-592],[-186,1872],[-330,1452]],[[239239,328457],[-58,186]],[[226992,336063],[8,-6492]],[[227000,329571],[-1,-750]],[[226999,328821],[0,-19]],[[226999,328802],[-475,-44],[-290,766],[-418,56]],[[225816,329580],[-586,-9],[-19,3244]],[[228476,331185],[-1,-1622]],[[228475,329563],[-1475,8]],[[243374,332491],[-161,-3273],[-723,82]],[[242490,329300],[-394,19]],[[257735,335317],[-73,-4276],[185,-1699]],[[257847,329342],[-411,-2087],[-227,201]],[[257209,327456],[-369,2855]],[[247573,330712],[-600,59]],[[246973,330771],[-1496,23]],[[288074,326038],[-5,98]],[[286926,335502],[415,-497]],[[287690,334443],[20,-1175],[-419,-3066],[-333,-1394],[-288,214],[-380,1513],[-221,-1048],[-325,2540],[265,-142],[-10,1305]],[[259859,332305],[-102,-4380]],[[259757,327925],[-680,1377],[-289,-544]],[[258788,328758],[11,1469]],[[258799,330227],[35,4085]],[[258799,330227],[-519,-1708],[-227,633]],[[258053,329152],[-206,190]],[[267357,332127],[-461,-864],[33,-2552]],[[266929,328711],[-948,-959]],[[265981,327752],[263,2891],[-1024,480]],[[265198,331182],[-169,-1111],[-21,-2086]],[[265008,327985],[-272,-947],[-243,467],[-219,-1110]],[[264274,326395],[-566,1467]],[[263708,327862],[264,836],[-23,1266],[-316,3898]],[[263634,334064],[-10,104]],[[255910,330827],[-429,244],[-353,-1106]],[[255128,329965],[-397,1581]],[[283265,330494],[-572,-1459],[-346,398]],[[282347,329433],[-50,3777]],[[248221,329795],[-58,-96]],[[248163,329699],[-190,947]],[[249837,330051],[-442,-508]],[[249395,329543],[-1138,388]],[[263708,327862],[-580,-827]],[[263128,327035],[-436,2030]],[[236026,329941],[-3,-304]],[[236023,329637],[-176,-1477],[-443,-194],[-252,1213],[-191,-612]],[[234961,328567],[-77,886],[-581,1638]],[[231708,329563],[0,-1618]],[[231708,327945],[-1282,3]],[[230426,327948],[0,3298],[-261,-1413],[-247,175]],[[229918,330008],[-3,1154]],[[279103,332257],[-595,-3991]],[[278508,328266],[-251,856],[-213,3066]],[[214486,334091],[-13,-8132]],[[214473,325959],[-2438,-2]],[[217486,334073],[-1,-8135]],[[217485,325938],[-1495,19]],[[215990,325957],[0,8137]],[[219007,334077],[3,-8124]],[[219010,325953],[-1525,-15]],[[220510,330410],[0,-4461]],[[220510,325949],[-1500,4]],[[215990,325957],[-1517,2]],[[271518,333337],[-29,-4139],[-182,-3290]],[[271307,325908],[-296,67]],[[271011,325975],[-264,59]],[[270747,326034],[1,1307],[-511,2796],[-304,-278]],[[269933,329859],[-13,1395]],[[282347,329433],[-80,-3574]],[[282267,325859],[-165,-563],[-420,838],[-332,-61]],[[281350,326073],[-393,1802]],[[252939,330347],[-5,-701]],[[252934,329646],[-672,-91],[-323,-2399],[-173,1]],[[251766,327157],[-166,3355]],[[280297,328417],[-211,-1294]],[[280086,327123],[-581,255],[-754,-1251]],[[278751,326127],[-353,1413],[110,726]],[[271948,333056],[227,-2696]],[[272175,330360],[382,-2967],[-24,-1802]],[[272533,325591],[-107,26]],[[272426,325617],[-1119,291]],[[273595,331632],[-24,-1620]],[[273571,330012],[-1396,348]],[[261673,329143],[-449,-3852]],[[261224,325291],[-188,2237],[-289,964]],[[260747,328492],[203,1622],[-339,2331]],[[233482,328004],[-312,226]],[[233170,328230],[-399,-1549],[-1070,-1312]],[[231701,325369],[7,2576]],[[225816,329580],[10,-9733]],[[225826,319847],[-1469,0]],[[224357,319847],[-4,4513]],[[224353,324360],[-6,6830]],[[244619,330722],[-212,-1147],[105,-2459],[-222,-2903]],[[244290,324213],[-331,36],[-3,-1236],[-368,689],[-238,-588]],[[243350,323114],[-586,854],[-297,-184]],[[242467,323784],[23,5516]],[[260747,328492],[-421,-561],[-85,-1375],[-371,150]],[[259870,326706],[-113,1219]],[[188318,312722],[-291,-1597],[-147,-4378],[653,-3],[-47,-2817]],[[188486,303927],[-642,1],[-1224,898],[-311,-3086],[-1306,2189],[-1641,-13]],[[183362,303916],[1,5933]],[[183363,309849],[-2,22529]],[[268095,327981],[-175,-2988],[-203,-1445],[134,-484]],[[267851,323064],[-277,-501]],[[267574,322563],[-1,-3]],[[267573,322560],[-644,6151]],[[274045,331971],[332,-4442],[324,-1103]],[[274701,326426],[-806,-3867]],[[273895,322559],[-185,1400]],[[273710,323959],[-377,-575],[22,1921]],[[273355,325305],[216,4707]],[[278751,326127],[-5,-339]],[[278746,325788],[-367,682],[-294,-913],[-345,-2208]],[[277740,323349],[-312,426],[-120,1819]],[[277308,325594],[-233,1635],[-199,4840]],[[277308,325594],[-662,369],[-623,-752]],[[276023,325211],[-58,1791],[126,2469],[-367,2466]],[[275411,331911],[-586,-5937]],[[274825,325974],[-124,452]],[[222283,331210],[11,-6489]],[[222294,324721],[-137,-42]],[[222157,324679],[-1040,43],[-1,-1614],[-294,3]],[[220822,323111],[-312,20]],[[220510,323131],[0,2818]],[[276023,325211],[-562,988]],[[275461,326199],[-228,-565],[-408,340]],[[269933,329859],[-238,-2103],[-19,-1656]],[[269676,326100],[-619,-853]],[[269057,325247],[-122,2959],[-350,2219]],[[255128,329965],[-90,-7353]],[[255038,322612],[-1051,46]],[[253987,322658],[9,5394],[-120,1799]],[[230426,327948],[0,-3245],[-137,1],[-1,-3821]],[[230288,320883],[-666,-983],[-127,785]],[[229495,320685],[-3,9491],[426,-168]],[[265981,327752],[-64,-577]],[[265917,327175],[-396,128],[-315,-711],[-198,1393]],[[224353,324360],[-360,353],[-1699,8]],[[229495,320685],[-432,1199]],[[229063,321884],[-238,-1061],[-352,454]],[[228473,321277],[2,8286]],[[241459,329406],[-204,-4750]],[[241255,324656],[-448,-779],[-906,103]],[[239901,323980],[403,1745]],[[256155,330612],[-49,-8076]],[[256106,322536],[-1068,76]],[[234961,328567],[-3,-2253],[-315,-6],[0,-2676]],[[234643,323632],[-1174,5]],[[233469,323637],[0,1895],[-295,3],[-4,2695]],[[262452,327901],[-222,-2978],[129,-2605]],[[262359,322318],[-796,-48]],[[261563,322270],[-276,-32]],[[261287,322238],[-305,-7]],[[260982,322231],[247,1083],[-5,1977]],[[257209,327456],[-20,-5059]],[[257189,322397],[-1046,132]],[[256143,322529],[-37,7]],[[237148,326528],[-7,-1358],[-305,-767]],[[236836,324403],[-229,-383],[-21,-2058],[-606,-644]],[[235980,321318],[43,8319]],[[246973,330771],[-2,-5539]],[[246971,325232],[-1504,74]],[[245467,325306],[8,3838]],[[245467,325306],[-7,-2742],[-291,30]],[[245169,322594],[-399,-324],[-210,-1347]],[[244560,320923],[13,2577],[-283,713]],[[248163,329699],[-214,-2386],[219,-628],[20,-1533],[-293,-394],[-116,-1726],[-268,-565]],[[247511,322467],[186,-1297],[-172,-1230]],[[247525,319940],[-289,-502]],[[247236,319438],[-2,1325]],[[247234,320763],[22,4543],[-285,-74]],[[251766,327157],[-13,-4698]],[[251753,322459],[-101,0]],[[251652,322459],[-541,-5]],[[251111,322454],[-505,-9]],[[250606,322445],[40,7496]],[[283502,328882],[-231,-2074]],[[283271,326808],[-356,-2934],[-358,-1180]],[[282557,322694],[-108,2561],[-182,604]],[[239239,328457],[-5,-1942],[-493,50],[-203,-1310],[-493,-195],[5,-2145]],[[238050,322915],[-1029,135],[-185,1353]],[[269057,325247],[-524,-1429]],[[268533,323818],[-371,-223]],[[268162,323595],[-311,-531]],[[253987,322658],[-600,-192]],[[253387,322466],[-453,-3]],[[252934,322463],[-50,3]],[[252884,322466],[50,7180]],[[273355,325305],[-822,286]],[[285469,320638],[-203,-947],[-926,-817]],[[284340,318874],[-64,5013]],[[284276,323887],[204,503],[398,-2748],[591,-1004]],[[284882,327268],[-235,-2199],[118,-897]],[[284765,324172],[-259,864],[-282,-1162]],[[284224,323874],[-953,2934]],[[258788,328758],[-158,-3843]],[[258630,324915],[-206,2015],[-376,1415],[5,807]],[[249395,329543],[-32,-7083]],[[249363,322460],[-223,-9]],[[249140,322451],[-1629,16]],[[270747,326034],[-688,163]],[[270059,326197],[-383,-97]],[[250606,322445],[-430,-12]],[[250176,322433],[-813,27]],[[252884,322466],[-1131,-7]],[[235980,321318],[-18,-3816]],[[235962,317502],[-19,-4124]],[[235943,313378],[-1327,-11]],[[234616,313367],[-1,3239],[-339,-2]],[[234276,316604],[0,3244],[171,1607],[196,17],[0,2160]],[[226999,328802],[9,-8951]],[[227008,319851],[-1,-3236]],[[227007,316615],[-1172,1]],[[225835,316616],[-9,3231]],[[228473,321277],[-555,610],[-74,2247],[-845,4687]],[[258630,324915],[-1,-2532]],[[258629,322383],[-1296,15]],[[257333,322398],[-144,-1]],[[242467,323784],[-5,-1009]],[[242462,322775],[-296,42],[-6,-1618],[-876,479]],[[241284,321678],[-150,871],[121,2107]],[[259870,326706],[26,-4377]],[[259896,322329],[-1243,53]],[[258653,322382],[-24,1]],[[263128,327035],[11,-1304],[-212,-3409]],[[262927,322322],[-101,-5]],[[262826,322317],[-467,1]],[[200462,326631],[361,-4880]],[[200823,321751],[-379,16],[-5,-7061]],[[200439,314706],[-1450,-14]],[[198989,314692],[-3681,23]],[[229063,321884],[-6,-2046]],[[229057,319838],[-2049,13]],[[267573,322560],[-1043,-136]],[[266530,322424],[-489,3117],[-223,-90]],[[265818,325451],[99,1724]],[[285669,327694],[310,747],[30,-1789],[-452,-994],[295,-347],[-138,-1387],[-575,-2025],[-396,1478],[22,795]],[[260982,322231],[-365,31]],[[260617,322262],[-721,67]],[[281350,326073],[46,-5342],[-149,-3077],[243,-283]],[[281490,317371],[-394,-3133]],[[281096,314238],[-204,2185],[-465,3448]],[[280427,319871],[-419,2517],[-71,1883],[149,2852]],[[239901,323980],[-690,-4023],[1,-1632]],[[239212,318325],[-296,-555]],[[238916,317770],[-881,36]],[[238035,317806],[15,5109]],[[233469,323637],[-441,-557],[-20,-6469]],[[233008,316611],[1,-1619],[-439,-6]],[[232570,314986],[-586,-6],[0,1619],[-585,2]],[[231399,316601],[1,1620]],[[231400,318221],[8,5253],[293,1895]],[[265818,325451],[-331,-348],[-413,-2793]],[[265074,322310],[-349,6]],[[264725,322316],[-533,16]],[[264192,322332],[82,4063]],[[231400,318221],[-877,0]],[[230523,318221],[1,2621],[-236,41]],[[264192,322332],[-835,-2]],[[263357,322330],[-430,-8]],[[280427,319871],[-1132,-400]],[[279295,319471],[-372,2212]],[[278923,321683],[-155,1648],[-22,2457]],[[284224,323874],[52,13]],[[284340,318874],[-211,-330]],[[284129,318544],[-198,2127],[-360,239],[-380,1073],[-481,70]],[[282710,322053],[-153,641]],[[203116,323293],[0,-1615],[261,2],[1,-1549],[-728,1]],[[202650,320132],[-59,615],[-705,54],[-101,-673],[-844,4],[-118,1619]],[[209007,318439],[-587,-6],[1,-1615],[-293,-11],[-4,-1617],[-1242,-7],[0,-4792]],[[206882,310391],[-1173,-5]],[[205709,310386],[1,4846],[62,-6],[-1,8105]],[[270059,326197],[-28,-6431],[221,-1212]],[[270252,318554],[-254,-3696],[-212,-1916]],[[269786,312942],[-390,2635],[-91,3609]],[[269305,319186],[-142,3644],[-154,854],[-476,134]],[[276023,325211],[227,-1073],[186,598],[147,-1356],[71,-2680],[-218,-1752]],[[276436,318948],[-6,0]],[[276430,318948],[-1089,137]],[[275341,319085],[120,7114]],[[278923,321683],[-437,-2238],[-436,97]],[[278050,319542],[-14,1963],[-296,1844]],[[275341,319085],[-679,65]],[[274662,319150],[-651,43],[43,2131],[-159,1235]],[[271464,320921],[-199,-1405],[-198,-4516]],[[271067,315000],[-604,2049],[-211,1505]],[[271011,325975],[333,-4681],[120,-373]],[[282710,322053],[66,-1014],[-81,-3692]],[[282695,317347],[-1205,24]],[[214473,325959],[-4,-8114]],[[214469,317845],[-993,-9]],[[213476,317836],[-1442,8]],[[212034,317844],[0,3849]],[[272173,319555],[-709,1366]],[[272426,325617],[-120,-2206],[-216,-215],[83,-3641]],[[219010,325953],[-5,-8102]],[[219005,317851],[-1126,10]],[[217879,317861],[-406,0]],[[217473,317861],[12,8077]],[[220510,323131],[0,-5304]],[[220510,317827],[-1157,20]],[[219353,317847],[-348,4]],[[215990,325957],[-18,-8107]],[[215972,317850],[-1028,10]],[[214944,317860],[-475,-15]],[[277740,323349],[-316,-946],[31,-1526],[-351,-1962]],[[277104,318915],[-668,33]],[[217473,317861],[-1061,-15]],[[216412,317846],[-440,4]],[[273710,323959],[112,-2797],[-91,-1952]],[[273731,319210],[-1617,15]],[[272114,319225],[59,330]],[[266530,322424],[-186,-15]],[[266344,322409],[-1079,-93]],[[265265,322316],[-191,-6]],[[247234,320763],[-1924,142],[-2,-829]],[[245308,320076],[-139,2518]],[[224357,319847],[-575,10],[0,-4860]],[[223782,314997],[-488,-1],[-284,811]],[[223010,315807],[139,1188],[-267,11],[14,2697],[-285,-467]],[[222611,319236],[-167,661],[-83,3112],[-204,1670]],[[284158,318179],[-29,365]],[[285469,320638],[29,1356],[695,560],[-107,-1081],[521,322],[-484,-2668],[-165,-1717],[-182,-43],[-131,1683],[-204,-1777],[-551,162],[-575,-954],[-157,1698]],[[222611,319236],[-441,-169],[-51,-1639],[-679,-8]],[[221440,317420],[-149,817],[-33,3269],[-436,-2],[0,1607]],[[164640,304627],[231,-1774],[-418,-878],[-322,2121],[509,531]],[[165055,305328],[975,-1440],[-461,-704],[-359,132],[-155,2012]],[[166339,320671],[-2,-7969],[-90,-1806]],[[166247,310896],[-249,759],[-867,-159],[-358,995],[-804,201],[-490,-415],[-116,1396],[-372,1055],[123,2396],[-24,2470],[-170,1150],[59,1338]],[[241284,321678],[-584,-794],[39,-1065]],[[240739,319819],[-931,87],[-3,-1605]],[[239805,318301],[-593,24]],[[238035,317806],[-613,-1484]],[[237422,316322],[-245,500],[-834,92],[-381,588]],[[244560,320923],[-20,-4593],[-199,26],[193,-1935]],[[244534,314421],[-604,81],[-3,-1622],[-230,23]],[[243697,312903],[96,2891],[-159,661],[20,4598],[-307,35],[3,2026]],[[269305,319186],[-840,-2741],[-145,-912]],[[268320,315533],[-168,2206],[10,5856]],[[243697,312903],[-75,13]],[[243622,312916],[-905,125]],[[242717,313041],[1,2458],[-234,29],[98,2072],[20,5167],[-140,8]],[[274662,319150],[434,-3775]],[[275096,315375],[-397,-1018],[74,-879],[-605,-586],[-6,1090],[-378,-1531]],[[273784,312451],[4,1591]],[[273788,314042],[49,2842],[-106,2326]],[[234276,316604],[-1268,7]],[[268320,315533],[-415,-2629]],[[267905,312904],[-174,218]],[[267731,313122],[-145,796]],[[267586,313918],[-653,2805]],[[266933,316723],[-40,540]],[[266893,317263],[305,3008],[323,1133],[53,1159]],[[205709,310386],[-1,-1614],[-1701,0]],[[204007,308772],[-1371,-6],[-3,3352]],[[202633,312118],[-147,1515],[16,6497],[148,2]],[[278050,319542],[43,-1241],[-360,-2634]],[[277733,315667],[-629,3248]],[[221440,317420],[1,-4034],[-493,-32]],[[220948,313354],[-223,1274],[-207,-261]],[[220518,314367],[-8,3460]],[[242717,313041],[-496,63]],[[242221,313104],[-106,14]],[[242115,313118],[5,1627],[-291,31],[-264,1666],[-303,324],[6,1345],[-291,53],[9,1622],[-247,33]],[[256004,318054],[-462,771]],[[255542,318825],[-243,556],[-714,-1852],[-404,1290],[-162,1542],[-347,180]],[[253672,320541],[-285,1925]],[[256143,322529],[-11,-3407],[-128,-1068]],[[245308,320076],[-7,-2463],[141,-1661]],[[245442,315952],[-8,-3255],[151,-26],[-6,-2480],[-150,6]],[[245429,310197],[-103,135],[-579,3570],[-213,519]],[[266893,317263],[-555,643],[-280,1346]],[[266058,319252],[-12,1037],[298,2120]],[[257333,322398],[-17,-8213]],[[257316,314185],[-332,545],[-546,1973]],[[256438,316703],[-434,1351]],[[252925,317998],[-982,22]],[[251943,318020],[-96,1898],[-197,-2],[2,2543]],[[252934,322463],[-9,-4465]],[[253555,314761],[-46,-2207]],[[253509,312554],[-482,7]],[[253027,312561],[-4,5160],[-98,277]],[[253672,320541],[-117,-5780]],[[251943,318020],[-47,-2985]],[[251896,315035],[-984,33]],[[250912,315068],[1,4041],[197,808],[1,2537]],[[249142,318305],[-519,9],[-331,-1193],[-263,918],[-215,-624]],[[247814,317415],[-5,2533],[-284,-8]],[[249140,322451],[2,-4146]],[[250912,315068],[-438,-279]],[[250474,314789],[-147,-6],[-2,4868],[-149,0],[0,2782]],[[250474,314789],[-1,-1631]],[[250473,313158],[-643,1090],[-534,3]],[[249296,314251],[-2,2447],[-152,1607]],[[266058,319252],[-82,-420]],[[265976,318832],[-275,-140]],[[265701,318692],[-106,2241],[-330,1383]],[[258653,322382],[-137,-6674],[89,-612]],[[258605,315096],[-29,-1678],[-447,-519],[-145,1195]],[[257984,314094],[-428,804],[-240,-713]],[[260678,319948],[-562,-4378],[-610,-2702],[-150,-76]],[[259356,312792],[-223,839],[-30,1452],[-498,13]],[[260617,322262],[61,-2314]],[[263365,319856],[101,-595],[-208,-1794],[7,-2679]],[[263265,314788],[-172,734],[-550,214]],[[262543,315736],[264,4518],[19,2063]],[[263357,322330],[8,-2474]],[[264725,322316],[-135,-684],[239,-2782],[-180,-2852]],[[264649,315998],[-86,-842]],[[264563,315156],[-22,278]],[[264541,315434],[-329,3527],[-293,881],[-554,14]],[[262543,315736],[-381,-217]],[[262162,315519],[-1,1815],[-262,888]],[[261899,318222],[232,965],[228,3131]],[[261899,318222],[-334,1613],[-2,2435]],[[265701,318692],[-212,-1318]],[[265489,317374],[-231,350],[-271,-1838],[-338,112]],[[284158,318179],[119,-1091],[-640,-3358],[-489,-1594]],[[283148,312136],[-159,657],[-294,4554]],[[261287,322238],[-239,-2821],[0,-1352],[-233,-2520]],[[260815,315545],[-137,4403]],[[262162,315519],[-52,-657]],[[262110,314862],[-107,4]],[[262003,314866],[-1169,24]],[[260834,314890],[-19,655]],[[230523,318221],[0,-1628],[-294,-3],[-5,-3251]],[[230224,313339],[-873,12]],[[229351,313351],[0,1623],[-293,811]],[[229058,315785],[-1,4053]],[[202633,312118],[-979,1703],[-317,896],[-898,-11]],[[279295,319471],[266,-2709],[-183,-3842]],[[279378,312920],[-224,-635],[-333,-2783]],[[278821,309502],[-4,24]],[[278817,309526],[-1052,5966]],[[277765,315492],[-32,175]],[[212034,317844],[-3,-8091]],[[212031,309753],[0,-189]],[[212031,309564],[-1940,9],[5,5615]],[[272114,319225],[155,-4645]],[[272269,314580],[-1,-1446]],[[272268,313134],[-327,-920],[-286,1648]],[[271655,313862],[-588,1138]],[[247236,319438],[-213,564],[88,-2171],[-320,-435],[282,-923],[-325,-596]],[[246748,315877],[-1306,75]],[[255542,318825],[30,-628],[-317,-3711]],[[255255,314486],[-1700,275]],[[166087,290612],[275,-966],[-300,-16],[25,982]],[[167726,304768],[-743,1873],[-183,2255],[-553,2000]],[[167906,318608],[691,-9433],[-103,-2110],[-329,6],[-439,-2303]],[[247814,317415],[-121,-2322],[126,-841]],[[247819,314252],[0,-806]],[[247819,313446],[-294,-28],[6,-1584],[-272,-13]],[[247259,311821],[-473,1881]],[[246786,313702],[-38,2175]],[[260834,314890],[37,-1199]],[[260871,313691],[-340,-2930],[-579,-3106]],[[259952,307655],[-731,14]],[[259221,307669],[-12,4226],[147,897]],[[281096,314238],[217,-1643],[-222,-1224]],[[281091,311371],[-528,-426],[-618,1727],[-567,248]],[[223010,315807],[-167,-929],[-209,-3035],[76,-1642]],[[222710,310201],[-463,2267],[-58,-1528],[-215,361]],[[221974,311301],[-292,391],[-321,-718],[-413,2380]],[[242115,313118],[-438,43],[-4,-817],[-514,69],[-222,-771]],[[240937,311642],[-45,1095],[-302,569]],[[240590,313306],[-41,1616],[-479,872],[30,2514],[-295,-7]],[[225835,316616],[-146,-4],[-1,-3243]],[[225688,313369],[-284,3],[-145,-1082],[-582,7],[-438,-809]],[[224239,311488],[-1,1890],[-456,-2],[0,1621]],[[229058,315785],[-744,-261],[154,-2163],[-579,4]],[[227889,313365],[-586,3]],[[227303,313368],[-1,3244],[-295,3]],[[264541,315434],[-415,-1027]],[[264126,314407],[-860,-257]],[[263266,314150],[-1,638]],[[266933,316723],[-339,-3833]],[[266594,312890],[-433,-921]],[[266161,311969],[-142,1338]],[[266019,313307],[139,814],[-135,1989],[115,1470],[-162,1252]],[[168718,285870],[613,-3552],[-361,241],[-252,3311]],[[168676,294217],[663,-1336],[118,-1995],[-366,419],[-148,2046],[-267,866]],[[170961,302915],[-533,9],[-383,-3729]],[[170045,299195],[-299,468],[-188,-1225],[-342,666],[55,1824],[-185,2349],[-237,1371],[-531,-107],[-202,-603],[-390,830]],[[273788,314042],[-1519,538]],[[269786,312942],[-1189,-5125]],[[268597,307817],[-93,1503]],[[268504,309320],[-251,3127],[-348,457]],[[276707,313833],[-152,-754],[-450,18],[-676,-2348]],[[275429,310749],[-117,2670],[-216,1956]],[[276430,318948],[164,-2140],[207,-808],[-94,-2167]],[[277765,315492],[-510,-6014]],[[277255,309478],[-68,132]],[[277187,309610],[-190,3520],[-290,703]],[[256438,316703],[-14,-6930]],[[256424,309773],[0,-270]],[[256424,309503],[-1169,98]],[[255255,309601],[0,4885]],[[266019,313307],[-494,36]],[[265525,313343],[-95,2291],[59,1740]],[[271655,313862],[-387,-3128],[-316,-1220],[-138,-1801]],[[270814,307713],[-619,2360],[-220,1485]],[[269975,311558],[-189,1384]],[[209510,315195],[8,-9723]],[[209518,305472],[-585,10],[-1,-1637],[-1755,87],[0,1633],[-298,10]],[[206879,305575],[3,4816]],[[249296,314251],[-147,-1]],[[249149,314250],[-1330,2]],[[240590,313306],[-339,47],[-92,-2176],[-1279,142]],[[238880,311319],[36,6451]],[[231399,316601],[1,-3247],[-148,-1629],[-731,-2]],[[230521,311723],[-297,20],[0,1596]],[[253027,312561],[-593,32]],[[252434,312593],[1,817],[-542,-5]],[[251893,313405],[3,1630]],[[216412,317846],[0,-8101]],[[216412,309745],[-260,3]],[[216152,309748],[-1207,11]],[[214945,309759],[-1,8101]],[[217879,317861],[-4,-8108]],[[217875,309753],[-265,-6]],[[217610,309747],[-1198,-2]],[[214945,309759],[-258,1]],[[214687,309760],[-1212,-2]],[[213475,309758],[1,8078]],[[219353,317847],[-5,-8079]],[[219348,309768],[-278,10]],[[219070,309778],[-1195,-25]],[[220518,314367],[0,-4631]],[[220518,309736],[-1170,32]],[[238880,311319],[-3,-1067]],[[238877,310252],[-196,24]],[[238681,310276],[-1273,172]],[[237408,310448],[14,5874]],[[213475,309758],[-250,-2]],[[213225,309756],[-1194,-3]],[[265525,313343],[-379,-1617]],[[265146,311726],[-589,2243],[6,1187]],[[282602,309349],[-10,65]],[[282592,309414],[10,-65]],[[283148,312136],[-617,-2746]],[[282531,309390],[-232,1787],[-388,-117],[-188,-953]],[[281723,310107],[-370,469]],[[281353,310576],[-262,795]],[[237408,310448],[-890,101],[31,-3035]],[[236549,307514],[-631,-49]],[[235918,307465],[25,5913]],[[257984,314094],[-89,-4491]],[[257895,309603],[-1471,170]],[[267586,313918],[-206,-1092],[-615,-311]],[[266765,312515],[-171,375]],[[227303,313368],[-1,-4054]],[[227302,309314],[-1606,11]],[[225696,309325],[-8,4044]],[[232570,314986],[1,-1620],[-301,-10],[2,-6508]],[[232272,306848],[-593,2]],[[231679,306850],[-1159,9]],[[230520,306859],[1,4864]],[[234616,313367],[-304,7],[0,-4907],[-291,4],[-15,-1618]],[[234006,306853],[-1734,-5]],[[246786,313702],[-19,-2055],[-497,-863],[38,-1147],[-293,-1723],[-253,398],[310,-1738],[-363,-407]],[[245709,306167],[2,-24]],[[245711,306143],[-453,5]],[[245258,306148],[93,410],[78,3639]],[[229351,313351],[-149,-2],[-1,-3219],[-146,-6]],[[229055,310124],[-301,798],[-865,13],[0,2430]],[[224239,311488],[147,-1345],[-2,-3288]],[[224384,306855],[-433,-385],[-521,1416]],[[223430,307886],[-657,27],[-63,2288]],[[263266,314150],[3,-2538]],[[263269,311612],[-982,-375]],[[262287,311237],[-273,215],[96,3410]],[[278817,309526],[-155,-873]],[[278662,308653],[-702,873],[-466,-1309]],[[277494,308217],[-239,1261]],[[265146,311726],[62,-1577]],[[265208,310149],[-838,21]],[[264370,310170],[1,855]],[[264371,311025],[-245,3382]],[[275429,310749],[0,-38]],[[275429,310711],[-371,-1301],[-162,-2339]],[[274896,307071],[-379,-1286]],[[274517,305785],[-288,-570],[-418,2121],[121,1598]],[[273932,308934],[155,2002],[-303,1515]],[[212031,309564],[-10,-8889]],[[212021,300675],[-14,-4738]],[[212007,295937],[-1275,-7]],[[210732,295930],[1,1618],[-581,-19],[4,3038],[-348,-1],[0,4885],[-290,21]],[[251893,313405],[-148,-262],[-98,-2422]],[[251647,310721],[-1175,275]],[[250472,310996],[1,2162]],[[259221,307669],[-550,-1893]],[[258671,305776],[-416,2982]],[[258255,308758],[-360,845]],[[262003,314866],[-203,-2819],[-428,-1224],[-148,-1566],[-209,5]],[[261015,309262],[-144,4429]],[[262287,311237],[-115,-5511]],[[262172,305726],[-1045,-291]],[[261127,305435],[-112,3827]],[[204007,308772],[-2,-8089],[-357,6],[0,-3269],[-895,189],[3,-3357]],[[202756,294252],[-282,-80],[-3451,20]],[[199023,294192],[-10,14576],[-24,5924]],[[199023,294192],[-802,21],[0,-5147]],[[198221,289066],[-2916,138]],[[195305,289204],[1,10598]],[[255255,309601],[-293,45]],[[254962,309646],[-1501,262]],[[253461,309908],[48,2646]],[[221974,311301],[-1,-5776]],[[221973,305525],[-842,203],[-613,2379]],[[220518,308107],[0,1629]],[[273932,308934],[-751,-1022],[-232,-720],[-385,1197]],[[272564,308389],[-296,4745]],[[245258,306148],[-220,-1243],[179,-1808],[-328,48],[-478,1055]],[[244411,304200],[-66,1223]],[[244345,305423],[-235,2560],[-507,303],[19,4630]],[[264371,311025],[-903,8],[-199,579]],[[250472,310996],[3,-4065]],[[250475,306931],[-737,17]],[[249738,306948],[1,538],[-589,29]],[[249150,307515],[-1,6735]],[[249150,307515],[-2,-540],[-585,15]],[[248563,306990],[-568,-79]],[[247995,306911],[2,1971],[-165,660],[-13,3904]],[[267731,313122],[-172,-4100]],[[267559,309022],[-165,-649],[-348,481],[-159,-756]],[[266887,308098],[-122,4417]],[[277187,309610],[-200,-184],[-957,-3894]],[[276030,305532],[-239,1408],[128,659],[-179,3128],[-311,-16]],[[272564,308389],[-61,-778]],[[272503,307611],[-371,-2255]],[[272132,305356],[-182,81],[-533,1971],[-394,-959]],[[271023,306449],[-209,1264]],[[261127,305435],[65,-2172]],[[261192,303263],[-366,-423]],[[260826,302840],[-582,504]],[[260244,303344],[-292,4311]],[[247116,305288],[0,-1624]],[[247116,303664],[-574,36]],[[246542,303700],[-7,2441],[-826,26]],[[247259,311821],[2,-3022],[-144,17],[-1,-3528]],[[247995,306911],[-1,-1623],[-878,0]],[[266161,311969],[-151,-1209],[137,-1333]],[[266147,309427],[-550,-3123]],[[265597,306304],[-143,-537],[-540,1289]],[[264914,307056],[377,2075],[-83,1018]],[[252434,312593],[-3,-7005]],[[252431,305588],[-490,-270]],[[251941,305318],[-294,8]],[[251647,305326],[0,5395]],[[229055,310124],[0,-2981]],[[229055,307143],[-102,-1894]],[[228953,305249],[-1646,5]],[[227307,305254],[-5,4060]],[[230520,306859],[-129,-798],[-366,1]],[[230025,306062],[-236,1076],[-734,5]],[[225696,309325],[4,-2728]],[[225700,306597],[-87,-539],[-544,798],[-165,-1383]],[[224904,305473],[-175,-372],[-345,1754]],[[235918,307465],[-20,-4634]],[[235898,302831],[-24,-5642]],[[235874,297189],[-725,1210]],[[235149,298399],[-86,1119],[-236,-357],[-301,2194],[-518,1395]],[[234008,302750],[-2,4103]],[[240937,311642],[-27,-4926]],[[240910,306716],[-579,117]],[[240331,306833],[-388,76],[-25,1423],[-898,817],[-143,1103]],[[192649,296056],[0,-2068],[-471,-21],[-761,-1597],[-17,-3435]],[[191400,288935],[-518,-982],[-412,-2924],[-457,4942],[-260,4020]],[[189753,293991],[-316,3938],[-198,-1382],[-452,2730],[42,1284],[-343,3366]],[[268504,309320],[-576,-1453],[-270,224]],[[267658,308091],[-99,931]],[[242221,313104],[-71,-8013]],[[242150,305091],[-288,-50]],[[241862,305041],[-455,1583],[-497,92]],[[244345,305423],[-785,1742],[-49,-1484],[-582,-12],[0,-544]],[[242929,305125],[-779,-34]],[[266887,308098],[-133,-492]],[[266754,307606],[-217,1203],[-390,618]],[[281353,310576],[-256,-2617],[-334,-211],[-135,-1225],[-339,131],[-50,-1711],[-247,-2039]],[[279992,302904],[-1171,6598]],[[269975,311558],[-244,-1242],[240,-2297],[-54,-2071],[-167,-824]],[[269750,305124],[-567,147],[-179,-1082]],[[269004,304189],[-407,3628]],[[253461,309908],[-84,-4366]],[[253377,305542],[-946,46]],[[223430,307886],[-2,-7046]],[[223428,300840],[-1456,0]],[[221972,300840],[1,4685]],[[263252,305383],[-219,26]],[[263033,305409],[-515,58]],[[262518,305467],[-346,259]],[[263269,311612],[-17,-6229]],[[264370,310170],[-2,-2778]],[[264368,307392],[-267,-203],[-179,-1894]],[[263922,305295],[-670,88]],[[271023,306449],[-385,-3232]],[[270638,303217],[-108,-157]],[[270530,303060],[5,560],[-727,-210],[-58,1714]],[[281981,302597],[-3,82]],[[281978,302679],[3,-82]],[[282531,309390],[61,24]],[[282602,309349],[-405,-2625],[-165,-1820],[-109,2614]],[[281923,307518],[-200,2589]],[[251647,305326],[-876,-15]],[[250771,305311],[-294,-4],[-2,1624]],[[276030,305532],[200,-730]],[[276230,304802],[-500,-1758],[-394,2382],[-444,601],[4,1044]],[[280269,301329],[-18,102]],[[280251,301431],[18,-102]],[[281981,302597],[-3,82]],[[281923,307518],[8,-4063],[-186,-1610],[-387,486],[-737,-285],[-373,-588]],[[280248,301458],[-33,175]],[[280215,301633],[-11,68]],[[280204,301701],[-212,1203]],[[237408,310448],[27,-3045],[293,-50],[-7,-3257]],[[237721,304096],[-23,-4862],[-351,60]],[[237347,299294],[-4,1]],[[237343,299295],[-252,2449],[-133,5739],[-409,31]],[[238681,310276],[-66,-2357],[143,-159],[46,-2922],[169,-1709]],[[238973,303129],[-231,-2]],[[238742,303127],[-202,-247],[-819,1216]],[[206879,305575],[2,-12857],[-37,-4822],[-1146,-121]],[[205698,287775],[-6,3219],[-1134,-5],[-3,1595],[-1724,6]],[[202831,292590],[-75,1662]],[[240331,306833],[-20,-6441]],[[240311,300392],[-587,-612]],[[239724,299780],[-512,1234],[-239,2115]],[[264914,307056],[-97,-2181]],[[264817,304875],[-449,1093],[0,1424]],[[254962,309646],[-4,-5674]],[[254958,303972],[1,-1619]],[[254959,302353],[-880,88]],[[254079,302441],[-98,2460],[-614,116]],[[253367,305017],[10,525]],[[183362,303916],[0,-11575]],[[183362,292341],[-1739,3],[0,1620],[-863,-20],[-2,-8075],[-687,-61]],[[180071,285808],[-439,260],[-94,887],[82,3389],[-151,600],[21,1938],[272,564]],[[179762,293446],[283,2149],[77,2691],[-106,4262],[275,1900],[10,1119]],[[181121,309576],[282,-790],[1201,-586],[252,1502],[507,147]],[[219070,309778],[-4,-8907]],[[219066,300871],[-1455,-38]],[[217611,300833],[-1,8914]],[[220518,308107],[-138,101],[-4,-7331]],[[220376,300877],[-1310,-6]],[[258255,308758],[-186,-143],[-223,-2439],[-292,-747],[-162,-1946],[-429,-1122],[-130,-1067]],[[256833,301294],[-358,591],[-165,1920]],[[256310,303805],[109,-16],[5,5714]],[[217611,300833],[-1456,-59]],[[216155,300774],[-3,8974]],[[216155,300774],[-1454,-107]],[[214701,300667],[-14,9093]],[[214701,300667],[-1476,8]],[[213225,300675],[0,9081]],[[277494,308217],[-65,-785],[217,-4446],[468,-2796]],[[278114,300190],[-479,-436],[-840,1115],[-215,922]],[[276580,301791],[-276,1144]],[[276304,302935],[225,772],[-299,1095]],[[213225,300675],[-1204,0]],[[256310,303805],[-1352,167]],[[280269,301329],[-18,102]],[[280248,301458],[-33,175]],[[280204,301701],[21,-471],[-685,-2076],[-529,-3189]],[[279011,295965],[-269,-6],[-253,2494]],[[278489,298453],[-185,3127],[-229,1784],[245,1596],[342,3693]],[[278489,298453],[-265,205],[-88,1174]],[[278136,299832],[-22,358]],[[266754,307606],[118,-2920]],[[266872,304686],[-494,-1390]],[[266378,303296],[-72,1226],[-571,652],[-138,1130]],[[227307,305254],[-1,-3184]],[[227306,302070],[-352,1622],[-507,-2568],[-302,758]],[[226145,301882],[90,1860],[-381,232],[-154,2623]],[[269004,304189],[84,-1082]],[[269088,303107],[-225,529]],[[268863,303636],[-374,-245]],[[268489,303391],[-548,1345]],[[267941,304736],[-283,3355]],[[267941,304736],[-418,57],[-368,-881]],[[267155,303912],[-283,774]],[[274517,305785],[-85,-1864],[134,-4155],[-61,-615]],[[274505,299151],[-581,663],[-511,1884]],[[273413,301698],[-135,2326],[-372,1680],[-227,40],[-176,1867]],[[258671,305776],[-62,-2960]],[[258609,302816],[-230,-1971],[-471,-601],[9,-685]],[[257917,299559],[-515,1404],[-542,-471]],[[256860,300492],[-27,802]],[[221972,300840],[4,-1864]],[[221976,298976],[-229,1201],[-392,509],[-834,191]],[[220521,300877],[-145,0]],[[224904,305473],[0,-4595]],[[224904,300878],[-1476,-38]],[[260244,303344],[-448,-474],[-461,-1877]],[[259335,300993],[-374,2733],[-352,-910]],[[273413,301698],[-85,-3220]],[[273328,298478],[-403,-1011]],[[272925,297467],[-503,1412],[-567,2766]],[[271855,301645],[277,3711]],[[249738,306948],[7,-5485]],[[249745,301463],[-730,-2],[-437,570]],[[248578,302031],[-15,4959]],[[237343,299295],[-645,694],[-800,2842]],[[271855,301645],[-224,-1169]],[[271631,300476],[-514,965],[-162,2030],[-317,-254]],[[264817,304875],[-499,-1732]],[[264318,303143],[-198,104],[-7,-5871]],[[264113,297376],[-299,18],[-3,-1823]],[[263811,295571],[-420,-901]],[[263391,294670],[-672,167]],[[262719,294837],[116,1165]],[[262835,296002],[415,1552],[228,1602]],[[263478,299156],[298,1538],[245,2560],[-99,2041]],[[230025,306062],[101,-882],[-211,-1084],[101,-2120]],[[230016,301976],[-185,350],[-328,-1482],[-268,388],[-184,1849]],[[229051,303081],[-98,2168]],[[244411,304200],[-353,-701],[-25,-3601]],[[244033,299898],[-1166,156]],[[242867,300054],[62,5071]],[[276304,302935],[-783,-2653],[-394,-674],[-382,-2307]],[[274745,297301],[-240,1850]],[[265597,306304],[-143,-2280],[195,-1399]],[[265649,302625],[-510,-2676]],[[265139,299949],[-116,-620]],[[265023,299329],[-659,3103],[-46,711]],[[248578,302031],[0,-1380],[-586,-270],[-1,-1632]],[[247991,298749],[-443,543],[316,1089],[-750,38]],[[247114,300419],[2,3245]],[[250771,305311],[3,-4878],[-150,-1369]],[[250624,299064],[-878,-312]],[[249746,298752],[-1,2711]],[[231679,306850],[149,-590],[1,-3198],[271,-1475],[224,-5]],[[232324,301582],[-241,-630]],[[232083,300952],[-247,888],[-429,-565],[-250,-1798],[-558,-651]],[[230599,298826],[-125,948],[-568,1263],[110,939]],[[234008,302750],[-177,481],[-257,-1569]],[[233574,301662],[-669,200],[-133,968],[-448,-1248]],[[241862,305041],[-376,-48],[-11,-1571],[394,-3307]],[[241869,300115],[-693,133]],[[241176,300248],[-865,144]],[[226145,301882],[-3,-7872]],[[226142,294010],[-1232,-6]],[[224910,294004],[-6,6874]],[[266378,303296],[-305,-1111]],[[266073,302185],[-424,440]],[[246542,303700],[-5,-6913],[-292,-2],[0,-1616]],[[246245,295169],[-1257,-5]],[[244988,295164],[-45,601]],[[244943,295765],[269,600],[-236,1264],[282,816],[-40,1454],[303,-381],[-185,3715],[560,1252],[-185,1658]],[[244943,295765],[-41,-823],[-579,866]],[[244323,295808],[8,4035],[-298,55]],[[262518,305467],[-156,-2441],[-200,-873]],[[262162,302153],[-936,-51]],[[261226,302102],[-34,1161]],[[253367,305017],[-116,-5834]],[[253251,299183],[-738,-1766]],[[252513,297417],[38,555],[-611,6],[-2,2435]],[[251938,300413],[3,4905]],[[210732,295930],[-587,-11],[-3,-3235],[-124,-7],[0,-8009],[-134,-3]],[[209884,284665],[-2861,-34],[-28,-8244]],[[206995,276387],[-1400,-32],[4,8251],[101,1],[-2,3168]],[[263478,299156],[-127,1132],[-280,33]],[[263071,300321],[-38,5088]],[[179762,293446],[-4058,-181]],[[175704,293265],[-2642,-5],[-586,89],[-362,1122],[-386,245]],[[171728,294716],[266,2870],[-339,971],[-382,2958]],[[263071,300321],[-494,-473]],[[262577,299848],[-380,581]],[[262197,300429],[-35,1724]],[[270530,303060],[-303,-446],[112,-1814],[-159,-1241],[160,-3138]],[[270340,296421],[-326,1802]],[[270014,298223],[-319,2645],[-607,2239]],[[251938,300413],[-588,25],[-1,-1081],[-287,-277]],[[251062,299080],[-438,-16]],[[229051,303081],[-27,-98]],[[229024,302983],[-420,-2885],[-33,-1359],[-271,1490],[50,1869],[-342,-239],[-177,-1289],[-249,388],[-61,1401]],[[227521,302359],[-215,-289]],[[242867,300054],[0,-1626]],[[242867,298428],[-989,63]],[[241878,298491],[-9,1624]],[[254079,302441],[15,-7371]],[[254094,295070],[-915,185]],[[253179,295255],[72,3928]],[[268489,303391],[-191,-579],[-387,-2963],[106,-885]],[[268017,298964],[-130,-738]],[[267887,298226],[-343,98],[-450,1171]],[[267094,299495],[12,1605]],[[267106,301100],[49,2812]],[[189753,293991],[-1506,-3],[-6,-4849],[-1376,-18],[-349,1600],[-5,-14590]],[[186511,276131],[-3149,-34]],[[183362,276097],[0,16244]],[[267106,301100],[-728,2196]],[[238742,303127],[-74,-8950]],[[238668,294177],[-668,110]],[[238000,294287],[-287,2380]],[[237713,296667],[-388,1099],[22,1528]],[[256860,300492],[-290,-2959],[-338,-792],[-245,-1878]],[[255987,294863],[-144,1386],[-293,274]],[[255550,296523],[0,1620],[-291,55],[-9,3268],[-291,887]],[[268863,303636],[139,-2860],[323,-3556]],[[269325,297220],[-471,-581]],[[268854,296639],[-87,-160]],[[268767,296479],[-371,1043],[-216,-422],[-163,1864]],[[227521,302359],[-8,-8969]],[[227513,293390],[-1201,1]],[[226312,293391],[-170,619]],[[259335,300993],[56,-1317],[-280,-1720]],[[259111,297956],[-212,-1709],[70,-886],[-507,-2769]],[[258462,292592],[1,2075],[-386,811]],[[258077,295478],[-160,4081]],[[247114,300419],[-4,-8971]],[[247110,291448],[-285,-6],[1,-1092],[-449,-9]],[[246377,290341],[-133,6],[1,4822]],[[270014,298223],[-538,-798]],[[269476,297425],[-151,-205]],[[271631,300476],[-1005,-5255]],[[270626,295221],[-44,238]],[[270582,295459],[-242,962]],[[265023,299329],[-257,-2572],[-190,585]],[[264576,297342],[-271,24]],[[264305,297366],[-192,10]],[[260085,295669],[3,546],[-557,17],[-158,1641],[-262,83]],[[260826,302840],[-296,-1219],[-6,-4236],[-439,-1716]],[[267094,299495],[-351,-1180]],[[266743,298315],[-277,2223]],[[266466,300538],[-393,1647]],[[261226,302102],[134,-4629]],[[261360,297473],[95,-3169]],[[261455,294304],[-945,242]],[[260510,294546],[-581,51]],[[259929,294597],[156,1072]],[[235149,298399],[-2,-6961]],[[235147,291438],[-172,646]],[[234975,292084],[-223,645],[-660,-165]],[[234092,292564],[-504,-211]],[[233588,292353],[-6,48]],[[233582,292401],[-8,9261]],[[239724,299780],[-34,-6034]],[[239690,293746],[-694,-158]],[[238996,293588],[-328,589]],[[230599,298826],[-15,-6106]],[[230584,292720],[-1252,143]],[[229332,292863],[-306,203]],[[229026,293066],[-2,9917]],[[229026,293066],[-1224,262]],[[227802,293328],[-289,62]],[[237713,296667],[-606,-1072]],[[237107,295595],[-319,701],[-638,-836],[-276,1729]],[[276580,301791],[-335,-2181],[7,-1181],[-302,-3864]],[[275950,294565],[-336,-991]],[[275614,293574],[-478,40],[-285,2097]],[[274851,295711],[-106,1590]],[[171728,294716],[-240,-2194]],[[171488,292522],[-527,2873],[-607,2125],[-309,1675]],[[233582,292401],[-515,1393],[-746,743],[-269,-627]],[[232052,293910],[31,7042]],[[266466,300538],[-488,-4111]],[[265978,296427],[-652,2741]],[[265326,299168],[-187,781]],[[255550,296523],[-579,144],[-98,-1641],[-485,59]],[[254388,295085],[-294,-15]],[[262197,300429],[-36,-1811],[-801,-1145]],[[249746,298752],[0,-823]],[[249746,297929],[-780,-17]],[[248966,297912],[-952,5]],[[248014,297917],[-23,832]],[[278136,299832],[-261,-1730],[-65,-2062],[-295,-1491],[-382,-3556]],[[277133,290993],[-221,469],[-599,3177],[-363,-74]],[[232052,293910],[-3,-967]],[[232049,292943],[-1216,-1077]],[[230833,291866],[-249,854]],[[274851,295711],[-156,130],[-298,-1759],[-415,2480],[-367,85],[-287,1831]],[[272925,297467],[-517,-3023]],[[272408,294444],[-1070,-5441]],[[271338,289003],[-265,919]],[[271073,289922],[-257,2318],[43,1727],[-233,1254]],[[258077,295478],[-439,-1479],[-435,-2504],[-547,-1593]],[[256656,289902],[-109,9]],[[256547,289911],[-268,1111],[-470,3450],[178,391]],[[220521,300877],[16,-8165]],[[220537,292712],[-1467,9]],[[219070,292721],[-4,8150]],[[221976,298976],[5,-6234]],[[221981,292742],[-1444,-30]],[[224910,294004],[2,-1314]],[[224912,292690],[-1486,25]],[[223426,292715],[2,8125]],[[219070,292721],[-1453,-12]],[[217617,292709],[-6,8124]],[[217617,292709],[-1443,-46]],[[216174,292663],[-19,8111]],[[223426,292715],[-1445,27]],[[216174,292663],[-1446,-96]],[[214728,292567],[-27,8100]],[[213225,300675],[57,-8129]],[[213282,292546],[-1287,-1]],[[211995,292545],[12,3392]],[[214728,292567],[-1446,-21]],[[241176,300248],[-11,-1320],[-519,-4119],[192,-1475],[382,-1184]],[[241220,292150],[-1146,188]],[[240074,292338],[-391,56],[7,1352]],[[266743,298315],[382,-3066],[-30,-933]],[[267095,294316],[-707,-913]],[[266388,293403],[-414,1707]],[[265974,295110],[4,1317]],[[262719,294837],[-459,-1602]],[[262260,293235],[-776,49]],[[261484,293284],[-29,1020]],[[262577,299848],[-12,-3860],[270,14]],[[248014,297917],[76,-4059],[-205,-781],[1,-1557]],[[247886,291520],[-437,-568]],[[247449,290952],[-227,-1244],[-112,1740]],[[252513,297417],[69,-2402],[-508,-278]],[[252074,294737],[0,1098],[-967,-56]],[[251107,295779],[-45,3301]],[[241878,298491],[54,-3824],[-182,-2390],[74,-1398]],[[241824,290879],[-230,-523],[-374,1794]],[[244323,295808],[-11,-3253]],[[244312,292555],[-1484,172]],[[242828,292727],[39,5701]],[[264965,295106],[-389,2236]],[[265326,299168],[-46,-1734],[-315,-2328]],[[278269,287761],[-76,264]],[[278193,288025],[76,-264]],[[279011,295965],[-403,-3616],[-92,-2363],[-262,1132],[231,-2620],[-212,-589],[-375,805]],[[277898,288714],[-123,574]],[[277775,289288],[-642,1705]],[[195305,289204],[0,-8031]],[[195305,281173],[-1,-6538]],[[195304,274635],[-185,-4]],[[195119,274631],[-313,2178],[43,3573],[-198,582],[-595,5810],[0,10694]],[[267887,298226],[124,-662],[-175,-1445],[3,-2070]],[[267839,294049],[-421,-2128]],[[267418,291921],[-323,2395]],[[253179,295255],[-83,-4574]],[[253096,290681],[-1016,-26]],[[252080,290655],[-6,4082]],[[265974,295110],[21,-726],[-419,-926],[-105,-1288]],[[265471,292170],[-170,1415]],[[265301,293585],[-336,1521]],[[251107,295779],[-195,-539]],[[250912,295240],[-465,-211],[-350,-1146]],[[250097,293883],[-350,16],[-1,4030]],[[268767,296479],[-480,-2909]],[[268287,293570],[-448,479]],[[237107,295595],[1,-5232]],[[237108,290363],[-341,756],[-196,-1322],[-639,965],[-521,-443]],[[235411,290319],[-264,1119]],[[275614,293574],[-88,-2688],[-301,-779]],[[275225,290107],[-353,382],[-40,1052],[-800,-2861]],[[274032,288680],[-22,-72]],[[274010,288608],[-398,2352],[-785,2546]],[[272827,293506],[-419,938]],[[242828,292727],[23,-1854],[-369,-1417],[-65,-1108]],[[242417,288348],[-241,1667],[-352,864]],[[270582,295459],[-741,-3542]],[[269841,291917],[-395,3623],[30,1885]],[[259929,294597],[-147,0],[-210,-3806],[-384,39],[-157,-3572]],[[259031,287258],[-882,-28]],[[258149,287230],[-35,1334],[210,2007],[198,283],[-60,1738]],[[250097,293883],[-203,-504],[0,-2742]],[[249894,290637],[-533,-8]],[[249361,290629],[-5,2179],[-385,256],[-5,4848]],[[249361,290629],[-291,-1322]],[[249070,289307],[-1184,2213]],[[269841,291917],[-165,-789]],[[269676,291128],[-84,-4]],[[269592,291124],[-424,845],[-314,4670]],[[195119,274631],[-3726,22]],[[191393,274653],[0,1610]],[[191393,276263],[7,12672]],[[264305,297366],[79,-1214],[-282,-4275]],[[264102,291877],[-95,1]],[[264007,291878],[19,2058],[-215,1635]],[[265301,293585],[-113,-1287],[-385,-1433]],[[264803,290865],[-134,697],[-567,315]],[[238000,294287],[55,-4237],[-203,-2133],[-208,87],[128,-2330]],[[237772,285674],[-29,1]],[[237743,285675],[-635,-3]],[[237108,285672],[0,4691]],[[269592,291124],[-134,-694]],[[269458,290430],[-356,976],[-547,-1372]],[[268555,290034],[-268,3536]],[[256547,289911],[-602,-2120],[-102,-2362],[-288,-52]],[[255555,285377],[-818,64]],[[254737,285441],[-325,194],[-15,2539]],[[254397,288174],[-9,6911]],[[211995,292545],[-22,-7993]],[[211973,284552],[0,-8133]],[[211973,276419],[1,-8101]],[[211974,268318],[0,-1611],[-730,-3]],[[211244,266704],[-1105,-3]],[[210139,266701],[0,9724],[-254,-1],[-1,8241]],[[252080,290655],[-401,-9]],[[251679,290646],[-766,-8]],[[250913,290638],[-1,4602]],[[244988,295164],[-59,-1673],[289,734],[-25,-3356],[150,-2943],[-317,-598],[225,-984],[-128,-819]],[[245123,285525],[1,-135]],[[245124,285390],[-272,18]],[[244852,285408],[-481,19]],[[244371,285427],[-67,-3]],[[244304,285424],[8,7131]],[[264007,291878],[-125,-1789],[-179,18]],[[263703,290107],[-245,1867],[-67,2696]],[[258149,287230],[-73,-1530]],[[258076,285700],[-259,915],[-757,37],[2,-409]],[[257062,286243],[-403,2157],[-3,1502]],[[271073,289922],[-669,-320],[-229,1237],[-260,-547]],[[269915,290292],[-239,836]],[[254397,288174],[-931,-2937]],[[253466,285237],[-470,-87]],[[252996,285150],[100,5531]],[[250913,290638],[-58,-1637],[-291,-9],[-2,-1641],[-289,-10]],[[250273,287341],[4,3290],[-383,6]],[[246377,290341],[40,-3234]],[[246417,287107],[-592,20],[0,-1670]],[[245825,285457],[-702,68]],[[266388,293403],[-34,-4888]],[[266354,288515],[-753,-748]],[[265601,287767],[-17,902]],[[265584,288669],[-113,3501]],[[263703,290107],[-14,-676]],[[263689,289431],[-975,45],[-28,-605]],[[262686,288871],[-213,626]],[[262473,289497],[-213,3738]],[[277775,289288],[-200,-1209],[-345,-446],[-431,-3537]],[[276799,284096],[-357,-1958],[-73,1501]],[[276369,283639],[-170,-184],[-119,1854],[-263,408]],[[275817,285717],[-479,2444],[-113,1946]],[[175704,293265],[8,-6545],[-64,-13],[-10,-8499]],[[175638,278208],[-2839,-1564],[17,2580],[-320,834],[-131,1949],[82,972],[-206,4489],[-531,4208],[-222,846]],[[261484,293284],[160,-5558]],[[261644,287726],[11,-400]],[[261655,287326],[-1005,-14]],[[260650,287312],[-168,-13]],[[260482,287299],[28,7247]],[[260482,287299],[-991,-305]],[[259491,286994],[-460,264]],[[233588,292353],[-6,-56]],[[233582,292297],[-853,-556],[-398,-899],[-290,-1445]],[[232041,289397],[8,3546]],[[272827,293506],[-15,-5200],[98,-784]],[[272910,287522],[-478,-196],[-495,933],[-201,-1171]],[[271736,287088],[-363,872],[-35,1043]],[[267418,291921],[45,-835],[-297,-951],[-55,-1335]],[[267111,288800],[-431,-34]],[[266680,288766],[-326,-251]],[[202831,292590],[15,-6293]],[[202846,286297],[-1525,-4281],[1,-811],[-1146,18],[-2,-3253]],[[200174,277970],[-860,-3]],[[199314,277967],[-358,449],[43,2766],[-165,3253],[-161,393],[-104,4257],[-348,-19]],[[238996,293588],[-214,-3466],[-110,32],[-25,-4497]],[[238647,285657],[-84,3]],[[238563,285660],[-791,14]],[[268555,290034],[21,-284]],[[268576,289750],[-391,-1856],[-455,-1078]],[[267730,286816],[-127,1308],[-492,676]],[[183362,276097],[1,-8677]],[[183363,267420],[-4124,8475],[12,2285],[251,1897]],[[179502,280077],[536,715],[179,2808],[-146,2208]],[[191393,276263],[-1966,-35],[0,-192],[-2916,95]],[[226312,293391],[-10,-8053]],[[226302,285338],[-375,38]],[[225927,285376],[-1032,85]],[[224895,285461],[17,7229]],[[240074,292338],[-28,-6700]],[[240046,285638],[-697,10]],[[239349,285648],[-702,9]],[[265584,288669],[-611,417]],[[264973,289086],[-229,4]],[[264744,289090],[59,1775]],[[274010,288608],[-793,-2802]],[[273217,285806],[-307,1716]],[[179502,280077],[-3864,-1869]],[[227802,293328],[-42,-8197]],[[227760,285131],[-406,74]],[[227354,285205],[-1052,133]],[[229332,292863],[-28,-7781]],[[229304,285082],[-524,-54]],[[228780,285028],[-1020,103]],[[262473,289497],[-829,-1771]],[[232039,284934],[-231,5],[-115,-1982],[146,-674]],[[231839,282283],[-397,24]],[[231442,282307],[-615,60]],[[230827,282367],[1,2607]],[[230828,284974],[5,6892]],[[232041,289397],[-2,-4463]],[[230828,284974],[-612,11]],[[230216,284985],[-912,97]],[[219070,292721],[-5,-8097]],[[219065,284624],[-381,10]],[[218684,284634],[-1066,126]],[[217618,284760],[-1,7949]],[[220537,292712],[6,-8141]],[[220543,284571],[-433,-2]],[[220110,284569],[-1045,55]],[[234975,292084],[-31,-7088]],[[234944,284996],[-291,1575],[-562,-613]],[[234091,285958],[1,6606]],[[217618,284760],[-376,-124]],[[217242,284636],[-1070,-48]],[[216172,284588],[2,8075]],[[223426,292715],[8,-8203]],[[223434,284512],[-404,2]],[[223030,284514],[-1045,0]],[[221985,284514],[-4,8228]],[[224895,285461],[-2,-1035],[-413,38]],[[224480,284464],[-1046,48]],[[221985,284514],[-393,-1]],[[221592,284513],[-1049,58]],[[244304,285424],[-1696,42]],[[242608,285466],[-191,2882]],[[216172,284588],[-373,15]],[[215799,284603],[-1072,-39]],[[214727,284564],[1,8003]],[[206995,276387],[10,-9680]],[[207005,266707],[-196,-1]],[[206809,266706],[-3008,34]],[[203801,266740],[-1057,-19]],[[202744,266721],[2,17810],[100,1766]],[[213282,292546],[0,-7999]],[[213282,284547],[-1309,5]],[[214727,284564],[-369,-14]],[[214358,284550],[-1076,-3]],[[234091,285958],[-73,-393]],[[234018,285565],[-60,-960],[-377,12]],[[233581,284617],[1,7680]],[[242608,285466],[-1828,115]],[[240780,285581],[-734,57]],[[233581,284617],[-993,-40]],[[232588,284577],[-549,357]],[[235411,290319],[-5,-7248]],[[235406,283071],[-145,-6]],[[235261,283065],[-39,471]],[[235222,283536],[-278,1460]],[[249070,289307],[-205,-1883],[-209,-3399],[-189,-953]],[[248467,283072],[-1109,2439]],[[247358,285511],[-151,1938],[245,381],[-3,3122]],[[264744,289090],[-346,-257]],[[264398,288833],[-567,369],[-126,-463]],[[263705,288739],[-16,692]],[[275817,285717],[197,-1750],[-222,-2037],[-677,748]],[[275115,282678],[4,3610],[-520,96],[-567,2296]],[[247358,285511],[-237,-29],[-2,-1592],[-572,-19]],[[246547,283871],[-8,3240],[-122,-4]],[[269458,290430],[-641,-2764]],[[268817,287666],[-241,2084]],[[269915,290292],[98,-679],[-163,-3128],[52,-2327],[-122,-1900]],[[269780,282258],[-329,-1370]],[[269451,280888],[-242,1119]],[[269209,282007],[-81,3666],[-311,1993]],[[237108,285672],[0,-2572]],[[237108,283100],[-1702,-29]],[[271736,287088],[202,-924]],[[271938,286164],[-630,-2537]],[[271308,283627],[-251,828],[-618,-687],[-182,-1941]],[[270257,281827],[-477,431]],[[252996,285150],[-21,-1156]],[[252975,283994],[-1295,-58]],[[251680,283936],[-1,6710]],[[251680,283936],[-283,11]],[[251397,283947],[-1128,95]],[[250269,284042],[4,3299]],[[250269,284042],[-1132,-33],[-12,-840]],[[249125,283169],[-658,-97]],[[257062,286243],[14,-3977],[-399,14]],[[256677,282280],[-836,-103],[-284,801]],[[255557,282978],[-2,2399]],[[269209,282007],[-689,-991],[-95,755],[-402,-936]],[[268023,280835],[-353,3484]],[[267670,284319],[60,2497]],[[263705,288739],[-84,-3973]],[[263621,284766],[55,-1652]],[[263676,283114],[-539,-692]],[[263137,282422],[-449,518]],[[262688,282940],[-2,5931]],[[262688,282940],[-898,-37]],[[261790,282903],[-135,4423]],[[199314,277967],[-878,-18],[0,-1622],[-852,-5],[-2,-8136],[36,-4019]],[[197618,264167],[-857,-7],[-37,4023],[3,8134],[-307,3],[2,1614],[-576,1],[-4,3232],[-537,6]],[[264398,288833],[-62,-3686]],[[264336,285147],[-715,-381]],[[264973,289086],[-7,-4742],[-221,-293]],[[264745,284051],[2,1069],[-411,27]],[[265601,287767],[265,-1985],[29,-1347]],[[265895,284435],[-506,-1945]],[[265389,282490],[-646,23]],[[264743,282513],[2,1538]],[[267670,284319],[-205,1161],[-587,-1541]],[[266878,283939],[-198,4827]],[[266878,283939],[-137,-520]],[[266741,283419],[-297,-993]],[[266444,282426],[-403,800],[-146,1209]],[[275274,275950],[263,628]],[[275537,276578],[-263,-628]],[[275115,282678],[-128,-2424],[77,-2306]],[[275064,277948],[21,-1800],[-453,1074]],[[274632,277222],[-397,2101],[-304,486]],[[273931,279809],[-206,2389],[-508,3608]],[[273217,285806],[-382,-1361],[-117,-2127],[-399,-1752]],[[272319,280566],[-381,5598]],[[254737,285441],[-323,-2640],[122,-3923],[141,-1191],[-210,-1224]],[[254467,276463],[-114,140]],[[254353,276603],[-184,1820],[-373,-689],[-63,3380],[-367,2778],[100,1345]],[[261790,282903],[136,-2308]],[[261926,280595],[-1276,-335]],[[260650,280260],[0,7052]],[[260650,280260],[-288,-579],[2,-1890]],[[260364,277791],[-286,-278],[4,-1615],[-248,-23]],[[259834,275875],[-17,4870],[-320,8]],[[259497,280753],[-6,6241]],[[259497,280753],[-1025,-27]],[[258472,280726],[-231,1150],[-165,3824]],[[246547,283871],[-291,-1615],[175,-342],[-73,-2890]],[[246358,279024],[-674,12],[3,3264],[138,3157]],[[235222,283536],[-1204,-38]],[[234018,283498],[0,2067]],[[258472,280726],[-106,-860]],[[258366,279866],[-839,-31],[-2,-819],[-563,46]],[[256962,279062],[-281,-17],[0,1226]],[[256681,280271],[-4,2009]],[[202744,266721],[-672,-16],[-49,-2499],[301,-1532]],[[202324,262674],[-2142,-5]],[[200182,262669],[-8,15301]],[[272319,280566],[44,-2784]],[[272363,277782],[-442,-1977]],[[271921,275805],[-817,2977]],[[271104,278782],[-65,752],[269,4093]],[[273931,279809],[-121,-807]],[[273810,279002],[-90,-725],[-314,2440],[-742,-3662]],[[272664,277055],[-301,727]],[[248467,283072],[-232,-2682],[-637,-1400],[-479,-1603]],[[247119,277387],[-290,-1241]],[[246829,276146],[-463,2072]],[[246366,278218],[-8,806]],[[238701,271113],[-400,6]],[[238301,271119],[-149,1514],[-322,444],[-466,-2739],[-255,8]],[[237109,270346],[-1,3654]],[[237108,274000],[0,5599]],[[237108,279599],[0,3501]],[[237743,285675],[-72,-1365],[156,-1652],[-2,-3964],[475,-5512],[401,-2069]],[[238563,285660],[193,-3037],[29,-8285],[191,-5]],[[238976,274333],[-155,-3244]],[[238821,271089],[-120,24]],[[239516,277586],[89,-2415],[-250,-840],[-379,2]],[[239349,285648],[4,-5606],[141,-1],[22,-2455]],[[240779,280837],[-287,-13],[-146,-3236]],[[240346,277588],[-830,-2]],[[240780,285581],[-1,-4744]],[[242619,280157],[-575,-2639],[-400,30]],[[241644,277548],[0,1623],[-290,937],[-575,729]],[[242608,285466],[11,-5309]],[[234018,283498],[-3,-6187]],[[234015,277311],[-896,740],[-334,1437]],[[232785,279488],[-113,619]],[[232672,280107],[-84,4470]],[[246366,278218],[-28,-988],[-363,175],[-2,-2477],[-251,41],[-36,2444],[-221,12]],[[245465,277425],[-297,1279],[258,1421],[-227,255],[-6,1864],[185,934],[-62,1883],[-223,-1603],[31,1932]],[[268023,280835],[-29,-951]],[[267994,279884],[-750,-2311]],[[267244,277573],[-503,5846]],[[244371,285427],[-163,-2146],[-308,-2022],[-90,-2138]],[[243810,279121],[-368,-2106],[-400,-900]],[[243042,276115],[-26,3010],[-397,1032]],[[255557,282978],[-142,-817],[-5,-3254],[-143,-3],[2,-3233]],[[255269,275671],[-569,-21],[-233,813]],[[244852,285408],[-216,-2699],[-7,-2066],[-283,-3112]],[[244346,277531],[-420,5],[-116,1585]],[[225927,285376],[-30,-8275]],[[225897,277101],[-4,-879]],[[225893,276222],[-1133,26]],[[224760,276248],[-282,40]],[[224478,276288],[2,8176]],[[245465,277425],[-76,-261]],[[245389,277164],[-175,-453],[-903,-2]],[[244311,276709],[35,822]],[[227354,285205],[-18,-8168]],[[227336,277037],[-185,1]],[[227151,277038],[-1254,63]],[[264743,282513],[-219,-2967]],[[264524,279546],[-235,1091]],[[264289,280637],[-264,580],[-349,1897]],[[254353,276603],[-497,-1834],[-41,-1059],[323,-1231]],[[254138,272479],[-1368,-35]],[[252770,272444],[91,5016]],[[252861,277460],[114,6534]],[[228780,285028],[-17,-8117]],[[228763,276911],[-135,15]],[[228628,276926],[-1292,111]],[[230216,284985],[-6,-3141]],[[230210,281844],[-31,-4996]],[[230179,276848],[-1416,63]],[[230827,282367],[0,-512],[-617,-11]],[[232672,280107],[-600,940],[-233,1236]],[[218684,284634],[-13,-8157]],[[218671,276477],[-1432,44]],[[217239,276521],[3,8115]],[[210139,266701],[-717,-2]],[[209422,266699],[-123,-1]],[[209299,266698],[-2294,9]],[[220110,284569],[-7,-8139]],[[220103,276430],[-1432,47]],[[217239,276521],[0,-67]],[[217239,276454],[-1432,21]],[[215807,276475],[-8,8128]],[[215807,276475],[-1432,-36]],[[214375,276439],[-17,8111]],[[214375,276439],[-24,-1]],[[214351,276438],[-2378,-19]],[[221592,284513],[0,-8235]],[[221592,276278],[-48,0]],[[221544,276278],[-1441,152]],[[223030,284514],[0,-8234]],[[223030,276280],[-51,1]],[[222979,276281],[-1387,-3]],[[224478,276288],[-1448,-8]],[[271104,278782],[-447,-786]],[[270657,277996],[-226,1046],[-174,2785]],[[266444,282426],[-235,-3362]],[[266209,279064],[-288,518]],[[265921,279582],[-345,931],[-187,1977]],[[251397,283947],[0,-6509]],[[251397,277438],[-1123,-9]],[[250274,277429],[-5,6613]],[[250274,277429],[-14,-1]],[[250260,277428],[-1136,16],[0,1060]],[[249124,278504],[1,4665]],[[252861,277460],[-1464,-22]],[[235261,283065],[11,-1603]],[[235272,281462],[1,-2617]],[[235273,278845],[-795,-2144]],[[234478,276701],[-463,610]],[[267244,277573],[-756,-2456]],[[266488,275117],[-124,3123],[-155,824]],[[264289,280637],[-142,-524],[-197,-2955],[-99,3]],[[263851,277161],[-538,-506]],[[263313,276655],[-159,-301]],[[263154,276354],[0,1215]],[[263154,277569],[-17,4853]],[[237108,279599],[-280,902],[-87,-872],[-299,1007],[-286,-1037],[-341,13],[-543,1850]],[[249124,278504],[-150,-881]],[[248974,277623],[-206,-33],[-579,-3455]],[[248189,274135],[-495,8],[0,1630],[-575,8],[0,1606]],[[256681,280271],[-69,-2498],[-191,-1960],[-869,-125],[4,-3255],[-143,-9]],[[255413,272424],[-143,-6],[-1,3253]],[[263154,277569],[-1076,448]],[[262078,278017],[-152,2578]],[[265921,279582],[1,-27]],[[265922,279555],[-184,34],[-659,-3026]],[[265079,276563],[-284,2687],[-271,296]],[[231442,282307],[2,-8954]],[[231444,273353],[-1048,21]],[[230396,273374],[-217,3474]],[[270657,277996],[-80,-1269]],[[270577,276727],[-329,-341],[-291,-3111],[55,-642]],[[270012,272633],[0,-5]],[[270012,272628],[-338,-491],[-153,1147]],[[269521,273284],[74,1606],[-301,1073],[-437,275]],[[268857,276238],[507,2501],[87,2149]],[[232785,279488],[1,-3857],[404,-2322]],[[233190,273309],[-1746,44]],[[268857,276238],[-59,1856],[-542,1928],[-262,-138]],[[237108,274000],[-848,-1143],[-402,1182]],[[235858,274039],[-244,1]],[[235614,274040],[-342,532],[1,4273]],[[197618,264167],[24,-1497]],[[197642,262670],[0,-8383],[-2345,-24]],[[195297,254263],[7,20372]],[[259834,275875],[18,-769],[-399,-590]],[[259453,274516],[-479,386],[-118,1013],[-485,-1586]],[[258371,274329],[-5,5537]],[[241644,277548],[-1,-1627]],[[241643,275921],[-577,18],[2,-798],[-433,-2]],[[240635,275139],[-285,12],[-4,2437]],[[273810,279002],[98,-1654]],[[273908,277348],[8,-2098]],[[273916,275250],[-11,-827]],[[273905,274423],[15,-90]],[[273920,274333],[-20,-184]],[[273900,274149],[-60,-391]],[[273840,273758],[-438,-2518],[192,-2128]],[[273594,269112],[-42,-1026],[-431,800]],[[273121,268886],[-76,2025]],[[273045,270911],[44,2084],[-425,4060]],[[265079,276563],[-41,-438]],[[265038,276125],[-259,143],[-399,-2644]],[[264380,273624],[-384,781]],[[263996,274405],[-145,2756]],[[262078,278017],[222,-1817]],[[262300,276200],[-162,-699],[-765,-79],[10,-1076],[-289,-21]],[[261094,274325],[-155,1623],[-575,1843]],[[256962,279062],[29,-2257],[255,-3763]],[[257246,273042],[-260,-2156],[4,-3296]],[[256990,267590],[-755,-8],[-206,1771],[-614,2276]],[[255415,271629],[-2,795]],[[243042,276115],[-252,-2319],[-86,-1941]],[[242704,271855],[-773,7]],[[241931,271862],[-288,2425],[0,1634]],[[268650,272453],[-454,-2106]],[[268196,270347],[-296,-908],[-412,5134]],[[267488,274573],[-244,3000]],[[268857,276238],[-273,-3364],[66,-421]],[[258371,274329],[-238,-1220]],[[258133,273109],[-631,1134],[-256,-1201]],[[274213,271739],[154,-1026],[-395,-1964],[241,2990]],[[273840,273758],[261,-1594],[-185,-2613],[-322,-439]],[[273920,274333],[-20,-184]],[[273916,275250],[-11,-827]],[[274414,275982],[264,-153],[280,-1525],[-294,-989],[-167,-1799],[-139,1959],[56,2507]],[[274160,276707],[170,-315],[46,-4156],[-277,1436],[-122,1905],[183,1130]],[[274632,277222],[33,-1172],[-536,816],[-157,-984],[-64,1466]],[[265516,275419],[-478,706]],[[265922,279555],[-53,-2958],[-353,-1178]],[[266488,275117],[0,-942]],[[266488,274175],[-328,-2106]],[[266160,272069],[-649,44]],[[265511,272113],[5,3306]],[[234478,276701],[5,-3100]],[[234483,273601],[0,-4335]],[[234483,269266],[-1322,-45]],[[233161,269221],[-81,1801],[110,2287]],[[244311,276709],[-53,-2457]],[[244258,274252],[-441,-8],[-351,-1304],[-29,-1625],[-344,-1797]],[[243093,269518],[-234,271],[-155,2066]],[[235614,274040],[-175,-434],[-956,-5]],[[271921,275805],[37,-1771],[275,-2845]],[[272233,271189],[-961,-1642]],[[271272,269547],[-98,1564],[-427,592]],[[270747,271703],[140,2716],[-310,2308]],[[250260,277428],[-1,-6571]],[[250259,270857],[-1135,-31]],[[249124,270826],[0,2438],[-150,4359]],[[246829,276146],[-140,-526],[-66,-2601],[-184,267],[-97,-2398]],[[246342,270888],[-114,-1301],[-411,-1386],[-315,625]],[[245502,268826],[-2,115]],[[245500,268941],[-62,69]],[[245438,269010],[-314,191],[117,1426]],[[245241,270627],[337,223],[252,2167],[-256,411],[68,1606],[-306,123],[53,2007]],[[263154,276354],[-211,-1787],[-562,-838]],[[262381,273729],[-81,2471]],[[200182,262669],[-2540,1]],[[273045,270911],[-142,208],[-547,-2636]],[[272356,268483],[-123,2706]],[[261094,274325],[1,-3262]],[[261095,271063],[-1173,-45],[-180,787]],[[259742,271805],[-289,2711]],[[249124,270826],[0,-3253]],[[249124,267573],[-1393,50]],[[247731,267623],[-42,2293],[500,4219]],[[240635,275139],[6,-4082],[-110,-1625]],[[240531,269432],[-347,19]],[[240184,269451],[-691,9]],[[239493,269460],[-75,1632],[-597,-3]],[[267488,274573],[-96,548],[-482,-3351]],[[266910,271770],[-422,2405]],[[252770,272444],[-27,-1509]],[[252743,270935],[-1345,-64]],[[251398,270871],[-1,6567]],[[251398,270871],[-1139,-14]],[[247731,267623],[-1360,-26]],[[246371,267597],[-29,3291]],[[245500,268941],[-62,69]],[[245241,270627],[-1027,-144]],[[244214,270483],[-102,1786],[146,1983]],[[263996,274405],[-106,-4613]],[[263890,269792],[-3,-599]],[[263887,269193],[-267,9],[-340,1832]],[[263280,271034],[-27,-2]],[[263253,271032],[60,5623]],[[270747,271703],[-157,186]],[[270590,271889],[-578,744]],[[227151,277038],[5,-4409]],[[227156,272629],[-469,-48],[-452,-1537]],[[226235,271044],[-342,5178]],[[228628,276926],[2,-5287]],[[228630,271639],[-1087,-1713]],[[227543,269926],[-107,-742],[-280,1303]],[[227156,270487],[0,2142]],[[230396,273374],[193,-555]],[[230589,272819],[-1430,-4745]],[[229159,268074],[-124,-407],[-405,3972]],[[255415,271629],[-143,-188],[4,-2272],[-284,-8],[4,-2362],[-126,-263]],[[254870,266536],[-1130,-22]],[[253740,266514],[-126,1159],[208,569],[68,3760],[248,477]],[[263253,271032],[-736,-37]],[[262517,270995],[98,588],[-330,1226],[96,920]],[[217239,276454],[-26,-8133]],[[217213,268321],[-224,-2]],[[216989,268319],[-1200,8]],[[215789,268327],[18,8148]],[[218671,276477],[-13,-8190]],[[218658,268287],[-436,22]],[[218222,268309],[-1009,12]],[[220103,276430],[-15,-8194]],[[220088,268236],[-232,-5]],[[219856,268231],[-1198,56]],[[215789,268327],[-226,-12]],[[215563,268315],[-1212,-2]],[[214351,268313],[0,8125]],[[214351,268313],[-211,4]],[[214140,268317],[-1427,-23]],[[212713,268294],[-739,24]],[[265511,272113],[-316,-756],[-183,-1475]],[[265012,269882],[-430,1091]],[[264582,270973],[-206,1238],[4,1413]],[[221544,276278],[-6,-8068]],[[221538,268210],[-230,15]],[[221308,268225],[-1220,11]],[[224760,276248],[1,-3983],[-213,-701]],[[224548,271564],[-1040,-3414]],[[223508,268150],[-541,29]],[[222967,268179],[12,8102]],[[226235,271044],[225,-2721]],[[226460,268323],[-392,-1293]],[[226068,267030],[-565,-1869]],[[225503,265161],[-119,1166],[-213,-723],[-623,5960]],[[222967,268179],[-215,-7]],[[222752,268172],[-1214,38]],[[191393,274653],[-1,-12959]],[[191392,261694],[-1985,-98],[1,-3801],[-565,-10],[0,-1773]],[[188843,256012],[-5480,11408]],[[269521,273284],[-686,-1046]],[[268835,272238],[-185,215]],[[262517,270995],[-386,-1847],[16,-1277]],[[262147,267871],[-360,-24],[-203,1604],[-424,-24]],[[261160,269427],[-65,1636]],[[259742,271805],[-223,-444],[6,-3714]],[[259525,267647],[5,-1554],[-546,-20]],[[258984,266073],[-309,-26],[-4,1611],[-286,-16]],[[258385,267642],[-7,3608],[-245,1859]],[[241931,271862],[-1,-2445]],[[241930,269417],[-1399,15]],[[268196,270347],[-120,-1132]],[[268076,269215],[-774,-4371]],[[267302,264844],[-222,1408],[-144,2418]],[[266936,268670],[128,1356],[-154,1744]],[[264582,270973],[-5,-1325],[-687,144]],[[195297,254263],[-3928,9]],[[191369,254272],[23,7422]],[[258385,267642],[-117,-1603]],[[258268,266039],[-1141,-46]],[[257127,265993],[-137,1597]],[[235858,274039],[-247,-3594],[-55,-4247],[247,15]],[[235803,266213],[165,-2415]],[[235968,263798],[-1351,24]],[[234617,263822],[-133,12],[-1,5432]],[[244214,270483],[8,-2105],[-240,-3867]],[[243982,264511],[-59,1623],[-511,-1824],[-304,1856]],[[243108,266166],[-15,3352]],[[266936,268670],[-756,231]],[[266180,268901],[-20,3168]],[[237109,270346],[75,-4024]],[[237184,266322],[-1381,-109]],[[233161,269221],[87,-951]],[[233248,268270],[-1739,-1463]],[[231509,266807],[-6,123]],[[231503,266930],[-162,2702],[-752,3187]],[[269315,266119],[-168,-187]],[[269147,265932],[-152,1040],[-160,5266]],[[269521,273284],[-206,-7165]],[[270012,272628],[143,-2844],[-121,-4705]],[[270034,265079],[-575,986]],[[269459,266065],[-144,54]],[[238301,271119],[215,-817],[-12,-1665],[522,-3202]],[[239026,265435],[-240,-345],[-1,-1274]],[[238785,263816],[-1220,-19]],[[237565,263797],[-381,2525]],[[231503,266930],[-1231,-4027]],[[230272,262903],[-620,348]],[[229652,263251],[-493,4823]],[[227156,270487],[-696,-2164]],[[270590,271889],[127,-3675],[608,-624]],[[271325,267590],[-175,-616]],[[271150,266974],[-403,-4200]],[[270747,262774],[-221,704]],[[270526,263478],[-177,1370],[-315,231]],[[253740,266514],[-294,-3348],[252,-2067]],[[253698,261099],[-1047,-27]],[[252651,261072],[-25,3649]],[[252626,264721],[117,6214]],[[269147,265932],[-285,-745]],[[268862,265187],[-233,1642],[-442,1367],[-111,1019]],[[261160,269427],[-51,-2452],[-440,-328],[-199,-2179]],[[260470,264468],[-371,2],[3,1617],[-263,0],[-26,1492],[-288,68]],[[266180,268901],[-4,-1685]],[[266176,267216],[-979,51]],[[265197,267267],[-185,2615]],[[271272,269547],[173,-1187]],[[271445,268360],[-120,-770]],[[243108,266166],[-323,-822]],[[242785,265344],[-856,1]],[[241929,265345],[1,4072]],[[257127,265993],[-143,-9],[6,-2440]],[[256990,263544],[-1655,-26]],[[255335,263518],[-332,-39],[-133,3057]],[[229652,263251],[-593,-1974]],[[229059,261277],[-293,2871],[-669,-2188]],[[228097,261960],[2,1607],[-452,1892],[172,815],[-272,611],[-4,3041]],[[225503,265161],[144,-1411],[-855,-2936]],[[224792,260814],[-81,738],[-490,-430]],[[224221,261122],[-713,7028]],[[245502,268826],[-127,-1816],[-313,-1032],[-167,-1704]],[[244895,264274],[-271,-484],[77,-1751]],[[244701,262039],[-172,-288]],[[244529,261751],[-462,332]],[[244067,262083],[-85,2428]],[[272356,268483],[444,-3810]],[[272800,264673],[248,-709],[-50,-2336],[-442,1524]],[[272556,263152],[-244,2510],[-518,507],[-349,2191]],[[239493,269460],[179,-3272],[-322,2],[-3,-1287],[-321,532]],[[273103,263918],[241,-619],[-261,-1765],[-124,1738],[144,646]],[[273429,267956],[229,-1122],[-211,-969],[-18,2091]],[[273121,268886],[209,-711],[80,-2196],[219,-966],[-158,-953],[-438,1416],[-233,-803]],[[263887,269193],[-34,-3123]],[[263853,266070],[-27,-877],[-408,18]],[[263418,265211],[-156,2]],[[263262,265213],[18,5821]],[[263262,265213],[-700,78]],[[262562,265291],[-449,1252]],[[262113,266543],[34,1328]],[[265197,267267],[107,-2251]],[[265304,265016],[-1157,121],[0,-795]],[[264147,264342],[-294,1728]],[[252626,264721],[-415,-683],[-803,-568]],[[251408,263470],[-10,7401]],[[246371,267597],[-50,-4881]],[[246321,262716],[-773,1409],[-653,149]],[[251408,263470],[-92,-39]],[[251316,263431],[-1040,-418]],[[250276,263013],[-17,7844]],[[250276,263013],[-235,-98]],[[250041,262915],[-702,-302]],[[249339,262613],[-25,4964],[-190,-4]],[[228097,261960],[-913,-2937]],[[227184,259023],[-236,2294],[-214,-718]],[[226734,260599],[-666,6431]],[[268862,265187],[-531,-2010]],[[268331,263177],[-444,-557]],[[267887,262620],[-507,1246]],[[267380,263866],[-78,978]],[[241929,265345],[-139,-2434]],[[241790,262911],[-715,10],[-2,-1631],[-985,-12]],[[240088,261278],[65,2739],[214,1718],[-183,3716]],[[240088,261278],[187,-1588],[292,-495],[230,-1479]],[[240797,257716],[-541,-2780],[-190,-402]],[[240066,254534],[-710,332]],[[239356,254866],[-1,3236],[-281,-4],[-4,3279],[-287,5],[2,2434]],[[262113,266543],[-202,-2490],[-1,-1443]],[[261910,262610],[38,-331]],[[261948,262279],[-247,-1122],[-557,79],[-1,-1623]],[[261143,259613],[-925,-27]],[[260218,259586],[239,3100],[13,1782]],[[234617,263822],[-104,-1184],[69,-2704],[234,-2043]],[[234816,257891],[-383,-1878]],[[234433,256013],[-270,786],[-111,1768],[-372,550]],[[233680,259117],[-7,1203],[-351,1944],[-118,1559],[44,4447]],[[267380,263866],[-842,-12]],[[266538,263854],[-369,127]],[[266169,263981],[7,3235]],[[273082,261033],[-133,-2580],[-38,2027],[171,553]],[[272823,261759],[40,-1068],[-396,-433]],[[272467,260258],[-390,846]],[[272077,261104],[-418,1229],[-343,2022],[41,1842],[-207,777]],[[272556,263152],[267,-1393]],[[218222,268309],[-10,-7269]],[[218212,261040],[-111,-2492],[-1121,-108]],[[216980,258440],[1,1757]],[[216981,260197],[8,8122]],[[216981,260197],[-1417,9]],[[215564,260206],[-1,8109]],[[215564,260206],[-1425,-1]],[[214139,260205],[1,8112]],[[214139,260205],[-86,1]],[[214053,260206],[-1251,7]],[[212802,260213],[-89,1]],[[212713,260214],[0,8080]],[[212713,260214],[-1472,-6]],[[211241,260208],[3,6496]],[[219856,268231],[-1,-7250]],[[219855,260981],[-1643,59]],[[233680,259117],[-1054,-950],[-246,-706]],[[232380,257461],[15,2779],[-147,-648]],[[232248,259592],[-249,2566],[-298,601],[38,1653],[-230,2395]],[[222752,268172],[-19,-11396]],[[222733,256776],[-311,-1069],[-354,1218],[-198,-944],[-249,1262]],[[221621,257243],[-334,1575]],[[221287,258818],[21,9407]],[[221287,258818],[-1085,65]],[[220202,258883],[-344,21],[-3,2077]],[[224221,261122],[-255,-235],[-56,-1438],[-589,-2355]],[[223321,257094],[-276,-434]],[[223045,256660],[-312,116]],[[260218,259586],[-114,-1]],[[260104,259585],[-994,-4]],[[259110,259581],[-7,3224],[-142,-9],[23,3277]],[[259110,259581],[-134,-3309]],[[258976,256272],[-231,290],[-9,1358],[-330,-1424],[-4,1398],[-276,-34]],[[258126,257860],[-1,2419],[142,7],[1,5753]],[[247731,267623],[274,-3564],[26,-1966]],[[248031,262093],[-342,-655]],[[247689,261438],[-106,-329],[-1263,-25]],[[246320,261084],[1,1632]],[[249339,262613],[-284,-111]],[[249055,262502],[-612,-242]],[[248443,262260],[-412,-167]],[[266169,263981],[-1,-930],[-528,-12]],[[265640,263039],[-382,825]],[[265258,263864],[46,1152]],[[225328,255832],[-536,4982]],[[226734,260599],[-1152,-3886]],[[225582,256713],[-254,-881]],[[272077,261104],[-207,-2290],[-271,-705]],[[271599,258109],[-852,4665]],[[232248,259592],[-1251,-3816]],[[230997,255776],[-725,7127]],[[209299,266698],[-217,-16660]],[[209082,250038],[-2270,-8220]],[[206812,241818],[27,3208],[-30,21680]],[[206812,241818],[-175,-639]],[[206637,241179],[-655,3287],[-500,980],[-452,2433],[-137,1784],[-466,1523],[-267,2269],[-357,1834]],[[203803,255289],[-2,11451]],[[203803,255289],[-617,1714],[-455,4718],[-407,953]],[[211241,260208],[-789,7]],[[210452,260215],[-226,1786],[-294,419],[-120,2210],[-127,-359],[-263,2428]],[[210452,260215],[261,-433],[176,-3774],[535,32],[186,-1031],[512,-16]],[[212122,254993],[-1599,-11260]],[[210523,243733],[-1441,6305]],[[262562,265291],[-9,-2748],[-135,18]],[[262418,262561],[-508,49]],[[255335,263518],[-42,-2446],[-142,-14],[4,-2674],[-156,-741],[132,-1479],[-365,-603],[-167,-1944]],[[254599,253617],[-506,-1945]],[[254093,251672],[-63,1221],[229,2447],[-147,-275],[95,2172],[-484,2051],[-25,1811]],[[237565,263797],[235,-2648],[-112,-2155]],[[237688,258994],[-417,-313]],[[237271,258681],[-296,953],[-858,614]],[[236117,260248],[-149,3550]],[[244067,262083],[-416,-314],[-35,-1776],[-277,-170],[-1,-3574],[-157,-1570],[81,-1640]],[[243262,253039],[-258,530],[-178,-1296],[-48,1873]],[[242778,254146],[7,11198]],[[269459,266065],[0,-2384],[-247,7],[-4,-2375]],[[269208,261313],[-295,-710]],[[268913,260603],[-583,-23],[1,2597]],[[264147,264342],[212,-842],[-100,-3841]],[[264259,259659],[-425,-12]],[[263834,259647],[-269,0]],[[263565,259647],[-156,2805],[9,2759]],[[270526,263478],[-236,-999],[1,-5623]],[[270291,256856],[-262,1105]],[[270029,257961],[-821,3352]],[[258126,257860],[-564,-26]],[[257562,257834],[-384,25],[-188,2000],[3,2240]],[[256993,262099],[-3,1445]],[[263565,259647],[-754,-29]],[[262811,259618],[-348,-20],[-45,2963]],[[242778,254146],[-219,178]],[[242559,254324],[-305,2653]],[[242254,256977],[-195,277],[-241,2436],[-28,3221]],[[265258,263864],[-181,-812],[-39,-2866]],[[265038,260186],[-69,-497],[-710,-30]],[[252692,256194],[-1093,-40]],[[251599,256154],[-283,-4]],[[251316,256150],[0,7281]],[[252651,261072],[41,-4878]],[[246320,261084],[-2,-1627]],[[246318,259457],[-1160,-19]],[[245158,259438],[-408,1159],[-49,1442]],[[227703,254041],[-519,4982]],[[229059,261277],[365,-3474]],[[229424,257803],[-1329,-4514]],[[228095,253289],[-182,-662],[-210,1414]],[[266538,263854],[73,-1664]],[[266611,262190],[-131,-3052]],[[266480,259138],[-414,-483]],[[266066,258655],[-411,1022],[-15,3362]],[[267887,262620],[-7,-2008]],[[267880,260612],[-912,139],[0,1414],[-357,25]],[[266066,258655],[-13,-4419]],[[266053,254236],[-962,80]],[[265091,254316],[4,2024]],[[265095,256340],[-57,3846]],[[236117,260248],[245,-1198],[-44,-6786]],[[236318,252264],[-313,1644],[-176,1815],[-632,881],[-381,1287]],[[239356,254866],[-430,-7],[-146,-1627],[-240,7],[-65,-1704]],[[238475,251535],[-133,-175]],[[238342,251360],[-234,2339],[-88,3955],[-332,1340]],[[271599,258109],[109,-1596]],[[271708,256513],[-299,-2289]],[[271409,254224],[-861,806]],[[270548,255030],[-29,1448],[-228,378]],[[256993,262099],[-405,-644],[-234,-1414],[-90,-2314],[-724,-4799]],[[255540,252928],[-525,-297]],[[255015,252631],[-416,986]],[[251316,256150],[-565,11]],[[250751,256161],[-705,0]],[[250046,256161],[-5,6754]],[[229993,252193],[-569,5610]],[[230997,255776],[-230,-1047]],[[230767,254729],[-774,-2536]],[[268913,260603],[84,-3784]],[[268997,256819],[-88,-1964]],[[268909,254855],[-525,11],[-61,691],[-839,350]],[[267484,255907],[-15,965]],[[267469,256872],[411,3740]],[[242254,256977],[-1212,-1624],[-245,2363]],[[250046,256161],[-146,0]],[[249900,256161],[-376,-7]],[[249524,256154],[-46,1959],[-425,1319],[2,3070]],[[262811,259618],[-6,-2207]],[[262805,257411],[-584,-282],[-45,579]],[[262176,257708],[-228,4571]],[[262176,257708],[-117,-3881]],[[262059,253827],[-919,118]],[[261140,253945],[3,5668]],[[249524,256154],[-188,2]],[[249336,256156],[-474,-1],[3,-814],[-378,9]],[[248487,255350],[-44,6910]],[[267469,256872],[-538,70]],[[266931,256942],[-451,2196]],[[244529,261751],[-61,-2123],[-259,460],[229,-1495],[-276,-598],[18,-3120],[-205,749],[175,-2364],[-388,-522],[182,-1099]],[[243944,251639],[-102,-1383],[173,-932],[-202,-1255]],[[243813,248069],[-73,-541]],[[243740,247528],[12,447]],[[243752,247975],[-182,929]],[[243570,248904],[129,2677],[-437,1458]],[[248487,255350],[-226,-1014]],[[248261,254336],[-568,265]],[[247693,254601],[-4,6837]],[[257562,257834],[96,-2877],[-99,-436],[7,-2858]],[[257566,251663],[-178,1282],[-1848,-17]],[[245158,259438],[-12,-4903]],[[245146,254535],[-217,450],[-648,-955],[-50,-1687],[-287,-704]],[[191369,254272],[-1713,-9],[-813,1749]],[[225328,255832],[-812,-3459]],[[224516,252373],[-177,743],[-194,2530],[-443,142],[-381,1306]],[[247693,254601],[-46,0]],[[247647,254601],[-802,-13]],[[246845,254588],[-237,-7]],[[246608,254581],[0,4882],[-290,-6]],[[270029,257961],[-328,-1873],[-203,-243]],[[269498,255845],[-501,974]],[[226342,249372],[-760,7341]],[[227703,254041],[-1361,-4669]],[[220202,258883],[-12,-9165]],[[220190,249718],[-1597,-26]],[[218593,249692],[-12,8143],[-1602,88]],[[216979,257923],[1,517]],[[254093,251672],[-73,-563]],[[254020,251109],[-140,-343],[-854,-8],[-285,-550]],[[252741,250208],[-49,5986]],[[272538,253809],[-20,-18]],[[272518,253791],[20,18]],[[272206,254211],[-81,132]],[[272125,254343],[81,-132]],[[272895,258076],[-221,-2947],[-140,1837],[361,1110]],[[272467,260258],[359,-497],[69,-954],[-372,-537],[-14,-3438],[142,-738],[-530,300]],[[272121,254394],[-413,2119]],[[232380,257461],[233,-3410],[-191,-919],[-110,-3298]],[[232312,249834],[-586,-39],[-742,-2204]],[[230984,247591],[-246,5282],[29,1856]],[[215564,260206],[-1,-10640]],[[215563,249566],[-1463,119]],[[214100,249685],[-47,10521]],[[214100,249685],[-245,18]],[[213855,249703],[-113,1973],[-687,2489],[-254,-616]],[[212801,253549],[1,6664]],[[237271,258681],[4,-1923],[-170,-1045],[14,-5133]],[[237119,250580],[-252,-651]],[[236867,249929],[-549,2335]],[[216979,257923],[-19,-8365]],[[216960,249558],[-1397,8]],[[212801,253549],[-158,-489],[-521,1933]],[[265095,256340],[-399,-66]],[[264696,256274],[-805,-62]],[[263891,256212],[-57,3435]],[[263891,256212],[-578,-53]],[[263313,256159],[-423,45],[-85,1207]],[[261140,253945],[-191,-1283],[-485,462],[-142,-1410]],[[260322,251714],[-224,22]],[[260098,251736],[6,7849]],[[260098,251736],[-1120,-77]],[[258978,251659],[-2,4613]],[[246608,254581],[-1058,-7],[-230,-518]],[[245320,254056],[-174,479]],[[238342,251360],[-866,-337]],[[237476,251023],[-357,-443]],[[266931,256942],[-267,-2339]],[[266664,254603],[-217,-427]],[[266447,254176],[-394,60]],[[234433,256013],[126,-728]],[[234559,255285],[-1328,-6123]],[[233231,249162],[-511,-2377]],[[232720,246785],[-160,1025],[32,1830],[-280,194]],[[221621,257243],[-4,-7538]],[[221617,249705],[-1427,13]],[[270548,255030],[135,-1217],[-559,-1966],[-260,400]],[[269864,252247],[-282,1361],[-84,2237]],[[258978,251659],[17,-3690]],[[258995,247969],[-561,3]],[[258434,247972],[-835,6]],[[257599,247978],[-33,3685]],[[218593,249692],[-762,-76]],[[217831,249616],[-871,-58]],[[236867,249929],[-914,-1226]],[[235953,248703],[-290,477]],[[235663,249180],[-783,1632]],[[234880,250812],[-186,3541],[-135,932]],[[263313,256159],[-12,-3258]],[[263301,252901],[-768,-60],[-14,-3409]],[[262519,249432],[-296,57]],[[262223,249489],[-201,1664],[37,2674]],[[229346,250051],[-672,-2227]],[[228674,247824],[-579,5465]],[[229993,252193],[-647,-2142]],[[242559,254324],[-409,-313],[69,-6633],[-201,52]],[[242018,247430],[-298,679],[-277,-1715],[-308,-248]],[[241135,246146],[-630,-114]],[[240505,246032],[-16,6745],[-423,1757]],[[223045,256660],[-5,-9678]],[[223040,246982],[-1093,-7]],[[221947,246975],[-331,2],[1,2728]],[[224516,252373],[110,-2638],[233,-1105]],[[224859,248630],[-17,-2012]],[[224842,246618],[-1446,-2]],[[223396,246616],[-356,366]],[[267484,255907],[289,-2604],[-29,-1804]],[[267744,251499],[-329,-678],[-91,-2266]],[[267324,248555],[-270,35]],[[267054,248590],[-114,4038],[-276,1975]],[[269864,252247],[216,-986],[1,-1604],[213,-1377]],[[270294,248280],[-791,53],[-15,-4065],[756,-203],[-181,-4018]],[[270063,240047],[-569,247]],[[269494,240294],[-47,4436],[-166,-9],[13,2675],[-283,1029],[-221,3071]],[[268790,251496],[-78,1759],[195,-14],[2,1614]],[[226342,249372],[-12,-642]],[[226330,248730],[-1471,-100]],[[272538,253809],[99,-1698],[-281,-1545],[-109,1279],[124,2060],[147,-114]],[[272121,254394],[4,-51]],[[272206,254211],[155,-844],[-204,-1997],[71,-2599],[-325,802]],[[271903,249573],[-591,1665]],[[271312,251238],[97,2986]],[[264696,256274],[-167,-1562],[-391,-949],[-69,-1200],[-328,-1574],[-68,-1447]],[[263673,249542],[-96,10]],[[263577,249552],[15,3293],[-291,56]],[[265091,254316],[-12,-4797]],[[265079,249519],[-315,12]],[[264764,249531],[-724,18]],[[264040,249549],[-367,-7]],[[252741,250208],[18,-2159]],[[252759,248049],[-1139,-6]],[[251620,248043],[-21,8111]],[[250751,256161],[23,-9759]],[[250774,246402],[-565,1]],[[250209,246403],[-23,1870]],[[250186,248273],[3,6262],[-287,-6],[-2,1632]],[[250186,248273],[-850,-146]],[[249336,248127],[0,8029]],[[251620,248043],[-141,-1624]],[[251479,246419],[-705,-17]],[[249336,248127],[-206,-4]],[[249130,248123],[-300,-5]],[[248830,248118],[0,1358],[-237,-5],[-309,1881],[-23,2984]],[[268790,251496],[-833,9]],[[267957,251505],[-213,-6]],[[234880,250812],[-269,-1952],[-727,-4046]],[[233884,244814],[-145,1530],[-209,-879]],[[233530,245465],[-193,-34],[-106,3731]],[[213855,249703],[556,-1561],[548,-266],[329,-1468],[180,-3868],[116,-913]],[[215584,241627],[-1029,49],[-1,-1089],[-570,23],[-1,-5857],[-623,-16],[0,-4293]],[[213360,230444],[-2433,11417]],[[210927,241861],[-404,1872]],[[271312,251238],[-472,-2257]],[[270840,248981],[-349,502],[-197,-1203]],[[245320,254056],[101,-734],[-2,-5262]],[[245419,248060],[-324,3]],[[245095,248063],[-1282,6]],[[240505,246032],[-431,-220]],[[240074,245812],[-1233,93],[-383,-267]],[[238458,245638],[138,2981],[-121,2916]],[[230984,247591],[-297,-1132],[-306,-3133],[-307,-918]],[[230074,242408],[-150,659]],[[229924,243067],[-83,1791],[-230,1423],[-92,2593],[-173,1177]],[[267054,248590],[-504,85]],[[266550,248675],[-277,858]],[[266273,249533],[181,2384],[-7,2259]],[[246845,254588],[1,-6513]],[[246846,248075],[-54,0]],[[246792,248075],[-721,-7]],[[246071,248068],[-652,-8]],[[247647,254601],[2,-6508]],[[247649,248093],[-244,-5]],[[247405,248088],[-559,-13]],[[248830,248118],[-1181,-25]],[[243570,248904],[-74,-473]],[[243496,248431],[-155,-910],[-26,-2268]],[[243315,245253],[-1107,9]],[[242208,245262],[-190,2168]],[[266273,249533],[3,-822],[-452,71]],[[265824,248782],[-746,72],[1,665]],[[228674,247824],[-526,-1799],[-157,-2555]],[[227991,243470],[-863,2198],[-567,666]],[[226561,246334],[-231,2396]],[[255287,234666],[-1,83]],[[255286,234749],[1,-83]],[[255015,252631],[47,-4598]],[[255062,248033],[-100,-2449],[293,-2293],[342,-1258],[-72,-3553]],[[255525,238480],[118,-709],[-472,-3244],[-776,-834],[-363,138],[618,1003],[-446,2270],[13,2456],[-99,3217],[-227,556]],[[253891,243333],[-3,423]],[[253888,243756],[51,358]],[[253939,244114],[171,4893],[-90,2102]],[[262223,249489],[73,-1396]],[[262296,248093],[-1354,-67]],[[260942,248026],[7,3775],[-627,-87]],[[257599,247978],[-271,46]],[[257328,248024],[-1052,38]],[[256276,248062],[-1214,-29]],[[263577,249552],[-524,-184]],[[263053,249368],[-534,64]],[[260942,248026],[-27,-3]],[[260915,248023],[-1496,-67]],[[259419,247956],[-424,13]],[[238458,245638],[-203,-3553],[-301,-2557],[116,-1802],[-122,-774]],[[237948,236952],[-67,-1096],[157,-1846]],[[238038,234010],[-535,-29]],[[237503,233981],[99,13117],[-126,3925]],[[269494,240294],[-114,46]],[[269380,240340],[-346,136]],[[269034,240476],[-18,2136],[-493,493],[-222,1907],[-346,637]],[[267955,245649],[2,5856]],[[267955,245649],[-134,-371]],[[267821,245278],[-66,1821],[-380,53],[-51,1403]],[[253891,243333],[-3,423]],[[253939,244114],[-283,-5327],[-10,-2293],[-805,175]],[[252841,236669],[-46,6489]],[[252795,243158],[-36,4891]],[[272307,246842],[-203,-3711],[-81,2743],[284,968]],[[271903,249573],[306,-2479],[-160,-4072],[-292,-203]],[[271757,242819],[-831,2065]],[[270926,244884],[0,3896],[-86,201]],[[237503,233981],[-603,-19]],[[236900,233962],[97,1937],[-94,1644],[125,1714]],[[237028,239257],[58,2123],[-200,796],[-363,6258],[-570,269]],[[235663,249180],[-268,-876],[313,-9030]],[[235708,239274],[21,-669],[-542,-18]],[[235187,238587],[-329,77]],[[234858,238664],[56,883],[-384,657],[-240,1922],[-168,-357],[-46,2247],[-192,798]],[[229924,243067],[-953,-3232]],[[228971,239835],[-534,-1857]],[[228437,237978],[-325,5186],[-121,306]],[[209922,237143],[-279,-6],[-3006,4042]],[[210927,241861],[-1005,-4718]],[[232720,246785],[-683,-1234]],[[232037,245551],[-850,-766]],[[231187,244785],[-203,2806]],[[221947,246975],[2,-4279]],[[221949,242696],[-1761,-8]],[[220188,242688],[2,7030]],[[220188,242688],[-2353,-80]],[[217835,242608],[-4,7008]],[[217835,242608],[0,-7787]],[[217835,234821],[-2223,5]],[[215612,234826],[279,1284],[-229,1216],[263,2566],[-18,1121],[-323,614]],[[264040,249549],[-12,-7240]],[[264028,242309],[-1345,402]],[[262683,242711],[300,3247],[70,3410]],[[264764,249531],[114,-3092],[-22,-4394]],[[264856,242045],[-554,176]],[[264302,242221],[-274,88]],[[267013,241274],[-88,36]],[[266925,241310],[88,-36]],[[266550,248675],[98,-2368],[249,-1172],[-274,-444],[-99,-1221],[356,-2142]],[[266880,241328],[-709,260]],[[266171,241588],[-368,135]],[[265803,241723],[21,7059]],[[265803,241723],[-735,253]],[[265068,241976],[-212,69]],[[262683,242711],[-3,0]],[[262680,242711],[-384,5382]],[[270926,244884],[-366,-1369],[-37,-1852],[123,-1709],[-124,-3745]],[[270522,236209],[-335,-64],[-107,1022],[-17,2880]],[[237028,239257],[-1320,17]],[[233530,245465],[-89,-6609]],[[233441,238856],[-666,83],[-646,2258]],[[232129,241197],[-92,4354]],[[244740,241602],[-76,124]],[[244664,241726],[-138,1864],[-596,-161],[213,1884],[-298,-207],[-105,2422]],[[245095,248063],[-355,-6461]],[[243752,247975],[-256,456]],[[226561,246334],[-375,-2253],[-241,-2998]],[[225945,241083],[-211,-3685]],[[225734,237398],[-625,1109]],[[225109,238507],[-245,3502],[174,1353],[-6,1659],[-190,1597]],[[267821,245278],[-326,-1351],[-1,-2847]],[[267494,241080],[-481,194]],[[266925,241310],[-45,18]],[[244664,241726],[-233,-2740],[-196,-267]],[[244235,238719],[-602,5]],[[243633,238724],[-154,6]],[[243479,238730],[63,3797],[-227,2726]],[[250209,246403],[-2,-4881]],[[250207,241522],[-565,12],[0,-2448],[-406,-1072]],[[249236,238014],[-349,2359],[-75,1498]],[[248812,241871],[318,6252]],[[248812,241871],[-426,-21],[-726,869]],[[247660,242719],[-255,5369]],[[242208,245262],[112,-1502],[-109,-3720],[-661,-627],[-124,-1004]],[[241426,238409],[-387,12]],[[241039,238421],[5,125]],[[241044,238546],[92,1719],[-1,5881]],[[262680,242711],[-189,-1959]],[[262491,240752],[-656,31],[-11,-813],[-591,47]],[[261233,240017],[-142,13]],[[261091,240030],[7,4056],[-466,837]],[[260632,244923],[283,3100]],[[247660,242719],[35,-9077]],[[247695,233642],[-97,120]],[[247598,233762],[-55,1170],[-290,-154]],[[247253,234778],[-284,1435],[-176,2313],[-1,3039]],[[246792,241565],[0,6510]],[[255286,234749],[1,-83]],[[256955,236440],[0,-65]],[[256955,236375],[0,65]],[[256232,239600],[16,-2077],[-262,-1642],[-543,-650],[107,1726],[233,526],[-258,997]],[[256276,248062],[-334,-1385],[-81,-3537],[371,-3540]],[[257287,236666],[-332,-291]],[[256955,236440],[333,330]],[[257288,236770],[-1,-104]],[[257328,248024],[-38,-10998]],[[257290,237026],[-1052,-1037],[665,1910],[-226,962],[-136,-1053],[-250,2450],[-59,-658]],[[252795,243158],[-1315,0]],[[251480,243158],[-1,3261]],[[246792,241565],[-957,-12]],[[245835,241553],[167,1301]],[[246002,242854],[-21,4096],[90,1118]],[[257288,236770],[-1,-104]],[[258411,236876],[-1,-356]],[[258410,236520],[1,356]],[[258434,247972],[-17,-10056]],[[258417,237916],[-166,1066],[-410,-2043],[-551,87]],[[246002,242854],[-1125,-260],[-120,-1038]],[[244757,241556],[-17,46]],[[260632,244923],[-55,-1607],[-562,869],[-66,-1633]],[[259949,242552],[-537,37],[7,5367]],[[259949,242552],[-196,-1239],[99,-2458],[-315,-2141]],[[259537,236714],[-9,-2239]],[[259528,234475],[-1118,2045]],[[258411,236876],[815,-134],[-426,1780],[-383,-606]],[[231187,244785],[-45,-4378],[221,-3089],[-139,-1696]],[[231224,235622],[12,736],[-414,181]],[[230822,236539],[-165,3013],[-358,1437],[-319,392],[94,1027]],[[223396,246616],[1,-7872]],[[223397,238744],[-946,25]],[[222451,238769],[-503,-4],[1,3931]],[[225109,238507],[-674,263]],[[224435,238770],[-1038,-26]],[[251480,243158],[0,-1086]],[[251480,242072],[-990,-2],[-283,-548]],[[228437,237978],[-499,-1008]],[[227938,236970],[-97,304]],[[227841,237274],[-634,1522],[-437,-1264],[-263,727],[-303,2900],[-259,-76]],[[234858,238664],[-878,-2778]],[[233980,235886],[-396,1125],[-143,1845]],[[241044,238546],[-396,8],[-9,-943],[-990,-261]],[[239649,237350],[2,3244],[421,9],[2,5209]],[[239649,237350],[0,-383]],[[239649,236967],[-708,-8],[1,1629],[-283,7],[1,-1638],[-712,-5]],[[269034,240476],[-293,114]],[[268741,240590],[-1247,490]],[[232129,241197],[72,-7162]],[[232201,234035],[-806,-383]],[[231395,233652],[-171,1970]],[[243479,238730],[216,-1918],[-535,412],[-328,-898]],[[242832,236326],[-172,208],[-256,-1508]],[[242404,235026],[-95,2568],[-194,809],[-689,6]],[[261091,240030],[-143,0],[-5,-2437],[-1018,73],[-388,-952]],[[271757,242819],[498,-308],[-34,-3431],[-155,926],[-295,-107]],[[271771,239899],[-322,203],[-925,-5549]],[[270524,234553],[-2,1656]],[[252841,236669],[-233,-1277],[-178,1270],[-575,-702],[-371,1452]],[[251484,237412],[-4,4660]],[[230822,236539],[-952,-1550]],[[229870,234989],[-278,410],[-621,4436]],[[245835,241553],[-210,-1460],[-15,-2061],[278,-2141]],[[245888,235891],[-360,-439]],[[245528,235452],[-338,30]],[[245190,235482],[-277,639],[124,2784],[-183,-36],[-97,2687]],[[249236,238014],[203,-4319],[261,-907]],[[249700,232788],[-283,-440]],[[249417,232348],[-471,-67],[-254,868],[-304,-894],[-309,779]],[[248079,233034],[-384,608]],[[264302,242221],[-267,-2074],[-54,-1701],[-693,-1753]],[[263288,236693],[-375,1330],[-2,1097],[-281,268],[-139,1364]],[[222451,238769],[6,-3969]],[[222457,234800],[-1261,75]],[[221196,234875],[-1009,-7]],[[220187,234868],[1,7820]],[[220187,234868],[-1627,-38]],[[218560,234830],[-725,-9]],[[265068,241976],[85,-2795],[-178,-1],[-97,-4623]],[[264878,234557],[-479,557],[-1297,-62]],[[263102,235052],[186,1641]],[[251484,237412],[-1134,-2305],[-141,1298]],[[250209,236405],[-2,5117]],[[266171,241588],[21,-1291],[-370,-1383],[42,-1369],[-274,-2432]],[[265590,235113],[-266,-1103],[-213,-2775]],[[265111,231235],[-234,65]],[[264877,231300],[1,3257]],[[209945,215738],[-23,21405]],[[213360,230444],[686,-3232]],[[214046,227212],[-190,-2193],[-356,427],[-421,-724],[-394,-4187],[-190,-3082],[-26,-2697],[-288,-495],[-452,-3923],[-784,1354],[-338,2103],[-458,443],[-204,1500]],[[245190,235482],[-472,-15],[-483,3252]],[[215612,234826],[-8,-9436]],[[215604,225390],[-988,210],[-570,1612]],[[247253,234778],[-437,-1708],[-207,515]],[[246609,233585],[-184,-840],[-537,3146]],[[267013,241274],[105,-135],[78,-2865],[203,-1638]],[[267399,236636],[-213,-2319]],[[267186,234317],[-334,-5]],[[266852,234312],[-283,815],[-979,-14]],[[250209,236405],[34,-1301],[-543,-2316]],[[268741,240590],[-104,-715],[226,-2818],[-101,-1193],[-315,-129]],[[268447,235735],[-586,1763],[-462,-862]],[[209945,215738],[-500,620],[-308,933],[-500,3116],[-209,112],[-481,2313],[-467,5014],[-27,4955],[-481,3934],[-34,2231],[-301,2213]],[[233980,235886],[192,-3310]],[[234172,232576],[-466,-2513],[-754,2533],[-380,-1252],[-368,-202]],[[232204,231142],[-3,2893]],[[227841,237274],[-343,-3901],[-438,-2646]],[[227060,230727],[-169,-807]],[[226891,229920],[-1289,6177]],[[225602,236097],[132,1301]],[[262491,240752],[-511,-7566]],[[261980,233186],[-763,18]],[[261217,233204],[16,6813]],[[263102,235052],[119,-3212],[349,-2174]],[[263570,229666],[-1288,56],[-50,-791]],[[262232,228931],[-307,1350],[55,2905]],[[269380,240340],[4,-8336]],[[269384,232004],[-309,-3002],[110,-639]],[[269185,228363],[-359,-2063]],[[268826,226300],[-394,1903]],[[268432,228203],[15,7532]],[[272248,234159],[-9,-2722],[-434,369]],[[271805,231806],[-186,99],[91,1895],[-113,886],[151,2028],[471,-633],[29,-1922]],[[272388,234172],[-135,-12]],[[272253,234160],[-2,2672],[137,-2660]],[[271771,239899],[387,-696],[23,-1979],[-488,-402],[1,-1429],[-265,-959],[92,-1411]],[[271521,233023],[-998,-79]],[[270523,232944],[1,1609]],[[270523,232944],[0,-816]],[[270523,232128],[-259,0]],[[270264,232128],[-880,-124]],[[261213,230026],[7,-1939]],[[261220,228087],[-832,3622],[181,87],[319,-1693],[325,-77]],[[261217,233204],[-4,-3056]],[[261213,230148],[-256,-46],[-113,1656],[-199,-122],[-386,1289],[-6,-1143],[-725,2693]],[[229870,234989],[-428,-2537]],[[229442,232452],[-640,-2031]],[[228802,230421],[-160,3871],[-704,2678]],[[236900,233962],[5,-1513]],[[236905,232449],[-444,185],[-185,-1246],[-288,179]],[[235988,231567],[-421,-17],[-380,7037]],[[224435,238770],[11,-6720]],[[224446,232050],[-926,-12]],[[223520,232038],[-1061,-74],[-2,2836]],[[225602,236097],[-347,-5926]],[[225255,230171],[-325,-1870]],[[224930,228301],[-484,3749]],[[245308,223867],[-799,1569],[36,945],[-274,2263]],[[244271,228644],[604,288]],[[244875,228932],[202,-2332],[251,-831],[-20,-1902]],[[244559,230559],[-645,-478],[-352,1661],[-258,-1459],[-367,543]],[[242937,230826],[126,1509],[-231,3991]],[[243633,238724],[170,-1018],[53,-2472],[406,-1498],[39,-2365],[258,-812]],[[245528,235452],[-237,-4825]],[[245291,230627],[-330,-692]],[[244961,229935],[-402,624]],[[235988,231567],[8,-4160]],[[235996,227407],[-1499,-99]],[[234497,227308],[-325,5268]],[[239649,236967],[279,-441],[96,-4141],[287,-11],[13,-1373],[-300,-819]],[[240024,230182],[-368,260],[-1652,-19]],[[238004,230423],[34,3587]],[[241039,238421],[19,-7239]],[[241058,231182],[-312,-1023]],[[240746,230159],[-722,23]],[[242404,235026],[-397,-2818]],[[242007,232208],[-408,-1799],[-382,1123],[-159,-350]],[[268432,228203],[-222,-845]],[[268210,227358],[-526,3596],[-439,645],[-59,2718]],[[228802,230421],[-812,-4931]],[[227990,225490],[-930,5237]],[[231395,233652],[-274,-1644],[130,-1237]],[[231251,230771],[-412,482],[-916,-965]],[[229923,230288],[-71,1867],[-410,297]],[[242937,230826],[-38,-675]],[[242899,230151],[-457,1472],[-435,585]],[[226432,226825],[-346,-1970]],[[226086,224855],[-87,1789],[-744,3527]],[[226891,229920],[-512,-2621],[53,-474]],[[246609,233585],[-25,-1023]],[[246584,232562],[-762,-995],[-135,-866]],[[245687,230701],[-396,-74]],[[266852,234312],[-10,-6935],[145,-1216]],[[266987,226161],[-200,-2815]],[[266787,223346],[-399,936],[-283,2980],[-405,1944],[-589,2029]],[[264877,231300],[-794,-652],[8,-1736],[-255,55]],[[263836,228967],[-266,699]],[[247598,233762],[-477,-3687],[-248,-295],[-10,-2337]],[[246863,227443],[-319,-37]],[[246544,227406],[-91,2727],[131,2429]],[[218560,234830],[1,-12368]],[[218561,222462],[3,-3801],[-131,-3065],[-135,-246]],[[218298,215350],[-586,2295],[-155,1738],[-559,1472],[-109,1937],[-428,2706],[-230,-539],[-627,431]],[[221196,234875],[-9,-4031]],[[221187,230844],[-585,153],[-126,-5326],[-4,-3217]],[[220472,222454],[-273,-4]],[[220199,222450],[-1638,12]],[[223520,232038],[7,-6644]],[[223527,225394],[-721,2115],[-1182,235]],[[221624,227744],[-252,18],[4,3078],[-189,4]],[[268210,227358],[-114,-1168]],[[268096,226190],[-1109,-29]],[[272842,223332],[13,0]],[[272855,223332],[-13,0]],[[272837,223331],[-14,0]],[[272823,223331],[-64,-213]],[[272759,223118],[-215,-625],[-556,-55]],[[271988,222438],[-4,2546]],[[271984,224984],[-177,2427],[99,1442],[-322,1680],[221,1273]],[[272248,234159],[350,-6434],[-19,-1080],[258,-3314]],[[272388,234172],[216,-5656],[-351,5644]],[[238004,230423],[-370,-3472]],[[237634,226951],[-15,2086],[-480,948],[-234,2464]],[[232204,231142],[-439,1364],[375,-6984]],[[232140,225522],[-575,-1123]],[[231565,224399],[-195,1521],[-119,4851]],[[247737,223730],[-329,24],[-91,1327],[-454,2362]],[[247598,233762],[-7,-4806],[112,-2059],[203,-840],[-169,-2327]],[[248125,213951],[70,748]],[[248195,214699],[-70,-748]],[[248079,233034],[-93,-5082],[223,493],[141,-926]],[[248350,227519],[-169,-1242],[4,-1676],[243,-2463],[7,-2735]],[[248435,219403],[-412,1680],[32,1883],[-166,601]],[[247889,223567],[-152,163]],[[262232,228931],[-64,-3572]],[[262168,225359],[-1,-32]],[[262167,225327],[-471,-1559]],[[261696,223768],[-261,-97],[30,2044],[-245,2372]],[[261213,230026],[0,122]],[[249417,232348],[-288,-1735],[-365,-1099]],[[248764,229514],[-363,-244],[-62,-812],[282,-1441]],[[248621,227017],[-271,502]],[[271521,233023],[-209,-1367],[211,19],[-61,-1459],[280,-1434],[17,-2305]],[[271759,226477],[-575,-58],[-356,-1657],[-304,-536]],[[270524,224226],[-1,7902]],[[237634,226951],[-209,-1156],[251,-2060]],[[237676,223735],[-488,-232],[-947,-2205]],[[236241,221298],[-10,6070],[-235,39]],[[234522,223522],[-12,-43]],[[234510,223479],[12,43]],[[234497,227308],[188,-999],[-40,-2779]],[[234645,223530],[-248,563],[-164,2138],[-76,-1074],[334,-1692],[-100,-2415]],[[234391,221050],[-400,-946],[-152,1095]],[[233839,221199],[-128,697],[-451,-247]],[[233260,221649],[-1120,3873]],[[249700,222967],[-38,168]],[[249749,222685],[-49,282]],[[249760,222644],[-11,41]],[[249662,223135],[98,-491]],[[249979,228312],[58,-697]],[[250037,227615],[219,-583],[-251,-835],[182,-672]],[[250187,225525],[-339,382],[73,-1088]],[[249921,224819],[-580,0],[296,-1820]],[[249637,222999],[-31,137]],[[249606,223136],[-17,-11]],[[249589,223125],[-854,2530],[-114,1362]],[[248764,229514],[179,-1315],[188,485],[62,-1578],[278,-40],[74,2258],[374,1265],[60,-2277]],[[246544,227406],[-360,598],[-279,-303]],[[245905,227701],[-207,1351],[-11,1649]],[[229923,230288],[145,-1541]],[[230068,228747],[-848,-6121]],[[229220,222626],[-748,-86]],[[228472,222540],[-488,2914]],[[227984,225454],[6,36]],[[242899,230151],[-21,-3786]],[[242878,226365],[-34,-727],[-509,-1743],[181,-15],[-22,-1563],[-530,-1558],[-885,887]],[[241079,221646],[6,8528],[-339,-15]],[[270524,224226],[-18,-8]],[[270506,224218],[-216,2191],[-389,132],[-406,1491]],[[269495,228032],[311,620],[458,3476]],[[269495,228032],[-310,331]],[[224930,228301],[-647,-3579]],[[224283,224722],[-370,-472]],[[223913,224250],[-386,1144]],[[243094,222650],[507,-1497],[-373,-1379],[-504,1635],[370,1241]],[[244961,229935],[-86,-1003]],[[244271,228644],[-426,-208],[-645,-3854]],[[243200,224582],[80,1698],[-402,85]],[[231565,224399],[21,-2330],[-178,-21]],[[231408,222048],[-241,599]],[[231167,222647],[-226,618],[-208,2751],[-251,273],[-414,2458]],[[245905,227701],[-338,-3548]],[[245567,224153],[-211,-1645]],[[245356,222508],[-48,1359]],[[221624,227744],[-7,-5221]],[[221617,222523],[-1145,-69]],[[227984,225454],[-780,-2865],[-98,357]],[[227106,222946],[-308,893],[-366,2986]],[[241079,221646],[-915,2301],[-643,1244],[-860,-33],[-722,-624],[-263,-799]],[[226086,224855],[-251,-1276],[-617,-1664]],[[225218,221915],[-189,1265],[72,1338],[-818,204]],[[261985,223666],[47,-1027],[-349,843],[302,184]],[[262167,225327],[153,-1172],[-624,-387]],[[263836,228967],[267,-1311],[-501,150],[-1029,-3275],[-405,828]],[[231167,222647],[-368,-2222],[-114,-1978],[-813,-2987]],[[229872,215460],[-51,299]],[[229821,215759],[273,1332],[-648,4505],[-226,1030]],[[245356,222508],[-369,-725]],[[244987,221783],[-279,-1858],[-257,1227],[-396,-628],[-7,2090],[-205,-84],[-21,2141],[-622,-89]],[[270506,224218],[-1,-4598]],[[270505,219620],[-384,-936],[-50,1175],[-543,18]],[[269528,219877],[-418,-93],[-2,1071],[-275,504]],[[268833,221359],[-7,4941]],[[268833,221359],[-783,495]],[[268050,221854],[-36,3076],[82,1260]],[[247232,214624],[0,134]],[[247232,214758],[0,-134]],[[248242,218852],[-13,-1967]],[[248229,216885],[-87,-464]],[[248142,216421],[53,-1722]],[[248125,213951],[-368,-1498],[-122,993]],[[247635,213446],[-258,3162],[-145,-1654]],[[247232,214954],[0,261]],[[247232,215215],[0,103]],[[247232,215318],[15,317]],[[247247,215635],[13,86]],[[247260,215721],[55,1625],[-668,4635],[-413,1833],[-106,1452],[-208,-1075],[-353,-38]],[[247889,223567],[32,-2068],[-180,-981],[501,-1666]],[[222150,222529],[-533,-6]],[[223913,224250],[-73,-520]],[[223840,223730],[-339,-2416],[-158,1139],[-1193,76]],[[249173,217874],[111,-1305],[-399,135],[288,1170]],[[249760,222644],[-11,41]],[[249749,222685],[-49,282]],[[249637,222999],[-31,137]],[[249372,222960],[-16,-479]],[[249356,222481],[-255,-314],[203,-1847],[362,-1191],[-111,-778],[530,-230],[375,-1687],[141,832],[308,-3040],[-51,-1666],[-254,-1183],[-172,580],[-446,-2430],[421,3793],[-138,1557],[-368,-602],[-133,2619],[-305,1183],[-511,-71],[-60,606]],[[248892,218612],[-160,571]],[[248732,219183],[-297,220]],[[249589,223125],[-217,-165]],[[234522,223522],[-12,-43]],[[236241,221298],[-46,-111]],[[236195,221187],[-276,34]],[[235919,221221],[-211,269],[-540,-841],[124,4279],[-301,699],[-199,-2304],[-147,207]],[[227106,222946],[-578,-5085]],[[226528,217861],[-680,52],[-139,1116]],[[225709,219029],[23,814],[-514,2072]],[[271988,222438],[9,-2348],[241,-1825]],[[272238,218265],[-390,-928]],[[271848,217337],[-291,1592],[-5,2835],[246,455],[-91,1669],[277,1096]],[[271759,226477],[138,-1241],[-266,-1803],[-119,-4400],[73,-1266]],[[271585,217767],[-204,-13],[-96,2167],[-186,605],[-594,-906]],[[233260,221649],[-107,-2625],[-243,-15],[-79,-1781],[-212,-962],[-275,622],[-264,-1152]],[[232080,215736],[-403,3185],[-269,3127]],[[228472,222540],[-171,-902],[-100,-3633]],[[228201,218005],[-1039,-5115]],[[227162,212890],[-322,2085]],[[226840,214975],[-363,2441],[51,445]],[[247232,214624],[0,134]],[[247232,214954],[0,261]],[[247232,215318],[15,317]],[[244928,217715],[211,-933],[-106,-1819],[-306,1568],[201,1184]],[[246757,215344],[-84,-582]],[[246673,214762],[-79,239]],[[246594,215001],[-200,-1714]],[[246394,213287],[-354,101]],[[246040,213388],[-298,518],[376,1325],[-332,809],[-84,1095],[-260,-2776],[-234,825],[15,1953],[-358,1999],[122,2647]],[[247260,215721],[-525,940],[22,-1317]],[[225709,219029],[-760,-6052]],[[224949,212977],[-1107,2536]],[[223842,215513],[-2,8217]],[[223842,215513],[-1,-2983]],[[223841,212530],[-1697,17]],[[222144,212547],[6,9982]],[[272759,223118],[386,-4323]],[[273145,218795],[-132,-298],[16,-2699],[-744,-89],[-47,2556]],[[272837,223331],[-14,0]],[[272855,223332],[309,-4535]],[[273164,218797],[-14,-2]],[[273150,218795],[-308,4537]],[[232080,215736],[-73,-613]],[[232007,215123],[-254,-1542],[-959,-3418]],[[230794,210163],[-922,5297]],[[229821,215759],[-780,-3735]],[[229041,212024],[-105,760]],[[228936,212784],[-735,5221]],[[222144,212547],[-1943,-93]],[[220201,212454],[-2,9996]],[[220201,212454],[-1549,-37]],[[218652,212417],[-301,1679],[-53,1254]],[[235183,217123],[-168,-987],[-897,-3581],[738,3847],[327,721]],[[234707,216436],[-103,255],[-320,-2118]],[[234284,214573],[-491,4941],[46,1685]],[[234391,221050],[302,-994],[-118,-528],[193,-1648],[-61,-1444]],[[236195,221187],[-1084,-2978],[545,2519],[263,493]],[[234284,214573],[-259,-341],[-244,-3555],[-457,-2355],[-295,-718]],[[233029,207604],[-168,76],[-313,2527],[-238,32],[-6,1604],[-193,733],[-104,2547]],[[269528,219877],[10,-5016],[-370,-17],[1,-3162]],[[269169,211682],[-610,-874]],[[268559,210808],[-4,-27]],[[268555,210781],[11,1181],[-229,1768],[-631,424],[-130,2752]],[[267576,216906],[349,3016],[125,1932]],[[271585,217767],[74,-1764]],[[271659,216003],[-47,-5893],[-823,-7]],[[270789,210103],[-996,7]],[[269793,210110],[-470,1716],[-154,-144]],[[226840,214975],[-1288,-6319]],[[225552,208656],[-603,4321]],[[274192,206960],[-19,0]],[[274173,206960],[19,0]],[[274038,206958],[-133,1]],[[273905,206959],[-39,-1]],[[273866,206958],[-329,-17],[-54,-3299]],[[273483,203642],[-228,3745],[-313,-578],[-517,1780]],[[272425,208589],[33,1991],[-410,2090],[-148,1729]],[[271900,214399],[73,2025],[-125,913]],[[273145,218795],[71,-1438],[822,-10399]],[[273164,218797],[-14,-2]],[[228017,208315],[-310,1140],[-438,-2084]],[[227269,207371],[-501,3616],[394,1903]],[[228936,212784],[-919,-4469]],[[272425,208589],[-133,-1746]],[[272292,206843],[-680,-113],[4,-8038]],[[271616,198692],[-837,-36]],[[270779,198656],[10,11447]],[[271659,216003],[241,-1604]],[[230794,210163],[-40,-5356]],[[230754,204807],[-187,-17]],[[230567,204790],[-105,612]],[[230462,205402],[-405,-38]],[[230057,205364],[-229,273]],[[229828,205637],[-8,-8]],[[229820,205629],[-3,31]],[[229817,205660],[-203,3106],[-295,2552],[-278,706]],[[225150,203636],[-1,663],[-1297,-17]],[[223852,204282],[-11,8248]],[[225552,208656],[258,-1776]],[[225810,206880],[-660,-3244]],[[231528,203108],[198,1338],[-526,-948],[-443,705]],[[230757,204203],[-3,604]],[[233029,207604],[-514,-1808],[-270,336],[-408,-941],[-74,-1321],[716,1769],[-1754,-5264],[803,2733]],[[226700,204666],[-381,956],[-250,-542]],[[226069,205080],[-259,1800]],[[227269,207371],[-569,-2705]],[[229828,205637],[-8,-8]],[[229817,205660],[1,-375]],[[229818,205285],[-753,-2127],[109,-1486]],[[229174,201672],[-68,-398],[-684,1260]],[[228422,202534],[5,4145],[-122,1447],[-288,189]],[[223852,204282],[-1657,-123]],[[222195,204159],[-37,-4]],[[222158,204155],[-14,8392]],[[222158,204155],[-1965,141]],[[220193,204296],[8,8158]],[[220193,204296],[2,-8383]],[[220195,195913],[-275,-20]],[[219920,195893],[-228,1634],[-299,5632],[-269,1346],[-138,3111],[-290,2181],[-44,2620]],[[268559,210808],[-4,-27]],[[269793,210110],[391,-3170],[-256,-2281]],[[269928,204659],[-433,507],[-598,-8]],[[268897,205158],[-149,697],[-6,3294],[-183,1659]],[[270779,198656],[-274,-620]],[[270505,198036],[2,3100]],[[270507,201136],[2,765],[-428,978],[-153,1780]],[[228422,202534],[-599,-3072]],[[227823,199462],[-496,1216],[-66,1281],[-333,364],[-228,2343]],[[273483,203642],[-949,-51],[-367,555],[125,2697]],[[273866,206958],[152,-4434],[384,-6703],[460,-6126],[-21,-546]],[[274841,189149],[-1029,-223]],[[273812,188926],[17,9773]],[[273829,198699],[-61,3007],[-285,1936]],[[274038,206958],[411,-2425],[-276,2427]],[[274192,206960],[437,-3794],[144,-2446],[-167,-836],[-12,3069],[-288,-3646],[-72,101],[-11,3804],[-174,605],[153,1506],[-297,1636]],[[226409,193289],[-981,20]],[[225428,193309],[-276,-3]],[[225152,193306],[-2,10330]],[[226069,205080],[-235,-508],[782,-8928],[-25,-123]],[[226591,195521],[-240,-1164],[58,-1068]],[[273829,198699],[-2213,-7]],[[229435,196419],[-34,-86]],[[229401,196333],[30,1032]],[[229431,197365],[4,-946]],[[229989,197536],[539,1175],[-1215,-4810]],[[229313,193901],[29,366]],[[229342,194267],[112,1478],[226,125],[309,1666]],[[230757,204203],[-190,587]],[[229467,200563],[-293,1109]],[[229818,205285],[138,-1955],[593,-2863],[-702,-2229],[-380,2325]],[[230125,204170],[-68,1194]],[[230462,205402],[-19,-1857],[-318,625]],[[227823,199462],[-461,-4167]],[[227362,195295],[-76,-648],[-695,874]],[[270507,201136],[-552,2],[0,-813],[-1166,-24]],[[268789,200301],[108,4857]],[[223852,204282],[-6,-10982]],[[223846,193300],[-1632,-504],[-15,3243]],[[222199,196039],[-4,8120]],[[225152,193306],[-1306,-6]],[[222199,196039],[-2004,-126]],[[229467,200563],[-206,-609],[192,-1783]],[[229453,198171],[-927,-863],[295,-1303]],[[228821,196005],[-626,-2605]],[[228195,193400],[-52,240]],[[228143,193640],[-159,1151],[-622,504]],[[268308,195427],[-9,-1]],[[268299,195426],[9,1]],[[270505,198036],[-139,-2611]],[[270366,195425],[-1519,30]],[[268847,195455],[-374,-12]],[[268473,195443],[316,4858]],[[271616,198692],[0,-1636],[277,2],[94,-2170],[192,-1069],[303,-12],[-262,-959],[585,-3549],[246,-3711]],[[273051,185588],[-1173,63]],[[271878,185651],[-1368,-4]],[[270510,185647],[-6,9777],[-138,1]],[[273812,188926],[-11,-3355]],[[273801,185571],[-750,17]],[[228693,189439],[13,358]],[[228706,189797],[-13,-358]],[[229222,193536],[-326,-2723],[39,1456],[287,1267]],[[228195,193400],[229,-263],[-76,-1380]],[[228348,191757],[-205,1883]],[[228490,190446],[-134,1236]],[[228356,191682],[444,2664],[-7,-1493],[-303,-2407]],[[229313,193901],[29,366]],[[229311,195731],[-328,-1201],[-162,1475]],[[229453,198171],[-22,-806]],[[229401,196333],[-90,-602]],[[223846,193300],[13,-13096]],[[223859,180204],[1,-1601],[-436,25]],[[223424,178628],[-1056,72],[-103,855],[-232,-1006]],[[222033,178549],[-140,1379],[71,2611],[-322,2960],[-327,370],[-463,2627],[-155,3393],[-154,197],[-278,2896],[-345,911]],[[228348,191757],[8,-75]],[[228490,190446],[-3,-28]],[[228487,190418],[-15,-156]],[[228472,190262],[-134,-1330],[-231,1091],[-604,-773]],[[227503,189250],[-412,475],[-458,1287],[12,1137]],[[226645,192149],[-236,1140]],[[268308,195427],[-9,-1]],[[268847,195455],[7,-2885]],[[268854,192570],[-198,-1538],[342,-1334],[-115,-2958],[-287,863],[-300,2065],[148,2365],[29,3410]],[[270510,185647],[-1388,-18]],[[269122,185629],[467,3253],[-294,1838],[49,-1786],[-175,308],[19,1798],[-334,1530]],[[225428,193309],[8,-14809]],[[225436,178500],[-811,49]],[[224625,178549],[3,1455],[-769,200]],[[226645,192149],[-378,-2056],[-22,-4641]],[[226245,185452],[-328,-1],[5,-6979]],[[225922,178472],[-486,28]],[[228250,184343],[-70,94]],[[228180,184437],[70,-94]],[[228402,187096],[249,1941],[-343,-3973],[94,2032]],[[228693,189439],[13,358]],[[228487,190418],[-15,-156]],[[227948,186969],[214,-388],[-199,-2526]],[[227963,184055],[-1437,-47],[-281,1444]],[[227503,189250],[288,8],[157,-2289]],[[275241,183987],[-902,23]],[[274339,184010],[-271,5],[-3,1572],[-264,-16]],[[274841,189149],[341,-3281],[59,-1881]],[[275339,183990],[-31,-2]],[[275308,183988],[31,2]],[[273051,185588],[-176,-2846],[396,-2050],[334,-3158]],[[273605,177534],[-628,-17],[1,-1638],[-277,-12],[2,-1650],[-824,23]],[[271879,174240],[-2,5716]],[[271877,179956],[1,5695]],[[271877,179956],[-1371,-46]],[[270506,179910],[4,5737]],[[268884,180868],[-11,1]],[[268873,180869],[11,-1]],[[270506,179910],[-2,-2429]],[[270504,177481],[-549,21],[3,3302],[-874,53]],[[269084,180857],[-345,1646],[240,735],[143,2391]],[[274339,184010],[6,-6562]],[[274345,177448],[1,-1562],[-580,-3038]],[[273766,172848],[42,3614],[-203,1072]],[[227901,178788],[-37,1]],[[227864,178789],[9,1767],[307,3881]],[[228250,184343],[-349,-5555]],[[227963,184055],[-251,-4476],[-258,-852],[114,2439],[-407,-1627],[-336,1829],[200,-2388],[-320,-89]],[[226705,178891],[-582,-1386]],[[226123,177505],[-201,967]],[[275676,178510],[-28,1]],[[275648,178511],[28,-1]],[[275339,183990],[-31,-2]],[[275241,183987],[343,-5477]],[[275584,178510],[-145,-585]],[[275439,177925],[-1,-410]],[[275438,177515],[-1093,-67]],[[269628,172609],[-7,-1]],[[269621,172608],[7,1]],[[270504,177481],[-3,-3270]],[[270501,174211],[-551,16],[0,-506]],[[269950,173721],[0,-130]],[[269950,173591],[-1,-995],[-273,11]],[[269676,172607],[-254,2093],[-338,6157]],[[268884,180868],[-11,1]],[[224625,178549],[159,-3917],[135,10],[-13,-5059]],[[224906,169583],[-1481,40]],[[223425,169623],[-1,9005]],[[271879,174240],[-1378,-29]],[[223425,169623],[-158,-2060],[-441,-1923]],[[222826,165640],[-276,5054],[-494,3303],[54,2886],[-77,1666]],[[227998,166171],[-12,1]],[[227986,166172],[12,-1]],[[228016,167093],[52,-920]],[[228068,166173],[-55,-2]],[[228013,166171],[-73,1392]],[[227940,167563],[76,-470]],[[228016,167093],[-141,1392]],[[227875,168485],[-65,3026]],[[227810,171511],[31,176]],[[227841,171687],[175,-4594]],[[227841,171687],[-58,4800],[50,1667]],[[227833,178154],[31,635]],[[227901,178788],[-82,-3294],[22,-3807]],[[227619,175770],[-62,-1844],[-237,-795]],[[227320,173131],[22,-2788],[212,-1258],[78,-2921]],[[227632,166164],[-1163,-35],[-267,256]],[[226202,166385],[-78,3149]],[[226124,169534],[-1,7971]],[[226705,178891],[360,-136],[284,-872],[340,626],[-70,-2739]],[[226124,169534],[-934,41]],[[225190,169575],[-284,8]],[[276009,173064],[-4,0]],[[276005,173064],[4,0]],[[275994,173067],[-63,2]],[[275931,173069],[-9,1]],[[275922,173070],[-37,2]],[[275885,173072],[-22,0]],[[275863,173072],[-26,-266],[-2071,42]],[[275438,177515],[375,-1551],[181,-2897]],[[275676,178510],[-28,1]],[[275584,178510],[-145,-585]],[[273766,172848],[-167,-3535],[-1729,10]],[[271870,169323],[9,4917]],[[269903,169694],[11,1]],[[269914,169695],[-11,-1]],[[269628,172609],[-7,-1]],[[269950,173591],[197,-1158],[100,-2595],[-427,921],[-144,1848]],[[271870,169323],[-1374,16]],[[270496,169339],[-105,2644],[304,1032],[-368,4],[-94,-803],[-283,1505]],[[276009,173064],[-4,0]],[[275994,173067],[-63,2]],[[275922,173070],[-37,2]],[[275863,173072],[173,-517],[58,-7156],[-69,-4426]],[[276025,160973],[-424,253],[-1823,-65]],[[273778,161161],[-12,11687]],[[273778,161161],[4,-1335]],[[273782,159826],[-1083,-119],[-9,4915],[-814,-69]],[[271876,164553],[-6,4770]],[[270224,168130],[277,-3878],[-101,-153],[-176,4031]],[[271876,164553],[5,-1689],[-271,-30],[4,-1925],[-522,237]],[[271092,161146],[-65,2473],[-474,1226],[-124,2786],[67,1708]],[[269914,169695],[-11,-1]],[[225190,169575],[-740,-9780]],[[224450,159795],[-249,-323],[-357,2361],[-856,1101],[54,932],[-216,1774]],[[226202,166385],[-130,-3036],[396,-281],[0,-1592]],[[226468,161476],[1,-5174]],[[226469,156302],[-921,-316],[-541,1945],[-163,1244],[-394,620]],[[228232,162657],[-37,0]],[[228195,162657],[37,0]],[[227998,166171],[-12,1]],[[228159,164435],[-24,128]],[[228135,164563],[-188,861]],[[227947,165424],[66,747]],[[228068,166173],[91,-1738]],[[227684,164584],[-2,-1373]],[[227682,163211],[-57,-570]],[[227625,162641],[156,-4]],[[227781,162637],[-161,-1600],[-220,-469],[-932,908]],[[227632,166164],[52,-1580]],[[272238,151333],[13,1]],[[272251,151334],[-13,-1]],[[273782,159826],[19,-5213]],[[273801,154613],[0,-3238]],[[273801,151375],[-1312,-39]],[[272489,151336],[-461,1867],[-228,-193],[-395,1936],[-191,1815],[-122,4385]],[[228287,156177],[-113,-1804],[-350,-1094],[6,-1266],[-410,861],[-516,2813],[-435,615]],[[227781,162637],[266,-4006],[-45,-1341],[285,-1113]],[[228232,162657],[-37,0]],[[276025,160973],[-123,-6439]],[[275902,154534],[-491,-343],[-1072,2],[-538,420]],[[275887,153137],[-181,-2634],[-305,-2456],[-117,-2922],[81,-1855],[-329,-2502]],[[275036,140768],[-16,1]],[[275020,140769],[-149,-433]],[[274871,140336],[3,-77]],[[274874,140259],[-199,601],[-388,-1467],[-445,274]],[[273842,139667],[-42,3489],[1,8219]],[[275902,154534],[-15,-1397]],[[274871,140336],[3,-77]],[[275036,140768],[-16,1]],[[275491,142866],[-401,-4416],[-362,-2015],[523,3742],[240,2689]],[[272251,151334],[-13,-1]],[[273842,139667],[-118,-686],[-512,-438],[-244,1966],[102,2255],[184,-1642],[296,-971],[166,920],[-246,1771],[-349,147],[-259,2833],[-188,3420],[234,599],[-210,869],[-82,-1356],[-127,1982]],[[267576,216906],[-181,85],[-177,1931],[-468,2015],[37,2409]],[[233545,583163],[470,-1],[0,7179],[546,-266],[367,-1412],[396,-7637],[-21,-1976],[288,-1125],[438,-310]],[[245498,568092],[407,1053],[402,-2818],[1697,311],[722,-2325],[297,673],[566,-549],[-1155,-3041],[-1287,-1848],[-816,-1938],[-809,-2999]],[[244050,541402],[0,-11146]],[[242235,539623],[262,1550],[296,-1143],[509,151],[748,1221]],[[245789,538230],[7,-8017]],[[244050,541402],[832,1558],[406,334],[672,1956],[311,-1206],[-365,-2639],[91,-1053],[-208,-2122]],[[245789,538230],[629,1480],[422,-1520]],[[246668,543604],[119,-491],[-601,-1771],[482,2262]],[[254361,554779],[386,-1343],[-682,-275],[51,-770],[-806,-2719]],[[253310,549672],[-198,1604],[-595,-3]],[[252517,551273],[244,1548],[576,1487],[1024,471]],[[252129,567028],[638,1076],[-743,-3451],[-872,-1784],[142,-551],[-582,-1037],[-166,1627],[1583,4120]],[[251344,546531],[128,1308],[718,2354],[11,-1815],[317,-391],[169,-3174]],[[253310,549672],[-511,-4124],[-63,2158],[-506,612],[-29,1852],[316,1103]],[[256406,536544],[1,-6252]],[[256407,530292],[-349,-1],[-4,-3236],[-348,4]],[[253820,544308],[634,-392],[509,-1456],[171,-1720],[674,-4188],[598,-8]],[[257802,530287],[-1395,5]],[[256406,536544],[265,725],[573,-1784],[182,767],[315,-1250],[489,2628],[901,2228],[763,318]],[[258234,522812],[-689,-1999],[491,3712],[-698,206],[-249,-2796],[-468,641],[-361,-1503],[-267,-2116]],[[255011,510600],[-34,-2168],[-371,-346]],[[254679,502703],[345,2967],[570,1286],[473,4865],[330,489],[143,1897],[235,8],[-572,-6085],[-44,-1741],[-319,-1641],[-155,-2072]],[[266291,525882],[-781,768]],[[265510,526650],[490,1336],[-121,1234],[374,-217],[304,-1926],[-266,-1195]],[[264534,537282],[192,-119],[-169,-2149],[-263,1387],[240,881]],[[264771,527003],[-281,50]],[[264490,527053],[-48,-2]],[[264442,527051],[-19,1612],[-346,2],[-1,1612],[-2086,1],[-3,1628],[-347,-5]],[[261640,541399],[788,243],[-207,-1485],[-13,-3740],[568,-816],[557,744],[103,-1308],[702,1641],[226,-1324],[215,-3356],[-110,-1628],[279,286],[140,-1587],[477,-2056],[-594,-10]],[[263518,523913],[579,-847],[-387,-679],[-192,1526]],[[264771,527003],[-281,50]],[[264442,527051],[-1182,1275],[-230,-2015],[-35,-1966],[-708,3125],[-1172,1762],[-254,-167],[-380,-2334],[-589,11]],[[263048,514103],[-754,-309],[-259,1733]],[[262035,515527],[484,1049],[-316,238],[-233,2467],[498,2960],[580,1140]],[[261221,512584],[62,1278],[458,1591],[294,74]],[[260809,522685],[124,-2642],[-358,-487],[234,3129]],[[259619,509895],[-266,698],[189,945],[77,-1643]],[[260516,504530],[-484,-12]],[[259309,504590],[9,2169],[372,1309],[375,-215],[515,4334],[144,-2358],[-222,-3318],[14,-1981]],[[260516,504530],[127,-152],[342,4121],[-150,-4480],[236,2087]],[[266792,512571],[208,-2838],[-312,125],[-6,-2477],[298,-1300]],[[266298,493143],[-35,-2126],[-276,-1071],[-460,39],[-182,-1553]],[[266573,485031],[572,4601],[580,621],[347,1131],[524,-1430],[297,-2969],[77,-2649]],[[269259,474627],[236,-3606],[-157,-1606],[-122,-4884],[-353,82],[-169,1029]],[[268236,461261],[-80,-1234],[-498,-1330],[-248,-2668],[-87,-2522]],[[267323,453507],[-275,1113],[-676,-161]],[[266582,447887],[26,6]],[[266536,447880],[30,6]],[[267323,453507],[-736,-4608],[-57,-1020]],[[276369,283639],[51,-2897],[155,-81],[-317,-2464],[-721,-1619]],[[275274,275950],[-210,1998]],[[278269,287761],[-76,264]],[[276907,282488],[-285,-1501],[-132,340],[309,2769]],[[277898,288714],[355,-1067],[-412,-2026],[-412,-58],[-522,-3075]],[[61945,65039],[-273,273]],[[61672,65312],[273,-273]],[[64909,48285],[736,-2763],[362,-391],[488,-1482],[554,-3197],[-24,-2084],[243,12],[55,-1737],[491,-2285],[-473,-3219],[-429,-1374],[-452,-185],[-605,-2496],[-405,-3858],[-627,2125],[-104,1501],[90,4218],[-292,5440],[-196,1716],[344,2264],[318,3335],[-188,1774],[-22,2014],[136,672]],[[55029,84761],[232,-813],[-50,-4138],[-317,-1725],[-532,857],[-340,1190],[-70,1626],[168,1566],[391,1358],[518,79]],[[53118,80469],[25,-1794],[-232,-683],[-127,-1603],[-75,1953],[409,2127]],[[61945,65039],[564,-356],[-456,-1900],[-525,1011],[-688,11],[160,2281],[672,-774]],[[61752,60573],[247,-292],[244,-1961],[-83,-859],[-351,-533],[-258,3325],[201,320]],[[62905,54516],[44,-1245],[-350,-600],[8,965],[298,880]],[[62814,62496],[341,-2480],[438,902],[263,-353],[321,-1916],[311,-600],[36,-1558],[-161,-1021],[-712,-1317],[-390,412],[-55,3221],[-459,617],[-171,1326],[59,2293],[179,474]],[[58972,75139],[409,-3431],[-19,-1219],[215,22],[315,-3032],[-404,-786],[-271,1419],[-580,-705],[-493,5220],[435,169],[393,2343]],[[996993,632383],[817,-1163],[91,-906],[715,-2639],[-620,1211],[-351,1710],[-879,1732],[227,55]],[[950,635992],[99,-1643],[-281,619],[182,1024]],[[7984,636500],[-23,-2275],[-307,-73],[-67,2101],[397,247]],[[8255,636861],[429,-729],[-176,-971],[-344,386],[91,1314]],[[8792,637399],[78,-1228],[-422,750],[344,478]],[[2944,637533],[354,-28],[110,-1138],[763,-730],[-472,-573],[-85,-1947],[-423,-823],[-299,1293],[443,1084],[-738,1715],[347,1147]],[[5406,633633],[-183,-598],[-329,1038],[-855,-380],[1116,1264],[255,737],[16,1940],[428,-501],[-230,-1193],[22,-1774],[-240,-533]],[[996377,638802],[311,-784],[-244,-853],[-67,1637]],[[7153,639094],[-123,-3160],[551,52],[-111,-1993],[-621,-692],[-248,-1116],[-149,1715],[-276,-2445],[-149,1181],[345,1636],[-141,1180],[574,-355],[-294,2579],[642,1418]],[[999634,639522],[333,-975],[-327,-1865],[-356,430],[-110,1602],[460,808]],[[8394,641129],[361,-843],[-150,-1151],[-356,-113],[145,2107]],[[993962,641501],[134,-1164],[-300,-1591],[4,-1345],[-561,-90],[-112,-1517],[-310,1266],[482,1562],[297,123],[366,2756]],[[15681,641867],[-88,-644],[552,-599],[499,441],[599,-277],[-1373,-851],[-663,468],[-397,-613],[-511,1117],[345,752],[244,-725],[793,931]],[[18717,646240],[354,-1060],[-312,-984],[-542,-452],[87,1790],[413,706]],[[13937,646817],[445,-1871],[-209,-1713],[-378,-563],[294,-1046],[-846,-838],[-954,-1616],[-415,665],[-937,-680],[1038,1800],[664,138],[756,1388],[293,1606],[-346,796],[247,1637],[348,297]],[[983194,648582],[-58,-2897],[-305,734],[-723,157],[686,1802],[400,204]],[[23639,652034],[278,-453],[-114,-1345],[-515,-1145],[-82,1788],[433,1155]],[[26147,655623],[247,-1330],[-168,-813],[-713,1495],[634,648]],[[980647,657671],[765,-147],[436,-2390],[462,-235],[-708,-1136],[-317,775],[-432,-1614],[-470,872],[166,1668],[-517,-336],[77,1140],[-541,-71],[552,1546],[527,-72]],[[28035,654543],[906,4624],[-94,1472],[528,2186],[746,66],[-272,830],[81,1805],[502,2014],[613,648],[608,-970],[-156,-2372],[-1194,-2675],[-517,-3466],[-1751,-4162]],[[36358,673363],[-391,-2467],[-196,1415],[587,1052]],[[34798,676523],[212,-3286],[496,2734],[387,-122],[70,-1818],[-314,-391],[-519,-2697],[580,1301],[182,-1595],[-674,-869],[-156,-1539],[-279,591],[46,-1877],[-401,265],[-1841,-3579],[-466,-1377],[-652,1241],[1054,2460],[1095,1206],[-225,1759],[468,337],[-151,1493],[938,464],[-874,524],[-341,2033],[352,1704],[1013,1038]],[[26198,724966],[755,-263],[-288,-1191],[-467,1454]],[[25148,736553],[-442,-1992],[-390,1137],[832,855]],[[39421,678834],[125,-1114],[-549,-30],[-135,746],[559,398]],[[36826,680387],[730,-1661],[-578,-1781],[-480,150],[-103,2381],[431,911]],[[38083,681762],[-169,-1483],[356,-62],[-384,-1861],[-335,2175],[179,1214],[353,17]],[[45572,685391],[687,-1487],[-645,-37],[-42,1524]],[[46952,694607],[167,-1890],[-230,-1028],[-301,1739],[364,1179]],[[42854,695877],[634,14],[266,-1568],[336,-4089],[372,437],[215,-1478],[-488,52],[-124,932],[-254,-1722],[-453,-779],[-609,441],[-826,-359],[-642,-1585],[-62,-1249],[-802,-1375],[-569,492],[-278,2147],[72,1348],[583,1047],[405,3984],[356,1064],[528,-514],[981,2495],[359,265]],[[48298,698203],[503,-1314],[-281,-971],[-458,2013],[236,272]],[[54720,699114],[34,-1697],[-430,-1611],[396,3308]],[[53769,699716],[-57,-3065],[-690,-2054],[15,3270],[392,-758],[86,2465],[254,142]],[[52387,701641],[20,-2213],[-523,1390],[503,823]],[[51367,702388],[94,-1872],[270,219],[342,-2313],[-186,-1094],[-922,1412],[40,2470],[362,1178]],[[52632,703466],[225,-1137],[-483,351],[258,786]],[[56429,729876],[0,-164]],[[56429,729712],[1,-1271]],[[56430,728441],[-377,-902],[0,-1576],[-688,44],[0,-1691],[-884,0],[-2,-1609],[-853,-47],[-11,-3153],[262,-17],[12,-6313],[-174,-1752],[844,0],[1,-4664]],[[54560,706761],[-221,3583],[-466,487],[-226,-1331],[-227,543],[-128,-1791],[-941,-1953],[-502,-2559],[-203,1961],[-156,-2246],[-321,-160],[-388,1335],[-213,-1550],[-895,-1527],[-527,87],[101,2154],[312,2133],[-634,501],[-315,-1612],[37,-2336],[-533,-3433],[-423,296],[235,-2134],[-319,-953],[-327,1503],[-197,-2494],[-614,575],[-125,3742],[-386,953],[-195,-965],[304,-1471],[136,-4091],[-323,1731],[-86,-1650],[-582,-104],[-228,2389],[-557,961],[-44,-1927],[533,-1473],[-912,-2585],[204,4150],[-78,1484],[292,977],[935,318],[218,2402],[379,1261],[396,-106],[-126,1804],[846,4218],[1241,3632],[1202,1198],[763,131],[637,709],[-430,-1918],[671,-3199],[315,-565],[-272,3532],[663,-283],[157,-1434],[615,-516],[79,1328],[-802,1925],[-146,1183],[588,5125],[1474,4921],[1403,2354],[1201,3895]],[[131840,702693],[477,-1814],[-260,-3591],[-338,3444],[121,1961]],[[133475,712615],[472,-2306],[365,-3908],[-109,-3956],[-237,-2723],[-412,-1256],[-725,1926],[513,3110],[-666,-3077],[-841,2748],[552,2915],[-269,716],[-19,1677],[520,1253],[-148,1905],[1004,976]],[[60957,762087],[579,2152],[206,3039]],[[61742,767278],[1862,118],[1,-5313],[-2648,4]],[[51410,765657],[-524,-4199],[-535,-542],[51,2808],[1008,1933]],[[50362,766039],[-742,-1613]],[[49620,764426],[-84,1634],[826,-21]],[[55886,766355],[508,-1408],[386,-3700]],[[56780,761247],[192,-1494],[-550,-1757],[-437,893],[-941,6038],[-709,1488],[71,1756],[-304,-417],[-190,-2035],[-311,-514],[-283,1932],[-661,238],[-84,2398],[-286,617],[-1293,-3499]],[[50994,766891],[-530,-524]],[[50464,766367],[-1,3048],[447,4],[154,1512],[-5,3289],[475,13],[-1,1619],[475,67],[154,1547],[2,3270],[484,-4],[7,3225],[637,43],[12,3203],[445,89],[14,3067],[183,1579],[477,25],[0,3225],[492,-12],[187,1563],[7,3225],[507,4],[6,1610],[466,16],[198,3194],[2957,4],[8,-1469],[509,-22],[-8,1633],[498,0],[-1,1661],[983,-7],[4,-1637],[3363,-86]],[[64599,804865],[7,-22904],[-456,-40],[-3,-1619],[-951,22],[-1,-1609],[-472,19],[-265,-3261],[-958,50],[-2,-1622],[-474,33],[7,-3299],[225,-22],[8,-3864]],[[61264,766749],[-1094,-1968],[-1643,-2597],[-487,694],[-101,1404],[-594,1396],[199,3649],[-345,-1592],[-443,-553],[-69,-2804],[-801,1977]],[[61034,724293],[684,-546],[-930,-219],[246,765]],[[56429,729876],[0,-164]],[[71634,804882],[114,-1587],[1,-6528],[-371,-12],[-9,-6508],[-349,-18],[4,-6265],[-357,2],[-2,-1646],[-479,-10],[4,-3277],[-474,-9],[9,-1643],[-817,-49],[14,-3240],[-942,-29],[6,-3278],[148,-20],[-1,-6355],[154,-1634],[923,0]],[[69210,762776],[7,-3471],[-452,-1843],[-737,-1056],[-774,-256],[-138,-1018],[-764,-799],[5,-5901],[-324,-916],[-689,-542],[-207,-2415],[-364,-3],[218,-1278],[-365,-813],[-334,533],[-169,-1391],[-664,236],[-689,-3490],[-376,-3218],[1106,-40]],[[63500,735095],[-534,-3229],[-497,991],[-283,-2643],[-165,1250],[-876,-3730],[-514,1840],[-92,-1738],[-418,-1466],[296,-1221],[-476,-272],[-290,1208],[-837,-1435],[-237,-1294],[834,518],[-97,-1512],[-773,886],[47,-1061],[-586,328],[-1007,-4054],[729,1416],[657,-1055],[-889,-5668],[-359,2476],[4,-2388],[-569,564],[-201,-1660],[-1171,-915],[-207,-1647],[-123,1992],[-209,-168],[97,-2311],[-194,-2336]],[[56430,728441],[767,-812],[-200,4018],[209,1634],[848,4197],[641,1528],[417,1983],[585,1663],[449,-1863],[-119,2913],[-249,-206],[-34,2059],[291,6723],[197,1491],[338,172],[-417,2930],[210,2814],[594,2402]],[[61742,767278],[-122,1251],[-356,-1780]],[[64599,804865],[4288,-12],[2747,29]],[[65700,709070],[-505,743],[539,1338],[-34,-2081]],[[70400,724037],[-203,-1087],[-508,-19],[711,1106]],[[68718,724702],[-248,-2013],[-522,-1694],[196,2303],[574,1404]],[[69851,724354],[-436,-1711],[-362,958],[373,1309],[425,-556]],[[72264,735888],[653,-276],[179,-1133],[-749,-602],[-369,-1913],[-212,2137],[498,1787]],[[71588,750055],[467,-1112],[219,-1969],[-712,1537],[26,1544]],[[72121,750653],[752,-1609],[143,801],[402,-896],[-318,-1580],[497,-23],[268,1873],[865,-1804],[-645,-1899],[255,-25],[-10,-2224],[879,340],[-526,-3652],[-487,209],[-629,1356],[-203,-635],[516,-1217],[-217,-2411],[-309,-183],[-529,1368],[-252,-544],[428,-942],[-369,-902],[-532,226],[-639,-2935],[-448,348],[323,-1679],[-994,-4198],[-692,-436],[210,1779],[607,2267],[-321,-122],[144,1970],[-434,-1663],[-185,436],[447,2279],[-692,794],[-670,-678],[120,-1421],[343,1135],[575,213],[-522,-3914],[-671,1507],[-37,3723],[-598,1836],[85,2427],[257,1668],[757,2434],[973,102],[64,-1861],[627,-4463],[-146,2063],[78,2795],[-204,1554],[706,-247],[-927,1791],[7,1470],[588,1559],[420,-1165],[70,-2442],[173,2478],[786,-908],[-90,1984],[526,-1432],[-620,2635],[25,690]],[[72294,752633],[298,-243],[385,-2001],[-772,1279],[-524,168],[436,1600],[177,-803]],[[74768,758553],[203,-1495],[404,602],[-150,-1955],[513,1173],[-64,-2164],[-263,-1096],[-683,1715],[168,-2076],[-474,81],[-333,-1022],[-38,2484],[-167,-2623],[-421,-227],[-1,-1319],[-1063,2147],[-115,1830],[591,-260],[-305,1148],[155,946],[718,-477],[-71,2281],[416,1422],[495,-330],[341,-2521],[144,1736]],[[73815,761335],[866,1186],[-377,-3031],[-416,471],[-73,1374]],[[72145,766667],[-257,-165],[-279,-2562],[-648,-1819],[-613,-91],[-175,-2212],[-343,-44],[106,-2403],[-387,-650],[216,-848],[-603,-2221],[-49,-1387],[-356,1779],[54,-1574],[-325,275],[-478,-1769],[-794,237],[-110,-2260],[-820,-2014],[-130,-1038],[-600,883],[68,-2348],[-395,-579],[8,-1505],[-775,384],[-34,-2432],[-520,654],[-902,-2724],[-22,-1053],[572,813],[-196,-1902],[142,-997]],[[69210,762776],[1368,8],[-4,1620],[1015,10],[-8,2250],[405,-14]],[[71986,766650],[159,17]],[[127092,749125],[-107,-525]],[[126985,748600],[107,525]],[[125289,753706],[-418,-538]],[[124871,753168],[418,538]],[[124853,753145],[-548,-606],[-395,-1297],[-254,1284]],[[123656,752526],[58,1721]],[[123714,754247],[93,682]],[[123807,754929],[27,-1188],[797,113],[222,-709]],[[124293,757146],[750,-2547],[-1015,763],[-163,962],[428,822]],[[124853,768717],[212,-1953],[1164,-2450],[371,-2181],[919,-3383],[-234,-797],[807,-4371]],[[128092,753582],[-944,-4191]],[[127148,749391],[-329,-1604]],[[126819,747787],[-267,-754]],[[126552,747033],[-348,2791],[-601,2743],[-35,3375],[303,711],[-120,1531],[-569,-3645],[-842,2824],[-590,340],[-225,2827],[-376,2538],[-7,5750]],[[123142,768818],[1711,-101]],[[122508,768865],[608,-35]],[[123116,768830],[93,-1237],[-284,-3190],[-328,1968],[-89,2494]],[[125029,711856],[427,56],[-445,-1309],[18,1253]],[[123927,716625],[1,1610]],[[123928,718235],[-1,-1610]],[[130216,719801],[107,-2063],[755,-2315],[-337,-626],[254,-2100],[-618,-805],[-299,1242],[210,718],[-488,1319],[-280,-690],[-164,3076],[325,413],[163,1718],[372,113]],[[129378,721918],[250,-1134],[-116,-2167],[-589,-788],[-541,1882],[182,1807],[814,400]],[[130831,716911],[-489,1839],[73,2204],[-143,1693],[379,-777],[303,-2037],[326,197],[294,-2758],[-436,-1557],[-307,1196]],[[128816,728558],[1033,-4174],[-771,-1663],[-361,265],[62,2359],[-148,3100],[185,113]],[[126153,727422],[-66,1104],[447,-558],[-459,-4949],[-272,-4761],[207,396],[-145,-3602],[-197,615],[-111,3651],[-136,-5807],[-278,1260],[-135,3642],[146,2920],[525,49],[-191,2101],[-591,341],[100,963],[-331,2219],[-28,2428],[338,-758],[185,2186],[563,-1046],[429,-2394]],[[126097,733937],[1280,-1597],[902,-116],[343,-1458],[135,-4906],[-200,-1131],[-500,1925],[-370,3180],[208,-4438],[379,-383],[50,-1490],[-321,-1688],[-659,1031],[14,-897],[-617,-308],[-202,4527],[181,2218],[-303,119],[-132,1682],[-636,2448],[448,1282]],[[130329,738612],[337,-2561],[-337,-2230],[902,-864],[-219,-3192],[699,-1259],[104,-3850],[709,243],[1430,-3886]],[[133954,721013],[215,-2256],[-268,-1574],[-450,60],[-522,-1243],[216,-2328],[-366,57],[-534,1418],[-527,-1313],[-52,-1739],[-416,-1188],[273,-1077],[-70,-1917],[-375,-1020],[-347,1785]],[[130731,708678],[461,1375],[54,2694],[202,40],[-10,3932],[574,625],[-464,526],[-186,2188],[-505,719],[-71,1280],[-436,1390],[254,2614],[-501,-62],[-115,1369],[-778,1724],[-462,2944],[355,-607],[-84,2467],[-160,-1289],[-1098,1537],[-631,1283]],[[127130,735427],[606,1116],[481,-957],[392,2691],[952,1778],[768,-1443]],[[126819,747787],[-267,-754]],[[120135,747679],[-911,-75]],[[119224,747604],[-113,-8]],[[119111,747596],[-67,-5]],[[119044,747591],[175,3135],[916,-3047]],[[118825,752542],[435,-1596],[-323,-3068],[-279,1218],[167,3446]],[[127130,735427],[-12,1829],[1070,643],[-784,626],[-296,2733],[132,1559],[-542,1078],[246,1825],[1153,-2770],[-708,2710],[-429,722],[25,2218]],[[127092,749125],[56,266]],[[128092,753582],[283,-2841],[560,-2991],[879,-6389],[515,-2749]],[[124853,753145],[18,23]],[[125289,753706],[-147,-677],[908,-5880],[23,-2256],[-213,92],[-809,7066],[78,-1904],[-258,510],[590,-4994],[507,-2211],[51,-2144],[-521,218],[645,-2298],[-310,-1473],[-532,1666],[52,-3416],[-404,-716],[-196,-1446],[-545,-1275],[-190,2104],[51,2518],[366,839],[-3,1567],[-686,5962],[70,2065],[-287,4181],[127,722]],[[121078,751604],[-275,-1102]],[[120803,750502],[345,-330],[594,2364],[321,432]],[[122063,752968],[1024,-1345],[153,-1323],[-236,-1608],[-621,1179],[756,-2767],[-774,-493],[-453,1349],[-1420,2800]],[[120492,750760],[-345,-2996]],[[120147,747764],[-1106,4388],[167,2241],[347,-765],[278,1062],[445,-194],[426,1507],[913,-2103],[-539,-2296]],[[121729,756782],[0,-124]],[[121729,756658],[0,124]],[[123714,754247],[-96,-1670],[-340,1775],[-157,4018],[686,-3441]],[[120619,759891],[-327,4038],[-329,1992],[900,1274],[-791,545],[-394,2927],[235,-3862],[-190,-2032],[-886,1580],[-102,2460],[-279,-1505],[-689,1343],[-390,-1137],[761,-460],[670,-1418],[-346,-493],[775,-1580],[-470,-1770],[538,847],[341,-512],[456,-4298],[-640,-1196],[-13,909],[-620,-1129],[-299,1069],[42,-2620],[-717,2665],[-654,322],[-1471,4078],[-935,3744]],[[114795,765672],[1165,1936]],[[115960,767608],[1943,4721],[681,110],[264,1748]],[[118848,774187],[1665,-1619],[530,-1279],[325,-2198],[-479,-4537],[582,-819],[408,-1530],[232,-2152],[-489,-12]],[[121622,760041],[48,-2295],[-405,960],[-824,-873],[178,2058]],[[122913,775799],[-901,-103]],[[122012,775696],[-90,222]],[[121922,775918],[-935,7001]],[[120987,782919],[676,1289],[684,-1897],[571,-2466],[-201,-2534],[196,-1512]],[[121729,756782],[0,-124]],[[123142,768818],[-26,12]],[[122508,768865],[-496,6831]],[[122913,775799],[197,-1218],[722,-594],[60,-1056],[546,-1130],[415,-3084]],[[121922,775918],[-144,-2315],[-359,301],[514,-2662],[-51,-2482],[722,-6540],[-70,-1017],[303,-3963],[-99,-2100],[-512,-56],[-321,1677],[-283,3280]],[[118848,774187],[35,3836],[479,-24],[182,1767],[-318,752],[1118,1161],[643,1240]],[[120877,738496],[390,-2216],[136,-2451],[-166,-1458],[-605,-381],[12,6413],[233,93]],[[122849,727161],[-438,-147],[77,1437],[-514,245],[-60,2351],[447,1679],[-481,1224],[98,2801],[-465,-185],[-451,2135],[588,60],[-327,842],[146,1990],[629,564],[-76,-1197],[394,257],[557,-1676],[491,7],[-82,-2391],[464,-6886],[222,-4906],[-140,-7130]],[[123927,716625],[-394,1362],[-697,5371],[278,1647],[-447,-368],[182,2524]],[[119111,747596],[-67,-5]],[[119342,746836],[-118,768]],[[120135,747679],[12,85]],[[120492,750760],[1454,-3708],[395,-1834],[350,1018],[503,16],[258,-5147],[-689,-337],[-264,1058],[-1794,4643],[718,-3300],[32,-2583],[-442,-1626],[-366,435],[-451,2590],[538,-1592],[-959,3723],[85,790],[-518,1930]],[[40063,839903],[771,-536],[-860,-2772],[-124,3412],[213,-104]],[[40964,844347],[884,-2223],[78,-1915],[441,-2171],[-39,-1740],[-705,2419],[-1774,1536],[91,1825],[445,2301],[579,-32]],[[42066,848667],[903,-976],[562,-1663],[-706,-1821],[-339,-2285],[-563,-2],[-711,2401],[-621,812],[15,1297],[651,1761],[809,476]],[[46154,848898],[568,1],[10,-1610],[528,1],[19,-1676],[523,-12],[-3,-1547],[3176,0]],[[50975,844055],[-396,-2136],[-20,-6445],[-125,-25],[-7,-6437],[383,-5],[-10,-4748],[1058,-39]],[[51858,824220],[180,-1451],[604,-215],[-1456,-2220],[-979,-2588],[-900,-571],[-1213,-1602],[-1235,662],[-494,709],[-1854,-1999],[-659,648],[-690,-2756],[-940,669],[31,-2392],[-390,-2165],[-92,-1943],[-1046,-1523],[-745,776],[-936,-1159]],[[39044,805100],[-171,1112],[663,830],[-1128,3201],[-12,-2176],[-520,182],[-235,2567],[116,849],[-614,571],[-206,2123],[418,1187],[-482,1394],[-545,-1187],[-96,2644],[1074,795],[-527,599],[-413,1924],[1381,582],[-440,3023],[250,2550],[1109,5288],[620,2101],[570,-118],[933,3976],[823,-896],[964,-4031],[-209,4581],[-456,1793],[11,1197],[848,640],[79,1725],[725,1785],[524,-1399],[777,464],[611,2670],[668,1252]],[[46897,791982],[260,-1285],[-269,-665],[9,1950]],[[36192,795959],[181,-1952],[581,363],[562,-947],[-124,-4413],[449,-2402],[-1266,-1162],[-486,-2126],[-685,2000],[-493,-131],[-1055,2670],[-324,-89],[-643,1570],[-207,2198],[273,857],[1285,-624],[56,1282],[1009,2111],[904,-187],[-17,982]],[[17304,799216],[127,-1745],[803,-2158],[617,-183],[448,-1365],[-1029,65],[-1000,3083],[-322,373],[356,1930]],[[39655,805231],[135,-1106],[641,589],[-100,-1482],[648,41],[525,-808],[140,-1889],[-483,-1833],[-425,-534],[212,-1308],[-375,-571],[-318,-2845],[-422,135],[-776,2413],[439,1980],[-611,-774],[-640,997],[1251,2977],[-199,1359],[401,589],[-43,2070]],[[49028,771386],[-724,158],[-208,-907],[-383,2903],[195,2895],[687,2210],[-440,2484],[-274,3082],[-346,1471],[-415,3726],[137,1138],[-768,3115],[394,1259],[285,3791],[-130,577],[-402,-4189],[-433,-1001],[310,-2534],[-69,-3036],[-405,-1085],[-1628,-2447],[-1521,-851],[-1011,789],[-258,2086],[267,429],[-760,1956],[-694,3087],[-88,1177],[383,1597],[-109,1291],[397,379],[-183,1458],[364,50],[277,1573],[410,342],[229,1752],[701,-118],[-15,-3249],[424,240],[608,2498],[-385,1562],[-1050,843],[630,147],[399,1002],[-599,266],[-481,-1345],[-126,3490],[-457,-1833],[194,-1308],[-1242,-569],[-216,1520],[-537,-627],[-175,927],[-743,-457]],[[51858,824220],[3536,-32],[11,1610],[2034,-6],[-4,1618],[4083,202],[1,-1838],[5892,-29],[3388,4],[-14,1716],[962,60],[3,1570],[903,-11],[192,1616]],[[72845,830700],[-2,-16190]],[[72843,814510],[-1303,45],[-15,-5422],[125,-21],[-16,-4230]],[[50464,766367],[-102,-328]],[[49620,764426],[-138,-1468],[-1062,-1905],[-96,1293],[-1035,446],[861,1205],[617,1650],[-307,160],[-106,3181],[674,2398]],[[91002,847056],[9,-3988],[146,-1795],[7,-11469],[-1548,27],[56,-1647],[46,-12768],[-726,13],[-1,-927],[-3493,32]],[[85498,814534],[-2027,-32],[-140,995]],[[83331,815497],[-404,601],[-736,-459],[-672,-2022],[-282,-2604],[-1336,126],[-327,2166],[-16,-1517],[-1058,-1636]],[[78500,810152],[-3,1152],[-1003,21],[-4,3165],[-4647,20]],[[72845,830700],[0,8044]],[[72845,838744],[3088,-82],[11,1347],[6637,9993],[4096,-25],[11,2587],[2946,186]],[[89634,852750],[1354,59],[14,-5753]],[[86653,868811],[757,-1569],[2146,14]],[[89556,867256],[86,-6324],[-8,-8182]],[[72845,838744],[1580,8236],[-1,2534],[-535,-83],[-516,926],[-152,2433],[36,3161],[1704,93],[23,3109],[497,-4],[22,3291],[619,95],[96,1432],[589,58],[151,-985],[624,-419],[1536,6612],[4539,-401],[2996,-21]],[[85498,814534],[-38,-10730],[-759,-83],[1,-2090]],[[84702,801631],[-828,17],[8,1987]],[[83882,803635],[-434,1931],[-461,-308],[-1061,1669],[-902,2471],[707,3049],[1129,2748],[471,302]],[[97244,787641],[-970,-3439],[64,996],[906,2443]],[[87222,789210],[-180,-1772],[-422,-410],[602,2182]],[[86635,788749],[223,2200],[233,-961],[-456,-1239]],[[86658,791573],[-368,-3115],[-331,1166],[699,1949]],[[89188,794370],[360,-14],[-242,-1523],[503,637],[-807,-2688],[-814,-3927],[157,-1241],[-672,-1392],[-694,-249],[129,1479],[1250,4306],[686,2953],[144,1659]],[[86770,795107],[-72,-1859],[-323,817],[395,1042]],[[90857,797012],[511,-366],[-56,-1276],[665,500],[124,-712],[-949,-1371],[-533,-1467],[-219,828],[596,1566],[-651,-377],[-24,893],[536,1782]],[[87021,792777],[237,3392],[601,-294],[-413,-4995],[-425,1897]],[[84911,786500],[233,323],[68,9012],[-286,661]],[[84926,796496],[584,1622],[519,-1019],[524,1881],[285,-1347],[30,-1922],[-996,-2869],[605,-1030],[-718,-2215],[-215,-2677],[-633,-420]],[[92921,798974],[-9,-545],[-1146,-2071],[-222,1208],[1377,1408]],[[88340,800844],[382,-576],[-511,-770],[129,1346]],[[84952,800675],[-2,141]],[[84950,800816],[2,-141]],[[86236,802132],[283,-1843],[-420,600],[137,1243]],[[84952,797243],[-2,3142]],[[84950,800385],[697,2105],[-36,-2998],[388,2501],[244,-2671],[-389,-1481],[-418,814],[-484,-1412]],[[86677,805210],[324,-2117],[-624,-286],[300,2403]],[[87480,803390],[-299,-138],[-586,2075],[324,2591],[505,2085],[122,1742],[-770,-3524],[-194,-1549],[-274,1236],[-413,-4415],[-943,-1986]],[[84952,801507],[-250,124]],[[91002,847056],[976,234],[64,648],[2681,18],[1,-1651],[1594,-292],[4038,-37],[350,-2273],[-454,-2972],[436,-1269],[-270,-2840],[731,-302],[296,1951],[1174,-336],[-16,-1588],[538,-65],[-11,-1550],[467,-24],[-41,-6434],[413,-697],[4,-4218],[2304,16]],[[106277,823375],[-1,-28115]],[[106276,795260],[-590,822],[-1600,-31],[4,1610],[-3846,-34],[-2014,-8871],[13,-855]],[[98243,787901],[-1022,2714],[47,774],[-1004,-33],[-277,1650],[-683,426],[369,3141],[18,2628],[-611,-1565],[-178,-1401],[-660,-2022],[-456,1505],[-715,1071],[-573,-359],[943,3800],[-1115,-764],[259,1691],[-925,-1558],[532,2101],[-1009,-888],[-678,62],[-94,801],[1014,956],[446,1115],[-1049,-704],[-517,1833],[318,3213],[1053,57],[-177,903],[-745,-283],[-1115,-3389],[-359,1426],[-193,-1467],[-586,-1116],[-377,408],[6,3472],[-279,-1340],[36,-2946],[-407,-423]],[[71986,766650],[159,17]],[[71670,777076],[234,-1111],[-578,-409],[344,1520]],[[79473,776784],[-278,-2074],[90,2387],[188,-313]],[[75949,796147],[-337,-1236],[224,2635],[113,-1399]],[[84952,800675],[-2,141]],[[84952,801507],[-2,-1122]],[[84952,797243],[-26,-747]],[[84911,786500],[-1246,807],[241,1474],[-372,-167],[-386,-2037],[-206,3701],[-28,-2396],[-481,-1666],[-173,-1732],[-183,2620],[-198,-5326],[-848,3357],[-38,-1545],[419,-800],[-370,-1104],[-68,-1569],[-635,-858],[207,3841],[-673,-5212],[-363,1475],[21,-2088],[-388,-20],[-756,-4011],[-73,2111],[-348,-2231],[-660,934],[-173,-858],[-798,-888],[-19,1049],[-622,715],[205,2741],[545,1203],[719,24],[16,1316],[737,963],[-66,842],[764,2927],[-371,25],[-1227,-2967],[-387,246],[-630,2275],[461,4880],[786,3381],[112,2715],[231,475],[102,3025],[-411,3227],[967,1254],[994,2799],[846,1832],[515,-1977],[449,-352],[796,1052],[345,-814],[1491,-887],[199,-646]],[[78500,810152],[-529,-2655],[-888,-709],[-892,-2927],[269,-2258],[-403,43],[-549,-1340],[-154,-1303],[-581,-1608],[-230,-3803],[-475,-1478],[-1034,410],[707,-1448],[308,-1772],[-382,-2913],[-286,-680],[-1150,-274],[-158,-989],[796,2],[-164,-2224],[-453,-1067],[-563,295],[228,1314],[-337,1411],[32,-1983],[-397,-2577],[-671,-197],[278,-1966],[-1055,-1700],[-60,-2764],[-263,-488],[166,-2860],[276,1050],[1025,35],[413,-1681],[604,-1165],[58,-1233]],[[110730,776964],[-495,571],[-783,1959],[461,898]],[[109913,780392],[89,-474],[542,2604],[-420,3603],[332,1618],[530,-2532],[165,177],[-480,2635],[-360,838],[-174,-1871],[-464,-2242],[-1472,-2407],[-1544,735],[-1623,2726],[527,2089],[-370,3153],[-376,-856],[438,-1616],[-624,-1272],[-2761,2302],[-2697,-711],[-928,-990]],[[106276,795260],[0,-1588],[1342,-1612],[173,1644],[1330,-2348],[802,2853],[1723,322],[-346,-4919],[404,-1740],[965,-1648],[226,-2564],[2839,-9770],[299,-4811],[-73,-1471]],[[114795,765672],[-74,1821],[-694,2541],[-828,1292],[164,1473],[-569,-631],[-2064,4796]],[[106279,946180],[-1,-49413]],[[106278,896767],[-929,-2456],[-130,-1601],[-1321,-3359],[-906,419],[-784,-1692],[-450,407],[-348,-3372],[-325,-1449],[-654,-436],[-1189,-2953],[59,-3793],[-686,-1989],[-822,655]],[[97793,875148],[-204,2150],[357,3326],[-316,718],[514,846],[-159,1080],[-964,-156],[-338,-900],[-1243,1394],[-887,-1195],[-579,221],[-638,-953],[-287,1202],[374,853],[-1289,1884],[-166,1203],[399,1801],[-515,869],[-625,-618],[-460,-1403],[-1060,-1320],[-1074,-10],[-601,-1159],[-3102,6],[49,-11364],[273,317],[853,-2473],[548,-2656]],[[50975,844055],[10,4776],[491,30],[-58,4948],[549,10],[4,1425],[1102,13],[-16,1635],[486,23],[-4,1682],[645,-27],[-89,4840],[-627,-25],[-61,12985],[569,33],[-9,3217],[558,13],[-5,6310],[540,-19],[-5,4867],[-576,-8]],[[54479,890783],[-5,8106],[1752,-15],[3,3093],[2984,34],[5,6544],[2342,37],[1,-3290],[1183,54],[7,3236],[1193,13],[-3,-1577],[601,61],[1,-1630],[1167,-18],[135,4836],[1805,-29],[9,2778],[1841,-6],[168,1643],[-10,6647],[-438,-21],[-10,1684],[-1233,59],[3,4809],[170,1665],[-625,-6],[17,1605],[-634,-27],[7,1645],[-620,11],[151,4212]],[[66446,936936],[6419,-3],[8315,-30],[7299,19],[3887,5],[-10,9096],[4663,309],[4791,-300],[4469,148]],[[97793,875148],[-1158,-1861],[-1436,-203],[-263,-1097],[-803,-486],[-476,-1290],[-577,796],[-731,-1428],[-434,44],[-567,-2104],[-1792,-263]],[[106278,896767],[-1,-73392]],[[79659,983425],[-186,-1457],[-394,1372],[580,85]],[[47581,977020],[610,-136],[635,1731],[830,26],[1623,2411],[1469,3493],[883,527],[-302,-3710],[454,-2621],[-62,3461],[379,971],[-494,2434],[-541,45],[1261,3273],[1370,1209],[-524,-1007],[415,-852],[3298,1404],[1420,2118],[705,1934],[1322,4592],[408,808],[628,-1392],[914,-472],[118,-1342],[1297,-97],[154,-1576],[-590,-1821],[-1263,-1269],[607,-390],[-400,-1319],[1303,-54],[455,606],[-99,1673],[703,1368],[285,1695],[248,-1304],[705,927],[682,-1755],[-272,-1974],[1375,-2190],[693,2096],[1211,87],[987,692],[971,-831],[278,-2575],[299,2682],[990,-1071],[-562,-2518],[6,-1533],[1009,-524],[-1483,-682],[2475,170],[-500,-2281],[1552,-378],[327,-1080],[240,1607],[1279,271],[-194,-2495],[904,1574],[844,524],[665,1465],[1963,-425],[887,-1703],[687,50],[281,-1515],[1082,464],[877,-2131],[2068,-1578],[1438,784],[1494,-1037],[432,637],[1637,-3240],[1773,-386],[359,911],[3399,1866],[1397,-1343],[1103,-2166],[387,-1504],[1266,-1052],[1132,-2959],[449,853],[588,-630],[-1,-21361]],[[66446,936936],[-2,524],[-2610,-22],[-7,1899],[-2541,-186],[-16,1669],[-3117,28],[-4016,91],[-18,1253],[-1129,59],[26,-1251],[-2705,21],[-18,1269],[-1182,3],[11,-1280],[-1329,46],[-6,1283],[-2021,165],[0,-1272],[-4957,-97],[16,-3782],[-2411,69]],[[38414,937425],[-1696,2109],[-331,1546],[-1319,2644],[530,804],[402,3101],[39,5653],[2425,-416],[2905,1305],[906,1070],[1221,2916],[1185,4350],[538,5905],[-330,649],[1231,3476],[365,2385],[846,2065],[658,2578],[522,-1587],[-930,-958]],[[54479,890783],[-578,0],[-10,-1617],[-6226,43],[-4789,-36],[-2,3199],[-592,6],[1,3250],[-769,-9],[7,6455],[-205,26],[-5,6430],[-226,1957]],[[41085,910487],[1578,205],[202,-2555],[-310,-1226],[120,-2178],[-264,-1027],[216,-1764],[590,-1196],[375,540],[1137,-445],[966,699],[320,-1177],[667,-159],[982,798],[546,-2005],[189,2045],[811,3513],[796,-959],[609,527],[-496,1902],[-1494,1020],[-695,-1271],[195,3234],[-840,3465],[-836,788],[-421,2411],[385,1580],[446,30],[876,-3094],[-153,-2498],[447,-1913],[932,-1943],[1113,1832],[1075,-3147],[1510,331],[132,1770],[-332,2163],[-931,-161],[-461,1240],[-884,-262],[-254,-1861],[-716,-284],[-1100,3517],[232,3055],[871,1517],[-974,1716],[-1121,-1075],[-1025,-154],[-390,1249],[-528,-563],[-2240,1824],[-398,5492],[-677,3577],[-1096,2080],[-2353,5735]],[[46592,855663],[132,-1524],[-911,379],[779,1145]],[[20847,858392],[154,-1917],[1767,-2170],[1395,2515],[527,-233],[506,-1478],[154,-2243],[1092,-1044],[302,-1308],[1484,-327],[899,-741],[-444,-2851],[-1263,664],[-756,-2937],[125,-925],[-598,-398],[121,1508],[-580,2032],[-993,769],[95,1587],[-981,2254],[-776,1164],[-1179,-1499],[-406,-1269],[-853,1089],[-307,2233],[515,5525]],[[40155,909679],[-378,-812],[-1697,-1707],[2075,2519]],[[50525,879793],[-440,-60],[-575,-2906],[-898,82],[-597,-1411],[-710,-398],[-195,-1163],[-840,-1617],[-253,-2635],[-445,-1194],[-161,3173],[-951,2836],[-459,-1140],[679,-1515],[9,-1792],[-1367,2870],[-2018,-58],[-2018,-2251],[-808,901],[-2508,1784],[-688,2790],[278,1486],[-107,1445],[-748,1760],[-608,2843],[665,-528],[574,1254],[301,1828],[875,-777],[601,-2903],[499,-323],[641,1345],[-382,829],[-829,195],[-166,-711],[-668,2577],[-1942,1613],[-1533,482],[-1421,2817],[-464,461],[785,2442],[579,22],[-1,1594],[845,1740],[325,-909],[992,2482],[419,1887],[1043,1672],[644,-1027],[1215,98],[319,783],[-1042,1554],[505,1845],[720,1193],[1099,506],[107,-679],[853,2834],[830,668]],[[46154,848898],[640,3384],[127,1617],[836,-1042],[-393,-958],[1743,358],[1079,995],[1027,4968],[-512,5797],[-74,2808],[-782,2761],[-730,205],[138,2075],[1090,-246],[769,2178],[52,1989],[-320,1964],[-701,1681],[382,361]],[[129336,693546],[270,-1010],[-141,-1955],[-386,2864],[257,101]],[[133465,694933],[144,-1619],[-433,-1116],[-420,1401],[709,1334]],[[129051,698432],[384,-3029],[-187,-665],[-381,868],[234,1060],[-50,1766]],[[128271,699419],[265,-2151],[-73,-1620],[898,-5179],[112,-1526],[-465,199],[-650,4105],[-450,3522],[52,2603],[311,47]],[[132791,699517],[330,-1553],[-34,-2741],[-744,304],[318,2136],[-199,1261],[329,593]],[[127590,701351],[341,-1447],[-98,-960],[-490,-120],[13,2204],[234,323]],[[126996,702605],[286,-601],[-587,-1676],[301,2277]],[[127349,703974],[-507,-707],[254,1440],[253,-733]],[[126550,705223],[399,-333],[-240,-1814],[-293,1014],[134,1133]],[[127577,705503],[193,-1280],[-213,-947],[-253,1520],[273,707]],[[126975,710441],[673,-1209],[-593,136],[47,-1542],[-470,1638],[343,977]],[[127739,711890],[119,-2595],[-287,1329],[168,1266]],[[132952,712558],[-518,-394],[514,1289],[4,-895]],[[127378,716539],[386,-260],[-15,-2495],[-236,369],[-705,-1255],[-241,-1211],[-256,709],[518,3076],[549,1067]],[[126879,720141],[451,-580],[749,57],[385,-2788],[-192,-1469],[384,-1822],[434,266],[497,-1761],[457,-2620],[47,-3196],[267,734],[169,-1960],[371,-1718],[-850,2044],[-552,-1434],[684,586],[160,-2342],[298,487],[445,-2791],[-464,-922],[454,-352],[205,1480],[89,-3147],[-430,-827],[396,-512],[100,-2502],[-397,-59],[420,-1193],[-182,-2479],[-613,702],[-449,4336],[-562,-35],[258,2640],[-329,-710],[132,1822],[-300,-502],[-724,2251],[-726,264],[28,1948],[514,-22],[-360,1667],[235,2818],[-438,-873],[-449,796],[644,3530],[-239,1458],[-150,5160],[-813,306],[-187,1878],[133,1386]],[[133954,721013],[796,-683],[442,-1861],[433,-443],[117,-1890],[501,-840],[397,491],[279,-2136],[-1,-1873],[-414,-2628],[68,-3449],[429,-5569],[-359,-1662],[-236,-2416],[-441,-2702],[-867,-2699],[-213,1932],[-286,-2060],[-268,663],[-208,4192],[490,1686],[-537,-477],[-156,1948],[582,2169],[-76,7458],[-887,5088],[-486,-470],[-72,869],[-949,-2430],[-397,-118],[344,-1651],[-544,-5283],[-589,1664],[-115,2845]],[[312327,9345],[187,-606]],[[312514,8739],[-15,-1700]],[[312499,7039],[-350,67]],[[312149,7106],[17,912]],[[312166,8018],[43,812]],[[312209,8830],[118,515]],[[312084,13311],[6,-1330]],[[312090,11981],[-147,-92]],[[311943,11889],[-157,1158]],[[311786,13047],[223,739]],[[312009,13786],[75,-475]],[[312224,10808],[178,-1248]],[[312402,9560],[-75,-215]],[[312209,8830],[-202,84]],[[312007,8914],[-56,275]],[[311951,9189],[-19,1837]],[[311932,11026],[292,-218]],[[313107,15065],[-14,-2951]],[[313093,12114],[-156,-32]],[[312937,12082],[5,365]],[[312942,12447],[-35,2686]],[[312907,15133],[200,-68]],[[312774,6524],[70,-1308]],[[312844,5216],[-339,-41]],[[312505,5175],[62,1491]],[[312567,6666],[207,-142]],[[312709,10760],[26,-1200]],[[312735,9560],[-333,0]],[[312224,10808],[123,646]],[[312347,11454],[362,-694]],[[315123,11876],[54,-128]],[[315177,11748],[78,-1804]],[[315255,9944],[-163,-1769]],[[315092,8175],[-119,1033]],[[314973,9208],[-63,762]],[[314910,9970],[144,1736]],[[315054,11706],[69,170]],[[314670,11208],[37,-329]],[[314707,10879],[60,-642]],[[314767,10237],[-199,-737]],[[314568,9500],[-72,1128]],[[314496,10628],[174,580]],[[314052,6833],[264,-476]],[[314316,6357],[-19,-702]],[[314297,5655],[-318,75]],[[313979,5730],[73,1103]],[[312567,6666],[-68,373]],[[312514,8739],[144,137]],[[312658,8876],[116,-2352]],[[312942,12447],[-192,449]],[[312750,12896],[-16,-18]],[[312734,12878],[-7,2191]],[[312727,15069],[180,64]],[[314923,14259],[-51,-292]],[[314872,13967],[-106,119]],[[314766,14086],[83,583]],[[314849,14669],[74,-410]],[[313370,8907],[-65,-415]],[[313305,8492],[-209,83]],[[313096,8575],[-80,-29]],[[313016,8546],[-82,705]],[[312934,9251],[27,1093]],[[312961,10344],[345,-244],[64,-1193]],[[313305,8492],[-14,-2846]],[[313291,5646],[-154,398]],[[313137,6044],[-41,2531]],[[314464,12205],[-98,-1501]],[[314366,10704],[-105,-151]],[[314261,10553],[-75,982]],[[314186,11535],[35,730]],[[314221,12265],[129,637]],[[314350,12902],[114,-697]],[[314016,15105],[-14,-2136]],[[314002,12969],[-54,8]],[[313948,12977],[-196,-375]],[[313752,12602],[-27,1007]],[[313725,13609],[25,1393]],[[313750,15002],[266,103]],[[313604,15086],[-4,-1775]],[[313600,13311],[-8,-956]],[[313592,12355],[-45,-184]],[[313547,12171],[-454,-57]],[[313107,15065],[497,21]],[[314264,15070],[-76,-2600]],[[314188,12470],[-186,499]],[[314016,15105],[248,-35]],[[315464,13512],[1,-2420]],[[315465,11092],[-66,435]],[[315399,11527],[-159,1610]],[[315240,13137],[-103,1306]],[[315137,14443],[122,139]],[[315259,14582],[205,-1070]],[[314938,14054],[76,-2458]],[[315014,11596],[-176,-329]],[[314838,11267],[34,2700]],[[314923,14259],[15,-205]],[[315375,10330],[63,-1609]],[[315438,8721],[6,-426]],[[315444,8295],[-234,-827]],[[315210,7468],[-116,640]],[[315094,8108],[-2,67]],[[315255,9944],[120,386]],[[313784,8891],[255,-1302]],[[314039,7589],[13,-756]],[[313979,5730],[-242,-149]],[[313737,5581],[-39,3312]],[[313698,8893],[16,20]],[[313714,8913],[70,-22]],[[315465,11092],[-90,-762]],[[315177,11748],[222,-221]],[[313725,9098],[-11,-185]],[[313698,8893],[-269,126]],[[313429,9019],[231,2603]],[[313660,11622],[65,-2524]],[[314361,14912],[31,-1700]],[[314392,13212],[-42,-310]],[[314221,12265],[-33,205]],[[314264,15070],[97,-158]],[[312306,11771],[41,-317]],[[311932,11026],[-107,569]],[[311825,11595],[118,294]],[[312090,11981],[216,-210]],[[312937,12082],[24,-1738]],[[312934,9251],[-27,-13]],[[312907,9238],[-172,322]],[[312709,10760],[41,2136]],[[315183,5666],[-140,-215]],[[315043,5451],[-34,1224]],[[315009,6675],[174,-1009]],[[312505,5175],[-359,-115]],[[312146,5060],[3,2046]],[[314634,8728],[-21,-892]],[[314613,7836],[-92,-362]],[[314521,7474],[-160,1419]],[[314361,8893],[201,525]],[[314562,9418],[72,-690]],[[312295,14640],[81,-1252]],[[312376,13388],[-70,-1617]],[[312084,13311],[211,1329]],[[312007,8914],[159,-896]],[[312146,5060],[-281,902],[86,3227]],[[315210,7468],[60,-309]],[[315270,7159],[221,-1460]],[[315491,5699],[-308,-33]],[[315009,6675],[81,1384]],[[315090,8059],[4,49]],[[314186,11535],[-217,-675]],[[313969,10860],[-21,2117]],[[311825,11595],[-39,1452]],[[312009,13786],[157,1825]],[[312166,15611],[129,-971]],[[313137,6044],[-273,-821]],[[312864,5223],[152,3323]],[[314838,11267],[-131,-388]],[[314670,11208],[-8,753]],[[314662,11961],[28,1347]],[[314690,13308],[76,778]],[[313547,12171],[113,-549]],[[313429,9019],[-59,-112]],[[314973,9208],[-339,-480]],[[314562,9418],[6,82]],[[314767,10237],[143,-267]],[[314776,6994],[-112,-1631]],[[314664,5363],[-367,292]],[[314316,6357],[205,1117]],[[314613,7836],[163,-842]],[[312679,13385],[55,-507]],[[312376,13388],[303,-3]],[[315090,8059],[-314,-1065]],[[314662,11961],[-198,244]],[[314392,13212],[143,201]],[[314535,13413],[155,-105]],[[312679,13385],[-109,1773]],[[312570,15158],[157,-89]],[[313752,12602],[-160,-247]],[[313600,13311],[125,298]],[[314496,10628],[-130,76]],[[313604,15086],[146,-84]],[[315240,13137],[-117,-1261]],[[315054,11706],[-40,-110]],[[314938,14054],[199,389]],[[315043,5451],[-379,-88]],[[312864,5223],[-20,-7]],[[312658,8876],[249,362]],[[314001,9350],[196,-57]],[[314197,9293],[164,-400]],[[314039,7589],[-38,1761]],[[313784,8891],[217,459]],[[313969,10860],[-244,-1762]],[[313737,5581],[-446,65]],[[314261,10553],[-64,-1260]],[[312166,15611],[404,-453]],[[315579,8262],[226,-900]],[[315805,7362],[-150,-1087]],[[315655,6275],[-385,884]],[[315444,8295],[135,-33]],[[314535,13413],[108,1311]],[[314643,14724],[206,-55]],[[318309,12804],[169,-865],[-544,829],[375,36]],[[316158,12801],[-233,-1215]],[[315925,11586],[-15,-114]],[[315910,11472],[23,1756]],[[315933,13228],[225,-427]],[[315714,13936],[-106,-833]],[[315608,13103],[-144,409]],[[315259,14582],[455,-646]],[[315655,6275],[-164,-576]],[[315910,11472],[-22,-197]],[[315888,11275],[-160,-130]],[[315728,11145],[-34,41]],[[315694,11186],[-86,1917]],[[315714,13936],[219,-708]],[[315888,11275],[293,-1349]],[[316181,9926],[-216,-625]],[[315965,9301],[-242,492]],[[315723,9793],[5,1352]],[[315723,9793],[-144,-1531]],[[315438,8721],[211,2085]],[[315649,10806],[45,380]],[[315649,10806],[-184,286]],[[316256,11347],[-331,239]],[[316158,12801],[154,393],[-56,-1847]],[[316256,11347],[125,-1005],[-200,-416]],[[315965,9301],[-160,-1939]],[[316936,9055],[328,-560],[-757,-908],[-91,684],[520,784]],[[318661,1986],[376,-1084],[-740,-782],[24,1182],[340,684]],[[314361,14912],[282,-188]]],"transform":{"scale":[0.0003589261789261791,0.0000537148685138684],"translate":[-179.1473399999999,17.67439566600018]}} \ No newline at end of file diff --git a/public/us_states.json b/public/us_states.json new file mode 100644 index 00000000..7cf15a1b --- /dev/null +++ b/public/us_states.json @@ -0,0 +1,109 @@ +{ +"type": "FeatureCollection", +"features": [ +{ "type": "Feature", "properties": { "GEO_ID": "0400000US23", "STATE": "23", "NAME": "Maine", "LSAD": "", "CENSUSAREA": 30842.923000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -67.619761, 44.519754 ], [ -67.615410, 44.521973 ], [ -67.587738, 44.516196 ], [ -67.582113, 44.513459 ], [ -67.589259, 44.500840 ], [ -67.590627, 44.494150 ], [ -67.580288, 44.488068 ], [ -67.562651, 44.472104 ], [ -67.569189, 44.455531 ], [ -67.571774, 44.453403 ], [ -67.574206, 44.451730 ], [ -67.588346, 44.449754 ], [ -67.592755, 44.458572 ], [ -67.604919, 44.502056 ], [ -67.607199, 44.503576 ], [ -67.614954, 44.503576 ], [ -67.619211, 44.506009 ], [ -67.619761, 44.519754 ] ] ], [ [ [ -68.498637, 44.369686 ], [ -68.478785, 44.319563 ], [ -68.489641, 44.313705 ], [ -68.515173, 44.324797 ], [ -68.523857, 44.322397 ], [ -68.533481, 44.329958 ], [ -68.530394, 44.333583 ], [ -68.528635, 44.344605 ], [ -68.520671, 44.358357 ], [ -68.521930, 44.367591 ], [ -68.518573, 44.381022 ], [ -68.512697, 44.384799 ], [ -68.507660, 44.385219 ], [ -68.501364, 44.382281 ], [ -68.498637, 44.369686 ] ] ], [ [ [ -68.236380, 44.266254 ], [ -68.214641, 44.263156 ], [ -68.211329, 44.257074 ], [ -68.212474, 44.255405 ], [ -68.221383, 44.257254 ], [ -68.231469, 44.256016 ], [ -68.237130, 44.253430 ], [ -68.240310, 44.251622 ], [ -68.241545, 44.247543 ], [ -68.240806, 44.239723 ], [ -68.248913, 44.235443 ], [ -68.266669, 44.234033 ], [ -68.274427, 44.237099 ], [ -68.276857, 44.240794 ], [ -68.274719, 44.258675 ], [ -68.262128, 44.260774 ], [ -68.254153, 44.257836 ], [ -68.246598, 44.257836 ], [ -68.241142, 44.260354 ], [ -68.236380, 44.266254 ] ] ], [ [ [ -68.942826, 44.281073 ], [ -68.919301, 44.309872 ], [ -68.919325, 44.335392 ], [ -68.911634, 44.365027 ], [ -68.903530, 44.378613 ], [ -68.878940, 44.386584 ], [ -68.868444, 44.381440 ], [ -68.860649, 44.364425 ], [ -68.864338, 44.355002 ], [ -68.871690, 44.344662 ], [ -68.883065, 44.338193 ], [ -68.888706, 44.338196 ], [ -68.892850, 44.334653 ], [ -68.896587, 44.321986 ], [ -68.887460, 44.303094 ], [ -68.899445, 44.283775 ], [ -68.904255, 44.279889 ], [ -68.916872, 44.242866 ], [ -68.926480, 44.233035 ], [ -68.945976, 44.220824 ], [ -68.951890, 44.218719 ], [ -68.947090, 44.226792 ], [ -68.955332, 44.243873 ], [ -68.959468, 44.247439 ], [ -68.965896, 44.249754 ], [ -68.967074, 44.251968 ], [ -68.965264, 44.259332 ], [ -68.953686, 44.272346 ], [ -68.942826, 44.281073 ] ] ], [ [ [ -68.792139, 44.237819 ], [ -68.769833, 44.222787 ], [ -68.769047, 44.213351 ], [ -68.780055, 44.203129 ], [ -68.789884, 44.203915 ], [ -68.801285, 44.208633 ], [ -68.809149, 44.212565 ], [ -68.815439, 44.214137 ], [ -68.822909, 44.216496 ], [ -68.829593, 44.216890 ], [ -68.837849, 44.227112 ], [ -68.839422, 44.236547 ], [ -68.833524, 44.240872 ], [ -68.827627, 44.242838 ], [ -68.825631, 44.242556 ], [ -68.792139, 44.237819 ] ] ], [ [ [ -68.472831, 44.219767 ], [ -68.460205, 44.212498 ], [ -68.453843, 44.201683 ], [ -68.454224, 44.199534 ], [ -68.459182, 44.197681 ], [ -68.484520, 44.202886 ], [ -68.487227, 44.209517 ], [ -68.482726, 44.227058 ], [ -68.480565, 44.228591 ], [ -68.470323, 44.228320 ], [ -68.468572, 44.223999 ], [ -68.472831, 44.219767 ] ] ], [ [ [ -68.355279, 44.199096 ], [ -68.333227, 44.207308 ], [ -68.324230, 44.205732 ], [ -68.316060, 44.200244 ], [ -68.314789, 44.197157 ], [ -68.318476, 44.196608 ], [ -68.321178, 44.199032 ], [ -68.332639, 44.192131 ], [ -68.339029, 44.171839 ], [ -68.347416, 44.169459 ], [ -68.378872, 44.184222 ], [ -68.371235, 44.193003 ], [ -68.364469, 44.197534 ], [ -68.355279, 44.199096 ] ] ], [ [ [ -68.680773, 44.279242 ], [ -68.675416, 44.279753 ], [ -68.668213, 44.276511 ], [ -68.658849, 44.268588 ], [ -68.623554, 44.255622 ], [ -68.611669, 44.244818 ], [ -68.605906, 44.230772 ], [ -68.580931, 44.213432 ], [ -68.564275, 44.199155 ], [ -68.563085, 44.193207 ], [ -68.567249, 44.187258 ], [ -68.577957, 44.185473 ], [ -68.599372, 44.193207 ], [ -68.612749, 44.207722 ], [ -68.624994, 44.197637 ], [ -68.625715, 44.194756 ], [ -68.619592, 44.189354 ], [ -68.618511, 44.186472 ], [ -68.618872, 44.181070 ], [ -68.643002, 44.157660 ], [ -68.652366, 44.153698 ], [ -68.670014, 44.151537 ], [ -68.671454, 44.138572 ], [ -68.675056, 44.137131 ], [ -68.681899, 44.138212 ], [ -68.686581, 44.147216 ], [ -68.692343, 44.153698 ], [ -68.700987, 44.158380 ], [ -68.709631, 44.158741 ], [ -68.713232, 44.160541 ], [ -68.716474, 44.162702 ], [ -68.720435, 44.169185 ], [ -68.718995, 44.183231 ], [ -68.715033, 44.191154 ], [ -68.714313, 44.203760 ], [ -68.721156, 44.212404 ], [ -68.722956, 44.219607 ], [ -68.722956, 44.223568 ], [ -68.718635, 44.228611 ], [ -68.711792, 44.228971 ], [ -68.700627, 44.234013 ], [ -68.694144, 44.248779 ], [ -68.680458, 44.262105 ], [ -68.677577, 44.268948 ], [ -68.677577, 44.275431 ], [ -68.680773, 44.279242 ] ] ], [ [ [ -68.453236, 44.189998 ], [ -68.437789, 44.188216 ], [ -68.424441, 44.190753 ], [ -68.416434, 44.187047 ], [ -68.408207, 44.176298 ], [ -68.384903, 44.154955 ], [ -68.396634, 44.140690 ], [ -68.427534, 44.119266 ], [ -68.438518, 44.116180 ], [ -68.448646, 44.125581 ], [ -68.447505, 44.133493 ], [ -68.456813, 44.145268 ], [ -68.479934, 44.147800 ], [ -68.484696, 44.146495 ], [ -68.496639, 44.146855 ], [ -68.502096, 44.152388 ], [ -68.500817, 44.160026 ], [ -68.495511, 44.162429 ], [ -68.474365, 44.181875 ], [ -68.453236, 44.189998 ] ] ], [ [ [ -68.358388, 44.125082 ], [ -68.353010, 44.127884 ], [ -68.346724, 44.127749 ], [ -68.330716, 44.110598 ], [ -68.331032, 44.107580 ], [ -68.338012, 44.101473 ], [ -68.365176, 44.101464 ], [ -68.376593, 44.112207 ], [ -68.376591, 44.113762 ], [ -68.375382, 44.116460 ], [ -68.365514, 44.124079 ], [ -68.358388, 44.125082 ] ] ], [ [ [ -68.499465, 44.124190 ], [ -68.492892, 44.116921 ], [ -68.491521, 44.109833 ], [ -68.502942, 44.099722 ], [ -68.517060, 44.103410 ], [ -68.518703, 44.113222 ], [ -68.511266, 44.125082 ], [ -68.506979, 44.127237 ], [ -68.499465, 44.124190 ] ] ], [ [ [ -68.785601, 44.053503 ], [ -68.790595, 44.053832 ], [ -68.807315, 44.035796 ], [ -68.818441, 44.032046 ], [ -68.828465, 44.032118 ], [ -68.862845, 44.025037 ], [ -68.874139, 44.025359 ], [ -68.889717, 44.032516 ], [ -68.899997, 44.066960 ], [ -68.905098, 44.077344 ], [ -68.913406, 44.085190 ], [ -68.907812, 44.105518 ], [ -68.908984, 44.110001 ], [ -68.943105, 44.109730 ], [ -68.944597, 44.112840 ], [ -68.935327, 44.130380 ], [ -68.917286, 44.148239 ], [ -68.888597, 44.159550 ], [ -68.878680, 44.166612 ], [ -68.847249, 44.183017 ], [ -68.825067, 44.186338 ], [ -68.819156, 44.180462 ], [ -68.822206, 44.178815 ], [ -68.822840, 44.173693 ], [ -68.818423, 44.160978 ], [ -68.792221, 44.145998 ], [ -68.786886, 44.143961 ], [ -68.782375, 44.145310 ], [ -68.780693, 44.143274 ], [ -68.792065, 44.136759 ], [ -68.802162, 44.137857 ], [ -68.818039, 44.136852 ], [ -68.819659, 44.135434 ], [ -68.820515, 44.130198 ], [ -68.819530, 44.122056 ], [ -68.815562, 44.115836 ], [ -68.806832, 44.116339 ], [ -68.790525, 44.092920 ], [ -68.781772, 44.084274 ], [ -68.772639, 44.078439 ], [ -68.770290, 44.069566 ], [ -68.779650, 44.057754 ], [ -68.785601, 44.053503 ] ] ], [ [ [ -68.618212, 44.012367 ], [ -68.635315, 44.018886 ], [ -68.647360, 44.014500 ], [ -68.651863, 44.009859 ], [ -68.652881, 44.003845 ], [ -68.657031, 44.003823 ], [ -68.659972, 44.016013 ], [ -68.659874, 44.022758 ], [ -68.657369, 44.024404 ], [ -68.650767, 44.039908 ], [ -68.654783, 44.059599 ], [ -68.661594, 44.075837 ], [ -68.627893, 44.088128 ], [ -68.625350, 44.092906 ], [ -68.618100, 44.096706 ], [ -68.609722, 44.094674 ], [ -68.602863, 44.086650 ], [ -68.589563, 44.075585 ], [ -68.585916, 44.075335 ], [ -68.584074, 44.070578 ], [ -68.588098, 44.061270 ], [ -68.590792, 44.058662 ], [ -68.601099, 44.058362 ], [ -68.611473, 44.025176 ], [ -68.610703, 44.013422 ], [ -68.615896, 44.009761 ], [ -68.618212, 44.012367 ] ] ], [ [ [ -69.043981, 44.005684 ], [ -69.047583, 44.002283 ], [ -69.052309, 43.996324 ], [ -69.054980, 43.993858 ], [ -69.064021, 43.992009 ], [ -69.069569, 43.985022 ], [ -69.078200, 43.974132 ], [ -69.092994, 43.979063 ], [ -69.096899, 43.981324 ], [ -69.093816, 43.984611 ], [ -69.086830, 43.987077 ], [ -69.077172, 43.990159 ], [ -69.068336, 43.995502 ], [ -69.061966, 44.000023 ], [ -69.058679, 44.003310 ], [ -69.058268, 44.007625 ], [ -69.062172, 44.010297 ], [ -69.066693, 44.008653 ], [ -69.071624, 44.007420 ], [ -69.071830, 44.012557 ], [ -69.061966, 44.015023 ], [ -69.047583, 44.013995 ], [ -69.043981, 44.005684 ] ] ], [ [ [ -69.427920, 43.928798 ], [ -69.423323, 43.922871 ], [ -69.422153, 43.917702 ], [ -69.423324, 43.915507 ], [ -69.438066, 43.909539 ], [ -69.440913, 43.909767 ], [ -69.441894, 43.916331 ], [ -69.433762, 43.949353 ], [ -69.429806, 43.948438 ], [ -69.421072, 43.938261 ], [ -69.427920, 43.928798 ] ] ], [ [ [ -68.880242, 43.863398 ], [ -68.882554, 43.848525 ], [ -68.876224, 43.836597 ], [ -68.886725, 43.822195 ], [ -68.898319, 43.820987 ], [ -68.899108, 43.821925 ], [ -68.893537, 43.831498 ], [ -68.894700, 43.843970 ], [ -68.898045, 43.849545 ], [ -68.903957, 43.848684 ], [ -68.908222, 43.849852 ], [ -68.902618, 43.868855 ], [ -68.889367, 43.875530 ], [ -68.880242, 43.863398 ] ] ], [ [ [ -69.307908, 43.773767 ], [ -69.306751, 43.775095 ], [ -69.302995, 43.774591 ], [ -69.300376, 43.772144 ], [ -69.300818, 43.768599 ], [ -69.314325, 43.756707 ], [ -69.322559, 43.755883 ], [ -69.323569, 43.758994 ], [ -69.321141, 43.765763 ], [ -69.313631, 43.772762 ], [ -69.307908, 43.773767 ] ] ], [ [ [ -70.119671, 43.748621 ], [ -70.113059, 43.749130 ], [ -70.097318, 43.757292 ], [ -70.094986, 43.753211 ], [ -70.100233, 43.742134 ], [ -70.107812, 43.734555 ], [ -70.109561, 43.730474 ], [ -70.108978, 43.722312 ], [ -70.124136, 43.708320 ], [ -70.129383, 43.708320 ], [ -70.138128, 43.718231 ], [ -70.138711, 43.727559 ], [ -70.127051, 43.742717 ], [ -70.119671, 43.748621 ] ] ], [ [ [ -70.087621, 43.699913 ], [ -70.093704, 43.691800 ], [ -70.099594, 43.695366 ], [ -70.115908, 43.682978 ], [ -70.118291, 43.683343 ], [ -70.118174, 43.686375 ], [ -70.115961, 43.689202 ], [ -70.100683, 43.705962 ], [ -70.095727, 43.709278 ], [ -70.093113, 43.710524 ], [ -70.092137, 43.709468 ], [ -70.097184, 43.700929 ], [ -70.091929, 43.698111 ], [ -70.087621, 43.699913 ] ] ], [ [ [ -70.163884, 43.692404 ], [ -70.156787, 43.694706 ], [ -70.146115, 43.701635 ], [ -70.135563, 43.700658 ], [ -70.154503, 43.680933 ], [ -70.168227, 43.675136 ], [ -70.170284, 43.675441 ], [ -70.173571, 43.683734 ], [ -70.171339, 43.687546 ], [ -70.163884, 43.692404 ] ] ], [ [ [ -70.186213, 43.682655 ], [ -70.187536, 43.678669 ], [ -70.192574, 43.673139 ], [ -70.207341, 43.662562 ], [ -70.210825, 43.661695 ], [ -70.213130, 43.662973 ], [ -70.213948, 43.666161 ], [ -70.209627, 43.676308 ], [ -70.201893, 43.685483 ], [ -70.196535, 43.688784 ], [ -70.191041, 43.689071 ], [ -70.186213, 43.682655 ] ] ], [ [ [ -70.171245, 43.663498 ], [ -70.171136, 43.663300 ], [ -70.190323, 43.642986 ], [ -70.205934, 43.633633 ], [ -70.207165, 43.633690 ], [ -70.211062, 43.641842 ], [ -70.200116, 43.662978 ], [ -70.188047, 43.673762 ], [ -70.184659, 43.674699 ], [ -70.171245, 43.663498 ] ] ], [ [ [ -70.703819, 43.059825 ], [ -70.704696, 43.070989 ], [ -70.705996, 43.073089 ], [ -70.708896, 43.074989 ], [ -70.720296, 43.074688 ], [ -70.733497, 43.073288 ], [ -70.737897, 43.073488 ], [ -70.741897, 43.077388 ], [ -70.756397, 43.079988 ], [ -70.757597, 43.080888 ], [ -70.762997, 43.089488 ], [ -70.766398, 43.092688 ], [ -70.767998, 43.093588 ], [ -70.779098, 43.095887 ], [ -70.783880, 43.100867 ], [ -70.793906, 43.106712 ], [ -70.808708, 43.117065 ], [ -70.820000, 43.122586 ], [ -70.826800, 43.127086 ], [ -70.828100, 43.129086 ], [ -70.829300, 43.132486 ], [ -70.830000, 43.138386 ], [ -70.832900, 43.143286 ], [ -70.833800, 43.146886 ], [ -70.829101, 43.157886 ], [ -70.827801, 43.166385 ], [ -70.828301, 43.168985 ], [ -70.826201, 43.172085 ], [ -70.824001, 43.173285 ], [ -70.823501, 43.174585 ], [ -70.824801, 43.179685 ], [ -70.828301, 43.186685 ], [ -70.827901, 43.188685 ], [ -70.827201, 43.189485 ], [ -70.823754, 43.191075 ], [ -70.820702, 43.191663 ], [ -70.819344, 43.193036 ], [ -70.819146, 43.195157 ], [ -70.820366, 43.197629 ], [ -70.820763, 43.199780 ], [ -70.816903, 43.214604 ], [ -70.816033, 43.215680 ], [ -70.813119, 43.217252 ], [ -70.809670, 43.224561 ], [ -70.809640, 43.225407 ], [ -70.811852, 43.228306 ], [ -70.814019, 43.229053 ], [ -70.815453, 43.229023 ], [ -70.816232, 43.234997 ], [ -70.817773, 43.237408 ], [ -70.817865, 43.237911 ], [ -70.822959, 43.240187 ], [ -70.823309, 43.240343 ], [ -70.825071, 43.240930 ], [ -70.826711, 43.241301 ], [ -70.828022, 43.241597 ], [ -70.833650, 43.242868 ], [ -70.837274, 43.242321 ], [ -70.838678, 43.242931 ], [ -70.841273, 43.248653 ], [ -70.841059, 43.249699 ], [ -70.839717, 43.250393 ], [ -70.839213, 43.251224 ], [ -70.843302, 43.254321 ], [ -70.852015, 43.256808 ], [ -70.855082, 43.255191 ], [ -70.858207, 43.256286 ], [ -70.859607, 43.257342 ], [ -70.859853, 43.259763 ], [ -70.861384, 43.263143 ], [ -70.863231, 43.265098 ], [ -70.863230, 43.265109 ], [ -70.872585, 43.270152 ], [ -70.881704, 43.272483 ], [ -70.882804, 43.273183 ], [ -70.883704, 43.277483 ], [ -70.886504, 43.282783 ], [ -70.890204, 43.284182 ], [ -70.896304, 43.285282 ], [ -70.906005, 43.291682 ], [ -70.907405, 43.293582 ], [ -70.903905, 43.296882 ], [ -70.901390, 43.298764 ], [ -70.900386, 43.301358 ], [ -70.902310, 43.304872 ], [ -70.904485, 43.305290 ], [ -70.907405, 43.304782 ], [ -70.909805, 43.306682 ], [ -70.912460, 43.308289 ], [ -70.911625, 43.309952 ], [ -70.912004, 43.319821 ], [ -70.915406, 43.319858 ], [ -70.916421, 43.320279 ], [ -70.923949, 43.324768 ], [ -70.930783, 43.329569 ], [ -70.931641, 43.331019 ], [ -70.932198, 43.334560 ], [ -70.932735, 43.336760 ], [ -70.937110, 43.337367 ], [ -70.951525, 43.334672 ], [ -70.953034, 43.333257 ], [ -70.956528, 43.334691 ], [ -70.957860, 43.337776 ], [ -70.960439, 43.341048 ], [ -70.964028, 43.341888 ], [ -70.967229, 43.343777 ], [ -70.974863, 43.357969 ], [ -70.974156, 43.362925 ], [ -70.976408, 43.367272 ], [ -70.981859, 43.373862 ], [ -70.984335, 43.376128 ], [ -70.984305, 43.376814 ], [ -70.985965, 43.380023 ], [ -70.985958, 43.384240 ], [ -70.985205, 43.386745 ], [ -70.987649, 43.389521 ], [ -70.987733, 43.391513 ], [ -70.987390, 43.393457 ], [ -70.982876, 43.394808 ], [ -70.982565, 43.397780 ], [ -70.982817, 43.399312 ], [ -70.985767, 43.401620 ], [ -70.986677, 43.403541 ], [ -70.987249, 43.411863 ], [ -70.986812, 43.414264 ], [ -70.982898, 43.419332 ], [ -70.978052, 43.421954 ], [ -70.974620, 43.423022 ], [ -70.971039, 43.425606 ], [ -70.968359, 43.429283 ], [ -70.969362, 43.432731 ], [ -70.968782, 43.434891 ], [ -70.961150, 43.438321 ], [ -70.961046, 43.440475 ], [ -70.961640, 43.443039 ], [ -70.965810, 43.447557 ], [ -70.966900, 43.450458 ], [ -70.966266, 43.453627 ], [ -70.963990, 43.456752 ], [ -70.960450, 43.466592 ], [ -70.961428, 43.469696 ], [ -70.964433, 43.473276 ], [ -70.964542, 43.473262 ], [ -70.966017, 43.472918 ], [ -70.970946, 43.473900 ], [ -70.972956, 43.475020 ], [ -70.974245, 43.477420 ], [ -70.967968, 43.480783 ], [ -70.967404, 43.482635 ], [ -70.968975, 43.483961 ], [ -70.969572, 43.486201 ], [ -70.966718, 43.491278 ], [ -70.961948, 43.497750 ], [ -70.959185, 43.499351 ], [ -70.957958, 43.508041 ], [ -70.954755, 43.509802 ], [ -70.955386, 43.511357 ], [ -70.956856, 43.512719 ], [ -70.954045, 43.518797 ], [ -70.954066, 43.522610 ], [ -70.956787, 43.524216 ], [ -70.957214, 43.524994 ], [ -70.957046, 43.528743 ], [ -70.958220, 43.531586 ], [ -70.962556, 43.534310 ], [ -70.963342, 43.535247 ], [ -70.963531, 43.536756 ], [ -70.963281, 43.538929 ], [ -70.962182, 43.541032 ], [ -70.955928, 43.541925 ], [ -70.955337, 43.540980 ], [ -70.955252, 43.540887 ], [ -70.950838, 43.551026 ], [ -70.951876, 43.552238 ], [ -70.953322, 43.552718 ], [ -70.955017, 43.554239 ], [ -70.955860, 43.559787 ], [ -70.957234, 43.561358 ], [ -70.961848, 43.562964 ], [ -70.968546, 43.568856 ], [ -70.970124, 43.568544 ], [ -70.972716, 43.570255 ], [ -70.975705, 43.625078 ], [ -70.981946, 43.700960 ], [ -70.981978, 43.701965 ], [ -70.982238, 43.711865 ], [ -70.982083, 43.715043 ], [ -70.984901, 43.752983 ], [ -70.989067, 43.792440 ], [ -70.989929, 43.839239 ], [ -70.992653, 43.896240 ], [ -70.992842, 43.916269 ], [ -70.998444, 44.041099 ], [ -71.001367, 44.092931 ], [ -71.001335, 44.093205 ], [ -71.008567, 44.245491 ], [ -71.008764, 44.258443 ], [ -71.008736, 44.258825 ], [ -71.011270, 44.301846 ], [ -71.012749, 44.340784 ], [ -71.015363, 44.378113 ], [ -71.020773, 44.473737 ], [ -71.022992, 44.500058 ], [ -71.026655, 44.558149 ], [ -71.031039, 44.655455 ], [ -71.036705, 44.736498 ], [ -71.037518, 44.755607 ], [ -71.044646, 44.845039 ], [ -71.052707, 44.930840 ], [ -71.057861, 45.000049 ], [ -71.059004, 45.004918 ], [ -71.069387, 45.144037 ], [ -71.072600, 45.180935 ], [ -71.076914, 45.246912 ], [ -71.084334, 45.305293 ], [ -71.078407, 45.306232 ], [ -71.073743, 45.307718 ], [ -71.066197, 45.311353 ], [ -71.059265, 45.313753 ], [ -71.042485, 45.313043 ], [ -71.038210, 45.311922 ], [ -71.030565, 45.312652 ], [ -71.021753, 45.314409 ], [ -71.014268, 45.316761 ], [ -71.009050, 45.319022 ], [ -71.002563, 45.327819 ], [ -71.002400, 45.328482 ], [ -71.005087, 45.331545 ], [ -71.011144, 45.334679 ], [ -71.012920, 45.343297 ], [ -71.012757, 45.344760 ], [ -71.010810, 45.347250 ], [ -71.004848, 45.345419 ], [ -71.001771, 45.343658 ], [ -70.992730, 45.338173 ], [ -70.990233, 45.336277 ], [ -70.989324, 45.334655 ], [ -70.985595, 45.332188 ], [ -70.967188, 45.332401 ], [ -70.950824, 45.334530 ], [ -70.949365, 45.331536 ], [ -70.943887, 45.324336 ], [ -70.939188, 45.320177 ], [ -70.929923, 45.318462 ], [ -70.921435, 45.313867 ], [ -70.917904, 45.311924 ], [ -70.912111, 45.296197 ], [ -70.913732, 45.292746 ], [ -70.918753, 45.287033 ], [ -70.919951, 45.284953 ], [ -70.921700, 45.279445 ], [ -70.921474, 45.278873 ], [ -70.915194, 45.274735 ], [ -70.907978, 45.269316 ], [ -70.898565, 45.258502 ], [ -70.896627, 45.253107 ], [ -70.898482, 45.244088 ], [ -70.896898, 45.242031 ], [ -70.892822, 45.239172 ], [ -70.885029, 45.234873 ], [ -70.878495, 45.233270 ], [ -70.857042, 45.229160 ], [ -70.844430, 45.234513 ], [ -70.838770, 45.237555 ], [ -70.841100, 45.238926 ], [ -70.848319, 45.244707 ], [ -70.849261, 45.256398 ], [ -70.848554, 45.263325 ], [ -70.843280, 45.265658 ], [ -70.841080, 45.267144 ], [ -70.839042, 45.269132 ], [ -70.831535, 45.279557 ], [ -70.829790, 45.286941 ], [ -70.829661, 45.290369 ], [ -70.817099, 45.297777 ], [ -70.816224, 45.298120 ], [ -70.812338, 45.302006 ], [ -70.808613, 45.311606 ], [ -70.807058, 45.322464 ], [ -70.808322, 45.325824 ], [ -70.810266, 45.327744 ], [ -70.813021, 45.328018 ], [ -70.816585, 45.330554 ], [ -70.818141, 45.332589 ], [ -70.819049, 45.335057 ], [ -70.819828, 45.340109 ], [ -70.819471, 45.341435 ], [ -70.814450, 45.356544 ], [ -70.808712, 45.362647 ], [ -70.807577, 45.363425 ], [ -70.803848, 45.364247 ], [ -70.802648, 45.364933 ], [ -70.802745, 45.366556 ], [ -70.806244, 45.376558 ], [ -70.807664, 45.378118 ], [ -70.812406, 45.383346 ], [ -70.822268, 45.390522 ], [ -70.824053, 45.391094 ], [ -70.825156, 45.393265 ], [ -70.826033, 45.398408 ], [ -70.825612, 45.400305 ], [ -70.812797, 45.411369 ], [ -70.802216, 45.417975 ], [ -70.798677, 45.424146 ], [ -70.798028, 45.426706 ], [ -70.795009, 45.428145 ], [ -70.781471, 45.431159 ], [ -70.755567, 45.428361 ], [ -70.753977, 45.427789 ], [ -70.744077, 45.421091 ], [ -70.744787, 45.417182 ], [ -70.743775, 45.411925 ], [ -70.729972, 45.399359 ], [ -70.722734, 45.395270 ], [ -70.712286, 45.390611 ], [ -70.692497, 45.392579 ], [ -70.687307, 45.393243 ], [ -70.684614, 45.395071 ], [ -70.683543, 45.395208 ], [ -70.677995, 45.394362 ], [ -70.661160, 45.386039 ], [ -70.660775, 45.378176 ], [ -70.660029, 45.377901 ], [ -70.651175, 45.377123 ], [ -70.645952, 45.378675 ], [ -70.634661, 45.383608 ], [ -70.631354, 45.416340 ], [ -70.635498, 45.427817 ], [ -70.649739, 45.442771 ], [ -70.662954, 45.446546 ], [ -70.674903, 45.452399 ], [ -70.681074, 45.458410 ], [ -70.691762, 45.471233 ], [ -70.704630, 45.479575 ], [ -70.707945, 45.480877 ], [ -70.717047, 45.487732 ], [ -70.723167, 45.507606 ], [ -70.723396, 45.510394 ], [ -70.722845, 45.512772 ], [ -70.721611, 45.515058 ], [ -70.716606, 45.518488 ], [ -70.702433, 45.529554 ], [ -70.700613, 45.531543 ], [ -70.687605, 45.549099 ], [ -70.688214, 45.563981 ], [ -70.685686, 45.565419 ], [ -70.678462, 45.570677 ], [ -70.659286, 45.586880 ], [ -70.649578, 45.598147 ], [ -70.650424, 45.599267 ], [ -70.644687, 45.607083 ], [ -70.635306, 45.610211 ], [ -70.617198, 45.616379 ], [ -70.606193, 45.626386 ], [ -70.601275, 45.627165 ], [ -70.592252, 45.629865 ], [ -70.591275, 45.630551 ], [ -70.564789, 45.655150 ], [ -70.562019, 45.660591 ], [ -70.563747, 45.661939 ], [ -70.563779, 45.662693 ], [ -70.558400, 45.666671 ], [ -70.552793, 45.667836 ], [ -70.541415, 45.666715 ], [ -70.525831, 45.666551 ], [ -70.519537, 45.670001 ], [ -70.519470, 45.671738 ], [ -70.518948, 45.672286 ], [ -70.510171, 45.679323 ], [ -70.496603, 45.687021 ], [ -70.469869, 45.701639 ], [ -70.451503, 45.704432 ], [ -70.446903, 45.704044 ], [ -70.438878, 45.704387 ], [ -70.430787, 45.707222 ], [ -70.400404, 45.719834 ], [ -70.390379, 45.728539 ], [ -70.383552, 45.734869 ], [ -70.388501, 45.749717 ], [ -70.396133, 45.756255 ], [ -70.401749, 45.757880 ], [ -70.406548, 45.761813 ], [ -70.415684, 45.786158 ], [ -70.417641, 45.793770 ], [ -70.417674, 45.794570 ], [ -70.416922, 45.795279 ], [ -70.408000, 45.797586 ], [ -70.406334, 45.797494 ], [ -70.404275, 45.796259 ], [ -70.401857, 45.795915 ], [ -70.399634, 45.796235 ], [ -70.395907, 45.798885 ], [ -70.396362, 45.802703 ], [ -70.398159, 45.804120 ], [ -70.396620, 45.808486 ], [ -70.387916, 45.819043 ], [ -70.380752, 45.824639 ], [ -70.367020, 45.834993 ], [ -70.342440, 45.852192 ], [ -70.329748, 45.853795 ], [ -70.317154, 45.856448 ], [ -70.306162, 45.859740 ], [ -70.284204, 45.872034 ], [ -70.262655, 45.887853 ], [ -70.259117, 45.890755 ], [ -70.253704, 45.902981 ], [ -70.253897, 45.906524 ], [ -70.257880, 45.918138 ], [ -70.261055, 45.920311 ], [ -70.262824, 45.919832 ], [ -70.263315, 45.920152 ], [ -70.263313, 45.923832 ], [ -70.262198, 45.925203 ], [ -70.252526, 45.933176 ], [ -70.240920, 45.939095 ], [ -70.240162, 45.940944 ], [ -70.240177, 45.943729 ], [ -70.252963, 45.955234 ], [ -70.265410, 45.962692 ], [ -70.274325, 45.964295 ], [ -70.280814, 45.965211 ], [ -70.289632, 45.963201 ], [ -70.312970, 45.961856 ], [ -70.316280, 45.963113 ], [ -70.316936, 45.963456 ], [ -70.316870, 45.963890 ], [ -70.312055, 45.971544 ], [ -70.309725, 45.980210 ], [ -70.307463, 45.982541 ], [ -70.301298, 45.985353 ], [ -70.295986, 45.985969 ], [ -70.287754, 45.991820 ], [ -70.284571, 45.995384 ], [ -70.284932, 45.995613 ], [ -70.292868, 45.997397 ], [ -70.303034, 45.998976 ], [ -70.303625, 45.999479 ], [ -70.317629, 46.019080 ], [ -70.317596, 46.019492 ], [ -70.293639, 46.041845 ], [ -70.279650, 46.052196 ], [ -70.278334, 46.057019 ], [ -70.278169, 46.059671 ], [ -70.278890, 46.060654 ], [ -70.284176, 46.062758 ], [ -70.287295, 46.062576 ], [ -70.292845, 46.060679 ], [ -70.306734, 46.061344 ], [ -70.308967, 46.062464 ], [ -70.310609, 46.064544 ], [ -70.289780, 46.094325 ], [ -70.284554, 46.098713 ], [ -70.272689, 46.102298 ], [ -70.266349, 46.100993 ], [ -70.254021, 46.099600 ], [ -70.252413, 46.100625 ], [ -70.252411, 46.106221 ], [ -70.255038, 46.108348 ], [ -70.255069, 46.110200 ], [ -70.251282, 46.117947 ], [ -70.243629, 46.128794 ], [ -70.239566, 46.142762 ], [ -70.237947, 46.147378 ], [ -70.240264, 46.150076 ], [ -70.266260, 46.169350 ], [ -70.271192, 46.172072 ], [ -70.273594, 46.172485 ], [ -70.278034, 46.175001 ], [ -70.290896, 46.185838 ], [ -70.292736, 46.191599 ], [ -70.285526, 46.196991 ], [ -70.272054, 46.209833 ], [ -70.260645, 46.231452 ], [ -70.258599, 46.235588 ], [ -70.255492, 46.246444 ], [ -70.254591, 46.254231 ], [ -70.252906, 46.259075 ], [ -70.248421, 46.267072 ], [ -70.232682, 46.284428 ], [ -70.214423, 46.295314 ], [ -70.205719, 46.299865 ], [ -70.203119, 46.314380 ], [ -70.204373, 46.316505 ], [ -70.207046, 46.319247 ], [ -70.208733, 46.328961 ], [ -70.207415, 46.331316 ], [ -70.191412, 46.348072 ], [ -70.188739, 46.349993 ], [ -70.174709, 46.358472 ], [ -70.171969, 46.359294 ], [ -70.161337, 46.360984 ], [ -70.148529, 46.358923 ], [ -70.141164, 46.362669 ], [ -70.133367, 46.368906 ], [ -70.129734, 46.369384 ], [ -70.127552, 46.371943 ], [ -70.127542, 46.378747 ], [ -70.125459, 46.381352 ], [ -70.118597, 46.384233 ], [ -70.110440, 46.386110 ], [ -70.100177, 46.398435 ], [ -70.100607, 46.399303 ], [ -70.100413, 46.405017 ], [ -70.096286, 46.409430 ], [ -70.089248, 46.410666 ], [ -70.080292, 46.410531 ], [ -70.076128, 46.409389 ], [ -70.057061, 46.415036 ], [ -70.056433, 46.415561 ], [ -70.056433, 46.416590 ], [ -70.026521, 46.557217 ], [ -70.019747, 46.592166 ], [ -69.997086, 46.695230 ], [ -69.994248, 46.698564 ], [ -69.950000, 46.742523 ], [ -69.943121, 46.750034 ], [ -69.874513, 46.818027 ], [ -69.818552, 46.875030 ], [ -69.566383, 47.125032 ], [ -69.439198, 47.250033 ], [ -69.224420, 47.459686 ], [ -69.219996, 47.457159 ], [ -69.203886, 47.452203 ], [ -69.181951, 47.455610 ], [ -69.178412, 47.456615 ], [ -69.164362, 47.451037 ], [ -69.156074, 47.451035 ], [ -69.146439, 47.448860 ], [ -69.122404, 47.441881 ], [ -69.108215, 47.435831 ], [ -69.098511, 47.431217 ], [ -69.097364, 47.430326 ], [ -69.096756, 47.427013 ], [ -69.082508, 47.423976 ], [ -69.080656, 47.424068 ], [ -69.066715, 47.430240 ], [ -69.061192, 47.433052 ], [ -69.055465, 47.432274 ], [ -69.043947, 47.427634 ], [ -69.042702, 47.426651 ], [ -69.039301, 47.422170 ], [ -69.036882, 47.407977 ], [ -69.039138, 47.404068 ], [ -69.042371, 47.401143 ], [ -69.042002, 47.399269 ], [ -69.040790, 47.398080 ], [ -69.041733, 47.397326 ], [ -69.043248, 47.397189 ], [ -69.045403, 47.391910 ], [ -69.044259, 47.389259 ], [ -69.042880, 47.387841 ], [ -69.039818, 47.386309 ], [ -69.039280, 47.385052 ], [ -69.043958, 47.383682 ], [ -69.046448, 47.383934 ], [ -69.053885, 47.377878 ], [ -69.053284, 47.327568 ], [ -69.054628, 47.315911 ], [ -69.049118, 47.306471 ], [ -69.051337, 47.299774 ], [ -69.052614, 47.298289 ], [ -69.052748, 47.294403 ], [ -69.052278, 47.293078 ], [ -69.050699, 47.292552 ], [ -69.050094, 47.291500 ], [ -69.049390, 47.284689 ], [ -69.050465, 47.280575 ], [ -69.049593, 47.276804 ], [ -69.047846, 47.274243 ], [ -69.047076, 47.267089 ], [ -69.048083, 47.263044 ], [ -69.049326, 47.262107 ], [ -69.050367, 47.259821 ], [ -69.050737, 47.257330 ], [ -69.050334, 47.256621 ], [ -69.040200, 47.245100 ], [ -69.033456, 47.240984 ], [ -69.030067, 47.240549 ], [ -69.023826, 47.238353 ], [ -69.004102, 47.230162 ], [ -68.992641, 47.224564 ], [ -68.981096, 47.219884 ], [ -68.975089, 47.216687 ], [ -68.972169, 47.214310 ], [ -68.966433, 47.212712 ], [ -68.961130, 47.205582 ], [ -68.958414, 47.205491 ], [ -68.953350, 47.206749 ], [ -68.952511, 47.206087 ], [ -68.951769, 47.202920 ], [ -68.950397, 47.202476 ], [ -68.948923, 47.202819 ], [ -68.942484, 47.206386 ], [ -68.935710, 47.202249 ], [ -68.929808, 47.197266 ], [ -68.927930, 47.196969 ], [ -68.926421, 47.197860 ], [ -68.924645, 47.197791 ], [ -68.920253, 47.195048 ], [ -68.919752, 47.189859 ], [ -68.916869, 47.189333 ], [ -68.909729, 47.186292 ], [ -68.905240, 47.180919 ], [ -68.902425, 47.178839 ], [ -68.900985, 47.178519 ], [ -68.898770, 47.181353 ], [ -68.895685, 47.182883 ], [ -68.893204, 47.182974 ], [ -68.890154, 47.182241 ], [ -68.882410, 47.183357 ], [ -68.877914, 47.186601 ], [ -68.874487, 47.188405 ], [ -68.871096, 47.189252 ], [ -68.862848, 47.189530 ], [ -68.857519, 47.190950 ], [ -68.853430, 47.193443 ], [ -68.848505, 47.197558 ], [ -68.830970, 47.204945 ], [ -68.812157, 47.215461 ], [ -68.803537, 47.216033 ], [ -68.780557, 47.221605 ], [ -68.769721, 47.221350 ], [ -68.764487, 47.222331 ], [ -68.752104, 47.226645 ], [ -68.745241, 47.231080 ], [ -68.735380, 47.235793 ], [ -68.717867, 47.240919 ], [ -68.713638, 47.240989 ], [ -68.710919, 47.240327 ], [ -68.708570, 47.238705 ], [ -68.705314, 47.238066 ], [ -68.693434, 47.243072 ], [ -68.690414, 47.243987 ], [ -68.687662, 47.244215 ], [ -68.675913, 47.242626 ], [ -68.664071, 47.236762 ], [ -68.661957, 47.236327 ], [ -68.658467, 47.237149 ], [ -68.653902, 47.239479 ], [ -68.648029, 47.239706 ], [ -68.639000, 47.241394 ], [ -68.624964, 47.242392 ], [ -68.619749, 47.243218 ], [ -68.607906, 47.247497 ], [ -68.604819, 47.249418 ], [ -68.595427, 47.257698 ], [ -68.594085, 47.259275 ], [ -68.594053, 47.261218 ], [ -68.595028, 47.263161 ], [ -68.598657, 47.267868 ], [ -68.598726, 47.269879 ], [ -68.596880, 47.271731 ], [ -68.592516, 47.274726 ], [ -68.590605, 47.280052 ], [ -68.588725, 47.281721 ], [ -68.582984, 47.285493 ], [ -68.578551, 47.287551 ], [ -68.571094, 47.287049 ], [ -68.560378, 47.283690 ], [ -68.553896, 47.282250 ], [ -68.551747, 47.282226 ], [ -68.546641, 47.282980 ], [ -68.539587, 47.285173 ], [ -68.529070, 47.292644 ], [ -68.523492, 47.294768 ], [ -68.517982, 47.296092 ], [ -68.507432, 47.296636 ], [ -68.504006, 47.296337 ], [ -68.496719, 47.294462 ], [ -68.491075, 47.294099 ], [ -68.486742, 47.294650 ], [ -68.478983, 47.296893 ], [ -68.474851, 47.297534 ], [ -68.470282, 47.296804 ], [ -68.466280, 47.294873 ], [ -68.463964, 47.292280 ], [ -68.460064, 47.286065 ], [ -68.458250, 47.284625 ], [ -68.448844, 47.282547 ], [ -68.443235, 47.283484 ], [ -68.432555, 47.281930 ], [ -68.428861, 47.281954 ], [ -68.425233, 47.283188 ], [ -68.415861, 47.287803 ], [ -68.413140, 47.288488 ], [ -68.389863, 47.286652 ], [ -68.383146, 47.286672 ], [ -68.378678, 47.287561 ], [ -68.376829, 47.288520 ], [ -68.375848, 47.290065 ], [ -68.375615, 47.292268 ], [ -68.376319, 47.294257 ], [ -68.376955, 47.295628 ], [ -68.378667, 47.297412 ], [ -68.384105, 47.301506 ], [ -68.384943, 47.302923 ], [ -68.384706, 47.305094 ], [ -68.381746, 47.307813 ], [ -68.381308, 47.309161 ], [ -68.384622, 47.322303 ], [ -68.384281, 47.326943 ], [ -68.380334, 47.340242 ], [ -68.378616, 47.343144 ], [ -68.374487, 47.347508 ], [ -68.370265, 47.351052 ], [ -68.365728, 47.353797 ], [ -68.361559, 47.355605 ], [ -68.355171, 47.357070 ], [ -68.336236, 47.359795 ], [ -68.329879, 47.360230 ], [ -68.323186, 47.359888 ], [ -68.309933, 47.356233 ], [ -68.303778, 47.355524 ], [ -68.300718, 47.356095 ], [ -68.292679, 47.359476 ], [ -68.289315, 47.360207 ], [ -68.284101, 47.360389 ], [ -68.278284, 47.358604 ], [ -68.272501, 47.354923 ], [ -68.269710, 47.353733 ], [ -68.265138, 47.352543 ], [ -68.247987, 47.352514 ], [ -68.240168, 47.354217 ], [ -68.234604, 47.355035 ], [ -68.227607, 47.353049 ], [ -68.224646, 47.350787 ], [ -68.224174, 47.349827 ], [ -68.224139, 47.346696 ], [ -68.222893, 47.344526 ], [ -68.217712, 47.340847 ], [ -68.214551, 47.339637 ], [ -68.211222, 47.339112 ], [ -68.204263, 47.339730 ], [ -68.202346, 47.339410 ], [ -68.176055, 47.329240 ], [ -68.161333, 47.327752 ], [ -68.155150, 47.325420 ], [ -68.153570, 47.324162 ], [ -68.152462, 47.321534 ], [ -68.153509, 47.314038 ], [ -68.153275, 47.311729 ], [ -68.152302, 47.309878 ], [ -68.145452, 47.304093 ], [ -68.137059, 47.296068 ], [ -68.128226, 47.294190 ], [ -68.125407, 47.292155 ], [ -68.121463, 47.288272 ], [ -68.119682, 47.287290 ], [ -68.092501, 47.276696 ], [ -68.082896, 47.271921 ], [ -68.080175, 47.269910 ], [ -68.077521, 47.266666 ], [ -68.076009, 47.262095 ], [ -68.074061, 47.259764 ], [ -68.061842, 47.256451 ], [ -68.037335, 47.245678 ], [ -68.033916, 47.243640 ], [ -68.019724, 47.238036 ], [ -68.016103, 47.234446 ], [ -68.006314, 47.226444 ], [ -67.998171, 47.217842 ], [ -67.991871, 47.212042 ], [ -67.990171, 47.211042 ], [ -67.986071, 47.209342 ], [ -67.971370, 47.207142 ], [ -67.969070, 47.206342 ], [ -67.963470, 47.202842 ], [ -67.955669, 47.199542 ], [ -67.952269, 47.196142 ], [ -67.951269, 47.192442 ], [ -67.950569, 47.185142 ], [ -67.949369, 47.182542 ], [ -67.944669, 47.177042 ], [ -67.943069, 47.176142 ], [ -67.939168, 47.171442 ], [ -67.935868, 47.164843 ], [ -67.925768, 47.154243 ], [ -67.919767, 47.151243 ], [ -67.910367, 47.148143 ], [ -67.903366, 47.137643 ], [ -67.901166, 47.135143 ], [ -67.893266, 47.129943 ], [ -67.892166, 47.128643 ], [ -67.890026, 47.124678 ], [ -67.889155, 47.118772 ], [ -67.889193, 47.113401 ], [ -67.888658, 47.111664 ], [ -67.885650, 47.107320 ], [ -67.883844, 47.105834 ], [ -67.881302, 47.103913 ], [ -67.878124, 47.102426 ], [ -67.870367, 47.100896 ], [ -67.864574, 47.099207 ], [ -67.849008, 47.093455 ], [ -67.836890, 47.087036 ], [ -67.832373, 47.085551 ], [ -67.823304, 47.084318 ], [ -67.820828, 47.083518 ], [ -67.816345, 47.081188 ], [ -67.810716, 47.076090 ], [ -67.804512, 47.073390 ], [ -67.794446, 47.069871 ], [ -67.790515, 47.067921 ], [ -67.789761, 47.065744 ], [ -67.789461, 47.062544 ], [ -67.789660, 47.040544 ], [ -67.788960, 47.025844 ], [ -67.789560, 47.015444 ], [ -67.789260, 47.003644 ], [ -67.789766, 47.000044 ], [ -67.789230, 46.880993 ], [ -67.789799, 46.794868 ], [ -67.789380, 46.765528 ], [ -67.789284, 46.758219 ], [ -67.788406, 46.601795 ], [ -67.784509, 46.437576 ], [ -67.782114, 46.279381 ], [ -67.780438, 46.038452 ], [ -67.780462, 46.004447 ], [ -67.781378, 45.963948 ], [ -67.781095, 45.943032 ], [ -67.779984, 45.938163 ], [ -67.777626, 45.934207 ], [ -67.776873, 45.934070 ], [ -67.774907, 45.935007 ], [ -67.773564, 45.934823 ], [ -67.757520, 45.925926 ], [ -67.750422, 45.917898 ], [ -67.751866, 45.914973 ], [ -67.755701, 45.911684 ], [ -67.759665, 45.909925 ], [ -67.763725, 45.910430 ], [ -67.765002, 45.909791 ], [ -67.768709, 45.901997 ], [ -67.767827, 45.898568 ], [ -67.768745, 45.897951 ], [ -67.779157, 45.895120 ], [ -67.783314, 45.895167 ], [ -67.785344, 45.895648 ], [ -67.803318, 45.883718 ], [ -67.803908, 45.882895 ], [ -67.804724, 45.874043 ], [ -67.803678, 45.869379 ], [ -67.796514, 45.859961 ], [ -67.789680, 45.851754 ], [ -67.783108, 45.846517 ], [ -67.777975, 45.843704 ], [ -67.772056, 45.841348 ], [ -67.769179, 45.839335 ], [ -67.765030, 45.834030 ], [ -67.763955, 45.829983 ], [ -67.762812, 45.828520 ], [ -67.755068, 45.823670 ], [ -67.763767, 45.820315 ], [ -67.765534, 45.818807 ], [ -67.766842, 45.818533 ], [ -67.772758, 45.819380 ], [ -67.777630, 45.819222 ], [ -67.780082, 45.818194 ], [ -67.780507, 45.817622 ], [ -67.780443, 45.816206 ], [ -67.801989, 45.803546 ], [ -67.806598, 45.794723 ], [ -67.803626, 45.781624 ], [ -67.805457, 45.769760 ], [ -67.809083, 45.767497 ], [ -67.806308, 45.755405 ], [ -67.793083, 45.750559 ], [ -67.781892, 45.731189 ], [ -67.809833, 45.729274 ], [ -67.803148, 45.696127 ], [ -67.817892, 45.693705 ], [ -67.803313, 45.677886 ], [ -67.768648, 45.677581 ], [ -67.754245, 45.667791 ], [ -67.730350, 45.663239 ], [ -67.720401, 45.662522 ], [ -67.719651, 45.662819 ], [ -67.717990, 45.665243 ], [ -67.718056, 45.667986 ], [ -67.723600, 45.670384 ], [ -67.730845, 45.678223 ], [ -67.733720, 45.684233 ], [ -67.734605, 45.688987 ], [ -67.729908, 45.689012 ], [ -67.727648, 45.688468 ], [ -67.710464, 45.679372 ], [ -67.706092, 45.673635 ], [ -67.697970, 45.659738 ], [ -67.692623, 45.650366 ], [ -67.675417, 45.630959 ], [ -67.666456, 45.624461 ], [ -67.645810, 45.613597 ], [ -67.640238, 45.616178 ], [ -67.644206, 45.623220 ], [ -67.639741, 45.624771 ], [ -67.631762, 45.621409 ], [ -67.606172, 45.606533 ], [ -67.583341, 45.602493 ], [ -67.561359, 45.594906 ], [ -67.556931, 45.595066 ], [ -67.556345, 45.597260 ], [ -67.546120, 45.598059 ], [ -67.534919, 45.595428 ], [ -67.518580, 45.587925 ], [ -67.499444, 45.587014 ], [ -67.490923, 45.591488 ], [ -67.488452, 45.594643 ], [ -67.489018, 45.596944 ], [ -67.491061, 45.598917 ], [ -67.489793, 45.601180 ], [ -67.476704, 45.604157 ], [ -67.455406, 45.604665 ], [ -67.449674, 45.602860 ], [ -67.429716, 45.583773 ], [ -67.425452, 45.579086 ], [ -67.423646, 45.572153 ], [ -67.420976, 45.550029 ], [ -67.425399, 45.540795 ], [ -67.428338, 45.540626 ], [ -67.429057, 45.541207 ], [ -67.430670, 45.541390 ], [ -67.432236, 45.541023 ], [ -67.434559, 45.535912 ], [ -67.435275, 45.530781 ], [ -67.435044, 45.528783 ], [ -67.432207, 45.519996 ], [ -67.420543, 45.511113 ], [ -67.416416, 45.503515 ], [ -67.416462, 45.502147 ], [ -67.417417, 45.501985 ], [ -67.420966, 45.505054 ], [ -67.422649, 45.505863 ], [ -67.424242, 45.505907 ], [ -67.425674, 45.502917 ], [ -67.427713, 45.501336 ], [ -67.429681, 45.501592 ], [ -67.449968, 45.504933 ], [ -67.462882, 45.508691 ], [ -67.470416, 45.505307 ], [ -67.470910, 45.504279 ], [ -67.470732, 45.500067 ], [ -67.476855, 45.497240 ], [ -67.488001, 45.493762 ], [ -67.499445, 45.491013 ], [ -67.503088, 45.489688 ], [ -67.503771, 45.488522 ], [ -67.503157, 45.485367 ], [ -67.499767, 45.478050 ], [ -67.494351, 45.473048 ], [ -67.486907, 45.468024 ], [ -67.482353, 45.460825 ], [ -67.481929, 45.458288 ], [ -67.484851, 45.456001 ], [ -67.484328, 45.451955 ], [ -67.477200, 45.431590 ], [ -67.473366, 45.425328 ], [ -67.471255, 45.423477 ], [ -67.458495, 45.415960 ], [ -67.448106, 45.407823 ], [ -67.430001, 45.392965 ], [ -67.418747, 45.377260 ], [ -67.419007, 45.376026 ], [ -67.421501, 45.374078 ], [ -67.423773, 45.373461 ], [ -67.427243, 45.373690 ], [ -67.430097, 45.371862 ], [ -67.431232, 45.370787 ], [ -67.434281, 45.365438 ], [ -67.433536, 45.361324 ], [ -67.427797, 45.355471 ], [ -67.430489, 45.348751 ], [ -67.434996, 45.340133 ], [ -67.442029, 45.334601 ], [ -67.453469, 45.328246 ], [ -67.456288, 45.326440 ], [ -67.456676, 45.325640 ], [ -67.456384, 45.323925 ], [ -67.452268, 45.319628 ], [ -67.452267, 45.316839 ], [ -67.453336, 45.314256 ], [ -67.460554, 45.300379 ], [ -67.465833, 45.297223 ], [ -67.466091, 45.294160 ], [ -67.466479, 45.293817 ], [ -67.479690, 45.289767 ], [ -67.482315, 45.291412 ], [ -67.484258, 45.291868 ], [ -67.485683, 45.291433 ], [ -67.486524, 45.290633 ], [ -67.489464, 45.282653 ], [ -67.489333, 45.281282 ], [ -67.463570, 45.244097 ], [ -67.462081, 45.242748 ], [ -67.460236, 45.241926 ], [ -67.453473, 45.241127 ], [ -67.439980, 45.227047 ], [ -67.437101, 45.222658 ], [ -67.431410, 45.210039 ], [ -67.429083, 45.199066 ], [ -67.428889, 45.193213 ], [ -67.407139, 45.179425 ], [ -67.404658, 45.166944 ], [ -67.405370, 45.164864 ], [ -67.405370, 45.162852 ], [ -67.404629, 45.159926 ], [ -67.390579, 45.154114 ], [ -67.383635, 45.152259 ], [ -67.357117, 45.131782 ], [ -67.353434, 45.129475 ], [ -67.345585, 45.126392 ], [ -67.340806, 45.125435 ], [ -67.339869, 45.125594 ], [ -67.329829, 45.131654 ], [ -67.318462, 45.139403 ], [ -67.305472, 45.144826 ], [ -67.298209, 45.146672 ], [ -67.296174, 45.147952 ], [ -67.294881, 45.149666 ], [ -67.294363, 45.153506 ], [ -67.296979, 45.155267 ], [ -67.301729, 45.157119 ], [ -67.302568, 45.161348 ], [ -67.299238, 45.168937 ], [ -67.295910, 45.170400 ], [ -67.291417, 45.171450 ], [ -67.291707, 45.174491 ], [ -67.293484, 45.176114 ], [ -67.293742, 45.177966 ], [ -67.290603, 45.187589 ], [ -67.289794, 45.188663 ], [ -67.283619, 45.192022 ], [ -67.271076, 45.191081 ], [ -67.261542, 45.187785 ], [ -67.257795, 45.185132 ], [ -67.246697, 45.180765 ], [ -67.244012, 45.178274 ], [ -67.242293, 45.172240 ], [ -67.240643, 45.171167 ], [ -67.233047, 45.168587 ], [ -67.230201, 45.165549 ], [ -67.227324, 45.163652 ], [ -67.223156, 45.163700 ], [ -67.203933, 45.171407 ], [ -67.191167, 45.165876 ], [ -67.167870, 45.164595 ], [ -67.161247, 45.162879 ], [ -67.159406, 45.162193 ], [ -67.157919, 45.161004 ], [ -67.145652, 45.146667 ], [ -67.128935, 45.132168 ], [ -67.112414, 45.112323 ], [ -67.094735, 45.075458 ], [ -67.090786, 45.068721 ], [ -67.105899, 45.065786 ], [ -67.117688, 45.056730 ], [ -67.099749, 45.045010 ], [ -67.082074, 45.029608 ], [ -67.074914, 45.019254 ], [ -67.072753, 45.008329 ], [ -67.068274, 45.001014 ], [ -67.054610, 44.986764 ], [ -67.038299, 44.945433 ], [ -67.033474, 44.939923 ], [ -67.002118, 44.918836 ], [ -66.990937, 44.917835 ], [ -66.984466, 44.912557 ], [ -66.983558, 44.903277 ], [ -66.985901, 44.897150 ], [ -66.989235, 44.896480 ], [ -66.990351, 44.882551 ], [ -66.981008, 44.862813 ], [ -66.978142, 44.856963 ], [ -66.992960, 44.849181 ], [ -66.996523, 44.844654 ], [ -66.986318, 44.820657 ], [ -66.975009, 44.815495 ], [ -66.966468, 44.819063 ], [ -66.952112, 44.820070 ], [ -66.949895, 44.817419 ], [ -66.950569, 44.814539 ], [ -66.961068, 44.807269 ], [ -66.970026, 44.805713 ], [ -66.976260, 44.808315 ], [ -66.979708, 44.807360 ], [ -66.989351, 44.798780 ], [ -66.995154, 44.791073 ], [ -67.019950, 44.771427 ], [ -67.026150, 44.768199 ], [ -67.043350, 44.765071 ], [ -67.055160, 44.771442 ], [ -67.062239, 44.769543 ], [ -67.063308, 44.758238 ], [ -67.073439, 44.741957 ], [ -67.083477, 44.739899 ], [ -67.092542, 44.742693 ], [ -67.098931, 44.741311 ], [ -67.103957, 44.717444 ], [ -67.128792, 44.695421 ], [ -67.139209, 44.693849 ], [ -67.148061, 44.684114 ], [ -67.155119, 44.669440 ], [ -67.154479, 44.668114 ], [ -67.169857, 44.662105 ], [ -67.181785, 44.663699 ], [ -67.186612, 44.662650 ], [ -67.192068, 44.655515 ], [ -67.191438, 44.647750 ], [ -67.189427, 44.645533 ], [ -67.213025, 44.639220 ], [ -67.234275, 44.637201 ], [ -67.247260, 44.641664 ], [ -67.251247, 44.640825 ], [ -67.274122, 44.626345 ], [ -67.277060, 44.617950 ], [ -67.273076, 44.610873 ], [ -67.279160, 44.606782 ], [ -67.293403, 44.599265 ], [ -67.302427, 44.597323 ], [ -67.314938, 44.598215 ], [ -67.322970, 44.609394 ], [ -67.322491, 44.612458 ], [ -67.310745, 44.613212 ], [ -67.293665, 44.634316 ], [ -67.292462, 44.648455 ], [ -67.298449, 44.654377 ], [ -67.309627, 44.659316 ], [ -67.326182, 44.656715 ], [ -67.327557, 44.667026 ], [ -67.322058, 44.673900 ], [ -67.309302, 44.665344 ], [ -67.307909, 44.691295 ], [ -67.300144, 44.696752 ], [ -67.299176, 44.705705 ], [ -67.308538, 44.707454 ], [ -67.347782, 44.699480 ], [ -67.355966, 44.699060 ], [ -67.376742, 44.681852 ], [ -67.381149, 44.669470 ], [ -67.379050, 44.665483 ], [ -67.374014, 44.662965 ], [ -67.367298, 44.652472 ], [ -67.363158, 44.631825 ], [ -67.368269, 44.624672 ], [ -67.377554, 44.619757 ], [ -67.386605, 44.626974 ], [ -67.388704, 44.626554 ], [ -67.395839, 44.612914 ], [ -67.398987, 44.602631 ], [ -67.405492, 44.594236 ], [ -67.411815, 44.596954 ], [ -67.418923, 44.603470 ], [ -67.420602, 44.607877 ], [ -67.428367, 44.609136 ], [ -67.443686, 44.605779 ], [ -67.447464, 44.603260 ], [ -67.448513, 44.600322 ], [ -67.457747, 44.598014 ], [ -67.492373, 44.617950 ], [ -67.493632, 44.628863 ], [ -67.505804, 44.636837 ], [ -67.522802, 44.633060 ], [ -67.524061, 44.626554 ], [ -67.530777, 44.621938 ], [ -67.533925, 44.621518 ], [ -67.540220, 44.626345 ], [ -67.543368, 44.626554 ], [ -67.551133, 44.621938 ], [ -67.552392, 44.619629 ], [ -67.575056, 44.560659 ], [ -67.569836, 44.556788 ], [ -67.562321, 44.539435 ], [ -67.568159, 44.531117 ], [ -67.648506, 44.525403 ], [ -67.653123, 44.525823 ], [ -67.656901, 44.535896 ], [ -67.660678, 44.537575 ], [ -67.685861, 44.537155 ], [ -67.696354, 44.533798 ], [ -67.702649, 44.527922 ], [ -67.698872, 44.515750 ], [ -67.703489, 44.504837 ], [ -67.714190, 44.495238 ], [ -67.722876, 44.498524 ], [ -67.733986, 44.496252 ], [ -67.743353, 44.497418 ], [ -67.742789, 44.506176 ], [ -67.740076, 44.508944 ], [ -67.742942, 44.526453 ], [ -67.753854, 44.543661 ], [ -67.758891, 44.546599 ], [ -67.767285, 44.548278 ], [ -67.774001, 44.547438 ], [ -67.779457, 44.543661 ], [ -67.781975, 44.534008 ], [ -67.781556, 44.520577 ], [ -67.797260, 44.520685 ], [ -67.802541, 44.523934 ], [ -67.805479, 44.529810 ], [ -67.805479, 44.536946 ], [ -67.808837, 44.544081 ], [ -67.829823, 44.557512 ], [ -67.839896, 44.558771 ], [ -67.844513, 44.556252 ], [ -67.845772, 44.551636 ], [ -67.843254, 44.542822 ], [ -67.856684, 44.523934 ], [ -67.853746, 44.497492 ], [ -67.851228, 44.492456 ], [ -67.851648, 44.484901 ], [ -67.855579, 44.478676 ], [ -67.860994, 44.477576 ], [ -67.866801, 44.471812 ], [ -67.868774, 44.465272 ], [ -67.868875, 44.456881 ], [ -67.851764, 44.428695 ], [ -67.851697, 44.424282 ], [ -67.855108, 44.419434 ], [ -67.868856, 44.424672 ], [ -67.878509, 44.435585 ], [ -67.887323, 44.433066 ], [ -67.887323, 44.426351 ], [ -67.892033, 44.409668 ], [ -67.899571, 44.394078 ], [ -67.911667, 44.419216 ], [ -67.913346, 44.430128 ], [ -67.921320, 44.433066 ], [ -67.926357, 44.431807 ], [ -67.930554, 44.428869 ], [ -67.927616, 44.421314 ], [ -67.931453, 44.411848 ], [ -67.936531, 44.411187 ], [ -67.947342, 44.415858 ], [ -67.955737, 44.416278 ], [ -67.961613, 44.412500 ], [ -67.961613, 44.399070 ], [ -67.978876, 44.387034 ], [ -67.985668, 44.386917 ], [ -67.997288, 44.399909 ], [ -68.000646, 44.406624 ], [ -68.006102, 44.409562 ], [ -68.010719, 44.407464 ], [ -68.019533, 44.396971 ], [ -68.013990, 44.390255 ], [ -68.034223, 44.360456 ], [ -68.039679, 44.360876 ], [ -68.044296, 44.357938 ], [ -68.044716, 44.351222 ], [ -68.043037, 44.343667 ], [ -68.049334, 44.330730 ], [ -68.060356, 44.331988 ], [ -68.067047, 44.335692 ], [ -68.076066, 44.347925 ], [ -68.077873, 44.373047 ], [ -68.086268, 44.376405 ], [ -68.090045, 44.371369 ], [ -68.092983, 44.370949 ], [ -68.103818, 44.385111 ], [ -68.112290, 44.401588 ], [ -68.112710, 44.421314 ], [ -68.116487, 44.429289 ], [ -68.119845, 44.445658 ], [ -68.119425, 44.459508 ], [ -68.115228, 44.467903 ], [ -68.117746, 44.475038 ], [ -68.123203, 44.478815 ], [ -68.150904, 44.482383 ], [ -68.159298, 44.479445 ], [ -68.162656, 44.477346 ], [ -68.163075, 44.473149 ], [ -68.171050, 44.470211 ], [ -68.194554, 44.471890 ], [ -68.189517, 44.478605 ], [ -68.189937, 44.484901 ], [ -68.192036, 44.487419 ], [ -68.213861, 44.492456 ], [ -68.223934, 44.487000 ], [ -68.227292, 44.479865 ], [ -68.224354, 44.464335 ], [ -68.229390, 44.463496 ], [ -68.244500, 44.471051 ], [ -68.252474, 44.483222 ], [ -68.261708, 44.484062 ], [ -68.268004, 44.471470 ], [ -68.270522, 44.459718 ], [ -68.281015, 44.451324 ], [ -68.298223, 44.449225 ], [ -68.299063, 44.437893 ], [ -68.294865, 44.432857 ], [ -68.268423, 44.440411 ], [ -68.247438, 44.433276 ], [ -68.244500, 44.429919 ], [ -68.243660, 44.420685 ], [ -68.249956, 44.417747 ], [ -68.249956, 44.414809 ], [ -68.215540, 44.390466 ], [ -68.209664, 44.392984 ], [ -68.203540, 44.392365 ], [ -68.196937, 44.386352 ], [ -68.184532, 44.369145 ], [ -68.174687, 44.343604 ], [ -68.173608, 44.328397 ], [ -68.191924, 44.306675 ], [ -68.233435, 44.288578 ], [ -68.275139, 44.288895 ], [ -68.289409, 44.283858 ], [ -68.298223, 44.276303 ], [ -68.298643, 44.266650 ], [ -68.297641, 44.263035 ], [ -68.295265, 44.261722 ], [ -68.290818, 44.247673 ], [ -68.317588, 44.225101 ], [ -68.339498, 44.222893 ], [ -68.343132, 44.229505 ], [ -68.365364, 44.237871 ], [ -68.369759, 44.243311 ], [ -68.377982, 44.247563 ], [ -68.389848, 44.247066 ], [ -68.401268, 44.252244 ], [ -68.419650, 44.274612 ], [ -68.421302, 44.284468 ], [ -68.426107, 44.295102 ], [ -68.430946, 44.298624 ], [ -68.430853, 44.312609 ], [ -68.411965, 44.322262 ], [ -68.409027, 44.325620 ], [ -68.409867, 44.329397 ], [ -68.421619, 44.336113 ], [ -68.421471, 44.337754 ], [ -68.409867, 44.356259 ], [ -68.406089, 44.356679 ], [ -68.396552, 44.363941 ], [ -68.395516, 44.369561 ], [ -68.398035, 44.376191 ], [ -68.367565, 44.390710 ], [ -68.363720, 44.388935 ], [ -68.360318, 44.389674 ], [ -68.358100, 44.392337 ], [ -68.359082, 44.402847 ], [ -68.372445, 44.423690 ], [ -68.379100, 44.430049 ], [ -68.387678, 44.430936 ], [ -68.390932, 44.427387 ], [ -68.392559, 44.418070 ], [ -68.416412, 44.397973 ], [ -68.421783, 44.396411 ], [ -68.427874, 44.396800 ], [ -68.433901, 44.401534 ], [ -68.432556, 44.426594 ], [ -68.429648, 44.439136 ], [ -68.439281, 44.448043 ], [ -68.448006, 44.449497 ], [ -68.455095, 44.447498 ], [ -68.460003, 44.443317 ], [ -68.463820, 44.436592 ], [ -68.458849, 44.412141 ], [ -68.464106, 44.398078 ], [ -68.464262, 44.391081 ], [ -68.461072, 44.385639 ], [ -68.461072, 44.378504 ], [ -68.466109, 44.377245 ], [ -68.478280, 44.378084 ], [ -68.483317, 44.388157 ], [ -68.480798, 44.397391 ], [ -68.472824, 44.404106 ], [ -68.480379, 44.432647 ], [ -68.485415, 44.434326 ], [ -68.494649, 44.429709 ], [ -68.499686, 44.414179 ], [ -68.505562, 44.411661 ], [ -68.514520, 44.413340 ], [ -68.529905, 44.399070 ], [ -68.534522, 44.397811 ], [ -68.555088, 44.403687 ], [ -68.560964, 44.402847 ], [ -68.565161, 44.399070 ], [ -68.566420, 44.394453 ], [ -68.564741, 44.385219 ], [ -68.559285, 44.374307 ], [ -68.550051, 44.371788 ], [ -68.545434, 44.355000 ], [ -68.553873, 44.346256 ], [ -68.563209, 44.333039 ], [ -68.566936, 44.317603 ], [ -68.566203, 44.313007 ], [ -68.564005, 44.308022 ], [ -68.556236, 44.300819 ], [ -68.538595, 44.299902 ], [ -68.530731, 44.301774 ], [ -68.527528, 44.295248 ], [ -68.532266, 44.286340 ], [ -68.528611, 44.276117 ], [ -68.519516, 44.265046 ], [ -68.519819, 44.260209 ], [ -68.529802, 44.249594 ], [ -68.528153, 44.241263 ], [ -68.523480, 44.235819 ], [ -68.525302, 44.227554 ], [ -68.534595, 44.229331 ], [ -68.550802, 44.236534 ], [ -68.551162, 44.238335 ], [ -68.562687, 44.248059 ], [ -68.572772, 44.252741 ], [ -68.603385, 44.274710 ], [ -68.615630, 44.275431 ], [ -68.626075, 44.280473 ], [ -68.627515, 44.284435 ], [ -68.630036, 44.286235 ], [ -68.682979, 44.299201 ], [ -68.725657, 44.321591 ], [ -68.733004, 44.328388 ], [ -68.746164, 44.331148 ], [ -68.762021, 44.329597 ], [ -68.766197, 44.327015 ], [ -68.771489, 44.320523 ], [ -68.795063, 44.307860 ], [ -68.827197, 44.312160 ], [ -68.828377, 44.316549 ], [ -68.825419, 44.334547 ], [ -68.821311, 44.349594 ], [ -68.817647, 44.353093 ], [ -68.814811, 44.362194 ], [ -68.818703, 44.375077 ], [ -68.821767, 44.408940 ], [ -68.815325, 44.428080 ], [ -68.801634, 44.434803 ], [ -68.785898, 44.462611 ], [ -68.783679, 44.473879 ], [ -68.810059, 44.468737 ], [ -68.829153, 44.462242 ], [ -68.858993, 44.444923 ], [ -68.880271, 44.428112 ], [ -68.886491, 44.430676 ], [ -68.890826, 44.437995 ], [ -68.892800, 44.443415 ], [ -68.892073, 44.445075 ], [ -68.897104, 44.450643 ], [ -68.900934, 44.452062 ], [ -68.927452, 44.448039 ], [ -68.931934, 44.438690 ], [ -68.946582, 44.429108 ], [ -68.982449, 44.426195 ], [ -68.990767, 44.415033 ], [ -68.984404, 44.396879 ], [ -68.978815, 44.386340 ], [ -68.967300, 44.381106 ], [ -68.961111, 44.375076 ], [ -68.948164, 44.355882 ], [ -68.954465, 44.324050 ], [ -68.958889, 44.314353 ], [ -68.979005, 44.296327 ], [ -69.003682, 44.294582 ], [ -69.005071, 44.274071 ], [ -69.017051, 44.257086 ], [ -69.029434, 44.248558 ], [ -69.040193, 44.233673 ], [ -69.043599, 44.225029 ], [ -69.042807, 44.215173 ], [ -69.051810, 44.195920 ], [ -69.054546, 44.171542 ], [ -69.061240, 44.165498 ], [ -69.077776, 44.165043 ], [ -69.079835, 44.160953 ], [ -69.080978, 44.156768 ], [ -69.079608, 44.143962 ], [ -69.075667, 44.129991 ], [ -69.080331, 44.117824 ], [ -69.100863, 44.104529 ], [ -69.101107, 44.093601 ], [ -69.092000, 44.085734 ], [ -69.089078, 44.085326 ], [ -69.076452, 44.090634 ], [ -69.056303, 44.095162 ], [ -69.050814, 44.094888 ], [ -69.043403, 44.092164 ], [ -69.031878, 44.079036 ], [ -69.048917, 44.062506 ], [ -69.050566, 44.063152 ], [ -69.050622, 44.068017 ], [ -69.056093, 44.069490 ], [ -69.064299, 44.069911 ], [ -69.067876, 44.067596 ], [ -69.079805, 44.055256 ], [ -69.073767, 44.046135 ], [ -69.081131, 44.041295 ], [ -69.094177, 44.038981 ], [ -69.113113, 44.028881 ], [ -69.125738, 44.019623 ], [ -69.128052, 44.017309 ], [ -69.124475, 44.007419 ], [ -69.148883, 43.998582 ], [ -69.162559, 43.999003 ], [ -69.170345, 43.995637 ], [ -69.193805, 43.975543 ], [ -69.197803, 43.967547 ], [ -69.193805, 43.959762 ], [ -69.196330, 43.950504 ], [ -69.203668, 43.941806 ], [ -69.214205, 43.935583 ], [ -69.237368, 43.931596 ], [ -69.242710, 43.925465 ], [ -69.260862, 43.915405 ], [ -69.273949, 43.914215 ], [ -69.278113, 43.917189 ], [ -69.278708, 43.921948 ], [ -69.274544, 43.927897 ], [ -69.267515, 43.943667 ], [ -69.280498, 43.957440 ], [ -69.283998, 43.958569 ], [ -69.288513, 43.957665 ], [ -69.307776, 43.943451 ], [ -69.314270, 43.942951 ], [ -69.319751, 43.944870 ], [ -69.305176, 43.956676 ], [ -69.304301, 43.962068 ], [ -69.331411, 43.974311 ], [ -69.351961, 43.974748 ], [ -69.366702, 43.964755 ], [ -69.388059, 43.964340 ], [ -69.398455, 43.971804 ], [ -69.416165, 43.977267 ], [ -69.428760, 43.957929 ], [ -69.431686, 43.964546 ], [ -69.436495, 43.966878 ], [ -69.441596, 43.964254 ], [ -69.451070, 43.941955 ], [ -69.459637, 43.903316 ], [ -69.483498, 43.880280 ], [ -69.486243, 43.869118 ], [ -69.503290, 43.837673 ], [ -69.514889, 43.831298 ], [ -69.516212, 43.837222 ], [ -69.513267, 43.844790 ], [ -69.520301, 43.868498 ], [ -69.524673, 43.875639 ], [ -69.543912, 43.881615 ], [ -69.549450, 43.880012 ], [ -69.550908, 43.877971 ], [ -69.550616, 43.872579 ], [ -69.545028, 43.861241 ], [ -69.552606, 43.841347 ], [ -69.558122, 43.840660 ], [ -69.568325, 43.844449 ], [ -69.572697, 43.844012 ], [ -69.575466, 43.841972 ], [ -69.578527, 43.823316 ], [ -69.588551, 43.818360 ], [ -69.604179, 43.813551 ], [ -69.605928, 43.814862 ], [ -69.604616, 43.825793 ], [ -69.598495, 43.825502 ], [ -69.592373, 43.830895 ], [ -69.589167, 43.851299 ], [ -69.594705, 43.858878 ], [ -69.604616, 43.858004 ], [ -69.613215, 43.845032 ], [ -69.613069, 43.837453 ], [ -69.615110, 43.831623 ], [ -69.621086, 43.826814 ], [ -69.630268, 43.837016 ], [ -69.629685, 43.843429 ], [ -69.634932, 43.845907 ], [ -69.649798, 43.836287 ], [ -69.653150, 43.817194 ], [ -69.650818, 43.803785 ], [ -69.653337, 43.791030 ], [ -69.664922, 43.791033 ], [ -69.685473, 43.816328 ], [ -69.685579, 43.820546 ], [ -69.692429, 43.824336 ], [ -69.697239, 43.825065 ], [ -69.705838, 43.823024 ], [ -69.714873, 43.810264 ], [ -69.717804, 43.801047 ], [ -69.717074, 43.792403 ], [ -69.719723, 43.786685 ], [ -69.752801, 43.755940 ], [ -69.761587, 43.757000 ], [ -69.780097, 43.755397 ], [ -69.782429, 43.753794 ], [ -69.782283, 43.751170 ], [ -69.778494, 43.747089 ], [ -69.778348, 43.744612 ], [ -69.835323, 43.721125 ], [ -69.838689, 43.705140 ], [ -69.851297, 43.703581 ], [ -69.855081, 43.704746 ], [ -69.857927, 43.723915 ], [ -69.855595, 43.732660 ], [ -69.858947, 43.740531 ], [ -69.868673, 43.742701 ], [ -69.862155, 43.758962 ], [ -69.869732, 43.775656 ], [ -69.884066, 43.778035 ], [ -69.903164, 43.772390 ], [ -69.915593, 43.775112 ], [ -69.927011, 43.780174 ], [ -69.948539, 43.765948 ], [ -69.953246, 43.768806 ], [ -69.958056, 43.767786 ], [ -69.982574, 43.750801 ], [ -69.989131, 43.743227 ], [ -69.994479, 43.728451 ], [ -69.992396, 43.726852 ], [ -69.992615, 43.724793 ], [ -70.001645, 43.717666 ], [ -70.006954, 43.717065 ], [ -70.005205, 43.727559 ], [ -70.001125, 43.733389 ], [ -69.998793, 43.740385 ], [ -70.001708, 43.744466 ], [ -70.041351, 43.738053 ], [ -70.040768, 43.745049 ], [ -70.034355, 43.759041 ], [ -70.025610, 43.769534 ], [ -70.005205, 43.787607 ], [ -69.998210, 43.798684 ], [ -69.999376, 43.805097 ], [ -70.002874, 43.812093 ], [ -70.011035, 43.810927 ], [ -70.026193, 43.822587 ], [ -70.026193, 43.829000 ], [ -70.023278, 43.834247 ], [ -70.006954, 43.844158 ], [ -70.002874, 43.848239 ], [ -70.002874, 43.852903 ], [ -70.009869, 43.859315 ], [ -70.019197, 43.858733 ], [ -70.032023, 43.849988 ], [ -70.053594, 43.828417 ], [ -70.053011, 43.821421 ], [ -70.064671, 43.813259 ], [ -70.066420, 43.819672 ], [ -70.080995, 43.819672 ], [ -70.107229, 43.809178 ], [ -70.142792, 43.791688 ], [ -70.153869, 43.781194 ], [ -70.153869, 43.774781 ], [ -70.176023, 43.760790 ], [ -70.177772, 43.764871 ], [ -70.172525, 43.773615 ], [ -70.175440, 43.777113 ], [ -70.190014, 43.771866 ], [ -70.194678, 43.766037 ], [ -70.197593, 43.753211 ], [ -70.194095, 43.745632 ], [ -70.194678, 43.742134 ], [ -70.217998, 43.719980 ], [ -70.219164, 43.715899 ], [ -70.215666, 43.707737 ], [ -70.216832, 43.704822 ], [ -70.227909, 43.701907 ], [ -70.231990, 43.704822 ], [ -70.251812, 43.683251 ], [ -70.254144, 43.676839 ], [ -70.252961, 43.675010 ], [ -70.247321, 43.671973 ], [ -70.242289, 43.669544 ], [ -70.239512, 43.665986 ], [ -70.240119, 43.664685 ], [ -70.241942, 43.663296 ], [ -70.240987, 43.659132 ], [ -70.222990, 43.639023 ], [ -70.211204, 43.625765 ], [ -70.217087, 43.596717 ], [ -70.214369, 43.590445 ], [ -70.201120, 43.586515 ], [ -70.196911, 43.565146 ], [ -70.206123, 43.557627 ], [ -70.216782, 43.556874 ], [ -70.219784, 43.562149 ], [ -70.231963, 43.561118 ], [ -70.244331, 43.551849 ], [ -70.261917, 43.553687 ], [ -70.272497, 43.562616 ], [ -70.299184, 43.550589 ], [ -70.307764, 43.544315 ], [ -70.311493, 43.534136 ], [ -70.308743, 43.527950 ], [ -70.321116, 43.527262 ], [ -70.319741, 43.534136 ], [ -70.328806, 43.541946 ], [ -70.341793, 43.540484 ], [ -70.352826, 43.535855 ], [ -70.361214, 43.529190 ], [ -70.379123, 43.507202 ], [ -70.384885, 43.496040 ], [ -70.385615, 43.487031 ], [ -70.382928, 43.469674 ], [ -70.380233, 43.464230 ], [ -70.372230, 43.455080 ], [ -70.367364, 43.452264 ], [ -70.357549, 43.457833 ], [ -70.327303, 43.458521 ], [ -70.337884, 43.442051 ], [ -70.349684, 43.442032 ], [ -70.362015, 43.439077 ], [ -70.370514, 43.434133 ], [ -70.376638, 43.427644 ], [ -70.380776, 43.410223 ], [ -70.398465, 43.392919 ], [ -70.400773, 43.395226 ], [ -70.401666, 43.401262 ], [ -70.406416, 43.400942 ], [ -70.421282, 43.395777 ], [ -70.427672, 43.389254 ], [ -70.424421, 43.379656 ], [ -70.418461, 43.372538 ], [ -70.414616, 43.362156 ], [ -70.426537, 43.354080 ], [ -70.465975, 43.340246 ], [ -70.472933, 43.343972 ], [ -70.485312, 43.346391 ], [ -70.517695, 43.344037 ], [ -70.535244, 43.336771 ], [ -70.553854, 43.321886 ], [ -70.562779, 43.310614 ], [ -70.585184, 43.270113 ], [ -70.593907, 43.249295 ], [ -70.591022, 43.237851 ], [ -70.575787, 43.221859 ], [ -70.576692, 43.217651 ], [ -70.587814, 43.199858 ], [ -70.606994, 43.177553 ], [ -70.592177, 43.170738 ], [ -70.591490, 43.164551 ], [ -70.618973, 43.163625 ], [ -70.625953, 43.147382 ], [ -70.622384, 43.138867 ], [ -70.622510, 43.134573 ], [ -70.632067, 43.133157 ], [ -70.634455, 43.127603 ], [ -70.634311, 43.122162 ], [ -70.638355, 43.114182 ], [ -70.655322, 43.098008 ], [ -70.656223, 43.093164 ], [ -70.665958, 43.076234 ], [ -70.673114, 43.070314 ], [ -70.703818, 43.059825 ], [ -70.703819, 43.059825 ] ] ], [ [ [ -70.135957, 43.753219 ], [ -70.135957, 43.756243 ], [ -70.132540, 43.762142 ], [ -70.129721, 43.764080 ], [ -70.117688, 43.765693 ], [ -70.116630, 43.765458 ], [ -70.116176, 43.765189 ], [ -70.116932, 43.764181 ], [ -70.120225, 43.760642 ], [ -70.128198, 43.755667 ], [ -70.132054, 43.754101 ], [ -70.135957, 43.753219 ] ] ], [ [ [ -70.152589, 43.746794 ], [ -70.151959, 43.749188 ], [ -70.153344, 43.750574 ], [ -70.156116, 43.749440 ], [ -70.157754, 43.749818 ], [ -70.158510, 43.750601 ], [ -70.158456, 43.751616 ], [ -70.147646, 43.758585 ], [ -70.146286, 43.762100 ], [ -70.145911, 43.772119 ], [ -70.145033, 43.773668 ], [ -70.143603, 43.774108 ], [ -70.134287, 43.774156 ], [ -70.133029, 43.774323 ], [ -70.131174, 43.774387 ], [ -70.128271, 43.774009 ], [ -70.127389, 43.772623 ], [ -70.129668, 43.770943 ], [ -70.132485, 43.768549 ], [ -70.135513, 43.765576 ], [ -70.140890, 43.753204 ], [ -70.142827, 43.751630 ], [ -70.146539, 43.750093 ], [ -70.149830, 43.747390 ], [ -70.151833, 43.746542 ], [ -70.152589, 43.746794 ] ] ], [ [ [ -68.140549, 44.376804 ], [ -68.148369, 44.384109 ], [ -68.147774, 44.392437 ], [ -68.134094, 44.407310 ], [ -68.135284, 44.415043 ], [ -68.143013, 44.425751 ], [ -68.142616, 44.436611 ], [ -68.134094, 44.450733 ], [ -68.126358, 44.446571 ], [ -68.119926, 44.411175 ], [ -68.126114, 44.388493 ], [ -68.140549, 44.376804 ] ] ], [ [ [ -68.454430, 44.298336 ], [ -68.456490, 44.344395 ], [ -68.446869, 44.362953 ], [ -68.421432, 44.374641 ], [ -68.415932, 44.358143 ], [ -68.428993, 44.329960 ], [ -68.447556, 44.300400 ], [ -68.454430, 44.298336 ] ] ], [ [ [ -68.707047, 44.272324 ], [ -68.731430, 44.289574 ], [ -68.746307, 44.302662 ], [ -68.738762, 44.311031 ], [ -68.682396, 44.285595 ], [ -68.688599, 44.275894 ], [ -68.707047, 44.272324 ] ] ], [ [ [ -68.459244, 44.255032 ], [ -68.486046, 44.269466 ], [ -68.491547, 44.283215 ], [ -68.454430, 44.257778 ], [ -68.459244, 44.255032 ] ] ], [ [ [ -69.351875, 43.922543 ], [ -69.369125, 43.926113 ], [ -69.371506, 43.931465 ], [ -69.364967, 43.941578 ], [ -69.357231, 43.951096 ], [ -69.344147, 43.960613 ], [ -69.334030, 43.964779 ], [ -69.325111, 43.955856 ], [ -69.325111, 43.950500 ], [ -69.331055, 43.945148 ], [ -69.339386, 43.944553 ], [ -69.341766, 43.939198 ], [ -69.340576, 43.933846 ], [ -69.343552, 43.925518 ], [ -69.351875, 43.922543 ] ] ], [ [ [ -69.134735, 43.860310 ], [ -69.125107, 43.896740 ], [ -69.117546, 43.898117 ], [ -69.120300, 43.873371 ], [ -69.134735, 43.860310 ] ] ], [ [ [ -67.518410, 44.554241 ], [ -67.533279, 44.564354 ], [ -67.541611, 44.578037 ], [ -67.541611, 44.589340 ], [ -67.538635, 44.590527 ], [ -67.532684, 44.588745 ], [ -67.525543, 44.585770 ], [ -67.520790, 44.587555 ], [ -67.518410, 44.595882 ], [ -67.514244, 44.597668 ], [ -67.493423, 44.588745 ], [ -67.481529, 44.580414 ], [ -67.482124, 44.577442 ], [ -67.486282, 44.575657 ], [ -67.499969, 44.578037 ], [ -67.511269, 44.582794 ], [ -67.517815, 44.579823 ], [ -67.519005, 44.575062 ], [ -67.514839, 44.570301 ], [ -67.497589, 44.564354 ], [ -67.489258, 44.561974 ], [ -67.488068, 44.559597 ], [ -67.499969, 44.554836 ], [ -67.518410, 44.554241 ] ] ], [ [ [ -67.789024, 44.472355 ], [ -67.804840, 44.484039 ], [ -67.830269, 44.515663 ], [ -67.836456, 44.530785 ], [ -67.830269, 44.539722 ], [ -67.792465, 44.493664 ], [ -67.780777, 44.477165 ], [ -67.789024, 44.472355 ] ] ], [ [ [ -67.535370, 44.472355 ], [ -67.551186, 44.480602 ], [ -67.551125, 44.492970 ], [ -67.554695, 44.500111 ], [ -67.563622, 44.507248 ], [ -67.560646, 44.513790 ], [ -67.552559, 44.515663 ], [ -67.523682, 44.512913 ], [ -67.516029, 44.506653 ], [ -67.510628, 44.496414 ], [ -67.535370, 44.472355 ] ] ], [ [ [ -69.319756, 43.854729 ], [ -69.322731, 43.860676 ], [ -69.318565, 43.879711 ], [ -69.313805, 43.881496 ], [ -69.307259, 43.877930 ], [ -69.306664, 43.867817 ], [ -69.310829, 43.859486 ], [ -69.319756, 43.854729 ] ] ], [ [ [ -70.046562, 43.781998 ], [ -70.048561, 43.790375 ], [ -70.046165, 43.796360 ], [ -70.029808, 43.811123 ], [ -70.027016, 43.809128 ], [ -70.040184, 43.784389 ], [ -70.046562, 43.781998 ] ] ], [ [ [ -70.102020, 43.776810 ], [ -70.113197, 43.781197 ], [ -70.096039, 43.788380 ], [ -70.089653, 43.785187 ], [ -70.102020, 43.776810 ] ] ], [ [ [ -70.061325, 43.742100 ], [ -70.060928, 43.760849 ], [ -70.056541, 43.772022 ], [ -70.043770, 43.763641 ], [ -70.046165, 43.757259 ], [ -70.061325, 43.742100 ] ] ], [ [ [ -70.079285, 43.706989 ], [ -70.088860, 43.714569 ], [ -70.084465, 43.719357 ], [ -70.072098, 43.718956 ], [ -70.071304, 43.713772 ], [ -70.079285, 43.706989 ] ] ], [ [ [ -70.096039, 43.672276 ], [ -70.101227, 43.675468 ], [ -70.092850, 43.687836 ], [ -70.087257, 43.691029 ], [ -70.088455, 43.681454 ], [ -70.096039, 43.672276 ] ] ], [ [ [ -70.228317, 43.538261 ], [ -70.245499, 43.539635 ], [ -70.235878, 43.547199 ], [ -70.224876, 43.547199 ], [ -70.228317, 43.538261 ] ] ], [ [ [ -70.607834, 42.977764 ], [ -70.618523, 42.985657 ], [ -70.617249, 42.992020 ], [ -70.605476, 43.005829 ], [ -70.599686, 43.006016 ], [ -70.597649, 43.003983 ], [ -70.608467, 42.994690 ], [ -70.607574, 42.990875 ], [ -70.601089, 42.984638 ], [ -70.601349, 42.981083 ], [ -70.607834, 42.977764 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US25", "STATE": "25", "NAME": "Massachusetts", "LSAD": "", "CENSUSAREA": 7800.058000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -70.832044, 41.606504 ], [ -70.823735, 41.598569 ], [ -70.820918, 41.587673 ], [ -70.821910, 41.582841 ], [ -70.830087, 41.585385 ], [ -70.838452, 41.596460 ], [ -70.832044, 41.606504 ] ] ], [ [ [ -70.596280, 41.471905 ], [ -70.574850, 41.468259 ], [ -70.567356, 41.471208 ], [ -70.563280, 41.469127 ], [ -70.553277, 41.452955 ], [ -70.552943, 41.443394 ], [ -70.555588, 41.430882 ], [ -70.553096, 41.423952 ], [ -70.547567, 41.415831 ], [ -70.538301, 41.409241 ], [ -70.528581, 41.405100 ], [ -70.517584, 41.403769 ], [ -70.506984, 41.400242 ], [ -70.502372, 41.392005 ], [ -70.501306, 41.385391 ], [ -70.498959, 41.384339 ], [ -70.490758, 41.383634 ], [ -70.484503, 41.386290 ], [ -70.472604, 41.399128 ], [ -70.473035, 41.408757 ], [ -70.470788, 41.412875 ], [ -70.463833, 41.419145 ], [ -70.450431, 41.420703 ], [ -70.446233, 41.396480 ], [ -70.449268, 41.380422 ], [ -70.448262, 41.353651 ], [ -70.451084, 41.348161 ], [ -70.496162, 41.346452 ], [ -70.538294, 41.348958 ], [ -70.599157, 41.349272 ], [ -70.709826, 41.341723 ], [ -70.733253, 41.336226 ], [ -70.747541, 41.329952 ], [ -70.764188, 41.318706 ], [ -70.768015, 41.311959 ], [ -70.766166, 41.308962 ], [ -70.768687, 41.303702 ], [ -70.775665, 41.300982 ], [ -70.802083, 41.314207 ], [ -70.819415, 41.327212 ], [ -70.838777, 41.347209 ], [ -70.833802, 41.353386 ], [ -70.812309, 41.355745 ], [ -70.800289, 41.353800 ], [ -70.783291, 41.347829 ], [ -70.774974, 41.349176 ], [ -70.768901, 41.353246 ], [ -70.729225, 41.397728 ], [ -70.724366, 41.398942 ], [ -70.712432, 41.408850 ], [ -70.711493, 41.415460 ], [ -70.701378, 41.430925 ], [ -70.686881, 41.441334 ], [ -70.649330, 41.461068 ], [ -70.603555, 41.482384 ], [ -70.598444, 41.481151 ], [ -70.596280, 41.471905 ] ] ], [ [ [ -70.092142, 41.297741 ], [ -70.082072, 41.299093 ], [ -70.062565, 41.308726 ], [ -70.046088, 41.321651 ], [ -70.031332, 41.339332 ], [ -70.028805, 41.359919 ], [ -70.030924, 41.367453 ], [ -70.035162, 41.372161 ], [ -70.038458, 41.376399 ], [ -70.045586, 41.383598 ], [ -70.049564, 41.387900 ], [ -70.049053, 41.391702 ], [ -70.033514, 41.385816 ], [ -70.018446, 41.368630 ], [ -69.960277, 41.278731 ], [ -69.960181, 41.264546 ], [ -69.964422, 41.254570 ], [ -69.965725, 41.252466 ], [ -69.975000, 41.247392 ], [ -70.001586, 41.239353 ], [ -70.015225, 41.237964 ], [ -70.052807, 41.242685 ], [ -70.083239, 41.244400 ], [ -70.096967, 41.240850 ], [ -70.118669, 41.242351 ], [ -70.170681, 41.255881 ], [ -70.237175, 41.282724 ], [ -70.256164, 41.288123 ], [ -70.266776, 41.294453 ], [ -70.273478, 41.301528 ], [ -70.275526, 41.310464 ], [ -70.260632, 41.310092 ], [ -70.249276, 41.305623 ], [ -70.244435, 41.303203 ], [ -70.240153, 41.295384 ], [ -70.229541, 41.290171 ], [ -70.208690, 41.290171 ], [ -70.196304, 41.294612 ], [ -70.124460, 41.293851 ], [ -70.092142, 41.297741 ] ] ], [ [ [ -73.264957, 42.745940 ], [ -73.022903, 42.741133 ], [ -72.809113, 42.736581 ], [ -72.458519, 42.726853 ], [ -72.285954, 42.721631 ], [ -72.124526, 42.717636 ], [ -71.981402, 42.713294 ], [ -71.928811, 42.712234 ], [ -71.745817, 42.707287 ], [ -71.636214, 42.704888 ], [ -71.631814, 42.704788 ], [ -71.351874, 42.698154 ], [ -71.330206, 42.697190 ], [ -71.294205, 42.696990 ], [ -71.278929, 42.711258 ], [ -71.267905, 42.725890 ], [ -71.255605, 42.736389 ], [ -71.245504, 42.742589 ], [ -71.233404, 42.745489 ], [ -71.223904, 42.746689 ], [ -71.208302, 42.743314 ], [ -71.208227, 42.743294 ], [ -71.208137, 42.743273 ], [ -71.181803, 42.737590 ], [ -71.186104, 42.790689 ], [ -71.174403, 42.801589 ], [ -71.167703, 42.807389 ], [ -71.165603, 42.808689 ], [ -71.149703, 42.815489 ], [ -71.132503, 42.821389 ], [ -71.064201, 42.806289 ], [ -71.053601, 42.833089 ], [ -71.047501, 42.844089 ], [ -71.044401, 42.848789 ], [ -71.031201, 42.859089 ], [ -70.966500, 42.868989 ], [ -70.949199, 42.876089 ], [ -70.931699, 42.884189 ], [ -70.930799, 42.884589 ], [ -70.927629, 42.885326 ], [ -70.914899, 42.886589 ], [ -70.914886, 42.886564 ], [ -70.902768, 42.886530 ], [ -70.886136, 42.882610 ], [ -70.848625, 42.860939 ], [ -70.837376, 42.864996 ], [ -70.830795, 42.868918 ], [ -70.821769, 42.871880 ], [ -70.817296, 42.872290 ], [ -70.817731, 42.850613 ], [ -70.805220, 42.781798 ], [ -70.792867, 42.747118 ], [ -70.772267, 42.711064 ], [ -70.770453, 42.704824 ], [ -70.778552, 42.698520 ], [ -70.778671, 42.693622 ], [ -70.764421, 42.685650 ], [ -70.748752, 42.683878 ], [ -70.744427, 42.682092 ], [ -70.729820, 42.669602 ], [ -70.728845, 42.663877 ], [ -70.689402, 42.653319 ], [ -70.682594, 42.654525 ], [ -70.681594, 42.662342 ], [ -70.663548, 42.677603 ], [ -70.645101, 42.689423 ], [ -70.630077, 42.692699 ], [ -70.620031, 42.688006 ], [ -70.622864, 42.675990 ], [ -70.623815, 42.665481 ], [ -70.622791, 42.660873 ], [ -70.614820, 42.657650 ], [ -70.595474, 42.660336 ], [ -70.591742, 42.648508 ], [ -70.591469, 42.639821 ], [ -70.594014, 42.635030 ], [ -70.605611, 42.634898 ], [ -70.618420, 42.628640 ], [ -70.635635, 42.600243 ], [ -70.654727, 42.582234 ], [ -70.664887, 42.580436 ], [ -70.668022, 42.581732 ], [ -70.668115, 42.585361 ], [ -70.668488, 42.589643 ], [ -70.670442, 42.592249 ], [ -70.672583, 42.594296 ], [ -70.675747, 42.594669 ], [ -70.678819, 42.594389 ], [ -70.681428, 42.593173 ], [ -70.684502, 42.588858 ], [ -70.698574, 42.577393 ], [ -70.729688, 42.571510 ], [ -70.737044, 42.576863 ], [ -70.757283, 42.570455 ], [ -70.804091, 42.561595 ], [ -70.815391, 42.554195 ], [ -70.823291, 42.551495 ], [ -70.848492, 42.550195 ], [ -70.871382, 42.546404 ], [ -70.872357, 42.542952 ], [ -70.866279, 42.522617 ], [ -70.859751, 42.520441 ], [ -70.857125, 42.521492 ], [ -70.842091, 42.519495 ], [ -70.831091, 42.503596 ], [ -70.835991, 42.490496 ], [ -70.841591, 42.487596 ], [ -70.847391, 42.491496 ], [ -70.857791, 42.490296 ], [ -70.879692, 42.478796 ], [ -70.886493, 42.470197 ], [ -70.887992, 42.467096 ], [ -70.887292, 42.464896 ], [ -70.894292, 42.460896 ], [ -70.908092, 42.466896 ], [ -70.917693, 42.467996 ], [ -70.921993, 42.466696 ], [ -70.934993, 42.457896 ], [ -70.934264, 42.444646 ], [ -70.933155, 42.437833 ], [ -70.928226, 42.430986 ], [ -70.913192, 42.427697 ], [ -70.908392, 42.425197 ], [ -70.901992, 42.420297 ], [ -70.905692, 42.416197 ], [ -70.936393, 42.418097 ], [ -70.943295, 42.436248 ], [ -70.943612, 42.452092 ], [ -70.947020, 42.456236 ], [ -70.960470, 42.446166 ], [ -70.960835, 42.441272 ], [ -70.982994, 42.423996 ], [ -70.987694, 42.416696 ], [ -70.990595, 42.407098 ], [ -70.989195, 42.402598 ], [ -70.985068, 42.402041 ], [ -70.983426, 42.396246 ], [ -70.980336, 42.391513 ], [ -70.972706, 42.389968 ], [ -70.970195, 42.388036 ], [ -70.971740, 42.387071 ], [ -70.972513, 42.385042 ], [ -70.972706, 42.381759 ], [ -70.972223, 42.377316 ], [ -70.953292, 42.349698 ], [ -70.953022, 42.343973 ], [ -70.963578, 42.346860 ], [ -70.974897, 42.355843 ], [ -70.979927, 42.356382 ], [ -70.998253, 42.352788 ], [ -71.006877, 42.347039 ], [ -71.015680, 42.326019 ], [ -71.013165, 42.315419 ], [ -71.000948, 42.302483 ], [ -71.006158, 42.288110 ], [ -71.004900, 42.282720 ], [ -70.996097, 42.271222 ], [ -70.989090, 42.267449 ], [ -70.967351, 42.268168 ], [ -70.956219, 42.270794 ], [ -70.956239, 42.278728 ], [ -70.953833, 42.280791 ], [ -70.948971, 42.272505 ], [ -70.945547, 42.269081 ], [ -70.935886, 42.264189 ], [ -70.924830, 42.263339 ], [ -70.926336, 42.269792 ], [ -70.917056, 42.272542 ], [ -70.912932, 42.269792 ], [ -70.906301, 42.271637 ], [ -70.896267, 42.285100 ], [ -70.895778, 42.292436 ], [ -70.897123, 42.295860 ], [ -70.915588, 42.302463 ], [ -70.917490, 42.305686 ], [ -70.907556, 42.307889 ], [ -70.882764, 42.308860 ], [ -70.881242, 42.300663 ], [ -70.870873, 42.285668 ], [ -70.861807, 42.275965 ], [ -70.851093, 42.268270 ], [ -70.831075, 42.267424 ], [ -70.811742, 42.262935 ], [ -70.788724, 42.253920 ], [ -70.770964, 42.249197 ], [ -70.764757, 42.244062 ], [ -70.754488, 42.228673 ], [ -70.747230, 42.221816 ], [ -70.730560, 42.210940 ], [ -70.722269, 42.207959 ], [ -70.718707, 42.184853 ], [ -70.714301, 42.168783 ], [ -70.706264, 42.163137 ], [ -70.685315, 42.133025 ], [ -70.663931, 42.108336 ], [ -70.640169, 42.088633 ], [ -70.638480, 42.081579 ], [ -70.647349, 42.076331 ], [ -70.648190, 42.068441 ], [ -70.643208, 42.050821 ], [ -70.597892, 42.004550 ], [ -70.602704, 42.002144 ], [ -70.614046, 42.006612 ], [ -70.631919, 41.992864 ], [ -70.639137, 41.993895 ], [ -70.641199, 42.005925 ], [ -70.636387, 42.013830 ], [ -70.629857, 42.001456 ], [ -70.610953, 42.011080 ], [ -70.644337, 42.045895 ], [ -70.650874, 42.046247 ], [ -70.669360, 42.037116 ], [ -70.671666, 42.021390 ], [ -70.667512, 42.012320 ], [ -70.670934, 42.007786 ], [ -70.678798, 42.005510 ], [ -70.686798, 42.012764 ], [ -70.695809, 42.013346 ], [ -70.712204, 42.007586 ], [ -70.710034, 41.999544 ], [ -70.698981, 41.987103 ], [ -70.662476, 41.960592 ], [ -70.651673, 41.958701 ], [ -70.648365, 41.961672 ], [ -70.631251, 41.950475 ], [ -70.623513, 41.943273 ], [ -70.616491, 41.940204 ], [ -70.608166, 41.940701 ], [ -70.598078, 41.947772 ], [ -70.583572, 41.950007 ], [ -70.552941, 41.929641 ], [ -70.546386, 41.916751 ], [ -70.547410, 41.911934 ], [ -70.545949, 41.907158 ], [ -70.532084, 41.889568 ], [ -70.525567, 41.858730 ], [ -70.535487, 41.839381 ], [ -70.542065, 41.831263 ], [ -70.543168, 41.824446 ], [ -70.541030, 41.815754 ], [ -70.532656, 41.804796 ], [ -70.517411, 41.790953 ], [ -70.494048, 41.773883 ], [ -70.471552, 41.761563 ], [ -70.412476, 41.744397 ], [ -70.375341, 41.738779 ], [ -70.290957, 41.734312 ], [ -70.275203, 41.726143 ], [ -70.272289, 41.721346 ], [ -70.263654, 41.714115 ], [ -70.259205, 41.713954 ], [ -70.234850, 41.733733 ], [ -70.216073, 41.742981 ], [ -70.189254, 41.751982 ], [ -70.182076, 41.750885 ], [ -70.141533, 41.760072 ], [ -70.121978, 41.758841 ], [ -70.096061, 41.766549 ], [ -70.064314, 41.772845 ], [ -70.024734, 41.787364 ], [ -70.008462, 41.800786 ], [ -70.003842, 41.808520 ], [ -70.004486, 41.838826 ], [ -70.009013, 41.876625 ], [ -70.000188, 41.886938 ], [ -70.002922, 41.890315 ], [ -70.012154, 41.891656 ], [ -70.024335, 41.898820 ], [ -70.025553, 41.911699 ], [ -70.030537, 41.929154 ], [ -70.044995, 41.930049 ], [ -70.054464, 41.927366 ], [ -70.065671, 41.911658 ], [ -70.065723, 41.899641 ], [ -70.065372, 41.887702 ], [ -70.064084, 41.878924 ], [ -70.066002, 41.877011 ], [ -70.067566, 41.877793 ], [ -70.070889, 41.882973 ], [ -70.073039, 41.899783 ], [ -70.074006, 41.938650 ], [ -70.077421, 41.985497 ], [ -70.083775, 42.012041 ], [ -70.089578, 42.024896 ], [ -70.095595, 42.032832 ], [ -70.108060, 42.043601 ], [ -70.123043, 42.051668 ], [ -70.148294, 42.061950 ], [ -70.155415, 42.062409 ], [ -70.169781, 42.059736 ], [ -70.178468, 42.056420 ], [ -70.186816, 42.050450 ], [ -70.194456, 42.039470 ], [ -70.195345, 42.034163 ], [ -70.193074, 42.027576 ], [ -70.189461, 42.024236 ], [ -70.173758, 42.027357 ], [ -70.166884, 42.034575 ], [ -70.171008, 42.028045 ], [ -70.179601, 42.021858 ], [ -70.186708, 42.019904 ], [ -70.190834, 42.020028 ], [ -70.196693, 42.022429 ], [ -70.208016, 42.030730 ], [ -70.218701, 42.045848 ], [ -70.233256, 42.057714 ], [ -70.238875, 42.060479 ], [ -70.243540, 42.060569 ], [ -70.245385, 42.063733 ], [ -70.238087, 42.072878 ], [ -70.225626, 42.078601 ], [ -70.206899, 42.081900 ], [ -70.189305, 42.082337 ], [ -70.160166, 42.078628 ], [ -70.115968, 42.067638 ], [ -70.082624, 42.054657 ], [ -70.058531, 42.040363 ], [ -70.033501, 42.017736 ], [ -70.011898, 41.989720 ], [ -69.986085, 41.949597 ], [ -69.968598, 41.911700 ], [ -69.945314, 41.845222 ], [ -69.935952, 41.809422 ], [ -69.928652, 41.741250 ], [ -69.928261, 41.691700 ], [ -69.933114, 41.670014 ], [ -69.947599, 41.645394 ], [ -69.951169, 41.640799 ], [ -69.957775, 41.620364 ], [ -69.976478, 41.603664 ], [ -69.982768, 41.581812 ], [ -69.988215, 41.554704 ], [ -69.998071, 41.543650 ], [ -70.004136, 41.542120 ], [ -70.011504, 41.542924 ], [ -70.014456, 41.545534 ], [ -70.016584, 41.550772 ], [ -70.015059, 41.553037 ], [ -70.010644, 41.552692 ], [ -70.001530, 41.561953 ], [ -69.994357, 41.576846 ], [ -69.987192, 41.608579 ], [ -69.973035, 41.641046 ], [ -69.973153, 41.646963 ], [ -69.975719, 41.653738 ], [ -69.996359, 41.667184 ], [ -70.007011, 41.671579 ], [ -70.014211, 41.671971 ], [ -70.029346, 41.667744 ], [ -70.055523, 41.664843 ], [ -70.089238, 41.662813 ], [ -70.140877, 41.650423 ], [ -70.158621, 41.650438 ], [ -70.191061, 41.645259 ], [ -70.245867, 41.628479 ], [ -70.256210, 41.620698 ], [ -70.255420, 41.617541 ], [ -70.259601, 41.610863 ], [ -70.265424, 41.609333 ], [ -70.267587, 41.610912 ], [ -70.269687, 41.617775 ], [ -70.269130, 41.625742 ], [ -70.274522, 41.632927 ], [ -70.281320, 41.635125 ], [ -70.290620, 41.635196 ], [ -70.321588, 41.630508 ], [ -70.329924, 41.634578 ], [ -70.338067, 41.636338 ], [ -70.351634, 41.634687 ], [ -70.360352, 41.631069 ], [ -70.364892, 41.626721 ], [ -70.364744, 41.623671 ], [ -70.369854, 41.615888 ], [ -70.379151, 41.611361 ], [ -70.400581, 41.606382 ], [ -70.408535, 41.607345 ], [ -70.437246, 41.605329 ], [ -70.445289, 41.591815 ], [ -70.461278, 41.571820 ], [ -70.476256, 41.558502 ], [ -70.485571, 41.554244 ], [ -70.493244, 41.552044 ], [ -70.522327, 41.548965 ], [ -70.559689, 41.548330 ], [ -70.611081, 41.542989 ], [ -70.633607, 41.538254 ], [ -70.643627, 41.532357 ], [ -70.654104, 41.519025 ], [ -70.663856, 41.514031 ], [ -70.675379, 41.512623 ], [ -70.705181, 41.496677 ], [ -70.734306, 41.486335 ], [ -70.757171, 41.469917 ], [ -70.756481, 41.465977 ], [ -70.760863, 41.460947 ], [ -70.790270, 41.446339 ], [ -70.817478, 41.445562 ], [ -70.835867, 41.441877 ], [ -70.857528, 41.425767 ], [ -70.866946, 41.422378 ], [ -70.902763, 41.421061 ], [ -70.928197, 41.415781 ], [ -70.937282, 41.411618 ], [ -70.948431, 41.409193 ], [ -70.951045, 41.411777 ], [ -70.949861, 41.415323 ], [ -70.928165, 41.431265 ], [ -70.923698, 41.430716 ], [ -70.918983, 41.425300 ], [ -70.911640, 41.424484 ], [ -70.906011, 41.425708 ], [ -70.883247, 41.432239 ], [ -70.855265, 41.448892 ], [ -70.828546, 41.456448 ], [ -70.802186, 41.460864 ], [ -70.787769, 41.474609 ], [ -70.775268, 41.477465 ], [ -70.753905, 41.492256 ], [ -70.745053, 41.500966 ], [ -70.658659, 41.543385 ], [ -70.654302, 41.549926 ], [ -70.655365, 41.557498 ], [ -70.653899, 41.565160 ], [ -70.648780, 41.569870 ], [ -70.642748, 41.572385 ], [ -70.640948, 41.577325 ], [ -70.642040, 41.583066 ], [ -70.652449, 41.605210 ], [ -70.651986, 41.610184 ], [ -70.640003, 41.624616 ], [ -70.645251, 41.633547 ], [ -70.652614, 41.637829 ], [ -70.650419, 41.644202 ], [ -70.638695, 41.649427 ], [ -70.637632, 41.654573 ], [ -70.639003, 41.658345 ], [ -70.651956, 41.663044 ], [ -70.653754, 41.667090 ], [ -70.644339, 41.673020 ], [ -70.646308, 41.678433 ], [ -70.649285, 41.680943 ], [ -70.661475, 41.681756 ], [ -70.645962, 41.693794 ], [ -70.625440, 41.698691 ], [ -70.623652, 41.707398 ], [ -70.626529, 41.712995 ], [ -70.644641, 41.718980 ], [ -70.651093, 41.715715 ], [ -70.656596, 41.715401 ], [ -70.670453, 41.721912 ], [ -70.708193, 41.730959 ], [ -70.718739, 41.735740 ], [ -70.726331, 41.732731 ], [ -70.728933, 41.723433 ], [ -70.721302, 41.712968 ], [ -70.717451, 41.693980 ], [ -70.719575, 41.685002 ], [ -70.729395, 41.688140 ], [ -70.744396, 41.696967 ], [ -70.755347, 41.694326 ], [ -70.761481, 41.676808 ], [ -70.762360, 41.667735 ], [ -70.758198, 41.661225 ], [ -70.757622, 41.654265 ], [ -70.765463, 41.641575 ], [ -70.769318, 41.641145 ], [ -70.773654, 41.645033 ], [ -70.775798, 41.649145 ], [ -70.776709, 41.650756 ], [ -70.809118, 41.656437 ], [ -70.813286, 41.655670 ], [ -70.815729, 41.652796 ], [ -70.816351, 41.645995 ], [ -70.804664, 41.641157 ], [ -70.800215, 41.631753 ], [ -70.801063, 41.629513 ], [ -70.810279, 41.624873 ], [ -70.835296, 41.624532 ], [ -70.844165, 41.628983 ], [ -70.852518, 41.626919 ], [ -70.855162, 41.624145 ], [ -70.850181, 41.593529 ], [ -70.853121, 41.587321 ], [ -70.857239, 41.587705 ], [ -70.868904, 41.614664 ], [ -70.868360, 41.622664 ], [ -70.869624, 41.625608 ], [ -70.872665, 41.627816 ], [ -70.889209, 41.632904 ], [ -70.913202, 41.619266 ], [ -70.904522, 41.610361 ], [ -70.899981, 41.593504 ], [ -70.901381, 41.592504 ], [ -70.910814, 41.595506 ], [ -70.916581, 41.607483 ], [ -70.920074, 41.610810 ], [ -70.927172, 41.611253 ], [ -70.929722, 41.609479 ], [ -70.930000, 41.600441 ], [ -70.927393, 41.594064 ], [ -70.931338, 41.584200 ], [ -70.937978, 41.577416 ], [ -70.941588, 41.581034 ], [ -70.946911, 41.581089 ], [ -70.948797, 41.579038 ], [ -70.947300, 41.573659 ], [ -70.937830, 41.565239 ], [ -70.931545, 41.540169 ], [ -70.941785, 41.540121 ], [ -70.953299, 41.515010 ], [ -70.982654, 41.510077 ], [ -71.003275, 41.511912 ], [ -71.019354, 41.508857 ], [ -71.035514, 41.499047 ], [ -71.058418, 41.505967 ], [ -71.085663, 41.509292 ], [ -71.120570, 41.497448 ], [ -71.122400, 41.522156 ], [ -71.131312, 41.592308 ], [ -71.131618, 41.593918 ], [ -71.137492, 41.602561 ], [ -71.140588, 41.605102 ], [ -71.140910, 41.607405 ], [ -71.141509, 41.616076 ], [ -71.140468, 41.623893 ], [ -71.135688, 41.628402 ], [ -71.134484, 41.641198 ], [ -71.134478, 41.641262 ], [ -71.132670, 41.658744 ], [ -71.132888, 41.660102 ], [ -71.134688, 41.660502 ], [ -71.135188, 41.660502 ], [ -71.145870, 41.662795 ], [ -71.153989, 41.664102 ], [ -71.176090, 41.668102 ], [ -71.176090, 41.668502 ], [ -71.175990, 41.671402 ], [ -71.181290, 41.672502 ], [ -71.191175, 41.674292 ], [ -71.191178, 41.674216 ], [ -71.194390, 41.674802 ], [ -71.195640, 41.675090 ], [ -71.195690, 41.675102 ], [ -71.208371, 41.690598 ], [ -71.224798, 41.710498 ], [ -71.225791, 41.711701 ], [ -71.261392, 41.752301 ], [ -71.317795, 41.776101 ], [ -71.327896, 41.780501 ], [ -71.329396, 41.782600 ], [ -71.329296, 41.786800 ], [ -71.332196, 41.792300 ], [ -71.333896, 41.794500 ], [ -71.335797, 41.794800 ], [ -71.339297, 41.796300 ], [ -71.340697, 41.798300 ], [ -71.340797, 41.800200 ], [ -71.339297, 41.804400 ], [ -71.339297, 41.806500 ], [ -71.338897, 41.808300 ], [ -71.339197, 41.809000 ], [ -71.347197, 41.823100 ], [ -71.344897, 41.828000 ], [ -71.339597, 41.832000 ], [ -71.337597, 41.833700 ], [ -71.335197, 41.835500 ], [ -71.341797, 41.843700 ], [ -71.342198, 41.844800 ], [ -71.333997, 41.862300 ], [ -71.340798, 41.881600 ], [ -71.339298, 41.893399 ], [ -71.339298, 41.893599 ], [ -71.338698, 41.898399 ], [ -71.352699, 41.896699 ], [ -71.354699, 41.896499 ], [ -71.362499, 41.895599 ], [ -71.364699, 41.895399 ], [ -71.365399, 41.895299 ], [ -71.370999, 41.894599 ], [ -71.373799, 41.894399 ], [ -71.376600, 41.893999 ], [ -71.381700, 41.893199 ], [ -71.381700, 41.922699 ], [ -71.381600, 41.922899 ], [ -71.381401, 41.964799 ], [ -71.381501, 41.966699 ], [ -71.381401, 42.018798 ], [ -71.499905, 42.017198 ], [ -71.500905, 42.017098 ], [ -71.527306, 42.015098 ], [ -71.527606, 42.014998 ], [ -71.559439, 42.014342 ], [ -71.576908, 42.014098 ], [ -71.766010, 42.009745 ], [ -71.799242, 42.008065 ], [ -71.800650, 42.023569 ], [ -71.890780, 42.024368 ], [ -71.987326, 42.026880 ], [ -72.063496, 42.027347 ], [ -72.135687, 42.030245 ], [ -72.249523, 42.031626 ], [ -72.317148, 42.031907 ], [ -72.456680, 42.033999 ], [ -72.528131, 42.034295 ], [ -72.573231, 42.030141 ], [ -72.582332, 42.024695 ], [ -72.590233, 42.024695 ], [ -72.606933, 42.024995 ], [ -72.607933, 42.030795 ], [ -72.643134, 42.032395 ], [ -72.695927, 42.036788 ], [ -72.755838, 42.036195 ], [ -72.757538, 42.033295 ], [ -72.753538, 42.032095 ], [ -72.751738, 42.030195 ], [ -72.754038, 42.025395 ], [ -72.757467, 42.020947 ], [ -72.758151, 42.020865 ], [ -72.760558, 42.021846 ], [ -72.762151, 42.021527 ], [ -72.762310, 42.019775 ], [ -72.761354, 42.018183 ], [ -72.759738, 42.016995 ], [ -72.761238, 42.014595 ], [ -72.763238, 42.012795 ], [ -72.763265, 42.009742 ], [ -72.766139, 42.007695 ], [ -72.766739, 42.002995 ], [ -72.816741, 41.997595 ], [ -72.813541, 42.036494 ], [ -72.847142, 42.036894 ], [ -72.863619, 42.037709 ], [ -72.863733, 42.037710 ], [ -72.999549, 42.038653 ], [ -73.053254, 42.039861 ], [ -73.229798, 42.044877 ], [ -73.231056, 42.044945 ], [ -73.293097, 42.046940 ], [ -73.294420, 42.046984 ], [ -73.432812, 42.050587 ], [ -73.487314, 42.049638 ], [ -73.496879, 42.049675 ], [ -73.508142, 42.086257 ], [ -73.352527, 42.510002 ], [ -73.264957, 42.745940 ] ] ], [ [ [ -70.890594, 42.326504 ], [ -70.898155, 42.330284 ], [ -70.898155, 42.340252 ], [ -70.895477, 42.343422 ], [ -70.894028, 42.339565 ], [ -70.873749, 42.343346 ], [ -70.878220, 42.330627 ], [ -70.890594, 42.326504 ] ] ], [ [ [ -70.925308, 42.317223 ], [ -70.928055, 42.317223 ], [ -70.942490, 42.326847 ], [ -70.930458, 42.334751 ], [ -70.923584, 42.326160 ], [ -70.925308, 42.317223 ] ] ], [ [ [ -70.955460, 42.309875 ], [ -70.977219, 42.310249 ], [ -70.977402, 42.312294 ], [ -70.967545, 42.322895 ], [ -70.957268, 42.331661 ], [ -70.952805, 42.330627 ], [ -70.949364, 42.312756 ], [ -70.955460, 42.309875 ] ] ], [ [ [ -70.937332, 42.284916 ], [ -70.949020, 42.285946 ], [ -70.951080, 42.289726 ], [ -70.935272, 42.302101 ], [ -70.928185, 42.302814 ], [ -70.927979, 42.297405 ], [ -70.937332, 42.284916 ] ] ], [ [ [ -70.290428, 41.331959 ], [ -70.305893, 41.332302 ], [ -70.309669, 41.335396 ], [ -70.308296, 41.338833 ], [ -70.289047, 41.336773 ], [ -70.290428, 41.331959 ] ] ], [ [ [ -70.811417, 41.249870 ], [ -70.825508, 41.252277 ], [ -70.832039, 41.259495 ], [ -70.812454, 41.263962 ], [ -70.802139, 41.258121 ], [ -70.803856, 41.250557 ], [ -70.811417, 41.249870 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US26", "STATE": "26", "NAME": "Michigan", "LSAD": "", "CENSUSAREA": 56538.901000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -88.684434, 48.115785 ], [ -88.675628, 48.120444 ], [ -88.676395, 48.124876 ], [ -88.674192, 48.127165 ], [ -88.656915, 48.139225 ], [ -88.614026, 48.154797 ], [ -88.578413, 48.162370 ], [ -88.547033, 48.174891 ], [ -88.524753, 48.165291 ], [ -88.501088, 48.168181 ], [ -88.491961, 48.175466 ], [ -88.482039, 48.179915 ], [ -88.459735, 48.183807 ], [ -88.447236, 48.182916 ], [ -88.422601, 48.190975 ], [ -88.418244, 48.180370 ], [ -88.419875, 48.170731 ], [ -88.427373, 48.166764 ], [ -88.449502, 48.163312 ], [ -88.459697, 48.158551 ], [ -88.469573, 48.152879 ], [ -88.485700, 48.137683 ], [ -88.511902, 48.121699 ], [ -88.566938, 48.093719 ], [ -88.578053, 48.084373 ], [ -88.578395, 48.078003 ], [ -88.575869, 48.075166 ], [ -88.573924, 48.068861 ], [ -88.575048, 48.064154 ], [ -88.579784, 48.058669 ], [ -88.670073, 48.011446 ], [ -88.718555, 47.995134 ], [ -88.772357, 47.981126 ], [ -88.791959, 47.978938 ], [ -88.832063, 47.965213 ], [ -88.852923, 47.965322 ], [ -88.899184, 47.953300 ], [ -88.918029, 47.945605 ], [ -88.923573, 47.937976 ], [ -88.962664, 47.923512 ], [ -88.968903, 47.909474 ], [ -88.968903, 47.901675 ], [ -88.957985, 47.895436 ], [ -88.942387, 47.895436 ], [ -88.899698, 47.902445 ], [ -88.898986, 47.900685 ], [ -88.911665, 47.891344 ], [ -88.998939, 47.867490 ], [ -89.022736, 47.858532 ], [ -89.044463, 47.855750 ], [ -89.056412, 47.852598 ], [ -89.107991, 47.835705 ], [ -89.124134, 47.828616 ], [ -89.157738, 47.824015 ], [ -89.190170, 47.831603 ], [ -89.192681, 47.833430 ], [ -89.192207, 47.841060 ], [ -89.201812, 47.850243 ], [ -89.234533, 47.851718 ], [ -89.235552, 47.853774 ], [ -89.234535, 47.855373 ], [ -89.228507, 47.858039 ], [ -89.246774, 47.871016 ], [ -89.250936, 47.870377 ], [ -89.255202, 47.876102 ], [ -89.247127, 47.888503 ], [ -89.226327, 47.895438 ], [ -89.220710, 47.900850 ], [ -89.221332, 47.908069 ], [ -89.214499, 47.913895 ], [ -89.179154, 47.935030 ], [ -89.095207, 47.967922 ], [ -89.018303, 47.992525 ], [ -88.994163, 48.002290 ], [ -88.940886, 48.019590 ], [ -88.931487, 48.021637 ], [ -88.927529, 48.019615 ], [ -88.915032, 48.020681 ], [ -88.895069, 48.029059 ], [ -88.896327, 48.031801 ], [ -88.893701, 48.034770 ], [ -88.835714, 48.056752 ], [ -88.816084, 48.057006 ], [ -88.810461, 48.055247 ], [ -88.787556, 48.063035 ], [ -88.772077, 48.070502 ], [ -88.771830, 48.079457 ], [ -88.764256, 48.085189 ], [ -88.744458, 48.092769 ], [ -88.728198, 48.101914 ], [ -88.705586, 48.111013 ], [ -88.695353, 48.110549 ], [ -88.684434, 48.115785 ] ] ], [ [ [ -85.566441, 45.760222 ], [ -85.549560, 45.757266 ], [ -85.543750, 45.751413 ], [ -85.535620, 45.750394 ], [ -85.525237, 45.750462 ], [ -85.506133, 45.754715 ], [ -85.501267, 45.754415 ], [ -85.497656, 45.746246 ], [ -85.503758, 45.742771 ], [ -85.508818, 45.742358 ], [ -85.510091, 45.742888 ], [ -85.508522, 45.744991 ], [ -85.509040, 45.748488 ], [ -85.515145, 45.749451 ], [ -85.520569, 45.744745 ], [ -85.521911, 45.739419 ], [ -85.520803, 45.737247 ], [ -85.510895, 45.734414 ], [ -85.498777, 45.726291 ], [ -85.494154, 45.705378 ], [ -85.494016, 45.698476 ], [ -85.502800, 45.690998 ], [ -85.506104, 45.681148 ], [ -85.503767, 45.670472 ], [ -85.500451, 45.664298 ], [ -85.490252, 45.652122 ], [ -85.487026, 45.621211 ], [ -85.491347, 45.609665 ], [ -85.509276, 45.596475 ], [ -85.518038, 45.592912 ], [ -85.526895, 45.591590 ], [ -85.530273, 45.589253 ], [ -85.534064, 45.578198 ], [ -85.541129, 45.575045 ], [ -85.561634, 45.572213 ], [ -85.618049, 45.582647 ], [ -85.622741, 45.586028 ], [ -85.630016, 45.598166 ], [ -85.619850, 45.624547 ], [ -85.608653, 45.632008 ], [ -85.604521, 45.639256 ], [ -85.604951, 45.647599 ], [ -85.609295, 45.658067 ], [ -85.604881, 45.681932 ], [ -85.600842, 45.688860 ], [ -85.590769, 45.698051 ], [ -85.583724, 45.700796 ], [ -85.572309, 45.711449 ], [ -85.565132, 45.730719 ], [ -85.564774, 45.745462 ], [ -85.567128, 45.750419 ], [ -85.567781, 45.757655 ], [ -85.566441, 45.760222 ] ] ], [ [ [ -87.590208, 45.095264 ], [ -87.591880, 45.094689 ], [ -87.614897, 45.100064 ], [ -87.621609, 45.102399 ], [ -87.627640, 45.103328 ], [ -87.628829, 45.104039 ], [ -87.629571, 45.105324 ], [ -87.631535, 45.106224 ], [ -87.636110, 45.105918 ], [ -87.648191, 45.106368 ], [ -87.652512, 45.108633 ], [ -87.657135, 45.107568 ], [ -87.659952, 45.107512 ], [ -87.661211, 45.108279 ], [ -87.661296, 45.112566 ], [ -87.667102, 45.118109 ], [ -87.671000, 45.120069 ], [ -87.672447, 45.121294 ], [ -87.678209, 45.130084 ], [ -87.678511, 45.131204 ], [ -87.676024, 45.134089 ], [ -87.675816, 45.135059 ], [ -87.683902, 45.144135 ], [ -87.688425, 45.147433 ], [ -87.692375, 45.149505 ], [ -87.695055, 45.150522 ], [ -87.700618, 45.151188 ], [ -87.703492, 45.152206 ], [ -87.707391, 45.154679 ], [ -87.708134, 45.156004 ], [ -87.711322, 45.158946 ], [ -87.717945, 45.161156 ], [ -87.723121, 45.165141 ], [ -87.724601, 45.167452 ], [ -87.727768, 45.169596 ], [ -87.730866, 45.170913 ], [ -87.735135, 45.171538 ], [ -87.736104, 45.172244 ], [ -87.736509, 45.173389 ], [ -87.735210, 45.177642 ], [ -87.741805, 45.197051 ], [ -87.741732, 45.198201 ], [ -87.739492, 45.202126 ], [ -87.736339, 45.204653 ], [ -87.727960, 45.207956 ], [ -87.726198, 45.209391 ], [ -87.726175, 45.212640 ], [ -87.727276, 45.216129 ], [ -87.726952, 45.218949 ], [ -87.722473, 45.223309 ], [ -87.721354, 45.226847 ], [ -87.721935, 45.228444 ], [ -87.724920, 45.229977 ], [ -87.725205, 45.231539 ], [ -87.724156, 45.233236 ], [ -87.718264, 45.238333 ], [ -87.717051, 45.238743 ], [ -87.713398, 45.238564 ], [ -87.712184, 45.239014 ], [ -87.711339, 45.239965 ], [ -87.711480, 45.245224 ], [ -87.709145, 45.254649 ], [ -87.707779, 45.258343 ], [ -87.709137, 45.260341 ], [ -87.703053, 45.267041 ], [ -87.698780, 45.269420 ], [ -87.698456, 45.272072 ], [ -87.699492, 45.276659 ], [ -87.698248, 45.281512 ], [ -87.693468, 45.287675 ], [ -87.690364, 45.290270 ], [ -87.687578, 45.296283 ], [ -87.687498, 45.298055 ], [ -87.679085, 45.305841 ], [ -87.675328, 45.307907 ], [ -87.667423, 45.316360 ], [ -87.665243, 45.317115 ], [ -87.663666, 45.318257 ], [ -87.661500, 45.321386 ], [ -87.662029, 45.326434 ], [ -87.661603, 45.327608 ], [ -87.659830, 45.329144 ], [ -87.655775, 45.330847 ], [ -87.648126, 45.339396 ], [ -87.647454, 45.345232 ], [ -87.647729, 45.350721 ], [ -87.648476, 45.352243 ], [ -87.650661, 45.353798 ], [ -87.653568, 45.354204 ], [ -87.656632, 45.358617 ], [ -87.655807, 45.362706 ], [ -87.656624, 45.367295 ], [ -87.657349, 45.368752 ], [ -87.673513, 45.376946 ], [ -87.674403, 45.378065 ], [ -87.674550, 45.381649 ], [ -87.675017, 45.382454 ], [ -87.682866, 45.384950 ], [ -87.685934, 45.388711 ], [ -87.690281, 45.389822 ], [ -87.693956, 45.389893 ], [ -87.699797, 45.387927 ], [ -87.704337, 45.385462 ], [ -87.706767, 45.383827 ], [ -87.708329, 45.381218 ], [ -87.718891, 45.377462 ], [ -87.733409, 45.364432 ], [ -87.737801, 45.359635 ], [ -87.738352, 45.358243 ], [ -87.750928, 45.355037 ], [ -87.751626, 45.354169 ], [ -87.751452, 45.351755 ], [ -87.754104, 45.349442 ], [ -87.762128, 45.348401 ], [ -87.769172, 45.351195 ], [ -87.771384, 45.351210 ], [ -87.773901, 45.351226 ], [ -87.783076, 45.349725 ], [ -87.787967, 45.352612 ], [ -87.790324, 45.353444 ], [ -87.800464, 45.353608 ], [ -87.810076, 45.351269 ], [ -87.823028, 45.352650 ], [ -87.823554, 45.351637 ], [ -87.824855, 45.350713 ], [ -87.826918, 45.350538 ], [ -87.829775, 45.352005 ], [ -87.832612, 45.352249 ], [ -87.835303, 45.350980 ], [ -87.836782, 45.346451 ], [ -87.838141, 45.345101 ], [ -87.848368, 45.340676 ], [ -87.850133, 45.340435 ], [ -87.851318, 45.341346 ], [ -87.851475, 45.342335 ], [ -87.849899, 45.344651 ], [ -87.850418, 45.347492 ], [ -87.852784, 45.349497 ], [ -87.858617, 45.350378 ], [ -87.860871, 45.351192 ], [ -87.863489, 45.353020 ], [ -87.864873, 45.354767 ], [ -87.865274, 45.355969 ], [ -87.865675, 45.358213 ], [ -87.867037, 45.360137 ], [ -87.868560, 45.360537 ], [ -87.870243, 45.360617 ], [ -87.871204, 45.360056 ], [ -87.871285, 45.358614 ], [ -87.871124, 45.357011 ], [ -87.871685, 45.355729 ], [ -87.873529, 45.354286 ], [ -87.879835, 45.351490 ], [ -87.881114, 45.351278 ], [ -87.885170, 45.351736 ], [ -87.886949, 45.353110 ], [ -87.888052, 45.354697 ], [ -87.887828, 45.358122 ], [ -87.884855, 45.362792 ], [ -87.876862, 45.368535 ], [ -87.871485, 45.371546 ], [ -87.871789, 45.373557 ], [ -87.875692, 45.377052 ], [ -87.875424, 45.379373 ], [ -87.873568, 45.381357 ], [ -87.870905, 45.383116 ], [ -87.864677, 45.385232 ], [ -87.859418, 45.388227 ], [ -87.856830, 45.393106 ], [ -87.859603, 45.396409 ], [ -87.859773, 45.397278 ], [ -87.859131, 45.398967 ], [ -87.850969, 45.401925 ], [ -87.849322, 45.403872 ], [ -87.849668, 45.409518 ], [ -87.850533, 45.411685 ], [ -87.851810, 45.413103 ], [ -87.856216, 45.416101 ], [ -87.860432, 45.423504 ], [ -87.860127, 45.429584 ], [ -87.861950, 45.433072 ], [ -87.861697, 45.434473 ], [ -87.855298, 45.441379 ], [ -87.847429, 45.444177 ], [ -87.844815, 45.448411 ], [ -87.836008, 45.450877 ], [ -87.833042, 45.453596 ], [ -87.832456, 45.455020 ], [ -87.827430, 45.458076 ], [ -87.821057, 45.459955 ], [ -87.812976, 45.464159 ], [ -87.812971, 45.466100 ], [ -87.811469, 45.467991 ], [ -87.805773, 45.473139 ], [ -87.805873, 45.474380 ], [ -87.807388, 45.477031 ], [ -87.806891, 45.479092 ], [ -87.798960, 45.485147 ], [ -87.798362, 45.486564 ], [ -87.797824, 45.491468 ], [ -87.796409, 45.494679 ], [ -87.793447, 45.498372 ], [ -87.792769, 45.499967 ], [ -87.793215, 45.505028 ], [ -87.798794, 45.506287 ], [ -87.802267, 45.514233 ], [ -87.804203, 45.524676 ], [ -87.804720, 45.531244 ], [ -87.804528, 45.534373 ], [ -87.803364, 45.537016 ], [ -87.803390, 45.538272 ], [ -87.807159, 45.543523 ], [ -87.813737, 45.548616 ], [ -87.818791, 45.552100 ], [ -87.827215, 45.555620 ], [ -87.832296, 45.558767 ], [ -87.832968, 45.559461 ], [ -87.833591, 45.562529 ], [ -87.831689, 45.568035 ], [ -87.829346, 45.568776 ], [ -87.813745, 45.565175 ], [ -87.806104, 45.562863 ], [ -87.797536, 45.562124 ], [ -87.792372, 45.563055 ], [ -87.790874, 45.564096 ], [ -87.788798, 45.565947 ], [ -87.788326, 45.567941 ], [ -87.787292, 45.574906 ], [ -87.787534, 45.581376 ], [ -87.786767, 45.582830 ], [ -87.785647, 45.583960 ], [ -87.781255, 45.585682 ], [ -87.777199, 45.588499 ], [ -87.776238, 45.597797 ], [ -87.777671, 45.609204 ], [ -87.780845, 45.614599 ], [ -87.792016, 45.616756 ], [ -87.795880, 45.618846 ], [ -87.796179, 45.622074 ], [ -87.796983, 45.623613 ], [ -87.804481, 45.628933 ], [ -87.810194, 45.638732 ], [ -87.817277, 45.643926 ], [ -87.821818, 45.645589 ], [ -87.824102, 45.647138 ], [ -87.824676, 45.653211 ], [ -87.822693, 45.656077 ], [ -87.822425, 45.658012 ], [ -87.823672, 45.659817 ], [ -87.823868, 45.661920 ], [ -87.823164, 45.662732 ], [ -87.803290, 45.666494 ], [ -87.798903, 45.670140 ], [ -87.795355, 45.671334 ], [ -87.781623, 45.673280 ], [ -87.781007, 45.673934 ], [ -87.780737, 45.675458 ], [ -87.780808, 45.680349 ], [ -87.782226, 45.683053 ], [ -87.787727, 45.687180 ], [ -87.801880, 45.693862 ], [ -87.804993, 45.695796 ], [ -87.809075, 45.699717 ], [ -87.809181, 45.700337 ], [ -87.805076, 45.703556 ], [ -87.805081, 45.704974 ], [ -87.805867, 45.706841 ], [ -87.810144, 45.710230 ], [ -87.812338, 45.711303 ], [ -87.831442, 45.714938 ], [ -87.837343, 45.716919 ], [ -87.855480, 45.726943 ], [ -87.864320, 45.737139 ], [ -87.863874, 45.742660 ], [ -87.863050, 45.743090 ], [ -87.864141, 45.745697 ], [ -87.868111, 45.749477 ], [ -87.873339, 45.750439 ], [ -87.875813, 45.753888 ], [ -87.879812, 45.754843 ], [ -87.882261, 45.754779 ], [ -87.891905, 45.754055 ], [ -87.896032, 45.752285 ], [ -87.898363, 45.752503 ], [ -87.900005, 45.753497 ], [ -87.901299, 45.756553 ], [ -87.902707, 45.757932 ], [ -87.904657, 45.759163 ], [ -87.905873, 45.759364 ], [ -87.907771, 45.759280 ], [ -87.908933, 45.758297 ], [ -87.921999, 45.756989 ], [ -87.926611, 45.759590 ], [ -87.929130, 45.760364 ], [ -87.934585, 45.758094 ], [ -87.944113, 45.757422 ], [ -87.954459, 45.758414 ], [ -87.959277, 45.757367 ], [ -87.963452, 45.758220 ], [ -87.964725, 45.759461 ], [ -87.963996, 45.760794 ], [ -87.966970, 45.764021 ], [ -87.972451, 45.766319 ], [ -87.976835, 45.767015 ], [ -87.986429, 45.769596 ], [ -87.989656, 45.772025 ], [ -87.989829, 45.772945 ], [ -87.985597, 45.774926 ], [ -87.983392, 45.774696 ], [ -87.981789, 45.775081 ], [ -87.980870, 45.776977 ], [ -87.982617, 45.782944 ], [ -87.987942, 45.793075 ], [ -87.989831, 45.794827 ], [ -87.991447, 45.795393 ], [ -87.995876, 45.795435 ], [ -88.001593, 45.794091 ], [ -88.007043, 45.792192 ], [ -88.017588, 45.792455 ], [ -88.023600, 45.790094 ], [ -88.027228, 45.789190 ], [ -88.031124, 45.789233 ], [ -88.033568, 45.789816 ], [ -88.039729, 45.789626 ], [ -88.040221, 45.789236 ], [ -88.040892, 45.786452 ], [ -88.044697, 45.783718 ], [ -88.048514, 45.782549 ], [ -88.050634, 45.780972 ], [ -88.072091, 45.780261 ], [ -88.076375, 45.781606 ], [ -88.078361, 45.784249 ], [ -88.079764, 45.784950 ], [ -88.088590, 45.784697 ], [ -88.094047, 45.785658 ], [ -88.099616, 45.790186 ], [ -88.103247, 45.791361 ], [ -88.106351, 45.797573 ], [ -88.105518, 45.798839 ], [ -88.105355, 45.800104 ], [ -88.107506, 45.802668 ], [ -88.109506, 45.803584 ], [ -88.116024, 45.804079 ], [ -88.129461, 45.809288 ], [ -88.131834, 45.811312 ], [ -88.136110, 45.819029 ], [ -88.135067, 45.821694 ], [ -88.133640, 45.823128 ], [ -88.127808, 45.827173 ], [ -88.122947, 45.829565 ], [ -88.120723, 45.832995 ], [ -88.114267, 45.837891 ], [ -88.111726, 45.839196 ], [ -88.109089, 45.839492 ], [ -88.106622, 45.841072 ], [ -88.098326, 45.850142 ], [ -88.088825, 45.855860 ], [ -88.087419, 45.857459 ], [ -88.084985, 45.862443 ], [ -88.082590, 45.864944 ], [ -88.081641, 45.865087 ], [ -88.077534, 45.863825 ], [ -88.075146, 45.864832 ], [ -88.073134, 45.871952 ], [ -88.073944, 45.875593 ], [ -88.081781, 45.880516 ], [ -88.083965, 45.881186 ], [ -88.095841, 45.880042 ], [ -88.100218, 45.881205 ], [ -88.101814, 45.883504 ], [ -88.105447, 45.896593 ], [ -88.105981, 45.897091 ], [ -88.106136, 45.900811 ], [ -88.105677, 45.904387 ], [ -88.104576, 45.906847 ], [ -88.101973, 45.910550 ], [ -88.099172, 45.912362 ], [ -88.095354, 45.913895 ], [ -88.095409, 45.915175 ], [ -88.096496, 45.917273 ], [ -88.102908, 45.921869 ], [ -88.104686, 45.922121 ], [ -88.115346, 45.922211 ], [ -88.118507, 45.921140 ], [ -88.121864, 45.920750 ], [ -88.126382, 45.921499 ], [ -88.127594, 45.922414 ], [ -88.127430, 45.923214 ], [ -88.126122, 45.924639 ], [ -88.127428, 45.926153 ], [ -88.141001, 45.930608 ], [ -88.145928, 45.933646 ], [ -88.146419, 45.934194 ], [ -88.146352, 45.935314 ], [ -88.158704, 45.939064 ], [ -88.163105, 45.939043 ], [ -88.163959, 45.938340 ], [ -88.170096, 45.939470 ], [ -88.172628, 45.941015 ], [ -88.175532, 45.944897 ], [ -88.178008, 45.947111 ], [ -88.189789, 45.952208 ], [ -88.191991, 45.952740 ], [ -88.196316, 45.953311 ], [ -88.197627, 45.953082 ], [ -88.202116, 45.949836 ], [ -88.201852, 45.945173 ], [ -88.209585, 45.944280 ], [ -88.211158, 45.944531 ], [ -88.215025, 45.946976 ], [ -88.222167, 45.948513 ], [ -88.223773, 45.948712 ], [ -88.227988, 45.947688 ], [ -88.233140, 45.947405 ], [ -88.239672, 45.948982 ], [ -88.242518, 45.950363 ], [ -88.244452, 45.952142 ], [ -88.245752, 45.954147 ], [ -88.246579, 45.956597 ], [ -88.245937, 45.958726 ], [ -88.246307, 45.962983 ], [ -88.249117, 45.963663 ], [ -88.250133, 45.963572 ], [ -88.250133, 45.963147 ], [ -88.254816, 45.963538 ], [ -88.256455, 45.962739 ], [ -88.259343, 45.959494 ], [ -88.268390, 45.957486 ], [ -88.283335, 45.955091 ], [ -88.292381, 45.951115 ], [ -88.295264, 45.951253 ], [ -88.296968, 45.953767 ], [ -88.300965, 45.956168 ], [ -88.309520, 45.959369 ], [ -88.316894, 45.960969 ], [ -88.320531, 45.959963 ], [ -88.326003, 45.955300 ], [ -88.326953, 45.955071 ], [ -88.330296, 45.956625 ], [ -88.327872, 45.958934 ], [ -88.328333, 45.964054 ], [ -88.330137, 45.965951 ], [ -88.334628, 45.968808 ], [ -88.380183, 45.991654 ], [ -88.385234, 45.990239 ], [ -88.384318, 45.988113 ], [ -88.388847, 45.982675 ], [ -88.395308, 45.980391 ], [ -88.399046, 45.980278 ], [ -88.402848, 45.981194 ], [ -88.409864, 45.979688 ], [ -88.411077, 45.979139 ], [ -88.414849, 45.975483 ], [ -88.416914, 45.975323 ], [ -88.420356, 45.976764 ], [ -88.423044, 45.978547 ], [ -88.422322, 45.980170 ], [ -88.423437, 45.981930 ], [ -88.426125, 45.984102 ], [ -88.434060, 45.986205 ], [ -88.435798, 45.988125 ], [ -88.439733, 45.990456 ], [ -88.443078, 45.990685 ], [ -88.448751, 45.989770 ], [ -88.450325, 45.990181 ], [ -88.454261, 45.993426 ], [ -88.453868, 45.996169 ], [ -88.454361, 45.997518 ], [ -88.458658, 45.999391 ], [ -88.465542, 46.000685 ], [ -88.470855, 46.001004 ], [ -88.474695, 45.998770 ], [ -88.475152, 45.996598 ], [ -88.474036, 45.994655 ], [ -88.476002, 45.992826 ], [ -88.478984, 45.991797 ], [ -88.486755, 45.990949 ], [ -88.492495, 45.992157 ], [ -88.497417, 45.995149 ], [ -88.498108, 45.996360 ], [ -88.496897, 45.998281 ], [ -88.496898, 45.999012 ], [ -88.498765, 46.000393 ], [ -88.500133, 46.000457 ], [ -88.505946, 46.013385 ], [ -88.506205, 46.017134 ], [ -88.507188, 46.018300 ], [ -88.509516, 46.019169 ], [ -88.514601, 46.019926 ], [ -88.523131, 46.019518 ], [ -88.526673, 46.020822 ], [ -88.532414, 46.021212 ], [ -88.533825, 46.020915 ], [ -88.533530, 46.019932 ], [ -88.534876, 46.018104 ], [ -88.539011, 46.014791 ], [ -88.541078, 46.013763 ], [ -88.550756, 46.012896 ], [ -88.554987, 46.014977 ], [ -88.565485, 46.015708 ], [ -88.571553, 46.013811 ], [ -88.572995, 46.011799 ], [ -88.580670, 46.006975 ], [ -88.589000, 46.005077 ], [ -88.589755, 46.005602 ], [ -88.592874, 46.011590 ], [ -88.593302, 46.014447 ], [ -88.593860, 46.015132 ], [ -88.598093, 46.017623 ], [ -88.601440, 46.017599 ], [ -88.603965, 46.016181 ], [ -88.607438, 46.010991 ], [ -88.611466, 46.003332 ], [ -88.611563, 45.998810 ], [ -88.613063, 45.990627 ], [ -88.614176, 45.988775 ], [ -88.616405, 45.987700 ], [ -88.623947, 45.988633 ], [ -88.634055, 45.987999 ], [ -88.634842, 45.987565 ], [ -88.635598, 45.985119 ], [ -88.637500, 45.984960 ], [ -88.657760, 45.989287 ], [ -88.661312, 45.988819 ], [ -88.662902, 45.988730 ], [ -88.663697, 45.989084 ], [ -88.664802, 45.989835 ], [ -88.664360, 45.991337 ], [ -88.663609, 45.992397 ], [ -88.663923, 45.993242 ], [ -88.667464, 45.995048 ], [ -88.671267, 45.999026 ], [ -88.670939, 45.999957 ], [ -88.670115, 45.999957 ], [ -88.671458, 46.005104 ], [ -88.674606, 46.010567 ], [ -88.679132, 46.013538 ], [ -88.691662, 46.015435 ], [ -88.698716, 46.017903 ], [ -88.704687, 46.018154 ], [ -88.710328, 46.016303 ], [ -88.713049, 46.012668 ], [ -88.718397, 46.013284 ], [ -88.721319, 46.018608 ], [ -88.721125, 46.022013 ], [ -88.724801, 46.024503 ], [ -88.730675, 46.026535 ], [ -88.739994, 46.027308 ], [ -88.746422, 46.025798 ], [ -88.752176, 46.023584 ], [ -88.754033, 46.022460 ], [ -88.756295, 46.020173 ], [ -88.758618, 46.019542 ], [ -88.760044, 46.019815 ], [ -88.763767, 46.021943 ], [ -88.765208, 46.022086 ], [ -88.766156, 46.022149 ], [ -88.767104, 46.021896 ], [ -88.767610, 46.021643 ], [ -88.768305, 46.021201 ], [ -88.768692, 46.020571 ], [ -88.769712, 46.018968 ], [ -88.776187, 46.015931 ], [ -88.779915, 46.015436 ], [ -88.782104, 46.016558 ], [ -88.783891, 46.020934 ], [ -88.784007, 46.022984 ], [ -88.783635, 46.024357 ], [ -88.778734, 46.028875 ], [ -88.778628, 46.031271 ], [ -88.779221, 46.031869 ], [ -88.784411, 46.032709 ], [ -88.791796, 46.032057 ], [ -88.796182, 46.033712 ], [ -88.800670, 46.030036 ], [ -88.796242, 46.026853 ], [ -88.795790, 46.024864 ], [ -88.796460, 46.023605 ], [ -88.801761, 46.023737 ], [ -88.811948, 46.021609 ], [ -88.815629, 46.022320 ], [ -88.815427, 46.022954 ], [ -88.816489, 46.023924 ], [ -88.820592, 46.026261 ], [ -88.831544, 46.029620 ], [ -88.835249, 46.030330 ], [ -88.837991, 46.030176 ], [ -88.840584, 46.031112 ], [ -88.843903, 46.033050 ], [ -88.847599, 46.037161 ], [ -88.848464, 46.038858 ], [ -88.850270, 46.040274 ], [ -88.943279, 46.077943 ], [ -88.948698, 46.080205 ], [ -88.990807, 46.097298 ], [ -89.091630, 46.138505 ], [ -89.125136, 46.144531 ], [ -89.161757, 46.151816 ], [ -89.166887, 46.152868 ], [ -89.194508, 46.157942 ], [ -89.201283, 46.159426 ], [ -89.203289, 46.160020 ], [ -89.205657, 46.160408 ], [ -89.218156, 46.162988 ], [ -89.219964, 46.163319 ], [ -89.276489, 46.174047 ], [ -89.276883, 46.174116 ], [ -89.495723, 46.216301 ], [ -89.533801, 46.224119 ], [ -89.638416, 46.243804 ], [ -89.667617, 46.249797 ], [ -89.764506, 46.268082 ], [ -89.908196, 46.296037 ], [ -89.909910, 46.296402 ], [ -89.918798, 46.297741 ], [ -90.120489, 46.336852 ], [ -90.121248, 46.337217 ], [ -90.121380, 46.338131 ], [ -90.121084, 46.338656 ], [ -90.119468, 46.339700 ], [ -90.118791, 46.342253 ], [ -90.119572, 46.344180 ], [ -90.120198, 46.345066 ], [ -90.120614, 46.346420 ], [ -90.119729, 46.348504 ], [ -90.117466, 46.349487 ], [ -90.116741, 46.350652 ], [ -90.116844, 46.355153 ], [ -90.118827, 46.359241 ], [ -90.119691, 46.359755 ], [ -90.119757, 46.359748 ], [ -90.120973, 46.359720 ], [ -90.122287, 46.360139 ], [ -90.122785, 46.361259 ], [ -90.122757, 46.362621 ], [ -90.122923, 46.363603 ], [ -90.126517, 46.366889 ], [ -90.131036, 46.369199 ], [ -90.133871, 46.371828 ], [ -90.134663, 46.374947 ], [ -90.134656, 46.374979 ], [ -90.132250, 46.381249 ], [ -90.133966, 46.382118 ], [ -90.135253, 46.382210 ], [ -90.139410, 46.384999 ], [ -90.144359, 46.390255 ], [ -90.146816, 46.397205 ], [ -90.148347, 46.399258 ], [ -90.152936, 46.401293 ], [ -90.157851, 46.409291 ], [ -90.158972, 46.413769 ], [ -90.158241, 46.420485 ], [ -90.158603, 46.422656 ], [ -90.163422, 46.434605 ], [ -90.166526, 46.437576 ], [ -90.166909, 46.439311 ], [ -90.166919, 46.439851 ], [ -90.174556, 46.439656 ], [ -90.177860, 46.440548 ], [ -90.179212, 46.453090 ], [ -90.180336, 46.456746 ], [ -90.189162, 46.459054 ], [ -90.190749, 46.460173 ], [ -90.193294, 46.463143 ], [ -90.192005, 46.465611 ], [ -90.189426, 46.467004 ], [ -90.188633, 46.468101 ], [ -90.188996, 46.469015 ], [ -90.193394, 46.472487 ], [ -90.201727, 46.476074 ], [ -90.204009, 46.478175 ], [ -90.211753, 46.490351 ], [ -90.214843, 46.498181 ], [ -90.214866, 46.499947 ], [ -90.216594, 46.501759 ], [ -90.220532, 46.503403 ], [ -90.222351, 46.503380 ], [ -90.228735, 46.501573 ], [ -90.230324, 46.501732 ], [ -90.231020, 46.503354 ], [ -90.230921, 46.504656 ], [ -90.229402, 46.507992 ], [ -90.230363, 46.509705 ], [ -90.231587, 46.509842 ], [ -90.236283, 46.507121 ], [ -90.243395, 46.505245 ], [ -90.246043, 46.504832 ], [ -90.248194, 46.505357 ], [ -90.257160, 46.504716 ], [ -90.258650, 46.503483 ], [ -90.260504, 46.502822 ], [ -90.263018, 46.502777 ], [ -90.265269, 46.503829 ], [ -90.265143, 46.505089 ], [ -90.265143, 46.506222 ], [ -90.266528, 46.507356 ], [ -90.268480, 46.507167 ], [ -90.270180, 46.507356 ], [ -90.270684, 46.508237 ], [ -90.270558, 46.509560 ], [ -90.270432, 46.510756 ], [ -90.270422, 46.511690 ], [ -90.274721, 46.515416 ], [ -90.271971, 46.519756 ], [ -90.272599, 46.521127 ], [ -90.277131, 46.524487 ], [ -90.278356, 46.523847 ], [ -90.278920, 46.522271 ], [ -90.283423, 46.518868 ], [ -90.285707, 46.518846 ], [ -90.292854, 46.520972 ], [ -90.294311, 46.519876 ], [ -90.294411, 46.518848 ], [ -90.298284, 46.517820 ], [ -90.303546, 46.517432 ], [ -90.306558, 46.518484 ], [ -90.307716, 46.518392 ], [ -90.312581, 46.517113 ], [ -90.313839, 46.516199 ], [ -90.313894, 46.516199 ], [ -90.316983, 46.517319 ], [ -90.317777, 46.521637 ], [ -90.314434, 46.523784 ], [ -90.311886, 46.528695 ], [ -90.310329, 46.536852 ], [ -90.310859, 46.539365 ], [ -90.320428, 46.546287 ], [ -90.324699, 46.545602 ], [ -90.326686, 46.546150 ], [ -90.328044, 46.548046 ], [ -90.327548, 46.550262 ], [ -90.331887, 46.553278 ], [ -90.336921, 46.554076 ], [ -90.344338, 46.552087 ], [ -90.347514, 46.547083 ], [ -90.349462, 46.538080 ], [ -90.350121, 46.537337 ], [ -90.351580, 46.537074 ], [ -90.353534, 46.537553 ], [ -90.355689, 46.540317 ], [ -90.357014, 46.540591 ], [ -90.357676, 46.540271 ], [ -90.361600, 46.541434 ], [ -90.369964, 46.540549 ], [ -90.374461, 46.539212 ], [ -90.387228, 46.533663 ], [ -90.393320, 46.532615 ], [ -90.395272, 46.533941 ], [ -90.395568, 46.536317 ], [ -90.398742, 46.542738 ], [ -90.400041, 46.544384 ], [ -90.400429, 46.544384 ], [ -90.402019, 46.544384 ], [ -90.405593, 46.547584 ], [ -90.407775, 46.552246 ], [ -90.414464, 46.557320 ], [ -90.414596, 46.557320 ], [ -90.415620, 46.563169 ], [ -90.418136, 46.566094 ], [ -90.348407, 46.600635 ], [ -90.327626, 46.607744 ], [ -90.306609, 46.602741 ], [ -90.265294, 46.618516 ], [ -90.237609, 46.624485 ], [ -90.164026, 46.645515 ], [ -90.100695, 46.655132 ], [ -90.045420, 46.668272 ], [ -90.028392, 46.674390 ], [ -89.996034, 46.693225 ], [ -89.985817, 46.703190 ], [ -89.973803, 46.710322 ], [ -89.957101, 46.716929 ], [ -89.918466, 46.740324 ], [ -89.892355, 46.763088 ], [ -89.848652, 46.795711 ], [ -89.831956, 46.804053 ], [ -89.790663, 46.818469 ], [ -89.720277, 46.830413 ], [ -89.673375, 46.833229 ], [ -89.660625, 46.831056 ], [ -89.642255, 46.825340 ], [ -89.634938, 46.819488 ], [ -89.619329, 46.818890 ], [ -89.569808, 46.831859 ], [ -89.535683, 46.835878 ], [ -89.513938, 46.841835 ], [ -89.499080, 46.841621 ], [ -89.491252, 46.838448 ], [ -89.471540, 46.837359 ], [ -89.437047, 46.839512 ], [ -89.415154, 46.843983 ], [ -89.372032, 46.857386 ], [ -89.249143, 46.903326 ], [ -89.227914, 46.912954 ], [ -89.201511, 46.931149 ], [ -89.168244, 46.965536 ], [ -89.142595, 46.984859 ], [ -89.128698, 46.992599 ], [ -89.118339, 46.994220 ], [ -89.113158, 46.989356 ], [ -89.106277, 46.986480 ], [ -89.086742, 46.985298 ], [ -89.063103, 46.988522 ], [ -89.039490, 46.999419 ], [ -89.028930, 47.001140 ], [ -89.022994, 46.995120 ], [ -88.998417, 46.995314 ], [ -88.987197, 46.997239 ], [ -88.972802, 47.002096 ], [ -88.959409, 47.008496 ], [ -88.944045, 47.020129 ], [ -88.924492, 47.042156 ], [ -88.914189, 47.059246 ], [ -88.903706, 47.086161 ], [ -88.889140, 47.100575 ], [ -88.855372, 47.114263 ], [ -88.848176, 47.115065 ], [ -88.814834, 47.141399 ], [ -88.789813, 47.150925 ], [ -88.778022, 47.150465 ], [ -88.764351, 47.155762 ], [ -88.729688, 47.185834 ], [ -88.699660, 47.204831 ], [ -88.672395, 47.219137 ], [ -88.656359, 47.225624 ], [ -88.640323, 47.226784 ], [ -88.623579, 47.232352 ], [ -88.609830, 47.238894 ], [ -88.584912, 47.242361 ], [ -88.573997, 47.245989 ], [ -88.500780, 47.293503 ], [ -88.477733, 47.313460 ], [ -88.470484, 47.327653 ], [ -88.459262, 47.339903 ], [ -88.418673, 47.371188 ], [ -88.389459, 47.384431 ], [ -88.324083, 47.403542 ], [ -88.303447, 47.412204 ], [ -88.285195, 47.422392 ], [ -88.239161, 47.429969 ], [ -88.227446, 47.435093 ], [ -88.218424, 47.441585 ], [ -88.216977, 47.445493 ], [ -88.217822, 47.448738 ], [ -88.181820, 47.457657 ], [ -88.150571, 47.460093 ], [ -88.139651, 47.462693 ], [ -88.085252, 47.468961 ], [ -88.076388, 47.467752 ], [ -88.049326, 47.469785 ], [ -88.048226, 47.470008 ], [ -88.048077, 47.474973 ], [ -88.040291, 47.475999 ], [ -87.978934, 47.479420 ], [ -87.929269, 47.478737 ], [ -87.902416, 47.477045 ], [ -87.898036, 47.474872 ], [ -87.816958, 47.471998 ], [ -87.801184, 47.473301 ], [ -87.756739, 47.460717 ], [ -87.730804, 47.449112 ], [ -87.715942, 47.439816 ], [ -87.710471, 47.406200 ], [ -87.712421, 47.401400 ], [ -87.721274, 47.401032 ], [ -87.742417, 47.405823 ], [ -87.751380, 47.405066 ], [ -87.759057, 47.403013 ], [ -87.765019, 47.398652 ], [ -87.800294, 47.392148 ], [ -87.815371, 47.384790 ], [ -87.827115, 47.386160 ], [ -87.834822, 47.390478 ], [ -87.848252, 47.394864 ], [ -87.856700, 47.395387 ], [ -87.882245, 47.395588 ], [ -87.941613, 47.390073 ], [ -87.957058, 47.387260 ], [ -87.965063, 47.374430 ], [ -87.965598, 47.368645 ], [ -87.962567, 47.362543 ], [ -87.954796, 47.356809 ], [ -87.947397, 47.355461 ], [ -87.938787, 47.346777 ], [ -87.938250, 47.342299 ], [ -87.943360, 47.335899 ], [ -87.946352, 47.334254 ], [ -87.958386, 47.334435 ], [ -87.968604, 47.332582 ], [ -87.989133, 47.322633 ], [ -88.016478, 47.306275 ], [ -88.054849, 47.298240 ], [ -88.060090, 47.295796 ], [ -88.071476, 47.286768 ], [ -88.096851, 47.261351 ], [ -88.108833, 47.259131 ], [ -88.117456, 47.255174 ], [ -88.131943, 47.239554 ], [ -88.163059, 47.216278 ], [ -88.194218, 47.209242 ], [ -88.204849, 47.210498 ], [ -88.212361, 47.209423 ], [ -88.228987, 47.199042 ], [ -88.236892, 47.189236 ], [ -88.242006, 47.174767 ], [ -88.242660, 47.158426 ], [ -88.239470, 47.151137 ], [ -88.236721, 47.149287 ], [ -88.231797, 47.149609 ], [ -88.232164, 47.145975 ], [ -88.239895, 47.139436 ], [ -88.247628, 47.135981 ], [ -88.249571, 47.136231 ], [ -88.250785, 47.140209 ], [ -88.255303, 47.143640 ], [ -88.262972, 47.145174 ], [ -88.272017, 47.143511 ], [ -88.281701, 47.138212 ], [ -88.289040, 47.129689 ], [ -88.289543, 47.126604 ], [ -88.287870, 47.125374 ], [ -88.287173, 47.120420 ], [ -88.288347, 47.114547 ], [ -88.297625, 47.098505 ], [ -88.340052, 47.080494 ], [ -88.346709, 47.079372 ], [ -88.349952, 47.076377 ], [ -88.353191, 47.069063 ], [ -88.353952, 47.058047 ], [ -88.359054, 47.039739 ], [ -88.367624, 47.019213 ], [ -88.373966, 47.012262 ], [ -88.385606, 47.004522 ], [ -88.404498, 46.983353 ], [ -88.411145, 46.977984 ], [ -88.443901, 46.972251 ], [ -88.448570, 46.946769 ], [ -88.455404, 46.923321 ], [ -88.475859, 46.886042 ], [ -88.477935, 46.850560 ], [ -88.483748, 46.831727 ], [ -88.482579, 46.826197 ], [ -88.473342, 46.806226 ], [ -88.462349, 46.786711 ], [ -88.438427, 46.786714 ], [ -88.433835, 46.793502 ], [ -88.415225, 46.811715 ], [ -88.381410, 46.838466 ], [ -88.382204, 46.844477 ], [ -88.382052, 46.845437 ], [ -88.390135, 46.851595 ], [ -88.404008, 46.848331 ], [ -88.389727, 46.867100 ], [ -88.372591, 46.872812 ], [ -88.375855, 46.863428 ], [ -88.369848, 46.857568 ], [ -88.368767, 46.857313 ], [ -88.360868, 46.856202 ], [ -88.351940, 46.857028 ], [ -88.310290, 46.889748 ], [ -88.281244, 46.906632 ], [ -88.261593, 46.915516 ], [ -88.244437, 46.929612 ], [ -88.167227, 46.958855 ], [ -88.155374, 46.965069 ], [ -88.143688, 46.966665 ], [ -88.132876, 46.962204 ], [ -88.150114, 46.943630 ], [ -88.187522, 46.918999 ], [ -88.175197, 46.904580 ], [ -88.161913, 46.904941 ], [ -88.126927, 46.909840 ], [ -88.101315, 46.917207 ], [ -88.081870, 46.920458 ], [ -88.065192, 46.918563 ], [ -88.032408, 46.908890 ], [ -88.004298, 46.906982 ], [ -87.986113, 46.905957 ], [ -87.956000, 46.909051 ], [ -87.900339, 46.909686 ], [ -87.874538, 46.892578 ], [ -87.846195, 46.883905 ], [ -87.841228, 46.884363 ], [ -87.827162, 46.889713 ], [ -87.816794, 46.891154 ], [ -87.813226, 46.888023 ], [ -87.793194, 46.880822 ], [ -87.782461, 46.879859 ], [ -87.776930, 46.876726 ], [ -87.776313, 46.872591 ], [ -87.778752, 46.870422 ], [ -87.776804, 46.866823 ], [ -87.765989, 46.861316 ], [ -87.755868, 46.860453 ], [ -87.746646, 46.865427 ], [ -87.741014, 46.865247 ], [ -87.734870, 46.850120 ], [ -87.736732, 46.847216 ], [ -87.734325, 46.836955 ], [ -87.731522, 46.831196 ], [ -87.727358, 46.827656 ], [ -87.713737, 46.825534 ], [ -87.694590, 46.827182 ], [ -87.685698, 46.832530 ], [ -87.687930, 46.839159 ], [ -87.687164, 46.841742 ], [ -87.680668, 46.842496 ], [ -87.674541, 46.836964 ], [ -87.673177, 46.827593 ], [ -87.674345, 46.824050 ], [ -87.672015, 46.820415 ], [ -87.662261, 46.815157 ], [ -87.651510, 46.812411 ], [ -87.641887, 46.813733 ], [ -87.633300, 46.812107 ], [ -87.628081, 46.805157 ], [ -87.607988, 46.788408 ], [ -87.595307, 46.782950 ], [ -87.590767, 46.753009 ], [ -87.582745, 46.730527 ], [ -87.573203, 46.720471 ], [ -87.523308, 46.688488 ], [ -87.524444, 46.677586 ], [ -87.503025, 46.647497 ], [ -87.492860, 46.642561 ], [ -87.467965, 46.635623 ], [ -87.466537, 46.631555 ], [ -87.467563, 46.626228 ], [ -87.464108, 46.614811 ], [ -87.451368, 46.605923 ], [ -87.442612, 46.602776 ], [ -87.411167, 46.601669 ], [ -87.403275, 46.595215 ], [ -87.383961, 46.593070 ], [ -87.381649, 46.580059 ], [ -87.392974, 46.572523 ], [ -87.392828, 46.570852 ], [ -87.382206, 46.553681 ], [ -87.375613, 46.547140 ], [ -87.390300, 46.542577 ], [ -87.393985, 46.533183 ], [ -87.389290, 46.524472 ], [ -87.381349, 46.517292 ], [ -87.366767, 46.507303 ], [ -87.351071, 46.500749 ], [ -87.310755, 46.492017 ], [ -87.258732, 46.488255 ], [ -87.202404, 46.490827 ], [ -87.175065, 46.497548 ], [ -87.127440, 46.494014 ], [ -87.107559, 46.496124 ], [ -87.098760, 46.503609 ], [ -87.077279, 46.515339 ], [ -87.046022, 46.519956 ], [ -87.029892, 46.525599 ], [ -87.017136, 46.533550 ], [ -87.008724, 46.532723 ], [ -86.976958, 46.526581 ], [ -86.964534, 46.516549 ], [ -86.962842, 46.509646 ], [ -86.946980, 46.484567 ], [ -86.946218, 46.479059 ], [ -86.949526, 46.476315 ], [ -86.947077, 46.472064 ], [ -86.927725, 46.464566 ], [ -86.903742, 46.466138 ], [ -86.889094, 46.458499 ], [ -86.883976, 46.450976 ], [ -86.883919, 46.441514 ], [ -86.875151, 46.437280 ], [ -86.850111, 46.434114 ], [ -86.837448, 46.434186 ], [ -86.816026, 46.437892 ], [ -86.810967, 46.449663 ], [ -86.808817, 46.460611 ], [ -86.803557, 46.466669 ], [ -86.787905, 46.477729 ], [ -86.768516, 46.479072 ], [ -86.750157, 46.479109 ], [ -86.735929, 46.475231 ], [ -86.731096, 46.471760 ], [ -86.730829, 46.468057 ], [ -86.710573, 46.444908 ], [ -86.703230, 46.439378 ], [ -86.698139, 46.438624 ], [ -86.686412, 46.454965 ], [ -86.688816, 46.463152 ], [ -86.686468, 46.471655 ], [ -86.683819, 46.498079 ], [ -86.696001, 46.503160 ], [ -86.701929, 46.511571 ], [ -86.709325, 46.543914 ], [ -86.695645, 46.555026 ], [ -86.678182, 46.561039 ], [ -86.675764, 46.557061 ], [ -86.670927, 46.556489 ], [ -86.656479, 46.558453 ], [ -86.652865, 46.560555 ], [ -86.627380, 46.533710 ], [ -86.629086, 46.518144 ], [ -86.632109, 46.508865 ], [ -86.634530, 46.504523 ], [ -86.641088, 46.500438 ], [ -86.645528, 46.492039 ], [ -86.646393, 46.485776 ], [ -86.636671, 46.478298 ], [ -86.627441, 46.477540 ], [ -86.620603, 46.483873 ], [ -86.618061, 46.489452 ], [ -86.612173, 46.493295 ], [ -86.609393, 46.492976 ], [ -86.606932, 46.478531 ], [ -86.609039, 46.470239 ], [ -86.586168, 46.463324 ], [ -86.557731, 46.487434 ], [ -86.524959, 46.505381 ], [ -86.495054, 46.524874 ], [ -86.484003, 46.535965 ], [ -86.481956, 46.542709 ], [ -86.469306, 46.551422 ], [ -86.459930, 46.551928 ], [ -86.444390, 46.548137 ], [ -86.437167, 46.548960 ], [ -86.390409, 46.563194 ], [ -86.349890, 46.578035 ], [ -86.188024, 46.654008 ], [ -86.161681, 46.669475 ], [ -86.138295, 46.672935 ], [ -86.119862, 46.657256 ], [ -86.112126, 46.655044 ], [ -86.099843, 46.654615 ], [ -86.074219, 46.657799 ], [ -86.036969, 46.667627 ], [ -85.995044, 46.673676 ], [ -85.953670, 46.676869 ], [ -85.924047, 46.684733 ], [ -85.877908, 46.690914 ], [ -85.841057, 46.688896 ], [ -85.794923, 46.681083 ], [ -85.750606, 46.677368 ], [ -85.714415, 46.677156 ], [ -85.668753, 46.680404 ], [ -85.624573, 46.678862 ], [ -85.587345, 46.674627 ], [ -85.542517, 46.674263 ], [ -85.509510, 46.675786 ], [ -85.482096, 46.680432 ], [ -85.369805, 46.713754 ], [ -85.289846, 46.744644 ], [ -85.256860, 46.753380 ], [ -85.173042, 46.763634 ], [ -85.063556, 46.757856 ], [ -85.036286, 46.760435 ], [ -85.009240, 46.769224 ], [ -84.989497, 46.772403 ], [ -84.964652, 46.772845 ], [ -84.954009, 46.771362 ], [ -84.951580, 46.769488 ], [ -84.987539, 46.745483 ], [ -85.007616, 46.728339 ], [ -85.020159, 46.712463 ], [ -85.027513, 46.697451 ], [ -85.030078, 46.684769 ], [ -85.028291, 46.675125 ], [ -85.035504, 46.625021 ], [ -85.037056, 46.600995 ], [ -85.035476, 46.581547 ], [ -85.031507, 46.568703 ], [ -85.029594, 46.554419 ], [ -85.027374, 46.553756 ], [ -85.025491, 46.546397 ], [ -85.027083, 46.543038 ], [ -85.045534, 46.537694 ], [ -85.052954, 46.532827 ], [ -85.056133, 46.526520 ], [ -85.054943, 46.514750 ], [ -85.049847, 46.503963 ], [ -85.033766, 46.487670 ], [ -85.025598, 46.483028 ], [ -85.015211, 46.479712 ], [ -84.969464, 46.476290 ], [ -84.955307, 46.480269 ], [ -84.947269, 46.487399 ], [ -84.937145, 46.489252 ], [ -84.934432, 46.480315 ], [ -84.921931, 46.469962 ], [ -84.915184, 46.467515 ], [ -84.893423, 46.465406 ], [ -84.875070, 46.466781 ], [ -84.861448, 46.469930 ], [ -84.849767, 46.460245 ], [ -84.843907, 46.448661 ], [ -84.829491, 46.444071 ], [ -84.800101, 46.446219 ], [ -84.769151, 46.453523 ], [ -84.723338, 46.468266 ], [ -84.689672, 46.483923 ], [ -84.678423, 46.487694 ], [ -84.653880, 46.482250 ], [ -84.631020, 46.484868 ], [ -84.616489, 46.471870 ], [ -84.607945, 46.456747 ], [ -84.584167, 46.439410 ], [ -84.573522, 46.427895 ], [ -84.551496, 46.418522 ], [ -84.503719, 46.439190 ], [ -84.493401, 46.440313 ], [ -84.479513, 46.432573 ], [ -84.471848, 46.434289 ], [ -84.462597, 46.440940 ], [ -84.455527, 46.453897 ], [ -84.455256, 46.462785 ], [ -84.463322, 46.467435 ], [ -84.445149, 46.489016 ], [ -84.420274, 46.501077 ], [ -84.394725, 46.499242 ], [ -84.375040, 46.508669 ], [ -84.373968, 46.509098 ], [ -84.343599, 46.507713 ], [ -84.337732, 46.505577 ], [ -84.325371, 46.500021 ], [ -84.293016, 46.492803 ], [ -84.275814, 46.492821 ], [ -84.265391, 46.494393 ], [ -84.264266, 46.495055 ], [ -84.254434, 46.500821 ], [ -84.226131, 46.533920 ], [ -84.193729, 46.539920 ], [ -84.177428, 46.526920 ], [ -84.166028, 46.526220 ], [ -84.153027, 46.528320 ], [ -84.146526, 46.531119 ], [ -84.139426, 46.532219 ], [ -84.128925, 46.530119 ], [ -84.123325, 46.520919 ], [ -84.117925, 46.517619 ], [ -84.111225, 46.504119 ], [ -84.125026, 46.470143 ], [ -84.146172, 46.418520 ], [ -84.138906, 46.372221 ], [ -84.119122, 46.337014 ], [ -84.106247, 46.321963 ], [ -84.119629, 46.315013 ], [ -84.115563, 46.268225 ], [ -84.097766, 46.256512 ], [ -84.108089, 46.241238 ], [ -84.118175, 46.233968 ], [ -84.125024, 46.232885 ], [ -84.134652, 46.232140 ], [ -84.145950, 46.224995 ], [ -84.147150, 46.224184 ], [ -84.149220, 46.223808 ], [ -84.150725, 46.223808 ], [ -84.151666, 46.224184 ], [ -84.152042, 46.224937 ], [ -84.152230, 46.226254 ], [ -84.152499, 46.227875 ], [ -84.159485, 46.233233 ], [ -84.182732, 46.235450 ], [ -84.219494, 46.231992 ], [ -84.233117, 46.224037 ], [ -84.249164, 46.206461 ], [ -84.245233, 46.192571 ], [ -84.247687, 46.179890 ], [ -84.251424, 46.175888 ], [ -84.221001, 46.163062 ], [ -84.196669, 46.166150 ], [ -84.177298, 46.183993 ], [ -84.171640, 46.181731 ], [ -84.125022, 46.180209 ], [ -84.114941, 46.174114 ], [ -84.113259, 46.168860 ], [ -84.100126, 46.150770 ], [ -84.095818, 46.147733 ], [ -84.089309, 46.146432 ], [ -84.060383, 46.146138 ], [ -84.026536, 46.131648 ], [ -84.031036, 46.123186 ], [ -84.038696, 46.125620 ], [ -84.051900, 46.119810 ], [ -84.061329, 46.113482 ], [ -84.069147, 46.103978 ], [ -84.072398, 46.096690 ], [ -84.071741, 46.092441 ], [ -84.066257, 46.087438 ], [ -84.051712, 46.079189 ], [ -84.027861, 46.054784 ], [ -84.006082, 46.044586 ], [ -83.989526, 46.032823 ], [ -83.963808, 46.027833 ], [ -83.951410, 46.029042 ], [ -83.943933, 46.031465 ], [ -83.939012, 46.029226 ], [ -83.935470, 46.020385 ], [ -83.931175, 46.017871 ], [ -83.908583, 46.011471 ], [ -83.900535, 45.998918 ], [ -83.896489, 45.989194 ], [ -83.898594, 45.979530 ], [ -83.901942, 45.972640 ], [ -83.903923, 45.966210 ], [ -83.916168, 45.955326 ], [ -83.921257, 45.958075 ], [ -83.952183, 45.965498 ], [ -83.985141, 45.967133 ], [ -83.996471, 45.961461 ], [ -84.000033, 45.948452 ], [ -84.017565, 45.959046 ], [ -84.080071, 45.970822 ], [ -84.090391, 45.967256 ], [ -84.105370, 45.972948 ], [ -84.107204, 45.977161 ], [ -84.111174, 45.978675 ], [ -84.140816, 45.975308 ], [ -84.172250, 45.966072 ], [ -84.178060, 45.969175 ], [ -84.238174, 45.967595 ], [ -84.254952, 45.956068 ], [ -84.330021, 45.956247 ], [ -84.353272, 45.941663 ], [ -84.376429, 45.931962 ], [ -84.428689, 45.958371 ], [ -84.437633, 45.973750 ], [ -84.443138, 45.977863 ], [ -84.463128, 45.968925 ], [ -84.480436, 45.977764 ], [ -84.483062, 45.982242 ], [ -84.482442, 45.985441 ], [ -84.484009, 45.988250 ], [ -84.507201, 45.991169 ], [ -84.514123, 45.987242 ], [ -84.514071, 45.971292 ], [ -84.525052, 45.968578 ], [ -84.532392, 45.969448 ], [ -84.534422, 45.972762 ], [ -84.534648, 45.978132 ], [ -84.530444, 45.991385 ], [ -84.533426, 46.005720 ], [ -84.540995, 46.019501 ], [ -84.544405, 46.022860 ], [ -84.563891, 46.032459 ], [ -84.581081, 46.031041 ], [ -84.586592, 46.026584 ], [ -84.609063, 46.026418 ], [ -84.647609, 46.049704 ], [ -84.656567, 46.052654 ], [ -84.666710, 46.050486 ], [ -84.675835, 46.046009 ], [ -84.687322, 46.034880 ], [ -84.692735, 46.027019 ], [ -84.692700, 46.016963 ], [ -84.686269, 45.979144 ], [ -84.684368, 45.977499 ], [ -84.685254, 45.973454 ], [ -84.687712, 45.971260 ], [ -84.703948, 45.970901 ], [ -84.723039, 45.967279 ], [ -84.730179, 45.961198 ], [ -84.738849, 45.945792 ], [ -84.739370, 45.941816 ], [ -84.733041, 45.932837 ], [ -84.718955, 45.927449 ], [ -84.713614, 45.920366 ], [ -84.713251, 45.916047 ], [ -84.734002, 45.907026 ], [ -84.721276, 45.873908 ], [ -84.715481, 45.865934 ], [ -84.701183, 45.853092 ], [ -84.702295, 45.850464 ], [ -84.706383, 45.848658 ], [ -84.720836, 45.848107 ], [ -84.722764, 45.846621 ], [ -84.725734, 45.837045 ], [ -84.746985, 45.835597 ], [ -84.792763, 45.858691 ], [ -84.831396, 45.872038 ], [ -84.838472, 45.881512 ], [ -84.837624, 45.889054 ], [ -84.842243, 45.898194 ], [ -84.852916, 45.900111 ], [ -84.873254, 45.909815 ], [ -84.879835, 45.915847 ], [ -84.902913, 45.923673 ], [ -84.917484, 45.930670 ], [ -84.937134, 45.955949 ], [ -84.973556, 45.986134 ], [ -85.003597, 46.006130 ], [ -85.013990, 46.010774 ], [ -85.055581, 46.023148 ], [ -85.088818, 46.028378 ], [ -85.102899, 46.032488 ], [ -85.130433, 46.046076 ], [ -85.140835, 46.049601 ], [ -85.152027, 46.050725 ], [ -85.190630, 46.047622 ], [ -85.197523, 46.044878 ], [ -85.222511, 46.060689 ], [ -85.266385, 46.065779 ], [ -85.287693, 46.072276 ], [ -85.316264, 46.086608 ], [ -85.335911, 46.092595 ], [ -85.356214, 46.092086 ], [ -85.366622, 46.086778 ], [ -85.381394, 46.082044 ], [ -85.393832, 46.095465 ], [ -85.412064, 46.101437 ], [ -85.426916, 46.101964 ], [ -85.441932, 46.095793 ], [ -85.442293, 46.093941 ], [ -85.440191, 46.092593 ], [ -85.446990, 46.085164 ], [ -85.480603, 46.096379 ], [ -85.500100, 46.096940 ], [ -85.512696, 46.094727 ], [ -85.521570, 46.091257 ], [ -85.540858, 46.079581 ], [ -85.603785, 46.030363 ], [ -85.617709, 46.008458 ], [ -85.648581, 45.983695 ], [ -85.654686, 45.973686 ], [ -85.663966, 45.967013 ], [ -85.697203, 45.960158 ], [ -85.724246, 45.965409 ], [ -85.743618, 45.965173 ], [ -85.770938, 45.971349 ], [ -85.790639, 45.977594 ], [ -85.810442, 45.980087 ], [ -85.817558, 45.979447 ], [ -85.825819, 45.976292 ], [ -85.832603, 45.967742 ], [ -85.842404, 45.965247 ], [ -85.861157, 45.968167 ], [ -85.882442, 45.968620 ], [ -85.893196, 45.967253 ], [ -85.909100, 45.959074 ], [ -85.922737, 45.948287 ], [ -85.926213, 45.938093 ], [ -85.926017, 45.932104 ], [ -85.917238, 45.927782 ], [ -85.910264, 45.922112 ], [ -85.913769, 45.919439 ], [ -85.920581, 45.920994 ], [ -85.954063, 45.936629 ], [ -85.998868, 45.950968 ], [ -86.050956, 45.962205 ], [ -86.072067, 45.965313 ], [ -86.094753, 45.966704 ], [ -86.123567, 45.964748 ], [ -86.145714, 45.957372 ], [ -86.150173, 45.954494 ], [ -86.159415, 45.953765 ], [ -86.196618, 45.963185 ], [ -86.208255, 45.962978 ], [ -86.220546, 45.958883 ], [ -86.229060, 45.948570 ], [ -86.233613, 45.945802 ], [ -86.248008, 45.944849 ], [ -86.254768, 45.948640 ], [ -86.278007, 45.942057 ], [ -86.315981, 45.915247 ], [ -86.324232, 45.906080 ], [ -86.332625, 45.851813 ], [ -86.349134, 45.834160 ], [ -86.355062, 45.805355 ], [ -86.351658, 45.798132 ], [ -86.363808, 45.790057 ], [ -86.369918, 45.789254 ], [ -86.395809, 45.789740 ], [ -86.401656, 45.795412 ], [ -86.415971, 45.793793 ], [ -86.424828, 45.789747 ], [ -86.428423, 45.785587 ], [ -86.428946, 45.782524 ], [ -86.427183, 45.779050 ], [ -86.428294, 45.775620 ], [ -86.431921, 45.767756 ], [ -86.439661, 45.760669 ], [ -86.455534, 45.756850 ], [ -86.466039, 45.759741 ], [ -86.479050, 45.757416 ], [ -86.486028, 45.746608 ], [ -86.496251, 45.749255 ], [ -86.504216, 45.754230 ], [ -86.514570, 45.752337 ], [ -86.518281, 45.747688 ], [ -86.523197, 45.736498 ], [ -86.525166, 45.720797 ], [ -86.533280, 45.710849 ], [ -86.537258, 45.708361 ], [ -86.541430, 45.708110 ], [ -86.570627, 45.716412 ], [ -86.580936, 45.711920 ], [ -86.585847, 45.704922 ], [ -86.584771, 45.682007 ], [ -86.587528, 45.666456 ], [ -86.593613, 45.665625 ], [ -86.611306, 45.669733 ], [ -86.620430, 45.667098 ], [ -86.625132, 45.663819 ], [ -86.627938, 45.659293 ], [ -86.616972, 45.620581 ], [ -86.604180, 45.606457 ], [ -86.613803, 45.599583 ], [ -86.616893, 45.606796 ], [ -86.623870, 45.613262 ], [ -86.633224, 45.618249 ], [ -86.648439, 45.615992 ], [ -86.666127, 45.621689 ], [ -86.687208, 45.634253 ], [ -86.688772, 45.639969 ], [ -86.695275, 45.648175 ], [ -86.708038, 45.649202 ], [ -86.717828, 45.668106 ], [ -86.718191, 45.677320 ], [ -86.715781, 45.683949 ], [ -86.705184, 45.690901 ], [ -86.689102, 45.687862 ], [ -86.676184, 45.691862 ], [ -86.665677, 45.702217 ], [ -86.665511, 45.709030 ], [ -86.669263, 45.710860 ], [ -86.671480, 45.720530 ], [ -86.662762, 45.728964 ], [ -86.647319, 45.732618 ], [ -86.633138, 45.747654 ], [ -86.634902, 45.763536 ], [ -86.631018, 45.782019 ], [ -86.617336, 45.783538 ], [ -86.612137, 45.779356 ], [ -86.597661, 45.775385 ], [ -86.583391, 45.778242 ], [ -86.576869, 45.788502 ], [ -86.581071, 45.791802 ], [ -86.581759, 45.794797 ], [ -86.576858, 45.801473 ], [ -86.571172, 45.805452 ], [ -86.563392, 45.804469 ], [ -86.557215, 45.808172 ], [ -86.555547, 45.813499 ], [ -86.559044, 45.822323 ], [ -86.555186, 45.831696 ], [ -86.549723, 45.836039 ], [ -86.545602, 45.836495 ], [ -86.538831, 45.840083 ], [ -86.529208, 45.853043 ], [ -86.528224, 45.856974 ], [ -86.529573, 45.874974 ], [ -86.532989, 45.882665 ], [ -86.541464, 45.890234 ], [ -86.553608, 45.896476 ], [ -86.567719, 45.900500 ], [ -86.583304, 45.898784 ], [ -86.593184, 45.885110 ], [ -86.603293, 45.876626 ], [ -86.613536, 45.875982 ], [ -86.625736, 45.868295 ], [ -86.633168, 45.860068 ], [ -86.632478, 45.843309 ], [ -86.645998, 45.833888 ], [ -86.721113, 45.845431 ], [ -86.728520, 45.848759 ], [ -86.742466, 45.864719 ], [ -86.749638, 45.867796 ], [ -86.758449, 45.867274 ], [ -86.782080, 45.860195 ], [ -86.784177, 45.854641 ], [ -86.782259, 45.829950 ], [ -86.777225, 45.827183 ], [ -86.774612, 45.821696 ], [ -86.773279, 45.811385 ], [ -86.785722, 45.794517 ], [ -86.805524, 45.791275 ], [ -86.801476, 45.780027 ], [ -86.821523, 45.770356 ], [ -86.823743, 45.765486 ], [ -86.820868, 45.760776 ], [ -86.821814, 45.757164 ], [ -86.838658, 45.741831 ], [ -86.841818, 45.729051 ], [ -86.838746, 45.722307 ], [ -86.870392, 45.710087 ], [ -86.876904, 45.711891 ], [ -86.895342, 45.711464 ], [ -86.904089, 45.709546 ], [ -86.921060, 45.697868 ], [ -86.944158, 45.695833 ], [ -86.964275, 45.672761 ], [ -86.966885, 45.675001 ], [ -86.967315, 45.684923 ], [ -86.969765, 45.691895 ], [ -86.981349, 45.696463 ], [ -86.984588, 45.705812 ], [ -86.982413, 45.719873 ], [ -86.977655, 45.728768 ], [ -86.975224, 45.753130 ], [ -86.981341, 45.766160 ], [ -86.981624, 45.792221 ], [ -86.988438, 45.810621 ], [ -87.005080, 45.831718 ], [ -87.018902, 45.838886 ], [ -87.031435, 45.837238 ], [ -87.039842, 45.834245 ], [ -87.052043, 45.821879 ], [ -87.057439, 45.812483 ], [ -87.058844, 45.801510 ], [ -87.058127, 45.779152 ], [ -87.063975, 45.766510 ], [ -87.064302, 45.758828 ], [ -87.062406, 45.753296 ], [ -87.055550, 45.751535 ], [ -87.052908, 45.747983 ], [ -87.057444, 45.736822 ], [ -87.061721, 45.732821 ], [ -87.070442, 45.718779 ], [ -87.059533, 45.708497 ], [ -87.095455, 45.701039 ], [ -87.099401, 45.698614 ], [ -87.099725, 45.695231 ], [ -87.111638, 45.685905 ], [ -87.129412, 45.681710 ], [ -87.172241, 45.661788 ], [ -87.196852, 45.636275 ], [ -87.223647, 45.599338 ], [ -87.234612, 45.588817 ], [ -87.263488, 45.552032 ], [ -87.288726, 45.501606 ], [ -87.306122, 45.475513 ], [ -87.319703, 45.464929 ], [ -87.333147, 45.447208 ], [ -87.334249, 45.442315 ], [ -87.333240, 45.436897 ], [ -87.329958, 45.431937 ], [ -87.325834, 45.430040 ], [ -87.327749, 45.425307 ], [ -87.336152, 45.415360 ], [ -87.350852, 45.407743 ], [ -87.359512, 45.399829 ], [ -87.364368, 45.388532 ], [ -87.392500, 45.369028 ], [ -87.399973, 45.349322 ], [ -87.431684, 45.316383 ], [ -87.437257, 45.305500 ], [ -87.438908, 45.293405 ], [ -87.465201, 45.273351 ], [ -87.512336, 45.224252 ], [ -87.548964, 45.191591 ], [ -87.563417, 45.184070 ], [ -87.585651, 45.166394 ], [ -87.600796, 45.146842 ], [ -87.609280, 45.132320 ], [ -87.612019, 45.123377 ], [ -87.610073, 45.114141 ], [ -87.600120, 45.103011 ], [ -87.590270, 45.096406 ], [ -87.581969, 45.097206 ], [ -87.590208, 45.095264 ] ] ], [ [ [ -86.033174, 45.158420 ], [ -86.005946, 45.155751 ], [ -85.993194, 45.152805 ], [ -85.989412, 45.151069 ], [ -85.976803, 45.138363 ], [ -85.976434, 45.120706 ], [ -85.980433, 45.113046 ], [ -85.984095, 45.087073 ], [ -85.982799, 45.080787 ], [ -85.977082, 45.072993 ], [ -85.960590, 45.062223 ], [ -85.959760, 45.058486 ], [ -85.976883, 45.062660 ], [ -85.997360, 45.055929 ], [ -86.013073, 45.063774 ], [ -86.019874, 45.071665 ], [ -86.037129, 45.086576 ], [ -86.052424, 45.095311 ], [ -86.058653, 45.100776 ], [ -86.060396, 45.104617 ], [ -86.065016, 45.140266 ], [ -86.059393, 45.152291 ], [ -86.050473, 45.158418 ], [ -86.044430, 45.159582 ], [ -86.033174, 45.158420 ] ] ], [ [ [ -86.093536, 45.007838 ], [ -86.115699, 44.999093 ], [ -86.133655, 44.996874 ], [ -86.154824, 45.002394 ], [ -86.156689, 45.010535 ], [ -86.154557, 45.018102 ], [ -86.141644, 45.040251 ], [ -86.138095, 45.043038 ], [ -86.117908, 45.048478 ], [ -86.093166, 45.041492 ], [ -86.079103, 45.030795 ], [ -86.093451, 45.031660 ], [ -86.097094, 45.030128 ], [ -86.100315, 45.026240 ], [ -86.101894, 45.022811 ], [ -86.101214, 45.018101 ], [ -86.093536, 45.007838 ] ] ], [ [ [ -82.415937, 43.005555 ], [ -82.422586, 43.000029 ], [ -82.424206, 42.996938 ], [ -82.424550, 42.993393 ], [ -82.423086, 42.988728 ], [ -82.420346, 42.984451 ], [ -82.412965, 42.977041 ], [ -82.416737, 42.966613 ], [ -82.428603, 42.952001 ], [ -82.447142, 42.937752 ], [ -82.455027, 42.926866 ], [ -82.464040, 42.901456 ], [ -82.469912, 42.887459 ], [ -82.470032, 42.881421 ], [ -82.468220, 42.859107 ], [ -82.468961, 42.852314 ], [ -82.472681, 42.836784 ], [ -82.478640, 42.825187 ], [ -82.482045, 42.808629 ], [ -82.481576, 42.805519 ], [ -82.480394, 42.802272 ], [ -82.471159, 42.784002 ], [ -82.467394, 42.769298 ], [ -82.467483, 42.761910 ], [ -82.483604, 42.733624 ], [ -82.483870, 42.717980 ], [ -82.494491, 42.700823 ], [ -82.510533, 42.665172 ], [ -82.509935, 42.637294 ], [ -82.518782, 42.613888 ], [ -82.523337, 42.607486 ], [ -82.548169, 42.591848 ], [ -82.549717, 42.590338 ], [ -82.554236, 42.583981 ], [ -82.555938, 42.582425 ], [ -82.569801, 42.573551 ], [ -82.577380, 42.567078 ], [ -82.579205, 42.565340 ], [ -82.583996, 42.554041 ], [ -82.589779, 42.550678 ], [ -82.604686, 42.548592 ], [ -82.607068, 42.548843 ], [ -82.611059, 42.550419 ], [ -82.616848, 42.554601 ], [ -82.624907, 42.557229 ], [ -82.633491, 42.557051 ], [ -82.640916, 42.554973 ], [ -82.642680, 42.554333 ], [ -82.648776, 42.550401 ], [ -82.661677, 42.541875 ], [ -82.666596, 42.535084 ], [ -82.679059, 42.522210 ], [ -82.686417, 42.518597 ], [ -82.685397, 42.528659 ], [ -82.679522, 42.535520 ], [ -82.670956, 42.537989 ], [ -82.664335, 42.546244 ], [ -82.680758, 42.557909 ], [ -82.681036, 42.574695 ], [ -82.688061, 42.588417 ], [ -82.701152, 42.585991 ], [ -82.711151, 42.590884 ], [ -82.713042, 42.597904 ], [ -82.700818, 42.606687 ], [ -82.683482, 42.609433 ], [ -82.681593, 42.618672 ], [ -82.690124, 42.625033 ], [ -82.689836, 42.627148 ], [ -82.669103, 42.637225 ], [ -82.645715, 42.631145 ], [ -82.630922, 42.642110 ], [ -82.626396, 42.647385 ], [ -82.623043, 42.655951 ], [ -82.623797, 42.665395 ], [ -82.630851, 42.673341 ], [ -82.635262, 42.675552 ], [ -82.659781, 42.678618 ], [ -82.674287, 42.687049 ], [ -82.685500, 42.690036 ], [ -82.700964, 42.689548 ], [ -82.706135, 42.683578 ], [ -82.726366, 42.682768 ], [ -82.753317, 42.669732 ], [ -82.765583, 42.655725 ], [ -82.780817, 42.652232 ], [ -82.792418, 42.655132 ], [ -82.797318, 42.654032 ], [ -82.813518, 42.640833 ], [ -82.820118, 42.626333 ], [ -82.819017, 42.616333 ], [ -82.811017, 42.610933 ], [ -82.789017, 42.603434 ], [ -82.771844, 42.595517 ], [ -82.769590, 42.593380 ], [ -82.788612, 42.588501 ], [ -82.788116, 42.582835 ], [ -82.781514, 42.571634 ], [ -82.782414, 42.564834 ], [ -82.784514, 42.563634 ], [ -82.789114, 42.568434 ], [ -82.796715, 42.571034 ], [ -82.821016, 42.570734 ], [ -82.834216, 42.567849 ], [ -82.845916, 42.560634 ], [ -82.849316, 42.555734 ], [ -82.851016, 42.548935 ], [ -82.859316, 42.541935 ], [ -82.874416, 42.523535 ], [ -82.882316, 42.501035 ], [ -82.883915, 42.471836 ], [ -82.870347, 42.450888 ], [ -82.886113, 42.408137 ], [ -82.888413, 42.398237 ], [ -82.894013, 42.389437 ], [ -82.898413, 42.385437 ], [ -82.915114, 42.378137 ], [ -82.919114, 42.374437 ], [ -82.928815, 42.359437 ], [ -82.923970, 42.352068 ], [ -82.945415, 42.347337 ], [ -82.959416, 42.339638 ], [ -82.988619, 42.332439 ], [ -83.018320, 42.329739 ], [ -83.064121, 42.317738 ], [ -83.079721, 42.308638 ], [ -83.096521, 42.290138 ], [ -83.110922, 42.260638 ], [ -83.128022, 42.238839 ], [ -83.133923, 42.174740 ], [ -83.121323, 42.125742 ], [ -83.133511, 42.088143 ], [ -83.157624, 42.085542 ], [ -83.168759, 42.073601 ], [ -83.188598, 42.066431 ], [ -83.189115, 42.061853 ], [ -83.186877, 42.061206 ], [ -83.185526, 42.052243 ], [ -83.188240, 42.031329 ], [ -83.185858, 42.029451 ], [ -83.170890, 42.022403 ], [ -83.170890, 42.015185 ], [ -83.193918, 41.997656 ], [ -83.212479, 41.988720 ], [ -83.216897, 41.988561 ], [ -83.223354, 41.989191 ], [ -83.228502, 41.987291 ], [ -83.249204, 41.972402 ], [ -83.257009, 41.959686 ], [ -83.257292, 41.950745 ], [ -83.253552, 41.944897 ], [ -83.264550, 41.929086 ], [ -83.270484, 41.939335 ], [ -83.287130, 41.944397 ], [ -83.295982, 41.944742 ], [ -83.302904, 41.943073 ], [ -83.315859, 41.935893 ], [ -83.326024, 41.924961 ], [ -83.333642, 41.907261 ], [ -83.335961, 41.889721 ], [ -83.341557, 41.879956 ], [ -83.359467, 41.867849 ], [ -83.366187, 41.865505 ], [ -83.372445, 41.874477 ], [ -83.381955, 41.870877 ], [ -83.396220, 41.852965 ], [ -83.409596, 41.830325 ], [ -83.422316, 41.822278 ], [ -83.434204, 41.818562 ], [ -83.439612, 41.813162 ], [ -83.441668, 41.808646 ], [ -83.443364, 41.789118 ], [ -83.437516, 41.769694 ], [ -83.427308, 41.750214 ], [ -83.424076, 41.740738 ], [ -83.434360, 41.737058 ], [ -83.451897, 41.734486 ], [ -83.453832, 41.732647 ], [ -83.497733, 41.731847 ], [ -83.499733, 41.731647 ], [ -83.503433, 41.731547 ], [ -83.504334, 41.731547 ], [ -83.585235, 41.729348 ], [ -83.593835, 41.729148 ], [ -83.595235, 41.729148 ], [ -83.636636, 41.727849 ], [ -83.639636, 41.727749 ], [ -83.665937, 41.726949 ], [ -83.685337, 41.726449 ], [ -83.708937, 41.725150 ], [ -83.763038, 41.723550 ], [ -83.859541, 41.721250 ], [ -83.880539, 41.720081 ], [ -83.899764, 41.719961 ], [ -83.998849, 41.716822 ], [ -84.019373, 41.716668 ], [ -84.134417, 41.712931 ], [ -84.360546, 41.706621 ], [ -84.396547, 41.705935 ], [ -84.438067, 41.704903 ], [ -84.749955, 41.698245 ], [ -84.806082, 41.696089 ], [ -84.806018, 41.707485 ], [ -84.806042, 41.720544 ], [ -84.806065, 41.732909 ], [ -84.806074, 41.737603 ], [ -84.806134, 41.743115 ], [ -84.805883, 41.760216 ], [ -84.818873, 41.760059 ], [ -84.825196, 41.759990 ], [ -84.932484, 41.759691 ], [ -84.960860, 41.759438 ], [ -84.961562, 41.759552 ], [ -84.971551, 41.759527 ], [ -84.972803, 41.759366 ], [ -85.037817, 41.759801 ], [ -85.039436, 41.759985 ], [ -85.117267, 41.759700 ], [ -85.123102, 41.759743 ], [ -85.172230, 41.759618 ], [ -85.196637, 41.759735 ], [ -85.232835, 41.759839 ], [ -85.272216, 41.759999 ], [ -85.272951, 41.759911 ], [ -85.273713, 41.759770 ], [ -85.292099, 41.759962 ], [ -85.298365, 41.760028 ], [ -85.308140, 41.760097 ], [ -85.318129, 41.759983 ], [ -85.330623, 41.759982 ], [ -85.350174, 41.759908 ], [ -85.379133, 41.759875 ], [ -85.427553, 41.759706 ], [ -85.432471, 41.759684 ], [ -85.515959, 41.759352 ], [ -85.518251, 41.759513 ], [ -85.607548, 41.759079 ], [ -85.608312, 41.759193 ], [ -85.622608, 41.759049 ], [ -85.624987, 41.759093 ], [ -85.632714, 41.759164 ], [ -85.647683, 41.759125 ], [ -85.650738, 41.759103 ], [ -85.724534, 41.759085 ], [ -85.749992, 41.759091 ], [ -85.750469, 41.759090 ], [ -85.775039, 41.759147 ], [ -85.791363, 41.759051 ], [ -85.872041, 41.759365 ], [ -85.874997, 41.759341 ], [ -85.888825, 41.759422 ], [ -85.974901, 41.759849 ], [ -85.974980, 41.759849 ], [ -85.991302, 41.759949 ], [ -86.041027, 41.760512 ], [ -86.125060, 41.760576 ], [ -86.125460, 41.760560 ], [ -86.127844, 41.760592 ], [ -86.217590, 41.760016 ], [ -86.226070, 41.760016 ], [ -86.265496, 41.760207 ], [ -86.501773, 41.759553 ], [ -86.519318, 41.759447 ], [ -86.640044, 41.759671 ], [ -86.641186, 41.759633 ], [ -86.746521, 41.759982 ], [ -86.748096, 41.759967 ], [ -86.800611, 41.760251 ], [ -86.800707, 41.760240 ], [ -86.801578, 41.760240 ], [ -86.804427, 41.760240 ], [ -86.823628, 41.760240 ], [ -86.824828, 41.760240 ], [ -86.777227, 41.784740 ], [ -86.717037, 41.819349 ], [ -86.679355, 41.844793 ], [ -86.619442, 41.893827 ], [ -86.597899, 41.918291 ], [ -86.582197, 41.942241 ], [ -86.556421, 42.000042 ], [ -86.501322, 42.084540 ], [ -86.490122, 42.105139 ], [ -86.485223, 42.118239 ], [ -86.466262, 42.134406 ], [ -86.404146, 42.196379 ], [ -86.385179, 42.217279 ], [ -86.356218, 42.254166 ], [ -86.321803, 42.310743 ], [ -86.297168, 42.358207 ], [ -86.284448, 42.394563 ], [ -86.284969, 42.401814 ], [ -86.276878, 42.413317 ], [ -86.261573, 42.443894 ], [ -86.249710, 42.480212 ], [ -86.240642, 42.540000 ], [ -86.235280, 42.564958 ], [ -86.228082, 42.583397 ], [ -86.225613, 42.594765 ], [ -86.229050, 42.637693 ], [ -86.226638, 42.644922 ], [ -86.216020, 42.664413 ], [ -86.208654, 42.692090 ], [ -86.206834, 42.719424 ], [ -86.208309, 42.762789 ], [ -86.210863, 42.783832 ], [ -86.211815, 42.833236 ], [ -86.210737, 42.859128 ], [ -86.214138, 42.883555 ], [ -86.216209, 42.919007 ], [ -86.226305, 42.988284 ], [ -86.232707, 43.015762 ], [ -86.244277, 43.049681 ], [ -86.250069, 43.057489 ], [ -86.250517, 43.066993 ], [ -86.254646, 43.083409 ], [ -86.280756, 43.136015 ], [ -86.316259, 43.195114 ], [ -86.395750, 43.316225 ], [ -86.407832, 43.338436 ], [ -86.435124, 43.396702 ], [ -86.448743, 43.432013 ], [ -86.468747, 43.491963 ], [ -86.479276, 43.515335 ], [ -86.520205, 43.576718 ], [ -86.529507, 43.593462 ], [ -86.538497, 43.617501 ], [ -86.540916, 43.633158 ], [ -86.540787, 43.644593 ], [ -86.538482, 43.658795 ], [ -86.529179, 43.677889 ], [ -86.510319, 43.698625 ], [ -86.481854, 43.725135 ], [ -86.461554, 43.746685 ], [ -86.445123, 43.771564 ], [ -86.437391, 43.789334 ], [ -86.431043, 43.815975 ], [ -86.431198, 43.840720 ], [ -86.433915, 43.855608 ], [ -86.445455, 43.889726 ], [ -86.447915, 43.918089 ], [ -86.463136, 43.970976 ], [ -86.483331, 44.001179 ], [ -86.501738, 44.021912 ], [ -86.508827, 44.032755 ], [ -86.514742, 44.047920 ], [ -86.514702, 44.058119 ], [ -86.508764, 44.067881 ], [ -86.500453, 44.075607 ], [ -86.446883, 44.105970 ], [ -86.429871, 44.119782 ], [ -86.421108, 44.129480 ], [ -86.400645, 44.156848 ], [ -86.380062, 44.189472 ], [ -86.362847, 44.208113 ], [ -86.351638, 44.229429 ], [ -86.343793, 44.249608 ], [ -86.327287, 44.263057 ], [ -86.316025, 44.284210 ], [ -86.300264, 44.308197 ], [ -86.268710, 44.345324 ], [ -86.251926, 44.400984 ], [ -86.248083, 44.420946 ], [ -86.248320, 44.434758 ], [ -86.251843, 44.451632 ], [ -86.251605, 44.465443 ], [ -86.248914, 44.483004 ], [ -86.243745, 44.488929 ], [ -86.238743, 44.501682 ], [ -86.223788, 44.549043 ], [ -86.220697, 44.566742 ], [ -86.225450, 44.594590 ], [ -86.231828, 44.609107 ], [ -86.253950, 44.648080 ], [ -86.259029, 44.663654 ], [ -86.256796, 44.686769 ], [ -86.254996, 44.691935 ], [ -86.248474, 44.699046 ], [ -86.232482, 44.706050 ], [ -86.172201, 44.720623 ], [ -86.160268, 44.728189 ], [ -86.121125, 44.727972 ], [ -86.106182, 44.731088 ], [ -86.089186, 44.741496 ], [ -86.077933, 44.758234 ], [ -86.073506, 44.769803 ], [ -86.071746, 44.804717 ], [ -86.065966, 44.821522 ], [ -86.066031, 44.834852 ], [ -86.071112, 44.865420 ], [ -86.072468, 44.884788 ], [ -86.070990, 44.895876 ], [ -86.066745, 44.905685 ], [ -86.058862, 44.911012 ], [ -86.038332, 44.915696 ], [ -86.031194, 44.907349 ], [ -86.021513, 44.902774 ], [ -86.009355, 44.899454 ], [ -85.992535, 44.900026 ], [ -85.980219, 44.906136 ], [ -85.972824, 44.914781 ], [ -85.967169, 44.929484 ], [ -85.961603, 44.935567 ], [ -85.952721, 44.940758 ], [ -85.942099, 44.954317 ], [ -85.938589, 44.964559 ], [ -85.931600, 44.968788 ], [ -85.915851, 44.968307 ], [ -85.897626, 44.962014 ], [ -85.891543, 44.957783 ], [ -85.879934, 44.943305 ], [ -85.869852, 44.939031 ], [ -85.854304, 44.938147 ], [ -85.836150, 44.940256 ], [ -85.815451, 44.945631 ], [ -85.807403, 44.949814 ], [ -85.780439, 44.977932 ], [ -85.778278, 44.983075 ], [ -85.776207, 45.000574 ], [ -85.771395, 45.015181 ], [ -85.761943, 45.023454 ], [ -85.746444, 45.051229 ], [ -85.740836, 45.055575 ], [ -85.712262, 45.065622 ], [ -85.695715, 45.076461 ], [ -85.681096, 45.092693 ], [ -85.675671, 45.105540 ], [ -85.674861, 45.116216 ], [ -85.656024, 45.145788 ], [ -85.618639, 45.186771 ], [ -85.613174, 45.184624 ], [ -85.611684, 45.181104 ], [ -85.606963, 45.178477 ], [ -85.593064, 45.178527 ], [ -85.585986, 45.180381 ], [ -85.564654, 45.192546 ], [ -85.561809, 45.200524 ], [ -85.551072, 45.210742 ], [ -85.540497, 45.210169 ], [ -85.526734, 45.189316 ], [ -85.531461, 45.177247 ], [ -85.536892, 45.173385 ], [ -85.552179, 45.167352 ], [ -85.561680, 45.158940 ], [ -85.554083, 45.142568 ], [ -85.558373, 45.133209 ], [ -85.564612, 45.137498 ], [ -85.564612, 45.147247 ], [ -85.570178, 45.155145 ], [ -85.573893, 45.155488 ], [ -85.590434, 45.153175 ], [ -85.599801, 45.149286 ], [ -85.614319, 45.127562 ], [ -85.609266, 45.113510 ], [ -85.595029, 45.103962 ], [ -85.597496, 45.094454 ], [ -85.583198, 45.071304 ], [ -85.573353, 45.068382 ], [ -85.566066, 45.059201 ], [ -85.566130, 45.043633 ], [ -85.570160, 45.041278 ], [ -85.573976, 45.043361 ], [ -85.597181, 45.040547 ], [ -85.599652, 45.021749 ], [ -85.609123, 45.013103 ], [ -85.621878, 45.004529 ], [ -85.606588, 44.990662 ], [ -85.604301, 44.990983 ], [ -85.602356, 44.974272 ], [ -85.602034, 44.926743 ], [ -85.621403, 44.923123 ], [ -85.625497, 44.921107 ], [ -85.639842, 44.890255 ], [ -85.645456, 44.883645 ], [ -85.648932, 44.874010 ], [ -85.652355, 44.849092 ], [ -85.651435, 44.831624 ], [ -85.641652, 44.810816 ], [ -85.637000, 44.790078 ], [ -85.640781, 44.775561 ], [ -85.636097, 44.771329 ], [ -85.627982, 44.767508 ], [ -85.610776, 44.765160 ], [ -85.599256, 44.765919 ], [ -85.593571, 44.768783 ], [ -85.590985, 44.783914 ], [ -85.581717, 44.807784 ], [ -85.545891, 44.864024 ], [ -85.532931, 44.873190 ], [ -85.530649, 44.889763 ], [ -85.553509, 44.890924 ], [ -85.559524, 44.888113 ], [ -85.564509, 44.895246 ], [ -85.539703, 44.916779 ], [ -85.533553, 44.925762 ], [ -85.520205, 44.960347 ], [ -85.522100, 44.966727 ], [ -85.520034, 44.973996 ], [ -85.492600, 44.989834 ], [ -85.475204, 44.991053 ], [ -85.470462, 44.980745 ], [ -85.464944, 44.961062 ], [ -85.466650, 44.958844 ], [ -85.472258, 44.959391 ], [ -85.485740, 44.953626 ], [ -85.491286, 44.927585 ], [ -85.492490, 44.908220 ], [ -85.488624, 44.901707 ], [ -85.498007, 44.865451 ], [ -85.502182, 44.855802 ], [ -85.508617, 44.847872 ], [ -85.519096, 44.845339 ], [ -85.539924, 44.834166 ], [ -85.555894, 44.818256 ], [ -85.560231, 44.810072 ], [ -85.560488, 44.789679 ], [ -85.576566, 44.760208 ], [ -85.571301, 44.755293 ], [ -85.554326, 44.748744 ], [ -85.538285, 44.746821 ], [ -85.527216, 44.748235 ], [ -85.504775, 44.768082 ], [ -85.503935, 44.772951 ], [ -85.505244, 44.781594 ], [ -85.509251, 44.787334 ], [ -85.499591, 44.803838 ], [ -85.474796, 44.814959 ], [ -85.462916, 44.825067 ], [ -85.460445, 44.835667 ], [ -85.425804, 44.881646 ], [ -85.423003, 44.895019 ], [ -85.406173, 44.911773 ], [ -85.395800, 44.931018 ], [ -85.378286, 44.998587 ], [ -85.381654, 45.018407 ], [ -85.380659, 45.046319 ], [ -85.377586, 45.055713 ], [ -85.366412, 45.069023 ], [ -85.366908, 45.116938 ], [ -85.372571, 45.126241 ], [ -85.376948, 45.142881 ], [ -85.380464, 45.180876 ], [ -85.386726, 45.189497 ], [ -85.388593, 45.235240 ], [ -85.371593, 45.270834 ], [ -85.355478, 45.282774 ], [ -85.335016, 45.294027 ], [ -85.323941, 45.303355 ], [ -85.307646, 45.313140 ], [ -85.294848, 45.316408 ], [ -85.289568, 45.314052 ], [ -85.273789, 45.315443 ], [ -85.262996, 45.319507 ], [ -85.255050, 45.325675 ], [ -85.252193, 45.330863 ], [ -85.235629, 45.339374 ], [ -85.209673, 45.356937 ], [ -85.196704, 45.360641 ], [ -85.182471, 45.360824 ], [ -85.143651, 45.370369 ], [ -85.054805, 45.364091 ], [ -85.043101, 45.361506 ], [ -85.032813, 45.361251 ], [ -85.022234, 45.366701 ], [ -84.959119, 45.375973 ], [ -84.915850, 45.393115 ], [ -84.912537, 45.402828 ], [ -84.912956, 45.409776 ], [ -84.916165, 45.417639 ], [ -84.922006, 45.421914 ], [ -84.980953, 45.429382 ], [ -84.990041, 45.427618 ], [ -84.990785, 45.425264 ], [ -84.983836, 45.420764 ], [ -84.977116, 45.420035 ], [ -84.978608, 45.418663 ], [ -85.040936, 45.436701 ], [ -85.069573, 45.459239 ], [ -85.088386, 45.476928 ], [ -85.109252, 45.521626 ], [ -85.115479, 45.539406 ], [ -85.119737, 45.569026 ], [ -85.118637, 45.575175 ], [ -85.111909, 45.585829 ], [ -85.093525, 45.600121 ], [ -85.079528, 45.617083 ], [ -85.075686, 45.623688 ], [ -85.074910, 45.629242 ], [ -85.061488, 45.639505 ], [ -85.015341, 45.651564 ], [ -85.007026, 45.656360 ], [ -85.001154, 45.661225 ], [ -84.996336, 45.669685 ], [ -84.992958, 45.679983 ], [ -84.987847, 45.682997 ], [ -84.975768, 45.683174 ], [ -84.970950, 45.686334 ], [ -84.943756, 45.710290 ], [ -84.940526, 45.721832 ], [ -84.942125, 45.728460 ], [ -84.950840, 45.736893 ], [ -84.982328, 45.751960 ], [ -85.002914, 45.753940 ], [ -85.048441, 45.760807 ], [ -85.074563, 45.762182 ], [ -85.077313, 45.765619 ], [ -85.049129, 45.770431 ], [ -85.030568, 45.769056 ], [ -85.007410, 45.763168 ], [ -84.995105, 45.759855 ], [ -84.938312, 45.759892 ], [ -84.924664, 45.756897 ], [ -84.910398, 45.750010 ], [ -84.866976, 45.752066 ], [ -84.840981, 45.744751 ], [ -84.806642, 45.746171 ], [ -84.799558, 45.747130 ], [ -84.788821, 45.752283 ], [ -84.781373, 45.761080 ], [ -84.779800, 45.769650 ], [ -84.792337, 45.778497 ], [ -84.793153, 45.780463 ], [ -84.780313, 45.787224 ], [ -84.772765, 45.789301 ], [ -84.751571, 45.782733 ], [ -84.742000, 45.784134 ], [ -84.734065, 45.788205 ], [ -84.726192, 45.786905 ], [ -84.718904, 45.777599 ], [ -84.715996, 45.766174 ], [ -84.681967, 45.756197 ], [ -84.679546, 45.749095 ], [ -84.644822, 45.739990 ], [ -84.604712, 45.721668 ], [ -84.573631, 45.710381 ], [ -84.555496, 45.702268 ], [ -84.553311, 45.698566 ], [ -84.538998, 45.690383 ], [ -84.461680, 45.652404 ], [ -84.442348, 45.654771 ], [ -84.435415, 45.664106 ], [ -84.427495, 45.669201 ], [ -84.413642, 45.669427 ], [ -84.400283, 45.663345 ], [ -84.376403, 45.655565 ], [ -84.329537, 45.664380 ], [ -84.289685, 45.653296 ], [ -84.270238, 45.644790 ], [ -84.215268, 45.634767 ], [ -84.196043, 45.621456 ], [ -84.180514, 45.604639 ], [ -84.157121, 45.585305 ], [ -84.139462, 45.573714 ], [ -84.128867, 45.562284 ], [ -84.126532, 45.556616 ], [ -84.126971, 45.542428 ], [ -84.122309, 45.523788 ], [ -84.116687, 45.513050 ], [ -84.109238, 45.505171 ], [ -84.095905, 45.497298 ], [ -84.075792, 45.490537 ], [ -84.056138, 45.489349 ], [ -84.039958, 45.493733 ], [ -84.036286, 45.496245 ], [ -84.028813, 45.497225 ], [ -84.009582, 45.495069 ], [ -83.998350, 45.491158 ], [ -83.978017, 45.494138 ], [ -83.939261, 45.493189 ], [ -83.909472, 45.485784 ], [ -83.881813, 45.467907 ], [ -83.858560, 45.446865 ], [ -83.841543, 45.435287 ], [ -83.806622, 45.419159 ], [ -83.788777, 45.416415 ], [ -83.773171, 45.417302 ], [ -83.755569, 45.411034 ], [ -83.737321, 45.410943 ], [ -83.721815, 45.413304 ], [ -83.697316, 45.396239 ], [ -83.667934, 45.384675 ], [ -83.643790, 45.371710 ], [ -83.599273, 45.352561 ], [ -83.570361, 45.347198 ], [ -83.550268, 45.350832 ], [ -83.546799, 45.352637 ], [ -83.545729, 45.358397 ], [ -83.538306, 45.358167 ], [ -83.520258, 45.347239 ], [ -83.514717, 45.346460 ], [ -83.496704, 45.357536 ], [ -83.488826, 45.355872 ], [ -83.477794, 45.341891 ], [ -83.445672, 45.310612 ], [ -83.433040, 45.303688 ], [ -83.425140, 45.296808 ], [ -83.422389, 45.290775 ], [ -83.401091, 45.279572 ], [ -83.388274, 45.276916 ], [ -83.385104, 45.274195 ], [ -83.381743, 45.268983 ], [ -83.388034, 45.254976 ], [ -83.412569, 45.245807 ], [ -83.412410, 45.238905 ], [ -83.405914, 45.227157 ], [ -83.384265, 45.203472 ], [ -83.381647, 45.203357 ], [ -83.368896, 45.182168 ], [ -83.368046, 45.172478 ], [ -83.363678, 45.166469 ], [ -83.359895, 45.163020 ], [ -83.348684, 45.161516 ], [ -83.337822, 45.147120 ], [ -83.316118, 45.141958 ], [ -83.315924, 45.139992 ], [ -83.319315, 45.137684 ], [ -83.318442, 45.128930 ], [ -83.307880, 45.099093 ], [ -83.298275, 45.090483 ], [ -83.290827, 45.069157 ], [ -83.291346, 45.062597 ], [ -83.280272, 45.045962 ], [ -83.277037, 45.044767 ], [ -83.271464, 45.038114 ], [ -83.265896, 45.026844 ], [ -83.271506, 45.023417 ], [ -83.287974, 45.026462 ], [ -83.302153, 45.032315 ], [ -83.340257, 45.041545 ], [ -83.357609, 45.050613 ], [ -83.367470, 45.062268 ], [ -83.399255, 45.070364 ], [ -83.433798, 45.057616 ], [ -83.442052, 45.051056 ], [ -83.453363, 45.035331 ], [ -83.454168, 45.031880 ], [ -83.446342, 45.016655 ], [ -83.435249, 45.011883 ], [ -83.431254, 45.007998 ], [ -83.435822, 45.000012 ], [ -83.438948, 45.000011 ], [ -83.450013, 44.990219 ], [ -83.443718, 44.952247 ], [ -83.438856, 44.940843 ], [ -83.433032, 44.932890 ], [ -83.425311, 44.926741 ], [ -83.404596, 44.918761 ], [ -83.398879, 44.906417 ], [ -83.393960, 44.903056 ], [ -83.352815, 44.886164 ], [ -83.320503, 44.880571 ], [ -83.312903, 44.884191 ], [ -83.314966, 44.868380 ], [ -83.321241, 44.852962 ], [ -83.314429, 44.842220 ], [ -83.300648, 44.829831 ], [ -83.299736, 44.823359 ], [ -83.290906, 44.807888 ], [ -83.295718, 44.784516 ], [ -83.288844, 44.765955 ], [ -83.298287, 44.754907 ], [ -83.297300, 44.746134 ], [ -83.290665, 44.729265 ], [ -83.284128, 44.721766 ], [ -83.273393, 44.713901 ], [ -83.276836, 44.689354 ], [ -83.289442, 44.652968 ], [ -83.307504, 44.629816 ], [ -83.314517, 44.608725 ], [ -83.315603, 44.595079 ], [ -83.313649, 44.564588 ], [ -83.308918, 44.548360 ], [ -83.308471, 44.539902 ], [ -83.318279, 44.514416 ], [ -83.317610, 44.486058 ], [ -83.326824, 44.444411 ], [ -83.327171, 44.429234 ], [ -83.324616, 44.415039 ], [ -83.321553, 44.409119 ], [ -83.321648, 44.404502 ], [ -83.333757, 44.372486 ], [ -83.335248, 44.357995 ], [ -83.332533, 44.340464 ], [ -83.336988, 44.332919 ], [ -83.343738, 44.329763 ], [ -83.352115, 44.332366 ], [ -83.364312, 44.332590 ], [ -83.373607, 44.327784 ], [ -83.401822, 44.301831 ], [ -83.414301, 44.294543 ], [ -83.419236, 44.287800 ], [ -83.425762, 44.272487 ], [ -83.445176, 44.252823 ], [ -83.465111, 44.245949 ], [ -83.442731, 44.265361 ], [ -83.445805, 44.273378 ], [ -83.463049, 44.278838 ], [ -83.479531, 44.280090 ], [ -83.500392, 44.276610 ], [ -83.508839, 44.273711 ], [ -83.524817, 44.261558 ], [ -83.537710, 44.248171 ], [ -83.549096, 44.227282 ], [ -83.552872, 44.210718 ], [ -83.553834, 44.197956 ], [ -83.567744, 44.155899 ], [ -83.568915, 44.126734 ], [ -83.567714, 44.119652 ], [ -83.573071, 44.101298 ], [ -83.588004, 44.086758 ], [ -83.591361, 44.079237 ], [ -83.590437, 44.069569 ], [ -83.584090, 44.056748 ], [ -83.601173, 44.054686 ], [ -83.621078, 44.056186 ], [ -83.650116, 44.052404 ], [ -83.679654, 44.036365 ], [ -83.687892, 44.020709 ], [ -83.680108, 43.994196 ], [ -83.743806, 43.991529 ], [ -83.746779, 43.988807 ], [ -83.763774, 43.985158 ], [ -83.787863, 43.985279 ], [ -83.829077, 43.989095 ], [ -83.848276, 43.981594 ], [ -83.854930, 43.977067 ], [ -83.856128, 43.972632 ], [ -83.869406, 43.960719 ], [ -83.877694, 43.959235 ], [ -83.885328, 43.946691 ], [ -83.890145, 43.934672 ], [ -83.890912, 43.923314 ], [ -83.907388, 43.918062 ], [ -83.916815, 43.899050 ], [ -83.917875, 43.856509 ], [ -83.926345, 43.787398 ], [ -83.929375, 43.777091 ], [ -83.945426, 43.759946 ], [ -83.954792, 43.760932 ], [ -83.956021, 43.759286 ], [ -83.954347, 43.750647 ], [ -83.939297, 43.715369 ], [ -83.909479, 43.672622 ], [ -83.897078, 43.664022 ], [ -83.852076, 43.644922 ], [ -83.844118, 43.652896 ], [ -83.838160, 43.654384 ], [ -83.814674, 43.643022 ], [ -83.806774, 43.641221 ], [ -83.778919, 43.630056 ], [ -83.770693, 43.628691 ], [ -83.769886, 43.634924 ], [ -83.725793, 43.618691 ], [ -83.703446, 43.597646 ], [ -83.669795, 43.590790 ], [ -83.666052, 43.591292 ], [ -83.654192, 43.599290 ], [ -83.618602, 43.628891 ], [ -83.595579, 43.650249 ], [ -83.563157, 43.684564 ], [ -83.553707, 43.685432 ], [ -83.549044, 43.693798 ], [ -83.551470, 43.699901 ], [ -83.540187, 43.708746 ], [ -83.524837, 43.716948 ], [ -83.515853, 43.718157 ], [ -83.513461, 43.714607 ], [ -83.506657, 43.710907 ], [ -83.480070, 43.714636 ], [ -83.470053, 43.723418 ], [ -83.465080, 43.733843 ], [ -83.459628, 43.740931 ], [ -83.440171, 43.761694 ], [ -83.438878, 43.767135 ], [ -83.441591, 43.770175 ], [ -83.446752, 43.771860 ], [ -83.438311, 43.786846 ], [ -83.426068, 43.799915 ], [ -83.416378, 43.801034 ], [ -83.411453, 43.805033 ], [ -83.410663, 43.807730 ], [ -83.428481, 43.817907 ], [ -83.442917, 43.811033 ], [ -83.471788, 43.789723 ], [ -83.480725, 43.791786 ], [ -83.448416, 43.861902 ], [ -83.427794, 43.861215 ], [ -83.425732, 43.849529 ], [ -83.417483, 43.841967 ], [ -83.404422, 43.841280 ], [ -83.384487, 43.854340 ], [ -83.358869, 43.857395 ], [ -83.332270, 43.880522 ], [ -83.331788, 43.893901 ], [ -83.333532, 43.898520 ], [ -83.340976, 43.904541 ], [ -83.403047, 43.910709 ], [ -83.400985, 43.916208 ], [ -83.338067, 43.915687 ], [ -83.318656, 43.917620 ], [ -83.305690, 43.922489 ], [ -83.282310, 43.938031 ], [ -83.268980, 43.956132 ], [ -83.261850, 43.969021 ], [ -83.261530, 43.973525 ], [ -83.227093, 43.981003 ], [ -83.195688, 43.983137 ], [ -83.180618, 43.982109 ], [ -83.145407, 43.989441 ], [ -83.134881, 43.993147 ], [ -83.120659, 44.000950 ], [ -83.107820, 44.003245 ], [ -83.079297, 44.001079 ], [ -83.066026, 44.003366 ], [ -83.058741, 44.006224 ], [ -83.046577, 44.015710 ], [ -83.029868, 44.041175 ], [ -83.024604, 44.045174 ], [ -82.999283, 44.046510 ], [ -82.990728, 44.048846 ], [ -82.967439, 44.066138 ], [ -82.958688, 44.065774 ], [ -82.956658, 44.063306 ], [ -82.947368, 44.062187 ], [ -82.928884, 44.069389 ], [ -82.915976, 44.070503 ], [ -82.889831, 44.050952 ], [ -82.875889, 44.045046 ], [ -82.833103, 44.036851 ], [ -82.793205, 44.023247 ], [ -82.788298, 44.013712 ], [ -82.783198, 44.009366 ], [ -82.765018, 44.006845 ], [ -82.746255, 43.996037 ], [ -82.738992, 43.989506 ], [ -82.728528, 43.972615 ], [ -82.712235, 43.949610 ], [ -82.709839, 43.948226 ], [ -82.693505, 43.917980 ], [ -82.678642, 43.883730 ], [ -82.655450, 43.867883 ], [ -82.643166, 43.852468 ], [ -82.642899, 43.846419 ], [ -82.647467, 43.844490 ], [ -82.647784, 43.842684 ], [ -82.644345, 43.837539 ], [ -82.633641, 43.831224 ], [ -82.617955, 43.768596 ], [ -82.619079, 43.756088 ], [ -82.617213, 43.746788 ], [ -82.612224, 43.739771 ], [ -82.604830, 43.678884 ], [ -82.605783, 43.669489 ], [ -82.600500, 43.602935 ], [ -82.597911, 43.590016 ], [ -82.593785, 43.581467 ], [ -82.585654, 43.543969 ], [ -82.565691, 43.502904 ], [ -82.565505, 43.497063 ], [ -82.553540, 43.464111 ], [ -82.539517, 43.437539 ], [ -82.538578, 43.431594 ], [ -82.539930, 43.422378 ], [ -82.535627, 43.368062 ], [ -82.536794, 43.348510 ], [ -82.530128, 43.333805 ], [ -82.529416, 43.316243 ], [ -82.532396, 43.305770 ], [ -82.523086, 43.225361 ], [ -82.519123, 43.212737 ], [ -82.508881, 43.196748 ], [ -82.501656, 43.161656 ], [ -82.494194, 43.143736 ], [ -82.490614, 43.118172 ], [ -82.486042, 43.102486 ], [ -82.471053, 43.087581 ], [ -82.457221, 43.061285 ], [ -82.422768, 43.007956 ], [ -82.415937, 43.005555 ] ] ], [ [ [ -83.436745, 44.021656 ], [ -83.442245, 44.028530 ], [ -83.441551, 44.038841 ], [ -83.425743, 44.028530 ], [ -83.436745, 44.021656 ] ] ], [ [ [ -83.414047, 43.877026 ], [ -83.427109, 43.877026 ], [ -83.436729, 43.882526 ], [ -83.432610, 43.885273 ], [ -83.414047, 43.877026 ] ] ], [ [ [ -87.600342, 47.407711 ], [ -87.617531, 47.407711 ], [ -87.629898, 47.415272 ], [ -87.650520, 47.416649 ], [ -87.623718, 47.426960 ], [ -87.585907, 47.419399 ], [ -87.600342, 47.407711 ] ] ], [ [ [ -83.761154, 46.086082 ], [ -83.784348, 46.090248 ], [ -83.805168, 46.092033 ], [ -83.821236, 46.091438 ], [ -83.828964, 46.096790 ], [ -83.828964, 46.102741 ], [ -83.817070, 46.111069 ], [ -83.803978, 46.109879 ], [ -83.787323, 46.108093 ], [ -83.774239, 46.097980 ], [ -83.763527, 46.093815 ], [ -83.758179, 46.090248 ], [ -83.761154, 46.086082 ] ] ], [ [ [ -83.973450, 46.065285 ], [ -84.003006, 46.079033 ], [ -84.012634, 46.087280 ], [ -84.005760, 46.097591 ], [ -83.987885, 46.103779 ], [ -83.974136, 46.073532 ], [ -83.973450, 46.065285 ] ] ], [ [ [ -83.853355, 46.050987 ], [ -83.858116, 46.055149 ], [ -83.858116, 46.062885 ], [ -83.858711, 46.067047 ], [ -83.865845, 46.069427 ], [ -83.871201, 46.075970 ], [ -83.864059, 46.083702 ], [ -83.852760, 46.085487 ], [ -83.847404, 46.082516 ], [ -83.840271, 46.071808 ], [ -83.839081, 46.064072 ], [ -83.846214, 46.051582 ], [ -83.853355, 46.050987 ] ] ], [ [ [ -83.749252, 46.034328 ], [ -83.758774, 46.036114 ], [ -83.763527, 46.043846 ], [ -83.770180, 46.043228 ], [ -83.773781, 46.051472 ], [ -83.764122, 46.065857 ], [ -83.749847, 46.065857 ], [ -83.733192, 46.053364 ], [ -83.732002, 46.048012 ], [ -83.737358, 46.043846 ], [ -83.743896, 46.035519 ], [ -83.749252, 46.034328 ] ] ], [ [ [ -84.638847, 45.955563 ], [ -84.640915, 45.971375 ], [ -84.639633, 45.977913 ], [ -84.634041, 45.980309 ], [ -84.613937, 45.973629 ], [ -84.607750, 45.967918 ], [ -84.608704, 45.964111 ], [ -84.619171, 45.957447 ], [ -84.638847, 45.955563 ] ] ], [ [ [ -84.568253, 45.950787 ], [ -84.582527, 45.958874 ], [ -84.583954, 45.963634 ], [ -84.579674, 45.968391 ], [ -84.575386, 45.970299 ], [ -84.563492, 45.967442 ], [ -84.559212, 45.958401 ], [ -84.564919, 45.951260 ], [ -84.568253, 45.950787 ] ] ], [ [ [ -83.561836, 45.912563 ], [ -83.583054, 45.915920 ], [ -83.632210, 45.932285 ], [ -83.657661, 45.945461 ], [ -83.687691, 45.935390 ], [ -83.719429, 45.934078 ], [ -83.732986, 45.937641 ], [ -83.742775, 45.938004 ], [ -83.766235, 45.935223 ], [ -83.768852, 45.932068 ], [ -83.786110, 45.933376 ], [ -83.801041, 45.937580 ], [ -83.803329, 45.943363 ], [ -83.808144, 45.945694 ], [ -83.822807, 45.943985 ], [ -83.827568, 45.941235 ], [ -83.835503, 45.941841 ], [ -83.840866, 45.952724 ], [ -83.846436, 45.953182 ], [ -83.864861, 45.959465 ], [ -83.881058, 45.968185 ], [ -83.884827, 45.977165 ], [ -83.873146, 45.993427 ], [ -83.868233, 45.995075 ], [ -83.845398, 46.025681 ], [ -83.830147, 46.022324 ], [ -83.818199, 46.002426 ], [ -83.794052, 45.995800 ], [ -83.776436, 46.004204 ], [ -83.765274, 46.018364 ], [ -83.765259, 46.024681 ], [ -83.759369, 46.027191 ], [ -83.746872, 46.024811 ], [ -83.735573, 46.026596 ], [ -83.727837, 46.034924 ], [ -83.711777, 46.040279 ], [ -83.692146, 46.039089 ], [ -83.686195, 46.046227 ], [ -83.679657, 46.057529 ], [ -83.677872, 46.064667 ], [ -83.682632, 46.071808 ], [ -83.699883, 46.075375 ], [ -83.719513, 46.081326 ], [ -83.731407, 46.086678 ], [ -83.723297, 46.093811 ], [ -83.719788, 46.101032 ], [ -83.703857, 46.103367 ], [ -83.661163, 46.100258 ], [ -83.634979, 46.103954 ], [ -83.625557, 46.102211 ], [ -83.615341, 46.095978 ], [ -83.598610, 46.090084 ], [ -83.581314, 46.089615 ], [ -83.576088, 46.083511 ], [ -83.572639, 46.074921 ], [ -83.572571, 46.069897 ], [ -83.565353, 46.061897 ], [ -83.554062, 46.058884 ], [ -83.547203, 46.047867 ], [ -83.543365, 46.037197 ], [ -83.540848, 46.021248 ], [ -83.532913, 46.011330 ], [ -83.494843, 45.999542 ], [ -83.488350, 45.999542 ], [ -83.480637, 45.996162 ], [ -83.473946, 45.988560 ], [ -83.473221, 45.984421 ], [ -83.481766, 45.971874 ], [ -83.488808, 45.968739 ], [ -83.510620, 45.929325 ], [ -83.517242, 45.923615 ], [ -83.526344, 45.918636 ], [ -83.561836, 45.912563 ] ] ], [ [ [ -84.861969, 45.851276 ], [ -84.881210, 45.860901 ], [ -84.879150, 45.868462 ], [ -84.861969, 45.860214 ], [ -84.861969, 45.851276 ] ] ], [ [ [ -84.617607, 45.844925 ], [ -84.638428, 45.850872 ], [ -84.650917, 45.859798 ], [ -84.651512, 45.862770 ], [ -84.645561, 45.874668 ], [ -84.647346, 45.884186 ], [ -84.644974, 45.885376 ], [ -84.624153, 45.880020 ], [ -84.602142, 45.852062 ], [ -84.607491, 45.847900 ], [ -84.617607, 45.844925 ] ] ], [ [ [ -85.590889, 45.833141 ], [ -85.595177, 45.835522 ], [ -85.593811, 45.839809 ], [ -85.581467, 45.841042 ], [ -85.584709, 45.834095 ], [ -85.590889, 45.833141 ] ] ], [ [ [ -84.595001, 45.821129 ], [ -84.609871, 45.825890 ], [ -84.613441, 45.834217 ], [ -84.612846, 45.836002 ], [ -84.596786, 45.833622 ], [ -84.589050, 45.827675 ], [ -84.589645, 45.821724 ], [ -84.595001, 45.821129 ] ] ], [ [ [ -85.611832, 45.806015 ], [ -85.617538, 45.810776 ], [ -85.617538, 45.814106 ], [ -85.612305, 45.816010 ], [ -85.606598, 45.815060 ], [ -85.603264, 45.813156 ], [ -85.601837, 45.811253 ], [ -85.611832, 45.806015 ] ] ], [ [ [ -85.683296, 45.769455 ], [ -85.690704, 45.769455 ], [ -85.696259, 45.774391 ], [ -85.691933, 45.777477 ], [ -85.683296, 45.769455 ] ] ], [ [ [ -85.377129, 45.769012 ], [ -85.396172, 45.774723 ], [ -85.394264, 45.778530 ], [ -85.379036, 45.789951 ], [ -85.379036, 45.802326 ], [ -85.377129, 45.812794 ], [ -85.370468, 45.818504 ], [ -85.360954, 45.817554 ], [ -85.353340, 45.806133 ], [ -85.351433, 45.795662 ], [ -85.359047, 45.776627 ], [ -85.377129, 45.769012 ] ] ], [ [ [ -85.462578, 45.765865 ], [ -85.495575, 45.772739 ], [ -85.507263, 45.778236 ], [ -85.532013, 45.798172 ], [ -85.529259, 45.818108 ], [ -85.524445, 45.829792 ], [ -85.496948, 45.822231 ], [ -85.454330, 45.800236 ], [ -85.450203, 45.796677 ], [ -85.447830, 45.790134 ], [ -85.450203, 45.776451 ], [ -85.455559, 45.768719 ], [ -85.462578, 45.765865 ] ] ], [ [ [ -84.420113, 45.718815 ], [ -84.431412, 45.724762 ], [ -84.434387, 45.726547 ], [ -84.442719, 45.726547 ], [ -84.452827, 45.725952 ], [ -84.472458, 45.731304 ], [ -84.481384, 45.729523 ], [ -84.500420, 45.736065 ], [ -84.510529, 45.750340 ], [ -84.512314, 45.755100 ], [ -84.525406, 45.761047 ], [ -84.558716, 45.793766 ], [ -84.580727, 45.801498 ], [ -84.588455, 45.807449 ], [ -84.590240, 45.812801 ], [ -84.589050, 45.816372 ], [ -84.580727, 45.819939 ], [ -84.571800, 45.819347 ], [ -84.550385, 45.811016 ], [ -84.525406, 45.808640 ], [ -84.511124, 45.811611 ], [ -84.504585, 45.811611 ], [ -84.500420, 45.811016 ], [ -84.490303, 45.804474 ], [ -84.439148, 45.789604 ], [ -84.433197, 45.787819 ], [ -84.427841, 45.790195 ], [ -84.423088, 45.792576 ], [ -84.421303, 45.796146 ], [ -84.423088, 45.805069 ], [ -84.427246, 45.811611 ], [ -84.418922, 45.811611 ], [ -84.408211, 45.795551 ], [ -84.402267, 45.787224 ], [ -84.398697, 45.785439 ], [ -84.390961, 45.785439 ], [ -84.375496, 45.777706 ], [ -84.357056, 45.772350 ], [ -84.354080, 45.770565 ], [ -84.354080, 45.767593 ], [ -84.364197, 45.756290 ], [ -84.371330, 45.746773 ], [ -84.379662, 45.739635 ], [ -84.390366, 45.734875 ], [ -84.392151, 45.729523 ], [ -84.399292, 45.722977 ], [ -84.409996, 45.720005 ], [ -84.420113, 45.718815 ] ] ], [ [ [ -85.672188, 45.696632 ], [ -85.696869, 45.697250 ], [ -85.696259, 45.712063 ], [ -85.695290, 45.724697 ], [ -85.701813, 45.736130 ], [ -85.688850, 45.747238 ], [ -85.651863, 45.743141 ], [ -85.649353, 45.722553 ], [ -85.672188, 45.696632 ] ] ], [ [ [ -85.843750, 45.690460 ], [ -85.843750, 45.710209 ], [ -85.835114, 45.711445 ], [ -85.833260, 45.696632 ], [ -85.843750, 45.690460 ] ] ], [ [ [ -86.682877, 45.594818 ], [ -86.691704, 45.595818 ], [ -86.702019, 45.602692 ], [ -86.712326, 45.610939 ], [ -86.692390, 45.617126 ], [ -86.677269, 45.613689 ], [ -86.669022, 45.609566 ], [ -86.665749, 45.606239 ], [ -86.670982, 45.600529 ], [ -86.682877, 45.594818 ] ] ], [ [ [ -86.636894, 45.542053 ], [ -86.648788, 45.543243 ], [ -86.654144, 45.555737 ], [ -86.661285, 45.574177 ], [ -86.661285, 45.582504 ], [ -86.658905, 45.586075 ], [ -86.654739, 45.587856 ], [ -86.644035, 45.585480 ], [ -86.626190, 45.573582 ], [ -86.620239, 45.562279 ], [ -86.622025, 45.556332 ], [ -86.630348, 45.546814 ], [ -86.636894, 45.542053 ] ] ], [ [ [ -86.660690, 45.520042 ], [ -86.666641, 45.520042 ], [ -86.669609, 45.524208 ], [ -86.670204, 45.529560 ], [ -86.667236, 45.531940 ], [ -86.659500, 45.532536 ], [ -86.656525, 45.525993 ], [ -86.660690, 45.520042 ] ] ], [ [ [ -86.715080, 45.497517 ], [ -86.728142, 45.522949 ], [ -86.723328, 45.520889 ], [ -86.715767, 45.509201 ], [ -86.715080, 45.497517 ] ] ], [ [ [ -86.758385, 45.476204 ], [ -86.782448, 45.487206 ], [ -86.782448, 45.506451 ], [ -86.774193, 45.511951 ], [ -86.756325, 45.501640 ], [ -86.758385, 45.476204 ] ] ], [ [ [ -85.770958, 45.461353 ], [ -85.792961, 45.481976 ], [ -85.782646, 45.491596 ], [ -85.770958, 45.487473 ], [ -85.766838, 45.475788 ], [ -85.770958, 45.461353 ] ] ], [ [ [ -85.833519, 45.378174 ], [ -85.873390, 45.421482 ], [ -85.883011, 45.443478 ], [ -85.858261, 45.440041 ], [ -85.834892, 45.428356 ], [ -85.825958, 45.404297 ], [ -85.833519, 45.378174 ] ] ], [ [ [ -83.322464, 45.186062 ], [ -83.338272, 45.189499 ], [ -83.334145, 45.199123 ], [ -83.319710, 45.194313 ], [ -83.322464, 45.186062 ] ] ], [ [ [ -83.190582, 45.033356 ], [ -83.229767, 45.039539 ], [ -83.233894, 45.054665 ], [ -83.231827, 45.058102 ], [ -83.213959, 45.056728 ], [ -83.201584, 45.046413 ], [ -83.190582, 45.033356 ] ] ], [ [ [ -85.582054, 44.859333 ], [ -85.583755, 44.861454 ], [ -85.581207, 44.869938 ], [ -85.569328, 44.873333 ], [ -85.569756, 44.863152 ], [ -85.582054, 44.859333 ] ] ], [ [ [ -83.829224, 43.662632 ], [ -83.831284, 43.669506 ], [ -83.821663, 43.677067 ], [ -83.816162, 43.672943 ], [ -83.816162, 43.666756 ], [ -83.829224, 43.662632 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US30", "STATE": "30", "NAME": "Montana", "LSAD": "", "CENSUSAREA": 145545.801000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -104.057698, 44.997431 ], [ -104.250145, 44.998220 ], [ -104.470117, 44.998453 ], [ -104.470422, 44.998453 ], [ -104.663882, 44.998869 ], [ -104.665171, 44.998618 ], [ -104.726370, 44.999518 ], [ -104.759855, 44.999066 ], [ -104.765063, 44.999183 ], [ -105.018240, 45.000437 ], [ -105.019284, 45.000329 ], [ -105.025266, 45.000290 ], [ -105.038405, 45.000345 ], [ -105.848065, 45.000396 ], [ -105.913382, 45.000941 ], [ -105.914258, 44.999986 ], [ -105.928184, 44.993647 ], [ -106.263586, 44.993788 ], [ -106.888773, 44.995885 ], [ -106.892875, 44.995947 ], [ -107.050801, 44.996424 ], [ -107.074996, 44.997004 ], [ -107.084939, 44.996599 ], [ -107.105685, 44.998734 ], [ -107.125633, 44.999388 ], [ -107.134180, 45.000109 ], [ -107.351441, 45.001407 ], [ -107.492050, 45.001480 ], [ -107.607824, 45.000929 ], [ -107.608854, 45.000860 ], [ -107.750654, 45.000778 ], [ -107.997353, 45.001565 ], [ -108.000663, 45.001223 ], [ -108.149390, 45.001062 ], [ -108.218479, 45.000541 ], [ -108.238139, 45.000206 ], [ -108.249345, 44.999458 ], [ -108.271201, 45.000251 ], [ -108.500679, 44.999691 ], [ -108.565921, 45.000578 ], [ -108.578484, 45.000484 ], [ -109.062262, 44.999623 ], [ -109.083010, 44.999610 ], [ -109.103445, 45.005904 ], [ -109.263431, 45.005345 ], [ -109.269294, 45.005283 ], [ -109.375713, 45.004610 ], [ -109.386432, 45.004887 ], [ -109.574321, 45.002631 ], [ -109.663673, 45.002536 ], [ -109.750730, 45.001605 ], [ -109.798687, 45.002188 ], [ -109.875735, 45.003275 ], [ -109.995050, 45.003174 ], [ -110.025544, 45.003602 ], [ -110.026347, 45.003665 ], [ -110.110103, 45.003905 ], [ -110.199503, 44.996188 ], [ -110.286770, 44.996850 ], [ -110.324441, 44.999156 ], [ -110.342131, 44.999053 ], [ -110.362698, 45.000593 ], [ -110.402927, 44.993810 ], [ -110.488070, 44.992361 ], [ -110.547165, 44.992459 ], [ -110.552433, 44.992237 ], [ -110.705272, 44.992324 ], [ -110.750767, 44.997948 ], [ -110.761554, 44.999934 ], [ -110.785008, 45.002952 ], [ -111.044275, 45.001345 ], [ -111.055199, 45.001321 ], [ -111.056207, 44.935901 ], [ -111.055629, 44.933578 ], [ -111.056888, 44.866658 ], [ -111.056416, 44.749928 ], [ -111.055511, 44.725343 ], [ -111.055208, 44.624927 ], [ -111.048974, 44.474072 ], [ -111.062729, 44.476073 ], [ -111.122654, 44.493659 ], [ -111.131379, 44.499925 ], [ -111.139455, 44.517112 ], [ -111.143557, 44.535732 ], [ -111.159590, 44.546376 ], [ -111.166892, 44.547220 ], [ -111.175747, 44.552219 ], [ -111.182551, 44.566874 ], [ -111.189617, 44.571062 ], [ -111.201459, 44.575696 ], [ -111.225208, 44.581006 ], [ -111.230180, 44.587025 ], [ -111.231227, 44.606915 ], [ -111.224161, 44.623402 ], [ -111.252680, 44.651092 ], [ -111.262839, 44.649658 ], [ -111.276956, 44.655626 ], [ -111.268750, 44.668279 ], [ -111.296260, 44.702271 ], [ -111.323669, 44.724474 ], [ -111.341351, 44.729300 ], [ -111.348184, 44.725459 ], [ -111.355768, 44.727602 ], [ -111.366723, 44.738361 ], [ -111.366270, 44.742234 ], [ -111.374760, 44.750295 ], [ -111.385005, 44.755128 ], [ -111.393854, 44.752549 ], [ -111.397805, 44.746738 ], [ -111.394459, 44.744578 ], [ -111.398575, 44.723343 ], [ -111.414271, 44.710741 ], [ -111.424214, 44.714024 ], [ -111.429604, 44.720149 ], [ -111.438793, 44.720546 ], [ -111.486019, 44.707654 ], [ -111.489339, 44.704946 ], [ -111.490228, 44.700221 ], [ -111.484898, 44.687578 ], [ -111.477980, 44.682393 ], [ -111.468833, 44.679335 ], [ -111.473178, 44.665479 ], [ -111.504940, 44.635746 ], [ -111.521688, 44.613371 ], [ -111.525764, 44.604883 ], [ -111.524213, 44.595585 ], [ -111.519126, 44.582916 ], [ -111.492024, 44.560810 ], [ -111.469185, 44.552044 ], [ -111.467736, 44.544521 ], [ -111.471682, 44.540824 ], [ -111.500792, 44.540062 ], [ -111.518095, 44.544177 ], [ -111.524006, 44.548385 ], [ -111.546637, 44.557099 ], [ -111.556577, 44.554495 ], [ -111.562814, 44.555209 ], [ -111.585763, 44.562843 ], [ -111.591768, 44.561502 ], [ -111.601249, 44.554210 ], [ -111.614405, 44.548991 ], [ -111.681571, 44.559864 ], [ -111.704218, 44.560205 ], [ -111.709553, 44.550206 ], [ -111.715474, 44.543543 ], [ -111.737191, 44.543060 ], [ -111.746401, 44.540766 ], [ -111.758966, 44.533766 ], [ -111.761904, 44.529841 ], [ -111.806512, 44.516264 ], [ -111.807914, 44.511716 ], [ -111.821488, 44.509286 ], [ -111.842542, 44.526069 ], [ -111.849293, 44.539837 ], [ -111.870504, 44.564033 ], [ -111.887852, 44.563413 ], [ -111.903566, 44.557230 ], [ -111.947941, 44.556776 ], [ -111.951522, 44.550062 ], [ -111.980833, 44.536682 ], [ -111.995231, 44.535444 ], [ -112.013850, 44.542348 ], [ -112.032707, 44.546642 ], [ -112.035025, 44.542691 ], [ -112.034133, 44.537716 ], [ -112.036943, 44.530323 ], [ -112.053434, 44.535089 ], [ -112.069011, 44.537104 ], [ -112.093304, 44.530002 ], [ -112.096299, 44.523212 ], [ -112.101564, 44.520847 ], [ -112.106755, 44.520829 ], [ -112.125101, 44.528527 ], [ -112.129078, 44.536300 ], [ -112.136454, 44.539911 ], [ -112.164597, 44.541666 ], [ -112.179703, 44.533021 ], [ -112.183937, 44.533067 ], [ -112.221698, 44.543519 ], [ -112.229477, 44.549494 ], [ -112.226841, 44.555239 ], [ -112.230117, 44.562759 ], [ -112.242785, 44.568091 ], [ -112.258665, 44.569516 ], [ -112.286187, 44.568472 ], [ -112.307642, 44.557651 ], [ -112.312899, 44.553536 ], [ -112.315047, 44.550049 ], [ -112.315008, 44.541900 ], [ -112.319198, 44.539110 ], [ -112.348794, 44.538691 ], [ -112.354210, 44.535638 ], [ -112.358917, 44.528847 ], [ -112.356600, 44.493127 ], [ -112.358926, 44.486280 ], [ -112.368764, 44.467153 ], [ -112.387389, 44.448058 ], [ -112.435342, 44.462216 ], [ -112.460347, 44.475710 ], [ -112.473207, 44.480027 ], [ -112.500310, 44.463051 ], [ -112.511713, 44.466445 ], [ -112.512036, 44.470420 ], [ -112.518871, 44.475784 ], [ -112.541989, 44.483971 ], [ -112.550557, 44.484928 ], [ -112.573513, 44.480983 ], [ -112.584197, 44.481368 ], [ -112.601863, 44.491015 ], [ -112.660696, 44.485756 ], [ -112.664485, 44.486450 ], [ -112.671169, 44.491265 ], [ -112.707815, 44.503023 ], [ -112.719110, 44.504344 ], [ -112.735084, 44.499159 ], [ -112.749011, 44.491233 ], [ -112.781294, 44.484888 ], [ -112.797863, 44.466112 ], [ -112.828191, 44.442472 ], [ -112.836034, 44.422653 ], [ -112.821896, 44.407436 ], [ -112.812608, 44.392275 ], [ -112.813240, 44.378103 ], [ -112.820489, 44.370946 ], [ -112.844859, 44.358221 ], [ -112.855395, 44.359975 ], [ -112.881769, 44.380315 ], [ -112.886041, 44.395874 ], [ -112.915602, 44.402699 ], [ -112.951146, 44.416699 ], [ -112.981682, 44.434279 ], [ -113.003544, 44.450814 ], [ -113.020917, 44.493827 ], [ -113.018636, 44.520064 ], [ -113.019777, 44.528505 ], [ -113.032722, 44.537137 ], [ -113.042820, 44.546757 ], [ -113.042363, 44.565237 ], [ -113.061071, 44.577329 ], [ -113.083819, 44.602220 ], [ -113.073760, 44.613928 ], [ -113.065593, 44.617391 ], [ -113.056770, 44.618657 ], [ -113.053529, 44.621187 ], [ -113.049349, 44.629380 ], [ -113.051504, 44.636950 ], [ -113.065589, 44.649371 ], [ -113.068306, 44.656374 ], [ -113.070420, 44.667844 ], [ -113.067756, 44.672807 ], [ -113.067760, 44.679474 ], [ -113.081906, 44.691392 ], [ -113.098064, 44.697477 ], [ -113.101154, 44.708578 ], [ -113.102138, 44.729027 ], [ -113.116874, 44.738104 ], [ -113.134824, 44.752763 ], [ -113.137704, 44.760109 ], [ -113.131387, 44.764738 ], [ -113.131453, 44.772837 ], [ -113.140618, 44.776698 ], [ -113.158206, 44.780847 ], [ -113.163806, 44.778921 ], [ -113.179366, 44.787142 ], [ -113.183395, 44.793565 ], [ -113.194360, 44.802151 ], [ -113.209624, 44.809070 ], [ -113.238729, 44.814144 ], [ -113.247166, 44.822950 ], [ -113.278382, 44.812706 ], [ -113.296830, 44.803358 ], [ -113.301508, 44.798985 ], [ -113.341704, 44.784853 ], [ -113.354034, 44.791745 ], [ -113.354763, 44.795468 ], [ -113.346692, 44.798898 ], [ -113.346100, 44.800611 ], [ -113.356062, 44.819798 ], [ -113.377153, 44.834858 ], [ -113.383984, 44.837400 ], [ -113.422376, 44.842595 ], [ -113.455071, 44.865424 ], [ -113.474573, 44.910846 ], [ -113.491121, 44.927548 ], [ -113.498745, 44.942314 ], [ -113.494446, 44.948597 ], [ -113.480836, 44.950310 ], [ -113.474781, 44.948795 ], [ -113.467467, 44.948061 ], [ -113.448958, 44.953544 ], [ -113.443782, 44.959890 ], [ -113.444862, 44.976141 ], [ -113.447013, 44.984637 ], [ -113.446884, 44.998545 ], [ -113.437726, 45.006967 ], [ -113.449909, 45.035167 ], [ -113.449120, 45.046098 ], [ -113.451970, 45.059247 ], [ -113.460578, 45.064879 ], [ -113.465073, 45.062755 ], [ -113.473770, 45.061700 ], [ -113.485278, 45.063519 ], [ -113.520134, 45.093033 ], [ -113.510819, 45.099902 ], [ -113.506638, 45.107288 ], [ -113.513342, 45.115225 ], [ -113.538037, 45.115030 ], [ -113.546488, 45.112285 ], [ -113.554744, 45.112901 ], [ -113.574670, 45.128411 ], [ -113.594632, 45.166034 ], [ -113.589891, 45.176986 ], [ -113.599506, 45.191114 ], [ -113.636889, 45.212983 ], [ -113.647399, 45.228282 ], [ -113.650064, 45.234710 ], [ -113.657027, 45.241436 ], [ -113.665633, 45.246265 ], [ -113.674409, 45.249411 ], [ -113.678749, 45.249270 ], [ -113.684946, 45.253706 ], [ -113.692039, 45.265191 ], [ -113.691557, 45.270912 ], [ -113.688077, 45.276407 ], [ -113.689359, 45.283550 ], [ -113.735601, 45.325265 ], [ -113.738729, 45.329741 ], [ -113.740200, 45.345590 ], [ -113.735530, 45.364738 ], [ -113.732390, 45.385058 ], [ -113.733092, 45.390173 ], [ -113.734402, 45.392353 ], [ -113.750546, 45.402720 ], [ -113.760924, 45.406501 ], [ -113.765203, 45.410601 ], [ -113.768058, 45.418147 ], [ -113.763368, 45.427732 ], [ -113.764591, 45.431403 ], [ -113.783272, 45.451839 ], [ -113.784160, 45.454946 ], [ -113.759986, 45.480735 ], [ -113.766022, 45.520621 ], [ -113.778361, 45.523415 ], [ -113.796579, 45.523462 ], [ -113.802849, 45.523159 ], [ -113.809144, 45.519908 ], [ -113.834555, 45.520729 ], [ -113.819868, 45.566326 ], [ -113.804796, 45.580358 ], [ -113.803261, 45.584193 ], [ -113.802955, 45.592631 ], [ -113.806729, 45.602146 ], [ -113.823068, 45.612486 ], [ -113.861404, 45.623660 ], [ -113.886006, 45.617020 ], [ -113.904691, 45.622007 ], [ -113.902539, 45.636945 ], [ -113.898883, 45.644167 ], [ -113.900588, 45.648259 ], [ -113.903582, 45.651165 ], [ -113.919752, 45.658536 ], [ -113.930403, 45.671878 ], [ -113.934220, 45.682232 ], [ -113.971565, 45.700636 ], [ -113.986656, 45.704564 ], [ -114.015633, 45.696127 ], [ -114.019315, 45.692937 ], [ -114.020533, 45.681223 ], [ -114.020070, 45.670332 ], [ -114.013786, 45.658238 ], [ -114.014973, 45.654008 ], [ -114.018731, 45.648616 ], [ -114.033456, 45.648629 ], [ -114.067619, 45.627706 ], [ -114.081790, 45.611329 ], [ -114.083149, 45.603996 ], [ -114.082100, 45.596958 ], [ -114.086584, 45.591180 ], [ -114.100308, 45.586354 ], [ -114.122322, 45.584260 ], [ -114.131469, 45.574444 ], [ -114.132359, 45.572531 ], [ -114.128601, 45.568996 ], [ -114.129099, 45.565491 ], [ -114.135249, 45.557465 ], [ -114.154837, 45.552916 ], [ -114.180043, 45.551432 ], [ -114.186470, 45.545539 ], [ -114.192802, 45.536596 ], [ -114.203665, 45.535570 ], [ -114.227942, 45.546423 ], [ -114.248121, 45.545877 ], [ -114.251836, 45.537812 ], [ -114.248183, 45.533226 ], [ -114.247824, 45.524283 ], [ -114.261616, 45.495816 ], [ -114.270717, 45.486116 ], [ -114.279217, 45.480616 ], [ -114.333218, 45.459316 ], [ -114.345019, 45.459916 ], [ -114.360719, 45.474116 ], [ -114.365620, 45.490416 ], [ -114.368520, 45.492716 ], [ -114.388618, 45.502903 ], [ -114.415804, 45.509753 ], [ -114.438991, 45.536076 ], [ -114.450863, 45.542530 ], [ -114.456764, 45.543983 ], [ -114.460542, 45.561283 ], [ -114.473759, 45.563278 ], [ -114.498176, 45.555473 ], [ -114.506341, 45.559216 ], [ -114.517761, 45.568129 ], [ -114.526075, 45.570771 ], [ -114.549508, 45.560590 ], [ -114.559038, 45.565706 ], [ -114.558253, 45.585104 ], [ -114.553999, 45.591279 ], [ -114.538132, 45.606834 ], [ -114.544905, 45.616673 ], [ -114.553937, 45.619299 ], [ -114.563305, 45.631612 ], [ -114.563652, 45.637412 ], [ -114.561046, 45.639906 ], [ -114.535770, 45.650613 ], [ -114.529678, 45.652320 ], [ -114.522142, 45.649340 ], [ -114.507645, 45.658949 ], [ -114.499637, 45.669035 ], [ -114.495421, 45.703321 ], [ -114.497553, 45.710677 ], [ -114.504869, 45.722176 ], [ -114.535634, 45.739095 ], [ -114.566172, 45.773864 ], [ -114.562509, 45.779927 ], [ -114.555487, 45.786249 ], [ -114.544692, 45.791447 ], [ -114.512973, 45.828825 ], [ -114.517040, 45.833148 ], [ -114.517143, 45.835993 ], [ -114.514596, 45.840785 ], [ -114.509303, 45.845531 ], [ -114.498809, 45.850676 ], [ -114.470296, 45.851343 ], [ -114.455532, 45.855012 ], [ -114.448680, 45.858891 ], [ -114.422963, 45.855381 ], [ -114.409477, 45.851640 ], [ -114.388243, 45.882340 ], [ -114.387166, 45.889164 ], [ -114.395059, 45.901458 ], [ -114.404314, 45.903497 ], [ -114.413168, 45.911479 ], [ -114.431159, 45.935737 ], [ -114.431328, 45.938023 ], [ -114.427717, 45.939625 ], [ -114.423681, 45.944100 ], [ -114.415977, 45.947891 ], [ -114.411933, 45.952358 ], [ -114.404708, 45.955900 ], [ -114.402261, 45.961489 ], [ -114.403712, 45.967049 ], [ -114.409353, 45.971410 ], [ -114.411892, 45.977883 ], [ -114.419899, 45.981106 ], [ -114.425843, 45.984984 ], [ -114.441185, 45.988453 ], [ -114.470965, 45.995742 ], [ -114.477290, 46.000802 ], [ -114.477922, 46.009025 ], [ -114.473811, 46.016614 ], [ -114.480241, 46.030325 ], [ -114.485793, 46.030022 ], [ -114.490572, 46.032427 ], [ -114.493418, 46.037170 ], [ -114.494683, 46.042546 ], [ -114.492153, 46.047290 ], [ -114.468529, 46.062484 ], [ -114.461864, 46.078571 ], [ -114.460049, 46.097104 ], [ -114.474415, 46.112515 ], [ -114.488303, 46.113106 ], [ -114.521300, 46.125287 ], [ -114.527096, 46.146218 ], [ -114.514706, 46.167726 ], [ -114.489254, 46.167684 ], [ -114.478333, 46.160876 ], [ -114.472643, 46.162202 ], [ -114.457549, 46.170231 ], [ -114.445928, 46.173933 ], [ -114.443215, 46.202943 ], [ -114.445497, 46.220227 ], [ -114.449819, 46.237119 ], [ -114.451912, 46.241253 ], [ -114.468254, 46.248796 ], [ -114.470479, 46.267320 ], [ -114.465024, 46.273127 ], [ -114.453257, 46.270939 ], [ -114.441326, 46.273800 ], [ -114.435440, 46.276610 ], [ -114.427309, 46.283624 ], [ -114.425587, 46.287899 ], [ -114.433478, 46.305502 ], [ -114.431708, 46.310744 ], [ -114.413758, 46.335945 ], [ -114.410682, 46.360673 ], [ -114.411592, 46.366688 ], [ -114.422458, 46.387097 ], [ -114.408974, 46.400438 ], [ -114.384756, 46.411784 ], [ -114.376413, 46.442983 ], [ -114.379338, 46.460166 ], [ -114.383051, 46.466402 ], [ -114.394447, 46.469549 ], [ -114.400068, 46.477180 ], [ -114.403019, 46.498675 ], [ -114.400257, 46.502143 ], [ -114.395204, 46.503148 ], [ -114.385871, 46.504370 ], [ -114.375348, 46.501855 ], [ -114.358740, 46.505306 ], [ -114.351655, 46.508119 ], [ -114.342072, 46.519679 ], [ -114.349208, 46.529514 ], [ -114.348733, 46.533792 ], [ -114.345340, 46.548444 ], [ -114.339533, 46.564039 ], [ -114.331750, 46.571914 ], [ -114.331338, 46.577781 ], [ -114.333931, 46.582732 ], [ -114.334992, 46.588154 ], [ -114.333931, 46.592162 ], [ -114.322519, 46.611066 ], [ -114.322912, 46.642938 ], [ -114.320665, 46.646963 ], [ -114.324560, 46.653579 ], [ -114.332887, 46.660756 ], [ -114.360709, 46.669059 ], [ -114.394514, 46.664846 ], [ -114.403383, 46.659633 ], [ -114.410907, 46.657466 ], [ -114.424424, 46.660648 ], [ -114.453239, 46.649266 ], [ -114.454250, 46.640974 ], [ -114.466902, 46.631695 ], [ -114.486218, 46.632829 ], [ -114.498007, 46.637655 ], [ -114.547321, 46.644485 ], [ -114.561582, 46.642043 ], [ -114.583385, 46.633227 ], [ -114.593292, 46.632848 ], [ -114.615036, 46.639733 ], [ -114.616354, 46.643646 ], [ -114.611676, 46.647704 ], [ -114.614716, 46.655256 ], [ -114.621483, 46.658143 ], [ -114.635713, 46.659375 ], [ -114.642713, 46.673145 ], [ -114.641745, 46.679286 ], [ -114.631898, 46.683970 ], [ -114.623198, 46.691511 ], [ -114.620859, 46.707415 ], [ -114.626695, 46.712889 ], [ -114.632954, 46.715495 ], [ -114.649388, 46.732890 ], [ -114.696656, 46.740572 ], [ -114.699008, 46.740223 ], [ -114.710425, 46.717704 ], [ -114.713516, 46.715138 ], [ -114.727445, 46.714604 ], [ -114.740115, 46.711771 ], [ -114.747758, 46.702649 ], [ -114.749257, 46.699688 ], [ -114.751921, 46.697207 ], [ -114.766890, 46.696901 ], [ -114.787065, 46.711255 ], [ -114.788656, 46.714033 ], [ -114.779668, 46.730411 ], [ -114.773765, 46.731805 ], [ -114.767180, 46.738828 ], [ -114.765127, 46.745383 ], [ -114.765106, 46.758153 ], [ -114.790040, 46.778729 ], [ -114.808587, 46.782350 ], [ -114.818161, 46.781139 ], [ -114.829117, 46.782503 ], [ -114.835917, 46.791111 ], [ -114.844794, 46.794305 ], [ -114.856874, 46.801633 ], [ -114.860067, 46.804988 ], [ -114.861376, 46.811960 ], [ -114.864342, 46.813858 ], [ -114.880588, 46.811791 ], [ -114.888146, 46.808573 ], [ -114.897857, 46.813184 ], [ -114.904505, 46.822851 ], [ -114.920459, 46.827697 ], [ -114.927837, 46.835990 ], [ -114.928450, 46.843242 ], [ -114.923490, 46.847594 ], [ -114.928615, 46.854815 ], [ -114.940398, 46.856050 ], [ -114.947413, 46.859324 ], [ -114.943281, 46.867971 ], [ -114.938713, 46.869021 ], [ -114.931608, 46.876799 ], [ -114.931058, 46.882108 ], [ -114.936805, 46.897378 ], [ -114.935035, 46.901749 ], [ -114.927948, 46.909948 ], [ -114.927432, 46.914185 ], [ -114.929997, 46.919625 ], [ -114.960597, 46.930010 ], [ -114.986539, 46.952099 ], [ -115.000910, 46.967703 ], [ -115.001274, 46.971901 ], [ -115.028386, 46.975659 ], [ -115.028994, 46.973159 ], [ -115.031651, 46.971548 ], [ -115.047857, 46.969533 ], [ -115.049538, 46.970774 ], [ -115.057098, 46.986758 ], [ -115.066223, 46.996375 ], [ -115.071254, 47.022083 ], [ -115.087806, 47.045519 ], [ -115.098136, 47.048897 ], [ -115.102681, 47.047239 ], [ -115.107132, 47.049041 ], [ -115.120917, 47.061237 ], [ -115.136671, 47.078276 ], [ -115.139515, 47.084560 ], [ -115.140375, 47.093013 ], [ -115.170436, 47.106265 ], [ -115.172938, 47.112881 ], [ -115.189451, 47.131032 ], [ -115.200547, 47.139154 ], [ -115.223246, 47.148974 ], [ -115.243707, 47.150347 ], [ -115.255146, 47.162876 ], [ -115.255786, 47.174725 ], [ -115.261885, 47.181742 ], [ -115.286353, 47.183270 ], [ -115.300504, 47.188139 ], [ -115.300805, 47.193930 ], [ -115.295986, 47.205658 ], [ -115.292110, 47.209861 ], [ -115.294785, 47.220914 ], [ -115.298794, 47.225245 ], [ -115.307239, 47.229892 ], [ -115.311875, 47.229673 ], [ -115.317124, 47.233305 ], [ -115.324832, 47.244841 ], [ -115.326903, 47.255912 ], [ -115.339201, 47.261623 ], [ -115.359300, 47.259461 ], [ -115.366280, 47.261485 ], [ -115.371825, 47.265213 ], [ -115.410685, 47.264228 ], [ -115.421645, 47.271736 ], [ -115.423173, 47.276222 ], [ -115.428359, 47.278722 ], [ -115.443566, 47.277309 ], [ -115.457077, 47.277794 ], [ -115.470959, 47.284873 ], [ -115.487314, 47.286518 ], [ -115.511860, 47.295219 ], [ -115.526751, 47.303219 ], [ -115.531971, 47.314121 ], [ -115.548658, 47.332213 ], [ -115.551079, 47.349856 ], [ -115.556318, 47.353076 ], [ -115.564766, 47.353476 ], [ -115.570887, 47.356375 ], [ -115.578619, 47.367007 ], [ -115.609492, 47.380799 ], [ -115.617247, 47.382521 ], [ -115.639186, 47.378605 ], [ -115.644341, 47.381826 ], [ -115.648479, 47.390293 ], [ -115.657681, 47.400651 ], [ -115.690570, 47.415059 ], [ -115.710340, 47.417784 ], [ -115.718934, 47.420967 ], [ -115.721480, 47.424469 ], [ -115.728801, 47.428925 ], [ -115.731348, 47.433381 ], [ -115.728801, 47.445159 ], [ -115.718247, 47.453160 ], [ -115.692930, 47.457237 ], [ -115.671188, 47.454390 ], [ -115.663867, 47.456936 ], [ -115.654318, 47.468077 ], [ -115.653044, 47.476035 ], [ -115.655272, 47.477944 ], [ -115.686704, 47.485596 ], [ -115.694106, 47.498634 ], [ -115.708748, 47.512640 ], [ -115.710340, 47.529510 ], [ -115.717024, 47.532693 ], [ -115.741371, 47.538645 ], [ -115.747263, 47.543197 ], [ -115.748536, 47.549245 ], [ -115.746945, 47.555293 ], [ -115.734674, 47.567401 ], [ -115.721207, 47.576323 ], [ -115.706473, 47.577299 ], [ -115.689404, 47.595402 ], [ -115.694284, 47.623460 ], [ -115.708537, 47.635356 ], [ -115.715193, 47.636340 ], [ -115.729930, 47.642442 ], [ -115.736270, 47.654762 ], [ -115.726613, 47.672093 ], [ -115.723770, 47.696671 ], [ -115.730764, 47.704426 ], [ -115.752349, 47.716743 ], [ -115.758623, 47.719041 ], [ -115.763424, 47.717313 ], [ -115.771770, 47.717412 ], [ -115.776219, 47.719818 ], [ -115.783504, 47.729305 ], [ -115.780441, 47.743447 ], [ -115.797299, 47.757520 ], [ -115.803917, 47.758480 ], [ -115.824597, 47.752154 ], [ -115.831755, 47.755785 ], [ -115.835365, 47.760957 ], [ -115.835069, 47.770060 ], [ -115.837438, 47.774846 ], [ -115.840440, 47.780172 ], [ -115.847487, 47.785227 ], [ -115.848509, 47.809331 ], [ -115.845474, 47.814967 ], [ -115.852291, 47.827991 ], [ -115.870861, 47.834939 ], [ -115.875262, 47.843272 ], [ -115.881522, 47.849672 ], [ -115.900934, 47.843064 ], [ -115.906409, 47.846261 ], [ -115.919291, 47.857406 ], [ -115.939993, 47.883153 ], [ -115.959946, 47.898142 ], [ -115.965153, 47.910131 ], [ -115.969076, 47.914256 ], [ -115.982791, 47.915994 ], [ -115.993678, 47.926183 ], [ -115.995121, 47.933827 ], [ -115.998236, 47.938779 ], [ -116.007246, 47.950087 ], [ -116.030751, 47.973349 ], [ -116.038340, 47.971318 ], [ -116.048421, 47.976820 ], [ -116.048850, 47.977186 ], [ -116.049153, 47.999923 ], [ -116.048739, 48.060093 ], [ -116.049320, 48.066644 ], [ -116.049415, 48.077220 ], [ -116.048911, 48.124930 ], [ -116.049977, 48.237604 ], [ -116.049353, 48.249936 ], [ -116.049735, 48.274668 ], [ -116.048948, 48.309847 ], [ -116.050003, 48.413492 ], [ -116.049155, 48.481247 ], [ -116.049193, 49.000912 ], [ -116.001030, 49.001270 ], [ -115.990685, 49.000909 ], [ -115.501016, 49.000694 ], [ -115.207912, 48.999228 ], [ -114.678217, 49.000725 ], [ -114.674398, 49.000679 ], [ -114.375977, 49.001390 ], [ -114.250971, 49.000905 ], [ -114.224912, 48.999687 ], [ -114.201107, 48.999249 ], [ -114.180211, 48.999703 ], [ -114.059188, 48.998856 ], [ -113.907487, 48.998858 ], [ -113.864127, 48.998276 ], [ -113.692982, 48.997632 ], [ -113.576118, 48.998478 ], [ -113.375925, 48.998562 ], [ -113.356874, 48.998224 ], [ -113.194740, 48.998909 ], [ -113.116356, 48.998462 ], [ -113.110155, 48.998550 ], [ -113.106891, 48.998501 ], [ -113.103212, 48.998530 ], [ -113.098147, 48.998494 ], [ -113.095436, 48.998533 ], [ -113.092055, 48.998543 ], [ -113.087863, 48.998557 ], [ -113.085576, 48.998581 ], [ -113.011041, 48.998643 ], [ -113.009895, 48.998619 ], [ -112.143769, 48.998917 ], [ -112.003866, 48.998570 ], [ -112.000878, 48.998921 ], [ -111.854088, 48.998067 ], [ -111.854090, 48.998039 ], [ -111.761679, 48.997614 ], [ -111.761613, 48.997650 ], [ -111.500812, 48.996963 ], [ -111.003916, 48.997537 ], [ -110.887459, 48.998087 ], [ -110.886706, 48.998124 ], [ -110.592465, 48.999012 ], [ -110.531615, 48.998390 ], [ -110.438151, 48.999188 ], [ -110.216135, 48.999239 ], [ -110.215516, 48.999197 ], [ -110.171595, 48.999262 ], [ -109.995618, 48.999642 ], [ -109.500737, 49.000440 ], [ -109.454023, 49.001132 ], [ -109.437397, 49.000631 ], [ -109.384762, 49.000397 ], [ -109.384068, 49.000374 ], [ -109.285975, 49.000479 ], [ -109.250722, 49.000011 ], [ -109.060570, 48.999666 ], [ -109.060292, 48.999621 ], [ -109.000708, 48.999234 ], [ -108.994722, 48.999237 ], [ -108.543194, 48.999377 ], [ -108.488063, 48.999368 ], [ -107.704696, 48.999872 ], [ -107.441017, 48.999363 ], [ -107.363582, 49.000019 ], [ -106.625597, 48.999640 ], [ -106.617539, 48.999583 ], [ -106.518201, 48.999564 ], [ -106.500592, 48.999756 ], [ -106.500592, 48.999443 ], [ -106.479609, 48.999372 ], [ -106.374616, 48.999617 ], [ -106.368151, 48.999503 ], [ -106.274267, 48.999312 ], [ -106.246210, 48.999258 ], [ -106.243154, 48.999373 ], [ -106.233987, 48.999423 ], [ -106.050543, 48.999207 ], [ -105.966197, 48.999445 ], [ -105.834181, 48.999707 ], [ -105.775808, 48.999637 ], [ -105.650270, 48.999444 ], [ -105.612577, 48.999703 ], [ -105.607542, 48.999624 ], [ -105.578616, 48.999673 ], [ -105.522636, 48.999591 ], [ -105.411972, 48.999582 ], [ -105.407909, 48.999480 ], [ -105.391379, 48.999475 ], [ -105.387490, 48.999382 ], [ -105.355888, 48.999357 ], [ -105.277521, 48.999457 ], [ -105.265192, 48.999500 ], [ -104.875527, 48.998991 ], [ -104.647389, 48.999344 ], [ -104.543636, 48.999541 ], [ -104.048736, 48.999877 ], [ -104.048478, 48.987007 ], [ -104.048616, 48.966736 ], [ -104.048555, 48.963772 ], [ -104.048800, 48.958997 ], [ -104.048627, 48.957124 ], [ -104.048698, 48.951823 ], [ -104.048872, 48.949630 ], [ -104.048770, 48.943301 ], [ -104.048701, 48.940331 ], [ -104.048807, 48.933636 ], [ -104.048744, 48.912113 ], [ -104.048746, 48.906858 ], [ -104.048643, 48.902609 ], [ -104.048719, 48.879921 ], [ -104.048893, 48.875739 ], [ -104.048883, 48.874008 ], [ -104.048824, 48.867539 ], [ -104.048652, 48.865734 ], [ -104.048900, 48.847387 ], [ -104.048569, 48.797052 ], [ -104.048537, 48.788552 ], [ -104.048233, 48.765636 ], [ -104.048548, 48.751356 ], [ -104.048340, 48.747133 ], [ -104.047883, 48.664191 ], [ -104.047849, 48.663163 ], [ -104.047861, 48.658856 ], [ -104.047865, 48.657450 ], [ -104.047887, 48.649911 ], [ -104.047819, 48.648631 ], [ -104.047582, 48.633984 ], [ -104.047620, 48.627015 ], [ -104.047586, 48.625644 ], [ -104.047930, 48.620190 ], [ -104.048212, 48.599055 ], [ -104.047974, 48.591606 ], [ -104.047811, 48.562770 ], [ -104.047783, 48.539737 ], [ -104.047648, 48.531489 ], [ -104.047876, 48.530798 ], [ -104.047513, 48.525913 ], [ -104.047675, 48.517852 ], [ -104.048054, 48.500025 ], [ -104.047555, 48.494140 ], [ -104.047392, 48.467086 ], [ -104.047259, 48.452941 ], [ -104.047294, 48.452529 ], [ -104.047192, 48.447251 ], [ -104.047090, 48.445903 ], [ -104.046960, 48.421065 ], [ -104.047134, 48.411057 ], [ -104.046969, 48.390675 ], [ -104.046913, 48.389433 ], [ -104.046654, 48.374773 ], [ -104.046371, 48.374154 ], [ -104.046332, 48.342290 ], [ -104.046039, 48.256761 ], [ -104.045861, 48.255097 ], [ -104.045645, 48.246179 ], [ -104.045729, 48.244586 ], [ -104.045692, 48.241415 ], [ -104.045560, 48.193913 ], [ -104.045424, 48.192473 ], [ -104.045498, 48.176249 ], [ -104.045399, 48.164390 ], [ -104.044120, 47.996107 ], [ -104.044162, 47.992836 ], [ -104.043933, 47.971515 ], [ -104.043497, 47.954490 ], [ -104.043329, 47.949554 ], [ -104.042230, 47.891031 ], [ -104.041662, 47.862282 ], [ -104.041869, 47.841699 ], [ -104.042567, 47.808237 ], [ -104.042432, 47.805358 ], [ -104.042384, 47.803256 ], [ -104.043199, 47.747292 ], [ -104.043242, 47.747106 ], [ -104.043742, 47.625016 ], [ -104.044241, 47.612288 ], [ -104.043912, 47.603229 ], [ -104.044109, 47.523595 ], [ -104.044621, 47.459380 ], [ -104.044797, 47.438445 ], [ -104.045069, 47.397461 ], [ -104.044863, 47.375015 ], [ -104.045333, 47.343452 ], [ -104.045313, 47.331955 ], [ -104.045121, 47.276969 ], [ -104.045155, 47.273930 ], [ -104.045088, 47.271406 ], [ -104.045057, 47.266868 ], [ -104.045091, 47.265953 ], [ -104.045159, 47.263874 ], [ -104.045517, 47.215666 ], [ -104.044788, 47.127430 ], [ -104.045081, 47.092813 ], [ -104.045018, 47.081202 ], [ -104.045354, 47.078574 ], [ -104.045259, 47.063901 ], [ -104.045227, 47.057502 ], [ -104.045195, 47.053639 ], [ -104.045052, 47.040863 ], [ -104.045076, 47.037589 ], [ -104.045566, 46.941231 ], [ -104.045535, 46.934009 ], [ -104.045542, 46.933887 ], [ -104.045901, 46.830790 ], [ -104.045402, 46.725423 ], [ -104.045403, 46.722177 ], [ -104.045370, 46.721332 ], [ -104.045572, 46.713881 ], [ -104.045474, 46.708738 ], [ -104.045271, 46.641449 ], [ -104.045045, 46.509788 ], [ -104.046103, 46.383916 ], [ -104.045481, 46.366871 ], [ -104.045462, 46.341895 ], [ -104.045469, 46.324545 ], [ -104.045237, 46.125002 ], [ -104.045759, 46.123946 ], [ -104.046822, 46.000199 ], [ -104.045443, 45.945310 ], [ -104.044030, 45.881975 ], [ -104.044009, 45.871974 ], [ -104.043814, 45.868385 ], [ -104.042597, 45.749998 ], [ -104.041937, 45.557915 ], [ -104.041647, 45.550691 ], [ -104.041717, 45.539122 ], [ -104.041145, 45.503367 ], [ -104.041274, 45.499994 ], [ -104.041764, 45.490789 ], [ -104.040816, 45.462708 ], [ -104.040410, 45.393474 ], [ -104.040114, 45.374214 ], [ -104.040265, 45.345356 ], [ -104.040358, 45.335946 ], [ -104.039977, 45.124988 ], [ -104.039563, 45.124039 ], [ -104.040128, 44.999987 ], [ -104.039681, 44.998041 ], [ -104.057698, 44.997431 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US32", "STATE": "32", "NAME": "Nevada", "LSAD": "", "CENSUSAREA": 109781.180000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -114.050600, 37.000396 ], [ -114.049995, 36.957769 ], [ -114.050619, 36.843128 ], [ -114.050562, 36.656259 ], [ -114.050167, 36.624978 ], [ -114.049660, 36.621113 ], [ -114.048476, 36.499980 ], [ -114.046488, 36.473449 ], [ -114.045829, 36.442973 ], [ -114.045806, 36.391071 ], [ -114.047584, 36.325573 ], [ -114.046935, 36.315449 ], [ -114.048515, 36.289598 ], [ -114.048226, 36.268874 ], [ -114.047106, 36.250591 ], [ -114.046743, 36.245246 ], [ -114.046838, 36.194069 ], [ -114.060302, 36.189363 ], [ -114.068027, 36.180663 ], [ -114.088954, 36.144381 ], [ -114.099870, 36.121654 ], [ -114.103222, 36.120176 ], [ -114.111011, 36.119875 ], [ -114.120862, 36.114596 ], [ -114.123144, 36.111576 ], [ -114.123975, 36.106515 ], [ -114.123221, 36.104746 ], [ -114.117459, 36.100893 ], [ -114.114165, 36.096982 ], [ -114.114531, 36.095217 ], [ -114.136896, 36.059467 ], [ -114.138203, 36.053161 ], [ -114.137188, 36.046785 ], [ -114.138202, 36.041284 ], [ -114.148191, 36.028013 ], [ -114.151725, 36.024563 ], [ -114.154130, 36.023862 ], [ -114.166465, 36.027738 ], [ -114.176824, 36.027651 ], [ -114.192380, 36.020993 ], [ -114.213690, 36.015613 ], [ -114.233289, 36.014289 ], [ -114.238799, 36.014561 ], [ -114.252651, 36.020193 ], [ -114.263146, 36.025937 ], [ -114.266721, 36.029238 ], [ -114.270645, 36.035720 ], [ -114.280202, 36.046362 ], [ -114.314028, 36.058165 ], [ -114.315557, 36.059494 ], [ -114.316109, 36.063109 ], [ -114.314206, 36.066619 ], [ -114.307879, 36.071291 ], [ -114.305738, 36.074882 ], [ -114.308430, 36.082443 ], [ -114.328777, 36.105501 ], [ -114.337273, 36.108020 ], [ -114.363109, 36.130246 ], [ -114.372106, 36.143114 ], [ -114.405475, 36.147371 ], [ -114.412373, 36.147254 ], [ -114.416950, 36.145761 ], [ -114.427169, 36.136305 ], [ -114.446605, 36.125970 ], [ -114.448654, 36.126410 ], [ -114.453325, 36.130726 ], [ -114.458369, 36.138586 ], [ -114.463637, 36.139695 ], [ -114.470152, 36.138801 ], [ -114.487034, 36.129396 ], [ -114.496120, 36.127850 ], [ -114.502172, 36.128796 ], [ -114.504442, 36.129741 ], [ -114.505766, 36.131444 ], [ -114.506144, 36.134659 ], [ -114.505387, 36.137496 ], [ -114.504820, 36.142414 ], [ -114.504631, 36.145629 ], [ -114.506711, 36.148277 ], [ -114.511721, 36.150956 ], [ -114.545789, 36.152248 ], [ -114.572031, 36.151610 ], [ -114.597212, 36.142103 ], [ -114.608264, 36.133949 ], [ -114.616694, 36.130101 ], [ -114.621883, 36.132130 ], [ -114.627855, 36.141012 ], [ -114.631716, 36.142306 ], [ -114.659950, 36.124145 ], [ -114.662890, 36.119932 ], [ -114.666538, 36.117343 ], [ -114.709771, 36.107742 ], [ -114.717293, 36.107686 ], [ -114.736165, 36.104367 ], [ -114.747079, 36.097005 ], [ -114.753638, 36.090705 ], [ -114.755618, 36.087166 ], [ -114.755491, 36.081601 ], [ -114.754099, 36.079440 ], [ -114.743342, 36.070535 ], [ -114.736253, 36.058470 ], [ -114.736738, 36.054349 ], [ -114.740375, 36.049258 ], [ -114.740375, 36.043682 ], [ -114.740617, 36.041015 ], [ -114.739405, 36.037863 ], [ -114.734314, 36.035681 ], [ -114.730435, 36.031317 ], [ -114.729707, 36.028166 ], [ -114.731162, 36.021862 ], [ -114.740522, 36.013336 ], [ -114.742779, 36.009963 ], [ -114.743243, 36.006530 ], [ -114.743756, 35.985095 ], [ -114.740595, 35.975656 ], [ -114.729941, 35.962183 ], [ -114.728318, 35.956290 ], [ -114.731159, 35.943916 ], [ -114.729356, 35.941413 ], [ -114.715692, 35.934709 ], [ -114.707526, 35.928060 ], [ -114.708516, 35.912313 ], [ -114.700271, 35.901772 ], [ -114.681120, 35.885364 ], [ -114.679039, 35.880046 ], [ -114.677883, 35.876346 ], [ -114.677420, 35.874728 ], [ -114.678114, 35.871953 ], [ -114.679501, 35.868023 ], [ -114.682010, 35.863284 ], [ -114.697767, 35.854844 ], [ -114.699848, 35.848370 ], [ -114.699848, 35.843283 ], [ -114.696410, 35.833784 ], [ -114.695710, 35.830601 ], [ -114.703710, 35.814585 ], [ -114.709910, 35.810185 ], [ -114.712110, 35.806185 ], [ -114.698910, 35.790185 ], [ -114.701409, 35.769086 ], [ -114.695709, 35.755986 ], [ -114.697309, 35.733686 ], [ -114.705309, 35.711587 ], [ -114.705409, 35.708287 ], [ -114.701208, 35.701187 ], [ -114.694108, 35.695187 ], [ -114.683208, 35.689387 ], [ -114.680607, 35.685488 ], [ -114.682207, 35.678188 ], [ -114.690008, 35.664688 ], [ -114.689407, 35.651412 ], [ -114.677107, 35.641489 ], [ -114.658206, 35.619089 ], [ -114.653406, 35.610789 ], [ -114.654306, 35.597590 ], [ -114.659606, 35.587490 ], [ -114.665649, 35.580428 ], [ -114.666184, 35.577576 ], [ -114.663005, 35.563690 ], [ -114.662005, 35.545491 ], [ -114.660205, 35.539291 ], [ -114.657405, 35.536391 ], [ -114.656905, 35.534391 ], [ -114.658005, 35.530491 ], [ -114.663105, 35.524491 ], [ -114.673805, 35.517891 ], [ -114.677205, 35.513491 ], [ -114.679205, 35.499992 ], [ -114.677643, 35.489742 ], [ -114.672901, 35.481708 ], [ -114.666377, 35.466856 ], [ -114.664500, 35.449497 ], [ -114.662125, 35.444241 ], [ -114.652005, 35.429165 ], [ -114.627137, 35.409504 ], [ -114.611435, 35.369056 ], [ -114.604314, 35.353584 ], [ -114.595931, 35.325234 ], [ -114.597503, 35.296954 ], [ -114.587129, 35.262376 ], [ -114.583111, 35.238090 ], [ -114.583559, 35.229930 ], [ -114.579963, 35.209640 ], [ -114.574835, 35.205898 ], [ -114.572119, 35.200591 ], [ -114.569238, 35.183480 ], [ -114.569569, 35.163053 ], [ -114.572747, 35.138725 ], [ -114.578524, 35.128750 ], [ -114.587740, 35.123729 ], [ -114.599120, 35.121050 ], [ -114.619905, 35.121632 ], [ -114.629934, 35.118272 ], [ -114.644352, 35.105904 ], [ -114.646759, 35.101872 ], [ -114.642831, 35.096503 ], [ -114.622517, 35.088703 ], [ -114.613132, 35.083097 ], [ -114.604736, 35.074830 ], [ -114.602908, 35.068588 ], [ -114.603619, 35.064226 ], [ -114.606694, 35.058941 ], [ -114.627124, 35.044721 ], [ -114.632429, 35.037586 ], [ -114.636893, 35.028367 ], [ -114.638023, 35.020556 ], [ -114.636674, 35.008807 ], [ -114.633013, 35.002085 ], [ -114.804249, 35.139689 ], [ -114.805030, 35.140284 ], [ -114.925381, 35.237039 ], [ -114.925480, 35.237054 ], [ -114.942216, 35.249994 ], [ -115.043812, 35.332012 ], [ -115.098018, 35.374990 ], [ -115.102881, 35.379371 ], [ -115.125816, 35.396940 ], [ -115.145813, 35.413182 ], [ -115.146788, 35.413662 ], [ -115.160068, 35.424129 ], [ -115.160599, 35.424313 ], [ -115.271342, 35.512660 ], [ -115.303743, 35.538207 ], [ -115.391535, 35.607271 ], [ -115.393996, 35.609344 ], [ -115.404537, 35.617605 ], [ -115.406079, 35.618613 ], [ -115.412908, 35.624981 ], [ -115.500832, 35.693382 ], [ -115.625838, 35.792013 ], [ -115.627386, 35.793846 ], [ -115.647202, 35.808995 ], [ -115.647683, 35.809358 ], [ -115.669005, 35.826515 ], [ -115.689302, 35.842003 ], [ -115.750844, 35.889287 ], [ -115.852908, 35.969660 ], [ -115.892975, 35.999967 ], [ -115.912858, 36.015359 ], [ -116.093601, 36.155805 ], [ -116.097216, 36.158346 ], [ -116.250869, 36.276979 ], [ -116.375875, 36.372562 ], [ -116.380340, 36.374955 ], [ -116.488233, 36.459097 ], [ -116.500882, 36.468223 ], [ -116.541983, 36.499952 ], [ -117.000895, 36.847694 ], [ -117.066728, 36.896354 ], [ -117.131975, 36.945777 ], [ -117.244917, 37.030244 ], [ -117.266046, 37.044910 ], [ -117.375905, 37.126843 ], [ -117.500117, 37.220380 ], [ -117.500909, 37.220282 ], [ -117.540885, 37.249931 ], [ -117.581418, 37.278936 ], [ -117.680610, 37.353399 ], [ -117.712358, 37.374931 ], [ -117.832726, 37.464929 ], [ -117.875927, 37.497267 ], [ -117.904625, 37.515836 ], [ -117.975776, 37.569293 ], [ -118.039849, 37.615245 ], [ -118.039798, 37.615273 ], [ -118.052189, 37.624930 ], [ -118.250947, 37.768616 ], [ -118.500958, 37.949019 ], [ -118.571958, 37.999930 ], [ -118.621590, 38.034389 ], [ -118.714312, 38.102185 ], [ -118.746598, 38.124926 ], [ -118.771867, 38.141871 ], [ -118.859087, 38.204808 ], [ -118.922518, 38.249919 ], [ -118.949673, 38.268940 ], [ -119.000975, 38.303675 ], [ -119.030078, 38.325181 ], [ -119.082358, 38.361267 ], [ -119.097161, 38.372853 ], [ -119.125982, 38.393170 ], [ -119.234966, 38.468997 ], [ -119.250988, 38.480780 ], [ -119.279262, 38.499914 ], [ -119.333423, 38.538328 ], [ -119.370117, 38.563281 ], [ -119.375994, 38.566793 ], [ -119.450623, 38.619965 ], [ -119.450612, 38.619964 ], [ -119.494022, 38.649734 ], [ -119.494183, 38.649852 ], [ -119.585437, 38.713212 ], [ -119.587066, 38.714345 ], [ -119.587679, 38.714734 ], [ -119.904315, 38.933324 ], [ -120.001014, 38.999574 ], [ -120.002461, 39.067489 ], [ -120.005746, 39.225210 ], [ -120.005743, 39.228664 ], [ -120.005142, 39.291258 ], [ -120.005414, 39.313345 ], [ -120.005413, 39.313848 ], [ -120.005320, 39.316350 ], [ -120.004710, 39.330488 ], [ -120.004430, 39.374908 ], [ -120.003116, 39.445113 ], [ -120.001740, 39.538852 ], [ -120.001319, 39.722420 ], [ -120.000502, 39.779956 ], [ -120.000607, 39.780779 ], [ -119.999733, 39.851406 ], [ -119.997634, 39.956505 ], [ -119.997291, 40.071803 ], [ -119.997175, 40.077245 ], [ -119.997234, 40.091591 ], [ -119.997124, 40.126363 ], [ -119.996183, 40.262461 ], [ -119.996182, 40.263532 ], [ -119.996155, 40.321250 ], [ -119.996155, 40.321838 ], [ -119.995926, 40.499901 ], [ -119.997533, 40.720992 ], [ -119.998479, 40.749899 ], [ -119.999231, 40.865899 ], [ -119.999232, 40.867454 ], [ -119.999358, 40.873101 ], [ -119.999866, 41.183974 ], [ -119.999471, 41.499894 ], [ -119.998280, 41.618765 ], [ -119.998855, 41.624893 ], [ -119.998287, 41.749892 ], [ -119.999276, 41.874891 ], [ -119.999168, 41.994540 ], [ -119.986678, 41.995842 ], [ -119.876054, 41.997199 ], [ -119.872929, 41.997641 ], [ -119.848907, 41.997281 ], [ -119.790087, 41.997544 ], [ -119.725730, 41.996296 ], [ -119.444598, 41.995478 ], [ -119.360177, 41.994384 ], [ -119.251033, 41.993843 ], [ -119.231876, 41.994212 ], [ -119.208280, 41.993177 ], [ -119.001022, 41.993793 ], [ -118.795612, 41.992394 ], [ -118.777228, 41.992671 ], [ -118.775869, 41.992692 ], [ -118.696409, 41.991794 ], [ -118.601806, 41.993895 ], [ -118.501002, 41.995446 ], [ -118.197189, 41.996995 ], [ -117.873467, 41.998335 ], [ -117.625973, 41.998102 ], [ -117.623731, 41.998467 ], [ -117.443062, 41.999659 ], [ -117.403613, 41.999290 ], [ -117.217551, 41.999887 ], [ -117.197798, 42.000380 ], [ -117.068613, 42.000035 ], [ -117.055402, 41.999890 ], [ -117.048910, 41.998983 ], [ -117.040906, 41.999890 ], [ -117.026222, 42.000252 ], [ -117.018294, 41.999358 ], [ -117.009255, 41.998127 ], [ -116.969156, 41.998991 ], [ -116.626770, 41.997750 ], [ -116.625947, 41.997379 ], [ -116.586937, 41.997370 ], [ -116.582217, 41.997834 ], [ -116.525319, 41.997558 ], [ -116.510452, 41.997096 ], [ -116.501741, 41.997334 ], [ -116.499777, 41.996740 ], [ -116.485823, 41.996861 ], [ -116.483094, 41.996885 ], [ -116.463528, 41.996547 ], [ -116.368478, 41.996281 ], [ -116.332763, 41.997283 ], [ -116.163931, 41.997555 ], [ -116.160833, 41.997508 ], [ -116.038602, 41.997460 ], [ -116.038570, 41.997413 ], [ -116.030754, 41.997399 ], [ -116.030758, 41.997383 ], [ -116.018960, 41.997762 ], [ -116.018945, 41.997722 ], [ -116.012219, 41.998048 ], [ -116.012212, 41.998035 ], [ -115.986880, 41.998534 ], [ -115.887612, 41.998048 ], [ -115.879596, 41.997891 ], [ -115.870181, 41.996766 ], [ -115.625914, 41.997415 ], [ -115.586849, 41.996884 ], [ -115.313877, 41.996103 ], [ -115.254333, 41.996721 ], [ -115.250795, 41.996156 ], [ -115.031783, 41.996008 ], [ -114.914187, 41.999909 ], [ -114.899210, 41.999909 ], [ -114.875877, 42.001319 ], [ -114.831077, 42.002207 ], [ -114.806384, 42.001822 ], [ -114.720715, 41.998231 ], [ -114.598267, 41.994511 ], [ -114.498259, 41.994599 ], [ -114.498243, 41.994636 ], [ -114.467581, 41.995492 ], [ -114.281855, 41.994214 ], [ -114.107428, 41.993965 ], [ -114.107259, 41.993831 ], [ -114.061763, 41.993939 ], [ -114.061774, 41.993797 ], [ -114.048257, 41.993814 ], [ -114.048246, 41.993721 ], [ -114.041723, 41.993720 ], [ -114.039648, 41.884816 ], [ -114.041107, 41.850573 ], [ -114.041152, 41.850595 ], [ -114.039901, 41.753781 ], [ -114.039968, 41.624920 ], [ -114.040437, 41.615377 ], [ -114.040942, 41.499921 ], [ -114.040231, 41.491690 ], [ -114.041396, 41.219958 ], [ -114.042553, 41.210923 ], [ -114.041447, 41.207752 ], [ -114.042145, 40.999926 ], [ -114.043176, 40.771675 ], [ -114.043803, 40.759205 ], [ -114.043831, 40.758666 ], [ -114.043505, 40.726292 ], [ -114.045281, 40.506586 ], [ -114.045577, 40.495801 ], [ -114.045518, 40.494474 ], [ -114.045218, 40.430282 ], [ -114.045826, 40.424823 ], [ -114.046178, 40.398313 ], [ -114.046153, 40.231971 ], [ -114.046741, 40.104231 ], [ -114.046386, 40.097896 ], [ -114.046835, 40.030131 ], [ -114.046555, 39.996899 ], [ -114.047134, 39.906037 ], [ -114.047214, 39.821024 ], [ -114.047783, 39.794160 ], [ -114.047273, 39.759413 ], [ -114.047728, 39.542742 ], [ -114.047079, 39.499943 ], [ -114.049104, 39.005509 ], [ -114.048054, 38.878693 ], [ -114.048521, 38.876197 ], [ -114.049465, 38.874949 ], [ -114.049168, 38.749951 ], [ -114.049749, 38.729210 ], [ -114.050154, 38.572920 ], [ -114.049862, 38.547764 ], [ -114.049834, 38.543784 ], [ -114.050485, 38.499955 ], [ -114.050091, 38.404673 ], [ -114.050120, 38.404536 ], [ -114.049417, 38.264700 ], [ -114.050138, 38.249960 ], [ -114.049903, 38.148601 ], [ -114.050423, 37.999961 ], [ -114.049658, 37.881368 ], [ -114.049928, 37.852508 ], [ -114.049677, 37.823645 ], [ -114.048473, 37.809861 ], [ -114.049919, 37.765586 ], [ -114.051109, 37.756276 ], [ -114.051670, 37.746958 ], [ -114.051785, 37.746249 ], [ -114.051728, 37.745997 ], [ -114.052472, 37.604776 ], [ -114.052962, 37.592783 ], [ -114.052689, 37.517859 ], [ -114.052718, 37.517264 ], [ -114.052685, 37.502513 ], [ -114.052701, 37.492014 ], [ -114.052448, 37.431440 ], [ -114.051765, 37.418083 ], [ -114.051927, 37.370734 ], [ -114.051927, 37.370459 ], [ -114.051800, 37.293548 ], [ -114.051800, 37.293044 ], [ -114.051974, 37.284511 ], [ -114.051974, 37.283848 ], [ -114.051405, 37.233854 ], [ -114.051673, 37.172368 ], [ -114.052179, 37.147110 ], [ -114.051867, 37.134292 ], [ -114.052827, 37.103961 ], [ -114.051822, 37.090976 ], [ -114.051749, 37.088434 ], [ -114.050600, 37.000396 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US34", "STATE": "34", "NAME": "New Jersey", "LSAD": "", "CENSUSAREA": 7354.220000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.526844, 39.655713 ], [ -75.526344, 39.656413 ], [ -75.522343, 39.660813 ], [ -75.518343, 39.663913 ], [ -75.514643, 39.668613 ], [ -75.511743, 39.674313 ], [ -75.509342, 39.685313 ], [ -75.509742, 39.686113 ], [ -75.509042, 39.694513 ], [ -75.507162, 39.696961 ], [ -75.504042, 39.698313 ], [ -75.496241, 39.701413 ], [ -75.491341, 39.711113 ], [ -75.488553, 39.714833 ], [ -75.485241, 39.715813 ], [ -75.483141, 39.715513 ], [ -75.481741, 39.714546 ], [ -75.478940, 39.713813 ], [ -75.477640, 39.715013 ], [ -75.476888, 39.718337 ], [ -75.477432, 39.720561 ], [ -75.477240, 39.724713 ], [ -75.475440, 39.728713 ], [ -75.475384, 39.731057 ], [ -75.474168, 39.735473 ], [ -75.469239, 39.743613 ], [ -75.466263, 39.750737 ], [ -75.466249, 39.750769 ], [ -75.463039, 39.758313 ], [ -75.463339, 39.761213 ], [ -75.459439, 39.765813 ], [ -75.452339, 39.769013 ], [ -75.447339, 39.773313 ], [ -75.448135, 39.773969 ], [ -75.448639, 39.774113 ], [ -75.437938, 39.783413 ], [ -75.405337, 39.796213 ], [ -75.415041, 39.801786 ], [ -75.403737, 39.807512 ], [ -75.390536, 39.815312 ], [ -75.371835, 39.827612 ], [ -75.354400, 39.839917 ], [ -75.341765, 39.846082 ], [ -75.330433, 39.849012 ], [ -75.323232, 39.849812 ], [ -75.309674, 39.850179 ], [ -75.293376, 39.848782 ], [ -75.271159, 39.849440 ], [ -75.243431, 39.854597 ], [ -75.235026, 39.856613 ], [ -75.221025, 39.861113 ], [ -75.210425, 39.865913 ], [ -75.195324, 39.877013 ], [ -75.189323, 39.880713 ], [ -75.183023, 39.882013 ], [ -75.150721, 39.882713 ], [ -75.145421, 39.884213 ], [ -75.142421, 39.886413 ], [ -75.140221, 39.888213 ], [ -75.133420, 39.896213 ], [ -75.130820, 39.900213 ], [ -75.127920, 39.911813 ], [ -75.130120, 39.917013 ], [ -75.132820, 39.921612 ], [ -75.135020, 39.927312 ], [ -75.136120, 39.933912 ], [ -75.135720, 39.947112 ], [ -75.133520, 39.954412 ], [ -75.130120, 39.958712 ], [ -75.126920, 39.961112 ], [ -75.119220, 39.965412 ], [ -75.108119, 39.970312 ], [ -75.093718, 39.974412 ], [ -75.088618, 39.975212 ], [ -75.072017, 39.980612 ], [ -75.059017, 39.992512 ], [ -75.051217, 40.004512 ], [ -75.047016, 40.008912 ], [ -75.039316, 40.013012 ], [ -75.015515, 40.019511 ], [ -75.011115, 40.021311 ], [ -75.007914, 40.023111 ], [ -74.989914, 40.037311 ], [ -74.983913, 40.042711 ], [ -74.974713, 40.048711 ], [ -74.944412, 40.063211 ], [ -74.932211, 40.068411 ], [ -74.925311, 40.070710 ], [ -74.920811, 40.071110 ], [ -74.911911, 40.069910 ], [ -74.909011, 40.070210 ], [ -74.887810, 40.075810 ], [ -74.880209, 40.078810 ], [ -74.863809, 40.082210 ], [ -74.860909, 40.083710 ], [ -74.859809, 40.084910 ], [ -74.858209, 40.088810 ], [ -74.856509, 40.091310 ], [ -74.854409, 40.093110 ], [ -74.851108, 40.094910 ], [ -74.843408, 40.097710 ], [ -74.838008, 40.100910 ], [ -74.835108, 40.103910 ], [ -74.832808, 40.111710 ], [ -74.828408, 40.120310 ], [ -74.825907, 40.123910 ], [ -74.822307, 40.126710 ], [ -74.819007, 40.127510 ], [ -74.816307, 40.127610 ], [ -74.812807, 40.126910 ], [ -74.800607, 40.122810 ], [ -74.788706, 40.120410 ], [ -74.785106, 40.120310 ], [ -74.782106, 40.120810 ], [ -74.769488, 40.129145 ], [ -74.762864, 40.132541 ], [ -74.758882, 40.134036 ], [ -74.755305, 40.134710 ], [ -74.745905, 40.134210 ], [ -74.742905, 40.134410 ], [ -74.740605, 40.135210 ], [ -74.725663, 40.145495 ], [ -74.724304, 40.147010 ], [ -74.722604, 40.150010 ], [ -74.721604, 40.153810 ], [ -74.721504, 40.158409 ], [ -74.722304, 40.160609 ], [ -74.733804, 40.174509 ], [ -74.737205, 40.177609 ], [ -74.744105, 40.181009 ], [ -74.751705, 40.183309 ], [ -74.754305, 40.185209 ], [ -74.755605, 40.186709 ], [ -74.756905, 40.189409 ], [ -74.760605, 40.198909 ], [ -74.766905, 40.207709 ], [ -74.770406, 40.214508 ], [ -74.771360, 40.215399 ], [ -74.781206, 40.221508 ], [ -74.795306, 40.229408 ], [ -74.819507, 40.238508 ], [ -74.823907, 40.241508 ], [ -74.836307, 40.246208 ], [ -74.842308, 40.250508 ], [ -74.846608, 40.258808 ], [ -74.853108, 40.269707 ], [ -74.856508, 40.277407 ], [ -74.860492, 40.284584 ], [ -74.864692, 40.290684 ], [ -74.868209, 40.295207 ], [ -74.880609, 40.305607 ], [ -74.887109, 40.310307 ], [ -74.891609, 40.313007 ], [ -74.896409, 40.315107 ], [ -74.903310, 40.315607 ], [ -74.908310, 40.316907 ], [ -74.917410, 40.322406 ], [ -74.926810, 40.329406 ], [ -74.933111, 40.333106 ], [ -74.939711, 40.338006 ], [ -74.943776, 40.342564 ], [ -74.945088, 40.347332 ], [ -74.946006, 40.357306 ], [ -74.948722, 40.364768 ], [ -74.953697, 40.376081 ], [ -74.963997, 40.395246 ], [ -74.965508, 40.397337 ], [ -74.969597, 40.399770 ], [ -74.982735, 40.404432 ], [ -74.985467, 40.405935 ], [ -74.988901, 40.408773 ], [ -74.996378, 40.410528 ], [ -74.998651, 40.410093 ], [ -75.003351, 40.407850 ], [ -75.017221, 40.404638 ], [ -75.024775, 40.403455 ], [ -75.028315, 40.403883 ], [ -75.036616, 40.406796 ], [ -75.041651, 40.409894 ], [ -75.043071, 40.411603 ], [ -75.046473, 40.413792 ], [ -75.056102, 40.416066 ], [ -75.058848, 40.418065 ], [ -75.061489, 40.422848 ], [ -75.062923, 40.433407 ], [ -75.067425, 40.448323 ], [ -75.070568, 40.455165 ], [ -75.070568, 40.456348 ], [ -75.067302, 40.464954 ], [ -75.068050, 40.468578 ], [ -75.067776, 40.472827 ], [ -75.064327, 40.476795 ], [ -75.062227, 40.481391 ], [ -75.061937, 40.486362 ], [ -75.062373, 40.491689 ], [ -75.065275, 40.504682 ], [ -75.066001, 40.510716 ], [ -75.065853, 40.519495 ], [ -75.065090, 40.526148 ], [ -75.066402, 40.536532 ], [ -75.067257, 40.539584 ], [ -75.068615, 40.542223 ], [ -75.078503, 40.548296 ], [ -75.095700, 40.564401 ], [ -75.100325, 40.567811 ], [ -75.110903, 40.570671 ], [ -75.117292, 40.573211 ], [ -75.136748, 40.575731 ], [ -75.141906, 40.575273 ], [ -75.147368, 40.573152 ], [ -75.158446, 40.565286 ], [ -75.162871, 40.564096 ], [ -75.168609, 40.564111 ], [ -75.175307, 40.564996 ], [ -75.183151, 40.567354 ], [ -75.186737, 40.569406 ], [ -75.192352, 40.574257 ], [ -75.194046, 40.576256 ], [ -75.194870, 40.578591 ], [ -75.195114, 40.579689 ], [ -75.194656, 40.581940 ], [ -75.190796, 40.586838 ], [ -75.190146, 40.590359 ], [ -75.192291, 40.602676 ], [ -75.195923, 40.606788 ], [ -75.196803, 40.608580 ], [ -75.198499, 40.611492 ], [ -75.201348, 40.614628 ], [ -75.201812, 40.617188 ], [ -75.200708, 40.618356 ], [ -75.197891, 40.619332 ], [ -75.190691, 40.619956 ], [ -75.189283, 40.621492 ], [ -75.188579, 40.624628 ], [ -75.191059, 40.637971 ], [ -75.192276, 40.640803 ], [ -75.193492, 40.642275 ], [ -75.200468, 40.646899 ], [ -75.200452, 40.649219 ], [ -75.196676, 40.655123 ], [ -75.190852, 40.661939 ], [ -75.187940, 40.663811 ], [ -75.182756, 40.665971 ], [ -75.177491, 40.672595 ], [ -75.176803, 40.675715 ], [ -75.177587, 40.677731 ], [ -75.180564, 40.679363 ], [ -75.184516, 40.679971 ], [ -75.190580, 40.679379 ], [ -75.196920, 40.681299 ], [ -75.200920, 40.685498 ], [ -75.203920, 40.691498 ], [ -75.198720, 40.705298 ], [ -75.194420, 40.714018 ], [ -75.192612, 40.715874 ], [ -75.189412, 40.717970 ], [ -75.186372, 40.723970 ], [ -75.182500, 40.729922 ], [ -75.182084, 40.731522 ], [ -75.182804, 40.733650 ], [ -75.185780, 40.737266 ], [ -75.195349, 40.745473 ], [ -75.196325, 40.747137 ], [ -75.196861, 40.750097 ], [ -75.196533, 40.751631 ], [ -75.191796, 40.755830 ], [ -75.183037, 40.759344 ], [ -75.179040, 40.761897 ], [ -75.177477, 40.764225 ], [ -75.176855, 40.768721 ], [ -75.175620, 40.772923 ], [ -75.173349, 40.776129 ], [ -75.171587, 40.777745 ], [ -75.169523, 40.778473 ], [ -75.163650, 40.778386 ], [ -75.149378, 40.774786 ], [ -75.139106, 40.773606 ], [ -75.134400, 40.773765 ], [ -75.133303, 40.774124 ], [ -75.131465, 40.775950 ], [ -75.125867, 40.784026 ], [ -75.123088, 40.786746 ], [ -75.116842, 40.789350 ], [ -75.111343, 40.789896 ], [ -75.108505, 40.791094 ], [ -75.100800, 40.799797 ], [ -75.100277, 40.801176 ], [ -75.100165, 40.803000 ], [ -75.100739, 40.805488 ], [ -75.100277, 40.807578 ], [ -75.098279, 40.810286 ], [ -75.096147, 40.812211 ], [ -75.090518, 40.815913 ], [ -75.085387, 40.821972 ], [ -75.083929, 40.824471 ], [ -75.083822, 40.827805 ], [ -75.085517, 40.830085 ], [ -75.094940, 40.837103 ], [ -75.097006, 40.839336 ], [ -75.097572, 40.840967 ], [ -75.097586, 40.843042 ], [ -75.097221, 40.844672 ], [ -75.095784, 40.847082 ], [ -75.090962, 40.849187 ], [ -75.076684, 40.849875 ], [ -75.073544, 40.848940 ], [ -75.070830, 40.847392 ], [ -75.066014, 40.847591 ], [ -75.064328, 40.848338 ], [ -75.060491, 40.853020 ], [ -75.053294, 40.859900 ], [ -75.051029, 40.865662 ], [ -75.050839, 40.868067 ], [ -75.051508, 40.870224 ], [ -75.053664, 40.873660 ], [ -75.058655, 40.877654 ], [ -75.062149, 40.882289 ], [ -75.065438, 40.885682 ], [ -75.073920, 40.892176 ], [ -75.075340, 40.894162 ], [ -75.075957, 40.895694 ], [ -75.075188, 40.900154 ], [ -75.076092, 40.907042 ], [ -75.076956, 40.909880 ], [ -75.079279, 40.913890 ], [ -75.095526, 40.924152 ], [ -75.097720, 40.926679 ], [ -75.105524, 40.936294 ], [ -75.106153, 40.939671 ], [ -75.111683, 40.948111 ], [ -75.117764, 40.953023 ], [ -75.118904, 40.956361 ], [ -75.119893, 40.961646 ], [ -75.120316, 40.962630 ], [ -75.120650, 40.964028 ], [ -75.119770, 40.966510 ], [ -75.120435, 40.968302 ], [ -75.122603, 40.970152 ], [ -75.129074, 40.968976 ], [ -75.131364, 40.969277 ], [ -75.133780, 40.970973 ], [ -75.135526, 40.973807 ], [ -75.135521, 40.976865 ], [ -75.133086, 40.980179 ], [ -75.132106, 40.982566 ], [ -75.131530, 40.984914 ], [ -75.131619, 40.988900 ], [ -75.130575, 40.991093 ], [ -75.127196, 40.993954 ], [ -75.123423, 40.996129 ], [ -75.110595, 41.002174 ], [ -75.109114, 41.004102 ], [ -75.100682, 41.006716 ], [ -75.095556, 41.008874 ], [ -75.090312, 41.013302 ], [ -75.089787, 41.014549 ], [ -75.081101, 41.016838 ], [ -75.074999, 41.017130 ], [ -75.070532, 41.018620 ], [ -75.040668, 41.031755 ], [ -75.034496, 41.036755 ], [ -75.030701, 41.038416 ], [ -75.025777, 41.039806 ], [ -75.025430, 41.040710 ], [ -75.026376, 41.044440 ], [ -75.025702, 41.046482 ], [ -75.019186, 41.052968 ], [ -75.017239, 41.055491 ], [ -75.015867, 41.058210 ], [ -75.015271, 41.061215 ], [ -75.012570, 41.066281 ], [ -75.011133, 41.067521 ], [ -75.006376, 41.067546 ], [ -74.999617, 41.073943 ], [ -74.994847, 41.076556 ], [ -74.989332, 41.078319 ], [ -74.982590, 41.079172 ], [ -74.970987, 41.085293 ], [ -74.968389, 41.087797 ], [ -74.966759, 41.093425 ], [ -74.967464, 41.095327 ], [ -74.969434, 41.096074 ], [ -74.972036, 41.095562 ], [ -74.975298, 41.094073 ], [ -74.981314, 41.089860 ], [ -74.984782, 41.088545 ], [ -74.988263, 41.088222 ], [ -74.991013, 41.088578 ], [ -74.991815, 41.089132 ], [ -74.991718, 41.092284 ], [ -74.982212, 41.108245 ], [ -74.979873, 41.110423 ], [ -74.972917, 41.113327 ], [ -74.969312, 41.113869 ], [ -74.966298, 41.113669 ], [ -74.964294, 41.114237 ], [ -74.947912, 41.123560 ], [ -74.947334, 41.124439 ], [ -74.947714, 41.126292 ], [ -74.945067, 41.129052 ], [ -74.931141, 41.133387 ], [ -74.923169, 41.138146 ], [ -74.905256, 41.155668 ], [ -74.901780, 41.161394 ], [ -74.901172, 41.163870 ], [ -74.899701, 41.166181 ], [ -74.889424, 41.173600 ], [ -74.882139, 41.180836 ], [ -74.878492, 41.187504 ], [ -74.878275, 41.190489 ], [ -74.874034, 41.198543 ], [ -74.867287, 41.208754 ], [ -74.860398, 41.217454 ], [ -74.859632, 41.219077 ], [ -74.859323, 41.220507 ], [ -74.860837, 41.222317 ], [ -74.866839, 41.226865 ], [ -74.867405, 41.227770 ], [ -74.866182, 41.232132 ], [ -74.862049, 41.237609 ], [ -74.861678, 41.241575 ], [ -74.857151, 41.248975 ], [ -74.856003, 41.250094 ], [ -74.854669, 41.250510 ], [ -74.848987, 41.251192 ], [ -74.846932, 41.253318 ], [ -74.845883, 41.254945 ], [ -74.845031, 41.258055 ], [ -74.846506, 41.261576 ], [ -74.846319, 41.263077 ], [ -74.841137, 41.270980 ], [ -74.838366, 41.277286 ], [ -74.834067, 41.281111 ], [ -74.830057, 41.287200 ], [ -74.821884, 41.293838 ], [ -74.815703, 41.296151 ], [ -74.812033, 41.298157 ], [ -74.806858, 41.303155 ], [ -74.792558, 41.310628 ], [ -74.791991, 41.311639 ], [ -74.792377, 41.314088 ], [ -74.795822, 41.318516 ], [ -74.795040, 41.320407 ], [ -74.792116, 41.322465 ], [ -74.789095, 41.323281 ], [ -74.781584, 41.324229 ], [ -74.774887, 41.324326 ], [ -74.771588, 41.325079 ], [ -74.766714, 41.328558 ], [ -74.763499, 41.331568 ], [ -74.760325, 41.340325 ], [ -74.755971, 41.344953 ], [ -74.753239, 41.346122 ], [ -74.735622, 41.346518 ], [ -74.730373, 41.345983 ], [ -74.720923, 41.347384 ], [ -74.708514, 41.352734 ], [ -74.704429, 41.354043 ], [ -74.700595, 41.354553 ], [ -74.694914, 41.357423 ], [ -74.641544, 41.332879 ], [ -74.607348, 41.317774 ], [ -74.499603, 41.267344 ], [ -74.457584, 41.248225 ], [ -74.378898, 41.208994 ], [ -74.320995, 41.182394 ], [ -74.301994, 41.172594 ], [ -74.234473, 41.142883 ], [ -74.182390, 41.121595 ], [ -74.096786, 41.083796 ], [ -74.092486, 41.081896 ], [ -74.041054, 41.059088 ], [ -74.041049, 41.059086 ], [ -73.911880, 41.001297 ], [ -73.907054, 40.998476 ], [ -73.905010, 40.997591 ], [ -73.902680, 40.997297 ], [ -73.893979, 40.997197 ], [ -73.896479, 40.981697 ], [ -73.907280, 40.951498 ], [ -73.915580, 40.924898 ], [ -73.917680, 40.919498 ], [ -73.917905, 40.917577 ], [ -73.918405, 40.917477 ], [ -73.919705, 40.913478 ], [ -73.929006, 40.889578 ], [ -73.933406, 40.882078 ], [ -73.938081, 40.874699 ], [ -73.948281, 40.858399 ], [ -73.953982, 40.848000 ], [ -73.963182, 40.826900 ], [ -73.968082, 40.820700 ], [ -74.009184, 40.763601 ], [ -74.013784, 40.756601 ], [ -74.021117, 40.727417 ], [ -74.024543, 40.709436 ], [ -74.038538, 40.710741 ], [ -74.051184, 40.695802 ], [ -74.068341, 40.660362 ], [ -74.087452, 40.653742 ], [ -74.094086, 40.649703 ], [ -74.143387, 40.641903 ], [ -74.181083, 40.646484 ], [ -74.186027, 40.646076 ], [ -74.189106, 40.643832 ], [ -74.202223, 40.631053 ], [ -74.208988, 40.576304 ], [ -74.214788, 40.560604 ], [ -74.218189, 40.557204 ], [ -74.231589, 40.559204 ], [ -74.248641, 40.549601 ], [ -74.251441, 40.542301 ], [ -74.246237, 40.520963 ], [ -74.268290, 40.499205 ], [ -74.272690, 40.488405 ], [ -74.267590, 40.471806 ], [ -74.261889, 40.464706 ], [ -74.236689, 40.457806 ], [ -74.209788, 40.447407 ], [ -74.206188, 40.440707 ], [ -74.206419, 40.438789 ], [ -74.208655, 40.437520 ], [ -74.207205, 40.435434 ], [ -74.202128, 40.438940 ], [ -74.193908, 40.440995 ], [ -74.191309, 40.442990 ], [ -74.187787, 40.447407 ], [ -74.174787, 40.455607 ], [ -74.174893, 40.454491 ], [ -74.175074, 40.449144 ], [ -74.176842, 40.447740 ], [ -74.175346, 40.446607 ], [ -74.169977, 40.450640 ], [ -74.167009, 40.448737 ], [ -74.166193, 40.447128 ], [ -74.164029, 40.448312 ], [ -74.163314, 40.448424 ], [ -74.157787, 40.446607 ], [ -74.153611, 40.447647 ], [ -74.152686, 40.447344 ], [ -74.151952, 40.448062 ], [ -74.142886, 40.450407 ], [ -74.139886, 40.453407 ], [ -74.138415, 40.454468 ], [ -74.135823, 40.455196 ], [ -74.133727, 40.454672 ], [ -74.131135, 40.453245 ], [ -74.127466, 40.451061 ], [ -74.124692, 40.449580 ], [ -74.122327, 40.448258 ], [ -74.116863, 40.446069 ], [ -74.088085, 40.438407 ], [ -74.076185, 40.433707 ], [ -74.058984, 40.422708 ], [ -74.047884, 40.418908 ], [ -74.006383, 40.411108 ], [ -73.998505, 40.410911 ], [ -73.995486, 40.419472 ], [ -73.991682, 40.442908 ], [ -74.006077, 40.464625 ], [ -74.017783, 40.472207 ], [ -74.017917, 40.474338 ], [ -74.014031, 40.476471 ], [ -74.007100, 40.475298 ], [ -73.995683, 40.468707 ], [ -73.978282, 40.440208 ], [ -73.976982, 40.408508 ], [ -73.971381, 40.371709 ], [ -73.971381, 40.348010 ], [ -73.977442, 40.299373 ], [ -73.981681, 40.279411 ], [ -73.993292, 40.237669 ], [ -74.030181, 40.122814 ], [ -74.034080, 40.103115 ], [ -74.031318, 40.100541 ], [ -74.033546, 40.099518 ], [ -74.039421, 40.081437 ], [ -74.064135, 39.979157 ], [ -74.077247, 39.910991 ], [ -74.090945, 39.799978 ], [ -74.097071, 39.767847 ], [ -74.096906, 39.763030 ], [ -74.098920, 39.759538 ], [ -74.101443, 39.756173 ], [ -74.113655, 39.740719 ], [ -74.141733, 39.689435 ], [ -74.190974, 39.625118 ], [ -74.240506, 39.554911 ], [ -74.249043, 39.547994 ], [ -74.277370, 39.514064 ], [ -74.292034, 39.502381 ], [ -74.302531, 39.500171 ], [ -74.304959, 39.507024 ], [ -74.311037, 39.506715 ], [ -74.313689, 39.493874 ], [ -74.308344, 39.483945 ], [ -74.304778, 39.482945 ], [ -74.302184, 39.478935 ], [ -74.304343, 39.471445 ], [ -74.334804, 39.432001 ], [ -74.366990, 39.402017 ], [ -74.406692, 39.377516 ], [ -74.406792, 39.373916 ], [ -74.408237, 39.365071 ], [ -74.412692, 39.360816 ], [ -74.459894, 39.345016 ], [ -74.521797, 39.313816 ], [ -74.551151, 39.293539 ], [ -74.553439, 39.286915 ], [ -74.560957, 39.278677 ], [ -74.581008, 39.270819 ], [ -74.597921, 39.258851 ], [ -74.614481, 39.244659 ], [ -74.636306, 39.220834 ], [ -74.646595, 39.212002 ], [ -74.651443, 39.198578 ], [ -74.671430, 39.179802 ], [ -74.714341, 39.119804 ], [ -74.715320, 39.116893 ], [ -74.714135, 39.114631 ], [ -74.704409, 39.107858 ], [ -74.705876, 39.102937 ], [ -74.738316, 39.074727 ], [ -74.778777, 39.023073 ], [ -74.786356, 39.000113 ], [ -74.792723, 38.991991 ], [ -74.807917, 38.985948 ], [ -74.819354, 38.979402 ], [ -74.850748, 38.954538 ], [ -74.864458, 38.940410 ], [ -74.865198, 38.941439 ], [ -74.870497, 38.943543 ], [ -74.882309, 38.941759 ], [ -74.907050, 38.931994 ], [ -74.920414, 38.929136 ], [ -74.933571, 38.928519 ], [ -74.963463, 38.931194 ], [ -74.967274, 38.933413 ], [ -74.971995, 38.940370 ], [ -74.955363, 39.001262 ], [ -74.949470, 39.015637 ], [ -74.938320, 39.035185 ], [ -74.903664, 39.087437 ], [ -74.897784, 39.098811 ], [ -74.892547, 39.113183 ], [ -74.885914, 39.143627 ], [ -74.887167, 39.158825 ], [ -74.905181, 39.174945 ], [ -74.962382, 39.190238 ], [ -74.976266, 39.192271 ], [ -74.998002, 39.191253 ], [ -75.026179, 39.193621 ], [ -75.028885, 39.194560 ], [ -75.027824, 39.199482 ], [ -75.023586, 39.202594 ], [ -75.023437, 39.204791 ], [ -75.026376, 39.209850 ], [ -75.035672, 39.215415 ], [ -75.041663, 39.215511 ], [ -75.047797, 39.211702 ], [ -75.052326, 39.213609 ], [ -75.062506, 39.213564 ], [ -75.086395, 39.208159 ], [ -75.101019, 39.211657 ], [ -75.107286, 39.211403 ], [ -75.114748, 39.207554 ], [ -75.127070, 39.189766 ], [ -75.136548, 39.179425 ], [ -75.139136, 39.180021 ], [ -75.165979, 39.201842 ], [ -75.164798, 39.216606 ], [ -75.170444, 39.234643 ], [ -75.177506, 39.242746 ], [ -75.183030, 39.246619 ], [ -75.191863, 39.245700 ], [ -75.196756, 39.256240 ], [ -75.205857, 39.262619 ], [ -75.212510, 39.262755 ], [ -75.241639, 39.274097 ], [ -75.244056, 39.277690 ], [ -75.242881, 39.280574 ], [ -75.244357, 39.285700 ], [ -75.251806, 39.299913 ], [ -75.271629, 39.304041 ], [ -75.282620, 39.299055 ], [ -75.285333, 39.292212 ], [ -75.288898, 39.289557 ], [ -75.306010, 39.301712 ], [ -75.315201, 39.310593 ], [ -75.326754, 39.332473 ], [ -75.327463, 39.339270 ], [ -75.333743, 39.345335 ], [ -75.341969, 39.348697 ], [ -75.355558, 39.347823 ], [ -75.365016, 39.341388 ], [ -75.390030, 39.358259 ], [ -75.394331, 39.363753 ], [ -75.395181, 39.371398 ], [ -75.399304, 39.379490 ], [ -75.422099, 39.386521 ], [ -75.431803, 39.391625 ], [ -75.442393, 39.402291 ], [ -75.465212, 39.438930 ], [ -75.476279, 39.438126 ], [ -75.483572, 39.440824 ], [ -75.505672, 39.452927 ], [ -75.508383, 39.459131 ], [ -75.536431, 39.460559 ], [ -75.542894, 39.470447 ], [ -75.544368, 39.479602 ], [ -75.542693, 39.496568 ], [ -75.528088, 39.498114 ], [ -75.527141, 39.500112 ], [ -75.529368, 39.501229 ], [ -75.530140, 39.505373 ], [ -75.529978, 39.510817 ], [ -75.526654, 39.526638 ], [ -75.526787, 39.531440 ], [ -75.527676, 39.535278 ], [ -75.531575, 39.536825 ], [ -75.534014, 39.540702 ], [ -75.532342, 39.543280 ], [ -75.526003, 39.548488 ], [ -75.519026, 39.555401 ], [ -75.514756, 39.562612 ], [ -75.511932, 39.567616 ], [ -75.512732, 39.578000 ], [ -75.515228, 39.580752 ], [ -75.519628, 39.583248 ], [ -75.521596, 39.583088 ], [ -75.525677, 39.584048 ], [ -75.531133, 39.587984 ], [ -75.534477, 39.590384 ], [ -75.537213, 39.592944 ], [ -75.539540, 39.594251 ], [ -75.539949, 39.594384 ], [ -75.543965, 39.596000 ], [ -75.545405, 39.596784 ], [ -75.553502, 39.602000 ], [ -75.555870, 39.605824 ], [ -75.556734, 39.606688 ], [ -75.557502, 39.609184 ], [ -75.556878, 39.612144 ], [ -75.558446, 39.617296 ], [ -75.559614, 39.624208 ], [ -75.559102, 39.629056 ], [ -75.559446, 39.629812 ], [ -75.556246, 39.634912 ], [ -75.550645, 39.637912 ], [ -75.547197, 39.640528 ], [ -75.542045, 39.646012 ], [ -75.539245, 39.646112 ], [ -75.535144, 39.647212 ], [ -75.526744, 39.655113 ], [ -75.526844, 39.655713 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US36", "STATE": "36", "NAME": "New York", "LSAD": "", "CENSUSAREA": 47126.399000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -71.943563, 41.286675 ], [ -71.926802, 41.290122 ], [ -71.935259, 41.280579 ], [ -71.946270, 41.276306 ], [ -71.962598, 41.270968 ], [ -71.978926, 41.265002 ], [ -71.994717, 41.256451 ], [ -72.002461, 41.252867 ], [ -72.036846, 41.249794 ], [ -72.034958, 41.255458 ], [ -72.029438, 41.263090 ], [ -72.023422, 41.270994 ], [ -72.018926, 41.274114 ], [ -72.006872, 41.273480 ], [ -71.991117, 41.281331 ], [ -71.980061, 41.280291 ], [ -71.952864, 41.285098 ], [ -71.943563, 41.286675 ] ] ], [ [ [ -72.132225, 41.104387 ], [ -72.128352, 41.108131 ], [ -72.126704, 41.115139 ], [ -72.084207, 41.101524 ], [ -72.081167, 41.093940 ], [ -72.086975, 41.058292 ], [ -72.095711, 41.054020 ], [ -72.097200, 41.054884 ], [ -72.097136, 41.075844 ], [ -72.103152, 41.086484 ], [ -72.106400, 41.088883 ], [ -72.120560, 41.093171 ], [ -72.139233, 41.092451 ], [ -72.141921, 41.094371 ], [ -72.142929, 41.097811 ], [ -72.140737, 41.100835 ], [ -72.132225, 41.104387 ] ] ], [ [ [ -73.657336, 40.985171 ], [ -73.655972, 40.979597 ], [ -73.659972, 40.968398 ], [ -73.662072, 40.966198 ], [ -73.664472, 40.967198 ], [ -73.678073, 40.962798 ], [ -73.683273, 40.948998 ], [ -73.686473, 40.945198 ], [ -73.697974, 40.939598 ], [ -73.721739, 40.932037 ], [ -73.731775, 40.924999 ], [ -73.756776, 40.912599 ], [ -73.781338, 40.885447 ], [ -73.784803, 40.878528 ], [ -73.785502, 40.869079 ], [ -73.788786, 40.858485 ], [ -73.788060, 40.854131 ], [ -73.784754, 40.851793 ], [ -73.782174, 40.847358 ], [ -73.782093, 40.844616 ], [ -73.782254, 40.842359 ], [ -73.781206, 40.838891 ], [ -73.782577, 40.837601 ], [ -73.783867, 40.836795 ], [ -73.785399, 40.838004 ], [ -73.788221, 40.842036 ], [ -73.791044, 40.846552 ], [ -73.789512, 40.851390 ], [ -73.792253, 40.855825 ], [ -73.793785, 40.855583 ], [ -73.797252, 40.852196 ], [ -73.799543, 40.848027 ], [ -73.806914, 40.849501 ], [ -73.812810, 40.846737 ], [ -73.815574, 40.835129 ], [ -73.815205, 40.831075 ], [ -73.811889, 40.825363 ], [ -73.804518, 40.818546 ], [ -73.797332, 40.815597 ], [ -73.781369, 40.794907 ], [ -73.776032, 40.795275 ], [ -73.768301, 40.800797 ], [ -73.754032, 40.820941 ], [ -73.754400, 40.826837 ], [ -73.728275, 40.852900 ], [ -73.726675, 40.856800 ], [ -73.730675, 40.865400 ], [ -73.729575, 40.866500 ], [ -73.713674, 40.870099 ], [ -73.675573, 40.856999 ], [ -73.655872, 40.863899 ], [ -73.654372, 40.878199 ], [ -73.641072, 40.892599 ], [ -73.633771, 40.898198 ], [ -73.626972, 40.899397 ], [ -73.617571, 40.897898 ], [ -73.601870, 40.902798 ], [ -73.595170, 40.907298 ], [ -73.569969, 40.915398 ], [ -73.566169, 40.915798 ], [ -73.548068, 40.908698 ], [ -73.519267, 40.914298 ], [ -73.514999, 40.912821 ], [ -73.499941, 40.918166 ], [ -73.496642, 40.923476 ], [ -73.491765, 40.942097 ], [ -73.485365, 40.946397 ], [ -73.478365, 40.942297 ], [ -73.463708, 40.937697 ], [ -73.436664, 40.934897 ], [ -73.429863, 40.929797 ], [ -73.428836, 40.921506 ], [ -73.406074, 40.920235 ], [ -73.402963, 40.925097 ], [ -73.403462, 40.942197 ], [ -73.400862, 40.953997 ], [ -73.399762, 40.955197 ], [ -73.392862, 40.955297 ], [ -73.374462, 40.937597 ], [ -73.365961, 40.931697 ], [ -73.352761, 40.926697 ], [ -73.345561, 40.925297 ], [ -73.344161, 40.927297 ], [ -73.331360, 40.929597 ], [ -73.295059, 40.924497 ], [ -73.229285, 40.905121 ], [ -73.148994, 40.928898 ], [ -73.146242, 40.935074 ], [ -73.144673, 40.955842 ], [ -73.154446, 40.961658 ], [ -73.159576, 40.968448 ], [ -73.137497, 40.966801 ], [ -73.118331, 40.978071 ], [ -73.110368, 40.971938 ], [ -73.081582, 40.973058 ], [ -73.043701, 40.962185 ], [ -73.040445, 40.964498 ], [ -72.995931, 40.966498 ], [ -72.955163, 40.966146 ], [ -72.913834, 40.962466 ], [ -72.888250, 40.962962 ], [ -72.826057, 40.969794 ], [ -72.774104, 40.965314 ], [ -72.760031, 40.975334 ], [ -72.714425, 40.985596 ], [ -72.689341, 40.989776 ], [ -72.665018, 40.987496 ], [ -72.635374, 40.990536 ], [ -72.585327, 40.997587 ], [ -72.565406, 41.009508 ], [ -72.560974, 41.015444 ], [ -72.549853, 41.019844 ], [ -72.521548, 41.037652 ], [ -72.477306, 41.052212 ], [ -72.460778, 41.067012 ], [ -72.445242, 41.086116 ], [ -72.417945, 41.087955 ], [ -72.397000, 41.096307 ], [ -72.356087, 41.133635 ], [ -72.333351, 41.138018 ], [ -72.322381, 41.140664 ], [ -72.291109, 41.155874 ], [ -72.278789, 41.158722 ], [ -72.272997, 41.155010 ], [ -72.268100, 41.154146 ], [ -72.245348, 41.161217 ], [ -72.238211, 41.159490 ], [ -72.237731, 41.156434 ], [ -72.253572, 41.137138 ], [ -72.265124, 41.128482 ], [ -72.300374, 41.112274 ], [ -72.300044, 41.132059 ], [ -72.306381, 41.137840 ], [ -72.312734, 41.138546 ], [ -72.318146, 41.137134 ], [ -72.326630, 41.132162 ], [ -72.335271, 41.120274 ], [ -72.335177, 41.106917 ], [ -72.317238, 41.088659 ], [ -72.297718, 41.081042 ], [ -72.280373, 41.080402 ], [ -72.276709, 41.076722 ], [ -72.283093, 41.067874 ], [ -72.273657, 41.051533 ], [ -72.260515, 41.042065 ], [ -72.241252, 41.044770 ], [ -72.229364, 41.044355 ], [ -72.217476, 41.040611 ], [ -72.201859, 41.032275 ], [ -72.190563, 41.032579 ], [ -72.183266, 41.035619 ], [ -72.179490, 41.038435 ], [ -72.174882, 41.046147 ], [ -72.162898, 41.053187 ], [ -72.160370, 41.053827 ], [ -72.153857, 41.051859 ], [ -72.137297, 41.039684 ], [ -72.135137, 41.031284 ], [ -72.137409, 41.023908 ], [ -72.116368, 40.999796 ], [ -72.109008, 40.994084 ], [ -72.102160, 40.991509 ], [ -72.095456, 40.991349 ], [ -72.083039, 40.996453 ], [ -72.079951, 41.003429 ], [ -72.079208, 41.006437 ], [ -72.076175, 41.009093 ], [ -72.055424, 41.022257 ], [ -72.047468, 41.022565 ], [ -72.035792, 41.020759 ], [ -72.015013, 41.028348 ], [ -71.999260, 41.039669 ], [ -71.991409, 41.048809 ], [ -71.981098, 41.048809 ], [ -71.980033, 41.044504 ], [ -71.967040, 41.047772 ], [ -71.961078, 41.054277 ], [ -71.960355, 41.059878 ], [ -71.961563, 41.064021 ], [ -71.959595, 41.071237 ], [ -71.938250, 41.077413 ], [ -71.919385, 41.080517 ], [ -71.899256, 41.080837 ], [ -71.895496, 41.077381 ], [ -71.889543, 41.075701 ], [ -71.869558, 41.075046 ], [ -71.864470, 41.076918 ], [ -71.857494, 41.073558 ], [ -71.856214, 41.070598 ], [ -71.873910, 41.052278 ], [ -71.903736, 41.040166 ], [ -71.935689, 41.034182 ], [ -72.029357, 40.999909 ], [ -72.114448, 40.972085 ], [ -72.395850, 40.866660 ], [ -72.469996, 40.842740 ], [ -72.573441, 40.813251 ], [ -72.745208, 40.767091 ], [ -72.753112, 40.763571 ], [ -72.757176, 40.764371 ], [ -72.768152, 40.761587 ], [ -72.863164, 40.732962 ], [ -72.923214, 40.713282 ], [ -73.012545, 40.679651 ], [ -73.054963, 40.666371 ], [ -73.208440, 40.630884 ], [ -73.239140, 40.625100 ], [ -73.262106, 40.621476 ], [ -73.306396, 40.620756 ], [ -73.309740, 40.622532 ], [ -73.319257, 40.635795 ], [ -73.351465, 40.630500 ], [ -73.391967, 40.617501 ], [ -73.450369, 40.603501 ], [ -73.484915, 40.597394 ], [ -73.575357, 40.573723 ], [ -73.574409, 40.585390 ], [ -73.583773, 40.586703 ], [ -73.610873, 40.587703 ], [ -73.646674, 40.582804 ], [ -73.754776, 40.584404 ], [ -73.753349, 40.590560 ], [ -73.774928, 40.590759 ], [ -73.806834, 40.584619 ], [ -73.834408, 40.577201 ], [ -73.878906, 40.560888 ], [ -73.940591, 40.542896 ], [ -73.940247, 40.554582 ], [ -73.932729, 40.560266 ], [ -73.935686, 40.564914 ], [ -73.944558, 40.568716 ], [ -73.950050, 40.573363 ], [ -73.991346, 40.570350 ], [ -74.002056, 40.570623 ], [ -74.009030, 40.572846 ], [ -74.012022, 40.574528 ], [ -74.012996, 40.578169 ], [ -74.007276, 40.583616 ], [ -74.001591, 40.590684 ], [ -74.003281, 40.595754 ], [ -74.010926, 40.600789 ], [ -74.032856, 40.604421 ], [ -74.039590, 40.612934 ], [ -74.042412, 40.624847 ], [ -74.038336, 40.637074 ], [ -74.032066, 40.646479 ], [ -74.018272, 40.659019 ], [ -74.020467, 40.678770 ], [ -74.023982, 40.682360 ], [ -74.024827, 40.687007 ], [ -74.021721, 40.693504 ], [ -74.018490, 40.695457 ], [ -74.016800, 40.701794 ], [ -74.019526, 40.706985 ], [ -74.024543, 40.709436 ], [ -74.021117, 40.727417 ], [ -74.013784, 40.756601 ], [ -74.009184, 40.763601 ], [ -73.968082, 40.820700 ], [ -73.963182, 40.826900 ], [ -73.953982, 40.848000 ], [ -73.948281, 40.858399 ], [ -73.938081, 40.874699 ], [ -73.933406, 40.882078 ], [ -73.929006, 40.889578 ], [ -73.919705, 40.913478 ], [ -73.918405, 40.917477 ], [ -73.917905, 40.917577 ], [ -73.917680, 40.919498 ], [ -73.915580, 40.924898 ], [ -73.907280, 40.951498 ], [ -73.896479, 40.981697 ], [ -73.893979, 40.997197 ], [ -73.902680, 40.997297 ], [ -73.905010, 40.997591 ], [ -73.907054, 40.998476 ], [ -73.911880, 41.001297 ], [ -74.041049, 41.059086 ], [ -74.041054, 41.059088 ], [ -74.092486, 41.081896 ], [ -74.096786, 41.083796 ], [ -74.182390, 41.121595 ], [ -74.234473, 41.142883 ], [ -74.301994, 41.172594 ], [ -74.320995, 41.182394 ], [ -74.378898, 41.208994 ], [ -74.457584, 41.248225 ], [ -74.499603, 41.267344 ], [ -74.607348, 41.317774 ], [ -74.641544, 41.332879 ], [ -74.694914, 41.357423 ], [ -74.696398, 41.357339 ], [ -74.691076, 41.360340 ], [ -74.689767, 41.361558 ], [ -74.689516, 41.363843 ], [ -74.691129, 41.367324 ], [ -74.694968, 41.370431 ], [ -74.703282, 41.375093 ], [ -74.708458, 41.378901 ], [ -74.710391, 41.382102 ], [ -74.713411, 41.389814 ], [ -74.715979, 41.392584 ], [ -74.720891, 41.394690 ], [ -74.730384, 41.395660 ], [ -74.733640, 41.396975 ], [ -74.736103, 41.398398 ], [ -74.738554, 41.401191 ], [ -74.740963, 41.405120 ], [ -74.741717, 41.407880 ], [ -74.741086, 41.411413 ], [ -74.738684, 41.413463 ], [ -74.734731, 41.422699 ], [ -74.734893, 41.425818 ], [ -74.735519, 41.427465 ], [ -74.736688, 41.429228 ], [ -74.738455, 41.430641 ], [ -74.740932, 41.431160 ], [ -74.743821, 41.430635 ], [ -74.750680, 41.427984 ], [ -74.754359, 41.425147 ], [ -74.758587, 41.423287 ], [ -74.763701, 41.423612 ], [ -74.770650, 41.426230 ], [ -74.773239, 41.426352 ], [ -74.778029, 41.425104 ], [ -74.784339, 41.422397 ], [ -74.790417, 41.421660 ], [ -74.793856, 41.422671 ], [ -74.795396, 41.423980 ], [ -74.799546, 41.431290 ], [ -74.800095, 41.432661 ], [ -74.800370, 41.436060 ], [ -74.801225, 41.438100 ], [ -74.805655, 41.442101 ], [ -74.807582, 41.442847 ], [ -74.812123, 41.442982 ], [ -74.817995, 41.440505 ], [ -74.822880, 41.436792 ], [ -74.826031, 41.431736 ], [ -74.828592, 41.430698 ], [ -74.830671, 41.430503 ], [ -74.834635, 41.430796 ], [ -74.836915, 41.431625 ], [ -74.845572, 41.437577 ], [ -74.848602, 41.440179 ], [ -74.854200, 41.443166 ], [ -74.858578, 41.444427 ], [ -74.864688, 41.443993 ], [ -74.876721, 41.440338 ], [ -74.888691, 41.438259 ], [ -74.893913, 41.438930 ], [ -74.896025, 41.439987 ], [ -74.896399, 41.442179 ], [ -74.894931, 41.446099 ], [ -74.889075, 41.451245 ], [ -74.889116, 41.452534 ], [ -74.890358, 41.455324 ], [ -74.892114, 41.456959 ], [ -74.895069, 41.458190 ], [ -74.904200, 41.459806 ], [ -74.906887, 41.461131 ], [ -74.908103, 41.464639 ], [ -74.908133, 41.468117 ], [ -74.909181, 41.472436 ], [ -74.912517, 41.475605 ], [ -74.917282, 41.477041 ], [ -74.924092, 41.477138 ], [ -74.926835, 41.478327 ], [ -74.932585, 41.482323 ], [ -74.941798, 41.483542 ], [ -74.945634, 41.483213 ], [ -74.948080, 41.480625 ], [ -74.956411, 41.476735 ], [ -74.958260, 41.476396 ], [ -74.969887, 41.477438 ], [ -74.981652, 41.479945 ], [ -74.983341, 41.480894 ], [ -74.985004, 41.483703 ], [ -74.985595, 41.485863 ], [ -74.985247, 41.489113 ], [ -74.982463, 41.496467 ], [ -74.982168, 41.498486 ], [ -74.982385, 41.500981 ], [ -74.984372, 41.506611 ], [ -74.985653, 41.507926 ], [ -74.987645, 41.508738 ], [ -74.993893, 41.508754 ], [ -74.999612, 41.507400 ], [ -75.003151, 41.508101 ], [ -75.003694, 41.509295 ], [ -75.003706, 41.511118 ], [ -75.002592, 41.514560 ], [ -75.000935, 41.517638 ], [ -75.000911, 41.519292 ], [ -75.001297, 41.520650 ], [ -75.003850, 41.524052 ], [ -75.009552, 41.528461 ], [ -75.014919, 41.531399 ], [ -75.016616, 41.532110 ], [ -75.023018, 41.533147 ], [ -75.024206, 41.534018 ], [ -75.024757, 41.535099 ], [ -75.024798, 41.539801 ], [ -75.022828, 41.541456 ], [ -75.017626, 41.542734 ], [ -75.016144, 41.544246 ], [ -75.016328, 41.546501 ], [ -75.018524, 41.551802 ], [ -75.027343, 41.563541 ], [ -75.029211, 41.564637 ], [ -75.033162, 41.565092 ], [ -75.036989, 41.567049 ], [ -75.040490, 41.569688 ], [ -75.043879, 41.575094 ], [ -75.046760, 41.583258 ], [ -75.052858, 41.587772 ], [ -75.060012, 41.590813 ], [ -75.063677, 41.594739 ], [ -75.066955, 41.599428 ], [ -75.074613, 41.605711 ], [ -75.074626, 41.607905 ], [ -75.071667, 41.609501 ], [ -75.067795, 41.610143 ], [ -75.062716, 41.609639 ], [ -75.059725, 41.610801 ], [ -75.059956, 41.612306 ], [ -75.061675, 41.615468 ], [ -75.061560, 41.616429 ], [ -75.060098, 41.617482 ], [ -75.053850, 41.618655 ], [ -75.051856, 41.618157 ], [ -75.048385, 41.615986 ], [ -75.047298, 41.615791 ], [ -75.045508, 41.616203 ], [ -75.044224, 41.617978 ], [ -75.043562, 41.623640 ], [ -75.048199, 41.632011 ], [ -75.048658, 41.633781 ], [ -75.049281, 41.641862 ], [ -75.048683, 41.656317 ], [ -75.049920, 41.662556 ], [ -75.053991, 41.668194 ], [ -75.057251, 41.668933 ], [ -75.058430, 41.669653 ], [ -75.059332, 41.672320 ], [ -75.058765, 41.674412 ], [ -75.052653, 41.678436 ], [ -75.051285, 41.679961 ], [ -75.051234, 41.682439 ], [ -75.052736, 41.688393 ], [ -75.056745, 41.695703 ], [ -75.059829, 41.699716 ], [ -75.067278, 41.705434 ], [ -75.068830, 41.708161 ], [ -75.068642, 41.710146 ], [ -75.066630, 41.712588 ], [ -75.061174, 41.712935 ], [ -75.052226, 41.711396 ], [ -75.050689, 41.711969 ], [ -75.049862, 41.713309 ], [ -75.049699, 41.715093 ], [ -75.053527, 41.727150 ], [ -75.054818, 41.735168 ], [ -75.052808, 41.744725 ], [ -75.053431, 41.752538 ], [ -75.060759, 41.764638 ], [ -75.064901, 41.766686 ], [ -75.068567, 41.767298 ], [ -75.072664, 41.768807 ], [ -75.074231, 41.770518 ], [ -75.075942, 41.771518 ], [ -75.079478, 41.771205 ], [ -75.092810, 41.768361 ], [ -75.095451, 41.768366 ], [ -75.100990, 41.769121 ], [ -75.103492, 41.771238 ], [ -75.104334, 41.772693 ], [ -75.104640, 41.774203 ], [ -75.103548, 41.782008 ], [ -75.102329, 41.786503 ], [ -75.101463, 41.787941 ], [ -75.092876, 41.796386 ], [ -75.088328, 41.797534 ], [ -75.081415, 41.796483 ], [ -75.078270, 41.797467 ], [ -75.076889, 41.798509 ], [ -75.074412, 41.802191 ], [ -75.072168, 41.808327 ], [ -75.071751, 41.811901 ], [ -75.072172, 41.813732 ], [ -75.074409, 41.815088 ], [ -75.078063, 41.815112 ], [ -75.079818, 41.814815 ], [ -75.085789, 41.811626 ], [ -75.089484, 41.811576 ], [ -75.093537, 41.813375 ], [ -75.100024, 41.818347 ], [ -75.113334, 41.822782 ], [ -75.114837, 41.825670 ], [ -75.115147, 41.827285 ], [ -75.114998, 41.830300 ], [ -75.113441, 41.836298 ], [ -75.113369, 41.840698 ], [ -75.114399, 41.843583 ], [ -75.115598, 41.844638 ], [ -75.118789, 41.845819 ], [ -75.127913, 41.844903 ], [ -75.130983, 41.845145 ], [ -75.140241, 41.852078 ], [ -75.143824, 41.851737 ], [ -75.146446, 41.850899 ], [ -75.152898, 41.848564 ], [ -75.156512, 41.848327 ], [ -75.161541, 41.849836 ], [ -75.164168, 41.851586 ], [ -75.166217, 41.853862 ], [ -75.168733, 41.859258 ], [ -75.168053, 41.867043 ], [ -75.169142, 41.870290 ], [ -75.170565, 41.871608 ], [ -75.174574, 41.872660 ], [ -75.176633, 41.872371 ], [ -75.179134, 41.869935 ], [ -75.180497, 41.865680 ], [ -75.182271, 41.862198 ], [ -75.183937, 41.860515 ], [ -75.185254, 41.859930 ], [ -75.186993, 41.860109 ], [ -75.188888, 41.861264 ], [ -75.190203, 41.862454 ], [ -75.191441, 41.865063 ], [ -75.194382, 41.867287 ], [ -75.197836, 41.868807 ], [ -75.204002, 41.869867 ], [ -75.209741, 41.869250 ], [ -75.214970, 41.867449 ], [ -75.220125, 41.860534 ], [ -75.223734, 41.857456 ], [ -75.225720, 41.857481 ], [ -75.231612, 41.859459 ], [ -75.234565, 41.861569 ], [ -75.238743, 41.865699 ], [ -75.241134, 41.867118 ], [ -75.243345, 41.866875 ], [ -75.248045, 41.863300 ], [ -75.251197, 41.862040 ], [ -75.257825, 41.862154 ], [ -75.260527, 41.863800 ], [ -75.262802, 41.866213 ], [ -75.263673, 41.868105 ], [ -75.263815, 41.870757 ], [ -75.261488, 41.873277 ], [ -75.258439, 41.875087 ], [ -75.257564, 41.877108 ], [ -75.260623, 41.883783 ], [ -75.263005, 41.885109 ], [ -75.267789, 41.885982 ], [ -75.271292, 41.887360 ], [ -75.272581, 41.893168 ], [ -75.272778, 41.897112 ], [ -75.267773, 41.901971 ], [ -75.267562, 41.907054 ], [ -75.269736, 41.911363 ], [ -75.275368, 41.919564 ], [ -75.276552, 41.922208 ], [ -75.276501, 41.926679 ], [ -75.277243, 41.933598 ], [ -75.279094, 41.938917 ], [ -75.289383, 41.942891 ], [ -75.290966, 41.945039 ], [ -75.291762, 41.947092 ], [ -75.291430, 41.952477 ], [ -75.293713, 41.954593 ], [ -75.298580, 41.954521 ], [ -75.300409, 41.953871 ], [ -75.301593, 41.952811 ], [ -75.301233, 41.948900 ], [ -75.301664, 41.948380 ], [ -75.303966, 41.948216 ], [ -75.310358, 41.949012 ], [ -75.312817, 41.950182 ], [ -75.318168, 41.954236 ], [ -75.320040, 41.960867 ], [ -75.322384, 41.961693 ], [ -75.329318, 41.968232 ], [ -75.335771, 41.970315 ], [ -75.339488, 41.970786 ], [ -75.342204, 41.972872 ], [ -75.342460, 41.974303 ], [ -75.337791, 41.984386 ], [ -75.337602, 41.986700 ], [ -75.341125, 41.992772 ], [ -75.346568, 41.995324 ], [ -75.353504, 41.997110 ], [ -75.359579, 41.999445 ], [ -75.431961, 41.999363 ], [ -75.436216, 41.999353 ], [ -75.477144, 41.999407 ], [ -75.483738, 41.999244 ], [ -75.610316, 41.998960 ], [ -75.742217, 41.997864 ], [ -75.870677, 41.998828 ], [ -75.980250, 41.999035 ], [ -75.983082, 41.999035 ], [ -76.105840, 41.998858 ], [ -76.123696, 41.998954 ], [ -76.131201, 41.998954 ], [ -76.343722, 41.998346 ], [ -76.349898, 41.998410 ], [ -76.462155, 41.998934 ], [ -76.466540, 41.999025 ], [ -76.558118, 42.000155 ], [ -76.749675, 42.001689 ], [ -76.815878, 42.001673 ], [ -76.835079, 42.001773 ], [ -76.920784, 42.001774 ], [ -76.921884, 42.001674 ], [ -76.937084, 42.001674 ], [ -76.942585, 42.001574 ], [ -76.965686, 42.001274 ], [ -77.007536, 42.000819 ], [ -77.007635, 42.000848 ], [ -77.063676, 42.000461 ], [ -77.124693, 41.999395 ], [ -77.505308, 42.000070 ], [ -77.749931, 41.998782 ], [ -77.822799, 41.998547 ], [ -77.832030, 41.998524 ], [ -77.997508, 41.998758 ], [ -78.030963, 41.999392 ], [ -78.031177, 41.999415 ], [ -78.124730, 42.000452 ], [ -78.271204, 41.998968 ], [ -78.308128, 41.999415 ], [ -78.596650, 41.999877 ], [ -78.749754, 41.998109 ], [ -78.874759, 41.997559 ], [ -78.983065, 41.998949 ], [ -79.061265, 41.999259 ], [ -79.178570, 41.999458 ], [ -79.249772, 41.998807 ], [ -79.472472, 41.998255 ], [ -79.538445, 41.998527 ], [ -79.551385, 41.998666 ], [ -79.625301, 41.999068 ], [ -79.625287, 41.999003 ], [ -79.670128, 41.999335 ], [ -79.761374, 41.999067 ], [ -79.761798, 42.019042 ], [ -79.761709, 42.118990 ], [ -79.762122, 42.131246 ], [ -79.761861, 42.150712 ], [ -79.761759, 42.162675 ], [ -79.761921, 42.173319 ], [ -79.761929, 42.179693 ], [ -79.761833, 42.183627 ], [ -79.762152, 42.243054 ], [ -79.761964, 42.251354 ], [ -79.761951, 42.269860 ], [ -79.717825, 42.284711 ], [ -79.645358, 42.315631 ], [ -79.593992, 42.341641 ], [ -79.546262, 42.363417 ], [ -79.510999, 42.382373 ], [ -79.474794, 42.404291 ], [ -79.453533, 42.411157 ], [ -79.429119, 42.428380 ], [ -79.405458, 42.453281 ], [ -79.381943, 42.466491 ], [ -79.362130, 42.480195 ], [ -79.351989, 42.488920 ], [ -79.342316, 42.489664 ], [ -79.335129, 42.488321 ], [ -79.331483, 42.489076 ], [ -79.323079, 42.494795 ], [ -79.317740, 42.499884 ], [ -79.283364, 42.511228 ], [ -79.264624, 42.523159 ], [ -79.242889, 42.531757 ], [ -79.223195, 42.536087 ], [ -79.193232, 42.545881 ], [ -79.148723, 42.553672 ], [ -79.138569, 42.564462 ], [ -79.129630, 42.589824 ], [ -79.126261, 42.590937 ], [ -79.121921, 42.594234 ], [ -79.113713, 42.605994 ], [ -79.111361, 42.613358 ], [ -79.078761, 42.640058 ], [ -79.073261, 42.639958 ], [ -79.063760, 42.644758 ], [ -79.062261, 42.668358 ], [ -79.048860, 42.689158 ], [ -79.018860, 42.701558 ], [ -79.006160, 42.704558 ], [ -78.991159, 42.705358 ], [ -78.944158, 42.731958 ], [ -78.918157, 42.737258 ], [ -78.868556, 42.770258 ], [ -78.853455, 42.783958 ], [ -78.851355, 42.791758 ], [ -78.856456, 42.800258 ], [ -78.859356, 42.800658 ], [ -78.871932, 42.826183 ], [ -78.869182, 42.833745 ], [ -78.860445, 42.835110 ], [ -78.859456, 42.841358 ], [ -78.865592, 42.852358 ], [ -78.872227, 42.853306 ], [ -78.882557, 42.867258 ], [ -78.891655, 42.884845 ], [ -78.912458, 42.886557 ], [ -78.905758, 42.899957 ], [ -78.905659, 42.923357 ], [ -78.909159, 42.933257 ], [ -78.918859, 42.946857 ], [ -78.932360, 42.955857 ], [ -78.961761, 42.957756 ], [ -78.975062, 42.968756 ], [ -79.011563, 42.985256 ], [ -79.019964, 42.994756 ], [ -79.020920, 43.014287 ], [ -79.011764, 43.028956 ], [ -79.005164, 43.047056 ], [ -79.005450, 43.057231 ], [ -79.010530, 43.064389 ], [ -79.074467, 43.077855 ], [ -79.074678, 43.083141 ], [ -79.069667, 43.088355 ], [ -79.064754, 43.093205 ], [ -79.060281, 43.105086 ], [ -79.061400, 43.111096 ], [ -79.061967, 43.115355 ], [ -79.062518, 43.120182 ], [ -79.060206, 43.124799 ], [ -79.056767, 43.126855 ], [ -79.049467, 43.135055 ], [ -79.044066, 43.138055 ], [ -79.042366, 43.143655 ], [ -79.042867, 43.149155 ], [ -79.044567, 43.153255 ], [ -79.046567, 43.162355 ], [ -79.048467, 43.164655 ], [ -79.053067, 43.173655 ], [ -79.052567, 43.183655 ], [ -79.050744, 43.197417 ], [ -79.053109, 43.209717 ], [ -79.052868, 43.222054 ], [ -79.055868, 43.238554 ], [ -79.061388, 43.251349 ], [ -79.070469, 43.262454 ], [ -79.019848, 43.273686 ], [ -78.971866, 43.281254 ], [ -78.930764, 43.293254 ], [ -78.859362, 43.310955 ], [ -78.836261, 43.318455 ], [ -78.834061, 43.317555 ], [ -78.777759, 43.327055 ], [ -78.747158, 43.334555 ], [ -78.696856, 43.341255 ], [ -78.634346, 43.357624 ], [ -78.547395, 43.369541 ], [ -78.488857, 43.374763 ], [ -78.482526, 43.374425 ], [ -78.473099, 43.370812 ], [ -78.370221, 43.376505 ], [ -78.358711, 43.373988 ], [ -78.250641, 43.370866 ], [ -78.233609, 43.369070 ], [ -78.145195, 43.375510 ], [ -78.104509, 43.375628 ], [ -78.023609, 43.366575 ], [ -77.994838, 43.365259 ], [ -77.976438, 43.369159 ], [ -77.965238, 43.368059 ], [ -77.952937, 43.363460 ], [ -77.922736, 43.356960 ], [ -77.904836, 43.356960 ], [ -77.875335, 43.349660 ], [ -77.816533, 43.343560 ], [ -77.797381, 43.339857 ], [ -77.785132, 43.339261 ], [ -77.760231, 43.341161 ], [ -77.756931, 43.337361 ], [ -77.730630, 43.330161 ], [ -77.714129, 43.323561 ], [ -77.701429, 43.308261 ], [ -77.660359, 43.282998 ], [ -77.653759, 43.279484 ], [ -77.628315, 43.271303 ], [ -77.577223, 43.243263 ], [ -77.551022, 43.235763 ], [ -77.534184, 43.234569 ], [ -77.500920, 43.250363 ], [ -77.476642, 43.254522 ], [ -77.436831, 43.265701 ], [ -77.414516, 43.269263 ], [ -77.391015, 43.276363 ], [ -77.341092, 43.280661 ], [ -77.314619, 43.281030 ], [ -77.303979, 43.278150 ], [ -77.264177, 43.277363 ], [ -77.214058, 43.284114 ], [ -77.173088, 43.281509 ], [ -77.143416, 43.287561 ], [ -77.130429, 43.285635 ], [ -77.111866, 43.287945 ], [ -77.067295, 43.280937 ], [ -77.033875, 43.271218 ], [ -76.999691, 43.271456 ], [ -76.988445, 43.274500 ], [ -76.958402, 43.270005 ], [ -76.952174, 43.270692 ], [ -76.922351, 43.285006 ], [ -76.904288, 43.291816 ], [ -76.886913, 43.293891 ], [ -76.877397, 43.292926 ], [ -76.854976, 43.298443 ], [ -76.841675, 43.305399 ], [ -76.794708, 43.309632 ], [ -76.769025, 43.318452 ], [ -76.747067, 43.331477 ], [ -76.731039, 43.343421 ], [ -76.698360, 43.344436 ], [ -76.684856, 43.352691 ], [ -76.669624, 43.366526 ], [ -76.642672, 43.401241 ], [ -76.630774, 43.413356 ], [ -76.607093, 43.423374 ], [ -76.562826, 43.448537 ], [ -76.531810, 43.460299 ], [ -76.521999, 43.468617 ], [ -76.515882, 43.471136 ], [ -76.506858, 43.469127 ], [ -76.486962, 43.475350 ], [ -76.472498, 43.492781 ], [ -76.437473, 43.509213 ], [ -76.417581, 43.521285 ], [ -76.410636, 43.523159 ], [ -76.368849, 43.525822 ], [ -76.345492, 43.513437 ], [ -76.330911, 43.511978 ], [ -76.297103, 43.512870 ], [ -76.259858, 43.524728 ], [ -76.235834, 43.529256 ], [ -76.228701, 43.532987 ], [ -76.217958, 43.545156 ], [ -76.209853, 43.560136 ], [ -76.203473, 43.574978 ], [ -76.199138, 43.600454 ], [ -76.196596, 43.649761 ], [ -76.205436, 43.718751 ], [ -76.213205, 43.753513 ], [ -76.229268, 43.804135 ], [ -76.246822, 43.817903 ], [ -76.269506, 43.826152 ], [ -76.275587, 43.833982 ], [ -76.299065, 43.839213 ], [ -76.295628, 43.854336 ], [ -76.286004, 43.868084 ], [ -76.261945, 43.879771 ], [ -76.228261, 43.886645 ], [ -76.212451, 43.901080 ], [ -76.209701, 43.897643 ], [ -76.227485, 43.875061 ], [ -76.219313, 43.866820 ], [ -76.202257, 43.864898 ], [ -76.192777, 43.869175 ], [ -76.180604, 43.877529 ], [ -76.158249, 43.887542 ], [ -76.145506, 43.888681 ], [ -76.133267, 43.892975 ], [ -76.127285, 43.897889 ], [ -76.125023, 43.912773 ], [ -76.130446, 43.933082 ], [ -76.136663, 43.934592 ], [ -76.139069, 43.940779 ], [ -76.134358, 43.945664 ], [ -76.123907, 43.951346 ], [ -76.112486, 43.954677 ], [ -76.101064, 43.967050 ], [ -76.082981, 43.977044 ], [ -76.073463, 43.977044 ], [ -76.064897, 43.981327 ], [ -76.064421, 43.985134 ], [ -76.066324, 43.988941 ], [ -76.073463, 43.991796 ], [ -76.081553, 43.996555 ], [ -76.119148, 43.971333 ], [ -76.136280, 43.964671 ], [ -76.146072, 43.964705 ], [ -76.159004, 43.958995 ], [ -76.169801, 43.962202 ], [ -76.169802, 43.962202 ], [ -76.184874, 43.971128 ], [ -76.200249, 43.967931 ], [ -76.208009, 43.977348 ], [ -76.207640, 43.982964 ], [ -76.202548, 43.989417 ], [ -76.187320, 44.000363 ], [ -76.148297, 44.008929 ], [ -76.128785, 44.019874 ], [ -76.120695, 44.031296 ], [ -76.121171, 44.034151 ], [ -76.124502, 44.036054 ], [ -76.135448, 44.037482 ], [ -76.140207, 44.036054 ], [ -76.149724, 44.030820 ], [ -76.159718, 44.029868 ], [ -76.168284, 44.032723 ], [ -76.151628, 44.046048 ], [ -76.146869, 44.054614 ], [ -76.150676, 44.059849 ], [ -76.154483, 44.062229 ], [ -76.162574, 44.062229 ], [ -76.169712, 44.063180 ], [ -76.176850, 44.060801 ], [ -76.183513, 44.058421 ], [ -76.202548, 44.054138 ], [ -76.208735, 44.054614 ], [ -76.212066, 44.056518 ], [ -76.213970, 44.059373 ], [ -76.213494, 44.061277 ], [ -76.205880, 44.068891 ], [ -76.205880, 44.070795 ], [ -76.207783, 44.071746 ], [ -76.214446, 44.069843 ], [ -76.220632, 44.066036 ], [ -76.251089, 44.059849 ], [ -76.259180, 44.052711 ], [ -76.276788, 44.031296 ], [ -76.281071, 44.017971 ], [ -76.278691, 44.016067 ], [ -76.274408, 44.016543 ], [ -76.230150, 44.029392 ], [ -76.214922, 44.030344 ], [ -76.202073, 44.029868 ], [ -76.200169, 44.028440 ], [ -76.199693, 44.025585 ], [ -76.218729, 44.002266 ], [ -76.218729, 43.994176 ], [ -76.236864, 43.977900 ], [ -76.254555, 43.966213 ], [ -76.280677, 43.959683 ], [ -76.284114, 43.966900 ], [ -76.268702, 43.987278 ], [ -76.266733, 43.995578 ], [ -76.269672, 44.001148 ], [ -76.281928, 44.009177 ], [ -76.287821, 44.011420 ], [ -76.296487, 44.008489 ], [ -76.300956, 44.009864 ], [ -76.307486, 44.026362 ], [ -76.296986, 44.045455 ], [ -76.300532, 44.057188 ], [ -76.304207, 44.059445 ], [ -76.360306, 44.070907 ], [ -76.360798, 44.087644 ], [ -76.366972, 44.100409 ], [ -76.363835, 44.111696 ], [ -76.358163, 44.123337 ], [ -76.355679, 44.133258 ], [ -76.352400, 44.137226 ], [ -76.312647, 44.199044 ], [ -76.286547, 44.203773 ], [ -76.249661, 44.204171 ], [ -76.245487, 44.203669 ], [ -76.206777, 44.214543 ], [ -76.191328, 44.221244 ], [ -76.164265, 44.239603 ], [ -76.161833, 44.280777 ], [ -76.130884, 44.296635 ], [ -76.126565, 44.294581 ], [ -76.118136, 44.294850 ], [ -76.111931, 44.298031 ], [ -76.097351, 44.299547 ], [ -76.045228, 44.331724 ], [ -76.008361, 44.343856 ], [ -76.000998, 44.347534 ], [ -75.982392, 44.347404 ], [ -75.978281, 44.346880 ], [ -75.974839, 44.346172 ], [ -75.973053, 44.343634 ], [ -75.970185, 44.342835 ], [ -75.949540, 44.349129 ], [ -75.939664, 44.355395 ], [ -75.929465, 44.359603 ], [ -75.922247, 44.365680 ], [ -75.912985, 44.368084 ], [ -75.871496, 44.394839 ], [ -75.820830, 44.432244 ], [ -75.807778, 44.471644 ], [ -75.766230, 44.515851 ], [ -75.727052, 44.542812 ], [ -75.696586, 44.567583 ], [ -75.662381, 44.591934 ], [ -75.618364, 44.619637 ], [ -75.580912, 44.648521 ], [ -75.505903, 44.705081 ], [ -75.477642, 44.720224 ], [ -75.423943, 44.756329 ], [ -75.413885, 44.768890 ], [ -75.397007, 44.773471 ], [ -75.387371, 44.780030 ], [ -75.372347, 44.783110 ], [ -75.366360, 44.789472 ], [ -75.346527, 44.805563 ], [ -75.333744, 44.806378 ], [ -75.306487, 44.826144 ], [ -75.307630, 44.836813 ], [ -75.283136, 44.849156 ], [ -75.268250, 44.855119 ], [ -75.255517, 44.857651 ], [ -75.241303, 44.866958 ], [ -75.228635, 44.867900 ], [ -75.218548, 44.875540 ], [ -75.203012, 44.877548 ], [ -75.196227, 44.881368 ], [ -75.188283, 44.883220 ], [ -75.165123, 44.893324 ], [ -75.142958, 44.900237 ], [ -75.133977, 44.911838 ], [ -75.119757, 44.917825 ], [ -75.105162, 44.921193 ], [ -75.096659, 44.927067 ], [ -75.066245, 44.930174 ], [ -75.059966, 44.934570 ], [ -75.027125, 44.946568 ], [ -75.005155, 44.958402 ], [ -74.999655, 44.965921 ], [ -74.999270, 44.971638 ], [ -74.992756, 44.977449 ], [ -74.972463, 44.983402 ], [ -74.946686, 44.984665 ], [ -74.907956, 44.983359 ], [ -74.900733, 44.992754 ], [ -74.887837, 45.000046 ], [ -74.877232, 45.001362 ], [ -74.868663, 45.001274 ], [ -74.861927, 45.002771 ], [ -74.854443, 45.005390 ], [ -74.846175, 45.010290 ], [ -74.834669, 45.014683 ], [ -74.826578, 45.015850 ], [ -74.819641, 45.012874 ], [ -74.813263, 45.013543 ], [ -74.805421, 45.011003 ], [ -74.799434, 45.009132 ], [ -74.793148, 45.004647 ], [ -74.768749, 45.003893 ], [ -74.760215, 44.994946 ], [ -74.744640, 44.990577 ], [ -74.731301, 44.990422 ], [ -74.722574, 44.998062 ], [ -74.702018, 45.003322 ], [ -74.683973, 44.999690 ], [ -74.678428, 45.000047 ], [ -74.673047, 45.000942 ], [ -74.667338, 45.001648 ], [ -74.661478, 44.999592 ], [ -74.549020, 44.998699 ], [ -74.457530, 44.997032 ], [ -74.335184, 44.991905 ], [ -74.234136, 44.992148 ], [ -74.146814, 44.991500 ], [ -73.874597, 45.001223 ], [ -73.762985, 45.003238 ], [ -73.675458, 45.002907 ], [ -73.639718, 45.003464 ], [ -73.437371, 45.009198 ], [ -73.343124, 45.010840 ], [ -73.350188, 44.994304 ], [ -73.353429, 44.990165 ], [ -73.354633, 44.987352 ], [ -73.354112, 44.984062 ], [ -73.352886, 44.980644 ], [ -73.350218, 44.976222 ], [ -73.344740, 44.970468 ], [ -73.338734, 44.965886 ], [ -73.338243, 44.964750 ], [ -73.337906, 44.960541 ], [ -73.339603, 44.943370 ], [ -73.338482, 44.924112 ], [ -73.338979, 44.917681 ], [ -73.341106, 44.914632 ], [ -73.347837, 44.911309 ], [ -73.353657, 44.907346 ], [ -73.356218, 44.904492 ], [ -73.358080, 44.901325 ], [ -73.360327, 44.897236 ], [ -73.362229, 44.891463 ], [ -73.366459, 44.875040 ], [ -73.369103, 44.866680 ], [ -73.371967, 44.862414 ], [ -73.375709, 44.860745 ], [ -73.379822, 44.857037 ], [ -73.381397, 44.848805 ], [ -73.381359, 44.845021 ], [ -73.379452, 44.838010 ], [ -73.378717, 44.837358 ], [ -73.375345, 44.836307 ], [ -73.371329, 44.830742 ], [ -73.369647, 44.829136 ], [ -73.365678, 44.826451 ], [ -73.358080, 44.823310 ], [ -73.354945, 44.821500 ], [ -73.353472, 44.820386 ], [ -73.350200, 44.816394 ], [ -73.335443, 44.804602 ], [ -73.334430, 44.802188 ], [ -73.333933, 44.799200 ], [ -73.333154, 44.788759 ], [ -73.333771, 44.785192 ], [ -73.335713, 44.782086 ], [ -73.344254, 44.776282 ], [ -73.347072, 44.772988 ], [ -73.348694, 44.768246 ], [ -73.354361, 44.755296 ], [ -73.357671, 44.751018 ], [ -73.363791, 44.745254 ], [ -73.365561, 44.741786 ], [ -73.365068, 44.725646 ], [ -73.365560, 44.700297 ], [ -73.361323, 44.695369 ], [ -73.361308, 44.694523 ], [ -73.365297, 44.687546 ], [ -73.370142, 44.684853 ], [ -73.369685, 44.683758 ], [ -73.367414, 44.681292 ], [ -73.367209, 44.678513 ], [ -73.371089, 44.677530 ], [ -73.371843, 44.676956 ], [ -73.372720, 44.668739 ], [ -73.370065, 44.666071 ], [ -73.369669, 44.663478 ], [ -73.370590, 44.662518 ], [ -73.373063, 44.662713 ], [ -73.374134, 44.662340 ], [ -73.379074, 44.656772 ], [ -73.378968, 44.655180 ], [ -73.378014, 44.653846 ], [ -73.377973, 44.652918 ], [ -73.383157, 44.645764 ], [ -73.378561, 44.641475 ], [ -73.379748, 44.640360 ], [ -73.386783, 44.636369 ], [ -73.387169, 44.635542 ], [ -73.385899, 44.631044 ], [ -73.386497, 44.626924 ], [ -73.387346, 44.623672 ], [ -73.389966, 44.619620 ], [ -73.390231, 44.618353 ], [ -73.389820, 44.617210 ], [ -73.382932, 44.612184 ], [ -73.380726, 44.605239 ], [ -73.376849, 44.599598 ], [ -73.376332, 44.597218 ], [ -73.376806, 44.595455 ], [ -73.377897, 44.593848 ], [ -73.381640, 44.590583 ], [ -73.381848, 44.589316 ], [ -73.377794, 44.585128 ], [ -73.375666, 44.582038 ], [ -73.374389, 44.575455 ], [ -73.367275, 44.567545 ], [ -73.360088, 44.562546 ], [ -73.356788, 44.557918 ], [ -73.355186, 44.556918 ], [ -73.350027, 44.555392 ], [ -73.342932, 44.551907 ], [ -73.338751, 44.548046 ], [ -73.338630, 44.546844 ], [ -73.339300, 44.544477 ], [ -73.338995, 44.543302 ], [ -73.331595, 44.535924 ], [ -73.330893, 44.534269 ], [ -73.330588, 44.531034 ], [ -73.329458, 44.529203 ], [ -73.328512, 44.528478 ], [ -73.323935, 44.527120 ], [ -73.322026, 44.525289 ], [ -73.321111, 44.519857 ], [ -73.321416, 44.516454 ], [ -73.320836, 44.513631 ], [ -73.319265, 44.511960 ], [ -73.312871, 44.507246 ], [ -73.306707, 44.500334 ], [ -73.304921, 44.492209 ], [ -73.304418, 44.485739 ], [ -73.299885, 44.476652 ], [ -73.298939, 44.471304 ], [ -73.298725, 44.463957 ], [ -73.300114, 44.454711 ], [ -73.295216, 44.445884 ], [ -73.293613, 44.440559 ], [ -73.293855, 44.437556 ], [ -73.296031, 44.428339 ], [ -73.310491, 44.402601 ], [ -73.312418, 44.394710 ], [ -73.315016, 44.388513 ], [ -73.317029, 44.385978 ], [ -73.320954, 44.382669 ], [ -73.330369, 44.375987 ], [ -73.333575, 44.372288 ], [ -73.334939, 44.364441 ], [ -73.334637, 44.356877 ], [ -73.327335, 44.344369 ], [ -73.325127, 44.338534 ], [ -73.323997, 44.333842 ], [ -73.323835, 44.325418 ], [ -73.324545, 44.319247 ], [ -73.324229, 44.310023 ], [ -73.322267, 44.301523 ], [ -73.316838, 44.287683 ], [ -73.312299, 44.280025 ], [ -73.311025, 44.274240 ], [ -73.312852, 44.265346 ], [ -73.316618, 44.257769 ], [ -73.319802, 44.249547 ], [ -73.323596, 44.243897 ], [ -73.324681, 44.243614 ], [ -73.329322, 44.244504 ], [ -73.330500, 44.244254 ], [ -73.334042, 44.240971 ], [ -73.336778, 44.239557 ], [ -73.343230, 44.238049 ], [ -73.342312, 44.234531 ], [ -73.349889, 44.230356 ], [ -73.350806, 44.225943 ], [ -73.354747, 44.223599 ], [ -73.355252, 44.222870 ], [ -73.355276, 44.219554 ], [ -73.357908, 44.216193 ], [ -73.361476, 44.210374 ], [ -73.362013, 44.208545 ], [ -73.370678, 44.204546 ], [ -73.372405, 44.202165 ], [ -73.375289, 44.199868 ], [ -73.377693, 44.199453 ], [ -73.382252, 44.197178 ], [ -73.383987, 44.193158 ], [ -73.385326, 44.192597 ], [ -73.388502, 44.192318 ], [ -73.390583, 44.190886 ], [ -73.390805, 44.189072 ], [ -73.389658, 44.181249 ], [ -73.390383, 44.179486 ], [ -73.395862, 44.175785 ], [ -73.396892, 44.173846 ], [ -73.397385, 44.171596 ], [ -73.396664, 44.168831 ], [ -73.395399, 44.166903 ], [ -73.395532, 44.166122 ], [ -73.398728, 44.162248 ], [ -73.399634, 44.155326 ], [ -73.402381, 44.145856 ], [ -73.403268, 44.144295 ], [ -73.408118, 44.139373 ], [ -73.411720, 44.137825 ], [ -73.415761, 44.132826 ], [ -73.415780, 44.131523 ], [ -73.413751, 44.126068 ], [ -73.411722, 44.117540 ], [ -73.411316, 44.112686 ], [ -73.416319, 44.099422 ], [ -73.429239, 44.079414 ], [ -73.430207, 44.071716 ], [ -73.431991, 44.063450 ], [ -73.437740, 44.045006 ], [ -73.436880, 44.042578 ], [ -73.430772, 44.038746 ], [ -73.427987, 44.037708 ], [ -73.423120, 44.032759 ], [ -73.420160, 44.032004 ], [ -73.414364, 44.029526 ], [ -73.410776, 44.026944 ], [ -73.407739, 44.021312 ], [ -73.405999, 44.016229 ], [ -73.405977, 44.011485 ], [ -73.411224, 43.986202 ], [ -73.412581, 43.982720 ], [ -73.412613, 43.979980 ], [ -73.411248, 43.975596 ], [ -73.406823, 43.967317 ], [ -73.405525, 43.948813 ], [ -73.408589, 43.932933 ], [ -73.407742, 43.929887 ], [ -73.400926, 43.917048 ], [ -73.397256, 43.905668 ], [ -73.395878, 43.903044 ], [ -73.383491, 43.890951 ], [ -73.376312, 43.880292 ], [ -73.374051, 43.875563 ], [ -73.374150, 43.874163 ], [ -73.379334, 43.864648 ], [ -73.381501, 43.859235 ], [ -73.382046, 43.855008 ], [ -73.380987, 43.852633 ], [ -73.373742, 43.847693 ], [ -73.372462, 43.846266 ], [ -73.372247, 43.845337 ], [ -73.373688, 43.842610 ], [ -73.376598, 43.839357 ], [ -73.381865, 43.837315 ], [ -73.388389, 43.832404 ], [ -73.390194, 43.829364 ], [ -73.392751, 43.822196 ], [ -73.392492, 43.820779 ], [ -73.390302, 43.817371 ], [ -73.383259, 43.813310 ], [ -73.380804, 43.810951 ], [ -73.379279, 43.808391 ], [ -73.378270, 43.805995 ], [ -73.377232, 43.800565 ], [ -73.376361, 43.798766 ], [ -73.368184, 43.793346 ], [ -73.362498, 43.790211 ], [ -73.357547, 43.785933 ], [ -73.355545, 43.778468 ], [ -73.354758, 43.776721 ], [ -73.350593, 43.771939 ], [ -73.350707, 43.770463 ], [ -73.354597, 43.764167 ], [ -73.369725, 43.744274 ], [ -73.370287, 43.742269 ], [ -73.370724, 43.735571 ], [ -73.369916, 43.728789 ], [ -73.370612, 43.725329 ], [ -73.377756, 43.717712 ], [ -73.382965, 43.714058 ], [ -73.385883, 43.711336 ], [ -73.391790, 43.703481 ], [ -73.393723, 43.699200 ], [ -73.395517, 43.696831 ], [ -73.398332, 43.694625 ], [ -73.402078, 43.693106 ], [ -73.404739, 43.690213 ], [ -73.405243, 43.688367 ], [ -73.403474, 43.684694 ], [ -73.404126, 43.681339 ], [ -73.407776, 43.672519 ], [ -73.408061, 43.669438 ], [ -73.414546, 43.658209 ], [ -73.415513, 43.652450 ], [ -73.418763, 43.647880 ], [ -73.423539, 43.645676 ], [ -73.425217, 43.644290 ], [ -73.426463, 43.642598 ], [ -73.428583, 43.636543 ], [ -73.427910, 43.634428 ], [ -73.418319, 43.623325 ], [ -73.417668, 43.621687 ], [ -73.417827, 43.620586 ], [ -73.423708, 43.612356 ], [ -73.423815, 43.610989 ], [ -73.422154, 43.606511 ], [ -73.421616, 43.603023 ], [ -73.424977, 43.598775 ], [ -73.430325, 43.590532 ], [ -73.431229, 43.588285 ], [ -73.430947, 43.587036 ], [ -73.428636, 43.583994 ], [ -73.426663, 43.582974 ], [ -73.420378, 43.581489 ], [ -73.416964, 43.577730 ], [ -73.405629, 43.571179 ], [ -73.400295, 43.568889 ], [ -73.398125, 43.568065 ], [ -73.395767, 43.568087 ], [ -73.391960, 43.569915 ], [ -73.384188, 43.575512 ], [ -73.383369, 43.576770 ], [ -73.382549, 43.579193 ], [ -73.383426, 43.584727 ], [ -73.383446, 43.596778 ], [ -73.377748, 43.599656 ], [ -73.373443, 43.603292 ], [ -73.372469, 43.604848 ], [ -73.372375, 43.606014 ], [ -73.376036, 43.612596 ], [ -73.374557, 43.614677 ], [ -73.369933, 43.619093 ], [ -73.369870, 43.619711 ], [ -73.372486, 43.622751 ], [ -73.371889, 43.624489 ], [ -73.368899, 43.624710 ], [ -73.367167, 43.623622 ], [ -73.365562, 43.623440 ], [ -73.359110, 43.624598 ], [ -73.358593, 43.625065 ], [ -73.347621, 43.622509 ], [ -73.342181, 43.626070 ], [ -73.327702, 43.625913 ], [ -73.323893, 43.627629 ], [ -73.317566, 43.627355 ], [ -73.312809, 43.624602 ], [ -73.310606, 43.624114 ], [ -73.307682, 43.627492 ], [ -73.306234, 43.628018 ], [ -73.304125, 43.627057 ], [ -73.302552, 43.625708 ], [ -73.302076, 43.624364 ], [ -73.300285, 43.610806 ], [ -73.298020, 43.610028 ], [ -73.293741, 43.605203 ], [ -73.292232, 43.602550 ], [ -73.292202, 43.598160 ], [ -73.292801, 43.593861 ], [ -73.293242, 43.592558 ], [ -73.296924, 43.587323 ], [ -73.292364, 43.585104 ], [ -73.292113, 43.584509 ], [ -73.294440, 43.582494 ], [ -73.295344, 43.580235 ], [ -73.294621, 43.578970 ], [ -73.293536, 43.578518 ], [ -73.284912, 43.579272 ], [ -73.281296, 43.577579 ], [ -73.280952, 43.575407 ], [ -73.279726, 43.574241 ], [ -73.269380, 43.571973 ], [ -73.264099, 43.568884 ], [ -73.258631, 43.564949 ], [ -73.252602, 43.556851 ], [ -73.248641, 43.553857 ], [ -73.248420, 43.552577 ], [ -73.250408, 43.550425 ], [ -73.250132, 43.543429 ], [ -73.247812, 43.542814 ], [ -73.246585, 43.541855 ], [ -73.242042, 43.534925 ], [ -73.241589, 43.534973 ], [ -73.241390, 43.532345 ], [ -73.241891, 43.529418 ], [ -73.243366, 43.527726 ], [ -73.246821, 43.525780 ], [ -73.247698, 43.523173 ], [ -73.247631, 43.519240 ], [ -73.246720, 43.518875 ], [ -73.247061, 43.514919 ], [ -73.248401, 43.470443 ], [ -73.252582, 43.370997 ], [ -73.252674, 43.370285 ], [ -73.252832, 43.363493 ], [ -73.253084, 43.354714 ], [ -73.256493, 43.259249 ], [ -73.258718, 43.229894 ], [ -73.265574, 43.096223 ], [ -73.269780, 43.035923 ], [ -73.274294, 42.943652 ], [ -73.274393, 42.942482 ], [ -73.274466, 42.940361 ], [ -73.275804, 42.897249 ], [ -73.278673, 42.833410 ], [ -73.284311, 42.834954 ], [ -73.285388, 42.834093 ], [ -73.287063, 42.820140 ], [ -73.283750, 42.813864 ], [ -73.286337, 42.808038 ], [ -73.290944, 42.801920 ], [ -73.276421, 42.746019 ], [ -73.264957, 42.745940 ], [ -73.352527, 42.510002 ], [ -73.508142, 42.086257 ], [ -73.496879, 42.049675 ], [ -73.487314, 42.049638 ], [ -73.489615, 42.000092 ], [ -73.492975, 41.958524 ], [ -73.496527, 41.922380 ], [ -73.498304, 41.892508 ], [ -73.501984, 41.858717 ], [ -73.504944, 41.824285 ], [ -73.505008, 41.823773 ], [ -73.510961, 41.758749 ], [ -73.511921, 41.740941 ], [ -73.516785, 41.687581 ], [ -73.520017, 41.641197 ], [ -73.521041, 41.619773 ], [ -73.530067, 41.527194 ], [ -73.533969, 41.479693 ], [ -73.534055, 41.478968 ], [ -73.534150, 41.478060 ], [ -73.534269, 41.476911 ], [ -73.534269, 41.476394 ], [ -73.534369, 41.475894 ], [ -73.535769, 41.457159 ], [ -73.535857, 41.455709 ], [ -73.535885, 41.455236 ], [ -73.535986, 41.453060 ], [ -73.536067, 41.451331 ], [ -73.536969, 41.441094 ], [ -73.537469, 41.435890 ], [ -73.537673, 41.433905 ], [ -73.541169, 41.405994 ], [ -73.543425, 41.376622 ], [ -73.544728, 41.366375 ], [ -73.548973, 41.326297 ], [ -73.549574, 41.315931 ], [ -73.548929, 41.307598 ], [ -73.550961, 41.295422 ], [ -73.518384, 41.256719 ], [ -73.482709, 41.212760 ], [ -73.509487, 41.200814 ], [ -73.514617, 41.198434 ], [ -73.564941, 41.175170 ], [ -73.632153, 41.144921 ], [ -73.639672, 41.141495 ], [ -73.727775, 41.100696 ], [ -73.722575, 41.093596 ], [ -73.716875, 41.087596 ], [ -73.694273, 41.059296 ], [ -73.687173, 41.050697 ], [ -73.679973, 41.041797 ], [ -73.670472, 41.030097 ], [ -73.662672, 41.020497 ], [ -73.655371, 41.012797 ], [ -73.654671, 41.011697 ], [ -73.655571, 41.007697 ], [ -73.659372, 40.999497 ], [ -73.658772, 40.993497 ], [ -73.659671, 40.987909 ], [ -73.657336, 40.985171 ] ] ], [ [ [ -73.767176, 40.886299 ], [ -73.767076, 40.885399 ], [ -73.767076, 40.884799 ], [ -73.767076, 40.883499 ], [ -73.766276, 40.881099 ], [ -73.766976, 40.880099 ], [ -73.770876, 40.879299 ], [ -73.775276, 40.882199 ], [ -73.775176, 40.884199 ], [ -73.772776, 40.884599 ], [ -73.772276, 40.887499 ], [ -73.770576, 40.888399 ], [ -73.768276, 40.887599 ], [ -73.767276, 40.886899 ], [ -73.767176, 40.886299 ] ] ], [ [ [ -73.773361, 40.859449 ], [ -73.770552, 40.860330 ], [ -73.766333, 40.857317 ], [ -73.765128, 40.854228 ], [ -73.766032, 40.844961 ], [ -73.769648, 40.844660 ], [ -73.773038, 40.848125 ], [ -73.773717, 40.854831 ], [ -73.773361, 40.859449 ] ] ], [ [ [ -74.040860, 40.700117 ], [ -74.040018, 40.700678 ], [ -74.039401, 40.700454 ], [ -74.037998, 40.698995 ], [ -74.043441, 40.689680 ], [ -74.044451, 40.688445 ], [ -74.046359, 40.689175 ], [ -74.047313, 40.690466 ], [ -74.046920, 40.691139 ], [ -74.040860, 40.700117 ] ] ], [ [ [ -74.144428, 40.535160 ], [ -74.148697, 40.534489 ], [ -74.160859, 40.526790 ], [ -74.177986, 40.519603 ], [ -74.182157, 40.520634 ], [ -74.199923, 40.511729 ], [ -74.210474, 40.509448 ], [ -74.219787, 40.502603 ], [ -74.233240, 40.501299 ], [ -74.246688, 40.496103 ], [ -74.250188, 40.496703 ], [ -74.254588, 40.502303 ], [ -74.256088, 40.507903 ], [ -74.252702, 40.513895 ], [ -74.242888, 40.520903 ], [ -74.241732, 40.531273 ], [ -74.247808, 40.543396 ], [ -74.229002, 40.555041 ], [ -74.216997, 40.554991 ], [ -74.210887, 40.560902 ], [ -74.204054, 40.589336 ], [ -74.196820, 40.597037 ], [ -74.195407, 40.601806 ], [ -74.196096, 40.616169 ], [ -74.200994, 40.616906 ], [ -74.201812, 40.619507 ], [ -74.200580, 40.631448 ], [ -74.189400, 40.642121 ], [ -74.180191, 40.645521 ], [ -74.174085, 40.645109 ], [ -74.170187, 40.642201 ], [ -74.152973, 40.638886 ], [ -74.120186, 40.642201 ], [ -74.086485, 40.648601 ], [ -74.075884, 40.648101 ], [ -74.069700, 40.641216 ], [ -74.067598, 40.623865 ], [ -74.060345, 40.611999 ], [ -74.053125, 40.603678 ], [ -74.059184, 40.593502 ], [ -74.068184, 40.584102 ], [ -74.090797, 40.566463 ], [ -74.111471, 40.546908 ], [ -74.112585, 40.547603 ], [ -74.121672, 40.542691 ], [ -74.137241, 40.530076 ], [ -74.140230, 40.533738 ], [ -74.144428, 40.535160 ] ] ], [ [ [ -76.361748, 44.032993 ], [ -76.376617, 44.032993 ], [ -76.381378, 44.034779 ], [ -76.381973, 44.037159 ], [ -76.379593, 44.045486 ], [ -76.370079, 44.052029 ], [ -76.357582, 44.053814 ], [ -76.342117, 44.053814 ], [ -76.342117, 44.048458 ], [ -76.346878, 44.038940 ], [ -76.361748, 44.032993 ] ] ], [ [ [ -76.321297, 44.031208 ], [ -76.329033, 44.034184 ], [ -76.333786, 44.032993 ], [ -76.336761, 44.034184 ], [ -76.333191, 44.039536 ], [ -76.329628, 44.044296 ], [ -76.317726, 44.051434 ], [ -76.316536, 44.048458 ], [ -76.321297, 44.045486 ], [ -76.323677, 44.040726 ], [ -76.321297, 44.037159 ], [ -76.321297, 44.031208 ] ] ], [ [ [ -76.444626, 43.887505 ], [ -76.445999, 43.890255 ], [ -76.406471, 43.921188 ], [ -76.377945, 43.921188 ], [ -76.388603, 43.908127 ], [ -76.422630, 43.892315 ], [ -76.444626, 43.887505 ] ] ], [ [ [ -76.334297, 43.878567 ], [ -76.355949, 43.878567 ], [ -76.345978, 43.894035 ], [ -76.315735, 43.913280 ], [ -76.301300, 43.917751 ], [ -76.307487, 43.905376 ], [ -76.326393, 43.880974 ], [ -76.334297, 43.878567 ] ] ], [ [ [ -72.198601, 41.164951 ], [ -72.211479, 41.172970 ], [ -72.213036, 41.178013 ], [ -72.188980, 41.189011 ], [ -72.177689, 41.187244 ], [ -72.170074, 41.188671 ], [ -72.162170, 41.192448 ], [ -72.161034, 41.188671 ], [ -72.179596, 41.182961 ], [ -72.186729, 41.179630 ], [ -72.198601, 41.164951 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US37", "STATE": "37", "NAME": "North Carolina", "LSAD": "", "CENSUSAREA": 48617.905000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -82.602877, 36.039833 ], [ -82.600741, 36.037422 ], [ -82.598785, 36.034162 ], [ -82.596177, 36.031880 ], [ -82.594873, 36.029598 ], [ -82.595525, 36.026012 ], [ -82.600089, 36.021774 ], [ -82.604327, 36.018187 ], [ -82.611862, 36.006206 ], [ -82.613862, 36.004706 ], [ -82.614362, 36.003506 ], [ -82.615062, 36.000306 ], [ -82.613028, 35.994000 ], [ -82.612604, 35.993488 ], [ -82.606944, 35.992170 ], [ -82.604239, 35.987319 ], [ -82.606740, 35.984446 ], [ -82.610885, 35.974442 ], [ -82.611602, 35.971418 ], [ -82.610889, 35.967409 ], [ -82.607761, 35.966023 ], [ -82.600370, 35.964626 ], [ -82.594860, 35.965347 ], [ -82.591977, 35.966385 ], [ -82.581003, 35.965557 ], [ -82.577719, 35.964196 ], [ -82.576678, 35.959255 ], [ -82.575170, 35.958384 ], [ -82.567503, 35.955552 ], [ -82.557874, 35.953901 ], [ -82.553192, 35.960627 ], [ -82.549682, 35.964275 ], [ -82.542463, 35.967994 ], [ -82.539273, 35.969115 ], [ -82.534763, 35.969887 ], [ -82.531292, 35.972188 ], [ -82.522702, 35.973436 ], [ -82.520660, 35.974633 ], [ -82.516444, 35.975958 ], [ -82.512598, 35.975664 ], [ -82.507068, 35.977475 ], [ -82.505384, 35.977680 ], [ -82.500206, 35.982561 ], [ -82.487451, 35.991557 ], [ -82.487411, 35.991634 ], [ -82.484678, 35.992849 ], [ -82.483666, 35.993866 ], [ -82.483498, 35.996284 ], [ -82.482292, 35.997823 ], [ -82.474190, 36.000108 ], [ -82.464558, 36.006508 ], [ -82.460658, 36.007809 ], [ -82.409458, 36.083409 ], [ -82.404458, 36.087609 ], [ -82.389958, 36.096909 ], [ -82.380458, 36.099309 ], [ -82.378758, 36.102809 ], [ -82.375558, 36.105609 ], [ -82.371383, 36.106388 ], [ -82.366566, 36.107650 ], [ -82.360919, 36.110614 ], [ -82.360357, 36.111609 ], [ -82.355157, 36.115609 ], [ -82.349957, 36.117109 ], [ -82.348422, 36.115929 ], [ -82.346857, 36.115209 ], [ -82.336756, 36.114909 ], [ -82.332289, 36.116935 ], [ -82.329177, 36.117427 ], [ -82.325169, 36.119363 ], [ -82.321448, 36.119551 ], [ -82.318156, 36.120910 ], [ -82.308655, 36.126510 ], [ -82.307255, 36.128510 ], [ -82.302855, 36.131310 ], [ -82.297655, 36.133510 ], [ -82.289455, 36.135710 ], [ -82.288455, 36.135410 ], [ -82.280354, 36.128810 ], [ -82.278654, 36.128510 ], [ -82.274054, 36.129410 ], [ -82.270954, 36.127610 ], [ -82.268750, 36.127040 ], [ -82.265690, 36.127614 ], [ -82.263354, 36.130110 ], [ -82.260353, 36.133710 ], [ -82.256319, 36.133925 ], [ -82.253253, 36.133710 ], [ -82.251853, 36.132210 ], [ -82.247521, 36.130865 ], [ -82.244461, 36.132777 ], [ -82.243353, 36.134311 ], [ -82.241553, 36.137111 ], [ -82.237737, 36.139189 ], [ -82.236415, 36.139926 ], [ -82.235479, 36.140748 ], [ -82.234807, 36.141720 ], [ -82.228288, 36.146622 ], [ -82.224852, 36.150011 ], [ -82.223232, 36.154772 ], [ -82.222052, 36.156911 ], [ -82.218451, 36.157832 ], [ -82.213852, 36.159112 ], [ -82.211251, 36.159012 ], [ -82.204872, 36.157067 ], [ -82.201812, 36.154963 ], [ -82.199251, 36.152713 ], [ -82.195350, 36.150013 ], [ -82.191950, 36.148813 ], [ -82.187850, 36.147886 ], [ -82.184750, 36.145414 ], [ -82.183650, 36.144414 ], [ -82.182549, 36.143714 ], [ -82.178861, 36.143296 ], [ -82.175610, 36.143870 ], [ -82.173849, 36.145314 ], [ -82.172149, 36.146414 ], [ -82.169249, 36.146614 ], [ -82.160883, 36.146548 ], [ -82.155948, 36.148115 ], [ -82.147948, 36.149516 ], [ -82.144147, 36.144216 ], [ -82.140847, 36.136216 ], [ -82.136547, 36.128817 ], [ -82.136546, 36.123717 ], [ -82.137974, 36.119576 ], [ -82.130646, 36.106417 ], [ -82.127146, 36.104417 ], [ -82.115245, 36.104618 ], [ -82.109145, 36.107218 ], [ -82.105444, 36.108119 ], [ -82.101644, 36.106219 ], [ -82.098544, 36.105719 ], [ -82.085943, 36.106020 ], [ -82.080143, 36.105720 ], [ -82.079743, 36.106520 ], [ -82.067142, 36.112020 ], [ -82.061342, 36.113121 ], [ -82.056042, 36.120721 ], [ -82.056042, 36.123921 ], [ -82.054142, 36.126821 ], [ -82.043941, 36.125421 ], [ -82.037941, 36.121122 ], [ -82.033141, 36.120422 ], [ -82.028740, 36.124322 ], [ -82.026340, 36.129222 ], [ -82.026640, 36.130222 ], [ -81.960101, 36.228131 ], [ -81.938897, 36.256067 ], [ -81.932994, 36.264881 ], [ -81.908137, 36.302013 ], [ -81.897701, 36.307446 ], [ -81.894569, 36.307183 ], [ -81.887243, 36.309193 ], [ -81.879382, 36.313767 ], [ -81.876182, 36.316075 ], [ -81.874336, 36.319190 ], [ -81.863148, 36.330209 ], [ -81.857333, 36.334787 ], [ -81.850889, 36.337500 ], [ -81.845638, 36.340360 ], [ -81.841268, 36.343321 ], [ -81.833202, 36.347339 ], [ -81.822493, 36.348819 ], [ -81.812904, 36.351066 ], [ -81.808255, 36.354121 ], [ -81.800812, 36.358073 ], [ -81.795269, 36.357849 ], [ -81.791877, 36.354797 ], [ -81.790181, 36.351744 ], [ -81.787468, 36.348692 ], [ -81.784077, 36.347674 ], [ -81.781318, 36.347656 ], [ -81.777972, 36.346318 ], [ -81.768977, 36.341042 ], [ -81.766102, 36.338517 ], [ -81.762371, 36.338856 ], [ -81.760675, 36.338178 ], [ -81.757962, 36.337500 ], [ -81.754420, 36.337044 ], [ -81.747842, 36.337356 ], [ -81.744461, 36.337778 ], [ -81.739498, 36.339757 ], [ -81.734900, 36.340891 ], [ -81.730976, 36.341187 ], [ -81.725938, 36.340364 ], [ -81.721015, 36.338645 ], [ -81.717186, 36.336169 ], [ -81.713194, 36.334108 ], [ -81.707438, 36.335171 ], [ -81.705966, 36.338496 ], [ -81.705299, 36.341852 ], [ -81.707785, 36.346007 ], [ -81.713873, 36.349370 ], [ -81.718282, 36.350388 ], [ -81.721334, 36.353101 ], [ -81.722691, 36.354797 ], [ -81.723708, 36.358527 ], [ -81.724047, 36.360901 ], [ -81.724047, 36.364293 ], [ -81.726082, 36.368893 ], [ -81.731178, 36.374062 ], [ -81.732865, 36.376502 ], [ -81.732187, 36.379894 ], [ -81.730737, 36.382943 ], [ -81.729813, 36.388033 ], [ -81.730491, 36.390407 ], [ -81.731509, 36.392103 ], [ -81.733877, 36.394570 ], [ -81.737952, 36.397190 ], [ -81.739648, 36.401599 ], [ -81.739648, 36.406686 ], [ -81.738292, 36.410756 ], [ -81.734312, 36.413342 ], [ -81.729924, 36.415422 ], [ -81.720734, 36.422537 ], [ -81.717939, 36.428762 ], [ -81.716925, 36.433140 ], [ -81.715229, 36.436532 ], [ -81.715229, 36.438567 ], [ -81.715569, 36.441280 ], [ -81.715229, 36.444332 ], [ -81.714212, 36.447045 ], [ -81.714277, 36.450978 ], [ -81.715082, 36.453365 ], [ -81.714890, 36.457220 ], [ -81.708247, 36.462217 ], [ -81.701076, 36.464212 ], [ -81.699223, 36.463959 ], [ -81.697975, 36.464741 ], [ -81.695311, 36.467912 ], [ -81.694533, 36.473283 ], [ -81.694829, 36.474463 ], [ -81.696281, 36.475499 ], [ -81.697287, 36.484738 ], [ -81.695907, 36.491580 ], [ -81.696835, 36.493393 ], [ -81.697261, 36.496141 ], [ -81.698265, 36.497221 ], [ -81.699928, 36.498018 ], [ -81.700238, 36.500475 ], [ -81.699923, 36.500865 ], [ -81.697970, 36.504063 ], [ -81.697290, 36.504887 ], [ -81.697829, 36.507544 ], [ -81.697744, 36.508448 ], [ -81.699446, 36.511504 ], [ -81.699601, 36.512883 ], [ -81.700093, 36.514158 ], [ -81.700553, 36.515190 ], [ -81.702543, 36.520317 ], [ -81.707573, 36.526101 ], [ -81.708262, 36.532113 ], [ -81.707963, 36.536209 ], [ -81.699962, 36.536829 ], [ -81.699962, 36.539714 ], [ -81.697539, 36.544359 ], [ -81.693844, 36.549083 ], [ -81.690030, 36.552154 ], [ -81.689115, 36.555912 ], [ -81.690132, 36.559643 ], [ -81.692167, 36.562695 ], [ -81.692506, 36.565748 ], [ -81.690236, 36.568718 ], [ -81.686436, 36.567918 ], [ -81.679936, 36.568618 ], [ -81.677036, 36.570718 ], [ -81.677236, 36.574406 ], [ -81.679036, 36.578918 ], [ -81.680137, 36.585518 ], [ -81.677535, 36.588117 ], [ -81.600934, 36.587019 ], [ -81.521032, 36.580520 ], [ -81.499831, 36.579820 ], [ -81.489387, 36.579026 ], [ -81.476430, 36.580421 ], [ -81.442228, 36.576822 ], [ -81.374824, 36.574673 ], [ -81.353322, 36.574723 ], [ -81.307511, 36.575024 ], [ -81.262303, 36.573924 ], [ -81.249816, 36.573225 ], [ -81.176712, 36.571926 ], [ -81.171212, 36.571026 ], [ -81.141810, 36.569527 ], [ -81.124809, 36.569227 ], [ -81.083206, 36.567328 ], [ -81.061866, 36.567020 ], [ -81.058844, 36.566976 ], [ -81.011402, 36.564429 ], [ -81.003802, 36.563629 ], [ -80.945988, 36.563196 ], [ -80.944338, 36.563058 ], [ -80.901726, 36.561751 ], [ -80.837641, 36.559118 ], [ -80.837089, 36.559154 ], [ -80.803920, 36.560813 ], [ -80.773663, 36.560307 ], [ -80.730351, 36.562349 ], [ -80.704831, 36.562319 ], [ -80.653349, 36.559221 ], [ -80.624788, 36.558408 ], [ -80.440100, 36.550630 ], [ -80.432628, 36.550302 ], [ -80.431605, 36.550219 ], [ -80.295243, 36.543973 ], [ -80.228263, 36.543867 ], [ -80.225408, 36.543748 ], [ -80.171636, 36.543219 ], [ -80.169535, 36.543190 ], [ -80.122183, 36.542646 ], [ -80.027269, 36.542495 ], [ -79.967511, 36.542502 ], [ -79.966979, 36.542475 ], [ -79.904662, 36.542438 ], [ -79.887262, 36.542838 ], [ -79.667309, 36.541772 ], [ -79.666827, 36.541772 ], [ -79.510647, 36.540738 ], [ -79.445961, 36.541195 ], [ -79.445687, 36.541218 ], [ -79.249740, 36.541139 ], [ -79.209480, 36.541594 ], [ -79.208686, 36.541571 ], [ -79.137936, 36.541739 ], [ -79.126078, 36.541533 ], [ -79.124736, 36.541568 ], [ -78.971814, 36.542123 ], [ -78.970577, 36.542154 ], [ -78.942254, 36.542079 ], [ -78.942009, 36.542113 ], [ -78.915420, 36.541974 ], [ -78.914543, 36.541972 ], [ -78.796300, 36.541713 ], [ -78.765430, 36.541727 ], [ -78.758392, 36.541852 ], [ -78.670051, 36.542035 ], [ -78.663317, 36.542011 ], [ -78.605304, 36.541092 ], [ -78.533013, 36.541004 ], [ -78.529722, 36.540981 ], [ -78.509965, 36.541065 ], [ -78.471022, 36.542307 ], [ -78.470792, 36.542316 ], [ -78.456970, 36.542474 ], [ -78.441199, 36.542687 ], [ -78.436333, 36.542666 ], [ -78.323912, 36.543809 ], [ -78.246681, 36.544341 ], [ -78.245462, 36.544411 ], [ -78.133323, 36.543847 ], [ -78.132911, 36.543811 ], [ -78.039420, 36.544196 ], [ -78.038938, 36.544173 ], [ -77.899771, 36.544663 ], [ -77.882357, 36.544737 ], [ -77.875280, 36.544754 ], [ -77.749706, 36.545520 ], [ -77.205156, 36.544581 ], [ -77.190175, 36.546164 ], [ -77.169660, 36.547315 ], [ -77.164500, 36.546330 ], [ -77.152691, 36.544078 ], [ -77.124812, 36.543986 ], [ -77.095062, 36.544626 ], [ -76.916048, 36.543815 ], [ -76.917318, 36.546046 ], [ -76.916989, 36.550742 ], [ -76.915897, 36.552093 ], [ -76.807078, 36.550606 ], [ -76.781296, 36.550659 ], [ -76.749678, 36.550381 ], [ -76.738329, 36.550985 ], [ -76.575496, 36.550744 ], [ -76.541687, 36.550312 ], [ -76.465268, 36.550951 ], [ -76.313215, 36.550551 ], [ -76.034751, 36.550653 ], [ -76.026750, 36.550553 ], [ -75.957648, 36.550553 ], [ -75.955748, 36.550553 ], [ -75.953447, 36.550553 ], [ -75.952847, 36.550553 ], [ -75.922046, 36.550654 ], [ -75.911446, 36.550654 ], [ -75.909046, 36.550654 ], [ -75.904745, 36.550654 ], [ -75.903445, 36.550654 ], [ -75.894145, 36.550754 ], [ -75.893245, 36.550654 ], [ -75.891945, 36.550754 ], [ -75.886545, 36.550754 ], [ -75.885945, 36.550754 ], [ -75.880644, 36.550754 ], [ -75.879744, 36.550754 ], [ -75.867044, 36.550754 ], [ -75.856901, 36.500155 ], [ -75.834975, 36.422650 ], [ -75.818735, 36.357579 ], [ -75.796410, 36.290351 ], [ -75.772510, 36.229440 ], [ -75.759637, 36.204705 ], [ -75.738431, 36.154282 ], [ -75.718310, 36.113674 ], [ -75.696742, 36.077497 ], [ -75.658537, 36.020430 ], [ -75.569794, 35.863301 ], [ -75.552299, 35.822173 ], [ -75.538739, 35.797396 ], [ -75.533012, 35.787377 ], [ -75.536428, 35.780118 ], [ -75.543259, 35.779691 ], [ -75.546675, 35.787377 ], [ -75.553934, 35.799332 ], [ -75.566238, 35.813072 ], [ -75.573083, 35.828867 ], [ -75.588878, 35.844926 ], [ -75.601250, 35.867302 ], [ -75.619151, 35.889415 ], [ -75.617045, 35.906000 ], [ -75.617552, 35.914186 ], [ -75.620114, 35.925288 ], [ -75.631215, 35.941512 ], [ -75.648899, 35.965758 ], [ -75.668379, 35.978394 ], [ -75.671801, 35.985238 ], [ -75.678909, 35.993925 ], [ -75.723662, 36.003139 ], [ -75.727084, 36.010510 ], [ -75.726558, 36.021040 ], [ -75.722082, 36.032360 ], [ -75.722609, 36.037362 ], [ -75.726821, 36.040521 ], [ -75.737088, 36.040784 ], [ -75.740510, 36.046839 ], [ -75.741563, 36.055526 ], [ -75.739457, 36.066846 ], [ -75.739720, 36.075270 ], [ -75.750250, 36.121076 ], [ -75.750479, 36.131208 ], [ -75.752226, 36.140817 ], [ -75.755720, 36.153922 ], [ -75.775814, 36.201097 ], [ -75.783676, 36.215949 ], [ -75.793286, 36.226432 ], [ -75.798528, 36.230800 ], [ -75.803690, 36.235853 ], [ -75.811588, 36.244014 ], [ -75.811851, 36.247699 ], [ -75.808165, 36.259545 ], [ -75.814483, 36.285344 ], [ -75.822907, 36.291662 ], [ -75.833964, 36.292188 ], [ -75.837913, 36.294558 ], [ -75.845284, 36.305614 ], [ -75.841335, 36.328517 ], [ -75.831858, 36.339047 ], [ -75.831595, 36.346418 ], [ -75.836201, 36.363135 ], [ -75.843046, 36.371032 ], [ -75.847258, 36.372085 ], [ -75.851470, 36.379456 ], [ -75.852523, 36.384721 ], [ -75.851470, 36.415785 ], [ -75.864106, 36.430527 ], [ -75.880428, 36.435792 ], [ -75.888325, 36.441583 ], [ -75.891484, 36.460537 ], [ -75.899908, 36.482124 ], [ -75.907279, 36.485809 ], [ -75.913071, 36.486336 ], [ -75.917283, 36.485809 ], [ -75.924127, 36.482124 ], [ -75.927333, 36.482815 ], [ -75.935473, 36.490601 ], [ -75.960069, 36.495025 ], [ -75.972545, 36.494671 ], [ -76.003708, 36.506235 ], [ -76.019261, 36.503506 ], [ -76.023627, 36.500778 ], [ -76.029221, 36.494365 ], [ -76.031949, 36.482496 ], [ -76.020216, 36.458620 ], [ -76.012337, 36.447462 ], [ -76.003912, 36.441864 ], [ -75.989869, 36.436808 ], [ -75.980050, 36.435464 ], [ -75.962285, 36.417240 ], [ -75.940676, 36.418850 ], [ -75.936446, 36.423079 ], [ -75.932694, 36.427627 ], [ -75.928369, 36.428588 ], [ -75.923601, 36.425788 ], [ -75.916409, 36.389010 ], [ -75.916949, 36.383167 ], [ -75.923511, 36.367796 ], [ -75.923331, 36.361863 ], [ -75.917758, 36.353593 ], [ -75.915331, 36.352335 ], [ -75.895285, 36.319615 ], [ -75.888211, 36.293414 ], [ -75.882154, 36.284674 ], [ -75.872721, 36.282770 ], [ -75.864933, 36.284674 ], [ -75.860520, 36.280607 ], [ -75.861818, 36.266415 ], [ -75.867356, 36.252483 ], [ -75.864154, 36.235522 ], [ -75.858703, 36.222628 ], [ -75.848838, 36.216570 ], [ -75.838367, 36.200129 ], [ -75.841222, 36.193812 ], [ -75.839924, 36.177110 ], [ -75.823915, 36.158332 ], [ -75.822531, 36.145957 ], [ -75.813444, 36.136871 ], [ -75.800378, 36.112728 ], [ -75.791637, 36.082267 ], [ -75.793974, 36.071710 ], [ -75.799779, 36.072640 ], [ -75.836084, 36.092616 ], [ -75.847785, 36.101990 ], [ -75.867792, 36.127262 ], [ -75.866323, 36.141410 ], [ -75.863914, 36.159226 ], [ -75.882987, 36.186807 ], [ -75.910658, 36.212157 ], [ -75.922344, 36.244122 ], [ -75.949840, 36.257870 ], [ -75.964620, 36.254433 ], [ -75.957058, 36.247903 ], [ -75.945372, 36.222468 ], [ -75.956027, 36.198065 ], [ -75.936436, 36.180880 ], [ -75.917188, 36.172631 ], [ -75.904999, 36.164188 ], [ -75.920028, 36.164853 ], [ -75.924654, 36.163591 ], [ -75.939047, 36.165518 ], [ -75.995191, 36.178072 ], [ -76.016984, 36.186367 ], [ -76.018936, 36.188318 ], [ -76.029086, 36.202036 ], [ -76.043838, 36.210126 ], [ -76.054308, 36.229162 ], [ -76.081480, 36.237935 ], [ -76.132005, 36.287773 ], [ -76.161384, 36.291028 ], [ -76.184702, 36.298166 ], [ -76.188510, 36.291980 ], [ -76.188717, 36.281242 ], [ -76.171378, 36.265806 ], [ -76.149486, 36.263902 ], [ -76.136637, 36.252481 ], [ -76.115851, 36.214219 ], [ -76.080106, 36.199440 ], [ -76.065391, 36.167147 ], [ -76.059920, 36.155140 ], [ -76.059270, 36.149285 ], [ -76.064224, 36.143775 ], [ -76.071672, 36.140183 ], [ -76.092555, 36.135794 ], [ -76.178946, 36.123424 ], [ -76.206873, 36.137521 ], [ -76.228183, 36.158487 ], [ -76.236932, 36.170389 ], [ -76.247877, 36.175148 ], [ -76.254064, 36.184190 ], [ -76.268741, 36.189764 ], [ -76.274051, 36.188949 ], [ -76.276990, 36.184952 ], [ -76.263582, 36.171817 ], [ -76.247401, 36.161823 ], [ -76.236432, 36.146113 ], [ -76.228527, 36.130647 ], [ -76.191715, 36.107197 ], [ -76.216599, 36.095409 ], [ -76.238712, 36.098568 ], [ -76.265037, 36.104886 ], [ -76.329921, 36.133396 ], [ -76.373571, 36.138208 ], [ -76.383982, 36.146595 ], [ -76.393500, 36.163251 ], [ -76.447812, 36.192514 ], [ -76.454414, 36.189901 ], [ -76.456061, 36.183577 ], [ -76.385257, 36.129959 ], [ -76.375892, 36.120420 ], [ -76.360188, 36.122800 ], [ -76.346418, 36.121023 ], [ -76.334965, 36.110903 ], [ -76.298733, 36.101200 ], [ -76.303998, 36.092776 ], [ -76.323478, 36.084879 ], [ -76.331902, 36.083826 ], [ -76.337168, 36.086458 ], [ -76.355069, 36.086458 ], [ -76.410878, 36.078034 ], [ -76.412984, 36.072243 ], [ -76.420881, 36.060660 ], [ -76.442994, 36.042758 ], [ -76.451418, 36.039073 ], [ -76.458789, 36.028016 ], [ -76.459316, 36.024331 ], [ -76.491959, 36.018013 ], [ -76.514335, 36.005640 ], [ -76.547505, 36.009852 ], [ -76.563300, 36.009852 ], [ -76.575936, 36.006167 ], [ -76.580674, 36.007220 ], [ -76.589625, 36.015644 ], [ -76.603840, 36.033018 ], [ -76.615423, 36.037757 ], [ -76.631745, 36.038283 ], [ -76.653332, 36.035124 ], [ -76.676484, 36.043612 ], [ -76.689257, 36.061494 ], [ -76.698607, 36.096923 ], [ -76.721445, 36.147838 ], [ -76.719401, 36.199441 ], [ -76.714292, 36.215279 ], [ -76.675462, 36.266882 ], [ -76.684925, 36.275383 ], [ -76.693253, 36.278357 ], [ -76.725021, 36.231118 ], [ -76.744436, 36.212725 ], [ -76.752100, 36.147328 ], [ -76.726043, 36.096236 ], [ -76.722996, 36.066585 ], [ -76.705606, 36.042590 ], [ -76.683869, 36.000375 ], [ -76.679657, 35.991951 ], [ -76.684922, 35.983001 ], [ -76.695452, 35.973524 ], [ -76.700190, 35.964573 ], [ -76.697558, 35.951937 ], [ -76.691766, 35.944566 ], [ -76.673865, 35.935089 ], [ -76.667547, 35.933509 ], [ -76.657017, 35.935089 ], [ -76.608052, 35.936668 ], [ -76.603840, 35.939827 ], [ -76.586992, 35.941933 ], [ -76.528551, 35.944039 ], [ -76.507491, 35.949831 ], [ -76.496961, 35.955096 ], [ -76.473795, 35.960888 ], [ -76.460632, 35.970365 ], [ -76.398242, 35.984317 ], [ -76.389818, 35.980105 ], [ -76.381920, 35.971681 ], [ -76.381394, 35.962730 ], [ -76.362966, 35.942197 ], [ -76.340327, 35.943250 ], [ -76.317687, 35.946935 ], [ -76.272408, 35.972734 ], [ -76.213966, 35.988002 ], [ -76.176585, 35.993267 ], [ -76.093697, 35.993001 ], [ -76.083131, 35.989845 ], [ -76.062071, 35.993004 ], [ -76.024162, 35.970891 ], [ -76.014685, 35.960361 ], [ -76.014159, 35.957202 ], [ -76.019950, 35.934036 ], [ -76.014353, 35.920746 ], [ -76.037116, 35.889910 ], [ -76.046017, 35.870275 ], [ -76.063203, 35.853433 ], [ -76.050485, 35.806689 ], [ -76.046813, 35.717935 ], [ -76.036393, 35.690344 ], [ -76.046361, 35.659067 ], [ -76.040150, 35.651310 ], [ -76.029863, 35.649443 ], [ -76.013021, 35.670065 ], [ -76.002366, 35.718356 ], [ -75.986900, 35.768194 ], [ -75.994117, 35.812532 ], [ -75.987148, 35.836967 ], [ -75.986900, 35.888148 ], [ -75.977830, 35.897181 ], [ -75.966247, 35.899287 ], [ -75.962562, 35.901393 ], [ -75.947820, 35.920347 ], [ -75.934131, 35.928244 ], [ -75.929919, 35.928771 ], [ -75.927286, 35.931930 ], [ -75.926760, 35.940354 ], [ -75.937816, 35.950884 ], [ -75.943608, 35.952464 ], [ -75.946767, 35.955623 ], [ -75.947293, 35.959835 ], [ -75.938343, 35.965100 ], [ -75.899382, 35.977209 ], [ -75.879374, 35.978789 ], [ -75.860420, 35.978262 ], [ -75.849890, 35.976156 ], [ -75.809350, 35.959308 ], [ -75.805138, 35.954043 ], [ -75.800926, 35.944566 ], [ -75.782498, 35.935615 ], [ -75.782498, 35.928244 ], [ -75.778813, 35.918241 ], [ -75.768809, 35.901393 ], [ -75.751961, 35.878227 ], [ -75.753014, 35.871382 ], [ -75.748276, 35.852428 ], [ -75.734587, 35.839266 ], [ -75.727216, 35.822703 ], [ -75.726689, 35.811361 ], [ -75.732612, 35.790666 ], [ -75.738233, 35.778301 ], [ -75.739357, 35.770994 ], [ -75.735422, 35.767622 ], [ -75.724743, 35.742892 ], [ -75.719123, 35.714227 ], [ -75.715188, 35.708045 ], [ -75.712940, 35.698490 ], [ -75.713502, 35.693993 ], [ -75.741605, 35.672073 ], [ -75.742167, 35.655212 ], [ -75.737109, 35.638350 ], [ -75.729802, 35.628795 ], [ -75.729802, 35.625985 ], [ -75.747225, 35.610248 ], [ -75.762963, 35.603503 ], [ -75.778138, 35.592262 ], [ -75.775328, 35.579335 ], [ -75.797248, 35.574276 ], [ -75.837154, 35.570904 ], [ -75.851767, 35.578773 ], [ -75.859636, 35.586641 ], [ -75.895045, 35.573152 ], [ -75.906848, 35.559101 ], [ -75.908534, 35.555166 ], [ -75.908534, 35.546174 ], [ -75.916403, 35.538305 ], [ -75.945630, 35.534370 ], [ -75.950126, 35.530998 ], [ -75.954623, 35.526502 ], [ -75.964178, 35.511326 ], [ -75.964740, 35.504582 ], [ -75.961929, 35.496713 ], [ -75.963053, 35.493903 ], [ -75.987222, 35.484348 ], [ -75.995652, 35.475355 ], [ -75.994528, 35.463552 ], [ -75.997901, 35.453435 ], [ -76.009704, 35.442194 ], [ -76.012514, 35.432639 ], [ -76.011390, 35.423084 ], [ -76.014762, 35.416902 ], [ -76.020945, 35.410719 ], [ -76.025441, 35.408471 ], [ -76.037244, 35.414091 ], [ -76.050171, 35.415778 ], [ -76.059726, 35.410157 ], [ -76.063661, 35.405099 ], [ -76.063661, 35.398354 ], [ -76.060850, 35.392733 ], [ -76.059726, 35.383741 ], [ -76.069281, 35.370813 ], [ -76.092887, 35.361259 ], [ -76.123238, 35.351142 ], [ -76.132793, 35.349455 ], [ -76.142910, 35.338776 ], [ -76.142910, 35.328660 ], [ -76.149655, 35.326411 ], [ -76.165392, 35.328659 ], [ -76.168764, 35.332032 ], [ -76.182254, 35.336528 ], [ -76.205860, 35.336528 ], [ -76.235087, 35.350017 ], [ -76.253072, 35.350017 ], [ -76.257569, 35.344397 ], [ -76.265437, 35.343273 ], [ -76.282299, 35.345521 ], [ -76.304781, 35.355638 ], [ -76.327263, 35.356762 ], [ -76.335132, 35.355638 ], [ -76.340752, 35.346645 ], [ -76.349745, 35.345521 ], [ -76.365483, 35.348893 ], [ -76.374475, 35.355638 ], [ -76.382344, 35.356762 ], [ -76.387965, 35.356762 ], [ -76.399206, 35.348893 ], [ -76.408199, 35.350017 ], [ -76.409323, 35.353390 ], [ -76.420564, 35.359010 ], [ -76.431805, 35.362383 ], [ -76.436301, 35.378120 ], [ -76.448666, 35.383741 ], [ -76.455411, 35.383741 ], [ -76.462156, 35.380368 ], [ -76.472273, 35.371375 ], [ -76.485762, 35.371375 ], [ -76.499251, 35.381492 ], [ -76.540292, 35.410657 ], [ -76.533761, 35.421999 ], [ -76.533074, 35.432310 ], [ -76.551634, 35.436091 ], [ -76.565039, 35.448808 ], [ -76.550259, 35.458776 ], [ -76.586349, 35.508957 ], [ -76.537886, 35.510332 ], [ -76.499047, 35.504145 ], [ -76.476706, 35.511707 ], [ -76.456427, 35.550546 ], [ -76.471207, 35.557420 ], [ -76.483580, 35.538172 ], [ -76.494235, 35.533704 ], [ -76.556790, 35.528892 ], [ -76.600441, 35.538516 ], [ -76.620719, 35.527861 ], [ -76.634468, 35.510332 ], [ -76.596316, 35.481117 ], [ -76.601472, 35.460838 ], [ -76.571723, 35.387764 ], [ -76.591980, 35.387113 ], [ -76.710083, 35.427155 ], [ -76.759234, 35.418906 ], [ -76.830897, 35.447949 ], [ -76.905825, 35.458604 ], [ -76.979206, 35.483351 ], [ -77.016265, 35.513955 ], [ -77.024593, 35.515145 ], [ -77.019076, 35.498474 ], [ -77.026638, 35.490569 ], [ -76.985909, 35.472868 ], [ -76.975254, 35.460494 ], [ -76.966661, 35.437810 ], [ -76.923698, 35.449152 ], [ -76.891938, 35.433649 ], [ -76.845848, 35.426124 ], [ -76.823163, 35.408251 ], [ -76.717989, 35.375942 ], [ -76.664027, 35.345696 ], [ -76.604961, 35.337751 ], [ -76.588055, 35.333156 ], [ -76.554332, 35.332032 ], [ -76.548712, 35.328659 ], [ -76.500375, 35.321915 ], [ -76.482389, 35.314046 ], [ -76.472273, 35.294936 ], [ -76.467776, 35.276951 ], [ -76.467776, 35.261213 ], [ -76.477893, 35.243228 ], [ -76.483514, 35.240979 ], [ -76.490258, 35.233111 ], [ -76.491382, 35.220745 ], [ -76.494755, 35.212877 ], [ -76.504872, 35.207256 ], [ -76.521733, 35.192643 ], [ -76.536346, 35.174657 ], [ -76.539719, 35.166788 ], [ -76.536346, 35.149927 ], [ -76.536346, 35.142058 ], [ -76.546463, 35.122948 ], [ -76.557704, 35.116204 ], [ -76.561077, 35.108335 ], [ -76.568945, 35.097094 ], [ -76.575690, 35.092598 ], [ -76.586931, 35.092598 ], [ -76.592552, 35.083605 ], [ -76.593676, 35.075736 ], [ -76.600420, 35.067867 ], [ -76.613910, 35.061123 ], [ -76.622902, 35.061123 ], [ -76.631895, 35.056626 ], [ -76.639764, 35.051006 ], [ -76.771180, 34.976742 ], [ -76.801426, 34.964369 ], [ -76.982904, 35.060607 ], [ -77.039272, 35.136222 ], [ -77.046305, 35.137703 ], [ -77.048895, 35.132098 ], [ -76.989778, 35.045484 ], [ -76.977404, 35.004926 ], [ -76.893540, 34.957495 ], [ -76.818611, 34.939622 ], [ -76.762931, 34.920374 ], [ -76.705875, 34.954745 ], [ -76.635072, 34.989116 ], [ -76.588055, 34.991428 ], [ -76.566697, 34.998173 ], [ -76.539719, 35.000421 ], [ -76.502623, 35.007166 ], [ -76.495879, 35.011662 ], [ -76.491382, 35.017283 ], [ -76.490258, 35.034144 ], [ -76.480141, 35.052130 ], [ -76.474521, 35.070116 ], [ -76.468796, 35.075345 ], [ -76.463468, 35.076411 ], [ -76.435762, 35.057941 ], [ -76.432565, 35.049061 ], [ -76.431855, 35.030945 ], [ -76.425461, 35.001464 ], [ -76.406281, 34.987256 ], [ -76.398466, 34.976600 ], [ -76.395625, 34.975179 ], [ -76.332044, 34.970917 ], [ -76.326361, 34.976245 ], [ -76.329557, 34.986901 ], [ -76.350159, 35.016737 ], [ -76.360815, 35.025973 ], [ -76.364367, 35.031301 ], [ -76.364367, 35.034853 ], [ -76.352290, 35.033077 ], [ -76.318546, 35.020645 ], [ -76.293682, 35.009633 ], [ -76.241630, 34.999116 ], [ -76.274856, 34.953867 ], [ -76.277698, 34.940014 ], [ -76.284092, 34.936817 ], [ -76.311442, 34.910177 ], [ -76.319967, 34.897745 ], [ -76.333820, 34.882116 ], [ -76.347673, 34.872171 ], [ -76.368274, 34.872881 ], [ -76.377154, 34.867553 ], [ -76.379641, 34.862580 ], [ -76.395269, 34.855476 ], [ -76.400242, 34.855476 ], [ -76.411609, 34.841268 ], [ -76.463016, 34.785076 ], [ -76.497731, 34.730770 ], [ -76.524712, 34.681964 ], [ -76.586236, 34.698805 ], [ -76.584173, 34.760329 ], [ -76.593453, 34.770297 ], [ -76.604796, 34.787482 ], [ -76.620606, 34.784389 ], [ -76.616138, 34.704477 ], [ -76.647415, 34.701727 ], [ -76.673537, 34.707570 ], [ -76.674568, 34.698290 ], [ -76.647004, 34.689294 ], [ -76.616758, 34.679670 ], [ -76.567951, 34.662485 ], [ -76.519041, 34.638141 ], [ -76.490989, 34.675754 ], [ -76.383827, 34.807906 ], [ -76.373247, 34.817115 ], [ -76.362591, 34.824219 ], [ -76.341279, 34.842689 ], [ -76.322808, 34.861160 ], [ -76.273986, 34.897298 ], [ -76.233672, 34.925926 ], [ -76.194936, 34.962747 ], [ -76.160127, 34.991163 ], [ -76.111820, 35.034497 ], [ -76.093349, 35.048705 ], [ -76.069906, 35.075701 ], [ -76.064933, 35.077121 ], [ -76.043621, 35.070017 ], [ -76.038648, 35.065045 ], [ -76.035933, 35.058987 ], [ -76.073000, 35.030509 ], [ -76.137269, 34.987858 ], [ -76.233088, 34.905477 ], [ -76.310210, 34.852309 ], [ -76.386804, 34.784579 ], [ -76.450454, 34.714450 ], [ -76.494068, 34.661970 ], [ -76.524199, 34.615416 ], [ -76.535946, 34.588577 ], [ -76.555196, 34.615993 ], [ -76.553806, 34.628252 ], [ -76.550423, 34.630789 ], [ -76.549343, 34.645585 ], [ -76.579467, 34.660174 ], [ -76.618719, 34.672550 ], [ -76.642939, 34.677618 ], [ -76.662645, 34.685524 ], [ -76.676312, 34.693151 ], [ -76.693751, 34.692509 ], [ -76.726969, 34.696690 ], [ -76.770044, 34.696899 ], [ -76.817453, 34.693722 ], [ -76.906257, 34.682820 ], [ -76.990262, 34.669623 ], [ -77.031105, 34.661184 ], [ -77.136843, 34.632926 ], [ -77.169701, 34.622023 ], [ -77.209161, 34.605032 ], [ -77.240991, 34.587507 ], [ -77.322524, 34.535574 ], [ -77.462922, 34.471354 ], [ -77.491796, 34.456098 ], [ -77.556943, 34.417218 ], [ -77.582323, 34.400506 ], [ -77.635034, 34.359555 ], [ -77.661673, 34.341868 ], [ -77.687226, 34.320444 ], [ -77.713322, 34.294879 ], [ -77.740136, 34.272546 ], [ -77.764022, 34.245641 ], [ -77.829209, 34.162618 ], [ -77.841785, 34.140747 ], [ -77.870327, 34.079221 ], [ -77.874384, 34.075671 ], [ -77.878161, 34.067963 ], [ -77.915536, 33.971723 ], [ -77.927926, 33.945265 ], [ -77.946568, 33.912261 ], [ -77.956881, 33.877790 ], [ -77.960172, 33.853315 ], [ -77.959766, 33.840324 ], [ -77.970606, 33.844517 ], [ -78.006765, 33.858704 ], [ -78.009973, 33.861406 ], [ -78.009426, 33.867823 ], [ -78.018689, 33.888289 ], [ -78.095429, 33.906031 ], [ -78.136952, 33.912178 ], [ -78.177720, 33.914272 ], [ -78.276147, 33.912364 ], [ -78.383964, 33.901946 ], [ -78.509042, 33.865515 ], [ -78.541087, 33.851112 ], [ -78.580378, 33.884925 ], [ -78.615932, 33.915523 ], [ -78.621369, 33.920073 ], [ -78.651629, 33.945397 ], [ -78.662530, 33.954520 ], [ -78.702771, 33.989268 ], [ -78.710141, 33.994688 ], [ -78.712206, 33.996732 ], [ -78.769483, 34.045242 ], [ -78.811710, 34.081006 ], [ -78.855385, 34.117996 ], [ -78.874747, 34.134395 ], [ -78.909881, 34.163881 ], [ -78.963692, 34.209041 ], [ -78.995760, 34.235954 ], [ -79.071169, 34.299240 ], [ -79.143242, 34.359817 ], [ -79.151485, 34.366753 ], [ -79.190739, 34.399751 ], [ -79.192041, 34.401040 ], [ -79.198982, 34.406699 ], [ -79.215993, 34.421129 ], [ -79.244886, 34.445637 ], [ -79.249763, 34.449774 ], [ -79.286703, 34.482664 ], [ -79.306653, 34.500426 ], [ -79.323249, 34.514634 ], [ -79.324854, 34.516282 ], [ -79.331328, 34.521869 ], [ -79.358317, 34.545358 ], [ -79.450034, 34.621036 ], [ -79.459766, 34.629027 ], [ -79.461318, 34.630126 ], [ -79.468717, 34.635323 ], [ -79.471599, 34.637200 ], [ -79.479305, 34.644640 ], [ -79.490201, 34.653819 ], [ -79.519043, 34.677321 ], [ -79.520269, 34.678327 ], [ -79.554454, 34.706363 ], [ -79.561691, 34.711996 ], [ -79.631577, 34.768835 ], [ -79.634216, 34.771012 ], [ -79.675299, 34.804744 ], [ -79.688088, 34.804897 ], [ -79.690201, 34.804937 ], [ -79.744116, 34.805651 ], [ -79.744925, 34.805686 ], [ -79.772829, 34.805954 ], [ -79.773607, 34.805931 ], [ -79.870693, 34.805378 ], [ -79.891443, 34.805807 ], [ -79.927618, 34.806555 ], [ -80.000541, 34.808141 ], [ -80.027464, 34.808726 ], [ -80.042764, 34.809097 ], [ -80.072912, 34.809736 ], [ -80.077223, 34.809716 ], [ -80.098022, 34.810147 ], [ -80.098994, 34.810147 ], [ -80.131169, 34.810811 ], [ -80.159252, 34.811390 ], [ -80.229705, 34.812843 ], [ -80.233960, 34.812931 ], [ -80.283627, 34.813589 ], [ -80.304690, 34.813868 ], [ -80.350068, 34.814469 ], [ -80.399871, 34.815128 ], [ -80.417014, 34.815508 ], [ -80.418433, 34.815622 ], [ -80.419586, 34.815581 ], [ -80.425902, 34.815810 ], [ -80.434843, 34.815968 ], [ -80.448766, 34.816332 ], [ -80.451660, 34.816396 ], [ -80.485234, 34.816732 ], [ -80.491814, 34.816798 ], [ -80.499788, 34.817261 ], [ -80.561657, 34.817481 ], [ -80.621222, 34.818174 ], [ -80.625993, 34.818239 ], [ -80.626077, 34.818217 ], [ -80.644656, 34.818568 ], [ -80.646601, 34.818592 ], [ -80.684074, 34.818907 ], [ -80.771792, 34.819646 ], [ -80.777712, 34.819697 ], [ -80.797543, 34.819786 ], [ -80.796997, 34.823874 ], [ -80.795109, 34.837999 ], [ -80.782042, 34.935782 ], [ -80.806461, 34.962894 ], [ -80.806784, 34.963249 ], [ -80.821560, 34.979695 ], [ -80.884887, 35.053510 ], [ -80.906553, 35.076763 ], [ -80.934950, 35.107409 ], [ -80.957870, 35.092639 ], [ -80.984160, 35.077568 ], [ -81.041489, 35.044703 ], [ -81.050018, 35.055246 ], [ -81.055695, 35.060121 ], [ -81.057648, 35.062433 ], [ -81.058029, 35.073190 ], [ -81.057236, 35.086129 ], [ -81.052078, 35.096276 ], [ -81.050079, 35.098817 ], [ -81.046524, 35.100617 ], [ -81.037369, 35.102541 ], [ -81.034958, 35.104105 ], [ -81.032806, 35.108049 ], [ -81.032471, 35.110033 ], [ -81.033005, 35.113747 ], [ -81.036759, 35.122552 ], [ -81.038968, 35.126299 ], [ -81.050420, 35.131048 ], [ -81.051037, 35.131654 ], [ -81.051204, 35.133237 ], [ -81.047826, 35.143743 ], [ -81.047091, 35.145157 ], [ -81.044391, 35.147918 ], [ -81.043407, 35.148390 ], [ -81.042870, 35.149248 ], [ -81.043625, 35.149877 ], [ -81.077253, 35.152047 ], [ -81.109295, 35.154115 ], [ -81.110840, 35.154185 ], [ -81.138207, 35.155417 ], [ -81.239358, 35.159974 ], [ -81.241686, 35.160081 ], [ -81.290672, 35.161967 ], [ -81.366691, 35.164893 ], [ -81.445627, 35.168024 ], [ -81.452398, 35.168293 ], [ -81.461408, 35.168657 ], [ -81.493401, 35.169951 ], [ -81.494265, 35.169882 ], [ -81.545150, 35.171744 ], [ -81.581681, 35.173080 ], [ -81.614877, 35.174504 ], [ -81.646707, 35.175869 ], [ -81.680801, 35.177331 ], [ -81.716259, 35.178852 ], [ -81.738492, 35.179511 ], [ -81.772351, 35.180514 ], [ -81.802081, 35.181395 ], [ -81.874433, 35.184113 ], [ -81.925612, 35.185505 ], [ -82.001422, 35.188493 ], [ -82.039651, 35.189449 ], [ -82.089586, 35.190698 ], [ -82.138947, 35.193122 ], [ -82.167676, 35.193699 ], [ -82.176874, 35.193790 ], [ -82.185513, 35.194355 ], [ -82.195483, 35.194951 ], [ -82.216217, 35.196044 ], [ -82.230517, 35.196764 ], [ -82.230915, 35.196784 ], [ -82.257515, 35.198636 ], [ -82.274920, 35.200071 ], [ -82.282516, 35.199858 ], [ -82.288453, 35.198605 ], [ -82.295354, 35.194965 ], [ -82.307166, 35.193012 ], [ -82.314863, 35.191089 ], [ -82.315871, 35.190678 ], [ -82.317871, 35.187858 ], [ -82.323350, 35.184789 ], [ -82.326917, 35.185056 ], [ -82.330549, 35.186767 ], [ -82.330779, 35.189032 ], [ -82.332975, 35.190645 ], [ -82.333934, 35.190661 ], [ -82.338013, 35.189010 ], [ -82.339508, 35.188930 ], [ -82.340133, 35.189188 ], [ -82.341194, 35.191510 ], [ -82.344554, 35.193115 ], [ -82.350086, 35.192858 ], [ -82.361469, 35.190831 ], [ -82.363256, 35.189639 ], [ -82.363554, 35.188001 ], [ -82.363479, 35.186214 ], [ -82.364299, 35.184725 ], [ -82.368990, 35.181747 ], [ -82.371298, 35.181449 ], [ -82.373218, 35.182201 ], [ -82.376808, 35.184427 ], [ -82.379712, 35.186884 ], [ -82.380903, 35.189565 ], [ -82.381201, 35.191203 ], [ -82.380605, 35.193586 ], [ -82.379191, 35.195894 ], [ -82.378744, 35.198053 ], [ -82.380524, 35.202276 ], [ -82.383776, 35.207646 ], [ -82.384029, 35.210542 ], [ -82.390439, 35.215395 ], [ -82.392930, 35.215402 ], [ -82.395697, 35.213214 ], [ -82.403348, 35.204473 ], [ -82.411301, 35.202483 ], [ -82.417597, 35.200131 ], [ -82.419744, 35.198613 ], [ -82.424461, 35.193092 ], [ -82.428000, 35.183224 ], [ -82.434126, 35.170784 ], [ -82.435689, 35.167715 ], [ -82.439595, 35.165863 ], [ -82.448969, 35.165037 ], [ -82.451201, 35.165260 ], [ -82.452931, 35.168999 ], [ -82.452764, 35.172626 ], [ -82.452987, 35.174690 ], [ -82.455609, 35.177425 ], [ -82.460092, 35.178143 ], [ -82.467991, 35.174633 ], [ -82.472313, 35.174619 ], [ -82.476136, 35.175486 ], [ -82.483937, 35.173798 ], [ -82.487357, 35.172494 ], [ -82.490766, 35.169715 ], [ -82.495506, 35.164312 ], [ -82.499843, 35.163675 ], [ -82.506137, 35.163894 ], [ -82.516044, 35.163442 ], [ -82.516910, 35.163029 ], [ -82.517284, 35.162643 ], [ -82.519210, 35.161044 ], [ -82.521403, 35.158851 ], [ -82.525930, 35.156749 ], [ -82.529973, 35.155617 ], [ -82.532560, 35.155617 ], [ -82.534662, 35.156911 ], [ -82.535967, 35.158664 ], [ -82.536218, 35.159259 ], [ -82.540483, 35.160306 ], [ -82.544525, 35.160306 ], [ -82.547436, 35.160306 ], [ -82.550508, 35.159498 ], [ -82.552934, 35.158042 ], [ -82.554227, 35.156911 ], [ -82.554871, 35.154639 ], [ -82.554874, 35.152868 ], [ -82.556168, 35.151736 ], [ -82.558593, 35.150928 ], [ -82.560807, 35.151644 ], [ -82.563767, 35.151575 ], [ -82.566193, 35.150119 ], [ -82.567486, 35.147694 ], [ -82.569912, 35.145268 ], [ -82.578316, 35.142104 ], [ -82.580687, 35.141742 ], [ -82.581836, 35.142352 ], [ -82.586035, 35.143142 ], [ -82.588158, 35.142928 ], [ -82.592430, 35.139002 ], [ -82.598140, 35.137729 ], [ -82.602358, 35.139036 ], [ -82.609706, 35.139039 ], [ -82.612444, 35.138234 ], [ -82.613866, 35.137529 ], [ -82.614402, 35.136701 ], [ -82.617993, 35.135270 ], [ -82.621185, 35.134635 ], [ -82.624847, 35.130432 ], [ -82.626436, 35.127903 ], [ -82.629031, 35.126155 ], [ -82.632574, 35.125833 ], [ -82.634668, 35.126317 ], [ -82.638210, 35.128088 ], [ -82.642237, 35.129215 ], [ -82.645296, 35.128410 ], [ -82.648694, 35.126770 ], [ -82.651416, 35.124867 ], [ -82.653510, 35.121968 ], [ -82.657858, 35.119392 ], [ -82.662381, 35.118123 ], [ -82.669614, 35.118103 ], [ -82.672513, 35.119392 ], [ -82.673318, 35.121002 ], [ -82.675089, 35.123257 ], [ -82.676861, 35.125350 ], [ -82.680887, 35.126155 ], [ -82.683625, 35.125833 ], [ -82.686040, 35.124545 ], [ -82.686496, 35.121822 ], [ -82.686738, 35.119790 ], [ -82.687641, 35.119287 ], [ -82.688939, 35.118103 ], [ -82.690549, 35.116171 ], [ -82.691194, 35.114721 ], [ -82.691355, 35.113272 ], [ -82.690711, 35.111501 ], [ -82.688778, 35.108602 ], [ -82.688456, 35.106347 ], [ -82.689634, 35.104117 ], [ -82.694898, 35.098456 ], [ -82.698602, 35.097168 ], [ -82.701017, 35.097490 ], [ -82.703916, 35.097651 ], [ -82.707152, 35.096542 ], [ -82.715297, 35.092943 ], [ -82.720442, 35.093265 ], [ -82.723462, 35.094341 ], [ -82.727010, 35.094142 ], [ -82.728961, 35.091978 ], [ -82.729517, 35.090590 ], [ -82.729683, 35.087827 ], [ -82.730971, 35.086378 ], [ -82.735904, 35.082701 ], [ -82.738379, 35.079453 ], [ -82.741761, 35.078326 ], [ -82.746431, 35.079131 ], [ -82.749491, 35.078487 ], [ -82.751102, 35.075749 ], [ -82.751265, 35.073463 ], [ -82.754162, 35.069629 ], [ -82.757704, 35.068019 ], [ -82.764464, 35.068177 ], [ -82.770046, 35.065476 ], [ -82.777376, 35.064143 ], [ -82.781973, 35.066817 ], [ -82.780546, 35.069043 ], [ -82.779928, 35.070435 ], [ -82.779928, 35.072206 ], [ -82.779116, 35.073674 ], [ -82.777407, 35.076885 ], [ -82.776357, 35.081349 ], [ -82.778651, 35.083575 ], [ -82.781062, 35.084492 ], [ -82.781130, 35.084585 ], [ -82.783283, 35.085600 ], [ -82.787867, 35.085024 ], [ -82.809766, 35.078748 ], [ -82.897499, 35.056021 ], [ -82.999867, 35.029950 ], [ -83.108535, 35.000771 ], [ -83.190410, 34.999456 ], [ -83.322768, 34.995874 ], [ -83.549381, 34.992492 ], [ -83.620185, 34.992091 ], [ -83.619985, 34.986592 ], [ -83.749893, 34.987691 ], [ -83.831097, 34.987289 ], [ -83.936646, 34.987485 ], [ -84.021357, 34.987430 ], [ -84.029954, 34.987321 ], [ -84.129555, 34.987504 ], [ -84.321869, 34.988408 ], [ -84.310022, 35.078883 ], [ -84.308576, 35.092761 ], [ -84.308437, 35.093173 ], [ -84.304809, 35.121702 ], [ -84.298006, 35.167468 ], [ -84.295238, 35.182442 ], [ -84.292321, 35.206677 ], [ -84.290240, 35.225572 ], [ -84.289621, 35.224677 ], [ -84.287982, 35.224468 ], [ -84.283220, 35.226577 ], [ -84.282520, 35.227877 ], [ -84.275420, 35.234777 ], [ -84.260319, 35.241877 ], [ -84.257719, 35.246177 ], [ -84.252819, 35.249477 ], [ -84.243019, 35.253178 ], [ -84.240219, 35.255178 ], [ -84.231818, 35.264778 ], [ -84.227818, 35.267878 ], [ -84.223718, 35.269078 ], [ -84.216318, 35.267978 ], [ -84.211818, 35.266078 ], [ -84.205517, 35.259679 ], [ -84.205317, 35.258279 ], [ -84.202879, 35.255772 ], [ -84.201717, 35.247779 ], [ -84.200117, 35.244679 ], [ -84.199117, 35.243679 ], [ -84.192217, 35.243079 ], [ -84.188417, 35.239979 ], [ -84.178516, 35.240679 ], [ -84.177016, 35.242379 ], [ -84.170416, 35.245779 ], [ -84.168616, 35.245780 ], [ -84.161316, 35.243480 ], [ -84.160416, 35.243880 ], [ -84.158916, 35.245880 ], [ -84.155316, 35.246480 ], [ -84.143124, 35.246879 ], [ -84.139715, 35.246180 ], [ -84.136415, 35.244780 ], [ -84.133299, 35.243679 ], [ -84.130570, 35.243364 ], [ -84.128890, 35.243679 ], [ -84.127315, 35.244414 ], [ -84.126815, 35.246481 ], [ -84.125615, 35.249381 ], [ -84.124915, 35.249830 ], [ -84.121150, 35.250644 ], [ -84.115279, 35.250438 ], [ -84.115048, 35.249765 ], [ -84.114414, 35.249081 ], [ -84.113314, 35.248981 ], [ -84.108449, 35.250330 ], [ -84.103135, 35.248781 ], [ -84.102270, 35.248115 ], [ -84.097508, 35.247382 ], [ -84.092213, 35.249981 ], [ -84.082913, 35.257082 ], [ -84.082813, 35.258882 ], [ -84.081117, 35.261146 ], [ -84.074713, 35.263182 ], [ -84.070612, 35.263782 ], [ -84.063712, 35.266682 ], [ -84.055712, 35.268182 ], [ -84.052612, 35.269982 ], [ -84.042711, 35.278383 ], [ -84.036011, 35.288683 ], [ -84.027910, 35.292783 ], [ -84.023510, 35.295783 ], [ -84.021410, 35.301383 ], [ -84.026510, 35.309283 ], [ -84.028710, 35.310383 ], [ -84.035010, 35.311983 ], [ -84.035710, 35.312883 ], [ -84.035510, 35.317783 ], [ -84.032479, 35.325318 ], [ -84.032450, 35.326530 ], [ -84.032209, 35.328583 ], [ -84.030409, 35.330483 ], [ -84.029377, 35.333197 ], [ -84.031272, 35.336438 ], [ -84.032430, 35.336845 ], [ -84.038081, 35.348363 ], [ -84.037494, 35.349850 ], [ -84.035343, 35.350833 ], [ -84.024756, 35.353896 ], [ -84.023456, 35.354217 ], [ -84.020188, 35.357503 ], [ -84.019193, 35.359569 ], [ -84.015121, 35.364868 ], [ -84.007586, 35.371661 ], [ -84.008307, 35.378883 ], [ -84.009807, 35.382683 ], [ -84.011207, 35.384383 ], [ -84.010607, 35.386183 ], [ -84.008207, 35.389683 ], [ -84.008207, 35.390383 ], [ -84.014107, 35.397783 ], [ -84.015207, 35.398483 ], [ -84.018107, 35.399083 ], [ -84.018807, 35.399783 ], [ -84.021507, 35.404183 ], [ -84.021782, 35.407418 ], [ -84.020633, 35.409843 ], [ -84.017607, 35.411183 ], [ -84.014707, 35.411983 ], [ -84.011706, 35.415383 ], [ -84.005306, 35.420883 ], [ -84.002250, 35.422548 ], [ -83.999906, 35.425201 ], [ -83.999242, 35.426140 ], [ -83.998154, 35.430786 ], [ -83.996619, 35.433761 ], [ -83.992568, 35.438065 ], [ -83.983233, 35.442350 ], [ -83.978286, 35.447820 ], [ -83.973057, 35.448921 ], [ -83.973171, 35.452582 ], [ -83.971439, 35.455145 ], [ -83.969845, 35.455443 ], [ -83.966656, 35.454941 ], [ -83.965229, 35.455399 ], [ -83.961400, 35.459496 ], [ -83.961054, 35.462838 ], [ -83.961056, 35.463738 ], [ -83.961053, 35.464143 ], [ -83.957821, 35.464211 ], [ -83.955416, 35.463456 ], [ -83.952882, 35.460635 ], [ -83.949389, 35.461164 ], [ -83.942987, 35.465084 ], [ -83.942172, 35.467254 ], [ -83.937015, 35.471511 ], [ -83.929743, 35.473330 ], [ -83.924895, 35.473884 ], [ -83.919564, 35.473367 ], [ -83.916801, 35.473612 ], [ -83.911773, 35.476028 ], [ -83.909265, 35.479714 ], [ -83.908040, 35.484397 ], [ -83.905612, 35.489060 ], [ -83.901527, 35.491026 ], [ -83.900338, 35.493095 ], [ -83.900200, 35.494191 ], [ -83.901403, 35.495278 ], [ -83.901381, 35.496553 ], [ -83.895669, 35.501868 ], [ -83.893031, 35.502253 ], [ -83.892074, 35.503089 ], [ -83.884262, 35.512754 ], [ -83.882563, 35.517182 ], [ -83.880074, 35.518745 ], [ -83.872630, 35.521145 ], [ -83.866413, 35.520910 ], [ -83.859261, 35.521851 ], [ -83.853898, 35.521059 ], [ -83.848502, 35.519259 ], [ -83.840203, 35.521560 ], [ -83.831895, 35.524766 ], [ -83.827428, 35.524653 ], [ -83.825590, 35.523829 ], [ -83.809798, 35.534310 ], [ -83.808713, 35.536415 ], [ -83.802434, 35.541588 ], [ -83.786802, 35.547200 ], [ -83.780129, 35.550387 ], [ -83.773092, 35.557465 ], [ -83.771736, 35.562118 ], [ -83.764606, 35.561538 ], [ -83.759675, 35.562492 ], [ -83.756917, 35.563604 ], [ -83.749894, 35.561146 ], [ -83.735669, 35.565455 ], [ -83.732947, 35.563149 ], [ -83.723459, 35.561874 ], [ -83.720787, 35.563347 ], [ -83.707199, 35.568533 ], [ -83.703846, 35.568476 ], [ -83.702099, 35.567634 ], [ -83.700663, 35.567621 ], [ -83.697827, 35.568352 ], [ -83.684154, 35.568848 ], [ -83.676268, 35.570289 ], [ -83.673093, 35.568974 ], [ -83.666272, 35.569389 ], [ -83.662957, 35.569138 ], [ -83.660925, 35.568207 ], [ -83.657933, 35.569211 ], [ -83.653159, 35.568309 ], [ -83.645481, 35.565825 ], [ -83.640498, 35.566075 ], [ -83.637182, 35.567096 ], [ -83.635832, 35.568169 ], [ -83.632358, 35.569093 ], [ -83.629734, 35.567889 ], [ -83.615312, 35.574026 ], [ -83.608889, 35.579451 ], [ -83.604806, 35.579340 ], [ -83.601854, 35.578228 ], [ -83.594270, 35.572912 ], [ -83.587827, 35.566963 ], [ -83.587140, 35.564017 ], [ -83.585590, 35.562941 ], [ -83.582000, 35.562684 ], [ -83.576345, 35.564019 ], [ -83.572424, 35.565518 ], [ -83.566090, 35.565993 ], [ -83.559264, 35.564796 ], [ -83.552167, 35.564346 ], [ -83.540826, 35.565702 ], [ -83.534169, 35.564668 ], [ -83.520469, 35.565602 ], [ -83.517564, 35.562871 ], [ -83.498335, 35.562981 ], [ -83.491647, 35.566867 ], [ -83.485527, 35.568204 ], [ -83.480617, 35.576633 ], [ -83.478523, 35.579202 ], [ -83.479317, 35.582764 ], [ -83.479082, 35.583316 ], [ -83.475367, 35.584775 ], [ -83.472684, 35.586552 ], [ -83.472668, 35.589125 ], [ -83.471362, 35.590304 ], [ -83.462678, 35.592600 ], [ -83.455722, 35.598045 ], [ -83.452431, 35.602918 ], [ -83.447137, 35.608664 ], [ -83.445802, 35.611803 ], [ -83.441197, 35.611739 ], [ -83.432298, 35.609941 ], [ -83.421576, 35.611186 ], [ -83.420964, 35.611596 ], [ -83.420370, 35.613467 ], [ -83.411852, 35.616920 ], [ -83.406061, 35.620185 ], [ -83.403569, 35.621313 ], [ -83.396626, 35.622720 ], [ -83.392652, 35.625095 ], [ -83.388602, 35.632352 ], [ -83.388722, 35.633584 ], [ -83.380251, 35.634705 ], [ -83.377984, 35.634496 ], [ -83.376785, 35.636638 ], [ -83.373712, 35.638935 ], [ -83.372174, 35.639310 ], [ -83.370369, 35.638204 ], [ -83.368162, 35.638202 ], [ -83.366941, 35.638728 ], [ -83.358209, 35.647277 ], [ -83.356202, 35.650019 ], [ -83.355367, 35.652338 ], [ -83.355537, 35.654632 ], [ -83.353776, 35.657478 ], [ -83.351560, 35.659858 ], [ -83.349255, 35.660854 ], [ -83.347262, 35.660474 ], [ -83.337683, 35.663074 ], [ -83.334965, 35.665471 ], [ -83.321101, 35.662815 ], [ -83.317905, 35.659015 ], [ -83.312757, 35.654809 ], [ -83.310490, 35.654452 ], [ -83.302279, 35.656064 ], [ -83.297154, 35.657750 ], [ -83.293676, 35.661919 ], [ -83.291075, 35.667131 ], [ -83.290682, 35.672638 ], [ -83.289165, 35.674509 ], [ -83.281178, 35.677802 ], [ -83.275480, 35.679463 ], [ -83.271378, 35.681476 ], [ -83.269277, 35.685403 ], [ -83.265390, 35.687535 ], [ -83.261252, 35.689165 ], [ -83.258117, 35.691924 ], [ -83.255610, 35.696061 ], [ -83.255126, 35.701493 ], [ -83.256111, 35.703961 ], [ -83.255108, 35.707096 ], [ -83.254230, 35.709478 ], [ -83.254481, 35.712362 ], [ -83.255489, 35.714974 ], [ -83.255351, 35.716230 ], [ -83.251247, 35.719916 ], [ -83.243501, 35.722533 ], [ -83.242132, 35.723638 ], [ -83.240669, 35.726760 ], [ -83.232042, 35.726098 ], [ -83.222627, 35.726138 ], [ -83.219981, 35.726601 ], [ -83.216972, 35.725752 ], [ -83.214501, 35.724434 ], [ -83.203752, 35.726553 ], [ -83.200126, 35.725331 ], [ -83.198267, 35.725494 ], [ -83.188370, 35.729798 ], [ -83.185685, 35.729890 ], [ -83.182097, 35.735492 ], [ -83.180836, 35.738882 ], [ -83.177499, 35.743913 ], [ -83.171867, 35.745978 ], [ -83.170173, 35.746107 ], [ -83.164770, 35.754618 ], [ -83.165427, 35.758700 ], [ -83.164909, 35.759965 ], [ -83.161537, 35.763363 ], [ -83.159208, 35.764892 ], [ -83.154080, 35.764280 ], [ -83.148080, 35.764295 ], [ -83.146970, 35.765124 ], [ -83.127707, 35.768093 ], [ -83.120183, 35.766234 ], [ -83.113662, 35.770211 ], [ -83.110491, 35.770913 ], [ -83.104805, 35.773480 ], [ -83.104584, 35.774230 ], [ -83.102320, 35.775071 ], [ -83.100233, 35.774745 ], [ -83.100329, 35.774804 ], [ -83.100225, 35.774765 ], [ -83.097193, 35.776067 ], [ -83.086054, 35.783627 ], [ -83.085205, 35.785794 ], [ -83.078732, 35.789472 ], [ -83.074030, 35.790016 ], [ -83.072221, 35.788310 ], [ -83.063975, 35.786643 ], [ -83.061507, 35.786774 ], [ -83.058340, 35.788241 ], [ -83.052677, 35.789548 ], [ -83.048530, 35.787706 ], [ -83.046307, 35.785853 ], [ -83.044108, 35.785347 ], [ -83.042666, 35.785407 ], [ -83.039510, 35.786777 ], [ -83.036209, 35.787405 ], [ -83.012377, 35.779818 ], [ -83.006067, 35.778404 ], [ -83.001473, 35.773752 ], [ -82.995803, 35.773128 ], [ -82.992053, 35.773948 ], [ -82.983970, 35.778010 ], [ -82.978414, 35.782610 ], [ -82.974463, 35.786790 ], [ -82.969648, 35.789663 ], [ -82.964088, 35.789980 ], [ -82.962206, 35.792755 ], [ -82.962842, 35.795126 ], [ -82.961724, 35.800491 ], [ -82.958950, 35.803323 ], [ -82.956127, 35.807874 ], [ -82.955751, 35.809802 ], [ -82.952026, 35.816183 ], [ -82.945515, 35.824662 ], [ -82.943830, 35.825638 ], [ -82.937437, 35.827320 ], [ -82.933221, 35.832915 ], [ -82.931859, 35.836351 ], [ -82.927569, 35.838586 ], [ -82.923358, 35.839273 ], [ -82.920171, 35.841664 ], [ -82.919108, 35.844851 ], [ -82.920974, 35.851073 ], [ -82.919374, 35.860523 ], [ -82.918312, 35.863977 ], [ -82.916452, 35.866102 ], [ -82.901301, 35.872593 ], [ -82.899718, 35.874602 ], [ -82.899186, 35.877524 ], [ -82.899718, 35.879914 ], [ -82.901046, 35.882305 ], [ -82.903968, 35.885492 ], [ -82.903702, 35.887617 ], [ -82.901843, 35.890274 ], [ -82.901843, 35.892930 ], [ -82.904543, 35.897011 ], [ -82.906917, 35.907397 ], [ -82.911671, 35.914711 ], [ -82.911936, 35.921618 ], [ -82.911405, 35.925868 ], [ -82.910608, 35.926930 ], [ -82.906358, 35.927196 ], [ -82.903436, 35.928524 ], [ -82.902374, 35.929852 ], [ -82.901577, 35.931446 ], [ -82.901713, 35.937713 ], [ -82.898505, 35.945101 ], [ -82.896947, 35.944624 ], [ -82.892659, 35.945182 ], [ -82.883933, 35.949192 ], [ -82.874159, 35.952698 ], [ -82.870666, 35.951990 ], [ -82.869315, 35.950565 ], [ -82.860724, 35.947430 ], [ -82.852554, 35.949089 ], [ -82.849849, 35.947772 ], [ -82.841259, 35.941721 ], [ -82.839994, 35.940166 ], [ -82.833268, 35.934993 ], [ -82.830112, 35.932972 ], [ -82.828933, 35.932932 ], [ -82.826045, 35.929721 ], [ -82.822570, 35.922531 ], [ -82.821861, 35.921839 ], [ -82.816130, 35.923986 ], [ -82.811067, 35.926801 ], [ -82.809038, 35.927241 ], [ -82.804997, 35.927168 ], [ -82.802892, 35.929013 ], [ -82.802769, 35.930129 ], [ -82.805771, 35.935316 ], [ -82.806174, 35.936908 ], [ -82.805851, 35.937938 ], [ -82.800431, 35.944155 ], [ -82.787465, 35.952163 ], [ -82.785191, 35.959231 ], [ -82.785356, 35.962530 ], [ -82.784536, 35.963905 ], [ -82.783085, 35.964982 ], [ -82.777751, 35.966912 ], [ -82.774905, 35.971978 ], [ -82.776434, 35.973886 ], [ -82.778625, 35.974792 ], [ -82.780319, 35.974365 ], [ -82.781809, 35.974562 ], [ -82.785558, 35.977795 ], [ -82.785267, 35.987927 ], [ -82.779397, 35.992511 ], [ -82.778589, 35.997001 ], [ -82.777283, 35.998811 ], [ -82.776001, 36.000103 ], [ -82.765365, 36.003003 ], [ -82.759165, 36.004203 ], [ -82.754465, 36.004304 ], [ -82.750065, 36.006004 ], [ -82.731865, 36.017604 ], [ -82.727865, 36.018504 ], [ -82.725065, 36.018204 ], [ -82.715965, 36.022804 ], [ -82.715365, 36.024253 ], [ -82.715565, 36.026904 ], [ -82.715165, 36.028604 ], [ -82.707465, 36.030104 ], [ -82.703165, 36.032404 ], [ -82.701065, 36.034404 ], [ -82.688865, 36.038604 ], [ -82.685565, 36.042004 ], [ -82.684765, 36.045004 ], [ -82.683565, 36.046104 ], [ -82.672965, 36.050405 ], [ -82.668365, 36.052905 ], [ -82.662665, 36.055005 ], [ -82.657249, 36.056636 ], [ -82.654815, 36.056225 ], [ -82.650165, 36.057805 ], [ -82.643565, 36.062805 ], [ -82.637165, 36.065805 ], [ -82.632265, 36.065705 ], [ -82.628365, 36.062105 ], [ -82.618664, 36.056105 ], [ -82.617264, 36.054205 ], [ -82.618064, 36.051205 ], [ -82.618164, 36.047005 ], [ -82.613563, 36.046406 ], [ -82.609663, 36.044906 ], [ -82.606163, 36.041006 ], [ -82.602877, 36.039833 ] ] ], [ [ [ -75.675245, 35.929024 ], [ -75.659540, 35.919564 ], [ -75.662938, 35.916166 ], [ -75.662019, 35.906522 ], [ -75.653478, 35.904686 ], [ -75.648519, 35.906982 ], [ -75.645120, 35.905788 ], [ -75.627670, 35.883149 ], [ -75.616833, 35.856331 ], [ -75.619772, 35.847606 ], [ -75.614361, 35.815659 ], [ -75.620454, 35.809253 ], [ -75.624235, 35.809387 ], [ -75.638980, 35.818639 ], [ -75.667891, 35.823540 ], [ -75.675054, 35.830204 ], [ -75.660086, 35.838610 ], [ -75.660598, 35.862541 ], [ -75.663356, 35.869835 ], [ -75.672830, 35.882423 ], [ -75.681415, 35.883980 ], [ -75.697672, 35.901639 ], [ -75.696871, 35.909556 ], [ -75.702165, 35.915428 ], [ -75.723782, 35.925569 ], [ -75.727251, 35.933620 ], [ -75.726807, 35.935844 ], [ -75.718266, 35.939714 ], [ -75.705323, 35.939403 ], [ -75.691150, 35.936932 ], [ -75.686358, 35.932973 ], [ -75.675245, 35.929024 ] ] ], [ [ [ -75.528992, 35.776289 ], [ -75.522232, 35.774178 ], [ -75.502427, 35.742913 ], [ -75.496086, 35.728515 ], [ -75.479128, 35.678634 ], [ -75.458659, 35.596597 ], [ -75.460061, 35.581314 ], [ -75.462491, 35.553556 ], [ -75.471355, 35.479615 ], [ -75.486771, 35.391652 ], [ -75.502188, 35.320012 ], [ -75.525920, 35.233839 ], [ -75.527676, 35.215955 ], [ -75.544809, 35.228421 ], [ -75.560225, 35.232048 ], [ -75.580176, 35.231142 ], [ -75.610101, 35.227514 ], [ -75.635493, 35.220260 ], [ -75.672673, 35.208471 ], [ -75.728897, 35.190334 ], [ -75.757916, 35.183079 ], [ -75.769705, 35.180359 ], [ -75.789655, 35.172197 ], [ -75.840438, 35.151340 ], [ -75.912985, 35.119600 ], [ -75.944725, 35.105091 ], [ -75.963768, 35.092395 ], [ -75.982812, 35.081513 ], [ -76.001510, 35.067230 ], [ -76.013145, 35.061855 ], [ -76.014954, 35.065349 ], [ -76.013561, 35.068832 ], [ -76.000949, 35.084234 ], [ -75.991880, 35.092395 ], [ -75.989175, 35.100882 ], [ -75.990569, 35.108546 ], [ -75.989175, 35.115165 ], [ -75.983950, 35.120042 ], [ -75.973499, 35.121087 ], [ -75.966489, 35.117787 ], [ -75.954700, 35.119600 ], [ -75.923867, 35.135017 ], [ -75.910265, 35.142271 ], [ -75.893942, 35.150433 ], [ -75.839531, 35.172197 ], [ -75.819172, 35.176826 ], [ -75.812902, 35.178568 ], [ -75.801444, 35.183079 ], [ -75.793283, 35.188520 ], [ -75.785729, 35.194244 ], [ -75.754289, 35.199402 ], [ -75.745220, 35.203030 ], [ -75.734171, 35.204347 ], [ -75.718015, 35.209377 ], [ -75.708947, 35.213912 ], [ -75.698972, 35.221166 ], [ -75.694437, 35.222980 ], [ -75.687490, 35.231171 ], [ -75.684006, 35.232913 ], [ -75.681916, 35.232913 ], [ -75.675394, 35.228421 ], [ -75.664512, 35.227514 ], [ -75.640934, 35.233862 ], [ -75.630358, 35.238487 ], [ -75.615378, 35.248938 ], [ -75.599005, 35.256253 ], [ -75.598312, 35.261067 ], [ -75.597960, 35.266704 ], [ -75.596915, 35.269491 ], [ -75.585419, 35.266356 ], [ -75.581935, 35.263917 ], [ -75.561033, 35.266008 ], [ -75.535741, 35.272856 ], [ -75.529393, 35.288272 ], [ -75.523952, 35.318198 ], [ -75.518511, 35.336335 ], [ -75.512610, 35.362853 ], [ -75.506722, 35.387118 ], [ -75.500374, 35.424298 ], [ -75.494933, 35.454224 ], [ -75.487678, 35.485056 ], [ -75.488585, 35.497752 ], [ -75.489618, 35.508471 ], [ -75.487528, 35.525889 ], [ -75.482237, 35.538560 ], [ -75.478610, 35.553069 ], [ -75.478610, 35.599318 ], [ -75.481330, 35.622896 ], [ -75.487678, 35.648287 ], [ -75.498675, 35.666281 ], [ -75.507385, 35.680564 ], [ -75.515745, 35.721671 ], [ -75.515397, 35.730380 ], [ -75.533512, 35.773577 ], [ -75.528992, 35.776289 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US39", "STATE": "39", "NAME": "Ohio", "LSAD": "", "CENSUSAREA": 40860.694000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -82.813489, 41.723468 ], [ -82.810487, 41.720524 ], [ -82.808869, 41.708333 ], [ -82.816133, 41.706732 ], [ -82.835118, 41.708971 ], [ -82.835577, 41.710823 ], [ -82.832709, 41.715650 ], [ -82.825720, 41.722810 ], [ -82.820409, 41.724549 ], [ -82.813489, 41.723468 ] ] ], [ [ [ -82.803341, 41.693837 ], [ -82.786304, 41.697140 ], [ -82.782719, 41.694003 ], [ -82.790561, 41.689970 ], [ -82.801539, 41.682577 ], [ -82.805137, 41.674931 ], [ -82.805423, 41.671920 ], [ -82.813781, 41.670594 ], [ -82.826443, 41.684774 ], [ -82.812805, 41.692002 ], [ -82.803341, 41.693837 ] ] ], [ [ [ -82.824731, 41.659428 ], [ -82.808587, 41.661682 ], [ -82.805179, 41.664281 ], [ -82.796333, 41.665973 ], [ -82.793069, 41.664692 ], [ -82.794198, 41.662496 ], [ -82.797493, 41.658197 ], [ -82.827011, 41.633701 ], [ -82.834662, 41.629331 ], [ -82.842099, 41.628323 ], [ -82.843602, 41.647009 ], [ -82.834092, 41.657121 ], [ -82.824731, 41.659428 ] ] ], [ [ [ -82.700208, 41.612190 ], [ -82.691123, 41.611331 ], [ -82.680150, 41.618970 ], [ -82.677772, 41.617986 ], [ -82.680669, 41.594611 ], [ -82.686033, 41.587246 ], [ -82.688744, 41.585896 ], [ -82.702027, 41.585437 ], [ -82.725827, 41.595199 ], [ -82.735766, 41.600982 ], [ -82.735707, 41.603361 ], [ -82.718802, 41.619629 ], [ -82.707310, 41.619609 ], [ -82.703438, 41.617734 ], [ -82.700208, 41.612190 ] ] ], [ [ [ -82.093165, 38.970980 ], [ -82.094865, 38.964578 ], [ -82.100565, 38.955678 ], [ -82.109065, 38.945579 ], [ -82.110866, 38.940379 ], [ -82.110565, 38.935279 ], [ -82.111666, 38.932579 ], [ -82.120966, 38.921079 ], [ -82.128866, 38.909979 ], [ -82.134766, 38.905579 ], [ -82.143167, 38.898079 ], [ -82.144567, 38.891679 ], [ -82.145267, 38.883479 ], [ -82.142167, 38.877080 ], [ -82.139988, 38.870345 ], [ -82.139224, 38.865020 ], [ -82.141616, 38.851394 ], [ -82.144867, 38.840480 ], [ -82.147667, 38.836980 ], [ -82.161570, 38.824632 ], [ -82.165898, 38.822437 ], [ -82.179478, 38.817376 ], [ -82.191172, 38.815137 ], [ -82.199280, 38.808688 ], [ -82.209290, 38.802672 ], [ -82.214494, 38.798691 ], [ -82.217269, 38.795680 ], [ -82.221566, 38.787187 ], [ -82.221518, 38.779810 ], [ -82.220449, 38.773739 ], [ -82.216614, 38.768350 ], [ -82.207141, 38.763943 ], [ -82.201537, 38.760372 ], [ -82.198882, 38.757725 ], [ -82.195606, 38.752441 ], [ -82.193268, 38.741182 ], [ -82.189668, 38.737382 ], [ -82.188268, 38.734082 ], [ -82.186568, 38.722482 ], [ -82.184567, 38.715882 ], [ -82.182467, 38.708782 ], [ -82.182867, 38.705482 ], [ -82.185067, 38.699182 ], [ -82.190167, 38.687382 ], [ -82.190867, 38.680383 ], [ -82.187667, 38.672683 ], [ -82.186067, 38.666783 ], [ -82.185567, 38.659583 ], [ -82.179067, 38.648883 ], [ -82.176767, 38.642783 ], [ -82.174267, 38.633183 ], [ -82.172667, 38.629684 ], [ -82.172066, 38.625984 ], [ -82.172066, 38.619284 ], [ -82.175167, 38.608484 ], [ -82.177267, 38.603784 ], [ -82.181967, 38.599384 ], [ -82.188767, 38.594984 ], [ -82.193824, 38.593096 ], [ -82.205171, 38.591719 ], [ -82.218967, 38.591683 ], [ -82.222168, 38.591384 ], [ -82.245969, 38.598483 ], [ -82.252469, 38.598783 ], [ -82.262070, 38.598183 ], [ -82.271470, 38.595383 ], [ -82.274270, 38.593683 ], [ -82.291271, 38.578983 ], [ -82.293471, 38.575383 ], [ -82.293871, 38.572683 ], [ -82.293271, 38.560283 ], [ -82.295671, 38.538483 ], [ -82.297771, 38.533283 ], [ -82.300271, 38.529383 ], [ -82.302871, 38.523183 ], [ -82.303971, 38.517683 ], [ -82.303071, 38.504384 ], [ -82.304223, 38.496308 ], [ -82.306351, 38.490692 ], [ -82.310639, 38.483172 ], [ -82.312511, 38.476116 ], [ -82.313935, 38.468084 ], [ -82.318111, 38.457876 ], [ -82.323999, 38.449268 ], [ -82.330335, 38.444500 ], [ -82.340640, 38.440948 ], [ -82.360145, 38.438596 ], [ -82.381773, 38.434783 ], [ -82.389746, 38.434355 ], [ -82.404882, 38.439347 ], [ -82.434375, 38.430082 ], [ -82.447076, 38.426982 ], [ -82.459676, 38.424682 ], [ -82.486577, 38.418082 ], [ -82.507678, 38.410782 ], [ -82.529579, 38.405182 ], [ -82.540199, 38.403666 ], [ -82.549799, 38.403202 ], [ -82.560664, 38.404338 ], [ -82.569368, 38.406258 ], [ -82.577176, 38.408770 ], [ -82.579976, 38.410130 ], [ -82.588249, 38.415489 ], [ -82.593673, 38.421809 ], [ -82.596921, 38.426705 ], [ -82.600761, 38.437425 ], [ -82.604089, 38.459841 ], [ -82.608202, 38.468049 ], [ -82.610458, 38.471457 ], [ -82.613802, 38.474529 ], [ -82.618474, 38.477089 ], [ -82.624106, 38.479697 ], [ -82.637707, 38.484449 ], [ -82.648395, 38.490368 ], [ -82.657051, 38.496816 ], [ -82.665548, 38.505808 ], [ -82.675724, 38.515504 ], [ -82.689965, 38.535920 ], [ -82.696621, 38.542112 ], [ -82.700045, 38.544336 ], [ -82.714142, 38.550544 ], [ -82.719662, 38.553664 ], [ -82.724846, 38.557600 ], [ -82.730958, 38.559264 ], [ -82.739582, 38.558991 ], [ -82.763695, 38.560399 ], [ -82.779472, 38.559023 ], [ -82.789776, 38.559951 ], [ -82.800112, 38.563183 ], [ -82.820161, 38.572703 ], [ -82.839538, 38.586159 ], [ -82.844306, 38.590862 ], [ -82.847186, 38.595166 ], [ -82.851314, 38.604334 ], [ -82.854291, 38.613454 ], [ -82.855795, 38.620814 ], [ -82.856791, 38.632878 ], [ -82.856291, 38.646078 ], [ -82.859391, 38.660378 ], [ -82.863291, 38.669277 ], [ -82.869592, 38.678177 ], [ -82.874892, 38.682827 ], [ -82.877592, 38.690177 ], [ -82.876892, 38.697377 ], [ -82.875292, 38.704977 ], [ -82.871192, 38.718377 ], [ -82.870392, 38.722077 ], [ -82.869892, 38.728177 ], [ -82.871292, 38.739376 ], [ -82.872592, 38.742576 ], [ -82.875492, 38.747276 ], [ -82.879492, 38.751476 ], [ -82.889193, 38.756076 ], [ -82.894193, 38.756576 ], [ -82.923694, 38.750076 ], [ -82.943147, 38.743280 ], [ -82.958895, 38.734976 ], [ -82.968695, 38.728776 ], [ -82.979395, 38.725976 ], [ -82.986095, 38.726276 ], [ -82.993996, 38.728576 ], [ -82.999296, 38.729376 ], [ -83.011816, 38.730057 ], [ -83.021752, 38.728790 ], [ -83.027917, 38.727143 ], [ -83.030702, 38.725720 ], [ -83.033014, 38.723805 ], [ -83.035964, 38.720152 ], [ -83.038442, 38.716377 ], [ -83.042338, 38.708319 ], [ -83.053104, 38.695831 ], [ -83.064319, 38.688976 ], [ -83.084226, 38.681090 ], [ -83.102746, 38.677316 ], [ -83.107436, 38.675220 ], [ -83.112372, 38.671685 ], [ -83.117860, 38.666073 ], [ -83.122547, 38.659200 ], [ -83.126311, 38.645244 ], [ -83.128973, 38.640231 ], [ -83.135046, 38.631719 ], [ -83.138572, 38.628286 ], [ -83.142836, 38.625076 ], [ -83.156926, 38.620547 ], [ -83.164744, 38.620068 ], [ -83.172647, 38.620252 ], [ -83.191400, 38.617598 ], [ -83.202453, 38.616956 ], [ -83.211027, 38.618578 ], [ -83.223076, 38.624158 ], [ -83.232404, 38.627569 ], [ -83.239515, 38.628588 ], [ -83.245572, 38.627936 ], [ -83.251103, 38.626224 ], [ -83.254558, 38.623403 ], [ -83.261126, 38.622723 ], [ -83.264011, 38.621535 ], [ -83.267694, 38.618221 ], [ -83.268510, 38.615104 ], [ -83.286514, 38.599241 ], [ -83.288885, 38.597977 ], [ -83.294193, 38.596588 ], [ -83.301951, 38.598178 ], [ -83.307832, 38.600824 ], [ -83.311448, 38.603314 ], [ -83.317542, 38.609242 ], [ -83.319101, 38.612233 ], [ -83.320099, 38.616043 ], [ -83.320531, 38.622713 ], [ -83.322383, 38.630615 ], [ -83.327636, 38.637489 ], [ -83.340004, 38.645674 ], [ -83.356445, 38.654009 ], [ -83.366661, 38.658537 ], [ -83.376302, 38.661473 ], [ -83.384755, 38.663171 ], [ -83.412039, 38.666499 ], [ -83.420194, 38.668428 ], [ -83.440404, 38.669361 ], [ -83.446989, 38.670143 ], [ -83.457055, 38.673965 ], [ -83.459809, 38.673617 ], [ -83.468059, 38.675470 ], [ -83.472157, 38.678123 ], [ -83.476420, 38.682261 ], [ -83.486477, 38.690099 ], [ -83.493342, 38.694187 ], [ -83.504365, 38.699256 ], [ -83.512571, 38.701716 ], [ -83.520953, 38.703045 ], [ -83.533339, 38.702105 ], [ -83.549298, 38.698787 ], [ -83.561870, 38.695371 ], [ -83.569098, 38.692842 ], [ -83.575121, 38.691746 ], [ -83.574754, 38.692671 ], [ -83.615736, 38.684145 ], [ -83.626922, 38.679387 ], [ -83.634018, 38.673351 ], [ -83.636208, 38.670584 ], [ -83.637377, 38.667930 ], [ -83.639396, 38.659171 ], [ -83.639954, 38.652468 ], [ -83.642994, 38.643273 ], [ -83.645914, 38.637007 ], [ -83.649737, 38.632753 ], [ -83.652916, 38.630604 ], [ -83.655425, 38.629735 ], [ -83.659304, 38.628592 ], [ -83.663911, 38.627930 ], [ -83.668111, 38.628068 ], [ -83.679484, 38.630036 ], [ -83.685520, 38.631890 ], [ -83.704006, 38.639724 ], [ -83.708164, 38.639843 ], [ -83.713405, 38.641591 ], [ -83.716933, 38.643657 ], [ -83.717915, 38.645247 ], [ -83.720779, 38.646704 ], [ -83.738207, 38.647932 ], [ -83.749920, 38.649613 ], [ -83.762445, 38.652103 ], [ -83.765090, 38.652881 ], [ -83.769347, 38.655220 ], [ -83.772160, 38.658150 ], [ -83.775761, 38.666748 ], [ -83.777141, 38.671205 ], [ -83.779961, 38.684907 ], [ -83.783620, 38.695641 ], [ -83.787113, 38.699489 ], [ -83.790676, 38.701676 ], [ -83.798549, 38.704668 ], [ -83.806317, 38.706613 ], [ -83.813880, 38.707446 ], [ -83.821854, 38.709575 ], [ -83.834015, 38.716008 ], [ -83.836696, 38.717857 ], [ -83.840595, 38.721912 ], [ -83.841689, 38.724264 ], [ -83.842506, 38.727019 ], [ -83.842740, 38.730365 ], [ -83.844676, 38.737439 ], [ -83.846207, 38.742290 ], [ -83.848734, 38.747178 ], [ -83.852085, 38.751433 ], [ -83.859028, 38.756793 ], [ -83.866530, 38.760200 ], [ -83.873168, 38.762418 ], [ -83.887107, 38.765600 ], [ -83.903971, 38.768160 ], [ -83.912922, 38.769763 ], [ -83.917217, 38.769665 ], [ -83.926986, 38.771562 ], [ -83.928591, 38.772203 ], [ -83.928454, 38.774583 ], [ -83.943978, 38.783616 ], [ -83.953546, 38.786172 ], [ -83.962123, 38.787384 ], [ -83.978814, 38.787104 ], [ -83.995447, 38.781912 ], [ -84.006104, 38.780156 ], [ -84.023113, 38.775061 ], [ -84.044486, 38.770572 ], [ -84.051642, 38.771397 ], [ -84.063410, 38.771151 ], [ -84.071491, 38.770475 ], [ -84.094334, 38.775246 ], [ -84.108836, 38.779247 ], [ -84.115655, 38.782721 ], [ -84.135088, 38.789485 ], [ -84.155912, 38.794909 ], [ -84.198358, 38.800920 ], [ -84.205592, 38.802588 ], [ -84.212904, 38.805707 ], [ -84.222059, 38.813753 ], [ -84.225300, 38.817665 ], [ -84.230181, 38.826547 ], [ -84.231306, 38.830552 ], [ -84.233265, 38.842671 ], [ -84.233727, 38.853576 ], [ -84.231837, 38.872870 ], [ -84.232132, 38.880483 ], [ -84.232343, 38.884325 ], [ -84.234453, 38.893226 ], [ -84.240155, 38.900912 ], [ -84.242689, 38.903187 ], [ -84.245647, 38.907035 ], [ -84.257010, 38.923208 ], [ -84.260797, 38.926593 ], [ -84.274910, 38.941511 ], [ -84.279916, 38.945168 ], [ -84.288164, 38.955789 ], [ -84.295076, 38.968295 ], [ -84.296466, 38.985306 ], [ -84.297255, 38.989694 ], [ -84.299362, 38.995985 ], [ -84.304698, 39.006455 ], [ -84.313680, 39.016981 ], [ -84.326539, 39.027463 ], [ -84.336339, 39.032863 ], [ -84.346039, 39.036963 ], [ -84.360439, 39.041362 ], [ -84.386840, 39.045162 ], [ -84.394140, 39.045262 ], [ -84.400940, 39.046362 ], [ -84.402540, 39.045662 ], [ -84.406941, 39.045662 ], [ -84.421467, 39.050938 ], [ -84.425730, 39.053059 ], [ -84.427913, 39.054962 ], [ -84.429841, 39.058262 ], [ -84.432341, 39.067561 ], [ -84.433141, 39.072961 ], [ -84.432641, 39.078261 ], [ -84.432941, 39.083961 ], [ -84.434641, 39.086861 ], [ -84.433941, 39.092461 ], [ -84.432841, 39.094261 ], [ -84.435541, 39.102261 ], [ -84.440642, 39.109661 ], [ -84.445242, 39.114461 ], [ -84.449793, 39.117754 ], [ -84.455342, 39.120360 ], [ -84.462042, 39.121760 ], [ -84.470542, 39.121460 ], [ -84.476243, 39.119160 ], [ -84.480943, 39.116760 ], [ -84.487743, 39.110760 ], [ -84.493743, 39.102460 ], [ -84.496543, 39.100260 ], [ -84.502062, 39.096641 ], [ -84.509743, 39.093660 ], [ -84.519543, 39.092060 ], [ -84.524644, 39.092160 ], [ -84.541344, 39.099160 ], [ -84.543544, 39.099660 ], [ -84.550844, 39.099360 ], [ -84.554444, 39.097660 ], [ -84.557544, 39.094860 ], [ -84.563944, 39.087360 ], [ -84.572144, 39.082060 ], [ -84.592408, 39.078088 ], [ -84.601682, 39.074115 ], [ -84.607928, 39.073238 ], [ -84.620112, 39.073457 ], [ -84.632446, 39.076760 ], [ -84.650346, 39.091660 ], [ -84.657246, 39.095460 ], [ -84.666147, 39.097960 ], [ -84.677247, 39.098260 ], [ -84.684847, 39.100459 ], [ -84.689747, 39.104159 ], [ -84.701947, 39.118959 ], [ -84.714048, 39.132659 ], [ -84.718548, 39.137059 ], [ -84.726148, 39.141958 ], [ -84.732048, 39.144458 ], [ -84.744149, 39.147458 ], [ -84.750749, 39.147358 ], [ -84.754449, 39.146658 ], [ -84.766749, 39.138558 ], [ -84.783991, 39.118060 ], [ -84.787680, 39.115297 ], [ -84.793820, 39.112939 ], [ -84.810753, 39.109142 ], [ -84.812241, 39.107102 ], [ -84.813767, 39.106492 ], [ -84.820157, 39.105480 ], [ -84.819985, 39.149081 ], [ -84.819802, 39.157613 ], [ -84.820159, 39.227225 ], [ -84.819813, 39.244334 ], [ -84.819801, 39.247806 ], [ -84.819859, 39.251018 ], [ -84.819633, 39.261855 ], [ -84.819622, 39.271590 ], [ -84.819451, 39.305152 ], [ -84.819352, 39.309454 ], [ -84.817453, 39.391753 ], [ -84.815754, 39.477352 ], [ -84.815555, 39.510952 ], [ -84.815555, 39.511052 ], [ -84.815355, 39.521951 ], [ -84.815155, 39.548051 ], [ -84.814955, 39.566251 ], [ -84.814955, 39.567251 ], [ -84.815156, 39.568351 ], [ -84.814705, 39.628854 ], [ -84.814323, 39.655814 ], [ -84.814619, 39.669174 ], [ -84.814530, 39.680429 ], [ -84.814129, 39.726556 ], [ -84.814189, 39.785569 ], [ -84.814179, 39.786853 ], [ -84.814209, 39.799755 ], [ -84.814120, 39.811398 ], [ -84.814179, 39.814212 ], [ -84.813852, 39.824621 ], [ -84.813793, 39.826771 ], [ -84.813703, 39.843059 ], [ -84.813674, 39.843173 ], [ -84.813549, 39.850773 ], [ -84.813464, 39.853261 ], [ -84.813050, 39.872958 ], [ -84.812787, 39.890830 ], [ -84.812698, 39.891585 ], [ -84.812411, 39.916916 ], [ -84.812357, 39.921764 ], [ -84.812193, 39.927340 ], [ -84.811212, 39.995331 ], [ -84.810099, 40.034214 ], [ -84.809737, 40.048929 ], [ -84.808706, 40.107216 ], [ -84.808305, 40.127018 ], [ -84.808291, 40.129027 ], [ -84.806766, 40.180128 ], [ -84.806347, 40.192252 ], [ -84.806340, 40.192327 ], [ -84.806175, 40.197995 ], [ -84.805627, 40.223659 ], [ -84.804098, 40.302498 ], [ -84.803917, 40.310115 ], [ -84.804119, 40.352844 ], [ -84.804504, 40.411555 ], [ -84.803928, 40.462564 ], [ -84.802547, 40.501810 ], [ -84.802483, 40.528046 ], [ -84.802265, 40.572215 ], [ -84.802135, 40.644859 ], [ -84.802193, 40.660298 ], [ -84.802220, 40.674776 ], [ -84.802157, 40.689324 ], [ -84.802127, 40.691405 ], [ -84.802094, 40.702476 ], [ -84.802181, 40.718602 ], [ -84.802119, 40.728163 ], [ -84.802266, 40.742298 ], [ -84.802538, 40.765515 ], [ -84.802170, 40.800601 ], [ -84.802935, 40.922377 ], [ -84.803313, 40.989209 ], [ -84.803374, 41.089302 ], [ -84.803234, 41.121414 ], [ -84.803780, 41.140520 ], [ -84.803413, 41.164649 ], [ -84.803594, 41.173203 ], [ -84.803472, 41.173889 ], [ -84.803492, 41.252531 ], [ -84.803580, 41.270942 ], [ -84.803581, 41.271079 ], [ -84.803926, 41.367959 ], [ -84.804133, 41.408292 ], [ -84.804046, 41.408361 ], [ -84.804015, 41.411655 ], [ -84.803956, 41.426128 ], [ -84.803919, 41.435531 ], [ -84.804457, 41.488224 ], [ -84.804551, 41.500364 ], [ -84.804729, 41.530092 ], [ -84.804729, 41.530231 ], [ -84.805812, 41.613040 ], [ -84.805696, 41.631398 ], [ -84.805673, 41.632342 ], [ -84.806210, 41.674550 ], [ -84.806082, 41.696089 ], [ -84.749955, 41.698245 ], [ -84.438067, 41.704903 ], [ -84.396547, 41.705935 ], [ -84.360546, 41.706621 ], [ -84.134417, 41.712931 ], [ -84.019373, 41.716668 ], [ -83.998849, 41.716822 ], [ -83.899764, 41.719961 ], [ -83.880539, 41.720081 ], [ -83.859541, 41.721250 ], [ -83.763038, 41.723550 ], [ -83.708937, 41.725150 ], [ -83.685337, 41.726449 ], [ -83.665937, 41.726949 ], [ -83.639636, 41.727749 ], [ -83.636636, 41.727849 ], [ -83.595235, 41.729148 ], [ -83.593835, 41.729148 ], [ -83.585235, 41.729348 ], [ -83.504334, 41.731547 ], [ -83.503433, 41.731547 ], [ -83.499733, 41.731647 ], [ -83.497733, 41.731847 ], [ -83.453832, 41.732647 ], [ -83.455626, 41.727445 ], [ -83.449001, 41.710719 ], [ -83.446032, 41.706847 ], [ -83.409531, 41.691247 ], [ -83.392630, 41.691947 ], [ -83.375730, 41.686647 ], [ -83.357073, 41.687763 ], [ -83.341817, 41.693518 ], [ -83.337985, 41.698682 ], [ -83.337977, 41.703410 ], [ -83.326825, 41.701562 ], [ -83.293928, 41.680846 ], [ -83.290680, 41.676794 ], [ -83.278455, 41.672078 ], [ -83.238191, 41.651167 ], [ -83.231660, 41.644218 ], [ -83.194524, 41.631008 ], [ -83.145887, 41.617904 ], [ -83.103928, 41.613558 ], [ -83.086036, 41.606680 ], [ -83.066593, 41.595340 ], [ -83.043079, 41.567963 ], [ -83.028072, 41.555656 ], [ -82.999916, 41.538534 ], [ -82.969642, 41.524229 ], [ -82.934369, 41.514353 ], [ -82.897728, 41.519241 ], [ -82.888200, 41.522508 ], [ -82.875229, 41.529684 ], [ -82.869422, 41.533962 ], [ -82.856770, 41.548262 ], [ -82.855197, 41.564114 ], [ -82.859531, 41.576371 ], [ -82.852957, 41.583327 ], [ -82.847657, 41.585639 ], [ -82.834101, 41.587587 ], [ -82.820207, 41.570664 ], [ -82.794324, 41.546486 ], [ -82.785496, 41.540675 ], [ -82.772010, 41.540580 ], [ -82.749907, 41.546470 ], [ -82.717878, 41.541930 ], [ -82.710935, 41.536648 ], [ -82.711632, 41.527201 ], [ -82.721914, 41.516677 ], [ -82.719811, 41.510296 ], [ -82.713904, 41.501697 ], [ -82.710013, 41.497590 ], [ -82.687921, 41.492324 ], [ -82.658302, 41.461878 ], [ -82.617745, 41.431833 ], [ -82.616952, 41.428425 ], [ -82.558080, 41.400005 ], [ -82.513827, 41.384257 ], [ -82.499099, 41.381541 ], [ -82.481214, 41.381342 ], [ -82.460599, 41.386316 ], [ -82.431315, 41.396866 ], [ -82.398086, 41.413945 ], [ -82.361784, 41.426644 ], [ -82.334182, 41.430243 ], [ -82.291580, 41.428442 ], [ -82.268479, 41.430842 ], [ -82.254678, 41.434441 ], [ -82.193375, 41.464540 ], [ -82.188850, 41.468097 ], [ -82.186174, 41.473440 ], [ -82.184774, 41.474040 ], [ -82.181598, 41.471634 ], [ -82.165373, 41.474440 ], [ -82.094169, 41.495039 ], [ -82.011966, 41.515639 ], [ -81.994565, 41.514440 ], [ -81.964912, 41.505446 ], [ -81.962664, 41.501341 ], [ -81.958463, 41.498642 ], [ -81.937862, 41.491443 ], [ -81.877360, 41.483445 ], [ -81.860262, 41.483841 ], [ -81.810758, 41.495648 ], [ -81.794157, 41.496648 ], [ -81.782258, 41.496050 ], [ -81.768856, 41.491649 ], [ -81.744755, 41.487150 ], [ -81.738755, 41.488550 ], [ -81.710953, 41.501750 ], [ -81.706864, 41.505872 ], [ -81.664851, 41.531450 ], [ -81.633652, 41.540458 ], [ -81.599747, 41.560649 ], [ -81.562844, 41.587549 ], [ -81.529742, 41.614548 ], [ -81.500440, 41.623448 ], [ -81.488640, 41.631348 ], [ -81.466038, 41.649148 ], [ -81.442645, 41.673255 ], [ -81.388632, 41.707144 ], [ -81.353229, 41.727743 ], [ -81.301626, 41.750543 ], [ -81.286925, 41.760243 ], [ -81.279925, 41.759944 ], [ -81.264224, 41.758143 ], [ -81.248672, 41.761291 ], [ -81.184368, 41.786671 ], [ -81.112885, 41.817571 ], [ -81.092716, 41.822988 ], [ -81.051920, 41.839557 ], [ -81.024525, 41.846469 ], [ -81.010490, 41.853962 ], [ -80.936244, 41.862352 ], [ -80.900342, 41.868912 ], [ -80.814943, 41.897694 ], [ -80.808697, 41.901606 ], [ -80.800794, 41.909635 ], [ -80.784682, 41.911525 ], [ -80.782052, 41.906635 ], [ -80.757945, 41.913352 ], [ -80.720816, 41.919744 ], [ -80.581882, 41.957610 ], [ -80.553836, 41.967815 ], [ -80.519425, 41.977523 ], [ -80.519405, 41.976158 ], [ -80.519304, 41.943992 ], [ -80.519345, 41.929168 ], [ -80.519239, 41.765138 ], [ -80.519369, 41.752487 ], [ -80.519408, 41.739359 ], [ -80.519373, 41.701473 ], [ -80.519424, 41.671228 ], [ -80.519357, 41.669767 ], [ -80.519339, 41.539297 ], [ -80.519157, 41.528769 ], [ -80.519225, 41.499924 ], [ -80.519169, 41.462581 ], [ -80.518993, 41.435454 ], [ -80.518993, 41.416437 ], [ -80.519025, 41.416438 ], [ -80.519249, 41.378918 ], [ -80.519217, 41.372006 ], [ -80.519249, 41.361030 ], [ -80.519345, 41.340740 ], [ -80.519345, 41.340145 ], [ -80.519293, 41.339654 ], [ -80.519293, 41.339054 ], [ -80.519311, 41.339052 ], [ -80.519281, 41.337174 ], [ -80.519281, 41.337145 ], [ -80.519281, 41.335958 ], [ -80.519265, 41.333495 ], [ -80.519129, 41.312408 ], [ -80.518794, 41.305509 ], [ -80.518996, 41.268300 ], [ -80.518993, 41.268155 ], [ -80.518893, 41.265155 ], [ -80.518693, 41.248855 ], [ -80.518893, 41.232556 ], [ -80.518893, 41.219356 ], [ -80.518830, 41.209213 ], [ -80.519144, 41.171203 ], [ -80.519115, 41.145520 ], [ -80.519167, 41.133343 ], [ -80.519012, 41.125116 ], [ -80.519012, 41.125057 ], [ -80.519056, 41.125057 ], [ -80.518992, 41.115958 ], [ -80.519192, 41.105358 ], [ -80.519125, 41.100819 ], [ -80.519092, 41.090658 ], [ -80.519088, 41.082074 ], [ -80.518999, 41.075014 ], [ -80.518960, 41.071866 ], [ -80.518928, 41.070954 ], [ -80.518960, 41.061546 ], [ -80.518927, 41.015387 ], [ -80.518989, 40.995445 ], [ -80.519091, 40.921061 ], [ -80.519891, 40.906661 ], [ -80.519790, 40.900761 ], [ -80.519764, 40.899858 ], [ -80.519002, 40.877543 ], [ -80.519020, 40.850073 ], [ -80.519081, 40.849157 ], [ -80.518992, 40.801221 ], [ -80.519058, 40.792298 ], [ -80.518991, 40.638801 ], [ -80.521917, 40.636992 ], [ -80.525660, 40.636068 ], [ -80.530093, 40.636255 ], [ -80.532737, 40.635590 ], [ -80.539541, 40.632122 ], [ -80.545892, 40.629702 ], [ -80.551126, 40.628847 ], [ -80.560720, 40.623680 ], [ -80.567840, 40.617552 ], [ -80.571936, 40.615456 ], [ -80.576736, 40.614224 ], [ -80.579856, 40.614304 ], [ -80.583633, 40.615520 ], [ -80.592049, 40.622496 ], [ -80.594065, 40.623664 ], [ -80.598764, 40.625263 ], [ -80.603876, 40.625064 ], [ -80.616002, 40.621696 ], [ -80.627171, 40.619936 ], [ -80.634355, 40.616095 ], [ -80.639379, 40.611280 ], [ -80.644963, 40.603648 ], [ -80.651716, 40.597744 ], [ -80.653972, 40.596480 ], [ -80.655188, 40.596544 ], [ -80.662564, 40.591600 ], [ -80.665892, 40.587728 ], [ -80.667957, 40.582496 ], [ -80.667781, 40.578096 ], [ -80.666917, 40.573664 ], [ -80.662708, 40.570176 ], [ -80.655316, 40.565184 ], [ -80.652436, 40.562544 ], [ -80.641380, 40.548417 ], [ -80.633107, 40.538705 ], [ -80.630483, 40.537921 ], [ -80.627507, 40.535793 ], [ -80.622195, 40.520497 ], [ -80.620883, 40.512257 ], [ -80.618003, 40.502049 ], [ -80.609058, 40.489506 ], [ -80.602450, 40.484226 ], [ -80.599194, 40.482566 ], [ -80.595494, 40.475266 ], [ -80.594794, 40.471366 ], [ -80.596094, 40.463366 ], [ -80.598294, 40.458366 ], [ -80.604395, 40.449767 ], [ -80.604895, 40.446667 ], [ -80.611195, 40.437767 ], [ -80.612295, 40.434867 ], [ -80.612995, 40.429367 ], [ -80.612295, 40.418567 ], [ -80.612695, 40.407667 ], [ -80.611795, 40.403867 ], [ -80.612195, 40.402667 ], [ -80.615195, 40.399867 ], [ -80.628096, 40.395867 ], [ -80.632196, 40.393667 ], [ -80.633596, 40.390467 ], [ -80.631596, 40.385468 ], [ -80.630740, 40.384900 ], [ -80.619196, 40.381768 ], [ -80.614396, 40.378768 ], [ -80.609695, 40.374968 ], [ -80.607595, 40.369568 ], [ -80.608695, 40.361968 ], [ -80.611796, 40.355168 ], [ -80.612796, 40.347668 ], [ -80.610796, 40.340868 ], [ -80.602895, 40.327869 ], [ -80.600495, 40.321169 ], [ -80.599895, 40.317669 ], [ -80.602895, 40.307069 ], [ -80.606596, 40.303869 ], [ -80.614896, 40.291969 ], [ -80.616796, 40.285269 ], [ -80.616196, 40.272270 ], [ -80.619297, 40.265170 ], [ -80.622497, 40.261770 ], [ -80.637098, 40.254270 ], [ -80.637198, 40.255070 ], [ -80.644598, 40.251270 ], [ -80.652098, 40.244970 ], [ -80.661543, 40.229798 ], [ -80.664299, 40.219170 ], [ -80.666299, 40.206271 ], [ -80.668100, 40.199671 ], [ -80.672600, 40.192371 ], [ -80.679600, 40.186371 ], [ -80.682008, 40.185495 ], [ -80.683705, 40.184215 ], [ -80.686137, 40.181607 ], [ -80.704602, 40.154823 ], [ -80.705994, 40.151591 ], [ -80.707322, 40.144999 ], [ -80.710042, 40.138311 ], [ -80.710554, 40.125271 ], [ -80.708810, 40.118088 ], [ -80.708106, 40.117256 ], [ -80.707002, 40.113272 ], [ -80.706702, 40.110872 ], [ -80.707702, 40.105372 ], [ -80.709102, 40.101472 ], [ -80.710203, 40.099572 ], [ -80.713003, 40.096872 ], [ -80.730704, 40.086472 ], [ -80.736804, 40.080072 ], [ -80.738604, 40.075672 ], [ -80.738504, 40.071472 ], [ -80.737104, 40.064972 ], [ -80.734304, 40.059672 ], [ -80.733104, 40.058772 ], [ -80.730904, 40.049172 ], [ -80.730904, 40.046672 ], [ -80.731504, 40.037472 ], [ -80.733304, 40.033272 ], [ -80.736300, 40.029929 ], [ -80.737389, 40.027593 ], [ -80.737341, 40.022969 ], [ -80.737805, 40.020761 ], [ -80.740509, 40.015225 ], [ -80.741901, 40.007929 ], [ -80.742045, 40.005641 ], [ -80.741085, 39.996857 ], [ -80.740045, 39.993929 ], [ -80.738717, 39.985113 ], [ -80.740126, 39.970793 ], [ -80.743166, 39.969113 ], [ -80.746270, 39.966233 ], [ -80.755135, 39.961561 ], [ -80.758527, 39.959241 ], [ -80.763375, 39.953514 ], [ -80.764479, 39.950250 ], [ -80.764511, 39.946602 ], [ -80.761312, 39.929098 ], [ -80.756784, 39.920586 ], [ -80.755936, 39.916554 ], [ -80.756432, 39.913930 ], [ -80.758304, 39.910426 ], [ -80.759296, 39.909466 ], [ -80.760656, 39.908906 ], [ -80.762592, 39.908906 ], [ -80.768272, 39.909642 ], [ -80.772641, 39.911306 ], [ -80.782849, 39.917162 ], [ -80.795714, 39.919690 ], [ -80.800530, 39.919434 ], [ -80.803394, 39.918762 ], [ -80.806018, 39.917130 ], [ -80.807618, 39.914938 ], [ -80.809283, 39.910314 ], [ -80.809683, 39.906106 ], [ -80.809011, 39.903226 ], [ -80.806179, 39.897306 ], [ -80.802339, 39.891610 ], [ -80.796162, 39.885530 ], [ -80.793989, 39.882787 ], [ -80.790156, 39.872252 ], [ -80.790761, 39.867280 ], [ -80.793131, 39.863751 ], [ -80.799898, 39.858912 ], [ -80.816430, 39.853032 ], [ -80.821279, 39.849982 ], [ -80.824276, 39.847159 ], [ -80.826124, 39.844238 ], [ -80.826964, 39.841656 ], [ -80.826228, 39.835802 ], [ -80.823030, 39.827484 ], [ -80.822480, 39.824971 ], [ -80.822181, 39.811708 ], [ -80.824969, 39.801092 ], [ -80.826079, 39.798584 ], [ -80.835311, 39.790690 ], [ -80.863048, 39.775197 ], [ -80.866329, 39.771738 ], [ -80.869092, 39.766364 ], [ -80.869933, 39.763555 ], [ -80.867596, 39.757116 ], [ -80.865339, 39.753251 ], [ -80.854717, 39.742592 ], [ -80.852738, 39.741040 ], [ -80.846091, 39.737812 ], [ -80.836597, 39.723925 ], [ -80.834563, 39.721582 ], [ -80.831551, 39.719475 ], [ -80.829723, 39.714041 ], [ -80.829764, 39.711839 ], [ -80.831871, 39.705655 ], [ -80.833882, 39.703497 ], [ -80.839112, 39.701033 ], [ -80.844721, 39.699440 ], [ -80.852000, 39.698560 ], [ -80.854599, 39.697473 ], [ -80.861718, 39.693625 ], [ -80.863698, 39.691724 ], [ -80.865805, 39.686484 ], [ -80.866330, 39.683167 ], [ -80.866670, 39.678487 ], [ -80.865575, 39.662751 ], [ -80.866647, 39.652616 ], [ -80.869802, 39.646896 ], [ -80.870771, 39.642885 ], [ -80.870473, 39.641764 ], [ -80.871020, 39.638963 ], [ -80.876002, 39.627084 ], [ -80.880360, 39.620706 ], [ -80.892208, 39.616756 ], [ -80.896514, 39.616757 ], [ -80.906247, 39.618431 ], [ -80.917620, 39.618703 ], [ -80.925841, 39.617396 ], [ -80.933292, 39.614812 ], [ -80.936906, 39.612616 ], [ -80.943782, 39.606926 ], [ -80.970436, 39.590127 ], [ -80.978664, 39.583517 ], [ -80.987732, 39.577262 ], [ -80.993695, 39.571253 ], [ -80.996804, 39.569120 ], [ -81.008660, 39.562798 ], [ -81.020055, 39.555410 ], [ -81.023900, 39.552313 ], [ -81.026662, 39.548547 ], [ -81.030169, 39.545211 ], [ -81.044902, 39.536300 ], [ -81.049955, 39.531893 ], [ -81.051982, 39.529310 ], [ -81.060379, 39.522744 ], [ -81.070594, 39.515991 ], [ -81.075950, 39.509660 ], [ -81.091433, 39.496975 ], [ -81.100833, 39.487175 ], [ -81.114433, 39.466275 ], [ -81.115133, 39.466275 ], [ -81.124733, 39.453375 ], [ -81.128533, 39.449375 ], [ -81.132534, 39.446275 ], [ -81.134434, 39.445075 ], [ -81.138134, 39.443775 ], [ -81.152534, 39.443175 ], [ -81.163520, 39.441186 ], [ -81.170634, 39.439175 ], [ -81.179934, 39.435121 ], [ -81.182307, 39.433533 ], [ -81.185946, 39.430731 ], [ -81.190714, 39.423562 ], [ -81.200412, 39.415303 ], [ -81.205223, 39.410786 ], [ -81.208231, 39.407147 ], [ -81.210833, 39.403563 ], [ -81.211433, 39.402031 ], [ -81.210870, 39.397112 ], [ -81.211654, 39.392977 ], [ -81.213064, 39.390656 ], [ -81.217315, 39.387590 ], [ -81.221372, 39.386172 ], [ -81.223581, 39.386062 ], [ -81.241840, 39.390276 ], [ -81.249088, 39.389992 ], [ -81.259788, 39.386698 ], [ -81.270716, 39.385914 ], [ -81.275677, 39.383786 ], [ -81.281405, 39.379258 ], [ -81.297517, 39.374378 ], [ -81.304798, 39.370538 ], [ -81.319598, 39.361290 ], [ -81.326174, 39.358186 ], [ -81.335599, 39.352794 ], [ -81.342623, 39.348042 ], [ -81.347567, 39.345770 ], [ -81.356911, 39.343178 ], [ -81.375961, 39.341697 ], [ -81.379674, 39.342081 ], [ -81.384556, 39.343449 ], [ -81.391249, 39.348814 ], [ -81.393794, 39.351706 ], [ -81.395883, 39.355553 ], [ -81.400744, 39.369221 ], [ -81.402770, 39.376914 ], [ -81.406689, 39.388090 ], [ -81.412706, 39.394618 ], [ -81.420578, 39.400378 ], [ -81.428642, 39.405374 ], [ -81.435642, 39.408474 ], [ -81.446543, 39.410374 ], [ -81.456143, 39.409274 ], [ -81.467744, 39.403774 ], [ -81.473188, 39.400170 ], [ -81.482900, 39.389674 ], [ -81.489044, 39.384074 ], [ -81.503189, 39.373242 ], [ -81.513493, 39.367050 ], [ -81.524309, 39.361610 ], [ -81.534470, 39.358234 ], [ -81.542346, 39.352874 ], [ -81.557547, 39.338774 ], [ -81.559647, 39.330774 ], [ -81.560147, 39.317874 ], [ -81.565047, 39.293874 ], [ -81.565247, 39.276175 ], [ -81.567347, 39.270675 ], [ -81.570247, 39.267675 ], [ -81.585559, 39.268747 ], [ -81.588583, 39.269787 ], [ -81.595160, 39.273387 ], [ -81.603352, 39.275531 ], [ -81.608408, 39.276043 ], [ -81.613896, 39.275339 ], [ -81.621305, 39.273643 ], [ -81.643178, 39.277195 ], [ -81.656138, 39.277355 ], [ -81.670187, 39.275963 ], [ -81.678331, 39.273755 ], [ -81.683627, 39.270939 ], [ -81.689483, 39.266043 ], [ -81.692060, 39.263227 ], [ -81.696380, 39.257035 ], [ -81.696988, 39.248747 ], [ -81.696636, 39.246123 ], [ -81.695724, 39.242859 ], [ -81.692203, 39.236091 ], [ -81.691067, 39.230139 ], [ -81.691339, 39.227947 ], [ -81.692395, 39.226443 ], [ -81.694603, 39.224107 ], [ -81.700908, 39.220844 ], [ -81.711628, 39.219228 ], [ -81.724365, 39.216508 ], [ -81.726973, 39.215068 ], [ -81.729949, 39.211884 ], [ -81.733357, 39.205868 ], [ -81.735805, 39.196268 ], [ -81.737085, 39.193836 ], [ -81.741533, 39.189596 ], [ -81.749853, 39.186489 ], [ -81.752754, 39.184676 ], [ -81.755754, 39.180976 ], [ -81.756254, 39.177276 ], [ -81.754254, 39.171476 ], [ -81.744621, 39.148413 ], [ -81.743565, 39.141933 ], [ -81.744525, 39.138829 ], [ -81.744838, 39.130898 ], [ -81.744568, 39.126816 ], [ -81.742153, 39.116777 ], [ -81.742953, 39.106578 ], [ -81.743853, 39.102378 ], [ -81.745453, 39.098078 ], [ -81.747253, 39.095378 ], [ -81.752353, 39.089878 ], [ -81.760753, 39.084078 ], [ -81.764854, 39.081978 ], [ -81.775554, 39.078378 ], [ -81.781454, 39.078078 ], [ -81.785554, 39.078578 ], [ -81.790754, 39.079778 ], [ -81.798155, 39.082878 ], [ -81.803055, 39.083878 ], [ -81.807855, 39.083978 ], [ -81.810655, 39.083278 ], [ -81.812355, 39.082078 ], [ -81.813855, 39.079278 ], [ -81.814155, 39.073478 ], [ -81.813355, 39.065878 ], [ -81.811655, 39.059578 ], [ -81.808955, 39.055178 ], [ -81.803355, 39.047678 ], [ -81.800355, 39.044978 ], [ -81.793304, 39.040353 ], [ -81.786554, 39.036579 ], [ -81.772854, 39.026179 ], [ -81.767253, 39.019979 ], [ -81.764253, 39.015279 ], [ -81.764253, 39.006579 ], [ -81.765153, 39.002579 ], [ -81.767188, 39.000115 ], [ -81.771975, 38.996845 ], [ -81.774062, 38.993682 ], [ -81.775551, 38.990107 ], [ -81.776723, 38.985142 ], [ -81.776466, 38.982048 ], [ -81.775734, 38.980737 ], [ -81.779883, 38.972773 ], [ -81.781820, 38.964935 ], [ -81.780736, 38.958975 ], [ -81.778845, 38.955892 ], [ -81.773960, 38.951645 ], [ -81.769703, 38.948707 ], [ -81.756975, 38.937152 ], [ -81.756131, 38.933545 ], [ -81.758506, 38.927942 ], [ -81.759995, 38.925828 ], [ -81.762659, 38.924121 ], [ -81.766227, 38.922946 ], [ -81.769760, 38.922730 ], [ -81.774106, 38.922965 ], [ -81.781248, 38.924804 ], [ -81.785647, 38.926193 ], [ -81.793372, 38.930204 ], [ -81.796376, 38.932498 ], [ -81.806137, 38.942112 ], [ -81.814235, 38.946168 ], [ -81.819692, 38.947016 ], [ -81.825026, 38.946603 ], [ -81.827354, 38.945898 ], [ -81.831516, 38.943697 ], [ -81.838067, 38.937135 ], [ -81.844486, 38.928746 ], [ -81.846070, 38.913192 ], [ -81.845312, 38.910088 ], [ -81.848653, 38.901407 ], [ -81.855971, 38.892734 ], [ -81.858921, 38.890190 ], [ -81.874857, 38.881174 ], [ -81.889233, 38.874279 ], [ -81.892837, 38.873869 ], [ -81.898541, 38.874582 ], [ -81.908645, 38.878460 ], [ -81.910312, 38.879294 ], [ -81.915898, 38.884270 ], [ -81.926967, 38.891602 ], [ -81.928000, 38.893492 ], [ -81.928352, 38.895371 ], [ -81.926671, 38.901311 ], [ -81.919098, 38.908615 ], [ -81.917757, 38.910604 ], [ -81.911936, 38.915564 ], [ -81.908341, 38.917403 ], [ -81.900910, 38.924338 ], [ -81.899953, 38.925405 ], [ -81.898470, 38.929603 ], [ -81.900595, 38.937671 ], [ -81.906600, 38.945262 ], [ -81.912443, 38.954343 ], [ -81.918214, 38.966595 ], [ -81.926561, 38.977508 ], [ -81.933186, 38.987659 ], [ -81.936828, 38.990414 ], [ -81.941829, 38.993295 ], [ -81.951447, 38.996032 ], [ -81.959260, 38.995227 ], [ -81.960832, 38.994275 ], [ -81.967769, 38.992955 ], [ -81.973871, 38.992413 ], [ -81.977455, 38.992679 ], [ -81.979371, 38.993193 ], [ -81.981158, 38.994351 ], [ -81.982032, 38.995697 ], [ -81.982761, 39.001978 ], [ -81.983761, 39.005478 ], [ -81.987061, 39.011978 ], [ -81.991361, 39.018378 ], [ -81.994961, 39.022478 ], [ -82.002261, 39.027878 ], [ -82.007062, 39.029578 ], [ -82.017562, 39.030078 ], [ -82.027262, 39.028378 ], [ -82.035963, 39.025478 ], [ -82.038763, 39.022678 ], [ -82.041563, 39.017878 ], [ -82.045663, 39.003778 ], [ -82.049163, 38.997278 ], [ -82.051563, 38.994378 ], [ -82.058764, 38.990078 ], [ -82.068864, 38.984878 ], [ -82.079364, 38.981078 ], [ -82.089065, 38.975978 ], [ -82.091565, 38.973778 ], [ -82.093165, 38.970980 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US42", "STATE": "42", "NAME": "Pennsylvania", "LSAD": "", "CENSUSAREA": 44742.703000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.415041, 39.801786 ], [ -75.428038, 39.809212 ], [ -75.453740, 39.820312 ], [ -75.463341, 39.823812 ], [ -75.481242, 39.829112 ], [ -75.498843, 39.833312 ], [ -75.518444, 39.836311 ], [ -75.539346, 39.838211 ], [ -75.570464, 39.839007 ], [ -75.579849, 39.838526 ], [ -75.593666, 39.837455 ], [ -75.595756, 39.837156 ], [ -75.617251, 39.833999 ], [ -75.634706, 39.830164 ], [ -75.641518, 39.828363 ], [ -75.662822, 39.821150 ], [ -75.685991, 39.811054 ], [ -75.701208, 39.802606 ], [ -75.716969, 39.791998 ], [ -75.727049, 39.784126 ], [ -75.736489, 39.775759 ], [ -75.744394, 39.767855 ], [ -75.753066, 39.757631 ], [ -75.760346, 39.747231 ], [ -75.766058, 39.737811 ], [ -75.773558, 39.722411 ], [ -75.788359, 39.721811 ], [ -75.799563, 39.721882 ], [ -75.810068, 39.721906 ], [ -75.998649, 39.721576 ], [ -76.013067, 39.721920 ], [ -76.027618, 39.721833 ], [ -76.233277, 39.721305 ], [ -76.380083, 39.721304 ], [ -76.380583, 39.721304 ], [ -76.395583, 39.721204 ], [ -76.418684, 39.721304 ], [ -76.418784, 39.721204 ], [ -76.491887, 39.721304 ], [ -76.517087, 39.721304 ], [ -76.569389, 39.721203 ], [ -76.711894, 39.721103 ], [ -76.715594, 39.721103 ], [ -76.787097, 39.720802 ], [ -76.806397, 39.720602 ], [ -76.809197, 39.720702 ], [ -76.890100, 39.720401 ], [ -76.897566, 39.720401 ], [ -76.936601, 39.720701 ], [ -76.990903, 39.719800 ], [ -77.047104, 39.720000 ], [ -77.058204, 39.720200 ], [ -77.058904, 39.720100 ], [ -77.216806, 39.719998 ], [ -77.239807, 39.719998 ], [ -77.243307, 39.719998 ], [ -77.469145, 39.720018 ], [ -77.533371, 39.720165 ], [ -77.534758, 39.720134 ], [ -77.672249, 39.720778 ], [ -77.674522, 39.720847 ], [ -77.724115, 39.720894 ], [ -77.732615, 39.721094 ], [ -77.743204, 39.721205 ], [ -77.768534, 39.721358 ], [ -77.874719, 39.722219 ], [ -78.073736, 39.722314 ], [ -78.075771, 39.722301 ], [ -78.202895, 39.722416 ], [ -78.204450, 39.722520 ], [ -78.240334, 39.722498 ], [ -78.243103, 39.722481 ], [ -78.268948, 39.722590 ], [ -78.269020, 39.722613 ], [ -78.330715, 39.722689 ], [ -78.337111, 39.722461 ], [ -78.339539, 39.722552 ], [ -78.340498, 39.722514 ], [ -78.342520, 39.722539 ], [ -78.438839, 39.722481 ], [ -78.461422, 39.722869 ], [ -78.537702, 39.722490 ], [ -78.546415, 39.722869 ], [ -78.575893, 39.722561 ], [ -78.723529, 39.723043 ], [ -78.931176, 39.722775 ], [ -79.045548, 39.722883 ], [ -79.476662, 39.721078 ], [ -79.548465, 39.720778 ], [ -79.608223, 39.721154 ], [ -79.610623, 39.721245 ], [ -79.763774, 39.720776 ], [ -79.852904, 39.720713 ], [ -79.853131, 39.720713 ], [ -80.075947, 39.721350 ], [ -80.308651, 39.721283 ], [ -80.309457, 39.721264 ], [ -80.421388, 39.721189 ], [ -80.519342, 39.721403 ], [ -80.519423, 39.806181 ], [ -80.518891, 39.890964 ], [ -80.519248, 39.936967 ], [ -80.519115, 39.939188 ], [ -80.519175, 39.956648 ], [ -80.519203, 39.959394 ], [ -80.519218, 39.962424 ], [ -80.519207, 39.963381 ], [ -80.519120, 40.016410 ], [ -80.519008, 40.077001 ], [ -80.518960, 40.078089 ], [ -80.519104, 40.159672 ], [ -80.519056, 40.172744 ], [ -80.519056, 40.172771 ], [ -80.519039, 40.342101 ], [ -80.517991, 40.367968 ], [ -80.517991, 40.398868 ], [ -80.517690, 40.462467 ], [ -80.518990, 40.473667 ], [ -80.519054, 40.517922 ], [ -80.519057, 40.517922 ], [ -80.519055, 40.590173 ], [ -80.519086, 40.590161 ], [ -80.519086, 40.616385 ], [ -80.519039, 40.616391 ], [ -80.518991, 40.638801 ], [ -80.519058, 40.792298 ], [ -80.518992, 40.801221 ], [ -80.519081, 40.849157 ], [ -80.519020, 40.850073 ], [ -80.519002, 40.877543 ], [ -80.519764, 40.899858 ], [ -80.519790, 40.900761 ], [ -80.519891, 40.906661 ], [ -80.519091, 40.921061 ], [ -80.518989, 40.995445 ], [ -80.518927, 41.015387 ], [ -80.518960, 41.061546 ], [ -80.518928, 41.070954 ], [ -80.518960, 41.071866 ], [ -80.518999, 41.075014 ], [ -80.519088, 41.082074 ], [ -80.519092, 41.090658 ], [ -80.519125, 41.100819 ], [ -80.519192, 41.105358 ], [ -80.518992, 41.115958 ], [ -80.519056, 41.125057 ], [ -80.519012, 41.125057 ], [ -80.519012, 41.125116 ], [ -80.519167, 41.133343 ], [ -80.519115, 41.145520 ], [ -80.519144, 41.171203 ], [ -80.518830, 41.209213 ], [ -80.518893, 41.219356 ], [ -80.518893, 41.232556 ], [ -80.518693, 41.248855 ], [ -80.518893, 41.265155 ], [ -80.518993, 41.268155 ], [ -80.518996, 41.268300 ], [ -80.518794, 41.305509 ], [ -80.519129, 41.312408 ], [ -80.519265, 41.333495 ], [ -80.519281, 41.335958 ], [ -80.519281, 41.337145 ], [ -80.519281, 41.337174 ], [ -80.519311, 41.339052 ], [ -80.519293, 41.339054 ], [ -80.519293, 41.339654 ], [ -80.519345, 41.340145 ], [ -80.519345, 41.340740 ], [ -80.519249, 41.361030 ], [ -80.519217, 41.372006 ], [ -80.519249, 41.378918 ], [ -80.519025, 41.416438 ], [ -80.518993, 41.416437 ], [ -80.518993, 41.435454 ], [ -80.519169, 41.462581 ], [ -80.519225, 41.499924 ], [ -80.519157, 41.528769 ], [ -80.519339, 41.539297 ], [ -80.519357, 41.669767 ], [ -80.519424, 41.671228 ], [ -80.519373, 41.701473 ], [ -80.519408, 41.739359 ], [ -80.519369, 41.752487 ], [ -80.519239, 41.765138 ], [ -80.519345, 41.929168 ], [ -80.519304, 41.943992 ], [ -80.519405, 41.976158 ], [ -80.519425, 41.977523 ], [ -80.435451, 42.005611 ], [ -80.409776, 42.011578 ], [ -80.373066, 42.024102 ], [ -80.371869, 42.023966 ], [ -80.363251, 42.027973 ], [ -80.349169, 42.030243 ], [ -80.329976, 42.036168 ], [ -80.296758, 42.049076 ], [ -80.230486, 42.077957 ], [ -80.188085, 42.094257 ], [ -80.165884, 42.105857 ], [ -80.154084, 42.114757 ], [ -80.136213, 42.149937 ], [ -80.130430, 42.156331 ], [ -80.117368, 42.166341 ], [ -80.088512, 42.173184 ], [ -80.077388, 42.171262 ], [ -80.073381, 42.168658 ], [ -80.080028, 42.163625 ], [ -80.071981, 42.155357 ], [ -80.078781, 42.151457 ], [ -80.076281, 42.147857 ], [ -80.071980, 42.146057 ], [ -80.061080, 42.144857 ], [ -79.989186, 42.177051 ], [ -79.931324, 42.206737 ], [ -79.923924, 42.207546 ], [ -79.901050, 42.216701 ], [ -79.886187, 42.224933 ], [ -79.867979, 42.230999 ], [ -79.844661, 42.235486 ], [ -79.798447, 42.255939 ], [ -79.761951, 42.269860 ], [ -79.761964, 42.251354 ], [ -79.762152, 42.243054 ], [ -79.761833, 42.183627 ], [ -79.761929, 42.179693 ], [ -79.761921, 42.173319 ], [ -79.761759, 42.162675 ], [ -79.761861, 42.150712 ], [ -79.762122, 42.131246 ], [ -79.761709, 42.118990 ], [ -79.761798, 42.019042 ], [ -79.761374, 41.999067 ], [ -79.670128, 41.999335 ], [ -79.625287, 41.999003 ], [ -79.625301, 41.999068 ], [ -79.551385, 41.998666 ], [ -79.538445, 41.998527 ], [ -79.472472, 41.998255 ], [ -79.249772, 41.998807 ], [ -79.178570, 41.999458 ], [ -79.061265, 41.999259 ], [ -78.983065, 41.998949 ], [ -78.874759, 41.997559 ], [ -78.749754, 41.998109 ], [ -78.596650, 41.999877 ], [ -78.308128, 41.999415 ], [ -78.271204, 41.998968 ], [ -78.124730, 42.000452 ], [ -78.031177, 41.999415 ], [ -78.030963, 41.999392 ], [ -77.997508, 41.998758 ], [ -77.832030, 41.998524 ], [ -77.822799, 41.998547 ], [ -77.749931, 41.998782 ], [ -77.505308, 42.000070 ], [ -77.124693, 41.999395 ], [ -77.063676, 42.000461 ], [ -77.007635, 42.000848 ], [ -77.007536, 42.000819 ], [ -76.965686, 42.001274 ], [ -76.942585, 42.001574 ], [ -76.937084, 42.001674 ], [ -76.921884, 42.001674 ], [ -76.920784, 42.001774 ], [ -76.835079, 42.001773 ], [ -76.815878, 42.001673 ], [ -76.749675, 42.001689 ], [ -76.558118, 42.000155 ], [ -76.466540, 41.999025 ], [ -76.462155, 41.998934 ], [ -76.349898, 41.998410 ], [ -76.343722, 41.998346 ], [ -76.131201, 41.998954 ], [ -76.123696, 41.998954 ], [ -76.105840, 41.998858 ], [ -75.983082, 41.999035 ], [ -75.980250, 41.999035 ], [ -75.870677, 41.998828 ], [ -75.742217, 41.997864 ], [ -75.610316, 41.998960 ], [ -75.483738, 41.999244 ], [ -75.477144, 41.999407 ], [ -75.436216, 41.999353 ], [ -75.431961, 41.999363 ], [ -75.359579, 41.999445 ], [ -75.353504, 41.997110 ], [ -75.346568, 41.995324 ], [ -75.341125, 41.992772 ], [ -75.337602, 41.986700 ], [ -75.337791, 41.984386 ], [ -75.342460, 41.974303 ], [ -75.342204, 41.972872 ], [ -75.339488, 41.970786 ], [ -75.335771, 41.970315 ], [ -75.329318, 41.968232 ], [ -75.322384, 41.961693 ], [ -75.320040, 41.960867 ], [ -75.318168, 41.954236 ], [ -75.312817, 41.950182 ], [ -75.310358, 41.949012 ], [ -75.303966, 41.948216 ], [ -75.301664, 41.948380 ], [ -75.301233, 41.948900 ], [ -75.301593, 41.952811 ], [ -75.300409, 41.953871 ], [ -75.298580, 41.954521 ], [ -75.293713, 41.954593 ], [ -75.291430, 41.952477 ], [ -75.291762, 41.947092 ], [ -75.290966, 41.945039 ], [ -75.289383, 41.942891 ], [ -75.279094, 41.938917 ], [ -75.277243, 41.933598 ], [ -75.276501, 41.926679 ], [ -75.276552, 41.922208 ], [ -75.275368, 41.919564 ], [ -75.269736, 41.911363 ], [ -75.267562, 41.907054 ], [ -75.267773, 41.901971 ], [ -75.272778, 41.897112 ], [ -75.272581, 41.893168 ], [ -75.271292, 41.887360 ], [ -75.267789, 41.885982 ], [ -75.263005, 41.885109 ], [ -75.260623, 41.883783 ], [ -75.257564, 41.877108 ], [ -75.258439, 41.875087 ], [ -75.261488, 41.873277 ], [ -75.263815, 41.870757 ], [ -75.263673, 41.868105 ], [ -75.262802, 41.866213 ], [ -75.260527, 41.863800 ], [ -75.257825, 41.862154 ], [ -75.251197, 41.862040 ], [ -75.248045, 41.863300 ], [ -75.243345, 41.866875 ], [ -75.241134, 41.867118 ], [ -75.238743, 41.865699 ], [ -75.234565, 41.861569 ], [ -75.231612, 41.859459 ], [ -75.225720, 41.857481 ], [ -75.223734, 41.857456 ], [ -75.220125, 41.860534 ], [ -75.214970, 41.867449 ], [ -75.209741, 41.869250 ], [ -75.204002, 41.869867 ], [ -75.197836, 41.868807 ], [ -75.194382, 41.867287 ], [ -75.191441, 41.865063 ], [ -75.190203, 41.862454 ], [ -75.188888, 41.861264 ], [ -75.186993, 41.860109 ], [ -75.185254, 41.859930 ], [ -75.183937, 41.860515 ], [ -75.182271, 41.862198 ], [ -75.180497, 41.865680 ], [ -75.179134, 41.869935 ], [ -75.176633, 41.872371 ], [ -75.174574, 41.872660 ], [ -75.170565, 41.871608 ], [ -75.169142, 41.870290 ], [ -75.168053, 41.867043 ], [ -75.168733, 41.859258 ], [ -75.166217, 41.853862 ], [ -75.164168, 41.851586 ], [ -75.161541, 41.849836 ], [ -75.156512, 41.848327 ], [ -75.152898, 41.848564 ], [ -75.146446, 41.850899 ], [ -75.143824, 41.851737 ], [ -75.140241, 41.852078 ], [ -75.130983, 41.845145 ], [ -75.127913, 41.844903 ], [ -75.118789, 41.845819 ], [ -75.115598, 41.844638 ], [ -75.114399, 41.843583 ], [ -75.113369, 41.840698 ], [ -75.113441, 41.836298 ], [ -75.114998, 41.830300 ], [ -75.115147, 41.827285 ], [ -75.114837, 41.825670 ], [ -75.113334, 41.822782 ], [ -75.100024, 41.818347 ], [ -75.093537, 41.813375 ], [ -75.089484, 41.811576 ], [ -75.085789, 41.811626 ], [ -75.079818, 41.814815 ], [ -75.078063, 41.815112 ], [ -75.074409, 41.815088 ], [ -75.072172, 41.813732 ], [ -75.071751, 41.811901 ], [ -75.072168, 41.808327 ], [ -75.074412, 41.802191 ], [ -75.076889, 41.798509 ], [ -75.078270, 41.797467 ], [ -75.081415, 41.796483 ], [ -75.088328, 41.797534 ], [ -75.092876, 41.796386 ], [ -75.101463, 41.787941 ], [ -75.102329, 41.786503 ], [ -75.103548, 41.782008 ], [ -75.104640, 41.774203 ], [ -75.104334, 41.772693 ], [ -75.103492, 41.771238 ], [ -75.100990, 41.769121 ], [ -75.095451, 41.768366 ], [ -75.092810, 41.768361 ], [ -75.079478, 41.771205 ], [ -75.075942, 41.771518 ], [ -75.074231, 41.770518 ], [ -75.072664, 41.768807 ], [ -75.068567, 41.767298 ], [ -75.064901, 41.766686 ], [ -75.060759, 41.764638 ], [ -75.053431, 41.752538 ], [ -75.052808, 41.744725 ], [ -75.054818, 41.735168 ], [ -75.053527, 41.727150 ], [ -75.049699, 41.715093 ], [ -75.049862, 41.713309 ], [ -75.050689, 41.711969 ], [ -75.052226, 41.711396 ], [ -75.061174, 41.712935 ], [ -75.066630, 41.712588 ], [ -75.068642, 41.710146 ], [ -75.068830, 41.708161 ], [ -75.067278, 41.705434 ], [ -75.059829, 41.699716 ], [ -75.056745, 41.695703 ], [ -75.052736, 41.688393 ], [ -75.051234, 41.682439 ], [ -75.051285, 41.679961 ], [ -75.052653, 41.678436 ], [ -75.058765, 41.674412 ], [ -75.059332, 41.672320 ], [ -75.058430, 41.669653 ], [ -75.057251, 41.668933 ], [ -75.053991, 41.668194 ], [ -75.049920, 41.662556 ], [ -75.048683, 41.656317 ], [ -75.049281, 41.641862 ], [ -75.048658, 41.633781 ], [ -75.048199, 41.632011 ], [ -75.043562, 41.623640 ], [ -75.044224, 41.617978 ], [ -75.045508, 41.616203 ], [ -75.047298, 41.615791 ], [ -75.048385, 41.615986 ], [ -75.051856, 41.618157 ], [ -75.053850, 41.618655 ], [ -75.060098, 41.617482 ], [ -75.061560, 41.616429 ], [ -75.061675, 41.615468 ], [ -75.059956, 41.612306 ], [ -75.059725, 41.610801 ], [ -75.062716, 41.609639 ], [ -75.067795, 41.610143 ], [ -75.071667, 41.609501 ], [ -75.074626, 41.607905 ], [ -75.074613, 41.605711 ], [ -75.066955, 41.599428 ], [ -75.063677, 41.594739 ], [ -75.060012, 41.590813 ], [ -75.052858, 41.587772 ], [ -75.046760, 41.583258 ], [ -75.043879, 41.575094 ], [ -75.040490, 41.569688 ], [ -75.036989, 41.567049 ], [ -75.033162, 41.565092 ], [ -75.029211, 41.564637 ], [ -75.027343, 41.563541 ], [ -75.018524, 41.551802 ], [ -75.016328, 41.546501 ], [ -75.016144, 41.544246 ], [ -75.017626, 41.542734 ], [ -75.022828, 41.541456 ], [ -75.024798, 41.539801 ], [ -75.024757, 41.535099 ], [ -75.024206, 41.534018 ], [ -75.023018, 41.533147 ], [ -75.016616, 41.532110 ], [ -75.014919, 41.531399 ], [ -75.009552, 41.528461 ], [ -75.003850, 41.524052 ], [ -75.001297, 41.520650 ], [ -75.000911, 41.519292 ], [ -75.000935, 41.517638 ], [ -75.002592, 41.514560 ], [ -75.003706, 41.511118 ], [ -75.003694, 41.509295 ], [ -75.003151, 41.508101 ], [ -74.999612, 41.507400 ], [ -74.993893, 41.508754 ], [ -74.987645, 41.508738 ], [ -74.985653, 41.507926 ], [ -74.984372, 41.506611 ], [ -74.982385, 41.500981 ], [ -74.982168, 41.498486 ], [ -74.982463, 41.496467 ], [ -74.985247, 41.489113 ], [ -74.985595, 41.485863 ], [ -74.985004, 41.483703 ], [ -74.983341, 41.480894 ], [ -74.981652, 41.479945 ], [ -74.969887, 41.477438 ], [ -74.958260, 41.476396 ], [ -74.956411, 41.476735 ], [ -74.948080, 41.480625 ], [ -74.945634, 41.483213 ], [ -74.941798, 41.483542 ], [ -74.932585, 41.482323 ], [ -74.926835, 41.478327 ], [ -74.924092, 41.477138 ], [ -74.917282, 41.477041 ], [ -74.912517, 41.475605 ], [ -74.909181, 41.472436 ], [ -74.908133, 41.468117 ], [ -74.908103, 41.464639 ], [ -74.906887, 41.461131 ], [ -74.904200, 41.459806 ], [ -74.895069, 41.458190 ], [ -74.892114, 41.456959 ], [ -74.890358, 41.455324 ], [ -74.889116, 41.452534 ], [ -74.889075, 41.451245 ], [ -74.894931, 41.446099 ], [ -74.896399, 41.442179 ], [ -74.896025, 41.439987 ], [ -74.893913, 41.438930 ], [ -74.888691, 41.438259 ], [ -74.876721, 41.440338 ], [ -74.864688, 41.443993 ], [ -74.858578, 41.444427 ], [ -74.854200, 41.443166 ], [ -74.848602, 41.440179 ], [ -74.845572, 41.437577 ], [ -74.836915, 41.431625 ], [ -74.834635, 41.430796 ], [ -74.830671, 41.430503 ], [ -74.828592, 41.430698 ], [ -74.826031, 41.431736 ], [ -74.822880, 41.436792 ], [ -74.817995, 41.440505 ], [ -74.812123, 41.442982 ], [ -74.807582, 41.442847 ], [ -74.805655, 41.442101 ], [ -74.801225, 41.438100 ], [ -74.800370, 41.436060 ], [ -74.800095, 41.432661 ], [ -74.799546, 41.431290 ], [ -74.795396, 41.423980 ], [ -74.793856, 41.422671 ], [ -74.790417, 41.421660 ], [ -74.784339, 41.422397 ], [ -74.778029, 41.425104 ], [ -74.773239, 41.426352 ], [ -74.770650, 41.426230 ], [ -74.763701, 41.423612 ], [ -74.758587, 41.423287 ], [ -74.754359, 41.425147 ], [ -74.750680, 41.427984 ], [ -74.743821, 41.430635 ], [ -74.740932, 41.431160 ], [ -74.738455, 41.430641 ], [ -74.736688, 41.429228 ], [ -74.735519, 41.427465 ], [ -74.734893, 41.425818 ], [ -74.734731, 41.422699 ], [ -74.738684, 41.413463 ], [ -74.741086, 41.411413 ], [ -74.741717, 41.407880 ], [ -74.740963, 41.405120 ], [ -74.738554, 41.401191 ], [ -74.736103, 41.398398 ], [ -74.733640, 41.396975 ], [ -74.730384, 41.395660 ], [ -74.720891, 41.394690 ], [ -74.715979, 41.392584 ], [ -74.713411, 41.389814 ], [ -74.710391, 41.382102 ], [ -74.708458, 41.378901 ], [ -74.703282, 41.375093 ], [ -74.694968, 41.370431 ], [ -74.691129, 41.367324 ], [ -74.689516, 41.363843 ], [ -74.689767, 41.361558 ], [ -74.691076, 41.360340 ], [ -74.696398, 41.357339 ], [ -74.694914, 41.357423 ], [ -74.700595, 41.354553 ], [ -74.704429, 41.354043 ], [ -74.708514, 41.352734 ], [ -74.720923, 41.347384 ], [ -74.730373, 41.345983 ], [ -74.735622, 41.346518 ], [ -74.753239, 41.346122 ], [ -74.755971, 41.344953 ], [ -74.760325, 41.340325 ], [ -74.763499, 41.331568 ], [ -74.766714, 41.328558 ], [ -74.771588, 41.325079 ], [ -74.774887, 41.324326 ], [ -74.781584, 41.324229 ], [ -74.789095, 41.323281 ], [ -74.792116, 41.322465 ], [ -74.795040, 41.320407 ], [ -74.795822, 41.318516 ], [ -74.792377, 41.314088 ], [ -74.791991, 41.311639 ], [ -74.792558, 41.310628 ], [ -74.806858, 41.303155 ], [ -74.812033, 41.298157 ], [ -74.815703, 41.296151 ], [ -74.821884, 41.293838 ], [ -74.830057, 41.287200 ], [ -74.834067, 41.281111 ], [ -74.838366, 41.277286 ], [ -74.841137, 41.270980 ], [ -74.846319, 41.263077 ], [ -74.846506, 41.261576 ], [ -74.845031, 41.258055 ], [ -74.845883, 41.254945 ], [ -74.846932, 41.253318 ], [ -74.848987, 41.251192 ], [ -74.854669, 41.250510 ], [ -74.856003, 41.250094 ], [ -74.857151, 41.248975 ], [ -74.861678, 41.241575 ], [ -74.862049, 41.237609 ], [ -74.866182, 41.232132 ], [ -74.867405, 41.227770 ], [ -74.866839, 41.226865 ], [ -74.860837, 41.222317 ], [ -74.859323, 41.220507 ], [ -74.859632, 41.219077 ], [ -74.860398, 41.217454 ], [ -74.867287, 41.208754 ], [ -74.874034, 41.198543 ], [ -74.878275, 41.190489 ], [ -74.878492, 41.187504 ], [ -74.882139, 41.180836 ], [ -74.889424, 41.173600 ], [ -74.899701, 41.166181 ], [ -74.901172, 41.163870 ], [ -74.901780, 41.161394 ], [ -74.905256, 41.155668 ], [ -74.923169, 41.138146 ], [ -74.931141, 41.133387 ], [ -74.945067, 41.129052 ], [ -74.947714, 41.126292 ], [ -74.947334, 41.124439 ], [ -74.947912, 41.123560 ], [ -74.964294, 41.114237 ], [ -74.966298, 41.113669 ], [ -74.969312, 41.113869 ], [ -74.972917, 41.113327 ], [ -74.979873, 41.110423 ], [ -74.982212, 41.108245 ], [ -74.991718, 41.092284 ], [ -74.991815, 41.089132 ], [ -74.991013, 41.088578 ], [ -74.988263, 41.088222 ], [ -74.984782, 41.088545 ], [ -74.981314, 41.089860 ], [ -74.975298, 41.094073 ], [ -74.972036, 41.095562 ], [ -74.969434, 41.096074 ], [ -74.967464, 41.095327 ], [ -74.966759, 41.093425 ], [ -74.968389, 41.087797 ], [ -74.970987, 41.085293 ], [ -74.982590, 41.079172 ], [ -74.989332, 41.078319 ], [ -74.994847, 41.076556 ], [ -74.999617, 41.073943 ], [ -75.006376, 41.067546 ], [ -75.011133, 41.067521 ], [ -75.012570, 41.066281 ], [ -75.015271, 41.061215 ], [ -75.015867, 41.058210 ], [ -75.017239, 41.055491 ], [ -75.019186, 41.052968 ], [ -75.025702, 41.046482 ], [ -75.026376, 41.044440 ], [ -75.025430, 41.040710 ], [ -75.025777, 41.039806 ], [ -75.030701, 41.038416 ], [ -75.034496, 41.036755 ], [ -75.040668, 41.031755 ], [ -75.070532, 41.018620 ], [ -75.074999, 41.017130 ], [ -75.081101, 41.016838 ], [ -75.089787, 41.014549 ], [ -75.090312, 41.013302 ], [ -75.095556, 41.008874 ], [ -75.100682, 41.006716 ], [ -75.109114, 41.004102 ], [ -75.110595, 41.002174 ], [ -75.123423, 40.996129 ], [ -75.127196, 40.993954 ], [ -75.130575, 40.991093 ], [ -75.131619, 40.988900 ], [ -75.131530, 40.984914 ], [ -75.132106, 40.982566 ], [ -75.133086, 40.980179 ], [ -75.135521, 40.976865 ], [ -75.135526, 40.973807 ], [ -75.133780, 40.970973 ], [ -75.131364, 40.969277 ], [ -75.129074, 40.968976 ], [ -75.122603, 40.970152 ], [ -75.120435, 40.968302 ], [ -75.119770, 40.966510 ], [ -75.120650, 40.964028 ], [ -75.120316, 40.962630 ], [ -75.119893, 40.961646 ], [ -75.118904, 40.956361 ], [ -75.117764, 40.953023 ], [ -75.111683, 40.948111 ], [ -75.106153, 40.939671 ], [ -75.105524, 40.936294 ], [ -75.097720, 40.926679 ], [ -75.095526, 40.924152 ], [ -75.079279, 40.913890 ], [ -75.076956, 40.909880 ], [ -75.076092, 40.907042 ], [ -75.075188, 40.900154 ], [ -75.075957, 40.895694 ], [ -75.075340, 40.894162 ], [ -75.073920, 40.892176 ], [ -75.065438, 40.885682 ], [ -75.062149, 40.882289 ], [ -75.058655, 40.877654 ], [ -75.053664, 40.873660 ], [ -75.051508, 40.870224 ], [ -75.050839, 40.868067 ], [ -75.051029, 40.865662 ], [ -75.053294, 40.859900 ], [ -75.060491, 40.853020 ], [ -75.064328, 40.848338 ], [ -75.066014, 40.847591 ], [ -75.070830, 40.847392 ], [ -75.073544, 40.848940 ], [ -75.076684, 40.849875 ], [ -75.090962, 40.849187 ], [ -75.095784, 40.847082 ], [ -75.097221, 40.844672 ], [ -75.097586, 40.843042 ], [ -75.097572, 40.840967 ], [ -75.097006, 40.839336 ], [ -75.094940, 40.837103 ], [ -75.085517, 40.830085 ], [ -75.083822, 40.827805 ], [ -75.083929, 40.824471 ], [ -75.085387, 40.821972 ], [ -75.090518, 40.815913 ], [ -75.096147, 40.812211 ], [ -75.098279, 40.810286 ], [ -75.100277, 40.807578 ], [ -75.100739, 40.805488 ], [ -75.100165, 40.803000 ], [ -75.100277, 40.801176 ], [ -75.100800, 40.799797 ], [ -75.108505, 40.791094 ], [ -75.111343, 40.789896 ], [ -75.116842, 40.789350 ], [ -75.123088, 40.786746 ], [ -75.125867, 40.784026 ], [ -75.131465, 40.775950 ], [ -75.133303, 40.774124 ], [ -75.134400, 40.773765 ], [ -75.139106, 40.773606 ], [ -75.149378, 40.774786 ], [ -75.163650, 40.778386 ], [ -75.169523, 40.778473 ], [ -75.171587, 40.777745 ], [ -75.173349, 40.776129 ], [ -75.175620, 40.772923 ], [ -75.176855, 40.768721 ], [ -75.177477, 40.764225 ], [ -75.179040, 40.761897 ], [ -75.183037, 40.759344 ], [ -75.191796, 40.755830 ], [ -75.196533, 40.751631 ], [ -75.196861, 40.750097 ], [ -75.196325, 40.747137 ], [ -75.195349, 40.745473 ], [ -75.185780, 40.737266 ], [ -75.182804, 40.733650 ], [ -75.182084, 40.731522 ], [ -75.182500, 40.729922 ], [ -75.186372, 40.723970 ], [ -75.189412, 40.717970 ], [ -75.192612, 40.715874 ], [ -75.194420, 40.714018 ], [ -75.198720, 40.705298 ], [ -75.203920, 40.691498 ], [ -75.200920, 40.685498 ], [ -75.196920, 40.681299 ], [ -75.190580, 40.679379 ], [ -75.184516, 40.679971 ], [ -75.180564, 40.679363 ], [ -75.177587, 40.677731 ], [ -75.176803, 40.675715 ], [ -75.177491, 40.672595 ], [ -75.182756, 40.665971 ], [ -75.187940, 40.663811 ], [ -75.190852, 40.661939 ], [ -75.196676, 40.655123 ], [ -75.200452, 40.649219 ], [ -75.200468, 40.646899 ], [ -75.193492, 40.642275 ], [ -75.192276, 40.640803 ], [ -75.191059, 40.637971 ], [ -75.188579, 40.624628 ], [ -75.189283, 40.621492 ], [ -75.190691, 40.619956 ], [ -75.197891, 40.619332 ], [ -75.200708, 40.618356 ], [ -75.201812, 40.617188 ], [ -75.201348, 40.614628 ], [ -75.198499, 40.611492 ], [ -75.196803, 40.608580 ], [ -75.195923, 40.606788 ], [ -75.192291, 40.602676 ], [ -75.190146, 40.590359 ], [ -75.190796, 40.586838 ], [ -75.194656, 40.581940 ], [ -75.195114, 40.579689 ], [ -75.194870, 40.578591 ], [ -75.194046, 40.576256 ], [ -75.192352, 40.574257 ], [ -75.186737, 40.569406 ], [ -75.183151, 40.567354 ], [ -75.175307, 40.564996 ], [ -75.168609, 40.564111 ], [ -75.162871, 40.564096 ], [ -75.158446, 40.565286 ], [ -75.147368, 40.573152 ], [ -75.141906, 40.575273 ], [ -75.136748, 40.575731 ], [ -75.117292, 40.573211 ], [ -75.110903, 40.570671 ], [ -75.100325, 40.567811 ], [ -75.095700, 40.564401 ], [ -75.078503, 40.548296 ], [ -75.068615, 40.542223 ], [ -75.067257, 40.539584 ], [ -75.066402, 40.536532 ], [ -75.065090, 40.526148 ], [ -75.065853, 40.519495 ], [ -75.066001, 40.510716 ], [ -75.065275, 40.504682 ], [ -75.062373, 40.491689 ], [ -75.061937, 40.486362 ], [ -75.062227, 40.481391 ], [ -75.064327, 40.476795 ], [ -75.067776, 40.472827 ], [ -75.068050, 40.468578 ], [ -75.067302, 40.464954 ], [ -75.070568, 40.456348 ], [ -75.070568, 40.455165 ], [ -75.067425, 40.448323 ], [ -75.062923, 40.433407 ], [ -75.061489, 40.422848 ], [ -75.058848, 40.418065 ], [ -75.056102, 40.416066 ], [ -75.046473, 40.413792 ], [ -75.043071, 40.411603 ], [ -75.041651, 40.409894 ], [ -75.036616, 40.406796 ], [ -75.028315, 40.403883 ], [ -75.024775, 40.403455 ], [ -75.017221, 40.404638 ], [ -75.003351, 40.407850 ], [ -74.998651, 40.410093 ], [ -74.996378, 40.410528 ], [ -74.988901, 40.408773 ], [ -74.985467, 40.405935 ], [ -74.982735, 40.404432 ], [ -74.969597, 40.399770 ], [ -74.965508, 40.397337 ], [ -74.963997, 40.395246 ], [ -74.953697, 40.376081 ], [ -74.948722, 40.364768 ], [ -74.946006, 40.357306 ], [ -74.945088, 40.347332 ], [ -74.943776, 40.342564 ], [ -74.939711, 40.338006 ], [ -74.933111, 40.333106 ], [ -74.926810, 40.329406 ], [ -74.917410, 40.322406 ], [ -74.908310, 40.316907 ], [ -74.903310, 40.315607 ], [ -74.896409, 40.315107 ], [ -74.891609, 40.313007 ], [ -74.887109, 40.310307 ], [ -74.880609, 40.305607 ], [ -74.868209, 40.295207 ], [ -74.864692, 40.290684 ], [ -74.860492, 40.284584 ], [ -74.856508, 40.277407 ], [ -74.853108, 40.269707 ], [ -74.846608, 40.258808 ], [ -74.842308, 40.250508 ], [ -74.836307, 40.246208 ], [ -74.823907, 40.241508 ], [ -74.819507, 40.238508 ], [ -74.795306, 40.229408 ], [ -74.781206, 40.221508 ], [ -74.771360, 40.215399 ], [ -74.770406, 40.214508 ], [ -74.766905, 40.207709 ], [ -74.760605, 40.198909 ], [ -74.756905, 40.189409 ], [ -74.755605, 40.186709 ], [ -74.754305, 40.185209 ], [ -74.751705, 40.183309 ], [ -74.744105, 40.181009 ], [ -74.737205, 40.177609 ], [ -74.733804, 40.174509 ], [ -74.722304, 40.160609 ], [ -74.721504, 40.158409 ], [ -74.721604, 40.153810 ], [ -74.722604, 40.150010 ], [ -74.724304, 40.147010 ], [ -74.725663, 40.145495 ], [ -74.740605, 40.135210 ], [ -74.742905, 40.134410 ], [ -74.745905, 40.134210 ], [ -74.755305, 40.134710 ], [ -74.758882, 40.134036 ], [ -74.762864, 40.132541 ], [ -74.769488, 40.129145 ], [ -74.782106, 40.120810 ], [ -74.785106, 40.120310 ], [ -74.788706, 40.120410 ], [ -74.800607, 40.122810 ], [ -74.812807, 40.126910 ], [ -74.816307, 40.127610 ], [ -74.819007, 40.127510 ], [ -74.822307, 40.126710 ], [ -74.825907, 40.123910 ], [ -74.828408, 40.120310 ], [ -74.832808, 40.111710 ], [ -74.835108, 40.103910 ], [ -74.838008, 40.100910 ], [ -74.843408, 40.097710 ], [ -74.851108, 40.094910 ], [ -74.854409, 40.093110 ], [ -74.856509, 40.091310 ], [ -74.858209, 40.088810 ], [ -74.859809, 40.084910 ], [ -74.860909, 40.083710 ], [ -74.863809, 40.082210 ], [ -74.880209, 40.078810 ], [ -74.887810, 40.075810 ], [ -74.909011, 40.070210 ], [ -74.911911, 40.069910 ], [ -74.920811, 40.071110 ], [ -74.925311, 40.070710 ], [ -74.932211, 40.068411 ], [ -74.944412, 40.063211 ], [ -74.974713, 40.048711 ], [ -74.983913, 40.042711 ], [ -74.989914, 40.037311 ], [ -75.007914, 40.023111 ], [ -75.011115, 40.021311 ], [ -75.015515, 40.019511 ], [ -75.039316, 40.013012 ], [ -75.047016, 40.008912 ], [ -75.051217, 40.004512 ], [ -75.059017, 39.992512 ], [ -75.072017, 39.980612 ], [ -75.088618, 39.975212 ], [ -75.093718, 39.974412 ], [ -75.108119, 39.970312 ], [ -75.119220, 39.965412 ], [ -75.126920, 39.961112 ], [ -75.130120, 39.958712 ], [ -75.133520, 39.954412 ], [ -75.135720, 39.947112 ], [ -75.136120, 39.933912 ], [ -75.135020, 39.927312 ], [ -75.132820, 39.921612 ], [ -75.130120, 39.917013 ], [ -75.127920, 39.911813 ], [ -75.130820, 39.900213 ], [ -75.133420, 39.896213 ], [ -75.140221, 39.888213 ], [ -75.142421, 39.886413 ], [ -75.145421, 39.884213 ], [ -75.150721, 39.882713 ], [ -75.183023, 39.882013 ], [ -75.189323, 39.880713 ], [ -75.195324, 39.877013 ], [ -75.210425, 39.865913 ], [ -75.221025, 39.861113 ], [ -75.235026, 39.856613 ], [ -75.243431, 39.854597 ], [ -75.271159, 39.849440 ], [ -75.293376, 39.848782 ], [ -75.309674, 39.850179 ], [ -75.323232, 39.849812 ], [ -75.330433, 39.849012 ], [ -75.341765, 39.846082 ], [ -75.354400, 39.839917 ], [ -75.371835, 39.827612 ], [ -75.390536, 39.815312 ], [ -75.403737, 39.807512 ], [ -75.415041, 39.801786 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US44", "STATE": "44", "NAME": "Rhode Island", "LSAD": "", "CENSUSAREA": 1033.814000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -71.281571, 41.648207 ], [ -71.278171, 41.647309 ], [ -71.274315, 41.638125 ], [ -71.283791, 41.637797 ], [ -71.286755, 41.642725 ], [ -71.283005, 41.644434 ], [ -71.281571, 41.648207 ] ] ], [ [ [ -71.331200, 41.580318 ], [ -71.335949, 41.585898 ], [ -71.337048, 41.594688 ], [ -71.333751, 41.605859 ], [ -71.329559, 41.609097 ], [ -71.326609, 41.616114 ], [ -71.325877, 41.623988 ], [ -71.333305, 41.629536 ], [ -71.346570, 41.632229 ], [ -71.362869, 41.651457 ], [ -71.366165, 41.660980 ], [ -71.348402, 41.663727 ], [ -71.338696, 41.658782 ], [ -71.336182, 41.647961 ], [ -71.337048, 41.646146 ], [ -71.342514, 41.644791 ], [ -71.343666, 41.639900 ], [ -71.330711, 41.632992 ], [ -71.314889, 41.630398 ], [ -71.305550, 41.622523 ], [ -71.303352, 41.606591 ], [ -71.307381, 41.597984 ], [ -71.317474, 41.583187 ], [ -71.326103, 41.578583 ], [ -71.331200, 41.580318 ] ] ], [ [ [ -71.120570, 41.497448 ], [ -71.136867, 41.493942 ], [ -71.141093, 41.489937 ], [ -71.140224, 41.485855 ], [ -71.167345, 41.471405 ], [ -71.170131, 41.463974 ], [ -71.193020, 41.457931 ], [ -71.194967, 41.459037 ], [ -71.196857, 41.461116 ], [ -71.196607, 41.464756 ], [ -71.190016, 41.478275 ], [ -71.190167, 41.484285 ], [ -71.199390, 41.491769 ], [ -71.199692, 41.495511 ], [ -71.206382, 41.499215 ], [ -71.200788, 41.514371 ], [ -71.213563, 41.545818 ], [ -71.208650, 41.571028 ], [ -71.207780, 41.600660 ], [ -71.212656, 41.610072 ], [ -71.212417, 41.618290 ], [ -71.212004, 41.622990 ], [ -71.216160, 41.625490 ], [ -71.240709, 41.619225 ], [ -71.243600, 41.587508 ], [ -71.236130, 41.574767 ], [ -71.236642, 41.535852 ], [ -71.234775, 41.532538 ], [ -71.227989, 41.528297 ], [ -71.229444, 41.521544 ], [ -71.240614, 41.500557 ], [ -71.246047, 41.492983 ], [ -71.247422, 41.490234 ], [ -71.243641, 41.486453 ], [ -71.237175, 41.486546 ], [ -71.236751, 41.483369 ], [ -71.240710, 41.474872 ], [ -71.246703, 41.471960 ], [ -71.245992, 41.481302 ], [ -71.252692, 41.485902 ], [ -71.264793, 41.488902 ], [ -71.275324, 41.479594 ], [ -71.282260, 41.487983 ], [ -71.285639, 41.487805 ], [ -71.295111, 41.484350 ], [ -71.296516, 41.479831 ], [ -71.295885, 41.468580 ], [ -71.300438, 41.467220 ], [ -71.304394, 41.454502 ], [ -71.311394, 41.450802 ], [ -71.312694, 41.451402 ], [ -71.312718, 41.454597 ], [ -71.321410, 41.455600 ], [ -71.337695, 41.448902 ], [ -71.351096, 41.450802 ], [ -71.356033, 41.449332 ], [ -71.358656, 41.457019 ], [ -71.362743, 41.460379 ], [ -71.361520, 41.464831 ], [ -71.347819, 41.470898 ], [ -71.336442, 41.481985 ], [ -71.334380, 41.478204 ], [ -71.335992, 41.469647 ], [ -71.316519, 41.477560 ], [ -71.317414, 41.488776 ], [ -71.323125, 41.503088 ], [ -71.327804, 41.504258 ], [ -71.330694, 41.507699 ], [ -71.330831, 41.518364 ], [ -71.313079, 41.534672 ], [ -71.310533, 41.546920 ], [ -71.303652, 41.559925 ], [ -71.294363, 41.571416 ], [ -71.288376, 41.573274 ], [ -71.285142, 41.577127 ], [ -71.289073, 41.582706 ], [ -71.285635, 41.591642 ], [ -71.278806, 41.593302 ], [ -71.273445, 41.606990 ], [ -71.272412, 41.615041 ], [ -71.275234, 41.619444 ], [ -71.271862, 41.623986 ], [ -71.251082, 41.638780 ], [ -71.233234, 41.640230 ], [ -71.220331, 41.655572 ], [ -71.217513, 41.641508 ], [ -71.212136, 41.641945 ], [ -71.195640, 41.675090 ], [ -71.194390, 41.674802 ], [ -71.191178, 41.674216 ], [ -71.191175, 41.674292 ], [ -71.181290, 41.672502 ], [ -71.175990, 41.671402 ], [ -71.176090, 41.668502 ], [ -71.176090, 41.668102 ], [ -71.153989, 41.664102 ], [ -71.145870, 41.662795 ], [ -71.135188, 41.660502 ], [ -71.134688, 41.660502 ], [ -71.132888, 41.660102 ], [ -71.132670, 41.658744 ], [ -71.134478, 41.641262 ], [ -71.134484, 41.641198 ], [ -71.135688, 41.628402 ], [ -71.140468, 41.623893 ], [ -71.141509, 41.616076 ], [ -71.140910, 41.607405 ], [ -71.140588, 41.605102 ], [ -71.137492, 41.602561 ], [ -71.131618, 41.593918 ], [ -71.131312, 41.592308 ], [ -71.122400, 41.522156 ], [ -71.120570, 41.497448 ] ] ], [ [ [ -71.326769, 41.491286 ], [ -71.325365, 41.487601 ], [ -71.327822, 41.482985 ], [ -71.343013, 41.495615 ], [ -71.341122, 41.498598 ], [ -71.326769, 41.491286 ] ] ], [ [ [ -71.383586, 41.464782 ], [ -71.389284, 41.460605 ], [ -71.390275, 41.455043 ], [ -71.399568, 41.448596 ], [ -71.400560, 41.460940 ], [ -71.395927, 41.492215 ], [ -71.386511, 41.493071 ], [ -71.378914, 41.504948 ], [ -71.391005, 41.514578 ], [ -71.392137, 41.524468 ], [ -71.384478, 41.556736 ], [ -71.379021, 41.567772 ], [ -71.373618, 41.573214 ], [ -71.370194, 41.573963 ], [ -71.363560, 41.570860 ], [ -71.359868, 41.556308 ], [ -71.363292, 41.501952 ], [ -71.360403, 41.483121 ], [ -71.354315, 41.478891 ], [ -71.380947, 41.474561 ], [ -71.383586, 41.464782 ] ] ], [ [ [ -71.224798, 41.710498 ], [ -71.227875, 41.705498 ], [ -71.240991, 41.697744 ], [ -71.237635, 41.681635 ], [ -71.241550, 41.667205 ], [ -71.259560, 41.642595 ], [ -71.267055, 41.644945 ], [ -71.270075, 41.652439 ], [ -71.269180, 41.654900 ], [ -71.280366, 41.672575 ], [ -71.287637, 41.672463 ], [ -71.290546, 41.662395 ], [ -71.299159, 41.649531 ], [ -71.301396, 41.649978 ], [ -71.303746, 41.654788 ], [ -71.306095, 41.672575 ], [ -71.302627, 41.681747 ], [ -71.298935, 41.681524 ], [ -71.293119, 41.688347 ], [ -71.291217, 41.702666 ], [ -71.298800, 41.711008 ], [ -71.301446, 41.706441 ], [ -71.308634, 41.711026 ], [ -71.305759, 41.718662 ], [ -71.314820, 41.723808 ], [ -71.342786, 41.728506 ], [ -71.350057, 41.727835 ], [ -71.353748, 41.724702 ], [ -71.365717, 41.711615 ], [ -71.365717, 41.694947 ], [ -71.372988, 41.672575 ], [ -71.377910, 41.666646 ], [ -71.382049, 41.667317 ], [ -71.389880, 41.671903 ], [ -71.390775, 41.680629 ], [ -71.389432, 41.683425 ], [ -71.390551, 41.684096 ], [ -71.418069, 41.684208 ], [ -71.441336, 41.686446 ], [ -71.443082, 41.688303 ], [ -71.441896, 41.690025 ], [ -71.445923, 41.691144 ], [ -71.449318, 41.687401 ], [ -71.444468, 41.664409 ], [ -71.430038, 41.667541 ], [ -71.425452, 41.670785 ], [ -71.409302, 41.662643 ], [ -71.403770, 41.589321 ], [ -71.447712, 41.580400 ], [ -71.442567, 41.565075 ], [ -71.421649, 41.537892 ], [ -71.417398, 41.534536 ], [ -71.414825, 41.523126 ], [ -71.414937, 41.516303 ], [ -71.421425, 41.498629 ], [ -71.419971, 41.484758 ], [ -71.417957, 41.482073 ], [ -71.417621, 41.477934 ], [ -71.418404, 41.472652 ], [ -71.421157, 41.469888 ], [ -71.422991, 41.472682 ], [ -71.430744, 41.470636 ], [ -71.430926, 41.465655 ], [ -71.427935, 41.459529 ], [ -71.428652, 41.454158 ], [ -71.433612, 41.444995 ], [ -71.437670, 41.441302 ], [ -71.441199, 41.441602 ], [ -71.448948, 41.438479 ], [ -71.455845, 41.432986 ], [ -71.455371, 41.407962 ], [ -71.474918, 41.386104 ], [ -71.483295, 41.371722 ], [ -71.479867, 41.361125 ], [ -71.487772, 41.361125 ], [ -71.502926, 41.373665 ], [ -71.513401, 41.374702 ], [ -71.526724, 41.376636 ], [ -71.555381, 41.373316 ], [ -71.624505, 41.360870 ], [ -71.688070, 41.342823 ], [ -71.701631, 41.336968 ], [ -71.720740, 41.331567 ], [ -71.773702, 41.327977 ], [ -71.785957, 41.325739 ], [ -71.833755, 41.315631 ], [ -71.857432, 41.306318 ], [ -71.862772, 41.309791 ], [ -71.862109, 41.316612 ], [ -71.860513, 41.320248 ], [ -71.839013, 41.334042 ], [ -71.829595, 41.344544 ], [ -71.835951, 41.353935 ], [ -71.837738, 41.363529 ], [ -71.831613, 41.370899 ], [ -71.833443, 41.384524 ], [ -71.842131, 41.395359 ], [ -71.843472, 41.405830 ], [ -71.842563, 41.409855 ], [ -71.839649, 41.412119 ], [ -71.818390, 41.419599 ], [ -71.797683, 41.416709 ], [ -71.789356, 41.596910 ], [ -71.786994, 41.655992 ], [ -71.789678, 41.724734 ], [ -71.791062, 41.770273 ], [ -71.792767, 41.807001 ], [ -71.792786, 41.808670 ], [ -71.794161, 41.840141 ], [ -71.794161, 41.841101 ], [ -71.797922, 41.935395 ], [ -71.799242, 42.008065 ], [ -71.766010, 42.009745 ], [ -71.576908, 42.014098 ], [ -71.559439, 42.014342 ], [ -71.527606, 42.014998 ], [ -71.527306, 42.015098 ], [ -71.500905, 42.017098 ], [ -71.499905, 42.017198 ], [ -71.381401, 42.018798 ], [ -71.381501, 41.966699 ], [ -71.381401, 41.964799 ], [ -71.381600, 41.922899 ], [ -71.381700, 41.922699 ], [ -71.381700, 41.893199 ], [ -71.376600, 41.893999 ], [ -71.373799, 41.894399 ], [ -71.370999, 41.894599 ], [ -71.365399, 41.895299 ], [ -71.364699, 41.895399 ], [ -71.362499, 41.895599 ], [ -71.354699, 41.896499 ], [ -71.352699, 41.896699 ], [ -71.338698, 41.898399 ], [ -71.339298, 41.893599 ], [ -71.339298, 41.893399 ], [ -71.340798, 41.881600 ], [ -71.333997, 41.862300 ], [ -71.342198, 41.844800 ], [ -71.341797, 41.843700 ], [ -71.335197, 41.835500 ], [ -71.337597, 41.833700 ], [ -71.339597, 41.832000 ], [ -71.344897, 41.828000 ], [ -71.347197, 41.823100 ], [ -71.339197, 41.809000 ], [ -71.338897, 41.808300 ], [ -71.339297, 41.806500 ], [ -71.339297, 41.804400 ], [ -71.340797, 41.800200 ], [ -71.340697, 41.798300 ], [ -71.339297, 41.796300 ], [ -71.335797, 41.794800 ], [ -71.333896, 41.794500 ], [ -71.332196, 41.792300 ], [ -71.329296, 41.786800 ], [ -71.329396, 41.782600 ], [ -71.327896, 41.780501 ], [ -71.317795, 41.776101 ], [ -71.261392, 41.752301 ], [ -71.225791, 41.711701 ], [ -71.224798, 41.710498 ] ] ], [ [ [ -71.589550, 41.196557 ], [ -71.580228, 41.204837 ], [ -71.577301, 41.214710 ], [ -71.576661, 41.224434 ], [ -71.573785, 41.228436 ], [ -71.561093, 41.224207 ], [ -71.555006, 41.216822 ], [ -71.554067, 41.212957 ], [ -71.557459, 41.204542 ], [ -71.564119, 41.195372 ], [ -71.565752, 41.184373 ], [ -71.560969, 41.176186 ], [ -71.550226, 41.166787 ], [ -71.544446, 41.164912 ], [ -71.543872, 41.161321 ], [ -71.547051, 41.153684 ], [ -71.551953, 41.151718 ], [ -71.593700, 41.146339 ], [ -71.599993, 41.146932 ], [ -71.611706, 41.153239 ], [ -71.613133, 41.160281 ], [ -71.605565, 41.182139 ], [ -71.594994, 41.188392 ], [ -71.589550, 41.196557 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US47", "STATE": "47", "NAME": "Tennessee", "LSAD": "", "CENSUSAREA": 41234.896000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -81.677535, 36.588117 ], [ -81.680137, 36.585518 ], [ -81.679036, 36.578918 ], [ -81.677236, 36.574406 ], [ -81.677036, 36.570718 ], [ -81.679936, 36.568618 ], [ -81.686436, 36.567918 ], [ -81.690236, 36.568718 ], [ -81.692506, 36.565748 ], [ -81.692167, 36.562695 ], [ -81.690132, 36.559643 ], [ -81.689115, 36.555912 ], [ -81.690030, 36.552154 ], [ -81.693844, 36.549083 ], [ -81.697539, 36.544359 ], [ -81.699962, 36.539714 ], [ -81.699962, 36.536829 ], [ -81.707963, 36.536209 ], [ -81.708262, 36.532113 ], [ -81.707573, 36.526101 ], [ -81.702543, 36.520317 ], [ -81.700553, 36.515190 ], [ -81.700093, 36.514158 ], [ -81.699601, 36.512883 ], [ -81.699446, 36.511504 ], [ -81.697744, 36.508448 ], [ -81.697829, 36.507544 ], [ -81.697290, 36.504887 ], [ -81.697970, 36.504063 ], [ -81.699923, 36.500865 ], [ -81.700238, 36.500475 ], [ -81.699928, 36.498018 ], [ -81.698265, 36.497221 ], [ -81.697261, 36.496141 ], [ -81.696835, 36.493393 ], [ -81.695907, 36.491580 ], [ -81.697287, 36.484738 ], [ -81.696281, 36.475499 ], [ -81.694829, 36.474463 ], [ -81.694533, 36.473283 ], [ -81.695311, 36.467912 ], [ -81.697975, 36.464741 ], [ -81.699223, 36.463959 ], [ -81.701076, 36.464212 ], [ -81.708247, 36.462217 ], [ -81.714890, 36.457220 ], [ -81.715082, 36.453365 ], [ -81.714277, 36.450978 ], [ -81.714212, 36.447045 ], [ -81.715229, 36.444332 ], [ -81.715569, 36.441280 ], [ -81.715229, 36.438567 ], [ -81.715229, 36.436532 ], [ -81.716925, 36.433140 ], [ -81.717939, 36.428762 ], [ -81.720734, 36.422537 ], [ -81.729924, 36.415422 ], [ -81.734312, 36.413342 ], [ -81.738292, 36.410756 ], [ -81.739648, 36.406686 ], [ -81.739648, 36.401599 ], [ -81.737952, 36.397190 ], [ -81.733877, 36.394570 ], [ -81.731509, 36.392103 ], [ -81.730491, 36.390407 ], [ -81.729813, 36.388033 ], [ -81.730737, 36.382943 ], [ -81.732187, 36.379894 ], [ -81.732865, 36.376502 ], [ -81.731178, 36.374062 ], [ -81.726082, 36.368893 ], [ -81.724047, 36.364293 ], [ -81.724047, 36.360901 ], [ -81.723708, 36.358527 ], [ -81.722691, 36.354797 ], [ -81.721334, 36.353101 ], [ -81.718282, 36.350388 ], [ -81.713873, 36.349370 ], [ -81.707785, 36.346007 ], [ -81.705299, 36.341852 ], [ -81.705966, 36.338496 ], [ -81.707438, 36.335171 ], [ -81.713194, 36.334108 ], [ -81.717186, 36.336169 ], [ -81.721015, 36.338645 ], [ -81.725938, 36.340364 ], [ -81.730976, 36.341187 ], [ -81.734900, 36.340891 ], [ -81.739498, 36.339757 ], [ -81.744461, 36.337778 ], [ -81.747842, 36.337356 ], [ -81.754420, 36.337044 ], [ -81.757962, 36.337500 ], [ -81.760675, 36.338178 ], [ -81.762371, 36.338856 ], [ -81.766102, 36.338517 ], [ -81.768977, 36.341042 ], [ -81.777972, 36.346318 ], [ -81.781318, 36.347656 ], [ -81.784077, 36.347674 ], [ -81.787468, 36.348692 ], [ -81.790181, 36.351744 ], [ -81.791877, 36.354797 ], [ -81.795269, 36.357849 ], [ -81.800812, 36.358073 ], [ -81.808255, 36.354121 ], [ -81.812904, 36.351066 ], [ -81.822493, 36.348819 ], [ -81.833202, 36.347339 ], [ -81.841268, 36.343321 ], [ -81.845638, 36.340360 ], [ -81.850889, 36.337500 ], [ -81.857333, 36.334787 ], [ -81.863148, 36.330209 ], [ -81.874336, 36.319190 ], [ -81.876182, 36.316075 ], [ -81.879382, 36.313767 ], [ -81.887243, 36.309193 ], [ -81.894569, 36.307183 ], [ -81.897701, 36.307446 ], [ -81.908137, 36.302013 ], [ -81.932994, 36.264881 ], [ -81.938897, 36.256067 ], [ -81.960101, 36.228131 ], [ -82.026640, 36.130222 ], [ -82.026340, 36.129222 ], [ -82.028740, 36.124322 ], [ -82.033141, 36.120422 ], [ -82.037941, 36.121122 ], [ -82.043941, 36.125421 ], [ -82.054142, 36.126821 ], [ -82.056042, 36.123921 ], [ -82.056042, 36.120721 ], [ -82.061342, 36.113121 ], [ -82.067142, 36.112020 ], [ -82.079743, 36.106520 ], [ -82.080143, 36.105720 ], [ -82.085943, 36.106020 ], [ -82.098544, 36.105719 ], [ -82.101644, 36.106219 ], [ -82.105444, 36.108119 ], [ -82.109145, 36.107218 ], [ -82.115245, 36.104618 ], [ -82.127146, 36.104417 ], [ -82.130646, 36.106417 ], [ -82.137974, 36.119576 ], [ -82.136546, 36.123717 ], [ -82.136547, 36.128817 ], [ -82.140847, 36.136216 ], [ -82.144147, 36.144216 ], [ -82.147948, 36.149516 ], [ -82.155948, 36.148115 ], [ -82.160883, 36.146548 ], [ -82.169249, 36.146614 ], [ -82.172149, 36.146414 ], [ -82.173849, 36.145314 ], [ -82.175610, 36.143870 ], [ -82.178861, 36.143296 ], [ -82.182549, 36.143714 ], [ -82.183650, 36.144414 ], [ -82.184750, 36.145414 ], [ -82.187850, 36.147886 ], [ -82.191950, 36.148813 ], [ -82.195350, 36.150013 ], [ -82.199251, 36.152713 ], [ -82.201812, 36.154963 ], [ -82.204872, 36.157067 ], [ -82.211251, 36.159012 ], [ -82.213852, 36.159112 ], [ -82.218451, 36.157832 ], [ -82.222052, 36.156911 ], [ -82.223232, 36.154772 ], [ -82.224852, 36.150011 ], [ -82.228288, 36.146622 ], [ -82.234807, 36.141720 ], [ -82.235479, 36.140748 ], [ -82.236415, 36.139926 ], [ -82.237737, 36.139189 ], [ -82.241553, 36.137111 ], [ -82.243353, 36.134311 ], [ -82.244461, 36.132777 ], [ -82.247521, 36.130865 ], [ -82.251853, 36.132210 ], [ -82.253253, 36.133710 ], [ -82.256319, 36.133925 ], [ -82.260353, 36.133710 ], [ -82.263354, 36.130110 ], [ -82.265690, 36.127614 ], [ -82.268750, 36.127040 ], [ -82.270954, 36.127610 ], [ -82.274054, 36.129410 ], [ -82.278654, 36.128510 ], [ -82.280354, 36.128810 ], [ -82.288455, 36.135410 ], [ -82.289455, 36.135710 ], [ -82.297655, 36.133510 ], [ -82.302855, 36.131310 ], [ -82.307255, 36.128510 ], [ -82.308655, 36.126510 ], [ -82.318156, 36.120910 ], [ -82.321448, 36.119551 ], [ -82.325169, 36.119363 ], [ -82.329177, 36.117427 ], [ -82.332289, 36.116935 ], [ -82.336756, 36.114909 ], [ -82.346857, 36.115209 ], [ -82.348422, 36.115929 ], [ -82.349957, 36.117109 ], [ -82.355157, 36.115609 ], [ -82.360357, 36.111609 ], [ -82.360919, 36.110614 ], [ -82.366566, 36.107650 ], [ -82.371383, 36.106388 ], [ -82.375558, 36.105609 ], [ -82.378758, 36.102809 ], [ -82.380458, 36.099309 ], [ -82.389958, 36.096909 ], [ -82.404458, 36.087609 ], [ -82.409458, 36.083409 ], [ -82.460658, 36.007809 ], [ -82.464558, 36.006508 ], [ -82.474190, 36.000108 ], [ -82.482292, 35.997823 ], [ -82.483498, 35.996284 ], [ -82.483666, 35.993866 ], [ -82.484678, 35.992849 ], [ -82.487411, 35.991634 ], [ -82.487451, 35.991557 ], [ -82.500206, 35.982561 ], [ -82.505384, 35.977680 ], [ -82.507068, 35.977475 ], [ -82.512598, 35.975664 ], [ -82.516444, 35.975958 ], [ -82.520660, 35.974633 ], [ -82.522702, 35.973436 ], [ -82.531292, 35.972188 ], [ -82.534763, 35.969887 ], [ -82.539273, 35.969115 ], [ -82.542463, 35.967994 ], [ -82.549682, 35.964275 ], [ -82.553192, 35.960627 ], [ -82.557874, 35.953901 ], [ -82.567503, 35.955552 ], [ -82.575170, 35.958384 ], [ -82.576678, 35.959255 ], [ -82.577719, 35.964196 ], [ -82.581003, 35.965557 ], [ -82.591977, 35.966385 ], [ -82.594860, 35.965347 ], [ -82.600370, 35.964626 ], [ -82.607761, 35.966023 ], [ -82.610889, 35.967409 ], [ -82.611602, 35.971418 ], [ -82.610885, 35.974442 ], [ -82.606740, 35.984446 ], [ -82.604239, 35.987319 ], [ -82.606944, 35.992170 ], [ -82.612604, 35.993488 ], [ -82.613028, 35.994000 ], [ -82.615062, 36.000306 ], [ -82.614362, 36.003506 ], [ -82.613862, 36.004706 ], [ -82.611862, 36.006206 ], [ -82.604327, 36.018187 ], [ -82.600089, 36.021774 ], [ -82.595525, 36.026012 ], [ -82.594873, 36.029598 ], [ -82.596177, 36.031880 ], [ -82.598785, 36.034162 ], [ -82.600741, 36.037422 ], [ -82.602877, 36.039833 ], [ -82.606163, 36.041006 ], [ -82.609663, 36.044906 ], [ -82.613563, 36.046406 ], [ -82.618164, 36.047005 ], [ -82.618064, 36.051205 ], [ -82.617264, 36.054205 ], [ -82.618664, 36.056105 ], [ -82.628365, 36.062105 ], [ -82.632265, 36.065705 ], [ -82.637165, 36.065805 ], [ -82.643565, 36.062805 ], [ -82.650165, 36.057805 ], [ -82.654815, 36.056225 ], [ -82.657249, 36.056636 ], [ -82.662665, 36.055005 ], [ -82.668365, 36.052905 ], [ -82.672965, 36.050405 ], [ -82.683565, 36.046104 ], [ -82.684765, 36.045004 ], [ -82.685565, 36.042004 ], [ -82.688865, 36.038604 ], [ -82.701065, 36.034404 ], [ -82.703165, 36.032404 ], [ -82.707465, 36.030104 ], [ -82.715165, 36.028604 ], [ -82.715565, 36.026904 ], [ -82.715365, 36.024253 ], [ -82.715965, 36.022804 ], [ -82.725065, 36.018204 ], [ -82.727865, 36.018504 ], [ -82.731865, 36.017604 ], [ -82.750065, 36.006004 ], [ -82.754465, 36.004304 ], [ -82.759165, 36.004203 ], [ -82.765365, 36.003003 ], [ -82.776001, 36.000103 ], [ -82.777283, 35.998811 ], [ -82.778589, 35.997001 ], [ -82.779397, 35.992511 ], [ -82.785267, 35.987927 ], [ -82.785558, 35.977795 ], [ -82.781809, 35.974562 ], [ -82.780319, 35.974365 ], [ -82.778625, 35.974792 ], [ -82.776434, 35.973886 ], [ -82.774905, 35.971978 ], [ -82.777751, 35.966912 ], [ -82.783085, 35.964982 ], [ -82.784536, 35.963905 ], [ -82.785356, 35.962530 ], [ -82.785191, 35.959231 ], [ -82.787465, 35.952163 ], [ -82.800431, 35.944155 ], [ -82.805851, 35.937938 ], [ -82.806174, 35.936908 ], [ -82.805771, 35.935316 ], [ -82.802769, 35.930129 ], [ -82.802892, 35.929013 ], [ -82.804997, 35.927168 ], [ -82.809038, 35.927241 ], [ -82.811067, 35.926801 ], [ -82.816130, 35.923986 ], [ -82.821861, 35.921839 ], [ -82.822570, 35.922531 ], [ -82.826045, 35.929721 ], [ -82.828933, 35.932932 ], [ -82.830112, 35.932972 ], [ -82.833268, 35.934993 ], [ -82.839994, 35.940166 ], [ -82.841259, 35.941721 ], [ -82.849849, 35.947772 ], [ -82.852554, 35.949089 ], [ -82.860724, 35.947430 ], [ -82.869315, 35.950565 ], [ -82.870666, 35.951990 ], [ -82.874159, 35.952698 ], [ -82.883933, 35.949192 ], [ -82.892659, 35.945182 ], [ -82.896947, 35.944624 ], [ -82.898505, 35.945101 ], [ -82.901713, 35.937713 ], [ -82.901577, 35.931446 ], [ -82.902374, 35.929852 ], [ -82.903436, 35.928524 ], [ -82.906358, 35.927196 ], [ -82.910608, 35.926930 ], [ -82.911405, 35.925868 ], [ -82.911936, 35.921618 ], [ -82.911671, 35.914711 ], [ -82.906917, 35.907397 ], [ -82.904543, 35.897011 ], [ -82.901843, 35.892930 ], [ -82.901843, 35.890274 ], [ -82.903702, 35.887617 ], [ -82.903968, 35.885492 ], [ -82.901046, 35.882305 ], [ -82.899718, 35.879914 ], [ -82.899186, 35.877524 ], [ -82.899718, 35.874602 ], [ -82.901301, 35.872593 ], [ -82.916452, 35.866102 ], [ -82.918312, 35.863977 ], [ -82.919374, 35.860523 ], [ -82.920974, 35.851073 ], [ -82.919108, 35.844851 ], [ -82.920171, 35.841664 ], [ -82.923358, 35.839273 ], [ -82.927569, 35.838586 ], [ -82.931859, 35.836351 ], [ -82.933221, 35.832915 ], [ -82.937437, 35.827320 ], [ -82.943830, 35.825638 ], [ -82.945515, 35.824662 ], [ -82.952026, 35.816183 ], [ -82.955751, 35.809802 ], [ -82.956127, 35.807874 ], [ -82.958950, 35.803323 ], [ -82.961724, 35.800491 ], [ -82.962842, 35.795126 ], [ -82.962206, 35.792755 ], [ -82.964088, 35.789980 ], [ -82.969648, 35.789663 ], [ -82.974463, 35.786790 ], [ -82.978414, 35.782610 ], [ -82.983970, 35.778010 ], [ -82.992053, 35.773948 ], [ -82.995803, 35.773128 ], [ -83.001473, 35.773752 ], [ -83.006067, 35.778404 ], [ -83.012377, 35.779818 ], [ -83.036209, 35.787405 ], [ -83.039510, 35.786777 ], [ -83.042666, 35.785407 ], [ -83.044108, 35.785347 ], [ -83.046307, 35.785853 ], [ -83.048530, 35.787706 ], [ -83.052677, 35.789548 ], [ -83.058340, 35.788241 ], [ -83.061507, 35.786774 ], [ -83.063975, 35.786643 ], [ -83.072221, 35.788310 ], [ -83.074030, 35.790016 ], [ -83.078732, 35.789472 ], [ -83.085205, 35.785794 ], [ -83.086054, 35.783627 ], [ -83.097193, 35.776067 ], [ -83.100225, 35.774765 ], [ -83.100329, 35.774804 ], [ -83.100233, 35.774745 ], [ -83.102320, 35.775071 ], [ -83.104584, 35.774230 ], [ -83.104805, 35.773480 ], [ -83.110491, 35.770913 ], [ -83.113662, 35.770211 ], [ -83.120183, 35.766234 ], [ -83.127707, 35.768093 ], [ -83.146970, 35.765124 ], [ -83.148080, 35.764295 ], [ -83.154080, 35.764280 ], [ -83.159208, 35.764892 ], [ -83.161537, 35.763363 ], [ -83.164909, 35.759965 ], [ -83.165427, 35.758700 ], [ -83.164770, 35.754618 ], [ -83.170173, 35.746107 ], [ -83.171867, 35.745978 ], [ -83.177499, 35.743913 ], [ -83.180836, 35.738882 ], [ -83.182097, 35.735492 ], [ -83.185685, 35.729890 ], [ -83.188370, 35.729798 ], [ -83.198267, 35.725494 ], [ -83.200126, 35.725331 ], [ -83.203752, 35.726553 ], [ -83.214501, 35.724434 ], [ -83.216972, 35.725752 ], [ -83.219981, 35.726601 ], [ -83.222627, 35.726138 ], [ -83.232042, 35.726098 ], [ -83.240669, 35.726760 ], [ -83.242132, 35.723638 ], [ -83.243501, 35.722533 ], [ -83.251247, 35.719916 ], [ -83.255351, 35.716230 ], [ -83.255489, 35.714974 ], [ -83.254481, 35.712362 ], [ -83.254230, 35.709478 ], [ -83.255108, 35.707096 ], [ -83.256111, 35.703961 ], [ -83.255126, 35.701493 ], [ -83.255610, 35.696061 ], [ -83.258117, 35.691924 ], [ -83.261252, 35.689165 ], [ -83.265390, 35.687535 ], [ -83.269277, 35.685403 ], [ -83.271378, 35.681476 ], [ -83.275480, 35.679463 ], [ -83.281178, 35.677802 ], [ -83.289165, 35.674509 ], [ -83.290682, 35.672638 ], [ -83.291075, 35.667131 ], [ -83.293676, 35.661919 ], [ -83.297154, 35.657750 ], [ -83.302279, 35.656064 ], [ -83.310490, 35.654452 ], [ -83.312757, 35.654809 ], [ -83.317905, 35.659015 ], [ -83.321101, 35.662815 ], [ -83.334965, 35.665471 ], [ -83.337683, 35.663074 ], [ -83.347262, 35.660474 ], [ -83.349255, 35.660854 ], [ -83.351560, 35.659858 ], [ -83.353776, 35.657478 ], [ -83.355537, 35.654632 ], [ -83.355367, 35.652338 ], [ -83.356202, 35.650019 ], [ -83.358209, 35.647277 ], [ -83.366941, 35.638728 ], [ -83.368162, 35.638202 ], [ -83.370369, 35.638204 ], [ -83.372174, 35.639310 ], [ -83.373712, 35.638935 ], [ -83.376785, 35.636638 ], [ -83.377984, 35.634496 ], [ -83.380251, 35.634705 ], [ -83.388722, 35.633584 ], [ -83.388602, 35.632352 ], [ -83.392652, 35.625095 ], [ -83.396626, 35.622720 ], [ -83.403569, 35.621313 ], [ -83.406061, 35.620185 ], [ -83.411852, 35.616920 ], [ -83.420370, 35.613467 ], [ -83.420964, 35.611596 ], [ -83.421576, 35.611186 ], [ -83.432298, 35.609941 ], [ -83.441197, 35.611739 ], [ -83.445802, 35.611803 ], [ -83.447137, 35.608664 ], [ -83.452431, 35.602918 ], [ -83.455722, 35.598045 ], [ -83.462678, 35.592600 ], [ -83.471362, 35.590304 ], [ -83.472668, 35.589125 ], [ -83.472684, 35.586552 ], [ -83.475367, 35.584775 ], [ -83.479082, 35.583316 ], [ -83.479317, 35.582764 ], [ -83.478523, 35.579202 ], [ -83.480617, 35.576633 ], [ -83.485527, 35.568204 ], [ -83.491647, 35.566867 ], [ -83.498335, 35.562981 ], [ -83.517564, 35.562871 ], [ -83.520469, 35.565602 ], [ -83.534169, 35.564668 ], [ -83.540826, 35.565702 ], [ -83.552167, 35.564346 ], [ -83.559264, 35.564796 ], [ -83.566090, 35.565993 ], [ -83.572424, 35.565518 ], [ -83.576345, 35.564019 ], [ -83.582000, 35.562684 ], [ -83.585590, 35.562941 ], [ -83.587140, 35.564017 ], [ -83.587827, 35.566963 ], [ -83.594270, 35.572912 ], [ -83.601854, 35.578228 ], [ -83.604806, 35.579340 ], [ -83.608889, 35.579451 ], [ -83.615312, 35.574026 ], [ -83.629734, 35.567889 ], [ -83.632358, 35.569093 ], [ -83.635832, 35.568169 ], [ -83.637182, 35.567096 ], [ -83.640498, 35.566075 ], [ -83.645481, 35.565825 ], [ -83.653159, 35.568309 ], [ -83.657933, 35.569211 ], [ -83.660925, 35.568207 ], [ -83.662957, 35.569138 ], [ -83.666272, 35.569389 ], [ -83.673093, 35.568974 ], [ -83.676268, 35.570289 ], [ -83.684154, 35.568848 ], [ -83.697827, 35.568352 ], [ -83.700663, 35.567621 ], [ -83.702099, 35.567634 ], [ -83.703846, 35.568476 ], [ -83.707199, 35.568533 ], [ -83.720787, 35.563347 ], [ -83.723459, 35.561874 ], [ -83.732947, 35.563149 ], [ -83.735669, 35.565455 ], [ -83.749894, 35.561146 ], [ -83.756917, 35.563604 ], [ -83.759675, 35.562492 ], [ -83.764606, 35.561538 ], [ -83.771736, 35.562118 ], [ -83.773092, 35.557465 ], [ -83.780129, 35.550387 ], [ -83.786802, 35.547200 ], [ -83.802434, 35.541588 ], [ -83.808713, 35.536415 ], [ -83.809798, 35.534310 ], [ -83.825590, 35.523829 ], [ -83.827428, 35.524653 ], [ -83.831895, 35.524766 ], [ -83.840203, 35.521560 ], [ -83.848502, 35.519259 ], [ -83.853898, 35.521059 ], [ -83.859261, 35.521851 ], [ -83.866413, 35.520910 ], [ -83.872630, 35.521145 ], [ -83.880074, 35.518745 ], [ -83.882563, 35.517182 ], [ -83.884262, 35.512754 ], [ -83.892074, 35.503089 ], [ -83.893031, 35.502253 ], [ -83.895669, 35.501868 ], [ -83.901381, 35.496553 ], [ -83.901403, 35.495278 ], [ -83.900200, 35.494191 ], [ -83.900338, 35.493095 ], [ -83.901527, 35.491026 ], [ -83.905612, 35.489060 ], [ -83.908040, 35.484397 ], [ -83.909265, 35.479714 ], [ -83.911773, 35.476028 ], [ -83.916801, 35.473612 ], [ -83.919564, 35.473367 ], [ -83.924895, 35.473884 ], [ -83.929743, 35.473330 ], [ -83.937015, 35.471511 ], [ -83.942172, 35.467254 ], [ -83.942987, 35.465084 ], [ -83.949389, 35.461164 ], [ -83.952882, 35.460635 ], [ -83.955416, 35.463456 ], [ -83.957821, 35.464211 ], [ -83.961053, 35.464143 ], [ -83.961056, 35.463738 ], [ -83.961054, 35.462838 ], [ -83.961400, 35.459496 ], [ -83.965229, 35.455399 ], [ -83.966656, 35.454941 ], [ -83.969845, 35.455443 ], [ -83.971439, 35.455145 ], [ -83.973171, 35.452582 ], [ -83.973057, 35.448921 ], [ -83.978286, 35.447820 ], [ -83.983233, 35.442350 ], [ -83.992568, 35.438065 ], [ -83.996619, 35.433761 ], [ -83.998154, 35.430786 ], [ -83.999242, 35.426140 ], [ -83.999906, 35.425201 ], [ -84.002250, 35.422548 ], [ -84.005306, 35.420883 ], [ -84.011706, 35.415383 ], [ -84.014707, 35.411983 ], [ -84.017607, 35.411183 ], [ -84.020633, 35.409843 ], [ -84.021782, 35.407418 ], [ -84.021507, 35.404183 ], [ -84.018807, 35.399783 ], [ -84.018107, 35.399083 ], [ -84.015207, 35.398483 ], [ -84.014107, 35.397783 ], [ -84.008207, 35.390383 ], [ -84.008207, 35.389683 ], [ -84.010607, 35.386183 ], [ -84.011207, 35.384383 ], [ -84.009807, 35.382683 ], [ -84.008307, 35.378883 ], [ -84.007586, 35.371661 ], [ -84.015121, 35.364868 ], [ -84.019193, 35.359569 ], [ -84.020188, 35.357503 ], [ -84.023456, 35.354217 ], [ -84.024756, 35.353896 ], [ -84.035343, 35.350833 ], [ -84.037494, 35.349850 ], [ -84.038081, 35.348363 ], [ -84.032430, 35.336845 ], [ -84.031272, 35.336438 ], [ -84.029377, 35.333197 ], [ -84.030409, 35.330483 ], [ -84.032209, 35.328583 ], [ -84.032450, 35.326530 ], [ -84.032479, 35.325318 ], [ -84.035510, 35.317783 ], [ -84.035710, 35.312883 ], [ -84.035010, 35.311983 ], [ -84.028710, 35.310383 ], [ -84.026510, 35.309283 ], [ -84.021410, 35.301383 ], [ -84.023510, 35.295783 ], [ -84.027910, 35.292783 ], [ -84.036011, 35.288683 ], [ -84.042711, 35.278383 ], [ -84.052612, 35.269982 ], [ -84.055712, 35.268182 ], [ -84.063712, 35.266682 ], [ -84.070612, 35.263782 ], [ -84.074713, 35.263182 ], [ -84.081117, 35.261146 ], [ -84.082813, 35.258882 ], [ -84.082913, 35.257082 ], [ -84.092213, 35.249981 ], [ -84.097508, 35.247382 ], [ -84.102270, 35.248115 ], [ -84.103135, 35.248781 ], [ -84.108449, 35.250330 ], [ -84.113314, 35.248981 ], [ -84.114414, 35.249081 ], [ -84.115048, 35.249765 ], [ -84.115279, 35.250438 ], [ -84.121150, 35.250644 ], [ -84.124915, 35.249830 ], [ -84.125615, 35.249381 ], [ -84.126815, 35.246481 ], [ -84.127315, 35.244414 ], [ -84.128890, 35.243679 ], [ -84.130570, 35.243364 ], [ -84.133299, 35.243679 ], [ -84.136415, 35.244780 ], [ -84.139715, 35.246180 ], [ -84.143124, 35.246879 ], [ -84.155316, 35.246480 ], [ -84.158916, 35.245880 ], [ -84.160416, 35.243880 ], [ -84.161316, 35.243480 ], [ -84.168616, 35.245780 ], [ -84.170416, 35.245779 ], [ -84.177016, 35.242379 ], [ -84.178516, 35.240679 ], [ -84.188417, 35.239979 ], [ -84.192217, 35.243079 ], [ -84.199117, 35.243679 ], [ -84.200117, 35.244679 ], [ -84.201717, 35.247779 ], [ -84.202879, 35.255772 ], [ -84.205317, 35.258279 ], [ -84.205517, 35.259679 ], [ -84.211818, 35.266078 ], [ -84.216318, 35.267978 ], [ -84.223718, 35.269078 ], [ -84.227818, 35.267878 ], [ -84.231818, 35.264778 ], [ -84.240219, 35.255178 ], [ -84.243019, 35.253178 ], [ -84.252819, 35.249477 ], [ -84.257719, 35.246177 ], [ -84.260319, 35.241877 ], [ -84.275420, 35.234777 ], [ -84.282520, 35.227877 ], [ -84.283220, 35.226577 ], [ -84.287982, 35.224468 ], [ -84.289621, 35.224677 ], [ -84.290240, 35.225572 ], [ -84.292321, 35.206677 ], [ -84.295238, 35.182442 ], [ -84.298006, 35.167468 ], [ -84.304809, 35.121702 ], [ -84.308437, 35.093173 ], [ -84.308576, 35.092761 ], [ -84.310022, 35.078883 ], [ -84.321869, 34.988408 ], [ -84.393935, 34.988068 ], [ -84.394903, 34.988030 ], [ -84.509052, 34.988033 ], [ -84.509886, 34.988010 ], [ -84.621483, 34.988329 ], [ -84.624933, 34.987978 ], [ -84.727434, 34.988020 ], [ -84.731022, 34.988088 ], [ -84.808127, 34.987592 ], [ -84.809184, 34.987569 ], [ -84.810742, 34.987615 ], [ -84.817279, 34.987753 ], [ -84.820478, 34.987913 ], [ -84.824010, 34.987707 ], [ -84.831799, 34.988004 ], [ -84.858032, 34.987746 ], [ -84.861314, 34.987791 ], [ -84.939306, 34.987916 ], [ -84.944420, 34.987864 ], [ -84.955623, 34.987830 ], [ -84.979860, 34.987647 ], [ -85.045052, 34.986859 ], [ -85.045183, 34.986883 ], [ -85.180553, 34.986075 ], [ -85.185905, 34.985995 ], [ -85.216554, 34.985675 ], [ -85.217854, 34.985675 ], [ -85.220554, 34.985575 ], [ -85.221854, 34.985475 ], [ -85.230354, 34.985475 ], [ -85.235555, 34.985475 ], [ -85.254955, 34.985175 ], [ -85.265055, 34.985075 ], [ -85.275856, 34.984975 ], [ -85.277556, 34.984975 ], [ -85.294500, 34.984651 ], [ -85.301488, 34.984475 ], [ -85.305457, 34.984475 ], [ -85.308257, 34.984375 ], [ -85.363919, 34.983375 ], [ -85.384967, 34.982987 ], [ -85.466713, 34.982972 ], [ -85.605165, 34.984678 ], [ -85.824411, 34.988142 ], [ -85.828724, 34.988165 ], [ -86.311274, 34.991098 ], [ -86.397203, 34.991660 ], [ -86.433927, 34.991085 ], [ -86.467798, 34.990692 ], [ -86.528485, 34.990677 ], [ -86.555864, 34.990971 ], [ -86.571217, 34.991011 ], [ -86.588962, 34.991197 ], [ -86.600039, 34.991240 ], [ -86.641212, 34.991740 ], [ -86.659610, 34.991792 ], [ -86.670853, 34.992000 ], [ -86.674360, 34.992001 ], [ -86.676726, 34.992070 ], [ -86.677616, 34.992070 ], [ -86.783648, 34.991925 ], [ -86.820657, 34.991764 ], [ -86.836370, 34.991764 ], [ -86.846466, 34.991860 ], [ -86.849794, 34.991924 ], [ -86.862147, 34.991956 ], [ -86.967120, 34.994400 ], [ -86.970236, 34.994546 ], [ -86.972613, 34.994610 ], [ -86.974412, 34.994513 ], [ -87.000007, 34.995121 ], [ -87.011174, 34.995162 ], [ -87.210759, 34.999024 ], [ -87.216683, 34.999148 ], [ -87.230544, 34.999484 ], [ -87.270014, 35.000390 ], [ -87.299185, 35.000915 ], [ -87.349251, 35.001662 ], [ -87.359281, 35.001823 ], [ -87.381071, 35.002118 ], [ -87.391314, 35.002374 ], [ -87.417400, 35.002669 ], [ -87.421543, 35.002679 ], [ -87.428613, 35.002795 ], [ -87.625025, 35.003732 ], [ -87.664123, 35.003523 ], [ -87.671405, 35.003537 ], [ -87.696834, 35.003852 ], [ -87.700543, 35.003988 ], [ -87.702321, 35.003945 ], [ -87.709491, 35.004089 ], [ -87.758890, 35.004711 ], [ -87.767602, 35.004783 ], [ -87.773586, 35.004946 ], [ -87.851886, 35.005656 ], [ -87.853411, 35.005576 ], [ -87.853528, 35.005541 ], [ -87.872626, 35.005571 ], [ -87.877742, 35.005512 ], [ -87.877969, 35.005468 ], [ -88.000032, 35.005939 ], [ -88.202959, 35.008028 ], [ -88.201987, 35.005421 ], [ -88.200820, 34.997774 ], [ -88.200064, 34.995634 ], [ -88.253825, 34.995553 ], [ -88.258111, 34.995463 ], [ -88.380508, 34.995610 ], [ -88.469801, 34.996052 ], [ -88.469877, 34.996033 ], [ -88.786612, 34.995252 ], [ -88.851037, 34.995085 ], [ -88.886979, 34.995868 ], [ -88.925241, 34.994842 ], [ -89.026540, 34.994956 ], [ -89.138997, 34.994330 ], [ -89.139136, 34.994307 ], [ -89.156827, 34.993926 ], [ -89.198288, 34.994484 ], [ -89.217433, 34.994729 ], [ -89.434954, 34.993754 ], [ -89.486897, 34.993975 ], [ -89.493739, 34.994361 ], [ -89.511153, 34.994755 ], [ -89.644282, 34.995293 ], [ -89.741785, 34.995194 ], [ -89.795187, 34.994293 ], [ -89.848488, 34.994193 ], [ -89.883365, 34.994261 ], [ -89.893402, 34.994356 ], [ -90.309297, 34.995694 ], [ -90.310298, 35.004295 ], [ -90.309877, 35.009750 ], [ -90.306897, 35.018194 ], [ -90.300697, 35.028793 ], [ -90.297296, 35.037893 ], [ -90.295596, 35.040093 ], [ -90.291996, 35.041793 ], [ -90.265296, 35.040293 ], [ -90.263796, 35.039593 ], [ -90.263396, 35.037493 ], [ -90.262396, 35.036393 ], [ -90.256495, 35.034493 ], [ -90.230611, 35.031320 ], [ -90.224791, 35.029961 ], [ -90.216258, 35.026049 ], [ -90.214382, 35.025795 ], [ -90.209397, 35.026546 ], [ -90.200124, 35.032813 ], [ -90.196095, 35.037400 ], [ -90.196860, 35.043667 ], [ -90.197146, 35.050731 ], [ -90.196583, 35.056137 ], [ -90.195133, 35.061793 ], [ -90.181387, 35.091401 ], [ -90.176843, 35.112088 ], [ -90.173603, 35.118073 ], [ -90.165328, 35.125228 ], [ -90.160058, 35.128830 ], [ -90.155994, 35.130991 ], [ -90.144691, 35.134984 ], [ -90.142794, 35.135091 ], [ -90.139024, 35.133995 ], [ -90.109393, 35.118891 ], [ -90.100593, 35.116691 ], [ -90.090610, 35.118287 ], [ -90.086710, 35.119779 ], [ -90.083420, 35.121670 ], [ -90.071192, 35.131591 ], [ -90.066591, 35.135990 ], [ -90.065392, 35.137691 ], [ -90.064612, 35.140621 ], [ -90.066482, 35.151074 ], [ -90.066958, 35.151839 ], [ -90.069402, 35.153646 ], [ -90.090371, 35.156270 ], [ -90.092944, 35.157228 ], [ -90.096549, 35.160976 ], [ -90.099777, 35.164474 ], [ -90.103216, 35.167980 ], [ -90.105525, 35.170695 ], [ -90.108075, 35.174571 ], [ -90.109177, 35.178451 ], [ -90.111091, 35.178639 ], [ -90.114214, 35.181691 ], [ -90.117393, 35.187890 ], [ -90.117542, 35.190570 ], [ -90.116182, 35.198498 ], [ -90.109076, 35.199105 ], [ -90.097408, 35.194794 ], [ -90.096466, 35.194848 ], [ -90.093285, 35.203282 ], [ -90.088597, 35.212376 ], [ -90.084120, 35.210423 ], [ -90.081173, 35.208153 ], [ -90.076820, 35.208817 ], [ -90.074271, 35.211504 ], [ -90.074155, 35.217070 ], [ -90.074920, 35.220452 ], [ -90.076879, 35.224405 ], [ -90.078750, 35.227806 ], [ -90.082939, 35.231824 ], [ -90.086322, 35.235719 ], [ -90.090892, 35.242189 ], [ -90.097947, 35.249983 ], [ -90.099490, 35.251393 ], [ -90.105093, 35.254288 ], [ -90.110106, 35.255456 ], [ -90.116493, 35.255788 ], [ -90.123593, 35.254989 ], [ -90.132116, 35.253180 ], [ -90.140394, 35.252289 ], [ -90.152094, 35.255989 ], [ -90.158865, 35.262577 ], [ -90.166594, 35.274588 ], [ -90.168794, 35.279088 ], [ -90.168871, 35.281997 ], [ -90.165194, 35.293188 ], [ -90.163812, 35.296115 ], [ -90.161225, 35.298951 ], [ -90.158913, 35.300637 ], [ -90.153394, 35.302588 ], [ -90.149794, 35.303288 ], [ -90.139504, 35.298828 ], [ -90.132393, 35.300488 ], [ -90.123707, 35.304530 ], [ -90.121864, 35.304535 ], [ -90.117219, 35.303384 ], [ -90.109093, 35.304987 ], [ -90.106824, 35.324618 ], [ -90.103862, 35.332405 ], [ -90.110293, 35.342786 ], [ -90.108817, 35.342587 ], [ -90.107312, 35.343143 ], [ -90.100294, 35.351619 ], [ -90.096825, 35.357216 ], [ -90.093492, 35.360486 ], [ -90.090492, 35.360886 ], [ -90.087903, 35.363270 ], [ -90.083824, 35.368798 ], [ -90.074992, 35.384152 ], [ -90.077971, 35.384501 ], [ -90.079930, 35.385272 ], [ -90.087743, 35.390838 ], [ -90.093589, 35.393333 ], [ -90.096650, 35.395257 ], [ -90.104842, 35.401487 ], [ -90.106775, 35.403339 ], [ -90.110543, 35.408595 ], [ -90.112504, 35.410153 ], [ -90.116902, 35.411692 ], [ -90.130475, 35.413745 ], [ -90.135125, 35.412977 ], [ -90.137881, 35.411510 ], [ -90.141660, 35.408563 ], [ -90.143448, 35.406671 ], [ -90.145085, 35.403757 ], [ -90.146191, 35.399468 ], [ -90.145870, 35.395079 ], [ -90.143475, 35.387602 ], [ -90.135510, 35.376668 ], [ -90.144924, 35.374633 ], [ -90.166246, 35.374745 ], [ -90.172388, 35.377681 ], [ -90.178341, 35.382092 ], [ -90.179265, 35.385194 ], [ -90.170700, 35.410065 ], [ -90.170599, 35.418352 ], [ -90.169002, 35.421853 ], [ -90.129448, 35.441931 ], [ -90.123142, 35.459853 ], [ -90.120619, 35.465741 ], [ -90.118390, 35.468791 ], [ -90.114412, 35.472467 ], [ -90.107723, 35.476935 ], [ -90.101759, 35.476889 ], [ -90.098719, 35.478595 ], [ -90.085009, 35.478835 ], [ -90.080128, 35.476844 ], [ -90.072154, 35.470752 ], [ -90.067798, 35.466224 ], [ -90.067138, 35.464833 ], [ -90.067206, 35.460957 ], [ -90.071327, 35.450338 ], [ -90.074063, 35.439611 ], [ -90.074082, 35.433983 ], [ -90.070549, 35.423291 ], [ -90.062018, 35.415180 ], [ -90.069283, 35.408306 ], [ -90.054585, 35.389604 ], [ -90.044856, 35.392964 ], [ -90.041563, 35.396620 ], [ -90.045104, 35.397317 ], [ -90.056644, 35.403786 ], [ -90.046598, 35.412966 ], [ -90.045306, 35.415435 ], [ -90.044216, 35.419231 ], [ -90.042640, 35.421237 ], [ -90.040570, 35.422925 ], [ -90.031584, 35.427662 ], [ -90.031267, 35.431576 ], [ -90.029310, 35.435245 ], [ -90.027370, 35.437890 ], [ -90.026584, 35.440103 ], [ -90.026899, 35.444869 ], [ -90.026604, 35.447788 ], [ -90.024247, 35.454260 ], [ -90.022064, 35.457375 ], [ -90.018842, 35.464816 ], [ -90.018998, 35.467803 ], [ -90.020386, 35.470257 ], [ -90.034976, 35.480705 ], [ -90.043517, 35.492298 ], [ -90.045805, 35.496533 ], [ -90.048519, 35.504357 ], [ -90.050277, 35.515275 ], [ -90.049090, 35.522257 ], [ -90.046227, 35.529592 ], [ -90.044748, 35.531657 ], [ -90.041962, 35.537468 ], [ -90.039744, 35.548041 ], [ -90.037615, 35.550329 ], [ -90.032938, 35.553440 ], [ -90.028620, 35.555249 ], [ -90.023903, 35.556336 ], [ -90.017312, 35.555996 ], [ -90.011262, 35.559105 ], [ -90.008293, 35.560065 ], [ -89.998996, 35.561160 ], [ -89.992975, 35.560774 ], [ -89.989363, 35.560043 ], [ -89.976310, 35.553872 ], [ -89.958498, 35.541703 ], [ -89.956706, 35.539369 ], [ -89.955641, 35.534518 ], [ -89.955780, 35.533214 ], [ -89.957739, 35.530125 ], [ -89.957715, 35.527192 ], [ -89.956347, 35.525594 ], [ -89.951248, 35.521866 ], [ -89.948010, 35.520090 ], [ -89.945026, 35.519388 ], [ -89.933614, 35.518538 ], [ -89.923161, 35.514428 ], [ -89.919331, 35.513870 ], [ -89.915400, 35.515119 ], [ -89.911931, 35.517410 ], [ -89.909022, 35.520548 ], [ -89.907660, 35.522944 ], [ -89.903882, 35.534175 ], [ -89.904392, 35.535701 ], [ -89.905582, 35.536774 ], [ -89.908826, 35.538031 ], [ -89.910787, 35.538718 ], [ -89.910885, 35.541072 ], [ -89.909923, 35.544037 ], [ -89.910789, 35.547515 ], [ -89.914177, 35.549713 ], [ -89.917424, 35.550308 ], [ -89.924145, 35.550561 ], [ -89.929101, 35.551545 ], [ -89.941393, 35.556555 ], [ -89.944754, 35.560308 ], [ -89.946911, 35.563580 ], [ -89.954196, 35.576050 ], [ -89.956690, 35.581426 ], [ -89.957924, 35.585499 ], [ -89.957896, 35.587261 ], [ -89.956749, 35.590511 ], [ -89.954145, 35.594264 ], [ -89.951147, 35.597491 ], [ -89.945405, 35.601611 ], [ -89.932500, 35.607865 ], [ -89.919619, 35.612236 ], [ -89.912172, 35.617055 ], [ -89.910687, 35.617536 ], [ -89.906029, 35.616145 ], [ -89.899789, 35.615061 ], [ -89.896999, 35.614882 ], [ -89.894346, 35.615535 ], [ -89.876548, 35.626653 ], [ -89.863875, 35.630788 ], [ -89.856619, 35.634444 ], [ -89.853890, 35.638261 ], [ -89.851825, 35.644262 ], [ -89.850863, 35.650208 ], [ -89.851176, 35.657432 ], [ -89.853510, 35.663034 ], [ -89.858935, 35.669060 ], [ -89.861277, 35.670064 ], [ -89.864782, 35.670385 ], [ -89.872078, 35.668487 ], [ -89.877158, 35.666136 ], [ -89.878534, 35.664820 ], [ -89.882893, 35.657463 ], [ -89.884932, 35.655107 ], [ -89.886979, 35.653637 ], [ -89.890510, 35.652408 ], [ -89.898916, 35.650904 ], [ -89.906147, 35.651145 ], [ -89.915427, 35.652782 ], [ -89.922749, 35.655293 ], [ -89.931036, 35.660044 ], [ -89.937383, 35.665711 ], [ -89.942700, 35.675121 ], [ -89.950161, 35.682433 ], [ -89.953303, 35.686418 ], [ -89.955753, 35.690621 ], [ -89.956589, 35.695486 ], [ -89.956933, 35.711677 ], [ -89.958882, 35.723834 ], [ -89.958687, 35.727706 ], [ -89.956254, 35.733386 ], [ -89.953983, 35.736160 ], [ -89.950278, 35.738493 ], [ -89.915491, 35.754917 ], [ -89.913132, 35.757302 ], [ -89.909996, 35.759396 ], [ -89.905538, 35.759063 ], [ -89.888163, 35.750077 ], [ -89.883535, 35.744984 ], [ -89.877256, 35.741369 ], [ -89.872845, 35.741299 ], [ -89.863874, 35.747592 ], [ -89.857707, 35.750077 ], [ -89.846343, 35.755732 ], [ -89.832895, 35.754905 ], [ -89.824923, 35.755715 ], [ -89.821216, 35.756716 ], [ -89.814456, 35.759941 ], [ -89.812891, 35.761154 ], [ -89.809280, 35.764379 ], [ -89.799249, 35.775439 ], [ -89.797231, 35.780117 ], [ -89.797053, 35.782648 ], [ -89.799331, 35.788503 ], [ -89.796324, 35.792807 ], [ -89.781793, 35.805084 ], [ -89.765457, 35.809513 ], [ -89.765442, 35.811214 ], [ -89.757874, 35.810415 ], [ -89.743025, 35.805817 ], [ -89.734044, 35.806174 ], [ -89.723426, 35.809382 ], [ -89.719915, 35.811557 ], [ -89.706085, 35.818260 ], [ -89.703875, 35.820281 ], [ -89.701750, 35.824238 ], [ -89.701045, 35.828227 ], [ -89.701407, 35.830985 ], [ -89.702883, 35.834153 ], [ -89.704351, 35.835726 ], [ -89.709261, 35.838911 ], [ -89.729517, 35.847632 ], [ -89.749424, 35.852955 ], [ -89.764343, 35.858313 ], [ -89.769413, 35.861558 ], [ -89.772467, 35.865098 ], [ -89.773294, 35.867426 ], [ -89.773564, 35.871697 ], [ -89.772855, 35.876244 ], [ -89.771726, 35.879724 ], [ -89.768743, 35.886663 ], [ -89.765689, 35.891299 ], [ -89.756312, 35.898060 ], [ -89.741241, 35.906749 ], [ -89.714934, 35.906247 ], [ -89.688141, 35.896946 ], [ -89.681820, 35.889990 ], [ -89.677012, 35.885720 ], [ -89.669553, 35.883281 ], [ -89.665672, 35.883301 ], [ -89.657771, 35.885750 ], [ -89.655452, 35.886912 ], [ -89.650680, 35.890880 ], [ -89.647270, 35.894920 ], [ -89.644838, 35.904351 ], [ -89.646711, 35.908008 ], [ -89.650340, 35.917795 ], [ -89.652279, 35.921462 ], [ -89.656147, 35.925810 ], [ -89.671117, 35.935795 ], [ -89.676621, 35.940539 ], [ -89.686924, 35.947716 ], [ -89.699871, 35.954063 ], [ -89.710227, 35.959826 ], [ -89.714565, 35.963034 ], [ -89.718796, 35.968283 ], [ -89.719679, 35.970939 ], [ -89.719970, 35.974620 ], [ -89.718801, 35.985015 ], [ -89.719168, 35.985976 ], [ -89.728442, 35.993568 ], [ -89.731218, 35.996879 ], [ -89.733095, 36.000608 ], [ -89.706932, 36.000981 ], [ -89.705677, 36.005018 ], [ -89.703571, 36.008040 ], [ -89.692437, 36.020507 ], [ -89.688577, 36.029238 ], [ -89.687254, 36.034048 ], [ -89.684439, 36.051719 ], [ -89.681946, 36.072336 ], [ -89.680029, 36.082494 ], [ -89.678821, 36.084636 ], [ -89.672463, 36.091837 ], [ -89.666598, 36.095802 ], [ -89.657709, 36.099128 ], [ -89.643020, 36.103620 ], [ -89.628305, 36.106853 ], [ -89.625078, 36.108131 ], [ -89.615128, 36.113816 ], [ -89.601936, 36.119470 ], [ -89.598946, 36.121778 ], [ -89.594000, 36.127190 ], [ -89.593070, 36.129699 ], [ -89.592102, 36.135637 ], [ -89.591605, 36.144096 ], [ -89.592206, 36.150120 ], [ -89.594397, 36.155457 ], [ -89.600871, 36.164558 ], [ -89.607004, 36.171179 ], [ -89.618228, 36.179966 ], [ -89.623804, 36.183128 ], [ -89.629452, 36.185382 ], [ -89.636893, 36.188951 ], [ -89.644790, 36.194101 ], [ -89.654876, 36.201530 ], [ -89.664144, 36.206520 ], [ -89.679548, 36.215911 ], [ -89.692630, 36.224959 ], [ -89.699677, 36.230821 ], [ -89.704459, 36.235468 ], [ -89.705250, 36.236568 ], [ -89.705545, 36.238136 ], [ -89.705328, 36.239898 ], [ -89.703511, 36.243412 ], [ -89.699817, 36.248384 ], [ -89.698568, 36.250591 ], [ -89.695235, 36.252766 ], [ -89.691308, 36.252079 ], [ -89.686229, 36.249507 ], [ -89.678046, 36.248284 ], [ -89.652518, 36.250692 ], [ -89.642182, 36.249486 ], [ -89.636790, 36.248079 ], [ -89.624416, 36.243305 ], [ -89.611145, 36.239271 ], [ -89.606510, 36.238328 ], [ -89.602374, 36.238106 ], [ -89.587326, 36.239484 ], [ -89.577544, 36.242262 ], [ -89.573928, 36.243843 ], [ -89.564997, 36.250067 ], [ -89.562206, 36.250909 ], [ -89.557991, 36.251037 ], [ -89.553563, 36.250341 ], [ -89.548952, 36.248200 ], [ -89.544743, 36.247484 ], [ -89.541621, 36.247891 ], [ -89.539229, 36.248821 ], [ -89.534745, 36.252576 ], [ -89.534507, 36.261802 ], [ -89.535529, 36.270541 ], [ -89.537675, 36.275279 ], [ -89.539487, 36.277368 ], [ -89.544797, 36.280458 ], [ -89.546577, 36.280439 ], [ -89.549219, 36.278750 ], [ -89.554289, 36.277751 ], [ -89.578492, 36.288317 ], [ -89.584337, 36.293340 ], [ -89.589820, 36.296814 ], [ -89.611819, 36.309088 ], [ -89.619242, 36.320726 ], [ -89.620255, 36.323006 ], [ -89.619800, 36.329546 ], [ -89.615841, 36.336085 ], [ -89.610689, 36.340442 ], [ -89.605668, 36.342234 ], [ -89.600544, 36.342985 ], [ -89.581636, 36.342357 ], [ -89.560439, 36.337746 ], [ -89.545006, 36.336809 ], [ -89.538079, 36.337496 ], [ -89.531822, 36.339246 ], [ -89.527029, 36.341679 ], [ -89.522695, 36.344789 ], [ -89.519000, 36.348600 ], [ -89.513178, 36.359897 ], [ -89.509722, 36.373626 ], [ -89.509558, 36.375065 ], [ -89.510380, 36.378356 ], [ -89.513956, 36.384891 ], [ -89.525293, 36.400446 ], [ -89.542337, 36.420103 ], [ -89.544221, 36.423684 ], [ -89.545255, 36.427079 ], [ -89.545503, 36.430700 ], [ -89.545061, 36.434915 ], [ -89.543406, 36.438770 ], [ -89.540868, 36.441559 ], [ -89.527274, 36.451545 ], [ -89.525190, 36.453991 ], [ -89.523427, 36.456572 ], [ -89.521021, 36.461934 ], [ -89.519720, 36.467002 ], [ -89.519501, 36.475419 ], [ -89.520642, 36.478668 ], [ -89.522674, 36.481305 ], [ -89.534524, 36.491432 ], [ -89.539100, 36.498201 ], [ -89.498036, 36.497887 ], [ -89.492537, 36.497775 ], [ -89.485106, 36.497692 ], [ -89.486710, 36.494954 ], [ -89.493495, 36.478700 ], [ -89.494248, 36.475972 ], [ -89.494074, 36.473225 ], [ -89.493198, 36.470124 ], [ -89.490670, 36.465528 ], [ -89.486215, 36.461620 ], [ -89.476532, 36.457846 ], [ -89.471718, 36.457001 ], [ -89.464153, 36.457189 ], [ -89.460436, 36.458140 ], [ -89.453081, 36.461285 ], [ -89.448468, 36.464420 ], [ -89.436763, 36.474432 ], [ -89.429311, 36.481875 ], [ -89.422942, 36.489381 ], [ -89.419770, 36.493896 ], [ -89.417293, 36.499033 ], [ -89.403913, 36.499141 ], [ -89.391044, 36.499079 ], [ -89.381792, 36.500062 ], [ -89.380085, 36.500416 ], [ -89.356593, 36.502195 ], [ -89.346053, 36.503210 ], [ -89.300284, 36.507147 ], [ -89.282298, 36.506782 ], [ -89.279091, 36.506511 ], [ -89.211409, 36.505630 ], [ -89.163429, 36.504526 ], [ -89.163224, 36.504522 ], [ -89.119805, 36.503647 ], [ -89.117537, 36.503603 ], [ -89.090146, 36.503392 ], [ -89.072118, 36.503249 ], [ -89.058871, 36.503157 ], [ -89.034649, 36.502964 ], [ -89.010439, 36.502710 ], [ -89.006825, 36.502684 ], [ -89.000063, 36.502633 ], [ -88.964471, 36.502191 ], [ -88.899510, 36.502218 ], [ -88.884557, 36.501704 ], [ -88.874725, 36.502446 ], [ -88.834626, 36.502914 ], [ -88.827012, 36.502850 ], [ -88.799594, 36.502757 ], [ -88.747523, 36.502834 ], [ -88.715255, 36.502662 ], [ -88.661133, 36.502243 ], [ -88.577283, 36.501940 ], [ -88.545192, 36.501814 ], [ -88.516427, 36.501430 ], [ -88.512270, 36.501506 ], [ -88.511920, 36.501457 ], [ -88.489210, 36.501068 ], [ -88.472564, 36.501028 ], [ -88.452543, 36.500872 ], [ -88.450161, 36.501101 ], [ -88.416360, 36.500756 ], [ -88.330799, 36.500531 ], [ -88.325895, 36.500483 ], [ -88.320794, 36.500432 ], [ -88.127378, 36.498540 ], [ -88.053205, 36.497129 ], [ -88.050466, 36.500053 ], [ -88.045304, 36.504081 ], [ -88.039481, 36.510408 ], [ -88.037822, 36.513850 ], [ -88.037329, 36.517830 ], [ -88.037830, 36.521015 ], [ -88.037270, 36.523783 ], [ -88.035854, 36.525912 ], [ -88.034132, 36.531120 ], [ -88.032489, 36.540662 ], [ -88.033802, 36.551733 ], [ -88.035625, 36.561736 ], [ -88.039625, 36.572783 ], [ -88.041196, 36.584123 ], [ -88.045127, 36.602939 ], [ -88.055738, 36.630475 ], [ -88.055604, 36.635710 ], [ -88.057042, 36.640540 ], [ -88.058580, 36.643315 ], [ -88.064401, 36.650854 ], [ -88.068208, 36.659747 ], [ -88.070532, 36.678118 ], [ -88.044772, 36.677983 ], [ -88.011792, 36.677025 ], [ -87.872062, 36.665089 ], [ -87.849567, 36.663701 ], [ -87.853204, 36.633247 ], [ -87.744768, 36.636151 ], [ -87.641150, 36.638036 ], [ -87.564928, 36.639113 ], [ -87.563052, 36.639113 ], [ -87.436509, 36.640747 ], [ -87.425009, 36.641047 ], [ -87.414309, 36.641047 ], [ -87.347796, 36.641440 ], [ -87.344131, 36.641510 ], [ -87.281506, 36.641761 ], [ -87.278398, 36.641718 ], [ -87.247655, 36.641841 ], [ -87.231037, 36.641888 ], [ -87.230530, 36.641895 ], [ -87.114976, 36.642414 ], [ -87.011522, 36.643949 ], [ -86.906583, 36.646255 ], [ -86.906023, 36.646302 ], [ -86.854268, 36.646884 ], [ -86.833155, 36.647210 ], [ -86.818405, 36.647639 ], [ -86.816186, 36.647722 ], [ -86.813037, 36.647647 ], [ -86.758920, 36.649018 ], [ -86.713786, 36.649341 ], [ -86.606394, 36.652107 ], [ -86.605042, 36.652125 ], [ -86.589906, 36.652486 ], [ -86.564143, 36.633472 ], [ -86.551292, 36.637985 ], [ -86.550054, 36.644817 ], [ -86.543388, 36.643890 ], [ -86.543777, 36.640536 ], [ -86.507771, 36.652445 ], [ -86.473497, 36.651671 ], [ -86.473413, 36.651676 ], [ -86.472190, 36.651763 ], [ -86.468497, 36.651841 ], [ -86.374991, 36.649803 ], [ -86.373784, 36.650126 ], [ -86.359073, 36.649845 ], [ -86.333051, 36.648778 ], [ -86.293357, 36.645356 ], [ -86.222151, 36.640891 ], [ -86.219081, 36.640824 ], [ -86.216410, 36.640595 ], [ -86.216183, 36.640527 ], [ -86.204859, 36.639741 ], [ -86.197573, 36.639363 ], [ -86.081944, 36.633848 ], [ -86.080666, 36.633940 ], [ -86.038366, 36.630804 ], [ -86.033139, 36.630413 ], [ -86.032770, 36.630367 ], [ -85.959981, 36.628121 ], [ -85.873857, 36.623642 ], [ -85.832172, 36.622046 ], [ -85.801490, 36.622418 ], [ -85.788645, 36.621846 ], [ -85.731862, 36.620429 ], [ -85.677789, 36.618157 ], [ -85.552017, 36.615782 ], [ -85.551483, 36.615727 ], [ -85.488353, 36.614994 ], [ -85.430123, 36.618952 ], [ -85.334124, 36.622951 ], [ -85.324654, 36.624550 ], [ -85.300402, 36.624437 ], [ -85.296073, 36.625824 ], [ -85.290627, 36.626450 ], [ -85.276289, 36.626511 ], [ -85.195372, 36.625498 ], [ -85.096128, 36.622483 ], [ -85.086415, 36.621913 ], [ -85.024627, 36.619354 ], [ -84.986448, 36.616668 ], [ -84.943948, 36.612569 ], [ -84.859738, 36.606495 ], [ -84.859759, 36.606428 ], [ -84.843091, 36.605127 ], [ -84.803744, 36.604265 ], [ -84.785341, 36.603372 ], [ -84.624939, 36.599575 ], [ -84.543138, 36.596277 ], [ -84.499938, 36.596678 ], [ -84.442837, 36.596079 ], [ -84.271176, 36.591882 ], [ -84.261333, 36.591981 ], [ -84.227332, 36.592181 ], [ -84.127503, 36.591413 ], [ -83.987842, 36.589600 ], [ -83.894421, 36.586481 ], [ -83.789017, 36.583881 ], [ -83.690714, 36.582581 ], [ -83.688814, 36.584382 ], [ -83.687514, 36.587182 ], [ -83.683014, 36.592182 ], [ -83.679514, 36.594082 ], [ -83.677114, 36.596582 ], [ -83.675614, 36.598582 ], [ -83.675413, 36.600814 ], [ -83.670141, 36.600797 ], [ -83.670128, 36.600764 ], [ -83.645586, 36.600002 ], [ -83.622624, 36.598061 ], [ -83.556810, 36.597384 ], [ -83.472108, 36.597284 ], [ -83.374904, 36.597386 ], [ -83.276300, 36.598187 ], [ -83.261099, 36.593887 ], [ -83.250304, 36.593935 ], [ -83.249899, 36.593898 ], [ -83.248933, 36.593827 ], [ -83.028357, 36.593893 ], [ -83.027250, 36.593847 ], [ -82.888013, 36.593461 ], [ -82.830433, 36.593761 ], [ -82.695780, 36.593698 ], [ -82.679879, 36.593698 ], [ -82.609176, 36.594099 ], [ -82.561074, 36.594800 ], [ -82.559774, 36.594800 ], [ -82.554294, 36.594876 ], [ -82.487238, 36.595822 ], [ -82.478668, 36.595588 ], [ -82.466613, 36.594481 ], [ -82.296995, 36.595704 ], [ -82.226653, 36.595743 ], [ -82.225716, 36.595744 ], [ -82.223445, 36.595721 ], [ -82.221713, 36.595814 ], [ -82.211005, 36.595860 ], [ -82.210497, 36.595772 ], [ -82.188491, 36.595179 ], [ -82.180740, 36.594928 ], [ -82.177247, 36.594768 ], [ -82.173982, 36.594607 ], [ -82.150727, 36.594673 ], [ -82.148569, 36.594718 ], [ -81.934144, 36.594213 ], [ -81.922644, 36.616213 ], [ -81.826742, 36.614215 ], [ -81.736940, 36.612379 ], [ -81.646900, 36.611918 ], [ -81.677535, 36.588117 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US48", "STATE": "48", "NAME": "Texas", "LSAD": "", "CENSUSAREA": 261231.711000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -97.134356, 27.896329 ], [ -97.133600, 27.897445 ], [ -97.132473, 27.897767 ], [ -97.130145, 27.897522 ], [ -97.113127, 27.893137 ], [ -97.110173, 27.892303 ], [ -97.108609, 27.891679 ], [ -97.107511, 27.890378 ], [ -97.107588, 27.888880 ], [ -97.108157, 27.887107 ], [ -97.108921, 27.886308 ], [ -97.113442, 27.883619 ], [ -97.115165, 27.882853 ], [ -97.116078, 27.882596 ], [ -97.117779, 27.882668 ], [ -97.118950, 27.884121 ], [ -97.118788, 27.885420 ], [ -97.118788, 27.886130 ], [ -97.118667, 27.886341 ], [ -97.129022, 27.889029 ], [ -97.132489, 27.888889 ], [ -97.133166, 27.888991 ], [ -97.134344, 27.889407 ], [ -97.135065, 27.890900 ], [ -97.135132, 27.891827 ], [ -97.134988, 27.894559 ], [ -97.134685, 27.895770 ], [ -97.134356, 27.896329 ] ] ], [ [ [ -96.849624, 28.064939 ], [ -96.929053, 27.990440 ], [ -96.966996, 27.950531 ], [ -97.001441, 27.911442 ], [ -97.031660, 27.869975 ], [ -97.041799, 27.852926 ], [ -97.045980, 27.835004 ], [ -97.085395, 27.793245 ], [ -97.116277, 27.752599 ], [ -97.166682, 27.676583 ], [ -97.201866, 27.614858 ], [ -97.276091, 27.472145 ], [ -97.304470, 27.407734 ], [ -97.326523, 27.347612 ], [ -97.350398, 27.268105 ], [ -97.363401, 27.210366 ], [ -97.370941, 27.161166 ], [ -97.377001, 27.101021 ], [ -97.379130, 27.047996 ], [ -97.378362, 26.992877 ], [ -97.370731, 26.909706 ], [ -97.364726, 26.871693 ], [ -97.351413, 26.808604 ], [ -97.333028, 26.736479 ], [ -97.300690, 26.635375 ], [ -97.275119, 26.565415 ], [ -97.269392, 26.554046 ], [ -97.229844, 26.433569 ], [ -97.194644, 26.306513 ], [ -97.185844, 26.267103 ], [ -97.173265, 26.192314 ], [ -97.161471, 26.088705 ], [ -97.154271, 26.066841 ], [ -97.161462, 26.067640 ], [ -97.169842, 26.077853 ], [ -97.171781, 26.102522 ], [ -97.179532, 26.146202 ], [ -97.178746, 26.177103 ], [ -97.183983, 26.214289 ], [ -97.194458, 26.271640 ], [ -97.214885, 26.353606 ], [ -97.226931, 26.385555 ], [ -97.240286, 26.405981 ], [ -97.243167, 26.434263 ], [ -97.247619, 26.456261 ], [ -97.254166, 26.471188 ], [ -97.262546, 26.482972 ], [ -97.276425, 26.521729 ], [ -97.292399, 26.528014 ], [ -97.310730, 26.556558 ], [ -97.308112, 26.571223 ], [ -97.308635, 26.576723 ], [ -97.317015, 26.597673 ], [ -97.324872, 26.611814 ], [ -97.338489, 26.647429 ], [ -97.336394, 26.666022 ], [ -97.345822, 26.700589 ], [ -97.363105, 26.710540 ], [ -97.370438, 26.723896 ], [ -97.370961, 26.736204 ], [ -97.367557, 26.740394 ], [ -97.364153, 26.758987 ], [ -97.364646, 26.767122 ], [ -97.368866, 26.774699 ], [ -97.370438, 26.781508 ], [ -97.368343, 26.795649 ], [ -97.373056, 26.808481 ], [ -97.387459, 26.820789 ], [ -97.383531, 26.875521 ], [ -97.385626, 26.888876 ], [ -97.391649, 26.901970 ], [ -97.389554, 26.945965 ], [ -97.390340, 27.052286 ], [ -97.389816, 27.067213 ], [ -97.386412, 27.083187 ], [ -97.387459, 27.090519 ], [ -97.390602, 27.094186 ], [ -97.390078, 27.156512 ], [ -97.377508, 27.199459 ], [ -97.379865, 27.202863 ], [ -97.386674, 27.204696 ], [ -97.382222, 27.229051 ], [ -97.374890, 27.250262 ], [ -97.373318, 27.276450 ], [ -97.367033, 27.298709 ], [ -97.364676, 27.302637 ], [ -97.359963, 27.304732 ], [ -97.357606, 27.307875 ], [ -97.362320, 27.326730 ], [ -97.366771, 27.333276 ], [ -97.361796, 27.359988 ], [ -97.346607, 27.390365 ], [ -97.336132, 27.402411 ], [ -97.331157, 27.412362 ], [ -97.329585, 27.418124 ], [ -97.330895, 27.425456 ], [ -97.329847, 27.434360 ], [ -97.317277, 27.463690 ], [ -97.293709, 27.497209 ], [ -97.282972, 27.521564 ], [ -97.266474, 27.542514 ], [ -97.257832, 27.556393 ], [ -97.261760, 27.563464 ], [ -97.260451, 27.567392 ], [ -97.252071, 27.578652 ], [ -97.247619, 27.581533 ], [ -97.257656, 27.599937 ], [ -97.239784, 27.634652 ], [ -97.231383, 27.632336 ], [ -97.221955, 27.632860 ], [ -97.219075, 27.630241 ], [ -97.214099, 27.631551 ], [ -97.200743, 27.650144 ], [ -97.197339, 27.664547 ], [ -97.197601, 27.678426 ], [ -97.195080, 27.684529 ], [ -97.190007, 27.692829 ], [ -97.170628, 27.720326 ], [ -97.166176, 27.732372 ], [ -97.161200, 27.734074 ], [ -97.153606, 27.733289 ], [ -97.147321, 27.735384 ], [ -97.130823, 27.751620 ], [ -97.127942, 27.755810 ], [ -97.127681, 27.760000 ], [ -97.103326, 27.789068 ], [ -97.102279, 27.798233 ], [ -97.098874, 27.808447 ], [ -97.092851, 27.814470 ], [ -97.092589, 27.819183 ], [ -97.098874, 27.822850 ], [ -97.126109, 27.819707 ], [ -97.130299, 27.820493 ], [ -97.134489, 27.825206 ], [ -97.132394, 27.827301 ], [ -97.056713, 27.842294 ], [ -97.055822, 27.843405 ], [ -97.056068, 27.849127 ], [ -97.033383, 27.909619 ], [ -97.016384, 27.917255 ], [ -96.985745, 27.954048 ], [ -96.977889, 27.976439 ], [ -96.978805, 27.978272 ], [ -96.980900, 27.978272 ], [ -96.986007, 27.976177 ], [ -96.986661, 27.980759 ], [ -96.978282, 28.001709 ], [ -96.967807, 28.020041 ], [ -96.966759, 28.020368 ], [ -96.965188, 28.013297 ], [ -96.962569, 28.012381 ], [ -96.952618, 28.016440 ], [ -96.946988, 28.026522 ], [ -96.932454, 28.035426 ], [ -96.926430, 28.043413 ], [ -96.929573, 28.051400 ], [ -96.927085, 28.057292 ], [ -96.906004, 28.076147 ], [ -96.890947, 28.076802 ], [ -96.886233, 28.084396 ], [ -96.888328, 28.086622 ], [ -96.889113, 28.099454 ], [ -96.886887, 28.117130 ], [ -96.879424, 28.131402 ], [ -96.874972, 28.133236 ], [ -96.870782, 28.131271 ], [ -96.864628, 28.126296 ], [ -96.857165, 28.115559 ], [ -96.845380, 28.108881 ], [ -96.827049, 28.112417 ], [ -96.816574, 28.119618 ], [ -96.810420, 28.126034 ], [ -96.810944, 28.136378 ], [ -96.816836, 28.158048 ], [ -96.822859, 28.167476 ], [ -96.816443, 28.174808 ], [ -96.791958, 28.188687 ], [ -96.733037, 28.190913 ], [ -96.703838, 28.198246 ], [ -96.697422, 28.202959 ], [ -96.702659, 28.211208 ], [ -96.703314, 28.216446 ], [ -96.686816, 28.218410 ], [ -96.662462, 28.227314 ], [ -96.660628, 28.228885 ], [ -96.663116, 28.233206 ], [ -96.651856, 28.251275 ], [ -96.607992, 28.277070 ], [ -96.608123, 28.280081 ], [ -96.611527, 28.281391 ], [ -96.610480, 28.283093 ], [ -96.592934, 28.296972 ], [ -96.581019, 28.302210 ], [ -96.553260, 28.302341 ], [ -96.546975, 28.305614 ], [ -96.542131, 28.315958 ], [ -96.528906, 28.322505 ], [ -96.476269, 28.330754 ], [ -96.450998, 28.337039 ], [ -96.434108, 28.344764 ], [ -96.418919, 28.354846 ], [ -96.415253, 28.362833 ], [ -96.417217, 28.367154 ], [ -96.412896, 28.369511 ], [ -96.403206, 28.371475 ], [ -96.398932, 28.387753 ], [ -96.388277, 28.382254 ], [ -96.389480, 28.370224 ], [ -96.399469, 28.354689 ], [ -96.415248, 28.336511 ], [ -96.439099, 28.319052 ], [ -96.547774, 28.270798 ], [ -96.621534, 28.229700 ], [ -96.694666, 28.182120 ], [ -96.758141, 28.136873 ], [ -96.849624, 28.064939 ] ] ], [ [ [ -95.016627, 29.558487 ], [ -95.018253, 29.554885 ], [ -95.015165, 29.539989 ], [ -94.999581, 29.521093 ], [ -94.981916, 29.511141 ], [ -94.958443, 29.505013 ], [ -94.909465, 29.496838 ], [ -94.913385, 29.487254 ], [ -94.925914, 29.469047 ], [ -94.930861, 29.450504 ], [ -94.919401, 29.448031 ], [ -94.890800, 29.433432 ], [ -94.887300, 29.415132 ], [ -94.886741, 29.379520 ], [ -94.865336, 29.373853 ], [ -94.863790, 29.368525 ], [ -94.889042, 29.357144 ], [ -94.894234, 29.338000 ], [ -94.893994, 29.308170 ], [ -94.903985, 29.295357 ], [ -94.921593, 29.281556 ], [ -94.932539, 29.282032 ], [ -94.934442, 29.284412 ], [ -94.933966, 29.290598 ], [ -94.930635, 29.302020 ], [ -94.922069, 29.305827 ], [ -94.922069, 29.309634 ], [ -94.927304, 29.313441 ], [ -94.935394, 29.314869 ], [ -94.952526, 29.290122 ], [ -94.982032, 29.268231 ], [ -95.005826, 29.242057 ], [ -95.022482, 29.229684 ], [ -95.025338, 29.225877 ], [ -95.030097, 29.213028 ], [ -95.099101, 29.173529 ], [ -95.108619, 29.172101 ], [ -95.120992, 29.172101 ], [ -95.121944, 29.175908 ], [ -95.111474, 29.182571 ], [ -95.110522, 29.186378 ], [ -95.112902, 29.192089 ], [ -95.119564, 29.193040 ], [ -95.132413, 29.189709 ], [ -95.146690, 29.193516 ], [ -95.148594, 29.192564 ], [ -95.150021, 29.187806 ], [ -95.148118, 29.182571 ], [ -95.151925, 29.151162 ], [ -95.161919, 29.125464 ], [ -95.165250, 29.113566 ], [ -95.136221, 29.084537 ], [ -95.128251, 29.084657 ], [ -95.125140, 29.089204 ], [ -95.122896, 29.094055 ], [ -95.092439, 29.125940 ], [ -95.020579, 29.171149 ], [ -95.003923, 29.184474 ], [ -94.991549, 29.201131 ], [ -94.919214, 29.257762 ], [ -94.885425, 29.273942 ], [ -94.879239, 29.285839 ], [ -94.865126, 29.293977 ], [ -94.849730, 29.297345 ], [ -94.824953, 29.306005 ], [ -94.822547, 29.321882 ], [ -94.822307, 29.344254 ], [ -94.810696, 29.353435 ], [ -94.784895, 29.335535 ], [ -94.779995, 29.334935 ], [ -94.777064, 29.336811 ], [ -94.745529, 29.334235 ], [ -94.744945, 29.336410 ], [ -94.731320, 29.338066 ], [ -94.722530, 29.331446 ], [ -94.731082, 29.331833 ], [ -94.769695, 29.304936 ], [ -94.786095, 29.290737 ], [ -94.803695, 29.279237 ], [ -95.026219, 29.148064 ], [ -95.081773, 29.111222 ], [ -95.110484, 29.088224 ], [ -95.122525, 29.074000 ], [ -95.125134, 29.067321 ], [ -95.191391, 29.023090 ], [ -95.238924, 28.988644 ], [ -95.272266, 28.961546 ], [ -95.297147, 28.934073 ], [ -95.309704, 28.928262 ], [ -95.353451, 28.898145 ], [ -95.376979, 28.876160 ], [ -95.382390, 28.866348 ], [ -95.416174, 28.859482 ], [ -95.439594, 28.859022 ], [ -95.486769, 28.836287 ], [ -95.568136, 28.789998 ], [ -95.812504, 28.664942 ], [ -95.884026, 28.633098 ], [ -96.000682, 28.588238 ], [ -96.077868, 28.556626 ], [ -96.194412, 28.502224 ], [ -96.220376, 28.491966 ], [ -96.244751, 28.475055 ], [ -96.270391, 28.461930 ], [ -96.303212, 28.441871 ], [ -96.321560, 28.425148 ], [ -96.328817, 28.423659 ], [ -96.341617, 28.417334 ], [ -96.371117, 28.397661 ], [ -96.372101, 28.393875 ], [ -96.379702, 28.386881 ], [ -96.388073, 28.388364 ], [ -96.389842, 28.389628 ], [ -96.385261, 28.394460 ], [ -96.375958, 28.401684 ], [ -96.374138, 28.404275 ], [ -96.335119, 28.437795 ], [ -96.268341, 28.477992 ], [ -96.223825, 28.495067 ], [ -96.218978, 28.500383 ], [ -96.215050, 28.509679 ], [ -96.145448, 28.544741 ], [ -96.104735, 28.559499 ], [ -96.046211, 28.586980 ], [ -96.032979, 28.589016 ], [ -96.007534, 28.599703 ], [ -95.986160, 28.606319 ], [ -95.982088, 28.614461 ], [ -95.985651, 28.621077 ], [ -95.983106, 28.641942 ], [ -95.978526, 28.650594 ], [ -95.986066, 28.655468 ], [ -95.996338, 28.658736 ], [ -96.002954, 28.656192 ], [ -96.006516, 28.648049 ], [ -96.033488, 28.652629 ], [ -96.047737, 28.649067 ], [ -96.072165, 28.635326 ], [ -96.099137, 28.624639 ], [ -96.148501, 28.611408 ], [ -96.187178, 28.593596 ], [ -96.198374, 28.586980 ], [ -96.221784, 28.580364 ], [ -96.228909, 28.580873 ], [ -96.233998, 28.596649 ], [ -96.233998, 28.601738 ], [ -96.222293, 28.607336 ], [ -96.214150, 28.613443 ], [ -96.212624, 28.622604 ], [ -96.230944, 28.641433 ], [ -96.208552, 28.662298 ], [ -96.214659, 28.665352 ], [ -96.192267, 28.687744 ], [ -96.191250, 28.694360 ], [ -96.195830, 28.698940 ], [ -96.202446, 28.700976 ], [ -96.222802, 28.698431 ], [ -96.231453, 28.696395 ], [ -96.256899, 28.684690 ], [ -96.263515, 28.683673 ], [ -96.268604, 28.688762 ], [ -96.287942, 28.683164 ], [ -96.304227, 28.671459 ], [ -96.305245, 28.660263 ], [ -96.303718, 28.644996 ], [ -96.328655, 28.640924 ], [ -96.373439, 28.626675 ], [ -96.376492, 28.620059 ], [ -96.384635, 28.615988 ], [ -96.473694, 28.573240 ], [ -96.487943, 28.569677 ], [ -96.482854, 28.580364 ], [ -96.480309, 28.596649 ], [ -96.485907, 28.607845 ], [ -96.490488, 28.610899 ], [ -96.510844, 28.614970 ], [ -96.510335, 28.617515 ], [ -96.497612, 28.625148 ], [ -96.496595, 28.630746 ], [ -96.499648, 28.635835 ], [ -96.506264, 28.638380 ], [ -96.545450, 28.645505 ], [ -96.548014, 28.640702 ], [ -96.560731, 28.634859 ], [ -96.563137, 28.636234 ], [ -96.555119, 28.646013 ], [ -96.563262, 28.644487 ], [ -96.570243, 28.636240 ], [ -96.572649, 28.636412 ], [ -96.575227, 28.644489 ], [ -96.574367, 28.654629 ], [ -96.572133, 28.657035 ], [ -96.572931, 28.667897 ], [ -96.570386, 28.674003 ], [ -96.559190, 28.687235 ], [ -96.559699, 28.691306 ], [ -96.561226, 28.696395 ], [ -96.566824, 28.697922 ], [ -96.578020, 28.704538 ], [ -96.580564, 28.716752 ], [ -96.584127, 28.722859 ], [ -96.593796, 28.725403 ], [ -96.648758, 28.709627 ], [ -96.664534, 28.696904 ], [ -96.657918, 28.687744 ], [ -96.635018, 28.668914 ], [ -96.634000, 28.654665 ], [ -96.627893, 28.650085 ], [ -96.623313, 28.649576 ], [ -96.615679, 28.644487 ], [ -96.610590, 28.638889 ], [ -96.610590, 28.636344 ], [ -96.619750, 28.627693 ], [ -96.622804, 28.622095 ], [ -96.611099, 28.585962 ], [ -96.608045, 28.583418 ], [ -96.573949, 28.584436 ], [ -96.565297, 28.582400 ], [ -96.564279, 28.576293 ], [ -96.561226, 28.570695 ], [ -96.536289, 28.559499 ], [ -96.526111, 28.557972 ], [ -96.522040, 28.554410 ], [ -96.514406, 28.535071 ], [ -96.505755, 28.525911 ], [ -96.450284, 28.490796 ], [ -96.419749, 28.467387 ], [ -96.410589, 28.459244 ], [ -96.402446, 28.449066 ], [ -96.403973, 28.442450 ], [ -96.461480, 28.421585 ], [ -96.481836, 28.407844 ], [ -96.504737, 28.397666 ], [ -96.520513, 28.394104 ], [ -96.542905, 28.385452 ], [ -96.559699, 28.377819 ], [ -96.570386, 28.368658 ], [ -96.591760, 28.357462 ], [ -96.600412, 28.354409 ], [ -96.650794, 28.346775 ], [ -96.672677, 28.335579 ], [ -96.688453, 28.347284 ], [ -96.694560, 28.347284 ], [ -96.698122, 28.342704 ], [ -96.705247, 28.348811 ], [ -96.700158, 28.369676 ], [ -96.705756, 28.400211 ], [ -96.710336, 28.406827 ], [ -96.722550, 28.408862 ], [ -96.749013, 28.408862 ], [ -96.762245, 28.411916 ], [ -96.768352, 28.410389 ], [ -96.775985, 28.405809 ], [ -96.780792, 28.398426 ], [ -96.798050, 28.406044 ], [ -96.820655, 28.423890 ], [ -96.831958, 28.428054 ], [ -96.840881, 28.428054 ], [ -96.853968, 28.417347 ], [ -96.854562, 28.411993 ], [ -96.845639, 28.401286 ], [ -96.827793, 28.384034 ], [ -96.809353, 28.372732 ], [ -96.794555, 28.365683 ], [ -96.794306, 28.349320 ], [ -96.790744, 28.323874 ], [ -96.791761, 28.312170 ], [ -96.806011, 28.296902 ], [ -96.809573, 28.290287 ], [ -96.806011, 28.282144 ], [ -96.787181, 28.255681 ], [ -96.787181, 28.250083 ], [ -96.800413, 28.224128 ], [ -96.842143, 28.193594 ], [ -96.872678, 28.176291 ], [ -96.898123, 28.152881 ], [ -96.910337, 28.147283 ], [ -96.934765, 28.123873 ], [ -96.962755, 28.123365 ], [ -96.961682, 28.133426 ], [ -96.953949, 28.144728 ], [ -96.945621, 28.171497 ], [ -96.937888, 28.177446 ], [ -96.928965, 28.193507 ], [ -96.928965, 28.198266 ], [ -96.939672, 28.208974 ], [ -96.943242, 28.216707 ], [ -96.943242, 28.222061 ], [ -96.929560, 28.243476 ], [ -96.930749, 28.248235 ], [ -96.942052, 28.248235 ], [ -96.945621, 28.233958 ], [ -96.960493, 28.222061 ], [ -96.962277, 28.218492 ], [ -96.945026, 28.198266 ], [ -96.943836, 28.194697 ], [ -96.945026, 28.189938 ], [ -96.967631, 28.166143 ], [ -96.969416, 28.161979 ], [ -96.971200, 28.132831 ], [ -96.977889, 28.129091 ], [ -97.000414, 28.137614 ], [ -97.007539, 28.136087 ], [ -97.027014, 28.148408 ], [ -97.027014, 28.151740 ], [ -97.020827, 28.180769 ], [ -97.021303, 28.184100 ], [ -97.025110, 28.186480 ], [ -97.037008, 28.185528 ], [ -97.093163, 28.164113 ], [ -97.133614, 28.140318 ], [ -97.153601, 28.133180 ], [ -97.180727, 28.114144 ], [ -97.214039, 28.087494 ], [ -97.218323, 28.079880 ], [ -97.215467, 28.075597 ], [ -97.176444, 28.059892 ], [ -97.173589, 28.052278 ], [ -97.169782, 28.049423 ], [ -97.160264, 28.050375 ], [ -97.155029, 28.047995 ], [ -97.154553, 28.042760 ], [ -97.147890, 28.035622 ], [ -97.137897, 28.030387 ], [ -97.130282, 28.031815 ], [ -97.129807, 28.034194 ], [ -97.136945, 28.045140 ], [ -97.137421, 28.057037 ], [ -97.130282, 28.062748 ], [ -97.103633, 28.078452 ], [ -97.077934, 28.084639 ], [ -97.065085, 28.088922 ], [ -97.055567, 28.096536 ], [ -97.051760, 28.106054 ], [ -97.054616, 28.116524 ], [ -97.053188, 28.121758 ], [ -97.043670, 28.121758 ], [ -97.025693, 28.112160 ], [ -97.022806, 28.107588 ], [ -97.023824, 28.103517 ], [ -97.031966, 28.093848 ], [ -97.035528, 28.084688 ], [ -97.035528, 28.074000 ], [ -97.031457, 28.053644 ], [ -97.025859, 28.041939 ], [ -97.030948, 28.033288 ], [ -97.040618, 28.028708 ], [ -97.048760, 28.022092 ], [ -97.061992, 27.996138 ], [ -97.075732, 27.986977 ], [ -97.121534, 27.923364 ], [ -97.129168, 27.919801 ], [ -97.135783, 27.899445 ], [ -97.144435, 27.894356 ], [ -97.155122, 27.880615 ], [ -97.184639, 27.831251 ], [ -97.187183, 27.824126 ], [ -97.196852, 27.822091 ], [ -97.209575, 27.822091 ], [ -97.220771, 27.824126 ], [ -97.225176, 27.825723 ], [ -97.227317, 27.829204 ], [ -97.227317, 27.832952 ], [ -97.226514, 27.838307 ], [ -97.228388, 27.843661 ], [ -97.234512, 27.849063 ], [ -97.241127, 27.857714 ], [ -97.242654, 27.864839 ], [ -97.250797, 27.876035 ], [ -97.263010, 27.880106 ], [ -97.273698, 27.881633 ], [ -97.295072, 27.878071 ], [ -97.325097, 27.867893 ], [ -97.354614, 27.849572 ], [ -97.359935, 27.850669 ], [ -97.361247, 27.849890 ], [ -97.361735, 27.853027 ], [ -97.349832, 27.864963 ], [ -97.343645, 27.870674 ], [ -97.345073, 27.875909 ], [ -97.350784, 27.876860 ], [ -97.360302, 27.872577 ], [ -97.396945, 27.871150 ], [ -97.417409, 27.866867 ], [ -97.440251, 27.866391 ], [ -97.460715, 27.862584 ], [ -97.480226, 27.855921 ], [ -97.485937, 27.845927 ], [ -97.483082, 27.837361 ], [ -97.470709, 27.830223 ], [ -97.455004, 27.831175 ], [ -97.448342, 27.834982 ], [ -97.424547, 27.831651 ], [ -97.392186, 27.841169 ], [ -97.385524, 27.841644 ], [ -97.379042, 27.837867 ], [ -97.391764, 27.813948 ], [ -97.393291, 27.782905 ], [ -97.386166, 27.766620 ], [ -97.368355, 27.741683 ], [ -97.346980, 27.725398 ], [ -97.316446, 27.712676 ], [ -97.253955, 27.696696 ], [ -97.259957, 27.679597 ], [ -97.266064, 27.678579 ], [ -97.296598, 27.613947 ], [ -97.298634, 27.604787 ], [ -97.297616, 27.598680 ], [ -97.294054, 27.594100 ], [ -97.302196, 27.585957 ], [ -97.321535, 27.571199 ], [ -97.336802, 27.527433 ], [ -97.343418, 27.517764 ], [ -97.347489, 27.503005 ], [ -97.350543, 27.478578 ], [ -97.359194, 27.458221 ], [ -97.365810, 27.450588 ], [ -97.371917, 27.425142 ], [ -97.369881, 27.412420 ], [ -97.372935, 27.401224 ], [ -97.379550, 27.390028 ], [ -97.399398, 27.344735 ], [ -97.401942, 27.335574 ], [ -97.404996, 27.329977 ], [ -97.413138, 27.321325 ], [ -97.420263, 27.317254 ], [ -97.430441, 27.313691 ], [ -97.450798, 27.313691 ], [ -97.482859, 27.297915 ], [ -97.508304, 27.275014 ], [ -97.532223, 27.278577 ], [ -97.544437, 27.284175 ], [ -97.546981, 27.290791 ], [ -97.536803, 27.289264 ], [ -97.526625, 27.291808 ], [ -97.524589, 27.297915 ], [ -97.517465, 27.305040 ], [ -97.504742, 27.305040 ], [ -97.498126, 27.308602 ], [ -97.502706, 27.322343 ], [ -97.499144, 27.327941 ], [ -97.483877, 27.338628 ], [ -97.483877, 27.351351 ], [ -97.486930, 27.358984 ], [ -97.485164, 27.371403 ], [ -97.486948, 27.375567 ], [ -97.493492, 27.377947 ], [ -97.494682, 27.372593 ], [ -97.501688, 27.366618 ], [ -97.514411, 27.361529 ], [ -97.520518, 27.352877 ], [ -97.538330, 27.335574 ], [ -97.570900, 27.315727 ], [ -97.584132, 27.309620 ], [ -97.609068, 27.285193 ], [ -97.621791, 27.287228 ], [ -97.633880, 27.292881 ], [ -97.639234, 27.297640 ], [ -97.639234, 27.302994 ], [ -97.638044, 27.306563 ], [ -97.642803, 27.317866 ], [ -97.649347, 27.319055 ], [ -97.655295, 27.320840 ], [ -97.670762, 27.341660 ], [ -97.675521, 27.356532 ], [ -97.685039, 27.370809 ], [ -97.689797, 27.372593 ], [ -97.696936, 27.371403 ], [ -97.699315, 27.369024 ], [ -97.686228, 27.335117 ], [ -97.668977, 27.313702 ], [ -97.655890, 27.309537 ], [ -97.652321, 27.307158 ], [ -97.651726, 27.302994 ], [ -97.657080, 27.291097 ], [ -97.659459, 27.282174 ], [ -97.655295, 27.278604 ], [ -97.640111, 27.270943 ], [ -97.639094, 27.253131 ], [ -97.635022, 27.247024 ], [ -97.628916, 27.242953 ], [ -97.597363, 27.242444 ], [ -97.582605, 27.240409 ], [ -97.573953, 27.238882 ], [ -97.561231, 27.232775 ], [ -97.542910, 27.229213 ], [ -97.520009, 27.231248 ], [ -97.509831, 27.235320 ], [ -97.503215, 27.239900 ], [ -97.500162, 27.244480 ], [ -97.485149, 27.250841 ], [ -97.467083, 27.253640 ], [ -97.458431, 27.259493 ], [ -97.450289, 27.262546 ], [ -97.424080, 27.264073 ], [ -97.422299, 27.257712 ], [ -97.434767, 27.202241 ], [ -97.444945, 27.144734 ], [ -97.443673, 27.116235 ], [ -97.447856, 27.092602 ], [ -97.451199, 27.089309 ], [ -97.453567, 27.093554 ], [ -97.452324, 27.115217 ], [ -97.455887, 27.110383 ], [ -97.456650, 27.099695 ], [ -97.461739, 27.095624 ], [ -97.475480, 27.098423 ], [ -97.480569, 27.102494 ], [ -97.491510, 27.101222 ], [ -97.495836, 27.094098 ], [ -97.493291, 27.078067 ], [ -97.477515, 27.066108 ], [ -97.479042, 27.062800 ], [ -97.482257, 27.061942 ], [ -97.486930, 27.057711 ], [ -97.487693, 27.053639 ], [ -97.486676, 27.034810 ], [ -97.477515, 27.032520 ], [ -97.473953, 27.029212 ], [ -97.473444, 27.022850 ], [ -97.478533, 26.999186 ], [ -97.480569, 26.997659 ], [ -97.484131, 27.000458 ], [ -97.536803, 26.999695 ], [ -97.549271, 26.995878 ], [ -97.555378, 26.990280 ], [ -97.551053, 26.980865 ], [ -97.549526, 26.965344 ], [ -97.552325, 26.952112 ], [ -97.555378, 26.947277 ], [ -97.555378, 26.938880 ], [ -97.540874, 26.906310 ], [ -97.540111, 26.900967 ], [ -97.547999, 26.895114 ], [ -97.552325, 26.888499 ], [ -97.552325, 26.867633 ], [ -97.558432, 26.864325 ], [ -97.563266, 26.842188 ], [ -97.552579, 26.827938 ], [ -97.547745, 26.824631 ], [ -97.537566, 26.824885 ], [ -97.509831, 26.803511 ], [ -97.484385, 26.763562 ], [ -97.478024, 26.757200 ], [ -97.471663, 26.758727 ], [ -97.468609, 26.740915 ], [ -97.467337, 26.710126 ], [ -97.444945, 26.633535 ], [ -97.445708, 26.609362 ], [ -97.428151, 26.572466 ], [ -97.416955, 26.553637 ], [ -97.422299, 26.520303 ], [ -97.425861, 26.516741 ], [ -97.430696, 26.506563 ], [ -97.430696, 26.494603 ], [ -97.426370, 26.484425 ], [ -97.429169, 26.478064 ], [ -97.435530, 26.470176 ], [ -97.441383, 26.466614 ], [ -97.441383, 26.455418 ], [ -97.437566, 26.449820 ], [ -97.425861, 26.446003 ], [ -97.421026, 26.446766 ], [ -97.417210, 26.449820 ], [ -97.411612, 26.447275 ], [ -97.412884, 26.433026 ], [ -97.421790, 26.417249 ], [ -97.419500, 26.413178 ], [ -97.406014, 26.409107 ], [ -97.398126, 26.410888 ], [ -97.394309, 26.414450 ], [ -97.395072, 26.417249 ], [ -97.377769, 26.409107 ], [ -97.369627, 26.394603 ], [ -97.374461, 26.380862 ], [ -97.388965, 26.365850 ], [ -97.392019, 26.339386 ], [ -97.391001, 26.332262 ], [ -97.387947, 26.330481 ], [ -97.376242, 26.336333 ], [ -97.372171, 26.339895 ], [ -97.369372, 26.348547 ], [ -97.358176, 26.356435 ], [ -97.343418, 26.359234 ], [ -97.335275, 26.355672 ], [ -97.330441, 26.350582 ], [ -97.336802, 26.331753 ], [ -97.352833, 26.318521 ], [ -97.354359, 26.313941 ], [ -97.346980, 26.311396 ], [ -97.347489, 26.292821 ], [ -97.343927, 26.267376 ], [ -97.341128, 26.265595 ], [ -97.331967, 26.265595 ], [ -97.322807, 26.271956 ], [ -97.311866, 26.273737 ], [ -97.307031, 26.253126 ], [ -97.308049, 26.249055 ], [ -97.321280, 26.236078 ], [ -97.321280, 26.228699 ], [ -97.304486, 26.202490 ], [ -97.296598, 26.200709 ], [ -97.294817, 26.192312 ], [ -97.296089, 26.182388 ], [ -97.306776, 26.159487 ], [ -97.296598, 26.142439 ], [ -97.285360, 26.128378 ], [ -97.282094, 26.120301 ], [ -97.283112, 26.117757 ], [ -97.294054, 26.113940 ], [ -97.295072, 26.108342 ], [ -97.279804, 26.092057 ], [ -97.270898, 26.086459 ], [ -97.246980, 26.080352 ], [ -97.208048, 26.079589 ], [ -97.199651, 26.077044 ], [ -97.195071, 26.041930 ], [ -97.204995, 26.030225 ], [ -97.214918, 26.030734 ], [ -97.224842, 26.027426 ], [ -97.226114, 26.024372 ], [ -97.219244, 25.996128 ], [ -97.216954, 25.993838 ], [ -97.208557, 25.991802 ], [ -97.195834, 25.993074 ], [ -97.174460, 26.000072 ], [ -97.167208, 26.007069 ], [ -97.162755, 26.014576 ], [ -97.162628, 26.023482 ], [ -97.172043, 26.044729 ], [ -97.178659, 26.045492 ], [ -97.182730, 26.053126 ], [ -97.164982, 26.063876 ], [ -97.152009, 26.062108 ], [ -97.153210, 26.038906 ], [ -97.151922, 26.017653 ], [ -97.145567, 25.971132 ], [ -97.146881, 25.969781 ], [ -97.146294, 25.955606 ], [ -97.147785, 25.953132 ], [ -97.156608, 25.949022 ], [ -97.160294, 25.950243 ], [ -97.168199, 25.959262 ], [ -97.178362, 25.962114 ], [ -97.187583, 25.958174 ], [ -97.206945, 25.960899 ], [ -97.229226, 25.958753 ], [ -97.239867, 25.954974 ], [ -97.248033, 25.948097 ], [ -97.276707, 25.952147 ], [ -97.281389, 25.948037 ], [ -97.277163, 25.935438 ], [ -97.303602, 25.936704 ], [ -97.320561, 25.929802 ], [ -97.324914, 25.924041 ], [ -97.338346, 25.923125 ], [ -97.350398, 25.925241 ], [ -97.367642, 25.915680 ], [ -97.374430, 25.907444 ], [ -97.372365, 25.905016 ], [ -97.365976, 25.902447 ], [ -97.365521, 25.890476 ], [ -97.360082, 25.868874 ], [ -97.365420, 25.849826 ], [ -97.372864, 25.840117 ], [ -97.394513, 25.837377 ], [ -97.422636, 25.840378 ], [ -97.445113, 25.850026 ], [ -97.448271, 25.859463 ], [ -97.449172, 25.871678 ], [ -97.454727, 25.879337 ], [ -97.468262, 25.884162 ], [ -97.486060, 25.878758 ], [ -97.496861, 25.880058 ], [ -97.521762, 25.886458 ], [ -97.528628, 25.905219 ], [ -97.530322, 25.916797 ], [ -97.542957, 25.920035 ], [ -97.545170, 25.923975 ], [ -97.546421, 25.934077 ], [ -97.555379, 25.937136 ], [ -97.559364, 25.932257 ], [ -97.582565, 25.937857 ], [ -97.580419, 25.945116 ], [ -97.583044, 25.955443 ], [ -97.598043, 25.957556 ], [ -97.607734, 25.972745 ], [ -97.608283, 25.976594 ], [ -97.627226, 25.996727 ], [ -97.634804, 25.999509 ], [ -97.644011, 26.006614 ], [ -97.643708, 26.016943 ], [ -97.649176, 26.021499 ], [ -97.661326, 26.019373 ], [ -97.668298, 26.019956 ], [ -97.671351, 26.024233 ], [ -97.697069, 26.023455 ], [ -97.703247, 26.030309 ], [ -97.711145, 26.033043 ], [ -97.719920, 26.030838 ], [ -97.758838, 26.032131 ], [ -97.763091, 26.033650 ], [ -97.764913, 26.037903 ], [ -97.770077, 26.041548 ], [ -97.779191, 26.042763 ], [ -97.784051, 26.040637 ], [ -97.789823, 26.042460 ], [ -97.792253, 26.044282 ], [ -97.795291, 26.055218 ], [ -97.801344, 26.060017 ], [ -97.825546, 26.055702 ], [ -97.836608, 26.051651 ], [ -97.860504, 26.052918 ], [ -97.871187, 26.058083 ], [ -97.876983, 26.064483 ], [ -97.886530, 26.066339 ], [ -97.913882, 26.056539 ], [ -97.935420, 26.052688 ], [ -97.944345, 26.059621 ], [ -97.950095, 26.061828 ], [ -97.967358, 26.051718 ], [ -97.978769, 26.059708 ], [ -97.981335, 26.067182 ], [ -98.010971, 26.063863 ], [ -98.028759, 26.066470 ], [ -98.033102, 26.061039 ], [ -98.034403, 26.051375 ], [ -98.039239, 26.041275 ], [ -98.070021, 26.047992 ], [ -98.070025, 26.051466 ], [ -98.076544, 26.068042 ], [ -98.080495, 26.070932 ], [ -98.084755, 26.070808 ], [ -98.085849, 26.069208 ], [ -98.081567, 26.066108 ], [ -98.081884, 26.063724 ], [ -98.091038, 26.059169 ], [ -98.094432, 26.058625 ], [ -98.097643, 26.060271 ], [ -98.105505, 26.067537 ], [ -98.128331, 26.061929 ], [ -98.146622, 26.049412 ], [ -98.149463, 26.051579 ], [ -98.149463, 26.055813 ], [ -98.151731, 26.058187 ], [ -98.177897, 26.074672 ], [ -98.189060, 26.063258 ], [ -98.191534, 26.057118 ], [ -98.197046, 26.056153 ], [ -98.200871, 26.059161 ], [ -98.204960, 26.066419 ], [ -98.220673, 26.076467 ], [ -98.230097, 26.077155 ], [ -98.248806, 26.073101 ], [ -98.264514, 26.085507 ], [ -98.277218, 26.098802 ], [ -98.272898, 26.106290 ], [ -98.270034, 26.107090 ], [ -98.265698, 26.120370 ], [ -98.296195, 26.120321 ], [ -98.299523, 26.117490 ], [ -98.302979, 26.110050 ], [ -98.323828, 26.121249 ], [ -98.335204, 26.137617 ], [ -98.338420, 26.151344 ], [ -98.333316, 26.158800 ], [ -98.333156, 26.162336 ], [ -98.336837, 26.166432 ], [ -98.345781, 26.166016 ], [ -98.354645, 26.153040 ], [ -98.386694, 26.157872 ], [ -98.404433, 26.182564 ], [ -98.418120, 26.184648 ], [ -98.442536, 26.199151 ], [ -98.444376, 26.201407 ], [ -98.443682, 26.213339 ], [ -98.450976, 26.219904 ], [ -98.465077, 26.222335 ], [ -98.481646, 26.219277 ], [ -98.483269, 26.216439 ], [ -98.496684, 26.212853 ], [ -98.500575, 26.213826 ], [ -98.503492, 26.214798 ], [ -98.509327, 26.222822 ], [ -98.516621, 26.223551 ], [ -98.526590, 26.221606 ], [ -98.535241, 26.225677 ], [ -98.538017, 26.231331 ], [ -98.543852, 26.234492 ], [ -98.561600, 26.230845 ], [ -98.576188, 26.235221 ], [ -98.581780, 26.243001 ], [ -98.585184, 26.254429 ], [ -98.599154, 26.257612 ], [ -98.613465, 26.252028 ], [ -98.626654, 26.252210 ], [ -98.634180, 26.242612 ], [ -98.654221, 26.235960 ], [ -98.669397, 26.236320 ], [ -98.675206, 26.239989 ], [ -98.679042, 26.245554 ], [ -98.677766, 26.255568 ], [ -98.681167, 26.262710 ], [ -98.687156, 26.265120 ], [ -98.698856, 26.265619 ], [ -98.707451, 26.272152 ], [ -98.710602, 26.279018 ], [ -98.709171, 26.284186 ], [ -98.711233, 26.289687 ], [ -98.729196, 26.299027 ], [ -98.734613, 26.298970 ], [ -98.745272, 26.303096 ], [ -98.745615, 26.317193 ], [ -98.749054, 26.321662 ], [ -98.755242, 26.325100 ], [ -98.779912, 26.326542 ], [ -98.789822, 26.331575 ], [ -98.796252, 26.349104 ], [ -98.798211, 26.360166 ], [ -98.807348, 26.369421 ], [ -98.824571, 26.370715 ], [ -98.832909, 26.363338 ], [ -98.844057, 26.358638 ], [ -98.847707, 26.359595 ], [ -98.853415, 26.365023 ], [ -98.861354, 26.365990 ], [ -98.890965, 26.357569 ], [ -98.905560, 26.364024 ], [ -98.921277, 26.381426 ], [ -98.924926, 26.381987 ], [ -98.937556, 26.376093 ], [ -98.942046, 26.375532 ], [ -98.950186, 26.380303 ], [ -98.958325, 26.394056 ], [ -98.967587, 26.398266 ], [ -98.990321, 26.395459 ], [ -99.008003, 26.395459 ], [ -99.014739, 26.398827 ], [ -99.021935, 26.407902 ], [ -99.032316, 26.412082 ], [ -99.039107, 26.412947 ], [ -99.045466, 26.409816 ], [ -99.053185, 26.402006 ], [ -99.062093, 26.397371 ], [ -99.082002, 26.396510 ], [ -99.085126, 26.398782 ], [ -99.089413, 26.408100 ], [ -99.110855, 26.426278 ], [ -99.113808, 26.434002 ], [ -99.103083, 26.441515 ], [ -99.091635, 26.476977 ], [ -99.105031, 26.500335 ], [ -99.127782, 26.525199 ], [ -99.143659, 26.527901 ], [ -99.166742, 26.536079 ], [ -99.170704, 26.540316 ], [ -99.171404, 26.549848 ], [ -99.167410, 26.560001 ], [ -99.178064, 26.620547 ], [ -99.200522, 26.656443 ], [ -99.209948, 26.693938 ], [ -99.208907, 26.724761 ], [ -99.240023, 26.745851 ], [ -99.242444, 26.788262 ], [ -99.262208, 26.815668 ], [ -99.268613, 26.843213 ], [ -99.280471, 26.858053 ], [ -99.295146, 26.865440 ], [ -99.316753, 26.865831 ], [ -99.328900, 26.879761 ], [ -99.321819, 26.906846 ], [ -99.324684, 26.915973 ], [ -99.337297, 26.922759 ], [ -99.361144, 26.928921 ], [ -99.367054, 26.929034 ], [ -99.379149, 26.934490 ], [ -99.388253, 26.944217 ], [ -99.393748, 26.960730 ], [ -99.390189, 26.966348 ], [ -99.377312, 26.973819 ], [ -99.376593, 26.977717 ], [ -99.378435, 26.980034 ], [ -99.387367, 26.982399 ], [ -99.403694, 26.997356 ], [ -99.407321, 27.005809 ], [ -99.415476, 27.017240 ], [ -99.420447, 27.016568 ], [ -99.429380, 27.010833 ], [ -99.432155, 27.010699 ], [ -99.438721, 27.014630 ], [ -99.446524, 27.023008 ], [ -99.446970, 27.026026 ], [ -99.444062, 27.031253 ], [ -99.443973, 27.036458 ], [ -99.452316, 27.062669 ], [ -99.450282, 27.067705 ], [ -99.434470, 27.078517 ], [ -99.429209, 27.090982 ], [ -99.430275, 27.094872 ], [ -99.437646, 27.100442 ], [ -99.442123, 27.106839 ], [ -99.441109, 27.110042 ], [ -99.433370, 27.119218 ], [ -99.430581, 27.126612 ], [ -99.431355, 27.137580 ], [ -99.438265, 27.144792 ], [ -99.439971, 27.151072 ], [ -99.437951, 27.154121 ], [ -99.429984, 27.159149 ], [ -99.426348, 27.176262 ], [ -99.432795, 27.209693 ], [ -99.441928, 27.217985 ], [ -99.445238, 27.223341 ], [ -99.441407, 27.236758 ], [ -99.441549, 27.249920 ], [ -99.452391, 27.264046 ], [ -99.463309, 27.268437 ], [ -99.480688, 27.259989 ], [ -99.487910, 27.260721 ], [ -99.492407, 27.264118 ], [ -99.496615, 27.271708 ], [ -99.487513, 27.290240 ], [ -99.487937, 27.294941 ], [ -99.494604, 27.303542 ], [ -99.502036, 27.306121 ], [ -99.511531, 27.304077 ], [ -99.523658, 27.304138 ], [ -99.529654, 27.306051 ], [ -99.536443, 27.312538 ], [ -99.537771, 27.316073 ], [ -99.531376, 27.323809 ], [ -99.521260, 27.324784 ], [ -99.504837, 27.338289 ], [ -99.507831, 27.348637 ], [ -99.507779, 27.354247 ], [ -99.499076, 27.373140 ], [ -99.492144, 27.380517 ], [ -99.487521, 27.412396 ], [ -99.495699, 27.438884 ], [ -99.495104, 27.451518 ], [ -99.483819, 27.467297 ], [ -99.480419, 27.481596 ], [ -99.480219, 27.485796 ], [ -99.483519, 27.491096 ], [ -99.497519, 27.500496 ], [ -99.513320, 27.499496 ], [ -99.519320, 27.496896 ], [ -99.525820, 27.496696 ], [ -99.528320, 27.498896 ], [ -99.521919, 27.544094 ], [ -99.518819, 27.553194 ], [ -99.514319, 27.556994 ], [ -99.511119, 27.564494 ], [ -99.512219, 27.568094 ], [ -99.515978, 27.572131 ], [ -99.530138, 27.580207 ], [ -99.539722, 27.603281 ], [ -99.554950, 27.614454 ], [ -99.556812, 27.614336 ], [ -99.559467, 27.609076 ], [ -99.562869, 27.607264 ], [ -99.580006, 27.602251 ], [ -99.584843, 27.603903 ], [ -99.585148, 27.606398 ], [ -99.578160, 27.610369 ], [ -99.578099, 27.619196 ], [ -99.584782, 27.622007 ], [ -99.591372, 27.627464 ], [ -99.594038, 27.638573 ], [ -99.596231, 27.639858 ], [ -99.603533, 27.641992 ], [ -99.624515, 27.634515 ], [ -99.625322, 27.631137 ], [ -99.638929, 27.626758 ], [ -99.654324, 27.629616 ], [ -99.665948, 27.635968 ], [ -99.665422, 27.640275 ], [ -99.659500, 27.645246 ], [ -99.658295, 27.650158 ], [ -99.661845, 27.655753 ], [ -99.668942, 27.659974 ], [ -99.685813, 27.661015 ], [ -99.699356, 27.655417 ], [ -99.704601, 27.654954 ], [ -99.711511, 27.658365 ], [ -99.721519, 27.666155 ], [ -99.723716, 27.673328 ], [ -99.732448, 27.685425 ], [ -99.757539, 27.711853 ], [ -99.758534, 27.717071 ], [ -99.770740, 27.732134 ], [ -99.774901, 27.733540 ], [ -99.785366, 27.730355 ], [ -99.788845, 27.730718 ], [ -99.796342, 27.735586 ], [ -99.801651, 27.741771 ], [ -99.805670, 27.758688 ], [ -99.813086, 27.773952 ], [ -99.819092, 27.776019 ], [ -99.822193, 27.766855 ], [ -99.825793, 27.764374 ], [ -99.835127, 27.762881 ], [ -99.841708, 27.766464 ], [ -99.844737, 27.778809 ], [ -99.850877, 27.793974 ], [ -99.870066, 27.794627 ], [ -99.877677, 27.799427 ], [ -99.877840, 27.824376 ], [ -99.876003, 27.837968 ], [ -99.877202, 27.842179 ], [ -99.882015, 27.850392 ], [ -99.893650, 27.856193 ], [ -99.901486, 27.864162 ], [ -99.904385, 27.875284 ], [ -99.901232, 27.884406 ], [ -99.894091, 27.892950 ], [ -99.893456, 27.899208 ], [ -99.895828, 27.904178 ], [ -99.900080, 27.912142 ], [ -99.917461, 27.917973 ], [ -99.937142, 27.940537 ], [ -99.938541, 27.954059 ], [ -99.932161, 27.967710 ], [ -99.931812, 27.980967 ], [ -99.962769, 27.983536 ], [ -99.984923, 27.990729 ], [ -99.991447, 27.994560 ], [ -100.008631, 28.023964 ], [ -100.012839, 28.037203 ], [ -100.017914, 28.064787 ], [ -100.028725, 28.073118 ], [ -100.046108, 28.079068 ], [ -100.053123, 28.084730 ], [ -100.056983, 28.094207 ], [ -100.055596, 28.101141 ], [ -100.056493, 28.104186 ], [ -100.067652, 28.113602 ], [ -100.075474, 28.124882 ], [ -100.083393, 28.144035 ], [ -100.090289, 28.148313 ], [ -100.119628, 28.155588 ], [ -100.141098, 28.168149 ], [ -100.160590, 28.168160 ], [ -100.168438, 28.171542 ], [ -100.174413, 28.179448 ], [ -100.185694, 28.185781 ], [ -100.196499, 28.190218 ], [ -100.208059, 28.190383 ], [ -100.212105, 28.196510 ], [ -100.213450, 28.210416 ], [ -100.217565, 28.226934 ], [ -100.220284, 28.232210 ], [ -100.223630, 28.235224 ], [ -100.227575, 28.235857 ], [ -100.246200, 28.234092 ], [ -100.251634, 28.236177 ], [ -100.267604, 28.250269 ], [ -100.280518, 28.267969 ], [ -100.289384, 28.273491 ], [ -100.293468, 28.278475 ], [ -100.294296, 28.284381 ], [ -100.287554, 28.301093 ], [ -100.286471, 28.312296 ], [ -100.288639, 28.316978 ], [ -100.314198, 28.345859 ], [ -100.317246, 28.357382 ], [ -100.320393, 28.362117 ], [ -100.341869, 28.384953 ], [ -100.344400, 28.389662 ], [ -100.349586, 28.402604 ], [ -100.343945, 28.410119 ], [ -100.337059, 28.427151 ], [ -100.336186, 28.430181 ], [ -100.337797, 28.442960 ], [ -100.341533, 28.449571 ], [ -100.350786, 28.459246 ], [ -100.357498, 28.463642 ], [ -100.368288, 28.477196 ], [ -100.365982, 28.481116 ], [ -100.352235, 28.482638 ], [ -100.344181, 28.486249 ], [ -100.337140, 28.491729 ], [ -100.333814, 28.499252 ], [ -100.338518, 28.501833 ], [ -100.362148, 28.508399 ], [ -100.379079, 28.511639 ], [ -100.388860, 28.515748 ], [ -100.405058, 28.535780 ], [ -100.411414, 28.551899 ], [ -100.397270, 28.575637 ], [ -100.396800, 28.580401 ], [ -100.398385, 28.584884 ], [ -100.429856, 28.596441 ], [ -100.447320, 28.609325 ], [ -100.448648, 28.616774 ], [ -100.445529, 28.637144 ], [ -100.447091, 28.642197 ], [ -100.462866, 28.641364 ], [ -100.474494, 28.647071 ], [ -100.479636, 28.655225 ], [ -100.495863, 28.658569 ], [ -100.500354, 28.661960 ], [ -100.510055, 28.690723 ], [ -100.511998, 28.705352 ], [ -100.506701, 28.716745 ], [ -100.507613, 28.740599 ], [ -100.519226, 28.756161 ], [ -100.533017, 28.763280 ], [ -100.537772, 28.780776 ], [ -100.532431, 28.791063 ], [ -100.535830, 28.805888 ], [ -100.547324, 28.825817 ], [ -100.553130, 28.828249 ], [ -100.561443, 28.829174 ], [ -100.570510, 28.826317 ], [ -100.574699, 28.828787 ], [ -100.576846, 28.836168 ], [ -100.572992, 28.848464 ], [ -100.580502, 28.856008 ], [ -100.591040, 28.863054 ], [ -100.598877, 28.875591 ], [ -100.602654, 28.887660 ], [ -100.602054, 28.901944 ], [ -100.627206, 28.903734 ], [ -100.631611, 28.902839 ], [ -100.640568, 28.914212 ], [ -100.639170, 28.916289 ], [ -100.638857, 28.927622 ], [ -100.651512, 28.943432 ], [ -100.646993, 28.957079 ], [ -100.645894, 28.986421 ], [ -100.650946, 29.008254 ], [ -100.653758, 29.015356 ], [ -100.656110, 29.017224 ], [ -100.660208, 29.031497 ], [ -100.663212, 29.048042 ], [ -100.662508, 29.058107 ], [ -100.664065, 29.073206 ], [ -100.674656, 29.099777 ], [ -100.684472, 29.110657 ], [ -100.692327, 29.115228 ], [ -100.709966, 29.119684 ], [ -100.727462, 29.129123 ], [ -100.737795, 29.139079 ], [ -100.739116, 29.141658 ], [ -100.737591, 29.147407 ], [ -100.739681, 29.150486 ], [ -100.746140, 29.154149 ], [ -100.759726, 29.157150 ], [ -100.772649, 29.168492 ], [ -100.775905, 29.173344 ], [ -100.766031, 29.185849 ], [ -100.767059, 29.195287 ], [ -100.785521, 29.228137 ], [ -100.791372, 29.225945 ], [ -100.795681, 29.227730 ], [ -100.797046, 29.235586 ], [ -100.794912, 29.242459 ], [ -100.797671, 29.246943 ], [ -100.823533, 29.261742 ], [ -100.834040, 29.261400 ], [ -100.839016, 29.263259 ], [ -100.848664, 29.271421 ], [ -100.856469, 29.275664 ], [ -100.864659, 29.276076 ], [ -100.876049, 29.279585 ], [ -100.878883, 29.282193 ], [ -100.882052, 29.299045 ], [ -100.886842, 29.307848 ], [ -100.904835, 29.312010 ], [ -100.926678, 29.326584 ], [ -100.940615, 29.333109 ], [ -100.943196, 29.341985 ], [ -100.948972, 29.347246 ], [ -100.964325, 29.347342 ], [ -100.971743, 29.351371 ], [ -100.972916, 29.354545 ], [ -100.995607, 29.363403 ], [ -101.004207, 29.364772 ], [ -101.010614, 29.368669 ], [ -101.024016, 29.393698 ], [ -101.036604, 29.406108 ], [ -101.038600, 29.410714 ], [ -101.037642, 29.414681 ], [ -101.043364, 29.429880 ], [ -101.056957, 29.440773 ], [ -101.060151, 29.458661 ], [ -101.087149, 29.469414 ], [ -101.103699, 29.470550 ], [ -101.115254, 29.468459 ], [ -101.130038, 29.478420 ], [ -101.137503, 29.473542 ], [ -101.144337, 29.473246 ], [ -101.151877, 29.477005 ], [ -101.171663, 29.503950 ], [ -101.173821, 29.514566 ], [ -101.192720, 29.520285 ], [ -101.227419, 29.522350 ], [ -101.235275, 29.524854 ], [ -101.254895, 29.520342 ], [ -101.260837, 29.529933 ], [ -101.261175, 29.536777 ], [ -101.244355, 29.569187 ], [ -101.242023, 29.592512 ], [ -101.251353, 29.604174 ], [ -101.259127, 29.607284 ], [ -101.265347, 29.607284 ], [ -101.274677, 29.602619 ], [ -101.283230, 29.594844 ], [ -101.297224, 29.587069 ], [ -101.307332, 29.587847 ], [ -101.314329, 29.595622 ], [ -101.307332, 29.640716 ], [ -101.311219, 29.648491 ], [ -101.316661, 29.655488 ], [ -101.325214, 29.657821 ], [ -101.350093, 29.654711 ], [ -101.361756, 29.657821 ], [ -101.367198, 29.664041 ], [ -101.378860, 29.698250 ], [ -101.396948, 29.713947 ], [ -101.398362, 29.717000 ], [ -101.396294, 29.727055 ], [ -101.397009, 29.733963 ], [ -101.400636, 29.738079 ], [ -101.410024, 29.741498 ], [ -101.415584, 29.746534 ], [ -101.415402, 29.756561 ], [ -101.424732, 29.758116 ], [ -101.441059, 29.753451 ], [ -101.446502, 29.755006 ], [ -101.453499, 29.759671 ], [ -101.455224, 29.771874 ], [ -101.467494, 29.779886 ], [ -101.475269, 29.780663 ], [ -101.503223, 29.764582 ], [ -101.522695, 29.759671 ], [ -101.532802, 29.764336 ], [ -101.537467, 29.782996 ], [ -101.546797, 29.796991 ], [ -101.561569, 29.794658 ], [ -101.575564, 29.774444 ], [ -101.582562, 29.771334 ], [ -101.603681, 29.774399 ], [ -101.625958, 29.771063 ], [ -101.630319, 29.768729 ], [ -101.635128, 29.758675 ], [ -101.646418, 29.754304 ], [ -101.652401, 29.758795 ], [ -101.654578, 29.765163 ], [ -101.662453, 29.771280 ], [ -101.689992, 29.771213 ], [ -101.706636, 29.762737 ], [ -101.714224, 29.767660 ], [ -101.735202, 29.771592 ], [ -101.754323, 29.777662 ], [ -101.763274, 29.784170 ], [ -101.777161, 29.789327 ], [ -101.785668, 29.788252 ], [ -101.791003, 29.783038 ], [ -101.796870, 29.782619 ], [ -101.806508, 29.786390 ], [ -101.809441, 29.790161 ], [ -101.814889, 29.793095 ], [ -101.831232, 29.789323 ], [ -101.852604, 29.801895 ], [ -101.862242, 29.800219 ], [ -101.875400, 29.794023 ], [ -101.892739, 29.797891 ], [ -101.912406, 29.797850 ], [ -101.917557, 29.792676 ], [ -101.922585, 29.790161 ], [ -101.929709, 29.789323 ], [ -101.938090, 29.796028 ], [ -101.946471, 29.797704 ], [ -101.953595, 29.796866 ], [ -101.959462, 29.799381 ], [ -101.966167, 29.807343 ], [ -101.970357, 29.810276 ], [ -101.974548, 29.810276 ], [ -101.987539, 29.801057 ], [ -102.001786, 29.804828 ], [ -102.021919, 29.802491 ], [ -102.034759, 29.804028 ], [ -102.039013, 29.802655 ], [ -102.041088, 29.799610 ], [ -102.038412, 29.792832 ], [ -102.039227, 29.790977 ], [ -102.050044, 29.785070 ], [ -102.073646, 29.786926 ], [ -102.077348, 29.792421 ], [ -102.084439, 29.794962 ], [ -102.091816, 29.792854 ], [ -102.115682, 29.792390 ], [ -102.142326, 29.802854 ], [ -102.159601, 29.814356 ], [ -102.161674, 29.819487 ], [ -102.181894, 29.846034 ], [ -102.186150, 29.848462 ], [ -102.188672, 29.848943 ], [ -102.205381, 29.842438 ], [ -102.227553, 29.843534 ], [ -102.261389, 29.853283 ], [ -102.264041, 29.855964 ], [ -102.261777, 29.864002 ], [ -102.264954, 29.867806 ], [ -102.268817, 29.867991 ], [ -102.276755, 29.862978 ], [ -102.281249, 29.863117 ], [ -102.297331, 29.875194 ], [ -102.301381, 29.877674 ], [ -102.315389, 29.879920 ], [ -102.320619, 29.878980 ], [ -102.324634, 29.872307 ], [ -102.333384, 29.868046 ], [ -102.341033, 29.869305 ], [ -102.349861, 29.862317 ], [ -102.364542, 29.845387 ], [ -102.362514, 29.833156 ], [ -102.369522, 29.820395 ], [ -102.377254, 29.800163 ], [ -102.377313, 29.789971 ], [ -102.386678, 29.766880 ], [ -102.392906, 29.765569 ], [ -102.412062, 29.768062 ], [ -102.433301, 29.776608 ], [ -102.468946, 29.779817 ], [ -102.490331, 29.783948 ], [ -102.508313, 29.783219 ], [ -102.512687, 29.780303 ], [ -102.513381, 29.765760 ], [ -102.539417, 29.751629 ], [ -102.545492, 29.750900 ], [ -102.551081, 29.752358 ], [ -102.559343, 29.760377 ], [ -102.565661, 29.761592 ], [ -102.576353, 29.754302 ], [ -102.587774, 29.750657 ], [ -102.597160, 29.751608 ], [ -102.612879, 29.748182 ], [ -102.622534, 29.736632 ], [ -102.630151, 29.734315 ], [ -102.645665, 29.733910 ], [ -102.661252, 29.736123 ], [ -102.670971, 29.741954 ], [ -102.677192, 29.738261 ], [ -102.688164, 29.722487 ], [ -102.690238, 29.707482 ], [ -102.698347, 29.695591 ], [ -102.699317, 29.685029 ], [ -102.693466, 29.676507 ], [ -102.724231, 29.648415 ], [ -102.736948, 29.641538 ], [ -102.742031, 29.632142 ], [ -102.738428, 29.621929 ], [ -102.739991, 29.599041 ], [ -102.746202, 29.592875 ], [ -102.757066, 29.597799 ], [ -102.761811, 29.598397 ], [ -102.768341, 29.594734 ], [ -102.762241, 29.579449 ], [ -102.766124, 29.572348 ], [ -102.773961, 29.573084 ], [ -102.777531, 29.556497 ], [ -102.775725, 29.552189 ], [ -102.771429, 29.548546 ], [ -102.808692, 29.522319 ], [ -102.807327, 29.494009 ], [ -102.813954, 29.482806 ], [ -102.830970, 29.444267 ], [ -102.832539, 29.433109 ], [ -102.827355, 29.418262 ], [ -102.824564, 29.399558 ], [ -102.840778, 29.376962 ], [ -102.843021, 29.357988 ], [ -102.861630, 29.351639 ], [ -102.871857, 29.352093 ], [ -102.876866, 29.354059 ], [ -102.879534, 29.353327 ], [ -102.883722, 29.348059 ], [ -102.879805, 29.338755 ], [ -102.890489, 29.309499 ], [ -102.888328, 29.291947 ], [ -102.891022, 29.287113 ], [ -102.902605, 29.279441 ], [ -102.906296, 29.260011 ], [ -102.903189, 29.254029 ], [ -102.887902, 29.245612 ], [ -102.881135, 29.246022 ], [ -102.871347, 29.241625 ], [ -102.866846, 29.225015 ], [ -102.878020, 29.214698 ], [ -102.890064, 29.208814 ], [ -102.899231, 29.208863 ], [ -102.908787, 29.219337 ], [ -102.912131, 29.218902 ], [ -102.915866, 29.215878 ], [ -102.915554, 29.211342 ], [ -102.912448, 29.206255 ], [ -102.917805, 29.190697 ], [ -102.925482, 29.193723 ], [ -102.932612, 29.194113 ], [ -102.944911, 29.188820 ], [ -102.947156, 29.180777 ], [ -102.950890, 29.176835 ], [ -102.953475, 29.176308 ], [ -102.977266, 29.186226 ], [ -102.989432, 29.183174 ], [ -102.994653, 29.179620 ], [ -102.998096, 29.172676 ], [ -102.995688, 29.161219 ], [ -103.002434, 29.150261 ], [ -103.008362, 29.148293 ], [ -103.010325, 29.137822 ], [ -103.015028, 29.125770 ], [ -103.032983, 29.114118 ], [ -103.033303, 29.107356 ], [ -103.035683, 29.103029 ], [ -103.040442, 29.099351 ], [ -103.055370, 29.096539 ], [ -103.074407, 29.088534 ], [ -103.076355, 29.085722 ], [ -103.076847, 29.076059 ], [ -103.100266, 29.057700 ], [ -103.102532, 29.040507 ], [ -103.100368, 29.026877 ], [ -103.101608, 29.018123 ], [ -103.107811, 29.013812 ], [ -103.117238, 29.000209 ], [ -103.113922, 28.988547 ], [ -103.115328, 28.985270 ], [ -103.126748, 28.982124 ], [ -103.134931, 28.983525 ], [ -103.143274, 28.978074 ], [ -103.156646, 28.972831 ], [ -103.163865, 28.972099 ], [ -103.165923, 28.974002 ], [ -103.166235, 28.978836 ], [ -103.227801, 28.991532 ], [ -103.239109, 28.981651 ], [ -103.245121, 28.980240 ], [ -103.249155, 28.980952 ], [ -103.253285, 28.986687 ], [ -103.260308, 28.989731 ], [ -103.266003, 28.990206 ], [ -103.270357, 28.988114 ], [ -103.273357, 28.982844 ], [ -103.281190, 28.982138 ], [ -103.284749, 28.987121 ], [ -103.285936, 28.994003 ], [ -103.289258, 28.999698 ], [ -103.296614, 29.004444 ], [ -103.312987, 29.010139 ], [ -103.331022, 29.021766 ], [ -103.332920, 29.026987 ], [ -103.332446, 29.033394 ], [ -103.334819, 29.039801 ], [ -103.341463, 29.041224 ], [ -103.347870, 29.037428 ], [ -103.350816, 29.028567 ], [ -103.355428, 29.021529 ], [ -103.361998, 29.018914 ], [ -103.382125, 29.024249 ], [ -103.427754, 29.042334 ], [ -103.434668, 29.055317 ], [ -103.453029, 29.067467 ], [ -103.457386, 29.068597 ], [ -103.463196, 29.066822 ], [ -103.469167, 29.069242 ], [ -103.471265, 29.073115 ], [ -103.471426, 29.081345 ], [ -103.474815, 29.086671 ], [ -103.484429, 29.094524 ], [ -103.503236, 29.119110 ], [ -103.524613, 29.120998 ], [ -103.523384, 29.133389 ], [ -103.525027, 29.137354 ], [ -103.558679, 29.154962 ], [ -103.579462, 29.149965 ], [ -103.592360, 29.150260 ], [ -103.606438, 29.160411 ], [ -103.610540, 29.165773 ], [ -103.645635, 29.159286 ], [ -103.653180, 29.162864 ], [ -103.656808, 29.169099 ], [ -103.660203, 29.170934 ], [ -103.688670, 29.178294 ], [ -103.697314, 29.177194 ], [ -103.713770, 29.185008 ], [ -103.724743, 29.191470 ], [ -103.742175, 29.208610 ], [ -103.755943, 29.225545 ], [ -103.768570, 29.227361 ], [ -103.777623, 29.232265 ], [ -103.781660, 29.248804 ], [ -103.789034, 29.257502 ], [ -103.816642, 29.270927 ], [ -103.838303, 29.278304 ], [ -103.856893, 29.281852 ], [ -103.880606, 29.284962 ], [ -103.917106, 29.284216 ], [ -103.918910, 29.285042 ], [ -103.918857, 29.290107 ], [ -103.924976, 29.293913 ], [ -103.943698, 29.294946 ], [ -103.965796, 29.298587 ], [ -103.975235, 29.296017 ], [ -104.038282, 29.320156 ], [ -104.055596, 29.330910 ], [ -104.057244, 29.337694 ], [ -104.075924, 29.345075 ], [ -104.082150, 29.345923 ], [ -104.091022, 29.353692 ], [ -104.093326, 29.359926 ], [ -104.098378, 29.366756 ], [ -104.106467, 29.373127 ], [ -104.125475, 29.380922 ], [ -104.143692, 29.383278 ], [ -104.166563, 29.399352 ], [ -104.180070, 29.412764 ], [ -104.181273, 29.426265 ], [ -104.195990, 29.442884 ], [ -104.208194, 29.448201 ], [ -104.212529, 29.452439 ], [ -104.213948, 29.456222 ], [ -104.213239, 29.473010 ], [ -104.220569, 29.477976 ], [ -104.229081, 29.481050 ], [ -104.233825, 29.486545 ], [ -104.233487, 29.492734 ], [ -104.235847, 29.496744 ], [ -104.260293, 29.509425 ], [ -104.264155, 29.514001 ], [ -104.308813, 29.524337 ], [ -104.318074, 29.527938 ], [ -104.327483, 29.522188 ], [ -104.334811, 29.519463 ], [ -104.338113, 29.519967 ], [ -104.371175, 29.543063 ], [ -104.381041, 29.543406 ], [ -104.394589, 29.556087 ], [ -104.394351, 29.560535 ], [ -104.399591, 29.572319 ], [ -104.452301, 29.603660 ], [ -104.466520, 29.609296 ], [ -104.483502, 29.627741 ], [ -104.493659, 29.634017 ], [ -104.507568, 29.639624 ], [ -104.539761, 29.676074 ], [ -104.540559, 29.681129 ], [ -104.535770, 29.687248 ], [ -104.536302, 29.690441 ], [ -104.552241, 29.717123 ], [ -104.555601, 29.731221 ], [ -104.554660, 29.740726 ], [ -104.565951, 29.758795 ], [ -104.565688, 29.770462 ], [ -104.592472, 29.810276 ], [ -104.594023, 29.809221 ], [ -104.599149, 29.811007 ], [ -104.610166, 29.819118 ], [ -104.619039, 29.844445 ], [ -104.624350, 29.845222 ], [ -104.630103, 29.853314 ], [ -104.630360, 29.863377 ], [ -104.633275, 29.870485 ], [ -104.656783, 29.889333 ], [ -104.658650, 29.891557 ], [ -104.659042, 29.901413 ], [ -104.672327, 29.911112 ], [ -104.679772, 29.924659 ], [ -104.684322, 29.956086 ], [ -104.679661, 29.975272 ], [ -104.685479, 29.989943 ], [ -104.689641, 30.014950 ], [ -104.693592, 30.019077 ], [ -104.702311, 30.021322 ], [ -104.703998, 30.024210 ], [ -104.701102, 30.035534 ], [ -104.706874, 30.050685 ], [ -104.703582, 30.064530 ], [ -104.698233, 30.065287 ], [ -104.692778, 30.069757 ], [ -104.685003, 30.085643 ], [ -104.685687, 30.095957 ], [ -104.692094, 30.107304 ], [ -104.695366, 30.132130 ], [ -104.692123, 30.138663 ], [ -104.687507, 30.162203 ], [ -104.687296, 30.179464 ], [ -104.702788, 30.211736 ], [ -104.711236, 30.222921 ], [ -104.713166, 30.237957 ], [ -104.733822, 30.261221 ], [ -104.737360, 30.261380 ], [ -104.740448, 30.259454 ], [ -104.749664, 30.261260 ], [ -104.751567, 30.263644 ], [ -104.757894, 30.282396 ], [ -104.761634, 30.301148 ], [ -104.779356, 30.313188 ], [ -104.797291, 30.330336 ], [ -104.809794, 30.334926 ], [ -104.813478, 30.347061 ], [ -104.814779, 30.360497 ], [ -104.817596, 30.365915 ], [ -104.824314, 30.370466 ], [ -104.837493, 30.373909 ], [ -104.859521, 30.390413 ], [ -104.857440, 30.408957 ], [ -104.852420, 30.418792 ], [ -104.861074, 30.428897 ], [ -104.869872, 30.458645 ], [ -104.868711, 30.463230 ], [ -104.866119, 30.464790 ], [ -104.866094, 30.467380 ], [ -104.876787, 30.511004 ], [ -104.889376, 30.535144 ], [ -104.892228, 30.551420 ], [ -104.899001, 30.570400 ], [ -104.924796, 30.604832 ], [ -104.939873, 30.603939 ], [ -104.967167, 30.608107 ], [ -104.972071, 30.610260 ], [ -104.980291, 30.622040 ], [ -104.983981, 30.635206 ], [ -104.986300, 30.661059 ], [ -105.001240, 30.672583 ], [ -105.002057, 30.680972 ], [ -105.006801, 30.686039 ], [ -105.020142, 30.683637 ], [ -105.042930, 30.687256 ], [ -105.049885, 30.680817 ], [ -105.062334, 30.686303 ], [ -105.062626, 30.698222 ], [ -105.098282, 30.718914 ], [ -105.108076, 30.730050 ], [ -105.110706, 30.737750 ], [ -105.110682, 30.743366 ], [ -105.113816, 30.746001 ], [ -105.123265, 30.749504 ], [ -105.140207, 30.752502 ], [ -105.152362, 30.751452 ], [ -105.157640, 30.754008 ], [ -105.160153, 30.757059 ], [ -105.161230, 30.767468 ], [ -105.164819, 30.772493 ], [ -105.178279, 30.772134 ], [ -105.183436, 30.776645 ], [ -105.185931, 30.784392 ], [ -105.195144, 30.792138 ], [ -105.206161, 30.786454 ], [ -105.212917, 30.785415 ], [ -105.215967, 30.786492 ], [ -105.216685, 30.789543 ], [ -105.214891, 30.797260 ], [ -105.218660, 30.801567 ], [ -105.238364, 30.803109 ], [ -105.255416, 30.797029 ], [ -105.261361, 30.798078 ], [ -105.287238, 30.822206 ], [ -105.295630, 30.822206 ], [ -105.303673, 30.816961 ], [ -105.314863, 30.816961 ], [ -105.317660, 30.825004 ], [ -105.320108, 30.827452 ], [ -105.347695, 30.838065 ], [ -105.360672, 30.847384 ], [ -105.377417, 30.848645 ], [ -105.394242, 30.852979 ], [ -105.396690, 30.855427 ], [ -105.394249, 30.871961 ], [ -105.399609, 30.888941 ], [ -105.413505, 30.899808 ], [ -105.430089, 30.905792 ], [ -105.488027, 30.943278 ], [ -105.496856, 30.950494 ], [ -105.497964, 30.957279 ], [ -105.502257, 30.962680 ], [ -105.533088, 30.984859 ], [ -105.543676, 30.984746 ], [ -105.557430, 30.990229 ], [ -105.579114, 31.021645 ], [ -105.581404, 31.026847 ], [ -105.579542, 31.035396 ], [ -105.585323, 31.057488 ], [ -105.595921, 31.064842 ], [ -105.598773, 31.074926 ], [ -105.603330, 31.082625 ], [ -105.627349, 31.098545 ], [ -105.641890, 31.098322 ], [ -105.646731, 31.113908 ], [ -105.648834, 31.115902 ], [ -105.709491, 31.136375 ], [ -105.717006, 31.141438 ], [ -105.719540, 31.149161 ], [ -105.742678, 31.164897 ], [ -105.763531, 31.164121 ], [ -105.773257, 31.166897 ], [ -105.780021, 31.182666 ], [ -105.779725, 31.191283 ], [ -105.782895, 31.197563 ], [ -105.794386, 31.202240 ], [ -105.818835, 31.230681 ], [ -105.835722, 31.246812 ], [ -105.869353, 31.288634 ], [ -105.876015, 31.291589 ], [ -105.890872, 31.290014 ], [ -105.895035, 31.290978 ], [ -105.903461, 31.306769 ], [ -105.908771, 31.312774 ], [ -105.932553, 31.313121 ], [ -105.938452, 31.318735 ], [ -105.948091, 31.340069 ], [ -105.945903, 31.352810 ], [ -105.953943, 31.364749 ], [ -105.970101, 31.365937 ], [ -106.004926, 31.392458 ], [ -106.080258, 31.398702 ], [ -106.106877, 31.421403 ], [ -106.112169, 31.423578 ], [ -106.132782, 31.425367 ], [ -106.158218, 31.438885 ], [ -106.175675, 31.456279 ], [ -106.205827, 31.465976 ], [ -106.218843, 31.480300 ], [ -106.223909, 31.500422 ], [ -106.236804, 31.513376 ], [ -106.246203, 31.541153 ], [ -106.254780, 31.547997 ], [ -106.280811, 31.562062 ], [ -106.287785, 31.584445 ], [ -106.303536, 31.620413 ], [ -106.334737, 31.664112 ], [ -106.349538, 31.696711 ], [ -106.370139, 31.710710 ], [ -106.373839, 31.714810 ], [ -106.378039, 31.728310 ], [ -106.381039, 31.732110 ], [ -106.417940, 31.752009 ], [ -106.431541, 31.754209 ], [ -106.451541, 31.764808 ], [ -106.467642, 31.759608 ], [ -106.470742, 31.753508 ], [ -106.475542, 31.750109 ], [ -106.484642, 31.747809 ], [ -106.489542, 31.748408 ], [ -106.507342, 31.761208 ], [ -106.523643, 31.776207 ], [ -106.528643, 31.781807 ], [ -106.528543, 31.783907 ], [ -106.528543, 31.784407 ], [ -106.527997, 31.786945 ], [ -106.527623, 31.789119 ], [ -106.527738, 31.789761 ], [ -106.527943, 31.790507 ], [ -106.530515, 31.792103 ], [ -106.532480, 31.791914 ], [ -106.533000, 31.791829 ], [ -106.533043, 31.791907 ], [ -106.534743, 31.796107 ], [ -106.535154, 31.797089 ], [ -106.535343, 31.797507 ], [ -106.535843, 31.798607 ], [ -106.542097, 31.802146 ], [ -106.542144, 31.802107 ], [ -106.544714, 31.804287 ], [ -106.545344, 31.805007 ], [ -106.547144, 31.807305 ], [ -106.558444, 31.810406 ], [ -106.562945, 31.811104 ], [ -106.563444, 31.812606 ], [ -106.566844, 31.813306 ], [ -106.570944, 31.810206 ], [ -106.577244, 31.810406 ], [ -106.581344, 31.813906 ], [ -106.582144, 31.815506 ], [ -106.588045, 31.822106 ], [ -106.589045, 31.822706 ], [ -106.593826, 31.824901 ], [ -106.602727, 31.825024 ], [ -106.605267, 31.827912 ], [ -106.601945, 31.839605 ], [ -106.602045, 31.844405 ], [ -106.605245, 31.845905 ], [ -106.605845, 31.846305 ], [ -106.614637, 31.846490 ], [ -106.621857, 31.852854 ], [ -106.625763, 31.856276 ], [ -106.627808, 31.860593 ], [ -106.635926, 31.866235 ], [ -106.635880, 31.871514 ], [ -106.634873, 31.874478 ], [ -106.630799, 31.879697 ], [ -106.629197, 31.883717 ], [ -106.630692, 31.886411 ], [ -106.633927, 31.889184 ], [ -106.638154, 31.891663 ], [ -106.642900, 31.892933 ], [ -106.645296, 31.894859 ], [ -106.645646, 31.895649 ], [ -106.645479, 31.898670 ], [ -106.640840, 31.904598 ], [ -106.633668, 31.909790 ], [ -106.625947, 31.912227 ], [ -106.623445, 31.914034 ], [ -106.614346, 31.918003 ], [ -106.611846, 31.920003 ], [ -106.623933, 31.925335 ], [ -106.628663, 31.923614 ], [ -106.629747, 31.926570 ], [ -106.625322, 31.930053 ], [ -106.622529, 31.934863 ], [ -106.622117, 31.936621 ], [ -106.622377, 31.940863 ], [ -106.623659, 31.945510 ], [ -106.616136, 31.948439 ], [ -106.614702, 31.956000 ], [ -106.617708, 31.956008 ], [ -106.622819, 31.952891 ], [ -106.625123, 31.954531 ], [ -106.625535, 31.957476 ], [ -106.624299, 31.961054 ], [ -106.620454, 31.963403 ], [ -106.619371, 31.964777 ], [ -106.618745, 31.966955 ], [ -106.619569, 31.971578 ], [ -106.621873, 31.972933 ], [ -106.623216, 31.972910 ], [ -106.626466, 31.970690 ], [ -106.630114, 31.971258 ], [ -106.638186, 31.976820 ], [ -106.639529, 31.980348 ], [ -106.636492, 31.985719 ], [ -106.631182, 31.989809 ], [ -106.623568, 31.990999 ], [ -106.619448, 31.994733 ], [ -106.618486, 32.000495 ], [ -106.599096, 32.000731 ], [ -106.598639, 32.000754 ], [ -106.595333, 32.000778 ], [ -106.587972, 32.000749 ], [ -106.566056, 32.000759 ], [ -106.565142, 32.000736 ], [ -106.411075, 32.001334 ], [ -106.394298, 32.001484 ], [ -106.376861, 32.001172 ], [ -106.313307, 32.001512 ], [ -106.205915, 32.001762 ], [ -106.200699, 32.001785 ], [ -106.181840, 32.002050 ], [ -106.125534, 32.002533 ], [ -105.998003, 32.002328 ], [ -105.900600, 32.002100 ], [ -105.886159, 32.001970 ], [ -105.854061, 32.002350 ], [ -105.750527, 32.002206 ], [ -105.731362, 32.001564 ], [ -105.429281, 32.000577 ], [ -105.428582, 32.000600 ], [ -105.427049, 32.000638 ], [ -105.390396, 32.000607 ], [ -105.153994, 32.000497 ], [ -105.150310, 32.000497 ], [ -105.148240, 32.000485 ], [ -105.132916, 32.000518 ], [ -105.131377, 32.000524 ], [ -105.118040, 32.000485 ], [ -105.078605, 32.000533 ], [ -105.077046, 32.000579 ], [ -104.918272, 32.000496 ], [ -104.643526, 32.000443 ], [ -104.640918, 32.000396 ], [ -104.531937, 32.000311 ], [ -104.531756, 32.000117 ], [ -104.024521, 32.000010 ], [ -103.980179, 32.000125 ], [ -103.875476, 32.000554 ], [ -103.748317, 32.000198 ], [ -103.326501, 32.000370 ], [ -103.278521, 32.000419 ], [ -103.270383, 32.000326 ], [ -103.267708, 32.000324 ], [ -103.267633, 32.000475 ], [ -103.215641, 32.000513 ], [ -103.088698, 32.000453 ], [ -103.085876, 32.000465 ], [ -103.064423, 32.000518 ], [ -103.064344, 32.087051 ], [ -103.064348, 32.123041 ], [ -103.064422, 32.145006 ], [ -103.064696, 32.522193 ], [ -103.064761, 32.587983 ], [ -103.064788, 32.600397 ], [ -103.064761, 32.601863 ], [ -103.064815, 32.624537 ], [ -103.064633, 32.646420 ], [ -103.064864, 32.682647 ], [ -103.064798, 32.690761 ], [ -103.064799, 32.708694 ], [ -103.064827, 32.726628 ], [ -103.064807, 32.777303 ], [ -103.064698, 32.783602 ], [ -103.064711, 32.784593 ], [ -103.064699, 32.827531 ], [ -103.064672, 32.828470 ], [ -103.064889, 32.849359 ], [ -103.064916, 32.857260 ], [ -103.064807, 32.857696 ], [ -103.064862, 32.868346 ], [ -103.064701, 32.879355 ], [ -103.064569, 32.900014 ], [ -103.064657, 32.959097 ], [ -103.064679, 32.964373 ], [ -103.064625, 32.999899 ], [ -103.064452, 33.010290 ], [ -103.063980, 33.038693 ], [ -103.063905, 33.042055 ], [ -103.060103, 33.219225 ], [ -103.059720, 33.256262 ], [ -103.059242, 33.260371 ], [ -103.057856, 33.315234 ], [ -103.057487, 33.329477 ], [ -103.056655, 33.388438 ], [ -103.052610, 33.570599 ], [ -103.051664, 33.629489 ], [ -103.051363, 33.641950 ], [ -103.051535, 33.650487 ], [ -103.051087, 33.658186 ], [ -103.050532, 33.672408 ], [ -103.050148, 33.701971 ], [ -103.049608, 33.737766 ], [ -103.049096, 33.746270 ], [ -103.047346, 33.824675 ], [ -103.046907, 33.850300 ], [ -103.045644, 33.901537 ], [ -103.045698, 33.906299 ], [ -103.044893, 33.945617 ], [ -103.043950, 33.974629 ], [ -103.043617, 34.003633 ], [ -103.043531, 34.018014 ], [ -103.043555, 34.032714 ], [ -103.043746, 34.037294 ], [ -103.043771, 34.041538 ], [ -103.043721, 34.042320 ], [ -103.043767, 34.043545 ], [ -103.043744, 34.049986 ], [ -103.043686, 34.063078 ], [ -103.043516, 34.079382 ], [ -103.043569, 34.087947 ], [ -103.043644, 34.256903 ], [ -103.043719, 34.289441 ], [ -103.043936, 34.302585 ], [ -103.043979, 34.312764 ], [ -103.043946, 34.379555 ], [ -103.043944, 34.379660 ], [ -103.043919, 34.380916 ], [ -103.043693, 34.383578 ], [ -103.043630, 34.384690 ], [ -103.043614, 34.384969 ], [ -103.043613, 34.388679 ], [ -103.043613, 34.390442 ], [ -103.043585, 34.393716 ], [ -103.043611, 34.397105 ], [ -103.043583, 34.400678 ], [ -103.043538, 34.405463 ], [ -103.043582, 34.455657 ], [ -103.043588, 34.459662 ], [ -103.043589, 34.459774 ], [ -103.043594, 34.462660 ], [ -103.043072, 34.619782 ], [ -103.043286, 34.653099 ], [ -103.042827, 34.671188 ], [ -103.042769, 34.747361 ], [ -103.042770, 34.792224 ], [ -103.042781, 34.850243 ], [ -103.042521, 34.899546 ], [ -103.042642, 35.109913 ], [ -103.043261, 35.125058 ], [ -103.042520, 35.135596 ], [ -103.042600, 35.142766 ], [ -103.042711, 35.144735 ], [ -103.042568, 35.159318 ], [ -103.042395, 35.178573 ], [ -103.042339, 35.181922 ], [ -103.042366, 35.182786 ], [ -103.042377, 35.183149 ], [ -103.042497, 35.211862 ], [ -103.042775, 35.241237 ], [ -103.042366, 35.250056 ], [ -103.041554, 35.622487 ], [ -103.041146, 35.791583 ], [ -103.041917, 35.796441 ], [ -103.041716, 35.814072 ], [ -103.042186, 35.825217 ], [ -103.041305, 35.837694 ], [ -103.040824, 36.055231 ], [ -103.041674, 36.317534 ], [ -103.041745, 36.318267 ], [ -103.041924, 36.500439 ], [ -103.002434, 36.500397 ], [ -102.250453, 36.500369 ], [ -102.244990, 36.500704 ], [ -102.162463, 36.500326 ], [ -102.125450, 36.500324 ], [ -102.122066, 36.500684 ], [ -101.930245, 36.500526 ], [ -101.826565, 36.499654 ], [ -101.826498, 36.499535 ], [ -101.788110, 36.499678 ], [ -101.783359, 36.499709 ], [ -101.781987, 36.499718 ], [ -101.780610, 36.499727 ], [ -101.779435, 36.499734 ], [ -101.709314, 36.499722 ], [ -101.698685, 36.499508 ], [ -101.653708, 36.499573 ], [ -101.649966, 36.499573 ], [ -101.623915, 36.499528 ], [ -101.085156, 36.499244 ], [ -101.052418, 36.499563 ], [ -101.045331, 36.499540 ], [ -100.977088, 36.499595 ], [ -100.936058, 36.499602 ], [ -100.918513, 36.499621 ], [ -100.884174, 36.499682 ], [ -100.884080, 36.499682 ], [ -100.859657, 36.499687 ], [ -100.850840, 36.499700 ], [ -100.824236, 36.499618 ], [ -100.824218, 36.499618 ], [ -100.806190, 36.499674 ], [ -100.806172, 36.499634 ], [ -100.802909, 36.499621 ], [ -100.802886, 36.499621 ], [ -100.761811, 36.499618 ], [ -100.761811, 36.499580 ], [ -100.724362, 36.499580 ], [ -100.724361, 36.499558 ], [ -100.708626, 36.499553 ], [ -100.708628, 36.499521 ], [ -100.657763, 36.499483 ], [ -100.657763, 36.499500 ], [ -100.648343, 36.499495 ], [ -100.648344, 36.499463 ], [ -100.592614, 36.499469 ], [ -100.592556, 36.499469 ], [ -100.592551, 36.499429 ], [ -100.583539, 36.499483 ], [ -100.583379, 36.499443 ], [ -100.578114, 36.499463 ], [ -100.578114, 36.499439 ], [ -100.546145, 36.499343 ], [ -100.531215, 36.499341 ], [ -100.531215, 36.499290 ], [ -100.530478, 36.499240 ], [ -100.530314, 36.499357 ], [ -100.522227, 36.499291 ], [ -100.441065, 36.499490 ], [ -100.441064, 36.499462 ], [ -100.433959, 36.499456 ], [ -100.421328, 36.499447 ], [ -100.421301, 36.499488 ], [ -100.413634, 36.499444 ], [ -100.413550, 36.499469 ], [ -100.378634, 36.499517 ], [ -100.378592, 36.499445 ], [ -100.351852, 36.499487 ], [ -100.351842, 36.499473 ], [ -100.334464, 36.499420 ], [ -100.334441, 36.499440 ], [ -100.324150, 36.499679 ], [ -100.311245, 36.499631 ], [ -100.311018, 36.499688 ], [ -100.310643, 36.499642 ], [ -100.181221, 36.499633 ], [ -100.090021, 36.499634 ], [ -100.000406, 36.499702 ], [ -100.000399, 36.055677 ], [ -100.000392, 35.619115 ], [ -100.000385, 35.182702 ], [ -100.000381, 34.746461 ], [ -100.000381, 34.560509 ], [ -99.985833, 34.560079 ], [ -99.974762, 34.561318 ], [ -99.971555, 34.562179 ], [ -99.965608, 34.565844 ], [ -99.958898, 34.571271 ], [ -99.957541, 34.572709 ], [ -99.957553, 34.574169 ], [ -99.956717, 34.576524 ], [ -99.954567, 34.578195 ], [ -99.945720, 34.579273 ], [ -99.929334, 34.576714 ], [ -99.923211, 34.574552 ], [ -99.921801, 34.570253 ], [ -99.915771, 34.565975 ], [ -99.898943, 34.555804 ], [ -99.896007, 34.555530 ], [ -99.893760, 34.554219 ], [ -99.887147, 34.549047 ], [ -99.874403, 34.537095 ], [ -99.873254, 34.535351 ], [ -99.872357, 34.532096 ], [ -99.868953, 34.527615 ], [ -99.853066, 34.511593 ], [ -99.832904, 34.500068 ], [ -99.825325, 34.497596 ], [ -99.818186, 34.487840 ], [ -99.818739, 34.484976 ], [ -99.814313, 34.476204 ], [ -99.793684, 34.453894 ], [ -99.782986, 34.444364 ], [ -99.775743, 34.444225 ], [ -99.765599, 34.437488 ], [ -99.764826, 34.436434 ], [ -99.764882, 34.435266 ], [ -99.767648, 34.431854 ], [ -99.767234, 34.430502 ], [ -99.754248, 34.421289 ], [ -99.740907, 34.414763 ], [ -99.730348, 34.411240 ], [ -99.720259, 34.406295 ], [ -99.716416, 34.402815 ], [ -99.715089, 34.400754 ], [ -99.714232, 34.397822 ], [ -99.714838, 34.394524 ], [ -99.712682, 34.390928 ], [ -99.707901, 34.387539 ], [ -99.696462, 34.381036 ], [ -99.678283, 34.379799 ], [ -99.671377, 34.377714 ], [ -99.665992, 34.374185 ], [ -99.662705, 34.373680 ], [ -99.659362, 34.374390 ], [ -99.654194, 34.376519 ], [ -99.649662, 34.379885 ], [ -99.630905, 34.376007 ], [ -99.624197, 34.373577 ], [ -99.600026, 34.374688 ], [ -99.596323, 34.377137 ], [ -99.587596, 34.385867 ], [ -99.585442, 34.388914 ], [ -99.584531, 34.391205 ], [ -99.585306, 34.398122 ], [ -99.584480, 34.407673 ], [ -99.580060, 34.416653 ], [ -99.574367, 34.418281 ], [ -99.569696, 34.418418 ], [ -99.562204, 34.417319 ], [ -99.555986, 34.414640 ], [ -99.549242, 34.412715 ], [ -99.529786, 34.411452 ], [ -99.523650, 34.412206 ], [ -99.517624, 34.414494 ], [ -99.514280, 34.414035 ], [ -99.499875, 34.409608 ], [ -99.497091, 34.407731 ], [ -99.494104, 34.404755 ], [ -99.490426, 34.399694 ], [ -99.487219, 34.397955 ], [ -99.477547, 34.396355 ], [ -99.470969, 34.396471 ], [ -99.452648, 34.388252 ], [ -99.445021, 34.379892 ], [ -99.440760, 34.374123 ], [ -99.430995, 34.373414 ], [ -99.420432, 34.380464 ], [ -99.408848, 34.372776 ], [ -99.407168, 34.372605 ], [ -99.402960, 34.373481 ], [ -99.399603, 34.375079 ], [ -99.397253, 34.377871 ], [ -99.391492, 34.405631 ], [ -99.393919, 34.415274 ], [ -99.396488, 34.417291 ], [ -99.396902, 34.418688 ], [ -99.397010, 34.424003 ], [ -99.394956, 34.442099 ], [ -99.381011, 34.456936 ], [ -99.375365, 34.458845 ], [ -99.369610, 34.458699 ], [ -99.358795, 34.455863 ], [ -99.354672, 34.451857 ], [ -99.354837, 34.449658 ], [ -99.356771, 34.446542 ], [ -99.357102, 34.444915 ], [ -99.356713, 34.442144 ], [ -99.350407, 34.437083 ], [ -99.341337, 34.431061 ], [ -99.334037, 34.427536 ], [ -99.328674, 34.422383 ], [ -99.324222, 34.414458 ], [ -99.319606, 34.408869 ], [ -99.318363, 34.408296 ], [ -99.316373, 34.408205 ], [ -99.308274, 34.410014 ], [ -99.299098, 34.414228 ], [ -99.294648, 34.415373 ], [ -99.289922, 34.414731 ], [ -99.264167, 34.405149 ], [ -99.261321, 34.403499 ], [ -99.258980, 34.391243 ], [ -99.261191, 34.389548 ], [ -99.264508, 34.388085 ], [ -99.273958, 34.387560 ], [ -99.275340, 34.386599 ], [ -99.274926, 34.384904 ], [ -99.271281, 34.381604 ], [ -99.258696, 34.372634 ], [ -99.254722, 34.372405 ], [ -99.251408, 34.375080 ], [ -99.248969, 34.375984 ], [ -99.242945, 34.372668 ], [ -99.237233, 34.362717 ], [ -99.234252, 34.353459 ], [ -99.233274, 34.344101 ], [ -99.232606, 34.342380 ], [ -99.229994, 34.340538 ], [ -99.226153, 34.339726 ], [ -99.221975, 34.340020 ], [ -99.219769, 34.341377 ], [ -99.217335, 34.341520 ], [ -99.213135, 34.340369 ], [ -99.210716, 34.336304 ], [ -99.209724, 34.324935 ], [ -99.211600, 34.313970 ], [ -99.213476, 34.310672 ], [ -99.211648, 34.292232 ], [ -99.209742, 34.286345 ], [ -99.207561, 34.283505 ], [ -99.203681, 34.281926 ], [ -99.200222, 34.281152 ], [ -99.196260, 34.281463 ], [ -99.195605, 34.280839 ], [ -99.194570, 34.272424 ], [ -99.196926, 34.260929 ], [ -99.197153, 34.244298 ], [ -99.195553, 34.240060 ], [ -99.191139, 34.232340 ], [ -99.190146, 34.229660 ], [ -99.190036, 34.227186 ], [ -99.192076, 34.222192 ], [ -99.192683, 34.218825 ], [ -99.192104, 34.216694 ], [ -99.189511, 34.214312 ], [ -99.159016, 34.208880 ], [ -99.143985, 34.214763 ], [ -99.138220, 34.219159 ], [ -99.130609, 34.219408 ], [ -99.128514, 34.218766 ], [ -99.127549, 34.217986 ], [ -99.126614, 34.215329 ], [ -99.127525, 34.213771 ], [ -99.130090, 34.212192 ], [ -99.131553, 34.209352 ], [ -99.131885, 34.207382 ], [ -99.129792, 34.204403 ], [ -99.126567, 34.203004 ], [ -99.119204, 34.201747 ], [ -99.108758, 34.203401 ], [ -99.092191, 34.209316 ], [ -99.079535, 34.211518 ], [ -99.075978, 34.211221 ], [ -99.066465, 34.208404 ], [ -99.060344, 34.204761 ], [ -99.059159, 34.202929 ], [ -99.058800, 34.201256 ], [ -99.058084, 34.200569 ], [ -99.048792, 34.198209 ], [ -99.043471, 34.198208 ], [ -99.040962, 34.200842 ], [ -99.039004, 34.204667 ], [ -99.037459, 34.206454 ], [ -99.036273, 34.206912 ], [ -99.013075, 34.203222 ], [ -99.005790, 34.206647 ], [ -99.002916, 34.208782 ], [ -99.003433, 34.214466 ], [ -99.000761, 34.217643 ], [ -98.990852, 34.221633 ], [ -98.987294, 34.221223 ], [ -98.981364, 34.217583 ], [ -98.978685, 34.210231 ], [ -98.976587, 34.206291 ], [ -98.974132, 34.203566 ], [ -98.969003, 34.201299 ], [ -98.966302, 34.201323 ], [ -98.962470, 34.204668 ], [ -98.962085, 34.206386 ], [ -98.962307, 34.211312 ], [ -98.960791, 34.213030 ], [ -98.958475, 34.213855 ], [ -98.952513, 34.212650 ], [ -98.950396, 34.211680 ], [ -98.940220, 34.203686 ], [ -98.928145, 34.192689 ], [ -98.927456, 34.191155 ], [ -98.923129, 34.185978 ], [ -98.920704, 34.183435 ], [ -98.918333, 34.181831 ], [ -98.909349, 34.177499 ], [ -98.872922, 34.166584 ], [ -98.871543, 34.165027 ], [ -98.871211, 34.163012 ], [ -98.872229, 34.160446 ], [ -98.874955, 34.157031 ], [ -98.874872, 34.155657 ], [ -98.873271, 34.153596 ], [ -98.868116, 34.149635 ], [ -98.862550, 34.149111 ], [ -98.860125, 34.149913 ], [ -98.858419, 34.152732 ], [ -98.857900, 34.159627 ], [ -98.857322, 34.161094 ], [ -98.855585, 34.161621 ], [ -98.831115, 34.162154 ], [ -98.812954, 34.158444 ], [ -98.806810, 34.155901 ], [ -98.792015, 34.143736 ], [ -98.765570, 34.136376 ], [ -98.761797, 34.133785 ], [ -98.760558, 34.132388 ], [ -98.759486, 34.128882 ], [ -98.759653, 34.126912 ], [ -98.757037, 34.124633 ], [ -98.749291, 34.124238 ], [ -98.741966, 34.125530 ], [ -98.739461, 34.127394 ], [ -98.737232, 34.130992 ], [ -98.736820, 34.133374 ], [ -98.735471, 34.135208 ], [ -98.734287, 34.135758 ], [ -98.717537, 34.136450 ], [ -98.716104, 34.135947 ], [ -98.696518, 34.133521 ], [ -98.690072, 34.133155 ], [ -98.655655, 34.158258 ], [ -98.650583, 34.163113 ], [ -98.648073, 34.164441 ], [ -98.643223, 34.164531 ], [ -98.635730, 34.161618 ], [ -98.621666, 34.157195 ], [ -98.616733, 34.156418 ], [ -98.611829, 34.156558 ], [ -98.608853, 34.157521 ], [ -98.603978, 34.160249 ], [ -98.599789, 34.160571 ], [ -98.577136, 34.148962 ], [ -98.572451, 34.145091 ], [ -98.560191, 34.133202 ], [ -98.558593, 34.128254 ], [ -98.550917, 34.119334 ], [ -98.536257, 34.107343 ], [ -98.530611, 34.099843 ], [ -98.528200, 34.094961 ], [ -98.504182, 34.072371 ], [ -98.486328, 34.062598 ], [ -98.482040, 34.062270 ], [ -98.475066, 34.064269 ], [ -98.449034, 34.073462 ], [ -98.446379, 34.075430 ], [ -98.445784, 34.076827 ], [ -98.445585, 34.079298 ], [ -98.443724, 34.082152 ], [ -98.442808, 34.083144 ], [ -98.440092, 34.084311 ], [ -98.432127, 34.085622 ], [ -98.428480, 34.085523 ], [ -98.425230, 34.084799 ], [ -98.422253, 34.083037 ], [ -98.419995, 34.082488 ], [ -98.417813, 34.083029 ], [ -98.414426, 34.085074 ], [ -98.399777, 34.099973 ], [ -98.398389, 34.104566 ], [ -98.398160, 34.121396 ], [ -98.400494, 34.121778 ], [ -98.400967, 34.122236 ], [ -98.398441, 34.128456 ], [ -98.384381, 34.146317 ], [ -98.381238, 34.149454 ], [ -98.367494, 34.156191 ], [ -98.364023, 34.157109 ], [ -98.325445, 34.151025 ], [ -98.322580, 34.149720 ], [ -98.318750, 34.146421 ], [ -98.300209, 34.134579 ], [ -98.293901, 34.133020 ], [ -98.280321, 34.130750 ], [ -98.256467, 34.129481 ], [ -98.247954, 34.130717 ], [ -98.241013, 34.133103 ], [ -98.225282, 34.127245 ], [ -98.223600, 34.125093 ], [ -98.216463, 34.121821 ], [ -98.203711, 34.117676 ], [ -98.200075, 34.116783 ], [ -98.191455, 34.115753 ], [ -98.169120, 34.114171 ], [ -98.157412, 34.120467 ], [ -98.154354, 34.122734 ], [ -98.142754, 34.136359 ], [ -98.136770, 34.144992 ], [ -98.130816, 34.150532 ], [ -98.123377, 34.154540 ], [ -98.114506, 34.154727 ], [ -98.109462, 34.154111 ], [ -98.107065, 34.152531 ], [ -98.101937, 34.146830 ], [ -98.090224, 34.130181 ], [ -98.089755, 34.128211 ], [ -98.090660, 34.121980 ], [ -98.092421, 34.116917 ], [ -98.095118, 34.111190 ], [ -98.099328, 34.104295 ], [ -98.104309, 34.098200 ], [ -98.119417, 34.084474 ], [ -98.121039, 34.081266 ], [ -98.120208, 34.072127 ], [ -98.118030, 34.067065 ], [ -98.114587, 34.062280 ], [ -98.099096, 34.048639 ], [ -98.096177, 34.044625 ], [ -98.096542, 34.040976 ], [ -98.097272, 34.038969 ], [ -98.098001, 34.038240 ], [ -98.102015, 34.037327 ], [ -98.104022, 34.036233 ], [ -98.105482, 34.033861 ], [ -98.105482, 34.031307 ], [ -98.103617, 34.029207 ], [ -98.088203, 34.005481 ], [ -98.085260, 34.003259 ], [ -98.082839, 34.002412 ], [ -98.055197, 33.995841 ], [ -98.041117, 33.993456 ], [ -98.027672, 33.993357 ], [ -98.019485, 33.993804 ], [ -98.005667, 33.995964 ], [ -97.987388, 33.999823 ], [ -97.982806, 34.001949 ], [ -97.978243, 34.005387 ], [ -97.974173, 34.006716 ], [ -97.971670, 34.005434 ], [ -97.968340, 34.000530 ], [ -97.963028, 33.994235 ], [ -97.958325, 33.990846 ], [ -97.955850, 33.990136 ], [ -97.952688, 33.990114 ], [ -97.947572, 33.991053 ], [ -97.946473, 33.990732 ], [ -97.945730, 33.989839 ], [ -97.945950, 33.988396 ], [ -97.956917, 33.958502 ], [ -97.960351, 33.951928 ], [ -97.965737, 33.947392 ], [ -97.972662, 33.944527 ], [ -97.974173, 33.942832 ], [ -97.974062, 33.940289 ], [ -97.972494, 33.937907 ], [ -97.971175, 33.937129 ], [ -97.965953, 33.936191 ], [ -97.963425, 33.936237 ], [ -97.955511, 33.938186 ], [ -97.954467, 33.937774 ], [ -97.953395, 33.936445 ], [ -97.952679, 33.929482 ], [ -97.953695, 33.924373 ], [ -97.957155, 33.914454 ], [ -97.960615, 33.910354 ], [ -97.964461, 33.907398 ], [ -97.969873, 33.905999 ], [ -97.973143, 33.908014 ], [ -97.976963, 33.912549 ], [ -97.978804, 33.912548 ], [ -97.979985, 33.911402 ], [ -97.983552, 33.904002 ], [ -97.984540, 33.900703 ], [ -97.984566, 33.899077 ], [ -97.983769, 33.897200 ], [ -97.977859, 33.889929 ], [ -97.974178, 33.886643 ], [ -97.967777, 33.882430 ], [ -97.958438, 33.879179 ], [ -97.951215, 33.878424 ], [ -97.946464, 33.878883 ], [ -97.942730, 33.879845 ], [ -97.938802, 33.879891 ], [ -97.936743, 33.879204 ], [ -97.905467, 33.863531 ], [ -97.896738, 33.857985 ], [ -97.877387, 33.850236 ], [ -97.871447, 33.849001 ], [ -97.865765, 33.849393 ], [ -97.834333, 33.857671 ], [ -97.805423, 33.877167 ], [ -97.803473, 33.880190 ], [ -97.801578, 33.885138 ], [ -97.784657, 33.890632 ], [ -97.780618, 33.895533 ], [ -97.779683, 33.899243 ], [ -97.780340, 33.904833 ], [ -97.783717, 33.910560 ], [ -97.772672, 33.914382 ], [ -97.765446, 33.913532 ], [ -97.763770, 33.914241 ], [ -97.760224, 33.917194 ], [ -97.759399, 33.918820 ], [ -97.759834, 33.925210 ], [ -97.762661, 33.930846 ], [ -97.762768, 33.934396 ], [ -97.752957, 33.937049 ], [ -97.738478, 33.937421 ], [ -97.736554, 33.936575 ], [ -97.733723, 33.936392 ], [ -97.732267, 33.936691 ], [ -97.725289, 33.941045 ], [ -97.716772, 33.947666 ], [ -97.709684, 33.954997 ], [ -97.704159, 33.963336 ], [ -97.697921, 33.977331 ], [ -97.693110, 33.983699 ], [ -97.688023, 33.986607 ], [ -97.671772, 33.991370 ], [ -97.661489, 33.990818 ], [ -97.656210, 33.989488 ], [ -97.633778, 33.981257 ], [ -97.609091, 33.968093 ], [ -97.589598, 33.953554 ], [ -97.588828, 33.951882 ], [ -97.591514, 33.928200 ], [ -97.595084, 33.922954 ], [ -97.596155, 33.922106 ], [ -97.596979, 33.920228 ], [ -97.597115, 33.917868 ], [ -97.596289, 33.913769 ], [ -97.589254, 33.903922 ], [ -97.587441, 33.902479 ], [ -97.582744, 33.900785 ], [ -97.558270, 33.897099 ], [ -97.555002, 33.897282 ], [ -97.551541, 33.897947 ], [ -97.543246, 33.901289 ], [ -97.532723, 33.906577 ], [ -97.525277, 33.911751 ], [ -97.519171, 33.913638 ], [ -97.500960, 33.919643 ], [ -97.494858, 33.919258 ], [ -97.486505, 33.916994 ], [ -97.460376, 33.903948 ], [ -97.458069, 33.901635 ], [ -97.450954, 33.891398 ], [ -97.451469, 33.870930 ], [ -97.457617, 33.855126 ], [ -97.459566, 33.853316 ], [ -97.461486, 33.849560 ], [ -97.462857, 33.841772 ], [ -97.459068, 33.834581 ], [ -97.453057, 33.828536 ], [ -97.444193, 33.823773 ], [ -97.426493, 33.819398 ], [ -97.410387, 33.818845 ], [ -97.372941, 33.819454 ], [ -97.368744, 33.821471 ], [ -97.365507, 33.823763 ], [ -97.358513, 33.830018 ], [ -97.348338, 33.843876 ], [ -97.340900, 33.860236 ], [ -97.339392, 33.867630 ], [ -97.336524, 33.872827 ], [ -97.332940, 33.874440 ], [ -97.329176, 33.874440 ], [ -97.327563, 33.873903 ], [ -97.326487, 33.872648 ], [ -97.324158, 33.866017 ], [ -97.322365, 33.864941 ], [ -97.318243, 33.865121 ], [ -97.315913, 33.865838 ], [ -97.314413, 33.866989 ], [ -97.307490, 33.878204 ], [ -97.302471, 33.880175 ], [ -97.299245, 33.880175 ], [ -97.294227, 33.876412 ], [ -97.285983, 33.868526 ], [ -97.279108, 33.864555 ], [ -97.275348, 33.863225 ], [ -97.271532, 33.862560 ], [ -97.256625, 33.863286 ], [ -97.255636, 33.863698 ], [ -97.254235, 33.865323 ], [ -97.249209, 33.875101 ], [ -97.246180, 33.900344 ], [ -97.244946, 33.903092 ], [ -97.242092, 33.906277 ], [ -97.226522, 33.914642 ], [ -97.210921, 33.916064 ], [ -97.206141, 33.914280 ], [ -97.185458, 33.900700 ], [ -97.180845, 33.895204 ], [ -97.179609, 33.892250 ], [ -97.166629, 33.847311 ], [ -97.166824, 33.840395 ], [ -97.171627, 33.835335 ], [ -97.181370, 33.831375 ], [ -97.186254, 33.830894 ], [ -97.193690, 33.831307 ], [ -97.195831, 33.830803 ], [ -97.197477, 33.829795 ], [ -97.199700, 33.827322 ], [ -97.203514, 33.821825 ], [ -97.204995, 33.818870 ], [ -97.205652, 33.809824 ], [ -97.205431, 33.801488 ], [ -97.203236, 33.797343 ], [ -97.194786, 33.785344 ], [ -97.190397, 33.781153 ], [ -97.187792, 33.769702 ], [ -97.181843, 33.755870 ], [ -97.172192, 33.737545 ], [ -97.163149, 33.729322 ], [ -97.155066, 33.724442 ], [ -97.149394, 33.721967 ], [ -97.137530, 33.718664 ], [ -97.126102, 33.716941 ], [ -97.121102, 33.717174 ], [ -97.113265, 33.718804 ], [ -97.108936, 33.720294 ], [ -97.104525, 33.722608 ], [ -97.097154, 33.727809 ], [ -97.094085, 33.730992 ], [ -97.091072, 33.735115 ], [ -97.086195, 33.743933 ], [ -97.084693, 33.753147 ], [ -97.084613, 33.759993 ], [ -97.085218, 33.765512 ], [ -97.087852, 33.774099 ], [ -97.093917, 33.789052 ], [ -97.095236, 33.794136 ], [ -97.094771, 33.798532 ], [ -97.092112, 33.804097 ], [ -97.087999, 33.808747 ], [ -97.078590, 33.812756 ], [ -97.067977, 33.814476 ], [ -97.062632, 33.816079 ], [ -97.058623, 33.818752 ], [ -97.055416, 33.823830 ], [ -97.055148, 33.825701 ], [ -97.055683, 33.830779 ], [ -97.057821, 33.834520 ], [ -97.058623, 33.837728 ], [ -97.057554, 33.840133 ], [ -97.055416, 33.841202 ], [ -97.052209, 33.841737 ], [ -97.048734, 33.840935 ], [ -97.041245, 33.837761 ], [ -97.038858, 33.838264 ], [ -97.023899, 33.844213 ], [ -97.017857, 33.850142 ], [ -96.985567, 33.886522 ], [ -96.983971, 33.892083 ], [ -96.984939, 33.904866 ], [ -96.988745, 33.918468 ], [ -96.993997, 33.928979 ], [ -96.995023, 33.932035 ], [ -96.996183, 33.941728 ], [ -96.995368, 33.947302 ], [ -96.994288, 33.949206 ], [ -96.990835, 33.952701 ], [ -96.987892, 33.954671 ], [ -96.981337, 33.956378 ], [ -96.979415, 33.956178 ], [ -96.979347, 33.955130 ], [ -96.980676, 33.951814 ], [ -96.981031, 33.949160 ], [ -96.979818, 33.941588 ], [ -96.976955, 33.937453 ], [ -96.973807, 33.935697 ], [ -96.972542, 33.935795 ], [ -96.952313, 33.944582 ], [ -96.944611, 33.949217 ], [ -96.932252, 33.955688 ], [ -96.924268, 33.959159 ], [ -96.922114, 33.959579 ], [ -96.918618, 33.958926 ], [ -96.916300, 33.957798 ], [ -96.911336, 33.953960 ], [ -96.907387, 33.950025 ], [ -96.905253, 33.947219 ], [ -96.902434, 33.942018 ], [ -96.899442, 33.933728 ], [ -96.896469, 33.913318 ], [ -96.897194, 33.902954 ], [ -96.895728, 33.896414 ], [ -96.883010, 33.868019 ], [ -96.875281, 33.860505 ], [ -96.866438, 33.853149 ], [ -96.856090, 33.847490 ], [ -96.850593, 33.847211 ], [ -96.845896, 33.848975 ], [ -96.841592, 33.852894 ], [ -96.840819, 33.863645 ], [ -96.839778, 33.868396 ], [ -96.837413, 33.871349 ], [ -96.832157, 33.874835 ], [ -96.812778, 33.872646 ], [ -96.794276, 33.868886 ], [ -96.783485, 33.863534 ], [ -96.780569, 33.860098 ], [ -96.779588, 33.857939 ], [ -96.777202, 33.848162 ], [ -96.776766, 33.841976 ], [ -96.770676, 33.829621 ], [ -96.769378, 33.827477 ], [ -96.766235, 33.825458 ], [ -96.761588, 33.824406 ], [ -96.754041, 33.824658 ], [ -96.746038, 33.825699 ], [ -96.712422, 33.831633 ], [ -96.708134, 33.833060 ], [ -96.704457, 33.835021 ], [ -96.699574, 33.839049 ], [ -96.690708, 33.849959 ], [ -96.688191, 33.854613 ], [ -96.684727, 33.862905 ], [ -96.682209, 33.873876 ], [ -96.682103, 33.876645 ], [ -96.683464, 33.884217 ], [ -96.680947, 33.896204 ], [ -96.675306, 33.909114 ], [ -96.673449, 33.912278 ], [ -96.670618, 33.914914 ], [ -96.667187, 33.916940 ], [ -96.664410, 33.917267 ], [ -96.659896, 33.916666 ], [ -96.644050, 33.905962 ], [ -96.630117, 33.895422 ], [ -96.628294, 33.894477 ], [ -96.607562, 33.894735 ], [ -96.592948, 33.895616 ], [ -96.587934, 33.894784 ], [ -96.585452, 33.891281 ], [ -96.585360, 33.888948 ], [ -96.587494, 33.884251 ], [ -96.590112, 33.880665 ], [ -96.597348, 33.875101 ], [ -96.601686, 33.872823 ], [ -96.611970, 33.869016 ], [ -96.625399, 33.856542 ], [ -96.628969, 33.852407 ], [ -96.629747, 33.850866 ], [ -96.630022, 33.847541 ], [ -96.629290, 33.845488 ], [ -96.623155, 33.841483 ], [ -96.601258, 33.834327 ], [ -96.592926, 33.830916 ], [ -96.587067, 33.828009 ], [ -96.572937, 33.819098 ], [ -96.566298, 33.818511 ], [ -96.551223, 33.819129 ], [ -96.532865, 33.823005 ], [ -96.529234, 33.822127 ], [ -96.526655, 33.820891 ], [ -96.523863, 33.818114 ], [ -96.519911, 33.811347 ], [ -96.516584, 33.803168 ], [ -96.515959, 33.798934 ], [ -96.515912, 33.787795 ], [ -96.511914, 33.781478 ], [ -96.502286, 33.773460 ], [ -96.500268, 33.772583 ], [ -96.486060, 33.773010 ], [ -96.459154, 33.775232 ], [ -96.456254, 33.776035 ], [ -96.450510, 33.780588 ], [ -96.448045, 33.781031 ], [ -96.436455, 33.780050 ], [ -96.430214, 33.778654 ], [ -96.422643, 33.776041 ], [ -96.419961, 33.773034 ], [ -96.417562, 33.769038 ], [ -96.416146, 33.766099 ], [ -96.413408, 33.757714 ], [ -96.408469, 33.751192 ], [ -96.403507, 33.746289 ], [ -96.384116, 33.730141 ], [ -96.369590, 33.716809 ], [ -96.366945, 33.711222 ], [ -96.363253, 33.701050 ], [ -96.363135, 33.694215 ], [ -96.362198, 33.691818 ], [ -96.355946, 33.687155 ], [ -96.348306, 33.686379 ], [ -96.342665, 33.686975 ], [ -96.321103, 33.695100 ], [ -96.318760, 33.696753 ], [ -96.316925, 33.698997 ], [ -96.309964, 33.710489 ], [ -96.307035, 33.719987 ], [ -96.306596, 33.726786 ], [ -96.307389, 33.735005 ], [ -96.306100, 33.741002 ], [ -96.303009, 33.750878 ], [ -96.301706, 33.753756 ], [ -96.294867, 33.764771 ], [ -96.292482, 33.766419 ], [ -96.277269, 33.769735 ], [ -96.269896, 33.768405 ], [ -96.248232, 33.758986 ], [ -96.229023, 33.748021 ], [ -96.220521, 33.747390 ], [ -96.199900, 33.752117 ], [ -96.186554, 33.756375 ], [ -96.178059, 33.760518 ], [ -96.174633, 33.763699 ], [ -96.169452, 33.770131 ], [ -96.162757, 33.788769 ], [ -96.162123, 33.796140 ], [ -96.166837, 33.797908 ], [ -96.170373, 33.799382 ], [ -96.173025, 33.800560 ], [ -96.175150, 33.801951 ], [ -96.177340, 33.805117 ], [ -96.178964, 33.810553 ], [ -96.176910, 33.813934 ], [ -96.175890, 33.814627 ], [ -96.164217, 33.817001 ], [ -96.150765, 33.816987 ], [ -96.148792, 33.819197 ], [ -96.151630, 33.831946 ], [ -96.150147, 33.835856 ], [ -96.148070, 33.837799 ], [ -96.138905, 33.839159 ], [ -96.122951, 33.839964 ], [ -96.118169, 33.837884 ], [ -96.109993, 33.832396 ], [ -96.104075, 33.830730 ], [ -96.099360, 33.830470 ], [ -96.097448, 33.832725 ], [ -96.097638, 33.837935 ], [ -96.099153, 33.842409 ], [ -96.100785, 33.844230 ], [ -96.101349, 33.845721 ], [ -96.101473, 33.846709 ], [ -96.100095, 33.847971 ], [ -96.084626, 33.846656 ], [ -96.063924, 33.841523 ], [ -96.055358, 33.838262 ], [ -96.048834, 33.836468 ], [ -96.037191, 33.841245 ], [ -96.031271, 33.850758 ], [ -96.029463, 33.852402 ], [ -96.025188, 33.852073 ], [ -96.022229, 33.850923 ], [ -96.021900, 33.849114 ], [ -96.022507, 33.846130 ], [ -96.022065, 33.843196 ], [ -96.021407, 33.841881 ], [ -96.019599, 33.840566 ], [ -96.005296, 33.845505 ], [ -95.998351, 33.851049 ], [ -95.997709, 33.852182 ], [ -95.997405, 33.855526 ], [ -95.997734, 33.860951 ], [ -95.996748, 33.864403 ], [ -95.993624, 33.866211 ], [ -95.991487, 33.866869 ], [ -95.988857, 33.866869 ], [ -95.984254, 33.864403 ], [ -95.980966, 33.859307 ], [ -95.972156, 33.856371 ], [ -95.951609, 33.857017 ], [ -95.944284, 33.859811 ], [ -95.941267, 33.861619 ], [ -95.936631, 33.870615 ], [ -95.935325, 33.875099 ], [ -95.935308, 33.878724 ], [ -95.935637, 33.880371 ], [ -95.936817, 33.882386 ], [ -95.937202, 33.884652 ], [ -95.936132, 33.886826 ], [ -95.935198, 33.887101 ], [ -95.922712, 33.883758 ], [ -95.915961, 33.881148 ], [ -95.905343, 33.875629 ], [ -95.893306, 33.868161 ], [ -95.887491, 33.863856 ], [ -95.881292, 33.860627 ], [ -95.859469, 33.852456 ], [ -95.849864, 33.844952 ], [ -95.843773, 33.838949 ], [ -95.840012, 33.836486 ], [ -95.837516, 33.835640 ], [ -95.831948, 33.835161 ], [ -95.828245, 33.836054 ], [ -95.822787, 33.838756 ], [ -95.820784, 33.840564 ], [ -95.819358, 33.842785 ], [ -95.818976, 33.844456 ], [ -95.819525, 33.848439 ], [ -95.820677, 33.850751 ], [ -95.821666, 33.855443 ], [ -95.821666, 33.856633 ], [ -95.820596, 33.858465 ], [ -95.805149, 33.861304 ], [ -95.800842, 33.861212 ], [ -95.789867, 33.857686 ], [ -95.787891, 33.856336 ], [ -95.776255, 33.845145 ], [ -95.773282, 33.843834 ], [ -95.772067, 33.843817 ], [ -95.763622, 33.847954 ], [ -95.758016, 33.850080 ], [ -95.754310, 33.853992 ], [ -95.753513, 33.856464 ], [ -95.757458, 33.867957 ], [ -95.760805, 33.870911 ], [ -95.762559, 33.874367 ], [ -95.761916, 33.883402 ], [ -95.758344, 33.890611 ], [ -95.756367, 33.892625 ], [ -95.747335, 33.895756 ], [ -95.737508, 33.895967 ], [ -95.728449, 33.893704 ], [ -95.713540, 33.885124 ], [ -95.710878, 33.884552 ], [ -95.696962, 33.885218 ], [ -95.684831, 33.890232 ], [ -95.676925, 33.897237 ], [ -95.669978, 33.905844 ], [ -95.665338, 33.908132 ], [ -95.659818, 33.909092 ], [ -95.647273, 33.905976 ], [ -95.636978, 33.906613 ], [ -95.603657, 33.927195 ], [ -95.599678, 33.934247 ], [ -95.585945, 33.934480 ], [ -95.563424, 33.932193 ], [ -95.561007, 33.931552 ], [ -95.559414, 33.930179 ], [ -95.556915, 33.927020 ], [ -95.551148, 33.914566 ], [ -95.549145, 33.907950 ], [ -95.549475, 33.901311 ], [ -95.552331, 33.894420 ], [ -95.552085, 33.888422 ], [ -95.548325, 33.882744 ], [ -95.545197, 33.880294 ], [ -95.539790, 33.879904 ], [ -95.533283, 33.881162 ], [ -95.525322, 33.885487 ], [ -95.520138, 33.889329 ], [ -95.515302, 33.891142 ], [ -95.510063, 33.890135 ], [ -95.506234, 33.886306 ], [ -95.506495, 33.878589 ], [ -95.506085, 33.876390 ], [ -95.502304, 33.874742 ], [ -95.492028, 33.874822 ], [ -95.478575, 33.879301 ], [ -95.469962, 33.886105 ], [ -95.464925, 33.886709 ], [ -95.462910, 33.885903 ], [ -95.461499, 33.883686 ], [ -95.464211, 33.873372 ], [ -95.463346, 33.872313 ], [ -95.447370, 33.868850 ], [ -95.407795, 33.866308 ], [ -95.375233, 33.868243 ], [ -95.352338, 33.867789 ], [ -95.339122, 33.868873 ], [ -95.334854, 33.876831 ], [ -95.334523, 33.885788 ], [ -95.333452, 33.886286 ], [ -95.325572, 33.885704 ], [ -95.294789, 33.875388 ], [ -95.287865, 33.874946 ], [ -95.283445, 33.877746 ], [ -95.281677, 33.882902 ], [ -95.281530, 33.887617 ], [ -95.280351, 33.896751 ], [ -95.279762, 33.899109 ], [ -95.277846, 33.900877 ], [ -95.275342, 33.901761 ], [ -95.272542, 33.902055 ], [ -95.263850, 33.899256 ], [ -95.261051, 33.899993 ], [ -95.255747, 33.902939 ], [ -95.253095, 33.905444 ], [ -95.250885, 33.913105 ], [ -95.250737, 33.917083 ], [ -95.251327, 33.924155 ], [ -95.253020, 33.927237 ], [ -95.253623, 33.929710 ], [ -95.252906, 33.933648 ], [ -95.230491, 33.960764 ], [ -95.226393, 33.961954 ], [ -95.219358, 33.961567 ], [ -95.184075, 33.950353 ], [ -95.168746, 33.941606 ], [ -95.166686, 33.939728 ], [ -95.161109, 33.937598 ], [ -95.149462, 33.936336 ], [ -95.131056, 33.936925 ], [ -95.124700, 33.934675 ], [ -95.121184, 33.931307 ], [ -95.122500, 33.921717 ], [ -95.122365, 33.918632 ], [ -95.119951, 33.915815 ], [ -95.110964, 33.912998 ], [ -95.103318, 33.913669 ], [ -95.100770, 33.912193 ], [ -95.098489, 33.909913 ], [ -95.095002, 33.904816 ], [ -95.095270, 33.899316 ], [ -95.093929, 33.895963 ], [ -95.090441, 33.893280 ], [ -95.084002, 33.893280 ], [ -95.078905, 33.898377 ], [ -95.071260, 33.901597 ], [ -95.065492, 33.899585 ], [ -95.061065, 33.895292 ], [ -95.058834, 33.886813 ], [ -95.049025, 33.864090 ], [ -95.046568, 33.862565 ], [ -95.037207, 33.860250 ], [ -95.022325, 33.859813 ], [ -95.016422, 33.861392 ], [ -95.008376, 33.866089 ], [ -95.000223, 33.862505 ], [ -94.995524, 33.857438 ], [ -94.992671, 33.852455 ], [ -94.988487, 33.851000 ], [ -94.983303, 33.851354 ], [ -94.981650, 33.852284 ], [ -94.976208, 33.859847 ], [ -94.973411, 33.861731 ], [ -94.971435, 33.862123 ], [ -94.968895, 33.860916 ], [ -94.965888, 33.848422 ], [ -94.964401, 33.837021 ], [ -94.957676, 33.835004 ], [ -94.949533, 33.825708 ], [ -94.948716, 33.818023 ], [ -94.944302, 33.812138 ], [ -94.939560, 33.810503 ], [ -94.935800, 33.810339 ], [ -94.932366, 33.810993 ], [ -94.928442, 33.812628 ], [ -94.924518, 33.812792 ], [ -94.921902, 33.811811 ], [ -94.919450, 33.810176 ], [ -94.917815, 33.808704 ], [ -94.916834, 33.804617 ], [ -94.916998, 33.801510 ], [ -94.919614, 33.794153 ], [ -94.920104, 33.789575 ], [ -94.919614, 33.786305 ], [ -94.911427, 33.778383 ], [ -94.906245, 33.778192 ], [ -94.902276, 33.776289 ], [ -94.888368, 33.767240 ], [ -94.886226, 33.764594 ], [ -94.881448, 33.765549 ], [ -94.879218, 33.764912 ], [ -94.876033, 33.760771 ], [ -94.875497, 33.755483 ], [ -94.877080, 33.752220 ], [ -94.874668, 33.749164 ], [ -94.869300, 33.745871 ], [ -94.849296, 33.739585 ], [ -94.841634, 33.739431 ], [ -94.830804, 33.740068 ], [ -94.827938, 33.741342 ], [ -94.826027, 33.743890 ], [ -94.824753, 33.749305 ], [ -94.821886, 33.750897 ], [ -94.817427, 33.752172 ], [ -94.812012, 33.751853 ], [ -94.809145, 33.749305 ], [ -94.798634, 33.744527 ], [ -94.789716, 33.746120 ], [ -94.775064, 33.755038 ], [ -94.770924, 33.754401 ], [ -94.768057, 33.753446 ], [ -94.766465, 33.750897 ], [ -94.766146, 33.748031 ], [ -94.768057, 33.742616 ], [ -94.767739, 33.737520 ], [ -94.762961, 33.731787 ], [ -94.759139, 33.729557 ], [ -94.753087, 33.729557 ], [ -94.742576, 33.727009 ], [ -94.739391, 33.722550 ], [ -94.737480, 33.716179 ], [ -94.739072, 33.710128 ], [ -94.737161, 33.704713 ], [ -94.732384, 33.700254 ], [ -94.728243, 33.699617 ], [ -94.725695, 33.702483 ], [ -94.724102, 33.705669 ], [ -94.721873, 33.707261 ], [ -94.719006, 33.708217 ], [ -94.714865, 33.707261 ], [ -94.711043, 33.705669 ], [ -94.709451, 33.699617 ], [ -94.710725, 33.696113 ], [ -94.710725, 33.691654 ], [ -94.710088, 33.688150 ], [ -94.707858, 33.686876 ], [ -94.684792, 33.684353 ], [ -94.659167, 33.692138 ], [ -94.652265, 33.690979 ], [ -94.649628, 33.688049 ], [ -94.648457, 33.684534 ], [ -94.647871, 33.680432 ], [ -94.648457, 33.673401 ], [ -94.646113, 33.669300 ], [ -94.642890, 33.668421 ], [ -94.635273, 33.669886 ], [ -94.630586, 33.673401 ], [ -94.627656, 33.677796 ], [ -94.621211, 33.681018 ], [ -94.616817, 33.679554 ], [ -94.611543, 33.674866 ], [ -94.607442, 33.672230 ], [ -94.603047, 33.671351 ], [ -94.596895, 33.671351 ], [ -94.593673, 33.673987 ], [ -94.590450, 33.677503 ], [ -94.586641, 33.678968 ], [ -94.579620, 33.677623 ], [ -94.576974, 33.673401 ], [ -94.572872, 33.669886 ], [ -94.569943, 33.666370 ], [ -94.569357, 33.663441 ], [ -94.571993, 33.659632 ], [ -94.572286, 33.656995 ], [ -94.570821, 33.654945 ], [ -94.568771, 33.654652 ], [ -94.564669, 33.655824 ], [ -94.557052, 33.656702 ], [ -94.552072, 33.653480 ], [ -94.551193, 33.650257 ], [ -94.551312, 33.644570 ], [ -94.553537, 33.642054 ], [ -94.552658, 33.638246 ], [ -94.549142, 33.635902 ], [ -94.543869, 33.635902 ], [ -94.538889, 33.637953 ], [ -94.533322, 33.637660 ], [ -94.529221, 33.634437 ], [ -94.528342, 33.629750 ], [ -94.529807, 33.627406 ], [ -94.528928, 33.621840 ], [ -94.526291, 33.619203 ], [ -94.520725, 33.616567 ], [ -94.504615, 33.620682 ], [ -94.491503, 33.625115 ], [ -94.487514, 33.628939 ], [ -94.485875, 33.637867 ], [ -94.481313, 33.638819 ], [ -94.476415, 33.638947 ], [ -94.466075, 33.636262 ], [ -94.464186, 33.637655 ], [ -94.461453, 33.643616 ], [ -94.459198, 33.645146 ], [ -94.454820, 33.644903 ], [ -94.448637, 33.642766 ], [ -94.446871, 33.640178 ], [ -94.447514, 33.636255 ], [ -94.448451, 33.634497 ], [ -94.458817, 33.632444 ], [ -94.462736, 33.630910 ], [ -94.461129, 33.625415 ], [ -94.460286, 33.624421 ], [ -94.455255, 33.622917 ], [ -94.452711, 33.622621 ], [ -94.452325, 33.618817 ], [ -94.452961, 33.616986 ], [ -94.454769, 33.615156 ], [ -94.462336, 33.610567 ], [ -94.469451, 33.607316 ], [ -94.472166, 33.604199 ], [ -94.471974, 33.602665 ], [ -94.471152, 33.601588 ], [ -94.468086, 33.599436 ], [ -94.458232, 33.598270 ], [ -94.453996, 33.592223 ], [ -94.451622, 33.591361 ], [ -94.449112, 33.590894 ], [ -94.442364, 33.591243 ], [ -94.441537, 33.591502 ], [ -94.439518, 33.594154 ], [ -94.430039, 33.591124 ], [ -94.427578, 33.589319 ], [ -94.425982, 33.586425 ], [ -94.413155, 33.569368 ], [ -94.412175, 33.568691 ], [ -94.408901, 33.568197 ], [ -94.403342, 33.568424 ], [ -94.397342, 33.571608 ], [ -94.385927, 33.581888 ], [ -94.382887, 33.583268 ], [ -94.379649, 33.580607 ], [ -94.378076, 33.577019 ], [ -94.377760, 33.574609 ], [ -94.378561, 33.571329 ], [ -94.380091, 33.568943 ], [ -94.382534, 33.567057 ], [ -94.388052, 33.565511 ], [ -94.392357, 33.565287 ], [ -94.394656, 33.564059 ], [ -94.397398, 33.562314 ], [ -94.399227, 33.559903 ], [ -94.399393, 33.557077 ], [ -94.399144, 33.555498 ], [ -94.397957, 33.554390 ], [ -94.392573, 33.551142 ], [ -94.389515, 33.546778 ], [ -94.386086, 33.544923 ], [ -94.381667, 33.544035 ], [ -94.373393, 33.544471 ], [ -94.371598, 33.545001 ], [ -94.363297, 33.544957 ], [ -94.361351, 33.544613 ], [ -94.358970, 33.543230 ], [ -94.355945, 33.543180 ], [ -94.348945, 33.548359 ], [ -94.347383, 33.551078 ], [ -94.347290, 33.552197 ], [ -94.352653, 33.560611 ], [ -94.352433, 33.562172 ], [ -94.345513, 33.567313 ], [ -94.344023, 33.567824 ], [ -94.340577, 33.567878 ], [ -94.338422, 33.567082 ], [ -94.334940, 33.563592 ], [ -94.334380, 33.562536 ], [ -94.333895, 33.557461 ], [ -94.333203, 33.555366 ], [ -94.331833, 33.553348 ], [ -94.330590, 33.552692 ], [ -94.323660, 33.549835 ], [ -94.319492, 33.548864 ], [ -94.309582, 33.551673 ], [ -94.306410, 33.555616 ], [ -94.306215, 33.557676 ], [ -94.307181, 33.559797 ], [ -94.303577, 33.568280 ], [ -94.301023, 33.573022 ], [ -94.298392, 33.576218 ], [ -94.293258, 33.580419 ], [ -94.289129, 33.582144 ], [ -94.287025, 33.582410 ], [ -94.283582, 33.581891 ], [ -94.282648, 33.580978 ], [ -94.280849, 33.577187 ], [ -94.280605, 33.574908 ], [ -94.282172, 33.572989 ], [ -94.290372, 33.567905 ], [ -94.291687, 33.563481 ], [ -94.290901, 33.558872 ], [ -94.289440, 33.557635 ], [ -94.287572, 33.557178 ], [ -94.279090, 33.557026 ], [ -94.275601, 33.557964 ], [ -94.274473, 33.558652 ], [ -94.271998, 33.561518 ], [ -94.270979, 33.563221 ], [ -94.270853, 33.564783 ], [ -94.265669, 33.573589 ], [ -94.262755, 33.577354 ], [ -94.257801, 33.582508 ], [ -94.252656, 33.586144 ], [ -94.245932, 33.589114 ], [ -94.242777, 33.589709 ], [ -94.240179, 33.589536 ], [ -94.236972, 33.587411 ], [ -94.236363, 33.585992 ], [ -94.236836, 33.580914 ], [ -94.237975, 33.577757 ], [ -94.238868, 33.576722 ], [ -94.244366, 33.573549 ], [ -94.251108, 33.565280 ], [ -94.252331, 33.561855 ], [ -94.252283, 33.560445 ], [ -94.251569, 33.558188 ], [ -94.250197, 33.556765 ], [ -94.237904, 33.552675 ], [ -94.231844, 33.552088 ], [ -94.226392, 33.552912 ], [ -94.222921, 33.554088 ], [ -94.219221, 33.556096 ], [ -94.213604, 33.563134 ], [ -94.208078, 33.566911 ], [ -94.205634, 33.567229 ], [ -94.203594, 33.566546 ], [ -94.201237, 33.557826 ], [ -94.199486, 33.556085 ], [ -94.197817, 33.555238 ], [ -94.196395, 33.555123 ], [ -94.193248, 33.556154 ], [ -94.191333, 33.557666 ], [ -94.189884, 33.562454 ], [ -94.192483, 33.570425 ], [ -94.194399, 33.573678 ], [ -94.196367, 33.574780 ], [ -94.201106, 33.575851 ], [ -94.204265, 33.575005 ], [ -94.207405, 33.574353 ], [ -94.209665, 33.573510 ], [ -94.211329, 33.573774 ], [ -94.216141, 33.576392 ], [ -94.217408, 33.579260 ], [ -94.217198, 33.580737 ], [ -94.214431, 33.583187 ], [ -94.212997, 33.583487 ], [ -94.210967, 33.583143 ], [ -94.205788, 33.581380 ], [ -94.203588, 33.580816 ], [ -94.199752, 33.581098 ], [ -94.196536, 33.581719 ], [ -94.194465, 33.582886 ], [ -94.190891, 33.587474 ], [ -94.183913, 33.594682 ], [ -94.180880, 33.592612 ], [ -94.176327, 33.591077 ], [ -94.162266, 33.588906 ], [ -94.161082, 33.587972 ], [ -94.162010, 33.580877 ], [ -94.161277, 33.579271 ], [ -94.156782, 33.575749 ], [ -94.152626, 33.575923 ], [ -94.148732, 33.580197 ], [ -94.146048, 33.581975 ], [ -94.144383, 33.582098 ], [ -94.142160, 33.581390 ], [ -94.141852, 33.579590 ], [ -94.143024, 33.577725 ], [ -94.145669, 33.575600 ], [ -94.149506, 33.573602 ], [ -94.151257, 33.571793 ], [ -94.151755, 33.569476 ], [ -94.151456, 33.568387 ], [ -94.148520, 33.565678 ], [ -94.145239, 33.564987 ], [ -94.143402, 33.565505 ], [ -94.136864, 33.571000 ], [ -94.136046, 33.571388 ], [ -94.135142, 33.571033 ], [ -94.134308, 33.569209 ], [ -94.133048, 33.557953 ], [ -94.131382, 33.552934 ], [ -94.128658, 33.550952 ], [ -94.126898, 33.550647 ], [ -94.123898, 33.552100 ], [ -94.122879, 33.553112 ], [ -94.120719, 33.560555 ], [ -94.120355, 33.565500 ], [ -94.119902, 33.566999 ], [ -94.112843, 33.566991 ], [ -94.103176, 33.570350 ], [ -94.100107, 33.572568 ], [ -94.097440, 33.573719 ], [ -94.088943, 33.575322 ], [ -94.082641, 33.575492 ], [ -94.072670, 33.572234 ], [ -94.072231, 33.572605 ], [ -94.072032, 33.573523 ], [ -94.072032, 33.574162 ], [ -94.071713, 33.574601 ], [ -94.071353, 33.574840 ], [ -94.070395, 33.574561 ], [ -94.069517, 33.574162 ], [ -94.068559, 33.573563 ], [ -94.068280, 33.571967 ], [ -94.067801, 33.570131 ], [ -94.066846, 33.568909 ], [ -94.061283, 33.568805 ], [ -94.056598, 33.567825 ], [ -94.056096, 33.567252 ], [ -94.055663, 33.561887 ], [ -94.056442, 33.560998 ], [ -94.059850, 33.559249 ], [ -94.061180, 33.559159 ], [ -94.066685, 33.560954 ], [ -94.067985, 33.560961 ], [ -94.071720, 33.559682 ], [ -94.073744, 33.558285 ], [ -94.073826, 33.555834 ], [ -94.072156, 33.553864 ], [ -94.069092, 33.553406 ], [ -94.065480, 33.550909 ], [ -94.061896, 33.549764 ], [ -94.056096, 33.550726 ], [ -94.051882, 33.552585 ], [ -94.050212, 33.551083 ], [ -94.046040, 33.551321 ], [ -94.043450, 33.552253 ], [ -94.043428, 33.551425 ], [ -94.043375, 33.542315 ], [ -94.043009, 33.493039 ], [ -94.043279, 33.491030 ], [ -94.043188, 33.470324 ], [ -94.042988, 33.435824 ], [ -94.042988, 33.431024 ], [ -94.042887, 33.420225 ], [ -94.043053, 33.377716 ], [ -94.042869, 33.371170 ], [ -94.043128, 33.358757 ], [ -94.043067, 33.352097 ], [ -94.043067, 33.347351 ], [ -94.043067, 33.330498 ], [ -94.042990, 33.271227 ], [ -94.043050, 33.260904 ], [ -94.043004, 33.250128 ], [ -94.042730, 33.241823 ], [ -94.042876, 33.215219 ], [ -94.042892, 33.202666 ], [ -94.042875, 33.199785 ], [ -94.042719, 33.160291 ], [ -94.043185, 33.143476 ], [ -94.043077, 33.138162 ], [ -94.043007, 33.133890 ], [ -94.042870, 33.092727 ], [ -94.043036, 33.079485 ], [ -94.042964, 33.019219 ], [ -94.043088, 32.955592 ], [ -94.043067, 32.937903 ], [ -94.043092, 32.910021 ], [ -94.042885, 32.898911 ], [ -94.042859, 32.892771 ], [ -94.042886, 32.880965 ], [ -94.043025, 32.880446 ], [ -94.042785, 32.871486 ], [ -94.043026, 32.797476 ], [ -94.042747, 32.786973 ], [ -94.042829, 32.785277 ], [ -94.042938, 32.780558 ], [ -94.043027, 32.776863 ], [ -94.042947, 32.767991 ], [ -94.043147, 32.693031 ], [ -94.042913, 32.655127 ], [ -94.042780, 32.643466 ], [ -94.042824, 32.640305 ], [ -94.042926, 32.622015 ], [ -94.042929, 32.618260 ], [ -94.042919, 32.610142 ], [ -94.043083, 32.564261 ], [ -94.043142, 32.559502 ], [ -94.043081, 32.513613 ], [ -94.042885, 32.505145 ], [ -94.042911, 32.492852 ], [ -94.043089, 32.486561 ], [ -94.043072, 32.484300 ], [ -94.042955, 32.480261 ], [ -94.042995, 32.478004 ], [ -94.042902, 32.472906 ], [ -94.042875, 32.471348 ], [ -94.042903, 32.470386 ], [ -94.042908, 32.439891 ], [ -94.042986, 32.435507 ], [ -94.042899, 32.400659 ], [ -94.042923, 32.399918 ], [ -94.042901, 32.392283 ], [ -94.042763, 32.373332 ], [ -94.042739, 32.363559 ], [ -94.042733, 32.269696 ], [ -94.042732, 32.269620 ], [ -94.042662, 32.218146 ], [ -94.042566, 32.166894 ], [ -94.042539, 32.166826 ], [ -94.042591, 32.158097 ], [ -94.042681, 32.137956 ], [ -94.042752, 32.125163 ], [ -94.042337, 32.119914 ], [ -94.042700, 32.056012 ], [ -94.042720, 31.999265 ], [ -94.041833, 31.992402 ], [ -94.038412, 31.992437 ], [ -94.029283, 31.995865 ], [ -94.018664, 31.990843 ], [ -93.977461, 31.926419 ], [ -93.971712, 31.920384 ], [ -93.953546, 31.910563 ], [ -93.943541, 31.908564 ], [ -93.938002, 31.906917 ], [ -93.935008, 31.903773 ], [ -93.932463, 31.895539 ], [ -93.927672, 31.891497 ], [ -93.923929, 31.889850 ], [ -93.919588, 31.890748 ], [ -93.915949, 31.892861 ], [ -93.909557, 31.893144 ], [ -93.904766, 31.890599 ], [ -93.901173, 31.885958 ], [ -93.901888, 31.880063 ], [ -93.896981, 31.873382 ], [ -93.889197, 31.867693 ], [ -93.888149, 31.856914 ], [ -93.884117, 31.847606 ], [ -93.874822, 31.840611 ], [ -93.874761, 31.821661 ], [ -93.870917, 31.816837 ], [ -93.853390, 31.805467 ], [ -93.846188, 31.802021 ], [ -93.839951, 31.798597 ], [ -93.836868, 31.794159 ], [ -93.836868, 31.788734 ], [ -93.834649, 31.783309 ], [ -93.831197, 31.780227 ], [ -93.827451, 31.777741 ], [ -93.823443, 31.775098 ], [ -93.822598, 31.773559 ], [ -93.827343, 31.759370 ], [ -93.830112, 31.754555 ], [ -93.830647, 31.745811 ], [ -93.824579, 31.734397 ], [ -93.819048, 31.728858 ], [ -93.815657, 31.719043 ], [ -93.815836, 31.711905 ], [ -93.814587, 31.707444 ], [ -93.810304, 31.705481 ], [ -93.807270, 31.704232 ], [ -93.803419, 31.700686 ], [ -93.802694, 31.697783 ], [ -93.802452, 31.693186 ], [ -93.804479, 31.685664 ], [ -93.817425, 31.672146 ], [ -93.822051, 31.673967 ], [ -93.826462, 31.666919 ], [ -93.825661, 31.661022 ], [ -93.818037, 31.647892 ], [ -93.816838, 31.622509 ], [ -93.818717, 31.614556 ], [ -93.823977, 31.614228 ], [ -93.827852, 31.616551 ], [ -93.838057, 31.606795 ], [ -93.839383, 31.599075 ], [ -93.834924, 31.586211 ], [ -93.822958, 31.568130 ], [ -93.820764, 31.558221 ], [ -93.818582, 31.554826 ], [ -93.798087, 31.534044 ], [ -93.787687, 31.527344 ], [ -93.780835, 31.525384 ], [ -93.760062, 31.523933 ], [ -93.753860, 31.525331 ], [ -93.751899, 31.525602 ], [ -93.749870, 31.526211 ], [ -93.746826, 31.526008 ], [ -93.743376, 31.525196 ], [ -93.741550, 31.522558 ], [ -93.741111, 31.520101 ], [ -93.740332, 31.517079 ], [ -93.739318, 31.515050 ], [ -93.733433, 31.513223 ], [ -93.726736, 31.511600 ], [ -93.725925, 31.504092 ], [ -93.728766, 31.496786 ], [ -93.730998, 31.492119 ], [ -93.737168, 31.484622 ], [ -93.741885, 31.483535 ], [ -93.745608, 31.481973 ], [ -93.747841, 31.480958 ], [ -93.749870, 31.478929 ], [ -93.749870, 31.475276 ], [ -93.749476, 31.468690 ], [ -93.709416, 31.442995 ], [ -93.700930, 31.437784 ], [ -93.697603, 31.428409 ], [ -93.704678, 31.418900 ], [ -93.704879, 31.410881 ], [ -93.701611, 31.409334 ], [ -93.695866, 31.409392 ], [ -93.674117, 31.397681 ], [ -93.671644, 31.393352 ], [ -93.670182, 31.387184 ], [ -93.668533, 31.379357 ], [ -93.668146, 31.375103 ], [ -93.669693, 31.371815 ], [ -93.668920, 31.366400 ], [ -93.665052, 31.363886 ], [ -93.663892, 31.361953 ], [ -93.663698, 31.360019 ], [ -93.664665, 31.357698 ], [ -93.665825, 31.355184 ], [ -93.668439, 31.353012 ], [ -93.677277, 31.330483 ], [ -93.687851, 31.309835 ], [ -93.686880, 31.305166 ], [ -93.684039, 31.301771 ], [ -93.675440, 31.301040 ], [ -93.668928, 31.297975 ], [ -93.657004, 31.281736 ], [ -93.642516, 31.269508 ], [ -93.620343, 31.271025 ], [ -93.613942, 31.259375 ], [ -93.614288, 31.251631 ], [ -93.616308, 31.244595 ], [ -93.616007, 31.233960 ], [ -93.609828, 31.229661 ], [ -93.607409, 31.227243 ], [ -93.605260, 31.224153 ], [ -93.604319, 31.220794 ], [ -93.604319, 31.215286 ], [ -93.607288, 31.205403 ], [ -93.602443, 31.182541 ], [ -93.600308, 31.176158 ], [ -93.598828, 31.174679 ], [ -93.588503, 31.165581 ], [ -93.579215, 31.167422 ], [ -93.569563, 31.177574 ], [ -93.560943, 31.182482 ], [ -93.552649, 31.185575 ], [ -93.548931, 31.186601 ], [ -93.535097, 31.185614 ], [ -93.533307, 31.184463 ], [ -93.531744, 31.180817 ], [ -93.536830, 31.158620 ], [ -93.540253, 31.156579 ], [ -93.544010, 31.153015 ], [ -93.544888, 31.148844 ], [ -93.544888, 31.143137 ], [ -93.544702, 31.135889 ], [ -93.540278, 31.128868 ], [ -93.539619, 31.121844 ], [ -93.541375, 31.113502 ], [ -93.549717, 31.105160 ], [ -93.551693, 31.097258 ], [ -93.551034, 31.091111 ], [ -93.546644, 31.082989 ], [ -93.540129, 31.078003 ], [ -93.531040, 31.074699 ], [ -93.526044, 31.070773 ], [ -93.523010, 31.065241 ], [ -93.525330, 31.060601 ], [ -93.529256, 31.057567 ], [ -93.532069, 31.055264 ], [ -93.531219, 31.051678 ], [ -93.523248, 31.037842 ], [ -93.516943, 31.032584 ], [ -93.516407, 31.029550 ], [ -93.516943, 31.023662 ], [ -93.539526, 31.008498 ], [ -93.555581, 31.003919 ], [ -93.562626, 31.005995 ], [ -93.566017, 31.004567 ], [ -93.567980, 31.001534 ], [ -93.569764, 30.996715 ], [ -93.571906, 30.987614 ], [ -93.567972, 30.977981 ], [ -93.560533, 30.971286 ], [ -93.549841, 30.967118 ], [ -93.532549, 30.950696 ], [ -93.526245, 30.939411 ], [ -93.526147, 30.930035 ], [ -93.530936, 30.924534 ], [ -93.542489, 30.920064 ], [ -93.545030, 30.920837 ], [ -93.546884, 30.921511 ], [ -93.549244, 30.921006 ], [ -93.551942, 30.918646 ], [ -93.555650, 30.911228 ], [ -93.556493, 30.901451 ], [ -93.564248, 30.895045 ], [ -93.567788, 30.888302 ], [ -93.567451, 30.878524 ], [ -93.565428, 30.874310 ], [ -93.558617, 30.869424 ], [ -93.558172, 30.839974 ], [ -93.553626, 30.835140 ], [ -93.554057, 30.824941 ], [ -93.561666, 30.807739 ], [ -93.563243, 30.806218 ], [ -93.569303, 30.802969 ], [ -93.578395, 30.802047 ], [ -93.584265, 30.796663 ], [ -93.589381, 30.786681 ], [ -93.589896, 30.777760 ], [ -93.592828, 30.763986 ], [ -93.607757, 30.757657 ], [ -93.619129, 30.742002 ], [ -93.617688, 30.738479 ], [ -93.609719, 30.729182 ], [ -93.609544, 30.723139 ], [ -93.611192, 30.718053 ], [ -93.616184, 30.713980 ], [ -93.620774, 30.704122 ], [ -93.621093, 30.695159 ], [ -93.629904, 30.679940 ], [ -93.638213, 30.673058 ], [ -93.654971, 30.670184 ], [ -93.670354, 30.658034 ], [ -93.683100, 30.640763 ], [ -93.685121, 30.625201 ], [ -93.683397, 30.608041 ], [ -93.680813, 30.602993 ], [ -93.679828, 30.599758 ], [ -93.681235, 30.596102 ], [ -93.684329, 30.592586 ], [ -93.687282, 30.591601 ], [ -93.689534, 30.592759 ], [ -93.692869, 30.594382 ], [ -93.712454, 30.588479 ], [ -93.727844, 30.574070 ], [ -93.727746, 30.566487 ], [ -93.725847, 30.556978 ], [ -93.729195, 30.544842 ], [ -93.740253, 30.539569 ], [ -93.732793, 30.529960 ], [ -93.727721, 30.525671 ], [ -93.714322, 30.518562 ], [ -93.710117, 30.506400 ], [ -93.716678, 30.494006 ], [ -93.705845, 30.457748 ], [ -93.697828, 30.443838 ], [ -93.697800, 30.440583 ], [ -93.702665, 30.429947 ], [ -93.722314, 30.420729 ], [ -93.745333, 30.397022 ], [ -93.751437, 30.396288 ], [ -93.757654, 30.390423 ], [ -93.758554, 30.387077 ], [ -93.755894, 30.370709 ], [ -93.756352, 30.356166 ], [ -93.765822, 30.333318 ], [ -93.764265, 30.330223 ], [ -93.760328, 30.329924 ], [ -93.738699, 30.303794 ], [ -93.724220, 30.295134 ], [ -93.718684, 30.295010 ], [ -93.714319, 30.294282 ], [ -93.711118, 30.291372 ], [ -93.708645, 30.288317 ], [ -93.706608, 30.281187 ], [ -93.707190, 30.275513 ], [ -93.709132, 30.271827 ], [ -93.707271, 30.249937 ], [ -93.705083, 30.242752 ], [ -93.713359, 30.225261 ], [ -93.719220, 30.218542 ], [ -93.720946, 30.209852 ], [ -93.717397, 30.193439 ], [ -93.710468, 30.180671 ], [ -93.703764, 30.173936 ], [ -93.697748, 30.152944 ], [ -93.688212, 30.141376 ], [ -93.692868, 30.135217 ], [ -93.694980, 30.135185 ], [ -93.698276, 30.138608 ], [ -93.701252, 30.137376 ], [ -93.702436, 30.112721 ], [ -93.723765, 30.094130 ], [ -93.732485, 30.088914 ], [ -93.734085, 30.086130 ], [ -93.731605, 30.081282 ], [ -93.716405, 30.069122 ], [ -93.702180, 30.065474 ], [ -93.700580, 30.063666 ], [ -93.699396, 30.059250 ], [ -93.700820, 30.056274 ], [ -93.703940, 30.054291 ], [ -93.720805, 30.053043 ], [ -93.737446, 30.037283 ], [ -93.739158, 30.032627 ], [ -93.739734, 30.023987 ], [ -93.741078, 30.021571 ], [ -93.786935, 29.990580 ], [ -93.789431, 29.987812 ], [ -93.807815, 29.954549 ], [ -93.813735, 29.935126 ], [ -93.816550, 29.920726 ], [ -93.818998, 29.914822 ], [ -93.830374, 29.894359 ], [ -93.838374, 29.882855 ], [ -93.855140, 29.864099 ], [ -93.863570, 29.857177 ], [ -93.872446, 29.851650 ], [ -93.890679, 29.843159 ], [ -93.900728, 29.836967 ], [ -93.916360, 29.824968 ], [ -93.922744, 29.818808 ], [ -93.927992, 29.809640 ], [ -93.929208, 29.802952 ], [ -93.928808, 29.797080 ], [ -93.926504, 29.789560 ], [ -93.922407, 29.785048 ], [ -93.898470, 29.771577 ], [ -93.893862, 29.767289 ], [ -93.890821, 29.761673 ], [ -93.893829, 29.753033 ], [ -93.891637, 29.744618 ], [ -93.888821, 29.742234 ], [ -93.873941, 29.737770 ], [ -93.870020, 29.735482 ], [ -93.863204, 29.724059 ], [ -93.837971, 29.690619 ], [ -93.852868, 29.675885 ], [ -93.866981, 29.673085 ], [ -93.889990, 29.674013 ], [ -93.931000, 29.679612 ], [ -94.001406, 29.681486 ], [ -94.056506, 29.671163 ], [ -94.132577, 29.646217 ], [ -94.500807, 29.505367 ], [ -94.594853, 29.467903 ], [ -94.631084, 29.451464 ], [ -94.670389, 29.430780 ], [ -94.694158, 29.415632 ], [ -94.708473, 29.403049 ], [ -94.723959, 29.383268 ], [ -94.731047, 29.369141 ], [ -94.744834, 29.369158 ], [ -94.761491, 29.361883 ], [ -94.778691, 29.361483 ], [ -94.782356, 29.364266 ], [ -94.783131, 29.375642 ], [ -94.766848, 29.393489 ], [ -94.754100, 29.401000 ], [ -94.723818, 29.426536 ], [ -94.706365, 29.436805 ], [ -94.686386, 29.466509 ], [ -94.681541, 29.471389 ], [ -94.672400, 29.476843 ], [ -94.665853, 29.478401 ], [ -94.656737, 29.478033 ], [ -94.645948, 29.473769 ], [ -94.628217, 29.475986 ], [ -94.608557, 29.483345 ], [ -94.594211, 29.492127 ], [ -94.595440, 29.507669 ], [ -94.591407, 29.513858 ], [ -94.580274, 29.525295 ], [ -94.566674, 29.531988 ], [ -94.553990, 29.529559 ], [ -94.546994, 29.524379 ], [ -94.532348, 29.517800 ], [ -94.511045, 29.519650 ], [ -94.495025, 29.525031 ], [ -94.490607, 29.534145 ], [ -94.482873, 29.543068 ], [ -94.479899, 29.546043 ], [ -94.479899, 29.549612 ], [ -94.485848, 29.550207 ], [ -94.503429, 29.543250 ], [ -94.509487, 29.542590 ], [ -94.523743, 29.545987 ], [ -94.526336, 29.552634 ], [ -94.542532, 29.569000 ], [ -94.546385, 29.572048 ], [ -94.553988, 29.573882 ], [ -94.570006, 29.572232 ], [ -94.578211, 29.567281 ], [ -94.593518, 29.561319 ], [ -94.625890, 29.552808 ], [ -94.691625, 29.537787 ], [ -94.718276, 29.533547 ], [ -94.740699, 29.525858 ], [ -94.757689, 29.524617 ], [ -94.768676, 29.525659 ], [ -94.780938, 29.531093 ], [ -94.790605, 29.548401 ], [ -94.779439, 29.549472 ], [ -94.771053, 29.548439 ], [ -94.755237, 29.562782 ], [ -94.734626, 29.584046 ], [ -94.708741, 29.625226 ], [ -94.693154, 29.694453 ], [ -94.692434, 29.703610 ], [ -94.695317, 29.723052 ], [ -94.724616, 29.774766 ], [ -94.735271, 29.785433 ], [ -94.740919, 29.787081 ], [ -94.771512, 29.773889 ], [ -94.792238, 29.767433 ], [ -94.816085, 29.756710 ], [ -94.851108, 29.721373 ], [ -94.865007, 29.695337 ], [ -94.867438, 29.678768 ], [ -94.872551, 29.671250 ], [ -94.893107, 29.661336 ], [ -94.915413, 29.656614 ], [ -94.921318, 29.658178 ], [ -94.934167, 29.678682 ], [ -94.936089, 29.692704 ], [ -94.942681, 29.697778 ], [ -94.965963, 29.700330 ], [ -94.972666, 29.684870 ], [ -94.949962, 29.641437 ], [ -94.943232, 29.622664 ], [ -94.941336, 29.613798 ], [ -94.947999, 29.612846 ], [ -94.953327, 29.617882 ], [ -94.967319, 29.655783 ], [ -94.971754, 29.666356 ], [ -94.980113, 29.679067 ], [ -95.005398, 29.659366 ], [ -95.011683, 29.649802 ], [ -95.015636, 29.639457 ], [ -95.013499, 29.629194 ], [ -94.988871, 29.610095 ], [ -94.982706, 29.601344 ], [ -94.988993, 29.591155 ], [ -95.007670, 29.574257 ], [ -95.016627, 29.558487 ] ] ], [ [ [ -97.099533, 27.839664 ], [ -97.099533, 27.843233 ], [ -97.082878, 27.857510 ], [ -97.072174, 27.869408 ], [ -97.061462, 27.890823 ], [ -97.073364, 27.902719 ], [ -97.075737, 27.909859 ], [ -97.067413, 27.914618 ], [ -97.054329, 27.902719 ], [ -97.050758, 27.884874 ], [ -97.055984, 27.861799 ], [ -97.064987, 27.845919 ], [ -97.081688, 27.843233 ], [ -97.099533, 27.839664 ] ] ], [ [ [ -97.230629, 27.828465 ], [ -97.238594, 27.828674 ], [ -97.245300, 27.837059 ], [ -97.257248, 27.864307 ], [ -97.267517, 27.868080 ], [ -97.268982, 27.873949 ], [ -97.260811, 27.874159 ], [ -97.252213, 27.871223 ], [ -97.246140, 27.859905 ], [ -97.239014, 27.843557 ], [ -97.229996, 27.831610 ], [ -97.228951, 27.830351 ], [ -97.230629, 27.828465 ] ] ], [ [ [ -97.214279, 27.806458 ], [ -97.227692, 27.808764 ], [ -97.196465, 27.815889 ], [ -97.164391, 27.821758 ], [ -97.142387, 27.821758 ], [ -97.142799, 27.815680 ], [ -97.155586, 27.816099 ], [ -97.175499, 27.814003 ], [ -97.203377, 27.807295 ], [ -97.214279, 27.806458 ] ] ], [ [ [ -97.231522, 27.640894 ], [ -97.234612, 27.641066 ], [ -97.228081, 27.673891 ], [ -97.232376, 27.682655 ], [ -97.237534, 27.682827 ], [ -97.242172, 27.671141 ], [ -97.243546, 27.671141 ], [ -97.246300, 27.675953 ], [ -97.246468, 27.682484 ], [ -97.237366, 27.686951 ], [ -97.222755, 27.685921 ], [ -97.215538, 27.682827 ], [ -97.220863, 27.675610 ], [ -97.231522, 27.640894 ] ] ], [ [ [ -97.453094, 27.054054 ], [ -97.456902, 27.056910 ], [ -97.457848, 27.060242 ], [ -97.453568, 27.084513 ], [ -97.451660, 27.085464 ], [ -97.449760, 27.083084 ], [ -97.450233, 27.061193 ], [ -97.453094, 27.054054 ] ] ], [ [ [ -97.463081, 27.043110 ], [ -97.473557, 27.043585 ], [ -97.475456, 27.045488 ], [ -97.473557, 27.066904 ], [ -97.472130, 27.069759 ], [ -97.466415, 27.065952 ], [ -97.462608, 27.053579 ], [ -97.463081, 27.043110 ] ] ], [ [ [ -97.458328, 27.003611 ], [ -97.463081, 27.004086 ], [ -97.466415, 27.010748 ], [ -97.469749, 27.035971 ], [ -97.468796, 27.040255 ], [ -97.464516, 27.040730 ], [ -97.459755, 27.037874 ], [ -97.456421, 27.016935 ], [ -97.454994, 27.007418 ], [ -97.458328, 27.003611 ] ] ], [ [ [ -97.473076, 26.970297 ], [ -97.475937, 26.974106 ], [ -97.469749, 26.989809 ], [ -97.466415, 26.997900 ], [ -97.461182, 27.000755 ], [ -97.454041, 27.000755 ], [ -97.452141, 26.997900 ], [ -97.452141, 26.989809 ], [ -97.467842, 26.971251 ], [ -97.473076, 26.970297 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US49", "STATE": "49", "NAME": "Utah", "LSAD": "", "CENSUSAREA": 82169.620000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -114.050600, 37.000396 ], [ -114.051749, 37.088434 ], [ -114.051822, 37.090976 ], [ -114.052827, 37.103961 ], [ -114.051867, 37.134292 ], [ -114.052179, 37.147110 ], [ -114.051673, 37.172368 ], [ -114.051405, 37.233854 ], [ -114.051974, 37.283848 ], [ -114.051974, 37.284511 ], [ -114.051800, 37.293044 ], [ -114.051800, 37.293548 ], [ -114.051927, 37.370459 ], [ -114.051927, 37.370734 ], [ -114.051765, 37.418083 ], [ -114.052448, 37.431440 ], [ -114.052701, 37.492014 ], [ -114.052685, 37.502513 ], [ -114.052718, 37.517264 ], [ -114.052689, 37.517859 ], [ -114.052962, 37.592783 ], [ -114.052472, 37.604776 ], [ -114.051728, 37.745997 ], [ -114.051785, 37.746249 ], [ -114.051670, 37.746958 ], [ -114.051109, 37.756276 ], [ -114.049919, 37.765586 ], [ -114.048473, 37.809861 ], [ -114.049677, 37.823645 ], [ -114.049928, 37.852508 ], [ -114.049658, 37.881368 ], [ -114.050423, 37.999961 ], [ -114.049903, 38.148601 ], [ -114.050138, 38.249960 ], [ -114.049417, 38.264700 ], [ -114.050120, 38.404536 ], [ -114.050091, 38.404673 ], [ -114.050485, 38.499955 ], [ -114.049834, 38.543784 ], [ -114.049862, 38.547764 ], [ -114.050154, 38.572920 ], [ -114.049749, 38.729210 ], [ -114.049168, 38.749951 ], [ -114.049465, 38.874949 ], [ -114.048521, 38.876197 ], [ -114.048054, 38.878693 ], [ -114.049104, 39.005509 ], [ -114.047079, 39.499943 ], [ -114.047728, 39.542742 ], [ -114.047273, 39.759413 ], [ -114.047783, 39.794160 ], [ -114.047214, 39.821024 ], [ -114.047134, 39.906037 ], [ -114.046555, 39.996899 ], [ -114.046835, 40.030131 ], [ -114.046386, 40.097896 ], [ -114.046741, 40.104231 ], [ -114.046153, 40.231971 ], [ -114.046178, 40.398313 ], [ -114.045826, 40.424823 ], [ -114.045218, 40.430282 ], [ -114.045518, 40.494474 ], [ -114.045577, 40.495801 ], [ -114.045281, 40.506586 ], [ -114.043505, 40.726292 ], [ -114.043831, 40.758666 ], [ -114.043803, 40.759205 ], [ -114.043176, 40.771675 ], [ -114.042145, 40.999926 ], [ -114.041447, 41.207752 ], [ -114.042553, 41.210923 ], [ -114.041396, 41.219958 ], [ -114.040231, 41.491690 ], [ -114.040942, 41.499921 ], [ -114.040437, 41.615377 ], [ -114.039968, 41.624920 ], [ -114.039901, 41.753781 ], [ -114.041152, 41.850595 ], [ -114.041107, 41.850573 ], [ -114.039648, 41.884816 ], [ -114.041723, 41.993720 ], [ -113.993903, 41.992698 ], [ -113.893261, 41.988057 ], [ -113.822163, 41.988479 ], [ -113.796082, 41.989104 ], [ -113.764530, 41.989459 ], [ -113.500837, 41.992799 ], [ -113.496548, 41.993305 ], [ -113.431563, 41.993799 ], [ -113.402230, 41.994161 ], [ -113.396497, 41.994250 ], [ -113.357611, 41.993859 ], [ -113.340072, 41.994747 ], [ -113.250829, 41.995610 ], [ -113.249159, 41.996203 ], [ -113.000821, 41.998223 ], [ -112.979218, 41.998263 ], [ -112.909587, 41.998791 ], [ -112.882367, 41.998922 ], [ -112.880619, 41.998921 ], [ -112.833125, 41.999345 ], [ -112.833084, 41.999305 ], [ -112.788542, 41.999681 ], [ -112.709375, 42.000309 ], [ -112.648019, 42.000307 ], [ -112.450814, 42.000953 ], [ -112.450567, 42.001092 ], [ -112.386170, 42.001126 ], [ -112.264936, 42.000991 ], [ -112.239107, 42.001217 ], [ -112.192976, 42.001167 ], [ -112.173352, 41.996568 ], [ -112.163956, 41.996708 ], [ -112.109532, 41.997598 ], [ -112.012180, 41.998350 ], [ -111.915837, 41.998519 ], [ -111.915622, 41.998496 ], [ -111.876491, 41.998528 ], [ -111.750778, 41.999330 ], [ -111.507264, 41.999518 ], [ -111.471381, 41.999739 ], [ -111.425535, 42.000840 ], [ -111.420898, 42.000793 ], [ -111.415873, 42.000748 ], [ -111.046689, 42.001567 ], [ -111.045789, 41.565571 ], [ -111.046264, 41.377731 ], [ -111.046600, 41.360692 ], [ -111.046551, 41.251716 ], [ -111.046723, 40.997959 ], [ -110.750727, 40.996847 ], [ -110.715026, 40.996347 ], [ -110.539819, 40.996346 ], [ -110.500718, 40.994746 ], [ -110.375714, 40.994947 ], [ -110.250709, 40.996089 ], [ -110.237848, 40.995427 ], [ -110.125709, 40.996550 ], [ -110.121639, 40.997101 ], [ -110.006495, 40.997815 ], [ -110.000708, 40.997352 ], [ -109.999838, 40.997330 ], [ -109.975530, 40.997912 ], [ -109.855299, 40.997614 ], [ -109.854302, 40.997661 ], [ -109.715409, 40.998191 ], [ -109.713877, 40.998266 ], [ -109.676421, 40.998395 ], [ -109.534926, 40.998143 ], [ -109.500694, 40.999127 ], [ -109.250735, 41.001009 ], [ -109.231985, 41.002059 ], [ -109.173682, 41.000859 ], [ -109.050076, 41.000659 ], [ -109.048455, 40.826081 ], [ -109.049088, 40.714562 ], [ -109.048249, 40.653601 ], [ -109.048044, 40.619231 ], [ -109.050074, 40.540358 ], [ -109.049955, 40.539901 ], [ -109.050698, 40.499963 ], [ -109.050314, 40.495092 ], [ -109.050946, 40.444368 ], [ -109.050973, 40.180849 ], [ -109.050944, 40.180712 ], [ -109.050813, 40.059579 ], [ -109.050873, 40.058915 ], [ -109.050615, 39.874970 ], [ -109.051363, 39.497674 ], [ -109.050765, 39.366677 ], [ -109.051512, 39.126095 ], [ -109.052436, 38.999985 ], [ -109.053292, 38.942878 ], [ -109.053233, 38.942467 ], [ -109.053797, 38.905284 ], [ -109.053943, 38.904414 ], [ -109.054189, 38.874984 ], [ -109.057388, 38.795456 ], [ -109.059541, 38.719888 ], [ -109.060253, 38.599328 ], [ -109.059962, 38.499987 ], [ -109.060062, 38.275489 ], [ -109.054648, 38.244921 ], [ -109.041762, 38.164690 ], [ -109.042820, 37.999301 ], [ -109.042819, 37.997068 ], [ -109.043121, 37.974260 ], [ -109.041058, 37.907236 ], [ -109.041844, 37.872788 ], [ -109.041723, 37.842051 ], [ -109.041754, 37.835826 ], [ -109.041461, 37.800105 ], [ -109.042098, 37.749990 ], [ -109.041636, 37.740210 ], [ -109.041760, 37.713182 ], [ -109.041732, 37.711214 ], [ -109.042269, 37.666067 ], [ -109.042089, 37.623795 ], [ -109.042131, 37.617662 ], [ -109.041806, 37.604171 ], [ -109.041865, 37.530726 ], [ -109.041915, 37.530653 ], [ -109.043137, 37.499992 ], [ -109.045810, 37.374993 ], [ -109.046039, 37.249993 ], [ -109.045584, 37.249351 ], [ -109.045487, 37.210844 ], [ -109.045978, 37.201831 ], [ -109.045995, 37.177279 ], [ -109.045156, 37.112064 ], [ -109.045203, 37.111958 ], [ -109.045173, 37.109464 ], [ -109.045189, 37.096271 ], [ -109.044995, 37.086429 ], [ -109.045058, 37.074661 ], [ -109.045166, 37.072742 ], [ -109.045223, 36.999084 ], [ -109.181196, 36.999271 ], [ -109.233848, 36.999266 ], [ -109.246917, 36.999346 ], [ -109.263390, 36.999263 ], [ -109.268213, 36.999242 ], [ -109.270097, 36.999266 ], [ -109.378039, 36.999135 ], [ -109.381226, 36.999148 ], [ -109.495338, 36.999105 ], [ -109.625668, 36.998308 ], [ -109.875673, 36.998504 ], [ -110.000677, 36.997968 ], [ -110.000876, 36.998502 ], [ -110.021778, 36.998602 ], [ -110.470190, 36.997997 ], [ -110.490908, 37.003566 ], [ -110.500690, 37.004260 ], [ -110.599512, 37.003448 ], [ -110.625605, 37.003416 ], [ -110.625690, 37.003721 ], [ -110.750690, 37.003197 ], [ -111.066496, 37.002389 ], [ -111.133718, 37.000779 ], [ -111.254853, 37.001077 ], [ -111.278286, 37.000465 ], [ -111.405517, 37.001497 ], [ -111.405869, 37.001481 ], [ -112.357690, 37.001025 ], [ -112.368946, 37.001125 ], [ -112.540368, 37.000669 ], [ -112.545094, 37.000734 ], [ -112.558974, 37.000692 ], [ -112.609787, 37.000753 ], [ -112.966471, 37.000219 ], [ -113.965907, 36.999976 ], [ -113.965907, 37.000025 ], [ -114.050600, 37.000396 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US53", "STATE": "53", "NAME": "Washington", "LSAD": "", "CENSUSAREA": 66455.521000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -123.090546, 49.001976 ], [ -123.035393, 49.002154 ], [ -123.021459, 48.977299 ], [ -123.028091, 48.973943 ], [ -123.040967, 48.977305 ], [ -123.060717, 48.975388 ], [ -123.083834, 48.976139 ], [ -123.084498, 48.986535 ], [ -123.090546, 49.001976 ] ] ], [ [ [ -123.025486, 48.717966 ], [ -123.019699, 48.721312 ], [ -123.009787, 48.722291 ], [ -123.007511, 48.718863 ], [ -123.005086, 48.694342 ], [ -123.014449, 48.684978 ], [ -123.021215, 48.681416 ], [ -123.042337, 48.675663 ], [ -123.041645, 48.678633 ], [ -123.035672, 48.685350 ], [ -123.036360, 48.690080 ], [ -123.047058, 48.695772 ], [ -123.070427, 48.699971 ], [ -123.040179, 48.717296 ], [ -123.025486, 48.717966 ] ] ], [ [ [ -122.695907, 48.737273 ], [ -122.668947, 48.706644 ], [ -122.663259, 48.697077 ], [ -122.644901, 48.691389 ], [ -122.618225, 48.670721 ], [ -122.609576, 48.645018 ], [ -122.616956, 48.645563 ], [ -122.635299, 48.651846 ], [ -122.673538, 48.680809 ], [ -122.691795, 48.711498 ], [ -122.702223, 48.717004 ], [ -122.718833, 48.716818 ], [ -122.721981, 48.723375 ], [ -122.722262, 48.731624 ], [ -122.715709, 48.748672 ], [ -122.703060, 48.743602 ], [ -122.695907, 48.737273 ] ] ], [ [ [ -122.699266, 48.621115 ], [ -122.698060, 48.623080 ], [ -122.674173, 48.629944 ], [ -122.657016, 48.609891 ], [ -122.666149, 48.608088 ], [ -122.676796, 48.610055 ], [ -122.686136, 48.613267 ], [ -122.699266, 48.621115 ] ] ], [ [ [ -122.714512, 48.608780 ], [ -122.694672, 48.596602 ], [ -122.691745, 48.590612 ], [ -122.670638, 48.568812 ], [ -122.689440, 48.543903 ], [ -122.717278, 48.539739 ], [ -122.722407, 48.540606 ], [ -122.724031, 48.549906 ], [ -122.730480, 48.565602 ], [ -122.736199, 48.569005 ], [ -122.739440, 48.573893 ], [ -122.739898, 48.583949 ], [ -122.724930, 48.603263 ], [ -122.714512, 48.608780 ] ] ], [ [ [ -122.649405, 48.588457 ], [ -122.642597, 48.588339 ], [ -122.629321, 48.572200 ], [ -122.610841, 48.561146 ], [ -122.592901, 48.553635 ], [ -122.583985, 48.551534 ], [ -122.578856, 48.548130 ], [ -122.572967, 48.529028 ], [ -122.583565, 48.532340 ], [ -122.590194, 48.536259 ], [ -122.599948, 48.536904 ], [ -122.619858, 48.529246 ], [ -122.635738, 48.526021 ], [ -122.640414, 48.525860 ], [ -122.649256, 48.528769 ], [ -122.652041, 48.531329 ], [ -122.654342, 48.537956 ], [ -122.653612, 48.548975 ], [ -122.650786, 48.554019 ], [ -122.652385, 48.583432 ], [ -122.649405, 48.588457 ] ] ], [ [ [ -122.321721, 48.019977 ], [ -122.303455, 48.005603 ], [ -122.306629, 48.004397 ], [ -122.326115, 48.010295 ], [ -122.334524, 48.018916 ], [ -122.328343, 48.021335 ], [ -122.321721, 48.019977 ] ] ], [ [ [ -122.519535, 48.288314 ], [ -122.522756, 48.285504 ], [ -122.530976, 48.282445 ], [ -122.551793, 48.281512 ], [ -122.558332, 48.282061 ], [ -122.574872, 48.294903 ], [ -122.584086, 48.297987 ], [ -122.599532, 48.298303 ], [ -122.618466, 48.294159 ], [ -122.626757, 48.288991 ], [ -122.620748, 48.282961 ], [ -122.623779, 48.269431 ], [ -122.652639, 48.265081 ], [ -122.653430, 48.259340 ], [ -122.669210, 48.240614 ], [ -122.704142, 48.238051 ], [ -122.732326, 48.229458 ], [ -122.720811, 48.214335 ], [ -122.692971, 48.222241 ], [ -122.668385, 48.223967 ], [ -122.631260, 48.220686 ], [ -122.628352, 48.222467 ], [ -122.606406, 48.208262 ], [ -122.588138, 48.185940 ], [ -122.585778, 48.182352 ], [ -122.582595, 48.170424 ], [ -122.574905, 48.155593 ], [ -122.567936, 48.148624 ], [ -122.558205, 48.119579 ], [ -122.559911, 48.114186 ], [ -122.571615, 48.105113 ], [ -122.571853, 48.102143 ], [ -122.554559, 48.077392 ], [ -122.545120, 48.052550 ], [ -122.538953, 48.050232 ], [ -122.536713, 48.026166 ], [ -122.541525, 48.017745 ], [ -122.522793, 48.019120 ], [ -122.511450, 48.038711 ], [ -122.516314, 48.057181 ], [ -122.513994, 48.059077 ], [ -122.511081, 48.075301 ], [ -122.516906, 48.081085 ], [ -122.525422, 48.096537 ], [ -122.513276, 48.097538 ], [ -122.491104, 48.094242 ], [ -122.461606, 48.068501 ], [ -122.448419, 48.054323 ], [ -122.431266, 48.045001 ], [ -122.400628, 48.036563 ], [ -122.387382, 48.034030 ], [ -122.376259, 48.034457 ], [ -122.373263, 48.000791 ], [ -122.369161, 47.995295 ], [ -122.353611, 47.981433 ], [ -122.350254, 47.969355 ], [ -122.349597, 47.958796 ], [ -122.350741, 47.953235 ], [ -122.358812, 47.937420 ], [ -122.367876, 47.932415 ], [ -122.376837, 47.923703 ], [ -122.375780, 47.910252 ], [ -122.377300, 47.905941 ], [ -122.380497, 47.904023 ], [ -122.390420, 47.905696 ], [ -122.397349, 47.912401 ], [ -122.419274, 47.912125 ], [ -122.431035, 47.914732 ], [ -122.445519, 47.930226 ], [ -122.445759, 47.936190 ], [ -122.440790, 47.946594 ], [ -122.440760, 47.951845 ], [ -122.446682, 47.963155 ], [ -122.472660, 47.988449 ], [ -122.487505, 47.990729 ], [ -122.501257, 47.987089 ], [ -122.514813, 47.981152 ], [ -122.517780, 47.974916 ], [ -122.521219, 47.972997 ], [ -122.546824, 47.967215 ], [ -122.552053, 47.973644 ], [ -122.551032, 47.977346 ], [ -122.543063, 47.985983 ], [ -122.541564, 47.992998 ], [ -122.542924, 47.996404 ], [ -122.560018, 48.006502 ], [ -122.581780, 48.010386 ], [ -122.607342, 48.030992 ], [ -122.596786, 48.038834 ], [ -122.593621, 48.047200 ], [ -122.594922, 48.056318 ], [ -122.614028, 48.072788 ], [ -122.613217, 48.079485 ], [ -122.607291, 48.088034 ], [ -122.598301, 48.110616 ], [ -122.602109, 48.135249 ], [ -122.609568, 48.151860 ], [ -122.617464, 48.159055 ], [ -122.633167, 48.163281 ], [ -122.656020, 48.162513 ], [ -122.671235, 48.157312 ], [ -122.677337, 48.154587 ], [ -122.679556, 48.155113 ], [ -122.686626, 48.174653 ], [ -122.693084, 48.181509 ], [ -122.711508, 48.193573 ], [ -122.735030, 48.199964 ], [ -122.744612, 48.209650 ], [ -122.763042, 48.215342 ], [ -122.770045, 48.224395 ], [ -122.769939, 48.227548 ], [ -122.752563, 48.260061 ], [ -122.732022, 48.279425 ], [ -122.722590, 48.304268 ], [ -122.707077, 48.315286 ], [ -122.673731, 48.354683 ], [ -122.664928, 48.374823 ], [ -122.664659, 48.401508 ], [ -122.644798, 48.405488 ], [ -122.634991, 48.404244 ], [ -122.632643, 48.401068 ], [ -122.634024, 48.398858 ], [ -122.637339, 48.398029 ], [ -122.637892, 48.395681 ], [ -122.635820, 48.395128 ], [ -122.627809, 48.397200 ], [ -122.617174, 48.407145 ], [ -122.609715, 48.411565 ], [ -122.601980, 48.409907 ], [ -122.596732, 48.405626 ], [ -122.595351, 48.397200 ], [ -122.585038, 48.395166 ], [ -122.588891, 48.363005 ], [ -122.585162, 48.353304 ], [ -122.565525, 48.348217 ], [ -122.551334, 48.342138 ], [ -122.515979, 48.320419 ], [ -122.506568, 48.310041 ], [ -122.504729, 48.300373 ], [ -122.505828, 48.297677 ], [ -122.519535, 48.288314 ] ] ], [ [ [ -116.915989, 45.995413 ], [ -116.940681, 45.996274 ], [ -116.985882, 45.996974 ], [ -117.051304, 45.996849 ], [ -117.070047, 45.997510 ], [ -117.212616, 45.998321 ], [ -117.214534, 45.998320 ], [ -117.216731, 45.998356 ], [ -117.337668, 45.998662 ], [ -117.353928, 45.996349 ], [ -117.390738, 45.998598 ], [ -117.439943, 45.998633 ], [ -117.475148, 45.997893 ], [ -117.475360, 45.997855 ], [ -117.480103, 45.997870 ], [ -117.504833, 45.998317 ], [ -117.603163, 45.998887 ], [ -117.717852, 45.999866 ], [ -117.996911, 46.000787 ], [ -118.126197, 46.000282 ], [ -118.131019, 46.000280 ], [ -118.146028, 46.000701 ], [ -118.228941, 46.000421 ], [ -118.236584, 46.000418 ], [ -118.252530, 46.000459 ], [ -118.256368, 46.000439 ], [ -118.283526, 46.000787 ], [ -118.314982, 46.000453 ], [ -118.367790, 46.000622 ], [ -118.378360, 46.000574 ], [ -118.470756, 46.000632 ], [ -118.497027, 46.000620 ], [ -118.537119, 46.000840 ], [ -118.569392, 46.000773 ], [ -118.575710, 46.000718 ], [ -118.579906, 46.000818 ], [ -118.637725, 46.000970 ], [ -118.639332, 46.000994 ], [ -118.658717, 46.000955 ], [ -118.677870, 46.000935 ], [ -118.941242, 46.000574 ], [ -118.987129, 45.999855 ], [ -119.008558, 45.979270 ], [ -119.027056, 45.969134 ], [ -119.061462, 45.958527 ], [ -119.093221, 45.942745 ], [ -119.126120, 45.932859 ], [ -119.169496, 45.927603 ], [ -119.195530, 45.927870 ], [ -119.225745, 45.932725 ], [ -119.257150, 45.939926 ], [ -119.322509, 45.933183 ], [ -119.364396, 45.921605 ], [ -119.450256, 45.917354 ], [ -119.487829, 45.906307 ], [ -119.524632, 45.908605 ], [ -119.571584, 45.925456 ], [ -119.600549, 45.919581 ], [ -119.623393, 45.905639 ], [ -119.669877, 45.856867 ], [ -119.772927, 45.845578 ], [ -119.802655, 45.847530 ], [ -119.868135, 45.835962 ], [ -119.876144, 45.834718 ], [ -119.907461, 45.828135 ], [ -119.965744, 45.824365 ], [ -120.001148, 45.811902 ], [ -120.070150, 45.785152 ], [ -120.141352, 45.773152 ], [ -120.170453, 45.761951 ], [ -120.210754, 45.725951 ], [ -120.282156, 45.721250 ], [ -120.288656, 45.720150 ], [ -120.329057, 45.711050 ], [ -120.403960, 45.699249 ], [ -120.482362, 45.694449 ], [ -120.505863, 45.700048 ], [ -120.521964, 45.709848 ], [ -120.559465, 45.738348 ], [ -120.591166, 45.746547 ], [ -120.634968, 45.745847 ], [ -120.668869, 45.730147 ], [ -120.689370, 45.715847 ], [ -120.724171, 45.706446 ], [ -120.788872, 45.686246 ], [ -120.855674, 45.671545 ], [ -120.870042, 45.661242 ], [ -120.895575, 45.642945 ], [ -120.913476, 45.640045 ], [ -120.915876, 45.641345 ], [ -120.943977, 45.656445 ], [ -120.953077, 45.656745 ], [ -120.977978, 45.649345 ], [ -120.983478, 45.648344 ], [ -121.007449, 45.653217 ], [ -121.033582, 45.650998 ], [ -121.064370, 45.652549 ], [ -121.084933, 45.647893 ], [ -121.120064, 45.623134 ], [ -121.117052, 45.618117 ], [ -121.122200, 45.616067 ], [ -121.131953, 45.609762 ], [ -121.139483, 45.611962 ], [ -121.145534, 45.607886 ], [ -121.167852, 45.606098 ], [ -121.183841, 45.606441 ], [ -121.196556, 45.616689 ], [ -121.195233, 45.629513 ], [ -121.200367, 45.649829 ], [ -121.215779, 45.671238 ], [ -121.251183, 45.678390 ], [ -121.287323, 45.687019 ], [ -121.312198, 45.699925 ], [ -121.337770, 45.704949 ], [ -121.372574, 45.703111 ], [ -121.401739, 45.692887 ], [ -121.423592, 45.693990 ], [ -121.462849, 45.701367 ], [ -121.499153, 45.720846 ], [ -121.522392, 45.724677 ], [ -121.533106, 45.726541 ], [ -121.631167, 45.704657 ], [ -121.668362, 45.705082 ], [ -121.707358, 45.694809 ], [ -121.735104, 45.694039 ], [ -121.811304, 45.706761 ], [ -121.867167, 45.693277 ], [ -121.901855, 45.670716 ], [ -121.900858, 45.662009 ], [ -121.908267, 45.654399 ], [ -121.935149, 45.644169 ], [ -121.951838, 45.644951 ], [ -121.955734, 45.643559 ], [ -121.963547, 45.632784 ], [ -121.979797, 45.624839 ], [ -121.983038, 45.622812 ], [ -122.003690, 45.615930 ], [ -122.022571, 45.615151 ], [ -122.044374, 45.609516 ], [ -122.101675, 45.583516 ], [ -122.112356, 45.581409 ], [ -122.126197, 45.582617 ], [ -122.126197, 45.582573 ], [ -122.129490, 45.582967 ], [ -122.129548, 45.582945 ], [ -122.140750, 45.584508 ], [ -122.183695, 45.577696 ], [ -122.201700, 45.564141 ], [ -122.248993, 45.547745 ], [ -122.262625, 45.544321 ], [ -122.266701, 45.543841 ], [ -122.294901, 45.543541 ], [ -122.331502, 45.548241 ], [ -122.352802, 45.569441 ], [ -122.380302, 45.575941 ], [ -122.391802, 45.574541 ], [ -122.410706, 45.567633 ], [ -122.438674, 45.563585 ], [ -122.453891, 45.567313 ], [ -122.474659, 45.578305 ], [ -122.479315, 45.579761 ], [ -122.492259, 45.583281 ], [ -122.523668, 45.589632 ], [ -122.548149, 45.596768 ], [ -122.581406, 45.603940 ], [ -122.602606, 45.607639 ], [ -122.643907, 45.609739 ], [ -122.675008, 45.618039 ], [ -122.691008, 45.624739 ], [ -122.713309, 45.637438 ], [ -122.738109, 45.644138 ], [ -122.763810, 45.657138 ], [ -122.774511, 45.680437 ], [ -122.772511, 45.699637 ], [ -122.760108, 45.734413 ], [ -122.761451, 45.759163 ], [ -122.769532, 45.780583 ], [ -122.795605, 45.810000 ], [ -122.795963, 45.825024 ], [ -122.785696, 45.844216 ], [ -122.785515, 45.850536 ], [ -122.785026, 45.867699 ], [ -122.798091, 45.884333 ], [ -122.811510, 45.912725 ], [ -122.806193, 45.932416 ], [ -122.813998, 45.960984 ], [ -122.837638, 45.980820 ], [ -122.856158, 46.014469 ], [ -122.878092, 46.031281 ], [ -122.884478, 46.060280 ], [ -122.904119, 46.083734 ], [ -122.962681, 46.104817 ], [ -123.004233, 46.133823 ], [ -123.009436, 46.136043 ], [ -123.022147, 46.139110 ], [ -123.033820, 46.144336 ], [ -123.041297, 46.146351 ], [ -123.051064, 46.153599 ], [ -123.105021, 46.177676 ], [ -123.115904, 46.185268 ], [ -123.166414, 46.188973 ], [ -123.213054, 46.172541 ], [ -123.231196, 46.166150 ], [ -123.251233, 46.156452 ], [ -123.280166, 46.144843 ], [ -123.301034, 46.144632 ], [ -123.332335, 46.146132 ], [ -123.371433, 46.146372 ], [ -123.430847, 46.181827 ], [ -123.427629, 46.229348 ], [ -123.447592, 46.249832 ], [ -123.468743, 46.264531 ], [ -123.474844, 46.267831 ], [ -123.479644, 46.269131 ], [ -123.501245, 46.271004 ], [ -123.516188, 46.266153 ], [ -123.526391, 46.263404 ], [ -123.538092, 46.260610 ], [ -123.547659, 46.259109 ], [ -123.547636, 46.265595 ], [ -123.559923, 46.265098 ], [ -123.564405, 46.262172 ], [ -123.581642, 46.260502 ], [ -123.613544, 46.259988 ], [ -123.669501, 46.266832 ], [ -123.679125, 46.272502 ], [ -123.680080, 46.277943 ], [ -123.678069, 46.286469 ], [ -123.678760, 46.290721 ], [ -123.680574, 46.296025 ], [ -123.687763, 46.299235 ], [ -123.700764, 46.305278 ], [ -123.724273, 46.301161 ], [ -123.724038, 46.295058 ], [ -123.728585, 46.288725 ], [ -123.741478, 46.290274 ], [ -123.759560, 46.275073 ], [ -123.766682, 46.273499 ], [ -123.775054, 46.274599 ], [ -123.782654, 46.280227 ], [ -123.795556, 46.284501 ], [ -123.806139, 46.283588 ], [ -123.875525, 46.239787 ], [ -123.909306, 46.245491 ], [ -123.919581, 46.251217 ], [ -123.954353, 46.277001 ], [ -123.969427, 46.291398 ], [ -123.970912, 46.293866 ], [ -123.970355, 46.299352 ], [ -123.974509, 46.303063 ], [ -123.985204, 46.309039 ], [ -124.001264, 46.313260 ], [ -124.020551, 46.315737 ], [ -124.029924, 46.308312 ], [ -124.035599, 46.296843 ], [ -124.038797, 46.283675 ], [ -124.044018, 46.275925 ], [ -124.060961, 46.278761 ], [ -124.080671, 46.267239 ], [ -124.082187, 46.269159 ], [ -124.081729, 46.274714 ], [ -124.076262, 46.296498 ], [ -124.071384, 46.305504 ], [ -124.064624, 46.326899 ], [ -124.058351, 46.386503 ], [ -124.057425, 46.409315 ], [ -124.057024, 46.493338 ], [ -124.061953, 46.556165 ], [ -124.068420, 46.601397 ], [ -124.069583, 46.630651 ], [ -124.069050, 46.647258 ], [ -124.059426, 46.655507 ], [ -124.048444, 46.645827 ], [ -124.035874, 46.630822 ], [ -124.052708, 46.622796 ], [ -124.050842, 46.617421 ], [ -124.028799, 46.591040 ], [ -124.023566, 46.582559 ], [ -124.023148, 46.564113 ], [ -124.026019, 46.531589 ], [ -124.031737, 46.496375 ], [ -124.026032, 46.462978 ], [ -124.001271, 46.459992 ], [ -123.990615, 46.463019 ], [ -123.990870, 46.465738 ], [ -123.994181, 46.468868 ], [ -123.992680, 46.488617 ], [ -123.988386, 46.497008 ], [ -123.983688, 46.498542 ], [ -123.979053, 46.497378 ], [ -123.979213, 46.489949 ], [ -123.970830, 46.475370 ], [ -123.968044, 46.473497 ], [ -123.943667, 46.477197 ], [ -123.921192, 46.507731 ], [ -123.896703, 46.522665 ], [ -123.897242, 46.528480 ], [ -123.894254, 46.537028 ], [ -123.903321, 46.551910 ], [ -123.916902, 46.562633 ], [ -123.920247, 46.567343 ], [ -123.922332, 46.577057 ], [ -123.928861, 46.588875 ], [ -123.939139, 46.596326 ], [ -123.955556, 46.603570 ], [ -123.959175, 46.613581 ], [ -123.960642, 46.636364 ], [ -123.940616, 46.640862 ], [ -123.921913, 46.650262 ], [ -123.920916, 46.653576 ], [ -123.923269, 46.672708 ], [ -123.915596, 46.678649 ], [ -123.895601, 46.683672 ], [ -123.864902, 46.698685 ], [ -123.851356, 46.702560 ], [ -123.846210, 46.716795 ], [ -123.848725, 46.719898 ], [ -123.862149, 46.727749 ], [ -123.870782, 46.728327 ], [ -123.876680, 46.730657 ], [ -123.893054, 46.750204 ], [ -123.898641, 46.750205 ], [ -123.910716, 46.746715 ], [ -123.916371, 46.741322 ], [ -123.915840, 46.737322 ], [ -123.912850, 46.730647 ], [ -123.916874, 46.726739 ], [ -123.929073, 46.725278 ], [ -123.948683, 46.725369 ], [ -123.968564, 46.736106 ], [ -123.974994, 46.733391 ], [ -123.979655, 46.724658 ], [ -123.975157, 46.713971 ], [ -123.966886, 46.705184 ], [ -123.973663, 46.703353 ], [ -123.987521, 46.707507 ], [ -123.994242, 46.707929 ], [ -124.003458, 46.702337 ], [ -124.022413, 46.708973 ], [ -124.042478, 46.720040 ], [ -124.042111, 46.722783 ], [ -124.046399, 46.725686 ], [ -124.063117, 46.733664 ], [ -124.080983, 46.735003 ], [ -124.092176, 46.741624 ], [ -124.096515, 46.746202 ], [ -124.095041, 46.756812 ], [ -124.096655, 46.784374 ], [ -124.101232, 46.810656 ], [ -124.108078, 46.836388 ], [ -124.122979, 46.879809 ], [ -124.138225, 46.905534 ], [ -124.117712, 46.912380 ], [ -124.110641, 46.912520 ], [ -124.093392, 46.901168 ], [ -124.090422, 46.895500 ], [ -124.089286, 46.867716 ], [ -124.073113, 46.861493 ], [ -124.066349, 46.863504 ], [ -124.061051, 46.865127 ], [ -124.055085, 46.870429 ], [ -124.049279, 46.891253 ], [ -124.046344, 46.893972 ], [ -124.036240, 46.898473 ], [ -124.013660, 46.903630 ], [ -124.009519, 46.910325 ], [ -123.985082, 46.921916 ], [ -123.979378, 46.923038 ], [ -123.957493, 46.921261 ], [ -123.915256, 46.932964 ], [ -123.882884, 46.939946 ], [ -123.860180, 46.948556 ], [ -123.876136, 46.961054 ], [ -123.889402, 46.968904 ], [ -123.898245, 46.971927 ], [ -123.921617, 46.971864 ], [ -123.939214, 46.969739 ], [ -123.947996, 46.971818 ], [ -123.959185, 46.981759 ], [ -123.991612, 46.980215 ], [ -124.012218, 46.985176 ], [ -124.019727, 46.991189 ], [ -124.010068, 46.997882 ], [ -124.005248, 47.003915 ], [ -124.017035, 47.011717 ], [ -124.016999, 47.014848 ], [ -124.026345, 47.030187 ], [ -124.065856, 47.041140 ], [ -124.106378, 47.042640 ], [ -124.122057, 47.041650 ], [ -124.141517, 47.035142 ], [ -124.149043, 47.029294 ], [ -124.151288, 47.021112 ], [ -124.139733, 46.988370 ], [ -124.138035, 46.970959 ], [ -124.124386, 46.943870 ], [ -124.141267, 46.940266 ], [ -124.158624, 46.929439 ], [ -124.180111, 46.926357 ], [ -124.174503, 46.941623 ], [ -124.171161, 46.958443 ], [ -124.169113, 46.994508 ], [ -124.173501, 47.066370 ], [ -124.176745, 47.092999 ], [ -124.183833, 47.124807 ], [ -124.182802, 47.134041 ], [ -124.185806, 47.136017 ], [ -124.189725, 47.146827 ], [ -124.195893, 47.174000 ], [ -124.209017, 47.218151 ], [ -124.236349, 47.287287 ], [ -124.242234, 47.295101 ], [ -124.253590, 47.302480 ], [ -124.257452, 47.304059 ], [ -124.271193, 47.305025 ], [ -124.286369, 47.325162 ], [ -124.293288, 47.339309 ], [ -124.299943, 47.348360 ], [ -124.307509, 47.352268 ], [ -124.319379, 47.355559 ], [ -124.324091, 47.367602 ], [ -124.326650, 47.388759 ], [ -124.336724, 47.415996 ], [ -124.345155, 47.489030 ], [ -124.355955, 47.545698 ], [ -124.359028, 47.547616 ], [ -124.366221, 47.582439 ], [ -124.371746, 47.599575 ], [ -124.374927, 47.603891 ], [ -124.382215, 47.632302 ], [ -124.395983, 47.665534 ], [ -124.412106, 47.691199 ], [ -124.420219, 47.725294 ], [ -124.425195, 47.738434 ], [ -124.430546, 47.746249 ], [ -124.453927, 47.765334 ], [ -124.471687, 47.766907 ], [ -124.476570, 47.769671 ], [ -124.482154, 47.797454 ], [ -124.489737, 47.816988 ], [ -124.497987, 47.822605 ], [ -124.506680, 47.823910 ], [ -124.512780, 47.822518 ], [ -124.539927, 47.836967 ], [ -124.558254, 47.855979 ], [ -124.559034, 47.863085 ], [ -124.562363, 47.866216 ], [ -124.588172, 47.877878 ], [ -124.609538, 47.879996 ], [ -124.625512, 47.887963 ], [ -124.630153, 47.892467 ], [ -124.629706, 47.896968 ], [ -124.645442, 47.935338 ], [ -124.651966, 47.943177 ], [ -124.662334, 47.951451 ], [ -124.672427, 47.964414 ], [ -124.670830, 47.982366 ], [ -124.679024, 48.015697 ], [ -124.682157, 48.035987 ], [ -124.685393, 48.049238 ], [ -124.688359, 48.054927 ], [ -124.693676, 48.058697 ], [ -124.696542, 48.069274 ], [ -124.695114, 48.087096 ], [ -124.688602, 48.092466 ], [ -124.687101, 48.098657 ], [ -124.695088, 48.114878 ], [ -124.721725, 48.153185 ], [ -124.731703, 48.160402 ], [ -124.733174, 48.163393 ], [ -124.731746, 48.169997 ], [ -124.704153, 48.184422 ], [ -124.696111, 48.198599 ], [ -124.690900, 48.212617 ], [ -124.690389, 48.219745 ], [ -124.705031, 48.238774 ], [ -124.705920, 48.239894 ], [ -124.699663, 48.245812 ], [ -124.684677, 48.255228 ], [ -124.680877, 48.265350 ], [ -124.676319, 48.295143 ], [ -124.669265, 48.296353 ], [ -124.665908, 48.299324 ], [ -124.662068, 48.310450 ], [ -124.658940, 48.331057 ], [ -124.670072, 48.341341 ], [ -124.696703, 48.349748 ], [ -124.713817, 48.366309 ], [ -124.727022, 48.371101 ], [ -124.730863, 48.376200 ], [ -124.731828, 48.381157 ], [ -124.725839, 48.386012 ], [ -124.716947, 48.389776 ], [ -124.694511, 48.389004 ], [ -124.653243, 48.390691 ], [ -124.639389, 48.385524 ], [ -124.631108, 48.376522 ], [ -124.611782, 48.378182 ], [ -124.599278, 48.381035 ], [ -124.597331, 48.381882 ], [ -124.590733, 48.373604 ], [ -124.572864, 48.366228 ], [ -124.564841, 48.367921 ], [ -124.546259, 48.353594 ], [ -124.538821, 48.349893 ], [ -124.525453, 48.349022 ], [ -124.510582, 48.343236 ], [ -124.414007, 48.300887 ], [ -124.395593, 48.288772 ], [ -124.380874, 48.284699 ], [ -124.361351, 48.287582 ], [ -124.342412, 48.277695 ], [ -124.299146, 48.268239 ], [ -124.295589, 48.262983 ], [ -124.296924, 48.261796 ], [ -124.297643, 48.260676 ], [ -124.295693, 48.259282 ], [ -124.272017, 48.254410 ], [ -124.265824, 48.254842 ], [ -124.255109, 48.258972 ], [ -124.252267, 48.261004 ], [ -124.250882, 48.264773 ], [ -124.238582, 48.262471 ], [ -124.217873, 48.253294 ], [ -124.192692, 48.246316 ], [ -124.141290, 48.227413 ], [ -124.110974, 48.220557 ], [ -124.101773, 48.216883 ], [ -124.107215, 48.200082 ], [ -124.090717, 48.196458 ], [ -124.072124, 48.189903 ], [ -124.050734, 48.177747 ], [ -123.981032, 48.164761 ], [ -123.955347, 48.165455 ], [ -123.934921, 48.160840 ], [ -123.915589, 48.159352 ], [ -123.880068, 48.160621 ], [ -123.866677, 48.154796 ], [ -123.858821, 48.154273 ], [ -123.831571, 48.157937 ], [ -123.778122, 48.155466 ], [ -123.756395, 48.161057 ], [ -123.728736, 48.162800 ], [ -123.728290, 48.160858 ], [ -123.725352, 48.159191 ], [ -123.718350, 48.158713 ], [ -123.706226, 48.163400 ], [ -123.706432, 48.165822 ], [ -123.702743, 48.166783 ], [ -123.672445, 48.162715 ], [ -123.651408, 48.156952 ], [ -123.636967, 48.150319 ], [ -123.641108, 48.146127 ], [ -123.628819, 48.139279 ], [ -123.590839, 48.134949 ], [ -123.574214, 48.140756 ], [ -123.560591, 48.150697 ], [ -123.551131, 48.151382 ], [ -123.534879, 48.145780 ], [ -123.522320, 48.135539 ], [ -123.507235, 48.131807 ], [ -123.473379, 48.134079 ], [ -123.455458, 48.140047 ], [ -123.440128, 48.142014 ], [ -123.425586, 48.142221 ], [ -123.399808, 48.139815 ], [ -123.401526, 48.137753 ], [ -123.439127, 48.141278 ], [ -123.441972, 48.124259 ], [ -123.424668, 48.118065 ], [ -123.395048, 48.114243 ], [ -123.360923, 48.115864 ], [ -123.332699, 48.112970 ], [ -123.314578, 48.113725 ], [ -123.288265, 48.121036 ], [ -123.280178, 48.117309 ], [ -123.268917, 48.116094 ], [ -123.248615, 48.115745 ], [ -123.239129, 48.118217 ], [ -123.217190, 48.127203 ], [ -123.191521, 48.143821 ], [ -123.164400, 48.165894 ], [ -123.144783, 48.175943 ], [ -123.133445, 48.177276 ], [ -123.100656, 48.186058 ], [ -123.099969, 48.183995 ], [ -123.132417, 48.174704 ], [ -123.139258, 48.166480 ], [ -123.143229, 48.156633 ], [ -123.131422, 48.152736 ], [ -123.124816, 48.153472 ], [ -123.116479, 48.150208 ], [ -123.085154, 48.127137 ], [ -123.066210, 48.120469 ], [ -123.050446, 48.102825 ], [ -123.038727, 48.081138 ], [ -123.016651, 48.085380 ], [ -123.004128, 48.090516 ], [ -122.979413, 48.095940 ], [ -122.946119, 48.098552 ], [ -122.929095, 48.096244 ], [ -122.917942, 48.091535 ], [ -122.920911, 48.088199 ], [ -122.926644, 48.074100 ], [ -122.927975, 48.066650 ], [ -122.926851, 48.064593 ], [ -122.918602, 48.058238 ], [ -122.877641, 48.047025 ], [ -122.860994, 48.025286 ], [ -122.860822, 48.007585 ], [ -122.874570, 47.998993 ], [ -122.871992, 47.993493 ], [ -122.850854, 47.995899 ], [ -122.837450, 48.006898 ], [ -122.827482, 48.046768 ], [ -122.849273, 48.053808 ], [ -122.857727, 48.065774 ], [ -122.878255, 48.076072 ], [ -122.890313, 48.076866 ], [ -122.879314, 48.092677 ], [ -122.884814, 48.103675 ], [ -122.876282, 48.110877 ], [ -122.833173, 48.134406 ], [ -122.784076, 48.142974 ], [ -122.760447, 48.143240 ], [ -122.759046, 48.140056 ], [ -122.762454, 48.131172 ], [ -122.748911, 48.117026 ], [ -122.773177, 48.106864 ], [ -122.778466, 48.106135 ], [ -122.792902, 48.097180 ], [ -122.798464, 48.092451 ], [ -122.801399, 48.087561 ], [ -122.770559, 48.053432 ], [ -122.770496, 48.047897 ], [ -122.766648, 48.044290 ], [ -122.753859, 48.035981 ], [ -122.748532, 48.030138 ], [ -122.734268, 48.034950 ], [ -122.742290, 48.049324 ], [ -122.740007, 48.054116 ], [ -122.739271, 48.069153 ], [ -122.741184, 48.070958 ], [ -122.747389, 48.070795 ], [ -122.748345, 48.072097 ], [ -122.733257, 48.091232 ], [ -122.718558, 48.097567 ], [ -122.698465, 48.103102 ], [ -122.687240, 48.101662 ], [ -122.691640, 48.096726 ], [ -122.692220, 48.087081 ], [ -122.682264, 48.042723 ], [ -122.677153, 48.036346 ], [ -122.668942, 48.032026 ], [ -122.669868, 48.017217 ], [ -122.686898, 48.008305 ], [ -122.690066, 48.008420 ], [ -122.697185, 48.014978 ], [ -122.701840, 48.016106 ], [ -122.719488, 48.023694 ], [ -122.729112, 48.019741 ], [ -122.723374, 48.008095 ], [ -122.718082, 47.987739 ], [ -122.701294, 47.972979 ], [ -122.683223, 47.972226 ], [ -122.678800, 47.967930 ], [ -122.676215, 47.958743 ], [ -122.684688, 47.944049 ], [ -122.684450, 47.939593 ], [ -122.681924, 47.936415 ], [ -122.662380, 47.930700 ], [ -122.657722, 47.931156 ], [ -122.651063, 47.920985 ], [ -122.653990, 47.915890 ], [ -122.655085, 47.905058 ], [ -122.646494, 47.894771 ], [ -122.637425, 47.889945 ], [ -122.618873, 47.890242 ], [ -122.610341, 47.887343 ], [ -122.631857, 47.874815 ], [ -122.633879, 47.868401 ], [ -122.636360, 47.866186 ], [ -122.650083, 47.863860 ], [ -122.666417, 47.867497 ], [ -122.693760, 47.868002 ], [ -122.690974, 47.860118 ], [ -122.681602, 47.850405 ], [ -122.683742, 47.838773 ], [ -122.688596, 47.831438 ], [ -122.719609, 47.813036 ], [ -122.731956, 47.809741 ], [ -122.748061, 47.800546 ], [ -122.750540, 47.773966 ], [ -122.757885, 47.757744 ], [ -122.758498, 47.746036 ], [ -122.774808, 47.735542 ], [ -122.781682, 47.703920 ], [ -122.770684, 47.692234 ], [ -122.811929, 47.679861 ], [ -122.829899, 47.689115 ], [ -122.832139, 47.695511 ], [ -122.815027, 47.725996 ], [ -122.809673, 47.747412 ], [ -122.790619, 47.792597 ], [ -122.812616, 47.840029 ], [ -122.820178, 47.835904 ], [ -122.815027, 47.807493 ], [ -122.818803, 47.788473 ], [ -122.845612, 47.777474 ], [ -122.849529, 47.771206 ], [ -122.850424, 47.738979 ], [ -122.859047, 47.733730 ], [ -122.873919, 47.729566 ], [ -122.880462, 47.720643 ], [ -122.882247, 47.710530 ], [ -122.878083, 47.699227 ], [ -122.878608, 47.690860 ], [ -122.885221, 47.683761 ], [ -122.896524, 47.674838 ], [ -122.900093, 47.665320 ], [ -122.899498, 47.652233 ], [ -122.904042, 47.646178 ], [ -122.972440, 47.614900 ], [ -123.012998, 47.567469 ], [ -123.056305, 47.500789 ], [ -123.106486, 47.458170 ], [ -123.137444, 47.401795 ], [ -123.155980, 47.355745 ], [ -123.149342, 47.350636 ], [ -123.140169, 47.347496 ], [ -123.111298, 47.362619 ], [ -123.111270, 47.369672 ], [ -123.120234, 47.391490 ], [ -123.067845, 47.462471 ], [ -123.033938, 47.496973 ], [ -123.033276, 47.509726 ], [ -122.982482, 47.563896 ], [ -122.967284, 47.585685 ], [ -122.943459, 47.590546 ], [ -122.923947, 47.600539 ], [ -122.922044, 47.614816 ], [ -122.917103, 47.620743 ], [ -122.870647, 47.637659 ], [ -122.856611, 47.649615 ], [ -122.831148, 47.655267 ], [ -122.804498, 47.653363 ], [ -122.754186, 47.671612 ], [ -122.750061, 47.715607 ], [ -122.740159, 47.736228 ], [ -122.733012, 47.737625 ], [ -122.722686, 47.748827 ], [ -122.719712, 47.760976 ], [ -122.714801, 47.768176 ], [ -122.690562, 47.778372 ], [ -122.684085, 47.798574 ], [ -122.682015, 47.800882 ], [ -122.648108, 47.825123 ], [ -122.623192, 47.836199 ], [ -122.614585, 47.850806 ], [ -122.608105, 47.856728 ], [ -122.573672, 47.857582 ], [ -122.573098, 47.874081 ], [ -122.586339, 47.902023 ], [ -122.588235, 47.912923 ], [ -122.596228, 47.920210 ], [ -122.616701, 47.925139 ], [ -122.620316, 47.931553 ], [ -122.617022, 47.938987 ], [ -122.611956, 47.940772 ], [ -122.603861, 47.940478 ], [ -122.601507, 47.931726 ], [ -122.592184, 47.922519 ], [ -122.581846, 47.920282 ], [ -122.549072, 47.919072 ], [ -122.527593, 47.905882 ], [ -122.513986, 47.880807 ], [ -122.512778, 47.863879 ], [ -122.506122, 47.831745 ], [ -122.502224, 47.826395 ], [ -122.482529, 47.815511 ], [ -122.482437, 47.809255 ], [ -122.485214, 47.804128 ], [ -122.495346, 47.797040 ], [ -122.495458, 47.786692 ], [ -122.471402, 47.765965 ], [ -122.470333, 47.757109 ], [ -122.471844, 47.749819 ], [ -122.477344, 47.746019 ], [ -122.488491, 47.743605 ], [ -122.507638, 47.743040 ], [ -122.515193, 47.743911 ], [ -122.519325, 47.746220 ], [ -122.537318, 47.747140 ], [ -122.554454, 47.745704 ], [ -122.543161, 47.710941 ], [ -122.530940, 47.704814 ], [ -122.525851, 47.705095 ], [ -122.523962, 47.708034 ], [ -122.511196, 47.708715 ], [ -122.504604, 47.699136 ], [ -122.504452, 47.685888 ], [ -122.508709, 47.670843 ], [ -122.501935, 47.662182 ], [ -122.508164, 47.643657 ], [ -122.502116, 47.639074 ], [ -122.493205, 47.635122 ], [ -122.492809, 47.629591 ], [ -122.494518, 47.623625 ], [ -122.500357, 47.617816 ], [ -122.498240, 47.598242 ], [ -122.493933, 47.588963 ], [ -122.483805, 47.586721 ], [ -122.479089, 47.583654 ], [ -122.503672, 47.575178 ], [ -122.518367, 47.574080 ], [ -122.534664, 47.566122 ], [ -122.543118, 47.556326 ], [ -122.542355, 47.537840 ], [ -122.547207, 47.528257 ], [ -122.546611, 47.523550 ], [ -122.532909, 47.522184 ], [ -122.523050, 47.524000 ], [ -122.500543, 47.515280 ], [ -122.494882, 47.510265 ], [ -122.530514, 47.469041 ], [ -122.531889, 47.428827 ], [ -122.551136, 47.394456 ], [ -122.537044, 47.375896 ], [ -122.551536, 47.359540 ], [ -122.555840, 47.347519 ], [ -122.571340, 47.327219 ], [ -122.575985, 47.326420 ], [ -122.573739, 47.318419 ], [ -122.571239, 47.315619 ], [ -122.550134, 47.290496 ], [ -122.547521, 47.285344 ], [ -122.563935, 47.264797 ], [ -122.578211, 47.254804 ], [ -122.585826, 47.253852 ], [ -122.591060, 47.256231 ], [ -122.600102, 47.262418 ], [ -122.605337, 47.269080 ], [ -122.614379, 47.268129 ], [ -122.629132, 47.274315 ], [ -122.674342, 47.283833 ], [ -122.684335, 47.278122 ], [ -122.692426, 47.280026 ], [ -122.697378, 47.283969 ], [ -122.671256, 47.343774 ], [ -122.634823, 47.370583 ], [ -122.632463, 47.376394 ], [ -122.639126, 47.377822 ], [ -122.671486, 47.366876 ], [ -122.725738, 47.330470 ], [ -122.745250, 47.297158 ], [ -122.749621, 47.276408 ], [ -122.718124, 47.250045 ], [ -122.719075, 47.233388 ], [ -122.714908, 47.220928 ], [ -122.737159, 47.206263 ], [ -122.742394, 47.178661 ], [ -122.759050, 47.166288 ], [ -122.771619, 47.167109 ], [ -122.832799, 47.243412 ], [ -122.816633, 47.276457 ], [ -122.799025, 47.289306 ], [ -122.795694, 47.305962 ], [ -122.796646, 47.341654 ], [ -122.804615, 47.356835 ], [ -122.813778, 47.362593 ], [ -122.821868, 47.363069 ], [ -122.825237, 47.353398 ], [ -122.819738, 47.327964 ], [ -122.822344, 47.319763 ], [ -122.845860, 47.298405 ], [ -122.863732, 47.270221 ], [ -122.856171, 47.233788 ], [ -122.838298, 47.208353 ], [ -122.857546, 47.173983 ], [ -122.859940, 47.165574 ], [ -122.852046, 47.164359 ], [ -122.814238, 47.179482 ], [ -122.786742, 47.143049 ], [ -122.775056, 47.123114 ], [ -122.721437, 47.103179 ], [ -122.678130, 47.103866 ], [ -122.650634, 47.132738 ], [ -122.631987, 47.140589 ], [ -122.619614, 47.153914 ], [ -122.614855, 47.169143 ], [ -122.590829, 47.178107 ], [ -122.580517, 47.210416 ], [ -122.561957, 47.244099 ], [ -122.527586, 47.291531 ], [ -122.547747, 47.316403 ], [ -122.547408, 47.317734 ], [ -122.540238, 47.318520 ], [ -122.533338, 47.316620 ], [ -122.471652, 47.277321 ], [ -122.444200, 47.266723 ], [ -122.429605, 47.269707 ], [ -122.418074, 47.281765 ], [ -122.409199, 47.288556 ], [ -122.413735, 47.293921 ], [ -122.424235, 47.297521 ], [ -122.432335, 47.296021 ], [ -122.444635, 47.300421 ], [ -122.443008, 47.306333 ], [ -122.423535, 47.319121 ], [ -122.364168, 47.335953 ], [ -122.336934, 47.341421 ], [ -122.324833, 47.348521 ], [ -122.325734, 47.391521 ], [ -122.328434, 47.400621 ], [ -122.335234, 47.408421 ], [ -122.348035, 47.415921 ], [ -122.355135, 47.441921 ], [ -122.367036, 47.447621 ], [ -122.383136, 47.450521 ], [ -122.368036, 47.459221 ], [ -122.361336, 47.481421 ], [ -122.365236, 47.488420 ], [ -122.386637, 47.502220 ], [ -122.396538, 47.515220 ], [ -122.393938, 47.524820 ], [ -122.398338, 47.550120 ], [ -122.409839, 47.568920 ], [ -122.421139, 47.576020 ], [ -122.401839, 47.583920 ], [ -122.387139, 47.595720 ], [ -122.375421, 47.585181 ], [ -122.370167, 47.583087 ], [ -122.358238, 47.584820 ], [ -122.342937, 47.591220 ], [ -122.339513, 47.599113 ], [ -122.344937, 47.609120 ], [ -122.367819, 47.624213 ], [ -122.386039, 47.631720 ], [ -122.393739, 47.631020 ], [ -122.404240, 47.633920 ], [ -122.414645, 47.639766 ], [ -122.429841, 47.658919 ], [ -122.407841, 47.680119 ], [ -122.403841, 47.689419 ], [ -122.393248, 47.701602 ], [ -122.380440, 47.709119 ], [ -122.376440, 47.716519 ], [ -122.373140, 47.729219 ], [ -122.382641, 47.749119 ], [ -122.380241, 47.758519 ], [ -122.394442, 47.772219 ], [ -122.397043, 47.779719 ], [ -122.394944, 47.803318 ], [ -122.392044, 47.807718 ], [ -122.353244, 47.840618 ], [ -122.346544, 47.842418 ], [ -122.339944, 47.846718 ], [ -122.335950, 47.852306 ], [ -122.329545, 47.869418 ], [ -122.330145, 47.875318 ], [ -122.333543, 47.880246 ], [ -122.328546, 47.897917 ], [ -122.321847, 47.911817 ], [ -122.310747, 47.925117 ], [ -122.309747, 47.929117 ], [ -122.311148, 47.936717 ], [ -122.307048, 47.949117 ], [ -122.278047, 47.956517 ], [ -122.249007, 47.959507 ], [ -122.230046, 47.970917 ], [ -122.226346, 47.976417 ], [ -122.232391, 47.987713 ], [ -122.230220, 48.007154 ], [ -122.228767, 48.012468 ], [ -122.224979, 48.016626 ], [ -122.231761, 48.029876 ], [ -122.281087, 48.049793 ], [ -122.305838, 48.073415 ], [ -122.321709, 48.085507 ], [ -122.326119, 48.092877 ], [ -122.343241, 48.097631 ], [ -122.363842, 48.123930 ], [ -122.365078, 48.125822 ], [ -122.363797, 48.142759 ], [ -122.364744, 48.151304 ], [ -122.370253, 48.164809 ], [ -122.363479, 48.174438 ], [ -122.362044, 48.187568 ], [ -122.372492, 48.193022 ], [ -122.382102, 48.207106 ], [ -122.385703, 48.217811 ], [ -122.396121, 48.229233 ], [ -122.425572, 48.232887 ], [ -122.430578, 48.236237 ], [ -122.433767, 48.236550 ], [ -122.449605, 48.232598 ], [ -122.453710, 48.228859 ], [ -122.453618, 48.226830 ], [ -122.449513, 48.214736 ], [ -122.444508, 48.214522 ], [ -122.441731, 48.211776 ], [ -122.442051, 48.209350 ], [ -122.454930, 48.196639 ], [ -122.461888, 48.193137 ], [ -122.464801, 48.194767 ], [ -122.470250, 48.194007 ], [ -122.478535, 48.188087 ], [ -122.479008, 48.175703 ], [ -122.475803, 48.166792 ], [ -122.442383, 48.130841 ], [ -122.411649, 48.113210 ], [ -122.379481, 48.087384 ], [ -122.360345, 48.061527 ], [ -122.358375, 48.056133 ], [ -122.363107, 48.054546 ], [ -122.377114, 48.057568 ], [ -122.387690, 48.065189 ], [ -122.390787, 48.069477 ], [ -122.393413, 48.078472 ], [ -122.400692, 48.085255 ], [ -122.423703, 48.102941 ], [ -122.449660, 48.114041 ], [ -122.467500, 48.130353 ], [ -122.477983, 48.129048 ], [ -122.486736, 48.120950 ], [ -122.489986, 48.120617 ], [ -122.512031, 48.133931 ], [ -122.522576, 48.161712 ], [ -122.537220, 48.183745 ], [ -122.538916, 48.209683 ], [ -122.534431, 48.223005 ], [ -122.535209, 48.240213 ], [ -122.530996, 48.249821 ], [ -122.503786, 48.257045 ], [ -122.499648, 48.256611 ], [ -122.497727, 48.253389 ], [ -122.493448, 48.252043 ], [ -122.480925, 48.251706 ], [ -122.474494, 48.255227 ], [ -122.466803, 48.269604 ], [ -122.463962, 48.270541 ], [ -122.406516, 48.251830 ], [ -122.395328, 48.257187 ], [ -122.392058, 48.269628 ], [ -122.371693, 48.287839 ], [ -122.376818, 48.296099 ], [ -122.384310, 48.304123 ], [ -122.408718, 48.326413 ], [ -122.424102, 48.334346 ], [ -122.442678, 48.337934 ], [ -122.475529, 48.359912 ], [ -122.482423, 48.361737 ], [ -122.497686, 48.361837 ], [ -122.507437, 48.364666 ], [ -122.533452, 48.383409 ], [ -122.539449, 48.397190 ], [ -122.547492, 48.399889 ], [ -122.554536, 48.406040 ], [ -122.558403, 48.426758 ], [ -122.551221, 48.439465 ], [ -122.557298, 48.444438 ], [ -122.568348, 48.444990 ], [ -122.575254, 48.443333 ], [ -122.581607, 48.429244 ], [ -122.614480, 48.414880 ], [ -122.649839, 48.408526 ], [ -122.665338, 48.416453 ], [ -122.674158, 48.424726 ], [ -122.678928, 48.439466 ], [ -122.677072, 48.444059 ], [ -122.674188, 48.443327 ], [ -122.674085, 48.441979 ], [ -122.667249, 48.442503 ], [ -122.654844, 48.454087 ], [ -122.657753, 48.472940 ], [ -122.664623, 48.478128 ], [ -122.689121, 48.476849 ], [ -122.695725, 48.464785 ], [ -122.695587, 48.460558 ], [ -122.700603, 48.457632 ], [ -122.710362, 48.461584 ], [ -122.712322, 48.464143 ], [ -122.712981, 48.478790 ], [ -122.701644, 48.497622 ], [ -122.684521, 48.509123 ], [ -122.679122, 48.507797 ], [ -122.676922, 48.504484 ], [ -122.671386, 48.503980 ], [ -122.615183, 48.521427 ], [ -122.606961, 48.522152 ], [ -122.599951, 48.520946 ], [ -122.598469, 48.512169 ], [ -122.568071, 48.508210 ], [ -122.556834, 48.498812 ], [ -122.537355, 48.466749 ], [ -122.532845, 48.466057 ], [ -122.526943, 48.468004 ], [ -122.515056, 48.465554 ], [ -122.511348, 48.461825 ], [ -122.500721, 48.460887 ], [ -122.471832, 48.470724 ], [ -122.469634, 48.472187 ], [ -122.469670, 48.474975 ], [ -122.473763, 48.479750 ], [ -122.478851, 48.481736 ], [ -122.483501, 48.492430 ], [ -122.484996, 48.509620 ], [ -122.483872, 48.521891 ], [ -122.485288, 48.528106 ], [ -122.498463, 48.556206 ], [ -122.504428, 48.564775 ], [ -122.525370, 48.567344 ], [ -122.531978, 48.568644 ], [ -122.534719, 48.574246 ], [ -122.547438, 48.575074 ], [ -122.556480, 48.573171 ], [ -122.558860, 48.572219 ], [ -122.560287, 48.583165 ], [ -122.554577, 48.588399 ], [ -122.552673, 48.586972 ], [ -122.547438, 48.580785 ], [ -122.534787, 48.575960 ], [ -122.512372, 48.578067 ], [ -122.495904, 48.575927 ], [ -122.488421, 48.564665 ], [ -122.482406, 48.559653 ], [ -122.478431, 48.559303 ], [ -122.444560, 48.570115 ], [ -122.433059, 48.581609 ], [ -122.425271, 48.599522 ], [ -122.448702, 48.622624 ], [ -122.464250, 48.625717 ], [ -122.486878, 48.643122 ], [ -122.493990, 48.651596 ], [ -122.500308, 48.656163 ], [ -122.506718, 48.669692 ], [ -122.519172, 48.713095 ], [ -122.515511, 48.720992 ], [ -122.505684, 48.724524 ], [ -122.495301, 48.737328 ], [ -122.490401, 48.751128 ], [ -122.510902, 48.757728 ], [ -122.528203, 48.768428 ], [ -122.535803, 48.776128 ], [ -122.567498, 48.779185 ], [ -122.596844, 48.771492 ], [ -122.598033, 48.769489 ], [ -122.606787, 48.759143 ], [ -122.627808, 48.744660 ], [ -122.637146, 48.735708 ], [ -122.638082, 48.732486 ], [ -122.626287, 48.720930 ], [ -122.612562, 48.714932 ], [ -122.605733, 48.701066 ], [ -122.606105, 48.698556 ], [ -122.615169, 48.693839 ], [ -122.620338, 48.693651 ], [ -122.630422, 48.696625 ], [ -122.646323, 48.708001 ], [ -122.673472, 48.733082 ], [ -122.666953, 48.748445 ], [ -122.661111, 48.753962 ], [ -122.647443, 48.773998 ], [ -122.645743, 48.781538 ], [ -122.646777, 48.785011 ], [ -122.656528, 48.784969 ], [ -122.659708, 48.786523 ], [ -122.680246, 48.802750 ], [ -122.693683, 48.804475 ], [ -122.697219, 48.802810 ], [ -122.698675, 48.800522 ], [ -122.699507, 48.794906 ], [ -122.699303, 48.789063 ], [ -122.703106, 48.786321 ], [ -122.709815, 48.786205 ], [ -122.711200, 48.791460 ], [ -122.709169, 48.817829 ], [ -122.711805, 48.832408 ], [ -122.717073, 48.847190 ], [ -122.722685, 48.852855 ], [ -122.785659, 48.885066 ], [ -122.793175, 48.892927 ], [ -122.792584, 48.894732 ], [ -122.783747, 48.894639 ], [ -122.751289, 48.911239 ], [ -122.747514, 48.915582 ], [ -122.745371, 48.921227 ], [ -122.746596, 48.930731 ], [ -122.755624, 48.938660 ], [ -122.766096, 48.941955 ], [ -122.770432, 48.942528 ], [ -122.787539, 48.931702 ], [ -122.818232, 48.939062 ], [ -122.821631, 48.941369 ], [ -122.822464, 48.944911 ], [ -122.817226, 48.955970 ], [ -122.796887, 48.975026 ], [ -122.774276, 48.991038 ], [ -122.766307, 48.991672 ], [ -122.756318, 48.996881 ], [ -122.756037, 48.999512 ], [ -122.758020, 49.002357 ], [ -122.407829, 49.002193 ], [ -122.405989, 49.002239 ], [ -122.251063, 49.002494 ], [ -122.098357, 49.002146 ], [ -121.751252, 48.997399 ], [ -121.395543, 48.999851 ], [ -121.345295, 49.000843 ], [ -121.256933, 49.000088 ], [ -121.251244, 49.000167 ], [ -121.248949, 49.000925 ], [ -121.229900, 49.001158 ], [ -121.126240, 49.001412 ], [ -121.059966, 49.000621 ], [ -120.978955, 49.000367 ], [ -120.716604, 49.000188 ], [ -120.376216, 49.000705 ], [ -120.001199, 48.999418 ], [ -119.876195, 49.000448 ], [ -119.702016, 49.000269 ], [ -119.701218, 49.000258 ], [ -119.457700, 49.000261 ], [ -119.428678, 49.000253 ], [ -119.137274, 49.000297 ], [ -119.132102, 49.000262 ], [ -118.002046, 49.000437 ], [ -118.001106, 48.999911 ], [ -117.884398, 48.999912 ], [ -117.876100, 49.000546 ], [ -117.607323, 49.000843 ], [ -117.268192, 48.999928 ], [ -117.268247, 48.999818 ], [ -117.126075, 48.998888 ], [ -117.032351, 48.999188 ], [ -117.032107, 48.874926 ], [ -117.033335, 48.749921 ], [ -117.033671, 48.656902 ], [ -117.034358, 48.628523 ], [ -117.034499, 48.620769 ], [ -117.035425, 48.499914 ], [ -117.035285, 48.430113 ], [ -117.035285, 48.429816 ], [ -117.035254, 48.423144 ], [ -117.035289, 48.422732 ], [ -117.035178, 48.371221 ], [ -117.035178, 48.370878 ], [ -117.038602, 48.207939 ], [ -117.039599, 48.184387 ], [ -117.039615, 48.184015 ], [ -117.039582, 48.181124 ], [ -117.039582, 48.180853 ], [ -117.039583, 48.180313 ], [ -117.039618, 48.178142 ], [ -117.039413, 48.177250 ], [ -117.039552, 48.173960 ], [ -117.041107, 48.124904 ], [ -117.041401, 48.085500 ], [ -117.041676, 48.045560 ], [ -117.042360, 47.966343 ], [ -117.042470, 47.839009 ], [ -117.041999, 47.822399 ], [ -117.042064, 47.778630 ], [ -117.042485, 47.766525 ], [ -117.042521, 47.764896 ], [ -117.042623, 47.761223 ], [ -117.042657, 47.760857 ], [ -117.042059, 47.745100 ], [ -117.042135, 47.744100 ], [ -117.041634, 47.735300 ], [ -117.041678, 47.722710 ], [ -117.041633, 47.706400 ], [ -117.041532, 47.683194 ], [ -117.041431, 47.680000 ], [ -117.041431, 47.678185 ], [ -117.041431, 47.678140 ], [ -117.040850, 47.574124 ], [ -117.041174, 47.558530 ], [ -117.041276, 47.558210 ], [ -117.040745, 47.532909 ], [ -117.040545, 47.527562 ], [ -117.040514, 47.522351 ], [ -117.039945, 47.477823 ], [ -117.039971, 47.463309 ], [ -117.039948, 47.434885 ], [ -117.039950, 47.412412 ], [ -117.039882, 47.399085 ], [ -117.040176, 47.374900 ], [ -117.039843, 47.347201 ], [ -117.040019, 47.259272 ], [ -117.039899, 47.225515 ], [ -117.039888, 47.203282 ], [ -117.039871, 47.181858 ], [ -117.039836, 47.154734 ], [ -117.039657, 46.825798 ], [ -117.039828, 46.815443 ], [ -117.039398, 46.700186 ], [ -117.039771, 46.471779 ], [ -117.039763, 46.469570 ], [ -117.039741, 46.462704 ], [ -117.039813, 46.425425 ], [ -117.036562, 46.422596 ], [ -117.034696, 46.418318 ], [ -117.035545, 46.410012 ], [ -117.036455, 46.407792 ], [ -117.038282, 46.406040 ], [ -117.041737, 46.395195 ], [ -117.041950, 46.392160 ], [ -117.046915, 46.379577 ], [ -117.049474, 46.376820 ], [ -117.051775, 46.375641 ], [ -117.057516, 46.371396 ], [ -117.061045, 46.367747 ], [ -117.062785, 46.365287 ], [ -117.062748, 46.353624 ], [ -117.062630, 46.352522 ], [ -117.060703, 46.349015 ], [ -117.055983, 46.345531 ], [ -117.051735, 46.343833 ], [ -117.045469, 46.342490 ], [ -117.034450, 46.341320 ], [ -117.030672, 46.340315 ], [ -117.027744, 46.338751 ], [ -117.023844, 46.335976 ], [ -117.023149, 46.334759 ], [ -117.022706, 46.328990 ], [ -117.023424, 46.326427 ], [ -117.022939, 46.320175 ], [ -117.022293, 46.317470 ], [ -117.020663, 46.314793 ], [ -117.016413, 46.311236 ], [ -117.007486, 46.305302 ], [ -116.997260, 46.303151 ], [ -116.989794, 46.299395 ], [ -116.986688, 46.296662 ], [ -116.984630, 46.292705 ], [ -116.984910, 46.289738 ], [ -116.990894, 46.280372 ], [ -116.991422, 46.278467 ], [ -116.991134, 46.276342 ], [ -116.987391, 46.272865 ], [ -116.976054, 46.266010 ], [ -116.972591, 46.263271 ], [ -116.970298, 46.261233 ], [ -116.966742, 46.256923 ], [ -116.964379, 46.253282 ], [ -116.958801, 46.242320 ], [ -116.955264, 46.230880 ], [ -116.956031, 46.225976 ], [ -116.959428, 46.219812 ], [ -116.966130, 46.209453 ], [ -116.966569, 46.207501 ], [ -116.965841, 46.203417 ], [ -116.962966, 46.199680 ], [ -116.952416, 46.193514 ], [ -116.941724, 46.185034 ], [ -116.923958, 46.170920 ], [ -116.921870, 46.167808 ], [ -116.921258, 46.164795 ], [ -116.922648, 46.160744 ], [ -116.935473, 46.142448 ], [ -116.948336, 46.125885 ], [ -116.950276, 46.123464 ], [ -116.950980, 46.118853 ], [ -116.951265, 46.111161 ], [ -116.955263, 46.102237 ], [ -116.959548, 46.099058 ], [ -116.974058, 46.097707 ], [ -116.976957, 46.096670 ], [ -116.978823, 46.095731 ], [ -116.981747, 46.092881 ], [ -116.982498, 46.091347 ], [ -116.982479, 46.089389 ], [ -116.981962, 46.084915 ], [ -116.978938, 46.080007 ], [ -116.970009, 46.076769 ], [ -116.963190, 46.075905 ], [ -116.960416, 46.076346 ], [ -116.957372, 46.075449 ], [ -116.948564, 46.067933 ], [ -116.942656, 46.061000 ], [ -116.931706, 46.039651 ], [ -116.923005, 46.018293 ], [ -116.918680, 45.999875 ], [ -116.917180, 45.996575 ], [ -116.915989, 45.995413 ] ] ], [ [ [ -122.948013, 48.781059 ], [ -122.967949, 48.784153 ], [ -122.971039, 48.785530 ], [ -122.971039, 48.788624 ], [ -122.971039, 48.789654 ], [ -122.948700, 48.786217 ], [ -122.942856, 48.788624 ], [ -122.939072, 48.785873 ], [ -122.948013, 48.781059 ] ] ], [ [ [ -122.896797, 48.746002 ], [ -122.923607, 48.754597 ], [ -122.924980, 48.755970 ], [ -122.918449, 48.766968 ], [ -122.912605, 48.770405 ], [ -122.897141, 48.770061 ], [ -122.875145, 48.764217 ], [ -122.883049, 48.763531 ], [ -122.891296, 48.761127 ], [ -122.891640, 48.759064 ], [ -122.877892, 48.751160 ], [ -122.883392, 48.748066 ], [ -122.896797, 48.746002 ] ] ], [ [ [ -122.830803, 48.743252 ], [ -122.846619, 48.746002 ], [ -122.847305, 48.747723 ], [ -122.842834, 48.751160 ], [ -122.818436, 48.744629 ], [ -122.830803, 48.743252 ] ] ], [ [ [ -122.756889, 48.694714 ], [ -122.776825, 48.695400 ], [ -122.775452, 48.705025 ], [ -122.764450, 48.708462 ], [ -122.756889, 48.694714 ] ] ], [ [ [ -123.130585, 48.655720 ], [ -123.135742, 48.657093 ], [ -123.159111, 48.665344 ], [ -123.167015, 48.663624 ], [ -123.178017, 48.662251 ], [ -123.182823, 48.657436 ], [ -123.200356, 48.662594 ], [ -123.218918, 48.669811 ], [ -123.228539, 48.675308 ], [ -123.237823, 48.683903 ], [ -123.237473, 48.689056 ], [ -123.228539, 48.690090 ], [ -123.216850, 48.690777 ], [ -123.207230, 48.689404 ], [ -123.187981, 48.685276 ], [ -123.172516, 48.680809 ], [ -123.149139, 48.669125 ], [ -123.127487, 48.656750 ], [ -123.130585, 48.655720 ] ] ], [ [ [ -122.580017, 48.644760 ], [ -122.583824, 48.645237 ], [ -122.581924, 48.648094 ], [ -122.585251, 48.649521 ], [ -122.592865, 48.649998 ], [ -122.593346, 48.651424 ], [ -122.587158, 48.655231 ], [ -122.586678, 48.660465 ], [ -122.583824, 48.659988 ], [ -122.577637, 48.647617 ], [ -122.580017, 48.644760 ] ] ], [ [ [ -123.105148, 48.633377 ], [ -123.118553, 48.633377 ], [ -123.138145, 48.638535 ], [ -123.146736, 48.642658 ], [ -123.163925, 48.647812 ], [ -123.163582, 48.649189 ], [ -123.156708, 48.649189 ], [ -123.135048, 48.644375 ], [ -123.127831, 48.643688 ], [ -123.116493, 48.639565 ], [ -123.105148, 48.633377 ] ] ], [ [ [ -123.045097, 48.609428 ], [ -123.052231, 48.612759 ], [ -123.053665, 48.618469 ], [ -123.048424, 48.621799 ], [ -123.041763, 48.619419 ], [ -123.037956, 48.615612 ], [ -123.037956, 48.610855 ], [ -123.045097, 48.609428 ] ] ], [ [ [ -122.602760, 48.605293 ], [ -122.610847, 48.606720 ], [ -122.614655, 48.611004 ], [ -122.613228, 48.614334 ], [ -122.609901, 48.615765 ], [ -122.600861, 48.614334 ], [ -122.598000, 48.611481 ], [ -122.598480, 48.607674 ], [ -122.602760, 48.605293 ] ] ], [ [ [ -122.885674, 48.588013 ], [ -122.897568, 48.589439 ], [ -122.904228, 48.591820 ], [ -122.912323, 48.590393 ], [ -122.932312, 48.591820 ], [ -122.946587, 48.595150 ], [ -122.953728, 48.601337 ], [ -122.956100, 48.618469 ], [ -122.954201, 48.625130 ], [ -122.960861, 48.628941 ], [ -122.967522, 48.628464 ], [ -122.981804, 48.638931 ], [ -122.986084, 48.637028 ], [ -122.990372, 48.632748 ], [ -122.985130, 48.629890 ], [ -122.984657, 48.627037 ], [ -122.984657, 48.622753 ], [ -122.977516, 48.618469 ], [ -122.970856, 48.609428 ], [ -122.971329, 48.602287 ], [ -122.977043, 48.599434 ], [ -122.985611, 48.600384 ], [ -122.989418, 48.599911 ], [ -122.988464, 48.597530 ], [ -122.988464, 48.594200 ], [ -122.994652, 48.591820 ], [ -123.004646, 48.591820 ], [ -123.009407, 48.596104 ], [ -123.007973, 48.598957 ], [ -122.997032, 48.601814 ], [ -122.992744, 48.604668 ], [ -122.992744, 48.605621 ], [ -123.000359, 48.615139 ], [ -123.004166, 48.620850 ], [ -123.005600, 48.620850 ], [ -123.007973, 48.615139 ], [ -123.020828, 48.607998 ], [ -123.027489, 48.608952 ], [ -123.029869, 48.618469 ], [ -123.030342, 48.629890 ], [ -123.019394, 48.638931 ], [ -123.010834, 48.653210 ], [ -122.984657, 48.675575 ], [ -122.962769, 48.684620 ], [ -122.960388, 48.690331 ], [ -122.947540, 48.699848 ], [ -122.944206, 48.702702 ], [ -122.951820, 48.710316 ], [ -122.951820, 48.712219 ], [ -122.907562, 48.716503 ], [ -122.877579, 48.712696 ], [ -122.848549, 48.703178 ], [ -122.816666, 48.691280 ], [ -122.794777, 48.678909 ], [ -122.741951, 48.662251 ], [ -122.741478, 48.660347 ], [ -122.753372, 48.654636 ], [ -122.754799, 48.649403 ], [ -122.763840, 48.642738 ], [ -122.775742, 48.639408 ], [ -122.785255, 48.635601 ], [ -122.795250, 48.629414 ], [ -122.799057, 48.623703 ], [ -122.807152, 48.618946 ], [ -122.807152, 48.616089 ], [ -122.801918, 48.610378 ], [ -122.797630, 48.602764 ], [ -122.799057, 48.601337 ], [ -122.809532, 48.603718 ], [ -122.815712, 48.605621 ], [ -122.819519, 48.600861 ], [ -122.827141, 48.599911 ], [ -122.831421, 48.601814 ], [ -122.829514, 48.610855 ], [ -122.830467, 48.616089 ], [ -122.836182, 48.617516 ], [ -122.847603, 48.620373 ], [ -122.863304, 48.638931 ], [ -122.868538, 48.644169 ], [ -122.871391, 48.642738 ], [ -122.872345, 48.641788 ], [ -122.879486, 48.647976 ], [ -122.883293, 48.660347 ], [ -122.883766, 48.682240 ], [ -122.890434, 48.691757 ], [ -122.894714, 48.694611 ], [ -122.898521, 48.690804 ], [ -122.898994, 48.689377 ], [ -122.907562, 48.691280 ], [ -122.916603, 48.689377 ], [ -122.918030, 48.686047 ], [ -122.916130, 48.683189 ], [ -122.908989, 48.672722 ], [ -122.908035, 48.670818 ], [ -122.910896, 48.663677 ], [ -122.910416, 48.659397 ], [ -122.905182, 48.651783 ], [ -122.881386, 48.637981 ], [ -122.874252, 48.622753 ], [ -122.868065, 48.616089 ], [ -122.864731, 48.616089 ], [ -122.861877, 48.612282 ], [ -122.862350, 48.604191 ], [ -122.871391, 48.594673 ], [ -122.885674, 48.588013 ] ] ], [ [ [ -122.872704, 48.418011 ], [ -122.895309, 48.420982 ], [ -122.893524, 48.423363 ], [ -122.879845, 48.428719 ], [ -122.881035, 48.430500 ], [ -122.889366, 48.435856 ], [ -122.888771, 48.437046 ], [ -122.876869, 48.438831 ], [ -122.873299, 48.435261 ], [ -122.870926, 48.435261 ], [ -122.866165, 48.438831 ], [ -122.866165, 48.441208 ], [ -122.878654, 48.444778 ], [ -122.890556, 48.445374 ], [ -122.897095, 48.445969 ], [ -122.904236, 48.438831 ], [ -122.926247, 48.437046 ], [ -122.930412, 48.441803 ], [ -122.922081, 48.445374 ], [ -122.918510, 48.450726 ], [ -122.918510, 48.454891 ], [ -122.922081, 48.457272 ], [ -122.928627, 48.457867 ], [ -122.934570, 48.454891 ], [ -122.941711, 48.457867 ], [ -122.945282, 48.465599 ], [ -122.945877, 48.481659 ], [ -122.939926, 48.503075 ], [ -122.930412, 48.519138 ], [ -122.920296, 48.522705 ], [ -122.919106, 48.523895 ], [ -122.919106, 48.529842 ], [ -122.922676, 48.538769 ], [ -122.920296, 48.550663 ], [ -122.907806, 48.550663 ], [ -122.898285, 48.555424 ], [ -122.889961, 48.572079 ], [ -122.885796, 48.573269 ], [ -122.881035, 48.570889 ], [ -122.881035, 48.556614 ], [ -122.879845, 48.555424 ], [ -122.874489, 48.555424 ], [ -122.873299, 48.563751 ], [ -122.869141, 48.564346 ], [ -122.864975, 48.561371 ], [ -122.864380, 48.552448 ], [ -122.871513, 48.549473 ], [ -122.873299, 48.545906 ], [ -122.869141, 48.542931 ], [ -122.859024, 48.544121 ], [ -122.843559, 48.543526 ], [ -122.841774, 48.539955 ], [ -122.842964, 48.532818 ], [ -122.845940, 48.532223 ], [ -122.851883, 48.534603 ], [ -122.857239, 48.533413 ], [ -122.861404, 48.525085 ], [ -122.865570, 48.510807 ], [ -122.871513, 48.504860 ], [ -122.870926, 48.502480 ], [ -122.866165, 48.497128 ], [ -122.850700, 48.481659 ], [ -122.851883, 48.475117 ], [ -122.856644, 48.463814 ], [ -122.857239, 48.460838 ], [ -122.854858, 48.459648 ], [ -122.844154, 48.462029 ], [ -122.842964, 48.460243 ], [ -122.849510, 48.450726 ], [ -122.848915, 48.448349 ], [ -122.844154, 48.447754 ], [ -122.828690, 48.460243 ], [ -122.834038, 48.469761 ], [ -122.835823, 48.485825 ], [ -122.840584, 48.503075 ], [ -122.837013, 48.516758 ], [ -122.828690, 48.523300 ], [ -122.787643, 48.525681 ], [ -122.774551, 48.517948 ], [ -122.769203, 48.509617 ], [ -122.769798, 48.507835 ], [ -122.784073, 48.509026 ], [ -122.785858, 48.508430 ], [ -122.792397, 48.500099 ], [ -122.803108, 48.491177 ], [ -122.816193, 48.482254 ], [ -122.816788, 48.478092 ], [ -122.815002, 48.475712 ], [ -122.813217, 48.473927 ], [ -122.813217, 48.469170 ], [ -122.819168, 48.460243 ], [ -122.815598, 48.454891 ], [ -122.804893, 48.452511 ], [ -122.800133, 48.447159 ], [ -122.800728, 48.444183 ], [ -122.808464, 48.436451 ], [ -122.808464, 48.434666 ], [ -122.803108, 48.431095 ], [ -122.801918, 48.425148 ], [ -122.806084, 48.425148 ], [ -122.812622, 48.420982 ], [ -122.825714, 48.423363 ], [ -122.832253, 48.426933 ], [ -122.843559, 48.426338 ], [ -122.853668, 48.426933 ], [ -122.854858, 48.425743 ], [ -122.853668, 48.419792 ], [ -122.872704, 48.418011 ] ] ], [ [ [ -122.950996, 48.117981 ], [ -122.929100, 48.133686 ], [ -122.914825, 48.128925 ], [ -122.908638, 48.127975 ], [ -122.908638, 48.125595 ], [ -122.918159, 48.126545 ], [ -122.942429, 48.119884 ], [ -122.950996, 48.117981 ] ] ], [ [ [ -122.485474, 47.528774 ], [ -122.496773, 47.531750 ], [ -122.506294, 47.544243 ], [ -122.491425, 47.545433 ], [ -122.479523, 47.541862 ], [ -122.485474, 47.528774 ] ] ], [ [ [ -122.493126, 47.330254 ], [ -122.504913, 47.330681 ], [ -122.518852, 47.333321 ], [ -122.523376, 47.337627 ], [ -122.528130, 47.345543 ], [ -122.526031, 47.358906 ], [ -122.517799, 47.368679 ], [ -122.526733, 47.398582 ], [ -122.514702, 47.414047 ], [ -122.513329, 47.449104 ], [ -122.497864, 47.475914 ], [ -122.482742, 47.483131 ], [ -122.474686, 47.511066 ], [ -122.468559, 47.510078 ], [ -122.452400, 47.503471 ], [ -122.460442, 47.493763 ], [ -122.460030, 47.486858 ], [ -122.433388, 47.466431 ], [ -122.439415, 47.458633 ], [ -122.439934, 47.417007 ], [ -122.437653, 47.407425 ], [ -122.427330, 47.402130 ], [ -122.395050, 47.399277 ], [ -122.373627, 47.388718 ], [ -122.378479, 47.385330 ], [ -122.401764, 47.381325 ], [ -122.433334, 47.367558 ], [ -122.437813, 47.365604 ], [ -122.448395, 47.354988 ], [ -122.453995, 47.343338 ], [ -122.457497, 47.342567 ], [ -122.469704, 47.344624 ], [ -122.491234, 47.335171 ], [ -122.491066, 47.332428 ], [ -122.493126, 47.330254 ] ] ], [ [ [ -122.838051, 47.255280 ], [ -122.841858, 47.257660 ], [ -122.841377, 47.264320 ], [ -122.840431, 47.268604 ], [ -122.832336, 47.272888 ], [ -122.826630, 47.271935 ], [ -122.826149, 47.269558 ], [ -122.830437, 47.261944 ], [ -122.833290, 47.255756 ], [ -122.838051, 47.255280 ] ] ], [ [ [ -122.608490, 47.216911 ], [ -122.611465, 47.218102 ], [ -122.618607, 47.225239 ], [ -122.629906, 47.237137 ], [ -122.657272, 47.262714 ], [ -122.668571, 47.270447 ], [ -122.668571, 47.275208 ], [ -122.666786, 47.276993 ], [ -122.663811, 47.277588 ], [ -122.649536, 47.275208 ], [ -122.634666, 47.268665 ], [ -122.628120, 47.267475 ], [ -122.621574, 47.258553 ], [ -122.607300, 47.249630 ], [ -122.588860, 47.237137 ], [ -122.588264, 47.234756 ], [ -122.589455, 47.227619 ], [ -122.602539, 47.217506 ], [ -122.608490, 47.216911 ] ] ], [ [ [ -122.679276, 47.190144 ], [ -122.692963, 47.192520 ], [ -122.701881, 47.197876 ], [ -122.716164, 47.197876 ], [ -122.726868, 47.204418 ], [ -122.726868, 47.207394 ], [ -122.719727, 47.210960 ], [ -122.713783, 47.218102 ], [ -122.706047, 47.228809 ], [ -122.702477, 47.231186 ], [ -122.691772, 47.231186 ], [ -122.685226, 47.232376 ], [ -122.679871, 47.231186 ], [ -122.673927, 47.226429 ], [ -122.667381, 47.224049 ], [ -122.659645, 47.219292 ], [ -122.648941, 47.214531 ], [ -122.644180, 47.209179 ], [ -122.641800, 47.205013 ], [ -122.642395, 47.200848 ], [ -122.647751, 47.197281 ], [ -122.679276, 47.190144 ] ] ], [ [ [ -122.639122, 47.146301 ], [ -122.639603, 47.147251 ], [ -122.638649, 47.155342 ], [ -122.634369, 47.163910 ], [ -122.631989, 47.167240 ], [ -122.628654, 47.165337 ], [ -122.628181, 47.161053 ], [ -122.629608, 47.154388 ], [ -122.635315, 47.148205 ], [ -122.639122, 47.146301 ] ] ], [ [ [ -122.701286, 47.124706 ], [ -122.711998, 47.127682 ], [ -122.731033, 47.140766 ], [ -122.742928, 47.151474 ], [ -122.741737, 47.155045 ], [ -122.737579, 47.156830 ], [ -122.732819, 47.159805 ], [ -122.729843, 47.166943 ], [ -122.723892, 47.176460 ], [ -122.710808, 47.185383 ], [ -122.705452, 47.187168 ], [ -122.694153, 47.184788 ], [ -122.681656, 47.181217 ], [ -122.673927, 47.174675 ], [ -122.672737, 47.166348 ], [ -122.672737, 47.149693 ], [ -122.675713, 47.141361 ], [ -122.685822, 47.139580 ], [ -122.691772, 47.141956 ], [ -122.695343, 47.140175 ], [ -122.695938, 47.135414 ], [ -122.692963, 47.130653 ], [ -122.694748, 47.125896 ], [ -122.701286, 47.124706 ] ] ], [ [ [ -122.821754, 48.587814 ], [ -122.821754, 48.590908 ], [ -122.814537, 48.601219 ], [ -122.804573, 48.597782 ], [ -122.803886, 48.596405 ], [ -122.804230, 48.594345 ], [ -122.821754, 48.587814 ] ] ], [ [ [ -122.949440, 48.545658 ], [ -122.965622, 48.548988 ], [ -122.977997, 48.551846 ], [ -122.987038, 48.557079 ], [ -122.987991, 48.561836 ], [ -122.982758, 48.562790 ], [ -122.984657, 48.566120 ], [ -122.998932, 48.578495 ], [ -123.014160, 48.578972 ], [ -123.016541, 48.581348 ], [ -123.013687, 48.586109 ], [ -123.013214, 48.587536 ], [ -122.999886, 48.587059 ], [ -122.987511, 48.590866 ], [ -122.979897, 48.593246 ], [ -122.966576, 48.594673 ], [ -122.960861, 48.589916 ], [ -122.940872, 48.586109 ], [ -122.939445, 48.581825 ], [ -122.937546, 48.576591 ], [ -122.933739, 48.575638 ], [ -122.931358, 48.577068 ], [ -122.933258, 48.580875 ], [ -122.928505, 48.585155 ], [ -122.918983, 48.587059 ], [ -122.902802, 48.580399 ], [ -122.902802, 48.576591 ], [ -122.919456, 48.562313 ], [ -122.923264, 48.556602 ], [ -122.926125, 48.554699 ], [ -122.927551, 48.554699 ], [ -122.929451, 48.561363 ], [ -122.934212, 48.562313 ], [ -122.937065, 48.559460 ], [ -122.939926, 48.551846 ], [ -122.949440, 48.545658 ] ] ], [ [ [ -122.807686, 48.531322 ], [ -122.816605, 48.537865 ], [ -122.827316, 48.554520 ], [ -122.830292, 48.574745 ], [ -122.824341, 48.583668 ], [ -122.810066, 48.587833 ], [ -122.791031, 48.580101 ], [ -122.774971, 48.567608 ], [ -122.769020, 48.559280 ], [ -122.770210, 48.552143 ], [ -122.807686, 48.531322 ] ] ], [ [ [ -122.547516, 48.519272 ], [ -122.552795, 48.523026 ], [ -122.552917, 48.527485 ], [ -122.548744, 48.528912 ], [ -122.543510, 48.526058 ], [ -122.542709, 48.522087 ], [ -122.547516, 48.519272 ] ] ], [ [ [ -122.964912, 48.449539 ], [ -123.021423, 48.456081 ], [ -123.036888, 48.457867 ], [ -123.065445, 48.472736 ], [ -123.067230, 48.476902 ], [ -123.068420, 48.479874 ], [ -123.074959, 48.480469 ], [ -123.092209, 48.479874 ], [ -123.118385, 48.490582 ], [ -123.142776, 48.505455 ], [ -123.163597, 48.529251 ], [ -123.171921, 48.551853 ], [ -123.176086, 48.568512 ], [ -123.174301, 48.575054 ], [ -123.174301, 48.578030 ], [ -123.182632, 48.581596 ], [ -123.201668, 48.585167 ], [ -123.204048, 48.594685 ], [ -123.195717, 48.607773 ], [ -123.179657, 48.622047 ], [ -123.145752, 48.625023 ], [ -123.105301, 48.622643 ], [ -123.100540, 48.619076 ], [ -123.096970, 48.611935 ], [ -123.098755, 48.601227 ], [ -123.098755, 48.598850 ], [ -123.096970, 48.598255 ], [ -123.076149, 48.591709 ], [ -123.051758, 48.575649 ], [ -123.035698, 48.563751 ], [ -123.022018, 48.562561 ], [ -123.011307, 48.559586 ], [ -123.004768, 48.551258 ], [ -123.005363, 48.547096 ], [ -123.001198, 48.539360 ], [ -122.992271, 48.536388 ], [ -122.982162, 48.536388 ], [ -122.969673, 48.534603 ], [ -122.968483, 48.532818 ], [ -122.968483, 48.527466 ], [ -122.972046, 48.520325 ], [ -122.982162, 48.513783 ], [ -123.000603, 48.515568 ], [ -123.004768, 48.518543 ], [ -123.015472, 48.515568 ], [ -123.017258, 48.513187 ], [ -123.017258, 48.506050 ], [ -123.017258, 48.495342 ], [ -123.008934, 48.484039 ], [ -123.007149, 48.470951 ], [ -123.006554, 48.469170 ], [ -122.986923, 48.462624 ], [ -122.979187, 48.462624 ], [ -122.971451, 48.463814 ], [ -122.970856, 48.467979 ], [ -122.969078, 48.468575 ], [ -122.960152, 48.463814 ], [ -122.958961, 48.462029 ], [ -122.962532, 48.450130 ], [ -122.964912, 48.449539 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US55", "STATE": "55", "NAME": "Wisconsin", "LSAD": "", "CENSUSAREA": 54157.805000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -90.455251, 47.024000 ], [ -90.457128, 47.044058 ], [ -90.455024, 47.053470 ], [ -90.449075, 47.066013 ], [ -90.437271, 47.073483 ], [ -90.417272, 47.077570 ], [ -90.395367, 47.077175 ], [ -90.393830, 47.075941 ], [ -90.393035, 47.067877 ], [ -90.394312, 47.060909 ], [ -90.400409, 47.046588 ], [ -90.403499, 47.025366 ], [ -90.413428, 47.013170 ], [ -90.429397, 47.005610 ], [ -90.464079, 46.994636 ], [ -90.465465, 47.002593 ], [ -90.457453, 47.012783 ], [ -90.455251, 47.024000 ] ] ], [ [ [ -90.553280, 46.916674 ], [ -90.557319, 46.918693 ], [ -90.569169, 46.920309 ], [ -90.637124, 46.906724 ], [ -90.644144, 46.908379 ], [ -90.654805, 46.919259 ], [ -90.651834, 46.925267 ], [ -90.634507, 46.942944 ], [ -90.601153, 46.952457 ], [ -90.528804, 46.968497 ], [ -90.523298, 46.967604 ], [ -90.511623, 46.961407 ], [ -90.508157, 46.956836 ], [ -90.524056, 46.935664 ], [ -90.535368, 46.931486 ], [ -90.539947, 46.927850 ], [ -90.543583, 46.923002 ], [ -90.543852, 46.918289 ], [ -90.537461, 46.911960 ], [ -90.544515, 46.908593 ], [ -90.552318, 46.908219 ], [ -90.549104, 46.915461 ], [ -90.553280, 46.916674 ] ] ], [ [ [ -90.783086, 46.772939 ], [ -90.790965, 46.781373 ], [ -90.791562, 46.784983 ], [ -90.790231, 46.786103 ], [ -90.758586, 46.796214 ], [ -90.733001, 46.800219 ], [ -90.728546, 46.804356 ], [ -90.727818, 46.810434 ], [ -90.720932, 46.815897 ], [ -90.712381, 46.820743 ], [ -90.675364, 46.833929 ], [ -90.656946, 46.843476 ], [ -90.643218, 46.853844 ], [ -90.634048, 46.864396 ], [ -90.622048, 46.872872 ], [ -90.616452, 46.874466 ], [ -90.602552, 46.872706 ], [ -90.587392, 46.858056 ], [ -90.570006, 46.849696 ], [ -90.568874, 46.847252 ], [ -90.578263, 46.841653 ], [ -90.584489, 46.839825 ], [ -90.613822, 46.837942 ], [ -90.676133, 46.818986 ], [ -90.683356, 46.813275 ], [ -90.685753, 46.805003 ], [ -90.670049, 46.799496 ], [ -90.655310, 46.799173 ], [ -90.652916, 46.797755 ], [ -90.652219, 46.794511 ], [ -90.657179, 46.788800 ], [ -90.696465, 46.782040 ], [ -90.716456, 46.785418 ], [ -90.723938, 46.781737 ], [ -90.739425, 46.768021 ], [ -90.763647, 46.754927 ], [ -90.771228, 46.753034 ], [ -90.788515, 46.753313 ], [ -90.783086, 46.772939 ] ] ], [ [ [ -86.947510, 45.366434 ], [ -86.955204, 45.383721 ], [ -86.943041, 45.415250 ], [ -86.937393, 45.420966 ], [ -86.934276, 45.421149 ], [ -86.930511, 45.417536 ], [ -86.928045, 45.411273 ], [ -86.917686, 45.407890 ], [ -86.892893, 45.408980 ], [ -86.877502, 45.413981 ], [ -86.861472, 45.412067 ], [ -86.853145, 45.405547 ], [ -86.830353, 45.410852 ], [ -86.829143, 45.416490 ], [ -86.830900, 45.426023 ], [ -86.828661, 45.428539 ], [ -86.817069, 45.426963 ], [ -86.810055, 45.422619 ], [ -86.805868, 45.412903 ], [ -86.805415, 45.407324 ], [ -86.808303, 45.406067 ], [ -86.818073, 45.408147 ], [ -86.824383, 45.406135 ], [ -86.841432, 45.389601 ], [ -86.853103, 45.370861 ], [ -86.863563, 45.364888 ], [ -86.867743, 45.353065 ], [ -86.865499, 45.340981 ], [ -86.869041, 45.333223 ], [ -86.875117, 45.330870 ], [ -86.887802, 45.332259 ], [ -86.895055, 45.329035 ], [ -86.899488, 45.322588 ], [ -86.896667, 45.307275 ], [ -86.896928, 45.298300 ], [ -86.899891, 45.295185 ], [ -86.904898, 45.296839 ], [ -86.913995, 45.312110 ], [ -86.925681, 45.324200 ], [ -86.937368, 45.333065 ], [ -86.948087, 45.335296 ], [ -86.956129, 45.342267 ], [ -86.956198, 45.352006 ], [ -86.953389, 45.354715 ], [ -86.948272, 45.355682 ], [ -86.946297, 45.358690 ], [ -86.947510, 45.366434 ] ] ], [ [ [ -87.500105, 45.058167 ], [ -87.501572, 45.058602 ], [ -87.504281, 45.059198 ], [ -87.506055, 45.059428 ], [ -87.506184, 45.059565 ], [ -87.506054, 45.059702 ], [ -87.504280, 45.060067 ], [ -87.503602, 45.060272 ], [ -87.502440, 45.060706 ], [ -87.500603, 45.061094 ], [ -87.500105, 45.061117 ], [ -87.498964, 45.061231 ], [ -87.497254, 45.061278 ], [ -87.496415, 45.061072 ], [ -87.495479, 45.060661 ], [ -87.494543, 45.060044 ], [ -87.493381, 45.059107 ], [ -87.492864, 45.058376 ], [ -87.492702, 45.057805 ], [ -87.492573, 45.057736 ], [ -87.492540, 45.057462 ], [ -87.492411, 45.057233 ], [ -87.492314, 45.056936 ], [ -87.492023, 45.056502 ], [ -87.491765, 45.056273 ], [ -87.491636, 45.056227 ], [ -87.491507, 45.056090 ], [ -87.491345, 45.056022 ], [ -87.490216, 45.055222 ], [ -87.490151, 45.055039 ], [ -87.490312, 45.054948 ], [ -87.490925, 45.055039 ], [ -87.492668, 45.055792 ], [ -87.494475, 45.056523 ], [ -87.498379, 45.057733 ], [ -87.498670, 45.057779 ], [ -87.498863, 45.057847 ], [ -87.500105, 45.058167 ] ] ], [ [ [ -90.640927, 42.508302 ], [ -90.636927, 42.513202 ], [ -90.636727, 42.518702 ], [ -90.640627, 42.527701 ], [ -90.643927, 42.540401 ], [ -90.645627, 42.544100 ], [ -90.654127, 42.549900 ], [ -90.659127, 42.557900 ], [ -90.661527, 42.567999 ], [ -90.672727, 42.576599 ], [ -90.677055, 42.579215 ], [ -90.679375, 42.581503 ], [ -90.685487, 42.589614 ], [ -90.686975, 42.591774 ], [ -90.687775, 42.594606 ], [ -90.687999, 42.599198 ], [ -90.692031, 42.610366 ], [ -90.693999, 42.614509 ], [ -90.700095, 42.622461 ], [ -90.700856, 42.626445 ], [ -90.702671, 42.630756 ], [ -90.706303, 42.634169 ], [ -90.709204, 42.636078 ], [ -90.720209, 42.640758 ], [ -90.731132, 42.643437 ], [ -90.743677, 42.645560 ], [ -90.760389, 42.649131 ], [ -90.769495, 42.651443 ], [ -90.778752, 42.652965 ], [ -90.788226, 42.653888 ], [ -90.797017, 42.655772 ], [ -90.832702, 42.661662 ], [ -90.843910, 42.663071 ], [ -90.852497, 42.664822 ], [ -90.867125, 42.668728 ], [ -90.887430, 42.672470 ], [ -90.900261, 42.676254 ], [ -90.913400, 42.682949 ], [ -90.921155, 42.685406 ], [ -90.923634, 42.685500 ], [ -90.929881, 42.684128 ], [ -90.937045, 42.683399 ], [ -90.941567, 42.683844 ], [ -90.949213, 42.685573 ], [ -90.952415, 42.686778 ], [ -90.965048, 42.693233 ], [ -90.974237, 42.695249 ], [ -90.977735, 42.696816 ], [ -90.980578, 42.698932 ], [ -90.988776, 42.708724 ], [ -90.995536, 42.713704 ], [ -91.000128, 42.716189 ], [ -91.009577, 42.720123 ], [ -91.015687, 42.719229 ], [ -91.017239, 42.719566 ], [ -91.026786, 42.724228 ], [ -91.029692, 42.726774 ], [ -91.030718, 42.729684 ], [ -91.030984, 42.732550 ], [ -91.032013, 42.734484 ], [ -91.035418, 42.737340 ], [ -91.039383, 42.738478 ], [ -91.044139, 42.738605 ], [ -91.046571, 42.737167 ], [ -91.049972, 42.736905 ], [ -91.051275, 42.737001 ], [ -91.053733, 42.738238 ], [ -91.054801, 42.740529 ], [ -91.054810, 42.744686 ], [ -91.056297, 42.747341 ], [ -91.058091, 42.749246 ], [ -91.060172, 42.750481 ], [ -91.064680, 42.750914 ], [ -91.065783, 42.753387 ], [ -91.065492, 42.757081 ], [ -91.063120, 42.757273 ], [ -91.061432, 42.757974 ], [ -91.060129, 42.759986 ], [ -91.060261, 42.761847 ], [ -91.063254, 42.763947 ], [ -91.069549, 42.769628 ], [ -91.070716, 42.775502 ], [ -91.071138, 42.783004 ], [ -91.072447, 42.787732 ], [ -91.075481, 42.795466 ], [ -91.078097, 42.806526 ], [ -91.079314, 42.820309 ], [ -91.078665, 42.827678 ], [ -91.082770, 42.829977 ], [ -91.090136, 42.829237 ], [ -91.094060, 42.830813 ], [ -91.095114, 42.834966 ], [ -91.091402, 42.849860 ], [ -91.091837, 42.851225 ], [ -91.095329, 42.855320 ], [ -91.097656, 42.859871 ], [ -91.098820, 42.864421 ], [ -91.098238, 42.875798 ], [ -91.100565, 42.883078 ], [ -91.104051, 42.885971 ], [ -91.112158, 42.891149 ], [ -91.115512, 42.894672 ], [ -91.117411, 42.895837 ], [ -91.138000, 42.903772 ], [ -91.143375, 42.904670 ], [ -91.144706, 42.905964 ], [ -91.145560, 42.907980 ], [ -91.146177, 42.909850 ], [ -91.146182, 42.912338 ], [ -91.145868, 42.914967 ], [ -91.143878, 42.920646 ], [ -91.143800, 42.922877 ], [ -91.144315, 42.926592 ], [ -91.145517, 42.930378 ], [ -91.149784, 42.940244 ], [ -91.149880, 42.941955 ], [ -91.149090, 42.946554 ], [ -91.145540, 42.956510 ], [ -91.145430, 42.958211 ], [ -91.146550, 42.963345 ], [ -91.148001, 42.966155 ], [ -91.150906, 42.970514 ], [ -91.155519, 42.975774 ], [ -91.156562, 42.978226 ], [ -91.156743, 42.987830 ], [ -91.157490, 42.991475 ], [ -91.168283, 43.019426 ], [ -91.174692, 43.038713 ], [ -91.178087, 43.062044 ], [ -91.177894, 43.064206 ], [ -91.179457, 43.067427 ], [ -91.178761, 43.070578 ], [ -91.177264, 43.072983 ], [ -91.177222, 43.080247 ], [ -91.175193, 43.103771 ], [ -91.177728, 43.118733 ], [ -91.178251, 43.124982 ], [ -91.177932, 43.128875 ], [ -91.177003, 43.131846 ], [ -91.175253, 43.134665 ], [ -91.170372, 43.137384 ], [ -91.160449, 43.140575 ], [ -91.156200, 43.142945 ], [ -91.146200, 43.152405 ], [ -91.143283, 43.156413 ], [ -91.141356, 43.163537 ], [ -91.138649, 43.169993 ], [ -91.135917, 43.173422 ], [ -91.134173, 43.174405 ], [ -91.124428, 43.187886 ], [ -91.123896, 43.193536 ], [ -91.122170, 43.197255 ], [ -91.119115, 43.200366 ], [ -91.113749, 43.202908 ], [ -91.107931, 43.206578 ], [ -91.087456, 43.221891 ], [ -91.079278, 43.228259 ], [ -91.071857, 43.235164 ], [ -91.066398, 43.239293 ], [ -91.062562, 43.243165 ], [ -91.059684, 43.248566 ], [ -91.057910, 43.253968 ], [ -91.057918, 43.255366 ], [ -91.058644, 43.257679 ], [ -91.059750, 43.259074 ], [ -91.061798, 43.259952 ], [ -91.069937, 43.260272 ], [ -91.071698, 43.261014 ], [ -91.072649, 43.262129 ], [ -91.072782, 43.264363 ], [ -91.071574, 43.268193 ], [ -91.071724, 43.271392 ], [ -91.073710, 43.274746 ], [ -91.079875, 43.282773 ], [ -91.085652, 43.291870 ], [ -91.107237, 43.313645 ], [ -91.117661, 43.319332 ], [ -91.129121, 43.326350 ], [ -91.132813, 43.328030 ], [ -91.137343, 43.329757 ], [ -91.154806, 43.334826 ], [ -91.171055, 43.340967 ], [ -91.181115, 43.345926 ], [ -91.188014, 43.347602 ], [ -91.201847, 43.349103 ], [ -91.203964, 43.349852 ], [ -91.206620, 43.352524 ], [ -91.214770, 43.365874 ], [ -91.214990, 43.368006 ], [ -91.213360, 43.370097 ], [ -91.207367, 43.373659 ], [ -91.206072, 43.374976 ], [ -91.204831, 43.378887 ], [ -91.200701, 43.385930 ], [ -91.198953, 43.389835 ], [ -91.197670, 43.395334 ], [ -91.198048, 43.399223 ], [ -91.199408, 43.403032 ], [ -91.200527, 43.408486 ], [ -91.200359, 43.412701 ], [ -91.201224, 43.415903 ], [ -91.203144, 43.419805 ], [ -91.207145, 43.425031 ], [ -91.228750, 43.445537 ], [ -91.232276, 43.450952 ], [ -91.233367, 43.455168 ], [ -91.233187, 43.457784 ], [ -91.232241, 43.460018 ], [ -91.229503, 43.462607 ], [ -91.224586, 43.465525 ], [ -91.220399, 43.471306 ], [ -91.216035, 43.481142 ], [ -91.215282, 43.484798 ], [ -91.217615, 43.491008 ], [ -91.218270, 43.497228 ], [ -91.217706, 43.500550 ], [ -91.217876, 43.508104 ], [ -91.217353, 43.512474 ], [ -91.218292, 43.514434 ], [ -91.222613, 43.517892 ], [ -91.230027, 43.521595 ], [ -91.232941, 43.523967 ], [ -91.236725, 43.532930 ], [ -91.243183, 43.540309 ], [ -91.244093, 43.545620 ], [ -91.243820, 43.549130 ], [ -91.243214, 43.550722 ], [ -91.240649, 43.554995 ], [ -91.234432, 43.561781 ], [ -91.232812, 43.564842 ], [ -91.231490, 43.575595 ], [ -91.231865, 43.581822 ], [ -91.232707, 43.583533 ], [ -91.234499, 43.585529 ], [ -91.239109, 43.589760 ], [ -91.252926, 43.600363 ], [ -91.258267, 43.603484 ], [ -91.261631, 43.606175 ], [ -91.265091, 43.609977 ], [ -91.268748, 43.615348 ], [ -91.268457, 43.627352 ], [ -91.263178, 43.638203 ], [ -91.262397, 43.641760 ], [ -91.263856, 43.647662 ], [ -91.265051, 43.649141 ], [ -91.270767, 43.653080 ], [ -91.271749, 43.654929 ], [ -91.273252, 43.666623 ], [ -91.272741, 43.676609 ], [ -91.267792, 43.695652 ], [ -91.268455, 43.709824 ], [ -91.266538, 43.713947 ], [ -91.261316, 43.719490 ], [ -91.258756, 43.723426 ], [ -91.255932, 43.729849 ], [ -91.254903, 43.733533 ], [ -91.255431, 43.744876 ], [ -91.243955, 43.773046 ], [ -91.244135, 43.774667 ], [ -91.262436, 43.792166 ], [ -91.264436, 43.800366 ], [ -91.267436, 43.804166 ], [ -91.272037, 43.813766 ], [ -91.273037, 43.818566 ], [ -91.275737, 43.824866 ], [ -91.277695, 43.837741 ], [ -91.281968, 43.842738 ], [ -91.284138, 43.847065 ], [ -91.291002, 43.852733 ], [ -91.296739, 43.855165 ], [ -91.298815, 43.856555 ], [ -91.301302, 43.859515 ], [ -91.310991, 43.867381 ], [ -91.313037, 43.875757 ], [ -91.315310, 43.881808 ], [ -91.320605, 43.888491 ], [ -91.328143, 43.893435 ], [ -91.338141, 43.897664 ], [ -91.342335, 43.902697 ], [ -91.346271, 43.910074 ], [ -91.347741, 43.911964 ], [ -91.351688, 43.914545 ], [ -91.356741, 43.916564 ], [ -91.357426, 43.917231 ], [ -91.363242, 43.926563 ], [ -91.364736, 43.934884 ], [ -91.366642, 43.937463 ], [ -91.375142, 43.944289 ], [ -91.385785, 43.954239 ], [ -91.395086, 43.959409 ], [ -91.406011, 43.963929 ], [ -91.407395, 43.965148 ], [ -91.410555, 43.970892 ], [ -91.412491, 43.973411 ], [ -91.424134, 43.982631 ], [ -91.425681, 43.985113 ], [ -91.426720, 43.988500 ], [ -91.429878, 43.993888 ], [ -91.432522, 43.996827 ], [ -91.437380, 43.999962 ], [ -91.440536, 44.001501 ], [ -91.457378, 44.006301 ], [ -91.463515, 44.009041 ], [ -91.468472, 44.009480 ], [ -91.478498, 44.008030 ], [ -91.480870, 44.008145 ], [ -91.494988, 44.012536 ], [ -91.502163, 44.016856 ], [ -91.507121, 44.018980 ], [ -91.524315, 44.021433 ], [ -91.533778, 44.021433 ], [ -91.547028, 44.022226 ], [ -91.559004, 44.025315 ], [ -91.573283, 44.026901 ], [ -91.580019, 44.026925 ], [ -91.582604, 44.027381 ], [ -91.592070, 44.031372 ], [ -91.597617, 44.034965 ], [ -91.603550, 44.043681 ], [ -91.607339, 44.047357 ], [ -91.610487, 44.049310 ], [ -91.615375, 44.051598 ], [ -91.623784, 44.054106 ], [ -91.627900, 44.055807 ], [ -91.633365, 44.060364 ], [ -91.638115, 44.063285 ], [ -91.640535, 44.063679 ], [ -91.643400, 44.062711 ], [ -91.644717, 44.062782 ], [ -91.647873, 44.064109 ], [ -91.652247, 44.068634 ], [ -91.657000, 44.071409 ], [ -91.659511, 44.074203 ], [ -91.663442, 44.080910 ], [ -91.665263, 44.085041 ], [ -91.667006, 44.086964 ], [ -91.681530, 44.097400 ], [ -91.685748, 44.098419 ], [ -91.691281, 44.097858 ], [ -91.695310, 44.098570 ], [ -91.707491, 44.103906 ], [ -91.708207, 44.105186 ], [ -91.708082, 44.110929 ], [ -91.709476, 44.117565 ], [ -91.710597, 44.120480 ], [ -91.719097, 44.128853 ], [ -91.721552, 44.130342 ], [ -91.730648, 44.132900 ], [ -91.751747, 44.134786 ], [ -91.756719, 44.136804 ], [ -91.768574, 44.143508 ], [ -91.774486, 44.147539 ], [ -91.796669, 44.154335 ], [ -91.808064, 44.159262 ], [ -91.817302, 44.164235 ], [ -91.829167, 44.178350 ], [ -91.832479, 44.180308 ], [ -91.844754, 44.184878 ], [ -91.864387, 44.196574 ], [ -91.872369, 44.199167 ], [ -91.875158, 44.200575 ], [ -91.876056, 44.202728 ], [ -91.876356, 44.209575 ], [ -91.877429, 44.212921 ], [ -91.880265, 44.216555 ], [ -91.889790, 44.226286 ], [ -91.892698, 44.231105 ], [ -91.892963, 44.235149 ], [ -91.887905, 44.246398 ], [ -91.887040, 44.251772 ], [ -91.887824, 44.254171 ], [ -91.889132, 44.256060 ], [ -91.896008, 44.262871 ], [ -91.896760, 44.265447 ], [ -91.895652, 44.273008 ], [ -91.896388, 44.274690 ], [ -91.898697, 44.277172 ], [ -91.905789, 44.281614 ], [ -91.920282, 44.286496 ], [ -91.922205, 44.287811 ], [ -91.924613, 44.291815 ], [ -91.924975, 44.294819 ], [ -91.924102, 44.297095 ], [ -91.921028, 44.301069 ], [ -91.914360, 44.308230 ], [ -91.913574, 44.310392 ], [ -91.913534, 44.311392 ], [ -91.916191, 44.318094 ], [ -91.918625, 44.322671 ], [ -91.925590, 44.333548 ], [ -91.928224, 44.335473 ], [ -91.941311, 44.340978 ], [ -91.949599, 44.348796 ], [ -91.952820, 44.352982 ], [ -91.959523, 44.359404 ], [ -91.963600, 44.362112 ], [ -91.970266, 44.365842 ], [ -91.974922, 44.367516 ], [ -91.978574, 44.368372 ], [ -91.983974, 44.368448 ], [ -91.987289, 44.369119 ], [ -91.993984, 44.371800 ], [ -92.000165, 44.374966 ], [ -92.002838, 44.377118 ], [ -92.006179, 44.378825 ], [ -92.008589, 44.379626 ], [ -92.019313, 44.381217 ], [ -92.038147, 44.388731 ], [ -92.046285, 44.394398 ], [ -92.053549, 44.401375 ], [ -92.056486, 44.402729 ], [ -92.061637, 44.404124 ], [ -92.072267, 44.404017 ], [ -92.078605, 44.404869 ], [ -92.087241, 44.408848 ], [ -92.097415, 44.411464 ], [ -92.111085, 44.413948 ], [ -92.115296, 44.416056 ], [ -92.121106, 44.420572 ], [ -92.124513, 44.422115 ], [ -92.139569, 44.424673 ], [ -92.162454, 44.427208 ], [ -92.170280, 44.428598 ], [ -92.195378, 44.433792 ], [ -92.215163, 44.438503 ], [ -92.221083, 44.440386 ], [ -92.232472, 44.445434 ], [ -92.237325, 44.449417 ], [ -92.242010, 44.454254 ], [ -92.244884, 44.456842 ], [ -92.249071, 44.459524 ], [ -92.262476, 44.465149 ], [ -92.276784, 44.473649 ], [ -92.282364, 44.477707 ], [ -92.291005, 44.485464 ], [ -92.297122, 44.492732 ], [ -92.302215, 44.500298 ], [ -92.302961, 44.503601 ], [ -92.302466, 44.516487 ], [ -92.303046, 44.518646 ], [ -92.303527, 44.519822 ], [ -92.307957, 44.524475 ], [ -92.310827, 44.528756 ], [ -92.314071, 44.538014 ], [ -92.317357, 44.542512 ], [ -92.319938, 44.544940 ], [ -92.329013, 44.550895 ], [ -92.336114, 44.554004 ], [ -92.347567, 44.557149 ], [ -92.361518, 44.558935 ], [ -92.368298, 44.559182 ], [ -92.389040, 44.557697 ], [ -92.399281, 44.558292 ], [ -92.415089, 44.560359 ], [ -92.420702, 44.562041 ], [ -92.425774, 44.564602 ], [ -92.431101, 44.565786 ], [ -92.433256, 44.565500 ], [ -92.440745, 44.562833 ], [ -92.455105, 44.561886 ], [ -92.470209, 44.565036 ], [ -92.481001, 44.568276 ], [ -92.484740, 44.568067 ], [ -92.490472, 44.566205 ], [ -92.493808, 44.566063 ], [ -92.508759, 44.570325 ], [ -92.512564, 44.571801 ], [ -92.518358, 44.575183 ], [ -92.520878, 44.575200 ], [ -92.527337, 44.573554 ], [ -92.540551, 44.567258 ], [ -92.544346, 44.566986 ], [ -92.548060, 44.567792 ], [ -92.549957, 44.568988 ], [ -92.551510, 44.571607 ], [ -92.551182, 44.573449 ], [ -92.549685, 44.576000 ], [ -92.549280, 44.577704 ], [ -92.549777, 44.581130 ], [ -92.560796, 44.594956 ], [ -92.567226, 44.601770 ], [ -92.569434, 44.603539 ], [ -92.572943, 44.604649 ], [ -92.577148, 44.605054 ], [ -92.578850, 44.603939 ], [ -92.581591, 44.600863 ], [ -92.584711, 44.599861 ], [ -92.586216, 44.600088 ], [ -92.588797, 44.601698 ], [ -92.590467, 44.605936 ], [ -92.601516, 44.612052 ], [ -92.607141, 44.612433 ], [ -92.614569, 44.611730 ], [ -92.618025, 44.612870 ], [ -92.621456, 44.615017 ], [ -92.623163, 44.618224 ], [ -92.623348, 44.620713 ], [ -92.622571, 44.623518 ], [ -92.619774, 44.629214 ], [ -92.619779, 44.634195 ], [ -92.621733, 44.638983 ], [ -92.632105, 44.649027 ], [ -92.655807, 44.658040 ], [ -92.660988, 44.660884 ], [ -92.664699, 44.663380 ], [ -92.686511, 44.682096 ], [ -92.696491, 44.689436 ], [ -92.700948, 44.693751 ], [ -92.713198, 44.701085 ], [ -92.737259, 44.717155 ], [ -92.750200, 44.722120 ], [ -92.754200, 44.722767 ], [ -92.756990, 44.723829 ], [ -92.766054, 44.729604 ], [ -92.787906, 44.737432 ], [ -92.802402, 44.745167 ], [ -92.802875, 44.746847 ], [ -92.804035, 44.748433 ], [ -92.807317, 44.750364 ], [ -92.807988, 44.751470 ], [ -92.807362, 44.758909 ], [ -92.805287, 44.768361 ], [ -92.800313, 44.777379 ], [ -92.796039, 44.782056 ], [ -92.788776, 44.787794 ], [ -92.785206, 44.792303 ], [ -92.782963, 44.798131 ], [ -92.781498, 44.809408 ], [ -92.780430, 44.812589 ], [ -92.772663, 44.821424 ], [ -92.771902, 44.823067 ], [ -92.772663, 44.826337 ], [ -92.772266, 44.828046 ], [ -92.769367, 44.831800 ], [ -92.766102, 44.834966 ], [ -92.765278, 44.837186 ], [ -92.765278, 44.841070 ], [ -92.768574, 44.854368 ], [ -92.769102, 44.862167 ], [ -92.767102, 44.866767 ], [ -92.763706, 44.872129 ], [ -92.763402, 44.874167 ], [ -92.764133, 44.875905 ], [ -92.769603, 44.882967 ], [ -92.773946, 44.889997 ], [ -92.774907, 44.892797 ], [ -92.774571, 44.898084 ], [ -92.774022, 44.900083 ], [ -92.773103, 44.901367 ], [ -92.761341, 44.906904 ], [ -92.759556, 44.907857 ], [ -92.758701, 44.908979 ], [ -92.757557, 44.911214 ], [ -92.750645, 44.937299 ], [ -92.750802, 44.941567 ], [ -92.754603, 44.955767 ], [ -92.760701, 44.964979 ], [ -92.767218, 44.968084 ], [ -92.768545, 44.969839 ], [ -92.769445, 44.972150 ], [ -92.770304, 44.978967 ], [ -92.770346, 44.983327 ], [ -92.769049, 44.988195 ], [ -92.770834, 44.994131 ], [ -92.771231, 45.001378 ], [ -92.768118, 45.009115 ], [ -92.762533, 45.020551 ], [ -92.761904, 45.022467 ], [ -92.762060, 45.024320 ], [ -92.764604, 45.028767 ], [ -92.770362, 45.033803 ], [ -92.778815, 45.039327 ], [ -92.787910, 45.043516 ], [ -92.793282, 45.047178 ], [ -92.797081, 45.050648 ], [ -92.802056, 45.057423 ], [ -92.803079, 45.060978 ], [ -92.802911, 45.065403 ], [ -92.802163, 45.067555 ], [ -92.800851, 45.069477 ], [ -92.791528, 45.079647 ], [ -92.774010, 45.089138 ], [ -92.765602, 45.095730 ], [ -92.754387, 45.103146 ], [ -92.746749, 45.107051 ], [ -92.744938, 45.108309 ], [ -92.740509, 45.113396 ], [ -92.739584, 45.115598 ], [ -92.739528, 45.116515 ], [ -92.740611, 45.118454 ], [ -92.742925, 45.119918 ], [ -92.745694, 45.123112 ], [ -92.749427, 45.138117 ], [ -92.756807, 45.151866 ], [ -92.757707, 45.155466 ], [ -92.757775, 45.160519 ], [ -92.756907, 45.165166 ], [ -92.752542, 45.171772 ], [ -92.752404, 45.173916 ], [ -92.764872, 45.182812 ], [ -92.766808, 45.185466 ], [ -92.767408, 45.190166 ], [ -92.766932, 45.195111 ], [ -92.763908, 45.204866 ], [ -92.762108, 45.207166 ], [ -92.758008, 45.209566 ], [ -92.754008, 45.212766 ], [ -92.751708, 45.218666 ], [ -92.752192, 45.221051 ], [ -92.753931, 45.222905 ], [ -92.755732, 45.225949 ], [ -92.757456, 45.230526 ], [ -92.757503, 45.238308 ], [ -92.760249, 45.249600 ], [ -92.758907, 45.253407 ], [ -92.755199, 45.256733 ], [ -92.751709, 45.261666 ], [ -92.751659, 45.265910 ], [ -92.752666, 45.269565 ], [ -92.758022, 45.274822 ], [ -92.760615, 45.278827 ], [ -92.761868, 45.284938 ], [ -92.761868, 45.287013 ], [ -92.761013, 45.289028 ], [ -92.758710, 45.290965 ], [ -92.750819, 45.292980 ], [ -92.737122, 45.300459 ], [ -92.732594, 45.304224 ], [ -92.727737, 45.309288 ], [ -92.709968, 45.321302 ], [ -92.704794, 45.326526 ], [ -92.699956, 45.333716 ], [ -92.698967, 45.336374 ], [ -92.698920, 45.339364 ], [ -92.699524, 45.342421 ], [ -92.704054, 45.353660 ], [ -92.703705, 45.356330 ], [ -92.702720, 45.358472 ], [ -92.696499, 45.363529 ], [ -92.679193, 45.372710 ], [ -92.678223, 45.373604 ], [ -92.678756, 45.376201 ], [ -92.676961, 45.380137 ], [ -92.669505, 45.389111 ], [ -92.664102, 45.393309 ], [ -92.658486, 45.396058 ], [ -92.650422, 45.398507 ], [ -92.650570, 45.403308 ], [ -92.648157, 45.407423 ], [ -92.646676, 45.413227 ], [ -92.646943, 45.414265 ], [ -92.649467, 45.416408 ], [ -92.650269, 45.419168 ], [ -92.649152, 45.429618 ], [ -92.646768, 45.437929 ], [ -92.646602, 45.441635 ], [ -92.652698, 45.454527 ], [ -92.653549, 45.455346 ], [ -92.661131, 45.458278 ], [ -92.677219, 45.462864 ], [ -92.680234, 45.464344 ], [ -92.686793, 45.472271 ], [ -92.691619, 45.476273 ], [ -92.695212, 45.482882 ], [ -92.702224, 45.493046 ], [ -92.711890, 45.503281 ], [ -92.715814, 45.506676 ], [ -92.724337, 45.512223 ], [ -92.726677, 45.514462 ], [ -92.727744, 45.518811 ], [ -92.728023, 45.525652 ], [ -92.724650, 45.536744 ], [ -92.724762, 45.538617 ], [ -92.726082, 45.541112 ], [ -92.745591, 45.553016 ], [ -92.756906, 45.557499 ], [ -92.764574, 45.563592 ], [ -92.770223, 45.566939 ], [ -92.773412, 45.568235 ], [ -92.775988, 45.568478 ], [ -92.785741, 45.567888 ], [ -92.790143, 45.566915 ], [ -92.801503, 45.562854 ], [ -92.812083, 45.561122 ], [ -92.823309, 45.560934 ], [ -92.834156, 45.563096 ], [ -92.843783, 45.566135 ], [ -92.846447, 45.566515 ], [ -92.871082, 45.567581 ], [ -92.881136, 45.573409 ], [ -92.883749, 45.575483 ], [ -92.884954, 45.578818 ], [ -92.883277, 45.589831 ], [ -92.886421, 45.594881 ], [ -92.886442, 45.598679 ], [ -92.884900, 45.605001 ], [ -92.882529, 45.610216 ], [ -92.882970, 45.613738 ], [ -92.886669, 45.619760 ], [ -92.888035, 45.624959 ], [ -92.888114, 45.628377 ], [ -92.886827, 45.633403 ], [ -92.886963, 45.636777 ], [ -92.887929, 45.639006 ], [ -92.887067, 45.644148 ], [ -92.885711, 45.646017 ], [ -92.883987, 45.654870 ], [ -92.882504, 45.659471 ], [ -92.878932, 45.665606 ], [ -92.876891, 45.675289 ], [ -92.875488, 45.689014 ], [ -92.870145, 45.696757 ], [ -92.870025, 45.697272 ], [ -92.871775, 45.699774 ], [ -92.868862, 45.711993 ], [ -92.869689, 45.715142 ], [ -92.869193, 45.717568 ], [ -92.865688, 45.720623 ], [ -92.862598, 45.722241 ], [ -92.853405, 45.723152 ], [ -92.850933, 45.723831 ], [ -92.850537, 45.724376 ], [ -92.850388, 45.727576 ], [ -92.848851, 45.728751 ], [ -92.843079, 45.729163 ], [ -92.841051, 45.730024 ], [ -92.835917, 45.732802 ], [ -92.830685, 45.733120 ], [ -92.828981, 45.733714 ], [ -92.826013, 45.736650 ], [ -92.816559, 45.742037 ], [ -92.812939, 45.742709 ], [ -92.809837, 45.744172 ], [ -92.805348, 45.747493 ], [ -92.803971, 45.749805 ], [ -92.802630, 45.751888 ], [ -92.798645, 45.753654 ], [ -92.784621, 45.764196 ], [ -92.781373, 45.773062 ], [ -92.779617, 45.782563 ], [ -92.776496, 45.790014 ], [ -92.772065, 45.795230 ], [ -92.768430, 45.798010 ], [ -92.761833, 45.801258 ], [ -92.759010, 45.803965 ], [ -92.757815, 45.806574 ], [ -92.757947, 45.811216 ], [ -92.760023, 45.815475 ], [ -92.761889, 45.817928 ], [ -92.764906, 45.824859 ], [ -92.765681, 45.827252 ], [ -92.765146, 45.830183 ], [ -92.761712, 45.833861 ], [ -92.759458, 45.835341 ], [ -92.749180, 45.840717 ], [ -92.745557, 45.841455 ], [ -92.739991, 45.846283 ], [ -92.739278, 45.847580 ], [ -92.736117, 45.859129 ], [ -92.736484, 45.863356 ], [ -92.734039, 45.868108 ], [ -92.721128, 45.883805 ], [ -92.712503, 45.891705 ], [ -92.707702, 45.894901 ], [ -92.703265, 45.896155 ], [ -92.698983, 45.896451 ], [ -92.683924, 45.903939 ], [ -92.676607, 45.906370 ], [ -92.675737, 45.907478 ], [ -92.676807, 45.910930 ], [ -92.676167, 45.912072 ], [ -92.670352, 45.916247 ], [ -92.659549, 45.922937 ], [ -92.656125, 45.924442 ], [ -92.639116, 45.924555 ], [ -92.638474, 45.925971 ], [ -92.640115, 45.932478 ], [ -92.639936, 45.933541 ], [ -92.638824, 45.934166 ], [ -92.636316, 45.934634 ], [ -92.629260, 45.932404 ], [ -92.627723, 45.932682 ], [ -92.622720, 45.935186 ], [ -92.614314, 45.934529 ], [ -92.608329, 45.938112 ], [ -92.602460, 45.940815 ], [ -92.590138, 45.941773 ], [ -92.580565, 45.946250 ], [ -92.574892, 45.948103 ], [ -92.569764, 45.948146 ], [ -92.561256, 45.951006 ], [ -92.551933, 45.951651 ], [ -92.551186, 45.952240 ], [ -92.549858, 45.957039 ], [ -92.550672, 45.960759 ], [ -92.549806, 45.967986 ], [ -92.548459, 45.969056 ], [ -92.545682, 45.970118 ], [ -92.537709, 45.977818 ], [ -92.530516, 45.981918 ], [ -92.527052, 45.983245 ], [ -92.522032, 45.984203 ], [ -92.519488, 45.983917 ], [ -92.502535, 45.979995 ], [ -92.490996, 45.975560 ], [ -92.484633, 45.975872 ], [ -92.479478, 45.973992 ], [ -92.472761, 45.972952 ], [ -92.469354, 45.973811 ], [ -92.464481, 45.976267 ], [ -92.461260, 45.979427 ], [ -92.461138, 45.980216 ], [ -92.463429, 45.981507 ], [ -92.464173, 45.982423 ], [ -92.464512, 45.985038 ], [ -92.462477, 45.987850 ], [ -92.456494, 45.990243 ], [ -92.453373, 45.992913 ], [ -92.453635, 45.996171 ], [ -92.452952, 45.997782 ], [ -92.451627, 46.000441 ], [ -92.449630, 46.002252 ], [ -92.444294, 46.009161 ], [ -92.444356, 46.011777 ], [ -92.442259, 46.016177 ], [ -92.435627, 46.021232 ], [ -92.428555, 46.024241 ], [ -92.420696, 46.026769 ], [ -92.410649, 46.027259 ], [ -92.408259, 46.026630 ], [ -92.392681, 46.019540 ], [ -92.381707, 46.017034 ], [ -92.372717, 46.014198 ], [ -92.362141, 46.013103 ], [ -92.357965, 46.013413 ], [ -92.351760, 46.015685 ], [ -92.349977, 46.016982 ], [ -92.350319, 46.018980 ], [ -92.350004, 46.021888 ], [ -92.349281, 46.023624 ], [ -92.346345, 46.025429 ], [ -92.344244, 46.027430 ], [ -92.343745, 46.028525 ], [ -92.342429, 46.034541 ], [ -92.343604, 46.040917 ], [ -92.343459, 46.042990 ], [ -92.341278, 46.045424 ], [ -92.338590, 46.050111 ], [ -92.338239, 46.052149 ], [ -92.335335, 46.059422 ], [ -92.332912, 46.062697 ], [ -92.329806, 46.065216 ], [ -92.327868, 46.066180 ], [ -92.319329, 46.069289 ], [ -92.306756, 46.072410 ], [ -92.298638, 46.072989 ], [ -92.294033, 46.074377 ], [ -92.294069, 46.078346 ], [ -92.293530, 46.113824 ], [ -92.293744, 46.166838 ], [ -92.293857, 46.180073 ], [ -92.293558, 46.224578 ], [ -92.293619, 46.244043 ], [ -92.293074, 46.295129 ], [ -92.293007, 46.297987 ], [ -92.292840, 46.304319 ], [ -92.292839, 46.307107 ], [ -92.292880, 46.313752 ], [ -92.292803, 46.314628 ], [ -92.292782, 46.319312 ], [ -92.292999, 46.321894 ], [ -92.292860, 46.417220 ], [ -92.292847, 46.420876 ], [ -92.292727, 46.431993 ], [ -92.292510, 46.478761 ], [ -92.292371, 46.495585 ], [ -92.291976, 46.503997 ], [ -92.291647, 46.604649 ], [ -92.291597, 46.624941 ], [ -92.292192, 46.663242 ], [ -92.292192, 46.666042 ], [ -92.291292, 46.668142 ], [ -92.287392, 46.667342 ], [ -92.287092, 46.662842 ], [ -92.286192, 46.660342 ], [ -92.283692, 46.658841 ], [ -92.278492, 46.658641 ], [ -92.274392, 46.657441 ], [ -92.272792, 46.652841 ], [ -92.270592, 46.650741 ], [ -92.265993, 46.651041 ], [ -92.259692, 46.657141 ], [ -92.256592, 46.658741 ], [ -92.242493, 46.649241 ], [ -92.235592, 46.650041 ], [ -92.228492, 46.652941 ], [ -92.223492, 46.652641 ], [ -92.216392, 46.649841 ], [ -92.212392, 46.649941 ], [ -92.207092, 46.651941 ], [ -92.202292, 46.655041 ], [ -92.201592, 46.656641 ], [ -92.202192, 46.658941 ], [ -92.205492, 46.664741 ], [ -92.204092, 46.666941 ], [ -92.199492, 46.670241 ], [ -92.192492, 46.676741 ], [ -92.187592, 46.678941 ], [ -92.181391, 46.680241 ], [ -92.177591, 46.683441 ], [ -92.176091, 46.686341 ], [ -92.176491, 46.690241 ], [ -92.177891, 46.691841 ], [ -92.183091, 46.695241 ], [ -92.198491, 46.696141 ], [ -92.205192, 46.698341 ], [ -92.205692, 46.702541 ], [ -92.204691, 46.704041 ], [ -92.201591, 46.705941 ], [ -92.197391, 46.707641 ], [ -92.193291, 46.711241 ], [ -92.191491, 46.716241 ], [ -92.189091, 46.717541 ], [ -92.178891, 46.716741 ], [ -92.174291, 46.717241 ], [ -92.167291, 46.719941 ], [ -92.155191, 46.715940 ], [ -92.148691, 46.715140 ], [ -92.146291, 46.715940 ], [ -92.141291, 46.725240 ], [ -92.143391, 46.728140 ], [ -92.143290, 46.734640 ], [ -92.137890, 46.739540 ], [ -92.116590, 46.748640 ], [ -92.108190, 46.749140 ], [ -92.089490, 46.749240 ], [ -92.033990, 46.708939 ], [ -92.020289, 46.704039 ], [ -92.015290, 46.706469 ], [ -92.007989, 46.705039 ], [ -91.987889, 46.692739 ], [ -91.973389, 46.686439 ], [ -91.961889, 46.682539 ], [ -91.942988, 46.679939 ], [ -91.886963, 46.690211 ], [ -91.857462, 46.692362 ], [ -91.840288, 46.689693 ], [ -91.820027, 46.690176 ], [ -91.790132, 46.694675 ], [ -91.749650, 46.709129 ], [ -91.645502, 46.734733 ], [ -91.590684, 46.754331 ], [ -91.574291, 46.757488 ], [ -91.551445, 46.755674 ], [ -91.551408, 46.755666 ], [ -91.537115, 46.754788 ], [ -91.511077, 46.757453 ], [ -91.499696, 46.761243 ], [ -91.492429, 46.766663 ], [ -91.470181, 46.768911 ], [ -91.449327, 46.773303 ], [ -91.423713, 46.782170 ], [ -91.411799, 46.789640 ], [ -91.398256, 46.791213 ], [ -91.391469, 46.790205 ], [ -91.368819, 46.793836 ], [ -91.360804, 46.798136 ], [ -91.352191, 46.807417 ], [ -91.338250, 46.817704 ], [ -91.314815, 46.826825 ], [ -91.302295, 46.830343 ], [ -91.265866, 46.833944 ], [ -91.256705, 46.836887 ], [ -91.250806, 46.841135 ], [ -91.232733, 46.860035 ], [ -91.226796, 46.863610 ], [ -91.211112, 46.866696 ], [ -91.186561, 46.885732 ], [ -91.179687, 46.885732 ], [ -91.181750, 46.880233 ], [ -91.204439, 46.858816 ], [ -91.200107, 46.854017 ], [ -91.178292, 46.844259 ], [ -91.167601, 46.844760 ], [ -91.147837, 46.863082 ], [ -91.144266, 46.870301 ], [ -91.140165, 46.873201 ], [ -91.134668, 46.872490 ], [ -91.133337, 46.870341 ], [ -91.136512, 46.860975 ], [ -91.134948, 46.858986 ], [ -91.123109, 46.856173 ], [ -91.105490, 46.857620 ], [ -91.096565, 46.861530 ], [ -91.093714, 46.879882 ], [ -91.090916, 46.882670 ], [ -91.080951, 46.883609 ], [ -91.068220, 46.878309 ], [ -91.052991, 46.881325 ], [ -91.039890, 46.889230 ], [ -91.036622, 46.893594 ], [ -91.034518, 46.903053 ], [ -91.019141, 46.911502 ], [ -91.005199, 46.916203 ], [ -90.998848, 46.915975 ], [ -90.995149, 46.917577 ], [ -90.984617, 46.925602 ], [ -90.973755, 46.941304 ], [ -90.968419, 46.943910 ], [ -90.964865, 46.943780 ], [ -90.954537, 46.938429 ], [ -90.921811, 46.931322 ], [ -90.913838, 46.933400 ], [ -90.908598, 46.941305 ], [ -90.879621, 46.958088 ], [ -90.871126, 46.961129 ], [ -90.855874, 46.962232 ], [ -90.837716, 46.957438 ], [ -90.785606, 46.926431 ], [ -90.754552, 46.898270 ], [ -90.750858, 46.893035 ], [ -90.751031, 46.887963 ], [ -90.754734, 46.884880 ], [ -90.761567, 46.883170 ], [ -90.770170, 46.876296 ], [ -90.780972, 46.858989 ], [ -90.798936, 46.823143 ], [ -90.825696, 46.803858 ], [ -90.828057, 46.797415 ], [ -90.835607, 46.789759 ], [ -90.856531, 46.788885 ], [ -90.863542, 46.780565 ], [ -90.859445, 46.773985 ], [ -90.862333, 46.768135 ], [ -90.866586, 46.764408 ], [ -90.885021, 46.756341 ], [ -90.883396, 46.746987 ], [ -90.870396, 46.723293 ], [ -90.852704, 46.699582 ], [ -90.853829, 46.693457 ], [ -90.868468, 46.680375 ], [ -90.885869, 46.670374 ], [ -90.911281, 46.663083 ], [ -90.915152, 46.658410 ], [ -90.920835, 46.637351 ], [ -90.920936, 46.631584 ], [ -90.924487, 46.625417 ], [ -90.938680, 46.608322 ], [ -90.949621, 46.602975 ], [ -90.951543, 46.600621 ], [ -90.951476, 46.597033 ], [ -90.941930, 46.588419 ], [ -90.918266, 46.583070 ], [ -90.909815, 46.582703 ], [ -90.905572, 46.583524 ], [ -90.873154, 46.601223 ], [ -90.867120, 46.601911 ], [ -90.829031, 46.616066 ], [ -90.794775, 46.624941 ], [ -90.770192, 46.636127 ], [ -90.755287, 46.646289 ], [ -90.756495, 46.664591 ], [ -90.748090, 46.669817 ], [ -90.739549, 46.689981 ], [ -90.737260, 46.692267 ], [ -90.694721, 46.664402 ], [ -90.627885, 46.623839 ], [ -90.586249, 46.599863 ], [ -90.558141, 46.586384 ], [ -90.537962, 46.581081 ], [ -90.525498, 46.586926 ], [ -90.505909, 46.589614 ], [ -90.473760, 46.574178 ], [ -90.437596, 46.561492 ], [ -90.418136, 46.566094 ], [ -90.415620, 46.563169 ], [ -90.414596, 46.557320 ], [ -90.414464, 46.557320 ], [ -90.407775, 46.552246 ], [ -90.405593, 46.547584 ], [ -90.402019, 46.544384 ], [ -90.400429, 46.544384 ], [ -90.400041, 46.544384 ], [ -90.398742, 46.542738 ], [ -90.395568, 46.536317 ], [ -90.395272, 46.533941 ], [ -90.393320, 46.532615 ], [ -90.387228, 46.533663 ], [ -90.374461, 46.539212 ], [ -90.369964, 46.540549 ], [ -90.361600, 46.541434 ], [ -90.357676, 46.540271 ], [ -90.357014, 46.540591 ], [ -90.355689, 46.540317 ], [ -90.353534, 46.537553 ], [ -90.351580, 46.537074 ], [ -90.350121, 46.537337 ], [ -90.349462, 46.538080 ], [ -90.347514, 46.547083 ], [ -90.344338, 46.552087 ], [ -90.336921, 46.554076 ], [ -90.331887, 46.553278 ], [ -90.327548, 46.550262 ], [ -90.328044, 46.548046 ], [ -90.326686, 46.546150 ], [ -90.324699, 46.545602 ], [ -90.320428, 46.546287 ], [ -90.310859, 46.539365 ], [ -90.310329, 46.536852 ], [ -90.311886, 46.528695 ], [ -90.314434, 46.523784 ], [ -90.317777, 46.521637 ], [ -90.316983, 46.517319 ], [ -90.313894, 46.516199 ], [ -90.313839, 46.516199 ], [ -90.312581, 46.517113 ], [ -90.307716, 46.518392 ], [ -90.306558, 46.518484 ], [ -90.303546, 46.517432 ], [ -90.298284, 46.517820 ], [ -90.294411, 46.518848 ], [ -90.294311, 46.519876 ], [ -90.292854, 46.520972 ], [ -90.285707, 46.518846 ], [ -90.283423, 46.518868 ], [ -90.278920, 46.522271 ], [ -90.278356, 46.523847 ], [ -90.277131, 46.524487 ], [ -90.272599, 46.521127 ], [ -90.271971, 46.519756 ], [ -90.274721, 46.515416 ], [ -90.270422, 46.511690 ], [ -90.270432, 46.510756 ], [ -90.270558, 46.509560 ], [ -90.270684, 46.508237 ], [ -90.270180, 46.507356 ], [ -90.268480, 46.507167 ], [ -90.266528, 46.507356 ], [ -90.265143, 46.506222 ], [ -90.265143, 46.505089 ], [ -90.265269, 46.503829 ], [ -90.263018, 46.502777 ], [ -90.260504, 46.502822 ], [ -90.258650, 46.503483 ], [ -90.257160, 46.504716 ], [ -90.248194, 46.505357 ], [ -90.246043, 46.504832 ], [ -90.243395, 46.505245 ], [ -90.236283, 46.507121 ], [ -90.231587, 46.509842 ], [ -90.230363, 46.509705 ], [ -90.229402, 46.507992 ], [ -90.230921, 46.504656 ], [ -90.231020, 46.503354 ], [ -90.230324, 46.501732 ], [ -90.228735, 46.501573 ], [ -90.222351, 46.503380 ], [ -90.220532, 46.503403 ], [ -90.216594, 46.501759 ], [ -90.214866, 46.499947 ], [ -90.214843, 46.498181 ], [ -90.211753, 46.490351 ], [ -90.204009, 46.478175 ], [ -90.201727, 46.476074 ], [ -90.193394, 46.472487 ], [ -90.188996, 46.469015 ], [ -90.188633, 46.468101 ], [ -90.189426, 46.467004 ], [ -90.192005, 46.465611 ], [ -90.193294, 46.463143 ], [ -90.190749, 46.460173 ], [ -90.189162, 46.459054 ], [ -90.180336, 46.456746 ], [ -90.179212, 46.453090 ], [ -90.177860, 46.440548 ], [ -90.174556, 46.439656 ], [ -90.166919, 46.439851 ], [ -90.166909, 46.439311 ], [ -90.166526, 46.437576 ], [ -90.163422, 46.434605 ], [ -90.158603, 46.422656 ], [ -90.158241, 46.420485 ], [ -90.158972, 46.413769 ], [ -90.157851, 46.409291 ], [ -90.152936, 46.401293 ], [ -90.148347, 46.399258 ], [ -90.146816, 46.397205 ], [ -90.144359, 46.390255 ], [ -90.139410, 46.384999 ], [ -90.135253, 46.382210 ], [ -90.133966, 46.382118 ], [ -90.132250, 46.381249 ], [ -90.134656, 46.374979 ], [ -90.134663, 46.374947 ], [ -90.133871, 46.371828 ], [ -90.131036, 46.369199 ], [ -90.126517, 46.366889 ], [ -90.122923, 46.363603 ], [ -90.122757, 46.362621 ], [ -90.122785, 46.361259 ], [ -90.122287, 46.360139 ], [ -90.120973, 46.359720 ], [ -90.119757, 46.359748 ], [ -90.119691, 46.359755 ], [ -90.118827, 46.359241 ], [ -90.116844, 46.355153 ], [ -90.116741, 46.350652 ], [ -90.117466, 46.349487 ], [ -90.119729, 46.348504 ], [ -90.120614, 46.346420 ], [ -90.120198, 46.345066 ], [ -90.119572, 46.344180 ], [ -90.118791, 46.342253 ], [ -90.119468, 46.339700 ], [ -90.121084, 46.338656 ], [ -90.121380, 46.338131 ], [ -90.121248, 46.337217 ], [ -90.120489, 46.336852 ], [ -89.918798, 46.297741 ], [ -89.909910, 46.296402 ], [ -89.908196, 46.296037 ], [ -89.764506, 46.268082 ], [ -89.667617, 46.249797 ], [ -89.638416, 46.243804 ], [ -89.533801, 46.224119 ], [ -89.495723, 46.216301 ], [ -89.276883, 46.174116 ], [ -89.276489, 46.174047 ], [ -89.219964, 46.163319 ], [ -89.218156, 46.162988 ], [ -89.205657, 46.160408 ], [ -89.203289, 46.160020 ], [ -89.201283, 46.159426 ], [ -89.194508, 46.157942 ], [ -89.166887, 46.152868 ], [ -89.161757, 46.151816 ], [ -89.125136, 46.144531 ], [ -89.091630, 46.138505 ], [ -88.990807, 46.097298 ], [ -88.948698, 46.080205 ], [ -88.943279, 46.077943 ], [ -88.850270, 46.040274 ], [ -88.848464, 46.038858 ], [ -88.847599, 46.037161 ], [ -88.843903, 46.033050 ], [ -88.840584, 46.031112 ], [ -88.837991, 46.030176 ], [ -88.835249, 46.030330 ], [ -88.831544, 46.029620 ], [ -88.820592, 46.026261 ], [ -88.816489, 46.023924 ], [ -88.815427, 46.022954 ], [ -88.815629, 46.022320 ], [ -88.811948, 46.021609 ], [ -88.801761, 46.023737 ], [ -88.796460, 46.023605 ], [ -88.795790, 46.024864 ], [ -88.796242, 46.026853 ], [ -88.800670, 46.030036 ], [ -88.796182, 46.033712 ], [ -88.791796, 46.032057 ], [ -88.784411, 46.032709 ], [ -88.779221, 46.031869 ], [ -88.778628, 46.031271 ], [ -88.778734, 46.028875 ], [ -88.783635, 46.024357 ], [ -88.784007, 46.022984 ], [ -88.783891, 46.020934 ], [ -88.782104, 46.016558 ], [ -88.779915, 46.015436 ], [ -88.776187, 46.015931 ], [ -88.769712, 46.018968 ], [ -88.768692, 46.020571 ], [ -88.768305, 46.021201 ], [ -88.767610, 46.021643 ], [ -88.767104, 46.021896 ], [ -88.766156, 46.022149 ], [ -88.765208, 46.022086 ], [ -88.763767, 46.021943 ], [ -88.760044, 46.019815 ], [ -88.758618, 46.019542 ], [ -88.756295, 46.020173 ], [ -88.754033, 46.022460 ], [ -88.752176, 46.023584 ], [ -88.746422, 46.025798 ], [ -88.739994, 46.027308 ], [ -88.730675, 46.026535 ], [ -88.724801, 46.024503 ], [ -88.721125, 46.022013 ], [ -88.721319, 46.018608 ], [ -88.718397, 46.013284 ], [ -88.713049, 46.012668 ], [ -88.710328, 46.016303 ], [ -88.704687, 46.018154 ], [ -88.698716, 46.017903 ], [ -88.691662, 46.015435 ], [ -88.679132, 46.013538 ], [ -88.674606, 46.010567 ], [ -88.671458, 46.005104 ], [ -88.670115, 45.999957 ], [ -88.670939, 45.999957 ], [ -88.671267, 45.999026 ], [ -88.667464, 45.995048 ], [ -88.663923, 45.993242 ], [ -88.663609, 45.992397 ], [ -88.664360, 45.991337 ], [ -88.664802, 45.989835 ], [ -88.663697, 45.989084 ], [ -88.662902, 45.988730 ], [ -88.661312, 45.988819 ], [ -88.657760, 45.989287 ], [ -88.637500, 45.984960 ], [ -88.635598, 45.985119 ], [ -88.634842, 45.987565 ], [ -88.634055, 45.987999 ], [ -88.623947, 45.988633 ], [ -88.616405, 45.987700 ], [ -88.614176, 45.988775 ], [ -88.613063, 45.990627 ], [ -88.611563, 45.998810 ], [ -88.611466, 46.003332 ], [ -88.607438, 46.010991 ], [ -88.603965, 46.016181 ], [ -88.601440, 46.017599 ], [ -88.598093, 46.017623 ], [ -88.593860, 46.015132 ], [ -88.593302, 46.014447 ], [ -88.592874, 46.011590 ], [ -88.589755, 46.005602 ], [ -88.589000, 46.005077 ], [ -88.580670, 46.006975 ], [ -88.572995, 46.011799 ], [ -88.571553, 46.013811 ], [ -88.565485, 46.015708 ], [ -88.554987, 46.014977 ], [ -88.550756, 46.012896 ], [ -88.541078, 46.013763 ], [ -88.539011, 46.014791 ], [ -88.534876, 46.018104 ], [ -88.533530, 46.019932 ], [ -88.533825, 46.020915 ], [ -88.532414, 46.021212 ], [ -88.526673, 46.020822 ], [ -88.523131, 46.019518 ], [ -88.514601, 46.019926 ], [ -88.509516, 46.019169 ], [ -88.507188, 46.018300 ], [ -88.506205, 46.017134 ], [ -88.505946, 46.013385 ], [ -88.500133, 46.000457 ], [ -88.498765, 46.000393 ], [ -88.496898, 45.999012 ], [ -88.496897, 45.998281 ], [ -88.498108, 45.996360 ], [ -88.497417, 45.995149 ], [ -88.492495, 45.992157 ], [ -88.486755, 45.990949 ], [ -88.478984, 45.991797 ], [ -88.476002, 45.992826 ], [ -88.474036, 45.994655 ], [ -88.475152, 45.996598 ], [ -88.474695, 45.998770 ], [ -88.470855, 46.001004 ], [ -88.465542, 46.000685 ], [ -88.458658, 45.999391 ], [ -88.454361, 45.997518 ], [ -88.453868, 45.996169 ], [ -88.454261, 45.993426 ], [ -88.450325, 45.990181 ], [ -88.448751, 45.989770 ], [ -88.443078, 45.990685 ], [ -88.439733, 45.990456 ], [ -88.435798, 45.988125 ], [ -88.434060, 45.986205 ], [ -88.426125, 45.984102 ], [ -88.423437, 45.981930 ], [ -88.422322, 45.980170 ], [ -88.423044, 45.978547 ], [ -88.420356, 45.976764 ], [ -88.416914, 45.975323 ], [ -88.414849, 45.975483 ], [ -88.411077, 45.979139 ], [ -88.409864, 45.979688 ], [ -88.402848, 45.981194 ], [ -88.399046, 45.980278 ], [ -88.395308, 45.980391 ], [ -88.388847, 45.982675 ], [ -88.384318, 45.988113 ], [ -88.385234, 45.990239 ], [ -88.380183, 45.991654 ], [ -88.334628, 45.968808 ], [ -88.330137, 45.965951 ], [ -88.328333, 45.964054 ], [ -88.327872, 45.958934 ], [ -88.330296, 45.956625 ], [ -88.326953, 45.955071 ], [ -88.326003, 45.955300 ], [ -88.320531, 45.959963 ], [ -88.316894, 45.960969 ], [ -88.309520, 45.959369 ], [ -88.300965, 45.956168 ], [ -88.296968, 45.953767 ], [ -88.295264, 45.951253 ], [ -88.292381, 45.951115 ], [ -88.283335, 45.955091 ], [ -88.268390, 45.957486 ], [ -88.259343, 45.959494 ], [ -88.256455, 45.962739 ], [ -88.254816, 45.963538 ], [ -88.250133, 45.963147 ], [ -88.250133, 45.963572 ], [ -88.249117, 45.963663 ], [ -88.246307, 45.962983 ], [ -88.245937, 45.958726 ], [ -88.246579, 45.956597 ], [ -88.245752, 45.954147 ], [ -88.244452, 45.952142 ], [ -88.242518, 45.950363 ], [ -88.239672, 45.948982 ], [ -88.233140, 45.947405 ], [ -88.227988, 45.947688 ], [ -88.223773, 45.948712 ], [ -88.222167, 45.948513 ], [ -88.215025, 45.946976 ], [ -88.211158, 45.944531 ], [ -88.209585, 45.944280 ], [ -88.201852, 45.945173 ], [ -88.202116, 45.949836 ], [ -88.197627, 45.953082 ], [ -88.196316, 45.953311 ], [ -88.191991, 45.952740 ], [ -88.189789, 45.952208 ], [ -88.178008, 45.947111 ], [ -88.175532, 45.944897 ], [ -88.172628, 45.941015 ], [ -88.170096, 45.939470 ], [ -88.163959, 45.938340 ], [ -88.163105, 45.939043 ], [ -88.158704, 45.939064 ], [ -88.146352, 45.935314 ], [ -88.146419, 45.934194 ], [ -88.145928, 45.933646 ], [ -88.141001, 45.930608 ], [ -88.127428, 45.926153 ], [ -88.126122, 45.924639 ], [ -88.127430, 45.923214 ], [ -88.127594, 45.922414 ], [ -88.126382, 45.921499 ], [ -88.121864, 45.920750 ], [ -88.118507, 45.921140 ], [ -88.115346, 45.922211 ], [ -88.104686, 45.922121 ], [ -88.102908, 45.921869 ], [ -88.096496, 45.917273 ], [ -88.095409, 45.915175 ], [ -88.095354, 45.913895 ], [ -88.099172, 45.912362 ], [ -88.101973, 45.910550 ], [ -88.104576, 45.906847 ], [ -88.105677, 45.904387 ], [ -88.106136, 45.900811 ], [ -88.105981, 45.897091 ], [ -88.105447, 45.896593 ], [ -88.101814, 45.883504 ], [ -88.100218, 45.881205 ], [ -88.095841, 45.880042 ], [ -88.083965, 45.881186 ], [ -88.081781, 45.880516 ], [ -88.073944, 45.875593 ], [ -88.073134, 45.871952 ], [ -88.075146, 45.864832 ], [ -88.077534, 45.863825 ], [ -88.081641, 45.865087 ], [ -88.082590, 45.864944 ], [ -88.084985, 45.862443 ], [ -88.087419, 45.857459 ], [ -88.088825, 45.855860 ], [ -88.098326, 45.850142 ], [ -88.106622, 45.841072 ], [ -88.109089, 45.839492 ], [ -88.111726, 45.839196 ], [ -88.114267, 45.837891 ], [ -88.120723, 45.832995 ], [ -88.122947, 45.829565 ], [ -88.127808, 45.827173 ], [ -88.133640, 45.823128 ], [ -88.135067, 45.821694 ], [ -88.136110, 45.819029 ], [ -88.131834, 45.811312 ], [ -88.129461, 45.809288 ], [ -88.116024, 45.804079 ], [ -88.109506, 45.803584 ], [ -88.107506, 45.802668 ], [ -88.105355, 45.800104 ], [ -88.105518, 45.798839 ], [ -88.106351, 45.797573 ], [ -88.103247, 45.791361 ], [ -88.099616, 45.790186 ], [ -88.094047, 45.785658 ], [ -88.088590, 45.784697 ], [ -88.079764, 45.784950 ], [ -88.078361, 45.784249 ], [ -88.076375, 45.781606 ], [ -88.072091, 45.780261 ], [ -88.050634, 45.780972 ], [ -88.048514, 45.782549 ], [ -88.044697, 45.783718 ], [ -88.040892, 45.786452 ], [ -88.040221, 45.789236 ], [ -88.039729, 45.789626 ], [ -88.033568, 45.789816 ], [ -88.031124, 45.789233 ], [ -88.027228, 45.789190 ], [ -88.023600, 45.790094 ], [ -88.017588, 45.792455 ], [ -88.007043, 45.792192 ], [ -88.001593, 45.794091 ], [ -87.995876, 45.795435 ], [ -87.991447, 45.795393 ], [ -87.989831, 45.794827 ], [ -87.987942, 45.793075 ], [ -87.982617, 45.782944 ], [ -87.980870, 45.776977 ], [ -87.981789, 45.775081 ], [ -87.983392, 45.774696 ], [ -87.985597, 45.774926 ], [ -87.989829, 45.772945 ], [ -87.989656, 45.772025 ], [ -87.986429, 45.769596 ], [ -87.976835, 45.767015 ], [ -87.972451, 45.766319 ], [ -87.966970, 45.764021 ], [ -87.963996, 45.760794 ], [ -87.964725, 45.759461 ], [ -87.963452, 45.758220 ], [ -87.959277, 45.757367 ], [ -87.954459, 45.758414 ], [ -87.944113, 45.757422 ], [ -87.934585, 45.758094 ], [ -87.929130, 45.760364 ], [ -87.926611, 45.759590 ], [ -87.921999, 45.756989 ], [ -87.908933, 45.758297 ], [ -87.907771, 45.759280 ], [ -87.905873, 45.759364 ], [ -87.904657, 45.759163 ], [ -87.902707, 45.757932 ], [ -87.901299, 45.756553 ], [ -87.900005, 45.753497 ], [ -87.898363, 45.752503 ], [ -87.896032, 45.752285 ], [ -87.891905, 45.754055 ], [ -87.882261, 45.754779 ], [ -87.879812, 45.754843 ], [ -87.875813, 45.753888 ], [ -87.873339, 45.750439 ], [ -87.868111, 45.749477 ], [ -87.864141, 45.745697 ], [ -87.863050, 45.743090 ], [ -87.863874, 45.742660 ], [ -87.864320, 45.737139 ], [ -87.855480, 45.726943 ], [ -87.837343, 45.716919 ], [ -87.831442, 45.714938 ], [ -87.812338, 45.711303 ], [ -87.810144, 45.710230 ], [ -87.805867, 45.706841 ], [ -87.805081, 45.704974 ], [ -87.805076, 45.703556 ], [ -87.809181, 45.700337 ], [ -87.809075, 45.699717 ], [ -87.804993, 45.695796 ], [ -87.801880, 45.693862 ], [ -87.787727, 45.687180 ], [ -87.782226, 45.683053 ], [ -87.780808, 45.680349 ], [ -87.780737, 45.675458 ], [ -87.781007, 45.673934 ], [ -87.781623, 45.673280 ], [ -87.795355, 45.671334 ], [ -87.798903, 45.670140 ], [ -87.803290, 45.666494 ], [ -87.823164, 45.662732 ], [ -87.823868, 45.661920 ], [ -87.823672, 45.659817 ], [ -87.822425, 45.658012 ], [ -87.822693, 45.656077 ], [ -87.824676, 45.653211 ], [ -87.824102, 45.647138 ], [ -87.821818, 45.645589 ], [ -87.817277, 45.643926 ], [ -87.810194, 45.638732 ], [ -87.804481, 45.628933 ], [ -87.796983, 45.623613 ], [ -87.796179, 45.622074 ], [ -87.795880, 45.618846 ], [ -87.792016, 45.616756 ], [ -87.780845, 45.614599 ], [ -87.777671, 45.609204 ], [ -87.776238, 45.597797 ], [ -87.777199, 45.588499 ], [ -87.781255, 45.585682 ], [ -87.785647, 45.583960 ], [ -87.786767, 45.582830 ], [ -87.787534, 45.581376 ], [ -87.787292, 45.574906 ], [ -87.788326, 45.567941 ], [ -87.788798, 45.565947 ], [ -87.790874, 45.564096 ], [ -87.792372, 45.563055 ], [ -87.797536, 45.562124 ], [ -87.806104, 45.562863 ], [ -87.813745, 45.565175 ], [ -87.829346, 45.568776 ], [ -87.831689, 45.568035 ], [ -87.833591, 45.562529 ], [ -87.832968, 45.559461 ], [ -87.832296, 45.558767 ], [ -87.827215, 45.555620 ], [ -87.818791, 45.552100 ], [ -87.813737, 45.548616 ], [ -87.807159, 45.543523 ], [ -87.803390, 45.538272 ], [ -87.803364, 45.537016 ], [ -87.804528, 45.534373 ], [ -87.804720, 45.531244 ], [ -87.804203, 45.524676 ], [ -87.802267, 45.514233 ], [ -87.798794, 45.506287 ], [ -87.793215, 45.505028 ], [ -87.792769, 45.499967 ], [ -87.793447, 45.498372 ], [ -87.796409, 45.494679 ], [ -87.797824, 45.491468 ], [ -87.798362, 45.486564 ], [ -87.798960, 45.485147 ], [ -87.806891, 45.479092 ], [ -87.807388, 45.477031 ], [ -87.805873, 45.474380 ], [ -87.805773, 45.473139 ], [ -87.811469, 45.467991 ], [ -87.812971, 45.466100 ], [ -87.812976, 45.464159 ], [ -87.821057, 45.459955 ], [ -87.827430, 45.458076 ], [ -87.832456, 45.455020 ], [ -87.833042, 45.453596 ], [ -87.836008, 45.450877 ], [ -87.844815, 45.448411 ], [ -87.847429, 45.444177 ], [ -87.855298, 45.441379 ], [ -87.861697, 45.434473 ], [ -87.861950, 45.433072 ], [ -87.860127, 45.429584 ], [ -87.860432, 45.423504 ], [ -87.856216, 45.416101 ], [ -87.851810, 45.413103 ], [ -87.850533, 45.411685 ], [ -87.849668, 45.409518 ], [ -87.849322, 45.403872 ], [ -87.850969, 45.401925 ], [ -87.859131, 45.398967 ], [ -87.859773, 45.397278 ], [ -87.859603, 45.396409 ], [ -87.856830, 45.393106 ], [ -87.859418, 45.388227 ], [ -87.864677, 45.385232 ], [ -87.870905, 45.383116 ], [ -87.873568, 45.381357 ], [ -87.875424, 45.379373 ], [ -87.875692, 45.377052 ], [ -87.871789, 45.373557 ], [ -87.871485, 45.371546 ], [ -87.876862, 45.368535 ], [ -87.884855, 45.362792 ], [ -87.887828, 45.358122 ], [ -87.888052, 45.354697 ], [ -87.886949, 45.353110 ], [ -87.885170, 45.351736 ], [ -87.881114, 45.351278 ], [ -87.879835, 45.351490 ], [ -87.873529, 45.354286 ], [ -87.871685, 45.355729 ], [ -87.871124, 45.357011 ], [ -87.871285, 45.358614 ], [ -87.871204, 45.360056 ], [ -87.870243, 45.360617 ], [ -87.868560, 45.360537 ], [ -87.867037, 45.360137 ], [ -87.865675, 45.358213 ], [ -87.865274, 45.355969 ], [ -87.864873, 45.354767 ], [ -87.863489, 45.353020 ], [ -87.860871, 45.351192 ], [ -87.858617, 45.350378 ], [ -87.852784, 45.349497 ], [ -87.850418, 45.347492 ], [ -87.849899, 45.344651 ], [ -87.851475, 45.342335 ], [ -87.851318, 45.341346 ], [ -87.850133, 45.340435 ], [ -87.848368, 45.340676 ], [ -87.838141, 45.345101 ], [ -87.836782, 45.346451 ], [ -87.835303, 45.350980 ], [ -87.832612, 45.352249 ], [ -87.829775, 45.352005 ], [ -87.826918, 45.350538 ], [ -87.824855, 45.350713 ], [ -87.823554, 45.351637 ], [ -87.823028, 45.352650 ], [ -87.810076, 45.351269 ], [ -87.800464, 45.353608 ], [ -87.790324, 45.353444 ], [ -87.787967, 45.352612 ], [ -87.783076, 45.349725 ], [ -87.773901, 45.351226 ], [ -87.771384, 45.351210 ], [ -87.769172, 45.351195 ], [ -87.762128, 45.348401 ], [ -87.754104, 45.349442 ], [ -87.751452, 45.351755 ], [ -87.751626, 45.354169 ], [ -87.750928, 45.355037 ], [ -87.738352, 45.358243 ], [ -87.737801, 45.359635 ], [ -87.733409, 45.364432 ], [ -87.718891, 45.377462 ], [ -87.708329, 45.381218 ], [ -87.706767, 45.383827 ], [ -87.704337, 45.385462 ], [ -87.699797, 45.387927 ], [ -87.693956, 45.389893 ], [ -87.690281, 45.389822 ], [ -87.685934, 45.388711 ], [ -87.682866, 45.384950 ], [ -87.675017, 45.382454 ], [ -87.674550, 45.381649 ], [ -87.674403, 45.378065 ], [ -87.673513, 45.376946 ], [ -87.657349, 45.368752 ], [ -87.656624, 45.367295 ], [ -87.655807, 45.362706 ], [ -87.656632, 45.358617 ], [ -87.653568, 45.354204 ], [ -87.650661, 45.353798 ], [ -87.648476, 45.352243 ], [ -87.647729, 45.350721 ], [ -87.647454, 45.345232 ], [ -87.648126, 45.339396 ], [ -87.655775, 45.330847 ], [ -87.659830, 45.329144 ], [ -87.661603, 45.327608 ], [ -87.662029, 45.326434 ], [ -87.661500, 45.321386 ], [ -87.663666, 45.318257 ], [ -87.665243, 45.317115 ], [ -87.667423, 45.316360 ], [ -87.675328, 45.307907 ], [ -87.679085, 45.305841 ], [ -87.687498, 45.298055 ], [ -87.687578, 45.296283 ], [ -87.690364, 45.290270 ], [ -87.693468, 45.287675 ], [ -87.698248, 45.281512 ], [ -87.699492, 45.276659 ], [ -87.698456, 45.272072 ], [ -87.698780, 45.269420 ], [ -87.703053, 45.267041 ], [ -87.709137, 45.260341 ], [ -87.707779, 45.258343 ], [ -87.709145, 45.254649 ], [ -87.711480, 45.245224 ], [ -87.711339, 45.239965 ], [ -87.712184, 45.239014 ], [ -87.713398, 45.238564 ], [ -87.717051, 45.238743 ], [ -87.718264, 45.238333 ], [ -87.724156, 45.233236 ], [ -87.725205, 45.231539 ], [ -87.724920, 45.229977 ], [ -87.721935, 45.228444 ], [ -87.721354, 45.226847 ], [ -87.722473, 45.223309 ], [ -87.726952, 45.218949 ], [ -87.727276, 45.216129 ], [ -87.726175, 45.212640 ], [ -87.726198, 45.209391 ], [ -87.727960, 45.207956 ], [ -87.736339, 45.204653 ], [ -87.739492, 45.202126 ], [ -87.741732, 45.198201 ], [ -87.741805, 45.197051 ], [ -87.735210, 45.177642 ], [ -87.736509, 45.173389 ], [ -87.736104, 45.172244 ], [ -87.735135, 45.171538 ], [ -87.730866, 45.170913 ], [ -87.727768, 45.169596 ], [ -87.724601, 45.167452 ], [ -87.723121, 45.165141 ], [ -87.717945, 45.161156 ], [ -87.711322, 45.158946 ], [ -87.708134, 45.156004 ], [ -87.707391, 45.154679 ], [ -87.703492, 45.152206 ], [ -87.700618, 45.151188 ], [ -87.695055, 45.150522 ], [ -87.692375, 45.149505 ], [ -87.688425, 45.147433 ], [ -87.683902, 45.144135 ], [ -87.675816, 45.135059 ], [ -87.676024, 45.134089 ], [ -87.678511, 45.131204 ], [ -87.678209, 45.130084 ], [ -87.672447, 45.121294 ], [ -87.671000, 45.120069 ], [ -87.667102, 45.118109 ], [ -87.661296, 45.112566 ], [ -87.661211, 45.108279 ], [ -87.659952, 45.107512 ], [ -87.657135, 45.107568 ], [ -87.652512, 45.108633 ], [ -87.648191, 45.106368 ], [ -87.636110, 45.105918 ], [ -87.631535, 45.106224 ], [ -87.629571, 45.105324 ], [ -87.628829, 45.104039 ], [ -87.627640, 45.103328 ], [ -87.621609, 45.102399 ], [ -87.614897, 45.100064 ], [ -87.591880, 45.094689 ], [ -87.590208, 45.095264 ], [ -87.587147, 45.089495 ], [ -87.587992, 45.085271 ], [ -87.591583, 45.083792 ], [ -87.594718, 45.085134 ], [ -87.601849, 45.082297 ], [ -87.610395, 45.075617 ], [ -87.625748, 45.045157 ], [ -87.624693, 45.014176 ], [ -87.630298, 44.976865 ], [ -87.661964, 44.973035 ], [ -87.696492, 44.974233 ], [ -87.766872, 44.965254 ], [ -87.812989, 44.954013 ], [ -87.819525, 44.951109 ], [ -87.839028, 44.931718 ], [ -87.843433, 44.924355 ], [ -87.844299, 44.918524 ], [ -87.842719, 44.912077 ], [ -87.839561, 44.905607 ], [ -87.827751, 44.891229 ], [ -87.832764, 44.880939 ], [ -87.838359, 44.873987 ], [ -87.848324, 44.870440 ], [ -87.852789, 44.864860 ], [ -87.854681, 44.857771 ], [ -87.866237, 44.840481 ], [ -87.878218, 44.839016 ], [ -87.901137, 44.827365 ], [ -87.904484, 44.818723 ], [ -87.926816, 44.778555 ], [ -87.941453, 44.756080 ], [ -87.951560, 44.753107 ], [ -87.964714, 44.743570 ], [ -87.983494, 44.720196 ], [ -87.989717, 44.686582 ], [ -87.990110, 44.668455 ], [ -88.002085, 44.664035 ], [ -88.009766, 44.637081 ], [ -88.009463, 44.630398 ], [ -87.998716, 44.609288 ], [ -88.001943, 44.603909 ], [ -88.012395, 44.602438 ], [ -88.016404, 44.592092 ], [ -88.027103, 44.578992 ], [ -88.036103, 44.576792 ], [ -88.041202, 44.572581 ], [ -88.042414, 44.566589 ], [ -88.005518, 44.539216 ], [ -87.970702, 44.530292 ], [ -87.943801, 44.529693 ], [ -87.929001, 44.535993 ], [ -87.917000, 44.548093 ], [ -87.901177, 44.568925 ], [ -87.898888, 44.574135 ], [ -87.903689, 44.581317 ], [ -87.901179, 44.584545 ], [ -87.891717, 44.588982 ], [ -87.866884, 44.608434 ], [ -87.830848, 44.623583 ], [ -87.808819, 44.636338 ], [ -87.775160, 44.639281 ], [ -87.765774, 44.642023 ], [ -87.756031, 44.649129 ], [ -87.750899, 44.656192 ], [ -87.748409, 44.667122 ], [ -87.729836, 44.682015 ], [ -87.719780, 44.693246 ], [ -87.718409, 44.707811 ], [ -87.721816, 44.718969 ], [ -87.720889, 44.724548 ], [ -87.705852, 44.738225 ], [ -87.688207, 44.758892 ], [ -87.646300, 44.798739 ], [ -87.637104, 44.813575 ], [ -87.610063, 44.838384 ], [ -87.581306, 44.851791 ], [ -87.573175, 44.853118 ], [ -87.550288, 44.851290 ], [ -87.530999, 44.857437 ], [ -87.515142, 44.869596 ], [ -87.501578, 44.864285 ], [ -87.478489, 44.863572 ], [ -87.437084, 44.892718 ], [ -87.433128, 44.892741 ], [ -87.420327, 44.887596 ], [ -87.419106, 44.885378 ], [ -87.419951, 44.875940 ], [ -87.410015, 44.861990 ], [ -87.405541, 44.860047 ], [ -87.384821, 44.865532 ], [ -87.383631, 44.885115 ], [ -87.385396, 44.889964 ], [ -87.393399, 44.898199 ], [ -87.406199, 44.904490 ], [ -87.405005, 44.911806 ], [ -87.398368, 44.925226 ], [ -87.393405, 44.934393 ], [ -87.387253, 44.939421 ], [ -87.374805, 44.956631 ], [ -87.360288, 44.987643 ], [ -87.336457, 45.013530 ], [ -87.322117, 45.034201 ], [ -87.302831, 45.052447 ], [ -87.284280, 45.063694 ], [ -87.264877, 45.081361 ], [ -87.260542, 45.092585 ], [ -87.260595, 45.106007 ], [ -87.257449, 45.121644 ], [ -87.250487, 45.131289 ], [ -87.240308, 45.137886 ], [ -87.242924, 45.149377 ], [ -87.238224, 45.167259 ], [ -87.231214, 45.172887 ], [ -87.221971, 45.175039 ], [ -87.214370, 45.165735 ], [ -87.195213, 45.163110 ], [ -87.175068, 45.173050 ], [ -87.167179, 45.183594 ], [ -87.163169, 45.185331 ], [ -87.147709, 45.190711 ], [ -87.133030, 45.192843 ], [ -87.123689, 45.189890 ], [ -87.119972, 45.191103 ], [ -87.119405, 45.205440 ], [ -87.121609, 45.209783 ], [ -87.122819, 45.222997 ], [ -87.116432, 45.241520 ], [ -87.108743, 45.257003 ], [ -87.078316, 45.265723 ], [ -87.071035, 45.280355 ], [ -87.068586, 45.295134 ], [ -87.059714, 45.298803 ], [ -87.057627, 45.292838 ], [ -87.051700, 45.285888 ], [ -87.043895, 45.284767 ], [ -87.034206, 45.287758 ], [ -87.017036, 45.299254 ], [ -86.994112, 45.298061 ], [ -86.983355, 45.295368 ], [ -86.977780, 45.290684 ], [ -86.970355, 45.278455 ], [ -86.974528, 45.271823 ], [ -86.984398, 45.264366 ], [ -86.984975, 45.258674 ], [ -86.982669, 45.249117 ], [ -86.976711, 45.246146 ], [ -86.973022, 45.246399 ], [ -86.978759, 45.227333 ], [ -86.985973, 45.215872 ], [ -87.002806, 45.211773 ], [ -87.005359, 45.213694 ], [ -87.007540, 45.222127 ], [ -87.032546, 45.222274 ], [ -87.040909, 45.211535 ], [ -87.045899, 45.173902 ], [ -87.045225, 45.158401 ], [ -87.028847, 45.146370 ], [ -87.033114, 45.141753 ], [ -87.045748, 45.134987 ], [ -87.054342, 45.119968 ], [ -87.051049, 45.116172 ], [ -87.048951, 45.108718 ], [ -87.048213, 45.089124 ], [ -87.057444, 45.087467 ], [ -87.063157, 45.079316 ], [ -87.079552, 45.070783 ], [ -87.081866, 45.059103 ], [ -87.091639, 45.055145 ], [ -87.121156, 45.058311 ], [ -87.124701, 45.052936 ], [ -87.124808, 45.042167 ], [ -87.139384, 45.012565 ], [ -87.154084, 45.009117 ], [ -87.163529, 45.004890 ], [ -87.181901, 44.980887 ], [ -87.189407, 44.968632 ], [ -87.188375, 44.948077 ], [ -87.175240, 44.939753 ], [ -87.171700, 44.931476 ], [ -87.174920, 44.927749 ], [ -87.186732, 44.925463 ], [ -87.204238, 44.916819 ], [ -87.215977, 44.906597 ], [ -87.217195, 44.897839 ], [ -87.206285, 44.885928 ], [ -87.204545, 44.875593 ], [ -87.267441, 44.846851 ], [ -87.276030, 44.833180 ], [ -87.282561, 44.814729 ], [ -87.304824, 44.804603 ], [ -87.313751, 44.793766 ], [ -87.320397, 44.784963 ], [ -87.318982, 44.771335 ], [ -87.337584, 44.737751 ], [ -87.343508, 44.719228 ], [ -87.353789, 44.701915 ], [ -87.368263, 44.684141 ], [ -87.393521, 44.640655 ], [ -87.401629, 44.631191 ], [ -87.405410, 44.627191 ], [ -87.418028, 44.620870 ], [ -87.437493, 44.605071 ], [ -87.446963, 44.586274 ], [ -87.468093, 44.551925 ], [ -87.483696, 44.511354 ], [ -87.483914, 44.504425 ], [ -87.490024, 44.477224 ], [ -87.498662, 44.460686 ], [ -87.506362, 44.423804 ], [ -87.511635, 44.414043 ], [ -87.517965, 44.394356 ], [ -87.517597, 44.375696 ], [ -87.521047, 44.367526 ], [ -87.533583, 44.351111 ], [ -87.545382, 44.321385 ], [ -87.544716, 44.306864 ], [ -87.541155, 44.293143 ], [ -87.521755, 44.259957 ], [ -87.508419, 44.229669 ], [ -87.507419, 44.210803 ], [ -87.512903, 44.192808 ], [ -87.519660, 44.179870 ], [ -87.539940, 44.159690 ], [ -87.563181, 44.144195 ], [ -87.600882, 44.131695 ], [ -87.621082, 44.121895 ], [ -87.646583, 44.104694 ], [ -87.655183, 44.081894 ], [ -87.653483, 44.067194 ], [ -87.656083, 44.051794 ], [ -87.671316, 44.037350 ], [ -87.683361, 44.020139 ], [ -87.695503, 43.989582 ], [ -87.698920, 43.965936 ], [ -87.703951, 43.956651 ], [ -87.716037, 43.943705 ], [ -87.719041, 43.937781 ], [ -87.726803, 43.903133 ], [ -87.736178, 43.880421 ], [ -87.736017, 43.873721 ], [ -87.728698, 43.852524 ], [ -87.729600, 43.831782 ], [ -87.726407, 43.810445 ], [ -87.700251, 43.767350 ], [ -87.700085, 43.761395 ], [ -87.702985, 43.749695 ], [ -87.705185, 43.745095 ], [ -87.708285, 43.742895 ], [ -87.709885, 43.735795 ], [ -87.708185, 43.722895 ], [ -87.702985, 43.706395 ], [ -87.702685, 43.687596 ], [ -87.706204, 43.679542 ], [ -87.734312, 43.639190 ], [ -87.781255, 43.578493 ], [ -87.790135, 43.563054 ], [ -87.797608, 43.527310 ], [ -87.797336, 43.510623 ], [ -87.793239, 43.492783 ], [ -87.807799, 43.461136 ], [ -87.827319, 43.434849 ], [ -87.855608, 43.405441 ], [ -87.865048, 43.393570 ], [ -87.872504, 43.380178 ], [ -87.877448, 43.369235 ], [ -87.882392, 43.352099 ], [ -87.889207, 43.307652 ], [ -87.901847, 43.284117 ], [ -87.911787, 43.250406 ], [ -87.910087, 43.235907 ], [ -87.896286, 43.197108 ], [ -87.887586, 43.186608 ], [ -87.881085, 43.170609 ], [ -87.892285, 43.148710 ], [ -87.900285, 43.137310 ], [ -87.901385, 43.133210 ], [ -87.900485, 43.125910 ], [ -87.893185, 43.114011 ], [ -87.876084, 43.099011 ], [ -87.866484, 43.074412 ], [ -87.870184, 43.064412 ], [ -87.882084, 43.051113 ], [ -87.895084, 43.042313 ], [ -87.898684, 43.028813 ], [ -87.895784, 43.015814 ], [ -87.887683, 43.000514 ], [ -87.878683, 42.992415 ], [ -87.857182, 42.978015 ], [ -87.845181, 42.962015 ], [ -87.842681, 42.944116 ], [ -87.847780, 42.889216 ], [ -87.834879, 42.856717 ], [ -87.823278, 42.835318 ], [ -87.793976, 42.806218 ], [ -87.773699, 42.793481 ], [ -87.767168, 42.790379 ], [ -87.756170, 42.780068 ], [ -87.771340, 42.771686 ], [ -87.778174, 42.762819 ], [ -87.782174, 42.747719 ], [ -87.778627, 42.727299 ], [ -87.782374, 42.708219 ], [ -87.785074, 42.700819 ], [ -87.786774, 42.700719 ], [ -87.794874, 42.689919 ], [ -87.803074, 42.675419 ], [ -87.814674, 42.644020 ], [ -87.819674, 42.615820 ], [ -87.819374, 42.606620 ], [ -87.815074, 42.594120 ], [ -87.810873, 42.587320 ], [ -87.813273, 42.579220 ], [ -87.812273, 42.529820 ], [ -87.809672, 42.514820 ], [ -87.800477, 42.491920 ], [ -87.815872, 42.491920 ], [ -87.843594, 42.492307 ], [ -87.900242, 42.493020 ], [ -87.971279, 42.494019 ], [ -87.990180, 42.494519 ], [ -88.049782, 42.495319 ], [ -88.115285, 42.496219 ], [ -88.200172, 42.496016 ], [ -88.216900, 42.495923 ], [ -88.250090, 42.495823 ], [ -88.271691, 42.494818 ], [ -88.417396, 42.494618 ], [ -88.461397, 42.494618 ], [ -88.506912, 42.494883 ], [ -88.638653, 42.495043 ], [ -88.707380, 42.493587 ], [ -88.765360, 42.492068 ], [ -88.786681, 42.491983 ], [ -88.940391, 42.495046 ], [ -88.943264, 42.495114 ], [ -88.992659, 42.496025 ], [ -89.013667, 42.496087 ], [ -89.013804, 42.496097 ], [ -89.042898, 42.496255 ], [ -89.071141, 42.496208 ], [ -89.099012, 42.496499 ], [ -89.116949, 42.496910 ], [ -89.120365, 42.496992 ], [ -89.125111, 42.496957 ], [ -89.164905, 42.497347 ], [ -89.166728, 42.497256 ], [ -89.226270, 42.497957 ], [ -89.228279, 42.498047 ], [ -89.246972, 42.498130 ], [ -89.250759, 42.497994 ], [ -89.290896, 42.498853 ], [ -89.361561, 42.500012 ], [ -89.366031, 42.500274 ], [ -89.401432, 42.500433 ], [ -89.420991, 42.500589 ], [ -89.422567, 42.500680 ], [ -89.423926, 42.500818 ], [ -89.425162, 42.500726 ], [ -89.484300, 42.501426 ], [ -89.492612, 42.501514 ], [ -89.493216, 42.501514 ], [ -89.522542, 42.501889 ], [ -89.564407, 42.502628 ], [ -89.594779, 42.503468 ], [ -89.600001, 42.503672 ], [ -89.603523, 42.503557 ], [ -89.613410, 42.503942 ], [ -89.644176, 42.504520 ], [ -89.650324, 42.504613 ], [ -89.667596, 42.504960 ], [ -89.690088, 42.505191 ], [ -89.693487, 42.505099 ], [ -89.742395, 42.505382 ], [ -89.769643, 42.505322 ], [ -89.780302, 42.505349 ], [ -89.793957, 42.505466 ], [ -89.799704, 42.505421 ], [ -89.801897, 42.505444 ], [ -89.926374, 42.505788 ], [ -89.926484, 42.505787 ], [ -89.955291, 42.505626 ], [ -89.985072, 42.506464 ], [ -89.985645, 42.506431 ], [ -89.997213, 42.506755 ], [ -89.999314, 42.506914 ], [ -90.017028, 42.507127 ], [ -90.018665, 42.507288 ], [ -90.073670, 42.508275 ], [ -90.093026, 42.508160 ], [ -90.095004, 42.507885 ], [ -90.142922, 42.508151 ], [ -90.164363, 42.508272 ], [ -90.181572, 42.508068 ], [ -90.206073, 42.507747 ], [ -90.223190, 42.507765 ], [ -90.250622, 42.507521 ], [ -90.253121, 42.507340 ], [ -90.267143, 42.507642 ], [ -90.269335, 42.507726 ], [ -90.272864, 42.507531 ], [ -90.303823, 42.507469 ], [ -90.362652, 42.507048 ], [ -90.367874, 42.507114 ], [ -90.370673, 42.507111 ], [ -90.405927, 42.506891 ], [ -90.437011, 42.507147 ], [ -90.474955, 42.507484 ], [ -90.479446, 42.507416 ], [ -90.491716, 42.507624 ], [ -90.532254, 42.507573 ], [ -90.544347, 42.507707 ], [ -90.544799, 42.507713 ], [ -90.551165, 42.507691 ], [ -90.555862, 42.507509 ], [ -90.565441, 42.507600 ], [ -90.614589, 42.508053 ], [ -90.617731, 42.508077 ], [ -90.640927, 42.508302 ] ] ], [ [ [ -90.726738, 47.062130 ], [ -90.730179, 47.068317 ], [ -90.730865, 47.080006 ], [ -90.723991, 47.077942 ], [ -90.719177, 47.066944 ], [ -90.726738, 47.062130 ] ] ], [ [ [ -90.588898, 47.060211 ], [ -90.591278, 47.066757 ], [ -90.590088, 47.073299 ], [ -90.586517, 47.075680 ], [ -90.582947, 47.073895 ], [ -90.582947, 47.069138 ], [ -90.584732, 47.062592 ], [ -90.588898, 47.060211 ] ] ], [ [ [ -90.641838, 47.025116 ], [ -90.651360, 47.028091 ], [ -90.652542, 47.034039 ], [ -90.649574, 47.038799 ], [ -90.643623, 47.041176 ], [ -90.637077, 47.038204 ], [ -90.636482, 47.036419 ], [ -90.637672, 47.029282 ], [ -90.641838, 47.025116 ] ] ], [ [ [ -90.679314, 47.018574 ], [ -90.692398, 47.021545 ], [ -90.692993, 47.031063 ], [ -90.687050, 47.043556 ], [ -90.677528, 47.044746 ], [ -90.664444, 47.047127 ], [ -90.651947, 47.053074 ], [ -90.648979, 47.053074 ], [ -90.649574, 47.048912 ], [ -90.670395, 47.039986 ], [ -90.673363, 47.031658 ], [ -90.676933, 47.020950 ], [ -90.679314, 47.018574 ] ] ], [ [ [ -90.748734, 46.998890 ], [ -90.767982, 47.002327 ], [ -90.776924, 47.024323 ], [ -90.760422, 47.033260 ], [ -90.738426, 47.014011 ], [ -90.748734, 46.998890 ] ] ], [ [ [ -90.563316, 46.996563 ], [ -90.565102, 46.998943 ], [ -90.569267, 47.017979 ], [ -90.574615, 47.029873 ], [ -90.573425, 47.035824 ], [ -90.564507, 47.040581 ], [ -90.560936, 47.039986 ], [ -90.560936, 47.037014 ], [ -90.563316, 47.030468 ], [ -90.562126, 47.028091 ], [ -90.547852, 47.020355 ], [ -90.544876, 47.017384 ], [ -90.547852, 47.003700 ], [ -90.553200, 46.998943 ], [ -90.563316, 46.996563 ] ] ], [ [ [ -90.617447, 46.989426 ], [ -90.621613, 46.991802 ], [ -90.624588, 47.000130 ], [ -90.624588, 47.003700 ], [ -90.618637, 47.007271 ], [ -90.608528, 47.007271 ], [ -90.602577, 47.002510 ], [ -90.603172, 46.995373 ], [ -90.609718, 46.991207 ], [ -90.617447, 46.989426 ] ] ], [ [ [ -90.694778, 46.982880 ], [ -90.707275, 46.982880 ], [ -90.712029, 46.985260 ], [ -90.711441, 46.990612 ], [ -90.705490, 47.000725 ], [ -90.696564, 47.008461 ], [ -90.680504, 47.007271 ], [ -90.669205, 47.000130 ], [ -90.669205, 46.998943 ], [ -90.679909, 46.993587 ], [ -90.694778, 46.982880 ] ] ], [ [ [ -90.856346, 46.976395 ], [ -90.859680, 46.976395 ], [ -90.866341, 46.981155 ], [ -90.876335, 46.984962 ], [ -90.878235, 46.990196 ], [ -90.875854, 46.992100 ], [ -90.872528, 46.989719 ], [ -90.865387, 46.986389 ], [ -90.852539, 46.985912 ], [ -90.853012, 46.980679 ], [ -90.856346, 46.976395 ] ] ], [ [ [ -90.799240, 46.967594 ], [ -90.805901, 46.970448 ], [ -90.804947, 46.973305 ], [ -90.798286, 46.975681 ], [ -90.795906, 46.979965 ], [ -90.788773, 46.980919 ], [ -90.784966, 46.979488 ], [ -90.786865, 46.975208 ], [ -90.789719, 46.969971 ], [ -90.799240, 46.967594 ] ] ], [ [ [ -90.961876, 46.961464 ], [ -90.969017, 46.963844 ], [ -90.980316, 46.971577 ], [ -90.983887, 46.979313 ], [ -90.982101, 46.985855 ], [ -90.955925, 46.991207 ], [ -90.949387, 46.991207 ], [ -90.941055, 46.996563 ], [ -90.939865, 47.001320 ], [ -90.937485, 47.003105 ], [ -90.928566, 47.000725 ], [ -90.923210, 46.988831 ], [ -90.923210, 46.986450 ], [ -90.930351, 46.980499 ], [ -90.931534, 46.977528 ], [ -90.930351, 46.967415 ], [ -90.932129, 46.962654 ], [ -90.946411, 46.962654 ], [ -90.961876, 46.961464 ] ] ], [ [ [ -90.671585, 46.948975 ], [ -90.675743, 46.952541 ], [ -90.676933, 46.957302 ], [ -90.668015, 46.968605 ], [ -90.654922, 46.976933 ], [ -90.637672, 46.980499 ], [ -90.633507, 46.978123 ], [ -90.634102, 46.970982 ], [ -90.651360, 46.957302 ], [ -90.666824, 46.950161 ], [ -90.671585, 46.948975 ] ] ], [ [ [ -90.737106, 46.914711 ], [ -90.765289, 46.947021 ], [ -90.740547, 46.964207 ], [ -90.715111, 46.957333 ], [ -90.694489, 46.936710 ], [ -90.688988, 46.917461 ], [ -90.737106, 46.914711 ] ] ], [ [ [ -90.689674, 46.878967 ], [ -90.702049, 46.885155 ], [ -90.677986, 46.897526 ], [ -90.667679, 46.889965 ], [ -90.675240, 46.881027 ], [ -90.689674, 46.878967 ] ] ], [ [ [ -90.494446, 46.870029 ], [ -90.516449, 46.876904 ], [ -90.450455, 46.898903 ], [ -90.447731, 46.896210 ], [ -90.449768, 46.892715 ], [ -90.475891, 46.876217 ], [ -90.494446, 46.870029 ] ] ], [ [ [ -90.756050, 46.830593 ], [ -90.762543, 46.832222 ], [ -90.761406, 46.838924 ], [ -90.749481, 46.862469 ], [ -90.730232, 46.873466 ], [ -90.722740, 46.871639 ], [ -90.718544, 46.864532 ], [ -90.745354, 46.835659 ], [ -90.756050, 46.830593 ] ] ], [ [ [ -86.944160, 45.300632 ], [ -86.957222, 45.304756 ], [ -86.959290, 45.310257 ], [ -86.957909, 45.315067 ], [ -86.947601, 45.312321 ], [ -86.942787, 45.306133 ], [ -86.944160, 45.300632 ] ] ], [ [ [ -87.327286, 45.157364 ], [ -87.376778, 45.177299 ], [ -87.375404, 45.199295 ], [ -87.334160, 45.211670 ], [ -87.330719, 45.206856 ], [ -87.336220, 45.173176 ], [ -87.327286, 45.157364 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US72", "STATE": "72", "NAME": "Puerto Rico", "LSAD": "", "CENSUSAREA": 3423.775000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -65.587335, 18.381994 ], [ -65.591215, 18.383793 ], [ -65.592667, 18.387243 ], [ -65.593393, 18.391237 ], [ -65.588128, 18.391237 ], [ -65.584537, 18.386939 ], [ -65.583571, 18.383751 ], [ -65.587335, 18.381994 ] ] ], [ [ [ -67.477976, 18.378945 ], [ -67.485499, 18.382224 ], [ -67.489346, 18.387441 ], [ -67.482204, 18.391470 ], [ -67.477922, 18.390544 ], [ -67.472368, 18.382801 ], [ -67.477976, 18.378945 ] ] ], [ [ [ -65.572248, 18.381757 ], [ -65.568979, 18.382125 ], [ -65.566355, 18.378212 ], [ -65.571788, 18.375623 ], [ -65.572248, 18.381757 ] ] ], [ [ [ -65.571523, 18.351635 ], [ -65.569013, 18.352794 ], [ -65.565744, 18.349524 ], [ -65.565072, 18.347499 ], [ -65.568702, 18.342399 ], [ -65.571523, 18.351635 ] ] ], [ [ [ -65.266169, 18.341751 ], [ -65.255933, 18.342117 ], [ -65.245756, 18.334707 ], [ -65.247210, 18.333345 ], [ -65.259612, 18.334147 ], [ -65.265558, 18.339392 ], [ -65.266169, 18.341751 ] ] ], [ [ [ -65.228485, 18.323013 ], [ -65.221568, 18.320959 ], [ -65.221110, 18.311984 ], [ -65.222853, 18.310464 ], [ -65.230025, 18.311274 ], [ -65.238034, 18.319340 ], [ -65.238034, 18.321059 ], [ -65.235972, 18.321059 ], [ -65.231933, 18.320339 ], [ -65.228485, 18.323013 ] ] ], [ [ [ -65.327700, 18.295843 ], [ -65.331398, 18.296110 ], [ -65.337451, 18.308308 ], [ -65.330188, 18.315998 ], [ -65.327821, 18.308970 ], [ -65.327700, 18.295843 ] ] ], [ [ [ -65.316371, 18.309660 ], [ -65.316885, 18.314047 ], [ -65.322785, 18.321157 ], [ -65.327318, 18.323666 ], [ -65.342068, 18.345290 ], [ -65.335701, 18.349535 ], [ -65.329334, 18.341955 ], [ -65.321754, 18.338316 ], [ -65.309833, 18.337973 ], [ -65.304409, 18.332054 ], [ -65.298328, 18.330529 ], [ -65.281657, 18.329370 ], [ -65.277319, 18.332582 ], [ -65.253174, 18.318524 ], [ -65.245095, 18.309668 ], [ -65.244424, 18.303493 ], [ -65.249857, 18.296691 ], [ -65.260282, 18.290823 ], [ -65.263937, 18.290685 ], [ -65.276037, 18.296067 ], [ -65.277099, 18.298978 ], [ -65.276007, 18.302613 ], [ -65.280502, 18.306202 ], [ -65.302536, 18.310488 ], [ -65.302160, 18.305379 ], [ -65.299701, 18.302181 ], [ -65.296515, 18.302299 ], [ -65.288941, 18.299977 ], [ -65.280764, 18.288274 ], [ -65.283269, 18.280214 ], [ -65.287257, 18.277744 ], [ -65.300238, 18.294404 ], [ -65.301690, 18.300126 ], [ -65.307027, 18.301636 ], [ -65.316371, 18.309660 ] ] ], [ [ [ -65.582967, 18.246749 ], [ -65.591954, 18.248653 ], [ -65.594940, 18.248653 ], [ -65.595860, 18.247792 ], [ -65.598153, 18.247595 ], [ -65.599627, 18.255699 ], [ -65.584892, 18.256376 ], [ -65.582967, 18.246749 ] ] ], [ [ [ -65.308717, 18.145172 ], [ -65.302295, 18.141089 ], [ -65.294896, 18.142830 ], [ -65.287962, 18.148097 ], [ -65.275165, 18.134430 ], [ -65.276214, 18.131936 ], [ -65.283248, 18.132999 ], [ -65.296036, 18.127990 ], [ -65.322794, 18.126589 ], [ -65.327184, 18.124106 ], [ -65.338506, 18.112439 ], [ -65.342037, 18.111380 ], [ -65.350493, 18.111914 ], [ -65.364733, 18.120377 ], [ -65.372225, 18.118226 ], [ -65.375985, 18.107731 ], [ -65.383203, 18.105668 ], [ -65.397837, 18.110873 ], [ -65.399791, 18.108832 ], [ -65.411767, 18.106211 ], [ -65.423765, 18.097764 ], [ -65.426311, 18.093749 ], [ -65.451380, 18.086096 ], [ -65.456810, 18.087778 ], [ -65.465849, 18.087715 ], [ -65.468768, 18.092643 ], [ -65.479790, 18.096352 ], [ -65.507265, 18.091646 ], [ -65.524209, 18.081977 ], [ -65.542087, 18.081177 ], [ -65.558646, 18.085660 ], [ -65.569305, 18.091616 ], [ -65.570628, 18.097325 ], [ -65.576860, 18.103224 ], [ -65.575579, 18.115669 ], [ -65.546199, 18.119329 ], [ -65.511712, 18.132840 ], [ -65.489829, 18.135912 ], [ -65.467910, 18.143767 ], [ -65.437058, 18.157660 ], [ -65.399517, 18.161935 ], [ -65.371373, 18.157517 ], [ -65.334289, 18.147761 ], [ -65.313476, 18.144296 ], [ -65.308717, 18.145172 ] ] ], [ [ [ -67.891740, 18.113970 ], [ -67.887099, 18.112574 ], [ -67.876430, 18.114157 ], [ -67.869804, 18.118851 ], [ -67.861548, 18.122144 ], [ -67.848245, 18.108320 ], [ -67.843202, 18.094858 ], [ -67.843615, 18.085099 ], [ -67.845293, 18.081938 ], [ -67.853098, 18.078195 ], [ -67.865598, 18.065440 ], [ -67.871462, 18.057800 ], [ -67.895921, 18.052342 ], [ -67.904431, 18.059130 ], [ -67.918778, 18.063116 ], [ -67.927841, 18.068572 ], [ -67.940799, 18.079716 ], [ -67.934479, 18.111306 ], [ -67.932185, 18.113221 ], [ -67.910880, 18.119668 ], [ -67.891740, 18.113970 ] ] ], [ [ [ -66.959540, 18.489878 ], [ -66.957733, 18.489129 ], [ -66.944636, 18.491693 ], [ -66.906872, 18.483556 ], [ -66.867386, 18.490785 ], [ -66.849673, 18.490745 ], [ -66.836940, 18.487659 ], [ -66.799320, 18.492775 ], [ -66.780311, 18.491411 ], [ -66.749301, 18.476701 ], [ -66.742067, 18.474681 ], [ -66.733986, 18.473457 ], [ -66.710743, 18.472611 ], [ -66.683719, 18.481367 ], [ -66.679876, 18.484944 ], [ -66.664364, 18.487809 ], [ -66.645839, 18.488777 ], [ -66.624618, 18.494199 ], [ -66.584074, 18.484287 ], [ -66.565241, 18.485523 ], [ -66.562916, 18.488450 ], [ -66.563485, 18.490512 ], [ -66.558503, 18.489987 ], [ -66.534840, 18.481253 ], [ -66.529476, 18.482877 ], [ -66.511609, 18.476848 ], [ -66.470292, 18.469070 ], [ -66.456486, 18.468920 ], [ -66.449184, 18.470991 ], [ -66.441852, 18.479751 ], [ -66.439961, 18.485525 ], [ -66.420921, 18.488639 ], [ -66.410344, 18.489886 ], [ -66.394287, 18.489748 ], [ -66.377286, 18.488044 ], [ -66.372820, 18.487726 ], [ -66.337728, 18.485620 ], [ -66.315477, 18.474724 ], [ -66.291225, 18.472347 ], [ -66.283675, 18.472203 ], [ -66.276599, 18.478129 ], [ -66.269799, 18.480281 ], [ -66.258015, 18.476906 ], [ -66.251547, 18.472464 ], [ -66.241797, 18.468740 ], [ -66.220148, 18.466000 ], [ -66.192664, 18.466212 ], [ -66.183886, 18.460506 ], [ -66.179218, 18.455305 ], [ -66.172315, 18.451462 ], [ -66.159796, 18.451706 ], [ -66.153037, 18.454457 ], [ -66.139451, 18.462387 ], [ -66.138532, 18.453305 ], [ -66.133085, 18.445881 ], [ -66.127938, 18.444632 ], [ -66.125198, 18.451209 ], [ -66.124284, 18.456324 ], [ -66.123188, 18.459430 ], [ -66.125015, 18.470435 ], [ -66.118338, 18.469581 ], [ -66.092098, 18.466535 ], [ -66.083254, 18.462022 ], [ -66.073987, 18.458100 ], [ -66.043272, 18.453655 ], [ -66.039440, 18.454441 ], [ -66.036491, 18.450117 ], [ -66.023221, 18.443875 ], [ -66.006523, 18.444347 ], [ -65.997180, 18.449895 ], [ -65.992935, 18.457489 ], [ -65.992349, 18.460024 ], [ -65.990790, 18.460419 ], [ -65.958492, 18.451354 ], [ -65.925670, 18.444881 ], [ -65.916843, 18.444619 ], [ -65.907756, 18.446893 ], [ -65.904988, 18.450926 ], [ -65.878683, 18.438322 ], [ -65.838825, 18.431865 ], [ -65.831476, 18.426849 ], [ -65.816691, 18.410663 ], [ -65.805364, 18.410800 ], [ -65.794357, 18.420446 ], [ -65.789932, 18.422261 ], [ -65.788343, 18.419311 ], [ -65.794925, 18.410800 ], [ -65.793677, 18.407283 ], [ -65.788003, 18.406602 ], [ -65.774937, 18.413951 ], [ -65.770530, 18.412940 ], [ -65.769749, 18.409473 ], [ -65.771695, 18.406277 ], [ -65.750455, 18.385208 ], [ -65.742154, 18.380459 ], [ -65.733567, 18.382211 ], [ -65.728163, 18.389762 ], [ -65.719550, 18.390062 ], [ -65.711398, 18.373179 ], [ -65.699069, 18.368156 ], [ -65.668845, 18.361939 ], [ -65.655716, 18.364951 ], [ -65.649130, 18.376250 ], [ -65.642565, 18.379532 ], [ -65.634431, 18.369835 ], [ -65.627246, 18.376436 ], [ -65.626527, 18.381728 ], [ -65.624975, 18.386553 ], [ -65.622761, 18.387771 ], [ -65.618229, 18.386496 ], [ -65.614891, 18.382473 ], [ -65.619068, 18.367755 ], [ -65.628198, 18.353711 ], [ -65.634190, 18.338965 ], [ -65.628047, 18.328252 ], [ -65.626456, 18.298982 ], [ -65.634389, 18.292349 ], [ -65.625271, 18.282306 ], [ -65.624881, 18.274507 ], [ -65.630833, 18.264989 ], [ -65.626321, 18.258676 ], [ -65.617658, 18.254678 ], [ -65.610994, 18.260485 ], [ -65.607186, 18.264198 ], [ -65.604425, 18.260675 ], [ -65.606900, 18.249918 ], [ -65.597618, 18.234289 ], [ -65.589947, 18.228225 ], [ -65.593795, 18.224059 ], [ -65.601809, 18.226983 ], [ -65.604666, 18.226411 ], [ -65.605809, 18.223473 ], [ -65.598544, 18.214166 ], [ -65.598217, 18.212452 ], [ -65.600503, 18.211146 ], [ -65.611360, 18.211717 ], [ -65.615033, 18.223309 ], [ -65.615981, 18.227389 ], [ -65.626731, 18.235484 ], [ -65.638181, 18.229121 ], [ -65.637565, 18.224444 ], [ -65.628414, 18.205149 ], [ -65.635281, 18.199975 ], [ -65.644622, 18.198810 ], [ -65.661219, 18.206960 ], [ -65.664127, 18.207136 ], [ -65.690749, 18.194990 ], [ -65.694515, 18.187011 ], [ -65.691021, 18.178998 ], [ -65.695856, 18.179324 ], [ -65.710895, 18.186963 ], [ -65.712533, 18.189146 ], [ -65.717999, 18.190176 ], [ -65.728471, 18.185588 ], [ -65.734664, 18.180368 ], [ -65.738834, 18.174066 ], [ -65.743632, 18.163957 ], [ -65.758728, 18.156601 ], [ -65.766919, 18.148424 ], [ -65.777584, 18.129239 ], [ -65.796711, 18.083746 ], [ -65.796289, 18.079835 ], [ -65.794686, 18.078607 ], [ -65.795028, 18.073561 ], [ -65.801831, 18.058527 ], [ -65.809174, 18.056818 ], [ -65.817107, 18.063378 ], [ -65.825848, 18.057482 ], [ -65.831090, 18.050664 ], [ -65.834274, 18.038988 ], [ -65.832429, 18.014916 ], [ -65.839591, 18.015077 ], [ -65.870335, 18.006597 ], [ -65.875122, 18.002826 ], [ -65.884937, 17.988521 ], [ -65.896102, 17.990260 ], [ -65.905319, 17.983974 ], [ -65.924738, 17.976087 ], [ -65.976611, 17.967669 ], [ -65.984550, 17.969411 ], [ -65.985358, 17.971854 ], [ -65.995185, 17.978989 ], [ -66.007731, 17.980541 ], [ -66.017308, 17.979583 ], [ -66.024000, 17.975896 ], [ -66.046585, 17.954853 ], [ -66.049033, 17.954561 ], [ -66.058217, 17.959238 ], [ -66.068678, 17.966335 ], [ -66.081410, 17.966552 ], [ -66.116194, 17.949141 ], [ -66.127009, 17.946953 ], [ -66.140661, 17.941020 ], [ -66.147912, 17.933963 ], [ -66.155387, 17.929406 ], [ -66.159742, 17.928613 ], [ -66.161232, 17.931747 ], [ -66.175626, 17.933565 ], [ -66.186914, 17.935363 ], [ -66.189726, 17.933936 ], [ -66.200174, 17.929515 ], [ -66.206961, 17.932268 ], [ -66.213374, 17.944614 ], [ -66.202655, 17.944753 ], [ -66.185554, 17.940997 ], [ -66.179548, 17.943727 ], [ -66.174839, 17.948214 ], [ -66.176814, 17.950438 ], [ -66.206807, 17.963307 ], [ -66.215355, 17.959376 ], [ -66.218081, 17.957290 ], [ -66.231519, 17.943912 ], [ -66.229181, 17.934651 ], [ -66.232013, 17.931154 ], [ -66.252737, 17.934574 ], [ -66.260684, 17.936083 ], [ -66.270905, 17.947098 ], [ -66.275651, 17.948260 ], [ -66.290782, 17.946491 ], [ -66.297679, 17.959148 ], [ -66.316950, 17.976683 ], [ -66.323659, 17.978536 ], [ -66.338390, 17.976458 ], [ -66.362511, 17.968231 ], [ -66.365098, 17.964832 ], [ -66.368777, 17.957717 ], [ -66.371591, 17.951469 ], [ -66.385059, 17.939004 ], [ -66.391227, 17.945819 ], [ -66.398945, 17.950925 ], [ -66.412131, 17.957286 ], [ -66.445481, 17.979379 ], [ -66.454888, 17.986784 ], [ -66.461342, 17.990273 ], [ -66.491396, 17.990262 ], [ -66.510143, 17.985618 ], [ -66.583233, 17.961229 ], [ -66.589658, 17.969386 ], [ -66.594392, 17.970682 ], [ -66.605035, 17.969015 ], [ -66.623788, 17.981050 ], [ -66.631944, 17.982746 ], [ -66.645651, 17.980260 ], [ -66.657797, 17.974605 ], [ -66.664391, 17.968259 ], [ -66.672819, 17.966451 ], [ -66.709856, 17.982109 ], [ -66.713394, 17.987763 ], [ -66.716957, 17.990344 ], [ -66.731118, 17.991658 ], [ -66.750312, 17.986948 ], [ -66.754397, 17.977963 ], [ -66.756439, 17.976431 ], [ -66.761442, 17.979392 ], [ -66.762770, 17.985008 ], [ -66.763280, 18.000018 ], [ -66.764491, 18.006317 ], [ -66.770307, 18.005955 ], [ -66.799656, 17.992450 ], [ -66.806866, 17.983786 ], [ -66.807924, 17.979606 ], [ -66.806903, 17.976046 ], [ -66.805683, 17.975052 ], [ -66.795106, 17.977438 ], [ -66.789302, 17.980793 ], [ -66.784953, 17.978326 ], [ -66.787245, 17.972914 ], [ -66.808270, 17.965635 ], [ -66.822400, 17.954499 ], [ -66.838584, 17.949931 ], [ -66.856474, 17.956553 ], [ -66.862545, 17.952022 ], [ -66.871697, 17.952707 ], [ -66.883440, 17.952526 ], [ -66.899639, 17.948298 ], [ -66.904585, 17.950527 ], [ -66.906532, 17.955356 ], [ -66.906276, 17.963368 ], [ -66.924529, 17.972808 ], [ -66.928651, 17.970204 ], [ -66.930414, 17.963127 ], [ -66.916127, 17.959102 ], [ -66.909483, 17.952559 ], [ -66.909359, 17.949880 ], [ -66.912522, 17.947446 ], [ -66.930313, 17.943389 ], [ -66.932636, 17.939998 ], [ -66.931581, 17.936900 ], [ -66.919298, 17.932062 ], [ -66.923826, 17.926923 ], [ -66.927261, 17.926875 ], [ -66.959998, 17.940216 ], [ -66.980516, 17.951648 ], [ -66.982669, 17.955100 ], [ -66.982206, 17.961192 ], [ -66.987287, 17.970663 ], [ -66.996738, 17.972899 ], [ -67.003972, 17.970799 ], [ -67.014744, 17.968468 ], [ -67.024522, 17.970722 ], [ -67.062478, 17.973819 ], [ -67.076534, 17.967759 ], [ -67.089827, 17.951418 ], [ -67.101468, 17.946621 ], [ -67.109985, 17.945806 ], [ -67.128251, 17.948153 ], [ -67.133733, 17.951919 ], [ -67.167031, 17.963073 ], [ -67.178566, 17.964792 ], [ -67.183508, 17.962706 ], [ -67.188717, 17.950989 ], [ -67.187474, 17.946252 ], [ -67.183694, 17.937982 ], [ -67.183457, 17.931135 ], [ -67.194785, 17.932826 ], [ -67.196924, 17.935651 ], [ -67.197273, 17.937461 ], [ -67.197517, 17.941514 ], [ -67.197668, 17.943549 ], [ -67.198988, 17.947820 ], [ -67.200973, 17.949896 ], [ -67.210034, 17.953595 ], [ -67.212101, 17.956027 ], [ -67.214330, 17.962436 ], [ -67.215271, 17.983464 ], [ -67.211973, 17.992993 ], [ -67.207694, 17.998019 ], [ -67.177893, 18.008882 ], [ -67.174299, 18.011149 ], [ -67.172397, 18.014906 ], [ -67.172138, 18.021422 ], [ -67.173761, 18.024548 ], [ -67.193269, 18.031850 ], [ -67.209887, 18.035439 ], [ -67.196694, 18.066491 ], [ -67.190656, 18.064269 ], [ -67.184589, 18.067750 ], [ -67.183938, 18.069914 ], [ -67.186465, 18.074195 ], [ -67.192999, 18.076877 ], [ -67.198212, 18.076828 ], [ -67.199314, 18.091135 ], [ -67.195290, 18.096149 ], [ -67.183921, 18.103683 ], [ -67.182182, 18.108507 ], [ -67.176554, 18.151046 ], [ -67.178618, 18.159318 ], [ -67.180822, 18.168055 ], [ -67.155185, 18.195001 ], [ -67.152665, 18.203493 ], [ -67.158001, 18.216719 ], [ -67.173000, 18.230666 ], [ -67.175429, 18.248008 ], [ -67.187843, 18.266671 ], [ -67.189971, 18.281015 ], [ -67.196056, 18.290443 ], [ -67.209963, 18.294974 ], [ -67.226081, 18.296722 ], [ -67.235137, 18.299935 ], [ -67.267484, 18.353149 ], [ -67.271350, 18.362329 ], [ -67.268259, 18.366989 ], [ -67.260671, 18.370197 ], [ -67.226744, 18.378247 ], [ -67.216998, 18.382078 ], [ -67.202167, 18.389908 ], [ -67.159608, 18.415915 ], [ -67.156599, 18.418983 ], [ -67.155245, 18.424401 ], [ -67.156619, 18.439562 ], [ -67.161746, 18.453462 ], [ -67.169011, 18.466352 ], [ -67.169016, 18.478488 ], [ -67.164144, 18.487396 ], [ -67.142830, 18.505485 ], [ -67.138249, 18.507776 ], [ -67.125655, 18.511706 ], [ -67.093752, 18.515757 ], [ -67.079290, 18.513256 ], [ -67.020276, 18.510603 ], [ -66.988958, 18.497724 ], [ -66.959540, 18.489878 ] ] ], [ [ [ -66.523478, 17.896176 ], [ -66.513454, 17.902857 ], [ -66.509783, 17.900466 ], [ -66.509525, 17.898552 ], [ -66.515349, 17.892700 ], [ -66.528572, 17.884813 ], [ -66.526072, 17.892937 ], [ -66.523478, 17.896176 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US24", "STATE": "24", "NAME": "Maryland", "LSAD": "", "CENSUSAREA": 9707.241000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -76.071470, 38.203502 ], [ -76.048786, 38.203731 ], [ -76.022170, 38.177882 ], [ -76.021941, 38.171976 ], [ -76.032816, 38.169141 ], [ -76.034038, 38.157902 ], [ -76.031868, 38.148288 ], [ -76.022515, 38.133453 ], [ -76.017790, 38.131367 ], [ -76.012487, 38.131731 ], [ -76.011916, 38.122214 ], [ -76.020496, 38.117044 ], [ -76.021370, 38.107934 ], [ -76.008168, 38.095385 ], [ -76.005904, 38.077170 ], [ -76.011544, 38.072312 ], [ -76.023300, 38.070760 ], [ -76.036676, 38.076509 ], [ -76.059304, 38.095751 ], [ -76.050156, 38.107758 ], [ -76.042083, 38.109862 ], [ -76.039620, 38.111990 ], [ -76.043423, 38.117868 ], [ -76.056811, 38.125123 ], [ -76.061000, 38.127002 ], [ -76.085311, 38.118561 ], [ -76.085947, 38.116658 ], [ -76.090872, 38.114460 ], [ -76.095548, 38.125123 ], [ -76.090649, 38.131185 ], [ -76.089017, 38.141033 ], [ -76.092334, 38.151355 ], [ -76.088639, 38.192649 ], [ -76.071470, 38.203502 ] ] ], [ [ [ -75.993905, 37.953489 ], [ -76.020932, 37.953879 ], [ -76.021714, 37.953887 ], [ -76.029463, 37.953775 ], [ -76.030122, 37.953655 ], [ -76.041402, 37.954006 ], [ -76.041691, 37.954000 ], [ -76.046530, 37.953586 ], [ -76.049608, 37.983628 ], [ -76.048617, 38.014843 ], [ -76.046213, 38.025533 ], [ -76.041668, 38.032148 ], [ -76.020827, 38.039124 ], [ -76.013128, 38.039762 ], [ -76.004592, 38.036805 ], [ -75.991846, 38.025497 ], [ -75.975494, 38.020834 ], [ -75.970168, 38.015685 ], [ -75.970390, 38.006327 ], [ -75.984251, 38.004006 ], [ -75.994730, 37.974694 ], [ -75.988879, 37.960337 ], [ -75.993905, 37.953489 ] ] ], [ [ [ -75.669711, 37.950796 ], [ -75.665057, 37.956282 ], [ -75.663095, 37.961195 ], [ -75.671681, 37.966576 ], [ -75.685995, 37.967607 ], [ -75.713150, 37.976623 ], [ -75.722085, 37.973416 ], [ -75.722662, 37.971310 ], [ -75.727952, 37.967256 ], [ -75.737997, 37.963526 ], [ -75.750244, 37.968873 ], [ -75.759091, 37.970663 ], [ -75.783815, 37.972594 ], [ -75.829901, 37.938556 ], [ -75.832414, 37.933313 ], [ -75.860727, 37.918310 ], [ -75.885032, 37.911717 ], [ -75.892686, 37.916848 ], [ -75.898316, 37.925114 ], [ -75.894065, 37.930790 ], [ -75.890871, 37.954847 ], [ -75.898956, 37.974514 ], [ -75.882768, 38.002995 ], [ -75.875297, 38.011965 ], [ -75.875399, 38.028241 ], [ -75.873190, 38.034375 ], [ -75.857507, 38.038778 ], [ -75.850531, 38.036697 ], [ -75.849980, 38.034294 ], [ -75.847922, 38.034370 ], [ -75.829375, 38.043152 ], [ -75.812913, 38.058932 ], [ -75.819591, 38.066814 ], [ -75.844265, 38.072272 ], [ -75.858944, 38.067323 ], [ -75.860072, 38.065743 ], [ -75.858881, 38.060135 ], [ -75.871503, 38.058870 ], [ -75.874189, 38.060288 ], [ -75.880515, 38.075011 ], [ -75.863810, 38.100968 ], [ -75.842604, 38.113111 ], [ -75.837563, 38.113753 ], [ -75.827674, 38.133438 ], [ -75.843862, 38.144599 ], [ -75.849919, 38.144414 ], [ -75.859540, 38.140542 ], [ -75.866000, 38.134886 ], [ -75.868636, 38.134381 ], [ -75.900355, 38.141150 ], [ -75.937089, 38.124209 ], [ -75.936663, 38.109956 ], [ -75.938484, 38.109976 ], [ -75.945297, 38.113091 ], [ -75.949557, 38.118127 ], [ -75.959616, 38.137141 ], [ -75.951273, 38.161887 ], [ -75.947534, 38.168274 ], [ -75.947280, 38.170792 ], [ -75.951972, 38.176239 ], [ -75.951566, 38.178093 ], [ -75.942375, 38.187066 ], [ -75.888073, 38.203813 ], [ -75.886217, 38.203309 ], [ -75.884603, 38.199751 ], [ -75.877751, 38.198292 ], [ -75.864104, 38.200858 ], [ -75.846377, 38.210477 ], [ -75.851396, 38.226432 ], [ -75.870318, 38.243432 ], [ -75.874653, 38.244514 ], [ -75.883435, 38.244445 ], [ -75.888513, 38.241423 ], [ -75.889356, 38.239500 ], [ -75.885676, 38.231006 ], [ -75.890669, 38.228009 ], [ -75.895689, 38.228561 ], [ -75.900040, 38.232133 ], [ -75.908450, 38.246648 ], [ -75.908272, 38.252045 ], [ -75.911143, 38.257951 ], [ -75.917297, 38.263126 ], [ -75.919448, 38.264056 ], [ -75.909637, 38.273357 ], [ -75.906306, 38.281923 ], [ -75.908685, 38.287634 ], [ -75.908976, 38.292664 ], [ -75.865325, 38.344908 ], [ -75.866331, 38.351403 ], [ -75.872517, 38.353307 ], [ -75.889385, 38.349720 ], [ -75.902974, 38.344741 ], [ -75.911064, 38.338554 ], [ -75.912968, 38.327609 ], [ -75.932348, 38.309506 ], [ -75.938577, 38.272329 ], [ -75.951497, 38.266949 ], [ -75.954908, 38.263998 ], [ -75.954542, 38.252894 ], [ -75.948796, 38.248802 ], [ -75.944500, 38.249145 ], [ -75.940697, 38.246902 ], [ -75.946414, 38.238890 ], [ -75.972212, 38.233300 ], [ -75.964119, 38.241085 ], [ -75.962235, 38.247540 ], [ -75.963453, 38.251793 ], [ -75.984274, 38.265155 ], [ -75.985815, 38.276466 ], [ -75.990385, 38.282915 ], [ -76.007375, 38.304318 ], [ -76.016291, 38.307206 ], [ -76.017364, 38.309106 ], [ -76.008647, 38.312261 ], [ -75.981345, 38.315147 ], [ -75.969290, 38.320164 ], [ -75.964237, 38.324285 ], [ -75.961944, 38.332572 ], [ -75.961948, 38.341431 ], [ -75.973876, 38.365850 ], [ -76.002282, 38.374477 ], [ -76.006949, 38.370216 ], [ -76.011869, 38.360582 ], [ -76.012149, 38.357077 ], [ -76.010217, 38.353211 ], [ -76.016682, 38.332429 ], [ -76.033947, 38.323211 ], [ -76.041618, 38.322137 ], [ -76.045599, 38.318246 ], [ -76.049580, 38.309594 ], [ -76.050220, 38.304101 ], [ -76.030532, 38.287960 ], [ -76.027487, 38.280108 ], [ -76.038935, 38.254932 ], [ -76.044251, 38.249373 ], [ -76.044108, 38.241682 ], [ -76.035695, 38.230556 ], [ -76.032044, 38.216684 ], [ -76.058010, 38.227079 ], [ -76.069502, 38.238455 ], [ -76.074897, 38.252181 ], [ -76.099720, 38.253647 ], [ -76.107592, 38.262525 ], [ -76.102549, 38.277153 ], [ -76.111296, 38.286946 ], [ -76.138524, 38.281385 ], [ -76.149876, 38.284663 ], [ -76.160474, 38.290983 ], [ -76.166154, 38.290431 ], [ -76.173555, 38.285230 ], [ -76.180165, 38.276956 ], [ -76.175783, 38.261551 ], [ -76.163249, 38.248913 ], [ -76.146297, 38.249678 ], [ -76.126623, 38.242949 ], [ -76.125756, 38.238348 ], [ -76.131332, 38.232880 ], [ -76.140068, 38.231305 ], [ -76.151035, 38.234215 ], [ -76.173350, 38.247037 ], [ -76.188644, 38.267434 ], [ -76.190531, 38.277139 ], [ -76.211446, 38.302656 ], [ -76.226376, 38.309988 ], [ -76.243897, 38.310313 ], [ -76.254473, 38.315120 ], [ -76.258189, 38.318373 ], [ -76.266602, 38.339502 ], [ -76.264186, 38.346436 ], [ -76.259261, 38.341595 ], [ -76.238452, 38.347986 ], [ -76.238611, 38.350233 ], [ -76.249666, 38.364214 ], [ -76.256788, 38.366712 ], [ -76.273003, 38.366483 ], [ -76.282271, 38.393118 ], [ -76.280551, 38.403143 ], [ -76.283020, 38.413512 ], [ -76.301488, 38.439767 ], [ -76.320843, 38.459862 ], [ -76.331559, 38.473548 ], [ -76.336360, 38.492235 ], [ -76.327257, 38.500121 ], [ -76.318054, 38.498199 ], [ -76.289507, 38.503906 ], [ -76.283595, 38.504157 ], [ -76.281761, 38.502165 ], [ -76.263968, 38.503452 ], [ -76.260350, 38.506255 ], [ -76.247300, 38.523818 ], [ -76.244396, 38.536966 ], [ -76.248885, 38.539023 ], [ -76.253624, 38.539393 ], [ -76.274057, 38.531207 ], [ -76.278106, 38.532468 ], [ -76.281047, 38.536130 ], [ -76.277461, 38.541851 ], [ -76.275913, 38.548809 ], [ -76.279640, 38.557231 ], [ -76.290043, 38.569158 ], [ -76.308321, 38.571769 ], [ -76.305172, 38.575293 ], [ -76.273496, 38.591390 ], [ -76.268633, 38.597753 ], [ -76.279589, 38.609520 ], [ -76.285262, 38.626185 ], [ -76.271827, 38.615661 ], [ -76.264155, 38.615109 ], [ -76.246510, 38.626282 ], [ -76.236650, 38.628598 ], [ -76.231187, 38.614010 ], [ -76.212427, 38.606738 ], [ -76.203065, 38.610741 ], [ -76.202598, 38.613011 ], [ -76.190902, 38.621092 ], [ -76.174969, 38.628791 ], [ -76.170066, 38.629225 ], [ -76.160148, 38.625452 ], [ -76.147158, 38.636840 ], [ -76.155611, 38.658083 ], [ -76.175159, 38.673236 ], [ -76.196716, 38.672860 ], [ -76.200334, 38.670774 ], [ -76.212808, 38.681892 ], [ -76.238725, 38.712845 ], [ -76.239841, 38.719756 ], [ -76.237040, 38.724518 ], [ -76.238685, 38.735434 ], [ -76.255093, 38.736476 ], [ -76.270277, 38.724385 ], [ -76.271596, 38.713216 ], [ -76.275015, 38.712714 ], [ -76.298499, 38.718005 ], [ -76.299171, 38.719287 ], [ -76.295957, 38.724162 ], [ -76.299401, 38.727395 ], [ -76.312756, 38.730708 ], [ -76.316146, 38.729586 ], [ -76.331479, 38.713266 ], [ -76.334017, 38.703127 ], [ -76.321865, 38.689512 ], [ -76.322418, 38.679304 ], [ -76.340341, 38.671245 ], [ -76.347998, 38.686234 ], [ -76.340543, 38.730338 ], [ -76.341302, 38.751901 ], [ -76.334619, 38.772911 ], [ -76.323768, 38.779287 ], [ -76.310081, 38.796846 ], [ -76.308922, 38.813346 ], [ -76.300889, 38.826190 ], [ -76.297800, 38.828314 ], [ -76.288455, 38.827347 ], [ -76.277411, 38.831419 ], [ -76.278151, 38.835494 ], [ -76.271575, 38.851771 ], [ -76.264221, 38.851572 ], [ -76.265808, 38.847512 ], [ -76.250364, 38.825438 ], [ -76.245886, 38.822232 ], [ -76.219328, 38.812371 ], [ -76.198138, 38.814440 ], [ -76.193430, 38.821787 ], [ -76.191090, 38.829660 ], [ -76.197705, 38.843712 ], [ -76.202598, 38.862616 ], [ -76.200082, 38.882885 ], [ -76.205063, 38.892726 ], [ -76.203638, 38.928382 ], [ -76.213842, 38.937366 ], [ -76.232038, 38.942518 ], [ -76.250157, 38.938667 ], [ -76.250868, 38.928250 ], [ -76.248023, 38.923790 ], [ -76.249674, 38.920907 ], [ -76.256397, 38.918829 ], [ -76.262226, 38.919976 ], [ -76.264683, 38.924576 ], [ -76.264943, 38.930297 ], [ -76.273083, 38.941927 ], [ -76.295911, 38.928663 ], [ -76.299431, 38.918542 ], [ -76.293867, 38.910121 ], [ -76.293254, 38.902568 ], [ -76.308425, 38.898404 ], [ -76.317947, 38.911312 ], [ -76.324097, 38.911174 ], [ -76.336104, 38.905977 ], [ -76.338501, 38.892474 ], [ -76.335364, 38.886021 ], [ -76.331030, 38.864320 ], [ -76.334019, 38.860238 ], [ -76.340587, 38.855740 ], [ -76.350390, 38.857399 ], [ -76.361141, 38.851992 ], [ -76.368195, 38.836125 ], [ -76.375086, 38.839474 ], [ -76.376202, 38.850461 ], [ -76.364678, 38.873831 ], [ -76.365658, 38.907477 ], [ -76.361727, 38.939175 ], [ -76.353828, 38.957234 ], [ -76.322679, 38.999602 ], [ -76.322296, 39.006375 ], [ -76.323557, 39.008961 ], [ -76.320274, 39.023013 ], [ -76.311766, 39.035257 ], [ -76.301847, 39.039651 ], [ -76.301027, 39.031595 ], [ -76.302846, 39.025828 ], [ -76.293962, 39.003948 ], [ -76.277478, 38.982492 ], [ -76.258813, 38.983664 ], [ -76.229277, 38.977580 ], [ -76.218929, 38.970538 ], [ -76.202360, 38.973079 ], [ -76.163988, 38.999541 ], [ -76.163616, 39.010057 ], [ -76.167574, 39.018273 ], [ -76.178281, 39.031663 ], [ -76.184207, 39.046264 ], [ -76.175284, 39.058805 ], [ -76.169060, 39.062787 ], [ -76.158960, 39.065486 ], [ -76.150528, 39.079421 ], [ -76.145174, 39.092824 ], [ -76.183908, 39.096344 ], [ -76.203383, 39.085626 ], [ -76.210041, 39.064410 ], [ -76.212616, 39.041158 ], [ -76.208502, 39.024818 ], [ -76.200666, 39.014520 ], [ -76.209114, 39.010010 ], [ -76.231765, 39.018518 ], [ -76.242687, 39.028926 ], [ -76.240905, 39.039798 ], [ -76.237065, 39.045521 ], [ -76.231117, 39.061017 ], [ -76.231748, 39.082826 ], [ -76.233457, 39.091385 ], [ -76.252968, 39.133626 ], [ -76.260894, 39.143402 ], [ -76.278527, 39.145764 ], [ -76.274637, 39.165490 ], [ -76.266602, 39.180523 ], [ -76.255831, 39.191595 ], [ -76.251032, 39.199214 ], [ -76.232051, 39.233341 ], [ -76.219338, 39.261997 ], [ -76.211253, 39.269812 ], [ -76.203031, 39.269871 ], [ -76.185674, 39.285367 ], [ -76.181496, 39.291797 ], [ -76.177704, 39.298701 ], [ -76.176778, 39.306447 ], [ -76.179092, 39.310098 ], [ -76.186024, 39.312462 ], [ -76.186647, 39.315475 ], [ -76.185581, 39.319334 ], [ -76.170422, 39.332094 ], [ -76.159673, 39.335909 ], [ -76.145524, 39.334399 ], [ -76.133225, 39.340491 ], [ -76.136971, 39.344414 ], [ -76.134950, 39.351070 ], [ -76.116356, 39.360925 ], [ -76.110527, 39.372257 ], [ -76.049846, 39.370644 ], [ -76.032923, 39.367414 ], [ -76.022990, 39.361896 ], [ -76.002408, 39.367501 ], [ -76.002515, 39.385024 ], [ -76.035568, 39.386180 ], [ -76.039932, 39.388080 ], [ -76.040962, 39.394237 ], [ -76.035002, 39.401994 ], [ -76.016531, 39.408465 ], [ -76.006880, 39.414527 ], [ -75.997396, 39.430314 ], [ -75.982585, 39.435287 ], [ -75.976747, 39.444627 ], [ -75.976601, 39.447808 ], [ -75.990005, 39.458646 ], [ -75.998276, 39.457182 ], [ -76.002513, 39.450204 ], [ -76.009452, 39.449201 ], [ -76.012312, 39.453115 ], [ -76.002926, 39.469642 ], [ -75.996570, 39.476658 ], [ -75.994135, 39.488743 ], [ -75.986298, 39.510398 ], [ -75.976057, 39.529968 ], [ -75.966955, 39.538650 ], [ -75.967221, 39.550140 ], [ -75.970337, 39.557637 ], [ -75.992633, 39.563098 ], [ -75.999669, 39.560488 ], [ -76.006341, 39.550352 ], [ -76.063811, 39.546610 ], [ -76.096072, 39.536912 ], [ -76.117253, 39.496068 ], [ -76.113929, 39.486701 ], [ -76.104665, 39.478792 ], [ -76.098315, 39.476116 ], [ -76.083286, 39.477860 ], [ -76.071975, 39.475047 ], [ -76.060931, 39.452208 ], [ -76.060989, 39.447722 ], [ -76.081176, 39.436712 ], [ -76.083269, 39.438321 ], [ -76.102232, 39.435659 ], [ -76.116820, 39.427614 ], [ -76.121889, 39.421226 ], [ -76.146373, 39.405310 ], [ -76.158774, 39.406310 ], [ -76.171474, 39.392210 ], [ -76.180074, 39.377609 ], [ -76.226976, 39.349908 ], [ -76.233776, 39.352008 ], [ -76.239877, 39.361408 ], [ -76.243377, 39.361808 ], [ -76.250107, 39.361320 ], [ -76.266365, 39.353352 ], [ -76.265277, 39.350008 ], [ -76.258377, 39.345808 ], [ -76.253928, 39.336768 ], [ -76.263577, 39.334308 ], [ -76.276078, 39.322908 ], [ -76.280778, 39.311608 ], [ -76.281578, 39.302108 ], [ -76.297878, 39.302408 ], [ -76.291078, 39.318108 ], [ -76.298778, 39.329208 ], [ -76.298778, 39.340208 ], [ -76.294978, 39.346608 ], [ -76.295678, 39.350008 ], [ -76.311679, 39.355808 ], [ -76.323679, 39.357208 ], [ -76.341443, 39.354217 ], [ -76.333924, 39.333935 ], [ -76.339570, 39.324681 ], [ -76.327579, 39.314108 ], [ -76.341432, 39.302910 ], [ -76.355495, 39.312155 ], [ -76.364390, 39.311840 ], [ -76.380662, 39.299161 ], [ -76.384901, 39.275928 ], [ -76.395136, 39.269293 ], [ -76.402355, 39.258315 ], [ -76.400942, 39.249040 ], [ -76.402317, 39.243540 ], [ -76.398880, 39.239416 ], [ -76.399123, 39.229047 ], [ -76.417681, 39.219808 ], [ -76.425281, 39.205708 ], [ -76.442482, 39.195408 ], [ -76.463483, 39.205908 ], [ -76.480083, 39.205108 ], [ -76.488883, 39.202208 ], [ -76.498384, 39.204808 ], [ -76.500984, 39.209376 ], [ -76.520584, 39.223508 ], [ -76.534285, 39.213208 ], [ -76.535885, 39.211008 ], [ -76.533085, 39.207608 ], [ -76.535385, 39.203808 ], [ -76.534185, 39.190608 ], [ -76.525785, 39.177908 ], [ -76.508384, 39.169408 ], [ -76.500926, 39.161286 ], [ -76.484023, 39.164407 ], [ -76.475983, 39.161109 ], [ -76.471483, 39.154709 ], [ -76.452782, 39.143509 ], [ -76.428681, 39.131709 ], [ -76.432481, 39.126709 ], [ -76.432981, 39.113209 ], [ -76.421860, 39.081442 ], [ -76.423081, 39.074210 ], [ -76.438928, 39.052788 ], [ -76.405081, 39.033211 ], [ -76.397780, 39.022611 ], [ -76.394080, 39.011311 ], [ -76.422181, 38.989011 ], [ -76.448981, 38.982811 ], [ -76.450481, 38.977612 ], [ -76.454581, 38.974512 ], [ -76.474198, 38.972647 ], [ -76.474882, 38.967312 ], [ -76.471281, 38.956512 ], [ -76.463081, 38.948612 ], [ -76.457781, 38.948412 ], [ -76.450280, 38.941113 ], [ -76.461880, 38.924013 ], [ -76.458080, 38.914313 ], [ -76.459479, 38.907113 ], [ -76.469380, 38.907613 ], [ -76.469480, 38.911513 ], [ -76.475761, 38.914469 ], [ -76.493680, 38.910013 ], [ -76.493880, 38.899614 ], [ -76.492780, 38.895614 ], [ -76.490880, 38.894514 ], [ -76.489380, 38.887414 ], [ -76.490680, 38.884814 ], [ -76.519442, 38.863135 ], [ -76.516944, 38.851157 ], [ -76.509285, 38.848388 ], [ -76.496579, 38.853115 ], [ -76.489878, 38.842815 ], [ -76.489878, 38.838715 ], [ -76.498878, 38.817516 ], [ -76.510078, 38.801216 ], [ -76.524679, 38.795016 ], [ -76.527479, 38.791816 ], [ -76.526979, 38.787016 ], [ -76.535379, 38.778116 ], [ -76.559884, 38.767361 ], [ -76.557535, 38.744687 ], [ -76.552743, 38.735350 ], [ -76.544475, 38.727705 ], [ -76.529868, 38.728435 ], [ -76.527180, 38.727062 ], [ -76.526655, 38.724430 ], [ -76.532537, 38.699669 ], [ -76.532398, 38.678363 ], [ -76.524620, 38.645956 ], [ -76.515554, 38.629361 ], [ -76.511278, 38.615745 ], [ -76.516340, 38.590229 ], [ -76.515106, 38.555763 ], [ -76.517506, 38.539149 ], [ -76.515706, 38.528988 ], [ -76.506023, 38.504610 ], [ -76.492699, 38.482849 ], [ -76.455799, 38.451233 ], [ -76.456002, 38.447891 ], [ -76.450937, 38.442422 ], [ -76.436271, 38.433429 ], [ -76.415384, 38.414682 ], [ -76.402710, 38.396003 ], [ -76.393378, 38.389477 ], [ -76.388348, 38.387781 ], [ -76.386229, 38.382013 ], [ -76.387002, 38.361267 ], [ -76.404940, 38.341089 ], [ -76.409291, 38.325891 ], [ -76.402894, 38.311402 ], [ -76.381493, 38.303130 ], [ -76.375023, 38.299419 ], [ -76.374481, 38.296348 ], [ -76.394171, 38.278233 ], [ -76.398852, 38.266997 ], [ -76.399320, 38.259284 ], [ -76.385244, 38.217751 ], [ -76.361877, 38.192048 ], [ -76.353516, 38.178135 ], [ -76.329705, 38.155184 ], [ -76.320136, 38.138339 ], [ -76.338535, 38.119472 ], [ -76.337402, 38.110820 ], [ -76.330794, 38.099331 ], [ -76.329308, 38.071660 ], [ -76.319476, 38.043315 ], [ -76.322093, 38.036503 ], [ -76.326994, 38.045105 ], [ -76.332812, 38.049938 ], [ -76.341404, 38.053697 ], [ -76.352750, 38.053182 ], [ -76.361237, 38.059542 ], [ -76.371790, 38.079565 ], [ -76.392335, 38.102896 ], [ -76.405368, 38.106974 ], [ -76.413160, 38.106884 ], [ -76.416550, 38.104459 ], [ -76.421214, 38.106039 ], [ -76.430425, 38.119383 ], [ -76.429581, 38.126165 ], [ -76.439841, 38.138933 ], [ -76.459689, 38.139484 ], [ -76.469798, 38.119264 ], [ -76.469738, 38.115534 ], [ -76.466404, 38.111392 ], [ -76.465330, 38.105830 ], [ -76.473266, 38.103035 ], [ -76.476222, 38.104709 ], [ -76.481036, 38.115873 ], [ -76.499842, 38.137189 ], [ -76.508825, 38.140713 ], [ -76.514824, 38.141219 ], [ -76.522418, 38.139391 ], [ -76.529868, 38.134083 ], [ -76.540380, 38.152991 ], [ -76.545335, 38.165373 ], [ -76.547333, 38.175673 ], [ -76.552957, 38.187209 ], [ -76.566297, 38.198492 ], [ -76.590637, 38.214212 ], [ -76.632544, 38.225657 ], [ -76.643929, 38.225080 ], [ -76.673462, 38.234401 ], [ -76.716376, 38.233231 ], [ -76.740055, 38.235227 ], [ -76.752286, 38.222121 ], [ -76.778625, 38.228470 ], [ -76.797452, 38.236918 ], [ -76.811647, 38.250129 ], [ -76.811927, 38.252115 ], [ -76.805949, 38.252275 ], [ -76.805224, 38.253648 ], [ -76.802347, 38.280743 ], [ -76.821569, 38.299829 ], [ -76.824889, 38.301152 ], [ -76.846252, 38.297718 ], [ -76.846220, 38.291768 ], [ -76.840383, 38.289184 ], [ -76.834803, 38.274012 ], [ -76.837789, 38.261609 ], [ -76.842139, 38.254491 ], [ -76.847074, 38.256160 ], [ -76.864292, 38.268945 ], [ -76.886535, 38.277004 ], [ -76.908506, 38.288430 ], [ -76.920932, 38.291568 ], [ -76.922177, 38.311339 ], [ -76.923629, 38.314932 ], [ -76.929554, 38.321088 ], [ -76.942132, 38.329601 ], [ -76.953928, 38.333282 ], [ -76.975492, 38.347327 ], [ -76.983582, 38.362999 ], [ -76.988280, 38.394975 ], [ -76.998585, 38.409294 ], [ -77.001638, 38.421952 ], [ -77.016371, 38.445572 ], [ -77.040638, 38.444618 ], [ -77.044188, 38.443016 ], [ -77.075489, 38.424710 ], [ -77.086393, 38.414755 ], [ -77.091073, 38.407546 ], [ -77.106571, 38.406237 ], [ -77.110586, 38.409210 ], [ -77.123325, 38.410646 ], [ -77.127737, 38.400833 ], [ -77.136728, 38.391799 ], [ -77.186680, 38.365636 ], [ -77.207312, 38.359867 ], [ -77.216729, 38.363159 ], [ -77.250172, 38.382781 ], [ -77.264238, 38.414282 ], [ -77.259962, 38.427902 ], [ -77.259962, 38.435821 ], [ -77.274220, 38.481770 ], [ -77.263599, 38.512344 ], [ -77.237724, 38.551870 ], [ -77.221117, 38.555217 ], [ -77.183767, 38.600699 ], [ -77.169671, 38.606870 ], [ -77.148651, 38.605600 ], [ -77.129084, 38.614364 ], [ -77.124630, 38.619778 ], [ -77.130200, 38.635017 ], [ -77.132201, 38.641217 ], [ -77.131901, 38.644217 ], [ -77.135901, 38.649817 ], [ -77.132501, 38.673816 ], [ -77.122001, 38.685816 ], [ -77.105900, 38.696815 ], [ -77.102700, 38.698315 ], [ -77.099000, 38.698615 ], [ -77.091800, 38.703415 ], [ -77.079499, 38.709515 ], [ -77.072807, 38.711526 ], [ -77.071861, 38.710581 ], [ -77.065322, 38.709564 ], [ -77.053199, 38.709915 ], [ -77.045498, 38.714315 ], [ -77.042298, 38.718515 ], [ -77.041398, 38.724515 ], [ -77.040998, 38.737914 ], [ -77.041898, 38.741514 ], [ -77.041098, 38.773313 ], [ -77.040098, 38.789913 ], [ -77.039498, 38.791113 ], [ -77.038598, 38.791513 ], [ -77.001397, 38.821513 ], [ -76.999997, 38.821913 ], [ -76.992697, 38.828213 ], [ -76.979497, 38.837812 ], [ -76.953696, 38.858512 ], [ -76.949696, 38.861312 ], [ -76.920195, 38.884412 ], [ -76.919295, 38.885112 ], [ -76.910795, 38.891712 ], [ -76.909395, 38.892812 ], [ -76.935096, 38.913311 ], [ -77.002498, 38.965410 ], [ -77.008298, 38.970110 ], [ -77.013798, 38.974410 ], [ -77.015598, 38.975910 ], [ -77.036299, 38.991710 ], [ -77.040999, 38.995110 ], [ -77.054299, 38.985110 ], [ -77.091500, 38.956510 ], [ -77.100700, 38.948910 ], [ -77.104500, 38.946410 ], [ -77.119900, 38.934311 ], [ -77.127601, 38.940010 ], [ -77.131901, 38.947410 ], [ -77.137701, 38.955310 ], [ -77.146601, 38.964210 ], [ -77.148179, 38.965002 ], [ -77.151084, 38.965832 ], [ -77.165301, 38.968010 ], [ -77.166901, 38.968110 ], [ -77.168001, 38.967410 ], [ -77.171901, 38.967510 ], [ -77.183002, 38.968810 ], [ -77.188302, 38.967510 ], [ -77.197502, 38.966810 ], [ -77.202502, 38.967910 ], [ -77.203602, 38.968910 ], [ -77.209302, 38.970410 ], [ -77.211502, 38.969410 ], [ -77.221502, 38.971310 ], [ -77.224969, 38.973349 ], [ -77.228395, 38.978404 ], [ -77.229992, 38.979858 ], [ -77.231601, 38.979917 ], [ -77.232268, 38.979502 ], [ -77.234803, 38.976310 ], [ -77.249803, 38.985909 ], [ -77.248303, 38.992309 ], [ -77.249203, 38.993709 ], [ -77.253003, 38.995709 ], [ -77.255703, 39.002409 ], [ -77.251803, 39.011409 ], [ -77.246903, 39.014809 ], [ -77.244603, 39.020109 ], [ -77.246003, 39.024909 ], [ -77.248403, 39.026909 ], [ -77.255303, 39.030009 ], [ -77.266004, 39.031909 ], [ -77.274706, 39.034091 ], [ -77.293105, 39.046508 ], [ -77.301005, 39.049508 ], [ -77.310705, 39.052008 ], [ -77.314905, 39.052208 ], [ -77.324206, 39.056508 ], [ -77.333706, 39.059508 ], [ -77.334010, 39.060989 ], [ -77.335511, 39.061771 ], [ -77.340287, 39.062991 ], [ -77.350311, 39.062133 ], [ -77.359702, 39.062004 ], [ -77.367529, 39.061087 ], [ -77.375079, 39.061297 ], [ -77.380108, 39.062808 ], [ -77.385680, 39.061987 ], [ -77.399204, 39.064784 ], [ -77.404593, 39.064496 ], [ -77.415430, 39.066435 ], [ -77.423180, 39.066878 ], [ -77.437400, 39.070611 ], [ -77.452827, 39.072468 ], [ -77.458202, 39.073723 ], [ -77.461450, 39.075151 ], [ -77.462617, 39.076248 ], [ -77.469443, 39.086387 ], [ -77.472414, 39.092524 ], [ -77.477010, 39.100331 ], [ -77.481279, 39.105658 ], [ -77.485800, 39.109303 ], [ -77.494955, 39.113038 ], [ -77.499711, 39.113950 ], [ -77.515320, 39.118591 ], [ -77.519929, 39.120925 ], [ -77.524559, 39.127821 ], [ -77.526728, 39.137315 ], [ -77.527282, 39.146236 ], [ -77.524872, 39.148455 ], [ -77.521222, 39.161057 ], [ -77.516426, 39.170891 ], [ -77.510631, 39.178484 ], [ -77.505162, 39.182050 ], [ -77.485971, 39.185665 ], [ -77.478596, 39.189168 ], [ -77.477362, 39.190495 ], [ -77.475013, 39.194934 ], [ -77.475929, 39.202024 ], [ -77.473610, 39.208407 ], [ -77.470113, 39.211840 ], [ -77.459883, 39.218682 ], [ -77.457943, 39.222023 ], [ -77.457680, 39.225020 ], [ -77.458120, 39.226140 ], [ -77.460210, 39.228359 ], [ -77.471213, 39.234509 ], [ -77.480807, 39.241664 ], [ -77.484664, 39.246123 ], [ -77.486813, 39.247586 ], [ -77.496606, 39.251045 ], [ -77.508427, 39.252630 ], [ -77.519634, 39.257232 ], [ -77.520986, 39.258491 ], [ -77.522486, 39.259086 ], [ -77.534461, 39.262361 ], [ -77.540581, 39.264947 ], [ -77.543228, 39.266937 ], [ -77.544258, 39.269660 ], [ -77.545846, 39.271535 ], [ -77.551054, 39.275882 ], [ -77.553114, 39.279268 ], [ -77.560854, 39.286152 ], [ -77.562768, 39.294501 ], [ -77.561826, 39.301913 ], [ -77.563210, 39.303903 ], [ -77.566596, 39.306121 ], [ -77.570041, 39.306350 ], [ -77.578491, 39.305228 ], [ -77.588235, 39.301955 ], [ -77.592739, 39.301290 ], [ -77.598892, 39.301883 ], [ -77.605900, 39.303688 ], [ -77.615939, 39.302722 ], [ -77.636101, 39.307782 ], [ -77.640282, 39.308241 ], [ -77.650997, 39.310784 ], [ -77.666130, 39.317008 ], [ -77.671341, 39.321675 ], [ -77.675846, 39.324192 ], [ -77.681706, 39.323666 ], [ -77.687124, 39.319914 ], [ -77.692984, 39.318450 ], [ -77.697461, 39.318633 ], [ -77.707709, 39.321559 ], [ -77.715865, 39.320641 ], [ -77.719029, 39.321125 ], [ -77.727379, 39.321666 ], [ -77.730914, 39.324684 ], [ -77.735009, 39.327015 ], [ -77.755789, 39.333899 ], [ -77.759615, 39.337331 ], [ -77.761115, 39.339757 ], [ -77.761084, 39.342524 ], [ -77.760435, 39.344171 ], [ -77.759315, 39.345314 ], [ -77.750387, 39.349450 ], [ -77.745930, 39.353221 ], [ -77.743874, 39.359947 ], [ -77.744144, 39.365139 ], [ -77.753274, 39.378320 ], [ -77.753804, 39.379624 ], [ -77.753389, 39.382094 ], [ -77.752209, 39.383328 ], [ -77.749715, 39.384171 ], [ -77.740765, 39.385409 ], [ -77.738084, 39.386211 ], [ -77.736317, 39.387744 ], [ -77.735905, 39.389665 ], [ -77.736409, 39.392684 ], [ -77.740012, 39.401694 ], [ -77.747478, 39.410930 ], [ -77.752680, 39.420174 ], [ -77.753090, 39.423262 ], [ -77.754681, 39.424658 ], [ -77.758720, 39.426810 ], [ -77.763319, 39.428436 ], [ -77.774850, 39.427845 ], [ -77.787266, 39.429335 ], [ -77.792751, 39.430593 ], [ -77.798855, 39.433339 ], [ -77.802542, 39.435969 ], [ -77.803249, 39.437136 ], [ -77.802866, 39.439285 ], [ -77.800860, 39.440841 ], [ -77.788560, 39.442829 ], [ -77.786052, 39.444224 ], [ -77.785580, 39.445367 ], [ -77.786110, 39.447197 ], [ -77.793100, 39.451406 ], [ -77.798144, 39.455981 ], [ -77.799294, 39.458383 ], [ -77.798468, 39.460670 ], [ -77.796196, 39.461722 ], [ -77.793157, 39.462042 ], [ -77.783539, 39.460073 ], [ -77.780471, 39.459867 ], [ -77.779202, 39.460392 ], [ -77.777815, 39.461924 ], [ -77.777815, 39.462816 ], [ -77.778522, 39.463663 ], [ -77.789645, 39.467827 ], [ -77.795634, 39.471259 ], [ -77.796755, 39.472448 ], [ -77.798201, 39.475719 ], [ -77.797787, 39.478760 ], [ -77.796695, 39.480498 ], [ -77.795485, 39.481824 ], [ -77.788519, 39.485048 ], [ -77.781760, 39.487128 ], [ -77.771723, 39.489207 ], [ -77.769125, 39.490281 ], [ -77.767087, 39.491333 ], [ -77.765551, 39.493025 ], [ -77.765403, 39.494397 ], [ -77.765993, 39.495724 ], [ -77.768442, 39.497783 ], [ -77.770950, 39.499087 ], [ -77.774374, 39.499500 ], [ -77.781608, 39.499067 ], [ -77.784442, 39.498061 ], [ -77.786539, 39.496598 ], [ -77.789757, 39.492207 ], [ -77.791765, 39.490789 ], [ -77.795631, 39.489623 ], [ -77.801830, 39.489395 ], [ -77.807821, 39.490241 ], [ -77.820781, 39.493900 ], [ -77.831909, 39.494744 ], [ -77.845666, 39.498628 ], [ -77.847639, 39.500698 ], [ -77.848112, 39.502093 ], [ -77.847611, 39.503351 ], [ -77.845103, 39.505845 ], [ -77.829045, 39.514425 ], [ -77.825650, 39.516895 ], [ -77.823555, 39.524077 ], [ -77.823762, 39.525907 ], [ -77.825357, 39.529177 ], [ -77.827188, 39.530458 ], [ -77.833509, 39.532628 ], [ -77.836935, 39.532170 ], [ -77.839061, 39.531117 ], [ -77.840536, 39.529196 ], [ -77.840651, 39.520941 ], [ -77.841920, 39.518470 ], [ -77.850747, 39.515403 ], [ -77.860195, 39.514325 ], [ -77.863680, 39.515032 ], [ -77.866132, 39.517661 ], [ -77.866518, 39.520039 ], [ -77.866138, 39.524727 ], [ -77.865078, 39.528226 ], [ -77.864315, 39.534813 ], [ -77.864434, 39.536483 ], [ -77.865351, 39.538381 ], [ -77.871530, 39.544278 ], [ -77.886436, 39.551947 ], [ -77.888945, 39.555950 ], [ -77.888648, 39.558054 ], [ -77.887968, 39.559198 ], [ -77.886135, 39.560432 ], [ -77.878451, 39.563493 ], [ -77.872723, 39.563895 ], [ -77.865734, 39.563547 ], [ -77.855847, 39.564607 ], [ -77.842174, 39.564333 ], [ -77.836330, 39.566370 ], [ -77.833217, 39.571016 ], [ -77.830775, 39.581178 ], [ -77.829814, 39.587288 ], [ -77.829753, 39.591050 ], [ -77.831813, 39.601105 ], [ -77.833568, 39.602936 ], [ -77.838008, 39.606125 ], [ -77.842785, 39.607255 ], [ -77.853436, 39.607117 ], [ -77.857800, 39.607880 ], [ -77.868679, 39.611138 ], [ -77.874718, 39.614293 ], [ -77.885124, 39.615775 ], [ -77.887017, 39.614518 ], [ -77.886959, 39.613329 ], [ -77.881936, 39.608112 ], [ -77.881110, 39.606214 ], [ -77.880993, 39.602852 ], [ -77.881823, 39.600039 ], [ -77.882977, 39.598828 ], [ -77.885077, 39.597937 ], [ -77.888477, 39.597343 ], [ -77.916410, 39.602816 ], [ -77.916836, 39.602942 ], [ -77.923298, 39.604852 ], [ -77.925988, 39.607642 ], [ -77.928738, 39.613908 ], [ -77.932862, 39.617676 ], [ -77.937492, 39.619150 ], [ -77.941940, 39.618790 ], [ -77.944622, 39.616772 ], [ -77.944133, 39.614617 ], [ -77.938362, 39.612580 ], [ -77.935450, 39.608076 ], [ -77.936371, 39.594508 ], [ -77.939050, 39.587139 ], [ -77.942150, 39.584933 ], [ -77.946182, 39.584814 ], [ -77.949836, 39.587110 ], [ -77.951955, 39.592709 ], [ -77.952152, 39.597272 ], [ -77.950916, 39.601163 ], [ -77.950599, 39.603944 ], [ -77.952104, 39.606358 ], [ -77.957642, 39.608614 ], [ -77.962092, 39.608702 ], [ -77.966223, 39.607435 ], [ -77.970150, 39.605091 ], [ -77.973967, 39.601071 ], [ -77.976686, 39.599744 ], [ -77.984815, 39.599420 ], [ -77.991437, 39.600194 ], [ -78.002330, 39.600488 ], [ -78.006734, 39.601337 ], [ -78.009985, 39.602893 ], [ -78.011343, 39.604083 ], [ -78.023896, 39.621697 ], [ -78.030140, 39.627462 ], [ -78.035992, 39.635720 ], [ -78.038860, 39.638121 ], [ -78.047672, 39.643107 ], [ -78.049950, 39.645349 ], [ -78.051932, 39.648207 ], [ -78.068291, 39.661060 ], [ -78.074595, 39.666686 ], [ -78.077525, 39.668880 ], [ -78.082260, 39.671166 ], [ -78.088592, 39.671211 ], [ -78.089835, 39.671668 ], [ -78.097118, 39.678161 ], [ -78.101737, 39.680286 ], [ -78.107834, 39.682137 ], [ -78.111830, 39.682593 ], [ -78.123939, 39.685652 ], [ -78.132706, 39.686977 ], [ -78.135221, 39.688305 ], [ -78.143478, 39.690412 ], [ -78.154164, 39.690531 ], [ -78.162126, 39.693643 ], [ -78.171361, 39.695612 ], [ -78.176625, 39.695967 ], [ -78.182759, 39.695110 ], [ -78.191107, 39.690262 ], [ -78.192439, 39.689118 ], [ -78.196701, 39.682074 ], [ -78.201081, 39.677866 ], [ -78.202945, 39.676653 ], [ -78.206763, 39.675990 ], [ -78.227333, 39.676121 ], [ -78.231564, 39.674382 ], [ -78.233138, 39.672875 ], [ -78.233012, 39.670471 ], [ -78.223864, 39.662607 ], [ -78.223597, 39.661097 ], [ -78.225075, 39.658878 ], [ -78.227677, 39.656796 ], [ -78.238059, 39.652081 ], [ -78.246722, 39.644758 ], [ -78.254077, 39.640089 ], [ -78.262189, 39.630464 ], [ -78.263344, 39.626417 ], [ -78.263371, 39.621675 ], [ -78.265088, 39.619274 ], [ -78.266833, 39.618818 ], [ -78.271122, 39.619642 ], [ -78.283039, 39.620470 ], [ -78.308152, 39.629606 ], [ -78.313033, 39.631001 ], [ -78.331934, 39.636054 ], [ -78.351905, 39.640486 ], [ -78.355218, 39.640576 ], [ -78.358264, 39.639660 ], [ -78.359506, 39.638081 ], [ -78.358735, 39.635589 ], [ -78.355567, 39.633463 ], [ -78.353673, 39.630787 ], [ -78.353465, 39.628912 ], [ -78.353878, 39.627722 ], [ -78.355770, 39.626258 ], [ -78.358343, 39.625581 ], [ -78.362485, 39.626049 ], [ -78.366212, 39.627534 ], [ -78.367959, 39.628929 ], [ -78.373166, 39.630459 ], [ -78.380504, 39.629359 ], [ -78.382487, 39.628216 ], [ -78.383447, 39.625091 ], [ -78.383461, 39.623321 ], [ -78.382959, 39.622246 ], [ -78.379118, 39.618127 ], [ -78.372404, 39.612297 ], [ -78.372255, 39.611200 ], [ -78.373200, 39.609530 ], [ -78.374732, 39.608635 ], [ -78.378181, 39.608178 ], [ -78.383591, 39.608912 ], [ -78.390774, 39.612117 ], [ -78.395828, 39.616076 ], [ -78.412860, 39.621091 ], [ -78.420549, 39.624021 ], [ -78.425902, 39.624548 ], [ -78.430250, 39.623290 ], [ -78.433297, 39.620569 ], [ -78.433623, 39.618259 ], [ -78.433002, 39.616520 ], [ -78.431524, 39.614484 ], [ -78.425581, 39.607599 ], [ -78.420644, 39.603183 ], [ -78.412870, 39.598311 ], [ -78.402702, 39.593596 ], [ -78.397471, 39.590232 ], [ -78.395463, 39.587372 ], [ -78.395317, 39.584215 ], [ -78.397446, 39.581952 ], [ -78.400936, 39.580214 ], [ -78.408031, 39.578593 ], [ -78.418670, 39.581111 ], [ -78.420059, 39.581706 ], [ -78.422985, 39.584109 ], [ -78.428246, 39.586717 ], [ -78.443175, 39.591155 ], [ -78.445983, 39.591223 ], [ -78.451186, 39.590193 ], [ -78.454527, 39.588958 ], [ -78.457187, 39.587379 ], [ -78.458052, 39.585241 ], [ -78.458338, 39.580426 ], [ -78.454376, 39.574319 ], [ -78.450207, 39.570889 ], [ -78.438179, 39.563524 ], [ -78.426537, 39.559155 ], [ -78.423287, 39.556319 ], [ -78.420019, 39.551745 ], [ -78.418777, 39.548953 ], [ -78.419398, 39.547401 ], [ -78.421105, 39.546780 ], [ -78.424053, 39.546315 ], [ -78.426953, 39.546598 ], [ -78.430414, 39.549418 ], [ -78.433828, 39.548953 ], [ -78.434759, 39.546780 ], [ -78.434759, 39.543988 ], [ -78.435107, 39.541658 ], [ -78.436378, 39.539302 ], [ -78.438357, 39.538753 ], [ -78.441961, 39.541223 ], [ -78.445309, 39.543367 ], [ -78.447171, 39.543367 ], [ -78.449499, 39.542281 ], [ -78.449964, 39.541040 ], [ -78.449654, 39.539643 ], [ -78.449499, 39.538092 ], [ -78.451050, 39.536695 ], [ -78.459274, 39.535919 ], [ -78.461291, 39.534678 ], [ -78.461911, 39.532971 ], [ -78.461071, 39.529304 ], [ -78.460951, 39.525987 ], [ -78.462899, 39.520840 ], [ -78.468639, 39.516789 ], [ -78.471166, 39.516103 ], [ -78.474178, 39.516240 ], [ -78.480677, 39.518960 ], [ -78.484044, 39.519507 ], [ -78.485697, 39.519392 ], [ -78.489742, 39.517789 ], [ -78.499017, 39.518906 ], [ -78.503200, 39.518652 ], [ -78.513622, 39.522545 ], [ -78.521388, 39.524790 ], [ -78.527886, 39.524654 ], [ -78.546584, 39.520998 ], [ -78.550128, 39.520702 ], [ -78.552756, 39.521388 ], [ -78.557127, 39.521526 ], [ -78.565929, 39.519444 ], [ -78.567937, 39.519902 ], [ -78.572692, 39.522372 ], [ -78.578956, 39.526695 ], [ -78.587079, 39.528020 ], [ -78.590654, 39.530192 ], [ -78.592131, 39.531816 ], [ -78.593114, 39.534401 ], [ -78.593871, 39.535158 ], [ -78.595603, 39.535483 ], [ -78.597659, 39.535050 ], [ -78.600511, 39.533434 ], [ -78.605868, 39.534304 ], [ -78.606873, 39.535082 ], [ -78.614526, 39.537595 ], [ -78.623037, 39.539512 ], [ -78.628566, 39.539190 ], [ -78.628744, 39.537863 ], [ -78.630842, 39.537109 ], [ -78.655984, 39.534695 ], [ -78.663990, 39.536778 ], [ -78.668745, 39.540164 ], [ -78.675629, 39.540371 ], [ -78.682423, 39.543848 ], [ -78.689455, 39.545770 ], [ -78.691494, 39.547646 ], [ -78.691996, 39.550780 ], [ -78.692824, 39.551970 ], [ -78.694626, 39.553251 ], [ -78.707098, 39.555857 ], [ -78.708664, 39.556795 ], [ -78.713335, 39.562032 ], [ -78.714784, 39.562558 ], [ -78.725010, 39.563973 ], [ -78.726342, 39.567587 ], [ -78.731992, 39.575364 ], [ -78.733149, 39.583690 ], [ -78.733979, 39.586618 ], [ -78.738502, 39.586319 ], [ -78.740246, 39.585655 ], [ -78.743318, 39.580712 ], [ -78.746421, 39.579544 ], [ -78.756747, 39.580690 ], [ -78.760196, 39.582154 ], [ -78.767490, 39.587487 ], [ -78.768314, 39.589394 ], [ -78.768481, 39.591583 ], [ -78.770511, 39.594994 ], [ -78.772128, 39.596497 ], [ -78.774281, 39.597328 ], [ -78.778141, 39.601364 ], [ -78.778096, 39.602097 ], [ -78.776860, 39.604027 ], [ -78.768115, 39.608704 ], [ -78.760497, 39.609984 ], [ -78.751514, 39.609947 ], [ -78.749350, 39.608572 ], [ -78.749222, 39.606536 ], [ -78.747063, 39.605690 ], [ -78.739050, 39.609697 ], [ -78.733759, 39.613931 ], [ -78.733553, 39.615533 ], [ -78.736189, 39.621708 ], [ -78.742880, 39.625088 ], [ -78.748499, 39.626262 ], [ -78.756686, 39.622971 ], [ -78.763171, 39.618897 ], [ -78.769565, 39.619431 ], [ -78.777516, 39.621712 ], [ -78.778477, 39.622650 ], [ -78.778477, 39.624405 ], [ -78.772640, 39.636887 ], [ -78.771140, 39.638387 ], [ -78.768140, 39.639287 ], [ -78.765340, 39.643987 ], [ -78.765040, 39.646087 ], [ -78.765840, 39.648487 ], [ -78.775241, 39.645687 ], [ -78.781341, 39.636787 ], [ -78.784041, 39.636687 ], [ -78.790941, 39.638287 ], [ -78.795941, 39.637287 ], [ -78.801741, 39.627488 ], [ -78.795964, 39.614205 ], [ -78.795368, 39.610710 ], [ -78.795857, 39.606934 ], [ -78.797840, 39.604897 ], [ -78.800434, 39.605232 ], [ -78.801792, 39.606812 ], [ -78.809347, 39.608063 ], [ -78.812154, 39.600540 ], [ -78.812215, 39.597717 ], [ -78.818899, 39.590370 ], [ -78.824788, 39.590233 ], [ -78.826009, 39.588829 ], [ -78.826360, 39.577333 ], [ -78.820104, 39.576287 ], [ -78.815114, 39.571351 ], [ -78.813512, 39.567720 ], [ -78.816764, 39.561691 ], [ -78.821404, 39.560616 ], [ -78.826407, 39.562589 ], [ -78.830298, 39.565355 ], [ -78.838553, 39.567300 ], [ -78.851196, 39.559924 ], [ -78.851016, 39.554044 ], [ -78.851931, 39.551848 ], [ -78.868908, 39.532487 ], [ -78.868966, 39.531366 ], [ -78.874744, 39.522611 ], [ -78.876810, 39.521250 ], [ -78.879084, 39.521205 ], [ -78.885996, 39.522581 ], [ -78.891197, 39.518900 ], [ -78.895307, 39.512085 ], [ -78.908719, 39.496699 ], [ -78.916488, 39.486544 ], [ -78.918142, 39.485858 ], [ -78.926999, 39.487003 ], [ -78.933613, 39.486180 ], [ -78.938751, 39.483732 ], [ -78.942293, 39.480987 ], [ -78.942618, 39.479614 ], [ -78.941526, 39.476869 ], [ -78.939164, 39.475267 ], [ -78.938869, 39.474100 ], [ -78.941969, 39.469959 ], [ -78.946603, 39.466140 ], [ -78.953333, 39.463645 ], [ -78.955483, 39.442277 ], [ -78.956751, 39.440264 ], [ -78.965484, 39.438455 ], [ -78.967461, 39.439804 ], [ -78.970118, 39.443327 ], [ -78.978826, 39.448678 ], [ -78.996950, 39.454961 ], [ -79.010097, 39.461048 ], [ -79.017147, 39.466977 ], [ -79.020542, 39.467002 ], [ -79.028159, 39.465060 ], [ -79.030343, 39.465403 ], [ -79.033884, 39.467761 ], [ -79.035712, 39.471331 ], [ -79.035623, 39.473344 ], [ -79.036915, 39.476795 ], [ -79.046276, 39.483801 ], [ -79.050528, 39.483299 ], [ -79.052447, 39.482315 ], [ -79.053880, 39.480094 ], [ -79.054989, 39.473096 ], [ -79.056583, 39.471014 ], [ -79.068627, 39.474515 ], [ -79.083270, 39.471379 ], [ -79.091329, 39.472407 ], [ -79.094702, 39.473253 ], [ -79.096517, 39.472799 ], [ -79.098059, 39.472073 ], [ -79.098875, 39.471438 ], [ -79.099057, 39.470259 ], [ -79.098240, 39.468445 ], [ -79.096154, 39.465542 ], [ -79.095428, 39.462548 ], [ -79.104217, 39.448358 ], [ -79.107933, 39.445748 ], [ -79.114070, 39.443321 ], [ -79.116369, 39.440482 ], [ -79.116574, 39.438058 ], [ -79.116932, 39.435788 ], [ -79.117932, 39.434412 ], [ -79.119433, 39.433161 ], [ -79.121560, 39.432786 ], [ -79.124036, 39.433204 ], [ -79.129047, 39.429542 ], [ -79.129404, 39.426637 ], [ -79.128941, 39.423279 ], [ -79.129816, 39.419901 ], [ -79.132193, 39.418275 ], [ -79.136696, 39.417649 ], [ -79.140699, 39.416649 ], [ -79.141950, 39.414272 ], [ -79.142701, 39.410519 ], [ -79.143827, 39.408517 ], [ -79.145453, 39.407767 ], [ -79.147455, 39.407767 ], [ -79.149581, 39.407767 ], [ -79.151583, 39.408768 ], [ -79.153584, 39.412020 ], [ -79.157212, 39.413021 ], [ -79.159213, 39.413021 ], [ -79.161340, 39.411895 ], [ -79.166497, 39.400888 ], [ -79.165593, 39.397134 ], [ -79.167220, 39.393256 ], [ -79.170494, 39.392026 ], [ -79.174600, 39.392756 ], [ -79.176977, 39.392130 ], [ -79.179335, 39.388342 ], [ -79.189465, 39.386500 ], [ -79.193332, 39.387974 ], [ -79.195543, 39.387790 ], [ -79.197937, 39.386132 ], [ -79.202943, 39.377872 ], [ -79.213961, 39.365320 ], [ -79.220357, 39.363157 ], [ -79.229247, 39.363662 ], [ -79.235878, 39.358689 ], [ -79.252270, 39.356663 ], [ -79.253928, 39.354085 ], [ -79.253891, 39.337222 ], [ -79.255306, 39.335874 ], [ -79.269365, 39.330732 ], [ -79.282037, 39.323048 ], [ -79.283723, 39.309640 ], [ -79.290236, 39.299323 ], [ -79.292710, 39.298729 ], [ -79.302311, 39.299554 ], [ -79.314768, 39.304381 ], [ -79.332380, 39.299919 ], [ -79.344344, 39.293534 ], [ -79.345599, 39.289733 ], [ -79.343625, 39.287148 ], [ -79.343801, 39.286096 ], [ -79.353750, 39.278039 ], [ -79.361343, 39.274924 ], [ -79.376154, 39.273154 ], [ -79.387023, 39.265540 ], [ -79.412051, 39.240546 ], [ -79.420350, 39.238880 ], [ -79.425059, 39.233686 ], [ -79.424413, 39.228171 ], [ -79.439830, 39.217074 ], [ -79.452685, 39.211719 ], [ -79.469156, 39.207300 ], [ -79.476037, 39.203728 ], [ -79.486873, 39.205961 ], [ -79.485874, 39.264905 ], [ -79.486179, 39.264970 ], [ -79.487274, 39.265205 ], [ -79.486737, 39.278149 ], [ -79.487651, 39.279933 ], [ -79.486812, 39.296367 ], [ -79.486072, 39.344300 ], [ -79.484372, 39.344300 ], [ -79.482648, 39.521364 ], [ -79.482354, 39.524682 ], [ -79.482366, 39.531689 ], [ -79.478866, 39.531689 ], [ -79.477764, 39.642282 ], [ -79.476968, 39.642986 ], [ -79.476574, 39.644206 ], [ -79.476662, 39.721078 ], [ -79.045548, 39.722883 ], [ -78.931176, 39.722775 ], [ -78.723529, 39.723043 ], [ -78.575893, 39.722561 ], [ -78.546415, 39.722869 ], [ -78.537702, 39.722490 ], [ -78.461422, 39.722869 ], [ -78.438839, 39.722481 ], [ -78.342520, 39.722539 ], [ -78.340498, 39.722514 ], [ -78.339539, 39.722552 ], [ -78.337111, 39.722461 ], [ -78.330715, 39.722689 ], [ -78.269020, 39.722613 ], [ -78.268948, 39.722590 ], [ -78.243103, 39.722481 ], [ -78.240334, 39.722498 ], [ -78.204450, 39.722520 ], [ -78.202895, 39.722416 ], [ -78.075771, 39.722301 ], [ -78.073736, 39.722314 ], [ -77.874719, 39.722219 ], [ -77.768534, 39.721358 ], [ -77.743204, 39.721205 ], [ -77.732615, 39.721094 ], [ -77.724115, 39.720894 ], [ -77.674522, 39.720847 ], [ -77.672249, 39.720778 ], [ -77.534758, 39.720134 ], [ -77.533371, 39.720165 ], [ -77.469145, 39.720018 ], [ -77.243307, 39.719998 ], [ -77.239807, 39.719998 ], [ -77.216806, 39.719998 ], [ -77.058904, 39.720100 ], [ -77.058204, 39.720200 ], [ -77.047104, 39.720000 ], [ -76.990903, 39.719800 ], [ -76.936601, 39.720701 ], [ -76.897566, 39.720401 ], [ -76.890100, 39.720401 ], [ -76.809197, 39.720702 ], [ -76.806397, 39.720602 ], [ -76.787097, 39.720802 ], [ -76.715594, 39.721103 ], [ -76.711894, 39.721103 ], [ -76.569389, 39.721203 ], [ -76.517087, 39.721304 ], [ -76.491887, 39.721304 ], [ -76.418784, 39.721204 ], [ -76.418684, 39.721304 ], [ -76.395583, 39.721204 ], [ -76.380583, 39.721304 ], [ -76.380083, 39.721304 ], [ -76.233277, 39.721305 ], [ -76.027618, 39.721833 ], [ -76.013067, 39.721920 ], [ -75.998649, 39.721576 ], [ -75.810068, 39.721906 ], [ -75.799563, 39.721882 ], [ -75.788359, 39.721811 ], [ -75.788395, 39.700287 ], [ -75.788395, 39.700031 ], [ -75.788658, 39.681911 ], [ -75.788616, 39.680742 ], [ -75.788658, 39.658211 ], [ -75.787450, 39.637455 ], [ -75.786890, 39.630575 ], [ -75.780786, 39.550262 ], [ -75.766667, 39.377216 ], [ -75.755953, 39.245958 ], [ -75.751028, 39.177762 ], [ -75.749356, 39.164815 ], [ -75.747668, 39.143306 ], [ -75.746121, 39.120318 ], [ -75.745793, 39.114935 ], [ -75.743811, 39.094674 ], [ -75.725829, 38.869296 ], [ -75.725565, 38.868152 ], [ -75.724061, 38.847781 ], [ -75.724002, 38.846682 ], [ -75.722882, 38.833156 ], [ -75.722610, 38.830008 ], [ -75.722028, 38.822078 ], [ -75.707346, 38.635280 ], [ -75.706585, 38.626125 ], [ -75.706235, 38.621296 ], [ -75.705860, 38.616268 ], [ -75.705774, 38.614740 ], [ -75.703981, 38.592066 ], [ -75.703445, 38.585120 ], [ -75.701565, 38.560736 ], [ -75.700179, 38.542717 ], [ -75.698777, 38.522001 ], [ -75.696688, 38.496467 ], [ -75.696369, 38.492373 ], [ -75.693521, 38.460128 ], [ -75.665585, 38.458900 ], [ -75.662843, 38.458759 ], [ -75.630457, 38.457904 ], [ -75.598069, 38.456855 ], [ -75.593082, 38.456404 ], [ -75.589307, 38.456286 ], [ -75.583601, 38.456424 ], [ -75.574110, 38.455991 ], [ -75.559934, 38.455579 ], [ -75.559212, 38.455563 ], [ -75.533763, 38.454958 ], [ -75.522730, 38.454657 ], [ -75.521304, 38.454657 ], [ -75.502961, 38.454220 ], [ -75.500142, 38.454144 ], [ -75.479150, 38.453699 ], [ -75.428728, 38.452671 ], [ -75.424831, 38.452610 ], [ -75.410884, 38.452400 ], [ -75.394786, 38.452160 ], [ -75.393563, 38.452114 ], [ -75.371054, 38.452107 ], [ -75.355797, 38.452008 ], [ -75.341250, 38.451970 ], [ -75.260350, 38.451492 ], [ -75.252723, 38.451397 ], [ -75.185413, 38.451013 ], [ -75.141894, 38.451196 ], [ -75.069909, 38.451276 ], [ -75.066327, 38.451291 ], [ -75.053483, 38.451274 ], [ -75.052510, 38.451273 ], [ -75.048939, 38.451263 ], [ -75.054591, 38.414830 ], [ -75.061370, 38.389466 ], [ -75.072476, 38.355278 ], [ -75.085518, 38.324270 ], [ -75.087466, 38.322769 ], [ -75.093888, 38.323432 ], [ -75.102947, 38.311525 ], [ -75.116837, 38.274229 ], [ -75.143229, 38.220475 ], [ -75.158970, 38.184242 ], [ -75.177394, 38.130014 ], [ -75.193796, 38.096013 ], [ -75.216117, 38.061786 ], [ -75.242266, 38.027209 ], [ -75.398839, 38.013277 ], [ -75.428810, 38.010854 ], [ -75.435956, 38.010282 ], [ -75.624341, 37.994211 ], [ -75.625612, 37.989800 ], [ -75.627607, 37.988521 ], [ -75.630869, 37.987818 ], [ -75.632532, 37.986693 ], [ -75.633833, 37.984519 ], [ -75.633712, 37.983057 ], [ -75.628855, 37.977798 ], [ -75.628839, 37.976789 ], [ -75.629532, 37.975966 ], [ -75.630992, 37.975667 ], [ -75.632010, 37.976020 ], [ -75.634209, 37.977672 ], [ -75.635736, 37.979536 ], [ -75.638221, 37.979397 ], [ -75.641823, 37.975967 ], [ -75.644725, 37.969779 ], [ -75.648229, 37.966775 ], [ -75.647606, 37.947027 ], [ -75.655681, 37.945435 ], [ -75.665012, 37.949387 ], [ -75.669711, 37.950796 ] ] ], [ [ [ -76.272255, 39.274555 ], [ -76.266411, 39.290539 ], [ -76.259712, 39.292427 ], [ -76.257988, 39.287788 ], [ -76.272255, 39.274555 ] ] ], [ [ [ -76.373039, 39.236977 ], [ -76.384697, 39.242241 ], [ -76.386932, 39.249214 ], [ -76.355850, 39.260693 ], [ -76.343826, 39.257256 ], [ -76.347603, 39.249008 ], [ -76.373039, 39.236977 ] ] ], [ [ [ -76.362511, 38.748409 ], [ -76.390350, 38.757004 ], [ -76.390694, 38.766281 ], [ -76.373848, 38.782780 ], [ -76.369728, 38.777279 ], [ -76.362511, 38.748409 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US01", "STATE": "01", "NAME": "Alabama", "LSAD": "", "CENSUSAREA": 50645.326000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -85.002368, 31.000682 ], [ -85.024108, 31.000681 ], [ -85.027512, 31.000670 ], [ -85.030107, 31.000653 ], [ -85.031155, 31.000647 ], [ -85.052088, 31.000585 ], [ -85.054802, 31.000585 ], [ -85.057534, 31.000585 ], [ -85.145835, 31.000695 ], [ -85.152085, 31.000888 ], [ -85.152218, 31.000834 ], [ -85.154452, 31.000835 ], [ -85.243632, 31.000884 ], [ -85.498272, 30.996928 ], [ -85.749619, 30.995292 ], [ -85.749932, 30.994837 ], [ -85.893543, 30.993467 ], [ -85.998643, 30.992870 ], [ -86.035039, 30.993320 ], [ -86.052462, 30.993247 ], [ -86.056213, 30.993133 ], [ -86.116918, 30.992917 ], [ -86.162886, 30.993682 ], [ -86.168979, 30.993706 ], [ -86.175204, 30.993798 ], [ -86.180232, 30.994005 ], [ -86.238335, 30.994370 ], [ -86.256448, 30.993853 ], [ -86.289247, 30.993798 ], [ -86.304596, 30.994029 ], [ -86.364907, 30.994455 ], [ -86.369270, 30.994477 ], [ -86.374545, 30.994474 ], [ -86.388647, 30.994181 ], [ -86.391937, 30.994172 ], [ -86.404912, 30.994049 ], [ -86.454704, 30.993791 ], [ -86.458319, 30.993998 ], [ -86.499950, 30.993340 ], [ -86.512834, 30.993700 ], [ -86.519938, 30.993245 ], [ -86.563436, 30.995223 ], [ -86.567586, 30.995109 ], [ -86.664681, 30.994534 ], [ -86.678383, 30.994537 ], [ -86.706261, 30.994703 ], [ -86.725379, 30.996872 ], [ -86.727293, 30.996882 ], [ -86.728392, 30.996739 ], [ -86.745240, 30.996290 ], [ -86.785918, 30.996978 ], [ -86.830497, 30.997401 ], [ -86.831934, 30.997378 ], [ -86.872989, 30.997631 ], [ -86.888135, 30.997577 ], [ -86.927810, 30.997704 ], [ -86.998477, 30.998661 ], [ -87.004359, 30.999316 ], [ -87.027107, 30.999255 ], [ -87.036366, 30.999348 ], [ -87.039989, 30.999594 ], [ -87.053737, 30.999131 ], [ -87.064063, 30.999191 ], [ -87.068633, 30.999143 ], [ -87.118873, 30.999427 ], [ -87.124969, 30.998802 ], [ -87.140755, 30.999532 ], [ -87.162614, 30.999055 ], [ -87.224746, 30.997169 ], [ -87.237685, 30.996393 ], [ -87.254980, 30.998285 ], [ -87.255592, 30.998216 ], [ -87.257002, 30.998194 ], [ -87.257960, 30.998263 ], [ -87.259689, 30.998172 ], [ -87.260540, 30.998195 ], [ -87.265564, 30.998267 ], [ -87.288905, 30.998345 ], [ -87.290995, 30.998352 ], [ -87.301567, 30.998434 ], [ -87.304030, 30.998191 ], [ -87.312183, 30.998435 ], [ -87.333973, 30.998272 ], [ -87.355656, 30.998244 ], [ -87.364011, 30.998218 ], [ -87.367842, 30.998292 ], [ -87.425774, 30.998090 ], [ -87.432292, 30.998205 ], [ -87.449811, 30.998272 ], [ -87.455705, 30.998318 ], [ -87.458658, 30.998386 ], [ -87.461638, 30.998202 ], [ -87.461783, 30.998201 ], [ -87.466827, 30.998178 ], [ -87.466879, 30.998178 ], [ -87.478706, 30.998213 ], [ -87.479703, 30.998197 ], [ -87.480243, 30.998202 ], [ -87.519520, 30.997586 ], [ -87.548543, 30.997927 ], [ -87.571281, 30.997870 ], [ -87.598928, 30.997457 ], [ -87.599172, 30.995722 ], [ -87.596722, 30.987610 ], [ -87.593395, 30.982959 ], [ -87.592676, 30.980140 ], [ -87.594164, 30.977572 ], [ -87.594111, 30.976335 ], [ -87.593046, 30.972966 ], [ -87.590917, 30.969414 ], [ -87.589187, 30.964464 ], [ -87.592055, 30.951492 ], [ -87.596890, 30.941131 ], [ -87.598299, 30.938793 ], [ -87.600691, 30.937074 ], [ -87.602684, 30.934277 ], [ -87.607811, 30.924490 ], [ -87.608262, 30.921900 ], [ -87.610200, 30.916628 ], [ -87.611847, 30.914541 ], [ -87.614209, 30.908536 ], [ -87.614951, 30.904226 ], [ -87.616013, 30.901453 ], [ -87.620715, 30.898930 ], [ -87.622203, 30.897508 ], [ -87.622519, 30.893680 ], [ -87.620922, 30.889923 ], [ -87.620788, 30.887494 ], [ -87.622062, 30.885408 ], [ -87.624400, 30.884696 ], [ -87.629454, 30.880115 ], [ -87.629987, 30.877686 ], [ -87.634938, 30.865886 ], [ -87.628245, 30.860131 ], [ -87.626228, 30.857127 ], [ -87.625380, 30.854355 ], [ -87.626497, 30.851880 ], [ -87.627323, 30.847961 ], [ -87.626075, 30.846494 ], [ -87.624137, 30.845713 ], [ -87.617281, 30.840353 ], [ -87.615367, 30.837031 ], [ -87.615923, 30.834693 ], [ -87.610982, 30.832632 ], [ -87.605776, 30.831304 ], [ -87.603570, 30.828624 ], [ -87.601630, 30.825140 ], [ -87.600486, 30.820627 ], [ -87.594297, 30.816984 ], [ -87.587870, 30.815037 ], [ -87.581869, 30.812403 ], [ -87.576849, 30.808163 ], [ -87.572043, 30.800532 ], [ -87.568140, 30.799088 ], [ -87.564209, 30.796246 ], [ -87.560068, 30.792258 ], [ -87.559484, 30.790447 ], [ -87.554838, 30.787125 ], [ -87.552954, 30.786941 ], [ -87.552051, 30.786254 ], [ -87.545044, 30.778666 ], [ -87.545364, 30.774105 ], [ -87.546160, 30.772020 ], [ -87.542260, 30.767504 ], [ -87.537085, 30.762530 ], [ -87.536528, 30.761383 ], [ -87.535416, 30.754760 ], [ -87.535365, 30.749775 ], [ -87.532607, 30.743489 ], [ -87.523613, 30.738306 ], [ -87.511729, 30.733535 ], [ -87.505153, 30.726313 ], [ -87.502317, 30.721590 ], [ -87.497515, 30.720123 ], [ -87.496772, 30.720353 ], [ -87.487036, 30.718500 ], [ -87.481225, 30.716508 ], [ -87.479819, 30.714950 ], [ -87.479579, 30.712865 ], [ -87.474429, 30.706586 ], [ -87.470397, 30.705281 ], [ -87.467717, 30.701683 ], [ -87.466338, 30.700835 ], [ -87.456948, 30.697560 ], [ -87.451404, 30.699806 ], [ -87.449362, 30.698913 ], [ -87.443580, 30.694604 ], [ -87.442280, 30.692679 ], [ -87.439814, 30.690479 ], [ -87.436021, 30.688668 ], [ -87.430372, 30.688645 ], [ -87.424883, 30.683374 ], [ -87.419527, 30.679981 ], [ -87.412739, 30.678055 ], [ -87.406958, 30.675165 ], [ -87.406561, 30.674019 ], [ -87.407118, 30.671796 ], [ -87.405874, 30.666616 ], [ -87.400707, 30.657148 ], [ -87.400177, 30.657217 ], [ -87.397262, 30.654351 ], [ -87.396177, 30.650454 ], [ -87.397185, 30.648117 ], [ -87.395941, 30.643968 ], [ -87.393588, 30.630880 ], [ -87.393775, 30.627006 ], [ -87.394479, 30.625192 ], [ -87.395659, 30.623372 ], [ -87.396430, 30.617734 ], [ -87.396430, 30.616909 ], [ -87.395053, 30.615900 ], [ -87.395026, 30.615281 ], [ -87.397308, 30.608728 ], [ -87.399270, 30.605611 ], [ -87.401178, 30.604397 ], [ -87.404597, 30.603389 ], [ -87.406558, 30.599928 ], [ -87.408736, 30.583701 ], [ -87.412712, 30.573227 ], [ -87.414513, 30.573456 ], [ -87.416261, 30.572448 ], [ -87.418354, 30.570043 ], [ -87.418513, 30.569561 ], [ -87.416951, 30.568003 ], [ -87.416660, 30.566306 ], [ -87.418647, 30.561837 ], [ -87.420925, 30.560668 ], [ -87.422408, 30.560439 ], [ -87.422805, 30.561379 ], [ -87.423362, 30.561425 ], [ -87.426037, 30.560073 ], [ -87.427891, 30.554159 ], [ -87.431441, 30.550263 ], [ -87.434963, 30.549599 ], [ -87.435440, 30.549140 ], [ -87.446586, 30.527068 ], [ -87.446427, 30.520306 ], [ -87.444944, 30.514943 ], [ -87.445182, 30.513980 ], [ -87.446499, 30.513569 ], [ -87.447305, 30.512629 ], [ -87.447782, 30.511913 ], [ -87.447702, 30.510458 ], [ -87.444714, 30.507494 ], [ -87.443220, 30.506782 ], [ -87.439690, 30.506649 ], [ -87.438269, 30.505357 ], [ -87.431178, 30.495795 ], [ -87.430578, 30.491096 ], [ -87.432978, 30.484896 ], [ -87.435578, 30.480496 ], [ -87.434678, 30.479196 ], [ -87.431578, 30.477696 ], [ -87.430578, 30.476596 ], [ -87.429578, 30.470596 ], [ -87.425078, 30.465596 ], [ -87.414677, 30.457296 ], [ -87.407877, 30.456396 ], [ -87.404677, 30.452897 ], [ -87.399877, 30.450997 ], [ -87.396877, 30.450597 ], [ -87.391976, 30.451597 ], [ -87.381176, 30.450097 ], [ -87.370768, 30.446865 ], [ -87.368680, 30.444631 ], [ -87.366939, 30.440480 ], [ -87.366591, 30.436648 ], [ -87.368191, 30.433407 ], [ -87.371169, 30.430490 ], [ -87.382076, 30.422897 ], [ -87.386376, 30.420497 ], [ -87.395676, 30.417597 ], [ -87.398776, 30.415098 ], [ -87.401777, 30.411398 ], [ -87.403477, 30.410198 ], [ -87.408877, 30.408798 ], [ -87.413177, 30.408998 ], [ -87.419177, 30.410198 ], [ -87.422677, 30.410098 ], [ -87.426177, 30.409198 ], [ -87.429578, 30.406498 ], [ -87.431778, 30.403198 ], [ -87.434278, 30.397498 ], [ -87.437278, 30.395898 ], [ -87.440678, 30.391498 ], [ -87.441178, 30.388598 ], [ -87.440878, 30.386698 ], [ -87.438678, 30.382098 ], [ -87.438678, 30.380798 ], [ -87.441823, 30.376304 ], [ -87.449078, 30.370399 ], [ -87.451378, 30.367199 ], [ -87.451878, 30.364999 ], [ -87.451978, 30.360299 ], [ -87.450962, 30.346262 ], [ -87.452278, 30.344099 ], [ -87.459978, 30.336300 ], [ -87.462978, 30.334000 ], [ -87.464878, 30.333300 ], [ -87.475579, 30.331400 ], [ -87.491879, 30.330900 ], [ -87.499980, 30.328957 ], [ -87.502572, 30.327405 ], [ -87.504701, 30.324039 ], [ -87.505943, 30.319396 ], [ -87.505780, 30.312500 ], [ -87.504680, 30.308901 ], [ -87.502780, 30.307301 ], [ -87.494879, 30.305001 ], [ -87.483679, 30.304801 ], [ -87.481879, 30.306001 ], [ -87.475879, 30.307900 ], [ -87.468678, 30.308200 ], [ -87.465778, 30.307600 ], [ -87.462978, 30.307800 ], [ -87.459578, 30.308300 ], [ -87.455578, 30.310200 ], [ -87.450078, 30.311100 ], [ -87.452378, 30.300201 ], [ -87.499980, 30.287901 ], [ -87.505480, 30.287101 ], [ -87.518380, 30.283901 ], [ -87.518324, 30.280435 ], [ -87.544533, 30.275659 ], [ -87.558097, 30.274437 ], [ -87.581362, 30.269257 ], [ -87.656888, 30.249709 ], [ -87.735530, 30.240679 ], [ -87.800560, 30.229365 ], [ -87.838462, 30.227185 ], [ -87.926119, 30.230373 ], [ -87.962253, 30.229522 ], [ -87.999996, 30.225753 ], [ -88.014572, 30.222366 ], [ -88.028401, 30.221132 ], [ -88.029272, 30.222714 ], [ -88.023991, 30.230390 ], [ -87.966847, 30.235618 ], [ -87.948979, 30.256564 ], [ -87.936041, 30.261469 ], [ -87.918247, 30.253308 ], [ -87.913762, 30.247837 ], [ -87.900460, 30.241531 ], [ -87.893201, 30.239237 ], [ -87.879343, 30.238590 ], [ -87.860085, 30.240289 ], [ -87.817743, 30.254292 ], [ -87.802087, 30.253054 ], [ -87.787750, 30.254244 ], [ -87.766626, 30.262353 ], [ -87.755263, 30.277292 ], [ -87.755516, 30.291217 ], [ -87.772758, 30.311701 ], [ -87.796717, 30.324198 ], [ -87.809266, 30.332702 ], [ -87.829880, 30.353809 ], [ -87.837239, 30.369324 ], [ -87.845132, 30.377446 ], [ -87.853806, 30.378481 ], [ -87.865017, 30.383450 ], [ -87.906343, 30.409380 ], [ -87.908908, 30.414240 ], [ -87.914136, 30.446144 ], [ -87.920031, 30.470645 ], [ -87.924211, 30.476100 ], [ -87.931902, 30.481100 ], [ -87.933355, 30.487357 ], [ -87.911141, 30.525848 ], [ -87.905343, 30.537566 ], [ -87.901711, 30.550879 ], [ -87.904168, 30.565985 ], [ -87.907891, 30.573114 ], [ -87.911431, 30.576261 ], [ -87.914956, 30.585893 ], [ -87.912530, 30.615795 ], [ -87.919346, 30.636060 ], [ -87.931070, 30.652694 ], [ -87.936717, 30.657432 ], [ -87.955989, 30.658862 ], [ -87.981196, 30.675090 ], [ -88.008396, 30.684956 ], [ -88.012444, 30.683190 ], [ -88.022076, 30.673873 ], [ -88.026706, 30.661490 ], [ -88.034588, 30.653715 ], [ -88.044339, 30.652568 ], [ -88.061998, 30.644891 ], [ -88.059598, 30.619091 ], [ -88.053998, 30.612491 ], [ -88.064898, 30.588292 ], [ -88.074898, 30.578892 ], [ -88.085493, 30.563258 ], [ -88.081617, 30.546317 ], [ -88.082792, 30.528713 ], [ -88.090734, 30.523570 ], [ -88.100874, 30.509750 ], [ -88.103768, 30.500903 ], [ -88.102988, 30.493029 ], [ -88.096867, 30.471053 ], [ -88.100646, 30.461220 ], [ -88.106437, 30.452738 ], [ -88.104070, 30.427300 ], [ -88.107274, 30.377246 ], [ -88.115432, 30.356570 ], [ -88.124611, 30.341623 ], [ -88.128052, 30.338509 ], [ -88.136173, 30.320729 ], [ -88.155775, 30.327184 ], [ -88.171967, 30.324679 ], [ -88.191542, 30.317002 ], [ -88.195664, 30.321242 ], [ -88.198361, 30.338819 ], [ -88.196353, 30.343586 ], [ -88.188532, 30.345053 ], [ -88.188527, 30.348124 ], [ -88.200065, 30.362378 ], [ -88.204495, 30.362102 ], [ -88.260695, 30.382381 ], [ -88.282635, 30.382876 ], [ -88.290649, 30.370741 ], [ -88.311608, 30.368908 ], [ -88.316525, 30.369985 ], [ -88.319599, 30.380334 ], [ -88.332277, 30.388440 ], [ -88.341345, 30.389470 ], [ -88.364022, 30.388006 ], [ -88.374671, 30.385608 ], [ -88.395023, 30.369425 ], [ -88.402283, 30.510852 ], [ -88.403547, 30.533100 ], [ -88.403931, 30.543359 ], [ -88.404013, 30.545060 ], [ -88.407484, 30.622736 ], [ -88.407462, 30.631653 ], [ -88.408070, 30.636970 ], [ -88.409571, 30.668731 ], [ -88.411339, 30.706334 ], [ -88.411550, 30.712956 ], [ -88.412209, 30.730395 ], [ -88.412270, 30.731771 ], [ -88.418630, 30.866528 ], [ -88.419562, 30.875186 ], [ -88.425729, 31.000183 ], [ -88.425807, 31.001123 ], [ -88.432007, 31.114298 ], [ -88.438104, 31.230060 ], [ -88.438211, 31.231252 ], [ -88.438980, 31.246896 ], [ -88.438780, 31.252654 ], [ -88.445182, 31.355855 ], [ -88.445209, 31.355969 ], [ -88.448686, 31.420888 ], [ -88.448660, 31.421277 ], [ -88.451045, 31.459448 ], [ -88.451575, 31.481533 ], [ -88.453013, 31.500164 ], [ -88.459478, 31.621652 ], [ -88.459722, 31.624002 ], [ -88.464425, 31.697881 ], [ -88.465107, 31.722312 ], [ -88.468669, 31.790722 ], [ -88.471106, 31.850949 ], [ -88.471214, 31.851385 ], [ -88.472642, 31.875153 ], [ -88.473227, 31.893856 ], [ -88.468879, 31.930262 ], [ -88.468660, 31.933173 ], [ -88.455039, 32.039719 ], [ -88.454959, 32.040576 ], [ -88.438710, 32.172078 ], [ -88.438650, 32.172806 ], [ -88.428278, 32.250143 ], [ -88.421453, 32.308680 ], [ -88.413819, 32.373922 ], [ -88.412500, 32.380025 ], [ -88.403789, 32.449770 ], [ -88.403789, 32.449885 ], [ -88.399966, 32.485415 ], [ -88.383039, 32.626679 ], [ -88.382985, 32.626954 ], [ -88.373338, 32.711825 ], [ -88.368349, 32.747656 ], [ -88.354292, 32.875130 ], [ -88.340432, 32.991199 ], [ -88.330934, 33.073125 ], [ -88.317135, 33.184123 ], [ -88.315235, 33.203323 ], [ -88.312535, 33.220923 ], [ -88.277421, 33.512436 ], [ -88.276805, 33.516463 ], [ -88.274619, 33.534008 ], [ -88.270050, 33.570819 ], [ -88.269532, 33.572894 ], [ -88.269076, 33.576929 ], [ -88.268160, 33.585040 ], [ -88.267148, 33.591989 ], [ -88.267005, 33.594229 ], [ -88.256343, 33.682053 ], [ -88.256131, 33.682860 ], [ -88.254622, 33.695780 ], [ -88.254445, 33.698779 ], [ -88.252257, 33.719568 ], [ -88.244142, 33.781673 ], [ -88.243025, 33.795680 ], [ -88.240054, 33.810879 ], [ -88.235492, 33.847203 ], [ -88.226517, 33.911551 ], [ -88.226517, 33.911665 ], [ -88.226428, 33.912875 ], [ -88.210741, 34.029199 ], [ -88.207229, 34.058333 ], [ -88.200196, 34.115948 ], [ -88.192128, 34.175351 ], [ -88.190678, 34.190123 ], [ -88.187620, 34.204778 ], [ -88.186667, 34.220952 ], [ -88.176889, 34.293858 ], [ -88.175867, 34.302171 ], [ -88.173632, 34.321054 ], [ -88.165910, 34.380926 ], [ -88.165634, 34.383102 ], [ -88.156292, 34.463214 ], [ -88.139988, 34.581703 ], [ -88.139246, 34.587795 ], [ -88.138719, 34.589215 ], [ -88.134263, 34.622660 ], [ -88.118407, 34.724292 ], [ -88.116418, 34.746303 ], [ -88.107560, 34.811628 ], [ -88.097888, 34.892202 ], [ -88.099999, 34.894095 ], [ -88.125038, 34.902227 ], [ -88.136692, 34.907592 ], [ -88.139721, 34.909631 ], [ -88.146335, 34.914374 ], [ -88.154617, 34.922392 ], [ -88.161594, 34.933456 ], [ -88.172102, 34.955213 ], [ -88.176106, 34.962519 ], [ -88.179973, 34.967466 ], [ -88.187429, 34.974909 ], [ -88.198811, 34.991192 ], [ -88.200064, 34.995634 ], [ -88.200820, 34.997774 ], [ -88.201987, 35.005421 ], [ -88.202959, 35.008028 ], [ -88.000032, 35.005939 ], [ -87.877969, 35.005468 ], [ -87.877742, 35.005512 ], [ -87.872626, 35.005571 ], [ -87.853528, 35.005541 ], [ -87.853411, 35.005576 ], [ -87.851886, 35.005656 ], [ -87.773586, 35.004946 ], [ -87.767602, 35.004783 ], [ -87.758890, 35.004711 ], [ -87.709491, 35.004089 ], [ -87.702321, 35.003945 ], [ -87.700543, 35.003988 ], [ -87.696834, 35.003852 ], [ -87.671405, 35.003537 ], [ -87.664123, 35.003523 ], [ -87.625025, 35.003732 ], [ -87.428613, 35.002795 ], [ -87.421543, 35.002679 ], [ -87.417400, 35.002669 ], [ -87.391314, 35.002374 ], [ -87.381071, 35.002118 ], [ -87.359281, 35.001823 ], [ -87.349251, 35.001662 ], [ -87.299185, 35.000915 ], [ -87.270014, 35.000390 ], [ -87.230544, 34.999484 ], [ -87.216683, 34.999148 ], [ -87.210759, 34.999024 ], [ -87.011174, 34.995162 ], [ -87.000007, 34.995121 ], [ -86.974412, 34.994513 ], [ -86.972613, 34.994610 ], [ -86.970236, 34.994546 ], [ -86.967120, 34.994400 ], [ -86.862147, 34.991956 ], [ -86.849794, 34.991924 ], [ -86.846466, 34.991860 ], [ -86.836370, 34.991764 ], [ -86.820657, 34.991764 ], [ -86.783648, 34.991925 ], [ -86.677616, 34.992070 ], [ -86.676726, 34.992070 ], [ -86.674360, 34.992001 ], [ -86.670853, 34.992000 ], [ -86.659610, 34.991792 ], [ -86.641212, 34.991740 ], [ -86.600039, 34.991240 ], [ -86.588962, 34.991197 ], [ -86.571217, 34.991011 ], [ -86.555864, 34.990971 ], [ -86.528485, 34.990677 ], [ -86.467798, 34.990692 ], [ -86.433927, 34.991085 ], [ -86.397203, 34.991660 ], [ -86.311274, 34.991098 ], [ -85.828724, 34.988165 ], [ -85.824411, 34.988142 ], [ -85.605165, 34.984678 ], [ -85.599385, 34.951766 ], [ -85.598781, 34.944915 ], [ -85.595191, 34.924331 ], [ -85.595163, 34.924171 ], [ -85.583145, 34.860371 ], [ -85.561416, 34.750079 ], [ -85.552482, 34.708321 ], [ -85.552454, 34.708138 ], [ -85.541267, 34.656783 ], [ -85.541264, 34.656701 ], [ -85.534327, 34.625082 ], [ -85.527261, 34.588683 ], [ -85.517074, 34.542598 ], [ -85.513930, 34.525192 ], [ -85.513709, 34.524170 ], [ -85.512108, 34.518252 ], [ -85.508384, 34.501212 ], [ -85.502454, 34.474527 ], [ -85.502316, 34.473954 ], [ -85.470450, 34.328239 ], [ -85.458693, 34.269437 ], [ -85.458071, 34.265736 ], [ -85.455371, 34.252854 ], [ -85.455057, 34.250689 ], [ -85.429470, 34.125096 ], [ -85.428222, 34.114397 ], [ -85.420232, 34.072278 ], [ -85.406748, 34.002314 ], [ -85.405918, 34.000100 ], [ -85.398837, 33.964129 ], [ -85.377426, 33.856047 ], [ -85.361844, 33.773951 ], [ -85.360491, 33.767958 ], [ -85.357402, 33.750104 ], [ -85.314994, 33.535898 ], [ -85.314091, 33.530218 ], [ -85.313999, 33.529807 ], [ -85.304439, 33.482884 ], [ -85.232378, 33.108077 ], [ -85.223261, 33.062580 ], [ -85.221868, 33.055538 ], [ -85.188741, 32.889727 ], [ -85.184740, 32.870527 ], [ -85.184131, 32.870525 ], [ -85.184914, 32.868944 ], [ -85.184888, 32.863355 ], [ -85.184400, 32.861317 ], [ -85.179353, 32.855269 ], [ -85.177127, 32.853895 ], [ -85.170099, 32.852497 ], [ -85.167710, 32.852419 ], [ -85.165569, 32.852090 ], [ -85.163427, 32.851431 ], [ -85.161615, 32.849948 ], [ -85.160792, 32.848466 ], [ -85.160462, 32.847148 ], [ -85.160133, 32.845500 ], [ -85.159638, 32.844018 ], [ -85.159474, 32.842535 ], [ -85.159309, 32.841382 ], [ -85.159474, 32.839735 ], [ -85.160580, 32.838249 ], [ -85.164651, 32.834791 ], [ -85.168342, 32.828516 ], [ -85.168644, 32.814246 ], [ -85.167939, 32.811612 ], [ -85.162137, 32.804237 ], [ -85.151913, 32.794104 ], [ -85.139285, 32.784921 ], [ -85.134676, 32.782166 ], [ -85.133275, 32.780609 ], [ -85.132186, 32.778897 ], [ -85.132030, 32.776718 ], [ -85.132653, 32.774694 ], [ -85.133120, 32.773449 ], [ -85.133898, 32.772359 ], [ -85.136544, 32.769402 ], [ -85.138412, 32.764576 ], [ -85.138879, 32.760062 ], [ -85.138101, 32.753836 ], [ -85.136077, 32.749633 ], [ -85.132186, 32.746520 ], [ -85.127205, 32.743718 ], [ -85.124092, 32.741694 ], [ -85.121601, 32.739360 ], [ -85.120200, 32.737647 ], [ -85.119733, 32.736091 ], [ -85.119577, 32.734223 ], [ -85.119577, 32.731577 ], [ -85.119422, 32.729397 ], [ -85.119733, 32.726440 ], [ -85.120838, 32.722932 ], [ -85.122738, 32.715727 ], [ -85.117037, 32.692033 ], [ -85.114737, 32.685634 ], [ -85.112637, 32.683434 ], [ -85.104037, 32.679634 ], [ -85.093536, 32.669734 ], [ -85.088483, 32.657758 ], [ -85.089736, 32.655635 ], [ -85.094570, 32.652443 ], [ -85.096005, 32.649983 ], [ -85.097952, 32.645474 ], [ -85.098259, 32.642708 ], [ -85.096620, 32.638199 ], [ -85.092008, 32.636456 ], [ -85.088934, 32.635432 ], [ -85.087294, 32.634407 ], [ -85.086167, 32.633177 ], [ -85.086065, 32.631435 ], [ -85.087192, 32.628463 ], [ -85.088627, 32.626619 ], [ -85.088729, 32.624774 ], [ -85.088319, 32.623032 ], [ -85.087294, 32.620470 ], [ -85.085360, 32.618536 ], [ -85.083616, 32.617800 ], [ -85.082240, 32.616264 ], [ -85.080768, 32.610152 ], [ -85.080288, 32.603577 ], [ -85.076399, 32.594665 ], [ -85.067535, 32.579546 ], [ -85.056926, 32.571242 ], [ -85.035726, 32.553963 ], [ -85.022509, 32.542923 ], [ -85.022045, 32.540044 ], [ -85.020237, 32.534748 ], [ -85.015805, 32.528428 ], [ -85.013788, 32.526108 ], [ -85.008396, 32.524876 ], [ -85.007100, 32.523868 ], [ -85.001532, 32.514741 ], [ -84.999832, 32.504341 ], [ -84.998832, 32.497041 ], [ -84.998332, 32.494142 ], [ -84.996732, 32.492342 ], [ -84.994831, 32.486042 ], [ -84.995231, 32.475242 ], [ -84.998231, 32.469842 ], [ -84.998031, 32.461743 ], [ -84.995331, 32.453243 ], [ -84.993531, 32.450743 ], [ -84.983831, 32.445643 ], [ -84.971831, 32.442843 ], [ -84.967031, 32.435343 ], [ -84.963030, 32.424244 ], [ -84.963430, 32.422544 ], [ -84.971830, 32.416244 ], [ -84.979431, 32.412244 ], [ -84.981098, 32.402833 ], [ -84.979898, 32.400097 ], [ -84.977520, 32.396870 ], [ -84.976767, 32.392648 ], [ -84.979028, 32.389180 ], [ -84.980385, 32.385561 ], [ -84.980084, 32.382244 ], [ -84.979330, 32.379077 ], [ -84.978727, 32.376212 ], [ -84.980084, 32.373347 ], [ -84.982949, 32.371387 ], [ -84.983552, 32.368371 ], [ -84.983242, 32.365122 ], [ -84.983466, 32.363186 ], [ -84.986778, 32.359058 ], [ -85.004582, 32.345196 ], [ -85.008096, 32.336677 ], [ -85.007103, 32.328362 ], [ -85.001874, 32.322015 ], [ -84.989514, 32.319316 ], [ -84.938680, 32.300708 ], [ -84.933800, 32.298260 ], [ -84.922872, 32.285333 ], [ -84.911127, 32.276949 ], [ -84.904023, 32.273749 ], [ -84.893959, 32.265846 ], [ -84.891841, 32.263398 ], [ -84.890894, 32.261504 ], [ -84.891131, 32.259610 ], [ -84.892315, 32.258189 ], [ -84.898234, 32.256768 ], [ -84.901549, 32.255584 ], [ -84.902496, 32.253217 ], [ -84.904087, 32.250838 ], [ -84.907227, 32.249050 ], [ -84.910098, 32.248333 ], [ -84.912488, 32.247463 ], [ -84.913249, 32.245290 ], [ -84.912727, 32.243350 ], [ -84.916327, 32.236551 ], [ -84.920627, 32.233951 ], [ -84.922627, 32.231751 ], [ -84.923527, 32.229751 ], [ -84.922927, 32.224751 ], [ -84.925427, 32.221551 ], [ -84.928227, 32.219851 ], [ -84.930127, 32.219051 ], [ -84.939328, 32.217951 ], [ -84.948995, 32.217849 ], [ -84.953727, 32.217148 ], [ -84.957057, 32.216710 ], [ -84.958985, 32.215571 ], [ -84.960650, 32.214344 ], [ -84.962227, 32.212503 ], [ -84.963367, 32.211014 ], [ -84.964594, 32.209787 ], [ -84.965733, 32.208823 ], [ -84.966346, 32.208034 ], [ -84.966784, 32.206895 ], [ -84.967047, 32.205843 ], [ -84.966928, 32.204451 ], [ -84.966346, 32.202688 ], [ -84.965032, 32.200585 ], [ -84.964944, 32.198920 ], [ -84.965032, 32.196642 ], [ -84.966828, 32.193952 ], [ -84.973728, 32.191552 ], [ -84.995929, 32.184852 ], [ -85.008531, 32.181903 ], [ -85.011267, 32.180493 ], [ -85.013065, 32.179112 ], [ -85.014648, 32.176882 ], [ -85.026583, 32.166104 ], [ -85.030336, 32.161727 ], [ -85.033989, 32.156348 ], [ -85.045593, 32.143758 ], [ -85.047865, 32.142033 ], [ -85.058749, 32.136018 ], [ -85.061144, 32.134065 ], [ -85.062060, 32.132486 ], [ -85.061540, 32.129673 ], [ -85.059180, 32.125153 ], [ -85.055045, 32.113671 ], [ -85.053777, 32.107684 ], [ -85.049550, 32.095362 ], [ -85.047063, 32.090433 ], [ -85.047063, 32.087389 ], [ -85.047740, 32.084908 ], [ -85.051161, 32.082527 ], [ -85.053232, 32.080604 ], [ -85.055813, 32.074439 ], [ -85.055491, 32.072657 ], [ -85.054084, 32.070210 ], [ -85.054179, 32.067985 ], [ -85.056029, 32.063055 ], [ -85.056830, 32.059755 ], [ -85.056430, 32.058055 ], [ -85.056630, 32.054155 ], [ -85.058830, 32.046656 ], [ -85.058030, 32.043756 ], [ -85.055333, 32.040580 ], [ -85.054839, 32.038814 ], [ -85.054627, 32.036694 ], [ -85.055474, 32.034221 ], [ -85.056464, 32.031819 ], [ -85.056253, 32.028336 ], [ -85.055217, 32.027213 ], [ -85.053779, 32.025532 ], [ -85.053214, 32.024189 ], [ -85.053072, 32.023130 ], [ -85.053214, 32.021576 ], [ -85.053669, 32.020662 ], [ -85.054768, 32.017407 ], [ -85.053815, 32.013502 ], [ -85.055075, 32.010714 ], [ -85.063441, 32.004140 ], [ -85.064544, 32.002489 ], [ -85.068030, 31.993357 ], [ -85.068330, 31.986757 ], [ -85.070930, 31.981658 ], [ -85.069930, 31.978358 ], [ -85.066829, 31.974758 ], [ -85.065929, 31.972458 ], [ -85.065929, 31.971158 ], [ -85.067829, 31.967358 ], [ -85.070230, 31.965658 ], [ -85.073930, 31.964158 ], [ -85.083230, 31.962458 ], [ -85.085730, 31.960758 ], [ -85.086730, 31.959158 ], [ -85.086830, 31.957758 ], [ -85.082430, 31.945358 ], [ -85.078930, 31.941459 ], [ -85.078930, 31.940159 ], [ -85.084730, 31.937359 ], [ -85.086430, 31.935959 ], [ -85.091830, 31.928859 ], [ -85.098230, 31.926259 ], [ -85.099530, 31.925259 ], [ -85.100230, 31.924059 ], [ -85.101330, 31.918659 ], [ -85.102430, 31.917359 ], [ -85.109130, 31.914359 ], [ -85.113131, 31.911859 ], [ -85.112731, 31.909859 ], [ -85.109830, 31.908060 ], [ -85.108030, 31.905160 ], [ -85.111330, 31.899360 ], [ -85.110630, 31.896860 ], [ -85.112030, 31.894760 ], [ -85.114031, 31.893360 ], [ -85.117031, 31.892860 ], [ -85.121131, 31.893260 ], [ -85.132931, 31.893060 ], [ -85.134131, 31.892160 ], [ -85.134331, 31.891460 ], [ -85.133731, 31.889560 ], [ -85.131631, 31.886760 ], [ -85.129331, 31.882460 ], [ -85.128431, 31.879660 ], [ -85.128431, 31.877560 ], [ -85.128831, 31.876360 ], [ -85.133731, 31.870061 ], [ -85.135831, 31.862461 ], [ -85.137431, 31.860661 ], [ -85.140131, 31.858761 ], [ -85.140731, 31.857461 ], [ -85.140231, 31.855261 ], [ -85.138031, 31.851262 ], [ -85.137731, 31.845861 ], [ -85.138331, 31.844161 ], [ -85.141331, 31.841061 ], [ -85.141831, 31.839261 ], [ -85.139231, 31.834161 ], [ -85.135931, 31.830462 ], [ -85.133631, 31.826062 ], [ -85.131331, 31.817562 ], [ -85.131531, 31.813062 ], [ -85.132931, 31.808062 ], [ -85.132831, 31.798862 ], [ -85.132231, 31.795162 ], [ -85.132931, 31.792363 ], [ -85.137131, 31.788363 ], [ -85.141931, 31.781963 ], [ -85.140431, 31.779663 ], [ -85.130731, 31.772263 ], [ -85.126330, 31.768863 ], [ -85.125230, 31.767063 ], [ -85.125630, 31.764463 ], [ -85.129231, 31.758663 ], [ -85.126630, 31.752463 ], [ -85.123930, 31.747564 ], [ -85.118930, 31.732664 ], [ -85.119130, 31.730964 ], [ -85.122230, 31.722764 ], [ -85.125730, 31.718864 ], [ -85.126530, 31.716764 ], [ -85.126830, 31.708965 ], [ -85.125530, 31.694965 ], [ -85.122330, 31.691265 ], [ -85.113930, 31.686865 ], [ -85.112630, 31.685165 ], [ -85.109430, 31.677465 ], [ -85.092429, 31.659966 ], [ -85.087829, 31.657866 ], [ -85.085460, 31.657028 ], [ -85.083545, 31.656071 ], [ -85.082013, 31.654730 ], [ -85.080960, 31.653102 ], [ -85.080864, 31.652336 ], [ -85.081429, 31.650966 ], [ -85.082588, 31.649463 ], [ -85.085173, 31.644101 ], [ -85.085365, 31.642186 ], [ -85.085173, 31.640749 ], [ -85.084503, 31.639026 ], [ -85.082829, 31.637967 ], [ -85.080029, 31.636867 ], [ -85.073829, 31.629567 ], [ -85.067628, 31.625267 ], [ -85.065236, 31.624351 ], [ -85.059534, 31.621717 ], [ -85.058169, 31.620227 ], [ -85.057473, 31.618624 ], [ -85.057527, 31.616883 ], [ -85.058330, 31.614546 ], [ -85.060418, 31.611271 ], [ -85.060552, 31.608224 ], [ -85.059696, 31.607262 ], [ -85.057314, 31.606713 ], [ -85.055976, 31.605178 ], [ -85.056405, 31.600963 ], [ -85.058109, 31.593343 ], [ -85.058440, 31.583690 ], [ -85.055417, 31.578696 ], [ -85.055284, 31.577092 ], [ -85.057719, 31.573062 ], [ -85.057960, 31.570840 ], [ -85.052931, 31.562890 ], [ -85.051873, 31.557871 ], [ -85.050838, 31.555551 ], [ -85.045698, 31.548707 ], [ -85.042547, 31.545953 ], [ -85.041881, 31.544684 ], [ -85.041305, 31.540987 ], [ -85.041813, 31.537754 ], [ -85.042983, 31.535200 ], [ -85.047196, 31.528671 ], [ -85.048263, 31.526012 ], [ -85.047649, 31.523751 ], [ -85.044556, 31.520908 ], [ -85.044986, 31.518230 ], [ -85.045642, 31.516813 ], [ -85.048445, 31.513684 ], [ -85.052951, 31.506518 ], [ -85.058923, 31.495989 ], [ -85.062105, 31.488017 ], [ -85.065687, 31.484122 ], [ -85.071621, 31.468384 ], [ -85.069268, 31.453472 ], [ -85.066703, 31.447286 ], [ -85.065955, 31.442979 ], [ -85.065554, 31.439543 ], [ -85.065875, 31.430586 ], [ -85.066970, 31.428594 ], [ -85.068546, 31.427311 ], [ -85.070413, 31.426921 ], [ -85.072898, 31.426477 ], [ -85.074762, 31.424879 ], [ -85.075827, 31.421506 ], [ -85.076746, 31.415971 ], [ -85.079818, 31.411732 ], [ -85.079978, 31.410472 ], [ -85.077387, 31.402844 ], [ -85.077626, 31.398880 ], [ -85.078641, 31.396360 ], [ -85.080403, 31.393932 ], [ -85.082431, 31.384540 ], [ -85.086910, 31.374474 ], [ -85.092167, 31.364576 ], [ -85.092487, 31.362881 ], [ -85.092619, 31.357474 ], [ -85.091791, 31.355207 ], [ -85.090990, 31.354428 ], [ -85.087413, 31.354428 ], [ -85.085918, 31.353146 ], [ -85.085864, 31.350190 ], [ -85.087063, 31.340317 ], [ -85.087810, 31.337981 ], [ -85.089411, 31.336033 ], [ -85.088983, 31.334292 ], [ -85.084152, 31.328313 ], [ -85.083776, 31.318210 ], [ -85.084469, 31.316194 ], [ -85.087404, 31.311223 ], [ -85.087651, 31.308677 ], [ -85.087695, 31.304053 ], [ -85.089774, 31.295026 ], [ -85.093160, 31.289688 ], [ -85.099107, 31.284165 ], [ -85.110309, 31.281733 ], [ -85.112762, 31.280037 ], [ -85.114601, 31.277333 ], [ -85.114548, 31.276302 ], [ -85.112546, 31.274378 ], [ -85.111905, 31.272477 ], [ -85.111983, 31.267987 ], [ -85.113261, 31.264343 ], [ -85.112352, 31.259580 ], [ -85.111711, 31.258022 ], [ -85.109149, 31.254609 ], [ -85.106182, 31.248077 ], [ -85.104260, 31.241869 ], [ -85.102472, 31.237860 ], [ -85.100765, 31.234813 ], [ -85.098844, 31.232524 ], [ -85.096763, 31.225651 ], [ -85.098707, 31.219511 ], [ -85.098704, 31.211286 ], [ -85.099770, 31.209751 ], [ -85.105631, 31.204595 ], [ -85.106963, 31.202693 ], [ -85.108133, 31.195637 ], [ -85.107516, 31.186451 ], [ -85.106503, 31.185305 ], [ -85.104424, 31.185650 ], [ -85.102052, 31.184734 ], [ -85.098507, 31.180153 ], [ -85.098426, 31.177770 ], [ -85.100447, 31.166727 ], [ -85.100207, 31.165490 ], [ -85.092106, 31.160293 ], [ -85.083582, 31.159630 ], [ -85.077801, 31.157889 ], [ -85.076628, 31.156927 ], [ -85.070181, 31.148680 ], [ -85.064028, 31.142495 ], [ -85.062430, 31.139518 ], [ -85.061072, 31.134225 ], [ -85.054677, 31.120818 ], [ -85.052867, 31.119489 ], [ -85.050178, 31.118916 ], [ -85.040513, 31.111583 ], [ -85.037079, 31.109751 ], [ -85.035615, 31.108192 ], [ -85.032832, 31.100570 ], [ -85.029736, 31.096163 ], [ -85.026068, 31.084180 ], [ -85.028333, 31.076851 ], [ -85.028573, 31.074583 ], [ -85.018148, 31.059253 ], [ -85.012642, 31.055402 ], [ -85.011392, 31.053546 ], [ -85.008816, 31.045573 ], [ -85.008552, 31.042824 ], [ -85.009409, 31.032378 ], [ -85.005051, 31.024701 ], [ -85.004549, 31.019180 ], [ -85.000060, 31.014983 ], [ -84.999428, 31.013843 ], [ -84.999626, 31.009079 ], [ -85.001366, 31.005044 ], [ -85.002368, 31.000682 ] ] ], [ [ [ -88.124658, 30.283640 ], [ -88.086812, 30.259864 ], [ -88.074854, 30.249119 ], [ -88.075856, 30.246139 ], [ -88.078786, 30.245039 ], [ -88.109432, 30.242097 ], [ -88.120151, 30.246149 ], [ -88.137083, 30.249179 ], [ -88.166569, 30.249255 ], [ -88.208540, 30.244807 ], [ -88.280571, 30.230274 ], [ -88.304773, 30.228031 ], [ -88.313323, 30.230024 ], [ -88.310025, 30.233233 ], [ -88.299705, 30.231812 ], [ -88.280781, 30.233781 ], [ -88.258370, 30.239595 ], [ -88.224615, 30.245559 ], [ -88.173350, 30.252418 ], [ -88.158303, 30.252393 ], [ -88.141143, 30.255024 ], [ -88.130631, 30.262125 ], [ -88.124722, 30.273541 ], [ -88.124658, 30.283640 ] ] ], [ [ [ -88.023987, 30.490316 ], [ -88.053375, 30.506987 ], [ -88.034988, 30.522453 ], [ -88.026222, 30.516609 ], [ -88.023987, 30.490316 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US02", "STATE": "02", "NAME": "Alaska", "LSAD": "", "CENSUSAREA": 570640.950000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -164.976199, 54.134595 ], [ -164.937766, 54.136682 ], [ -164.921307, 54.128569 ], [ -164.919689, 54.116080 ], [ -164.921464, 54.111083 ], [ -164.953165, 54.078056 ], [ -164.960581, 54.076026 ], [ -165.044322, 54.066629 ], [ -165.203413, 54.087752 ], [ -165.212264, 54.090158 ], [ -165.220871, 54.101574 ], [ -165.198746, 54.116474 ], [ -165.140978, 54.131079 ], [ -165.088486, 54.128005 ], [ -165.067428, 54.123174 ], [ -165.050155, 54.121708 ], [ -165.023065, 54.121919 ], [ -165.007910, 54.134934 ], [ -164.976199, 54.134595 ] ] ], [ [ [ -165.271048, 54.095665 ], [ -165.267012, 54.095467 ], [ -165.234364, 54.065423 ], [ -165.235149, 54.062767 ], [ -165.245830, 54.056110 ], [ -165.282240, 54.059723 ], [ -165.286253, 54.042858 ], [ -165.289109, 54.040003 ], [ -165.313855, 54.045713 ], [ -165.324415, 54.063907 ], [ -165.336836, 54.070126 ], [ -165.365768, 54.073317 ], [ -165.458179, 54.066313 ], [ -165.482747, 54.072218 ], [ -165.483373, 54.075036 ], [ -165.468221, 54.079641 ], [ -165.438972, 54.084136 ], [ -165.322268, 54.094634 ], [ -165.271048, 54.095665 ] ] ], [ [ [ -165.790523, 54.171758 ], [ -165.747893, 54.161297 ], [ -165.742613, 54.158352 ], [ -165.732602, 54.148121 ], [ -165.751676, 54.131374 ], [ -165.750724, 54.126615 ], [ -165.743110, 54.122808 ], [ -165.714198, 54.120815 ], [ -165.667323, 54.132123 ], [ -165.661379, 54.130935 ], [ -165.655573, 54.119100 ], [ -165.671477, 54.096235 ], [ -165.767173, 54.065935 ], [ -165.810747, 54.074764 ], [ -165.826867, 54.079977 ], [ -165.835433, 54.080929 ], [ -165.843047, 54.074267 ], [ -165.850240, 54.051243 ], [ -165.875129, 54.036420 ], [ -165.894444, 54.032388 ], [ -165.900154, 54.038099 ], [ -165.896308, 54.055714 ], [ -165.897261, 54.060634 ], [ -165.901649, 54.062870 ], [ -165.916235, 54.065708 ], [ -165.930242, 54.066554 ], [ -165.984415, 54.061722 ], [ -166.019861, 54.051441 ], [ -166.027733, 54.045917 ], [ -166.046438, 54.044186 ], [ -166.098255, 54.103538 ], [ -166.112242, 54.122528 ], [ -166.101402, 54.144148 ], [ -166.082028, 54.175184 ], [ -166.002465, 54.213629 ], [ -165.983200, 54.221175 ], [ -165.944630, 54.220855 ], [ -165.873076, 54.216455 ], [ -165.868192, 54.214884 ], [ -165.865140, 54.212160 ], [ -165.865872, 54.200014 ], [ -165.871973, 54.189783 ], [ -165.880456, 54.183648 ], [ -165.868076, 54.168731 ], [ -165.863518, 54.166162 ], [ -165.837274, 54.161028 ], [ -165.832421, 54.161333 ], [ -165.825159, 54.164499 ], [ -165.797147, 54.183246 ], [ -165.793781, 54.183433 ], [ -165.792569, 54.181605 ], [ -165.790523, 54.171758 ] ] ], [ [ [ -166.728918, 54.003111 ], [ -166.676640, 54.017419 ], [ -166.644627, 54.014495 ], [ -166.636936, 54.012000 ], [ -166.619754, 54.001264 ], [ -166.599947, 53.983695 ], [ -166.587393, 53.959831 ], [ -166.605438, 53.955354 ], [ -166.621979, 53.953744 ], [ -166.646786, 53.923785 ], [ -166.640466, 53.912519 ], [ -166.619003, 53.893514 ], [ -166.597182, 53.883990 ], [ -166.575090, 53.879236 ], [ -166.560546, 53.878775 ], [ -166.487847, 53.895448 ], [ -166.443699, 53.909727 ], [ -166.436526, 53.916151 ], [ -166.435153, 53.920415 ], [ -166.437083, 53.955644 ], [ -166.373689, 54.010030 ], [ -166.367460, 54.008903 ], [ -166.357117, 54.002343 ], [ -166.354614, 53.999039 ], [ -166.354341, 53.995515 ], [ -166.359925, 53.977136 ], [ -166.366172, 53.961837 ], [ -166.363792, 53.954699 ], [ -166.348326, 53.952319 ], [ -166.319895, 53.960126 ], [ -166.279407, 53.982532 ], [ -166.264519, 53.977550 ], [ -166.210964, 53.933557 ], [ -166.208767, 53.929110 ], [ -166.211207, 53.912334 ], [ -166.236513, 53.881343 ], [ -166.250935, 53.876851 ], [ -166.320004, 53.869527 ], [ -166.351999, 53.858532 ], [ -166.389196, 53.832343 ], [ -166.404896, 53.809345 ], [ -166.434846, 53.798012 ], [ -166.547438, 53.749404 ], [ -166.552078, 53.728498 ], [ -166.540531, 53.715926 ], [ -166.469112, 53.735935 ], [ -166.460324, 53.745838 ], [ -166.420471, 53.762088 ], [ -166.336768, 53.787090 ], [ -166.303201, 53.791538 ], [ -166.212603, 53.817127 ], [ -166.214312, 53.820430 ], [ -166.212330, 53.827769 ], [ -166.198751, 53.836100 ], [ -166.119922, 53.855048 ], [ -166.113037, 53.853716 ], [ -166.097565, 53.843990 ], [ -166.094147, 53.839200 ], [ -166.128226, 53.817880 ], [ -166.128226, 53.809552 ], [ -166.106805, 53.793234 ], [ -166.111317, 53.776856 ], [ -166.166703, 53.733402 ], [ -166.199060, 53.727328 ], [ -166.262974, 53.703710 ], [ -166.265182, 53.698248 ], [ -166.274896, 53.687253 ], [ -166.283267, 53.684219 ], [ -166.444909, 53.640646 ], [ -166.467583, 53.646574 ], [ -166.532639, 53.630533 ], [ -166.547534, 53.620320 ], [ -166.525596, 53.609677 ], [ -166.508939, 53.582313 ], [ -166.514888, 53.579934 ], [ -166.536303, 53.600159 ], [ -166.559117, 53.605779 ], [ -166.581011, 53.530449 ], [ -166.600549, 53.533534 ], [ -166.612446, 53.544242 ], [ -166.624343, 53.543052 ], [ -166.633861, 53.510929 ], [ -166.656234, 53.487119 ], [ -166.662276, 53.485349 ], [ -166.667921, 53.486027 ], [ -166.712475, 53.498445 ], [ -166.735039, 53.506640 ], [ -166.743054, 53.514820 ], [ -166.761175, 53.514297 ], [ -166.772655, 53.496371 ], [ -166.752834, 53.483566 ], [ -166.745696, 53.469289 ], [ -166.751645, 53.443115 ], [ -166.765921, 53.443115 ], [ -166.789062, 53.453100 ], [ -166.863119, 53.443878 ], [ -166.878087, 53.429884 ], [ -166.922674, 53.441136 ], [ -166.959082, 53.455753 ], [ -166.961037, 53.433597 ], [ -166.975314, 53.425269 ], [ -166.994329, 53.429201 ], [ -167.007035, 53.444207 ], [ -167.036104, 53.449289 ], [ -167.048210, 53.448844 ], [ -167.050025, 53.433067 ], [ -167.075386, 53.424979 ], [ -167.112008, 53.416775 ], [ -167.124277, 53.425534 ], [ -167.134134, 53.426448 ], [ -167.177642, 53.395666 ], [ -167.291831, 53.364102 ], [ -167.302982, 53.336911 ], [ -167.308126, 53.334330 ], [ -167.348653, 53.333262 ], [ -167.386984, 53.340671 ], [ -167.442804, 53.321015 ], [ -167.466304, 53.295888 ], [ -167.488215, 53.269121 ], [ -167.515470, 53.267876 ], [ -167.530884, 53.275659 ], [ -167.539247, 53.277864 ], [ -167.589180, 53.288698 ], [ -167.598428, 53.288048 ], [ -167.609903, 53.285300 ], [ -167.622173, 53.250362 ], [ -167.644179, 53.250842 ], [ -167.798984, 53.284757 ], [ -167.835090, 53.299620 ], [ -167.851511, 53.308668 ], [ -167.852333, 53.315599 ], [ -167.790928, 53.335520 ], [ -167.710446, 53.381326 ], [ -167.694484, 53.388034 ], [ -167.653113, 53.392276 ], [ -167.622089, 53.385329 ], [ -167.488252, 53.420001 ], [ -167.474457, 53.431782 ], [ -167.473328, 53.438001 ], [ -167.457366, 53.442793 ], [ -167.393985, 53.439752 ], [ -167.373527, 53.432776 ], [ -167.355624, 53.424498 ], [ -167.332792, 53.433107 ], [ -167.319143, 53.451317 ], [ -167.301290, 53.466006 ], [ -167.278827, 53.478565 ], [ -167.267902, 53.478115 ], [ -167.226182, 53.468692 ], [ -167.217606, 53.465389 ], [ -167.199966, 53.463039 ], [ -167.193801, 53.467007 ], [ -167.158520, 53.503747 ], [ -167.179947, 53.518068 ], [ -167.175189, 53.524016 ], [ -167.102305, 53.515077 ], [ -167.105816, 53.540507 ], [ -167.131239, 53.547267 ], [ -167.135695, 53.551227 ], [ -167.161640, 53.605909 ], [ -167.163196, 53.613813 ], [ -167.159808, 53.617308 ], [ -167.140430, 53.626968 ], [ -167.107836, 53.633056 ], [ -167.091377, 53.633438 ], [ -167.084579, 53.626502 ], [ -167.070082, 53.619857 ], [ -167.062187, 53.620058 ], [ -167.009635, 53.635344 ], [ -167.008671, 53.642040 ], [ -167.017863, 53.648607 ], [ -167.030011, 53.653559 ], [ -167.071823, 53.665560 ], [ -167.067674, 53.687267 ], [ -167.057695, 53.698864 ], [ -167.041245, 53.707929 ], [ -167.022385, 53.715467 ], [ -166.999282, 53.718520 ], [ -166.923324, 53.719719 ], [ -166.894976, 53.717746 ], [ -166.859022, 53.674439 ], [ -166.861769, 53.659234 ], [ -166.832725, 53.657376 ], [ -166.805874, 53.665733 ], [ -166.824218, 53.684630 ], [ -166.825408, 53.704855 ], [ -166.786692, 53.705301 ], [ -166.779991, 53.719126 ], [ -166.787318, 53.734577 ], [ -166.856491, 53.747301 ], [ -166.942766, 53.769562 ], [ -166.960681, 53.776841 ], [ -166.975635, 53.775254 ], [ -166.983294, 53.771348 ], [ -166.992846, 53.762604 ], [ -167.005778, 53.755446 ], [ -167.016863, 53.754936 ], [ -167.024981, 53.757241 ], [ -167.075859, 53.786272 ], [ -167.141966, 53.826932 ], [ -167.140992, 53.866774 ], [ -167.058168, 53.929778 ], [ -167.031252, 53.945204 ], [ -166.930452, 53.976091 ], [ -166.879488, 53.988716 ], [ -166.818635, 53.993198 ], [ -166.751681, 54.016050 ], [ -166.746095, 54.016936 ], [ -166.742587, 54.015501 ], [ -166.728918, 54.003111 ] ] ], [ [ [ -169.721744, 52.947117 ], [ -169.741096, 52.951512 ], [ -169.758008, 52.967246 ], [ -169.760725, 52.971556 ], [ -169.762740, 52.978050 ], [ -169.745743, 53.021470 ], [ -169.742538, 53.024072 ], [ -169.698128, 53.033779 ], [ -169.680033, 53.035075 ], [ -169.664930, 53.023973 ], [ -169.663576, 53.021258 ], [ -169.666078, 52.997068 ], [ -169.698274, 52.958267 ], [ -169.721744, 52.947117 ] ] ], [ [ [ -169.996712, 52.891475 ], [ -169.999094, 52.884034 ], [ -170.002368, 52.880239 ], [ -170.015514, 52.870260 ], [ -170.050274, 52.857433 ], [ -170.095331, 52.870851 ], [ -170.113189, 52.891078 ], [ -170.112853, 52.902043 ], [ -170.092221, 52.919387 ], [ -170.083985, 52.923640 ], [ -170.046560, 52.923853 ], [ -170.020493, 52.917171 ], [ -170.002071, 52.910043 ], [ -169.995982, 52.902378 ], [ -169.996712, 52.891475 ] ] ], [ [ [ -168.211705, 53.256184 ], [ -168.226915, 53.254822 ], [ -168.270744, 53.242811 ], [ -168.296229, 53.227235 ], [ -168.312376, 53.215231 ], [ -168.341678, 53.185911 ], [ -168.344468, 53.155215 ], [ -168.373150, 53.128891 ], [ -168.392379, 53.123609 ], [ -168.412522, 53.110683 ], [ -168.433734, 53.093934 ], [ -168.442859, 53.085562 ], [ -168.451161, 53.075131 ], [ -168.457103, 53.055839 ], [ -168.497490, 53.035403 ], [ -168.527404, 53.028588 ], [ -168.546059, 53.029580 ], [ -168.553195, 53.033296 ], [ -168.578895, 53.029915 ], [ -168.587808, 53.027175 ], [ -168.613964, 53.008776 ], [ -168.625257, 52.998214 ], [ -168.688468, 52.966400 ], [ -168.741851, 52.951442 ], [ -168.808854, 52.926102 ], [ -168.907003, 52.884006 ], [ -169.041338, 52.839348 ], [ -169.102465, 52.824349 ], [ -169.054243, 52.863266 ], [ -169.038767, 52.869662 ], [ -168.992403, 52.873440 ], [ -168.971710, 52.878028 ], [ -168.958983, 52.886048 ], [ -168.968469, 52.916183 ], [ -168.955144, 52.933315 ], [ -168.899512, 52.935856 ], [ -168.863402, 52.966099 ], [ -168.871387, 52.990422 ], [ -168.871387, 53.003747 ], [ -168.802241, 53.027774 ], [ -168.763689, 53.070961 ], [ -168.759691, 53.081461 ], [ -168.768544, 53.093684 ], [ -168.776176, 53.097766 ], [ -168.789424, 53.100970 ], [ -168.802030, 53.108226 ], [ -168.804901, 53.120015 ], [ -168.799469, 53.143794 ], [ -168.792327, 53.155720 ], [ -168.788756, 53.160749 ], [ -168.763331, 53.182812 ], [ -168.617143, 53.260985 ], [ -168.596432, 53.272983 ], [ -168.576691, 53.268224 ], [ -168.539398, 53.251670 ], [ -168.524991, 53.252311 ], [ -168.501365, 53.257340 ], [ -168.490957, 53.264009 ], [ -168.445083, 53.265330 ], [ -168.412851, 53.257859 ], [ -168.366519, 53.252024 ], [ -168.361758, 53.252253 ], [ -168.343994, 53.262150 ], [ -168.365388, 53.309105 ], [ -168.425595, 53.324142 ], [ -168.432734, 53.333660 ], [ -168.404180, 53.349126 ], [ -168.393473, 53.374110 ], [ -168.404180, 53.416941 ], [ -168.398232, 53.425269 ], [ -168.386886, 53.431496 ], [ -168.342127, 53.475992 ], [ -168.315847, 53.481729 ], [ -168.295793, 53.489062 ], [ -168.239572, 53.518491 ], [ -168.238321, 53.521902 ], [ -168.200443, 53.534079 ], [ -168.144620, 53.545342 ], [ -168.004624, 53.566053 ], [ -167.981038, 53.561714 ], [ -167.962723, 53.554069 ], [ -167.960861, 53.552550 ], [ -167.965714, 53.543440 ], [ -167.965038, 53.538913 ], [ -167.938981, 53.526907 ], [ -167.901871, 53.520508 ], [ -167.888901, 53.519691 ], [ -167.816998, 53.517947 ], [ -167.796866, 53.521113 ], [ -167.791026, 53.521076 ], [ -167.789164, 53.519329 ], [ -167.786387, 53.513896 ], [ -167.784099, 53.501048 ], [ -167.788066, 53.492411 ], [ -167.808117, 53.473861 ], [ -167.843611, 53.453893 ], [ -167.853225, 53.445469 ], [ -167.858337, 53.437910 ], [ -167.856837, 53.428609 ], [ -167.851698, 53.421236 ], [ -167.844800, 53.417497 ], [ -167.839520, 53.410325 ], [ -167.839887, 53.394432 ], [ -167.842328, 53.386489 ], [ -167.852217, 53.378294 ], [ -167.872879, 53.367360 ], [ -167.878128, 53.366902 ], [ -167.959096, 53.341788 ], [ -167.988487, 53.329578 ], [ -168.009301, 53.317263 ], [ -168.039760, 53.304276 ], [ -168.158943, 53.267710 ], [ -168.211705, 53.256184 ] ] ], [ [ [ -169.943521, 52.861099 ], [ -169.905631, 52.853240 ], [ -169.860214, 52.858377 ], [ -169.868144, 52.875494 ], [ -169.856722, 52.879301 ], [ -169.811463, 52.880839 ], [ -169.773504, 52.894450 ], [ -169.749177, 52.893269 ], [ -169.704736, 52.886272 ], [ -169.666512, 52.864349 ], [ -169.683482, 52.826618 ], [ -169.704105, 52.793938 ], [ -169.702533, 52.779364 ], [ -169.717762, 52.774605 ], [ -169.733942, 52.775557 ], [ -169.750136, 52.790576 ], [ -169.838232, 52.817280 ], [ -169.879866, 52.816088 ], [ -169.886671, 52.808563 ], [ -169.897078, 52.802131 ], [ -169.927446, 52.792675 ], [ -169.951498, 52.788615 ], [ -169.962883, 52.789882 ], [ -169.995422, 52.804676 ], [ -170.012487, 52.831161 ], [ -170.004218, 52.846743 ], [ -169.990149, 52.856266 ], [ -169.975345, 52.858884 ], [ -169.943521, 52.861099 ] ] ], [ [ [ 172.763366, 52.823656 ], [ 172.767390, 52.848372 ], [ 172.766693, 52.862669 ], [ 172.754236, 52.877490 ], [ 172.640372, 52.925441 ], [ 172.585075, 52.921327 ], [ 172.548700, 52.914322 ], [ 172.512996, 52.905181 ], [ 172.469022, 52.911337 ], [ 172.461667, 52.927160 ], [ 172.629077, 53.001324 ], [ 172.643266, 53.004979 ], [ 172.746566, 53.010750 ], [ 173.107249, 52.993228 ], [ 173.121988, 52.990352 ], [ 173.131510, 52.987521 ], [ 173.159648, 52.974163 ], [ 173.172406, 52.960545 ], [ 173.211752, 52.939489 ], [ 173.235265, 52.943628 ], [ 173.251326, 52.944362 ], [ 173.295399, 52.926987 ], [ 173.421682, 52.845477 ], [ 173.427670, 52.830763 ], [ 173.423819, 52.828799 ], [ 173.413016, 52.827891 ], [ 173.302331, 52.823286 ], [ 173.284417, 52.827933 ], [ 173.229070, 52.856156 ], [ 173.224051, 52.856403 ], [ 173.204948, 52.848911 ], [ 173.187952, 52.831500 ], [ 173.173543, 52.804378 ], [ 173.166899, 52.795229 ], [ 173.142678, 52.786254 ], [ 173.134521, 52.784357 ], [ 173.118560, 52.784440 ], [ 172.998472, 52.796979 ], [ 172.903628, 52.761667 ], [ 172.809387, 52.789290 ], [ 172.763366, 52.823656 ] ] ], [ [ [ 173.932926, 52.746649 ], [ 173.930912, 52.750227 ], [ 173.925271, 52.752433 ], [ 173.894753, 52.750780 ], [ 173.875585, 52.761898 ], [ 173.861653, 52.773579 ], [ 173.867436, 52.775128 ], [ 173.881412, 52.775028 ], [ 173.897452, 52.771780 ], [ 173.931553, 52.758574 ], [ 173.940037, 52.751860 ], [ 173.932926, 52.746649 ] ] ], [ [ [ 174.004827, 52.719857 ], [ 173.972600, 52.729423 ], [ 173.960880, 52.738136 ], [ 173.952793, 52.747885 ], [ 173.954075, 52.751410 ], [ 173.983432, 52.749053 ], [ 174.003651, 52.744283 ], [ 174.021702, 52.730286 ], [ 174.004827, 52.719857 ] ] ], [ [ [ -170.170683, 52.784918 ], [ -170.128714, 52.787425 ], [ -170.061868, 52.773525 ], [ -170.053443, 52.769076 ], [ -170.052922, 52.758745 ], [ -170.055363, 52.745887 ], [ -170.070287, 52.724301 ], [ -170.077734, 52.720416 ], [ -170.114087, 52.716172 ], [ -170.170646, 52.717359 ], [ -170.184564, 52.721937 ], [ -170.185684, 52.723007 ], [ -170.170683, 52.784918 ] ] ], [ [ [ 174.069186, 52.734888 ], [ 174.092073, 52.742060 ], [ 174.096650, 52.743485 ], [ 174.133150, 52.733786 ], [ 174.145326, 52.728550 ], [ 174.155764, 52.715375 ], [ 174.159252, 52.707387 ], [ 174.158146, 52.706059 ], [ 174.109409, 52.708560 ], [ 174.071842, 52.718295 ], [ 174.066195, 52.731042 ], [ 174.069186, 52.734888 ] ] ], [ [ [ -170.841936, 52.558171 ], [ -170.833364, 52.599985 ], [ -170.820641, 52.633091 ], [ -170.817943, 52.636275 ], [ -170.727717, 52.679978 ], [ -170.671545, 52.698082 ], [ -170.633753, 52.697469 ], [ -170.579913, 52.682029 ], [ -170.562734, 52.674785 ], [ -170.559523, 52.667907 ], [ -170.557324, 52.652105 ], [ -170.563610, 52.640706 ], [ -170.603862, 52.601732 ], [ -170.635419, 52.595711 ], [ -170.659041, 52.593811 ], [ -170.665266, 52.595260 ], [ -170.668075, 52.600677 ], [ -170.674453, 52.603385 ], [ -170.683854, 52.602485 ], [ -170.696488, 52.598364 ], [ -170.735824, 52.580823 ], [ -170.767378, 52.558254 ], [ -170.777143, 52.546664 ], [ -170.788495, 52.540240 ], [ -170.841936, 52.558171 ] ] ], [ [ [ -171.294554, 52.451105 ], [ -171.299348, 52.448716 ], [ -171.304170, 52.449952 ], [ -171.313083, 52.472932 ], [ -171.312658, 52.493502 ], [ -171.307500, 52.501514 ], [ -171.291387, 52.514813 ], [ -171.277165, 52.522634 ], [ -171.252053, 52.529954 ], [ -171.196013, 52.500106 ], [ -171.194639, 52.498039 ], [ -171.208919, 52.469023 ], [ -171.214565, 52.463300 ], [ -171.236843, 52.450527 ], [ -171.252316, 52.449466 ], [ -171.294554, 52.451105 ] ] ], [ [ [ 173.587554, 52.476785 ], [ 173.623883, 52.506948 ], [ 173.680586, 52.512878 ], [ 173.736270, 52.512422 ], [ 173.769503, 52.512072 ], [ 173.772799, 52.509905 ], [ 173.772402, 52.506877 ], [ 173.754979, 52.496127 ], [ 173.739385, 52.493257 ], [ 173.707741, 52.477377 ], [ 173.695719, 52.458935 ], [ 173.691601, 52.445935 ], [ 173.693860, 52.438694 ], [ 173.702252, 52.434804 ], [ 173.704299, 52.432192 ], [ 173.712323, 52.421033 ], [ 173.719161, 52.397703 ], [ 173.725696, 52.356579 ], [ 173.651293, 52.356370 ], [ 173.644793, 52.357598 ], [ 173.640825, 52.359428 ], [ 173.606767, 52.378249 ], [ 173.595397, 52.391893 ], [ 173.588794, 52.400973 ], [ 173.559891, 52.401165 ], [ 173.543778, 52.392666 ], [ 173.512162, 52.385035 ], [ 173.483843, 52.383485 ], [ 173.465442, 52.384621 ], [ 173.455586, 52.389656 ], [ 173.395500, 52.402647 ], [ 173.385704, 52.404072 ], [ 173.356927, 52.403873 ], [ 173.356103, 52.405563 ], [ 173.380058, 52.431843 ], [ 173.440111, 52.453664 ], [ 173.445696, 52.455031 ], [ 173.467698, 52.444473 ], [ 173.476243, 52.441909 ], [ 173.501022, 52.440926 ], [ 173.525161, 52.448137 ], [ 173.530105, 52.449968 ], [ 173.550002, 52.467067 ], [ 173.549605, 52.469989 ], [ 173.545302, 52.476000 ], [ 173.555739, 52.479472 ], [ 173.587554, 52.476785 ] ] ], [ [ [ 175.911286, 52.334831 ], [ 175.902770, 52.336823 ], [ 175.890684, 52.344514 ], [ 175.873317, 52.361138 ], [ 175.874353, 52.371004 ], [ 175.906734, 52.375651 ], [ 175.950560, 52.368357 ], [ 175.966521, 52.359728 ], [ 175.944180, 52.336437 ], [ 175.911286, 52.334831 ] ] ], [ [ [ -172.633153, 52.266215 ], [ -172.620261, 52.298751 ], [ -172.574154, 52.345323 ], [ -172.568051, 52.349420 ], [ -172.474610, 52.383763 ], [ -172.448182, 52.391439 ], [ -172.405243, 52.389442 ], [ -172.326444, 52.366472 ], [ -172.311427, 52.356456 ], [ -172.302393, 52.342357 ], [ -172.301445, 52.329951 ], [ -172.313133, 52.320697 ], [ -172.414419, 52.276740 ], [ -172.528095, 52.254336 ], [ -172.608935, 52.253014 ], [ -172.616839, 52.255317 ], [ -172.633153, 52.266215 ] ] ], [ [ [ -173.602446, 52.153773 ], [ -173.590560, 52.145393 ], [ -173.514171, 52.108348 ], [ -173.497020, 52.103641 ], [ -173.467877, 52.116423 ], [ -173.375229, 52.108228 ], [ -173.375595, 52.106343 ], [ -173.372574, 52.102750 ], [ -173.357498, 52.096129 ], [ -173.238295, 52.100443 ], [ -173.173206, 52.109136 ], [ -173.124504, 52.109420 ], [ -173.119255, 52.107628 ], [ -173.107373, 52.099280 ], [ -173.066430, 52.096330 ], [ -173.019588, 52.097881 ], [ -172.958523, 52.093648 ], [ -172.960751, 52.087018 ], [ -173.033166, 52.074611 ], [ -173.047540, 52.073329 ], [ -173.107933, 52.078828 ], [ -173.206837, 52.063532 ], [ -173.313705, 52.058701 ], [ -173.424178, 52.046298 ], [ -173.511915, 52.031278 ], [ -173.548385, 52.029308 ], [ -173.612014, 52.051148 ], [ -173.718000, 52.063069 ], [ -173.799574, 52.053650 ], [ -173.816999, 52.048538 ], [ -173.820692, 52.043312 ], [ -173.831555, 52.040763 ], [ -173.901075, 52.049435 ], [ -173.937239, 52.057513 ], [ -173.935561, 52.064731 ], [ -173.971330, 52.099428 ], [ -173.992274, 52.100590 ], [ -174.001866, 52.097641 ], [ -174.011338, 52.098862 ], [ -174.035082, 52.112952 ], [ -174.046750, 52.122403 ], [ -174.052296, 52.130400 ], [ -174.048451, 52.132911 ], [ -174.036854, 52.135878 ], [ -173.984245, 52.127855 ], [ -173.890733, 52.125470 ], [ -173.830906, 52.110450 ], [ -173.824087, 52.105892 ], [ -173.818277, 52.105363 ], [ -173.802339, 52.106390 ], [ -173.721266, 52.130207 ], [ -173.654404, 52.146192 ], [ -173.624771, 52.152213 ], [ -173.602446, 52.153773 ] ] ], [ [ [ -136.355431, 58.222617 ], [ -136.334611, 58.219048 ], [ -136.322713, 58.214289 ], [ -136.283886, 58.223685 ], [ -136.274646, 58.214657 ], [ -136.239246, 58.171913 ], [ -136.215116, 58.157308 ], [ -136.199875, 58.154133 ], [ -136.193525, 58.158578 ], [ -136.203642, 58.174416 ], [ -136.199854, 58.180871 ], [ -136.162108, 58.218724 ], [ -136.139007, 58.224393 ], [ -136.036160, 58.219210 ], [ -136.023978, 58.207473 ], [ -135.995402, 58.199218 ], [ -135.976386, 58.202029 ], [ -135.966119, 58.211386 ], [ -135.914178, 58.244073 ], [ -135.823562, 58.282975 ], [ -135.801133, 58.287716 ], [ -135.783380, 58.286709 ], [ -135.764372, 58.266276 ], [ -135.735100, 58.240213 ], [ -135.712398, 58.231892 ], [ -135.630521, 58.222933 ], [ -135.589198, 58.213677 ], [ -135.522646, 58.185909 ], [ -135.504671, 58.174914 ], [ -135.497911, 58.168882 ], [ -135.524668, 58.120750 ], [ -135.540712, 58.101750 ], [ -135.586820, 58.081670 ], [ -135.630741, 58.035007 ], [ -135.638490, 57.994508 ], [ -135.621582, 57.984623 ], [ -135.593287, 57.989636 ], [ -135.581753, 57.997568 ], [ -135.564307, 58.015007 ], [ -135.567817, 58.023420 ], [ -135.565443, 58.041120 ], [ -135.563434, 58.043491 ], [ -135.544529, 58.060880 ], [ -135.496739, 58.086212 ], [ -135.451444, 58.134348 ], [ -135.420107, 58.144202 ], [ -135.411777, 58.145473 ], [ -135.397518, 58.144155 ], [ -135.275797, 58.097024 ], [ -135.260951, 58.097323 ], [ -135.108896, 58.088270 ], [ -135.084832, 58.080869 ], [ -135.082981, 58.074737 ], [ -135.070700, 58.061242 ], [ -134.977183, 58.049943 ], [ -134.967723, 58.047625 ], [ -134.950844, 58.036993 ], [ -134.935005, 58.021639 ], [ -134.912854, 57.979287 ], [ -134.921104, 57.935298 ], [ -134.926395, 57.921919 ], [ -135.004952, 57.884338 ], [ -135.140674, 57.926114 ], [ -135.173712, 57.919399 ], [ -135.165220, 57.901524 ], [ -135.146717, 57.891656 ], [ -135.131957, 57.885241 ], [ -135.065720, 57.869451 ], [ -134.991819, 57.835436 ], [ -134.954547, 57.815785 ], [ -134.949436, 57.805027 ], [ -135.023370, 57.780537 ], [ -135.198960, 57.775092 ], [ -135.225158, 57.777783 ], [ -135.313776, 57.805739 ], [ -135.343991, 57.821444 ], [ -135.389894, 57.850991 ], [ -135.418517, 57.860506 ], [ -135.514151, 57.885371 ], [ -135.552802, 57.902711 ], [ -135.581326, 57.903056 ], [ -135.613039, 57.909123 ], [ -135.685613, 57.932917 ], [ -135.718330, 57.939461 ], [ -135.732607, 57.936487 ], [ -135.738556, 57.931728 ], [ -135.732607, 57.927564 ], [ -135.699294, 57.922210 ], [ -135.660033, 57.912097 ], [ -135.638618, 57.900795 ], [ -135.611849, 57.894251 ], [ -135.596769, 57.889705 ], [ -135.589170, 57.886409 ], [ -135.575718, 57.883548 ], [ -135.518882, 57.857383 ], [ -135.503498, 57.840860 ], [ -135.469477, 57.834466 ], [ -135.377758, 57.802212 ], [ -135.376444, 57.792039 ], [ -135.364221, 57.775347 ], [ -135.328887, 57.748420 ], [ -135.291560, 57.737468 ], [ -135.201461, 57.728171 ], [ -135.151475, 57.738296 ], [ -135.098422, 57.754898 ], [ -135.063972, 57.750847 ], [ -135.024837, 57.742990 ], [ -135.012577, 57.746105 ], [ -134.978120, 57.763125 ], [ -134.939924, 57.763612 ], [ -134.929726, 57.759203 ], [ -134.921604, 57.742376 ], [ -134.914790, 57.705821 ], [ -134.918167, 57.682272 ], [ -134.867433, 57.623439 ], [ -134.856386, 57.598967 ], [ -134.824891, 57.500067 ], [ -134.837120, 57.482761 ], [ -134.874346, 57.464406 ], [ -134.902680, 57.459349 ], [ -135.025148, 57.454315 ], [ -135.084338, 57.464671 ], [ -135.091216, 57.466352 ], [ -135.096818, 57.469916 ], [ -135.134063, 57.497681 ], [ -135.242855, 57.546302 ], [ -135.325849, 57.577178 ], [ -135.392499, 57.599909 ], [ -135.474703, 57.631381 ], [ -135.514801, 57.650349 ], [ -135.571606, 57.674397 ], [ -135.615418, 57.696756 ], [ -135.638023, 57.700920 ], [ -135.647541, 57.694971 ], [ -135.640998, 57.687238 ], [ -135.622557, 57.672961 ], [ -135.589839, 57.660469 ], [ -135.596978, 57.650951 ], [ -135.601369, 57.648815 ], [ -135.618988, 57.640244 ], [ -135.636834, 57.643218 ], [ -135.650701, 57.652520 ], [ -135.684951, 57.677508 ], [ -135.699537, 57.676476 ], [ -135.709595, 57.672051 ], [ -135.707561, 57.664017 ], [ -135.695112, 57.651532 ], [ -135.660902, 57.629196 ], [ -135.592778, 57.602474 ], [ -135.571186, 57.605367 ], [ -135.546143, 57.613826 ], [ -135.526303, 57.606388 ], [ -135.511012, 57.595906 ], [ -135.519471, 57.588615 ], [ -135.527610, 57.589003 ], [ -135.557812, 57.583449 ], [ -135.570574, 57.579613 ], [ -135.587475, 57.568829 ], [ -135.589542, 57.555000 ], [ -135.566699, 57.545482 ], [ -135.565747, 57.537867 ], [ -135.577831, 57.520530 ], [ -135.578215, 57.516445 ], [ -135.565271, 57.510209 ], [ -135.549627, 57.482016 ], [ -135.550310, 57.470141 ], [ -135.553903, 57.454870 ], [ -135.557765, 57.451966 ], [ -135.610454, 57.442232 ], [ -135.613576, 57.438173 ], [ -135.611786, 57.431154 ], [ -135.612882, 57.424907 ], [ -135.621725, 57.419245 ], [ -135.626558, 57.409961 ], [ -135.647179, 57.406132 ], [ -135.664449, 57.407229 ], [ -135.667985, 57.405124 ], [ -135.669837, 57.400578 ], [ -135.670267, 57.396215 ], [ -135.668153, 57.392832 ], [ -135.669416, 57.389296 ], [ -135.691043, 57.383518 ], [ -135.692400, 57.375267 ], [ -135.711401, 57.367760 ], [ -135.720478, 57.373663 ], [ -135.768018, 57.383435 ], [ -135.843810, 57.390896 ], [ -135.892131, 57.408048 ], [ -135.900816, 57.418181 ], [ -135.896979, 57.440719 ], [ -135.943766, 57.458780 ], [ -135.966986, 57.472759 ], [ -136.014529, 57.506227 ], [ -136.030458, 57.521540 ], [ -136.021283, 57.531551 ], [ -136.001717, 57.544499 ], [ -136.061747, 57.592068 ], [ -136.106796, 57.616567 ], [ -136.130611, 57.624607 ], [ -136.187897, 57.625730 ], [ -136.207876, 57.638107 ], [ -136.280809, 57.717379 ], [ -136.314631, 57.758703 ], [ -136.304684, 57.771051 ], [ -136.309429, 57.779465 ], [ -136.365052, 57.828561 ], [ -136.372377, 57.832587 ], [ -136.391157, 57.832653 ], [ -136.458829, 57.853901 ], [ -136.474424, 57.871648 ], [ -136.484259, 57.896460 ], [ -136.534201, 57.913938 ], [ -136.557651, 57.912135 ], [ -136.572045, 57.918469 ], [ -136.573288, 57.926844 ], [ -136.563223, 58.035052 ], [ -136.559999, 58.063358 ], [ -136.556247, 58.077019 ], [ -136.538708, 58.093482 ], [ -136.500119, 58.104787 ], [ -136.475811, 58.101294 ], [ -136.469272, 58.096868 ], [ -136.457153, 58.089367 ], [ -136.445256, 58.073306 ], [ -136.431574, 58.071521 ], [ -136.428004, 58.075685 ], [ -136.438117, 58.092936 ], [ -136.446286, 58.113340 ], [ -136.420449, 58.131857 ], [ -136.365544, 58.148854 ], [ -136.314385, 58.125654 ], [ -136.306057, 58.127438 ], [ -136.303678, 58.134577 ], [ -136.304272, 58.142905 ], [ -136.354836, 58.192279 ], [ -136.361380, 58.214289 ], [ -136.355431, 58.222617 ] ] ], [ [ [ -170.286318, 57.128169 ], [ -170.290793, 57.145052 ], [ -170.303963, 57.154910 ], [ -170.324840, 57.156769 ], [ -170.359817, 57.156118 ], [ -170.421867, 57.161202 ], [ -170.423548, 57.169327 ], [ -170.420410, 57.191760 ], [ -170.418919, 57.192844 ], [ -170.402772, 57.201933 ], [ -170.390121, 57.206248 ], [ -170.331880, 57.217488 ], [ -170.311707, 57.219122 ], [ -170.291916, 57.212056 ], [ -170.267664, 57.210649 ], [ -170.239557, 57.214658 ], [ -170.161647, 57.229656 ], [ -170.150813, 57.223168 ], [ -170.170848, 57.181100 ], [ -170.286318, 57.128169 ] ] ], [ [ [ -134.608358, 58.173472 ], [ -134.594804, 58.183511 ], [ -134.559241, 58.195121 ], [ -134.541609, 58.184327 ], [ -134.519644, 58.175771 ], [ -134.500740, 58.172546 ], [ -134.479810, 58.171199 ], [ -134.462633, 58.173851 ], [ -134.446657, 58.173583 ], [ -134.413953, 58.167546 ], [ -134.401512, 58.163427 ], [ -134.371445, 58.148966 ], [ -134.327360, 58.143880 ], [ -134.317037, 58.145440 ], [ -134.306483, 58.152490 ], [ -134.259705, 58.157712 ], [ -134.215981, 58.162128 ], [ -134.177467, 58.159640 ], [ -134.166332, 58.132558 ], [ -134.167257, 58.128577 ], [ -134.174352, 58.125284 ], [ -134.192724, 58.107685 ], [ -134.189370, 58.083444 ], [ -134.183983, 58.077295 ], [ -134.169743, 58.066845 ], [ -134.138231, 58.047103 ], [ -134.098652, 58.018748 ], [ -134.091885, 58.010777 ], [ -134.087461, 58.001685 ], [ -134.087572, 57.996475 ], [ -134.101549, 57.988716 ], [ -134.101125, 57.984070 ], [ -134.089575, 57.974357 ], [ -134.068949, 57.961083 ], [ -134.016873, 57.930006 ], [ -133.999948, 57.914810 ], [ -133.996340, 57.904167 ], [ -133.995977, 57.895632 ], [ -133.963791, 57.854628 ], [ -133.934735, 57.837626 ], [ -133.904874, 57.807406 ], [ -133.902695, 57.797797 ], [ -133.903854, 57.794818 ], [ -133.908085, 57.791670 ], [ -133.888989, 57.751745 ], [ -133.877568, 57.734613 ], [ -133.880423, 57.726999 ], [ -133.891845, 57.710818 ], [ -133.896846, 57.685524 ], [ -133.868134, 57.660137 ], [ -133.837424, 57.638486 ], [ -133.832895, 57.635733 ], [ -133.821673, 57.633887 ], [ -133.817662, 57.629764 ], [ -133.808285, 57.609604 ], [ -133.806003, 57.583457 ], [ -133.807133, 57.578770 ], [ -133.811640, 57.572365 ], [ -133.817600, 57.568353 ], [ -133.840838, 57.576865 ], [ -133.859635, 57.605325 ], [ -133.858010, 57.616940 ], [ -133.863112, 57.623701 ], [ -133.911329, 57.663562 ], [ -133.962582, 57.689887 ], [ -133.970087, 57.695342 ], [ -133.994964, 57.719821 ], [ -134.010728, 57.759392 ], [ -134.013144, 57.789393 ], [ -134.030820, 57.818646 ], [ -134.061833, 57.829808 ], [ -134.098628, 57.850550 ], [ -134.121337, 57.871236 ], [ -134.119210, 57.872917 ], [ -134.121904, 57.882520 ], [ -134.126105, 57.890260 ], [ -134.132146, 57.896189 ], [ -134.142164, 57.922353 ], [ -134.159296, 57.950906 ], [ -134.194512, 57.982315 ], [ -134.229237, 58.016712 ], [ -134.244051, 58.019211 ], [ -134.266848, 58.021338 ], [ -134.270913, 58.013242 ], [ -134.264889, 57.999674 ], [ -134.242101, 57.983267 ], [ -134.233535, 57.969942 ], [ -134.238294, 57.966135 ], [ -134.323955, 57.997543 ], [ -134.331569, 57.998495 ], [ -134.334424, 57.992785 ], [ -134.279221, 57.911883 ], [ -134.279221, 57.891895 ], [ -134.294849, 57.863645 ], [ -134.291429, 57.857346 ], [ -134.283017, 57.857346 ], [ -134.269914, 57.859066 ], [ -134.249716, 57.872860 ], [ -134.240198, 57.870004 ], [ -134.146342, 57.760258 ], [ -134.127700, 57.739216 ], [ -134.116097, 57.727582 ], [ -134.045370, 57.675347 ], [ -134.078573, 57.670427 ], [ -134.089280, 57.665668 ], [ -134.089875, 57.660314 ], [ -134.083927, 57.656745 ], [ -134.077383, 57.656745 ], [ -134.054183, 57.658530 ], [ -134.020169, 57.656734 ], [ -134.013367, 57.655898 ], [ -133.993974, 57.649095 ], [ -133.958454, 57.629537 ], [ -133.935976, 57.614414 ], [ -133.934361, 57.601765 ], [ -133.945156, 57.569841 ], [ -133.943417, 57.561555 ], [ -133.933216, 57.544450 ], [ -133.920557, 57.530088 ], [ -133.901074, 57.517219 ], [ -133.886269, 57.504999 ], [ -133.857368, 57.463964 ], [ -133.869832, 57.458456 ], [ -133.883246, 57.466031 ], [ -133.894195, 57.479233 ], [ -133.904223, 57.479587 ], [ -133.910821, 57.478286 ], [ -133.916889, 57.468719 ], [ -133.927539, 57.469570 ], [ -133.940564, 57.476501 ], [ -133.949487, 57.479475 ], [ -133.960195, 57.475311 ], [ -133.972092, 57.475311 ], [ -133.998266, 57.488993 ], [ -134.032768, 57.493157 ], [ -134.050019, 57.491968 ], [ -134.057753, 57.482450 ], [ -134.057115, 57.474615 ], [ -134.046449, 57.465726 ], [ -134.022656, 57.464604 ], [ -133.986369, 57.461035 ], [ -133.969118, 57.449732 ], [ -133.970783, 57.440070 ], [ -133.965546, 57.433595 ], [ -133.955597, 57.432816 ], [ -133.945918, 57.437835 ], [ -133.928667, 57.434860 ], [ -133.916747, 57.444666 ], [ -133.906657, 57.444973 ], [ -133.887026, 57.414040 ], [ -133.870327, 57.381298 ], [ -133.866931, 57.367869 ], [ -133.867279, 57.362060 ], [ -133.870657, 57.358287 ], [ -133.962897, 57.305425 ], [ -133.968495, 57.303937 ], [ -133.983501, 57.302838 ], [ -134.008394, 57.317522 ], [ -134.034563, 57.327638 ], [ -134.055618, 57.330194 ], [ -134.070245, 57.343846 ], [ -134.079763, 57.345631 ], [ -134.086818, 57.336663 ], [ -134.100587, 57.321738 ], [ -134.106942, 57.318978 ], [ -134.115901, 57.325815 ], [ -134.121795, 57.324872 ], [ -134.124860, 57.318506 ], [ -134.125096, 57.308133 ], [ -134.096333, 57.283850 ], [ -134.094447, 57.271590 ], [ -134.110315, 57.249948 ], [ -134.120880, 57.240116 ], [ -134.127947, 57.256996 ], [ -134.136275, 57.258780 ], [ -134.144008, 57.256401 ], [ -134.148767, 57.249857 ], [ -134.147577, 57.233796 ], [ -134.155390, 57.208003 ], [ -134.193629, 57.184879 ], [ -134.292760, 57.137049 ], [ -134.302721, 57.136562 ], [ -134.349602, 57.124638 ], [ -134.378359, 57.115016 ], [ -134.370797, 57.099924 ], [ -134.386052, 57.087392 ], [ -134.481167, 57.046006 ], [ -134.484288, 57.036481 ], [ -134.497718, 57.031194 ], [ -134.565687, 57.023737 ], [ -134.601407, 57.033812 ], [ -134.610382, 57.016075 ], [ -134.613952, 57.013696 ], [ -134.617521, 57.016670 ], [ -134.612167, 57.033921 ], [ -134.613159, 57.060768 ], [ -134.634565, 57.109863 ], [ -134.637378, 57.136712 ], [ -134.615141, 57.152894 ], [ -134.613357, 57.157653 ], [ -134.617521, 57.163007 ], [ -134.641706, 57.177997 ], [ -134.646773, 57.226327 ], [ -134.640169, 57.239852 ], [ -134.633844, 57.245818 ], [ -134.621090, 57.239150 ], [ -134.575285, 57.226063 ], [ -134.568147, 57.227847 ], [ -134.563983, 57.232606 ], [ -134.566362, 57.235581 ], [ -134.579449, 57.240340 ], [ -134.617081, 57.261632 ], [ -134.605032, 57.273000 ], [ -134.570954, 57.294624 ], [ -134.517279, 57.314567 ], [ -134.543385, 57.337414 ], [ -134.559794, 57.336138 ], [ -134.574114, 57.341172 ], [ -134.575492, 57.343694 ], [ -134.578511, 57.400291 ], [ -134.555540, 57.407428 ], [ -134.527594, 57.405331 ], [ -134.525997, 57.397845 ], [ -134.527759, 57.393940 ], [ -134.527873, 57.389874 ], [ -134.486023, 57.372492 ], [ -134.477240, 57.374401 ], [ -134.464032, 57.392184 ], [ -134.544853, 57.457872 ], [ -134.607557, 57.513042 ], [ -134.598452, 57.522395 ], [ -134.595981, 57.534107 ], [ -134.611177, 57.563137 ], [ -134.665337, 57.605701 ], [ -134.674438, 57.614409 ], [ -134.695428, 57.685335 ], [ -134.700518, 57.695966 ], [ -134.704859, 57.701457 ], [ -134.720351, 57.707052 ], [ -134.731798, 57.721921 ], [ -134.728792, 57.756640 ], [ -134.709024, 57.780498 ], [ -134.705869, 57.828929 ], [ -134.727077, 57.877098 ], [ -134.737475, 57.890790 ], [ -134.746108, 57.898529 ], [ -134.758833, 57.980212 ], [ -134.765290, 57.993762 ], [ -134.777022, 58.004679 ], [ -134.804963, 58.028714 ], [ -134.810674, 58.045847 ], [ -134.807818, 58.056316 ], [ -134.790913, 58.069447 ], [ -134.783772, 58.082292 ], [ -134.784927, 58.096793 ], [ -134.820663, 58.141465 ], [ -134.857221, 58.176288 ], [ -134.864299, 58.180489 ], [ -134.877918, 58.181535 ], [ -134.885857, 58.184031 ], [ -134.899665, 58.194320 ], [ -134.914857, 58.214932 ], [ -134.948327, 58.281316 ], [ -134.969189, 58.367542 ], [ -134.960502, 58.403758 ], [ -134.955902, 58.410297 ], [ -134.897292, 58.376890 ], [ -134.806116, 58.321284 ], [ -134.803831, 58.316567 ], [ -134.802388, 58.301070 ], [ -134.779354, 58.281279 ], [ -134.760052, 58.275251 ], [ -134.729861, 58.273512 ], [ -134.724463, 58.268277 ], [ -134.712801, 58.215369 ], [ -134.710513, 58.192557 ], [ -134.703727, 58.166794 ], [ -134.699956, 58.161494 ], [ -134.689515, 58.158825 ], [ -134.682812, 58.158843 ], [ -134.631434, 58.162198 ], [ -134.608911, 58.171637 ], [ -134.608358, 58.173472 ] ] ], [ [ [ -133.846128, 55.904622 ], [ -133.840833, 55.892726 ], [ -133.840298, 55.886770 ], [ -133.847565, 55.869599 ], [ -133.861039, 55.848844 ], [ -133.866988, 55.845886 ], [ -133.894706, 55.845641 ], [ -133.903184, 55.848101 ], [ -133.920250, 55.860295 ], [ -133.929325, 55.869538 ], [ -133.945619, 55.896216 ], [ -133.943499, 55.912446 ], [ -133.940298, 55.917506 ], [ -133.935016, 55.920689 ], [ -133.891851, 55.936680 ], [ -133.876494, 55.937683 ], [ -133.864099, 55.936286 ], [ -133.854291, 55.931581 ], [ -133.846763, 55.911670 ], [ -133.846128, 55.904622 ] ] ], [ [ [ -134.283312, 55.925175 ], [ -134.265872, 55.917371 ], [ -134.230613, 55.905629 ], [ -134.173104, 55.918519 ], [ -134.152216, 55.920916 ], [ -134.122839, 55.918654 ], [ -134.118062, 55.914642 ], [ -134.125521, 55.902095 ], [ -134.130544, 55.897512 ], [ -134.136647, 55.895393 ], [ -134.145803, 55.896713 ], [ -134.168363, 55.892319 ], [ -134.208251, 55.876709 ], [ -134.231157, 55.864747 ], [ -134.240537, 55.853922 ], [ -134.273156, 55.833058 ], [ -134.282453, 55.828667 ], [ -134.327238, 55.836440 ], [ -134.344418, 55.843198 ], [ -134.348153, 55.892817 ], [ -134.336063, 55.926614 ], [ -134.315782, 55.923003 ], [ -134.283312, 55.925175 ] ] ], [ [ [ -155.634100, 55.925471 ], [ -155.606876, 55.930682 ], [ -155.581134, 55.930681 ], [ -155.538240, 55.925467 ], [ -155.474363, 55.913595 ], [ -155.453133, 55.883920 ], [ -155.474516, 55.848311 ], [ -155.485235, 55.818638 ], [ -155.474682, 55.777094 ], [ -155.474764, 55.741484 ], [ -155.528099, 55.705878 ], [ -155.581366, 55.699944 ], [ -155.634607, 55.705882 ], [ -155.719803, 55.711820 ], [ -155.794320, 55.729627 ], [ -155.826207, 55.759303 ], [ -155.836804, 55.783042 ], [ -155.836763, 55.800848 ], [ -155.826071, 55.818652 ], [ -155.804728, 55.836455 ], [ -155.751430, 55.854257 ], [ -155.676747, 55.907669 ], [ -155.634100, 55.925471 ] ] ], [ [ [ -160.211780, 55.455862 ], [ -160.137032, 55.450709 ], [ -160.148511, 55.418688 ], [ -160.141834, 55.387154 ], [ -160.142505, 55.383491 ], [ -160.147993, 55.377576 ], [ -160.154038, 55.377518 ], [ -160.203610, 55.391739 ], [ -160.239304, 55.413467 ], [ -160.266906, 55.412515 ], [ -160.279970, 55.395905 ], [ -160.308921, 55.393174 ], [ -160.321132, 55.393677 ], [ -160.339858, 55.409692 ], [ -160.349526, 55.420477 ], [ -160.347609, 55.426187 ], [ -160.323237, 55.444633 ], [ -160.266834, 55.462789 ], [ -160.260565, 55.463674 ], [ -160.227504, 55.460340 ], [ -160.211780, 55.455862 ] ] ], [ [ [ -131.759896, 55.381845 ], [ -131.711729, 55.354883 ], [ -131.630828, 55.304914 ], [ -131.615361, 55.288853 ], [ -131.618931, 55.282904 ], [ -131.636776, 55.279930 ], [ -131.658130, 55.292512 ], [ -131.674253, 55.297776 ], [ -131.678417, 55.297181 ], [ -131.688644, 55.282113 ], [ -131.672468, 55.259109 ], [ -131.672468, 55.251971 ], [ -131.684961, 55.228771 ], [ -131.694487, 55.223739 ], [ -131.726601, 55.228176 ], [ -131.733145, 55.226987 ], [ -131.736119, 55.223417 ], [ -131.733739, 55.215684 ], [ -131.730170, 55.210330 ], [ -131.718468, 55.200099 ], [ -131.711729, 55.191295 ], [ -131.723032, 55.169285 ], [ -131.733911, 55.163119 ], [ -131.729575, 55.153223 ], [ -131.723032, 55.150249 ], [ -131.722437, 55.143705 ], [ -131.739093, 55.132403 ], [ -131.753965, 55.125859 ], [ -131.775380, 55.135972 ], [ -131.798943, 55.162351 ], [ -131.829585, 55.191916 ], [ -131.830718, 55.194991 ], [ -131.828395, 55.198482 ], [ -131.850839, 55.274364 ], [ -131.862162, 55.289284 ], [ -131.870568, 55.364553 ], [ -131.854297, 55.421074 ], [ -131.852330, 55.423782 ], [ -131.833218, 55.422014 ], [ -131.811697, 55.414048 ], [ -131.809721, 55.412555 ], [ -131.806790, 55.405175 ], [ -131.798555, 55.399386 ], [ -131.759896, 55.381845 ] ] ], [ [ [ -160.527687, 55.342656 ], [ -160.534943, 55.343537 ], [ -160.564427, 55.332504 ], [ -160.579690, 55.314292 ], [ -160.580668, 55.307196 ], [ -160.580088, 55.302503 ], [ -160.565929, 55.273137 ], [ -160.550759, 55.264302 ], [ -160.527617, 55.256374 ], [ -160.469257, 55.193070 ], [ -160.468969, 55.180306 ], [ -160.495364, 55.157527 ], [ -160.525226, 55.129871 ], [ -160.655577, 55.160261 ], [ -160.675871, 55.173622 ], [ -160.688372, 55.195588 ], [ -160.756587, 55.195143 ], [ -160.767393, 55.185399 ], [ -160.765229, 55.176716 ], [ -160.794198, 55.134399 ], [ -160.806009, 55.125670 ], [ -160.821381, 55.117851 ], [ -160.824468, 55.120153 ], [ -160.815862, 55.141556 ], [ -160.807468, 55.155579 ], [ -160.807558, 55.168161 ], [ -160.819487, 55.187457 ], [ -160.841917, 55.204440 ], [ -160.841221, 55.293957 ], [ -160.856621, 55.318488 ], [ -160.840251, 55.339777 ], [ -160.797147, 55.381521 ], [ -160.777800, 55.388639 ], [ -160.710298, 55.403075 ], [ -160.687442, 55.402198 ], [ -160.665927, 55.399025 ], [ -160.649234, 55.388780 ], [ -160.646214, 55.383142 ], [ -160.646156, 55.357689 ], [ -160.651011, 55.343650 ], [ -160.662674, 55.328874 ], [ -160.658867, 55.315549 ], [ -160.649349, 55.315549 ], [ -160.635072, 55.325066 ], [ -160.614256, 55.348019 ], [ -160.572716, 55.388978 ], [ -160.567384, 55.390078 ], [ -160.545227, 55.387911 ], [ -160.521399, 55.380314 ], [ -160.522063, 55.374369 ], [ -160.522399, 55.370371 ], [ -160.522307, 55.364367 ], [ -160.518955, 55.361552 ], [ -160.524665, 55.353620 ], [ -160.527687, 55.342656 ] ] ], [ [ [ -161.718614, 55.154166 ], [ -161.697097, 55.137133 ], [ -161.678389, 55.131747 ], [ -161.663618, 55.130260 ], [ -161.651563, 55.130916 ], [ -161.634912, 55.125482 ], [ -161.636556, 55.112301 ], [ -161.632391, 55.104896 ], [ -161.654918, 55.103244 ], [ -161.674539, 55.095912 ], [ -161.678537, 55.092829 ], [ -161.678171, 55.087741 ], [ -161.690346, 55.078500 ], [ -161.737922, 55.054054 ], [ -161.764169, 55.059509 ], [ -161.791606, 55.077307 ], [ -161.799113, 55.084158 ], [ -161.789398, 55.103622 ], [ -161.772265, 55.114091 ], [ -161.767507, 55.135982 ], [ -161.772265, 55.145500 ], [ -161.781783, 55.145500 ], [ -161.790349, 55.137886 ], [ -161.814984, 55.098639 ], [ -161.816482, 55.111319 ], [ -161.819869, 55.113965 ], [ -161.851152, 55.126378 ], [ -161.862504, 55.127598 ], [ -161.886278, 55.126933 ], [ -161.897846, 55.135768 ], [ -161.900685, 55.142139 ], [ -161.888936, 55.160724 ], [ -161.850057, 55.175260 ], [ -161.827840, 55.178473 ], [ -161.737810, 55.161935 ], [ -161.718614, 55.154166 ] ] ], [ [ [ -159.533457, 55.184761 ], [ -159.525827, 55.175653 ], [ -159.504325, 55.176822 ], [ -159.499502, 55.173991 ], [ -159.493398, 55.155055 ], [ -159.494772, 55.136050 ], [ -159.503592, 55.131373 ], [ -159.509361, 55.130206 ], [ -159.530302, 55.106194 ], [ -159.533630, 55.083987 ], [ -159.524444, 55.077358 ], [ -159.484200, 55.057695 ], [ -159.484980, 55.054050 ], [ -159.489589, 55.049229 ], [ -159.509674, 55.041408 ], [ -159.517824, 55.044735 ], [ -159.535465, 55.058735 ], [ -159.561459, 55.079574 ], [ -159.570977, 55.077671 ], [ -159.570977, 55.048165 ], [ -159.577640, 55.044358 ], [ -159.597824, 55.047000 ], [ -159.635226, 55.037294 ], [ -159.638905, 55.038745 ], [ -159.644029, 55.042597 ], [ -159.649062, 55.049532 ], [ -159.650859, 55.065790 ], [ -159.644938, 55.085282 ], [ -159.614759, 55.088140 ], [ -159.609049, 55.090996 ], [ -159.610000, 55.096706 ], [ -159.650927, 55.122405 ], [ -159.643313, 55.133826 ], [ -159.616961, 55.127666 ], [ -159.593820, 55.122405 ], [ -159.588109, 55.130971 ], [ -159.586075, 55.157652 ], [ -159.573144, 55.187562 ], [ -159.582399, 55.212824 ], [ -159.570977, 55.219487 ], [ -159.560074, 55.204092 ], [ -159.521096, 55.253393 ], [ -159.519196, 55.253693 ], [ -159.503196, 55.234993 ], [ -159.505270, 55.222269 ], [ -159.512350, 55.208353 ], [ -159.533457, 55.184761 ] ] ], [ [ [ -131.569560, 55.284114 ], [ -131.562650, 55.284012 ], [ -131.550916, 55.280915 ], [ -131.516651, 55.261645 ], [ -131.492640, 55.257749 ], [ -131.482252, 55.254110 ], [ -131.481522, 55.244448 ], [ -131.462701, 55.223438 ], [ -131.445293, 55.216977 ], [ -131.430501, 55.218175 ], [ -131.416951, 55.217298 ], [ -131.397690, 55.210916 ], [ -131.355642, 55.182945 ], [ -131.326852, 55.169285 ], [ -131.326257, 55.165121 ], [ -131.333990, 55.162146 ], [ -131.352654, 55.164822 ], [ -131.362319, 55.155896 ], [ -131.350575, 55.067042 ], [ -131.356314, 55.041211 ], [ -131.378572, 55.017308 ], [ -131.388569, 55.012222 ], [ -131.484995, 55.010454 ], [ -131.498863, 55.016138 ], [ -131.507590, 55.025427 ], [ -131.508449, 55.029166 ], [ -131.511855, 55.047337 ], [ -131.519588, 55.058045 ], [ -131.524942, 55.059829 ], [ -131.529106, 55.058640 ], [ -131.531485, 55.051501 ], [ -131.532140, 55.037945 ], [ -131.549331, 55.023543 ], [ -131.573721, 55.017594 ], [ -131.590377, 55.004507 ], [ -131.608818, 54.996179 ], [ -131.621310, 55.000938 ], [ -131.642130, 55.011645 ], [ -131.649863, 55.033655 ], [ -131.648674, 55.043768 ], [ -131.624879, 55.056260 ], [ -131.613577, 55.074106 ], [ -131.602869, 55.080650 ], [ -131.595137, 55.081001 ], [ -131.589387, 55.088940 ], [ -131.595924, 55.096538 ], [ -131.612669, 55.096325 ], [ -131.614095, 55.100889 ], [ -131.605302, 55.107436 ], [ -131.594978, 55.125502 ], [ -131.577773, 55.131094 ], [ -131.558603, 55.125508 ], [ -131.548736, 55.124670 ], [ -131.543977, 55.130618 ], [ -131.542193, 55.138946 ], [ -131.542788, 55.144300 ], [ -131.548736, 55.149059 ], [ -131.565677, 55.155354 ], [ -131.588368, 55.169961 ], [ -131.598454, 55.179566 ], [ -131.607383, 55.240437 ], [ -131.589070, 55.273951 ], [ -131.569560, 55.284114 ] ] ], [ [ [ -159.455311, 55.061452 ], [ -159.448473, 55.064343 ], [ -159.381841, 55.064032 ], [ -159.345276, 55.059397 ], [ -159.338470, 55.046683 ], [ -159.337461, 55.039800 ], [ -159.348260, 55.031033 ], [ -159.373958, 55.036744 ], [ -159.376813, 55.031985 ], [ -159.373006, 55.024371 ], [ -159.330403, 54.991614 ], [ -159.328791, 54.980598 ], [ -159.330164, 54.976378 ], [ -159.331770, 54.974598 ], [ -159.426615, 54.942266 ], [ -159.447982, 54.941374 ], [ -159.457995, 54.945730 ], [ -159.459551, 54.948652 ], [ -159.451251, 54.975285 ], [ -159.440057, 54.988502 ], [ -159.416786, 55.000296 ], [ -159.417987, 55.022013 ], [ -159.439851, 55.030069 ], [ -159.453908, 55.016756 ], [ -159.474847, 55.011998 ], [ -159.477702, 55.020564 ], [ -159.455434, 55.035809 ], [ -159.455311, 55.061452 ] ] ], [ [ [ -160.017900, 55.156130 ], [ -160.047358, 55.180879 ], [ -160.061469, 55.200378 ], [ -160.052941, 55.203035 ], [ -160.025257, 55.203914 ], [ -160.002155, 55.194480 ], [ -159.994027, 55.185247 ], [ -159.983499, 55.180379 ], [ -159.959305, 55.168022 ], [ -159.953595, 55.170877 ], [ -159.954664, 55.187861 ], [ -159.961209, 55.208949 ], [ -159.957402, 55.211804 ], [ -159.938576, 55.210292 ], [ -159.931240, 55.220060 ], [ -159.926171, 55.245015 ], [ -159.889174, 55.287138 ], [ -159.879690, 55.290183 ], [ -159.870591, 55.284889 ], [ -159.848619, 55.267548 ], [ -159.843859, 55.249367 ], [ -159.844622, 55.243828 ], [ -159.855302, 55.230378 ], [ -159.860991, 55.227884 ], [ -159.866624, 55.231202 ], [ -159.886523, 55.229149 ], [ -159.895326, 55.217872 ], [ -159.905365, 55.164689 ], [ -159.901569, 55.156858 ], [ -159.884997, 55.145598 ], [ -159.860891, 55.149337 ], [ -159.859568, 55.164912 ], [ -159.861308, 55.171748 ], [ -159.860786, 55.177086 ], [ -159.846264, 55.180834 ], [ -159.816419, 55.178051 ], [ -159.823710, 55.144130 ], [ -159.830890, 55.126467 ], [ -159.855444, 55.100758 ], [ -159.868580, 55.094888 ], [ -159.886109, 55.102558 ], [ -159.886476, 55.107087 ], [ -159.906609, 55.112544 ], [ -159.929086, 55.120739 ], [ -159.935749, 55.120739 ], [ -159.947575, 55.105215 ], [ -159.951281, 55.100644 ], [ -159.945410, 55.087939 ], [ -159.930038, 55.070294 ], [ -159.930990, 55.066487 ], [ -159.983338, 55.061728 ], [ -159.988097, 55.059825 ], [ -159.987785, 55.044543 ], [ -160.052093, 55.005777 ], [ -160.080659, 54.994425 ], [ -160.115775, 54.985078 ], [ -160.121347, 54.949418 ], [ -160.128009, 54.942755 ], [ -160.157242, 54.942564 ], [ -160.183466, 54.915680 ], [ -160.181636, 54.902992 ], [ -160.200831, 54.875282 ], [ -160.226967, 54.864075 ], [ -160.254765, 54.895974 ], [ -160.250814, 54.929816 ], [ -160.244253, 54.933532 ], [ -160.223411, 54.939124 ], [ -160.191494, 54.940981 ], [ -160.183213, 54.950370 ], [ -160.190062, 54.969937 ], [ -160.164117, 54.978515 ], [ -160.132168, 55.013743 ], [ -160.106837, 55.027002 ], [ -160.082168, 55.033578 ], [ -160.077872, 55.037600 ], [ -160.087574, 55.049967 ], [ -160.094288, 55.052996 ], [ -160.133416, 55.043947 ], [ -160.174366, 55.052577 ], [ -160.179165, 55.068365 ], [ -160.146093, 55.076957 ], [ -160.142286, 55.084571 ], [ -160.146093, 55.091234 ], [ -160.188586, 55.099350 ], [ -160.191392, 55.108574 ], [ -160.187261, 55.118376 ], [ -160.175182, 55.124993 ], [ -160.120395, 55.111221 ], [ -160.109925, 55.114076 ], [ -160.109925, 55.121691 ], [ -160.125154, 55.137871 ], [ -160.126420, 55.151707 ], [ -160.109864, 55.160777 ], [ -160.077308, 55.146495 ], [ -160.059599, 55.133663 ], [ -160.052545, 55.121716 ], [ -160.052820, 55.119373 ], [ -160.057033, 55.118488 ], [ -160.057797, 55.115353 ], [ -160.055642, 55.111580 ], [ -160.030330, 55.116109 ], [ -160.012220, 55.122946 ], [ -160.005170, 55.129378 ], [ -160.004129, 55.134482 ], [ -160.017900, 55.156130 ] ] ], [ [ [ -159.324364, 54.928329 ], [ -159.317681, 54.933707 ], [ -159.278696, 54.948514 ], [ -159.265345, 54.944661 ], [ -159.261647, 54.932048 ], [ -159.254033, 54.928241 ], [ -159.220066, 54.931593 ], [ -159.205670, 54.927438 ], [ -159.202857, 54.925500 ], [ -159.203228, 54.914842 ], [ -159.212627, 54.896066 ], [ -159.236066, 54.876480 ], [ -159.272354, 54.864204 ], [ -159.305864, 54.863698 ], [ -159.309681, 54.865813 ], [ -159.327873, 54.884749 ], [ -159.320732, 54.897269 ], [ -159.313528, 54.903388 ], [ -159.312060, 54.909601 ], [ -159.312733, 54.918686 ], [ -159.324364, 54.928329 ] ] ], [ [ [ -131.246018, 54.989555 ], [ -131.257421, 54.979010 ], [ -131.241786, 54.967625 ], [ -131.232268, 54.948590 ], [ -131.232268, 54.945020 ], [ -131.242976, 54.939667 ], [ -131.242771, 54.929639 ], [ -131.233001, 54.926814 ], [ -131.217805, 54.927423 ], [ -131.197924, 54.921489 ], [ -131.195197, 54.919767 ], [ -131.195411, 54.918249 ], [ -131.200161, 54.910169 ], [ -131.253671, 54.866779 ], [ -131.266049, 54.859369 ], [ -131.353233, 54.859009 ], [ -131.469097, 54.913153 ], [ -131.491504, 54.930392 ], [ -131.486616, 54.950394 ], [ -131.482676, 54.952659 ], [ -131.409738, 54.971152 ], [ -131.335124, 54.985515 ], [ -131.334585, 54.992610 ], [ -131.331016, 54.995584 ], [ -131.292209, 54.993777 ], [ -131.266084, 54.998806 ], [ -131.248909, 54.997190 ], [ -131.246018, 54.989555 ] ] ], [ [ [ -162.255031, 54.978353 ], [ -162.249682, 54.975900 ], [ -162.235675, 54.962601 ], [ -162.232962, 54.890984 ], [ -162.236806, 54.881630 ], [ -162.275316, 54.845565 ], [ -162.282944, 54.841216 ], [ -162.300580, 54.832594 ], [ -162.321094, 54.827928 ], [ -162.349315, 54.836049 ], [ -162.417370, 54.877491 ], [ -162.425244, 54.885021 ], [ -162.437501, 54.927627 ], [ -162.435473, 54.929249 ], [ -162.337431, 54.981636 ], [ -162.326811, 54.985330 ], [ -162.266743, 54.982133 ], [ -162.255031, 54.978353 ] ] ], [ [ [ -133.087587, 55.429391 ], [ -133.080448, 55.434150 ], [ -133.068551, 55.438314 ], [ -133.068551, 55.443073 ], [ -133.074500, 55.446642 ], [ -133.120899, 55.458540 ], [ -133.138129, 55.458373 ], [ -133.183360, 55.484714 ], [ -133.185145, 55.496611 ], [ -133.161350, 55.541821 ], [ -133.156566, 55.563589 ], [ -133.176760, 55.586722 ], [ -133.263042, 55.568793 ], [ -133.275972, 55.580188 ], [ -133.294158, 55.588680 ], [ -133.386900, 55.619346 ], [ -133.438180, 55.643862 ], [ -133.438933, 55.645167 ], [ -133.408432, 55.667925 ], [ -133.399885, 55.665133 ], [ -133.394486, 55.666881 ], [ -133.386432, 55.693365 ], [ -133.392121, 55.702109 ], [ -133.388253, 55.731028 ], [ -133.382899, 55.733407 ], [ -133.352561, 55.739356 ], [ -133.336500, 55.751848 ], [ -133.316869, 55.756607 ], [ -133.277013, 55.744710 ], [ -133.259762, 55.747089 ], [ -133.218121, 55.788730 ], [ -133.180645, 55.807765 ], [ -133.172912, 55.814904 ], [ -133.169342, 55.832155 ], [ -133.166429, 55.850694 ], [ -133.167559, 55.859866 ], [ -133.180037, 55.863431 ], [ -133.195517, 55.860708 ], [ -133.216337, 55.866062 ], [ -133.223829, 55.874724 ], [ -133.249054, 55.892236 ], [ -133.250244, 55.902944 ], [ -133.260357, 55.910677 ], [ -133.259762, 55.915436 ], [ -133.256788, 55.920790 ], [ -133.264521, 55.931497 ], [ -133.282367, 55.949938 ], [ -133.283557, 55.954697 ], [ -133.280582, 55.958266 ], [ -133.266900, 55.964215 ], [ -133.265711, 55.971948 ], [ -133.267495, 55.987415 ], [ -133.265116, 56.001691 ], [ -133.258572, 56.012399 ], [ -133.257383, 56.017753 ], [ -133.267495, 56.044522 ], [ -133.278798, 56.058204 ], [ -133.293074, 56.084972 ], [ -133.300213, 56.090326 ], [ -133.307946, 56.087947 ], [ -133.311515, 56.083188 ], [ -133.310920, 56.079024 ], [ -133.295454, 56.056419 ], [ -133.288315, 56.030840 ], [ -133.287126, 56.019537 ], [ -133.289505, 56.015968 ], [ -133.303782, 56.005855 ], [ -133.305567, 56.001691 ], [ -133.306161, 55.988009 ], [ -133.315679, 55.982656 ], [ -133.343043, 55.980276 ], [ -133.355535, 55.966594 ], [ -133.379925, 55.957671 ], [ -133.386468, 55.946369 ], [ -133.385279, 55.940420 ], [ -133.376356, 55.930902 ], [ -133.374571, 55.910677 ], [ -133.380520, 55.898780 ], [ -133.383494, 55.895805 ], [ -133.402530, 55.896400 ], [ -133.428109, 55.902944 ], [ -133.453093, 55.905918 ], [ -133.459637, 55.910677 ], [ -133.457257, 55.914246 ], [ -133.441475, 55.925226 ], [ -133.443258, 55.931167 ], [ -133.448605, 55.934138 ], [ -133.464648, 55.936515 ], [ -133.501872, 55.949343 ], [ -133.503062, 55.952318 ], [ -133.484621, 55.979086 ], [ -133.485130, 55.988282 ], [ -133.461421, 55.995148 ], [ -133.408478, 55.993363 ], [ -133.392417, 55.996338 ], [ -133.385279, 56.007640 ], [ -133.393607, 56.017158 ], [ -133.476888, 56.004071 ], [ -133.481052, 56.019537 ], [ -133.487595, 56.021322 ], [ -133.495052, 56.017089 ], [ -133.541041, 55.977322 ], [ -133.588493, 55.962640 ], [ -133.615893, 55.936661 ], [ -133.638122, 55.920982 ], [ -133.689882, 55.913629 ], [ -133.697985, 55.901564 ], [ -133.711072, 55.895020 ], [ -133.718805, 55.893236 ], [ -133.721779, 55.895020 ], [ -133.725348, 55.907512 ], [ -133.725969, 55.915631 ], [ -133.752381, 55.914301 ], [ -133.799931, 55.925349 ], [ -133.812119, 55.936192 ], [ -133.816958, 55.952127 ], [ -133.816363, 55.964025 ], [ -133.798092, 55.975096 ], [ -133.777846, 55.982876 ], [ -133.748803, 56.009536 ], [ -133.693765, 56.070562 ], [ -133.684209, 56.075507 ], [ -133.659241, 56.083818 ], [ -133.629575, 56.085972 ], [ -133.578417, 56.081213 ], [ -133.565330, 56.083592 ], [ -133.561742, 56.088234 ], [ -133.562283, 56.092829 ], [ -133.605186, 56.099059 ], [ -133.620353, 56.104601 ], [ -133.630170, 56.104413 ], [ -133.643852, 56.118095 ], [ -133.643257, 56.128207 ], [ -133.628385, 56.142484 ], [ -133.622437, 56.143674 ], [ -133.595020, 56.131053 ], [ -133.574399, 56.135126 ], [ -133.548802, 56.142840 ], [ -133.542830, 56.160794 ], [ -133.553454, 56.169015 ], [ -133.601500, 56.191925 ], [ -133.639282, 56.198813 ], [ -133.675975, 56.207919 ], [ -133.679544, 56.211489 ], [ -133.674190, 56.220412 ], [ -133.644657, 56.222892 ], [ -133.635524, 56.229334 ], [ -133.631955, 56.241232 ], [ -133.637308, 56.250750 ], [ -133.655862, 56.273083 ], [ -133.664218, 56.310504 ], [ -133.656415, 56.326909 ], [ -133.649916, 56.326792 ], [ -133.643182, 56.324459 ], [ -133.627790, 56.325108 ], [ -133.620652, 56.326892 ], [ -133.618273, 56.334031 ], [ -133.636119, 56.343549 ], [ -133.637903, 56.350092 ], [ -133.626006, 56.358420 ], [ -133.615893, 56.358420 ], [ -133.582116, 56.352506 ], [ -133.418370, 56.332132 ], [ -133.328577, 56.332797 ], [ -133.284826, 56.327118 ], [ -133.235354, 56.324275 ], [ -133.197009, 56.333016 ], [ -133.163212, 56.317445 ], [ -133.094977, 56.250583 ], [ -133.078230, 56.246802 ], [ -133.071435, 56.238484 ], [ -133.040979, 56.184536 ], [ -133.052004, 56.155585 ], [ -133.059994, 56.150761 ], [ -133.062175, 56.141163 ], [ -133.061465, 56.135305 ], [ -133.055520, 56.125258 ], [ -133.016269, 56.117500 ], [ -133.007346, 56.116905 ], [ -132.996044, 56.104413 ], [ -132.981767, 56.081808 ], [ -132.978414, 56.070654 ], [ -132.967198, 56.062711 ], [ -132.936557, 56.061582 ], [ -132.930014, 56.056824 ], [ -132.919769, 56.030824 ], [ -132.897675, 56.020166 ], [ -132.837592, 56.024327 ], [ -132.635291, 55.921766 ], [ -132.618464, 55.911476 ], [ -132.615103, 55.908082 ], [ -132.614757, 55.899635 ], [ -132.592085, 55.877152 ], [ -132.543398, 55.845927 ], [ -132.504800, 55.815166 ], [ -132.470697, 55.782162 ], [ -132.461281, 55.683400 ], [ -132.462531, 55.673854 ], [ -132.448855, 55.667337 ], [ -132.415237, 55.667263 ], [ -132.394266, 55.669114 ], [ -132.382505, 55.665336 ], [ -132.358558, 55.648759 ], [ -132.332401, 55.595071 ], [ -132.329280, 55.578936 ], [ -132.301119, 55.550960 ], [ -132.240921, 55.526533 ], [ -132.198289, 55.513045 ], [ -132.188771, 55.508443 ], [ -132.146062, 55.470346 ], [ -132.142649, 55.460967 ], [ -132.142945, 55.457941 ], [ -132.164757, 55.451213 ], [ -132.178610, 55.452829 ], [ -132.219413, 55.472211 ], [ -132.230752, 55.479944 ], [ -132.231936, 55.483960 ], [ -132.247327, 55.492951 ], [ -132.315773, 55.514547 ], [ -132.325728, 55.515395 ], [ -132.417240, 55.537506 ], [ -132.445198, 55.547024 ], [ -132.477321, 55.561896 ], [ -132.514798, 55.576767 ], [ -132.560602, 55.576767 ], [ -132.564171, 55.573198 ], [ -132.562387, 55.568439 ], [ -132.544541, 55.566655 ], [ -132.530264, 55.558921 ], [ -132.524315, 55.552973 ], [ -132.525505, 55.549998 ], [ -132.548110, 55.531558 ], [ -132.573094, 55.514306 ], [ -132.586181, 55.497650 ], [ -132.608786, 55.486348 ], [ -132.608786, 55.481589 ], [ -132.604027, 55.476830 ], [ -132.571905, 55.477425 ], [ -132.568335, 55.479804 ], [ -132.564766, 55.501814 ], [ -132.561197, 55.505978 ], [ -132.519556, 55.520255 ], [ -132.509444, 55.510737 ], [ -132.496952, 55.506573 ], [ -132.491598, 55.503599 ], [ -132.416645, 55.516686 ], [ -132.408317, 55.512522 ], [ -132.392255, 55.483373 ], [ -132.388686, 55.480994 ], [ -132.364297, 55.483373 ], [ -132.318570, 55.469208 ], [ -132.288585, 55.451365 ], [ -132.281269, 55.444189 ], [ -132.284442, 55.442173 ], [ -132.303329, 55.438268 ], [ -132.419340, 55.432054 ], [ -132.470036, 55.427028 ], [ -132.479688, 55.420918 ], [ -132.475532, 55.418062 ], [ -132.454974, 55.413600 ], [ -132.434491, 55.418533 ], [ -132.414860, 55.417938 ], [ -132.398799, 55.413179 ], [ -132.390782, 55.401739 ], [ -132.273503, 55.419189 ], [ -132.258056, 55.416142 ], [ -132.225960, 55.374919 ], [ -132.166857, 55.363039 ], [ -132.149864, 55.328637 ], [ -132.126398, 55.288418 ], [ -132.115561, 55.281237 ], [ -132.098531, 55.280560 ], [ -132.102716, 55.268175 ], [ -132.109531, 55.260240 ], [ -132.142742, 55.238212 ], [ -132.164031, 55.237617 ], [ -132.214912, 55.245700 ], [ -132.229963, 55.238080 ], [ -132.214353, 55.222562 ], [ -132.207431, 55.218273 ], [ -132.127370, 55.199570 ], [ -132.104376, 55.200899 ], [ -132.088127, 55.206516 ], [ -132.075095, 55.222390 ], [ -132.072751, 55.233718 ], [ -132.078869, 55.240335 ], [ -132.075924, 55.246276 ], [ -132.061625, 55.260052 ], [ -132.037122, 55.275144 ], [ -132.028163, 55.276950 ], [ -132.003500, 55.265254 ], [ -131.995908, 55.259054 ], [ -131.979818, 55.211787 ], [ -131.977397, 55.180949 ], [ -131.988815, 55.165464 ], [ -132.031417, 55.151671 ], [ -132.039009, 55.144070 ], [ -132.040874, 55.127326 ], [ -132.038978, 55.125011 ], [ -132.016932, 55.120971 ], [ -131.999644, 55.119316 ], [ -131.995480, 55.112772 ], [ -132.000834, 55.104444 ], [ -132.039002, 55.086962 ], [ -132.094024, 55.039452 ], [ -132.154061, 55.018197 ], [ -132.168076, 55.015574 ], [ -132.180334, 55.015557 ], [ -132.196215, 55.008047 ], [ -132.197614, 55.005158 ], [ -132.192581, 54.989655 ], [ -132.143263, 54.984633 ], [ -132.135544, 54.985976 ], [ -132.072544, 55.016956 ], [ -132.039217, 55.036765 ], [ -132.028288, 55.038672 ], [ -132.000449, 55.035712 ], [ -131.984592, 55.027978 ], [ -131.982890, 54.853068 ], [ -131.976847, 54.848894 ], [ -131.965904, 54.835539 ], [ -131.957382, 54.804279 ], [ -131.957914, 54.791239 ], [ -131.999591, 54.731975 ], [ -132.018657, 54.710109 ], [ -132.029747, 54.701189 ], [ -132.142277, 54.691674 ], [ -132.165182, 54.694050 ], [ -132.179635, 54.705898 ], [ -132.199566, 54.715444 ], [ -132.256092, 54.734617 ], [ -132.263100, 54.734312 ], [ -132.279597, 54.728230 ], [ -132.280701, 54.726184 ], [ -132.280103, 54.715988 ], [ -132.281803, 54.715290 ], [ -132.307943, 54.718714 ], [ -132.351004, 54.818182 ], [ -132.350629, 54.821314 ], [ -132.341009, 54.826718 ], [ -132.332661, 54.826322 ], [ -132.314146, 54.835120 ], [ -132.309213, 54.847534 ], [ -132.314213, 54.851631 ], [ -132.350549, 54.863080 ], [ -132.364826, 54.873787 ], [ -132.373154, 54.891633 ], [ -132.370179, 54.899961 ], [ -132.387494, 54.913664 ], [ -132.484579, 54.899301 ], [ -132.558390, 54.932612 ], [ -132.581367, 54.946005 ], [ -132.609786, 54.965728 ], [ -132.612531, 54.969924 ], [ -132.614836, 54.980095 ], [ -132.609900, 54.991517 ], [ -132.598557, 54.990301 ], [ -132.577830, 54.994234 ], [ -132.575001, 54.998317 ], [ -132.566729, 55.023993 ], [ -132.582546, 55.015365 ], [ -132.596228, 55.017150 ], [ -132.596823, 55.027857 ], [ -132.587305, 55.039754 ], [ -132.560237, 55.048083 ], [ -132.554304, 55.063069 ], [ -132.567080, 55.071282 ], [ -132.541802, 55.097764 ], [ -132.548994, 55.113556 ], [ -132.550502, 55.114247 ], [ -132.561819, 55.114897 ], [ -132.594568, 55.105378 ], [ -132.619912, 55.069094 ], [ -132.624575, 55.061352 ], [ -132.624296, 55.056163 ], [ -132.626687, 55.053314 ], [ -132.630865, 55.052946 ], [ -132.633305, 55.054954 ], [ -132.637866, 55.073602 ], [ -132.624518, 55.114419 ], [ -132.606895, 55.141722 ], [ -132.598675, 55.150482 ], [ -132.591084, 55.155695 ], [ -132.587868, 55.155971 ], [ -132.581133, 55.166076 ], [ -132.605219, 55.194064 ], [ -132.620123, 55.199617 ], [ -132.656310, 55.236655 ], [ -132.666422, 55.239034 ], [ -132.673561, 55.234870 ], [ -132.674155, 55.225947 ], [ -132.654525, 55.207506 ], [ -132.634894, 55.182522 ], [ -132.631920, 55.169435 ], [ -132.637274, 55.153374 ], [ -132.662853, 55.143856 ], [ -132.685458, 55.143856 ], [ -132.793723, 55.184307 ], [ -132.825251, 55.205722 ], [ -132.832985, 55.228922 ], [ -132.831795, 55.247957 ], [ -132.837743, 55.262829 ], [ -132.845477, 55.268778 ], [ -132.857374, 55.269372 ], [ -132.868676, 55.263424 ], [ -132.877599, 55.244388 ], [ -132.890686, 55.234870 ], [ -132.982166, 55.215882 ], [ -133.008156, 55.205700 ], [ -133.015608, 55.203342 ], [ -133.037023, 55.206317 ], [ -133.047136, 55.219404 ], [ -133.044757, 55.230111 ], [ -133.042972, 55.247362 ], [ -133.046541, 55.255096 ], [ -133.048921, 55.262829 ], [ -133.057844, 55.266993 ], [ -133.109002, 55.271157 ], [ -133.151237, 55.282460 ], [ -133.191093, 55.278890 ], [ -133.227380, 55.281270 ], [ -133.244343, 55.291865 ], [ -133.235129, 55.304162 ], [ -133.233572, 55.308822 ], [ -133.254639, 55.318806 ], [ -133.279271, 55.333264 ], [ -133.280701, 55.341536 ], [ -133.278443, 55.349184 ], [ -133.269068, 55.359341 ], [ -133.257734, 55.367026 ], [ -133.226844, 55.381850 ], [ -133.208794, 55.384237 ], [ -133.183280, 55.379392 ], [ -133.147073, 55.380017 ], [ -133.116203, 55.377211 ], [ -133.101269, 55.375853 ], [ -133.041187, 55.357413 ], [ -133.025126, 55.360387 ], [ -133.021557, 55.366336 ], [ -133.023341, 55.374664 ], [ -133.054274, 55.403812 ], [ -133.087587, 55.429391 ] ] ], [ [ [ -162.801865, 54.489440 ], [ -162.796290, 54.492254 ], [ -162.728415, 54.475354 ], [ -162.588883, 54.450064 ], [ -162.556667, 54.424621 ], [ -162.552718, 54.416113 ], [ -162.551618, 54.392217 ], [ -162.562726, 54.382840 ], [ -162.611891, 54.368077 ], [ -162.722797, 54.400340 ], [ -162.760396, 54.373254 ], [ -162.759472, 54.371116 ], [ -162.781239, 54.375085 ], [ -162.860050, 54.425452 ], [ -162.827621, 54.490859 ], [ -162.801865, 54.489440 ] ] ], [ [ [ -165.523466, 54.299895 ], [ -165.502775, 54.299469 ], [ -165.478452, 54.295333 ], [ -165.477750, 54.283707 ], [ -165.479981, 54.281838 ], [ -165.513700, 54.274086 ], [ -165.557581, 54.254138 ], [ -165.558835, 54.250763 ], [ -165.557950, 54.246826 ], [ -165.553251, 54.239601 ], [ -165.512782, 54.212929 ], [ -165.496279, 54.210938 ], [ -165.478816, 54.213310 ], [ -165.405377, 54.212837 ], [ -165.391441, 54.204253 ], [ -165.383719, 54.196731 ], [ -165.399985, 54.177741 ], [ -165.412925, 54.179221 ], [ -165.422356, 54.182799 ], [ -165.476190, 54.182701 ], [ -165.481317, 54.179962 ], [ -165.536004, 54.129606 ], [ -165.549217, 54.112196 ], [ -165.565422, 54.108122 ], [ -165.575645, 54.108618 ], [ -165.613214, 54.120908 ], [ -165.629725, 54.132558 ], [ -165.631242, 54.146362 ], [ -165.616523, 54.150410 ], [ -165.601294, 54.165638 ], [ -165.598439, 54.174204 ], [ -165.621282, 54.179915 ], [ -165.637081, 54.199436 ], [ -165.621854, 54.208105 ], [ -165.593656, 54.218375 ], [ -165.585782, 54.223067 ], [ -165.579801, 54.229575 ], [ -165.587157, 54.238166 ], [ -165.595732, 54.242713 ], [ -165.612082, 54.246537 ], [ -165.615629, 54.244834 ], [ -165.625609, 54.233756 ], [ -165.640013, 54.229673 ], [ -165.669383, 54.229036 ], [ -165.681458, 54.236914 ], [ -165.685823, 54.243406 ], [ -165.684114, 54.249907 ], [ -165.675447, 54.264639 ], [ -165.636383, 54.297567 ], [ -165.625550, 54.298964 ], [ -165.615570, 54.297445 ], [ -165.605225, 54.294219 ], [ -165.586509, 54.284361 ], [ -165.523466, 54.299895 ] ] ], [ [ [ -135.703464, 57.322040 ], [ -135.702919, 57.315582 ], [ -135.705483, 57.308557 ], [ -135.688233, 57.276143 ], [ -135.657272, 57.262027 ], [ -135.690372, 57.308904 ], [ -135.688587, 57.319017 ], [ -135.683828, 57.320206 ], [ -135.642782, 57.301765 ], [ -135.630290, 57.301171 ], [ -135.579132, 57.254176 ], [ -135.570804, 57.239899 ], [ -135.571398, 57.229787 ], [ -135.577347, 57.228597 ], [ -135.601142, 57.230976 ], [ -135.654898, 57.254742 ], [ -135.658859, 57.247964 ], [ -135.658600, 57.245541 ], [ -135.656363, 57.243036 ], [ -135.637289, 57.236124 ], [ -135.621346, 57.223693 ], [ -135.620735, 57.217885 ], [ -135.604953, 57.184204 ], [ -135.596921, 57.161196 ], [ -135.602057, 57.149161 ], [ -135.598600, 57.145360 ], [ -135.592379, 57.142683 ], [ -135.581473, 57.150599 ], [ -135.575674, 57.150530 ], [ -135.565707, 57.147312 ], [ -135.565756, 57.137344 ], [ -135.575722, 57.104231 ], [ -135.574693, 57.094339 ], [ -135.635347, 57.022411 ], [ -135.650540, 57.015139 ], [ -135.680520, 57.017342 ], [ -135.753682, 57.008258 ], [ -135.764949, 57.006094 ], [ -135.767654, 57.000428 ], [ -135.772432, 56.997301 ], [ -135.821915, 56.988215 ], [ -135.854131, 56.995043 ], [ -135.857028, 56.997287 ], [ -135.852146, 57.029699 ], [ -135.841819, 57.070899 ], [ -135.834890, 57.091387 ], [ -135.805945, 57.106778 ], [ -135.776975, 57.112555 ], [ -135.755997, 57.121225 ], [ -135.735559, 57.151755 ], [ -135.735405, 57.155403 ], [ -135.752591, 57.168834 ], [ -135.762241, 57.173341 ], [ -135.785583, 57.177929 ], [ -135.812854, 57.166909 ], [ -135.831890, 57.170717 ], [ -135.832842, 57.179283 ], [ -135.824388, 57.192862 ], [ -135.823233, 57.219303 ], [ -135.836649, 57.223065 ], [ -135.862347, 57.219258 ], [ -135.871865, 57.221161 ], [ -135.871865, 57.230679 ], [ -135.843311, 57.244956 ], [ -135.833895, 57.254233 ], [ -135.849974, 57.265895 ], [ -135.837601, 57.294449 ], [ -135.828831, 57.301981 ], [ -135.840359, 57.314342 ], [ -135.855849, 57.319960 ], [ -135.859572, 57.323108 ], [ -135.860558, 57.330854 ], [ -135.851162, 57.336916 ], [ -135.838568, 57.338756 ], [ -135.761471, 57.342631 ], [ -135.730323, 57.337286 ], [ -135.715233, 57.330722 ], [ -135.703464, 57.322040 ] ] ], [ [ [ -152.417424, 57.815464 ], [ -152.364079, 57.829372 ], [ -152.351152, 57.834768 ], [ -152.324284, 57.824444 ], [ -152.310927, 57.783452 ], [ -152.317267, 57.771987 ], [ -152.322172, 57.768315 ], [ -152.342674, 57.762306 ], [ -152.348644, 57.764393 ], [ -152.349169, 57.768480 ], [ -152.357233, 57.773918 ], [ -152.381076, 57.776744 ], [ -152.443786, 57.776142 ], [ -152.465550, 57.767169 ], [ -152.471000, 57.763466 ], [ -152.497314, 57.738596 ], [ -152.497056, 57.734387 ], [ -152.467679, 57.681390 ], [ -152.443030, 57.668049 ], [ -152.401492, 57.686513 ], [ -152.398569, 57.687210 ], [ -152.394474, 57.684665 ], [ -152.428946, 57.642162 ], [ -152.461018, 57.606311 ], [ -152.468172, 57.600996 ], [ -152.467756, 57.598221 ], [ -152.459929, 57.594373 ], [ -152.439667, 57.590399 ], [ -152.426062, 57.593357 ], [ -152.402470, 57.607981 ], [ -152.387140, 57.612428 ], [ -152.361903, 57.618800 ], [ -152.322733, 57.623402 ], [ -152.265346, 57.626430 ], [ -152.179531, 57.624809 ], [ -152.161617, 57.623287 ], [ -152.152393, 57.619485 ], [ -152.159677, 57.593614 ], [ -152.163996, 57.584607 ], [ -152.259641, 57.527156 ], [ -152.291470, 57.517103 ], [ -152.314889, 57.486065 ], [ -152.323683, 57.467861 ], [ -152.326134, 57.441514 ], [ -152.320962, 57.429800 ], [ -152.346660, 57.423137 ], [ -152.361592, 57.427761 ], [ -152.426433, 57.437454 ], [ -152.483717, 57.422185 ], [ -152.487525, 57.425041 ], [ -152.459638, 57.444766 ], [ -152.458971, 57.454546 ], [ -152.471344, 57.461208 ], [ -152.485621, 57.461208 ], [ -152.495215, 57.452379 ], [ -152.517004, 57.432184 ], [ -152.570527, 57.448909 ], [ -152.600375, 57.468833 ], [ -152.646017, 57.466134 ], [ -152.662831, 57.463679 ], [ -152.684413, 57.466597 ], [ -152.716765, 57.478467 ], [ -152.720471, 57.481572 ], [ -152.719447, 57.488028 ], [ -152.722846, 57.494087 ], [ -152.743084, 57.505710 ], [ -152.770196, 57.504290 ], [ -152.798914, 57.494255 ], [ -152.809036, 57.494505 ], [ -152.825515, 57.497048 ], [ -152.838905, 57.502270 ], [ -152.886205, 57.510697 ], [ -152.939629, 57.520088 ], [ -152.954939, 57.520449 ], [ -152.966300, 57.512170 ], [ -152.967222, 57.509993 ], [ -152.949010, 57.498212 ], [ -152.939573, 57.497763 ], [ -152.921748, 57.501397 ], [ -152.890173, 57.486705 ], [ -152.762676, 57.457560 ], [ -152.742678, 57.447852 ], [ -152.722651, 57.433352 ], [ -152.673250, 57.413246 ], [ -152.630018, 57.405573 ], [ -152.620377, 57.401601 ], [ -152.601148, 57.382165 ], [ -152.606522, 57.363660 ], [ -152.630441, 57.322668 ], [ -152.657569, 57.303551 ], [ -152.695698, 57.281318 ], [ -152.707768, 57.276046 ], [ -152.712008, 57.278120 ], [ -152.719760, 57.302260 ], [ -152.734989, 57.307019 ], [ -152.752121, 57.305116 ], [ -152.774155, 57.290432 ], [ -152.787994, 57.279905 ], [ -152.818187, 57.265368 ], [ -152.886384, 57.291337 ], [ -152.900688, 57.302976 ], [ -152.909051, 57.324222 ], [ -152.984715, 57.339918 ], [ -153.008525, 57.339733 ], [ -153.056007, 57.329229 ], [ -153.079288, 57.321960 ], [ -153.098089, 57.313441 ], [ -153.114270, 57.307730 ], [ -153.116280, 57.297312 ], [ -153.101322, 57.286901 ], [ -153.096133, 57.286866 ], [ -153.039134, 57.293314 ], [ -153.017643, 57.297715 ], [ -153.015994, 57.300231 ], [ -153.012992, 57.299453 ], [ -152.970910, 57.282624 ], [ -152.944201, 57.259083 ], [ -152.943463, 57.256956 ], [ -152.950982, 57.248991 ], [ -152.997739, 57.231176 ], [ -153.056971, 57.214756 ], [ -153.077916, 57.211444 ], [ -153.125477, 57.211841 ], [ -153.163333, 57.216713 ], [ -153.169724, 57.220236 ], [ -153.201722, 57.221679 ], [ -153.209732, 57.218773 ], [ -153.215107, 57.213356 ], [ -153.215967, 57.209297 ], [ -153.213802, 57.205059 ], [ -153.166002, 57.180643 ], [ -153.123865, 57.175445 ], [ -153.097019, 57.183289 ], [ -153.073982, 57.187091 ], [ -153.058114, 57.184950 ], [ -153.041934, 57.175432 ], [ -153.010525, 57.183046 ], [ -152.949333, 57.187346 ], [ -152.880321, 57.164798 ], [ -152.874839, 57.160950 ], [ -152.869797, 57.150849 ], [ -152.900540, 57.132076 ], [ -152.911371, 57.126813 ], [ -152.950736, 57.119788 ], [ -152.997246, 57.119491 ], [ -153.118673, 57.091033 ], [ -153.128881, 57.092571 ], [ -153.132708, 57.094936 ], [ -153.133988, 57.099351 ], [ -153.146361, 57.100883 ], [ -153.180010, 57.094523 ], [ -153.215440, 57.075943 ], [ -153.220953, 57.068239 ], [ -153.222240, 57.061798 ], [ -153.221204, 57.060367 ], [ -153.213318, 57.055891 ], [ -153.205384, 57.056148 ], [ -153.200217, 57.042039 ], [ -153.204319, 57.033640 ], [ -153.235282, 57.007398 ], [ -153.301142, 56.991192 ], [ -153.312583, 56.991486 ], [ -153.348707, 57.008373 ], [ -153.349037, 57.011196 ], [ -153.320929, 57.036838 ], [ -153.324265, 57.043308 ], [ -153.350793, 57.045279 ], [ -153.356504, 57.052893 ], [ -153.337468, 57.065266 ], [ -153.337468, 57.072880 ], [ -153.345082, 57.075736 ], [ -153.365239, 57.072080 ], [ -153.396921, 57.060399 ], [ -153.402608, 57.070092 ], [ -153.404263, 57.080511 ], [ -153.384699, 57.115354 ], [ -153.380389, 57.120468 ], [ -153.345533, 57.139565 ], [ -153.325566, 57.148782 ], [ -153.294157, 57.175432 ], [ -153.292253, 57.185902 ], [ -153.310143, 57.194426 ], [ -153.350266, 57.192339 ], [ -153.368180, 57.185337 ], [ -153.368921, 57.180832 ], [ -153.366525, 57.176708 ], [ -153.454618, 57.110052 ], [ -153.482139, 57.130939 ], [ -153.492609, 57.141409 ], [ -153.501175, 57.140457 ], [ -153.506886, 57.130939 ], [ -153.487850, 57.105241 ], [ -153.486520, 57.085915 ], [ -153.489600, 57.074702 ], [ -153.498850, 57.065363 ], [ -153.535942, 57.077988 ], [ -153.563562, 57.089769 ], [ -153.577006, 57.093177 ], [ -153.654497, 57.084602 ], [ -153.675981, 57.069830 ], [ -153.675736, 57.054778 ], [ -153.663810, 57.053694 ], [ -153.601294, 57.056656 ], [ -153.595819, 57.056309 ], [ -153.580831, 57.049048 ], [ -153.574974, 57.040625 ], [ -153.593498, 57.025291 ], [ -153.593498, 57.020532 ], [ -153.586836, 57.013870 ], [ -153.547500, 57.001103 ], [ -153.543429, 56.995245 ], [ -153.556762, 56.968862 ], [ -153.600664, 56.942629 ], [ -153.627483, 56.937127 ], [ -153.671317, 56.932926 ], [ -153.691659, 56.928479 ], [ -153.690971, 56.914292 ], [ -153.703255, 56.902941 ], [ -153.730713, 56.893996 ], [ -153.756253, 56.874909 ], [ -153.746735, 56.871102 ], [ -153.715263, 56.878442 ], [ -153.704603, 56.878046 ], [ -153.688713, 56.871975 ], [ -153.696693, 56.861519 ], [ -153.714644, 56.852925 ], [ -153.778199, 56.834386 ], [ -153.796111, 56.842655 ], [ -153.800935, 56.846894 ], [ -153.807353, 56.848584 ], [ -153.843817, 56.830175 ], [ -153.840962, 56.818754 ], [ -153.897117, 56.786393 ], [ -153.904732, 56.770213 ], [ -153.924041, 56.767216 ], [ -153.963274, 56.747600 ], [ -153.971780, 56.744861 ], [ -153.990158, 56.743263 ], [ -154.016213, 56.743466 ], [ -154.022610, 56.755946 ], [ -154.037153, 56.763414 ], [ -154.050518, 56.763523 ], [ -154.064292, 56.760091 ], [ -154.085088, 56.751193 ], [ -154.106565, 56.745572 ], [ -154.129017, 56.742168 ], [ -154.136965, 56.742359 ], [ -154.148745, 56.745677 ], [ -154.125431, 56.783298 ], [ -154.072878, 56.841099 ], [ -154.067425, 56.845303 ], [ -154.055228, 56.850465 ], [ -154.040948, 56.854135 ], [ -154.030502, 56.855052 ], [ -153.984547, 56.889626 ], [ -153.935992, 56.915772 ], [ -153.894564, 56.926986 ], [ -153.862954, 56.944374 ], [ -153.850464, 56.957278 ], [ -153.873411, 56.963403 ], [ -153.902802, 56.968445 ], [ -153.913627, 56.965391 ], [ -153.917703, 56.962169 ], [ -153.934781, 56.958928 ], [ -153.976871, 56.955144 ], [ -153.979743, 56.962189 ], [ -153.970876, 56.997449 ], [ -153.925190, 57.059315 ], [ -153.886167, 57.084061 ], [ -153.870938, 57.088820 ], [ -153.858891, 57.088844 ], [ -153.804787, 57.113158 ], [ -153.783465, 57.131822 ], [ -153.776707, 57.142858 ], [ -153.779087, 57.158821 ], [ -153.788521, 57.161381 ], [ -153.806290, 57.157424 ], [ -153.817638, 57.141168 ], [ -153.830012, 57.126891 ], [ -153.861711, 57.119224 ], [ -153.955647, 57.074543 ], [ -153.988960, 57.045990 ], [ -154.024288, 57.016608 ], [ -154.055554, 56.987209 ], [ -154.076623, 56.970589 ], [ -154.123489, 56.956170 ], [ -154.145167, 56.945034 ], [ -154.159014, 56.945323 ], [ -154.165409, 56.943244 ], [ -154.212110, 56.909749 ], [ -154.223560, 56.896064 ], [ -154.227193, 56.883026 ], [ -154.226494, 56.876257 ], [ -154.231771, 56.872294 ], [ -154.276739, 56.853648 ], [ -154.298965, 56.846479 ], [ -154.305713, 56.846871 ], [ -154.300193, 56.852023 ], [ -154.298422, 56.863176 ], [ -154.300002, 56.892252 ], [ -154.306936, 56.911783 ], [ -154.312888, 56.918673 ], [ -154.385285, 56.959767 ], [ -154.407490, 56.968334 ], [ -154.476315, 56.984204 ], [ -154.511672, 56.988548 ], [ -154.524695, 56.991623 ], [ -154.528538, 57.001892 ], [ -154.516842, 57.030312 ], [ -154.515213, 57.077985 ], [ -154.529844, 57.168882 ], [ -154.533699, 57.183513 ], [ -154.539552, 57.196351 ], [ -154.574343, 57.239919 ], [ -154.594977, 57.257161 ], [ -154.613723, 57.267800 ], [ -154.691855, 57.284110 ], [ -154.698264, 57.284294 ], [ -154.740161, 57.276517 ], [ -154.777368, 57.280008 ], [ -154.792054, 57.286696 ], [ -154.793840, 57.288862 ], [ -154.751537, 57.307781 ], [ -154.743090, 57.314770 ], [ -154.761338, 57.332480 ], [ -154.780373, 57.339142 ], [ -154.793698, 57.349612 ], [ -154.779421, 57.362937 ], [ -154.717624, 57.366544 ], [ -154.700598, 57.401162 ], [ -154.699629, 57.412873 ], [ -154.708509, 57.426703 ], [ -154.693310, 57.446085 ], [ -154.629678, 57.510197 ], [ -154.618704, 57.514972 ], [ -154.602546, 57.518751 ], [ -154.591678, 57.518597 ], [ -154.540923, 57.539621 ], [ -154.520055, 57.570423 ], [ -154.500282, 57.574423 ], [ -154.468328, 57.570339 ], [ -154.431841, 57.584783 ], [ -154.411385, 57.598452 ], [ -154.344244, 57.630901 ], [ -154.225660, 57.661366 ], [ -154.196959, 57.664639 ], [ -154.186597, 57.658578 ], [ -154.086130, 57.649054 ], [ -154.056226, 57.652430 ], [ -154.031592, 57.660854 ], [ -153.994572, 57.656905 ], [ -153.983015, 57.649835 ], [ -153.982581, 57.648251 ], [ -153.984847, 57.604595 ], [ -153.970876, 57.562808 ], [ -153.960406, 57.542821 ], [ -153.947550, 57.540244 ], [ -153.939099, 57.538271 ], [ -153.929265, 57.533253 ], [ -153.925905, 57.529051 ], [ -153.922982, 57.520153 ], [ -153.922183, 57.499036 ], [ -153.919897, 57.485202 ], [ -153.909415, 57.442413 ], [ -153.895800, 57.422108 ], [ -153.802932, 57.350896 ], [ -153.795299, 57.349047 ], [ -153.774275, 57.360243 ], [ -153.773191, 57.372442 ], [ -153.811506, 57.412375 ], [ -153.872922, 57.445743 ], [ -153.874177, 57.447817 ], [ -153.888891, 57.504682 ], [ -153.875950, 57.542769 ], [ -153.869096, 57.551844 ], [ -153.848082, 57.560589 ], [ -153.824823, 57.577617 ], [ -153.813136, 57.588581 ], [ -153.823753, 57.597651 ], [ -153.846828, 57.612648 ], [ -153.852502, 57.613517 ], [ -153.877756, 57.629529 ], [ -153.879943, 57.634072 ], [ -153.874286, 57.646110 ], [ -153.868275, 57.649688 ], [ -153.858545, 57.651138 ], [ -153.749178, 57.646224 ], [ -153.705322, 57.640923 ], [ -153.667261, 57.639008 ], [ -153.663007, 57.639858 ], [ -153.648693, 57.654125 ], [ -153.658008, 57.661480 ], [ -153.676721, 57.669663 ], [ -153.797971, 57.696508 ], [ -153.862886, 57.706943 ], [ -153.888099, 57.705447 ], [ -153.918344, 57.695663 ], [ -153.930279, 57.696791 ], [ -153.932964, 57.703778 ], [ -153.935220, 57.813047 ], [ -153.823385, 57.865013 ], [ -153.755054, 57.883565 ], [ -153.721176, 57.890615 ], [ -153.648798, 57.880103 ], [ -153.571362, 57.832101 ], [ -153.550823, 57.786890 ], [ -153.551088, 57.763110 ], [ -153.553251, 57.759512 ], [ -153.557647, 57.734741 ], [ -153.554226, 57.722450 ], [ -153.549605, 57.717967 ], [ -153.515205, 57.716505 ], [ -153.493401, 57.728316 ], [ -153.504982, 57.735084 ], [ -153.487850, 57.774108 ], [ -153.469892, 57.766536 ], [ -153.462463, 57.795292 ], [ -153.480377, 57.814665 ], [ -153.487350, 57.834274 ], [ -153.479457, 57.842020 ], [ -153.451560, 57.839284 ], [ -153.406716, 57.828663 ], [ -153.353580, 57.809731 ], [ -153.343408, 57.810866 ], [ -153.324872, 57.831048 ], [ -153.322687, 57.836190 ], [ -153.324881, 57.848421 ], [ -153.328137, 57.849851 ], [ -153.395813, 57.858772 ], [ -153.446406, 57.875035 ], [ -153.462011, 57.880588 ], [ -153.512024, 57.909156 ], [ -153.528697, 57.921717 ], [ -153.536524, 57.930770 ], [ -153.533204, 57.941117 ], [ -153.520392, 57.963387 ], [ -153.513347, 57.968751 ], [ -153.484603, 57.976500 ], [ -153.469421, 57.977282 ], [ -153.461113, 57.972769 ], [ -153.452645, 57.963509 ], [ -153.273676, 57.890408 ], [ -153.268149, 57.888741 ], [ -153.236952, 57.891818 ], [ -153.127278, 57.856748 ], [ -153.122513, 57.856639 ], [ -153.093420, 57.861569 ], [ -153.089419, 57.865233 ], [ -153.198618, 57.929923 ], [ -153.233229, 57.940993 ], [ -153.270325, 57.958566 ], [ -153.299009, 57.985626 ], [ -153.302198, 57.991706 ], [ -153.297756, 57.996425 ], [ -153.276536, 57.998447 ], [ -153.234730, 57.996972 ], [ -153.221576, 57.989319 ], [ -153.217306, 57.983659 ], [ -153.129494, 57.946551 ], [ -153.069857, 57.934428 ], [ -153.052671, 57.936711 ], [ -153.033849, 57.930200 ], [ -153.011006, 57.925441 ], [ -153.000536, 57.928297 ], [ -152.999585, 57.945429 ], [ -152.983763, 57.950231 ], [ -152.876197, 57.932446 ], [ -152.871663, 57.933279 ], [ -152.841588, 57.926393 ], [ -152.805421, 57.914020 ], [ -152.798308, 57.903393 ], [ -152.804807, 57.899175 ], [ -152.823299, 57.890928 ], [ -152.892517, 57.842525 ], [ -152.902633, 57.830146 ], [ -152.909791, 57.810405 ], [ -152.916334, 57.771216 ], [ -152.904312, 57.750825 ], [ -152.892875, 57.742012 ], [ -152.881998, 57.738320 ], [ -152.874498, 57.737961 ], [ -152.850336, 57.740041 ], [ -152.847811, 57.746625 ], [ -152.852269, 57.752318 ], [ -152.854718, 57.770271 ], [ -152.849997, 57.821462 ], [ -152.841361, 57.830221 ], [ -152.822543, 57.843203 ], [ -152.790211, 57.858058 ], [ -152.758168, 57.840272 ], [ -152.753437, 57.834452 ], [ -152.735459, 57.824549 ], [ -152.725302, 57.835400 ], [ -152.703580, 57.869286 ], [ -152.669315, 57.880707 ], [ -152.650456, 57.863721 ], [ -152.625607, 57.881232 ], [ -152.626441, 57.890450 ], [ -152.639887, 57.899688 ], [ -152.641805, 57.902499 ], [ -152.639375, 57.914220 ], [ -152.635378, 57.918610 ], [ -152.587705, 57.926961 ], [ -152.585985, 57.908101 ], [ -152.567395, 57.900358 ], [ -152.549661, 57.900137 ], [ -152.526283, 57.913266 ], [ -152.487666, 57.941968 ], [ -152.470336, 57.962099 ], [ -152.432608, 57.976029 ], [ -152.421408, 57.975683 ], [ -152.415177, 57.973081 ], [ -152.411618, 57.969282 ], [ -152.422573, 57.948662 ], [ -152.437604, 57.939834 ], [ -152.437416, 57.936978 ], [ -152.426458, 57.930851 ], [ -152.388626, 57.924486 ], [ -152.362161, 57.926200 ], [ -152.324103, 57.916604 ], [ -152.333209, 57.902550 ], [ -152.364777, 57.883921 ], [ -152.377063, 57.886728 ], [ -152.386130, 57.890706 ], [ -152.394750, 57.894602 ], [ -152.403700, 57.901146 ], [ -152.414977, 57.902231 ], [ -152.448240, 57.902605 ], [ -152.468511, 57.888621 ], [ -152.459023, 57.871118 ], [ -152.420900, 57.865479 ], [ -152.396153, 57.855009 ], [ -152.409478, 57.841684 ], [ -152.442512, 57.840659 ], [ -152.433653, 57.824314 ], [ -152.429326, 57.820114 ], [ -152.417424, 57.815464 ] ] ], [ [ [ -169.553937, 56.608682 ], [ -169.528659, 56.612181 ], [ -169.507415, 56.610702 ], [ -169.473138, 56.601741 ], [ -169.471550, 56.598864 ], [ -169.490133, 56.583482 ], [ -169.568984, 56.540935 ], [ -169.582624, 56.536939 ], [ -169.640735, 56.542162 ], [ -169.650135, 56.544230 ], [ -169.657736, 56.547319 ], [ -169.667749, 56.554535 ], [ -169.672818, 56.560866 ], [ -169.671324, 56.567328 ], [ -169.675327, 56.578414 ], [ -169.683639, 56.583340 ], [ -169.755750, 56.591922 ], [ -169.785692, 56.613245 ], [ -169.789659, 56.618217 ], [ -169.763506, 56.620739 ], [ -169.679305, 56.611593 ], [ -169.611548, 56.606924 ], [ -169.553937, 56.608682 ] ] ], [ [ [ -157.026070, 56.559757 ], [ -156.990969, 56.547939 ], [ -156.975549, 56.540446 ], [ -156.972896, 56.536505 ], [ -156.986090, 56.532749 ], [ -157.003409, 56.535639 ], [ -157.006523, 56.538910 ], [ -157.017711, 56.543081 ], [ -157.053384, 56.550425 ], [ -157.113193, 56.552658 ], [ -157.121393, 56.551963 ], [ -157.142219, 56.542390 ], [ -157.150309, 56.533600 ], [ -157.168777, 56.530210 ], [ -157.326059, 56.525169 ], [ -157.328898, 56.528155 ], [ -157.326110, 56.540375 ], [ -157.298635, 56.560051 ], [ -157.288702, 56.566039 ], [ -157.250098, 56.582142 ], [ -157.146636, 56.583651 ], [ -157.091146, 56.581134 ], [ -157.077383, 56.579035 ], [ -157.026070, 56.559757 ] ] ], [ [ [ -153.940505, 56.558317 ], [ -153.915288, 56.564921 ], [ -153.878764, 56.565925 ], [ -153.870804, 56.558015 ], [ -153.868461, 56.551493 ], [ -153.887678, 56.533637 ], [ -153.952958, 56.507174 ], [ -153.993909, 56.501796 ], [ -154.120244, 56.501838 ], [ -154.143711, 56.506172 ], [ -154.163987, 56.507844 ], [ -154.197280, 56.502002 ], [ -154.232464, 56.491052 ], [ -154.304371, 56.502322 ], [ -154.343096, 56.510171 ], [ -154.347400, 56.512046 ], [ -154.361378, 56.525640 ], [ -154.362361, 56.542512 ], [ -154.341401, 56.563705 ], [ -154.310913, 56.585447 ], [ -154.290020, 56.595376 ], [ -154.244234, 56.609194 ], [ -154.223759, 56.612955 ], [ -154.210336, 56.609684 ], [ -154.206001, 56.606908 ], [ -154.184819, 56.603773 ], [ -154.136739, 56.609350 ], [ -154.113397, 56.616745 ], [ -154.103243, 56.617695 ], [ -154.095833, 56.617786 ], [ -154.090014, 56.614798 ], [ -154.081829, 56.603716 ], [ -154.079016, 56.589977 ], [ -154.075187, 56.583745 ], [ -154.041572, 56.556209 ], [ -154.025334, 56.551763 ], [ -154.009274, 56.551445 ], [ -153.940505, 56.558317 ] ] ], [ [ [ -132.546463, 56.606563 ], [ -132.539698, 56.593199 ], [ -132.541282, 56.584573 ], [ -132.610830, 56.556252 ], [ -132.627435, 56.552428 ], [ -132.628511, 56.553553 ], [ -132.650910, 56.552127 ], [ -132.701275, 56.529580 ], [ -132.724189, 56.515371 ], [ -132.796627, 56.496471 ], [ -132.818043, 56.494934 ], [ -132.874282, 56.509108 ], [ -132.984751, 56.512640 ], [ -132.986907, 56.510784 ], [ -133.041726, 56.518356 ], [ -133.071828, 56.553483 ], [ -133.075496, 56.578684 ], [ -133.025091, 56.605048 ], [ -133.110329, 56.669727 ], [ -133.143198, 56.682979 ], [ -133.184363, 56.706526 ], [ -133.212185, 56.736822 ], [ -133.225298, 56.755591 ], [ -133.233331, 56.771095 ], [ -133.235251, 56.775639 ], [ -133.233646, 56.779447 ], [ -133.244689, 56.792649 ], [ -133.264047, 56.814544 ], [ -133.277352, 56.816432 ], [ -133.325392, 56.791864 ], [ -133.334308, 56.773402 ], [ -133.332845, 56.761663 ], [ -133.319860, 56.737693 ], [ -133.303752, 56.729879 ], [ -133.272958, 56.733653 ], [ -133.266844, 56.734882 ], [ -133.265608, 56.738237 ], [ -133.266768, 56.741943 ], [ -133.261381, 56.747459 ], [ -133.250686, 56.751431 ], [ -133.219681, 56.706887 ], [ -133.221517, 56.697886 ], [ -133.232516, 56.681336 ], [ -133.233684, 56.649286 ], [ -133.214228, 56.649592 ], [ -133.151444, 56.637672 ], [ -133.106316, 56.618393 ], [ -133.103363, 56.614645 ], [ -133.089388, 56.535474 ], [ -133.089215, 56.523916 ], [ -133.112907, 56.529295 ], [ -133.138307, 56.532923 ], [ -133.142099, 56.528591 ], [ -133.142482, 56.519697 ], [ -133.139228, 56.515994 ], [ -133.124726, 56.511439 ], [ -133.122245, 56.492020 ], [ -133.148730, 56.467357 ], [ -133.160996, 56.460257 ], [ -133.203584, 56.447657 ], [ -133.348504, 56.469568 ], [ -133.356300, 56.471794 ], [ -133.361615, 56.486073 ], [ -133.371889, 56.493689 ], [ -133.376245, 56.495592 ], [ -133.401797, 56.496355 ], [ -133.417795, 56.494147 ], [ -133.428585, 56.479247 ], [ -133.460634, 56.454120 ], [ -133.512684, 56.437015 ], [ -133.532969, 56.434751 ], [ -133.603669, 56.435413 ], [ -133.638349, 56.438881 ], [ -133.655468, 56.442279 ], [ -133.663094, 56.448073 ], [ -133.671653, 56.487656 ], [ -133.675836, 56.522714 ], [ -133.675696, 56.538672 ], [ -133.672262, 56.544152 ], [ -133.664509, 56.550727 ], [ -133.662631, 56.555735 ], [ -133.663064, 56.562070 ], [ -133.686050, 56.570709 ], [ -133.694378, 56.570709 ], [ -133.691998, 56.575467 ], [ -133.665107, 56.587778 ], [ -133.662631, 56.598924 ], [ -133.667639, 56.607687 ], [ -133.673621, 56.611801 ], [ -133.679352, 56.633089 ], [ -133.683957, 56.638079 ], [ -133.697947, 56.642687 ], [ -133.708655, 56.652205 ], [ -133.724121, 56.679569 ], [ -133.721742, 56.690276 ], [ -133.716983, 56.694440 ], [ -133.703615, 56.702466 ], [ -133.699822, 56.710054 ], [ -133.699152, 56.717083 ], [ -133.702706, 56.719425 ], [ -133.705680, 56.724184 ], [ -133.705680, 56.754522 ], [ -133.700921, 56.759281 ], [ -133.688772, 56.767845 ], [ -133.687722, 56.773178 ], [ -133.701516, 56.780101 ], [ -133.709249, 56.787239 ], [ -133.706275, 56.789024 ], [ -133.675103, 56.794264 ], [ -133.672562, 56.798329 ], [ -133.680163, 56.803053 ], [ -133.689619, 56.806870 ], [ -133.694973, 56.812819 ], [ -133.694973, 56.825311 ], [ -133.687627, 56.833045 ], [ -133.689996, 56.839421 ], [ -133.699822, 56.839421 ], [ -133.712922, 56.827958 ], [ -133.741579, 56.813220 ], [ -133.765324, 56.807489 ], [ -133.772302, 56.809495 ], [ -133.787484, 56.821366 ], [ -133.795364, 56.824586 ], [ -133.869040, 56.845938 ], [ -133.887426, 56.868391 ], [ -133.908673, 56.905267 ], [ -133.894397, 56.907171 ], [ -133.887734, 56.912882 ], [ -133.894397, 56.919544 ], [ -133.903634, 56.927269 ], [ -133.921451, 56.961511 ], [ -133.967060, 56.988044 ], [ -134.049218, 57.029203 ], [ -134.033979, 57.063281 ], [ -134.008856, 57.074578 ], [ -133.887957, 57.097744 ], [ -133.773464, 57.078676 ], [ -133.702925, 57.065206 ], [ -133.613908, 57.057978 ], [ -133.536258, 57.038700 ], [ -133.446204, 57.020124 ], [ -133.362502, 57.007424 ], [ -133.354878, 57.010219 ], [ -133.346778, 57.013112 ], [ -133.335785, 57.012533 ], [ -133.325058, 57.011711 ], [ -133.308317, 57.014762 ], [ -133.104611, 57.005701 ], [ -132.997430, 56.942201 ], [ -132.981370, 56.927380 ], [ -132.947081, 56.870963 ], [ -132.935933, 56.839963 ], [ -132.935258, 56.822941 ], [ -132.903211, 56.803610 ], [ -132.872512, 56.798144 ], [ -132.853150, 56.797810 ], [ -132.820556, 56.793787 ], [ -132.762964, 56.753227 ], [ -132.741709, 56.724278 ], [ -132.743207, 56.713720 ], [ -132.665874, 56.680241 ], [ -132.628129, 56.668830 ], [ -132.622788, 56.668710 ], [ -132.619258, 56.660778 ], [ -132.625450, 56.653210 ], [ -132.628201, 56.645642 ], [ -132.625450, 56.642202 ], [ -132.616506, 56.639450 ], [ -132.605498, 56.623627 ], [ -132.595179, 56.613308 ], [ -132.574540, 56.612620 ], [ -132.560780, 56.607804 ], [ -132.553213, 56.608492 ], [ -132.546463, 56.606563 ] ] ], [ [ [ -154.404015, 56.572287 ], [ -154.393868, 56.562388 ], [ -154.391294, 56.557931 ], [ -154.392480, 56.554053 ], [ -154.436794, 56.534556 ], [ -154.529507, 56.502655 ], [ -154.571701, 56.494165 ], [ -154.633586, 56.471817 ], [ -154.668517, 56.452544 ], [ -154.691485, 56.436711 ], [ -154.704129, 56.424230 ], [ -154.736550, 56.403848 ], [ -154.742887, 56.401678 ], [ -154.765021, 56.401361 ], [ -154.775766, 56.404075 ], [ -154.789003, 56.411015 ], [ -154.799907, 56.419387 ], [ -154.805481, 56.427488 ], [ -154.806114, 56.434182 ], [ -154.777505, 56.462199 ], [ -154.739644, 56.496332 ], [ -154.706140, 56.521273 ], [ -154.534726, 56.600540 ], [ -154.524629, 56.603925 ], [ -154.514078, 56.604059 ], [ -154.449965, 56.600361 ], [ -154.413435, 56.586768 ], [ -154.402289, 56.580543 ], [ -154.399389, 56.576411 ], [ -154.404015, 56.572287 ] ] ], [ [ [ -132.977163, 56.439673 ], [ -132.957364, 56.448963 ], [ -132.927663, 56.456859 ], [ -132.896342, 56.457978 ], [ -132.871919, 56.457038 ], [ -132.843184, 56.444827 ], [ -132.819256, 56.439511 ], [ -132.808145, 56.440801 ], [ -132.791872, 56.449169 ], [ -132.782864, 56.451530 ], [ -132.734466, 56.458515 ], [ -132.716056, 56.454861 ], [ -132.668127, 56.440279 ], [ -132.634335, 56.422174 ], [ -132.628592, 56.416284 ], [ -132.620608, 56.391200 ], [ -132.652380, 56.375879 ], [ -132.662178, 56.369134 ], [ -132.679401, 56.354299 ], [ -132.684112, 56.345671 ], [ -132.676553, 56.333105 ], [ -132.662478, 56.320451 ], [ -132.655467, 56.303756 ], [ -132.655513, 56.295575 ], [ -132.662081, 56.274795 ], [ -132.721254, 56.258464 ], [ -132.776045, 56.254585 ], [ -132.843716, 56.238933 ], [ -132.877582, 56.240322 ], [ -133.010587, 56.309492 ], [ -133.045383, 56.320783 ], [ -133.067556, 56.333573 ], [ -133.070863, 56.354194 ], [ -133.069441, 56.356426 ], [ -133.060361, 56.358378 ], [ -133.045714, 56.371451 ], [ -133.006575, 56.415881 ], [ -133.006314, 56.417778 ], [ -133.010871, 56.421404 ], [ -133.010817, 56.424264 ], [ -133.002357, 56.430655 ], [ -132.977163, 56.439673 ] ] ], [ [ [ -135.548794, 57.508977 ], [ -135.526036, 57.509697 ], [ -135.491537, 57.531687 ], [ -135.443404, 57.556876 ], [ -135.419205, 57.564159 ], [ -135.355749, 57.553568 ], [ -135.347597, 57.550232 ], [ -135.322925, 57.533476 ], [ -135.294491, 57.510836 ], [ -135.294837, 57.508720 ], [ -135.308458, 57.495201 ], [ -135.297784, 57.483721 ], [ -135.265557, 57.480860 ], [ -135.246114, 57.483598 ], [ -135.227293, 57.489838 ], [ -135.209123, 57.488753 ], [ -135.161017, 57.460713 ], [ -135.168056, 57.454212 ], [ -135.159206, 57.445568 ], [ -135.145949, 57.439049 ], [ -135.065050, 57.418972 ], [ -135.039634, 57.418131 ], [ -135.026566, 57.420497 ], [ -134.926516, 57.422267 ], [ -134.893440, 57.420044 ], [ -134.849477, 57.409670 ], [ -134.806352, 57.341888 ], [ -134.812769, 57.299765 ], [ -134.829365, 57.294098 ], [ -134.835211, 57.300315 ], [ -134.884780, 57.330003 ], [ -134.921651, 57.330713 ], [ -134.951267, 57.328660 ], [ -134.953951, 57.323723 ], [ -134.955014, 57.309433 ], [ -134.953011, 57.306131 ], [ -134.946626, 57.303164 ], [ -134.922329, 57.303708 ], [ -134.879535, 57.288177 ], [ -134.854948, 57.264766 ], [ -134.841774, 57.248588 ], [ -134.755886, 57.058035 ], [ -134.737880, 57.009935 ], [ -134.738300, 56.968059 ], [ -134.740135, 56.948481 ], [ -134.719275, 56.929031 ], [ -134.695735, 56.900791 ], [ -134.699099, 56.850864 ], [ -134.674238, 56.825177 ], [ -134.663434, 56.804687 ], [ -134.633997, 56.728722 ], [ -134.619799, 56.665888 ], [ -134.615955, 56.637289 ], [ -134.626943, 56.553868 ], [ -134.634207, 56.540968 ], [ -134.639732, 56.538835 ], [ -134.671047, 56.541200 ], [ -134.669778, 56.524129 ], [ -134.663839, 56.503183 ], [ -134.658622, 56.494676 ], [ -134.655174, 56.492033 ], [ -134.645308, 56.472215 ], [ -134.636506, 56.405625 ], [ -134.634010, 56.315840 ], [ -134.634668, 56.265832 ], [ -134.653827, 56.198385 ], [ -134.659870, 56.182494 ], [ -134.668151, 56.167026 ], [ -134.674028, 56.166925 ], [ -134.705007, 56.175722 ], [ -134.806163, 56.235533 ], [ -134.824902, 56.279692 ], [ -134.839411, 56.309403 ], [ -134.915911, 56.360555 ], [ -134.945704, 56.389710 ], [ -134.990763, 56.457998 ], [ -135.023780, 56.499977 ], [ -135.054049, 56.527658 ], [ -135.058238, 56.529453 ], [ -135.060878, 56.541965 ], [ -135.056756, 56.570611 ], [ -135.045054, 56.583392 ], [ -135.026740, 56.594625 ], [ -135.005249, 56.602252 ], [ -134.997669, 56.597272 ], [ -134.985881, 56.595844 ], [ -134.967164, 56.603026 ], [ -134.969842, 56.615392 ], [ -134.979386, 56.627676 ], [ -134.998369, 56.630017 ], [ -135.029747, 56.628918 ], [ -135.036432, 56.619628 ], [ -135.065693, 56.607852 ], [ -135.091611, 56.600068 ], [ -135.103271, 56.597927 ], [ -135.118709, 56.597728 ], [ -135.123389, 56.602823 ], [ -135.148836, 56.648915 ], [ -135.147761, 56.651932 ], [ -135.175826, 56.677876 ], [ -135.224142, 56.687858 ], [ -135.274910, 56.701633 ], [ -135.305077, 56.726382 ], [ -135.317429, 56.743311 ], [ -135.318082, 56.748688 ], [ -135.296430, 56.756294 ], [ -135.281608, 56.758528 ], [ -135.280875, 56.768357 ], [ -135.310159, 56.778093 ], [ -135.352176, 56.771196 ], [ -135.398678, 56.779201 ], [ -135.412989, 56.810079 ], [ -135.408542, 56.826014 ], [ -135.368899, 56.892589 ], [ -135.347244, 56.899980 ], [ -135.332356, 56.913951 ], [ -135.354090, 56.936500 ], [ -135.379725, 56.953039 ], [ -135.383376, 56.981544 ], [ -135.360232, 57.002231 ], [ -135.342801, 57.001874 ], [ -135.329492, 57.004507 ], [ -135.325216, 57.010866 ], [ -135.312780, 57.044984 ], [ -135.333998, 57.050403 ], [ -135.349229, 57.041535 ], [ -135.374100, 57.045391 ], [ -135.377763, 57.052910 ], [ -135.369858, 57.057923 ], [ -135.365710, 57.066062 ], [ -135.378337, 57.081622 ], [ -135.384617, 57.087725 ], [ -135.388859, 57.089026 ], [ -135.401721, 57.098654 ], [ -135.404140, 57.109318 ], [ -135.405293, 57.114508 ], [ -135.406158, 57.119697 ], [ -135.405293, 57.138149 ], [ -135.409703, 57.148861 ], [ -135.422746, 57.167724 ], [ -135.399312, 57.185003 ], [ -135.372441, 57.198063 ], [ -135.377580, 57.206302 ], [ -135.372021, 57.228003 ], [ -135.361771, 57.233591 ], [ -135.358715, 57.243776 ], [ -135.366177, 57.248852 ], [ -135.406086, 57.251678 ], [ -135.414799, 57.251324 ], [ -135.429229, 57.247213 ], [ -135.449073, 57.248104 ], [ -135.470189, 57.255752 ], [ -135.477683, 57.256824 ], [ -135.503121, 57.253809 ], [ -135.511241, 57.247077 ], [ -135.552574, 57.233194 ], [ -135.561883, 57.241868 ], [ -135.561853, 57.244067 ], [ -135.568954, 57.255186 ], [ -135.602297, 57.285707 ], [ -135.604161, 57.290437 ], [ -135.600688, 57.294074 ], [ -135.601782, 57.300772 ], [ -135.631415, 57.311568 ], [ -135.637423, 57.315276 ], [ -135.638209, 57.320278 ], [ -135.674687, 57.336747 ], [ -135.684597, 57.350328 ], [ -135.695563, 57.357460 ], [ -135.695120, 57.363077 ], [ -135.687696, 57.367477 ], [ -135.659614, 57.373907 ], [ -135.639556, 57.371883 ], [ -135.630627, 57.379595 ], [ -135.628016, 57.383393 ], [ -135.627022, 57.388207 ], [ -135.633573, 57.394211 ], [ -135.633654, 57.399102 ], [ -135.626007, 57.399578 ], [ -135.604184, 57.409932 ], [ -135.585395, 57.416811 ], [ -135.570872, 57.417459 ], [ -135.554548, 57.426636 ], [ -135.555321, 57.436738 ], [ -135.557806, 57.438236 ], [ -135.560990, 57.437455 ], [ -135.561916, 57.438505 ], [ -135.562234, 57.440413 ], [ -135.562234, 57.442720 ], [ -135.558496, 57.444788 ], [ -135.556109, 57.446458 ], [ -135.540158, 57.446241 ], [ -135.534221, 57.450252 ], [ -135.532069, 57.481117 ], [ -135.548794, 57.508977 ] ] ], [ [ [ -134.121514, 56.069847 ], [ -134.125421, 56.064412 ], [ -134.124662, 56.058722 ], [ -134.109868, 56.049238 ], [ -134.118132, 56.016922 ], [ -134.126903, 56.003592 ], [ -134.130907, 56.000104 ], [ -134.134181, 56.000971 ], [ -134.141998, 56.007946 ], [ -134.171281, 56.022421 ], [ -134.177944, 56.030035 ], [ -134.171731, 56.040227 ], [ -134.168034, 56.045850 ], [ -134.170904, 56.049950 ], [ -134.177053, 56.053230 ], [ -134.190863, 56.056540 ], [ -134.224073, 56.065223 ], [ -134.230449, 56.068341 ], [ -134.233621, 56.074042 ], [ -134.228388, 56.093805 ], [ -134.227437, 56.104275 ], [ -134.232195, 56.109985 ], [ -134.256332, 56.114842 ], [ -134.259913, 56.121275 ], [ -134.262217, 56.133222 ], [ -134.238264, 56.140863 ], [ -134.226882, 56.151189 ], [ -134.227942, 56.162835 ], [ -134.253135, 56.173755 ], [ -134.255990, 56.180417 ], [ -134.251244, 56.209049 ], [ -134.257478, 56.221411 ], [ -134.272170, 56.242283 ], [ -134.275978, 56.259416 ], [ -134.268363, 56.266078 ], [ -134.246307, 56.267768 ], [ -134.233147, 56.279403 ], [ -134.232195, 56.287017 ], [ -134.237906, 56.289873 ], [ -134.268363, 56.289873 ], [ -134.281387, 56.286218 ], [ -134.295634, 56.289228 ], [ -134.298292, 56.291993 ], [ -134.292353, 56.352644 ], [ -134.244042, 56.379521 ], [ -134.234099, 56.402183 ], [ -134.251231, 56.416460 ], [ -134.244569, 56.426930 ], [ -134.234099, 56.427881 ], [ -134.222678, 56.419315 ], [ -134.193922, 56.409906 ], [ -134.190494, 56.429749 ], [ -134.196394, 56.439800 ], [ -134.210968, 56.450498 ], [ -134.236978, 56.452363 ], [ -134.246627, 56.457135 ], [ -134.246179, 56.463511 ], [ -134.244667, 56.465100 ], [ -134.222814, 56.475402 ], [ -134.200909, 56.463297 ], [ -134.186476, 56.450571 ], [ -134.179214, 56.440305 ], [ -134.146136, 56.411069 ], [ -134.067466, 56.390987 ], [ -134.046227, 56.402275 ], [ -134.042704, 56.407697 ], [ -134.040938, 56.421530 ], [ -134.089604, 56.472582 ], [ -134.133892, 56.487825 ], [ -134.246095, 56.556984 ], [ -134.296917, 56.556372 ], [ -134.315001, 56.555420 ], [ -134.319760, 56.558276 ], [ -134.319760, 56.562083 ], [ -134.281093, 56.585555 ], [ -134.276735, 56.620290 ], [ -134.309869, 56.650509 ], [ -134.369035, 56.678022 ], [ -134.401407, 56.725419 ], [ -134.419791, 56.838385 ], [ -134.418940, 56.846524 ], [ -134.411471, 56.855837 ], [ -134.376975, 56.880055 ], [ -134.339168, 56.901830 ], [ -134.316868, 56.909091 ], [ -134.294362, 56.908714 ], [ -134.286818, 56.906534 ], [ -134.190950, 56.861675 ], [ -134.187063, 56.856714 ], [ -134.171675, 56.851218 ], [ -134.147160, 56.859357 ], [ -134.141933, 56.874188 ], [ -134.150935, 56.884958 ], [ -134.181383, 56.892572 ], [ -134.220002, 56.905084 ], [ -134.273113, 56.933823 ], [ -134.271664, 56.935928 ], [ -134.249327, 56.937374 ], [ -134.223939, 56.932553 ], [ -134.178507, 56.914018 ], [ -134.158108, 56.915029 ], [ -134.136240, 56.928842 ], [ -134.141236, 56.942081 ], [ -134.141385, 56.950887 ], [ -134.126562, 56.947381 ], [ -134.083291, 56.931579 ], [ -134.035140, 56.894510 ], [ -133.972257, 56.826934 ], [ -133.946767, 56.798924 ], [ -133.925648, 56.758912 ], [ -133.944663, 56.736433 ], [ -133.941801, 56.733493 ], [ -133.907795, 56.721840 ], [ -133.880781, 56.721396 ], [ -133.869334, 56.734081 ], [ -133.862981, 56.755650 ], [ -133.865056, 56.773240 ], [ -133.867616, 56.782025 ], [ -133.872250, 56.786186 ], [ -133.877395, 56.789192 ], [ -133.884755, 56.788656 ], [ -133.890005, 56.792468 ], [ -133.893861, 56.802526 ], [ -133.890805, 56.807980 ], [ -133.861472, 56.808837 ], [ -133.837925, 56.801788 ], [ -133.818194, 56.791453 ], [ -133.767780, 56.780469 ], [ -133.748129, 56.773919 ], [ -133.743376, 56.762291 ], [ -133.744002, 56.749772 ], [ -133.766143, 56.728886 ], [ -133.766143, 56.718242 ], [ -133.762049, 56.696135 ], [ -133.762780, 56.687180 ], [ -133.759650, 56.675913 ], [ -133.745673, 56.674028 ], [ -133.736613, 56.668861 ], [ -133.722931, 56.652205 ], [ -133.708060, 56.608185 ], [ -133.697352, 56.604616 ], [ -133.693783, 56.600452 ], [ -133.694973, 56.595693 ], [ -133.705085, 56.587365 ], [ -133.723141, 56.583962 ], [ -133.725906, 56.574278 ], [ -133.731259, 56.563570 ], [ -133.743752, 56.557621 ], [ -133.771710, 56.556432 ], [ -133.784202, 56.562380 ], [ -133.794594, 56.572711 ], [ -133.805023, 56.587960 ], [ -133.830602, 56.594503 ], [ -133.845474, 56.604616 ], [ -133.859750, 56.604616 ], [ -133.872242, 56.603426 ], [ -133.873432, 56.598667 ], [ -133.872837, 56.593313 ], [ -133.850232, 56.583796 ], [ -133.848207, 56.573057 ], [ -133.895746, 56.511217 ], [ -133.923401, 56.511222 ], [ -133.928160, 56.505868 ], [ -133.929350, 56.499920 ], [ -133.928160, 56.495755 ], [ -133.921616, 56.493376 ], [ -133.898589, 56.489877 ], [ -133.881080, 56.480803 ], [ -133.868625, 56.470919 ], [ -133.839117, 56.434885 ], [ -133.839238, 56.432018 ], [ -133.859104, 56.430348 ], [ -133.869729, 56.431796 ], [ -133.893040, 56.427364 ], [ -133.877775, 56.394926 ], [ -133.884437, 56.391119 ], [ -133.900618, 56.390167 ], [ -133.914135, 56.400292 ], [ -133.933512, 56.375428 ], [ -133.894358, 56.360989 ], [ -133.850314, 56.347417 ], [ -133.839099, 56.335467 ], [ -133.834671, 56.322382 ], [ -133.863690, 56.277040 ], [ -133.872064, 56.276905 ], [ -133.884437, 56.284519 ], [ -133.952966, 56.342578 ], [ -133.964387, 56.346385 ], [ -133.972953, 56.344481 ], [ -133.975809, 56.334963 ], [ -133.972001, 56.323542 ], [ -133.975809, 56.303555 ], [ -133.984375, 56.290230 ], [ -133.982471, 56.279760 ], [ -133.975809, 56.277856 ], [ -133.953917, 56.283567 ], [ -133.920605, 56.276905 ], [ -133.910135, 56.265483 ], [ -133.890940, 56.234467 ], [ -133.880927, 56.222712 ], [ -133.882117, 56.218548 ], [ -133.894015, 56.213194 ], [ -133.900558, 56.201892 ], [ -133.905317, 56.198918 ], [ -133.913645, 56.204866 ], [ -133.912992, 56.208351 ], [ -133.923420, 56.211725 ], [ -133.942205, 56.209460 ], [ -133.953825, 56.206661 ], [ -133.957471, 56.202584 ], [ -133.957575, 56.199887 ], [ -133.937349, 56.166129 ], [ -133.956411, 56.095484 ], [ -133.971228, 56.083293 ], [ -133.989359, 56.081347 ], [ -134.013920, 56.085374 ], [ -134.021028, 56.088745 ], [ -134.038695, 56.105807 ], [ -134.041765, 56.116337 ], [ -134.029643, 56.134864 ], [ -134.024495, 56.148164 ], [ -134.024356, 56.160382 ], [ -134.030964, 56.193214 ], [ -134.054411, 56.224854 ], [ -134.058499, 56.227214 ], [ -134.087317, 56.225424 ], [ -134.095013, 56.214751 ], [ -134.105098, 56.180941 ], [ -134.101801, 56.174707 ], [ -134.116078, 56.165189 ], [ -134.136065, 56.165189 ], [ -134.153663, 56.169700 ], [ -134.161971, 56.170153 ], [ -134.180057, 56.161635 ], [ -134.190371, 56.152571 ], [ -134.166141, 56.144564 ], [ -134.125902, 56.139804 ], [ -134.109868, 56.142554 ], [ -134.106454, 56.134209 ], [ -134.111006, 56.116001 ], [ -134.109787, 56.101381 ], [ -134.093235, 56.094757 ], [ -134.094187, 56.089046 ], [ -134.109236, 56.078732 ], [ -134.121514, 56.069847 ] ] ], [ [ [ -168.952766, 65.758911 ], [ -168.947278, 65.763817 ], [ -168.937240, 65.767116 ], [ -168.915518, 65.770484 ], [ -168.902235, 65.769665 ], [ -168.893219, 65.744705 ], [ -168.898754, 65.739709 ], [ -168.903439, 65.738454 ], [ -168.931220, 65.738940 ], [ -168.940760, 65.742714 ], [ -168.951388, 65.749319 ], [ -168.954515, 65.757144 ], [ -168.952766, 65.758911 ] ] ], [ [ [ -162.614621, 63.621832 ], [ -162.587527, 63.625115 ], [ -162.558234, 63.634308 ], [ -162.541389, 63.635727 ], [ -162.512298, 63.629784 ], [ -162.498175, 63.622069 ], [ -162.451929, 63.621270 ], [ -162.440229, 63.622491 ], [ -162.430304, 63.625745 ], [ -162.425419, 63.629950 ], [ -162.425265, 63.631654 ], [ -162.427696, 63.633134 ], [ -162.424205, 63.636215 ], [ -162.401203, 63.634367 ], [ -162.374243, 63.626425 ], [ -162.341892, 63.594062 ], [ -162.345179, 63.551785 ], [ -162.377988, 63.543813 ], [ -162.416802, 63.547389 ], [ -162.470029, 63.547500 ], [ -162.552701, 63.540951 ], [ -162.562007, 63.537105 ], [ -162.614949, 63.540601 ], [ -162.676581, 63.555648 ], [ -162.680973, 63.556859 ], [ -162.707559, 63.577607 ], [ -162.682629, 63.584066 ], [ -162.644513, 63.602599 ], [ -162.614621, 63.621832 ] ] ], [ [ [ -169.267598, 63.343995 ], [ -169.101961, 63.338022 ], [ -169.087914, 63.340937 ], [ -169.051950, 63.343127 ], [ -168.999241, 63.341249 ], [ -168.937385, 63.333789 ], [ -168.936333, 63.330622 ], [ -168.932623, 63.329140 ], [ -168.796086, 63.308781 ], [ -168.692939, 63.302282 ], [ -168.685145, 63.296427 ], [ -168.686675, 63.293022 ], [ -168.716872, 63.256316 ], [ -168.751537, 63.217962 ], [ -168.783239, 63.184131 ], [ -168.789266, 63.179646 ], [ -168.818344, 63.163224 ], [ -168.858750, 63.146958 ], [ -168.871465, 63.146009 ], [ -168.889683, 63.147708 ], [ -168.950091, 63.160895 ], [ -168.963577, 63.167104 ], [ -168.983024, 63.169671 ], [ -169.042674, 63.176511 ], [ -169.105808, 63.178803 ], [ -169.198398, 63.176011 ], [ -169.262039, 63.169936 ], [ -169.303477, 63.164439 ], [ -169.375667, 63.151269 ], [ -169.396308, 63.136617 ], [ -169.436748, 63.113579 ], [ -169.471949, 63.098565 ], [ -169.513650, 63.084717 ], [ -169.534984, 63.074355 ], [ -169.561131, 63.055178 ], [ -169.575873, 63.036450 ], [ -169.576965, 63.027025 ], [ -169.572777, 63.022118 ], [ -169.568016, 62.976879 ], [ -169.638309, 62.937527 ], [ -169.746736, 62.955991 ], [ -169.757249, 62.960087 ], [ -169.757514, 62.963722 ], [ -169.734938, 62.974468 ], [ -169.734938, 62.976617 ], [ -169.788466, 63.043015 ], [ -169.829912, 63.078550 ], [ -169.838511, 63.084339 ], [ -169.881230, 63.105848 ], [ -169.944056, 63.132360 ], [ -169.987936, 63.142975 ], [ -170.006196, 63.144540 ], [ -170.021208, 63.149500 ], [ -170.049622, 63.163377 ], [ -170.051062, 63.167489 ], [ -170.053402, 63.168858 ], [ -170.101301, 63.179300 ], [ -170.124354, 63.183665 ], [ -170.154072, 63.186402 ], [ -170.174421, 63.185464 ], [ -170.186485, 63.181618 ], [ -170.181985, 63.178804 ], [ -170.193695, 63.177434 ], [ -170.263032, 63.179147 ], [ -170.281388, 63.186821 ], [ -170.285648, 63.194570 ], [ -170.279881, 63.197108 ], [ -170.277915, 63.200239 ], [ -170.277721, 63.208819 ], [ -170.303630, 63.238692 ], [ -170.337275, 63.266308 ], [ -170.364806, 63.285596 ], [ -170.430656, 63.314284 ], [ -170.512102, 63.341881 ], [ -170.558950, 63.354989 ], [ -170.712572, 63.385975 ], [ -170.865412, 63.414229 ], [ -170.923450, 63.420859 ], [ -170.967475, 63.423730 ], [ -171.067663, 63.424579 ], [ -171.100855, 63.423420 ], [ -171.269249, 63.385386 ], [ -171.280185, 63.381543 ], [ -171.287157, 63.376642 ], [ -171.288265, 63.374833 ], [ -171.285411, 63.366464 ], [ -171.290324, 63.355383 ], [ -171.333089, 63.335393 ], [ -171.433319, 63.307578 ], [ -171.464455, 63.306915 ], [ -171.562263, 63.334591 ], [ -171.667115, 63.356166 ], [ -171.739321, 63.366114 ], [ -171.795297, 63.407853 ], [ -171.818259, 63.429452 ], [ -171.824872, 63.437141 ], [ -171.849984, 63.485039 ], [ -171.840382, 63.547724 ], [ -171.833681, 63.580074 ], [ -171.791881, 63.620625 ], [ -171.757081, 63.640252 ], [ -171.743979, 63.654905 ], [ -171.742338, 63.665494 ], [ -171.755552, 63.701173 ], [ -171.754336, 63.718960 ], [ -171.739918, 63.717096 ], [ -171.733206, 63.720327 ], [ -171.727986, 63.726791 ], [ -171.725748, 63.734745 ], [ -171.727986, 63.744938 ], [ -171.737432, 63.760350 ], [ -171.743398, 63.782971 ], [ -171.738178, 63.784711 ], [ -171.699647, 63.781728 ], [ -171.692686, 63.782598 ], [ -171.682494, 63.787570 ], [ -171.673296, 63.788067 ], [ -171.667330, 63.785581 ], [ -171.659873, 63.775762 ], [ -171.643963, 63.770791 ], [ -171.638991, 63.759231 ], [ -171.638246, 63.749536 ], [ -171.641477, 63.745559 ], [ -171.652912, 63.739220 ], [ -171.652664, 63.736610 ], [ -171.648935, 63.734870 ], [ -171.646692, 63.729425 ], [ -171.652630, 63.708523 ], [ -171.649923, 63.702540 ], [ -171.640027, 63.693430 ], [ -171.632194, 63.688601 ], [ -171.609439, 63.679832 ], [ -171.521859, 63.658797 ], [ -171.381677, 63.630646 ], [ -171.202557, 63.606897 ], [ -171.103558, 63.589268 ], [ -171.044486, 63.580431 ], [ -170.950817, 63.570127 ], [ -170.907197, 63.572107 ], [ -170.897581, 63.574676 ], [ -170.859032, 63.587503 ], [ -170.816581, 63.606329 ], [ -170.698156, 63.646778 ], [ -170.606282, 63.672732 ], [ -170.488192, 63.696723 ], [ -170.472181, 63.698677 ], [ -170.462947, 63.698022 ], [ -170.441066, 63.691981 ], [ -170.373871, 63.687322 ], [ -170.359363, 63.687321 ], [ -170.354527, 63.691924 ], [ -170.344855, 63.694225 ], [ -170.315839, 63.691923 ], [ -170.281988, 63.685020 ], [ -170.267480, 63.675816 ], [ -170.257808, 63.666611 ], [ -170.176413, 63.625489 ], [ -170.154754, 63.619072 ], [ -170.140040, 63.616696 ], [ -170.113066, 63.616245 ], [ -170.095833, 63.612701 ], [ -170.076689, 63.587988 ], [ -170.040919, 63.523411 ], [ -170.047114, 63.490135 ], [ -170.026953, 63.480702 ], [ -170.007943, 63.475428 ], [ -169.974858, 63.470618 ], [ -169.906304, 63.457519 ], [ -169.857078, 63.441975 ], [ -169.747634, 63.432756 ], [ -169.656474, 63.429929 ], [ -169.643167, 63.427802 ], [ -169.579892, 63.402870 ], [ -169.566562, 63.388725 ], [ -169.565439, 63.385563 ], [ -169.554375, 63.377158 ], [ -169.546934, 63.372792 ], [ -169.520524, 63.365941 ], [ -169.415329, 63.355943 ], [ -169.384080, 63.356733 ], [ -169.312970, 63.353335 ], [ -169.281422, 63.348381 ], [ -169.267598, 63.343995 ] ] ], [ [ [ -147.131319, 60.912932 ], [ -147.115336, 60.911938 ], [ -147.077772, 60.899503 ], [ -147.071788, 60.893833 ], [ -147.089645, 60.874693 ], [ -147.126799, 60.858011 ], [ -147.141802, 60.853991 ], [ -147.192354, 60.861635 ], [ -147.217749, 60.869741 ], [ -147.253128, 60.872969 ], [ -147.309086, 60.873924 ], [ -147.325640, 60.877153 ], [ -147.321084, 60.880198 ], [ -147.226303, 60.910421 ], [ -147.210324, 60.908776 ], [ -147.193399, 60.902949 ], [ -147.178969, 60.903704 ], [ -147.131319, 60.912932 ] ] ], [ [ [ -147.952039, 60.741879 ], [ -147.906021, 60.735515 ], [ -147.848176, 60.698116 ], [ -147.846103, 60.694509 ], [ -147.860057, 60.677233 ], [ -147.868067, 60.670825 ], [ -147.932931, 60.655714 ], [ -147.970684, 60.673799 ], [ -148.020259, 60.724950 ], [ -147.965419, 60.751996 ], [ -147.957239, 60.747706 ], [ -147.952039, 60.741879 ] ] ], [ [ [ -147.562801, 60.579821 ], [ -147.555392, 60.574059 ], [ -147.551709, 60.559612 ], [ -147.565775, 60.534713 ], [ -147.607756, 60.506920 ], [ -147.623835, 60.465878 ], [ -147.619972, 60.436821 ], [ -147.674351, 60.414430 ], [ -147.690773, 60.405054 ], [ -147.681888, 60.388167 ], [ -147.630081, 60.389550 ], [ -147.622020, 60.383794 ], [ -147.618906, 60.368848 ], [ -147.639474, 60.340579 ], [ -147.671135, 60.308929 ], [ -147.703599, 60.285589 ], [ -147.698608, 60.245552 ], [ -147.704731, 60.227874 ], [ -147.720124, 60.202002 ], [ -147.760681, 60.156396 ], [ -147.766484, 60.154180 ], [ -147.783583, 60.161073 ], [ -147.820159, 60.179555 ], [ -147.845681, 60.195434 ], [ -147.832285, 60.197855 ], [ -147.827991, 60.200630 ], [ -147.828962, 60.207442 ], [ -147.855453, 60.216419 ], [ -147.908985, 60.224359 ], [ -147.945158, 60.222324 ], [ -147.956228, 60.228667 ], [ -147.950532, 60.243791 ], [ -147.933269, 60.273632 ], [ -147.837456, 60.414452 ], [ -147.792822, 60.476193 ], [ -147.782548, 60.483300 ], [ -147.778269, 60.484007 ], [ -147.765825, 60.476505 ], [ -147.779329, 60.457078 ], [ -147.750864, 60.440981 ], [ -147.738151, 60.441277 ], [ -147.715312, 60.447915 ], [ -147.709160, 60.451883 ], [ -147.717097, 60.467282 ], [ -147.726642, 60.472216 ], [ -147.726460, 60.502533 ], [ -147.721824, 60.508635 ], [ -147.613843, 60.565906 ], [ -147.566372, 60.580849 ], [ -147.562801, 60.579821 ] ] ], [ [ [ -165.721389, 60.169620 ], [ -165.723168, 60.156603 ], [ -165.719120, 60.153521 ], [ -165.702411, 60.151285 ], [ -165.697273, 60.153592 ], [ -165.683507, 60.154221 ], [ -165.675374, 60.149360 ], [ -165.667863, 60.114676 ], [ -165.671567, 60.096877 ], [ -165.680612, 60.089962 ], [ -165.684585, 60.055237 ], [ -165.649318, 59.991837 ], [ -165.588873, 59.966005 ], [ -165.539367, 59.965175 ], [ -165.534482, 59.951276 ], [ -165.543456, 59.930376 ], [ -165.550405, 59.920007 ], [ -165.575815, 59.904672 ], [ -165.695981, 59.893513 ], [ -165.712875, 59.895364 ], [ -165.717549, 59.899137 ], [ -165.722458, 59.899813 ], [ -165.751851, 59.899947 ], [ -165.908502, 59.874697 ], [ -166.016128, 59.864532 ], [ -166.102232, 59.832519 ], [ -166.119084, 59.817590 ], [ -166.114325, 59.802123 ], [ -166.079823, 59.775949 ], [ -166.084582, 59.762862 ], [ -166.121464, 59.752154 ], [ -166.179761, 59.749775 ], [ -166.207124, 59.756913 ], [ -166.219022, 59.774759 ], [ -166.249955, 59.802123 ], [ -166.336805, 59.834246 ], [ -166.381986, 59.849087 ], [ -166.407290, 59.854604 ], [ -166.439746, 59.857816 ], [ -166.512223, 59.849939 ], [ -166.583297, 59.848705 ], [ -166.616849, 59.850711 ], [ -166.621473, 59.856438 ], [ -166.648076, 59.871100 ], [ -166.678200, 59.881248 ], [ -166.716563, 59.889011 ], [ -166.764183, 59.892061 ], [ -166.801634, 59.916321 ], [ -166.866530, 59.949544 ], [ -166.892330, 59.960507 ], [ -166.995748, 59.993495 ], [ -167.067602, 59.992295 ], [ -167.111785, 59.989349 ], [ -167.124867, 59.991700 ], [ -167.133258, 59.994695 ], [ -167.220210, 60.040133 ], [ -167.247627, 60.058862 ], [ -167.281357, 60.063892 ], [ -167.310664, 60.064874 ], [ -167.339109, 60.070159 ], [ -167.342702, 60.072395 ], [ -167.342885, 60.074979 ], [ -167.334050, 60.088609 ], [ -167.333860, 60.094065 ], [ -167.343303, 60.123181 ], [ -167.347866, 60.131140 ], [ -167.362783, 60.147556 ], [ -167.423053, 60.195072 ], [ -167.421489, 60.205431 ], [ -167.369927, 60.225496 ], [ -167.312616, 60.238454 ], [ -167.201940, 60.237822 ], [ -167.105975, 60.232895 ], [ -167.081935, 60.225765 ], [ -167.045820, 60.219088 ], [ -166.937970, 60.205870 ], [ -166.909802, 60.206513 ], [ -166.847438, 60.213592 ], [ -166.812484, 60.227780 ], [ -166.803469, 60.242802 ], [ -166.809546, 60.259658 ], [ -166.826169, 60.268644 ], [ -166.834966, 60.271406 ], [ -166.832877, 60.275449 ], [ -166.814979, 60.286283 ], [ -166.762522, 60.309837 ], [ -166.738323, 60.314301 ], [ -166.662112, 60.322993 ], [ -166.608896, 60.321250 ], [ -166.578305, 60.321850 ], [ -166.569828, 60.325955 ], [ -166.562081, 60.359022 ], [ -166.493543, 60.392389 ], [ -166.414570, 60.371870 ], [ -166.408546, 60.365899 ], [ -166.387184, 60.359671 ], [ -166.366596, 60.358227 ], [ -166.310655, 60.377611 ], [ -166.200019, 60.393404 ], [ -166.174906, 60.401003 ], [ -166.171187, 60.428854 ], [ -166.163203, 60.432641 ], [ -166.135704, 60.424510 ], [ -166.124379, 60.414253 ], [ -166.124231, 60.409953 ], [ -166.134927, 60.400129 ], [ -166.123805, 60.378116 ], [ -166.084791, 60.325288 ], [ -166.012169, 60.317691 ], [ -165.987336, 60.317833 ], [ -165.927956, 60.321592 ], [ -165.924640, 60.325249 ], [ -165.923572, 60.330503 ], [ -165.920794, 60.335398 ], [ -165.916828, 60.338002 ], [ -165.883458, 60.343902 ], [ -165.786573, 60.326821 ], [ -165.714510, 60.310496 ], [ -165.697326, 60.297238 ], [ -165.685751, 60.277564 ], [ -165.686143, 60.267811 ], [ -165.698339, 60.210676 ], [ -165.708863, 60.189125 ], [ -165.721389, 60.169620 ] ] ], [ [ [ -148.552920, 59.954053 ], [ -148.586232, 59.934065 ], [ -148.636677, 59.915030 ], [ -148.675700, 59.922644 ], [ -148.677604, 59.938824 ], [ -148.688073, 59.942632 ], [ -148.714723, 59.937873 ], [ -148.728048, 59.939776 ], [ -148.735663, 59.952149 ], [ -148.752795, 59.959764 ], [ -148.787059, 59.955957 ], [ -148.825130, 59.930258 ], [ -148.856539, 59.922644 ], [ -148.881286, 59.929307 ], [ -148.920309, 59.967378 ], [ -148.938393, 59.972137 ], [ -148.960284, 59.969281 ], [ -148.995500, 59.953101 ], [ -149.025005, 59.949294 ], [ -149.034523, 59.957860 ], [ -149.043089, 59.960715 ], [ -149.087823, 59.955005 ], [ -149.117328, 59.962619 ], [ -149.123991, 59.972137 ], [ -149.121135, 59.984510 ], [ -149.103051, 59.995931 ], [ -149.090072, 59.999445 ], [ -149.089077, 60.004504 ], [ -149.072716, 60.019653 ], [ -149.041599, 60.030726 ], [ -149.037439, 60.040530 ], [ -149.040358, 60.048744 ], [ -149.049290, 60.058700 ], [ -149.058700, 60.061419 ], [ -149.096621, 60.044631 ], [ -149.133115, 60.044918 ], [ -149.167987, 60.027561 ], [ -149.172532, 60.014967 ], [ -149.185857, 60.002594 ], [ -149.194423, 60.003546 ], [ -149.204853, 60.009212 ], [ -149.223781, 59.982763 ], [ -149.235390, 59.938792 ], [ -149.239157, 59.911223 ], [ -149.273421, 59.871248 ], [ -149.286746, 59.869344 ], [ -149.294360, 59.881717 ], [ -149.300890, 59.933665 ], [ -149.327029, 59.987029 ], [ -149.325822, 60.001033 ], [ -149.341584, 60.076762 ], [ -149.360414, 60.101665 ], [ -149.371217, 60.118236 ], [ -149.420709, 60.121091 ], [ -149.432131, 60.113477 ], [ -149.435938, 60.071598 ], [ -149.440697, 60.032575 ], [ -149.416828, 60.018373 ], [ -149.396915, 60.002118 ], [ -149.388349, 59.989745 ], [ -149.388349, 59.983082 ], [ -149.408336, 59.984986 ], [ -149.429276, 59.977372 ], [ -149.459733, 59.919313 ], [ -149.476865, 59.922168 ], [ -149.487334, 59.933590 ], [ -149.510177, 59.932638 ], [ -149.555261, 59.911156 ], [ -149.584254, 59.866905 ], [ -149.592031, 59.846977 ], [ -149.619632, 59.822231 ], [ -149.615825, 59.812713 ], [ -149.596790, 59.809858 ], [ -149.585368, 59.779401 ], [ -149.569188, 59.775593 ], [ -149.538731, 59.782256 ], [ -149.524454, 59.730859 ], [ -149.526358, 59.703258 ], [ -149.612162, 59.723824 ], [ -149.638668, 59.742281 ], [ -149.667222, 59.819375 ], [ -149.666146, 59.850527 ], [ -149.662463, 59.896470 ], [ -149.683402, 59.939300 ], [ -149.705293, 59.948818 ], [ -149.727184, 59.948818 ], [ -149.730991, 59.925024 ], [ -149.721512, 59.894663 ], [ -149.746364, 59.860881 ], [ -149.741129, 59.825665 ], [ -149.750027, 59.820327 ], [ -149.762400, 59.820327 ], [ -149.778580, 59.837459 ], [ -149.801423, 59.845074 ], [ -149.808086, 59.843170 ], [ -149.807134, 59.827942 ], [ -149.784958, 59.808017 ], [ -149.754786, 59.794629 ], [ -149.757641, 59.766076 ], [ -149.738941, 59.732237 ], [ -149.728136, 59.692788 ], [ -149.746220, 59.673752 ], [ -149.737654, 59.643295 ], [ -149.746220, 59.637585 ], [ -149.791905, 59.661379 ], [ -149.847729, 59.720969 ], [ -149.849315, 59.738066 ], [ -149.864241, 59.743233 ], [ -149.882325, 59.740377 ], [ -149.904216, 59.762268 ], [ -149.975600, 59.773690 ], [ -150.028296, 59.788652 ], [ -150.041893, 59.782835 ], [ -150.042854, 59.772274 ], [ -149.960371, 59.744184 ], [ -149.928962, 59.723245 ], [ -149.920396, 59.708017 ], [ -149.919444, 59.691836 ], [ -149.933721, 59.668994 ], [ -149.950853, 59.657572 ], [ -149.976552, 59.656620 ], [ -149.997491, 59.661379 ], [ -150.005105, 59.659476 ], [ -150.002250, 59.634729 ], [ -150.031935, 59.613947 ], [ -150.048038, 59.624415 ], [ -150.046984, 59.644247 ], [ -150.063164, 59.661379 ], [ -150.073634, 59.661379 ], [ -150.086535, 59.644886 ], [ -150.114477, 59.590465 ], [ -150.086959, 59.583333 ], [ -150.108850, 59.569056 ], [ -150.168424, 59.561172 ], [ -150.192193, 59.551664 ], [ -150.181185, 59.541454 ], [ -150.180233, 59.533840 ], [ -150.213546, 59.519563 ], [ -150.207835, 59.531937 ], [ -150.253956, 59.521136 ], [ -150.239244, 59.506238 ], [ -150.253521, 59.486251 ], [ -150.284930, 59.496721 ], [ -150.311580, 59.475781 ], [ -150.296351, 59.455794 ], [ -150.297303, 59.416771 ], [ -150.307773, 59.415819 ], [ -150.363928, 59.419626 ], [ -150.375349, 59.409156 ], [ -150.392481, 59.387265 ], [ -150.401999, 59.386314 ], [ -150.429601, 59.392024 ], [ -150.431504, 59.396783 ], [ -150.412469, 59.436758 ], [ -150.390578, 59.472926 ], [ -150.368687, 59.517660 ], [ -150.342037, 59.542406 ], [ -150.316154, 59.569481 ], [ -150.317651, 59.599389 ], [ -150.286833, 59.624260 ], [ -150.283978, 59.642344 ], [ -150.288852, 59.647207 ], [ -150.300738, 59.646486 ], [ -150.347696, 59.600928 ], [ -150.355493, 59.598412 ], [ -150.412448, 59.554628 ], [ -150.431518, 59.514287 ], [ -150.478742, 59.458498 ], [ -150.498900, 59.456298 ], [ -150.516317, 59.462326 ], [ -150.521537, 59.467924 ], [ -150.521626, 59.474672 ], [ -150.518382, 59.477136 ], [ -150.515867, 59.482167 ], [ -150.516286, 59.486778 ], [ -150.522994, 59.494744 ], [ -150.536119, 59.498457 ], [ -150.554285, 59.508142 ], [ -150.564754, 59.524322 ], [ -150.563803, 59.532888 ], [ -150.533056, 59.563080 ], [ -150.512406, 59.577622 ], [ -150.512406, 59.587140 ], [ -150.516213, 59.591899 ], [ -150.538104, 59.591899 ], [ -150.556114, 59.590331 ], [ -150.575818, 59.579431 ], [ -150.589315, 59.565154 ], [ -150.594543, 59.553167 ], [ -150.602230, 59.545891 ], [ -150.614808, 59.545472 ], [ -150.631158, 59.549245 ], [ -150.639543, 59.547149 ], [ -150.638704, 59.532056 ], [ -150.631577, 59.521575 ], [ -150.615152, 59.510199 ], [ -150.595056, 59.499777 ], [ -150.589645, 59.500083 ], [ -150.584636, 59.494510 ], [ -150.579595, 59.479540 ], [ -150.579869, 59.475709 ], [ -150.584342, 59.467715 ], [ -150.585567, 59.450057 ], [ -150.581182, 59.445233 ], [ -150.601162, 59.425657 ], [ -150.650046, 59.420885 ], [ -150.651586, 59.421751 ], [ -150.676113, 59.424385 ], [ -150.692293, 59.431999 ], [ -150.700859, 59.432951 ], [ -150.739958, 59.425211 ], [ -150.745004, 59.400729 ], [ -150.769853, 59.372966 ], [ -150.795470, 59.362845 ], [ -150.819565, 59.357276 ], [ -150.834627, 59.351980 ], [ -150.877447, 59.318120 ], [ -150.911598, 59.311614 ], [ -150.912817, 59.305214 ], [ -150.895552, 59.286227 ], [ -150.887825, 59.273526 ], [ -150.887821, 59.267920 ], [ -150.897808, 59.255648 ], [ -150.942212, 59.233136 ], [ -150.959531, 59.232537 ], [ -150.975164, 59.236141 ], [ -150.988397, 59.230549 ], [ -150.995406, 59.224149 ], [ -150.996864, 59.219751 ], [ -150.970214, 59.202619 ], [ -150.971166, 59.198812 ], [ -150.994009, 59.204523 ], [ -151.009238, 59.212137 ], [ -151.017804, 59.222607 ], [ -151.015013, 59.241511 ], [ -151.011842, 59.251552 ], [ -150.996808, 59.257739 ], [ -150.999063, 59.271082 ], [ -151.023097, 59.269045 ], [ -151.032430, 59.275762 ], [ -151.044411, 59.293611 ], [ -151.046100, 59.299359 ], [ -151.057756, 59.301721 ], [ -151.070305, 59.287852 ], [ -151.068166, 59.284102 ], [ -151.071902, 59.281058 ], [ -151.091532, 59.269187 ], [ -151.121548, 59.282569 ], [ -151.153909, 59.284473 ], [ -151.161755, 59.281510 ], [ -151.161733, 59.272453 ], [ -151.146295, 59.264485 ], [ -151.104328, 59.256651 ], [ -151.101102, 59.240605 ], [ -151.102395, 59.228713 ], [ -151.107558, 59.217792 ], [ -151.126247, 59.209923 ], [ -151.163408, 59.202636 ], [ -151.186254, 59.202813 ], [ -151.190948, 59.206632 ], [ -151.192634, 59.211208 ], [ -151.206053, 59.219319 ], [ -151.217481, 59.222589 ], [ -151.221486, 59.214041 ], [ -151.242425, 59.201667 ], [ -151.250039, 59.203571 ], [ -151.261636, 59.220304 ], [ -151.273779, 59.229663 ], [ -151.280544, 59.230476 ], [ -151.284880, 59.227586 ], [ -151.287063, 59.224789 ], [ -151.287771, 59.219417 ], [ -151.292812, 59.214273 ], [ -151.305724, 59.209544 ], [ -151.341601, 59.222231 ], [ -151.379612, 59.242024 ], [ -151.387261, 59.250450 ], [ -151.390544, 59.264917 ], [ -151.399549, 59.276005 ], [ -151.407203, 59.279349 ], [ -151.429415, 59.268552 ], [ -151.437695, 59.253989 ], [ -151.449207, 59.248457 ], [ -151.488612, 59.237714 ], [ -151.509551, 59.234395 ], [ -151.518488, 59.230309 ], [ -151.525127, 59.224947 ], [ -151.520245, 59.216930 ], [ -151.504699, 59.212690 ], [ -151.477516, 59.214041 ], [ -151.467046, 59.211185 ], [ -151.467046, 59.207378 ], [ -151.469901, 59.204523 ], [ -151.497804, 59.204264 ], [ -151.502657, 59.195071 ], [ -151.521455, 59.195483 ], [ -151.558151, 59.200085 ], [ -151.574664, 59.195327 ], [ -151.579261, 59.187666 ], [ -151.576452, 59.172601 ], [ -151.580351, 59.165233 ], [ -151.590729, 59.161725 ], [ -151.698875, 59.163081 ], [ -151.710625, 59.158097 ], [ -151.720931, 59.156078 ], [ -151.739068, 59.156005 ], [ -151.748451, 59.158601 ], [ -151.764908, 59.175510 ], [ -151.761451, 59.205235 ], [ -151.758530, 59.215743 ], [ -151.761301, 59.221327 ], [ -151.838335, 59.209135 ], [ -151.874356, 59.211931 ], [ -151.915684, 59.227522 ], [ -151.917248, 59.231254 ], [ -151.910958, 59.236707 ], [ -151.906191, 59.237963 ], [ -151.905106, 59.247075 ], [ -151.925051, 59.254428 ], [ -151.952723, 59.250447 ], [ -151.959279, 59.247625 ], [ -151.978748, 59.253779 ], [ -151.991618, 59.313617 ], [ -151.963130, 59.344958 ], [ -151.952705, 59.349413 ], [ -151.924018, 59.354417 ], [ -151.903021, 59.360454 ], [ -151.890738, 59.373156 ], [ -151.887102, 59.382532 ], [ -151.908015, 59.395274 ], [ -151.905153, 59.401035 ], [ -151.886513, 59.421033 ], [ -151.826047, 59.439049 ], [ -151.770875, 59.447917 ], [ -151.751420, 59.446554 ], [ -151.740538, 59.438432 ], [ -151.728486, 59.439679 ], [ -151.720421, 59.443117 ], [ -151.706462, 59.462811 ], [ -151.694726, 59.468370 ], [ -151.634472, 59.482443 ], [ -151.570032, 59.468945 ], [ -151.542349, 59.467061 ], [ -151.528493, 59.472338 ], [ -151.505890, 59.477048 ], [ -151.485624, 59.475459 ], [ -151.470992, 59.472250 ], [ -151.466272, 59.484050 ], [ -151.469630, 59.502811 ], [ -151.436359, 59.530329 ], [ -151.420966, 59.537728 ], [ -151.365776, 59.541255 ], [ -151.323670, 59.550943 ], [ -151.272459, 59.555823 ], [ -151.266733, 59.562632 ], [ -151.264811, 59.568598 ], [ -151.271737, 59.576468 ], [ -151.278905, 59.589029 ], [ -151.278827, 59.592980 ], [ -151.274795, 59.596986 ], [ -151.201678, 59.591503 ], [ -151.203835, 59.577961 ], [ -151.209130, 59.573623 ], [ -151.208364, 59.562061 ], [ -151.192803, 59.562432 ], [ -151.164259, 59.587013 ], [ -151.158254, 59.594141 ], [ -151.165427, 59.601329 ], [ -151.188032, 59.608687 ], [ -151.205459, 59.630284 ], [ -151.207639, 59.640670 ], [ -151.203186, 59.645989 ], [ -151.173984, 59.651793 ], [ -151.126122, 59.668336 ], [ -151.121362, 59.674735 ], [ -151.122791, 59.677782 ], [ -151.116490, 59.696132 ], [ -151.098253, 59.709442 ], [ -151.018888, 59.756593 ], [ -150.927312, 59.793431 ], [ -150.948132, 59.792194 ], [ -150.982996, 59.783543 ], [ -151.001663, 59.788391 ], [ -151.006717, 59.792986 ], [ -151.027756, 59.796196 ], [ -151.063758, 59.793146 ], [ -151.113845, 59.777231 ], [ -151.172439, 59.751346 ], [ -151.214539, 59.729847 ], [ -151.329812, 59.683644 ], [ -151.377054, 59.681313 ], [ -151.424840, 59.670521 ], [ -151.436610, 59.666360 ], [ -151.439187, 59.663247 ], [ -151.441127, 59.653543 ], [ -151.448669, 59.648171 ], [ -151.461253, 59.643039 ], [ -151.503822, 59.633662 ], [ -151.643061, 59.646966 ], [ -151.686486, 59.660864 ], [ -151.746815, 59.686234 ], [ -151.796300, 59.704156 ], [ -151.829137, 59.720151 ], [ -151.850272, 59.739035 ], [ -151.859327, 59.749567 ], [ -151.869468, 59.769159 ], [ -151.867713, 59.778411 ], [ -151.857339, 59.791145 ], [ -151.833340, 59.814129 ], [ -151.813619, 59.844297 ], [ -151.803059, 59.878533 ], [ -151.792594, 59.888810 ], [ -151.777855, 59.897493 ], [ -151.757693, 59.917637 ], [ -151.742742, 59.944626 ], [ -151.718010, 60.009473 ], [ -151.702898, 60.032253 ], [ -151.661437, 60.057139 ], [ -151.623799, 60.088033 ], [ -151.606881, 60.099558 ], [ -151.545579, 60.128394 ], [ -151.517887, 60.145008 ], [ -151.488721, 60.167616 ], [ -151.421702, 60.212931 ], [ -151.406607, 60.228183 ], [ -151.387919, 60.267066 ], [ -151.381959, 60.296951 ], [ -151.383231, 60.326348 ], [ -151.381604, 60.358728 ], [ -151.377281, 60.365522 ], [ -151.366874, 60.372655 ], [ -151.306090, 60.387257 ], [ -151.301868, 60.384712 ], [ -151.299782, 60.385481 ], [ -151.293074, 60.416163 ], [ -151.286819, 60.434648 ], [ -151.283967, 60.452196 ], [ -151.280992, 60.512627 ], [ -151.278810, 60.520107 ], [ -151.264461, 60.543263 ], [ -151.268373, 60.548977 ], [ -151.303125, 60.561326 ], [ -151.323951, 60.574135 ], [ -151.330409, 60.580539 ], [ -151.339069, 60.594244 ], [ -151.344477, 60.613458 ], [ -151.345508, 60.622954 ], [ -151.350154, 60.634660 ], [ -151.362397, 60.653526 ], [ -151.387839, 60.674501 ], [ -151.404451, 60.695004 ], [ -151.410273, 60.711023 ], [ -151.409270, 60.720558 ], [ -151.384800, 60.729946 ], [ -151.370515, 60.733572 ], [ -151.309230, 60.740724 ], [ -151.279635, 60.747676 ], [ -151.270505, 60.751286 ], [ -151.261383, 60.757768 ], [ -151.259343, 60.762896 ], [ -151.261319, 60.769801 ], [ -151.252902, 60.773993 ], [ -151.212186, 60.780342 ], [ -151.106079, 60.783749 ], [ -151.062558, 60.787429 ], [ -151.037007, 60.793649 ], [ -151.025634, 60.797497 ], [ -151.024799, 60.801787 ], [ -151.012016, 60.809340 ], [ -150.895508, 60.853166 ], [ -150.886964, 60.858187 ], [ -150.883774, 60.861865 ], [ -150.845731, 60.877893 ], [ -150.808418, 60.891336 ], [ -150.770594, 60.911362 ], [ -150.705812, 60.937792 ], [ -150.678438, 60.958267 ], [ -150.603069, 60.974434 ], [ -150.582471, 60.982095 ], [ -150.515058, 60.999443 ], [ -150.511099, 61.005145 ], [ -150.501923, 61.007957 ], [ -150.454661, 61.016566 ], [ -150.431873, 61.023939 ], [ -150.401859, 61.036227 ], [ -150.377171, 61.039144 ], [ -150.353702, 61.031822 ], [ -150.341709, 61.024201 ], [ -150.310334, 60.989547 ], [ -150.286369, 60.966696 ], [ -150.262096, 60.947839 ], [ -150.244072, 60.938585 ], [ -150.217179, 60.930001 ], [ -150.187657, 60.924796 ], [ -150.085166, 60.914020 ], [ -150.070289, 60.913679 ], [ -150.045570, 60.910004 ], [ -150.049148, 60.915816 ], [ -150.047088, 60.918924 ], [ -150.039866, 60.920777 ], [ -149.952655, 60.930393 ], [ -149.912166, 60.937843 ], [ -149.875188, 60.960244 ], [ -149.853693, 60.967395 ], [ -149.835580, 60.968855 ], [ -149.816817, 60.966947 ], [ -149.770264, 60.967607 ], [ -149.753082, 60.962059 ], [ -149.699820, 60.955092 ], [ -149.646520, 60.929394 ], [ -149.628436, 60.927490 ], [ -149.571329, 60.937008 ], [ -149.345756, 60.896082 ], [ -149.252482, 60.897985 ], [ -149.174435, 60.890371 ], [ -149.111617, 60.878949 ], [ -149.062125, 60.860866 ], [ -149.034523, 60.840878 ], [ -149.022150, 60.840878 ], [ -149.018343, 60.848492 ], [ -149.026909, 60.861817 ], [ -149.063076, 60.891323 ], [ -149.192519, 60.939864 ], [ -149.281035, 60.934153 ], [ -149.359081, 60.923683 ], [ -149.380972, 60.941767 ], [ -149.510415, 60.981742 ], [ -149.596076, 60.980790 ], [ -149.751943, 61.024072 ], [ -149.785126, 61.040798 ], [ -149.805816, 61.058641 ], [ -149.831922, 61.076197 ], [ -149.857168, 61.079020 ], [ -149.915666, 61.101428 ], [ -149.960100, 61.115346 ], [ -150.039304, 61.144291 ], [ -150.065646, 61.151079 ], [ -150.075451, 61.156269 ], [ -150.068004, 61.166132 ], [ -150.009941, 61.203637 ], [ -149.976789, 61.202556 ], [ -149.924441, 61.211122 ], [ -149.811179, 61.317722 ], [ -149.765493, 61.331047 ], [ -149.730277, 61.332951 ], [ -149.721711, 61.345324 ], [ -149.721711, 61.369118 ], [ -149.701724, 61.385299 ], [ -149.559908, 61.410997 ], [ -149.429513, 61.447165 ], [ -149.424755, 61.456683 ], [ -149.424755, 61.462393 ], [ -149.431417, 61.468104 ], [ -149.479006, 61.468104 ], [ -149.542776, 61.489995 ], [ -149.628436, 61.485236 ], [ -149.726470, 61.453827 ], [ -149.775963, 61.425274 ], [ -149.808324, 61.395768 ], [ -149.824504, 61.389106 ], [ -149.876852, 61.384347 ], [ -149.908261, 61.327240 ], [ -149.919682, 61.263470 ], [ -149.929200, 61.254904 ], [ -149.985874, 61.237515 ], [ -150.074793, 61.253500 ], [ -150.132634, 61.257915 ], [ -150.204894, 61.259548 ], [ -150.254296, 61.254501 ], [ -150.266124, 61.251237 ], [ -150.273575, 61.251559 ], [ -150.286978, 61.257443 ], [ -150.303688, 61.257467 ], [ -150.303639, 61.255871 ], [ -150.312226, 61.254029 ], [ -150.334576, 61.251301 ], [ -150.394411, 61.249107 ], [ -150.425000, 61.245552 ], [ -150.468812, 61.244627 ], [ -150.484391, 61.247262 ], [ -150.495726, 61.251245 ], [ -150.561670, 61.281487 ], [ -150.590166, 61.281487 ], [ -150.591842, 61.279485 ], [ -150.606961, 61.277732 ], [ -150.628459, 61.284407 ], [ -150.646221, 61.296689 ], [ -150.655804, 61.298173 ], [ -150.662620, 61.295356 ], [ -150.671250, 61.273652 ], [ -150.679902, 61.265888 ], [ -150.690497, 61.259297 ], [ -150.711291, 61.251089 ], [ -150.827295, 61.228390 ], [ -150.842410, 61.224213 ], [ -150.848842, 61.220588 ], [ -150.895905, 61.208915 ], [ -150.926773, 61.206351 ], [ -150.939251, 61.210299 ], [ -150.941944, 61.209947 ], [ -150.946243, 61.208644 ], [ -150.947155, 61.206299 ], [ -150.947425, 61.203140 ], [ -150.951153, 61.198778 ], [ -150.960114, 61.194037 ], [ -150.990086, 61.188907 ], [ -151.012620, 61.183258 ], [ -151.024905, 61.178391 ], [ -151.072775, 61.141669 ], [ -151.078500, 61.133381 ], [ -151.119722, 61.091117 ], [ -151.121692, 61.083574 ], [ -151.127357, 61.076896 ], [ -151.142587, 61.062778 ], [ -151.166606, 61.046404 ], [ -151.190318, 61.042737 ], [ -151.252384, 61.039968 ], [ -151.293622, 61.035715 ], [ -151.307796, 61.031008 ], [ -151.312653, 61.026364 ], [ -151.330920, 61.015124 ], [ -151.349004, 61.010004 ], [ -151.362243, 61.009412 ], [ -151.425120, 61.013107 ], [ -151.467851, 61.012423 ], [ -151.480300, 61.010902 ], [ -151.538227, 60.991835 ], [ -151.573698, 60.975876 ], [ -151.621005, 60.957453 ], [ -151.637346, 60.946727 ], [ -151.641066, 60.942177 ], [ -151.679518, 60.922491 ], [ -151.692644, 60.917743 ], [ -151.713913, 60.916546 ], [ -151.720815, 60.904257 ], [ -151.736015, 60.891507 ], [ -151.783271, 60.868713 ], [ -151.791698, 60.863060 ], [ -151.800264, 60.853672 ], [ -151.796723, 60.838734 ], [ -151.787394, 60.822307 ], [ -151.777310, 60.810461 ], [ -151.751817, 60.788729 ], [ -151.703802, 60.732376 ], [ -151.702833, 60.727778 ], [ -151.705553, 60.718052 ], [ -151.710444, 60.712657 ], [ -151.716379, 60.710415 ], [ -151.744321, 60.712403 ], [ -151.749493, 60.714175 ], [ -151.760301, 60.721441 ], [ -151.784039, 60.726814 ], [ -151.803814, 60.729004 ], [ -151.811286, 60.732222 ], [ -151.822596, 60.742352 ], [ -151.831185, 60.747303 ], [ -151.851967, 60.754074 ], [ -151.860179, 60.753282 ], [ -151.864958, 60.750458 ], [ -151.849634, 60.738286 ], [ -151.847965, 60.735694 ], [ -151.848614, 60.733976 ], [ -151.870471, 60.727284 ], [ -151.916914, 60.717916 ], [ -152.021936, 60.673364 ], [ -152.058104, 60.646714 ], [ -152.099983, 60.594366 ], [ -152.136160, 60.578475 ], [ -152.148434, 60.575977 ], [ -152.163517, 60.576934 ], [ -152.195084, 60.569675 ], [ -152.261497, 60.538237 ], [ -152.309221, 60.506384 ], [ -152.315149, 60.499824 ], [ -152.331365, 60.473525 ], [ -152.333375, 60.460641 ], [ -152.330263, 60.443134 ], [ -152.325821, 60.434806 ], [ -152.312226, 60.420397 ], [ -152.301950, 60.414328 ], [ -152.234199, 60.393888 ], [ -152.300622, 60.369604 ], [ -152.307615, 60.366489 ], [ -152.315855, 60.359071 ], [ -152.352294, 60.356101 ], [ -152.366213, 60.353304 ], [ -152.371475, 60.350176 ], [ -152.376743, 60.345613 ], [ -152.386334, 60.327889 ], [ -152.385979, 60.315845 ], [ -152.392009, 60.302108 ], [ -152.411281, 60.287864 ], [ -152.421130, 60.285331 ], [ -152.444165, 60.285717 ], [ -152.456291, 60.284042 ], [ -152.481794, 60.274681 ], [ -152.528206, 60.251346 ], [ -152.539843, 60.241644 ], [ -152.549236, 60.227631 ], [ -152.556752, 60.224217 ], [ -152.624648, 60.218687 ], [ -152.631980, 60.221073 ], [ -152.642361, 60.228766 ], [ -152.660055, 60.242004 ], [ -152.670403, 60.244320 ], [ -152.698634, 60.240661 ], [ -152.743388, 60.224323 ], [ -152.754884, 60.210910 ], [ -152.754884, 60.202901 ], [ -152.749545, 60.189552 ], [ -152.734251, 60.174801 ], [ -152.699879, 60.165272 ], [ -152.688392, 60.165820 ], [ -152.678085, 60.163504 ], [ -152.674176, 60.151731 ], [ -152.687485, 60.140305 ], [ -152.686373, 60.137717 ], [ -152.658418, 60.121591 ], [ -152.634972, 60.115799 ], [ -152.596784, 60.101071 ], [ -152.575271, 60.082363 ], [ -152.569121, 60.071748 ], [ -152.575153, 60.048260 ], [ -152.590169, 60.035978 ], [ -152.608599, 60.025429 ], [ -152.612721, 60.015115 ], [ -152.611651, 60.008521 ], [ -152.649479, 59.988253 ], [ -152.679402, 59.968054 ], [ -152.693674, 59.932773 ], [ -152.700822, 59.920309 ], [ -152.706431, 59.915284 ], [ -152.745083, 59.904232 ], [ -152.793584, 59.896720 ], [ -152.806934, 59.888029 ], [ -152.810058, 59.878322 ], [ -152.860867, 59.875033 ], [ -152.875167, 59.877471 ], [ -152.882672, 59.881986 ], [ -152.900414, 59.881812 ], [ -152.920417, 59.877741 ], [ -152.950662, 59.876759 ], [ -152.967267, 59.881494 ], [ -153.002521, 59.886726 ], [ -153.019977, 59.886230 ], [ -153.046986, 59.882425 ], [ -153.079187, 59.871103 ], [ -153.144747, 59.859829 ], [ -153.212865, 59.862784 ], [ -153.225937, 59.858343 ], [ -153.228615, 59.853355 ], [ -153.256944, 59.836490 ], [ -153.278808, 59.828066 ], [ -153.285802, 59.820535 ], [ -153.285412, 59.816755 ], [ -153.278535, 59.810924 ], [ -153.257736, 59.810807 ], [ -153.236556, 59.821867 ], [ -153.217481, 59.824721 ], [ -153.197352, 59.824827 ], [ -153.182307, 59.822389 ], [ -153.144372, 59.807616 ], [ -153.113586, 59.815631 ], [ -153.088515, 59.833376 ], [ -153.021945, 59.834133 ], [ -153.009084, 59.830643 ], [ -153.003964, 59.826747 ], [ -152.992126, 59.810027 ], [ -152.994466, 59.791261 ], [ -153.031319, 59.723625 ], [ -153.051559, 59.691562 ], [ -153.108940, 59.678316 ], [ -153.121740, 59.678009 ], [ -153.155019, 59.654344 ], [ -153.214156, 59.634271 ], [ -153.240018, 59.632426 ], [ -153.253408, 59.638415 ], [ -153.262740, 59.643426 ], [ -153.275175, 59.667303 ], [ -153.286525, 59.670251 ], [ -153.301687, 59.668717 ], [ -153.314002, 59.666336 ], [ -153.315123, 59.664896 ], [ -153.315083, 59.662490 ], [ -153.307199, 59.653954 ], [ -153.298205, 59.636345 ], [ -153.298047, 59.632502 ], [ -153.302756, 59.627679 ], [ -153.308837, 59.625706 ], [ -153.342938, 59.621312 ], [ -153.366613, 59.633729 ], [ -153.381595, 59.638032 ], [ -153.392022, 59.638856 ], [ -153.409422, 59.636328 ], [ -153.414898, 59.638600 ], [ -153.418099, 59.642147 ], [ -153.415507, 59.650918 ], [ -153.393849, 59.658847 ], [ -153.384886, 59.667188 ], [ -153.378235, 59.688936 ], [ -153.374778, 59.731587 ], [ -153.439977, 59.784652 ], [ -153.454972, 59.792099 ], [ -153.458549, 59.764467 ], [ -153.449620, 59.743810 ], [ -153.445336, 59.728865 ], [ -153.442219, 59.717420 ], [ -153.441214, 59.701316 ], [ -153.444003, 59.689957 ], [ -153.464556, 59.651712 ], [ -153.476098, 59.642730 ], [ -153.542466, 59.630236 ], [ -153.563866, 59.638903 ], [ -153.586518, 59.651541 ], [ -153.608561, 59.658762 ], [ -153.619030, 59.654955 ], [ -153.621886, 59.639726 ], [ -153.609253, 59.621640 ], [ -153.592193, 59.610842 ], [ -153.558292, 59.605790 ], [ -153.553163, 59.597046 ], [ -153.555148, 59.587858 ], [ -153.577828, 59.555991 ], [ -153.585406, 59.551475 ], [ -153.618151, 59.552571 ], [ -153.635262, 59.555694 ], [ -153.650943, 59.555427 ], [ -153.719309, 59.550264 ], [ -153.761480, 59.543411 ], [ -153.766242, 59.522342 ], [ -153.733853, 59.505754 ], [ -153.706419, 59.477994 ], [ -153.699025, 59.463603 ], [ -153.727546, 59.435346 ], [ -153.747201, 59.429657 ], [ -153.807119, 59.419466 ], [ -153.823384, 59.418035 ], [ -153.862199, 59.424124 ], [ -153.896576, 59.418486 ], [ -153.911268, 59.413732 ], [ -153.925307, 59.405254 ], [ -153.945539, 59.386061 ], [ -153.951389, 59.387017 ], [ -153.954717, 59.392532 ], [ -153.959893, 59.396850 ], [ -153.990003, 59.396777 ], [ -153.993994, 59.394049 ], [ -153.996261, 59.390820 ], [ -153.998506, 59.384723 ], [ -154.007207, 59.382528 ], [ -154.025696, 59.381521 ], [ -154.035965, 59.386362 ], [ -154.044563, 59.388295 ], [ -154.052150, 59.387138 ], [ -154.062453, 59.382753 ], [ -154.087803, 59.367967 ], [ -154.100989, 59.366016 ], [ -154.117672, 59.365508 ], [ -154.121808, 59.360544 ], [ -154.121394, 59.353099 ], [ -154.103014, 59.342719 ], [ -154.016876, 59.353239 ], [ -153.982612, 59.367516 ], [ -153.946444, 59.361805 ], [ -153.947396, 59.358950 ], [ -153.986419, 59.349432 ], [ -154.030807, 59.327040 ], [ -154.077942, 59.313364 ], [ -154.113577, 59.299627 ], [ -154.122681, 59.287622 ], [ -154.136840, 59.262666 ], [ -154.141192, 59.216598 ], [ -154.130585, 59.210503 ], [ -154.172944, 59.172496 ], [ -154.214818, 59.151562 ], [ -154.244220, 59.144161 ], [ -154.260121, 59.143020 ], [ -154.263291, 59.138462 ], [ -154.256528, 59.118462 ], [ -154.251233, 59.111239 ], [ -154.243785, 59.114868 ], [ -154.239842, 59.119324 ], [ -154.227238, 59.125407 ], [ -154.180691, 59.123235 ], [ -154.173669, 59.120200 ], [ -154.166745, 59.100548 ], [ -154.166406, 59.090582 ], [ -154.171502, 59.083423 ], [ -154.195271, 59.069491 ], [ -154.197422, 59.061155 ], [ -154.189580, 59.044207 ], [ -154.171462, 59.021963 ], [ -154.159835, 59.010595 ], [ -154.158207, 59.017853 ], [ -154.132449, 59.024745 ], [ -154.108278, 59.036827 ], [ -154.063489, 59.072140 ], [ -154.031822, 59.073681 ], [ -154.008547, 59.072904 ], [ -153.949958, 59.066782 ], [ -153.932824, 59.062677 ], [ -153.850238, 59.052917 ], [ -153.838180, 59.055296 ], [ -153.815724, 59.064851 ], [ -153.809866, 59.070797 ], [ -153.802782, 59.072224 ], [ -153.793972, 59.071416 ], [ -153.750936, 59.052840 ], [ -153.748680, 59.058729 ], [ -153.746201, 59.065199 ], [ -153.704162, 59.075780 ], [ -153.695664, 59.073994 ], [ -153.648029, 59.028924 ], [ -153.616066, 59.006737 ], [ -153.547283, 58.983716 ], [ -153.523522, 58.979221 ], [ -153.505618, 58.981734 ], [ -153.479939, 58.995286 ], [ -153.463266, 58.986903 ], [ -153.450672, 58.976119 ], [ -153.438144, 58.969911 ], [ -153.422015, 58.970648 ], [ -153.398479, 58.966056 ], [ -153.393101, 58.951097 ], [ -153.388765, 58.945337 ], [ -153.365371, 58.927753 ], [ -153.352283, 58.921705 ], [ -153.334780, 58.920521 ], [ -153.322843, 58.907849 ], [ -153.304788, 58.878919 ], [ -153.305216, 58.874637 ], [ -153.302433, 58.871212 ], [ -153.294726, 58.865432 ], [ -153.286163, 58.863077 ], [ -153.267407, 58.867218 ], [ -153.254798, 58.861756 ], [ -153.252250, 58.855850 ], [ -153.262111, 58.841179 ], [ -153.281147, 58.837372 ], [ -153.314459, 58.840227 ], [ -153.317823, 58.847441 ], [ -153.326138, 58.849320 ], [ -153.336826, 58.848878 ], [ -153.344830, 58.846953 ], [ -153.350964, 58.843551 ], [ -153.358917, 58.836767 ], [ -153.369389, 58.821255 ], [ -153.370730, 58.799301 ], [ -153.385126, 58.766173 ], [ -153.402472, 58.742607 ], [ -153.426641, 58.721127 ], [ -153.445002, 58.709310 ], [ -153.458816, 58.708561 ], [ -153.468963, 58.712234 ], [ -153.477755, 58.712767 ], [ -153.552650, 58.687176 ], [ -153.577544, 58.670532 ], [ -153.587799, 58.651742 ], [ -153.591635, 58.640084 ], [ -153.601257, 58.634633 ], [ -153.677597, 58.611603 ], [ -153.771636, 58.605639 ], [ -153.806232, 58.606595 ], [ -153.832837, 58.611671 ], [ -153.851432, 58.611872 ], [ -153.897155, 58.606237 ], [ -153.902558, 58.597377 ], [ -153.905507, 58.583010 ], [ -153.886482, 58.574679 ], [ -153.911749, 58.552617 ], [ -153.920827, 58.531690 ], [ -153.919134, 58.516659 ], [ -153.909588, 58.514562 ], [ -153.930473, 58.497482 ], [ -153.934852, 58.494414 ], [ -153.960370, 58.487831 ], [ -153.974020, 58.488348 ], [ -153.977617, 58.491931 ], [ -154.001918, 58.492346 ], [ -154.056526, 58.489222 ], [ -154.065121, 58.486430 ], [ -154.073032, 58.478259 ], [ -154.075051, 58.472188 ], [ -154.075235, 58.458106 ], [ -154.073592, 58.446866 ], [ -154.070660, 58.440018 ], [ -154.055759, 58.418782 ], [ -154.040013, 58.404297 ], [ -154.034147, 58.402638 ], [ -154.023713, 58.403952 ], [ -154.007305, 58.402187 ], [ -153.985416, 58.390877 ], [ -153.999323, 58.376372 ], [ -154.097254, 58.345322 ], [ -154.133866, 58.350632 ], [ -154.139223, 58.354108 ], [ -154.150373, 58.357581 ], [ -154.167997, 58.358378 ], [ -154.175194, 58.344527 ], [ -154.177161, 58.321470 ], [ -154.174999, 58.320107 ], [ -154.166648, 58.320569 ], [ -154.149073, 58.314539 ], [ -154.103412, 58.280161 ], [ -154.108241, 58.272173 ], [ -154.150126, 58.266301 ], [ -154.172017, 58.259639 ], [ -154.177728, 58.249169 ], [ -154.152982, 58.234892 ], [ -154.140109, 58.219475 ], [ -154.145277, 58.210931 ], [ -154.177652, 58.189832 ], [ -154.219755, 58.184631 ], [ -154.253871, 58.185400 ], [ -154.263388, 58.175882 ], [ -154.264340, 58.163509 ], [ -154.241874, 58.156328 ], [ -154.216250, 58.142849 ], [ -154.210078, 58.136062 ], [ -154.222465, 58.132566 ], [ -154.269027, 58.128770 ], [ -154.291163, 58.135680 ], [ -154.303363, 58.145425 ], [ -154.320496, 58.144473 ], [ -154.330013, 58.135907 ], [ -154.330013, 58.123534 ], [ -154.317666, 58.111610 ], [ -154.312881, 58.096884 ], [ -154.317640, 58.081655 ], [ -154.337628, 58.082607 ], [ -154.340449, 58.090921 ], [ -154.384327, 58.120823 ], [ -154.426570, 58.144901 ], [ -154.436518, 58.148294 ], [ -154.460121, 58.146067 ], [ -154.466436, 58.142328 ], [ -154.459389, 58.129089 ], [ -154.452096, 58.121582 ], [ -154.449212, 58.093218 ], [ -154.463263, 58.081655 ], [ -154.508949, 58.080703 ], [ -154.533695, 58.074993 ], [ -154.539367, 58.055887 ], [ -154.568627, 58.025787 ], [ -154.581547, 58.019285 ], [ -154.643965, 58.033147 ], [ -154.650618, 58.045387 ], [ -154.644666, 58.056433 ], [ -154.646223, 58.060141 ], [ -154.653383, 58.064037 ], [ -154.668895, 58.065272 ], [ -154.676108, 58.065114 ], [ -154.716162, 58.055256 ], [ -154.721884, 58.050544 ], [ -154.728980, 58.038455 ], [ -154.731059, 58.028454 ], [ -154.730726, 58.021837 ], [ -154.745581, 58.012220 ], [ -154.765287, 58.003710 ], [ -154.774719, 58.002168 ], [ -154.807767, 58.000939 ], [ -154.819518, 58.003494 ], [ -154.823518, 58.009348 ], [ -154.825051, 58.016586 ], [ -154.828230, 58.018849 ], [ -154.876559, 58.027722 ], [ -154.891812, 58.027676 ], [ -154.990431, 58.013424 ], [ -155.026275, 57.999302 ], [ -155.028623, 57.971248 ], [ -155.044803, 57.950309 ], [ -155.067646, 57.951261 ], [ -155.109264, 57.944274 ], [ -155.106946, 57.934942 ], [ -155.072566, 57.911968 ], [ -155.064199, 57.909294 ], [ -155.061806, 57.904330 ], [ -155.068148, 57.883773 ], [ -155.082139, 57.872248 ], [ -155.097095, 57.865356 ], [ -155.152420, 57.855375 ], [ -155.237933, 57.827131 ], [ -155.272917, 57.823981 ], [ -155.298385, 57.826020 ], [ -155.303044, 57.828454 ], [ -155.326369, 57.830545 ], [ -155.338153, 57.825384 ], [ -155.341235, 57.819644 ], [ -155.334944, 57.780692 ], [ -155.310981, 57.764811 ], [ -155.302789, 57.761658 ], [ -155.285339, 57.758726 ], [ -155.284691, 57.757388 ], [ -155.291651, 57.735809 ], [ -155.305814, 57.724050 ], [ -155.378610, 57.710766 ], [ -155.392781, 57.716119 ], [ -155.397916, 57.736157 ], [ -155.418855, 57.747579 ], [ -155.468287, 57.744637 ], [ -155.506533, 57.760970 ], [ -155.533627, 57.776880 ], [ -155.539766, 57.783942 ], [ -155.545676, 57.786769 ], [ -155.568437, 57.789511 ], [ -155.585411, 57.786981 ], [ -155.596857, 57.783539 ], [ -155.609353, 57.777699 ], [ -155.617188, 57.769715 ], [ -155.635323, 57.715441 ], [ -155.634543, 57.704764 ], [ -155.626373, 57.693623 ], [ -155.615203, 57.688074 ], [ -155.583513, 57.688568 ], [ -155.577803, 57.680954 ], [ -155.580658, 57.672388 ], [ -155.593031, 57.660015 ], [ -155.629912, 57.656376 ], [ -155.699986, 57.642085 ], [ -155.724167, 57.633445 ], [ -155.735509, 57.594149 ], [ -155.730951, 57.588562 ], [ -155.731412, 57.555546 ], [ -155.732779, 57.549732 ], [ -155.786939, 57.547007 ], [ -155.877856, 57.547173 ], [ -155.915261, 57.535331 ], [ -155.945812, 57.539249 ], [ -155.967890, 57.544429 ], [ -155.985988, 57.553721 ], [ -155.988113, 57.558328 ], [ -156.010818, 57.571379 ], [ -156.033806, 57.569883 ], [ -156.044031, 57.564455 ], [ -156.031804, 57.534379 ], [ -156.029900, 57.524861 ], [ -156.047585, 57.514756 ], [ -156.048584, 57.500808 ], [ -156.045324, 57.487037 ], [ -156.036722, 57.470941 ], [ -156.014396, 57.455285 ], [ -156.012841, 57.451394 ], [ -156.021875, 57.439660 ], [ -156.091668, 57.439829 ], [ -156.099067, 57.443691 ], [ -156.137480, 57.471734 ], [ -156.183932, 57.482112 ], [ -156.195740, 57.480059 ], [ -156.210883, 57.474409 ], [ -156.211485, 57.459475 ], [ -156.220105, 57.445295 ], [ -156.226886, 57.440667 ], [ -156.254462, 57.438961 ], [ -156.339425, 57.417641 ], [ -156.362039, 57.400474 ], [ -156.377439, 57.390865 ], [ -156.481632, 57.338705 ], [ -156.511412, 57.335020 ], [ -156.533544, 57.328527 ], [ -156.539718, 57.320059 ], [ -156.551239, 57.290800 ], [ -156.538684, 57.283041 ], [ -156.507301, 57.281164 ], [ -156.420864, 57.311142 ], [ -156.336427, 57.336081 ], [ -156.321910, 57.293369 ], [ -156.332718, 57.265192 ], [ -156.342943, 57.248056 ], [ -156.358139, 57.252188 ], [ -156.376507, 57.252284 ], [ -156.399423, 57.241627 ], [ -156.401488, 57.233169 ], [ -156.398751, 57.214756 ], [ -156.388592, 57.206620 ], [ -156.355756, 57.192844 ], [ -156.341300, 57.191857 ], [ -156.338430, 57.190325 ], [ -156.334404, 57.182300 ], [ -156.357358, 57.157570 ], [ -156.368524, 57.149986 ], [ -156.435110, 57.127430 ], [ -156.456497, 57.106041 ], [ -156.444610, 57.100087 ], [ -156.441566, 57.094698 ], [ -156.441599, 57.085158 ], [ -156.509239, 57.054911 ], [ -156.535587, 57.047905 ], [ -156.562827, 57.020314 ], [ -156.547667, 57.004629 ], [ -156.547200, 56.986488 ], [ -156.550520, 56.984610 ], [ -156.555077, 56.983550 ], [ -156.637840, 56.993905 ], [ -156.659306, 56.993408 ], [ -156.676162, 57.002332 ], [ -156.703764, 57.031837 ], [ -156.726607, 57.036596 ], [ -156.749449, 57.032789 ], [ -156.758967, 57.025174 ], [ -156.759919, 57.009946 ], [ -156.752305, 57.001380 ], [ -156.753642, 56.991225 ], [ -156.762718, 56.986342 ], [ -156.781421, 56.971879 ], [ -156.786900, 56.965035 ], [ -156.788341, 56.960693 ], [ -156.786802, 56.941443 ], [ -156.797310, 56.911717 ], [ -156.804432, 56.905881 ], [ -156.825982, 56.897667 ], [ -156.839322, 56.901854 ], [ -156.876316, 56.942828 ], [ -156.885372, 56.953284 ], [ -156.885686, 56.957965 ], [ -156.882464, 56.960072 ], [ -156.882893, 56.962582 ], [ -156.886307, 56.964869 ], [ -156.893683, 56.965965 ], [ -156.909725, 56.965581 ], [ -156.918796, 56.963583 ], [ -156.935692, 56.954873 ], [ -156.935629, 56.920087 ], [ -156.986171, 56.911131 ], [ -157.005950, 56.904220 ], [ -157.015665, 56.898486 ], [ -157.034624, 56.884487 ], [ -157.073453, 56.838345 ], [ -157.159494, 56.833477 ], [ -157.163811, 56.826066 ], [ -157.163272, 56.823542 ], [ -157.140990, 56.802275 ], [ -157.140277, 56.790874 ], [ -157.161372, 56.774134 ], [ -157.183636, 56.769079 ], [ -157.201724, 56.767511 ], [ -157.283764, 56.800766 ], [ -157.290511, 56.804713 ], [ -157.291231, 56.811077 ], [ -157.298283, 56.818567 ], [ -157.332735, 56.838398 ], [ -157.378771, 56.861696 ], [ -157.394663, 56.864426 ], [ -157.405679, 56.864216 ], [ -157.436932, 56.858522 ], [ -157.457590, 56.848204 ], [ -157.472407, 56.833356 ], [ -157.469925, 56.824889 ], [ -157.462361, 56.809603 ], [ -157.457622, 56.804291 ], [ -157.447768, 56.801246 ], [ -157.436358, 56.803781 ], [ -157.421120, 56.801691 ], [ -157.418560, 56.799821 ], [ -157.411488, 56.778351 ], [ -157.413440, 56.769185 ], [ -157.517478, 56.760839 ], [ -157.530765, 56.753775 ], [ -157.544855, 56.738945 ], [ -157.551196, 56.730314 ], [ -157.563802, 56.703426 ], [ -157.550792, 56.681029 ], [ -157.542295, 56.675320 ], [ -157.507589, 56.667169 ], [ -157.498689, 56.667285 ], [ -157.480990, 56.671419 ], [ -157.479153, 56.670080 ], [ -157.452160, 56.643220 ], [ -157.452196, 56.638863 ], [ -157.454860, 56.634748 ], [ -157.462105, 56.625685 ], [ -157.466497, 56.623266 ], [ -157.496523, 56.616897 ], [ -157.536486, 56.615317 ], [ -157.546085, 56.619025 ], [ -157.589315, 56.622262 ], [ -157.605231, 56.621315 ], [ -157.615041, 56.620020 ], [ -157.636018, 56.612838 ], [ -157.674587, 56.609507 ], [ -157.705382, 56.628780 ], [ -157.714280, 56.640575 ], [ -157.715998, 56.648492 ], [ -157.719048, 56.653084 ], [ -157.736799, 56.675616 ], [ -157.754141, 56.679468 ], [ -157.763698, 56.679247 ], [ -157.786513, 56.676239 ], [ -157.846637, 56.644719 ], [ -157.908503, 56.644719 ], [ -157.948954, 56.630442 ], [ -157.979887, 56.599509 ], [ -158.000112, 56.603078 ], [ -158.032379, 56.601900 ], [ -158.042011, 56.596744 ], [ -158.103619, 56.566197 ], [ -158.123844, 56.550730 ], [ -158.129793, 56.537643 ], [ -158.123844, 56.532884 ], [ -157.913262, 56.573335 ], [ -157.838420, 56.560760 ], [ -157.828139, 56.546332 ], [ -157.817826, 56.514210 ], [ -157.823072, 56.501982 ], [ -157.859766, 56.483668 ], [ -157.860914, 56.475777 ], [ -157.890657, 56.475777 ], [ -157.964420, 56.491244 ], [ -158.027621, 56.511779 ], [ -158.110789, 56.517007 ], [ -158.129349, 56.516294 ], [ -158.136487, 56.510583 ], [ -158.131729, 56.501944 ], [ -158.123352, 56.496457 ], [ -158.113709, 56.493001 ], [ -158.111603, 56.490110 ], [ -158.118682, 56.466558 ], [ -158.127440, 56.460805 ], [ -158.246144, 56.466124 ], [ -158.284699, 56.481089 ], [ -158.328798, 56.484208 ], [ -158.402954, 56.455193 ], [ -158.498837, 56.380110 ], [ -158.501705, 56.375860 ], [ -158.502040, 56.365178 ], [ -158.489546, 56.341865 ], [ -158.432795, 56.343505 ], [ -158.397337, 56.328921 ], [ -158.338137, 56.323923 ], [ -158.329735, 56.326028 ], [ -158.322563, 56.325242 ], [ -158.207387, 56.294354 ], [ -158.203083, 56.283833 ], [ -158.216540, 56.269451 ], [ -158.253331, 56.253125 ], [ -158.276842, 56.248698 ], [ -158.334506, 56.232940 ], [ -158.341331, 56.224699 ], [ -158.339765, 56.217807 ], [ -158.331039, 56.213609 ], [ -158.297149, 56.210799 ], [ -158.280766, 56.197395 ], [ -158.252470, 56.199381 ], [ -158.190960, 56.226407 ], [ -158.174930, 56.236227 ], [ -158.119493, 56.241995 ], [ -158.115282, 56.242102 ], [ -158.112718, 56.240286 ], [ -158.117797, 56.230742 ], [ -158.237025, 56.187387 ], [ -158.314128, 56.163697 ], [ -158.339759, 56.151274 ], [ -158.338304, 56.131315 ], [ -158.350761, 56.124996 ], [ -158.374324, 56.134522 ], [ -158.382849, 56.153717 ], [ -158.387607, 56.158476 ], [ -158.400932, 56.155621 ], [ -158.405691, 56.117549 ], [ -158.394388, 56.091949 ], [ -158.394922, 56.064721 ], [ -158.398324, 56.062957 ], [ -158.424451, 56.068899 ], [ -158.438644, 56.093672 ], [ -158.438315, 56.095702 ], [ -158.439944, 56.107780 ], [ -158.455297, 56.108742 ], [ -158.461810, 56.106644 ], [ -158.475258, 56.093405 ], [ -158.472706, 56.087583 ], [ -158.448413, 56.055278 ], [ -158.417889, 56.036796 ], [ -158.407723, 56.014521 ], [ -158.413645, 56.004951 ], [ -158.431471, 55.994452 ], [ -158.439330, 55.993620 ], [ -158.445696, 55.997580 ], [ -158.467335, 56.027219 ], [ -158.475543, 56.028366 ], [ -158.501967, 56.025170 ], [ -158.504850, 56.015544 ], [ -158.496366, 56.010601 ], [ -158.494015, 56.007320 ], [ -158.495114, 55.989207 ], [ -158.499050, 55.981685 ], [ -158.509840, 55.979617 ], [ -158.595620, 56.045252 ], [ -158.598367, 56.048822 ], [ -158.594188, 56.110445 ], [ -158.584362, 56.115657 ], [ -158.574659, 56.118640 ], [ -158.575042, 56.121129 ], [ -158.553218, 56.144199 ], [ -158.555122, 56.150862 ], [ -158.560832, 56.153717 ], [ -158.572254, 56.151813 ], [ -158.600405, 56.130444 ], [ -158.628303, 56.120943 ], [ -158.640447, 56.114079 ], [ -158.659738, 56.098553 ], [ -158.666818, 56.078415 ], [ -158.660914, 56.034928 ], [ -158.651674, 56.031358 ], [ -158.643216, 56.023415 ], [ -158.638704, 56.015932 ], [ -158.636689, 56.005007 ], [ -158.639497, 55.986070 ], [ -158.653214, 55.958615 ], [ -158.673246, 55.951485 ], [ -158.737009, 55.953313 ], [ -158.748560, 55.959365 ], [ -158.751215, 55.963759 ], [ -158.735348, 55.996208 ], [ -158.729567, 56.002854 ], [ -158.747305, 56.009908 ], [ -158.768861, 56.008583 ], [ -158.774984, 55.991914 ], [ -158.792116, 55.983348 ], [ -158.809248, 55.986203 ], [ -158.827232, 56.004996 ], [ -158.838785, 56.008279 ], [ -158.854132, 56.003343 ], [ -158.898116, 55.951041 ], [ -158.909396, 55.934887 ], [ -158.999598, 55.927011 ], [ -159.006267, 55.910060 ], [ -159.003412, 55.896735 ], [ -159.008171, 55.890073 ], [ -159.033869, 55.891976 ], [ -159.062025, 55.919074 ], [ -159.159183, 55.906455 ], [ -159.170926, 55.891025 ], [ -159.206312, 55.899846 ], [ -159.280554, 55.889173 ], [ -159.284188, 55.871037 ], [ -159.313694, 55.857712 ], [ -159.321308, 55.860567 ], [ -159.319404, 55.871037 ], [ -159.334002, 55.880119 ], [ -159.347681, 55.877802 ], [ -159.374842, 55.871522 ], [ -159.396400, 55.856767 ], [ -159.400096, 55.852357 ], [ -159.406126, 55.831956 ], [ -159.409380, 55.810434 ], [ -159.404326, 55.796992 ], [ -159.411505, 55.788911 ], [ -159.423468, 55.789025 ], [ -159.434787, 55.792909 ], [ -159.470216, 55.828911 ], [ -159.472801, 55.839050 ], [ -159.471973, 55.843506 ], [ -159.465282, 55.852845 ], [ -159.453945, 55.896820 ], [ -159.482226, 55.901826 ], [ -159.493883, 55.900109 ], [ -159.528349, 55.888458 ], [ -159.534415, 55.881299 ], [ -159.498022, 55.855299 ], [ -159.494404, 55.765798 ], [ -159.503768, 55.747878 ], [ -159.521589, 55.736021 ], [ -159.537152, 55.728459 ], [ -159.551432, 55.711543 ], [ -159.552016, 55.704794 ], [ -159.535961, 55.689831 ], [ -159.530117, 55.665394 ], [ -159.545115, 55.646517 ], [ -159.617770, 55.595798 ], [ -159.696713, 55.573306 ], [ -159.729333, 55.569650 ], [ -159.733899, 55.569985 ], [ -159.744495, 55.600018 ], [ -159.743282, 55.603624 ], [ -159.735196, 55.610933 ], [ -159.724150, 55.614549 ], [ -159.673432, 55.617350 ], [ -159.667511, 55.614825 ], [ -159.639619, 55.617915 ], [ -159.626772, 55.629412 ], [ -159.635866, 55.644398 ], [ -159.644656, 55.652469 ], [ -159.696224, 55.655524 ], [ -159.695272, 55.665993 ], [ -159.680635, 55.681340 ], [ -159.659104, 55.701209 ], [ -159.676761, 55.737357 ], [ -159.673191, 55.750961 ], [ -159.627482, 55.803248 ], [ -159.624884, 55.804694 ], [ -159.602148, 55.805004 ], [ -159.607973, 55.812900 ], [ -159.643739, 55.830424 ], [ -159.712816, 55.846392 ], [ -159.811070, 55.856570 ], [ -159.838981, 55.852412 ], [ -159.853255, 55.847162 ], [ -159.858456, 55.841793 ], [ -159.850750, 55.824076 ], [ -159.847359, 55.802530 ], [ -159.862484, 55.787629 ], [ -159.875994, 55.784608 ], [ -159.892319, 55.785096 ], [ -159.937089, 55.803306 ], [ -159.947646, 55.814590 ], [ -159.955260, 55.814590 ], [ -159.960971, 55.809831 ], [ -159.961184, 55.801260 ], [ -159.966682, 55.776518 ], [ -159.971441, 55.776518 ], [ -159.999860, 55.797975 ], [ -160.010322, 55.797087 ], [ -160.026282, 55.792295 ], [ -160.048711, 55.772061 ], [ -160.052525, 55.766430 ], [ -160.051945, 55.760594 ], [ -160.049417, 55.757588 ], [ -160.036162, 55.756531 ], [ -160.015223, 55.734640 ], [ -160.017126, 55.721315 ], [ -160.040921, 55.719411 ], [ -160.078992, 55.724170 ], [ -160.085655, 55.719411 ], [ -160.078992, 55.710845 ], [ -160.062812, 55.704183 ], [ -160.064715, 55.698472 ], [ -160.106594, 55.705135 ], [ -160.117064, 55.716556 ], [ -160.124678, 55.714652 ], [ -160.134196, 55.706086 ], [ -160.130445, 55.681419 ], [ -160.125630, 55.669919 ], [ -160.128485, 55.662304 ], [ -160.158013, 55.663098 ], [ -160.185712, 55.658644 ], [ -160.279827, 55.641384 ], [ -160.325419, 55.644207 ], [ -160.353494, 55.649731 ], [ -160.410823, 55.665380 ], [ -160.416452, 55.665302 ], [ -160.421853, 55.662701 ], [ -160.429727, 55.658046 ], [ -160.433602, 55.648975 ], [ -160.433022, 55.639979 ], [ -160.396888, 55.629944 ], [ -160.355010, 55.610908 ], [ -160.356913, 55.606149 ], [ -160.370238, 55.602342 ], [ -160.392587, 55.602771 ], [ -160.435859, 55.573692 ], [ -160.448277, 55.559049 ], [ -160.464301, 55.533243 ], [ -160.465186, 55.527361 ], [ -160.459815, 55.514986 ], [ -160.462745, 55.506654 ], [ -160.481633, 55.489068 ], [ -160.501346, 55.478518 ], [ -160.521335, 55.474420 ], [ -160.536654, 55.474938 ], [ -160.544224, 55.502351 ], [ -160.554173, 55.522965 ], [ -160.580083, 55.564385 ], [ -160.595771, 55.575540 ], [ -160.615305, 55.575516 ], [ -160.638371, 55.557426 ], [ -160.652775, 55.548668 ], [ -160.666966, 55.544417 ], [ -160.706883, 55.556066 ], [ -160.737095, 55.555448 ], [ -160.751040, 55.552907 ], [ -160.766237, 55.547559 ], [ -160.772950, 55.538998 ], [ -160.771433, 55.529430 ], [ -160.732150, 55.523596 ], [ -160.660117, 55.518475 ], [ -160.654117, 55.512596 ], [ -160.647464, 55.500862 ], [ -160.646304, 55.492851 ], [ -160.651523, 55.474174 ], [ -160.666917, 55.459776 ], [ -160.781401, 55.451780 ], [ -160.795988, 55.454946 ], [ -160.836725, 55.473135 ], [ -160.843407, 55.489782 ], [ -160.836023, 55.497259 ], [ -160.821773, 55.506216 ], [ -160.820810, 55.507974 ], [ -160.828273, 55.516111 ], [ -160.849145, 55.523916 ], [ -160.865380, 55.526968 ], [ -160.909625, 55.524140 ], [ -160.922934, 55.519300 ], [ -160.944265, 55.507825 ], [ -160.976551, 55.472736 ], [ -160.979298, 55.466274 ], [ -160.977376, 55.461185 ], [ -160.982717, 55.454326 ], [ -160.997335, 55.440265 ], [ -161.013662, 55.431002 ], [ -161.231535, 55.357452 ], [ -161.280675, 55.354038 ], [ -161.325325, 55.359855 ], [ -161.317545, 55.362758 ], [ -161.311989, 55.372836 ], [ -161.314949, 55.379231 ], [ -161.346080, 55.385782 ], [ -161.364577, 55.384194 ], [ -161.445196, 55.368103 ], [ -161.460392, 55.359070 ], [ -161.486114, 55.359322 ], [ -161.507657, 55.362786 ], [ -161.514211, 55.385254 ], [ -161.509306, 55.390626 ], [ -161.496123, 55.396967 ], [ -161.484588, 55.417994 ], [ -161.478303, 55.440600 ], [ -161.471468, 55.478588 ], [ -161.477114, 55.485195 ], [ -161.469271, 55.496830 ], [ -161.376102, 55.569794 ], [ -161.367405, 55.579484 ], [ -161.355686, 55.606378 ], [ -161.357670, 55.612603 ], [ -161.363378, 55.618478 ], [ -161.392613, 55.628221 ], [ -161.416235, 55.632324 ], [ -161.482064, 55.633979 ], [ -161.526162, 55.630498 ], [ -161.587047, 55.620060 ], [ -161.602825, 55.613811 ], [ -161.612926, 55.606158 ], [ -161.698860, 55.519400 ], [ -161.700069, 55.514390 ], [ -161.696719, 55.423307 ], [ -161.688357, 55.416380 ], [ -161.686495, 55.408041 ], [ -161.720096, 55.376690 ], [ -161.827543, 55.287872 ], [ -161.833891, 55.284400 ], [ -161.845473, 55.281249 ], [ -161.853418, 55.277634 ], [ -161.863339, 55.266989 ], [ -161.875606, 55.249921 ], [ -161.879542, 55.240804 ], [ -161.875759, 55.232592 ], [ -161.875238, 55.227224 ], [ -161.878076, 55.223599 ], [ -161.903407, 55.204941 ], [ -161.919519, 55.208209 ], [ -161.957455, 55.227999 ], [ -161.978788, 55.236131 ], [ -162.029636, 55.239492 ], [ -162.041236, 55.236806 ], [ -162.045694, 55.232775 ], [ -162.046242, 55.225605 ], [ -162.001711, 55.169236 ], [ -161.966974, 55.154831 ], [ -161.949882, 55.126686 ], [ -161.956595, 55.112174 ], [ -161.960866, 55.106734 ], [ -162.053281, 55.074212 ], [ -162.118740, 55.102911 ], [ -162.131878, 55.122776 ], [ -162.119033, 55.141116 ], [ -162.126369, 55.153408 ], [ -162.141084, 55.157339 ], [ -162.177427, 55.154403 ], [ -162.218192, 55.118903 ], [ -162.224047, 55.108658 ], [ -162.223528, 55.102211 ], [ -162.206800, 55.082391 ], [ -162.190348, 55.066981 ], [ -162.189247, 55.060260 ], [ -162.219326, 55.028975 ], [ -162.247946, 55.020439 ], [ -162.253500, 55.020454 ], [ -162.267754, 55.021553 ], [ -162.280512, 55.026207 ], [ -162.292511, 55.033429 ], [ -162.299619, 55.040152 ], [ -162.300378, 55.042927 ], [ -162.361969, 55.042679 ], [ -162.413510, 55.036560 ], [ -162.471364, 55.051932 ], [ -162.489735, 55.064849 ], [ -162.512104, 55.086227 ], [ -162.521688, 55.104011 ], [ -162.520986, 55.115417 ], [ -162.506887, 55.118927 ], [ -162.460958, 55.125840 ], [ -162.453451, 55.123948 ], [ -162.442556, 55.118226 ], [ -162.437368, 55.112122 ], [ -162.424796, 55.104813 ], [ -162.416800, 55.104096 ], [ -162.410574, 55.105614 ], [ -162.406191, 55.120498 ], [ -162.445182, 55.151521 ], [ -162.480980, 55.161271 ], [ -162.494470, 55.183915 ], [ -162.497920, 55.199052 ], [ -162.499019, 55.213770 ], [ -162.510435, 55.250177 ], [ -162.576523, 55.269708 ], [ -162.627920, 55.275419 ], [ -162.624112, 55.281129 ], [ -162.586041, 55.280178 ], [ -162.581282, 55.286840 ], [ -162.584872, 55.298386 ], [ -162.626101, 55.304085 ], [ -162.649173, 55.299118 ], [ -162.661960, 55.294295 ], [ -162.682405, 55.276450 ], [ -162.702851, 55.252775 ], [ -162.714607, 55.231611 ], [ -162.718077, 55.219911 ], [ -162.711128, 55.211267 ], [ -162.692309, 55.197313 ], [ -162.668346, 55.193445 ], [ -162.644734, 55.197115 ], [ -162.638791, 55.194770 ], [ -162.614497, 55.174735 ], [ -162.579765, 55.136939 ], [ -162.582908, 55.130240 ], [ -162.585533, 55.128600 ], [ -162.595603, 55.124846 ], [ -162.604454, 55.126028 ], [ -162.618918, 55.097096 ], [ -162.599812, 55.054806 ], [ -162.569292, 55.015874 ], [ -162.569289, 54.971240 ], [ -162.553680, 54.964185 ], [ -162.552729, 54.959426 ], [ -162.559391, 54.954667 ], [ -162.584138, 54.961330 ], [ -162.587967, 54.972010 ], [ -162.615159, 54.987841 ], [ -162.646472, 54.997163 ], [ -162.688131, 54.996126 ], [ -162.707083, 54.991159 ], [ -162.716177, 54.986679 ], [ -162.720404, 54.980223 ], [ -162.707203, 54.972023 ], [ -162.705096, 54.966010 ], [ -162.708453, 54.958480 ], [ -162.770983, 54.932736 ], [ -162.834245, 54.926851 ], [ -162.845475, 54.926989 ], [ -162.881639, 54.934785 ], [ -162.913684, 54.950273 ], [ -162.970632, 55.001039 ], [ -162.965872, 55.017374 ], [ -162.958975, 55.020151 ], [ -162.957826, 55.031826 ], [ -162.964897, 55.042201 ], [ -163.001550, 55.080043 ], [ -163.051631, 55.103267 ], [ -163.071468, 55.110477 ], [ -163.079006, 55.111652 ], [ -163.111507, 55.109705 ], [ -163.165036, 55.099214 ], [ -163.188428, 55.090903 ], [ -163.213009, 55.066742 ], [ -163.225092, 55.049683 ], [ -163.226313, 55.042694 ], [ -163.219018, 55.030281 ], [ -163.213281, 55.026138 ], [ -163.189447, 55.016678 ], [ -163.174830, 55.013100 ], [ -163.148615, 55.014023 ], [ -163.067008, 54.979302 ], [ -163.050467, 54.969071 ], [ -163.036062, 54.942544 ], [ -163.065602, 54.926172 ], [ -163.149580, 54.885906 ], [ -163.214398, 54.847487 ], [ -163.299809, 54.829232 ], [ -163.352997, 54.810174 ], [ -163.373207, 54.800841 ], [ -163.372806, 54.790936 ], [ -163.342655, 54.765104 ], [ -163.322849, 54.750280 ], [ -163.228391, 54.753513 ], [ -163.219765, 54.755072 ], [ -163.188853, 54.773717 ], [ -163.184295, 54.774912 ], [ -163.144089, 54.761499 ], [ -163.098332, 54.724568 ], [ -163.094294, 54.696734 ], [ -163.089535, 54.689120 ], [ -163.057228, 54.688101 ], [ -163.050970, 54.672263 ], [ -163.059085, 54.661072 ], [ -163.096744, 54.661597 ], [ -163.125738, 54.668180 ], [ -163.159956, 54.665146 ], [ -163.156061, 54.675476 ], [ -163.132339, 54.679765 ], [ -163.140925, 54.694829 ], [ -163.185401, 54.700398 ], [ -163.194952, 54.699025 ], [ -163.208774, 54.693136 ], [ -163.210412, 54.679602 ], [ -163.226888, 54.673631 ], [ -163.228409, 54.693746 ], [ -163.280633, 54.695367 ], [ -163.317996, 54.719938 ], [ -163.327457, 54.743414 ], [ -163.331516, 54.747518 ], [ -163.344791, 54.751211 ], [ -163.364626, 54.749464 ], [ -163.380618, 54.746176 ], [ -163.391970, 54.741980 ], [ -163.423067, 54.720426 ], [ -163.428377, 54.714819 ], [ -163.425477, 54.710081 ], [ -163.415045, 54.704348 ], [ -163.410286, 54.680553 ], [ -163.421708, 54.657711 ], [ -163.439361, 54.655928 ], [ -163.472016, 54.656468 ], [ -163.488861, 54.655110 ], [ -163.572383, 54.623211 ], [ -163.581481, 54.616863 ], [ -163.585967, 54.611644 ], [ -163.670838, 54.627825 ], [ -163.747316, 54.635011 ], [ -163.803590, 54.636498 ], [ -163.861206, 54.632911 ], [ -163.952391, 54.630461 ], [ -163.966307, 54.631681 ], [ -164.084894, 54.620131 ], [ -164.179617, 54.599188 ], [ -164.232470, 54.585494 ], [ -164.257585, 54.572722 ], [ -164.331404, 54.530431 ], [ -164.337538, 54.524259 ], [ -164.341474, 54.495266 ], [ -164.336042, 54.484509 ], [ -164.336530, 54.480977 ], [ -164.352704, 54.465023 ], [ -164.416820, 54.431713 ], [ -164.456554, 54.419856 ], [ -164.499034, 54.414225 ], [ -164.519970, 54.414652 ], [ -164.582778, 54.405702 ], [ -164.601607, 54.402451 ], [ -164.640457, 54.391166 ], [ -164.743977, 54.394216 ], [ -164.789357, 54.402012 ], [ -164.844931, 54.417583 ], [ -164.876075, 54.443495 ], [ -164.877373, 54.449908 ], [ -164.904077, 54.499195 ], [ -164.910059, 54.507542 ], [ -164.936122, 54.521253 ], [ -164.944636, 54.532903 ], [ -164.949781, 54.575697 ], [ -164.948789, 54.579877 ], [ -164.932187, 54.598745 ], [ -164.918760, 54.605306 ], [ -164.831936, 54.629028 ], [ -164.761347, 54.640634 ], [ -164.741815, 54.645441 ], [ -164.727654, 54.650957 ], [ -164.709465, 54.661518 ], [ -164.629661, 54.756031 ], [ -164.576896, 54.824564 ], [ -164.561546, 54.850835 ], [ -164.564050, 54.875539 ], [ -164.550256, 54.888785 ], [ -164.486780, 54.922441 ], [ -164.435280, 54.933126 ], [ -164.427303, 54.932849 ], [ -164.373441, 54.915349 ], [ -164.361631, 54.907391 ], [ -164.353330, 54.898327 ], [ -164.343534, 54.894139 ], [ -164.295033, 54.902122 ], [ -164.207070, 54.927578 ], [ -164.204897, 54.931240 ], [ -164.164342, 54.953532 ], [ -164.119196, 54.969416 ], [ -164.109333, 54.963999 ], [ -164.086798, 54.963396 ], [ -164.061164, 54.964708 ], [ -164.030708, 54.969818 ], [ -163.994179, 54.983315 ], [ -163.964730, 54.997337 ], [ -163.930369, 55.017646 ], [ -163.909222, 55.032089 ], [ -163.894695, 55.039115 ], [ -163.884869, 55.039909 ], [ -163.872144, 55.037399 ], [ -163.854260, 55.037796 ], [ -163.815779, 55.044625 ], [ -163.790733, 55.052583 ], [ -163.774093, 55.055780 ], [ -163.740737, 55.048266 ], [ -163.646834, 55.044467 ], [ -163.568159, 55.049145 ], [ -163.532962, 55.048881 ], [ -163.527109, 55.040871 ], [ -163.534638, 55.025305 ], [ -163.530087, 55.016660 ], [ -163.461500, 54.982511 ], [ -163.442854, 54.969875 ], [ -163.429548, 54.954759 ], [ -163.418042, 54.938499 ], [ -163.398294, 54.902371 ], [ -163.399292, 54.894012 ], [ -163.408027, 54.884580 ], [ -163.415872, 54.859652 ], [ -163.414691, 54.856090 ], [ -163.410594, 54.854576 ], [ -163.391397, 54.855331 ], [ -163.334234, 54.872948 ], [ -163.318885, 54.880120 ], [ -163.319161, 54.899026 ], [ -163.319956, 54.903085 ], [ -163.336739, 54.917490 ], [ -163.344402, 54.919333 ], [ -163.347730, 54.925093 ], [ -163.343735, 54.950416 ], [ -163.338395, 54.956191 ], [ -163.323106, 54.959929 ], [ -163.314592, 54.958862 ], [ -163.290908, 54.945977 ], [ -163.279586, 54.944849 ], [ -163.256982, 54.950412 ], [ -163.291622, 54.966210 ], [ -163.293526, 54.973824 ], [ -163.284009, 54.999263 ], [ -163.284008, 55.047112 ], [ -163.300271, 55.066592 ], [ -163.311587, 55.081122 ], [ -163.302054, 55.117859 ], [ -163.205962, 55.158470 ], [ -163.105011, 55.183979 ], [ -163.081634, 55.180409 ], [ -163.080719, 55.176861 ], [ -163.070494, 55.174114 ], [ -163.032256, 55.172147 ], [ -162.957182, 55.171271 ], [ -162.882292, 55.183251 ], [ -162.861520, 55.198339 ], [ -162.840140, 55.224043 ], [ -162.843172, 55.242564 ], [ -162.851839, 55.247317 ], [ -162.856600, 55.248721 ], [ -162.869478, 55.248086 ], [ -162.880892, 55.239564 ], [ -162.894020, 55.243046 ], [ -162.900454, 55.246416 ], [ -162.901644, 55.247652 ], [ -162.900027, 55.252466 ], [ -162.888118, 55.270424 ], [ -162.881779, 55.273776 ], [ -162.750371, 55.307623 ], [ -162.731816, 55.307829 ], [ -162.704747, 55.320296 ], [ -162.680487, 55.337004 ], [ -162.649910, 55.364151 ], [ -162.601579, 55.362152 ], [ -162.568266, 55.350731 ], [ -162.542568, 55.357393 ], [ -162.512111, 55.378333 ], [ -162.516870, 55.417356 ], [ -162.514014, 55.447813 ], [ -162.523532, 55.456379 ], [ -162.545423, 55.455427 ], [ -162.570037, 55.449713 ], [ -162.565411, 55.466849 ], [ -162.337934, 55.621989 ], [ -162.257033, 55.693373 ], [ -162.214202, 55.713361 ], [ -162.146626, 55.733348 ], [ -162.082856, 55.770468 ], [ -162.061917, 55.789503 ], [ -161.972624, 55.800526 ], [ -161.898956, 55.833464 ], [ -161.858430, 55.865402 ], [ -161.816225, 55.888993 ], [ -161.807833, 55.891954 ], [ -161.773409, 55.897310 ], [ -161.712283, 55.904232 ], [ -161.640007, 55.919503 ], [ -161.585604, 55.937324 ], [ -161.450442, 55.954485 ], [ -161.380557, 55.965618 ], [ -161.290777, 55.983130 ], [ -161.280307, 55.979323 ], [ -161.278330, 55.974912 ], [ -161.262763, 55.958734 ], [ -161.230444, 55.947467 ], [ -161.211273, 55.951712 ], [ -161.096617, 55.954752 ], [ -161.076383, 55.942079 ], [ -161.049162, 55.945407 ], [ -161.027739, 55.954554 ], [ -161.023376, 55.959468 ], [ -160.898682, 55.999014 ], [ -160.873229, 56.001448 ], [ -160.863250, 55.996237 ], [ -160.861717, 55.957969 ], [ -160.853151, 55.948451 ], [ -160.851247, 55.938934 ], [ -160.860765, 55.932271 ], [ -160.876945, 55.938934 ], [ -160.892174, 55.953210 ], [ -160.938811, 55.947500 ], [ -160.987352, 55.930368 ], [ -161.018761, 55.905621 ], [ -161.014954, 55.892296 ], [ -161.000677, 55.876116 ], [ -160.966413, 55.871357 ], [ -160.936053, 55.879527 ], [ -160.933754, 55.870499 ], [ -160.947674, 55.852867 ], [ -160.946400, 55.834881 ], [ -160.940845, 55.822529 ], [ -160.930591, 55.814358 ], [ -160.894777, 55.799970 ], [ -160.806014, 55.738241 ], [ -160.765228, 55.757174 ], [ -160.730726, 55.747664 ], [ -160.668102, 55.723556 ], [ -160.661205, 55.723427 ], [ -160.655560, 55.730041 ], [ -160.655468, 55.739868 ], [ -160.663037, 55.745491 ], [ -160.675794, 55.751411 ], [ -160.695227, 55.755075 ], [ -160.751236, 55.779364 ], [ -160.757705, 55.785841 ], [ -160.769155, 55.858268 ], [ -160.790333, 55.870405 ], [ -160.788429, 55.885634 ], [ -160.770345, 55.884682 ], [ -160.734182, 55.870995 ], [ -160.697591, 55.862396 ], [ -160.639088, 55.858300 ], [ -160.564014, 55.863719 ], [ -160.550343, 55.867549 ], [ -160.532582, 55.869891 ], [ -160.508433, 55.869379 ], [ -160.494678, 55.864193 ], [ -160.477892, 55.841099 ], [ -160.479355, 55.822361 ], [ -160.463607, 55.796130 ], [ -160.438735, 55.789608 ], [ -160.426751, 55.804732 ], [ -160.409619, 55.808539 ], [ -160.392487, 55.804732 ], [ -160.385878, 55.796445 ], [ -160.342876, 55.778166 ], [ -160.293924, 55.765556 ], [ -160.277382, 55.765861 ], [ -160.264568, 55.775723 ], [ -160.268930, 55.784278 ], [ -160.293498, 55.801788 ], [ -160.315655, 55.814544 ], [ -160.317826, 55.818983 ], [ -160.272533, 55.831673 ], [ -160.252575, 55.834237 ], [ -160.254478, 55.850418 ], [ -160.273176, 55.856881 ], [ -160.325637, 55.867858 ], [ -160.380573, 55.889456 ], [ -160.420735, 55.908620 ], [ -160.486594, 55.924168 ], [ -160.535759, 55.939617 ], [ -160.533685, 55.959950 ], [ -160.527094, 55.973011 ], [ -160.526362, 55.982433 ], [ -160.529292, 55.986103 ], [ -160.534541, 55.989498 ], [ -160.559597, 55.996838 ], [ -160.567604, 55.991670 ], [ -160.570895, 55.988929 ], [ -160.574397, 55.986552 ], [ -160.576655, 55.985416 ], [ -160.580840, 55.984079 ], [ -160.583491, 55.986468 ], [ -160.568356, 56.004062 ], [ -160.488708, 56.077214 ], [ -160.482208, 56.085234 ], [ -160.451417, 56.125564 ], [ -160.411381, 56.194138 ], [ -160.396338, 56.231775 ], [ -160.383094, 56.251352 ], [ -160.357156, 56.279582 ], [ -160.340249, 56.291271 ], [ -160.315896, 56.302227 ], [ -160.274604, 56.317151 ], [ -160.222878, 56.346868 ], [ -160.208383, 56.358022 ], [ -160.196329, 56.372550 ], [ -160.146252, 56.400176 ], [ -160.082592, 56.411094 ], [ -160.001477, 56.442201 ], [ -159.976758, 56.453951 ], [ -159.938337, 56.474192 ], [ -159.828049, 56.543935 ], [ -159.815477, 56.548941 ], [ -159.636156, 56.597390 ], [ -159.534961, 56.626529 ], [ -159.439380, 56.641332 ], [ -159.369434, 56.657073 ], [ -159.324421, 56.670356 ], [ -159.264871, 56.703136 ], [ -159.279894, 56.715667 ], [ -159.263113, 56.723321 ], [ -159.156455, 56.763324 ], [ -159.106652, 56.781126 ], [ -159.093468, 56.783704 ], [ -159.038354, 56.806006 ], [ -159.018304, 56.815094 ], [ -158.957471, 56.851184 ], [ -158.916269, 56.873586 ], [ -158.856307, 56.891670 ], [ -158.842030, 56.891670 ], [ -158.836320, 56.889766 ], [ -158.842982, 56.886911 ], [ -158.870584, 56.884055 ], [ -158.897234, 56.870730 ], [ -158.930546, 56.859309 ], [ -158.953543, 56.843418 ], [ -158.933589, 56.827905 ], [ -158.910730, 56.814797 ], [ -158.893212, 56.805788 ], [ -158.868797, 56.796648 ], [ -158.853294, 56.792620 ], [ -158.783590, 56.780750 ], [ -158.660298, 56.789015 ], [ -158.642293, 56.812850 ], [ -158.642845, 56.836608 ], [ -158.646812, 56.846992 ], [ -158.663659, 56.857055 ], [ -158.699788, 56.927362 ], [ -158.679293, 56.988625 ], [ -158.659945, 57.034585 ], [ -158.637364, 57.061364 ], [ -158.518429, 57.160550 ], [ -158.453711, 57.211790 ], [ -158.376249, 57.265542 ], [ -158.355066, 57.274850 ], [ -158.229883, 57.321534 ], [ -158.149710, 57.344916 ], [ -158.067030, 57.382915 ], [ -158.060041, 57.387456 ], [ -158.049932, 57.390141 ], [ -158.034246, 57.390230 ], [ -158.010538, 57.401456 ], [ -157.994670, 57.414234 ], [ -157.956239, 57.449383 ], [ -157.937241, 57.472048 ], [ -157.931624, 57.476208 ], [ -157.786046, 57.542189 ], [ -157.772496, 57.547055 ], [ -157.703852, 57.563455 ], [ -157.678891, 57.563888 ], [ -157.684833, 57.557746 ], [ -157.680416, 57.537727 ], [ -157.649389, 57.500331 ], [ -157.615137, 57.488691 ], [ -157.586910, 57.487156 ], [ -157.573129, 57.514525 ], [ -157.573472, 57.522732 ], [ -157.588339, 57.582152 ], [ -157.599644, 57.607950 ], [ -157.607387, 57.612537 ], [ -157.652202, 57.614794 ], [ -157.684282, 57.609974 ], [ -157.691291, 57.611131 ], [ -157.710645, 57.639946 ], [ -157.703782, 57.721768 ], [ -157.671061, 57.772866 ], [ -157.642226, 57.868777 ], [ -157.623886, 57.960502 ], [ -157.611802, 58.034263 ], [ -157.596601, 58.088670 ], [ -157.583636, 58.124307 ], [ -157.580924, 58.128096 ], [ -157.556556, 58.148445 ], [ -157.533329, 58.160335 ], [ -157.514474, 58.162978 ], [ -157.493784, 58.162148 ], [ -157.397350, 58.173383 ], [ -157.383099, 58.184607 ], [ -157.352316, 58.219097 ], [ -157.366928, 58.232669 ], [ -157.374511, 58.232117 ], [ -157.389237, 58.228091 ], [ -157.407918, 58.211871 ], [ -157.423325, 58.211360 ], [ -157.442712, 58.218875 ], [ -157.515475, 58.255638 ], [ -157.541564, 58.271883 ], [ -157.547209, 58.277535 ], [ -157.556343, 58.303749 ], [ -157.556865, 58.330715 ], [ -157.536176, 58.391597 ], [ -157.524477, 58.414506 ], [ -157.488108, 58.471705 ], [ -157.481487, 58.480771 ], [ -157.460880, 58.499693 ], [ -157.451918, 58.505618 ], [ -157.397197, 58.527333 ], [ -157.380259, 58.524398 ], [ -157.358487, 58.533876 ], [ -157.330683, 58.551516 ], [ -157.313572, 58.565043 ], [ -157.281327, 58.600236 ], [ -157.251462, 58.620786 ], [ -157.178834, 58.660440 ], [ -157.077914, 58.708103 ], [ -157.061928, 58.726102 ], [ -157.064097, 58.762878 ], [ -157.050772, 58.780962 ], [ -157.008226, 58.817139 ], [ -157.003401, 58.836822 ], [ -157.003607, 58.839306 ], [ -157.010984, 58.848400 ], [ -157.016088, 58.863490 ], [ -157.012392, 58.875889 ], [ -156.980888, 58.891031 ], [ -156.966649, 58.904074 ], [ -156.975946, 58.940896 ], [ -156.965206, 58.964141 ], [ -156.962256, 58.974174 ], [ -156.995569, 58.974174 ], [ -157.029517, 58.956203 ], [ -157.039206, 58.945921 ], [ -157.040625, 58.913391 ], [ -157.070584, 58.887816 ], [ -157.116866, 58.867533 ], [ -157.189554, 58.847724 ], [ -157.215710, 58.841526 ], [ -157.241396, 58.837558 ], [ -157.259663, 58.835665 ], [ -157.275451, 58.836136 ], [ -157.353132, 58.817729 ], [ -157.429531, 58.791071 ], [ -157.484062, 58.785962 ], [ -157.532654, 58.772638 ], [ -157.537543, 58.768542 ], [ -157.542326, 58.760962 ], [ -157.550603, 58.754514 ], [ -157.696472, 58.729975 ], [ -157.721786, 58.723212 ], [ -157.799597, 58.695590 ], [ -157.855396, 58.678277 ], [ -158.036593, 58.634248 ], [ -158.101646, 58.621090 ], [ -158.140307, 58.615020 ], [ -158.190283, 58.613710 ], [ -158.213861, 58.615828 ], [ -158.232276, 58.619902 ], [ -158.273036, 58.633470 ], [ -158.297189, 58.643147 ], [ -158.327038, 58.659835 ], [ -158.332093, 58.665313 ], [ -158.332860, 58.669274 ], [ -158.330216, 58.675043 ], [ -158.332394, 58.686814 ], [ -158.343545, 58.713634 ], [ -158.351481, 58.727693 ], [ -158.376873, 58.748043 ], [ -158.400475, 58.761182 ], [ -158.423828, 58.769847 ], [ -158.455210, 58.776972 ], [ -158.512547, 58.783110 ], [ -158.538516, 58.788394 ], [ -158.550626, 58.792915 ], [ -158.564833, 58.802715 ], [ -158.566397, 58.807137 ], [ -158.565870, 58.815429 ], [ -158.559499, 58.841819 ], [ -158.550784, 58.848538 ], [ -158.520327, 58.857105 ], [ -158.487015, 58.999872 ], [ -158.478449, 59.007486 ], [ -158.434667, 59.014149 ], [ -158.372801, 59.038895 ], [ -158.294754, 59.019860 ], [ -158.179588, 59.012245 ], [ -158.170070, 59.020811 ], [ -158.180540, 59.028426 ], [ -158.212901, 59.034136 ], [ -158.275719, 59.034136 ], [ -158.368042, 59.057931 ], [ -158.417534, 59.061738 ], [ -158.450847, 59.036992 ], [ -158.504147, 59.032233 ], [ -158.522231, 59.021763 ], [ -158.529845, 58.997969 ], [ -158.619684, 58.911048 ], [ -158.717436, 58.872462 ], [ -158.729581, 58.871218 ], [ -158.745305, 58.874098 ], [ -158.767748, 58.864264 ], [ -158.789632, 58.814257 ], [ -158.790786, 58.808424 ], [ -158.790378, 58.804712 ], [ -158.782365, 58.791157 ], [ -158.774626, 58.778593 ], [ -158.769800, 58.774141 ], [ -158.771246, 58.765109 ], [ -158.784886, 58.747739 ], [ -158.800959, 58.732842 ], [ -158.812116, 58.727845 ], [ -158.827105, 58.724495 ], [ -158.848225, 58.722736 ], [ -158.873439, 58.721951 ], [ -158.878198, 58.717192 ], [ -158.878198, 58.710530 ], [ -158.861207, 58.695580 ], [ -158.827852, 58.626432 ], [ -158.769131, 58.548650 ], [ -158.721173, 58.497971 ], [ -158.704052, 58.482759 ], [ -158.795316, 58.408032 ], [ -158.830598, 58.397095 ], [ -158.880927, 58.390670 ], [ -158.896067, 58.390065 ], [ -158.944154, 58.396885 ], [ -159.046105, 58.417466 ], [ -159.063346, 58.423139 ], [ -159.080496, 58.444256 ], [ -159.187347, 58.555609 ], [ -159.242290, 58.619067 ], [ -159.357625, 58.734520 ], [ -159.390664, 58.762362 ], [ -159.450831, 58.797736 ], [ -159.501768, 58.824304 ], [ -159.532347, 58.833609 ], [ -159.556355, 58.837414 ], [ -159.580287, 58.840691 ], [ -159.643549, 58.845063 ], [ -159.601899, 58.884671 ], [ -159.589811, 58.890359 ], [ -159.586966, 58.900314 ], [ -159.594788, 58.912402 ], [ -159.602610, 58.920935 ], [ -159.616120, 58.931601 ], [ -159.642430, 58.938712 ], [ -159.657362, 58.938712 ], [ -159.691493, 58.931601 ], [ -159.712114, 58.929468 ], [ -159.724603, 58.922575 ], [ -159.729472, 58.910751 ], [ -159.757409, 58.833548 ], [ -159.766927, 58.833548 ], [ -159.780252, 58.847825 ], [ -159.803289, 58.848538 ], [ -159.806676, 58.841893 ], [ -159.792070, 58.820331 ], [ -159.804589, 58.801552 ], [ -159.895009, 58.772340 ], [ -159.910310, 58.773731 ], [ -159.987515, 58.837720 ], [ -159.985352, 58.870464 ], [ -160.016727, 58.880843 ], [ -160.064719, 58.882929 ], [ -160.093109, 58.860798 ], [ -160.151660, 58.862759 ], [ -160.159311, 58.869714 ], [ -160.156529, 58.906577 ], [ -160.164180, 58.913533 ], [ -160.218140, 58.904072 ], [ -160.230446, 58.892559 ], [ -160.243771, 58.888751 ], [ -160.250433, 58.897317 ], [ -160.253094, 58.917764 ], [ -160.262150, 58.933932 ], [ -160.286346, 58.945007 ], [ -160.317353, 58.946305 ], [ -160.316402, 58.956775 ], [ -160.284993, 58.976763 ], [ -160.264054, 58.981521 ], [ -160.256592, 58.994480 ], [ -160.281086, 59.024904 ], [ -160.335142, 59.051507 ], [ -160.360184, 59.061471 ], [ -160.476578, 59.026047 ], [ -160.641785, 58.964489 ], [ -160.751951, 58.905608 ], [ -160.805399, 58.857093 ], [ -160.823489, 58.829136 ], [ -160.829245, 58.848048 ], [ -160.872003, 58.878472 ], [ -161.001101, 58.849693 ], [ -161.183380, 58.789276 ], [ -161.337982, 58.742912 ], [ -161.372711, 58.707958 ], [ -161.372314, 58.666172 ], [ -161.521347, 58.633141 ], [ -161.550537, 58.611160 ], [ -161.626450, 58.602581 ], [ -161.682907, 58.564671 ], [ -161.751999, 58.551842 ], [ -161.766296, 58.599224 ], [ -161.876111, 58.631143 ], [ -162.066269, 58.620800 ], [ -162.171722, 58.648441 ], [ -161.994644, 58.688828 ], [ -161.939163, 58.655613 ], [ -161.877213, 58.666138 ], [ -161.859055, 58.708637 ], [ -161.769501, 58.774937 ], [ -161.756622, 58.826477 ], [ -161.782123, 58.898832 ], [ -161.839230, 59.049928 ], [ -161.981964, 59.150997 ], [ -162.048584, 59.254177 ], [ -162.018982, 59.292278 ], [ -161.956528, 59.361771 ], [ -161.904053, 59.387341 ], [ -161.837936, 59.423836 ], [ -161.828125, 59.428188 ], [ -161.790375, 59.468197 ], [ -161.738312, 59.467010 ], [ -161.702530, 59.490906 ], [ -161.757980, 59.557152 ], [ -161.854752, 59.646214 ], [ -161.911163, 59.741741 ], [ -162.017059, 59.829426 ], [ -162.092361, 59.881104 ], [ -162.100708, 59.944675 ], [ -162.108560, 59.953861 ], [ -162.121072, 59.965241 ], [ -162.143049, 59.967506 ], [ -162.171759, 59.984163 ], [ -162.190616, 60.002030 ], [ -162.207225, 60.021834 ], [ -162.228371, 60.056313 ], [ -162.273111, 60.078487 ], [ -162.316922, 60.107590 ], [ -162.321481, 60.107970 ], [ -162.360185, 60.147360 ], [ -162.371131, 60.169019 ], [ -162.371870, 60.173451 ], [ -162.371032, 60.178616 ], [ -162.347528, 60.207157 ], [ -162.349432, 60.223337 ], [ -162.361805, 60.236662 ], [ -162.453176, 60.278540 ], [ -162.462694, 60.293769 ], [ -162.443659, 60.328985 ], [ -162.409394, 60.329937 ], [ -162.329444, 60.373719 ], [ -162.300891, 60.459379 ], [ -162.225700, 60.515535 ], [ -162.224748, 60.576449 ], [ -162.172400, 60.624038 ], [ -162.178111, 60.634508 ], [ -162.192387, 60.634508 ], [ -162.235218, 60.623086 ], [ -162.270434, 60.595485 ], [ -162.311361, 60.522197 ], [ -162.407491, 60.402272 ], [ -162.414153, 60.368008 ], [ -162.504573, 60.337551 ], [ -162.534078, 60.309949 ], [ -162.536933, 60.278540 ], [ -162.540741, 60.269023 ], [ -162.571198, 60.251890 ], [ -162.568342, 60.233807 ], [ -162.551210, 60.223337 ], [ -162.453176, 60.197639 ], [ -162.446514, 60.187169 ], [ -162.445727, 60.176448 ], [ -162.447904, 60.170480 ], [ -162.463026, 60.153020 ], [ -162.476214, 60.145536 ], [ -162.484234, 60.137964 ], [ -162.492346, 60.121804 ], [ -162.494327, 60.110675 ], [ -162.481175, 60.087544 ], [ -162.476759, 60.047690 ], [ -162.503647, 59.999230 ], [ -162.530118, 59.990110 ], [ -162.585518, 59.977230 ], [ -162.622569, 59.971809 ], [ -162.644231, 59.972954 ], [ -162.682717, 59.979432 ], [ -162.738592, 59.976321 ], [ -162.740059, 59.968797 ], [ -162.748554, 59.962664 ], [ -162.760007, 59.958013 ], [ -162.828585, 59.939142 ], [ -162.907260, 59.923682 ], [ -162.974977, 59.906443 ], [ -163.033128, 59.884135 ], [ -163.109595, 59.861633 ], [ -163.172633, 59.845058 ], [ -163.349027, 59.819890 ], [ -163.387670, 59.815880 ], [ -163.559148, 59.801391 ], [ -163.662607, 59.795710 ], [ -163.704795, 59.794805 ], [ -163.772229, 59.795624 ], [ -163.930798, 59.803853 ], [ -164.079837, 59.828034 ], [ -164.115117, 59.836688 ], [ -164.133393, 59.845612 ], [ -164.160319, 59.864679 ], [ -164.201811, 59.916119 ], [ -164.208475, 59.934461 ], [ -164.209843, 59.942874 ], [ -164.208306, 59.949046 ], [ -164.198545, 59.955109 ], [ -164.178705, 59.961810 ], [ -164.161024, 59.964076 ], [ -164.125430, 59.964626 ], [ -164.115080, 59.973166 ], [ -164.131810, 59.991177 ], [ -164.191600, 60.024496 ], [ -164.302968, 60.054233 ], [ -164.336111, 60.055527 ], [ -164.385471, 60.077190 ], [ -164.461194, 60.137824 ], [ -164.498556, 60.170546 ], [ -164.493861, 60.177397 ], [ -164.494317, 60.184833 ], [ -164.505677, 60.194304 ], [ -164.517647, 60.199493 ], [ -164.541699, 60.205279 ], [ -164.558343, 60.207042 ], [ -164.596070, 60.222874 ], [ -164.619501, 60.234938 ], [ -164.634362, 60.242980 ], [ -164.646332, 60.253303 ], [ -164.651996, 60.262745 ], [ -164.653098, 60.267902 ], [ -164.698889, 60.296298 ], [ -164.726570, 60.291475 ], [ -164.777233, 60.293833 ], [ -164.850355, 60.303615 ], [ -164.899296, 60.316787 ], [ -164.962678, 60.339660 ], [ -165.005576, 60.359812 ], [ -165.057585, 60.386287 ], [ -165.129403, 60.433707 ], [ -165.132893, 60.438867 ], [ -165.124792, 60.449191 ], [ -165.120728, 60.451196 ], [ -165.069693, 60.460893 ], [ -165.049070, 60.461516 ], [ -165.015155, 60.471414 ], [ -164.997870, 60.480459 ], [ -164.961439, 60.508391 ], [ -164.956788, 60.527837 ], [ -164.960843, 60.533845 ], [ -164.965488, 60.536701 ], [ -164.971280, 60.539558 ], [ -164.986952, 60.542406 ], [ -165.057440, 60.544631 ], [ -165.190449, 60.498001 ], [ -165.244442, 60.496298 ], [ -165.362975, 60.506866 ], [ -165.377559, 60.513164 ], [ -165.405071, 60.534650 ], [ -165.420349, 60.550692 ], [ -165.419788, 60.552418 ], [ -165.415193, 60.558160 ], [ -165.381052, 60.577987 ], [ -165.367676, 60.581158 ], [ -165.346721, 60.580603 ], [ -165.312937, 60.576313 ], [ -165.289651, 60.575755 ], [ -165.268717, 60.579488 ], [ -165.178617, 60.623927 ], [ -165.170458, 60.629091 ], [ -165.147184, 60.651160 ], [ -165.063148, 60.688645 ], [ -165.052642, 60.690068 ], [ -165.043300, 60.687468 ], [ -165.027535, 60.686008 ], [ -164.991665, 60.698840 ], [ -164.971250, 60.711434 ], [ -164.966591, 60.717438 ], [ -164.965410, 60.724306 ], [ -164.971839, 60.729730 ], [ -165.010452, 60.744789 ], [ -165.023904, 60.753128 ], [ -165.032074, 60.760022 ], [ -165.040843, 60.772660 ], [ -165.042584, 60.784430 ], [ -165.037889, 60.789010 ], [ -165.032615, 60.786704 ], [ -165.020309, 60.785539 ], [ -164.977663, 60.790360 ], [ -164.944914, 60.800379 ], [ -164.924180, 60.809331 ], [ -164.922179, 60.819873 ], [ -164.939313, 60.823463 ], [ -165.009703, 60.815060 ], [ -165.021430, 60.815086 ], [ -165.029620, 60.826001 ], [ -165.030183, 60.838050 ], [ -165.003679, 60.875580 ], [ -164.945958, 60.921060 ], [ -164.939496, 60.924774 ], [ -164.925994, 60.925063 ], [ -164.917542, 60.928144 ], [ -164.905047, 60.932184 ], [ -164.903903, 60.942213 ], [ -164.921256, 60.946509 ], [ -164.940065, 60.945369 ], [ -165.007096, 60.922058 ], [ -165.032040, 60.903986 ], [ -165.067312, 60.904874 ], [ -165.119660, 60.916771 ], [ -165.155232, 60.929186 ], [ -165.172467, 60.940328 ], [ -165.194945, 60.973900 ], [ -165.194964, 60.979915 ], [ -165.190271, 60.983073 ], [ -165.133937, 61.011250 ], [ -165.115681, 61.016097 ], [ -165.097425, 61.016658 ], [ -165.096828, 61.014944 ], [ -165.083282, 61.012933 ], [ -165.020265, 61.011153 ], [ -164.998172, 61.013826 ], [ -164.961527, 61.024166 ], [ -164.951103, 61.031020 ], [ -164.950573, 61.048079 ], [ -164.951372, 61.084107 ], [ -164.940903, 61.089818 ], [ -164.927825, 61.084392 ], [ -164.902245, 61.077902 ], [ -164.870450, 61.079564 ], [ -164.868009, 61.096394 ], [ -164.883441, 61.105924 ], [ -164.891286, 61.108246 ], [ -164.941253, 61.110863 ], [ -164.981718, 61.109691 ], [ -164.991273, 61.107232 ], [ -164.997636, 61.104430 ], [ -164.998547, 61.079492 ], [ -164.993599, 61.076241 ], [ -164.991227, 61.072192 ], [ -164.995695, 61.058035 ], [ -165.011271, 61.051984 ], [ -165.029551, 61.054010 ], [ -165.057842, 61.059746 ], [ -165.119781, 61.078640 ], [ -165.167636, 61.113502 ], [ -165.175321, 61.120926 ], [ -165.177110, 61.125494 ], [ -165.167072, 61.133487 ], [ -165.165857, 61.136567 ], [ -165.168860, 61.144913 ], [ -165.172994, 61.146919 ], [ -165.203757, 61.150341 ], [ -165.289700, 61.181714 ], [ -165.307976, 61.181823 ], [ -165.325552, 61.169306 ], [ -165.344389, 61.123691 ], [ -165.350154, 61.104545 ], [ -165.350113, 61.097407 ], [ -165.347082, 61.084847 ], [ -165.342321, 61.079994 ], [ -165.336996, 61.077709 ], [ -165.338136, 61.073432 ], [ -165.343442, 61.070564 ], [ -165.370544, 61.066821 ], [ -165.403007, 61.067060 ], [ -165.498726, 61.079149 ], [ -165.549613, 61.088162 ], [ -165.578127, 61.100361 ], [ -165.590682, 61.111169 ], [ -165.631996, 61.220708 ], [ -165.634048, 61.237557 ], [ -165.627549, 61.258125 ], [ -165.620589, 61.268586 ], [ -165.623317, 61.278431 ], [ -165.635791, 61.285456 ], [ -165.662892, 61.294570 ], [ -165.787442, 61.310063 ], [ -165.809373, 61.306827 ], [ -165.816434, 61.303363 ], [ -165.831365, 61.306719 ], [ -165.858993, 61.318865 ], [ -165.879599, 61.335044 ], [ -165.915445, 61.387686 ], [ -165.921194, 61.403080 ], [ -165.921950, 61.409638 ], [ -165.918612, 61.419087 ], [ -165.844525, 61.440601 ], [ -165.800525, 61.449657 ], [ -165.791085, 61.449852 ], [ -165.767226, 61.456950 ], [ -165.748503, 61.476446 ], [ -165.746352, 61.489304 ], [ -165.754317, 61.498704 ], [ -165.807627, 61.529171 ], [ -165.912496, 61.556200 ], [ -165.964035, 61.555919 ], [ -165.981879, 61.551249 ], [ -165.985948, 61.546650 ], [ -165.999535, 61.539720 ], [ -166.034748, 61.535221 ], [ -166.075524, 61.532672 ], [ -166.088680, 61.522885 ], [ -166.079983, 61.513464 ], [ -166.058242, 61.500419 ], [ -166.075398, 61.492980 ], [ -166.108269, 61.492475 ], [ -166.124202, 61.504645 ], [ -166.158345, 61.541537 ], [ -166.165232, 61.550618 ], [ -166.178627, 61.574807 ], [ -166.181850, 61.581342 ], [ -166.182688, 61.588481 ], [ -166.158976, 61.700437 ], [ -166.153178, 61.714931 ], [ -166.143757, 61.724352 ], [ -166.134285, 61.723919 ], [ -166.133020, 61.721918 ], [ -166.134402, 61.709068 ], [ -166.138684, 61.667101 ], [ -166.140133, 61.639562 ], [ -166.139409, 61.632315 ], [ -166.132162, 61.631590 ], [ -166.053983, 61.638201 ], [ -166.031834, 61.641199 ], [ -166.015134, 61.645866 ], [ -165.967894, 61.654432 ], [ -165.903783, 61.663632 ], [ -165.822140, 61.670610 ], [ -165.809933, 61.673029 ], [ -165.810000, 61.689360 ], [ -165.856791, 61.690734 ], [ -165.934968, 61.706299 ], [ -165.993851, 61.723105 ], [ -166.006693, 61.729879 ], [ -166.092081, 61.800733 ], [ -166.094045, 61.805296 ], [ -166.094312, 61.813859 ], [ -166.085334, 61.816498 ], [ -165.955265, 61.832408 ], [ -165.870982, 61.826013 ], [ -165.758413, 61.825444 ], [ -165.747090, 61.827720 ], [ -165.736904, 61.832901 ], [ -165.736429, 61.839188 ], [ -165.730439, 61.842075 ], [ -165.696038, 61.847055 ], [ -165.640216, 61.848041 ], [ -165.608427, 61.855892 ], [ -165.600043, 61.859663 ], [ -165.612337, 61.871907 ], [ -165.667939, 61.900275 ], [ -165.703482, 61.921572 ], [ -165.725818, 61.947184 ], [ -165.741481, 61.971392 ], [ -165.756806, 62.006337 ], [ -165.756386, 62.014032 ], [ -165.748641, 62.047145 ], [ -165.743522, 62.062280 ], [ -165.734117, 62.076873 ], [ -165.706155, 62.108365 ], [ -165.672037, 62.139890 ], [ -165.620746, 62.172616 ], [ -165.500322, 62.255451 ], [ -165.373713, 62.338196 ], [ -165.337722, 62.359031 ], [ -165.311967, 62.378812 ], [ -165.294962, 62.403353 ], [ -165.269270, 62.427352 ], [ -165.199804, 62.469637 ], [ -165.096155, 62.522452 ], [ -165.046045, 62.540420 ], [ -164.868059, 62.571142 ], [ -164.770232, 62.592082 ], [ -164.767605, 62.602973 ], [ -164.777244, 62.609083 ], [ -164.796056, 62.611486 ], [ -164.817110, 62.636697 ], [ -164.857695, 62.732421 ], [ -164.877300, 62.784320 ], [ -164.877773, 62.797774 ], [ -164.875640, 62.806254 ], [ -164.850838, 62.839510 ], [ -164.836318, 62.852168 ], [ -164.813007, 62.903919 ], [ -164.783858, 62.946154 ], [ -164.766117, 62.958228 ], [ -164.716841, 63.006264 ], [ -164.685213, 63.022191 ], [ -164.583735, 63.058457 ], [ -164.580201, 63.070127 ], [ -164.611616, 63.077673 ], [ -164.641186, 63.072680 ], [ -164.643672, 63.074975 ], [ -164.644886, 63.079268 ], [ -164.640324, 63.091257 ], [ -164.633943, 63.097820 ], [ -164.493118, 63.177670 ], [ -164.423449, 63.211977 ], [ -164.363592, 63.226280 ], [ -164.209475, 63.251472 ], [ -164.140096, 63.259336 ], [ -164.066991, 63.262276 ], [ -164.036565, 63.261204 ], [ -163.970266, 63.248291 ], [ -163.909405, 63.232514 ], [ -163.885059, 63.222308 ], [ -163.788882, 63.217482 ], [ -163.755283, 63.217461 ], [ -163.732650, 63.213257 ], [ -163.725805, 63.210620 ], [ -163.724072, 63.206592 ], [ -163.703980, 63.188107 ], [ -163.650294, 63.157564 ], [ -163.616272, 63.141213 ], [ -163.590122, 63.146091 ], [ -163.529938, 63.135400 ], [ -163.520806, 63.123280 ], [ -163.507217, 63.113685 ], [ -163.474794, 63.099053 ], [ -163.433968, 63.089296 ], [ -163.417683, 63.083874 ], [ -163.364979, 63.055805 ], [ -163.316203, 63.037763 ], [ -163.130853, 63.049387 ], [ -163.053996, 63.058334 ], [ -163.040500, 63.062151 ], [ -162.998302, 63.089286 ], [ -162.919727, 63.120153 ], [ -162.901643, 63.125597 ], [ -162.844559, 63.154191 ], [ -162.837850, 63.159224 ], [ -162.834926, 63.164621 ], [ -162.840187, 63.187579 ], [ -162.839167, 63.193004 ], [ -162.834354, 63.198076 ], [ -162.821122, 63.205596 ], [ -162.769536, 63.217069 ], [ -162.758741, 63.217187 ], [ -162.747621, 63.213572 ], [ -162.724080, 63.214615 ], [ -162.688083, 63.220608 ], [ -162.662614, 63.229906 ], [ -162.571695, 63.285556 ], [ -162.437059, 63.377836 ], [ -162.432169, 63.382606 ], [ -162.426095, 63.393651 ], [ -162.428744, 63.401055 ], [ -162.421530, 63.409014 ], [ -162.384625, 63.435797 ], [ -162.352274, 63.454069 ], [ -162.301869, 63.473422 ], [ -162.271089, 63.487711 ], [ -162.268242, 63.490799 ], [ -162.267833, 63.495084 ], [ -162.288532, 63.526412 ], [ -162.301471, 63.537350 ], [ -162.296731, 63.540108 ], [ -162.252411, 63.541753 ], [ -162.190145, 63.529886 ], [ -162.151574, 63.517952 ], [ -162.123249, 63.512807 ], [ -162.108597, 63.511927 ], [ -162.073156, 63.513768 ], [ -162.041687, 63.489650 ], [ -162.045709, 63.475434 ], [ -162.050132, 63.472850 ], [ -162.050543, 63.470589 ], [ -162.039444, 63.458930 ], [ -162.025552, 63.447539 ], [ -161.930714, 63.444843 ], [ -161.839897, 63.447313 ], [ -161.765832, 63.453803 ], [ -161.705630, 63.464061 ], [ -161.676526, 63.465003 ], [ -161.591632, 63.454244 ], [ -161.583772, 63.447857 ], [ -161.527809, 63.451177 ], [ -161.512873, 63.466364 ], [ -161.500500, 63.470171 ], [ -161.470043, 63.470171 ], [ -161.450463, 63.457178 ], [ -161.310181, 63.471312 ], [ -161.191163, 63.490072 ], [ -161.136758, 63.504525 ], [ -161.134230, 63.506735 ], [ -161.119964, 63.532544 ], [ -161.102721, 63.547800 ], [ -161.036049, 63.579566 ], [ -161.018421, 63.618649 ], [ -161.013662, 63.623408 ], [ -160.974850, 63.615484 ], [ -160.924877, 63.644814 ], [ -160.904353, 63.658024 ], [ -160.809089, 63.731332 ], [ -160.783304, 63.752893 ], [ -160.765560, 63.773552 ], [ -160.761974, 63.793453 ], [ -160.766291, 63.835189 ], [ -160.787624, 63.869196 ], [ -160.810798, 63.904646 ], [ -160.851979, 63.954409 ], [ -160.877686, 63.977265 ], [ -160.892455, 63.985943 ], [ -160.933740, 64.049729 ], [ -160.951641, 64.090067 ], [ -160.955132, 64.138030 ], [ -160.956425, 64.191732 ], [ -160.953596, 64.197775 ], [ -160.946857, 64.204158 ], [ -160.976038, 64.235761 ], [ -161.228941, 64.370747 ], [ -161.313668, 64.400874 ], [ -161.410382, 64.422107 ], [ -161.463026, 64.420074 ], [ -161.470182, 64.418814 ], [ -161.492926, 64.407851 ], [ -161.525246, 64.378649 ], [ -161.531909, 64.378649 ], [ -161.529053, 64.412913 ], [ -161.521439, 64.419576 ], [ -161.504903, 64.423074 ], [ -161.483299, 64.447920 ], [ -161.479093, 64.486401 ], [ -161.469046, 64.506575 ], [ -161.388621, 64.532783 ], [ -161.373572, 64.535028 ], [ -161.362901, 64.526913 ], [ -161.351145, 64.521382 ], [ -161.321343, 64.513865 ], [ -161.234092, 64.500365 ], [ -161.198029, 64.496626 ], [ -161.155518, 64.494687 ], [ -161.078031, 64.494094 ], [ -161.024185, 64.499719 ], [ -161.015095, 64.502124 ], [ -161.013228, 64.507521 ], [ -161.017140, 64.517124 ], [ -161.037534, 64.522246 ], [ -161.045947, 64.524948 ], [ -161.076242, 64.524986 ], [ -161.085760, 64.537359 ], [ -161.081001, 64.542118 ], [ -161.049148, 64.540952 ], [ -160.992894, 64.541295 ], [ -160.970555, 64.543884 ], [ -160.940493, 64.550000 ], [ -160.802048, 64.610352 ], [ -160.793356, 64.619317 ], [ -160.791614, 64.623055 ], [ -160.783570, 64.680581 ], [ -160.783398, 64.717160 ], [ -160.869571, 64.783797 ], [ -160.935974, 64.822370 ], [ -160.986417, 64.833984 ], [ -161.079718, 64.869549 ], [ -161.102755, 64.880661 ], [ -161.133062, 64.898219 ], [ -161.149655, 64.911985 ], [ -161.149366, 64.916558 ], [ -161.145725, 64.920534 ], [ -161.176009, 64.927161 ], [ -161.192120, 64.921366 ], [ -161.195202, 64.918178 ], [ -161.200893, 64.905796 ], [ -161.200964, 64.898659 ], [ -161.198586, 64.894403 ], [ -161.213756, 64.883324 ], [ -161.264283, 64.861970 ], [ -161.293049, 64.853243 ], [ -161.327848, 64.829836 ], [ -161.357867, 64.805922 ], [ -161.366808, 64.793777 ], [ -161.364438, 64.782099 ], [ -161.367483, 64.778907 ], [ -161.376985, 64.773036 ], [ -161.413493, 64.762723 ], [ -161.429860, 64.759027 ], [ -161.518211, 64.753250 ], [ -161.595506, 64.764478 ], [ -161.630287, 64.771290 ], [ -161.645520, 64.776452 ], [ -161.667261, 64.788981 ], [ -161.878363, 64.709476 ], [ -161.902429, 64.703851 ], [ -161.939279, 64.699119 ], [ -162.096528, 64.690983 ], [ -162.138832, 64.685934 ], [ -162.168516, 64.680290 ], [ -162.188146, 64.672395 ], [ -162.216620, 64.656213 ], [ -162.219718, 64.644176 ], [ -162.234477, 64.619336 ], [ -162.270025, 64.608710 ], [ -162.290571, 64.605496 ], [ -162.342308, 64.592240 ], [ -162.539996, 64.530931 ], [ -162.554875, 64.520341 ], [ -162.614220, 64.470702 ], [ -162.615452, 64.467077 ], [ -162.602178, 64.456869 ], [ -162.603020, 64.448666 ], [ -162.632242, 64.385734 ], [ -162.645156, 64.379783 ], [ -162.667680, 64.375356 ], [ -162.719218, 64.359971 ], [ -162.768424, 64.333516 ], [ -162.790167, 64.325182 ], [ -162.795636, 64.327716 ], [ -162.805385, 64.336023 ], [ -162.810004, 64.352647 ], [ -162.807205, 64.364643 ], [ -162.800350, 64.374695 ], [ -162.802266, 64.395327 ], [ -162.806612, 64.405608 ], [ -162.836540, 64.436702 ], [ -162.858556, 64.474864 ], [ -162.857562, 64.499780 ], [ -162.940776, 64.542417 ], [ -162.969250, 64.546870 ], [ -163.030657, 64.542353 ], [ -163.042618, 64.540046 ], [ -163.053098, 64.541642 ], [ -163.049291, 64.549257 ], [ -163.036918, 64.554015 ], [ -163.027400, 64.559726 ], [ -163.028352, 64.569244 ], [ -163.060712, 64.588280 ], [ -163.115916, 64.595894 ], [ -163.142566, 64.609219 ], [ -163.160650, 64.625399 ], [ -163.161601, 64.633014 ], [ -163.173975, 64.639676 ], [ -163.217757, 64.632062 ], [ -163.311983, 64.588280 ], [ -163.316742, 64.580665 ], [ -163.309128, 64.571148 ], [ -163.254876, 64.549257 ], [ -163.178734, 64.543546 ], [ -163.150180, 64.515944 ], [ -163.119723, 64.510233 ], [ -163.083588, 64.516903 ], [ -163.033231, 64.519314 ], [ -163.028887, 64.511908 ], [ -163.027158, 64.477945 ], [ -163.091486, 64.437736 ], [ -163.107459, 64.409192 ], [ -163.119450, 64.403808 ], [ -163.150789, 64.397249 ], [ -163.175336, 64.399334 ], [ -163.229206, 64.430019 ], [ -163.249092, 64.456223 ], [ -163.253027, 64.469501 ], [ -163.350926, 64.505859 ], [ -163.412900, 64.524986 ], [ -163.451482, 64.534820 ], [ -163.597834, 64.563356 ], [ -163.651943, 64.567299 ], [ -163.829739, 64.574965 ], [ -163.875774, 64.572935 ], [ -163.896180, 64.564483 ], [ -163.974352, 64.551370 ], [ -163.994532, 64.551742 ], [ -164.044839, 64.559167 ], [ -164.071997, 64.561280 ], [ -164.147059, 64.564552 ], [ -164.260064, 64.564220 ], [ -164.307273, 64.561488 ], [ -164.421871, 64.545256 ], [ -164.491327, 64.529824 ], [ -164.548298, 64.516738 ], [ -164.807747, 64.449432 ], [ -164.835679, 64.444917 ], [ -164.874421, 64.441195 ], [ -165.001961, 64.433917 ], [ -165.016519, 64.434392 ], [ -165.214182, 64.469726 ], [ -165.413443, 64.497939 ], [ -165.550573, 64.512235 ], [ -165.751093, 64.536437 ], [ -165.819595, 64.540171 ], [ -165.919704, 64.548660 ], [ -166.189546, 64.575798 ], [ -166.236939, 64.583558 ], [ -166.392403, 64.638161 ], [ -166.413926, 64.651229 ], [ -166.451788, 64.691761 ], [ -166.474714, 64.719267 ], [ -166.483801, 64.733419 ], [ -166.481076, 64.786156 ], [ -166.478978, 64.797036 ], [ -166.430516, 64.807715 ], [ -166.417028, 64.818740 ], [ -166.410198, 64.827968 ], [ -166.407303, 64.834278 ], [ -166.407315, 64.852281 ], [ -166.409331, 64.859755 ], [ -166.415624, 64.871928 ], [ -166.432246, 64.883160 ], [ -166.530518, 64.937114 ], [ -166.586066, 64.955712 ], [ -166.615110, 64.964330 ], [ -166.636843, 64.968113 ], [ -166.690814, 64.985372 ], [ -166.704830, 64.997051 ], [ -166.705283, 64.999846 ], [ -166.695206, 65.005184 ], [ -166.688762, 65.018029 ], [ -166.692426, 65.029629 ], [ -166.696453, 65.035857 ], [ -166.732794, 65.053498 ], [ -166.820910, 65.077053 ], [ -166.860402, 65.090866 ], [ -166.885451, 65.105856 ], [ -166.911922, 65.125965 ], [ -166.910131, 65.134024 ], [ -166.906687, 65.136320 ], [ -166.897720, 65.139028 ], [ -166.886677, 65.138763 ], [ -166.872666, 65.136928 ], [ -166.837496, 65.128146 ], [ -166.826753, 65.119778 ], [ -166.816790, 65.117089 ], [ -166.755554, 65.110585 ], [ -166.670320, 65.109720 ], [ -166.638411, 65.113586 ], [ -166.634449, 65.125873 ], [ -166.606070, 65.135992 ], [ -166.521506, 65.149242 ], [ -166.509566, 65.152719 ], [ -166.479913, 65.167249 ], [ -166.464192, 65.177086 ], [ -166.459984, 65.183284 ], [ -166.460050, 65.189897 ], [ -166.465342, 65.194818 ], [ -166.474839, 65.217663 ], [ -166.475297, 65.224335 ], [ -166.451711, 65.236178 ], [ -166.386271, 65.254143 ], [ -166.347189, 65.276341 ], [ -166.360618, 65.288631 ], [ -166.377721, 65.297983 ], [ -166.439404, 65.319058 ], [ -166.485968, 65.330900 ], [ -166.518640, 65.335824 ], [ -166.551097, 65.338406 ], [ -166.572735, 65.338155 ], [ -166.596964, 65.336246 ], [ -166.625987, 65.325121 ], [ -166.655179, 65.324938 ], [ -166.679717, 65.326856 ], [ -166.796001, 65.337184 ], [ -166.851646, 65.348485 ], [ -166.899681, 65.360642 ], [ -167.026782, 65.381967 ], [ -167.101860, 65.387737 ], [ -167.170465, 65.389269 ], [ -167.398458, 65.400259 ], [ -167.474024, 65.412744 ], [ -167.574639, 65.444979 ], [ -167.620388, 65.463463 ], [ -167.621371, 65.466589 ], [ -167.710888, 65.498524 ], [ -167.841836, 65.530249 ], [ -167.851234, 65.538181 ], [ -167.909599, 65.550876 ], [ -167.967065, 65.558599 ], [ -167.997178, 65.559346 ], [ -168.047620, 65.569149 ], [ -168.075200, 65.576355 ], [ -168.099046, 65.592239 ], [ -168.099356, 65.599045 ], [ -168.096140, 65.600882 ], [ -168.100003, 65.610972 ], [ -168.127044, 65.626584 ], [ -168.134663, 65.640840 ], [ -168.128930, 65.655744 ], [ -168.103708, 65.685552 ], [ -167.979889, 65.727972 ], [ -167.857216, 65.754341 ], [ -167.735690, 65.776124 ], [ -167.539643, 65.820836 ], [ -167.314935, 65.885039 ], [ -167.246146, 65.911408 ], [ -167.139524, 65.948095 ], [ -166.977872, 65.996247 ], [ -166.956089, 66.007711 ], [ -166.827684, 66.051277 ], [ -166.597243, 66.118919 ], [ -166.526162, 66.141849 ], [ -166.330971, 66.189514 ], [ -165.882496, 66.311603 ], [ -165.869233, 66.316112 ], [ -165.805030, 66.333310 ], [ -165.668600, 66.361971 ], [ -165.407204, 66.420441 ], [ -165.187082, 66.465154 ], [ -165.124026, 66.473179 ], [ -164.711009, 66.542541 ], [ -164.400724, 66.581110 ], [ -164.345015, 66.580834 ], [ -164.094554, 66.592281 ], [ -163.979581, 66.593953 ], [ -163.875047, 66.592256 ], [ -163.730376, 66.582738 ], [ -163.606644, 66.557992 ], [ -163.640908, 66.553233 ], [ -163.756074, 66.568462 ], [ -163.931203, 66.579883 ], [ -163.938817, 66.577028 ], [ -163.933106, 66.571317 ], [ -163.908341, 66.555970 ], [ -163.875235, 66.558248 ], [ -163.850476, 66.563102 ], [ -163.754171, 66.551284 ], [ -163.727179, 66.516388 ], [ -163.728308, 66.498552 ], [ -163.730247, 66.491372 ], [ -163.761967, 66.454874 ], [ -163.798687, 66.436875 ], [ -163.844221, 66.418978 ], [ -163.856359, 66.409296 ], [ -163.873106, 66.389015 ], [ -163.873096, 66.328550 ], [ -163.849163, 66.307639 ], [ -163.839825, 66.304079 ], [ -163.829977, 66.280398 ], [ -163.830077, 66.272000 ], [ -163.843108, 66.259869 ], [ -163.904813, 66.230303 ], [ -163.955901, 66.217170 ], [ -164.046937, 66.209404 ], [ -164.078765, 66.201764 ], [ -164.092715, 66.184537 ], [ -164.089237, 66.182338 ], [ -164.078677, 66.181019 ], [ -164.007503, 66.179386 ], [ -163.916551, 66.190494 ], [ -163.878306, 66.160279 ], [ -163.861406, 66.136665 ], [ -163.847401, 66.122106 ], [ -163.803580, 66.100059 ], [ -163.772467, 66.081922 ], [ -163.768357, 66.073662 ], [ -163.767510, 66.060803 ], [ -163.623921, 66.058281 ], [ -163.540115, 66.069921 ], [ -163.502704, 66.081165 ], [ -163.495845, 66.085388 ], [ -163.344759, 66.084937 ], [ -163.313843, 66.075287 ], [ -163.287768, 66.069229 ], [ -163.168568, 66.059290 ], [ -163.146726, 66.059487 ], [ -163.093003, 66.062960 ], [ -163.047140, 66.068327 ], [ -162.997473, 66.076845 ], [ -162.876016, 66.082833 ], [ -162.791232, 66.089138 ], [ -162.750705, 66.090160 ], [ -162.681304, 66.061574 ], [ -162.680204, 66.058129 ], [ -162.673584, 66.053685 ], [ -162.635985, 66.040366 ], [ -162.622284, 66.039526 ], [ -162.530755, 66.045062 ], [ -162.457670, 66.058579 ], [ -162.423726, 66.048984 ], [ -162.413452, 66.035085 ], [ -162.391892, 66.028724 ], [ -162.372147, 66.027985 ], [ -162.331284, 66.031403 ], [ -162.269670, 66.042104 ], [ -162.205889, 66.056753 ], [ -162.139516, 66.078819 ], [ -162.137424, 66.078547 ], [ -162.129709, 66.069487 ], [ -162.121788, 66.067391 ], [ -162.025701, 66.062829 ], [ -161.950043, 66.040302 ], [ -161.838018, 66.022582 ], [ -161.817091, 66.033089 ], [ -161.812306, 66.041688 ], [ -161.798585, 66.055317 ], [ -161.775537, 66.073732 ], [ -161.680577, 66.111588 ], [ -161.665300, 66.122177 ], [ -161.627008, 66.153194 ], [ -161.623983, 66.162082 ], [ -161.613943, 66.176693 ], [ -161.548429, 66.239912 ], [ -161.484539, 66.262426 ], [ -161.367875, 66.258653 ], [ -161.341189, 66.255100 ], [ -161.337269, 66.243163 ], [ -161.332120, 66.236431 ], [ -161.320778, 66.223591 ], [ -161.313025, 66.221051 ], [ -161.263655, 66.214154 ], [ -161.198971, 66.210949 ], [ -161.145397, 66.220179 ], [ -161.087342, 66.234208 ], [ -161.067871, 66.235164 ], [ -161.052732, 66.231018 ], [ -161.035866, 66.229437 ], [ -161.000026, 66.233126 ], [ -160.993965, 66.234444 ], [ -160.991066, 66.236816 ], [ -160.990275, 66.239715 ], [ -160.995905, 66.251962 ], [ -160.998540, 66.254935 ], [ -161.061034, 66.283804 ], [ -161.079328, 66.307126 ], [ -161.089161, 66.315140 ], [ -161.107995, 66.328367 ], [ -161.129512, 66.336248 ], [ -161.163100, 66.342291 ], [ -161.219834, 66.348918 ], [ -161.360743, 66.375943 ], [ -161.525554, 66.397046 ], [ -161.694404, 66.396174 ], [ -161.817538, 66.360815 ], [ -161.912946, 66.344436 ], [ -161.904318, 66.323675 ], [ -161.876955, 66.309398 ], [ -161.846022, 66.282629 ], [ -161.835314, 66.269542 ], [ -161.839478, 66.265378 ], [ -161.900154, 66.264188 ], [ -161.903723, 66.268352 ], [ -161.900154, 66.291552 ], [ -161.903129, 66.306423 ], [ -161.919190, 66.319510 ], [ -161.934062, 66.324269 ], [ -161.935846, 66.332003 ], [ -161.916309, 66.349481 ], [ -161.880900, 66.398763 ], [ -161.872447, 66.414132 ], [ -161.863387, 66.440783 ], [ -161.864156, 66.488195 ], [ -161.874880, 66.511446 ], [ -162.029043, 66.586504 ], [ -162.091453, 66.605963 ], [ -162.097910, 66.609863 ], [ -162.105641, 66.622584 ], [ -162.113311, 66.639596 ], [ -162.124348, 66.651291 ], [ -162.140377, 66.664737 ], [ -162.175398, 66.687789 ], [ -162.228635, 66.709770 ], [ -162.268767, 66.717905 ], [ -162.349774, 66.726713 ], [ -162.422414, 66.731581 ], [ -162.501415, 66.742503 ], [ -162.500520, 66.749751 ], [ -162.502502, 66.758875 ], [ -162.512617, 66.777733 ], [ -162.544381, 66.804872 ], [ -162.572224, 66.825364 ], [ -162.594237, 66.837647 ], [ -162.614738, 66.846476 ], [ -162.621564, 66.850860 ], [ -162.624945, 66.855031 ], [ -162.626696, 66.859572 ], [ -162.623054, 66.874325 ], [ -162.614590, 66.885941 ], [ -162.601052, 66.898455 ], [ -162.582856, 66.904292 ], [ -162.529870, 66.907021 ], [ -162.497438, 66.919860 ], [ -162.492224, 66.939955 ], [ -162.471284, 66.948521 ], [ -162.462718, 66.945666 ], [ -162.444857, 66.925057 ], [ -162.409050, 66.921319 ], [ -162.346352, 66.934792 ], [ -162.310392, 66.937047 ], [ -162.283941, 66.922749 ], [ -162.271769, 66.904144 ], [ -162.228675, 66.866623 ], [ -162.117304, 66.798482 ], [ -162.096878, 66.788500 ], [ -162.073714, 66.783324 ], [ -162.049123, 66.780639 ], [ -162.013623, 66.779406 ], [ -162.011455, 66.759063 ], [ -162.029615, 66.734580 ], [ -162.041314, 66.723764 ], [ -162.058825, 66.716253 ], [ -162.068253, 66.709857 ], [ -162.074634, 66.703681 ], [ -162.081515, 66.693052 ], [ -162.078010, 66.664048 ], [ -162.073620, 66.651217 ], [ -162.069068, 66.645700 ], [ -162.033156, 66.631585 ], [ -161.968863, 66.602611 ], [ -161.953413, 66.592365 ], [ -161.932642, 66.572547 ], [ -161.925440, 66.561215 ], [ -161.915856, 66.551339 ], [ -161.877098, 66.536877 ], [ -161.765368, 66.496934 ], [ -161.624334, 66.450143 ], [ -161.574129, 66.438566 ], [ -161.516449, 66.441839 ], [ -161.435312, 66.454162 ], [ -161.326349, 66.478371 ], [ -161.279803, 66.505179 ], [ -161.293210, 66.520591 ], [ -161.399006, 66.523529 ], [ -161.454092, 66.522205 ], [ -161.469227, 66.522843 ], [ -161.483604, 66.525626 ], [ -161.493509, 66.530977 ], [ -161.494988, 66.534443 ], [ -161.544484, 66.553292 ], [ -161.552099, 66.563762 ], [ -161.542581, 66.566617 ], [ -161.533438, 66.578054 ], [ -161.598953, 66.593181 ], [ -161.665368, 66.610433 ], [ -161.693125, 66.620562 ], [ -161.866180, 66.704978 ], [ -161.881671, 66.716796 ], [ -161.879754, 66.724438 ], [ -161.848104, 66.757926 ], [ -161.847152, 66.768396 ], [ -161.866334, 66.777953 ], [ -161.861540, 66.797076 ], [ -161.846258, 66.813647 ], [ -161.824170, 66.817889 ], [ -161.796307, 66.833126 ], [ -161.785495, 66.846547 ], [ -161.782218, 66.859956 ], [ -161.792900, 66.882610 ], [ -161.781479, 66.892128 ], [ -161.727145, 66.910026 ], [ -161.692146, 66.945033 ], [ -161.685775, 66.955794 ], [ -161.688506, 66.959799 ], [ -161.686280, 66.961367 ], [ -161.674359, 66.961965 ], [ -161.566678, 66.934775 ], [ -161.489169, 66.936950 ], [ -161.485121, 66.945647 ], [ -161.485383, 66.960818 ], [ -161.505747, 66.974314 ], [ -161.530525, 66.984951 ], [ -161.552265, 66.990454 ], [ -161.579700, 66.984451 ], [ -161.589218, 66.984451 ], [ -161.622160, 67.008146 ], [ -161.697392, 67.010849 ], [ -161.711715, 67.001044 ], [ -161.759641, 67.030572 ], [ -161.799175, 67.047502 ], [ -161.810256, 67.050281 ], [ -161.836325, 67.051777 ], [ -161.850188, 67.052186 ], [ -161.893702, 67.049075 ], [ -162.123181, 67.025790 ], [ -162.211633, 67.006710 ], [ -162.233964, 66.999568 ], [ -162.234302, 66.994581 ], [ -162.239230, 66.993814 ], [ -162.353954, 66.995128 ], [ -162.385074, 66.991235 ], [ -162.415866, 66.984710 ], [ -162.432615, 66.985089 ], [ -162.449219, 66.988391 ], [ -162.462616, 66.994323 ], [ -162.466855, 66.999339 ], [ -162.461822, 67.004426 ], [ -162.465522, 67.026629 ], [ -162.472765, 67.038368 ], [ -162.481257, 67.043113 ], [ -162.490552, 67.043331 ], [ -162.504523, 67.039629 ], [ -162.514878, 67.031069 ], [ -162.519046, 67.016552 ], [ -162.603562, 67.010490 ], [ -162.640260, 67.010869 ], [ -162.654094, 67.013099 ], [ -162.661661, 67.018890 ], [ -162.660733, 67.026771 ], [ -162.658706, 67.030335 ], [ -162.660740, 67.033884 ], [ -162.676656, 67.046789 ], [ -162.699069, 67.055476 ], [ -162.782401, 67.044467 ], [ -162.830420, 67.036173 ], [ -162.851315, 67.031883 ], [ -162.859527, 67.025724 ], [ -162.850964, 67.017922 ], [ -162.826314, 67.003237 ], [ -162.817734, 66.996586 ], [ -162.831059, 66.993731 ], [ -162.855805, 66.995634 ], [ -162.901348, 67.006833 ], [ -163.097854, 67.041191 ], [ -163.299266, 67.060748 ], [ -163.399048, 67.074167 ], [ -163.441198, 67.081459 ], [ -163.495201, 67.087503 ], [ -163.577010, 67.092491 ], [ -163.624959, 67.099391 ], [ -163.698870, 67.114443 ], [ -163.730671, 67.123774 ], [ -163.741345, 67.129123 ], [ -163.737724, 67.136802 ], [ -163.736901, 67.163230 ], [ -163.737464, 67.184754 ], [ -163.740820, 67.209960 ], [ -163.758588, 67.256439 ], [ -163.822185, 67.349812 ], [ -163.853584, 67.388101 ], [ -163.878781, 67.416125 ], [ -164.007032, 67.535699 ], [ -164.079514, 67.585856 ], [ -164.108716, 67.601993 ], [ -164.144380, 67.617228 ], [ -164.209816, 67.639079 ], [ -164.533937, 67.725606 ], [ -164.778331, 67.820866 ], [ -164.907297, 67.867844 ], [ -165.057516, 67.921694 ], [ -165.129567, 67.941833 ], [ -165.190915, 67.966071 ], [ -165.227228, 67.985322 ], [ -165.231620, 67.994512 ], [ -165.240848, 67.998714 ], [ -165.430442, 68.045408 ], [ -165.493550, 68.059283 ], [ -165.688018, 68.088937 ], [ -165.830191, 68.103809 ], [ -165.888488, 68.113327 ], [ -165.964036, 68.135931 ], [ -165.985451, 68.150803 ], [ -166.031850, 68.194228 ], [ -166.114537, 68.235274 ], [ -166.220423, 68.269181 ], [ -166.353078, 68.299519 ], [ -166.574962, 68.332832 ], [ -166.680842, 68.340911 ], [ -166.784578, 68.340431 ], [ -166.829715, 68.336324 ], [ -166.846456, 68.332508 ], [ -166.850640, 68.333089 ], [ -166.838178, 68.339714 ], [ -166.811836, 68.348136 ], [ -166.706139, 68.371783 ], [ -166.377564, 68.422406 ], [ -166.362135, 68.426240 ], [ -166.342381, 68.433966 ], [ -166.328459, 68.442261 ], [ -166.305962, 68.461540 ], [ -166.303464, 68.464683 ], [ -166.302030, 68.470413 ], [ -166.295343, 68.510900 ], [ -166.244490, 68.553888 ], [ -166.233780, 68.564263 ], [ -166.226111, 68.576186 ], [ -166.225567, 68.579015 ], [ -166.231432, 68.587338 ], [ -166.229761, 68.613771 ], [ -166.213635, 68.664324 ], [ -166.199826, 68.678556 ], [ -166.197365, 68.690019 ], [ -166.187795, 68.778706 ], [ -166.190209, 68.790437 ], [ -166.195374, 68.803990 ], [ -166.203750, 68.818221 ], [ -166.222496, 68.860441 ], [ -166.224187, 68.873175 ], [ -166.214433, 68.879524 ], [ -165.814938, 68.864158 ], [ -165.666566, 68.855387 ], [ -165.572483, 68.852946 ], [ -165.522358, 68.855839 ], [ -165.327043, 68.858111 ], [ -164.967542, 68.883030 ], [ -164.883745, 68.891649 ], [ -164.812671, 68.893542 ], [ -164.655317, 68.909360 ], [ -164.526887, 68.917909 ], [ -164.299092, 68.927569 ], [ -164.253157, 68.930938 ], [ -164.161249, 68.944773 ], [ -164.130742, 68.951001 ], [ -164.069362, 68.969651 ], [ -163.973678, 68.985044 ], [ -163.893881, 69.011962 ], [ -163.858069, 69.028860 ], [ -163.827447, 69.040632 ], [ -163.724184, 69.066713 ], [ -163.655864, 69.090567 ], [ -163.574034, 69.124077 ], [ -163.535314, 69.141656 ], [ -163.452685, 69.194630 ], [ -163.297956, 69.274725 ], [ -163.236121, 69.282661 ], [ -163.230902, 69.284464 ], [ -163.137614, 69.352178 ], [ -163.110318, 69.375343 ], [ -163.103166, 69.392261 ], [ -163.104387, 69.401350 ], [ -163.100569, 69.414222 ], [ -163.070341, 69.459872 ], [ -163.052068, 69.481971 ], [ -163.046961, 69.482892 ], [ -163.036311, 69.489028 ], [ -163.026170, 69.506890 ], [ -163.016456, 69.538142 ], [ -163.020001, 69.545145 ], [ -163.030290, 69.556591 ], [ -163.074128, 69.570272 ], [ -163.118176, 69.589156 ], [ -163.116622, 69.593416 ], [ -163.111605, 69.596605 ], [ -163.085797, 69.600165 ], [ -163.044497, 69.639572 ], [ -163.043545, 69.667174 ], [ -163.027364, 69.680499 ], [ -162.997859, 69.673837 ], [ -162.955210, 69.680800 ], [ -162.922009, 69.700372 ], [ -162.961086, 69.717165 ], [ -163.010545, 69.728109 ], [ -163.018175, 69.729074 ], [ -163.035390, 69.727406 ], [ -163.012595, 69.757462 ], [ -162.960245, 69.783328 ], [ -162.911869, 69.799471 ], [ -162.877165, 69.804411 ], [ -162.840602, 69.811763 ], [ -162.767210, 69.852179 ], [ -162.709550, 69.879126 ], [ -162.616345, 69.916997 ], [ -162.606297, 69.918988 ], [ -162.601284, 69.914568 ], [ -162.593773, 69.914096 ], [ -162.587906, 69.915637 ], [ -162.481016, 69.975242 ], [ -162.471549, 69.983132 ], [ -162.462304, 70.002438 ], [ -162.468339, 70.015784 ], [ -162.462778, 70.042217 ], [ -162.454541, 70.043958 ], [ -162.394531, 70.044574 ], [ -162.350558, 70.058800 ], [ -162.354740, 70.065479 ], [ -162.356469, 70.076391 ], [ -162.312491, 70.109281 ], [ -162.158156, 70.161530 ], [ -162.098377, 70.187045 ], [ -162.019265, 70.224044 ], [ -161.984888, 70.247681 ], [ -161.959603, 70.268873 ], [ -161.922949, 70.291599 ], [ -161.859745, 70.308048 ], [ -161.849998, 70.309430 ], [ -161.844213, 70.308530 ], [ -161.842162, 70.304429 ], [ -161.844688, 70.300054 ], [ -161.847403, 70.295877 ], [ -161.848909, 70.282183 ], [ -161.834651, 70.272504 ], [ -161.801603, 70.260634 ], [ -161.779794, 70.255411 ], [ -161.769496, 70.262498 ], [ -161.767838, 70.268337 ], [ -161.759176, 70.272443 ], [ -161.692195, 70.267092 ], [ -161.676220, 70.258021 ], [ -161.663593, 70.246187 ], [ -161.633888, 70.240693 ], [ -161.522941, 70.236888 ], [ -161.396757, 70.240606 ], [ -161.309118, 70.248091 ], [ -161.254723, 70.256612 ], [ -161.080282, 70.306679 ], [ -161.016416, 70.327744 ], [ -160.992764, 70.316226 ], [ -160.979126, 70.317661 ], [ -160.839536, 70.344534 ], [ -160.732703, 70.374382 ], [ -160.530362, 70.440751 ], [ -160.489778, 70.454463 ], [ -160.485530, 70.457121 ], [ -160.480062, 70.465971 ], [ -160.214828, 70.559087 ], [ -160.056727, 70.632834 ], [ -159.913805, 70.690673 ], [ -159.798514, 70.731226 ], [ -159.648383, 70.794368 ], [ -159.585714, 70.809475 ], [ -159.528682, 70.820849 ], [ -159.209082, 70.870067 ], [ -159.171810, 70.875103 ], [ -159.147634, 70.876653 ], [ -159.156511, 70.859221 ], [ -159.152026, 70.849543 ], [ -159.132483, 70.828359 ], [ -159.160836, 70.817960 ], [ -159.290577, 70.811262 ], [ -159.331021, 70.807394 ], [ -159.335837, 70.800079 ], [ -159.343075, 70.783115 ], [ -159.299304, 70.760012 ], [ -159.275634, 70.759531 ], [ -159.137790, 70.758609 ], [ -159.000676, 70.764336 ], [ -158.976647, 70.766973 ], [ -158.954571, 70.772712 ], [ -158.965600, 70.786852 ], [ -158.976456, 70.789864 ], [ -158.976615, 70.796377 ], [ -158.656101, 70.787955 ], [ -158.607320, 70.789099 ], [ -158.389500, 70.799729 ], [ -158.385792, 70.811468 ], [ -158.389269, 70.822048 ], [ -158.385816, 70.825704 ], [ -158.250320, 70.817734 ], [ -158.157725, 70.820806 ], [ -158.032397, 70.832263 ], [ -157.884086, 70.853468 ], [ -157.840997, 70.861025 ], [ -157.768452, 70.875842 ], [ -157.708782, 70.891390 ], [ -157.502459, 70.948659 ], [ -157.421001, 70.976805 ], [ -157.392802, 70.987908 ], [ -157.249083, 71.052537 ], [ -157.119621, 71.128682 ], [ -157.072487, 71.154521 ], [ -156.962555, 71.211885 ], [ -156.809653, 71.286886 ], [ -156.773937, 71.299506 ], [ -156.645615, 71.338012 ], [ -156.620140, 71.344209 ], [ -156.568650, 71.352561 ], [ -156.566383, 71.334016 ], [ -156.561512, 71.316809 ], [ -156.556496, 71.311795 ], [ -156.531124, 71.296338 ], [ -156.524499, 71.294469 ], [ -156.402659, 71.267945 ], [ -156.356736, 71.261273 ], [ -156.320702, 71.258952 ], [ -156.301938, 71.260566 ], [ -156.214200, 71.259392 ], [ -156.074411, 71.242489 ], [ -156.029205, 71.203209 ], [ -156.038116, 71.196506 ], [ -156.044754, 71.186770 ], [ -156.044615, 71.184701 ], [ -156.018574, 71.172041 ], [ -155.957961, 71.186211 ], [ -155.920202, 71.207157 ], [ -155.895105, 71.193899 ], [ -155.884180, 71.190057 ], [ -155.829034, 71.192088 ], [ -155.803853, 71.196420 ], [ -155.760802, 71.194662 ], [ -155.657178, 71.182471 ], [ -155.587702, 71.172560 ], [ -155.566925, 71.165139 ], [ -155.567765, 71.141130 ], [ -155.561772, 71.128458 ], [ -155.520737, 71.102476 ], [ -155.513987, 71.096794 ], [ -155.511125, 71.090348 ], [ -155.510637, 71.081152 ], [ -155.533347, 71.067683 ], [ -155.548283, 71.060685 ], [ -155.638994, 71.042360 ], [ -155.705487, 71.020153 ], [ -155.711852, 71.012473 ], [ -155.762068, 70.985644 ], [ -155.830881, 70.965584 ], [ -155.878946, 70.967684 ], [ -155.952050, 70.964831 ], [ -155.978405, 70.962197 ], [ -155.995681, 70.947796 ], [ -156.014769, 70.903133 ], [ -156.014425, 70.898644 ], [ -156.013512, 70.895983 ], [ -155.968559, 70.862931 ], [ -155.969194, 70.827982 ], [ -155.978421, 70.825558 ], [ -155.980975, 70.817355 ], [ -155.978978, 70.808750 ], [ -155.971935, 70.806828 ], [ -155.927958, 70.806010 ], [ -155.906615, 70.809988 ], [ -155.882145, 70.822056 ], [ -155.875096, 70.828895 ], [ -155.731842, 70.831160 ], [ -155.643516, 70.824209 ], [ -155.543031, 70.847175 ], [ -155.504202, 70.860303 ], [ -155.489811, 70.871740 ], [ -155.487980, 70.875299 ], [ -155.485915, 70.885905 ], [ -155.487574, 70.902679 ], [ -155.493044, 70.917371 ], [ -155.475940, 70.943547 ], [ -155.454991, 70.947490 ], [ -155.404225, 70.967477 ], [ -155.382646, 70.978973 ], [ -155.364160, 70.994195 ], [ -155.343871, 71.004449 ], [ -155.260042, 71.015227 ], [ -155.260084, 71.011281 ], [ -155.256177, 71.004762 ], [ -155.211434, 70.978023 ], [ -155.201466, 70.974306 ], [ -155.192246, 70.974056 ], [ -155.182779, 70.978218 ], [ -155.168934, 70.987947 ], [ -155.161735, 70.995715 ], [ -155.159922, 71.002775 ], [ -155.163938, 71.013801 ], [ -155.177000, 71.027450 ], [ -155.273764, 71.064728 ], [ -155.275814, 71.067042 ], [ -155.275989, 71.070464 ], [ -155.262602, 71.079149 ], [ -155.256860, 71.081119 ], [ -155.150524, 71.112050 ], [ -155.146948, 71.110959 ], [ -155.146931, 71.103459 ], [ -155.142858, 71.097254 ], [ -155.125994, 71.077495 ], [ -155.120317, 71.073416 ], [ -155.108509, 71.070475 ], [ -155.075362, 71.072042 ], [ -155.064004, 71.083912 ], [ -155.061428, 71.091999 ], [ -155.064558, 71.108006 ], [ -155.085782, 71.127572 ], [ -155.060764, 71.145422 ], [ -155.031740, 71.146473 ], [ -154.942864, 71.126264 ], [ -154.777335, 71.083231 ], [ -154.616050, 71.026182 ], [ -154.604413, 71.021502 ], [ -154.581129, 71.007321 ], [ -154.567593, 70.989929 ], [ -154.594048, 70.976993 ], [ -154.608294, 70.961716 ], [ -154.654375, 70.903318 ], [ -154.645793, 70.869167 ], [ -154.577386, 70.835335 ], [ -154.519040, 70.822799 ], [ -154.501866, 70.821765 ], [ -154.485700, 70.825304 ], [ -154.430229, 70.831258 ], [ -154.352604, 70.834828 ], [ -154.260799, 70.815164 ], [ -154.228627, 70.802417 ], [ -154.223307, 70.795230 ], [ -154.239166, 70.776866 ], [ -154.181863, 70.768325 ], [ -154.169631, 70.768604 ], [ -154.127487, 70.778133 ], [ -154.069982, 70.793703 ], [ -153.995579, 70.821876 ], [ -153.976014, 70.833925 ], [ -153.951370, 70.854028 ], [ -153.935450, 70.869728 ], [ -153.932949, 70.874201 ], [ -153.934351, 70.876609 ], [ -153.932921, 70.878677 ], [ -153.890480, 70.885719 ], [ -153.774169, 70.894584 ], [ -153.747253, 70.895017 ], [ -153.525976, 70.885500 ], [ -153.485989, 70.885873 ], [ -153.426265, 70.890131 ], [ -153.359112, 70.898292 ], [ -153.326202, 70.904111 ], [ -153.253386, 70.920775 ], [ -153.238480, 70.922467 ], [ -153.137311, 70.925438 ], [ -153.049207, 70.913102 ], [ -153.017038, 70.904004 ], [ -152.774415, 70.885279 ], [ -152.735892, 70.884545 ], [ -152.590148, 70.886933 ], [ -152.456950, 70.871788 ], [ -152.259966, 70.842820 ], [ -152.226464, 70.831043 ], [ -152.187197, 70.801546 ], [ -152.188649, 70.798140 ], [ -152.192460, 70.795294 ], [ -152.239344, 70.793416 ], [ -152.263346, 70.790777 ], [ -152.283763, 70.785600 ], [ -152.370808, 70.730068 ], [ -152.377274, 70.714682 ], [ -152.471531, 70.688840 ], [ -152.473348, 70.683669 ], [ -152.460505, 70.646107 ], [ -152.433781, 70.616926 ], [ -152.420775, 70.608983 ], [ -152.365736, 70.601242 ], [ -152.355679, 70.603794 ], [ -152.341592, 70.612193 ], [ -152.332608, 70.612871 ], [ -152.264049, 70.592655 ], [ -152.200644, 70.586070 ], [ -152.169944, 70.585219 ], [ -152.146165, 70.586754 ], [ -152.060684, 70.574935 ], [ -152.026070, 70.559345 ], [ -151.975785, 70.563215 ], [ -151.880141, 70.554869 ], [ -151.816701, 70.545698 ], [ -151.774703, 70.547925 ], [ -151.745047, 70.554041 ], [ -151.718215, 70.555286 ], [ -151.701467, 70.553220 ], [ -151.695162, 70.549675 ], [ -151.697258, 70.547741 ], [ -151.709462, 70.546490 ], [ -151.722711, 70.541608 ], [ -151.751558, 70.524105 ], [ -151.760248, 70.516711 ], [ -151.734287, 70.503492 ], [ -151.728579, 70.495375 ], [ -151.775537, 70.485353 ], [ -151.824111, 70.484011 ], [ -151.919210, 70.472686 ], [ -151.936783, 70.463564 ], [ -151.946384, 70.452523 ], [ -151.900033, 70.434135 ], [ -151.876122, 70.430761 ], [ -151.844375, 70.434959 ], [ -151.785657, 70.436935 ], [ -151.653184, 70.434800 ], [ -151.605581, 70.437332 ], [ -151.554647, 70.435895 ], [ -151.444897, 70.425405 ], [ -151.343202, 70.408877 ], [ -151.297598, 70.400748 ], [ -151.229919, 70.379840 ], [ -151.187394, 70.384775 ], [ -151.188592, 70.401755 ], [ -151.186516, 70.418208 ], [ -151.180436, 70.430401 ], [ -151.123105, 70.439374 ], [ -151.118601, 70.438088 ], [ -151.114352, 70.432886 ], [ -151.116099, 70.422403 ], [ -151.060430, 70.418734 ], [ -151.026337, 70.441455 ], [ -150.957813, 70.452610 ], [ -150.895452, 70.458158 ], [ -150.877322, 70.455182 ], [ -150.834973, 70.460171 ], [ -150.787069, 70.477117 ], [ -150.780029, 70.485986 ], [ -150.762035, 70.497219 ], [ -150.719845, 70.494998 ], [ -150.651175, 70.494928 ], [ -150.614734, 70.498292 ], [ -150.429915, 70.498172 ], [ -150.357384, 70.493738 ], [ -150.354056, 70.492724 ], [ -150.338851, 70.471075 ], [ -150.370283, 70.447858 ], [ -150.350541, 70.435998 ], [ -150.296287, 70.441136 ], [ -150.245325, 70.441658 ], [ -150.185078, 70.435370 ], [ -150.112899, 70.431372 ], [ -150.104388, 70.432091 ], [ -150.074461, 70.439333 ], [ -149.866698, 70.510769 ], [ -149.819740, 70.491428 ], [ -149.810924, 70.490477 ], [ -149.790427, 70.491190 ], [ -149.740188, 70.498151 ], [ -149.728247, 70.502793 ], [ -149.716075, 70.504968 ], [ -149.661165, 70.509203 ], [ -149.656806, 70.508713 ], [ -149.649556, 70.504757 ], [ -149.581348, 70.495891 ], [ -149.565278, 70.496450 ], [ -149.536891, 70.499397 ], [ -149.524235, 70.502128 ], [ -149.509854, 70.508746 ], [ -149.461755, 70.518271 ], [ -149.432083, 70.503750 ], [ -149.418727, 70.492257 ], [ -149.400623, 70.489931 ], [ -149.314473, 70.495325 ], [ -149.179148, 70.485700 ], [ -149.082079, 70.464894 ], [ -148.959443, 70.423944 ], [ -148.928979, 70.426835 ], [ -148.858069, 70.422917 ], [ -148.789577, 70.402746 ], [ -148.728082, 70.413035 ], [ -148.698770, 70.425878 ], [ -148.696768, 70.429160 ], [ -148.667017, 70.430084 ], [ -148.610566, 70.422588 ], [ -148.590007, 70.416956 ], [ -148.580356, 70.412546 ], [ -148.477044, 70.359068 ], [ -148.464543, 70.340159 ], [ -148.477028, 70.320872 ], [ -148.466150, 70.313609 ], [ -148.450639, 70.308437 ], [ -148.411253, 70.302627 ], [ -148.363196, 70.302627 ], [ -148.351437, 70.304453 ], [ -148.269800, 70.329617 ], [ -148.258200, 70.336996 ], [ -148.203477, 70.348188 ], [ -148.152676, 70.347148 ], [ -148.107231, 70.342801 ], [ -148.090580, 70.337432 ], [ -148.089576, 70.335423 ], [ -148.089676, 70.332812 ], [ -148.089174, 70.331005 ], [ -148.076865, 70.327510 ], [ -147.961500, 70.314201 ], [ -147.863719, 70.293317 ], [ -147.817637, 70.276938 ], [ -147.789357, 70.247972 ], [ -147.765104, 70.219806 ], [ -147.681722, 70.199954 ], [ -147.648000, 70.203299 ], [ -147.585678, 70.203398 ], [ -147.505270, 70.200384 ], [ -147.431532, 70.188826 ], [ -147.402283, 70.185273 ], [ -147.385271, 70.185256 ], [ -147.350145, 70.187683 ], [ -147.272477, 70.199222 ], [ -147.250586, 70.197318 ], [ -147.219210, 70.178826 ], [ -147.182123, 70.160350 ], [ -147.161601, 70.155612 ], [ -146.991109, 70.147610 ], [ -146.973212, 70.151857 ], [ -146.909516, 70.173259 ], [ -146.885771, 70.185917 ], [ -146.734021, 70.175475 ], [ -146.713053, 70.175398 ], [ -146.624761, 70.182398 ], [ -146.508133, 70.186044 ], [ -146.448860, 70.183398 ], [ -146.413197, 70.178250 ], [ -146.335147, 70.176235 ], [ -146.309558, 70.178907 ], [ -146.272965, 70.176944 ], [ -146.172672, 70.165894 ], [ -146.129579, 70.158948 ], [ -146.114124, 70.154956 ], [ -146.096827, 70.145151 ], [ -146.006411, 70.140402 ], [ -145.955164, 70.140199 ], [ -145.917674, 70.142525 ], [ -145.872923, 70.148829 ], [ -145.858297, 70.165996 ], [ -145.842689, 70.164102 ], [ -145.790386, 70.148569 ], [ -145.783327, 70.139454 ], [ -145.767092, 70.128717 ], [ -145.760443, 70.126113 ], [ -145.623306, 70.084375 ], [ -145.579972, 70.076804 ], [ -145.522384, 70.077465 ], [ -145.505682, 70.074528 ], [ -145.469508, 70.059136 ], [ -145.468856, 70.048336 ], [ -145.434830, 70.036994 ], [ -145.408182, 70.031572 ], [ -145.331553, 70.022596 ], [ -145.247167, 70.017891 ], [ -145.218593, 70.007280 ], [ -145.197331, 69.994954 ], [ -145.175073, 69.991707 ], [ -145.011711, 69.981144 ], [ -144.990131, 69.977680 ], [ -144.966761, 69.964362 ], [ -144.953637, 69.959262 ], [ -144.902304, 69.964510 ], [ -144.867623, 69.972266 ], [ -144.863111, 69.973524 ], [ -144.856954, 69.985987 ], [ -144.854539, 69.986364 ], [ -144.792614, 69.979796 ], [ -144.738976, 69.970112 ], [ -144.672305, 69.966876 ], [ -144.618671, 69.969315 ], [ -144.589172, 69.977611 ], [ -144.512258, 70.004478 ], [ -144.463286, 70.025735 ], [ -144.344073, 70.034374 ], [ -144.328391, 70.032555 ], [ -144.231051, 70.035912 ], [ -144.178194, 70.041742 ], [ -144.130283, 70.057951 ], [ -144.122641, 70.059138 ], [ -144.079634, 70.058961 ], [ -144.053709, 70.073182 ], [ -143.911494, 70.129837 ], [ -143.887688, 70.130736 ], [ -143.839879, 70.125827 ], [ -143.782213, 70.124668 ], [ -143.769015, 70.135066 ], [ -143.753065, 70.137242 ], [ -143.662250, 70.142517 ], [ -143.617407, 70.139915 ], [ -143.595181, 70.142521 ], [ -143.597879, 70.147204 ], [ -143.593813, 70.152604 ], [ -143.574986, 70.154598 ], [ -143.543230, 70.149742 ], [ -143.498058, 70.140100 ], [ -143.497982, 70.136875 ], [ -143.511617, 70.125191 ], [ -143.516098, 70.116362 ], [ -143.517248, 70.104293 ], [ -143.510081, 70.096436 ], [ -143.503487, 70.093458 ], [ -143.455354, 70.092934 ], [ -143.357961, 70.094970 ], [ -143.327114, 70.103127 ], [ -143.317900, 70.111145 ], [ -143.265892, 70.119286 ], [ -143.255576, 70.119330 ], [ -143.200147, 70.110323 ], [ -143.159929, 70.099203 ], [ -143.140019, 70.092997 ], [ -143.112951, 70.078271 ], [ -143.051291, 70.078188 ], [ -143.038100, 70.093888 ], [ -142.939555, 70.074380 ], [ -142.746807, 70.042531 ], [ -142.498036, 69.973611 ], [ -142.272156, 69.907044 ], [ -142.239873, 69.896598 ], [ -142.112714, 69.862162 ], [ -142.081696, 69.855498 ], [ -141.842843, 69.811927 ], [ -141.713369, 69.789497 ], [ -141.606229, 69.761695 ], [ -141.528197, 69.736025 ], [ -141.430840, 69.695144 ], [ -141.434872, 69.675245 ], [ -141.428856, 69.662658 ], [ -141.394082, 69.640846 ], [ -141.377718, 69.634631 ], [ -141.280849, 69.631025 ], [ -141.258558, 69.632247 ], [ -141.254547, 69.637053 ], [ -141.243946, 69.652482 ], [ -141.210456, 69.684190 ], [ -141.119233, 69.673527 ], [ -141.002672, 69.645609 ], [ -141.002694, 68.498391 ], [ -141.002465, 65.840075 ], [ -141.002133, 62.124686 ], [ -141.002492, 62.110026 ], [ -141.002072, 61.749667 ], [ -141.002595, 61.745391 ], [ -141.002052, 61.678696 ], [ -141.001840, 60.306105 ], [ -140.535090, 60.224224 ], [ -140.472292, 60.310590 ], [ -139.989142, 60.185240 ], [ -139.738924, 60.318420 ], [ -139.698361, 60.340421 ], [ -139.086669, 60.357654 ], [ -139.082246, 60.323825 ], [ -139.200346, 60.090701 ], [ -139.060938, 60.010967 ], [ -139.057043, 60.006825 ], [ -139.053597, 60.001864 ], [ -139.046426, 59.998235 ], [ -139.031643, 59.993700 ], [ -138.796083, 59.928701 ], [ -138.702053, 59.910245 ], [ -138.662769, 59.813719 ], [ -138.662972, 59.810225 ], [ -138.643422, 59.792502 ], [ -138.630953, 59.782209 ], [ -138.620931, 59.770559 ], [ -138.584819, 59.752453 ], [ -138.560226, 59.741201 ], [ -138.001128, 59.452164 ], [ -137.604277, 59.243057 ], [ -137.504049, 59.002092 ], [ -137.498558, 58.986694 ], [ -137.526424, 58.906834 ], [ -137.447383, 58.909513 ], [ -137.264752, 59.002352 ], [ -136.863896, 59.138472 ], [ -136.826633, 59.158389 ], [ -136.581521, 59.164909 ], [ -136.486609, 59.261108 ], [ -136.494084, 59.272990 ], [ -136.466815, 59.284252 ], [ -136.474326, 59.464194 ], [ -136.365825, 59.448008 ], [ -136.358141, 59.449799 ], [ -136.301846, 59.464128 ], [ -136.234229, 59.524731 ], [ -136.236527, 59.538272 ], [ -136.237340, 59.558734 ], [ -136.261230, 59.594750 ], [ -136.256889, 59.623646 ], [ -136.190352, 59.639854 ], [ -135.945905, 59.663802 ], [ -135.858947, 59.690049 ], [ -135.854166, 59.691846 ], [ -135.477436, 59.799626 ], [ -135.254125, 59.701339 ], [ -135.243777, 59.697950 ], [ -135.234447, 59.697931 ], [ -135.231148, 59.697176 ], [ -135.214344, 59.664343 ], [ -135.166736, 59.632240 ], [ -135.162745, 59.630635 ], [ -135.153113, 59.625159 ], [ -135.114588, 59.623415 ], [ -135.027456, 59.563692 ], [ -135.026373, 59.535741 ], [ -135.026328, 59.474658 ], [ -135.071239, 59.453309 ], [ -135.067356, 59.421855 ], [ -135.016206, 59.395398 ], [ -135.010033, 59.381288 ], [ -135.016206, 59.361005 ], [ -135.029245, 59.345364 ], [ -135.003250, 59.319473 ], [ -134.961972, 59.280376 ], [ -134.702383, 59.247836 ], [ -134.681924, 59.190843 ], [ -134.566689, 59.128278 ], [ -134.481241, 59.128071 ], [ -134.442196, 59.083010 ], [ -134.379771, 59.034961 ], [ -134.400293, 58.996484 ], [ -134.401042, 58.976221 ], [ -134.327982, 58.963431 ], [ -134.306390, 58.959238 ], [ -134.328964, 58.919593 ], [ -134.250526, 58.858046 ], [ -133.992081, 58.774581 ], [ -133.840392, 58.727991 ], [ -133.723635, 58.626004 ], [ -133.714186, 58.618137 ], [ -133.699835, 58.607290 ], [ -133.615751, 58.555784 ], [ -133.559942, 58.522318 ], [ -133.499893, 58.490276 ], [ -133.379908, 58.427909 ], [ -133.461475, 58.385526 ], [ -133.460377, 58.383610 ], [ -133.385718, 58.311023 ], [ -133.359691, 58.284789 ], [ -133.343725, 58.270915 ], [ -133.222898, 58.186368 ], [ -133.213311, 58.178605 ], [ -133.191526, 58.162296 ], [ -133.176444, 58.150151 ], [ -133.148760, 58.109536 ], [ -133.076421, 57.999762 ], [ -132.869318, 57.842941 ], [ -132.756813, 57.705093 ], [ -132.658124, 57.619486 ], [ -132.559178, 57.503927 ], [ -132.367984, 57.348685 ], [ -132.297920, 57.269469 ], [ -132.252187, 57.215655 ], [ -132.315982, 57.163473 ], [ -132.371312, 57.095229 ], [ -132.225186, 57.060455 ], [ -132.051044, 57.051155 ], [ -132.071126, 57.006290 ], [ -132.090738, 56.936483 ], [ -132.125934, 56.874698 ], [ -132.080262, 56.850926 ], [ -132.005107, 56.842920 ], [ -131.930100, 56.835211 ], [ -131.871725, 56.804965 ], [ -131.886500, 56.776083 ], [ -131.896722, 56.759737 ], [ -131.901760, 56.753158 ], [ -131.862035, 56.704136 ], [ -131.849898, 56.661227 ], [ -131.844866, 56.638977 ], [ -131.835133, 56.601849 ], [ -131.761209, 56.603960 ], [ -131.581221, 56.613275 ], [ -131.495949, 56.565543 ], [ -131.461806, 56.547904 ], [ -131.363465, 56.515690 ], [ -131.227928, 56.469099 ], [ -131.191822, 56.455776 ], [ -131.167925, 56.448361 ], [ -131.130165, 56.428534 ], [ -131.085704, 56.406540 ], [ -131.067428, 56.403797 ], [ -131.016127, 56.397950 ], [ -130.881454, 56.380295 ], [ -130.831462, 56.374356 ], [ -130.810707, 56.371063 ], [ -130.782231, 56.367511 ], [ -130.740619, 56.342953 ], [ -130.644312, 56.281075 ], [ -130.622482, 56.267939 ], [ -130.589182, 56.260394 ], [ -130.541173, 56.248017 ], [ -130.466874, 56.239789 ], [ -130.425575, 56.140676 ], [ -130.343716, 56.127162 ], [ -130.245540, 56.096876 ], [ -130.102761, 56.116696 ], [ -130.061273, 56.068508 ], [ -130.035943, 56.040141 ], [ -130.031573, 56.036791 ], [ -130.016874, 56.017323 ], [ -130.004260, 55.993379 ], [ -130.015364, 55.984656 ], [ -130.020250, 55.964362 ], [ -130.023189, 55.930665 ], [ -130.025929, 55.915995 ], [ -130.021425, 55.915641 ], [ -130.013198, 55.916382 ], [ -130.084510, 55.823997 ], [ -130.123720, 55.807040 ], [ -130.128538, 55.802148 ], [ -130.133595, 55.790630 ], [ -130.142537, 55.779024 ], [ -130.150595, 55.767031 ], [ -130.151509, 55.746029 ], [ -130.150061, 55.727099 ], [ -130.148040, 55.715041 ], [ -130.129518, 55.699806 ], [ -130.111677, 55.682051 ], [ -130.117456, 55.640543 ], [ -130.124084, 55.602760 ], [ -130.126743, 55.581282 ], [ -130.120132, 55.563919 ], [ -130.110311, 55.545067 ], [ -130.095588, 55.511205 ], [ -130.085413, 55.491517 ], [ -130.044303, 55.451970 ], [ -130.039928, 55.429422 ], [ -130.030182, 55.367696 ], [ -130.023558, 55.338259 ], [ -129.991900, 55.311663 ], [ -129.982348, 55.302079 ], [ -129.980487, 55.296334 ], [ -129.979511, 55.286723 ], [ -129.980058, 55.284230 ], [ -129.983796, 55.280795 ], [ -129.985379, 55.277760 ], [ -129.996092, 55.269559 ], [ -130.001735, 55.264557 ], [ -130.030162, 55.246592 ], [ -130.043659, 55.235541 ], [ -130.065963, 55.220163 ], [ -130.079854, 55.208527 ], [ -130.096546, 55.197953 ], [ -130.104749, 55.188975 ], [ -130.118919, 55.176074 ], [ -130.134811, 55.158273 ], [ -130.144723, 55.146038 ], [ -130.152912, 55.124537 ], [ -130.158117, 55.117104 ], [ -130.169294, 55.105424 ], [ -130.182707, 55.093212 ], [ -130.182375, 55.079388 ], [ -130.187541, 55.064665 ], [ -130.209512, 55.040822 ], [ -130.221512, 55.025990 ], [ -130.232294, 55.015597 ], [ -130.242959, 55.007316 ], [ -130.247951, 55.002341 ], [ -130.259079, 54.987642 ], [ -130.275560, 54.972930 ], [ -130.308016, 54.947585 ], [ -130.339504, 54.921376 ], [ -130.409764, 54.881192 ], [ -130.474605, 54.838102 ], [ -130.569366, 54.790869 ], [ -130.617106, 54.781554 ], [ -130.636745, 54.778456 ], [ -130.657754, 54.761828 ], [ -130.628070, 54.739341 ], [ -130.644479, 54.736897 ], [ -130.685213, 54.720091 ], [ -130.686192, 54.716910 ], [ -130.695817, 54.719346 ], [ -130.737423, 54.753545 ], [ -130.747227, 54.772600 ], [ -130.733209, 54.779610 ], [ -130.732201, 54.782620 ], [ -130.736295, 54.794798 ], [ -130.742316, 54.801914 ], [ -130.773606, 54.820845 ], [ -130.787444, 54.822905 ], [ -130.788570, 54.794643 ], [ -130.792122, 54.784784 ], [ -130.806815, 54.776862 ], [ -130.836853, 54.765437 ], [ -130.854966, 54.766341 ], [ -130.866866, 54.769068 ], [ -130.901801, 54.780876 ], [ -130.915936, 54.789617 ], [ -130.932454, 54.806938 ], [ -130.947098, 54.826047 ], [ -130.941029, 54.841587 ], [ -130.953430, 54.857138 ], [ -130.955215, 54.863086 ], [ -130.954620, 54.895804 ], [ -130.956999, 54.902347 ], [ -130.975440, 54.921383 ], [ -130.975440, 54.925547 ], [ -130.967707, 54.932686 ], [ -130.960400, 54.933685 ], [ -130.950456, 54.931496 ], [ -130.947481, 54.932686 ], [ -130.946292, 54.947557 ], [ -130.952240, 54.956480 ], [ -130.964732, 54.962429 ], [ -130.975440, 54.969567 ], [ -130.979604, 54.980275 ], [ -130.992096, 54.992767 ], [ -130.999182, 54.995129 ], [ -131.007787, 54.991300 ], [ -131.012061, 54.996238 ], [ -131.004216, 55.029605 ], [ -130.986802, 55.065222 ], [ -130.983730, 55.068946 ], [ -130.897513, 55.089135 ], [ -130.868364, 55.105197 ], [ -130.855277, 55.117689 ], [ -130.846354, 55.119473 ], [ -130.827319, 55.117689 ], [ -130.821370, 55.110550 ], [ -130.818396, 55.095084 ], [ -130.804119, 55.080212 ], [ -130.792222, 55.074858 ], [ -130.767237, 55.079617 ], [ -130.729166, 55.089730 ], [ -130.719648, 55.096868 ], [ -130.708940, 55.122448 ], [ -130.710130, 55.128991 ], [ -130.714294, 55.131371 ], [ -130.728571, 55.128991 ], [ -130.741063, 55.098653 ], [ -130.771996, 55.090920 ], [ -130.777350, 55.092110 ], [ -130.795196, 55.100438 ], [ -130.806498, 55.126612 ], [ -130.815421, 55.136724 ], [ -130.820775, 55.138509 ], [ -130.826129, 55.136724 ], [ -130.832672, 55.131965 ], [ -130.855277, 55.128396 ], [ -130.870744, 55.121258 ], [ -130.876098, 55.115309 ], [ -130.899297, 55.102222 ], [ -130.931420, 55.092704 ], [ -130.984157, 55.084410 ], [ -131.013215, 55.090069 ], [ -131.029676, 55.099478 ], [ -131.068834, 55.121258 ], [ -131.077162, 55.129586 ], [ -131.077162, 55.136130 ], [ -131.076646, 55.146178 ], [ -131.085579, 55.158233 ], [ -131.087497, 55.163036 ], [ -131.093806, 55.191335 ], [ -131.092605, 55.192711 ], [ -130.985304, 55.247286 ], [ -130.952956, 55.273092 ], [ -130.951572, 55.291648 ], [ -130.925069, 55.300713 ], [ -130.909948, 55.299878 ], [ -130.871329, 55.293780 ], [ -130.859441, 55.294959 ], [ -130.838026, 55.292579 ], [ -130.818396, 55.292579 ], [ -130.801144, 55.295553 ], [ -130.754150, 55.300907 ], [ -130.739279, 55.297933 ], [ -130.723217, 55.298528 ], [ -130.701207, 55.305071 ], [ -130.683361, 55.308046 ], [ -130.680982, 55.309830 ], [ -130.680982, 55.312805 ], [ -130.686930, 55.321133 ], [ -130.686930, 55.328271 ], [ -130.689905, 55.330650 ], [ -130.694664, 55.330650 ], [ -130.700612, 55.325892 ], [ -130.709535, 55.313994 ], [ -130.725597, 55.305071 ], [ -130.731545, 55.305071 ], [ -130.741658, 55.310425 ], [ -130.763668, 55.311020 ], [ -130.823749, 55.302692 ], [ -130.836836, 55.299717 ], [ -130.846354, 55.299717 ], [ -130.864918, 55.309469 ], [ -130.871857, 55.313991 ], [ -130.882146, 55.358831 ], [ -130.920800, 55.428721 ], [ -130.922985, 55.435113 ], [ -130.920295, 55.446085 ], [ -130.910744, 55.459982 ], [ -130.898129, 55.470177 ], [ -130.881297, 55.495582 ], [ -130.877117, 55.510395 ], [ -130.878350, 55.526240 ], [ -130.877755, 55.528620 ], [ -130.870524, 55.533768 ], [ -130.872056, 55.544301 ], [ -130.859441, 55.544802 ], [ -130.841595, 55.544207 ], [ -130.829698, 55.542423 ], [ -130.824344, 55.543017 ], [ -130.810662, 55.549561 ], [ -130.807688, 55.548966 ], [ -130.805309, 55.544802 ], [ -130.802334, 55.536474 ], [ -130.790437, 55.530525 ], [ -130.786273, 55.529930 ], [ -130.783893, 55.531715 ], [ -130.784488, 55.540043 ], [ -130.792222, 55.550156 ], [ -130.802334, 55.556699 ], [ -130.803524, 55.559079 ], [ -130.791627, 55.569191 ], [ -130.779729, 55.568597 ], [ -130.759504, 55.570976 ], [ -130.753555, 55.573355 ], [ -130.752366, 55.579899 ], [ -130.724407, 55.593581 ], [ -130.723217, 55.595960 ], [ -130.724407, 55.597745 ], [ -130.741063, 55.596555 ], [ -130.754150, 55.588227 ], [ -130.758909, 55.582873 ], [ -130.761883, 55.577520 ], [ -130.769617, 55.574545 ], [ -130.781514, 55.572761 ], [ -130.796980, 55.576330 ], [ -130.799955, 55.574545 ], [ -130.810662, 55.566217 ], [ -130.815421, 55.553725 ], [ -130.817801, 55.551940 ], [ -130.829698, 55.548966 ], [ -130.856467, 55.552535 ], [ -130.874008, 55.557706 ], [ -130.880013, 55.598954 ], [ -130.901872, 55.697380 ], [ -130.939017, 55.754831 ], [ -130.969758, 55.784741 ], [ -130.958062, 55.789765 ], [ -130.944380, 55.796309 ], [ -130.929508, 55.808801 ], [ -130.930698, 55.812965 ], [ -130.932482, 55.815345 ], [ -130.942595, 55.815345 ], [ -130.949734, 55.808801 ], [ -130.984773, 55.799349 ], [ -131.093956, 55.895675 ], [ -131.171406, 55.942952 ], [ -131.187429, 55.956010 ], [ -131.216475, 55.984342 ], [ -131.213259, 55.989045 ], [ -131.175187, 56.008081 ], [ -131.159126, 56.011650 ], [ -131.106183, 56.036040 ], [ -131.103804, 56.040799 ], [ -131.103804, 56.049722 ], [ -131.105588, 56.056860 ], [ -131.118080, 56.058050 ], [ -131.129383, 56.054481 ], [ -131.154367, 56.036040 ], [ -131.189464, 56.024737 ], [ -131.212664, 56.010461 ], [ -131.228725, 56.005107 ], [ -131.294161, 55.992615 ], [ -131.307248, 55.987856 ], [ -131.340560, 55.967035 ], [ -131.339160, 55.961610 ], [ -131.331691, 55.957253 ], [ -131.311412, 55.965251 ], [ -131.287022, 55.971794 ], [ -131.254899, 55.971794 ], [ -131.245949, 55.965905 ], [ -131.241704, 55.955069 ], [ -131.156834, 55.901147 ], [ -131.070138, 55.828551 ], [ -131.053217, 55.799843 ], [ -131.043527, 55.766997 ], [ -131.040966, 55.762837 ], [ -130.998638, 55.723538 ], [ -130.965994, 55.688974 ], [ -130.946830, 55.650716 ], [ -130.938575, 55.618812 ], [ -130.942595, 55.609521 ], [ -130.950923, 55.601788 ], [ -130.952708, 55.592865 ], [ -130.949734, 55.590486 ], [ -130.930780, 55.588685 ], [ -130.927651, 55.576585 ], [ -130.945177, 55.557731 ], [ -130.954919, 55.555740 ], [ -130.965200, 55.560148 ], [ -130.972338, 55.568476 ], [ -130.975313, 55.568476 ], [ -130.977097, 55.567286 ], [ -130.978916, 55.550835 ], [ -130.987103, 55.539872 ], [ -130.974123, 55.526240 ], [ -130.973528, 55.522076 ], [ -130.979477, 55.509584 ], [ -130.983046, 55.495902 ], [ -130.983046, 55.488764 ], [ -130.994376, 55.472396 ], [ -130.969588, 55.393281 ], [ -130.971744, 55.385257 ], [ -130.989437, 55.378042 ], [ -131.000594, 55.398012 ], [ -131.008726, 55.404818 ], [ -131.029045, 55.408395 ], [ -131.033054, 55.393118 ], [ -131.034191, 55.379358 ], [ -131.030521, 55.376917 ], [ -131.027301, 55.371392 ], [ -131.019881, 55.347905 ], [ -131.041938, 55.328150 ], [ -131.049671, 55.323391 ], [ -131.049076, 55.301381 ], [ -131.056214, 55.290674 ], [ -131.056214, 55.279966 ], [ -131.065161, 55.259250 ], [ -131.072348, 55.253822 ], [ -131.160492, 55.197481 ], [ -131.188747, 55.192745 ], [ -131.211230, 55.192379 ], [ -131.235516, 55.197574 ], [ -131.263089, 55.208318 ], [ -131.297162, 55.235046 ], [ -131.316171, 55.240705 ], [ -131.325094, 55.241895 ], [ -131.326878, 55.244869 ], [ -131.317360, 55.248438 ], [ -131.302697, 55.250217 ], [ -131.278302, 55.260319 ], [ -131.240190, 55.287156 ], [ -131.230432, 55.297802 ], [ -131.191595, 55.360527 ], [ -131.191933, 55.368334 ], [ -131.197489, 55.391051 ], [ -131.202477, 55.392834 ], [ -131.225568, 55.391164 ], [ -131.233484, 55.383473 ], [ -131.240028, 55.380498 ], [ -131.244192, 55.382878 ], [ -131.245545, 55.389719 ], [ -131.272447, 55.387774 ], [ -131.292102, 55.383946 ], [ -131.293043, 55.378684 ], [ -131.279884, 55.368601 ], [ -131.287016, 55.358260 ], [ -131.264608, 55.345639 ], [ -131.254461, 55.329698 ], [ -131.255107, 55.322104 ], [ -131.284986, 55.286437 ], [ -131.291203, 55.281751 ], [ -131.326989, 55.265911 ], [ -131.348703, 55.257949 ], [ -131.363760, 55.263905 ], [ -131.369114, 55.267474 ], [ -131.373278, 55.266879 ], [ -131.376847, 55.263310 ], [ -131.411944, 55.261525 ], [ -131.455431, 55.275218 ], [ -131.470241, 55.285915 ], [ -131.478569, 55.296622 ], [ -131.478569, 55.300786 ], [ -131.475602, 55.303263 ], [ -131.462968, 55.312648 ], [ -131.471976, 55.323386 ], [ -131.494146, 55.332310 ], [ -131.509811, 55.332310 ], [ -131.515257, 55.327938 ], [ -131.528201, 55.295349 ], [ -131.536510, 55.292352 ], [ -131.550044, 55.293389 ], [ -131.566677, 55.306068 ], [ -131.584842, 55.309588 ], [ -131.639031, 55.339481 ], [ -131.698743, 55.354873 ], [ -131.732441, 55.377553 ], [ -131.735939, 55.381905 ], [ -131.736654, 55.392206 ], [ -131.741834, 55.398074 ], [ -131.828446, 55.445214 ], [ -131.835488, 55.449503 ], [ -131.834893, 55.460805 ], [ -131.827160, 55.470323 ], [ -131.807529, 55.477461 ], [ -131.785519, 55.479246 ], [ -131.718299, 55.517912 ], [ -131.710566, 55.526240 ], [ -131.696884, 55.556578 ], [ -131.684392, 55.568476 ], [ -131.670710, 55.561932 ], [ -131.665356, 55.557173 ], [ -131.660598, 55.558363 ], [ -131.657623, 55.566691 ], [ -131.661192, 55.573829 ], [ -131.662977, 55.582752 ], [ -131.654172, 55.592431 ], [ -131.671471, 55.606573 ], [ -131.682849, 55.610488 ], [ -131.701091, 55.613684 ], [ -131.724359, 55.632559 ], [ -131.726322, 55.635930 ], [ -131.726615, 55.641000 ], [ -131.719546, 55.650282 ], [ -131.712102, 55.665797 ], [ -131.701147, 55.696960 ], [ -131.706744, 55.706435 ], [ -131.726467, 55.720826 ], [ -131.733408, 55.730832 ], [ -131.719308, 55.749099 ], [ -131.704907, 55.755541 ], [ -131.682013, 55.760617 ], [ -131.670115, 55.770135 ], [ -131.649625, 55.768728 ], [ -131.634423, 55.764781 ], [ -131.626690, 55.763591 ], [ -131.618362, 55.764186 ], [ -131.602301, 55.773109 ], [ -131.582075, 55.780248 ], [ -131.571368, 55.779653 ], [ -131.562445, 55.775489 ], [ -131.539840, 55.776084 ], [ -131.508907, 55.784412 ], [ -131.504743, 55.787386 ], [ -131.504148, 55.789765 ], [ -131.507122, 55.793335 ], [ -131.522589, 55.796904 ], [ -131.539245, 55.803447 ], [ -131.544004, 55.802258 ], [ -131.546383, 55.795119 ], [ -131.551737, 55.791550 ], [ -131.586239, 55.791550 ], [ -131.610629, 55.783817 ], [ -131.629070, 55.783222 ], [ -131.640294, 55.785274 ], [ -131.640141, 55.789355 ], [ -131.653124, 55.795735 ], [ -131.678213, 55.799837 ], [ -131.691058, 55.797561 ], [ -131.697211, 55.793768 ], [ -131.700951, 55.788977 ], [ -131.705259, 55.789939 ], [ -131.710448, 55.806620 ], [ -131.712608, 55.837214 ], [ -131.677849, 55.839734 ], [ -131.658813, 55.839734 ], [ -131.610629, 55.836165 ], [ -131.547573, 55.834975 ], [ -131.524968, 55.837950 ], [ -131.517235, 55.843303 ], [ -131.520804, 55.845088 ], [ -131.558876, 55.849252 ], [ -131.563040, 55.851037 ], [ -131.562445, 55.861149 ], [ -131.570773, 55.875426 ], [ -131.586239, 55.884349 ], [ -131.596947, 55.897436 ], [ -131.593973, 55.906954 ], [ -131.586239, 55.912308 ], [ -131.579114, 55.917638 ], [ -131.587774, 55.923898 ], [ -131.604085, 55.920636 ], [ -131.611819, 55.921826 ], [ -131.613603, 55.925990 ], [ -131.610629, 55.929559 ], [ -131.613008, 55.937292 ], [ -131.630854, 55.933723 ], [ -131.680228, 55.915877 ], [ -131.720384, 55.894659 ], [ -131.776737, 55.878784 ], [ -131.828176, 55.877284 ], [ -131.836962, 55.875472 ], [ -131.852739, 55.871857 ], [ -131.908061, 55.866503 ], [ -131.911036, 55.861149 ], [ -131.911036, 55.856985 ], [ -131.890215, 55.845088 ], [ -131.844411, 55.845683 ], [ -131.816310, 55.837449 ], [ -131.777033, 55.823261 ], [ -131.771248, 55.810028 ], [ -131.779908, 55.791904 ], [ -131.814759, 55.731350 ], [ -131.826160, 55.718580 ], [ -131.852144, 55.720166 ], [ -131.856903, 55.718977 ], [ -131.857498, 55.714218 ], [ -131.831407, 55.681342 ], [ -131.828887, 55.667148 ], [ -131.865395, 55.630680 ], [ -131.897413, 55.603914 ], [ -131.939318, 55.623844 ], [ -131.963121, 55.615263 ], [ -131.962642, 55.608708 ], [ -131.945303, 55.572441 ], [ -131.936689, 55.535151 ], [ -131.971792, 55.498279 ], [ -131.986493, 55.500619 ], [ -132.014613, 55.515238 ], [ -132.043772, 55.535742 ], [ -132.060504, 55.543030 ], [ -132.098521, 55.550015 ], [ -132.114654, 55.550623 ], [ -132.141118, 55.559010 ], [ -132.148383, 55.562481 ], [ -132.183207, 55.588128 ], [ -132.198652, 55.615721 ], [ -132.201500, 55.626376 ], [ -132.197869, 55.633967 ], [ -132.215409, 55.682270 ], [ -132.224167, 55.701766 ], [ -132.237532, 55.711347 ], [ -132.260119, 55.732293 ], [ -132.283594, 55.761774 ], [ -132.280431, 55.765599 ], [ -132.265071, 55.762174 ], [ -132.251732, 55.756247 ], [ -132.229647, 55.740488 ], [ -132.206951, 55.736987 ], [ -132.190479, 55.742501 ], [ -132.185478, 55.753161 ], [ -132.184982, 55.778776 ], [ -132.187494, 55.785595 ], [ -132.183163, 55.800830 ], [ -132.130413, 55.811419 ], [ -132.113361, 55.812718 ], [ -132.076911, 55.812484 ], [ -132.072747, 55.816054 ], [ -132.072747, 55.821407 ], [ -132.091782, 55.835089 ], [ -132.095352, 55.849961 ], [ -132.082859, 55.862453 ], [ -132.053116, 55.883273 ], [ -132.049547, 55.889817 ], [ -132.050737, 55.899335 ], [ -132.064419, 55.917776 ], [ -132.069772, 55.930268 ], [ -132.066798, 55.942165 ], [ -132.041795, 55.958795 ], [ -131.978758, 55.965365 ], [ -131.972809, 55.968934 ], [ -131.970430, 55.974883 ], [ -131.971620, 55.983806 ], [ -131.966861, 55.993323 ], [ -131.961507, 55.999867 ], [ -131.961507, 56.011764 ], [ -131.980543, 56.061138 ], [ -131.972809, 56.167024 ], [ -131.969835, 56.172378 ], [ -131.962102, 56.174757 ], [ -131.935728, 56.177207 ], [ -131.899046, 56.181896 ], [ -131.891908, 56.184870 ], [ -131.885364, 56.197957 ], [ -131.871087, 56.203311 ], [ -131.863949, 56.206880 ], [ -131.863354, 56.215803 ], [ -131.868113, 56.221752 ], [ -131.884174, 56.227700 ], [ -131.903210, 56.223536 ], [ -131.919271, 56.203311 ], [ -131.943402, 56.192557 ], [ -131.958838, 56.194762 ], [ -131.993894, 56.193351 ], [ -132.018130, 56.183155 ], [ -132.015045, 56.168214 ], [ -132.022183, 56.140255 ], [ -132.026942, 56.133117 ], [ -132.050142, 56.138471 ], [ -132.059660, 56.123004 ], [ -132.069772, 56.115866 ], [ -132.079548, 56.120192 ], [ -132.097136, 56.134901 ], [ -132.110818, 56.155127 ], [ -132.120336, 56.158696 ], [ -132.139372, 56.156317 ], [ -132.152459, 56.145609 ], [ -132.150079, 56.138471 ], [ -132.110223, 56.115271 ], [ -132.104020, 56.108109 ], [ -132.153984, 56.072209 ], [ -132.184581, 56.074225 ], [ -132.196479, 56.078389 ], [ -132.204212, 56.074820 ], [ -132.206591, 56.070061 ], [ -132.202427, 56.063518 ], [ -132.180417, 56.058164 ], [ -132.176955, 56.055706 ], [ -132.129697, 55.957855 ], [ -132.135474, 55.941626 ], [ -132.159064, 55.922560 ], [ -132.170198, 55.919231 ], [ -132.191893, 55.921717 ], [ -132.224241, 55.930421 ], [ -132.279962, 55.924839 ], [ -132.320487, 55.887648 ], [ -132.319799, 55.874347 ], [ -132.309306, 55.865059 ], [ -132.309949, 55.862301 ], [ -132.323242, 55.851878 ], [ -132.372298, 55.850359 ], [ -132.376518, 55.853377 ], [ -132.397304, 55.878867 ], [ -132.398349, 55.884052 ], [ -132.397080, 55.905546 ], [ -132.382672, 55.921345 ], [ -132.401191, 55.950467 ], [ -132.440968, 55.955252 ], [ -132.449891, 55.964175 ], [ -132.452271, 55.979642 ], [ -132.437399, 55.997488 ], [ -132.427286, 56.006411 ], [ -132.428476, 56.011764 ], [ -132.448702, 56.015928 ], [ -132.477850, 56.027826 ], [ -132.481419, 56.036154 ], [ -132.469522, 56.058164 ], [ -132.469522, 56.062923 ], [ -132.473686, 56.064707 ], [ -132.481419, 56.064707 ], [ -132.488480, 56.062016 ], [ -132.519491, 56.073035 ], [ -132.537336, 56.065897 ], [ -132.542690, 56.055784 ], [ -132.551018, 56.058164 ], [ -132.573677, 56.070700 ], [ -132.621793, 56.056140 ], [ -132.621492, 56.049174 ], [ -132.629155, 56.037425 ], [ -132.640079, 56.033194 ], [ -132.684620, 56.082323 ], [ -132.708697, 56.112124 ], [ -132.723396, 56.145814 ], [ -132.718342, 56.217704 ], [ -132.689888, 56.238744 ], [ -132.672471, 56.239439 ], [ -132.664212, 56.236332 ], [ -132.644250, 56.232807 ], [ -132.615797, 56.234172 ], [ -132.601495, 56.240065 ], [ -132.582070, 56.278816 ], [ -132.582033, 56.285456 ], [ -132.575023, 56.296468 ], [ -132.543076, 56.332276 ], [ -132.529360, 56.338555 ], [ -132.441839, 56.353983 ], [ -132.431631, 56.352163 ], [ -132.422041, 56.349341 ], [ -132.403678, 56.334811 ], [ -132.381766, 56.310756 ], [ -132.380574, 56.307785 ], [ -132.382793, 56.299203 ], [ -132.391594, 56.283023 ], [ -132.389810, 56.274695 ], [ -132.379697, 56.260418 ], [ -132.379102, 56.256849 ], [ -132.393974, 56.241382 ], [ -132.398733, 56.232459 ], [ -132.398733, 56.225321 ], [ -132.394569, 56.222941 ], [ -132.384456, 56.224131 ], [ -132.379425, 56.226647 ], [ -132.373749, 56.229485 ], [ -132.367205, 56.227700 ], [ -132.346385, 56.214613 ], [ -132.327944, 56.198552 ], [ -132.310098, 56.194388 ], [ -132.302365, 56.198552 ], [ -132.300580, 56.206880 ], [ -132.302365, 56.213424 ], [ -132.310098, 56.223536 ], [ -132.329134, 56.236029 ], [ -132.351144, 56.268746 ], [ -132.365420, 56.283023 ], [ -132.363966, 56.287126 ], [ -132.358710, 56.290800 ], [ -132.349149, 56.304456 ], [ -132.340678, 56.341754 ], [ -132.352928, 56.349053 ], [ -132.364231, 56.374037 ], [ -132.347574, 56.398427 ], [ -132.346980, 56.407350 ], [ -132.381422, 56.444893 ], [ -132.394268, 56.485579 ], [ -132.389380, 56.491367 ], [ -132.382379, 56.491972 ], [ -132.362556, 56.487904 ], [ -132.253393, 56.449539 ], [ -132.245479, 56.441215 ], [ -132.233927, 56.416736 ], [ -132.242000, 56.413660 ], [ -132.238473, 56.398706 ], [ -132.223136, 56.384017 ], [ -132.204367, 56.372086 ], [ -132.199269, 56.371054 ], [ -132.181158, 56.387128 ], [ -132.179350, 56.390823 ], [ -132.181647, 56.399336 ], [ -132.208568, 56.457125 ], [ -132.239043, 56.476671 ], [ -132.259611, 56.487630 ], [ -132.279753, 56.485881 ], [ -132.290475, 56.487017 ], [ -132.357564, 56.529008 ], [ -132.361293, 56.534232 ], [ -132.367088, 56.574578 ], [ -132.363836, 56.588613 ], [ -132.358410, 56.595266 ], [ -132.319303, 56.607116 ], [ -132.297288, 56.629819 ], [ -132.284216, 56.636699 ], [ -132.280089, 56.651834 ], [ -132.281464, 56.665593 ], [ -132.298664, 56.677977 ], [ -132.313799, 56.676601 ], [ -132.324807, 56.673849 ], [ -132.348886, 56.664217 ], [ -132.371589, 56.672473 ], [ -132.389476, 56.672473 ], [ -132.403923, 56.669721 ], [ -132.452081, 56.672473 ], [ -132.467904, 56.680729 ], [ -132.528446, 56.702056 ], [ -132.544177, 56.706864 ], [ -132.554290, 56.714598 ], [ -132.538229, 56.724710 ], [ -132.541203, 56.734228 ], [ -132.537039, 56.735418 ], [ -132.517127, 56.728632 ], [ -132.432385, 56.782385 ], [ -132.371032, 56.816413 ], [ -132.373615, 56.820353 ], [ -132.390129, 56.825837 ], [ -132.404564, 56.825506 ], [ -132.438330, 56.821117 ], [ -132.505513, 56.785485 ], [ -132.519457, 56.775455 ], [ -132.520712, 56.760116 ], [ -132.532002, 56.757141 ], [ -132.556758, 56.757242 ], [ -132.637458, 56.780910 ], [ -132.770404, 56.837486 ], [ -132.792089, 56.856152 ], [ -132.797107, 56.864922 ], [ -132.793601, 56.866364 ], [ -132.792727, 56.871673 ], [ -132.796999, 56.877790 ], [ -132.817890, 56.896901 ], [ -132.829346, 56.903573 ], [ -132.846744, 56.910635 ], [ -132.870340, 56.925682 ], [ -132.911970, 56.966651 ], [ -132.924891, 56.974554 ], [ -132.937978, 56.979313 ], [ -132.943927, 56.985261 ], [ -132.943927, 56.990615 ], [ -132.933219, 56.994184 ], [ -132.918967, 56.993673 ], [ -132.892388, 56.993016 ], [ -132.871496, 56.999661 ], [ -132.851128, 56.990615 ], [ -132.825549, 56.972174 ], [ -132.816031, 56.968010 ], [ -132.803539, 56.970390 ], [ -132.794021, 56.975743 ], [ -132.788667, 57.003702 ], [ -132.813684, 57.030218 ], [ -132.832220, 57.070408 ], [ -132.819005, 57.081035 ], [ -132.818410, 57.086983 ], [ -132.823764, 57.091147 ], [ -132.832092, 57.091742 ], [ -132.853284, 57.080077 ], [ -132.870116, 57.078424 ], [ -132.875197, 57.069577 ], [ -132.871353, 57.040584 ], [ -132.875517, 57.032851 ], [ -132.885630, 57.026902 ], [ -132.901097, 57.025712 ], [ -132.937520, 57.048321 ], [ -132.984307, 57.054845 ], [ -132.993944, 57.032353 ], [ -132.997465, 57.013220 ], [ -132.999249, 57.012030 ], [ -133.002224, 57.020358 ], [ -133.004971, 57.041206 ], [ -133.025050, 57.057322 ], [ -133.076481, 57.081733 ], [ -133.125306, 57.088891 ], [ -133.161448, 57.086264 ], [ -133.188074, 57.088973 ], [ -133.208726, 57.109699 ], [ -133.210261, 57.118453 ], [ -133.206655, 57.123834 ], [ -133.224656, 57.136522 ], [ -133.234880, 57.137937 ], [ -133.247414, 57.136802 ], [ -133.262180, 57.132193 ], [ -133.272887, 57.115537 ], [ -133.297277, 57.107209 ], [ -133.309174, 57.106614 ], [ -133.322359, 57.112727 ], [ -133.466932, 57.159356 ], [ -133.517197, 57.177776 ], [ -133.563776, 57.182757 ], [ -133.569725, 57.185136 ], [ -133.568535, 57.189895 ], [ -133.524660, 57.195286 ], [ -133.505480, 57.207146 ], [ -133.500126, 57.219043 ], [ -133.500721, 57.232725 ], [ -133.513213, 57.247002 ], [ -133.534033, 57.260684 ], [ -133.522837, 57.278580 ], [ -133.489738, 57.305192 ], [ -133.475890, 57.307982 ], [ -133.455936, 57.303970 ], [ -133.444958, 57.297729 ], [ -133.442436, 57.289978 ], [ -133.425948, 57.285995 ], [ -133.371591, 57.286713 ], [ -133.307565, 57.290052 ], [ -133.278836, 57.291022 ], [ -133.249688, 57.294591 ], [ -133.240765, 57.303514 ], [ -133.238385, 57.310058 ], [ -133.239575, 57.315412 ], [ -133.247903, 57.322550 ], [ -133.274829, 57.330625 ], [ -133.283510, 57.333119 ], [ -133.342070, 57.336798 ], [ -133.354720, 57.333253 ], [ -133.403868, 57.342685 ], [ -133.442682, 57.352845 ], [ -133.453783, 57.356240 ], [ -133.468267, 57.364217 ], [ -133.472039, 57.368651 ], [ -133.475998, 57.380394 ], [ -133.472454, 57.388446 ], [ -133.461179, 57.394577 ], [ -133.448967, 57.401072 ], [ -133.445398, 57.407616 ], [ -133.448373, 57.414159 ], [ -133.490002, 57.435095 ], [ -133.503115, 57.453528 ], [ -133.525140, 57.490344 ], [ -133.525830, 57.501777 ], [ -133.516749, 57.543911 ], [ -133.510806, 57.548139 ], [ -133.496365, 57.548772 ], [ -133.488197, 57.551387 ], [ -133.478086, 57.561730 ], [ -133.481221, 57.571470 ], [ -133.505982, 57.578459 ], [ -133.528313, 57.573944 ], [ -133.531905, 57.569466 ], [ -133.537860, 57.567292 ], [ -133.565478, 57.563095 ], [ -133.578948, 57.565094 ], [ -133.620760, 57.578919 ], [ -133.664390, 57.611707 ], [ -133.676449, 57.625192 ], [ -133.680963, 57.648265 ], [ -133.658550, 57.707924 ], [ -133.654530, 57.713689 ], [ -133.582212, 57.715095 ], [ -133.543928, 57.696454 ], [ -133.530957, 57.686914 ], [ -133.522243, 57.683663 ], [ -133.489677, 57.677141 ], [ -133.441215, 57.672013 ], [ -133.404980, 57.663783 ], [ -133.234598, 57.608749 ], [ -133.188864, 57.589071 ], [ -133.179062, 57.587147 ], [ -133.162464, 57.599796 ], [ -133.174032, 57.610062 ], [ -133.251126, 57.649966 ], [ -133.278209, 57.661859 ], [ -133.291062, 57.665358 ], [ -133.322532, 57.665830 ], [ -133.485403, 57.738677 ], [ -133.536460, 57.763760 ], [ -133.576269, 57.764535 ], [ -133.586976, 57.769294 ], [ -133.586976, 57.771078 ], [ -133.559889, 57.777457 ], [ -133.556097, 57.788830 ], [ -133.558803, 57.802777 ], [ -133.577458, 57.832349 ], [ -133.568231, 57.851351 ], [ -133.569787, 57.859365 ], [ -133.573294, 57.887077 ], [ -133.579243, 57.900164 ], [ -133.585786, 57.909087 ], [ -133.592925, 57.908492 ], [ -133.600658, 57.882318 ], [ -133.602030, 57.860394 ], [ -133.610178, 57.860654 ], [ -133.629807, 57.867446 ], [ -133.636945, 57.867446 ], [ -133.637540, 57.863282 ], [ -133.631303, 57.846766 ], [ -133.641996, 57.811215 ], [ -133.638899, 57.803323 ], [ -133.635578, 57.799900 ], [ -133.637054, 57.792203 ], [ -133.639675, 57.790361 ], [ -133.658113, 57.786368 ], [ -133.677433, 57.786593 ], [ -133.696784, 57.795075 ], [ -133.703097, 57.792152 ], [ -133.709141, 57.792739 ], [ -133.848776, 57.935440 ], [ -133.856391, 57.949716 ], [ -133.840210, 57.966848 ], [ -133.765019, 57.999209 ], [ -133.759309, 57.996354 ], [ -133.731707, 57.957331 ], [ -133.718382, 57.952572 ], [ -133.708864, 57.952572 ], [ -133.702202, 57.957331 ], [ -133.706961, 57.979222 ], [ -133.734562, 58.010631 ], [ -133.760260, 58.025859 ], [ -133.765971, 58.047750 ], [ -133.783103, 58.054413 ], [ -133.790718, 58.050605 ], [ -133.801187, 58.037280 ], [ -133.799284, 58.024907 ], [ -133.782152, 58.014438 ], [ -133.782152, 58.005872 ], [ -133.887800, 57.973511 ], [ -133.913498, 57.978270 ], [ -134.026760, 58.054413 ], [ -134.049603, 58.062027 ], [ -134.081012, 58.121989 ], [ -134.079108, 58.146736 ], [ -134.087674, 58.181952 ], [ -134.083867, 58.213361 ], [ -134.078156, 58.220975 ], [ -134.066735, 58.227637 ], [ -134.061024, 58.238107 ], [ -134.062928, 58.255239 ], [ -134.067687, 58.263805 ], [ -134.081012, 58.275227 ], [ -134.082915, 58.280937 ], [ -134.078156, 58.284744 ], [ -134.007724, 58.297118 ], [ -133.994399, 58.304732 ], [ -133.990592, 58.319009 ], [ -133.994399, 58.329478 ], [ -134.009628, 58.337093 ], [ -134.022953, 58.340900 ], [ -134.088626, 58.321864 ], [ -134.131456, 58.297118 ], [ -134.140974, 58.282841 ], [ -134.139071, 58.273323 ], [ -134.098144, 58.250480 ], [ -134.096240, 58.240962 ], [ -134.102903, 58.230493 ], [ -134.131456, 58.224782 ], [ -134.146685, 58.199084 ], [ -134.175238, 58.202891 ], [ -134.216165, 58.202891 ], [ -134.242815, 58.214312 ], [ -134.258995, 58.223830 ], [ -134.271369, 58.225734 ], [ -134.278031, 58.223830 ], [ -134.257092, 58.195277 ], [ -134.262386, 58.190934 ], [ -134.287371, 58.191529 ], [ -134.350426, 58.199857 ], [ -134.390877, 58.214729 ], [ -134.425379, 58.219488 ], [ -134.455717, 58.226626 ], [ -134.486650, 58.227816 ], [ -134.500927, 58.218298 ], [ -134.506876, 58.216513 ], [ -134.589562, 58.230195 ], [ -134.631203, 58.247446 ], [ -134.683551, 58.294441 ], [ -134.674628, 58.309907 ], [ -134.650833, 58.320020 ], [ -134.609193, 58.326563 ], [ -134.607408, 58.329538 ], [ -134.609788, 58.334892 ], [ -134.618711, 58.340245 ], [ -134.637151, 58.340840 ], [ -134.651428, 58.349168 ], [ -134.652023, 58.353927 ], [ -134.646074, 58.371178 ], [ -134.646669, 58.376532 ], [ -134.649643, 58.378912 ], [ -134.685930, 58.377127 ], [ -134.692474, 58.372963 ], [ -134.728166, 58.372963 ], [ -134.762073, 58.384860 ], [ -134.777540, 58.393188 ], [ -134.776350, 58.397352 ], [ -134.766237, 58.399137 ], [ -134.764452, 58.402111 ], [ -134.769806, 58.411629 ], [ -134.769806, 58.430070 ], [ -134.790627, 58.480039 ], [ -134.792411, 58.491936 ], [ -134.816206, 58.505023 ], [ -134.841190, 58.513946 ], [ -134.835241, 58.524654 ], [ -134.834647, 58.530602 ], [ -134.856062, 58.541310 ], [ -134.893538, 58.576407 ], [ -134.941722, 58.612099 ], [ -134.990501, 58.676344 ], [ -134.988717, 58.679319 ], [ -134.960758, 58.681698 ], [ -134.936963, 58.681698 ], [ -134.931610, 58.683483 ], [ -134.931610, 58.690026 ], [ -134.945292, 58.701923 ], [ -134.947671, 58.715010 ], [ -134.937558, 58.745349 ], [ -134.935179, 58.767359 ], [ -134.938748, 58.776876 ], [ -134.989906, 58.811379 ], [ -134.995260, 58.811379 ], [ -134.998829, 58.808999 ], [ -134.994070, 58.794722 ], [ -135.002993, 58.777471 ], [ -135.008347, 58.776876 ], [ -135.017865, 58.782230 ], [ -135.020839, 58.781635 ], [ -135.022029, 58.776282 ], [ -135.016675, 58.762005 ], [ -135.018460, 58.752487 ], [ -135.025598, 58.747728 ], [ -135.022624, 58.732262 ], [ -135.026193, 58.732856 ], [ -135.068429, 58.766169 ], [ -135.092223, 58.795912 ], [ -135.137433, 58.829819 ], [ -135.151115, 58.845881 ], [ -135.154089, 58.855994 ], [ -135.144571, 58.871460 ], [ -135.145166, 58.875029 ], [ -135.174910, 58.936300 ], [ -135.176694, 58.947008 ], [ -135.175756, 58.973868 ], [ -135.180116, 58.997871 ], [ -135.196098, 59.017178 ], [ -135.202760, 59.028600 ], [ -135.200269, 59.053765 ], [ -135.208585, 59.076824 ], [ -135.238267, 59.130134 ], [ -135.283964, 59.192532 ], [ -135.294315, 59.201212 ], [ -135.319830, 59.198017 ], [ -135.328396, 59.202776 ], [ -135.328396, 59.215150 ], [ -135.325145, 59.227064 ], [ -135.373148, 59.268242 ], [ -135.368074, 59.290995 ], [ -135.367479, 59.318954 ], [ -135.361530, 59.339774 ], [ -135.361530, 59.349886 ], [ -135.357366, 59.374871 ], [ -135.344279, 59.396286 ], [ -135.340710, 59.424245 ], [ -135.331192, 59.442091 ], [ -135.331787, 59.446850 ], [ -135.344874, 59.459342 ], [ -135.350228, 59.461126 ], [ -135.359745, 59.460531 ], [ -135.362720, 59.455773 ], [ -135.362720, 59.449229 ], [ -135.372832, 59.411158 ], [ -135.375212, 59.384984 ], [ -135.393653, 59.341558 ], [ -135.393058, 59.299918 ], [ -135.396611, 59.292434 ], [ -135.404360, 59.290995 ], [ -135.412688, 59.294564 ], [ -135.427560, 59.296349 ], [ -135.435293, 59.299918 ], [ -135.441045, 59.294085 ], [ -135.488236, 59.303487 ], [ -135.515600, 59.316574 ], [ -135.530472, 59.320738 ], [ -135.537015, 59.320143 ], [ -135.541179, 59.317764 ], [ -135.541179, 59.313600 ], [ -135.538205, 59.308841 ], [ -135.488831, 59.290995 ], [ -135.444526, 59.277689 ], [ -135.429601, 59.242722 ], [ -135.431724, 59.235672 ], [ -135.432319, 59.230913 ], [ -135.427560, 59.226749 ], [ -135.403687, 59.222767 ], [ -135.364060, 59.211403 ], [ -135.342254, 59.177825 ], [ -135.329458, 59.152700 ], [ -135.341114, 59.139821 ], [ -135.323637, 59.129489 ], [ -135.296987, 59.095225 ], [ -135.295084, 59.087610 ], [ -135.304601, 59.081900 ], [ -135.332203, 59.100935 ], [ -135.366240, 59.112061 ], [ -135.375033, 59.123778 ], [ -135.378841, 59.147573 ], [ -135.398828, 59.170416 ], [ -135.411201, 59.188500 ], [ -135.447369, 59.205632 ], [ -135.478778, 59.225619 ], [ -135.528271, 59.242751 ], [ -135.538740, 59.242751 ], [ -135.542547, 59.235137 ], [ -135.540644, 59.228475 ], [ -135.527319, 59.214198 ], [ -135.468308, 59.175175 ], [ -135.464501, 59.149476 ], [ -135.446417, 59.128537 ], [ -135.377826, 59.099262 ], [ -135.376410, 59.089000 ], [ -135.381162, 59.070878 ], [ -135.391214, 59.058105 ], [ -135.395021, 59.042877 ], [ -135.382641, 59.033366 ], [ -135.377889, 59.028600 ], [ -135.378841, 59.020034 ], [ -135.394069, 59.009564 ], [ -135.395021, 59.000998 ], [ -135.389310, 58.990528 ], [ -135.389310, 58.982914 ], [ -135.393117, 58.971493 ], [ -135.367419, 58.929614 ], [ -135.328396, 58.916289 ], [ -135.323637, 58.909627 ], [ -135.322622, 58.900661 ], [ -135.339948, 58.888955 ], [ -135.284657, 58.818114 ], [ -135.274203, 58.813122 ], [ -135.248985, 58.790878 ], [ -135.243200, 58.783112 ], [ -135.233878, 58.735487 ], [ -135.142322, 58.616370 ], [ -135.135843, 58.588225 ], [ -135.137516, 58.577835 ], [ -135.142161, 58.577107 ], [ -135.145521, 58.578332 ], [ -135.153827, 58.586626 ], [ -135.159062, 58.595525 ], [ -135.186357, 58.597770 ], [ -135.190544, 58.592417 ], [ -135.189368, 58.576244 ], [ -135.165861, 58.546605 ], [ -135.132273, 58.496536 ], [ -135.088983, 58.423022 ], [ -135.058071, 58.349447 ], [ -135.049062, 58.309295 ], [ -135.053488, 58.290498 ], [ -135.056552, 58.288699 ], [ -135.060452, 58.290338 ], [ -135.069775, 58.302694 ], [ -135.095814, 58.297233 ], [ -135.101210, 58.292607 ], [ -135.107700, 58.265034 ], [ -135.099106, 58.245096 ], [ -135.056227, 58.189884 ], [ -135.073269, 58.190575 ], [ -135.087872, 58.200073 ], [ -135.112868, 58.201553 ], [ -135.159055, 58.210178 ], [ -135.220281, 58.235584 ], [ -135.227736, 58.236900 ], [ -135.246709, 58.236368 ], [ -135.277198, 58.233634 ], [ -135.287700, 58.234933 ], [ -135.306507, 58.242916 ], [ -135.344868, 58.270795 ], [ -135.398260, 58.327689 ], [ -135.408059, 58.342999 ], [ -135.433061, 58.399899 ], [ -135.446517, 58.408235 ], [ -135.461296, 58.399884 ], [ -135.467119, 58.380673 ], [ -135.475685, 58.373058 ], [ -135.496624, 58.375914 ], [ -135.521358, 58.391449 ], [ -135.556066, 58.407740 ], [ -135.622105, 58.428186 ], [ -135.630425, 58.428580 ], [ -135.642247, 58.413985 ], [ -135.687933, 58.394949 ], [ -135.708206, 58.391830 ], [ -135.728054, 58.397067 ], [ -135.826079, 58.390246 ], [ -135.907310, 58.380839 ], [ -135.917917, 58.381237 ], [ -135.921134, 58.385772 ], [ -135.920299, 58.389084 ], [ -135.897255, 58.416132 ], [ -135.897169, 58.450001 ], [ -135.916112, 58.463858 ], [ -135.923268, 58.462919 ], [ -135.934547, 58.451953 ], [ -135.939926, 58.451600 ], [ -135.987564, 58.464420 ], [ -135.997418, 58.470375 ], [ -135.999530, 58.480281 ], [ -135.990948, 58.487315 ], [ -135.968087, 58.494669 ], [ -135.955625, 58.492765 ], [ -135.945121, 58.494836 ], [ -135.906941, 58.505810 ], [ -135.893152, 58.513929 ], [ -135.895088, 58.534077 ], [ -135.914003, 58.540583 ], [ -135.933802, 58.577313 ], [ -135.928667, 58.591176 ], [ -135.909936, 58.577930 ], [ -135.876624, 58.587448 ], [ -135.872817, 58.596014 ], [ -135.895660, 58.602676 ], [ -136.012226, 58.712247 ], [ -136.015761, 58.722600 ], [ -136.008929, 58.731910 ], [ -136.011669, 58.743276 ], [ -136.046172, 58.781796 ], [ -136.082937, 58.808383 ], [ -136.089603, 58.815729 ], [ -136.082095, 58.826828 ], [ -136.049099, 58.837826 ], [ -136.046281, 58.851365 ], [ -136.054607, 58.854899 ], [ -136.065077, 58.877742 ], [ -136.062222, 58.905344 ], [ -136.050351, 58.913433 ], [ -136.060728, 58.927580 ], [ -136.120307, 58.968418 ], [ -136.145306, 58.976705 ], [ -136.162725, 58.977261 ], [ -136.163648, 58.973204 ], [ -136.160293, 58.961999 ], [ -136.150300, 58.947111 ], [ -136.124491, 58.924542 ], [ -136.106997, 58.864441 ], [ -136.150772, 58.757266 ], [ -136.161943, 58.752171 ], [ -136.213660, 58.751153 ], [ -136.247343, 58.752935 ], [ -136.397322, 58.813019 ], [ -136.431055, 58.818416 ], [ -136.474735, 58.830788 ], [ -136.493716, 58.838963 ], [ -136.528161, 58.928484 ], [ -136.526520, 58.954523 ], [ -136.544899, 58.967314 ], [ -136.559836, 58.963414 ], [ -136.572163, 58.957292 ], [ -136.575516, 58.946600 ], [ -136.575541, 58.928941 ], [ -136.586289, 58.909364 ], [ -136.591832, 58.906968 ], [ -136.602062, 58.915040 ], [ -136.609200, 58.929317 ], [ -136.638349, 58.945378 ], [ -136.646082, 58.960845 ], [ -136.684153, 58.990588 ], [ -136.698430, 58.993562 ], [ -136.696646, 58.986424 ], [ -136.629426, 58.922178 ], [ -136.619908, 58.899574 ], [ -136.630497, 58.890256 ], [ -136.670412, 58.893224 ], [ -136.676898, 58.894973 ], [ -136.694600, 58.904081 ], [ -136.704848, 58.914395 ], [ -136.724994, 58.923514 ], [ -136.750422, 58.930439 ], [ -136.782908, 58.936659 ], [ -136.798368, 58.944188 ], [ -136.845957, 58.954896 ], [ -136.877826, 58.962392 ], [ -136.895866, 58.979940 ], [ -136.924419, 58.993265 ], [ -136.954726, 59.003007 ], [ -136.987237, 59.030384 ], [ -137.016743, 59.046565 ], [ -137.033875, 59.052275 ], [ -137.045296, 59.049420 ], [ -137.049103, 59.041806 ], [ -137.044344, 59.029433 ], [ -137.030068, 59.020867 ], [ -137.013887, 59.020867 ], [ -137.004369, 59.017059 ], [ -136.991044, 58.994217 ], [ -136.945359, 58.973277 ], [ -136.918530, 58.947217 ], [ -136.915995, 58.938384 ], [ -136.932352, 58.916252 ], [ -136.961361, 58.922773 ], [ -136.988412, 58.921115 ], [ -137.037503, 58.915635 ], [ -137.087472, 58.867451 ], [ -137.092231, 58.856148 ], [ -137.089851, 58.851984 ], [ -137.082118, 58.851984 ], [ -137.059513, 58.868641 ], [ -137.035719, 58.881728 ], [ -137.013114, 58.904927 ], [ -136.958386, 58.898384 ], [ -136.928643, 58.900131 ], [ -136.868184, 58.885243 ], [ -136.767930, 58.870608 ], [ -136.744507, 58.876626 ], [ -136.676388, 58.856348 ], [ -136.612807, 58.846227 ], [ -136.583430, 58.838826 ], [ -136.538029, 58.819777 ], [ -136.463258, 58.781607 ], [ -136.447941, 58.770964 ], [ -136.445187, 58.761222 ], [ -136.468634, 58.758293 ], [ -136.476125, 58.752403 ], [ -136.471242, 58.745715 ], [ -136.386433, 58.717371 ], [ -136.356786, 58.692581 ], [ -136.354222, 58.684304 ], [ -136.372775, 58.667410 ], [ -136.396076, 58.654421 ], [ -136.409876, 58.649250 ], [ -136.422309, 58.647412 ], [ -136.449827, 58.637816 ], [ -136.482395, 58.616739 ], [ -136.488443, 58.608090 ], [ -136.489445, 58.598353 ], [ -136.478427, 58.596269 ], [ -136.465243, 58.606305 ], [ -136.383327, 58.629987 ], [ -136.342827, 58.645030 ], [ -136.331366, 58.663545 ], [ -136.317193, 58.671231 ], [ -136.267093, 58.648600 ], [ -136.200392, 58.608228 ], [ -136.194207, 58.581731 ], [ -136.164063, 58.567936 ], [ -136.145027, 58.554611 ], [ -136.132654, 58.531768 ], [ -136.100293, 58.514636 ], [ -136.093631, 58.507022 ], [ -136.100303, 58.500673 ], [ -136.101959, 58.490304 ], [ -136.074595, 58.469902 ], [ -136.071740, 58.463240 ], [ -136.072691, 58.456577 ], [ -136.087087, 58.452477 ], [ -136.083551, 58.447115 ], [ -136.062165, 58.435795 ], [ -136.053028, 58.417375 ], [ -136.041818, 58.380161 ], [ -136.092646, 58.348990 ], [ -136.111930, 58.342530 ], [ -136.265906, 58.314499 ], [ -136.276769, 58.313894 ], [ -136.288255, 58.316144 ], [ -136.296281, 58.318447 ], [ -136.304158, 58.323450 ], [ -136.305121, 58.328691 ], [ -136.303092, 58.336277 ], [ -136.298718, 58.342941 ], [ -136.290055, 58.351447 ], [ -136.281631, 58.353090 ], [ -136.273929, 58.363409 ], [ -136.282604, 58.367261 ], [ -136.288867, 58.369649 ], [ -136.336728, 58.377570 ], [ -136.382035, 58.362694 ], [ -136.365148, 58.346663 ], [ -136.360416, 58.344077 ], [ -136.357115, 58.328838 ], [ -136.370979, 58.301643 ], [ -136.376464, 58.298625 ], [ -136.389964, 58.297070 ], [ -136.472020, 58.306356 ], [ -136.514319, 58.310003 ], [ -136.544776, 58.316665 ], [ -136.570475, 58.310954 ], [ -136.585703, 58.296678 ], [ -136.576799, 58.277951 ], [ -136.569831, 58.268700 ], [ -136.567956, 58.245153 ], [ -136.591924, 58.217886 ], [ -136.597198, 58.215006 ], [ -136.619824, 58.209899 ], [ -136.658638, 58.207323 ], [ -136.701250, 58.219416 ], [ -136.723391, 58.244926 ], [ -136.730885, 58.256496 ], [ -136.717093, 58.273508 ], [ -136.730218, 58.286153 ], [ -136.762198, 58.286765 ], [ -136.784326, 58.290497 ], [ -136.857605, 58.316360 ], [ -136.848992, 58.328994 ], [ -136.873764, 58.345275 ], [ -136.896937, 58.343315 ], [ -136.911213, 58.346170 ], [ -136.905197, 58.365934 ], [ -136.946663, 58.393185 ], [ -136.986384, 58.404043 ], [ -137.009415, 58.408877 ], [ -137.018409, 58.409141 ], [ -137.071800, 58.398707 ], [ -137.073969, 58.384242 ], [ -137.084438, 58.379483 ], [ -137.111802, 58.392594 ], [ -137.134453, 58.406596 ], [ -137.180029, 58.429939 ], [ -137.239366, 58.453159 ], [ -137.252710, 58.456338 ], [ -137.278612, 58.459484 ], [ -137.295788, 58.466179 ], [ -137.408758, 58.515822 ], [ -137.497002, 58.557721 ], [ -137.568216, 58.587989 ], [ -137.608804, 58.601234 ], [ -137.632889, 58.599982 ], [ -137.671690, 58.615523 ], [ -137.680811, 58.621835 ], [ -137.676857, 58.646770 ], [ -137.683516, 58.660267 ], [ -137.687627, 58.664989 ], [ -137.795037, 58.724855 ], [ -137.875350, 58.757232 ], [ -137.901675, 58.765316 ], [ -137.928156, 58.780533 ], [ -137.941828, 58.794322 ], [ -137.944957, 58.804652 ], [ -137.939353, 58.813721 ], [ -137.931565, 58.819787 ], [ -137.927624, 58.827187 ], [ -137.924608, 58.843928 ], [ -137.932593, 58.868494 ], [ -137.951995, 58.886029 ], [ -137.985198, 58.909525 ], [ -138.066332, 58.957126 ], [ -138.136246, 58.989026 ], [ -138.173949, 59.003696 ], [ -138.192033, 59.019877 ], [ -138.301496, 59.058058 ], [ -138.636702, 59.130585 ], [ -138.705900, 59.162549 ], [ -138.763467, 59.191320 ], [ -138.847498, 59.224835 ], [ -138.919749, 59.248531 ], [ -139.044593, 59.280341 ], [ -139.271031, 59.337421 ], [ -139.343049, 59.356608 ], [ -139.420168, 59.379760 ], [ -139.541156, 59.423071 ], [ -139.595186, 59.445413 ], [ -139.746478, 59.503415 ], [ -139.855565, 59.536660 ], [ -139.862547, 59.544258 ], [ -139.861306, 59.546678 ], [ -139.847236, 59.557304 ], [ -139.837817, 59.561984 ], [ -139.807161, 59.554333 ], [ -139.783892, 59.547165 ], [ -139.762001, 59.546213 ], [ -139.745821, 59.567153 ], [ -139.720123, 59.570008 ], [ -139.703942, 59.574767 ], [ -139.702039, 59.588092 ], [ -139.719171, 59.599513 ], [ -139.719171, 59.608079 ], [ -139.697280, 59.619501 ], [ -139.676310, 59.611249 ], [ -139.672408, 59.602894 ], [ -139.670630, 59.583333 ], [ -139.663968, 59.577622 ], [ -139.649691, 59.577622 ], [ -139.634462, 59.583333 ], [ -139.623124, 59.595909 ], [ -139.614513, 59.597135 ], [ -139.587135, 59.605959 ], [ -139.581447, 59.609171 ], [ -139.582528, 59.613542 ], [ -139.589369, 59.618674 ], [ -139.593488, 59.624317 ], [ -139.585789, 59.642765 ], [ -139.518180, 59.687814 ], [ -139.485984, 59.698499 ], [ -139.483129, 59.707065 ], [ -139.495502, 59.714679 ], [ -139.543091, 59.736570 ], [ -139.559271, 59.760365 ], [ -139.582114, 59.774642 ], [ -139.598294, 59.807002 ], [ -139.591632, 59.815568 ], [ -139.597343, 59.825086 ], [ -139.621137, 59.840315 ], [ -139.634462, 59.874579 ], [ -139.625896, 59.904084 ], [ -139.605909, 59.905036 ], [ -139.577232, 59.918265 ], [ -139.535902, 59.935248 ], [ -139.527455, 59.940047 ], [ -139.488702, 59.995034 ], [ -139.486032, 60.012407 ], [ -139.505389, 60.039428 ], [ -139.555157, 60.039243 ], [ -139.576819, 60.015425 ], [ -139.601852, 59.959866 ], [ -139.605790, 59.955600 ], [ -139.657451, 59.944727 ], [ -139.682456, 59.943984 ], [ -139.693423, 59.940730 ], [ -139.705328, 59.934826 ], [ -139.769537, 59.878108 ], [ -139.768612, 59.851160 ], [ -139.775517, 59.845210 ], [ -139.801197, 59.832586 ], [ -139.811185, 59.829332 ], [ -139.909851, 59.806070 ], [ -140.102591, 59.754910 ], [ -140.141090, 59.747979 ], [ -140.164657, 59.741878 ], [ -140.178132, 59.735628 ], [ -140.188610, 59.725248 ], [ -140.210907, 59.715535 ], [ -140.256351, 59.703052 ], [ -140.272266, 59.700609 ], [ -140.285557, 59.698717 ], [ -140.314400, 59.698302 ], [ -140.385022, 59.699480 ], [ -140.601672, 59.712953 ], [ -140.636639, 59.711409 ], [ -140.721980, 59.718563 ], [ -140.883583, 59.737613 ], [ -140.927220, 59.745709 ], [ -141.013338, 59.773338 ], [ -141.156497, 59.813582 ], [ -141.216148, 59.827285 ], [ -141.423134, 59.877329 ], [ -141.450505, 59.890419 ], [ -141.468075, 59.898374 ], [ -141.486159, 59.917409 ], [ -141.485207, 59.925024 ], [ -141.470930, 59.926927 ], [ -141.441425, 59.917409 ], [ -141.418582, 59.916457 ], [ -141.386221, 59.927879 ], [ -141.360523, 59.931686 ], [ -141.299609, 59.937397 ], [ -141.291995, 59.946915 ], [ -141.291043, 59.967854 ], [ -141.268200, 59.987841 ], [ -141.268200, 59.999263 ], [ -141.285332, 60.015443 ], [ -141.291995, 60.032575 ], [ -141.325307, 60.054466 ], [ -141.327211, 60.060177 ], [ -141.322452, 60.062080 ], [ -141.298657, 60.062080 ], [ -141.277718, 60.078261 ], [ -141.273911, 60.084923 ], [ -141.275814, 60.090634 ], [ -141.291995, 60.092538 ], [ -141.376704, 60.078261 ], [ -141.384318, 60.071598 ], [ -141.383366, 60.060177 ], [ -141.368138, 60.028768 ], [ -141.368138, 60.024009 ], [ -141.401450, 60.005925 ], [ -141.487111, 59.990697 ], [ -141.530294, 59.977655 ], [ -141.547787, 59.968568 ], [ -141.595376, 59.961905 ], [ -141.736240, 59.961905 ], [ -141.869766, 59.998834 ], [ -141.912218, 60.009779 ], [ -141.966178, 60.019129 ], [ -141.998818, 60.022606 ], [ -142.062454, 60.023781 ], [ -142.100059, 60.026772 ], [ -142.130040, 60.030327 ], [ -142.245180, 60.049778 ], [ -142.537534, 60.083953 ], [ -142.589676, 60.088182 ], [ -142.698419, 60.093333 ], [ -142.809852, 60.095217 ], [ -142.875248, 60.092428 ], [ -142.908859, 60.090328 ], [ -143.068700, 60.068603 ], [ -143.135616, 60.062082 ], [ -143.194276, 60.061995 ], [ -143.413377, 60.051924 ], [ -143.624152, 60.037257 ], [ -143.698990, 60.027761 ], [ -143.851343, 59.990697 ], [ -143.897029, 59.985938 ], [ -144.035037, 60.020202 ], [ -144.234912, 60.023057 ], [ -144.243478, 60.024961 ], [ -144.244430, 60.029720 ], [ -144.216828, 60.040189 ], [ -144.086434, 60.041141 ], [ -144.052539, 60.041759 ], [ -144.048732, 60.059271 ], [ -144.110300, 60.098939 ], [ -144.198744, 60.116332 ], [ -144.213021, 60.126802 ], [ -144.226346, 60.130609 ], [ -144.253948, 60.129657 ], [ -144.285357, 60.140127 ], [ -144.290116, 60.147741 ], [ -144.271080, 60.154404 ], [ -144.253878, 60.165894 ], [ -144.253978, 60.182934 ], [ -144.344367, 60.177246 ], [ -144.379225, 60.169090 ], [ -144.441936, 60.163069 ], [ -144.453957, 60.166004 ], [ -144.484756, 60.169632 ], [ -144.526950, 60.189513 ], [ -144.534892, 60.189420 ], [ -144.545101, 60.186999 ], [ -144.553786, 60.181914 ], [ -144.555093, 60.178485 ], [ -144.558163, 60.177797 ], [ -144.596256, 60.181666 ], [ -144.654899, 60.204882 ], [ -144.666556, 60.222572 ], [ -144.662685, 60.229296 ], [ -144.662364, 60.239480 ], [ -144.666134, 60.243885 ], [ -144.715474, 60.271215 ], [ -144.753450, 60.283515 ], [ -144.782521, 60.291972 ], [ -144.892815, 60.292821 ], [ -144.914016, 60.280934 ], [ -144.942134, 60.289728 ], [ -144.912707, 60.363178 ], [ -144.871428, 60.407269 ], [ -144.855457, 60.416886 ], [ -144.834059, 60.443751 ], [ -144.848662, 60.455192 ], [ -144.874451, 60.457304 ], [ -144.887342, 60.456048 ], [ -144.903296, 60.442581 ], [ -144.964135, 60.444466 ], [ -144.983585, 60.446902 ], [ -145.012409, 60.447920 ], [ -145.125550, 60.429389 ], [ -145.152365, 60.421558 ], [ -145.181041, 60.407531 ], [ -145.191183, 60.395239 ], [ -145.202891, 60.374915 ], [ -145.216678, 60.365700 ], [ -145.315663, 60.336194 ], [ -145.335651, 60.338098 ], [ -145.505458, 60.394268 ], [ -145.510457, 60.408988 ], [ -145.503930, 60.410607 ], [ -145.501549, 60.416799 ], [ -145.502351, 60.420811 ], [ -145.536942, 60.430533 ], [ -145.561523, 60.443124 ], [ -145.594158, 60.451830 ], [ -145.668841, 60.465431 ], [ -145.735938, 60.474660 ], [ -145.799318, 60.462031 ], [ -145.853469, 60.445630 ], [ -145.882293, 60.444633 ], [ -145.946900, 60.455395 ], [ -145.957404, 60.461101 ], [ -145.961060, 60.465017 ], [ -145.960508, 60.467510 ], [ -145.914403, 60.492350 ], [ -145.863092, 60.501821 ], [ -145.802387, 60.520173 ], [ -145.712891, 60.583249 ], [ -145.672345, 60.635293 ], [ -145.651405, 60.643859 ], [ -145.639984, 60.650521 ], [ -145.639984, 60.657184 ], [ -145.647598, 60.660991 ], [ -145.664730, 60.658135 ], [ -145.764668, 60.630534 ], [ -145.832320, 60.614851 ], [ -145.856046, 60.610936 ], [ -145.888350, 60.610304 ], [ -145.896266, 60.611789 ], [ -145.897785, 60.613653 ], [ -145.896160, 60.628684 ], [ -145.895243, 60.629213 ], [ -145.897145, 60.651214 ], [ -145.883904, 60.658185 ], [ -145.867770, 60.666784 ], [ -145.841345, 60.685893 ], [ -145.841418, 60.689787 ], [ -145.844540, 60.690169 ], [ -145.851783, 60.689858 ], [ -145.858160, 60.688484 ], [ -145.875820, 60.683453 ], [ -145.894257, 60.674164 ], [ -145.899208, 60.671118 ], [ -145.922006, 60.651954 ], [ -145.924923, 60.648898 ], [ -145.936921, 60.632053 ], [ -145.937067, 60.630490 ], [ -145.965559, 60.622748 ], [ -146.002533, 60.615082 ], [ -146.004621, 60.616231 ], [ -146.005755, 60.616854 ], [ -146.007675, 60.619742 ], [ -146.007747, 60.625326 ], [ -145.999198, 60.640832 ], [ -145.968734, 60.668235 ], [ -145.937031, 60.682822 ], [ -145.931436, 60.685478 ], [ -145.911538, 60.696647 ], [ -145.899162, 60.705642 ], [ -145.901279, 60.715373 ], [ -145.905477, 60.715045 ], [ -145.978105, 60.684712 ], [ -146.016402, 60.667222 ], [ -146.025020, 60.665311 ], [ -146.055670, 60.658685 ], [ -146.086293, 60.652030 ], [ -146.116912, 60.643327 ], [ -146.130941, 60.639181 ], [ -146.143249, 60.633869 ], [ -146.147236, 60.631407 ], [ -146.187676, 60.624521 ], [ -146.253074, 60.622315 ], [ -146.258380, 60.626288 ], [ -146.263142, 60.631932 ], [ -146.268684, 60.641240 ], [ -146.270257, 60.644928 ], [ -146.270250, 60.648035 ], [ -146.262982, 60.651569 ], [ -146.188159, 60.687333 ], [ -146.178676, 60.691483 ], [ -146.140640, 60.707652 ], [ -146.124073, 60.712417 ], [ -146.101061, 60.719277 ], [ -146.073465, 60.741538 ], [ -146.062044, 60.756529 ], [ -146.050622, 60.770092 ], [ -146.057761, 60.777230 ], [ -146.070967, 60.770956 ], [ -146.085107, 60.761063 ], [ -146.089780, 60.758156 ], [ -146.120390, 60.741981 ], [ -146.160220, 60.726383 ], [ -146.168059, 60.725350 ], [ -146.191156, 60.731990 ], [ -146.199026, 60.734359 ], [ -146.201912, 60.735912 ], [ -146.200100, 60.743081 ], [ -146.208740, 60.744390 ], [ -146.216811, 60.741700 ], [ -146.228250, 60.735643 ], [ -146.230706, 60.722008 ], [ -146.239512, 60.716889 ], [ -146.257663, 60.713068 ], [ -146.303398, 60.713214 ], [ -146.313858, 60.717926 ], [ -146.317300, 60.721124 ], [ -146.317949, 60.723817 ], [ -146.312283, 60.734401 ], [ -146.346573, 60.735747 ], [ -146.386892, 60.714598 ], [ -146.402873, 60.693084 ], [ -146.412520, 60.690450 ], [ -146.474142, 60.681539 ], [ -146.499849, 60.680134 ], [ -146.517848, 60.688102 ], [ -146.532396, 60.689748 ], [ -146.578813, 60.690212 ], [ -146.607153, 60.686377 ], [ -146.623266, 60.680420 ], [ -146.649059, 60.683438 ], [ -146.667754, 60.692761 ], [ -146.699219, 60.732176 ], [ -146.703597, 60.741903 ], [ -146.683697, 60.745275 ], [ -146.655538, 60.735230 ], [ -146.644116, 60.735230 ], [ -146.605008, 60.758608 ], [ -146.562325, 60.752852 ], [ -146.535182, 60.761187 ], [ -146.549890, 60.767591 ], [ -146.545131, 60.772350 ], [ -146.521336, 60.775205 ], [ -146.500678, 60.772113 ], [ -146.464824, 60.770722 ], [ -146.358618, 60.786193 ], [ -146.304445, 60.798038 ], [ -146.255415, 60.809962 ], [ -146.244412, 60.815597 ], [ -146.248174, 60.822794 ], [ -146.248174, 60.838023 ], [ -146.183158, 60.846969 ], [ -146.171897, 60.862823 ], [ -146.173131, 60.866071 ], [ -146.188185, 60.869374 ], [ -146.262572, 60.867787 ], [ -146.268659, 60.863842 ], [ -146.290202, 60.842694 ], [ -146.313757, 60.827833 ], [ -146.333424, 60.821921 ], [ -146.394369, 60.812271 ], [ -146.550577, 60.809402 ], [ -146.555964, 60.810066 ], [ -146.575650, 60.830173 ], [ -146.576602, 60.842547 ], [ -146.596575, 60.847212 ], [ -146.611756, 60.836119 ], [ -146.622225, 60.819939 ], [ -146.636502, 60.818987 ], [ -146.639357, 60.823746 ], [ -146.632695, 60.845637 ], [ -146.613519, 60.862709 ], [ -146.620419, 60.869019 ], [ -146.664368, 60.870854 ], [ -146.700741, 60.848345 ], [ -146.718132, 60.835667 ], [ -146.719532, 60.830166 ], [ -146.714748, 60.820385 ], [ -146.719790, 60.814475 ], [ -146.724844, 60.812120 ], [ -146.754847, 60.807882 ], [ -146.800612, 60.805160 ], [ -146.819018, 60.816346 ], [ -146.819008, 60.841568 ], [ -146.816305, 60.855628 ], [ -146.787431, 60.865597 ], [ -146.774155, 60.876225 ], [ -146.757004, 60.878454 ], [ -146.727226, 60.866270 ], [ -146.697690, 60.872534 ], [ -146.711287, 60.896465 ], [ -146.736025, 60.910301 ], [ -146.746758, 60.935454 ], [ -146.745543, 60.957582 ], [ -146.701356, 60.987009 ], [ -146.653430, 61.047752 ], [ -146.661518, 61.060776 ], [ -146.642213, 61.075017 ], [ -146.607949, 61.085487 ], [ -146.435676, 61.085487 ], [ -146.373810, 61.091197 ], [ -146.284342, 61.088342 ], [ -146.262451, 61.090246 ], [ -146.256740, 61.098812 ], [ -146.258644, 61.105474 ], [ -146.269113, 61.113088 ], [ -146.288149, 61.122606 ], [ -146.401411, 61.125462 ], [ -146.424254, 61.133076 ], [ -146.457567, 61.131172 ], [ -146.493734, 61.122606 ], [ -146.613659, 61.118799 ], [ -146.646020, 61.103571 ], [ -146.690552, 61.064076 ], [ -146.783730, 61.042936 ], [ -146.848112, 61.000587 ], [ -146.862709, 60.982523 ], [ -146.861961, 60.976177 ], [ -146.868826, 60.971448 ], [ -146.879853, 60.965161 ], [ -146.929789, 60.944263 ], [ -146.973072, 60.934835 ], [ -147.038952, 60.942079 ], [ -147.055754, 60.945468 ], [ -147.070552, 60.963312 ], [ -147.063230, 60.974057 ], [ -147.047088, 60.991209 ], [ -147.062671, 61.004336 ], [ -147.094863, 61.010189 ], [ -147.112607, 61.002974 ], [ -147.136884, 60.980968 ], [ -147.144639, 60.963492 ], [ -147.135571, 60.946248 ], [ -147.143314, 60.939831 ], [ -147.171624, 60.932877 ], [ -147.181257, 60.933099 ], [ -147.204930, 60.942660 ], [ -147.215273, 60.948077 ], [ -147.220809, 60.953121 ], [ -147.226487, 60.962160 ], [ -147.219575, 60.969505 ], [ -147.220325, 60.981702 ], [ -147.221616, 60.983541 ], [ -147.252984, 60.979621 ], [ -147.273646, 60.974595 ], [ -147.278004, 60.961063 ], [ -147.258017, 60.947478 ], [ -147.250403, 60.937008 ], [ -147.252307, 60.925587 ], [ -147.262776, 60.920828 ], [ -147.280437, 60.916963 ], [ -147.378086, 60.877845 ], [ -147.451569, 60.894219 ], [ -147.452904, 60.897366 ], [ -147.451699, 60.925880 ], [ -147.453406, 60.941468 ], [ -147.473090, 60.957552 ], [ -147.491546, 60.957998 ], [ -147.507268, 60.927235 ], [ -147.506010, 60.921170 ], [ -147.502365, 60.920429 ], [ -147.493812, 60.912379 ], [ -147.517424, 60.894819 ], [ -147.525056, 60.896057 ], [ -147.543002, 60.903331 ], [ -147.549756, 60.908009 ], [ -147.536798, 61.019346 ], [ -147.534034, 61.031090 ], [ -147.515782, 61.061408 ], [ -147.502323, 61.072056 ], [ -147.513776, 61.096127 ], [ -147.525097, 61.101176 ], [ -147.529276, 61.115944 ], [ -147.546408, 61.141642 ], [ -147.550215, 61.141642 ], [ -147.559733, 61.137835 ], [ -147.561637, 61.130221 ], [ -147.554974, 61.117847 ], [ -147.550966, 61.095367 ], [ -147.557226, 61.081402 ], [ -147.591260, 61.016591 ], [ -147.618800, 60.970040 ], [ -147.613846, 60.951496 ], [ -147.597749, 60.913905 ], [ -147.587309, 60.874463 ], [ -147.602405, 60.849978 ], [ -147.626585, 60.845065 ], [ -147.668593, 60.841563 ], [ -147.671928, 60.845283 ], [ -147.677292, 60.869960 ], [ -147.662960, 60.874951 ], [ -147.665855, 60.883774 ], [ -147.681196, 60.890307 ], [ -147.702501, 60.881805 ], [ -147.717729, 60.881805 ], [ -147.732958, 60.890371 ], [ -147.730391, 60.911256 ], [ -147.724392, 60.923683 ], [ -147.724392, 60.931298 ], [ -147.731054, 60.935105 ], [ -147.738668, 60.935105 ], [ -147.749138, 60.932249 ], [ -147.760843, 60.913227 ], [ -147.787115, 60.873511 ], [ -147.779717, 60.863435 ], [ -147.766961, 60.853544 ], [ -147.750212, 60.852141 ], [ -147.732124, 60.824711 ], [ -147.729421, 60.818252 ], [ -147.733252, 60.816975 ], [ -147.743256, 60.813887 ], [ -147.777157, 60.811018 ], [ -147.828765, 60.815947 ], [ -147.855920, 60.820882 ], [ -147.872113, 60.822085 ], [ -147.911893, 60.850872 ], [ -147.916652, 60.861341 ], [ -147.925218, 60.864197 ], [ -147.935688, 60.860390 ], [ -147.941399, 60.852775 ], [ -147.937591, 60.848016 ], [ -147.924266, 60.839450 ], [ -147.913399, 60.825152 ], [ -147.915116, 60.818955 ], [ -147.920445, 60.812442 ], [ -148.033953, 60.783198 ], [ -148.098148, 60.786556 ], [ -148.133987, 60.791268 ], [ -148.144355, 60.797089 ], [ -148.151597, 60.818122 ], [ -148.148298, 60.828701 ], [ -148.101841, 60.899347 ], [ -148.085220, 60.918613 ], [ -148.065132, 60.937963 ], [ -148.017276, 60.971807 ], [ -147.950619, 61.029211 ], [ -147.947785, 61.040625 ], [ -147.952820, 61.068830 ], [ -147.949965, 61.074541 ], [ -147.888099, 61.107854 ], [ -147.831943, 61.145925 ], [ -147.746283, 61.195418 ], [ -147.746283, 61.201128 ], [ -147.763415, 61.205887 ], [ -147.761511, 61.214453 ], [ -147.739620, 61.235393 ], [ -147.715826, 61.249669 ], [ -147.717729, 61.261091 ], [ -147.726295, 61.266802 ], [ -147.738668, 61.265850 ], [ -147.793872, 61.231586 ], [ -147.817667, 61.206839 ], [ -147.913797, 61.140214 ], [ -147.977566, 61.102143 ], [ -147.999457, 61.084059 ], [ -148.001637, 61.060103 ], [ -148.003216, 61.053797 ], [ -148.065505, 61.003979 ], [ -148.090090, 61.005110 ], [ -148.095004, 61.011384 ], [ -148.105388, 61.035123 ], [ -148.125128, 61.070698 ], [ -148.134686, 61.073088 ], [ -148.161261, 61.106902 ], [ -148.169827, 61.106902 ], [ -148.176489, 61.102143 ], [ -148.189814, 61.084059 ], [ -148.203139, 61.081204 ], [ -148.231693, 61.084059 ], [ -148.274523, 61.077396 ], [ -148.293559, 61.066927 ], [ -148.362087, 61.057409 ], [ -148.373509, 61.053602 ], [ -148.373509, 61.045988 ], [ -148.360184, 61.042180 ], [ -148.356377, 61.036470 ], [ -148.371605, 61.018386 ], [ -148.414435, 60.991736 ], [ -148.435375, 60.982218 ], [ -148.436326, 60.974604 ], [ -148.424905, 60.970797 ], [ -148.376364, 60.989832 ], [ -148.344003, 61.011723 ], [ -148.317353, 61.036470 ], [ -148.286896, 61.046939 ], [ -148.237403, 61.059313 ], [ -148.168875, 61.073589 ], [ -148.165969, 61.069277 ], [ -148.164452, 61.042665 ], [ -148.177649, 60.999608 ], [ -148.198970, 60.971584 ], [ -148.218954, 60.953573 ], [ -148.241664, 60.937738 ], [ -148.265584, 60.936331 ], [ -148.281248, 60.917792 ], [ -148.294475, 60.862751 ], [ -148.316220, 60.831717 ], [ -148.345669, 60.846589 ], [ -148.374223, 60.854203 ], [ -148.386596, 60.854203 ], [ -148.393258, 60.850396 ], [ -148.391355, 60.843733 ], [ -148.331634, 60.817464 ], [ -148.338686, 60.807481 ], [ -148.350460, 60.803991 ], [ -148.375416, 60.803470 ], [ -148.389517, 60.805622 ], [ -148.396614, 60.813694 ], [ -148.426555, 60.827113 ], [ -148.493196, 60.828505 ], [ -148.548399, 60.818035 ], [ -148.556013, 60.812325 ], [ -148.552206, 60.805662 ], [ -148.539833, 60.800903 ], [ -148.488437, 60.807566 ], [ -148.457028, 60.806614 ], [ -148.450122, 60.796405 ], [ -148.450890, 60.789487 ], [ -148.467497, 60.779964 ], [ -148.497954, 60.778060 ], [ -148.531267, 60.779012 ], [ -148.592181, 60.761880 ], [ -148.633108, 60.739989 ], [ -148.627397, 60.725712 ], [ -148.617879, 60.718098 ], [ -148.601699, 60.717146 ], [ -148.588374, 60.722857 ], [ -148.574097, 60.739989 ], [ -148.525556, 60.763784 ], [ -148.505569, 60.768542 ], [ -148.465594, 60.759976 ], [ -148.446715, 60.761204 ], [ -148.431078, 60.771842 ], [ -148.405576, 60.780301 ], [ -148.395962, 60.779701 ], [ -148.381999, 60.775768 ], [ -148.366407, 60.765833 ], [ -148.365314, 60.740969 ], [ -148.368529, 60.731857 ], [ -148.396114, 60.717146 ], [ -148.396114, 60.710484 ], [ -148.384094, 60.687754 ], [ -148.374018, 60.672640 ], [ -148.347881, 60.680327 ], [ -148.326357, 60.709539 ], [ -148.280136, 60.753337 ], [ -148.269523, 60.757389 ], [ -148.229756, 60.764140 ], [ -148.238117, 60.747603 ], [ -148.251442, 60.734278 ], [ -148.257153, 60.715243 ], [ -148.257153, 60.700966 ], [ -148.233358, 60.671460 ], [ -148.210516, 60.655280 ], [ -148.199094, 60.638148 ], [ -148.191480, 60.619112 ], [ -148.190343, 60.607564 ], [ -148.229961, 60.595062 ], [ -148.237828, 60.600206 ], [ -148.254852, 60.595124 ], [ -148.292837, 60.565496 ], [ -148.306123, 60.550702 ], [ -148.328167, 60.531913 ], [ -148.333245, 60.530464 ], [ -148.360898, 60.533452 ], [ -148.408487, 60.545825 ], [ -148.450365, 60.567716 ], [ -148.482726, 60.570571 ], [ -148.529363, 60.560102 ], [ -148.635011, 60.508705 ], [ -148.700685, 60.463020 ], [ -148.700685, 60.454454 ], [ -148.692118, 60.448743 ], [ -148.660710, 60.460164 ], [ -148.568387, 60.506802 ], [ -148.510328, 60.522030 ], [ -148.460835, 60.545825 ], [ -148.449413, 60.546777 ], [ -148.419908, 60.524886 ], [ -148.345627, 60.502973 ], [ -148.330440, 60.496332 ], [ -148.346378, 60.488730 ], [ -148.328987, 60.476182 ], [ -148.293534, 60.483001 ], [ -148.255425, 60.493410 ], [ -148.247867, 60.500504 ], [ -148.250132, 60.507573 ], [ -148.238554, 60.521443 ], [ -148.192033, 60.557371 ], [ -148.114766, 60.596029 ], [ -148.102747, 60.598026 ], [ -148.086378, 60.595518 ], [ -147.979019, 60.519146 ], [ -147.963617, 60.502750 ], [ -147.971198, 60.486479 ], [ -147.977250, 60.480937 ], [ -147.941709, 60.444029 ], [ -147.953709, 60.422610 ], [ -148.033484, 60.392588 ], [ -148.075362, 60.388780 ], [ -148.098205, 60.371648 ], [ -148.114385, 60.376407 ], [ -148.125807, 60.371648 ], [ -148.127710, 60.352613 ], [ -148.134373, 60.347854 ], [ -148.170881, 60.335266 ], [ -148.192669, 60.339103 ], [ -148.216921, 60.331594 ], [ -148.215848, 60.318269 ], [ -148.211194, 60.306961 ], [ -148.215152, 60.301014 ], [ -148.284807, 60.270971 ], [ -148.301513, 60.260891 ], [ -148.358250, 60.221586 ], [ -148.357224, 60.212358 ], [ -148.339155, 60.213350 ], [ -148.332652, 60.214000 ], [ -148.321208, 60.218469 ], [ -148.275752, 60.249270 ], [ -148.216863, 60.260006 ], [ -148.208328, 60.259342 ], [ -148.192000, 60.252500 ], [ -148.188298, 60.248574 ], [ -148.192569, 60.241826 ], [ -148.200779, 60.236711 ], [ -148.228931, 60.235911 ], [ -148.234227, 60.223689 ], [ -148.190530, 60.206957 ], [ -148.165099, 60.206173 ], [ -148.158947, 60.211675 ], [ -148.153775, 60.226236 ], [ -148.153037, 60.235528 ], [ -148.139869, 60.241081 ], [ -148.090238, 60.215863 ], [ -148.117300, 60.191335 ], [ -148.133624, 60.188390 ], [ -148.134990, 60.184596 ], [ -148.130641, 60.169789 ], [ -148.126291, 60.167063 ], [ -148.090876, 60.168649 ], [ -148.080188, 60.171568 ], [ -148.079884, 60.184234 ], [ -148.085791, 60.190041 ], [ -148.082874, 60.192357 ], [ -148.061865, 60.200094 ], [ -148.051918, 60.202062 ], [ -148.003433, 60.176167 ], [ -148.006656, 60.168461 ], [ -148.018404, 60.157419 ], [ -148.028870, 60.150518 ], [ -148.032495, 60.148423 ], [ -148.064401, 60.148508 ], [ -148.097230, 60.120120 ], [ -148.091662, 60.105268 ], [ -148.139251, 60.055299 ], [ -148.142820, 60.039833 ], [ -148.175808, 60.026337 ], [ -148.212668, 60.018101 ], [ -148.273844, 60.013318 ], [ -148.317941, 60.028731 ], [ -148.305725, 60.054468 ], [ -148.290367, 60.059995 ], [ -148.292816, 60.151289 ], [ -148.305868, 60.161607 ], [ -148.316849, 60.165437 ], [ -148.346535, 60.162108 ], [ -148.358188, 60.156510 ], [ -148.369109, 60.120922 ], [ -148.382325, 60.063299 ], [ -148.401204, 59.997600 ], [ -148.400635, 59.977848 ], [ -148.423477, 59.954053 ], [ -148.442513, 59.943583 ], [ -148.471067, 59.953101 ], [ -148.479633, 59.962619 ], [ -148.490102, 59.981655 ], [ -148.490475, 60.000625 ], [ -148.508825, 60.002875 ], [ -148.526270, 60.015919 ], [ -148.538643, 60.014015 ], [ -148.544134, 60.002809 ], [ -148.541499, 59.982606 ], [ -148.552920, 59.954053 ] ] ], [ [ [ -174.301818, 52.278949 ], [ -174.323471, 52.283990 ], [ -174.346089, 52.285036 ], [ -174.349404, 52.281336 ], [ -174.368754, 52.280405 ], [ -174.408277, 52.289872 ], [ -174.451554, 52.305557 ], [ -174.455979, 52.313690 ], [ -174.453660, 52.319367 ], [ -174.443132, 52.325654 ], [ -174.432846, 52.328004 ], [ -174.384199, 52.321139 ], [ -174.367047, 52.314105 ], [ -174.358624, 52.314190 ], [ -174.340679, 52.322284 ], [ -174.331065, 52.328465 ], [ -174.317700, 52.344869 ], [ -174.320813, 52.355726 ], [ -174.330494, 52.366439 ], [ -174.329818, 52.373548 ], [ -174.324935, 52.378095 ], [ -174.185347, 52.417788 ], [ -174.155774, 52.416041 ], [ -174.068248, 52.390331 ], [ -174.016822, 52.348537 ], [ -173.989415, 52.325275 ], [ -173.985203, 52.317600 ], [ -173.986421, 52.298565 ], [ -173.987917, 52.295345 ], [ -174.036222, 52.245011 ], [ -174.060451, 52.225326 ], [ -174.084042, 52.223677 ], [ -174.106533, 52.228392 ], [ -174.177679, 52.233638 ], [ -174.182857, 52.232762 ], [ -174.198624, 52.219244 ], [ -174.200389, 52.211861 ], [ -174.196836, 52.195856 ], [ -174.190100, 52.190320 ], [ -174.175044, 52.181835 ], [ -174.135217, 52.168514 ], [ -174.090169, 52.139119 ], [ -174.082814, 52.132069 ], [ -174.080677, 52.128026 ], [ -174.089100, 52.107251 ], [ -174.094470, 52.104274 ], [ -174.102161, 52.104534 ], [ -174.109089, 52.113117 ], [ -174.114370, 52.117107 ], [ -174.142262, 52.125452 ], [ -174.206353, 52.116554 ], [ -174.218469, 52.104880 ], [ -174.302947, 52.111325 ], [ -174.334424, 52.115198 ], [ -174.348463, 52.109245 ], [ -174.365667, 52.097238 ], [ -174.382661, 52.081658 ], [ -174.411255, 52.048757 ], [ -174.452760, 52.061047 ], [ -174.507816, 52.054955 ], [ -174.508822, 52.048623 ], [ -174.556278, 52.036733 ], [ -174.580676, 52.040453 ], [ -174.593635, 52.045247 ], [ -174.615943, 52.032665 ], [ -174.714610, 52.009863 ], [ -174.736592, 52.007308 ], [ -174.783189, 52.032293 ], [ -174.885554, 52.043001 ], [ -174.967907, 52.037203 ], [ -175.000792, 52.028354 ], [ -175.014748, 52.020584 ], [ -175.014807, 52.007000 ], [ -175.095510, 52.000797 ], [ -175.104889, 52.003548 ], [ -175.155673, 52.011512 ], [ -175.274850, 52.018619 ], [ -175.292821, 52.018790 ], [ -175.300639, 52.014970 ], [ -175.302683, 52.011499 ], [ -175.323322, 52.007488 ], [ -175.341624, 52.021588 ], [ -175.327070, 52.027032 ], [ -175.195900, 52.051407 ], [ -175.156744, 52.057642 ], [ -175.132635, 52.059223 ], [ -175.117115, 52.054499 ], [ -175.117680, 52.053234 ], [ -175.113721, 52.046308 ], [ -175.092867, 52.034794 ], [ -175.044344, 52.057519 ], [ -174.995237, 52.061417 ], [ -174.992309, 52.058603 ], [ -174.980497, 52.061471 ], [ -174.937497, 52.078334 ], [ -174.922299, 52.091580 ], [ -174.927549, 52.101415 ], [ -174.920042, 52.109274 ], [ -174.905409, 52.116509 ], [ -174.866725, 52.103172 ], [ -174.839715, 52.091338 ], [ -174.786809, 52.091324 ], [ -174.656294, 52.107962 ], [ -174.604871, 52.122124 ], [ -174.568402, 52.138426 ], [ -174.557080, 52.153637 ], [ -174.554670, 52.160405 ], [ -174.527081, 52.174720 ], [ -174.496880, 52.179151 ], [ -174.465189, 52.180711 ], [ -174.455707, 52.176802 ], [ -174.424054, 52.169053 ], [ -174.415290, 52.169376 ], [ -174.404588, 52.181330 ], [ -174.405464, 52.183560 ], [ -174.457804, 52.202831 ], [ -174.462962, 52.213031 ], [ -174.453746, 52.218823 ], [ -174.400139, 52.219053 ], [ -174.360631, 52.212994 ], [ -174.328599, 52.211647 ], [ -174.299044, 52.214670 ], [ -174.249848, 52.243694 ], [ -174.255832, 52.274152 ], [ -174.301818, 52.278949 ] ] ], [ [ [ 178.117600, 52.048612 ], [ 178.119144, 52.051659 ], [ 178.141695, 52.051034 ], [ 178.175781, 52.036777 ], [ 178.179962, 52.033247 ], [ 178.190963, 52.003546 ], [ 178.174473, 51.991684 ], [ 178.132547, 51.986982 ], [ 178.105874, 51.998357 ], [ 178.102730, 52.003927 ], [ 178.094610, 52.033294 ], [ 178.107266, 52.045744 ], [ 178.117600, 52.048612 ] ] ], [ [ [ -176.018089, 52.020099 ], [ -176.044001, 52.009331 ], [ -176.032156, 51.993667 ], [ -176.027546, 51.991630 ], [ -176.021839, 51.984848 ], [ -176.022663, 51.980621 ], [ -176.027667, 51.975112 ], [ -176.057085, 51.967825 ], [ -176.079181, 51.968884 ], [ -176.180356, 52.000426 ], [ -176.185086, 52.005705 ], [ -176.201935, 52.040212 ], [ -176.211855, 52.065533 ], [ -176.205324, 52.076246 ], [ -176.173155, 52.102314 ], [ -176.143914, 52.116097 ], [ -176.058103, 52.106467 ], [ -175.988653, 52.035509 ], [ -175.999044, 52.025385 ], [ -176.018089, 52.020099 ] ] ], [ [ [ -175.680144, 51.968970 ], [ -175.672640, 51.972471 ], [ -175.669707, 51.972166 ], [ -175.655056, 51.966651 ], [ -175.652493, 51.964813 ], [ -175.653194, 51.961669 ], [ -175.717436, 51.933695 ], [ -175.730011, 51.933817 ], [ -175.747438, 51.946200 ], [ -175.747836, 51.950655 ], [ -175.742618, 51.966632 ], [ -175.735477, 51.973331 ], [ -175.726245, 51.975969 ], [ -175.680144, 51.968970 ] ] ], [ [ [ 178.446964, 51.978222 ], [ 178.463385, 51.987849 ], [ 178.478586, 51.987549 ], [ 178.552612, 51.973968 ], [ 178.570619, 51.968064 ], [ 178.591597, 51.952652 ], [ 178.590245, 51.945457 ], [ 178.567447, 51.925939 ], [ 178.539395, 51.903246 ], [ 178.518861, 51.899759 ], [ 178.502493, 51.899644 ], [ 178.484831, 51.909898 ], [ 178.468045, 51.931635 ], [ 178.454664, 51.960501 ], [ 178.446964, 51.978222 ] ] ], [ [ [ 179.758993, 51.946595 ], [ 179.751525, 51.923933 ], [ 179.743012, 51.911749 ], [ 179.734772, 51.907606 ], [ 179.649484, 51.873670 ], [ 179.639077, 51.871931 ], [ 179.614364, 51.871772 ], [ 179.521868, 51.896765 ], [ 179.484634, 51.921268 ], [ 179.475569, 51.937456 ], [ 179.482464, 51.982834 ], [ 179.486565, 51.983959 ], [ 179.515025, 51.983751 ], [ 179.526743, 51.981164 ], [ 179.539223, 51.985178 ], [ 179.571049, 52.011111 ], [ 179.582857, 52.016841 ], [ 179.622283, 52.024975 ], [ 179.647641, 52.026259 ], [ 179.663327, 52.022941 ], [ 179.704433, 52.004877 ], [ 179.773922, 51.970693 ], [ 179.778470, 51.962217 ], [ 179.777158, 51.958700 ], [ 179.767251, 51.947572 ], [ 179.758993, 51.946595 ] ] ], [ [ [ 177.601645, 52.016377 ], [ 177.577226, 52.004970 ], [ 177.572068, 52.001812 ], [ 177.538223, 51.978897 ], [ 177.532729, 51.970070 ], [ 177.539627, 51.959418 ], [ 177.543534, 51.956175 ], [ 177.571796, 51.951590 ], [ 177.579823, 51.950836 ], [ 177.607535, 51.954720 ], [ 177.611553, 51.950829 ], [ 177.610618, 51.936713 ], [ 177.606529, 51.925069 ], [ 177.601005, 51.922254 ], [ 177.560513, 51.916364 ], [ 177.484313, 51.923413 ], [ 177.409536, 51.930821 ], [ 177.373934, 51.919760 ], [ 177.348816, 51.904469 ], [ 177.326781, 51.873636 ], [ 177.327179, 51.871049 ], [ 177.334229, 51.866769 ], [ 177.334017, 51.844444 ], [ 177.321687, 51.828543 ], [ 177.311768, 51.825971 ], [ 177.303314, 51.829458 ], [ 177.294035, 51.837301 ], [ 177.296018, 51.839866 ], [ 177.293424, 51.845610 ], [ 177.273370, 51.857123 ], [ 177.235523, 51.873260 ], [ 177.212422, 51.876431 ], [ 177.203996, 51.880531 ], [ 177.200423, 51.894746 ], [ 177.203323, 51.896562 ], [ 177.233904, 51.909624 ], [ 177.272695, 51.920054 ], [ 177.291312, 51.919430 ], [ 177.341518, 51.955016 ], [ 177.345577, 51.963005 ], [ 177.413484, 51.979724 ], [ 177.483712, 51.984877 ], [ 177.497441, 51.993328 ], [ 177.503441, 52.008829 ], [ 177.505747, 52.016374 ], [ 177.505319, 52.038768 ], [ 177.545604, 52.101091 ], [ 177.563396, 52.121959 ], [ 177.602673, 52.137320 ], [ 177.661607, 52.112746 ], [ 177.675952, 52.092167 ], [ 177.667256, 52.076274 ], [ 177.659451, 52.069439 ], [ 177.653614, 52.070323 ], [ 177.641864, 52.068316 ], [ 177.632555, 52.064844 ], [ 177.609087, 52.028518 ], [ 177.601645, 52.016377 ] ] ], [ [ [ -175.971562, 51.888631 ], [ -175.957546, 51.893455 ], [ -175.953251, 51.881376 ], [ -175.954287, 51.868381 ], [ -175.963041, 51.846253 ], [ -175.983742, 51.852352 ], [ -176.047892, 51.846309 ], [ -176.101070, 51.810609 ], [ -176.123965, 51.802745 ], [ -176.139622, 51.802386 ], [ -176.183142, 51.807099 ], [ -176.216957, 51.812714 ], [ -176.235544, 51.823157 ], [ -176.236246, 51.825965 ], [ -176.217544, 51.874627 ], [ -176.206069, 51.883089 ], [ -176.173871, 51.882449 ], [ -176.169751, 51.880138 ], [ -176.168775, 51.877330 ], [ -176.161052, 51.869685 ], [ -176.140908, 51.859562 ], [ -176.099137, 51.855533 ], [ -176.080442, 51.858567 ], [ -176.072225, 51.867938 ], [ -176.073431, 51.870312 ], [ -176.078865, 51.874778 ], [ -176.115489, 51.887015 ], [ -176.111452, 51.889748 ], [ -176.065288, 51.902986 ], [ -176.020182, 51.911373 ], [ -175.992650, 51.912655 ], [ -175.984993, 51.908445 ], [ -175.971562, 51.888631 ] ] ], [ [ [ 178.380741, 51.763907 ], [ 178.367465, 51.772758 ], [ 178.363680, 51.773948 ], [ 178.339082, 51.771529 ], [ 178.335664, 51.769926 ], [ 178.318757, 51.772322 ], [ 178.308563, 51.775701 ], [ 178.304892, 51.777434 ], [ 178.246209, 51.817078 ], [ 178.236931, 51.828209 ], [ 178.305568, 51.821748 ], [ 178.310298, 51.819993 ], [ 178.319389, 51.815737 ], [ 178.332190, 51.809037 ], [ 178.335631, 51.807031 ], [ 178.372348, 51.774146 ], [ 178.380741, 51.763907 ] ] ], [ [ [ -178.792409, 51.746071 ], [ -178.808157, 51.747078 ], [ -178.815757, 51.749176 ], [ -178.873024, 51.782623 ], [ -178.870118, 51.795261 ], [ -178.858248, 51.820966 ], [ -178.828645, 51.836150 ], [ -178.819459, 51.839575 ], [ -178.811249, 51.839018 ], [ -178.788541, 51.832602 ], [ -178.767695, 51.823179 ], [ -178.748283, 51.809942 ], [ -178.733355, 51.783947 ], [ -178.750414, 51.757752 ], [ -178.776661, 51.748612 ], [ -178.792409, 51.746071 ] ] ], [ [ [ -177.360408, 51.727533 ], [ -177.390760, 51.733525 ], [ -177.417678, 51.730875 ], [ -177.444717, 51.725419 ], [ -177.463577, 51.713943 ], [ -177.490005, 51.705106 ], [ -177.540393, 51.698755 ], [ -177.570973, 51.698220 ], [ -177.608055, 51.705184 ], [ -177.616753, 51.703978 ], [ -177.631523, 51.696844 ], [ -177.640524, 51.672084 ], [ -177.635883, 51.659541 ], [ -177.651386, 51.653604 ], [ -177.670951, 51.663980 ], [ -177.707802, 51.703268 ], [ -177.705261, 51.707240 ], [ -177.697662, 51.713123 ], [ -177.639983, 51.736061 ], [ -177.597498, 51.726464 ], [ -177.555197, 51.721125 ], [ -177.536977, 51.721470 ], [ -177.515591, 51.724978 ], [ -177.497974, 51.738624 ], [ -177.461200, 51.750718 ], [ -177.281479, 51.784075 ], [ -177.238175, 51.798520 ], [ -177.211930, 51.812331 ], [ -177.205675, 51.820639 ], [ -177.200825, 51.844605 ], [ -177.199120, 51.883142 ], [ -177.199764, 51.924816 ], [ -177.197506, 51.931339 ], [ -177.191399, 51.938001 ], [ -177.181271, 51.943167 ], [ -177.154842, 51.944381 ], [ -177.099266, 51.936119 ], [ -177.054768, 51.908944 ], [ -177.045090, 51.898605 ], [ -177.081010, 51.855497 ], [ -177.120377, 51.839687 ], [ -177.128617, 51.833835 ], [ -177.136977, 51.814493 ], [ -177.130960, 51.762772 ], [ -177.120581, 51.739815 ], [ -177.122808, 51.729355 ], [ -177.145675, 51.707294 ], [ -177.261631, 51.680846 ], [ -177.275121, 51.680510 ], [ -177.296369, 51.684245 ], [ -177.316501, 51.690353 ], [ -177.317888, 51.693447 ], [ -177.317939, 51.696866 ], [ -177.316353, 51.700811 ], [ -177.322977, 51.711416 ], [ -177.342784, 51.721395 ], [ -177.360408, 51.727533 ] ] ], [ [ [ -177.800647, 51.778294 ], [ -177.796308, 51.770831 ], [ -177.813886, 51.754280 ], [ -177.842267, 51.732480 ], [ -177.842419, 51.722645 ], [ -177.838054, 51.717198 ], [ -177.827524, 51.712086 ], [ -177.826997, 51.705972 ], [ -177.841411, 51.689560 ], [ -177.856332, 51.681015 ], [ -177.867960, 51.679374 ], [ -177.876811, 51.681411 ], [ -177.887768, 51.689483 ], [ -177.899416, 51.692557 ], [ -177.902693, 51.691581 ], [ -177.918806, 51.674390 ], [ -177.928907, 51.655368 ], [ -177.929023, 51.650520 ], [ -177.925640, 51.642481 ], [ -177.915445, 51.630684 ], [ -177.903083, 51.606497 ], [ -177.906072, 51.597670 ], [ -177.909185, 51.596671 ], [ -177.930123, 51.601499 ], [ -177.944957, 51.611539 ], [ -177.950665, 51.620001 ], [ -177.953024, 51.638175 ], [ -177.957443, 51.647149 ], [ -177.963852, 51.650231 ], [ -178.004566, 51.639408 ], [ -178.041404, 51.665193 ], [ -178.069823, 51.670676 ], [ -178.086304, 51.663618 ], [ -178.109378, 51.670461 ], [ -178.117864, 51.677831 ], [ -178.104285, 51.701539 ], [ -178.021818, 51.706906 ], [ -177.962426, 51.719772 ], [ -177.956443, 51.722862 ], [ -177.947777, 51.740381 ], [ -177.946649, 51.752681 ], [ -177.950283, 51.765682 ], [ -177.956998, 51.772541 ], [ -177.965031, 51.778162 ], [ -177.995272, 51.781535 ], [ -178.039344, 51.778925 ], [ -178.059335, 51.786829 ], [ -178.080640, 51.798739 ], [ -178.086074, 51.808047 ], [ -178.172666, 51.839985 ], [ -178.215124, 51.857801 ], [ -178.224129, 51.864881 ], [ -178.227822, 51.873526 ], [ -178.224618, 51.880675 ], [ -178.220742, 51.884841 ], [ -178.197090, 51.905464 ], [ -178.175023, 51.911584 ], [ -178.145326, 51.917216 ], [ -178.124786, 51.920093 ], [ -178.090632, 51.919399 ], [ -178.070548, 51.917408 ], [ -178.061147, 51.912539 ], [ -178.002345, 51.909968 ], [ -177.963723, 51.917919 ], [ -177.952094, 51.915348 ], [ -177.913269, 51.879748 ], [ -177.924315, 51.857522 ], [ -177.921569, 51.853883 ], [ -177.859763, 51.826944 ], [ -177.852285, 51.826045 ], [ -177.759641, 51.831195 ], [ -177.691714, 51.843975 ], [ -177.615311, 51.855080 ], [ -177.614511, 51.853033 ], [ -177.625008, 51.837529 ], [ -177.649208, 51.820727 ], [ -177.685555, 51.812745 ], [ -177.692118, 51.813897 ], [ -177.735909, 51.807991 ], [ -177.797719, 51.793297 ], [ -177.800647, 51.778294 ] ] ], [ [ [ -176.762478, 51.867878 ], [ -176.797799, 51.908512 ], [ -176.810433, 51.927089 ], [ -176.789558, 51.957211 ], [ -176.774023, 51.965895 ], [ -176.736549, 51.969808 ], [ -176.720780, 51.969518 ], [ -176.698771, 51.964454 ], [ -176.630510, 51.970352 ], [ -176.627155, 51.978294 ], [ -176.603598, 51.997056 ], [ -176.589955, 52.002741 ], [ -176.579975, 52.003238 ], [ -176.560565, 51.996732 ], [ -176.554398, 51.990660 ], [ -176.544867, 51.927245 ], [ -176.554661, 51.909834 ], [ -176.558376, 51.908725 ], [ -176.616095, 51.903013 ], [ -176.620015, 51.895630 ], [ -176.623452, 51.883205 ], [ -176.625463, 51.859824 ], [ -176.576381, 51.842275 ], [ -176.543309, 51.838624 ], [ -176.517599, 51.839557 ], [ -176.507989, 51.845970 ], [ -176.398062, 51.867842 ], [ -176.311573, 51.872463 ], [ -176.290728, 51.872136 ], [ -176.287188, 51.870313 ], [ -176.281694, 51.863919 ], [ -176.266490, 51.817716 ], [ -176.268243, 51.785498 ], [ -176.273792, 51.772019 ], [ -176.289921, 51.741678 ], [ -176.343756, 51.731520 ], [ -176.474132, 51.747208 ], [ -176.497054, 51.761426 ], [ -176.509655, 51.763326 ], [ -176.519330, 51.758482 ], [ -176.582933, 51.691822 ], [ -176.608482, 51.693349 ], [ -176.702660, 51.685404 ], [ -176.713062, 51.683330 ], [ -176.735912, 51.662154 ], [ -176.751817, 51.635017 ], [ -176.801675, 51.613488 ], [ -176.809000, 51.616235 ], [ -176.823682, 51.634011 ], [ -176.826252, 51.640932 ], [ -176.814437, 51.660250 ], [ -176.837514, 51.682745 ], [ -176.863062, 51.684921 ], [ -176.903184, 51.635648 ], [ -176.930952, 51.592470 ], [ -176.938917, 51.590982 ], [ -176.954147, 51.592568 ], [ -176.984331, 51.602135 ], [ -176.987383, 51.606872 ], [ -176.991322, 51.629052 ], [ -176.984489, 51.657411 ], [ -176.976249, 51.666400 ], [ -176.950128, 51.686719 ], [ -176.930872, 51.697195 ], [ -176.906884, 51.696639 ], [ -176.896966, 51.700424 ], [ -176.873924, 51.724071 ], [ -176.870997, 51.729410 ], [ -176.870700, 51.731969 ], [ -176.882018, 51.766628 ], [ -176.905030, 51.771532 ], [ -176.918065, 51.788003 ], [ -176.917088, 51.797016 ], [ -176.911016, 51.807597 ], [ -176.904302, 51.811772 ], [ -176.856205, 51.818366 ], [ -176.790163, 51.817217 ], [ -176.762478, 51.867878 ] ] ], [ [ [ 178.785825, 51.633434 ], [ 178.804128, 51.635034 ], [ 178.864937, 51.623133 ], [ 178.903910, 51.614914 ], [ 178.919136, 51.605546 ], [ 178.917608, 51.594949 ], [ 178.918827, 51.588337 ], [ 178.920826, 51.586137 ], [ 179.002896, 51.552486 ], [ 179.076803, 51.498518 ], [ 179.101442, 51.485497 ], [ 179.143656, 51.469442 ], [ 179.164531, 51.464635 ], [ 179.178081, 51.464812 ], [ 179.191082, 51.462935 ], [ 179.218031, 51.438940 ], [ 179.226883, 51.423941 ], [ 179.230270, 51.413419 ], [ 179.236253, 51.409606 ], [ 179.263934, 51.405838 ], [ 179.334980, 51.404933 ], [ 179.386221, 51.404401 ], [ 179.400809, 51.400557 ], [ 179.462765, 51.376176 ], [ 179.467581, 51.371629 ], [ 179.450191, 51.365142 ], [ 179.399469, 51.359433 ], [ 179.389855, 51.361004 ], [ 179.384679, 51.364210 ], [ 179.366788, 51.371837 ], [ 179.261618, 51.357688 ], [ 179.220471, 51.376667 ], [ 179.218185, 51.387377 ], [ 179.206500, 51.393284 ], [ 179.097477, 51.440580 ], [ 179.060354, 51.454875 ], [ 179.034532, 51.478530 ], [ 179.013516, 51.497280 ], [ 178.969019, 51.531237 ], [ 178.951626, 51.541963 ], [ 178.843631, 51.578642 ], [ 178.831825, 51.580534 ], [ 178.795194, 51.575429 ], [ 178.785061, 51.571866 ], [ 178.767787, 51.576123 ], [ 178.706047, 51.593182 ], [ 178.634021, 51.623981 ], [ 178.631609, 51.625782 ], [ 178.625536, 51.637303 ], [ 178.645511, 51.657634 ], [ 178.664013, 51.661935 ], [ 178.675528, 51.659064 ], [ 178.681998, 51.649946 ], [ 178.689903, 51.644422 ], [ 178.738019, 51.632734 ], [ 178.785825, 51.633434 ] ] ], [ [ [ -178.954338, 51.339247 ], [ -178.954460, 51.332731 ], [ -178.965171, 51.322682 ], [ -178.979179, 51.314380 ], [ -178.987236, 51.311038 ], [ -178.990684, 51.311648 ], [ -178.992094, 51.381311 ], [ -178.977782, 51.398929 ], [ -178.964323, 51.402492 ], [ -178.926874, 51.383640 ], [ -178.914207, 51.363992 ], [ -178.908883, 51.340582 ], [ -178.954338, 51.339247 ] ] ], [ [ [ -179.069176, 51.262874 ], [ -179.072320, 51.250963 ], [ -179.097619, 51.226135 ], [ -179.126856, 51.219862 ], [ -179.136196, 51.229216 ], [ -179.147340, 51.276781 ], [ -179.137239, 51.286006 ], [ -179.113495, 51.300801 ], [ -179.094665, 51.301229 ], [ -179.075466, 51.284619 ], [ -179.069176, 51.262874 ] ] ], [ [ [ -152.242890, 58.241192 ], [ -152.280629, 58.242344 ], [ -152.311415, 58.221115 ], [ -152.265111, 58.135732 ], [ -152.273605, 58.125630 ], [ -152.343522, 58.119174 ], [ -152.401892, 58.120755 ], [ -152.425391, 58.127614 ], [ -152.482674, 58.129813 ], [ -152.514794, 58.114321 ], [ -152.529036, 58.093779 ], [ -152.530388, 58.087766 ], [ -152.541533, 58.083666 ], [ -152.554461, 58.084620 ], [ -152.557237, 58.086462 ], [ -152.569595, 58.114800 ], [ -152.557497, 58.160683 ], [ -152.559884, 58.170941 ], [ -152.562829, 58.177979 ], [ -152.584222, 58.187477 ], [ -152.597506, 58.179686 ], [ -152.615103, 58.116224 ], [ -152.631214, 58.081924 ], [ -152.656801, 58.061049 ], [ -152.706831, 58.050577 ], [ -152.771303, 58.046883 ], [ -152.759378, 58.031446 ], [ -152.765327, 58.008841 ], [ -152.796260, 57.992185 ], [ -152.871415, 57.997157 ], [ -152.947547, 57.983519 ], [ -152.982406, 57.984697 ], [ -153.097462, 58.004516 ], [ -153.202525, 58.030122 ], [ -153.209885, 58.034925 ], [ -153.214568, 58.042418 ], [ -153.218115, 58.043909 ], [ -153.289701, 58.050330 ], [ -153.344807, 58.040619 ], [ -153.365574, 58.039052 ], [ -153.419783, 58.059638 ], [ -153.418343, 58.064053 ], [ -153.412933, 58.069811 ], [ -153.316127, 58.140390 ], [ -153.281874, 58.147555 ], [ -153.274215, 58.148102 ], [ -153.262643, 58.145099 ], [ -153.227567, 58.123364 ], [ -153.199117, 58.102005 ], [ -153.168617, 58.088385 ], [ -153.156402, 58.090087 ], [ -153.148740, 58.106121 ], [ -153.167605, 58.127818 ], [ -153.209672, 58.150350 ], [ -153.223709, 58.162120 ], [ -153.202801, 58.208080 ], [ -153.170101, 58.216704 ], [ -153.073927, 58.195107 ], [ -153.060846, 58.194502 ], [ -153.036662, 58.199235 ], [ -153.000579, 58.211768 ], [ -152.998094, 58.214122 ], [ -153.006979, 58.221847 ], [ -153.061678, 58.235649 ], [ -153.082507, 58.244495 ], [ -153.101841, 58.257938 ], [ -153.102410, 58.260344 ], [ -153.099284, 58.264065 ], [ -153.044316, 58.306336 ], [ -153.004390, 58.300135 ], [ -152.993217, 58.296254 ], [ -152.982356, 58.287495 ], [ -152.941270, 58.279614 ], [ -152.888204, 58.283100 ], [ -152.878858, 58.288533 ], [ -152.869811, 58.304906 ], [ -152.884023, 58.307087 ], [ -152.912450, 58.307191 ], [ -152.921122, 58.313268 ], [ -152.936757, 58.330513 ], [ -152.936440, 58.334923 ], [ -152.925586, 58.339686 ], [ -152.895407, 58.345305 ], [ -152.870555, 58.335743 ], [ -152.821964, 58.328501 ], [ -152.804789, 58.339510 ], [ -152.774048, 58.366826 ], [ -152.787420, 58.369015 ], [ -152.839234, 58.372477 ], [ -152.883107, 58.400443 ], [ -152.888860, 58.409384 ], [ -152.886358, 58.410585 ], [ -152.864939, 58.404340 ], [ -152.844173, 58.402842 ], [ -152.812207, 58.403464 ], [ -152.787776, 58.411313 ], [ -152.774509, 58.419721 ], [ -152.771106, 58.429515 ], [ -152.733845, 58.460662 ], [ -152.723169, 58.462080 ], [ -152.689940, 58.459861 ], [ -152.610955, 58.475775 ], [ -152.601666, 58.490423 ], [ -152.600534, 58.494946 ], [ -152.609030, 58.496167 ], [ -152.619197, 58.493674 ], [ -152.622794, 58.494189 ], [ -152.653673, 58.506572 ], [ -152.666220, 58.544087 ], [ -152.665999, 58.564493 ], [ -152.638569, 58.587448 ], [ -152.616130, 58.601852 ], [ -152.567710, 58.621304 ], [ -152.560171, 58.619680 ], [ -152.550418, 58.610996 ], [ -152.549635, 58.601024 ], [ -152.545009, 58.594253 ], [ -152.502820, 58.593451 ], [ -152.453817, 58.618515 ], [ -152.354709, 58.638280 ], [ -152.337964, 58.637404 ], [ -152.329835, 58.632102 ], [ -152.337212, 58.589095 ], [ -152.372317, 58.531175 ], [ -152.387610, 58.522870 ], [ -152.418267, 58.515244 ], [ -152.467197, 58.476609 ], [ -152.498571, 58.449538 ], [ -152.505516, 58.441876 ], [ -152.512483, 58.427349 ], [ -152.493991, 58.354684 ], [ -152.476814, 58.350955 ], [ -152.387343, 58.359499 ], [ -152.364682, 58.364613 ], [ -152.344860, 58.391630 ], [ -152.348389, 58.401502 ], [ -152.355073, 58.413052 ], [ -152.358724, 58.415585 ], [ -152.356090, 58.423470 ], [ -152.328063, 58.434372 ], [ -152.320554, 58.433829 ], [ -152.301713, 58.428697 ], [ -152.279508, 58.415872 ], [ -152.227835, 58.376424 ], [ -152.234718, 58.362024 ], [ -152.224965, 58.357372 ], [ -152.200953, 58.355332 ], [ -152.129257, 58.396414 ], [ -152.125339, 58.396396 ], [ -152.090437, 58.372628 ], [ -152.089250, 58.367644 ], [ -152.119530, 58.329770 ], [ -152.138294, 58.295712 ], [ -152.147142, 58.266992 ], [ -152.146519, 58.249120 ], [ -152.116569, 58.248537 ], [ -152.107962, 58.260525 ], [ -152.107635, 58.280240 ], [ -152.082342, 58.309945 ], [ -152.064778, 58.317335 ], [ -152.049109, 58.289618 ], [ -152.030073, 58.296756 ], [ -151.997324, 58.345720 ], [ -151.986171, 58.350413 ], [ -151.981781, 58.347971 ], [ -151.966218, 58.332737 ], [ -151.963817, 58.328999 ], [ -151.964103, 58.269049 ], [ -151.972053, 58.230702 ], [ -151.986127, 58.213774 ], [ -152.081083, 58.154275 ], [ -152.112205, 58.148559 ], [ -152.194827, 58.174128 ], [ -152.223175, 58.194794 ], [ -152.224439, 58.202365 ], [ -152.219826, 58.206289 ], [ -152.207488, 58.206284 ], [ -152.203699, 58.212055 ], [ -152.233830, 58.243329 ], [ -152.242890, 58.241192 ] ] ], [ [ [ -165.071243, 62.576328 ], [ -165.076004, 62.582039 ], [ -165.071243, 62.588699 ], [ -165.052200, 62.598217 ], [ -165.025558, 62.622013 ], [ -165.013184, 62.640095 ], [ -165.003662, 62.641048 ], [ -164.947510, 62.601074 ], [ -164.947510, 62.596313 ], [ -164.952271, 62.589653 ], [ -164.996048, 62.586796 ], [ -165.071243, 62.576328 ] ] ], [ [ [ -150.263992, 61.122604 ], [ -150.271606, 61.123558 ], [ -150.265900, 61.127365 ], [ -150.242096, 61.137836 ], [ -150.228775, 61.162582 ], [ -150.220215, 61.170197 ], [ -150.164047, 61.174004 ], [ -150.158340, 61.167339 ], [ -150.158340, 61.160679 ], [ -150.190704, 61.139740 ], [ -150.228775, 61.123558 ], [ -150.263992, 61.122604 ] ] ], [ [ [ -147.422668, 60.864674 ], [ -147.429337, 60.865623 ], [ -147.441711, 60.868481 ], [ -147.453140, 60.870384 ], [ -147.459793, 60.877998 ], [ -147.456940, 60.881805 ], [ -147.447418, 60.881805 ], [ -147.431244, 60.877045 ], [ -147.418869, 60.871334 ], [ -147.422668, 60.864674 ] ] ], [ [ [ -147.455276, 60.717621 ], [ -147.487640, 60.728092 ], [ -147.479065, 60.730946 ], [ -147.432434, 60.736656 ], [ -147.395309, 60.743320 ], [ -147.383896, 60.741417 ], [ -147.381042, 60.734753 ], [ -147.403885, 60.720478 ], [ -147.455276, 60.717621 ] ] ], [ [ [ -147.387695, 60.687164 ], [ -147.406738, 60.695732 ], [ -147.415298, 60.704296 ], [ -147.407684, 60.708103 ], [ -147.390549, 60.709057 ], [ -147.362000, 60.714767 ], [ -147.357239, 60.699539 ], [ -147.373428, 60.689068 ], [ -147.387695, 60.687164 ] ] ], [ [ [ -173.045135, 60.622803 ], [ -173.067978, 60.632320 ], [ -173.083206, 60.642792 ], [ -173.115570, 60.658970 ], [ -173.113663, 60.665634 ], [ -173.090820, 60.698948 ], [ -173.074646, 60.704659 ], [ -173.063217, 60.695141 ], [ -173.059418, 60.655163 ], [ -173.041336, 60.630417 ], [ -173.045135, 60.622803 ] ] ], [ [ [ -147.483826, 60.618637 ], [ -147.484787, 60.623394 ], [ -147.466690, 60.633865 ], [ -147.469559, 60.639576 ], [ -147.500015, 60.645287 ], [ -147.500015, 60.653851 ], [ -147.480972, 60.659565 ], [ -147.460037, 60.663372 ], [ -147.483826, 60.683357 ], [ -147.473358, 60.693829 ], [ -147.451462, 60.699539 ], [ -147.422913, 60.684311 ], [ -147.405777, 60.686214 ], [ -147.381989, 60.655754 ], [ -147.371521, 60.654804 ], [ -147.341064, 60.674793 ], [ -147.328690, 60.675743 ], [ -147.308701, 60.665276 ], [ -147.307755, 60.661469 ], [ -147.348679, 60.627201 ], [ -147.384842, 60.628155 ], [ -147.394363, 60.638622 ], [ -147.406738, 60.646236 ], [ -147.421005, 60.629105 ], [ -147.454330, 60.619587 ], [ -147.483826, 60.618637 ] ] ], [ [ [ -148.156860, 60.618130 ], [ -148.190521, 60.662895 ], [ -148.210510, 60.680977 ], [ -148.231461, 60.695255 ], [ -148.238113, 60.703819 ], [ -148.239075, 60.715244 ], [ -148.235260, 60.729519 ], [ -148.220978, 60.741894 ], [ -148.216232, 60.755219 ], [ -148.202698, 60.762295 ], [ -148.160065, 60.759975 ], [ -148.126755, 60.751411 ], [ -148.107727, 60.742844 ], [ -148.099152, 60.718098 ], [ -148.089645, 60.680027 ], [ -148.090591, 60.661942 ], [ -148.113434, 60.646713 ], [ -148.138184, 60.621967 ], [ -148.156860, 60.618130 ] ] ], [ [ [ -146.216782, 60.450230 ], [ -146.247147, 60.451187 ], [ -146.329773, 60.458298 ], [ -146.330032, 60.470634 ], [ -146.318604, 60.496330 ], [ -146.289688, 60.515694 ], [ -146.155899, 60.526295 ], [ -145.951340, 60.576778 ], [ -145.886520, 60.585712 ], [ -145.844223, 60.586510 ], [ -145.800415, 60.593994 ], [ -145.795288, 60.603149 ], [ -145.774185, 60.613403 ], [ -145.764664, 60.613403 ], [ -145.760864, 60.606739 ], [ -145.764038, 60.591587 ], [ -145.798813, 60.561916 ], [ -145.820663, 60.550053 ], [ -145.828629, 60.549747 ], [ -146.039215, 60.492970 ], [ -146.074402, 60.480083 ], [ -146.109711, 60.470345 ], [ -146.216782, 60.450230 ] ] ], [ [ [ -152.080002, 60.341190 ], [ -152.082855, 60.345951 ], [ -152.072388, 60.361179 ], [ -152.053345, 60.362129 ], [ -152.023834, 60.364033 ], [ -152.005753, 60.375454 ], [ -152.004807, 60.390682 ], [ -152.014328, 60.399250 ], [ -152.012421, 60.404011 ], [ -151.980057, 60.414478 ], [ -151.961029, 60.442081 ], [ -151.960068, 60.458260 ], [ -151.965775, 60.474442 ], [ -151.962921, 60.489670 ], [ -151.952454, 60.510609 ], [ -151.930573, 60.516319 ], [ -151.909622, 60.509659 ], [ -151.839188, 60.485863 ], [ -151.841095, 60.481102 ], [ -151.882980, 60.467777 ], [ -151.895355, 60.460163 ], [ -151.891541, 60.448742 ], [ -151.891541, 60.440178 ], [ -151.898209, 60.437321 ], [ -151.940079, 60.430660 ], [ -151.963882, 60.408768 ], [ -151.974350, 60.396397 ], [ -151.974350, 60.388779 ], [ -151.956268, 60.371647 ], [ -151.956268, 60.367840 ], [ -152.080002, 60.341190 ] ] ], [ [ [ -145.089142, 60.320015 ], [ -145.089142, 60.325726 ], [ -145.076767, 60.352375 ], [ -145.064392, 60.361893 ], [ -145.039642, 60.366650 ], [ -145.041550, 60.357132 ], [ -145.059631, 60.341904 ], [ -145.084381, 60.322868 ], [ -145.089142, 60.320015 ] ] ], [ [ [ -145.210022, 60.303833 ], [ -145.219528, 60.303833 ], [ -145.254745, 60.311447 ], [ -145.299484, 60.330482 ], [ -145.254745, 60.340000 ], [ -145.206207, 60.353325 ], [ -145.173843, 60.359989 ], [ -145.175751, 60.350471 ], [ -145.178604, 60.344761 ], [ -145.171951, 60.335243 ], [ -145.171951, 60.330482 ], [ -145.182419, 60.325726 ], [ -145.196686, 60.317158 ], [ -145.210022, 60.303833 ] ] ], [ [ [ -172.289413, 60.297295 ], [ -172.307510, 60.309666 ], [ -172.310364, 60.322990 ], [ -172.366516, 60.334412 ], [ -172.486435, 60.335365 ], [ -172.595901, 60.318233 ], [ -172.724380, 60.358208 ], [ -172.948059, 60.481941 ], [ -173.044189, 60.493362 ], [ -173.052750, 60.515251 ], [ -173.044189, 60.547611 ], [ -172.990891, 60.578072 ], [ -172.951859, 60.605671 ], [ -172.919495, 60.600914 ], [ -172.912842, 60.588539 ], [ -172.903320, 60.534286 ], [ -172.784348, 60.458145 ], [ -172.551163, 60.387714 ], [ -172.380798, 60.384857 ], [ -172.231354, 60.320137 ], [ -172.231354, 60.308716 ], [ -172.240875, 60.302052 ], [ -172.289413, 60.297295 ] ] ], [ [ [ -145.136734, 60.296219 ], [ -145.141479, 60.308594 ], [ -145.142441, 60.319061 ], [ -145.161469, 60.328579 ], [ -145.161469, 60.341904 ], [ -145.140533, 60.352375 ], [ -145.112930, 60.371410 ], [ -145.107224, 60.386639 ], [ -145.091995, 60.399014 ], [ -145.086288, 60.399014 ], [ -145.085327, 60.386639 ], [ -145.108170, 60.349518 ], [ -145.112930, 60.335243 ], [ -145.111984, 60.317158 ], [ -145.108170, 60.307640 ], [ -145.113892, 60.300980 ], [ -145.136734, 60.296219 ] ] ], [ [ [ -148.076309, 60.274567 ], [ -148.123901, 60.281227 ], [ -148.148651, 60.293602 ], [ -148.154358, 60.317398 ], [ -148.143890, 60.327866 ], [ -148.123901, 60.333576 ], [ -148.102966, 60.345951 ], [ -148.091537, 60.360226 ], [ -148.055374, 60.371647 ], [ -148.014450, 60.379261 ], [ -148.002075, 60.379261 ], [ -147.993515, 60.376408 ], [ -147.989700, 60.368793 ], [ -147.993515, 60.349758 ], [ -148.023972, 60.282181 ], [ -148.039200, 60.275517 ], [ -148.076309, 60.274567 ] ] ], [ [ [ -146.627975, 60.239632 ], [ -146.641037, 60.240898 ], [ -146.650452, 60.242981 ], [ -146.689133, 60.271278 ], [ -146.693634, 60.279610 ], [ -146.693146, 60.284592 ], [ -146.681473, 60.292248 ], [ -146.649857, 60.305061 ], [ -146.594986, 60.321201 ], [ -146.571609, 60.321754 ], [ -146.540298, 60.338810 ], [ -146.524200, 60.350666 ], [ -146.542709, 60.357975 ], [ -146.575439, 60.357273 ], [ -146.607040, 60.351673 ], [ -146.624222, 60.341408 ], [ -146.655899, 60.340462 ], [ -146.717148, 60.349598 ], [ -146.725113, 60.359940 ], [ -146.723679, 60.387608 ], [ -146.721085, 60.396416 ], [ -146.637390, 60.467178 ], [ -146.610443, 60.485615 ], [ -146.590637, 60.491039 ], [ -146.528854, 60.492134 ], [ -146.523865, 60.487331 ], [ -146.505447, 60.476959 ], [ -146.455048, 60.465317 ], [ -146.376724, 60.479130 ], [ -146.355728, 60.476345 ], [ -146.352875, 60.468731 ], [ -146.354767, 60.458260 ], [ -146.358582, 60.454453 ], [ -146.355682, 60.440273 ], [ -146.356247, 60.425526 ], [ -146.350098, 60.407780 ], [ -146.330124, 60.407097 ], [ -146.308777, 60.414246 ], [ -146.284195, 60.417656 ], [ -146.127029, 60.430817 ], [ -146.123596, 60.428032 ], [ -146.126205, 60.424290 ], [ -146.094254, 60.410297 ], [ -146.090179, 60.407818 ], [ -146.090179, 60.398300 ], [ -146.095886, 60.380215 ], [ -146.106354, 60.375454 ], [ -146.152664, 60.376652 ], [ -146.191818, 60.362423 ], [ -146.197723, 60.351662 ], [ -146.222473, 60.343094 ], [ -146.252930, 60.338337 ], [ -146.268051, 60.347958 ], [ -146.302170, 60.349236 ], [ -146.392853, 60.327477 ], [ -146.458328, 60.307251 ], [ -146.607300, 60.241180 ], [ -146.627975, 60.239632 ] ] ], [ [ [ -147.483826, 60.224598 ], [ -147.499054, 60.235065 ], [ -147.505722, 60.253151 ], [ -147.496201, 60.265526 ], [ -147.421967, 60.279800 ], [ -147.341064, 60.305500 ], [ -147.340103, 60.275043 ], [ -147.389603, 60.256008 ], [ -147.483826, 60.224598 ] ] ], [ [ [ -144.285355, 60.157257 ], [ -144.301544, 60.157257 ], [ -144.312012, 60.162018 ], [ -144.308197, 60.166779 ], [ -144.289169, 60.171535 ], [ -144.263458, 60.174393 ], [ -144.263458, 60.167728 ], [ -144.271072, 60.162018 ], [ -144.285355, 60.157257 ] ] ], [ [ [ -152.560654, 60.094681 ], [ -152.582535, 60.108955 ], [ -152.632980, 60.148930 ], [ -152.639648, 60.165112 ], [ -152.619659, 60.183193 ], [ -152.600616, 60.173676 ], [ -152.578735, 60.169868 ], [ -152.567307, 60.158447 ], [ -152.558746, 60.128944 ], [ -152.550171, 60.113716 ], [ -152.553040, 60.098488 ], [ -152.560654, 60.094681 ] ] ], [ [ [ -144.345322, 60.090633 ], [ -144.349121, 60.090633 ], [ -144.386246, 60.122993 ], [ -144.429077, 60.147739 ], [ -144.430984, 60.152500 ], [ -144.423370, 60.154404 ], [ -144.399567, 60.154404 ], [ -144.340561, 60.143932 ], [ -144.328186, 60.129658 ], [ -144.324387, 60.113476 ], [ -144.345322, 60.090633 ] ] ], [ [ [ -144.367203, 59.988792 ], [ -144.372925, 59.988792 ], [ -144.389099, 59.997360 ], [ -144.389099, 60.004974 ], [ -144.386246, 60.012589 ], [ -144.391006, 60.028767 ], [ -144.393860, 60.048756 ], [ -144.388153, 60.050659 ], [ -144.380539, 60.046852 ], [ -144.372925, 60.024010 ], [ -144.367203, 60.000214 ], [ -144.367203, 59.988792 ] ] ], [ [ [ -131.827164, 55.477463 ], [ -131.831329, 55.479244 ], [ -131.837860, 55.492928 ], [ -131.840240, 55.503040 ], [ -131.845596, 55.510773 ], [ -131.847977, 55.517914 ], [ -131.831329, 55.528618 ], [ -131.802765, 55.541111 ], [ -131.791473, 55.542896 ], [ -131.755783, 55.544086 ], [ -131.752808, 55.541706 ], [ -131.753998, 55.520290 ], [ -131.755188, 55.516724 ], [ -131.768265, 55.511368 ], [ -131.783737, 55.501255 ], [ -131.800385, 55.496498 ], [ -131.811691, 55.493523 ], [ -131.817047, 55.484600 ], [ -131.827164, 55.477463 ] ] ], [ [ [ -133.365646, 55.453819 ], [ -133.396515, 55.473167 ], [ -133.412643, 55.491299 ], [ -133.414429, 55.499626 ], [ -133.427521, 55.506168 ], [ -133.443665, 55.518639 ], [ -133.453690, 55.532936 ], [ -133.448334, 55.545429 ], [ -133.447144, 55.553162 ], [ -133.413834, 55.569225 ], [ -133.386475, 55.567440 ], [ -133.369217, 55.573387 ], [ -133.339478, 55.569225 ], [ -133.327576, 55.560898 ], [ -133.316269, 55.544834 ], [ -133.312103, 55.542454 ], [ -133.294861, 55.540672 ], [ -133.287125, 55.537102 ], [ -133.283554, 55.522228 ], [ -133.287720, 55.503193 ], [ -133.314484, 55.475235 ], [ -133.335312, 55.470478 ], [ -133.357910, 55.455009 ], [ -133.365646, 55.453819 ] ] ], [ [ [ -133.820129, 55.435974 ], [ -133.823700, 55.441330 ], [ -133.820724, 55.452629 ], [ -133.784424, 55.470169 ], [ -133.780273, 55.486538 ], [ -133.767776, 55.500221 ], [ -133.720779, 55.516281 ], [ -133.718399, 55.522228 ], [ -133.726135, 55.528179 ], [ -133.753494, 55.531155 ], [ -133.757065, 55.533531 ], [ -133.752869, 55.544281 ], [ -133.732681, 55.555542 ], [ -133.700638, 55.556553 ], [ -133.660110, 55.556137 ], [ -133.638687, 55.543644 ], [ -133.632141, 55.539482 ], [ -133.627396, 55.541859 ], [ -133.623520, 55.551311 ], [ -133.604187, 55.550190 ], [ -133.587540, 55.538887 ], [ -133.585159, 55.534721 ], [ -133.586945, 55.503788 ], [ -133.605377, 55.495461 ], [ -133.629761, 55.488323 ], [ -133.640472, 55.455605 ], [ -133.658325, 55.444897 ], [ -133.668442, 55.441921 ], [ -133.716614, 55.457390 ], [ -133.732086, 55.466908 ], [ -133.740417, 55.468693 ], [ -133.792755, 55.453819 ], [ -133.810608, 55.440140 ], [ -133.820129, 55.435974 ] ] ], [ [ [ -133.535187, 55.427647 ], [ -133.550049, 55.430027 ], [ -133.564331, 55.441921 ], [ -133.617279, 55.447277 ], [ -133.620850, 55.451443 ], [ -133.618362, 55.457047 ], [ -133.594070, 55.471668 ], [ -133.570877, 55.476425 ], [ -133.545303, 55.493675 ], [ -133.541733, 55.506763 ], [ -133.527451, 55.528179 ], [ -133.517334, 55.527584 ], [ -133.459641, 55.504978 ], [ -133.437027, 55.488323 ], [ -133.429886, 55.476425 ], [ -133.426331, 55.463932 ], [ -133.431671, 55.449657 ], [ -133.451904, 55.437759 ], [ -133.535187, 55.427647 ] ] ], [ [ [ -133.663086, 55.416344 ], [ -133.666656, 55.421104 ], [ -133.650589, 55.434784 ], [ -133.639282, 55.438950 ], [ -133.618469, 55.438354 ], [ -133.616089, 55.432404 ], [ -133.644043, 55.420509 ], [ -133.663086, 55.416344 ] ] ], [ [ [ -133.306763, 55.400879 ], [ -133.321625, 55.405636 ], [ -133.325195, 55.413963 ], [ -133.318649, 55.426456 ], [ -133.293076, 55.444897 ], [ -133.265717, 55.449062 ], [ -133.243103, 55.449657 ], [ -133.234177, 55.444897 ], [ -133.231796, 55.438950 ], [ -133.232986, 55.430027 ], [ -133.250839, 55.409801 ], [ -133.254410, 55.406826 ], [ -133.271652, 55.407421 ], [ -133.286530, 55.402065 ], [ -133.306763, 55.400879 ] ] ], [ [ [ -163.134583, 55.396416 ], [ -163.160278, 55.404984 ], [ -163.173599, 55.414501 ], [ -163.171692, 55.426872 ], [ -163.159317, 55.433537 ], [ -163.139343, 55.435440 ], [ -163.122208, 55.430679 ], [ -163.117447, 55.415451 ], [ -163.119354, 55.401176 ], [ -163.134583, 55.396416 ] ] ], [ [ [ -133.438217, 55.380653 ], [ -133.443573, 55.384815 ], [ -133.443573, 55.399094 ], [ -133.439407, 55.413963 ], [ -133.434647, 55.423481 ], [ -133.423355, 55.424671 ], [ -133.412643, 55.419319 ], [ -133.409073, 55.408016 ], [ -133.416214, 55.391956 ], [ -133.423355, 55.381844 ], [ -133.438217, 55.380653 ] ] ], [ [ [ -130.963089, 55.315533 ], [ -130.968140, 55.315895 ], [ -130.969940, 55.317158 ], [ -130.965973, 55.331963 ], [ -130.972107, 55.343697 ], [ -130.976990, 55.345322 ], [ -130.979156, 55.351822 ], [ -130.983490, 55.365002 ], [ -130.981857, 55.370056 ], [ -130.970490, 55.378902 ], [ -130.948288, 55.380886 ], [ -130.930954, 55.344238 ], [ -130.929871, 55.340988 ], [ -130.931137, 55.337017 ], [ -130.963089, 55.315533 ] ] ], [ [ [ -160.038483, 55.306866 ], [ -160.069885, 55.307819 ], [ -160.104156, 55.313530 ], [ -160.112717, 55.333515 ], [ -160.087021, 55.343033 ], [ -160.062271, 55.343033 ], [ -160.046097, 55.330662 ], [ -160.027054, 55.323997 ], [ -160.028961, 55.313530 ], [ -160.038483, 55.306866 ] ] ], [ [ [ -131.606445, 55.303131 ], [ -131.643921, 55.320976 ], [ -131.660568, 55.331684 ], [ -131.661163, 55.336441 ], [ -131.656998, 55.337631 ], [ -131.637970, 55.332279 ], [ -131.627258, 55.326328 ], [ -131.603470, 55.309673 ], [ -131.596924, 55.306698 ], [ -131.598114, 55.304317 ], [ -131.606445, 55.303131 ] ] ], [ [ [ -131.033905, 55.284466 ], [ -131.039368, 55.287357 ], [ -131.044189, 55.296677 ], [ -131.042572, 55.303104 ], [ -131.038727, 55.305515 ], [ -131.031174, 55.304070 ], [ -131.027466, 55.299408 ], [ -131.027145, 55.286556 ], [ -131.033905, 55.284466 ] ] ], [ [ [ -160.338699, 55.246498 ], [ -160.372604, 55.259911 ], [ -160.378891, 55.266693 ], [ -160.380478, 55.272804 ], [ -160.390427, 55.286575 ], [ -160.408798, 55.290749 ], [ -160.422272, 55.286469 ], [ -160.441895, 55.298264 ], [ -160.449799, 55.297081 ], [ -160.457764, 55.291893 ], [ -160.468262, 55.288925 ], [ -160.475494, 55.289230 ], [ -160.518143, 55.309101 ], [ -160.526947, 55.319042 ], [ -160.506927, 55.327728 ], [ -160.500656, 55.344612 ], [ -160.491348, 55.354843 ], [ -160.468475, 55.356548 ], [ -160.425659, 55.338882 ], [ -160.408615, 55.341679 ], [ -160.403351, 55.346298 ], [ -160.361755, 55.363232 ], [ -160.344376, 55.362961 ], [ -160.333694, 55.360138 ], [ -160.326462, 55.353188 ], [ -160.317657, 55.338531 ], [ -160.306549, 55.303276 ], [ -160.327347, 55.266937 ], [ -160.331940, 55.249092 ], [ -160.338699, 55.246498 ] ] ], [ [ [ -133.608948, 55.236694 ], [ -133.632141, 55.245022 ], [ -133.688660, 55.300346 ], [ -133.689850, 55.317596 ], [ -133.667847, 55.329494 ], [ -133.633331, 55.355072 ], [ -133.631546, 55.363995 ], [ -133.632736, 55.366375 ], [ -133.648804, 55.366970 ], [ -133.674377, 55.371136 ], [ -133.674377, 55.377678 ], [ -133.636307, 55.394333 ], [ -133.617874, 55.399094 ], [ -133.610733, 55.419319 ], [ -133.578018, 55.430027 ], [ -133.563736, 55.415154 ], [ -133.558380, 55.412773 ], [ -133.494736, 55.418129 ], [ -133.463211, 55.407421 ], [ -133.458450, 55.398499 ], [ -133.462021, 55.379463 ], [ -133.465591, 55.374702 ], [ -133.492355, 55.367565 ], [ -133.510193, 55.357452 ], [ -133.539352, 55.337227 ], [ -133.544708, 55.336037 ], [ -133.559570, 55.340202 ], [ -133.570877, 55.339012 ], [ -133.572662, 55.336037 ], [ -133.572067, 55.319977 ], [ -133.592285, 55.290234 ], [ -133.606766, 55.254005 ], [ -133.604187, 55.239075 ], [ -133.608948, 55.236694 ] ] ], [ [ [ -131.408966, 55.235352 ], [ -131.428009, 55.238922 ], [ -131.440491, 55.247250 ], [ -131.445847, 55.254387 ], [ -131.458939, 55.263905 ], [ -131.459534, 55.266285 ], [ -131.455963, 55.268070 ], [ -131.447632, 55.263905 ], [ -131.413132, 55.254982 ], [ -131.399445, 55.249035 ], [ -131.395294, 55.241894 ], [ -131.400040, 55.236542 ], [ -131.408966, 55.235352 ] ] ], [ [ [ -133.341263, 55.205700 ], [ -133.357056, 55.221783 ], [ -133.362411, 55.224758 ], [ -133.377884, 55.223568 ], [ -133.395126, 55.215240 ], [ -133.414764, 55.209885 ], [ -133.433792, 55.209290 ], [ -133.453781, 55.218498 ], [ -133.467117, 55.244984 ], [ -133.470673, 55.262234 ], [ -133.465332, 55.271751 ], [ -133.450455, 55.273537 ], [ -133.433792, 55.271156 ], [ -133.423096, 55.274132 ], [ -133.424286, 55.281269 ], [ -133.442719, 55.284245 ], [ -133.454620, 55.290192 ], [ -133.459747, 55.306782 ], [ -133.458786, 55.318150 ], [ -133.436356, 55.330158 ], [ -133.419525, 55.327076 ], [ -133.407028, 55.328857 ], [ -133.395370, 55.341751 ], [ -133.359467, 55.345596 ], [ -133.329697, 55.344326 ], [ -133.305313, 55.328262 ], [ -133.297577, 55.309227 ], [ -133.297577, 55.305660 ], [ -133.311844, 55.295547 ], [ -133.316605, 55.285435 ], [ -133.315414, 55.281864 ], [ -133.307693, 55.281269 ], [ -133.301147, 55.287815 ], [ -133.292404, 55.291378 ], [ -133.274963, 55.293167 ], [ -133.266647, 55.291382 ], [ -133.232132, 55.267590 ], [ -133.232727, 55.260448 ], [ -133.253555, 55.223568 ], [ -133.271393, 55.214645 ], [ -133.308289, 55.211670 ], [ -133.341263, 55.205700 ] ] ], [ [ [ -161.629684, 55.196575 ], [ -161.691559, 55.198479 ], [ -161.693451, 55.217514 ], [ -161.684891, 55.232742 ], [ -161.656342, 55.244164 ], [ -161.617310, 55.241310 ], [ -161.579239, 55.250828 ], [ -161.540222, 55.258442 ], [ -161.529755, 55.255585 ], [ -161.527847, 55.250828 ], [ -161.552597, 55.221321 ], [ -161.560211, 55.207047 ], [ -161.574478, 55.207996 ], [ -161.587814, 55.209900 ], [ -161.629684, 55.196575 ] ] ], [ [ [ -148.122589, 59.987484 ], [ -148.142822, 59.987484 ], [ -148.147583, 59.994621 ], [ -148.130920, 60.001762 ], [ -148.143616, 60.014191 ], [ -148.127350, 60.024364 ], [ -148.114273, 60.048161 ], [ -148.095718, 60.065933 ], [ -148.066681, 60.086231 ], [ -148.039307, 60.110027 ], [ -148.019089, 60.118355 ], [ -148.007980, 60.113400 ], [ -148.000046, 60.118355 ], [ -147.994110, 60.135010 ], [ -147.979828, 60.154045 ], [ -147.971497, 60.159996 ], [ -147.954849, 60.135010 ], [ -147.938187, 60.129063 ], [ -147.914398, 60.129063 ], [ -147.890594, 60.115974 ], [ -147.890594, 60.104076 ], [ -147.951279, 60.075523 ], [ -147.990540, 60.066006 ], [ -148.038116, 60.064816 ], [ -148.054779, 60.052921 ], [ -148.052399, 60.039833 ], [ -148.091660, 60.008900 ], [ -148.122589, 59.987484 ] ] ], [ [ [ -148.036102, 59.937874 ], [ -148.040863, 59.939777 ], [ -148.053238, 59.951199 ], [ -148.028488, 59.975945 ], [ -147.930450, 60.034004 ], [ -147.887619, 60.066364 ], [ -147.853363, 60.078735 ], [ -147.833374, 60.073978 ], [ -147.813385, 60.055893 ], [ -147.861923, 60.007355 ], [ -147.865738, 59.995930 ], [ -147.901901, 59.974041 ], [ -148.036102, 59.937874 ] ] ], [ [ [ -148.227417, 59.932163 ], [ -148.238831, 59.937874 ], [ -148.235977, 59.941681 ], [ -148.204559, 59.943584 ], [ -148.204559, 59.949295 ], [ -148.216934, 59.954052 ], [ -148.217896, 59.957859 ], [ -148.195999, 59.964523 ], [ -148.195999, 59.970234 ], [ -148.219803, 59.972137 ], [ -148.218842, 59.976894 ], [ -148.188751, 59.980389 ], [ -148.149368, 59.978798 ], [ -148.130325, 59.971184 ], [ -148.111298, 59.971184 ], [ -148.093201, 59.987366 ], [ -148.013260, 60.037811 ], [ -148.000885, 60.038761 ], [ -147.993271, 60.030197 ], [ -148.035156, 59.991173 ], [ -148.083694, 59.959763 ], [ -148.148407, 59.936920 ], [ -148.227417, 59.932163 ] ] ], [ [ [ -149.340042, 59.899799 ], [ -149.357178, 59.899799 ], [ -149.360992, 59.906464 ], [ -149.352417, 59.914078 ], [ -149.351471, 59.924549 ], [ -149.345749, 59.936920 ], [ -149.331482, 59.944534 ], [ -149.317200, 59.936920 ], [ -149.321960, 59.916935 ], [ -149.340042, 59.899799 ] ] ], [ [ [ -149.377167, 59.836983 ], [ -149.385727, 59.838886 ], [ -149.380020, 59.847454 ], [ -149.390488, 59.851261 ], [ -149.402863, 59.844597 ], [ -149.407623, 59.852211 ], [ -149.400955, 59.868393 ], [ -149.383835, 59.869343 ], [ -149.363846, 59.856972 ], [ -149.365738, 59.841743 ], [ -149.377167, 59.836983 ] ] ], [ [ [ -144.590881, 59.795582 ], [ -144.601349, 59.797485 ], [ -144.593735, 59.812714 ], [ -144.576599, 59.827942 ], [ -144.567078, 59.851738 ], [ -144.449066, 59.916458 ], [ -144.447159, 59.926926 ], [ -144.439545, 59.940250 ], [ -144.428131, 59.939301 ], [ -144.404327, 59.942154 ], [ -144.354843, 59.966904 ], [ -144.348175, 59.981178 ], [ -144.323425, 59.992599 ], [ -144.312012, 59.986889 ], [ -144.291061, 59.993553 ], [ -144.221588, 60.008781 ], [ -144.196838, 60.001167 ], [ -144.195892, 59.997360 ], [ -144.312012, 59.949768 ], [ -144.382446, 59.915504 ], [ -144.424316, 59.894566 ], [ -144.450974, 59.871723 ], [ -144.519501, 59.842216 ], [ -144.563278, 59.809856 ], [ -144.590881, 59.795582 ] ] ], [ [ [ -147.858475, 59.763817 ], [ -147.919144, 59.775711 ], [ -147.927475, 59.784039 ], [ -147.903687, 59.809025 ], [ -147.912018, 59.835197 ], [ -147.879883, 59.867321 ], [ -147.815643, 59.874458 ], [ -147.803741, 59.879219 ], [ -147.804932, 59.887547 ], [ -147.815643, 59.901825 ], [ -147.808502, 59.918480 ], [ -147.739502, 59.952984 ], [ -147.713333, 59.952984 ], [ -147.681198, 59.961311 ], [ -147.681198, 59.973209 ], [ -147.707382, 59.981537 ], [ -147.697861, 59.992245 ], [ -147.594360, 60.021988 ], [ -147.558655, 60.048161 ], [ -147.471817, 60.083851 ], [ -147.390915, 60.127872 ], [ -147.377823, 60.156425 ], [ -147.323090, 60.189739 ], [ -147.315964, 60.202827 ], [ -147.321899, 60.214722 ], [ -147.305252, 60.223049 ], [ -147.255280, 60.233757 ], [ -147.213058, 60.248779 ], [ -147.212448, 60.264690 ], [ -147.211487, 60.292778 ], [ -147.183899, 60.315849 ], [ -147.214828, 60.337265 ], [ -147.182709, 60.361061 ], [ -147.119644, 60.377716 ], [ -147.091095, 60.377716 ], [ -147.085144, 60.368198 ], [ -147.129166, 60.342026 ], [ -147.124405, 60.337265 ], [ -147.007812, 60.345592 ], [ -146.999496, 60.340836 ], [ -146.999496, 60.332508 ], [ -147.082764, 60.289677 ], [ -147.110138, 60.268261 ], [ -147.105377, 60.262314 ], [ -147.063736, 60.268261 ], [ -147.010193, 60.295624 ], [ -146.932861, 60.308712 ], [ -146.918594, 60.306332 ], [ -146.918594, 60.289677 ], [ -146.957855, 60.253983 ], [ -147.208878, 60.142151 ], [ -147.357605, 60.041023 ], [ -147.376633, 60.006519 ], [ -147.374252, 59.983913 ], [ -147.359970, 59.968449 ], [ -147.352844, 59.961311 ], [ -147.371872, 59.954170 ], [ -147.421844, 59.963688 ], [ -147.490845, 59.941086 ], [ -147.501556, 59.926807 ], [ -147.486084, 59.907772 ], [ -147.451584, 59.901825 ], [ -147.446823, 59.882790 ], [ -147.453964, 59.867321 ], [ -147.494415, 59.849476 ], [ -147.533676, 59.842339 ], [ -147.556290, 59.850666 ], [ -147.600296, 59.854233 ], [ -147.637192, 59.841148 ], [ -147.660980, 59.814972 ], [ -147.766861, 59.791180 ], [ -147.858475, 59.763817 ] ] ], [ [ [ -139.549759, 59.703259 ], [ -139.588776, 59.708969 ], [ -139.595444, 59.718487 ], [ -139.578308, 59.734665 ], [ -139.562134, 59.736568 ], [ -139.534531, 59.724197 ], [ -139.516434, 59.713726 ], [ -139.519302, 59.708015 ], [ -139.549759, 59.703259 ] ] ], [ [ [ -163.944794, 59.675884 ], [ -163.964432, 59.679451 ], [ -164.004288, 59.691944 ], [ -164.027481, 59.706814 ], [ -164.027481, 59.709789 ], [ -164.023331, 59.710384 ], [ -164.010239, 59.703842 ], [ -163.988220, 59.694324 ], [ -163.965622, 59.687778 ], [ -163.945984, 59.687183 ], [ -163.938858, 59.689564 ], [ -163.932312, 59.693729 ], [ -163.930527, 59.691944 ], [ -163.930527, 59.688374 ], [ -163.940643, 59.677666 ], [ -163.944794, 59.675884 ] ] ], [ [ [ -139.662064, 59.617596 ], [ -139.671585, 59.624260 ], [ -139.670624, 59.628067 ], [ -139.654449, 59.630920 ], [ -139.640167, 59.626163 ], [ -139.649689, 59.618549 ], [ -139.662064, 59.617596 ] ] ], [ [ [ -149.770020, 59.609982 ], [ -149.778580, 59.614742 ], [ -149.816650, 59.644249 ], [ -149.842346, 59.666138 ], [ -149.839493, 59.675655 ], [ -149.802368, 59.653767 ], [ -149.784286, 59.634727 ], [ -149.762405, 59.610935 ], [ -149.770020, 59.609982 ] ] ], [ [ [ -139.775330, 59.558586 ], [ -139.783890, 59.558586 ], [ -139.795319, 59.574768 ], [ -139.798172, 59.585236 ], [ -139.770569, 59.599514 ], [ -139.725830, 59.638535 ], [ -139.713455, 59.634727 ], [ -139.728683, 59.610935 ], [ -139.728683, 59.597610 ], [ -139.715363, 59.588093 ], [ -139.719177, 59.582382 ], [ -139.753433, 59.581429 ], [ -139.775330, 59.558586 ] ] ], [ [ [ -153.515289, 59.320877 ], [ -153.546692, 59.331348 ], [ -153.550507, 59.338009 ], [ -153.544785, 59.345623 ], [ -153.544785, 59.357998 ], [ -153.553360, 59.367516 ], [ -153.573349, 59.371323 ], [ -153.571442, 59.380840 ], [ -153.560013, 59.391312 ], [ -153.539078, 59.392262 ], [ -153.510529, 59.391312 ], [ -153.453415, 59.408443 ], [ -153.412491, 59.415104 ], [ -153.390610, 59.412251 ], [ -153.375366, 59.395119 ], [ -153.347778, 59.377987 ], [ -153.345871, 59.366566 ], [ -153.343018, 59.356094 ], [ -153.365860, 59.337059 ], [ -153.413452, 59.322781 ], [ -153.424866, 59.326588 ], [ -153.466751, 59.323734 ], [ -153.515289, 59.320877 ] ] ], [ [ [ -150.721802, 59.292088 ], [ -150.731323, 59.293037 ], [ -150.740829, 59.305412 ], [ -150.762726, 59.304459 ], [ -150.773193, 59.308266 ], [ -150.773193, 59.319687 ], [ -150.772247, 59.333015 ], [ -150.749405, 59.338726 ], [ -150.742737, 59.350147 ], [ -150.717987, 59.369183 ], [ -150.701813, 59.389168 ], [ -150.705612, 59.400589 ], [ -150.697052, 59.413914 ], [ -150.671356, 59.410107 ], [ -150.639938, 59.403446 ], [ -150.617096, 59.394878 ], [ -150.609482, 59.386314 ], [ -150.613297, 59.370132 ], [ -150.618057, 59.355858 ], [ -150.631378, 59.347290 ], [ -150.638046, 59.347290 ], [ -150.650421, 59.343483 ], [ -150.661835, 59.323494 ], [ -150.680878, 59.305412 ], [ -150.721802, 59.292088 ] ] ], [ [ [ -151.796356, 59.136948 ], [ -151.823013, 59.138851 ], [ -151.854416, 59.145512 ], [ -151.879166, 59.148369 ], [ -151.880127, 59.157887 ], [ -151.858231, 59.165501 ], [ -151.826828, 59.175968 ], [ -151.810638, 59.176922 ], [ -151.799225, 59.178825 ], [ -151.790649, 59.169308 ], [ -151.791611, 59.161694 ], [ -151.793503, 59.149319 ], [ -151.793503, 59.141705 ], [ -151.796356, 59.136948 ] ] ], [ [ [ -151.430878, 59.110294 ], [ -151.440399, 59.111248 ], [ -151.468948, 59.113152 ], [ -151.517487, 59.128380 ], [ -151.525101, 59.135994 ], [ -151.526062, 59.146465 ], [ -151.505112, 59.146465 ], [ -151.471802, 59.140755 ], [ -151.433731, 59.132187 ], [ -151.430878, 59.118862 ], [ -151.430878, 59.110294 ] ] ], [ [ [ -151.673584, 59.097923 ], [ -151.708801, 59.100777 ], [ -151.723083, 59.113152 ], [ -151.723083, 59.119812 ], [ -151.704041, 59.130283 ], [ -151.685959, 59.129333 ], [ -151.655502, 59.118862 ], [ -151.640274, 59.114101 ], [ -151.643127, 59.104584 ], [ -151.655502, 59.098873 ], [ -151.673584, 59.097923 ] ] ], [ [ [ -135.298630, 58.919262 ], [ -135.316025, 58.924854 ], [ -135.334106, 58.943890 ], [ -135.353149, 59.010517 ], [ -135.349335, 59.020035 ], [ -135.330307, 59.012421 ], [ -135.296036, 58.959118 ], [ -135.298630, 58.919262 ] ] ], [ [ [ -152.058334, 58.912563 ], [ -152.074524, 58.912563 ], [ -152.074524, 58.924934 ], [ -152.063095, 58.946827 ], [ -152.031693, 58.948730 ], [ -152.004089, 58.941116 ], [ -152.009796, 58.934452 ], [ -152.022171, 58.938263 ], [ -152.046921, 58.928741 ], [ -152.058334, 58.912563 ] ] ], [ [ [ -152.016464, 58.908756 ], [ -152.022171, 58.915417 ], [ -152.019318, 58.922081 ], [ -151.999329, 58.923985 ], [ -151.978394, 58.925888 ], [ -151.962219, 58.922081 ], [ -151.955551, 58.914467 ], [ -151.988861, 58.911610 ], [ -152.016464, 58.908756 ] ] ], [ [ [ -152.316269, 58.905899 ], [ -152.342926, 58.905899 ], [ -152.356247, 58.915417 ], [ -152.331497, 58.923031 ], [ -152.312469, 58.931599 ], [ -152.306763, 58.942070 ], [ -152.312469, 58.955395 ], [ -152.307709, 58.962055 ], [ -152.278198, 58.953491 ], [ -152.242035, 58.938263 ], [ -152.218246, 58.938263 ], [ -152.178268, 58.946827 ], [ -152.159225, 58.946827 ], [ -152.154465, 58.943020 ], [ -152.159225, 58.934452 ], [ -152.189682, 58.931599 ], [ -152.209671, 58.929695 ], [ -152.230621, 58.916370 ], [ -152.276306, 58.906853 ], [ -152.316269, 58.905899 ] ] ], [ [ [ -136.793076, 58.904747 ], [ -136.820679, 58.911411 ], [ -136.861603, 58.932350 ], [ -136.861603, 58.941868 ], [ -136.849228, 58.948532 ], [ -136.834000, 58.947578 ], [ -136.811157, 58.937111 ], [ -136.809250, 58.924736 ], [ -136.797836, 58.921883 ], [ -136.786407, 58.913315 ], [ -136.785461, 58.906651 ], [ -136.793076, 58.904747 ] ] ], [ [ [ -136.559891, 58.877148 ], [ -136.572266, 58.884762 ], [ -136.578918, 58.892376 ], [ -136.572266, 58.896183 ], [ -136.562744, 58.897133 ], [ -136.557983, 58.896183 ], [ -136.552277, 58.883808 ], [ -136.553223, 58.878098 ], [ -136.559891, 58.877148 ] ] ], [ [ [ -160.183807, 58.819271 ], [ -160.203796, 58.824982 ], [ -160.208557, 58.835453 ], [ -160.226639, 58.839260 ], [ -160.233307, 58.845921 ], [ -160.232346, 58.852585 ], [ -160.224731, 58.853535 ], [ -160.212357, 58.851631 ], [ -160.180954, 58.832596 ], [ -160.179047, 58.824032 ], [ -160.183807, 58.819271 ] ] ], [ [ [ -160.426514, 58.679359 ], [ -160.438889, 58.688877 ], [ -160.428421, 58.701248 ], [ -160.424606, 58.721237 ], [ -160.416992, 58.741226 ], [ -160.405579, 58.747887 ], [ -160.398911, 58.746937 ], [ -160.385590, 58.728851 ], [ -160.381775, 58.714577 ], [ -160.387497, 58.701248 ], [ -160.426514, 58.679359 ] ] ], [ [ [ -160.274231, 58.636528 ], [ -160.271378, 58.657467 ], [ -160.274231, 58.663177 ], [ -160.310394, 58.678406 ], [ -160.316101, 58.684116 ], [ -160.313248, 58.696491 ], [ -160.306595, 58.705055 ], [ -160.306595, 58.712669 ], [ -160.300873, 58.725998 ], [ -160.297073, 58.725998 ], [ -160.277084, 58.715527 ], [ -160.277084, 58.686974 ], [ -160.270416, 58.675552 ], [ -160.257095, 58.678406 ], [ -160.244720, 58.664131 ], [ -160.250427, 58.648903 ], [ -160.274231, 58.636528 ] ] ], [ [ [ -136.205231, 58.629562 ], [ -136.233780, 58.645744 ], [ -136.246368, 58.663185 ], [ -136.239487, 58.670490 ], [ -136.229980, 58.675251 ], [ -136.217606, 58.672394 ], [ -136.211884, 58.660973 ], [ -136.205231, 58.629562 ] ] ], [ [ [ -159.971558, 58.591793 ], [ -159.979172, 58.591793 ], [ -159.994400, 58.608925 ], [ -159.993454, 58.614639 ], [ -159.979172, 58.611782 ], [ -159.963943, 58.608925 ], [ -159.960144, 58.601311 ], [ -159.971558, 58.591793 ] ] ], [ [ [ -136.096481, 58.558895 ], [ -136.149780, 58.591255 ], [ -136.153595, 58.596966 ], [ -136.145981, 58.607433 ], [ -136.123138, 58.609337 ], [ -136.100296, 58.596012 ], [ -136.089828, 58.575073 ], [ -136.088867, 58.565556 ], [ -136.096481, 58.558895 ] ] ], [ [ [ -134.908417, 58.553802 ], [ -134.917923, 58.560345 ], [ -134.922684, 58.571053 ], [ -134.920898, 58.572838 ], [ -134.906036, 58.567482 ], [ -134.895325, 58.557964 ], [ -134.898895, 58.554398 ], [ -134.908417, 58.553802 ] ] ], [ [ [ -161.075638, 58.549915 ], [ -161.081345, 58.555626 ], [ -161.077530, 58.574661 ], [ -161.084198, 58.589890 ], [ -161.076584, 58.607975 ], [ -161.078491, 58.635578 ], [ -161.065155, 58.669842 ], [ -161.056595, 58.702202 ], [ -160.918579, 58.746937 ], [ -160.843399, 58.751694 ], [ -160.780579, 58.776440 ], [ -160.738693, 58.800236 ], [ -160.700623, 58.817368 ], [ -160.686356, 58.819271 ], [ -160.684448, 58.815464 ], [ -160.849106, 58.632721 ], [ -160.880508, 58.581326 ], [ -160.961411, 58.553722 ], [ -161.026138, 58.558483 ], [ -161.051834, 58.551819 ], [ -161.075638, 58.549915 ] ] ], [ [ [ -136.017731, 58.504879 ], [ -136.027237, 58.506783 ], [ -136.026291, 58.513447 ], [ -136.017731, 58.520107 ], [ -135.999649, 58.523914 ], [ -135.986313, 58.517254 ], [ -135.995834, 58.508686 ], [ -136.017731, 58.504879 ] ] ], [ [ [ -134.955994, 58.469925 ], [ -134.983963, 58.475876 ], [ -135.004181, 58.484798 ], [ -135.032135, 58.513947 ], [ -135.028580, 58.519894 ], [ -135.021439, 58.519299 ], [ -135.002991, 58.506214 ], [ -134.990494, 58.504429 ], [ -134.970276, 58.502644 ], [ -134.967896, 58.499073 ], [ -134.967300, 58.489555 ], [ -134.939941, 58.475876 ], [ -134.939941, 58.471115 ], [ -134.955994, 58.469925 ] ] ], [ [ [ -134.840591, 58.369987 ], [ -134.867966, 58.405087 ], [ -134.911972, 58.457436 ], [ -134.925659, 58.478848 ], [ -134.923279, 58.487179 ], [ -134.913162, 58.487179 ], [ -134.903656, 58.481228 ], [ -134.851303, 58.431259 ], [ -134.806091, 58.374153 ], [ -134.810257, 58.370583 ], [ -134.840591, 58.369987 ] ] ], [ [ [ -135.649857, 58.324516 ], [ -135.696503, 58.335938 ], [ -135.727905, 58.365444 ], [ -135.724106, 58.370201 ], [ -135.700302, 58.377819 ], [ -135.669846, 58.380672 ], [ -135.631775, 58.380672 ], [ -135.602264, 58.374962 ], [ -135.538498, 58.344505 ], [ -135.538498, 58.337841 ], [ -135.544220, 58.330227 ], [ -135.598465, 58.325470 ], [ -135.649857, 58.324516 ] ] ], [ [ [ -136.094284, 58.257118 ], [ -136.125214, 58.261879 ], [ -136.154968, 58.276749 ], [ -136.157333, 58.279129 ], [ -136.156158, 58.283890 ], [ -136.135330, 58.293407 ], [ -136.118668, 58.303520 ], [ -136.076447, 58.306492 ], [ -136.047882, 58.318985 ], [ -136.038361, 58.318985 ], [ -136.033020, 58.311253 ], [ -136.035400, 58.273182 ], [ -136.041336, 58.272587 ], [ -136.055023, 58.274368 ], [ -136.068115, 58.267826 ], [ -136.094284, 58.257118 ] ] ], [ [ [ -136.313797, 58.229755 ], [ -136.336990, 58.235703 ], [ -136.346512, 58.234512 ], [ -136.358994, 58.230350 ], [ -136.373276, 58.232136 ], [ -136.387115, 58.252415 ], [ -136.404800, 58.267231 ], [ -136.400040, 58.271992 ], [ -136.377335, 58.268330 ], [ -136.371490, 58.265446 ], [ -136.353653, 58.266041 ], [ -136.340561, 58.271397 ], [ -136.317947, 58.273777 ], [ -136.284042, 58.269611 ], [ -136.281067, 58.267826 ], [ -136.282257, 58.259499 ], [ -136.287018, 58.245815 ], [ -136.307251, 58.232136 ], [ -136.313797, 58.229755 ] ] ], [ [ [ -151.862320, 58.168266 ], [ -151.871841, 58.169456 ], [ -151.890869, 58.193249 ], [ -151.888489, 58.219425 ], [ -151.862320, 58.257496 ], [ -151.817108, 58.263443 ], [ -151.802841, 58.259876 ], [ -151.790939, 58.246788 ], [ -151.795700, 58.211094 ], [ -151.817108, 58.183731 ], [ -151.862320, 58.168266 ] ] ], [ [ [ -134.108322, 58.082668 ], [ -134.145203, 58.090401 ], [ -134.148773, 58.097542 ], [ -134.147583, 58.105274 ], [ -134.139847, 58.106464 ], [ -134.126755, 58.104084 ], [ -134.111893, 58.099918 ], [ -134.105347, 58.096947 ], [ -134.102966, 58.088024 ], [ -134.108322, 58.082668 ] ] ], [ [ [ -132.887711, 55.171219 ], [ -132.897232, 55.173004 ], [ -132.909134, 55.177765 ], [ -132.933517, 55.171219 ], [ -132.947800, 55.181927 ], [ -132.950180, 55.186092 ], [ -132.936493, 55.200962 ], [ -132.932922, 55.211670 ], [ -132.913284, 55.219997 ], [ -132.891281, 55.224163 ], [ -132.874619, 55.219997 ], [ -132.879974, 55.196205 ], [ -132.876404, 55.186687 ], [ -132.880569, 55.175980 ], [ -132.887711, 55.171219 ] ] ], [ [ [ -159.644501, 55.170231 ], [ -159.662582, 55.175941 ], [ -159.667343, 55.182606 ], [ -159.663544, 55.191170 ], [ -159.647354, 55.184509 ], [ -159.644501, 55.170231 ] ] ], [ [ [ -161.344147, 55.158504 ], [ -161.409821, 55.180397 ], [ -161.439331, 55.198479 ], [ -161.437424, 55.204189 ], [ -161.426010, 55.216564 ], [ -161.399353, 55.224178 ], [ -161.372711, 55.216564 ], [ -161.352722, 55.220371 ], [ -161.329880, 55.219418 ], [ -161.328918, 55.216564 ], [ -161.335587, 55.207047 ], [ -161.332733, 55.199432 ], [ -161.325119, 55.184204 ], [ -161.329880, 55.163261 ], [ -161.344147, 55.158504 ] ] ], [ [ [ -159.733017, 55.090282 ], [ -159.749207, 55.095993 ], [ -159.750153, 55.103607 ], [ -159.733017, 55.116932 ], [ -159.714935, 55.129307 ], [ -159.707321, 55.118835 ], [ -159.711121, 55.109318 ], [ -159.713028, 55.094090 ], [ -159.733017, 55.090282 ] ] ], [ [ [ -161.878860, 55.085537 ], [ -161.918839, 55.104572 ], [ -161.919785, 55.113140 ], [ -161.903610, 55.116947 ], [ -161.891235, 55.107430 ], [ -161.874100, 55.106476 ], [ -161.862686, 55.101719 ], [ -161.866486, 55.091248 ], [ -161.878860, 55.085537 ] ] ], [ [ [ -159.799637, 55.059826 ], [ -159.825348, 55.069344 ], [ -159.823441, 55.076958 ], [ -159.806305, 55.093136 ], [ -159.783463, 55.092186 ], [ -159.770142, 55.085522 ], [ -159.761566, 55.078861 ], [ -159.755859, 55.068390 ], [ -159.770142, 55.062679 ], [ -159.799637, 55.059826 ] ] ], [ [ [ -161.582581, 55.058224 ], [ -161.591064, 55.060818 ], [ -161.606354, 55.070263 ], [ -161.606476, 55.074207 ], [ -161.598297, 55.081341 ], [ -161.596954, 55.086582 ], [ -161.602509, 55.098267 ], [ -161.608627, 55.116905 ], [ -161.576645, 55.103832 ], [ -161.549896, 55.082565 ], [ -161.550354, 55.065735 ], [ -161.565033, 55.058872 ], [ -161.582581, 55.058224 ] ] ], [ [ [ -159.294952, 55.048164 ], [ -159.318756, 55.051971 ], [ -159.331131, 55.061489 ], [ -159.322556, 55.065296 ], [ -159.302567, 55.061489 ], [ -159.291153, 55.056732 ], [ -159.294952, 55.048164 ] ] ], [ [ [ -131.190033, 55.043175 ], [ -131.213226, 55.044956 ], [ -131.240005, 55.061615 ], [ -131.246552, 55.072918 ], [ -131.241196, 55.092548 ], [ -131.207291, 55.112179 ], [ -131.190628, 55.108013 ], [ -131.174561, 55.087788 ], [ -131.175751, 55.081841 ], [ -131.190033, 55.066967 ], [ -131.190033, 55.062805 ], [ -131.187653, 55.047337 ], [ -131.190033, 55.043175 ] ] ], [ [ [ -132.917450, 55.040943 ], [ -132.926971, 55.048084 ], [ -132.933517, 55.060574 ], [ -132.934708, 55.068310 ], [ -132.924591, 55.075447 ], [ -132.906754, 55.077827 ], [ -132.903183, 55.073067 ], [ -132.901993, 55.063549 ], [ -132.912094, 55.044514 ], [ -132.917450, 55.040943 ] ] ], [ [ [ -161.941681, 55.036995 ], [ -161.961670, 55.059841 ], [ -161.964523, 55.074116 ], [ -161.963577, 55.077923 ], [ -161.950256, 55.073166 ], [ -161.942642, 55.060791 ], [ -161.928360, 55.041756 ], [ -161.941681, 55.036995 ] ] ], [ [ [ -147.240112, 70.208740 ], [ -147.257248, 70.216354 ], [ -147.222031, 70.231583 ], [ -147.191574, 70.229675 ], [ -147.183960, 70.220161 ], [ -147.210617, 70.216354 ], [ -147.240112, 70.208740 ] ] ], [ [ [ -168.080582, 64.958557 ], [ -168.097702, 64.964264 ], [ -168.097702, 64.969025 ], [ -168.082474, 64.974739 ], [ -168.074860, 64.980446 ], [ -168.049164, 64.982353 ], [ -168.050232, 64.961235 ], [ -168.080582, 64.958557 ] ] ], [ [ [ -166.204453, 64.471207 ], [ -166.212067, 64.471207 ], [ -166.229202, 64.489296 ], [ -166.227295, 64.493103 ], [ -166.219681, 64.495956 ], [ -166.197800, 64.495956 ], [ -166.192078, 64.492149 ], [ -166.192078, 64.482628 ], [ -166.204453, 64.471207 ] ] ], [ [ [ -164.874878, 62.595779 ], [ -164.901642, 62.601727 ], [ -164.929001, 62.613625 ], [ -164.940308, 62.629089 ], [ -164.942688, 62.654671 ], [ -164.936737, 62.668945 ], [ -164.920685, 62.673706 ], [ -164.898071, 62.663593 ], [ -164.876663, 62.662998 ], [ -164.869522, 62.665974 ], [ -164.860001, 62.664188 ], [ -164.843933, 62.656456 ], [ -164.821930, 62.621952 ], [ -164.818359, 62.608864 ], [ -164.819550, 62.602917 ], [ -164.843933, 62.597565 ], [ -164.874878, 62.595779 ] ] ], [ [ [ -132.725906, 54.667965 ], [ -132.770523, 54.672722 ], [ -132.778259, 54.684025 ], [ -132.796097, 54.685810 ], [ -132.808594, 54.694138 ], [ -132.814545, 54.695923 ], [ -132.820496, 54.691162 ], [ -132.844879, 54.687000 ], [ -132.871063, 54.700680 ], [ -132.875809, 54.706036 ], [ -132.884735, 54.739349 ], [ -132.876404, 54.748272 ], [ -132.877213, 54.753773 ], [ -132.893661, 54.765522 ], [ -132.936493, 54.779797 ], [ -132.967422, 54.796455 ], [ -133.051300, 54.875572 ], [ -133.054276, 54.886875 ], [ -133.071518, 54.902340 ], [ -133.087585, 54.907696 ], [ -133.089371, 54.914833 ], [ -133.099045, 54.919006 ], [ -133.114944, 54.918404 ], [ -133.131607, 54.932083 ], [ -133.129227, 54.941006 ], [ -133.133469, 54.945038 ], [ -133.163727, 54.946362 ], [ -133.166702, 54.952309 ], [ -133.170868, 54.980862 ], [ -133.164917, 54.994545 ], [ -133.172653, 55.005848 ], [ -133.172058, 55.020718 ], [ -133.175034, 55.023693 ], [ -133.193466, 55.029045 ], [ -133.215485, 55.043919 ], [ -133.222626, 55.055817 ], [ -133.216675, 55.058788 ], [ -133.200607, 55.056412 ], [ -133.193466, 55.055817 ], [ -133.191681, 55.060574 ], [ -133.233322, 55.081394 ], [ -133.239700, 55.092415 ], [ -133.236298, 55.099834 ], [ -133.223221, 55.105785 ], [ -133.185745, 55.103405 ], [ -133.142914, 55.104000 ], [ -133.144104, 55.106380 ], [ -133.172653, 55.112328 ], [ -133.180984, 55.118870 ], [ -133.201797, 55.115898 ], [ -133.229172, 55.123035 ], [ -133.229172, 55.128391 ], [ -133.210129, 55.135529 ], [ -133.208344, 55.139095 ], [ -133.218674, 55.144527 ], [ -133.233322, 55.159916 ], [ -133.236893, 55.164082 ], [ -133.227859, 55.164066 ], [ -133.212509, 55.163486 ], [ -133.206558, 55.165867 ], [ -133.208344, 55.170624 ], [ -133.228577, 55.174789 ], [ -133.237488, 55.180141 ], [ -133.236908, 55.183327 ], [ -133.196640, 55.192577 ], [ -133.199417, 55.198582 ], [ -133.222626, 55.215240 ], [ -133.222031, 55.234871 ], [ -133.217270, 55.243793 ], [ -133.164322, 55.250931 ], [ -133.135178, 55.261044 ], [ -133.123871, 55.258663 ], [ -133.102463, 55.240818 ], [ -133.099060, 55.221909 ], [ -133.075089, 55.192635 ], [ -133.060822, 55.167652 ], [ -133.065582, 55.148613 ], [ -133.056061, 55.140285 ], [ -133.025726, 55.137909 ], [ -133.011444, 55.124226 ], [ -133.006683, 55.097458 ], [ -133.001923, 55.086750 ], [ -132.969803, 55.062954 ], [ -132.970993, 55.058788 ], [ -132.975159, 55.058788 ], [ -133.029892, 55.080204 ], [ -133.037018, 55.077232 ], [ -133.032257, 55.067715 ], [ -133.006088, 55.051651 ], [ -132.995972, 55.034996 ], [ -132.959503, 55.021046 ], [ -132.955383, 55.012981 ], [ -132.956711, 54.986813 ], [ -132.946609, 54.970749 ], [ -132.910919, 54.945766 ], [ -132.897827, 54.928516 ], [ -132.904968, 54.916023 ], [ -132.901398, 54.910072 ], [ -132.855591, 54.895798 ], [ -132.843094, 54.877357 ], [ -132.750305, 54.820843 ], [ -132.718765, 54.770874 ], [ -132.720551, 54.746487 ], [ -132.716980, 54.733994 ], [ -132.699738, 54.728642 ], [ -132.699738, 54.703655 ], [ -132.694977, 54.687595 ], [ -132.673553, 54.679859 ], [ -132.670593, 54.676292 ], [ -132.673553, 54.669750 ], [ -132.725906, 54.667965 ] ] ], [ [ [ -164.869370, 54.190384 ], [ -164.878891, 54.197998 ], [ -164.865570, 54.207516 ], [ -164.794174, 54.225601 ], [ -164.763718, 54.224648 ], [ -164.763718, 54.218937 ], [ -164.765625, 54.211323 ], [ -164.778000, 54.210373 ], [ -164.794174, 54.214180 ], [ -164.822739, 54.201805 ], [ -164.869370, 54.190384 ] ] ], [ [ [ -164.839859, 54.178013 ], [ -164.849380, 54.182770 ], [ -164.848434, 54.184673 ], [ -164.833206, 54.187531 ], [ -164.814163, 54.186577 ], [ -164.817978, 54.179916 ], [ -164.839859, 54.178013 ] ] ], [ [ [ -165.555603, 54.027630 ], [ -165.559418, 54.029533 ], [ -165.572739, 54.040955 ], [ -165.568939, 54.045712 ], [ -165.524200, 54.067604 ], [ -165.512772, 54.065701 ], [ -165.510880, 54.059990 ], [ -165.508972, 54.053326 ], [ -165.493744, 54.050472 ], [ -165.484222, 54.043808 ], [ -165.508026, 54.031437 ], [ -165.555603, 54.027630 ] ] ], [ [ [ -166.152374, 53.955296 ], [ -166.190445, 53.960052 ], [ -166.196152, 53.968620 ], [ -166.197113, 53.984798 ], [ -166.191406, 53.991463 ], [ -166.172363, 53.998123 ], [ -166.143814, 53.994316 ], [ -166.105743, 53.988605 ], [ -166.075287, 53.969570 ], [ -166.116211, 53.957199 ], [ -166.152374, 53.955296 ] ] ], [ [ [ -168.026962, 53.922863 ], [ -168.041061, 53.926643 ], [ -168.050339, 53.934204 ], [ -168.043457, 53.940735 ], [ -168.030746, 53.936954 ], [ -168.024216, 53.923893 ], [ -168.026962, 53.922863 ] ] ], [ [ [ -169.745361, 53.044910 ], [ -169.759644, 53.044910 ], [ -169.784393, 53.054428 ], [ -169.788193, 53.060139 ], [ -169.776779, 53.074417 ], [ -169.763443, 53.082031 ], [ -169.751068, 53.076321 ], [ -169.738708, 53.064899 ], [ -169.745361, 53.044910 ] ] ], [ [ [ -168.465927, 52.975193 ], [ -168.477356, 52.979000 ], [ -168.483063, 52.983761 ], [ -168.466873, 52.990421 ], [ -168.445938, 52.979954 ], [ -168.445938, 52.976147 ], [ -168.465927, 52.975193 ] ] ], [ [ [ -169.248291, 52.768658 ], [ -169.249252, 52.771511 ], [ -169.163589, 52.805775 ], [ -169.156921, 52.798161 ], [ -169.197845, 52.773415 ], [ -169.222595, 52.772465 ], [ -169.248291, 52.768658 ] ] ], [ [ [ -171.117599, 52.558311 ], [ -171.142349, 52.558311 ], [ -171.159470, 52.559265 ], [ -171.164230, 52.565926 ], [ -171.161377, 52.574493 ], [ -171.149963, 52.584011 ], [ -171.134735, 52.586864 ], [ -171.115692, 52.581154 ], [ -171.115692, 52.569733 ], [ -171.117599, 52.558311 ] ] ], [ [ [ -175.128281, 52.214764 ], [ -175.135895, 52.214764 ], [ -175.140640, 52.219521 ], [ -175.140640, 52.228088 ], [ -175.127319, 52.227135 ], [ -175.123520, 52.220474 ], [ -175.128281, 52.214764 ] ] ], [ [ [ -175.502319, 52.160511 ], [ -175.513748, 52.160511 ], [ -175.529922, 52.173836 ], [ -175.523270, 52.181450 ], [ -175.512802, 52.184303 ], [ -175.498520, 52.180496 ], [ -175.493759, 52.169075 ], [ -175.502319, 52.160511 ] ] ], [ [ [ 177.361801, 52.116680 ], [ 177.357361, 52.119221 ], [ 177.356934, 52.123669 ], [ 177.363068, 52.125996 ], [ 177.368790, 52.125786 ], [ 177.371338, 52.121761 ], [ 177.368149, 52.118374 ], [ 177.361801, 52.116680 ] ] ], [ [ [ -175.493759, 51.973484 ], [ -175.497559, 51.977291 ], [ -175.491852, 51.982052 ], [ -175.475677, 51.982052 ], [ -175.451874, 51.989666 ], [ -175.443314, 51.984905 ], [ -175.434753, 51.984905 ], [ -175.431900, 51.977291 ], [ -175.471863, 51.976341 ], [ -175.493759, 51.973484 ] ] ], [ [ [ -175.878281, 51.963966 ], [ -175.928726, 51.972534 ], [ -175.948715, 51.975388 ], [ -175.954422, 51.983002 ], [ -175.943954, 51.989666 ], [ -175.912537, 51.995377 ], [ -175.873520, 51.997280 ], [ -175.814514, 51.994423 ], [ -175.807846, 51.989666 ], [ -175.808792, 51.983955 ], [ -175.867813, 51.977291 ], [ -175.874466, 51.968727 ], [ -175.878281, 51.963966 ] ] ], [ [ [ -176.129547, 51.948738 ], [ -176.134308, 51.955402 ], [ -176.130508, 51.959209 ], [ -176.096237, 51.962063 ], [ -176.088623, 51.955402 ], [ -176.093384, 51.949688 ], [ -176.129547, 51.948738 ] ] ], [ [ [ -176.000107, 51.942074 ], [ -176.010574, 51.943977 ], [ -176.016281, 51.956352 ], [ -176.017242, 51.963966 ], [ -176.003922, 51.965870 ], [ -175.991547, 51.961113 ], [ -175.991547, 51.952545 ], [ -176.000107, 51.942074 ] ] ], [ [ [ -176.051498, 51.928749 ], [ -176.053406, 51.934460 ], [ -176.050552, 51.947784 ], [ -176.034378, 51.956352 ], [ -176.031525, 51.952545 ], [ -176.027710, 51.934460 ], [ -176.036270, 51.929703 ], [ -176.051498, 51.928749 ] ] ], [ [ [ -175.791672, 51.916378 ], [ -175.815460, 51.921135 ], [ -175.837357, 51.936363 ], [ -175.863998, 51.943977 ], [ -175.868759, 51.947784 ], [ -175.856384, 51.954449 ], [ -175.824982, 51.959209 ], [ -175.794525, 51.958256 ], [ -175.785004, 51.939220 ], [ -175.766922, 51.927799 ], [ -175.760254, 51.924942 ], [ -175.760254, 51.917328 ], [ -175.791672, 51.916378 ] ] ], [ [ [ -159.774658, 54.794041 ], [ -159.802261, 54.800701 ], [ -159.820343, 54.814980 ], [ -159.818436, 54.820690 ], [ -159.790833, 54.826401 ], [ -159.768951, 54.826401 ], [ -159.742294, 54.842579 ], [ -159.694702, 54.834965 ], [ -159.708984, 54.828304 ], [ -159.703278, 54.816883 ], [ -159.725174, 54.816883 ], [ -159.743256, 54.813076 ], [ -159.751816, 54.806412 ], [ -159.774658, 54.794041 ] ] ], [ [ [ -133.527725, 54.763470 ], [ -133.538193, 54.773941 ], [ -133.547714, 54.783459 ], [ -133.547714, 54.818672 ], [ -133.546768, 54.831047 ], [ -133.539154, 54.835804 ], [ -133.527725, 54.833900 ], [ -133.514404, 54.818672 ], [ -133.511551, 54.792976 ], [ -133.520111, 54.767277 ], [ -133.527725, 54.763470 ] ] ], [ [ [ -159.543381, 54.754063 ], [ -159.597626, 54.755966 ], [ -159.587158, 54.775955 ], [ -159.591919, 54.789280 ], [ -159.597626, 54.801655 ], [ -159.602386, 54.814026 ], [ -159.587158, 54.827351 ], [ -159.568115, 54.825447 ], [ -159.510056, 54.789280 ], [ -159.513870, 54.759773 ], [ -159.543381, 54.754063 ] ] ], [ [ [ -132.641098, 54.749500 ], [ -132.654785, 54.753666 ], [ -132.676193, 54.765560 ], [ -132.689880, 54.787571 ], [ -132.714264, 54.814934 ], [ -132.736282, 54.835159 ], [ -132.767212, 54.850033 ], [ -132.798141, 54.863121 ], [ -132.806473, 54.869068 ], [ -132.808853, 54.892864 ], [ -132.818375, 54.923203 ], [ -132.800522, 54.933907 ], [ -132.764832, 54.933311 ], [ -132.732712, 54.938667 ], [ -132.719620, 54.936882 ], [ -132.665497, 54.912495 ], [ -132.637527, 54.895241 ], [ -132.621475, 54.875015 ], [ -132.626236, 54.844677 ], [ -132.634552, 54.835159 ], [ -132.654785, 54.836349 ], [ -132.657761, 54.832783 ], [ -132.656570, 54.828022 ], [ -132.638123, 54.816124 ], [ -132.626236, 54.801849 ], [ -132.612549, 54.773888 ], [ -132.623856, 54.757233 ], [ -132.641098, 54.749500 ] ] ], [ [ [ -177.452530, 51.889729 ], [ -177.466812, 51.904003 ], [ -177.464905, 51.913521 ], [ -177.442062, 51.921135 ], [ -177.426834, 51.916378 ], [ -177.420166, 51.902100 ], [ -177.434448, 51.896389 ], [ -177.452530, 51.889729 ] ] ], [ [ [ 178.022491, 51.870995 ], [ 178.018402, 51.874561 ], [ 178.018402, 51.879150 ], [ 178.024017, 51.880680 ], [ 178.031158, 51.879150 ], [ 178.032684, 51.874561 ], [ 178.029617, 51.871506 ], [ 178.022491, 51.870995 ] ] ], [ [ [ -178.642258, 51.586109 ], [ -178.673676, 51.588963 ], [ -178.684143, 51.602287 ], [ -178.681290, 51.608952 ], [ -178.638458, 51.611805 ], [ -178.618469, 51.609901 ], [ -178.615616, 51.606094 ], [ -178.621323, 51.588963 ], [ -178.642258, 51.586109 ] ] ], [ [ [ -178.576584, 51.583252 ], [ -178.591812, 51.583252 ], [ -178.601334, 51.593723 ], [ -178.606094, 51.597530 ], [ -178.597534, 51.603241 ], [ -178.576584, 51.606094 ], [ -178.567078, 51.598480 ], [ -178.576584, 51.583252 ] ] ], [ [ [ -179.039154, 51.569927 ], [ -179.057236, 51.571831 ], [ -179.060089, 51.579445 ], [ -179.056290, 51.590866 ], [ -179.040100, 51.585155 ], [ -179.034393, 51.576591 ], [ -179.039154, 51.569927 ] ] ], [ [ [ -178.744110, 51.541374 ], [ -178.796448, 51.541374 ], [ -178.825958, 51.547085 ], [ -178.834518, 51.561363 ], [ -178.857361, 51.572784 ], [ -178.857361, 51.576591 ], [ -178.828812, 51.575638 ], [ -178.761230, 51.562313 ], [ -178.735535, 51.550892 ], [ -178.734589, 51.542328 ], [ -178.744110, 51.541374 ] ] ], [ [ [ -178.288193, 51.472847 ], [ -178.307236, 51.479507 ], [ -178.307236, 51.482365 ], [ -178.283432, 51.484268 ], [ -178.272018, 51.480461 ], [ -178.274872, 51.473797 ], [ -178.288193, 51.472847 ] ] ], [ [ [ -154.479446, 58.050247 ], [ -154.503235, 58.051197 ], [ -154.513702, 58.055004 ], [ -154.513702, 58.067379 ], [ -154.484207, 58.069283 ], [ -154.460403, 58.061668 ], [ -154.463257, 58.057861 ], [ -154.479446, 58.050247 ] ] ], [ [ [ -152.773056, 57.922585 ], [ -152.846344, 57.941620 ], [ -152.857773, 57.952091 ], [ -152.857773, 57.962563 ], [ -152.848251, 57.969223 ], [ -152.811127, 57.976837 ], [ -152.747360, 57.983501 ], [ -152.720718, 57.984451 ], [ -152.723572, 57.973984 ], [ -152.739746, 57.945427 ], [ -152.751175, 57.933056 ], [ -152.773056, 57.922585 ] ] ], [ [ [ -134.233536, 57.903316 ], [ -134.255432, 57.917595 ], [ -134.278275, 57.944244 ], [ -134.279221, 57.955666 ], [ -134.245911, 57.954712 ], [ -134.221161, 57.941387 ], [ -134.195465, 57.936630 ], [ -134.184036, 57.926159 ], [ -134.190704, 57.913788 ], [ -134.202347, 57.906330 ], [ -134.233536, 57.903316 ] ] ], [ [ [ -134.118240, 57.770473 ], [ -134.130737, 57.778633 ], [ -134.141205, 57.793861 ], [ -134.189758, 57.833836 ], [ -134.192612, 57.846210 ], [ -134.185944, 57.849064 ], [ -134.185944, 57.856678 ], [ -134.218307, 57.892849 ], [ -134.213547, 57.894753 ], [ -134.206879, 57.895901 ], [ -134.143112, 57.835739 ], [ -134.108856, 57.801476 ], [ -134.101242, 57.775776 ], [ -134.108856, 57.771019 ], [ -134.118240, 57.770473 ] ] ], [ [ [ -152.297165, 57.748409 ], [ -152.307632, 57.753170 ], [ -152.283844, 57.769348 ], [ -152.249573, 57.790287 ], [ -152.230545, 57.785530 ], [ -152.231491, 57.775059 ], [ -152.277176, 57.759830 ], [ -152.297165, 57.748409 ] ] ], [ [ [ -152.311447, 57.364128 ], [ -152.312393, 57.367935 ], [ -152.285751, 57.392681 ], [ -152.267670, 57.389824 ], [ -152.257187, 57.386017 ], [ -152.257187, 57.378403 ], [ -152.285751, 57.366982 ], [ -152.311447, 57.364128 ] ] ], [ [ [ -133.817017, 57.288704 ], [ -133.824631, 57.289654 ], [ -133.832245, 57.297268 ], [ -133.835098, 57.307739 ], [ -133.833191, 57.313450 ], [ -133.822723, 57.314400 ], [ -133.807495, 57.309643 ], [ -133.802734, 57.301075 ], [ -133.804642, 57.292511 ], [ -133.817017, 57.288704 ] ] ], [ [ [ -133.849365, 57.277279 ], [ -133.856979, 57.278233 ], [ -133.866501, 57.293461 ], [ -133.863647, 57.303932 ], [ -133.856979, 57.311546 ], [ -133.846512, 57.306786 ], [ -133.842712, 57.299171 ], [ -133.842712, 57.283943 ], [ -133.849365, 57.277279 ] ] ], [ [ [ -133.518570, 57.213688 ], [ -133.529282, 57.218449 ], [ -133.545334, 57.240459 ], [ -133.542953, 57.248192 ], [ -133.538193, 57.252357 ], [ -133.531052, 57.247597 ], [ -133.515594, 57.226776 ], [ -133.514404, 57.216068 ], [ -133.518570, 57.213688 ] ] ], [ [ [ -135.442902, 57.183983 ], [ -135.452423, 57.185768 ], [ -135.491089, 57.211346 ], [ -135.510132, 57.224434 ], [ -135.508347, 57.231571 ], [ -135.491684, 57.242874 ], [ -135.480972, 57.248226 ], [ -135.470871, 57.248226 ], [ -135.457779, 57.244064 ], [ -135.450043, 57.241684 ], [ -135.424469, 57.243469 ], [ -135.400665, 57.242279 ], [ -135.397110, 57.239899 ], [ -135.397110, 57.223839 ], [ -135.404831, 57.207180 ], [ -135.442902, 57.183983 ] ] ], [ [ [ -135.514893, 57.139366 ], [ -135.540466, 57.147102 ], [ -135.549988, 57.156620 ], [ -135.550583, 57.161377 ], [ -135.544632, 57.170300 ], [ -135.549393, 57.175655 ], [ -135.547012, 57.208965 ], [ -135.535706, 57.226814 ], [ -135.509537, 57.211941 ], [ -135.469681, 57.185173 ], [ -135.455994, 57.176250 ], [ -135.455994, 57.172680 ], [ -135.463135, 57.169704 ], [ -135.492874, 57.158997 ], [ -135.514893, 57.157211 ], [ -135.517868, 57.153645 ], [ -135.507751, 57.144722 ], [ -135.507751, 57.141151 ], [ -135.514893, 57.139366 ] ] ], [ [ [ -132.819595, 56.977528 ], [ -132.830902, 56.983479 ], [ -132.852905, 57.000134 ], [ -132.856476, 57.003109 ], [ -132.852905, 57.007271 ], [ -132.852310, 57.014408 ], [ -132.848160, 57.022144 ], [ -132.836853, 57.019764 ], [ -132.822571, 57.001324 ], [ -132.821976, 56.992401 ], [ -132.814240, 56.986450 ], [ -132.814240, 56.982883 ], [ -132.819595, 56.977528 ] ] ], [ [ [ -153.599213, 56.889187 ], [ -153.612534, 56.894897 ], [ -153.616348, 56.900608 ], [ -153.600159, 56.909172 ], [ -153.550674, 56.912979 ], [ -153.546860, 56.907269 ], [ -153.570648, 56.892994 ], [ -153.599213, 56.889187 ] ] ], [ [ [ -154.153152, 56.681698 ], [ -154.155045, 56.686455 ], [ -154.129349, 56.707394 ], [ -154.120789, 56.708347 ], [ -154.112213, 56.707394 ], [ -154.096039, 56.705490 ], [ -154.064636, 56.720718 ], [ -154.050354, 56.730240 ], [ -154.046555, 56.730240 ], [ -154.034180, 56.717865 ], [ -154.021805, 56.715008 ], [ -154.017044, 56.689312 ], [ -154.021805, 56.684551 ], [ -154.030365, 56.683601 ], [ -154.047501, 56.683601 ], [ -154.088425, 56.690262 ], [ -154.110321, 56.694069 ], [ -154.121735, 56.695023 ], [ -154.136963, 56.686455 ], [ -154.153152, 56.681698 ] ] ], [ [ [ -157.398560, 56.633991 ], [ -157.409988, 56.635895 ], [ -157.425217, 56.638748 ], [ -157.428070, 56.644459 ], [ -157.425217, 56.647316 ], [ -157.412842, 56.647316 ], [ -157.398560, 56.642555 ], [ -157.390945, 56.637798 ], [ -157.398560, 56.633991 ] ] ], [ [ [ -132.486481, 56.603359 ], [ -132.500153, 56.604549 ], [ -132.519791, 56.614658 ], [ -132.544769, 56.620609 ], [ -132.570358, 56.633698 ], [ -132.567978, 56.643215 ], [ -132.541199, 56.664036 ], [ -132.533463, 56.674149 ], [ -132.539413, 56.683071 ], [ -132.537033, 56.686638 ], [ -132.530502, 56.687233 ], [ -132.495987, 56.680691 ], [ -132.450790, 56.665222 ], [ -132.422821, 56.662251 ], [ -132.380585, 56.667603 ], [ -132.350845, 56.660465 ], [ -132.335968, 56.662251 ], [ -132.328842, 56.660465 ], [ -132.328842, 56.652138 ], [ -132.335968, 56.642620 ], [ -132.386536, 56.625961 ], [ -132.426987, 56.609901 ], [ -132.472198, 56.605141 ], [ -132.486481, 56.603359 ] ] ], [ [ [ -132.450790, 56.564098 ], [ -132.459702, 56.565880 ], [ -132.461487, 56.577778 ], [ -132.461487, 56.586105 ], [ -132.447220, 56.596813 ], [ -132.424011, 56.600979 ], [ -132.400818, 56.606926 ], [ -132.400223, 56.604549 ], [ -132.410339, 56.586105 ], [ -132.450790, 56.564098 ] ] ], [ [ [ -132.464172, 56.512047 ], [ -132.471313, 56.512642 ], [ -132.476059, 56.518589 ], [ -132.476059, 56.529892 ], [ -132.473679, 56.542980 ], [ -132.465958, 56.545357 ], [ -132.446320, 56.541195 ], [ -132.442154, 56.534058 ], [ -132.439774, 56.526321 ], [ -132.446915, 56.516804 ], [ -132.464172, 56.512047 ] ] ], [ [ [ -132.549240, 56.510857 ], [ -132.555771, 56.516804 ], [ -132.565292, 56.528107 ], [ -132.562912, 56.534653 ], [ -132.546860, 56.551903 ], [ -132.530792, 56.562611 ], [ -132.520676, 56.562016 ], [ -132.518295, 56.556065 ], [ -132.521271, 56.541195 ], [ -132.531387, 56.520374 ], [ -132.538528, 56.513237 ], [ -132.549240, 56.510857 ] ] ], [ [ [ -132.573029, 56.488251 ], [ -132.595032, 56.489441 ], [ -132.610504, 56.495388 ], [ -132.615265, 56.502529 ], [ -132.615265, 56.509071 ], [ -132.606934, 56.512047 ], [ -132.587906, 56.512047 ], [ -132.581360, 56.511452 ], [ -132.574219, 56.506096 ], [ -132.561722, 56.498363 ], [ -132.562317, 56.491821 ], [ -132.573029, 56.488251 ] ] ], [ [ [ -133.786163, 56.455601 ], [ -133.798538, 56.463215 ], [ -133.814713, 56.468925 ], [ -133.839462, 56.490818 ], [ -133.835663, 56.496529 ], [ -133.829941, 56.497482 ], [ -133.812820, 56.492722 ], [ -133.792831, 56.482250 ], [ -133.777603, 56.471783 ], [ -133.775696, 56.464169 ], [ -133.780457, 56.457504 ], [ -133.786163, 56.455601 ] ] ], [ [ [ -132.586121, 56.448990 ], [ -132.599792, 56.448990 ], [ -132.623001, 56.458508 ], [ -132.650955, 56.474571 ], [ -132.652740, 56.482899 ], [ -132.649170, 56.486465 ], [ -132.629547, 56.487656 ], [ -132.611694, 56.482899 ], [ -132.587906, 56.471596 ], [ -132.576599, 56.461483 ], [ -132.576599, 56.456127 ], [ -132.586121, 56.448990 ] ] ], [ [ [ -133.806152, 56.395641 ], [ -133.819473, 56.402302 ], [ -133.821381, 56.411819 ], [ -133.816620, 56.419434 ], [ -133.807098, 56.421337 ], [ -133.797592, 56.416580 ], [ -133.786163, 56.405159 ], [ -133.784256, 56.399448 ], [ -133.789978, 56.397545 ], [ -133.806152, 56.395641 ] ] ], [ [ [ -132.520081, 56.353813 ], [ -132.546265, 56.356785 ], [ -132.559341, 56.365116 ], [ -132.562317, 56.379391 ], [ -132.555176, 56.403782 ], [ -132.537338, 56.420437 ], [ -132.502243, 56.436497 ], [ -132.492126, 56.438282 ], [ -132.478439, 56.438282 ], [ -132.418365, 56.415085 ], [ -132.404678, 56.405563 ], [ -132.404678, 56.393669 ], [ -132.407059, 56.386528 ], [ -132.412415, 56.384747 ], [ -132.433823, 56.387718 ], [ -132.443344, 56.385338 ], [ -132.450485, 56.375229 ], [ -132.482605, 56.366898 ], [ -132.494507, 56.355003 ], [ -132.520081, 56.353813 ] ] ], [ [ [ -157.826767, 56.311001 ], [ -157.851517, 56.318615 ], [ -157.866745, 56.330036 ], [ -157.888641, 56.331940 ], [ -157.901962, 56.342407 ], [ -157.901001, 56.348118 ], [ -157.864838, 56.358589 ], [ -157.832474, 56.370010 ], [ -157.807739, 56.357635 ], [ -157.811539, 56.349072 ], [ -157.817245, 56.343361 ], [ -157.795364, 56.327179 ], [ -157.796310, 56.320518 ], [ -157.813446, 56.318615 ], [ -157.826767, 56.311001 ] ] ], [ [ [ -133.931488, 56.285172 ], [ -133.961823, 56.289932 ], [ -133.959442, 56.298260 ], [ -133.953506, 56.301830 ], [ -133.945770, 56.302425 ], [ -133.935059, 56.300640 ], [ -133.928513, 56.290527 ], [ -133.928513, 56.286957 ], [ -133.931488, 56.285172 ] ] ], [ [ [ -132.970459, 56.248966 ], [ -132.996048, 56.248966 ], [ -133.004379, 56.257294 ], [ -132.999619, 56.272163 ], [ -132.990692, 56.276924 ], [ -132.979980, 56.276329 ], [ -132.967484, 56.275734 ], [ -132.960358, 56.269192 ], [ -132.960358, 56.256699 ], [ -132.970459, 56.248966 ] ] ], [ [ [ -132.950241, 56.203159 ], [ -133.004959, 56.216248 ], [ -133.006149, 56.222790 ], [ -133.000214, 56.231712 ], [ -133.002594, 56.238258 ], [ -133.000809, 56.241230 ], [ -132.970459, 56.239449 ], [ -132.950836, 56.237663 ], [ -132.934769, 56.230526 ], [ -132.919907, 56.218033 ], [ -132.918716, 56.213272 ], [ -132.924667, 56.208515 ], [ -132.950241, 56.203159 ] ] ], [ [ [ -132.894318, 56.157356 ], [ -132.915146, 56.159142 ], [ -132.948456, 56.163898 ], [ -132.977600, 56.181744 ], [ -132.985931, 56.196022 ], [ -132.974030, 56.200188 ], [ -132.941910, 56.190075 ], [ -132.910385, 56.173416 ], [ -132.893127, 56.159737 ], [ -132.894318, 56.157356 ] ] ], [ [ [ -132.997833, 56.153786 ], [ -133.003784, 56.160927 ], [ -133.009125, 56.178177 ], [ -132.997833, 56.187695 ], [ -132.986526, 56.179367 ], [ -132.975815, 56.157356 ], [ -132.977600, 56.154381 ], [ -132.997833, 56.153786 ] ] ], [ [ [ -156.771820, 56.150009 ], [ -156.787048, 56.150959 ], [ -156.801315, 56.158573 ], [ -156.804184, 56.176659 ], [ -156.804184, 56.196648 ], [ -156.795609, 56.215683 ], [ -156.785141, 56.226151 ], [ -156.771820, 56.227104 ], [ -156.771820, 56.224247 ], [ -156.778473, 56.216633 ], [ -156.783234, 56.200455 ], [ -156.778473, 56.191887 ], [ -156.763245, 56.181419 ], [ -156.759445, 56.169044 ], [ -156.759445, 56.156670 ], [ -156.771820, 56.150009 ] ] ], [ [ [ -158.113495, 56.133728 ], [ -158.158234, 56.140392 ], [ -158.151566, 56.148006 ], [ -158.104935, 56.148956 ], [ -158.091599, 56.157524 ], [ -158.088745, 56.148956 ], [ -158.099213, 56.140392 ], [ -158.113495, 56.133728 ] ] ], [ [ [ -132.898483, 56.100250 ], [ -132.918716, 56.109768 ], [ -132.940125, 56.124638 ], [ -132.938934, 56.129993 ], [ -132.927628, 56.143673 ], [ -132.920502, 56.147839 ], [ -132.902649, 56.146648 ], [ -132.879456, 56.138321 ], [ -132.872910, 56.129398 ], [ -132.877670, 56.115120 ], [ -132.891342, 56.102032 ], [ -132.898483, 56.100250 ] ] ], [ [ [ -156.687103, 56.006290 ], [ -156.696625, 56.007240 ], [ -156.712799, 56.017712 ], [ -156.733749, 56.024372 ], [ -156.749924, 56.034843 ], [ -156.750870, 56.042458 ], [ -156.742310, 56.042458 ], [ -156.727081, 56.042458 ], [ -156.715668, 56.048168 ], [ -156.707092, 56.064346 ], [ -156.693771, 56.068153 ], [ -156.682343, 56.061493 ], [ -156.672836, 56.043407 ], [ -156.671875, 56.029133 ], [ -156.677597, 56.012951 ], [ -156.687103, 56.006290 ] ] ], [ [ [ -132.032898, 55.976074 ], [ -132.045975, 55.981426 ], [ -132.049545, 55.987373 ], [ -132.044189, 55.998081 ], [ -132.042999, 56.005222 ], [ -132.070374, 56.031395 ], [ -132.062637, 56.056973 ], [ -132.035858, 56.089691 ], [ -132.029327, 56.093262 ], [ -132.018616, 56.085529 ], [ -131.986496, 56.027824 ], [ -131.988281, 56.006409 ], [ -132.002548, 56.000462 ], [ -132.010880, 55.983212 ], [ -132.032898, 55.976074 ] ] ], [ [ [ -133.338089, 55.909893 ], [ -133.340469, 55.920006 ], [ -133.331543, 55.929523 ], [ -133.329163, 55.936066 ], [ -133.333923, 55.943798 ], [ -133.339874, 55.946774 ], [ -133.338684, 55.954506 ], [ -133.327377, 55.958076 ], [ -133.321442, 55.953911 ], [ -133.306564, 55.930714 ], [ -133.310730, 55.920601 ], [ -133.319061, 55.911678 ], [ -133.338089, 55.909893 ] ] ], [ [ [ -133.476700, 55.902752 ], [ -133.493942, 55.904537 ], [ -133.495728, 55.911083 ], [ -133.492752, 55.914055 ], [ -133.482056, 55.914055 ], [ -133.475510, 55.910488 ], [ -133.476700, 55.902752 ] ] ], [ [ [ -160.921890, 55.893688 ], [ -160.932358, 55.895592 ], [ -160.930450, 55.900352 ], [ -160.914276, 55.907013 ], [ -160.871445, 55.911774 ], [ -160.847656, 55.919388 ], [ -160.818146, 55.951748 ], [ -160.812439, 55.946037 ], [ -160.809586, 55.921291 ], [ -160.801010, 55.902256 ], [ -160.805771, 55.899399 ], [ -160.824814, 55.907967 ], [ -160.852417, 55.907967 ], [ -160.921890, 55.893688 ] ] ], [ [ [ -133.420975, 55.880341 ], [ -133.423950, 55.885693 ], [ -133.423355, 55.891045 ], [ -133.413834, 55.892830 ], [ -133.407883, 55.892830 ], [ -133.403717, 55.889263 ], [ -133.407883, 55.885098 ], [ -133.416214, 55.883907 ], [ -133.420975, 55.880341 ] ] ], [ [ [ -133.489777, 55.877769 ], [ -133.519531, 55.877769 ], [ -133.524277, 55.882526 ], [ -133.521912, 55.888477 ], [ -133.504654, 55.892044 ], [ -133.488586, 55.891453 ], [ -133.483826, 55.885502 ], [ -133.489777, 55.877769 ] ] ], [ [ [ -133.384094, 55.876770 ], [ -133.396576, 55.879745 ], [ -133.399551, 55.884502 ], [ -133.391815, 55.889263 ], [ -133.382904, 55.889858 ], [ -133.375168, 55.888073 ], [ -133.375763, 55.880932 ], [ -133.384094, 55.876770 ] ] ], [ [ [ -131.696884, 55.852226 ], [ -131.713745, 55.853264 ], [ -131.717117, 55.856987 ], [ -131.712952, 55.861744 ], [ -131.695099, 55.873047 ], [ -131.689041, 55.875488 ], [ -131.689514, 55.890232 ], [ -131.668930, 55.905766 ], [ -131.648697, 55.912903 ], [ -131.639175, 55.912903 ], [ -131.621933, 55.902790 ], [ -131.583862, 55.864719 ], [ -131.586243, 55.856392 ], [ -131.589218, 55.852821 ], [ -131.604675, 55.852821 ], [ -131.645721, 55.858173 ], [ -131.696884, 55.852226 ] ] ], [ [ [ -133.679550, 55.850407 ], [ -133.687866, 55.851597 ], [ -133.693817, 55.861710 ], [ -133.695007, 55.871822 ], [ -133.706314, 55.881931 ], [ -133.703339, 55.890858 ], [ -133.690842, 55.891453 ], [ -133.675980, 55.881340 ], [ -133.670624, 55.874199 ], [ -133.674194, 55.857544 ], [ -133.679550, 55.850407 ] ] ], [ [ [ -131.827164, 55.845684 ], [ -131.839050, 55.849251 ], [ -131.840836, 55.852821 ], [ -131.838455, 55.856392 ], [ -131.831924, 55.858173 ], [ -131.824188, 55.856392 ], [ -131.815262, 55.852226 ], [ -131.817642, 55.848061 ], [ -131.827164, 55.845684 ] ] ], [ [ [ -159.110016, 55.828205 ], [ -159.134766, 55.828205 ], [ -159.162354, 55.837723 ], [ -159.185196, 55.841534 ], [ -159.183304, 55.844387 ], [ -159.161407, 55.858665 ], [ -159.145233, 55.876747 ], [ -159.116669, 55.868183 ], [ -159.098587, 55.861519 ], [ -159.096680, 55.854858 ], [ -159.096680, 55.844387 ], [ -159.086212, 55.834869 ], [ -159.110016, 55.828205 ] ] ], [ [ [ -158.858734, 55.806316 ], [ -158.889191, 55.810123 ], [ -158.897766, 55.826302 ], [ -158.888245, 55.844387 ], [ -158.881577, 55.866280 ], [ -158.869217, 55.880554 ], [ -158.819717, 55.891975 ], [ -158.800674, 55.891026 ], [ -158.773087, 55.883411 ], [ -158.750244, 55.875797 ], [ -158.749283, 55.856762 ], [ -158.739761, 55.849148 ], [ -158.719788, 55.849148 ], [ -158.703598, 55.841534 ], [ -158.701691, 55.832012 ], [ -158.711212, 55.824398 ], [ -158.731201, 55.826302 ], [ -158.726440, 55.835819 ], [ -158.731201, 55.839626 ], [ -158.758804, 55.836773 ], [ -158.768326, 55.843437 ], [ -158.787354, 55.843437 ], [ -158.799728, 55.848194 ], [ -158.805435, 55.857712 ], [ -158.822571, 55.858665 ], [ -158.845413, 55.853905 ], [ -158.861603, 55.841534 ], [ -158.865402, 55.827255 ], [ -158.862549, 55.821545 ], [ -158.844467, 55.818687 ], [ -158.836853, 55.814880 ], [ -158.840652, 55.808220 ], [ -158.858734, 55.806316 ] ] ], [ [ [ -133.257187, 55.775452 ], [ -133.261948, 55.775452 ], [ -133.323669, 55.818630 ], [ -133.332138, 55.827206 ], [ -133.352966, 55.837318 ], [ -133.357132, 55.842670 ], [ -133.355942, 55.844456 ], [ -133.339279, 55.843266 ], [ -133.333923, 55.851002 ], [ -133.333221, 55.858208 ], [ -133.347610, 55.870037 ], [ -133.346573, 55.875809 ], [ -133.344040, 55.880745 ], [ -133.330948, 55.887287 ], [ -133.323807, 55.899185 ], [ -133.304779, 55.912270 ], [ -133.291687, 55.914055 ], [ -133.272064, 55.905727 ], [ -133.269089, 55.901566 ], [ -133.273254, 55.890858 ], [ -133.285141, 55.877769 ], [ -133.286331, 55.870037 ], [ -133.278015, 55.867657 ], [ -133.249451, 55.878960 ], [ -133.245880, 55.879555 ], [ -133.231018, 55.867062 ], [ -133.223282, 55.846836 ], [ -133.218521, 55.826611 ], [ -133.229828, 55.816498 ], [ -133.234589, 55.798653 ], [ -133.257187, 55.775452 ] ] ], [ [ [ -159.305130, 55.748257 ], [ -159.308929, 55.750160 ], [ -159.310837, 55.763485 ], [ -159.322266, 55.776810 ], [ -159.331772, 55.786327 ], [ -159.345108, 55.791088 ], [ -159.361282, 55.788231 ], [ -159.365097, 55.792992 ], [ -159.355576, 55.807266 ], [ -159.321304, 55.815834 ], [ -159.307983, 55.807266 ], [ -159.290848, 55.793941 ], [ -159.275620, 55.773956 ], [ -159.279434, 55.762535 ], [ -159.305130, 55.748257 ] ] ], [ [ [ -159.394592, 55.714943 ], [ -159.398407, 55.717800 ], [ -159.381271, 55.734932 ], [ -159.384125, 55.749210 ], [ -159.364136, 55.773956 ], [ -159.342255, 55.771099 ], [ -159.334641, 55.770149 ], [ -159.328918, 55.764439 ], [ -159.394592, 55.714943 ] ] ], [ [ [ -133.532806, 55.693550 ], [ -133.537033, 55.694630 ], [ -133.595062, 55.709442 ], [ -133.643326, 55.729038 ], [ -133.700562, 55.778618 ], [ -133.701157, 55.785160 ], [ -133.678543, 55.805386 ], [ -133.655945, 55.823231 ], [ -133.622635, 55.830963 ], [ -133.612518, 55.822636 ], [ -133.605377, 55.819664 ], [ -133.601212, 55.823231 ], [ -133.595856, 55.832153 ], [ -133.556000, 55.835129 ], [ -133.491760, 55.811333 ], [ -133.466187, 55.805981 ], [ -133.422058, 55.788822 ], [ -133.359695, 55.800034 ], [ -133.328171, 55.804195 ], [ -133.315674, 55.797653 ], [ -133.313889, 55.792892 ], [ -133.321030, 55.785160 ], [ -133.329361, 55.778618 ], [ -133.329361, 55.773857 ], [ -133.335312, 55.761364 ], [ -133.350174, 55.756012 ], [ -133.373978, 55.756012 ], [ -133.393005, 55.746494 ], [ -133.416550, 55.739647 ], [ -133.458450, 55.748875 ], [ -133.492355, 55.759583 ], [ -133.501282, 55.766720 ], [ -133.508423, 55.767315 ], [ -133.512573, 55.763149 ], [ -133.512634, 55.755898 ], [ -133.490875, 55.726578 ], [ -133.489380, 55.712585 ], [ -133.491760, 55.706638 ], [ -133.532806, 55.693550 ] ] ], [ [ [ -133.589905, 55.618599 ], [ -133.594666, 55.630497 ], [ -133.602402, 55.643581 ], [ -133.611328, 55.641205 ], [ -133.623230, 55.642986 ], [ -133.623230, 55.649532 ], [ -133.619064, 55.651318 ], [ -133.599426, 55.649532 ], [ -133.575638, 55.653694 ], [ -133.575043, 55.657265 ], [ -133.591690, 55.664402 ], [ -133.607162, 55.680466 ], [ -133.607758, 55.684032 ], [ -133.579208, 55.684032 ], [ -133.553024, 55.673325 ], [ -133.542923, 55.667377 ], [ -133.545303, 55.648342 ], [ -133.553619, 55.637039 ], [ -133.582184, 55.619194 ], [ -133.589905, 55.618599 ] ] ], [ [ [ -133.696396, 55.581123 ], [ -133.714233, 55.582905 ], [ -133.726730, 55.592422 ], [ -133.727325, 55.600754 ], [ -133.717209, 55.606106 ], [ -133.705917, 55.605511 ], [ -133.698181, 55.595993 ], [ -133.692825, 55.582905 ], [ -133.696396, 55.581123 ] ] ], [ [ [ -131.718887, 55.535759 ], [ -131.723648, 55.535759 ], [ -131.729599, 55.543491 ], [ -131.729599, 55.552414 ], [ -131.724243, 55.562527 ], [ -131.718292, 55.564907 ], [ -131.702835, 55.563717 ], [ -131.703430, 55.558956 ], [ -131.705215, 55.553604 ], [ -131.713547, 55.547657 ], [ -131.716522, 55.541706 ], [ -131.718887, 55.535759 ] ] ], [ [ [ -159.832001, 55.012234 ], [ -159.842468, 55.019852 ], [ -159.849136, 55.036030 ], [ -159.859604, 55.043644 ], [ -159.844376, 55.055065 ], [ -159.830093, 55.042694 ], [ -159.810120, 55.026512 ], [ -159.810120, 55.018898 ], [ -159.812012, 55.013187 ], [ -159.832001, 55.012234 ] ] ], [ [ [ -131.252487, 55.011646 ], [ -131.281052, 55.012836 ], [ -131.283432, 55.016998 ], [ -131.274506, 55.025921 ], [ -131.256653, 55.032467 ], [ -131.241196, 55.037224 ], [ -131.240601, 55.029491 ], [ -131.252487, 55.011646 ] ] ], [ [ [ -132.755051, 54.991570 ], [ -132.884140, 55.028454 ], [ -132.890686, 55.039158 ], [ -132.885925, 55.050461 ], [ -132.872833, 55.062359 ], [ -132.834167, 55.073067 ], [ -132.830612, 55.078423 ], [ -132.832382, 55.083775 ], [ -132.849640, 55.091507 ], [ -132.876999, 55.099834 ], [ -132.881165, 55.115898 ], [ -132.882355, 55.129578 ], [ -132.894852, 55.153969 ], [ -132.891876, 55.158726 ], [ -132.875214, 55.165272 ], [ -132.855591, 55.179546 ], [ -132.838928, 55.196205 ], [ -132.830612, 55.193825 ], [ -132.811569, 55.176575 ], [ -132.769928, 55.159321 ], [ -132.741974, 55.139095 ], [ -132.724716, 55.136124 ], [ -132.714005, 55.136124 ], [ -132.696167, 55.124226 ], [ -132.693787, 55.117683 ], [ -132.699142, 55.106976 ], [ -132.706879, 55.099239 ], [ -132.708664, 55.090912 ], [ -132.690216, 55.056412 ], [ -132.684860, 55.033806 ], [ -132.694977, 55.019527 ], [ -132.730667, 55.006443 ], [ -132.749115, 54.992760 ], [ -132.755051, 54.991570 ] ] ], [ [ [ -161.877914, 54.983696 ], [ -161.883621, 54.991310 ], [ -161.910278, 55.015106 ], [ -161.910278, 55.026527 ], [ -161.903610, 55.026527 ], [ -161.864594, 55.001781 ], [ -161.862686, 54.993214 ], [ -161.877914, 54.983696 ] ] ], [ [ [ -131.519592, 54.958702 ], [ -131.520782, 54.961082 ], [ -131.520782, 54.972385 ], [ -131.527924, 54.986065 ], [ -131.539215, 54.996773 ], [ -131.533264, 55.002129 ], [ -131.506500, 54.997368 ], [ -131.498169, 54.992611 ], [ -131.499359, 54.966434 ], [ -131.504120, 54.961678 ], [ -131.519592, 54.958702 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US04", "STATE": "04", "NAME": "Arizona", "LSAD": "", "CENSUSAREA": 113594.084000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -109.045223, 36.999084 ], [ -109.045244, 36.969489 ], [ -109.045272, 36.968871 ], [ -109.045407, 36.874998 ], [ -109.045433, 36.874589 ], [ -109.045431, 36.500001 ], [ -109.046183, 36.181751 ], [ -109.045729, 36.117028 ], [ -109.045973, 36.002338 ], [ -109.046011, 35.925896 ], [ -109.046054, 35.925860 ], [ -109.046055, 35.888721 ], [ -109.046024, 35.879800 ], [ -109.046295, 35.616517 ], [ -109.046296, 35.614251 ], [ -109.046509, 35.546440 ], [ -109.046481, 35.546326 ], [ -109.046796, 35.363606 ], [ -109.046084, 35.250025 ], [ -109.045851, 34.959718 ], [ -109.046072, 34.828566 ], [ -109.045624, 34.814226 ], [ -109.046104, 34.799981 ], [ -109.045363, 34.785406 ], [ -109.046086, 34.771016 ], [ -109.046156, 34.579291 ], [ -109.046182, 34.522553 ], [ -109.046182, 34.522393 ], [ -109.047006, 34.000050 ], [ -109.046426, 33.875052 ], [ -109.047145, 33.740010 ], [ -109.046662, 33.625055 ], [ -109.047298, 33.409783 ], [ -109.046564, 33.375060 ], [ -109.046870, 33.372654 ], [ -109.047045, 33.369280 ], [ -109.046909, 33.365570 ], [ -109.046827, 33.365272 ], [ -109.047470, 33.250063 ], [ -109.047237, 33.208965 ], [ -109.047116, 33.137995 ], [ -109.047117, 33.137559 ], [ -109.047013, 33.092917 ], [ -109.046905, 33.091931 ], [ -109.047453, 33.069427 ], [ -109.047480, 33.068420 ], [ -109.047117, 32.777570 ], [ -109.047638, 32.693439 ], [ -109.047645, 32.689988 ], [ -109.047653, 32.686327 ], [ -109.047653, 32.681379 ], [ -109.047612, 32.426377 ], [ -109.048286, 32.089114 ], [ -109.048296, 32.084093 ], [ -109.048731, 32.028174 ], [ -109.048599, 32.013651 ], [ -109.048590, 31.870791 ], [ -109.048769, 31.861383 ], [ -109.049106, 31.843715 ], [ -109.048763, 31.810776 ], [ -109.049195, 31.796551 ], [ -109.049112, 31.636598 ], [ -109.049813, 31.499528 ], [ -109.049843, 31.499515 ], [ -109.050173, 31.480004 ], [ -109.050044, 31.332502 ], [ -109.278489, 31.333959 ], [ -109.829689, 31.334067 ], [ -110.000613, 31.333145 ], [ -110.140512, 31.333965 ], [ -110.460172, 31.332827 ], [ -110.795467, 31.333630 ], [ -111.000643, 31.332177 ], [ -111.074825, 31.332239 ], [ -111.125646, 31.348978 ], [ -111.560194, 31.488138 ], [ -111.979417, 31.620683 ], [ -112.246102, 31.704195 ], [ -112.365043, 31.741130 ], [ -112.375758, 31.743988 ], [ -112.399420, 31.751757 ], [ -112.867074, 31.895488 ], [ -113.125961, 31.972780 ], [ -113.217308, 32.002107 ], [ -113.493196, 32.088943 ], [ -113.750756, 32.169005 ], [ -113.781680, 32.179034 ], [ -114.250775, 32.323910 ], [ -114.500780, 32.400057 ], [ -114.813613, 32.494277 ], [ -114.813991, 32.497231 ], [ -114.812316, 32.500054 ], [ -114.813753, 32.504260 ], [ -114.813694, 32.505065 ], [ -114.813164, 32.505594 ], [ -114.812635, 32.506918 ], [ -114.812370, 32.507712 ], [ -114.810159, 32.508383 ], [ -114.807726, 32.508726 ], [ -114.806017, 32.510094 ], [ -114.804694, 32.512476 ], [ -114.804429, 32.514594 ], [ -114.804958, 32.517506 ], [ -114.809723, 32.520153 ], [ -114.811576, 32.523594 ], [ -114.810563, 32.527666 ], [ -114.806400, 32.531192 ], [ -114.802181, 32.536414 ], [ -114.802018, 32.539460 ], [ -114.804776, 32.541659 ], [ -114.805966, 32.545346 ], [ -114.805830, 32.546354 ], [ -114.803883, 32.548002 ], [ -114.795635, 32.550956 ], [ -114.793769, 32.552329 ], [ -114.792065, 32.555009 ], [ -114.791551, 32.557023 ], [ -114.791988, 32.560652 ], [ -114.793312, 32.561976 ], [ -114.794635, 32.563564 ], [ -114.795959, 32.564093 ], [ -114.797660, 32.564444 ], [ -114.804429, 32.561976 ], [ -114.808929, 32.561976 ], [ -114.810517, 32.563828 ], [ -114.810782, 32.565152 ], [ -114.810517, 32.567270 ], [ -114.808929, 32.569652 ], [ -114.804421, 32.572942 ], [ -114.801877, 32.576010 ], [ -114.801471, 32.578255 ], [ -114.803879, 32.580889 ], [ -114.803987, 32.582652 ], [ -114.802823, 32.585080 ], [ -114.800441, 32.588080 ], [ -114.799737, 32.592178 ], [ -114.799683, 32.593621 ], [ -114.801548, 32.598591 ], [ -114.802361, 32.599370 ], [ -114.805932, 32.600721 ], [ -114.807906, 32.602783 ], [ -114.809042, 32.608806 ], [ -114.809393, 32.617119 ], [ -114.807390, 32.621332 ], [ -114.799302, 32.625115 ], [ -114.797565, 32.624578 ], [ -114.794102, 32.622475 ], [ -114.791179, 32.621833 ], [ -114.781872, 32.625050 ], [ -114.782670, 32.628634 ], [ -114.782235, 32.630215 ], [ -114.781282, 32.631459 ], [ -114.779215, 32.633579 ], [ -114.774482, 32.635869 ], [ -114.764382, 32.642666 ], [ -114.763310, 32.644617 ], [ -114.763512, 32.645996 ], [ -114.765067, 32.648047 ], [ -114.764950, 32.649391 ], [ -114.758310, 32.655178 ], [ -114.753111, 32.658304 ], [ -114.748000, 32.664184 ], [ -114.747848, 32.667693 ], [ -114.745345, 32.672187 ], [ -114.744491, 32.678671 ], [ -114.730453, 32.698843 ], [ -114.730041, 32.699675 ], [ -114.730086, 32.704298 ], [ -114.722746, 32.713071 ], [ -114.719633, 32.718763 ], [ -114.717665, 32.721654 ], [ -114.715788, 32.727758 ], [ -114.714522, 32.730390 ], [ -114.705717, 32.741581 ], [ -114.701918, 32.745548 ], [ -114.700743, 32.745617 ], [ -114.698790, 32.744846 ], [ -114.688779, 32.737675 ], [ -114.684278, 32.737537 ], [ -114.678632, 32.736614 ], [ -114.677091, 32.736218 ], [ -114.667493, 32.734226 ], [ -114.658840, 32.733830 ], [ -114.658260, 32.733799 ], [ -114.632686, 32.730846 ], [ -114.618373, 32.728245 ], [ -114.615585, 32.728446 ], [ -114.615733, 32.729427 ], [ -114.614772, 32.734089 ], [ -114.612697, 32.734516 ], [ -114.581784, 32.734946 ], [ -114.581736, 32.742321 ], [ -114.564508, 32.742298 ], [ -114.564447, 32.749554 ], [ -114.539224, 32.749812 ], [ -114.539093, 32.756949 ], [ -114.526856, 32.757094 ], [ -114.528443, 32.767276 ], [ -114.531831, 32.774264 ], [ -114.532432, 32.776923 ], [ -114.531746, 32.782503 ], [ -114.531669, 32.791185 ], [ -114.530755, 32.793485 ], [ -114.528849, 32.796307 ], [ -114.522031, 32.801675 ], [ -114.520385, 32.803577 ], [ -114.519758, 32.805676 ], [ -114.515389, 32.811439 ], [ -114.510217, 32.816417 ], [ -114.496827, 32.822119 ], [ -114.496284, 32.822326 ], [ -114.494116, 32.823288 ], [ -114.475892, 32.838694 ], [ -114.468971, 32.845155 ], [ -114.465546, 32.874809 ], [ -114.465715, 32.879191 ], [ -114.465715, 32.879420 ], [ -114.463127, 32.901884 ], [ -114.462929, 32.907944 ], [ -114.463650, 32.911682 ], [ -114.464448, 32.913129 ], [ -114.473713, 32.920594 ], [ -114.476640, 32.923628 ], [ -114.479005, 32.928291 ], [ -114.480920, 32.935252 ], [ -114.480740, 32.937027 ], [ -114.478456, 32.940555 ], [ -114.474042, 32.945150 ], [ -114.470833, 32.949333 ], [ -114.469113, 32.952673 ], [ -114.467730, 32.956323 ], [ -114.467272, 32.960675 ], [ -114.467664, 32.966861 ], [ -114.469039, 32.972295 ], [ -114.470988, 32.974060 ], [ -114.476156, 32.975168 ], [ -114.480417, 32.973665 ], [ -114.481315, 32.972064 ], [ -114.488625, 32.969946 ], [ -114.490129, 32.969885 ], [ -114.492938, 32.971781 ], [ -114.494212, 32.974262 ], [ -114.495712, 32.980076 ], [ -114.497315, 32.991474 ], [ -114.499797, 33.003905 ], [ -114.502871, 33.011153 ], [ -114.506130, 33.017010 ], [ -114.511343, 33.023455 ], [ -114.514900, 33.026524 ], [ -114.520130, 33.029984 ], [ -114.523578, 33.030961 ], [ -114.538459, 33.033422 ], [ -114.553189, 33.033974 ], [ -114.571653, 33.036624 ], [ -114.575161, 33.036542 ], [ -114.578287, 33.035375 ], [ -114.581404, 33.032545 ], [ -114.584765, 33.028231 ], [ -114.586982, 33.026945 ], [ -114.589778, 33.026228 ], [ -114.601014, 33.025410 ], [ -114.618788, 33.027202 ], [ -114.625787, 33.029436 ], [ -114.628293, 33.031052 ], [ -114.634190, 33.039025 ], [ -114.639553, 33.045291 ], [ -114.641622, 33.046896 ], [ -114.645980, 33.048903 ], [ -114.649001, 33.046763 ], [ -114.655038, 33.037107 ], [ -114.657827, 33.033825 ], [ -114.659832, 33.032665 ], [ -114.662317, 33.032671 ], [ -114.665060, 33.033908 ], [ -114.670803, 33.037984 ], [ -114.673659, 33.041897 ], [ -114.675104, 33.047532 ], [ -114.674296, 33.057171 ], [ -114.686991, 33.070969 ], [ -114.689120, 33.076122 ], [ -114.689307, 33.079179 ], [ -114.688597, 33.082869 ], [ -114.689020, 33.084036 ], [ -114.692548, 33.085786 ], [ -114.694628, 33.086226 ], [ -114.701165, 33.086368 ], [ -114.704730, 33.087051 ], [ -114.706488, 33.088160 ], [ -114.707819, 33.091102 ], [ -114.707896, 33.097432 ], [ -114.706175, 33.105335 ], [ -114.703682, 33.113769 ], [ -114.696829, 33.131209 ], [ -114.689995, 33.137883 ], [ -114.687074, 33.142196 ], [ -114.684489, 33.148121 ], [ -114.682253, 33.155214 ], [ -114.679359, 33.159519 ], [ -114.678729, 33.162948 ], [ -114.680248, 33.169717 ], [ -114.679034, 33.174738 ], [ -114.675831, 33.181520 ], [ -114.675360, 33.185489 ], [ -114.675190, 33.188179 ], [ -114.678178, 33.199584 ], [ -114.678749, 33.203448 ], [ -114.676072, 33.210835 ], [ -114.673715, 33.219245 ], [ -114.673626, 33.223121 ], [ -114.674479, 33.225504 ], [ -114.678097, 33.230300 ], [ -114.682731, 33.234918 ], [ -114.689421, 33.245250 ], [ -114.689541, 33.246428 ], [ -114.688205, 33.247966 ], [ -114.674491, 33.255597 ], [ -114.672088, 33.258499 ], [ -114.672401, 33.260470 ], [ -114.677032, 33.270170 ], [ -114.680507, 33.273577 ], [ -114.684363, 33.276025 ], [ -114.694449, 33.279786 ], [ -114.702873, 33.281916 ], [ -114.711197, 33.283342 ], [ -114.717875, 33.285157 ], [ -114.721670, 33.286982 ], [ -114.723259, 33.288079 ], [ -114.731223, 33.302434 ], [ -114.731222, 33.304039 ], [ -114.729904, 33.305745 ], [ -114.723623, 33.312110 ], [ -114.710792, 33.320607 ], [ -114.707962, 33.323421 ], [ -114.705241, 33.327767 ], [ -114.700938, 33.337014 ], [ -114.698035, 33.352442 ], [ -114.698170, 33.356575 ], [ -114.699053, 33.361148 ], [ -114.707348, 33.376628 ], [ -114.707009, 33.380634 ], [ -114.707310, 33.382542 ], [ -114.708408, 33.384147 ], [ -114.713602, 33.388257 ], [ -114.722872, 33.398779 ], [ -114.725292, 33.402342 ], [ -114.725535, 33.404056 ], [ -114.725282, 33.405048 ], [ -114.723829, 33.406531 ], [ -114.720065, 33.407891 ], [ -114.710878, 33.407254 ], [ -114.701732, 33.408388 ], [ -114.697707, 33.410942 ], [ -114.696805, 33.412087 ], [ -114.696504, 33.414059 ], [ -114.695655, 33.415127 ], [ -114.687953, 33.417944 ], [ -114.673901, 33.418299 ], [ -114.658382, 33.413036 ], [ -114.652828, 33.412922 ], [ -114.649540, 33.413633 ], [ -114.643302, 33.416745 ], [ -114.635183, 33.422726 ], [ -114.629640, 33.428138 ], [ -114.627125, 33.433554 ], [ -114.622283, 33.447558 ], [ -114.623395, 33.454490 ], [ -114.622918, 33.456561 ], [ -114.612472, 33.470768 ], [ -114.607843, 33.474834 ], [ -114.601696, 33.481394 ], [ -114.599713, 33.484315 ], [ -114.597283, 33.490653 ], [ -114.591554, 33.499443 ], [ -114.588239, 33.502453 ], [ -114.580468, 33.506465 ], [ -114.573757, 33.507543 ], [ -114.569533, 33.509219 ], [ -114.560963, 33.516739 ], [ -114.560552, 33.518272 ], [ -114.560835, 33.524334 ], [ -114.559507, 33.530724 ], [ -114.558898, 33.531819 ], [ -114.542011, 33.542481 ], [ -114.524599, 33.552231 ], [ -114.524391, 33.553683 ], [ -114.526834, 33.557466 ], [ -114.535664, 33.568788 ], [ -114.535965, 33.569154 ], [ -114.540300, 33.580615 ], [ -114.540617, 33.591412 ], [ -114.529186, 33.606650 ], [ -114.526782, 33.608831 ], [ -114.524813, 33.611351 ], [ -114.524619, 33.614260 ], [ -114.525783, 33.616588 ], [ -114.527938, 33.618839 ], [ -114.529662, 33.622794 ], [ -114.529856, 33.627448 ], [ -114.528498, 33.630164 ], [ -114.526947, 33.633073 ], [ -114.526947, 33.637534 ], [ -114.527917, 33.641413 ], [ -114.529080, 33.644128 ], [ -114.530050, 33.647619 ], [ -114.530244, 33.650140 ], [ -114.528304, 33.653049 ], [ -114.526947, 33.655571 ], [ -114.525783, 33.657122 ], [ -114.525201, 33.658092 ], [ -114.525007, 33.659643 ], [ -114.525201, 33.661583 ], [ -114.525977, 33.662941 ], [ -114.526947, 33.664298 ], [ -114.528304, 33.666044 ], [ -114.529706, 33.668031 ], [ -114.530999, 33.671102 ], [ -114.531523, 33.675108 ], [ -114.530348, 33.679245 ], [ -114.527782, 33.682684 ], [ -114.523959, 33.685879 ], [ -114.519113, 33.688473 ], [ -114.512409, 33.691282 ], [ -114.504993, 33.693022 ], [ -114.496489, 33.696901 ], [ -114.495719, 33.698454 ], [ -114.494197, 33.707922 ], [ -114.494901, 33.714430 ], [ -114.496565, 33.719155 ], [ -114.500788, 33.722204 ], [ -114.502661, 33.724584 ], [ -114.504176, 33.728055 ], [ -114.506799, 33.730518 ], [ -114.510265, 33.732146 ], [ -114.512348, 33.734214 ], [ -114.508206, 33.741587 ], [ -114.506000, 33.746344 ], [ -114.504483, 33.750998 ], [ -114.504340, 33.756381 ], [ -114.504863, 33.760465 ], [ -114.507089, 33.767930 ], [ -114.516734, 33.788345 ], [ -114.520094, 33.799473 ], [ -114.528050, 33.814963 ], [ -114.527161, 33.816191 ], [ -114.522714, 33.818979 ], [ -114.520733, 33.822031 ], [ -114.519970, 33.825381 ], [ -114.520465, 33.827778 ], [ -114.523409, 33.835323 ], [ -114.525539, 33.838614 ], [ -114.529597, 33.848063 ], [ -114.529385, 33.851755 ], [ -114.528451, 33.854929 ], [ -114.526771, 33.857357 ], [ -114.524530, 33.858477 ], [ -114.516811, 33.858120 ], [ -114.514673, 33.858638 ], [ -114.505638, 33.864276 ], [ -114.503887, 33.865754 ], [ -114.503017, 33.867998 ], [ -114.503395, 33.875018 ], [ -114.504340, 33.876882 ], [ -114.512467, 33.882884 ], [ -114.516501, 33.885926 ], [ -114.517808, 33.888167 ], [ -114.518555, 33.889847 ], [ -114.518928, 33.891714 ], [ -114.518741, 33.893208 ], [ -114.517808, 33.894889 ], [ -114.516314, 33.896196 ], [ -114.513715, 33.897959 ], [ -114.510944, 33.899099 ], [ -114.508708, 33.900640 ], [ -114.507988, 33.901813 ], [ -114.507920, 33.903807 ], [ -114.508558, 33.906098 ], [ -114.511511, 33.911092 ], [ -114.518434, 33.917518 ], [ -114.525361, 33.922272 ], [ -114.528385, 33.923674 ], [ -114.533679, 33.926072 ], [ -114.534987, 33.928499 ], [ -114.535478, 33.934651 ], [ -114.528680, 33.947817 ], [ -114.522002, 33.955623 ], [ -114.515860, 33.958106 ], [ -114.511231, 33.957040 ], [ -114.509568, 33.957264 ], [ -114.499883, 33.961789 ], [ -114.495047, 33.966835 ], [ -114.484784, 33.975519 ], [ -114.483097, 33.977745 ], [ -114.482333, 33.980181 ], [ -114.481455, 33.981261 ], [ -114.475907, 33.984424 ], [ -114.471138, 33.988040 ], [ -114.467932, 33.992877 ], [ -114.466187, 33.993465 ], [ -114.462377, 33.993781 ], [ -114.461170, 33.994687 ], [ -114.460264, 33.996649 ], [ -114.460415, 33.999215 ], [ -114.462830, 34.004497 ], [ -114.463132, 34.006610 ], [ -114.462830, 34.008421 ], [ -114.461170, 34.010081 ], [ -114.458906, 34.010835 ], [ -114.454807, 34.010968 ], [ -114.450206, 34.012574 ], [ -114.443821, 34.016176 ], [ -114.440540, 34.019329 ], [ -114.438266, 34.022609 ], [ -114.436171, 34.028083 ], [ -114.434949, 34.037784 ], [ -114.435504, 34.042615 ], [ -114.438602, 34.050205 ], [ -114.439406, 34.053810 ], [ -114.439340, 34.057893 ], [ -114.437683, 34.071937 ], [ -114.435429, 34.079727 ], [ -114.434181, 34.087379 ], [ -114.433380, 34.088413 ], [ -114.428026, 34.092787 ], [ -114.426168, 34.097042 ], [ -114.420499, 34.103466 ], [ -114.415908, 34.107636 ], [ -114.411681, 34.110031 ], [ -114.405941, 34.111540 ], [ -114.401352, 34.111652 ], [ -114.390565, 34.110084 ], [ -114.379234, 34.115988 ], [ -114.369297, 34.117517 ], [ -114.366521, 34.118575 ], [ -114.360402, 34.123577 ], [ -114.356373, 34.130429 ], [ -114.353031, 34.133121 ], [ -114.348052, 34.134458 ], [ -114.336112, 34.134035 ], [ -114.324576, 34.136759 ], [ -114.320777, 34.138635 ], [ -114.312206, 34.144776 ], [ -114.292806, 34.166725 ], [ -114.287294, 34.170529 ], [ -114.275267, 34.172150 ], [ -114.268267, 34.170210 ], [ -114.254141, 34.173831 ], [ -114.244191, 34.179625 ], [ -114.240712, 34.183232 ], [ -114.229715, 34.186928 ], [ -114.227034, 34.188866 ], [ -114.224941, 34.193896 ], [ -114.225861, 34.201774 ], [ -114.225194, 34.203642 ], [ -114.223384, 34.205136 ], [ -114.215454, 34.208956 ], [ -114.211761, 34.211539 ], [ -114.208253, 34.215505 ], [ -114.190876, 34.230858 ], [ -114.178050, 34.239969 ], [ -114.176403, 34.241512 ], [ -114.175948, 34.242695 ], [ -114.174322, 34.245468 ], [ -114.173119, 34.247226 ], [ -114.166536, 34.249647 ], [ -114.164476, 34.251667 ], [ -114.163867, 34.253349 ], [ -114.163122, 34.255187 ], [ -114.161826, 34.257038 ], [ -114.159697, 34.258242 ], [ -114.156853, 34.258415 ], [ -114.153346, 34.258289 ], [ -114.147159, 34.259564 ], [ -114.144779, 34.259623 ], [ -114.139055, 34.259538 ], [ -114.136185, 34.261296 ], [ -114.134612, 34.263518 ], [ -114.134427, 34.266387 ], [ -114.134768, 34.268965 ], [ -114.136671, 34.274377 ], [ -114.137045, 34.277018 ], [ -114.136050, 34.280833 ], [ -114.138365, 34.288564 ], [ -114.139534, 34.295844 ], [ -114.138167, 34.300936 ], [ -114.138282, 34.303230 ], [ -114.140930, 34.305919 ], [ -114.157206, 34.317862 ], [ -114.168807, 34.339513 ], [ -114.172845, 34.344979 ], [ -114.176909, 34.349306 ], [ -114.181145, 34.352186 ], [ -114.185556, 34.354386 ], [ -114.191094, 34.356125 ], [ -114.199482, 34.361373 ], [ -114.213774, 34.362460 ], [ -114.226107, 34.365916 ], [ -114.229686, 34.368908 ], [ -114.234275, 34.376662 ], [ -114.245261, 34.385659 ], [ -114.248649, 34.388113 ], [ -114.252739, 34.390100 ], [ -114.264317, 34.401329 ], [ -114.267521, 34.402486 ], [ -114.280108, 34.403147 ], [ -114.286802, 34.405340 ], [ -114.288663, 34.406623 ], [ -114.290219, 34.408291 ], [ -114.291751, 34.411104 ], [ -114.292226, 34.417606 ], [ -114.294836, 34.421389 ], [ -114.301016, 34.426807 ], [ -114.312251, 34.432726 ], [ -114.319054, 34.435831 ], [ -114.326130, 34.437251 ], [ -114.330669, 34.445295 ], [ -114.332991, 34.448082 ], [ -114.335372, 34.450038 ], [ -114.339627, 34.451435 ], [ -114.342615, 34.451442 ], [ -114.356025, 34.449744 ], [ -114.363404, 34.447773 ], [ -114.373719, 34.446938 ], [ -114.375789, 34.447798 ], [ -114.378852, 34.450376 ], [ -114.386699, 34.457911 ], [ -114.387407, 34.460492 ], [ -114.387187, 34.462021 ], [ -114.383525, 34.470405 ], [ -114.381701, 34.476040 ], [ -114.381555, 34.477883 ], [ -114.383038, 34.488903 ], [ -114.382358, 34.495757 ], [ -114.381402, 34.499242 ], [ -114.378124, 34.507288 ], [ -114.378223, 34.516521 ], [ -114.380838, 34.529724 ], [ -114.389603, 34.542982 ], [ -114.405228, 34.569637 ], [ -114.422382, 34.580711 ], [ -114.429747, 34.591734 ], [ -114.429747, 34.595846 ], [ -114.430090, 34.596874 ], [ -114.427502, 34.599227 ], [ -114.425338, 34.600842 ], [ -114.424326, 34.602338 ], [ -114.424202, 34.610453 ], [ -114.428648, 34.614641 ], [ -114.438739, 34.621455 ], [ -114.441398, 34.630171 ], [ -114.441525, 34.631529 ], [ -114.440294, 34.638240 ], [ -114.441465, 34.642530 ], [ -114.444276, 34.646542 ], [ -114.449549, 34.651423 ], [ -114.451753, 34.654321 ], [ -114.451971, 34.657166 ], [ -114.452628, 34.659573 ], [ -114.451785, 34.663891 ], [ -114.451753, 34.665044 ], [ -114.451971, 34.666795 ], [ -114.452628, 34.668546 ], [ -114.454305, 34.671234 ], [ -114.454910, 34.673092 ], [ -114.455473, 34.675768 ], [ -114.456567, 34.677956 ], [ -114.462178, 34.685800 ], [ -114.465246, 34.691202 ], [ -114.468090, 34.701786 ], [ -114.468620, 34.707573 ], [ -114.470477, 34.711368 ], [ -114.471620, 34.712966 ], [ -114.473682, 34.713964 ], [ -114.477297, 34.714514 ], [ -114.481954, 34.716036 ], [ -114.486768, 34.719100 ], [ -114.490971, 34.724848 ], [ -114.492017, 34.725702 ], [ -114.495858, 34.727956 ], [ -114.503361, 34.731247 ], [ -114.510292, 34.733582 ], [ -114.516619, 34.736745 ], [ -114.521048, 34.741173 ], [ -114.522619, 34.743730 ], [ -114.525611, 34.747005 ], [ -114.529615, 34.750822 ], [ -114.540306, 34.757109 ], [ -114.546884, 34.761802 ], [ -114.552682, 34.766871 ], [ -114.558653, 34.773852 ], [ -114.571010, 34.794294 ], [ -114.574569, 34.805746 ], [ -114.576452, 34.815300 ], [ -114.581126, 34.826115 ], [ -114.586842, 34.835672 ], [ -114.592339, 34.841153 ], [ -114.600653, 34.847361 ], [ -114.604255, 34.849573 ], [ -114.619878, 34.856873 ], [ -114.623939, 34.859738 ], [ -114.630682, 34.866352 ], [ -114.634382, 34.872890 ], [ -114.635176, 34.875003 ], [ -114.636768, 34.885705 ], [ -114.636725, 34.889107 ], [ -114.635425, 34.895192 ], [ -114.630877, 34.907263 ], [ -114.630552, 34.911852 ], [ -114.633237, 34.921230 ], [ -114.633253, 34.924608 ], [ -114.632196, 34.930628 ], [ -114.629753, 34.938684 ], [ -114.629769, 34.943040 ], [ -114.629811, 34.944810 ], [ -114.631681, 34.951310 ], [ -114.634953, 34.958918 ], [ -114.635237, 34.965149 ], [ -114.634607, 34.969060 ], [ -114.629907, 34.980791 ], [ -114.629015, 34.986148 ], [ -114.629190, 34.991887 ], [ -114.629928, 34.994740 ], [ -114.633013, 35.002085 ], [ -114.636674, 35.008807 ], [ -114.638023, 35.020556 ], [ -114.636893, 35.028367 ], [ -114.632429, 35.037586 ], [ -114.627124, 35.044721 ], [ -114.606694, 35.058941 ], [ -114.603619, 35.064226 ], [ -114.602908, 35.068588 ], [ -114.604736, 35.074830 ], [ -114.613132, 35.083097 ], [ -114.622517, 35.088703 ], [ -114.642831, 35.096503 ], [ -114.646759, 35.101872 ], [ -114.644352, 35.105904 ], [ -114.629934, 35.118272 ], [ -114.619905, 35.121632 ], [ -114.599120, 35.121050 ], [ -114.587740, 35.123729 ], [ -114.578524, 35.128750 ], [ -114.572747, 35.138725 ], [ -114.569569, 35.163053 ], [ -114.569238, 35.183480 ], [ -114.572119, 35.200591 ], [ -114.574835, 35.205898 ], [ -114.579963, 35.209640 ], [ -114.583559, 35.229930 ], [ -114.583111, 35.238090 ], [ -114.587129, 35.262376 ], [ -114.597503, 35.296954 ], [ -114.595931, 35.325234 ], [ -114.604314, 35.353584 ], [ -114.611435, 35.369056 ], [ -114.627137, 35.409504 ], [ -114.652005, 35.429165 ], [ -114.662125, 35.444241 ], [ -114.664500, 35.449497 ], [ -114.666377, 35.466856 ], [ -114.672901, 35.481708 ], [ -114.677643, 35.489742 ], [ -114.679205, 35.499992 ], [ -114.677205, 35.513491 ], [ -114.673805, 35.517891 ], [ -114.663105, 35.524491 ], [ -114.658005, 35.530491 ], [ -114.656905, 35.534391 ], [ -114.657405, 35.536391 ], [ -114.660205, 35.539291 ], [ -114.662005, 35.545491 ], [ -114.663005, 35.563690 ], [ -114.666184, 35.577576 ], [ -114.665649, 35.580428 ], [ -114.659606, 35.587490 ], [ -114.654306, 35.597590 ], [ -114.653406, 35.610789 ], [ -114.658206, 35.619089 ], [ -114.677107, 35.641489 ], [ -114.689407, 35.651412 ], [ -114.690008, 35.664688 ], [ -114.682207, 35.678188 ], [ -114.680607, 35.685488 ], [ -114.683208, 35.689387 ], [ -114.694108, 35.695187 ], [ -114.701208, 35.701187 ], [ -114.705409, 35.708287 ], [ -114.705309, 35.711587 ], [ -114.697309, 35.733686 ], [ -114.695709, 35.755986 ], [ -114.701409, 35.769086 ], [ -114.698910, 35.790185 ], [ -114.712110, 35.806185 ], [ -114.709910, 35.810185 ], [ -114.703710, 35.814585 ], [ -114.695710, 35.830601 ], [ -114.696410, 35.833784 ], [ -114.699848, 35.843283 ], [ -114.699848, 35.848370 ], [ -114.697767, 35.854844 ], [ -114.682010, 35.863284 ], [ -114.679501, 35.868023 ], [ -114.678114, 35.871953 ], [ -114.677420, 35.874728 ], [ -114.677883, 35.876346 ], [ -114.679039, 35.880046 ], [ -114.681120, 35.885364 ], [ -114.700271, 35.901772 ], [ -114.708516, 35.912313 ], [ -114.707526, 35.928060 ], [ -114.715692, 35.934709 ], [ -114.729356, 35.941413 ], [ -114.731159, 35.943916 ], [ -114.728318, 35.956290 ], [ -114.729941, 35.962183 ], [ -114.740595, 35.975656 ], [ -114.743756, 35.985095 ], [ -114.743243, 36.006530 ], [ -114.742779, 36.009963 ], [ -114.740522, 36.013336 ], [ -114.731162, 36.021862 ], [ -114.729707, 36.028166 ], [ -114.730435, 36.031317 ], [ -114.734314, 36.035681 ], [ -114.739405, 36.037863 ], [ -114.740617, 36.041015 ], [ -114.740375, 36.043682 ], [ -114.740375, 36.049258 ], [ -114.736738, 36.054349 ], [ -114.736253, 36.058470 ], [ -114.743342, 36.070535 ], [ -114.754099, 36.079440 ], [ -114.755491, 36.081601 ], [ -114.755618, 36.087166 ], [ -114.753638, 36.090705 ], [ -114.747079, 36.097005 ], [ -114.736165, 36.104367 ], [ -114.717293, 36.107686 ], [ -114.709771, 36.107742 ], [ -114.666538, 36.117343 ], [ -114.662890, 36.119932 ], [ -114.659950, 36.124145 ], [ -114.631716, 36.142306 ], [ -114.627855, 36.141012 ], [ -114.621883, 36.132130 ], [ -114.616694, 36.130101 ], [ -114.608264, 36.133949 ], [ -114.597212, 36.142103 ], [ -114.572031, 36.151610 ], [ -114.545789, 36.152248 ], [ -114.511721, 36.150956 ], [ -114.506711, 36.148277 ], [ -114.504631, 36.145629 ], [ -114.504820, 36.142414 ], [ -114.505387, 36.137496 ], [ -114.506144, 36.134659 ], [ -114.505766, 36.131444 ], [ -114.504442, 36.129741 ], [ -114.502172, 36.128796 ], [ -114.496120, 36.127850 ], [ -114.487034, 36.129396 ], [ -114.470152, 36.138801 ], [ -114.463637, 36.139695 ], [ -114.458369, 36.138586 ], [ -114.453325, 36.130726 ], [ -114.448654, 36.126410 ], [ -114.446605, 36.125970 ], [ -114.427169, 36.136305 ], [ -114.416950, 36.145761 ], [ -114.412373, 36.147254 ], [ -114.405475, 36.147371 ], [ -114.372106, 36.143114 ], [ -114.363109, 36.130246 ], [ -114.337273, 36.108020 ], [ -114.328777, 36.105501 ], [ -114.308430, 36.082443 ], [ -114.305738, 36.074882 ], [ -114.307879, 36.071291 ], [ -114.314206, 36.066619 ], [ -114.316109, 36.063109 ], [ -114.315557, 36.059494 ], [ -114.314028, 36.058165 ], [ -114.280202, 36.046362 ], [ -114.270645, 36.035720 ], [ -114.266721, 36.029238 ], [ -114.263146, 36.025937 ], [ -114.252651, 36.020193 ], [ -114.238799, 36.014561 ], [ -114.233289, 36.014289 ], [ -114.213690, 36.015613 ], [ -114.192380, 36.020993 ], [ -114.176824, 36.027651 ], [ -114.166465, 36.027738 ], [ -114.154130, 36.023862 ], [ -114.151725, 36.024563 ], [ -114.148191, 36.028013 ], [ -114.138202, 36.041284 ], [ -114.137188, 36.046785 ], [ -114.138203, 36.053161 ], [ -114.136896, 36.059467 ], [ -114.114531, 36.095217 ], [ -114.114165, 36.096982 ], [ -114.117459, 36.100893 ], [ -114.123221, 36.104746 ], [ -114.123975, 36.106515 ], [ -114.123144, 36.111576 ], [ -114.120862, 36.114596 ], [ -114.111011, 36.119875 ], [ -114.103222, 36.120176 ], [ -114.099870, 36.121654 ], [ -114.088954, 36.144381 ], [ -114.068027, 36.180663 ], [ -114.060302, 36.189363 ], [ -114.046838, 36.194069 ], [ -114.046743, 36.245246 ], [ -114.047106, 36.250591 ], [ -114.048226, 36.268874 ], [ -114.048515, 36.289598 ], [ -114.046935, 36.315449 ], [ -114.047584, 36.325573 ], [ -114.045806, 36.391071 ], [ -114.045829, 36.442973 ], [ -114.046488, 36.473449 ], [ -114.048476, 36.499980 ], [ -114.049660, 36.621113 ], [ -114.050167, 36.624978 ], [ -114.050562, 36.656259 ], [ -114.050619, 36.843128 ], [ -114.049995, 36.957769 ], [ -114.050600, 37.000396 ], [ -113.965907, 37.000025 ], [ -113.965907, 36.999976 ], [ -112.966471, 37.000219 ], [ -112.609787, 37.000753 ], [ -112.558974, 37.000692 ], [ -112.545094, 37.000734 ], [ -112.540368, 37.000669 ], [ -112.368946, 37.001125 ], [ -112.357690, 37.001025 ], [ -111.405869, 37.001481 ], [ -111.405517, 37.001497 ], [ -111.278286, 37.000465 ], [ -111.254853, 37.001077 ], [ -111.133718, 37.000779 ], [ -111.066496, 37.002389 ], [ -110.750690, 37.003197 ], [ -110.625690, 37.003721 ], [ -110.625605, 37.003416 ], [ -110.599512, 37.003448 ], [ -110.500690, 37.004260 ], [ -110.490908, 37.003566 ], [ -110.470190, 36.997997 ], [ -110.021778, 36.998602 ], [ -110.000876, 36.998502 ], [ -110.000677, 36.997968 ], [ -109.875673, 36.998504 ], [ -109.625668, 36.998308 ], [ -109.495338, 36.999105 ], [ -109.381226, 36.999148 ], [ -109.378039, 36.999135 ], [ -109.270097, 36.999266 ], [ -109.268213, 36.999242 ], [ -109.263390, 36.999263 ], [ -109.246917, 36.999346 ], [ -109.233848, 36.999266 ], [ -109.181196, 36.999271 ], [ -109.045223, 36.999084 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US05", "STATE": "05", "NAME": "Arkansas", "LSAD": "", "CENSUSAREA": 52035.477000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -94.559290, 36.499496 ], [ -94.519478, 36.499214 ], [ -94.361203, 36.499600 ], [ -94.111473, 36.498597 ], [ -94.110673, 36.498587 ], [ -94.100252, 36.498670 ], [ -94.098588, 36.498676 ], [ -94.077089, 36.498730 ], [ -93.963920, 36.498717 ], [ -93.959190, 36.498717 ], [ -93.921840, 36.498718 ], [ -93.906128, 36.498718 ], [ -93.728022, 36.499037 ], [ -93.727552, 36.499055 ], [ -93.718893, 36.499178 ], [ -93.709956, 36.499179 ], [ -93.700171, 36.499135 ], [ -93.584281, 36.498896 ], [ -93.514512, 36.498881 ], [ -93.507408, 36.498911 ], [ -93.426989, 36.498585 ], [ -93.396079, 36.498669 ], [ -93.394718, 36.498519 ], [ -93.315337, 36.498408 ], [ -93.125969, 36.497851 ], [ -93.088988, 36.498184 ], [ -93.087635, 36.498239 ], [ -93.069512, 36.498242 ], [ -93.068455, 36.498250 ], [ -92.894336, 36.497867 ], [ -92.894001, 36.497850 ], [ -92.838876, 36.498033 ], [ -92.838621, 36.498079 ], [ -92.772333, 36.497772 ], [ -92.564238, 36.498240 ], [ -92.516836, 36.498738 ], [ -92.444129, 36.498526 ], [ -92.420383, 36.497914 ], [ -92.384927, 36.497845 ], [ -92.375159, 36.497199 ], [ -92.350277, 36.497787 ], [ -92.318415, 36.497711 ], [ -92.309424, 36.497894 ], [ -92.216412, 36.498417 ], [ -92.214143, 36.498372 ], [ -92.211449, 36.498395 ], [ -92.199396, 36.498351 ], [ -92.137741, 36.498706 ], [ -92.120306, 36.498864 ], [ -92.098356, 36.498803 ], [ -92.074934, 36.498761 ], [ -92.057178, 36.498670 ], [ -92.055789, 36.498670 ], [ -92.028847, 36.498642 ], [ -92.019375, 36.498524 ], [ -91.988751, 36.498498 ], [ -91.985802, 36.498431 ], [ -91.865995, 36.498783 ], [ -91.864385, 36.498789 ], [ -91.805981, 36.498987 ], [ -91.802040, 36.498963 ], [ -91.799500, 36.498952 ], [ -91.784713, 36.499074 ], [ -91.766111, 36.499114 ], [ -91.726663, 36.499209 ], [ -91.687615, 36.499397 ], [ -91.686026, 36.499374 ], [ -91.672343, 36.499463 ], [ -91.642590, 36.499335 ], [ -91.631439, 36.499198 ], [ -91.601317, 36.499343 ], [ -91.596213, 36.499162 ], [ -91.549163, 36.499161 ], [ -91.539359, 36.499116 ], [ -91.536870, 36.499156 ], [ -91.529774, 36.499022 ], [ -91.500140, 36.498812 ], [ -91.446284, 36.497469 ], [ -91.436502, 36.497377 ], [ -91.433298, 36.497262 ], [ -91.407261, 36.497123 ], [ -91.407137, 36.497112 ], [ -91.405141, 36.497165 ], [ -91.404915, 36.497120 ], [ -91.227398, 36.497617 ], [ -91.218645, 36.497564 ], [ -91.217360, 36.497511 ], [ -91.126529, 36.497712 ], [ -91.096277, 36.497893 ], [ -91.095880, 36.497870 ], [ -91.017974, 36.498062 ], [ -91.008558, 36.498270 ], [ -90.963063, 36.498418 ], [ -90.960648, 36.498426 ], [ -90.879220, 36.498378 ], [ -90.876867, 36.498423 ], [ -90.876567, 36.498313 ], [ -90.873775, 36.498074 ], [ -90.850434, 36.498548 ], [ -90.782454, 36.498523 ], [ -90.765672, 36.498494 ], [ -90.711226, 36.498318 ], [ -90.693005, 36.498510 ], [ -90.653246, 36.498488 ], [ -90.648494, 36.498447 ], [ -90.612554, 36.498559 ], [ -90.605450, 36.498459 ], [ -90.594300, 36.498459 ], [ -90.585342, 36.498497 ], [ -90.576112, 36.498446 ], [ -90.500160, 36.498399 ], [ -90.495027, 36.498371 ], [ -90.494575, 36.498368 ], [ -90.339892, 36.498213 ], [ -90.228943, 36.497771 ], [ -90.220702, 36.497858 ], [ -90.217323, 36.497797 ], [ -90.193943, 36.497823 ], [ -90.152481, 36.497952 ], [ -90.154409, 36.496832 ], [ -90.153871, 36.495344 ], [ -90.155012, 36.493648 ], [ -90.157358, 36.494223 ], [ -90.159048, 36.493734 ], [ -90.159305, 36.492446 ], [ -90.158568, 36.491574 ], [ -90.155997, 36.490385 ], [ -90.156369, 36.487748 ], [ -90.159462, 36.487609 ], [ -90.159305, 36.485834 ], [ -90.157136, 36.484317 ], [ -90.159460, 36.481343 ], [ -90.159376, 36.480084 ], [ -90.158838, 36.479558 ], [ -90.148329, 36.476168 ], [ -90.145382, 36.476510 ], [ -90.143683, 36.476029 ], [ -90.142269, 36.472138 ], [ -90.142222, 36.470554 ], [ -90.146327, 36.469520 ], [ -90.152888, 36.470930 ], [ -90.155700, 36.466103 ], [ -90.155804, 36.463555 ], [ -90.144620, 36.462789 ], [ -90.143849, 36.463250 ], [ -90.143162, 36.463680 ], [ -90.142475, 36.463422 ], [ -90.141530, 36.462993 ], [ -90.141101, 36.461791 ], [ -90.141568, 36.460766 ], [ -90.141399, 36.459874 ], [ -90.140041, 36.457883 ], [ -90.137323, 36.455411 ], [ -90.136029, 36.442941 ], [ -90.133993, 36.437906 ], [ -90.134136, 36.436602 ], [ -90.137565, 36.431913 ], [ -90.139039, 36.431273 ], [ -90.142720, 36.431160 ], [ -90.143798, 36.428483 ], [ -90.144139, 36.425806 ], [ -90.143743, 36.424433 ], [ -90.139499, 36.421457 ], [ -90.137771, 36.421205 ], [ -90.135590, 36.422897 ], [ -90.134797, 36.423240 ], [ -90.134231, 36.422827 ], [ -90.134915, 36.416902 ], [ -90.136218, 36.415346 ], [ -90.138653, 36.414547 ], [ -90.138512, 36.413952 ], [ -90.135002, 36.413721 ], [ -90.131038, 36.415069 ], [ -90.128719, 36.411659 ], [ -90.121445, 36.410931 ], [ -90.115839, 36.408235 ], [ -90.114677, 36.406039 ], [ -90.109495, 36.404073 ], [ -90.103644, 36.404720 ], [ -90.094353, 36.403963 ], [ -90.080426, 36.400763 ], [ -90.078671, 36.399116 ], [ -90.076689, 36.395867 ], [ -90.074227, 36.393304 ], [ -90.072897, 36.393007 ], [ -90.068907, 36.388660 ], [ -90.064514, 36.382085 ], [ -90.063891, 36.372982 ], [ -90.066297, 36.359300 ], [ -90.070653, 36.356097 ], [ -90.075376, 36.350148 ], [ -90.077723, 36.349484 ], [ -90.077695, 36.348478 ], [ -90.074668, 36.344794 ], [ -90.074074, 36.342895 ], [ -90.075064, 36.341774 ], [ -90.077185, 36.341339 ], [ -90.078231, 36.336511 ], [ -90.075884, 36.335184 ], [ -90.075572, 36.334040 ], [ -90.076986, 36.330791 ], [ -90.078880, 36.327977 ], [ -90.081425, 36.325644 ], [ -90.081961, 36.322097 ], [ -90.079981, 36.318619 ], [ -90.079077, 36.318414 ], [ -90.077296, 36.319329 ], [ -90.076504, 36.319237 ], [ -90.069266, 36.313152 ], [ -90.063980, 36.303038 ], [ -90.070085, 36.294710 ], [ -90.077800, 36.288349 ], [ -90.075934, 36.281485 ], [ -90.083731, 36.272332 ], [ -90.086471, 36.271531 ], [ -90.091247, 36.271256 ], [ -90.100175, 36.268988 ], [ -90.105231, 36.266835 ], [ -90.110317, 36.266970 ], [ -90.112945, 36.266557 ], [ -90.114922, 36.265595 ], [ -90.118219, 36.253491 ], [ -90.124476, 36.244198 ], [ -90.125958, 36.243416 ], [ -90.129716, 36.243235 ], [ -90.130565, 36.242092 ], [ -90.130114, 36.240307 ], [ -90.127264, 36.236347 ], [ -90.124660, 36.235549 ], [ -90.124673, 36.233787 ], [ -90.126366, 36.229367 ], [ -90.132356, 36.226442 ], [ -90.134785, 36.226397 ], [ -90.138089, 36.227245 ], [ -90.142240, 36.227522 ], [ -90.151422, 36.219174 ], [ -90.152497, 36.215582 ], [ -90.156140, 36.213706 ], [ -90.157383, 36.213821 ], [ -90.159415, 36.215424 ], [ -90.161166, 36.215767 ], [ -90.167745, 36.213320 ], [ -90.173281, 36.210301 ], [ -90.179695, 36.208262 ], [ -90.182853, 36.205108 ], [ -90.185790, 36.204674 ], [ -90.188189, 36.205360 ], [ -90.190053, 36.201493 ], [ -90.193017, 36.200440 ], [ -90.194259, 36.200692 ], [ -90.195247, 36.200257 ], [ -90.197167, 36.196002 ], [ -90.199905, 36.196848 ], [ -90.201655, 36.196070 ], [ -90.201712, 36.193187 ], [ -90.200582, 36.192181 ], [ -90.204449, 36.186940 ], [ -90.211280, 36.183392 ], [ -90.213509, 36.183232 ], [ -90.215740, 36.184582 ], [ -90.220425, 36.184764 ], [ -90.229339, 36.173640 ], [ -90.231284, 36.169246 ], [ -90.230324, 36.167072 ], [ -90.235370, 36.159153 ], [ -90.231445, 36.153868 ], [ -90.231386, 36.147348 ], [ -90.235585, 36.139474 ], [ -90.240887, 36.137321 ], [ -90.244317, 36.136502 ], [ -90.245961, 36.132857 ], [ -90.248808, 36.129835 ], [ -90.253198, 36.127383 ], [ -90.255596, 36.127086 ], [ -90.258755, 36.127591 ], [ -90.260645, 36.127409 ], [ -90.266256, 36.120559 ], [ -90.272378, 36.118090 ], [ -90.278724, 36.117406 ], [ -90.293109, 36.114368 ], [ -90.294492, 36.112949 ], [ -90.298413, 36.106748 ], [ -90.297878, 36.104826 ], [ -90.297991, 36.103201 ], [ -90.299910, 36.098236 ], [ -90.306255, 36.094758 ], [ -90.312373, 36.094507 ], [ -90.319168, 36.089976 ], [ -90.320662, 36.087138 ], [ -90.320070, 36.081234 ], [ -90.318745, 36.079313 ], [ -90.318378, 36.076658 ], [ -90.318491, 36.075514 ], [ -90.320746, 36.071326 ], [ -90.333261, 36.067504 ], [ -90.335466, 36.061714 ], [ -90.337146, 36.047754 ], [ -90.339343, 36.047112 ], [ -90.347908, 36.041939 ], [ -90.349090, 36.040131 ], [ -90.348297, 36.035074 ], [ -90.350974, 36.031572 ], [ -90.351818, 36.028436 ], [ -90.351310, 36.026880 ], [ -90.351732, 36.025347 ], [ -90.357390, 36.018250 ], [ -90.364430, 36.013625 ], [ -90.377890, 35.995683 ], [ -90.368718, 35.995812 ], [ -90.342616, 35.995895 ], [ -90.339434, 35.996033 ], [ -90.292376, 35.996397 ], [ -90.288800, 35.996419 ], [ -90.158812, 35.997375 ], [ -90.127331, 35.997635 ], [ -90.126350, 35.997596 ], [ -90.103842, 35.998143 ], [ -89.972563, 35.998994 ], [ -89.965327, 35.998813 ], [ -89.961075, 35.999135 ], [ -89.959893, 35.999020 ], [ -89.959377, 35.999020 ], [ -89.901183, 35.999365 ], [ -89.896508, 35.999432 ], [ -89.875586, 35.999562 ], [ -89.875085, 35.999578 ], [ -89.874590, 35.999575 ], [ -89.869010, 35.999640 ], [ -89.770255, 36.000524 ], [ -89.769973, 36.000536 ], [ -89.737648, 36.000567 ], [ -89.737564, 36.000522 ], [ -89.733095, 36.000608 ], [ -89.731218, 35.996879 ], [ -89.728442, 35.993568 ], [ -89.719168, 35.985976 ], [ -89.718801, 35.985015 ], [ -89.719970, 35.974620 ], [ -89.719679, 35.970939 ], [ -89.718796, 35.968283 ], [ -89.714565, 35.963034 ], [ -89.710227, 35.959826 ], [ -89.699871, 35.954063 ], [ -89.686924, 35.947716 ], [ -89.676621, 35.940539 ], [ -89.671117, 35.935795 ], [ -89.656147, 35.925810 ], [ -89.652279, 35.921462 ], [ -89.650340, 35.917795 ], [ -89.646711, 35.908008 ], [ -89.644838, 35.904351 ], [ -89.647270, 35.894920 ], [ -89.650680, 35.890880 ], [ -89.655452, 35.886912 ], [ -89.657771, 35.885750 ], [ -89.665672, 35.883301 ], [ -89.669553, 35.883281 ], [ -89.677012, 35.885720 ], [ -89.681820, 35.889990 ], [ -89.688141, 35.896946 ], [ -89.714934, 35.906247 ], [ -89.741241, 35.906749 ], [ -89.756312, 35.898060 ], [ -89.765689, 35.891299 ], [ -89.768743, 35.886663 ], [ -89.771726, 35.879724 ], [ -89.772855, 35.876244 ], [ -89.773564, 35.871697 ], [ -89.773294, 35.867426 ], [ -89.772467, 35.865098 ], [ -89.769413, 35.861558 ], [ -89.764343, 35.858313 ], [ -89.749424, 35.852955 ], [ -89.729517, 35.847632 ], [ -89.709261, 35.838911 ], [ -89.704351, 35.835726 ], [ -89.702883, 35.834153 ], [ -89.701407, 35.830985 ], [ -89.701045, 35.828227 ], [ -89.701750, 35.824238 ], [ -89.703875, 35.820281 ], [ -89.706085, 35.818260 ], [ -89.719915, 35.811557 ], [ -89.723426, 35.809382 ], [ -89.734044, 35.806174 ], [ -89.743025, 35.805817 ], [ -89.757874, 35.810415 ], [ -89.765442, 35.811214 ], [ -89.765457, 35.809513 ], [ -89.781793, 35.805084 ], [ -89.796324, 35.792807 ], [ -89.799331, 35.788503 ], [ -89.797053, 35.782648 ], [ -89.797231, 35.780117 ], [ -89.799249, 35.775439 ], [ -89.809280, 35.764379 ], [ -89.812891, 35.761154 ], [ -89.814456, 35.759941 ], [ -89.821216, 35.756716 ], [ -89.824923, 35.755715 ], [ -89.832895, 35.754905 ], [ -89.846343, 35.755732 ], [ -89.857707, 35.750077 ], [ -89.863874, 35.747592 ], [ -89.872845, 35.741299 ], [ -89.877256, 35.741369 ], [ -89.883535, 35.744984 ], [ -89.888163, 35.750077 ], [ -89.905538, 35.759063 ], [ -89.909996, 35.759396 ], [ -89.913132, 35.757302 ], [ -89.915491, 35.754917 ], [ -89.950278, 35.738493 ], [ -89.953983, 35.736160 ], [ -89.956254, 35.733386 ], [ -89.958687, 35.727706 ], [ -89.958882, 35.723834 ], [ -89.956933, 35.711677 ], [ -89.956589, 35.695486 ], [ -89.955753, 35.690621 ], [ -89.953303, 35.686418 ], [ -89.950161, 35.682433 ], [ -89.942700, 35.675121 ], [ -89.937383, 35.665711 ], [ -89.931036, 35.660044 ], [ -89.922749, 35.655293 ], [ -89.915427, 35.652782 ], [ -89.906147, 35.651145 ], [ -89.898916, 35.650904 ], [ -89.890510, 35.652408 ], [ -89.886979, 35.653637 ], [ -89.884932, 35.655107 ], [ -89.882893, 35.657463 ], [ -89.878534, 35.664820 ], [ -89.877158, 35.666136 ], [ -89.872078, 35.668487 ], [ -89.864782, 35.670385 ], [ -89.861277, 35.670064 ], [ -89.858935, 35.669060 ], [ -89.853510, 35.663034 ], [ -89.851176, 35.657432 ], [ -89.850863, 35.650208 ], [ -89.851825, 35.644262 ], [ -89.853890, 35.638261 ], [ -89.856619, 35.634444 ], [ -89.863875, 35.630788 ], [ -89.876548, 35.626653 ], [ -89.894346, 35.615535 ], [ -89.896999, 35.614882 ], [ -89.899789, 35.615061 ], [ -89.906029, 35.616145 ], [ -89.910687, 35.617536 ], [ -89.912172, 35.617055 ], [ -89.919619, 35.612236 ], [ -89.932500, 35.607865 ], [ -89.945405, 35.601611 ], [ -89.951147, 35.597491 ], [ -89.954145, 35.594264 ], [ -89.956749, 35.590511 ], [ -89.957896, 35.587261 ], [ -89.957924, 35.585499 ], [ -89.956690, 35.581426 ], [ -89.954196, 35.576050 ], [ -89.946911, 35.563580 ], [ -89.944754, 35.560308 ], [ -89.941393, 35.556555 ], [ -89.929101, 35.551545 ], [ -89.924145, 35.550561 ], [ -89.917424, 35.550308 ], [ -89.914177, 35.549713 ], [ -89.910789, 35.547515 ], [ -89.909923, 35.544037 ], [ -89.910885, 35.541072 ], [ -89.910787, 35.538718 ], [ -89.908826, 35.538031 ], [ -89.905582, 35.536774 ], [ -89.904392, 35.535701 ], [ -89.903882, 35.534175 ], [ -89.907660, 35.522944 ], [ -89.909022, 35.520548 ], [ -89.911931, 35.517410 ], [ -89.915400, 35.515119 ], [ -89.919331, 35.513870 ], [ -89.923161, 35.514428 ], [ -89.933614, 35.518538 ], [ -89.945026, 35.519388 ], [ -89.948010, 35.520090 ], [ -89.951248, 35.521866 ], [ -89.956347, 35.525594 ], [ -89.957715, 35.527192 ], [ -89.957739, 35.530125 ], [ -89.955780, 35.533214 ], [ -89.955641, 35.534518 ], [ -89.956706, 35.539369 ], [ -89.958498, 35.541703 ], [ -89.976310, 35.553872 ], [ -89.989363, 35.560043 ], [ -89.992975, 35.560774 ], [ -89.998996, 35.561160 ], [ -90.008293, 35.560065 ], [ -90.011262, 35.559105 ], [ -90.017312, 35.555996 ], [ -90.023903, 35.556336 ], [ -90.028620, 35.555249 ], [ -90.032938, 35.553440 ], [ -90.037615, 35.550329 ], [ -90.039744, 35.548041 ], [ -90.041962, 35.537468 ], [ -90.044748, 35.531657 ], [ -90.046227, 35.529592 ], [ -90.049090, 35.522257 ], [ -90.050277, 35.515275 ], [ -90.048519, 35.504357 ], [ -90.045805, 35.496533 ], [ -90.043517, 35.492298 ], [ -90.034976, 35.480705 ], [ -90.020386, 35.470257 ], [ -90.018998, 35.467803 ], [ -90.018842, 35.464816 ], [ -90.022064, 35.457375 ], [ -90.024247, 35.454260 ], [ -90.026604, 35.447788 ], [ -90.026899, 35.444869 ], [ -90.026584, 35.440103 ], [ -90.027370, 35.437890 ], [ -90.029310, 35.435245 ], [ -90.031267, 35.431576 ], [ -90.031584, 35.427662 ], [ -90.040570, 35.422925 ], [ -90.042640, 35.421237 ], [ -90.044216, 35.419231 ], [ -90.045306, 35.415435 ], [ -90.046598, 35.412966 ], [ -90.056644, 35.403786 ], [ -90.045104, 35.397317 ], [ -90.041563, 35.396620 ], [ -90.044856, 35.392964 ], [ -90.054585, 35.389604 ], [ -90.069283, 35.408306 ], [ -90.062018, 35.415180 ], [ -90.070549, 35.423291 ], [ -90.074082, 35.433983 ], [ -90.074063, 35.439611 ], [ -90.071327, 35.450338 ], [ -90.067206, 35.460957 ], [ -90.067138, 35.464833 ], [ -90.067798, 35.466224 ], [ -90.072154, 35.470752 ], [ -90.080128, 35.476844 ], [ -90.085009, 35.478835 ], [ -90.098719, 35.478595 ], [ -90.101759, 35.476889 ], [ -90.107723, 35.476935 ], [ -90.114412, 35.472467 ], [ -90.118390, 35.468791 ], [ -90.120619, 35.465741 ], [ -90.123142, 35.459853 ], [ -90.129448, 35.441931 ], [ -90.169002, 35.421853 ], [ -90.170599, 35.418352 ], [ -90.170700, 35.410065 ], [ -90.179265, 35.385194 ], [ -90.178341, 35.382092 ], [ -90.172388, 35.377681 ], [ -90.166246, 35.374745 ], [ -90.144924, 35.374633 ], [ -90.135510, 35.376668 ], [ -90.143475, 35.387602 ], [ -90.145870, 35.395079 ], [ -90.146191, 35.399468 ], [ -90.145085, 35.403757 ], [ -90.143448, 35.406671 ], [ -90.141660, 35.408563 ], [ -90.137881, 35.411510 ], [ -90.135125, 35.412977 ], [ -90.130475, 35.413745 ], [ -90.116902, 35.411692 ], [ -90.112504, 35.410153 ], [ -90.110543, 35.408595 ], [ -90.106775, 35.403339 ], [ -90.104842, 35.401487 ], [ -90.096650, 35.395257 ], [ -90.093589, 35.393333 ], [ -90.087743, 35.390838 ], [ -90.079930, 35.385272 ], [ -90.077971, 35.384501 ], [ -90.074992, 35.384152 ], [ -90.083824, 35.368798 ], [ -90.087903, 35.363270 ], [ -90.090492, 35.360886 ], [ -90.093492, 35.360486 ], [ -90.096825, 35.357216 ], [ -90.100294, 35.351619 ], [ -90.107312, 35.343143 ], [ -90.108817, 35.342587 ], [ -90.110293, 35.342786 ], [ -90.103862, 35.332405 ], [ -90.106824, 35.324618 ], [ -90.109093, 35.304987 ], [ -90.117219, 35.303384 ], [ -90.121864, 35.304535 ], [ -90.123707, 35.304530 ], [ -90.132393, 35.300488 ], [ -90.139504, 35.298828 ], [ -90.149794, 35.303288 ], [ -90.153394, 35.302588 ], [ -90.158913, 35.300637 ], [ -90.161225, 35.298951 ], [ -90.163812, 35.296115 ], [ -90.165194, 35.293188 ], [ -90.168871, 35.281997 ], [ -90.168794, 35.279088 ], [ -90.166594, 35.274588 ], [ -90.158865, 35.262577 ], [ -90.152094, 35.255989 ], [ -90.140394, 35.252289 ], [ -90.132116, 35.253180 ], [ -90.123593, 35.254989 ], [ -90.116493, 35.255788 ], [ -90.110106, 35.255456 ], [ -90.105093, 35.254288 ], [ -90.099490, 35.251393 ], [ -90.097947, 35.249983 ], [ -90.090892, 35.242189 ], [ -90.086322, 35.235719 ], [ -90.082939, 35.231824 ], [ -90.078750, 35.227806 ], [ -90.076879, 35.224405 ], [ -90.074920, 35.220452 ], [ -90.074155, 35.217070 ], [ -90.074271, 35.211504 ], [ -90.076820, 35.208817 ], [ -90.081173, 35.208153 ], [ -90.084120, 35.210423 ], [ -90.088597, 35.212376 ], [ -90.093285, 35.203282 ], [ -90.096466, 35.194848 ], [ -90.097408, 35.194794 ], [ -90.109076, 35.199105 ], [ -90.116182, 35.198498 ], [ -90.117542, 35.190570 ], [ -90.117393, 35.187890 ], [ -90.114214, 35.181691 ], [ -90.111091, 35.178639 ], [ -90.109177, 35.178451 ], [ -90.108075, 35.174571 ], [ -90.105525, 35.170695 ], [ -90.103216, 35.167980 ], [ -90.099777, 35.164474 ], [ -90.096549, 35.160976 ], [ -90.092944, 35.157228 ], [ -90.090371, 35.156270 ], [ -90.069402, 35.153646 ], [ -90.066958, 35.151839 ], [ -90.066482, 35.151074 ], [ -90.064612, 35.140621 ], [ -90.065392, 35.137691 ], [ -90.066591, 35.135990 ], [ -90.071192, 35.131591 ], [ -90.083420, 35.121670 ], [ -90.086710, 35.119779 ], [ -90.090610, 35.118287 ], [ -90.100593, 35.116691 ], [ -90.109393, 35.118891 ], [ -90.139024, 35.133995 ], [ -90.142794, 35.135091 ], [ -90.144691, 35.134984 ], [ -90.155994, 35.130991 ], [ -90.160058, 35.128830 ], [ -90.165328, 35.125228 ], [ -90.173603, 35.118073 ], [ -90.176843, 35.112088 ], [ -90.181387, 35.091401 ], [ -90.195133, 35.061793 ], [ -90.196583, 35.056137 ], [ -90.197146, 35.050731 ], [ -90.196860, 35.043667 ], [ -90.196095, 35.037400 ], [ -90.200124, 35.032813 ], [ -90.209397, 35.026546 ], [ -90.214382, 35.025795 ], [ -90.216258, 35.026049 ], [ -90.224791, 35.029961 ], [ -90.230611, 35.031320 ], [ -90.256495, 35.034493 ], [ -90.262396, 35.036393 ], [ -90.263396, 35.037493 ], [ -90.263796, 35.039593 ], [ -90.265296, 35.040293 ], [ -90.291996, 35.041793 ], [ -90.295596, 35.040093 ], [ -90.297296, 35.037893 ], [ -90.300697, 35.028793 ], [ -90.306897, 35.018194 ], [ -90.309877, 35.009750 ], [ -90.310298, 35.004295 ], [ -90.309297, 34.995694 ], [ -90.304425, 34.984939 ], [ -90.302471, 34.982077 ], [ -90.296422, 34.976346 ], [ -90.293083, 34.974574 ], [ -90.287239, 34.972531 ], [ -90.282234, 34.967661 ], [ -90.278240, 34.965077 ], [ -90.259663, 34.957793 ], [ -90.253969, 34.954988 ], [ -90.250056, 34.951196 ], [ -90.247832, 34.947916 ], [ -90.246116, 34.944316 ], [ -90.244476, 34.937596 ], [ -90.244725, 34.921031 ], [ -90.246546, 34.914168 ], [ -90.248308, 34.909739 ], [ -90.250095, 34.907320 ], [ -90.279364, 34.890077 ], [ -90.301957, 34.880053 ], [ -90.310005, 34.875097 ], [ -90.313476, 34.871698 ], [ -90.303698, 34.859704 ], [ -90.302523, 34.856471 ], [ -90.302669, 34.854366 ], [ -90.303944, 34.850517 ], [ -90.307384, 34.846195 ], [ -90.311312, 34.844223 ], [ -90.319198, 34.844854 ], [ -90.323067, 34.846391 ], [ -90.332298, 34.852530 ], [ -90.340380, 34.860357 ], [ -90.348218, 34.855113 ], [ -90.352174, 34.853196 ], [ -90.379837, 34.845931 ], [ -90.401633, 34.835305 ], [ -90.410666, 34.832028 ], [ -90.414864, 34.831846 ], [ -90.422355, 34.833675 ], [ -90.423879, 34.834606 ], [ -90.428754, 34.841400 ], [ -90.430828, 34.848982 ], [ -90.431741, 34.855051 ], [ -90.431722, 34.858913 ], [ -90.429115, 34.865087 ], [ -90.428980, 34.867168 ], [ -90.430096, 34.871212 ], [ -90.436561, 34.882731 ], [ -90.438313, 34.884581 ], [ -90.441254, 34.886313 ], [ -90.444806, 34.887994 ], [ -90.453916, 34.891122 ], [ -90.459819, 34.891946 ], [ -90.466154, 34.890989 ], [ -90.475686, 34.886310 ], [ -90.479872, 34.883264 ], [ -90.483969, 34.877176 ], [ -90.484558, 34.875096 ], [ -90.485038, 34.869252 ], [ -90.483876, 34.861333 ], [ -90.481955, 34.857805 ], [ -90.474403, 34.849495 ], [ -90.463795, 34.834923 ], [ -90.456935, 34.823383 ], [ -90.456761, 34.820395 ], [ -90.459024, 34.814440 ], [ -90.465367, 34.810592 ], [ -90.470544, 34.805036 ], [ -90.472280, 34.802465 ], [ -90.473877, 34.798399 ], [ -90.474590, 34.793200 ], [ -90.473527, 34.788835 ], [ -90.470411, 34.780877 ], [ -90.458883, 34.764267 ], [ -90.453038, 34.753352 ], [ -90.451170, 34.747787 ], [ -90.451257, 34.744485 ], [ -90.452479, 34.739898 ], [ -90.454968, 34.735557 ], [ -90.457950, 34.732946 ], [ -90.469897, 34.727030 ], [ -90.479704, 34.724793 ], [ -90.488865, 34.723731 ], [ -90.501667, 34.724236 ], [ -90.514735, 34.729656 ], [ -90.518317, 34.732790 ], [ -90.521004, 34.738612 ], [ -90.521900, 34.743537 ], [ -90.521900, 34.748463 ], [ -90.520556, 34.753388 ], [ -90.516522, 34.758333 ], [ -90.505494, 34.764568 ], [ -90.501325, 34.769931 ], [ -90.500994, 34.771187 ], [ -90.501523, 34.774795 ], [ -90.503679, 34.780136 ], [ -90.512761, 34.796488 ], [ -90.514706, 34.801768 ], [ -90.522892, 34.802265 ], [ -90.531330, 34.800584 ], [ -90.536510, 34.798572 ], [ -90.540222, 34.795768 ], [ -90.544067, 34.791159 ], [ -90.547612, 34.784589 ], [ -90.548170, 34.781890 ], [ -90.547859, 34.779194 ], [ -90.546225, 34.773443 ], [ -90.542631, 34.764396 ], [ -90.542695, 34.752626 ], [ -90.543811, 34.749277 ], [ -90.545820, 34.745929 ], [ -90.547606, 34.744367 ], [ -90.550284, 34.742804 ], [ -90.553186, 34.741912 ], [ -90.556308, 34.741541 ], [ -90.559895, 34.740788 ], [ -90.563544, 34.738671 ], [ -90.565437, 34.736536 ], [ -90.567240, 34.733463 ], [ -90.568172, 34.727384 ], [ -90.568081, 34.724802 ], [ -90.567482, 34.723292 ], [ -90.565646, 34.721053 ], [ -90.546053, 34.702076 ], [ -90.538974, 34.698783 ], [ -90.529211, 34.696819 ], [ -90.522084, 34.696605 ], [ -90.509847, 34.698003 ], [ -90.496552, 34.700578 ], [ -90.486966, 34.701477 ], [ -90.480041, 34.701515 ], [ -90.475194, 34.700826 ], [ -90.471185, 34.699066 ], [ -90.467064, 34.695643 ], [ -90.463734, 34.691093 ], [ -90.462552, 34.687576 ], [ -90.462816, 34.684074 ], [ -90.466041, 34.674312 ], [ -90.469821, 34.669436 ], [ -90.479718, 34.659934 ], [ -90.487890, 34.654881 ], [ -90.496639, 34.648117 ], [ -90.503061, 34.640790 ], [ -90.508100, 34.636682 ], [ -90.517168, 34.630928 ], [ -90.524481, 34.628504 ], [ -90.532188, 34.627487 ], [ -90.537165, 34.627767 ], [ -90.543696, 34.629559 ], [ -90.547614, 34.631656 ], [ -90.551761, 34.636484 ], [ -90.554129, 34.640871 ], [ -90.555104, 34.646236 ], [ -90.553962, 34.655018 ], [ -90.552642, 34.659707 ], [ -90.550158, 34.663445 ], [ -90.539409, 34.670902 ], [ -90.538061, 34.673232 ], [ -90.538856, 34.682463 ], [ -90.540074, 34.684981 ], [ -90.542761, 34.688781 ], [ -90.548071, 34.693169 ], [ -90.549856, 34.695478 ], [ -90.552317, 34.697087 ], [ -90.555627, 34.697946 ], [ -90.563391, 34.695876 ], [ -90.567334, 34.693371 ], [ -90.573106, 34.686425 ], [ -90.578745, 34.683844 ], [ -90.582006, 34.680235 ], [ -90.588419, 34.670963 ], [ -90.588536, 34.668646 ], [ -90.587323, 34.665407 ], [ -90.586336, 34.651689 ], [ -90.585031, 34.647072 ], [ -90.583088, 34.643610 ], [ -90.583020, 34.642679 ], [ -90.588255, 34.626616 ], [ -90.587224, 34.615732 ], [ -90.581693, 34.604227 ], [ -90.574787, 34.595243 ], [ -90.570133, 34.587457 ], [ -90.564866, 34.582602 ], [ -90.557666, 34.576929 ], [ -90.549244, 34.568101 ], [ -90.545891, 34.563257 ], [ -90.540951, 34.550853 ], [ -90.540736, 34.548085 ], [ -90.541282, 34.545331 ], [ -90.543633, 34.540378 ], [ -90.545728, 34.537750 ], [ -90.555276, 34.531012 ], [ -90.569347, 34.524867 ], [ -90.578493, 34.516296 ], [ -90.581062, 34.512818 ], [ -90.583530, 34.504085 ], [ -90.586525, 34.500103 ], [ -90.588942, 34.491097 ], [ -90.589921, 34.484793 ], [ -90.588346, 34.470562 ], [ -90.585477, 34.461247 ], [ -90.583717, 34.458829 ], [ -90.576893, 34.454351 ], [ -90.573959, 34.451875 ], [ -90.567330, 34.440383 ], [ -90.565826, 34.434379 ], [ -90.566505, 34.429528 ], [ -90.568397, 34.424805 ], [ -90.571145, 34.420319 ], [ -90.575336, 34.415152 ], [ -90.580677, 34.410554 ], [ -90.613944, 34.390723 ], [ -90.618480, 34.388767 ], [ -90.631586, 34.387193 ], [ -90.634940, 34.386363 ], [ -90.641398, 34.383869 ], [ -90.658542, 34.375705 ], [ -90.655346, 34.371846 ], [ -90.666788, 34.355820 ], [ -90.666862, 34.348569 ], [ -90.660404, 34.335760 ], [ -90.657371, 34.327287 ], [ -90.657488, 34.322231 ], [ -90.661395, 34.315398 ], [ -90.669343, 34.313020 ], [ -90.678097, 34.313031 ], [ -90.686003, 34.315771 ], [ -90.690005, 34.318584 ], [ -90.693129, 34.322570 ], [ -90.693686, 34.329680 ], [ -90.691551, 34.338618 ], [ -90.681620, 34.352910 ], [ -90.680512, 34.362529 ], [ -90.681921, 34.365998 ], [ -90.683222, 34.368817 ], [ -90.690497, 34.368606 ], [ -90.700147, 34.365855 ], [ -90.712088, 34.363805 ], [ -90.724909, 34.363659 ], [ -90.729131, 34.364206 ], [ -90.741616, 34.367225 ], [ -90.750107, 34.367919 ], [ -90.756197, 34.367256 ], [ -90.762085, 34.364754 ], [ -90.765764, 34.362109 ], [ -90.767061, 34.360271 ], [ -90.768445, 34.353469 ], [ -90.767732, 34.346872 ], [ -90.767108, 34.345264 ], [ -90.765174, 34.342818 ], [ -90.748942, 34.331045 ], [ -90.744713, 34.324872 ], [ -90.742694, 34.320263 ], [ -90.740610, 34.313469 ], [ -90.740889, 34.306538 ], [ -90.743082, 34.302257 ], [ -90.752681, 34.289266 ], [ -90.755271, 34.286848 ], [ -90.765165, 34.280524 ], [ -90.772266, 34.279943 ], [ -90.797569, 34.282402 ], [ -90.802928, 34.282465 ], [ -90.812829, 34.279438 ], [ -90.820919, 34.277840 ], [ -90.824478, 34.276240 ], [ -90.828267, 34.273650 ], [ -90.830612, 34.271245 ], [ -90.832407, 34.267491 ], [ -90.836972, 34.250104 ], [ -90.839981, 34.236114 ], [ -90.840128, 34.230104 ], [ -90.839509, 34.226201 ], [ -90.840009, 34.223077 ], [ -90.842151, 34.216880 ], [ -90.844824, 34.210999 ], [ -90.847808, 34.206530 ], [ -90.852764, 34.209403 ], [ -90.856708, 34.211598 ], [ -90.867064, 34.212141 ], [ -90.879120, 34.215450 ], [ -90.894560, 34.224380 ], [ -90.898286, 34.227253 ], [ -90.900078, 34.229621 ], [ -90.904279, 34.240960 ], [ -90.905934, 34.243529 ], [ -90.907082, 34.244492 ], [ -90.912396, 34.245932 ], [ -90.923152, 34.246530 ], [ -90.929015, 34.244541 ], [ -90.933511, 34.240218 ], [ -90.936404, 34.236698 ], [ -90.937152, 34.234110 ], [ -90.936988, 34.227041 ], [ -90.935220, 34.219050 ], [ -90.932680, 34.214824 ], [ -90.916048, 34.196916 ], [ -90.911800, 34.193897 ], [ -90.891871, 34.184766 ], [ -90.887884, 34.181980 ], [ -90.882701, 34.184364 ], [ -90.877475, 34.185633 ], [ -90.873830, 34.183220 ], [ -90.869651, 34.182965 ], [ -90.864566, 34.183882 ], [ -90.859087, 34.186288 ], [ -90.855600, 34.186880 ], [ -90.847108, 34.186053 ], [ -90.838205, 34.183804 ], [ -90.828388, 34.184784 ], [ -90.816572, 34.183023 ], [ -90.812374, 34.180767 ], [ -90.810016, 34.178437 ], [ -90.808685, 34.175878 ], [ -90.807164, 34.167460 ], [ -90.807813, 34.161474 ], [ -90.810884, 34.155903 ], [ -90.815878, 34.149879 ], [ -90.822593, 34.144054 ], [ -90.825708, 34.142011 ], [ -90.830285, 34.139813 ], [ -90.836099, 34.137876 ], [ -90.847168, 34.136884 ], [ -90.853471, 34.137511 ], [ -90.864580, 34.140555 ], [ -90.867880, 34.142146 ], [ -90.876836, 34.148130 ], [ -90.883073, 34.151502 ], [ -90.894385, 34.160953 ], [ -90.903577, 34.164332 ], [ -90.910010, 34.165508 ], [ -90.938064, 34.148754 ], [ -90.954300, 34.138498 ], [ -90.959317, 34.130350 ], [ -90.958467, 34.125105 ], [ -90.955974, 34.120125 ], [ -90.948514, 34.111269 ], [ -90.946323, 34.109374 ], [ -90.921273, 34.093958 ], [ -90.918395, 34.093054 ], [ -90.914066, 34.092756 ], [ -90.901130, 34.094667 ], [ -90.893526, 34.097795 ], [ -90.888085, 34.097810 ], [ -90.882628, 34.096615 ], [ -90.878912, 34.094573 ], [ -90.876606, 34.092911 ], [ -90.871923, 34.086652 ], [ -90.870461, 34.082739 ], [ -90.870528, 34.080516 ], [ -90.871940, 34.076362 ], [ -90.874541, 34.072041 ], [ -90.882115, 34.063903 ], [ -90.886351, 34.058564 ], [ -90.887837, 34.055403 ], [ -90.888627, 34.052419 ], [ -90.889058, 34.046362 ], [ -90.887394, 34.039845 ], [ -90.886991, 34.035094 ], [ -90.887413, 34.032505 ], [ -90.888956, 34.029788 ], [ -90.892420, 34.026860 ], [ -90.899467, 34.023796 ], [ -90.914642, 34.021885 ], [ -90.922017, 34.023216 ], [ -90.923745, 34.023143 ], [ -90.934896, 34.019262 ], [ -90.942662, 34.018050 ], [ -90.950311, 34.017822 ], [ -90.958456, 34.020254 ], [ -90.970726, 34.021620 ], [ -90.976918, 34.021335 ], [ -90.982742, 34.020469 ], [ -90.987948, 34.019038 ], [ -90.979945, 34.000106 ], [ -90.977489, 33.996554 ], [ -90.970947, 33.991885 ], [ -90.961548, 33.979945 ], [ -90.961222, 33.976151 ], [ -90.963720, 33.967688 ], [ -90.965187, 33.965461 ], [ -90.967632, 33.963324 ], [ -90.970856, 33.961868 ], [ -90.976864, 33.960503 ], [ -90.983359, 33.960186 ], [ -90.987653, 33.960793 ], [ -90.994856, 33.963118 ], [ -91.000108, 33.966428 ], [ -91.002986, 33.970902 ], [ -91.004981, 33.977011 ], [ -91.013610, 33.994495 ], [ -91.018890, 34.003151 ], [ -91.033765, 33.995323 ], [ -91.039589, 33.989297 ], [ -91.042751, 33.986811 ], [ -91.048367, 33.985078 ], [ -91.062264, 33.985083 ], [ -91.071203, 33.984473 ], [ -91.075378, 33.983586 ], [ -91.079254, 33.982101 ], [ -91.083187, 33.979865 ], [ -91.087921, 33.975335 ], [ -91.089119, 33.972653 ], [ -91.089756, 33.969721 ], [ -91.089787, 33.966004 ], [ -91.088696, 33.961334 ], [ -91.086758, 33.958270 ], [ -91.084095, 33.956179 ], [ -91.078496, 33.954060 ], [ -91.046725, 33.947406 ], [ -91.035961, 33.943758 ], [ -91.020097, 33.937127 ], [ -91.012994, 33.932276 ], [ -91.010318, 33.929352 ], [ -91.010040, 33.927003 ], [ -91.010831, 33.925552 ], [ -91.017481, 33.919083 ], [ -91.026382, 33.907980 ], [ -91.036674, 33.898531 ], [ -91.055309, 33.883035 ], [ -91.061247, 33.877505 ], [ -91.070883, 33.866714 ], [ -91.072798, 33.862396 ], [ -91.073011, 33.857449 ], [ -91.071195, 33.849539 ], [ -91.067511, 33.840443 ], [ -91.064977, 33.837126 ], [ -91.056692, 33.828935 ], [ -91.052819, 33.824181 ], [ -91.049679, 33.818729 ], [ -91.046849, 33.815365 ], [ -91.042448, 33.812855 ], [ -91.025173, 33.805953 ], [ -91.020098, 33.804447 ], [ -91.007767, 33.802591 ], [ -91.000107, 33.799549 ], [ -90.991747, 33.792597 ], [ -90.989299, 33.788016 ], [ -90.988466, 33.784530 ], [ -90.989444, 33.780576 ], [ -90.991220, 33.776791 ], [ -90.993842, 33.773601 ], [ -91.000106, 33.769165 ], [ -91.012770, 33.764675 ], [ -91.023285, 33.762991 ], [ -91.026782, 33.763642 ], [ -91.053886, 33.778701 ], [ -91.060524, 33.777640 ], [ -91.085510, 33.776410 ], [ -91.088996, 33.775801 ], [ -91.107318, 33.770619 ], [ -91.111494, 33.774568 ], [ -91.117836, 33.779026 ], [ -91.123466, 33.782106 ], [ -91.128222, 33.783447 ], [ -91.132185, 33.783420 ], [ -91.133854, 33.782814 ], [ -91.137351, 33.779923 ], [ -91.139869, 33.777117 ], [ -91.142010, 33.773820 ], [ -91.145112, 33.767340 ], [ -91.144812, 33.763996 ], [ -91.143634, 33.762095 ], [ -91.141304, 33.760835 ], [ -91.140756, 33.759735 ], [ -91.141553, 33.755957 ], [ -91.144571, 33.751607 ], [ -91.144539, 33.749338 ], [ -91.143287, 33.747141 ], [ -91.146523, 33.736503 ], [ -91.146618, 33.732456 ], [ -91.145792, 33.728924 ], [ -91.144732, 33.726803 ], [ -91.132338, 33.714246 ], [ -91.125527, 33.708780 ], [ -91.117733, 33.705342 ], [ -91.107646, 33.704679 ], [ -91.101101, 33.705007 ], [ -91.089873, 33.707364 ], [ -91.075389, 33.714403 ], [ -91.068290, 33.716477 ], [ -91.063752, 33.715892 ], [ -91.059891, 33.714816 ], [ -91.055562, 33.712486 ], [ -91.046778, 33.706313 ], [ -91.041261, 33.699933 ], [ -91.039025, 33.696595 ], [ -91.037150, 33.692907 ], [ -91.036120, 33.689113 ], [ -91.033366, 33.688773 ], [ -91.030402, 33.687766 ], [ -91.030332, 33.681622 ], [ -91.031460, 33.678142 ], [ -91.034565, 33.673018 ], [ -91.036840, 33.671316 ], [ -91.046412, 33.668272 ], [ -91.050523, 33.668064 ], [ -91.059182, 33.666400 ], [ -91.067110, 33.662689 ], [ -91.078507, 33.658283 ], [ -91.084126, 33.657322 ], [ -91.088202, 33.657387 ], [ -91.094040, 33.658351 ], [ -91.100980, 33.660551 ], [ -91.130450, 33.674522 ], [ -91.133416, 33.676790 ], [ -91.144188, 33.689596 ], [ -91.160866, 33.707096 ], [ -91.162464, 33.706840 ], [ -91.165846, 33.705133 ], [ -91.175730, 33.703116 ], [ -91.190113, 33.701860 ], [ -91.200712, 33.701535 ], [ -91.205377, 33.700819 ], [ -91.212077, 33.698249 ], [ -91.220570, 33.692923 ], [ -91.225279, 33.687749 ], [ -91.227857, 33.683073 ], [ -91.229015, 33.677543 ], [ -91.228228, 33.671326 ], [ -91.226537, 33.668665 ], [ -91.223001, 33.664794 ], [ -91.219048, 33.661503 ], [ -91.211284, 33.658526 ], [ -91.185455, 33.653604 ], [ -91.178311, 33.651109 ], [ -91.171168, 33.647766 ], [ -91.164212, 33.643278 ], [ -91.150499, 33.633013 ], [ -91.139209, 33.625658 ], [ -91.134389, 33.619512 ], [ -91.130902, 33.610919 ], [ -91.130445, 33.606034 ], [ -91.131588, 33.599450 ], [ -91.132450, 33.596989 ], [ -91.134043, 33.594489 ], [ -91.138418, 33.590896 ], [ -91.152148, 33.582721 ], [ -91.157429, 33.581372 ], [ -91.160755, 33.581352 ], [ -91.175979, 33.582968 ], [ -91.178220, 33.582607 ], [ -91.181068, 33.581520 ], [ -91.188942, 33.576225 ], [ -91.198285, 33.572061 ], [ -91.203151, 33.570758 ], [ -91.221466, 33.568166 ], [ -91.224121, 33.567369 ], [ -91.228489, 33.564667 ], [ -91.231418, 33.560593 ], [ -91.232537, 33.557454 ], [ -91.232295, 33.552788 ], [ -91.229834, 33.547047 ], [ -91.226325, 33.541200 ], [ -91.219297, 33.532364 ], [ -91.215671, 33.529423 ], [ -91.187367, 33.510552 ], [ -91.184612, 33.507364 ], [ -91.182901, 33.502379 ], [ -91.183070, 33.498613 ], [ -91.185637, 33.496399 ], [ -91.189375, 33.493005 ], [ -91.195634, 33.488468 ], [ -91.199593, 33.483125 ], [ -91.205661, 33.473553 ], [ -91.206753, 33.470308 ], [ -91.208535, 33.468606 ], [ -91.215508, 33.464780 ], [ -91.220192, 33.463045 ], [ -91.223338, 33.462764 ], [ -91.231661, 33.457100 ], [ -91.232587, 33.453958 ], [ -91.233422, 33.444038 ], [ -91.234310, 33.442300 ], [ -91.235928, 33.440611 ], [ -91.235181, 33.438972 ], [ -91.217374, 33.434699 ], [ -91.210275, 33.433796 ], [ -91.206807, 33.433846 ], [ -91.194658, 33.436358 ], [ -91.186979, 33.438592 ], [ -91.181787, 33.440780 ], [ -91.177293, 33.443638 ], [ -91.169360, 33.452629 ], [ -91.171799, 33.462342 ], [ -91.175635, 33.471761 ], [ -91.176984, 33.478899 ], [ -91.177148, 33.486170 ], [ -91.175488, 33.490770 ], [ -91.172213, 33.496691 ], [ -91.167403, 33.498304 ], [ -91.164019, 33.497448 ], [ -91.160142, 33.494829 ], [ -91.157319, 33.492923 ], [ -91.136656, 33.481323 ], [ -91.125109, 33.472842 ], [ -91.119667, 33.460230 ], [ -91.117975, 33.453807 ], [ -91.118495, 33.449116 ], [ -91.121100, 33.443563 ], [ -91.128589, 33.436284 ], [ -91.130552, 33.433263 ], [ -91.130561, 33.431900 ], [ -91.131885, 33.430063 ], [ -91.139150, 33.426955 ], [ -91.144877, 33.427706 ], [ -91.147663, 33.427172 ], [ -91.163387, 33.422157 ], [ -91.176280, 33.416979 ], [ -91.179368, 33.417151 ], [ -91.184427, 33.419576 ], [ -91.191973, 33.417728 ], [ -91.199354, 33.418321 ], [ -91.202580, 33.416832 ], [ -91.205272, 33.414231 ], [ -91.208702, 33.408719 ], [ -91.209220, 33.406290 ], [ -91.209032, 33.403633 ], [ -91.208113, 33.402007 ], [ -91.204758, 33.398823 ], [ -91.191127, 33.389634 ], [ -91.176942, 33.382841 ], [ -91.171968, 33.381030 ], [ -91.166304, 33.379709 ], [ -91.154017, 33.378914 ], [ -91.140938, 33.380477 ], [ -91.123623, 33.387526 ], [ -91.113764, 33.393124 ], [ -91.107170, 33.399078 ], [ -91.099277, 33.408244 ], [ -91.095211, 33.417488 ], [ -91.095335, 33.425684 ], [ -91.097474, 33.431733 ], [ -91.097531, 33.433725 ], [ -91.096723, 33.437603 ], [ -91.094279, 33.442671 ], [ -91.091566, 33.446319 ], [ -91.086498, 33.451576 ], [ -91.081834, 33.454188 ], [ -91.077814, 33.455648 ], [ -91.074555, 33.455811 ], [ -91.067623, 33.455104 ], [ -91.064701, 33.453775 ], [ -91.059828, 33.450257 ], [ -91.057621, 33.445341 ], [ -91.058152, 33.428705 ], [ -91.062281, 33.421238 ], [ -91.075293, 33.405966 ], [ -91.090852, 33.395781 ], [ -91.101456, 33.387190 ], [ -91.106758, 33.381141 ], [ -91.120409, 33.363809 ], [ -91.125108, 33.360099 ], [ -91.140192, 33.351452 ], [ -91.141793, 33.350076 ], [ -91.142219, 33.348989 ], [ -91.140968, 33.336493 ], [ -91.141893, 33.332963 ], [ -91.143353, 33.330520 ], [ -91.143667, 33.328398 ], [ -91.141475, 33.314318 ], [ -91.141615, 33.299539 ], [ -91.140057, 33.296618 ], [ -91.125539, 33.280255 ], [ -91.125528, 33.274732 ], [ -91.128078, 33.268502 ], [ -91.118208, 33.262071 ], [ -91.117223, 33.260685 ], [ -91.114325, 33.252953 ], [ -91.110561, 33.245930 ], [ -91.106142, 33.241799 ], [ -91.100100, 33.238125 ], [ -91.099093, 33.238173 ], [ -91.096931, 33.241628 ], [ -91.094748, 33.250499 ], [ -91.091489, 33.254838 ], [ -91.090342, 33.257325 ], [ -91.086137, 33.273652 ], [ -91.083694, 33.278557 ], [ -91.081244, 33.281250 ], [ -91.078530, 33.283306 ], [ -91.072567, 33.285885 ], [ -91.067035, 33.287180 ], [ -91.058730, 33.286901 ], [ -91.052369, 33.285415 ], [ -91.048150, 33.282796 ], [ -91.045141, 33.279015 ], [ -91.043624, 33.274636 ], [ -91.043985, 33.269835 ], [ -91.045191, 33.265404 ], [ -91.047648, 33.259989 ], [ -91.050407, 33.251202 ], [ -91.054126, 33.246105 ], [ -91.063912, 33.237356 ], [ -91.065629, 33.232982 ], [ -91.068708, 33.232936 ], [ -91.071079, 33.230096 ], [ -91.070697, 33.227302 ], [ -91.074103, 33.226821 ], [ -91.077673, 33.227485 ], [ -91.079227, 33.226500 ], [ -91.079227, 33.223889 ], [ -91.079635, 33.223225 ], [ -91.082878, 33.221621 ], [ -91.085984, 33.221644 ], [ -91.091711, 33.220813 ], [ -91.089909, 33.210194 ], [ -91.086963, 33.198509 ], [ -91.084366, 33.180856 ], [ -91.084889, 33.161800 ], [ -91.085562, 33.155822 ], [ -91.087589, 33.145177 ], [ -91.089862, 33.139655 ], [ -91.093201, 33.136726 ], [ -91.104317, 33.131598 ], [ -91.114087, 33.129834 ], [ -91.131659, 33.129101 ], [ -91.143334, 33.129785 ], [ -91.150362, 33.130695 ], [ -91.151853, 33.131802 ], [ -91.153015, 33.135093 ], [ -91.160298, 33.141216 ], [ -91.161651, 33.141781 ], [ -91.169406, 33.142639 ], [ -91.183662, 33.141691 ], [ -91.188718, 33.139811 ], [ -91.193174, 33.136734 ], [ -91.195296, 33.134731 ], [ -91.201780, 33.125121 ], [ -91.202089, 33.121249 ], [ -91.201462, 33.109638 ], [ -91.201125, 33.108185 ], [ -91.200167, 33.106930 ], [ -91.195953, 33.104561 ], [ -91.180836, 33.098364 ], [ -91.174723, 33.091640 ], [ -91.173546, 33.089318 ], [ -91.171514, 33.087818 ], [ -91.165918, 33.086174 ], [ -91.160656, 33.085596 ], [ -91.149823, 33.081603 ], [ -91.124639, 33.064127 ], [ -91.121195, 33.059166 ], [ -91.120293, 33.055921 ], [ -91.120379, 33.054530 ], [ -91.123441, 33.046577 ], [ -91.125656, 33.038276 ], [ -91.129088, 33.033554 ], [ -91.137439, 33.028736 ], [ -91.142424, 33.027231 ], [ -91.149758, 33.026312 ], [ -91.156160, 33.023580 ], [ -91.162363, 33.019684 ], [ -91.166282, 33.011331 ], [ -91.166073, 33.004106 ], [ -91.265018, 33.005084 ], [ -91.284398, 33.005007 ], [ -91.312016, 33.005262 ], [ -91.322506, 33.005341 ], [ -91.325037, 33.005364 ], [ -91.326396, 33.005376 ], [ -91.329767, 33.005421 ], [ -91.333011, 33.005529 ], [ -91.376016, 33.005794 ], [ -91.425466, 33.006016 ], [ -91.435782, 33.006099 ], [ -91.453369, 33.005843 ], [ -91.489176, 33.006182 ], [ -91.500118, 33.006784 ], [ -91.559494, 33.006840 ], [ -91.572326, 33.006908 ], [ -91.579639, 33.006472 ], [ -91.579802, 33.006518 ], [ -91.609001, 33.006556 ], [ -91.617615, 33.006717 ], [ -91.626670, 33.006639 ], [ -91.735531, 33.007569 ], [ -91.755068, 33.007010 ], [ -91.875128, 33.007728 ], [ -91.950001, 33.007520 ], [ -91.951958, 33.007428 ], [ -92.069105, 33.008163 ], [ -92.222825, 33.009080 ], [ -92.292664, 33.010103 ], [ -92.335893, 33.010349 ], [ -92.362865, 33.010628 ], [ -92.370290, 33.010717 ], [ -92.469762, 33.012010 ], [ -92.501383, 33.012160 ], [ -92.503776, 33.012161 ], [ -92.711289, 33.014307 ], [ -92.715884, 33.014398 ], [ -92.723553, 33.014328 ], [ -92.724994, 33.014351 ], [ -92.733197, 33.014347 ], [ -92.796533, 33.014836 ], [ -92.830798, 33.015661 ], [ -92.844073, 33.016034 ], [ -92.844286, 33.016070 ], [ -92.854167, 33.016132 ], [ -92.867510, 33.016062 ], [ -92.946553, 33.016807 ], [ -92.971137, 33.017192 ], [ -93.070686, 33.017792 ], [ -93.073167, 33.017898 ], [ -93.081428, 33.017928 ], [ -93.100981, 33.017786 ], [ -93.101443, 33.017740 ], [ -93.154351, 33.017856 ], [ -93.197402, 33.017951 ], [ -93.215653, 33.018393 ], [ -93.238607, 33.017992 ], [ -93.308181, 33.018156 ], [ -93.308398, 33.018179 ], [ -93.340353, 33.018337 ], [ -93.377134, 33.018234 ], [ -93.467042, 33.018611 ], [ -93.489506, 33.018443 ], [ -93.490893, 33.018442 ], [ -93.520971, 33.018616 ], [ -93.524916, 33.018637 ], [ -93.531499, 33.018643 ], [ -93.723273, 33.019457 ], [ -93.814553, 33.019372 ], [ -94.024475, 33.019207 ], [ -94.027983, 33.019139 ], [ -94.035839, 33.019145 ], [ -94.041444, 33.019188 ], [ -94.042964, 33.019219 ], [ -94.043036, 33.079485 ], [ -94.042870, 33.092727 ], [ -94.043007, 33.133890 ], [ -94.043077, 33.138162 ], [ -94.043185, 33.143476 ], [ -94.042719, 33.160291 ], [ -94.042875, 33.199785 ], [ -94.042892, 33.202666 ], [ -94.042876, 33.215219 ], [ -94.042730, 33.241823 ], [ -94.043004, 33.250128 ], [ -94.043050, 33.260904 ], [ -94.042990, 33.271227 ], [ -94.043067, 33.330498 ], [ -94.043067, 33.347351 ], [ -94.043067, 33.352097 ], [ -94.043128, 33.358757 ], [ -94.042869, 33.371170 ], [ -94.043053, 33.377716 ], [ -94.042887, 33.420225 ], [ -94.042988, 33.431024 ], [ -94.042988, 33.435824 ], [ -94.043188, 33.470324 ], [ -94.043279, 33.491030 ], [ -94.043009, 33.493039 ], [ -94.043375, 33.542315 ], [ -94.043428, 33.551425 ], [ -94.043450, 33.552253 ], [ -94.046040, 33.551321 ], [ -94.050212, 33.551083 ], [ -94.051882, 33.552585 ], [ -94.056096, 33.550726 ], [ -94.061896, 33.549764 ], [ -94.065480, 33.550909 ], [ -94.069092, 33.553406 ], [ -94.072156, 33.553864 ], [ -94.073826, 33.555834 ], [ -94.073744, 33.558285 ], [ -94.071720, 33.559682 ], [ -94.067985, 33.560961 ], [ -94.066685, 33.560954 ], [ -94.061180, 33.559159 ], [ -94.059850, 33.559249 ], [ -94.056442, 33.560998 ], [ -94.055663, 33.561887 ], [ -94.056096, 33.567252 ], [ -94.056598, 33.567825 ], [ -94.061283, 33.568805 ], [ -94.066846, 33.568909 ], [ -94.067801, 33.570131 ], [ -94.068280, 33.571967 ], [ -94.068559, 33.573563 ], [ -94.069517, 33.574162 ], [ -94.070395, 33.574561 ], [ -94.071353, 33.574840 ], [ -94.071713, 33.574601 ], [ -94.072032, 33.574162 ], [ -94.072032, 33.573523 ], [ -94.072231, 33.572605 ], [ -94.072670, 33.572234 ], [ -94.082641, 33.575492 ], [ -94.088943, 33.575322 ], [ -94.097440, 33.573719 ], [ -94.100107, 33.572568 ], [ -94.103176, 33.570350 ], [ -94.112843, 33.566991 ], [ -94.119902, 33.566999 ], [ -94.120355, 33.565500 ], [ -94.120719, 33.560555 ], [ -94.122879, 33.553112 ], [ -94.123898, 33.552100 ], [ -94.126898, 33.550647 ], [ -94.128658, 33.550952 ], [ -94.131382, 33.552934 ], [ -94.133048, 33.557953 ], [ -94.134308, 33.569209 ], [ -94.135142, 33.571033 ], [ -94.136046, 33.571388 ], [ -94.136864, 33.571000 ], [ -94.143402, 33.565505 ], [ -94.145239, 33.564987 ], [ -94.148520, 33.565678 ], [ -94.151456, 33.568387 ], [ -94.151755, 33.569476 ], [ -94.151257, 33.571793 ], [ -94.149506, 33.573602 ], [ -94.145669, 33.575600 ], [ -94.143024, 33.577725 ], [ -94.141852, 33.579590 ], [ -94.142160, 33.581390 ], [ -94.144383, 33.582098 ], [ -94.146048, 33.581975 ], [ -94.148732, 33.580197 ], [ -94.152626, 33.575923 ], [ -94.156782, 33.575749 ], [ -94.161277, 33.579271 ], [ -94.162010, 33.580877 ], [ -94.161082, 33.587972 ], [ -94.162266, 33.588906 ], [ -94.176327, 33.591077 ], [ -94.180880, 33.592612 ], [ -94.183913, 33.594682 ], [ -94.190891, 33.587474 ], [ -94.194465, 33.582886 ], [ -94.196536, 33.581719 ], [ -94.199752, 33.581098 ], [ -94.203588, 33.580816 ], [ -94.205788, 33.581380 ], [ -94.210967, 33.583143 ], [ -94.212997, 33.583487 ], [ -94.214431, 33.583187 ], [ -94.217198, 33.580737 ], [ -94.217408, 33.579260 ], [ -94.216141, 33.576392 ], [ -94.211329, 33.573774 ], [ -94.209665, 33.573510 ], [ -94.207405, 33.574353 ], [ -94.204265, 33.575005 ], [ -94.201106, 33.575851 ], [ -94.196367, 33.574780 ], [ -94.194399, 33.573678 ], [ -94.192483, 33.570425 ], [ -94.189884, 33.562454 ], [ -94.191333, 33.557666 ], [ -94.193248, 33.556154 ], [ -94.196395, 33.555123 ], [ -94.197817, 33.555238 ], [ -94.199486, 33.556085 ], [ -94.201237, 33.557826 ], [ -94.203594, 33.566546 ], [ -94.205634, 33.567229 ], [ -94.208078, 33.566911 ], [ -94.213604, 33.563134 ], [ -94.219221, 33.556096 ], [ -94.222921, 33.554088 ], [ -94.226392, 33.552912 ], [ -94.231844, 33.552088 ], [ -94.237904, 33.552675 ], [ -94.250197, 33.556765 ], [ -94.251569, 33.558188 ], [ -94.252283, 33.560445 ], [ -94.252331, 33.561855 ], [ -94.251108, 33.565280 ], [ -94.244366, 33.573549 ], [ -94.238868, 33.576722 ], [ -94.237975, 33.577757 ], [ -94.236836, 33.580914 ], [ -94.236363, 33.585992 ], [ -94.236972, 33.587411 ], [ -94.240179, 33.589536 ], [ -94.242777, 33.589709 ], [ -94.245932, 33.589114 ], [ -94.252656, 33.586144 ], [ -94.257801, 33.582508 ], [ -94.262755, 33.577354 ], [ -94.265669, 33.573589 ], [ -94.270853, 33.564783 ], [ -94.270979, 33.563221 ], [ -94.271998, 33.561518 ], [ -94.274473, 33.558652 ], [ -94.275601, 33.557964 ], [ -94.279090, 33.557026 ], [ -94.287572, 33.557178 ], [ -94.289440, 33.557635 ], [ -94.290901, 33.558872 ], [ -94.291687, 33.563481 ], [ -94.290372, 33.567905 ], [ -94.282172, 33.572989 ], [ -94.280605, 33.574908 ], [ -94.280849, 33.577187 ], [ -94.282648, 33.580978 ], [ -94.283582, 33.581891 ], [ -94.287025, 33.582410 ], [ -94.289129, 33.582144 ], [ -94.293258, 33.580419 ], [ -94.298392, 33.576218 ], [ -94.301023, 33.573022 ], [ -94.303577, 33.568280 ], [ -94.307181, 33.559797 ], [ -94.306215, 33.557676 ], [ -94.306410, 33.555616 ], [ -94.309582, 33.551673 ], [ -94.319492, 33.548864 ], [ -94.323660, 33.549835 ], [ -94.330590, 33.552692 ], [ -94.331833, 33.553348 ], [ -94.333203, 33.555366 ], [ -94.333895, 33.557461 ], [ -94.334380, 33.562536 ], [ -94.334940, 33.563592 ], [ -94.338422, 33.567082 ], [ -94.340577, 33.567878 ], [ -94.344023, 33.567824 ], [ -94.345513, 33.567313 ], [ -94.352433, 33.562172 ], [ -94.352653, 33.560611 ], [ -94.347290, 33.552197 ], [ -94.347383, 33.551078 ], [ -94.348945, 33.548359 ], [ -94.355945, 33.543180 ], [ -94.358970, 33.543230 ], [ -94.361351, 33.544613 ], [ -94.363297, 33.544957 ], [ -94.371598, 33.545001 ], [ -94.373393, 33.544471 ], [ -94.381667, 33.544035 ], [ -94.386086, 33.544923 ], [ -94.389515, 33.546778 ], [ -94.392573, 33.551142 ], [ -94.397957, 33.554390 ], [ -94.399144, 33.555498 ], [ -94.399393, 33.557077 ], [ -94.399227, 33.559903 ], [ -94.397398, 33.562314 ], [ -94.394656, 33.564059 ], [ -94.392357, 33.565287 ], [ -94.388052, 33.565511 ], [ -94.382534, 33.567057 ], [ -94.380091, 33.568943 ], [ -94.378561, 33.571329 ], [ -94.377760, 33.574609 ], [ -94.378076, 33.577019 ], [ -94.379649, 33.580607 ], [ -94.382887, 33.583268 ], [ -94.385927, 33.581888 ], [ -94.397342, 33.571608 ], [ -94.403342, 33.568424 ], [ -94.408901, 33.568197 ], [ -94.412175, 33.568691 ], [ -94.413155, 33.569368 ], [ -94.425982, 33.586425 ], [ -94.427578, 33.589319 ], [ -94.430039, 33.591124 ], [ -94.439518, 33.594154 ], [ -94.441537, 33.591502 ], [ -94.442364, 33.591243 ], [ -94.449112, 33.590894 ], [ -94.451622, 33.591361 ], [ -94.453996, 33.592223 ], [ -94.458232, 33.598270 ], [ -94.468086, 33.599436 ], [ -94.471152, 33.601588 ], [ -94.471974, 33.602665 ], [ -94.472166, 33.604199 ], [ -94.469451, 33.607316 ], [ -94.462336, 33.610567 ], [ -94.454769, 33.615156 ], [ -94.452961, 33.616986 ], [ -94.452325, 33.618817 ], [ -94.452711, 33.622621 ], [ -94.455255, 33.622917 ], [ -94.460286, 33.624421 ], [ -94.461129, 33.625415 ], [ -94.462736, 33.630910 ], [ -94.458817, 33.632444 ], [ -94.448451, 33.634497 ], [ -94.447514, 33.636255 ], [ -94.446871, 33.640178 ], [ -94.448637, 33.642766 ], [ -94.454820, 33.644903 ], [ -94.459198, 33.645146 ], [ -94.461453, 33.643616 ], [ -94.464186, 33.637655 ], [ -94.466075, 33.636262 ], [ -94.476415, 33.638947 ], [ -94.481313, 33.638819 ], [ -94.485875, 33.637867 ], [ -94.485577, 33.653310 ], [ -94.485528, 33.663388 ], [ -94.484520, 33.687909 ], [ -94.484616, 33.691592 ], [ -94.483840, 33.711332 ], [ -94.483874, 33.716733 ], [ -94.482870, 33.750564 ], [ -94.482862, 33.750780 ], [ -94.482777, 33.753638 ], [ -94.482682, 33.756286 ], [ -94.481842, 33.789008 ], [ -94.481543, 33.795719 ], [ -94.481361, 33.802649 ], [ -94.481355, 33.802887 ], [ -94.480574, 33.830166 ], [ -94.479954, 33.851330 ], [ -94.478994, 33.881197 ], [ -94.478842, 33.881485 ], [ -94.477387, 33.937759 ], [ -94.477038, 33.953838 ], [ -94.476957, 33.957365 ], [ -94.474895, 34.019655 ], [ -94.474896, 34.021838 ], [ -94.474896, 34.021877 ], [ -94.465847, 34.352073 ], [ -94.465425, 34.359548 ], [ -94.464176, 34.402713 ], [ -94.463816, 34.414465 ], [ -94.463671, 34.419585 ], [ -94.461149, 34.507457 ], [ -94.460058, 34.545264 ], [ -94.460052, 34.547869 ], [ -94.457500, 34.634945 ], [ -94.457530, 34.642961 ], [ -94.450233, 34.855413 ], [ -94.450140, 34.858694 ], [ -94.450065, 34.861335 ], [ -94.449630, 34.875253 ], [ -94.449058, 34.890556 ], [ -94.449086, 34.894152 ], [ -94.449253, 34.895869 ], [ -94.441232, 35.119724 ], [ -94.440754, 35.128806 ], [ -94.439550, 35.169037 ], [ -94.439509, 35.171807 ], [ -94.438860, 35.187183 ], [ -94.439056, 35.193588 ], [ -94.439084, 35.197298 ], [ -94.438470, 35.208587 ], [ -94.438247, 35.210992 ], [ -94.437578, 35.230936 ], [ -94.437774, 35.239271 ], [ -94.437578, 35.242202 ], [ -94.436595, 35.250094 ], [ -94.435812, 35.271300 ], [ -94.435706, 35.274267 ], [ -94.435316, 35.275893 ], [ -94.435280, 35.287485 ], [ -94.435170, 35.291494 ], [ -94.434115, 35.306493 ], [ -94.431815, 35.362891 ], [ -94.432015, 35.367391 ], [ -94.431515, 35.369591 ], [ -94.433415, 35.376291 ], [ -94.432685, 35.380806 ], [ -94.433915, 35.387391 ], [ -94.431215, 35.394290 ], [ -94.449696, 35.496719 ], [ -94.463318, 35.582660 ], [ -94.464097, 35.587265 ], [ -94.464457, 35.588909 ], [ -94.465272, 35.594037 ], [ -94.472647, 35.638556 ], [ -94.487585, 35.726147 ], [ -94.488210, 35.729240 ], [ -94.493362, 35.761892 ], [ -94.494549, 35.768303 ], [ -94.499045, 35.793460 ], [ -94.499647, 35.796910 ], [ -94.500526, 35.802642 ], [ -94.500764, 35.803820 ], [ -94.501162, 35.806430 ], [ -94.503011, 35.817210 ], [ -94.504438, 35.826369 ], [ -94.505642, 35.833628 ], [ -94.507631, 35.845901 ], [ -94.517571, 35.901866 ], [ -94.522658, 35.934250 ], [ -94.522658, 35.934799 ], [ -94.522634, 35.934892 ], [ -94.522910, 35.936127 ], [ -94.524344, 35.944050 ], [ -94.524640, 35.945727 ], [ -94.528162, 35.965665 ], [ -94.528305, 35.966054 ], [ -94.532071, 35.987852 ], [ -94.533646, 35.996804 ], [ -94.534852, 36.002678 ], [ -94.535724, 36.007807 ], [ -94.547715, 36.077271 ], [ -94.547871, 36.078281 ], [ -94.561165, 36.152110 ], [ -94.562803, 36.161749 ], [ -94.565655, 36.178439 ], [ -94.566588, 36.183774 ], [ -94.571253, 36.210901 ], [ -94.571806, 36.213748 ], [ -94.574395, 36.229996 ], [ -94.574880, 36.232741 ], [ -94.575071, 36.233682 ], [ -94.576003, 36.240070 ], [ -94.577899, 36.249548 ], [ -94.577883, 36.250080 ], [ -94.586200, 36.299969 ], [ -94.593397, 36.345742 ], [ -94.599723, 36.387587 ], [ -94.601984, 36.402120 ], [ -94.602623, 36.405283 ], [ -94.605408, 36.421949 ], [ -94.611609, 36.461528 ], [ -94.613830, 36.476248 ], [ -94.615311, 36.484992 ], [ -94.617919, 36.499414 ], [ -94.559290, 36.499496 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US06", "STATE": "06", "NAME": "California", "LSAD": "", "CENSUSAREA": 155779.220000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -122.446316, 37.861046 ], [ -122.438565, 37.868367 ], [ -122.430958, 37.872242 ], [ -122.421341, 37.869946 ], [ -122.418470, 37.861764 ], [ -122.418470, 37.852721 ], [ -122.434403, 37.852434 ], [ -122.443302, 37.855448 ], [ -122.446316, 37.861046 ] ] ], [ [ [ -122.378500, 37.826505 ], [ -122.377879, 37.830648 ], [ -122.369941, 37.832137 ], [ -122.363244, 37.823951 ], [ -122.358779, 37.814278 ], [ -122.362661, 37.807577 ], [ -122.372422, 37.811301 ], [ -122.372670, 37.816510 ], [ -122.378500, 37.826505 ] ] ], [ [ [ -123.013916, 37.700355 ], [ -123.013897, 37.704478 ], [ -123.012194, 37.706749 ], [ -123.004489, 37.706262 ], [ -123.000190, 37.702937 ], [ -122.997189, 37.697909 ], [ -123.000677, 37.690203 ], [ -123.005543, 37.689392 ], [ -123.011464, 37.691907 ], [ -123.014303, 37.696205 ], [ -123.013916, 37.700355 ] ] ], [ [ [ -119.789798, 34.057260 ], [ -119.770729, 34.055051 ], [ -119.766081, 34.055370 ], [ -119.763688, 34.057155 ], [ -119.755521, 34.056716 ], [ -119.739472, 34.049299 ], [ -119.726437, 34.047908 ], [ -119.712576, 34.043265 ], [ -119.704628, 34.037681 ], [ -119.686507, 34.019805 ], [ -119.637742, 34.013178 ], [ -119.619343, 34.016468 ], [ -119.612226, 34.021256 ], [ -119.604287, 34.031561 ], [ -119.608798, 34.035245 ], [ -119.609239, 34.037350 ], [ -119.593240, 34.049625 ], [ -119.573410, 34.050110 ], [ -119.566700, 34.053452 ], [ -119.529603, 34.041155 ], [ -119.520640, 34.034262 ], [ -119.521770, 34.032247 ], [ -119.532413, 34.024949 ], [ -119.538847, 34.023988 ], [ -119.542449, 34.021082 ], [ -119.548280, 34.009819 ], [ -119.547072, 34.005469 ], [ -119.554472, 33.997820 ], [ -119.560464, 33.995530 ], [ -119.575636, 33.996009 ], [ -119.590200, 33.989712 ], [ -119.596877, 33.988611 ], [ -119.619082, 33.987228 ], [ -119.621117, 33.988990 ], [ -119.647710, 33.987786 ], [ -119.662825, 33.985889 ], [ -119.690110, 33.972225 ], [ -119.706952, 33.969178 ], [ -119.712363, 33.965422 ], [ -119.714696, 33.961439 ], [ -119.721206, 33.959583 ], [ -119.742966, 33.963877 ], [ -119.750438, 33.963759 ], [ -119.758141, 33.959212 ], [ -119.795938, 33.962929 ], [ -119.842748, 33.970340 ], [ -119.873358, 33.980375 ], [ -119.877057, 33.985757 ], [ -119.883033, 34.000802 ], [ -119.884896, 34.008814 ], [ -119.882531, 34.011674 ], [ -119.876916, 34.023527 ], [ -119.876329, 34.032087 ], [ -119.892821, 34.045529 ], [ -119.916216, 34.058351 ], [ -119.923337, 34.069361 ], [ -119.919155, 34.077280 ], [ -119.912857, 34.077508 ], [ -119.891130, 34.072856 ], [ -119.857304, 34.071298 ], [ -119.825865, 34.059794 ], [ -119.818742, 34.052997 ], [ -119.807825, 34.052127 ], [ -119.789798, 34.057260 ] ] ], [ [ [ -120.248484, 33.999329 ], [ -120.247393, 34.001911 ], [ -120.238657, 34.007592 ], [ -120.230001, 34.010136 ], [ -120.221287, 34.010367 ], [ -120.208478, 34.005655 ], [ -120.195780, 34.004284 ], [ -120.167306, 34.008219 ], [ -120.151663, 34.018126 ], [ -120.147647, 34.024831 ], [ -120.140362, 34.025974 ], [ -120.135853, 34.026087 ], [ -120.115058, 34.019866 ], [ -120.090182, 34.019806 ], [ -120.073609, 34.024477 ], [ -120.062778, 34.031161 ], [ -120.061953, 34.033976 ], [ -120.057637, 34.037340 ], [ -120.055107, 34.037729 ], [ -120.043259, 34.035806 ], [ -120.044004, 34.024820 ], [ -120.047798, 34.021227 ], [ -120.050382, 34.013331 ], [ -120.048926, 34.009898 ], [ -120.046575, 34.000002 ], [ -120.041311, 33.994507 ], [ -120.025653, 33.985553 ], [ -120.011123, 33.979894 ], [ -120.003815, 33.979547 ], [ -119.984316, 33.983948 ], [ -119.978876, 33.983081 ], [ -119.979913, 33.969623 ], [ -119.976857, 33.956693 ], [ -119.971141, 33.950401 ], [ -119.970260, 33.944359 ], [ -119.973691, 33.942481 ], [ -120.000960, 33.941554 ], [ -120.017715, 33.936366 ], [ -120.046881, 33.919597 ], [ -120.048315, 33.917625 ], [ -120.048611, 33.915775 ], [ -120.049682, 33.914563 ], [ -120.077793, 33.908886 ], [ -120.098601, 33.907853 ], [ -120.105489, 33.904280 ], [ -120.109137, 33.899129 ], [ -120.121817, 33.895712 ], [ -120.168974, 33.919090 ], [ -120.179049, 33.927994 ], [ -120.189840, 33.947703 ], [ -120.192339, 33.950266 ], [ -120.198602, 33.952211 ], [ -120.200085, 33.956904 ], [ -120.209372, 33.972376 ], [ -120.224461, 33.989059 ], [ -120.248484, 33.999329 ] ] ], [ [ [ -118.500212, 33.449592 ], [ -118.499669, 33.447879 ], [ -118.485570, 33.446213 ], [ -118.477646, 33.448392 ], [ -118.445812, 33.428907 ], [ -118.423576, 33.427258 ], [ -118.382037, 33.409883 ], [ -118.370323, 33.409285 ], [ -118.368301, 33.407110 ], [ -118.365094, 33.388374 ], [ -118.324460, 33.348782 ], [ -118.316083, 33.342928 ], [ -118.310213, 33.335795 ], [ -118.303174, 33.320264 ], [ -118.305084, 33.310323 ], [ -118.316787, 33.301137 ], [ -118.325244, 33.299075 ], [ -118.343249, 33.305234 ], [ -118.360332, 33.315330 ], [ -118.374768, 33.320065 ], [ -118.402941, 33.320901 ], [ -118.440047, 33.318638 ], [ -118.456309, 33.321820 ], [ -118.465368, 33.326056 ], [ -118.481886, 33.344123 ], [ -118.488770, 33.356649 ], [ -118.482609, 33.369914 ], [ -118.478465, 33.386320 ], [ -118.484949, 33.412131 ], [ -118.488750, 33.419826 ], [ -118.503952, 33.424234 ], [ -118.515914, 33.422417 ], [ -118.516267, 33.425075 ], [ -118.523230, 33.430733 ], [ -118.537380, 33.434608 ], [ -118.558715, 33.433419 ], [ -118.563442, 33.434381 ], [ -118.570927, 33.439351 ], [ -118.575901, 33.448261 ], [ -118.593969, 33.467198 ], [ -118.601185, 33.469853 ], [ -118.604030, 33.476540 ], [ -118.603375, 33.478098 ], [ -118.598783, 33.477939 ], [ -118.585936, 33.473819 ], [ -118.544530, 33.474119 ], [ -118.530702, 33.468071 ], [ -118.500212, 33.449592 ] ] ], [ [ [ -119.543842, 33.280329 ], [ -119.532941, 33.284728 ], [ -119.528141, 33.284929 ], [ -119.505040, 33.272829 ], [ -119.482780, 33.263973 ], [ -119.465717, 33.259239 ], [ -119.458466, 33.254661 ], [ -119.429559, 33.228167 ], [ -119.444269, 33.219190 ], [ -119.464725, 33.215432 ], [ -119.476029, 33.215520 ], [ -119.500684, 33.220569 ], [ -119.511659, 33.223027 ], [ -119.517514, 33.226737 ], [ -119.545872, 33.233406 ], [ -119.564971, 33.247440 ], [ -119.565641, 33.250029 ], [ -119.566014, 33.252639 ], [ -119.570642, 33.257729 ], [ -119.578942, 33.278628 ], [ -119.562042, 33.271129 ], [ -119.555242, 33.273429 ], [ -119.547642, 33.280328 ], [ -119.543842, 33.280329 ] ] ], [ [ [ -118.524531, 32.895488 ], [ -118.535823, 32.906280 ], [ -118.551134, 32.945155 ], [ -118.560887, 32.957891 ], [ -118.573522, 32.969183 ], [ -118.586928, 33.008281 ], [ -118.596037, 33.015357 ], [ -118.606559, 33.014690 ], [ -118.605534, 33.030999 ], [ -118.594033, 33.035951 ], [ -118.575160, 33.033961 ], [ -118.569013, 33.029151 ], [ -118.564445, 33.024914 ], [ -118.564527, 33.018637 ], [ -118.559171, 33.006291 ], [ -118.540069, 32.980933 ], [ -118.529228, 32.970921 ], [ -118.496811, 32.933847 ], [ -118.485288, 32.923545 ], [ -118.479039, 32.920363 ], [ -118.460623, 32.909510 ], [ -118.446771, 32.895424 ], [ -118.369984, 32.839273 ], [ -118.353504, 32.821962 ], [ -118.356541, 32.817311 ], [ -118.360530, 32.819921 ], [ -118.379968, 32.824545 ], [ -118.387375, 32.825327 ], [ -118.394565, 32.823978 ], [ -118.401268, 32.820338 ], [ -118.425634, 32.800595 ], [ -118.429430, 32.805429 ], [ -118.428372, 32.806872 ], [ -118.444920, 32.820593 ], [ -118.476074, 32.841754 ], [ -118.487908, 32.844590 ], [ -118.496298, 32.851572 ], [ -118.506902, 32.868503 ], [ -118.508095, 32.871321 ], [ -118.507193, 32.876264 ], [ -118.524641, 32.893175 ], [ -118.524531, 32.895488 ] ] ], [ [ [ -120.462580, 34.042627 ], [ -120.440248, 34.036918 ], [ -120.418768, 34.052093 ], [ -120.415287, 34.054960 ], [ -120.411314, 34.052869 ], [ -120.403613, 34.050442 ], [ -120.396188, 34.050187 ], [ -120.390906, 34.051994 ], [ -120.374211, 34.062658 ], [ -120.368813, 34.067780 ], [ -120.368584, 34.071214 ], [ -120.370176, 34.074907 ], [ -120.368278, 34.076465 ], [ -120.362251, 34.073056 ], [ -120.354982, 34.059256 ], [ -120.360290, 34.055820 ], [ -120.358608, 34.050235 ], [ -120.346946, 34.046576 ], [ -120.331161, 34.049097 ], [ -120.319032, 34.041979 ], [ -120.313175, 34.036576 ], [ -120.302122, 34.023574 ], [ -120.304543, 34.021171 ], [ -120.317052, 34.018837 ], [ -120.347706, 34.020114 ], [ -120.355320, 34.017914 ], [ -120.357930, 34.015029 ], [ -120.375143, 34.018775 ], [ -120.409368, 34.032198 ], [ -120.415225, 34.032245 ], [ -120.419021, 34.028949 ], [ -120.427408, 34.025425 ], [ -120.454134, 34.028081 ], [ -120.459635, 34.031537 ], [ -120.465329, 34.038448 ], [ -120.462580, 34.042627 ] ] ], [ [ [ -119.422972, 34.004368 ], [ -119.427589, 34.006445 ], [ -119.437734, 34.010000 ], [ -119.441116, 34.012426 ], [ -119.441226, 34.014075 ], [ -119.433912, 34.015975 ], [ -119.421376, 34.015012 ], [ -119.411317, 34.008005 ], [ -119.396251, 34.005918 ], [ -119.389983, 34.006099 ], [ -119.366591, 34.016785 ], [ -119.357462, 34.015919 ], [ -119.376396, 34.010551 ], [ -119.391551, 34.002505 ], [ -119.414528, 34.004994 ], [ -119.422972, 34.004368 ] ] ], [ [ [ -117.124862, 32.534156 ], [ -117.133363, 32.575625 ], [ -117.132963, 32.597054 ], [ -117.136664, 32.618754 ], [ -117.139464, 32.627054 ], [ -117.159865, 32.660652 ], [ -117.168866, 32.671952 ], [ -117.180366, 32.681652 ], [ -117.192967, 32.687751 ], [ -117.196767, 32.688851 ], [ -117.213068, 32.687751 ], [ -117.223868, 32.683051 ], [ -117.236239, 32.671353 ], [ -117.237294, 32.667489 ], [ -117.243738, 32.662677 ], [ -117.246069, 32.669352 ], [ -117.255169, 32.700051 ], [ -117.257570, 32.726050 ], [ -117.255370, 32.745449 ], [ -117.252570, 32.752949 ], [ -117.254970, 32.786948 ], [ -117.261070, 32.803148 ], [ -117.280971, 32.822247 ], [ -117.282170, 32.839547 ], [ -117.281170, 32.843047 ], [ -117.273870, 32.851447 ], [ -117.264970, 32.848947 ], [ -117.260670, 32.852647 ], [ -117.256170, 32.859447 ], [ -117.251670, 32.874346 ], [ -117.254470, 32.900146 ], [ -117.260470, 32.931245 ], [ -117.280770, 33.012343 ], [ -117.293370, 33.034642 ], [ -117.309771, 33.074540 ], [ -117.315278, 33.093504 ], [ -117.328359, 33.121842 ], [ -117.362572, 33.168437 ], [ -117.391480, 33.202762 ], [ -117.401926, 33.213598 ], [ -117.445583, 33.268517 ], [ -117.469794, 33.296417 ], [ -117.505650, 33.334063 ], [ -117.547693, 33.365491 ], [ -117.571722, 33.378988 ], [ -117.595880, 33.386629 ], [ -117.607905, 33.406317 ], [ -117.631682, 33.430528 ], [ -117.645582, 33.440728 ], [ -117.684584, 33.461927 ], [ -117.689284, 33.460155 ], [ -117.691984, 33.456627 ], [ -117.691384, 33.454028 ], [ -117.715349, 33.460556 ], [ -117.726486, 33.483427 ], [ -117.761387, 33.516326 ], [ -117.784888, 33.541525 ], [ -117.801288, 33.546324 ], [ -117.814188, 33.552224 ], [ -117.840289, 33.573523 ], [ -117.876790, 33.592322 ], [ -117.899790, 33.599622 ], [ -117.927091, 33.605521 ], [ -117.940591, 33.620021 ], [ -118.000593, 33.654319 ], [ -118.029694, 33.676418 ], [ -118.064895, 33.711018 ], [ -118.088896, 33.729817 ], [ -118.101097, 33.734117 ], [ -118.132698, 33.753217 ], [ -118.156900, 33.760317 ], [ -118.175500, 33.763617 ], [ -118.180831, 33.763072 ], [ -118.187701, 33.749218 ], [ -118.183700, 33.736118 ], [ -118.181367, 33.717367 ], [ -118.207476, 33.716905 ], [ -118.258687, 33.703741 ], [ -118.277208, 33.707091 ], [ -118.297104, 33.708319 ], [ -118.317205, 33.712818 ], [ -118.354705, 33.732317 ], [ -118.360505, 33.736817 ], [ -118.385006, 33.741417 ], [ -118.396606, 33.735917 ], [ -118.411211, 33.741985 ], [ -118.428407, 33.774715 ], [ -118.423407, 33.782015 ], [ -118.405007, 33.800215 ], [ -118.394307, 33.804315 ], [ -118.391507, 33.815415 ], [ -118.392107, 33.840915 ], [ -118.412708, 33.883913 ], [ -118.442410, 33.940312 ], [ -118.460611, 33.969111 ], [ -118.484212, 33.997710 ], [ -118.502813, 34.015509 ], [ -118.519514, 34.027509 ], [ -118.543115, 34.038508 ], [ -118.569235, 34.041640 ], [ -118.603572, 34.039048 ], [ -118.609652, 34.036424 ], [ -118.668358, 34.038887 ], [ -118.675430, 34.037479 ], [ -118.679366, 34.033255 ], [ -118.706215, 34.029383 ], [ -118.732391, 34.032743 ], [ -118.744952, 34.032103 ], [ -118.783433, 34.021543 ], [ -118.787094, 34.019545 ], [ -118.805114, 34.001239 ], [ -118.821579, 34.013959 ], [ -118.840380, 34.027527 ], [ -118.854653, 34.034215 ], [ -118.896159, 34.039207 ], [ -118.928048, 34.045847 ], [ -118.938081, 34.043383 ], [ -118.954722, 34.048167 ], [ -118.977751, 34.059822 ], [ -118.996980, 34.065943 ], [ -119.004644, 34.066231 ], [ -119.037494, 34.083111 ], [ -119.069959, 34.090470 ], [ -119.088536, 34.098310 ], [ -119.098216, 34.099334 ], [ -119.109784, 34.094566 ], [ -119.130169, 34.100102 ], [ -119.188640, 34.139005 ], [ -119.203140, 34.144505 ], [ -119.211241, 34.144905 ], [ -119.216441, 34.146105 ], [ -119.227743, 34.161728 ], [ -119.237142, 34.175804 ], [ -119.257043, 34.213304 ], [ -119.265927, 34.234609 ], [ -119.270144, 34.252903 ], [ -119.278644, 34.266902 ], [ -119.290945, 34.274902 ], [ -119.302131, 34.272761 ], [ -119.313034, 34.275689 ], [ -119.337475, 34.290576 ], [ -119.349187, 34.304383 ], [ -119.370356, 34.319486 ], [ -119.375780, 34.321118 ], [ -119.388249, 34.317398 ], [ -119.390449, 34.318198 ], [ -119.427770, 34.353016 ], [ -119.431066, 34.355297 ], [ -119.435888, 34.355839 ], [ -119.461036, 34.374064 ], [ -119.472678, 34.375628 ], [ -119.510655, 34.386295 ], [ -119.536957, 34.395495 ], [ -119.559459, 34.413395 ], [ -119.616862, 34.420995 ], [ -119.638864, 34.415696 ], [ -119.648664, 34.417396 ], [ -119.671866, 34.416096 ], [ -119.688167, 34.412497 ], [ -119.684666, 34.408297 ], [ -119.691749, 34.403154 ], [ -119.709067, 34.395397 ], [ -119.729369, 34.395897 ], [ -119.745470, 34.402898 ], [ -119.785871, 34.415997 ], [ -119.794771, 34.417597 ], [ -119.835771, 34.415796 ], [ -119.853771, 34.407996 ], [ -119.873971, 34.408795 ], [ -119.925227, 34.433931 ], [ -119.956433, 34.435288 ], [ -119.971951, 34.444641 ], [ -120.008077, 34.460447 ], [ -120.038828, 34.463434 ], [ -120.050682, 34.461651 ], [ -120.088591, 34.460208 ], [ -120.097212, 34.461809 ], [ -120.118411, 34.469927 ], [ -120.141165, 34.473405 ], [ -120.183505, 34.470372 ], [ -120.225498, 34.470587 ], [ -120.238002, 34.468098 ], [ -120.257770, 34.467451 ], [ -120.283001, 34.468354 ], [ -120.295051, 34.470623 ], [ -120.299169, 34.469731 ], [ -120.301822, 34.467077 ], [ -120.341369, 34.458789 ], [ -120.441975, 34.451512 ], [ -120.451425, 34.447094 ], [ -120.471376, 34.447846 ], [ -120.476610, 34.475131 ], [ -120.480372, 34.481059 ], [ -120.490523, 34.490075 ], [ -120.511421, 34.522953 ], [ -120.524776, 34.531291 ], [ -120.581293, 34.556959 ], [ -120.608355, 34.556656 ], [ -120.612005, 34.553564 ], [ -120.622575, 34.554017 ], [ -120.637805, 34.566220 ], [ -120.645739, 34.581035 ], [ -120.640244, 34.604406 ], [ -120.625127, 34.634489 ], [ -120.601970, 34.692095 ], [ -120.600450, 34.704640 ], [ -120.601672, 34.709721 ], [ -120.614852, 34.730709 ], [ -120.626320, 34.738072 ], [ -120.637415, 34.755895 ], [ -120.622970, 34.793300 ], [ -120.616296, 34.816308 ], [ -120.609898, 34.842751 ], [ -120.610266, 34.858180 ], [ -120.616325, 34.866739 ], [ -120.639283, 34.880413 ], [ -120.642212, 34.894145 ], [ -120.647328, 34.901133 ], [ -120.662889, 34.901183 ], [ -120.670835, 34.904115 ], [ -120.639990, 35.002963 ], [ -120.633570, 35.033085 ], [ -120.629931, 35.061515 ], [ -120.629583, 35.078362 ], [ -120.630957, 35.101941 ], [ -120.635787, 35.123805 ], [ -120.644311, 35.139616 ], [ -120.651134, 35.147768 ], [ -120.662475, 35.153357 ], [ -120.667994, 35.152030 ], [ -120.675074, 35.153061 ], [ -120.686974, 35.160708 ], [ -120.698906, 35.171192 ], [ -120.704203, 35.173206 ], [ -120.714185, 35.175998 ], [ -120.734231, 35.178472 ], [ -120.748870, 35.177795 ], [ -120.754823, 35.174701 ], [ -120.756862, 35.169208 ], [ -120.756086, 35.160459 ], [ -120.760492, 35.159710 ], [ -120.778998, 35.168897 ], [ -120.786076, 35.177666 ], [ -120.805258, 35.184973 ], [ -120.846674, 35.204429 ], [ -120.856047, 35.206487 ], [ -120.873046, 35.225688 ], [ -120.896790, 35.247877 ], [ -120.896876, 35.253990 ], [ -120.889354, 35.277819 ], [ -120.879570, 35.294184 ], [ -120.867200, 35.327154 ], [ -120.862684, 35.346776 ], [ -120.862133, 35.360763 ], [ -120.866099, 35.393045 ], [ -120.869209, 35.403276 ], [ -120.884757, 35.430196 ], [ -120.896862, 35.442243 ], [ -120.907937, 35.449069 ], [ -120.946546, 35.446715 ], [ -120.950742, 35.448020 ], [ -120.955863, 35.453743 ], [ -120.969436, 35.460197 ], [ -120.976122, 35.459028 ], [ -121.003359, 35.460710 ], [ -121.025621, 35.484598 ], [ -121.053080, 35.507530 ], [ -121.059913, 35.509671 ], [ -121.101595, 35.548814 ], [ -121.126027, 35.593058 ], [ -121.133556, 35.600455 ], [ -121.143561, 35.606046 ], [ -121.166712, 35.635399 ], [ -121.188897, 35.643138 ], [ -121.195291, 35.640734 ], [ -121.251034, 35.656641 ], [ -121.272322, 35.666711 ], [ -121.284731, 35.662508 ], [ -121.284973, 35.674109 ], [ -121.289794, 35.689428 ], [ -121.296473, 35.696824 ], [ -121.304583, 35.701794 ], [ -121.314632, 35.713310 ], [ -121.315786, 35.752520 ], [ -121.326319, 35.757531 ], [ -121.324918, 35.769347 ], [ -121.332449, 35.783106 ], [ -121.356737, 35.804187 ], [ -121.388053, 35.823483 ], [ -121.406823, 35.844623 ], [ -121.413146, 35.855316 ], [ -121.426955, 35.860103 ], [ -121.439584, 35.866950 ], [ -121.462264, 35.885618 ], [ -121.461227, 35.896906 ], [ -121.463452, 35.904416 ], [ -121.472435, 35.919890 ], [ -121.486200, 35.970348 ], [ -121.503112, 36.000299 ], [ -121.511590, 36.006598 ], [ -121.531876, 36.014368 ], [ -121.553716, 36.019798 ], [ -121.569612, 36.021539 ], [ -121.574602, 36.025156 ], [ -121.590395, 36.050363 ], [ -121.589183, 36.053775 ], [ -121.592853, 36.065062 ], [ -121.606845, 36.072065 ], [ -121.618672, 36.087767 ], [ -121.622009, 36.099695 ], [ -121.629634, 36.114452 ], [ -121.680145, 36.165818 ], [ -121.717176, 36.195146 ], [ -121.779851, 36.227407 ], [ -121.797059, 36.234211 ], [ -121.806979, 36.232907 ], [ -121.813734, 36.234235 ], [ -121.826425, 36.241860 ], [ -121.835785, 36.250748 ], [ -121.839350, 36.260478 ], [ -121.851967, 36.277831 ], [ -121.874797, 36.289064 ], [ -121.888491, 36.302810 ], [ -121.896760, 36.304938 ], [ -121.899642, 36.302674 ], [ -121.902729, 36.306379 ], [ -121.894714, 36.317806 ], [ -121.892917, 36.340428 ], [ -121.905446, 36.358269 ], [ -121.902669, 36.363901 ], [ -121.901813, 36.381879 ], [ -121.903195, 36.393603 ], [ -121.905657, 36.398206 ], [ -121.914378, 36.404344 ], [ -121.917463, 36.414809 ], [ -121.914740, 36.425890 ], [ -121.925500, 36.453918 ], [ -121.937205, 36.472488 ], [ -121.941600, 36.485602 ], [ -121.939216, 36.496896 ], [ -121.938763, 36.506423 ], [ -121.943678, 36.511802 ], [ -121.953884, 36.517757 ], [ -121.954915, 36.523084 ], [ -121.949072, 36.523256 ], [ -121.944666, 36.521861 ], [ -121.928769, 36.523147 ], [ -121.925937, 36.525173 ], [ -121.932508, 36.559935 ], [ -121.942533, 36.566435 ], [ -121.949659, 36.567602 ], [ -121.951460, 36.564009 ], [ -121.957335, 36.564482 ], [ -121.972594, 36.573370 ], [ -121.978592, 36.580488 ], [ -121.970427, 36.582754 ], [ -121.964059, 36.590571 ], [ -121.959695, 36.608959 ], [ -121.941666, 36.618059 ], [ -121.938551, 36.633908 ], [ -121.936430, 36.636746 ], [ -121.929666, 36.636959 ], [ -121.923866, 36.634559 ], [ -121.890164, 36.609259 ], [ -121.889064, 36.601759 ], [ -121.886764, 36.601459 ], [ -121.871364, 36.604559 ], [ -121.860604, 36.611136 ], [ -121.842263, 36.630059 ], [ -121.831995, 36.644856 ], [ -121.825052, 36.657207 ], [ -121.814462, 36.682858 ], [ -121.807062, 36.714157 ], [ -121.805643, 36.750239 ], [ -121.788278, 36.803994 ], [ -121.791544, 36.815186 ], [ -121.809363, 36.848654 ], [ -121.827664, 36.879353 ], [ -121.862266, 36.931552 ], [ -121.880167, 36.950151 ], [ -121.894667, 36.961851 ], [ -121.906468, 36.968950 ], [ -121.930069, 36.978150 ], [ -121.939470, 36.978050 ], [ -121.951670, 36.971450 ], [ -121.972771, 36.954151 ], [ -121.975871, 36.954051 ], [ -121.983896, 36.958727 ], [ -122.012373, 36.964550 ], [ -122.023373, 36.962150 ], [ -122.027174, 36.951150 ], [ -122.050122, 36.948523 ], [ -122.066421, 36.948271 ], [ -122.105976, 36.955951 ], [ -122.140578, 36.974950 ], [ -122.155078, 36.980850 ], [ -122.186879, 37.003450 ], [ -122.206180, 37.013949 ], [ -122.252181, 37.059448 ], [ -122.260481, 37.072548 ], [ -122.284882, 37.101747 ], [ -122.306139, 37.116383 ], [ -122.313907, 37.118161 ], [ -122.322971, 37.115460 ], [ -122.330463, 37.115338 ], [ -122.337071, 37.117382 ], [ -122.338856, 37.120854 ], [ -122.337085, 37.130795 ], [ -122.337833, 37.135936 ], [ -122.344029, 37.144099 ], [ -122.359791, 37.155574 ], [ -122.361790, 37.163593 ], [ -122.367085, 37.172817 ], [ -122.379270, 37.181128 ], [ -122.390599, 37.182988 ], [ -122.397065, 37.187249 ], [ -122.405073, 37.195791 ], [ -122.407181, 37.219465 ], [ -122.408982, 37.225258 ], [ -122.415822, 37.232839 ], [ -122.419113, 37.241470 ], [ -122.418452, 37.248521 ], [ -122.411686, 37.265844 ], [ -122.401323, 37.337009 ], [ -122.400850, 37.359225 ], [ -122.409258, 37.374805 ], [ -122.423286, 37.392542 ], [ -122.443687, 37.435941 ], [ -122.445987, 37.461541 ], [ -122.452087, 37.480540 ], [ -122.467888, 37.498140 ], [ -122.472388, 37.500540 ], [ -122.485888, 37.494641 ], [ -122.493789, 37.492341 ], [ -122.499289, 37.495341 ], [ -122.516689, 37.521340 ], [ -122.519533, 37.537302 ], [ -122.516589, 37.544939 ], [ -122.514789, 37.546139 ], [ -122.513688, 37.552239 ], [ -122.518088, 37.576138 ], [ -122.517187, 37.590637 ], [ -122.501386, 37.599637 ], [ -122.496786, 37.612136 ], [ -122.494085, 37.644035 ], [ -122.496784, 37.686433 ], [ -122.506483, 37.723731 ], [ -122.511983, 37.771130 ], [ -122.514483, 37.780829 ], [ -122.505310, 37.788312 ], [ -122.492883, 37.787929 ], [ -122.485783, 37.790629 ], [ -122.478083, 37.810828 ], [ -122.470336, 37.808671 ], [ -122.463793, 37.804653 ], [ -122.425942, 37.810979 ], [ -122.407452, 37.811441 ], [ -122.398139, 37.805630 ], [ -122.385323, 37.790724 ], [ -122.378780, 37.752203 ], [ -122.367580, 37.740214 ], [ -122.375854, 37.734979 ], [ -122.370094, 37.732331 ], [ -122.367697, 37.734943 ], [ -122.365478, 37.734621 ], [ -122.356784, 37.729505 ], [ -122.361749, 37.715010 ], [ -122.370411, 37.717572 ], [ -122.377251, 37.714557 ], [ -122.378599, 37.708634 ], [ -122.390674, 37.708640 ], [ -122.393190, 37.707531 ], [ -122.387626, 37.679060 ], [ -122.374291, 37.662206 ], [ -122.375600, 37.652389 ], [ -122.377890, 37.650425 ], [ -122.387381, 37.648462 ], [ -122.386072, 37.637662 ], [ -122.365455, 37.626208 ], [ -122.355310, 37.615736 ], [ -122.358583, 37.611155 ], [ -122.370364, 37.614427 ], [ -122.373309, 37.613773 ], [ -122.378545, 37.605592 ], [ -122.360219, 37.592501 ], [ -122.317676, 37.590865 ], [ -122.315385, 37.587265 ], [ -122.315713, 37.583666 ], [ -122.305895, 37.575484 ], [ -122.262698, 37.572866 ], [ -122.251898, 37.566321 ], [ -122.244372, 37.558140 ], [ -122.214264, 37.538505 ], [ -122.196593, 37.537196 ], [ -122.194957, 37.522469 ], [ -122.168449, 37.504143 ], [ -122.155686, 37.501198 ], [ -122.149632, 37.502671 ], [ -122.140142, 37.507907 ], [ -122.130979, 37.503652 ], [ -122.127706, 37.500053 ], [ -122.111344, 37.507580 ], [ -122.111998, 37.528851 ], [ -122.128688, 37.560594 ], [ -122.133924, 37.562885 ], [ -122.137524, 37.567467 ], [ -122.144396, 37.581866 ], [ -122.147014, 37.588411 ], [ -122.145378, 37.600846 ], [ -122.146360, 37.607391 ], [ -122.152905, 37.640771 ], [ -122.163049, 37.667933 ], [ -122.170904, 37.676114 ], [ -122.179085, 37.680041 ], [ -122.197411, 37.692804 ], [ -122.203971, 37.697769 ], [ -122.213774, 37.698695 ], [ -122.221628, 37.705567 ], [ -122.246826, 37.721930 ], [ -122.255989, 37.735674 ], [ -122.257953, 37.739601 ], [ -122.257134, 37.745001 ], [ -122.252226, 37.747619 ], [ -122.244938, 37.750294 ], [ -122.243947, 37.751779 ], [ -122.271905, 37.761508 ], [ -122.275408, 37.767350 ], [ -122.286139, 37.769458 ], [ -122.293996, 37.770416 ], [ -122.304345, 37.774632 ], [ -122.318909, 37.779040 ], [ -122.330790, 37.783830 ], [ -122.331748, 37.796052 ], [ -122.335675, 37.799652 ], [ -122.333711, 37.809797 ], [ -122.323567, 37.823214 ], [ -122.317676, 37.826814 ], [ -122.306222, 37.827469 ], [ -122.303931, 37.830087 ], [ -122.302981, 37.836497 ], [ -122.315913, 37.836812 ], [ -122.314195, 37.842311 ], [ -122.303884, 37.840249 ], [ -122.302852, 37.848154 ], [ -122.308352, 37.862934 ], [ -122.316944, 37.858809 ], [ -122.325193, 37.874276 ], [ -122.318663, 37.875307 ], [ -122.313164, 37.870151 ], [ -122.310414, 37.870495 ], [ -122.311445, 37.879775 ], [ -122.326912, 37.888712 ], [ -122.326912, 37.892492 ], [ -122.311101, 37.890430 ], [ -122.315570, 37.896961 ], [ -122.323131, 37.894555 ], [ -122.326568, 37.896617 ], [ -122.323730, 37.905845 ], [ -122.334530, 37.908791 ], [ -122.357110, 37.908791 ], [ -122.362346, 37.904209 ], [ -122.367582, 37.903882 ], [ -122.378709, 37.905191 ], [ -122.385908, 37.908136 ], [ -122.389181, 37.910100 ], [ -122.390490, 37.922535 ], [ -122.395071, 37.927117 ], [ -122.401289, 37.928426 ], [ -122.413725, 37.937262 ], [ -122.417371, 37.943513 ], [ -122.430087, 37.963115 ], [ -122.429760, 37.965405 ], [ -122.415361, 37.963115 ], [ -122.411761, 37.960497 ], [ -122.408383, 37.957544 ], [ -122.399832, 37.956009 ], [ -122.367582, 37.978168 ], [ -122.361905, 37.989991 ], [ -122.363001, 37.994375 ], [ -122.366928, 37.998458 ], [ -122.368891, 38.007948 ], [ -122.367909, 38.012530 ], [ -122.363655, 38.014166 ], [ -122.359493, 38.009941 ], [ -122.340093, 38.003694 ], [ -122.331912, 38.005330 ], [ -122.321112, 38.012857 ], [ -122.315549, 38.013511 ], [ -122.300823, 38.010893 ], [ -122.283478, 38.022674 ], [ -122.262861, 38.044600 ], [ -122.262861, 38.051473 ], [ -122.273006, 38.074380 ], [ -122.282824, 38.082889 ], [ -122.301804, 38.105142 ], [ -122.314567, 38.115287 ], [ -122.366273, 38.141467 ], [ -122.396380, 38.149976 ], [ -122.403580, 38.150630 ], [ -122.409798, 38.136231 ], [ -122.439577, 38.116923 ], [ -122.450377, 38.116269 ], [ -122.454958, 38.118887 ], [ -122.484411, 38.114960 ], [ -122.489974, 38.112014 ], [ -122.491283, 38.108087 ], [ -122.489974, 38.096961 ], [ -122.486702, 38.090088 ], [ -122.483757, 38.071762 ], [ -122.492265, 38.056381 ], [ -122.499465, 38.032165 ], [ -122.497828, 38.019402 ], [ -122.494556, 38.015148 ], [ -122.481466, 38.007621 ], [ -122.462812, 38.003367 ], [ -122.452995, 37.996167 ], [ -122.448413, 37.988313 ], [ -122.448413, 37.984713 ], [ -122.456595, 37.978823 ], [ -122.462485, 37.981441 ], [ -122.471975, 37.981768 ], [ -122.488665, 37.966714 ], [ -122.490302, 37.964751 ], [ -122.490302, 37.959188 ], [ -122.487684, 37.948716 ], [ -122.480484, 37.945443 ], [ -122.479175, 37.941516 ], [ -122.485720, 37.937589 ], [ -122.499465, 37.939225 ], [ -122.503064, 37.936607 ], [ -122.503064, 37.928753 ], [ -122.493574, 37.921881 ], [ -122.486375, 37.921881 ], [ -122.478193, 37.918608 ], [ -122.471975, 37.910427 ], [ -122.472303, 37.902573 ], [ -122.458558, 37.894064 ], [ -122.448413, 37.893410 ], [ -122.439250, 37.883920 ], [ -122.438268, 37.880974 ], [ -122.450050, 37.871157 ], [ -122.462158, 37.868866 ], [ -122.474266, 37.874429 ], [ -122.480811, 37.873448 ], [ -122.483429, 37.868866 ], [ -122.483102, 37.863957 ], [ -122.476473, 37.832513 ], [ -122.479151, 37.825428 ], [ -122.483483, 37.826728 ], [ -122.505383, 37.822128 ], [ -122.523585, 37.824828 ], [ -122.529452, 37.814890 ], [ -122.537285, 37.830328 ], [ -122.548986, 37.836227 ], [ -122.561487, 37.851827 ], [ -122.584289, 37.859227 ], [ -122.601290, 37.875126 ], [ -122.627113, 37.886080 ], [ -122.639977, 37.897349 ], [ -122.656519, 37.904519 ], [ -122.678474, 37.906604 ], [ -122.682171, 37.906450 ], [ -122.693569, 37.901171 ], [ -122.702640, 37.893820 ], [ -122.727297, 37.904626 ], [ -122.732898, 37.920225 ], [ -122.736898, 37.925825 ], [ -122.754606, 37.935527 ], [ -122.766138, 37.938004 ], [ -122.783244, 37.951334 ], [ -122.791739, 37.969422 ], [ -122.797405, 37.976657 ], [ -122.821383, 37.996735 ], [ -122.856573, 38.016717 ], [ -122.882114, 38.025273 ], [ -122.939711, 38.031908 ], [ -122.956811, 38.028720 ], [ -122.972378, 38.020247 ], [ -122.981776, 38.009119 ], [ -122.982386, 38.004274 ], [ -122.980147, 38.000831 ], [ -122.976764, 37.995680 ], [ -122.974390, 37.992429 ], [ -123.024066, 37.994878 ], [ -123.020562, 37.999544 ], [ -123.016303, 38.001691 ], [ -123.011533, 38.003438 ], [ -122.992420, 38.041758 ], [ -122.960889, 38.112962 ], [ -122.952086, 38.138562 ], [ -122.949074, 38.154060 ], [ -122.949626, 38.164041 ], [ -122.953629, 38.175670 ], [ -122.965408, 38.187113 ], [ -122.966370, 38.198514 ], [ -122.968112, 38.202428 ], [ -122.991953, 38.233185 ], [ -122.993959, 38.237602 ], [ -122.993235, 38.239686 ], [ -122.987149, 38.237538 ], [ -122.968569, 38.242879 ], [ -122.967203, 38.250691 ], [ -122.977082, 38.267902 ], [ -122.986319, 38.273164 ], [ -122.994603, 38.283096 ], [ -122.997106, 38.289458 ], [ -123.004122, 38.297012 ], [ -123.024333, 38.310573 ], [ -123.038742, 38.313576 ], [ -123.051061, 38.310693 ], [ -123.053476, 38.305722 ], [ -123.052021, 38.302246 ], [ -123.053504, 38.299385 ], [ -123.058239, 38.298355 ], [ -123.063671, 38.302178 ], [ -123.074684, 38.322574 ], [ -123.068437, 38.335210 ], [ -123.068265, 38.359865 ], [ -123.085572, 38.390525 ], [ -123.103706, 38.415541 ], [ -123.122379, 38.437314 ], [ -123.128825, 38.450418 ], [ -123.145325, 38.459422 ], [ -123.166428, 38.474947 ], [ -123.202277, 38.494314 ], [ -123.249797, 38.511045 ], [ -123.287156, 38.540223 ], [ -123.297151, 38.543452 ], [ -123.331899, 38.565542 ], [ -123.343338, 38.590008 ], [ -123.349612, 38.596805 ], [ -123.371876, 38.607235 ], [ -123.379303, 38.621953 ], [ -123.398166, 38.647044 ], [ -123.403010, 38.649449 ], [ -123.405663, 38.656729 ], [ -123.432720, 38.687131 ], [ -123.441774, 38.699744 ], [ -123.461291, 38.717001 ], [ -123.490021, 38.732213 ], [ -123.514784, 38.741966 ], [ -123.525152, 38.753801 ], [ -123.533535, 38.768408 ], [ -123.541837, 38.776764 ], [ -123.571987, 38.798189 ], [ -123.579856, 38.802835 ], [ -123.586380, 38.802857 ], [ -123.600221, 38.814115 ], [ -123.601569, 38.818990 ], [ -123.605317, 38.822765 ], [ -123.638637, 38.843865 ], [ -123.642676, 38.844005 ], [ -123.647387, 38.845472 ], [ -123.652212, 38.854582 ], [ -123.654696, 38.865638 ], [ -123.659846, 38.872529 ], [ -123.688099, 38.893594 ], [ -123.710540, 38.913230 ], [ -123.725367, 38.917438 ], [ -123.727630, 38.929500 ], [ -123.726315, 38.936367 ], [ -123.738886, 38.954120 ], [ -123.732892, 38.954994 ], [ -123.729053, 38.956667 ], [ -123.721347, 38.963879 ], [ -123.711149, 38.977316 ], [ -123.696900, 39.004401 ], [ -123.690740, 39.021293 ], [ -123.690095, 39.031157 ], [ -123.693969, 39.057363 ], [ -123.713392, 39.108422 ], [ -123.721505, 39.125327 ], [ -123.735936, 39.139644 ], [ -123.737913, 39.143442 ], [ -123.742221, 39.164885 ], [ -123.761010, 39.191595 ], [ -123.765891, 39.193657 ], [ -123.774998, 39.212083 ], [ -123.777368, 39.237214 ], [ -123.787893, 39.264327 ], [ -123.798991, 39.271355 ], [ -123.803848, 39.278771 ], [ -123.801757, 39.283530 ], [ -123.803081, 39.291747 ], [ -123.811387, 39.312825 ], [ -123.808772, 39.324368 ], [ -123.817369, 39.338800 ], [ -123.822085, 39.343857 ], [ -123.825331, 39.360814 ], [ -123.826306, 39.368710 ], [ -123.822325, 39.379987 ], [ -123.821887, 39.406809 ], [ -123.814690, 39.446538 ], [ -123.795639, 39.492215 ], [ -123.784170, 39.509419 ], [ -123.778521, 39.521478 ], [ -123.766475, 39.552803 ], [ -123.767210, 39.559852 ], [ -123.787417, 39.604552 ], [ -123.783540, 39.609517 ], [ -123.782322, 39.621486 ], [ -123.786360, 39.659932 ], [ -123.792659, 39.684122 ], [ -123.808208, 39.710715 ], [ -123.824744, 39.718128 ], [ -123.829545, 39.723071 ], [ -123.831599, 39.730629 ], [ -123.835092, 39.738768 ], [ -123.838089, 39.752409 ], [ -123.837150, 39.776232 ], [ -123.839797, 39.795637 ], [ -123.851714, 39.832041 ], [ -123.853764, 39.834100 ], [ -123.881458, 39.845422 ], [ -123.907664, 39.863028 ], [ -123.915142, 39.875313 ], [ -123.915853, 39.881114 ], [ -123.930047, 39.909697 ], [ -123.954952, 39.922373 ], [ -123.962655, 39.937635 ], [ -123.980031, 39.962458 ], [ -123.995860, 39.973045 ], [ -124.035904, 40.013319 ], [ -124.056408, 40.024305 ], [ -124.065069, 40.024785 ], [ -124.068908, 40.021307 ], [ -124.072509, 40.022657 ], [ -124.079983, 40.029773 ], [ -124.080709, 40.066110 ], [ -124.087086, 40.078442 ], [ -124.110549, 40.103765 ], [ -124.139952, 40.116350 ], [ -124.170767, 40.124207 ], [ -124.187874, 40.130542 ], [ -124.214895, 40.160902 ], [ -124.231095, 40.171581 ], [ -124.258405, 40.184277 ], [ -124.296497, 40.208816 ], [ -124.320912, 40.226617 ], [ -124.327691, 40.237370 ], [ -124.343070, 40.243979 ], [ -124.352715, 40.250453 ], [ -124.363414, 40.260974 ], [ -124.363634, 40.276212 ], [ -124.347853, 40.314634 ], [ -124.353124, 40.331425 ], [ -124.356595, 40.335016 ], [ -124.362796, 40.350046 ], [ -124.365357, 40.374855 ], [ -124.373599, 40.392923 ], [ -124.379082, 40.398828 ], [ -124.391496, 40.407047 ], [ -124.402623, 40.422105 ], [ -124.409591, 40.438076 ], [ -124.408601, 40.443201 ], [ -124.396642, 40.462119 ], [ -124.384940, 40.489820 ], [ -124.383224, 40.499852 ], [ -124.387023, 40.504954 ], [ -124.382816, 40.519000 ], [ -124.379096, 40.522865 ], [ -124.363545, 40.548698 ], [ -124.329404, 40.616430 ], [ -124.315141, 40.639526 ], [ -124.312558, 40.641333 ], [ -124.289119, 40.679630 ], [ -124.248406, 40.735166 ], [ -124.228244, 40.769390 ], [ -124.201921, 40.805111 ], [ -124.176715, 40.843618 ], [ -124.158322, 40.876069 ], [ -124.137066, 40.925732 ], [ -124.118147, 40.989263 ], [ -124.112165, 41.028173 ], [ -124.125448, 41.048504 ], [ -124.132946, 41.052482 ], [ -124.138217, 41.054342 ], [ -124.142867, 41.054032 ], [ -124.147216, 41.052884 ], [ -124.148939, 41.051467 ], [ -124.151266, 41.051101 ], [ -124.153622, 41.053550 ], [ -124.154028, 41.059923 ], [ -124.154513, 41.087159 ], [ -124.160556, 41.099011 ], [ -124.159065, 41.121957 ], [ -124.165414, 41.129822 ], [ -124.163988, 41.138675 ], [ -124.158539, 41.143021 ], [ -124.149674, 41.140845 ], [ -124.143800, 41.144686 ], [ -124.122677, 41.189726 ], [ -124.106986, 41.229678 ], [ -124.106389, 41.240682 ], [ -124.092284, 41.287695 ], [ -124.079015, 41.347135 ], [ -124.072294, 41.374844 ], [ -124.063076, 41.439579 ], [ -124.066057, 41.470258 ], [ -124.075917, 41.501757 ], [ -124.081427, 41.511228 ], [ -124.081987, 41.547761 ], [ -124.092404, 41.553615 ], [ -124.101123, 41.569192 ], [ -124.101403, 41.578524 ], [ -124.097385, 41.585251 ], [ -124.105100, 41.594315 ], [ -124.100961, 41.602499 ], [ -124.114413, 41.616768 ], [ -124.116037, 41.628849 ], [ -124.120225, 41.640354 ], [ -124.135552, 41.657307 ], [ -124.139354, 41.671652 ], [ -124.138373, 41.678881 ], [ -124.143479, 41.709284 ], [ -124.147412, 41.717955 ], [ -124.154246, 41.728801 ], [ -124.164716, 41.740126 ], [ -124.177390, 41.745756 ], [ -124.185363, 41.739351 ], [ -124.191040, 41.736079 ], [ -124.194953, 41.736778 ], [ -124.203843, 41.747035 ], [ -124.239720, 41.770800 ], [ -124.242288, 41.772034 ], [ -124.248704, 41.771459 ], [ -124.255994, 41.783014 ], [ -124.245027, 41.792300 ], [ -124.230678, 41.818681 ], [ -124.219592, 41.846432 ], [ -124.208439, 41.888192 ], [ -124.203402, 41.940964 ], [ -124.204948, 41.983441 ], [ -124.211605, 41.998460 ], [ -124.126194, 41.996992 ], [ -124.100921, 41.996956 ], [ -124.100216, 41.996842 ], [ -124.087827, 41.996891 ], [ -124.086661, 41.996869 ], [ -124.001188, 41.996146 ], [ -123.834208, 41.996116 ], [ -123.821472, 41.995473 ], [ -123.813992, 41.995096 ], [ -123.789295, 41.996111 ], [ -123.728156, 41.997007 ], [ -123.656998, 41.995137 ], [ -123.624554, 41.999837 ], [ -123.552560, 42.000246 ], [ -123.525245, 42.001047 ], [ -123.501997, 42.000527 ], [ -123.498896, 42.000474 ], [ -123.498830, 42.000525 ], [ -123.434770, 42.001641 ], [ -123.381776, 41.999268 ], [ -123.347562, 41.999108 ], [ -123.230762, 42.003845 ], [ -123.192361, 42.005446 ], [ -123.154908, 42.008036 ], [ -123.145959, 42.009247 ], [ -123.083956, 42.005448 ], [ -123.065655, 42.004948 ], [ -123.045254, 42.003049 ], [ -122.941597, 42.003085 ], [ -122.893961, 42.002605 ], [ -122.876148, 42.003247 ], [ -122.800080, 42.004071 ], [ -122.712942, 42.004157 ], [ -122.634739, 42.004858 ], [ -122.501135, 42.008460 ], [ -122.397984, 42.008758 ], [ -122.378193, 42.009518 ], [ -122.289527, 42.007764 ], [ -122.261127, 42.007364 ], [ -122.161328, 42.007637 ], [ -122.160438, 42.007637 ], [ -122.156666, 42.007384 ], [ -122.155408, 42.007429 ], [ -122.101922, 42.005766 ], [ -122.000319, 42.003967 ], [ -121.846712, 42.003070 ], [ -121.708199, 42.000815 ], [ -121.705045, 42.000766 ], [ -121.689159, 42.000584 ], [ -121.675348, 42.000351 ], [ -121.580865, 41.998668 ], [ -121.520250, 41.997983 ], [ -121.439610, 41.997080 ], [ -121.434977, 41.997022 ], [ -121.376101, 41.997026 ], [ -121.360253, 41.996680 ], [ -121.340517, 41.996220 ], [ -121.335734, 41.996518 ], [ -121.334385, 41.996655 ], [ -121.309981, 41.997612 ], [ -121.251099, 41.997570 ], [ -121.247616, 41.997054 ], [ -121.126093, 41.996010 ], [ -121.094926, 41.994658 ], [ -121.035195, 41.993323 ], [ -120.879481, 41.993781 ], [ -120.812279, 41.994183 ], [ -120.693941, 41.993676 ], [ -120.692219, 41.993677 ], [ -120.647173, 41.993084 ], [ -120.501069, 41.993785 ], [ -120.326005, 41.993122 ], [ -120.286424, 41.993058 ], [ -120.181563, 41.994588 ], [ -120.001058, 41.995139 ], [ -119.999168, 41.994540 ], [ -119.999276, 41.874891 ], [ -119.998287, 41.749892 ], [ -119.998855, 41.624893 ], [ -119.998280, 41.618765 ], [ -119.999471, 41.499894 ], [ -119.999866, 41.183974 ], [ -119.999358, 40.873101 ], [ -119.999232, 40.867454 ], [ -119.999231, 40.865899 ], [ -119.998479, 40.749899 ], [ -119.997533, 40.720992 ], [ -119.995926, 40.499901 ], [ -119.996155, 40.321838 ], [ -119.996155, 40.321250 ], [ -119.996182, 40.263532 ], [ -119.996183, 40.262461 ], [ -119.997124, 40.126363 ], [ -119.997234, 40.091591 ], [ -119.997175, 40.077245 ], [ -119.997291, 40.071803 ], [ -119.997634, 39.956505 ], [ -119.999733, 39.851406 ], [ -120.000607, 39.780779 ], [ -120.000502, 39.779956 ], [ -120.001319, 39.722420 ], [ -120.001740, 39.538852 ], [ -120.003116, 39.445113 ], [ -120.004430, 39.374908 ], [ -120.004710, 39.330488 ], [ -120.005320, 39.316350 ], [ -120.005413, 39.313848 ], [ -120.005414, 39.313345 ], [ -120.005142, 39.291258 ], [ -120.005743, 39.228664 ], [ -120.005746, 39.225210 ], [ -120.002461, 39.067489 ], [ -120.001014, 38.999574 ], [ -119.904315, 38.933324 ], [ -119.587679, 38.714734 ], [ -119.587066, 38.714345 ], [ -119.585437, 38.713212 ], [ -119.494183, 38.649852 ], [ -119.494022, 38.649734 ], [ -119.450612, 38.619964 ], [ -119.450623, 38.619965 ], [ -119.375994, 38.566793 ], [ -119.370117, 38.563281 ], [ -119.333423, 38.538328 ], [ -119.279262, 38.499914 ], [ -119.250988, 38.480780 ], [ -119.234966, 38.468997 ], [ -119.125982, 38.393170 ], [ -119.097161, 38.372853 ], [ -119.082358, 38.361267 ], [ -119.030078, 38.325181 ], [ -119.000975, 38.303675 ], [ -118.949673, 38.268940 ], [ -118.922518, 38.249919 ], [ -118.859087, 38.204808 ], [ -118.771867, 38.141871 ], [ -118.746598, 38.124926 ], [ -118.714312, 38.102185 ], [ -118.621590, 38.034389 ], [ -118.571958, 37.999930 ], [ -118.500958, 37.949019 ], [ -118.250947, 37.768616 ], [ -118.052189, 37.624930 ], [ -118.039798, 37.615273 ], [ -118.039849, 37.615245 ], [ -117.975776, 37.569293 ], [ -117.904625, 37.515836 ], [ -117.875927, 37.497267 ], [ -117.832726, 37.464929 ], [ -117.712358, 37.374931 ], [ -117.680610, 37.353399 ], [ -117.581418, 37.278936 ], [ -117.540885, 37.249931 ], [ -117.500909, 37.220282 ], [ -117.500117, 37.220380 ], [ -117.375905, 37.126843 ], [ -117.266046, 37.044910 ], [ -117.244917, 37.030244 ], [ -117.131975, 36.945777 ], [ -117.066728, 36.896354 ], [ -117.000895, 36.847694 ], [ -116.541983, 36.499952 ], [ -116.500882, 36.468223 ], [ -116.488233, 36.459097 ], [ -116.380340, 36.374955 ], [ -116.375875, 36.372562 ], [ -116.250869, 36.276979 ], [ -116.097216, 36.158346 ], [ -116.093601, 36.155805 ], [ -115.912858, 36.015359 ], [ -115.892975, 35.999967 ], [ -115.852908, 35.969660 ], [ -115.750844, 35.889287 ], [ -115.689302, 35.842003 ], [ -115.669005, 35.826515 ], [ -115.647683, 35.809358 ], [ -115.647202, 35.808995 ], [ -115.627386, 35.793846 ], [ -115.625838, 35.792013 ], [ -115.500832, 35.693382 ], [ -115.412908, 35.624981 ], [ -115.406079, 35.618613 ], [ -115.404537, 35.617605 ], [ -115.393996, 35.609344 ], [ -115.391535, 35.607271 ], [ -115.303743, 35.538207 ], [ -115.271342, 35.512660 ], [ -115.160599, 35.424313 ], [ -115.160068, 35.424129 ], [ -115.146788, 35.413662 ], [ -115.145813, 35.413182 ], [ -115.125816, 35.396940 ], [ -115.102881, 35.379371 ], [ -115.098018, 35.374990 ], [ -115.043812, 35.332012 ], [ -114.942216, 35.249994 ], [ -114.925480, 35.237054 ], [ -114.925381, 35.237039 ], [ -114.805030, 35.140284 ], [ -114.804249, 35.139689 ], [ -114.633013, 35.002085 ], [ -114.629928, 34.994740 ], [ -114.629190, 34.991887 ], [ -114.629015, 34.986148 ], [ -114.629907, 34.980791 ], [ -114.634607, 34.969060 ], [ -114.635237, 34.965149 ], [ -114.634953, 34.958918 ], [ -114.631681, 34.951310 ], [ -114.629811, 34.944810 ], [ -114.629769, 34.943040 ], [ -114.629753, 34.938684 ], [ -114.632196, 34.930628 ], [ -114.633253, 34.924608 ], [ -114.633237, 34.921230 ], [ -114.630552, 34.911852 ], [ -114.630877, 34.907263 ], [ -114.635425, 34.895192 ], [ -114.636725, 34.889107 ], [ -114.636768, 34.885705 ], [ -114.635176, 34.875003 ], [ -114.634382, 34.872890 ], [ -114.630682, 34.866352 ], [ -114.623939, 34.859738 ], [ -114.619878, 34.856873 ], [ -114.604255, 34.849573 ], [ -114.600653, 34.847361 ], [ -114.592339, 34.841153 ], [ -114.586842, 34.835672 ], [ -114.581126, 34.826115 ], [ -114.576452, 34.815300 ], [ -114.574569, 34.805746 ], [ -114.571010, 34.794294 ], [ -114.558653, 34.773852 ], [ -114.552682, 34.766871 ], [ -114.546884, 34.761802 ], [ -114.540306, 34.757109 ], [ -114.529615, 34.750822 ], [ -114.525611, 34.747005 ], [ -114.522619, 34.743730 ], [ -114.521048, 34.741173 ], [ -114.516619, 34.736745 ], [ -114.510292, 34.733582 ], [ -114.503361, 34.731247 ], [ -114.495858, 34.727956 ], [ -114.492017, 34.725702 ], [ -114.490971, 34.724848 ], [ -114.486768, 34.719100 ], [ -114.481954, 34.716036 ], [ -114.477297, 34.714514 ], [ -114.473682, 34.713964 ], [ -114.471620, 34.712966 ], [ -114.470477, 34.711368 ], [ -114.468620, 34.707573 ], [ -114.468090, 34.701786 ], [ -114.465246, 34.691202 ], [ -114.462178, 34.685800 ], [ -114.456567, 34.677956 ], [ -114.455473, 34.675768 ], [ -114.454910, 34.673092 ], [ -114.454305, 34.671234 ], [ -114.452628, 34.668546 ], [ -114.451971, 34.666795 ], [ -114.451753, 34.665044 ], [ -114.451785, 34.663891 ], [ -114.452628, 34.659573 ], [ -114.451971, 34.657166 ], [ -114.451753, 34.654321 ], [ -114.449549, 34.651423 ], [ -114.444276, 34.646542 ], [ -114.441465, 34.642530 ], [ -114.440294, 34.638240 ], [ -114.441525, 34.631529 ], [ -114.441398, 34.630171 ], [ -114.438739, 34.621455 ], [ -114.428648, 34.614641 ], [ -114.424202, 34.610453 ], [ -114.424326, 34.602338 ], [ -114.425338, 34.600842 ], [ -114.427502, 34.599227 ], [ -114.430090, 34.596874 ], [ -114.429747, 34.595846 ], [ -114.429747, 34.591734 ], [ -114.422382, 34.580711 ], [ -114.405228, 34.569637 ], [ -114.389603, 34.542982 ], [ -114.380838, 34.529724 ], [ -114.378223, 34.516521 ], [ -114.378124, 34.507288 ], [ -114.381402, 34.499242 ], [ -114.382358, 34.495757 ], [ -114.383038, 34.488903 ], [ -114.381555, 34.477883 ], [ -114.381701, 34.476040 ], [ -114.383525, 34.470405 ], [ -114.387187, 34.462021 ], [ -114.387407, 34.460492 ], [ -114.386699, 34.457911 ], [ -114.378852, 34.450376 ], [ -114.375789, 34.447798 ], [ -114.373719, 34.446938 ], [ -114.363404, 34.447773 ], [ -114.356025, 34.449744 ], [ -114.342615, 34.451442 ], [ -114.339627, 34.451435 ], [ -114.335372, 34.450038 ], [ -114.332991, 34.448082 ], [ -114.330669, 34.445295 ], [ -114.326130, 34.437251 ], [ -114.319054, 34.435831 ], [ -114.312251, 34.432726 ], [ -114.301016, 34.426807 ], [ -114.294836, 34.421389 ], [ -114.292226, 34.417606 ], [ -114.291751, 34.411104 ], [ -114.290219, 34.408291 ], [ -114.288663, 34.406623 ], [ -114.286802, 34.405340 ], [ -114.280108, 34.403147 ], [ -114.267521, 34.402486 ], [ -114.264317, 34.401329 ], [ -114.252739, 34.390100 ], [ -114.248649, 34.388113 ], [ -114.245261, 34.385659 ], [ -114.234275, 34.376662 ], [ -114.229686, 34.368908 ], [ -114.226107, 34.365916 ], [ -114.213774, 34.362460 ], [ -114.199482, 34.361373 ], [ -114.191094, 34.356125 ], [ -114.185556, 34.354386 ], [ -114.181145, 34.352186 ], [ -114.176909, 34.349306 ], [ -114.172845, 34.344979 ], [ -114.168807, 34.339513 ], [ -114.157206, 34.317862 ], [ -114.140930, 34.305919 ], [ -114.138282, 34.303230 ], [ -114.138167, 34.300936 ], [ -114.139534, 34.295844 ], [ -114.138365, 34.288564 ], [ -114.136050, 34.280833 ], [ -114.137045, 34.277018 ], [ -114.136671, 34.274377 ], [ -114.134768, 34.268965 ], [ -114.134427, 34.266387 ], [ -114.134612, 34.263518 ], [ -114.136185, 34.261296 ], [ -114.139055, 34.259538 ], [ -114.144779, 34.259623 ], [ -114.147159, 34.259564 ], [ -114.153346, 34.258289 ], [ -114.156853, 34.258415 ], [ -114.159697, 34.258242 ], [ -114.161826, 34.257038 ], [ -114.163122, 34.255187 ], [ -114.163867, 34.253349 ], [ -114.164476, 34.251667 ], [ -114.166536, 34.249647 ], [ -114.173119, 34.247226 ], [ -114.174322, 34.245468 ], [ -114.175948, 34.242695 ], [ -114.176403, 34.241512 ], [ -114.178050, 34.239969 ], [ -114.190876, 34.230858 ], [ -114.208253, 34.215505 ], [ -114.211761, 34.211539 ], [ -114.215454, 34.208956 ], [ -114.223384, 34.205136 ], [ -114.225194, 34.203642 ], [ -114.225861, 34.201774 ], [ -114.224941, 34.193896 ], [ -114.227034, 34.188866 ], [ -114.229715, 34.186928 ], [ -114.240712, 34.183232 ], [ -114.244191, 34.179625 ], [ -114.254141, 34.173831 ], [ -114.268267, 34.170210 ], [ -114.275267, 34.172150 ], [ -114.287294, 34.170529 ], [ -114.292806, 34.166725 ], [ -114.312206, 34.144776 ], [ -114.320777, 34.138635 ], [ -114.324576, 34.136759 ], [ -114.336112, 34.134035 ], [ -114.348052, 34.134458 ], [ -114.353031, 34.133121 ], [ -114.356373, 34.130429 ], [ -114.360402, 34.123577 ], [ -114.366521, 34.118575 ], [ -114.369297, 34.117517 ], [ -114.379234, 34.115988 ], [ -114.390565, 34.110084 ], [ -114.401352, 34.111652 ], [ -114.405941, 34.111540 ], [ -114.411681, 34.110031 ], [ -114.415908, 34.107636 ], [ -114.420499, 34.103466 ], [ -114.426168, 34.097042 ], [ -114.428026, 34.092787 ], [ -114.433380, 34.088413 ], [ -114.434181, 34.087379 ], [ -114.435429, 34.079727 ], [ -114.437683, 34.071937 ], [ -114.439340, 34.057893 ], [ -114.439406, 34.053810 ], [ -114.438602, 34.050205 ], [ -114.435504, 34.042615 ], [ -114.434949, 34.037784 ], [ -114.436171, 34.028083 ], [ -114.438266, 34.022609 ], [ -114.440540, 34.019329 ], [ -114.443821, 34.016176 ], [ -114.450206, 34.012574 ], [ -114.454807, 34.010968 ], [ -114.458906, 34.010835 ], [ -114.461170, 34.010081 ], [ -114.462830, 34.008421 ], [ -114.463132, 34.006610 ], [ -114.462830, 34.004497 ], [ -114.460415, 33.999215 ], [ -114.460264, 33.996649 ], [ -114.461170, 33.994687 ], [ -114.462377, 33.993781 ], [ -114.466187, 33.993465 ], [ -114.467932, 33.992877 ], [ -114.471138, 33.988040 ], [ -114.475907, 33.984424 ], [ -114.481455, 33.981261 ], [ -114.482333, 33.980181 ], [ -114.483097, 33.977745 ], [ -114.484784, 33.975519 ], [ -114.495047, 33.966835 ], [ -114.499883, 33.961789 ], [ -114.509568, 33.957264 ], [ -114.511231, 33.957040 ], [ -114.515860, 33.958106 ], [ -114.522002, 33.955623 ], [ -114.528680, 33.947817 ], [ -114.535478, 33.934651 ], [ -114.534987, 33.928499 ], [ -114.533679, 33.926072 ], [ -114.528385, 33.923674 ], [ -114.525361, 33.922272 ], [ -114.518434, 33.917518 ], [ -114.511511, 33.911092 ], [ -114.508558, 33.906098 ], [ -114.507920, 33.903807 ], [ -114.507988, 33.901813 ], [ -114.508708, 33.900640 ], [ -114.510944, 33.899099 ], [ -114.513715, 33.897959 ], [ -114.516314, 33.896196 ], [ -114.517808, 33.894889 ], [ -114.518741, 33.893208 ], [ -114.518928, 33.891714 ], [ -114.518555, 33.889847 ], [ -114.517808, 33.888167 ], [ -114.516501, 33.885926 ], [ -114.512467, 33.882884 ], [ -114.504340, 33.876882 ], [ -114.503395, 33.875018 ], [ -114.503017, 33.867998 ], [ -114.503887, 33.865754 ], [ -114.505638, 33.864276 ], [ -114.514673, 33.858638 ], [ -114.516811, 33.858120 ], [ -114.524530, 33.858477 ], [ -114.526771, 33.857357 ], [ -114.528451, 33.854929 ], [ -114.529385, 33.851755 ], [ -114.529597, 33.848063 ], [ -114.525539, 33.838614 ], [ -114.523409, 33.835323 ], [ -114.520465, 33.827778 ], [ -114.519970, 33.825381 ], [ -114.520733, 33.822031 ], [ -114.522714, 33.818979 ], [ -114.527161, 33.816191 ], [ -114.528050, 33.814963 ], [ -114.520094, 33.799473 ], [ -114.516734, 33.788345 ], [ -114.507089, 33.767930 ], [ -114.504863, 33.760465 ], [ -114.504340, 33.756381 ], [ -114.504483, 33.750998 ], [ -114.506000, 33.746344 ], [ -114.508206, 33.741587 ], [ -114.512348, 33.734214 ], [ -114.510265, 33.732146 ], [ -114.506799, 33.730518 ], [ -114.504176, 33.728055 ], [ -114.502661, 33.724584 ], [ -114.500788, 33.722204 ], [ -114.496565, 33.719155 ], [ -114.494901, 33.714430 ], [ -114.494197, 33.707922 ], [ -114.495719, 33.698454 ], [ -114.496489, 33.696901 ], [ -114.504993, 33.693022 ], [ -114.512409, 33.691282 ], [ -114.519113, 33.688473 ], [ -114.523959, 33.685879 ], [ -114.527782, 33.682684 ], [ -114.530348, 33.679245 ], [ -114.531523, 33.675108 ], [ -114.530999, 33.671102 ], [ -114.529706, 33.668031 ], [ -114.528304, 33.666044 ], [ -114.526947, 33.664298 ], [ -114.525977, 33.662941 ], [ -114.525201, 33.661583 ], [ -114.525007, 33.659643 ], [ -114.525201, 33.658092 ], [ -114.525783, 33.657122 ], [ -114.526947, 33.655571 ], [ -114.528304, 33.653049 ], [ -114.530244, 33.650140 ], [ -114.530050, 33.647619 ], [ -114.529080, 33.644128 ], [ -114.527917, 33.641413 ], [ -114.526947, 33.637534 ], [ -114.526947, 33.633073 ], [ -114.528498, 33.630164 ], [ -114.529856, 33.627448 ], [ -114.529662, 33.622794 ], [ -114.527938, 33.618839 ], [ -114.525783, 33.616588 ], [ -114.524619, 33.614260 ], [ -114.524813, 33.611351 ], [ -114.526782, 33.608831 ], [ -114.529186, 33.606650 ], [ -114.540617, 33.591412 ], [ -114.540300, 33.580615 ], [ -114.535965, 33.569154 ], [ -114.535664, 33.568788 ], [ -114.526834, 33.557466 ], [ -114.524391, 33.553683 ], [ -114.524599, 33.552231 ], [ -114.542011, 33.542481 ], [ -114.558898, 33.531819 ], [ -114.559507, 33.530724 ], [ -114.560835, 33.524334 ], [ -114.560552, 33.518272 ], [ -114.560963, 33.516739 ], [ -114.569533, 33.509219 ], [ -114.573757, 33.507543 ], [ -114.580468, 33.506465 ], [ -114.588239, 33.502453 ], [ -114.591554, 33.499443 ], [ -114.597283, 33.490653 ], [ -114.599713, 33.484315 ], [ -114.601696, 33.481394 ], [ -114.607843, 33.474834 ], [ -114.612472, 33.470768 ], [ -114.622918, 33.456561 ], [ -114.623395, 33.454490 ], [ -114.622283, 33.447558 ], [ -114.627125, 33.433554 ], [ -114.629640, 33.428138 ], [ -114.635183, 33.422726 ], [ -114.643302, 33.416745 ], [ -114.649540, 33.413633 ], [ -114.652828, 33.412922 ], [ -114.658382, 33.413036 ], [ -114.673901, 33.418299 ], [ -114.687953, 33.417944 ], [ -114.695655, 33.415127 ], [ -114.696504, 33.414059 ], [ -114.696805, 33.412087 ], [ -114.697707, 33.410942 ], [ -114.701732, 33.408388 ], [ -114.710878, 33.407254 ], [ -114.720065, 33.407891 ], [ -114.723829, 33.406531 ], [ -114.725282, 33.405048 ], [ -114.725535, 33.404056 ], [ -114.725292, 33.402342 ], [ -114.722872, 33.398779 ], [ -114.713602, 33.388257 ], [ -114.708408, 33.384147 ], [ -114.707310, 33.382542 ], [ -114.707009, 33.380634 ], [ -114.707348, 33.376628 ], [ -114.699053, 33.361148 ], [ -114.698170, 33.356575 ], [ -114.698035, 33.352442 ], [ -114.700938, 33.337014 ], [ -114.705241, 33.327767 ], [ -114.707962, 33.323421 ], [ -114.710792, 33.320607 ], [ -114.723623, 33.312110 ], [ -114.729904, 33.305745 ], [ -114.731222, 33.304039 ], [ -114.731223, 33.302434 ], [ -114.723259, 33.288079 ], [ -114.721670, 33.286982 ], [ -114.717875, 33.285157 ], [ -114.711197, 33.283342 ], [ -114.702873, 33.281916 ], [ -114.694449, 33.279786 ], [ -114.684363, 33.276025 ], [ -114.680507, 33.273577 ], [ -114.677032, 33.270170 ], [ -114.672401, 33.260470 ], [ -114.672088, 33.258499 ], [ -114.674491, 33.255597 ], [ -114.688205, 33.247966 ], [ -114.689541, 33.246428 ], [ -114.689421, 33.245250 ], [ -114.682731, 33.234918 ], [ -114.678097, 33.230300 ], [ -114.674479, 33.225504 ], [ -114.673626, 33.223121 ], [ -114.673715, 33.219245 ], [ -114.676072, 33.210835 ], [ -114.678749, 33.203448 ], [ -114.678178, 33.199584 ], [ -114.675190, 33.188179 ], [ -114.675360, 33.185489 ], [ -114.675831, 33.181520 ], [ -114.679034, 33.174738 ], [ -114.680248, 33.169717 ], [ -114.678729, 33.162948 ], [ -114.679359, 33.159519 ], [ -114.682253, 33.155214 ], [ -114.684489, 33.148121 ], [ -114.687074, 33.142196 ], [ -114.689995, 33.137883 ], [ -114.696829, 33.131209 ], [ -114.703682, 33.113769 ], [ -114.706175, 33.105335 ], [ -114.707896, 33.097432 ], [ -114.707819, 33.091102 ], [ -114.706488, 33.088160 ], [ -114.704730, 33.087051 ], [ -114.701165, 33.086368 ], [ -114.694628, 33.086226 ], [ -114.692548, 33.085786 ], [ -114.689020, 33.084036 ], [ -114.688597, 33.082869 ], [ -114.689307, 33.079179 ], [ -114.689120, 33.076122 ], [ -114.686991, 33.070969 ], [ -114.674296, 33.057171 ], [ -114.675104, 33.047532 ], [ -114.673659, 33.041897 ], [ -114.670803, 33.037984 ], [ -114.665060, 33.033908 ], [ -114.662317, 33.032671 ], [ -114.659832, 33.032665 ], [ -114.657827, 33.033825 ], [ -114.655038, 33.037107 ], [ -114.649001, 33.046763 ], [ -114.645980, 33.048903 ], [ -114.641622, 33.046896 ], [ -114.639553, 33.045291 ], [ -114.634190, 33.039025 ], [ -114.628293, 33.031052 ], [ -114.625787, 33.029436 ], [ -114.618788, 33.027202 ], [ -114.601014, 33.025410 ], [ -114.589778, 33.026228 ], [ -114.586982, 33.026945 ], [ -114.584765, 33.028231 ], [ -114.581404, 33.032545 ], [ -114.578287, 33.035375 ], [ -114.575161, 33.036542 ], [ -114.571653, 33.036624 ], [ -114.553189, 33.033974 ], [ -114.538459, 33.033422 ], [ -114.523578, 33.030961 ], [ -114.520130, 33.029984 ], [ -114.514900, 33.026524 ], [ -114.511343, 33.023455 ], [ -114.506130, 33.017010 ], [ -114.502871, 33.011153 ], [ -114.499797, 33.003905 ], [ -114.497315, 32.991474 ], [ -114.495712, 32.980076 ], [ -114.494212, 32.974262 ], [ -114.492938, 32.971781 ], [ -114.490129, 32.969885 ], [ -114.488625, 32.969946 ], [ -114.481315, 32.972064 ], [ -114.480417, 32.973665 ], [ -114.476156, 32.975168 ], [ -114.470988, 32.974060 ], [ -114.469039, 32.972295 ], [ -114.467664, 32.966861 ], [ -114.467272, 32.960675 ], [ -114.467730, 32.956323 ], [ -114.469113, 32.952673 ], [ -114.470833, 32.949333 ], [ -114.474042, 32.945150 ], [ -114.478456, 32.940555 ], [ -114.480740, 32.937027 ], [ -114.480920, 32.935252 ], [ -114.479005, 32.928291 ], [ -114.476640, 32.923628 ], [ -114.473713, 32.920594 ], [ -114.464448, 32.913129 ], [ -114.463650, 32.911682 ], [ -114.462929, 32.907944 ], [ -114.463127, 32.901884 ], [ -114.465715, 32.879420 ], [ -114.465715, 32.879191 ], [ -114.465546, 32.874809 ], [ -114.468971, 32.845155 ], [ -114.475892, 32.838694 ], [ -114.494116, 32.823288 ], [ -114.496284, 32.822326 ], [ -114.496827, 32.822119 ], [ -114.510217, 32.816417 ], [ -114.515389, 32.811439 ], [ -114.519758, 32.805676 ], [ -114.520385, 32.803577 ], [ -114.522031, 32.801675 ], [ -114.528849, 32.796307 ], [ -114.530755, 32.793485 ], [ -114.531669, 32.791185 ], [ -114.531746, 32.782503 ], [ -114.532432, 32.776923 ], [ -114.531831, 32.774264 ], [ -114.528443, 32.767276 ], [ -114.526856, 32.757094 ], [ -114.539093, 32.756949 ], [ -114.539224, 32.749812 ], [ -114.564447, 32.749554 ], [ -114.564508, 32.742298 ], [ -114.581736, 32.742321 ], [ -114.581784, 32.734946 ], [ -114.612697, 32.734516 ], [ -114.614772, 32.734089 ], [ -114.615733, 32.729427 ], [ -114.615585, 32.728446 ], [ -114.618373, 32.728245 ], [ -114.632686, 32.730846 ], [ -114.658260, 32.733799 ], [ -114.658840, 32.733830 ], [ -114.667493, 32.734226 ], [ -114.677091, 32.736218 ], [ -114.678632, 32.736614 ], [ -114.684278, 32.737537 ], [ -114.688779, 32.737675 ], [ -114.698790, 32.744846 ], [ -114.700743, 32.745617 ], [ -114.701918, 32.745548 ], [ -114.705717, 32.741581 ], [ -114.714522, 32.730390 ], [ -114.715788, 32.727758 ], [ -114.717665, 32.721654 ], [ -114.719633, 32.718763 ], [ -115.000802, 32.699676 ], [ -115.465164, 32.667100 ], [ -116.046620, 32.623353 ], [ -116.115427, 32.617910 ], [ -116.125848, 32.616673 ], [ -116.211033, 32.610326 ], [ -116.540643, 32.583747 ], [ -116.627050, 32.576261 ], [ -116.857154, 32.557459 ], [ -116.928055, 32.550758 ], [ -116.945956, 32.550058 ], [ -117.026358, 32.542457 ], [ -117.062759, 32.539857 ], [ -117.124862, 32.534156 ] ] ], [ [ [ -119.050743, 33.463242 ], [ -119.048164, 33.483692 ], [ -119.038544, 33.483345 ], [ -119.029091, 33.488674 ], [ -119.027031, 33.475956 ], [ -119.032524, 33.465130 ], [ -119.050743, 33.463242 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US08", "STATE": "08", "NAME": "Colorado", "LSAD": "", "CENSUSAREA": 103641.888000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -102.042240, 36.993083 ], [ -102.054503, 36.993109 ], [ -102.184271, 36.993593 ], [ -102.208316, 36.993730 ], [ -102.260789, 36.994388 ], [ -102.355288, 36.994506 ], [ -102.355367, 36.994575 ], [ -102.698142, 36.995149 ], [ -102.742060, 36.997689 ], [ -102.759860, 37.000019 ], [ -102.778569, 36.999242 ], [ -102.806762, 37.000019 ], [ -102.814616, 37.000783 ], [ -102.841989, 36.999598 ], [ -102.979613, 36.998549 ], [ -102.985807, 36.998571 ], [ -102.986976, 36.998524 ], [ -103.002199, 37.000104 ], [ -103.155922, 37.000232 ], [ -103.733247, 36.998016 ], [ -103.734364, 36.998041 ], [ -104.007855, 36.996239 ], [ -104.250536, 36.994644 ], [ -104.338833, 36.993535 ], [ -104.519257, 36.993766 ], [ -104.624556, 36.994377 ], [ -104.625545, 36.993599 ], [ -104.645029, 36.993378 ], [ -104.732031, 36.993447 ], [ -104.732120, 36.993484 ], [ -105.000554, 36.993264 ], [ -105.029228, 36.992729 ], [ -105.120800, 36.995428 ], [ -105.220613, 36.995169 ], [ -105.251296, 36.995605 ], [ -105.419310, 36.995856 ], [ -105.442459, 36.995994 ], [ -105.447255, 36.996017 ], [ -105.465182, 36.995991 ], [ -105.508836, 36.995895 ], [ -105.512485, 36.995777 ], [ -105.533922, 36.995875 ], [ -105.627470, 36.995679 ], [ -105.664720, 36.995874 ], [ -105.716471, 36.995849 ], [ -105.996159, 36.995418 ], [ -105.997472, 36.995417 ], [ -106.006634, 36.995343 ], [ -106.201469, 36.994122 ], [ -106.247705, 36.994266 ], [ -106.248675, 36.994288 ], [ -106.293279, 36.993890 ], [ -106.343139, 36.994230 ], [ -106.500589, 36.993768 ], [ -106.617159, 36.992967 ], [ -106.617125, 36.993004 ], [ -106.628652, 36.993175 ], [ -106.628733, 36.993161 ], [ -106.661344, 36.993243 ], [ -106.675626, 36.993123 ], [ -106.750591, 36.992461 ], [ -106.869796, 36.992426 ], [ -106.877292, 37.000139 ], [ -107.420913, 37.000005 ], [ -108.000623, 37.000001 ], [ -108.249358, 36.999015 ], [ -108.250635, 36.999561 ], [ -108.288086, 36.999555 ], [ -108.288400, 36.999520 ], [ -108.320464, 36.999499 ], [ -108.320721, 36.999510 ], [ -108.619689, 36.999249 ], [ -108.620309, 36.999287 ], [ -108.954404, 36.998906 ], [ -108.958868, 36.998913 ], [ -109.045223, 36.999084 ], [ -109.045166, 37.072742 ], [ -109.045058, 37.074661 ], [ -109.044995, 37.086429 ], [ -109.045189, 37.096271 ], [ -109.045173, 37.109464 ], [ -109.045203, 37.111958 ], [ -109.045156, 37.112064 ], [ -109.045995, 37.177279 ], [ -109.045978, 37.201831 ], [ -109.045487, 37.210844 ], [ -109.045584, 37.249351 ], [ -109.046039, 37.249993 ], [ -109.045810, 37.374993 ], [ -109.043137, 37.499992 ], [ -109.041915, 37.530653 ], [ -109.041865, 37.530726 ], [ -109.041806, 37.604171 ], [ -109.042131, 37.617662 ], [ -109.042089, 37.623795 ], [ -109.042269, 37.666067 ], [ -109.041732, 37.711214 ], [ -109.041760, 37.713182 ], [ -109.041636, 37.740210 ], [ -109.042098, 37.749990 ], [ -109.041461, 37.800105 ], [ -109.041754, 37.835826 ], [ -109.041723, 37.842051 ], [ -109.041844, 37.872788 ], [ -109.041058, 37.907236 ], [ -109.043121, 37.974260 ], [ -109.042819, 37.997068 ], [ -109.042820, 37.999301 ], [ -109.041762, 38.164690 ], [ -109.054648, 38.244921 ], [ -109.060062, 38.275489 ], [ -109.059962, 38.499987 ], [ -109.060253, 38.599328 ], [ -109.059541, 38.719888 ], [ -109.057388, 38.795456 ], [ -109.054189, 38.874984 ], [ -109.053943, 38.904414 ], [ -109.053797, 38.905284 ], [ -109.053233, 38.942467 ], [ -109.053292, 38.942878 ], [ -109.052436, 38.999985 ], [ -109.051512, 39.126095 ], [ -109.050765, 39.366677 ], [ -109.051363, 39.497674 ], [ -109.050615, 39.874970 ], [ -109.050873, 40.058915 ], [ -109.050813, 40.059579 ], [ -109.050944, 40.180712 ], [ -109.050973, 40.180849 ], [ -109.050946, 40.444368 ], [ -109.050314, 40.495092 ], [ -109.050698, 40.499963 ], [ -109.049955, 40.539901 ], [ -109.050074, 40.540358 ], [ -109.048044, 40.619231 ], [ -109.048249, 40.653601 ], [ -109.049088, 40.714562 ], [ -109.048455, 40.826081 ], [ -109.050076, 41.000659 ], [ -108.884138, 41.000094 ], [ -108.631108, 41.000156 ], [ -108.526667, 40.999608 ], [ -108.500659, 41.000112 ], [ -108.250649, 41.000114 ], [ -108.181227, 41.000455 ], [ -108.046539, 41.002064 ], [ -107.918421, 41.002036 ], [ -107.625624, 41.002124 ], [ -107.367443, 41.003073 ], [ -107.241194, 41.002804 ], [ -107.000606, 41.003444 ], [ -106.857773, 41.002663 ], [ -106.453859, 41.002057 ], [ -106.439563, 41.001978 ], [ -106.437419, 41.001795 ], [ -106.430950, 41.001752 ], [ -106.391852, 41.001176 ], [ -106.386356, 41.001144 ], [ -106.321165, 40.999123 ], [ -106.217573, 40.997734 ], [ -106.061181, 40.996999 ], [ -105.730421, 40.996886 ], [ -105.724804, 40.996910 ], [ -105.277138, 40.998173 ], [ -105.256527, 40.998191 ], [ -105.254779, 40.998210 ], [ -104.855273, 40.998048 ], [ -104.829504, 40.999270 ], [ -104.675999, 41.000957 ], [ -104.497149, 41.001828 ], [ -104.497058, 41.001805 ], [ -104.467672, 41.001473 ], [ -104.214692, 41.001657 ], [ -104.214191, 41.001568 ], [ -104.211473, 41.001591 ], [ -104.123586, 41.001626 ], [ -104.104590, 41.001543 ], [ -104.086068, 41.001563 ], [ -104.066961, 41.001504 ], [ -104.053249, 41.001406 ], [ -104.039238, 41.001502 ], [ -104.023383, 41.001887 ], [ -104.018223, 41.001617 ], [ -103.972642, 41.001615 ], [ -103.971373, 41.001524 ], [ -103.953525, 41.001596 ], [ -103.906324, 41.001387 ], [ -103.896207, 41.001750 ], [ -103.877967, 41.001673 ], [ -103.858449, 41.001681 ], [ -103.750498, 41.002054 ], [ -103.574522, 41.001721 ], [ -103.497447, 41.001635 ], [ -103.486697, 41.001914 ], [ -103.421975, 41.002007 ], [ -103.421925, 41.001969 ], [ -103.396991, 41.002558 ], [ -103.365314, 41.001846 ], [ -103.362979, 41.001844 ], [ -103.077804, 41.002298 ], [ -103.076536, 41.002253 ], [ -103.059538, 41.002368 ], [ -103.057998, 41.002368 ], [ -103.043444, 41.002344 ], [ -103.038704, 41.002251 ], [ -103.002026, 41.002486 ], [ -103.000102, 41.002400 ], [ -102.982690, 41.002157 ], [ -102.981483, 41.002112 ], [ -102.963669, 41.002186 ], [ -102.962522, 41.002072 ], [ -102.960706, 41.002059 ], [ -102.959624, 41.002095 ], [ -102.944830, 41.002303 ], [ -102.943109, 41.002051 ], [ -102.925568, 41.002280 ], [ -102.924029, 41.002142 ], [ -102.906547, 41.002276 ], [ -102.904796, 41.002207 ], [ -102.887407, 41.002178 ], [ -102.885746, 41.002131 ], [ -102.867822, 41.002183 ], [ -102.865784, 41.001988 ], [ -102.849263, 41.002301 ], [ -102.846455, 41.002256 ], [ -102.830303, 41.002351 ], [ -102.827280, 41.002143 ], [ -102.773546, 41.002414 ], [ -102.766723, 41.002275 ], [ -102.754617, 41.002361 ], [ -102.739624, 41.002230 ], [ -102.653463, 41.002332 ], [ -102.621033, 41.002597 ], [ -102.578696, 41.002291 ], [ -102.575738, 41.002268 ], [ -102.575496, 41.002200 ], [ -102.566048, 41.002200 ], [ -102.556789, 41.002219 ], [ -102.487955, 41.002445 ], [ -102.470537, 41.002382 ], [ -102.469223, 41.002424 ], [ -102.379593, 41.002301 ], [ -102.364066, 41.002174 ], [ -102.292833, 41.002207 ], [ -102.292622, 41.002230 ], [ -102.292553, 41.002207 ], [ -102.291354, 41.002207 ], [ -102.272100, 41.002245 ], [ -102.267812, 41.002383 ], [ -102.231931, 41.002327 ], [ -102.212200, 41.002462 ], [ -102.209361, 41.002442 ], [ -102.191210, 41.002326 ], [ -102.124972, 41.002338 ], [ -102.070598, 41.002423 ], [ -102.051614, 41.002377 ], [ -102.051292, 40.749591 ], [ -102.051725, 40.537839 ], [ -102.051519, 40.520094 ], [ -102.051465, 40.440008 ], [ -102.051840, 40.396396 ], [ -102.051572, 40.393080 ], [ -102.051798, 40.360069 ], [ -102.051309, 40.338381 ], [ -102.051922, 40.235344 ], [ -102.051894, 40.229193 ], [ -102.051909, 40.162674 ], [ -102.052001, 40.148359 ], [ -102.051744, 40.003078 ], [ -102.051569, 39.849805 ], [ -102.051363, 39.843471 ], [ -102.051318, 39.833311 ], [ -102.051254, 39.818992 ], [ -102.050594, 39.675594 ], [ -102.050099, 39.653812 ], [ -102.050422, 39.646048 ], [ -102.049954, 39.592331 ], [ -102.049806, 39.574058 ], [ -102.049554, 39.538932 ], [ -102.049673, 39.536691 ], [ -102.049679, 39.506183 ], [ -102.049369, 39.423333 ], [ -102.049370, 39.418210 ], [ -102.049167, 39.403597 ], [ -102.048960, 39.373712 ], [ -102.048449, 39.303138 ], [ -102.047250, 39.137020 ], [ -102.047134, 39.129701 ], [ -102.046571, 39.047038 ], [ -102.045388, 38.813392 ], [ -102.045334, 38.799463 ], [ -102.045448, 38.783453 ], [ -102.045371, 38.770064 ], [ -102.045287, 38.755528 ], [ -102.045375, 38.754339 ], [ -102.045212, 38.697567 ], [ -102.045156, 38.688555 ], [ -102.045127, 38.686725 ], [ -102.045160, 38.675221 ], [ -102.045102, 38.674946 ], [ -102.045074, 38.669617 ], [ -102.045288, 38.615249 ], [ -102.045211, 38.581609 ], [ -102.045189, 38.558732 ], [ -102.045223, 38.543797 ], [ -102.045112, 38.523784 ], [ -102.045262, 38.505532 ], [ -102.045263, 38.505395 ], [ -102.045324, 38.453647 ], [ -102.044936, 38.419680 ], [ -102.044442, 38.415802 ], [ -102.044944, 38.384419 ], [ -102.044613, 38.312324 ], [ -102.044568, 38.268819 ], [ -102.044398, 38.250015 ], [ -102.044251, 38.141778 ], [ -102.044589, 38.125013 ], [ -102.044255, 38.113011 ], [ -102.044644, 38.045532 ], [ -102.043844, 37.928102 ], [ -102.043845, 37.926135 ], [ -102.043219, 37.867929 ], [ -102.043033, 37.824146 ], [ -102.042953, 37.803535 ], [ -102.042668, 37.788758 ], [ -102.042158, 37.760164 ], [ -102.041876, 37.723875 ], [ -102.041574, 37.680436 ], [ -102.041694, 37.665681 ], [ -102.041582, 37.654495 ], [ -102.041585, 37.644282 ], [ -102.041618, 37.607868 ], [ -102.041894, 37.557977 ], [ -102.041899, 37.541186 ], [ -102.042016, 37.535261 ], [ -102.041786, 37.506066 ], [ -102.041801, 37.469488 ], [ -102.041755, 37.434855 ], [ -102.041669, 37.434740 ], [ -102.041676, 37.409898 ], [ -102.041524, 37.375018 ], [ -102.042089, 37.352819 ], [ -102.041974, 37.352613 ], [ -102.041817, 37.309490 ], [ -102.041664, 37.297650 ], [ -102.041963, 37.258164 ], [ -102.042002, 37.141744 ], [ -102.042135, 37.125021 ], [ -102.042092, 37.125021 ], [ -102.041809, 37.111973 ], [ -102.041983, 37.106551 ], [ -102.041920, 37.035083 ], [ -102.041749, 37.034397 ], [ -102.041921, 37.032178 ], [ -102.041950, 37.030805 ], [ -102.041952, 37.024742 ], [ -102.042240, 36.993083 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US09", "STATE": "09", "NAME": "Connecticut", "LSAD": "", "CENSUSAREA": 4842.355000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -71.859570, 41.322399 ], [ -71.868235, 41.330941 ], [ -71.886302, 41.336410 ], [ -71.916710, 41.332217 ], [ -71.922092, 41.334518 ], [ -71.923282, 41.335113 ], [ -71.936284, 41.337959 ], [ -71.945652, 41.337799 ], [ -71.956747, 41.329871 ], [ -71.970955, 41.324526 ], [ -71.979447, 41.329987 ], [ -71.982194, 41.329861 ], [ -71.988153, 41.320577 ], [ -72.000293, 41.319232 ], [ -72.005143, 41.306687 ], [ -72.010838, 41.307033 ], [ -72.021898, 41.316838 ], [ -72.084487, 41.319634 ], [ -72.094443, 41.314164 ], [ -72.099820, 41.306998 ], [ -72.111820, 41.299098 ], [ -72.134221, 41.299398 ], [ -72.161580, 41.310262 ], [ -72.173922, 41.317597 ], [ -72.177622, 41.322497 ], [ -72.184122, 41.323997 ], [ -72.191022, 41.323197 ], [ -72.201422, 41.315697 ], [ -72.203022, 41.313197 ], [ -72.204022, 41.299097 ], [ -72.201400, 41.288470 ], [ -72.205109, 41.285187 ], [ -72.209992, 41.286065 ], [ -72.212924, 41.291365 ], [ -72.225276, 41.299047 ], [ -72.235531, 41.300413 ], [ -72.248161, 41.299488 ], [ -72.251895, 41.298620 ], [ -72.250515, 41.294386 ], [ -72.251323, 41.289997 ], [ -72.261487, 41.282926 ], [ -72.317760, 41.277782 ], [ -72.327595, 41.278460 ], [ -72.333894, 41.282916 ], [ -72.348643, 41.277446 ], [ -72.348068, 41.269698 ], [ -72.386629, 41.261798 ], [ -72.398688, 41.278172 ], [ -72.405930, 41.278398 ], [ -72.451925, 41.278885 ], [ -72.472539, 41.270103 ], [ -72.485693, 41.270881 ], [ -72.499534, 41.265866 ], [ -72.506634, 41.260099 ], [ -72.518660, 41.261253 ], [ -72.521312, 41.265600 ], [ -72.529416, 41.264421 ], [ -72.533247, 41.262690 ], [ -72.536746, 41.256207 ], [ -72.547235, 41.250499 ], [ -72.571136, 41.268098 ], [ -72.583336, 41.271698 ], [ -72.598036, 41.268698 ], [ -72.617237, 41.271998 ], [ -72.641538, 41.266998 ], [ -72.653838, 41.265897 ], [ -72.662838, 41.269197 ], [ -72.672339, 41.266997 ], [ -72.684939, 41.257597 ], [ -72.685539, 41.251297 ], [ -72.690439, 41.246697 ], [ -72.694744, 41.244970 ], [ -72.710595, 41.244480 ], [ -72.713674, 41.249007 ], [ -72.711208, 41.251018 ], [ -72.712460, 41.254167 ], [ -72.722439, 41.259138 ], [ -72.732813, 41.254727 ], [ -72.754444, 41.266913 ], [ -72.757477, 41.266913 ], [ -72.786142, 41.264796 ], [ -72.818737, 41.252244 ], [ -72.819372, 41.254061 ], [ -72.826883, 41.256755 ], [ -72.847767, 41.256690 ], [ -72.850210, 41.255544 ], [ -72.854055, 41.247740 ], [ -72.861344, 41.245297 ], [ -72.881445, 41.242597 ], [ -72.895445, 41.243697 ], [ -72.904345, 41.247297 ], [ -72.905245, 41.248297 ], [ -72.903045, 41.252797 ], [ -72.894745, 41.256197 ], [ -72.893845, 41.259897 ], [ -72.908200, 41.282932 ], [ -72.916827, 41.282033 ], [ -72.920062, 41.280056 ], [ -72.920846, 41.268897 ], [ -72.935646, 41.258497 ], [ -72.962047, 41.251597 ], [ -72.986247, 41.233497 ], [ -72.997948, 41.222697 ], [ -73.007548, 41.210197 ], [ -73.014948, 41.204297 ], [ -73.020149, 41.204097 ], [ -73.020449, 41.206397 ], [ -73.022549, 41.207197 ], [ -73.050650, 41.210197 ], [ -73.059350, 41.206697 ], [ -73.079450, 41.194015 ], [ -73.105493, 41.172194 ], [ -73.107987, 41.168738 ], [ -73.110352, 41.159697 ], [ -73.109952, 41.156997 ], [ -73.108352, 41.153718 ], [ -73.111052, 41.150797 ], [ -73.130253, 41.146797 ], [ -73.170074, 41.160532 ], [ -73.170701, 41.164945 ], [ -73.177774, 41.166697 ], [ -73.202656, 41.158096 ], [ -73.228295, 41.142602 ], [ -73.235058, 41.143996 ], [ -73.247958, 41.126396 ], [ -73.262358, 41.117496 ], [ -73.286759, 41.127896 ], [ -73.296359, 41.125696 ], [ -73.311860, 41.116296 ], [ -73.330660, 41.109996 ], [ -73.372296, 41.104020 ], [ -73.392162, 41.087696 ], [ -73.400154, 41.086299 ], [ -73.413670, 41.073258 ], [ -73.435063, 41.056696 ], [ -73.450364, 41.057096 ], [ -73.468239, 41.051347 ], [ -73.477364, 41.035997 ], [ -73.493327, 41.048173 ], [ -73.516903, 41.038738 ], [ -73.516766, 41.029497 ], [ -73.522666, 41.019297 ], [ -73.528866, 41.016397 ], [ -73.531169, 41.021919 ], [ -73.530189, 41.028776 ], [ -73.532786, 41.031670 ], [ -73.535338, 41.031920 ], [ -73.551494, 41.024336 ], [ -73.561968, 41.016797 ], [ -73.567668, 41.010897 ], [ -73.570068, 41.001597 ], [ -73.583968, 41.000897 ], [ -73.584988, 41.010537 ], [ -73.595699, 41.015995 ], [ -73.603952, 41.015054 ], [ -73.643478, 41.002171 ], [ -73.651175, 40.995229 ], [ -73.657336, 40.985171 ], [ -73.659671, 40.987909 ], [ -73.658772, 40.993497 ], [ -73.659372, 40.999497 ], [ -73.655571, 41.007697 ], [ -73.654671, 41.011697 ], [ -73.655371, 41.012797 ], [ -73.662672, 41.020497 ], [ -73.670472, 41.030097 ], [ -73.679973, 41.041797 ], [ -73.687173, 41.050697 ], [ -73.694273, 41.059296 ], [ -73.716875, 41.087596 ], [ -73.722575, 41.093596 ], [ -73.727775, 41.100696 ], [ -73.639672, 41.141495 ], [ -73.632153, 41.144921 ], [ -73.564941, 41.175170 ], [ -73.514617, 41.198434 ], [ -73.509487, 41.200814 ], [ -73.482709, 41.212760 ], [ -73.518384, 41.256719 ], [ -73.550961, 41.295422 ], [ -73.548929, 41.307598 ], [ -73.549574, 41.315931 ], [ -73.548973, 41.326297 ], [ -73.544728, 41.366375 ], [ -73.543425, 41.376622 ], [ -73.541169, 41.405994 ], [ -73.537673, 41.433905 ], [ -73.537469, 41.435890 ], [ -73.536969, 41.441094 ], [ -73.536067, 41.451331 ], [ -73.535986, 41.453060 ], [ -73.535885, 41.455236 ], [ -73.535857, 41.455709 ], [ -73.535769, 41.457159 ], [ -73.534369, 41.475894 ], [ -73.534269, 41.476394 ], [ -73.534269, 41.476911 ], [ -73.534150, 41.478060 ], [ -73.534055, 41.478968 ], [ -73.533969, 41.479693 ], [ -73.530067, 41.527194 ], [ -73.521041, 41.619773 ], [ -73.520017, 41.641197 ], [ -73.516785, 41.687581 ], [ -73.511921, 41.740941 ], [ -73.510961, 41.758749 ], [ -73.505008, 41.823773 ], [ -73.504944, 41.824285 ], [ -73.501984, 41.858717 ], [ -73.498304, 41.892508 ], [ -73.496527, 41.922380 ], [ -73.492975, 41.958524 ], [ -73.489615, 42.000092 ], [ -73.487314, 42.049638 ], [ -73.432812, 42.050587 ], [ -73.294420, 42.046984 ], [ -73.293097, 42.046940 ], [ -73.231056, 42.044945 ], [ -73.229798, 42.044877 ], [ -73.053254, 42.039861 ], [ -72.999549, 42.038653 ], [ -72.863733, 42.037710 ], [ -72.863619, 42.037709 ], [ -72.847142, 42.036894 ], [ -72.813541, 42.036494 ], [ -72.816741, 41.997595 ], [ -72.766739, 42.002995 ], [ -72.766139, 42.007695 ], [ -72.763265, 42.009742 ], [ -72.763238, 42.012795 ], [ -72.761238, 42.014595 ], [ -72.759738, 42.016995 ], [ -72.761354, 42.018183 ], [ -72.762310, 42.019775 ], [ -72.762151, 42.021527 ], [ -72.760558, 42.021846 ], [ -72.758151, 42.020865 ], [ -72.757467, 42.020947 ], [ -72.754038, 42.025395 ], [ -72.751738, 42.030195 ], [ -72.753538, 42.032095 ], [ -72.757538, 42.033295 ], [ -72.755838, 42.036195 ], [ -72.695927, 42.036788 ], [ -72.643134, 42.032395 ], [ -72.607933, 42.030795 ], [ -72.606933, 42.024995 ], [ -72.590233, 42.024695 ], [ -72.582332, 42.024695 ], [ -72.573231, 42.030141 ], [ -72.528131, 42.034295 ], [ -72.456680, 42.033999 ], [ -72.317148, 42.031907 ], [ -72.249523, 42.031626 ], [ -72.135687, 42.030245 ], [ -72.063496, 42.027347 ], [ -71.987326, 42.026880 ], [ -71.890780, 42.024368 ], [ -71.800650, 42.023569 ], [ -71.799242, 42.008065 ], [ -71.797922, 41.935395 ], [ -71.794161, 41.841101 ], [ -71.794161, 41.840141 ], [ -71.792786, 41.808670 ], [ -71.792767, 41.807001 ], [ -71.791062, 41.770273 ], [ -71.789678, 41.724734 ], [ -71.786994, 41.655992 ], [ -71.789356, 41.596910 ], [ -71.797683, 41.416709 ], [ -71.818390, 41.419599 ], [ -71.839649, 41.412119 ], [ -71.842563, 41.409855 ], [ -71.843472, 41.405830 ], [ -71.842131, 41.395359 ], [ -71.833443, 41.384524 ], [ -71.831613, 41.370899 ], [ -71.837738, 41.363529 ], [ -71.835951, 41.353935 ], [ -71.829595, 41.344544 ], [ -71.839013, 41.334042 ], [ -71.860513, 41.320248 ], [ -71.859570, 41.322399 ] ] ], [ [ [ -73.422165, 41.047562 ], [ -73.403610, 41.062687 ], [ -73.367859, 41.088120 ], [ -73.352051, 41.088120 ], [ -73.385735, 41.059250 ], [ -73.422165, 41.047562 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US10", "STATE": "10", "NAME": "Delaware", "LSAD": "", "CENSUSAREA": 1948.543000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -75.559446, 39.629812 ], [ -75.559102, 39.629056 ], [ -75.559614, 39.624208 ], [ -75.558446, 39.617296 ], [ -75.556878, 39.612144 ], [ -75.557502, 39.609184 ], [ -75.556734, 39.606688 ], [ -75.555870, 39.605824 ], [ -75.561934, 39.605216 ], [ -75.567694, 39.613744 ], [ -75.571759, 39.623584 ], [ -75.570798, 39.626768 ], [ -75.559446, 39.629812 ] ] ], [ [ [ -75.564927, 39.583248 ], [ -75.576271, 39.588144 ], [ -75.578719, 39.591504 ], [ -75.579615, 39.598656 ], [ -75.565823, 39.590608 ], [ -75.564927, 39.583248 ] ] ], [ [ [ -75.509742, 39.686113 ], [ -75.529744, 39.692613 ], [ -75.562246, 39.656712 ], [ -75.587147, 39.651012 ], [ -75.611969, 39.621968 ], [ -75.613153, 39.620960 ], [ -75.613377, 39.620288 ], [ -75.614065, 39.618320 ], [ -75.614929, 39.615952 ], [ -75.614273, 39.614640 ], [ -75.613345, 39.613056 ], [ -75.613665, 39.612560 ], [ -75.613233, 39.607408 ], [ -75.613477, 39.606861 ], [ -75.613473, 39.606832 ], [ -75.613793, 39.606192 ], [ -75.611905, 39.597568 ], [ -75.611873, 39.597408 ], [ -75.604640, 39.589920 ], [ -75.603584, 39.588960 ], [ -75.592224, 39.583568 ], [ -75.591984, 39.583248 ], [ -75.587744, 39.580672 ], [ -75.587200, 39.580256 ], [ -75.586608, 39.578880 ], [ -75.586016, 39.578448 ], [ -75.571599, 39.567728 ], [ -75.570783, 39.567280 ], [ -75.563034, 39.562240 ], [ -75.564649, 39.559922 ], [ -75.565636, 39.558509 ], [ -75.569359, 39.540589 ], [ -75.569418, 39.539124 ], [ -75.570362, 39.527223 ], [ -75.560728, 39.520472 ], [ -75.566933, 39.508273 ], [ -75.576436, 39.509195 ], [ -75.587729, 39.496353 ], [ -75.587729, 39.495369 ], [ -75.593068, 39.479186 ], [ -75.593068, 39.477996 ], [ -75.589901, 39.462022 ], [ -75.589439, 39.460812 ], [ -75.580185, 39.450786 ], [ -75.578914, 39.447880 ], [ -75.570985, 39.442486 ], [ -75.571830, 39.438897 ], [ -75.555890, 39.430351 ], [ -75.538512, 39.416502 ], [ -75.535977, 39.409384 ], [ -75.523583, 39.391583 ], [ -75.521682, 39.387871 ], [ -75.512996, 39.366153 ], [ -75.511788, 39.365191 ], [ -75.505276, 39.359169 ], [ -75.494158, 39.354613 ], [ -75.491797, 39.351845 ], [ -75.494122, 39.346580 ], [ -75.493148, 39.345527 ], [ -75.491688, 39.343963 ], [ -75.490377, 39.342818 ], [ -75.479845, 39.337472 ], [ -75.479963, 39.336577 ], [ -75.469324, 39.330820 ], [ -75.460423, 39.328236 ], [ -75.439027, 39.313384 ], [ -75.436936, 39.309379 ], [ -75.435551, 39.297546 ], [ -75.435374, 39.296676 ], [ -75.427953, 39.285049 ], [ -75.408376, 39.264698 ], [ -75.402964, 39.254626 ], [ -75.404823, 39.245898 ], [ -75.405927, 39.243631 ], [ -75.405716, 39.223834 ], [ -75.404745, 39.222666 ], [ -75.396892, 39.216141 ], [ -75.393015, 39.204512 ], [ -75.394790, 39.188354 ], [ -75.398584, 39.186616 ], [ -75.400144, 39.186456 ], [ -75.408266, 39.174625 ], [ -75.410625, 39.156246 ], [ -75.401193, 39.088762 ], [ -75.402035, 39.066885 ], [ -75.400294, 39.065645 ], [ -75.395806, 39.059211 ], [ -75.396277, 39.057884 ], [ -75.387914, 39.051174 ], [ -75.379873, 39.048790 ], [ -75.345763, 39.024857 ], [ -75.340890, 39.019960 ], [ -75.318354, 38.988191 ], [ -75.314951, 38.980775 ], [ -75.311607, 38.967637 ], [ -75.312546, 38.951065 ], [ -75.312546, 38.949280 ], [ -75.311882, 38.945698 ], [ -75.311542, 38.944633 ], [ -75.302552, 38.939002 ], [ -75.312282, 38.924594 ], [ -75.304078, 38.913160 ], [ -75.263115, 38.877351 ], [ -75.232029, 38.844254 ], [ -75.205329, 38.823386 ], [ -75.190552, 38.806861 ], [ -75.160748, 38.791224 ], [ -75.159022, 38.790193 ], [ -75.134022, 38.782242 ], [ -75.113331, 38.782998 ], [ -75.097103, 38.788703 ], [ -75.093654, 38.793992 ], [ -75.097197, 38.803101 ], [ -75.093805, 38.803812 ], [ -75.089473, 38.797198 ], [ -75.082153, 38.772157 ], [ -75.080217, 38.750112 ], [ -75.079221, 38.738238 ], [ -75.065510, 38.661030 ], [ -75.065217, 38.632394 ], [ -75.061920, 38.608869 ], [ -75.061259, 38.608602 ], [ -75.060478, 38.608012 ], [ -75.060032, 38.607709 ], [ -75.049748, 38.486387 ], [ -75.048939, 38.451263 ], [ -75.052510, 38.451273 ], [ -75.053483, 38.451274 ], [ -75.066327, 38.451291 ], [ -75.069909, 38.451276 ], [ -75.141894, 38.451196 ], [ -75.185413, 38.451013 ], [ -75.252723, 38.451397 ], [ -75.260350, 38.451492 ], [ -75.341250, 38.451970 ], [ -75.355797, 38.452008 ], [ -75.371054, 38.452107 ], [ -75.393563, 38.452114 ], [ -75.394786, 38.452160 ], [ -75.410884, 38.452400 ], [ -75.424831, 38.452610 ], [ -75.428728, 38.452671 ], [ -75.479150, 38.453699 ], [ -75.500142, 38.454144 ], [ -75.502961, 38.454220 ], [ -75.521304, 38.454657 ], [ -75.522730, 38.454657 ], [ -75.533763, 38.454958 ], [ -75.559212, 38.455563 ], [ -75.559934, 38.455579 ], [ -75.574110, 38.455991 ], [ -75.583601, 38.456424 ], [ -75.589307, 38.456286 ], [ -75.593082, 38.456404 ], [ -75.598069, 38.456855 ], [ -75.630457, 38.457904 ], [ -75.662843, 38.458759 ], [ -75.665585, 38.458900 ], [ -75.693521, 38.460128 ], [ -75.696369, 38.492373 ], [ -75.696688, 38.496467 ], [ -75.698777, 38.522001 ], [ -75.700179, 38.542717 ], [ -75.701565, 38.560736 ], [ -75.703445, 38.585120 ], [ -75.703981, 38.592066 ], [ -75.705774, 38.614740 ], [ -75.705860, 38.616268 ], [ -75.706235, 38.621296 ], [ -75.706585, 38.626125 ], [ -75.707346, 38.635280 ], [ -75.722028, 38.822078 ], [ -75.722610, 38.830008 ], [ -75.722882, 38.833156 ], [ -75.724002, 38.846682 ], [ -75.724061, 38.847781 ], [ -75.725565, 38.868152 ], [ -75.725829, 38.869296 ], [ -75.743811, 39.094674 ], [ -75.745793, 39.114935 ], [ -75.746121, 39.120318 ], [ -75.747668, 39.143306 ], [ -75.749356, 39.164815 ], [ -75.751028, 39.177762 ], [ -75.755953, 39.245958 ], [ -75.766667, 39.377216 ], [ -75.780786, 39.550262 ], [ -75.786890, 39.630575 ], [ -75.787450, 39.637455 ], [ -75.788658, 39.658211 ], [ -75.788616, 39.680742 ], [ -75.788658, 39.681911 ], [ -75.788395, 39.700031 ], [ -75.788395, 39.700287 ], [ -75.788359, 39.721811 ], [ -75.773558, 39.722411 ], [ -75.766058, 39.737811 ], [ -75.760346, 39.747231 ], [ -75.753066, 39.757631 ], [ -75.744394, 39.767855 ], [ -75.736489, 39.775759 ], [ -75.727049, 39.784126 ], [ -75.716969, 39.791998 ], [ -75.701208, 39.802606 ], [ -75.685991, 39.811054 ], [ -75.662822, 39.821150 ], [ -75.641518, 39.828363 ], [ -75.634706, 39.830164 ], [ -75.617251, 39.833999 ], [ -75.595756, 39.837156 ], [ -75.593666, 39.837455 ], [ -75.579849, 39.838526 ], [ -75.570464, 39.839007 ], [ -75.539346, 39.838211 ], [ -75.518444, 39.836311 ], [ -75.498843, 39.833312 ], [ -75.481242, 39.829112 ], [ -75.463341, 39.823812 ], [ -75.453740, 39.820312 ], [ -75.428038, 39.809212 ], [ -75.415041, 39.801786 ], [ -75.405337, 39.796213 ], [ -75.437938, 39.783413 ], [ -75.448639, 39.774113 ], [ -75.448135, 39.773969 ], [ -75.447339, 39.773313 ], [ -75.452339, 39.769013 ], [ -75.459439, 39.765813 ], [ -75.463339, 39.761213 ], [ -75.463039, 39.758313 ], [ -75.466249, 39.750769 ], [ -75.466263, 39.750737 ], [ -75.469239, 39.743613 ], [ -75.474168, 39.735473 ], [ -75.475384, 39.731057 ], [ -75.475440, 39.728713 ], [ -75.477240, 39.724713 ], [ -75.477432, 39.720561 ], [ -75.476888, 39.718337 ], [ -75.477640, 39.715013 ], [ -75.478940, 39.713813 ], [ -75.481741, 39.714546 ], [ -75.483141, 39.715513 ], [ -75.485241, 39.715813 ], [ -75.488553, 39.714833 ], [ -75.491341, 39.711113 ], [ -75.496241, 39.701413 ], [ -75.504042, 39.698313 ], [ -75.507162, 39.696961 ], [ -75.509042, 39.694513 ], [ -75.509742, 39.686113 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US11", "STATE": "11", "NAME": "District of Columbia", "LSAD": "", "CENSUSAREA": 61.048000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.038598, 38.791513 ], [ -77.038898, 38.800813 ], [ -77.035798, 38.814913 ], [ -77.038098, 38.815613 ], [ -77.039098, 38.821413 ], [ -77.038098, 38.828612 ], [ -77.039199, 38.832212 ], [ -77.041199, 38.833712 ], [ -77.042599, 38.833812 ], [ -77.043499, 38.833212 ], [ -77.044899, 38.834712 ], [ -77.044999, 38.838512 ], [ -77.044199, 38.840212 ], [ -77.041699, 38.840212 ], [ -77.032798, 38.841712 ], [ -77.031698, 38.850512 ], [ -77.039299, 38.864312 ], [ -77.038899, 38.865812 ], [ -77.039099, 38.868112 ], [ -77.040599, 38.871212 ], [ -77.043299, 38.874012 ], [ -77.045399, 38.875212 ], [ -77.046599, 38.874912 ], [ -77.045599, 38.873012 ], [ -77.046299, 38.871312 ], [ -77.049099, 38.870712 ], [ -77.051299, 38.873212 ], [ -77.051099, 38.875212 ], [ -77.054099, 38.879112 ], [ -77.055199, 38.880012 ], [ -77.058254, 38.880069 ], [ -77.063499, 38.888611 ], [ -77.067299, 38.899211 ], [ -77.068199, 38.899811 ], [ -77.070099, 38.900711 ], [ -77.082200, 38.901911 ], [ -77.090200, 38.904211 ], [ -77.093700, 38.905911 ], [ -77.101200, 38.911111 ], [ -77.103400, 38.912911 ], [ -77.106300, 38.919111 ], [ -77.113400, 38.925211 ], [ -77.116600, 38.928911 ], [ -77.117900, 38.932411 ], [ -77.119900, 38.934311 ], [ -77.104500, 38.946410 ], [ -77.100700, 38.948910 ], [ -77.091500, 38.956510 ], [ -77.054299, 38.985110 ], [ -77.040999, 38.995110 ], [ -77.036299, 38.991710 ], [ -77.015598, 38.975910 ], [ -77.013798, 38.974410 ], [ -77.008298, 38.970110 ], [ -77.002498, 38.965410 ], [ -76.935096, 38.913311 ], [ -76.909395, 38.892812 ], [ -76.910795, 38.891712 ], [ -76.919295, 38.885112 ], [ -76.920195, 38.884412 ], [ -76.949696, 38.861312 ], [ -76.953696, 38.858512 ], [ -76.979497, 38.837812 ], [ -76.992697, 38.828213 ], [ -76.999997, 38.821913 ], [ -77.001397, 38.821513 ], [ -77.038598, 38.791513 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US12", "STATE": "12", "NAME": "Florida", "LSAD": "", "CENSUSAREA": 53624.759000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -85.156415, 29.679628 ], [ -85.137397, 29.684348 ], [ -85.134639, 29.686569 ], [ -85.114268, 29.688658 ], [ -85.093902, 29.684838 ], [ -85.083719, 29.679019 ], [ -85.077237, 29.670862 ], [ -85.091399, 29.648634 ], [ -85.097218, 29.633004 ], [ -85.124913, 29.628433 ], [ -85.142746, 29.635404 ], [ -85.162520, 29.650282 ], [ -85.184530, 29.663987 ], [ -85.204314, 29.672695 ], [ -85.222546, 29.678039 ], [ -85.220324, 29.680138 ], [ -85.208981, 29.681775 ], [ -85.184776, 29.682710 ], [ -85.168625, 29.682409 ], [ -85.156415, 29.679628 ] ] ], [ [ [ -84.777208, 29.707398 ], [ -84.729836, 29.738881 ], [ -84.716994, 29.749066 ], [ -84.696726, 29.769930 ], [ -84.694125, 29.764593 ], [ -84.694939, 29.761844 ], [ -84.713747, 29.741390 ], [ -84.765117, 29.699724 ], [ -84.776954, 29.692191 ], [ -84.799129, 29.681565 ], [ -84.853829, 29.664720 ], [ -84.884632, 29.652248 ], [ -84.957779, 29.612635 ], [ -85.036219, 29.588919 ], [ -85.051033, 29.586928 ], [ -85.054624, 29.592084 ], [ -85.069453, 29.605282 ], [ -85.095190, 29.622490 ], [ -85.097082, 29.625215 ], [ -85.094882, 29.627757 ], [ -85.066530, 29.609952 ], [ -85.038497, 29.599552 ], [ -85.023501, 29.597073 ], [ -85.017205, 29.604379 ], [ -84.987775, 29.610307 ], [ -84.968314, 29.617238 ], [ -84.932592, 29.637232 ], [ -84.925842, 29.644949 ], [ -84.920333, 29.648638 ], [ -84.895885, 29.657444 ], [ -84.862099, 29.672572 ], [ -84.813352, 29.687028 ], [ -84.798160, 29.699321 ], [ -84.777208, 29.707398 ] ] ], [ [ [ -82.821585, 27.964443 ], [ -82.829801, 27.968469 ], [ -82.828625, 28.019795 ], [ -82.823025, 28.030695 ], [ -82.823063, 28.044758 ], [ -82.826282, 28.053450 ], [ -82.831825, 28.062893 ], [ -82.836326, 28.073193 ], [ -82.837439, 28.079730 ], [ -82.835425, 28.094841 ], [ -82.826125, 28.083793 ], [ -82.823063, 28.068258 ], [ -82.818288, 28.057613 ], [ -82.813435, 28.037160 ], [ -82.815168, 28.012547 ], [ -82.821408, 28.008387 ], [ -82.821755, 28.002494 ], [ -82.819060, 27.996278 ], [ -82.810605, 27.981268 ], [ -82.810605, 27.973535 ], [ -82.815168, 27.973721 ], [ -82.821585, 27.964443 ] ] ], [ [ [ -82.478063, 27.927680 ], [ -82.489817, 27.919600 ], [ -82.491117, 27.914500 ], [ -82.487417, 27.895001 ], [ -82.481420, 27.889097 ], [ -82.481763, 27.878098 ], [ -82.487883, 27.872072 ], [ -82.488057, 27.863566 ], [ -82.480137, 27.853246 ], [ -82.471624, 27.847342 ], [ -82.468840, 27.843295 ], [ -82.472440, 27.822559 ], [ -82.475273, 27.820991 ], [ -82.489849, 27.822607 ], [ -82.511193, 27.828015 ], [ -82.553946, 27.848462 ], [ -82.552918, 27.862702 ], [ -82.538618, 27.864901 ], [ -82.533218, 27.870701 ], [ -82.529918, 27.877501 ], [ -82.539318, 27.885001 ], [ -82.542818, 27.890601 ], [ -82.541747, 27.893706 ], [ -82.535818, 27.898000 ], [ -82.531318, 27.903900 ], [ -82.533718, 27.932999 ], [ -82.541218, 27.948998 ], [ -82.553918, 27.966998 ], [ -82.576003, 27.969424 ], [ -82.608650, 27.983245 ], [ -82.629590, 27.998474 ], [ -82.641487, 27.999426 ], [ -82.664806, 27.997046 ], [ -82.678606, 27.993715 ], [ -82.682414, 27.987053 ], [ -82.684793, 27.971824 ], [ -82.700134, 27.960307 ], [ -82.716522, 27.958398 ], [ -82.720522, 27.955798 ], [ -82.724122, 27.948098 ], [ -82.720122, 27.936399 ], [ -82.710022, 27.928299 ], [ -82.691621, 27.924899 ], [ -82.685121, 27.916299 ], [ -82.671221, 27.913000 ], [ -82.628063, 27.910397 ], [ -82.634220, 27.903700 ], [ -82.632120, 27.891100 ], [ -82.610020, 27.873501 ], [ -82.598443, 27.857582 ], [ -82.594819, 27.843402 ], [ -82.589319, 27.835702 ], [ -82.586519, 27.816703 ], [ -82.607420, 27.798904 ], [ -82.622723, 27.779868 ], [ -82.630520, 27.753905 ], [ -82.625020, 27.732706 ], [ -82.625720, 27.727006 ], [ -82.633620, 27.710607 ], [ -82.639820, 27.703907 ], [ -82.652521, 27.700307 ], [ -82.662921, 27.702307 ], [ -82.671621, 27.705907 ], [ -82.677321, 27.706207 ], [ -82.679251, 27.694665 ], [ -82.693748, 27.700217 ], [ -82.713629, 27.698661 ], [ -82.718822, 27.692007 ], [ -82.723022, 27.671208 ], [ -82.721622, 27.663908 ], [ -82.716322, 27.651409 ], [ -82.712555, 27.646647 ], [ -82.698091, 27.638858 ], [ -82.705017, 27.625310 ], [ -82.733076, 27.612972 ], [ -82.736552, 27.617326 ], [ -82.739122, 27.636909 ], [ -82.738022, 27.706807 ], [ -82.740323, 27.718206 ], [ -82.746223, 27.731306 ], [ -82.753723, 27.736306 ], [ -82.760923, 27.745205 ], [ -82.770023, 27.767904 ], [ -82.783124, 27.783804 ], [ -82.790224, 27.791603 ], [ -82.820433, 27.813742 ], [ -82.828561, 27.822254 ], [ -82.846526, 27.854301 ], [ -82.849126, 27.863200 ], [ -82.851126, 27.886300 ], [ -82.847826, 27.910199 ], [ -82.840882, 27.937162 ], [ -82.831388, 27.962117 ], [ -82.824875, 27.960201 ], [ -82.821975, 27.956868 ], [ -82.830819, 27.930926 ], [ -82.838484, 27.909111 ], [ -82.832155, 27.909242 ], [ -82.820715, 27.927268 ], [ -82.805462, 27.960201 ], [ -82.792635, 28.011160 ], [ -82.792635, 28.032307 ], [ -82.782724, 28.055894 ], [ -82.783824, 28.106292 ], [ -82.781324, 28.127591 ], [ -82.786624, 28.144991 ], [ -82.790724, 28.152490 ], [ -82.799024, 28.151790 ], [ -82.808474, 28.154803 ], [ -82.805097, 28.172181 ], [ -82.797762, 28.187789 ], [ -82.762643, 28.219013 ], [ -82.764460, 28.220069 ], [ -82.764103, 28.244345 ], [ -82.759072, 28.254020 ], [ -82.746188, 28.261192 ], [ -82.732792, 28.291933 ], [ -82.735463, 28.300390 ], [ -82.731460, 28.325075 ], [ -82.715822, 28.345501 ], [ -82.706112, 28.368057 ], [ -82.706322, 28.401325 ], [ -82.697433, 28.420166 ], [ -82.684137, 28.428019 ], [ -82.677839, 28.434367 ], [ -82.674787, 28.441956 ], [ -82.680396, 28.457194 ], [ -82.672410, 28.464746 ], [ -82.665055, 28.484434 ], [ -82.664470, 28.488788 ], [ -82.666390, 28.497330 ], [ -82.670146, 28.500769 ], [ -82.669416, 28.519879 ], [ -82.668040, 28.528199 ], [ -82.663705, 28.530193 ], [ -82.656694, 28.544814 ], [ -82.661729, 28.549743 ], [ -82.661650, 28.554143 ], [ -82.657050, 28.568028 ], [ -82.654138, 28.590837 ], [ -82.664055, 28.606584 ], [ -82.656649, 28.623727 ], [ -82.671815, 28.627604 ], [ -82.675596, 28.656475 ], [ -82.668034, 28.683285 ], [ -82.668722, 28.695658 ], [ -82.712373, 28.720921 ], [ -82.698281, 28.757010 ], [ -82.696906, 28.768009 ], [ -82.701030, 28.797224 ], [ -82.716497, 28.810285 ], [ -82.730245, 28.850155 ], [ -82.688657, 28.895180 ], [ -82.688864, 28.905609 ], [ -82.702618, 28.932955 ], [ -82.708793, 28.935979 ], [ -82.723861, 28.953506 ], [ -82.735754, 28.973709 ], [ -82.737872, 28.995703 ], [ -82.760551, 28.993087 ], [ -82.764055, 28.999707 ], [ -82.759378, 29.006619 ], [ -82.753513, 29.026496 ], [ -82.759704, 29.054192 ], [ -82.783328, 29.064619 ], [ -82.780558, 29.073580 ], [ -82.816925, 29.076215 ], [ -82.823659, 29.098902 ], [ -82.809483, 29.104620 ], [ -82.801166, 29.105103 ], [ -82.799117, 29.110647 ], [ -82.798876, 29.114504 ], [ -82.805703, 29.129848 ], [ -82.804736, 29.146624 ], [ -82.827073, 29.158425 ], [ -82.858179, 29.162275 ], [ -82.887211, 29.161741 ], [ -82.922613, 29.169769 ], [ -82.932405, 29.167891 ], [ -82.945302, 29.167821 ], [ -82.974676, 29.170910 ], [ -82.979522, 29.171817 ], [ -82.987162, 29.180094 ], [ -82.991653, 29.180664 ], [ -82.996144, 29.178074 ], [ -83.018212, 29.151417 ], [ -83.019071, 29.141324 ], [ -83.030453, 29.134023 ], [ -83.053207, 29.130839 ], [ -83.056867, 29.146263 ], [ -83.068249, 29.153135 ], [ -83.060947, 29.170959 ], [ -83.061162, 29.176113 ], [ -83.065242, 29.184489 ], [ -83.078986, 29.196944 ], [ -83.087839, 29.216420 ], [ -83.074734, 29.247975 ], [ -83.077265, 29.255331 ], [ -83.089013, 29.266502 ], [ -83.107477, 29.268889 ], [ -83.125567, 29.278845 ], [ -83.128027, 29.282733 ], [ -83.146445, 29.289194 ], [ -83.149764, 29.289768 ], [ -83.160730, 29.286611 ], [ -83.169576, 29.290355 ], [ -83.176736, 29.314220 ], [ -83.178260, 29.327916 ], [ -83.176852, 29.329269 ], [ -83.175518, 29.344690 ], [ -83.189581, 29.363417 ], [ -83.200702, 29.373855 ], [ -83.202446, 29.394422 ], [ -83.218075, 29.420492 ], [ -83.240509, 29.433178 ], [ -83.263965, 29.435806 ], [ -83.272019, 29.432256 ], [ -83.294747, 29.437923 ], [ -83.307094, 29.459651 ], [ -83.307828, 29.468861 ], [ -83.311546, 29.475666 ], [ -83.323214, 29.476789 ], [ -83.331130, 29.475594 ], [ -83.350067, 29.489358 ], [ -83.356722, 29.499901 ], [ -83.370288, 29.499901 ], [ -83.379254, 29.503558 ], [ -83.383973, 29.512995 ], [ -83.400252, 29.517242 ], [ -83.401552, 29.523291 ], [ -83.399830, 29.533042 ], [ -83.405256, 29.578319 ], [ -83.405068, 29.595570 ], [ -83.399480, 29.612956 ], [ -83.404081, 29.640798 ], [ -83.412768, 29.668485 ], [ -83.414701, 29.670536 ], [ -83.436259, 29.677389 ], [ -83.444635, 29.677155 ], [ -83.448194, 29.675254 ], [ -83.455356, 29.676444 ], [ -83.483143, 29.690478 ], [ -83.483567, 29.698542 ], [ -83.493728, 29.708388 ], [ -83.512716, 29.716480 ], [ -83.537645, 29.723060 ], [ -83.547172, 29.732223 ], [ -83.554993, 29.742600 ], [ -83.566018, 29.761434 ], [ -83.578955, 29.768378 ], [ -83.584716, 29.776080 ], [ -83.586089, 29.784644 ], [ -83.583045, 29.787307 ], [ -83.581903, 29.792063 ], [ -83.585899, 29.811754 ], [ -83.595493, 29.827984 ], [ -83.605244, 29.836387 ], [ -83.618568, 29.842336 ], [ -83.637980, 29.886073 ], [ -83.659951, 29.899524 ], [ -83.679219, 29.918513 ], [ -83.686423, 29.923735 ], [ -83.757249, 29.957943 ], [ -83.788729, 29.976982 ], [ -83.828690, 29.983187 ], [ -83.845427, 29.998068 ], [ -83.931510, 30.039068 ], [ -83.933668, 30.041152 ], [ -83.931879, 30.044175 ], [ -83.933432, 30.046305 ], [ -83.959680, 30.064943 ], [ -83.991607, 30.083920 ], [ -84.000716, 30.096209 ], [ -84.024274, 30.103271 ], [ -84.048715, 30.103208 ], [ -84.062990, 30.101378 ], [ -84.083057, 30.092286 ], [ -84.087034, 30.092103 ], [ -84.094725, 30.094964 ], [ -84.102730, 30.093611 ], [ -84.113840, 30.085478 ], [ -84.124889, 30.090601 ], [ -84.135683, 30.083018 ], [ -84.157278, 30.072714 ], [ -84.167881, 30.071422 ], [ -84.179149, 30.073187 ], [ -84.184493, 30.077254 ], [ -84.182217, 30.082359 ], [ -84.177405, 30.085452 ], [ -84.174999, 30.095763 ], [ -84.177062, 30.096107 ], [ -84.179811, 30.091982 ], [ -84.188060, 30.094045 ], [ -84.193560, 30.097826 ], [ -84.202152, 30.112261 ], [ -84.205589, 30.114323 ], [ -84.207652, 30.106762 ], [ -84.198530, 30.087937 ], [ -84.201585, 30.087982 ], [ -84.203349, 30.085875 ], [ -84.208010, 30.084776 ], [ -84.237014, 30.085560 ], [ -84.245668, 30.093021 ], [ -84.247491, 30.101140 ], [ -84.256439, 30.103791 ], [ -84.269363, 30.097660 ], [ -84.272511, 30.092358 ], [ -84.274003, 30.083079 ], [ -84.270368, 30.075469 ], [ -84.270792, 30.068094 ], [ -84.277168, 30.060263 ], [ -84.289727, 30.057197 ], [ -84.297836, 30.057451 ], [ -84.315344, 30.069492 ], [ -84.342022, 30.063858 ], [ -84.358923, 30.058224 ], [ -84.365882, 30.024588 ], [ -84.361962, 29.987739 ], [ -84.359986, 29.984739 ], [ -84.347700, 29.984123 ], [ -84.343041, 29.975100 ], [ -84.342046, 29.967101 ], [ -84.423335, 29.983354 ], [ -84.429865, 29.982667 ], [ -84.432958, 29.981292 ], [ -84.432271, 29.972356 ], [ -84.435708, 29.964107 ], [ -84.433646, 29.962388 ], [ -84.417816, 29.965500 ], [ -84.384133, 29.961375 ], [ -84.339426, 29.946007 ], [ -84.336511, 29.942508 ], [ -84.333746, 29.923721 ], [ -84.335953, 29.912962 ], [ -84.343389, 29.899539 ], [ -84.349066, 29.896812 ], [ -84.378937, 29.893112 ], [ -84.404958, 29.901229 ], [ -84.423834, 29.902996 ], [ -84.434287, 29.906328 ], [ -84.443652, 29.913785 ], [ -84.451705, 29.929085 ], [ -84.470323, 29.924524 ], [ -84.494562, 29.913957 ], [ -84.511996, 29.916574 ], [ -84.535873, 29.910092 ], [ -84.577440, 29.887828 ], [ -84.603303, 29.876117 ], [ -84.613154, 29.867984 ], [ -84.647958, 29.847104 ], [ -84.656318, 29.837943 ], [ -84.656450, 29.834277 ], [ -84.669728, 29.828910 ], [ -84.683934, 29.831327 ], [ -84.692053, 29.829059 ], [ -84.730327, 29.806900 ], [ -84.755595, 29.788540 ], [ -84.762998, 29.788846 ], [ -84.824197, 29.758288 ], [ -84.837168, 29.755926 ], [ -84.868271, 29.742454 ], [ -84.881777, 29.733882 ], [ -84.888031, 29.722406 ], [ -84.892493, 29.722660 ], [ -84.901781, 29.735723 ], [ -84.890066, 29.755802 ], [ -84.877111, 29.772888 ], [ -84.893992, 29.785176 ], [ -84.904130, 29.786279 ], [ -84.915110, 29.783303 ], [ -84.920917, 29.772901 ], [ -84.938370, 29.750211 ], [ -84.946595, 29.745032 ], [ -84.964007, 29.742422 ], [ -84.968841, 29.727080 ], [ -84.977004, 29.721209 ], [ -84.993264, 29.714961 ], [ -85.037212, 29.711074 ], [ -85.072123, 29.719027 ], [ -85.101682, 29.718748 ], [ -85.121473, 29.715854 ], [ -85.153238, 29.708231 ], [ -85.177284, 29.700193 ], [ -85.227450, 29.693633 ], [ -85.259719, 29.681296 ], [ -85.290740, 29.684081 ], [ -85.319215, 29.681494 ], [ -85.343619, 29.672004 ], [ -85.347711, 29.667190 ], [ -85.344768, 29.654793 ], [ -85.352615, 29.659787 ], [ -85.369419, 29.681048 ], [ -85.380303, 29.698485 ], [ -85.397871, 29.740498 ], [ -85.413983, 29.799865 ], [ -85.417971, 29.828855 ], [ -85.416548, 29.842628 ], [ -85.413575, 29.852940 ], [ -85.405815, 29.865817 ], [ -85.392469, 29.870914 ], [ -85.398740, 29.859267 ], [ -85.405011, 29.830151 ], [ -85.405907, 29.801930 ], [ -85.395528, 29.762368 ], [ -85.377960, 29.709621 ], [ -85.363800, 29.693526 ], [ -85.353885, 29.684765 ], [ -85.344986, 29.685015 ], [ -85.317661, 29.691286 ], [ -85.311390, 29.697557 ], [ -85.301331, 29.797117 ], [ -85.302591, 29.808094 ], [ -85.304877, 29.811096 ], [ -85.311420, 29.814373 ], [ -85.314547, 29.822279 ], [ -85.314783, 29.830575 ], [ -85.312911, 29.832273 ], [ -85.317464, 29.838894 ], [ -85.325008, 29.844966 ], [ -85.332289, 29.845905 ], [ -85.336654, 29.849295 ], [ -85.347044, 29.871981 ], [ -85.363731, 29.898915 ], [ -85.384730, 29.920949 ], [ -85.405052, 29.938487 ], [ -85.425956, 29.949888 ], [ -85.460488, 29.959579 ], [ -85.469425, 29.957788 ], [ -85.487764, 29.961227 ], [ -85.509148, 29.971466 ], [ -85.541176, 29.995791 ], [ -85.571907, 30.026440 ], [ -85.581390, 30.037783 ], [ -85.591048, 30.048874 ], [ -85.601178, 30.056342 ], [ -85.618254, 30.065481 ], [ -85.637285, 30.073319 ], [ -85.653251, 30.077839 ], [ -85.696810, 30.096890 ], [ -85.730054, 30.118153 ], [ -85.749930, 30.136537 ], [ -85.775405, 30.156290 ], [ -85.811219, 30.178320 ], [ -85.878138, 30.215619 ], [ -85.922600, 30.238024 ], [ -85.999937, 30.270780 ], [ -86.089963, 30.303569 ], [ -86.222561, 30.343585 ], [ -86.298700, 30.363049 ], [ -86.364175, 30.374524 ], [ -86.412076, 30.380346 ], [ -86.470849, 30.383900 ], [ -86.506150, 30.382300 ], [ -86.529067, 30.386896 ], [ -86.632953, 30.396299 ], [ -86.750906, 30.391881 ], [ -86.850625, 30.380967 ], [ -86.909679, 30.372423 ], [ -87.155392, 30.327748 ], [ -87.206254, 30.320943 ], [ -87.267827, 30.315480 ], [ -87.282787, 30.318744 ], [ -87.295422, 30.323503 ], [ -87.319518, 30.317814 ], [ -87.350486, 30.313064 ], [ -87.419859, 30.297128 ], [ -87.518324, 30.280435 ], [ -87.518380, 30.283901 ], [ -87.505480, 30.287101 ], [ -87.499980, 30.287901 ], [ -87.452378, 30.300201 ], [ -87.450078, 30.311100 ], [ -87.455578, 30.310200 ], [ -87.459578, 30.308300 ], [ -87.462978, 30.307800 ], [ -87.465778, 30.307600 ], [ -87.468678, 30.308200 ], [ -87.475879, 30.307900 ], [ -87.481879, 30.306001 ], [ -87.483679, 30.304801 ], [ -87.494879, 30.305001 ], [ -87.502780, 30.307301 ], [ -87.504680, 30.308901 ], [ -87.505780, 30.312500 ], [ -87.505943, 30.319396 ], [ -87.504701, 30.324039 ], [ -87.502572, 30.327405 ], [ -87.499980, 30.328957 ], [ -87.491879, 30.330900 ], [ -87.475579, 30.331400 ], [ -87.464878, 30.333300 ], [ -87.462978, 30.334000 ], [ -87.459978, 30.336300 ], [ -87.452278, 30.344099 ], [ -87.450962, 30.346262 ], [ -87.451978, 30.360299 ], [ -87.451878, 30.364999 ], [ -87.451378, 30.367199 ], [ -87.449078, 30.370399 ], [ -87.441823, 30.376304 ], [ -87.438678, 30.380798 ], [ -87.438678, 30.382098 ], [ -87.440878, 30.386698 ], [ -87.441178, 30.388598 ], [ -87.440678, 30.391498 ], [ -87.437278, 30.395898 ], [ -87.434278, 30.397498 ], [ -87.431778, 30.403198 ], [ -87.429578, 30.406498 ], [ -87.426177, 30.409198 ], [ -87.422677, 30.410098 ], [ -87.419177, 30.410198 ], [ -87.413177, 30.408998 ], [ -87.408877, 30.408798 ], [ -87.403477, 30.410198 ], [ -87.401777, 30.411398 ], [ -87.398776, 30.415098 ], [ -87.395676, 30.417597 ], [ -87.386376, 30.420497 ], [ -87.382076, 30.422897 ], [ -87.371169, 30.430490 ], [ -87.368191, 30.433407 ], [ -87.366591, 30.436648 ], [ -87.366939, 30.440480 ], [ -87.368680, 30.444631 ], [ -87.370768, 30.446865 ], [ -87.381176, 30.450097 ], [ -87.391976, 30.451597 ], [ -87.396877, 30.450597 ], [ -87.399877, 30.450997 ], [ -87.404677, 30.452897 ], [ -87.407877, 30.456396 ], [ -87.414677, 30.457296 ], [ -87.425078, 30.465596 ], [ -87.429578, 30.470596 ], [ -87.430578, 30.476596 ], [ -87.431578, 30.477696 ], [ -87.434678, 30.479196 ], [ -87.435578, 30.480496 ], [ -87.432978, 30.484896 ], [ -87.430578, 30.491096 ], [ -87.431178, 30.495795 ], [ -87.438269, 30.505357 ], [ -87.439690, 30.506649 ], [ -87.443220, 30.506782 ], [ -87.444714, 30.507494 ], [ -87.447702, 30.510458 ], [ -87.447782, 30.511913 ], [ -87.447305, 30.512629 ], [ -87.446499, 30.513569 ], [ -87.445182, 30.513980 ], [ -87.444944, 30.514943 ], [ -87.446427, 30.520306 ], [ -87.446586, 30.527068 ], [ -87.435440, 30.549140 ], [ -87.434963, 30.549599 ], [ -87.431441, 30.550263 ], [ -87.427891, 30.554159 ], [ -87.426037, 30.560073 ], [ -87.423362, 30.561425 ], [ -87.422805, 30.561379 ], [ -87.422408, 30.560439 ], [ -87.420925, 30.560668 ], [ -87.418647, 30.561837 ], [ -87.416660, 30.566306 ], [ -87.416951, 30.568003 ], [ -87.418513, 30.569561 ], [ -87.418354, 30.570043 ], [ -87.416261, 30.572448 ], [ -87.414513, 30.573456 ], [ -87.412712, 30.573227 ], [ -87.408736, 30.583701 ], [ -87.406558, 30.599928 ], [ -87.404597, 30.603389 ], [ -87.401178, 30.604397 ], [ -87.399270, 30.605611 ], [ -87.397308, 30.608728 ], [ -87.395026, 30.615281 ], [ -87.395053, 30.615900 ], [ -87.396430, 30.616909 ], [ -87.396430, 30.617734 ], [ -87.395659, 30.623372 ], [ -87.394479, 30.625192 ], [ -87.393775, 30.627006 ], [ -87.393588, 30.630880 ], [ -87.395941, 30.643968 ], [ -87.397185, 30.648117 ], [ -87.396177, 30.650454 ], [ -87.397262, 30.654351 ], [ -87.400177, 30.657217 ], [ -87.400707, 30.657148 ], [ -87.405874, 30.666616 ], [ -87.407118, 30.671796 ], [ -87.406561, 30.674019 ], [ -87.406958, 30.675165 ], [ -87.412739, 30.678055 ], [ -87.419527, 30.679981 ], [ -87.424883, 30.683374 ], [ -87.430372, 30.688645 ], [ -87.436021, 30.688668 ], [ -87.439814, 30.690479 ], [ -87.442280, 30.692679 ], [ -87.443580, 30.694604 ], [ -87.449362, 30.698913 ], [ -87.451404, 30.699806 ], [ -87.456948, 30.697560 ], [ -87.466338, 30.700835 ], [ -87.467717, 30.701683 ], [ -87.470397, 30.705281 ], [ -87.474429, 30.706586 ], [ -87.479579, 30.712865 ], [ -87.479819, 30.714950 ], [ -87.481225, 30.716508 ], [ -87.487036, 30.718500 ], [ -87.496772, 30.720353 ], [ -87.497515, 30.720123 ], [ -87.502317, 30.721590 ], [ -87.505153, 30.726313 ], [ -87.511729, 30.733535 ], [ -87.523613, 30.738306 ], [ -87.532607, 30.743489 ], [ -87.535365, 30.749775 ], [ -87.535416, 30.754760 ], [ -87.536528, 30.761383 ], [ -87.537085, 30.762530 ], [ -87.542260, 30.767504 ], [ -87.546160, 30.772020 ], [ -87.545364, 30.774105 ], [ -87.545044, 30.778666 ], [ -87.552051, 30.786254 ], [ -87.552954, 30.786941 ], [ -87.554838, 30.787125 ], [ -87.559484, 30.790447 ], [ -87.560068, 30.792258 ], [ -87.564209, 30.796246 ], [ -87.568140, 30.799088 ], [ -87.572043, 30.800532 ], [ -87.576849, 30.808163 ], [ -87.581869, 30.812403 ], [ -87.587870, 30.815037 ], [ -87.594297, 30.816984 ], [ -87.600486, 30.820627 ], [ -87.601630, 30.825140 ], [ -87.603570, 30.828624 ], [ -87.605776, 30.831304 ], [ -87.610982, 30.832632 ], [ -87.615923, 30.834693 ], [ -87.615367, 30.837031 ], [ -87.617281, 30.840353 ], [ -87.624137, 30.845713 ], [ -87.626075, 30.846494 ], [ -87.627323, 30.847961 ], [ -87.626497, 30.851880 ], [ -87.625380, 30.854355 ], [ -87.626228, 30.857127 ], [ -87.628245, 30.860131 ], [ -87.634938, 30.865886 ], [ -87.629987, 30.877686 ], [ -87.629454, 30.880115 ], [ -87.624400, 30.884696 ], [ -87.622062, 30.885408 ], [ -87.620788, 30.887494 ], [ -87.620922, 30.889923 ], [ -87.622519, 30.893680 ], [ -87.622203, 30.897508 ], [ -87.620715, 30.898930 ], [ -87.616013, 30.901453 ], [ -87.614951, 30.904226 ], [ -87.614209, 30.908536 ], [ -87.611847, 30.914541 ], [ -87.610200, 30.916628 ], [ -87.608262, 30.921900 ], [ -87.607811, 30.924490 ], [ -87.602684, 30.934277 ], [ -87.600691, 30.937074 ], [ -87.598299, 30.938793 ], [ -87.596890, 30.941131 ], [ -87.592055, 30.951492 ], [ -87.589187, 30.964464 ], [ -87.590917, 30.969414 ], [ -87.593046, 30.972966 ], [ -87.594111, 30.976335 ], [ -87.594164, 30.977572 ], [ -87.592676, 30.980140 ], [ -87.593395, 30.982959 ], [ -87.596722, 30.987610 ], [ -87.599172, 30.995722 ], [ -87.598928, 30.997457 ], [ -87.571281, 30.997870 ], [ -87.548543, 30.997927 ], [ -87.519520, 30.997586 ], [ -87.480243, 30.998202 ], [ -87.479703, 30.998197 ], [ -87.478706, 30.998213 ], [ -87.466879, 30.998178 ], [ -87.466827, 30.998178 ], [ -87.461783, 30.998201 ], [ -87.461638, 30.998202 ], [ -87.458658, 30.998386 ], [ -87.455705, 30.998318 ], [ -87.449811, 30.998272 ], [ -87.432292, 30.998205 ], [ -87.425774, 30.998090 ], [ -87.367842, 30.998292 ], [ -87.364011, 30.998218 ], [ -87.355656, 30.998244 ], [ -87.333973, 30.998272 ], [ -87.312183, 30.998435 ], [ -87.304030, 30.998191 ], [ -87.301567, 30.998434 ], [ -87.290995, 30.998352 ], [ -87.288905, 30.998345 ], [ -87.265564, 30.998267 ], [ -87.260540, 30.998195 ], [ -87.259689, 30.998172 ], [ -87.257960, 30.998263 ], [ -87.257002, 30.998194 ], [ -87.255592, 30.998216 ], [ -87.254980, 30.998285 ], [ -87.237685, 30.996393 ], [ -87.224746, 30.997169 ], [ -87.162614, 30.999055 ], [ -87.140755, 30.999532 ], [ -87.124969, 30.998802 ], [ -87.118873, 30.999427 ], [ -87.068633, 30.999143 ], [ -87.064063, 30.999191 ], [ -87.053737, 30.999131 ], [ -87.039989, 30.999594 ], [ -87.036366, 30.999348 ], [ -87.027107, 30.999255 ], [ -87.004359, 30.999316 ], [ -86.998477, 30.998661 ], [ -86.927810, 30.997704 ], [ -86.888135, 30.997577 ], [ -86.872989, 30.997631 ], [ -86.831934, 30.997378 ], [ -86.830497, 30.997401 ], [ -86.785918, 30.996978 ], [ -86.745240, 30.996290 ], [ -86.728392, 30.996739 ], [ -86.727293, 30.996882 ], [ -86.725379, 30.996872 ], [ -86.706261, 30.994703 ], [ -86.678383, 30.994537 ], [ -86.664681, 30.994534 ], [ -86.567586, 30.995109 ], [ -86.563436, 30.995223 ], [ -86.519938, 30.993245 ], [ -86.512834, 30.993700 ], [ -86.499950, 30.993340 ], [ -86.458319, 30.993998 ], [ -86.454704, 30.993791 ], [ -86.404912, 30.994049 ], [ -86.391937, 30.994172 ], [ -86.388647, 30.994181 ], [ -86.374545, 30.994474 ], [ -86.369270, 30.994477 ], [ -86.364907, 30.994455 ], [ -86.304596, 30.994029 ], [ -86.289247, 30.993798 ], [ -86.256448, 30.993853 ], [ -86.238335, 30.994370 ], [ -86.180232, 30.994005 ], [ -86.175204, 30.993798 ], [ -86.168979, 30.993706 ], [ -86.162886, 30.993682 ], [ -86.116918, 30.992917 ], [ -86.056213, 30.993133 ], [ -86.052462, 30.993247 ], [ -86.035039, 30.993320 ], [ -85.998643, 30.992870 ], [ -85.893543, 30.993467 ], [ -85.749932, 30.994837 ], [ -85.749619, 30.995292 ], [ -85.498272, 30.996928 ], [ -85.243632, 31.000884 ], [ -85.154452, 31.000835 ], [ -85.152218, 31.000834 ], [ -85.152085, 31.000888 ], [ -85.145835, 31.000695 ], [ -85.057534, 31.000585 ], [ -85.054802, 31.000585 ], [ -85.052088, 31.000585 ], [ -85.031155, 31.000647 ], [ -85.030107, 31.000653 ], [ -85.027512, 31.000670 ], [ -85.024108, 31.000681 ], [ -85.002368, 31.000682 ], [ -85.001900, 31.000681 ], [ -85.001819, 30.997889 ], [ -85.002540, 30.986899 ], [ -85.005934, 30.979804 ], [ -85.005931, 30.977040 ], [ -85.005105, 30.974704 ], [ -85.004026, 30.973468 ], [ -84.999928, 30.971186 ], [ -84.999828, 30.971486 ], [ -84.997628, 30.971186 ], [ -84.988027, 30.968786 ], [ -84.984827, 30.967486 ], [ -84.982527, 30.965586 ], [ -84.980127, 30.961286 ], [ -84.979627, 30.958986 ], [ -84.979627, 30.954686 ], [ -84.982227, 30.946886 ], [ -84.983027, 30.942586 ], [ -84.983627, 30.936986 ], [ -84.983127, 30.934786 ], [ -84.980627, 30.932687 ], [ -84.975226, 30.930787 ], [ -84.971026, 30.928187 ], [ -84.969426, 30.921987 ], [ -84.966726, 30.917287 ], [ -84.956125, 30.907587 ], [ -84.952325, 30.902287 ], [ -84.949625, 30.897387 ], [ -84.942525, 30.888488 ], [ -84.941325, 30.887688 ], [ -84.939974, 30.886728 ], [ -84.938087, 30.885627 ], [ -84.936828, 30.884683 ], [ -84.935413, 30.882481 ], [ -84.935570, 30.878707 ], [ -84.937615, 30.875876 ], [ -84.938401, 30.873045 ], [ -84.937772, 30.870528 ], [ -84.935728, 30.867540 ], [ -84.934627, 30.865495 ], [ -84.933997, 30.863293 ], [ -84.934627, 30.860620 ], [ -84.935413, 30.858418 ], [ -84.935256, 30.854328 ], [ -84.933224, 30.851488 ], [ -84.930065, 30.848824 ], [ -84.928807, 30.846779 ], [ -84.928335, 30.844263 ], [ -84.928335, 30.842532 ], [ -84.929436, 30.840331 ], [ -84.931953, 30.837499 ], [ -84.934155, 30.834039 ], [ -84.935256, 30.830894 ], [ -84.935570, 30.824603 ], [ -84.936042, 30.820671 ], [ -84.935413, 30.817210 ], [ -84.930923, 30.810489 ], [ -84.928323, 30.805090 ], [ -84.927923, 30.802790 ], [ -84.929023, 30.797290 ], [ -84.928323, 30.793090 ], [ -84.926723, 30.790190 ], [ -84.918023, 30.778090 ], [ -84.917423, 30.775890 ], [ -84.918023, 30.772090 ], [ -84.920123, 30.765990 ], [ -84.915022, 30.761191 ], [ -84.914322, 30.753591 ], [ -84.913522, 30.752291 ], [ -84.911122, 30.751191 ], [ -84.906322, 30.750591 ], [ -84.903122, 30.751791 ], [ -84.900222, 30.751891 ], [ -84.897622, 30.751391 ], [ -84.896122, 30.750591 ], [ -84.887522, 30.741791 ], [ -84.885221, 30.734991 ], [ -84.883821, 30.732591 ], [ -84.875421, 30.727491 ], [ -84.869752, 30.721897 ], [ -84.864693, 30.711542 ], [ -84.836324, 30.710709 ], [ -84.644815, 30.701992 ], [ -84.606386, 30.699865 ], [ -84.606249, 30.699872 ], [ -84.539370, 30.696775 ], [ -84.535042, 30.696523 ], [ -84.474409, 30.692793 ], [ -84.374905, 30.689794 ], [ -84.281210, 30.685256 ], [ -84.249900, 30.684145 ], [ -84.124895, 30.678046 ], [ -84.107699, 30.676818 ], [ -84.057228, 30.674705 ], [ -84.046605, 30.674200 ], [ -84.041810, 30.673878 ], [ -84.039707, 30.673819 ], [ -84.007391, 30.672097 ], [ -83.880317, 30.665807 ], [ -83.880220, 30.665832 ], [ -83.855216, 30.664412 ], [ -83.820886, 30.662612 ], [ -83.810536, 30.661880 ], [ -83.676773, 30.654905 ], [ -83.674058, 30.654747 ], [ -83.611667, 30.651255 ], [ -83.499876, 30.645671 ], [ -83.448895, 30.642410 ], [ -83.440021, 30.642023 ], [ -83.429584, 30.641496 ], [ -83.429477, 30.641519 ], [ -83.390062, 30.639333 ], [ -83.379460, 30.638680 ], [ -83.341011, 30.636346 ], [ -83.311647, 30.634577 ], [ -83.309455, 30.634417 ], [ -83.187391, 30.627223 ], [ -83.174411, 30.626444 ], [ -83.163309, 30.625895 ], [ -83.156170, 30.625504 ], [ -83.131370, 30.623583 ], [ -82.878779, 30.609082 ], [ -82.877259, 30.609024 ], [ -82.698902, 30.598271 ], [ -82.698618, 30.598232 ], [ -82.689271, 30.597719 ], [ -82.569237, 30.590965 ], [ -82.565476, 30.590622 ], [ -82.553159, 30.589934 ], [ -82.545055, 30.589361 ], [ -82.536233, 30.588885 ], [ -82.524899, 30.588189 ], [ -82.459544, 30.584272 ], [ -82.374844, 30.579004 ], [ -82.287343, 30.573458 ], [ -82.258100, 30.571559 ], [ -82.249841, 30.570863 ], [ -82.214839, 30.568591 ], [ -82.214385, 30.566958 ], [ -82.218579, 30.564403 ], [ -82.223025, 30.563210 ], [ -82.227254, 30.561041 ], [ -82.231916, 30.556270 ], [ -82.235603, 30.544885 ], [ -82.235820, 30.537187 ], [ -82.234952, 30.533066 ], [ -82.230752, 30.526758 ], [ -82.229399, 30.520823 ], [ -82.230377, 30.517339 ], [ -82.226933, 30.510281 ], [ -82.225026, 30.507830 ], [ -82.218514, 30.504187 ], [ -82.212852, 30.498751 ], [ -82.206445, 30.491877 ], [ -82.201416, 30.485164 ], [ -82.200938, 30.474438 ], [ -82.204614, 30.468868 ], [ -82.207708, 30.460503 ], [ -82.207522, 30.456928 ], [ -82.206040, 30.455507 ], [ -82.204823, 30.451840 ], [ -82.203975, 30.444507 ], [ -82.206486, 30.437081 ], [ -82.209870, 30.432818 ], [ -82.210291, 30.424590 ], [ -82.204151, 30.401330 ], [ -82.192940, 30.378779 ], [ -82.189847, 30.375938 ], [ -82.183797, 30.373712 ], [ -82.180018, 30.368625 ], [ -82.171508, 30.359869 ], [ -82.170054, 30.358929 ], [ -82.165192, 30.358035 ], [ -82.161757, 30.357851 ], [ -82.158109, 30.359913 ], [ -82.143282, 30.363393 ], [ -82.116385, 30.367335 ], [ -82.104834, 30.368319 ], [ -82.102500, 30.367823 ], [ -82.101416, 30.366556 ], [ -82.101798, 30.365336 ], [ -82.094687, 30.360781 ], [ -82.081106, 30.358806 ], [ -82.068533, 30.359184 ], [ -82.060034, 30.360328 ], [ -82.050069, 30.362338 ], [ -82.047917, 30.363265 ], [ -82.040746, 30.370158 ], [ -82.036825, 30.377884 ], [ -82.035871, 30.385287 ], [ -82.041164, 30.396841 ], [ -82.041990, 30.403266 ], [ -82.041164, 30.409966 ], [ -82.039971, 30.414280 ], [ -82.034005, 30.422357 ], [ -82.034464, 30.428048 ], [ -82.037209, 30.434518 ], [ -82.036203, 30.438460 ], [ -82.030064, 30.444853 ], [ -82.028212, 30.447396 ], [ -82.025457, 30.457755 ], [ -82.023734, 30.467289 ], [ -82.017779, 30.475081 ], [ -82.016982, 30.478779 ], [ -82.017297, 30.487638 ], [ -82.018222, 30.492085 ], [ -82.015892, 30.495499 ], [ -82.014770, 30.513009 ], [ -82.015826, 30.518166 ], [ -82.016990, 30.519358 ], [ -82.018868, 30.523828 ], [ -82.018361, 30.531184 ], [ -82.013216, 30.550091 ], [ -82.005477, 30.563495 ], [ -82.008091, 30.577018 ], [ -82.012109, 30.593773 ], [ -82.015708, 30.601704 ], [ -82.016503, 30.602484 ], [ -82.026941, 30.606153 ], [ -82.027338, 30.606726 ], [ -82.026541, 30.613303 ], [ -82.028499, 30.621829 ], [ -82.033927, 30.629603 ], [ -82.037609, 30.633271 ], [ -82.039941, 30.637144 ], [ -82.039092, 30.641132 ], [ -82.039595, 30.643309 ], [ -82.042271, 30.649452 ], [ -82.046114, 30.651767 ], [ -82.049507, 30.655548 ], [ -82.050432, 30.676266 ], [ -82.041812, 30.692376 ], [ -82.036426, 30.706585 ], [ -82.037563, 30.718640 ], [ -82.039154, 30.723178 ], [ -82.041010, 30.725080 ], [ -82.043795, 30.729641 ], [ -82.041168, 30.734248 ], [ -82.040026, 30.737548 ], [ -82.039634, 30.747727 ], [ -82.038967, 30.749262 ], [ -82.035964, 30.750998 ], [ -82.032645, 30.750674 ], [ -82.028400, 30.750981 ], [ -82.017917, 30.755263 ], [ -82.012660, 30.761289 ], [ -82.011597, 30.763122 ], [ -82.017881, 30.775844 ], [ -82.024035, 30.783156 ], [ -82.023848, 30.786685 ], [ -82.022866, 30.787991 ], [ -82.017051, 30.791657 ], [ -82.007865, 30.792937 ], [ -82.004973, 30.791744 ], [ -81.994972, 30.786073 ], [ -81.990855, 30.781611 ], [ -81.988605, 30.780056 ], [ -81.981273, 30.776767 ], [ -81.979061, 30.776415 ], [ -81.973856, 30.778487 ], [ -81.962534, 30.796526 ], [ -81.961989, 30.800443 ], [ -81.962441, 30.808441 ], [ -81.962739, 30.813636 ], [ -81.962175, 30.818001 ], [ -81.959759, 30.821168 ], [ -81.949787, 30.827493 ], [ -81.943168, 30.827434 ], [ -81.938381, 30.825745 ], [ -81.935444, 30.821131 ], [ -81.934655, 30.820424 ], [ -81.924448, 30.817566 ], [ -81.910926, 30.815889 ], [ -81.906279, 30.817015 ], [ -81.903745, 30.818986 ], [ -81.902337, 30.820817 ], [ -81.899380, 30.821662 ], [ -81.895720, 30.821098 ], [ -81.892904, 30.819268 ], [ -81.891281, 30.815945 ], [ -81.882725, 30.805124 ], [ -81.876882, 30.799516 ], [ -81.868608, 30.792754 ], [ -81.852626, 30.794439 ], [ -81.846286, 30.790548 ], [ -81.842058, 30.787120 ], [ -81.840375, 30.786384 ], [ -81.827014, 30.788933 ], [ -81.808529, 30.790014 ], [ -81.806652, 30.789683 ], [ -81.792769, 30.784432 ], [ -81.784350, 30.773590 ], [ -81.782653, 30.769937 ], [ -81.779171, 30.768062 ], [ -81.775021, 30.768330 ], [ -81.772611, 30.769535 ], [ -81.770468, 30.772481 ], [ -81.768192, 30.773954 ], [ -81.763372, 30.773820 ], [ -81.759338, 30.771377 ], [ -81.755074, 30.768319 ], [ -81.751283, 30.767082 ], [ -81.747572, 30.766455 ], [ -81.746312, 30.765891 ], [ -81.745035, 30.765039 ], [ -81.744183, 30.763868 ], [ -81.743438, 30.762271 ], [ -81.743094, 30.759912 ], [ -81.742736, 30.759201 ], [ -81.732227, 30.749634 ], [ -81.727127, 30.746934 ], [ -81.719927, 30.744634 ], [ -81.694778, 30.748414 ], [ -81.692815, 30.747100 ], [ -81.691818, 30.743990 ], [ -81.690990, 30.742841 ], [ -81.688925, 30.741434 ], [ -81.672824, 30.738935 ], [ -81.670124, 30.740235 ], [ -81.669324, 30.741335 ], [ -81.668275, 30.744643 ], [ -81.667336, 30.745660 ], [ -81.664598, 30.746599 ], [ -81.662173, 30.746521 ], [ -81.656541, 30.745113 ], [ -81.652123, 30.742435 ], [ -81.651723, 30.740235 ], [ -81.652161, 30.735648 ], [ -81.651770, 30.732284 ], [ -81.650440, 30.729703 ], [ -81.649188, 30.728686 ], [ -81.646137, 30.727591 ], [ -81.633266, 30.729603 ], [ -81.629609, 30.732407 ], [ -81.625098, 30.733017 ], [ -81.621929, 30.731188 ], [ -81.620822, 30.729535 ], [ -81.619613, 30.724849 ], [ -81.617663, 30.722046 ], [ -81.609495, 30.720705 ], [ -81.607667, 30.721924 ], [ -81.605716, 30.725337 ], [ -81.604010, 30.727287 ], [ -81.601206, 30.728141 ], [ -81.593648, 30.725459 ], [ -81.586820, 30.723735 ], [ -81.573719, 30.722336 ], [ -81.571419, 30.721636 ], [ -81.566219, 30.717836 ], [ -81.561706, 30.715597 ], [ -81.552566, 30.716974 ], [ -81.549186, 30.715972 ], [ -81.546932, 30.714345 ], [ -81.544679, 30.713969 ], [ -81.542675, 30.713593 ], [ -81.540923, 30.713343 ], [ -81.539295, 30.713468 ], [ -81.537668, 30.714345 ], [ -81.535539, 30.716348 ], [ -81.534517, 30.717936 ], [ -81.534037, 30.719853 ], [ -81.532785, 30.721606 ], [ -81.530531, 30.722858 ], [ -81.528278, 30.723359 ], [ -81.521417, 30.722536 ], [ -81.516116, 30.722236 ], [ -81.507216, 30.722936 ], [ -81.489537, 30.726100 ], [ -81.487332, 30.726081 ], [ -81.483786, 30.723891 ], [ -81.475754, 30.714754 ], [ -81.472597, 30.713312 ], [ -81.464465, 30.711045 ], [ -81.459978, 30.710434 ], [ -81.448718, 30.709353 ], [ -81.444124, 30.709714 ], [ -81.432725, 30.703017 ], [ -81.427420, 30.698020 ], [ -81.430843, 30.669393 ], [ -81.443099, 30.600938 ], [ -81.442564, 30.555189 ], [ -81.434064, 30.522569 ], [ -81.447087, 30.503679 ], [ -81.440108, 30.497678 ], [ -81.426010, 30.496739 ], [ -81.410809, 30.482039 ], [ -81.407008, 30.422040 ], [ -81.397422, 30.400626 ], [ -81.397360, 30.396967 ], [ -81.389789, 30.397422 ], [ -81.397067, 30.379511 ], [ -81.396407, 30.340040 ], [ -81.391606, 30.303441 ], [ -81.385505, 30.273841 ], [ -81.355591, 30.162563 ], [ -81.308978, 29.969440 ], [ -81.295268, 29.928614 ], [ -81.288955, 29.915180 ], [ -81.276540, 29.900460 ], [ -81.270442, 29.883106 ], [ -81.264693, 29.858212 ], [ -81.263396, 29.820663 ], [ -81.256711, 29.784693 ], [ -81.240924, 29.739218 ], [ -81.229015, 29.714693 ], [ -81.211565, 29.667085 ], [ -81.163581, 29.555290 ], [ -81.123896, 29.474465 ], [ -81.046678, 29.307856 ], [ -80.966176, 29.147960 ], [ -80.944376, 29.110861 ], [ -80.907275, 29.064262 ], [ -80.893675, 29.036163 ], [ -80.878275, 29.010563 ], [ -80.787021, 28.875266 ], [ -80.709725, 28.756692 ], [ -80.647288, 28.677875 ], [ -80.616790, 28.634561 ], [ -80.583884, 28.597705 ], [ -80.574868, 28.585166 ], [ -80.567361, 28.562353 ], [ -80.560973, 28.530736 ], [ -80.536115, 28.478647 ], [ -80.525094, 28.459454 ], [ -80.526732, 28.451705 ], [ -80.562877, 28.437779 ], [ -80.574136, 28.427764 ], [ -80.587813, 28.410856 ], [ -80.596174, 28.390682 ], [ -80.603374, 28.363983 ], [ -80.606874, 28.336484 ], [ -80.608074, 28.311285 ], [ -80.604214, 28.257733 ], [ -80.589975, 28.177990 ], [ -80.566432, 28.095630 ], [ -80.547675, 28.048795 ], [ -80.508871, 27.970477 ], [ -80.446973, 27.861954 ], [ -80.447179, 27.859731 ], [ -80.383695, 27.740045 ], [ -80.351717, 27.642623 ], [ -80.350553, 27.628361 ], [ -80.344370, 27.616226 ], [ -80.330956, 27.597541 ], [ -80.324699, 27.569178 ], [ -80.311757, 27.524625 ], [ -80.301170, 27.500314 ], [ -80.293171, 27.500314 ], [ -80.265535, 27.420542 ], [ -80.253665, 27.379790 ], [ -80.233538, 27.341307 ], [ -80.226753, 27.322736 ], [ -80.193090, 27.249546 ], [ -80.161470, 27.192814 ], [ -80.153375, 27.169308 ], [ -80.159554, 27.163325 ], [ -80.149820, 27.143557 ], [ -80.138605, 27.111517 ], [ -80.116772, 27.072397 ], [ -80.093909, 27.018587 ], [ -80.046263, 26.859238 ], [ -80.031362, 26.796339 ], [ -80.032120, 26.771530 ], [ -80.036362, 26.771240 ], [ -80.037462, 26.766340 ], [ -80.032862, 26.715242 ], [ -80.032862, 26.700842 ], [ -80.035763, 26.676043 ], [ -80.035363, 26.612346 ], [ -80.038863, 26.569347 ], [ -80.050363, 26.509549 ], [ -80.060564, 26.444652 ], [ -80.070564, 26.336455 ], [ -80.072264, 26.335356 ], [ -80.075264, 26.318656 ], [ -80.079865, 26.264358 ], [ -80.085565, 26.249259 ], [ -80.089365, 26.231859 ], [ -80.101366, 26.147762 ], [ -80.105266, 26.096264 ], [ -80.109566, 26.087165 ], [ -80.117778, 25.986369 ], [ -80.117904, 25.915772 ], [ -80.120870, 25.883152 ], [ -80.119684, 25.841043 ], [ -80.122056, 25.817913 ], [ -80.127394, 25.791224 ], [ -80.127987, 25.772245 ], [ -80.137476, 25.750301 ], [ -80.144000, 25.740812 ], [ -80.152896, 25.702855 ], [ -80.154082, 25.683283 ], [ -80.152303, 25.676759 ], [ -80.154972, 25.665490 ], [ -80.160903, 25.664897 ], [ -80.176916, 25.685062 ], [ -80.170392, 25.710565 ], [ -80.164461, 25.721833 ], [ -80.166241, 25.728950 ], [ -80.172765, 25.737847 ], [ -80.184626, 25.745557 ], [ -80.197674, 25.744370 ], [ -80.229107, 25.732509 ], [ -80.240376, 25.724206 ], [ -80.244528, 25.717089 ], [ -80.250459, 25.688028 ], [ -80.265879, 25.658373 ], [ -80.267065, 25.651849 ], [ -80.277147, 25.637022 ], [ -80.288416, 25.630498 ], [ -80.296719, 25.622195 ], [ -80.301464, 25.613299 ], [ -80.305615, 25.593134 ], [ -80.305615, 25.575342 ], [ -80.302057, 25.567632 ], [ -80.313918, 25.539164 ], [ -80.324594, 25.535605 ], [ -80.328746, 25.532640 ], [ -80.339421, 25.499427 ], [ -80.339421, 25.478669 ], [ -80.337049, 25.465621 ], [ -80.328152, 25.443084 ], [ -80.320442, 25.437153 ], [ -80.326373, 25.422919 ], [ -80.325780, 25.398010 ], [ -80.320442, 25.391486 ], [ -80.310360, 25.389707 ], [ -80.306801, 25.384369 ], [ -80.310360, 25.373100 ], [ -80.335269, 25.338701 ], [ -80.352469, 25.329805 ], [ -80.361662, 25.327433 ], [ -80.374116, 25.317350 ], [ -80.383013, 25.301337 ], [ -80.379690, 25.288463 ], [ -80.393438, 25.271965 ], [ -80.394469, 25.253061 ], [ -80.412686, 25.248593 ], [ -80.418872, 25.235532 ], [ -80.432621, 25.235876 ], [ -80.442588, 25.242750 ], [ -80.462833, 25.236247 ], [ -80.467824, 25.232540 ], [ -80.469842, 25.230443 ], [ -80.481136, 25.226046 ], [ -80.488700, 25.226936 ], [ -80.493150, 25.225157 ], [ -80.493150, 25.218482 ], [ -80.485865, 25.211281 ], [ -80.488035, 25.206942 ], [ -80.495341, 25.199463 ], [ -80.498644, 25.200150 ], [ -80.508113, 25.206719 ], [ -80.512928, 25.216719 ], [ -80.520359, 25.220788 ], [ -80.523190, 25.220080 ], [ -80.530207, 25.216207 ], [ -80.534640, 25.211252 ], [ -80.535197, 25.207915 ], [ -80.532416, 25.198460 ], [ -80.536309, 25.197348 ], [ -80.554107, 25.209027 ], [ -80.556888, 25.207915 ], [ -80.556888, 25.197348 ], [ -80.563006, 25.191786 ], [ -80.569124, 25.190117 ], [ -80.584771, 25.200665 ], [ -80.609609, 25.181901 ], [ -80.619024, 25.177328 ], [ -80.624185, 25.183443 ], [ -80.605275, 25.190674 ], [ -80.605275, 25.195123 ], [ -80.610837, 25.198460 ], [ -80.645876, 25.189005 ], [ -80.655331, 25.184556 ], [ -80.659224, 25.179550 ], [ -80.654219, 25.177881 ], [ -80.633640, 25.181775 ], [ -80.633990, 25.176829 ], [ -80.640275, 25.176620 ], [ -80.645822, 25.174029 ], [ -80.649251, 25.168708 ], [ -80.648657, 25.157859 ], [ -80.651994, 25.151185 ], [ -80.650326, 25.147292 ], [ -80.650326, 25.144511 ], [ -80.669236, 25.137837 ], [ -80.675910, 25.137280 ], [ -80.677578, 25.142286 ], [ -80.661449, 25.155078 ], [ -80.655887, 25.161752 ], [ -80.656942, 25.168216 ], [ -80.679850, 25.166751 ], [ -80.678273, 25.172042 ], [ -80.681611, 25.173293 ], [ -80.697462, 25.162865 ], [ -80.695037, 25.157588 ], [ -80.701270, 25.146683 ], [ -80.703718, 25.139115 ], [ -80.709141, 25.144511 ], [ -80.712896, 25.151185 ], [ -80.717901, 25.154522 ], [ -80.723324, 25.152019 ], [ -80.719153, 25.148682 ], [ -80.721885, 25.145101 ], [ -80.742877, 25.142646 ], [ -80.755991, 25.150038 ], [ -80.756642, 25.155904 ], [ -80.764464, 25.159163 ], [ -80.768374, 25.157859 ], [ -80.765767, 25.148082 ], [ -80.769678, 25.137002 ], [ -80.777499, 25.135047 ], [ -80.780758, 25.139609 ], [ -80.775544, 25.149386 ], [ -80.782062, 25.161118 ], [ -80.791186, 25.161770 ], [ -80.795097, 25.157207 ], [ -80.795097, 25.144824 ], [ -80.798356, 25.140913 ], [ -80.802266, 25.140913 ], [ -80.804874, 25.154600 ], [ -80.796218, 25.172450 ], [ -80.798356, 25.179367 ], [ -80.807481, 25.181975 ], [ -80.809436, 25.178064 ], [ -80.806177, 25.172850 ], [ -80.815183, 25.164959 ], [ -80.826530, 25.160478 ], [ -80.830034, 25.168094 ], [ -80.838227, 25.174791 ], [ -80.846395, 25.177060 ], [ -80.858167, 25.176576 ], [ -80.875460, 25.174321 ], [ -80.900066, 25.162034 ], [ -80.901617, 25.153803 ], [ -80.898911, 25.147652 ], [ -80.900577, 25.139669 ], [ -80.915924, 25.141301 ], [ -80.943216, 25.134443 ], [ -80.957427, 25.135704 ], [ -80.971765, 25.133958 ], [ -80.999176, 25.124222 ], [ -81.009598, 25.125403 ], [ -81.022989, 25.129393 ], [ -81.050505, 25.128273 ], [ -81.079859, 25.118797 ], [ -81.094524, 25.127054 ], [ -81.111943, 25.145470 ], [ -81.120616, 25.152302 ], [ -81.133567, 25.156295 ], [ -81.141024, 25.163868 ], [ -81.142278, 25.183000 ], [ -81.146737, 25.193139 ], [ -81.155481, 25.208098 ], [ -81.172044, 25.222276 ], [ -81.170907, 25.245857 ], [ -81.168307, 25.253178 ], [ -81.162070, 25.289833 ], [ -81.159293, 25.298595 ], [ -81.152300, 25.305543 ], [ -81.148915, 25.318067 ], [ -81.151916, 25.324766 ], [ -81.148103, 25.332793 ], [ -81.140099, 25.341117 ], [ -81.133913, 25.342996 ], [ -81.121410, 25.338750 ], [ -81.118208, 25.345220 ], [ -81.117265, 25.354953 ], [ -81.128492, 25.380511 ], [ -81.141395, 25.381358 ], [ -81.150508, 25.387255 ], [ -81.150656, 25.399206 ], [ -81.147144, 25.404297 ], [ -81.146765, 25.407577 ], [ -81.168652, 25.463848 ], [ -81.179406, 25.475427 ], [ -81.191924, 25.484745 ], [ -81.208201, 25.504937 ], [ -81.210149, 25.516888 ], [ -81.203175, 25.534160 ], [ -81.204389, 25.538908 ], [ -81.209321, 25.548611 ], [ -81.225557, 25.558470 ], [ -81.232705, 25.573366 ], [ -81.233051, 25.586587 ], [ -81.240519, 25.599041 ], [ -81.240677, 25.613629 ], [ -81.253951, 25.638181 ], [ -81.268924, 25.656927 ], [ -81.277374, 25.664980 ], [ -81.290328, 25.687506 ], [ -81.328935, 25.717233 ], [ -81.335037, 25.715649 ], [ -81.346078, 25.721473 ], [ -81.345972, 25.736536 ], [ -81.343984, 25.747668 ], [ -81.346767, 25.754029 ], [ -81.355116, 25.760390 ], [ -81.359489, 25.766354 ], [ -81.361875, 25.772715 ], [ -81.344779, 25.782257 ], [ -81.340406, 25.786631 ], [ -81.341598, 25.794582 ], [ -81.349152, 25.816847 ], [ -81.352731, 25.822015 ], [ -81.362272, 25.824401 ], [ -81.386127, 25.839906 ], [ -81.394476, 25.851834 ], [ -81.417536, 25.864954 ], [ -81.424295, 25.867737 ], [ -81.429066, 25.865351 ], [ -81.441391, 25.863761 ], [ -81.458487, 25.868929 ], [ -81.471607, 25.881652 ], [ -81.473992, 25.888411 ], [ -81.487510, 25.888411 ], [ -81.501027, 25.884037 ], [ -81.508979, 25.884037 ], [ -81.512955, 25.886423 ], [ -81.511762, 25.896760 ], [ -81.515738, 25.899941 ], [ -81.527665, 25.901531 ], [ -81.541183, 25.900338 ], [ -81.577363, 25.889206 ], [ -81.584519, 25.888808 ], [ -81.614735, 25.893977 ], [ -81.623482, 25.897158 ], [ -81.644553, 25.897953 ], [ -81.654493, 25.893579 ], [ -81.663821, 25.885605 ], [ -81.672633, 25.856654 ], [ -81.678287, 25.845301 ], [ -81.684800, 25.847205 ], [ -81.689540, 25.852710 ], [ -81.713172, 25.897568 ], [ -81.717687, 25.902039 ], [ -81.727086, 25.907207 ], [ -81.731950, 25.931506 ], [ -81.738118, 25.942009 ], [ -81.745579, 25.949643 ], [ -81.749724, 25.960463 ], [ -81.747834, 25.994273 ], [ -81.750668, 25.998425 ], [ -81.757463, 26.000374 ], [ -81.762439, 26.006070 ], [ -81.801663, 26.088227 ], [ -81.808833, 26.152246 ], [ -81.814610, 26.173167 ], [ -81.816810, 26.207166 ], [ -81.820675, 26.236735 ], [ -81.833142, 26.294518 ], [ -81.844555, 26.327712 ], [ -81.868983, 26.378648 ], [ -81.901910, 26.410859 ], [ -81.902710, 26.416159 ], [ -81.911710, 26.427158 ], [ -81.923611, 26.436658 ], [ -81.938411, 26.445058 ], [ -81.956611, 26.452358 ], [ -81.964212, 26.457957 ], [ -81.967112, 26.462857 ], [ -81.966212, 26.465057 ], [ -81.969509, 26.476505 ], [ -81.980712, 26.480957 ], [ -81.997012, 26.484856 ], [ -82.008961, 26.484052 ], [ -82.013680, 26.490829 ], [ -82.009080, 26.505203 ], [ -82.024604, 26.512677 ], [ -82.043577, 26.519577 ], [ -82.067150, 26.513252 ], [ -82.071750, 26.492554 ], [ -82.094748, 26.483930 ], [ -82.105672, 26.483930 ], [ -82.111996, 26.540850 ], [ -82.118896, 26.560973 ], [ -82.122345, 26.579371 ], [ -82.137869, 26.637441 ], [ -82.149943, 26.654115 ], [ -82.181565, 26.681712 ], [ -82.179840, 26.696661 ], [ -82.173516, 26.701836 ], [ -82.151668, 26.704136 ], [ -82.139019, 26.702986 ], [ -82.125795, 26.699536 ], [ -82.118896, 26.690912 ], [ -82.106247, 26.667339 ], [ -82.099922, 26.662739 ], [ -82.093023, 26.665614 ], [ -82.086698, 26.685162 ], [ -82.084974, 26.702411 ], [ -82.079799, 26.716784 ], [ -82.066575, 26.742657 ], [ -82.061401, 26.774279 ], [ -82.061401, 26.789228 ], [ -82.055076, 26.802452 ], [ -82.057951, 26.822000 ], [ -82.058526, 26.838674 ], [ -82.056801, 26.858797 ], [ -82.059101, 26.876621 ], [ -82.066575, 26.882370 ], [ -82.090723, 26.888694 ], [ -82.093023, 26.906518 ], [ -82.090148, 26.923191 ], [ -82.083249, 26.927791 ], [ -82.067725, 26.927791 ], [ -82.061976, 26.931241 ], [ -82.061401, 26.938715 ], [ -82.063126, 26.950214 ], [ -82.076349, 26.958263 ], [ -82.107972, 26.957688 ], [ -82.117171, 26.954239 ], [ -82.124645, 26.945615 ], [ -82.137294, 26.926066 ], [ -82.162017, 26.925491 ], [ -82.169491, 26.923191 ], [ -82.175241, 26.916867 ], [ -82.172941, 26.897319 ], [ -82.156267, 26.851898 ], [ -82.147068, 26.789803 ], [ -82.151093, 26.783479 ], [ -82.172941, 26.778879 ], [ -82.178690, 26.772555 ], [ -82.221812, 26.771980 ], [ -82.233311, 26.784054 ], [ -82.241935, 26.774279 ], [ -82.251134, 26.755881 ], [ -82.259867, 26.717398 ], [ -82.263804, 26.725644 ], [ -82.264682, 26.756836 ], [ -82.269499, 26.784674 ], [ -82.289086, 26.827784 ], [ -82.301736, 26.841588 ], [ -82.351649, 26.908384 ], [ -82.400618, 26.984937 ], [ -82.419218, 27.020736 ], [ -82.445718, 27.060634 ], [ -82.460319, 27.099933 ], [ -82.465319, 27.110732 ], [ -82.468890, 27.113612 ], [ -82.477019, 27.141231 ], [ -82.512319, 27.207528 ], [ -82.539719, 27.254326 ], [ -82.545120, 27.261026 ], [ -82.559020, 27.268826 ], [ -82.569754, 27.279452 ], [ -82.569248, 27.298588 ], [ -82.576020, 27.309324 ], [ -82.597629, 27.335754 ], [ -82.623863, 27.362206 ], [ -82.642821, 27.389720 ], [ -82.675121, 27.424318 ], [ -82.691821, 27.437218 ], [ -82.691004, 27.444331 ], [ -82.707821, 27.487615 ], [ -82.714521, 27.500415 ], [ -82.724522, 27.513614 ], [ -82.743017, 27.531086 ], [ -82.745748, 27.538834 ], [ -82.742437, 27.539360 ], [ -82.708121, 27.523514 ], [ -82.710621, 27.501715 ], [ -82.706821, 27.498415 ], [ -82.690421, 27.496415 ], [ -82.686421, 27.497215 ], [ -82.686921, 27.508015 ], [ -82.683621, 27.513115 ], [ -82.674621, 27.519614 ], [ -82.662020, 27.522814 ], [ -82.650720, 27.523115 ], [ -82.646014, 27.533540 ], [ -82.632053, 27.551908 ], [ -82.612019, 27.571231 ], [ -82.613003, 27.582837 ], [ -82.611717, 27.585283 ], [ -82.596488, 27.594045 ], [ -82.584629, 27.596021 ], [ -82.570607, 27.608882 ], [ -82.565667, 27.615713 ], [ -82.558538, 27.638678 ], [ -82.537146, 27.672933 ], [ -82.514265, 27.705588 ], [ -82.494891, 27.718963 ], [ -82.482449, 27.719886 ], [ -82.477638, 27.723004 ], [ -82.476297, 27.729929 ], [ -82.477129, 27.735216 ], [ -82.482305, 27.742649 ], [ -82.478339, 27.746250 ], [ -82.457543, 27.752571 ], [ -82.434635, 27.764355 ], [ -82.431980, 27.768092 ], [ -82.433981, 27.774087 ], [ -82.419066, 27.793767 ], [ -82.418401, 27.803187 ], [ -82.410837, 27.810868 ], [ -82.402857, 27.812671 ], [ -82.393383, 27.837519 ], [ -82.397463, 27.851631 ], [ -82.402615, 27.882602 ], [ -82.413915, 27.901401 ], [ -82.432316, 27.901301 ], [ -82.451591, 27.907506 ], [ -82.453731, 27.908546 ], [ -82.461914, 27.908431 ], [ -82.462459, 27.920248 ], [ -82.461055, 27.938161 ], [ -82.478063, 27.927680 ] ] ], [ [ [ -82.255777, 26.703437 ], [ -82.255159, 26.708160 ], [ -82.246535, 26.706435 ], [ -82.242510, 26.694361 ], [ -82.245960, 26.688612 ], [ -82.246535, 26.683437 ], [ -82.237440, 26.661976 ], [ -82.218342, 26.626407 ], [ -82.214337, 26.602944 ], [ -82.196514, 26.559823 ], [ -82.187315, 26.527626 ], [ -82.177541, 26.502328 ], [ -82.166042, 26.489679 ], [ -82.149368, 26.477605 ], [ -82.131545, 26.477030 ], [ -82.120046, 26.473581 ], [ -82.088423, 26.455182 ], [ -82.076924, 26.466106 ], [ -82.062551, 26.470131 ], [ -82.038403, 26.456907 ], [ -82.015607, 26.454858 ], [ -82.013713, 26.454258 ], [ -82.013913, 26.452058 ], [ -82.063114, 26.425459 ], [ -82.075015, 26.422059 ], [ -82.082915, 26.422059 ], [ -82.098115, 26.424959 ], [ -82.126671, 26.436279 ], [ -82.148716, 26.455458 ], [ -82.172917, 26.467658 ], [ -82.177017, 26.471558 ], [ -82.180717, 26.476257 ], [ -82.186441, 26.489221 ], [ -82.201402, 26.556310 ], [ -82.205523, 26.566536 ], [ -82.222131, 26.590402 ], [ -82.238872, 26.636433 ], [ -82.248659, 26.654337 ], [ -82.263008, 26.673388 ], [ -82.268007, 26.682791 ], [ -82.264351, 26.698496 ], [ -82.255777, 26.703437 ] ] ], [ [ [ -80.463986, 25.093210 ], [ -80.450399, 25.088751 ], [ -80.444887, 25.092966 ], [ -80.433575, 25.106317 ], [ -80.433499, 25.114665 ], [ -80.439403, 25.128453 ], [ -80.426786, 25.127297 ], [ -80.425399, 25.142256 ], [ -80.413260, 25.137053 ], [ -80.403177, 25.141798 ], [ -80.395467, 25.150694 ], [ -80.387164, 25.170859 ], [ -80.388350, 25.182721 ], [ -80.391909, 25.192210 ], [ -80.387164, 25.198141 ], [ -80.369965, 25.206444 ], [ -80.358696, 25.207037 ], [ -80.349800, 25.210595 ], [ -80.337345, 25.231353 ], [ -80.333787, 25.253891 ], [ -80.336159, 25.261601 ], [ -80.342683, 25.268125 ], [ -80.368186, 25.282359 ], [ -80.364034, 25.286510 ], [ -80.339421, 25.290069 ], [ -80.334676, 25.285917 ], [ -80.328746, 25.286510 ], [ -80.315698, 25.294220 ], [ -80.292567, 25.314385 ], [ -80.289602, 25.325061 ], [ -80.275961, 25.344039 ], [ -80.256982, 25.361239 ], [ -80.254610, 25.380810 ], [ -80.251052, 25.391486 ], [ -80.246307, 25.398603 ], [ -80.226142, 25.406313 ], [ -80.219025, 25.411058 ], [ -80.214280, 25.416988 ], [ -80.206570, 25.434188 ], [ -80.199453, 25.458504 ], [ -80.192336, 25.473331 ], [ -80.189964, 25.485786 ], [ -80.191743, 25.495275 ], [ -80.188778, 25.507730 ], [ -80.179288, 25.518999 ], [ -80.174544, 25.518406 ], [ -80.173951, 25.482821 ], [ -80.184033, 25.468587 ], [ -80.204198, 25.412244 ], [ -80.221991, 25.397417 ], [ -80.238004, 25.361832 ], [ -80.240376, 25.347005 ], [ -80.249865, 25.342853 ], [ -80.254916, 25.336336 ], [ -80.260137, 25.324641 ], [ -80.268138, 25.320675 ], [ -80.288184, 25.282835 ], [ -80.307584, 25.257561 ], [ -80.351399, 25.190615 ], [ -80.354019, 25.184306 ], [ -80.349855, 25.168825 ], [ -80.358570, 25.154073 ], [ -80.377084, 25.130487 ], [ -80.399767, 25.108536 ], [ -80.428318, 25.095547 ], [ -80.431032, 25.089250 ], [ -80.443375, 25.076084 ], [ -80.462011, 25.069935 ], [ -80.473870, 25.060253 ], [ -80.493881, 25.038502 ], [ -80.489120, 25.031301 ], [ -80.494781, 25.023019 ], [ -80.537995, 24.990244 ], [ -80.565831, 24.958155 ], [ -80.571668, 24.953659 ], [ -80.588272, 24.951153 ], [ -80.596073, 24.948173 ], [ -80.611693, 24.938420 ], [ -80.635571, 24.913003 ], [ -80.658045, 24.898314 ], [ -80.657199, 24.892579 ], [ -80.657543, 24.891204 ], [ -80.658917, 24.890517 ], [ -80.661667, 24.892579 ], [ -80.663386, 24.893610 ], [ -80.664760, 24.893610 ], [ -80.690803, 24.881116 ], [ -80.706356, 24.867232 ], [ -80.711849, 24.863323 ], [ -80.761359, 24.836225 ], [ -80.766965, 24.836158 ], [ -80.745468, 24.850652 ], [ -80.740610, 24.857421 ], [ -80.733133, 24.864104 ], [ -80.729274, 24.865361 ], [ -80.719976, 24.864644 ], [ -80.703028, 24.880873 ], [ -80.691761, 24.885759 ], [ -80.661280, 24.899704 ], [ -80.660198, 24.904980 ], [ -80.650765, 24.908121 ], [ -80.641306, 24.914311 ], [ -80.623866, 24.931236 ], [ -80.622896, 24.935587 ], [ -80.624172, 24.939058 ], [ -80.621658, 24.944265 ], [ -80.597074, 24.958492 ], [ -80.581131, 24.964738 ], [ -80.578185, 24.962811 ], [ -80.570813, 24.962215 ], [ -80.558785, 24.971505 ], [ -80.544110, 24.999916 ], [ -80.543254, 25.007337 ], [ -80.545971, 25.014770 ], [ -80.524498, 25.016945 ], [ -80.509136, 25.028317 ], [ -80.501326, 25.041436 ], [ -80.495569, 25.047497 ], [ -80.488900, 25.050110 ], [ -80.481197, 25.056604 ], [ -80.460652, 25.078904 ], [ -80.460592, 25.086133 ], [ -80.467178, 25.091265 ], [ -80.463986, 25.093210 ] ] ], [ [ [ -80.788263, 24.824218 ], [ -80.790497, 24.817789 ], [ -80.796053, 24.811940 ], [ -80.822342, 24.812629 ], [ -80.846191, 24.802968 ], [ -80.850338, 24.802600 ], [ -80.850866, 24.803701 ], [ -80.846142, 24.807488 ], [ -80.830158, 24.814280 ], [ -80.814551, 24.827953 ], [ -80.792780, 24.843918 ], [ -80.780564, 24.840520 ], [ -80.788263, 24.824218 ] ] ], [ [ [ -80.890540, 24.791678 ], [ -80.884572, 24.791561 ], [ -80.884020, 24.790414 ], [ -80.892649, 24.785991 ], [ -80.906874, 24.783744 ], [ -80.890540, 24.791678 ] ] ], [ [ [ -80.909954, 24.781154 ], [ -80.906288, 24.769867 ], [ -80.912042, 24.765050 ], [ -80.938543, 24.767535 ], [ -81.015933, 24.719881 ], [ -81.023794, 24.716901 ], [ -81.028616, 24.720618 ], [ -81.032447, 24.727323 ], [ -81.034290, 24.727341 ], [ -81.064554, 24.715453 ], [ -81.071034, 24.711722 ], [ -81.075855, 24.704266 ], [ -81.078716, 24.696557 ], [ -81.078439, 24.692382 ], [ -81.108041, 24.688592 ], [ -81.124094, 24.704873 ], [ -81.125371, 24.708291 ], [ -81.107355, 24.712760 ], [ -81.105287, 24.711280 ], [ -81.099135, 24.711993 ], [ -81.066816, 24.723926 ], [ -81.050570, 24.737581 ], [ -81.041797, 24.742965 ], [ -81.036698, 24.742827 ], [ -81.035192, 24.739982 ], [ -81.022170, 24.733091 ], [ -81.016918, 24.734676 ], [ -80.994426, 24.743991 ], [ -80.991413, 24.754101 ], [ -80.988082, 24.759336 ], [ -80.986654, 24.761240 ], [ -80.984275, 24.761240 ], [ -80.982371, 24.757908 ], [ -80.978778, 24.756096 ], [ -80.961908, 24.764095 ], [ -80.955245, 24.769330 ], [ -80.939065, 24.774565 ], [ -80.931570, 24.774626 ], [ -80.910431, 24.782324 ], [ -80.909954, 24.781154 ] ] ], [ [ [ -81.249799, 24.673357 ], [ -81.246095, 24.675832 ], [ -81.243232, 24.673998 ], [ -81.244761, 24.669202 ], [ -81.281778, 24.653750 ], [ -81.278312, 24.660448 ], [ -81.260006, 24.674848 ], [ -81.249799, 24.673357 ] ] ], [ [ [ -81.582923, 24.658732 ], [ -81.580534, 24.669140 ], [ -81.562917, 24.692912 ], [ -81.557610, 24.692488 ], [ -81.542116, 24.681026 ], [ -81.535323, 24.679540 ], [ -81.518980, 24.687818 ], [ -81.516433, 24.700341 ], [ -81.512400, 24.703737 ], [ -81.490962, 24.710105 ], [ -81.476642, 24.711244 ], [ -81.474186, 24.706332 ], [ -81.469275, 24.704286 ], [ -81.459043, 24.707355 ], [ -81.454132, 24.710834 ], [ -81.451881, 24.714518 ], [ -81.452700, 24.736209 ], [ -81.456588, 24.740097 ], [ -81.451267, 24.747464 ], [ -81.440831, 24.735390 ], [ -81.438580, 24.727000 ], [ -81.435715, 24.723931 ], [ -81.432032, 24.722908 ], [ -81.423028, 24.731911 ], [ -81.421595, 24.737641 ], [ -81.427121, 24.745827 ], [ -81.430599, 24.747259 ], [ -81.431009, 24.751761 ], [ -81.425483, 24.752989 ], [ -81.402769, 24.749101 ], [ -81.392947, 24.743371 ], [ -81.390287, 24.738460 ], [ -81.389468, 24.731298 ], [ -81.385580, 24.726182 ], [ -81.360410, 24.708788 ], [ -81.345881, 24.707560 ], [ -81.319282, 24.701238 ], [ -81.314787, 24.691764 ], [ -81.313933, 24.680707 ], [ -81.309664, 24.665017 ], [ -81.298028, 24.656774 ], [ -81.298369, 24.654326 ], [ -81.303113, 24.651665 ], [ -81.332831, 24.639528 ], [ -81.395096, 24.621062 ], [ -81.401946, 24.623564 ], [ -81.403319, 24.640294 ], [ -81.414187, 24.647167 ], [ -81.432315, 24.645949 ], [ -81.448623, 24.640172 ], [ -81.470411, 24.641985 ], [ -81.480951, 24.645121 ], [ -81.481830, 24.647369 ], [ -81.477915, 24.649893 ], [ -81.476410, 24.653197 ], [ -81.480504, 24.659757 ], [ -81.498580, 24.664980 ], [ -81.502992, 24.660877 ], [ -81.505585, 24.654609 ], [ -81.508740, 24.644210 ], [ -81.509028, 24.631516 ], [ -81.511165, 24.625135 ], [ -81.518595, 24.620304 ], [ -81.546450, 24.614895 ], [ -81.602998, 24.586444 ], [ -81.664209, 24.573143 ], [ -81.674694, 24.564359 ], [ -81.685278, 24.558739 ], [ -81.691575, 24.559886 ], [ -81.732511, 24.556423 ], [ -81.765993, 24.552103 ], [ -81.786157, 24.546580 ], [ -81.810333, 24.544701 ], [ -81.812890, 24.546468 ], [ -81.814446, 24.563580 ], [ -81.811386, 24.569750 ], [ -81.800676, 24.570989 ], [ -81.801378, 24.588963 ], [ -81.798797, 24.595676 ], [ -81.795182, 24.596192 ], [ -81.790808, 24.585836 ], [ -81.773808, 24.584977 ], [ -81.748071, 24.590199 ], [ -81.739241, 24.589973 ], [ -81.734573, 24.584148 ], [ -81.730473, 24.581960 ], [ -81.715944, 24.587956 ], [ -81.715480, 24.592498 ], [ -81.705364, 24.597647 ], [ -81.699349, 24.597647 ], [ -81.694235, 24.591932 ], [ -81.687017, 24.592534 ], [ -81.678595, 24.597647 ], [ -81.668970, 24.607873 ], [ -81.655735, 24.616295 ], [ -81.637087, 24.621408 ], [ -81.614829, 24.642764 ], [ -81.614529, 24.650584 ], [ -81.597685, 24.655397 ], [ -81.587759, 24.655998 ], [ -81.582923, 24.658732 ] ] ], [ [ [ -80.699844, 24.896555 ], [ -80.703285, 24.897243 ], [ -80.704659, 24.898619 ], [ -80.703629, 24.904118 ], [ -80.699844, 24.908930 ], [ -80.698471, 24.909273 ], [ -80.697098, 24.908585 ], [ -80.693314, 24.899305 ], [ -80.695724, 24.897243 ], [ -80.699844, 24.896555 ] ] ], [ [ [ -81.303253, 24.714029 ], [ -81.305153, 24.715933 ], [ -81.309914, 24.724974 ], [ -81.312767, 24.727354 ], [ -81.317055, 24.728306 ], [ -81.322289, 24.728781 ], [ -81.328476, 24.726877 ], [ -81.332756, 24.732113 ], [ -81.338943, 24.735920 ], [ -81.342278, 24.738300 ], [ -81.341797, 24.740204 ], [ -81.337517, 24.741631 ], [ -81.336090, 24.744486 ], [ -81.330376, 24.749722 ], [ -81.327995, 24.752100 ], [ -81.327049, 24.757811 ], [ -81.327553, 24.762316 ], [ -81.324638, 24.767210 ], [ -81.317673, 24.757290 ], [ -81.305634, 24.756384 ], [ -81.298492, 24.747818 ], [ -81.298492, 24.744963 ], [ -81.301346, 24.729733 ], [ -81.300873, 24.721643 ], [ -81.297401, 24.716732 ], [ -81.303253, 24.714029 ] ] ], [ [ [ -82.158653, 24.547716 ], [ -82.164009, 24.550095 ], [ -82.166382, 24.553070 ], [ -82.166382, 24.557829 ], [ -82.164604, 24.564371 ], [ -82.160439, 24.567942 ], [ -82.157463, 24.567942 ], [ -82.155678, 24.564966 ], [ -82.157463, 24.561993 ], [ -82.158653, 24.557829 ], [ -82.156868, 24.556044 ], [ -82.147346, 24.555449 ], [ -82.130692, 24.554853 ], [ -82.121773, 24.556639 ], [ -82.114037, 24.563778 ], [ -82.110466, 24.572701 ], [ -82.111061, 24.579838 ], [ -82.115822, 24.582813 ], [ -82.122368, 24.584597 ], [ -82.130096, 24.586382 ], [ -82.139618, 24.585787 ], [ -82.143784, 24.584597 ], [ -82.146164, 24.587572 ], [ -82.146164, 24.592331 ], [ -82.141403, 24.598280 ], [ -82.134857, 24.599468 ], [ -82.127121, 24.599468 ], [ -82.119392, 24.597090 ], [ -82.110466, 24.594709 ], [ -82.105118, 24.591141 ], [ -82.102142, 24.585192 ], [ -82.099762, 24.575079 ], [ -82.100952, 24.565561 ], [ -82.106308, 24.556639 ], [ -82.115227, 24.550095 ], [ -82.130692, 24.548906 ], [ -82.158653, 24.547716 ] ] ], [ [ [ -82.840569, 28.163084 ], [ -82.847443, 28.164288 ], [ -82.850365, 28.172537 ], [ -82.852432, 28.210173 ], [ -82.844009, 28.230106 ], [ -82.837990, 28.235435 ], [ -82.838852, 28.211548 ], [ -82.844009, 28.196596 ], [ -82.840401, 28.166864 ], [ -82.840569, 28.163084 ] ] ], [ [ [ -82.832405, 28.106716 ], [ -82.842743, 28.111225 ], [ -82.842201, 28.125402 ], [ -82.833786, 28.130260 ], [ -82.832237, 28.129057 ], [ -82.837837, 28.124039 ], [ -82.838387, 28.114498 ], [ -82.830688, 28.107403 ], [ -82.832405, 28.106716 ] ] ], [ [ [ -82.429779, 27.863234 ], [ -82.437683, 27.865124 ], [ -82.435448, 27.884199 ], [ -82.424622, 27.884199 ], [ -82.424454, 27.884027 ], [ -82.424278, 27.868217 ], [ -82.429779, 27.863234 ] ] ], [ [ [ -82.432220, 27.822289 ], [ -82.441689, 27.823534 ], [ -82.438576, 27.839603 ], [ -82.431221, 27.838608 ], [ -82.432220, 27.822289 ] ] ], [ [ [ -82.755928, 27.575552 ], [ -82.763145, 27.580364 ], [ -82.764694, 27.589300 ], [ -82.762283, 27.602533 ], [ -82.758850, 27.600470 ], [ -82.760056, 27.582769 ], [ -82.755928, 27.575552 ] ] ], [ [ [ -84.670555, 29.777298 ], [ -84.674683, 29.786234 ], [ -84.644089, 29.789671 ], [ -84.604736, 29.810293 ], [ -84.573975, 29.830572 ], [ -84.570877, 29.822495 ], [ -84.579987, 29.806856 ], [ -84.624840, 29.788467 ], [ -84.670555, 29.777298 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US13", "STATE": "13", "NAME": "Georgia", "LSAD": "", "CENSUSAREA": 57513.485000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -81.444124, 30.709714 ], [ -81.448718, 30.709353 ], [ -81.459978, 30.710434 ], [ -81.464465, 30.711045 ], [ -81.472597, 30.713312 ], [ -81.475754, 30.714754 ], [ -81.483786, 30.723891 ], [ -81.487332, 30.726081 ], [ -81.489537, 30.726100 ], [ -81.507216, 30.722936 ], [ -81.516116, 30.722236 ], [ -81.521417, 30.722536 ], [ -81.528278, 30.723359 ], [ -81.530531, 30.722858 ], [ -81.532785, 30.721606 ], [ -81.534037, 30.719853 ], [ -81.534517, 30.717936 ], [ -81.535539, 30.716348 ], [ -81.537668, 30.714345 ], [ -81.539295, 30.713468 ], [ -81.540923, 30.713343 ], [ -81.542675, 30.713593 ], [ -81.544679, 30.713969 ], [ -81.546932, 30.714345 ], [ -81.549186, 30.715972 ], [ -81.552566, 30.716974 ], [ -81.561706, 30.715597 ], [ -81.566219, 30.717836 ], [ -81.571419, 30.721636 ], [ -81.573719, 30.722336 ], [ -81.586820, 30.723735 ], [ -81.593648, 30.725459 ], [ -81.601206, 30.728141 ], [ -81.604010, 30.727287 ], [ -81.605716, 30.725337 ], [ -81.607667, 30.721924 ], [ -81.609495, 30.720705 ], [ -81.617663, 30.722046 ], [ -81.619613, 30.724849 ], [ -81.620822, 30.729535 ], [ -81.621929, 30.731188 ], [ -81.625098, 30.733017 ], [ -81.629609, 30.732407 ], [ -81.633266, 30.729603 ], [ -81.646137, 30.727591 ], [ -81.649188, 30.728686 ], [ -81.650440, 30.729703 ], [ -81.651770, 30.732284 ], [ -81.652161, 30.735648 ], [ -81.651723, 30.740235 ], [ -81.652123, 30.742435 ], [ -81.656541, 30.745113 ], [ -81.662173, 30.746521 ], [ -81.664598, 30.746599 ], [ -81.667336, 30.745660 ], [ -81.668275, 30.744643 ], [ -81.669324, 30.741335 ], [ -81.670124, 30.740235 ], [ -81.672824, 30.738935 ], [ -81.688925, 30.741434 ], [ -81.690990, 30.742841 ], [ -81.691818, 30.743990 ], [ -81.692815, 30.747100 ], [ -81.694778, 30.748414 ], [ -81.719927, 30.744634 ], [ -81.727127, 30.746934 ], [ -81.732227, 30.749634 ], [ -81.742736, 30.759201 ], [ -81.743094, 30.759912 ], [ -81.743438, 30.762271 ], [ -81.744183, 30.763868 ], [ -81.745035, 30.765039 ], [ -81.746312, 30.765891 ], [ -81.747572, 30.766455 ], [ -81.751283, 30.767082 ], [ -81.755074, 30.768319 ], [ -81.759338, 30.771377 ], [ -81.763372, 30.773820 ], [ -81.768192, 30.773954 ], [ -81.770468, 30.772481 ], [ -81.772611, 30.769535 ], [ -81.775021, 30.768330 ], [ -81.779171, 30.768062 ], [ -81.782653, 30.769937 ], [ -81.784350, 30.773590 ], [ -81.792769, 30.784432 ], [ -81.806652, 30.789683 ], [ -81.808529, 30.790014 ], [ -81.827014, 30.788933 ], [ -81.840375, 30.786384 ], [ -81.842058, 30.787120 ], [ -81.846286, 30.790548 ], [ -81.852626, 30.794439 ], [ -81.868608, 30.792754 ], [ -81.876882, 30.799516 ], [ -81.882725, 30.805124 ], [ -81.891281, 30.815945 ], [ -81.892904, 30.819268 ], [ -81.895720, 30.821098 ], [ -81.899380, 30.821662 ], [ -81.902337, 30.820817 ], [ -81.903745, 30.818986 ], [ -81.906279, 30.817015 ], [ -81.910926, 30.815889 ], [ -81.924448, 30.817566 ], [ -81.934655, 30.820424 ], [ -81.935444, 30.821131 ], [ -81.938381, 30.825745 ], [ -81.943168, 30.827434 ], [ -81.949787, 30.827493 ], [ -81.959759, 30.821168 ], [ -81.962175, 30.818001 ], [ -81.962739, 30.813636 ], [ -81.962441, 30.808441 ], [ -81.961989, 30.800443 ], [ -81.962534, 30.796526 ], [ -81.973856, 30.778487 ], [ -81.979061, 30.776415 ], [ -81.981273, 30.776767 ], [ -81.988605, 30.780056 ], [ -81.990855, 30.781611 ], [ -81.994972, 30.786073 ], [ -82.004973, 30.791744 ], [ -82.007865, 30.792937 ], [ -82.017051, 30.791657 ], [ -82.022866, 30.787991 ], [ -82.023848, 30.786685 ], [ -82.024035, 30.783156 ], [ -82.017881, 30.775844 ], [ -82.011597, 30.763122 ], [ -82.012660, 30.761289 ], [ -82.017917, 30.755263 ], [ -82.028400, 30.750981 ], [ -82.032645, 30.750674 ], [ -82.035964, 30.750998 ], [ -82.038967, 30.749262 ], [ -82.039634, 30.747727 ], [ -82.040026, 30.737548 ], [ -82.041168, 30.734248 ], [ -82.043795, 30.729641 ], [ -82.041010, 30.725080 ], [ -82.039154, 30.723178 ], [ -82.037563, 30.718640 ], [ -82.036426, 30.706585 ], [ -82.041812, 30.692376 ], [ -82.050432, 30.676266 ], [ -82.049507, 30.655548 ], [ -82.046114, 30.651767 ], [ -82.042271, 30.649452 ], [ -82.039595, 30.643309 ], [ -82.039092, 30.641132 ], [ -82.039941, 30.637144 ], [ -82.037609, 30.633271 ], [ -82.033927, 30.629603 ], [ -82.028499, 30.621829 ], [ -82.026541, 30.613303 ], [ -82.027338, 30.606726 ], [ -82.026941, 30.606153 ], [ -82.016503, 30.602484 ], [ -82.015708, 30.601704 ], [ -82.012109, 30.593773 ], [ -82.008091, 30.577018 ], [ -82.005477, 30.563495 ], [ -82.013216, 30.550091 ], [ -82.018361, 30.531184 ], [ -82.018868, 30.523828 ], [ -82.016990, 30.519358 ], [ -82.015826, 30.518166 ], [ -82.014770, 30.513009 ], [ -82.015892, 30.495499 ], [ -82.018222, 30.492085 ], [ -82.017297, 30.487638 ], [ -82.016982, 30.478779 ], [ -82.017779, 30.475081 ], [ -82.023734, 30.467289 ], [ -82.025457, 30.457755 ], [ -82.028212, 30.447396 ], [ -82.030064, 30.444853 ], [ -82.036203, 30.438460 ], [ -82.037209, 30.434518 ], [ -82.034464, 30.428048 ], [ -82.034005, 30.422357 ], [ -82.039971, 30.414280 ], [ -82.041164, 30.409966 ], [ -82.041990, 30.403266 ], [ -82.041164, 30.396841 ], [ -82.035871, 30.385287 ], [ -82.036825, 30.377884 ], [ -82.040746, 30.370158 ], [ -82.047917, 30.363265 ], [ -82.050069, 30.362338 ], [ -82.060034, 30.360328 ], [ -82.068533, 30.359184 ], [ -82.081106, 30.358806 ], [ -82.094687, 30.360781 ], [ -82.101798, 30.365336 ], [ -82.101416, 30.366556 ], [ -82.102500, 30.367823 ], [ -82.104834, 30.368319 ], [ -82.116385, 30.367335 ], [ -82.143282, 30.363393 ], [ -82.158109, 30.359913 ], [ -82.161757, 30.357851 ], [ -82.165192, 30.358035 ], [ -82.170054, 30.358929 ], [ -82.171508, 30.359869 ], [ -82.180018, 30.368625 ], [ -82.183797, 30.373712 ], [ -82.189847, 30.375938 ], [ -82.192940, 30.378779 ], [ -82.204151, 30.401330 ], [ -82.210291, 30.424590 ], [ -82.209870, 30.432818 ], [ -82.206486, 30.437081 ], [ -82.203975, 30.444507 ], [ -82.204823, 30.451840 ], [ -82.206040, 30.455507 ], [ -82.207522, 30.456928 ], [ -82.207708, 30.460503 ], [ -82.204614, 30.468868 ], [ -82.200938, 30.474438 ], [ -82.201416, 30.485164 ], [ -82.206445, 30.491877 ], [ -82.212852, 30.498751 ], [ -82.218514, 30.504187 ], [ -82.225026, 30.507830 ], [ -82.226933, 30.510281 ], [ -82.230377, 30.517339 ], [ -82.229399, 30.520823 ], [ -82.230752, 30.526758 ], [ -82.234952, 30.533066 ], [ -82.235820, 30.537187 ], [ -82.235603, 30.544885 ], [ -82.231916, 30.556270 ], [ -82.227254, 30.561041 ], [ -82.223025, 30.563210 ], [ -82.218579, 30.564403 ], [ -82.214385, 30.566958 ], [ -82.214839, 30.568591 ], [ -82.249841, 30.570863 ], [ -82.258100, 30.571559 ], [ -82.287343, 30.573458 ], [ -82.374844, 30.579004 ], [ -82.459544, 30.584272 ], [ -82.524899, 30.588189 ], [ -82.536233, 30.588885 ], [ -82.545055, 30.589361 ], [ -82.553159, 30.589934 ], [ -82.565476, 30.590622 ], [ -82.569237, 30.590965 ], [ -82.689271, 30.597719 ], [ -82.698618, 30.598232 ], [ -82.698902, 30.598271 ], [ -82.877259, 30.609024 ], [ -82.878779, 30.609082 ], [ -83.131370, 30.623583 ], [ -83.156170, 30.625504 ], [ -83.163309, 30.625895 ], [ -83.174411, 30.626444 ], [ -83.187391, 30.627223 ], [ -83.309455, 30.634417 ], [ -83.311647, 30.634577 ], [ -83.341011, 30.636346 ], [ -83.379460, 30.638680 ], [ -83.390062, 30.639333 ], [ -83.429477, 30.641519 ], [ -83.429584, 30.641496 ], [ -83.440021, 30.642023 ], [ -83.448895, 30.642410 ], [ -83.499876, 30.645671 ], [ -83.611667, 30.651255 ], [ -83.674058, 30.654747 ], [ -83.676773, 30.654905 ], [ -83.810536, 30.661880 ], [ -83.820886, 30.662612 ], [ -83.855216, 30.664412 ], [ -83.880220, 30.665832 ], [ -83.880317, 30.665807 ], [ -84.007391, 30.672097 ], [ -84.039707, 30.673819 ], [ -84.041810, 30.673878 ], [ -84.046605, 30.674200 ], [ -84.057228, 30.674705 ], [ -84.107699, 30.676818 ], [ -84.124895, 30.678046 ], [ -84.249900, 30.684145 ], [ -84.281210, 30.685256 ], [ -84.374905, 30.689794 ], [ -84.474409, 30.692793 ], [ -84.535042, 30.696523 ], [ -84.539370, 30.696775 ], [ -84.606249, 30.699872 ], [ -84.606386, 30.699865 ], [ -84.644815, 30.701992 ], [ -84.836324, 30.710709 ], [ -84.864693, 30.711542 ], [ -84.869752, 30.721897 ], [ -84.875421, 30.727491 ], [ -84.883821, 30.732591 ], [ -84.885221, 30.734991 ], [ -84.887522, 30.741791 ], [ -84.896122, 30.750591 ], [ -84.897622, 30.751391 ], [ -84.900222, 30.751891 ], [ -84.903122, 30.751791 ], [ -84.906322, 30.750591 ], [ -84.911122, 30.751191 ], [ -84.913522, 30.752291 ], [ -84.914322, 30.753591 ], [ -84.915022, 30.761191 ], [ -84.920123, 30.765990 ], [ -84.918023, 30.772090 ], [ -84.917423, 30.775890 ], [ -84.918023, 30.778090 ], [ -84.926723, 30.790190 ], [ -84.928323, 30.793090 ], [ -84.929023, 30.797290 ], [ -84.927923, 30.802790 ], [ -84.928323, 30.805090 ], [ -84.930923, 30.810489 ], [ -84.935413, 30.817210 ], [ -84.936042, 30.820671 ], [ -84.935570, 30.824603 ], [ -84.935256, 30.830894 ], [ -84.934155, 30.834039 ], [ -84.931953, 30.837499 ], [ -84.929436, 30.840331 ], [ -84.928335, 30.842532 ], [ -84.928335, 30.844263 ], [ -84.928807, 30.846779 ], [ -84.930065, 30.848824 ], [ -84.933224, 30.851488 ], [ -84.935256, 30.854328 ], [ -84.935413, 30.858418 ], [ -84.934627, 30.860620 ], [ -84.933997, 30.863293 ], [ -84.934627, 30.865495 ], [ -84.935728, 30.867540 ], [ -84.937772, 30.870528 ], [ -84.938401, 30.873045 ], [ -84.937615, 30.875876 ], [ -84.935570, 30.878707 ], [ -84.935413, 30.882481 ], [ -84.936828, 30.884683 ], [ -84.938087, 30.885627 ], [ -84.939974, 30.886728 ], [ -84.941325, 30.887688 ], [ -84.942525, 30.888488 ], [ -84.949625, 30.897387 ], [ -84.952325, 30.902287 ], [ -84.956125, 30.907587 ], [ -84.966726, 30.917287 ], [ -84.969426, 30.921987 ], [ -84.971026, 30.928187 ], [ -84.975226, 30.930787 ], [ -84.980627, 30.932687 ], [ -84.983127, 30.934786 ], [ -84.983627, 30.936986 ], [ -84.983027, 30.942586 ], [ -84.982227, 30.946886 ], [ -84.979627, 30.954686 ], [ -84.979627, 30.958986 ], [ -84.980127, 30.961286 ], [ -84.982527, 30.965586 ], [ -84.984827, 30.967486 ], [ -84.988027, 30.968786 ], [ -84.997628, 30.971186 ], [ -84.999828, 30.971486 ], [ -84.999928, 30.971186 ], [ -85.004026, 30.973468 ], [ -85.005105, 30.974704 ], [ -85.005931, 30.977040 ], [ -85.005934, 30.979804 ], [ -85.002540, 30.986899 ], [ -85.001819, 30.997889 ], [ -85.001900, 31.000681 ], [ -85.002368, 31.000682 ], [ -85.001366, 31.005044 ], [ -84.999626, 31.009079 ], [ -84.999428, 31.013843 ], [ -85.000060, 31.014983 ], [ -85.004549, 31.019180 ], [ -85.005051, 31.024701 ], [ -85.009409, 31.032378 ], [ -85.008552, 31.042824 ], [ -85.008816, 31.045573 ], [ -85.011392, 31.053546 ], [ -85.012642, 31.055402 ], [ -85.018148, 31.059253 ], [ -85.028573, 31.074583 ], [ -85.028333, 31.076851 ], [ -85.026068, 31.084180 ], [ -85.029736, 31.096163 ], [ -85.032832, 31.100570 ], [ -85.035615, 31.108192 ], [ -85.037079, 31.109751 ], [ -85.040513, 31.111583 ], [ -85.050178, 31.118916 ], [ -85.052867, 31.119489 ], [ -85.054677, 31.120818 ], [ -85.061072, 31.134225 ], [ -85.062430, 31.139518 ], [ -85.064028, 31.142495 ], [ -85.070181, 31.148680 ], [ -85.076628, 31.156927 ], [ -85.077801, 31.157889 ], [ -85.083582, 31.159630 ], [ -85.092106, 31.160293 ], [ -85.100207, 31.165490 ], [ -85.100447, 31.166727 ], [ -85.098426, 31.177770 ], [ -85.098507, 31.180153 ], [ -85.102052, 31.184734 ], [ -85.104424, 31.185650 ], [ -85.106503, 31.185305 ], [ -85.107516, 31.186451 ], [ -85.108133, 31.195637 ], [ -85.106963, 31.202693 ], [ -85.105631, 31.204595 ], [ -85.099770, 31.209751 ], [ -85.098704, 31.211286 ], [ -85.098707, 31.219511 ], [ -85.096763, 31.225651 ], [ -85.098844, 31.232524 ], [ -85.100765, 31.234813 ], [ -85.102472, 31.237860 ], [ -85.104260, 31.241869 ], [ -85.106182, 31.248077 ], [ -85.109149, 31.254609 ], [ -85.111711, 31.258022 ], [ -85.112352, 31.259580 ], [ -85.113261, 31.264343 ], [ -85.111983, 31.267987 ], [ -85.111905, 31.272477 ], [ -85.112546, 31.274378 ], [ -85.114548, 31.276302 ], [ -85.114601, 31.277333 ], [ -85.112762, 31.280037 ], [ -85.110309, 31.281733 ], [ -85.099107, 31.284165 ], [ -85.093160, 31.289688 ], [ -85.089774, 31.295026 ], [ -85.087695, 31.304053 ], [ -85.087651, 31.308677 ], [ -85.087404, 31.311223 ], [ -85.084469, 31.316194 ], [ -85.083776, 31.318210 ], [ -85.084152, 31.328313 ], [ -85.088983, 31.334292 ], [ -85.089411, 31.336033 ], [ -85.087810, 31.337981 ], [ -85.087063, 31.340317 ], [ -85.085864, 31.350190 ], [ -85.085918, 31.353146 ], [ -85.087413, 31.354428 ], [ -85.090990, 31.354428 ], [ -85.091791, 31.355207 ], [ -85.092619, 31.357474 ], [ -85.092487, 31.362881 ], [ -85.092167, 31.364576 ], [ -85.086910, 31.374474 ], [ -85.082431, 31.384540 ], [ -85.080403, 31.393932 ], [ -85.078641, 31.396360 ], [ -85.077626, 31.398880 ], [ -85.077387, 31.402844 ], [ -85.079978, 31.410472 ], [ -85.079818, 31.411732 ], [ -85.076746, 31.415971 ], [ -85.075827, 31.421506 ], [ -85.074762, 31.424879 ], [ -85.072898, 31.426477 ], [ -85.070413, 31.426921 ], [ -85.068546, 31.427311 ], [ -85.066970, 31.428594 ], [ -85.065875, 31.430586 ], [ -85.065554, 31.439543 ], [ -85.065955, 31.442979 ], [ -85.066703, 31.447286 ], [ -85.069268, 31.453472 ], [ -85.071621, 31.468384 ], [ -85.065687, 31.484122 ], [ -85.062105, 31.488017 ], [ -85.058923, 31.495989 ], [ -85.052951, 31.506518 ], [ -85.048445, 31.513684 ], [ -85.045642, 31.516813 ], [ -85.044986, 31.518230 ], [ -85.044556, 31.520908 ], [ -85.047649, 31.523751 ], [ -85.048263, 31.526012 ], [ -85.047196, 31.528671 ], [ -85.042983, 31.535200 ], [ -85.041813, 31.537754 ], [ -85.041305, 31.540987 ], [ -85.041881, 31.544684 ], [ -85.042547, 31.545953 ], [ -85.045698, 31.548707 ], [ -85.050838, 31.555551 ], [ -85.051873, 31.557871 ], [ -85.052931, 31.562890 ], [ -85.057960, 31.570840 ], [ -85.057719, 31.573062 ], [ -85.055284, 31.577092 ], [ -85.055417, 31.578696 ], [ -85.058440, 31.583690 ], [ -85.058109, 31.593343 ], [ -85.056405, 31.600963 ], [ -85.055976, 31.605178 ], [ -85.057314, 31.606713 ], [ -85.059696, 31.607262 ], [ -85.060552, 31.608224 ], [ -85.060418, 31.611271 ], [ -85.058330, 31.614546 ], [ -85.057527, 31.616883 ], [ -85.057473, 31.618624 ], [ -85.058169, 31.620227 ], [ -85.059534, 31.621717 ], [ -85.065236, 31.624351 ], [ -85.067628, 31.625267 ], [ -85.073829, 31.629567 ], [ -85.080029, 31.636867 ], [ -85.082829, 31.637967 ], [ -85.084503, 31.639026 ], [ -85.085173, 31.640749 ], [ -85.085365, 31.642186 ], [ -85.085173, 31.644101 ], [ -85.082588, 31.649463 ], [ -85.081429, 31.650966 ], [ -85.080864, 31.652336 ], [ -85.080960, 31.653102 ], [ -85.082013, 31.654730 ], [ -85.083545, 31.656071 ], [ -85.085460, 31.657028 ], [ -85.087829, 31.657866 ], [ -85.092429, 31.659966 ], [ -85.109430, 31.677465 ], [ -85.112630, 31.685165 ], [ -85.113930, 31.686865 ], [ -85.122330, 31.691265 ], [ -85.125530, 31.694965 ], [ -85.126830, 31.708965 ], [ -85.126530, 31.716764 ], [ -85.125730, 31.718864 ], [ -85.122230, 31.722764 ], [ -85.119130, 31.730964 ], [ -85.118930, 31.732664 ], [ -85.123930, 31.747564 ], [ -85.126630, 31.752463 ], [ -85.129231, 31.758663 ], [ -85.125630, 31.764463 ], [ -85.125230, 31.767063 ], [ -85.126330, 31.768863 ], [ -85.130731, 31.772263 ], [ -85.140431, 31.779663 ], [ -85.141931, 31.781963 ], [ -85.137131, 31.788363 ], [ -85.132931, 31.792363 ], [ -85.132231, 31.795162 ], [ -85.132831, 31.798862 ], [ -85.132931, 31.808062 ], [ -85.131531, 31.813062 ], [ -85.131331, 31.817562 ], [ -85.133631, 31.826062 ], [ -85.135931, 31.830462 ], [ -85.139231, 31.834161 ], [ -85.141831, 31.839261 ], [ -85.141331, 31.841061 ], [ -85.138331, 31.844161 ], [ -85.137731, 31.845861 ], [ -85.138031, 31.851262 ], [ -85.140231, 31.855261 ], [ -85.140731, 31.857461 ], [ -85.140131, 31.858761 ], [ -85.137431, 31.860661 ], [ -85.135831, 31.862461 ], [ -85.133731, 31.870061 ], [ -85.128831, 31.876360 ], [ -85.128431, 31.877560 ], [ -85.128431, 31.879660 ], [ -85.129331, 31.882460 ], [ -85.131631, 31.886760 ], [ -85.133731, 31.889560 ], [ -85.134331, 31.891460 ], [ -85.134131, 31.892160 ], [ -85.132931, 31.893060 ], [ -85.121131, 31.893260 ], [ -85.117031, 31.892860 ], [ -85.114031, 31.893360 ], [ -85.112030, 31.894760 ], [ -85.110630, 31.896860 ], [ -85.111330, 31.899360 ], [ -85.108030, 31.905160 ], [ -85.109830, 31.908060 ], [ -85.112731, 31.909859 ], [ -85.113131, 31.911859 ], [ -85.109130, 31.914359 ], [ -85.102430, 31.917359 ], [ -85.101330, 31.918659 ], [ -85.100230, 31.924059 ], [ -85.099530, 31.925259 ], [ -85.098230, 31.926259 ], [ -85.091830, 31.928859 ], [ -85.086430, 31.935959 ], [ -85.084730, 31.937359 ], [ -85.078930, 31.940159 ], [ -85.078930, 31.941459 ], [ -85.082430, 31.945358 ], [ -85.086830, 31.957758 ], [ -85.086730, 31.959158 ], [ -85.085730, 31.960758 ], [ -85.083230, 31.962458 ], [ -85.073930, 31.964158 ], [ -85.070230, 31.965658 ], [ -85.067829, 31.967358 ], [ -85.065929, 31.971158 ], [ -85.065929, 31.972458 ], [ -85.066829, 31.974758 ], [ -85.069930, 31.978358 ], [ -85.070930, 31.981658 ], [ -85.068330, 31.986757 ], [ -85.068030, 31.993357 ], [ -85.064544, 32.002489 ], [ -85.063441, 32.004140 ], [ -85.055075, 32.010714 ], [ -85.053815, 32.013502 ], [ -85.054768, 32.017407 ], [ -85.053669, 32.020662 ], [ -85.053214, 32.021576 ], [ -85.053072, 32.023130 ], [ -85.053214, 32.024189 ], [ -85.053779, 32.025532 ], [ -85.055217, 32.027213 ], [ -85.056253, 32.028336 ], [ -85.056464, 32.031819 ], [ -85.055474, 32.034221 ], [ -85.054627, 32.036694 ], [ -85.054839, 32.038814 ], [ -85.055333, 32.040580 ], [ -85.058030, 32.043756 ], [ -85.058830, 32.046656 ], [ -85.056630, 32.054155 ], [ -85.056430, 32.058055 ], [ -85.056830, 32.059755 ], [ -85.056029, 32.063055 ], [ -85.054179, 32.067985 ], [ -85.054084, 32.070210 ], [ -85.055491, 32.072657 ], [ -85.055813, 32.074439 ], [ -85.053232, 32.080604 ], [ -85.051161, 32.082527 ], [ -85.047740, 32.084908 ], [ -85.047063, 32.087389 ], [ -85.047063, 32.090433 ], [ -85.049550, 32.095362 ], [ -85.053777, 32.107684 ], [ -85.055045, 32.113671 ], [ -85.059180, 32.125153 ], [ -85.061540, 32.129673 ], [ -85.062060, 32.132486 ], [ -85.061144, 32.134065 ], [ -85.058749, 32.136018 ], [ -85.047865, 32.142033 ], [ -85.045593, 32.143758 ], [ -85.033989, 32.156348 ], [ -85.030336, 32.161727 ], [ -85.026583, 32.166104 ], [ -85.014648, 32.176882 ], [ -85.013065, 32.179112 ], [ -85.011267, 32.180493 ], [ -85.008531, 32.181903 ], [ -84.995929, 32.184852 ], [ -84.973728, 32.191552 ], [ -84.966828, 32.193952 ], [ -84.965032, 32.196642 ], [ -84.964944, 32.198920 ], [ -84.965032, 32.200585 ], [ -84.966346, 32.202688 ], [ -84.966928, 32.204451 ], [ -84.967047, 32.205843 ], [ -84.966784, 32.206895 ], [ -84.966346, 32.208034 ], [ -84.965733, 32.208823 ], [ -84.964594, 32.209787 ], [ -84.963367, 32.211014 ], [ -84.962227, 32.212503 ], [ -84.960650, 32.214344 ], [ -84.958985, 32.215571 ], [ -84.957057, 32.216710 ], [ -84.953727, 32.217148 ], [ -84.948995, 32.217849 ], [ -84.939328, 32.217951 ], [ -84.930127, 32.219051 ], [ -84.928227, 32.219851 ], [ -84.925427, 32.221551 ], [ -84.922927, 32.224751 ], [ -84.923527, 32.229751 ], [ -84.922627, 32.231751 ], [ -84.920627, 32.233951 ], [ -84.916327, 32.236551 ], [ -84.912727, 32.243350 ], [ -84.913249, 32.245290 ], [ -84.912488, 32.247463 ], [ -84.910098, 32.248333 ], [ -84.907227, 32.249050 ], [ -84.904087, 32.250838 ], [ -84.902496, 32.253217 ], [ -84.901549, 32.255584 ], [ -84.898234, 32.256768 ], [ -84.892315, 32.258189 ], [ -84.891131, 32.259610 ], [ -84.890894, 32.261504 ], [ -84.891841, 32.263398 ], [ -84.893959, 32.265846 ], [ -84.904023, 32.273749 ], [ -84.911127, 32.276949 ], [ -84.922872, 32.285333 ], [ -84.933800, 32.298260 ], [ -84.938680, 32.300708 ], [ -84.989514, 32.319316 ], [ -85.001874, 32.322015 ], [ -85.007103, 32.328362 ], [ -85.008096, 32.336677 ], [ -85.004582, 32.345196 ], [ -84.986778, 32.359058 ], [ -84.983466, 32.363186 ], [ -84.983242, 32.365122 ], [ -84.983552, 32.368371 ], [ -84.982949, 32.371387 ], [ -84.980084, 32.373347 ], [ -84.978727, 32.376212 ], [ -84.979330, 32.379077 ], [ -84.980084, 32.382244 ], [ -84.980385, 32.385561 ], [ -84.979028, 32.389180 ], [ -84.976767, 32.392648 ], [ -84.977520, 32.396870 ], [ -84.979898, 32.400097 ], [ -84.981098, 32.402833 ], [ -84.979431, 32.412244 ], [ -84.971830, 32.416244 ], [ -84.963430, 32.422544 ], [ -84.963030, 32.424244 ], [ -84.967031, 32.435343 ], [ -84.971831, 32.442843 ], [ -84.983831, 32.445643 ], [ -84.993531, 32.450743 ], [ -84.995331, 32.453243 ], [ -84.998031, 32.461743 ], [ -84.998231, 32.469842 ], [ -84.995231, 32.475242 ], [ -84.994831, 32.486042 ], [ -84.996732, 32.492342 ], [ -84.998332, 32.494142 ], [ -84.998832, 32.497041 ], [ -84.999832, 32.504341 ], [ -85.001532, 32.514741 ], [ -85.007100, 32.523868 ], [ -85.008396, 32.524876 ], [ -85.013788, 32.526108 ], [ -85.015805, 32.528428 ], [ -85.020237, 32.534748 ], [ -85.022045, 32.540044 ], [ -85.022509, 32.542923 ], [ -85.035726, 32.553963 ], [ -85.056926, 32.571242 ], [ -85.067535, 32.579546 ], [ -85.076399, 32.594665 ], [ -85.080288, 32.603577 ], [ -85.080768, 32.610152 ], [ -85.082240, 32.616264 ], [ -85.083616, 32.617800 ], [ -85.085360, 32.618536 ], [ -85.087294, 32.620470 ], [ -85.088319, 32.623032 ], [ -85.088729, 32.624774 ], [ -85.088627, 32.626619 ], [ -85.087192, 32.628463 ], [ -85.086065, 32.631435 ], [ -85.086167, 32.633177 ], [ -85.087294, 32.634407 ], [ -85.088934, 32.635432 ], [ -85.092008, 32.636456 ], [ -85.096620, 32.638199 ], [ -85.098259, 32.642708 ], [ -85.097952, 32.645474 ], [ -85.096005, 32.649983 ], [ -85.094570, 32.652443 ], [ -85.089736, 32.655635 ], [ -85.088483, 32.657758 ], [ -85.093536, 32.669734 ], [ -85.104037, 32.679634 ], [ -85.112637, 32.683434 ], [ -85.114737, 32.685634 ], [ -85.117037, 32.692033 ], [ -85.122738, 32.715727 ], [ -85.120838, 32.722932 ], [ -85.119733, 32.726440 ], [ -85.119422, 32.729397 ], [ -85.119577, 32.731577 ], [ -85.119577, 32.734223 ], [ -85.119733, 32.736091 ], [ -85.120200, 32.737647 ], [ -85.121601, 32.739360 ], [ -85.124092, 32.741694 ], [ -85.127205, 32.743718 ], [ -85.132186, 32.746520 ], [ -85.136077, 32.749633 ], [ -85.138101, 32.753836 ], [ -85.138879, 32.760062 ], [ -85.138412, 32.764576 ], [ -85.136544, 32.769402 ], [ -85.133898, 32.772359 ], [ -85.133120, 32.773449 ], [ -85.132653, 32.774694 ], [ -85.132030, 32.776718 ], [ -85.132186, 32.778897 ], [ -85.133275, 32.780609 ], [ -85.134676, 32.782166 ], [ -85.139285, 32.784921 ], [ -85.151913, 32.794104 ], [ -85.162137, 32.804237 ], [ -85.167939, 32.811612 ], [ -85.168644, 32.814246 ], [ -85.168342, 32.828516 ], [ -85.164651, 32.834791 ], [ -85.160580, 32.838249 ], [ -85.159474, 32.839735 ], [ -85.159309, 32.841382 ], [ -85.159474, 32.842535 ], [ -85.159638, 32.844018 ], [ -85.160133, 32.845500 ], [ -85.160462, 32.847148 ], [ -85.160792, 32.848466 ], [ -85.161615, 32.849948 ], [ -85.163427, 32.851431 ], [ -85.165569, 32.852090 ], [ -85.167710, 32.852419 ], [ -85.170099, 32.852497 ], [ -85.177127, 32.853895 ], [ -85.179353, 32.855269 ], [ -85.184400, 32.861317 ], [ -85.184888, 32.863355 ], [ -85.184914, 32.868944 ], [ -85.184131, 32.870525 ], [ -85.184740, 32.870527 ], [ -85.188741, 32.889727 ], [ -85.221868, 33.055538 ], [ -85.223261, 33.062580 ], [ -85.232378, 33.108077 ], [ -85.304439, 33.482884 ], [ -85.313999, 33.529807 ], [ -85.314091, 33.530218 ], [ -85.314994, 33.535898 ], [ -85.357402, 33.750104 ], [ -85.360491, 33.767958 ], [ -85.361844, 33.773951 ], [ -85.377426, 33.856047 ], [ -85.398837, 33.964129 ], [ -85.405918, 34.000100 ], [ -85.406748, 34.002314 ], [ -85.420232, 34.072278 ], [ -85.428222, 34.114397 ], [ -85.429470, 34.125096 ], [ -85.455057, 34.250689 ], [ -85.455371, 34.252854 ], [ -85.458071, 34.265736 ], [ -85.458693, 34.269437 ], [ -85.470450, 34.328239 ], [ -85.502316, 34.473954 ], [ -85.502454, 34.474527 ], [ -85.508384, 34.501212 ], [ -85.512108, 34.518252 ], [ -85.513709, 34.524170 ], [ -85.513930, 34.525192 ], [ -85.517074, 34.542598 ], [ -85.527261, 34.588683 ], [ -85.534327, 34.625082 ], [ -85.541264, 34.656701 ], [ -85.541267, 34.656783 ], [ -85.552454, 34.708138 ], [ -85.552482, 34.708321 ], [ -85.561416, 34.750079 ], [ -85.583145, 34.860371 ], [ -85.595163, 34.924171 ], [ -85.595191, 34.924331 ], [ -85.598781, 34.944915 ], [ -85.599385, 34.951766 ], [ -85.605165, 34.984678 ], [ -85.466713, 34.982972 ], [ -85.384967, 34.982987 ], [ -85.363919, 34.983375 ], [ -85.308257, 34.984375 ], [ -85.305457, 34.984475 ], [ -85.301488, 34.984475 ], [ -85.294500, 34.984651 ], [ -85.277556, 34.984975 ], [ -85.275856, 34.984975 ], [ -85.265055, 34.985075 ], [ -85.254955, 34.985175 ], [ -85.235555, 34.985475 ], [ -85.230354, 34.985475 ], [ -85.221854, 34.985475 ], [ -85.220554, 34.985575 ], [ -85.217854, 34.985675 ], [ -85.216554, 34.985675 ], [ -85.185905, 34.985995 ], [ -85.180553, 34.986075 ], [ -85.045183, 34.986883 ], [ -85.045052, 34.986859 ], [ -84.979860, 34.987647 ], [ -84.955623, 34.987830 ], [ -84.944420, 34.987864 ], [ -84.939306, 34.987916 ], [ -84.861314, 34.987791 ], [ -84.858032, 34.987746 ], [ -84.831799, 34.988004 ], [ -84.824010, 34.987707 ], [ -84.820478, 34.987913 ], [ -84.817279, 34.987753 ], [ -84.810742, 34.987615 ], [ -84.809184, 34.987569 ], [ -84.808127, 34.987592 ], [ -84.731022, 34.988088 ], [ -84.727434, 34.988020 ], [ -84.624933, 34.987978 ], [ -84.621483, 34.988329 ], [ -84.509886, 34.988010 ], [ -84.509052, 34.988033 ], [ -84.394903, 34.988030 ], [ -84.393935, 34.988068 ], [ -84.321869, 34.988408 ], [ -84.129555, 34.987504 ], [ -84.029954, 34.987321 ], [ -84.021357, 34.987430 ], [ -83.936646, 34.987485 ], [ -83.831097, 34.987289 ], [ -83.749893, 34.987691 ], [ -83.619985, 34.986592 ], [ -83.620185, 34.992091 ], [ -83.549381, 34.992492 ], [ -83.322768, 34.995874 ], [ -83.190410, 34.999456 ], [ -83.108535, 35.000771 ], [ -83.105531, 34.996344 ], [ -83.104600, 34.992783 ], [ -83.104490, 34.989332 ], [ -83.106991, 34.982720 ], [ -83.110025, 34.980635 ], [ -83.112021, 34.975896 ], [ -83.120387, 34.968406 ], [ -83.121803, 34.963620 ], [ -83.121140, 34.958966 ], [ -83.124378, 34.955240 ], [ -83.127035, 34.953778 ], [ -83.126761, 34.948742 ], [ -83.122940, 34.944513 ], [ -83.121214, 34.942684 ], [ -83.120502, 34.941262 ], [ -83.121112, 34.939129 ], [ -83.122585, 34.938062 ], [ -83.125175, 34.937047 ], [ -83.128070, 34.938113 ], [ -83.129493, 34.937402 ], [ -83.130356, 34.935167 ], [ -83.129885, 34.932351 ], [ -83.130554, 34.930932 ], [ -83.140621, 34.924915 ], [ -83.143261, 34.924756 ], [ -83.149946, 34.927218 ], [ -83.153253, 34.926342 ], [ -83.155879, 34.924300 ], [ -83.158019, 34.920117 ], [ -83.160937, 34.918269 ], [ -83.165022, 34.918853 ], [ -83.168524, 34.917880 ], [ -83.170754, 34.914231 ], [ -83.174034, 34.910911 ], [ -83.178932, 34.908250 ], [ -83.180871, 34.904708 ], [ -83.186541, 34.899534 ], [ -83.190409, 34.897940 ], [ -83.194786, 34.897843 ], [ -83.197627, 34.895046 ], [ -83.203351, 34.893717 ], [ -83.204572, 34.890284 ], [ -83.201183, 34.884653 ], [ -83.205627, 34.880142 ], [ -83.209683, 34.880279 ], [ -83.213323, 34.882796 ], [ -83.220099, 34.878124 ], [ -83.229240, 34.879907 ], [ -83.232379, 34.878051 ], [ -83.237510, 34.877057 ], [ -83.239081, 34.875661 ], [ -83.238557, 34.872868 ], [ -83.238419, 34.869771 ], [ -83.240847, 34.866736 ], [ -83.245602, 34.865522 ], [ -83.247018, 34.863094 ], [ -83.247220, 34.858440 ], [ -83.250053, 34.856012 ], [ -83.252582, 34.853483 ], [ -83.253762, 34.848057 ], [ -83.254605, 34.846402 ], [ -83.255718, 34.845592 ], [ -83.258146, 34.844985 ], [ -83.259860, 34.845629 ], [ -83.262193, 34.846402 ], [ -83.264520, 34.846402 ], [ -83.267656, 34.845289 ], [ -83.269982, 34.837196 ], [ -83.267293, 34.832748 ], [ -83.268159, 34.821393 ], [ -83.271214, 34.818440 ], [ -83.275656, 34.816862 ], [ -83.283151, 34.821328 ], [ -83.284812, 34.823043 ], [ -83.289914, 34.824477 ], [ -83.291120, 34.822508 ], [ -83.291325, 34.818833 ], [ -83.294292, 34.814725 ], [ -83.297259, 34.814268 ], [ -83.299428, 34.814268 ], [ -83.301368, 34.814154 ], [ -83.302395, 34.813241 ], [ -83.302965, 34.812214 ], [ -83.302965, 34.811073 ], [ -83.301482, 34.808677 ], [ -83.301182, 34.804008 ], [ -83.303643, 34.802403 ], [ -83.313782, 34.799911 ], [ -83.323866, 34.789712 ], [ -83.319945, 34.773725 ], [ -83.321008, 34.765371 ], [ -83.320062, 34.759616 ], [ -83.338666, 34.742295 ], [ -83.348829, 34.737194 ], [ -83.353238, 34.728648 ], [ -83.352485, 34.715993 ], [ -83.351392, 34.714456 ], [ -83.350976, 34.713243 ], [ -83.349788, 34.708274 ], [ -83.347718, 34.705474 ], [ -83.347831, 34.703669 ], [ -83.349636, 34.700960 ], [ -83.349975, 34.699155 ], [ -83.349411, 34.697575 ], [ -83.347831, 34.696108 ], [ -83.344671, 34.693512 ], [ -83.342414, 34.691255 ], [ -83.340383, 34.688998 ], [ -83.339367, 34.686967 ], [ -83.339029, 34.683807 ], [ -83.338690, 34.682002 ], [ -83.336207, 34.680534 ], [ -83.330284, 34.681342 ], [ -83.325336, 34.679517 ], [ -83.321463, 34.677543 ], [ -83.319440, 34.675974 ], [ -83.318524, 34.674773 ], [ -83.316401, 34.669316 ], [ -83.314394, 34.668944 ], [ -83.308917, 34.670273 ], [ -83.304641, 34.669561 ], [ -83.301477, 34.666582 ], [ -83.300848, 34.662470 ], [ -83.292883, 34.654196 ], [ -83.286583, 34.650896 ], [ -83.277960, 34.644853 ], [ -83.271982, 34.641896 ], [ -83.262282, 34.640296 ], [ -83.255281, 34.637696 ], [ -83.248281, 34.631696 ], [ -83.244581, 34.626297 ], [ -83.240669, 34.624507 ], [ -83.240676, 34.624307 ], [ -83.243381, 34.617997 ], [ -83.231780, 34.611297 ], [ -83.221402, 34.609947 ], [ -83.211598, 34.610905 ], [ -83.199779, 34.608398 ], [ -83.196979, 34.605998 ], [ -83.179439, 34.608020 ], [ -83.173428, 34.607162 ], [ -83.169994, 34.605444 ], [ -83.169572, 34.603866 ], [ -83.169994, 34.602010 ], [ -83.170978, 34.598798 ], [ -83.170278, 34.592398 ], [ -83.168278, 34.590998 ], [ -83.154577, 34.588198 ], [ -83.152577, 34.578299 ], [ -83.139876, 34.567999 ], [ -83.129676, 34.561699 ], [ -83.127176, 34.561999 ], [ -83.122901, 34.560129 ], [ -83.103987, 34.540166 ], [ -83.103176, 34.533406 ], [ -83.102179, 34.532179 ], [ -83.096858, 34.531524 ], [ -83.092564, 34.532944 ], [ -83.087789, 34.532078 ], [ -83.084855, 34.530967 ], [ -83.078113, 34.524837 ], [ -83.077995, 34.523746 ], [ -83.086861, 34.517798 ], [ -83.087189, 34.515939 ], [ -83.069451, 34.502131 ], [ -83.065515, 34.501126 ], [ -83.057843, 34.503711 ], [ -83.054463, 34.502890 ], [ -83.048289, 34.493254 ], [ -83.043771, 34.488816 ], [ -83.034712, 34.483495 ], [ -83.032513, 34.483032 ], [ -83.029315, 34.484147 ], [ -83.002924, 34.472132 ], [ -82.995090, 34.472483 ], [ -82.995279, 34.475648 ], [ -82.992671, 34.479072 ], [ -82.979568, 34.482702 ], [ -82.960668, 34.482002 ], [ -82.954667, 34.477302 ], [ -82.947367, 34.479602 ], [ -82.940867, 34.486102 ], [ -82.928466, 34.484202 ], [ -82.925766, 34.481802 ], [ -82.922866, 34.481402 ], [ -82.908365, 34.485402 ], [ -82.902665, 34.485902 ], [ -82.882864, 34.479003 ], [ -82.876864, 34.475303 ], [ -82.873831, 34.471508 ], [ -82.874864, 34.468891 ], [ -82.875864, 34.468003 ], [ -82.876464, 34.465803 ], [ -82.875463, 34.463503 ], [ -82.865345, 34.460319 ], [ -82.862156, 34.458748 ], [ -82.860707, 34.457428 ], [ -82.860874, 34.451469 ], [ -82.860127, 34.449707 ], [ -82.855762, 34.443977 ], [ -82.854434, 34.432275 ], [ -82.851367, 34.426812 ], [ -82.848651, 34.423844 ], [ -82.847781, 34.420571 ], [ -82.847446, 34.412049 ], [ -82.841997, 34.399766 ], [ -82.841326, 34.397332 ], [ -82.841997, 34.392503 ], [ -82.841524, 34.390130 ], [ -82.836611, 34.382676 ], [ -82.835203, 34.373899 ], [ -82.835413, 34.369177 ], [ -82.835004, 34.366069 ], [ -82.833702, 34.364242 ], [ -82.823420, 34.358872 ], [ -82.809949, 34.349998 ], [ -82.798198, 34.341317 ], [ -82.795223, 34.340960 ], [ -82.794054, 34.339772 ], [ -82.791235, 34.331048 ], [ -82.791608, 34.327428 ], [ -82.790966, 34.323550 ], [ -82.786840, 34.310381 ], [ -82.781752, 34.302901 ], [ -82.780308, 34.296701 ], [ -82.770928, 34.285402 ], [ -82.765266, 34.281539 ], [ -82.762945, 34.281990 ], [ -82.761995, 34.281492 ], [ -82.755028, 34.276067 ], [ -82.749856, 34.270870 ], [ -82.746656, 34.266407 ], [ -82.748656, 34.264107 ], [ -82.748756, 34.263407 ], [ -82.744056, 34.252407 ], [ -82.744982, 34.244861 ], [ -82.744834, 34.242957 ], [ -82.741980, 34.230196 ], [ -82.743461, 34.227343 ], [ -82.744415, 34.224913 ], [ -82.740447, 34.219679 ], [ -82.740544, 34.218387 ], [ -82.742380, 34.213766 ], [ -82.741920, 34.210063 ], [ -82.732761, 34.195338 ], [ -82.731975, 34.193154 ], [ -82.732359, 34.180564 ], [ -82.731881, 34.178363 ], [ -82.730824, 34.175906 ], [ -82.725409, 34.169774 ], [ -82.723312, 34.165895 ], [ -82.717507, 34.150504 ], [ -82.715373, 34.148165 ], [ -82.704140, 34.141007 ], [ -82.699758, 34.139318 ], [ -82.695530, 34.138815 ], [ -82.692152, 34.138986 ], [ -82.690386, 34.138293 ], [ -82.686290, 34.134454 ], [ -82.677320, 34.131657 ], [ -82.675220, 34.129779 ], [ -82.668113, 34.120160 ], [ -82.666879, 34.113591 ], [ -82.661851, 34.107754 ], [ -82.660322, 34.106897 ], [ -82.659077, 34.103544 ], [ -82.658561, 34.103118 ], [ -82.654019, 34.100346 ], [ -82.652175, 34.099704 ], [ -82.648184, 34.098649 ], [ -82.647028, 34.097825 ], [ -82.641553, 34.092212 ], [ -82.641030, 34.090861 ], [ -82.641252, 34.088914 ], [ -82.640701, 34.088341 ], [ -82.640151, 34.087609 ], [ -82.640345, 34.086304 ], [ -82.642797, 34.081312 ], [ -82.645220, 34.079046 ], [ -82.645661, 34.076046 ], [ -82.643980, 34.072237 ], [ -82.640543, 34.067595 ], [ -82.635991, 34.064941 ], [ -82.633565, 34.064822 ], [ -82.630972, 34.065528 ], [ -82.626963, 34.063457 ], [ -82.622155, 34.058516 ], [ -82.621255, 34.056916 ], [ -82.620955, 34.054416 ], [ -82.619155, 34.051316 ], [ -82.613355, 34.046816 ], [ -82.609655, 34.039917 ], [ -82.603055, 34.034817 ], [ -82.596155, 34.030517 ], [ -82.594555, 34.028717 ], [ -82.594055, 34.025917 ], [ -82.595855, 34.018518 ], [ -82.595655, 34.016118 ], [ -82.591855, 34.009018 ], [ -82.589245, 34.000118 ], [ -82.586234, 33.997151 ], [ -82.583394, 33.995286 ], [ -82.577735, 33.993743 ], [ -82.576222, 33.993106 ], [ -82.575540, 33.992049 ], [ -82.575351, 33.990904 ], [ -82.576330, 33.989694 ], [ -82.578244, 33.988671 ], [ -82.579996, 33.987011 ], [ -82.580571, 33.985140 ], [ -82.580551, 33.982463 ], [ -82.579576, 33.979761 ], [ -82.577540, 33.977034 ], [ -82.574724, 33.974113 ], [ -82.569864, 33.970684 ], [ -82.568288, 33.968772 ], [ -82.566145, 33.963900 ], [ -82.565700, 33.958682 ], [ -82.564582, 33.955810 ], [ -82.556835, 33.945353 ], [ -82.554497, 33.943819 ], [ -82.543128, 33.940949 ], [ -82.539770, 33.941551 ], [ -82.534111, 33.943651 ], [ -82.526741, 33.943765 ], [ -82.524515, 33.943360 ], [ -82.512950, 33.936969 ], [ -82.507640, 33.931456 ], [ -82.503584, 33.926048 ], [ -82.496109, 33.913459 ], [ -82.492929, 33.909754 ], [ -82.480111, 33.901897 ], [ -82.469913, 33.892838 ], [ -82.459391, 33.886386 ], [ -82.455105, 33.881650 ], [ -82.448109, 33.877543 ], [ -82.440503, 33.875123 ], [ -82.438644, 33.873919 ], [ -82.431150, 33.867051 ], [ -82.429164, 33.865844 ], [ -82.422803, 33.863754 ], [ -82.417871, 33.864233 ], [ -82.414259, 33.865348 ], [ -82.408354, 33.866320 ], [ -82.403881, 33.865477 ], [ -82.400517, 33.863343 ], [ -82.395736, 33.859089 ], [ -82.390527, 33.857162 ], [ -82.384973, 33.854428 ], [ -82.379750, 33.851086 ], [ -82.374286, 33.845590 ], [ -82.371775, 33.843813 ], [ -82.369107, 33.842375 ], [ -82.351881, 33.836432 ], [ -82.346933, 33.834298 ], [ -82.337829, 33.827156 ], [ -82.324480, 33.820033 ], [ -82.314746, 33.811499 ], [ -82.313339, 33.809205 ], [ -82.308997, 33.805892 ], [ -82.302885, 33.802907 ], [ -82.300213, 33.800627 ], [ -82.299280, 33.798939 ], [ -82.298923, 33.795839 ], [ -82.299601, 33.786483 ], [ -82.299393, 33.785037 ], [ -82.298286, 33.783518 ], [ -82.294984, 33.781868 ], [ -82.292468, 33.782406 ], [ -82.289762, 33.782032 ], [ -82.285804, 33.780058 ], [ -82.281060, 33.776056 ], [ -82.277681, 33.772032 ], [ -82.270445, 33.767913 ], [ -82.267719, 33.767651 ], [ -82.266127, 33.766745 ], [ -82.265019, 33.765742 ], [ -82.264380, 33.763481 ], [ -82.263206, 33.761962 ], [ -82.259471, 33.760245 ], [ -82.258049, 33.760429 ], [ -82.255267, 33.759690 ], [ -82.247472, 33.752591 ], [ -82.246161, 33.746347 ], [ -82.240405, 33.734901 ], [ -82.239098, 33.730872 ], [ -82.235753, 33.714390 ], [ -82.237192, 33.707880 ], [ -82.234576, 33.700216 ], [ -82.222709, 33.689124 ], [ -82.218649, 33.686299 ], [ -82.216868, 33.684400 ], [ -82.212047, 33.677317 ], [ -82.209677, 33.671760 ], [ -82.208411, 33.669872 ], [ -82.200718, 33.664640 ], [ -82.199847, 33.661758 ], [ -82.199747, 33.657611 ], [ -82.201186, 33.646898 ], [ -82.196583, 33.630582 ], [ -82.186154, 33.620880 ], [ -82.179854, 33.615945 ], [ -82.174351, 33.613117 ], [ -82.161908, 33.610643 ], [ -82.158331, 33.609710 ], [ -82.156288, 33.608630 ], [ -82.153357, 33.606319 ], [ -82.151060, 33.600956 ], [ -82.148816, 33.598092 ], [ -82.142872, 33.594278 ], [ -82.133523, 33.590535 ], [ -82.129080, 33.589925 ], [ -82.125864, 33.590741 ], [ -82.120385, 33.594885 ], [ -82.116545, 33.596485 ], [ -82.109376, 33.596581 ], [ -82.106240, 33.595637 ], [ -82.098816, 33.586358 ], [ -82.096352, 33.584070 ], [ -82.094128, 33.582742 ], [ -82.087488, 33.580614 ], [ -82.073104, 33.577510 ], [ -82.069039, 33.575382 ], [ -82.057727, 33.566774 ], [ -82.054943, 33.565382 ], [ -82.048959, 33.564870 ], [ -82.046335, 33.563830 ], [ -82.037375, 33.554662 ], [ -82.034895, 33.549158 ], [ -82.033023, 33.546454 ], [ -82.028238, 33.544934 ], [ -82.023438, 33.540734 ], [ -82.023438, 33.537935 ], [ -82.019838, 33.535035 ], [ -82.011538, 33.531735 ], [ -82.010038, 33.530435 ], [ -82.007638, 33.523335 ], [ -82.007138, 33.522835 ], [ -82.004338, 33.521935 ], [ -82.001338, 33.520135 ], [ -81.991938, 33.504435 ], [ -81.990382, 33.500759 ], [ -81.990938, 33.494235 ], [ -81.989338, 33.490036 ], [ -81.985938, 33.486536 ], [ -81.980637, 33.484036 ], [ -81.973537, 33.482636 ], [ -81.967037, 33.480636 ], [ -81.946437, 33.471737 ], [ -81.941737, 33.470037 ], [ -81.934136, 33.468337 ], [ -81.929436, 33.465837 ], [ -81.926336, 33.462937 ], [ -81.920836, 33.452038 ], [ -81.913532, 33.441274 ], [ -81.913457, 33.439641 ], [ -81.913356, 33.437418 ], [ -81.916236, 33.433114 ], [ -81.920716, 33.430986 ], [ -81.924981, 33.429288 ], [ -81.926789, 33.426576 ], [ -81.927241, 33.422846 ], [ -81.924893, 33.419307 ], [ -81.921068, 33.417419 ], [ -81.919330, 33.415613 ], [ -81.919217, 33.413126 ], [ -81.920121, 33.410753 ], [ -81.923060, 33.408266 ], [ -81.930519, 33.406797 ], [ -81.934927, 33.406006 ], [ -81.936961, 33.404197 ], [ -81.937300, 33.401259 ], [ -81.935453, 33.397851 ], [ -81.930861, 33.380076 ], [ -81.924837, 33.374140 ], [ -81.925737, 33.371140 ], [ -81.930634, 33.368165 ], [ -81.934637, 33.368940 ], [ -81.939637, 33.372540 ], [ -81.943737, 33.372340 ], [ -81.946337, 33.370640 ], [ -81.946737, 33.367340 ], [ -81.944737, 33.364041 ], [ -81.934837, 33.356041 ], [ -81.935637, 33.352041 ], [ -81.939837, 33.347741 ], [ -81.939737, 33.344941 ], [ -81.937237, 33.343641 ], [ -81.932737, 33.343541 ], [ -81.924737, 33.345341 ], [ -81.917973, 33.341590 ], [ -81.919137, 33.334442 ], [ -81.918337, 33.332842 ], [ -81.913314, 33.329532 ], [ -81.911266, 33.327616 ], [ -81.910342, 33.325370 ], [ -81.909285, 33.324181 ], [ -81.906444, 33.324181 ], [ -81.904132, 33.327286 ], [ -81.902613, 33.330258 ], [ -81.900301, 33.331117 ], [ -81.898187, 33.329664 ], [ -81.896937, 33.327642 ], [ -81.897064, 33.324445 ], [ -81.897329, 33.322331 ], [ -81.886637, 33.316943 ], [ -81.884137, 33.310443 ], [ -81.875836, 33.307443 ], [ -81.870436, 33.312943 ], [ -81.867936, 33.314043 ], [ -81.853652, 33.310326 ], [ -81.847296, 33.306783 ], [ -81.846136, 33.303843 ], [ -81.849636, 33.299544 ], [ -81.851636, 33.298544 ], [ -81.852936, 33.299644 ], [ -81.857336, 33.299544 ], [ -81.861536, 33.297944 ], [ -81.863236, 33.288844 ], [ -81.861336, 33.286244 ], [ -81.851836, 33.283544 ], [ -81.844036, 33.278644 ], [ -81.838257, 33.272975 ], [ -81.838337, 33.269098 ], [ -81.840078, 33.267040 ], [ -81.842522, 33.266584 ], [ -81.847336, 33.266345 ], [ -81.853137, 33.250745 ], [ -81.852136, 33.247544 ], [ -81.846536, 33.241746 ], [ -81.837016, 33.237652 ], [ -81.831736, 33.233546 ], [ -81.827936, 33.228746 ], [ -81.819636, 33.226646 ], [ -81.811736, 33.223847 ], [ -81.809636, 33.222647 ], [ -81.808136, 33.219447 ], [ -81.807936, 33.213747 ], [ -81.807336, 33.212647 ], [ -81.805236, 33.211447 ], [ -81.790236, 33.208447 ], [ -81.784535, 33.208147 ], [ -81.778935, 33.209847 ], [ -81.777535, 33.211347 ], [ -81.777335, 33.214947 ], [ -81.781035, 33.219847 ], [ -81.780135, 33.221147 ], [ -81.778435, 33.221847 ], [ -81.774035, 33.221147 ], [ -81.768935, 33.217447 ], [ -81.767635, 33.215747 ], [ -81.763535, 33.203648 ], [ -81.761635, 33.201748 ], [ -81.758235, 33.200248 ], [ -81.756935, 33.197848 ], [ -81.760635, 33.189248 ], [ -81.762835, 33.188248 ], [ -81.765735, 33.187948 ], [ -81.772435, 33.181249 ], [ -81.772435, 33.180449 ], [ -81.766735, 33.170749 ], [ -81.764435, 33.165549 ], [ -81.763135, 33.159449 ], [ -81.755135, 33.151550 ], [ -81.743835, 33.141450 ], [ -81.724334, 33.129451 ], [ -81.717134, 33.124051 ], [ -81.704634, 33.116451 ], [ -81.703134, 33.116151 ], [ -81.699834, 33.116751 ], [ -81.696934, 33.116551 ], [ -81.683533, 33.112651 ], [ -81.658433, 33.103152 ], [ -81.646433, 33.094552 ], [ -81.642333, 33.093152 ], [ -81.637232, 33.092952 ], [ -81.632232, 33.093952 ], [ -81.617779, 33.095277 ], [ -81.615132, 33.095036 ], [ -81.612725, 33.093953 ], [ -81.610800, 33.092630 ], [ -81.609476, 33.089862 ], [ -81.609533, 33.086877 ], [ -81.609837, 33.084929 ], [ -81.610078, 33.082883 ], [ -81.609837, 33.082161 ], [ -81.608995, 33.081800 ], [ -81.606836, 33.081717 ], [ -81.603587, 33.084578 ], [ -81.601655, 33.084688 ], [ -81.600211, 33.083966 ], [ -81.598165, 33.081078 ], [ -81.598286, 33.079153 ], [ -81.599369, 33.076867 ], [ -81.600211, 33.075182 ], [ -81.600091, 33.073497 ], [ -81.599248, 33.071813 ], [ -81.594555, 33.069887 ], [ -81.592645, 33.069910 ], [ -81.590705, 33.071211 ], [ -81.588539, 33.070850 ], [ -81.583804, 33.067021 ], [ -81.580994, 33.062697 ], [ -81.578332, 33.058936 ], [ -81.572880, 33.054180 ], [ -81.568925, 33.053523 ], [ -81.566759, 33.053763 ], [ -81.564714, 33.054726 ], [ -81.563270, 33.055568 ], [ -81.562548, 33.055568 ], [ -81.562066, 33.055568 ], [ -81.561344, 33.055568 ], [ -81.560502, 33.055207 ], [ -81.559179, 33.054124 ], [ -81.558938, 33.052921 ], [ -81.559173, 33.051765 ], [ -81.559660, 33.049070 ], [ -81.559179, 33.047386 ], [ -81.558336, 33.046183 ], [ -81.557013, 33.045100 ], [ -81.553643, 33.044137 ], [ -81.551838, 33.044739 ], [ -81.546785, 33.047145 ], [ -81.544258, 33.046905 ], [ -81.542092, 33.044859 ], [ -81.540081, 33.040613 ], [ -81.538789, 33.039185 ], [ -81.519632, 33.029181 ], [ -81.513231, 33.028546 ], [ -81.511245, 33.027786 ], [ -81.502030, 33.015113 ], [ -81.492253, 33.009342 ], [ -81.491419, 33.008078 ], [ -81.491197, 32.997824 ], [ -81.491457, 32.995437 ], [ -81.494736, 32.978998 ], [ -81.499471, 32.964780 ], [ -81.499830, 32.963816 ], [ -81.501369, 32.962914 ], [ -81.503346, 32.962950 ], [ -81.505256, 32.963019 ], [ -81.506449, 32.962423 ], [ -81.507144, 32.961330 ], [ -81.507442, 32.960237 ], [ -81.507741, 32.959243 ], [ -81.508436, 32.958349 ], [ -81.508536, 32.957156 ], [ -81.508436, 32.955765 ], [ -81.508138, 32.953976 ], [ -81.507045, 32.951194 ], [ -81.504016, 32.948091 ], [ -81.499446, 32.944988 ], [ -81.499566, 32.943722 ], [ -81.502716, 32.938688 ], [ -81.502427, 32.935353 ], [ -81.499829, 32.932614 ], [ -81.495092, 32.931596 ], [ -81.483198, 32.921802 ], [ -81.480008, 32.913444 ], [ -81.479184, 32.905638 ], [ -81.468978, 32.901083 ], [ -81.465924, 32.899889 ], [ -81.464069, 32.897814 ], [ -81.464655, 32.895999 ], [ -81.470836, 32.890521 ], [ -81.471703, 32.890439 ], [ -81.477100, 32.887469 ], [ -81.479445, 32.881082 ], [ -81.475918, 32.877641 ], [ -81.470376, 32.876267 ], [ -81.468042, 32.876675 ], [ -81.453920, 32.874074 ], [ -81.452883, 32.872964 ], [ -81.451351, 32.868583 ], [ -81.453017, 32.859636 ], [ -81.455978, 32.854107 ], [ -81.453949, 32.849761 ], [ -81.452573, 32.847950 ], [ -81.451199, 32.847925 ], [ -81.449396, 32.849126 ], [ -81.444866, 32.850967 ], [ -81.443595, 32.850628 ], [ -81.442671, 32.850107 ], [ -81.426475, 32.840773 ], [ -81.421614, 32.835178 ], [ -81.420620, 32.831223 ], [ -81.417984, 32.818196 ], [ -81.418497, 32.815664 ], [ -81.419752, 32.813731 ], [ -81.423772, 32.810514 ], [ -81.424874, 32.801882 ], [ -81.425234, 32.794190 ], [ -81.424999, 32.790334 ], [ -81.428031, 32.787618 ], [ -81.429017, 32.785505 ], [ -81.428313, 32.783110 ], [ -81.426481, 32.781420 ], [ -81.424227, 32.780152 ], [ -81.422114, 32.779306 ], [ -81.421128, 32.778039 ], [ -81.420987, 32.776912 ], [ -81.421128, 32.775926 ], [ -81.421269, 32.774658 ], [ -81.422678, 32.773249 ], [ -81.424714, 32.772648 ], [ -81.425636, 32.771840 ], [ -81.426059, 32.771136 ], [ -81.426481, 32.770291 ], [ -81.426481, 32.769023 ], [ -81.426199, 32.768319 ], [ -81.425017, 32.768058 ], [ -81.422396, 32.767051 ], [ -81.420142, 32.765501 ], [ -81.417606, 32.762684 ], [ -81.416479, 32.760289 ], [ -81.415212, 32.757753 ], [ -81.416479, 32.754654 ], [ -81.416761, 32.752259 ], [ -81.416198, 32.750428 ], [ -81.415353, 32.748879 ], [ -81.412817, 32.748174 ], [ -81.411408, 32.747329 ], [ -81.410563, 32.745920 ], [ -81.410281, 32.744653 ], [ -81.410563, 32.743244 ], [ -81.410845, 32.741694 ], [ -81.411549, 32.740145 ], [ -81.412670, 32.739083 ], [ -81.418542, 32.732586 ], [ -81.420516, 32.720238 ], [ -81.421194, 32.711978 ], [ -81.427517, 32.701896 ], [ -81.426735, 32.700867 ], [ -81.413100, 32.692648 ], [ -81.411609, 32.693145 ], [ -81.411157, 32.693959 ], [ -81.410750, 32.694772 ], [ -81.409982, 32.695179 ], [ -81.409349, 32.695269 ], [ -81.408310, 32.694908 ], [ -81.401256, 32.680156 ], [ -81.401029, 32.677494 ], [ -81.404287, 32.667798 ], [ -81.406646, 32.662515 ], [ -81.407300, 32.661560 ], [ -81.407193, 32.660519 ], [ -81.405273, 32.656517 ], [ -81.398314, 32.656307 ], [ -81.393818, 32.653491 ], [ -81.393033, 32.651543 ], [ -81.394589, 32.649570 ], [ -81.403582, 32.643398 ], [ -81.405109, 32.642690 ], [ -81.404238, 32.638258 ], [ -81.402735, 32.637032 ], [ -81.402846, 32.636210 ], [ -81.407271, 32.631737 ], [ -81.409330, 32.631096 ], [ -81.410260, 32.631392 ], [ -81.411523, 32.632907 ], [ -81.413411, 32.637368 ], [ -81.414761, 32.637440 ], [ -81.417014, 32.636147 ], [ -81.418431, 32.634704 ], [ -81.418660, 32.629392 ], [ -81.411906, 32.618410 ], [ -81.404714, 32.611207 ], [ -81.397106, 32.605587 ], [ -81.393865, 32.602340 ], [ -81.389338, 32.595436 ], [ -81.380999, 32.589652 ], [ -81.379216, 32.589022 ], [ -81.376237, 32.589217 ], [ -81.373178, 32.592115 ], [ -81.371570, 32.592018 ], [ -81.369757, 32.591231 ], [ -81.368982, 32.590025 ], [ -81.368386, 32.584221 ], [ -81.366964, 32.577059 ], [ -81.328753, 32.561228 ], [ -81.320588, 32.559534 ], [ -81.309009, 32.560970 ], [ -81.300593, 32.562843 ], [ -81.297955, 32.563026 ], [ -81.296760, 32.562648 ], [ -81.281324, 32.556464 ], [ -81.279238, 32.554590 ], [ -81.275213, 32.545202 ], [ -81.274927, 32.544158 ], [ -81.274802, 32.541143 ], [ -81.276242, 32.538558 ], [ -81.277131, 32.535417 ], [ -81.252882, 32.518330 ], [ -81.249827, 32.517541 ], [ -81.247874, 32.518231 ], [ -81.245010, 32.518317 ], [ -81.237095, 32.517314 ], [ -81.234660, 32.516270 ], [ -81.234023, 32.513778 ], [ -81.234834, 32.512271 ], [ -81.236707, 32.511402 ], [ -81.238411, 32.510192 ], [ -81.238728, 32.508896 ], [ -81.238281, 32.505988 ], [ -81.233585, 32.498488 ], [ -81.227528, 32.493884 ], [ -81.212428, 32.478685 ], [ -81.200029, 32.467985 ], [ -81.194829, 32.465086 ], [ -81.192429, 32.464786 ], [ -81.189229, 32.465586 ], [ -81.188129, 32.465386 ], [ -81.186829, 32.464086 ], [ -81.187329, 32.462886 ], [ -81.192629, 32.456286 ], [ -81.197529, 32.452086 ], [ -81.200908, 32.451593 ], [ -81.202359, 32.450448 ], [ -81.203046, 32.448844 ], [ -81.203046, 32.447164 ], [ -81.202206, 32.445484 ], [ -81.201137, 32.444033 ], [ -81.201137, 32.442964 ], [ -81.201595, 32.441360 ], [ -81.202588, 32.439833 ], [ -81.204530, 32.438687 ], [ -81.207246, 32.437542 ], [ -81.208430, 32.435987 ], [ -81.205130, 32.423788 ], [ -81.194931, 32.411489 ], [ -81.189731, 32.407289 ], [ -81.180931, 32.396490 ], [ -81.177231, 32.391690 ], [ -81.178131, 32.384590 ], [ -81.181072, 32.380398 ], [ -81.173432, 32.372591 ], [ -81.169332, 32.369436 ], [ -81.168722, 32.367544 ], [ -81.169332, 32.365591 ], [ -81.170553, 32.363821 ], [ -81.170858, 32.362722 ], [ -81.170126, 32.361318 ], [ -81.161732, 32.356092 ], [ -81.155032, 32.350093 ], [ -81.154974, 32.348794 ], [ -81.155136, 32.347170 ], [ -81.154812, 32.346412 ], [ -81.154433, 32.346087 ], [ -81.154000, 32.345924 ], [ -81.153296, 32.345816 ], [ -81.152105, 32.345816 ], [ -81.150589, 32.345870 ], [ -81.149073, 32.346682 ], [ -81.148477, 32.347549 ], [ -81.147632, 32.349393 ], [ -81.144032, 32.351093 ], [ -81.142532, 32.350893 ], [ -81.140932, 32.349393 ], [ -81.133632, 32.341293 ], [ -81.133032, 32.334794 ], [ -81.137032, 32.329994 ], [ -81.137633, 32.328194 ], [ -81.135733, 32.324594 ], [ -81.125433, 32.309295 ], [ -81.123933, 32.308695 ], [ -81.122933, 32.307295 ], [ -81.122333, 32.305395 ], [ -81.119833, 32.289596 ], [ -81.119633, 32.287596 ], [ -81.121433, 32.284496 ], [ -81.128034, 32.276297 ], [ -81.130834, 32.274597 ], [ -81.136534, 32.272697 ], [ -81.145834, 32.263397 ], [ -81.148334, 32.255098 ], [ -81.155595, 32.246022 ], [ -81.156587, 32.243910 ], [ -81.155995, 32.241478 ], [ -81.153531, 32.237687 ], [ -81.143139, 32.221731 ], [ -81.136727, 32.213669 ], [ -81.136012, 32.212858 ], [ -81.128283, 32.208634 ], [ -81.123150, 32.201329 ], [ -81.118234, 32.189201 ], [ -81.117934, 32.185301 ], [ -81.119834, 32.181202 ], [ -81.120434, 32.178702 ], [ -81.119361, 32.177142 ], [ -81.119434, 32.175402 ], [ -81.121134, 32.174902 ], [ -81.124492, 32.172120 ], [ -81.128134, 32.169102 ], [ -81.129402, 32.166922 ], [ -81.129634, 32.165602 ], [ -81.128434, 32.164402 ], [ -81.123134, 32.162902 ], [ -81.122034, 32.161803 ], [ -81.120034, 32.153303 ], [ -81.118334, 32.144403 ], [ -81.119134, 32.142104 ], [ -81.119994, 32.134268 ], [ -81.117234, 32.117605 ], [ -81.113334, 32.113205 ], [ -81.111134, 32.112005 ], [ -81.100458, 32.111181 ], [ -81.093386, 32.111230 ], [ -81.091498, 32.110782 ], [ -81.090874, 32.106990 ], [ -81.088234, 32.103950 ], [ -81.083546, 32.100782 ], [ -81.066906, 32.090351 ], [ -81.060442, 32.087503 ], [ -81.050234, 32.085308 ], [ -81.038265, 32.084469 ], [ -81.032674, 32.085450 ], [ -81.021622, 32.090897 ], [ -81.016009, 32.097424 ], [ -81.011961, 32.100176 ], [ -81.006745, 32.101152 ], [ -81.002297, 32.100048 ], [ -80.999833, 32.099014 ], [ -80.994333, 32.094608 ], [ -80.991733, 32.091208 ], [ -80.987733, 32.084209 ], [ -80.983133, 32.079609 ], [ -80.978833, 32.077309 ], [ -80.959402, 32.071259 ], [ -80.954482, 32.068622 ], [ -80.943226, 32.057824 ], [ -80.933557, 32.047554 ], [ -80.926753, 32.041672 ], [ -80.922794, 32.039151 ], [ -80.917845, 32.037575 ], [ -80.910669, 32.036735 ], [ -80.892977, 32.034949 ], [ -80.885517, 32.034600 ], [ -80.859111, 32.023693 ], [ -80.852276, 32.026676 ], [ -80.843130, 32.024226 ], [ -80.840549, 32.011306 ], [ -80.841913, 32.002643 ], [ -80.848441, 31.988279 ], [ -80.862814, 31.969346 ], [ -80.882814, 31.959075 ], [ -80.897687, 31.949065 ], [ -80.911207, 31.943769 ], [ -80.929101, 31.944964 ], [ -80.930279, 31.956705 ], [ -80.948491, 31.957230 ], [ -80.972392, 31.941270 ], [ -80.975714, 31.923602 ], [ -80.968494, 31.915822 ], [ -80.954469, 31.911768 ], [ -80.941359, 31.912984 ], [ -80.934508, 31.909180 ], [ -80.947294, 31.896210 ], [ -80.971434, 31.877941 ], [ -80.992690, 31.857641 ], [ -81.000317, 31.856744 ], [ -81.014478, 31.867474 ], [ -81.041548, 31.876198 ], [ -81.065255, 31.877095 ], [ -81.058596, 31.857811 ], [ -81.059070, 31.850106 ], [ -81.062790, 31.844740 ], [ -81.076178, 31.836132 ], [ -81.075812, 31.829031 ], [ -81.057181, 31.822687 ], [ -81.050946, 31.822383 ], [ -81.047940, 31.824881 ], [ -81.039808, 31.823000 ], [ -81.036958, 31.819558 ], [ -81.036873, 31.812721 ], [ -81.047345, 31.802865 ], [ -81.068116, 31.768735 ], [ -81.077057, 31.761256 ], [ -81.097402, 31.753126 ], [ -81.130634, 31.722692 ], [ -81.138448, 31.720934 ], [ -81.160670, 31.728144 ], [ -81.192784, 31.733245 ], [ -81.203572, 31.719448 ], [ -81.186303, 31.701509 ], [ -81.161084, 31.691401 ], [ -81.154624, 31.693874 ], [ -81.151888, 31.698411 ], [ -81.149369, 31.699304 ], [ -81.139394, 31.699917 ], [ -81.131137, 31.695774 ], [ -81.135608, 31.683491 ], [ -81.136408, 31.674832 ], [ -81.131728, 31.654484 ], [ -81.133493, 31.623348 ], [ -81.149970, 31.593476 ], [ -81.160364, 31.570436 ], [ -81.173079, 31.555908 ], [ -81.178822, 31.555530 ], [ -81.183252, 31.560058 ], [ -81.186114, 31.568032 ], [ -81.204315, 31.568183 ], [ -81.214536, 31.557601 ], [ -81.240699, 31.552313 ], [ -81.254218, 31.555940 ], [ -81.260076, 31.548280 ], [ -81.263905, 31.532579 ], [ -81.263437, 31.530932 ], [ -81.258809, 31.529060 ], [ -81.217948, 31.527284 ], [ -81.213519, 31.528152 ], [ -81.199518, 31.537596 ], [ -81.193016, 31.535833 ], [ -81.181592, 31.527697 ], [ -81.178310, 31.522410 ], [ -81.177254, 31.517074 ], [ -81.189643, 31.503588 ], [ -81.204883, 31.473124 ], [ -81.246911, 31.422784 ], [ -81.258616, 31.404425 ], [ -81.278798, 31.367214 ], [ -81.279338, 31.351127 ], [ -81.282923, 31.326491 ], [ -81.274513, 31.326237 ], [ -81.268027, 31.324218 ], [ -81.254820, 31.315452 ], [ -81.260958, 31.303910 ], [ -81.274688, 31.289454 ], [ -81.276862, 31.254734 ], [ -81.282842, 31.244330 ], [ -81.289136, 31.225487 ], [ -81.288403, 31.211065 ], [ -81.293359, 31.206332 ], [ -81.304957, 31.206173 ], [ -81.314183, 31.207938 ], [ -81.339028, 31.186918 ], [ -81.354880, 31.167204 ], [ -81.360791, 31.155903 ], [ -81.359349, 31.149166 ], [ -81.368241, 31.136534 ], [ -81.386830, 31.133214 ], [ -81.399677, 31.134113 ], [ -81.402096, 31.125383 ], [ -81.403732, 31.107115 ], [ -81.401209, 31.086143 ], [ -81.401267, 31.072781 ], [ -81.415123, 31.026718 ], [ -81.420474, 31.016703 ], [ -81.424732, 31.013678 ], [ -81.432475, 31.012991 ], [ -81.434710, 31.014641 ], [ -81.434923, 31.017804 ], [ -81.451444, 31.015515 ], [ -81.457795, 31.010259 ], [ -81.459240, 31.005692 ], [ -81.469298, 30.996028 ], [ -81.490586, 30.984952 ], [ -81.493651, 30.977528 ], [ -81.486966, 30.969602 ], [ -81.475789, 30.965976 ], [ -81.472321, 30.969899 ], [ -81.466814, 30.970910 ], [ -81.453568, 30.965573 ], [ -81.447388, 30.956732 ], [ -81.426929, 30.956615 ], [ -81.420108, 30.974076 ], [ -81.415825, 30.977192 ], [ -81.408484, 30.977718 ], [ -81.403409, 30.957914 ], [ -81.405153, 30.908203 ], [ -81.428577, 30.836336 ], [ -81.430835, 30.831156 ], [ -81.440130, 30.821369 ], [ -81.446927, 30.810390 ], [ -81.455287, 30.790930 ], [ -81.460061, 30.769912 ], [ -81.461065, 30.753684 ], [ -81.459470, 30.741979 ], [ -81.449375, 30.715601 ], [ -81.444124, 30.709714 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US15", "STATE": "15", "NAME": "Hawaii", "LSAD": "", "CENSUSAREA": 6422.628000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -171.737610, 25.792097 ], [ -171.722366, 25.789583 ], [ -171.718460, 25.776590 ], [ -171.720078, 25.762859 ], [ -171.730728, 25.751070 ], [ -171.746140, 25.750568 ], [ -171.751465, 25.760164 ], [ -171.751389, 25.781382 ], [ -171.737610, 25.792097 ] ] ], [ [ [ -167.998505, 24.997116 ], [ -167.999390, 24.999472 ], [ -167.999969, 25.001759 ], [ -168.001266, 25.005043 ], [ -167.997711, 25.004431 ], [ -167.995560, 25.001871 ], [ -167.995834, 24.998215 ], [ -167.998505, 24.997116 ] ] ], [ [ [ -166.253326, 23.872839 ], [ -166.245300, 23.871731 ], [ -166.247986, 23.867916 ], [ -166.252747, 23.869291 ], [ -166.253326, 23.872839 ] ] ], [ [ [ -166.297455, 23.869505 ], [ -166.283691, 23.872631 ], [ -166.278641, 23.870165 ], [ -166.280426, 23.866076 ], [ -166.292633, 23.864462 ], [ -166.297989, 23.866110 ], [ -166.297455, 23.869505 ] ] ], [ [ [ -166.225662, 23.865953 ], [ -166.218231, 23.861296 ], [ -166.216766, 23.854198 ], [ -166.220642, 23.853935 ], [ -166.223907, 23.858036 ], [ -166.226562, 23.862135 ], [ -166.225662, 23.865953 ] ] ], [ [ [ -166.214935, 23.786917 ], [ -166.212082, 23.787283 ], [ -166.208633, 23.783916 ], [ -166.209152, 23.781681 ], [ -166.211899, 23.781967 ], [ -166.213821, 23.783930 ], [ -166.214935, 23.786917 ] ] ], [ [ [ -166.174179, 23.736132 ], [ -166.170227, 23.731037 ], [ -166.169724, 23.726048 ], [ -166.172852, 23.728069 ], [ -166.173676, 23.731142 ], [ -166.174179, 23.736132 ] ] ], [ [ [ -164.711365, 23.583843 ], [ -164.700821, 23.576902 ], [ -164.689255, 23.574688 ], [ -164.693848, 23.569117 ], [ -164.706085, 23.569265 ], [ -164.712448, 23.575563 ], [ -164.711365, 23.583843 ] ] ], [ [ [ -161.938049, 23.071775 ], [ -161.910767, 23.065514 ], [ -161.910156, 23.055073 ], [ -161.922623, 23.050011 ], [ -161.935745, 23.053579 ], [ -161.938049, 23.071775 ] ] ], [ [ [ -159.431707, 22.220015 ], [ -159.407320, 22.230555 ], [ -159.388119, 22.223252 ], [ -159.385977, 22.220009 ], [ -159.367563, 22.214906 ], [ -159.359842, 22.214831 ], [ -159.357227, 22.217744 ], [ -159.353795, 22.217669 ], [ -159.339964, 22.208519 ], [ -159.315613, 22.186817 ], [ -159.308855, 22.155555 ], [ -159.297808, 22.149748 ], [ -159.295875, 22.144547 ], [ -159.295271, 22.130390 ], [ -159.297143, 22.113815 ], [ -159.317451, 22.080944 ], [ -159.321667, 22.063411 ], [ -159.324775, 22.058670 ], [ -159.333267, 22.054639 ], [ -159.337996, 22.046575 ], [ -159.341401, 22.028978 ], [ -159.333224, 21.973005 ], [ -159.333109, 21.964176 ], [ -159.334714, 21.961099 ], [ -159.350828, 21.950817 ], [ -159.356613, 21.939546 ], [ -159.382349, 21.924479 ], [ -159.408284, 21.897781 ], [ -159.425862, 21.884527 ], [ -159.446599, 21.871647 ], [ -159.471962, 21.882920 ], [ -159.490914, 21.888898 ], [ -159.517973, 21.890996 ], [ -159.555415, 21.891355 ], [ -159.574991, 21.896585 ], [ -159.577784, 21.900486 ], [ -159.584272, 21.899038 ], [ -159.610241, 21.898356 ], [ -159.637849, 21.917166 ], [ -159.648132, 21.932970 ], [ -159.671872, 21.957038 ], [ -159.681493, 21.960054 ], [ -159.705255, 21.963427 ], [ -159.720140, 21.970789 ], [ -159.758218, 21.980694 ], [ -159.765735, 21.986593 ], [ -159.788139, 22.018411 ], [ -159.790932, 22.031177 ], [ -159.786543, 22.063690 ], [ -159.780096, 22.072567 ], [ -159.748159, 22.100388 ], [ -159.741223, 22.115666 ], [ -159.733457, 22.142756 ], [ -159.726043, 22.152171 ], [ -159.699978, 22.165252 ], [ -159.669840, 22.170782 ], [ -159.608794, 22.207878 ], [ -159.591596, 22.219456 ], [ -159.583965, 22.226680 ], [ -159.559643, 22.229185 ], [ -159.554166, 22.228212 ], [ -159.548594, 22.226263 ], [ -159.541150, 22.216764 ], [ -159.534594, 22.219403 ], [ -159.523769, 22.217602 ], [ -159.519410, 22.215646 ], [ -159.518348, 22.211182 ], [ -159.515574, 22.208008 ], [ -159.507811, 22.205987 ], [ -159.501055, 22.211064 ], [ -159.500821, 22.225538 ], [ -159.488558, 22.233170 ], [ -159.480158, 22.232715 ], [ -159.467007, 22.226529 ], [ -159.456190, 22.228811 ], [ -159.441809, 22.226321 ], [ -159.431707, 22.220015 ] ] ], [ [ [ -160.125000, 21.959090 ], [ -160.122262, 21.962881 ], [ -160.112746, 21.995245 ], [ -160.096450, 22.001489 ], [ -160.072123, 22.003334 ], [ -160.058543, 21.996380 ], [ -160.051992, 21.983681 ], [ -160.052729, 21.980321 ], [ -160.056336, 21.977939 ], [ -160.060549, 21.976729 ], [ -160.063349, 21.978354 ], [ -160.065811, 21.976562 ], [ -160.078393, 21.955153 ], [ -160.085787, 21.927295 ], [ -160.080012, 21.910808 ], [ -160.079065, 21.896080 ], [ -160.098897, 21.884711 ], [ -160.124283, 21.876789 ], [ -160.147609, 21.872814 ], [ -160.161620, 21.864746 ], [ -160.174796, 21.846923 ], [ -160.189782, 21.822450 ], [ -160.205211, 21.789053 ], [ -160.200427, 21.786479 ], [ -160.205851, 21.779518 ], [ -160.218044, 21.783755 ], [ -160.234780, 21.795418 ], [ -160.249610, 21.815145 ], [ -160.244943, 21.848943 ], [ -160.231028, 21.886263 ], [ -160.228965, 21.889117 ], [ -160.213830, 21.899193 ], [ -160.205528, 21.907507 ], [ -160.202716, 21.912422 ], [ -160.190158, 21.923592 ], [ -160.167471, 21.932863 ], [ -160.137050, 21.948632 ], [ -160.127302, 21.955508 ], [ -160.125000, 21.959090 ] ] ], [ [ [ -160.555771, 21.668287 ], [ -160.551041, 21.670101 ], [ -160.543320, 21.667128 ], [ -160.542404, 21.648081 ], [ -160.549316, 21.645353 ], [ -160.554123, 21.649546 ], [ -160.555771, 21.668287 ] ] ], [ [ [ -157.789581, 21.438396 ], [ -157.789734, 21.437679 ], [ -157.789276, 21.435833 ], [ -157.790543, 21.434313 ], [ -157.791718, 21.434881 ], [ -157.793045, 21.433910 ], [ -157.793167, 21.435740 ], [ -157.791565, 21.436510 ], [ -157.791779, 21.437752 ], [ -157.793289, 21.437658 ], [ -157.791779, 21.438435 ], [ -157.791092, 21.438442 ], [ -157.790741, 21.438740 ], [ -157.789581, 21.438396 ] ] ], [ [ [ -158.066800, 21.643700 ], [ -158.066711, 21.652340 ], [ -158.063900, 21.658400 ], [ -158.037200, 21.684300 ], [ -158.018127, 21.699955 ], [ -157.992300, 21.708000 ], [ -157.987030, 21.712494 ], [ -157.968628, 21.712704 ], [ -157.947174, 21.689568 ], [ -157.939000, 21.669000 ], [ -157.930100, 21.655200 ], [ -157.924591, 21.651183 ], [ -157.922800, 21.636100 ], [ -157.923800, 21.629300 ], [ -157.910797, 21.611183 ], [ -157.900574, 21.605885 ], [ -157.877350, 21.575277 ], [ -157.878601, 21.560181 ], [ -157.872528, 21.557568 ], [ -157.866900, 21.563700 ], [ -157.856140, 21.560661 ], [ -157.852570, 21.557514 ], [ -157.836945, 21.529945 ], [ -157.837372, 21.512085 ], [ -157.849579, 21.509598 ], [ -157.852625, 21.499971 ], [ -157.845490, 21.466747 ], [ -157.840990, 21.459483 ], [ -157.824890, 21.455379 ], [ -157.816300, 21.450200 ], [ -157.813900, 21.440300 ], [ -157.805900, 21.430100 ], [ -157.786513, 21.415633 ], [ -157.779846, 21.417309 ], [ -157.774455, 21.421352 ], [ -157.772209, 21.431236 ], [ -157.774905, 21.453698 ], [ -157.772209, 21.457741 ], [ -157.764572, 21.461335 ], [ -157.754239, 21.461335 ], [ -157.737617, 21.459089 ], [ -157.731777, 21.455944 ], [ -157.731328, 21.444713 ], [ -157.735820, 21.438424 ], [ -157.740762, 21.424048 ], [ -157.741211, 21.414614 ], [ -157.738600, 21.404300 ], [ -157.730191, 21.401871 ], [ -157.728221, 21.402104 ], [ -157.726421, 21.402845 ], [ -157.724324, 21.403311 ], [ -157.723794, 21.403290 ], [ -157.723286, 21.403227 ], [ -157.722735, 21.403121 ], [ -157.722544, 21.403036 ], [ -157.721845, 21.401596 ], [ -157.721083, 21.399541 ], [ -157.718900, 21.396100 ], [ -157.708900, 21.383300 ], [ -157.708700, 21.379300 ], [ -157.712600, 21.368900 ], [ -157.710600, 21.358500 ], [ -157.708800, 21.353400 ], [ -157.697100, 21.336400 ], [ -157.693800, 21.332900 ], [ -157.661900, 21.313100 ], [ -157.651800, 21.313900 ], [ -157.653700, 21.302000 ], [ -157.694600, 21.273900 ], [ -157.694400, 21.266500 ], [ -157.700100, 21.264000 ], [ -157.709700, 21.262100 ], [ -157.713900, 21.263800 ], [ -157.714200, 21.266500 ], [ -157.711400, 21.272000 ], [ -157.712200, 21.281400 ], [ -157.714300, 21.284500 ], [ -157.721300, 21.286900 ], [ -157.757200, 21.278000 ], [ -157.765000, 21.278900 ], [ -157.778200, 21.273500 ], [ -157.793100, 21.260400 ], [ -157.809600, 21.257700 ], [ -157.821100, 21.260600 ], [ -157.824100, 21.264600 ], [ -157.825300, 21.271400 ], [ -157.831900, 21.279500 ], [ -157.845700, 21.290000 ], [ -157.890000, 21.306500 ], [ -157.894518, 21.319632 ], [ -157.898969, 21.327391 ], [ -157.904820, 21.329172 ], [ -157.918939, 21.318615 ], [ -157.917921, 21.313781 ], [ -157.913469, 21.310983 ], [ -157.910925, 21.305768 ], [ -157.952263, 21.306531 ], [ -157.950736, 21.312509 ], [ -157.951881, 21.318742 ], [ -157.967971, 21.327986 ], [ -157.973334, 21.327426 ], [ -157.989424, 21.317984 ], [ -158.024500, 21.309300 ], [ -158.088300, 21.298800 ], [ -158.103300, 21.297900 ], [ -158.112700, 21.301900 ], [ -158.121100, 21.316900 ], [ -158.122500, 21.322400 ], [ -158.111949, 21.326622 ], [ -158.114196, 21.331123 ], [ -158.119427, 21.334594 ], [ -158.125459, 21.330264 ], [ -158.133240, 21.359207 ], [ -158.140300, 21.373800 ], [ -158.149719, 21.385208 ], [ -158.161743, 21.396282 ], [ -158.179200, 21.404300 ], [ -158.181274, 21.409626 ], [ -158.181000, 21.420868 ], [ -158.182648, 21.430073 ], [ -158.192352, 21.448040 ], [ -158.205383, 21.459793 ], [ -158.219446, 21.469780 ], [ -158.233000, 21.487600 ], [ -158.231171, 21.523857 ], [ -158.231750, 21.533035 ], [ -158.234314, 21.540058 ], [ -158.250671, 21.557373 ], [ -158.279510, 21.575794 ], [ -158.277679, 21.578789 ], [ -158.254425, 21.582684 ], [ -158.190704, 21.585892 ], [ -158.170000, 21.582300 ], [ -158.125610, 21.586739 ], [ -158.106720, 21.596577 ], [ -158.106689, 21.603024 ], [ -158.109500, 21.605700 ], [ -158.108185, 21.607487 ], [ -158.079895, 21.628101 ], [ -158.066800, 21.643700 ] ] ], [ [ [ -157.257085, 21.227268 ], [ -157.241534, 21.220969 ], [ -157.226445, 21.220185 ], [ -157.212082, 21.221848 ], [ -157.202125, 21.219298 ], [ -157.192439, 21.207644 ], [ -157.185553, 21.205602 ], [ -157.157103, 21.200706 ], [ -157.148125, 21.200745 ], [ -157.144627, 21.202555 ], [ -157.128207, 21.201488 ], [ -157.113438, 21.197375 ], [ -157.097971, 21.198012 ], [ -157.064264, 21.189076 ], [ -157.053053, 21.188754 ], [ -157.047757, 21.190739 ], [ -157.039987, 21.190909 ], [ -156.999108, 21.182221 ], [ -156.991318, 21.185510 ], [ -156.987768, 21.189350 ], [ -156.982343, 21.207798 ], [ -156.984464, 21.210063 ], [ -156.984032, 21.212198 ], [ -156.974002, 21.218503 ], [ -156.969064, 21.217018 ], [ -156.962847, 21.212131 ], [ -156.951654, 21.191662 ], [ -156.950808, 21.182636 ], [ -156.946159, 21.175963 ], [ -156.903466, 21.164210 ], [ -156.898174, 21.165940 ], [ -156.896130, 21.169561 ], [ -156.896537, 21.172208 ], [ -156.867944, 21.164520 ], [ -156.841592, 21.167926 ], [ -156.821944, 21.174693 ], [ -156.771495, 21.180053 ], [ -156.742231, 21.176214 ], [ -156.738341, 21.172020 ], [ -156.736648, 21.161880 ], [ -156.719386, 21.163911 ], [ -156.712696, 21.161547 ], [ -156.714158, 21.152238 ], [ -156.726033, 21.132360 ], [ -156.748932, 21.108600 ], [ -156.775995, 21.089751 ], [ -156.790815, 21.081686 ], [ -156.794136, 21.075796 ], [ -156.835351, 21.063360 ], [ -156.865795, 21.057801 ], [ -156.877137, 21.049300 ], [ -156.891946, 21.051831 ], [ -156.895170, 21.055771 ], [ -156.953719, 21.067761 ], [ -157.002950, 21.083282 ], [ -157.026170, 21.089015 ], [ -157.032045, 21.091094 ], [ -157.037667, 21.097864 ], [ -157.079696, 21.105835 ], [ -157.095373, 21.106360 ], [ -157.125000, 21.102600 ], [ -157.143483, 21.096632 ], [ -157.254061, 21.090601 ], [ -157.298054, 21.096917 ], [ -157.313343, 21.105755 ], [ -157.299187, 21.132488 ], [ -157.299471, 21.135972 ], [ -157.293774, 21.146127 ], [ -157.284346, 21.157755 ], [ -157.276474, 21.163175 ], [ -157.274504, 21.162762 ], [ -157.259911, 21.174875 ], [ -157.254709, 21.181376 ], [ -157.251007, 21.190952 ], [ -157.250260, 21.207739 ], [ -157.256935, 21.215665 ], [ -157.261457, 21.217661 ], [ -157.263163, 21.220873 ], [ -157.260690, 21.225684 ], [ -157.257085, 21.227268 ] ] ], [ [ [ -157.010001, 20.929757 ], [ -156.989813, 20.932127 ], [ -156.971604, 20.926254 ], [ -156.937529, 20.925274 ], [ -156.918450, 20.922546 ], [ -156.897169, 20.915395 ], [ -156.837047, 20.863575 ], [ -156.825237, 20.850731 ], [ -156.809576, 20.826036 ], [ -156.808469, 20.820396 ], [ -156.809463, 20.809169 ], [ -156.817427, 20.794606 ], [ -156.838321, 20.764575 ], [ -156.846413, 20.760201 ], [ -156.851481, 20.760069 ], [ -156.869753, 20.754701 ], [ -156.890295, 20.744855 ], [ -156.909081, 20.739533 ], [ -156.949009, 20.738997 ], [ -156.967890, 20.735080 ], [ -156.984747, 20.756677 ], [ -156.994001, 20.786671 ], [ -156.988933, 20.815496 ], [ -156.991834, 20.826603 ], [ -157.006243, 20.849603 ], [ -157.010911, 20.854476 ], [ -157.054552, 20.877219 ], [ -157.059663, 20.884634 ], [ -157.061128, 20.890635 ], [ -157.062511, 20.904385 ], [ -157.059130, 20.913407 ], [ -157.035789, 20.927078 ], [ -157.025626, 20.929528 ], [ -157.010001, 20.929757 ] ] ], [ [ [ -156.612012, 21.024770 ], [ -156.612065, 21.027273 ], [ -156.606238, 21.034371 ], [ -156.592256, 21.032880 ], [ -156.580448, 21.020172 ], [ -156.562773, 21.016167 ], [ -156.549813, 21.004939 ], [ -156.546291, 21.005082 ], [ -156.528246, 20.967757 ], [ -156.518707, 20.954662 ], [ -156.512226, 20.951280 ], [ -156.510391, 20.940358 ], [ -156.507913, 20.937886 ], [ -156.499480, 20.934577 ], [ -156.495883, 20.928005 ], [ -156.493263, 20.916011 ], [ -156.481055, 20.898199 ], [ -156.474796, 20.894546 ], [ -156.422668, 20.911631 ], [ -156.386045, 20.919563 ], [ -156.374297, 20.927616 ], [ -156.370729, 20.932669 ], [ -156.352649, 20.941414 ], [ -156.345655, 20.941596 ], [ -156.342365, 20.938737 ], [ -156.332817, 20.946450 ], [ -156.324578, 20.950184 ], [ -156.307198, 20.942739 ], [ -156.286332, 20.947701 ], [ -156.275116, 20.937361 ], [ -156.263107, 20.940888 ], [ -156.242555, 20.937838 ], [ -156.230159, 20.931936 ], [ -156.230089, 20.917864 ], [ -156.226757, 20.916677 ], [ -156.222062, 20.918309 ], [ -156.217953, 20.916573 ], [ -156.216341, 20.907035 ], [ -156.173103, 20.876926 ], [ -156.170458, 20.874605 ], [ -156.166746, 20.865646 ], [ -156.132669, 20.861369 ], [ -156.129381, 20.847513 ], [ -156.115735, 20.827301 ], [ -156.100123, 20.828502 ], [ -156.090291, 20.831872 ], [ -156.059788, 20.810540 ], [ -156.033287, 20.808246 ], [ -156.003532, 20.795545 ], [ -156.002947, 20.789418 ], [ -155.987944, 20.776552 ], [ -155.984587, 20.767496 ], [ -155.986851, 20.758577 ], [ -155.985413, 20.744245 ], [ -155.987216, 20.722717 ], [ -155.991534, 20.713654 ], [ -156.001870, 20.698064 ], [ -156.014150, 20.685681 ], [ -156.020044, 20.686857 ], [ -156.030702, 20.682452 ], [ -156.040341, 20.672719 ], [ -156.043786, 20.664902 ], [ -156.053385, 20.654320 ], [ -156.059753, 20.652044 ], [ -156.081472, 20.654387 ], [ -156.089365, 20.648519 ], [ -156.120985, 20.633685 ], [ -156.129898, 20.627523 ], [ -156.142665, 20.623605 ], [ -156.144588, 20.624032 ], [ -156.148085, 20.629067 ], [ -156.156772, 20.629639 ], [ -156.169732, 20.627358 ], [ -156.173393, 20.624100 ], [ -156.184556, 20.629719 ], [ -156.192938, 20.631769 ], [ -156.210258, 20.628518 ], [ -156.225338, 20.622940 ], [ -156.236145, 20.615950 ], [ -156.265921, 20.601629 ], [ -156.284391, 20.596488 ], [ -156.288037, 20.592030 ], [ -156.293454, 20.588783 ], [ -156.302692, 20.586199 ], [ -156.322944, 20.588273 ], [ -156.351716, 20.586970 ], [ -156.359634, 20.581977 ], [ -156.370725, 20.578760 ], [ -156.377633, 20.578427 ], [ -156.415313, 20.586099 ], [ -156.417523, 20.589728 ], [ -156.415746, 20.594044 ], [ -156.417799, 20.598682 ], [ -156.423141, 20.602079 ], [ -156.427708, 20.598873 ], [ -156.431872, 20.598143 ], [ -156.438385, 20.601337 ], [ -156.444242, 20.607941 ], [ -156.442884, 20.613842 ], [ -156.450651, 20.642212 ], [ -156.445894, 20.649270 ], [ -156.443673, 20.656018 ], [ -156.448656, 20.704739 ], [ -156.451038, 20.725469 ], [ -156.452895, 20.731287 ], [ -156.458438, 20.736676 ], [ -156.462242, 20.753952 ], [ -156.462058, 20.772571 ], [ -156.464043, 20.781667 ], [ -156.473562, 20.790756 ], [ -156.489496, 20.798339 ], [ -156.501688, 20.799933 ], [ -156.506026, 20.799463 ], [ -156.515994, 20.794234 ], [ -156.525215, 20.780821 ], [ -156.537752, 20.778408 ], [ -156.631794, 20.821240 ], [ -156.678634, 20.870541 ], [ -156.688969, 20.888673 ], [ -156.687804, 20.890720 ], [ -156.688132, 20.906325 ], [ -156.691334, 20.912440 ], [ -156.697418, 20.916368 ], [ -156.699890, 20.920629 ], [ -156.694110, 20.952708 ], [ -156.680905, 20.980262 ], [ -156.665514, 21.007054 ], [ -156.652419, 21.008994 ], [ -156.645966, 21.014416 ], [ -156.642592, 21.019936 ], [ -156.644167, 21.022312 ], [ -156.642809, 21.027583 ], [ -156.619581, 21.027793 ], [ -156.612012, 21.024770 ] ] ], [ [ [ -156.544169, 20.522802 ], [ -156.550016, 20.520273 ], [ -156.559994, 20.521892 ], [ -156.586238, 20.511711 ], [ -156.603844, 20.524372 ], [ -156.631143, 20.514943 ], [ -156.642347, 20.508285 ], [ -156.647464, 20.512017 ], [ -156.668809, 20.504738 ], [ -156.682939, 20.506775 ], [ -156.703673, 20.527237 ], [ -156.702265, 20.532451 ], [ -156.696662, 20.541646 ], [ -156.680100, 20.557021 ], [ -156.651567, 20.565574 ], [ -156.614598, 20.587109 ], [ -156.610734, 20.593770 ], [ -156.576871, 20.606570 ], [ -156.567140, 20.604895 ], [ -156.553604, 20.594729 ], [ -156.543034, 20.580115 ], [ -156.542808, 20.573674 ], [ -156.548909, 20.568590 ], [ -156.556021, 20.542657 ], [ -156.553018, 20.539382 ], [ -156.540189, 20.534741 ], [ -156.539643, 20.527644 ], [ -156.544169, 20.522802 ] ] ], [ [ [ -155.778234, 20.245743 ], [ -155.772734, 20.245409 ], [ -155.746893, 20.232325 ], [ -155.737004, 20.222773 ], [ -155.735822, 20.212417 ], [ -155.732704, 20.205392 ], [ -155.653966, 20.167360 ], [ -155.630382, 20.146916 ], [ -155.624565, 20.145911 ], [ -155.607797, 20.137987 ], [ -155.600909, 20.126573 ], [ -155.598033, 20.124539 ], [ -155.590923, 20.122497 ], [ -155.581680, 20.123617 ], [ -155.568368, 20.130545 ], [ -155.558933, 20.131570 ], [ -155.523661, 20.120028 ], [ -155.516795, 20.115230 ], [ -155.502561, 20.114155 ], [ -155.468211, 20.104296 ], [ -155.443957, 20.095318 ], [ -155.405459, 20.078772 ], [ -155.402400, 20.075541 ], [ -155.387578, 20.067119 ], [ -155.330210, 20.038517 ], [ -155.295480, 20.024438 ], [ -155.282629, 20.021969 ], [ -155.270316, 20.014525 ], [ -155.240933, 19.990173 ], [ -155.204486, 19.969438 ], [ -155.194593, 19.958368 ], [ -155.179939, 19.949372 ], [ -155.149215, 19.922872 ], [ -155.144394, 19.920523 ], [ -155.131235, 19.906801 ], [ -155.124618, 19.897288 ], [ -155.121750, 19.886099 ], [ -155.107541, 19.872467 ], [ -155.098716, 19.867811 ], [ -155.095032, 19.867882 ], [ -155.086341, 19.855399 ], [ -155.084357, 19.849736 ], [ -155.085674, 19.838584 ], [ -155.088979, 19.826656 ], [ -155.094414, 19.814910 ], [ -155.092070, 19.799409 ], [ -155.091216, 19.776368 ], [ -155.093517, 19.771832 ], [ -155.093387, 19.737751 ], [ -155.087118, 19.728013 ], [ -155.079426, 19.726193 ], [ -155.063972, 19.728917 ], [ -155.045382, 19.739824 ], [ -155.006423, 19.739286 ], [ -154.997278, 19.728580 ], [ -154.987168, 19.708524 ], [ -154.981102, 19.690687 ], [ -154.984718, 19.672161 ], [ -154.983778, 19.641647 ], [ -154.974342, 19.633201 ], [ -154.963933, 19.627605 ], [ -154.950359, 19.626461 ], [ -154.947874, 19.624250 ], [ -154.947718, 19.621947 ], [ -154.951014, 19.613614 ], [ -154.947106, 19.604856 ], [ -154.933940, 19.597505 ], [ -154.928205, 19.592702 ], [ -154.924422, 19.586553 ], [ -154.903542, 19.570622 ], [ -154.875000, 19.556797 ], [ -154.852618, 19.549172 ], [ -154.837384, 19.538354 ], [ -154.826732, 19.537626 ], [ -154.814417, 19.530090 ], [ -154.809561, 19.522377 ], [ -154.809379, 19.519086 ], [ -154.822968, 19.481290 ], [ -154.838545, 19.463642 ], [ -154.868540, 19.438126 ], [ -154.887817, 19.426425 ], [ -154.928772, 19.397646 ], [ -154.944185, 19.381852 ], [ -154.964619, 19.365646 ], [ -154.980861, 19.349291 ], [ -155.020537, 19.331317 ], [ -155.061729, 19.316636 ], [ -155.113272, 19.290613 ], [ -155.133700, 19.276099 ], [ -155.159635, 19.268375 ], [ -155.172413, 19.269060 ], [ -155.187427, 19.266156 ], [ -155.196260, 19.261295 ], [ -155.205892, 19.260907 ], [ -155.243961, 19.271313 ], [ -155.264619, 19.274213 ], [ -155.296761, 19.266289 ], [ -155.303808, 19.261835 ], [ -155.313370, 19.250698 ], [ -155.341268, 19.234039 ], [ -155.349148, 19.217756 ], [ -155.360631, 19.208930 ], [ -155.378638, 19.202435 ], [ -155.390701, 19.201171 ], [ -155.417369, 19.187858 ], [ -155.427093, 19.179546 ], [ -155.432519, 19.170623 ], [ -155.453516, 19.151952 ], [ -155.465663, 19.146964 ], [ -155.505281, 19.137908 ], [ -155.514740, 19.132501 ], [ -155.512140, 19.128174 ], [ -155.512137, 19.124296 ], [ -155.519652, 19.117025 ], [ -155.526136, 19.115889 ], [ -155.528902, 19.113710 ], [ -155.544806, 19.091059 ], [ -155.551129, 19.088780 ], [ -155.557817, 19.082130 ], [ -155.555326, 19.069377 ], [ -155.555177, 19.053932 ], [ -155.557371, 19.046565 ], [ -155.566446, 19.032531 ], [ -155.576599, 19.027412 ], [ -155.581903, 19.022240 ], [ -155.596032, 18.998833 ], [ -155.596521, 18.980654 ], [ -155.601866, 18.971572 ], [ -155.613966, 18.970399 ], [ -155.625256, 18.961951 ], [ -155.625000, 18.959934 ], [ -155.638054, 18.941723 ], [ -155.658486, 18.924835 ], [ -155.672005, 18.917466 ], [ -155.681825, 18.918694 ], [ -155.687716, 18.923358 ], [ -155.690171, 18.932195 ], [ -155.693117, 18.940542 ], [ -155.726043, 18.969437 ], [ -155.763598, 18.981837 ], [ -155.806109, 19.013967 ], [ -155.853943, 19.023762 ], [ -155.881550, 19.036644 ], [ -155.884077, 19.039266 ], [ -155.886278, 19.055760 ], [ -155.903693, 19.080777 ], [ -155.908355, 19.081138 ], [ -155.921389, 19.121183 ], [ -155.917292, 19.155963 ], [ -155.903339, 19.217792 ], [ -155.904910, 19.230147 ], [ -155.902565, 19.258427 ], [ -155.895435, 19.274639 ], [ -155.890842, 19.298905 ], [ -155.887356, 19.337101 ], [ -155.888701, 19.348031 ], [ -155.898792, 19.377984 ], [ -155.913849, 19.401107 ], [ -155.909087, 19.415455 ], [ -155.921707, 19.430550 ], [ -155.924269, 19.438794 ], [ -155.925166, 19.468081 ], [ -155.922609, 19.478611 ], [ -155.924124, 19.481406 ], [ -155.930523, 19.484921 ], [ -155.935641, 19.485628 ], [ -155.936403, 19.481905 ], [ -155.939145, 19.481577 ], [ -155.951490, 19.486649 ], [ -155.952897, 19.488805 ], [ -155.953663, 19.510003 ], [ -155.960457, 19.546612 ], [ -155.962264, 19.551779 ], [ -155.965211, 19.554745 ], [ -155.969350, 19.555963 ], [ -155.970969, 19.586328 ], [ -155.978206, 19.608159 ], [ -155.997728, 19.642816 ], [ -156.028982, 19.650098 ], [ -156.032928, 19.653905 ], [ -156.034994, 19.659360 ], [ -156.033326, 19.669230 ], [ -156.027427, 19.672154 ], [ -156.029281, 19.678908 ], [ -156.036079, 19.690252 ], [ -156.047960, 19.698938 ], [ -156.051652, 19.703649 ], [ -156.052485, 19.718667 ], [ -156.064364, 19.730766 ], [ -156.057220, 19.742536 ], [ -156.052315, 19.756836 ], [ -156.049651, 19.780452 ], [ -156.021732, 19.802200 ], [ -156.006267, 19.817580 ], [ -155.982821, 19.845651 ], [ -155.976651, 19.850530 ], [ -155.964817, 19.855183 ], [ -155.949251, 19.857034 ], [ -155.945297, 19.853443 ], [ -155.940311, 19.852305 ], [ -155.925843, 19.858928 ], [ -155.926938, 19.870221 ], [ -155.925490, 19.875000 ], [ -155.915662, 19.887126 ], [ -155.901987, 19.912081 ], [ -155.894099, 19.923135 ], [ -155.894474, 19.926927 ], [ -155.892533, 19.932162 ], [ -155.866919, 19.954172 ], [ -155.856588, 19.968885 ], [ -155.840708, 19.976952 ], [ -155.838692, 19.975527 ], [ -155.835312, 19.976078 ], [ -155.831948, 19.982775 ], [ -155.828965, 19.995542 ], [ -155.825473, 20.025944 ], [ -155.828182, 20.035424 ], [ -155.850385, 20.062506 ], [ -155.866931, 20.078652 ], [ -155.884190, 20.106750 ], [ -155.899149, 20.145728 ], [ -155.906035, 20.205157 ], [ -155.901452, 20.235787 ], [ -155.890663, 20.255240 ], [ -155.882631, 20.263026 ], [ -155.873921, 20.267744 ], [ -155.853293, 20.271548 ], [ -155.811459, 20.260320 ], [ -155.783242, 20.246395 ], [ -155.778234, 20.245743 ] ] ], [ [ [ -178.304504, 28.385405 ], [ -178.314468, 28.385746 ], [ -178.330566, 28.387459 ], [ -178.342102, 28.388927 ], [ -178.339813, 28.392273 ], [ -178.333344, 28.392746 ], [ -178.320648, 28.392807 ], [ -178.307816, 28.394899 ], [ -178.298874, 28.400175 ], [ -178.291077, 28.407391 ], [ -178.290497, 28.394138 ], [ -178.294540, 28.388641 ], [ -178.304504, 28.385405 ] ] ], [ [ [ -175.737091, 27.928402 ], [ -175.733627, 27.927259 ], [ -175.734940, 27.924505 ], [ -175.737350, 27.921520 ], [ -175.740997, 27.919806 ], [ -175.741638, 27.923454 ], [ -175.737091, 27.928402 ] ] ], [ [ [ -175.741394, 27.914927 ], [ -175.738281, 27.913597 ], [ -175.740921, 27.910934 ], [ -175.740662, 27.907433 ], [ -175.743881, 27.907583 ], [ -175.744064, 27.912766 ], [ -175.741394, 27.914927 ] ] ], [ [ [ -175.861572, 27.782007 ], [ -175.862808, 27.786123 ], [ -175.858521, 27.786539 ], [ -175.858475, 27.783360 ], [ -175.861572, 27.782007 ] ] ], [ [ [ -175.811966, 27.777546 ], [ -175.814713, 27.779062 ], [ -175.818054, 27.779791 ], [ -175.816559, 27.782473 ], [ -175.812057, 27.782730 ], [ -175.807434, 27.781155 ], [ -175.807541, 27.778721 ], [ -175.811966, 27.777546 ] ] ], [ [ [ -175.905075, 27.766842 ], [ -175.895187, 27.765072 ], [ -175.895706, 27.762028 ], [ -175.904953, 27.762661 ], [ -175.906647, 27.765076 ], [ -175.905075, 27.766842 ] ] ], [ [ [ -175.943802, 27.758139 ], [ -175.934143, 27.759706 ], [ -175.932022, 27.756479 ], [ -175.929947, 27.748564 ], [ -175.935898, 27.747883 ], [ -175.942276, 27.752869 ], [ -175.943802, 27.758139 ] ] ], [ [ [ -173.982803, 26.085909 ], [ -173.969421, 26.088566 ], [ -173.959030, 26.080111 ], [ -173.956879, 26.061834 ], [ -173.965347, 26.055977 ], [ -173.977859, 26.062843 ], [ -173.982803, 26.085909 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US16", "STATE": "16", "NAME": "Idaho", "LSAD": "", "CENSUSAREA": 82643.117000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -111.046689, 42.001567 ], [ -111.415873, 42.000748 ], [ -111.420898, 42.000793 ], [ -111.425535, 42.000840 ], [ -111.471381, 41.999739 ], [ -111.507264, 41.999518 ], [ -111.750778, 41.999330 ], [ -111.876491, 41.998528 ], [ -111.915622, 41.998496 ], [ -111.915837, 41.998519 ], [ -112.012180, 41.998350 ], [ -112.109532, 41.997598 ], [ -112.163956, 41.996708 ], [ -112.173352, 41.996568 ], [ -112.192976, 42.001167 ], [ -112.239107, 42.001217 ], [ -112.264936, 42.000991 ], [ -112.386170, 42.001126 ], [ -112.450567, 42.001092 ], [ -112.450814, 42.000953 ], [ -112.648019, 42.000307 ], [ -112.709375, 42.000309 ], [ -112.788542, 41.999681 ], [ -112.833084, 41.999305 ], [ -112.833125, 41.999345 ], [ -112.880619, 41.998921 ], [ -112.882367, 41.998922 ], [ -112.909587, 41.998791 ], [ -112.979218, 41.998263 ], [ -113.000821, 41.998223 ], [ -113.249159, 41.996203 ], [ -113.250829, 41.995610 ], [ -113.340072, 41.994747 ], [ -113.357611, 41.993859 ], [ -113.396497, 41.994250 ], [ -113.402230, 41.994161 ], [ -113.431563, 41.993799 ], [ -113.496548, 41.993305 ], [ -113.500837, 41.992799 ], [ -113.764530, 41.989459 ], [ -113.796082, 41.989104 ], [ -113.822163, 41.988479 ], [ -113.893261, 41.988057 ], [ -113.993903, 41.992698 ], [ -114.041723, 41.993720 ], [ -114.048246, 41.993721 ], [ -114.048257, 41.993814 ], [ -114.061774, 41.993797 ], [ -114.061763, 41.993939 ], [ -114.107259, 41.993831 ], [ -114.107428, 41.993965 ], [ -114.281855, 41.994214 ], [ -114.467581, 41.995492 ], [ -114.498243, 41.994636 ], [ -114.498259, 41.994599 ], [ -114.598267, 41.994511 ], [ -114.720715, 41.998231 ], [ -114.806384, 42.001822 ], [ -114.831077, 42.002207 ], [ -114.875877, 42.001319 ], [ -114.899210, 41.999909 ], [ -114.914187, 41.999909 ], [ -115.031783, 41.996008 ], [ -115.250795, 41.996156 ], [ -115.254333, 41.996721 ], [ -115.313877, 41.996103 ], [ -115.586849, 41.996884 ], [ -115.625914, 41.997415 ], [ -115.870181, 41.996766 ], [ -115.879596, 41.997891 ], [ -115.887612, 41.998048 ], [ -115.986880, 41.998534 ], [ -116.012212, 41.998035 ], [ -116.012219, 41.998048 ], [ -116.018945, 41.997722 ], [ -116.018960, 41.997762 ], [ -116.030758, 41.997383 ], [ -116.030754, 41.997399 ], [ -116.038570, 41.997413 ], [ -116.038602, 41.997460 ], [ -116.160833, 41.997508 ], [ -116.163931, 41.997555 ], [ -116.332763, 41.997283 ], [ -116.368478, 41.996281 ], [ -116.463528, 41.996547 ], [ -116.483094, 41.996885 ], [ -116.485823, 41.996861 ], [ -116.499777, 41.996740 ], [ -116.501741, 41.997334 ], [ -116.510452, 41.997096 ], [ -116.525319, 41.997558 ], [ -116.582217, 41.997834 ], [ -116.586937, 41.997370 ], [ -116.625947, 41.997379 ], [ -116.626770, 41.997750 ], [ -116.969156, 41.998991 ], [ -117.009255, 41.998127 ], [ -117.018294, 41.999358 ], [ -117.026222, 42.000252 ], [ -117.026098, 42.117647 ], [ -117.026590, 42.133258 ], [ -117.026195, 42.166404 ], [ -117.026129, 42.357193 ], [ -117.026551, 42.378557 ], [ -117.026665, 42.624878 ], [ -117.026331, 42.807015 ], [ -117.026303, 42.807170 ], [ -117.026253, 42.807447 ], [ -117.026683, 43.024876 ], [ -117.026652, 43.025128 ], [ -117.026746, 43.577526 ], [ -117.026774, 43.578674 ], [ -117.026922, 43.593632 ], [ -117.026889, 43.596033 ], [ -117.026824, 43.600357 ], [ -117.026760, 43.601912 ], [ -117.026789, 43.610669 ], [ -117.026937, 43.617614 ], [ -117.027001, 43.621032 ], [ -117.026905, 43.624880 ], [ -117.026705, 43.631659 ], [ -117.026661, 43.664385 ], [ -117.026717, 43.675523 ], [ -117.026586, 43.683001 ], [ -117.026825, 43.706193 ], [ -117.026725, 43.714815 ], [ -117.026841, 43.732905 ], [ -117.026651, 43.733935 ], [ -117.026634, 43.808104 ], [ -117.026780, 43.829841 ], [ -117.026871, 43.832479 ], [ -117.026143, 43.834480 ], [ -117.013954, 43.859358 ], [ -117.010770, 43.862269 ], [ -116.999061, 43.864637 ], [ -116.997391, 43.864874 ], [ -116.991415, 43.863864 ], [ -116.989598, 43.864301 ], [ -116.982940, 43.867710 ], [ -116.982347, 43.868840 ], [ -116.976024, 43.895548 ], [ -116.976429, 43.901293 ], [ -116.977332, 43.905812 ], [ -116.966256, 43.918573 ], [ -116.963666, 43.921363 ], [ -116.962470, 43.928336 ], [ -116.963666, 43.952644 ], [ -116.966256, 43.955832 ], [ -116.969245, 43.957426 ], [ -116.970241, 43.958622 ], [ -116.971237, 43.960216 ], [ -116.971835, 43.962806 ], [ -116.971436, 43.964998 ], [ -116.969842, 43.967588 ], [ -116.966314, 43.968884 ], [ -116.957527, 43.972443 ], [ -116.942944, 43.987512 ], [ -116.942346, 43.989106 ], [ -116.936765, 44.010608 ], [ -116.934485, 44.021249 ], [ -116.934727, 44.023806 ], [ -116.937342, 44.029376 ], [ -116.943361, 44.035645 ], [ -116.956246, 44.042888 ], [ -116.972504, 44.048771 ], [ -116.973185, 44.049425 ], [ -116.974016, 44.053663 ], [ -116.977351, 44.085364 ], [ -116.974253, 44.088295 ], [ -116.967203, 44.090936 ], [ -116.957009, 44.091743 ], [ -116.943132, 44.094060 ], [ -116.937835, 44.096943 ], [ -116.933704, 44.100039 ], [ -116.928306, 44.107326 ], [ -116.927688, 44.109438 ], [ -116.895931, 44.154295 ], [ -116.894309, 44.158114 ], [ -116.894083, 44.160191 ], [ -116.895757, 44.171267 ], [ -116.900103, 44.176851 ], [ -116.902752, 44.179467 ], [ -116.925392, 44.191544 ], [ -116.935443, 44.193962 ], [ -116.940534, 44.193710 ], [ -116.945256, 44.191677 ], [ -116.947591, 44.191264 ], [ -116.965498, 44.194126 ], [ -116.967259, 44.194581 ], [ -116.971675, 44.197256 ], [ -116.973701, 44.208017 ], [ -116.973945, 44.225932 ], [ -116.971958, 44.235677 ], [ -116.973542, 44.239980 ], [ -116.975905, 44.242844 ], [ -116.986870, 44.245477 ], [ -117.001000, 44.245386 ], [ -117.016921, 44.245391 ], [ -117.020231, 44.246063 ], [ -117.025277, 44.248505 ], [ -117.027558, 44.248881 ], [ -117.031862, 44.248635 ], [ -117.035850, 44.246805 ], [ -117.042283, 44.242775 ], [ -117.045513, 44.232005 ], [ -117.047062, 44.229742 ], [ -117.050057, 44.228830 ], [ -117.053030, 44.229076 ], [ -117.056510, 44.230874 ], [ -117.059352, 44.237244 ], [ -117.067284, 44.244010 ], [ -117.078350, 44.249885 ], [ -117.089503, 44.258234 ], [ -117.090933, 44.260311 ], [ -117.093578, 44.269383 ], [ -117.094570, 44.270978 ], [ -117.098531, 44.275533 ], [ -117.102242, 44.278799 ], [ -117.104208, 44.279940 ], [ -117.107673, 44.280763 ], [ -117.111617, 44.280667 ], [ -117.118018, 44.278945 ], [ -117.121037, 44.277585 ], [ -117.130904, 44.269453 ], [ -117.132530, 44.267045 ], [ -117.133104, 44.264236 ], [ -117.133984, 44.262972 ], [ -117.138523, 44.259370 ], [ -117.143394, 44.258262 ], [ -117.157060, 44.257490 ], [ -117.170342, 44.258890 ], [ -117.193129, 44.270963 ], [ -117.198147, 44.273828 ], [ -117.216974, 44.288357 ], [ -117.222647, 44.297578 ], [ -117.222451, 44.298963 ], [ -117.220069, 44.301382 ], [ -117.217843, 44.307180 ], [ -117.216795, 44.308236 ], [ -117.215210, 44.309116 ], [ -117.205500, 44.311789 ], [ -117.203323, 44.313024 ], [ -117.192203, 44.328630 ], [ -117.191546, 44.329621 ], [ -117.189842, 44.335007 ], [ -117.189769, 44.336585 ], [ -117.196149, 44.346362 ], [ -117.197339, 44.347406 ], [ -117.206962, 44.355206 ], [ -117.210587, 44.357703 ], [ -117.216911, 44.360163 ], [ -117.227938, 44.367975 ], [ -117.235117, 44.373853 ], [ -117.243027, 44.390974 ], [ -117.242675, 44.396548 ], [ -117.234835, 44.399669 ], [ -117.226980, 44.405583 ], [ -117.225461, 44.407729 ], [ -117.218285, 44.420664 ], [ -117.215072, 44.427162 ], [ -117.214637, 44.448030 ], [ -117.215573, 44.453746 ], [ -117.217015, 44.459042 ], [ -117.221548, 44.470146 ], [ -117.224445, 44.473884 ], [ -117.225758, 44.477223 ], [ -117.225932, 44.479389 ], [ -117.225076, 44.482346 ], [ -117.224104, 44.483734 ], [ -117.216372, 44.486160 ], [ -117.211148, 44.485359 ], [ -117.208936, 44.485661 ], [ -117.200237, 44.492027 ], [ -117.194317, 44.499884 ], [ -117.192494, 44.503272 ], [ -117.191329, 44.506784 ], [ -117.191630, 44.509886 ], [ -117.189759, 44.513385 ], [ -117.185386, 44.519261 ], [ -117.181583, 44.522960 ], [ -117.167187, 44.523431 ], [ -117.161033, 44.525166 ], [ -117.152406, 44.531802 ], [ -117.149242, 44.536151 ], [ -117.144161, 44.545647 ], [ -117.142930, 44.557236 ], [ -117.147934, 44.562143 ], [ -117.148255, 44.564371 ], [ -117.146032, 44.568603 ], [ -117.142480, 44.571430 ], [ -117.138066, 44.572996 ], [ -117.133963, 44.575240 ], [ -117.126009, 44.581553 ], [ -117.124754, 44.583834 ], [ -117.125267, 44.593818 ], [ -117.120522, 44.614658 ], [ -117.117809, 44.620139 ], [ -117.114754, 44.624883 ], [ -117.108231, 44.627110 ], [ -117.098221, 44.640689 ], [ -117.094968, 44.652011 ], [ -117.096791, 44.657385 ], [ -117.095868, 44.664737 ], [ -117.091223, 44.668807 ], [ -117.080772, 44.684161 ], [ -117.080555, 44.686714 ], [ -117.079120, 44.692175 ], [ -117.072221, 44.700517 ], [ -117.063824, 44.703623 ], [ -117.061799, 44.706654 ], [ -117.060454, 44.721668 ], [ -117.062273, 44.727143 ], [ -117.044217, 44.745140 ], [ -117.038270, 44.748179 ], [ -117.013802, 44.756841 ], [ -117.006045, 44.756024 ], [ -116.998903, 44.756382 ], [ -116.992003, 44.759182 ], [ -116.986502, 44.762381 ], [ -116.977802, 44.767981 ], [ -116.972902, 44.772581 ], [ -116.970902, 44.773881 ], [ -116.966801, 44.775181 ], [ -116.949001, 44.777981 ], [ -116.936800, 44.782881 ], [ -116.934700, 44.783881 ], [ -116.931800, 44.787181 ], [ -116.930700, 44.789881 ], [ -116.930800, 44.790981 ], [ -116.933099, 44.794481 ], [ -116.933799, 44.796781 ], [ -116.933699, 44.798781 ], [ -116.931099, 44.804781 ], [ -116.928099, 44.808381 ], [ -116.920498, 44.814380 ], [ -116.905771, 44.834794 ], [ -116.896249, 44.848330 ], [ -116.883598, 44.858268 ], [ -116.865338, 44.870599 ], [ -116.857038, 44.880769 ], [ -116.852427, 44.887577 ], [ -116.850512, 44.893523 ], [ -116.846061, 44.905249 ], [ -116.842108, 44.914922 ], [ -116.838467, 44.923601 ], [ -116.833632, 44.928976 ], [ -116.832176, 44.931373 ], [ -116.831990, 44.933007 ], [ -116.835702, 44.940633 ], [ -116.846461, 44.951521 ], [ -116.850737, 44.958113 ], [ -116.851406, 44.959841 ], [ -116.858313, 44.978761 ], [ -116.856754, 44.984298 ], [ -116.846103, 44.999878 ], [ -116.844625, 45.001435 ], [ -116.844796, 45.015312 ], [ -116.845847, 45.018470 ], [ -116.848037, 45.021728 ], [ -116.847944, 45.022602 ], [ -116.841314, 45.030907 ], [ -116.830115, 45.035317 ], [ -116.825133, 45.037840 ], [ -116.808576, 45.050652 ], [ -116.797329, 45.060267 ], [ -116.783710, 45.076972 ], [ -116.784244, 45.088128 ], [ -116.783537, 45.093605 ], [ -116.782492, 45.095790 ], [ -116.774847, 45.105536 ], [ -116.754643, 45.113972 ], [ -116.731216, 45.139934 ], [ -116.729607, 45.142091 ], [ -116.728757, 45.144381 ], [ -116.724188, 45.162924 ], [ -116.724205, 45.171501 ], [ -116.709536, 45.203015 ], [ -116.708546, 45.207356 ], [ -116.709750, 45.217243 ], [ -116.709373, 45.219463 ], [ -116.703607, 45.239757 ], [ -116.696047, 45.254679 ], [ -116.691388, 45.263739 ], [ -116.687027, 45.267857 ], [ -116.681013, 45.270720 ], [ -116.675587, 45.274867 ], [ -116.674493, 45.276349 ], [ -116.672733, 45.283183 ], [ -116.672163, 45.288938 ], [ -116.672594, 45.298023 ], [ -116.674648, 45.314342 ], [ -116.673793, 45.321511 ], [ -116.653252, 45.351084 ], [ -116.626633, 45.388037 ], [ -116.619057, 45.398210 ], [ -116.597447, 45.412770 ], [ -116.592416, 45.427356 ], [ -116.588195, 45.442920 ], [ -116.581382, 45.448984 ], [ -116.575949, 45.452522 ], [ -116.563985, 45.460169 ], [ -116.561744, 45.461213 ], [ -116.554829, 45.462930 ], [ -116.554980, 45.472801 ], [ -116.558803, 45.480076 ], [ -116.558804, 45.481188 ], [ -116.553473, 45.499107 ], [ -116.548676, 45.510385 ], [ -116.543837, 45.514193 ], [ -116.535482, 45.525079 ], [ -116.523638, 45.546610 ], [ -116.502756, 45.566608 ], [ -116.490279, 45.574499 ], [ -116.482970, 45.577008 ], [ -116.481943, 45.577898 ], [ -116.463635, 45.602785 ], [ -116.463504, 45.615785 ], [ -116.465170, 45.617986 ], [ -116.469813, 45.620604 ], [ -116.472882, 45.624884 ], [ -116.477452, 45.631267 ], [ -116.482495, 45.639916 ], [ -116.487894, 45.649769 ], [ -116.494510, 45.655679 ], [ -116.512326, 45.670224 ], [ -116.523961, 45.677639 ], [ -116.528272, 45.681473 ], [ -116.535396, 45.691734 ], [ -116.536395, 45.696650 ], [ -116.538014, 45.714929 ], [ -116.535698, 45.734231 ], [ -116.537173, 45.737288 ], [ -116.546643, 45.750972 ], [ -116.549085, 45.752735 ], [ -116.553548, 45.753388 ], [ -116.559444, 45.755189 ], [ -116.577422, 45.767530 ], [ -116.593004, 45.778541 ], [ -116.605040, 45.781018 ], [ -116.632032, 45.784979 ], [ -116.635814, 45.783642 ], [ -116.639641, 45.781274 ], [ -116.646342, 45.779815 ], [ -116.659629, 45.780016 ], [ -116.665344, 45.781998 ], [ -116.680139, 45.793590 ], [ -116.687007, 45.806319 ], [ -116.697192, 45.820135 ], [ -116.698079, 45.820852 ], [ -116.708450, 45.825117 ], [ -116.711822, 45.826267 ], [ -116.715527, 45.826773 ], [ -116.736268, 45.826179 ], [ -116.740486, 45.824460 ], [ -116.745219, 45.821394 ], [ -116.750978, 45.818537 ], [ -116.755288, 45.817061 ], [ -116.759787, 45.816167 ], [ -116.763400, 45.816580 ], [ -116.782676, 45.825376 ], [ -116.788329, 45.831928 ], [ -116.789066, 45.833471 ], [ -116.788923, 45.836741 ], [ -116.787520, 45.840204 ], [ -116.787792, 45.844267 ], [ -116.790151, 45.849851 ], [ -116.796051, 45.858473 ], [ -116.814142, 45.877551 ], [ -116.819182, 45.880938 ], [ -116.830003, 45.886405 ], [ -116.843550, 45.892273 ], [ -116.857254, 45.904159 ], [ -116.859795, 45.907264 ], [ -116.866544, 45.916958 ], [ -116.869655, 45.923799 ], [ -116.875706, 45.945008 ], [ -116.886843, 45.958617 ], [ -116.892935, 45.974396 ], [ -116.911409, 45.988912 ], [ -116.915989, 45.995413 ], [ -116.917180, 45.996575 ], [ -116.918680, 45.999875 ], [ -116.923005, 46.018293 ], [ -116.931706, 46.039651 ], [ -116.942656, 46.061000 ], [ -116.948564, 46.067933 ], [ -116.957372, 46.075449 ], [ -116.960416, 46.076346 ], [ -116.963190, 46.075905 ], [ -116.970009, 46.076769 ], [ -116.978938, 46.080007 ], [ -116.981962, 46.084915 ], [ -116.982479, 46.089389 ], [ -116.982498, 46.091347 ], [ -116.981747, 46.092881 ], [ -116.978823, 46.095731 ], [ -116.976957, 46.096670 ], [ -116.974058, 46.097707 ], [ -116.959548, 46.099058 ], [ -116.955263, 46.102237 ], [ -116.951265, 46.111161 ], [ -116.950980, 46.118853 ], [ -116.950276, 46.123464 ], [ -116.948336, 46.125885 ], [ -116.935473, 46.142448 ], [ -116.922648, 46.160744 ], [ -116.921258, 46.164795 ], [ -116.921870, 46.167808 ], [ -116.923958, 46.170920 ], [ -116.941724, 46.185034 ], [ -116.952416, 46.193514 ], [ -116.962966, 46.199680 ], [ -116.965841, 46.203417 ], [ -116.966569, 46.207501 ], [ -116.966130, 46.209453 ], [ -116.959428, 46.219812 ], [ -116.956031, 46.225976 ], [ -116.955264, 46.230880 ], [ -116.958801, 46.242320 ], [ -116.964379, 46.253282 ], [ -116.966742, 46.256923 ], [ -116.970298, 46.261233 ], [ -116.972591, 46.263271 ], [ -116.976054, 46.266010 ], [ -116.987391, 46.272865 ], [ -116.991134, 46.276342 ], [ -116.991422, 46.278467 ], [ -116.990894, 46.280372 ], [ -116.984910, 46.289738 ], [ -116.984630, 46.292705 ], [ -116.986688, 46.296662 ], [ -116.989794, 46.299395 ], [ -116.997260, 46.303151 ], [ -117.007486, 46.305302 ], [ -117.016413, 46.311236 ], [ -117.020663, 46.314793 ], [ -117.022293, 46.317470 ], [ -117.022939, 46.320175 ], [ -117.023424, 46.326427 ], [ -117.022706, 46.328990 ], [ -117.023149, 46.334759 ], [ -117.023844, 46.335976 ], [ -117.027744, 46.338751 ], [ -117.030672, 46.340315 ], [ -117.034450, 46.341320 ], [ -117.045469, 46.342490 ], [ -117.051735, 46.343833 ], [ -117.055983, 46.345531 ], [ -117.060703, 46.349015 ], [ -117.062630, 46.352522 ], [ -117.062748, 46.353624 ], [ -117.062785, 46.365287 ], [ -117.061045, 46.367747 ], [ -117.057516, 46.371396 ], [ -117.051775, 46.375641 ], [ -117.049474, 46.376820 ], [ -117.046915, 46.379577 ], [ -117.041950, 46.392160 ], [ -117.041737, 46.395195 ], [ -117.038282, 46.406040 ], [ -117.036455, 46.407792 ], [ -117.035545, 46.410012 ], [ -117.034696, 46.418318 ], [ -117.036562, 46.422596 ], [ -117.039813, 46.425425 ], [ -117.039741, 46.462704 ], [ -117.039763, 46.469570 ], [ -117.039771, 46.471779 ], [ -117.039398, 46.700186 ], [ -117.039828, 46.815443 ], [ -117.039657, 46.825798 ], [ -117.039836, 47.154734 ], [ -117.039871, 47.181858 ], [ -117.039888, 47.203282 ], [ -117.039899, 47.225515 ], [ -117.040019, 47.259272 ], [ -117.039843, 47.347201 ], [ -117.040176, 47.374900 ], [ -117.039882, 47.399085 ], [ -117.039950, 47.412412 ], [ -117.039948, 47.434885 ], [ -117.039971, 47.463309 ], [ -117.039945, 47.477823 ], [ -117.040514, 47.522351 ], [ -117.040545, 47.527562 ], [ -117.040745, 47.532909 ], [ -117.041276, 47.558210 ], [ -117.041174, 47.558530 ], [ -117.040850, 47.574124 ], [ -117.041431, 47.678140 ], [ -117.041431, 47.678185 ], [ -117.041431, 47.680000 ], [ -117.041532, 47.683194 ], [ -117.041633, 47.706400 ], [ -117.041678, 47.722710 ], [ -117.041634, 47.735300 ], [ -117.042135, 47.744100 ], [ -117.042059, 47.745100 ], [ -117.042657, 47.760857 ], [ -117.042623, 47.761223 ], [ -117.042521, 47.764896 ], [ -117.042485, 47.766525 ], [ -117.042064, 47.778630 ], [ -117.041999, 47.822399 ], [ -117.042470, 47.839009 ], [ -117.042360, 47.966343 ], [ -117.041676, 48.045560 ], [ -117.041401, 48.085500 ], [ -117.041107, 48.124904 ], [ -117.039552, 48.173960 ], [ -117.039413, 48.177250 ], [ -117.039618, 48.178142 ], [ -117.039583, 48.180313 ], [ -117.039582, 48.180853 ], [ -117.039582, 48.181124 ], [ -117.039615, 48.184015 ], [ -117.039599, 48.184387 ], [ -117.038602, 48.207939 ], [ -117.035178, 48.370878 ], [ -117.035178, 48.371221 ], [ -117.035289, 48.422732 ], [ -117.035254, 48.423144 ], [ -117.035285, 48.429816 ], [ -117.035285, 48.430113 ], [ -117.035425, 48.499914 ], [ -117.034499, 48.620769 ], [ -117.034358, 48.628523 ], [ -117.033671, 48.656902 ], [ -117.033335, 48.749921 ], [ -117.032107, 48.874926 ], [ -117.032351, 48.999188 ], [ -116.757185, 48.999791 ], [ -116.757234, 48.999943 ], [ -116.417503, 49.000099 ], [ -116.376039, 49.000518 ], [ -116.369128, 49.001146 ], [ -116.049193, 49.000912 ], [ -116.049155, 48.481247 ], [ -116.050003, 48.413492 ], [ -116.048948, 48.309847 ], [ -116.049735, 48.274668 ], [ -116.049353, 48.249936 ], [ -116.049977, 48.237604 ], [ -116.048911, 48.124930 ], [ -116.049415, 48.077220 ], [ -116.049320, 48.066644 ], [ -116.048739, 48.060093 ], [ -116.049153, 47.999923 ], [ -116.048850, 47.977186 ], [ -116.048421, 47.976820 ], [ -116.038340, 47.971318 ], [ -116.030751, 47.973349 ], [ -116.007246, 47.950087 ], [ -115.998236, 47.938779 ], [ -115.995121, 47.933827 ], [ -115.993678, 47.926183 ], [ -115.982791, 47.915994 ], [ -115.969076, 47.914256 ], [ -115.965153, 47.910131 ], [ -115.959946, 47.898142 ], [ -115.939993, 47.883153 ], [ -115.919291, 47.857406 ], [ -115.906409, 47.846261 ], [ -115.900934, 47.843064 ], [ -115.881522, 47.849672 ], [ -115.875262, 47.843272 ], [ -115.870861, 47.834939 ], [ -115.852291, 47.827991 ], [ -115.845474, 47.814967 ], [ -115.848509, 47.809331 ], [ -115.847487, 47.785227 ], [ -115.840440, 47.780172 ], [ -115.837438, 47.774846 ], [ -115.835069, 47.770060 ], [ -115.835365, 47.760957 ], [ -115.831755, 47.755785 ], [ -115.824597, 47.752154 ], [ -115.803917, 47.758480 ], [ -115.797299, 47.757520 ], [ -115.780441, 47.743447 ], [ -115.783504, 47.729305 ], [ -115.776219, 47.719818 ], [ -115.771770, 47.717412 ], [ -115.763424, 47.717313 ], [ -115.758623, 47.719041 ], [ -115.752349, 47.716743 ], [ -115.730764, 47.704426 ], [ -115.723770, 47.696671 ], [ -115.726613, 47.672093 ], [ -115.736270, 47.654762 ], [ -115.729930, 47.642442 ], [ -115.715193, 47.636340 ], [ -115.708537, 47.635356 ], [ -115.694284, 47.623460 ], [ -115.689404, 47.595402 ], [ -115.706473, 47.577299 ], [ -115.721207, 47.576323 ], [ -115.734674, 47.567401 ], [ -115.746945, 47.555293 ], [ -115.748536, 47.549245 ], [ -115.747263, 47.543197 ], [ -115.741371, 47.538645 ], [ -115.717024, 47.532693 ], [ -115.710340, 47.529510 ], [ -115.708748, 47.512640 ], [ -115.694106, 47.498634 ], [ -115.686704, 47.485596 ], [ -115.655272, 47.477944 ], [ -115.653044, 47.476035 ], [ -115.654318, 47.468077 ], [ -115.663867, 47.456936 ], [ -115.671188, 47.454390 ], [ -115.692930, 47.457237 ], [ -115.718247, 47.453160 ], [ -115.728801, 47.445159 ], [ -115.731348, 47.433381 ], [ -115.728801, 47.428925 ], [ -115.721480, 47.424469 ], [ -115.718934, 47.420967 ], [ -115.710340, 47.417784 ], [ -115.690570, 47.415059 ], [ -115.657681, 47.400651 ], [ -115.648479, 47.390293 ], [ -115.644341, 47.381826 ], [ -115.639186, 47.378605 ], [ -115.617247, 47.382521 ], [ -115.609492, 47.380799 ], [ -115.578619, 47.367007 ], [ -115.570887, 47.356375 ], [ -115.564766, 47.353476 ], [ -115.556318, 47.353076 ], [ -115.551079, 47.349856 ], [ -115.548658, 47.332213 ], [ -115.531971, 47.314121 ], [ -115.526751, 47.303219 ], [ -115.511860, 47.295219 ], [ -115.487314, 47.286518 ], [ -115.470959, 47.284873 ], [ -115.457077, 47.277794 ], [ -115.443566, 47.277309 ], [ -115.428359, 47.278722 ], [ -115.423173, 47.276222 ], [ -115.421645, 47.271736 ], [ -115.410685, 47.264228 ], [ -115.371825, 47.265213 ], [ -115.366280, 47.261485 ], [ -115.359300, 47.259461 ], [ -115.339201, 47.261623 ], [ -115.326903, 47.255912 ], [ -115.324832, 47.244841 ], [ -115.317124, 47.233305 ], [ -115.311875, 47.229673 ], [ -115.307239, 47.229892 ], [ -115.298794, 47.225245 ], [ -115.294785, 47.220914 ], [ -115.292110, 47.209861 ], [ -115.295986, 47.205658 ], [ -115.300805, 47.193930 ], [ -115.300504, 47.188139 ], [ -115.286353, 47.183270 ], [ -115.261885, 47.181742 ], [ -115.255786, 47.174725 ], [ -115.255146, 47.162876 ], [ -115.243707, 47.150347 ], [ -115.223246, 47.148974 ], [ -115.200547, 47.139154 ], [ -115.189451, 47.131032 ], [ -115.172938, 47.112881 ], [ -115.170436, 47.106265 ], [ -115.140375, 47.093013 ], [ -115.139515, 47.084560 ], [ -115.136671, 47.078276 ], [ -115.120917, 47.061237 ], [ -115.107132, 47.049041 ], [ -115.102681, 47.047239 ], [ -115.098136, 47.048897 ], [ -115.087806, 47.045519 ], [ -115.071254, 47.022083 ], [ -115.066223, 46.996375 ], [ -115.057098, 46.986758 ], [ -115.049538, 46.970774 ], [ -115.047857, 46.969533 ], [ -115.031651, 46.971548 ], [ -115.028994, 46.973159 ], [ -115.028386, 46.975659 ], [ -115.001274, 46.971901 ], [ -115.000910, 46.967703 ], [ -114.986539, 46.952099 ], [ -114.960597, 46.930010 ], [ -114.929997, 46.919625 ], [ -114.927432, 46.914185 ], [ -114.927948, 46.909948 ], [ -114.935035, 46.901749 ], [ -114.936805, 46.897378 ], [ -114.931058, 46.882108 ], [ -114.931608, 46.876799 ], [ -114.938713, 46.869021 ], [ -114.943281, 46.867971 ], [ -114.947413, 46.859324 ], [ -114.940398, 46.856050 ], [ -114.928615, 46.854815 ], [ -114.923490, 46.847594 ], [ -114.928450, 46.843242 ], [ -114.927837, 46.835990 ], [ -114.920459, 46.827697 ], [ -114.904505, 46.822851 ], [ -114.897857, 46.813184 ], [ -114.888146, 46.808573 ], [ -114.880588, 46.811791 ], [ -114.864342, 46.813858 ], [ -114.861376, 46.811960 ], [ -114.860067, 46.804988 ], [ -114.856874, 46.801633 ], [ -114.844794, 46.794305 ], [ -114.835917, 46.791111 ], [ -114.829117, 46.782503 ], [ -114.818161, 46.781139 ], [ -114.808587, 46.782350 ], [ -114.790040, 46.778729 ], [ -114.765106, 46.758153 ], [ -114.765127, 46.745383 ], [ -114.767180, 46.738828 ], [ -114.773765, 46.731805 ], [ -114.779668, 46.730411 ], [ -114.788656, 46.714033 ], [ -114.787065, 46.711255 ], [ -114.766890, 46.696901 ], [ -114.751921, 46.697207 ], [ -114.749257, 46.699688 ], [ -114.747758, 46.702649 ], [ -114.740115, 46.711771 ], [ -114.727445, 46.714604 ], [ -114.713516, 46.715138 ], [ -114.710425, 46.717704 ], [ -114.699008, 46.740223 ], [ -114.696656, 46.740572 ], [ -114.649388, 46.732890 ], [ -114.632954, 46.715495 ], [ -114.626695, 46.712889 ], [ -114.620859, 46.707415 ], [ -114.623198, 46.691511 ], [ -114.631898, 46.683970 ], [ -114.641745, 46.679286 ], [ -114.642713, 46.673145 ], [ -114.635713, 46.659375 ], [ -114.621483, 46.658143 ], [ -114.614716, 46.655256 ], [ -114.611676, 46.647704 ], [ -114.616354, 46.643646 ], [ -114.615036, 46.639733 ], [ -114.593292, 46.632848 ], [ -114.583385, 46.633227 ], [ -114.561582, 46.642043 ], [ -114.547321, 46.644485 ], [ -114.498007, 46.637655 ], [ -114.486218, 46.632829 ], [ -114.466902, 46.631695 ], [ -114.454250, 46.640974 ], [ -114.453239, 46.649266 ], [ -114.424424, 46.660648 ], [ -114.410907, 46.657466 ], [ -114.403383, 46.659633 ], [ -114.394514, 46.664846 ], [ -114.360709, 46.669059 ], [ -114.332887, 46.660756 ], [ -114.324560, 46.653579 ], [ -114.320665, 46.646963 ], [ -114.322912, 46.642938 ], [ -114.322519, 46.611066 ], [ -114.333931, 46.592162 ], [ -114.334992, 46.588154 ], [ -114.333931, 46.582732 ], [ -114.331338, 46.577781 ], [ -114.331750, 46.571914 ], [ -114.339533, 46.564039 ], [ -114.345340, 46.548444 ], [ -114.348733, 46.533792 ], [ -114.349208, 46.529514 ], [ -114.342072, 46.519679 ], [ -114.351655, 46.508119 ], [ -114.358740, 46.505306 ], [ -114.375348, 46.501855 ], [ -114.385871, 46.504370 ], [ -114.395204, 46.503148 ], [ -114.400257, 46.502143 ], [ -114.403019, 46.498675 ], [ -114.400068, 46.477180 ], [ -114.394447, 46.469549 ], [ -114.383051, 46.466402 ], [ -114.379338, 46.460166 ], [ -114.376413, 46.442983 ], [ -114.384756, 46.411784 ], [ -114.408974, 46.400438 ], [ -114.422458, 46.387097 ], [ -114.411592, 46.366688 ], [ -114.410682, 46.360673 ], [ -114.413758, 46.335945 ], [ -114.431708, 46.310744 ], [ -114.433478, 46.305502 ], [ -114.425587, 46.287899 ], [ -114.427309, 46.283624 ], [ -114.435440, 46.276610 ], [ -114.441326, 46.273800 ], [ -114.453257, 46.270939 ], [ -114.465024, 46.273127 ], [ -114.470479, 46.267320 ], [ -114.468254, 46.248796 ], [ -114.451912, 46.241253 ], [ -114.449819, 46.237119 ], [ -114.445497, 46.220227 ], [ -114.443215, 46.202943 ], [ -114.445928, 46.173933 ], [ -114.457549, 46.170231 ], [ -114.472643, 46.162202 ], [ -114.478333, 46.160876 ], [ -114.489254, 46.167684 ], [ -114.514706, 46.167726 ], [ -114.527096, 46.146218 ], [ -114.521300, 46.125287 ], [ -114.488303, 46.113106 ], [ -114.474415, 46.112515 ], [ -114.460049, 46.097104 ], [ -114.461864, 46.078571 ], [ -114.468529, 46.062484 ], [ -114.492153, 46.047290 ], [ -114.494683, 46.042546 ], [ -114.493418, 46.037170 ], [ -114.490572, 46.032427 ], [ -114.485793, 46.030022 ], [ -114.480241, 46.030325 ], [ -114.473811, 46.016614 ], [ -114.477922, 46.009025 ], [ -114.477290, 46.000802 ], [ -114.470965, 45.995742 ], [ -114.441185, 45.988453 ], [ -114.425843, 45.984984 ], [ -114.419899, 45.981106 ], [ -114.411892, 45.977883 ], [ -114.409353, 45.971410 ], [ -114.403712, 45.967049 ], [ -114.402261, 45.961489 ], [ -114.404708, 45.955900 ], [ -114.411933, 45.952358 ], [ -114.415977, 45.947891 ], [ -114.423681, 45.944100 ], [ -114.427717, 45.939625 ], [ -114.431328, 45.938023 ], [ -114.431159, 45.935737 ], [ -114.413168, 45.911479 ], [ -114.404314, 45.903497 ], [ -114.395059, 45.901458 ], [ -114.387166, 45.889164 ], [ -114.388243, 45.882340 ], [ -114.409477, 45.851640 ], [ -114.422963, 45.855381 ], [ -114.448680, 45.858891 ], [ -114.455532, 45.855012 ], [ -114.470296, 45.851343 ], [ -114.498809, 45.850676 ], [ -114.509303, 45.845531 ], [ -114.514596, 45.840785 ], [ -114.517143, 45.835993 ], [ -114.517040, 45.833148 ], [ -114.512973, 45.828825 ], [ -114.544692, 45.791447 ], [ -114.555487, 45.786249 ], [ -114.562509, 45.779927 ], [ -114.566172, 45.773864 ], [ -114.535634, 45.739095 ], [ -114.504869, 45.722176 ], [ -114.497553, 45.710677 ], [ -114.495421, 45.703321 ], [ -114.499637, 45.669035 ], [ -114.507645, 45.658949 ], [ -114.522142, 45.649340 ], [ -114.529678, 45.652320 ], [ -114.535770, 45.650613 ], [ -114.561046, 45.639906 ], [ -114.563652, 45.637412 ], [ -114.563305, 45.631612 ], [ -114.553937, 45.619299 ], [ -114.544905, 45.616673 ], [ -114.538132, 45.606834 ], [ -114.553999, 45.591279 ], [ -114.558253, 45.585104 ], [ -114.559038, 45.565706 ], [ -114.549508, 45.560590 ], [ -114.526075, 45.570771 ], [ -114.517761, 45.568129 ], [ -114.506341, 45.559216 ], [ -114.498176, 45.555473 ], [ -114.473759, 45.563278 ], [ -114.460542, 45.561283 ], [ -114.456764, 45.543983 ], [ -114.450863, 45.542530 ], [ -114.438991, 45.536076 ], [ -114.415804, 45.509753 ], [ -114.388618, 45.502903 ], [ -114.368520, 45.492716 ], [ -114.365620, 45.490416 ], [ -114.360719, 45.474116 ], [ -114.345019, 45.459916 ], [ -114.333218, 45.459316 ], [ -114.279217, 45.480616 ], [ -114.270717, 45.486116 ], [ -114.261616, 45.495816 ], [ -114.247824, 45.524283 ], [ -114.248183, 45.533226 ], [ -114.251836, 45.537812 ], [ -114.248121, 45.545877 ], [ -114.227942, 45.546423 ], [ -114.203665, 45.535570 ], [ -114.192802, 45.536596 ], [ -114.186470, 45.545539 ], [ -114.180043, 45.551432 ], [ -114.154837, 45.552916 ], [ -114.135249, 45.557465 ], [ -114.129099, 45.565491 ], [ -114.128601, 45.568996 ], [ -114.132359, 45.572531 ], [ -114.131469, 45.574444 ], [ -114.122322, 45.584260 ], [ -114.100308, 45.586354 ], [ -114.086584, 45.591180 ], [ -114.082100, 45.596958 ], [ -114.083149, 45.603996 ], [ -114.081790, 45.611329 ], [ -114.067619, 45.627706 ], [ -114.033456, 45.648629 ], [ -114.018731, 45.648616 ], [ -114.014973, 45.654008 ], [ -114.013786, 45.658238 ], [ -114.020070, 45.670332 ], [ -114.020533, 45.681223 ], [ -114.019315, 45.692937 ], [ -114.015633, 45.696127 ], [ -113.986656, 45.704564 ], [ -113.971565, 45.700636 ], [ -113.934220, 45.682232 ], [ -113.930403, 45.671878 ], [ -113.919752, 45.658536 ], [ -113.903582, 45.651165 ], [ -113.900588, 45.648259 ], [ -113.898883, 45.644167 ], [ -113.902539, 45.636945 ], [ -113.904691, 45.622007 ], [ -113.886006, 45.617020 ], [ -113.861404, 45.623660 ], [ -113.823068, 45.612486 ], [ -113.806729, 45.602146 ], [ -113.802955, 45.592631 ], [ -113.803261, 45.584193 ], [ -113.804796, 45.580358 ], [ -113.819868, 45.566326 ], [ -113.834555, 45.520729 ], [ -113.809144, 45.519908 ], [ -113.802849, 45.523159 ], [ -113.796579, 45.523462 ], [ -113.778361, 45.523415 ], [ -113.766022, 45.520621 ], [ -113.759986, 45.480735 ], [ -113.784160, 45.454946 ], [ -113.783272, 45.451839 ], [ -113.764591, 45.431403 ], [ -113.763368, 45.427732 ], [ -113.768058, 45.418147 ], [ -113.765203, 45.410601 ], [ -113.760924, 45.406501 ], [ -113.750546, 45.402720 ], [ -113.734402, 45.392353 ], [ -113.733092, 45.390173 ], [ -113.732390, 45.385058 ], [ -113.735530, 45.364738 ], [ -113.740200, 45.345590 ], [ -113.738729, 45.329741 ], [ -113.735601, 45.325265 ], [ -113.689359, 45.283550 ], [ -113.688077, 45.276407 ], [ -113.691557, 45.270912 ], [ -113.692039, 45.265191 ], [ -113.684946, 45.253706 ], [ -113.678749, 45.249270 ], [ -113.674409, 45.249411 ], [ -113.665633, 45.246265 ], [ -113.657027, 45.241436 ], [ -113.650064, 45.234710 ], [ -113.647399, 45.228282 ], [ -113.636889, 45.212983 ], [ -113.599506, 45.191114 ], [ -113.589891, 45.176986 ], [ -113.594632, 45.166034 ], [ -113.574670, 45.128411 ], [ -113.554744, 45.112901 ], [ -113.546488, 45.112285 ], [ -113.538037, 45.115030 ], [ -113.513342, 45.115225 ], [ -113.506638, 45.107288 ], [ -113.510819, 45.099902 ], [ -113.520134, 45.093033 ], [ -113.485278, 45.063519 ], [ -113.473770, 45.061700 ], [ -113.465073, 45.062755 ], [ -113.460578, 45.064879 ], [ -113.451970, 45.059247 ], [ -113.449120, 45.046098 ], [ -113.449909, 45.035167 ], [ -113.437726, 45.006967 ], [ -113.446884, 44.998545 ], [ -113.447013, 44.984637 ], [ -113.444862, 44.976141 ], [ -113.443782, 44.959890 ], [ -113.448958, 44.953544 ], [ -113.467467, 44.948061 ], [ -113.474781, 44.948795 ], [ -113.480836, 44.950310 ], [ -113.494446, 44.948597 ], [ -113.498745, 44.942314 ], [ -113.491121, 44.927548 ], [ -113.474573, 44.910846 ], [ -113.455071, 44.865424 ], [ -113.422376, 44.842595 ], [ -113.383984, 44.837400 ], [ -113.377153, 44.834858 ], [ -113.356062, 44.819798 ], [ -113.346100, 44.800611 ], [ -113.346692, 44.798898 ], [ -113.354763, 44.795468 ], [ -113.354034, 44.791745 ], [ -113.341704, 44.784853 ], [ -113.301508, 44.798985 ], [ -113.296830, 44.803358 ], [ -113.278382, 44.812706 ], [ -113.247166, 44.822950 ], [ -113.238729, 44.814144 ], [ -113.209624, 44.809070 ], [ -113.194360, 44.802151 ], [ -113.183395, 44.793565 ], [ -113.179366, 44.787142 ], [ -113.163806, 44.778921 ], [ -113.158206, 44.780847 ], [ -113.140618, 44.776698 ], [ -113.131453, 44.772837 ], [ -113.131387, 44.764738 ], [ -113.137704, 44.760109 ], [ -113.134824, 44.752763 ], [ -113.116874, 44.738104 ], [ -113.102138, 44.729027 ], [ -113.101154, 44.708578 ], [ -113.098064, 44.697477 ], [ -113.081906, 44.691392 ], [ -113.067760, 44.679474 ], [ -113.067756, 44.672807 ], [ -113.070420, 44.667844 ], [ -113.068306, 44.656374 ], [ -113.065589, 44.649371 ], [ -113.051504, 44.636950 ], [ -113.049349, 44.629380 ], [ -113.053529, 44.621187 ], [ -113.056770, 44.618657 ], [ -113.065593, 44.617391 ], [ -113.073760, 44.613928 ], [ -113.083819, 44.602220 ], [ -113.061071, 44.577329 ], [ -113.042363, 44.565237 ], [ -113.042820, 44.546757 ], [ -113.032722, 44.537137 ], [ -113.019777, 44.528505 ], [ -113.018636, 44.520064 ], [ -113.020917, 44.493827 ], [ -113.003544, 44.450814 ], [ -112.981682, 44.434279 ], [ -112.951146, 44.416699 ], [ -112.915602, 44.402699 ], [ -112.886041, 44.395874 ], [ -112.881769, 44.380315 ], [ -112.855395, 44.359975 ], [ -112.844859, 44.358221 ], [ -112.820489, 44.370946 ], [ -112.813240, 44.378103 ], [ -112.812608, 44.392275 ], [ -112.821896, 44.407436 ], [ -112.836034, 44.422653 ], [ -112.828191, 44.442472 ], [ -112.797863, 44.466112 ], [ -112.781294, 44.484888 ], [ -112.749011, 44.491233 ], [ -112.735084, 44.499159 ], [ -112.719110, 44.504344 ], [ -112.707815, 44.503023 ], [ -112.671169, 44.491265 ], [ -112.664485, 44.486450 ], [ -112.660696, 44.485756 ], [ -112.601863, 44.491015 ], [ -112.584197, 44.481368 ], [ -112.573513, 44.480983 ], [ -112.550557, 44.484928 ], [ -112.541989, 44.483971 ], [ -112.518871, 44.475784 ], [ -112.512036, 44.470420 ], [ -112.511713, 44.466445 ], [ -112.500310, 44.463051 ], [ -112.473207, 44.480027 ], [ -112.460347, 44.475710 ], [ -112.435342, 44.462216 ], [ -112.387389, 44.448058 ], [ -112.368764, 44.467153 ], [ -112.358926, 44.486280 ], [ -112.356600, 44.493127 ], [ -112.358917, 44.528847 ], [ -112.354210, 44.535638 ], [ -112.348794, 44.538691 ], [ -112.319198, 44.539110 ], [ -112.315008, 44.541900 ], [ -112.315047, 44.550049 ], [ -112.312899, 44.553536 ], [ -112.307642, 44.557651 ], [ -112.286187, 44.568472 ], [ -112.258665, 44.569516 ], [ -112.242785, 44.568091 ], [ -112.230117, 44.562759 ], [ -112.226841, 44.555239 ], [ -112.229477, 44.549494 ], [ -112.221698, 44.543519 ], [ -112.183937, 44.533067 ], [ -112.179703, 44.533021 ], [ -112.164597, 44.541666 ], [ -112.136454, 44.539911 ], [ -112.129078, 44.536300 ], [ -112.125101, 44.528527 ], [ -112.106755, 44.520829 ], [ -112.101564, 44.520847 ], [ -112.096299, 44.523212 ], [ -112.093304, 44.530002 ], [ -112.069011, 44.537104 ], [ -112.053434, 44.535089 ], [ -112.036943, 44.530323 ], [ -112.034133, 44.537716 ], [ -112.035025, 44.542691 ], [ -112.032707, 44.546642 ], [ -112.013850, 44.542348 ], [ -111.995231, 44.535444 ], [ -111.980833, 44.536682 ], [ -111.951522, 44.550062 ], [ -111.947941, 44.556776 ], [ -111.903566, 44.557230 ], [ -111.887852, 44.563413 ], [ -111.870504, 44.564033 ], [ -111.849293, 44.539837 ], [ -111.842542, 44.526069 ], [ -111.821488, 44.509286 ], [ -111.807914, 44.511716 ], [ -111.806512, 44.516264 ], [ -111.761904, 44.529841 ], [ -111.758966, 44.533766 ], [ -111.746401, 44.540766 ], [ -111.737191, 44.543060 ], [ -111.715474, 44.543543 ], [ -111.709553, 44.550206 ], [ -111.704218, 44.560205 ], [ -111.681571, 44.559864 ], [ -111.614405, 44.548991 ], [ -111.601249, 44.554210 ], [ -111.591768, 44.561502 ], [ -111.585763, 44.562843 ], [ -111.562814, 44.555209 ], [ -111.556577, 44.554495 ], [ -111.546637, 44.557099 ], [ -111.524006, 44.548385 ], [ -111.518095, 44.544177 ], [ -111.500792, 44.540062 ], [ -111.471682, 44.540824 ], [ -111.467736, 44.544521 ], [ -111.469185, 44.552044 ], [ -111.492024, 44.560810 ], [ -111.519126, 44.582916 ], [ -111.524213, 44.595585 ], [ -111.525764, 44.604883 ], [ -111.521688, 44.613371 ], [ -111.504940, 44.635746 ], [ -111.473178, 44.665479 ], [ -111.468833, 44.679335 ], [ -111.477980, 44.682393 ], [ -111.484898, 44.687578 ], [ -111.490228, 44.700221 ], [ -111.489339, 44.704946 ], [ -111.486019, 44.707654 ], [ -111.438793, 44.720546 ], [ -111.429604, 44.720149 ], [ -111.424214, 44.714024 ], [ -111.414271, 44.710741 ], [ -111.398575, 44.723343 ], [ -111.394459, 44.744578 ], [ -111.397805, 44.746738 ], [ -111.393854, 44.752549 ], [ -111.385005, 44.755128 ], [ -111.374760, 44.750295 ], [ -111.366270, 44.742234 ], [ -111.366723, 44.738361 ], [ -111.355768, 44.727602 ], [ -111.348184, 44.725459 ], [ -111.341351, 44.729300 ], [ -111.323669, 44.724474 ], [ -111.296260, 44.702271 ], [ -111.268750, 44.668279 ], [ -111.276956, 44.655626 ], [ -111.262839, 44.649658 ], [ -111.252680, 44.651092 ], [ -111.224161, 44.623402 ], [ -111.231227, 44.606915 ], [ -111.230180, 44.587025 ], [ -111.225208, 44.581006 ], [ -111.201459, 44.575696 ], [ -111.189617, 44.571062 ], [ -111.182551, 44.566874 ], [ -111.175747, 44.552219 ], [ -111.166892, 44.547220 ], [ -111.159590, 44.546376 ], [ -111.143557, 44.535732 ], [ -111.139455, 44.517112 ], [ -111.131379, 44.499925 ], [ -111.122654, 44.493659 ], [ -111.062729, 44.476073 ], [ -111.048974, 44.474072 ], [ -111.049194, 44.438058 ], [ -111.049216, 44.435811 ], [ -111.049148, 44.374925 ], [ -111.049695, 44.353626 ], [ -111.049119, 44.124923 ], [ -111.048452, 44.114831 ], [ -111.048633, 44.062903 ], [ -111.048751, 44.060838 ], [ -111.048751, 44.060403 ], [ -111.049077, 44.020072 ], [ -111.047349, 43.999921 ], [ -111.046917, 43.974978 ], [ -111.046515, 43.908376 ], [ -111.046715, 43.815832 ], [ -111.046340, 43.726957 ], [ -111.046435, 43.726545 ], [ -111.046421, 43.722059 ], [ -111.046110, 43.687848 ], [ -111.046051, 43.685812 ], [ -111.046118, 43.684902 ], [ -111.045880, 43.681033 ], [ -111.045706, 43.659112 ], [ -111.044617, 43.315720 ], [ -111.044229, 43.195579 ], [ -111.044168, 43.189244 ], [ -111.044232, 43.184440 ], [ -111.044266, 43.177236 ], [ -111.044235, 43.177121 ], [ -111.044143, 43.072364 ], [ -111.044162, 43.068222 ], [ -111.044150, 43.066172 ], [ -111.044117, 43.060309 ], [ -111.044086, 43.054819 ], [ -111.044063, 43.046302 ], [ -111.044058, 43.044640 ], [ -111.043997, 43.041415 ], [ -111.044094, 43.029270 ], [ -111.044033, 43.026411 ], [ -111.044034, 43.024844 ], [ -111.044034, 43.024581 ], [ -111.044206, 43.022614 ], [ -111.044129, 43.018702 ], [ -111.043924, 42.975063 ], [ -111.043957, 42.969482 ], [ -111.043959, 42.964450 ], [ -111.044135, 42.874924 ], [ -111.043564, 42.722624 ], [ -111.046017, 42.582723 ], [ -111.046801, 42.504946 ], [ -111.047080, 42.349420 ], [ -111.047074, 42.280787 ], [ -111.047097, 42.194773 ], [ -111.047058, 42.182672 ], [ -111.047107, 42.148971 ], [ -111.047109, 42.142497 ], [ -111.046689, 42.001567 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US17", "STATE": "17", "NAME": "Illinois", "LSAD": "", "CENSUSAREA": 55518.930000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -87.532331, 39.997776 ], [ -87.532542, 39.987462 ], [ -87.532683, 39.977691 ], [ -87.532790, 39.975010 ], [ -87.532776, 39.971077 ], [ -87.533227, 39.883127 ], [ -87.533142, 39.810947 ], [ -87.533056, 39.803922 ], [ -87.533058, 39.796243 ], [ -87.533066, 39.781743 ], [ -87.532703, 39.664868 ], [ -87.532444, 39.646102 ], [ -87.532365, 39.646126 ], [ -87.532008, 39.564013 ], [ -87.531939, 39.545853 ], [ -87.531965, 39.526937 ], [ -87.531692, 39.495516 ], [ -87.531627, 39.491698 ], [ -87.531663, 39.477120 ], [ -87.531624, 39.469378 ], [ -87.531608, 39.466225 ], [ -87.531489, 39.449474 ], [ -87.531355, 39.437732 ], [ -87.531355, 39.436656 ], [ -87.531646, 39.347888 ], [ -87.544013, 39.352907 ], [ -87.554400, 39.340488 ], [ -87.578331, 39.340343 ], [ -87.589084, 39.333831 ], [ -87.600397, 39.312904 ], [ -87.597946, 39.299479 ], [ -87.597545, 39.296388 ], [ -87.610050, 39.282232 ], [ -87.605543, 39.261122 ], [ -87.593486, 39.247452 ], [ -87.583535, 39.243579 ], [ -87.579163, 39.232962 ], [ -87.574558, 39.218404 ], [ -87.577029, 39.211123 ], [ -87.588614, 39.197824 ], [ -87.620796, 39.174790 ], [ -87.640435, 39.166727 ], [ -87.645990, 39.144900 ], [ -87.643145, 39.128562 ], [ -87.632245, 39.118702 ], [ -87.632874, 39.114297 ], [ -87.632874, 39.110550 ], [ -87.632249, 39.106803 ], [ -87.630376, 39.104305 ], [ -87.625379, 39.101806 ], [ -87.619134, 39.100557 ], [ -87.617260, 39.096186 ], [ -87.616636, 39.089940 ], [ -87.613513, 39.085568 ], [ -87.608517, 39.082445 ], [ -87.596373, 39.079639 ], [ -87.572588, 39.057286 ], [ -87.575027, 39.034062 ], [ -87.569696, 39.019413 ], [ -87.579117, 39.001607 ], [ -87.578319, 38.988786 ], [ -87.529496, 38.971925 ], [ -87.512187, 38.954417 ], [ -87.518826, 38.923205 ], [ -87.527645, 38.907688 ], [ -87.544089, 38.895093 ], [ -87.547370, 38.875614 ], [ -87.553384, 38.863344 ], [ -87.550515, 38.859560 ], [ -87.525893, 38.848795 ], [ -87.521681, 38.826576 ], [ -87.527342, 38.818121 ], [ -87.496537, 38.778571 ], [ -87.498948, 38.757774 ], [ -87.496494, 38.742728 ], [ -87.516707, 38.716333 ], [ -87.519609, 38.697198 ], [ -87.531231, 38.684036 ], [ -87.545538, 38.677613 ], [ -87.593678, 38.667402 ], [ -87.620120, 38.639489 ], [ -87.622375, 38.618873 ], [ -87.627348, 38.605440 ], [ -87.624143, 38.596955 ], [ -87.623890, 38.593984 ], [ -87.626444, 38.591066 ], [ -87.629362, 38.589971 ], [ -87.637752, 38.588512 ], [ -87.651529, 38.568166 ], [ -87.650704, 38.556240 ], [ -87.660732, 38.541092 ], [ -87.655780, 38.521206 ], [ -87.653802, 38.517382 ], [ -87.654166, 38.511911 ], [ -87.657084, 38.507169 ], [ -87.663701, 38.502931 ], [ -87.678374, 38.498438 ], [ -87.693188, 38.488038 ], [ -87.714047, 38.479880 ], [ -87.730768, 38.478717 ], [ -87.739522, 38.475069 ], [ -87.743535, 38.467774 ], [ -87.743170, 38.459019 ], [ -87.735729, 38.452986 ], [ -87.730134, 38.446518 ], [ -87.730699, 38.442908 ], [ -87.741040, 38.435576 ], [ -87.745254, 38.408996 ], [ -87.779996, 38.370842 ], [ -87.806075, 38.363143 ], [ -87.822721, 38.346912 ], [ -87.832723, 38.324853 ], [ -87.831972, 38.307241 ], [ -87.833757, 38.299133 ], [ -87.838243, 38.293750 ], [ -87.844972, 38.290610 ], [ -87.853046, 38.289264 ], [ -87.860224, 38.291507 ], [ -87.868747, 38.299133 ], [ -87.875476, 38.301376 ], [ -87.880410, 38.299581 ], [ -87.883102, 38.293301 ], [ -87.887849, 38.285299 ], [ -87.898802, 38.276255 ], [ -87.908223, 38.274012 ], [ -87.913606, 38.276703 ], [ -87.916746, 38.284778 ], [ -87.921680, 38.289712 ], [ -87.928858, 38.292404 ], [ -87.938727, 38.289264 ], [ -87.952125, 38.273763 ], [ -87.951277, 38.268750 ], [ -87.945904, 38.256966 ], [ -87.950838, 38.247097 ], [ -87.960225, 38.237118 ], [ -87.968968, 38.237389 ], [ -87.975511, 38.232742 ], [ -87.979548, 38.228256 ], [ -87.982688, 38.221527 ], [ -87.984234, 38.209960 ], [ -87.975819, 38.197834 ], [ -87.959500, 38.184376 ], [ -87.937162, 38.172189 ], [ -87.928858, 38.168594 ], [ -87.922577, 38.160071 ], [ -87.921680, 38.148407 ], [ -87.945472, 38.126616 ], [ -87.974272, 38.121981 ], [ -87.990763, 38.110726 ], [ -87.999734, 38.100857 ], [ -87.998389, 38.090091 ], [ -87.994800, 38.083362 ], [ -87.986725, 38.076185 ], [ -87.984931, 38.069008 ], [ -87.990314, 38.056447 ], [ -88.009603, 38.049270 ], [ -88.020369, 38.046578 ], [ -88.025304, 38.038055 ], [ -88.029790, 38.025046 ], [ -88.025831, 38.007245 ], [ -88.012574, 37.977062 ], [ -88.012929, 37.966544 ], [ -88.036124, 37.942746 ], [ -88.044145, 37.926805 ], [ -88.037416, 37.913348 ], [ -88.031584, 37.901685 ], [ -88.033378, 37.894059 ], [ -88.043247, 37.887330 ], [ -88.050425, 37.882844 ], [ -88.054462, 37.877461 ], [ -88.056705, 37.872078 ], [ -88.058499, 37.865349 ], [ -88.056705, 37.855480 ], [ -88.053116, 37.847854 ], [ -88.048630, 37.843817 ], [ -88.044593, 37.840677 ], [ -88.043247, 37.836639 ], [ -88.044145, 37.830808 ], [ -88.049079, 37.826322 ], [ -88.050425, 37.822285 ], [ -88.051771, 37.817799 ], [ -88.051771, 37.813761 ], [ -88.049528, 37.811070 ], [ -88.045939, 37.807481 ], [ -88.039105, 37.805789 ], [ -88.029382, 37.803601 ], [ -88.028030, 37.799224 ], [ -88.032438, 37.796361 ], [ -88.035827, 37.791917 ], [ -88.038769, 37.784307 ], [ -88.040873, 37.772082 ], [ -88.042602, 37.767120 ], [ -88.049942, 37.754078 ], [ -88.059588, 37.742608 ], [ -88.063802, 37.738645 ], [ -88.072538, 37.733286 ], [ -88.081925, 37.730389 ], [ -88.085901, 37.728587 ], [ -88.095759, 37.723205 ], [ -88.101844, 37.718036 ], [ -88.107088, 37.715915 ], [ -88.117803, 37.712583 ], [ -88.122412, 37.709685 ], [ -88.125033, 37.707094 ], [ -88.132341, 37.697142 ], [ -88.134282, 37.691498 ], [ -88.145434, 37.682590 ], [ -88.151646, 37.675098 ], [ -88.158207, 37.664542 ], [ -88.159372, 37.661847 ], [ -88.160187, 37.657592 ], [ -88.160062, 37.654332 ], [ -88.158640, 37.649097 ], [ -88.158374, 37.639948 ], [ -88.156827, 37.632801 ], [ -88.152691, 37.622827 ], [ -88.142225, 37.603737 ], [ -88.140752, 37.599158 ], [ -88.140226, 37.595263 ], [ -88.140940, 37.590865 ], [ -88.139973, 37.586451 ], [ -88.136164, 37.580285 ], [ -88.133393, 37.574235 ], [ -88.131622, 37.572968 ], [ -88.121517, 37.568166 ], [ -88.114330, 37.562189 ], [ -88.105585, 37.556180 ], [ -88.101174, 37.551330 ], [ -88.092814, 37.539637 ], [ -88.088049, 37.535124 ], [ -88.086194, 37.534186 ], [ -88.078046, 37.532029 ], [ -88.072242, 37.528826 ], [ -88.069018, 37.525297 ], [ -88.063311, 37.515755 ], [ -88.062568, 37.513563 ], [ -88.062828, 37.508123 ], [ -88.061292, 37.505232 ], [ -88.062563, 37.495951 ], [ -88.064115, 37.492013 ], [ -88.062950, 37.489385 ], [ -88.062174, 37.489057 ], [ -88.062294, 37.487837 ], [ -88.064234, 37.484548 ], [ -88.067728, 37.481593 ], [ -88.068504, 37.481921 ], [ -88.072386, 37.483563 ], [ -88.077987, 37.480146 ], [ -88.084171, 37.472699 ], [ -88.087664, 37.471059 ], [ -88.090380, 37.471059 ], [ -88.091156, 37.471715 ], [ -88.091156, 37.472699 ], [ -88.095818, 37.473025 ], [ -88.109417, 37.472369 ], [ -88.128010, 37.470507 ], [ -88.132628, 37.471555 ], [ -88.135142, 37.471626 ], [ -88.157061, 37.466937 ], [ -88.171764, 37.465612 ], [ -88.175283, 37.463790 ], [ -88.188615, 37.461896 ], [ -88.206923, 37.460188 ], [ -88.225012, 37.457390 ], [ -88.237784, 37.456811 ], [ -88.255193, 37.456748 ], [ -88.281667, 37.452596 ], [ -88.297821, 37.446816 ], [ -88.312585, 37.440591 ], [ -88.317525, 37.436178 ], [ -88.321199, 37.434705 ], [ -88.330622, 37.429316 ], [ -88.333183, 37.427210 ], [ -88.348405, 37.410726 ], [ -88.358436, 37.404860 ], [ -88.361557, 37.402931 ], [ -88.365471, 37.401663 ], [ -88.371214, 37.402730 ], [ -88.373445, 37.404342 ], [ -88.377507, 37.409825 ], [ -88.387669, 37.416482 ], [ -88.397340, 37.421644 ], [ -88.404127, 37.424146 ], [ -88.408808, 37.425216 ], [ -88.413108, 37.424468 ], [ -88.418594, 37.421987 ], [ -88.425981, 37.419441 ], [ -88.433182, 37.418169 ], [ -88.439333, 37.416416 ], [ -88.450127, 37.411717 ], [ -88.456000, 37.408482 ], [ -88.465861, 37.400547 ], [ -88.470224, 37.396255 ], [ -88.476592, 37.386875 ], [ -88.478523, 37.375052 ], [ -88.482113, 37.364615 ], [ -88.482612, 37.354915 ], [ -88.484462, 37.345609 ], [ -88.486947, 37.339596 ], [ -88.490310, 37.335042 ], [ -88.494137, 37.327689 ], [ -88.500566, 37.317822 ], [ -88.505087, 37.307858 ], [ -88.508657, 37.303353 ], [ -88.511497, 37.298527 ], [ -88.514661, 37.290948 ], [ -88.515939, 37.284043 ], [ -88.509587, 37.273398 ], [ -88.506942, 37.266656 ], [ -88.509328, 37.262130 ], [ -88.508031, 37.260261 ], [ -88.500777, 37.253579 ], [ -88.492383, 37.248445 ], [ -88.487277, 37.244077 ], [ -88.484982, 37.240774 ], [ -88.479730, 37.229606 ], [ -88.478179, 37.227251 ], [ -88.471753, 37.220155 ], [ -88.466981, 37.217026 ], [ -88.458763, 37.213536 ], [ -88.450653, 37.207046 ], [ -88.447764, 37.203527 ], [ -88.441956, 37.189036 ], [ -88.439527, 37.181740 ], [ -88.437781, 37.180007 ], [ -88.433454, 37.165871 ], [ -88.433782, 37.164070 ], [ -88.431488, 37.160298 ], [ -88.429906, 37.158668 ], [ -88.428097, 37.157758 ], [ -88.424403, 37.152428 ], [ -88.424776, 37.149901 ], [ -88.434701, 37.126424 ], [ -88.435829, 37.125055 ], [ -88.443538, 37.109192 ], [ -88.443538, 37.108517 ], [ -88.442743, 37.107842 ], [ -88.444605, 37.098601 ], [ -88.458948, 37.073796 ], [ -88.476127, 37.068223 ], [ -88.482856, 37.067114 ], [ -88.490068, 37.067874 ], [ -88.504437, 37.065265 ], [ -88.514356, 37.065231 ], [ -88.521436, 37.065584 ], [ -88.531576, 37.067192 ], [ -88.545403, 37.070003 ], [ -88.560032, 37.076010 ], [ -88.569375, 37.082213 ], [ -88.576718, 37.085852 ], [ -88.581635, 37.090567 ], [ -88.589207, 37.099655 ], [ -88.593922, 37.101761 ], [ -88.601144, 37.107081 ], [ -88.611440, 37.112745 ], [ -88.625889, 37.119458 ], [ -88.630605, 37.121003 ], [ -88.637977, 37.121309 ], [ -88.644872, 37.122844 ], [ -88.687767, 37.139378 ], [ -88.693983, 37.141155 ], [ -88.702553, 37.142646 ], [ -88.720224, 37.140641 ], [ -88.723440, 37.141194 ], [ -88.732105, 37.143956 ], [ -88.737937, 37.146513 ], [ -88.746065, 37.151564 ], [ -88.753068, 37.154701 ], [ -88.765357, 37.162662 ], [ -88.775950, 37.168780 ], [ -88.779466, 37.172495 ], [ -88.786947, 37.178584 ], [ -88.797373, 37.184854 ], [ -88.805720, 37.188595 ], [ -88.820935, 37.192203 ], [ -88.835051, 37.196486 ], [ -88.869530, 37.209711 ], [ -88.902841, 37.219299 ], [ -88.916934, 37.224291 ], [ -88.920878, 37.224769 ], [ -88.931745, 37.227593 ], [ -88.942111, 37.228811 ], [ -88.966831, 37.229891 ], [ -88.983260, 37.228685 ], [ -89.000968, 37.224401 ], [ -89.008532, 37.220583 ], [ -89.005920, 37.221198 ], [ -89.014003, 37.216090 ], [ -89.029981, 37.211144 ], [ -89.037568, 37.203932 ], [ -89.041263, 37.202881 ], [ -89.058036, 37.188767 ], [ -89.076221, 37.175125 ], [ -89.086526, 37.165602 ], [ -89.092934, 37.156439 ], [ -89.095753, 37.150391 ], [ -89.096669, 37.146200 ], [ -89.099047, 37.140967 ], [ -89.111189, 37.119052 ], [ -89.115579, 37.115781 ], [ -89.120465, 37.113487 ], [ -89.122020, 37.111342 ], [ -89.125072, 37.108813 ], [ -89.134931, 37.103278 ], [ -89.135847, 37.102197 ], [ -89.138231, 37.096906 ], [ -89.141320, 37.093865 ], [ -89.146596, 37.090714 ], [ -89.149797, 37.089828 ], [ -89.151294, 37.090487 ], [ -89.154504, 37.088907 ], [ -89.168087, 37.074218 ], [ -89.175725, 37.062069 ], [ -89.179384, 37.053012 ], [ -89.181369, 37.046305 ], [ -89.182509, 37.037275 ], [ -89.180849, 37.026843 ], [ -89.178975, 37.020928 ], [ -89.173595, 37.011409 ], [ -89.171120, 37.008072 ], [ -89.166447, 37.003337 ], [ -89.160667, 37.000051 ], [ -89.138437, 36.985089 ], [ -89.132685, 36.982200 ], [ -89.140814, 36.979416 ], [ -89.144110, 36.979133 ], [ -89.149882, 36.977636 ], [ -89.161767, 36.972768 ], [ -89.170008, 36.970298 ], [ -89.177235, 36.970885 ], [ -89.185491, 36.973518 ], [ -89.192097, 36.979995 ], [ -89.195039, 36.989768 ], [ -89.195029, 37.000051 ], [ -89.198488, 37.011723 ], [ -89.200793, 37.016164 ], [ -89.205038, 37.020047 ], [ -89.225482, 37.031077 ], [ -89.234053, 37.037277 ], [ -89.238253, 37.042853 ], [ -89.245648, 37.057783 ], [ -89.254930, 37.072014 ], [ -89.259936, 37.064071 ], [ -89.264484, 37.064814 ], [ -89.280375, 37.065224 ], [ -89.283488, 37.065811 ], [ -89.283685, 37.066736 ], [ -89.294036, 37.067345 ], [ -89.307726, 37.069654 ], [ -89.308290, 37.068371 ], [ -89.310819, 37.057897 ], [ -89.309401, 37.053769 ], [ -89.307397, 37.050432 ], [ -89.304752, 37.047565 ], [ -89.301368, 37.044982 ], [ -89.291185, 37.040408 ], [ -89.277715, 37.036140 ], [ -89.266286, 37.028683 ], [ -89.260003, 37.023288 ], [ -89.257608, 37.015496 ], [ -89.263527, 37.000050 ], [ -89.266242, 36.996302 ], [ -89.269564, 36.993401 ], [ -89.274198, 36.990495 ], [ -89.278628, 36.988670 ], [ -89.292130, 36.992189 ], [ -89.317168, 37.012767 ], [ -89.322982, 37.016090 ], [ -89.331164, 37.019936 ], [ -89.345996, 37.025521 ], [ -89.362397, 37.030156 ], [ -89.378277, 37.039605 ], [ -89.381644, 37.043010 ], [ -89.383937, 37.046441 ], [ -89.384681, 37.048251 ], [ -89.385434, 37.055130 ], [ -89.385186, 37.057748 ], [ -89.378889, 37.070499 ], [ -89.375712, 37.080505 ], [ -89.375615, 37.085936 ], [ -89.378710, 37.094586 ], [ -89.384175, 37.103267 ], [ -89.388050, 37.107481 ], [ -89.393427, 37.111197 ], [ -89.407451, 37.119307 ], [ -89.411730, 37.122507 ], [ -89.414471, 37.125050 ], [ -89.425580, 37.138235 ], [ -89.435202, 37.152090 ], [ -89.438275, 37.161287 ], [ -89.456105, 37.188120 ], [ -89.461862, 37.199517 ], [ -89.462676, 37.203351 ], [ -89.467631, 37.218200 ], [ -89.467500, 37.221844 ], [ -89.458302, 37.240368 ], [ -89.457832, 37.242594 ], [ -89.458246, 37.247066 ], [ -89.458827, 37.248661 ], [ -89.460692, 37.250577 ], [ -89.462660, 37.251520 ], [ -89.470525, 37.253357 ], [ -89.479205, 37.253052 ], [ -89.489915, 37.251315 ], [ -89.496386, 37.258474 ], [ -89.502303, 37.263738 ], [ -89.506773, 37.268537 ], [ -89.513905, 37.277164 ], [ -89.517032, 37.281920 ], [ -89.518340, 37.285497 ], [ -89.518393, 37.289354 ], [ -89.517692, 37.292040 ], [ -89.515741, 37.295362 ], [ -89.514605, 37.299323 ], [ -89.514042, 37.303776 ], [ -89.511842, 37.310825 ], [ -89.509699, 37.314260 ], [ -89.508174, 37.315662 ], [ -89.499090, 37.321490 ], [ -89.495160, 37.324795 ], [ -89.491194, 37.331361 ], [ -89.489005, 37.333368 ], [ -89.484211, 37.335646 ], [ -89.474569, 37.338165 ], [ -89.454723, 37.339283 ], [ -89.447556, 37.340475 ], [ -89.436040, 37.344441 ], [ -89.432836, 37.347056 ], [ -89.429738, 37.351956 ], [ -89.428185, 37.356158 ], [ -89.422037, 37.380530 ], [ -89.421054, 37.387668 ], [ -89.421320, 37.392077 ], [ -89.422465, 37.397132 ], [ -89.425940, 37.407471 ], [ -89.434130, 37.426847 ], [ -89.439769, 37.437200 ], [ -89.443493, 37.442129 ], [ -89.450969, 37.450069 ], [ -89.471201, 37.466473 ], [ -89.475525, 37.471388 ], [ -89.492051, 37.494008 ], [ -89.497689, 37.504948 ], [ -89.500231, 37.512954 ], [ -89.502917, 37.517870 ], [ -89.507459, 37.524322 ], [ -89.512400, 37.529810 ], [ -89.516447, 37.535558 ], [ -89.517051, 37.537278 ], [ -89.521093, 37.553805 ], [ -89.521925, 37.560735 ], [ -89.521274, 37.578971 ], [ -89.520804, 37.581155 ], [ -89.519808, 37.582748 ], [ -89.516538, 37.584504 ], [ -89.513943, 37.584815 ], [ -89.509542, 37.584147 ], [ -89.494051, 37.580116 ], [ -89.486062, 37.580853 ], [ -89.481118, 37.582973 ], [ -89.477548, 37.585885 ], [ -89.476030, 37.590226 ], [ -89.475932, 37.592998 ], [ -89.476514, 37.595554 ], [ -89.478399, 37.598869 ], [ -89.485792, 37.607157 ], [ -89.506563, 37.625050 ], [ -89.510526, 37.631755 ], [ -89.515649, 37.636446 ], [ -89.517718, 37.641217 ], [ -89.517136, 37.643789 ], [ -89.515860, 37.645555 ], [ -89.515903, 37.650803 ], [ -89.516827, 37.656089 ], [ -89.516146, 37.667975 ], [ -89.513927, 37.676575 ], [ -89.512040, 37.680985 ], [ -89.512009, 37.685525 ], [ -89.514255, 37.689923 ], [ -89.516685, 37.692762 ], [ -89.521948, 37.696475 ], [ -89.525730, 37.698441 ], [ -89.531427, 37.700334 ], [ -89.538652, 37.701054 ], [ -89.566704, 37.707189 ], [ -89.573516, 37.709065 ], [ -89.583316, 37.713261 ], [ -89.587213, 37.717510 ], [ -89.591289, 37.723599 ], [ -89.596566, 37.732886 ], [ -89.602406, 37.736492 ], [ -89.608757, 37.739684 ], [ -89.612478, 37.740036 ], [ -89.615586, 37.742350 ], [ -89.616194, 37.744283 ], [ -89.615933, 37.748184 ], [ -89.616389, 37.749167 ], [ -89.617278, 37.749720 ], [ -89.624023, 37.749120 ], [ -89.628010, 37.748135 ], [ -89.633370, 37.745782 ], [ -89.645429, 37.746108 ], [ -89.649530, 37.745498 ], [ -89.658455, 37.747710 ], [ -89.663352, 37.750052 ], [ -89.665546, 37.752095 ], [ -89.667993, 37.759484 ], [ -89.666474, 37.764195 ], [ -89.664130, 37.768510 ], [ -89.661190, 37.775732 ], [ -89.660227, 37.781032 ], [ -89.660380, 37.786296 ], [ -89.661320, 37.788204 ], [ -89.663982, 37.790801 ], [ -89.669644, 37.799922 ], [ -89.677605, 37.805066 ], [ -89.682850, 37.807789 ], [ -89.696559, 37.814337 ], [ -89.702844, 37.816812 ], [ -89.717480, 37.825724 ], [ -89.729426, 37.835081 ], [ -89.732737, 37.838507 ], [ -89.736439, 37.843494 ], [ -89.739873, 37.846930 ], [ -89.749961, 37.846984 ], [ -89.754104, 37.846358 ], [ -89.757363, 37.847613 ], [ -89.761992, 37.850657 ], [ -89.765222, 37.851782 ], [ -89.774306, 37.852123 ], [ -89.779828, 37.853896 ], [ -89.782035, 37.855092 ], [ -89.786369, 37.851734 ], [ -89.793718, 37.857054 ], [ -89.796087, 37.859505 ], [ -89.800360, 37.868625 ], [ -89.799835, 37.871367 ], [ -89.797678, 37.874202 ], [ -89.798041, 37.879655 ], [ -89.799333, 37.881517 ], [ -89.803913, 37.882985 ], [ -89.813647, 37.887710 ], [ -89.836254, 37.901802 ], [ -89.842649, 37.905196 ], [ -89.844786, 37.905572 ], [ -89.851048, 37.903980 ], [ -89.862949, 37.896906 ], [ -89.866988, 37.893519 ], [ -89.876594, 37.883294 ], [ -89.881475, 37.879591 ], [ -89.897301, 37.871605 ], [ -89.901832, 37.869822 ], [ -89.913317, 37.869641 ], [ -89.923185, 37.870672 ], [ -89.937383, 37.874693 ], [ -89.950594, 37.881526 ], [ -89.952499, 37.883218 ], [ -89.971649, 37.915260 ], [ -89.973642, 37.917661 ], [ -89.974221, 37.919217 ], [ -89.974918, 37.926719 ], [ -89.968365, 37.931456 ], [ -89.962273, 37.934363 ], [ -89.959646, 37.940196 ], [ -89.947429, 37.940336 ], [ -89.937927, 37.946193 ], [ -89.932467, 37.947497 ], [ -89.925389, 37.954130 ], [ -89.924811, 37.955823 ], [ -89.925085, 37.960021 ], [ -89.933797, 37.959143 ], [ -89.935886, 37.959581 ], [ -89.936930, 37.961042 ], [ -89.937740, 37.964994 ], [ -89.942099, 37.970121 ], [ -89.954910, 37.966647 ], [ -89.978919, 37.962791 ], [ -89.986296, 37.962198 ], [ -89.997103, 37.963225 ], [ -90.000110, 37.964563 ], [ -90.008353, 37.970179 ], [ -90.032410, 37.995258 ], [ -90.045908, 38.000052 ], [ -90.049106, 38.001715 ], [ -90.051357, 38.003584 ], [ -90.052883, 38.005907 ], [ -90.053541, 38.008440 ], [ -90.055399, 38.011953 ], [ -90.057269, 38.014362 ], [ -90.059367, 38.015543 ], [ -90.065045, 38.016875 ], [ -90.072283, 38.017001 ], [ -90.080959, 38.015428 ], [ -90.088260, 38.015772 ], [ -90.093774, 38.017833 ], [ -90.110520, 38.026547 ], [ -90.117423, 38.031708 ], [ -90.126194, 38.040702 ], [ -90.126612, 38.043981 ], [ -90.126006, 38.050570 ], [ -90.126396, 38.054897 ], [ -90.128159, 38.059644 ], [ -90.130788, 38.062341 ], [ -90.144553, 38.069023 ], [ -90.158533, 38.074735 ], [ -90.161562, 38.074890 ], [ -90.163411, 38.074347 ], [ -90.172220, 38.069636 ], [ -90.218708, 38.094365 ], [ -90.243116, 38.112669 ], [ -90.250118, 38.125054 ], [ -90.252484, 38.127571 ], [ -90.274928, 38.157615 ], [ -90.283091, 38.164447 ], [ -90.290765, 38.170453 ], [ -90.300490, 38.175246 ], [ -90.310630, 38.178572 ], [ -90.316839, 38.179456 ], [ -90.322353, 38.181593 ], [ -90.331554, 38.187580 ], [ -90.334258, 38.189932 ], [ -90.353902, 38.213855 ], [ -90.356176, 38.217501 ], [ -90.359559, 38.224525 ], [ -90.363926, 38.236355 ], [ -90.367013, 38.250054 ], [ -90.367764, 38.255807 ], [ -90.370892, 38.267441 ], [ -90.371869, 38.273926 ], [ -90.373929, 38.281853 ], [ -90.373819, 38.294454 ], [ -90.371719, 38.304354 ], [ -90.372519, 38.323354 ], [ -90.370819, 38.333554 ], [ -90.368219, 38.340254 ], [ -90.356318, 38.360354 ], [ -90.349743, 38.377609 ], [ -90.346118, 38.381853 ], [ -90.343118, 38.385453 ], [ -90.328517, 38.398153 ], [ -90.322317, 38.401753 ], [ -90.295316, 38.426753 ], [ -90.288815, 38.438453 ], [ -90.285215, 38.443453 ], [ -90.284015, 38.451053 ], [ -90.279215, 38.472453 ], [ -90.275915, 38.479553 ], [ -90.274914, 38.486253 ], [ -90.271314, 38.496052 ], [ -90.268814, 38.506152 ], [ -90.263814, 38.520552 ], [ -90.260314, 38.528352 ], [ -90.248913, 38.544752 ], [ -90.224212, 38.575051 ], [ -90.222112, 38.576451 ], [ -90.216712, 38.578751 ], [ -90.210111, 38.583951 ], [ -90.202511, 38.588651 ], [ -90.196011, 38.594451 ], [ -90.191811, 38.598951 ], [ -90.184510, 38.611551 ], [ -90.178810, 38.629150 ], [ -90.178010, 38.633750 ], [ -90.177710, 38.642750 ], [ -90.181110, 38.659550 ], [ -90.182610, 38.665350 ], [ -90.186410, 38.674750 ], [ -90.195210, 38.687550 ], [ -90.202210, 38.693450 ], [ -90.209210, 38.702750 ], [ -90.212010, 38.711750 ], [ -90.211910, 38.717950 ], [ -90.211410, 38.721350 ], [ -90.209910, 38.726050 ], [ -90.205210, 38.732150 ], [ -90.191309, 38.742949 ], [ -90.183409, 38.746849 ], [ -90.176309, 38.754449 ], [ -90.175109, 38.760249 ], [ -90.171309, 38.766549 ], [ -90.166409, 38.772649 ], [ -90.146708, 38.783049 ], [ -90.123107, 38.798048 ], [ -90.117707, 38.805748 ], [ -90.114707, 38.815048 ], [ -90.109107, 38.837448 ], [ -90.109407, 38.843548 ], [ -90.113327, 38.849306 ], [ -90.151508, 38.867148 ], [ -90.166409, 38.876348 ], [ -90.186909, 38.885048 ], [ -90.190309, 38.886248 ], [ -90.195210, 38.886748 ], [ -90.197610, 38.887648 ], [ -90.213519, 38.900454 ], [ -90.223041, 38.907389 ], [ -90.230336, 38.910860 ], [ -90.241703, 38.914828 ], [ -90.250248, 38.919344 ], [ -90.254033, 38.920489 ], [ -90.256993, 38.920763 ], [ -90.262792, 38.920344 ], [ -90.269872, 38.922556 ], [ -90.277471, 38.923716 ], [ -90.283712, 38.924048 ], [ -90.298711, 38.923395 ], [ -90.306113, 38.923525 ], [ -90.309454, 38.924120 ], [ -90.317572, 38.927912 ], [ -90.324179, 38.929827 ], [ -90.333533, 38.933489 ], [ -90.346442, 38.940790 ], [ -90.383126, 38.955453 ], [ -90.395816, 38.960037 ], [ -90.406367, 38.962554 ], [ -90.413108, 38.963330 ], [ -90.424726, 38.963785 ], [ -90.433745, 38.965526 ], [ -90.440078, 38.967364 ], [ -90.450792, 38.967764 ], [ -90.462411, 38.964322 ], [ -90.467784, 38.961809 ], [ -90.472122, 38.958838 ], [ -90.482419, 38.944460 ], [ -90.483339, 38.942133 ], [ -90.483452, 38.940436 ], [ -90.482725, 38.934712 ], [ -90.486974, 38.925982 ], [ -90.500117, 38.910408 ], [ -90.507451, 38.902767 ], [ -90.516963, 38.898818 ], [ -90.531118, 38.887078 ], [ -90.544030, 38.875050 ], [ -90.545872, 38.874008 ], [ -90.555693, 38.870785 ], [ -90.566557, 38.868847 ], [ -90.576719, 38.868336 ], [ -90.583388, 38.869030 ], [ -90.595354, 38.875050 ], [ -90.625122, 38.888654 ], [ -90.628485, 38.891617 ], [ -90.635896, 38.903941 ], [ -90.639917, 38.908272 ], [ -90.647988, 38.912106 ], [ -90.653164, 38.916141 ], [ -90.657254, 38.920270 ], [ -90.661400, 38.924989 ], [ -90.663372, 38.928042 ], [ -90.665565, 38.934179 ], [ -90.669229, 38.948176 ], [ -90.671844, 38.952296 ], [ -90.675949, 38.962140 ], [ -90.676417, 38.965812 ], [ -90.676397, 38.984096 ], [ -90.678193, 38.991851 ], [ -90.682068, 38.998778 ], [ -90.683683, 39.000049 ], [ -90.687719, 39.005374 ], [ -90.688813, 39.007342 ], [ -90.690000, 39.012169 ], [ -90.692403, 39.016656 ], [ -90.700595, 39.029074 ], [ -90.707885, 39.042262 ], [ -90.711580, 39.046798 ], [ -90.713629, 39.053977 ], [ -90.713585, 39.055567 ], [ -90.712541, 39.057064 ], [ -90.702136, 39.065568 ], [ -90.701187, 39.070408 ], [ -90.700424, 39.071787 ], [ -90.682744, 39.088348 ], [ -90.681994, 39.090066 ], [ -90.681086, 39.100590 ], [ -90.684518, 39.113567 ], [ -90.686051, 39.117785 ], [ -90.694945, 39.129680 ], [ -90.700464, 39.135439 ], [ -90.702923, 39.138749 ], [ -90.705168, 39.143152 ], [ -90.707902, 39.150860 ], [ -90.709146, 39.155111 ], [ -90.709953, 39.172924 ], [ -90.710480, 39.176366 ], [ -90.714370, 39.185308 ], [ -90.717404, 39.197414 ], [ -90.717427, 39.202791 ], [ -90.716677, 39.206723 ], [ -90.716597, 39.210414 ], [ -90.717113, 39.213912 ], [ -90.721835, 39.224108 ], [ -90.721188, 39.230176 ], [ -90.721593, 39.232730 ], [ -90.726981, 39.251173 ], [ -90.729960, 39.255894 ], [ -90.733976, 39.259098 ], [ -90.739087, 39.261893 ], [ -90.748877, 39.264126 ], [ -90.751599, 39.265432 ], [ -90.767648, 39.280025 ], [ -90.773887, 39.290544 ], [ -90.775673, 39.292811 ], [ -90.783789, 39.297164 ], [ -90.790675, 39.302908 ], [ -90.791689, 39.306957 ], [ -90.793461, 39.309498 ], [ -90.799346, 39.313087 ], [ -90.816851, 39.320496 ], [ -90.821306, 39.323659 ], [ -90.840106, 39.340438 ], [ -90.847500, 39.345272 ], [ -90.859113, 39.351370 ], [ -90.893777, 39.367343 ], [ -90.900095, 39.372354 ], [ -90.902656, 39.375366 ], [ -90.902905, 39.377534 ], [ -90.904862, 39.379403 ], [ -90.907999, 39.380812 ], [ -90.914658, 39.381956 ], [ -90.920976, 39.383687 ], [ -90.924601, 39.385136 ], [ -90.928745, 39.387544 ], [ -90.934007, 39.392127 ], [ -90.935729, 39.397331 ], [ -90.937419, 39.400803 ], [ -90.939025, 39.402744 ], [ -90.940766, 39.403984 ], [ -90.948299, 39.407502 ], [ -90.957459, 39.408996 ], [ -90.967480, 39.411948 ], [ -90.972465, 39.414144 ], [ -90.977618, 39.418290 ], [ -90.983020, 39.420462 ], [ -90.993789, 39.422959 ], [ -91.003692, 39.427603 ], [ -91.011954, 39.432661 ], [ -91.023610, 39.438694 ], [ -91.038270, 39.448436 ], [ -91.053058, 39.462122 ], [ -91.059439, 39.468860 ], [ -91.062414, 39.474122 ], [ -91.064305, 39.494643 ], [ -91.075309, 39.502845 ], [ -91.079769, 39.507728 ], [ -91.086292, 39.517141 ], [ -91.092869, 39.529275 ], [ -91.100307, 39.538695 ], [ -91.114305, 39.541098 ], [ -91.126638, 39.542227 ], [ -91.148275, 39.545798 ], [ -91.153628, 39.548248 ], [ -91.158606, 39.553048 ], [ -91.163634, 39.558566 ], [ -91.168419, 39.564928 ], [ -91.169820, 39.569555 ], [ -91.171641, 39.581899 ], [ -91.174232, 39.591975 ], [ -91.174651, 39.593313 ], [ -91.178012, 39.598196 ], [ -91.181936, 39.602677 ], [ -91.185921, 39.605119 ], [ -91.216640, 39.615124 ], [ -91.223328, 39.617603 ], [ -91.229317, 39.620853 ], [ -91.241225, 39.630067 ], [ -91.243560, 39.633064 ], [ -91.245914, 39.637311 ], [ -91.248779, 39.640880 ], [ -91.260475, 39.649024 ], [ -91.266765, 39.656993 ], [ -91.276140, 39.665759 ], [ -91.283329, 39.670134 ], [ -91.293788, 39.674766 ], [ -91.302485, 39.679631 ], [ -91.305348, 39.683957 ], [ -91.317814, 39.692591 ], [ -91.331603, 39.700433 ], [ -91.345300, 39.709402 ], [ -91.352749, 39.715279 ], [ -91.367753, 39.729029 ], [ -91.370009, 39.732524 ], [ -91.369953, 39.745042 ], [ -91.367406, 39.753880 ], [ -91.366047, 39.755955 ], [ -91.365125, 39.758723 ], [ -91.365906, 39.764956 ], [ -91.365694, 39.774910 ], [ -91.364848, 39.779388 ], [ -91.361744, 39.785079 ], [ -91.361571, 39.787548 ], [ -91.363444, 39.792804 ], [ -91.367966, 39.800403 ], [ -91.375148, 39.808860 ], [ -91.377971, 39.811273 ], [ -91.385773, 39.815553 ], [ -91.397853, 39.821122 ], [ -91.406223, 39.826472 ], [ -91.414513, 39.829984 ], [ -91.429519, 39.837801 ], [ -91.432919, 39.840554 ], [ -91.436051, 39.845510 ], [ -91.446385, 39.870394 ], [ -91.447844, 39.877951 ], [ -91.446922, 39.883034 ], [ -91.443513, 39.893583 ], [ -91.428956, 39.907729 ], [ -91.420878, 39.914865 ], [ -91.419880, 39.916533 ], [ -91.418807, 39.922126 ], [ -91.419360, 39.927717 ], [ -91.421832, 39.932973 ], [ -91.425782, 39.937765 ], [ -91.429055, 39.940741 ], [ -91.437090, 39.946417 ], [ -91.441560, 39.951299 ], [ -91.447236, 39.959502 ], [ -91.449806, 39.965278 ], [ -91.454647, 39.971306 ], [ -91.458852, 39.979015 ], [ -91.459533, 39.979892 ], [ -91.463683, 39.981845 ], [ -91.465315, 39.983995 ], [ -91.466682, 39.987253 ], [ -91.467294, 39.990631 ], [ -91.469247, 39.995327 ], [ -91.477298, 40.008993 ], [ -91.484064, 40.019332 ], [ -91.487351, 40.023201 ], [ -91.494878, 40.036453 ], [ -91.489606, 40.057435 ], [ -91.495365, 40.070951 ], [ -91.497663, 40.078257 ], [ -91.500823, 40.090956 ], [ -91.506006, 40.108126 ], [ -91.509245, 40.121876 ], [ -91.510322, 40.127994 ], [ -91.511749, 40.147091 ], [ -91.511590, 40.149269 ], [ -91.508324, 40.156326 ], [ -91.508224, 40.157665 ], [ -91.511956, 40.170441 ], [ -91.513079, 40.178537 ], [ -91.512974, 40.181062 ], [ -91.511073, 40.188794 ], [ -91.509551, 40.191338 ], [ -91.505495, 40.195606 ], [ -91.504477, 40.198262 ], [ -91.506664, 40.204758 ], [ -91.507269, 40.209338 ], [ -91.506947, 40.215550 ], [ -91.504282, 40.224299 ], [ -91.504289, 40.231712 ], [ -91.505968, 40.234305 ], [ -91.506501, 40.236304 ], [ -91.505828, 40.238839 ], [ -91.503231, 40.243474 ], [ -91.500855, 40.245722 ], [ -91.498104, 40.247422 ], [ -91.490524, 40.259498 ], [ -91.489969, 40.262340 ], [ -91.490525, 40.264814 ], [ -91.492891, 40.269923 ], [ -91.493061, 40.275262 ], [ -91.492727, 40.278217 ], [ -91.489868, 40.286048 ], [ -91.486078, 40.293426 ], [ -91.471826, 40.317340 ], [ -91.469656, 40.322409 ], [ -91.466603, 40.334461 ], [ -91.462140, 40.342414 ], [ -91.452237, 40.353670 ], [ -91.447835, 40.359129 ], [ -91.446308, 40.361823 ], [ -91.444833, 40.363170 ], [ -91.439342, 40.366569 ], [ -91.429442, 40.370386 ], [ -91.426632, 40.371988 ], [ -91.419422, 40.378264 ], [ -91.415695, 40.381381 ], [ -91.413011, 40.382277 ], [ -91.396996, 40.383127 ], [ -91.388360, 40.384929 ], [ -91.381958, 40.387632 ], [ -91.378422, 40.389670 ], [ -91.375746, 40.391879 ], [ -91.372921, 40.399108 ], [ -91.372554, 40.401200 ], [ -91.372450, 40.411475 ], [ -91.373721, 40.417891 ], [ -91.377625, 40.426335 ], [ -91.380965, 40.435395 ], [ -91.381769, 40.442555 ], [ -91.381468, 40.446040 ], [ -91.379907, 40.452110 ], [ -91.378144, 40.456394 ], [ -91.368074, 40.474642 ], [ -91.364915, 40.484168 ], [ -91.363910, 40.490122 ], [ -91.363683, 40.494211 ], [ -91.364211, 40.500043 ], [ -91.367876, 40.510479 ], [ -91.369059, 40.512532 ], [ -91.381857, 40.528247 ], [ -91.384531, 40.530948 ], [ -91.388067, 40.533069 ], [ -91.394475, 40.534543 ], [ -91.400725, 40.536789 ], [ -91.404125, 40.539127 ], [ -91.406202, 40.542698 ], [ -91.406851, 40.547557 ], [ -91.406373, 40.551831 ], [ -91.405241, 40.554641 ], [ -91.401482, 40.559458 ], [ -91.379752, 40.574450 ], [ -91.374252, 40.582590 ], [ -91.359873, 40.601805 ], [ -91.353989, 40.606553 ], [ -91.348733, 40.609695 ], [ -91.339719, 40.613488 ], [ -91.306524, 40.626231 ], [ -91.276175, 40.632240 ], [ -91.264953, 40.633893 ], [ -91.258249, 40.636672 ], [ -91.253074, 40.637962 ], [ -91.247851, 40.638390 ], [ -91.218437, 40.638437 ], [ -91.197906, 40.636107 ], [ -91.186980, 40.637297 ], [ -91.154293, 40.653596 ], [ -91.138055, 40.660893 ], [ -91.123928, 40.669152 ], [ -91.122421, 40.670675 ], [ -91.120820, 40.672777 ], [ -91.119632, 40.675892 ], [ -91.115407, 40.691825 ], [ -91.111940, 40.697018 ], [ -91.110927, 40.703262 ], [ -91.111095, 40.708282 ], [ -91.113885, 40.719532 ], [ -91.115158, 40.721895 ], [ -91.115735, 40.725168 ], [ -91.110424, 40.745528 ], [ -91.108200, 40.750935 ], [ -91.102486, 40.757076 ], [ -91.098105, 40.763233 ], [ -91.096133, 40.767134 ], [ -91.091703, 40.779708 ], [ -91.091246, 40.786724 ], [ -91.092256, 40.792909 ], [ -91.097031, 40.802471 ], [ -91.097649, 40.805575 ], [ -91.096846, 40.811617 ], [ -91.092993, 40.821079 ], [ -91.090072, 40.824638 ], [ -91.077521, 40.833405 ], [ -91.067159, 40.841997 ], [ -91.058749, 40.846309 ], [ -91.056430, 40.848387 ], [ -91.050241, 40.858514 ], [ -91.047344, 40.864654 ], [ -91.044653, 40.868356 ], [ -91.039097, 40.873565 ], [ -91.036789, 40.875038 ], [ -91.027489, 40.879173 ], [ -91.021562, 40.884021 ], [ -91.013240, 40.896622 ], [ -91.009536, 40.900565 ], [ -91.003536, 40.905146 ], [ -90.998500, 40.908120 ], [ -90.985462, 40.912141 ], [ -90.979190, 40.915522 ], [ -90.968995, 40.919127 ], [ -90.965344, 40.921633 ], [ -90.962916, 40.924957 ], [ -90.960462, 40.936356 ], [ -90.952233, 40.954047 ], [ -90.951967, 40.958238 ], [ -90.952715, 40.962087 ], [ -90.955111, 40.969858 ], [ -90.958089, 40.976643 ], [ -90.958142, 40.979767 ], [ -90.955201, 40.986805 ], [ -90.949634, 40.995248 ], [ -90.945949, 41.006495 ], [ -90.945054, 41.011917 ], [ -90.945324, 41.019279 ], [ -90.942253, 41.034702 ], [ -90.942320, 41.038472 ], [ -90.943652, 41.048637 ], [ -90.944577, 41.052255 ], [ -90.945549, 41.061730 ], [ -90.949136, 41.070611 ], [ -90.949383, 41.072711 ], [ -90.948207, 41.084413 ], [ -90.946259, 41.094734 ], [ -90.946627, 41.096632 ], [ -90.957246, 41.111085 ], [ -90.965905, 41.119559 ], [ -90.970851, 41.130107 ], [ -90.981311, 41.142659 ], [ -90.989663, 41.155716 ], [ -90.994960, 41.160624 ], [ -90.997906, 41.162564 ], [ -91.007586, 41.166183 ], [ -91.012557, 41.165922 ], [ -91.027214, 41.163373 ], [ -91.030029, 41.163540 ], [ -91.041536, 41.166138 ], [ -91.055069, 41.185766 ], [ -91.065899, 41.199517 ], [ -91.072980, 41.207151 ], [ -91.081445, 41.214429 ], [ -91.093018, 41.222635 ], [ -91.100829, 41.230532 ], [ -91.109562, 41.236567 ], [ -91.112333, 41.239003 ], [ -91.113648, 41.241401 ], [ -91.114186, 41.250029 ], [ -91.110304, 41.256088 ], [ -91.104462, 41.262104 ], [ -91.101142, 41.267169 ], [ -91.092034, 41.286911 ], [ -91.086880, 41.294371 ], [ -91.077505, 41.301828 ], [ -91.074841, 41.305578 ], [ -91.073233, 41.313440 ], [ -91.071552, 41.339651 ], [ -91.066520, 41.365246 ], [ -91.065058, 41.369101 ], [ -91.051580, 41.385283 ], [ -91.051010, 41.387556 ], [ -91.050328, 41.400049 ], [ -91.047819, 41.410900 ], [ -91.045890, 41.414085 ], [ -91.043988, 41.415897 ], [ -91.039872, 41.418523 ], [ -91.037131, 41.420017 ], [ -91.027787, 41.423603 ], [ -91.011980, 41.425024 ], [ -91.005846, 41.426135 ], [ -90.984898, 41.433869 ], [ -90.979815, 41.434321 ], [ -90.975168, 41.433985 ], [ -90.966662, 41.430051 ], [ -90.953198, 41.425075 ], [ -90.949791, 41.424163 ], [ -90.930016, 41.421404 ], [ -90.924343, 41.422860 ], [ -90.919351, 41.425589 ], [ -90.900471, 41.431154 ], [ -90.890787, 41.435432 ], [ -90.879778, 41.441065 ], [ -90.867282, 41.448215 ], [ -90.857554, 41.452751 ], [ -90.853604, 41.453909 ], [ -90.846558, 41.455141 ], [ -90.837414, 41.455623 ], [ -90.824736, 41.454467 ], [ -90.807283, 41.454466 ], [ -90.786282, 41.452888 ], [ -90.777583, 41.451261 ], [ -90.771672, 41.450761 ], [ -90.750142, 41.449632 ], [ -90.737537, 41.450127 ], [ -90.723545, 41.452248 ], [ -90.701159, 41.454743 ], [ -90.690951, 41.456643 ], [ -90.676439, 41.460832 ], [ -90.666239, 41.460632 ], [ -90.655839, 41.462132 ], [ -90.650238, 41.465032 ], [ -90.640238, 41.473332 ], [ -90.632538, 41.478732 ], [ -90.618537, 41.485032 ], [ -90.605937, 41.494232 ], [ -90.604237, 41.497032 ], [ -90.602137, 41.506032 ], [ -90.595237, 41.511032 ], [ -90.591037, 41.512832 ], [ -90.582036, 41.515132 ], [ -90.571136, 41.516332 ], [ -90.567236, 41.517532 ], [ -90.556235, 41.524232 ], [ -90.540935, 41.526133 ], [ -90.533035, 41.524933 ], [ -90.513134, 41.519533 ], [ -90.500633, 41.518033 ], [ -90.489933, 41.518233 ], [ -90.474332, 41.519733 ], [ -90.461432, 41.523533 ], [ -90.445231, 41.536133 ], [ -90.438431, 41.544133 ], [ -90.432731, 41.549533 ], [ -90.427231, 41.551533 ], [ -90.422230, 41.554233 ], [ -90.415830, 41.562933 ], [ -90.412830, 41.565333 ], [ -90.397930, 41.572233 ], [ -90.381329, 41.576633 ], [ -90.364128, 41.579633 ], [ -90.343228, 41.587833 ], [ -90.341528, 41.590633 ], [ -90.339528, 41.598633 ], [ -90.343330, 41.640855 ], [ -90.343452, 41.646959 ], [ -90.336729, 41.664532 ], [ -90.334525, 41.679559 ], [ -90.332481, 41.682146 ], [ -90.330222, 41.683954 ], [ -90.319924, 41.689721 ], [ -90.317315, 41.691670 ], [ -90.314687, 41.694830 ], [ -90.313435, 41.698082 ], [ -90.312770, 41.702426 ], [ -90.312893, 41.707528 ], [ -90.313320, 41.709494 ], [ -90.317421, 41.718333 ], [ -90.317668, 41.722690 ], [ -90.315220, 41.734264 ], [ -90.310708, 41.742214 ], [ -90.302782, 41.750031 ], [ -90.278633, 41.767358 ], [ -90.263286, 41.772112 ], [ -90.258622, 41.775295 ], [ -90.248631, 41.779805 ], [ -90.222263, 41.793133 ], [ -90.216889, 41.795335 ], [ -90.187969, 41.803163 ], [ -90.181973, 41.807070 ], [ -90.180954, 41.809354 ], [ -90.180643, 41.811979 ], [ -90.181720, 41.822599 ], [ -90.183973, 41.833070 ], [ -90.183765, 41.836240 ], [ -90.181901, 41.843216 ], [ -90.181401, 41.844647 ], [ -90.175051, 41.853629 ], [ -90.173006, 41.857402 ], [ -90.172765, 41.866149 ], [ -90.170041, 41.876439 ], [ -90.165065, 41.883777 ], [ -90.157019, 41.898019 ], [ -90.153584, 41.906614 ], [ -90.153362, 41.915593 ], [ -90.151600, 41.931002 ], [ -90.152659, 41.933058 ], [ -90.156902, 41.938181 ], [ -90.160648, 41.940845 ], [ -90.163847, 41.944934 ], [ -90.164939, 41.948861 ], [ -90.164135, 41.956178 ], [ -90.162141, 41.961293 ], [ -90.153834, 41.974116 ], [ -90.148599, 41.978269 ], [ -90.146225, 41.981329 ], [ -90.146033, 41.988139 ], [ -90.140613, 41.995999 ], [ -90.140061, 42.003252 ], [ -90.141167, 42.008931 ], [ -90.143776, 42.014881 ], [ -90.148096, 42.020014 ], [ -90.149112, 42.022679 ], [ -90.149733, 42.026564 ], [ -90.150916, 42.029440 ], [ -90.151579, 42.030633 ], [ -90.154221, 42.033073 ], [ -90.158829, 42.037769 ], [ -90.163446, 42.040407 ], [ -90.164485, 42.042105 ], [ -90.165294, 42.050973 ], [ -90.165555, 42.062638 ], [ -90.168358, 42.075779 ], [ -90.163405, 42.087613 ], [ -90.161504, 42.098912 ], [ -90.161159, 42.106372 ], [ -90.161884, 42.113780 ], [ -90.162895, 42.116718 ], [ -90.167533, 42.122475 ], [ -90.170970, 42.125198 ], [ -90.187474, 42.125423 ], [ -90.190452, 42.125779 ], [ -90.197342, 42.128163 ], [ -90.201404, 42.130937 ], [ -90.205360, 42.139079 ], [ -90.206369, 42.145500 ], [ -90.207421, 42.149109 ], [ -90.209479, 42.152680 ], [ -90.216107, 42.156730 ], [ -90.224244, 42.160028 ], [ -90.234919, 42.165431 ], [ -90.250129, 42.171469 ], [ -90.255456, 42.171821 ], [ -90.269080, 42.174500 ], [ -90.282173, 42.178846 ], [ -90.298442, 42.187576 ], [ -90.317774, 42.193789 ], [ -90.328273, 42.201047 ], [ -90.338169, 42.203321 ], [ -90.356964, 42.205445 ], [ -90.365138, 42.210526 ], [ -90.375129, 42.214811 ], [ -90.391108, 42.225473 ], [ -90.394749, 42.229059 ], [ -90.395883, 42.233133 ], [ -90.400653, 42.239293 ], [ -90.410471, 42.247749 ], [ -90.416315, 42.251679 ], [ -90.419326, 42.254467 ], [ -90.422181, 42.259899 ], [ -90.424098, 42.266364 ], [ -90.430884, 42.278230 ], [ -90.430735, 42.284211 ], [ -90.426909, 42.290719 ], [ -90.424326, 42.293326 ], [ -90.420454, 42.305374 ], [ -90.420300, 42.311690 ], [ -90.421047, 42.316109 ], [ -90.420075, 42.317681 ], [ -90.417125, 42.319943 ], [ -90.416200, 42.321314 ], [ -90.415937, 42.322699 ], [ -90.416535, 42.325109 ], [ -90.419027, 42.328505 ], [ -90.421350, 42.330472 ], [ -90.425363, 42.332615 ], [ -90.430546, 42.336860 ], [ -90.443874, 42.355218 ], [ -90.446320, 42.357041 ], [ -90.452724, 42.359303 ], [ -90.462619, 42.367253 ], [ -90.464788, 42.369452 ], [ -90.470273, 42.378355 ], [ -90.474121, 42.381729 ], [ -90.477279, 42.383794 ], [ -90.480148, 42.384616 ], [ -90.484621, 42.384530 ], [ -90.487154, 42.385141 ], [ -90.490334, 42.387093 ], [ -90.495766, 42.392406 ], [ -90.500128, 42.395539 ], [ -90.506829, 42.398792 ], [ -90.517516, 42.403019 ], [ -90.548068, 42.413115 ], [ -90.555018, 42.416138 ], [ -90.557550, 42.419258 ], [ -90.558168, 42.420984 ], [ -90.558801, 42.428517 ], [ -90.560439, 42.432897 ], [ -90.565248, 42.438742 ], [ -90.567968, 42.440389 ], [ -90.570736, 42.441701 ], [ -90.582128, 42.444437 ], [ -90.590416, 42.447493 ], [ -90.606328, 42.451505 ], [ -90.624328, 42.458904 ], [ -90.646727, 42.471904 ], [ -90.654027, 42.478503 ], [ -90.656327, 42.483603 ], [ -90.656527, 42.489203 ], [ -90.655927, 42.491703 ], [ -90.648627, 42.498102 ], [ -90.640927, 42.508302 ], [ -90.617731, 42.508077 ], [ -90.614589, 42.508053 ], [ -90.565441, 42.507600 ], [ -90.555862, 42.507509 ], [ -90.551165, 42.507691 ], [ -90.544799, 42.507713 ], [ -90.544347, 42.507707 ], [ -90.532254, 42.507573 ], [ -90.491716, 42.507624 ], [ -90.479446, 42.507416 ], [ -90.474955, 42.507484 ], [ -90.437011, 42.507147 ], [ -90.405927, 42.506891 ], [ -90.370673, 42.507111 ], [ -90.367874, 42.507114 ], [ -90.362652, 42.507048 ], [ -90.303823, 42.507469 ], [ -90.272864, 42.507531 ], [ -90.269335, 42.507726 ], [ -90.267143, 42.507642 ], [ -90.253121, 42.507340 ], [ -90.250622, 42.507521 ], [ -90.223190, 42.507765 ], [ -90.206073, 42.507747 ], [ -90.181572, 42.508068 ], [ -90.164363, 42.508272 ], [ -90.142922, 42.508151 ], [ -90.095004, 42.507885 ], [ -90.093026, 42.508160 ], [ -90.073670, 42.508275 ], [ -90.018665, 42.507288 ], [ -90.017028, 42.507127 ], [ -89.999314, 42.506914 ], [ -89.997213, 42.506755 ], [ -89.985645, 42.506431 ], [ -89.985072, 42.506464 ], [ -89.955291, 42.505626 ], [ -89.926484, 42.505787 ], [ -89.926374, 42.505788 ], [ -89.801897, 42.505444 ], [ -89.799704, 42.505421 ], [ -89.793957, 42.505466 ], [ -89.780302, 42.505349 ], [ -89.769643, 42.505322 ], [ -89.742395, 42.505382 ], [ -89.693487, 42.505099 ], [ -89.690088, 42.505191 ], [ -89.667596, 42.504960 ], [ -89.650324, 42.504613 ], [ -89.644176, 42.504520 ], [ -89.613410, 42.503942 ], [ -89.603523, 42.503557 ], [ -89.600001, 42.503672 ], [ -89.594779, 42.503468 ], [ -89.564407, 42.502628 ], [ -89.522542, 42.501889 ], [ -89.493216, 42.501514 ], [ -89.492612, 42.501514 ], [ -89.484300, 42.501426 ], [ -89.425162, 42.500726 ], [ -89.423926, 42.500818 ], [ -89.422567, 42.500680 ], [ -89.420991, 42.500589 ], [ -89.401432, 42.500433 ], [ -89.366031, 42.500274 ], [ -89.361561, 42.500012 ], [ -89.290896, 42.498853 ], [ -89.250759, 42.497994 ], [ -89.246972, 42.498130 ], [ -89.228279, 42.498047 ], [ -89.226270, 42.497957 ], [ -89.166728, 42.497256 ], [ -89.164905, 42.497347 ], [ -89.125111, 42.496957 ], [ -89.120365, 42.496992 ], [ -89.116949, 42.496910 ], [ -89.099012, 42.496499 ], [ -89.071141, 42.496208 ], [ -89.042898, 42.496255 ], [ -89.013804, 42.496097 ], [ -89.013667, 42.496087 ], [ -88.992659, 42.496025 ], [ -88.943264, 42.495114 ], [ -88.940391, 42.495046 ], [ -88.786681, 42.491983 ], [ -88.765360, 42.492068 ], [ -88.707380, 42.493587 ], [ -88.638653, 42.495043 ], [ -88.506912, 42.494883 ], [ -88.461397, 42.494618 ], [ -88.417396, 42.494618 ], [ -88.271691, 42.494818 ], [ -88.250090, 42.495823 ], [ -88.216900, 42.495923 ], [ -88.200172, 42.496016 ], [ -88.115285, 42.496219 ], [ -88.049782, 42.495319 ], [ -87.990180, 42.494519 ], [ -87.971279, 42.494019 ], [ -87.900242, 42.493020 ], [ -87.843594, 42.492307 ], [ -87.815872, 42.491920 ], [ -87.800477, 42.491920 ], [ -87.798071, 42.471721 ], [ -87.803370, 42.420621 ], [ -87.805370, 42.384721 ], [ -87.816570, 42.364621 ], [ -87.820858, 42.361584 ], [ -87.830986, 42.330317 ], [ -87.834769, 42.301522 ], [ -87.828569, 42.269922 ], [ -87.812267, 42.231823 ], [ -87.800066, 42.208024 ], [ -87.741662, 42.128227 ], [ -87.724661, 42.107727 ], [ -87.710960, 42.095328 ], [ -87.682359, 42.075729 ], [ -87.671462, 42.058334 ], [ -87.670512, 42.052980 ], [ -87.671894, 42.047972 ], [ -87.668982, 42.029142 ], [ -87.630953, 41.933132 ], [ -87.624052, 41.904232 ], [ -87.622944, 41.902020 ], [ -87.619852, 41.901392 ], [ -87.617433, 41.898032 ], [ -87.614163, 41.893418 ], [ -87.612291, 41.893335 ], [ -87.611659, 41.892216 ], [ -87.611659, 41.890708 ], [ -87.612680, 41.889248 ], [ -87.614188, 41.888421 ], [ -87.613556, 41.884480 ], [ -87.616537, 41.882396 ], [ -87.616251, 41.868933 ], [ -87.609450, 41.845233 ], [ -87.600549, 41.826833 ], [ -87.580948, 41.804334 ], [ -87.576347, 41.786034 ], [ -87.560646, 41.766034 ], [ -87.542845, 41.752135 ], [ -87.530745, 41.748235 ], [ -87.524141, 41.723990 ], [ -87.524044, 41.708335 ], [ -87.524944, 41.702635 ], [ -87.524844, 41.691635 ], [ -87.524642, 41.634935 ], [ -87.524742, 41.632435 ], [ -87.524642, 41.622535 ], [ -87.524641, 41.563335 ], [ -87.525041, 41.559235 ], [ -87.524940, 41.529735 ], [ -87.525671, 41.470115 ], [ -87.525623, 41.453619 ], [ -87.525350, 41.380851 ], [ -87.526404, 41.355812 ], [ -87.526768, 41.298177 ], [ -87.526567, 41.163865 ], [ -87.526660, 41.160090 ], [ -87.526719, 41.159448 ], [ -87.526693, 41.153958 ], [ -87.526696, 41.149222 ], [ -87.526700, 41.139658 ], [ -87.526711, 41.121485 ], [ -87.526520, 41.024837 ], [ -87.526346, 41.010583 ], [ -87.526305, 41.010346 ], [ -87.526084, 40.911914 ], [ -87.526014, 40.895582 ], [ -87.526437, 40.894209 ], [ -87.525962, 40.880618 ], [ -87.526113, 40.879703 ], [ -87.525783, 40.854357 ], [ -87.526129, 40.736950 ], [ -87.526292, 40.535409 ], [ -87.526352, 40.535111 ], [ -87.526376, 40.491574 ], [ -87.526502, 40.477158 ], [ -87.526549, 40.475659 ], [ -87.526809, 40.462170 ], [ -87.530054, 40.250671 ], [ -87.529992, 40.250036 ], [ -87.530828, 40.191812 ], [ -87.531133, 40.170030 ], [ -87.531439, 40.148027 ], [ -87.531759, 40.144273 ], [ -87.531561, 40.133005 ], [ -87.532308, 40.011587 ], [ -87.532308, 40.011492 ], [ -87.532287, 40.000037 ], [ -87.532331, 39.997776 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US18", "STATE": "18", "NAME": "Indiana", "LSAD": "", "CENSUSAREA": 35826.109000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -88.028030, 37.799224 ], [ -88.029382, 37.803601 ], [ -88.039105, 37.805789 ], [ -88.045939, 37.807481 ], [ -88.049528, 37.811070 ], [ -88.051771, 37.813761 ], [ -88.051771, 37.817799 ], [ -88.050425, 37.822285 ], [ -88.049079, 37.826322 ], [ -88.044145, 37.830808 ], [ -88.043247, 37.836639 ], [ -88.044593, 37.840677 ], [ -88.048630, 37.843817 ], [ -88.053116, 37.847854 ], [ -88.056705, 37.855480 ], [ -88.058499, 37.865349 ], [ -88.056705, 37.872078 ], [ -88.054462, 37.877461 ], [ -88.050425, 37.882844 ], [ -88.043247, 37.887330 ], [ -88.033378, 37.894059 ], [ -88.031584, 37.901685 ], [ -88.037416, 37.913348 ], [ -88.044145, 37.926805 ], [ -88.036124, 37.942746 ], [ -88.012929, 37.966544 ], [ -88.012574, 37.977062 ], [ -88.025831, 38.007245 ], [ -88.029790, 38.025046 ], [ -88.025304, 38.038055 ], [ -88.020369, 38.046578 ], [ -88.009603, 38.049270 ], [ -87.990314, 38.056447 ], [ -87.984931, 38.069008 ], [ -87.986725, 38.076185 ], [ -87.994800, 38.083362 ], [ -87.998389, 38.090091 ], [ -87.999734, 38.100857 ], [ -87.990763, 38.110726 ], [ -87.974272, 38.121981 ], [ -87.945472, 38.126616 ], [ -87.921680, 38.148407 ], [ -87.922577, 38.160071 ], [ -87.928858, 38.168594 ], [ -87.937162, 38.172189 ], [ -87.959500, 38.184376 ], [ -87.975819, 38.197834 ], [ -87.984234, 38.209960 ], [ -87.982688, 38.221527 ], [ -87.979548, 38.228256 ], [ -87.975511, 38.232742 ], [ -87.968968, 38.237389 ], [ -87.960225, 38.237118 ], [ -87.950838, 38.247097 ], [ -87.945904, 38.256966 ], [ -87.951277, 38.268750 ], [ -87.952125, 38.273763 ], [ -87.938727, 38.289264 ], [ -87.928858, 38.292404 ], [ -87.921680, 38.289712 ], [ -87.916746, 38.284778 ], [ -87.913606, 38.276703 ], [ -87.908223, 38.274012 ], [ -87.898802, 38.276255 ], [ -87.887849, 38.285299 ], [ -87.883102, 38.293301 ], [ -87.880410, 38.299581 ], [ -87.875476, 38.301376 ], [ -87.868747, 38.299133 ], [ -87.860224, 38.291507 ], [ -87.853046, 38.289264 ], [ -87.844972, 38.290610 ], [ -87.838243, 38.293750 ], [ -87.833757, 38.299133 ], [ -87.831972, 38.307241 ], [ -87.832723, 38.324853 ], [ -87.822721, 38.346912 ], [ -87.806075, 38.363143 ], [ -87.779996, 38.370842 ], [ -87.745254, 38.408996 ], [ -87.741040, 38.435576 ], [ -87.730699, 38.442908 ], [ -87.730134, 38.446518 ], [ -87.735729, 38.452986 ], [ -87.743170, 38.459019 ], [ -87.743535, 38.467774 ], [ -87.739522, 38.475069 ], [ -87.730768, 38.478717 ], [ -87.714047, 38.479880 ], [ -87.693188, 38.488038 ], [ -87.678374, 38.498438 ], [ -87.663701, 38.502931 ], [ -87.657084, 38.507169 ], [ -87.654166, 38.511911 ], [ -87.653802, 38.517382 ], [ -87.655780, 38.521206 ], [ -87.660732, 38.541092 ], [ -87.650704, 38.556240 ], [ -87.651529, 38.568166 ], [ -87.637752, 38.588512 ], [ -87.629362, 38.589971 ], [ -87.626444, 38.591066 ], [ -87.623890, 38.593984 ], [ -87.624143, 38.596955 ], [ -87.627348, 38.605440 ], [ -87.622375, 38.618873 ], [ -87.620120, 38.639489 ], [ -87.593678, 38.667402 ], [ -87.545538, 38.677613 ], [ -87.531231, 38.684036 ], [ -87.519609, 38.697198 ], [ -87.516707, 38.716333 ], [ -87.496494, 38.742728 ], [ -87.498948, 38.757774 ], [ -87.496537, 38.778571 ], [ -87.527342, 38.818121 ], [ -87.521681, 38.826576 ], [ -87.525893, 38.848795 ], [ -87.550515, 38.859560 ], [ -87.553384, 38.863344 ], [ -87.547370, 38.875614 ], [ -87.544089, 38.895093 ], [ -87.527645, 38.907688 ], [ -87.518826, 38.923205 ], [ -87.512187, 38.954417 ], [ -87.529496, 38.971925 ], [ -87.578319, 38.988786 ], [ -87.579117, 39.001607 ], [ -87.569696, 39.019413 ], [ -87.575027, 39.034062 ], [ -87.572588, 39.057286 ], [ -87.596373, 39.079639 ], [ -87.608517, 39.082445 ], [ -87.613513, 39.085568 ], [ -87.616636, 39.089940 ], [ -87.617260, 39.096186 ], [ -87.619134, 39.100557 ], [ -87.625379, 39.101806 ], [ -87.630376, 39.104305 ], [ -87.632249, 39.106803 ], [ -87.632874, 39.110550 ], [ -87.632874, 39.114297 ], [ -87.632245, 39.118702 ], [ -87.643145, 39.128562 ], [ -87.645990, 39.144900 ], [ -87.640435, 39.166727 ], [ -87.620796, 39.174790 ], [ -87.588614, 39.197824 ], [ -87.577029, 39.211123 ], [ -87.574558, 39.218404 ], [ -87.579163, 39.232962 ], [ -87.583535, 39.243579 ], [ -87.593486, 39.247452 ], [ -87.605543, 39.261122 ], [ -87.610050, 39.282232 ], [ -87.597545, 39.296388 ], [ -87.597946, 39.299479 ], [ -87.600397, 39.312904 ], [ -87.589084, 39.333831 ], [ -87.578331, 39.340343 ], [ -87.554400, 39.340488 ], [ -87.544013, 39.352907 ], [ -87.531646, 39.347888 ], [ -87.531355, 39.436656 ], [ -87.531355, 39.437732 ], [ -87.531489, 39.449474 ], [ -87.531608, 39.466225 ], [ -87.531624, 39.469378 ], [ -87.531663, 39.477120 ], [ -87.531627, 39.491698 ], [ -87.531692, 39.495516 ], [ -87.531965, 39.526937 ], [ -87.531939, 39.545853 ], [ -87.532008, 39.564013 ], [ -87.532365, 39.646126 ], [ -87.532444, 39.646102 ], [ -87.532703, 39.664868 ], [ -87.533066, 39.781743 ], [ -87.533058, 39.796243 ], [ -87.533056, 39.803922 ], [ -87.533142, 39.810947 ], [ -87.533227, 39.883127 ], [ -87.532776, 39.971077 ], [ -87.532790, 39.975010 ], [ -87.532683, 39.977691 ], [ -87.532542, 39.987462 ], [ -87.532331, 39.997776 ], [ -87.532287, 40.000037 ], [ -87.532308, 40.011492 ], [ -87.532308, 40.011587 ], [ -87.531561, 40.133005 ], [ -87.531759, 40.144273 ], [ -87.531439, 40.148027 ], [ -87.531133, 40.170030 ], [ -87.530828, 40.191812 ], [ -87.529992, 40.250036 ], [ -87.530054, 40.250671 ], [ -87.526809, 40.462170 ], [ -87.526549, 40.475659 ], [ -87.526502, 40.477158 ], [ -87.526376, 40.491574 ], [ -87.526352, 40.535111 ], [ -87.526292, 40.535409 ], [ -87.526129, 40.736950 ], [ -87.525783, 40.854357 ], [ -87.526113, 40.879703 ], [ -87.525962, 40.880618 ], [ -87.526437, 40.894209 ], [ -87.526014, 40.895582 ], [ -87.526084, 40.911914 ], [ -87.526305, 41.010346 ], [ -87.526346, 41.010583 ], [ -87.526520, 41.024837 ], [ -87.526711, 41.121485 ], [ -87.526700, 41.139658 ], [ -87.526696, 41.149222 ], [ -87.526693, 41.153958 ], [ -87.526719, 41.159448 ], [ -87.526660, 41.160090 ], [ -87.526567, 41.163865 ], [ -87.526768, 41.298177 ], [ -87.526404, 41.355812 ], [ -87.525350, 41.380851 ], [ -87.525623, 41.453619 ], [ -87.525671, 41.470115 ], [ -87.524940, 41.529735 ], [ -87.525041, 41.559235 ], [ -87.524641, 41.563335 ], [ -87.524642, 41.622535 ], [ -87.524742, 41.632435 ], [ -87.524642, 41.634935 ], [ -87.524844, 41.691635 ], [ -87.524944, 41.702635 ], [ -87.524044, 41.708335 ], [ -87.520544, 41.709935 ], [ -87.515243, 41.704235 ], [ -87.511043, 41.696535 ], [ -87.505343, 41.691535 ], [ -87.470742, 41.672835 ], [ -87.448794, 41.683807 ], [ -87.420610, 41.691368 ], [ -87.399300, 41.677620 ], [ -87.433103, 41.649012 ], [ -87.429840, 41.646035 ], [ -87.423440, 41.642835 ], [ -87.394539, 41.637235 ], [ -87.365439, 41.629536 ], [ -87.324338, 41.623036 ], [ -87.287637, 41.622236 ], [ -87.278437, 41.619736 ], [ -87.261536, 41.620336 ], [ -87.220660, 41.624356 ], [ -87.187651, 41.629653 ], [ -87.160625, 41.637266 ], [ -87.160784, 41.645385 ], [ -87.125835, 41.650302 ], [ -87.120322, 41.645701 ], [ -87.066033, 41.661845 ], [ -87.027888, 41.674661 ], [ -86.934830, 41.709638 ], [ -86.909130, 41.726938 ], [ -86.875429, 41.737939 ], [ -86.824828, 41.760240 ], [ -86.823628, 41.760240 ], [ -86.804427, 41.760240 ], [ -86.801578, 41.760240 ], [ -86.800707, 41.760240 ], [ -86.800611, 41.760251 ], [ -86.748096, 41.759967 ], [ -86.746521, 41.759982 ], [ -86.641186, 41.759633 ], [ -86.640044, 41.759671 ], [ -86.519318, 41.759447 ], [ -86.501773, 41.759553 ], [ -86.265496, 41.760207 ], [ -86.226070, 41.760016 ], [ -86.217590, 41.760016 ], [ -86.127844, 41.760592 ], [ -86.125460, 41.760560 ], [ -86.125060, 41.760576 ], [ -86.041027, 41.760512 ], [ -85.991302, 41.759949 ], [ -85.974980, 41.759849 ], [ -85.974901, 41.759849 ], [ -85.888825, 41.759422 ], [ -85.874997, 41.759341 ], [ -85.872041, 41.759365 ], [ -85.791363, 41.759051 ], [ -85.775039, 41.759147 ], [ -85.750469, 41.759090 ], [ -85.749992, 41.759091 ], [ -85.724534, 41.759085 ], [ -85.650738, 41.759103 ], [ -85.647683, 41.759125 ], [ -85.632714, 41.759164 ], [ -85.624987, 41.759093 ], [ -85.622608, 41.759049 ], [ -85.608312, 41.759193 ], [ -85.607548, 41.759079 ], [ -85.518251, 41.759513 ], [ -85.515959, 41.759352 ], [ -85.432471, 41.759684 ], [ -85.427553, 41.759706 ], [ -85.379133, 41.759875 ], [ -85.350174, 41.759908 ], [ -85.330623, 41.759982 ], [ -85.318129, 41.759983 ], [ -85.308140, 41.760097 ], [ -85.298365, 41.760028 ], [ -85.292099, 41.759962 ], [ -85.273713, 41.759770 ], [ -85.272951, 41.759911 ], [ -85.272216, 41.759999 ], [ -85.232835, 41.759839 ], [ -85.196637, 41.759735 ], [ -85.172230, 41.759618 ], [ -85.123102, 41.759743 ], [ -85.117267, 41.759700 ], [ -85.039436, 41.759985 ], [ -85.037817, 41.759801 ], [ -84.972803, 41.759366 ], [ -84.971551, 41.759527 ], [ -84.961562, 41.759552 ], [ -84.960860, 41.759438 ], [ -84.932484, 41.759691 ], [ -84.825196, 41.759990 ], [ -84.818873, 41.760059 ], [ -84.805883, 41.760216 ], [ -84.806134, 41.743115 ], [ -84.806074, 41.737603 ], [ -84.806065, 41.732909 ], [ -84.806042, 41.720544 ], [ -84.806018, 41.707485 ], [ -84.806082, 41.696089 ], [ -84.806210, 41.674550 ], [ -84.805673, 41.632342 ], [ -84.805696, 41.631398 ], [ -84.805812, 41.613040 ], [ -84.804729, 41.530231 ], [ -84.804729, 41.530092 ], [ -84.804551, 41.500364 ], [ -84.804457, 41.488224 ], [ -84.803919, 41.435531 ], [ -84.803956, 41.426128 ], [ -84.804015, 41.411655 ], [ -84.804046, 41.408361 ], [ -84.804133, 41.408292 ], [ -84.803926, 41.367959 ], [ -84.803581, 41.271079 ], [ -84.803580, 41.270942 ], [ -84.803492, 41.252531 ], [ -84.803472, 41.173889 ], [ -84.803594, 41.173203 ], [ -84.803413, 41.164649 ], [ -84.803780, 41.140520 ], [ -84.803234, 41.121414 ], [ -84.803374, 41.089302 ], [ -84.803313, 40.989209 ], [ -84.802935, 40.922377 ], [ -84.802170, 40.800601 ], [ -84.802538, 40.765515 ], [ -84.802266, 40.742298 ], [ -84.802119, 40.728163 ], [ -84.802181, 40.718602 ], [ -84.802094, 40.702476 ], [ -84.802127, 40.691405 ], [ -84.802157, 40.689324 ], [ -84.802220, 40.674776 ], [ -84.802193, 40.660298 ], [ -84.802135, 40.644859 ], [ -84.802265, 40.572215 ], [ -84.802483, 40.528046 ], [ -84.802547, 40.501810 ], [ -84.803928, 40.462564 ], [ -84.804504, 40.411555 ], [ -84.804119, 40.352844 ], [ -84.803917, 40.310115 ], [ -84.804098, 40.302498 ], [ -84.805627, 40.223659 ], [ -84.806175, 40.197995 ], [ -84.806340, 40.192327 ], [ -84.806347, 40.192252 ], [ -84.806766, 40.180128 ], [ -84.808291, 40.129027 ], [ -84.808305, 40.127018 ], [ -84.808706, 40.107216 ], [ -84.809737, 40.048929 ], [ -84.810099, 40.034214 ], [ -84.811212, 39.995331 ], [ -84.812193, 39.927340 ], [ -84.812357, 39.921764 ], [ -84.812411, 39.916916 ], [ -84.812698, 39.891585 ], [ -84.812787, 39.890830 ], [ -84.813050, 39.872958 ], [ -84.813464, 39.853261 ], [ -84.813549, 39.850773 ], [ -84.813674, 39.843173 ], [ -84.813703, 39.843059 ], [ -84.813793, 39.826771 ], [ -84.813852, 39.824621 ], [ -84.814179, 39.814212 ], [ -84.814120, 39.811398 ], [ -84.814209, 39.799755 ], [ -84.814179, 39.786853 ], [ -84.814189, 39.785569 ], [ -84.814129, 39.726556 ], [ -84.814530, 39.680429 ], [ -84.814619, 39.669174 ], [ -84.814323, 39.655814 ], [ -84.814705, 39.628854 ], [ -84.815156, 39.568351 ], [ -84.814955, 39.567251 ], [ -84.814955, 39.566251 ], [ -84.815155, 39.548051 ], [ -84.815355, 39.521951 ], [ -84.815555, 39.511052 ], [ -84.815555, 39.510952 ], [ -84.815754, 39.477352 ], [ -84.817453, 39.391753 ], [ -84.819352, 39.309454 ], [ -84.819451, 39.305152 ], [ -84.819622, 39.271590 ], [ -84.819633, 39.261855 ], [ -84.819859, 39.251018 ], [ -84.819801, 39.247806 ], [ -84.819813, 39.244334 ], [ -84.820159, 39.227225 ], [ -84.819802, 39.157613 ], [ -84.819985, 39.149081 ], [ -84.820157, 39.105480 ], [ -84.826246, 39.104170 ], [ -84.831197, 39.101920 ], [ -84.839515, 39.095292 ], [ -84.849574, 39.088264 ], [ -84.860689, 39.078140 ], [ -84.888873, 39.066376 ], [ -84.893873, 39.062466 ], [ -84.897364, 39.057378 ], [ -84.897171, 39.052407 ], [ -84.894281, 39.049572 ], [ -84.889065, 39.040820 ], [ -84.882856, 39.034031 ], [ -84.870168, 39.025551 ], [ -84.856959, 39.011528 ], [ -84.850354, 39.003250 ], [ -84.849445, 39.000923 ], [ -84.847094, 38.997309 ], [ -84.839830, 38.991290 ], [ -84.837120, 38.988059 ], [ -84.833473, 38.981522 ], [ -84.830619, 38.974898 ], [ -84.829857, 38.969385 ], [ -84.832617, 38.961460 ], [ -84.835160, 38.957961 ], [ -84.864731, 38.934893 ], [ -84.870759, 38.929231 ], [ -84.877762, 38.920357 ], [ -84.879268, 38.916116 ], [ -84.878817, 38.913405 ], [ -84.877029, 38.909016 ], [ -84.870124, 38.900389 ], [ -84.867778, 38.899133 ], [ -84.860759, 38.897654 ], [ -84.830472, 38.897256 ], [ -84.819073, 38.895469 ], [ -84.812746, 38.895132 ], [ -84.800247, 38.891070 ], [ -84.788143, 38.883728 ], [ -84.786406, 38.882220 ], [ -84.785234, 38.880439 ], [ -84.784579, 38.875320 ], [ -84.785799, 38.869496 ], [ -84.788302, 38.864325 ], [ -84.791002, 38.860572 ], [ -84.793714, 38.857788 ], [ -84.803247, 38.850723 ], [ -84.817169, 38.843420 ], [ -84.823363, 38.839196 ], [ -84.827488, 38.834909 ], [ -84.829958, 38.830632 ], [ -84.829886, 38.825405 ], [ -84.827098, 38.818634 ], [ -84.816506, 38.805320 ], [ -84.813939, 38.800209 ], [ -84.811645, 38.792766 ], [ -84.811752, 38.789169 ], [ -84.812877, 38.786087 ], [ -84.814641, 38.784488 ], [ -84.821378, 38.783111 ], [ -84.828714, 38.783208 ], [ -84.835672, 38.784289 ], [ -84.847918, 38.788106 ], [ -84.856904, 38.790224 ], [ -84.887919, 38.794652 ], [ -84.893930, 38.793704 ], [ -84.901874, 38.790604 ], [ -84.915234, 38.784086 ], [ -84.932977, 38.777519 ], [ -84.941071, 38.775627 ], [ -84.947644, 38.775273 ], [ -84.962535, 38.778035 ], [ -84.978723, 38.779280 ], [ -84.990006, 38.778383 ], [ -84.995939, 38.776756 ], [ -84.999949, 38.774715 ], [ -85.011772, 38.766712 ], [ -85.040938, 38.755163 ], [ -85.047967, 38.750849 ], [ -85.060264, 38.744948 ], [ -85.071928, 38.741567 ], [ -85.076369, 38.739496 ], [ -85.082180, 38.735439 ], [ -85.100963, 38.726800 ], [ -85.103313, 38.725323 ], [ -85.106979, 38.721630 ], [ -85.106902, 38.720789 ], [ -85.121357, 38.711232 ], [ -85.133049, 38.702375 ], [ -85.138680, 38.699168 ], [ -85.146861, 38.695427 ], [ -85.156158, 38.692251 ], [ -85.172528, 38.688082 ], [ -85.177112, 38.688405 ], [ -85.187278, 38.687609 ], [ -85.190507, 38.687950 ], [ -85.204500, 38.691692 ], [ -85.213257, 38.695446 ], [ -85.221124, 38.700957 ], [ -85.226062, 38.705456 ], [ -85.238665, 38.722494 ], [ -85.242434, 38.726235 ], [ -85.246505, 38.731821 ], [ -85.258846, 38.737754 ], [ -85.267639, 38.739899 ], [ -85.275454, 38.741172 ], [ -85.289226, 38.742410 ], [ -85.306049, 38.741649 ], [ -85.330807, 38.736705 ], [ -85.340953, 38.733893 ], [ -85.351776, 38.731638 ], [ -85.363827, 38.730477 ], [ -85.372284, 38.730576 ], [ -85.400481, 38.735980 ], [ -85.410925, 38.737080 ], [ -85.416631, 38.736272 ], [ -85.422021, 38.734834 ], [ -85.434065, 38.729455 ], [ -85.437766, 38.726405 ], [ -85.442271, 38.719850 ], [ -85.448862, 38.713368 ], [ -85.452114, 38.709348 ], [ -85.455967, 38.695655 ], [ -85.456978, 38.689135 ], [ -85.456481, 38.685069 ], [ -85.455486, 38.682090 ], [ -85.444815, 38.670083 ], [ -85.438742, 38.659319 ], [ -85.437738, 38.648898 ], [ -85.439458, 38.632366 ], [ -85.439351, 38.610388 ], [ -85.438594, 38.605405 ], [ -85.437446, 38.601724 ], [ -85.436170, 38.598292 ], [ -85.419883, 38.573558 ], [ -85.415821, 38.563558 ], [ -85.415272, 38.555416 ], [ -85.415600, 38.546341 ], [ -85.417322, 38.540763 ], [ -85.423077, 38.531581 ], [ -85.425787, 38.528730 ], [ -85.433136, 38.523914 ], [ -85.441725, 38.520191 ], [ -85.458496, 38.514400 ], [ -85.462518, 38.512602 ], [ -85.466691, 38.510280 ], [ -85.472221, 38.506279 ], [ -85.474354, 38.504074 ], [ -85.477670, 38.498320 ], [ -85.479472, 38.494533 ], [ -85.481246, 38.488374 ], [ -85.482897, 38.485701 ], [ -85.491422, 38.474702 ], [ -85.498866, 38.468242 ], [ -85.516939, 38.461357 ], [ -85.527164, 38.458290 ], [ -85.536542, 38.456083 ], [ -85.553304, 38.453880 ], [ -85.575254, 38.453292 ], [ -85.587758, 38.450495 ], [ -85.603833, 38.442094 ], [ -85.607629, 38.439295 ], [ -85.620521, 38.423105 ], [ -85.620329, 38.421697 ], [ -85.621625, 38.417089 ], [ -85.629961, 38.402306 ], [ -85.632937, 38.395666 ], [ -85.638041, 38.380338 ], [ -85.638521, 38.376802 ], [ -85.638009, 38.366115 ], [ -85.638777, 38.361443 ], [ -85.646201, 38.342916 ], [ -85.653641, 38.327108 ], [ -85.659897, 38.319396 ], [ -85.668698, 38.310517 ], [ -85.675017, 38.301317 ], [ -85.683561, 38.295469 ], [ -85.738746, 38.269366 ], [ -85.744862, 38.267170 ], [ -85.750962, 38.267870 ], [ -85.761062, 38.272570 ], [ -85.766563, 38.277670 ], [ -85.765763, 38.279669 ], [ -85.765963, 38.280469 ], [ -85.773363, 38.286169 ], [ -85.780963, 38.288469 ], [ -85.791563, 38.288569 ], [ -85.794063, 38.287869 ], [ -85.796063, 38.286669 ], [ -85.802563, 38.284969 ], [ -85.816164, 38.282969 ], [ -85.823764, 38.280569 ], [ -85.829364, 38.276769 ], [ -85.834864, 38.268069 ], [ -85.838064, 38.257369 ], [ -85.837964, 38.251170 ], [ -85.839664, 38.239770 ], [ -85.845464, 38.230270 ], [ -85.851436, 38.223189 ], [ -85.868564, 38.211969 ], [ -85.880264, 38.203369 ], [ -85.894764, 38.188469 ], [ -85.897664, 38.184269 ], [ -85.908764, 38.161169 ], [ -85.909464, 38.140070 ], [ -85.905164, 38.111070 ], [ -85.904564, 38.100270 ], [ -85.906163, 38.086170 ], [ -85.913163, 38.073370 ], [ -85.915643, 38.066470 ], [ -85.916987, 38.061846 ], [ -85.918379, 38.054214 ], [ -85.919563, 38.041079 ], [ -85.921371, 38.032135 ], [ -85.922395, 38.028679 ], [ -85.925418, 38.023456 ], [ -85.930235, 38.018311 ], [ -85.934635, 38.014423 ], [ -85.939483, 38.010951 ], [ -85.951467, 38.005608 ], [ -85.958299, 38.004616 ], [ -85.976028, 38.003560 ], [ -85.996582, 38.000073 ], [ -86.009127, 37.998529 ], [ -86.020655, 37.996116 ], [ -86.029509, 37.992640 ], [ -86.032468, 37.990100 ], [ -86.035012, 37.984814 ], [ -86.035279, 37.981228 ], [ -86.033386, 37.970382 ], [ -86.034355, 37.964621 ], [ -86.036013, 37.961703 ], [ -86.038188, 37.959350 ], [ -86.042354, 37.958018 ], [ -86.045208, 37.958258 ], [ -86.048458, 37.959369 ], [ -86.053912, 37.963571 ], [ -86.061731, 37.971326 ], [ -86.064859, 37.975618 ], [ -86.071644, 37.987200 ], [ -86.074915, 37.993345 ], [ -86.073980, 37.995449 ], [ -86.075393, 37.996948 ], [ -86.080034, 38.000848 ], [ -86.087525, 38.005127 ], [ -86.095766, 38.008930 ], [ -86.108156, 38.013416 ], [ -86.118208, 38.015279 ], [ -86.127570, 38.016011 ], [ -86.141063, 38.015470 ], [ -86.167310, 38.009879 ], [ -86.172186, 38.009920 ], [ -86.178983, 38.011308 ], [ -86.190927, 38.016438 ], [ -86.206439, 38.021876 ], [ -86.220371, 38.027922 ], [ -86.225519, 38.033280 ], [ -86.233057, 38.039305 ], [ -86.249972, 38.045830 ], [ -86.261273, 38.052721 ], [ -86.266891, 38.057125 ], [ -86.267310, 38.057655 ], [ -86.273584, 38.067443 ], [ -86.278720, 38.089303 ], [ -86.278656, 38.098509 ], [ -86.271223, 38.130112 ], [ -86.271802, 38.137874 ], [ -86.287773, 38.158050 ], [ -86.304155, 38.167872 ], [ -86.317139, 38.172907 ], [ -86.332810, 38.182938 ], [ -86.347736, 38.195363 ], [ -86.360377, 38.198796 ], [ -86.373801, 38.193352 ], [ -86.378151, 38.185845 ], [ -86.377434, 38.171379 ], [ -86.371740, 38.164183 ], [ -86.353625, 38.159579 ], [ -86.325941, 38.154317 ], [ -86.321274, 38.147418 ], [ -86.323453, 38.139032 ], [ -86.328398, 38.132877 ], [ -86.335145, 38.129242 ], [ -86.352466, 38.128459 ], [ -86.375324, 38.130629 ], [ -86.379775, 38.129274 ], [ -86.387216, 38.124632 ], [ -86.396215, 38.107789 ], [ -86.401653, 38.105396 ], [ -86.405068, 38.105801 ], [ -86.418760, 38.117693 ], [ -86.431749, 38.126121 ], [ -86.449793, 38.127223 ], [ -86.457115, 38.124531 ], [ -86.463248, 38.119278 ], [ -86.466081, 38.114437 ], [ -86.466217, 38.106781 ], [ -86.463858, 38.101177 ], [ -86.458795, 38.096404 ], [ -86.434046, 38.086763 ], [ -86.430091, 38.078638 ], [ -86.432789, 38.067171 ], [ -86.438236, 38.060426 ], [ -86.452192, 38.050490 ], [ -86.471903, 38.046218 ], [ -86.480393, 38.045578 ], [ -86.500051, 38.045757 ], [ -86.511760, 38.044448 ], [ -86.517289, 38.042634 ], [ -86.519404, 38.041241 ], [ -86.521825, 38.038327 ], [ -86.524969, 38.027879 ], [ -86.524385, 38.018609 ], [ -86.524656, 38.012894 ], [ -86.525671, 38.007145 ], [ -86.525844, 37.998385 ], [ -86.524888, 37.981834 ], [ -86.525174, 37.968228 ], [ -86.523831, 37.962169 ], [ -86.520503, 37.954438 ], [ -86.518575, 37.951798 ], [ -86.512588, 37.946950 ], [ -86.509390, 37.942492 ], [ -86.507043, 37.936439 ], [ -86.506620, 37.930719 ], [ -86.507831, 37.928829 ], [ -86.511005, 37.926120 ], [ -86.519240, 37.922163 ], [ -86.528279, 37.918618 ], [ -86.534156, 37.917007 ], [ -86.540722, 37.916871 ], [ -86.548507, 37.917842 ], [ -86.566256, 37.922164 ], [ -86.580322, 37.923145 ], [ -86.586542, 37.922285 ], [ -86.588581, 37.921159 ], [ -86.596125, 37.914289 ], [ -86.598452, 37.910965 ], [ -86.599848, 37.906754 ], [ -86.600096, 37.901218 ], [ -86.598151, 37.884553 ], [ -86.598317, 37.880420 ], [ -86.599390, 37.874753 ], [ -86.597476, 37.871478 ], [ -86.597320, 37.870162 ], [ -86.598108, 37.867382 ], [ -86.604624, 37.858272 ], [ -86.609163, 37.855408 ], [ -86.615215, 37.852857 ], [ -86.625763, 37.847266 ], [ -86.634271, 37.843845 ], [ -86.638265, 37.842718 ], [ -86.648028, 37.841425 ], [ -86.652516, 37.841636 ], [ -86.655296, 37.842508 ], [ -86.658268, 37.844144 ], [ -86.661637, 37.849714 ], [ -86.662495, 37.856951 ], [ -86.661233, 37.862761 ], [ -86.658374, 37.869376 ], [ -86.648727, 37.886036 ], [ -86.644754, 37.894806 ], [ -86.644039, 37.898202 ], [ -86.644143, 37.902366 ], [ -86.645513, 37.906529 ], [ -86.647081, 37.908621 ], [ -86.650087, 37.910616 ], [ -86.660888, 37.913059 ], [ -86.673038, 37.914903 ], [ -86.680929, 37.915010 ], [ -86.686015, 37.913084 ], [ -86.691994, 37.908529 ], [ -86.707816, 37.898367 ], [ -86.716138, 37.894073 ], [ -86.718462, 37.893123 ], [ -86.722247, 37.892648 ], [ -86.731460, 37.894340 ], [ -86.734718, 37.896587 ], [ -86.750990, 37.912893 ], [ -86.765054, 37.932510 ], [ -86.779993, 37.956522 ], [ -86.788044, 37.972840 ], [ -86.790597, 37.980062 ], [ -86.794985, 37.988982 ], [ -86.810913, 37.997150 ], [ -86.815267, 37.998877 ], [ -86.820071, 37.999392 ], [ -86.823491, 37.998939 ], [ -86.835161, 37.993750 ], [ -86.849027, 37.990020 ], [ -86.855950, 37.987292 ], [ -86.863224, 37.982495 ], [ -86.866936, 37.979294 ], [ -86.870388, 37.975276 ], [ -86.875874, 37.970770 ], [ -86.881338, 37.967523 ], [ -86.884961, 37.964373 ], [ -86.892084, 37.955929 ], [ -86.902413, 37.946161 ], [ -86.907131, 37.943023 ], [ -86.919329, 37.936664 ], [ -86.927747, 37.934956 ], [ -86.933357, 37.934939 ], [ -86.944633, 37.933534 ], [ -86.964785, 37.932384 ], [ -86.969044, 37.932858 ], [ -86.978957, 37.930200 ], [ -87.003301, 37.922395 ], [ -87.010315, 37.919668 ], [ -87.033444, 37.906593 ], [ -87.042249, 37.898291 ], [ -87.045101, 37.893775 ], [ -87.046237, 37.889866 ], [ -87.045894, 37.887574 ], [ -87.044144, 37.884025 ], [ -87.043407, 37.879940 ], [ -87.043049, 37.875049 ], [ -87.043854, 37.870796 ], [ -87.049260, 37.859745 ], [ -87.051452, 37.853681 ], [ -87.055404, 37.835297 ], [ -87.057836, 37.827457 ], [ -87.065388, 37.810481 ], [ -87.067836, 37.806065 ], [ -87.070732, 37.801937 ], [ -87.077404, 37.796209 ], [ -87.090636, 37.787808 ], [ -87.099900, 37.784640 ], [ -87.111133, 37.782512 ], [ -87.119229, 37.782848 ], [ -87.127533, 37.785040 ], [ -87.129629, 37.786608 ], [ -87.133149, 37.792208 ], [ -87.137502, 37.807264 ], [ -87.141950, 37.816176 ], [ -87.153486, 37.832384 ], [ -87.158878, 37.837871 ], [ -87.162319, 37.840159 ], [ -87.164863, 37.841215 ], [ -87.170831, 37.842319 ], [ -87.180063, 37.841375 ], [ -87.202240, 37.843791 ], [ -87.212416, 37.846223 ], [ -87.220944, 37.849134 ], [ -87.255250, 37.867326 ], [ -87.262930, 37.872846 ], [ -87.269890, 37.879854 ], [ -87.274370, 37.882942 ], [ -87.302324, 37.898445 ], [ -87.320036, 37.905741 ], [ -87.331765, 37.908253 ], [ -87.334165, 37.908205 ], [ -87.335397, 37.907565 ], [ -87.344933, 37.911164 ], [ -87.352614, 37.916124 ], [ -87.354710, 37.918252 ], [ -87.358294, 37.920540 ], [ -87.361638, 37.921004 ], [ -87.363622, 37.922348 ], [ -87.372327, 37.930028 ], [ -87.372711, 37.930556 ], [ -87.372039, 37.931708 ], [ -87.372439, 37.932044 ], [ -87.380247, 37.935596 ], [ -87.401160, 37.941227 ], [ -87.402632, 37.942267 ], [ -87.418585, 37.944763 ], [ -87.428521, 37.944811 ], [ -87.436859, 37.944192 ], [ -87.447786, 37.942427 ], [ -87.450458, 37.941451 ], [ -87.465514, 37.933690 ], [ -87.486347, 37.920218 ], [ -87.490411, 37.916682 ], [ -87.501131, 37.909162 ], [ -87.507483, 37.906730 ], [ -87.511499, 37.906426 ], [ -87.520284, 37.912618 ], [ -87.531532, 37.916298 ], [ -87.545901, 37.922666 ], [ -87.551277, 37.925418 ], [ -87.559342, 37.931146 ], [ -87.565870, 37.937930 ], [ -87.568398, 37.941226 ], [ -87.572030, 37.947466 ], [ -87.574287, 37.954842 ], [ -87.573415, 37.962642 ], [ -87.574715, 37.967742 ], [ -87.577915, 37.971542 ], [ -87.581115, 37.973442 ], [ -87.585916, 37.975442 ], [ -87.589816, 37.976042 ], [ -87.592916, 37.975842 ], [ -87.596716, 37.974842 ], [ -87.601416, 37.972542 ], [ -87.603816, 37.968942 ], [ -87.605216, 37.965142 ], [ -87.605216, 37.961442 ], [ -87.603516, 37.958942 ], [ -87.606216, 37.949642 ], [ -87.610816, 37.944602 ], [ -87.619488, 37.938538 ], [ -87.625616, 37.933442 ], [ -87.628960, 37.926714 ], [ -87.628416, 37.921450 ], [ -87.626256, 37.916138 ], [ -87.623296, 37.910746 ], [ -87.620272, 37.906922 ], [ -87.608479, 37.898794 ], [ -87.601967, 37.895722 ], [ -87.597118, 37.892394 ], [ -87.591582, 37.887194 ], [ -87.588426, 37.868791 ], [ -87.588729, 37.860984 ], [ -87.591504, 37.856642 ], [ -87.606599, 37.838669 ], [ -87.612426, 37.833840 ], [ -87.615399, 37.831974 ], [ -87.625014, 37.829077 ], [ -87.635806, 37.827015 ], [ -87.645858, 37.825899 ], [ -87.655171, 37.826037 ], [ -87.666522, 37.827455 ], [ -87.672397, 37.829127 ], [ -87.675538, 37.831732 ], [ -87.679188, 37.836321 ], [ -87.680689, 37.840620 ], [ -87.681900, 37.846410 ], [ -87.681633, 37.855917 ], [ -87.675400, 37.865946 ], [ -87.673186, 37.868412 ], [ -87.668879, 37.871497 ], [ -87.666175, 37.874146 ], [ -87.664101, 37.877176 ], [ -87.662820, 37.881449 ], [ -87.662865, 37.885578 ], [ -87.665025, 37.893514 ], [ -87.666481, 37.895786 ], [ -87.671457, 37.899498 ], [ -87.675730, 37.901930 ], [ -87.680338, 37.903274 ], [ -87.684018, 37.903498 ], [ -87.688338, 37.902474 ], [ -87.700915, 37.897274 ], [ -87.710675, 37.893898 ], [ -87.717971, 37.892570 ], [ -87.723635, 37.892058 ], [ -87.733300, 37.894346 ], [ -87.740148, 37.894650 ], [ -87.762260, 37.890906 ], [ -87.771004, 37.886261 ], [ -87.773015, 37.884544 ], [ -87.783643, 37.877759 ], [ -87.786407, 37.876556 ], [ -87.790900, 37.875714 ], [ -87.795185, 37.875273 ], [ -87.808013, 37.875191 ], [ -87.830578, 37.876516 ], [ -87.833883, 37.877324 ], [ -87.838102, 37.879769 ], [ -87.841193, 37.882325 ], [ -87.841615, 37.883393 ], [ -87.841693, 37.887685 ], [ -87.844691, 37.892048 ], [ -87.845590, 37.893151 ], [ -87.857243, 37.900649 ], [ -87.858738, 37.902779 ], [ -87.863097, 37.911858 ], [ -87.865558, 37.915056 ], [ -87.872540, 37.920999 ], [ -87.877325, 37.924034 ], [ -87.883321, 37.926238 ], [ -87.892471, 37.927930 ], [ -87.898062, 37.927514 ], [ -87.904789, 37.924892 ], [ -87.921744, 37.907885 ], [ -87.927769, 37.900924 ], [ -87.932129, 37.897320 ], [ -87.936784, 37.892587 ], [ -87.938365, 37.890802 ], [ -87.940069, 37.887670 ], [ -87.940839, 37.883338 ], [ -87.941021, 37.879168 ], [ -87.940005, 37.875044 ], [ -87.938128, 37.870651 ], [ -87.936228, 37.867937 ], [ -87.927303, 37.858709 ], [ -87.914892, 37.849618 ], [ -87.910276, 37.843416 ], [ -87.907773, 37.837611 ], [ -87.903804, 37.817762 ], [ -87.904595, 37.812526 ], [ -87.906810, 37.807624 ], [ -87.911087, 37.805158 ], [ -87.919138, 37.802128 ], [ -87.927543, 37.799851 ], [ -87.932554, 37.797672 ], [ -87.934936, 37.795220 ], [ -87.934698, 37.791827 ], [ -87.935861, 37.789703 ], [ -87.938598, 37.787914 ], [ -87.944506, 37.775256 ], [ -87.946463, 37.773477 ], [ -87.948594, 37.772344 ], [ -87.952590, 37.771742 ], [ -87.960030, 37.773223 ], [ -87.970262, 37.781856 ], [ -87.971805, 37.784648 ], [ -87.976389, 37.788004 ], [ -87.984358, 37.791800 ], [ -87.987157, 37.792202 ], [ -87.991168, 37.794049 ], [ -87.993099, 37.795756 ], [ -87.997102, 37.797672 ], [ -88.004706, 37.800145 ], [ -88.015144, 37.801930 ], [ -88.021021, 37.801409 ], [ -88.028030, 37.799224 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US19", "STATE": "19", "NAME": "Iowa", "LSAD": "", "CENSUSAREA": 55857.130000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -95.765645, 40.585208 ], [ -95.758895, 40.588973 ], [ -95.753148, 40.592840 ], [ -95.750053, 40.597052 ], [ -95.748858, 40.599965 ], [ -95.748626, 40.603355 ], [ -95.749685, 40.606842 ], [ -95.751271, 40.609057 ], [ -95.758045, 40.613759 ], [ -95.764412, 40.617090 ], [ -95.766823, 40.618780 ], [ -95.768926, 40.621264 ], [ -95.770083, 40.624425 ], [ -95.770442, 40.635285 ], [ -95.771325, 40.639393 ], [ -95.772832, 40.642496 ], [ -95.776251, 40.647463 ], [ -95.781909, 40.653272 ], [ -95.786568, 40.657253 ], [ -95.789485, 40.659388 ], [ -95.795489, 40.662384 ], [ -95.804307, 40.664886 ], [ -95.814150, 40.665570 ], [ -95.822913, 40.667240 ], [ -95.832177, 40.671200 ], [ -95.842801, 40.677496 ], [ -95.844827, 40.679867 ], [ -95.846034, 40.682605 ], [ -95.847931, 40.694197 ], [ -95.849828, 40.698147 ], [ -95.852615, 40.702262 ], [ -95.859378, 40.708055 ], [ -95.870481, 40.712480 ], [ -95.875280, 40.714120 ], [ -95.877015, 40.714287 ], [ -95.883178, 40.717579 ], [ -95.885349, 40.721093 ], [ -95.888907, 40.731855 ], [ -95.888697, 40.736292 ], [ -95.886690, 40.742101 ], [ -95.883643, 40.747831 ], [ -95.879027, 40.753081 ], [ -95.873335, 40.757616 ], [ -95.869982, 40.759645 ], [ -95.861695, 40.762871 ], [ -95.852776, 40.765631 ], [ -95.846620, 40.768619 ], [ -95.842824, 40.771093 ], [ -95.838879, 40.774545 ], [ -95.836903, 40.776477 ], [ -95.835232, 40.779151 ], [ -95.834156, 40.783016 ], [ -95.834523, 40.787778 ], [ -95.835815, 40.790630 ], [ -95.843745, 40.803783 ], [ -95.845342, 40.811324 ], [ -95.844852, 40.815307 ], [ -95.843921, 40.817686 ], [ -95.838601, 40.826175 ], [ -95.837303, 40.831164 ], [ -95.837186, 40.835347 ], [ -95.841309, 40.845604 ], [ -95.847084, 40.854174 ], [ -95.848490, 40.858607 ], [ -95.848590, 40.861061 ], [ -95.847785, 40.864328 ], [ -95.846938, 40.865745 ], [ -95.844073, 40.869248 ], [ -95.842521, 40.870266 ], [ -95.838735, 40.872191 ], [ -95.824989, 40.875000 ], [ -95.819590, 40.877439 ], [ -95.815933, 40.879846 ], [ -95.812083, 40.884239 ], [ -95.810709, 40.886681 ], [ -95.809474, 40.891228 ], [ -95.809775, 40.895447 ], [ -95.810886, 40.897907 ], [ -95.814302, 40.902936 ], [ -95.818709, 40.906818 ], [ -95.830699, 40.915004 ], [ -95.833041, 40.917243 ], [ -95.836438, 40.921642 ], [ -95.837774, 40.924712 ], [ -95.839743, 40.932780 ], [ -95.840275, 40.939942 ], [ -95.837951, 40.950618 ], [ -95.829829, 40.963857 ], [ -95.828329, 40.972378 ], [ -95.829074, 40.975688 ], [ -95.830297, 40.978332 ], [ -95.833537, 40.982660 ], [ -95.838908, 40.986484 ], [ -95.844351, 40.989524 ], [ -95.852547, 40.991738 ], [ -95.860116, 40.995242 ], [ -95.863492, 40.997340 ], [ -95.867286, 41.001599 ], [ -95.869198, 41.005951 ], [ -95.869486, 41.009399 ], [ -95.868374, 41.012703 ], [ -95.865878, 41.017403 ], [ -95.859918, 41.025403 ], [ -95.859102, 41.031599 ], [ -95.859654, 41.035695 ], [ -95.860462, 41.037887 ], [ -95.861782, 41.039427 ], [ -95.869807, 41.045199 ], [ -95.879487, 41.053299 ], [ -95.881855, 41.057211 ], [ -95.882415, 41.060411 ], [ -95.881375, 41.065203 ], [ -95.878103, 41.069587 ], [ -95.870631, 41.075231 ], [ -95.865463, 41.080367 ], [ -95.863839, 41.083507 ], [ -95.862587, 41.088399 ], [ -95.863268, 41.093765 ], [ -95.865450, 41.101266 ], [ -95.865888, 41.117898 ], [ -95.868688, 41.124698 ], [ -95.878888, 41.138098 ], [ -95.882088, 41.143998 ], [ -95.883389, 41.150898 ], [ -95.883489, 41.154898 ], [ -95.881289, 41.159898 ], [ -95.876289, 41.165146 ], [ -95.871912, 41.168122 ], [ -95.869640, 41.168830 ], [ -95.867344, 41.168734 ], [ -95.865072, 41.167802 ], [ -95.852788, 41.165398 ], [ -95.846188, 41.166698 ], [ -95.841888, 41.171098 ], [ -95.841288, 41.174998 ], [ -95.844088, 41.180598 ], [ -95.850188, 41.184798 ], [ -95.856788, 41.187098 ], [ -95.864789, 41.188298 ], [ -95.909690, 41.184398 ], [ -95.914590, 41.185098 ], [ -95.918290, 41.186698 ], [ -95.923190, 41.190998 ], [ -95.925990, 41.195698 ], [ -95.927491, 41.202198 ], [ -95.924891, 41.211198 ], [ -95.915091, 41.222998 ], [ -95.912591, 41.226998 ], [ -95.910891, 41.231798 ], [ -95.910891, 41.233998 ], [ -95.911391, 41.237998 ], [ -95.921291, 41.258498 ], [ -95.921891, 41.264598 ], [ -95.920391, 41.268398 ], [ -95.918791, 41.269698 ], [ -95.913991, 41.271398 ], [ -95.928691, 41.281398 ], [ -95.929591, 41.285097 ], [ -95.929591, 41.292297 ], [ -95.927491, 41.298397 ], [ -95.920291, 41.301097 ], [ -95.905890, 41.300897 ], [ -95.904290, 41.299597 ], [ -95.904290, 41.293497 ], [ -95.912491, 41.279498 ], [ -95.902490, 41.273398 ], [ -95.882390, 41.281397 ], [ -95.876890, 41.285097 ], [ -95.872889, 41.289497 ], [ -95.871489, 41.295797 ], [ -95.874689, 41.307097 ], [ -95.878189, 41.312497 ], [ -95.883089, 41.316697 ], [ -95.888690, 41.319097 ], [ -95.899290, 41.321197 ], [ -95.913790, 41.320197 ], [ -95.922090, 41.321097 ], [ -95.925690, 41.322197 ], [ -95.939291, 41.328897 ], [ -95.946891, 41.334096 ], [ -95.953091, 41.339896 ], [ -95.956691, 41.345496 ], [ -95.956791, 41.349196 ], [ -95.954891, 41.351796 ], [ -95.952191, 41.353496 ], [ -95.940990, 41.357496 ], [ -95.935490, 41.360596 ], [ -95.930990, 41.364696 ], [ -95.928790, 41.370096 ], [ -95.929290, 41.374896 ], [ -95.935190, 41.384395 ], [ -95.937490, 41.393095 ], [ -95.936890, 41.396387 ], [ -95.930778, 41.406179 ], [ -95.929721, 41.411331 ], [ -95.929889, 41.415155 ], [ -95.932297, 41.422123 ], [ -95.933169, 41.429430 ], [ -95.932193, 41.431914 ], [ -95.930705, 41.433894 ], [ -95.923905, 41.439742 ], [ -95.921833, 41.442062 ], [ -95.920577, 41.444302 ], [ -95.919865, 41.447922 ], [ -95.920281, 41.451566 ], [ -95.922529, 41.455766 ], [ -95.925713, 41.459382 ], [ -95.932921, 41.463798 ], [ -95.936801, 41.465190 ], [ -95.941969, 41.466262 ], [ -95.946465, 41.466166 ], [ -95.957017, 41.462814 ], [ -95.962329, 41.462810 ], [ -95.965481, 41.463510 ], [ -95.973449, 41.467318 ], [ -95.982962, 41.469778 ], [ -95.991018, 41.470374 ], [ -96.004708, 41.472342 ], [ -96.008833, 41.474039 ], [ -96.011757, 41.476212 ], [ -96.016389, 41.481556 ], [ -96.019542, 41.486617 ], [ -96.019817, 41.488030 ], [ -96.019224, 41.489296 ], [ -96.015986, 41.492659 ], [ -96.007334, 41.497631 ], [ -95.997903, 41.504789 ], [ -95.993943, 41.509761 ], [ -95.992833, 41.512002 ], [ -95.992599, 41.514174 ], [ -95.992670, 41.517290 ], [ -95.993891, 41.523412 ], [ -95.999529, 41.538679 ], [ -96.001161, 41.541146 ], [ -96.005079, 41.544004 ], [ -96.010028, 41.545533 ], [ -96.016474, 41.546085 ], [ -96.019686, 41.545743 ], [ -96.023182, 41.544364 ], [ -96.027289, 41.541081 ], [ -96.028439, 41.539616 ], [ -96.030593, 41.527292 ], [ -96.034305, 41.512853 ], [ -96.036603, 41.509047 ], [ -96.038101, 41.507990 ], [ -96.040701, 41.507076 ], [ -96.048118, 41.507271 ], [ -96.053690, 41.508859 ], [ -96.057935, 41.511490 ], [ -96.063638, 41.516162 ], [ -96.067527, 41.520340 ], [ -96.073070, 41.525052 ], [ -96.080493, 41.528199 ], [ -96.088220, 41.530595 ], [ -96.089714, 41.531778 ], [ -96.094090, 41.539265 ], [ -96.096186, 41.547192 ], [ -96.095851, 41.550880 ], [ -96.093613, 41.558271 ], [ -96.091820, 41.561086 ], [ -96.084786, 41.567831 ], [ -96.082406, 41.571229 ], [ -96.081178, 41.574274 ], [ -96.081152, 41.577289 ], [ -96.081843, 41.580407 ], [ -96.083417, 41.583339 ], [ -96.085771, 41.585746 ], [ -96.088683, 41.587520 ], [ -96.101496, 41.591580 ], [ -96.104465, 41.593169 ], [ -96.109387, 41.596871 ], [ -96.113833, 41.602277 ], [ -96.115830, 41.605760 ], [ -96.117558, 41.609999 ], [ -96.118105, 41.613495 ], [ -96.117950, 41.617356 ], [ -96.116233, 41.621574 ], [ -96.114146, 41.623975 ], [ -96.100701, 41.635507 ], [ -96.097728, 41.639633 ], [ -96.095046, 41.647365 ], [ -96.095415, 41.652736 ], [ -96.097933, 41.658682 ], [ -96.099837, 41.661030 ], [ -96.111483, 41.668548 ], [ -96.114978, 41.671220 ], [ -96.118120, 41.674399 ], [ -96.120983, 41.677861 ], [ -96.121726, 41.682740 ], [ -96.121401, 41.688522 ], [ -96.120157, 41.691150 ], [ -96.117751, 41.694221 ], [ -96.111968, 41.697773 ], [ -96.105119, 41.699917 ], [ -96.090579, 41.697425 ], [ -96.082429, 41.698159 ], [ -96.075955, 41.701661 ], [ -96.073063, 41.705004 ], [ -96.072321, 41.706858 ], [ -96.072494, 41.708794 ], [ -96.073376, 41.710674 ], [ -96.075151, 41.713265 ], [ -96.079682, 41.717962 ], [ -96.087600, 41.722180 ], [ -96.102610, 41.728016 ], [ -96.105582, 41.731647 ], [ -96.106326, 41.734591 ], [ -96.106425, 41.737890 ], [ -96.104622, 41.744211 ], [ -96.102772, 41.746339 ], [ -96.097511, 41.749076 ], [ -96.091687, 41.750419 ], [ -96.084673, 41.753314 ], [ -96.079915, 41.757895 ], [ -96.078300, 41.761598 ], [ -96.078939, 41.771353 ], [ -96.077543, 41.777824 ], [ -96.073197, 41.783009 ], [ -96.066413, 41.788913 ], [ -96.064537, 41.793002 ], [ -96.064879, 41.796230 ], [ -96.067329, 41.800628 ], [ -96.069662, 41.803509 ], [ -96.075548, 41.807811 ], [ -96.081026, 41.810144 ], [ -96.093835, 41.812785 ], [ -96.098270, 41.814206 ], [ -96.103749, 41.817151 ], [ -96.107592, 41.820685 ], [ -96.109347, 41.823735 ], [ -96.110810, 41.828172 ], [ -96.110907, 41.830818 ], [ -96.107911, 41.840339 ], [ -96.108029, 41.844397 ], [ -96.110246, 41.848850 ], [ -96.113962, 41.853102 ], [ -96.116202, 41.854869 ], [ -96.123215, 41.858580 ], [ -96.130620, 41.860809 ], [ -96.135253, 41.863128 ], [ -96.142045, 41.868865 ], [ -96.144483, 41.871854 ], [ -96.146083, 41.874988 ], [ -96.146757, 41.877538 ], [ -96.147350, 41.884811 ], [ -96.148826, 41.888132 ], [ -96.152179, 41.892085 ], [ -96.158204, 41.897173 ], [ -96.161756, 41.901820 ], [ -96.161988, 41.905553 ], [ -96.160767, 41.908044 ], [ -96.159098, 41.910057 ], [ -96.154301, 41.912421 ], [ -96.142265, 41.915379 ], [ -96.139653, 41.916838 ], [ -96.136743, 41.920826 ], [ -96.136133, 41.923530 ], [ -96.136613, 41.927167 ], [ -96.143493, 41.937387 ], [ -96.144583, 41.941544 ], [ -96.143603, 41.944512 ], [ -96.142597, 41.945908 ], [ -96.135393, 41.952223 ], [ -96.133318, 41.955732 ], [ -96.129186, 41.965136 ], [ -96.128900, 41.969727 ], [ -96.129505, 41.971673 ], [ -96.132537, 41.974625 ], [ -96.141228, 41.978063 ], [ -96.156538, 41.980137 ], [ -96.160680, 41.980114 ], [ -96.168071, 41.978996 ], [ -96.174154, 41.976864 ], [ -96.177203, 41.976325 ], [ -96.184243, 41.976696 ], [ -96.186265, 41.977417 ], [ -96.190602, 41.980721 ], [ -96.191549, 41.982032 ], [ -96.192141, 41.984461 ], [ -96.189516, 41.989314 ], [ -96.184784, 41.995460 ], [ -96.183801, 41.997760 ], [ -96.183568, 41.999987 ], [ -96.184644, 42.002633 ], [ -96.188067, 42.006323 ], [ -96.194556, 42.008662 ], [ -96.206083, 42.009267 ], [ -96.215225, 42.006701 ], [ -96.217637, 42.003862 ], [ -96.221813, 41.997382 ], [ -96.223896, 41.995456 ], [ -96.225463, 41.994734 ], [ -96.229739, 41.994410 ], [ -96.236487, 41.996428 ], [ -96.240713, 41.999351 ], [ -96.242035, 42.000911 ], [ -96.242380, 42.002899 ], [ -96.241932, 42.006965 ], [ -96.238859, 42.012315 ], [ -96.227867, 42.018651 ], [ -96.223611, 42.022652 ], [ -96.221730, 42.026205 ], [ -96.221901, 42.029558 ], [ -96.223822, 42.033346 ], [ -96.225656, 42.035217 ], [ -96.232125, 42.039145 ], [ -96.238392, 42.041088 ], [ -96.246832, 42.041616 ], [ -96.254542, 42.039454 ], [ -96.256087, 42.038080 ], [ -96.261132, 42.038974 ], [ -96.263886, 42.039858 ], [ -96.268637, 42.042314 ], [ -96.271427, 42.044988 ], [ -96.272877, 42.047238 ], [ -96.275548, 42.051976 ], [ -96.278445, 42.060399 ], [ -96.279342, 42.070280 ], [ -96.279079, 42.074026 ], [ -96.276758, 42.081416 ], [ -96.274135, 42.085934 ], [ -96.271777, 42.088697 ], [ -96.267636, 42.096177 ], [ -96.266594, 42.103262 ], [ -96.267318, 42.110265 ], [ -96.268900, 42.113590 ], [ -96.272299, 42.118396 ], [ -96.275002, 42.120779 ], [ -96.279203, 42.123480 ], [ -96.285670, 42.125619 ], [ -96.301023, 42.128042 ], [ -96.305884, 42.129826 ], [ -96.310085, 42.132523 ], [ -96.313819, 42.136338 ], [ -96.316979, 42.143171 ], [ -96.319528, 42.146647 ], [ -96.325872, 42.151487 ], [ -96.337980, 42.157197 ], [ -96.342395, 42.160491 ], [ -96.347752, 42.166806 ], [ -96.349688, 42.172043 ], [ -96.350323, 42.177440 ], [ -96.347243, 42.186721 ], [ -96.348066, 42.194747 ], [ -96.349166, 42.197253 ], [ -96.351515, 42.200485 ], [ -96.359087, 42.207799 ], [ -96.359870, 42.210545 ], [ -96.358141, 42.214088 ], [ -96.356591, 42.215182 ], [ -96.345055, 42.217490 ], [ -96.339086, 42.218087 ], [ -96.336323, 42.218922 ], [ -96.332044, 42.221585 ], [ -96.323723, 42.229887 ], [ -96.322827, 42.231461 ], [ -96.322868, 42.233637 ], [ -96.330004, 42.240224 ], [ -96.328955, 42.241885 ], [ -96.327706, 42.249992 ], [ -96.328905, 42.254734 ], [ -96.331331, 42.259430 ], [ -96.336003, 42.264806 ], [ -96.341450, 42.269115 ], [ -96.356389, 42.276480 ], [ -96.360800, 42.279867 ], [ -96.365792, 42.285875 ], [ -96.368454, 42.291848 ], [ -96.368507, 42.303622 ], [ -96.369212, 42.308344 ], [ -96.369969, 42.310878 ], [ -96.371790, 42.314172 ], [ -96.375307, 42.318339 ], [ -96.384169, 42.325874 ], [ -96.396269, 42.330857 ], [ -96.402957, 42.334156 ], [ -96.407998, 42.337408 ], [ -96.413895, 42.343393 ], [ -96.417786, 42.351449 ], [ -96.418168, 42.354678 ], [ -96.417918, 42.358700 ], [ -96.417093, 42.361443 ], [ -96.413994, 42.365932 ], [ -96.408436, 42.376092 ], [ -96.409153, 42.381491 ], [ -96.414980, 42.393442 ], [ -96.415509, 42.400294 ], [ -96.413609, 42.407894 ], [ -96.411808, 42.410894 ], [ -96.387608, 42.432494 ], [ -96.384307, 42.437294 ], [ -96.380707, 42.446394 ], [ -96.380107, 42.451494 ], [ -96.381307, 42.461694 ], [ -96.385407, 42.473094 ], [ -96.386007, 42.474495 ], [ -96.396107, 42.484095 ], [ -96.409408, 42.487595 ], [ -96.423892, 42.488980 ], [ -96.443408, 42.489495 ], [ -96.456348, 42.492478 ], [ -96.462550, 42.490788 ], [ -96.474409, 42.491895 ], [ -96.476509, 42.493595 ], [ -96.476909, 42.497795 ], [ -96.474709, 42.500095 ], [ -96.473339, 42.503537 ], [ -96.477454, 42.509589 ], [ -96.479384, 42.511138 ], [ -96.483592, 42.510345 ], [ -96.490089, 42.512441 ], [ -96.492970, 42.517282 ], [ -96.490802, 42.520331 ], [ -96.479909, 42.524195 ], [ -96.479009, 42.526395 ], [ -96.479809, 42.529595 ], [ -96.477709, 42.535595 ], [ -96.476962, 42.546434 ], [ -96.476952, 42.556079 ], [ -96.494699, 42.556745 ], [ -96.498041, 42.558153 ], [ -96.499414, 42.567552 ], [ -96.498709, 42.570870 ], [ -96.497186, 42.571464 ], [ -96.493279, 42.570736 ], [ -96.489328, 42.570800 ], [ -96.486855, 42.572198 ], [ -96.485937, 42.573524 ], [ -96.485796, 42.575001 ], [ -96.486606, 42.576062 ], [ -96.491402, 42.577023 ], [ -96.495450, 42.579474 ], [ -96.496066, 42.580872 ], [ -96.495570, 42.582722 ], [ -96.494676, 42.584028 ], [ -96.494777, 42.585741 ], [ -96.496792, 42.587655 ], [ -96.499885, 42.588539 ], [ -96.501037, 42.589247 ], [ -96.501434, 42.590610 ], [ -96.500243, 42.592731 ], [ -96.500183, 42.594106 ], [ -96.504654, 42.605001 ], [ -96.509468, 42.612730 ], [ -96.513237, 42.614894 ], [ -96.517048, 42.615343 ], [ -96.519514, 42.614371 ], [ -96.522309, 42.612558 ], [ -96.525671, 42.609312 ], [ -96.527928, 42.608986 ], [ -96.529894, 42.610432 ], [ -96.531604, 42.615148 ], [ -96.530896, 42.617129 ], [ -96.528185, 42.618447 ], [ -96.523998, 42.618631 ], [ -96.521158, 42.619229 ], [ -96.518542, 42.620350 ], [ -96.516599, 42.622361 ], [ -96.515918, 42.624994 ], [ -96.515350, 42.627645 ], [ -96.516338, 42.630435 ], [ -96.526766, 42.641184 ], [ -96.533701, 42.643541 ], [ -96.537881, 42.646446 ], [ -96.538468, 42.648092 ], [ -96.537600, 42.652161 ], [ -96.537877, 42.655431 ], [ -96.542366, 42.660736 ], [ -96.543698, 42.661377 ], [ -96.546827, 42.661491 ], [ -96.556214, 42.657949 ], [ -96.559281, 42.657903 ], [ -96.559962, 42.658543 ], [ -96.559900, 42.662819 ], [ -96.558939, 42.663642 ], [ -96.556461, 42.663939 ], [ -96.556244, 42.664396 ], [ -96.560550, 42.669198 ], [ -96.566684, 42.675942 ], [ -96.568078, 42.676241 ], [ -96.569194, 42.675509 ], [ -96.570247, 42.674068 ], [ -96.570743, 42.671691 ], [ -96.572261, 42.670776 ], [ -96.576381, 42.671302 ], [ -96.578581, 42.672079 ], [ -96.578148, 42.672765 ], [ -96.575272, 42.675417 ], [ -96.574318, 42.676997 ], [ -96.574064, 42.678010 ], [ -96.575299, 42.682665 ], [ -96.585620, 42.687076 ], [ -96.591602, 42.688081 ], [ -96.596405, 42.688514 ], [ -96.595548, 42.691222 ], [ -96.596625, 42.695122 ], [ -96.599080, 42.697296 ], [ -96.600789, 42.697698 ], [ -96.601989, 42.697429 ], [ -96.604839, 42.695119 ], [ -96.606140, 42.694661 ], [ -96.610170, 42.694568 ], [ -96.612061, 42.695688 ], [ -96.612124, 42.696580 ], [ -96.611901, 42.697095 ], [ -96.611851, 42.697548 ], [ -96.612203, 42.698151 ], [ -96.612555, 42.698402 ], [ -96.613058, 42.698603 ], [ -96.613409, 42.698704 ], [ -96.613912, 42.698704 ], [ -96.614516, 42.698654 ], [ -96.615257, 42.698613 ], [ -96.619536, 42.700189 ], [ -96.629625, 42.705102 ], [ -96.630617, 42.705880 ], [ -96.629777, 42.708852 ], [ -96.627233, 42.709947 ], [ -96.624446, 42.714294 ], [ -96.624704, 42.725497 ], [ -96.626317, 42.725951 ], [ -96.631931, 42.725086 ], [ -96.638621, 42.734921 ], [ -96.639704, 42.737071 ], [ -96.635886, 42.741002 ], [ -96.632314, 42.745641 ], [ -96.630485, 42.750378 ], [ -96.626108, 42.752729 ], [ -96.620548, 42.753534 ], [ -96.619494, 42.754792 ], [ -96.620272, 42.757124 ], [ -96.621235, 42.758084 ], [ -96.622538, 42.758449 ], [ -96.624120, 42.757808 ], [ -96.628741, 42.757532 ], [ -96.632212, 42.761512 ], [ -96.633168, 42.768325 ], [ -96.632142, 42.770863 ], [ -96.630311, 42.770885 ], [ -96.626406, 42.773518 ], [ -96.621875, 42.779255 ], [ -96.619490, 42.784034 ], [ -96.615579, 42.784996 ], [ -96.604559, 42.783034 ], [ -96.603784, 42.783720 ], [ -96.602575, 42.787767 ], [ -96.595283, 42.792982 ], [ -96.592493, 42.801122 ], [ -96.590757, 42.808255 ], [ -96.590913, 42.808987 ], [ -96.592155, 42.809924 ], [ -96.595664, 42.810426 ], [ -96.596008, 42.815044 ], [ -96.594983, 42.815844 ], [ -96.591039, 42.815365 ], [ -96.585699, 42.818041 ], [ -96.584488, 42.818979 ], [ -96.577937, 42.827645 ], [ -96.577813, 42.828719 ], [ -96.582380, 42.833657 ], [ -96.581604, 42.837521 ], [ -96.579772, 42.838093 ], [ -96.571353, 42.837155 ], [ -96.565605, 42.830434 ], [ -96.563058, 42.831051 ], [ -96.562840, 42.836309 ], [ -96.560572, 42.839373 ], [ -96.558584, 42.839487 ], [ -96.556162, 42.836675 ], [ -96.553987, 42.836034 ], [ -96.552092, 42.836057 ], [ -96.551285, 42.836606 ], [ -96.549513, 42.839143 ], [ -96.549976, 42.840705 ], [ -96.552184, 42.841864 ], [ -96.554203, 42.843648 ], [ -96.554709, 42.846142 ], [ -96.553772, 42.847501 ], [ -96.550847, 42.847648 ], [ -96.545502, 42.849956 ], [ -96.544321, 42.851282 ], [ -96.541460, 42.857682 ], [ -96.541708, 42.858871 ], [ -96.542702, 42.859717 ], [ -96.543417, 42.859466 ], [ -96.543790, 42.858254 ], [ -96.545282, 42.857158 ], [ -96.546556, 42.857273 ], [ -96.550439, 42.863171 ], [ -96.550469, 42.863742 ], [ -96.549659, 42.870281 ], [ -96.547327, 42.873710 ], [ -96.546394, 42.874464 ], [ -96.543908, 42.874614 ], [ -96.537851, 42.878475 ], [ -96.538438, 42.886111 ], [ -96.540396, 42.888877 ], [ -96.540116, 42.889678 ], [ -96.534395, 42.890659 ], [ -96.527740, 42.890588 ], [ -96.526357, 42.891852 ], [ -96.526563, 42.893755 ], [ -96.528886, 42.897950 ], [ -96.536007, 42.900901 ], [ -96.539397, 42.899964 ], [ -96.542847, 42.903737 ], [ -96.542971, 42.904560 ], [ -96.542473, 42.905040 ], [ -96.538555, 42.904605 ], [ -96.536564, 42.905656 ], [ -96.537837, 42.910709 ], [ -96.540229, 42.918666 ], [ -96.541628, 42.920678 ], [ -96.541689, 42.922576 ], [ -96.541098, 42.924496 ], [ -96.525536, 42.935511 ], [ -96.523513, 42.935784 ], [ -96.521180, 42.934846 ], [ -96.520559, 42.932765 ], [ -96.519378, 42.931987 ], [ -96.518258, 42.931849 ], [ -96.516888, 42.932512 ], [ -96.516203, 42.933769 ], [ -96.516419, 42.935438 ], [ -96.520120, 42.938183 ], [ -96.519994, 42.939760 ], [ -96.514888, 42.943668 ], [ -96.510749, 42.944397 ], [ -96.509472, 42.945151 ], [ -96.508069, 42.948534 ], [ -96.504857, 42.954659 ], [ -96.500308, 42.959391 ], [ -96.503132, 42.968192 ], [ -96.505028, 42.970844 ], [ -96.506148, 42.971348 ], [ -96.510693, 42.971260 ], [ -96.515922, 42.972886 ], [ -96.520246, 42.977643 ], [ -96.520773, 42.980385 ], [ -96.516724, 42.981458 ], [ -96.512237, 42.985937 ], [ -96.512203, 42.988818 ], [ -96.512886, 42.991424 ], [ -96.509986, 42.995126 ], [ -96.507337, 42.996519 ], [ -96.502728, 42.997066 ], [ -96.497820, 42.998143 ], [ -96.496699, 42.998807 ], [ -96.494341, 43.001819 ], [ -96.492693, 43.005089 ], [ -96.491670, 43.009707 ], [ -96.494416, 43.014551 ], [ -96.499187, 43.019213 ], [ -96.503209, 43.019805 ], [ -96.510995, 43.024701 ], [ -96.511804, 43.025799 ], [ -96.513085, 43.028437 ], [ -96.512916, 43.029962 ], [ -96.510802, 43.031902 ], [ -96.509146, 43.036680 ], [ -96.509145, 43.037297 ], [ -96.511605, 43.039927 ], [ -96.513873, 43.039814 ], [ -96.515752, 43.039388 ], [ -96.517319, 43.040247 ], [ -96.518431, 43.042068 ], [ -96.510256, 43.049917 ], [ -96.508916, 43.049985 ], [ -96.505239, 43.048726 ], [ -96.501748, 43.048632 ], [ -96.490365, 43.050789 ], [ -96.488839, 43.051475 ], [ -96.488155, 43.054013 ], [ -96.486722, 43.055498 ], [ -96.476905, 43.062383 ], [ -96.473165, 43.063550 ], [ -96.469953, 43.062088 ], [ -96.468207, 43.061860 ], [ -96.463094, 43.062981 ], [ -96.460850, 43.064033 ], [ -96.458201, 43.067554 ], [ -96.455209, 43.075053 ], [ -96.454088, 43.084197 ], [ -96.454526, 43.086826 ], [ -96.455337, 43.088129 ], [ -96.462636, 43.089614 ], [ -96.462855, 43.091419 ], [ -96.460516, 43.094940 ], [ -96.451877, 43.100474 ], [ -96.448134, 43.104452 ], [ -96.439335, 43.113916 ], [ -96.436589, 43.120842 ], [ -96.439615, 43.121963 ], [ -96.440801, 43.123129 ], [ -96.441644, 43.124687 ], [ -96.442711, 43.128841 ], [ -96.443431, 43.133825 ], [ -96.450361, 43.142237 ], [ -96.455544, 43.144157 ], [ -96.458854, 43.143356 ], [ -96.459978, 43.143516 ], [ -96.465099, 43.147515 ], [ -96.466537, 43.150281 ], [ -96.467384, 43.159608 ], [ -96.467292, 43.164066 ], [ -96.464896, 43.182034 ], [ -96.465146, 43.182971 ], [ -96.467146, 43.184502 ], [ -96.468802, 43.184525 ], [ -96.472395, 43.185644 ], [ -96.473834, 43.189804 ], [ -96.473777, 43.198766 ], [ -96.470781, 43.205099 ], [ -96.470626, 43.207225 ], [ -96.472158, 43.209534 ], [ -96.474912, 43.217351 ], [ -96.475571, 43.221054 ], [ -96.476697, 43.222014 ], [ -96.485264, 43.224183 ], [ -96.496454, 43.223652 ], [ -96.500759, 43.220767 ], [ -96.512458, 43.218556 ], [ -96.519273, 43.217690 ], [ -96.520961, 43.218240 ], [ -96.522084, 43.220960 ], [ -96.526865, 43.224071 ], [ -96.535741, 43.227640 ], [ -96.540088, 43.225698 ], [ -96.544902, 43.225928 ], [ -96.548184, 43.226912 ], [ -96.554937, 43.226775 ], [ -96.556313, 43.226135 ], [ -96.557317, 43.224778 ], [ -96.558995, 43.224126 ], [ -96.560440, 43.224219 ], [ -96.568505, 43.231554 ], [ -96.571194, 43.238961 ], [ -96.565253, 43.244241 ], [ -96.559186, 43.245155 ], [ -96.552963, 43.247281 ], [ -96.552030, 43.251117 ], [ -96.552591, 43.257769 ], [ -96.553217, 43.259141 ], [ -96.554965, 43.259999 ], [ -96.556970, 43.259096 ], [ -96.560099, 43.259279 ], [ -96.564165, 43.260239 ], [ -96.568576, 43.262662 ], [ -96.576804, 43.268308 ], [ -96.582904, 43.267690 ], [ -96.585220, 43.268878 ], [ -96.586317, 43.274319 ], [ -96.583533, 43.276879 ], [ -96.582939, 43.276536 ], [ -96.582876, 43.274594 ], [ -96.580904, 43.274800 ], [ -96.577588, 43.278800 ], [ -96.578823, 43.291095 ], [ -96.579094, 43.293797 ], [ -96.579478, 43.295110 ], [ -96.580409, 43.295854 ], [ -96.581052, 43.297118 ], [ -96.580346, 43.298204 ], [ -96.573556, 43.299170 ], [ -96.571646, 43.298187 ], [ -96.570707, 43.296701 ], [ -96.569110, 43.295535 ], [ -96.564290, 43.294804 ], [ -96.563523, 43.294804 ], [ -96.555246, 43.294803 ], [ -96.553087, 43.292860 ], [ -96.541037, 43.295556 ], [ -96.530392, 43.300034 ], [ -96.526004, 43.309999 ], [ -96.525564, 43.312467 ], [ -96.528817, 43.316561 ], [ -96.533101, 43.328587 ], [ -96.534913, 43.336473 ], [ -96.531905, 43.338690 ], [ -96.524289, 43.347214 ], [ -96.524476, 43.348151 ], [ -96.525510, 43.348335 ], [ -96.526635, 43.351833 ], [ -96.527223, 43.362257 ], [ -96.527345, 43.368109 ], [ -96.526467, 43.368314 ], [ -96.522203, 43.371947 ], [ -96.521323, 43.374607 ], [ -96.521297, 43.375947 ], [ -96.521572, 43.385640 ], [ -96.524044, 43.394762 ], [ -96.525453, 43.396317 ], [ -96.529152, 43.397735 ], [ -96.530124, 43.397553 ], [ -96.530124, 43.396410 ], [ -96.531159, 43.395610 ], [ -96.537116, 43.395063 ], [ -96.553008, 43.404117 ], [ -96.557586, 43.406792 ], [ -96.562728, 43.412782 ], [ -96.568499, 43.417217 ], [ -96.573579, 43.419228 ], [ -96.570788, 43.423755 ], [ -96.569628, 43.427527 ], [ -96.570224, 43.428601 ], [ -96.575181, 43.431756 ], [ -96.581956, 43.432212 ], [ -96.587884, 43.431685 ], [ -96.592905, 43.433170 ], [ -96.594254, 43.434153 ], [ -96.602608, 43.449649 ], [ -96.602860, 43.450907 ], [ -96.600039, 43.457080 ], [ -96.587929, 43.464878 ], [ -96.584603, 43.469610 ], [ -96.585137, 43.471141 ], [ -96.586364, 43.478251 ], [ -96.580997, 43.481384 ], [ -96.585049, 43.489887 ], [ -96.586274, 43.491099 ], [ -96.590452, 43.494298 ], [ -96.591676, 43.494367 ], [ -96.594722, 43.493314 ], [ -96.598396, 43.495074 ], [ -96.599182, 43.496011 ], [ -96.598928, 43.500457 ], [ -96.591213, 43.500514 ], [ -96.453049, 43.500415 ], [ -96.351059, 43.500333 ], [ -96.332062, 43.500415 ], [ -96.208814, 43.500391 ], [ -96.198766, 43.500312 ], [ -96.198484, 43.500335 ], [ -95.861152, 43.499966 ], [ -95.834421, 43.499966 ], [ -95.821277, 43.499965 ], [ -95.741569, 43.499891 ], [ -95.740813, 43.499894 ], [ -95.514774, 43.499865 ], [ -95.486803, 43.500246 ], [ -95.486737, 43.500274 ], [ -95.475065, 43.500335 ], [ -95.454706, 43.500563 ], [ -95.454706, 43.500648 ], [ -95.434293, 43.500360 ], [ -95.434199, 43.500314 ], [ -95.387851, 43.500240 ], [ -95.387812, 43.500240 ], [ -95.375269, 43.500322 ], [ -95.374737, 43.500314 ], [ -95.250969, 43.500464 ], [ -95.250762, 43.500406 ], [ -95.244844, 43.501196 ], [ -95.214938, 43.500885 ], [ -95.180423, 43.500774 ], [ -95.167891, 43.500885 ], [ -95.167294, 43.500771 ], [ -95.154936, 43.500449 ], [ -95.122633, 43.500755 ], [ -95.114874, 43.500667 ], [ -95.054289, 43.500860 ], [ -95.053504, 43.500769 ], [ -95.034000, 43.500811 ], [ -95.014245, 43.500872 ], [ -94.994460, 43.500523 ], [ -94.974359, 43.500508 ], [ -94.954477, 43.500467 ], [ -94.934625, 43.500490 ], [ -94.914955, 43.500450 ], [ -94.914905, 43.500450 ], [ -94.914523, 43.500450 ], [ -94.887291, 43.500502 ], [ -94.874235, 43.500557 ], [ -94.872725, 43.500564 ], [ -94.860192, 43.500546 ], [ -94.857867, 43.500615 ], [ -94.615916, 43.500544 ], [ -94.565665, 43.500330 ], [ -94.560838, 43.500377 ], [ -94.470420, 43.500340 ], [ -94.447048, 43.500639 ], [ -94.442835, 43.500583 ], [ -94.390597, 43.500469 ], [ -94.377466, 43.500379 ], [ -94.109880, 43.500283 ], [ -94.108068, 43.500300 ], [ -94.094339, 43.500302 ], [ -94.092894, 43.500302 ], [ -93.970760, 43.499605 ], [ -93.795793, 43.499520 ], [ -93.794285, 43.499542 ], [ -93.716217, 43.499563 ], [ -93.708771, 43.499564 ], [ -93.704916, 43.499568 ], [ -93.699345, 43.499576 ], [ -93.617131, 43.499548 ], [ -93.576728, 43.499520 ], [ -93.558631, 43.499521 ], [ -93.532178, 43.499472 ], [ -93.528482, 43.499471 ], [ -93.497405, 43.499456 ], [ -93.488261, 43.499417 ], [ -93.482009, 43.499482 ], [ -93.472804, 43.499400 ], [ -93.468563, 43.499473 ], [ -93.428509, 43.499478 ], [ -93.399035, 43.499485 ], [ -93.271800, 43.499356 ], [ -93.228861, 43.499567 ], [ -93.024429, 43.499572 ], [ -93.007871, 43.499604 ], [ -92.870277, 43.499548 ], [ -92.790317, 43.499567 ], [ -92.752088, 43.500084 ], [ -92.707312, 43.500069 ], [ -92.692786, 43.500063 ], [ -92.689033, 43.500062 ], [ -92.672580, 43.500055 ], [ -92.653318, 43.500050 ], [ -92.649194, 43.500049 ], [ -92.553161, 43.500300 ], [ -92.464505, 43.500345 ], [ -92.408832, 43.500614 ], [ -92.406130, 43.500476 ], [ -92.388298, 43.500483 ], [ -92.368908, 43.500454 ], [ -92.279084, 43.500436 ], [ -92.277425, 43.500466 ], [ -92.198788, 43.500527 ], [ -92.178863, 43.500713 ], [ -92.103886, 43.500735 ], [ -92.089970, 43.500684 ], [ -92.079954, 43.500647 ], [ -91.949879, 43.500485 ], [ -91.941837, 43.500554 ], [ -91.824848, 43.500684 ], [ -91.807156, 43.500648 ], [ -91.804925, 43.500716 ], [ -91.779290, 43.500803 ], [ -91.777688, 43.500711 ], [ -91.761414, 43.500637 ], [ -91.738446, 43.500525 ], [ -91.736558, 43.500561 ], [ -91.733330, 43.500623 ], [ -91.730359, 43.500680 ], [ -91.700749, 43.500581 ], [ -91.670872, 43.500513 ], [ -91.658401, 43.500533 ], [ -91.651396, 43.500454 ], [ -91.644924, 43.500529 ], [ -91.639772, 43.500573 ], [ -91.635626, 43.500463 ], [ -91.634495, 43.500439 ], [ -91.634244, 43.500479 ], [ -91.625611, 43.500727 ], [ -91.620785, 43.500677 ], [ -91.617407, 43.500687 ], [ -91.616895, 43.500663 ], [ -91.615293, 43.500550 ], [ -91.610895, 43.500530 ], [ -91.591073, 43.500536 ], [ -91.551021, 43.500539 ], [ -91.541220, 43.500515 ], [ -91.533806, 43.500560 ], [ -91.491042, 43.500690 ], [ -91.465063, 43.500608 ], [ -91.461403, 43.500642 ], [ -91.445932, 43.500588 ], [ -91.441786, 43.500438 ], [ -91.397319, 43.500887 ], [ -91.376950, 43.500482 ], [ -91.371608, 43.500945 ], [ -91.369325, 43.500827 ], [ -91.261781, 43.500993 ], [ -91.246715, 43.500488 ], [ -91.217706, 43.500550 ], [ -91.218270, 43.497228 ], [ -91.217615, 43.491008 ], [ -91.215282, 43.484798 ], [ -91.216035, 43.481142 ], [ -91.220399, 43.471306 ], [ -91.224586, 43.465525 ], [ -91.229503, 43.462607 ], [ -91.232241, 43.460018 ], [ -91.233187, 43.457784 ], [ -91.233367, 43.455168 ], [ -91.232276, 43.450952 ], [ -91.228750, 43.445537 ], [ -91.207145, 43.425031 ], [ -91.203144, 43.419805 ], [ -91.201224, 43.415903 ], [ -91.200359, 43.412701 ], [ -91.200527, 43.408486 ], [ -91.199408, 43.403032 ], [ -91.198048, 43.399223 ], [ -91.197670, 43.395334 ], [ -91.198953, 43.389835 ], [ -91.200701, 43.385930 ], [ -91.204831, 43.378887 ], [ -91.206072, 43.374976 ], [ -91.207367, 43.373659 ], [ -91.213360, 43.370097 ], [ -91.214990, 43.368006 ], [ -91.214770, 43.365874 ], [ -91.206620, 43.352524 ], [ -91.203964, 43.349852 ], [ -91.201847, 43.349103 ], [ -91.188014, 43.347602 ], [ -91.181115, 43.345926 ], [ -91.171055, 43.340967 ], [ -91.154806, 43.334826 ], [ -91.137343, 43.329757 ], [ -91.132813, 43.328030 ], [ -91.129121, 43.326350 ], [ -91.117661, 43.319332 ], [ -91.107237, 43.313645 ], [ -91.085652, 43.291870 ], [ -91.079875, 43.282773 ], [ -91.073710, 43.274746 ], [ -91.071724, 43.271392 ], [ -91.071574, 43.268193 ], [ -91.072782, 43.264363 ], [ -91.072649, 43.262129 ], [ -91.071698, 43.261014 ], [ -91.069937, 43.260272 ], [ -91.061798, 43.259952 ], [ -91.059750, 43.259074 ], [ -91.058644, 43.257679 ], [ -91.057918, 43.255366 ], [ -91.057910, 43.253968 ], [ -91.059684, 43.248566 ], [ -91.062562, 43.243165 ], [ -91.066398, 43.239293 ], [ -91.071857, 43.235164 ], [ -91.079278, 43.228259 ], [ -91.087456, 43.221891 ], [ -91.107931, 43.206578 ], [ -91.113749, 43.202908 ], [ -91.119115, 43.200366 ], [ -91.122170, 43.197255 ], [ -91.123896, 43.193536 ], [ -91.124428, 43.187886 ], [ -91.134173, 43.174405 ], [ -91.135917, 43.173422 ], [ -91.138649, 43.169993 ], [ -91.141356, 43.163537 ], [ -91.143283, 43.156413 ], [ -91.146200, 43.152405 ], [ -91.156200, 43.142945 ], [ -91.160449, 43.140575 ], [ -91.170372, 43.137384 ], [ -91.175253, 43.134665 ], [ -91.177003, 43.131846 ], [ -91.177932, 43.128875 ], [ -91.178251, 43.124982 ], [ -91.177728, 43.118733 ], [ -91.175193, 43.103771 ], [ -91.177222, 43.080247 ], [ -91.177264, 43.072983 ], [ -91.178761, 43.070578 ], [ -91.179457, 43.067427 ], [ -91.177894, 43.064206 ], [ -91.178087, 43.062044 ], [ -91.174692, 43.038713 ], [ -91.168283, 43.019426 ], [ -91.157490, 42.991475 ], [ -91.156743, 42.987830 ], [ -91.156562, 42.978226 ], [ -91.155519, 42.975774 ], [ -91.150906, 42.970514 ], [ -91.148001, 42.966155 ], [ -91.146550, 42.963345 ], [ -91.145430, 42.958211 ], [ -91.145540, 42.956510 ], [ -91.149090, 42.946554 ], [ -91.149880, 42.941955 ], [ -91.149784, 42.940244 ], [ -91.145517, 42.930378 ], [ -91.144315, 42.926592 ], [ -91.143800, 42.922877 ], [ -91.143878, 42.920646 ], [ -91.145868, 42.914967 ], [ -91.146182, 42.912338 ], [ -91.146177, 42.909850 ], [ -91.145560, 42.907980 ], [ -91.144706, 42.905964 ], [ -91.143375, 42.904670 ], [ -91.138000, 42.903772 ], [ -91.117411, 42.895837 ], [ -91.115512, 42.894672 ], [ -91.112158, 42.891149 ], [ -91.104051, 42.885971 ], [ -91.100565, 42.883078 ], [ -91.098238, 42.875798 ], [ -91.098820, 42.864421 ], [ -91.097656, 42.859871 ], [ -91.095329, 42.855320 ], [ -91.091837, 42.851225 ], [ -91.091402, 42.849860 ], [ -91.095114, 42.834966 ], [ -91.094060, 42.830813 ], [ -91.090136, 42.829237 ], [ -91.082770, 42.829977 ], [ -91.078665, 42.827678 ], [ -91.079314, 42.820309 ], [ -91.078097, 42.806526 ], [ -91.075481, 42.795466 ], [ -91.072447, 42.787732 ], [ -91.071138, 42.783004 ], [ -91.070716, 42.775502 ], [ -91.069549, 42.769628 ], [ -91.063254, 42.763947 ], [ -91.060261, 42.761847 ], [ -91.060129, 42.759986 ], [ -91.061432, 42.757974 ], [ -91.063120, 42.757273 ], [ -91.065492, 42.757081 ], [ -91.065783, 42.753387 ], [ -91.064680, 42.750914 ], [ -91.060172, 42.750481 ], [ -91.058091, 42.749246 ], [ -91.056297, 42.747341 ], [ -91.054810, 42.744686 ], [ -91.054801, 42.740529 ], [ -91.053733, 42.738238 ], [ -91.051275, 42.737001 ], [ -91.049972, 42.736905 ], [ -91.046571, 42.737167 ], [ -91.044139, 42.738605 ], [ -91.039383, 42.738478 ], [ -91.035418, 42.737340 ], [ -91.032013, 42.734484 ], [ -91.030984, 42.732550 ], [ -91.030718, 42.729684 ], [ -91.029692, 42.726774 ], [ -91.026786, 42.724228 ], [ -91.017239, 42.719566 ], [ -91.015687, 42.719229 ], [ -91.009577, 42.720123 ], [ -91.000128, 42.716189 ], [ -90.995536, 42.713704 ], [ -90.988776, 42.708724 ], [ -90.980578, 42.698932 ], [ -90.977735, 42.696816 ], [ -90.974237, 42.695249 ], [ -90.965048, 42.693233 ], [ -90.952415, 42.686778 ], [ -90.949213, 42.685573 ], [ -90.941567, 42.683844 ], [ -90.937045, 42.683399 ], [ -90.929881, 42.684128 ], [ -90.923634, 42.685500 ], [ -90.921155, 42.685406 ], [ -90.913400, 42.682949 ], [ -90.900261, 42.676254 ], [ -90.887430, 42.672470 ], [ -90.867125, 42.668728 ], [ -90.852497, 42.664822 ], [ -90.843910, 42.663071 ], [ -90.832702, 42.661662 ], [ -90.797017, 42.655772 ], [ -90.788226, 42.653888 ], [ -90.778752, 42.652965 ], [ -90.769495, 42.651443 ], [ -90.760389, 42.649131 ], [ -90.743677, 42.645560 ], [ -90.731132, 42.643437 ], [ -90.720209, 42.640758 ], [ -90.709204, 42.636078 ], [ -90.706303, 42.634169 ], [ -90.702671, 42.630756 ], [ -90.700856, 42.626445 ], [ -90.700095, 42.622461 ], [ -90.693999, 42.614509 ], [ -90.692031, 42.610366 ], [ -90.687999, 42.599198 ], [ -90.687775, 42.594606 ], [ -90.686975, 42.591774 ], [ -90.685487, 42.589614 ], [ -90.679375, 42.581503 ], [ -90.677055, 42.579215 ], [ -90.672727, 42.576599 ], [ -90.661527, 42.567999 ], [ -90.659127, 42.557900 ], [ -90.654127, 42.549900 ], [ -90.645627, 42.544100 ], [ -90.643927, 42.540401 ], [ -90.640627, 42.527701 ], [ -90.636727, 42.518702 ], [ -90.636927, 42.513202 ], [ -90.640927, 42.508302 ], [ -90.648627, 42.498102 ], [ -90.655927, 42.491703 ], [ -90.656527, 42.489203 ], [ -90.656327, 42.483603 ], [ -90.654027, 42.478503 ], [ -90.646727, 42.471904 ], [ -90.624328, 42.458904 ], [ -90.606328, 42.451505 ], [ -90.590416, 42.447493 ], [ -90.582128, 42.444437 ], [ -90.570736, 42.441701 ], [ -90.567968, 42.440389 ], [ -90.565248, 42.438742 ], [ -90.560439, 42.432897 ], [ -90.558801, 42.428517 ], [ -90.558168, 42.420984 ], [ -90.557550, 42.419258 ], [ -90.555018, 42.416138 ], [ -90.548068, 42.413115 ], [ -90.517516, 42.403019 ], [ -90.506829, 42.398792 ], [ -90.500128, 42.395539 ], [ -90.495766, 42.392406 ], [ -90.490334, 42.387093 ], [ -90.487154, 42.385141 ], [ -90.484621, 42.384530 ], [ -90.480148, 42.384616 ], [ -90.477279, 42.383794 ], [ -90.474121, 42.381729 ], [ -90.470273, 42.378355 ], [ -90.464788, 42.369452 ], [ -90.462619, 42.367253 ], [ -90.452724, 42.359303 ], [ -90.446320, 42.357041 ], [ -90.443874, 42.355218 ], [ -90.430546, 42.336860 ], [ -90.425363, 42.332615 ], [ -90.421350, 42.330472 ], [ -90.419027, 42.328505 ], [ -90.416535, 42.325109 ], [ -90.415937, 42.322699 ], [ -90.416200, 42.321314 ], [ -90.417125, 42.319943 ], [ -90.420075, 42.317681 ], [ -90.421047, 42.316109 ], [ -90.420300, 42.311690 ], [ -90.420454, 42.305374 ], [ -90.424326, 42.293326 ], [ -90.426909, 42.290719 ], [ -90.430735, 42.284211 ], [ -90.430884, 42.278230 ], [ -90.424098, 42.266364 ], [ -90.422181, 42.259899 ], [ -90.419326, 42.254467 ], [ -90.416315, 42.251679 ], [ -90.410471, 42.247749 ], [ -90.400653, 42.239293 ], [ -90.395883, 42.233133 ], [ -90.394749, 42.229059 ], [ -90.391108, 42.225473 ], [ -90.375129, 42.214811 ], [ -90.365138, 42.210526 ], [ -90.356964, 42.205445 ], [ -90.338169, 42.203321 ], [ -90.328273, 42.201047 ], [ -90.317774, 42.193789 ], [ -90.298442, 42.187576 ], [ -90.282173, 42.178846 ], [ -90.269080, 42.174500 ], [ -90.255456, 42.171821 ], [ -90.250129, 42.171469 ], [ -90.234919, 42.165431 ], [ -90.224244, 42.160028 ], [ -90.216107, 42.156730 ], [ -90.209479, 42.152680 ], [ -90.207421, 42.149109 ], [ -90.206369, 42.145500 ], [ -90.205360, 42.139079 ], [ -90.201404, 42.130937 ], [ -90.197342, 42.128163 ], [ -90.190452, 42.125779 ], [ -90.187474, 42.125423 ], [ -90.170970, 42.125198 ], [ -90.167533, 42.122475 ], [ -90.162895, 42.116718 ], [ -90.161884, 42.113780 ], [ -90.161159, 42.106372 ], [ -90.161504, 42.098912 ], [ -90.163405, 42.087613 ], [ -90.168358, 42.075779 ], [ -90.165555, 42.062638 ], [ -90.165294, 42.050973 ], [ -90.164485, 42.042105 ], [ -90.163446, 42.040407 ], [ -90.158829, 42.037769 ], [ -90.154221, 42.033073 ], [ -90.151579, 42.030633 ], [ -90.150916, 42.029440 ], [ -90.149733, 42.026564 ], [ -90.149112, 42.022679 ], [ -90.148096, 42.020014 ], [ -90.143776, 42.014881 ], [ -90.141167, 42.008931 ], [ -90.140061, 42.003252 ], [ -90.140613, 41.995999 ], [ -90.146033, 41.988139 ], [ -90.146225, 41.981329 ], [ -90.148599, 41.978269 ], [ -90.153834, 41.974116 ], [ -90.162141, 41.961293 ], [ -90.164135, 41.956178 ], [ -90.164939, 41.948861 ], [ -90.163847, 41.944934 ], [ -90.160648, 41.940845 ], [ -90.156902, 41.938181 ], [ -90.152659, 41.933058 ], [ -90.151600, 41.931002 ], [ -90.153362, 41.915593 ], [ -90.153584, 41.906614 ], [ -90.157019, 41.898019 ], [ -90.165065, 41.883777 ], [ -90.170041, 41.876439 ], [ -90.172765, 41.866149 ], [ -90.173006, 41.857402 ], [ -90.175051, 41.853629 ], [ -90.181401, 41.844647 ], [ -90.181901, 41.843216 ], [ -90.183765, 41.836240 ], [ -90.183973, 41.833070 ], [ -90.181720, 41.822599 ], [ -90.180643, 41.811979 ], [ -90.180954, 41.809354 ], [ -90.181973, 41.807070 ], [ -90.187969, 41.803163 ], [ -90.216889, 41.795335 ], [ -90.222263, 41.793133 ], [ -90.248631, 41.779805 ], [ -90.258622, 41.775295 ], [ -90.263286, 41.772112 ], [ -90.278633, 41.767358 ], [ -90.302782, 41.750031 ], [ -90.310708, 41.742214 ], [ -90.315220, 41.734264 ], [ -90.317668, 41.722690 ], [ -90.317421, 41.718333 ], [ -90.313320, 41.709494 ], [ -90.312893, 41.707528 ], [ -90.312770, 41.702426 ], [ -90.313435, 41.698082 ], [ -90.314687, 41.694830 ], [ -90.317315, 41.691670 ], [ -90.319924, 41.689721 ], [ -90.330222, 41.683954 ], [ -90.332481, 41.682146 ], [ -90.334525, 41.679559 ], [ -90.336729, 41.664532 ], [ -90.343452, 41.646959 ], [ -90.343330, 41.640855 ], [ -90.339528, 41.598633 ], [ -90.341528, 41.590633 ], [ -90.343228, 41.587833 ], [ -90.364128, 41.579633 ], [ -90.381329, 41.576633 ], [ -90.397930, 41.572233 ], [ -90.412830, 41.565333 ], [ -90.415830, 41.562933 ], [ -90.422230, 41.554233 ], [ -90.427231, 41.551533 ], [ -90.432731, 41.549533 ], [ -90.438431, 41.544133 ], [ -90.445231, 41.536133 ], [ -90.461432, 41.523533 ], [ -90.474332, 41.519733 ], [ -90.489933, 41.518233 ], [ -90.500633, 41.518033 ], [ -90.513134, 41.519533 ], [ -90.533035, 41.524933 ], [ -90.540935, 41.526133 ], [ -90.556235, 41.524232 ], [ -90.567236, 41.517532 ], [ -90.571136, 41.516332 ], [ -90.582036, 41.515132 ], [ -90.591037, 41.512832 ], [ -90.595237, 41.511032 ], [ -90.602137, 41.506032 ], [ -90.604237, 41.497032 ], [ -90.605937, 41.494232 ], [ -90.618537, 41.485032 ], [ -90.632538, 41.478732 ], [ -90.640238, 41.473332 ], [ -90.650238, 41.465032 ], [ -90.655839, 41.462132 ], [ -90.666239, 41.460632 ], [ -90.676439, 41.460832 ], [ -90.690951, 41.456643 ], [ -90.701159, 41.454743 ], [ -90.723545, 41.452248 ], [ -90.737537, 41.450127 ], [ -90.750142, 41.449632 ], [ -90.771672, 41.450761 ], [ -90.777583, 41.451261 ], [ -90.786282, 41.452888 ], [ -90.807283, 41.454466 ], [ -90.824736, 41.454467 ], [ -90.837414, 41.455623 ], [ -90.846558, 41.455141 ], [ -90.853604, 41.453909 ], [ -90.857554, 41.452751 ], [ -90.867282, 41.448215 ], [ -90.879778, 41.441065 ], [ -90.890787, 41.435432 ], [ -90.900471, 41.431154 ], [ -90.919351, 41.425589 ], [ -90.924343, 41.422860 ], [ -90.930016, 41.421404 ], [ -90.949791, 41.424163 ], [ -90.953198, 41.425075 ], [ -90.966662, 41.430051 ], [ -90.975168, 41.433985 ], [ -90.979815, 41.434321 ], [ -90.984898, 41.433869 ], [ -91.005846, 41.426135 ], [ -91.011980, 41.425024 ], [ -91.027787, 41.423603 ], [ -91.037131, 41.420017 ], [ -91.039872, 41.418523 ], [ -91.043988, 41.415897 ], [ -91.045890, 41.414085 ], [ -91.047819, 41.410900 ], [ -91.050328, 41.400049 ], [ -91.051010, 41.387556 ], [ -91.051580, 41.385283 ], [ -91.065058, 41.369101 ], [ -91.066520, 41.365246 ], [ -91.071552, 41.339651 ], [ -91.073233, 41.313440 ], [ -91.074841, 41.305578 ], [ -91.077505, 41.301828 ], [ -91.086880, 41.294371 ], [ -91.092034, 41.286911 ], [ -91.101142, 41.267169 ], [ -91.104462, 41.262104 ], [ -91.110304, 41.256088 ], [ -91.114186, 41.250029 ], [ -91.113648, 41.241401 ], [ -91.112333, 41.239003 ], [ -91.109562, 41.236567 ], [ -91.100829, 41.230532 ], [ -91.093018, 41.222635 ], [ -91.081445, 41.214429 ], [ -91.072980, 41.207151 ], [ -91.065899, 41.199517 ], [ -91.055069, 41.185766 ], [ -91.041536, 41.166138 ], [ -91.030029, 41.163540 ], [ -91.027214, 41.163373 ], [ -91.012557, 41.165922 ], [ -91.007586, 41.166183 ], [ -90.997906, 41.162564 ], [ -90.994960, 41.160624 ], [ -90.989663, 41.155716 ], [ -90.981311, 41.142659 ], [ -90.970851, 41.130107 ], [ -90.965905, 41.119559 ], [ -90.957246, 41.111085 ], [ -90.946627, 41.096632 ], [ -90.946259, 41.094734 ], [ -90.948207, 41.084413 ], [ -90.949383, 41.072711 ], [ -90.949136, 41.070611 ], [ -90.945549, 41.061730 ], [ -90.944577, 41.052255 ], [ -90.943652, 41.048637 ], [ -90.942320, 41.038472 ], [ -90.942253, 41.034702 ], [ -90.945324, 41.019279 ], [ -90.945054, 41.011917 ], [ -90.945949, 41.006495 ], [ -90.949634, 40.995248 ], [ -90.955201, 40.986805 ], [ -90.958142, 40.979767 ], [ -90.958089, 40.976643 ], [ -90.955111, 40.969858 ], [ -90.952715, 40.962087 ], [ -90.951967, 40.958238 ], [ -90.952233, 40.954047 ], [ -90.960462, 40.936356 ], [ -90.962916, 40.924957 ], [ -90.965344, 40.921633 ], [ -90.968995, 40.919127 ], [ -90.979190, 40.915522 ], [ -90.985462, 40.912141 ], [ -90.998500, 40.908120 ], [ -91.003536, 40.905146 ], [ -91.009536, 40.900565 ], [ -91.013240, 40.896622 ], [ -91.021562, 40.884021 ], [ -91.027489, 40.879173 ], [ -91.036789, 40.875038 ], [ -91.039097, 40.873565 ], [ -91.044653, 40.868356 ], [ -91.047344, 40.864654 ], [ -91.050241, 40.858514 ], [ -91.056430, 40.848387 ], [ -91.058749, 40.846309 ], [ -91.067159, 40.841997 ], [ -91.077521, 40.833405 ], [ -91.090072, 40.824638 ], [ -91.092993, 40.821079 ], [ -91.096846, 40.811617 ], [ -91.097649, 40.805575 ], [ -91.097031, 40.802471 ], [ -91.092256, 40.792909 ], [ -91.091246, 40.786724 ], [ -91.091703, 40.779708 ], [ -91.096133, 40.767134 ], [ -91.098105, 40.763233 ], [ -91.102486, 40.757076 ], [ -91.108200, 40.750935 ], [ -91.110424, 40.745528 ], [ -91.115735, 40.725168 ], [ -91.115158, 40.721895 ], [ -91.113885, 40.719532 ], [ -91.111095, 40.708282 ], [ -91.110927, 40.703262 ], [ -91.111940, 40.697018 ], [ -91.115407, 40.691825 ], [ -91.119632, 40.675892 ], [ -91.120820, 40.672777 ], [ -91.122421, 40.670675 ], [ -91.123928, 40.669152 ], [ -91.138055, 40.660893 ], [ -91.154293, 40.653596 ], [ -91.186980, 40.637297 ], [ -91.197906, 40.636107 ], [ -91.218437, 40.638437 ], [ -91.247851, 40.638390 ], [ -91.253074, 40.637962 ], [ -91.258249, 40.636672 ], [ -91.264953, 40.633893 ], [ -91.276175, 40.632240 ], [ -91.306524, 40.626231 ], [ -91.339719, 40.613488 ], [ -91.348733, 40.609695 ], [ -91.353989, 40.606553 ], [ -91.359873, 40.601805 ], [ -91.374252, 40.582590 ], [ -91.379752, 40.574450 ], [ -91.401482, 40.559458 ], [ -91.405241, 40.554641 ], [ -91.406373, 40.551831 ], [ -91.406851, 40.547557 ], [ -91.406202, 40.542698 ], [ -91.404125, 40.539127 ], [ -91.400725, 40.536789 ], [ -91.394475, 40.534543 ], [ -91.388067, 40.533069 ], [ -91.384531, 40.530948 ], [ -91.381857, 40.528247 ], [ -91.369059, 40.512532 ], [ -91.367876, 40.510479 ], [ -91.364211, 40.500043 ], [ -91.363683, 40.494211 ], [ -91.363910, 40.490122 ], [ -91.364915, 40.484168 ], [ -91.368074, 40.474642 ], [ -91.378144, 40.456394 ], [ -91.379907, 40.452110 ], [ -91.381468, 40.446040 ], [ -91.381769, 40.442555 ], [ -91.380965, 40.435395 ], [ -91.377625, 40.426335 ], [ -91.373721, 40.417891 ], [ -91.372450, 40.411475 ], [ -91.372554, 40.401200 ], [ -91.372921, 40.399108 ], [ -91.375746, 40.391879 ], [ -91.378422, 40.389670 ], [ -91.381958, 40.387632 ], [ -91.388360, 40.384929 ], [ -91.396996, 40.383127 ], [ -91.413011, 40.382277 ], [ -91.415695, 40.381381 ], [ -91.419422, 40.378264 ], [ -91.422324, 40.380939 ], [ -91.425662, 40.382491 ], [ -91.441243, 40.386255 ], [ -91.448441, 40.378914 ], [ -91.452458, 40.375501 ], [ -91.463895, 40.375659 ], [ -91.465009, 40.376223 ], [ -91.465891, 40.378365 ], [ -91.464681, 40.380949 ], [ -91.465116, 40.385257 ], [ -91.471967, 40.382884 ], [ -91.480251, 40.381783 ], [ -91.482322, 40.382057 ], [ -91.484507, 40.383900 ], [ -91.490977, 40.393484 ], [ -91.490816, 40.395225 ], [ -91.488597, 40.400009 ], [ -91.487955, 40.402465 ], [ -91.487829, 40.403866 ], [ -91.488481, 40.404317 ], [ -91.489816, 40.404317 ], [ -91.493644, 40.402433 ], [ -91.498093, 40.401926 ], [ -91.505272, 40.403512 ], [ -91.506745, 40.404335 ], [ -91.507427, 40.405524 ], [ -91.509063, 40.406775 ], [ -91.513993, 40.408537 ], [ -91.518392, 40.408682 ], [ -91.522333, 40.409648 ], [ -91.524612, 40.410765 ], [ -91.526425, 40.413404 ], [ -91.527057, 40.416689 ], [ -91.526555, 40.419872 ], [ -91.521388, 40.426488 ], [ -91.519012, 40.431298 ], [ -91.519134, 40.432822 ], [ -91.519935, 40.433673 ], [ -91.525000, 40.433483 ], [ -91.529132, 40.434272 ], [ -91.532807, 40.436784 ], [ -91.533623, 40.438320 ], [ -91.533548, 40.440804 ], [ -91.531912, 40.442730 ], [ -91.526108, 40.446634 ], [ -91.524053, 40.448437 ], [ -91.523271, 40.450061 ], [ -91.523072, 40.452254 ], [ -91.523864, 40.456331 ], [ -91.525090, 40.457845 ], [ -91.526155, 40.458625 ], [ -91.528600, 40.459002 ], [ -91.543785, 40.458149 ], [ -91.552691, 40.458769 ], [ -91.563844, 40.460988 ], [ -91.567743, 40.462290 ], [ -91.574746, 40.465664 ], [ -91.580355, 40.471015 ], [ -91.581528, 40.472876 ], [ -91.582437, 40.474703 ], [ -91.583315, 40.479118 ], [ -91.586884, 40.487233 ], [ -91.590817, 40.492292 ], [ -91.594644, 40.494997 ], [ -91.608347, 40.500040 ], [ -91.612821, 40.502377 ], [ -91.616948, 40.504794 ], [ -91.619486, 40.507134 ], [ -91.621353, 40.510072 ], [ -91.622362, 40.514362 ], [ -91.622196, 40.517040 ], [ -91.618793, 40.526286 ], [ -91.618028, 40.534030 ], [ -91.618999, 40.539084 ], [ -91.620071, 40.540817 ], [ -91.621900, 40.542292 ], [ -91.625161, 40.543500 ], [ -91.638082, 40.545541 ], [ -91.654345, 40.549189 ], [ -91.670993, 40.550937 ], [ -91.681714, 40.553035 ], [ -91.688700, 40.557390 ], [ -91.690804, 40.559893 ], [ -91.691591, 40.562222 ], [ -91.691557, 40.564867 ], [ -91.685723, 40.576785 ], [ -91.685381, 40.578892 ], [ -91.686357, 40.580875 ], [ -91.688820, 40.583409 ], [ -91.696359, 40.588148 ], [ -91.712025, 40.595046 ], [ -91.716769, 40.598530 ], [ -91.720058, 40.601527 ], [ -91.729115, 40.613640 ], [ -91.785916, 40.611488 ], [ -91.795374, 40.611101 ], [ -91.800133, 40.610953 ], [ -91.813968, 40.610526 ], [ -91.824826, 40.610191 ], [ -91.832481, 40.609797 ], [ -91.868401, 40.608059 ], [ -91.939292, 40.606150 ], [ -91.947708, 40.605471 ], [ -91.970988, 40.605112 ], [ -91.998683, 40.604433 ], [ -92.029649, 40.603713 ], [ -92.067904, 40.602648 ], [ -92.069521, 40.602772 ], [ -92.082339, 40.602176 ], [ -92.083200, 40.602244 ], [ -92.092875, 40.602082 ], [ -92.096387, 40.601830 ], [ -92.179780, 40.600529 ], [ -92.196162, 40.600069 ], [ -92.201669, 40.599980 ], [ -92.217603, 40.599832 ], [ -92.236484, 40.599531 ], [ -92.298754, 40.598469 ], [ -92.331205, 40.597805 ], [ -92.331445, 40.597714 ], [ -92.350776, 40.597274 ], [ -92.379691, 40.596509 ], [ -92.453745, 40.595288 ], [ -92.461609, 40.595355 ], [ -92.481692, 40.594941 ], [ -92.482394, 40.594894 ], [ -92.484588, 40.594924 ], [ -92.580278, 40.592151 ], [ -92.637898, 40.590853 ], [ -92.639223, 40.590825 ], [ -92.686693, 40.589809 ], [ -92.689854, 40.589884 ], [ -92.742232, 40.589207 ], [ -92.757407, 40.588908 ], [ -92.828061, 40.588593 ], [ -92.827992, 40.588515 ], [ -92.835074, 40.588484 ], [ -92.857391, 40.588360 ], [ -92.863034, 40.588175 ], [ -92.879178, 40.588341 ], [ -92.889796, 40.588039 ], [ -92.903544, 40.587860 ], [ -92.941595, 40.587743 ], [ -92.957747, 40.587430 ], [ -93.085517, 40.584403 ], [ -93.097296, 40.584014 ], [ -93.098507, 40.583973 ], [ -93.135802, 40.582854 ], [ -93.260612, 40.580797 ], [ -93.317605, 40.580671 ], [ -93.345442, 40.580514 ], [ -93.441767, 40.579916 ], [ -93.465297, 40.580164 ], [ -93.466887, 40.580072 ], [ -93.524124, 40.580481 ], [ -93.527607, 40.580436 ], [ -93.528177, 40.580367 ], [ -93.548284, 40.580417 ], [ -93.553986, 40.580303 ], [ -93.556899, 40.580235 ], [ -93.558938, 40.580189 ], [ -93.560798, 40.580304 ], [ -93.565240, 40.580143 ], [ -93.565810, 40.580075 ], [ -93.566189, 40.580117 ], [ -93.597352, 40.579496 ], [ -93.656211, 40.578352 ], [ -93.659272, 40.578330 ], [ -93.661913, 40.578354 ], [ -93.668845, 40.578241 ], [ -93.677099, 40.578127 ], [ -93.690333, 40.577875 ], [ -93.722443, 40.577641 ], [ -93.728355, 40.577547 ], [ -93.737259, 40.577542 ], [ -93.742759, 40.577518 ], [ -93.750223, 40.577720 ], [ -93.770231, 40.577615 ], [ -93.815485, 40.577278 ], [ -93.818725, 40.577086 ], [ -93.840930, 40.576791 ], [ -93.853656, 40.576606 ], [ -93.898327, 40.576011 ], [ -93.899317, 40.575942 ], [ -93.900877, 40.575874 ], [ -93.913961, 40.575672 ], [ -93.935687, 40.575330 ], [ -93.936317, 40.575284 ], [ -93.937097, 40.575421 ], [ -93.938627, 40.575284 ], [ -93.939857, 40.575192 ], [ -93.963863, 40.574754 ], [ -93.976766, 40.574635 ], [ -94.015492, 40.573914 ], [ -94.034134, 40.573585 ], [ -94.080223, 40.572899 ], [ -94.080463, 40.572899 ], [ -94.089194, 40.572806 ], [ -94.091085, 40.572897 ], [ -94.287350, 40.571521 ], [ -94.294813, 40.571341 ], [ -94.310724, 40.571524 ], [ -94.324765, 40.571477 ], [ -94.336556, 40.571475 ], [ -94.336706, 40.571452 ], [ -94.358307, 40.571363 ], [ -94.429725, 40.571041 ], [ -94.460088, 40.570947 ], [ -94.470648, 40.570830 ], [ -94.471213, 40.570825 ], [ -94.489280, 40.570707 ], [ -94.533878, 40.570739 ], [ -94.537058, 40.570763 ], [ -94.538318, 40.570763 ], [ -94.541828, 40.570809 ], [ -94.542154, 40.570809 ], [ -94.594001, 40.570966 ], [ -94.632032, 40.571186 ], [ -94.682601, 40.571787 ], [ -94.714925, 40.572201 ], [ -94.716665, 40.572201 ], [ -94.773988, 40.572977 ], [ -94.811188, 40.573532 ], [ -94.819978, 40.573714 ], [ -94.823758, 40.573942 ], [ -94.896801, 40.574738 ], [ -94.901451, 40.574877 ], [ -94.914896, 40.575068 ], [ -94.955134, 40.575669 ], [ -94.966491, 40.575839 ], [ -94.991661, 40.575692 ], [ -95.068921, 40.576880 ], [ -95.079742, 40.577007 ], [ -95.097607, 40.577168 ], [ -95.107213, 40.577116 ], [ -95.110303, 40.577160 ], [ -95.110663, 40.577206 ], [ -95.112222, 40.577228 ], [ -95.120829, 40.577413 ], [ -95.154499, 40.577860 ], [ -95.164058, 40.578017 ], [ -95.211408, 40.578650 ], [ -95.211590, 40.578654 ], [ -95.212715, 40.578679 ], [ -95.213327, 40.578689 ], [ -95.217455, 40.578759 ], [ -95.218783, 40.578781 ], [ -95.221525, 40.578827 ], [ -95.335588, 40.579871 ], [ -95.357802, 40.580100 ], [ -95.373893, 40.580501 ], [ -95.415406, 40.581014 ], [ -95.469319, 40.581540 ], [ -95.525392, 40.582090 ], [ -95.526682, 40.582136 ], [ -95.533182, 40.582249 ], [ -95.554959, 40.582629 ], [ -95.574046, 40.582963 ], [ -95.611069, 40.583495 ], [ -95.641840, 40.584234 ], [ -95.687442, 40.584380 ], [ -95.687500, 40.584381 ], [ -95.746443, 40.584935 ], [ -95.765645, 40.585208 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US20", "STATE": "20", "NAME": "Kansas", "LSAD": "", "CENSUSAREA": 81758.717000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -94.618080, 36.998135 ], [ -94.625224, 36.998672 ], [ -94.699735, 36.998805 ], [ -94.701797, 36.998814 ], [ -94.712770, 36.998794 ], [ -94.737183, 36.998665 ], [ -94.739324, 36.998687 ], [ -94.777257, 36.998764 ], [ -94.831280, 36.998812 ], [ -94.840926, 36.998833 ], [ -94.849801, 36.998876 ], [ -94.853197, 36.998874 ], [ -94.995293, 36.999529 ], [ -95.007620, 36.999514 ], [ -95.011433, 36.999535 ], [ -95.030324, 36.999517 ], [ -95.037857, 36.999497 ], [ -95.049499, 36.999580 ], [ -95.073509, 36.999509 ], [ -95.155187, 36.999539 ], [ -95.155372, 36.999540 ], [ -95.177301, 36.999520 ], [ -95.195307, 36.999565 ], [ -95.322565, 36.999358 ], [ -95.328058, 36.999365 ], [ -95.328327, 36.999366 ], [ -95.331210, 36.999380 ], [ -95.407683, 36.999241 ], [ -95.511578, 36.999235 ], [ -95.534401, 36.999332 ], [ -95.573598, 36.999310 ], [ -95.612140, 36.999321 ], [ -95.615934, 36.999365 ], [ -95.624350, 36.999360 ], [ -95.630079, 36.999320 ], [ -95.664301, 36.999322 ], [ -95.686452, 36.999349 ], [ -95.696659, 36.999215 ], [ -95.710380, 36.999371 ], [ -95.714887, 36.999279 ], [ -95.718054, 36.999255 ], [ -95.741908, 36.999244 ], [ -95.759905, 36.999271 ], [ -95.768719, 36.999205 ], [ -95.786762, 36.999310 ], [ -95.807980, 36.999124 ], [ -95.866899, 36.999261 ], [ -95.873944, 36.999300 ], [ -95.875257, 36.999302 ], [ -95.877151, 36.999304 ], [ -95.910180, 36.999336 ], [ -95.928122, 36.999245 ], [ -95.936992, 36.999268 ], [ -96.000810, 36.998860 ], [ -96.141210, 36.998973 ], [ -96.143207, 36.999134 ], [ -96.147143, 36.999022 ], [ -96.149709, 36.999040 ], [ -96.152384, 36.999051 ], [ -96.154017, 36.999161 ], [ -96.184768, 36.999211 ], [ -96.200028, 36.999028 ], [ -96.217571, 36.999070 ], [ -96.276368, 36.999271 ], [ -96.279079, 36.999272 ], [ -96.394272, 36.999221 ], [ -96.415412, 36.999113 ], [ -96.500288, 36.998643 ], [ -96.705431, 36.999203 ], [ -96.710482, 36.999271 ], [ -96.736590, 36.999286 ], [ -96.741270, 36.999239 ], [ -96.749838, 36.998988 ], [ -96.792060, 36.999180 ], [ -96.795199, 36.998860 ], [ -96.822791, 36.999182 ], [ -96.867517, 36.999217 ], [ -96.876290, 36.999233 ], [ -96.902083, 36.999155 ], [ -96.903510, 36.999132 ], [ -96.917093, 36.999182 ], [ -96.921915, 36.999151 ], [ -96.934642, 36.999070 ], [ -96.967371, 36.999067 ], [ -96.975562, 36.999019 ], [ -97.030082, 36.998929 ], [ -97.039784, 36.999000 ], [ -97.100652, 36.998998 ], [ -97.104276, 36.999020 ], [ -97.120285, 36.999014 ], [ -97.122597, 36.999036 ], [ -97.147721, 36.999111 ], [ -97.372421, 36.998861 ], [ -97.384925, 36.998843 ], [ -97.462280, 36.998685 ], [ -97.472861, 36.998721 ], [ -97.527292, 36.998750 ], [ -97.545900, 36.998709 ], [ -97.546498, 36.998747 ], [ -97.564536, 36.998711 ], [ -97.606549, 36.998682 ], [ -97.637137, 36.999090 ], [ -97.650466, 36.999004 ], [ -97.697104, 36.998826 ], [ -97.768704, 36.998750 ], [ -97.783432, 36.998961 ], [ -97.783489, 36.998847 ], [ -97.802298, 36.998713 ], [ -98.033955, 36.998366 ], [ -98.039890, 36.998349 ], [ -98.045342, 36.998327 ], [ -98.111985, 36.998133 ], [ -98.147452, 36.998162 ], [ -98.177596, 36.998009 ], [ -98.208218, 36.997997 ], [ -98.219499, 36.997824 ], [ -98.237712, 36.997972 ], [ -98.346188, 36.997962 ], [ -98.354073, 36.997961 ], [ -98.408991, 36.998513 ], [ -98.418268, 36.998538 ], [ -98.420209, 36.998516 ], [ -98.544872, 36.998997 ], [ -98.714512, 36.999060 ], [ -98.718465, 36.999180 ], [ -98.761597, 36.999425 ], [ -98.791936, 36.999255 ], [ -98.793711, 36.999227 ], [ -98.797452, 36.999229 ], [ -98.869449, 36.999286 ], [ -98.880009, 36.999263 ], [ -98.880580, 36.999309 ], [ -98.994371, 36.999493 ], [ -99.029337, 36.999595 ], [ -99.049695, 36.999221 ], [ -99.124883, 36.999420 ], [ -99.129449, 36.999422 ], [ -99.248120, 36.999565 ], [ -99.277506, 36.999579 ], [ -99.375391, 37.000177 ], [ -99.407015, 36.999579 ], [ -99.456203, 36.999471 ], [ -99.484333, 36.999626 ], [ -99.500395, 36.999576 ], [ -99.500395, 36.999637 ], [ -99.502665, 36.999645 ], [ -99.504093, 36.999648 ], [ -99.508574, 36.999658 ], [ -99.558068, 36.999528 ], [ -99.625399, 36.999671 ], [ -99.648652, 36.999604 ], [ -99.657658, 37.000197 ], [ -99.774255, 37.000837 ], [ -99.774816, 37.000841 ], [ -99.786016, 37.000931 ], [ -99.875409, 37.001659 ], [ -99.995201, 37.001631 ], [ -100.001286, 37.001699 ], [ -100.002563, 37.001706 ], [ -100.005706, 37.001726 ], [ -100.115722, 37.002206 ], [ -100.187547, 37.002082 ], [ -100.192371, 37.002036 ], [ -100.193754, 37.002133 ], [ -100.201676, 37.002081 ], [ -100.551598, 37.000620 ], [ -100.552683, 37.000735 ], [ -100.591328, 37.000376 ], [ -100.591413, 37.000399 ], [ -100.629770, 37.000025 ], [ -100.633327, 36.999936 ], [ -100.675552, 36.999688 ], [ -100.734517, 36.999059 ], [ -100.756894, 36.999357 ], [ -100.765484, 36.999177 ], [ -100.806116, 36.999091 ], [ -100.814277, 36.999085 ], [ -100.855634, 36.998626 ], [ -100.891660, 36.998604 ], [ -100.904274, 36.998745 ], [ -100.904588, 36.998561 ], [ -100.945566, 36.998152 ], [ -100.996502, 36.998044 ], [ -101.012641, 36.998176 ], [ -101.053589, 36.997967 ], [ -101.066742, 36.997921 ], [ -101.211486, 36.997124 ], [ -101.212909, 36.997044 ], [ -101.357797, 36.996271 ], [ -101.359674, 36.996232 ], [ -101.378180, 36.996164 ], [ -101.413868, 36.996008 ], [ -101.415005, 36.995966 ], [ -101.485326, 36.995611 ], [ -101.519066, 36.995546 ], [ -101.555239, 36.995414 ], [ -101.600396, 36.995153 ], [ -101.601593, 36.995095 ], [ -101.902440, 36.993702 ], [ -102.000447, 36.993249 ], [ -102.000447, 36.993272 ], [ -102.028207, 36.993125 ], [ -102.042240, 36.993083 ], [ -102.041952, 37.024742 ], [ -102.041950, 37.030805 ], [ -102.041921, 37.032178 ], [ -102.041749, 37.034397 ], [ -102.041920, 37.035083 ], [ -102.041983, 37.106551 ], [ -102.041809, 37.111973 ], [ -102.042092, 37.125021 ], [ -102.042135, 37.125021 ], [ -102.042002, 37.141744 ], [ -102.041963, 37.258164 ], [ -102.041664, 37.297650 ], [ -102.041817, 37.309490 ], [ -102.041974, 37.352613 ], [ -102.042089, 37.352819 ], [ -102.041524, 37.375018 ], [ -102.041676, 37.409898 ], [ -102.041669, 37.434740 ], [ -102.041755, 37.434855 ], [ -102.041801, 37.469488 ], [ -102.041786, 37.506066 ], [ -102.042016, 37.535261 ], [ -102.041899, 37.541186 ], [ -102.041894, 37.557977 ], [ -102.041618, 37.607868 ], [ -102.041585, 37.644282 ], [ -102.041582, 37.654495 ], [ -102.041694, 37.665681 ], [ -102.041574, 37.680436 ], [ -102.041876, 37.723875 ], [ -102.042158, 37.760164 ], [ -102.042668, 37.788758 ], [ -102.042953, 37.803535 ], [ -102.043033, 37.824146 ], [ -102.043219, 37.867929 ], [ -102.043845, 37.926135 ], [ -102.043844, 37.928102 ], [ -102.044644, 38.045532 ], [ -102.044255, 38.113011 ], [ -102.044589, 38.125013 ], [ -102.044251, 38.141778 ], [ -102.044398, 38.250015 ], [ -102.044568, 38.268819 ], [ -102.044613, 38.312324 ], [ -102.044944, 38.384419 ], [ -102.044442, 38.415802 ], [ -102.044936, 38.419680 ], [ -102.045324, 38.453647 ], [ -102.045263, 38.505395 ], [ -102.045262, 38.505532 ], [ -102.045112, 38.523784 ], [ -102.045223, 38.543797 ], [ -102.045189, 38.558732 ], [ -102.045211, 38.581609 ], [ -102.045288, 38.615249 ], [ -102.045074, 38.669617 ], [ -102.045102, 38.674946 ], [ -102.045160, 38.675221 ], [ -102.045127, 38.686725 ], [ -102.045156, 38.688555 ], [ -102.045212, 38.697567 ], [ -102.045375, 38.754339 ], [ -102.045287, 38.755528 ], [ -102.045371, 38.770064 ], [ -102.045448, 38.783453 ], [ -102.045334, 38.799463 ], [ -102.045388, 38.813392 ], [ -102.046571, 39.047038 ], [ -102.047134, 39.129701 ], [ -102.047250, 39.137020 ], [ -102.048449, 39.303138 ], [ -102.048960, 39.373712 ], [ -102.049167, 39.403597 ], [ -102.049370, 39.418210 ], [ -102.049369, 39.423333 ], [ -102.049679, 39.506183 ], [ -102.049673, 39.536691 ], [ -102.049554, 39.538932 ], [ -102.049806, 39.574058 ], [ -102.049954, 39.592331 ], [ -102.050422, 39.646048 ], [ -102.050099, 39.653812 ], [ -102.050594, 39.675594 ], [ -102.051254, 39.818992 ], [ -102.051318, 39.833311 ], [ -102.051363, 39.843471 ], [ -102.051569, 39.849805 ], [ -102.051744, 40.003078 ], [ -101.916696, 40.003142 ], [ -101.904176, 40.003162 ], [ -101.841025, 40.002784 ], [ -101.832161, 40.002933 ], [ -101.807687, 40.002798 ], [ -101.804862, 40.002752 ], [ -101.627071, 40.002620 ], [ -101.625809, 40.002711 ], [ -101.542273, 40.002609 ], [ -101.417209, 40.002424 ], [ -101.409953, 40.002354 ], [ -101.374326, 40.002521 ], [ -101.342859, 40.002580 ], [ -101.324036, 40.002696 ], [ -101.293991, 40.002559 ], [ -101.286555, 40.002559 ], [ -101.248673, 40.002543 ], [ -101.215033, 40.002555 ], [ -101.192219, 40.002491 ], [ -101.178805, 40.002468 ], [ -101.168704, 40.002547 ], [ -101.130907, 40.002427 ], [ -101.060317, 40.002307 ], [ -101.027686, 40.002256 ], [ -100.937427, 40.002145 ], [ -100.758830, 40.002302 ], [ -100.752183, 40.002128 ], [ -100.733296, 40.002270 ], [ -100.729904, 40.002111 ], [ -100.721128, 40.002069 ], [ -100.683435, 40.002234 ], [ -100.660230, 40.002162 ], [ -100.645445, 40.001883 ], [ -100.600945, 40.001906 ], [ -100.594757, 40.001977 ], [ -100.567238, 40.001889 ], [ -100.551886, 40.001889 ], [ -100.511065, 40.001840 ], [ -100.487159, 40.001767 ], [ -100.477018, 40.001752 ], [ -100.475854, 40.001768 ], [ -100.468773, 40.001724 ], [ -100.447072, 40.001795 ], [ -100.439081, 40.001774 ], [ -100.390080, 40.001809 ], [ -100.231652, 40.001623 ], [ -100.229479, 40.001693 ], [ -100.215406, 40.001629 ], [ -100.196959, 40.001494 ], [ -100.193590, 40.001573 ], [ -100.190323, 40.001586 ], [ -100.188181, 40.001541 ], [ -100.177823, 40.001593 ], [ -99.990926, 40.001503 ], [ -99.986611, 40.001550 ], [ -99.948167, 40.001813 ], [ -99.944417, 40.001584 ], [ -99.930433, 40.001516 ], [ -99.906658, 40.001512 ], [ -99.813401, 40.001400 ], [ -99.775640, 40.001647 ], [ -99.772121, 40.001804 ], [ -99.764214, 40.001551 ], [ -99.756835, 40.001342 ], [ -99.746628, 40.001820 ], [ -99.731959, 40.001827 ], [ -99.719639, 40.001808 ], [ -99.628346, 40.001866 ], [ -99.625980, 40.001865 ], [ -99.501792, 40.002026 ], [ -99.498999, 40.001957 ], [ -99.497660, 40.001912 ], [ -99.493465, 40.001937 ], [ -99.480728, 40.001942 ], [ -99.423565, 40.002270 ], [ -99.412645, 40.001868 ], [ -99.403389, 40.001969 ], [ -99.290703, 40.001949 ], [ -99.286656, 40.002017 ], [ -99.282967, 40.001879 ], [ -99.254012, 40.002074 ], [ -99.250370, 40.001957 ], [ -99.216376, 40.002016 ], [ -99.197592, 40.002033 ], [ -99.188905, 40.002023 ], [ -99.186962, 40.001977 ], [ -99.178965, 40.001977 ], [ -99.169816, 40.001925 ], [ -99.123033, 40.002165 ], [ -99.113510, 40.002193 ], [ -99.085597, 40.002133 ], [ -99.020338, 40.002264 ], [ -99.018701, 40.002333 ], [ -98.992135, 40.002192 ], [ -98.972287, 40.002245 ], [ -98.971721, 40.002268 ], [ -98.961009, 40.002317 ], [ -98.960919, 40.002271 ], [ -98.934792, 40.002205 ], [ -98.834456, 40.002363 ], [ -98.820590, 40.002319 ], [ -98.777203, 40.002359 ], [ -98.774941, 40.002336 ], [ -98.726295, 40.002222 ], [ -98.710404, 40.002180 ], [ -98.693096, 40.002373 ], [ -98.691443, 40.002505 ], [ -98.690287, 40.002548 ], [ -98.672819, 40.002364 ], [ -98.669724, 40.002410 ], [ -98.653833, 40.002269 ], [ -98.652494, 40.002245 ], [ -98.640710, 40.002493 ], [ -98.613755, 40.002400 ], [ -98.593342, 40.002476 ], [ -98.575219, 40.002480 ], [ -98.560578, 40.002274 ], [ -98.543186, 40.002285 ], [ -98.523053, 40.002336 ], [ -98.490533, 40.002323 ], [ -98.274015, 40.002516 ], [ -98.268218, 40.002490 ], [ -98.250008, 40.002307 ], [ -98.193483, 40.002614 ], [ -98.179315, 40.002483 ], [ -98.172269, 40.002438 ], [ -98.142031, 40.002452 ], [ -98.099659, 40.002227 ], [ -98.076034, 40.002301 ], [ -98.068701, 40.002355 ], [ -98.050057, 40.002278 ], [ -98.047469, 40.002186 ], [ -98.014412, 40.002223 ], [ -98.010157, 40.002153 ], [ -97.972186, 40.002114 ], [ -97.931811, 40.002050 ], [ -97.876261, 40.002102 ], [ -97.857450, 40.002065 ], [ -97.838379, 40.001910 ], [ -97.821598, 40.002004 ], [ -97.819426, 40.001958 ], [ -97.777155, 40.002167 ], [ -97.770776, 40.001977 ], [ -97.769204, 40.001995 ], [ -97.767746, 40.001994 ], [ -97.515308, 40.001901 ], [ -97.511381, 40.001899 ], [ -97.510264, 40.001835 ], [ -97.463285, 40.002047 ], [ -97.444662, 40.001958 ], [ -97.425443, 40.002048 ], [ -97.417826, 40.002024 ], [ -97.415833, 40.002001 ], [ -97.369103, 40.002060 ], [ -97.350896, 40.001930 ], [ -97.350272, 40.001976 ], [ -97.245169, 40.001513 ], [ -97.245080, 40.001467 ], [ -97.202310, 40.001442 ], [ -97.200190, 40.001549 ], [ -97.181775, 40.001550 ], [ -97.142448, 40.001495 ], [ -97.137866, 40.001814 ], [ -97.049663, 40.001323 ], [ -97.030803, 40.001342 ], [ -97.009165, 40.001463 ], [ -96.916093, 40.001506 ], [ -96.880459, 40.001448 ], [ -96.878253, 40.001466 ], [ -96.875057, 40.001448 ], [ -96.873812, 40.001450 ], [ -96.622401, 40.001158 ], [ -96.610349, 40.000881 ], [ -96.604884, 40.000891 ], [ -96.580852, 40.000966 ], [ -96.570854, 40.001091 ], [ -96.557863, 40.000968 ], [ -96.538977, 40.000851 ], [ -96.527111, 40.001031 ], [ -96.469945, 40.000966 ], [ -96.467536, 40.001035 ], [ -96.463640, 40.000967 ], [ -96.304555, 40.000629 ], [ -96.301066, 40.000632 ], [ -96.239172, 40.000691 ], [ -96.223839, 40.000729 ], [ -96.220171, 40.000720 ], [ -96.154365, 40.000495 ], [ -96.154246, 40.000450 ], [ -96.147167, 40.000479 ], [ -96.125937, 40.000432 ], [ -96.125788, 40.000467 ], [ -96.089781, 40.000519 ], [ -96.081395, 40.000603 ], [ -96.051691, 40.000727 ], [ -96.024090, 40.000719 ], [ -96.010678, 40.000638 ], [ -95.958139, 40.000521 ], [ -95.882524, 40.000470 ], [ -95.788024, 40.000452 ], [ -95.784575, 40.000463 ], [ -95.375257, 40.000000 ], [ -95.339896, 39.999999 ], [ -95.308290, 39.999998 ], [ -95.308404, 39.993758 ], [ -95.307780, 39.990618 ], [ -95.307111, 39.989114 ], [ -95.302507, 39.984357 ], [ -95.289715, 39.977706 ], [ -95.274757, 39.972115 ], [ -95.269886, 39.969396 ], [ -95.261854, 39.960618 ], [ -95.257652, 39.954886 ], [ -95.250254, 39.948644 ], [ -95.241383, 39.944949 ], [ -95.236761, 39.943931 ], [ -95.231114, 39.943784 ], [ -95.220212, 39.944433 ], [ -95.216440, 39.943953 ], [ -95.213737, 39.943206 ], [ -95.204428, 39.938949 ], [ -95.201277, 39.934194 ], [ -95.200690, 39.928155 ], [ -95.202010, 39.922438 ], [ -95.205745, 39.915169 ], [ -95.206326, 39.912121 ], [ -95.206196, 39.909557 ], [ -95.205733, 39.908275 ], [ -95.201935, 39.904053 ], [ -95.199347, 39.902709 ], [ -95.193816, 39.900690 ], [ -95.189565, 39.899959 ], [ -95.179453, 39.900062 ], [ -95.172296, 39.902026 ], [ -95.159834, 39.906984 ], [ -95.156024, 39.907243 ], [ -95.149657, 39.905948 ], [ -95.146055, 39.904183 ], [ -95.143802, 39.901918 ], [ -95.142563, 39.897992 ], [ -95.142445, 39.895420 ], [ -95.143403, 39.889356 ], [ -95.142718, 39.885889 ], [ -95.140601, 39.881688 ], [ -95.137092, 39.878351 ], [ -95.134747, 39.876852 ], [ -95.128166, 39.874165 ], [ -95.105912, 39.869164 ], [ -95.090158, 39.863140 ], [ -95.085003, 39.861883 ], [ -95.081534, 39.861718 ], [ -95.052535, 39.864374 ], [ -95.042142, 39.864805 ], [ -95.037767, 39.865542 ], [ -95.032053, 39.868337 ], [ -95.027931, 39.871522 ], [ -95.025422, 39.876711 ], [ -95.025119, 39.878833 ], [ -95.025947, 39.886747 ], [ -95.025240, 39.889700 ], [ -95.024389, 39.891202 ], [ -95.018743, 39.897372 ], [ -95.013152, 39.899953 ], [ -95.008440, 39.900596 ], [ -95.003819, 39.900401 ], [ -94.990284, 39.897010 ], [ -94.986975, 39.896670 ], [ -94.977749, 39.897472 ], [ -94.963345, 39.901136 ], [ -94.959276, 39.901671 ], [ -94.951540, 39.900533 ], [ -94.943867, 39.898130 ], [ -94.934493, 39.893366 ], [ -94.929574, 39.888754 ], [ -94.927897, 39.886112 ], [ -94.927359, 39.883966 ], [ -94.927252, 39.880258 ], [ -94.928466, 39.876344 ], [ -94.931463, 39.872602 ], [ -94.938791, 39.866954 ], [ -94.940743, 39.864410 ], [ -94.942407, 39.861066 ], [ -94.942567, 39.856602 ], [ -94.939767, 39.851930 ], [ -94.937655, 39.849786 ], [ -94.926150, 39.841322 ], [ -94.916918, 39.836138 ], [ -94.909942, 39.834426 ], [ -94.903157, 39.833850 ], [ -94.892677, 39.834378 ], [ -94.889493, 39.834026 ], [ -94.886933, 39.833098 ], [ -94.881013, 39.828922 ], [ -94.878677, 39.826522 ], [ -94.877044, 39.823754 ], [ -94.876544, 39.820594 ], [ -94.875944, 39.813294 ], [ -94.876344, 39.806894 ], [ -94.880932, 39.797338 ], [ -94.884084, 39.794234 ], [ -94.890292, 39.791626 ], [ -94.892965, 39.791098 ], [ -94.925605, 39.789754 ], [ -94.929654, 39.788282 ], [ -94.932726, 39.786282 ], [ -94.935206, 39.783130 ], [ -94.935782, 39.778906 ], [ -94.935302, 39.775610 ], [ -94.934262, 39.773642 ], [ -94.929653, 39.769098 ], [ -94.926229, 39.766490 ], [ -94.916789, 39.760938 ], [ -94.912293, 39.759338 ], [ -94.906244, 39.759418 ], [ -94.899156, 39.761258 ], [ -94.895268, 39.763210 ], [ -94.895041, 39.763350 ], [ -94.894071, 39.763946 ], [ -94.893919, 39.764040 ], [ -94.893724, 39.764160 ], [ -94.893646, 39.764208 ], [ -94.883924, 39.770186 ], [ -94.881460, 39.771258 ], [ -94.881422, 39.771258 ], [ -94.871144, 39.772994 ], [ -94.869644, 39.772894 ], [ -94.867143, 39.771694 ], [ -94.865243, 39.770094 ], [ -94.863143, 39.767294 ], [ -94.860743, 39.763094 ], [ -94.859443, 39.753694 ], [ -94.860371, 39.749530 ], [ -94.862943, 39.742994 ], [ -94.870143, 39.734594 ], [ -94.875643, 39.730494 ], [ -94.884143, 39.726794 ], [ -94.891744, 39.724894 ], [ -94.899316, 39.724042 ], [ -94.902612, 39.724202 ], [ -94.910068, 39.725786 ], [ -94.918324, 39.728794 ], [ -94.930005, 39.735370 ], [ -94.939221, 39.741578 ], [ -94.944741, 39.744377 ], [ -94.948726, 39.745593 ], [ -94.952630, 39.745961 ], [ -94.955286, 39.745689 ], [ -94.960086, 39.743065 ], [ -94.965318, 39.739065 ], [ -94.970422, 39.732121 ], [ -94.971206, 39.729305 ], [ -94.971078, 39.723146 ], [ -94.968453, 39.707402 ], [ -94.968981, 39.692954 ], [ -94.969909, 39.689050 ], [ -94.971317, 39.686410 ], [ -94.976325, 39.681370 ], [ -94.981557, 39.678634 ], [ -94.984149, 39.677850 ], [ -94.993557, 39.676570 ], [ -95.001379, 39.676479 ], [ -95.009023, 39.675765 ], [ -95.015310, 39.674262 ], [ -95.018318, 39.672869 ], [ -95.024595, 39.668485 ], [ -95.027644, 39.665454 ], [ -95.037464, 39.652905 ], [ -95.039049, 39.649639 ], [ -95.044554, 39.644370 ], [ -95.049518, 39.637876 ], [ -95.053367, 39.630347 ], [ -95.054925, 39.624995 ], [ -95.055152, 39.621657 ], [ -95.053012, 39.613965 ], [ -95.047911, 39.606288 ], [ -95.046445, 39.601606 ], [ -95.046361, 39.599557 ], [ -95.047165, 39.595117 ], [ -95.049277, 39.589583 ], [ -95.054804, 39.582488 ], [ -95.056897, 39.580567 ], [ -95.059519, 39.579132 ], [ -95.064519, 39.577115 ], [ -95.069315, 39.576218 ], [ -95.072160, 39.576122 ], [ -95.076688, 39.576764 ], [ -95.089515, 39.581028 ], [ -95.095736, 39.580618 ], [ -95.099095, 39.579691 ], [ -95.103228, 39.577783 ], [ -95.106406, 39.575252 ], [ -95.107454, 39.573843 ], [ -95.113077, 39.559133 ], [ -95.113557, 39.553941 ], [ -95.109304, 39.542285 ], [ -95.106596, 39.537657 ], [ -95.102888, 39.533347 ], [ -95.092704, 39.524241 ], [ -95.082714, 39.516712 ], [ -95.077441, 39.513552 ], [ -95.059461, 39.506143 ], [ -95.056380, 39.503972 ], [ -95.052177, 39.499996 ], [ -95.050552, 39.497514 ], [ -95.049845, 39.494415 ], [ -95.048370, 39.480420 ], [ -95.047133, 39.474971 ], [ -95.045716, 39.472459 ], [ -95.040780, 39.466387 ], [ -95.037500, 39.463689 ], [ -95.033408, 39.460876 ], [ -95.028498, 39.458287 ], [ -95.015825, 39.452809 ], [ -94.995768, 39.448174 ], [ -94.990172, 39.446192 ], [ -94.982144, 39.440552 ], [ -94.978798, 39.436241 ], [ -94.976606, 39.426701 ], [ -94.972952, 39.421705 ], [ -94.966066, 39.417288 ], [ -94.954817, 39.413844 ], [ -94.951209, 39.411707 ], [ -94.947864, 39.408604 ], [ -94.946293, 39.405646 ], [ -94.946662, 39.399717 ], [ -94.946227, 39.395648 ], [ -94.945577, 39.393851 ], [ -94.942039, 39.389499 ], [ -94.939697, 39.387950 ], [ -94.937158, 39.386531 ], [ -94.933652, 39.385546 ], [ -94.923110, 39.384492 ], [ -94.919225, 39.385174 ], [ -94.915859, 39.386348 ], [ -94.909581, 39.388865 ], [ -94.901823, 39.392798 ], [ -94.894979, 39.393565 ], [ -94.891845, 39.393313 ], [ -94.888972, 39.392432 ], [ -94.885026, 39.389801 ], [ -94.880979, 39.383899 ], [ -94.879281, 39.379780 ], [ -94.879088, 39.375703 ], [ -94.881360, 39.370383 ], [ -94.885216, 39.366911 ], [ -94.890928, 39.364031 ], [ -94.896832, 39.363135 ], [ -94.899024, 39.362431 ], [ -94.902497, 39.360383 ], [ -94.907297, 39.356735 ], [ -94.909409, 39.354255 ], [ -94.910017, 39.352543 ], [ -94.910641, 39.348335 ], [ -94.908065, 39.323663 ], [ -94.905329, 39.311952 ], [ -94.903137, 39.306272 ], [ -94.900049, 39.300192 ], [ -94.895217, 39.294208 ], [ -94.887056, 39.286480 ], [ -94.882576, 39.283328 ], [ -94.878320, 39.281136 ], [ -94.867568, 39.277841 ], [ -94.857072, 39.273825 ], [ -94.846320, 39.268481 ], [ -94.837855, 39.262417 ], [ -94.831471, 39.256273 ], [ -94.827487, 39.249889 ], [ -94.825663, 39.241729 ], [ -94.826111, 39.238289 ], [ -94.827791, 39.234001 ], [ -94.834896, 39.223842 ], [ -94.835056, 39.220658 ], [ -94.833552, 39.217794 ], [ -94.831679, 39.215938 ], [ -94.823791, 39.209874 ], [ -94.820687, 39.208626 ], [ -94.811663, 39.206594 ], [ -94.799663, 39.206018 ], [ -94.787343, 39.207666 ], [ -94.783838, 39.207154 ], [ -94.781518, 39.206146 ], [ -94.777838, 39.203522 ], [ -94.775538, 39.200602 ], [ -94.770338, 39.190002 ], [ -94.763138, 39.179903 ], [ -94.752338, 39.173203 ], [ -94.741938, 39.170203 ], [ -94.736537, 39.169203 ], [ -94.723637, 39.169003 ], [ -94.714137, 39.170403 ], [ -94.696332, 39.178563 ], [ -94.687236, 39.183503 ], [ -94.680336, 39.184303 ], [ -94.669135, 39.182003 ], [ -94.663835, 39.179103 ], [ -94.660315, 39.168051 ], [ -94.662435, 39.157603 ], [ -94.650735, 39.154103 ], [ -94.640035, 39.153103 ], [ -94.623934, 39.156603 ], [ -94.615834, 39.160003 ], [ -94.608834, 39.160503 ], [ -94.601733, 39.159603 ], [ -94.596033, 39.157703 ], [ -94.591933, 39.155003 ], [ -94.589933, 39.140403 ], [ -94.592533, 39.135903 ], [ -94.600434, 39.128503 ], [ -94.605734, 39.122204 ], [ -94.607034, 39.119404 ], [ -94.607354, 39.113444 ], [ -94.607234, 39.089604 ], [ -94.607334, 39.081704 ], [ -94.607234, 39.065704 ], [ -94.608334, 38.981806 ], [ -94.608134, 38.942006 ], [ -94.608134, 38.940006 ], [ -94.607866, 38.937398 ], [ -94.607978, 38.936870 ], [ -94.608033, 38.883807 ], [ -94.608033, 38.869207 ], [ -94.608033, 38.868107 ], [ -94.607993, 38.867271 ], [ -94.608033, 38.861207 ], [ -94.608033, 38.855007 ], [ -94.608033, 38.847207 ], [ -94.607625, 38.827560 ], [ -94.608041, 38.811064 ], [ -94.609399, 38.742440 ], [ -94.609456, 38.740700 ], [ -94.611602, 38.635384 ], [ -94.611465, 38.625011 ], [ -94.611858, 38.620485 ], [ -94.611908, 38.609272 ], [ -94.611887, 38.580139 ], [ -94.611902, 38.580110 ], [ -94.612176, 38.576546 ], [ -94.612157, 38.549817 ], [ -94.612272, 38.547917 ], [ -94.612644, 38.491644 ], [ -94.612726, 38.484367 ], [ -94.612696, 38.483154 ], [ -94.612866, 38.477571 ], [ -94.613365, 38.403422 ], [ -94.613265, 38.392426 ], [ -94.613329, 38.369618 ], [ -94.613312, 38.364407 ], [ -94.613000, 38.335801 ], [ -94.612825, 38.324387 ], [ -94.612788, 38.320142 ], [ -94.612673, 38.314832 ], [ -94.612673, 38.302527 ], [ -94.612844, 38.291423 ], [ -94.612849, 38.289914 ], [ -94.612692, 38.270394 ], [ -94.612614, 38.237766 ], [ -94.612635, 38.226987 ], [ -94.612659, 38.219251 ], [ -94.612658, 38.217649 ], [ -94.612822, 38.203918 ], [ -94.612848, 38.200714 ], [ -94.613073, 38.190552 ], [ -94.613422, 38.167908 ], [ -94.613748, 38.160633 ], [ -94.613856, 38.149769 ], [ -94.614061, 38.067343 ], [ -94.614089, 38.065901 ], [ -94.614055, 38.060088 ], [ -94.613981, 38.036949 ], [ -94.614212, 37.992462 ], [ -94.614465, 37.987799 ], [ -94.614557, 37.971037 ], [ -94.614562, 37.951517 ], [ -94.614594, 37.949978 ], [ -94.614612, 37.944362 ], [ -94.614754, 37.940769 ], [ -94.614835, 37.936700 ], [ -94.614778, 37.934200 ], [ -94.615181, 37.915944 ], [ -94.615393, 37.906392 ], [ -94.615469, 37.901775 ], [ -94.615706, 37.886843 ], [ -94.615921, 37.878331 ], [ -94.615834, 37.872510 ], [ -94.616000, 37.863126 ], [ -94.616426, 37.845282 ], [ -94.616450, 37.837560 ], [ -94.616862, 37.819456 ], [ -94.617721, 37.772970 ], [ -94.617808, 37.729707 ], [ -94.617975, 37.722176 ], [ -94.617805, 37.690178 ], [ -94.617651, 37.687671 ], [ -94.617687, 37.686653 ], [ -94.617885, 37.682214 ], [ -94.617734, 37.673127 ], [ -94.617576, 37.653671 ], [ -94.617477, 37.637170 ], [ -94.617300, 37.610495 ], [ -94.617428, 37.609522 ], [ -94.617283, 37.571896 ], [ -94.617315, 37.571499 ], [ -94.617081, 37.567013 ], [ -94.617160, 37.557308 ], [ -94.617186, 37.553485 ], [ -94.616908, 37.527804 ], [ -94.616789, 37.521510 ], [ -94.617023, 37.483765 ], [ -94.617183, 37.469665 ], [ -94.617180, 37.465203 ], [ -94.617222, 37.460476 ], [ -94.617205, 37.460373 ], [ -94.617201, 37.454788 ], [ -94.617132, 37.439818 ], [ -94.617265, 37.425536 ], [ -94.617511, 37.410909 ], [ -94.617557, 37.396375 ], [ -94.617625, 37.367576 ], [ -94.617626, 37.367445 ], [ -94.617537, 37.364355 ], [ -94.617636, 37.338417 ], [ -94.617695, 37.336842 ], [ -94.617648, 37.323589 ], [ -94.618075, 37.240436 ], [ -94.618158, 37.237597 ], [ -94.618123, 37.229334 ], [ -94.618150, 37.228121 ], [ -94.618219, 37.207772 ], [ -94.618305, 37.207337 ], [ -94.618319, 37.188774 ], [ -94.618505, 37.181184 ], [ -94.618473, 37.174782 ], [ -94.618351, 37.160211 ], [ -94.618072, 37.132345 ], [ -94.618075, 37.129755 ], [ -94.618212, 37.113169 ], [ -94.618151, 37.103968 ], [ -94.618059, 37.096676 ], [ -94.618088, 37.093671 ], [ -94.618090, 37.093494 ], [ -94.618082, 37.086432 ], [ -94.618120, 37.085934 ], [ -94.617982, 37.075077 ], [ -94.617875, 37.056798 ], [ -94.617965, 37.040537 ], [ -94.617995, 37.009016 ], [ -94.618080, 36.998135 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US21", "STATE": "21", "NAME": "Kentucky", "LSAD": "", "CENSUSAREA": 39486.338000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -83.675413, 36.600814 ], [ -83.675614, 36.598582 ], [ -83.677114, 36.596582 ], [ -83.679514, 36.594082 ], [ -83.683014, 36.592182 ], [ -83.687514, 36.587182 ], [ -83.688814, 36.584382 ], [ -83.690714, 36.582581 ], [ -83.789017, 36.583881 ], [ -83.894421, 36.586481 ], [ -83.987842, 36.589600 ], [ -84.127503, 36.591413 ], [ -84.227332, 36.592181 ], [ -84.261333, 36.591981 ], [ -84.271176, 36.591882 ], [ -84.442837, 36.596079 ], [ -84.499938, 36.596678 ], [ -84.543138, 36.596277 ], [ -84.624939, 36.599575 ], [ -84.785341, 36.603372 ], [ -84.803744, 36.604265 ], [ -84.843091, 36.605127 ], [ -84.859759, 36.606428 ], [ -84.859738, 36.606495 ], [ -84.943948, 36.612569 ], [ -84.986448, 36.616668 ], [ -85.024627, 36.619354 ], [ -85.086415, 36.621913 ], [ -85.096128, 36.622483 ], [ -85.195372, 36.625498 ], [ -85.276289, 36.626511 ], [ -85.290627, 36.626450 ], [ -85.296073, 36.625824 ], [ -85.300402, 36.624437 ], [ -85.324654, 36.624550 ], [ -85.334124, 36.622951 ], [ -85.430123, 36.618952 ], [ -85.488353, 36.614994 ], [ -85.551483, 36.615727 ], [ -85.552017, 36.615782 ], [ -85.677789, 36.618157 ], [ -85.731862, 36.620429 ], [ -85.788645, 36.621846 ], [ -85.801490, 36.622418 ], [ -85.832172, 36.622046 ], [ -85.873857, 36.623642 ], [ -85.959981, 36.628121 ], [ -86.032770, 36.630367 ], [ -86.033139, 36.630413 ], [ -86.038366, 36.630804 ], [ -86.080666, 36.633940 ], [ -86.081944, 36.633848 ], [ -86.197573, 36.639363 ], [ -86.204859, 36.639741 ], [ -86.216183, 36.640527 ], [ -86.216410, 36.640595 ], [ -86.219081, 36.640824 ], [ -86.222151, 36.640891 ], [ -86.293357, 36.645356 ], [ -86.333051, 36.648778 ], [ -86.359073, 36.649845 ], [ -86.373784, 36.650126 ], [ -86.374991, 36.649803 ], [ -86.468497, 36.651841 ], [ -86.472190, 36.651763 ], [ -86.473413, 36.651676 ], [ -86.473497, 36.651671 ], [ -86.507771, 36.652445 ], [ -86.543777, 36.640536 ], [ -86.543388, 36.643890 ], [ -86.550054, 36.644817 ], [ -86.551292, 36.637985 ], [ -86.564143, 36.633472 ], [ -86.589906, 36.652486 ], [ -86.605042, 36.652125 ], [ -86.606394, 36.652107 ], [ -86.713786, 36.649341 ], [ -86.758920, 36.649018 ], [ -86.813037, 36.647647 ], [ -86.816186, 36.647722 ], [ -86.818405, 36.647639 ], [ -86.833155, 36.647210 ], [ -86.854268, 36.646884 ], [ -86.906023, 36.646302 ], [ -86.906583, 36.646255 ], [ -87.011522, 36.643949 ], [ -87.114976, 36.642414 ], [ -87.230530, 36.641895 ], [ -87.231037, 36.641888 ], [ -87.247655, 36.641841 ], [ -87.278398, 36.641718 ], [ -87.281506, 36.641761 ], [ -87.344131, 36.641510 ], [ -87.347796, 36.641440 ], [ -87.414309, 36.641047 ], [ -87.425009, 36.641047 ], [ -87.436509, 36.640747 ], [ -87.563052, 36.639113 ], [ -87.564928, 36.639113 ], [ -87.641150, 36.638036 ], [ -87.744768, 36.636151 ], [ -87.853204, 36.633247 ], [ -87.849567, 36.663701 ], [ -87.872062, 36.665089 ], [ -88.011792, 36.677025 ], [ -88.044772, 36.677983 ], [ -88.070532, 36.678118 ], [ -88.068208, 36.659747 ], [ -88.064401, 36.650854 ], [ -88.058580, 36.643315 ], [ -88.057042, 36.640540 ], [ -88.055604, 36.635710 ], [ -88.055738, 36.630475 ], [ -88.045127, 36.602939 ], [ -88.041196, 36.584123 ], [ -88.039625, 36.572783 ], [ -88.035625, 36.561736 ], [ -88.033802, 36.551733 ], [ -88.032489, 36.540662 ], [ -88.034132, 36.531120 ], [ -88.035854, 36.525912 ], [ -88.037270, 36.523783 ], [ -88.037830, 36.521015 ], [ -88.037329, 36.517830 ], [ -88.037822, 36.513850 ], [ -88.039481, 36.510408 ], [ -88.045304, 36.504081 ], [ -88.050466, 36.500053 ], [ -88.053205, 36.497129 ], [ -88.127378, 36.498540 ], [ -88.320794, 36.500432 ], [ -88.325895, 36.500483 ], [ -88.330799, 36.500531 ], [ -88.416360, 36.500756 ], [ -88.450161, 36.501101 ], [ -88.452543, 36.500872 ], [ -88.472564, 36.501028 ], [ -88.489210, 36.501068 ], [ -88.511920, 36.501457 ], [ -88.512270, 36.501506 ], [ -88.516427, 36.501430 ], [ -88.545192, 36.501814 ], [ -88.577283, 36.501940 ], [ -88.661133, 36.502243 ], [ -88.715255, 36.502662 ], [ -88.747523, 36.502834 ], [ -88.799594, 36.502757 ], [ -88.827012, 36.502850 ], [ -88.834626, 36.502914 ], [ -88.874725, 36.502446 ], [ -88.884557, 36.501704 ], [ -88.899510, 36.502218 ], [ -88.964471, 36.502191 ], [ -89.000063, 36.502633 ], [ -89.006825, 36.502684 ], [ -89.010439, 36.502710 ], [ -89.034649, 36.502964 ], [ -89.058871, 36.503157 ], [ -89.072118, 36.503249 ], [ -89.090146, 36.503392 ], [ -89.117537, 36.503603 ], [ -89.119805, 36.503647 ], [ -89.163224, 36.504522 ], [ -89.163429, 36.504526 ], [ -89.211409, 36.505630 ], [ -89.279091, 36.506511 ], [ -89.282298, 36.506782 ], [ -89.300284, 36.507147 ], [ -89.346053, 36.503210 ], [ -89.356593, 36.502195 ], [ -89.380085, 36.500416 ], [ -89.381792, 36.500062 ], [ -89.391044, 36.499079 ], [ -89.403913, 36.499141 ], [ -89.417293, 36.499033 ], [ -89.405654, 36.528165 ], [ -89.398685, 36.542329 ], [ -89.396811, 36.551975 ], [ -89.396627, 36.556429 ], [ -89.395909, 36.559649 ], [ -89.382762, 36.583603 ], [ -89.380643, 36.591130 ], [ -89.378012, 36.608096 ], [ -89.376367, 36.613868 ], [ -89.375453, 36.615719 ], [ -89.371002, 36.620840 ], [ -89.365548, 36.625059 ], [ -89.356510, 36.628439 ], [ -89.343753, 36.630991 ], [ -89.334046, 36.632250 ], [ -89.326731, 36.632186 ], [ -89.318154, 36.625059 ], [ -89.313405, 36.620120 ], [ -89.301502, 36.604138 ], [ -89.294637, 36.593729 ], [ -89.278935, 36.577699 ], [ -89.271710, 36.571387 ], [ -89.268057, 36.568908 ], [ -89.259994, 36.565149 ], [ -89.258318, 36.564948 ], [ -89.236542, 36.566824 ], [ -89.227319, 36.569375 ], [ -89.217447, 36.576159 ], [ -89.213563, 36.580119 ], [ -89.202607, 36.601576 ], [ -89.200902, 36.618177 ], [ -89.199136, 36.625649 ], [ -89.197654, 36.628936 ], [ -89.192542, 36.635997 ], [ -89.187749, 36.641115 ], [ -89.183321, 36.644694 ], [ -89.174741, 36.650416 ], [ -89.164601, 36.660132 ], [ -89.159080, 36.666352 ], [ -89.168723, 36.671892 ], [ -89.171882, 36.672526 ], [ -89.169467, 36.674596 ], [ -89.167961, 36.678189 ], [ -89.168016, 36.685514 ], [ -89.169522, 36.688878 ], [ -89.174836, 36.693960 ], [ -89.184356, 36.701238 ], [ -89.196040, 36.712017 ], [ -89.199480, 36.716045 ], [ -89.200732, 36.720141 ], [ -89.201047, 36.725772 ], [ -89.199798, 36.734217 ], [ -89.197808, 36.739412 ], [ -89.191553, 36.747217 ], [ -89.184523, 36.753638 ], [ -89.179545, 36.756132 ], [ -89.169106, 36.759473 ], [ -89.166888, 36.759633 ], [ -89.156990, 36.755968 ], [ -89.151756, 36.756264 ], [ -89.142313, 36.755369 ], [ -89.135518, 36.751956 ], [ -89.130399, 36.751702 ], [ -89.126134, 36.751735 ], [ -89.122430, 36.754844 ], [ -89.119198, 36.759802 ], [ -89.116563, 36.767557 ], [ -89.116067, 36.772423 ], [ -89.116847, 36.775607 ], [ -89.120437, 36.782071 ], [ -89.123530, 36.785309 ], [ -89.128923, 36.787677 ], [ -89.133210, 36.788228 ], [ -89.144208, 36.788353 ], [ -89.155891, 36.789126 ], [ -89.160877, 36.790914 ], [ -89.168458, 36.795571 ], [ -89.171069, 36.798119 ], [ -89.177417, 36.807269 ], [ -89.178749, 36.809928 ], [ -89.179229, 36.812915 ], [ -89.178574, 36.816554 ], [ -89.178888, 36.831368 ], [ -89.178153, 36.834586 ], [ -89.177177, 36.835779 ], [ -89.173419, 36.839806 ], [ -89.170400, 36.841522 ], [ -89.166841, 36.842529 ], [ -89.159466, 36.842505 ], [ -89.157330, 36.843305 ], [ -89.153513, 36.846600 ], [ -89.147674, 36.847148 ], [ -89.137969, 36.847349 ], [ -89.131944, 36.857437 ], [ -89.126702, 36.872073 ], [ -89.119813, 36.882792 ], [ -89.117567, 36.887356 ], [ -89.109377, 36.920066 ], [ -89.102137, 36.939154 ], [ -89.100766, 36.943973 ], [ -89.098843, 36.957850 ], [ -89.099007, 36.961389 ], [ -89.099594, 36.964543 ], [ -89.102879, 36.969700 ], [ -89.109498, 36.976563 ], [ -89.115030, 36.980335 ], [ -89.118300, 36.981879 ], [ -89.125069, 36.983499 ], [ -89.128868, 36.983265 ], [ -89.132685, 36.982200 ], [ -89.138437, 36.985089 ], [ -89.160667, 37.000051 ], [ -89.166447, 37.003337 ], [ -89.171120, 37.008072 ], [ -89.173595, 37.011409 ], [ -89.178975, 37.020928 ], [ -89.180849, 37.026843 ], [ -89.182509, 37.037275 ], [ -89.181369, 37.046305 ], [ -89.179384, 37.053012 ], [ -89.175725, 37.062069 ], [ -89.168087, 37.074218 ], [ -89.154504, 37.088907 ], [ -89.151294, 37.090487 ], [ -89.149797, 37.089828 ], [ -89.146596, 37.090714 ], [ -89.141320, 37.093865 ], [ -89.138231, 37.096906 ], [ -89.135847, 37.102197 ], [ -89.134931, 37.103278 ], [ -89.125072, 37.108813 ], [ -89.122020, 37.111342 ], [ -89.120465, 37.113487 ], [ -89.115579, 37.115781 ], [ -89.111189, 37.119052 ], [ -89.099047, 37.140967 ], [ -89.096669, 37.146200 ], [ -89.095753, 37.150391 ], [ -89.092934, 37.156439 ], [ -89.086526, 37.165602 ], [ -89.076221, 37.175125 ], [ -89.058036, 37.188767 ], [ -89.041263, 37.202881 ], [ -89.037568, 37.203932 ], [ -89.029981, 37.211144 ], [ -89.014003, 37.216090 ], [ -89.005920, 37.221198 ], [ -89.008532, 37.220583 ], [ -89.000968, 37.224401 ], [ -88.983260, 37.228685 ], [ -88.966831, 37.229891 ], [ -88.942111, 37.228811 ], [ -88.931745, 37.227593 ], [ -88.920878, 37.224769 ], [ -88.916934, 37.224291 ], [ -88.902841, 37.219299 ], [ -88.869530, 37.209711 ], [ -88.835051, 37.196486 ], [ -88.820935, 37.192203 ], [ -88.805720, 37.188595 ], [ -88.797373, 37.184854 ], [ -88.786947, 37.178584 ], [ -88.779466, 37.172495 ], [ -88.775950, 37.168780 ], [ -88.765357, 37.162662 ], [ -88.753068, 37.154701 ], [ -88.746065, 37.151564 ], [ -88.737937, 37.146513 ], [ -88.732105, 37.143956 ], [ -88.723440, 37.141194 ], [ -88.720224, 37.140641 ], [ -88.702553, 37.142646 ], [ -88.693983, 37.141155 ], [ -88.687767, 37.139378 ], [ -88.644872, 37.122844 ], [ -88.637977, 37.121309 ], [ -88.630605, 37.121003 ], [ -88.625889, 37.119458 ], [ -88.611440, 37.112745 ], [ -88.601144, 37.107081 ], [ -88.593922, 37.101761 ], [ -88.589207, 37.099655 ], [ -88.581635, 37.090567 ], [ -88.576718, 37.085852 ], [ -88.569375, 37.082213 ], [ -88.560032, 37.076010 ], [ -88.545403, 37.070003 ], [ -88.531576, 37.067192 ], [ -88.521436, 37.065584 ], [ -88.514356, 37.065231 ], [ -88.504437, 37.065265 ], [ -88.490068, 37.067874 ], [ -88.482856, 37.067114 ], [ -88.476127, 37.068223 ], [ -88.458948, 37.073796 ], [ -88.444605, 37.098601 ], [ -88.442743, 37.107842 ], [ -88.443538, 37.108517 ], [ -88.443538, 37.109192 ], [ -88.435829, 37.125055 ], [ -88.434701, 37.126424 ], [ -88.424776, 37.149901 ], [ -88.424403, 37.152428 ], [ -88.428097, 37.157758 ], [ -88.429906, 37.158668 ], [ -88.431488, 37.160298 ], [ -88.433782, 37.164070 ], [ -88.433454, 37.165871 ], [ -88.437781, 37.180007 ], [ -88.439527, 37.181740 ], [ -88.441956, 37.189036 ], [ -88.447764, 37.203527 ], [ -88.450653, 37.207046 ], [ -88.458763, 37.213536 ], [ -88.466981, 37.217026 ], [ -88.471753, 37.220155 ], [ -88.478179, 37.227251 ], [ -88.479730, 37.229606 ], [ -88.484982, 37.240774 ], [ -88.487277, 37.244077 ], [ -88.492383, 37.248445 ], [ -88.500777, 37.253579 ], [ -88.508031, 37.260261 ], [ -88.509328, 37.262130 ], [ -88.506942, 37.266656 ], [ -88.509587, 37.273398 ], [ -88.515939, 37.284043 ], [ -88.514661, 37.290948 ], [ -88.511497, 37.298527 ], [ -88.508657, 37.303353 ], [ -88.505087, 37.307858 ], [ -88.500566, 37.317822 ], [ -88.494137, 37.327689 ], [ -88.490310, 37.335042 ], [ -88.486947, 37.339596 ], [ -88.484462, 37.345609 ], [ -88.482612, 37.354915 ], [ -88.482113, 37.364615 ], [ -88.478523, 37.375052 ], [ -88.476592, 37.386875 ], [ -88.470224, 37.396255 ], [ -88.465861, 37.400547 ], [ -88.456000, 37.408482 ], [ -88.450127, 37.411717 ], [ -88.439333, 37.416416 ], [ -88.433182, 37.418169 ], [ -88.425981, 37.419441 ], [ -88.418594, 37.421987 ], [ -88.413108, 37.424468 ], [ -88.408808, 37.425216 ], [ -88.404127, 37.424146 ], [ -88.397340, 37.421644 ], [ -88.387669, 37.416482 ], [ -88.377507, 37.409825 ], [ -88.373445, 37.404342 ], [ -88.371214, 37.402730 ], [ -88.365471, 37.401663 ], [ -88.361557, 37.402931 ], [ -88.358436, 37.404860 ], [ -88.348405, 37.410726 ], [ -88.333183, 37.427210 ], [ -88.330622, 37.429316 ], [ -88.321199, 37.434705 ], [ -88.317525, 37.436178 ], [ -88.312585, 37.440591 ], [ -88.297821, 37.446816 ], [ -88.281667, 37.452596 ], [ -88.255193, 37.456748 ], [ -88.237784, 37.456811 ], [ -88.225012, 37.457390 ], [ -88.206923, 37.460188 ], [ -88.188615, 37.461896 ], [ -88.175283, 37.463790 ], [ -88.171764, 37.465612 ], [ -88.157061, 37.466937 ], [ -88.135142, 37.471626 ], [ -88.132628, 37.471555 ], [ -88.128010, 37.470507 ], [ -88.109417, 37.472369 ], [ -88.095818, 37.473025 ], [ -88.091156, 37.472699 ], [ -88.091156, 37.471715 ], [ -88.090380, 37.471059 ], [ -88.087664, 37.471059 ], [ -88.084171, 37.472699 ], [ -88.077987, 37.480146 ], [ -88.072386, 37.483563 ], [ -88.068504, 37.481921 ], [ -88.067728, 37.481593 ], [ -88.064234, 37.484548 ], [ -88.062294, 37.487837 ], [ -88.062174, 37.489057 ], [ -88.062950, 37.489385 ], [ -88.064115, 37.492013 ], [ -88.062563, 37.495951 ], [ -88.061292, 37.505232 ], [ -88.062828, 37.508123 ], [ -88.062568, 37.513563 ], [ -88.063311, 37.515755 ], [ -88.069018, 37.525297 ], [ -88.072242, 37.528826 ], [ -88.078046, 37.532029 ], [ -88.086194, 37.534186 ], [ -88.088049, 37.535124 ], [ -88.092814, 37.539637 ], [ -88.101174, 37.551330 ], [ -88.105585, 37.556180 ], [ -88.114330, 37.562189 ], [ -88.121517, 37.568166 ], [ -88.131622, 37.572968 ], [ -88.133393, 37.574235 ], [ -88.136164, 37.580285 ], [ -88.139973, 37.586451 ], [ -88.140940, 37.590865 ], [ -88.140226, 37.595263 ], [ -88.140752, 37.599158 ], [ -88.142225, 37.603737 ], [ -88.152691, 37.622827 ], [ -88.156827, 37.632801 ], [ -88.158374, 37.639948 ], [ -88.158640, 37.649097 ], [ -88.160062, 37.654332 ], [ -88.160187, 37.657592 ], [ -88.159372, 37.661847 ], [ -88.158207, 37.664542 ], [ -88.151646, 37.675098 ], [ -88.145434, 37.682590 ], [ -88.134282, 37.691498 ], [ -88.132341, 37.697142 ], [ -88.125033, 37.707094 ], [ -88.122412, 37.709685 ], [ -88.117803, 37.712583 ], [ -88.107088, 37.715915 ], [ -88.101844, 37.718036 ], [ -88.095759, 37.723205 ], [ -88.085901, 37.728587 ], [ -88.081925, 37.730389 ], [ -88.072538, 37.733286 ], [ -88.063802, 37.738645 ], [ -88.059588, 37.742608 ], [ -88.049942, 37.754078 ], [ -88.042602, 37.767120 ], [ -88.040873, 37.772082 ], [ -88.038769, 37.784307 ], [ -88.035827, 37.791917 ], [ -88.032438, 37.796361 ], [ -88.028030, 37.799224 ], [ -88.021021, 37.801409 ], [ -88.015144, 37.801930 ], [ -88.004706, 37.800145 ], [ -87.997102, 37.797672 ], [ -87.993099, 37.795756 ], [ -87.991168, 37.794049 ], [ -87.987157, 37.792202 ], [ -87.984358, 37.791800 ], [ -87.976389, 37.788004 ], [ -87.971805, 37.784648 ], [ -87.970262, 37.781856 ], [ -87.960030, 37.773223 ], [ -87.952590, 37.771742 ], [ -87.948594, 37.772344 ], [ -87.946463, 37.773477 ], [ -87.944506, 37.775256 ], [ -87.938598, 37.787914 ], [ -87.935861, 37.789703 ], [ -87.934698, 37.791827 ], [ -87.934936, 37.795220 ], [ -87.932554, 37.797672 ], [ -87.927543, 37.799851 ], [ -87.919138, 37.802128 ], [ -87.911087, 37.805158 ], [ -87.906810, 37.807624 ], [ -87.904595, 37.812526 ], [ -87.903804, 37.817762 ], [ -87.907773, 37.837611 ], [ -87.910276, 37.843416 ], [ -87.914892, 37.849618 ], [ -87.927303, 37.858709 ], [ -87.936228, 37.867937 ], [ -87.938128, 37.870651 ], [ -87.940005, 37.875044 ], [ -87.941021, 37.879168 ], [ -87.940839, 37.883338 ], [ -87.940069, 37.887670 ], [ -87.938365, 37.890802 ], [ -87.936784, 37.892587 ], [ -87.932129, 37.897320 ], [ -87.927769, 37.900924 ], [ -87.921744, 37.907885 ], [ -87.904789, 37.924892 ], [ -87.898062, 37.927514 ], [ -87.892471, 37.927930 ], [ -87.883321, 37.926238 ], [ -87.877325, 37.924034 ], [ -87.872540, 37.920999 ], [ -87.865558, 37.915056 ], [ -87.863097, 37.911858 ], [ -87.858738, 37.902779 ], [ -87.857243, 37.900649 ], [ -87.845590, 37.893151 ], [ -87.844691, 37.892048 ], [ -87.841693, 37.887685 ], [ -87.841615, 37.883393 ], [ -87.841193, 37.882325 ], [ -87.838102, 37.879769 ], [ -87.833883, 37.877324 ], [ -87.830578, 37.876516 ], [ -87.808013, 37.875191 ], [ -87.795185, 37.875273 ], [ -87.790900, 37.875714 ], [ -87.786407, 37.876556 ], [ -87.783643, 37.877759 ], [ -87.773015, 37.884544 ], [ -87.771004, 37.886261 ], [ -87.762260, 37.890906 ], [ -87.740148, 37.894650 ], [ -87.733300, 37.894346 ], [ -87.723635, 37.892058 ], [ -87.717971, 37.892570 ], [ -87.710675, 37.893898 ], [ -87.700915, 37.897274 ], [ -87.688338, 37.902474 ], [ -87.684018, 37.903498 ], [ -87.680338, 37.903274 ], [ -87.675730, 37.901930 ], [ -87.671457, 37.899498 ], [ -87.666481, 37.895786 ], [ -87.665025, 37.893514 ], [ -87.662865, 37.885578 ], [ -87.662820, 37.881449 ], [ -87.664101, 37.877176 ], [ -87.666175, 37.874146 ], [ -87.668879, 37.871497 ], [ -87.673186, 37.868412 ], [ -87.675400, 37.865946 ], [ -87.681633, 37.855917 ], [ -87.681900, 37.846410 ], [ -87.680689, 37.840620 ], [ -87.679188, 37.836321 ], [ -87.675538, 37.831732 ], [ -87.672397, 37.829127 ], [ -87.666522, 37.827455 ], [ -87.655171, 37.826037 ], [ -87.645858, 37.825899 ], [ -87.635806, 37.827015 ], [ -87.625014, 37.829077 ], [ -87.615399, 37.831974 ], [ -87.612426, 37.833840 ], [ -87.606599, 37.838669 ], [ -87.591504, 37.856642 ], [ -87.588729, 37.860984 ], [ -87.588426, 37.868791 ], [ -87.591582, 37.887194 ], [ -87.597118, 37.892394 ], [ -87.601967, 37.895722 ], [ -87.608479, 37.898794 ], [ -87.620272, 37.906922 ], [ -87.623296, 37.910746 ], [ -87.626256, 37.916138 ], [ -87.628416, 37.921450 ], [ -87.628960, 37.926714 ], [ -87.625616, 37.933442 ], [ -87.619488, 37.938538 ], [ -87.610816, 37.944602 ], [ -87.606216, 37.949642 ], [ -87.603516, 37.958942 ], [ -87.605216, 37.961442 ], [ -87.605216, 37.965142 ], [ -87.603816, 37.968942 ], [ -87.601416, 37.972542 ], [ -87.596716, 37.974842 ], [ -87.592916, 37.975842 ], [ -87.589816, 37.976042 ], [ -87.585916, 37.975442 ], [ -87.581115, 37.973442 ], [ -87.577915, 37.971542 ], [ -87.574715, 37.967742 ], [ -87.573415, 37.962642 ], [ -87.574287, 37.954842 ], [ -87.572030, 37.947466 ], [ -87.568398, 37.941226 ], [ -87.565870, 37.937930 ], [ -87.559342, 37.931146 ], [ -87.551277, 37.925418 ], [ -87.545901, 37.922666 ], [ -87.531532, 37.916298 ], [ -87.520284, 37.912618 ], [ -87.511499, 37.906426 ], [ -87.507483, 37.906730 ], [ -87.501131, 37.909162 ], [ -87.490411, 37.916682 ], [ -87.486347, 37.920218 ], [ -87.465514, 37.933690 ], [ -87.450458, 37.941451 ], [ -87.447786, 37.942427 ], [ -87.436859, 37.944192 ], [ -87.428521, 37.944811 ], [ -87.418585, 37.944763 ], [ -87.402632, 37.942267 ], [ -87.401160, 37.941227 ], [ -87.380247, 37.935596 ], [ -87.372439, 37.932044 ], [ -87.372039, 37.931708 ], [ -87.372711, 37.930556 ], [ -87.372327, 37.930028 ], [ -87.363622, 37.922348 ], [ -87.361638, 37.921004 ], [ -87.358294, 37.920540 ], [ -87.354710, 37.918252 ], [ -87.352614, 37.916124 ], [ -87.344933, 37.911164 ], [ -87.335397, 37.907565 ], [ -87.334165, 37.908205 ], [ -87.331765, 37.908253 ], [ -87.320036, 37.905741 ], [ -87.302324, 37.898445 ], [ -87.274370, 37.882942 ], [ -87.269890, 37.879854 ], [ -87.262930, 37.872846 ], [ -87.255250, 37.867326 ], [ -87.220944, 37.849134 ], [ -87.212416, 37.846223 ], [ -87.202240, 37.843791 ], [ -87.180063, 37.841375 ], [ -87.170831, 37.842319 ], [ -87.164863, 37.841215 ], [ -87.162319, 37.840159 ], [ -87.158878, 37.837871 ], [ -87.153486, 37.832384 ], [ -87.141950, 37.816176 ], [ -87.137502, 37.807264 ], [ -87.133149, 37.792208 ], [ -87.129629, 37.786608 ], [ -87.127533, 37.785040 ], [ -87.119229, 37.782848 ], [ -87.111133, 37.782512 ], [ -87.099900, 37.784640 ], [ -87.090636, 37.787808 ], [ -87.077404, 37.796209 ], [ -87.070732, 37.801937 ], [ -87.067836, 37.806065 ], [ -87.065388, 37.810481 ], [ -87.057836, 37.827457 ], [ -87.055404, 37.835297 ], [ -87.051452, 37.853681 ], [ -87.049260, 37.859745 ], [ -87.043854, 37.870796 ], [ -87.043049, 37.875049 ], [ -87.043407, 37.879940 ], [ -87.044144, 37.884025 ], [ -87.045894, 37.887574 ], [ -87.046237, 37.889866 ], [ -87.045101, 37.893775 ], [ -87.042249, 37.898291 ], [ -87.033444, 37.906593 ], [ -87.010315, 37.919668 ], [ -87.003301, 37.922395 ], [ -86.978957, 37.930200 ], [ -86.969044, 37.932858 ], [ -86.964785, 37.932384 ], [ -86.944633, 37.933534 ], [ -86.933357, 37.934939 ], [ -86.927747, 37.934956 ], [ -86.919329, 37.936664 ], [ -86.907131, 37.943023 ], [ -86.902413, 37.946161 ], [ -86.892084, 37.955929 ], [ -86.884961, 37.964373 ], [ -86.881338, 37.967523 ], [ -86.875874, 37.970770 ], [ -86.870388, 37.975276 ], [ -86.866936, 37.979294 ], [ -86.863224, 37.982495 ], [ -86.855950, 37.987292 ], [ -86.849027, 37.990020 ], [ -86.835161, 37.993750 ], [ -86.823491, 37.998939 ], [ -86.820071, 37.999392 ], [ -86.815267, 37.998877 ], [ -86.810913, 37.997150 ], [ -86.794985, 37.988982 ], [ -86.790597, 37.980062 ], [ -86.788044, 37.972840 ], [ -86.779993, 37.956522 ], [ -86.765054, 37.932510 ], [ -86.750990, 37.912893 ], [ -86.734718, 37.896587 ], [ -86.731460, 37.894340 ], [ -86.722247, 37.892648 ], [ -86.718462, 37.893123 ], [ -86.716138, 37.894073 ], [ -86.707816, 37.898367 ], [ -86.691994, 37.908529 ], [ -86.686015, 37.913084 ], [ -86.680929, 37.915010 ], [ -86.673038, 37.914903 ], [ -86.660888, 37.913059 ], [ -86.650087, 37.910616 ], [ -86.647081, 37.908621 ], [ -86.645513, 37.906529 ], [ -86.644143, 37.902366 ], [ -86.644039, 37.898202 ], [ -86.644754, 37.894806 ], [ -86.648727, 37.886036 ], [ -86.658374, 37.869376 ], [ -86.661233, 37.862761 ], [ -86.662495, 37.856951 ], [ -86.661637, 37.849714 ], [ -86.658268, 37.844144 ], [ -86.655296, 37.842508 ], [ -86.652516, 37.841636 ], [ -86.648028, 37.841425 ], [ -86.638265, 37.842718 ], [ -86.634271, 37.843845 ], [ -86.625763, 37.847266 ], [ -86.615215, 37.852857 ], [ -86.609163, 37.855408 ], [ -86.604624, 37.858272 ], [ -86.598108, 37.867382 ], [ -86.597320, 37.870162 ], [ -86.597476, 37.871478 ], [ -86.599390, 37.874753 ], [ -86.598317, 37.880420 ], [ -86.598151, 37.884553 ], [ -86.600096, 37.901218 ], [ -86.599848, 37.906754 ], [ -86.598452, 37.910965 ], [ -86.596125, 37.914289 ], [ -86.588581, 37.921159 ], [ -86.586542, 37.922285 ], [ -86.580322, 37.923145 ], [ -86.566256, 37.922164 ], [ -86.548507, 37.917842 ], [ -86.540722, 37.916871 ], [ -86.534156, 37.917007 ], [ -86.528279, 37.918618 ], [ -86.519240, 37.922163 ], [ -86.511005, 37.926120 ], [ -86.507831, 37.928829 ], [ -86.506620, 37.930719 ], [ -86.507043, 37.936439 ], [ -86.509390, 37.942492 ], [ -86.512588, 37.946950 ], [ -86.518575, 37.951798 ], [ -86.520503, 37.954438 ], [ -86.523831, 37.962169 ], [ -86.525174, 37.968228 ], [ -86.524888, 37.981834 ], [ -86.525844, 37.998385 ], [ -86.525671, 38.007145 ], [ -86.524656, 38.012894 ], [ -86.524385, 38.018609 ], [ -86.524969, 38.027879 ], [ -86.521825, 38.038327 ], [ -86.519404, 38.041241 ], [ -86.517289, 38.042634 ], [ -86.511760, 38.044448 ], [ -86.500051, 38.045757 ], [ -86.480393, 38.045578 ], [ -86.471903, 38.046218 ], [ -86.452192, 38.050490 ], [ -86.438236, 38.060426 ], [ -86.432789, 38.067171 ], [ -86.430091, 38.078638 ], [ -86.434046, 38.086763 ], [ -86.458795, 38.096404 ], [ -86.463858, 38.101177 ], [ -86.466217, 38.106781 ], [ -86.466081, 38.114437 ], [ -86.463248, 38.119278 ], [ -86.457115, 38.124531 ], [ -86.449793, 38.127223 ], [ -86.431749, 38.126121 ], [ -86.418760, 38.117693 ], [ -86.405068, 38.105801 ], [ -86.401653, 38.105396 ], [ -86.396215, 38.107789 ], [ -86.387216, 38.124632 ], [ -86.379775, 38.129274 ], [ -86.375324, 38.130629 ], [ -86.352466, 38.128459 ], [ -86.335145, 38.129242 ], [ -86.328398, 38.132877 ], [ -86.323453, 38.139032 ], [ -86.321274, 38.147418 ], [ -86.325941, 38.154317 ], [ -86.353625, 38.159579 ], [ -86.371740, 38.164183 ], [ -86.377434, 38.171379 ], [ -86.378151, 38.185845 ], [ -86.373801, 38.193352 ], [ -86.360377, 38.198796 ], [ -86.347736, 38.195363 ], [ -86.332810, 38.182938 ], [ -86.317139, 38.172907 ], [ -86.304155, 38.167872 ], [ -86.287773, 38.158050 ], [ -86.271802, 38.137874 ], [ -86.271223, 38.130112 ], [ -86.278656, 38.098509 ], [ -86.278720, 38.089303 ], [ -86.273584, 38.067443 ], [ -86.267310, 38.057655 ], [ -86.266891, 38.057125 ], [ -86.261273, 38.052721 ], [ -86.249972, 38.045830 ], [ -86.233057, 38.039305 ], [ -86.225519, 38.033280 ], [ -86.220371, 38.027922 ], [ -86.206439, 38.021876 ], [ -86.190927, 38.016438 ], [ -86.178983, 38.011308 ], [ -86.172186, 38.009920 ], [ -86.167310, 38.009879 ], [ -86.141063, 38.015470 ], [ -86.127570, 38.016011 ], [ -86.118208, 38.015279 ], [ -86.108156, 38.013416 ], [ -86.095766, 38.008930 ], [ -86.087525, 38.005127 ], [ -86.080034, 38.000848 ], [ -86.075393, 37.996948 ], [ -86.073980, 37.995449 ], [ -86.074915, 37.993345 ], [ -86.071644, 37.987200 ], [ -86.064859, 37.975618 ], [ -86.061731, 37.971326 ], [ -86.053912, 37.963571 ], [ -86.048458, 37.959369 ], [ -86.045208, 37.958258 ], [ -86.042354, 37.958018 ], [ -86.038188, 37.959350 ], [ -86.036013, 37.961703 ], [ -86.034355, 37.964621 ], [ -86.033386, 37.970382 ], [ -86.035279, 37.981228 ], [ -86.035012, 37.984814 ], [ -86.032468, 37.990100 ], [ -86.029509, 37.992640 ], [ -86.020655, 37.996116 ], [ -86.009127, 37.998529 ], [ -85.996582, 38.000073 ], [ -85.976028, 38.003560 ], [ -85.958299, 38.004616 ], [ -85.951467, 38.005608 ], [ -85.939483, 38.010951 ], [ -85.934635, 38.014423 ], [ -85.930235, 38.018311 ], [ -85.925418, 38.023456 ], [ -85.922395, 38.028679 ], [ -85.921371, 38.032135 ], [ -85.919563, 38.041079 ], [ -85.918379, 38.054214 ], [ -85.916987, 38.061846 ], [ -85.915643, 38.066470 ], [ -85.913163, 38.073370 ], [ -85.906163, 38.086170 ], [ -85.904564, 38.100270 ], [ -85.905164, 38.111070 ], [ -85.909464, 38.140070 ], [ -85.908764, 38.161169 ], [ -85.897664, 38.184269 ], [ -85.894764, 38.188469 ], [ -85.880264, 38.203369 ], [ -85.868564, 38.211969 ], [ -85.851436, 38.223189 ], [ -85.845464, 38.230270 ], [ -85.839664, 38.239770 ], [ -85.837964, 38.251170 ], [ -85.838064, 38.257369 ], [ -85.834864, 38.268069 ], [ -85.829364, 38.276769 ], [ -85.823764, 38.280569 ], [ -85.816164, 38.282969 ], [ -85.802563, 38.284969 ], [ -85.796063, 38.286669 ], [ -85.794063, 38.287869 ], [ -85.791563, 38.288569 ], [ -85.780963, 38.288469 ], [ -85.773363, 38.286169 ], [ -85.765963, 38.280469 ], [ -85.765763, 38.279669 ], [ -85.766563, 38.277670 ], [ -85.761062, 38.272570 ], [ -85.750962, 38.267870 ], [ -85.744862, 38.267170 ], [ -85.738746, 38.269366 ], [ -85.683561, 38.295469 ], [ -85.675017, 38.301317 ], [ -85.668698, 38.310517 ], [ -85.659897, 38.319396 ], [ -85.653641, 38.327108 ], [ -85.646201, 38.342916 ], [ -85.638777, 38.361443 ], [ -85.638009, 38.366115 ], [ -85.638521, 38.376802 ], [ -85.638041, 38.380338 ], [ -85.632937, 38.395666 ], [ -85.629961, 38.402306 ], [ -85.621625, 38.417089 ], [ -85.620329, 38.421697 ], [ -85.620521, 38.423105 ], [ -85.607629, 38.439295 ], [ -85.603833, 38.442094 ], [ -85.587758, 38.450495 ], [ -85.575254, 38.453292 ], [ -85.553304, 38.453880 ], [ -85.536542, 38.456083 ], [ -85.527164, 38.458290 ], [ -85.516939, 38.461357 ], [ -85.498866, 38.468242 ], [ -85.491422, 38.474702 ], [ -85.482897, 38.485701 ], [ -85.481246, 38.488374 ], [ -85.479472, 38.494533 ], [ -85.477670, 38.498320 ], [ -85.474354, 38.504074 ], [ -85.472221, 38.506279 ], [ -85.466691, 38.510280 ], [ -85.462518, 38.512602 ], [ -85.458496, 38.514400 ], [ -85.441725, 38.520191 ], [ -85.433136, 38.523914 ], [ -85.425787, 38.528730 ], [ -85.423077, 38.531581 ], [ -85.417322, 38.540763 ], [ -85.415600, 38.546341 ], [ -85.415272, 38.555416 ], [ -85.415821, 38.563558 ], [ -85.419883, 38.573558 ], [ -85.436170, 38.598292 ], [ -85.437446, 38.601724 ], [ -85.438594, 38.605405 ], [ -85.439351, 38.610388 ], [ -85.439458, 38.632366 ], [ -85.437738, 38.648898 ], [ -85.438742, 38.659319 ], [ -85.444815, 38.670083 ], [ -85.455486, 38.682090 ], [ -85.456481, 38.685069 ], [ -85.456978, 38.689135 ], [ -85.455967, 38.695655 ], [ -85.452114, 38.709348 ], [ -85.448862, 38.713368 ], [ -85.442271, 38.719850 ], [ -85.437766, 38.726405 ], [ -85.434065, 38.729455 ], [ -85.422021, 38.734834 ], [ -85.416631, 38.736272 ], [ -85.410925, 38.737080 ], [ -85.400481, 38.735980 ], [ -85.372284, 38.730576 ], [ -85.363827, 38.730477 ], [ -85.351776, 38.731638 ], [ -85.340953, 38.733893 ], [ -85.330807, 38.736705 ], [ -85.306049, 38.741649 ], [ -85.289226, 38.742410 ], [ -85.275454, 38.741172 ], [ -85.267639, 38.739899 ], [ -85.258846, 38.737754 ], [ -85.246505, 38.731821 ], [ -85.242434, 38.726235 ], [ -85.238665, 38.722494 ], [ -85.226062, 38.705456 ], [ -85.221124, 38.700957 ], [ -85.213257, 38.695446 ], [ -85.204500, 38.691692 ], [ -85.190507, 38.687950 ], [ -85.187278, 38.687609 ], [ -85.177112, 38.688405 ], [ -85.172528, 38.688082 ], [ -85.156158, 38.692251 ], [ -85.146861, 38.695427 ], [ -85.138680, 38.699168 ], [ -85.133049, 38.702375 ], [ -85.121357, 38.711232 ], [ -85.106902, 38.720789 ], [ -85.106979, 38.721630 ], [ -85.103313, 38.725323 ], [ -85.100963, 38.726800 ], [ -85.082180, 38.735439 ], [ -85.076369, 38.739496 ], [ -85.071928, 38.741567 ], [ -85.060264, 38.744948 ], [ -85.047967, 38.750849 ], [ -85.040938, 38.755163 ], [ -85.011772, 38.766712 ], [ -84.999949, 38.774715 ], [ -84.995939, 38.776756 ], [ -84.990006, 38.778383 ], [ -84.978723, 38.779280 ], [ -84.962535, 38.778035 ], [ -84.947644, 38.775273 ], [ -84.941071, 38.775627 ], [ -84.932977, 38.777519 ], [ -84.915234, 38.784086 ], [ -84.901874, 38.790604 ], [ -84.893930, 38.793704 ], [ -84.887919, 38.794652 ], [ -84.856904, 38.790224 ], [ -84.847918, 38.788106 ], [ -84.835672, 38.784289 ], [ -84.828714, 38.783208 ], [ -84.821378, 38.783111 ], [ -84.814641, 38.784488 ], [ -84.812877, 38.786087 ], [ -84.811752, 38.789169 ], [ -84.811645, 38.792766 ], [ -84.813939, 38.800209 ], [ -84.816506, 38.805320 ], [ -84.827098, 38.818634 ], [ -84.829886, 38.825405 ], [ -84.829958, 38.830632 ], [ -84.827488, 38.834909 ], [ -84.823363, 38.839196 ], [ -84.817169, 38.843420 ], [ -84.803247, 38.850723 ], [ -84.793714, 38.857788 ], [ -84.791002, 38.860572 ], [ -84.788302, 38.864325 ], [ -84.785799, 38.869496 ], [ -84.784579, 38.875320 ], [ -84.785234, 38.880439 ], [ -84.786406, 38.882220 ], [ -84.788143, 38.883728 ], [ -84.800247, 38.891070 ], [ -84.812746, 38.895132 ], [ -84.819073, 38.895469 ], [ -84.830472, 38.897256 ], [ -84.860759, 38.897654 ], [ -84.867778, 38.899133 ], [ -84.870124, 38.900389 ], [ -84.877029, 38.909016 ], [ -84.878817, 38.913405 ], [ -84.879268, 38.916116 ], [ -84.877762, 38.920357 ], [ -84.870759, 38.929231 ], [ -84.864731, 38.934893 ], [ -84.835160, 38.957961 ], [ -84.832617, 38.961460 ], [ -84.829857, 38.969385 ], [ -84.830619, 38.974898 ], [ -84.833473, 38.981522 ], [ -84.837120, 38.988059 ], [ -84.839830, 38.991290 ], [ -84.847094, 38.997309 ], [ -84.849445, 39.000923 ], [ -84.850354, 39.003250 ], [ -84.856959, 39.011528 ], [ -84.870168, 39.025551 ], [ -84.882856, 39.034031 ], [ -84.889065, 39.040820 ], [ -84.894281, 39.049572 ], [ -84.897171, 39.052407 ], [ -84.897364, 39.057378 ], [ -84.893873, 39.062466 ], [ -84.888873, 39.066376 ], [ -84.860689, 39.078140 ], [ -84.849574, 39.088264 ], [ -84.839515, 39.095292 ], [ -84.831197, 39.101920 ], [ -84.826246, 39.104170 ], [ -84.820157, 39.105480 ], [ -84.813767, 39.106492 ], [ -84.812241, 39.107102 ], [ -84.810753, 39.109142 ], [ -84.793820, 39.112939 ], [ -84.787680, 39.115297 ], [ -84.783991, 39.118060 ], [ -84.766749, 39.138558 ], [ -84.754449, 39.146658 ], [ -84.750749, 39.147358 ], [ -84.744149, 39.147458 ], [ -84.732048, 39.144458 ], [ -84.726148, 39.141958 ], [ -84.718548, 39.137059 ], [ -84.714048, 39.132659 ], [ -84.701947, 39.118959 ], [ -84.689747, 39.104159 ], [ -84.684847, 39.100459 ], [ -84.677247, 39.098260 ], [ -84.666147, 39.097960 ], [ -84.657246, 39.095460 ], [ -84.650346, 39.091660 ], [ -84.632446, 39.076760 ], [ -84.620112, 39.073457 ], [ -84.607928, 39.073238 ], [ -84.601682, 39.074115 ], [ -84.592408, 39.078088 ], [ -84.572144, 39.082060 ], [ -84.563944, 39.087360 ], [ -84.557544, 39.094860 ], [ -84.554444, 39.097660 ], [ -84.550844, 39.099360 ], [ -84.543544, 39.099660 ], [ -84.541344, 39.099160 ], [ -84.524644, 39.092160 ], [ -84.519543, 39.092060 ], [ -84.509743, 39.093660 ], [ -84.502062, 39.096641 ], [ -84.496543, 39.100260 ], [ -84.493743, 39.102460 ], [ -84.487743, 39.110760 ], [ -84.480943, 39.116760 ], [ -84.476243, 39.119160 ], [ -84.470542, 39.121460 ], [ -84.462042, 39.121760 ], [ -84.455342, 39.120360 ], [ -84.449793, 39.117754 ], [ -84.445242, 39.114461 ], [ -84.440642, 39.109661 ], [ -84.435541, 39.102261 ], [ -84.432841, 39.094261 ], [ -84.433941, 39.092461 ], [ -84.434641, 39.086861 ], [ -84.432941, 39.083961 ], [ -84.432641, 39.078261 ], [ -84.433141, 39.072961 ], [ -84.432341, 39.067561 ], [ -84.429841, 39.058262 ], [ -84.427913, 39.054962 ], [ -84.425730, 39.053059 ], [ -84.421467, 39.050938 ], [ -84.406941, 39.045662 ], [ -84.402540, 39.045662 ], [ -84.400940, 39.046362 ], [ -84.394140, 39.045262 ], [ -84.386840, 39.045162 ], [ -84.360439, 39.041362 ], [ -84.346039, 39.036963 ], [ -84.336339, 39.032863 ], [ -84.326539, 39.027463 ], [ -84.313680, 39.016981 ], [ -84.304698, 39.006455 ], [ -84.299362, 38.995985 ], [ -84.297255, 38.989694 ], [ -84.296466, 38.985306 ], [ -84.295076, 38.968295 ], [ -84.288164, 38.955789 ], [ -84.279916, 38.945168 ], [ -84.274910, 38.941511 ], [ -84.260797, 38.926593 ], [ -84.257010, 38.923208 ], [ -84.245647, 38.907035 ], [ -84.242689, 38.903187 ], [ -84.240155, 38.900912 ], [ -84.234453, 38.893226 ], [ -84.232343, 38.884325 ], [ -84.232132, 38.880483 ], [ -84.231837, 38.872870 ], [ -84.233727, 38.853576 ], [ -84.233265, 38.842671 ], [ -84.231306, 38.830552 ], [ -84.230181, 38.826547 ], [ -84.225300, 38.817665 ], [ -84.222059, 38.813753 ], [ -84.212904, 38.805707 ], [ -84.205592, 38.802588 ], [ -84.198358, 38.800920 ], [ -84.155912, 38.794909 ], [ -84.135088, 38.789485 ], [ -84.115655, 38.782721 ], [ -84.108836, 38.779247 ], [ -84.094334, 38.775246 ], [ -84.071491, 38.770475 ], [ -84.063410, 38.771151 ], [ -84.051642, 38.771397 ], [ -84.044486, 38.770572 ], [ -84.023113, 38.775061 ], [ -84.006104, 38.780156 ], [ -83.995447, 38.781912 ], [ -83.978814, 38.787104 ], [ -83.962123, 38.787384 ], [ -83.953546, 38.786172 ], [ -83.943978, 38.783616 ], [ -83.928454, 38.774583 ], [ -83.928591, 38.772203 ], [ -83.926986, 38.771562 ], [ -83.917217, 38.769665 ], [ -83.912922, 38.769763 ], [ -83.903971, 38.768160 ], [ -83.887107, 38.765600 ], [ -83.873168, 38.762418 ], [ -83.866530, 38.760200 ], [ -83.859028, 38.756793 ], [ -83.852085, 38.751433 ], [ -83.848734, 38.747178 ], [ -83.846207, 38.742290 ], [ -83.844676, 38.737439 ], [ -83.842740, 38.730365 ], [ -83.842506, 38.727019 ], [ -83.841689, 38.724264 ], [ -83.840595, 38.721912 ], [ -83.836696, 38.717857 ], [ -83.834015, 38.716008 ], [ -83.821854, 38.709575 ], [ -83.813880, 38.707446 ], [ -83.806317, 38.706613 ], [ -83.798549, 38.704668 ], [ -83.790676, 38.701676 ], [ -83.787113, 38.699489 ], [ -83.783620, 38.695641 ], [ -83.779961, 38.684907 ], [ -83.777141, 38.671205 ], [ -83.775761, 38.666748 ], [ -83.772160, 38.658150 ], [ -83.769347, 38.655220 ], [ -83.765090, 38.652881 ], [ -83.762445, 38.652103 ], [ -83.749920, 38.649613 ], [ -83.738207, 38.647932 ], [ -83.720779, 38.646704 ], [ -83.717915, 38.645247 ], [ -83.716933, 38.643657 ], [ -83.713405, 38.641591 ], [ -83.708164, 38.639843 ], [ -83.704006, 38.639724 ], [ -83.685520, 38.631890 ], [ -83.679484, 38.630036 ], [ -83.668111, 38.628068 ], [ -83.663911, 38.627930 ], [ -83.659304, 38.628592 ], [ -83.655425, 38.629735 ], [ -83.652916, 38.630604 ], [ -83.649737, 38.632753 ], [ -83.645914, 38.637007 ], [ -83.642994, 38.643273 ], [ -83.639954, 38.652468 ], [ -83.639396, 38.659171 ], [ -83.637377, 38.667930 ], [ -83.636208, 38.670584 ], [ -83.634018, 38.673351 ], [ -83.626922, 38.679387 ], [ -83.615736, 38.684145 ], [ -83.574754, 38.692671 ], [ -83.575121, 38.691746 ], [ -83.569098, 38.692842 ], [ -83.561870, 38.695371 ], [ -83.549298, 38.698787 ], [ -83.533339, 38.702105 ], [ -83.520953, 38.703045 ], [ -83.512571, 38.701716 ], [ -83.504365, 38.699256 ], [ -83.493342, 38.694187 ], [ -83.486477, 38.690099 ], [ -83.476420, 38.682261 ], [ -83.472157, 38.678123 ], [ -83.468059, 38.675470 ], [ -83.459809, 38.673617 ], [ -83.457055, 38.673965 ], [ -83.446989, 38.670143 ], [ -83.440404, 38.669361 ], [ -83.420194, 38.668428 ], [ -83.412039, 38.666499 ], [ -83.384755, 38.663171 ], [ -83.376302, 38.661473 ], [ -83.366661, 38.658537 ], [ -83.356445, 38.654009 ], [ -83.340004, 38.645674 ], [ -83.327636, 38.637489 ], [ -83.322383, 38.630615 ], [ -83.320531, 38.622713 ], [ -83.320099, 38.616043 ], [ -83.319101, 38.612233 ], [ -83.317542, 38.609242 ], [ -83.311448, 38.603314 ], [ -83.307832, 38.600824 ], [ -83.301951, 38.598178 ], [ -83.294193, 38.596588 ], [ -83.288885, 38.597977 ], [ -83.286514, 38.599241 ], [ -83.268510, 38.615104 ], [ -83.267694, 38.618221 ], [ -83.264011, 38.621535 ], [ -83.261126, 38.622723 ], [ -83.254558, 38.623403 ], [ -83.251103, 38.626224 ], [ -83.245572, 38.627936 ], [ -83.239515, 38.628588 ], [ -83.232404, 38.627569 ], [ -83.223076, 38.624158 ], [ -83.211027, 38.618578 ], [ -83.202453, 38.616956 ], [ -83.191400, 38.617598 ], [ -83.172647, 38.620252 ], [ -83.164744, 38.620068 ], [ -83.156926, 38.620547 ], [ -83.142836, 38.625076 ], [ -83.138572, 38.628286 ], [ -83.135046, 38.631719 ], [ -83.128973, 38.640231 ], [ -83.126311, 38.645244 ], [ -83.122547, 38.659200 ], [ -83.117860, 38.666073 ], [ -83.112372, 38.671685 ], [ -83.107436, 38.675220 ], [ -83.102746, 38.677316 ], [ -83.084226, 38.681090 ], [ -83.064319, 38.688976 ], [ -83.053104, 38.695831 ], [ -83.042338, 38.708319 ], [ -83.038442, 38.716377 ], [ -83.035964, 38.720152 ], [ -83.033014, 38.723805 ], [ -83.030702, 38.725720 ], [ -83.027917, 38.727143 ], [ -83.021752, 38.728790 ], [ -83.011816, 38.730057 ], [ -82.999296, 38.729376 ], [ -82.993996, 38.728576 ], [ -82.986095, 38.726276 ], [ -82.979395, 38.725976 ], [ -82.968695, 38.728776 ], [ -82.958895, 38.734976 ], [ -82.943147, 38.743280 ], [ -82.923694, 38.750076 ], [ -82.894193, 38.756576 ], [ -82.889193, 38.756076 ], [ -82.879492, 38.751476 ], [ -82.875492, 38.747276 ], [ -82.872592, 38.742576 ], [ -82.871292, 38.739376 ], [ -82.869892, 38.728177 ], [ -82.870392, 38.722077 ], [ -82.871192, 38.718377 ], [ -82.875292, 38.704977 ], [ -82.876892, 38.697377 ], [ -82.877592, 38.690177 ], [ -82.874892, 38.682827 ], [ -82.869592, 38.678177 ], [ -82.863291, 38.669277 ], [ -82.859391, 38.660378 ], [ -82.856291, 38.646078 ], [ -82.856791, 38.632878 ], [ -82.855795, 38.620814 ], [ -82.854291, 38.613454 ], [ -82.851314, 38.604334 ], [ -82.847186, 38.595166 ], [ -82.844306, 38.590862 ], [ -82.839538, 38.586159 ], [ -82.820161, 38.572703 ], [ -82.800112, 38.563183 ], [ -82.789776, 38.559951 ], [ -82.779472, 38.559023 ], [ -82.763695, 38.560399 ], [ -82.739582, 38.558991 ], [ -82.730958, 38.559264 ], [ -82.724846, 38.557600 ], [ -82.719662, 38.553664 ], [ -82.714142, 38.550544 ], [ -82.700045, 38.544336 ], [ -82.696621, 38.542112 ], [ -82.689965, 38.535920 ], [ -82.675724, 38.515504 ], [ -82.665548, 38.505808 ], [ -82.657051, 38.496816 ], [ -82.648395, 38.490368 ], [ -82.637707, 38.484449 ], [ -82.624106, 38.479697 ], [ -82.618474, 38.477089 ], [ -82.613802, 38.474529 ], [ -82.610458, 38.471457 ], [ -82.608202, 38.468049 ], [ -82.604089, 38.459841 ], [ -82.600761, 38.437425 ], [ -82.596921, 38.426705 ], [ -82.593673, 38.421809 ], [ -82.596281, 38.417681 ], [ -82.597113, 38.412881 ], [ -82.597033, 38.409937 ], [ -82.595001, 38.401330 ], [ -82.597801, 38.395154 ], [ -82.599241, 38.393170 ], [ -82.599737, 38.390370 ], [ -82.599273, 38.388738 ], [ -82.595369, 38.382722 ], [ -82.595382, 38.382712 ], [ -82.593008, 38.375082 ], [ -82.593952, 38.371847 ], [ -82.596654, 38.367338 ], [ -82.597524, 38.364843 ], [ -82.598189, 38.357885 ], [ -82.597979, 38.344909 ], [ -82.596525, 38.342849 ], [ -82.592543, 38.341660 ], [ -82.589724, 38.340265 ], [ -82.587951, 38.338595 ], [ -82.585363, 38.334064 ], [ -82.576936, 38.328275 ], [ -82.572691, 38.318801 ], [ -82.571877, 38.315781 ], [ -82.571964, 38.313606 ], [ -82.572893, 38.311981 ], [ -82.578352, 38.305458 ], [ -82.581460, 38.300445 ], [ -82.583056, 38.296829 ], [ -82.582823, 38.295478 ], [ -82.579743, 38.291726 ], [ -82.579480, 38.284928 ], [ -82.578782, 38.281747 ], [ -82.576720, 38.277513 ], [ -82.574600, 38.274721 ], [ -82.574656, 38.263873 ], [ -82.578254, 38.254809 ], [ -82.581796, 38.248592 ], [ -82.584001, 38.246371 ], [ -82.586061, 38.245616 ], [ -82.594970, 38.245453 ], [ -82.604230, 38.247303 ], [ -82.605333, 38.247303 ], [ -82.607131, 38.245975 ], [ -82.612260, 38.236087 ], [ -82.612520, 38.234553 ], [ -82.610367, 38.226772 ], [ -82.608944, 38.223660 ], [ -82.605750, 38.221144 ], [ -82.600353, 38.218949 ], [ -82.598437, 38.217393 ], [ -82.598864, 38.201007 ], [ -82.599326, 38.197231 ], [ -82.604250, 38.187639 ], [ -82.611343, 38.171548 ], [ -82.613487, 38.170242 ], [ -82.619429, 38.169027 ], [ -82.625457, 38.170491 ], [ -82.639054, 38.171114 ], [ -82.642997, 38.169560 ], [ -82.644739, 38.165487 ], [ -82.638947, 38.156742 ], [ -82.638398, 38.152157 ], [ -82.638288, 38.143491 ], [ -82.637306, 38.139050 ], [ -82.636466, 38.137860 ], [ -82.634265, 38.136669 ], [ -82.626182, 38.134835 ], [ -82.622125, 38.133414 ], [ -82.621167, 38.131996 ], [ -82.621164, 38.123239 ], [ -82.620351, 38.121477 ], [ -82.619452, 38.120745 ], [ -82.616149, 38.120221 ], [ -82.606589, 38.120843 ], [ -82.602618, 38.118350 ], [ -82.600127, 38.117389 ], [ -82.598011, 38.115925 ], [ -82.593605, 38.110869 ], [ -82.591780, 38.109908 ], [ -82.587782, 38.108879 ], [ -82.585696, 38.107003 ], [ -82.585142, 38.098055 ], [ -82.585488, 38.094256 ], [ -82.584039, 38.090663 ], [ -82.574075, 38.082104 ], [ -82.565736, 38.080640 ], [ -82.559598, 38.072837 ], [ -82.551259, 38.070799 ], [ -82.549580, 38.068579 ], [ -82.549407, 38.063063 ], [ -82.547284, 38.061094 ], [ -82.544850, 38.058521 ], [ -82.544779, 38.054262 ], [ -82.543916, 38.052133 ], [ -82.541245, 38.048444 ], [ -82.537293, 38.045204 ], [ -82.537470, 38.042701 ], [ -82.539071, 38.039788 ], [ -82.538639, 38.037381 ], [ -82.534976, 38.032250 ], [ -82.530371, 38.028792 ], [ -82.527068, 38.027586 ], [ -82.525817, 38.026406 ], [ -82.525831, 38.019564 ], [ -82.522591, 38.012968 ], [ -82.519665, 38.008538 ], [ -82.517606, 38.007222 ], [ -82.517351, 38.005131 ], [ -82.517810, 38.002479 ], [ -82.517351, 38.001204 ], [ -82.515974, 37.999929 ], [ -82.513271, 37.999674 ], [ -82.509812, 38.001249 ], [ -82.507197, 38.001512 ], [ -82.499874, 37.999157 ], [ -82.489780, 37.998869 ], [ -82.487732, 37.998330 ], [ -82.485967, 37.995705 ], [ -82.485675, 37.989352 ], [ -82.485128, 37.986920 ], [ -82.483871, 37.984505 ], [ -82.482695, 37.984014 ], [ -82.471629, 37.986826 ], [ -82.467015, 37.985578 ], [ -82.465473, 37.984780 ], [ -82.464257, 37.983412 ], [ -82.464067, 37.980295 ], [ -82.464987, 37.976859 ], [ -82.469380, 37.973059 ], [ -82.479963, 37.973169 ], [ -82.483836, 37.971566 ], [ -82.484413, 37.969895 ], [ -82.484758, 37.965752 ], [ -82.484265, 37.963646 ], [ -82.479031, 37.962000 ], [ -82.472669, 37.960721 ], [ -82.471657, 37.959988 ], [ -82.471801, 37.959119 ], [ -82.475096, 37.954906 ], [ -82.480960, 37.949136 ], [ -82.485120, 37.946044 ], [ -82.487836, 37.945288 ], [ -82.495294, 37.946612 ], [ -82.496681, 37.946405 ], [ -82.497300, 37.945507 ], [ -82.497285, 37.942903 ], [ -82.496822, 37.942262 ], [ -82.493728, 37.940455 ], [ -82.489566, 37.939107 ], [ -82.489045, 37.938718 ], [ -82.489160, 37.937963 ], [ -82.489737, 37.936635 ], [ -82.491182, 37.935810 ], [ -82.497540, 37.936791 ], [ -82.500386, 37.936518 ], [ -82.501948, 37.934756 ], [ -82.501862, 37.933200 ], [ -82.498140, 37.928300 ], [ -82.495740, 37.927043 ], [ -82.483951, 37.927025 ], [ -82.480338, 37.925836 ], [ -82.481001, 37.924303 ], [ -82.487616, 37.919905 ], [ -82.488279, 37.918120 ], [ -82.487556, 37.916975 ], [ -82.479320, 37.914827 ], [ -82.475534, 37.911945 ], [ -82.474666, 37.910388 ], [ -82.474232, 37.908054 ], [ -82.474635, 37.905902 ], [ -82.475818, 37.904048 ], [ -82.475991, 37.902400 ], [ -82.474574, 37.900295 ], [ -82.472523, 37.899243 ], [ -82.471223, 37.899358 ], [ -82.469058, 37.902220 ], [ -82.468568, 37.904005 ], [ -82.468947, 37.910962 ], [ -82.468197, 37.913847 ], [ -82.464297, 37.915038 ], [ -82.462881, 37.914832 ], [ -82.461493, 37.913093 ], [ -82.460741, 37.910736 ], [ -82.459759, 37.909569 ], [ -82.457794, 37.909089 ], [ -82.452883, 37.908998 ], [ -82.451352, 37.908472 ], [ -82.447596, 37.904352 ], [ -82.438582, 37.900256 ], [ -82.435751, 37.897028 ], [ -82.432113, 37.889910 ], [ -82.429023, 37.888285 ], [ -82.421484, 37.885652 ], [ -82.419781, 37.883821 ], [ -82.419204, 37.882081 ], [ -82.419337, 37.875095 ], [ -82.418690, 37.872375 ], [ -82.417679, 37.870658 ], [ -82.416323, 37.869628 ], [ -82.414417, 37.869033 ], [ -82.410288, 37.868826 ], [ -82.407459, 37.867475 ], [ -82.408441, 37.866056 ], [ -82.409799, 37.865392 ], [ -82.422127, 37.863952 ], [ -82.424090, 37.863037 ], [ -82.424264, 37.861709 ], [ -82.423513, 37.860313 ], [ -82.421983, 37.859397 ], [ -82.414651, 37.856260 ], [ -82.415460, 37.854132 ], [ -82.420484, 37.847496 ], [ -82.420484, 37.846809 ], [ -82.417367, 37.845664 ], [ -82.413153, 37.845343 ], [ -82.412172, 37.844793 ], [ -82.408941, 37.836644 ], [ -82.407874, 37.835499 ], [ -82.399680, 37.829935 ], [ -82.398444, 37.821648 ], [ -82.402199, 37.812678 ], [ -82.402228, 37.810984 ], [ -82.401652, 37.810091 ], [ -82.398710, 37.808785 ], [ -82.396978, 37.809014 ], [ -82.393746, 37.811668 ], [ -82.389212, 37.817206 ], [ -82.387769, 37.818212 ], [ -82.386586, 37.818212 ], [ -82.385259, 37.817410 ], [ -82.379580, 37.810907 ], [ -82.378514, 37.808320 ], [ -82.377393, 37.803009 ], [ -82.374867, 37.802160 ], [ -82.369973, 37.801749 ], [ -82.367780, 37.800628 ], [ -82.365557, 37.798318 ], [ -82.364979, 37.796784 ], [ -82.363795, 37.795435 ], [ -82.361199, 37.794429 ], [ -82.356122, 37.793859 ], [ -82.354275, 37.793104 ], [ -82.348849, 37.787178 ], [ -82.340455, 37.786058 ], [ -82.339705, 37.785509 ], [ -82.338377, 37.780428 ], [ -82.339097, 37.778276 ], [ -82.338895, 37.776857 ], [ -82.337596, 37.775369 ], [ -82.335981, 37.774500 ], [ -82.332607, 37.774249 ], [ -82.329867, 37.775897 ], [ -82.325830, 37.776172 ], [ -82.323696, 37.775028 ], [ -82.323004, 37.773907 ], [ -82.323696, 37.772534 ], [ -82.331654, 37.768161 ], [ -82.333903, 37.766306 ], [ -82.333816, 37.765391 ], [ -82.331162, 37.763125 ], [ -82.329460, 37.762393 ], [ -82.327356, 37.762233 ], [ -82.317611, 37.764889 ], [ -82.312824, 37.765027 ], [ -82.311642, 37.764294 ], [ -82.310777, 37.762692 ], [ -82.310893, 37.762005 ], [ -82.312968, 37.760677 ], [ -82.317668, 37.759624 ], [ -82.319023, 37.758892 ], [ -82.321012, 37.755435 ], [ -82.321415, 37.751269 ], [ -82.328221, 37.748480 ], [ -82.333581, 37.743283 ], [ -82.333349, 37.741200 ], [ -82.326834, 37.736257 ], [ -82.319686, 37.734404 ], [ -82.318879, 37.733763 ], [ -82.318302, 37.733053 ], [ -82.317869, 37.727720 ], [ -82.316197, 37.721541 ], [ -82.311702, 37.718771 ], [ -82.311097, 37.717329 ], [ -82.310665, 37.713300 ], [ -82.307235, 37.707669 ], [ -82.305679, 37.706708 ], [ -82.300954, 37.706135 ], [ -82.298074, 37.704143 ], [ -82.296634, 37.702403 ], [ -82.297325, 37.699817 ], [ -82.301964, 37.696223 ], [ -82.302886, 37.693683 ], [ -82.301504, 37.690775 ], [ -82.297788, 37.687753 ], [ -82.296262, 37.687067 ], [ -82.296118, 37.686174 ], [ -82.297126, 37.684228 ], [ -82.303867, 37.678392 ], [ -82.304501, 37.677157 ], [ -82.303953, 37.675760 ], [ -82.302312, 37.675554 ], [ -82.296724, 37.678071 ], [ -82.294737, 37.678277 ], [ -82.294392, 37.677957 ], [ -82.294134, 37.673378 ], [ -82.294710, 37.672257 ], [ -82.294393, 37.670448 ], [ -82.291773, 37.669143 ], [ -82.288174, 37.668227 ], [ -82.286446, 37.670127 ], [ -82.284687, 37.675277 ], [ -82.283506, 37.676078 ], [ -82.282297, 37.675826 ], [ -82.277876, 37.669998 ], [ -82.272021, 37.663782 ], [ -82.267962, 37.662407 ], [ -82.257111, 37.656749 ], [ -82.252273, 37.656907 ], [ -82.243911, 37.660959 ], [ -82.240773, 37.661785 ], [ -82.239390, 37.661465 ], [ -82.226111, 37.653092 ], [ -82.225535, 37.651947 ], [ -82.224956, 37.647003 ], [ -82.223602, 37.644554 ], [ -82.219340, 37.642931 ], [ -82.216691, 37.641329 ], [ -82.216690, 37.639956 ], [ -82.219078, 37.635903 ], [ -82.220257, 37.634781 ], [ -82.220200, 37.633912 ], [ -82.214815, 37.627572 ], [ -82.215649, 37.626244 ], [ -82.213490, 37.625408 ], [ -82.209691, 37.625103 ], [ -82.204337, 37.625811 ], [ -82.203388, 37.626132 ], [ -82.202467, 37.627483 ], [ -82.201201, 37.627895 ], [ -82.192394, 37.625606 ], [ -82.187298, 37.626935 ], [ -82.186694, 37.627576 ], [ -82.186320, 37.629292 ], [ -82.187471, 37.637029 ], [ -82.187845, 37.638540 ], [ -82.189688, 37.640394 ], [ -82.191242, 37.642867 ], [ -82.191444, 37.644378 ], [ -82.187989, 37.647582 ], [ -82.185456, 37.648933 ], [ -82.177625, 37.648956 ], [ -82.175264, 37.647971 ], [ -82.174631, 37.647422 ], [ -82.174688, 37.646529 ], [ -82.177338, 37.641722 ], [ -82.177511, 37.640417 ], [ -82.175956, 37.637396 ], [ -82.172762, 37.634008 ], [ -82.172446, 37.632589 ], [ -82.173482, 37.631055 ], [ -82.181398, 37.626798 ], [ -82.182438, 37.623971 ], [ -82.181430, 37.621842 ], [ -82.176682, 37.618202 ], [ -82.172710, 37.619850 ], [ -82.169515, 37.621978 ], [ -82.167126, 37.621818 ], [ -82.164191, 37.620192 ], [ -82.164767, 37.618292 ], [ -82.169200, 37.613028 ], [ -82.169057, 37.609869 ], [ -82.168137, 37.608495 ], [ -82.164454, 37.608014 ], [ -82.158554, 37.609546 ], [ -82.156741, 37.609202 ], [ -82.156110, 37.604945 ], [ -82.157609, 37.596773 ], [ -82.156718, 37.592790 ], [ -82.148434, 37.590910 ], [ -82.146419, 37.592650 ], [ -82.141555, 37.595166 ], [ -82.131977, 37.593537 ], [ -82.130165, 37.591544 ], [ -82.127321, 37.586667 ], [ -82.125601, 37.579021 ], [ -82.124307, 37.577806 ], [ -82.124372, 37.576410 ], [ -82.127303, 37.572681 ], [ -82.129604, 37.571972 ], [ -82.141828, 37.570946 ], [ -82.143468, 37.570375 ], [ -82.144648, 37.568315 ], [ -82.144563, 37.566941 ], [ -82.143183, 37.565773 ], [ -82.136800, 37.564421 ], [ -82.133954, 37.562245 ], [ -82.133495, 37.560711 ], [ -82.134705, 37.557278 ], [ -82.134506, 37.554439 ], [ -82.133299, 37.552996 ], [ -82.131776, 37.552423 ], [ -82.127089, 37.551345 ], [ -82.123824, 37.551389 ], [ -82.121985, 37.552763 ], [ -82.120609, 37.556999 ], [ -82.116584, 37.559588 ], [ -82.103127, 37.560097 ], [ -82.102263, 37.559456 ], [ -82.101946, 37.558106 ], [ -82.104303, 37.555655 ], [ -82.105136, 37.554007 ], [ -82.104532, 37.553275 ], [ -82.102893, 37.553046 ], [ -82.098924, 37.553300 ], [ -82.089178, 37.556004 ], [ -82.084605, 37.555410 ], [ -82.075030, 37.555824 ], [ -82.073246, 37.555023 ], [ -82.064418, 37.544516 ], [ -82.063671, 37.541929 ], [ -82.064792, 37.539021 ], [ -82.064418, 37.536870 ], [ -82.063326, 37.536206 ], [ -82.061256, 37.536001 ], [ -82.057460, 37.536893 ], [ -82.054787, 37.536756 ], [ -82.049584, 37.535222 ], [ -82.048463, 37.533962 ], [ -82.048205, 37.528972 ], [ -82.046653, 37.528193 ], [ -82.044382, 37.529017 ], [ -82.042397, 37.533916 ], [ -82.042396, 37.535770 ], [ -82.044810, 37.541814 ], [ -82.045155, 37.544516 ], [ -82.044780, 37.546713 ], [ -82.042825, 37.548361 ], [ -82.038972, 37.547926 ], [ -82.038024, 37.546918 ], [ -82.036932, 37.542729 ], [ -82.028826, 37.537667 ], [ -82.025261, 37.538261 ], [ -82.021006, 37.540526 ], [ -82.018878, 37.540572 ], [ -82.016925, 37.538556 ], [ -82.015920, 37.534321 ], [ -82.013966, 37.533564 ], [ -82.009194, 37.533243 ], [ -82.007412, 37.533677 ], [ -81.999844, 37.542579 ], [ -81.998177, 37.543082 ], [ -81.996912, 37.542808 ], [ -81.996909, 37.538572 ], [ -81.994033, 37.537612 ], [ -81.992597, 37.538323 ], [ -81.989092, 37.542514 ], [ -81.987511, 37.542835 ], [ -81.982479, 37.541807 ], [ -81.980841, 37.542357 ], [ -81.976386, 37.545426 ], [ -81.970147, 37.546504 ], [ -81.964971, 37.543026 ], [ -81.965401, 37.541171 ], [ -81.968297, 37.537798 ], [ -82.050888, 37.480527 ], [ -82.062809, 37.470911 ], [ -82.124854, 37.427272 ], [ -82.201745, 37.375108 ], [ -82.202688, 37.374041 ], [ -82.254352, 37.337745 ], [ -82.291908, 37.311642 ], [ -82.309415, 37.300066 ], [ -82.316028, 37.294879 ], [ -82.317083, 37.293635 ], [ -82.317395, 37.290975 ], [ -82.318957, 37.287524 ], [ -82.324619, 37.283180 ], [ -82.331570, 37.282211 ], [ -82.336942, 37.279737 ], [ -82.341849, 37.280886 ], [ -82.342068, 37.274109 ], [ -82.350948, 37.267077 ], [ -82.355343, 37.265220 ], [ -82.364535, 37.264415 ], [ -82.376595, 37.259900 ], [ -82.383285, 37.260154 ], [ -82.385663, 37.259631 ], [ -82.418085, 37.251331 ], [ -82.431022, 37.246773 ], [ -82.435728, 37.246491 ], [ -82.449164, 37.243908 ], [ -82.451998, 37.242559 ], [ -82.457016, 37.238288 ], [ -82.463073, 37.238292 ], [ -82.473275, 37.235569 ], [ -82.486439, 37.231204 ], [ -82.487317, 37.230578 ], [ -82.487219, 37.227799 ], [ -82.491486, 37.225086 ], [ -82.495243, 37.225606 ], [ -82.496308, 37.227562 ], [ -82.498858, 37.227044 ], [ -82.507895, 37.222727 ], [ -82.508342, 37.222385 ], [ -82.508062, 37.220964 ], [ -82.509431, 37.218924 ], [ -82.520117, 37.212906 ], [ -82.524464, 37.214957 ], [ -82.528746, 37.213742 ], [ -82.531787, 37.212097 ], [ -82.532051, 37.210808 ], [ -82.531576, 37.209163 ], [ -82.536627, 37.206920 ], [ -82.541302, 37.206530 ], [ -82.545804, 37.203070 ], [ -82.550372, 37.204458 ], [ -82.553835, 37.202841 ], [ -82.558178, 37.199606 ], [ -82.565329, 37.196118 ], [ -82.578988, 37.188498 ], [ -82.586718, 37.185623 ], [ -82.592451, 37.182847 ], [ -82.593232, 37.182060 ], [ -82.592766, 37.180391 ], [ -82.597447, 37.177088 ], [ -82.608290, 37.173047 ], [ -82.617423, 37.168129 ], [ -82.624878, 37.162932 ], [ -82.633493, 37.154264 ], [ -82.651646, 37.151908 ], [ -82.653268, 37.151314 ], [ -82.654760, 37.150601 ], [ -82.657468, 37.145024 ], [ -82.662449, 37.143865 ], [ -82.667717, 37.141949 ], [ -82.671530, 37.138444 ], [ -82.676765, 37.134965 ], [ -82.679428, 37.135575 ], [ -82.684601, 37.135835 ], [ -82.695667, 37.131514 ], [ -82.707870, 37.125488 ], [ -82.716334, 37.122093 ], [ -82.718334, 37.122267 ], [ -82.722097, 37.120168 ], [ -82.726201, 37.115882 ], [ -82.726449, 37.114985 ], [ -82.726294, 37.111852 ], [ -82.721941, 37.105689 ], [ -82.721617, 37.101276 ], [ -82.722179, 37.094309 ], [ -82.724358, 37.092990 ], [ -82.724954, 37.091905 ], [ -82.723040, 37.084992 ], [ -82.720597, 37.081833 ], [ -82.718183, 37.080679 ], [ -82.717204, 37.079544 ], [ -82.716740, 37.077220 ], [ -82.718353, 37.075706 ], [ -82.721676, 37.075190 ], [ -82.723747, 37.075525 ], [ -82.727022, 37.073019 ], [ -82.726312, 37.066870 ], [ -82.723904, 37.062542 ], [ -82.722254, 37.057948 ], [ -82.723128, 37.052436 ], [ -82.723279, 37.047616 ], [ -82.722472, 37.045101 ], [ -82.724714, 37.042758 ], [ -82.726279, 37.042098 ], [ -82.731722, 37.043447 ], [ -82.733603, 37.044525 ], [ -82.742454, 37.042980 ], [ -82.743684, 37.041397 ], [ -82.745562, 37.029839 ], [ -82.747981, 37.025214 ], [ -82.750715, 37.024107 ], [ -82.751852, 37.025624 ], [ -82.754051, 37.026587 ], [ -82.759175, 37.027333 ], [ -82.766408, 37.023106 ], [ -82.767083, 37.020935 ], [ -82.771795, 37.015716 ], [ -82.777368, 37.015279 ], [ -82.778386, 37.012521 ], [ -82.782144, 37.008242 ], [ -82.788897, 37.008160 ], [ -82.789092, 37.007995 ], [ -82.790462, 37.007263 ], [ -82.790890, 37.006760 ], [ -82.793441, 37.005491 ], [ -82.794824, 37.005899 ], [ -82.795695, 37.006702 ], [ -82.796187, 37.008502 ], [ -82.797487, 37.009654 ], [ -82.800531, 37.007944 ], [ -82.813579, 37.005320 ], [ -82.815748, 37.007196 ], [ -82.818006, 37.006161 ], [ -82.819715, 37.006212 ], [ -82.821798, 37.004380 ], [ -82.822684, 37.004128 ], [ -82.825224, 37.006279 ], [ -82.828592, 37.005707 ], [ -82.829961, 37.003555 ], [ -82.830588, 37.000945 ], [ -82.829125, 36.997541 ], [ -82.830802, 36.993445 ], [ -82.833843, 36.991973 ], [ -82.836008, 36.988837 ], [ -82.838549, 36.987027 ], [ -82.840051, 36.987113 ], [ -82.841252, 36.986858 ], [ -82.845002, 36.983812 ], [ -82.849429, 36.983479 ], [ -82.851397, 36.984497 ], [ -82.852614, 36.984963 ], [ -82.853729, 36.985178 ], [ -82.856417, 36.982216 ], [ -82.856768, 36.979095 ], [ -82.857936, 36.978276 ], [ -82.860561, 36.978265 ], [ -82.862926, 36.979975 ], [ -82.864909, 36.979010 ], [ -82.866019, 36.978272 ], [ -82.866689, 36.978052 ], [ -82.867535, 36.977518 ], [ -82.868455, 36.976481 ], [ -82.869183, 36.974182 ], [ -82.870274, 36.965993 ], [ -82.870230, 36.965498 ], [ -82.867358, 36.963182 ], [ -82.865404, 36.958084 ], [ -82.864211, 36.957983 ], [ -82.862866, 36.957765 ], [ -82.860534, 36.956015 ], [ -82.858443, 36.954036 ], [ -82.855705, 36.953808 ], [ -82.856099, 36.952471 ], [ -82.859969, 36.949074 ], [ -82.860633, 36.945840 ], [ -82.861282, 36.944848 ], [ -82.861684, 36.939316 ], [ -82.860537, 36.937439 ], [ -82.858784, 36.933065 ], [ -82.858461, 36.932717 ], [ -82.857965, 36.929529 ], [ -82.858635, 36.927785 ], [ -82.860032, 36.925241 ], [ -82.861943, 36.924236 ], [ -82.863468, 36.922308 ], [ -82.865192, 36.920923 ], [ -82.867116, 36.917965 ], [ -82.872136, 36.913456 ], [ -82.873777, 36.912299 ], [ -82.876215, 36.910218 ], [ -82.877473, 36.907960 ], [ -82.872561, 36.903376 ], [ -82.870068, 36.901735 ], [ -82.873213, 36.897263 ], [ -82.876438, 36.896238 ], [ -82.878639, 36.893981 ], [ -82.877862, 36.891843 ], [ -82.878569, 36.889585 ], [ -82.879492, 36.889085 ], [ -82.884626, 36.888477 ], [ -82.887627, 36.886890 ], [ -82.890028, 36.884287 ], [ -82.895445, 36.882145 ], [ -82.906325, 36.879740 ], [ -82.907981, 36.878749 ], [ -82.908004, 36.877233 ], [ -82.907276, 36.875643 ], [ -82.907774, 36.874706 ], [ -82.910315, 36.874055 ], [ -82.911690, 36.874248 ], [ -82.911824, 36.874243 ], [ -82.922410, 36.873925 ], [ -82.937573, 36.867275 ], [ -82.951685, 36.866152 ], [ -82.960955, 36.862536 ], [ -82.970253, 36.857686 ], [ -82.971934, 36.857767 ], [ -82.973395, 36.859097 ], [ -82.979227, 36.859693 ], [ -82.988707, 36.859137 ], [ -82.998376, 36.856630 ], [ -83.003786, 36.851789 ], [ -83.006086, 36.847889 ], [ -83.009222, 36.847295 ], [ -83.012587, 36.847289 ], [ -83.021887, 36.849989 ], [ -83.024387, 36.851689 ], [ -83.025887, 36.855289 ], [ -83.026887, 36.855489 ], [ -83.042188, 36.854389 ], [ -83.044288, 36.852989 ], [ -83.047589, 36.851789 ], [ -83.052489, 36.851989 ], [ -83.060489, 36.853789 ], [ -83.063989, 36.851689 ], [ -83.066189, 36.851889 ], [ -83.069290, 36.853589 ], [ -83.072590, 36.854589 ], [ -83.075590, 36.850589 ], [ -83.073790, 36.844889 ], [ -83.075190, 36.840889 ], [ -83.079690, 36.840589 ], [ -83.086991, 36.838189 ], [ -83.088991, 36.835989 ], [ -83.091291, 36.834389 ], [ -83.098892, 36.831789 ], [ -83.101792, 36.829089 ], [ -83.102092, 36.828189 ], [ -83.101692, 36.826689 ], [ -83.099792, 36.824889 ], [ -83.098892, 36.822989 ], [ -83.098492, 36.814289 ], [ -83.103092, 36.806689 ], [ -83.108029, 36.802181 ], [ -83.110793, 36.800388 ], [ -83.114693, 36.796088 ], [ -83.119144, 36.789531 ], [ -83.123341, 36.786654 ], [ -83.128794, 36.785388 ], [ -83.131694, 36.781488 ], [ -83.128494, 36.775588 ], [ -83.128894, 36.769888 ], [ -83.131245, 36.767105 ], [ -83.132286, 36.765610 ], [ -83.132477, 36.764398 ], [ -83.125655, 36.761407 ], [ -83.125728, 36.761276 ], [ -83.126719, 36.761000 ], [ -83.128813, 36.757864 ], [ -83.128272, 36.756370 ], [ -83.127833, 36.750828 ], [ -83.130994, 36.749788 ], [ -83.134294, 36.746588 ], [ -83.136395, 36.743088 ], [ -83.146095, 36.741788 ], [ -83.156696, 36.742187 ], [ -83.161496, 36.739887 ], [ -83.167396, 36.739187 ], [ -83.175696, 36.739587 ], [ -83.194597, 36.739487 ], [ -83.199698, 36.737487 ], [ -83.219999, 36.731287 ], [ -83.236399, 36.726887 ], [ -83.238499, 36.727087 ], [ -83.246300, 36.725287 ], [ -83.255500, 36.721787 ], [ -83.263601, 36.720987 ], [ -83.269301, 36.718487 ], [ -83.272501, 36.717787 ], [ -83.275501, 36.717987 ], [ -83.285702, 36.715187 ], [ -83.286902, 36.713987 ], [ -83.287802, 36.713787 ], [ -83.307103, 36.711387 ], [ -83.311403, 36.710287 ], [ -83.313003, 36.709087 ], [ -83.315703, 36.708187 ], [ -83.342804, 36.701286 ], [ -83.349705, 36.698386 ], [ -83.350805, 36.697386 ], [ -83.353613, 36.696699 ], [ -83.354606, 36.696153 ], [ -83.356405, 36.694686 ], [ -83.359205, 36.693586 ], [ -83.360205, 36.693586 ], [ -83.362105, 36.694786 ], [ -83.364005, 36.694586 ], [ -83.367505, 36.692686 ], [ -83.386099, 36.686589 ], [ -83.389306, 36.684986 ], [ -83.395306, 36.679486 ], [ -83.395607, 36.678987 ], [ -83.394906, 36.677586 ], [ -83.395806, 36.676786 ], [ -83.411807, 36.670786 ], [ -83.419507, 36.668486 ], [ -83.423707, 36.667385 ], [ -83.431708, 36.666485 ], [ -83.436508, 36.666185 ], [ -83.440808, 36.666885 ], [ -83.448108, 36.665285 ], [ -83.454709, 36.664785 ], [ -83.458009, 36.665785 ], [ -83.460808, 36.664885 ], [ -83.466483, 36.664700 ], [ -83.482610, 36.666185 ], [ -83.488910, 36.667685 ], [ -83.493911, 36.670085 ], [ -83.498011, 36.670485 ], [ -83.499911, 36.670185 ], [ -83.501411, 36.669085 ], [ -83.506911, 36.668685 ], [ -83.511711, 36.669085 ], [ -83.516011, 36.667585 ], [ -83.527112, 36.665985 ], [ -83.529612, 36.666184 ], [ -83.531912, 36.664984 ], [ -83.533012, 36.663284 ], [ -83.533112, 36.661884 ], [ -83.541812, 36.656584 ], [ -83.547312, 36.654484 ], [ -83.554112, 36.653784 ], [ -83.562612, 36.651284 ], [ -83.565712, 36.648384 ], [ -83.569812, 36.645684 ], [ -83.577312, 36.641784 ], [ -83.584512, 36.641384 ], [ -83.600713, 36.637084 ], [ -83.603013, 36.636883 ], [ -83.604313, 36.637683 ], [ -83.605613, 36.637783 ], [ -83.607913, 36.637083 ], [ -83.614513, 36.633983 ], [ -83.616413, 36.631383 ], [ -83.619913, 36.627983 ], [ -83.625013, 36.625183 ], [ -83.628913, 36.624083 ], [ -83.635013, 36.622883 ], [ -83.639813, 36.624783 ], [ -83.645213, 36.624183 ], [ -83.648314, 36.622683 ], [ -83.649513, 36.616683 ], [ -83.657714, 36.611782 ], [ -83.663614, 36.606782 ], [ -83.665614, 36.605782 ], [ -83.673114, 36.604682 ], [ -83.674614, 36.603082 ], [ -83.675413, 36.600814 ] ] ], [ [ [ -89.485106, 36.497692 ], [ -89.492537, 36.497775 ], [ -89.498036, 36.497887 ], [ -89.539100, 36.498201 ], [ -89.542955, 36.504957 ], [ -89.554321, 36.517022 ], [ -89.558349, 36.522099 ], [ -89.560344, 36.525436 ], [ -89.565804, 36.536988 ], [ -89.570071, 36.544387 ], [ -89.571241, 36.547343 ], [ -89.571509, 36.552569 ], [ -89.569807, 36.558119 ], [ -89.566817, 36.564216 ], [ -89.563185, 36.568749 ], [ -89.558089, 36.573514 ], [ -89.552640, 36.577178 ], [ -89.546113, 36.579989 ], [ -89.542459, 36.580566 ], [ -89.527583, 36.581147 ], [ -89.522338, 36.580180 ], [ -89.518702, 36.578698 ], [ -89.514468, 36.577803 ], [ -89.500076, 36.576305 ], [ -89.484836, 36.571821 ], [ -89.480893, 36.569771 ], [ -89.479093, 36.568206 ], [ -89.473341, 36.559918 ], [ -89.467761, 36.546847 ], [ -89.465445, 36.536163 ], [ -89.465888, 36.529946 ], [ -89.468668, 36.521291 ], [ -89.472460, 36.513741 ], [ -89.477186, 36.507070 ], [ -89.482474, 36.502131 ], [ -89.485106, 36.497692 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US22", "STATE": "22", "NAME": "Louisiana", "LSAD": "", "CENSUSAREA": 43203.905000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -88.865067, 29.752714 ], [ -88.889755, 29.718204 ], [ -88.940346, 29.657234 ], [ -88.944435, 29.658806 ], [ -88.946320, 29.662579 ], [ -88.941605, 29.674833 ], [ -88.920235, 29.694319 ], [ -88.911751, 29.699348 ], [ -88.890060, 29.729202 ], [ -88.873611, 29.758043 ], [ -88.867973, 29.772272 ], [ -88.867973, 29.791330 ], [ -88.861267, 29.805826 ], [ -88.846497, 29.817101 ], [ -88.843010, 29.825960 ], [ -88.836296, 29.855221 ], [ -88.836830, 29.858978 ], [ -88.843277, 29.863810 ], [ -88.831200, 29.878839 ], [ -88.828247, 29.920717 ], [ -88.837379, 29.944878 ], [ -88.838715, 29.962326 ], [ -88.835495, 29.967695 ], [ -88.835495, 29.974138 ], [ -88.839790, 29.983803 ], [ -88.840866, 29.995613 ], [ -88.848373, 30.013330 ], [ -88.857368, 30.027826 ], [ -88.869720, 30.043798 ], [ -88.881454, 30.053202 ], [ -88.870476, 30.049212 ], [ -88.855583, 30.034414 ], [ -88.841225, 30.012789 ], [ -88.833725, 29.998821 ], [ -88.824158, 29.970461 ], [ -88.817017, 29.934250 ], [ -88.818146, 29.889109 ], [ -88.826538, 29.847092 ], [ -88.832710, 29.824062 ], [ -88.844078, 29.795713 ], [ -88.865067, 29.752714 ] ] ], [ [ [ -90.030764, 29.375008 ], [ -90.035415, 29.368201 ], [ -90.036374, 29.363661 ], [ -90.031815, 29.344251 ], [ -90.034275, 29.322661 ], [ -90.028536, 29.307083 ], [ -90.013778, 29.302710 ], [ -90.009678, 29.294785 ], [ -90.016288, 29.284257 ], [ -90.019517, 29.282213 ], [ -90.032088, 29.280027 ], [ -90.043293, 29.282487 ], [ -90.057094, 29.281331 ], [ -90.061057, 29.276748 ], [ -90.059691, 29.272648 ], [ -90.060511, 29.267729 ], [ -90.070622, 29.262537 ], [ -90.086747, 29.259257 ], [ -90.091119, 29.261443 ], [ -90.097678, 29.261990 ], [ -90.101231, 29.259804 ], [ -90.096038, 29.240673 ], [ -90.073355, 29.227282 ], [ -90.073355, 29.210611 ], [ -90.070622, 29.208698 ], [ -90.042910, 29.211765 ], [ -90.019772, 29.231903 ], [ -90.005718, 29.240627 ], [ -89.969981, 29.255753 ], [ -89.965667, 29.259126 ], [ -89.959509, 29.267677 ], [ -89.951175, 29.266124 ], [ -89.949925, 29.263154 ], [ -89.950756, 29.260801 ], [ -89.956460, 29.253744 ], [ -90.022029, 29.216065 ], [ -90.058512, 29.183687 ], [ -90.079276, 29.169970 ], [ -90.104162, 29.150407 ], [ -90.174273, 29.105301 ], [ -90.223587, 29.085075 ], [ -90.231984, 29.087730 ], [ -90.245283, 29.085824 ], [ -90.343293, 29.057062 ], [ -90.348768, 29.057817 ], [ -90.349891, 29.063681 ], [ -90.325514, 29.075138 ], [ -90.304129, 29.077332 ], [ -90.292930, 29.078761 ], [ -90.282983, 29.082326 ], [ -90.266290, 29.089421 ], [ -90.258145, 29.091627 ], [ -90.253141, 29.093772 ], [ -90.249806, 29.100919 ], [ -90.250044, 29.108067 ], [ -90.243849, 29.110450 ], [ -90.234235, 29.110268 ], [ -90.234405, 29.128824 ], [ -90.243435, 29.136311 ], [ -90.248629, 29.138370 ], [ -90.269010, 29.139242 ], [ -90.280516, 29.142521 ], [ -90.278320, 29.150691 ], [ -90.297000, 29.171317 ], [ -90.302846, 29.175098 ], [ -90.302948, 29.187948 ], [ -90.300885, 29.196171 ], [ -90.293183, 29.199789 ], [ -90.282800, 29.192545 ], [ -90.275851, 29.193668 ], [ -90.271251, 29.204639 ], [ -90.286621, 29.225694 ], [ -90.300304, 29.231241 ], [ -90.311663, 29.237954 ], [ -90.311523, 29.256374 ], [ -90.316093, 29.264777 ], [ -90.332796, 29.276956 ], [ -90.367166, 29.274128 ], [ -90.368154, 29.270736 ], [ -90.367012, 29.264956 ], [ -90.372565, 29.258923 ], [ -90.387924, 29.252786 ], [ -90.383857, 29.235606 ], [ -90.399465, 29.201046 ], [ -90.408578, 29.196421 ], [ -90.432912, 29.188132 ], [ -90.435907, 29.188449 ], [ -90.443954, 29.195830 ], [ -90.472489, 29.192688 ], [ -90.473273, 29.195224 ], [ -90.468773, 29.198469 ], [ -90.467233, 29.202549 ], [ -90.485786, 29.209843 ], [ -90.494928, 29.216713 ], [ -90.490987, 29.220883 ], [ -90.468320, 29.227532 ], [ -90.465764, 29.242951 ], [ -90.462866, 29.249809 ], [ -90.450674, 29.263739 ], [ -90.452186, 29.266250 ], [ -90.472779, 29.272556 ], [ -90.495299, 29.287277 ], [ -90.510555, 29.290925 ], [ -90.517277, 29.282719 ], [ -90.526216, 29.276492 ], [ -90.552005, 29.278512 ], [ -90.565436, 29.285111 ], [ -90.582525, 29.276037 ], [ -90.589724, 29.248521 ], [ -90.588470, 29.245863 ], [ -90.583924, 29.242886 ], [ -90.576506, 29.243986 ], [ -90.565378, 29.242475 ], [ -90.544547, 29.230683 ], [ -90.543245, 29.227843 ], [ -90.544311, 29.224292 ], [ -90.556501, 29.219913 ], [ -90.557390, 29.207881 ], [ -90.560889, 29.204261 ], [ -90.575277, 29.206827 ], [ -90.618413, 29.203290 ], [ -90.624161, 29.210366 ], [ -90.627420, 29.211004 ], [ -90.633819, 29.209128 ], [ -90.640223, 29.196554 ], [ -90.645612, 29.175867 ], [ -90.645169, 29.172958 ], [ -90.640863, 29.171261 ], [ -90.636973, 29.164572 ], [ -90.647042, 29.128580 ], [ -90.677724, 29.118742 ], [ -90.691109, 29.121722 ], [ -90.700893, 29.121470 ], [ -90.718035, 29.116611 ], [ -90.731239, 29.122886 ], [ -90.764189, 29.113374 ], [ -90.773458, 29.100133 ], [ -90.799444, 29.087377 ], [ -90.802053, 29.083322 ], [ -90.803699, 29.063709 ], [ -90.798720, 29.054841 ], [ -90.781981, 29.049431 ], [ -90.765188, 29.049403 ], [ -90.750092, 29.053247 ], [ -90.725300, 29.066616 ], [ -90.709105, 29.064305 ], [ -90.705350, 29.062679 ], [ -90.702102, 29.060275 ], [ -90.692205, 29.059607 ], [ -90.683645, 29.060944 ], [ -90.676958, 29.063619 ], [ -90.665589, 29.067230 ], [ -90.652348, 29.069237 ], [ -90.644189, 29.071510 ], [ -90.641247, 29.072313 ], [ -90.639240, 29.072848 ], [ -90.637623, 29.072084 ], [ -90.636033, 29.069792 ], [ -90.637495, 29.066608 ], [ -90.648058, 29.062649 ], [ -90.730899, 29.042259 ], [ -90.755677, 29.038997 ], [ -90.797680, 29.039741 ], [ -90.811473, 29.036580 ], [ -90.839345, 29.039167 ], [ -90.842762, 29.042947 ], [ -90.844849, 29.048721 ], [ -90.841226, 29.054266 ], [ -90.844593, 29.067280 ], [ -90.862757, 29.094863 ], [ -90.867766, 29.095434 ], [ -90.877583, 29.104891 ], [ -90.885351, 29.117016 ], [ -90.898215, 29.131342 ], [ -90.925797, 29.153116 ], [ -90.941877, 29.162373 ], [ -90.948091, 29.174104 ], [ -90.961278, 29.180817 ], [ -90.981458, 29.171211 ], [ -91.000096, 29.169481 ], [ -91.023955, 29.174784 ], [ -91.031786, 29.182188 ], [ -91.058630, 29.181734 ], [ -91.094015, 29.187711 ], [ -91.114760, 29.207918 ], [ -91.129141, 29.215863 ], [ -91.199647, 29.221287 ], [ -91.219032, 29.226051 ], [ -91.278792, 29.247776 ], [ -91.302677, 29.265958 ], [ -91.334885, 29.298775 ], [ -91.332750, 29.305816 ], [ -91.309314, 29.305698 ], [ -91.291821, 29.311357 ], [ -91.276647, 29.329825 ], [ -91.274308, 29.344878 ], [ -91.269940, 29.357231 ], [ -91.266589, 29.361218 ], [ -91.249109, 29.369864 ], [ -91.238515, 29.371999 ], [ -91.235348, 29.370638 ], [ -91.234374, 29.353723 ], [ -91.222952, 29.339446 ], [ -91.217242, 29.328025 ], [ -91.197730, 29.313272 ], [ -91.192019, 29.313272 ], [ -91.171556, 29.329928 ], [ -91.167749, 29.329452 ], [ -91.162038, 29.325645 ], [ -91.159183, 29.321362 ], [ -91.157755, 29.316127 ], [ -91.164893, 29.301851 ], [ -91.164893, 29.288050 ], [ -91.168701, 29.270442 ], [ -91.167749, 29.268062 ], [ -91.161562, 29.262827 ], [ -91.132533, 29.252358 ], [ -91.125870, 29.254261 ], [ -91.123491, 29.260448 ], [ -91.124919, 29.266159 ], [ -91.135388, 29.279484 ], [ -91.134436, 29.285670 ], [ -91.123491, 29.302802 ], [ -91.123491, 29.306609 ], [ -91.128250, 29.318983 ], [ -91.129677, 29.331832 ], [ -91.132533, 29.336591 ], [ -91.150617, 29.342301 ], [ -91.158707, 29.355626 ], [ -91.176791, 29.359909 ], [ -91.186785, 29.366572 ], [ -91.197465, 29.369882 ], [ -91.200087, 29.389550 ], [ -91.218463, 29.407235 ], [ -91.211999, 29.420931 ], [ -91.217448, 29.432549 ], [ -91.221166, 29.436421 ], [ -91.241640, 29.441021 ], [ -91.258226, 29.446954 ], [ -91.260024, 29.462102 ], [ -91.265649, 29.472362 ], [ -91.281300, 29.481547 ], [ -91.294325, 29.476894 ], [ -91.335742, 29.485886 ], [ -91.343567, 29.492593 ], [ -91.345880, 29.504538 ], [ -91.356625, 29.515191 ], [ -91.402214, 29.511914 ], [ -91.420449, 29.515745 ], [ -91.427130, 29.520215 ], [ -91.432337, 29.532830 ], [ -91.439941, 29.540434 ], [ -91.447345, 29.544749 ], [ -91.468748, 29.544299 ], [ -91.517274, 29.529740 ], [ -91.531021, 29.531543 ], [ -91.531471, 29.535374 ], [ -91.525840, 29.545946 ], [ -91.525523, 29.551904 ], [ -91.529217, 29.558598 ], [ -91.537445, 29.565888 ], [ -91.541974, 29.594353 ], [ -91.553537, 29.632766 ], [ -91.560908, 29.637350 ], [ -91.570589, 29.638312 ], [ -91.581843, 29.637165 ], [ -91.600179, 29.631156 ], [ -91.625114, 29.626195 ], [ -91.643832, 29.630625 ], [ -91.648941, 29.633635 ], [ -91.648657, 29.636713 ], [ -91.646478, 29.639427 ], [ -91.643198, 29.640274 ], [ -91.637344, 29.647217 ], [ -91.627286, 29.662132 ], [ -91.625114, 29.671679 ], [ -91.626826, 29.684753 ], [ -91.623829, 29.699240 ], [ -91.618479, 29.710816 ], [ -91.618090, 29.720694 ], [ -91.621512, 29.735429 ], [ -91.632829, 29.742576 ], [ -91.667128, 29.745822 ], [ -91.710935, 29.738993 ], [ -91.737253, 29.749370 ], [ -91.752259, 29.748264 ], [ -91.783674, 29.740689 ], [ -91.830499, 29.718918 ], [ -91.845962, 29.708763 ], [ -91.858640, 29.703121 ], [ -91.866516, 29.707150 ], [ -91.880750, 29.710839 ], [ -91.880999, 29.713338 ], [ -91.878331, 29.716087 ], [ -91.858923, 29.730451 ], [ -91.858328, 29.736400 ], [ -91.860113, 29.741158 ], [ -91.864277, 29.742943 ], [ -91.878355, 29.751025 ], [ -91.874761, 29.760083 ], [ -91.859151, 29.783331 ], [ -91.857595, 29.791709 ], [ -91.853569, 29.797076 ], [ -91.849405, 29.798860 ], [ -91.845836, 29.793507 ], [ -91.843456, 29.785773 ], [ -91.838697, 29.781014 ], [ -91.831559, 29.779825 ], [ -91.826800, 29.786963 ], [ -91.825610, 29.800050 ], [ -91.828585, 29.813137 ], [ -91.836318, 29.823250 ], [ -91.845836, 29.824440 ], [ -91.860113, 29.822060 ], [ -91.869998, 29.828328 ], [ -91.889118, 29.836023 ], [ -91.906890, 29.830940 ], [ -91.915989, 29.815654 ], [ -91.919143, 29.815379 ], [ -91.940723, 29.817008 ], [ -91.964214, 29.824440 ], [ -91.969568, 29.829199 ], [ -91.974327, 29.828604 ], [ -91.979086, 29.825034 ], [ -91.982060, 29.819086 ], [ -91.979680, 29.813732 ], [ -91.976478, 29.808253 ], [ -91.978381, 29.799217 ], [ -91.983871, 29.794516 ], [ -92.035666, 29.781662 ], [ -92.056398, 29.772313 ], [ -92.107486, 29.744429 ], [ -92.144431, 29.716418 ], [ -92.152786, 29.714390 ], [ -92.155761, 29.721528 ], [ -92.151002, 29.727477 ], [ -92.130776, 29.741158 ], [ -92.128397, 29.750676 ], [ -92.128992, 29.758410 ], [ -92.133751, 29.762574 ], [ -92.142079, 29.762574 ], [ -92.143863, 29.756625 ], [ -92.150407, 29.750676 ], [ -92.160519, 29.747702 ], [ -92.161709, 29.741753 ], [ -92.164684, 29.736400 ], [ -92.174796, 29.736400 ], [ -92.195022, 29.745917 ], [ -92.200970, 29.745917 ], [ -92.202755, 29.741158 ], [ -92.196806, 29.728666 ], [ -92.188478, 29.723907 ], [ -92.180745, 29.714984 ], [ -92.165278, 29.703682 ], [ -92.149349, 29.697052 ], [ -92.103867, 29.699145 ], [ -92.103179, 29.693130 ], [ -92.134347, 29.669516 ], [ -92.132804, 29.660462 ], [ -92.111787, 29.621770 ], [ -92.093419, 29.618694 ], [ -92.065640, 29.619967 ], [ -92.047670, 29.624527 ], [ -92.025320, 29.625647 ], [ -92.016270, 29.618741 ], [ -92.000003, 29.613013 ], [ -92.007044, 29.610883 ], [ -92.014777, 29.612668 ], [ -92.036787, 29.614452 ], [ -92.053444, 29.608504 ], [ -92.064746, 29.597796 ], [ -92.064151, 29.596011 ], [ -92.044521, 29.594227 ], [ -92.039762, 29.592442 ], [ -92.037977, 29.588873 ], [ -92.046316, 29.584362 ], [ -92.066533, 29.583842 ], [ -92.105923, 29.586335 ], [ -92.158624, 29.581616 ], [ -92.212590, 29.562479 ], [ -92.251860, 29.539354 ], [ -92.280392, 29.533434 ], [ -92.309357, 29.533026 ], [ -92.347236, 29.539394 ], [ -92.402165, 29.551269 ], [ -92.473585, 29.561081 ], [ -92.558602, 29.569935 ], [ -92.616270, 29.578729 ], [ -92.653651, 29.588065 ], [ -92.744126, 29.617608 ], [ -92.871232, 29.670028 ], [ -92.940455, 29.701033 ], [ -92.974305, 29.713980 ], [ -93.065354, 29.740966 ], [ -93.088182, 29.749125 ], [ -93.176930, 29.770487 ], [ -93.226934, 29.777519 ], [ -93.267456, 29.778113 ], [ -93.295573, 29.775071 ], [ -93.342104, 29.763402 ], [ -93.344993, 29.759618 ], [ -93.347331, 29.759046 ], [ -93.372029, 29.763049 ], [ -93.438973, 29.768949 ], [ -93.475252, 29.769242 ], [ -93.538462, 29.763299 ], [ -93.590786, 29.755649 ], [ -93.635304, 29.752806 ], [ -93.683640, 29.747153 ], [ -93.741948, 29.736343 ], [ -93.766048, 29.729500 ], [ -93.799250, 29.715260 ], [ -93.818995, 29.704076 ], [ -93.837971, 29.690619 ], [ -93.863204, 29.724059 ], [ -93.870020, 29.735482 ], [ -93.873941, 29.737770 ], [ -93.888821, 29.742234 ], [ -93.891637, 29.744618 ], [ -93.893829, 29.753033 ], [ -93.890821, 29.761673 ], [ -93.893862, 29.767289 ], [ -93.898470, 29.771577 ], [ -93.922407, 29.785048 ], [ -93.926504, 29.789560 ], [ -93.928808, 29.797080 ], [ -93.929208, 29.802952 ], [ -93.927992, 29.809640 ], [ -93.922744, 29.818808 ], [ -93.916360, 29.824968 ], [ -93.900728, 29.836967 ], [ -93.890679, 29.843159 ], [ -93.872446, 29.851650 ], [ -93.863570, 29.857177 ], [ -93.855140, 29.864099 ], [ -93.838374, 29.882855 ], [ -93.830374, 29.894359 ], [ -93.818998, 29.914822 ], [ -93.816550, 29.920726 ], [ -93.813735, 29.935126 ], [ -93.807815, 29.954549 ], [ -93.789431, 29.987812 ], [ -93.786935, 29.990580 ], [ -93.741078, 30.021571 ], [ -93.739734, 30.023987 ], [ -93.739158, 30.032627 ], [ -93.737446, 30.037283 ], [ -93.720805, 30.053043 ], [ -93.703940, 30.054291 ], [ -93.700820, 30.056274 ], [ -93.699396, 30.059250 ], [ -93.700580, 30.063666 ], [ -93.702180, 30.065474 ], [ -93.716405, 30.069122 ], [ -93.731605, 30.081282 ], [ -93.734085, 30.086130 ], [ -93.732485, 30.088914 ], [ -93.723765, 30.094130 ], [ -93.702436, 30.112721 ], [ -93.701252, 30.137376 ], [ -93.698276, 30.138608 ], [ -93.694980, 30.135185 ], [ -93.692868, 30.135217 ], [ -93.688212, 30.141376 ], [ -93.697748, 30.152944 ], [ -93.703764, 30.173936 ], [ -93.710468, 30.180671 ], [ -93.717397, 30.193439 ], [ -93.720946, 30.209852 ], [ -93.719220, 30.218542 ], [ -93.713359, 30.225261 ], [ -93.705083, 30.242752 ], [ -93.707271, 30.249937 ], [ -93.709132, 30.271827 ], [ -93.707190, 30.275513 ], [ -93.706608, 30.281187 ], [ -93.708645, 30.288317 ], [ -93.711118, 30.291372 ], [ -93.714319, 30.294282 ], [ -93.718684, 30.295010 ], [ -93.724220, 30.295134 ], [ -93.738699, 30.303794 ], [ -93.760328, 30.329924 ], [ -93.764265, 30.330223 ], [ -93.765822, 30.333318 ], [ -93.756352, 30.356166 ], [ -93.755894, 30.370709 ], [ -93.758554, 30.387077 ], [ -93.757654, 30.390423 ], [ -93.751437, 30.396288 ], [ -93.745333, 30.397022 ], [ -93.722314, 30.420729 ], [ -93.702665, 30.429947 ], [ -93.697800, 30.440583 ], [ -93.697828, 30.443838 ], [ -93.705845, 30.457748 ], [ -93.716678, 30.494006 ], [ -93.710117, 30.506400 ], [ -93.714322, 30.518562 ], [ -93.727721, 30.525671 ], [ -93.732793, 30.529960 ], [ -93.740253, 30.539569 ], [ -93.729195, 30.544842 ], [ -93.725847, 30.556978 ], [ -93.727746, 30.566487 ], [ -93.727844, 30.574070 ], [ -93.712454, 30.588479 ], [ -93.692869, 30.594382 ], [ -93.689534, 30.592759 ], [ -93.687282, 30.591601 ], [ -93.684329, 30.592586 ], [ -93.681235, 30.596102 ], [ -93.679828, 30.599758 ], [ -93.680813, 30.602993 ], [ -93.683397, 30.608041 ], [ -93.685121, 30.625201 ], [ -93.683100, 30.640763 ], [ -93.670354, 30.658034 ], [ -93.654971, 30.670184 ], [ -93.638213, 30.673058 ], [ -93.629904, 30.679940 ], [ -93.621093, 30.695159 ], [ -93.620774, 30.704122 ], [ -93.616184, 30.713980 ], [ -93.611192, 30.718053 ], [ -93.609544, 30.723139 ], [ -93.609719, 30.729182 ], [ -93.617688, 30.738479 ], [ -93.619129, 30.742002 ], [ -93.607757, 30.757657 ], [ -93.592828, 30.763986 ], [ -93.589896, 30.777760 ], [ -93.589381, 30.786681 ], [ -93.584265, 30.796663 ], [ -93.578395, 30.802047 ], [ -93.569303, 30.802969 ], [ -93.563243, 30.806218 ], [ -93.561666, 30.807739 ], [ -93.554057, 30.824941 ], [ -93.553626, 30.835140 ], [ -93.558172, 30.839974 ], [ -93.558617, 30.869424 ], [ -93.565428, 30.874310 ], [ -93.567451, 30.878524 ], [ -93.567788, 30.888302 ], [ -93.564248, 30.895045 ], [ -93.556493, 30.901451 ], [ -93.555650, 30.911228 ], [ -93.551942, 30.918646 ], [ -93.549244, 30.921006 ], [ -93.546884, 30.921511 ], [ -93.545030, 30.920837 ], [ -93.542489, 30.920064 ], [ -93.530936, 30.924534 ], [ -93.526147, 30.930035 ], [ -93.526245, 30.939411 ], [ -93.532549, 30.950696 ], [ -93.549841, 30.967118 ], [ -93.560533, 30.971286 ], [ -93.567972, 30.977981 ], [ -93.571906, 30.987614 ], [ -93.569764, 30.996715 ], [ -93.567980, 31.001534 ], [ -93.566017, 31.004567 ], [ -93.562626, 31.005995 ], [ -93.555581, 31.003919 ], [ -93.539526, 31.008498 ], [ -93.516943, 31.023662 ], [ -93.516407, 31.029550 ], [ -93.516943, 31.032584 ], [ -93.523248, 31.037842 ], [ -93.531219, 31.051678 ], [ -93.532069, 31.055264 ], [ -93.529256, 31.057567 ], [ -93.525330, 31.060601 ], [ -93.523010, 31.065241 ], [ -93.526044, 31.070773 ], [ -93.531040, 31.074699 ], [ -93.540129, 31.078003 ], [ -93.546644, 31.082989 ], [ -93.551034, 31.091111 ], [ -93.551693, 31.097258 ], [ -93.549717, 31.105160 ], [ -93.541375, 31.113502 ], [ -93.539619, 31.121844 ], [ -93.540278, 31.128868 ], [ -93.544702, 31.135889 ], [ -93.544888, 31.143137 ], [ -93.544888, 31.148844 ], [ -93.544010, 31.153015 ], [ -93.540253, 31.156579 ], [ -93.536830, 31.158620 ], [ -93.531744, 31.180817 ], [ -93.533307, 31.184463 ], [ -93.535097, 31.185614 ], [ -93.548931, 31.186601 ], [ -93.552649, 31.185575 ], [ -93.560943, 31.182482 ], [ -93.569563, 31.177574 ], [ -93.579215, 31.167422 ], [ -93.588503, 31.165581 ], [ -93.598828, 31.174679 ], [ -93.600308, 31.176158 ], [ -93.602443, 31.182541 ], [ -93.607288, 31.205403 ], [ -93.604319, 31.215286 ], [ -93.604319, 31.220794 ], [ -93.605260, 31.224153 ], [ -93.607409, 31.227243 ], [ -93.609828, 31.229661 ], [ -93.616007, 31.233960 ], [ -93.616308, 31.244595 ], [ -93.614288, 31.251631 ], [ -93.613942, 31.259375 ], [ -93.620343, 31.271025 ], [ -93.642516, 31.269508 ], [ -93.657004, 31.281736 ], [ -93.668928, 31.297975 ], [ -93.675440, 31.301040 ], [ -93.684039, 31.301771 ], [ -93.686880, 31.305166 ], [ -93.687851, 31.309835 ], [ -93.677277, 31.330483 ], [ -93.668439, 31.353012 ], [ -93.665825, 31.355184 ], [ -93.664665, 31.357698 ], [ -93.663698, 31.360019 ], [ -93.663892, 31.361953 ], [ -93.665052, 31.363886 ], [ -93.668920, 31.366400 ], [ -93.669693, 31.371815 ], [ -93.668146, 31.375103 ], [ -93.668533, 31.379357 ], [ -93.670182, 31.387184 ], [ -93.671644, 31.393352 ], [ -93.674117, 31.397681 ], [ -93.695866, 31.409392 ], [ -93.701611, 31.409334 ], [ -93.704879, 31.410881 ], [ -93.704678, 31.418900 ], [ -93.697603, 31.428409 ], [ -93.700930, 31.437784 ], [ -93.709416, 31.442995 ], [ -93.749476, 31.468690 ], [ -93.749870, 31.475276 ], [ -93.749870, 31.478929 ], [ -93.747841, 31.480958 ], [ -93.745608, 31.481973 ], [ -93.741885, 31.483535 ], [ -93.737168, 31.484622 ], [ -93.730998, 31.492119 ], [ -93.728766, 31.496786 ], [ -93.725925, 31.504092 ], [ -93.726736, 31.511600 ], [ -93.733433, 31.513223 ], [ -93.739318, 31.515050 ], [ -93.740332, 31.517079 ], [ -93.741111, 31.520101 ], [ -93.741550, 31.522558 ], [ -93.743376, 31.525196 ], [ -93.746826, 31.526008 ], [ -93.749870, 31.526211 ], [ -93.751899, 31.525602 ], [ -93.753860, 31.525331 ], [ -93.760062, 31.523933 ], [ -93.780835, 31.525384 ], [ -93.787687, 31.527344 ], [ -93.798087, 31.534044 ], [ -93.818582, 31.554826 ], [ -93.820764, 31.558221 ], [ -93.822958, 31.568130 ], [ -93.834924, 31.586211 ], [ -93.839383, 31.599075 ], [ -93.838057, 31.606795 ], [ -93.827852, 31.616551 ], [ -93.823977, 31.614228 ], [ -93.818717, 31.614556 ], [ -93.816838, 31.622509 ], [ -93.818037, 31.647892 ], [ -93.825661, 31.661022 ], [ -93.826462, 31.666919 ], [ -93.822051, 31.673967 ], [ -93.817425, 31.672146 ], [ -93.804479, 31.685664 ], [ -93.802452, 31.693186 ], [ -93.802694, 31.697783 ], [ -93.803419, 31.700686 ], [ -93.807270, 31.704232 ], [ -93.810304, 31.705481 ], [ -93.814587, 31.707444 ], [ -93.815836, 31.711905 ], [ -93.815657, 31.719043 ], [ -93.819048, 31.728858 ], [ -93.824579, 31.734397 ], [ -93.830647, 31.745811 ], [ -93.830112, 31.754555 ], [ -93.827343, 31.759370 ], [ -93.822598, 31.773559 ], [ -93.823443, 31.775098 ], [ -93.827451, 31.777741 ], [ -93.831197, 31.780227 ], [ -93.834649, 31.783309 ], [ -93.836868, 31.788734 ], [ -93.836868, 31.794159 ], [ -93.839951, 31.798597 ], [ -93.846188, 31.802021 ], [ -93.853390, 31.805467 ], [ -93.870917, 31.816837 ], [ -93.874761, 31.821661 ], [ -93.874822, 31.840611 ], [ -93.884117, 31.847606 ], [ -93.888149, 31.856914 ], [ -93.889197, 31.867693 ], [ -93.896981, 31.873382 ], [ -93.901888, 31.880063 ], [ -93.901173, 31.885958 ], [ -93.904766, 31.890599 ], [ -93.909557, 31.893144 ], [ -93.915949, 31.892861 ], [ -93.919588, 31.890748 ], [ -93.923929, 31.889850 ], [ -93.927672, 31.891497 ], [ -93.932463, 31.895539 ], [ -93.935008, 31.903773 ], [ -93.938002, 31.906917 ], [ -93.943541, 31.908564 ], [ -93.953546, 31.910563 ], [ -93.971712, 31.920384 ], [ -93.977461, 31.926419 ], [ -94.018664, 31.990843 ], [ -94.029283, 31.995865 ], [ -94.038412, 31.992437 ], [ -94.041833, 31.992402 ], [ -94.042720, 31.999265 ], [ -94.042700, 32.056012 ], [ -94.042337, 32.119914 ], [ -94.042752, 32.125163 ], [ -94.042681, 32.137956 ], [ -94.042591, 32.158097 ], [ -94.042539, 32.166826 ], [ -94.042566, 32.166894 ], [ -94.042662, 32.218146 ], [ -94.042732, 32.269620 ], [ -94.042733, 32.269696 ], [ -94.042739, 32.363559 ], [ -94.042763, 32.373332 ], [ -94.042901, 32.392283 ], [ -94.042923, 32.399918 ], [ -94.042899, 32.400659 ], [ -94.042986, 32.435507 ], [ -94.042908, 32.439891 ], [ -94.042903, 32.470386 ], [ -94.042875, 32.471348 ], [ -94.042902, 32.472906 ], [ -94.042995, 32.478004 ], [ -94.042955, 32.480261 ], [ -94.043072, 32.484300 ], [ -94.043089, 32.486561 ], [ -94.042911, 32.492852 ], [ -94.042885, 32.505145 ], [ -94.043081, 32.513613 ], [ -94.043142, 32.559502 ], [ -94.043083, 32.564261 ], [ -94.042919, 32.610142 ], [ -94.042929, 32.618260 ], [ -94.042926, 32.622015 ], [ -94.042824, 32.640305 ], [ -94.042780, 32.643466 ], [ -94.042913, 32.655127 ], [ -94.043147, 32.693031 ], [ -94.042947, 32.767991 ], [ -94.043027, 32.776863 ], [ -94.042938, 32.780558 ], [ -94.042829, 32.785277 ], [ -94.042747, 32.786973 ], [ -94.043026, 32.797476 ], [ -94.042785, 32.871486 ], [ -94.043025, 32.880446 ], [ -94.042886, 32.880965 ], [ -94.042859, 32.892771 ], [ -94.042885, 32.898911 ], [ -94.043092, 32.910021 ], [ -94.043067, 32.937903 ], [ -94.043088, 32.955592 ], [ -94.042964, 33.019219 ], [ -94.041444, 33.019188 ], [ -94.035839, 33.019145 ], [ -94.027983, 33.019139 ], [ -94.024475, 33.019207 ], [ -93.814553, 33.019372 ], [ -93.723273, 33.019457 ], [ -93.531499, 33.018643 ], [ -93.524916, 33.018637 ], [ -93.520971, 33.018616 ], [ -93.490893, 33.018442 ], [ -93.489506, 33.018443 ], [ -93.467042, 33.018611 ], [ -93.377134, 33.018234 ], [ -93.340353, 33.018337 ], [ -93.308398, 33.018179 ], [ -93.308181, 33.018156 ], [ -93.238607, 33.017992 ], [ -93.215653, 33.018393 ], [ -93.197402, 33.017951 ], [ -93.154351, 33.017856 ], [ -93.101443, 33.017740 ], [ -93.100981, 33.017786 ], [ -93.081428, 33.017928 ], [ -93.073167, 33.017898 ], [ -93.070686, 33.017792 ], [ -92.971137, 33.017192 ], [ -92.946553, 33.016807 ], [ -92.867510, 33.016062 ], [ -92.854167, 33.016132 ], [ -92.844286, 33.016070 ], [ -92.844073, 33.016034 ], [ -92.830798, 33.015661 ], [ -92.796533, 33.014836 ], [ -92.733197, 33.014347 ], [ -92.724994, 33.014351 ], [ -92.723553, 33.014328 ], [ -92.715884, 33.014398 ], [ -92.711289, 33.014307 ], [ -92.503776, 33.012161 ], [ -92.501383, 33.012160 ], [ -92.469762, 33.012010 ], [ -92.370290, 33.010717 ], [ -92.362865, 33.010628 ], [ -92.335893, 33.010349 ], [ -92.292664, 33.010103 ], [ -92.222825, 33.009080 ], [ -92.069105, 33.008163 ], [ -91.951958, 33.007428 ], [ -91.950001, 33.007520 ], [ -91.875128, 33.007728 ], [ -91.755068, 33.007010 ], [ -91.735531, 33.007569 ], [ -91.626670, 33.006639 ], [ -91.617615, 33.006717 ], [ -91.609001, 33.006556 ], [ -91.579802, 33.006518 ], [ -91.579639, 33.006472 ], [ -91.572326, 33.006908 ], [ -91.559494, 33.006840 ], [ -91.500118, 33.006784 ], [ -91.489176, 33.006182 ], [ -91.453369, 33.005843 ], [ -91.435782, 33.006099 ], [ -91.425466, 33.006016 ], [ -91.376016, 33.005794 ], [ -91.333011, 33.005529 ], [ -91.329767, 33.005421 ], [ -91.326396, 33.005376 ], [ -91.325037, 33.005364 ], [ -91.322506, 33.005341 ], [ -91.312016, 33.005262 ], [ -91.284398, 33.005007 ], [ -91.265018, 33.005084 ], [ -91.166073, 33.004106 ], [ -91.166195, 33.002238 ], [ -91.168973, 32.992132 ], [ -91.173308, 32.986088 ], [ -91.182158, 32.978639 ], [ -91.186983, 32.976194 ], [ -91.197433, 32.964820 ], [ -91.199646, 32.963561 ], [ -91.201842, 32.961212 ], [ -91.202030, 32.957332 ], [ -91.201190, 32.954982 ], [ -91.199415, 32.952314 ], [ -91.207440, 32.944393 ], [ -91.210705, 32.939845 ], [ -91.212820, 32.936076 ], [ -91.214027, 32.930320 ], [ -91.213972, 32.927198 ], [ -91.212837, 32.922104 ], [ -91.211597, 32.919624 ], [ -91.208263, 32.915354 ], [ -91.199775, 32.908512 ], [ -91.196785, 32.906784 ], [ -91.181631, 32.901446 ], [ -91.175405, 32.899998 ], [ -91.170235, 32.899391 ], [ -91.159975, 32.899879 ], [ -91.151690, 32.901935 ], [ -91.145076, 32.905494 ], [ -91.134041, 32.917676 ], [ -91.132115, 32.923122 ], [ -91.131304, 32.926919 ], [ -91.131289, 32.930049 ], [ -91.135507, 32.946164 ], [ -91.137863, 32.952756 ], [ -91.137167, 32.956520 ], [ -91.136628, 32.957349 ], [ -91.133335, 32.959056 ], [ -91.131243, 32.960928 ], [ -91.130721, 32.962257 ], [ -91.130947, 32.963815 ], [ -91.133050, 32.966541 ], [ -91.137524, 32.969550 ], [ -91.138585, 32.971352 ], [ -91.135517, 32.979657 ], [ -91.134414, 32.980533 ], [ -91.125107, 32.984669 ], [ -91.111757, 32.988361 ], [ -91.106581, 32.988938 ], [ -91.096930, 32.986412 ], [ -91.094265, 32.984371 ], [ -91.090887, 32.981174 ], [ -91.086802, 32.976266 ], [ -91.080355, 32.962794 ], [ -91.078904, 32.951818 ], [ -91.080507, 32.950123 ], [ -91.081892, 32.949435 ], [ -91.083084, 32.947909 ], [ -91.081913, 32.944768 ], [ -91.080431, 32.943206 ], [ -91.072075, 32.937832 ], [ -91.070547, 32.936036 ], [ -91.064804, 32.926464 ], [ -91.063875, 32.922692 ], [ -91.064854, 32.916520 ], [ -91.063684, 32.906364 ], [ -91.063809, 32.903709 ], [ -91.064449, 32.901064 ], [ -91.068186, 32.891929 ], [ -91.070602, 32.888659 ], [ -91.086683, 32.873392 ], [ -91.105631, 32.858396 ], [ -91.116091, 32.855641 ], [ -91.124725, 32.854861 ], [ -91.127886, 32.855059 ], [ -91.137890, 32.848975 ], [ -91.143559, 32.844739 ], [ -91.145002, 32.842870 ], [ -91.149704, 32.831220 ], [ -91.152174, 32.826673 ], [ -91.157155, 32.823823 ], [ -91.158336, 32.822304 ], [ -91.161669, 32.812465 ], [ -91.161412, 32.800004 ], [ -91.164397, 32.785821 ], [ -91.158583, 32.781096 ], [ -91.156918, 32.780343 ], [ -91.157614, 32.776033 ], [ -91.164968, 32.761984 ], [ -91.165814, 32.757842 ], [ -91.165328, 32.751301 ], [ -91.163389, 32.747009 ], [ -91.158610, 32.743449 ], [ -91.154461, 32.742339 ], [ -91.150244, 32.741786 ], [ -91.131691, 32.743107 ], [ -91.123152, 32.742798 ], [ -91.113652, 32.739970 ], [ -91.090573, 32.736100 ], [ -91.077176, 32.732534 ], [ -91.060766, 32.727494 ], [ -91.056999, 32.725580 ], [ -91.054481, 32.722259 ], [ -91.054749, 32.719229 ], [ -91.057043, 32.712576 ], [ -91.063946, 32.702926 ], [ -91.076061, 32.693751 ], [ -91.081145, 32.691127 ], [ -91.098762, 32.685291 ], [ -91.104443, 32.682434 ], [ -91.118258, 32.674075 ], [ -91.127723, 32.665343 ], [ -91.130928, 32.658870 ], [ -91.137638, 32.650621 ], [ -91.138712, 32.649774 ], [ -91.142038, 32.649265 ], [ -91.144347, 32.648029 ], [ -91.149753, 32.644041 ], [ -91.152081, 32.641508 ], [ -91.152699, 32.640757 ], [ -91.153744, 32.635228 ], [ -91.153821, 32.631282 ], [ -91.153556, 32.626181 ], [ -91.151318, 32.615919 ], [ -91.146204, 32.604144 ], [ -91.144074, 32.600613 ], [ -91.141148, 32.597209 ], [ -91.135280, 32.591651 ], [ -91.127912, 32.586493 ], [ -91.125108, 32.585187 ], [ -91.119854, 32.584795 ], [ -91.118641, 32.585139 ], [ -91.112764, 32.590186 ], [ -91.105704, 32.590879 ], [ -91.087784, 32.597070 ], [ -91.079506, 32.600680 ], [ -91.061354, 32.605372 ], [ -91.049796, 32.607188 ], [ -91.048900, 32.613556 ], [ -91.043263, 32.620779 ], [ -91.041448, 32.625135 ], [ -91.040401, 32.632521 ], [ -91.038415, 32.636443 ], [ -91.030181, 32.644052 ], [ -91.025769, 32.646573 ], [ -91.019115, 32.643845 ], [ -91.014286, 32.640482 ], [ -91.006820, 32.631261 ], [ -91.003500, 32.624845 ], [ -91.002962, 32.622555 ], [ -91.002997, 32.614678 ], [ -91.004599, 32.609780 ], [ -91.010228, 32.601927 ], [ -91.013723, 32.598419 ], [ -91.016231, 32.596953 ], [ -91.022943, 32.591848 ], [ -91.030991, 32.583347 ], [ -91.036170, 32.579556 ], [ -91.049312, 32.573624 ], [ -91.069354, 32.563052 ], [ -91.080398, 32.556442 ], [ -91.075373, 32.546718 ], [ -91.061685, 32.536448 ], [ -91.051168, 32.530890 ], [ -91.011275, 32.516596 ], [ -91.005468, 32.513842 ], [ -90.994481, 32.506331 ], [ -90.989826, 32.500139 ], [ -90.988174, 32.496796 ], [ -90.987831, 32.494190 ], [ -90.988278, 32.491190 ], [ -90.990703, 32.487749 ], [ -90.996388, 32.483925 ], [ -90.999223, 32.482615 ], [ -91.004206, 32.482140 ], [ -91.017106, 32.483740 ], [ -91.024106, 32.485240 ], [ -91.033906, 32.488540 ], [ -91.038106, 32.490440 ], [ -91.045807, 32.495539 ], [ -91.050907, 32.500139 ], [ -91.060516, 32.512361 ], [ -91.070467, 32.528171 ], [ -91.074817, 32.533467 ], [ -91.093741, 32.549128 ], [ -91.097878, 32.544752 ], [ -91.097949, 32.537214 ], [ -91.098756, 32.532968 ], [ -91.101304, 32.525599 ], [ -91.106985, 32.514934 ], [ -91.116708, 32.500139 ], [ -91.117308, 32.495039 ], [ -91.116008, 32.483140 ], [ -91.112108, 32.476140 ], [ -91.108808, 32.472040 ], [ -91.095308, 32.458741 ], [ -91.081807, 32.450441 ], [ -91.070207, 32.445141 ], [ -91.052907, 32.438442 ], [ -91.029606, 32.433542 ], [ -91.026306, 32.434442 ], [ -91.016506, 32.440342 ], [ -91.004806, 32.445741 ], [ -90.998974, 32.450165 ], [ -90.993863, 32.450850 ], [ -90.983423, 32.449077 ], [ -90.978547, 32.447032 ], [ -90.969590, 32.439490 ], [ -90.968560, 32.438084 ], [ -90.966869, 32.435499 ], [ -90.966457, 32.433868 ], [ -90.965986, 32.424806 ], [ -90.966255, 32.421027 ], [ -90.967767, 32.418279 ], [ -90.971141, 32.414636 ], [ -90.974461, 32.412001 ], [ -90.980723, 32.408243 ], [ -90.994080, 32.403862 ], [ -90.993780, 32.396778 ], [ -90.994686, 32.392277 ], [ -90.996237, 32.388061 ], [ -91.000606, 32.381644 ], [ -91.004506, 32.368144 ], [ -91.004506, 32.364744 ], [ -91.003506, 32.362145 ], [ -91.000106, 32.357695 ], [ -90.993625, 32.354047 ], [ -90.986672, 32.351760 ], [ -90.954583, 32.345859 ], [ -90.942981, 32.345956 ], [ -90.934897, 32.344967 ], [ -90.921170, 32.342073 ], [ -90.912363, 32.339454 ], [ -90.907756, 32.343611 ], [ -90.897762, 32.354360 ], [ -90.892060, 32.370579 ], [ -90.888947, 32.373246 ], [ -90.878289, 32.374548 ], [ -90.875631, 32.372434 ], [ -90.882161, 32.357552 ], [ -90.900720, 32.330379 ], [ -90.901240, 32.323386 ], [ -90.902558, 32.319587 ], [ -90.905173, 32.315497 ], [ -90.916157, 32.303582 ], [ -90.922231, 32.298639 ], [ -90.933991, 32.290343 ], [ -90.947834, 32.283486 ], [ -90.951351, 32.283199 ], [ -90.953008, 32.284043 ], [ -90.955405, 32.286241 ], [ -90.961171, 32.293288 ], [ -90.963079, 32.296285 ], [ -90.964149, 32.296872 ], [ -90.971643, 32.297497 ], [ -90.974602, 32.297122 ], [ -90.976199, 32.296450 ], [ -90.979475, 32.293702 ], [ -90.980747, 32.291410 ], [ -90.984077, 32.279954 ], [ -90.982985, 32.270294 ], [ -90.981028, 32.266733 ], [ -90.979663, 32.265252 ], [ -90.971344, 32.257742 ], [ -90.969403, 32.252520 ], [ -90.970016, 32.251680 ], [ -90.976139, 32.248092 ], [ -90.980290, 32.243601 ], [ -90.983135, 32.231371 ], [ -90.983263, 32.226201 ], [ -90.983434, 32.221305 ], [ -90.985989, 32.217856 ], [ -90.988672, 32.215812 ], [ -90.991227, 32.214662 ], [ -90.994293, 32.213768 ], [ -90.997359, 32.213896 ], [ -90.999531, 32.214662 ], [ -91.001192, 32.215173 ], [ -91.002469, 32.215812 ], [ -91.004769, 32.221050 ], [ -91.006106, 32.224050 ], [ -91.009606, 32.226150 ], [ -91.021507, 32.236149 ], [ -91.026607, 32.238749 ], [ -91.034307, 32.241549 ], [ -91.039007, 32.242349 ], [ -91.046507, 32.241149 ], [ -91.050307, 32.237949 ], [ -91.051807, 32.234449 ], [ -91.053107, 32.227950 ], [ -91.055107, 32.224750 ], [ -91.061408, 32.218650 ], [ -91.071108, 32.226050 ], [ -91.075108, 32.227050 ], [ -91.083708, 32.226450 ], [ -91.092108, 32.223850 ], [ -91.100409, 32.217850 ], [ -91.108509, 32.208150 ], [ -91.113009, 32.206550 ], [ -91.114084, 32.206697 ], [ -91.117270, 32.206668 ], [ -91.124043, 32.211104 ], [ -91.128495, 32.213169 ], [ -91.130197, 32.213666 ], [ -91.133587, 32.213432 ], [ -91.158026, 32.201956 ], [ -91.162062, 32.199035 ], [ -91.164171, 32.196888 ], [ -91.168073, 32.186635 ], [ -91.171046, 32.176526 ], [ -91.173664, 32.164231 ], [ -91.174552, 32.154978 ], [ -91.173495, 32.149009 ], [ -91.171702, 32.144250 ], [ -91.165452, 32.134290 ], [ -91.162822, 32.132694 ], [ -91.155043, 32.132243 ], [ -91.144400, 32.130390 ], [ -91.136566, 32.127371 ], [ -91.131403, 32.126213 ], [ -91.113866, 32.125731 ], [ -91.111294, 32.125036 ], [ -91.103696, 32.130007 ], [ -91.101181, 32.131136 ], [ -91.091656, 32.133604 ], [ -91.081630, 32.133992 ], [ -91.077043, 32.133493 ], [ -91.069081, 32.131478 ], [ -91.061555, 32.126907 ], [ -91.053175, 32.124237 ], [ -91.051207, 32.144152 ], [ -91.050207, 32.145252 ], [ -91.048507, 32.150152 ], [ -91.049707, 32.157352 ], [ -91.055707, 32.163752 ], [ -91.058907, 32.171251 ], [ -91.057647, 32.177354 ], [ -91.050207, 32.178451 ], [ -91.041807, 32.174551 ], [ -91.031907, 32.167851 ], [ -91.025007, 32.162552 ], [ -91.016606, 32.160852 ], [ -91.006190, 32.156957 ], [ -91.004106, 32.146152 ], [ -91.005006, 32.142852 ], [ -91.006406, 32.139952 ], [ -91.011806, 32.131153 ], [ -91.017606, 32.125153 ], [ -91.020006, 32.123553 ], [ -91.027007, 32.121053 ], [ -91.030907, 32.120552 ], [ -91.030507, 32.108153 ], [ -91.034707, 32.101053 ], [ -91.038607, 32.098254 ], [ -91.066679, 32.085330 ], [ -91.080008, 32.079154 ], [ -91.081508, 32.077754 ], [ -91.081708, 32.075754 ], [ -91.079108, 32.050255 ], [ -91.080208, 32.048355 ], [ -91.082308, 32.047555 ], [ -91.098708, 32.048355 ], [ -91.103708, 32.050255 ], [ -91.114309, 32.058255 ], [ -91.124109, 32.071854 ], [ -91.128609, 32.076554 ], [ -91.134909, 32.080354 ], [ -91.139309, 32.081754 ], [ -91.145110, 32.081354 ], [ -91.148810, 32.080154 ], [ -91.155810, 32.075554 ], [ -91.160310, 32.070354 ], [ -91.161610, 32.067754 ], [ -91.162010, 32.065354 ], [ -91.162010, 32.062355 ], [ -91.161310, 32.059755 ], [ -91.159010, 32.055955 ], [ -91.156310, 32.052655 ], [ -91.151410, 32.049255 ], [ -91.145110, 32.046555 ], [ -91.125109, 32.042855 ], [ -91.095508, 32.037455 ], [ -91.088108, 32.034455 ], [ -91.084408, 32.031456 ], [ -91.082608, 32.028656 ], [ -91.080808, 32.023456 ], [ -91.079928, 32.018316 ], [ -91.075908, 32.016828 ], [ -91.090105, 32.000157 ], [ -91.096108, 31.994857 ], [ -91.104108, 31.990357 ], [ -91.117409, 31.987057 ], [ -91.164410, 31.982557 ], [ -91.170210, 31.979057 ], [ -91.177410, 31.973257 ], [ -91.184810, 31.965557 ], [ -91.188310, 31.960958 ], [ -91.189110, 31.957458 ], [ -91.188810, 31.953158 ], [ -91.189510, 31.946358 ], [ -91.193210, 31.935658 ], [ -91.192910, 31.934958 ], [ -91.191110, 31.934158 ], [ -91.184710, 31.935058 ], [ -91.183710, 31.933158 ], [ -91.184910, 31.923759 ], [ -91.181110, 31.920059 ], [ -91.180610, 31.917959 ], [ -91.183210, 31.916159 ], [ -91.189210, 31.914259 ], [ -91.190810, 31.912959 ], [ -91.192610, 31.910159 ], [ -91.193810, 31.909559 ], [ -91.197510, 31.908659 ], [ -91.201010, 31.909159 ], [ -91.202810, 31.907959 ], [ -91.205110, 31.904159 ], [ -91.208810, 31.900459 ], [ -91.226951, 31.885105 ], [ -91.234899, 31.876863 ], [ -91.248144, 31.869848 ], [ -91.264412, 31.865460 ], [ -91.266512, 31.864260 ], [ -91.267712, 31.862660 ], [ -91.269012, 31.858661 ], [ -91.268812, 31.855161 ], [ -91.268112, 31.853061 ], [ -91.266612, 31.851161 ], [ -91.261144, 31.846119 ], [ -91.245624, 31.833165 ], [ -91.245047, 31.831447 ], [ -91.247367, 31.822323 ], [ -91.250111, 31.817762 ], [ -91.255611, 31.812662 ], [ -91.262011, 31.809362 ], [ -91.269212, 31.809162 ], [ -91.276712, 31.811362 ], [ -91.280212, 31.813162 ], [ -91.282212, 31.814762 ], [ -91.284912, 31.818362 ], [ -91.287812, 31.824161 ], [ -91.289412, 31.828661 ], [ -91.290135, 31.833658 ], [ -91.289312, 31.846861 ], [ -91.293413, 31.860160 ], [ -91.294713, 31.860460 ], [ -91.326914, 31.854961 ], [ -91.333814, 31.853261 ], [ -91.338414, 31.851261 ], [ -91.343014, 31.846861 ], [ -91.345714, 31.842861 ], [ -91.359514, 31.799362 ], [ -91.363714, 31.780363 ], [ -91.365529, 31.761628 ], [ -91.355214, 31.758063 ], [ -91.325973, 31.761510 ], [ -91.301315, 31.766748 ], [ -91.286045, 31.772062 ], [ -91.273874, 31.771178 ], [ -91.263043, 31.766995 ], [ -91.259611, 31.761290 ], [ -91.263406, 31.754468 ], [ -91.275545, 31.745515 ], [ -91.291723, 31.745260 ], [ -91.310734, 31.749071 ], [ -91.319816, 31.749989 ], [ -91.338663, 31.750005 ], [ -91.356394, 31.749106 ], [ -91.365034, 31.748184 ], [ -91.371804, 31.742948 ], [ -91.380915, 31.732464 ], [ -91.397115, 31.711364 ], [ -91.397915, 31.709364 ], [ -91.400015, 31.697864 ], [ -91.400115, 31.688164 ], [ -91.398015, 31.662665 ], [ -91.395715, 31.644165 ], [ -91.396115, 31.639265 ], [ -91.398315, 31.626265 ], [ -91.401015, 31.620365 ], [ -91.416498, 31.613133 ], [ -91.421116, 31.611565 ], [ -91.429616, 31.611365 ], [ -91.436716, 31.612665 ], [ -91.463817, 31.620365 ], [ -91.474318, 31.625365 ], [ -91.479818, 31.628965 ], [ -91.482618, 31.631565 ], [ -91.487518, 31.637065 ], [ -91.490027, 31.641000 ], [ -91.492748, 31.644279 ], [ -91.494478, 31.645013 ], [ -91.497665, 31.645371 ], [ -91.499278, 31.644658 ], [ -91.507310, 31.639068 ], [ -91.512336, 31.634722 ], [ -91.515462, 31.630372 ], [ -91.516659, 31.627332 ], [ -91.517921, 31.618642 ], [ -91.517233, 31.613460 ], [ -91.516567, 31.611818 ], [ -91.513010, 31.606885 ], [ -91.502783, 31.595727 ], [ -91.494118, 31.590165 ], [ -91.488618, 31.587466 ], [ -91.485218, 31.586166 ], [ -91.479418, 31.585466 ], [ -91.466317, 31.586066 ], [ -91.457517, 31.587566 ], [ -91.436316, 31.594965 ], [ -91.430716, 31.596465 ], [ -91.422716, 31.597065 ], [ -91.417115, 31.596265 ], [ -91.413015, 31.595365 ], [ -91.403915, 31.589766 ], [ -91.405415, 31.576466 ], [ -91.406615, 31.571966 ], [ -91.407915, 31.569366 ], [ -91.414915, 31.562166 ], [ -91.426416, 31.554566 ], [ -91.437616, 31.546166 ], [ -91.443916, 31.542466 ], [ -91.450017, 31.539666 ], [ -91.479718, 31.530366 ], [ -91.481318, 31.530666 ], [ -91.483918, 31.532566 ], [ -91.489618, 31.534266 ], [ -91.500118, 31.532616 ], [ -91.506719, 31.532966 ], [ -91.511217, 31.532612 ], [ -91.513963, 31.532084 ], [ -91.515810, 31.530894 ], [ -91.521445, 31.523912 ], [ -91.522536, 31.522078 ], [ -91.522920, 31.519841 ], [ -91.522862, 31.517493 ], [ -91.520579, 31.513207 ], [ -91.516759, 31.511772 ], [ -91.514917, 31.510113 ], [ -91.515157, 31.503380 ], [ -91.517140, 31.498394 ], [ -91.518148, 31.483483 ], [ -91.516999, 31.460574 ], [ -91.515130, 31.449206 ], [ -91.513366, 31.444396 ], [ -91.510356, 31.438928 ], [ -91.506423, 31.431460 ], [ -91.500046, 31.420520 ], [ -91.490040, 31.412716 ], [ -91.480230, 31.404391 ], [ -91.476926, 31.397796 ], [ -91.472065, 31.395925 ], [ -91.472149, 31.391434 ], [ -91.471992, 31.382143 ], [ -91.471098, 31.376917 ], [ -91.472465, 31.371326 ], [ -91.478870, 31.364955 ], [ -91.504163, 31.364950 ], [ -91.508075, 31.366276 ], [ -91.515978, 31.370286 ], [ -91.521836, 31.375170 ], [ -91.526950, 31.380855 ], [ -91.532336, 31.390275 ], [ -91.539458, 31.414021 ], [ -91.539504, 31.417910 ], [ -91.537002, 31.423184 ], [ -91.537137, 31.424161 ], [ -91.540647, 31.430758 ], [ -91.541626, 31.431706 ], [ -91.545013, 31.433026 ], [ -91.548465, 31.432668 ], [ -91.552750, 31.430692 ], [ -91.554805, 31.428570 ], [ -91.565179, 31.423447 ], [ -91.570092, 31.419487 ], [ -91.576265, 31.410498 ], [ -91.578246, 31.403859 ], [ -91.578334, 31.399067 ], [ -91.573931, 31.390886 ], [ -91.571234, 31.384664 ], [ -91.568953, 31.377629 ], [ -91.562555, 31.383219 ], [ -91.560524, 31.384559 ], [ -91.555680, 31.386413 ], [ -91.552432, 31.385658 ], [ -91.546207, 31.382480 ], [ -91.546607, 31.381198 ], [ -91.549915, 31.376315 ], [ -91.551002, 31.363645 ], [ -91.550869, 31.360574 ], [ -91.548894, 31.353998 ], [ -91.548967, 31.347255 ], [ -91.545617, 31.343762 ], [ -91.536061, 31.338355 ], [ -91.533206, 31.333225 ], [ -91.531657, 31.331801 ], [ -91.518509, 31.323332 ], [ -91.510049, 31.316822 ], [ -91.508660, 31.315131 ], [ -91.507977, 31.312943 ], [ -91.508296, 31.295829 ], [ -91.508858, 31.291644 ], [ -91.512085, 31.284177 ], [ -91.515614, 31.278210 ], [ -91.518578, 31.275283 ], [ -91.537734, 31.267369 ], [ -91.553905, 31.263050 ], [ -91.564192, 31.261633 ], [ -91.574493, 31.261289 ], [ -91.587749, 31.262563 ], [ -91.606672, 31.265900 ], [ -91.621358, 31.267811 ], [ -91.637672, 31.267680 ], [ -91.641253, 31.266917 ], [ -91.648669, 31.262238 ], [ -91.651369, 31.259528 ], [ -91.654027, 31.255753 ], [ -91.655009, 31.251815 ], [ -91.654907, 31.250175 ], [ -91.652019, 31.242691 ], [ -91.644356, 31.234414 ], [ -91.625119, 31.226071 ], [ -91.601616, 31.208573 ], [ -91.595029, 31.201969 ], [ -91.590051, 31.193693 ], [ -91.588939, 31.188959 ], [ -91.588695, 31.181025 ], [ -91.589046, 31.178586 ], [ -91.591502, 31.173118 ], [ -91.597062, 31.163492 ], [ -91.599732, 31.159592 ], [ -91.604197, 31.154545 ], [ -91.621671, 31.136870 ], [ -91.624217, 31.133729 ], [ -91.625118, 31.131879 ], [ -91.625707, 31.128763 ], [ -91.626476, 31.119125 ], [ -91.625994, 31.116896 ], [ -91.621535, 31.110257 ], [ -91.618570, 31.107328 ], [ -91.614763, 31.104357 ], [ -91.609523, 31.101557 ], [ -91.594693, 31.091444 ], [ -91.567648, 31.070186 ], [ -91.564150, 31.066830 ], [ -91.561283, 31.060906 ], [ -91.559907, 31.054119 ], [ -91.560365, 31.049508 ], [ -91.561232, 31.046225 ], [ -91.564397, 31.038965 ], [ -91.571695, 31.029782 ], [ -91.578413, 31.024030 ], [ -91.590463, 31.017270 ], [ -91.606490, 31.011216 ], [ -91.625118, 31.005374 ], [ -91.636942, 30.999416 ], [ -91.625118, 30.999167 ], [ -91.538727, 30.999388 ], [ -91.500116, 30.998691 ], [ -91.497390, 30.999006 ], [ -91.425749, 30.999007 ], [ -91.423621, 30.998984 ], [ -91.246490, 30.999474 ], [ -91.224839, 30.999183 ], [ -91.224068, 30.999183 ], [ -91.176209, 30.999144 ], [ -91.108291, 30.998880 ], [ -91.108114, 30.998857 ], [ -91.080814, 30.998909 ], [ -91.068270, 30.998920 ], [ -90.894730, 30.999630 ], [ -90.826027, 30.999360 ], [ -90.783745, 30.999447 ], [ -90.779858, 30.999457 ], [ -90.775981, 30.999491 ], [ -90.769333, 30.999374 ], [ -90.758775, 30.999583 ], [ -90.734552, 30.999222 ], [ -90.734473, 30.999214 ], [ -90.651193, 30.999510 ], [ -90.648721, 30.999486 ], [ -90.588676, 30.999650 ], [ -90.587373, 30.999604 ], [ -90.584448, 30.999698 ], [ -90.583518, 30.999698 ], [ -90.567195, 30.999733 ], [ -90.486749, 30.999693 ], [ -90.485876, 30.999740 ], [ -90.477284, 30.999717 ], [ -90.475928, 30.999740 ], [ -90.474094, 30.999798 ], [ -90.442479, 30.999722 ], [ -90.441725, 30.999729 ], [ -90.437351, 30.999730 ], [ -90.426849, 30.999776 ], [ -90.422117, 30.999810 ], [ -90.380536, 30.999872 ], [ -90.369371, 31.000335 ], [ -90.347230, 31.000359 ], [ -90.346007, 31.000363 ], [ -90.164676, 31.000980 ], [ -90.164278, 31.001025 ], [ -90.131395, 31.000924 ], [ -90.128406, 31.001047 ], [ -90.050706, 31.001215 ], [ -90.029574, 31.001190 ], [ -90.022185, 31.001302 ], [ -90.005332, 31.001364 ], [ -89.975430, 31.001692 ], [ -89.972802, 31.001392 ], [ -89.927161, 31.001437 ], [ -89.923119, 31.001446 ], [ -89.897516, 31.001913 ], [ -89.892708, 31.001759 ], [ -89.856862, 31.002075 ], [ -89.835542, 31.002059 ], [ -89.824617, 31.002060 ], [ -89.816429, 31.002084 ], [ -89.752642, 31.001853 ], [ -89.752133, 31.000183 ], [ -89.751481, 30.999690 ], [ -89.749189, 30.999555 ], [ -89.747229, 31.000184 ], [ -89.745215, 31.002252 ], [ -89.741821, 31.003441 ], [ -89.732504, 31.004831 ], [ -89.729616, 31.003927 ], [ -89.728147, 31.002431 ], [ -89.728126, 31.000956 ], [ -89.730000, 30.999749 ], [ -89.735540, 30.999715 ], [ -89.734227, 30.995602 ], [ -89.732035, 30.994409 ], [ -89.728563, 30.994396 ], [ -89.727698, 30.993329 ], [ -89.729930, 30.982090 ], [ -89.730501, 30.979707 ], [ -89.732168, 30.978088 ], [ -89.735912, 30.977865 ], [ -89.736883, 30.977122 ], [ -89.737149, 30.976081 ], [ -89.736086, 30.974446 ], [ -89.728382, 30.971141 ], [ -89.727086, 30.969707 ], [ -89.727072, 30.967395 ], [ -89.728041, 30.966518 ], [ -89.729327, 30.966242 ], [ -89.731393, 30.966130 ], [ -89.733933, 30.966919 ], [ -89.735686, 30.966573 ], [ -89.743134, 30.959993 ], [ -89.743592, 30.958482 ], [ -89.751196, 30.951439 ], [ -89.756333, 30.943498 ], [ -89.756554, 30.941949 ], [ -89.755835, 30.939543 ], [ -89.750073, 30.935763 ], [ -89.748897, 30.933888 ], [ -89.748851, 30.932816 ], [ -89.750073, 30.929815 ], [ -89.748208, 30.923369 ], [ -89.745161, 30.922416 ], [ -89.744448, 30.920577 ], [ -89.744789, 30.918933 ], [ -89.746718, 30.915805 ], [ -89.750073, 30.912930 ], [ -89.754086, 30.912800 ], [ -89.757417, 30.914993 ], [ -89.759403, 30.915134 ], [ -89.762600, 30.913736 ], [ -89.764202, 30.911906 ], [ -89.764451, 30.910276 ], [ -89.763622, 30.907732 ], [ -89.761593, 30.906591 ], [ -89.759803, 30.906216 ], [ -89.756671, 30.901069 ], [ -89.757024, 30.898947 ], [ -89.758719, 30.897319 ], [ -89.760701, 30.896306 ], [ -89.765101, 30.896919 ], [ -89.770269, 30.899390 ], [ -89.771986, 30.899127 ], [ -89.773099, 30.898338 ], [ -89.773553, 30.896862 ], [ -89.772011, 30.890240 ], [ -89.770027, 30.882254 ], [ -89.775458, 30.881497 ], [ -89.777110, 30.881088 ], [ -89.778583, 30.878903 ], [ -89.779194, 30.875185 ], [ -89.778005, 30.873411 ], [ -89.768237, 30.866392 ], [ -89.767789, 30.865577 ], [ -89.767955, 30.863858 ], [ -89.771722, 30.854677 ], [ -89.772587, 30.853660 ], [ -89.774739, 30.853254 ], [ -89.778755, 30.855800 ], [ -89.781643, 30.856613 ], [ -89.783384, 30.856022 ], [ -89.784073, 30.855270 ], [ -89.784416, 30.853744 ], [ -89.783791, 30.852131 ], [ -89.780947, 30.848542 ], [ -89.780228, 30.846235 ], [ -89.780600, 30.845508 ], [ -89.782649, 30.845264 ], [ -89.787500, 30.844112 ], [ -89.790121, 30.837983 ], [ -89.790805, 30.832131 ], [ -89.790432, 30.830985 ], [ -89.789426, 30.830470 ], [ -89.786837, 30.830642 ], [ -89.783985, 30.827385 ], [ -89.781168, 30.820123 ], [ -89.782404, 30.817975 ], [ -89.785894, 30.815962 ], [ -89.791745, 30.820387 ], [ -89.796634, 30.821648 ], [ -89.797491, 30.821478 ], [ -89.798654, 30.820855 ], [ -89.800049, 30.819078 ], [ -89.799673, 30.815172 ], [ -89.800422, 30.810425 ], [ -89.804065, 30.803247 ], [ -89.804632, 30.802511 ], [ -89.808176, 30.800562 ], [ -89.810143, 30.799846 ], [ -89.811171, 30.798921 ], [ -89.811479, 30.797996 ], [ -89.810863, 30.797379 ], [ -89.808601, 30.794913 ], [ -89.807071, 30.793908 ], [ -89.806237, 30.793371 ], [ -89.804901, 30.792549 ], [ -89.804696, 30.791624 ], [ -89.805107, 30.790596 ], [ -89.806763, 30.789069 ], [ -89.810657, 30.788026 ], [ -89.812096, 30.788437 ], [ -89.812610, 30.789876 ], [ -89.813535, 30.792035 ], [ -89.813946, 30.793782 ], [ -89.816418, 30.796054 ], [ -89.817559, 30.796054 ], [ -89.819164, 30.795229 ], [ -89.821078, 30.792523 ], [ -89.821486, 30.791183 ], [ -89.821130, 30.788609 ], [ -89.824395, 30.779629 ], [ -89.831537, 30.767610 ], [ -89.827886, 30.758419 ], [ -89.825774, 30.747305 ], [ -89.826053, 30.742322 ], [ -89.823492, 30.740988 ], [ -89.819548, 30.740671 ], [ -89.816764, 30.740076 ], [ -89.816075, 30.739366 ], [ -89.816499, 30.737946 ], [ -89.817480, 30.737305 ], [ -89.821535, 30.736618 ], [ -89.826175, 30.736594 ], [ -89.833818, 30.736972 ], [ -89.835437, 30.736260 ], [ -89.836870, 30.734661 ], [ -89.836945, 30.728201 ], [ -89.836331, 30.727197 ], [ -89.833065, 30.726759 ], [ -89.828061, 30.725018 ], [ -89.830060, 30.716310 ], [ -89.831961, 30.715384 ], [ -89.836257, 30.716185 ], [ -89.845801, 30.707314 ], [ -89.846576, 30.706209 ], [ -89.845926, 30.704157 ], [ -89.843605, 30.702511 ], [ -89.841730, 30.702713 ], [ -89.839312, 30.704143 ], [ -89.838065, 30.704036 ], [ -89.835848, 30.699555 ], [ -89.835478, 30.691166 ], [ -89.836797, 30.690573 ], [ -89.844965, 30.674691 ], [ -89.847201, 30.670038 ], [ -89.845807, 30.668931 ], [ -89.843816, 30.668761 ], [ -89.842344, 30.669724 ], [ -89.841350, 30.671963 ], [ -89.840597, 30.672880 ], [ -89.838868, 30.673731 ], [ -89.837894, 30.672514 ], [ -89.838804, 30.669090 ], [ -89.843355, 30.663699 ], [ -89.845642, 30.663569 ], [ -89.846917, 30.663952 ], [ -89.848879, 30.665202 ], [ -89.850550, 30.664781 ], [ -89.852263, 30.662934 ], [ -89.851889, 30.661199 ], [ -89.840988, 30.658515 ], [ -89.836047, 30.657298 ], [ -89.833261, 30.657516 ], [ -89.824986, 30.649423 ], [ -89.821868, 30.644024 ], [ -89.818081, 30.634019 ], [ -89.823261, 30.622803 ], [ -89.821424, 30.619815 ], [ -89.820868, 30.618254 ], [ -89.822389, 30.614462 ], [ -89.823278, 30.608230 ], [ -89.821286, 30.607130 ], [ -89.816905, 30.608620 ], [ -89.815380, 30.608566 ], [ -89.813920, 30.607721 ], [ -89.814563, 30.606152 ], [ -89.817202, 30.600891 ], [ -89.819696, 30.596785 ], [ -89.819838, 30.595340 ], [ -89.818527, 30.592688 ], [ -89.816396, 30.591646 ], [ -89.812109, 30.591473 ], [ -89.807118, 30.587337 ], [ -89.807762, 30.585825 ], [ -89.809739, 30.584714 ], [ -89.806843, 30.572039 ], [ -89.808184, 30.568795 ], [ -89.808027, 30.567998 ], [ -89.806182, 30.567543 ], [ -89.803753, 30.568148 ], [ -89.799947, 30.569351 ], [ -89.794495, 30.569653 ], [ -89.790318, 30.567524 ], [ -89.789695, 30.566580 ], [ -89.790078, 30.565333 ], [ -89.792430, 30.563087 ], [ -89.796697, 30.561718 ], [ -89.800277, 30.563695 ], [ -89.801494, 30.563703 ], [ -89.802833, 30.562879 ], [ -89.803887, 30.560581 ], [ -89.803831, 30.558888 ], [ -89.802789, 30.557903 ], [ -89.794532, 30.556554 ], [ -89.791664, 30.551524 ], [ -89.791960, 30.548788 ], [ -89.793989, 30.548283 ], [ -89.795231, 30.548132 ], [ -89.795388, 30.547452 ], [ -89.795335, 30.546563 ], [ -89.793818, 30.545935 ], [ -89.791046, 30.545046 ], [ -89.788542, 30.544464 ], [ -89.783994, 30.544075 ], [ -89.780246, 30.544607 ], [ -89.779565, 30.544345 ], [ -89.775355, 30.538848 ], [ -89.771643, 30.530249 ], [ -89.770744, 30.527819 ], [ -89.769996, 30.521896 ], [ -89.768133, 30.515020 ], [ -89.760570, 30.515761 ], [ -89.758862, 30.513062 ], [ -89.758575, 30.505942 ], [ -89.758133, 30.505404 ], [ -89.752931, 30.502493 ], [ -89.746435, 30.502619 ], [ -89.742816, 30.498704 ], [ -89.742396, 30.497316 ], [ -89.734615, 30.494723 ], [ -89.726154, 30.492560 ], [ -89.724614, 30.491902 ], [ -89.721181, 30.488608 ], [ -89.719652, 30.483166 ], [ -89.715886, 30.477797 ], [ -89.712493, 30.477510 ], [ -89.710164, 30.478308 ], [ -89.709551, 30.477853 ], [ -89.705538, 30.472350 ], [ -89.701799, 30.465115 ], [ -89.695864, 30.463269 ], [ -89.690102, 30.459657 ], [ -89.683410, 30.451793 ], [ -89.682829, 30.445810 ], [ -89.684816, 30.439511 ], [ -89.683521, 30.434959 ], [ -89.681946, 30.434073 ], [ -89.680515, 30.428924 ], [ -89.678514, 30.414012 ], [ -89.680134, 30.411400 ], [ -89.681165, 30.411492 ], [ -89.682320, 30.412991 ], [ -89.684118, 30.412646 ], [ -89.683686, 30.405873 ], [ -89.679153, 30.399991 ], [ -89.672762, 30.389276 ], [ -89.670134, 30.382429 ], [ -89.662204, 30.371267 ], [ -89.660274, 30.363487 ], [ -89.657191, 30.356515 ], [ -89.652693, 30.355536 ], [ -89.646700, 30.352500 ], [ -89.645617, 30.351314 ], [ -89.645199, 30.348126 ], [ -89.636299, 30.343970 ], [ -89.629727, 30.339287 ], [ -89.630399, 30.332933 ], [ -89.629877, 30.321017 ], [ -89.626606, 30.315457 ], [ -89.626221, 30.314255 ], [ -89.631643, 30.309332 ], [ -89.634208, 30.308256 ], [ -89.639872, 30.307281 ], [ -89.640401, 30.306755 ], [ -89.641705, 30.303799 ], [ -89.643440, 30.287682 ], [ -89.637647, 30.285032 ], [ -89.631411, 30.279662 ], [ -89.630520, 30.276562 ], [ -89.629757, 30.267195 ], [ -89.630649, 30.262084 ], [ -89.631215, 30.261704 ], [ -89.632225, 30.260137 ], [ -89.631789, 30.256924 ], [ -89.626922, 30.251745 ], [ -89.623856, 30.249895 ], [ -89.616156, 30.247395 ], [ -89.614156, 30.244595 ], [ -89.614056, 30.241495 ], [ -89.615856, 30.235295 ], [ -89.617056, 30.227495 ], [ -89.616956, 30.225595 ], [ -89.615856, 30.223195 ], [ -89.612556, 30.219496 ], [ -89.610655, 30.218096 ], [ -89.607655, 30.217096 ], [ -89.601255, 30.216096 ], [ -89.596655, 30.211796 ], [ -89.588854, 30.200296 ], [ -89.587354, 30.195196 ], [ -89.585754, 30.192096 ], [ -89.580754, 30.186197 ], [ -89.574454, 30.181697 ], [ -89.570154, 30.180297 ], [ -89.562253, 30.182397 ], [ -89.554653, 30.185797 ], [ -89.550853, 30.189197 ], [ -89.549053, 30.191597 ], [ -89.546953, 30.193097 ], [ -89.541453, 30.195397 ], [ -89.538652, 30.195797 ], [ -89.533352, 30.194797 ], [ -89.530452, 30.192197 ], [ -89.527952, 30.188697 ], [ -89.524504, 30.180753 ], [ -89.531213, 30.177099 ], [ -89.537493, 30.171745 ], [ -89.555013, 30.170798 ], [ -89.562825, 30.168667 ], [ -89.568270, 30.163932 ], [ -89.572093, 30.160362 ], [ -89.587062, 30.150648 ], [ -89.595021, 30.149891 ], [ -89.598027, 30.152409 ], [ -89.617542, 30.156422 ], [ -89.640989, 30.138612 ], [ -89.656986, 30.118381 ], [ -89.669182, 30.110667 ], [ -89.674633, 30.110406 ], [ -89.678163, 30.108286 ], [ -89.682181, 30.091536 ], [ -89.683712, 30.076018 ], [ -89.698496, 30.070491 ], [ -89.712942, 30.069088 ], [ -89.727453, 30.062661 ], [ -89.730999, 30.057581 ], [ -89.731545, 30.049691 ], [ -89.716300, 30.028110 ], [ -89.716377, 30.026222 ], [ -89.724649, 30.022454 ], [ -89.733323, 30.022054 ], [ -89.746505, 30.032599 ], [ -89.763216, 30.042108 ], [ -89.782534, 30.045372 ], [ -89.818561, 30.043328 ], [ -89.839933, 30.024146 ], [ -89.857558, 30.004439 ], [ -89.852312, 29.977650 ], [ -89.844202, 29.955645 ], [ -89.838500, 29.945816 ], [ -89.829023, 29.939228 ], [ -89.818030, 29.934145 ], [ -89.804463, 29.932588 ], [ -89.775459, 29.937416 ], [ -89.748492, 29.945831 ], [ -89.727933, 29.958780 ], [ -89.719067, 29.953699 ], [ -89.712910, 29.946349 ], [ -89.736311, 29.936263 ], [ -89.742727, 29.935894 ], [ -89.746273, 29.928221 ], [ -89.742479, 29.908170 ], [ -89.711158, 29.879287 ], [ -89.692004, 29.868722 ], [ -89.671555, 29.867535 ], [ -89.660568, 29.862909 ], [ -89.638016, 29.864065 ], [ -89.613159, 29.872160 ], [ -89.598129, 29.881409 ], [ -89.591194, 29.897018 ], [ -89.592346, 29.917253 ], [ -89.583099, 29.931705 ], [ -89.583099, 29.945581 ], [ -89.574997, 29.959455 ], [ -89.574425, 29.983738 ], [ -89.581360, 29.994722 ], [ -89.571533, 29.999926 ], [ -89.551292, 30.005709 ], [ -89.501587, 30.034037 ], [ -89.494064, 30.040972 ], [ -89.494637, 30.050800 ], [ -89.499275, 30.058893 ], [ -89.493484, 30.072191 ], [ -89.481926, 30.079128 ], [ -89.458946, 30.063450 ], [ -89.444618, 30.060959 ], [ -89.429047, 30.052240 ], [ -89.418465, 30.049747 ], [ -89.372375, 30.054729 ], [ -89.368637, 30.047256 ], [ -89.372375, 30.036671 ], [ -89.381096, 30.030441 ], [ -89.393555, 30.029818 ], [ -89.415970, 30.020477 ], [ -89.422813, 30.015495 ], [ -89.432785, 30.008022 ], [ -89.433411, 29.991205 ], [ -89.432785, 29.978752 ], [ -89.405380, 29.965672 ], [ -89.393555, 29.966295 ], [ -89.379227, 29.963804 ], [ -89.378601, 29.919588 ], [ -89.368019, 29.911491 ], [ -89.331894, 29.915850 ], [ -89.315453, 29.923208 ], [ -89.283562, 29.973320 ], [ -89.273315, 29.993820 ], [ -89.250534, 30.002361 ], [ -89.243706, 29.997236 ], [ -89.249969, 29.975597 ], [ -89.218071, 29.972750 ], [ -89.223770, 29.961929 ], [ -89.231178, 29.925484 ], [ -89.244843, 29.930040 ], [ -89.263062, 29.929472 ], [ -89.280144, 29.924915 ], [ -89.318306, 29.898149 ], [ -89.322289, 29.887333 ], [ -89.311462, 29.881636 ], [ -89.289253, 29.880499 ], [ -89.272179, 29.886763 ], [ -89.241425, 29.889610 ], [ -89.236298, 29.886763 ], [ -89.236298, 29.877081 ], [ -89.254517, 29.864552 ], [ -89.269897, 29.859997 ], [ -89.294952, 29.857149 ], [ -89.317726, 29.850885 ], [ -89.363289, 29.845760 ], [ -89.383789, 29.838928 ], [ -89.383217, 29.830385 ], [ -89.372971, 29.825260 ], [ -89.345634, 29.820135 ], [ -89.342781, 29.798496 ], [ -89.331970, 29.790524 ], [ -89.318306, 29.788815 ], [ -89.293251, 29.803053 ], [ -89.277298, 29.807608 ], [ -89.277298, 29.799635 ], [ -89.284134, 29.795649 ], [ -89.284706, 29.770021 ], [ -89.269325, 29.760912 ], [ -89.271034, 29.756355 ], [ -89.305199, 29.756926 ], [ -89.316025, 29.760912 ], [ -89.325134, 29.772301 ], [ -89.337662, 29.779135 ], [ -89.354179, 29.781412 ], [ -89.367271, 29.775148 ], [ -89.386063, 29.788815 ], [ -89.394608, 29.784828 ], [ -89.399162, 29.770592 ], [ -89.414536, 29.752371 ], [ -89.428207, 29.741550 ], [ -89.424210, 29.697638 ], [ -89.448120, 29.703316 ], [ -89.471992, 29.718597 ], [ -89.486961, 29.725920 ], [ -89.506065, 29.731651 ], [ -89.530258, 29.743750 ], [ -89.540131, 29.743750 ], [ -89.560181, 29.735472 ], [ -89.572922, 29.746616 ], [ -89.598068, 29.747570 ], [ -89.634048, 29.752981 ], [ -89.651237, 29.749479 ], [ -89.649651, 29.719872 ], [ -89.644562, 29.710957 ], [ -89.618446, 29.700768 ], [ -89.599030, 29.704908 ], [ -89.592979, 29.702042 ], [ -89.599663, 29.690262 ], [ -89.596802, 29.684212 ], [ -89.573883, 29.674025 ], [ -89.557320, 29.670204 ], [ -89.533760, 29.670204 ], [ -89.487915, 29.630405 ], [ -89.485367, 29.624357 ], [ -89.486931, 29.620447 ], [ -89.504738, 29.631508 ], [ -89.523018, 29.639427 ], [ -89.535202, 29.648567 ], [ -89.583336, 29.652834 ], [ -89.608925, 29.657707 ], [ -89.621109, 29.657101 ], [ -89.623550, 29.662584 ], [ -89.632698, 29.671724 ], [ -89.644272, 29.675381 ], [ -89.649750, 29.672941 ], [ -89.641228, 29.647961 ], [ -89.641228, 29.635773 ], [ -89.647324, 29.625414 ], [ -89.657677, 29.624195 ], [ -89.674736, 29.626633 ], [ -89.684486, 29.624804 ], [ -89.688141, 29.615055 ], [ -89.684486, 29.602867 ], [ -89.671082, 29.588243 ], [ -89.668648, 29.580322 ], [ -89.684486, 29.563263 ], [ -89.684486, 29.551073 ], [ -89.681092, 29.534487 ], [ -89.696230, 29.525004 ], [ -89.699698, 29.523423 ], [ -89.700845, 29.520785 ], [ -89.700501, 29.515967 ], [ -89.693877, 29.508559 ], [ -89.665813, 29.490020 ], [ -89.644039, 29.492343 ], [ -89.635330, 29.489294 ], [ -89.617558, 29.468298 ], [ -89.596533, 29.456303 ], [ -89.592474, 29.449822 ], [ -89.589536, 29.437662 ], [ -89.577096, 29.433692 ], [ -89.574635, 29.435734 ], [ -89.574653, 29.441100 ], [ -89.548686, 29.465723 ], [ -89.528429, 29.454702 ], [ -89.532150, 29.434567 ], [ -89.531943, 29.425679 ], [ -89.518368, 29.400230 ], [ -89.508551, 29.386168 ], [ -89.505038, 29.386040 ], [ -89.487308, 29.393346 ], [ -89.484354, 29.397471 ], [ -89.482318, 29.406222 ], [ -89.477140, 29.411241 ], [ -89.470142, 29.401471 ], [ -89.457303, 29.393148 ], [ -89.422380, 29.390628 ], [ -89.380001, 29.391785 ], [ -89.373109, 29.387175 ], [ -89.355528, 29.381569 ], [ -89.340304, 29.381412 ], [ -89.336589, 29.378228 ], [ -89.347615, 29.365000 ], [ -89.350694, 29.349544 ], [ -89.323170, 29.343982 ], [ -89.303766, 29.357455 ], [ -89.283028, 29.356467 ], [ -89.272543, 29.351195 ], [ -89.265300, 29.345352 ], [ -89.257852, 29.336872 ], [ -89.253545, 29.322802 ], [ -89.240870, 29.310081 ], [ -89.224192, 29.313792 ], [ -89.223444, 29.318066 ], [ -89.219734, 29.324412 ], [ -89.204703, 29.338674 ], [ -89.200389, 29.344418 ], [ -89.200599, 29.347672 ], [ -89.189354, 29.345061 ], [ -89.179547, 29.339608 ], [ -89.177351, 29.335210 ], [ -89.178221, 29.326970 ], [ -89.165015, 29.303039 ], [ -89.157593, 29.296691 ], [ -89.140275, 29.291085 ], [ -89.134337, 29.279340 ], [ -89.136979, 29.275239 ], [ -89.129688, 29.265632 ], [ -89.112942, 29.256908 ], [ -89.112431, 29.235913 ], [ -89.116238, 29.231154 ], [ -89.121949, 29.227347 ], [ -89.121949, 29.224967 ], [ -89.103865, 29.206407 ], [ -89.090724, 29.199992 ], [ -89.068265, 29.204166 ], [ -89.067371, 29.208636 ], [ -89.029103, 29.220956 ], [ -89.021850, 29.218162 ], [ -89.015192, 29.211561 ], [ -89.000674, 29.180091 ], [ -89.005290, 29.164949 ], [ -89.013254, 29.163280 ], [ -89.018344, 29.165046 ], [ -89.024269, 29.170043 ], [ -89.043919, 29.162528 ], [ -89.070553, 29.160246 ], [ -89.075311, 29.158342 ], [ -89.078643, 29.149300 ], [ -89.076739, 29.144541 ], [ -89.073884, 29.142638 ], [ -89.062938, 29.139307 ], [ -89.055800, 29.137879 ], [ -89.050565, 29.138355 ], [ -89.038730, 29.142380 ], [ -89.032004, 29.144747 ], [ -89.024149, 29.137298 ], [ -89.023942, 29.133700 ], [ -89.026031, 29.130126 ], [ -89.051953, 29.106554 ], [ -89.055475, 29.084167 ], [ -89.062335, 29.070234 ], [ -89.069611, 29.069403 ], [ -89.073408, 29.074109 ], [ -89.075787, 29.083627 ], [ -89.077215, 29.096476 ], [ -89.081022, 29.101711 ], [ -89.086257, 29.106946 ], [ -89.094347, 29.110277 ], [ -89.099106, 29.110753 ], [ -89.101010, 29.109325 ], [ -89.101961, 29.105518 ], [ -89.102913, 29.097428 ], [ -89.102913, 29.079344 ], [ -89.105009, 29.073641 ], [ -89.121542, 29.069074 ], [ -89.143453, 29.047591 ], [ -89.156339, 29.028782 ], [ -89.158593, 29.021761 ], [ -89.157165, 29.018430 ], [ -89.151454, 29.013195 ], [ -89.142888, 29.004153 ], [ -89.139557, 28.997491 ], [ -89.138129, 28.990352 ], [ -89.138129, 28.985593 ], [ -89.140509, 28.980834 ], [ -89.143364, 28.976551 ], [ -89.148599, 28.975124 ], [ -89.151454, 28.975124 ], [ -89.152406, 28.977979 ], [ -89.151454, 28.982738 ], [ -89.151454, 28.987497 ], [ -89.154310, 28.992732 ], [ -89.158593, 28.997967 ], [ -89.168586, 29.007009 ], [ -89.176613, 29.012054 ], [ -89.186061, 29.017993 ], [ -89.182150, 29.025486 ], [ -89.189893, 29.032635 ], [ -89.197871, 29.029701 ], [ -89.202563, 29.031603 ], [ -89.211144, 29.040813 ], [ -89.216101, 29.056371 ], [ -89.215531, 29.061410 ], [ -89.217201, 29.067275 ], [ -89.225865, 29.078660 ], [ -89.236310, 29.084605 ], [ -89.254726, 29.083261 ], [ -89.257283, 29.081086 ], [ -89.256869, 29.073800 ], [ -89.253640, 29.064954 ], [ -89.259354, 29.058358 ], [ -89.283215, 29.053325 ], [ -89.383814, 28.947434 ], [ -89.411480, 28.925011 ], [ -89.419865, 28.929709 ], [ -89.412388, 28.957504 ], [ -89.408157, 28.965341 ], [ -89.398104, 28.977016 ], [ -89.364654, 29.008436 ], [ -89.350853, 29.027472 ], [ -89.339828, 29.052221 ], [ -89.332769, 29.058881 ], [ -89.320396, 29.061260 ], [ -89.317065, 29.066019 ], [ -89.315637, 29.074585 ], [ -89.315637, 29.088386 ], [ -89.313733, 29.108849 ], [ -89.314209, 29.118367 ], [ -89.319920, 29.127409 ], [ -89.328486, 29.131692 ], [ -89.336100, 29.131692 ], [ -89.340859, 29.127885 ], [ -89.348950, 29.118367 ], [ -89.363702, 29.112181 ], [ -89.385117, 29.111229 ], [ -89.400346, 29.116464 ], [ -89.409371, 29.127855 ], [ -89.417718, 29.138690 ], [ -89.428965, 29.144510 ], [ -89.432932, 29.149023 ], [ -89.447472, 29.178576 ], [ -89.455829, 29.190991 ], [ -89.472310, 29.207550 ], [ -89.482844, 29.215053 ], [ -89.536600, 29.236212 ], [ -89.606651, 29.252023 ], [ -89.671781, 29.289028 ], [ -89.697258, 29.296679 ], [ -89.726162, 29.304026 ], [ -89.782149, 29.311132 ], [ -89.819859, 29.310241 ], [ -89.850305, 29.311768 ], [ -89.855109, 29.334997 ], [ -89.853699, 29.340640 ], [ -89.847124, 29.349186 ], [ -89.835000, 29.359043 ], [ -89.820824, 29.377486 ], [ -89.816916, 29.384385 ], [ -89.816155, 29.393518 ], [ -89.816916, 29.398845 ], [ -89.819199, 29.404173 ], [ -89.822243, 29.409500 ], [ -89.826049, 29.415589 ], [ -89.835392, 29.418538 ], [ -89.843553, 29.421677 ], [ -89.845075, 29.434615 ], [ -89.836773, 29.454040 ], [ -89.833659, 29.456686 ], [ -89.833659, 29.459731 ], [ -89.832898, 29.463536 ], [ -89.833659, 29.467341 ], [ -89.834420, 29.470386 ], [ -89.840509, 29.473430 ], [ -89.849642, 29.477996 ], [ -89.862580, 29.476474 ], [ -89.876224, 29.472168 ], [ -89.902179, 29.460011 ], [ -89.918999, 29.444254 ], [ -89.932598, 29.429288 ], [ -89.955430, 29.428527 ], [ -89.964563, 29.434615 ], [ -89.972934, 29.443748 ], [ -89.991961, 29.463536 ], [ -90.012510, 29.462775 ], [ -90.018598, 29.452120 ], [ -90.022404, 29.444509 ], [ -90.032298, 29.427005 ], [ -90.031536, 29.412545 ], [ -90.033295, 29.393274 ], [ -90.029468, 29.388136 ], [ -90.030764, 29.375008 ] ] ], [ [ [ -90.917458, 29.047464 ], [ -90.932823, 29.051405 ], [ -90.947990, 29.058693 ], [ -90.955673, 29.064995 ], [ -90.954689, 29.066374 ], [ -90.939125, 29.056131 ], [ -90.916672, 29.049631 ], [ -90.917458, 29.047464 ] ] ], [ [ [ -89.439003, 30.127527 ], [ -89.446564, 30.130278 ], [ -89.442093, 30.144369 ], [ -89.426971, 30.148495 ], [ -89.417694, 30.143682 ], [ -89.423882, 30.133026 ], [ -89.429031, 30.128559 ], [ -89.439003, 30.127527 ] ] ], [ [ [ -89.215675, 29.993523 ], [ -89.229500, 30.000433 ], [ -89.242828, 30.038980 ], [ -89.256149, 30.041836 ], [ -89.263290, 30.041361 ], [ -89.271378, 30.023277 ], [ -89.275826, 30.023081 ], [ -89.333221, 30.034767 ], [ -89.340096, 30.042673 ], [ -89.342163, 30.059172 ], [ -89.315163, 30.072292 ], [ -89.305038, 30.091824 ], [ -89.246635, 30.123213 ], [ -89.196663, 30.159382 ], [ -89.190475, 30.161760 ], [ -89.185715, 30.157001 ], [ -89.190002, 30.148436 ], [ -89.199997, 30.142725 ], [ -89.216179, 30.120834 ], [ -89.223312, 30.096563 ], [ -89.222839, 30.088474 ], [ -89.217606, 30.075624 ], [ -89.178581, 30.066107 ], [ -89.175728, 30.062775 ], [ -89.173401, 30.043360 ], [ -89.201584, 30.001429 ], [ -89.215675, 29.993523 ] ] ], [ [ [ -91.821579, 29.473925 ], [ -91.838501, 29.478874 ], [ -91.848663, 29.484144 ], [ -91.852600, 29.494984 ], [ -91.862320, 29.502394 ], [ -91.878746, 29.502937 ], [ -91.886818, 29.505577 ], [ -91.906174, 29.518051 ], [ -91.915321, 29.518513 ], [ -91.947006, 29.533159 ], [ -91.969315, 29.536894 ], [ -91.985725, 29.547709 ], [ -92.026810, 29.566805 ], [ -92.035461, 29.578640 ], [ -92.030243, 29.579355 ], [ -92.021919, 29.580545 ], [ -92.021919, 29.587088 ], [ -92.018349, 29.592442 ], [ -92.008827, 29.595417 ], [ -92.007637, 29.604340 ], [ -91.990074, 29.611595 ], [ -91.965027, 29.608019 ], [ -91.939903, 29.610291 ], [ -91.935020, 29.612240 ], [ -91.929565, 29.618839 ], [ -91.922821, 29.633173 ], [ -91.898994, 29.637011 ], [ -91.896759, 29.634619 ], [ -91.882317, 29.629770 ], [ -91.866112, 29.631582 ], [ -91.863014, 29.633739 ], [ -91.841293, 29.629620 ], [ -91.838982, 29.624475 ], [ -91.840919, 29.619913 ], [ -91.838295, 29.616041 ], [ -91.821693, 29.606049 ], [ -91.803833, 29.599562 ], [ -91.784973, 29.595203 ], [ -91.778496, 29.589220 ], [ -91.774803, 29.582113 ], [ -91.774689, 29.576387 ], [ -91.746323, 29.574337 ], [ -91.719101, 29.565569 ], [ -91.715645, 29.565844 ], [ -91.711998, 29.564739 ], [ -91.709206, 29.561012 ], [ -91.711655, 29.554270 ], [ -91.733955, 29.539503 ], [ -91.747055, 29.535145 ], [ -91.765450, 29.520844 ], [ -91.771927, 29.504871 ], [ -91.772530, 29.499016 ], [ -91.770065, 29.493813 ], [ -91.770515, 29.488953 ], [ -91.782387, 29.482882 ], [ -91.789116, 29.482080 ], [ -91.803444, 29.486851 ], [ -91.814606, 29.482061 ], [ -91.821579, 29.473925 ] ] ], [ [ [ -89.944221, 29.271717 ], [ -89.950409, 29.275497 ], [ -89.950233, 29.277044 ], [ -89.943016, 29.276529 ], [ -89.924110, 29.286497 ], [ -89.906586, 29.296637 ], [ -89.904175, 29.293371 ], [ -89.928925, 29.279623 ], [ -89.944221, 29.271717 ] ] ], [ [ [ -90.442734, 29.056053 ], [ -90.473320, 29.059490 ], [ -90.529175, 29.078049 ], [ -90.550316, 29.092142 ], [ -90.520241, 29.081831 ], [ -90.470055, 29.066879 ], [ -90.428986, 29.064129 ], [ -90.423660, 29.060863 ], [ -90.442734, 29.056053 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US27", "STATE": "27", "NAME": "Minnesota", "LSAD": "", "CENSUSAREA": 79626.743000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -91.371608, 43.500945 ], [ -91.376950, 43.500482 ], [ -91.397319, 43.500887 ], [ -91.441786, 43.500438 ], [ -91.445932, 43.500588 ], [ -91.461403, 43.500642 ], [ -91.465063, 43.500608 ], [ -91.491042, 43.500690 ], [ -91.533806, 43.500560 ], [ -91.541220, 43.500515 ], [ -91.551021, 43.500539 ], [ -91.591073, 43.500536 ], [ -91.610895, 43.500530 ], [ -91.615293, 43.500550 ], [ -91.616895, 43.500663 ], [ -91.617407, 43.500687 ], [ -91.620785, 43.500677 ], [ -91.625611, 43.500727 ], [ -91.634244, 43.500479 ], [ -91.634495, 43.500439 ], [ -91.635626, 43.500463 ], [ -91.639772, 43.500573 ], [ -91.644924, 43.500529 ], [ -91.651396, 43.500454 ], [ -91.658401, 43.500533 ], [ -91.670872, 43.500513 ], [ -91.700749, 43.500581 ], [ -91.730359, 43.500680 ], [ -91.733330, 43.500623 ], [ -91.736558, 43.500561 ], [ -91.738446, 43.500525 ], [ -91.761414, 43.500637 ], [ -91.777688, 43.500711 ], [ -91.779290, 43.500803 ], [ -91.804925, 43.500716 ], [ -91.807156, 43.500648 ], [ -91.824848, 43.500684 ], [ -91.941837, 43.500554 ], [ -91.949879, 43.500485 ], [ -92.079954, 43.500647 ], [ -92.089970, 43.500684 ], [ -92.103886, 43.500735 ], [ -92.178863, 43.500713 ], [ -92.198788, 43.500527 ], [ -92.277425, 43.500466 ], [ -92.279084, 43.500436 ], [ -92.368908, 43.500454 ], [ -92.388298, 43.500483 ], [ -92.406130, 43.500476 ], [ -92.408832, 43.500614 ], [ -92.464505, 43.500345 ], [ -92.553161, 43.500300 ], [ -92.649194, 43.500049 ], [ -92.653318, 43.500050 ], [ -92.672580, 43.500055 ], [ -92.689033, 43.500062 ], [ -92.692786, 43.500063 ], [ -92.707312, 43.500069 ], [ -92.752088, 43.500084 ], [ -92.790317, 43.499567 ], [ -92.870277, 43.499548 ], [ -93.007871, 43.499604 ], [ -93.024429, 43.499572 ], [ -93.228861, 43.499567 ], [ -93.271800, 43.499356 ], [ -93.399035, 43.499485 ], [ -93.428509, 43.499478 ], [ -93.468563, 43.499473 ], [ -93.472804, 43.499400 ], [ -93.482009, 43.499482 ], [ -93.488261, 43.499417 ], [ -93.497405, 43.499456 ], [ -93.528482, 43.499471 ], [ -93.532178, 43.499472 ], [ -93.558631, 43.499521 ], [ -93.576728, 43.499520 ], [ -93.617131, 43.499548 ], [ -93.699345, 43.499576 ], [ -93.704916, 43.499568 ], [ -93.708771, 43.499564 ], [ -93.716217, 43.499563 ], [ -93.794285, 43.499542 ], [ -93.795793, 43.499520 ], [ -93.970760, 43.499605 ], [ -94.092894, 43.500302 ], [ -94.094339, 43.500302 ], [ -94.108068, 43.500300 ], [ -94.109880, 43.500283 ], [ -94.377466, 43.500379 ], [ -94.390597, 43.500469 ], [ -94.442835, 43.500583 ], [ -94.447048, 43.500639 ], [ -94.470420, 43.500340 ], [ -94.560838, 43.500377 ], [ -94.565665, 43.500330 ], [ -94.615916, 43.500544 ], [ -94.857867, 43.500615 ], [ -94.860192, 43.500546 ], [ -94.872725, 43.500564 ], [ -94.874235, 43.500557 ], [ -94.887291, 43.500502 ], [ -94.914523, 43.500450 ], [ -94.914905, 43.500450 ], [ -94.914955, 43.500450 ], [ -94.934625, 43.500490 ], [ -94.954477, 43.500467 ], [ -94.974359, 43.500508 ], [ -94.994460, 43.500523 ], [ -95.014245, 43.500872 ], [ -95.034000, 43.500811 ], [ -95.053504, 43.500769 ], [ -95.054289, 43.500860 ], [ -95.114874, 43.500667 ], [ -95.122633, 43.500755 ], [ -95.154936, 43.500449 ], [ -95.167294, 43.500771 ], [ -95.167891, 43.500885 ], [ -95.180423, 43.500774 ], [ -95.214938, 43.500885 ], [ -95.244844, 43.501196 ], [ -95.250762, 43.500406 ], [ -95.250969, 43.500464 ], [ -95.374737, 43.500314 ], [ -95.375269, 43.500322 ], [ -95.387812, 43.500240 ], [ -95.387851, 43.500240 ], [ -95.434199, 43.500314 ], [ -95.434293, 43.500360 ], [ -95.454706, 43.500648 ], [ -95.454706, 43.500563 ], [ -95.475065, 43.500335 ], [ -95.486737, 43.500274 ], [ -95.486803, 43.500246 ], [ -95.514774, 43.499865 ], [ -95.740813, 43.499894 ], [ -95.741569, 43.499891 ], [ -95.821277, 43.499965 ], [ -95.834421, 43.499966 ], [ -95.861152, 43.499966 ], [ -96.198484, 43.500335 ], [ -96.198766, 43.500312 ], [ -96.208814, 43.500391 ], [ -96.332062, 43.500415 ], [ -96.351059, 43.500333 ], [ -96.453049, 43.500415 ], [ -96.453352, 43.587040 ], [ -96.453383, 43.588183 ], [ -96.453356, 43.607544 ], [ -96.453387, 43.609944 ], [ -96.453408, 43.675008 ], [ -96.453380, 43.689637 ], [ -96.453281, 43.791435 ], [ -96.453088, 43.805123 ], [ -96.453264, 43.849604 ], [ -96.453335, 43.877029 ], [ -96.453304, 43.878583 ], [ -96.453183, 43.878650 ], [ -96.453352, 43.949122 ], [ -96.453289, 43.950814 ], [ -96.453165, 43.966540 ], [ -96.453292, 43.967180 ], [ -96.453389, 43.978060 ], [ -96.453263, 43.980277 ], [ -96.453328, 43.992871 ], [ -96.453297, 43.994723 ], [ -96.453116, 44.006876 ], [ -96.453053, 44.008887 ], [ -96.453373, 44.023744 ], [ -96.453405, 44.025413 ], [ -96.453313, 44.036430 ], [ -96.453187, 44.038350 ], [ -96.452774, 44.196895 ], [ -96.452673, 44.254588 ], [ -96.452419, 44.255274 ], [ -96.452369, 44.268967 ], [ -96.452365, 44.271972 ], [ -96.452617, 44.282702 ], [ -96.452500, 44.285687 ], [ -96.452334, 44.297009 ], [ -96.452239, 44.298655 ], [ -96.452369, 44.312071 ], [ -96.452248, 44.313362 ], [ -96.452372, 44.325991 ], [ -96.452309, 44.328094 ], [ -96.452248, 44.340642 ], [ -96.452152, 44.342219 ], [ -96.452305, 44.345332 ], [ -96.452282, 44.354857 ], [ -96.452213, 44.360149 ], [ -96.452134, 44.383679 ], [ -96.452073, 44.389690 ], [ -96.451924, 44.441549 ], [ -96.451816, 44.460402 ], [ -96.452218, 44.470873 ], [ -96.452122, 44.473043 ], [ -96.451974, 44.506849 ], [ -96.452010, 44.516929 ], [ -96.452236, 44.526871 ], [ -96.452016, 44.543533 ], [ -96.451888, 44.544058 ], [ -96.451720, 44.630708 ], [ -96.451761, 44.631194 ], [ -96.451543, 44.703135 ], [ -96.451232, 44.718375 ], [ -96.451573, 44.760510 ], [ -96.451380, 44.761788 ], [ -96.451620, 44.776191 ], [ -96.451823, 44.790471 ], [ -96.451888, 44.792299 ], [ -96.451829, 44.797691 ], [ -96.451559, 44.805468 ], [ -96.452009, 44.890080 ], [ -96.451853, 44.906672 ], [ -96.452047, 44.910695 ], [ -96.452347, 44.962734 ], [ -96.452092, 44.977475 ], [ -96.452240, 45.042347 ], [ -96.452177, 45.050185 ], [ -96.452210, 45.051602 ], [ -96.452219, 45.093836 ], [ -96.452026, 45.095138 ], [ -96.452418, 45.122677 ], [ -96.452353, 45.124071 ], [ -96.452304, 45.178563 ], [ -96.452162, 45.203109 ], [ -96.452152, 45.204849 ], [ -96.452315, 45.208986 ], [ -96.452949, 45.269059 ], [ -96.452791, 45.284280 ], [ -96.453067, 45.298115 ], [ -96.454094, 45.301546 ], [ -96.456941, 45.303652 ], [ -96.457781, 45.307610 ], [ -96.461910, 45.313884 ], [ -96.466644, 45.317162 ], [ -96.468027, 45.318619 ], [ -96.468756, 45.320564 ], [ -96.469246, 45.324941 ], [ -96.479323, 45.339644 ], [ -96.482556, 45.346273 ], [ -96.489065, 45.357071 ], [ -96.502006, 45.365473 ], [ -96.508132, 45.367832 ], [ -96.521787, 45.375645 ], [ -96.530944, 45.378495 ], [ -96.539722, 45.380338 ], [ -96.545973, 45.381050 ], [ -96.562142, 45.386090 ], [ -96.571364, 45.389871 ], [ -96.578879, 45.392295 ], [ -96.584764, 45.395705 ], [ -96.601180, 45.403181 ], [ -96.617726, 45.408092 ], [ -96.631204, 45.409238 ], [ -96.640624, 45.409227 ], [ -96.647888, 45.410126 ], [ -96.662258, 45.409011 ], [ -96.670301, 45.410545 ], [ -96.675447, 45.410216 ], [ -96.680454, 45.410499 ], [ -96.683753, 45.411556 ], [ -96.692541, 45.417338 ], [ -96.702006, 45.426247 ], [ -96.710786, 45.436930 ], [ -96.724250, 45.451482 ], [ -96.731396, 45.457020 ], [ -96.732739, 45.458737 ], [ -96.736837, 45.466775 ], [ -96.738446, 45.473499 ], [ -96.742509, 45.478723 ], [ -96.743486, 45.480649 ], [ -96.743683, 45.484439 ], [ -96.745487, 45.488712 ], [ -96.752865, 45.502163 ], [ -96.760591, 45.514895 ], [ -96.765280, 45.521414 ], [ -96.781036, 45.535972 ], [ -96.784863, 45.541300 ], [ -96.793840, 45.550724 ], [ -96.799102, 45.554225 ], [ -96.801987, 45.555414 ], [ -96.835451, 45.586129 ], [ -96.843957, 45.594003 ], [ -96.844334, 45.594375 ], [ -96.849444, 45.598944 ], [ -96.853646, 45.602307 ], [ -96.857751, 45.605962 ], [ -96.856657, 45.609041 ], [ -96.852392, 45.614840 ], [ -96.851621, 45.619412 ], [ -96.844211, 45.639583 ], [ -96.840746, 45.645294 ], [ -96.835769, 45.649648 ], [ -96.832659, 45.651716 ], [ -96.827428, 45.653067 ], [ -96.826160, 45.654164 ], [ -96.800156, 45.668355 ], [ -96.760866, 45.687518 ], [ -96.757174, 45.690957 ], [ -96.750350, 45.698782 ], [ -96.745086, 45.701576 ], [ -96.711157, 45.717561 ], [ -96.687224, 45.725931 ], [ -96.672665, 45.732336 ], [ -96.662595, 45.738682 ], [ -96.652226, 45.746809 ], [ -96.641941, 45.759871 ], [ -96.639685, 45.765400 ], [ -96.638726, 45.770171 ], [ -96.636646, 45.773702 ], [ -96.630512, 45.781157 ], [ -96.629426, 45.784211 ], [ -96.627778, 45.786239 ], [ -96.625347, 45.787924 ], [ -96.618195, 45.791063 ], [ -96.612512, 45.794442 ], [ -96.607621, 45.799070 ], [ -96.601863, 45.806343 ], [ -96.596704, 45.811801 ], [ -96.593216, 45.813873 ], [ -96.587093, 45.816445 ], [ -96.583085, 45.820024 ], [ -96.579740, 45.825820 ], [ -96.577484, 45.833108 ], [ -96.577534, 45.837930 ], [ -96.576544, 45.839945 ], [ -96.574517, 45.843098 ], [ -96.572984, 45.861602 ], [ -96.574417, 45.865010 ], [ -96.574667, 45.866816 ], [ -96.571871, 45.871846 ], [ -96.572651, 45.876474 ], [ -96.571354, 45.886673 ], [ -96.568772, 45.888072 ], [ -96.568281, 45.891203 ], [ -96.568053, 45.898697 ], [ -96.568315, 45.902902 ], [ -96.567268, 45.905393 ], [ -96.564420, 45.909415 ], [ -96.565541, 45.910883 ], [ -96.566534, 45.911876 ], [ -96.567030, 45.915682 ], [ -96.566562, 45.916931 ], [ -96.564002, 45.919560 ], [ -96.564317, 45.921074 ], [ -96.564518, 45.926256 ], [ -96.563280, 45.935238 ], [ -96.562525, 45.937087 ], [ -96.561334, 45.945655 ], [ -96.562135, 45.947718 ], [ -96.564803, 45.950349 ], [ -96.570350, 45.963595 ], [ -96.572384, 45.980231 ], [ -96.572483, 45.989577 ], [ -96.573605, 46.002309 ], [ -96.574064, 46.004434 ], [ -96.575869, 46.007999 ], [ -96.574264, 46.016545 ], [ -96.577315, 46.023560 ], [ -96.577940, 46.026874 ], [ -96.573644, 46.037911 ], [ -96.566295, 46.051416 ], [ -96.560945, 46.055415 ], [ -96.559271, 46.058272 ], [ -96.556907, 46.064830 ], [ -96.556611, 46.068920 ], [ -96.558055, 46.071159 ], [ -96.558088, 46.072096 ], [ -96.554507, 46.083978 ], [ -96.556345, 46.086880 ], [ -96.556672, 46.097232 ], [ -96.557952, 46.102442 ], [ -96.559167, 46.105024 ], [ -96.563175, 46.107995 ], [ -96.565723, 46.111963 ], [ -96.566920, 46.114750 ], [ -96.562811, 46.116250 ], [ -96.563043, 46.119512 ], [ -96.570023, 46.123756 ], [ -96.571439, 46.125720 ], [ -96.570081, 46.127037 ], [ -96.569260, 46.133686 ], [ -96.574784, 46.143146 ], [ -96.577381, 46.144951 ], [ -96.579453, 46.147601 ], [ -96.580408, 46.151234 ], [ -96.577715, 46.162797 ], [ -96.577952, 46.165843 ], [ -96.578620, 46.168135 ], [ -96.580531, 46.169186 ], [ -96.582823, 46.170905 ], [ -96.583779, 46.173563 ], [ -96.583324, 46.174154 ], [ -96.584495, 46.177123 ], [ -96.585647, 46.177309 ], [ -96.586739, 46.177305 ], [ -96.587408, 46.178164 ], [ -96.587599, 46.178928 ], [ -96.587599, 46.180075 ], [ -96.587408, 46.181221 ], [ -96.587217, 46.182749 ], [ -96.587503, 46.183609 ], [ -96.588554, 46.185233 ], [ -96.588579, 46.189689 ], [ -96.587724, 46.191838 ], [ -96.587694, 46.195262 ], [ -96.584929, 46.197231 ], [ -96.584272, 46.198053 ], [ -96.583582, 46.201047 ], [ -96.584372, 46.204155 ], [ -96.584899, 46.204383 ], [ -96.586744, 46.209912 ], [ -96.591652, 46.218183 ], [ -96.595670, 46.219850 ], [ -96.597550, 46.227733 ], [ -96.598645, 46.241626 ], [ -96.598119, 46.243112 ], [ -96.594234, 46.245329 ], [ -96.592375, 46.246076 ], [ -96.591037, 46.247222 ], [ -96.590369, 46.247891 ], [ -96.590082, 46.248655 ], [ -96.590369, 46.249515 ], [ -96.590942, 46.250183 ], [ -96.592470, 46.250757 ], [ -96.594189, 46.251712 ], [ -96.594571, 46.253335 ], [ -96.593712, 46.254959 ], [ -96.593616, 46.256679 ], [ -96.594571, 46.258302 ], [ -96.595909, 46.259926 ], [ -96.598870, 46.260690 ], [ -96.599729, 46.262123 ], [ -96.599087, 46.263701 ], [ -96.596822, 46.267913 ], [ -96.595014, 46.275135 ], [ -96.595509, 46.276689 ], [ -96.598392, 46.280080 ], [ -96.598774, 46.281417 ], [ -96.598201, 46.283136 ], [ -96.596100, 46.286097 ], [ -96.596077, 46.290536 ], [ -96.596968, 46.291838 ], [ -96.599347, 46.292879 ], [ -96.600302, 46.294407 ], [ -96.598679, 46.297750 ], [ -96.599156, 46.299183 ], [ -96.600270, 46.300406 ], [ -96.601360, 46.304130 ], [ -96.598233, 46.312563 ], [ -96.598399, 46.314482 ], [ -96.601040, 46.319554 ], [ -96.599761, 46.330386 ], [ -96.601048, 46.331139 ], [ -96.608075, 46.332576 ], [ -96.614676, 46.337418 ], [ -96.619991, 46.340135 ], [ -96.620454, 46.341346 ], [ -96.618147, 46.344295 ], [ -96.620790, 46.347607 ], [ -96.628522, 46.349569 ], [ -96.629378, 46.350529 ], [ -96.629211, 46.352654 ], [ -96.631586, 46.353752 ], [ -96.640267, 46.351585 ], [ -96.644335, 46.351908 ], [ -96.645959, 46.353532 ], [ -96.647296, 46.358499 ], [ -96.646341, 46.360982 ], [ -96.646532, 46.362510 ], [ -96.650718, 46.363655 ], [ -96.655206, 46.365964 ], [ -96.658009, 46.370512 ], [ -96.658436, 46.373391 ], [ -96.666028, 46.374566 ], [ -96.667189, 46.375458 ], [ -96.669794, 46.384644 ], [ -96.669132, 46.390037 ], [ -96.678507, 46.404823 ], [ -96.680687, 46.407383 ], [ -96.682008, 46.407840 ], [ -96.684834, 46.407021 ], [ -96.688082, 46.407880 ], [ -96.688846, 46.409409 ], [ -96.688318, 46.410948 ], [ -96.688941, 46.413134 ], [ -96.694290, 46.414280 ], [ -96.696583, 46.415617 ], [ -96.696869, 46.416859 ], [ -96.696392, 46.418483 ], [ -96.696869, 46.420011 ], [ -96.697920, 46.420680 ], [ -96.701358, 46.420584 ], [ -96.702314, 46.422685 ], [ -96.702314, 46.423832 ], [ -96.701167, 46.426506 ], [ -96.701645, 46.428607 ], [ -96.703078, 46.429467 ], [ -96.706134, 46.429754 ], [ -96.706994, 46.430231 ], [ -96.707471, 46.432715 ], [ -96.709095, 46.435294 ], [ -96.711770, 46.436153 ], [ -96.715495, 46.436153 ], [ -96.718074, 46.438255 ], [ -96.718647, 46.439974 ], [ -96.717967, 46.442021 ], [ -96.716438, 46.444567 ], [ -96.716641, 46.447233 ], [ -96.717119, 46.448093 ], [ -96.718169, 46.448666 ], [ -96.718933, 46.451054 ], [ -96.718551, 46.451913 ], [ -96.715593, 46.453867 ], [ -96.714861, 46.459132 ], [ -96.715557, 46.463232 ], [ -96.717453, 46.464474 ], [ -96.720414, 46.468008 ], [ -96.721274, 46.470014 ], [ -96.720891, 46.471446 ], [ -96.721560, 46.472115 ], [ -96.722420, 46.472784 ], [ -96.724712, 46.473166 ], [ -96.726718, 46.474121 ], [ -96.726914, 46.476432 ], [ -96.735123, 46.478897 ], [ -96.736365, 46.480138 ], [ -96.736270, 46.481380 ], [ -96.735028, 46.483863 ], [ -96.735505, 46.484914 ], [ -96.737129, 46.485965 ], [ -96.737989, 46.487875 ], [ -96.737798, 46.489785 ], [ -96.734570, 46.494254 ], [ -96.733612, 46.497224 ], [ -96.735499, 46.497932 ], [ -96.737702, 46.500770 ], [ -96.735888, 46.504973 ], [ -96.735888, 46.506310 ], [ -96.738562, 46.509366 ], [ -96.736147, 46.513478 ], [ -96.737408, 46.517636 ], [ -96.738475, 46.525793 ], [ -96.742020, 46.529036 ], [ -96.744341, 46.533006 ], [ -96.744341, 46.534630 ], [ -96.742239, 46.536827 ], [ -96.742335, 46.538546 ], [ -96.745009, 46.540457 ], [ -96.745105, 46.541125 ], [ -96.745009, 46.541698 ], [ -96.743003, 46.542940 ], [ -96.742812, 46.543609 ], [ -96.743577, 46.544850 ], [ -96.746347, 46.546283 ], [ -96.744341, 46.550104 ], [ -96.744532, 46.551346 ], [ -96.746824, 46.555071 ], [ -96.748161, 46.556408 ], [ -96.748830, 46.558127 ], [ -96.748161, 46.559847 ], [ -96.746633, 46.560706 ], [ -96.744436, 46.565960 ], [ -96.746442, 46.574078 ], [ -96.748161, 46.575798 ], [ -96.751600, 46.576371 ], [ -96.752746, 46.577517 ], [ -96.753033, 46.578950 ], [ -96.752078, 46.582197 ], [ -96.752746, 46.582770 ], [ -96.755421, 46.582866 ], [ -96.756949, 46.583534 ], [ -96.756662, 46.585827 ], [ -96.757999, 46.586878 ], [ -96.761820, 46.588501 ], [ -96.762393, 46.589743 ], [ -96.761820, 46.592991 ], [ -96.762584, 46.593946 ], [ -96.763865, 46.594595 ], [ -96.766596, 46.597957 ], [ -96.770226, 46.598148 ], [ -96.772446, 46.600129 ], [ -96.772457, 46.601491 ], [ -96.772476, 46.603716 ], [ -96.771802, 46.605742 ], [ -96.772088, 46.606315 ], [ -96.774763, 46.607461 ], [ -96.775622, 46.609276 ], [ -96.774094, 46.613288 ], [ -96.774954, 46.614625 ], [ -96.778488, 46.616153 ], [ -96.778965, 46.617873 ], [ -96.778201, 46.619305 ], [ -96.779061, 46.620834 ], [ -96.783932, 46.621598 ], [ -96.784505, 46.625418 ], [ -96.783837, 46.627329 ], [ -96.784123, 46.628666 ], [ -96.784792, 46.629430 ], [ -96.789950, 46.631531 ], [ -96.791096, 46.633155 ], [ -96.790523, 46.636880 ], [ -96.789572, 46.639079 ], [ -96.789405, 46.641639 ], [ -96.790663, 46.649112 ], [ -96.796767, 46.653363 ], [ -96.798823, 46.658071 ], [ -96.798357, 46.665314 ], [ -96.793914, 46.669212 ], [ -96.792576, 46.672173 ], [ -96.793723, 46.674943 ], [ -96.793340, 46.676854 ], [ -96.792958, 46.677427 ], [ -96.788947, 46.678382 ], [ -96.787801, 46.679815 ], [ -96.788159, 46.681879 ], [ -96.784339, 46.685054 ], [ -96.784205, 46.686768 ], [ -96.785068, 46.687636 ], [ -96.786941, 46.688220 ], [ -96.787801, 46.691181 ], [ -96.786845, 46.692805 ], [ -96.786654, 46.695861 ], [ -96.787801, 46.700446 ], [ -96.790906, 46.702970 ], [ -96.791204, 46.703747 ], [ -96.786184, 46.712840 ], [ -96.784751, 46.720495 ], [ -96.779899, 46.722915 ], [ -96.779252, 46.727429 ], [ -96.779920, 46.729149 ], [ -96.781544, 46.730104 ], [ -96.784279, 46.732993 ], [ -96.781617, 46.737197 ], [ -96.781216, 46.740944 ], [ -96.784601, 46.743094 ], [ -96.785269, 46.746246 ], [ -96.784568, 46.748669 ], [ -96.783455, 46.750353 ], [ -96.783646, 46.753123 ], [ -96.787466, 46.756753 ], [ -96.787466, 46.758472 ], [ -96.786129, 46.760956 ], [ -96.784601, 46.761338 ], [ -96.783646, 46.762579 ], [ -96.785556, 46.764394 ], [ -96.785651, 46.766113 ], [ -96.784314, 46.766973 ], [ -96.784314, 46.767546 ], [ -96.784983, 46.768788 ], [ -96.788612, 46.771271 ], [ -96.789090, 46.773373 ], [ -96.788135, 46.776238 ], [ -96.788803, 46.777575 ], [ -96.792051, 46.778339 ], [ -96.792433, 46.778913 ], [ -96.792624, 46.780632 ], [ -96.791096, 46.783688 ], [ -96.791478, 46.785694 ], [ -96.793102, 46.787700 ], [ -96.796195, 46.789881 ], [ -96.796992, 46.791572 ], [ -96.795756, 46.807795 ], [ -96.796488, 46.808709 ], [ -96.801446, 46.810401 ], [ -96.802544, 46.811521 ], [ -96.802013, 46.812464 ], [ -96.800360, 46.813500 ], [ -96.799336, 46.815436 ], [ -96.800160, 46.819664 ], [ -96.797960, 46.822364 ], [ -96.791559, 46.827864 ], [ -96.789377, 46.827435 ], [ -96.787657, 46.827817 ], [ -96.787275, 46.829059 ], [ -96.789663, 46.832306 ], [ -96.789377, 46.833166 ], [ -96.785365, 46.834025 ], [ -96.783550, 46.835936 ], [ -96.783264, 46.837464 ], [ -96.784028, 46.838897 ], [ -96.783837, 46.840234 ], [ -96.783359, 46.840807 ], [ -96.780398, 46.841189 ], [ -96.779347, 46.842144 ], [ -96.779347, 46.843672 ], [ -96.780207, 46.845392 ], [ -96.779729, 46.847302 ], [ -96.777915, 46.849594 ], [ -96.777915, 46.850741 ], [ -96.779061, 46.851696 ], [ -96.780876, 46.852269 ], [ -96.782022, 46.853415 ], [ -96.781926, 46.856472 ], [ -96.781162, 46.857809 ], [ -96.781067, 46.859146 ], [ -96.781353, 46.860483 ], [ -96.782881, 46.862585 ], [ -96.782881, 46.864590 ], [ -96.780758, 46.867163 ], [ -96.779302, 46.872699 ], [ -96.779258, 46.875963 ], [ -96.780358, 46.877063 ], [ -96.781358, 46.879363 ], [ -96.780358, 46.880163 ], [ -96.775558, 46.879163 ], [ -96.771258, 46.877463 ], [ -96.769758, 46.877563 ], [ -96.768458, 46.879563 ], [ -96.767358, 46.883663 ], [ -96.768058, 46.884763 ], [ -96.769758, 46.884763 ], [ -96.771858, 46.884063 ], [ -96.773558, 46.884763 ], [ -96.776558, 46.895663 ], [ -96.773558, 46.903563 ], [ -96.770458, 46.906763 ], [ -96.767458, 46.905163 ], [ -96.765657, 46.905063 ], [ -96.763557, 46.909463 ], [ -96.763973, 46.912507 ], [ -96.762871, 46.916886 ], [ -96.759241, 46.918223 ], [ -96.759337, 46.919560 ], [ -96.760865, 46.920897 ], [ -96.761343, 46.922234 ], [ -96.760961, 46.923858 ], [ -96.759528, 46.925769 ], [ -96.761725, 46.927297 ], [ -96.762011, 46.928347 ], [ -96.762011, 46.929303 ], [ -96.760292, 46.932073 ], [ -96.760292, 46.933410 ], [ -96.761757, 46.934663 ], [ -96.763257, 46.935063 ], [ -96.775157, 46.930863 ], [ -96.780258, 46.928263 ], [ -96.783120, 46.925482 ], [ -96.785126, 46.925769 ], [ -96.786845, 46.928921 ], [ -96.790380, 46.929398 ], [ -96.791048, 46.929876 ], [ -96.791621, 46.931213 ], [ -96.791558, 46.934264 ], [ -96.790058, 46.937664 ], [ -96.791558, 46.944464 ], [ -96.792863, 46.946018 ], [ -96.797734, 46.946400 ], [ -96.799358, 46.947355 ], [ -96.798758, 46.952988 ], [ -96.799606, 46.954316 ], [ -96.799910, 46.959228 ], [ -96.798737, 46.962399 ], [ -96.799310, 46.964118 ], [ -96.801316, 46.965933 ], [ -96.802749, 46.965933 ], [ -96.809814, 46.963900 ], [ -96.819558, 46.967453 ], [ -96.821852, 46.969372 ], [ -96.822043, 46.971091 ], [ -96.819894, 46.977357 ], [ -96.822566, 46.990141 ], [ -96.824598, 46.993309 ], [ -96.824470, 46.996173 ], [ -96.823189, 46.998026 ], [ -96.823180, 46.999965 ], [ -96.826198, 47.001895 ], [ -96.827489, 47.001611 ], [ -96.831798, 47.004353 ], [ -96.834221, 47.006671 ], [ -96.834603, 47.007721 ], [ -96.834508, 47.008867 ], [ -96.833504, 47.010110 ], [ -96.832303, 47.015184 ], [ -96.833038, 47.016029 ], [ -96.829499, 47.021537 ], [ -96.826358, 47.023205 ], [ -96.819416, 47.024914 ], [ -96.817984, 47.026538 ], [ -96.818557, 47.027780 ], [ -96.821231, 47.029977 ], [ -96.821613, 47.031505 ], [ -96.821422, 47.032842 ], [ -96.818843, 47.034179 ], [ -96.818557, 47.035516 ], [ -96.818748, 47.037618 ], [ -96.820563, 47.039528 ], [ -96.820849, 47.041438 ], [ -96.818843, 47.047074 ], [ -96.819321, 47.052900 ], [ -96.822568, 47.055861 ], [ -96.824479, 47.059682 ], [ -96.824097, 47.061497 ], [ -96.822186, 47.062070 ], [ -96.821327, 47.062930 ], [ -96.821804, 47.064362 ], [ -96.823491, 47.065911 ], [ -96.824097, 47.070666 ], [ -96.823715, 47.071717 ], [ -96.821231, 47.073150 ], [ -96.820849, 47.073818 ], [ -96.821613, 47.076302 ], [ -96.819479, 47.078181 ], [ -96.819078, 47.081152 ], [ -96.820216, 47.082111 ], [ -96.820650, 47.083619 ], [ -96.819034, 47.087573 ], [ -96.820563, 47.089770 ], [ -96.820085, 47.091393 ], [ -96.818366, 47.093304 ], [ -96.818557, 47.097888 ], [ -96.819894, 47.099321 ], [ -96.819990, 47.100849 ], [ -96.818175, 47.104193 ], [ -96.817984, 47.106007 ], [ -96.818843, 47.107154 ], [ -96.821590, 47.108457 ], [ -96.822694, 47.109622 ], [ -96.822192, 47.111679 ], [ -96.820619, 47.113712 ], [ -96.821189, 47.115723 ], [ -96.827344, 47.120144 ], [ -96.827726, 47.121481 ], [ -96.826712, 47.122852 ], [ -96.825440, 47.123354 ], [ -96.824807, 47.124968 ], [ -96.824476, 47.127188 ], [ -96.827631, 47.129504 ], [ -96.828777, 47.131510 ], [ -96.827631, 47.134758 ], [ -96.827631, 47.136572 ], [ -96.828597, 47.139800 ], [ -96.831547, 47.142017 ], [ -96.832407, 47.143736 ], [ -96.830114, 47.146793 ], [ -96.830114, 47.148512 ], [ -96.831069, 47.149467 ], [ -96.831260, 47.150900 ], [ -96.828013, 47.153956 ], [ -96.822706, 47.156229 ], [ -96.822405, 47.156914 ], [ -96.822707, 47.157668 ], [ -96.824670, 47.159019 ], [ -96.824861, 47.159783 ], [ -96.824288, 47.161120 ], [ -96.822377, 47.162744 ], [ -96.822091, 47.165036 ], [ -96.824479, 47.167042 ], [ -96.824288, 47.170863 ], [ -96.825147, 47.172295 ], [ -96.829637, 47.174970 ], [ -96.829828, 47.176307 ], [ -96.829446, 47.177262 ], [ -96.826962, 47.180128 ], [ -96.826676, 47.181561 ], [ -96.826962, 47.182802 ], [ -96.828299, 47.183948 ], [ -96.830401, 47.184617 ], [ -96.831451, 47.185572 ], [ -96.832407, 47.187483 ], [ -96.832502, 47.188342 ], [ -96.831165, 47.190826 ], [ -96.831260, 47.191781 ], [ -96.833075, 47.193596 ], [ -96.836800, 47.195028 ], [ -96.838233, 47.196366 ], [ -96.838806, 47.197894 ], [ -96.838615, 47.199613 ], [ -96.837660, 47.201141 ], [ -96.832789, 47.203911 ], [ -96.832120, 47.204866 ], [ -96.833457, 47.206490 ], [ -96.835177, 47.207445 ], [ -96.835463, 47.208401 ], [ -96.833648, 47.210406 ], [ -96.833362, 47.211457 ], [ -96.833553, 47.212794 ], [ -96.836514, 47.216137 ], [ -96.835654, 47.219289 ], [ -96.835941, 47.221009 ], [ -96.838329, 47.222059 ], [ -96.839284, 47.223874 ], [ -96.838806, 47.225020 ], [ -96.835654, 47.226549 ], [ -96.835654, 47.227217 ], [ -96.837374, 47.229254 ], [ -96.837564, 47.231802 ], [ -96.836036, 47.233999 ], [ -96.833362, 47.235050 ], [ -96.832693, 47.236196 ], [ -96.832946, 47.237588 ], [ -96.837660, 47.240876 ], [ -96.838233, 47.241831 ], [ -96.838233, 47.242882 ], [ -96.837278, 47.244219 ], [ -96.834890, 47.246416 ], [ -96.834699, 47.248135 ], [ -96.835368, 47.250428 ], [ -96.840143, 47.253102 ], [ -96.840525, 47.253866 ], [ -96.839857, 47.255490 ], [ -96.840048, 47.256159 ], [ -96.841672, 47.258164 ], [ -96.841003, 47.259215 ], [ -96.840717, 47.261221 ], [ -96.841290, 47.262463 ], [ -96.842531, 47.262845 ], [ -96.842627, 47.263991 ], [ -96.842054, 47.265328 ], [ -96.839857, 47.265997 ], [ -96.838997, 47.267716 ], [ -96.839761, 47.268767 ], [ -96.842531, 47.269531 ], [ -96.843200, 47.270486 ], [ -96.842245, 47.273351 ], [ -96.840353, 47.275496 ], [ -96.840220, 47.276981 ], [ -96.841465, 47.284041 ], [ -96.844088, 47.289981 ], [ -96.843922, 47.293020 ], [ -96.832884, 47.304490 ], [ -96.832884, 47.307069 ], [ -96.835735, 47.310843 ], [ -96.837045, 47.311391 ], [ -96.841003, 47.311558 ], [ -96.842531, 47.312418 ], [ -96.841958, 47.316907 ], [ -96.841194, 47.317575 ], [ -96.836991, 47.318817 ], [ -96.836036, 47.320059 ], [ -96.835845, 47.321014 ], [ -96.836609, 47.323975 ], [ -96.835177, 47.326267 ], [ -96.835177, 47.328560 ], [ -96.836036, 47.329706 ], [ -96.838329, 47.331043 ], [ -96.838520, 47.332380 ], [ -96.835845, 47.335914 ], [ -96.836609, 47.338684 ], [ -96.840586, 47.340956 ], [ -96.844012, 47.346182 ], [ -96.845158, 47.349430 ], [ -96.843439, 47.354397 ], [ -96.844298, 47.356021 ], [ -96.846877, 47.356785 ], [ -96.848119, 47.358026 ], [ -96.849265, 47.359841 ], [ -96.849456, 47.363662 ], [ -96.852417, 47.366241 ], [ -96.852226, 47.367291 ], [ -96.849552, 47.368247 ], [ -96.848597, 47.369584 ], [ -96.848907, 47.370565 ], [ -96.852035, 47.371876 ], [ -96.853754, 47.373405 ], [ -96.852676, 47.374973 ], [ -96.848931, 47.375363 ], [ -96.846925, 47.376891 ], [ -96.845588, 47.381571 ], [ -96.841099, 47.384150 ], [ -96.840621, 47.389881 ], [ -96.840717, 47.391314 ], [ -96.841767, 47.392460 ], [ -96.845492, 47.394179 ], [ -96.845874, 47.396185 ], [ -96.844919, 47.399815 ], [ -96.845110, 47.400483 ], [ -96.848071, 47.403158 ], [ -96.852739, 47.405909 ], [ -96.852656, 47.407647 ], [ -96.853325, 47.408889 ], [ -96.858094, 47.410317 ], [ -96.861833, 47.414337 ], [ -96.862070, 47.415159 ], [ -96.861095, 47.417056 ], [ -96.861231, 47.417810 ], [ -96.863593, 47.418775 ], [ -96.864261, 47.419539 ], [ -96.864261, 47.420972 ], [ -96.862924, 47.422309 ], [ -96.859581, 47.424028 ], [ -96.858721, 47.426129 ], [ -96.860632, 47.427658 ], [ -96.861014, 47.428995 ], [ -96.860823, 47.430237 ], [ -96.858530, 47.433389 ], [ -96.860059, 47.435681 ], [ -96.859772, 47.437209 ], [ -96.857480, 47.440457 ], [ -96.857480, 47.441603 ], [ -96.859537, 47.445662 ], [ -96.859239, 47.451557 ], [ -96.858244, 47.453351 ], [ -96.858148, 47.454498 ], [ -96.859677, 47.456026 ], [ -96.859963, 47.457363 ], [ -96.859581, 47.458700 ], [ -96.857480, 47.460229 ], [ -96.856811, 47.463190 ], [ -96.859555, 47.466865 ], [ -96.859868, 47.470926 ], [ -96.859103, 47.472837 ], [ -96.855856, 47.475702 ], [ -96.854710, 47.478281 ], [ -96.854996, 47.479618 ], [ -96.858148, 47.481624 ], [ -96.858530, 47.482484 ], [ -96.858530, 47.483917 ], [ -96.857957, 47.484681 ], [ -96.856142, 47.485540 ], [ -96.855665, 47.487260 ], [ -96.855856, 47.488310 ], [ -96.858530, 47.489934 ], [ -96.858530, 47.490889 ], [ -96.857957, 47.492513 ], [ -96.857002, 47.493468 ], [ -96.851653, 47.497098 ], [ -96.851844, 47.499390 ], [ -96.853317, 47.501322 ], [ -96.853286, 47.503881 ], [ -96.853052, 47.506828 ], [ -96.851749, 47.507891 ], [ -96.851367, 47.509037 ], [ -96.851749, 47.510088 ], [ -96.853181, 47.511425 ], [ -96.853468, 47.513813 ], [ -96.854204, 47.514368 ], [ -96.858454, 47.514892 ], [ -96.861422, 47.515873 ], [ -96.863245, 47.517266 ], [ -96.863551, 47.520304 ], [ -96.866363, 47.524893 ], [ -96.866363, 47.525944 ], [ -96.864739, 47.527663 ], [ -96.862379, 47.529055 ], [ -96.860524, 47.529536 ], [ -96.854710, 47.535973 ], [ -96.855092, 47.537310 ], [ -96.856429, 47.538456 ], [ -96.856716, 47.540271 ], [ -96.854614, 47.542850 ], [ -96.854232, 47.544665 ], [ -96.854423, 47.545333 ], [ -96.856429, 47.546957 ], [ -96.856620, 47.548103 ], [ -96.856238, 47.548963 ], [ -96.854328, 47.550491 ], [ -96.853755, 47.552497 ], [ -96.855092, 47.554598 ], [ -96.858002, 47.556578 ], [ -96.859057, 47.558591 ], [ -96.859153, 47.559741 ], [ -96.857427, 47.561658 ], [ -96.856852, 47.563288 ], [ -96.857236, 47.564055 ], [ -96.858673, 47.564534 ], [ -96.859153, 47.566355 ], [ -96.858769, 47.567410 ], [ -96.856661, 47.567889 ], [ -96.853689, 47.570381 ], [ -96.854073, 47.572010 ], [ -96.855894, 47.573352 ], [ -96.856373, 47.575749 ], [ -96.853273, 47.579483 ], [ -96.851293, 47.589264 ], [ -96.851964, 47.591469 ], [ -96.854743, 47.594728 ], [ -96.854456, 47.596261 ], [ -96.853114, 47.596836 ], [ -96.852826, 47.597891 ], [ -96.853785, 47.599808 ], [ -96.855618, 47.600890 ], [ -96.856903, 47.602329 ], [ -96.854812, 47.606328 ], [ -96.855421, 47.608750 ], [ -96.857112, 47.610760 ], [ -96.860255, 47.612175 ], [ -96.873671, 47.613654 ], [ -96.874078, 47.614774 ], [ -96.871005, 47.616832 ], [ -96.870600, 47.617563 ], [ -96.870871, 47.618042 ], [ -96.876355, 47.619181 ], [ -96.879496, 47.620576 ], [ -96.882393, 47.633489 ], [ -96.888573, 47.638450 ], [ -96.888166, 47.639730 ], [ -96.884515, 47.640755 ], [ -96.882857, 47.641714 ], [ -96.882376, 47.649025 ], [ -96.882882, 47.650168 ], [ -96.886970, 47.653049 ], [ -96.887607, 47.658853 ], [ -96.885710, 47.661547 ], [ -96.885573, 47.663443 ], [ -96.887126, 47.666369 ], [ -96.889627, 47.668587 ], [ -96.889726, 47.670643 ], [ -96.891922, 47.673157 ], [ -96.895271, 47.673570 ], [ -96.896724, 47.674758 ], [ -96.899352, 47.689473 ], [ -96.900264, 47.690775 ], [ -96.901719, 47.691621 ], [ -96.902971, 47.691576 ], [ -96.905273, 47.689246 ], [ -96.907236, 47.688493 ], [ -96.908928, 47.688722 ], [ -96.909909, 47.689522 ], [ -96.910144, 47.691235 ], [ -96.907266, 47.693976 ], [ -96.907604, 47.695119 ], [ -96.909769, 47.697313 ], [ -96.911527, 47.700512 ], [ -96.912846, 47.701746 ], [ -96.913762, 47.701468 ], [ -96.915242, 47.702369 ], [ -96.915242, 47.703527 ], [ -96.914405, 47.704814 ], [ -96.914856, 47.707003 ], [ -96.915500, 47.707968 ], [ -96.920119, 47.710383 ], [ -96.920321, 47.712394 ], [ -96.919811, 47.714339 ], [ -96.920391, 47.716527 ], [ -96.923544, 47.718201 ], [ -96.923480, 47.719809 ], [ -96.919471, 47.722515 ], [ -96.918556, 47.723863 ], [ -96.919131, 47.724731 ], [ -96.925089, 47.729051 ], [ -96.930574, 47.734352 ], [ -96.932809, 47.737139 ], [ -96.933316, 47.738716 ], [ -96.933011, 47.739949 ], [ -96.929319, 47.742988 ], [ -96.928506, 47.744884 ], [ -96.928505, 47.748037 ], [ -96.929051, 47.750331 ], [ -96.934173, 47.752412 ], [ -96.934463, 47.752956 ], [ -96.934209, 47.754517 ], [ -96.932648, 47.755315 ], [ -96.932684, 47.756804 ], [ -96.935555, 47.758276 ], [ -96.937859, 47.760195 ], [ -96.938435, 47.762411 ], [ -96.936909, 47.764536 ], [ -96.939179, 47.768397 ], [ -96.949585, 47.775228 ], [ -96.956635, 47.776188 ], [ -96.956501, 47.779798 ], [ -96.961926, 47.783292 ], [ -96.964400, 47.782995 ], [ -96.965316, 47.783474 ], [ -96.965350, 47.784937 ], [ -96.963521, 47.787290 ], [ -96.961554, 47.788707 ], [ -96.957283, 47.790147 ], [ -96.957216, 47.790970 ], [ -96.957860, 47.792021 ], [ -96.963523, 47.794601 ], [ -96.966068, 47.797297 ], [ -96.971698, 47.798255 ], [ -96.973585, 47.797884 ], [ -96.975131, 47.798326 ], [ -96.976088, 47.799577 ], [ -96.976176, 47.801544 ], [ -96.980579, 47.805614 ], [ -96.981168, 47.806792 ], [ -96.980947, 47.808337 ], [ -96.978894, 47.809882 ], [ -96.977946, 47.811619 ], [ -96.980391, 47.815662 ], [ -96.980726, 47.820411 ], [ -96.980137, 47.821441 ], [ -96.979327, 47.821809 ], [ -96.979327, 47.824533 ], [ -96.981683, 47.825785 ], [ -96.982272, 47.826668 ], [ -96.981725, 47.830421 ], [ -96.986685, 47.837639 ], [ -96.992963, 47.837911 ], [ -96.998295, 47.841724 ], [ -96.997890, 47.843163 ], [ -96.996364, 47.844398 ], [ -96.996816, 47.854405 ], [ -96.998144, 47.858882 ], [ -97.000356, 47.860915 ], [ -97.001759, 47.861266 ], [ -97.005557, 47.863977 ], [ -97.005857, 47.865277 ], [ -97.003356, 47.865877 ], [ -97.001556, 47.867377 ], [ -97.002456, 47.868677 ], [ -97.005356, 47.870177 ], [ -97.017356, 47.871578 ], [ -97.021256, 47.872578 ], [ -97.023156, 47.873978 ], [ -97.023156, 47.874978 ], [ -97.018955, 47.876878 ], [ -97.017955, 47.878478 ], [ -97.019355, 47.880278 ], [ -97.023355, 47.882078 ], [ -97.025355, 47.884278 ], [ -97.024955, 47.886878 ], [ -97.019155, 47.889778 ], [ -97.018955, 47.891078 ], [ -97.024955, 47.894978 ], [ -97.023955, 47.898078 ], [ -97.020155, 47.900478 ], [ -97.020255, 47.902178 ], [ -97.024155, 47.905278 ], [ -97.024955, 47.908178 ], [ -97.023555, 47.908478 ], [ -97.020355, 47.906378 ], [ -97.017254, 47.905678 ], [ -97.015054, 47.907178 ], [ -97.015354, 47.910278 ], [ -97.017254, 47.913078 ], [ -97.023754, 47.915878 ], [ -97.018054, 47.918078 ], [ -97.017754, 47.919778 ], [ -97.029654, 47.927578 ], [ -97.035754, 47.930179 ], [ -97.037354, 47.933279 ], [ -97.035554, 47.936579 ], [ -97.036054, 47.939379 ], [ -97.039154, 47.940479 ], [ -97.044954, 47.941079 ], [ -97.051054, 47.943379 ], [ -97.054554, 47.946279 ], [ -97.055554, 47.949079 ], [ -97.055154, 47.950779 ], [ -97.052554, 47.954779 ], [ -97.052454, 47.957179 ], [ -97.054054, 47.959679 ], [ -97.059054, 47.962080 ], [ -97.061454, 47.963580 ], [ -97.061854, 47.964480 ], [ -97.061554, 47.965880 ], [ -97.057854, 47.968980 ], [ -97.057153, 47.970480 ], [ -97.059353, 47.973980 ], [ -97.059153, 47.975380 ], [ -97.056481, 47.980556 ], [ -97.053537, 47.987948 ], [ -97.053089, 47.990252 ], [ -97.053553, 47.991612 ], [ -97.054945, 47.992924 ], [ -97.062257, 47.995948 ], [ -97.064289, 47.998508 ], [ -97.066762, 48.009558 ], [ -97.065411, 48.011337 ], [ -97.063012, 48.013179 ], [ -97.063289, 48.014989 ], [ -97.064927, 48.015658 ], [ -97.069284, 48.016176 ], [ -97.070654, 48.016918 ], [ -97.072239, 48.019107 ], [ -97.071911, 48.021395 ], [ -97.068987, 48.026267 ], [ -97.068711, 48.027694 ], [ -97.070411, 48.041765 ], [ -97.072257, 48.048068 ], [ -97.074015, 48.051212 ], [ -97.075641, 48.052725 ], [ -97.082895, 48.055794 ], [ -97.086986, 48.058222 ], [ -97.097772, 48.071080 ], [ -97.103052, 48.071669 ], [ -97.104483, 48.072428 ], [ -97.104697, 48.073094 ], [ -97.104154, 48.074578 ], [ -97.100771, 48.077452 ], [ -97.099431, 48.082106 ], [ -97.099798, 48.085884 ], [ -97.102165, 48.089122 ], [ -97.105226, 48.090440 ], [ -97.105616, 48.091362 ], [ -97.105475, 48.092780 ], [ -97.103879, 48.094517 ], [ -97.103950, 48.096184 ], [ -97.104872, 48.097851 ], [ -97.108428, 48.099824 ], [ -97.109535, 48.104723 ], [ -97.111470, 48.105913 ], [ -97.113194, 48.106188 ], [ -97.119773, 48.105381 ], [ -97.123205, 48.106648 ], [ -97.123666, 48.108004 ], [ -97.123135, 48.109497 ], [ -97.121040, 48.112281 ], [ -97.120592, 48.113365 ], [ -97.120702, 48.114987 ], [ -97.121586, 48.116925 ], [ -97.126862, 48.124277 ], [ -97.128279, 48.127185 ], [ -97.129453, 48.133133 ], [ -97.132176, 48.135829 ], [ -97.132520, 48.137641 ], [ -97.131956, 48.139563 ], [ -97.134299, 48.141833 ], [ -97.141401, 48.143590 ], [ -97.142133, 48.144981 ], [ -97.142279, 48.148056 ], [ -97.140295, 48.150894 ], [ -97.139497, 48.153108 ], [ -97.138911, 48.155304 ], [ -97.138911, 48.157793 ], [ -97.139643, 48.159111 ], [ -97.141950, 48.160202 ], [ -97.144242, 48.162490 ], [ -97.146745, 48.168556 ], [ -97.146672, 48.171484 ], [ -97.145243, 48.174046 ], [ -97.142352, 48.176609 ], [ -97.141620, 48.177781 ], [ -97.141474, 48.179099 ], [ -97.141840, 48.181734 ], [ -97.142938, 48.182686 ], [ -97.144622, 48.183199 ], [ -97.146013, 48.184590 ], [ -97.146233, 48.186054 ], [ -97.141518, 48.192518 ], [ -97.141233, 48.193602 ], [ -97.138007, 48.197587 ], [ -97.139131, 48.202820 ], [ -97.138765, 48.204650 ], [ -97.137740, 48.206188 ], [ -97.134738, 48.207506 ], [ -97.134372, 48.210434 ], [ -97.137006, 48.212537 ], [ -97.137407, 48.215245 ], [ -97.135177, 48.217243 ], [ -97.135201, 48.219156 ], [ -97.135617, 48.220904 ], [ -97.137522, 48.221713 ], [ -97.138154, 48.223104 ], [ -97.137690, 48.225126 ], [ -97.136304, 48.226176 ], [ -97.136003, 48.228082 ], [ -97.136304, 48.228984 ], [ -97.139311, 48.230187 ], [ -97.140815, 48.232032 ], [ -97.141254, 48.234668 ], [ -97.139790, 48.235913 ], [ -97.135763, 48.237596 ], [ -97.135617, 48.238988 ], [ -97.138618, 48.242429 ], [ -97.138765, 48.244991 ], [ -97.138033, 48.246236 ], [ -97.133434, 48.249873 ], [ -97.129384, 48.250429 ], [ -97.127967, 48.251474 ], [ -97.127276, 48.253323 ], [ -97.127594, 48.254383 ], [ -97.129235, 48.256398 ], [ -97.129533, 48.257815 ], [ -97.129384, 48.258785 ], [ -97.127146, 48.260874 ], [ -97.127146, 48.262889 ], [ -97.128551, 48.264816 ], [ -97.130951, 48.265276 ], [ -97.131921, 48.266023 ], [ -97.131846, 48.267589 ], [ -97.130280, 48.269305 ], [ -97.125348, 48.270452 ], [ -97.124080, 48.271250 ], [ -97.116570, 48.279661 ], [ -97.116717, 48.281246 ], [ -97.117726, 48.283488 ], [ -97.122160, 48.290056 ], [ -97.125348, 48.291855 ], [ -97.127236, 48.291827 ], [ -97.128862, 48.292882 ], [ -97.129086, 48.295792 ], [ -97.128638, 48.297657 ], [ -97.127295, 48.298478 ], [ -97.123341, 48.298627 ], [ -97.122520, 48.299299 ], [ -97.122072, 48.300865 ], [ -97.122296, 48.301388 ], [ -97.126176, 48.303701 ], [ -97.126176, 48.309147 ], [ -97.127146, 48.310192 ], [ -97.130951, 48.311609 ], [ -97.131921, 48.312728 ], [ -97.132443, 48.315489 ], [ -97.131697, 48.318324 ], [ -97.131250, 48.319543 ], [ -97.129826, 48.320516 ], [ -97.127601, 48.323319 ], [ -97.127436, 48.325709 ], [ -97.127766, 48.326781 ], [ -97.131227, 48.327935 ], [ -97.133751, 48.327847 ], [ -97.134772, 48.328677 ], [ -97.134854, 48.331314 ], [ -97.131969, 48.335518 ], [ -97.131145, 48.339722 ], [ -97.131722, 48.341123 ], [ -97.137904, 48.344585 ], [ -97.138481, 48.347470 ], [ -97.137492, 48.350602 ], [ -97.137822, 48.352003 ], [ -97.139851, 48.353425 ], [ -97.143861, 48.354503 ], [ -97.147748, 48.359905 ], [ -97.147748, 48.366959 ], [ -97.147356, 48.368723 ], [ -97.146376, 48.370290 ], [ -97.144221, 48.371270 ], [ -97.142066, 48.374209 ], [ -97.140106, 48.380479 ], [ -97.140106, 48.382242 ], [ -97.140890, 48.384006 ], [ -97.143633, 48.386161 ], [ -97.145201, 48.388904 ], [ -97.145592, 48.394195 ], [ -97.145201, 48.395566 ], [ -97.143829, 48.397134 ], [ -97.140106, 48.399289 ], [ -97.135795, 48.404187 ], [ -97.135012, 48.406735 ], [ -97.135600, 48.411829 ], [ -97.138343, 48.415944 ], [ -97.142457, 48.416727 ], [ -97.142849, 48.419471 ], [ -97.142066, 48.420450 ], [ -97.136971, 48.422018 ], [ -97.135600, 48.424369 ], [ -97.135600, 48.426524 ], [ -97.137813, 48.428056 ], [ -97.139173, 48.430528 ], [ -97.139296, 48.432011 ], [ -97.136206, 48.434606 ], [ -97.134970, 48.436337 ], [ -97.134229, 48.439797 ], [ -97.135094, 48.442269 ], [ -97.137319, 48.443505 ], [ -97.137689, 48.444247 ], [ -97.137689, 48.447583 ], [ -97.137072, 48.449067 ], [ -97.133611, 48.452280 ], [ -97.132622, 48.456482 ], [ -97.132746, 48.459942 ], [ -97.134229, 48.461178 ], [ -97.141768, 48.464021 ], [ -97.143127, 48.466246 ], [ -97.144116, 48.469212 ], [ -97.143745, 48.473661 ], [ -97.142015, 48.474650 ], [ -97.141397, 48.476256 ], [ -97.142757, 48.477987 ], [ -97.144611, 48.478975 ], [ -97.144981, 48.481571 ], [ -97.143869, 48.482930 ], [ -97.140291, 48.484722 ], [ -97.139276, 48.486310 ], [ -97.138864, 48.494362 ], [ -97.140347, 48.496834 ], [ -97.146279, 48.499677 ], [ -97.147638, 48.501531 ], [ -97.148133, 48.503384 ], [ -97.153076, 48.524148 ], [ -97.151964, 48.529215 ], [ -97.149122, 48.532305 ], [ -97.148874, 48.534282 ], [ -97.150481, 48.536877 ], [ -97.153942, 48.539102 ], [ -97.159697, 48.541339 ], [ -97.163105, 48.543855 ], [ -97.162717, 48.546765 ], [ -97.162099, 48.548124 ], [ -97.160863, 48.549236 ], [ -97.155791, 48.551173 ], [ -97.153447, 48.551214 ], [ -97.152459, 48.552326 ], [ -97.152211, 48.553933 ], [ -97.153942, 48.556034 ], [ -97.156413, 48.557146 ], [ -97.158267, 48.558753 ], [ -97.158762, 48.560112 ], [ -97.158638, 48.564067 ], [ -97.157402, 48.565921 ], [ -97.151638, 48.567630 ], [ -97.149616, 48.569876 ], [ -97.148998, 48.571977 ], [ -97.148874, 48.575067 ], [ -97.149616, 48.576921 ], [ -97.149740, 48.579516 ], [ -97.148429, 48.581028 ], [ -97.144922, 48.581452 ], [ -97.143654, 48.582358 ], [ -97.142915, 48.583733 ], [ -97.141585, 48.590820 ], [ -97.142237, 48.592595 ], [ -97.143931, 48.594594 ], [ -97.143684, 48.597066 ], [ -97.142818, 48.598425 ], [ -97.140841, 48.600032 ], [ -97.138246, 48.604234 ], [ -97.137380, 48.607324 ], [ -97.138246, 48.609301 ], [ -97.137504, 48.612268 ], [ -97.136145, 48.613256 ], [ -97.132931, 48.613380 ], [ -97.131448, 48.613998 ], [ -97.130707, 48.616593 ], [ -97.131325, 48.619065 ], [ -97.130089, 48.621166 ], [ -97.125639, 48.620919 ], [ -97.124774, 48.621537 ], [ -97.124033, 48.623267 ], [ -97.124175, 48.625387 ], [ -97.125887, 48.626975 ], [ -97.125887, 48.629076 ], [ -97.125269, 48.629694 ], [ -97.120819, 48.631053 ], [ -97.115043, 48.629821 ], [ -97.111559, 48.630266 ], [ -97.109515, 48.631453 ], [ -97.108466, 48.632658 ], [ -97.108276, 48.634396 ], [ -97.109651, 48.638888 ], [ -97.111921, 48.642918 ], [ -97.111179, 48.644525 ], [ -97.107814, 48.647728 ], [ -97.105910, 48.652632 ], [ -97.104566, 48.654416 ], [ -97.101790, 48.656294 ], [ -97.100551, 48.658614 ], [ -97.100674, 48.661951 ], [ -97.102652, 48.664793 ], [ -97.101539, 48.666771 ], [ -97.100009, 48.667926 ], [ -97.099811, 48.671377 ], [ -97.100674, 48.679624 ], [ -97.100056, 48.681355 ], [ -97.097708, 48.683950 ], [ -97.097337, 48.685186 ], [ -97.097584, 48.686298 ], [ -97.098697, 48.687534 ], [ -97.108655, 48.691484 ], [ -97.118286, 48.700573 ], [ -97.119027, 48.703292 ], [ -97.116926, 48.705022 ], [ -97.116185, 48.709348 ], [ -97.121253, 48.713593 ], [ -97.124328, 48.719166 ], [ -97.126398, 48.721101 ], [ -97.134229, 48.725167 ], [ -97.135588, 48.726403 ], [ -97.136083, 48.727763 ], [ -97.135094, 48.729740 ], [ -97.134847, 48.733324 ], [ -97.135341, 48.734560 ], [ -97.138996, 48.736654 ], [ -97.139611, 48.738129 ], [ -97.139488, 48.746611 ], [ -97.143176, 48.750913 ], [ -97.150060, 48.754724 ], [ -97.151043, 48.755707 ], [ -97.151289, 48.757428 ], [ -97.147478, 48.763698 ], [ -97.147478, 48.766033 ], [ -97.152588, 48.772602 ], [ -97.153871, 48.773286 ], [ -97.154854, 48.774515 ], [ -97.155223, 48.775499 ], [ -97.154854, 48.776728 ], [ -97.153871, 48.777712 ], [ -97.153256, 48.781031 ], [ -97.154116, 48.781891 ], [ -97.157067, 48.783120 ], [ -97.157804, 48.784104 ], [ -97.157797, 48.787680 ], [ -97.157093, 48.790024 ], [ -97.158102, 48.791145 ], [ -97.161231, 48.791778 ], [ -97.162959, 48.792930 ], [ -97.163535, 48.795070 ], [ -97.163699, 48.799513 ], [ -97.165921, 48.803792 ], [ -97.165921, 48.805273 ], [ -97.164874, 48.807129 ], [ -97.164874, 48.808253 ], [ -97.165624, 48.809627 ], [ -97.168497, 48.811002 ], [ -97.174045, 48.812108 ], [ -97.177045, 48.814124 ], [ -97.178611, 48.815839 ], [ -97.180028, 48.818450 ], [ -97.177747, 48.824815 ], [ -97.180991, 48.828992 ], [ -97.181116, 48.832741 ], [ -97.180366, 48.834365 ], [ -97.175727, 48.836158 ], [ -97.174275, 48.837261 ], [ -97.173811, 48.838309 ], [ -97.174355, 48.842619 ], [ -97.177243, 48.846483 ], [ -97.176993, 48.847733 ], [ -97.175618, 48.849857 ], [ -97.175618, 48.853105 ], [ -97.179071, 48.856866 ], [ -97.180116, 48.861601 ], [ -97.182365, 48.863725 ], [ -97.185488, 48.864849 ], [ -97.187113, 48.866098 ], [ -97.187362, 48.867598 ], [ -97.185738, 48.872220 ], [ -97.186238, 48.873470 ], [ -97.187737, 48.874594 ], [ -97.190486, 48.875594 ], [ -97.197982, 48.880341 ], [ -97.198857, 48.882215 ], [ -97.197982, 48.884839 ], [ -97.197857, 48.886838 ], [ -97.199981, 48.891086 ], [ -97.198107, 48.893959 ], [ -97.197982, 48.898332 ], [ -97.198857, 48.899831 ], [ -97.207688, 48.902629 ], [ -97.210541, 48.904390 ], [ -97.212706, 48.908143 ], [ -97.212553, 48.909860 ], [ -97.210809, 48.913950 ], [ -97.211161, 48.916649 ], [ -97.212926, 48.918033 ], [ -97.217992, 48.919735 ], [ -97.219095, 48.922078 ], [ -97.219185, 48.924860 ], [ -97.217463, 48.927659 ], [ -97.217549, 48.929892 ], [ -97.218666, 48.931781 ], [ -97.224505, 48.934100 ], [ -97.226394, 48.938651 ], [ -97.226823, 48.943545 ], [ -97.227854, 48.945864 ], [ -97.232147, 48.948955 ], [ -97.232319, 48.950501 ], [ -97.230859, 48.958229 ], [ -97.230859, 48.960891 ], [ -97.231460, 48.962437 ], [ -97.232491, 48.963897 ], [ -97.237541, 48.965341 ], [ -97.238882, 48.966573 ], [ -97.239209, 48.968684 ], [ -97.238025, 48.975143 ], [ -97.238387, 48.982631 ], [ -97.237297, 48.985696 ], [ -97.234214, 48.988966 ], [ -97.230833, 48.991303 ], [ -97.230403, 48.993366 ], [ -97.231490, 48.995995 ], [ -97.231397, 48.997212 ], [ -97.229039, 49.000687 ], [ -96.930960, 48.999984 ], [ -95.975390, 48.999984 ], [ -95.368698, 48.998729 ], [ -95.355819, 48.998735 ], [ -95.340962, 48.998740 ], [ -95.322946, 48.998767 ], [ -95.153711, 48.998903 ], [ -95.153309, 49.184880 ], [ -95.153424, 49.249995 ], [ -95.153333, 49.305655 ], [ -95.153319, 49.307720 ], [ -95.153331, 49.308442 ], [ -95.153330, 49.309287 ], [ -95.153284, 49.343409 ], [ -95.153344, 49.343662 ], [ -95.153407, 49.354397 ], [ -95.153330, 49.365886 ], [ -95.153259, 49.367691 ], [ -95.153293, 49.369107 ], [ -95.153350, 49.383079 ], [ -95.153314, 49.384358 ], [ -95.150235, 49.382964 ], [ -95.149747, 49.380565 ], [ -95.145306, 49.378280 ], [ -95.141808, 49.378301 ], [ -95.126467, 49.369439 ], [ -95.115866, 49.366518 ], [ -95.109535, 49.366315 ], [ -95.105057, 49.364962 ], [ -95.102818, 49.363554 ], [ -95.089806, 49.361114 ], [ -95.058404, 49.353170 ], [ -95.049382, 49.353056 ], [ -95.014415, 49.356405 ], [ -94.988908, 49.368897 ], [ -94.974286, 49.367738 ], [ -94.957465, 49.370186 ], [ -94.952111, 49.368679 ], [ -94.909273, 49.350176 ], [ -94.907036, 49.348508 ], [ -94.878454, 49.333193 ], [ -94.854245, 49.324154 ], [ -94.836876, 49.324068 ], [ -94.816222, 49.320987 ], [ -94.824291, 49.308834 ], [ -94.825160, 49.294283 ], [ -94.797244, 49.214284 ], [ -94.797527, 49.197791 ], [ -94.774228, 49.124994 ], [ -94.773223, 49.120733 ], [ -94.750221, 49.099763 ], [ -94.750218, 48.999992 ], [ -94.718932, 48.999991 ], [ -94.683069, 48.883929 ], [ -94.683127, 48.883376 ], [ -94.684217, 48.872399 ], [ -94.692527, 48.868950 ], [ -94.690302, 48.863711 ], [ -94.690246, 48.863363 ], [ -94.693044, 48.853392 ], [ -94.685681, 48.840119 ], [ -94.697055, 48.835731 ], [ -94.701968, 48.831778 ], [ -94.704284, 48.824284 ], [ -94.694974, 48.809206 ], [ -94.695975, 48.799771 ], [ -94.694312, 48.789352 ], [ -94.690889, 48.778066 ], [ -94.690863, 48.778047 ], [ -94.687951, 48.775896 ], [ -94.672812, 48.769315 ], [ -94.667110, 48.766115 ], [ -94.660063, 48.760288 ], [ -94.651765, 48.755913 ], [ -94.645164, 48.749975 ], [ -94.646256, 48.749975 ], [ -94.645150, 48.748991 ], [ -94.645083, 48.744143 ], [ -94.640803, 48.741171 ], [ -94.619010, 48.737374 ], [ -94.610539, 48.731893 ], [ -94.601384, 48.728356 ], [ -94.595855, 48.724222 ], [ -94.591018, 48.719494 ], [ -94.587150, 48.717599 ], [ -94.568368, 48.715522 ], [ -94.555835, 48.716207 ], [ -94.549069, 48.714653 ], [ -94.545514, 48.712185 ], [ -94.538372, 48.702840 ], [ -94.533057, 48.701262 ], [ -94.524600, 48.701556 ], [ -94.508862, 48.700362 ], [ -94.500203, 48.698175 ], [ -94.486503, 48.698054 ], [ -94.472938, 48.696849 ], [ -94.464481, 48.695503 ], [ -94.452332, 48.692444 ], [ -94.446604, 48.692900 ], [ -94.438701, 48.694889 ], [ -94.424203, 48.705352 ], [ -94.421405, 48.708756 ], [ -94.418919, 48.710172 ], [ -94.416191, 48.710948 ], [ -94.406318, 48.710535 ], [ -94.388848, 48.711945 ], [ -94.384221, 48.711806 ], [ -94.378216, 48.710272 ], [ -94.368583, 48.706434 ], [ -94.353046, 48.704132 ], [ -94.342758, 48.703382 ], [ -94.328434, 48.704481 ], [ -94.308446, 48.710239 ], [ -94.290737, 48.707747 ], [ -94.281797, 48.705255 ], [ -94.274345, 48.699882 ], [ -94.264473, 48.698919 ], [ -94.260541, 48.696381 ], [ -94.258130, 48.691834 ], [ -94.252753, 48.686325 ], [ -94.251169, 48.683514 ], [ -94.250623, 48.678236 ], [ -94.254643, 48.663888 ], [ -94.254577, 48.661375 ], [ -94.250497, 48.656654 ], [ -94.250191, 48.656323 ], [ -94.246841, 48.654224 ], [ -94.244394, 48.653442 ], [ -94.233575, 48.652336 ], [ -94.224276, 48.649527 ], [ -94.214448, 48.649382 ], [ -94.199517, 48.650996 ], [ -94.188581, 48.650402 ], [ -94.167725, 48.648104 ], [ -94.157387, 48.645766 ], [ -94.138682, 48.645714 ], [ -94.126336, 48.644447 ], [ -94.110031, 48.644192 ], [ -94.099898, 48.645863 ], [ -94.091244, 48.643669 ], [ -94.076675, 48.644203 ], [ -94.071357, 48.645895 ], [ -94.065775, 48.646104 ], [ -94.064243, 48.643717 ], [ -94.060267, 48.643115 ], [ -94.052452, 48.644020 ], [ -94.043187, 48.643416 ], [ -94.035616, 48.641018 ], [ -94.029491, 48.640861 ], [ -94.006933, 48.643193 ], [ -94.000675, 48.642777 ], [ -93.990082, 48.639738 ], [ -93.976535, 48.637573 ], [ -93.963375, 48.637151 ], [ -93.960632, 48.636496 ], [ -93.954413, 48.633744 ], [ -93.944221, 48.632294 ], [ -93.927004, 48.631220 ], [ -93.916649, 48.632156 ], [ -93.915494, 48.632667 ], [ -93.914357, 48.634320 ], [ -93.911530, 48.634673 ], [ -93.886934, 48.630779 ], [ -93.851618, 48.630108 ], [ -93.844008, 48.629395 ], [ -93.840754, 48.628548 ], [ -93.837392, 48.627098 ], [ -93.834323, 48.624954 ], [ -93.827959, 48.613001 ], [ -93.824144, 48.610724 ], [ -93.822644, 48.609067 ], [ -93.820067, 48.603755 ], [ -93.818518, 48.595314 ], [ -93.812037, 48.584944 ], [ -93.807984, 48.580297 ], [ -93.806763, 48.577616 ], [ -93.805270, 48.570299 ], [ -93.805369, 48.568393 ], [ -93.806748, 48.561779 ], [ -93.808973, 48.555897 ], [ -93.812098, 48.550664 ], [ -93.812278, 48.549111 ], [ -93.811303, 48.545543 ], [ -93.811201, 48.542385 ], [ -93.812223, 48.540509 ], [ -93.817572, 48.535833 ], [ -93.818375, 48.534442 ], [ -93.818853, 48.532669 ], [ -93.818253, 48.530046 ], [ -93.815178, 48.526508 ], [ -93.812149, 48.524778 ], [ -93.801520, 48.520551 ], [ -93.797436, 48.518356 ], [ -93.794454, 48.516021 ], [ -93.784657, 48.515490 ], [ -93.771741, 48.515825 ], [ -93.763176, 48.516118 ], [ -93.756483, 48.515366 ], [ -93.752942, 48.515120 ], [ -93.741843, 48.517347 ], [ -93.732139, 48.517995 ], [ -93.723680, 48.517329 ], [ -93.709147, 48.518029 ], [ -93.703303, 48.517150 ], [ -93.694676, 48.514774 ], [ -93.690901, 48.514588 ], [ -93.674568, 48.516297 ], [ -93.656652, 48.515731 ], [ -93.645397, 48.517281 ], [ -93.643091, 48.518294 ], [ -93.641440, 48.519238 ], [ -93.638199, 48.522533 ], [ -93.635476, 48.527702 ], [ -93.632327, 48.530092 ], [ -93.628865, 48.531210 ], [ -93.626447, 48.530985 ], [ -93.622333, 48.526510 ], [ -93.618321, 48.523970 ], [ -93.612844, 48.521876 ], [ -93.610618, 48.521661 ], [ -93.605870, 48.522472 ], [ -93.603752, 48.523326 ], [ -93.598212, 48.527154 ], [ -93.594379, 48.528793 ], [ -93.587957, 48.528881 ], [ -93.580711, 48.526667 ], [ -93.578333, 48.526520 ], [ -93.562062, 48.528897 ], [ -93.547191, 48.528684 ], [ -93.540369, 48.529877 ], [ -93.532087, 48.532453 ], [ -93.518691, 48.533997 ], [ -93.515457, 48.534792 ], [ -93.500153, 48.541202 ], [ -93.481471, 48.543146 ], [ -93.467504, 48.545664 ], [ -93.465392, 48.546668 ], [ -93.460798, 48.550552 ], [ -93.458246, 48.555291 ], [ -93.456675, 48.561834 ], [ -93.457046, 48.567199 ], [ -93.461731, 48.574030 ], [ -93.466007, 48.587291 ], [ -93.465199, 48.590659 ], [ -93.464308, 48.591792 ], [ -93.438494, 48.593380 ], [ -93.434141, 48.595138 ], [ -93.428328, 48.599777 ], [ -93.425483, 48.601300 ], [ -93.414026, 48.605605 ], [ -93.408560, 48.608415 ], [ -93.405269, 48.609344 ], [ -93.404205, 48.609351 ], [ -93.403660, 48.607593 ], [ -93.398974, 48.603905 ], [ -93.395022, 48.603303 ], [ -93.383807, 48.605149 ], [ -93.371156, 48.605085 ], [ -93.367666, 48.607020 ], [ -93.367025, 48.608283 ], [ -93.362132, 48.613832 ], [ -93.356410, 48.611778 ], [ -93.355410, 48.611595 ], [ -93.354135, 48.612350 ], [ -93.353240, 48.613378 ], [ -93.353138, 48.615709 ], [ -93.349095, 48.624935 ], [ -93.348183, 48.626414 ], [ -93.347528, 48.626620 ], [ -93.254854, 48.642784 ], [ -93.207398, 48.642474 ], [ -93.184091, 48.628375 ], [ -93.179990, 48.624926 ], [ -93.178095, 48.623339 ], [ -93.142420, 48.624924 ], [ -93.088438, 48.627597 ], [ -92.984963, 48.623731 ], [ -92.954876, 48.631493 ], [ -92.950120, 48.630419 ], [ -92.949839, 48.608269 ], [ -92.929614, 48.606874 ], [ -92.909947, 48.596313 ], [ -92.894687, 48.594915 ], [ -92.728046, 48.539290 ], [ -92.657881, 48.546263 ], [ -92.634931, 48.542873 ], [ -92.627833, 48.522167 ], [ -92.625739, 48.518189 ], [ -92.625541, 48.517549 ], [ -92.626639, 48.514374 ], [ -92.626365, 48.513620 ], [ -92.625151, 48.513048 ], [ -92.625374, 48.512916 ], [ -92.631117, 48.508252 ], [ -92.631137, 48.508077 ], [ -92.631463, 48.506790 ], [ -92.629126, 48.505303 ], [ -92.627237, 48.503383 ], [ -92.630644, 48.500917 ], [ -92.636696, 48.499428 ], [ -92.647114, 48.499905 ], [ -92.654039, 48.501635 ], [ -92.661418, 48.496557 ], [ -92.684866, 48.497611 ], [ -92.698824, 48.494892 ], [ -92.701298, 48.484586 ], [ -92.709267, 48.473091 ], [ -92.708647, 48.470349 ], [ -92.712562, 48.463013 ], [ -92.687998, 48.443889 ], [ -92.663271, 48.440184 ], [ -92.656027, 48.436709 ], [ -92.575636, 48.440827 ], [ -92.537202, 48.447703 ], [ -92.514910, 48.448313 ], [ -92.507285, 48.447875 ], [ -92.492078, 48.433709 ], [ -92.489190, 48.430328 ], [ -92.484074, 48.429530 ], [ -92.482082, 48.428662 ], [ -92.480844, 48.426583 ], [ -92.481152, 48.425349 ], [ -92.475585, 48.418793 ], [ -92.456325, 48.414204 ], [ -92.456389, 48.401134 ], [ -92.476750, 48.371760 ], [ -92.469948, 48.351836 ], [ -92.453691, 48.329514 ], [ -92.441286, 48.315597 ], [ -92.437825, 48.309839 ], [ -92.432003, 48.305063 ], [ -92.428919, 48.305771 ], [ -92.426077, 48.304491 ], [ -92.416285, 48.295463 ], [ -92.406706, 48.279351 ], [ -92.397645, 48.265546 ], [ -92.393781, 48.260562 ], [ -92.389305, 48.253316 ], [ -92.387049, 48.249268 ], [ -92.388112, 48.246732 ], [ -92.387191, 48.244606 ], [ -92.386438, 48.244194 ], [ -92.383906, 48.244696 ], [ -92.384387, 48.242914 ], [ -92.384355, 48.240720 ], [ -92.383161, 48.238367 ], [ -92.378922, 48.235782 ], [ -92.378343, 48.233383 ], [ -92.378449, 48.230801 ], [ -92.377903, 48.229635 ], [ -92.372802, 48.223717 ], [ -92.369174, 48.220268 ], [ -92.362097, 48.222876 ], [ -92.353177, 48.230328 ], [ -92.349177, 48.231404 ], [ -92.341207, 48.232480 ], [ -92.339430, 48.234537 ], [ -92.336831, 48.235383 ], [ -92.335394, 48.235200 ], [ -92.333649, 48.233898 ], [ -92.332247, 48.233876 ], [ -92.325304, 48.237030 ], [ -92.321746, 48.237304 ], [ -92.314665, 48.240527 ], [ -92.280727, 48.244269 ], [ -92.269742, 48.248241 ], [ -92.273706, 48.256747 ], [ -92.290368, 48.265527 ], [ -92.294541, 48.271560 ], [ -92.292999, 48.276404 ], [ -92.295053, 48.276587 ], [ -92.295668, 48.278118 ], [ -92.301451, 48.288608 ], [ -92.294527, 48.306454 ], [ -92.306309, 48.316442 ], [ -92.304561, 48.322977 ], [ -92.295412, 48.323957 ], [ -92.288994, 48.342991 ], [ -92.262280, 48.354933 ], [ -92.222813, 48.349203 ], [ -92.219658, 48.348130 ], [ -92.216983, 48.345114 ], [ -92.206803, 48.345596 ], [ -92.207009, 48.346891 ], [ -92.207729, 48.347812 ], [ -92.203684, 48.352063 ], [ -92.194874, 48.350396 ], [ -92.194188, 48.348728 ], [ -92.193571, 48.348613 ], [ -92.178418, 48.351881 ], [ -92.178897, 48.355285 ], [ -92.177354, 48.357228 ], [ -92.162161, 48.363279 ], [ -92.145049, 48.365651 ], [ -92.143583, 48.356121 ], [ -92.092256, 48.354617 ], [ -92.083513, 48.353865 ], [ -92.077961, 48.358253 ], [ -92.066269, 48.359602 ], [ -92.055228, 48.359213 ], [ -92.048648, 48.348861 ], [ -92.045734, 48.347901 ], [ -92.045152, 48.345776 ], [ -92.047655, 48.343766 ], [ -92.046562, 48.334740 ], [ -92.037721, 48.333183 ], [ -92.030872, 48.325824 ], [ -92.000133, 48.321355 ], [ -92.012980, 48.297391 ], [ -92.012066, 48.287268 ], [ -92.007246, 48.280388 ], [ -92.006577, 48.265421 ], [ -91.989545, 48.260214 ], [ -91.980772, 48.247801 ], [ -91.977555, 48.247140 ], [ -91.977486, 48.246340 ], [ -91.977725, 48.245723 ], [ -91.976903, 48.244626 ], [ -91.975809, 48.244535 ], [ -91.971056, 48.247667 ], [ -91.970371, 48.249358 ], [ -91.972565, 48.250396 ], [ -91.971779, 48.252977 ], [ -91.970240, 48.253594 ], [ -91.959565, 48.253551 ], [ -91.954432, 48.251678 ], [ -91.954397, 48.251199 ], [ -91.953806, 48.249412 ], [ -91.952095, 48.247131 ], [ -91.952209, 48.244394 ], [ -91.957683, 48.242683 ], [ -91.957798, 48.239490 ], [ -91.959166, 48.236296 ], [ -91.957798, 48.232989 ], [ -91.953398, 48.232978 ], [ -91.951297, 48.232647 ], [ -91.945155, 48.230442 ], [ -91.941838, 48.230602 ], [ -91.940709, 48.232019 ], [ -91.937356, 48.234213 ], [ -91.929045, 48.235834 ], [ -91.920802, 48.236747 ], [ -91.915772, 48.238871 ], [ -91.907597, 48.238183 ], [ -91.906967, 48.237770 ], [ -91.905991, 48.237132 ], [ -91.903767, 48.237040 ], [ -91.893470, 48.237699 ], [ -91.884691, 48.227321 ], [ -91.867882, 48.219095 ], [ -91.864382, 48.207031 ], [ -91.845821, 48.208636 ], [ -91.839463, 48.209643 ], [ -91.834404, 48.209804 ], [ -91.831975, 48.209302 ], [ -91.815772, 48.211748 ], [ -91.814473, 48.208664 ], [ -91.809038, 48.206013 ], [ -91.798099, 48.202813 ], [ -91.791810, 48.202492 ], [ -91.789011, 48.196549 ], [ -91.786140, 48.196412 ], [ -91.781182, 48.200432 ], [ -91.764672, 48.200586 ], [ -91.763236, 48.201499 ], [ -91.760874, 48.204789 ], [ -91.756637, 48.205022 ], [ -91.753939, 48.201198 ], [ -91.749075, 48.198844 ], [ -91.744973, 48.198458 ], [ -91.741932, 48.199122 ], [ -91.742313, 48.204491 ], [ -91.738861, 48.204173 ], [ -91.714931, 48.199130 ], [ -91.710519, 48.193898 ], [ -91.711611, 48.189100 ], [ -91.712430, 48.187500 ], [ -91.721413, 48.180255 ], [ -91.722574, 48.178335 ], [ -91.724584, 48.170657 ], [ -91.723285, 48.169263 ], [ -91.717548, 48.171801 ], [ -91.709383, 48.172717 ], [ -91.705318, 48.170775 ], [ -91.705109, 48.159716 ], [ -91.707260, 48.153661 ], [ -91.708523, 48.152701 ], [ -91.703569, 48.145390 ], [ -91.701691, 48.144773 ], [ -91.699336, 48.144728 ], [ -91.698448, 48.143791 ], [ -91.698174, 48.141643 ], [ -91.699981, 48.131840 ], [ -91.704143, 48.124894 ], [ -91.708099, 48.122985 ], [ -91.712226, 48.116883 ], [ -91.712498, 48.115718 ], [ -91.711986, 48.114713 ], [ -91.703524, 48.113548 ], [ -91.692843, 48.116360 ], [ -91.691512, 48.117617 ], [ -91.692366, 48.119330 ], [ -91.682845, 48.122118 ], [ -91.683801, 48.117731 ], [ -91.687623, 48.111698 ], [ -91.680902, 48.108111 ], [ -91.676876, 48.107264 ], [ -91.671519, 48.108360 ], [ -91.667527, 48.108359 ], [ -91.665208, 48.107011 ], [ -91.663092, 48.108861 ], [ -91.662647, 48.111489 ], [ -91.653261, 48.114137 ], [ -91.652204, 48.113725 ], [ -91.651624, 48.112742 ], [ -91.653571, 48.109567 ], [ -91.640175, 48.096926 ], [ -91.615255, 48.101906 ], [ -91.588953, 48.102166 ], [ -91.575853, 48.106509 ], [ -91.559272, 48.108268 ], [ -91.552962, 48.103012 ], [ -91.569746, 48.093348 ], [ -91.575471, 48.066294 ], [ -91.573015, 48.057292 ], [ -91.575672, 48.048791 ], [ -91.567254, 48.043719 ], [ -91.542512, 48.053268 ], [ -91.488646, 48.068065 ], [ -91.465499, 48.066770 ], [ -91.450330, 48.068806 ], [ -91.446580, 48.067390 ], [ -91.447125, 48.063186 ], [ -91.438093, 48.052104 ], [ -91.438877, 48.049979 ], [ -91.437582, 48.049248 ], [ -91.429642, 48.048608 ], [ -91.413862, 48.053518 ], [ -91.391128, 48.057075 ], [ -91.379463, 48.065295 ], [ -91.370872, 48.069410 ], [ -91.365143, 48.066968 ], [ -91.350521, 48.071680 ], [ -91.340159, 48.073236 ], [ -91.336715, 48.070884 ], [ -91.336578, 48.069627 ], [ -91.332589, 48.069331 ], [ -91.330033, 48.069811 ], [ -91.328738, 48.070588 ], [ -91.327886, 48.071388 ], [ -91.324784, 48.072599 ], [ -91.314693, 48.073422 ], [ -91.311829, 48.072942 ], [ -91.302625, 48.073033 ], [ -91.290215, 48.073945 ], [ -91.275961, 48.078488 ], [ -91.266380, 48.078713 ], [ -91.250112, 48.084087 ], [ -91.234932, 48.095923 ], [ -91.226203, 48.099671 ], [ -91.214428, 48.102940 ], [ -91.190461, 48.124891 ], [ -91.183207, 48.122235 ], [ -91.176181, 48.125811 ], [ -91.156107, 48.140475 ], [ -91.137733, 48.149150 ], [ -91.138311, 48.151024 ], [ -91.138482, 48.151458 ], [ -91.139402, 48.153186 ], [ -91.139402, 48.154738 ], [ -91.138580, 48.155844 ], [ -91.120047, 48.160412 ], [ -91.117965, 48.162081 ], [ -91.114862, 48.166057 ], [ -91.108887, 48.168436 ], [ -91.097892, 48.171157 ], [ -91.092258, 48.173101 ], [ -91.088708, 48.177351 ], [ -91.082731, 48.180756 ], [ -91.081160, 48.180414 ], [ -91.080408, 48.179272 ], [ -91.075660, 48.179204 ], [ -91.065549, 48.181215 ], [ -91.062918, 48.185213 ], [ -91.056562, 48.187566 ], [ -91.043613, 48.189163 ], [ -91.035858, 48.189436 ], [ -91.035550, 48.189459 ], [ -91.034800, 48.188956 ], [ -91.031589, 48.188452 ], [ -91.024208, 48.190072 ], [ -91.022667, 48.192470 ], [ -91.012411, 48.198062 ], [ -91.003353, 48.200183 ], [ -91.004239, 48.202628 ], [ -90.976955, 48.219452 ], [ -90.925092, 48.229897 ], [ -90.914971, 48.230603 ], [ -90.906829, 48.237339 ], [ -90.885480, 48.245784 ], [ -90.881451, 48.240459 ], [ -90.875107, 48.237784 ], [ -90.867079, 48.238177 ], [ -90.847352, 48.244443 ], [ -90.843624, 48.243576 ], [ -90.839176, 48.239511 ], [ -90.837772, 48.234714 ], [ -90.839820, 48.228294 ], [ -90.839615, 48.227700 ], [ -90.837700, 48.226512 ], [ -90.837323, 48.225621 ], [ -90.834854, 48.202161 ], [ -90.834166, 48.188660 ], [ -90.836313, 48.176963 ], [ -90.832589, 48.173765 ], [ -90.826135, 48.177147 ], [ -90.825418, 48.181237 ], [ -90.825726, 48.183567 ], [ -90.821115, 48.184709 ], [ -90.819304, 48.182699 ], [ -90.817698, 48.179569 ], [ -90.810628, 48.179661 ], [ -90.804207, 48.177833 ], [ -90.800693, 48.163235 ], [ -90.796596, 48.159373 ], [ -90.785874, 48.160902 ], [ -90.783380, 48.163939 ], [ -90.781263, 48.164693 ], [ -90.777917, 48.163801 ], [ -90.776279, 48.161927 ], [ -90.777512, 48.156696 ], [ -90.778031, 48.148723 ], [ -90.785781, 48.145504 ], [ -90.796809, 48.139521 ], [ -90.797970, 48.136894 ], [ -90.795308, 48.135523 ], [ -90.793841, 48.135569 ], [ -90.790312, 48.135788 ], [ -90.788101, 48.135081 ], [ -90.787305, 48.134196 ], [ -90.787305, 48.133665 ], [ -90.787563, 48.132872 ], [ -90.789919, 48.129902 ], [ -90.787122, 48.127709 ], [ -90.783471, 48.126885 ], [ -90.776814, 48.124103 ], [ -90.776133, 48.122481 ], [ -90.775962, 48.122229 ], [ -90.774225, 48.118894 ], [ -90.774191, 48.118575 ], [ -90.772998, 48.117523 ], [ -90.769110, 48.116585 ], [ -90.767615, 48.110302 ], [ -90.761555, 48.100133 ], [ -90.761625, 48.098283 ], [ -90.751608, 48.090968 ], [ -90.741520, 48.094583 ], [ -90.703702, 48.096009 ], [ -90.686617, 48.100510 ], [ -90.641596, 48.103515 ], [ -90.626886, 48.111846 ], [ -90.620350, 48.111895 ], [ -90.616154, 48.112491 ], [ -90.606402, 48.115966 ], [ -90.591460, 48.117546 ], [ -90.590574, 48.119762 ], [ -90.582217, 48.123784 ], [ -90.579897, 48.123922 ], [ -90.577065, 48.121272 ], [ -90.575905, 48.120907 ], [ -90.570481, 48.121501 ], [ -90.566113, 48.122620 ], [ -90.559290, 48.121683 ], [ -90.555845, 48.117069 ], [ -90.569763, 48.106951 ], [ -90.567482, 48.101178 ], [ -90.564341, 48.098773 ], [ -90.556838, 48.096008 ], [ -90.517075, 48.099402 ], [ -90.510871, 48.097389 ], [ -90.508141, 48.099238 ], [ -90.505485, 48.099644 ], [ -90.496148, 48.098781 ], [ -90.495637, 48.099444 ], [ -90.495398, 48.099787 ], [ -90.493797, 48.101318 ], [ -90.489873, 48.099012 ], [ -90.487077, 48.099082 ], [ -90.483361, 48.100363 ], [ -90.480294, 48.102099 ], [ -90.477635, 48.105458 ], [ -90.471019, 48.106076 ], [ -90.467712, 48.108818 ], [ -90.465495, 48.108659 ], [ -90.463210, 48.107357 ], [ -90.452022, 48.105006 ], [ -90.447384, 48.103430 ], [ -90.443462, 48.100575 ], [ -90.438449, 48.098747 ], [ -90.410347, 48.105048 ], [ -90.403219, 48.105114 ], [ -90.393469, 48.100359 ], [ -90.390162, 48.100061 ], [ -90.386413, 48.098209 ], [ -90.385597, 48.095833 ], [ -90.384575, 48.094599 ], [ -90.382258, 48.093182 ], [ -90.374542, 48.090942 ], [ -90.373042, 48.091217 ], [ -90.372261, 48.093639 ], [ -90.367658, 48.094577 ], [ -90.353713, 48.095016 ], [ -90.346689, 48.094104 ], [ -90.344234, 48.094447 ], [ -90.343484, 48.095064 ], [ -90.342939, 48.095590 ], [ -90.338438, 48.096207 ], [ -90.337177, 48.099771 ], [ -90.330052, 48.102399 ], [ -90.317230, 48.103793 ], [ -90.312386, 48.105300 ], [ -90.305634, 48.105117 ], [ -90.298099, 48.102512 ], [ -90.293326, 48.099131 ], [ -90.289337, 48.098993 ], [ -90.274636, 48.103260 ], [ -90.264986, 48.103301 ], [ -90.253870, 48.102245 ], [ -90.233797, 48.107071 ], [ -90.224692, 48.108148 ], [ -90.216404, 48.106505 ], [ -90.211426, 48.106278 ], [ -90.195090, 48.108381 ], [ -90.188679, 48.107947 ], [ -90.176605, 48.112445 ], [ -90.164227, 48.109725 ], [ -90.150721, 48.110269 ], [ -90.145230, 48.111637 ], [ -90.143762, 48.112641 ], [ -90.136191, 48.112136 ], [ -90.132645, 48.111768 ], [ -90.128647, 48.108436 ], [ -90.125090, 48.107702 ], [ -90.123900, 48.107131 ], [ -90.122603, 48.105602 ], [ -90.116259, 48.104303 ], [ -90.091639, 48.104630 ], [ -90.073873, 48.101138 ], [ -90.057644, 48.096364 ], [ -90.049020, 48.091681 ], [ -90.045577, 48.091360 ], [ -90.029626, 48.087588 ], [ -90.023595, 48.084708 ], [ -90.018835, 48.072032 ], [ -90.015057, 48.067188 ], [ -90.010866, 48.067917 ], [ -90.010013, 48.068853 ], [ -90.008446, 48.068396 ], [ -89.997852, 48.057567 ], [ -89.993822, 48.049027 ], [ -89.995994, 48.041649 ], [ -89.996702, 48.035391 ], [ -89.994687, 48.030733 ], [ -89.993050, 48.028404 ], [ -89.988894, 48.025666 ], [ -89.987293, 48.025484 ], [ -89.985217, 48.026215 ], [ -89.984332, 48.026079 ], [ -89.977180, 48.023501 ], [ -89.973433, 48.020350 ], [ -89.968255, 48.014482 ], [ -89.963490, 48.014643 ], [ -89.954605, 48.011516 ], [ -89.950590, 48.015901 ], [ -89.934489, 48.015628 ], [ -89.932991, 48.013161 ], [ -89.932617, 48.010398 ], [ -89.930745, 48.008160 ], [ -89.921633, 47.999886 ], [ -89.915341, 47.994866 ], [ -89.911258, 47.993267 ], [ -89.904828, 47.992261 ], [ -89.903501, 47.991667 ], [ -89.900237, 47.988765 ], [ -89.897414, 47.987599 ], [ -89.886528, 47.986305 ], [ -89.880710, 47.986405 ], [ -89.873286, 47.985419 ], [ -89.871245, 47.985945 ], [ -89.868153, 47.989898 ], [ -89.847571, 47.992442 ], [ -89.846244, 47.992717 ], [ -89.842709, 47.997422 ], [ -89.842568, 48.001368 ], [ -89.842629, 48.001945 ], [ -89.842629, 48.002391 ], [ -89.842183, 48.002773 ], [ -89.841673, 48.002900 ], [ -89.838689, 48.002214 ], [ -89.834049, 47.999516 ], [ -89.831825, 47.999400 ], [ -89.830385, 48.000284 ], [ -89.822594, 48.010737 ], [ -89.820483, 48.014665 ], [ -89.819802, 48.015099 ], [ -89.807445, 48.017224 ], [ -89.806016, 48.014026 ], [ -89.804926, 48.013775 ], [ -89.797744, 48.014505 ], [ -89.796212, 48.014870 ], [ -89.795224, 48.017154 ], [ -89.794237, 48.017656 ], [ -89.791853, 48.018204 ], [ -89.782696, 48.017837 ], [ -89.779427, 48.018361 ], [ -89.773944, 48.021694 ], [ -89.763967, 48.022969 ], [ -89.749314, 48.023325 ], [ -89.744206, 48.022186 ], [ -89.743046, 48.019971 ], [ -89.742569, 48.019834 ], [ -89.739131, 48.020384 ], [ -89.736851, 48.021321 ], [ -89.731300, 48.019747 ], [ -89.731163, 48.018788 ], [ -89.724048, 48.018996 ], [ -89.723571, 48.019156 ], [ -89.724117, 48.020207 ], [ -89.723164, 48.020481 ], [ -89.722210, 48.020162 ], [ -89.721038, 48.017965 ], [ -89.721569, 48.017499 ], [ -89.723019, 48.017553 ], [ -89.724318, 48.016485 ], [ -89.724044, 48.013675 ], [ -89.721287, 48.014430 ], [ -89.719245, 48.016349 ], [ -89.717102, 48.017172 ], [ -89.716114, 48.016441 ], [ -89.716417, 48.010251 ], [ -89.715906, 48.009246 ], [ -89.713183, 48.010024 ], [ -89.708145, 48.010162 ], [ -89.707090, 48.009522 ], [ -89.706068, 48.007992 ], [ -89.702528, 48.006325 ], [ -89.701438, 48.006211 ], [ -89.688879, 48.010780 ], [ -89.686495, 48.010643 ], [ -89.685986, 48.009798 ], [ -89.684931, 48.009821 ], [ -89.679790, 48.010278 ], [ -89.676896, 48.011237 ], [ -89.673798, 48.011510 ], [ -89.671892, 48.010939 ], [ -89.671620, 48.010162 ], [ -89.669374, 48.008312 ], [ -89.667128, 48.007421 ], [ -89.664813, 48.007900 ], [ -89.663212, 48.010618 ], [ -89.657051, 48.009954 ], [ -89.655793, 48.007532 ], [ -89.653208, 48.004608 ], [ -89.651065, 48.003625 ], [ -89.649057, 48.003853 ], [ -89.647830, 48.005132 ], [ -89.645447, 48.006204 ], [ -89.641465, 48.005906 ], [ -89.639833, 48.003964 ], [ -89.637995, 48.003780 ], [ -89.637280, 48.004100 ], [ -89.637177, 48.004945 ], [ -89.637652, 48.006658 ], [ -89.638774, 48.008166 ], [ -89.637173, 48.009308 ], [ -89.625087, 48.011517 ], [ -89.620454, 48.010740 ], [ -89.617867, 48.010947 ], [ -89.616133, 48.012364 ], [ -89.614161, 48.015495 ], [ -89.611678, 48.017529 ], [ -89.610351, 48.017780 ], [ -89.609396, 48.016684 ], [ -89.608507, 48.012482 ], [ -89.609730, 48.009398 ], [ -89.607821, 48.006566 ], [ -89.601659, 48.004764 ], [ -89.594749, 48.004332 ], [ -89.588996, 48.001821 ], [ -89.586000, 47.999885 ], [ -89.582117, 47.996314 ], [ -89.581007, 47.995899 ], [ -89.570671, 47.998020 ], [ -89.564288, 48.002930 ], [ -89.489226, 48.014528 ], [ -89.491739, 48.005212 ], [ -89.495344, 48.002356 ], [ -89.541521, 47.992841 ], [ -89.551555, 47.987305 ], [ -89.551688, 47.972645 ], [ -89.585372, 47.956147 ], [ -89.588230, 47.966200 ], [ -89.595890, 47.971046 ], [ -89.611412, 47.980731 ], [ -89.624559, 47.983153 ], [ -89.631825, 47.980039 ], [ -89.637015, 47.973465 ], [ -89.640129, 47.967930 ], [ -89.639844, 47.959826 ], [ -89.638285, 47.954275 ], [ -89.639545, 47.953590 ], [ -89.660616, 47.951216 ], [ -89.697619, 47.941288 ], [ -89.729730, 47.925245 ], [ -89.737539, 47.918183 ], [ -89.758714, 47.906993 ], [ -89.793539, 47.891358 ], [ -89.853960, 47.873997 ], [ -89.871580, 47.874194 ], [ -89.923649, 47.862062 ], [ -89.930844, 47.857723 ], [ -89.927520, 47.850825 ], [ -89.933899, 47.846760 ], [ -89.974296, 47.830514 ], [ -90.013730, 47.821373 ], [ -90.042761, 47.817568 ], [ -90.072025, 47.811105 ], [ -90.072241, 47.807727 ], [ -90.075559, 47.803303 ], [ -90.082354, 47.803619 ], [ -90.088160, 47.803041 ], [ -90.116800, 47.795380 ], [ -90.132078, 47.795720 ], [ -90.160790, 47.792807 ], [ -90.178755, 47.786414 ], [ -90.187636, 47.778130 ], [ -90.229145, 47.776198 ], [ -90.248794, 47.772763 ], [ -90.295952, 47.759054 ], [ -90.306340, 47.756627 ], [ -90.313958, 47.756681 ], [ -90.323446, 47.753771 ], [ -90.330254, 47.750892 ], [ -90.332686, 47.746387 ], [ -90.386234, 47.741100 ], [ -90.393823, 47.738271 ], [ -90.421390, 47.735150 ], [ -90.437712, 47.731612 ], [ -90.441912, 47.726404 ], [ -90.458365, 47.721400 ], [ -90.537105, 47.703055 ], [ -90.551291, 47.690266 ], [ -90.584954, 47.680740 ], [ -90.647837, 47.656176 ], [ -90.686382, 47.643594 ], [ -90.735927, 47.624343 ], [ -90.868270, 47.556900 ], [ -90.907494, 47.532873 ], [ -90.910127, 47.530178 ], [ -90.909801, 47.526215 ], [ -90.914247, 47.522639 ], [ -90.919375, 47.519784 ], [ -90.927975, 47.519008 ], [ -90.939072, 47.514532 ], [ -91.023124, 47.464964 ], [ -91.032945, 47.458236 ], [ -91.045646, 47.456525 ], [ -91.077712, 47.428767 ], [ -91.097569, 47.413888 ], [ -91.106218, 47.411806 ], [ -91.128131, 47.399619 ], [ -91.131268, 47.393567 ], [ -91.146958, 47.381464 ], [ -91.156513, 47.378816 ], [ -91.170037, 47.366266 ], [ -91.188772, 47.340082 ], [ -91.206248, 47.329182 ], [ -91.238658, 47.304976 ], [ -91.250163, 47.290490 ], [ -91.262512, 47.279290 ], [ -91.265950, 47.279479 ], [ -91.270697, 47.277134 ], [ -91.288478, 47.265960 ], [ -91.326019, 47.238993 ], [ -91.353850, 47.212686 ], [ -91.357803, 47.206743 ], [ -91.374191, 47.197800 ], [ -91.387021, 47.187293 ], [ -91.398455, 47.183916 ], [ -91.418805, 47.172152 ], [ -91.452031, 47.145158 ], [ -91.456965, 47.139156 ], [ -91.477351, 47.125667 ], [ -91.497902, 47.122579 ], [ -91.506998, 47.118489 ], [ -91.518793, 47.108121 ], [ -91.573817, 47.089917 ], [ -91.591508, 47.068684 ], [ -91.600969, 47.063425 ], [ -91.604949, 47.063309 ], [ -91.613173, 47.059192 ], [ -91.626824, 47.049953 ], [ -91.637164, 47.040429 ], [ -91.644564, 47.026491 ], [ -91.660248, 47.019288 ], [ -91.666477, 47.014297 ], [ -91.704649, 47.005246 ], [ -91.737098, 46.982853 ], [ -91.777300, 46.951799 ], [ -91.780675, 46.945881 ], [ -91.806851, 46.933727 ], [ -91.826068, 46.927199 ], [ -91.834852, 46.927135 ], [ -91.841349, 46.925215 ], [ -91.871286, 46.908352 ], [ -91.883238, 46.905728 ], [ -91.906483, 46.891236 ], [ -91.914984, 46.883836 ], [ -91.952985, 46.867037 ], [ -91.985086, 46.849637 ], [ -91.997987, 46.838737 ], [ -92.013405, 46.833727 ], [ -92.058888, 46.809938 ], [ -92.062088, 46.804038 ], [ -92.086089, 46.794339 ], [ -92.094089, 46.787839 ], [ -92.088289, 46.773639 ], [ -92.064490, 46.745439 ], [ -92.025789, 46.710839 ], [ -92.015290, 46.706469 ], [ -92.020289, 46.704039 ], [ -92.033990, 46.708939 ], [ -92.089490, 46.749240 ], [ -92.108190, 46.749140 ], [ -92.116590, 46.748640 ], [ -92.137890, 46.739540 ], [ -92.143290, 46.734640 ], [ -92.143391, 46.728140 ], [ -92.141291, 46.725240 ], [ -92.146291, 46.715940 ], [ -92.148691, 46.715140 ], [ -92.155191, 46.715940 ], [ -92.167291, 46.719941 ], [ -92.174291, 46.717241 ], [ -92.178891, 46.716741 ], [ -92.189091, 46.717541 ], [ -92.191491, 46.716241 ], [ -92.193291, 46.711241 ], [ -92.197391, 46.707641 ], [ -92.201591, 46.705941 ], [ -92.204691, 46.704041 ], [ -92.205692, 46.702541 ], [ -92.205192, 46.698341 ], [ -92.198491, 46.696141 ], [ -92.183091, 46.695241 ], [ -92.177891, 46.691841 ], [ -92.176491, 46.690241 ], [ -92.176091, 46.686341 ], [ -92.177591, 46.683441 ], [ -92.181391, 46.680241 ], [ -92.187592, 46.678941 ], [ -92.192492, 46.676741 ], [ -92.199492, 46.670241 ], [ -92.204092, 46.666941 ], [ -92.205492, 46.664741 ], [ -92.202192, 46.658941 ], [ -92.201592, 46.656641 ], [ -92.202292, 46.655041 ], [ -92.207092, 46.651941 ], [ -92.212392, 46.649941 ], [ -92.216392, 46.649841 ], [ -92.223492, 46.652641 ], [ -92.228492, 46.652941 ], [ -92.235592, 46.650041 ], [ -92.242493, 46.649241 ], [ -92.256592, 46.658741 ], [ -92.259692, 46.657141 ], [ -92.265993, 46.651041 ], [ -92.270592, 46.650741 ], [ -92.272792, 46.652841 ], [ -92.274392, 46.657441 ], [ -92.278492, 46.658641 ], [ -92.283692, 46.658841 ], [ -92.286192, 46.660342 ], [ -92.287092, 46.662842 ], [ -92.287392, 46.667342 ], [ -92.291292, 46.668142 ], [ -92.292192, 46.666042 ], [ -92.292192, 46.663242 ], [ -92.291597, 46.624941 ], [ -92.291647, 46.604649 ], [ -92.291976, 46.503997 ], [ -92.292371, 46.495585 ], [ -92.292510, 46.478761 ], [ -92.292727, 46.431993 ], [ -92.292847, 46.420876 ], [ -92.292860, 46.417220 ], [ -92.292999, 46.321894 ], [ -92.292782, 46.319312 ], [ -92.292803, 46.314628 ], [ -92.292880, 46.313752 ], [ -92.292839, 46.307107 ], [ -92.292840, 46.304319 ], [ -92.293007, 46.297987 ], [ -92.293074, 46.295129 ], [ -92.293619, 46.244043 ], [ -92.293558, 46.224578 ], [ -92.293857, 46.180073 ], [ -92.293744, 46.166838 ], [ -92.293530, 46.113824 ], [ -92.294069, 46.078346 ], [ -92.294033, 46.074377 ], [ -92.298638, 46.072989 ], [ -92.306756, 46.072410 ], [ -92.319329, 46.069289 ], [ -92.327868, 46.066180 ], [ -92.329806, 46.065216 ], [ -92.332912, 46.062697 ], [ -92.335335, 46.059422 ], [ -92.338239, 46.052149 ], [ -92.338590, 46.050111 ], [ -92.341278, 46.045424 ], [ -92.343459, 46.042990 ], [ -92.343604, 46.040917 ], [ -92.342429, 46.034541 ], [ -92.343745, 46.028525 ], [ -92.344244, 46.027430 ], [ -92.346345, 46.025429 ], [ -92.349281, 46.023624 ], [ -92.350004, 46.021888 ], [ -92.350319, 46.018980 ], [ -92.349977, 46.016982 ], [ -92.351760, 46.015685 ], [ -92.357965, 46.013413 ], [ -92.362141, 46.013103 ], [ -92.372717, 46.014198 ], [ -92.381707, 46.017034 ], [ -92.392681, 46.019540 ], [ -92.408259, 46.026630 ], [ -92.410649, 46.027259 ], [ -92.420696, 46.026769 ], [ -92.428555, 46.024241 ], [ -92.435627, 46.021232 ], [ -92.442259, 46.016177 ], [ -92.444356, 46.011777 ], [ -92.444294, 46.009161 ], [ -92.449630, 46.002252 ], [ -92.451627, 46.000441 ], [ -92.452952, 45.997782 ], [ -92.453635, 45.996171 ], [ -92.453373, 45.992913 ], [ -92.456494, 45.990243 ], [ -92.462477, 45.987850 ], [ -92.464512, 45.985038 ], [ -92.464173, 45.982423 ], [ -92.463429, 45.981507 ], [ -92.461138, 45.980216 ], [ -92.461260, 45.979427 ], [ -92.464481, 45.976267 ], [ -92.469354, 45.973811 ], [ -92.472761, 45.972952 ], [ -92.479478, 45.973992 ], [ -92.484633, 45.975872 ], [ -92.490996, 45.975560 ], [ -92.502535, 45.979995 ], [ -92.519488, 45.983917 ], [ -92.522032, 45.984203 ], [ -92.527052, 45.983245 ], [ -92.530516, 45.981918 ], [ -92.537709, 45.977818 ], [ -92.545682, 45.970118 ], [ -92.548459, 45.969056 ], [ -92.549806, 45.967986 ], [ -92.550672, 45.960759 ], [ -92.549858, 45.957039 ], [ -92.551186, 45.952240 ], [ -92.551933, 45.951651 ], [ -92.561256, 45.951006 ], [ -92.569764, 45.948146 ], [ -92.574892, 45.948103 ], [ -92.580565, 45.946250 ], [ -92.590138, 45.941773 ], [ -92.602460, 45.940815 ], [ -92.608329, 45.938112 ], [ -92.614314, 45.934529 ], [ -92.622720, 45.935186 ], [ -92.627723, 45.932682 ], [ -92.629260, 45.932404 ], [ -92.636316, 45.934634 ], [ -92.638824, 45.934166 ], [ -92.639936, 45.933541 ], [ -92.640115, 45.932478 ], [ -92.638474, 45.925971 ], [ -92.639116, 45.924555 ], [ -92.656125, 45.924442 ], [ -92.659549, 45.922937 ], [ -92.670352, 45.916247 ], [ -92.676167, 45.912072 ], [ -92.676807, 45.910930 ], [ -92.675737, 45.907478 ], [ -92.676607, 45.906370 ], [ -92.683924, 45.903939 ], [ -92.698983, 45.896451 ], [ -92.703265, 45.896155 ], [ -92.707702, 45.894901 ], [ -92.712503, 45.891705 ], [ -92.721128, 45.883805 ], [ -92.734039, 45.868108 ], [ -92.736484, 45.863356 ], [ -92.736117, 45.859129 ], [ -92.739278, 45.847580 ], [ -92.739991, 45.846283 ], [ -92.745557, 45.841455 ], [ -92.749180, 45.840717 ], [ -92.759458, 45.835341 ], [ -92.761712, 45.833861 ], [ -92.765146, 45.830183 ], [ -92.765681, 45.827252 ], [ -92.764906, 45.824859 ], [ -92.761889, 45.817928 ], [ -92.760023, 45.815475 ], [ -92.757947, 45.811216 ], [ -92.757815, 45.806574 ], [ -92.759010, 45.803965 ], [ -92.761833, 45.801258 ], [ -92.768430, 45.798010 ], [ -92.772065, 45.795230 ], [ -92.776496, 45.790014 ], [ -92.779617, 45.782563 ], [ -92.781373, 45.773062 ], [ -92.784621, 45.764196 ], [ -92.798645, 45.753654 ], [ -92.802630, 45.751888 ], [ -92.803971, 45.749805 ], [ -92.805348, 45.747493 ], [ -92.809837, 45.744172 ], [ -92.812939, 45.742709 ], [ -92.816559, 45.742037 ], [ -92.826013, 45.736650 ], [ -92.828981, 45.733714 ], [ -92.830685, 45.733120 ], [ -92.835917, 45.732802 ], [ -92.841051, 45.730024 ], [ -92.843079, 45.729163 ], [ -92.848851, 45.728751 ], [ -92.850388, 45.727576 ], [ -92.850537, 45.724376 ], [ -92.850933, 45.723831 ], [ -92.853405, 45.723152 ], [ -92.862598, 45.722241 ], [ -92.865688, 45.720623 ], [ -92.869193, 45.717568 ], [ -92.869689, 45.715142 ], [ -92.868862, 45.711993 ], [ -92.871775, 45.699774 ], [ -92.870025, 45.697272 ], [ -92.870145, 45.696757 ], [ -92.875488, 45.689014 ], [ -92.876891, 45.675289 ], [ -92.878932, 45.665606 ], [ -92.882504, 45.659471 ], [ -92.883987, 45.654870 ], [ -92.885711, 45.646017 ], [ -92.887067, 45.644148 ], [ -92.887929, 45.639006 ], [ -92.886963, 45.636777 ], [ -92.886827, 45.633403 ], [ -92.888114, 45.628377 ], [ -92.888035, 45.624959 ], [ -92.886669, 45.619760 ], [ -92.882970, 45.613738 ], [ -92.882529, 45.610216 ], [ -92.884900, 45.605001 ], [ -92.886442, 45.598679 ], [ -92.886421, 45.594881 ], [ -92.883277, 45.589831 ], [ -92.884954, 45.578818 ], [ -92.883749, 45.575483 ], [ -92.881136, 45.573409 ], [ -92.871082, 45.567581 ], [ -92.846447, 45.566515 ], [ -92.843783, 45.566135 ], [ -92.834156, 45.563096 ], [ -92.823309, 45.560934 ], [ -92.812083, 45.561122 ], [ -92.801503, 45.562854 ], [ -92.790143, 45.566915 ], [ -92.785741, 45.567888 ], [ -92.775988, 45.568478 ], [ -92.773412, 45.568235 ], [ -92.770223, 45.566939 ], [ -92.764574, 45.563592 ], [ -92.756906, 45.557499 ], [ -92.745591, 45.553016 ], [ -92.726082, 45.541112 ], [ -92.724762, 45.538617 ], [ -92.724650, 45.536744 ], [ -92.728023, 45.525652 ], [ -92.727744, 45.518811 ], [ -92.726677, 45.514462 ], [ -92.724337, 45.512223 ], [ -92.715814, 45.506676 ], [ -92.711890, 45.503281 ], [ -92.702224, 45.493046 ], [ -92.695212, 45.482882 ], [ -92.691619, 45.476273 ], [ -92.686793, 45.472271 ], [ -92.680234, 45.464344 ], [ -92.677219, 45.462864 ], [ -92.661131, 45.458278 ], [ -92.653549, 45.455346 ], [ -92.652698, 45.454527 ], [ -92.646602, 45.441635 ], [ -92.646768, 45.437929 ], [ -92.649152, 45.429618 ], [ -92.650269, 45.419168 ], [ -92.649467, 45.416408 ], [ -92.646943, 45.414265 ], [ -92.646676, 45.413227 ], [ -92.648157, 45.407423 ], [ -92.650570, 45.403308 ], [ -92.650422, 45.398507 ], [ -92.658486, 45.396058 ], [ -92.664102, 45.393309 ], [ -92.669505, 45.389111 ], [ -92.676961, 45.380137 ], [ -92.678756, 45.376201 ], [ -92.678223, 45.373604 ], [ -92.679193, 45.372710 ], [ -92.696499, 45.363529 ], [ -92.702720, 45.358472 ], [ -92.703705, 45.356330 ], [ -92.704054, 45.353660 ], [ -92.699524, 45.342421 ], [ -92.698920, 45.339364 ], [ -92.698967, 45.336374 ], [ -92.699956, 45.333716 ], [ -92.704794, 45.326526 ], [ -92.709968, 45.321302 ], [ -92.727737, 45.309288 ], [ -92.732594, 45.304224 ], [ -92.737122, 45.300459 ], [ -92.750819, 45.292980 ], [ -92.758710, 45.290965 ], [ -92.761013, 45.289028 ], [ -92.761868, 45.287013 ], [ -92.761868, 45.284938 ], [ -92.760615, 45.278827 ], [ -92.758022, 45.274822 ], [ -92.752666, 45.269565 ], [ -92.751659, 45.265910 ], [ -92.751709, 45.261666 ], [ -92.755199, 45.256733 ], [ -92.758907, 45.253407 ], [ -92.760249, 45.249600 ], [ -92.757503, 45.238308 ], [ -92.757456, 45.230526 ], [ -92.755732, 45.225949 ], [ -92.753931, 45.222905 ], [ -92.752192, 45.221051 ], [ -92.751708, 45.218666 ], [ -92.754008, 45.212766 ], [ -92.758008, 45.209566 ], [ -92.762108, 45.207166 ], [ -92.763908, 45.204866 ], [ -92.766932, 45.195111 ], [ -92.767408, 45.190166 ], [ -92.766808, 45.185466 ], [ -92.764872, 45.182812 ], [ -92.752404, 45.173916 ], [ -92.752542, 45.171772 ], [ -92.756907, 45.165166 ], [ -92.757775, 45.160519 ], [ -92.757707, 45.155466 ], [ -92.756807, 45.151866 ], [ -92.749427, 45.138117 ], [ -92.745694, 45.123112 ], [ -92.742925, 45.119918 ], [ -92.740611, 45.118454 ], [ -92.739528, 45.116515 ], [ -92.739584, 45.115598 ], [ -92.740509, 45.113396 ], [ -92.744938, 45.108309 ], [ -92.746749, 45.107051 ], [ -92.754387, 45.103146 ], [ -92.765602, 45.095730 ], [ -92.774010, 45.089138 ], [ -92.791528, 45.079647 ], [ -92.800851, 45.069477 ], [ -92.802163, 45.067555 ], [ -92.802911, 45.065403 ], [ -92.803079, 45.060978 ], [ -92.802056, 45.057423 ], [ -92.797081, 45.050648 ], [ -92.793282, 45.047178 ], [ -92.787910, 45.043516 ], [ -92.778815, 45.039327 ], [ -92.770362, 45.033803 ], [ -92.764604, 45.028767 ], [ -92.762060, 45.024320 ], [ -92.761904, 45.022467 ], [ -92.762533, 45.020551 ], [ -92.768118, 45.009115 ], [ -92.771231, 45.001378 ], [ -92.770834, 44.994131 ], [ -92.769049, 44.988195 ], [ -92.770346, 44.983327 ], [ -92.770304, 44.978967 ], [ -92.769445, 44.972150 ], [ -92.768545, 44.969839 ], [ -92.767218, 44.968084 ], [ -92.760701, 44.964979 ], [ -92.754603, 44.955767 ], [ -92.750802, 44.941567 ], [ -92.750645, 44.937299 ], [ -92.757557, 44.911214 ], [ -92.758701, 44.908979 ], [ -92.759556, 44.907857 ], [ -92.761341, 44.906904 ], [ -92.773103, 44.901367 ], [ -92.774022, 44.900083 ], [ -92.774571, 44.898084 ], [ -92.774907, 44.892797 ], [ -92.773946, 44.889997 ], [ -92.769603, 44.882967 ], [ -92.764133, 44.875905 ], [ -92.763402, 44.874167 ], [ -92.763706, 44.872129 ], [ -92.767102, 44.866767 ], [ -92.769102, 44.862167 ], [ -92.768574, 44.854368 ], [ -92.765278, 44.841070 ], [ -92.765278, 44.837186 ], [ -92.766102, 44.834966 ], [ -92.769367, 44.831800 ], [ -92.772266, 44.828046 ], [ -92.772663, 44.826337 ], [ -92.771902, 44.823067 ], [ -92.772663, 44.821424 ], [ -92.780430, 44.812589 ], [ -92.781498, 44.809408 ], [ -92.782963, 44.798131 ], [ -92.785206, 44.792303 ], [ -92.788776, 44.787794 ], [ -92.796039, 44.782056 ], [ -92.800313, 44.777379 ], [ -92.805287, 44.768361 ], [ -92.807362, 44.758909 ], [ -92.807988, 44.751470 ], [ -92.807317, 44.750364 ], [ -92.804035, 44.748433 ], [ -92.802875, 44.746847 ], [ -92.802402, 44.745167 ], [ -92.787906, 44.737432 ], [ -92.766054, 44.729604 ], [ -92.756990, 44.723829 ], [ -92.754200, 44.722767 ], [ -92.750200, 44.722120 ], [ -92.737259, 44.717155 ], [ -92.713198, 44.701085 ], [ -92.700948, 44.693751 ], [ -92.696491, 44.689436 ], [ -92.686511, 44.682096 ], [ -92.664699, 44.663380 ], [ -92.660988, 44.660884 ], [ -92.655807, 44.658040 ], [ -92.632105, 44.649027 ], [ -92.621733, 44.638983 ], [ -92.619779, 44.634195 ], [ -92.619774, 44.629214 ], [ -92.622571, 44.623518 ], [ -92.623348, 44.620713 ], [ -92.623163, 44.618224 ], [ -92.621456, 44.615017 ], [ -92.618025, 44.612870 ], [ -92.614569, 44.611730 ], [ -92.607141, 44.612433 ], [ -92.601516, 44.612052 ], [ -92.590467, 44.605936 ], [ -92.588797, 44.601698 ], [ -92.586216, 44.600088 ], [ -92.584711, 44.599861 ], [ -92.581591, 44.600863 ], [ -92.578850, 44.603939 ], [ -92.577148, 44.605054 ], [ -92.572943, 44.604649 ], [ -92.569434, 44.603539 ], [ -92.567226, 44.601770 ], [ -92.560796, 44.594956 ], [ -92.549777, 44.581130 ], [ -92.549280, 44.577704 ], [ -92.549685, 44.576000 ], [ -92.551182, 44.573449 ], [ -92.551510, 44.571607 ], [ -92.549957, 44.568988 ], [ -92.548060, 44.567792 ], [ -92.544346, 44.566986 ], [ -92.540551, 44.567258 ], [ -92.527337, 44.573554 ], [ -92.520878, 44.575200 ], [ -92.518358, 44.575183 ], [ -92.512564, 44.571801 ], [ -92.508759, 44.570325 ], [ -92.493808, 44.566063 ], [ -92.490472, 44.566205 ], [ -92.484740, 44.568067 ], [ -92.481001, 44.568276 ], [ -92.470209, 44.565036 ], [ -92.455105, 44.561886 ], [ -92.440745, 44.562833 ], [ -92.433256, 44.565500 ], [ -92.431101, 44.565786 ], [ -92.425774, 44.564602 ], [ -92.420702, 44.562041 ], [ -92.415089, 44.560359 ], [ -92.399281, 44.558292 ], [ -92.389040, 44.557697 ], [ -92.368298, 44.559182 ], [ -92.361518, 44.558935 ], [ -92.347567, 44.557149 ], [ -92.336114, 44.554004 ], [ -92.329013, 44.550895 ], [ -92.319938, 44.544940 ], [ -92.317357, 44.542512 ], [ -92.314071, 44.538014 ], [ -92.310827, 44.528756 ], [ -92.307957, 44.524475 ], [ -92.303527, 44.519822 ], [ -92.303046, 44.518646 ], [ -92.302466, 44.516487 ], [ -92.302961, 44.503601 ], [ -92.302215, 44.500298 ], [ -92.297122, 44.492732 ], [ -92.291005, 44.485464 ], [ -92.282364, 44.477707 ], [ -92.276784, 44.473649 ], [ -92.262476, 44.465149 ], [ -92.249071, 44.459524 ], [ -92.244884, 44.456842 ], [ -92.242010, 44.454254 ], [ -92.237325, 44.449417 ], [ -92.232472, 44.445434 ], [ -92.221083, 44.440386 ], [ -92.215163, 44.438503 ], [ -92.195378, 44.433792 ], [ -92.170280, 44.428598 ], [ -92.162454, 44.427208 ], [ -92.139569, 44.424673 ], [ -92.124513, 44.422115 ], [ -92.121106, 44.420572 ], [ -92.115296, 44.416056 ], [ -92.111085, 44.413948 ], [ -92.097415, 44.411464 ], [ -92.087241, 44.408848 ], [ -92.078605, 44.404869 ], [ -92.072267, 44.404017 ], [ -92.061637, 44.404124 ], [ -92.056486, 44.402729 ], [ -92.053549, 44.401375 ], [ -92.046285, 44.394398 ], [ -92.038147, 44.388731 ], [ -92.019313, 44.381217 ], [ -92.008589, 44.379626 ], [ -92.006179, 44.378825 ], [ -92.002838, 44.377118 ], [ -92.000165, 44.374966 ], [ -91.993984, 44.371800 ], [ -91.987289, 44.369119 ], [ -91.983974, 44.368448 ], [ -91.978574, 44.368372 ], [ -91.974922, 44.367516 ], [ -91.970266, 44.365842 ], [ -91.963600, 44.362112 ], [ -91.959523, 44.359404 ], [ -91.952820, 44.352982 ], [ -91.949599, 44.348796 ], [ -91.941311, 44.340978 ], [ -91.928224, 44.335473 ], [ -91.925590, 44.333548 ], [ -91.918625, 44.322671 ], [ -91.916191, 44.318094 ], [ -91.913534, 44.311392 ], [ -91.913574, 44.310392 ], [ -91.914360, 44.308230 ], [ -91.921028, 44.301069 ], [ -91.924102, 44.297095 ], [ -91.924975, 44.294819 ], [ -91.924613, 44.291815 ], [ -91.922205, 44.287811 ], [ -91.920282, 44.286496 ], [ -91.905789, 44.281614 ], [ -91.898697, 44.277172 ], [ -91.896388, 44.274690 ], [ -91.895652, 44.273008 ], [ -91.896760, 44.265447 ], [ -91.896008, 44.262871 ], [ -91.889132, 44.256060 ], [ -91.887824, 44.254171 ], [ -91.887040, 44.251772 ], [ -91.887905, 44.246398 ], [ -91.892963, 44.235149 ], [ -91.892698, 44.231105 ], [ -91.889790, 44.226286 ], [ -91.880265, 44.216555 ], [ -91.877429, 44.212921 ], [ -91.876356, 44.209575 ], [ -91.876056, 44.202728 ], [ -91.875158, 44.200575 ], [ -91.872369, 44.199167 ], [ -91.864387, 44.196574 ], [ -91.844754, 44.184878 ], [ -91.832479, 44.180308 ], [ -91.829167, 44.178350 ], [ -91.817302, 44.164235 ], [ -91.808064, 44.159262 ], [ -91.796669, 44.154335 ], [ -91.774486, 44.147539 ], [ -91.768574, 44.143508 ], [ -91.756719, 44.136804 ], [ -91.751747, 44.134786 ], [ -91.730648, 44.132900 ], [ -91.721552, 44.130342 ], [ -91.719097, 44.128853 ], [ -91.710597, 44.120480 ], [ -91.709476, 44.117565 ], [ -91.708082, 44.110929 ], [ -91.708207, 44.105186 ], [ -91.707491, 44.103906 ], [ -91.695310, 44.098570 ], [ -91.691281, 44.097858 ], [ -91.685748, 44.098419 ], [ -91.681530, 44.097400 ], [ -91.667006, 44.086964 ], [ -91.665263, 44.085041 ], [ -91.663442, 44.080910 ], [ -91.659511, 44.074203 ], [ -91.657000, 44.071409 ], [ -91.652247, 44.068634 ], [ -91.647873, 44.064109 ], [ -91.644717, 44.062782 ], [ -91.643400, 44.062711 ], [ -91.640535, 44.063679 ], [ -91.638115, 44.063285 ], [ -91.633365, 44.060364 ], [ -91.627900, 44.055807 ], [ -91.623784, 44.054106 ], [ -91.615375, 44.051598 ], [ -91.610487, 44.049310 ], [ -91.607339, 44.047357 ], [ -91.603550, 44.043681 ], [ -91.597617, 44.034965 ], [ -91.592070, 44.031372 ], [ -91.582604, 44.027381 ], [ -91.580019, 44.026925 ], [ -91.573283, 44.026901 ], [ -91.559004, 44.025315 ], [ -91.547028, 44.022226 ], [ -91.533778, 44.021433 ], [ -91.524315, 44.021433 ], [ -91.507121, 44.018980 ], [ -91.502163, 44.016856 ], [ -91.494988, 44.012536 ], [ -91.480870, 44.008145 ], [ -91.478498, 44.008030 ], [ -91.468472, 44.009480 ], [ -91.463515, 44.009041 ], [ -91.457378, 44.006301 ], [ -91.440536, 44.001501 ], [ -91.437380, 43.999962 ], [ -91.432522, 43.996827 ], [ -91.429878, 43.993888 ], [ -91.426720, 43.988500 ], [ -91.425681, 43.985113 ], [ -91.424134, 43.982631 ], [ -91.412491, 43.973411 ], [ -91.410555, 43.970892 ], [ -91.407395, 43.965148 ], [ -91.406011, 43.963929 ], [ -91.395086, 43.959409 ], [ -91.385785, 43.954239 ], [ -91.375142, 43.944289 ], [ -91.366642, 43.937463 ], [ -91.364736, 43.934884 ], [ -91.363242, 43.926563 ], [ -91.357426, 43.917231 ], [ -91.356741, 43.916564 ], [ -91.351688, 43.914545 ], [ -91.347741, 43.911964 ], [ -91.346271, 43.910074 ], [ -91.342335, 43.902697 ], [ -91.338141, 43.897664 ], [ -91.328143, 43.893435 ], [ -91.320605, 43.888491 ], [ -91.315310, 43.881808 ], [ -91.313037, 43.875757 ], [ -91.310991, 43.867381 ], [ -91.301302, 43.859515 ], [ -91.298815, 43.856555 ], [ -91.296739, 43.855165 ], [ -91.291002, 43.852733 ], [ -91.284138, 43.847065 ], [ -91.281968, 43.842738 ], [ -91.277695, 43.837741 ], [ -91.275737, 43.824866 ], [ -91.273037, 43.818566 ], [ -91.272037, 43.813766 ], [ -91.267436, 43.804166 ], [ -91.264436, 43.800366 ], [ -91.262436, 43.792166 ], [ -91.244135, 43.774667 ], [ -91.243955, 43.773046 ], [ -91.255431, 43.744876 ], [ -91.254903, 43.733533 ], [ -91.255932, 43.729849 ], [ -91.258756, 43.723426 ], [ -91.261316, 43.719490 ], [ -91.266538, 43.713947 ], [ -91.268455, 43.709824 ], [ -91.267792, 43.695652 ], [ -91.272741, 43.676609 ], [ -91.273252, 43.666623 ], [ -91.271749, 43.654929 ], [ -91.270767, 43.653080 ], [ -91.265051, 43.649141 ], [ -91.263856, 43.647662 ], [ -91.262397, 43.641760 ], [ -91.263178, 43.638203 ], [ -91.268457, 43.627352 ], [ -91.268748, 43.615348 ], [ -91.265091, 43.609977 ], [ -91.261631, 43.606175 ], [ -91.258267, 43.603484 ], [ -91.252926, 43.600363 ], [ -91.239109, 43.589760 ], [ -91.234499, 43.585529 ], [ -91.232707, 43.583533 ], [ -91.231865, 43.581822 ], [ -91.231490, 43.575595 ], [ -91.232812, 43.564842 ], [ -91.234432, 43.561781 ], [ -91.240649, 43.554995 ], [ -91.243214, 43.550722 ], [ -91.243820, 43.549130 ], [ -91.244093, 43.545620 ], [ -91.243183, 43.540309 ], [ -91.236725, 43.532930 ], [ -91.232941, 43.523967 ], [ -91.230027, 43.521595 ], [ -91.222613, 43.517892 ], [ -91.218292, 43.514434 ], [ -91.217353, 43.512474 ], [ -91.217876, 43.508104 ], [ -91.217706, 43.500550 ], [ -91.246715, 43.500488 ], [ -91.261781, 43.500993 ], [ -91.369325, 43.500827 ], [ -91.371608, 43.500945 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US28", "STATE": "28", "NAME": "Mississippi", "LSAD": "", "CENSUSAREA": 46923.274000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -88.710719, 30.250799 ], [ -88.656804, 30.233956 ], [ -88.573044, 30.222640 ], [ -88.568056, 30.222732 ], [ -88.562067, 30.227476 ], [ -88.565576, 30.222847 ], [ -88.569138, 30.221357 ], [ -88.587424, 30.219154 ], [ -88.633743, 30.226342 ], [ -88.665857, 30.228847 ], [ -88.711830, 30.242662 ], [ -88.740647, 30.238665 ], [ -88.752782, 30.238803 ], [ -88.764022, 30.241488 ], [ -88.771991, 30.245523 ], [ -88.732550, 30.246322 ], [ -88.718104, 30.252931 ], [ -88.710719, 30.250799 ] ] ], [ [ [ -88.900370, 30.224576 ], [ -88.909752, 30.220405 ], [ -88.945498, 30.209646 ], [ -88.974672, 30.207391 ], [ -88.980239, 30.207962 ], [ -88.984249, 30.210320 ], [ -88.982219, 30.211627 ], [ -88.976811, 30.210987 ], [ -88.947872, 30.214179 ], [ -88.920511, 30.220578 ], [ -88.908885, 30.225437 ], [ -88.889797, 30.239665 ], [ -88.877824, 30.242442 ], [ -88.873660, 30.241748 ], [ -88.900370, 30.224576 ] ] ], [ [ [ -89.095623, 30.231767 ], [ -89.077259, 30.231680 ], [ -89.067128, 30.250199 ], [ -89.063989, 30.246299 ], [ -89.065097, 30.239929 ], [ -89.073538, 30.223318 ], [ -89.091469, 30.202305 ], [ -89.118222, 30.223343 ], [ -89.156738, 30.230699 ], [ -89.095623, 30.231767 ] ] ], [ [ [ -88.506999, 30.214348 ], [ -88.500011, 30.214044 ], [ -88.465713, 30.202540 ], [ -88.453444, 30.201236 ], [ -88.442654, 30.202314 ], [ -88.430332, 30.208548 ], [ -88.401466, 30.210172 ], [ -88.404581, 30.206162 ], [ -88.428301, 30.198511 ], [ -88.453654, 30.196584 ], [ -88.493523, 30.205945 ], [ -88.502752, 30.210506 ], [ -88.506999, 30.214348 ] ] ], [ [ [ -88.395023, 30.369425 ], [ -88.397236, 30.367689 ], [ -88.399062, 30.360744 ], [ -88.397082, 30.354785 ], [ -88.394150, 30.352493 ], [ -88.393980, 30.349307 ], [ -88.401181, 30.344382 ], [ -88.409927, 30.342115 ], [ -88.418811, 30.353911 ], [ -88.433891, 30.354652 ], [ -88.446495, 30.347753 ], [ -88.446625, 30.337671 ], [ -88.453810, 30.329626 ], [ -88.471875, 30.320020 ], [ -88.480117, 30.318345 ], [ -88.504802, 30.321472 ], [ -88.506226, 30.322393 ], [ -88.506334, 30.327398 ], [ -88.522494, 30.340092 ], [ -88.536214, 30.343299 ], [ -88.579483, 30.344190 ], [ -88.596349, 30.358365 ], [ -88.599249, 30.358933 ], [ -88.601762, 30.355876 ], [ -88.613745, 30.353108 ], [ -88.624523, 30.358713 ], [ -88.663820, 30.362099 ], [ -88.679575, 30.355710 ], [ -88.692164, 30.347302 ], [ -88.700587, 30.343689 ], [ -88.714077, 30.342186 ], [ -88.728893, 30.342671 ], [ -88.746945, 30.347622 ], [ -88.771742, 30.365403 ], [ -88.811615, 30.384907 ], [ -88.812576, 30.387680 ], [ -88.810127, 30.391298 ], [ -88.810227, 30.394698 ], [ -88.823724, 30.402376 ], [ -88.841328, 30.409598 ], [ -88.857828, 30.392898 ], [ -88.826600, 30.368721 ], [ -88.818411, 30.360239 ], [ -88.884829, 30.391998 ], [ -88.893930, 30.393398 ], [ -88.922031, 30.393798 ], [ -88.971233, 30.390798 ], [ -89.016334, 30.383898 ], [ -89.083237, 30.368097 ], [ -89.186840, 30.331197 ], [ -89.220442, 30.322497 ], [ -89.271833, 30.305491 ], [ -89.285744, 30.303097 ], [ -89.291444, 30.303296 ], [ -89.294444, 30.307596 ], [ -89.291844, 30.328096 ], [ -89.287844, 30.333196 ], [ -89.281564, 30.331980 ], [ -89.279818, 30.349790 ], [ -89.292499, 30.365635 ], [ -89.315067, 30.375408 ], [ -89.335942, 30.374016 ], [ -89.349447, 30.370995 ], [ -89.353248, 30.368795 ], [ -89.363848, 30.357395 ], [ -89.366116, 30.352169 ], [ -89.345934, 30.343573 ], [ -89.338847, 30.342995 ], [ -89.332546, 30.337895 ], [ -89.322345, 30.319296 ], [ -89.322545, 30.314896 ], [ -89.329946, 30.302896 ], [ -89.344746, 30.293196 ], [ -89.358546, 30.288896 ], [ -89.365747, 30.284896 ], [ -89.379547, 30.270396 ], [ -89.383747, 30.267796 ], [ -89.419348, 30.254320 ], [ -89.424624, 30.245391 ], [ -89.424493, 30.239092 ], [ -89.430428, 30.223218 ], [ -89.447465, 30.205098 ], [ -89.447910, 30.185352 ], [ -89.461275, 30.174745 ], [ -89.463595, 30.173943 ], [ -89.469792, 30.176278 ], [ -89.475824, 30.191561 ], [ -89.480214, 30.193751 ], [ -89.490099, 30.187677 ], [ -89.503231, 30.183051 ], [ -89.522814, 30.183076 ], [ -89.524504, 30.180753 ], [ -89.527952, 30.188697 ], [ -89.530452, 30.192197 ], [ -89.533352, 30.194797 ], [ -89.538652, 30.195797 ], [ -89.541453, 30.195397 ], [ -89.546953, 30.193097 ], [ -89.549053, 30.191597 ], [ -89.550853, 30.189197 ], [ -89.554653, 30.185797 ], [ -89.562253, 30.182397 ], [ -89.570154, 30.180297 ], [ -89.574454, 30.181697 ], [ -89.580754, 30.186197 ], [ -89.585754, 30.192096 ], [ -89.587354, 30.195196 ], [ -89.588854, 30.200296 ], [ -89.596655, 30.211796 ], [ -89.601255, 30.216096 ], [ -89.607655, 30.217096 ], [ -89.610655, 30.218096 ], [ -89.612556, 30.219496 ], [ -89.615856, 30.223195 ], [ -89.616956, 30.225595 ], [ -89.617056, 30.227495 ], [ -89.615856, 30.235295 ], [ -89.614056, 30.241495 ], [ -89.614156, 30.244595 ], [ -89.616156, 30.247395 ], [ -89.623856, 30.249895 ], [ -89.626922, 30.251745 ], [ -89.631789, 30.256924 ], [ -89.632225, 30.260137 ], [ -89.631215, 30.261704 ], [ -89.630649, 30.262084 ], [ -89.629757, 30.267195 ], [ -89.630520, 30.276562 ], [ -89.631411, 30.279662 ], [ -89.637647, 30.285032 ], [ -89.643440, 30.287682 ], [ -89.641705, 30.303799 ], [ -89.640401, 30.306755 ], [ -89.639872, 30.307281 ], [ -89.634208, 30.308256 ], [ -89.631643, 30.309332 ], [ -89.626221, 30.314255 ], [ -89.626606, 30.315457 ], [ -89.629877, 30.321017 ], [ -89.630399, 30.332933 ], [ -89.629727, 30.339287 ], [ -89.636299, 30.343970 ], [ -89.645199, 30.348126 ], [ -89.645617, 30.351314 ], [ -89.646700, 30.352500 ], [ -89.652693, 30.355536 ], [ -89.657191, 30.356515 ], [ -89.660274, 30.363487 ], [ -89.662204, 30.371267 ], [ -89.670134, 30.382429 ], [ -89.672762, 30.389276 ], [ -89.679153, 30.399991 ], [ -89.683686, 30.405873 ], [ -89.684118, 30.412646 ], [ -89.682320, 30.412991 ], [ -89.681165, 30.411492 ], [ -89.680134, 30.411400 ], [ -89.678514, 30.414012 ], [ -89.680515, 30.428924 ], [ -89.681946, 30.434073 ], [ -89.683521, 30.434959 ], [ -89.684816, 30.439511 ], [ -89.682829, 30.445810 ], [ -89.683410, 30.451793 ], [ -89.690102, 30.459657 ], [ -89.695864, 30.463269 ], [ -89.701799, 30.465115 ], [ -89.705538, 30.472350 ], [ -89.709551, 30.477853 ], [ -89.710164, 30.478308 ], [ -89.712493, 30.477510 ], [ -89.715886, 30.477797 ], [ -89.719652, 30.483166 ], [ -89.721181, 30.488608 ], [ -89.724614, 30.491902 ], [ -89.726154, 30.492560 ], [ -89.734615, 30.494723 ], [ -89.742396, 30.497316 ], [ -89.742816, 30.498704 ], [ -89.746435, 30.502619 ], [ -89.752931, 30.502493 ], [ -89.758133, 30.505404 ], [ -89.758575, 30.505942 ], [ -89.758862, 30.513062 ], [ -89.760570, 30.515761 ], [ -89.768133, 30.515020 ], [ -89.769996, 30.521896 ], [ -89.770744, 30.527819 ], [ -89.771643, 30.530249 ], [ -89.775355, 30.538848 ], [ -89.779565, 30.544345 ], [ -89.780246, 30.544607 ], [ -89.783994, 30.544075 ], [ -89.788542, 30.544464 ], [ -89.791046, 30.545046 ], [ -89.793818, 30.545935 ], [ -89.795335, 30.546563 ], [ -89.795388, 30.547452 ], [ -89.795231, 30.548132 ], [ -89.793989, 30.548283 ], [ -89.791960, 30.548788 ], [ -89.791664, 30.551524 ], [ -89.794532, 30.556554 ], [ -89.802789, 30.557903 ], [ -89.803831, 30.558888 ], [ -89.803887, 30.560581 ], [ -89.802833, 30.562879 ], [ -89.801494, 30.563703 ], [ -89.800277, 30.563695 ], [ -89.796697, 30.561718 ], [ -89.792430, 30.563087 ], [ -89.790078, 30.565333 ], [ -89.789695, 30.566580 ], [ -89.790318, 30.567524 ], [ -89.794495, 30.569653 ], [ -89.799947, 30.569351 ], [ -89.803753, 30.568148 ], [ -89.806182, 30.567543 ], [ -89.808027, 30.567998 ], [ -89.808184, 30.568795 ], [ -89.806843, 30.572039 ], [ -89.809739, 30.584714 ], [ -89.807762, 30.585825 ], [ -89.807118, 30.587337 ], [ -89.812109, 30.591473 ], [ -89.816396, 30.591646 ], [ -89.818527, 30.592688 ], [ -89.819838, 30.595340 ], [ -89.819696, 30.596785 ], [ -89.817202, 30.600891 ], [ -89.814563, 30.606152 ], [ -89.813920, 30.607721 ], [ -89.815380, 30.608566 ], [ -89.816905, 30.608620 ], [ -89.821286, 30.607130 ], [ -89.823278, 30.608230 ], [ -89.822389, 30.614462 ], [ -89.820868, 30.618254 ], [ -89.821424, 30.619815 ], [ -89.823261, 30.622803 ], [ -89.818081, 30.634019 ], [ -89.821868, 30.644024 ], [ -89.824986, 30.649423 ], [ -89.833261, 30.657516 ], [ -89.836047, 30.657298 ], [ -89.840988, 30.658515 ], [ -89.851889, 30.661199 ], [ -89.852263, 30.662934 ], [ -89.850550, 30.664781 ], [ -89.848879, 30.665202 ], [ -89.846917, 30.663952 ], [ -89.845642, 30.663569 ], [ -89.843355, 30.663699 ], [ -89.838804, 30.669090 ], [ -89.837894, 30.672514 ], [ -89.838868, 30.673731 ], [ -89.840597, 30.672880 ], [ -89.841350, 30.671963 ], [ -89.842344, 30.669724 ], [ -89.843816, 30.668761 ], [ -89.845807, 30.668931 ], [ -89.847201, 30.670038 ], [ -89.844965, 30.674691 ], [ -89.836797, 30.690573 ], [ -89.835478, 30.691166 ], [ -89.835848, 30.699555 ], [ -89.838065, 30.704036 ], [ -89.839312, 30.704143 ], [ -89.841730, 30.702713 ], [ -89.843605, 30.702511 ], [ -89.845926, 30.704157 ], [ -89.846576, 30.706209 ], [ -89.845801, 30.707314 ], [ -89.836257, 30.716185 ], [ -89.831961, 30.715384 ], [ -89.830060, 30.716310 ], [ -89.828061, 30.725018 ], [ -89.833065, 30.726759 ], [ -89.836331, 30.727197 ], [ -89.836945, 30.728201 ], [ -89.836870, 30.734661 ], [ -89.835437, 30.736260 ], [ -89.833818, 30.736972 ], [ -89.826175, 30.736594 ], [ -89.821535, 30.736618 ], [ -89.817480, 30.737305 ], [ -89.816499, 30.737946 ], [ -89.816075, 30.739366 ], [ -89.816764, 30.740076 ], [ -89.819548, 30.740671 ], [ -89.823492, 30.740988 ], [ -89.826053, 30.742322 ], [ -89.825774, 30.747305 ], [ -89.827886, 30.758419 ], [ -89.831537, 30.767610 ], [ -89.824395, 30.779629 ], [ -89.821130, 30.788609 ], [ -89.821486, 30.791183 ], [ -89.821078, 30.792523 ], [ -89.819164, 30.795229 ], [ -89.817559, 30.796054 ], [ -89.816418, 30.796054 ], [ -89.813946, 30.793782 ], [ -89.813535, 30.792035 ], [ -89.812610, 30.789876 ], [ -89.812096, 30.788437 ], [ -89.810657, 30.788026 ], [ -89.806763, 30.789069 ], [ -89.805107, 30.790596 ], [ -89.804696, 30.791624 ], [ -89.804901, 30.792549 ], [ -89.806237, 30.793371 ], [ -89.807071, 30.793908 ], [ -89.808601, 30.794913 ], [ -89.810863, 30.797379 ], [ -89.811479, 30.797996 ], [ -89.811171, 30.798921 ], [ -89.810143, 30.799846 ], [ -89.808176, 30.800562 ], [ -89.804632, 30.802511 ], [ -89.804065, 30.803247 ], [ -89.800422, 30.810425 ], [ -89.799673, 30.815172 ], [ -89.800049, 30.819078 ], [ -89.798654, 30.820855 ], [ -89.797491, 30.821478 ], [ -89.796634, 30.821648 ], [ -89.791745, 30.820387 ], [ -89.785894, 30.815962 ], [ -89.782404, 30.817975 ], [ -89.781168, 30.820123 ], [ -89.783985, 30.827385 ], [ -89.786837, 30.830642 ], [ -89.789426, 30.830470 ], [ -89.790432, 30.830985 ], [ -89.790805, 30.832131 ], [ -89.790121, 30.837983 ], [ -89.787500, 30.844112 ], [ -89.782649, 30.845264 ], [ -89.780600, 30.845508 ], [ -89.780228, 30.846235 ], [ -89.780947, 30.848542 ], [ -89.783791, 30.852131 ], [ -89.784416, 30.853744 ], [ -89.784073, 30.855270 ], [ -89.783384, 30.856022 ], [ -89.781643, 30.856613 ], [ -89.778755, 30.855800 ], [ -89.774739, 30.853254 ], [ -89.772587, 30.853660 ], [ -89.771722, 30.854677 ], [ -89.767955, 30.863858 ], [ -89.767789, 30.865577 ], [ -89.768237, 30.866392 ], [ -89.778005, 30.873411 ], [ -89.779194, 30.875185 ], [ -89.778583, 30.878903 ], [ -89.777110, 30.881088 ], [ -89.775458, 30.881497 ], [ -89.770027, 30.882254 ], [ -89.772011, 30.890240 ], [ -89.773553, 30.896862 ], [ -89.773099, 30.898338 ], [ -89.771986, 30.899127 ], [ -89.770269, 30.899390 ], [ -89.765101, 30.896919 ], [ -89.760701, 30.896306 ], [ -89.758719, 30.897319 ], [ -89.757024, 30.898947 ], [ -89.756671, 30.901069 ], [ -89.759803, 30.906216 ], [ -89.761593, 30.906591 ], [ -89.763622, 30.907732 ], [ -89.764451, 30.910276 ], [ -89.764202, 30.911906 ], [ -89.762600, 30.913736 ], [ -89.759403, 30.915134 ], [ -89.757417, 30.914993 ], [ -89.754086, 30.912800 ], [ -89.750073, 30.912930 ], [ -89.746718, 30.915805 ], [ -89.744789, 30.918933 ], [ -89.744448, 30.920577 ], [ -89.745161, 30.922416 ], [ -89.748208, 30.923369 ], [ -89.750073, 30.929815 ], [ -89.748851, 30.932816 ], [ -89.748897, 30.933888 ], [ -89.750073, 30.935763 ], [ -89.755835, 30.939543 ], [ -89.756554, 30.941949 ], [ -89.756333, 30.943498 ], [ -89.751196, 30.951439 ], [ -89.743592, 30.958482 ], [ -89.743134, 30.959993 ], [ -89.735686, 30.966573 ], [ -89.733933, 30.966919 ], [ -89.731393, 30.966130 ], [ -89.729327, 30.966242 ], [ -89.728041, 30.966518 ], [ -89.727072, 30.967395 ], [ -89.727086, 30.969707 ], [ -89.728382, 30.971141 ], [ -89.736086, 30.974446 ], [ -89.737149, 30.976081 ], [ -89.736883, 30.977122 ], [ -89.735912, 30.977865 ], [ -89.732168, 30.978088 ], [ -89.730501, 30.979707 ], [ -89.729930, 30.982090 ], [ -89.727698, 30.993329 ], [ -89.728563, 30.994396 ], [ -89.732035, 30.994409 ], [ -89.734227, 30.995602 ], [ -89.735540, 30.999715 ], [ -89.730000, 30.999749 ], [ -89.728126, 31.000956 ], [ -89.728147, 31.002431 ], [ -89.729616, 31.003927 ], [ -89.732504, 31.004831 ], [ -89.741821, 31.003441 ], [ -89.745215, 31.002252 ], [ -89.747229, 31.000184 ], [ -89.749189, 30.999555 ], [ -89.751481, 30.999690 ], [ -89.752133, 31.000183 ], [ -89.752642, 31.001853 ], [ -89.816429, 31.002084 ], [ -89.824617, 31.002060 ], [ -89.835542, 31.002059 ], [ -89.856862, 31.002075 ], [ -89.892708, 31.001759 ], [ -89.897516, 31.001913 ], [ -89.923119, 31.001446 ], [ -89.927161, 31.001437 ], [ -89.972802, 31.001392 ], [ -89.975430, 31.001692 ], [ -90.005332, 31.001364 ], [ -90.022185, 31.001302 ], [ -90.029574, 31.001190 ], [ -90.050706, 31.001215 ], [ -90.128406, 31.001047 ], [ -90.131395, 31.000924 ], [ -90.164278, 31.001025 ], [ -90.164676, 31.000980 ], [ -90.346007, 31.000363 ], [ -90.347230, 31.000359 ], [ -90.369371, 31.000335 ], [ -90.380536, 30.999872 ], [ -90.422117, 30.999810 ], [ -90.426849, 30.999776 ], [ -90.437351, 30.999730 ], [ -90.441725, 30.999729 ], [ -90.442479, 30.999722 ], [ -90.474094, 30.999798 ], [ -90.475928, 30.999740 ], [ -90.477284, 30.999717 ], [ -90.485876, 30.999740 ], [ -90.486749, 30.999693 ], [ -90.567195, 30.999733 ], [ -90.583518, 30.999698 ], [ -90.584448, 30.999698 ], [ -90.587373, 30.999604 ], [ -90.588676, 30.999650 ], [ -90.648721, 30.999486 ], [ -90.651193, 30.999510 ], [ -90.734473, 30.999214 ], [ -90.734552, 30.999222 ], [ -90.758775, 30.999583 ], [ -90.769333, 30.999374 ], [ -90.775981, 30.999491 ], [ -90.779858, 30.999457 ], [ -90.783745, 30.999447 ], [ -90.826027, 30.999360 ], [ -90.894730, 30.999630 ], [ -91.068270, 30.998920 ], [ -91.080814, 30.998909 ], [ -91.108114, 30.998857 ], [ -91.108291, 30.998880 ], [ -91.176209, 30.999144 ], [ -91.224068, 30.999183 ], [ -91.224839, 30.999183 ], [ -91.246490, 30.999474 ], [ -91.423621, 30.998984 ], [ -91.425749, 30.999007 ], [ -91.497390, 30.999006 ], [ -91.500116, 30.998691 ], [ -91.538727, 30.999388 ], [ -91.625118, 30.999167 ], [ -91.636942, 30.999416 ], [ -91.625118, 31.005374 ], [ -91.606490, 31.011216 ], [ -91.590463, 31.017270 ], [ -91.578413, 31.024030 ], [ -91.571695, 31.029782 ], [ -91.564397, 31.038965 ], [ -91.561232, 31.046225 ], [ -91.560365, 31.049508 ], [ -91.559907, 31.054119 ], [ -91.561283, 31.060906 ], [ -91.564150, 31.066830 ], [ -91.567648, 31.070186 ], [ -91.594693, 31.091444 ], [ -91.609523, 31.101557 ], [ -91.614763, 31.104357 ], [ -91.618570, 31.107328 ], [ -91.621535, 31.110257 ], [ -91.625994, 31.116896 ], [ -91.626476, 31.119125 ], [ -91.625707, 31.128763 ], [ -91.625118, 31.131879 ], [ -91.624217, 31.133729 ], [ -91.621671, 31.136870 ], [ -91.604197, 31.154545 ], [ -91.599732, 31.159592 ], [ -91.597062, 31.163492 ], [ -91.591502, 31.173118 ], [ -91.589046, 31.178586 ], [ -91.588695, 31.181025 ], [ -91.588939, 31.188959 ], [ -91.590051, 31.193693 ], [ -91.595029, 31.201969 ], [ -91.601616, 31.208573 ], [ -91.625119, 31.226071 ], [ -91.644356, 31.234414 ], [ -91.652019, 31.242691 ], [ -91.654907, 31.250175 ], [ -91.655009, 31.251815 ], [ -91.654027, 31.255753 ], [ -91.651369, 31.259528 ], [ -91.648669, 31.262238 ], [ -91.641253, 31.266917 ], [ -91.637672, 31.267680 ], [ -91.621358, 31.267811 ], [ -91.606672, 31.265900 ], [ -91.587749, 31.262563 ], [ -91.574493, 31.261289 ], [ -91.564192, 31.261633 ], [ -91.553905, 31.263050 ], [ -91.537734, 31.267369 ], [ -91.518578, 31.275283 ], [ -91.515614, 31.278210 ], [ -91.512085, 31.284177 ], [ -91.508858, 31.291644 ], [ -91.508296, 31.295829 ], [ -91.507977, 31.312943 ], [ -91.508660, 31.315131 ], [ -91.510049, 31.316822 ], [ -91.518509, 31.323332 ], [ -91.531657, 31.331801 ], [ -91.533206, 31.333225 ], [ -91.536061, 31.338355 ], [ -91.545617, 31.343762 ], [ -91.548967, 31.347255 ], [ -91.548894, 31.353998 ], [ -91.550869, 31.360574 ], [ -91.551002, 31.363645 ], [ -91.549915, 31.376315 ], [ -91.546607, 31.381198 ], [ -91.546207, 31.382480 ], [ -91.552432, 31.385658 ], [ -91.555680, 31.386413 ], [ -91.560524, 31.384559 ], [ -91.562555, 31.383219 ], [ -91.568953, 31.377629 ], [ -91.571234, 31.384664 ], [ -91.573931, 31.390886 ], [ -91.578334, 31.399067 ], [ -91.578246, 31.403859 ], [ -91.576265, 31.410498 ], [ -91.570092, 31.419487 ], [ -91.565179, 31.423447 ], [ -91.554805, 31.428570 ], [ -91.552750, 31.430692 ], [ -91.548465, 31.432668 ], [ -91.545013, 31.433026 ], [ -91.541626, 31.431706 ], [ -91.540647, 31.430758 ], [ -91.537137, 31.424161 ], [ -91.537002, 31.423184 ], [ -91.539504, 31.417910 ], [ -91.539458, 31.414021 ], [ -91.532336, 31.390275 ], [ -91.526950, 31.380855 ], [ -91.521836, 31.375170 ], [ -91.515978, 31.370286 ], [ -91.508075, 31.366276 ], [ -91.504163, 31.364950 ], [ -91.478870, 31.364955 ], [ -91.472465, 31.371326 ], [ -91.471098, 31.376917 ], [ -91.471992, 31.382143 ], [ -91.472149, 31.391434 ], [ -91.472065, 31.395925 ], [ -91.476926, 31.397796 ], [ -91.480230, 31.404391 ], [ -91.490040, 31.412716 ], [ -91.500046, 31.420520 ], [ -91.506423, 31.431460 ], [ -91.510356, 31.438928 ], [ -91.513366, 31.444396 ], [ -91.515130, 31.449206 ], [ -91.516999, 31.460574 ], [ -91.518148, 31.483483 ], [ -91.517140, 31.498394 ], [ -91.515157, 31.503380 ], [ -91.514917, 31.510113 ], [ -91.516759, 31.511772 ], [ -91.520579, 31.513207 ], [ -91.522862, 31.517493 ], [ -91.522920, 31.519841 ], [ -91.522536, 31.522078 ], [ -91.521445, 31.523912 ], [ -91.515810, 31.530894 ], [ -91.513963, 31.532084 ], [ -91.511217, 31.532612 ], [ -91.506719, 31.532966 ], [ -91.500118, 31.532616 ], [ -91.489618, 31.534266 ], [ -91.483918, 31.532566 ], [ -91.481318, 31.530666 ], [ -91.479718, 31.530366 ], [ -91.450017, 31.539666 ], [ -91.443916, 31.542466 ], [ -91.437616, 31.546166 ], [ -91.426416, 31.554566 ], [ -91.414915, 31.562166 ], [ -91.407915, 31.569366 ], [ -91.406615, 31.571966 ], [ -91.405415, 31.576466 ], [ -91.403915, 31.589766 ], [ -91.413015, 31.595365 ], [ -91.417115, 31.596265 ], [ -91.422716, 31.597065 ], [ -91.430716, 31.596465 ], [ -91.436316, 31.594965 ], [ -91.457517, 31.587566 ], [ -91.466317, 31.586066 ], [ -91.479418, 31.585466 ], [ -91.485218, 31.586166 ], [ -91.488618, 31.587466 ], [ -91.494118, 31.590165 ], [ -91.502783, 31.595727 ], [ -91.513010, 31.606885 ], [ -91.516567, 31.611818 ], [ -91.517233, 31.613460 ], [ -91.517921, 31.618642 ], [ -91.516659, 31.627332 ], [ -91.515462, 31.630372 ], [ -91.512336, 31.634722 ], [ -91.507310, 31.639068 ], [ -91.499278, 31.644658 ], [ -91.497665, 31.645371 ], [ -91.494478, 31.645013 ], [ -91.492748, 31.644279 ], [ -91.490027, 31.641000 ], [ -91.487518, 31.637065 ], [ -91.482618, 31.631565 ], [ -91.479818, 31.628965 ], [ -91.474318, 31.625365 ], [ -91.463817, 31.620365 ], [ -91.436716, 31.612665 ], [ -91.429616, 31.611365 ], [ -91.421116, 31.611565 ], [ -91.416498, 31.613133 ], [ -91.401015, 31.620365 ], [ -91.398315, 31.626265 ], [ -91.396115, 31.639265 ], [ -91.395715, 31.644165 ], [ -91.398015, 31.662665 ], [ -91.400115, 31.688164 ], [ -91.400015, 31.697864 ], [ -91.397915, 31.709364 ], [ -91.397115, 31.711364 ], [ -91.380915, 31.732464 ], [ -91.371804, 31.742948 ], [ -91.365034, 31.748184 ], [ -91.356394, 31.749106 ], [ -91.338663, 31.750005 ], [ -91.319816, 31.749989 ], [ -91.310734, 31.749071 ], [ -91.291723, 31.745260 ], [ -91.275545, 31.745515 ], [ -91.263406, 31.754468 ], [ -91.259611, 31.761290 ], [ -91.263043, 31.766995 ], [ -91.273874, 31.771178 ], [ -91.286045, 31.772062 ], [ -91.301315, 31.766748 ], [ -91.325973, 31.761510 ], [ -91.355214, 31.758063 ], [ -91.365529, 31.761628 ], [ -91.363714, 31.780363 ], [ -91.359514, 31.799362 ], [ -91.345714, 31.842861 ], [ -91.343014, 31.846861 ], [ -91.338414, 31.851261 ], [ -91.333814, 31.853261 ], [ -91.326914, 31.854961 ], [ -91.294713, 31.860460 ], [ -91.293413, 31.860160 ], [ -91.289312, 31.846861 ], [ -91.290135, 31.833658 ], [ -91.289412, 31.828661 ], [ -91.287812, 31.824161 ], [ -91.284912, 31.818362 ], [ -91.282212, 31.814762 ], [ -91.280212, 31.813162 ], [ -91.276712, 31.811362 ], [ -91.269212, 31.809162 ], [ -91.262011, 31.809362 ], [ -91.255611, 31.812662 ], [ -91.250111, 31.817762 ], [ -91.247367, 31.822323 ], [ -91.245047, 31.831447 ], [ -91.245624, 31.833165 ], [ -91.261144, 31.846119 ], [ -91.266612, 31.851161 ], [ -91.268112, 31.853061 ], [ -91.268812, 31.855161 ], [ -91.269012, 31.858661 ], [ -91.267712, 31.862660 ], [ -91.266512, 31.864260 ], [ -91.264412, 31.865460 ], [ -91.248144, 31.869848 ], [ -91.234899, 31.876863 ], [ -91.226951, 31.885105 ], [ -91.208810, 31.900459 ], [ -91.205110, 31.904159 ], [ -91.202810, 31.907959 ], [ -91.201010, 31.909159 ], [ -91.197510, 31.908659 ], [ -91.193810, 31.909559 ], [ -91.192610, 31.910159 ], [ -91.190810, 31.912959 ], [ -91.189210, 31.914259 ], [ -91.183210, 31.916159 ], [ -91.180610, 31.917959 ], [ -91.181110, 31.920059 ], [ -91.184910, 31.923759 ], [ -91.183710, 31.933158 ], [ -91.184710, 31.935058 ], [ -91.191110, 31.934158 ], [ -91.192910, 31.934958 ], [ -91.193210, 31.935658 ], [ -91.189510, 31.946358 ], [ -91.188810, 31.953158 ], [ -91.189110, 31.957458 ], [ -91.188310, 31.960958 ], [ -91.184810, 31.965557 ], [ -91.177410, 31.973257 ], [ -91.170210, 31.979057 ], [ -91.164410, 31.982557 ], [ -91.117409, 31.987057 ], [ -91.104108, 31.990357 ], [ -91.096108, 31.994857 ], [ -91.090105, 32.000157 ], [ -91.075908, 32.016828 ], [ -91.079928, 32.018316 ], [ -91.080808, 32.023456 ], [ -91.082608, 32.028656 ], [ -91.084408, 32.031456 ], [ -91.088108, 32.034455 ], [ -91.095508, 32.037455 ], [ -91.125109, 32.042855 ], [ -91.145110, 32.046555 ], [ -91.151410, 32.049255 ], [ -91.156310, 32.052655 ], [ -91.159010, 32.055955 ], [ -91.161310, 32.059755 ], [ -91.162010, 32.062355 ], [ -91.162010, 32.065354 ], [ -91.161610, 32.067754 ], [ -91.160310, 32.070354 ], [ -91.155810, 32.075554 ], [ -91.148810, 32.080154 ], [ -91.145110, 32.081354 ], [ -91.139309, 32.081754 ], [ -91.134909, 32.080354 ], [ -91.128609, 32.076554 ], [ -91.124109, 32.071854 ], [ -91.114309, 32.058255 ], [ -91.103708, 32.050255 ], [ -91.098708, 32.048355 ], [ -91.082308, 32.047555 ], [ -91.080208, 32.048355 ], [ -91.079108, 32.050255 ], [ -91.081708, 32.075754 ], [ -91.081508, 32.077754 ], [ -91.080008, 32.079154 ], [ -91.066679, 32.085330 ], [ -91.038607, 32.098254 ], [ -91.034707, 32.101053 ], [ -91.030507, 32.108153 ], [ -91.030907, 32.120552 ], [ -91.027007, 32.121053 ], [ -91.020006, 32.123553 ], [ -91.017606, 32.125153 ], [ -91.011806, 32.131153 ], [ -91.006406, 32.139952 ], [ -91.005006, 32.142852 ], [ -91.004106, 32.146152 ], [ -91.006190, 32.156957 ], [ -91.016606, 32.160852 ], [ -91.025007, 32.162552 ], [ -91.031907, 32.167851 ], [ -91.041807, 32.174551 ], [ -91.050207, 32.178451 ], [ -91.057647, 32.177354 ], [ -91.058907, 32.171251 ], [ -91.055707, 32.163752 ], [ -91.049707, 32.157352 ], [ -91.048507, 32.150152 ], [ -91.050207, 32.145252 ], [ -91.051207, 32.144152 ], [ -91.053175, 32.124237 ], [ -91.061555, 32.126907 ], [ -91.069081, 32.131478 ], [ -91.077043, 32.133493 ], [ -91.081630, 32.133992 ], [ -91.091656, 32.133604 ], [ -91.101181, 32.131136 ], [ -91.103696, 32.130007 ], [ -91.111294, 32.125036 ], [ -91.113866, 32.125731 ], [ -91.131403, 32.126213 ], [ -91.136566, 32.127371 ], [ -91.144400, 32.130390 ], [ -91.155043, 32.132243 ], [ -91.162822, 32.132694 ], [ -91.165452, 32.134290 ], [ -91.171702, 32.144250 ], [ -91.173495, 32.149009 ], [ -91.174552, 32.154978 ], [ -91.173664, 32.164231 ], [ -91.171046, 32.176526 ], [ -91.168073, 32.186635 ], [ -91.164171, 32.196888 ], [ -91.162062, 32.199035 ], [ -91.158026, 32.201956 ], [ -91.133587, 32.213432 ], [ -91.130197, 32.213666 ], [ -91.128495, 32.213169 ], [ -91.124043, 32.211104 ], [ -91.117270, 32.206668 ], [ -91.114084, 32.206697 ], [ -91.113009, 32.206550 ], [ -91.108509, 32.208150 ], [ -91.100409, 32.217850 ], [ -91.092108, 32.223850 ], [ -91.083708, 32.226450 ], [ -91.075108, 32.227050 ], [ -91.071108, 32.226050 ], [ -91.061408, 32.218650 ], [ -91.055107, 32.224750 ], [ -91.053107, 32.227950 ], [ -91.051807, 32.234449 ], [ -91.050307, 32.237949 ], [ -91.046507, 32.241149 ], [ -91.039007, 32.242349 ], [ -91.034307, 32.241549 ], [ -91.026607, 32.238749 ], [ -91.021507, 32.236149 ], [ -91.009606, 32.226150 ], [ -91.006106, 32.224050 ], [ -91.004769, 32.221050 ], [ -91.002469, 32.215812 ], [ -91.001192, 32.215173 ], [ -90.999531, 32.214662 ], [ -90.997359, 32.213896 ], [ -90.994293, 32.213768 ], [ -90.991227, 32.214662 ], [ -90.988672, 32.215812 ], [ -90.985989, 32.217856 ], [ -90.983434, 32.221305 ], [ -90.983263, 32.226201 ], [ -90.983135, 32.231371 ], [ -90.980290, 32.243601 ], [ -90.976139, 32.248092 ], [ -90.970016, 32.251680 ], [ -90.969403, 32.252520 ], [ -90.971344, 32.257742 ], [ -90.979663, 32.265252 ], [ -90.981028, 32.266733 ], [ -90.982985, 32.270294 ], [ -90.984077, 32.279954 ], [ -90.980747, 32.291410 ], [ -90.979475, 32.293702 ], [ -90.976199, 32.296450 ], [ -90.974602, 32.297122 ], [ -90.971643, 32.297497 ], [ -90.964149, 32.296872 ], [ -90.963079, 32.296285 ], [ -90.961171, 32.293288 ], [ -90.955405, 32.286241 ], [ -90.953008, 32.284043 ], [ -90.951351, 32.283199 ], [ -90.947834, 32.283486 ], [ -90.933991, 32.290343 ], [ -90.922231, 32.298639 ], [ -90.916157, 32.303582 ], [ -90.905173, 32.315497 ], [ -90.902558, 32.319587 ], [ -90.901240, 32.323386 ], [ -90.900720, 32.330379 ], [ -90.882161, 32.357552 ], [ -90.875631, 32.372434 ], [ -90.878289, 32.374548 ], [ -90.888947, 32.373246 ], [ -90.892060, 32.370579 ], [ -90.897762, 32.354360 ], [ -90.907756, 32.343611 ], [ -90.912363, 32.339454 ], [ -90.921170, 32.342073 ], [ -90.934897, 32.344967 ], [ -90.942981, 32.345956 ], [ -90.954583, 32.345859 ], [ -90.986672, 32.351760 ], [ -90.993625, 32.354047 ], [ -91.000106, 32.357695 ], [ -91.003506, 32.362145 ], [ -91.004506, 32.364744 ], [ -91.004506, 32.368144 ], [ -91.000606, 32.381644 ], [ -90.996237, 32.388061 ], [ -90.994686, 32.392277 ], [ -90.993780, 32.396778 ], [ -90.994080, 32.403862 ], [ -90.980723, 32.408243 ], [ -90.974461, 32.412001 ], [ -90.971141, 32.414636 ], [ -90.967767, 32.418279 ], [ -90.966255, 32.421027 ], [ -90.965986, 32.424806 ], [ -90.966457, 32.433868 ], [ -90.966869, 32.435499 ], [ -90.968560, 32.438084 ], [ -90.969590, 32.439490 ], [ -90.978547, 32.447032 ], [ -90.983423, 32.449077 ], [ -90.993863, 32.450850 ], [ -90.998974, 32.450165 ], [ -91.004806, 32.445741 ], [ -91.016506, 32.440342 ], [ -91.026306, 32.434442 ], [ -91.029606, 32.433542 ], [ -91.052907, 32.438442 ], [ -91.070207, 32.445141 ], [ -91.081807, 32.450441 ], [ -91.095308, 32.458741 ], [ -91.108808, 32.472040 ], [ -91.112108, 32.476140 ], [ -91.116008, 32.483140 ], [ -91.117308, 32.495039 ], [ -91.116708, 32.500139 ], [ -91.106985, 32.514934 ], [ -91.101304, 32.525599 ], [ -91.098756, 32.532968 ], [ -91.097949, 32.537214 ], [ -91.097878, 32.544752 ], [ -91.093741, 32.549128 ], [ -91.074817, 32.533467 ], [ -91.070467, 32.528171 ], [ -91.060516, 32.512361 ], [ -91.050907, 32.500139 ], [ -91.045807, 32.495539 ], [ -91.038106, 32.490440 ], [ -91.033906, 32.488540 ], [ -91.024106, 32.485240 ], [ -91.017106, 32.483740 ], [ -91.004206, 32.482140 ], [ -90.999223, 32.482615 ], [ -90.996388, 32.483925 ], [ -90.990703, 32.487749 ], [ -90.988278, 32.491190 ], [ -90.987831, 32.494190 ], [ -90.988174, 32.496796 ], [ -90.989826, 32.500139 ], [ -90.994481, 32.506331 ], [ -91.005468, 32.513842 ], [ -91.011275, 32.516596 ], [ -91.051168, 32.530890 ], [ -91.061685, 32.536448 ], [ -91.075373, 32.546718 ], [ -91.080398, 32.556442 ], [ -91.069354, 32.563052 ], [ -91.049312, 32.573624 ], [ -91.036170, 32.579556 ], [ -91.030991, 32.583347 ], [ -91.022943, 32.591848 ], [ -91.016231, 32.596953 ], [ -91.013723, 32.598419 ], [ -91.010228, 32.601927 ], [ -91.004599, 32.609780 ], [ -91.002997, 32.614678 ], [ -91.002962, 32.622555 ], [ -91.003500, 32.624845 ], [ -91.006820, 32.631261 ], [ -91.014286, 32.640482 ], [ -91.019115, 32.643845 ], [ -91.025769, 32.646573 ], [ -91.030181, 32.644052 ], [ -91.038415, 32.636443 ], [ -91.040401, 32.632521 ], [ -91.041448, 32.625135 ], [ -91.043263, 32.620779 ], [ -91.048900, 32.613556 ], [ -91.049796, 32.607188 ], [ -91.061354, 32.605372 ], [ -91.079506, 32.600680 ], [ -91.087784, 32.597070 ], [ -91.105704, 32.590879 ], [ -91.112764, 32.590186 ], [ -91.118641, 32.585139 ], [ -91.119854, 32.584795 ], [ -91.125108, 32.585187 ], [ -91.127912, 32.586493 ], [ -91.135280, 32.591651 ], [ -91.141148, 32.597209 ], [ -91.144074, 32.600613 ], [ -91.146204, 32.604144 ], [ -91.151318, 32.615919 ], [ -91.153556, 32.626181 ], [ -91.153821, 32.631282 ], [ -91.153744, 32.635228 ], [ -91.152699, 32.640757 ], [ -91.152081, 32.641508 ], [ -91.149753, 32.644041 ], [ -91.144347, 32.648029 ], [ -91.142038, 32.649265 ], [ -91.138712, 32.649774 ], [ -91.137638, 32.650621 ], [ -91.130928, 32.658870 ], [ -91.127723, 32.665343 ], [ -91.118258, 32.674075 ], [ -91.104443, 32.682434 ], [ -91.098762, 32.685291 ], [ -91.081145, 32.691127 ], [ -91.076061, 32.693751 ], [ -91.063946, 32.702926 ], [ -91.057043, 32.712576 ], [ -91.054749, 32.719229 ], [ -91.054481, 32.722259 ], [ -91.056999, 32.725580 ], [ -91.060766, 32.727494 ], [ -91.077176, 32.732534 ], [ -91.090573, 32.736100 ], [ -91.113652, 32.739970 ], [ -91.123152, 32.742798 ], [ -91.131691, 32.743107 ], [ -91.150244, 32.741786 ], [ -91.154461, 32.742339 ], [ -91.158610, 32.743449 ], [ -91.163389, 32.747009 ], [ -91.165328, 32.751301 ], [ -91.165814, 32.757842 ], [ -91.164968, 32.761984 ], [ -91.157614, 32.776033 ], [ -91.156918, 32.780343 ], [ -91.158583, 32.781096 ], [ -91.164397, 32.785821 ], [ -91.161412, 32.800004 ], [ -91.161669, 32.812465 ], [ -91.158336, 32.822304 ], [ -91.157155, 32.823823 ], [ -91.152174, 32.826673 ], [ -91.149704, 32.831220 ], [ -91.145002, 32.842870 ], [ -91.143559, 32.844739 ], [ -91.137890, 32.848975 ], [ -91.127886, 32.855059 ], [ -91.124725, 32.854861 ], [ -91.116091, 32.855641 ], [ -91.105631, 32.858396 ], [ -91.086683, 32.873392 ], [ -91.070602, 32.888659 ], [ -91.068186, 32.891929 ], [ -91.064449, 32.901064 ], [ -91.063809, 32.903709 ], [ -91.063684, 32.906364 ], [ -91.064854, 32.916520 ], [ -91.063875, 32.922692 ], [ -91.064804, 32.926464 ], [ -91.070547, 32.936036 ], [ -91.072075, 32.937832 ], [ -91.080431, 32.943206 ], [ -91.081913, 32.944768 ], [ -91.083084, 32.947909 ], [ -91.081892, 32.949435 ], [ -91.080507, 32.950123 ], [ -91.078904, 32.951818 ], [ -91.080355, 32.962794 ], [ -91.086802, 32.976266 ], [ -91.090887, 32.981174 ], [ -91.094265, 32.984371 ], [ -91.096930, 32.986412 ], [ -91.106581, 32.988938 ], [ -91.111757, 32.988361 ], [ -91.125107, 32.984669 ], [ -91.134414, 32.980533 ], [ -91.135517, 32.979657 ], [ -91.138585, 32.971352 ], [ -91.137524, 32.969550 ], [ -91.133050, 32.966541 ], [ -91.130947, 32.963815 ], [ -91.130721, 32.962257 ], [ -91.131243, 32.960928 ], [ -91.133335, 32.959056 ], [ -91.136628, 32.957349 ], [ -91.137167, 32.956520 ], [ -91.137863, 32.952756 ], [ -91.135507, 32.946164 ], [ -91.131289, 32.930049 ], [ -91.131304, 32.926919 ], [ -91.132115, 32.923122 ], [ -91.134041, 32.917676 ], [ -91.145076, 32.905494 ], [ -91.151690, 32.901935 ], [ -91.159975, 32.899879 ], [ -91.170235, 32.899391 ], [ -91.175405, 32.899998 ], [ -91.181631, 32.901446 ], [ -91.196785, 32.906784 ], [ -91.199775, 32.908512 ], [ -91.208263, 32.915354 ], [ -91.211597, 32.919624 ], [ -91.212837, 32.922104 ], [ -91.213972, 32.927198 ], [ -91.214027, 32.930320 ], [ -91.212820, 32.936076 ], [ -91.210705, 32.939845 ], [ -91.207440, 32.944393 ], [ -91.199415, 32.952314 ], [ -91.201190, 32.954982 ], [ -91.202030, 32.957332 ], [ -91.201842, 32.961212 ], [ -91.199646, 32.963561 ], [ -91.197433, 32.964820 ], [ -91.186983, 32.976194 ], [ -91.182158, 32.978639 ], [ -91.173308, 32.986088 ], [ -91.168973, 32.992132 ], [ -91.166195, 33.002238 ], [ -91.166073, 33.004106 ], [ -91.166282, 33.011331 ], [ -91.162363, 33.019684 ], [ -91.156160, 33.023580 ], [ -91.149758, 33.026312 ], [ -91.142424, 33.027231 ], [ -91.137439, 33.028736 ], [ -91.129088, 33.033554 ], [ -91.125656, 33.038276 ], [ -91.123441, 33.046577 ], [ -91.120379, 33.054530 ], [ -91.120293, 33.055921 ], [ -91.121195, 33.059166 ], [ -91.124639, 33.064127 ], [ -91.149823, 33.081603 ], [ -91.160656, 33.085596 ], [ -91.165918, 33.086174 ], [ -91.171514, 33.087818 ], [ -91.173546, 33.089318 ], [ -91.174723, 33.091640 ], [ -91.180836, 33.098364 ], [ -91.195953, 33.104561 ], [ -91.200167, 33.106930 ], [ -91.201125, 33.108185 ], [ -91.201462, 33.109638 ], [ -91.202089, 33.121249 ], [ -91.201780, 33.125121 ], [ -91.195296, 33.134731 ], [ -91.193174, 33.136734 ], [ -91.188718, 33.139811 ], [ -91.183662, 33.141691 ], [ -91.169406, 33.142639 ], [ -91.161651, 33.141781 ], [ -91.160298, 33.141216 ], [ -91.153015, 33.135093 ], [ -91.151853, 33.131802 ], [ -91.150362, 33.130695 ], [ -91.143334, 33.129785 ], [ -91.131659, 33.129101 ], [ -91.114087, 33.129834 ], [ -91.104317, 33.131598 ], [ -91.093201, 33.136726 ], [ -91.089862, 33.139655 ], [ -91.087589, 33.145177 ], [ -91.085562, 33.155822 ], [ -91.084889, 33.161800 ], [ -91.084366, 33.180856 ], [ -91.086963, 33.198509 ], [ -91.089909, 33.210194 ], [ -91.091711, 33.220813 ], [ -91.085984, 33.221644 ], [ -91.082878, 33.221621 ], [ -91.079635, 33.223225 ], [ -91.079227, 33.223889 ], [ -91.079227, 33.226500 ], [ -91.077673, 33.227485 ], [ -91.074103, 33.226821 ], [ -91.070697, 33.227302 ], [ -91.071079, 33.230096 ], [ -91.068708, 33.232936 ], [ -91.065629, 33.232982 ], [ -91.063912, 33.237356 ], [ -91.054126, 33.246105 ], [ -91.050407, 33.251202 ], [ -91.047648, 33.259989 ], [ -91.045191, 33.265404 ], [ -91.043985, 33.269835 ], [ -91.043624, 33.274636 ], [ -91.045141, 33.279015 ], [ -91.048150, 33.282796 ], [ -91.052369, 33.285415 ], [ -91.058730, 33.286901 ], [ -91.067035, 33.287180 ], [ -91.072567, 33.285885 ], [ -91.078530, 33.283306 ], [ -91.081244, 33.281250 ], [ -91.083694, 33.278557 ], [ -91.086137, 33.273652 ], [ -91.090342, 33.257325 ], [ -91.091489, 33.254838 ], [ -91.094748, 33.250499 ], [ -91.096931, 33.241628 ], [ -91.099093, 33.238173 ], [ -91.100100, 33.238125 ], [ -91.106142, 33.241799 ], [ -91.110561, 33.245930 ], [ -91.114325, 33.252953 ], [ -91.117223, 33.260685 ], [ -91.118208, 33.262071 ], [ -91.128078, 33.268502 ], [ -91.125528, 33.274732 ], [ -91.125539, 33.280255 ], [ -91.140057, 33.296618 ], [ -91.141615, 33.299539 ], [ -91.141475, 33.314318 ], [ -91.143667, 33.328398 ], [ -91.143353, 33.330520 ], [ -91.141893, 33.332963 ], [ -91.140968, 33.336493 ], [ -91.142219, 33.348989 ], [ -91.141793, 33.350076 ], [ -91.140192, 33.351452 ], [ -91.125108, 33.360099 ], [ -91.120409, 33.363809 ], [ -91.106758, 33.381141 ], [ -91.101456, 33.387190 ], [ -91.090852, 33.395781 ], [ -91.075293, 33.405966 ], [ -91.062281, 33.421238 ], [ -91.058152, 33.428705 ], [ -91.057621, 33.445341 ], [ -91.059828, 33.450257 ], [ -91.064701, 33.453775 ], [ -91.067623, 33.455104 ], [ -91.074555, 33.455811 ], [ -91.077814, 33.455648 ], [ -91.081834, 33.454188 ], [ -91.086498, 33.451576 ], [ -91.091566, 33.446319 ], [ -91.094279, 33.442671 ], [ -91.096723, 33.437603 ], [ -91.097531, 33.433725 ], [ -91.097474, 33.431733 ], [ -91.095335, 33.425684 ], [ -91.095211, 33.417488 ], [ -91.099277, 33.408244 ], [ -91.107170, 33.399078 ], [ -91.113764, 33.393124 ], [ -91.123623, 33.387526 ], [ -91.140938, 33.380477 ], [ -91.154017, 33.378914 ], [ -91.166304, 33.379709 ], [ -91.171968, 33.381030 ], [ -91.176942, 33.382841 ], [ -91.191127, 33.389634 ], [ -91.204758, 33.398823 ], [ -91.208113, 33.402007 ], [ -91.209032, 33.403633 ], [ -91.209220, 33.406290 ], [ -91.208702, 33.408719 ], [ -91.205272, 33.414231 ], [ -91.202580, 33.416832 ], [ -91.199354, 33.418321 ], [ -91.191973, 33.417728 ], [ -91.184427, 33.419576 ], [ -91.179368, 33.417151 ], [ -91.176280, 33.416979 ], [ -91.163387, 33.422157 ], [ -91.147663, 33.427172 ], [ -91.144877, 33.427706 ], [ -91.139150, 33.426955 ], [ -91.131885, 33.430063 ], [ -91.130561, 33.431900 ], [ -91.130552, 33.433263 ], [ -91.128589, 33.436284 ], [ -91.121100, 33.443563 ], [ -91.118495, 33.449116 ], [ -91.117975, 33.453807 ], [ -91.119667, 33.460230 ], [ -91.125109, 33.472842 ], [ -91.136656, 33.481323 ], [ -91.157319, 33.492923 ], [ -91.160142, 33.494829 ], [ -91.164019, 33.497448 ], [ -91.167403, 33.498304 ], [ -91.172213, 33.496691 ], [ -91.175488, 33.490770 ], [ -91.177148, 33.486170 ], [ -91.176984, 33.478899 ], [ -91.175635, 33.471761 ], [ -91.171799, 33.462342 ], [ -91.169360, 33.452629 ], [ -91.177293, 33.443638 ], [ -91.181787, 33.440780 ], [ -91.186979, 33.438592 ], [ -91.194658, 33.436358 ], [ -91.206807, 33.433846 ], [ -91.210275, 33.433796 ], [ -91.217374, 33.434699 ], [ -91.235181, 33.438972 ], [ -91.235928, 33.440611 ], [ -91.234310, 33.442300 ], [ -91.233422, 33.444038 ], [ -91.232587, 33.453958 ], [ -91.231661, 33.457100 ], [ -91.223338, 33.462764 ], [ -91.220192, 33.463045 ], [ -91.215508, 33.464780 ], [ -91.208535, 33.468606 ], [ -91.206753, 33.470308 ], [ -91.205661, 33.473553 ], [ -91.199593, 33.483125 ], [ -91.195634, 33.488468 ], [ -91.189375, 33.493005 ], [ -91.185637, 33.496399 ], [ -91.183070, 33.498613 ], [ -91.182901, 33.502379 ], [ -91.184612, 33.507364 ], [ -91.187367, 33.510552 ], [ -91.215671, 33.529423 ], [ -91.219297, 33.532364 ], [ -91.226325, 33.541200 ], [ -91.229834, 33.547047 ], [ -91.232295, 33.552788 ], [ -91.232537, 33.557454 ], [ -91.231418, 33.560593 ], [ -91.228489, 33.564667 ], [ -91.224121, 33.567369 ], [ -91.221466, 33.568166 ], [ -91.203151, 33.570758 ], [ -91.198285, 33.572061 ], [ -91.188942, 33.576225 ], [ -91.181068, 33.581520 ], [ -91.178220, 33.582607 ], [ -91.175979, 33.582968 ], [ -91.160755, 33.581352 ], [ -91.157429, 33.581372 ], [ -91.152148, 33.582721 ], [ -91.138418, 33.590896 ], [ -91.134043, 33.594489 ], [ -91.132450, 33.596989 ], [ -91.131588, 33.599450 ], [ -91.130445, 33.606034 ], [ -91.130902, 33.610919 ], [ -91.134389, 33.619512 ], [ -91.139209, 33.625658 ], [ -91.150499, 33.633013 ], [ -91.164212, 33.643278 ], [ -91.171168, 33.647766 ], [ -91.178311, 33.651109 ], [ -91.185455, 33.653604 ], [ -91.211284, 33.658526 ], [ -91.219048, 33.661503 ], [ -91.223001, 33.664794 ], [ -91.226537, 33.668665 ], [ -91.228228, 33.671326 ], [ -91.229015, 33.677543 ], [ -91.227857, 33.683073 ], [ -91.225279, 33.687749 ], [ -91.220570, 33.692923 ], [ -91.212077, 33.698249 ], [ -91.205377, 33.700819 ], [ -91.200712, 33.701535 ], [ -91.190113, 33.701860 ], [ -91.175730, 33.703116 ], [ -91.165846, 33.705133 ], [ -91.162464, 33.706840 ], [ -91.160866, 33.707096 ], [ -91.144188, 33.689596 ], [ -91.133416, 33.676790 ], [ -91.130450, 33.674522 ], [ -91.100980, 33.660551 ], [ -91.094040, 33.658351 ], [ -91.088202, 33.657387 ], [ -91.084126, 33.657322 ], [ -91.078507, 33.658283 ], [ -91.067110, 33.662689 ], [ -91.059182, 33.666400 ], [ -91.050523, 33.668064 ], [ -91.046412, 33.668272 ], [ -91.036840, 33.671316 ], [ -91.034565, 33.673018 ], [ -91.031460, 33.678142 ], [ -91.030332, 33.681622 ], [ -91.030402, 33.687766 ], [ -91.033366, 33.688773 ], [ -91.036120, 33.689113 ], [ -91.037150, 33.692907 ], [ -91.039025, 33.696595 ], [ -91.041261, 33.699933 ], [ -91.046778, 33.706313 ], [ -91.055562, 33.712486 ], [ -91.059891, 33.714816 ], [ -91.063752, 33.715892 ], [ -91.068290, 33.716477 ], [ -91.075389, 33.714403 ], [ -91.089873, 33.707364 ], [ -91.101101, 33.705007 ], [ -91.107646, 33.704679 ], [ -91.117733, 33.705342 ], [ -91.125527, 33.708780 ], [ -91.132338, 33.714246 ], [ -91.144732, 33.726803 ], [ -91.145792, 33.728924 ], [ -91.146618, 33.732456 ], [ -91.146523, 33.736503 ], [ -91.143287, 33.747141 ], [ -91.144539, 33.749338 ], [ -91.144571, 33.751607 ], [ -91.141553, 33.755957 ], [ -91.140756, 33.759735 ], [ -91.141304, 33.760835 ], [ -91.143634, 33.762095 ], [ -91.144812, 33.763996 ], [ -91.145112, 33.767340 ], [ -91.142010, 33.773820 ], [ -91.139869, 33.777117 ], [ -91.137351, 33.779923 ], [ -91.133854, 33.782814 ], [ -91.132185, 33.783420 ], [ -91.128222, 33.783447 ], [ -91.123466, 33.782106 ], [ -91.117836, 33.779026 ], [ -91.111494, 33.774568 ], [ -91.107318, 33.770619 ], [ -91.088996, 33.775801 ], [ -91.085510, 33.776410 ], [ -91.060524, 33.777640 ], [ -91.053886, 33.778701 ], [ -91.026782, 33.763642 ], [ -91.023285, 33.762991 ], [ -91.012770, 33.764675 ], [ -91.000106, 33.769165 ], [ -90.993842, 33.773601 ], [ -90.991220, 33.776791 ], [ -90.989444, 33.780576 ], [ -90.988466, 33.784530 ], [ -90.989299, 33.788016 ], [ -90.991747, 33.792597 ], [ -91.000107, 33.799549 ], [ -91.007767, 33.802591 ], [ -91.020098, 33.804447 ], [ -91.025173, 33.805953 ], [ -91.042448, 33.812855 ], [ -91.046849, 33.815365 ], [ -91.049679, 33.818729 ], [ -91.052819, 33.824181 ], [ -91.056692, 33.828935 ], [ -91.064977, 33.837126 ], [ -91.067511, 33.840443 ], [ -91.071195, 33.849539 ], [ -91.073011, 33.857449 ], [ -91.072798, 33.862396 ], [ -91.070883, 33.866714 ], [ -91.061247, 33.877505 ], [ -91.055309, 33.883035 ], [ -91.036674, 33.898531 ], [ -91.026382, 33.907980 ], [ -91.017481, 33.919083 ], [ -91.010831, 33.925552 ], [ -91.010040, 33.927003 ], [ -91.010318, 33.929352 ], [ -91.012994, 33.932276 ], [ -91.020097, 33.937127 ], [ -91.035961, 33.943758 ], [ -91.046725, 33.947406 ], [ -91.078496, 33.954060 ], [ -91.084095, 33.956179 ], [ -91.086758, 33.958270 ], [ -91.088696, 33.961334 ], [ -91.089787, 33.966004 ], [ -91.089756, 33.969721 ], [ -91.089119, 33.972653 ], [ -91.087921, 33.975335 ], [ -91.083187, 33.979865 ], [ -91.079254, 33.982101 ], [ -91.075378, 33.983586 ], [ -91.071203, 33.984473 ], [ -91.062264, 33.985083 ], [ -91.048367, 33.985078 ], [ -91.042751, 33.986811 ], [ -91.039589, 33.989297 ], [ -91.033765, 33.995323 ], [ -91.018890, 34.003151 ], [ -91.013610, 33.994495 ], [ -91.004981, 33.977011 ], [ -91.002986, 33.970902 ], [ -91.000108, 33.966428 ], [ -90.994856, 33.963118 ], [ -90.987653, 33.960793 ], [ -90.983359, 33.960186 ], [ -90.976864, 33.960503 ], [ -90.970856, 33.961868 ], [ -90.967632, 33.963324 ], [ -90.965187, 33.965461 ], [ -90.963720, 33.967688 ], [ -90.961222, 33.976151 ], [ -90.961548, 33.979945 ], [ -90.970947, 33.991885 ], [ -90.977489, 33.996554 ], [ -90.979945, 34.000106 ], [ -90.987948, 34.019038 ], [ -90.982742, 34.020469 ], [ -90.976918, 34.021335 ], [ -90.970726, 34.021620 ], [ -90.958456, 34.020254 ], [ -90.950311, 34.017822 ], [ -90.942662, 34.018050 ], [ -90.934896, 34.019262 ], [ -90.923745, 34.023143 ], [ -90.922017, 34.023216 ], [ -90.914642, 34.021885 ], [ -90.899467, 34.023796 ], [ -90.892420, 34.026860 ], [ -90.888956, 34.029788 ], [ -90.887413, 34.032505 ], [ -90.886991, 34.035094 ], [ -90.887394, 34.039845 ], [ -90.889058, 34.046362 ], [ -90.888627, 34.052419 ], [ -90.887837, 34.055403 ], [ -90.886351, 34.058564 ], [ -90.882115, 34.063903 ], [ -90.874541, 34.072041 ], [ -90.871940, 34.076362 ], [ -90.870528, 34.080516 ], [ -90.870461, 34.082739 ], [ -90.871923, 34.086652 ], [ -90.876606, 34.092911 ], [ -90.878912, 34.094573 ], [ -90.882628, 34.096615 ], [ -90.888085, 34.097810 ], [ -90.893526, 34.097795 ], [ -90.901130, 34.094667 ], [ -90.914066, 34.092756 ], [ -90.918395, 34.093054 ], [ -90.921273, 34.093958 ], [ -90.946323, 34.109374 ], [ -90.948514, 34.111269 ], [ -90.955974, 34.120125 ], [ -90.958467, 34.125105 ], [ -90.959317, 34.130350 ], [ -90.954300, 34.138498 ], [ -90.938064, 34.148754 ], [ -90.910010, 34.165508 ], [ -90.903577, 34.164332 ], [ -90.894385, 34.160953 ], [ -90.883073, 34.151502 ], [ -90.876836, 34.148130 ], [ -90.867880, 34.142146 ], [ -90.864580, 34.140555 ], [ -90.853471, 34.137511 ], [ -90.847168, 34.136884 ], [ -90.836099, 34.137876 ], [ -90.830285, 34.139813 ], [ -90.825708, 34.142011 ], [ -90.822593, 34.144054 ], [ -90.815878, 34.149879 ], [ -90.810884, 34.155903 ], [ -90.807813, 34.161474 ], [ -90.807164, 34.167460 ], [ -90.808685, 34.175878 ], [ -90.810016, 34.178437 ], [ -90.812374, 34.180767 ], [ -90.816572, 34.183023 ], [ -90.828388, 34.184784 ], [ -90.838205, 34.183804 ], [ -90.847108, 34.186053 ], [ -90.855600, 34.186880 ], [ -90.859087, 34.186288 ], [ -90.864566, 34.183882 ], [ -90.869651, 34.182965 ], [ -90.873830, 34.183220 ], [ -90.877475, 34.185633 ], [ -90.882701, 34.184364 ], [ -90.887884, 34.181980 ], [ -90.891871, 34.184766 ], [ -90.911800, 34.193897 ], [ -90.916048, 34.196916 ], [ -90.932680, 34.214824 ], [ -90.935220, 34.219050 ], [ -90.936988, 34.227041 ], [ -90.937152, 34.234110 ], [ -90.936404, 34.236698 ], [ -90.933511, 34.240218 ], [ -90.929015, 34.244541 ], [ -90.923152, 34.246530 ], [ -90.912396, 34.245932 ], [ -90.907082, 34.244492 ], [ -90.905934, 34.243529 ], [ -90.904279, 34.240960 ], [ -90.900078, 34.229621 ], [ -90.898286, 34.227253 ], [ -90.894560, 34.224380 ], [ -90.879120, 34.215450 ], [ -90.867064, 34.212141 ], [ -90.856708, 34.211598 ], [ -90.852764, 34.209403 ], [ -90.847808, 34.206530 ], [ -90.844824, 34.210999 ], [ -90.842151, 34.216880 ], [ -90.840009, 34.223077 ], [ -90.839509, 34.226201 ], [ -90.840128, 34.230104 ], [ -90.839981, 34.236114 ], [ -90.836972, 34.250104 ], [ -90.832407, 34.267491 ], [ -90.830612, 34.271245 ], [ -90.828267, 34.273650 ], [ -90.824478, 34.276240 ], [ -90.820919, 34.277840 ], [ -90.812829, 34.279438 ], [ -90.802928, 34.282465 ], [ -90.797569, 34.282402 ], [ -90.772266, 34.279943 ], [ -90.765165, 34.280524 ], [ -90.755271, 34.286848 ], [ -90.752681, 34.289266 ], [ -90.743082, 34.302257 ], [ -90.740889, 34.306538 ], [ -90.740610, 34.313469 ], [ -90.742694, 34.320263 ], [ -90.744713, 34.324872 ], [ -90.748942, 34.331045 ], [ -90.765174, 34.342818 ], [ -90.767108, 34.345264 ], [ -90.767732, 34.346872 ], [ -90.768445, 34.353469 ], [ -90.767061, 34.360271 ], [ -90.765764, 34.362109 ], [ -90.762085, 34.364754 ], [ -90.756197, 34.367256 ], [ -90.750107, 34.367919 ], [ -90.741616, 34.367225 ], [ -90.729131, 34.364206 ], [ -90.724909, 34.363659 ], [ -90.712088, 34.363805 ], [ -90.700147, 34.365855 ], [ -90.690497, 34.368606 ], [ -90.683222, 34.368817 ], [ -90.681921, 34.365998 ], [ -90.680512, 34.362529 ], [ -90.681620, 34.352910 ], [ -90.691551, 34.338618 ], [ -90.693686, 34.329680 ], [ -90.693129, 34.322570 ], [ -90.690005, 34.318584 ], [ -90.686003, 34.315771 ], [ -90.678097, 34.313031 ], [ -90.669343, 34.313020 ], [ -90.661395, 34.315398 ], [ -90.657488, 34.322231 ], [ -90.657371, 34.327287 ], [ -90.660404, 34.335760 ], [ -90.666862, 34.348569 ], [ -90.666788, 34.355820 ], [ -90.655346, 34.371846 ], [ -90.658542, 34.375705 ], [ -90.641398, 34.383869 ], [ -90.634940, 34.386363 ], [ -90.631586, 34.387193 ], [ -90.618480, 34.388767 ], [ -90.613944, 34.390723 ], [ -90.580677, 34.410554 ], [ -90.575336, 34.415152 ], [ -90.571145, 34.420319 ], [ -90.568397, 34.424805 ], [ -90.566505, 34.429528 ], [ -90.565826, 34.434379 ], [ -90.567330, 34.440383 ], [ -90.573959, 34.451875 ], [ -90.576893, 34.454351 ], [ -90.583717, 34.458829 ], [ -90.585477, 34.461247 ], [ -90.588346, 34.470562 ], [ -90.589921, 34.484793 ], [ -90.588942, 34.491097 ], [ -90.586525, 34.500103 ], [ -90.583530, 34.504085 ], [ -90.581062, 34.512818 ], [ -90.578493, 34.516296 ], [ -90.569347, 34.524867 ], [ -90.555276, 34.531012 ], [ -90.545728, 34.537750 ], [ -90.543633, 34.540378 ], [ -90.541282, 34.545331 ], [ -90.540736, 34.548085 ], [ -90.540951, 34.550853 ], [ -90.545891, 34.563257 ], [ -90.549244, 34.568101 ], [ -90.557666, 34.576929 ], [ -90.564866, 34.582602 ], [ -90.570133, 34.587457 ], [ -90.574787, 34.595243 ], [ -90.581693, 34.604227 ], [ -90.587224, 34.615732 ], [ -90.588255, 34.626616 ], [ -90.583020, 34.642679 ], [ -90.583088, 34.643610 ], [ -90.585031, 34.647072 ], [ -90.586336, 34.651689 ], [ -90.587323, 34.665407 ], [ -90.588536, 34.668646 ], [ -90.588419, 34.670963 ], [ -90.582006, 34.680235 ], [ -90.578745, 34.683844 ], [ -90.573106, 34.686425 ], [ -90.567334, 34.693371 ], [ -90.563391, 34.695876 ], [ -90.555627, 34.697946 ], [ -90.552317, 34.697087 ], [ -90.549856, 34.695478 ], [ -90.548071, 34.693169 ], [ -90.542761, 34.688781 ], [ -90.540074, 34.684981 ], [ -90.538856, 34.682463 ], [ -90.538061, 34.673232 ], [ -90.539409, 34.670902 ], [ -90.550158, 34.663445 ], [ -90.552642, 34.659707 ], [ -90.553962, 34.655018 ], [ -90.555104, 34.646236 ], [ -90.554129, 34.640871 ], [ -90.551761, 34.636484 ], [ -90.547614, 34.631656 ], [ -90.543696, 34.629559 ], [ -90.537165, 34.627767 ], [ -90.532188, 34.627487 ], [ -90.524481, 34.628504 ], [ -90.517168, 34.630928 ], [ -90.508100, 34.636682 ], [ -90.503061, 34.640790 ], [ -90.496639, 34.648117 ], [ -90.487890, 34.654881 ], [ -90.479718, 34.659934 ], [ -90.469821, 34.669436 ], [ -90.466041, 34.674312 ], [ -90.462816, 34.684074 ], [ -90.462552, 34.687576 ], [ -90.463734, 34.691093 ], [ -90.467064, 34.695643 ], [ -90.471185, 34.699066 ], [ -90.475194, 34.700826 ], [ -90.480041, 34.701515 ], [ -90.486966, 34.701477 ], [ -90.496552, 34.700578 ], [ -90.509847, 34.698003 ], [ -90.522084, 34.696605 ], [ -90.529211, 34.696819 ], [ -90.538974, 34.698783 ], [ -90.546053, 34.702076 ], [ -90.565646, 34.721053 ], [ -90.567482, 34.723292 ], [ -90.568081, 34.724802 ], [ -90.568172, 34.727384 ], [ -90.567240, 34.733463 ], [ -90.565437, 34.736536 ], [ -90.563544, 34.738671 ], [ -90.559895, 34.740788 ], [ -90.556308, 34.741541 ], [ -90.553186, 34.741912 ], [ -90.550284, 34.742804 ], [ -90.547606, 34.744367 ], [ -90.545820, 34.745929 ], [ -90.543811, 34.749277 ], [ -90.542695, 34.752626 ], [ -90.542631, 34.764396 ], [ -90.546225, 34.773443 ], [ -90.547859, 34.779194 ], [ -90.548170, 34.781890 ], [ -90.547612, 34.784589 ], [ -90.544067, 34.791159 ], [ -90.540222, 34.795768 ], [ -90.536510, 34.798572 ], [ -90.531330, 34.800584 ], [ -90.522892, 34.802265 ], [ -90.514706, 34.801768 ], [ -90.512761, 34.796488 ], [ -90.503679, 34.780136 ], [ -90.501523, 34.774795 ], [ -90.500994, 34.771187 ], [ -90.501325, 34.769931 ], [ -90.505494, 34.764568 ], [ -90.516522, 34.758333 ], [ -90.520556, 34.753388 ], [ -90.521900, 34.748463 ], [ -90.521900, 34.743537 ], [ -90.521004, 34.738612 ], [ -90.518317, 34.732790 ], [ -90.514735, 34.729656 ], [ -90.501667, 34.724236 ], [ -90.488865, 34.723731 ], [ -90.479704, 34.724793 ], [ -90.469897, 34.727030 ], [ -90.457950, 34.732946 ], [ -90.454968, 34.735557 ], [ -90.452479, 34.739898 ], [ -90.451257, 34.744485 ], [ -90.451170, 34.747787 ], [ -90.453038, 34.753352 ], [ -90.458883, 34.764267 ], [ -90.470411, 34.780877 ], [ -90.473527, 34.788835 ], [ -90.474590, 34.793200 ], [ -90.473877, 34.798399 ], [ -90.472280, 34.802465 ], [ -90.470544, 34.805036 ], [ -90.465367, 34.810592 ], [ -90.459024, 34.814440 ], [ -90.456761, 34.820395 ], [ -90.456935, 34.823383 ], [ -90.463795, 34.834923 ], [ -90.474403, 34.849495 ], [ -90.481955, 34.857805 ], [ -90.483876, 34.861333 ], [ -90.485038, 34.869252 ], [ -90.484558, 34.875096 ], [ -90.483969, 34.877176 ], [ -90.479872, 34.883264 ], [ -90.475686, 34.886310 ], [ -90.466154, 34.890989 ], [ -90.459819, 34.891946 ], [ -90.453916, 34.891122 ], [ -90.444806, 34.887994 ], [ -90.441254, 34.886313 ], [ -90.438313, 34.884581 ], [ -90.436561, 34.882731 ], [ -90.430096, 34.871212 ], [ -90.428980, 34.867168 ], [ -90.429115, 34.865087 ], [ -90.431722, 34.858913 ], [ -90.431741, 34.855051 ], [ -90.430828, 34.848982 ], [ -90.428754, 34.841400 ], [ -90.423879, 34.834606 ], [ -90.422355, 34.833675 ], [ -90.414864, 34.831846 ], [ -90.410666, 34.832028 ], [ -90.401633, 34.835305 ], [ -90.379837, 34.845931 ], [ -90.352174, 34.853196 ], [ -90.348218, 34.855113 ], [ -90.340380, 34.860357 ], [ -90.332298, 34.852530 ], [ -90.323067, 34.846391 ], [ -90.319198, 34.844854 ], [ -90.311312, 34.844223 ], [ -90.307384, 34.846195 ], [ -90.303944, 34.850517 ], [ -90.302669, 34.854366 ], [ -90.302523, 34.856471 ], [ -90.303698, 34.859704 ], [ -90.313476, 34.871698 ], [ -90.310005, 34.875097 ], [ -90.301957, 34.880053 ], [ -90.279364, 34.890077 ], [ -90.250095, 34.907320 ], [ -90.248308, 34.909739 ], [ -90.246546, 34.914168 ], [ -90.244725, 34.921031 ], [ -90.244476, 34.937596 ], [ -90.246116, 34.944316 ], [ -90.247832, 34.947916 ], [ -90.250056, 34.951196 ], [ -90.253969, 34.954988 ], [ -90.259663, 34.957793 ], [ -90.278240, 34.965077 ], [ -90.282234, 34.967661 ], [ -90.287239, 34.972531 ], [ -90.293083, 34.974574 ], [ -90.296422, 34.976346 ], [ -90.302471, 34.982077 ], [ -90.304425, 34.984939 ], [ -90.309297, 34.995694 ], [ -89.893402, 34.994356 ], [ -89.883365, 34.994261 ], [ -89.848488, 34.994193 ], [ -89.795187, 34.994293 ], [ -89.741785, 34.995194 ], [ -89.644282, 34.995293 ], [ -89.511153, 34.994755 ], [ -89.493739, 34.994361 ], [ -89.486897, 34.993975 ], [ -89.434954, 34.993754 ], [ -89.217433, 34.994729 ], [ -89.198288, 34.994484 ], [ -89.156827, 34.993926 ], [ -89.139136, 34.994307 ], [ -89.138997, 34.994330 ], [ -89.026540, 34.994956 ], [ -88.925241, 34.994842 ], [ -88.886979, 34.995868 ], [ -88.851037, 34.995085 ], [ -88.786612, 34.995252 ], [ -88.469877, 34.996033 ], [ -88.469801, 34.996052 ], [ -88.380508, 34.995610 ], [ -88.258111, 34.995463 ], [ -88.253825, 34.995553 ], [ -88.200064, 34.995634 ], [ -88.198811, 34.991192 ], [ -88.187429, 34.974909 ], [ -88.179973, 34.967466 ], [ -88.176106, 34.962519 ], [ -88.172102, 34.955213 ], [ -88.161594, 34.933456 ], [ -88.154617, 34.922392 ], [ -88.146335, 34.914374 ], [ -88.139721, 34.909631 ], [ -88.136692, 34.907592 ], [ -88.125038, 34.902227 ], [ -88.099999, 34.894095 ], [ -88.097888, 34.892202 ], [ -88.107560, 34.811628 ], [ -88.116418, 34.746303 ], [ -88.118407, 34.724292 ], [ -88.134263, 34.622660 ], [ -88.138719, 34.589215 ], [ -88.139246, 34.587795 ], [ -88.139988, 34.581703 ], [ -88.156292, 34.463214 ], [ -88.165634, 34.383102 ], [ -88.165910, 34.380926 ], [ -88.173632, 34.321054 ], [ -88.175867, 34.302171 ], [ -88.176889, 34.293858 ], [ -88.186667, 34.220952 ], [ -88.187620, 34.204778 ], [ -88.190678, 34.190123 ], [ -88.192128, 34.175351 ], [ -88.200196, 34.115948 ], [ -88.207229, 34.058333 ], [ -88.210741, 34.029199 ], [ -88.226428, 33.912875 ], [ -88.226517, 33.911665 ], [ -88.226517, 33.911551 ], [ -88.235492, 33.847203 ], [ -88.240054, 33.810879 ], [ -88.243025, 33.795680 ], [ -88.244142, 33.781673 ], [ -88.252257, 33.719568 ], [ -88.254445, 33.698779 ], [ -88.254622, 33.695780 ], [ -88.256131, 33.682860 ], [ -88.256343, 33.682053 ], [ -88.267005, 33.594229 ], [ -88.267148, 33.591989 ], [ -88.268160, 33.585040 ], [ -88.269076, 33.576929 ], [ -88.269532, 33.572894 ], [ -88.270050, 33.570819 ], [ -88.274619, 33.534008 ], [ -88.276805, 33.516463 ], [ -88.277421, 33.512436 ], [ -88.312535, 33.220923 ], [ -88.315235, 33.203323 ], [ -88.317135, 33.184123 ], [ -88.330934, 33.073125 ], [ -88.340432, 32.991199 ], [ -88.354292, 32.875130 ], [ -88.368349, 32.747656 ], [ -88.373338, 32.711825 ], [ -88.382985, 32.626954 ], [ -88.383039, 32.626679 ], [ -88.399966, 32.485415 ], [ -88.403789, 32.449885 ], [ -88.403789, 32.449770 ], [ -88.412500, 32.380025 ], [ -88.413819, 32.373922 ], [ -88.421453, 32.308680 ], [ -88.428278, 32.250143 ], [ -88.438650, 32.172806 ], [ -88.438710, 32.172078 ], [ -88.454959, 32.040576 ], [ -88.455039, 32.039719 ], [ -88.468660, 31.933173 ], [ -88.468879, 31.930262 ], [ -88.473227, 31.893856 ], [ -88.472642, 31.875153 ], [ -88.471214, 31.851385 ], [ -88.471106, 31.850949 ], [ -88.468669, 31.790722 ], [ -88.465107, 31.722312 ], [ -88.464425, 31.697881 ], [ -88.459722, 31.624002 ], [ -88.459478, 31.621652 ], [ -88.453013, 31.500164 ], [ -88.451575, 31.481533 ], [ -88.451045, 31.459448 ], [ -88.448660, 31.421277 ], [ -88.448686, 31.420888 ], [ -88.445209, 31.355969 ], [ -88.445182, 31.355855 ], [ -88.438780, 31.252654 ], [ -88.438980, 31.246896 ], [ -88.438211, 31.231252 ], [ -88.438104, 31.230060 ], [ -88.432007, 31.114298 ], [ -88.425807, 31.001123 ], [ -88.425729, 31.000183 ], [ -88.419562, 30.875186 ], [ -88.418630, 30.866528 ], [ -88.412270, 30.731771 ], [ -88.412209, 30.730395 ], [ -88.411550, 30.712956 ], [ -88.411339, 30.706334 ], [ -88.409571, 30.668731 ], [ -88.408070, 30.636970 ], [ -88.407462, 30.631653 ], [ -88.407484, 30.622736 ], [ -88.404013, 30.545060 ], [ -88.403931, 30.543359 ], [ -88.403547, 30.533100 ], [ -88.402283, 30.510852 ], [ -88.395023, 30.369425 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US29", "STATE": "29", "NAME": "Missouri", "LSAD": "", "CENSUSAREA": 68741.522000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.539100, 36.498201 ], [ -89.534524, 36.491432 ], [ -89.522674, 36.481305 ], [ -89.520642, 36.478668 ], [ -89.519501, 36.475419 ], [ -89.519720, 36.467002 ], [ -89.521021, 36.461934 ], [ -89.523427, 36.456572 ], [ -89.525190, 36.453991 ], [ -89.527274, 36.451545 ], [ -89.540868, 36.441559 ], [ -89.543406, 36.438770 ], [ -89.545061, 36.434915 ], [ -89.545503, 36.430700 ], [ -89.545255, 36.427079 ], [ -89.544221, 36.423684 ], [ -89.542337, 36.420103 ], [ -89.525293, 36.400446 ], [ -89.513956, 36.384891 ], [ -89.510380, 36.378356 ], [ -89.509558, 36.375065 ], [ -89.509722, 36.373626 ], [ -89.513178, 36.359897 ], [ -89.519000, 36.348600 ], [ -89.522695, 36.344789 ], [ -89.527029, 36.341679 ], [ -89.531822, 36.339246 ], [ -89.538079, 36.337496 ], [ -89.545006, 36.336809 ], [ -89.560439, 36.337746 ], [ -89.581636, 36.342357 ], [ -89.600544, 36.342985 ], [ -89.605668, 36.342234 ], [ -89.610689, 36.340442 ], [ -89.615841, 36.336085 ], [ -89.619800, 36.329546 ], [ -89.620255, 36.323006 ], [ -89.619242, 36.320726 ], [ -89.611819, 36.309088 ], [ -89.589820, 36.296814 ], [ -89.584337, 36.293340 ], [ -89.578492, 36.288317 ], [ -89.554289, 36.277751 ], [ -89.549219, 36.278750 ], [ -89.546577, 36.280439 ], [ -89.544797, 36.280458 ], [ -89.539487, 36.277368 ], [ -89.537675, 36.275279 ], [ -89.535529, 36.270541 ], [ -89.534507, 36.261802 ], [ -89.534745, 36.252576 ], [ -89.539229, 36.248821 ], [ -89.541621, 36.247891 ], [ -89.544743, 36.247484 ], [ -89.548952, 36.248200 ], [ -89.553563, 36.250341 ], [ -89.557991, 36.251037 ], [ -89.562206, 36.250909 ], [ -89.564997, 36.250067 ], [ -89.573928, 36.243843 ], [ -89.577544, 36.242262 ], [ -89.587326, 36.239484 ], [ -89.602374, 36.238106 ], [ -89.606510, 36.238328 ], [ -89.611145, 36.239271 ], [ -89.624416, 36.243305 ], [ -89.636790, 36.248079 ], [ -89.642182, 36.249486 ], [ -89.652518, 36.250692 ], [ -89.678046, 36.248284 ], [ -89.686229, 36.249507 ], [ -89.691308, 36.252079 ], [ -89.695235, 36.252766 ], [ -89.698568, 36.250591 ], [ -89.699817, 36.248384 ], [ -89.703511, 36.243412 ], [ -89.705328, 36.239898 ], [ -89.705545, 36.238136 ], [ -89.705250, 36.236568 ], [ -89.704459, 36.235468 ], [ -89.699677, 36.230821 ], [ -89.692630, 36.224959 ], [ -89.679548, 36.215911 ], [ -89.664144, 36.206520 ], [ -89.654876, 36.201530 ], [ -89.644790, 36.194101 ], [ -89.636893, 36.188951 ], [ -89.629452, 36.185382 ], [ -89.623804, 36.183128 ], [ -89.618228, 36.179966 ], [ -89.607004, 36.171179 ], [ -89.600871, 36.164558 ], [ -89.594397, 36.155457 ], [ -89.592206, 36.150120 ], [ -89.591605, 36.144096 ], [ -89.592102, 36.135637 ], [ -89.593070, 36.129699 ], [ -89.594000, 36.127190 ], [ -89.598946, 36.121778 ], [ -89.601936, 36.119470 ], [ -89.615128, 36.113816 ], [ -89.625078, 36.108131 ], [ -89.628305, 36.106853 ], [ -89.643020, 36.103620 ], [ -89.657709, 36.099128 ], [ -89.666598, 36.095802 ], [ -89.672463, 36.091837 ], [ -89.678821, 36.084636 ], [ -89.680029, 36.082494 ], [ -89.681946, 36.072336 ], [ -89.684439, 36.051719 ], [ -89.687254, 36.034048 ], [ -89.688577, 36.029238 ], [ -89.692437, 36.020507 ], [ -89.703571, 36.008040 ], [ -89.705677, 36.005018 ], [ -89.706932, 36.000981 ], [ -89.733095, 36.000608 ], [ -89.737564, 36.000522 ], [ -89.737648, 36.000567 ], [ -89.769973, 36.000536 ], [ -89.770255, 36.000524 ], [ -89.869010, 35.999640 ], [ -89.874590, 35.999575 ], [ -89.875085, 35.999578 ], [ -89.875586, 35.999562 ], [ -89.896508, 35.999432 ], [ -89.901183, 35.999365 ], [ -89.959377, 35.999020 ], [ -89.959893, 35.999020 ], [ -89.961075, 35.999135 ], [ -89.965327, 35.998813 ], [ -89.972563, 35.998994 ], [ -90.103842, 35.998143 ], [ -90.126350, 35.997596 ], [ -90.127331, 35.997635 ], [ -90.158812, 35.997375 ], [ -90.288800, 35.996419 ], [ -90.292376, 35.996397 ], [ -90.339434, 35.996033 ], [ -90.342616, 35.995895 ], [ -90.368718, 35.995812 ], [ -90.377890, 35.995683 ], [ -90.364430, 36.013625 ], [ -90.357390, 36.018250 ], [ -90.351732, 36.025347 ], [ -90.351310, 36.026880 ], [ -90.351818, 36.028436 ], [ -90.350974, 36.031572 ], [ -90.348297, 36.035074 ], [ -90.349090, 36.040131 ], [ -90.347908, 36.041939 ], [ -90.339343, 36.047112 ], [ -90.337146, 36.047754 ], [ -90.335466, 36.061714 ], [ -90.333261, 36.067504 ], [ -90.320746, 36.071326 ], [ -90.318491, 36.075514 ], [ -90.318378, 36.076658 ], [ -90.318745, 36.079313 ], [ -90.320070, 36.081234 ], [ -90.320662, 36.087138 ], [ -90.319168, 36.089976 ], [ -90.312373, 36.094507 ], [ -90.306255, 36.094758 ], [ -90.299910, 36.098236 ], [ -90.297991, 36.103201 ], [ -90.297878, 36.104826 ], [ -90.298413, 36.106748 ], [ -90.294492, 36.112949 ], [ -90.293109, 36.114368 ], [ -90.278724, 36.117406 ], [ -90.272378, 36.118090 ], [ -90.266256, 36.120559 ], [ -90.260645, 36.127409 ], [ -90.258755, 36.127591 ], [ -90.255596, 36.127086 ], [ -90.253198, 36.127383 ], [ -90.248808, 36.129835 ], [ -90.245961, 36.132857 ], [ -90.244317, 36.136502 ], [ -90.240887, 36.137321 ], [ -90.235585, 36.139474 ], [ -90.231386, 36.147348 ], [ -90.231445, 36.153868 ], [ -90.235370, 36.159153 ], [ -90.230324, 36.167072 ], [ -90.231284, 36.169246 ], [ -90.229339, 36.173640 ], [ -90.220425, 36.184764 ], [ -90.215740, 36.184582 ], [ -90.213509, 36.183232 ], [ -90.211280, 36.183392 ], [ -90.204449, 36.186940 ], [ -90.200582, 36.192181 ], [ -90.201712, 36.193187 ], [ -90.201655, 36.196070 ], [ -90.199905, 36.196848 ], [ -90.197167, 36.196002 ], [ -90.195247, 36.200257 ], [ -90.194259, 36.200692 ], [ -90.193017, 36.200440 ], [ -90.190053, 36.201493 ], [ -90.188189, 36.205360 ], [ -90.185790, 36.204674 ], [ -90.182853, 36.205108 ], [ -90.179695, 36.208262 ], [ -90.173281, 36.210301 ], [ -90.167745, 36.213320 ], [ -90.161166, 36.215767 ], [ -90.159415, 36.215424 ], [ -90.157383, 36.213821 ], [ -90.156140, 36.213706 ], [ -90.152497, 36.215582 ], [ -90.151422, 36.219174 ], [ -90.142240, 36.227522 ], [ -90.138089, 36.227245 ], [ -90.134785, 36.226397 ], [ -90.132356, 36.226442 ], [ -90.126366, 36.229367 ], [ -90.124673, 36.233787 ], [ -90.124660, 36.235549 ], [ -90.127264, 36.236347 ], [ -90.130114, 36.240307 ], [ -90.130565, 36.242092 ], [ -90.129716, 36.243235 ], [ -90.125958, 36.243416 ], [ -90.124476, 36.244198 ], [ -90.118219, 36.253491 ], [ -90.114922, 36.265595 ], [ -90.112945, 36.266557 ], [ -90.110317, 36.266970 ], [ -90.105231, 36.266835 ], [ -90.100175, 36.268988 ], [ -90.091247, 36.271256 ], [ -90.086471, 36.271531 ], [ -90.083731, 36.272332 ], [ -90.075934, 36.281485 ], [ -90.077800, 36.288349 ], [ -90.070085, 36.294710 ], [ -90.063980, 36.303038 ], [ -90.069266, 36.313152 ], [ -90.076504, 36.319237 ], [ -90.077296, 36.319329 ], [ -90.079077, 36.318414 ], [ -90.079981, 36.318619 ], [ -90.081961, 36.322097 ], [ -90.081425, 36.325644 ], [ -90.078880, 36.327977 ], [ -90.076986, 36.330791 ], [ -90.075572, 36.334040 ], [ -90.075884, 36.335184 ], [ -90.078231, 36.336511 ], [ -90.077185, 36.341339 ], [ -90.075064, 36.341774 ], [ -90.074074, 36.342895 ], [ -90.074668, 36.344794 ], [ -90.077695, 36.348478 ], [ -90.077723, 36.349484 ], [ -90.075376, 36.350148 ], [ -90.070653, 36.356097 ], [ -90.066297, 36.359300 ], [ -90.063891, 36.372982 ], [ -90.064514, 36.382085 ], [ -90.068907, 36.388660 ], [ -90.072897, 36.393007 ], [ -90.074227, 36.393304 ], [ -90.076689, 36.395867 ], [ -90.078671, 36.399116 ], [ -90.080426, 36.400763 ], [ -90.094353, 36.403963 ], [ -90.103644, 36.404720 ], [ -90.109495, 36.404073 ], [ -90.114677, 36.406039 ], [ -90.115839, 36.408235 ], [ -90.121445, 36.410931 ], [ -90.128719, 36.411659 ], [ -90.131038, 36.415069 ], [ -90.135002, 36.413721 ], [ -90.138512, 36.413952 ], [ -90.138653, 36.414547 ], [ -90.136218, 36.415346 ], [ -90.134915, 36.416902 ], [ -90.134231, 36.422827 ], [ -90.134797, 36.423240 ], [ -90.135590, 36.422897 ], [ -90.137771, 36.421205 ], [ -90.139499, 36.421457 ], [ -90.143743, 36.424433 ], [ -90.144139, 36.425806 ], [ -90.143798, 36.428483 ], [ -90.142720, 36.431160 ], [ -90.139039, 36.431273 ], [ -90.137565, 36.431913 ], [ -90.134136, 36.436602 ], [ -90.133993, 36.437906 ], [ -90.136029, 36.442941 ], [ -90.137323, 36.455411 ], [ -90.140041, 36.457883 ], [ -90.141399, 36.459874 ], [ -90.141568, 36.460766 ], [ -90.141101, 36.461791 ], [ -90.141530, 36.462993 ], [ -90.142475, 36.463422 ], [ -90.143162, 36.463680 ], [ -90.143849, 36.463250 ], [ -90.144620, 36.462789 ], [ -90.155804, 36.463555 ], [ -90.155700, 36.466103 ], [ -90.152888, 36.470930 ], [ -90.146327, 36.469520 ], [ -90.142222, 36.470554 ], [ -90.142269, 36.472138 ], [ -90.143683, 36.476029 ], [ -90.145382, 36.476510 ], [ -90.148329, 36.476168 ], [ -90.158838, 36.479558 ], [ -90.159376, 36.480084 ], [ -90.159460, 36.481343 ], [ -90.157136, 36.484317 ], [ -90.159305, 36.485834 ], [ -90.159462, 36.487609 ], [ -90.156369, 36.487748 ], [ -90.155997, 36.490385 ], [ -90.158568, 36.491574 ], [ -90.159305, 36.492446 ], [ -90.159048, 36.493734 ], [ -90.157358, 36.494223 ], [ -90.155012, 36.493648 ], [ -90.153871, 36.495344 ], [ -90.154409, 36.496832 ], [ -90.152481, 36.497952 ], [ -90.193943, 36.497823 ], [ -90.217323, 36.497797 ], [ -90.220702, 36.497858 ], [ -90.228943, 36.497771 ], [ -90.339892, 36.498213 ], [ -90.494575, 36.498368 ], [ -90.495027, 36.498371 ], [ -90.500160, 36.498399 ], [ -90.576112, 36.498446 ], [ -90.585342, 36.498497 ], [ -90.594300, 36.498459 ], [ -90.605450, 36.498459 ], [ -90.612554, 36.498559 ], [ -90.648494, 36.498447 ], [ -90.653246, 36.498488 ], [ -90.693005, 36.498510 ], [ -90.711226, 36.498318 ], [ -90.765672, 36.498494 ], [ -90.782454, 36.498523 ], [ -90.850434, 36.498548 ], [ -90.873775, 36.498074 ], [ -90.876567, 36.498313 ], [ -90.876867, 36.498423 ], [ -90.879220, 36.498378 ], [ -90.960648, 36.498426 ], [ -90.963063, 36.498418 ], [ -91.008558, 36.498270 ], [ -91.017974, 36.498062 ], [ -91.095880, 36.497870 ], [ -91.096277, 36.497893 ], [ -91.126529, 36.497712 ], [ -91.217360, 36.497511 ], [ -91.218645, 36.497564 ], [ -91.227398, 36.497617 ], [ -91.404915, 36.497120 ], [ -91.405141, 36.497165 ], [ -91.407137, 36.497112 ], [ -91.407261, 36.497123 ], [ -91.433298, 36.497262 ], [ -91.436502, 36.497377 ], [ -91.446284, 36.497469 ], [ -91.500140, 36.498812 ], [ -91.529774, 36.499022 ], [ -91.536870, 36.499156 ], [ -91.539359, 36.499116 ], [ -91.549163, 36.499161 ], [ -91.596213, 36.499162 ], [ -91.601317, 36.499343 ], [ -91.631439, 36.499198 ], [ -91.642590, 36.499335 ], [ -91.672343, 36.499463 ], [ -91.686026, 36.499374 ], [ -91.687615, 36.499397 ], [ -91.726663, 36.499209 ], [ -91.766111, 36.499114 ], [ -91.784713, 36.499074 ], [ -91.799500, 36.498952 ], [ -91.802040, 36.498963 ], [ -91.805981, 36.498987 ], [ -91.864385, 36.498789 ], [ -91.865995, 36.498783 ], [ -91.985802, 36.498431 ], [ -91.988751, 36.498498 ], [ -92.019375, 36.498524 ], [ -92.028847, 36.498642 ], [ -92.055789, 36.498670 ], [ -92.057178, 36.498670 ], [ -92.074934, 36.498761 ], [ -92.098356, 36.498803 ], [ -92.120306, 36.498864 ], [ -92.137741, 36.498706 ], [ -92.199396, 36.498351 ], [ -92.211449, 36.498395 ], [ -92.214143, 36.498372 ], [ -92.216412, 36.498417 ], [ -92.309424, 36.497894 ], [ -92.318415, 36.497711 ], [ -92.350277, 36.497787 ], [ -92.375159, 36.497199 ], [ -92.384927, 36.497845 ], [ -92.420383, 36.497914 ], [ -92.444129, 36.498526 ], [ -92.516836, 36.498738 ], [ -92.564238, 36.498240 ], [ -92.772333, 36.497772 ], [ -92.838621, 36.498079 ], [ -92.838876, 36.498033 ], [ -92.894001, 36.497850 ], [ -92.894336, 36.497867 ], [ -93.068455, 36.498250 ], [ -93.069512, 36.498242 ], [ -93.087635, 36.498239 ], [ -93.088988, 36.498184 ], [ -93.125969, 36.497851 ], [ -93.315337, 36.498408 ], [ -93.394718, 36.498519 ], [ -93.396079, 36.498669 ], [ -93.426989, 36.498585 ], [ -93.507408, 36.498911 ], [ -93.514512, 36.498881 ], [ -93.584281, 36.498896 ], [ -93.700171, 36.499135 ], [ -93.709956, 36.499179 ], [ -93.718893, 36.499178 ], [ -93.727552, 36.499055 ], [ -93.728022, 36.499037 ], [ -93.906128, 36.498718 ], [ -93.921840, 36.498718 ], [ -93.959190, 36.498717 ], [ -93.963920, 36.498717 ], [ -94.077089, 36.498730 ], [ -94.098588, 36.498676 ], [ -94.100252, 36.498670 ], [ -94.110673, 36.498587 ], [ -94.111473, 36.498597 ], [ -94.361203, 36.499600 ], [ -94.519478, 36.499214 ], [ -94.559290, 36.499496 ], [ -94.617919, 36.499414 ], [ -94.617877, 36.514999 ], [ -94.617883, 36.517799 ], [ -94.617997, 36.534280 ], [ -94.617868, 36.536090 ], [ -94.617897, 36.536983 ], [ -94.617814, 36.577732 ], [ -94.617853, 36.599120 ], [ -94.617865, 36.606851 ], [ -94.617815, 36.612604 ], [ -94.618025, 36.669430 ], [ -94.618130, 36.701423 ], [ -94.618307, 36.766560 ], [ -94.618380, 36.847320 ], [ -94.618658, 36.880064 ], [ -94.618243, 36.897027 ], [ -94.618282, 36.911472 ], [ -94.618207, 36.926236 ], [ -94.618295, 36.929647 ], [ -94.618166, 36.937584 ], [ -94.618109, 36.946564 ], [ -94.618026, 36.950158 ], [ -94.618031, 36.994704 ], [ -94.618049, 36.996208 ], [ -94.618080, 36.998135 ], [ -94.617995, 37.009016 ], [ -94.617965, 37.040537 ], [ -94.617875, 37.056798 ], [ -94.617982, 37.075077 ], [ -94.618120, 37.085934 ], [ -94.618082, 37.086432 ], [ -94.618090, 37.093494 ], [ -94.618088, 37.093671 ], [ -94.618059, 37.096676 ], [ -94.618151, 37.103968 ], [ -94.618212, 37.113169 ], [ -94.618075, 37.129755 ], [ -94.618072, 37.132345 ], [ -94.618351, 37.160211 ], [ -94.618473, 37.174782 ], [ -94.618505, 37.181184 ], [ -94.618319, 37.188774 ], [ -94.618305, 37.207337 ], [ -94.618219, 37.207772 ], [ -94.618150, 37.228121 ], [ -94.618123, 37.229334 ], [ -94.618158, 37.237597 ], [ -94.618075, 37.240436 ], [ -94.617648, 37.323589 ], [ -94.617695, 37.336842 ], [ -94.617636, 37.338417 ], [ -94.617537, 37.364355 ], [ -94.617626, 37.367445 ], [ -94.617625, 37.367576 ], [ -94.617557, 37.396375 ], [ -94.617511, 37.410909 ], [ -94.617265, 37.425536 ], [ -94.617132, 37.439818 ], [ -94.617201, 37.454788 ], [ -94.617205, 37.460373 ], [ -94.617222, 37.460476 ], [ -94.617180, 37.465203 ], [ -94.617183, 37.469665 ], [ -94.617023, 37.483765 ], [ -94.616789, 37.521510 ], [ -94.616908, 37.527804 ], [ -94.617186, 37.553485 ], [ -94.617160, 37.557308 ], [ -94.617081, 37.567013 ], [ -94.617315, 37.571499 ], [ -94.617283, 37.571896 ], [ -94.617428, 37.609522 ], [ -94.617300, 37.610495 ], [ -94.617477, 37.637170 ], [ -94.617576, 37.653671 ], [ -94.617734, 37.673127 ], [ -94.617885, 37.682214 ], [ -94.617687, 37.686653 ], [ -94.617651, 37.687671 ], [ -94.617805, 37.690178 ], [ -94.617975, 37.722176 ], [ -94.617808, 37.729707 ], [ -94.617721, 37.772970 ], [ -94.616862, 37.819456 ], [ -94.616450, 37.837560 ], [ -94.616426, 37.845282 ], [ -94.616000, 37.863126 ], [ -94.615834, 37.872510 ], [ -94.615921, 37.878331 ], [ -94.615706, 37.886843 ], [ -94.615469, 37.901775 ], [ -94.615393, 37.906392 ], [ -94.615181, 37.915944 ], [ -94.614778, 37.934200 ], [ -94.614835, 37.936700 ], [ -94.614754, 37.940769 ], [ -94.614612, 37.944362 ], [ -94.614594, 37.949978 ], [ -94.614562, 37.951517 ], [ -94.614557, 37.971037 ], [ -94.614465, 37.987799 ], [ -94.614212, 37.992462 ], [ -94.613981, 38.036949 ], [ -94.614055, 38.060088 ], [ -94.614089, 38.065901 ], [ -94.614061, 38.067343 ], [ -94.613856, 38.149769 ], [ -94.613748, 38.160633 ], [ -94.613422, 38.167908 ], [ -94.613073, 38.190552 ], [ -94.612848, 38.200714 ], [ -94.612822, 38.203918 ], [ -94.612658, 38.217649 ], [ -94.612659, 38.219251 ], [ -94.612635, 38.226987 ], [ -94.612614, 38.237766 ], [ -94.612692, 38.270394 ], [ -94.612849, 38.289914 ], [ -94.612844, 38.291423 ], [ -94.612673, 38.302527 ], [ -94.612673, 38.314832 ], [ -94.612788, 38.320142 ], [ -94.612825, 38.324387 ], [ -94.613000, 38.335801 ], [ -94.613312, 38.364407 ], [ -94.613329, 38.369618 ], [ -94.613265, 38.392426 ], [ -94.613365, 38.403422 ], [ -94.612866, 38.477571 ], [ -94.612696, 38.483154 ], [ -94.612726, 38.484367 ], [ -94.612644, 38.491644 ], [ -94.612272, 38.547917 ], [ -94.612157, 38.549817 ], [ -94.612176, 38.576546 ], [ -94.611902, 38.580110 ], [ -94.611887, 38.580139 ], [ -94.611908, 38.609272 ], [ -94.611858, 38.620485 ], [ -94.611465, 38.625011 ], [ -94.611602, 38.635384 ], [ -94.609456, 38.740700 ], [ -94.609399, 38.742440 ], [ -94.608041, 38.811064 ], [ -94.607625, 38.827560 ], [ -94.608033, 38.847207 ], [ -94.608033, 38.855007 ], [ -94.608033, 38.861207 ], [ -94.607993, 38.867271 ], [ -94.608033, 38.868107 ], [ -94.608033, 38.869207 ], [ -94.608033, 38.883807 ], [ -94.607978, 38.936870 ], [ -94.607866, 38.937398 ], [ -94.608134, 38.940006 ], [ -94.608134, 38.942006 ], [ -94.608334, 38.981806 ], [ -94.607234, 39.065704 ], [ -94.607334, 39.081704 ], [ -94.607234, 39.089604 ], [ -94.607354, 39.113444 ], [ -94.607034, 39.119404 ], [ -94.605734, 39.122204 ], [ -94.600434, 39.128503 ], [ -94.592533, 39.135903 ], [ -94.589933, 39.140403 ], [ -94.591933, 39.155003 ], [ -94.596033, 39.157703 ], [ -94.601733, 39.159603 ], [ -94.608834, 39.160503 ], [ -94.615834, 39.160003 ], [ -94.623934, 39.156603 ], [ -94.640035, 39.153103 ], [ -94.650735, 39.154103 ], [ -94.662435, 39.157603 ], [ -94.660315, 39.168051 ], [ -94.663835, 39.179103 ], [ -94.669135, 39.182003 ], [ -94.680336, 39.184303 ], [ -94.687236, 39.183503 ], [ -94.696332, 39.178563 ], [ -94.714137, 39.170403 ], [ -94.723637, 39.169003 ], [ -94.736537, 39.169203 ], [ -94.741938, 39.170203 ], [ -94.752338, 39.173203 ], [ -94.763138, 39.179903 ], [ -94.770338, 39.190002 ], [ -94.775538, 39.200602 ], [ -94.777838, 39.203522 ], [ -94.781518, 39.206146 ], [ -94.783838, 39.207154 ], [ -94.787343, 39.207666 ], [ -94.799663, 39.206018 ], [ -94.811663, 39.206594 ], [ -94.820687, 39.208626 ], [ -94.823791, 39.209874 ], [ -94.831679, 39.215938 ], [ -94.833552, 39.217794 ], [ -94.835056, 39.220658 ], [ -94.834896, 39.223842 ], [ -94.827791, 39.234001 ], [ -94.826111, 39.238289 ], [ -94.825663, 39.241729 ], [ -94.827487, 39.249889 ], [ -94.831471, 39.256273 ], [ -94.837855, 39.262417 ], [ -94.846320, 39.268481 ], [ -94.857072, 39.273825 ], [ -94.867568, 39.277841 ], [ -94.878320, 39.281136 ], [ -94.882576, 39.283328 ], [ -94.887056, 39.286480 ], [ -94.895217, 39.294208 ], [ -94.900049, 39.300192 ], [ -94.903137, 39.306272 ], [ -94.905329, 39.311952 ], [ -94.908065, 39.323663 ], [ -94.910641, 39.348335 ], [ -94.910017, 39.352543 ], [ -94.909409, 39.354255 ], [ -94.907297, 39.356735 ], [ -94.902497, 39.360383 ], [ -94.899024, 39.362431 ], [ -94.896832, 39.363135 ], [ -94.890928, 39.364031 ], [ -94.885216, 39.366911 ], [ -94.881360, 39.370383 ], [ -94.879088, 39.375703 ], [ -94.879281, 39.379780 ], [ -94.880979, 39.383899 ], [ -94.885026, 39.389801 ], [ -94.888972, 39.392432 ], [ -94.891845, 39.393313 ], [ -94.894979, 39.393565 ], [ -94.901823, 39.392798 ], [ -94.909581, 39.388865 ], [ -94.915859, 39.386348 ], [ -94.919225, 39.385174 ], [ -94.923110, 39.384492 ], [ -94.933652, 39.385546 ], [ -94.937158, 39.386531 ], [ -94.939697, 39.387950 ], [ -94.942039, 39.389499 ], [ -94.945577, 39.393851 ], [ -94.946227, 39.395648 ], [ -94.946662, 39.399717 ], [ -94.946293, 39.405646 ], [ -94.947864, 39.408604 ], [ -94.951209, 39.411707 ], [ -94.954817, 39.413844 ], [ -94.966066, 39.417288 ], [ -94.972952, 39.421705 ], [ -94.976606, 39.426701 ], [ -94.978798, 39.436241 ], [ -94.982144, 39.440552 ], [ -94.990172, 39.446192 ], [ -94.995768, 39.448174 ], [ -95.015825, 39.452809 ], [ -95.028498, 39.458287 ], [ -95.033408, 39.460876 ], [ -95.037500, 39.463689 ], [ -95.040780, 39.466387 ], [ -95.045716, 39.472459 ], [ -95.047133, 39.474971 ], [ -95.048370, 39.480420 ], [ -95.049845, 39.494415 ], [ -95.050552, 39.497514 ], [ -95.052177, 39.499996 ], [ -95.056380, 39.503972 ], [ -95.059461, 39.506143 ], [ -95.077441, 39.513552 ], [ -95.082714, 39.516712 ], [ -95.092704, 39.524241 ], [ -95.102888, 39.533347 ], [ -95.106596, 39.537657 ], [ -95.109304, 39.542285 ], [ -95.113557, 39.553941 ], [ -95.113077, 39.559133 ], [ -95.107454, 39.573843 ], [ -95.106406, 39.575252 ], [ -95.103228, 39.577783 ], [ -95.099095, 39.579691 ], [ -95.095736, 39.580618 ], [ -95.089515, 39.581028 ], [ -95.076688, 39.576764 ], [ -95.072160, 39.576122 ], [ -95.069315, 39.576218 ], [ -95.064519, 39.577115 ], [ -95.059519, 39.579132 ], [ -95.056897, 39.580567 ], [ -95.054804, 39.582488 ], [ -95.049277, 39.589583 ], [ -95.047165, 39.595117 ], [ -95.046361, 39.599557 ], [ -95.046445, 39.601606 ], [ -95.047911, 39.606288 ], [ -95.053012, 39.613965 ], [ -95.055152, 39.621657 ], [ -95.054925, 39.624995 ], [ -95.053367, 39.630347 ], [ -95.049518, 39.637876 ], [ -95.044554, 39.644370 ], [ -95.039049, 39.649639 ], [ -95.037464, 39.652905 ], [ -95.027644, 39.665454 ], [ -95.024595, 39.668485 ], [ -95.018318, 39.672869 ], [ -95.015310, 39.674262 ], [ -95.009023, 39.675765 ], [ -95.001379, 39.676479 ], [ -94.993557, 39.676570 ], [ -94.984149, 39.677850 ], [ -94.981557, 39.678634 ], [ -94.976325, 39.681370 ], [ -94.971317, 39.686410 ], [ -94.969909, 39.689050 ], [ -94.968981, 39.692954 ], [ -94.968453, 39.707402 ], [ -94.971078, 39.723146 ], [ -94.971206, 39.729305 ], [ -94.970422, 39.732121 ], [ -94.965318, 39.739065 ], [ -94.960086, 39.743065 ], [ -94.955286, 39.745689 ], [ -94.952630, 39.745961 ], [ -94.948726, 39.745593 ], [ -94.944741, 39.744377 ], [ -94.939221, 39.741578 ], [ -94.930005, 39.735370 ], [ -94.918324, 39.728794 ], [ -94.910068, 39.725786 ], [ -94.902612, 39.724202 ], [ -94.899316, 39.724042 ], [ -94.891744, 39.724894 ], [ -94.884143, 39.726794 ], [ -94.875643, 39.730494 ], [ -94.870143, 39.734594 ], [ -94.862943, 39.742994 ], [ -94.860371, 39.749530 ], [ -94.859443, 39.753694 ], [ -94.860743, 39.763094 ], [ -94.863143, 39.767294 ], [ -94.865243, 39.770094 ], [ -94.867143, 39.771694 ], [ -94.869644, 39.772894 ], [ -94.871144, 39.772994 ], [ -94.881422, 39.771258 ], [ -94.881460, 39.771258 ], [ -94.883924, 39.770186 ], [ -94.893646, 39.764208 ], [ -94.893724, 39.764160 ], [ -94.893919, 39.764040 ], [ -94.894071, 39.763946 ], [ -94.895041, 39.763350 ], [ -94.895268, 39.763210 ], [ -94.899156, 39.761258 ], [ -94.906244, 39.759418 ], [ -94.912293, 39.759338 ], [ -94.916789, 39.760938 ], [ -94.926229, 39.766490 ], [ -94.929653, 39.769098 ], [ -94.934262, 39.773642 ], [ -94.935302, 39.775610 ], [ -94.935782, 39.778906 ], [ -94.935206, 39.783130 ], [ -94.932726, 39.786282 ], [ -94.929654, 39.788282 ], [ -94.925605, 39.789754 ], [ -94.892965, 39.791098 ], [ -94.890292, 39.791626 ], [ -94.884084, 39.794234 ], [ -94.880932, 39.797338 ], [ -94.876344, 39.806894 ], [ -94.875944, 39.813294 ], [ -94.876544, 39.820594 ], [ -94.877044, 39.823754 ], [ -94.878677, 39.826522 ], [ -94.881013, 39.828922 ], [ -94.886933, 39.833098 ], [ -94.889493, 39.834026 ], [ -94.892677, 39.834378 ], [ -94.903157, 39.833850 ], [ -94.909942, 39.834426 ], [ -94.916918, 39.836138 ], [ -94.926150, 39.841322 ], [ -94.937655, 39.849786 ], [ -94.939767, 39.851930 ], [ -94.942567, 39.856602 ], [ -94.942407, 39.861066 ], [ -94.940743, 39.864410 ], [ -94.938791, 39.866954 ], [ -94.931463, 39.872602 ], [ -94.928466, 39.876344 ], [ -94.927252, 39.880258 ], [ -94.927359, 39.883966 ], [ -94.927897, 39.886112 ], [ -94.929574, 39.888754 ], [ -94.934493, 39.893366 ], [ -94.943867, 39.898130 ], [ -94.951540, 39.900533 ], [ -94.959276, 39.901671 ], [ -94.963345, 39.901136 ], [ -94.977749, 39.897472 ], [ -94.986975, 39.896670 ], [ -94.990284, 39.897010 ], [ -95.003819, 39.900401 ], [ -95.008440, 39.900596 ], [ -95.013152, 39.899953 ], [ -95.018743, 39.897372 ], [ -95.024389, 39.891202 ], [ -95.025240, 39.889700 ], [ -95.025947, 39.886747 ], [ -95.025119, 39.878833 ], [ -95.025422, 39.876711 ], [ -95.027931, 39.871522 ], [ -95.032053, 39.868337 ], [ -95.037767, 39.865542 ], [ -95.042142, 39.864805 ], [ -95.052535, 39.864374 ], [ -95.081534, 39.861718 ], [ -95.085003, 39.861883 ], [ -95.090158, 39.863140 ], [ -95.105912, 39.869164 ], [ -95.128166, 39.874165 ], [ -95.134747, 39.876852 ], [ -95.137092, 39.878351 ], [ -95.140601, 39.881688 ], [ -95.142718, 39.885889 ], [ -95.143403, 39.889356 ], [ -95.142445, 39.895420 ], [ -95.142563, 39.897992 ], [ -95.143802, 39.901918 ], [ -95.146055, 39.904183 ], [ -95.149657, 39.905948 ], [ -95.156024, 39.907243 ], [ -95.159834, 39.906984 ], [ -95.172296, 39.902026 ], [ -95.179453, 39.900062 ], [ -95.189565, 39.899959 ], [ -95.193816, 39.900690 ], [ -95.199347, 39.902709 ], [ -95.201935, 39.904053 ], [ -95.205733, 39.908275 ], [ -95.206196, 39.909557 ], [ -95.206326, 39.912121 ], [ -95.205745, 39.915169 ], [ -95.202010, 39.922438 ], [ -95.200690, 39.928155 ], [ -95.201277, 39.934194 ], [ -95.204428, 39.938949 ], [ -95.213737, 39.943206 ], [ -95.216440, 39.943953 ], [ -95.220212, 39.944433 ], [ -95.231114, 39.943784 ], [ -95.236761, 39.943931 ], [ -95.241383, 39.944949 ], [ -95.250254, 39.948644 ], [ -95.257652, 39.954886 ], [ -95.261854, 39.960618 ], [ -95.269886, 39.969396 ], [ -95.274757, 39.972115 ], [ -95.289715, 39.977706 ], [ -95.302507, 39.984357 ], [ -95.307111, 39.989114 ], [ -95.307780, 39.990618 ], [ -95.308404, 39.993758 ], [ -95.308290, 39.999998 ], [ -95.308469, 40.002194 ], [ -95.311163, 40.007806 ], [ -95.312211, 40.009395 ], [ -95.315271, 40.012070 ], [ -95.318015, 40.013216 ], [ -95.328501, 40.015657 ], [ -95.336242, 40.019104 ], [ -95.346573, 40.028272 ], [ -95.348777, 40.029297 ], [ -95.356876, 40.031522 ], [ -95.363983, 40.031498 ], [ -95.382957, 40.027112 ], [ -95.387195, 40.026770 ], [ -95.391527, 40.027058 ], [ -95.395858, 40.028038 ], [ -95.402665, 40.030567 ], [ -95.407260, 40.033112 ], [ -95.413588, 40.038424 ], [ -95.416824, 40.043235 ], [ -95.419320, 40.048442 ], [ -95.421640, 40.058952 ], [ -95.420643, 40.062599 ], [ -95.418345, 40.066509 ], [ -95.414734, 40.069820 ], [ -95.409856, 40.074320 ], [ -95.408455, 40.079158 ], [ -95.409243, 40.084166 ], [ -95.410643, 40.091531 ], [ -95.407591, 40.098030 ], [ -95.400139, 40.103238 ], [ -95.397146, 40.105183 ], [ -95.394216, 40.108263 ], [ -95.393062, 40.111175 ], [ -95.392840, 40.115887 ], [ -95.393347, 40.119212 ], [ -95.395369, 40.122811 ], [ -95.398667, 40.126419 ], [ -95.404395, 40.129018 ], [ -95.409481, 40.130052 ], [ -95.419186, 40.130586 ], [ -95.424780, 40.132765 ], [ -95.428749, 40.135577 ], [ -95.431022, 40.138411 ], [ -95.432165, 40.141025 ], [ -95.433374, 40.146114 ], [ -95.433822, 40.152935 ], [ -95.434817, 40.156017 ], [ -95.436348, 40.158720 ], [ -95.440694, 40.162282 ], [ -95.442818, 40.163261 ], [ -95.454919, 40.166577 ], [ -95.460746, 40.169173 ], [ -95.471054, 40.176910 ], [ -95.476301, 40.181988 ], [ -95.479193, 40.185652 ], [ -95.481020, 40.188524 ], [ -95.482540, 40.192283 ], [ -95.482757, 40.197346 ], [ -95.482319, 40.200667 ], [ -95.477948, 40.208643 ], [ -95.473469, 40.213482 ], [ -95.471393, 40.217333 ], [ -95.470061, 40.221507 ], [ -95.469718, 40.227908 ], [ -95.470349, 40.230819 ], [ -95.472548, 40.236078 ], [ -95.477501, 40.242720 ], [ -95.482778, 40.246273 ], [ -95.485994, 40.247825 ], [ -95.490333, 40.248966 ], [ -95.500260, 40.249629 ], [ -95.515455, 40.248505 ], [ -95.521925, 40.249470 ], [ -95.547160, 40.259066 ], [ -95.552473, 40.261904 ], [ -95.554324, 40.263395 ], [ -95.556325, 40.267714 ], [ -95.556275, 40.270761 ], [ -95.551488, 40.281061 ], [ -95.550966, 40.285947 ], [ -95.551620, 40.288666 ], [ -95.553292, 40.291158 ], [ -95.558732, 40.295774 ], [ -95.562157, 40.297359 ], [ -95.568140, 40.299129 ], [ -95.581787, 40.299580 ], [ -95.587371, 40.301649 ], [ -95.590165, 40.303199 ], [ -95.598657, 40.309809 ], [ -95.605110, 40.312559 ], [ -95.610439, 40.313970 ], [ -95.613479, 40.314233 ], [ -95.617931, 40.313728 ], [ -95.623213, 40.312469 ], [ -95.636310, 40.307675 ], [ -95.642262, 40.306025 ], [ -95.645329, 40.305693 ], [ -95.651507, 40.306684 ], [ -95.654294, 40.307906 ], [ -95.657328, 40.310856 ], [ -95.658025, 40.312700 ], [ -95.657764, 40.315788 ], [ -95.656612, 40.319465 ], [ -95.653729, 40.322582 ], [ -95.647931, 40.325556 ], [ -95.633807, 40.329297 ], [ -95.629936, 40.330994 ], [ -95.625204, 40.334288 ], [ -95.623182, 40.338367 ], [ -95.622704, 40.340856 ], [ -95.623728, 40.346567 ], [ -95.624815, 40.349214 ], [ -95.627124, 40.352800 ], [ -95.631481, 40.357310 ], [ -95.636991, 40.361360 ], [ -95.641027, 40.366399 ], [ -95.642414, 40.369829 ], [ -95.642679, 40.375001 ], [ -95.642147, 40.378243 ], [ -95.643934, 40.386849 ], [ -95.649418, 40.396149 ], [ -95.659134, 40.408690 ], [ -95.661463, 40.415947 ], [ -95.660721, 40.418841 ], [ -95.658310, 40.424538 ], [ -95.656288, 40.428765 ], [ -95.655630, 40.434736 ], [ -95.658190, 40.441880 ], [ -95.665413, 40.451182 ], [ -95.671742, 40.456695 ], [ -95.677174, 40.460158 ], [ -95.684363, 40.463366 ], [ -95.693133, 40.469396 ], [ -95.694651, 40.471452 ], [ -95.696365, 40.475897 ], [ -95.696756, 40.478849 ], [ -95.696206, 40.482113 ], [ -95.695247, 40.486587 ], [ -95.694726, 40.493602 ], [ -95.695945, 40.499051 ], [ -95.699969, 40.505275 ], [ -95.695604, 40.506473 ], [ -95.692083, 40.508133 ], [ -95.667981, 40.514960 ], [ -95.661687, 40.517309 ], [ -95.655674, 40.523557 ], [ -95.652262, 40.538114 ], [ -95.653410, 40.541893 ], [ -95.655848, 40.546609 ], [ -95.662097, 40.549959 ], [ -95.665486, 40.556686 ], [ -95.671754, 40.562626 ], [ -95.678718, 40.562560 ], [ -95.687109, 40.560664 ], [ -95.694147, 40.556942 ], [ -95.694881, 40.550720 ], [ -95.696673, 40.545137 ], [ -95.697281, 40.536985 ], [ -95.695050, 40.533124 ], [ -95.697210, 40.528477 ], [ -95.708591, 40.521551 ], [ -95.709974, 40.523798 ], [ -95.714291, 40.527208 ], [ -95.722444, 40.528118 ], [ -95.725214, 40.527773 ], [ -95.731179, 40.525436 ], [ -95.737250, 40.523930 ], [ -95.748680, 40.524275 ], [ -95.757110, 40.525990 ], [ -95.762857, 40.528371 ], [ -95.766920, 40.531563 ], [ -95.768693, 40.534106 ], [ -95.769281, 40.536656 ], [ -95.768412, 40.540347 ], [ -95.764696, 40.545721 ], [ -95.763624, 40.548298 ], [ -95.763366, 40.550797 ], [ -95.763833, 40.553873 ], [ -95.765030, 40.556921 ], [ -95.771776, 40.566133 ], [ -95.774704, 40.573574 ], [ -95.773549, 40.578205 ], [ -95.768527, 40.583296 ], [ -95.765645, 40.585208 ], [ -95.746443, 40.584935 ], [ -95.687500, 40.584381 ], [ -95.687442, 40.584380 ], [ -95.641840, 40.584234 ], [ -95.611069, 40.583495 ], [ -95.574046, 40.582963 ], [ -95.554959, 40.582629 ], [ -95.533182, 40.582249 ], [ -95.526682, 40.582136 ], [ -95.525392, 40.582090 ], [ -95.469319, 40.581540 ], [ -95.415406, 40.581014 ], [ -95.373893, 40.580501 ], [ -95.357802, 40.580100 ], [ -95.335588, 40.579871 ], [ -95.221525, 40.578827 ], [ -95.218783, 40.578781 ], [ -95.217455, 40.578759 ], [ -95.213327, 40.578689 ], [ -95.212715, 40.578679 ], [ -95.211590, 40.578654 ], [ -95.211408, 40.578650 ], [ -95.164058, 40.578017 ], [ -95.154499, 40.577860 ], [ -95.120829, 40.577413 ], [ -95.112222, 40.577228 ], [ -95.110663, 40.577206 ], [ -95.110303, 40.577160 ], [ -95.107213, 40.577116 ], [ -95.097607, 40.577168 ], [ -95.079742, 40.577007 ], [ -95.068921, 40.576880 ], [ -94.991661, 40.575692 ], [ -94.966491, 40.575839 ], [ -94.955134, 40.575669 ], [ -94.914896, 40.575068 ], [ -94.901451, 40.574877 ], [ -94.896801, 40.574738 ], [ -94.823758, 40.573942 ], [ -94.819978, 40.573714 ], [ -94.811188, 40.573532 ], [ -94.773988, 40.572977 ], [ -94.716665, 40.572201 ], [ -94.714925, 40.572201 ], [ -94.682601, 40.571787 ], [ -94.632032, 40.571186 ], [ -94.594001, 40.570966 ], [ -94.542154, 40.570809 ], [ -94.541828, 40.570809 ], [ -94.538318, 40.570763 ], [ -94.537058, 40.570763 ], [ -94.533878, 40.570739 ], [ -94.489280, 40.570707 ], [ -94.471213, 40.570825 ], [ -94.470648, 40.570830 ], [ -94.460088, 40.570947 ], [ -94.429725, 40.571041 ], [ -94.358307, 40.571363 ], [ -94.336706, 40.571452 ], [ -94.336556, 40.571475 ], [ -94.324765, 40.571477 ], [ -94.310724, 40.571524 ], [ -94.294813, 40.571341 ], [ -94.287350, 40.571521 ], [ -94.091085, 40.572897 ], [ -94.089194, 40.572806 ], [ -94.080463, 40.572899 ], [ -94.080223, 40.572899 ], [ -94.034134, 40.573585 ], [ -94.015492, 40.573914 ], [ -93.976766, 40.574635 ], [ -93.963863, 40.574754 ], [ -93.939857, 40.575192 ], [ -93.938627, 40.575284 ], [ -93.937097, 40.575421 ], [ -93.936317, 40.575284 ], [ -93.935687, 40.575330 ], [ -93.913961, 40.575672 ], [ -93.900877, 40.575874 ], [ -93.899317, 40.575942 ], [ -93.898327, 40.576011 ], [ -93.853656, 40.576606 ], [ -93.840930, 40.576791 ], [ -93.818725, 40.577086 ], [ -93.815485, 40.577278 ], [ -93.770231, 40.577615 ], [ -93.750223, 40.577720 ], [ -93.742759, 40.577518 ], [ -93.737259, 40.577542 ], [ -93.728355, 40.577547 ], [ -93.722443, 40.577641 ], [ -93.690333, 40.577875 ], [ -93.677099, 40.578127 ], [ -93.668845, 40.578241 ], [ -93.661913, 40.578354 ], [ -93.659272, 40.578330 ], [ -93.656211, 40.578352 ], [ -93.597352, 40.579496 ], [ -93.566189, 40.580117 ], [ -93.565810, 40.580075 ], [ -93.565240, 40.580143 ], [ -93.560798, 40.580304 ], [ -93.558938, 40.580189 ], [ -93.556899, 40.580235 ], [ -93.553986, 40.580303 ], [ -93.548284, 40.580417 ], [ -93.528177, 40.580367 ], [ -93.527607, 40.580436 ], [ -93.524124, 40.580481 ], [ -93.466887, 40.580072 ], [ -93.465297, 40.580164 ], [ -93.441767, 40.579916 ], [ -93.345442, 40.580514 ], [ -93.317605, 40.580671 ], [ -93.260612, 40.580797 ], [ -93.135802, 40.582854 ], [ -93.098507, 40.583973 ], [ -93.097296, 40.584014 ], [ -93.085517, 40.584403 ], [ -92.957747, 40.587430 ], [ -92.941595, 40.587743 ], [ -92.903544, 40.587860 ], [ -92.889796, 40.588039 ], [ -92.879178, 40.588341 ], [ -92.863034, 40.588175 ], [ -92.857391, 40.588360 ], [ -92.835074, 40.588484 ], [ -92.827992, 40.588515 ], [ -92.828061, 40.588593 ], [ -92.757407, 40.588908 ], [ -92.742232, 40.589207 ], [ -92.689854, 40.589884 ], [ -92.686693, 40.589809 ], [ -92.639223, 40.590825 ], [ -92.637898, 40.590853 ], [ -92.580278, 40.592151 ], [ -92.484588, 40.594924 ], [ -92.482394, 40.594894 ], [ -92.481692, 40.594941 ], [ -92.461609, 40.595355 ], [ -92.453745, 40.595288 ], [ -92.379691, 40.596509 ], [ -92.350776, 40.597274 ], [ -92.331445, 40.597714 ], [ -92.331205, 40.597805 ], [ -92.298754, 40.598469 ], [ -92.236484, 40.599531 ], [ -92.217603, 40.599832 ], [ -92.201669, 40.599980 ], [ -92.196162, 40.600069 ], [ -92.179780, 40.600529 ], [ -92.096387, 40.601830 ], [ -92.092875, 40.602082 ], [ -92.083200, 40.602244 ], [ -92.082339, 40.602176 ], [ -92.069521, 40.602772 ], [ -92.067904, 40.602648 ], [ -92.029649, 40.603713 ], [ -91.998683, 40.604433 ], [ -91.970988, 40.605112 ], [ -91.947708, 40.605471 ], [ -91.939292, 40.606150 ], [ -91.868401, 40.608059 ], [ -91.832481, 40.609797 ], [ -91.824826, 40.610191 ], [ -91.813968, 40.610526 ], [ -91.800133, 40.610953 ], [ -91.795374, 40.611101 ], [ -91.785916, 40.611488 ], [ -91.729115, 40.613640 ], [ -91.720058, 40.601527 ], [ -91.716769, 40.598530 ], [ -91.712025, 40.595046 ], [ -91.696359, 40.588148 ], [ -91.688820, 40.583409 ], [ -91.686357, 40.580875 ], [ -91.685381, 40.578892 ], [ -91.685723, 40.576785 ], [ -91.691557, 40.564867 ], [ -91.691591, 40.562222 ], [ -91.690804, 40.559893 ], [ -91.688700, 40.557390 ], [ -91.681714, 40.553035 ], [ -91.670993, 40.550937 ], [ -91.654345, 40.549189 ], [ -91.638082, 40.545541 ], [ -91.625161, 40.543500 ], [ -91.621900, 40.542292 ], [ -91.620071, 40.540817 ], [ -91.618999, 40.539084 ], [ -91.618028, 40.534030 ], [ -91.618793, 40.526286 ], [ -91.622196, 40.517040 ], [ -91.622362, 40.514362 ], [ -91.621353, 40.510072 ], [ -91.619486, 40.507134 ], [ -91.616948, 40.504794 ], [ -91.612821, 40.502377 ], [ -91.608347, 40.500040 ], [ -91.594644, 40.494997 ], [ -91.590817, 40.492292 ], [ -91.586884, 40.487233 ], [ -91.583315, 40.479118 ], [ -91.582437, 40.474703 ], [ -91.581528, 40.472876 ], [ -91.580355, 40.471015 ], [ -91.574746, 40.465664 ], [ -91.567743, 40.462290 ], [ -91.563844, 40.460988 ], [ -91.552691, 40.458769 ], [ -91.543785, 40.458149 ], [ -91.528600, 40.459002 ], [ -91.526155, 40.458625 ], [ -91.525090, 40.457845 ], [ -91.523864, 40.456331 ], [ -91.523072, 40.452254 ], [ -91.523271, 40.450061 ], [ -91.524053, 40.448437 ], [ -91.526108, 40.446634 ], [ -91.531912, 40.442730 ], [ -91.533548, 40.440804 ], [ -91.533623, 40.438320 ], [ -91.532807, 40.436784 ], [ -91.529132, 40.434272 ], [ -91.525000, 40.433483 ], [ -91.519935, 40.433673 ], [ -91.519134, 40.432822 ], [ -91.519012, 40.431298 ], [ -91.521388, 40.426488 ], [ -91.526555, 40.419872 ], [ -91.527057, 40.416689 ], [ -91.526425, 40.413404 ], [ -91.524612, 40.410765 ], [ -91.522333, 40.409648 ], [ -91.518392, 40.408682 ], [ -91.513993, 40.408537 ], [ -91.509063, 40.406775 ], [ -91.507427, 40.405524 ], [ -91.506745, 40.404335 ], [ -91.505272, 40.403512 ], [ -91.498093, 40.401926 ], [ -91.493644, 40.402433 ], [ -91.489816, 40.404317 ], [ -91.488481, 40.404317 ], [ -91.487829, 40.403866 ], [ -91.487955, 40.402465 ], [ -91.488597, 40.400009 ], [ -91.490816, 40.395225 ], [ -91.490977, 40.393484 ], [ -91.484507, 40.383900 ], [ -91.482322, 40.382057 ], [ -91.480251, 40.381783 ], [ -91.471967, 40.382884 ], [ -91.465116, 40.385257 ], [ -91.464681, 40.380949 ], [ -91.465891, 40.378365 ], [ -91.465009, 40.376223 ], [ -91.463895, 40.375659 ], [ -91.452458, 40.375501 ], [ -91.448441, 40.378914 ], [ -91.441243, 40.386255 ], [ -91.425662, 40.382491 ], [ -91.422324, 40.380939 ], [ -91.419422, 40.378264 ], [ -91.426632, 40.371988 ], [ -91.429442, 40.370386 ], [ -91.439342, 40.366569 ], [ -91.444833, 40.363170 ], [ -91.446308, 40.361823 ], [ -91.447835, 40.359129 ], [ -91.452237, 40.353670 ], [ -91.462140, 40.342414 ], [ -91.466603, 40.334461 ], [ -91.469656, 40.322409 ], [ -91.471826, 40.317340 ], [ -91.486078, 40.293426 ], [ -91.489868, 40.286048 ], [ -91.492727, 40.278217 ], [ -91.493061, 40.275262 ], [ -91.492891, 40.269923 ], [ -91.490525, 40.264814 ], [ -91.489969, 40.262340 ], [ -91.490524, 40.259498 ], [ -91.498104, 40.247422 ], [ -91.500855, 40.245722 ], [ -91.503231, 40.243474 ], [ -91.505828, 40.238839 ], [ -91.506501, 40.236304 ], [ -91.505968, 40.234305 ], [ -91.504289, 40.231712 ], [ -91.504282, 40.224299 ], [ -91.506947, 40.215550 ], [ -91.507269, 40.209338 ], [ -91.506664, 40.204758 ], [ -91.504477, 40.198262 ], [ -91.505495, 40.195606 ], [ -91.509551, 40.191338 ], [ -91.511073, 40.188794 ], [ -91.512974, 40.181062 ], [ -91.513079, 40.178537 ], [ -91.511956, 40.170441 ], [ -91.508224, 40.157665 ], [ -91.508324, 40.156326 ], [ -91.511590, 40.149269 ], [ -91.511749, 40.147091 ], [ -91.510322, 40.127994 ], [ -91.509245, 40.121876 ], [ -91.506006, 40.108126 ], [ -91.500823, 40.090956 ], [ -91.497663, 40.078257 ], [ -91.495365, 40.070951 ], [ -91.489606, 40.057435 ], [ -91.494878, 40.036453 ], [ -91.487351, 40.023201 ], [ -91.484064, 40.019332 ], [ -91.477298, 40.008993 ], [ -91.469247, 39.995327 ], [ -91.467294, 39.990631 ], [ -91.466682, 39.987253 ], [ -91.465315, 39.983995 ], [ -91.463683, 39.981845 ], [ -91.459533, 39.979892 ], [ -91.458852, 39.979015 ], [ -91.454647, 39.971306 ], [ -91.449806, 39.965278 ], [ -91.447236, 39.959502 ], [ -91.441560, 39.951299 ], [ -91.437090, 39.946417 ], [ -91.429055, 39.940741 ], [ -91.425782, 39.937765 ], [ -91.421832, 39.932973 ], [ -91.419360, 39.927717 ], [ -91.418807, 39.922126 ], [ -91.419880, 39.916533 ], [ -91.420878, 39.914865 ], [ -91.428956, 39.907729 ], [ -91.443513, 39.893583 ], [ -91.446922, 39.883034 ], [ -91.447844, 39.877951 ], [ -91.446385, 39.870394 ], [ -91.436051, 39.845510 ], [ -91.432919, 39.840554 ], [ -91.429519, 39.837801 ], [ -91.414513, 39.829984 ], [ -91.406223, 39.826472 ], [ -91.397853, 39.821122 ], [ -91.385773, 39.815553 ], [ -91.377971, 39.811273 ], [ -91.375148, 39.808860 ], [ -91.367966, 39.800403 ], [ -91.363444, 39.792804 ], [ -91.361571, 39.787548 ], [ -91.361744, 39.785079 ], [ -91.364848, 39.779388 ], [ -91.365694, 39.774910 ], [ -91.365906, 39.764956 ], [ -91.365125, 39.758723 ], [ -91.366047, 39.755955 ], [ -91.367406, 39.753880 ], [ -91.369953, 39.745042 ], [ -91.370009, 39.732524 ], [ -91.367753, 39.729029 ], [ -91.352749, 39.715279 ], [ -91.345300, 39.709402 ], [ -91.331603, 39.700433 ], [ -91.317814, 39.692591 ], [ -91.305348, 39.683957 ], [ -91.302485, 39.679631 ], [ -91.293788, 39.674766 ], [ -91.283329, 39.670134 ], [ -91.276140, 39.665759 ], [ -91.266765, 39.656993 ], [ -91.260475, 39.649024 ], [ -91.248779, 39.640880 ], [ -91.245914, 39.637311 ], [ -91.243560, 39.633064 ], [ -91.241225, 39.630067 ], [ -91.229317, 39.620853 ], [ -91.223328, 39.617603 ], [ -91.216640, 39.615124 ], [ -91.185921, 39.605119 ], [ -91.181936, 39.602677 ], [ -91.178012, 39.598196 ], [ -91.174651, 39.593313 ], [ -91.174232, 39.591975 ], [ -91.171641, 39.581899 ], [ -91.169820, 39.569555 ], [ -91.168419, 39.564928 ], [ -91.163634, 39.558566 ], [ -91.158606, 39.553048 ], [ -91.153628, 39.548248 ], [ -91.148275, 39.545798 ], [ -91.126638, 39.542227 ], [ -91.114305, 39.541098 ], [ -91.100307, 39.538695 ], [ -91.092869, 39.529275 ], [ -91.086292, 39.517141 ], [ -91.079769, 39.507728 ], [ -91.075309, 39.502845 ], [ -91.064305, 39.494643 ], [ -91.062414, 39.474122 ], [ -91.059439, 39.468860 ], [ -91.053058, 39.462122 ], [ -91.038270, 39.448436 ], [ -91.023610, 39.438694 ], [ -91.011954, 39.432661 ], [ -91.003692, 39.427603 ], [ -90.993789, 39.422959 ], [ -90.983020, 39.420462 ], [ -90.977618, 39.418290 ], [ -90.972465, 39.414144 ], [ -90.967480, 39.411948 ], [ -90.957459, 39.408996 ], [ -90.948299, 39.407502 ], [ -90.940766, 39.403984 ], [ -90.939025, 39.402744 ], [ -90.937419, 39.400803 ], [ -90.935729, 39.397331 ], [ -90.934007, 39.392127 ], [ -90.928745, 39.387544 ], [ -90.924601, 39.385136 ], [ -90.920976, 39.383687 ], [ -90.914658, 39.381956 ], [ -90.907999, 39.380812 ], [ -90.904862, 39.379403 ], [ -90.902905, 39.377534 ], [ -90.902656, 39.375366 ], [ -90.900095, 39.372354 ], [ -90.893777, 39.367343 ], [ -90.859113, 39.351370 ], [ -90.847500, 39.345272 ], [ -90.840106, 39.340438 ], [ -90.821306, 39.323659 ], [ -90.816851, 39.320496 ], [ -90.799346, 39.313087 ], [ -90.793461, 39.309498 ], [ -90.791689, 39.306957 ], [ -90.790675, 39.302908 ], [ -90.783789, 39.297164 ], [ -90.775673, 39.292811 ], [ -90.773887, 39.290544 ], [ -90.767648, 39.280025 ], [ -90.751599, 39.265432 ], [ -90.748877, 39.264126 ], [ -90.739087, 39.261893 ], [ -90.733976, 39.259098 ], [ -90.729960, 39.255894 ], [ -90.726981, 39.251173 ], [ -90.721593, 39.232730 ], [ -90.721188, 39.230176 ], [ -90.721835, 39.224108 ], [ -90.717113, 39.213912 ], [ -90.716597, 39.210414 ], [ -90.716677, 39.206723 ], [ -90.717427, 39.202791 ], [ -90.717404, 39.197414 ], [ -90.714370, 39.185308 ], [ -90.710480, 39.176366 ], [ -90.709953, 39.172924 ], [ -90.709146, 39.155111 ], [ -90.707902, 39.150860 ], [ -90.705168, 39.143152 ], [ -90.702923, 39.138749 ], [ -90.700464, 39.135439 ], [ -90.694945, 39.129680 ], [ -90.686051, 39.117785 ], [ -90.684518, 39.113567 ], [ -90.681086, 39.100590 ], [ -90.681994, 39.090066 ], [ -90.682744, 39.088348 ], [ -90.700424, 39.071787 ], [ -90.701187, 39.070408 ], [ -90.702136, 39.065568 ], [ -90.712541, 39.057064 ], [ -90.713585, 39.055567 ], [ -90.713629, 39.053977 ], [ -90.711580, 39.046798 ], [ -90.707885, 39.042262 ], [ -90.700595, 39.029074 ], [ -90.692403, 39.016656 ], [ -90.690000, 39.012169 ], [ -90.688813, 39.007342 ], [ -90.687719, 39.005374 ], [ -90.683683, 39.000049 ], [ -90.682068, 38.998778 ], [ -90.678193, 38.991851 ], [ -90.676397, 38.984096 ], [ -90.676417, 38.965812 ], [ -90.675949, 38.962140 ], [ -90.671844, 38.952296 ], [ -90.669229, 38.948176 ], [ -90.665565, 38.934179 ], [ -90.663372, 38.928042 ], [ -90.661400, 38.924989 ], [ -90.657254, 38.920270 ], [ -90.653164, 38.916141 ], [ -90.647988, 38.912106 ], [ -90.639917, 38.908272 ], [ -90.635896, 38.903941 ], [ -90.628485, 38.891617 ], [ -90.625122, 38.888654 ], [ -90.595354, 38.875050 ], [ -90.583388, 38.869030 ], [ -90.576719, 38.868336 ], [ -90.566557, 38.868847 ], [ -90.555693, 38.870785 ], [ -90.545872, 38.874008 ], [ -90.544030, 38.875050 ], [ -90.531118, 38.887078 ], [ -90.516963, 38.898818 ], [ -90.507451, 38.902767 ], [ -90.500117, 38.910408 ], [ -90.486974, 38.925982 ], [ -90.482725, 38.934712 ], [ -90.483452, 38.940436 ], [ -90.483339, 38.942133 ], [ -90.482419, 38.944460 ], [ -90.472122, 38.958838 ], [ -90.467784, 38.961809 ], [ -90.462411, 38.964322 ], [ -90.450792, 38.967764 ], [ -90.440078, 38.967364 ], [ -90.433745, 38.965526 ], [ -90.424726, 38.963785 ], [ -90.413108, 38.963330 ], [ -90.406367, 38.962554 ], [ -90.395816, 38.960037 ], [ -90.383126, 38.955453 ], [ -90.346442, 38.940790 ], [ -90.333533, 38.933489 ], [ -90.324179, 38.929827 ], [ -90.317572, 38.927912 ], [ -90.309454, 38.924120 ], [ -90.306113, 38.923525 ], [ -90.298711, 38.923395 ], [ -90.283712, 38.924048 ], [ -90.277471, 38.923716 ], [ -90.269872, 38.922556 ], [ -90.262792, 38.920344 ], [ -90.256993, 38.920763 ], [ -90.254033, 38.920489 ], [ -90.250248, 38.919344 ], [ -90.241703, 38.914828 ], [ -90.230336, 38.910860 ], [ -90.223041, 38.907389 ], [ -90.213519, 38.900454 ], [ -90.197610, 38.887648 ], [ -90.195210, 38.886748 ], [ -90.190309, 38.886248 ], [ -90.186909, 38.885048 ], [ -90.166409, 38.876348 ], [ -90.151508, 38.867148 ], [ -90.113327, 38.849306 ], [ -90.109407, 38.843548 ], [ -90.109107, 38.837448 ], [ -90.114707, 38.815048 ], [ -90.117707, 38.805748 ], [ -90.123107, 38.798048 ], [ -90.146708, 38.783049 ], [ -90.166409, 38.772649 ], [ -90.171309, 38.766549 ], [ -90.175109, 38.760249 ], [ -90.176309, 38.754449 ], [ -90.183409, 38.746849 ], [ -90.191309, 38.742949 ], [ -90.205210, 38.732150 ], [ -90.209910, 38.726050 ], [ -90.211410, 38.721350 ], [ -90.211910, 38.717950 ], [ -90.212010, 38.711750 ], [ -90.209210, 38.702750 ], [ -90.202210, 38.693450 ], [ -90.195210, 38.687550 ], [ -90.186410, 38.674750 ], [ -90.182610, 38.665350 ], [ -90.181110, 38.659550 ], [ -90.177710, 38.642750 ], [ -90.178010, 38.633750 ], [ -90.178810, 38.629150 ], [ -90.184510, 38.611551 ], [ -90.191811, 38.598951 ], [ -90.196011, 38.594451 ], [ -90.202511, 38.588651 ], [ -90.210111, 38.583951 ], [ -90.216712, 38.578751 ], [ -90.222112, 38.576451 ], [ -90.224212, 38.575051 ], [ -90.248913, 38.544752 ], [ -90.260314, 38.528352 ], [ -90.263814, 38.520552 ], [ -90.268814, 38.506152 ], [ -90.271314, 38.496052 ], [ -90.274914, 38.486253 ], [ -90.275915, 38.479553 ], [ -90.279215, 38.472453 ], [ -90.284015, 38.451053 ], [ -90.285215, 38.443453 ], [ -90.288815, 38.438453 ], [ -90.295316, 38.426753 ], [ -90.322317, 38.401753 ], [ -90.328517, 38.398153 ], [ -90.343118, 38.385453 ], [ -90.346118, 38.381853 ], [ -90.349743, 38.377609 ], [ -90.356318, 38.360354 ], [ -90.368219, 38.340254 ], [ -90.370819, 38.333554 ], [ -90.372519, 38.323354 ], [ -90.371719, 38.304354 ], [ -90.373819, 38.294454 ], [ -90.373929, 38.281853 ], [ -90.371869, 38.273926 ], [ -90.370892, 38.267441 ], [ -90.367764, 38.255807 ], [ -90.367013, 38.250054 ], [ -90.363926, 38.236355 ], [ -90.359559, 38.224525 ], [ -90.356176, 38.217501 ], [ -90.353902, 38.213855 ], [ -90.334258, 38.189932 ], [ -90.331554, 38.187580 ], [ -90.322353, 38.181593 ], [ -90.316839, 38.179456 ], [ -90.310630, 38.178572 ], [ -90.300490, 38.175246 ], [ -90.290765, 38.170453 ], [ -90.283091, 38.164447 ], [ -90.274928, 38.157615 ], [ -90.252484, 38.127571 ], [ -90.250118, 38.125054 ], [ -90.243116, 38.112669 ], [ -90.218708, 38.094365 ], [ -90.172220, 38.069636 ], [ -90.163411, 38.074347 ], [ -90.161562, 38.074890 ], [ -90.158533, 38.074735 ], [ -90.144553, 38.069023 ], [ -90.130788, 38.062341 ], [ -90.128159, 38.059644 ], [ -90.126396, 38.054897 ], [ -90.126006, 38.050570 ], [ -90.126612, 38.043981 ], [ -90.126194, 38.040702 ], [ -90.117423, 38.031708 ], [ -90.110520, 38.026547 ], [ -90.093774, 38.017833 ], [ -90.088260, 38.015772 ], [ -90.080959, 38.015428 ], [ -90.072283, 38.017001 ], [ -90.065045, 38.016875 ], [ -90.059367, 38.015543 ], [ -90.057269, 38.014362 ], [ -90.055399, 38.011953 ], [ -90.053541, 38.008440 ], [ -90.052883, 38.005907 ], [ -90.051357, 38.003584 ], [ -90.049106, 38.001715 ], [ -90.045908, 38.000052 ], [ -90.032410, 37.995258 ], [ -90.008353, 37.970179 ], [ -90.000110, 37.964563 ], [ -89.997103, 37.963225 ], [ -89.986296, 37.962198 ], [ -89.978919, 37.962791 ], [ -89.954910, 37.966647 ], [ -89.942099, 37.970121 ], [ -89.937740, 37.964994 ], [ -89.936930, 37.961042 ], [ -89.935886, 37.959581 ], [ -89.933797, 37.959143 ], [ -89.925085, 37.960021 ], [ -89.924811, 37.955823 ], [ -89.925389, 37.954130 ], [ -89.932467, 37.947497 ], [ -89.937927, 37.946193 ], [ -89.947429, 37.940336 ], [ -89.959646, 37.940196 ], [ -89.962273, 37.934363 ], [ -89.968365, 37.931456 ], [ -89.974918, 37.926719 ], [ -89.974221, 37.919217 ], [ -89.973642, 37.917661 ], [ -89.971649, 37.915260 ], [ -89.952499, 37.883218 ], [ -89.950594, 37.881526 ], [ -89.937383, 37.874693 ], [ -89.923185, 37.870672 ], [ -89.913317, 37.869641 ], [ -89.901832, 37.869822 ], [ -89.897301, 37.871605 ], [ -89.881475, 37.879591 ], [ -89.876594, 37.883294 ], [ -89.866988, 37.893519 ], [ -89.862949, 37.896906 ], [ -89.851048, 37.903980 ], [ -89.844786, 37.905572 ], [ -89.842649, 37.905196 ], [ -89.836254, 37.901802 ], [ -89.813647, 37.887710 ], [ -89.803913, 37.882985 ], [ -89.799333, 37.881517 ], [ -89.798041, 37.879655 ], [ -89.797678, 37.874202 ], [ -89.799835, 37.871367 ], [ -89.800360, 37.868625 ], [ -89.796087, 37.859505 ], [ -89.793718, 37.857054 ], [ -89.786369, 37.851734 ], [ -89.782035, 37.855092 ], [ -89.779828, 37.853896 ], [ -89.774306, 37.852123 ], [ -89.765222, 37.851782 ], [ -89.761992, 37.850657 ], [ -89.757363, 37.847613 ], [ -89.754104, 37.846358 ], [ -89.749961, 37.846984 ], [ -89.739873, 37.846930 ], [ -89.736439, 37.843494 ], [ -89.732737, 37.838507 ], [ -89.729426, 37.835081 ], [ -89.717480, 37.825724 ], [ -89.702844, 37.816812 ], [ -89.696559, 37.814337 ], [ -89.682850, 37.807789 ], [ -89.677605, 37.805066 ], [ -89.669644, 37.799922 ], [ -89.663982, 37.790801 ], [ -89.661320, 37.788204 ], [ -89.660380, 37.786296 ], [ -89.660227, 37.781032 ], [ -89.661190, 37.775732 ], [ -89.664130, 37.768510 ], [ -89.666474, 37.764195 ], [ -89.667993, 37.759484 ], [ -89.665546, 37.752095 ], [ -89.663352, 37.750052 ], [ -89.658455, 37.747710 ], [ -89.649530, 37.745498 ], [ -89.645429, 37.746108 ], [ -89.633370, 37.745782 ], [ -89.628010, 37.748135 ], [ -89.624023, 37.749120 ], [ -89.617278, 37.749720 ], [ -89.616389, 37.749167 ], [ -89.615933, 37.748184 ], [ -89.616194, 37.744283 ], [ -89.615586, 37.742350 ], [ -89.612478, 37.740036 ], [ -89.608757, 37.739684 ], [ -89.602406, 37.736492 ], [ -89.596566, 37.732886 ], [ -89.591289, 37.723599 ], [ -89.587213, 37.717510 ], [ -89.583316, 37.713261 ], [ -89.573516, 37.709065 ], [ -89.566704, 37.707189 ], [ -89.538652, 37.701054 ], [ -89.531427, 37.700334 ], [ -89.525730, 37.698441 ], [ -89.521948, 37.696475 ], [ -89.516685, 37.692762 ], [ -89.514255, 37.689923 ], [ -89.512009, 37.685525 ], [ -89.512040, 37.680985 ], [ -89.513927, 37.676575 ], [ -89.516146, 37.667975 ], [ -89.516827, 37.656089 ], [ -89.515903, 37.650803 ], [ -89.515860, 37.645555 ], [ -89.517136, 37.643789 ], [ -89.517718, 37.641217 ], [ -89.515649, 37.636446 ], [ -89.510526, 37.631755 ], [ -89.506563, 37.625050 ], [ -89.485792, 37.607157 ], [ -89.478399, 37.598869 ], [ -89.476514, 37.595554 ], [ -89.475932, 37.592998 ], [ -89.476030, 37.590226 ], [ -89.477548, 37.585885 ], [ -89.481118, 37.582973 ], [ -89.486062, 37.580853 ], [ -89.494051, 37.580116 ], [ -89.509542, 37.584147 ], [ -89.513943, 37.584815 ], [ -89.516538, 37.584504 ], [ -89.519808, 37.582748 ], [ -89.520804, 37.581155 ], [ -89.521274, 37.578971 ], [ -89.521925, 37.560735 ], [ -89.521093, 37.553805 ], [ -89.517051, 37.537278 ], [ -89.516447, 37.535558 ], [ -89.512400, 37.529810 ], [ -89.507459, 37.524322 ], [ -89.502917, 37.517870 ], [ -89.500231, 37.512954 ], [ -89.497689, 37.504948 ], [ -89.492051, 37.494008 ], [ -89.475525, 37.471388 ], [ -89.471201, 37.466473 ], [ -89.450969, 37.450069 ], [ -89.443493, 37.442129 ], [ -89.439769, 37.437200 ], [ -89.434130, 37.426847 ], [ -89.425940, 37.407471 ], [ -89.422465, 37.397132 ], [ -89.421320, 37.392077 ], [ -89.421054, 37.387668 ], [ -89.422037, 37.380530 ], [ -89.428185, 37.356158 ], [ -89.429738, 37.351956 ], [ -89.432836, 37.347056 ], [ -89.436040, 37.344441 ], [ -89.447556, 37.340475 ], [ -89.454723, 37.339283 ], [ -89.474569, 37.338165 ], [ -89.484211, 37.335646 ], [ -89.489005, 37.333368 ], [ -89.491194, 37.331361 ], [ -89.495160, 37.324795 ], [ -89.499090, 37.321490 ], [ -89.508174, 37.315662 ], [ -89.509699, 37.314260 ], [ -89.511842, 37.310825 ], [ -89.514042, 37.303776 ], [ -89.514605, 37.299323 ], [ -89.515741, 37.295362 ], [ -89.517692, 37.292040 ], [ -89.518393, 37.289354 ], [ -89.518340, 37.285497 ], [ -89.517032, 37.281920 ], [ -89.513905, 37.277164 ], [ -89.506773, 37.268537 ], [ -89.502303, 37.263738 ], [ -89.496386, 37.258474 ], [ -89.489915, 37.251315 ], [ -89.479205, 37.253052 ], [ -89.470525, 37.253357 ], [ -89.462660, 37.251520 ], [ -89.460692, 37.250577 ], [ -89.458827, 37.248661 ], [ -89.458246, 37.247066 ], [ -89.457832, 37.242594 ], [ -89.458302, 37.240368 ], [ -89.467500, 37.221844 ], [ -89.467631, 37.218200 ], [ -89.462676, 37.203351 ], [ -89.461862, 37.199517 ], [ -89.456105, 37.188120 ], [ -89.438275, 37.161287 ], [ -89.435202, 37.152090 ], [ -89.425580, 37.138235 ], [ -89.414471, 37.125050 ], [ -89.411730, 37.122507 ], [ -89.407451, 37.119307 ], [ -89.393427, 37.111197 ], [ -89.388050, 37.107481 ], [ -89.384175, 37.103267 ], [ -89.378710, 37.094586 ], [ -89.375615, 37.085936 ], [ -89.375712, 37.080505 ], [ -89.378889, 37.070499 ], [ -89.385186, 37.057748 ], [ -89.385434, 37.055130 ], [ -89.384681, 37.048251 ], [ -89.383937, 37.046441 ], [ -89.381644, 37.043010 ], [ -89.378277, 37.039605 ], [ -89.362397, 37.030156 ], [ -89.345996, 37.025521 ], [ -89.331164, 37.019936 ], [ -89.322982, 37.016090 ], [ -89.317168, 37.012767 ], [ -89.292130, 36.992189 ], [ -89.278628, 36.988670 ], [ -89.274198, 36.990495 ], [ -89.269564, 36.993401 ], [ -89.266242, 36.996302 ], [ -89.263527, 37.000050 ], [ -89.257608, 37.015496 ], [ -89.260003, 37.023288 ], [ -89.266286, 37.028683 ], [ -89.277715, 37.036140 ], [ -89.291185, 37.040408 ], [ -89.301368, 37.044982 ], [ -89.304752, 37.047565 ], [ -89.307397, 37.050432 ], [ -89.309401, 37.053769 ], [ -89.310819, 37.057897 ], [ -89.308290, 37.068371 ], [ -89.307726, 37.069654 ], [ -89.294036, 37.067345 ], [ -89.283685, 37.066736 ], [ -89.283488, 37.065811 ], [ -89.280375, 37.065224 ], [ -89.264484, 37.064814 ], [ -89.259936, 37.064071 ], [ -89.254930, 37.072014 ], [ -89.245648, 37.057783 ], [ -89.238253, 37.042853 ], [ -89.234053, 37.037277 ], [ -89.225482, 37.031077 ], [ -89.205038, 37.020047 ], [ -89.200793, 37.016164 ], [ -89.198488, 37.011723 ], [ -89.195029, 37.000051 ], [ -89.195039, 36.989768 ], [ -89.192097, 36.979995 ], [ -89.185491, 36.973518 ], [ -89.177235, 36.970885 ], [ -89.170008, 36.970298 ], [ -89.161767, 36.972768 ], [ -89.149882, 36.977636 ], [ -89.144110, 36.979133 ], [ -89.140814, 36.979416 ], [ -89.132685, 36.982200 ], [ -89.128868, 36.983265 ], [ -89.125069, 36.983499 ], [ -89.118300, 36.981879 ], [ -89.115030, 36.980335 ], [ -89.109498, 36.976563 ], [ -89.102879, 36.969700 ], [ -89.099594, 36.964543 ], [ -89.099007, 36.961389 ], [ -89.098843, 36.957850 ], [ -89.100766, 36.943973 ], [ -89.102137, 36.939154 ], [ -89.109377, 36.920066 ], [ -89.117567, 36.887356 ], [ -89.119813, 36.882792 ], [ -89.126702, 36.872073 ], [ -89.131944, 36.857437 ], [ -89.137969, 36.847349 ], [ -89.147674, 36.847148 ], [ -89.153513, 36.846600 ], [ -89.157330, 36.843305 ], [ -89.159466, 36.842505 ], [ -89.166841, 36.842529 ], [ -89.170400, 36.841522 ], [ -89.173419, 36.839806 ], [ -89.177177, 36.835779 ], [ -89.178153, 36.834586 ], [ -89.178888, 36.831368 ], [ -89.178574, 36.816554 ], [ -89.179229, 36.812915 ], [ -89.178749, 36.809928 ], [ -89.177417, 36.807269 ], [ -89.171069, 36.798119 ], [ -89.168458, 36.795571 ], [ -89.160877, 36.790914 ], [ -89.155891, 36.789126 ], [ -89.144208, 36.788353 ], [ -89.133210, 36.788228 ], [ -89.128923, 36.787677 ], [ -89.123530, 36.785309 ], [ -89.120437, 36.782071 ], [ -89.116847, 36.775607 ], [ -89.116067, 36.772423 ], [ -89.116563, 36.767557 ], [ -89.119198, 36.759802 ], [ -89.122430, 36.754844 ], [ -89.126134, 36.751735 ], [ -89.130399, 36.751702 ], [ -89.135518, 36.751956 ], [ -89.142313, 36.755369 ], [ -89.151756, 36.756264 ], [ -89.156990, 36.755968 ], [ -89.166888, 36.759633 ], [ -89.169106, 36.759473 ], [ -89.179545, 36.756132 ], [ -89.184523, 36.753638 ], [ -89.191553, 36.747217 ], [ -89.197808, 36.739412 ], [ -89.199798, 36.734217 ], [ -89.201047, 36.725772 ], [ -89.200732, 36.720141 ], [ -89.199480, 36.716045 ], [ -89.196040, 36.712017 ], [ -89.184356, 36.701238 ], [ -89.174836, 36.693960 ], [ -89.169522, 36.688878 ], [ -89.168016, 36.685514 ], [ -89.167961, 36.678189 ], [ -89.169467, 36.674596 ], [ -89.171882, 36.672526 ], [ -89.168723, 36.671892 ], [ -89.159080, 36.666352 ], [ -89.164601, 36.660132 ], [ -89.174741, 36.650416 ], [ -89.183321, 36.644694 ], [ -89.187749, 36.641115 ], [ -89.192542, 36.635997 ], [ -89.197654, 36.628936 ], [ -89.199136, 36.625649 ], [ -89.200902, 36.618177 ], [ -89.202607, 36.601576 ], [ -89.213563, 36.580119 ], [ -89.217447, 36.576159 ], [ -89.227319, 36.569375 ], [ -89.236542, 36.566824 ], [ -89.258318, 36.564948 ], [ -89.259994, 36.565149 ], [ -89.268057, 36.568908 ], [ -89.271710, 36.571387 ], [ -89.278935, 36.577699 ], [ -89.294637, 36.593729 ], [ -89.301502, 36.604138 ], [ -89.313405, 36.620120 ], [ -89.318154, 36.625059 ], [ -89.326731, 36.632186 ], [ -89.334046, 36.632250 ], [ -89.343753, 36.630991 ], [ -89.356510, 36.628439 ], [ -89.365548, 36.625059 ], [ -89.371002, 36.620840 ], [ -89.375453, 36.615719 ], [ -89.376367, 36.613868 ], [ -89.378012, 36.608096 ], [ -89.380643, 36.591130 ], [ -89.382762, 36.583603 ], [ -89.395909, 36.559649 ], [ -89.396627, 36.556429 ], [ -89.396811, 36.551975 ], [ -89.398685, 36.542329 ], [ -89.405654, 36.528165 ], [ -89.417293, 36.499033 ], [ -89.419770, 36.493896 ], [ -89.422942, 36.489381 ], [ -89.429311, 36.481875 ], [ -89.436763, 36.474432 ], [ -89.448468, 36.464420 ], [ -89.453081, 36.461285 ], [ -89.460436, 36.458140 ], [ -89.464153, 36.457189 ], [ -89.471718, 36.457001 ], [ -89.476532, 36.457846 ], [ -89.486215, 36.461620 ], [ -89.490670, 36.465528 ], [ -89.493198, 36.470124 ], [ -89.494074, 36.473225 ], [ -89.494248, 36.475972 ], [ -89.493495, 36.478700 ], [ -89.486710, 36.494954 ], [ -89.485106, 36.497692 ], [ -89.482474, 36.502131 ], [ -89.477186, 36.507070 ], [ -89.472460, 36.513741 ], [ -89.468668, 36.521291 ], [ -89.465888, 36.529946 ], [ -89.465445, 36.536163 ], [ -89.467761, 36.546847 ], [ -89.473341, 36.559918 ], [ -89.479093, 36.568206 ], [ -89.480893, 36.569771 ], [ -89.484836, 36.571821 ], [ -89.500076, 36.576305 ], [ -89.514468, 36.577803 ], [ -89.518702, 36.578698 ], [ -89.522338, 36.580180 ], [ -89.527583, 36.581147 ], [ -89.542459, 36.580566 ], [ -89.546113, 36.579989 ], [ -89.552640, 36.577178 ], [ -89.558089, 36.573514 ], [ -89.563185, 36.568749 ], [ -89.566817, 36.564216 ], [ -89.569807, 36.558119 ], [ -89.571509, 36.552569 ], [ -89.571241, 36.547343 ], [ -89.570071, 36.544387 ], [ -89.565804, 36.536988 ], [ -89.560344, 36.525436 ], [ -89.558349, 36.522099 ], [ -89.554321, 36.517022 ], [ -89.542955, 36.504957 ], [ -89.539100, 36.498201 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US31", "STATE": "31", "NAME": "Nebraska", "LSAD": "", "CENSUSAREA": 76824.171000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -95.765645, 40.585208 ], [ -95.768527, 40.583296 ], [ -95.773549, 40.578205 ], [ -95.774704, 40.573574 ], [ -95.771776, 40.566133 ], [ -95.765030, 40.556921 ], [ -95.763833, 40.553873 ], [ -95.763366, 40.550797 ], [ -95.763624, 40.548298 ], [ -95.764696, 40.545721 ], [ -95.768412, 40.540347 ], [ -95.769281, 40.536656 ], [ -95.768693, 40.534106 ], [ -95.766920, 40.531563 ], [ -95.762857, 40.528371 ], [ -95.757110, 40.525990 ], [ -95.748680, 40.524275 ], [ -95.737250, 40.523930 ], [ -95.731179, 40.525436 ], [ -95.725214, 40.527773 ], [ -95.722444, 40.528118 ], [ -95.714291, 40.527208 ], [ -95.709974, 40.523798 ], [ -95.708591, 40.521551 ], [ -95.697210, 40.528477 ], [ -95.695050, 40.533124 ], [ -95.697281, 40.536985 ], [ -95.696673, 40.545137 ], [ -95.694881, 40.550720 ], [ -95.694147, 40.556942 ], [ -95.687109, 40.560664 ], [ -95.678718, 40.562560 ], [ -95.671754, 40.562626 ], [ -95.665486, 40.556686 ], [ -95.662097, 40.549959 ], [ -95.655848, 40.546609 ], [ -95.653410, 40.541893 ], [ -95.652262, 40.538114 ], [ -95.655674, 40.523557 ], [ -95.661687, 40.517309 ], [ -95.667981, 40.514960 ], [ -95.692083, 40.508133 ], [ -95.695604, 40.506473 ], [ -95.699969, 40.505275 ], [ -95.695945, 40.499051 ], [ -95.694726, 40.493602 ], [ -95.695247, 40.486587 ], [ -95.696206, 40.482113 ], [ -95.696756, 40.478849 ], [ -95.696365, 40.475897 ], [ -95.694651, 40.471452 ], [ -95.693133, 40.469396 ], [ -95.684363, 40.463366 ], [ -95.677174, 40.460158 ], [ -95.671742, 40.456695 ], [ -95.665413, 40.451182 ], [ -95.658190, 40.441880 ], [ -95.655630, 40.434736 ], [ -95.656288, 40.428765 ], [ -95.658310, 40.424538 ], [ -95.660721, 40.418841 ], [ -95.661463, 40.415947 ], [ -95.659134, 40.408690 ], [ -95.649418, 40.396149 ], [ -95.643934, 40.386849 ], [ -95.642147, 40.378243 ], [ -95.642679, 40.375001 ], [ -95.642414, 40.369829 ], [ -95.641027, 40.366399 ], [ -95.636991, 40.361360 ], [ -95.631481, 40.357310 ], [ -95.627124, 40.352800 ], [ -95.624815, 40.349214 ], [ -95.623728, 40.346567 ], [ -95.622704, 40.340856 ], [ -95.623182, 40.338367 ], [ -95.625204, 40.334288 ], [ -95.629936, 40.330994 ], [ -95.633807, 40.329297 ], [ -95.647931, 40.325556 ], [ -95.653729, 40.322582 ], [ -95.656612, 40.319465 ], [ -95.657764, 40.315788 ], [ -95.658025, 40.312700 ], [ -95.657328, 40.310856 ], [ -95.654294, 40.307906 ], [ -95.651507, 40.306684 ], [ -95.645329, 40.305693 ], [ -95.642262, 40.306025 ], [ -95.636310, 40.307675 ], [ -95.623213, 40.312469 ], [ -95.617931, 40.313728 ], [ -95.613479, 40.314233 ], [ -95.610439, 40.313970 ], [ -95.605110, 40.312559 ], [ -95.598657, 40.309809 ], [ -95.590165, 40.303199 ], [ -95.587371, 40.301649 ], [ -95.581787, 40.299580 ], [ -95.568140, 40.299129 ], [ -95.562157, 40.297359 ], [ -95.558732, 40.295774 ], [ -95.553292, 40.291158 ], [ -95.551620, 40.288666 ], [ -95.550966, 40.285947 ], [ -95.551488, 40.281061 ], [ -95.556275, 40.270761 ], [ -95.556325, 40.267714 ], [ -95.554324, 40.263395 ], [ -95.552473, 40.261904 ], [ -95.547160, 40.259066 ], [ -95.521925, 40.249470 ], [ -95.515455, 40.248505 ], [ -95.500260, 40.249629 ], [ -95.490333, 40.248966 ], [ -95.485994, 40.247825 ], [ -95.482778, 40.246273 ], [ -95.477501, 40.242720 ], [ -95.472548, 40.236078 ], [ -95.470349, 40.230819 ], [ -95.469718, 40.227908 ], [ -95.470061, 40.221507 ], [ -95.471393, 40.217333 ], [ -95.473469, 40.213482 ], [ -95.477948, 40.208643 ], [ -95.482319, 40.200667 ], [ -95.482757, 40.197346 ], [ -95.482540, 40.192283 ], [ -95.481020, 40.188524 ], [ -95.479193, 40.185652 ], [ -95.476301, 40.181988 ], [ -95.471054, 40.176910 ], [ -95.460746, 40.169173 ], [ -95.454919, 40.166577 ], [ -95.442818, 40.163261 ], [ -95.440694, 40.162282 ], [ -95.436348, 40.158720 ], [ -95.434817, 40.156017 ], [ -95.433822, 40.152935 ], [ -95.433374, 40.146114 ], [ -95.432165, 40.141025 ], [ -95.431022, 40.138411 ], [ -95.428749, 40.135577 ], [ -95.424780, 40.132765 ], [ -95.419186, 40.130586 ], [ -95.409481, 40.130052 ], [ -95.404395, 40.129018 ], [ -95.398667, 40.126419 ], [ -95.395369, 40.122811 ], [ -95.393347, 40.119212 ], [ -95.392840, 40.115887 ], [ -95.393062, 40.111175 ], [ -95.394216, 40.108263 ], [ -95.397146, 40.105183 ], [ -95.400139, 40.103238 ], [ -95.407591, 40.098030 ], [ -95.410643, 40.091531 ], [ -95.409243, 40.084166 ], [ -95.408455, 40.079158 ], [ -95.409856, 40.074320 ], [ -95.414734, 40.069820 ], [ -95.418345, 40.066509 ], [ -95.420643, 40.062599 ], [ -95.421640, 40.058952 ], [ -95.419320, 40.048442 ], [ -95.416824, 40.043235 ], [ -95.413588, 40.038424 ], [ -95.407260, 40.033112 ], [ -95.402665, 40.030567 ], [ -95.395858, 40.028038 ], [ -95.391527, 40.027058 ], [ -95.387195, 40.026770 ], [ -95.382957, 40.027112 ], [ -95.363983, 40.031498 ], [ -95.356876, 40.031522 ], [ -95.348777, 40.029297 ], [ -95.346573, 40.028272 ], [ -95.336242, 40.019104 ], [ -95.328501, 40.015657 ], [ -95.318015, 40.013216 ], [ -95.315271, 40.012070 ], [ -95.312211, 40.009395 ], [ -95.311163, 40.007806 ], [ -95.308469, 40.002194 ], [ -95.308290, 39.999998 ], [ -95.339896, 39.999999 ], [ -95.375257, 40.000000 ], [ -95.784575, 40.000463 ], [ -95.788024, 40.000452 ], [ -95.882524, 40.000470 ], [ -95.958139, 40.000521 ], [ -96.010678, 40.000638 ], [ -96.024090, 40.000719 ], [ -96.051691, 40.000727 ], [ -96.081395, 40.000603 ], [ -96.089781, 40.000519 ], [ -96.125788, 40.000467 ], [ -96.125937, 40.000432 ], [ -96.147167, 40.000479 ], [ -96.154246, 40.000450 ], [ -96.154365, 40.000495 ], [ -96.220171, 40.000720 ], [ -96.223839, 40.000729 ], [ -96.239172, 40.000691 ], [ -96.301066, 40.000632 ], [ -96.304555, 40.000629 ], [ -96.463640, 40.000967 ], [ -96.467536, 40.001035 ], [ -96.469945, 40.000966 ], [ -96.527111, 40.001031 ], [ -96.538977, 40.000851 ], [ -96.557863, 40.000968 ], [ -96.570854, 40.001091 ], [ -96.580852, 40.000966 ], [ -96.604884, 40.000891 ], [ -96.610349, 40.000881 ], [ -96.622401, 40.001158 ], [ -96.873812, 40.001450 ], [ -96.875057, 40.001448 ], [ -96.878253, 40.001466 ], [ -96.880459, 40.001448 ], [ -96.916093, 40.001506 ], [ -97.009165, 40.001463 ], [ -97.030803, 40.001342 ], [ -97.049663, 40.001323 ], [ -97.137866, 40.001814 ], [ -97.142448, 40.001495 ], [ -97.181775, 40.001550 ], [ -97.200190, 40.001549 ], [ -97.202310, 40.001442 ], [ -97.245080, 40.001467 ], [ -97.245169, 40.001513 ], [ -97.350272, 40.001976 ], [ -97.350896, 40.001930 ], [ -97.369103, 40.002060 ], [ -97.415833, 40.002001 ], [ -97.417826, 40.002024 ], [ -97.425443, 40.002048 ], [ -97.444662, 40.001958 ], [ -97.463285, 40.002047 ], [ -97.510264, 40.001835 ], [ -97.511381, 40.001899 ], [ -97.515308, 40.001901 ], [ -97.767746, 40.001994 ], [ -97.769204, 40.001995 ], [ -97.770776, 40.001977 ], [ -97.777155, 40.002167 ], [ -97.819426, 40.001958 ], [ -97.821598, 40.002004 ], [ -97.838379, 40.001910 ], [ -97.857450, 40.002065 ], [ -97.876261, 40.002102 ], [ -97.931811, 40.002050 ], [ -97.972186, 40.002114 ], [ -98.010157, 40.002153 ], [ -98.014412, 40.002223 ], [ -98.047469, 40.002186 ], [ -98.050057, 40.002278 ], [ -98.068701, 40.002355 ], [ -98.076034, 40.002301 ], [ -98.099659, 40.002227 ], [ -98.142031, 40.002452 ], [ -98.172269, 40.002438 ], [ -98.179315, 40.002483 ], [ -98.193483, 40.002614 ], [ -98.250008, 40.002307 ], [ -98.268218, 40.002490 ], [ -98.274015, 40.002516 ], [ -98.490533, 40.002323 ], [ -98.523053, 40.002336 ], [ -98.543186, 40.002285 ], [ -98.560578, 40.002274 ], [ -98.575219, 40.002480 ], [ -98.593342, 40.002476 ], [ -98.613755, 40.002400 ], [ -98.640710, 40.002493 ], [ -98.652494, 40.002245 ], [ -98.653833, 40.002269 ], [ -98.669724, 40.002410 ], [ -98.672819, 40.002364 ], [ -98.690287, 40.002548 ], [ -98.691443, 40.002505 ], [ -98.693096, 40.002373 ], [ -98.710404, 40.002180 ], [ -98.726295, 40.002222 ], [ -98.774941, 40.002336 ], [ -98.777203, 40.002359 ], [ -98.820590, 40.002319 ], [ -98.834456, 40.002363 ], [ -98.934792, 40.002205 ], [ -98.960919, 40.002271 ], [ -98.961009, 40.002317 ], [ -98.971721, 40.002268 ], [ -98.972287, 40.002245 ], [ -98.992135, 40.002192 ], [ -99.018701, 40.002333 ], [ -99.020338, 40.002264 ], [ -99.085597, 40.002133 ], [ -99.113510, 40.002193 ], [ -99.123033, 40.002165 ], [ -99.169816, 40.001925 ], [ -99.178965, 40.001977 ], [ -99.186962, 40.001977 ], [ -99.188905, 40.002023 ], [ -99.197592, 40.002033 ], [ -99.216376, 40.002016 ], [ -99.250370, 40.001957 ], [ -99.254012, 40.002074 ], [ -99.282967, 40.001879 ], [ -99.286656, 40.002017 ], [ -99.290703, 40.001949 ], [ -99.403389, 40.001969 ], [ -99.412645, 40.001868 ], [ -99.423565, 40.002270 ], [ -99.480728, 40.001942 ], [ -99.493465, 40.001937 ], [ -99.497660, 40.001912 ], [ -99.498999, 40.001957 ], [ -99.501792, 40.002026 ], [ -99.625980, 40.001865 ], [ -99.628346, 40.001866 ], [ -99.719639, 40.001808 ], [ -99.731959, 40.001827 ], [ -99.746628, 40.001820 ], [ -99.756835, 40.001342 ], [ -99.764214, 40.001551 ], [ -99.772121, 40.001804 ], [ -99.775640, 40.001647 ], [ -99.813401, 40.001400 ], [ -99.906658, 40.001512 ], [ -99.930433, 40.001516 ], [ -99.944417, 40.001584 ], [ -99.948167, 40.001813 ], [ -99.986611, 40.001550 ], [ -99.990926, 40.001503 ], [ -100.177823, 40.001593 ], [ -100.188181, 40.001541 ], [ -100.190323, 40.001586 ], [ -100.193590, 40.001573 ], [ -100.196959, 40.001494 ], [ -100.215406, 40.001629 ], [ -100.229479, 40.001693 ], [ -100.231652, 40.001623 ], [ -100.390080, 40.001809 ], [ -100.439081, 40.001774 ], [ -100.447072, 40.001795 ], [ -100.468773, 40.001724 ], [ -100.475854, 40.001768 ], [ -100.477018, 40.001752 ], [ -100.487159, 40.001767 ], [ -100.511065, 40.001840 ], [ -100.551886, 40.001889 ], [ -100.567238, 40.001889 ], [ -100.594757, 40.001977 ], [ -100.600945, 40.001906 ], [ -100.645445, 40.001883 ], [ -100.660230, 40.002162 ], [ -100.683435, 40.002234 ], [ -100.721128, 40.002069 ], [ -100.729904, 40.002111 ], [ -100.733296, 40.002270 ], [ -100.752183, 40.002128 ], [ -100.758830, 40.002302 ], [ -100.937427, 40.002145 ], [ -101.027686, 40.002256 ], [ -101.060317, 40.002307 ], [ -101.130907, 40.002427 ], [ -101.168704, 40.002547 ], [ -101.178805, 40.002468 ], [ -101.192219, 40.002491 ], [ -101.215033, 40.002555 ], [ -101.248673, 40.002543 ], [ -101.286555, 40.002559 ], [ -101.293991, 40.002559 ], [ -101.324036, 40.002696 ], [ -101.342859, 40.002580 ], [ -101.374326, 40.002521 ], [ -101.409953, 40.002354 ], [ -101.417209, 40.002424 ], [ -101.542273, 40.002609 ], [ -101.625809, 40.002711 ], [ -101.627071, 40.002620 ], [ -101.804862, 40.002752 ], [ -101.807687, 40.002798 ], [ -101.832161, 40.002933 ], [ -101.841025, 40.002784 ], [ -101.904176, 40.003162 ], [ -101.916696, 40.003142 ], [ -102.051744, 40.003078 ], [ -102.052001, 40.148359 ], [ -102.051909, 40.162674 ], [ -102.051894, 40.229193 ], [ -102.051922, 40.235344 ], [ -102.051309, 40.338381 ], [ -102.051798, 40.360069 ], [ -102.051572, 40.393080 ], [ -102.051840, 40.396396 ], [ -102.051465, 40.440008 ], [ -102.051519, 40.520094 ], [ -102.051725, 40.537839 ], [ -102.051292, 40.749591 ], [ -102.051614, 41.002377 ], [ -102.070598, 41.002423 ], [ -102.124972, 41.002338 ], [ -102.191210, 41.002326 ], [ -102.209361, 41.002442 ], [ -102.212200, 41.002462 ], [ -102.231931, 41.002327 ], [ -102.267812, 41.002383 ], [ -102.272100, 41.002245 ], [ -102.291354, 41.002207 ], [ -102.292553, 41.002207 ], [ -102.292622, 41.002230 ], [ -102.292833, 41.002207 ], [ -102.364066, 41.002174 ], [ -102.379593, 41.002301 ], [ -102.469223, 41.002424 ], [ -102.470537, 41.002382 ], [ -102.487955, 41.002445 ], [ -102.556789, 41.002219 ], [ -102.566048, 41.002200 ], [ -102.575496, 41.002200 ], [ -102.575738, 41.002268 ], [ -102.578696, 41.002291 ], [ -102.621033, 41.002597 ], [ -102.653463, 41.002332 ], [ -102.739624, 41.002230 ], [ -102.754617, 41.002361 ], [ -102.766723, 41.002275 ], [ -102.773546, 41.002414 ], [ -102.827280, 41.002143 ], [ -102.830303, 41.002351 ], [ -102.846455, 41.002256 ], [ -102.849263, 41.002301 ], [ -102.865784, 41.001988 ], [ -102.867822, 41.002183 ], [ -102.885746, 41.002131 ], [ -102.887407, 41.002178 ], [ -102.904796, 41.002207 ], [ -102.906547, 41.002276 ], [ -102.924029, 41.002142 ], [ -102.925568, 41.002280 ], [ -102.943109, 41.002051 ], [ -102.944830, 41.002303 ], [ -102.959624, 41.002095 ], [ -102.960706, 41.002059 ], [ -102.962522, 41.002072 ], [ -102.963669, 41.002186 ], [ -102.981483, 41.002112 ], [ -102.982690, 41.002157 ], [ -103.000102, 41.002400 ], [ -103.002026, 41.002486 ], [ -103.038704, 41.002251 ], [ -103.043444, 41.002344 ], [ -103.057998, 41.002368 ], [ -103.059538, 41.002368 ], [ -103.076536, 41.002253 ], [ -103.077804, 41.002298 ], [ -103.362979, 41.001844 ], [ -103.365314, 41.001846 ], [ -103.396991, 41.002558 ], [ -103.421925, 41.001969 ], [ -103.421975, 41.002007 ], [ -103.486697, 41.001914 ], [ -103.497447, 41.001635 ], [ -103.574522, 41.001721 ], [ -103.750498, 41.002054 ], [ -103.858449, 41.001681 ], [ -103.877967, 41.001673 ], [ -103.896207, 41.001750 ], [ -103.906324, 41.001387 ], [ -103.953525, 41.001596 ], [ -103.971373, 41.001524 ], [ -103.972642, 41.001615 ], [ -104.018223, 41.001617 ], [ -104.023383, 41.001887 ], [ -104.039238, 41.001502 ], [ -104.053249, 41.001406 ], [ -104.053158, 41.016809 ], [ -104.053097, 41.018045 ], [ -104.053177, 41.089725 ], [ -104.053025, 41.090274 ], [ -104.053083, 41.104985 ], [ -104.053142, 41.114457 ], [ -104.053514, 41.157257 ], [ -104.052666, 41.275251 ], [ -104.052574, 41.278019 ], [ -104.052453, 41.278202 ], [ -104.052568, 41.316202 ], [ -104.052476, 41.320961 ], [ -104.052324, 41.321144 ], [ -104.052687, 41.330569 ], [ -104.052287, 41.393307 ], [ -104.052160, 41.407662 ], [ -104.052340, 41.417865 ], [ -104.052478, 41.515754 ], [ -104.052476, 41.522343 ], [ -104.052686, 41.539111 ], [ -104.052692, 41.541154 ], [ -104.052584, 41.552650 ], [ -104.052531, 41.552723 ], [ -104.052540, 41.564274 ], [ -104.052859, 41.592254 ], [ -104.052735, 41.613676 ], [ -104.052975, 41.622931 ], [ -104.052945, 41.638167 ], [ -104.052913, 41.645190 ], [ -104.052774, 41.733401 ], [ -104.053026, 41.885464 ], [ -104.052931, 41.906143 ], [ -104.052991, 41.914973 ], [ -104.052734, 41.973007 ], [ -104.052856, 41.975958 ], [ -104.052830, 41.994600 ], [ -104.052761, 41.994967 ], [ -104.052699, 41.998673 ], [ -104.052729, 42.016318 ], [ -104.052880, 42.021761 ], [ -104.052967, 42.075004 ], [ -104.052954, 42.089077 ], [ -104.052600, 42.124963 ], [ -104.052738, 42.133769 ], [ -104.053001, 42.137254 ], [ -104.052547, 42.166801 ], [ -104.052761, 42.170278 ], [ -104.053125, 42.249962 ], [ -104.052793, 42.249962 ], [ -104.052776, 42.258220 ], [ -104.053107, 42.499964 ], [ -104.052775, 42.610813 ], [ -104.052775, 42.611590 ], [ -104.052586, 42.630917 ], [ -104.052741, 42.633982 ], [ -104.052583, 42.650062 ], [ -104.052809, 42.749966 ], [ -104.052863, 42.754569 ], [ -104.053127, 43.000585 ], [ -103.991077, 43.001691 ], [ -103.966270, 43.001708 ], [ -103.924921, 43.000918 ], [ -103.815573, 43.001279 ], [ -103.813939, 43.001378 ], [ -103.715084, 43.000983 ], [ -103.652919, 43.001409 ], [ -103.618334, 43.000679 ], [ -103.576966, 43.000746 ], [ -103.576329, 43.000807 ], [ -103.506556, 43.000771 ], [ -103.506151, 43.000771 ], [ -103.505219, 43.000770 ], [ -103.404579, 43.000737 ], [ -103.340829, 43.000879 ], [ -103.132955, 43.000784 ], [ -103.131740, 43.000783 ], [ -102.792111, 42.999980 ], [ -102.487329, 42.999559 ], [ -102.440547, 42.999609 ], [ -102.082546, 42.999356 ], [ -101.849982, 42.999329 ], [ -101.713573, 42.996620 ], [ -101.625424, 42.996238 ], [ -101.500424, 42.997115 ], [ -101.230325, 42.997899 ], [ -101.229203, 42.997854 ], [ -101.226853, 42.997896 ], [ -101.226494, 42.997901 ], [ -101.043147, 42.997960 ], [ -101.000429, 42.997530 ], [ -100.964190, 42.997886 ], [ -100.958365, 42.997796 ], [ -100.906714, 42.997910 ], [ -100.887898, 42.997881 ], [ -100.867473, 42.998266 ], [ -100.631728, 42.998092 ], [ -100.625414, 42.998584 ], [ -100.553131, 42.998721 ], [ -100.544018, 42.998795 ], [ -100.534335, 42.999017 ], [ -100.472742, 42.999288 ], [ -100.355406, 42.998760 ], [ -100.349548, 42.998740 ], [ -100.283713, 42.998767 ], [ -100.277793, 42.998674 ], [ -100.198434, 42.998542 ], [ -100.126896, 42.998711 ], [ -100.126427, 42.998710 ], [ -100.119297, 42.998689 ], [ -100.034389, 42.998425 ], [ -100.027815, 42.998424 ], [ -100.004757, 42.998392 ], [ -99.961204, 42.998335 ], [ -99.950921, 42.998291 ], [ -99.950411, 42.998286 ], [ -99.927645, 42.998113 ], [ -99.918401, 42.998057 ], [ -99.877697, 42.998094 ], [ -99.869885, 42.998094 ], [ -99.859945, 42.997962 ], [ -99.850037, 42.998171 ], [ -99.821868, 42.997995 ], [ -99.809373, 42.998178 ], [ -99.803328, 42.998064 ], [ -99.800306, 42.997972 ], [ -99.788247, 42.998016 ], [ -99.768524, 42.998125 ], [ -99.743138, 42.997912 ], [ -99.726788, 42.997892 ], [ -99.719177, 42.997899 ], [ -99.701446, 42.997994 ], [ -99.699234, 42.997880 ], [ -99.569277, 42.997995 ], [ -99.535375, 42.998038 ], [ -99.494287, 42.998118 ], [ -99.490798, 42.998143 ], [ -99.474531, 42.998081 ], [ -99.471353, 42.997967 ], [ -99.395568, 42.998170 ], [ -99.374268, 42.998047 ], [ -99.371121, 42.998093 ], [ -99.368628, 42.998140 ], [ -99.347283, 42.998217 ], [ -99.288045, 42.998152 ], [ -99.262710, 42.998234 ], [ -99.254297, 42.998138 ], [ -99.234462, 42.998281 ], [ -99.195199, 42.998107 ], [ -99.161388, 42.998465 ], [ -99.151143, 42.998344 ], [ -99.139045, 42.998508 ], [ -99.135961, 42.998301 ], [ -99.081880, 42.998288 ], [ -99.080011, 42.998357 ], [ -99.022300, 42.998237 ], [ -99.021909, 42.998365 ], [ -99.000370, 42.998273 ], [ -98.962081, 42.998286 ], [ -98.919234, 42.998241 ], [ -98.919136, 42.998242 ], [ -98.903154, 42.998306 ], [ -98.899944, 42.998122 ], [ -98.823989, 42.998310 ], [ -98.801304, 42.998241 ], [ -98.764378, 42.998323 ], [ -98.742394, 42.998343 ], [ -98.665613, 42.998536 ], [ -98.663712, 42.998444 ], [ -98.568936, 42.998537 ], [ -98.565072, 42.998400 ], [ -98.498550, 42.998560 ], [ -98.495747, 42.988032 ], [ -98.490483, 42.977948 ], [ -98.478919, 42.963539 ], [ -98.467356, 42.947556 ], [ -98.461673, 42.944427 ], [ -98.458515, 42.943374 ], [ -98.452220, 42.938389 ], [ -98.448309, 42.936428 ], [ -98.447047, 42.935117 ], [ -98.445861, 42.930620 ], [ -98.444145, 42.929242 ], [ -98.439743, 42.928195 ], [ -98.437285, 42.928393 ], [ -98.434503, 42.929227 ], [ -98.430934, 42.931504 ], [ -98.426287, 42.932100 ], [ -98.420740, 42.931924 ], [ -98.407824, 42.925750 ], [ -98.399298, 42.922465 ], [ -98.386445, 42.918407 ], [ -98.375358, 42.913132 ], [ -98.358047, 42.907516 ], [ -98.346230, 42.902747 ], [ -98.342408, 42.900847 ], [ -98.337990, 42.897760 ], [ -98.335846, 42.895654 ], [ -98.333497, 42.891532 ], [ -98.332423, 42.890501 ], [ -98.329663, 42.888441 ], [ -98.325864, 42.886500 ], [ -98.319513, 42.884540 ], [ -98.297465, 42.880059 ], [ -98.280007, 42.874996 ], [ -98.268363, 42.874152 ], [ -98.258276, 42.874390 ], [ -98.251810, 42.872824 ], [ -98.249820, 42.871843 ], [ -98.246830, 42.868397 ], [ -98.231922, 42.861140 ], [ -98.226512, 42.857742 ], [ -98.224231, 42.855521 ], [ -98.219826, 42.853157 ], [ -98.204506, 42.846845 ], [ -98.189765, 42.841628 ], [ -98.171113, 42.837114 ], [ -98.167523, 42.836925 ], [ -98.163262, 42.837143 ], [ -98.148060, 42.840013 ], [ -98.146933, 42.839823 ], [ -98.137912, 42.832728 ], [ -98.129038, 42.821228 ], [ -98.127489, 42.820127 ], [ -98.107688, 42.810633 ], [ -98.104700, 42.808475 ], [ -98.094574, 42.799309 ], [ -98.087819, 42.795789 ], [ -98.082782, 42.794342 ], [ -98.067388, 42.784759 ], [ -98.062913, 42.781119 ], [ -98.061254, 42.777954 ], [ -98.059838, 42.772772 ], [ -98.056625, 42.770781 ], [ -98.051624, 42.768769 ], [ -98.044688, 42.768029 ], [ -98.042011, 42.767316 ], [ -98.037114, 42.765724 ], [ -98.035034, 42.764205 ], [ -98.017228, 42.762411 ], [ -98.013046, 42.762299 ], [ -98.005739, 42.764167 ], [ -98.002532, 42.763264 ], [ -98.000348, 42.763256 ], [ -97.992507, 42.765111 ], [ -97.977588, 42.769923 ], [ -97.962044, 42.768708 ], [ -97.953492, 42.769040 ], [ -97.950147, 42.769619 ], [ -97.936716, 42.775754 ], [ -97.932962, 42.778203 ], [ -97.921434, 42.788352 ], [ -97.915947, 42.789901 ], [ -97.908983, 42.794909 ], [ -97.905001, 42.798872 ], [ -97.894390, 42.811682 ], [ -97.890241, 42.815113 ], [ -97.888562, 42.817251 ], [ -97.884864, 42.826231 ], [ -97.879878, 42.835395 ], [ -97.878976, 42.843673 ], [ -97.875849, 42.847725 ], [ -97.875651, 42.850307 ], [ -97.876887, 42.852663 ], [ -97.877003, 42.854394 ], [ -97.875345, 42.858724 ], [ -97.865695, 42.862860 ], [ -97.857957, 42.865093 ], [ -97.845270, 42.867734 ], [ -97.834172, 42.868794 ], [ -97.828496, 42.868797 ], [ -97.825804, 42.867532 ], [ -97.817075, 42.861781 ], [ -97.801344, 42.858003 ], [ -97.788462, 42.853375 ], [ -97.774456, 42.849774 ], [ -97.764730, 42.849100 ], [ -97.753801, 42.849012 ], [ -97.750343, 42.849493 ], [ -97.720450, 42.847439 ], [ -97.701030, 42.843797 ], [ -97.686506, 42.842435 ], [ -97.668294, 42.843031 ], [ -97.657846, 42.844626 ], [ -97.646719, 42.847602 ], [ -97.620276, 42.856598 ], [ -97.611811, 42.858367 ], [ -97.603762, 42.858329 ], [ -97.599260, 42.856229 ], [ -97.591916, 42.853837 ], [ -97.574551, 42.849653 ], [ -97.561928, 42.847552 ], [ -97.547473, 42.848028 ], [ -97.531867, 42.850105 ], [ -97.515948, 42.853752 ], [ -97.504847, 42.858477 ], [ -97.500341, 42.857220 ], [ -97.499088, 42.855197 ], [ -97.496230, 42.853231 ], [ -97.491490, 42.851625 ], [ -97.484921, 42.850368 ], [ -97.470529, 42.850455 ], [ -97.461666, 42.849176 ], [ -97.458772, 42.848322 ], [ -97.456383, 42.846937 ], [ -97.452177, 42.846048 ], [ -97.442279, 42.846224 ], [ -97.439114, 42.847110 ], [ -97.431951, 42.851542 ], [ -97.425543, 42.856658 ], [ -97.425087, 42.858221 ], [ -97.423190, 42.861168 ], [ -97.417066, 42.865918 ], [ -97.413422, 42.867351 ], [ -97.408315, 42.868334 ], [ -97.404442, 42.867750 ], [ -97.399303, 42.864835 ], [ -97.393966, 42.864250 ], [ -97.376695, 42.865195 ], [ -97.375337, 42.862991 ], [ -97.368643, 42.858419 ], [ -97.361784, 42.855123 ], [ -97.359569, 42.854816 ], [ -97.341181, 42.855882 ], [ -97.336156, 42.856802 ], [ -97.330749, 42.858406 ], [ -97.328511, 42.859501 ], [ -97.326348, 42.861289 ], [ -97.324457, 42.861998 ], [ -97.318066, 42.863247 ], [ -97.311091, 42.865821 ], [ -97.308853, 42.867307 ], [ -97.306677, 42.867604 ], [ -97.302075, 42.865660 ], [ -97.289859, 42.855499 ], [ -97.267946, 42.852583 ], [ -97.256752, 42.853913 ], [ -97.251764, 42.855432 ], [ -97.248556, 42.855386 ], [ -97.237868, 42.853139 ], [ -97.231929, 42.851335 ], [ -97.218825, 42.845848 ], [ -97.217411, 42.843519 ], [ -97.218269, 42.829561 ], [ -97.217830, 42.827766 ], [ -97.215059, 42.822977 ], [ -97.213957, 42.820143 ], [ -97.213084, 42.813007 ], [ -97.211654, 42.810684 ], [ -97.210126, 42.809296 ], [ -97.204726, 42.806505 ], [ -97.200431, 42.805485 ], [ -97.187600, 42.804835 ], [ -97.178488, 42.803230 ], [ -97.172083, 42.802925 ], [ -97.166978, 42.802087 ], [ -97.163857, 42.801257 ], [ -97.150763, 42.795566 ], [ -97.144595, 42.790113 ], [ -97.138216, 42.783428 ], [ -97.137028, 42.780963 ], [ -97.137101, 42.778932 ], [ -97.134461, 42.774494 ], [ -97.131331, 42.771929 ], [ -97.111622, 42.769390 ], [ -97.101265, 42.769697 ], [ -97.096128, 42.769340 ], [ -97.085463, 42.770061 ], [ -97.079356, 42.771406 ], [ -97.071849, 42.772305 ], [ -97.065592, 42.772189 ], [ -97.052180, 42.770187 ], [ -97.033229, 42.765904 ], [ -97.030189, 42.763712 ], [ -97.024850, 42.762430 ], [ -96.992820, 42.759481 ], [ -96.982197, 42.760554 ], [ -96.979120, 42.760090 ], [ -96.975339, 42.758321 ], [ -96.968880, 42.754278 ], [ -96.961230, 42.740623 ], [ -96.960866, 42.739089 ], [ -96.961291, 42.736569 ], [ -96.965833, 42.727096 ], [ -96.965679, 42.724532 ], [ -96.964776, 42.722455 ], [ -96.963531, 42.720643 ], [ -96.961576, 42.719841 ], [ -96.955862, 42.719178 ], [ -96.948902, 42.719465 ], [ -96.941111, 42.721569 ], [ -96.936773, 42.723428 ], [ -96.930247, 42.726441 ], [ -96.924156, 42.730327 ], [ -96.920494, 42.731432 ], [ -96.906797, 42.733800 ], [ -96.886845, 42.725222 ], [ -96.872789, 42.724096 ], [ -96.860436, 42.720797 ], [ -96.849956, 42.715034 ], [ -96.843419, 42.712024 ], [ -96.829554, 42.708441 ], [ -96.819452, 42.707774 ], [ -96.813148, 42.706397 ], [ -96.806223, 42.704154 ], [ -96.801652, 42.698774 ], [ -96.800485, 42.692466 ], [ -96.800193, 42.684346 ], [ -96.802178, 42.672237 ], [ -96.800986, 42.669758 ], [ -96.798745, 42.668243 ], [ -96.793238, 42.666024 ], [ -96.778182, 42.662993 ], [ -96.764060, 42.661985 ], [ -96.751239, 42.664360 ], [ -96.749372, 42.665733 ], [ -96.746949, 42.666223 ], [ -96.735460, 42.667164 ], [ -96.728024, 42.666882 ], [ -96.697639, 42.659143 ], [ -96.691269, 42.656200 ], [ -96.687669, 42.653126 ], [ -96.687082, 42.652093 ], [ -96.686982, 42.649783 ], [ -96.687788, 42.645992 ], [ -96.689083, 42.644081 ], [ -96.692599, 42.642040 ], [ -96.696852, 42.637596 ], [ -96.707290, 42.625317 ], [ -96.709485, 42.621932 ], [ -96.711312, 42.617375 ], [ -96.711546, 42.614758 ], [ -96.710995, 42.608128 ], [ -96.709300, 42.603753 ], [ -96.706416, 42.599413 ], [ -96.697313, 42.590412 ], [ -96.685746, 42.577944 ], [ -96.681369, 42.574486 ], [ -96.675952, 42.571600 ], [ -96.658754, 42.566426 ], [ -96.648135, 42.560877 ], [ -96.643589, 42.557604 ], [ -96.638033, 42.551960 ], [ -96.635330, 42.547640 ], [ -96.633321, 42.540211 ], [ -96.633343, 42.531984 ], [ -96.632882, 42.528987 ], [ -96.631494, 42.524319 ], [ -96.628179, 42.516963 ], [ -96.625958, 42.513576 ], [ -96.611489, 42.506088 ], [ -96.608883, 42.505218 ], [ -96.603468, 42.504460 ], [ -96.595992, 42.504621 ], [ -96.591121, 42.505410 ], [ -96.584348, 42.507834 ], [ -96.572510, 42.515737 ], [ -96.567896, 42.517877 ], [ -96.557775, 42.520380 ], [ -96.548791, 42.520547 ], [ -96.538036, 42.518131 ], [ -96.531616, 42.515170 ], [ -96.528753, 42.513273 ], [ -96.525142, 42.510234 ], [ -96.520683, 42.504761 ], [ -96.518752, 42.500839 ], [ -96.517557, 42.496902 ], [ -96.515891, 42.494270 ], [ -96.508587, 42.486691 ], [ -96.505704, 42.484723 ], [ -96.501321, 42.482749 ], [ -96.489497, 42.480112 ], [ -96.478792, 42.479635 ], [ -96.475565, 42.480036 ], [ -96.465671, 42.483132 ], [ -96.459709, 42.486037 ], [ -96.443408, 42.489495 ], [ -96.423892, 42.488980 ], [ -96.409408, 42.487595 ], [ -96.396107, 42.484095 ], [ -96.386007, 42.474495 ], [ -96.385407, 42.473094 ], [ -96.381307, 42.461694 ], [ -96.380107, 42.451494 ], [ -96.380707, 42.446394 ], [ -96.384307, 42.437294 ], [ -96.387608, 42.432494 ], [ -96.411808, 42.410894 ], [ -96.413609, 42.407894 ], [ -96.415509, 42.400294 ], [ -96.414980, 42.393442 ], [ -96.409153, 42.381491 ], [ -96.408436, 42.376092 ], [ -96.413994, 42.365932 ], [ -96.417093, 42.361443 ], [ -96.417918, 42.358700 ], [ -96.418168, 42.354678 ], [ -96.417786, 42.351449 ], [ -96.413895, 42.343393 ], [ -96.407998, 42.337408 ], [ -96.402957, 42.334156 ], [ -96.396269, 42.330857 ], [ -96.384169, 42.325874 ], [ -96.375307, 42.318339 ], [ -96.371790, 42.314172 ], [ -96.369969, 42.310878 ], [ -96.369212, 42.308344 ], [ -96.368507, 42.303622 ], [ -96.368454, 42.291848 ], [ -96.365792, 42.285875 ], [ -96.360800, 42.279867 ], [ -96.356389, 42.276480 ], [ -96.341450, 42.269115 ], [ -96.336003, 42.264806 ], [ -96.331331, 42.259430 ], [ -96.328905, 42.254734 ], [ -96.327706, 42.249992 ], [ -96.328955, 42.241885 ], [ -96.330004, 42.240224 ], [ -96.322868, 42.233637 ], [ -96.322827, 42.231461 ], [ -96.323723, 42.229887 ], [ -96.332044, 42.221585 ], [ -96.336323, 42.218922 ], [ -96.339086, 42.218087 ], [ -96.345055, 42.217490 ], [ -96.356591, 42.215182 ], [ -96.358141, 42.214088 ], [ -96.359870, 42.210545 ], [ -96.359087, 42.207799 ], [ -96.351515, 42.200485 ], [ -96.349166, 42.197253 ], [ -96.348066, 42.194747 ], [ -96.347243, 42.186721 ], [ -96.350323, 42.177440 ], [ -96.349688, 42.172043 ], [ -96.347752, 42.166806 ], [ -96.342395, 42.160491 ], [ -96.337980, 42.157197 ], [ -96.325872, 42.151487 ], [ -96.319528, 42.146647 ], [ -96.316979, 42.143171 ], [ -96.313819, 42.136338 ], [ -96.310085, 42.132523 ], [ -96.305884, 42.129826 ], [ -96.301023, 42.128042 ], [ -96.285670, 42.125619 ], [ -96.279203, 42.123480 ], [ -96.275002, 42.120779 ], [ -96.272299, 42.118396 ], [ -96.268900, 42.113590 ], [ -96.267318, 42.110265 ], [ -96.266594, 42.103262 ], [ -96.267636, 42.096177 ], [ -96.271777, 42.088697 ], [ -96.274135, 42.085934 ], [ -96.276758, 42.081416 ], [ -96.279079, 42.074026 ], [ -96.279342, 42.070280 ], [ -96.278445, 42.060399 ], [ -96.275548, 42.051976 ], [ -96.272877, 42.047238 ], [ -96.271427, 42.044988 ], [ -96.268637, 42.042314 ], [ -96.263886, 42.039858 ], [ -96.261132, 42.038974 ], [ -96.256087, 42.038080 ], [ -96.254542, 42.039454 ], [ -96.246832, 42.041616 ], [ -96.238392, 42.041088 ], [ -96.232125, 42.039145 ], [ -96.225656, 42.035217 ], [ -96.223822, 42.033346 ], [ -96.221901, 42.029558 ], [ -96.221730, 42.026205 ], [ -96.223611, 42.022652 ], [ -96.227867, 42.018651 ], [ -96.238859, 42.012315 ], [ -96.241932, 42.006965 ], [ -96.242380, 42.002899 ], [ -96.242035, 42.000911 ], [ -96.240713, 41.999351 ], [ -96.236487, 41.996428 ], [ -96.229739, 41.994410 ], [ -96.225463, 41.994734 ], [ -96.223896, 41.995456 ], [ -96.221813, 41.997382 ], [ -96.217637, 42.003862 ], [ -96.215225, 42.006701 ], [ -96.206083, 42.009267 ], [ -96.194556, 42.008662 ], [ -96.188067, 42.006323 ], [ -96.184644, 42.002633 ], [ -96.183568, 41.999987 ], [ -96.183801, 41.997760 ], [ -96.184784, 41.995460 ], [ -96.189516, 41.989314 ], [ -96.192141, 41.984461 ], [ -96.191549, 41.982032 ], [ -96.190602, 41.980721 ], [ -96.186265, 41.977417 ], [ -96.184243, 41.976696 ], [ -96.177203, 41.976325 ], [ -96.174154, 41.976864 ], [ -96.168071, 41.978996 ], [ -96.160680, 41.980114 ], [ -96.156538, 41.980137 ], [ -96.141228, 41.978063 ], [ -96.132537, 41.974625 ], [ -96.129505, 41.971673 ], [ -96.128900, 41.969727 ], [ -96.129186, 41.965136 ], [ -96.133318, 41.955732 ], [ -96.135393, 41.952223 ], [ -96.142597, 41.945908 ], [ -96.143603, 41.944512 ], [ -96.144583, 41.941544 ], [ -96.143493, 41.937387 ], [ -96.136613, 41.927167 ], [ -96.136133, 41.923530 ], [ -96.136743, 41.920826 ], [ -96.139653, 41.916838 ], [ -96.142265, 41.915379 ], [ -96.154301, 41.912421 ], [ -96.159098, 41.910057 ], [ -96.160767, 41.908044 ], [ -96.161988, 41.905553 ], [ -96.161756, 41.901820 ], [ -96.158204, 41.897173 ], [ -96.152179, 41.892085 ], [ -96.148826, 41.888132 ], [ -96.147350, 41.884811 ], [ -96.146757, 41.877538 ], [ -96.146083, 41.874988 ], [ -96.144483, 41.871854 ], [ -96.142045, 41.868865 ], [ -96.135253, 41.863128 ], [ -96.130620, 41.860809 ], [ -96.123215, 41.858580 ], [ -96.116202, 41.854869 ], [ -96.113962, 41.853102 ], [ -96.110246, 41.848850 ], [ -96.108029, 41.844397 ], [ -96.107911, 41.840339 ], [ -96.110907, 41.830818 ], [ -96.110810, 41.828172 ], [ -96.109347, 41.823735 ], [ -96.107592, 41.820685 ], [ -96.103749, 41.817151 ], [ -96.098270, 41.814206 ], [ -96.093835, 41.812785 ], [ -96.081026, 41.810144 ], [ -96.075548, 41.807811 ], [ -96.069662, 41.803509 ], [ -96.067329, 41.800628 ], [ -96.064879, 41.796230 ], [ -96.064537, 41.793002 ], [ -96.066413, 41.788913 ], [ -96.073197, 41.783009 ], [ -96.077543, 41.777824 ], [ -96.078939, 41.771353 ], [ -96.078300, 41.761598 ], [ -96.079915, 41.757895 ], [ -96.084673, 41.753314 ], [ -96.091687, 41.750419 ], [ -96.097511, 41.749076 ], [ -96.102772, 41.746339 ], [ -96.104622, 41.744211 ], [ -96.106425, 41.737890 ], [ -96.106326, 41.734591 ], [ -96.105582, 41.731647 ], [ -96.102610, 41.728016 ], [ -96.087600, 41.722180 ], [ -96.079682, 41.717962 ], [ -96.075151, 41.713265 ], [ -96.073376, 41.710674 ], [ -96.072494, 41.708794 ], [ -96.072321, 41.706858 ], [ -96.073063, 41.705004 ], [ -96.075955, 41.701661 ], [ -96.082429, 41.698159 ], [ -96.090579, 41.697425 ], [ -96.105119, 41.699917 ], [ -96.111968, 41.697773 ], [ -96.117751, 41.694221 ], [ -96.120157, 41.691150 ], [ -96.121401, 41.688522 ], [ -96.121726, 41.682740 ], [ -96.120983, 41.677861 ], [ -96.118120, 41.674399 ], [ -96.114978, 41.671220 ], [ -96.111483, 41.668548 ], [ -96.099837, 41.661030 ], [ -96.097933, 41.658682 ], [ -96.095415, 41.652736 ], [ -96.095046, 41.647365 ], [ -96.097728, 41.639633 ], [ -96.100701, 41.635507 ], [ -96.114146, 41.623975 ], [ -96.116233, 41.621574 ], [ -96.117950, 41.617356 ], [ -96.118105, 41.613495 ], [ -96.117558, 41.609999 ], [ -96.115830, 41.605760 ], [ -96.113833, 41.602277 ], [ -96.109387, 41.596871 ], [ -96.104465, 41.593169 ], [ -96.101496, 41.591580 ], [ -96.088683, 41.587520 ], [ -96.085771, 41.585746 ], [ -96.083417, 41.583339 ], [ -96.081843, 41.580407 ], [ -96.081152, 41.577289 ], [ -96.081178, 41.574274 ], [ -96.082406, 41.571229 ], [ -96.084786, 41.567831 ], [ -96.091820, 41.561086 ], [ -96.093613, 41.558271 ], [ -96.095851, 41.550880 ], [ -96.096186, 41.547192 ], [ -96.094090, 41.539265 ], [ -96.089714, 41.531778 ], [ -96.088220, 41.530595 ], [ -96.080493, 41.528199 ], [ -96.073070, 41.525052 ], [ -96.067527, 41.520340 ], [ -96.063638, 41.516162 ], [ -96.057935, 41.511490 ], [ -96.053690, 41.508859 ], [ -96.048118, 41.507271 ], [ -96.040701, 41.507076 ], [ -96.038101, 41.507990 ], [ -96.036603, 41.509047 ], [ -96.034305, 41.512853 ], [ -96.030593, 41.527292 ], [ -96.028439, 41.539616 ], [ -96.027289, 41.541081 ], [ -96.023182, 41.544364 ], [ -96.019686, 41.545743 ], [ -96.016474, 41.546085 ], [ -96.010028, 41.545533 ], [ -96.005079, 41.544004 ], [ -96.001161, 41.541146 ], [ -95.999529, 41.538679 ], [ -95.993891, 41.523412 ], [ -95.992670, 41.517290 ], [ -95.992599, 41.514174 ], [ -95.992833, 41.512002 ], [ -95.993943, 41.509761 ], [ -95.997903, 41.504789 ], [ -96.007334, 41.497631 ], [ -96.015986, 41.492659 ], [ -96.019224, 41.489296 ], [ -96.019817, 41.488030 ], [ -96.019542, 41.486617 ], [ -96.016389, 41.481556 ], [ -96.011757, 41.476212 ], [ -96.008833, 41.474039 ], [ -96.004708, 41.472342 ], [ -95.991018, 41.470374 ], [ -95.982962, 41.469778 ], [ -95.973449, 41.467318 ], [ -95.965481, 41.463510 ], [ -95.962329, 41.462810 ], [ -95.957017, 41.462814 ], [ -95.946465, 41.466166 ], [ -95.941969, 41.466262 ], [ -95.936801, 41.465190 ], [ -95.932921, 41.463798 ], [ -95.925713, 41.459382 ], [ -95.922529, 41.455766 ], [ -95.920281, 41.451566 ], [ -95.919865, 41.447922 ], [ -95.920577, 41.444302 ], [ -95.921833, 41.442062 ], [ -95.923905, 41.439742 ], [ -95.930705, 41.433894 ], [ -95.932193, 41.431914 ], [ -95.933169, 41.429430 ], [ -95.932297, 41.422123 ], [ -95.929889, 41.415155 ], [ -95.929721, 41.411331 ], [ -95.930778, 41.406179 ], [ -95.936890, 41.396387 ], [ -95.937490, 41.393095 ], [ -95.935190, 41.384395 ], [ -95.929290, 41.374896 ], [ -95.928790, 41.370096 ], [ -95.930990, 41.364696 ], [ -95.935490, 41.360596 ], [ -95.940990, 41.357496 ], [ -95.952191, 41.353496 ], [ -95.954891, 41.351796 ], [ -95.956791, 41.349196 ], [ -95.956691, 41.345496 ], [ -95.953091, 41.339896 ], [ -95.946891, 41.334096 ], [ -95.939291, 41.328897 ], [ -95.925690, 41.322197 ], [ -95.922090, 41.321097 ], [ -95.913790, 41.320197 ], [ -95.899290, 41.321197 ], [ -95.888690, 41.319097 ], [ -95.883089, 41.316697 ], [ -95.878189, 41.312497 ], [ -95.874689, 41.307097 ], [ -95.871489, 41.295797 ], [ -95.872889, 41.289497 ], [ -95.876890, 41.285097 ], [ -95.882390, 41.281397 ], [ -95.902490, 41.273398 ], [ -95.912491, 41.279498 ], [ -95.904290, 41.293497 ], [ -95.904290, 41.299597 ], [ -95.905890, 41.300897 ], [ -95.920291, 41.301097 ], [ -95.927491, 41.298397 ], [ -95.929591, 41.292297 ], [ -95.929591, 41.285097 ], [ -95.928691, 41.281398 ], [ -95.913991, 41.271398 ], [ -95.918791, 41.269698 ], [ -95.920391, 41.268398 ], [ -95.921891, 41.264598 ], [ -95.921291, 41.258498 ], [ -95.911391, 41.237998 ], [ -95.910891, 41.233998 ], [ -95.910891, 41.231798 ], [ -95.912591, 41.226998 ], [ -95.915091, 41.222998 ], [ -95.924891, 41.211198 ], [ -95.927491, 41.202198 ], [ -95.925990, 41.195698 ], [ -95.923190, 41.190998 ], [ -95.918290, 41.186698 ], [ -95.914590, 41.185098 ], [ -95.909690, 41.184398 ], [ -95.864789, 41.188298 ], [ -95.856788, 41.187098 ], [ -95.850188, 41.184798 ], [ -95.844088, 41.180598 ], [ -95.841288, 41.174998 ], [ -95.841888, 41.171098 ], [ -95.846188, 41.166698 ], [ -95.852788, 41.165398 ], [ -95.865072, 41.167802 ], [ -95.867344, 41.168734 ], [ -95.869640, 41.168830 ], [ -95.871912, 41.168122 ], [ -95.876289, 41.165146 ], [ -95.881289, 41.159898 ], [ -95.883489, 41.154898 ], [ -95.883389, 41.150898 ], [ -95.882088, 41.143998 ], [ -95.878888, 41.138098 ], [ -95.868688, 41.124698 ], [ -95.865888, 41.117898 ], [ -95.865450, 41.101266 ], [ -95.863268, 41.093765 ], [ -95.862587, 41.088399 ], [ -95.863839, 41.083507 ], [ -95.865463, 41.080367 ], [ -95.870631, 41.075231 ], [ -95.878103, 41.069587 ], [ -95.881375, 41.065203 ], [ -95.882415, 41.060411 ], [ -95.881855, 41.057211 ], [ -95.879487, 41.053299 ], [ -95.869807, 41.045199 ], [ -95.861782, 41.039427 ], [ -95.860462, 41.037887 ], [ -95.859654, 41.035695 ], [ -95.859102, 41.031599 ], [ -95.859918, 41.025403 ], [ -95.865878, 41.017403 ], [ -95.868374, 41.012703 ], [ -95.869486, 41.009399 ], [ -95.869198, 41.005951 ], [ -95.867286, 41.001599 ], [ -95.863492, 40.997340 ], [ -95.860116, 40.995242 ], [ -95.852547, 40.991738 ], [ -95.844351, 40.989524 ], [ -95.838908, 40.986484 ], [ -95.833537, 40.982660 ], [ -95.830297, 40.978332 ], [ -95.829074, 40.975688 ], [ -95.828329, 40.972378 ], [ -95.829829, 40.963857 ], [ -95.837951, 40.950618 ], [ -95.840275, 40.939942 ], [ -95.839743, 40.932780 ], [ -95.837774, 40.924712 ], [ -95.836438, 40.921642 ], [ -95.833041, 40.917243 ], [ -95.830699, 40.915004 ], [ -95.818709, 40.906818 ], [ -95.814302, 40.902936 ], [ -95.810886, 40.897907 ], [ -95.809775, 40.895447 ], [ -95.809474, 40.891228 ], [ -95.810709, 40.886681 ], [ -95.812083, 40.884239 ], [ -95.815933, 40.879846 ], [ -95.819590, 40.877439 ], [ -95.824989, 40.875000 ], [ -95.838735, 40.872191 ], [ -95.842521, 40.870266 ], [ -95.844073, 40.869248 ], [ -95.846938, 40.865745 ], [ -95.847785, 40.864328 ], [ -95.848590, 40.861061 ], [ -95.848490, 40.858607 ], [ -95.847084, 40.854174 ], [ -95.841309, 40.845604 ], [ -95.837186, 40.835347 ], [ -95.837303, 40.831164 ], [ -95.838601, 40.826175 ], [ -95.843921, 40.817686 ], [ -95.844852, 40.815307 ], [ -95.845342, 40.811324 ], [ -95.843745, 40.803783 ], [ -95.835815, 40.790630 ], [ -95.834523, 40.787778 ], [ -95.834156, 40.783016 ], [ -95.835232, 40.779151 ], [ -95.836903, 40.776477 ], [ -95.838879, 40.774545 ], [ -95.842824, 40.771093 ], [ -95.846620, 40.768619 ], [ -95.852776, 40.765631 ], [ -95.861695, 40.762871 ], [ -95.869982, 40.759645 ], [ -95.873335, 40.757616 ], [ -95.879027, 40.753081 ], [ -95.883643, 40.747831 ], [ -95.886690, 40.742101 ], [ -95.888697, 40.736292 ], [ -95.888907, 40.731855 ], [ -95.885349, 40.721093 ], [ -95.883178, 40.717579 ], [ -95.877015, 40.714287 ], [ -95.875280, 40.714120 ], [ -95.870481, 40.712480 ], [ -95.859378, 40.708055 ], [ -95.852615, 40.702262 ], [ -95.849828, 40.698147 ], [ -95.847931, 40.694197 ], [ -95.846034, 40.682605 ], [ -95.844827, 40.679867 ], [ -95.842801, 40.677496 ], [ -95.832177, 40.671200 ], [ -95.822913, 40.667240 ], [ -95.814150, 40.665570 ], [ -95.804307, 40.664886 ], [ -95.795489, 40.662384 ], [ -95.789485, 40.659388 ], [ -95.786568, 40.657253 ], [ -95.781909, 40.653272 ], [ -95.776251, 40.647463 ], [ -95.772832, 40.642496 ], [ -95.771325, 40.639393 ], [ -95.770442, 40.635285 ], [ -95.770083, 40.624425 ], [ -95.768926, 40.621264 ], [ -95.766823, 40.618780 ], [ -95.764412, 40.617090 ], [ -95.758045, 40.613759 ], [ -95.751271, 40.609057 ], [ -95.749685, 40.606842 ], [ -95.748626, 40.603355 ], [ -95.748858, 40.599965 ], [ -95.750053, 40.597052 ], [ -95.753148, 40.592840 ], [ -95.758895, 40.588973 ], [ -95.765645, 40.585208 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US33", "STATE": "33", "NAME": "New Hampshire", "LSAD": "", "CENSUSAREA": 8952.651000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -72.458519, 42.726853 ], [ -72.458488, 42.729094 ], [ -72.461001, 42.733209 ], [ -72.467827, 42.741209 ], [ -72.473071, 42.745916 ], [ -72.474723, 42.750729 ], [ -72.475938, 42.757702 ], [ -72.477615, 42.761245 ], [ -72.479354, 42.763119 ], [ -72.484878, 42.765540 ], [ -72.486400, 42.766980 ], [ -72.487767, 42.769380 ], [ -72.491122, 42.772465 ], [ -72.495343, 42.773286 ], [ -72.497949, 42.772918 ], [ -72.498786, 42.771981 ], [ -72.499249, 42.769054 ], [ -72.500690, 42.767657 ], [ -72.507985, 42.764414 ], [ -72.510871, 42.763752 ], [ -72.513105, 42.763822 ], [ -72.516082, 42.765949 ], [ -72.516731, 42.768670 ], [ -72.514836, 42.771436 ], [ -72.510154, 42.773221 ], [ -72.508372, 42.774610 ], [ -72.508048, 42.776885 ], [ -72.508858, 42.779919 ], [ -72.511746, 42.784114 ], [ -72.515838, 42.788560 ], [ -72.518354, 42.790651 ], [ -72.539600, 42.804832 ], [ -72.542784, 42.808482 ], [ -72.546133, 42.823938 ], [ -72.547434, 42.832603 ], [ -72.547402, 42.837587 ], [ -72.548550, 42.842021 ], [ -72.553426, 42.846709 ], [ -72.557247, 42.853019 ], [ -72.554232, 42.860038 ], [ -72.555132, 42.865731 ], [ -72.556112, 42.866252 ], [ -72.556214, 42.866950 ], [ -72.555131, 42.871058 ], [ -72.555415, 42.875428 ], [ -72.552834, 42.884968 ], [ -72.552025, 42.885631 ], [ -72.546491, 42.887140 ], [ -72.540708, 42.889379 ], [ -72.537287, 42.891870 ], [ -72.532777, 42.896076 ], [ -72.531469, 42.897950 ], [ -72.531588, 42.907164 ], [ -72.530218, 42.911576 ], [ -72.529191, 42.912719 ], [ -72.525271, 42.914363 ], [ -72.524430, 42.915575 ], [ -72.524242, 42.918501 ], [ -72.527097, 42.928584 ], [ -72.526346, 42.935717 ], [ -72.526624, 42.939901 ], [ -72.527431, 42.943148 ], [ -72.528550, 42.945320 ], [ -72.529763, 42.946120 ], [ -72.531693, 42.946510 ], [ -72.533901, 42.948591 ], [ -72.534554, 42.949894 ], [ -72.534117, 42.952133 ], [ -72.532186, 42.954945 ], [ -72.518422, 42.963170 ], [ -72.507901, 42.964171 ], [ -72.504226, 42.965815 ], [ -72.492597, 42.967648 ], [ -72.486872, 42.971789 ], [ -72.481706, 42.973985 ], [ -72.479245, 42.973597 ], [ -72.476722, 42.971746 ], [ -72.473827, 42.972045 ], [ -72.465985, 42.978470 ], [ -72.461627, 42.982906 ], [ -72.461597, 42.984049 ], [ -72.464026, 42.986107 ], [ -72.465335, 42.989558 ], [ -72.464714, 42.993582 ], [ -72.462940, 42.996943 ], [ -72.459951, 43.000080 ], [ -72.456936, 43.001306 ], [ -72.451797, 43.000577 ], [ -72.448714, 43.001169 ], [ -72.444977, 43.004416 ], [ -72.443762, 43.006245 ], [ -72.443825, 43.008965 ], [ -72.444635, 43.010566 ], [ -72.452984, 43.015731 ], [ -72.457035, 43.017285 ], [ -72.458998, 43.019388 ], [ -72.462397, 43.025560 ], [ -72.462990, 43.028531 ], [ -72.460905, 43.035961 ], [ -72.460252, 43.040671 ], [ -72.462248, 43.044214 ], [ -72.465896, 43.047505 ], [ -72.466832, 43.049197 ], [ -72.467363, 43.052648 ], [ -72.466491, 43.054729 ], [ -72.463812, 43.057404 ], [ -72.454710, 43.063487 ], [ -72.445202, 43.071352 ], [ -72.439870, 43.077043 ], [ -72.436190, 43.081730 ], [ -72.435316, 43.083536 ], [ -72.435191, 43.086622 ], [ -72.439214, 43.094852 ], [ -72.443051, 43.100841 ], [ -72.442427, 43.103630 ], [ -72.440587, 43.106145 ], [ -72.434845, 43.109917 ], [ -72.433129, 43.112637 ], [ -72.432661, 43.114077 ], [ -72.432972, 43.119655 ], [ -72.435936, 43.123381 ], [ -72.440967, 43.127608 ], [ -72.442933, 43.130192 ], [ -72.442746, 43.131152 ], [ -72.440780, 43.131472 ], [ -72.440624, 43.132203 ], [ -72.440905, 43.135793 ], [ -72.441904, 43.136615 ], [ -72.444214, 43.137370 ], [ -72.448303, 43.137187 ], [ -72.451986, 43.138924 ], [ -72.456890, 43.146558 ], [ -72.457140, 43.148493 ], [ -72.456537, 43.149528 ], [ -72.452801, 43.151977 ], [ -72.451802, 43.153486 ], [ -72.451553, 43.155155 ], [ -72.452100, 43.161414 ], [ -72.451868, 43.170174 ], [ -72.452556, 43.172117 ], [ -72.444904, 43.177969 ], [ -72.443405, 43.179729 ], [ -72.443749, 43.182221 ], [ -72.449435, 43.189170 ], [ -72.450280, 43.192485 ], [ -72.438969, 43.201035 ], [ -72.437719, 43.202750 ], [ -72.438594, 43.209013 ], [ -72.440563, 43.215254 ], [ -72.440500, 43.219049 ], [ -72.437656, 43.225266 ], [ -72.434466, 43.230432 ], [ -72.433684, 43.233427 ], [ -72.434216, 43.234958 ], [ -72.436654, 43.238319 ], [ -72.438937, 43.244240 ], [ -72.438693, 43.252905 ], [ -72.436378, 43.257454 ], [ -72.435221, 43.258483 ], [ -72.421583, 43.263442 ], [ -72.415450, 43.271374 ], [ -72.407842, 43.282892 ], [ -72.401666, 43.303395 ], [ -72.395462, 43.312994 ], [ -72.395805, 43.314617 ], [ -72.397619, 43.317064 ], [ -72.402532, 43.320380 ], [ -72.408696, 43.327674 ], [ -72.410197, 43.330395 ], [ -72.410353, 43.331675 ], [ -72.409037, 43.334395 ], [ -72.400981, 43.345775 ], [ -72.399289, 43.347581 ], [ -72.395403, 43.350414 ], [ -72.390920, 43.354984 ], [ -72.390103, 43.356926 ], [ -72.392170, 43.357865 ], [ -72.400441, 43.357685 ], [ -72.403949, 43.358098 ], [ -72.413377, 43.362741 ], [ -72.414692, 43.364273 ], [ -72.415099, 43.365896 ], [ -72.415978, 43.376531 ], [ -72.415381, 43.380211 ], [ -72.413154, 43.384302 ], [ -72.405253, 43.389992 ], [ -72.403811, 43.391935 ], [ -72.400131, 43.410997 ], [ -72.399972, 43.415249 ], [ -72.395916, 43.430974 ], [ -72.395659, 43.438541 ], [ -72.393992, 43.444666 ], [ -72.391196, 43.449305 ], [ -72.390567, 43.451225 ], [ -72.392628, 43.465078 ], [ -72.392500, 43.467364 ], [ -72.391526, 43.468780 ], [ -72.384491, 43.474195 ], [ -72.382951, 43.476000 ], [ -72.381723, 43.480091 ], [ -72.380428, 43.488525 ], [ -72.380362, 43.491634 ], [ -72.380894, 43.493394 ], [ -72.384773, 43.500259 ], [ -72.389556, 43.503899 ], [ -72.396305, 43.508062 ], [ -72.398376, 43.510829 ], [ -72.398563, 43.513435 ], [ -72.395825, 43.520560 ], [ -72.395949, 43.523880 ], [ -72.394218, 43.527400 ], [ -72.390700, 43.527261 ], [ -72.389097, 43.528266 ], [ -72.383310, 43.535190 ], [ -72.380383, 43.540880 ], [ -72.381187, 43.554915 ], [ -72.382783, 43.562459 ], [ -72.382625, 43.564127 ], [ -72.379440, 43.574069 ], [ -72.373126, 43.579419 ], [ -72.363916, 43.583652 ], [ -72.349926, 43.587726 ], [ -72.332382, 43.599364 ], [ -72.329620, 43.600201 ], [ -72.328514, 43.600805 ], [ -72.327665, 43.602679 ], [ -72.328232, 43.606839 ], [ -72.329522, 43.608393 ], [ -72.332700, 43.610313 ], [ -72.334745, 43.614519 ], [ -72.334401, 43.619250 ], [ -72.332360, 43.625070 ], [ -72.328966, 43.626991 ], [ -72.327236, 43.630534 ], [ -72.327362, 43.631174 ], [ -72.329471, 43.632843 ], [ -72.329660, 43.634648 ], [ -72.329126, 43.635563 ], [ -72.327395, 43.636774 ], [ -72.322517, 43.638901 ], [ -72.315247, 43.641164 ], [ -72.314083, 43.642810 ], [ -72.313863, 43.646558 ], [ -72.315059, 43.649415 ], [ -72.314020, 43.656158 ], [ -72.312887, 43.658444 ], [ -72.310841, 43.659724 ], [ -72.305771, 43.666535 ], [ -72.304322, 43.669507 ], [ -72.303408, 43.674055 ], [ -72.303092, 43.678078 ], [ -72.304351, 43.681141 ], [ -72.306020, 43.683061 ], [ -72.305326, 43.695770 ], [ -72.302867, 43.702718 ], [ -72.299715, 43.706558 ], [ -72.294894, 43.709003 ], [ -72.292215, 43.711333 ], [ -72.286950, 43.717252 ], [ -72.284805, 43.720360 ], [ -72.279855, 43.724633 ], [ -72.276072, 43.727054 ], [ -72.271180, 43.734138 ], [ -72.264245, 43.734158 ], [ -72.245068, 43.743093 ], [ -72.232713, 43.748286 ], [ -72.223645, 43.757842 ], [ -72.222069, 43.759831 ], [ -72.220116, 43.763626 ], [ -72.218099, 43.765729 ], [ -72.216491, 43.766507 ], [ -72.210815, 43.767696 ], [ -72.207535, 43.769274 ], [ -72.204760, 43.771263 ], [ -72.205521, 43.782279 ], [ -72.205300, 43.784474 ], [ -72.204070, 43.786097 ], [ -72.197036, 43.790006 ], [ -72.195552, 43.791492 ], [ -72.193184, 43.794697 ], [ -72.190754, 43.800807 ], [ -72.184847, 43.804698 ], [ -72.183333, 43.808177 ], [ -72.184184, 43.812524 ], [ -72.186424, 43.815857 ], [ -72.188570, 43.821153 ], [ -72.188255, 43.822888 ], [ -72.186238, 43.826931 ], [ -72.183337, 43.830699 ], [ -72.182203, 43.834032 ], [ -72.182864, 43.845109 ], [ -72.187379, 43.853612 ], [ -72.187916, 43.856126 ], [ -72.184788, 43.863393 ], [ -72.182956, 43.865335 ], [ -72.179386, 43.866181 ], [ -72.174774, 43.866386 ], [ -72.167476, 43.869150 ], [ -72.169780, 43.873425 ], [ -72.171904, 43.876149 ], [ -72.173576, 43.879670 ], [ -72.172785, 43.883716 ], [ -72.171648, 43.885361 ], [ -72.170604, 43.886388 ], [ -72.167224, 43.886113 ], [ -72.160819, 43.887223 ], [ -72.159216, 43.888313 ], [ -72.158585, 43.892762 ], [ -72.155724, 43.897120 ], [ -72.151324, 43.901704 ], [ -72.145041, 43.905288 ], [ -72.135117, 43.910024 ], [ -72.121002, 43.918956 ], [ -72.119190, 43.920952 ], [ -72.118013, 43.923292 ], [ -72.116767, 43.933923 ], [ -72.116766, 43.935278 ], [ -72.118985, 43.943225 ], [ -72.118698, 43.945360 ], [ -72.117839, 43.946828 ], [ -72.115268, 43.947629 ], [ -72.110872, 43.947654 ], [ -72.105875, 43.949370 ], [ -72.104421, 43.950536 ], [ -72.098689, 43.957660 ], [ -72.098955, 43.958879 ], [ -72.100894, 43.960851 ], [ -72.100543, 43.962478 ], [ -72.098563, 43.963833 ], [ -72.090357, 43.965409 ], [ -72.090214, 43.965814 ], [ -72.091104, 43.966443 ], [ -72.096161, 43.968132 ], [ -72.104972, 43.969950 ], [ -72.107042, 43.969513 ], [ -72.110945, 43.966959 ], [ -72.114273, 43.967513 ], [ -72.114726, 43.968332 ], [ -72.114702, 43.969478 ], [ -72.113078, 43.972790 ], [ -72.112490, 43.975654 ], [ -72.111756, 43.984943 ], [ -72.112813, 43.988020 ], [ -72.116706, 43.991954 ], [ -72.116985, 43.994480 ], [ -72.109019, 44.000535 ], [ -72.103765, 44.002837 ], [ -72.103576, 44.004231 ], [ -72.104941, 44.009395 ], [ -72.105292, 44.012663 ], [ -72.102475, 44.014882 ], [ -72.098897, 44.015477 ], [ -72.095247, 44.013580 ], [ -72.093384, 44.010450 ], [ -72.093257, 44.009376 ], [ -72.091230, 44.009125 ], [ -72.090059, 44.009903 ], [ -72.089807, 44.011274 ], [ -72.090504, 44.012736 ], [ -72.095193, 44.016666 ], [ -72.095669, 44.019683 ], [ -72.095100, 44.021831 ], [ -72.094056, 44.023179 ], [ -72.092030, 44.024459 ], [ -72.090478, 44.024299 ], [ -72.084871, 44.021308 ], [ -72.082432, 44.022154 ], [ -72.081673, 44.023638 ], [ -72.081864, 44.026952 ], [ -72.081357, 44.028529 ], [ -72.079996, 44.029764 ], [ -72.075648, 44.031654 ], [ -72.075004, 44.032789 ], [ -72.075486, 44.034614 ], [ -72.079397, 44.039531 ], [ -72.079595, 44.041429 ], [ -72.078989, 44.042886 ], [ -72.077372, 44.044591 ], [ -72.074881, 44.045892 ], [ -72.066422, 44.049299 ], [ -72.062150, 44.049931 ], [ -72.062713, 44.051618 ], [ -72.068405, 44.054021 ], [ -72.069150, 44.054817 ], [ -72.067612, 44.058034 ], [ -72.065415, 44.058344 ], [ -72.058863, 44.057921 ], [ -72.057173, 44.058646 ], [ -72.056341, 44.059582 ], [ -72.053482, 44.064730 ], [ -72.048289, 44.069136 ], [ -72.048570, 44.071359 ], [ -72.051144, 44.073850 ], [ -72.051602, 44.075193 ], [ -72.051166, 44.075826 ], [ -72.042088, 44.077008 ], [ -72.040912, 44.076659 ], [ -72.039076, 44.074520 ], [ -72.036641, 44.073999 ], [ -72.033450, 44.074531 ], [ -72.031898, 44.076241 ], [ -72.032009, 44.077174 ], [ -72.033739, 44.078830 ], [ -72.039783, 44.081271 ], [ -72.047305, 44.085382 ], [ -72.048781, 44.087141 ], [ -72.047684, 44.088873 ], [ -72.046235, 44.089538 ], [ -72.040012, 44.088762 ], [ -72.036291, 44.089236 ], [ -72.034290, 44.090138 ], [ -72.032894, 44.091440 ], [ -72.031878, 44.093359 ], [ -72.031019, 44.097975 ], [ -72.031240, 44.100101 ], [ -72.032983, 44.101655 ], [ -72.036883, 44.103119 ], [ -72.039674, 44.103371 ], [ -72.040911, 44.102686 ], [ -72.042592, 44.100744 ], [ -72.042943, 44.097636 ], [ -72.043482, 44.096996 ], [ -72.044909, 44.096402 ], [ -72.048334, 44.096905 ], [ -72.050997, 44.098848 ], [ -72.052391, 44.101088 ], [ -72.054831, 44.110137 ], [ -72.054675, 44.112147 ], [ -72.052342, 44.119891 ], [ -72.046430, 44.123911 ], [ -72.041948, 44.125653 ], [ -72.040728, 44.125668 ], [ -72.038839, 44.124628 ], [ -72.037506, 44.124708 ], [ -72.033703, 44.131541 ], [ -72.034242, 44.132524 ], [ -72.037859, 44.133782 ], [ -72.041983, 44.137165 ], [ -72.042867, 44.151288 ], [ -72.042708, 44.152270 ], [ -72.040082, 44.155749 ], [ -72.040167, 44.157023 ], [ -72.042387, 44.160817 ], [ -72.047593, 44.161801 ], [ -72.053021, 44.167903 ], [ -72.057496, 44.179444 ], [ -72.061338, 44.184951 ], [ -72.066166, 44.189773 ], [ -72.064577, 44.196949 ], [ -72.063561, 44.198457 ], [ -72.060067, 44.200446 ], [ -72.058987, 44.202114 ], [ -72.058066, 44.206067 ], [ -72.058605, 44.208215 ], [ -72.053233, 44.216876 ], [ -72.052662, 44.218841 ], [ -72.053900, 44.222703 ], [ -72.053582, 44.226040 ], [ -72.050656, 44.233581 ], [ -72.047889, 44.238493 ], [ -72.048460, 44.241212 ], [ -72.050112, 44.244046 ], [ -72.053990, 44.246926 ], [ -72.059782, 44.256018 ], [ -72.061174, 44.263377 ], [ -72.060378, 44.264951 ], [ -72.059832, 44.264984 ], [ -72.058969, 44.265911 ], [ -72.058475, 44.267886 ], [ -72.058740, 44.270005 ], [ -72.060846, 44.269972 ], [ -72.064544, 44.267997 ], [ -72.066464, 44.268331 ], [ -72.067774, 44.270976 ], [ -72.065434, 44.277235 ], [ -72.058880, 44.286240 ], [ -72.053355, 44.290501 ], [ -72.046302, 44.291983 ], [ -72.039004, 44.296463 ], [ -72.037030, 44.297834 ], [ -72.033465, 44.301878 ], [ -72.032541, 44.303752 ], [ -72.032317, 44.306677 ], [ -72.032341, 44.315752 ], [ -72.033806, 44.317349 ], [ -72.033136, 44.320365 ], [ -72.029061, 44.322398 ], [ -72.025783, 44.322054 ], [ -72.019130, 44.320383 ], [ -72.014543, 44.321032 ], [ -72.009977, 44.321951 ], [ -72.002314, 44.324871 ], [ -71.988306, 44.329768 ], [ -71.986484, 44.331218 ], [ -71.984617, 44.336243 ], [ -71.981120, 44.337500 ], [ -71.963133, 44.336556 ], [ -71.958119, 44.337544 ], [ -71.945163, 44.337744 ], [ -71.939049, 44.335844 ], [ -71.935395, 44.335770 ], [ -71.929110, 44.337577 ], [ -71.925088, 44.342024 ], [ -71.917434, 44.346535 ], [ -71.906909, 44.348284 ], [ -71.902332, 44.347499 ], [ -71.881895, 44.340209 ], [ -71.875863, 44.337370 ], [ -71.872472, 44.336628 ], [ -71.869910, 44.336962 ], [ -71.861941, 44.340109 ], [ -71.852628, 44.340873 ], [ -71.844319, 44.344204 ], [ -71.833261, 44.350136 ], [ -71.826246, 44.352006 ], [ -71.818838, 44.352939 ], [ -71.814351, 44.354541 ], [ -71.812902, 44.355547 ], [ -71.812206, 44.357356 ], [ -71.812473, 44.358477 ], [ -71.814991, 44.363686 ], [ -71.816157, 44.367559 ], [ -71.815490, 44.368836 ], [ -71.812832, 44.370448 ], [ -71.812235, 44.371492 ], [ -71.812424, 44.372532 ], [ -71.815251, 44.374594 ], [ -71.815773, 44.375464 ], [ -71.814388, 44.381932 ], [ -71.813130, 44.382801 ], [ -71.808828, 44.383862 ], [ -71.803461, 44.383335 ], [ -71.800316, 44.384276 ], [ -71.799899, 44.385951 ], [ -71.803489, 44.390384 ], [ -71.803488, 44.391890 ], [ -71.802353, 44.393380 ], [ -71.793924, 44.399271 ], [ -71.790688, 44.400260 ], [ -71.778613, 44.399799 ], [ -71.775399, 44.401126 ], [ -71.772801, 44.403097 ], [ -71.767888, 44.405445 ], [ -71.764977, 44.406587 ], [ -71.761966, 44.407027 ], [ -71.756091, 44.406401 ], [ -71.754340, 44.405577 ], [ -71.749533, 44.401955 ], [ -71.745011, 44.401359 ], [ -71.743104, 44.401657 ], [ -71.742308, 44.402366 ], [ -71.739921, 44.406778 ], [ -71.737836, 44.408921 ], [ -71.735923, 44.410062 ], [ -71.731520, 44.411015 ], [ -71.726199, 44.411385 ], [ -71.715087, 44.410490 ], [ -71.708041, 44.411977 ], [ -71.699434, 44.416069 ], [ -71.690920, 44.421234 ], [ -71.685850, 44.423405 ], [ -71.679950, 44.427908 ], [ -71.679158, 44.432174 ], [ -71.679933, 44.434062 ], [ -71.679263, 44.435018 ], [ -71.677384, 44.435702 ], [ -71.668944, 44.436523 ], [ -71.664191, 44.438351 ], [ -71.661830, 44.440293 ], [ -71.659021, 44.444932 ], [ -71.657313, 44.454003 ], [ -71.653348, 44.460499 ], [ -71.652320, 44.461117 ], [ -71.645068, 44.460545 ], [ -71.642851, 44.461734 ], [ -71.640404, 44.464186 ], [ -71.640847, 44.465935 ], [ -71.646551, 44.468869 ], [ -71.647864, 44.469976 ], [ -71.648178, 44.472023 ], [ -71.647693, 44.473125 ], [ -71.645890, 44.475141 ], [ -71.643111, 44.476649 ], [ -71.639312, 44.477836 ], [ -71.632795, 44.483890 ], [ -71.631007, 44.484323 ], [ -71.627655, 44.484207 ], [ -71.625676, 44.483201 ], [ -71.625019, 44.481784 ], [ -71.622089, 44.481387 ], [ -71.619624, 44.484411 ], [ -71.617614, 44.485715 ], [ -71.615923, 44.485944 ], [ -71.609568, 44.484348 ], [ -71.599480, 44.486455 ], [ -71.597917, 44.488375 ], [ -71.595484, 44.494424 ], [ -71.595027, 44.498669 ], [ -71.594303, 44.500749 ], [ -71.591917, 44.500975 ], [ -71.590256, 44.500057 ], [ -71.589623, 44.499371 ], [ -71.589622, 44.498525 ], [ -71.586972, 44.498526 ], [ -71.585881, 44.500057 ], [ -71.586648, 44.502873 ], [ -71.583870, 44.503217 ], [ -71.579974, 44.501778 ], [ -71.578760, 44.501915 ], [ -71.577643, 44.502692 ], [ -71.577068, 44.504041 ], [ -71.577771, 44.504886 ], [ -71.583233, 44.508268 ], [ -71.584959, 44.510141 ], [ -71.585950, 44.513432 ], [ -71.586909, 44.514666 ], [ -71.592117, 44.517773 ], [ -71.593971, 44.519738 ], [ -71.594259, 44.521680 ], [ -71.592855, 44.523006 ], [ -71.587104, 44.522436 ], [ -71.585731, 44.522665 ], [ -71.582505, 44.524403 ], [ -71.576884, 44.530323 ], [ -71.574456, 44.533660 ], [ -71.573019, 44.536312 ], [ -71.573083, 44.537980 ], [ -71.575193, 44.540859 ], [ -71.588076, 44.547850 ], [ -71.596804, 44.553424 ], [ -71.598116, 44.555412 ], [ -71.597797, 44.557172 ], [ -71.596137, 44.560898 ], [ -71.593923, 44.563813 ], [ -71.592091, 44.565118 ], [ -71.590170, 44.565694 ], [ -71.575519, 44.564775 ], [ -71.569599, 44.562777 ], [ -71.563399, 44.563218 ], [ -71.559846, 44.564119 ], [ -71.558565, 44.565572 ], [ -71.558985, 44.568779 ], [ -71.557972, 44.570451 ], [ -71.556497, 44.570777 ], [ -71.552629, 44.569543 ], [ -71.551670, 44.569657 ], [ -71.549655, 44.570708 ], [ -71.548728, 44.571873 ], [ -71.548952, 44.573084 ], [ -71.553300, 44.576924 ], [ -71.553755, 44.578406 ], [ -71.553699, 44.579628 ], [ -71.553200, 44.580683 ], [ -71.551145, 44.580405 ], [ -71.549270, 44.579164 ], [ -71.547448, 44.578547 ], [ -71.544922, 44.579278 ], [ -71.540123, 44.582522 ], [ -71.537724, 44.584785 ], [ -71.536251, 44.588441 ], [ -71.540601, 44.590453 ], [ -71.549268, 44.593174 ], [ -71.553447, 44.593451 ], [ -71.554614, 44.595784 ], [ -71.554449, 44.598408 ], [ -71.556014, 44.601383 ], [ -71.555781, 44.603483 ], [ -71.554833, 44.605172 ], [ -71.553873, 44.607069 ], [ -71.554097, 44.609583 ], [ -71.556560, 44.616988 ], [ -71.555760, 44.624119 ], [ -71.554666, 44.625387 ], [ -71.553898, 44.625410 ], [ -71.553156, 44.626645 ], [ -71.551722, 44.627598 ], [ -71.554634, 44.632197 ], [ -71.562124, 44.636580 ], [ -71.562636, 44.637266 ], [ -71.562636, 44.639505 ], [ -71.558859, 44.640122 ], [ -71.558026, 44.641791 ], [ -71.558571, 44.644373 ], [ -71.561772, 44.650224 ], [ -71.564411, 44.652827 ], [ -71.566144, 44.653863 ], [ -71.567645, 44.653560 ], [ -71.568677, 44.651537 ], [ -71.570235, 44.650483 ], [ -71.572163, 44.650373 ], [ -71.575145, 44.650612 ], [ -71.576079, 44.652012 ], [ -71.576312, 44.653179 ], [ -71.575710, 44.654574 ], [ -71.576013, 44.655691 ], [ -71.582965, 44.656621 ], [ -71.584848, 44.657816 ], [ -71.586578, 44.659478 ], [ -71.586578, 44.661111 ], [ -71.585246, 44.663523 ], [ -71.584574, 44.665351 ], [ -71.585645, 44.667644 ], [ -71.585645, 44.669277 ], [ -71.584478, 44.670211 ], [ -71.582527, 44.672253 ], [ -71.581983, 44.673533 ], [ -71.583009, 44.674836 ], [ -71.587365, 44.674926 ], [ -71.590024, 44.675543 ], [ -71.596304, 44.679083 ], [ -71.596400, 44.679677 ], [ -71.594671, 44.681643 ], [ -71.594224, 44.683815 ], [ -71.596437, 44.687059 ], [ -71.598042, 44.692818 ], [ -71.596858, 44.694921 ], [ -71.594360, 44.695996 ], [ -71.594136, 44.696932 ], [ -71.598656, 44.698005 ], [ -71.600162, 44.698919 ], [ -71.600772, 44.699901 ], [ -71.600772, 44.700815 ], [ -71.599205, 44.703878 ], [ -71.599750, 44.705318 ], [ -71.604912, 44.708150 ], [ -71.613094, 44.718933 ], [ -71.618355, 44.722610 ], [ -71.618516, 44.723913 ], [ -71.617431, 44.728050 ], [ -71.617656, 44.728918 ], [ -71.619067, 44.729283 ], [ -71.622593, 44.727773 ], [ -71.623266, 44.727795 ], [ -71.624922, 44.729032 ], [ -71.625611, 44.730312 ], [ -71.625638, 44.735065 ], [ -71.625059, 44.737099 ], [ -71.625180, 44.743978 ], [ -71.626909, 44.747224 ], [ -71.631109, 44.748689 ], [ -71.631967, 44.750333 ], [ -71.631883, 44.752463 ], [ -71.631255, 44.753253 ], [ -71.623924, 44.755135 ], [ -71.617941, 44.755883 ], [ -71.614238, 44.758664 ], [ -71.614267, 44.760622 ], [ -71.611767, 44.764345 ], [ -71.608234, 44.765658 ], [ -71.604615, 44.767738 ], [ -71.601471, 44.772067 ], [ -71.596035, 44.775422 ], [ -71.595913, 44.776272 ], [ -71.596680, 44.777416 ], [ -71.596949, 44.778987 ], [ -71.592966, 44.782776 ], [ -71.584392, 44.785733 ], [ -71.580005, 44.785480 ], [ -71.578938, 44.786070 ], [ -71.573247, 44.791882 ], [ -71.571706, 44.794830 ], [ -71.573129, 44.797947 ], [ -71.570402, 44.805276 ], [ -71.569098, 44.807044 ], [ -71.569216, 44.808813 ], [ -71.572864, 44.810383 ], [ -71.575139, 44.813565 ], [ -71.575500, 44.816058 ], [ -71.574314, 44.818079 ], [ -71.567907, 44.823832 ], [ -71.565146, 44.824678 ], [ -71.564760, 44.823901 ], [ -71.563701, 44.823901 ], [ -71.562256, 44.824632 ], [ -71.557672, 44.834421 ], [ -71.553712, 44.836065 ], [ -71.552218, 44.837775 ], [ -71.552005, 44.839208 ], [ -71.552654, 44.842049 ], [ -71.555036, 44.845733 ], [ -71.556750, 44.846862 ], [ -71.556805, 44.848808 ], [ -71.555600, 44.850547 ], [ -71.553656, 44.852123 ], [ -71.548345, 44.855530 ], [ -71.548377, 44.857016 ], [ -71.550304, 44.859552 ], [ -71.550176, 44.861609 ], [ -71.549533, 44.862592 ], [ -71.545901, 44.866134 ], [ -71.540116, 44.868625 ], [ -71.534588, 44.869698 ], [ -71.529154, 44.873559 ], [ -71.528889, 44.876928 ], [ -71.528342, 44.877819 ], [ -71.526638, 44.879098 ], [ -71.522393, 44.880811 ], [ -71.512292, 44.890246 ], [ -71.511712, 44.891571 ], [ -71.514090, 44.893149 ], [ -71.514350, 44.893964 ], [ -71.513870, 44.894648 ], [ -71.508642, 44.897703 ], [ -71.502473, 44.902720 ], [ -71.501088, 44.904433 ], [ -71.499528, 44.904774 ], [ -71.496968, 44.904225 ], [ -71.495844, 44.904980 ], [ -71.493920, 44.910923 ], [ -71.494403, 44.911837 ], [ -71.500788, 44.914535 ], [ -71.504483, 44.919062 ], [ -71.509207, 44.923429 ], [ -71.515189, 44.927317 ], [ -71.516949, 44.939704 ], [ -71.516144, 44.940846 ], [ -71.515498, 44.943520 ], [ -71.516814, 44.947588 ], [ -71.514843, 44.958741 ], [ -71.516223, 44.964569 ], [ -71.522370, 44.966308 ], [ -71.527163, 44.973668 ], [ -71.531605, 44.976023 ], [ -71.537784, 44.984298 ], [ -71.538592, 44.988182 ], [ -71.536980, 44.994177 ], [ -71.530091, 44.999656 ], [ -71.525016, 45.001881 ], [ -71.520022, 45.002291 ], [ -71.514609, 45.003957 ], [ -71.507767, 45.008170 ], [ -71.505000, 45.008151 ], [ -71.501055, 45.006742 ], [ -71.497412, 45.003878 ], [ -71.487565, 45.000936 ], [ -71.479611, 45.002905 ], [ -71.477907, 45.007453 ], [ -71.476168, 45.009054 ], [ -71.473269, 45.010586 ], [ -71.466247, 45.011959 ], [ -71.464555, 45.013637 ], [ -71.502487, 45.013367 ], [ -71.500069, 45.014212 ], [ -71.500164, 45.015377 ], [ -71.500969, 45.016040 ], [ -71.499945, 45.026323 ], [ -71.494009, 45.034345 ], [ -71.491148, 45.041774 ], [ -71.491085, 45.043671 ], [ -71.493150, 45.045772 ], [ -71.497179, 45.044582 ], [ -71.499527, 45.044672 ], [ -71.500874, 45.045110 ], [ -71.505222, 45.048791 ], [ -71.505091, 45.051465 ], [ -71.504542, 45.052379 ], [ -71.502768, 45.052630 ], [ -71.500545, 45.051943 ], [ -71.497738, 45.054751 ], [ -71.496105, 45.065082 ], [ -71.498399, 45.069629 ], [ -71.497917, 45.070589 ], [ -71.497304, 45.070544 ], [ -71.496098, 45.069235 ], [ -71.495463, 45.069151 ], [ -71.489145, 45.072308 ], [ -71.489146, 45.073565 ], [ -71.486345, 45.078503 ], [ -71.482862, 45.079144 ], [ -71.480219, 45.081316 ], [ -71.479929, 45.082139 ], [ -71.480897, 45.083030 ], [ -71.480769, 45.083556 ], [ -71.475286, 45.084426 ], [ -71.471382, 45.084199 ], [ -71.467447, 45.086851 ], [ -71.464837, 45.093023 ], [ -71.462063, 45.093526 ], [ -71.459999, 45.095058 ], [ -71.458323, 45.098807 ], [ -71.455452, 45.101458 ], [ -71.452451, 45.102282 ], [ -71.449257, 45.104522 ], [ -71.448355, 45.107882 ], [ -71.448678, 45.109001 ], [ -71.445613, 45.113367 ], [ -71.440577, 45.114464 ], [ -71.432444, 45.120453 ], [ -71.428828, 45.123881 ], [ -71.427208, 45.127364 ], [ -71.426755, 45.129672 ], [ -71.433083, 45.137899 ], [ -71.435795, 45.139659 ], [ -71.437216, 45.142333 ], [ -71.433179, 45.149166 ], [ -71.429981, 45.151474 ], [ -71.427688, 45.152251 ], [ -71.426750, 45.153257 ], [ -71.424004, 45.159290 ], [ -71.423616, 45.161096 ], [ -71.424616, 45.165872 ], [ -71.422031, 45.167495 ], [ -71.419058, 45.170488 ], [ -71.416181, 45.177344 ], [ -71.415468, 45.183309 ], [ -71.414853, 45.184908 ], [ -71.412946, 45.186279 ], [ -71.408777, 45.187970 ], [ -71.405346, 45.196037 ], [ -71.405636, 45.198139 ], [ -71.397810, 45.203553 ], [ -71.398002, 45.205953 ], [ -71.399100, 45.208628 ], [ -71.403267, 45.215348 ], [ -71.407405, 45.216812 ], [ -71.409119, 45.216606 ], [ -71.415553, 45.218001 ], [ -71.416070, 45.218322 ], [ -71.416167, 45.219533 ], [ -71.417233, 45.221293 ], [ -71.421372, 45.224036 ], [ -71.431753, 45.228743 ], [ -71.438545, 45.232765 ], [ -71.440583, 45.234982 ], [ -71.442880, 45.234799 ], [ -71.443882, 45.235462 ], [ -71.443883, 45.237061 ], [ -71.443365, 45.237724 ], [ -71.442298, 45.238547 ], [ -71.438546, 45.239004 ], [ -71.433014, 45.237656 ], [ -71.430394, 45.236125 ], [ -71.429326, 45.234228 ], [ -71.420335, 45.232719 ], [ -71.418556, 45.233839 ], [ -71.417132, 45.235575 ], [ -71.411924, 45.238820 ], [ -71.406973, 45.241516 ], [ -71.402638, 45.242589 ], [ -71.394422, 45.241216 ], [ -71.391901, 45.237216 ], [ -71.389412, 45.235021 ], [ -71.385629, 45.233214 ], [ -71.384917, 45.233351 ], [ -71.383170, 45.234904 ], [ -71.380158, 45.238857 ], [ -71.379833, 45.240616 ], [ -71.377630, 45.244203 ], [ -71.376691, 45.244911 ], [ -71.371940, 45.246349 ], [ -71.368381, 45.246579 ], [ -71.363013, 45.248205 ], [ -71.359224, 45.250912 ], [ -71.357253, 45.253336 ], [ -71.356736, 45.254776 ], [ -71.356835, 45.257175 ], [ -71.359558, 45.262682 ], [ -71.362245, 45.264738 ], [ -71.363218, 45.266429 ], [ -71.362831, 45.267617 ], [ -71.360664, 45.269835 ], [ -71.354999, 45.268626 ], [ -71.353446, 45.268695 ], [ -71.351666, 45.269199 ], [ -71.347622, 45.272125 ], [ -71.344029, 45.271167 ], [ -71.336392, 45.273066 ], [ -71.333965, 45.275306 ], [ -71.333674, 45.276769 ], [ -71.331733, 45.279969 ], [ -71.328464, 45.281135 ], [ -71.320922, 45.282324 ], [ -71.318397, 45.284655 ], [ -71.314318, 45.287033 ], [ -71.309008, 45.287238 ], [ -71.306872, 45.288861 ], [ -71.304896, 45.292449 ], [ -71.301107, 45.296563 ], [ -71.296509, 45.299190 ], [ -71.284396, 45.302434 ], [ -71.283684, 45.301977 ], [ -71.282552, 45.299279 ], [ -71.282747, 45.297497 ], [ -71.280740, 45.295188 ], [ -71.279219, 45.294982 ], [ -71.272320, 45.296694 ], [ -71.266557, 45.294589 ], [ -71.264939, 45.293446 ], [ -71.266754, 45.291230 ], [ -71.263815, 45.282726 ], [ -71.263042, 45.277401 ], [ -71.262136, 45.276098 ], [ -71.259614, 45.273240 ], [ -71.256441, 45.273330 ], [ -71.250393, 45.269191 ], [ -71.245503, 45.268870 ], [ -71.244499, 45.268139 ], [ -71.239346, 45.261925 ], [ -71.236271, 45.261126 ], [ -71.235364, 45.260349 ], [ -71.231572, 45.253472 ], [ -71.233027, 45.251551 ], [ -71.231122, 45.249712 ], [ -71.228048, 45.249690 ], [ -71.225811, 45.251691 ], [ -71.221994, 45.253543 ], [ -71.220634, 45.251121 ], [ -71.211800, 45.250457 ], [ -71.203033, 45.254302 ], [ -71.198276, 45.254257 ], [ -71.196658, 45.253594 ], [ -71.194878, 45.250515 ], [ -71.191744, 45.249694 ], [ -71.187441, 45.247697 ], [ -71.183785, 45.244932 ], [ -71.182782, 45.242715 ], [ -71.182587, 45.241069 ], [ -71.180905, 45.239858 ], [ -71.179838, 45.240178 ], [ -71.178576, 45.241389 ], [ -71.177508, 45.243629 ], [ -71.173367, 45.246348 ], [ -71.171264, 45.246143 ], [ -71.167446, 45.247491 ], [ -71.162845, 45.250332 ], [ -71.158192, 45.248746 ], [ -71.155734, 45.246460 ], [ -71.148165, 45.242412 ], [ -71.144801, 45.242251 ], [ -71.139430, 45.242958 ], [ -71.133994, 45.244167 ], [ -71.131953, 45.245423 ], [ -71.127962, 45.253672 ], [ -71.124517, 45.255270 ], [ -71.119914, 45.262287 ], [ -71.120112, 45.265738 ], [ -71.116332, 45.272322 ], [ -71.113162, 45.274861 ], [ -71.110735, 45.275456 ], [ -71.107339, 45.278612 ], [ -71.105691, 45.282498 ], [ -71.109349, 45.282222 ], [ -71.110159, 45.282999 ], [ -71.110743, 45.284576 ], [ -71.108675, 45.288965 ], [ -71.105151, 45.294635 ], [ -71.097772, 45.301906 ], [ -71.089483, 45.304584 ], [ -71.085564, 45.305476 ], [ -71.084334, 45.305293 ], [ -71.076914, 45.246912 ], [ -71.072600, 45.180935 ], [ -71.069387, 45.144037 ], [ -71.059004, 45.004918 ], [ -71.057861, 45.000049 ], [ -71.052707, 44.930840 ], [ -71.044646, 44.845039 ], [ -71.037518, 44.755607 ], [ -71.036705, 44.736498 ], [ -71.031039, 44.655455 ], [ -71.026655, 44.558149 ], [ -71.022992, 44.500058 ], [ -71.020773, 44.473737 ], [ -71.015363, 44.378113 ], [ -71.012749, 44.340784 ], [ -71.011270, 44.301846 ], [ -71.008736, 44.258825 ], [ -71.008764, 44.258443 ], [ -71.008567, 44.245491 ], [ -71.001335, 44.093205 ], [ -71.001367, 44.092931 ], [ -70.998444, 44.041099 ], [ -70.992842, 43.916269 ], [ -70.992653, 43.896240 ], [ -70.989929, 43.839239 ], [ -70.989067, 43.792440 ], [ -70.984901, 43.752983 ], [ -70.982083, 43.715043 ], [ -70.982238, 43.711865 ], [ -70.981978, 43.701965 ], [ -70.981946, 43.700960 ], [ -70.975705, 43.625078 ], [ -70.972716, 43.570255 ], [ -70.970124, 43.568544 ], [ -70.968546, 43.568856 ], [ -70.961848, 43.562964 ], [ -70.957234, 43.561358 ], [ -70.955860, 43.559787 ], [ -70.955017, 43.554239 ], [ -70.953322, 43.552718 ], [ -70.951876, 43.552238 ], [ -70.950838, 43.551026 ], [ -70.955252, 43.540887 ], [ -70.955337, 43.540980 ], [ -70.955928, 43.541925 ], [ -70.962182, 43.541032 ], [ -70.963281, 43.538929 ], [ -70.963531, 43.536756 ], [ -70.963342, 43.535247 ], [ -70.962556, 43.534310 ], [ -70.958220, 43.531586 ], [ -70.957046, 43.528743 ], [ -70.957214, 43.524994 ], [ -70.956787, 43.524216 ], [ -70.954066, 43.522610 ], [ -70.954045, 43.518797 ], [ -70.956856, 43.512719 ], [ -70.955386, 43.511357 ], [ -70.954755, 43.509802 ], [ -70.957958, 43.508041 ], [ -70.959185, 43.499351 ], [ -70.961948, 43.497750 ], [ -70.966718, 43.491278 ], [ -70.969572, 43.486201 ], [ -70.968975, 43.483961 ], [ -70.967404, 43.482635 ], [ -70.967968, 43.480783 ], [ -70.974245, 43.477420 ], [ -70.972956, 43.475020 ], [ -70.970946, 43.473900 ], [ -70.966017, 43.472918 ], [ -70.964542, 43.473262 ], [ -70.964433, 43.473276 ], [ -70.961428, 43.469696 ], [ -70.960450, 43.466592 ], [ -70.963990, 43.456752 ], [ -70.966266, 43.453627 ], [ -70.966900, 43.450458 ], [ -70.965810, 43.447557 ], [ -70.961640, 43.443039 ], [ -70.961046, 43.440475 ], [ -70.961150, 43.438321 ], [ -70.968782, 43.434891 ], [ -70.969362, 43.432731 ], [ -70.968359, 43.429283 ], [ -70.971039, 43.425606 ], [ -70.974620, 43.423022 ], [ -70.978052, 43.421954 ], [ -70.982898, 43.419332 ], [ -70.986812, 43.414264 ], [ -70.987249, 43.411863 ], [ -70.986677, 43.403541 ], [ -70.985767, 43.401620 ], [ -70.982817, 43.399312 ], [ -70.982565, 43.397780 ], [ -70.982876, 43.394808 ], [ -70.987390, 43.393457 ], [ -70.987733, 43.391513 ], [ -70.987649, 43.389521 ], [ -70.985205, 43.386745 ], [ -70.985958, 43.384240 ], [ -70.985965, 43.380023 ], [ -70.984305, 43.376814 ], [ -70.984335, 43.376128 ], [ -70.981859, 43.373862 ], [ -70.976408, 43.367272 ], [ -70.974156, 43.362925 ], [ -70.974863, 43.357969 ], [ -70.967229, 43.343777 ], [ -70.964028, 43.341888 ], [ -70.960439, 43.341048 ], [ -70.957860, 43.337776 ], [ -70.956528, 43.334691 ], [ -70.953034, 43.333257 ], [ -70.951525, 43.334672 ], [ -70.937110, 43.337367 ], [ -70.932735, 43.336760 ], [ -70.932198, 43.334560 ], [ -70.931641, 43.331019 ], [ -70.930783, 43.329569 ], [ -70.923949, 43.324768 ], [ -70.916421, 43.320279 ], [ -70.915406, 43.319858 ], [ -70.912004, 43.319821 ], [ -70.911625, 43.309952 ], [ -70.912460, 43.308289 ], [ -70.909805, 43.306682 ], [ -70.907405, 43.304782 ], [ -70.904485, 43.305290 ], [ -70.902310, 43.304872 ], [ -70.900386, 43.301358 ], [ -70.901390, 43.298764 ], [ -70.903905, 43.296882 ], [ -70.907405, 43.293582 ], [ -70.906005, 43.291682 ], [ -70.896304, 43.285282 ], [ -70.890204, 43.284182 ], [ -70.886504, 43.282783 ], [ -70.883704, 43.277483 ], [ -70.882804, 43.273183 ], [ -70.881704, 43.272483 ], [ -70.872585, 43.270152 ], [ -70.863230, 43.265109 ], [ -70.863231, 43.265098 ], [ -70.861384, 43.263143 ], [ -70.859853, 43.259763 ], [ -70.859607, 43.257342 ], [ -70.858207, 43.256286 ], [ -70.855082, 43.255191 ], [ -70.852015, 43.256808 ], [ -70.843302, 43.254321 ], [ -70.839213, 43.251224 ], [ -70.839717, 43.250393 ], [ -70.841059, 43.249699 ], [ -70.841273, 43.248653 ], [ -70.838678, 43.242931 ], [ -70.837274, 43.242321 ], [ -70.833650, 43.242868 ], [ -70.828022, 43.241597 ], [ -70.826711, 43.241301 ], [ -70.825071, 43.240930 ], [ -70.823309, 43.240343 ], [ -70.822959, 43.240187 ], [ -70.817865, 43.237911 ], [ -70.817773, 43.237408 ], [ -70.816232, 43.234997 ], [ -70.815453, 43.229023 ], [ -70.814019, 43.229053 ], [ -70.811852, 43.228306 ], [ -70.809640, 43.225407 ], [ -70.809670, 43.224561 ], [ -70.813119, 43.217252 ], [ -70.816033, 43.215680 ], [ -70.816903, 43.214604 ], [ -70.820763, 43.199780 ], [ -70.820366, 43.197629 ], [ -70.819146, 43.195157 ], [ -70.819344, 43.193036 ], [ -70.820702, 43.191663 ], [ -70.823754, 43.191075 ], [ -70.827201, 43.189485 ], [ -70.827901, 43.188685 ], [ -70.828301, 43.186685 ], [ -70.824801, 43.179685 ], [ -70.823501, 43.174585 ], [ -70.824001, 43.173285 ], [ -70.826201, 43.172085 ], [ -70.828301, 43.168985 ], [ -70.827801, 43.166385 ], [ -70.829101, 43.157886 ], [ -70.833800, 43.146886 ], [ -70.832900, 43.143286 ], [ -70.830000, 43.138386 ], [ -70.829300, 43.132486 ], [ -70.828100, 43.129086 ], [ -70.826800, 43.127086 ], [ -70.820000, 43.122586 ], [ -70.808708, 43.117065 ], [ -70.793906, 43.106712 ], [ -70.783880, 43.100867 ], [ -70.779098, 43.095887 ], [ -70.767998, 43.093588 ], [ -70.766398, 43.092688 ], [ -70.762997, 43.089488 ], [ -70.757597, 43.080888 ], [ -70.756397, 43.079988 ], [ -70.741897, 43.077388 ], [ -70.737897, 43.073488 ], [ -70.733497, 43.073288 ], [ -70.720296, 43.074688 ], [ -70.708896, 43.074989 ], [ -70.705996, 43.073089 ], [ -70.704696, 43.070989 ], [ -70.703819, 43.059825 ], [ -70.703799, 43.059574 ], [ -70.713630, 43.056006 ], [ -70.714176, 43.046266 ], [ -70.713550, 43.042077 ], [ -70.718936, 43.032350 ], [ -70.723178, 43.029298 ], [ -70.728443, 43.027597 ], [ -70.730426, 43.025392 ], [ -70.732135, 43.022416 ], [ -70.732684, 43.016916 ], [ -70.734363, 43.013307 ], [ -70.735477, 43.012201 ], [ -70.740360, 43.011171 ], [ -70.743793, 43.008027 ], [ -70.749024, 42.995467 ], [ -70.749194, 42.992677 ], [ -70.749969, 42.991689 ], [ -70.752804, 42.991255 ], [ -70.755138, 42.991789 ], [ -70.756701, 42.991337 ], [ -70.759175, 42.989475 ], [ -70.761474, 42.986681 ], [ -70.764567, 42.980201 ], [ -70.765222, 42.975349 ], [ -70.771800, 42.968064 ], [ -70.771913, 42.966457 ], [ -70.769673, 42.964419 ], [ -70.771729, 42.961321 ], [ -70.775597, 42.957213 ], [ -70.779068, 42.956802 ], [ -70.780383, 42.955798 ], [ -70.785130, 42.950792 ], [ -70.786564, 42.947378 ], [ -70.790682, 42.942772 ], [ -70.793996, 42.939890 ], [ -70.797806, 42.930037 ], [ -70.798636, 42.924288 ], [ -70.798153, 42.920926 ], [ -70.805971, 42.916549 ], [ -70.808712, 42.912787 ], [ -70.810069, 42.909549 ], [ -70.810681, 42.906887 ], [ -70.810999, 42.892375 ], [ -70.813975, 42.889766 ], [ -70.815860, 42.886250 ], [ -70.816989, 42.879864 ], [ -70.817296, 42.872290 ], [ -70.821769, 42.871880 ], [ -70.830795, 42.868918 ], [ -70.837376, 42.864996 ], [ -70.848625, 42.860939 ], [ -70.886136, 42.882610 ], [ -70.902768, 42.886530 ], [ -70.914886, 42.886564 ], [ -70.914899, 42.886589 ], [ -70.927629, 42.885326 ], [ -70.930799, 42.884589 ], [ -70.931699, 42.884189 ], [ -70.949199, 42.876089 ], [ -70.966500, 42.868989 ], [ -71.031201, 42.859089 ], [ -71.044401, 42.848789 ], [ -71.047501, 42.844089 ], [ -71.053601, 42.833089 ], [ -71.064201, 42.806289 ], [ -71.132503, 42.821389 ], [ -71.149703, 42.815489 ], [ -71.165603, 42.808689 ], [ -71.167703, 42.807389 ], [ -71.174403, 42.801589 ], [ -71.186104, 42.790689 ], [ -71.181803, 42.737590 ], [ -71.208137, 42.743273 ], [ -71.208227, 42.743294 ], [ -71.208302, 42.743314 ], [ -71.223904, 42.746689 ], [ -71.233404, 42.745489 ], [ -71.245504, 42.742589 ], [ -71.255605, 42.736389 ], [ -71.267905, 42.725890 ], [ -71.278929, 42.711258 ], [ -71.294205, 42.696990 ], [ -71.330206, 42.697190 ], [ -71.351874, 42.698154 ], [ -71.631814, 42.704788 ], [ -71.636214, 42.704888 ], [ -71.745817, 42.707287 ], [ -71.928811, 42.712234 ], [ -71.981402, 42.713294 ], [ -72.124526, 42.717636 ], [ -72.285954, 42.721631 ], [ -72.458519, 42.726853 ] ] ], [ [ [ -70.622337, 42.966820 ], [ -70.625900, 42.967075 ], [ -70.627045, 42.968601 ], [ -70.627556, 42.977894 ], [ -70.625008, 42.978401 ], [ -70.614960, 42.978275 ], [ -70.612030, 42.977512 ], [ -70.610634, 42.975475 ], [ -70.612160, 42.972931 ], [ -70.622337, 42.966820 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US35", "STATE": "35", "NAME": "New Mexico", "LSAD": "", "CENSUSAREA": 121298.148000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -109.050044, 31.332502 ], [ -109.050173, 31.480004 ], [ -109.049843, 31.499515 ], [ -109.049813, 31.499528 ], [ -109.049112, 31.636598 ], [ -109.049195, 31.796551 ], [ -109.048763, 31.810776 ], [ -109.049106, 31.843715 ], [ -109.048769, 31.861383 ], [ -109.048590, 31.870791 ], [ -109.048599, 32.013651 ], [ -109.048731, 32.028174 ], [ -109.048296, 32.084093 ], [ -109.048286, 32.089114 ], [ -109.047612, 32.426377 ], [ -109.047653, 32.681379 ], [ -109.047653, 32.686327 ], [ -109.047645, 32.689988 ], [ -109.047638, 32.693439 ], [ -109.047117, 32.777570 ], [ -109.047480, 33.068420 ], [ -109.047453, 33.069427 ], [ -109.046905, 33.091931 ], [ -109.047013, 33.092917 ], [ -109.047117, 33.137559 ], [ -109.047116, 33.137995 ], [ -109.047237, 33.208965 ], [ -109.047470, 33.250063 ], [ -109.046827, 33.365272 ], [ -109.046909, 33.365570 ], [ -109.047045, 33.369280 ], [ -109.046870, 33.372654 ], [ -109.046564, 33.375060 ], [ -109.047298, 33.409783 ], [ -109.046662, 33.625055 ], [ -109.047145, 33.740010 ], [ -109.046426, 33.875052 ], [ -109.047006, 34.000050 ], [ -109.046182, 34.522393 ], [ -109.046182, 34.522553 ], [ -109.046156, 34.579291 ], [ -109.046086, 34.771016 ], [ -109.045363, 34.785406 ], [ -109.046104, 34.799981 ], [ -109.045624, 34.814226 ], [ -109.046072, 34.828566 ], [ -109.045851, 34.959718 ], [ -109.046084, 35.250025 ], [ -109.046796, 35.363606 ], [ -109.046481, 35.546326 ], [ -109.046509, 35.546440 ], [ -109.046296, 35.614251 ], [ -109.046295, 35.616517 ], [ -109.046024, 35.879800 ], [ -109.046055, 35.888721 ], [ -109.046054, 35.925860 ], [ -109.046011, 35.925896 ], [ -109.045973, 36.002338 ], [ -109.045729, 36.117028 ], [ -109.046183, 36.181751 ], [ -109.045431, 36.500001 ], [ -109.045433, 36.874589 ], [ -109.045407, 36.874998 ], [ -109.045272, 36.968871 ], [ -109.045244, 36.969489 ], [ -109.045223, 36.999084 ], [ -108.958868, 36.998913 ], [ -108.954404, 36.998906 ], [ -108.620309, 36.999287 ], [ -108.619689, 36.999249 ], [ -108.320721, 36.999510 ], [ -108.320464, 36.999499 ], [ -108.288400, 36.999520 ], [ -108.288086, 36.999555 ], [ -108.250635, 36.999561 ], [ -108.249358, 36.999015 ], [ -108.000623, 37.000001 ], [ -107.420913, 37.000005 ], [ -106.877292, 37.000139 ], [ -106.869796, 36.992426 ], [ -106.750591, 36.992461 ], [ -106.675626, 36.993123 ], [ -106.661344, 36.993243 ], [ -106.628733, 36.993161 ], [ -106.628652, 36.993175 ], [ -106.617125, 36.993004 ], [ -106.617159, 36.992967 ], [ -106.500589, 36.993768 ], [ -106.343139, 36.994230 ], [ -106.293279, 36.993890 ], [ -106.248675, 36.994288 ], [ -106.247705, 36.994266 ], [ -106.201469, 36.994122 ], [ -106.006634, 36.995343 ], [ -105.997472, 36.995417 ], [ -105.996159, 36.995418 ], [ -105.716471, 36.995849 ], [ -105.664720, 36.995874 ], [ -105.627470, 36.995679 ], [ -105.533922, 36.995875 ], [ -105.512485, 36.995777 ], [ -105.508836, 36.995895 ], [ -105.465182, 36.995991 ], [ -105.447255, 36.996017 ], [ -105.442459, 36.995994 ], [ -105.419310, 36.995856 ], [ -105.251296, 36.995605 ], [ -105.220613, 36.995169 ], [ -105.120800, 36.995428 ], [ -105.029228, 36.992729 ], [ -105.000554, 36.993264 ], [ -104.732120, 36.993484 ], [ -104.732031, 36.993447 ], [ -104.645029, 36.993378 ], [ -104.625545, 36.993599 ], [ -104.624556, 36.994377 ], [ -104.519257, 36.993766 ], [ -104.338833, 36.993535 ], [ -104.250536, 36.994644 ], [ -104.007855, 36.996239 ], [ -103.734364, 36.998041 ], [ -103.733247, 36.998016 ], [ -103.155922, 37.000232 ], [ -103.002199, 37.000104 ], [ -103.002247, 36.911587 ], [ -103.001964, 36.909573 ], [ -103.002198, 36.719427 ], [ -103.002518, 36.675186 ], [ -103.002252, 36.617180 ], [ -103.002188, 36.602716 ], [ -103.002565, 36.526588 ], [ -103.002434, 36.500397 ], [ -103.041924, 36.500439 ], [ -103.041745, 36.318267 ], [ -103.041674, 36.317534 ], [ -103.040824, 36.055231 ], [ -103.041305, 35.837694 ], [ -103.042186, 35.825217 ], [ -103.041716, 35.814072 ], [ -103.041917, 35.796441 ], [ -103.041146, 35.791583 ], [ -103.041554, 35.622487 ], [ -103.042366, 35.250056 ], [ -103.042775, 35.241237 ], [ -103.042497, 35.211862 ], [ -103.042377, 35.183149 ], [ -103.042366, 35.182786 ], [ -103.042339, 35.181922 ], [ -103.042395, 35.178573 ], [ -103.042568, 35.159318 ], [ -103.042711, 35.144735 ], [ -103.042600, 35.142766 ], [ -103.042520, 35.135596 ], [ -103.043261, 35.125058 ], [ -103.042642, 35.109913 ], [ -103.042521, 34.899546 ], [ -103.042781, 34.850243 ], [ -103.042770, 34.792224 ], [ -103.042769, 34.747361 ], [ -103.042827, 34.671188 ], [ -103.043286, 34.653099 ], [ -103.043072, 34.619782 ], [ -103.043594, 34.462660 ], [ -103.043589, 34.459774 ], [ -103.043588, 34.459662 ], [ -103.043582, 34.455657 ], [ -103.043538, 34.405463 ], [ -103.043583, 34.400678 ], [ -103.043611, 34.397105 ], [ -103.043585, 34.393716 ], [ -103.043613, 34.390442 ], [ -103.043613, 34.388679 ], [ -103.043614, 34.384969 ], [ -103.043630, 34.384690 ], [ -103.043693, 34.383578 ], [ -103.043919, 34.380916 ], [ -103.043944, 34.379660 ], [ -103.043946, 34.379555 ], [ -103.043979, 34.312764 ], [ -103.043936, 34.302585 ], [ -103.043719, 34.289441 ], [ -103.043644, 34.256903 ], [ -103.043569, 34.087947 ], [ -103.043516, 34.079382 ], [ -103.043686, 34.063078 ], [ -103.043744, 34.049986 ], [ -103.043767, 34.043545 ], [ -103.043721, 34.042320 ], [ -103.043771, 34.041538 ], [ -103.043746, 34.037294 ], [ -103.043555, 34.032714 ], [ -103.043531, 34.018014 ], [ -103.043617, 34.003633 ], [ -103.043950, 33.974629 ], [ -103.044893, 33.945617 ], [ -103.045698, 33.906299 ], [ -103.045644, 33.901537 ], [ -103.046907, 33.850300 ], [ -103.047346, 33.824675 ], [ -103.049096, 33.746270 ], [ -103.049608, 33.737766 ], [ -103.050148, 33.701971 ], [ -103.050532, 33.672408 ], [ -103.051087, 33.658186 ], [ -103.051535, 33.650487 ], [ -103.051363, 33.641950 ], [ -103.051664, 33.629489 ], [ -103.052610, 33.570599 ], [ -103.056655, 33.388438 ], [ -103.057487, 33.329477 ], [ -103.057856, 33.315234 ], [ -103.059242, 33.260371 ], [ -103.059720, 33.256262 ], [ -103.060103, 33.219225 ], [ -103.063905, 33.042055 ], [ -103.063980, 33.038693 ], [ -103.064452, 33.010290 ], [ -103.064625, 32.999899 ], [ -103.064679, 32.964373 ], [ -103.064657, 32.959097 ], [ -103.064569, 32.900014 ], [ -103.064701, 32.879355 ], [ -103.064862, 32.868346 ], [ -103.064807, 32.857696 ], [ -103.064916, 32.857260 ], [ -103.064889, 32.849359 ], [ -103.064672, 32.828470 ], [ -103.064699, 32.827531 ], [ -103.064711, 32.784593 ], [ -103.064698, 32.783602 ], [ -103.064807, 32.777303 ], [ -103.064827, 32.726628 ], [ -103.064799, 32.708694 ], [ -103.064798, 32.690761 ], [ -103.064864, 32.682647 ], [ -103.064633, 32.646420 ], [ -103.064815, 32.624537 ], [ -103.064761, 32.601863 ], [ -103.064788, 32.600397 ], [ -103.064761, 32.587983 ], [ -103.064696, 32.522193 ], [ -103.064422, 32.145006 ], [ -103.064348, 32.123041 ], [ -103.064344, 32.087051 ], [ -103.064423, 32.000518 ], [ -103.085876, 32.000465 ], [ -103.088698, 32.000453 ], [ -103.215641, 32.000513 ], [ -103.267633, 32.000475 ], [ -103.267708, 32.000324 ], [ -103.270383, 32.000326 ], [ -103.278521, 32.000419 ], [ -103.326501, 32.000370 ], [ -103.748317, 32.000198 ], [ -103.875476, 32.000554 ], [ -103.980179, 32.000125 ], [ -104.024521, 32.000010 ], [ -104.531756, 32.000117 ], [ -104.531937, 32.000311 ], [ -104.640918, 32.000396 ], [ -104.643526, 32.000443 ], [ -104.918272, 32.000496 ], [ -105.077046, 32.000579 ], [ -105.078605, 32.000533 ], [ -105.118040, 32.000485 ], [ -105.131377, 32.000524 ], [ -105.132916, 32.000518 ], [ -105.148240, 32.000485 ], [ -105.150310, 32.000497 ], [ -105.153994, 32.000497 ], [ -105.390396, 32.000607 ], [ -105.427049, 32.000638 ], [ -105.428582, 32.000600 ], [ -105.429281, 32.000577 ], [ -105.731362, 32.001564 ], [ -105.750527, 32.002206 ], [ -105.854061, 32.002350 ], [ -105.886159, 32.001970 ], [ -105.900600, 32.002100 ], [ -105.998003, 32.002328 ], [ -106.125534, 32.002533 ], [ -106.181840, 32.002050 ], [ -106.200699, 32.001785 ], [ -106.205915, 32.001762 ], [ -106.313307, 32.001512 ], [ -106.376861, 32.001172 ], [ -106.394298, 32.001484 ], [ -106.411075, 32.001334 ], [ -106.565142, 32.000736 ], [ -106.566056, 32.000759 ], [ -106.587972, 32.000749 ], [ -106.595333, 32.000778 ], [ -106.598639, 32.000754 ], [ -106.599096, 32.000731 ], [ -106.618486, 32.000495 ], [ -106.619448, 31.994733 ], [ -106.623568, 31.990999 ], [ -106.631182, 31.989809 ], [ -106.636492, 31.985719 ], [ -106.639529, 31.980348 ], [ -106.638186, 31.976820 ], [ -106.630114, 31.971258 ], [ -106.626466, 31.970690 ], [ -106.623216, 31.972910 ], [ -106.621873, 31.972933 ], [ -106.619569, 31.971578 ], [ -106.618745, 31.966955 ], [ -106.619371, 31.964777 ], [ -106.620454, 31.963403 ], [ -106.624299, 31.961054 ], [ -106.625535, 31.957476 ], [ -106.625123, 31.954531 ], [ -106.622819, 31.952891 ], [ -106.617708, 31.956008 ], [ -106.614702, 31.956000 ], [ -106.616136, 31.948439 ], [ -106.623659, 31.945510 ], [ -106.622377, 31.940863 ], [ -106.622117, 31.936621 ], [ -106.622529, 31.934863 ], [ -106.625322, 31.930053 ], [ -106.629747, 31.926570 ], [ -106.628663, 31.923614 ], [ -106.623933, 31.925335 ], [ -106.611846, 31.920003 ], [ -106.614346, 31.918003 ], [ -106.623445, 31.914034 ], [ -106.625947, 31.912227 ], [ -106.633668, 31.909790 ], [ -106.640840, 31.904598 ], [ -106.645479, 31.898670 ], [ -106.645646, 31.895649 ], [ -106.645296, 31.894859 ], [ -106.642900, 31.892933 ], [ -106.638154, 31.891663 ], [ -106.633927, 31.889184 ], [ -106.630692, 31.886411 ], [ -106.629197, 31.883717 ], [ -106.630799, 31.879697 ], [ -106.634873, 31.874478 ], [ -106.635880, 31.871514 ], [ -106.635926, 31.866235 ], [ -106.627808, 31.860593 ], [ -106.625763, 31.856276 ], [ -106.621857, 31.852854 ], [ -106.614637, 31.846490 ], [ -106.605845, 31.846305 ], [ -106.605245, 31.845905 ], [ -106.602045, 31.844405 ], [ -106.601945, 31.839605 ], [ -106.605267, 31.827912 ], [ -106.602727, 31.825024 ], [ -106.593826, 31.824901 ], [ -106.589045, 31.822706 ], [ -106.588045, 31.822106 ], [ -106.582144, 31.815506 ], [ -106.581344, 31.813906 ], [ -106.577244, 31.810406 ], [ -106.570944, 31.810206 ], [ -106.566844, 31.813306 ], [ -106.563444, 31.812606 ], [ -106.562945, 31.811104 ], [ -106.558444, 31.810406 ], [ -106.547144, 31.807305 ], [ -106.545344, 31.805007 ], [ -106.544714, 31.804287 ], [ -106.542144, 31.802107 ], [ -106.542097, 31.802146 ], [ -106.535843, 31.798607 ], [ -106.535343, 31.797507 ], [ -106.535154, 31.797089 ], [ -106.534743, 31.796107 ], [ -106.533043, 31.791907 ], [ -106.533000, 31.791829 ], [ -106.532480, 31.791914 ], [ -106.530515, 31.792103 ], [ -106.527943, 31.790507 ], [ -106.527738, 31.789761 ], [ -106.527623, 31.789119 ], [ -106.527997, 31.786945 ], [ -106.528543, 31.784407 ], [ -106.528543, 31.783907 ], [ -106.750547, 31.783706 ], [ -106.750547, 31.783898 ], [ -106.993544, 31.783689 ], [ -106.998235, 31.783671 ], [ -107.000560, 31.783679 ], [ -107.000560, 31.783513 ], [ -107.296824, 31.783762 ], [ -107.422246, 31.783599 ], [ -107.422495, 31.783599 ], [ -108.208394, 31.783599 ], [ -108.208087, 31.613489 ], [ -108.208521, 31.499798 ], [ -108.208572, 31.499742 ], [ -108.208573, 31.333395 ], [ -108.707657, 31.333191 ], [ -108.788711, 31.332365 ], [ -108.851105, 31.332301 ], [ -108.861028, 31.332315 ], [ -109.050044, 31.332502 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US38", "STATE": "38", "NAME": "North Dakota", "LSAD": "", "CENSUSAREA": 69000.798000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -96.563280, 45.935238 ], [ -96.576897, 45.935259 ], [ -96.597432, 45.935209 ], [ -96.607142, 45.935301 ], [ -96.618295, 45.935407 ], [ -96.639066, 45.935318 ], [ -96.659895, 45.935560 ], [ -96.680646, 45.935716 ], [ -96.701313, 45.935807 ], [ -96.791505, 45.935857 ], [ -96.805155, 45.935431 ], [ -96.998652, 45.935700 ], [ -97.000361, 45.935233 ], [ -97.019596, 45.935382 ], [ -97.103218, 45.935991 ], [ -97.118053, 45.935485 ], [ -97.144987, 45.935278 ], [ -97.228323, 45.935141 ], [ -97.312184, 45.935077 ], [ -97.318899, 45.935054 ], [ -97.481967, 45.935138 ], [ -97.491892, 45.935111 ], [ -97.518944, 45.935304 ], [ -97.519035, 45.935304 ], [ -97.542598, 45.935258 ], [ -97.696691, 45.935352 ], [ -97.777040, 45.935393 ], [ -97.784575, 45.935327 ], [ -97.958718, 45.935878 ], [ -97.986893, 45.935961 ], [ -98.008202, 45.936096 ], [ -98.070515, 45.936180 ], [ -98.184637, 45.936183 ], [ -98.185630, 45.936185 ], [ -98.414518, 45.936504 ], [ -98.625379, 45.938228 ], [ -98.904429, 45.939520 ], [ -98.905477, 45.939520 ], [ -99.005642, 45.939944 ], [ -99.092868, 45.940184 ], [ -99.102372, 45.940158 ], [ -99.212571, 45.940108 ], [ -99.213644, 45.940116 ], [ -99.221672, 45.940069 ], [ -99.222269, 45.940071 ], [ -99.257745, 45.940060 ], [ -99.276266, 45.940188 ], [ -99.283968, 45.940195 ], [ -99.297272, 45.940165 ], [ -99.317875, 45.940263 ], [ -99.344774, 45.940299 ], [ -99.344960, 45.940299 ], [ -99.378486, 45.940403 ], [ -99.385565, 45.940407 ], [ -99.401260, 45.940367 ], [ -99.490254, 45.940362 ], [ -99.493140, 45.940383 ], [ -99.588780, 45.941104 ], [ -99.611160, 45.941098 ], [ -99.671938, 45.941062 ], [ -99.692975, 45.940949 ], [ -99.718073, 45.940907 ], [ -99.747870, 45.940933 ], [ -99.749325, 45.940935 ], [ -99.749494, 45.940956 ], [ -99.750396, 45.940935 ], [ -99.838680, 45.941293 ], [ -99.880292, 45.941672 ], [ -99.965775, 45.941822 ], [ -100.005486, 45.941950 ], [ -100.069020, 45.942170 ], [ -100.084163, 45.942301 ], [ -100.108471, 45.942391 ], [ -100.110339, 45.942367 ], [ -100.141730, 45.942506 ], [ -100.152084, 45.942486 ], [ -100.170826, 45.942514 ], [ -100.274762, 45.942945 ], [ -100.275614, 45.942922 ], [ -100.284134, 45.942951 ], [ -100.285345, 45.943130 ], [ -100.294126, 45.943269 ], [ -100.410386, 45.943453 ], [ -100.420162, 45.943533 ], [ -100.424438, 45.943569 ], [ -100.430597, 45.943638 ], [ -100.462838, 45.943566 ], [ -100.511793, 45.943654 ], [ -100.627681, 45.943642 ], [ -100.650820, 45.943680 ], [ -100.720865, 45.944024 ], [ -100.750407, 45.943649 ], [ -100.762072, 45.943803 ], [ -100.762110, 45.943767 ], [ -100.769751, 45.943766 ], [ -100.890176, 45.943861 ], [ -100.935582, 45.943757 ], [ -100.938989, 45.943848 ], [ -100.964411, 45.943822 ], [ -100.976565, 45.943864 ], [ -100.980693, 45.944068 ], [ -101.101334, 45.943841 ], [ -101.106826, 45.943984 ], [ -101.142571, 45.943841 ], [ -101.146076, 45.943842 ], [ -101.163241, 45.943915 ], [ -101.171074, 45.943959 ], [ -101.175693, 45.943983 ], [ -101.179103, 45.943896 ], [ -101.203787, 45.943895 ], [ -101.224006, 45.944025 ], [ -101.271524, 45.944209 ], [ -101.287223, 45.944107 ], [ -101.313272, 45.944164 ], [ -101.333871, 45.944166 ], [ -101.365283, 45.944092 ], [ -101.370690, 45.944198 ], [ -101.373769, 45.944265 ], [ -101.419890, 45.943763 ], [ -101.557276, 45.944100 ], [ -101.562156, 45.944237 ], [ -101.628597, 45.944293 ], [ -101.657631, 45.944387 ], [ -101.680574, 45.944329 ], [ -101.681819, 45.944444 ], [ -101.708785, 45.944348 ], [ -101.723380, 45.944187 ], [ -101.730069, 45.944356 ], [ -101.758611, 45.944478 ], [ -101.764277, 45.944412 ], [ -101.765293, 45.944367 ], [ -101.766177, 45.944322 ], [ -101.790054, 45.944442 ], [ -101.794606, 45.944397 ], [ -101.832991, 45.944464 ], [ -101.852642, 45.944457 ], [ -101.886838, 45.944559 ], [ -101.957439, 45.944484 ], [ -101.973749, 45.944456 ], [ -101.989501, 45.944472 ], [ -101.992187, 45.944471 ], [ -101.998703, 45.944557 ], [ -102.000425, 45.944581 ], [ -102.000656, 45.944515 ], [ -102.060930, 45.944622 ], [ -102.085122, 45.944642 ], [ -102.087555, 45.944598 ], [ -102.124628, 45.944813 ], [ -102.125429, 45.944652 ], [ -102.135269, 45.944586 ], [ -102.145356, 45.944659 ], [ -102.156393, 45.944663 ], [ -102.157965, 45.944641 ], [ -102.159439, 45.944641 ], [ -102.176698, 45.944622 ], [ -102.176993, 45.944622 ], [ -102.217867, 45.944711 ], [ -102.328230, 45.944806 ], [ -102.353384, 45.944984 ], [ -102.354283, 45.944901 ], [ -102.392696, 45.944951 ], [ -102.392767, 45.944979 ], [ -102.396359, 45.944916 ], [ -102.398575, 45.944868 ], [ -102.406176, 45.944997 ], [ -102.410346, 45.945079 ], [ -102.420173, 45.945070 ], [ -102.425358, 45.944990 ], [ -102.425397, 45.945041 ], [ -102.446419, 45.945083 ], [ -102.459586, 45.945081 ], [ -102.467563, 45.945159 ], [ -102.476024, 45.945183 ], [ -102.550947, 45.945015 ], [ -102.558579, 45.945129 ], [ -102.642555, 45.945404 ], [ -102.651620, 45.945450 ], [ -102.666684, 45.945307 ], [ -102.672474, 45.945244 ], [ -102.674077, 45.945274 ], [ -102.704871, 45.945072 ], [ -102.880252, 45.945069 ], [ -102.920482, 45.945038 ], [ -102.989902, 45.945211 ], [ -102.995345, 45.945166 ], [ -103.026058, 45.945307 ], [ -103.047779, 45.945335 ], [ -103.078477, 45.945289 ], [ -103.097872, 45.945262 ], [ -103.140939, 45.945257 ], [ -103.161251, 45.945309 ], [ -103.210634, 45.945222 ], [ -103.218396, 45.945208 ], [ -103.284092, 45.945149 ], [ -103.284109, 45.945152 ], [ -103.369148, 45.945152 ], [ -103.375460, 45.944797 ], [ -103.411325, 45.945264 ], [ -103.418040, 45.945186 ], [ -103.432393, 45.945313 ], [ -103.434851, 45.945291 ], [ -103.558710, 45.945131 ], [ -103.577083, 45.945283 ], [ -103.660779, 45.945231 ], [ -103.660779, 45.945241 ], [ -103.668479, 45.945242 ], [ -104.045443, 45.945310 ], [ -104.046822, 46.000199 ], [ -104.045759, 46.123946 ], [ -104.045237, 46.125002 ], [ -104.045469, 46.324545 ], [ -104.045462, 46.341895 ], [ -104.045481, 46.366871 ], [ -104.046103, 46.383916 ], [ -104.045045, 46.509788 ], [ -104.045271, 46.641449 ], [ -104.045474, 46.708738 ], [ -104.045572, 46.713881 ], [ -104.045370, 46.721332 ], [ -104.045403, 46.722177 ], [ -104.045402, 46.725423 ], [ -104.045901, 46.830790 ], [ -104.045542, 46.933887 ], [ -104.045535, 46.934009 ], [ -104.045566, 46.941231 ], [ -104.045076, 47.037589 ], [ -104.045052, 47.040863 ], [ -104.045195, 47.053639 ], [ -104.045227, 47.057502 ], [ -104.045259, 47.063901 ], [ -104.045354, 47.078574 ], [ -104.045018, 47.081202 ], [ -104.045081, 47.092813 ], [ -104.044788, 47.127430 ], [ -104.045517, 47.215666 ], [ -104.045159, 47.263874 ], [ -104.045091, 47.265953 ], [ -104.045057, 47.266868 ], [ -104.045088, 47.271406 ], [ -104.045155, 47.273930 ], [ -104.045121, 47.276969 ], [ -104.045313, 47.331955 ], [ -104.045333, 47.343452 ], [ -104.044863, 47.375015 ], [ -104.045069, 47.397461 ], [ -104.044797, 47.438445 ], [ -104.044621, 47.459380 ], [ -104.044109, 47.523595 ], [ -104.043912, 47.603229 ], [ -104.044241, 47.612288 ], [ -104.043742, 47.625016 ], [ -104.043242, 47.747106 ], [ -104.043199, 47.747292 ], [ -104.042384, 47.803256 ], [ -104.042432, 47.805358 ], [ -104.042567, 47.808237 ], [ -104.041869, 47.841699 ], [ -104.041662, 47.862282 ], [ -104.042230, 47.891031 ], [ -104.043329, 47.949554 ], [ -104.043497, 47.954490 ], [ -104.043933, 47.971515 ], [ -104.044162, 47.992836 ], [ -104.044120, 47.996107 ], [ -104.045399, 48.164390 ], [ -104.045498, 48.176249 ], [ -104.045424, 48.192473 ], [ -104.045560, 48.193913 ], [ -104.045692, 48.241415 ], [ -104.045729, 48.244586 ], [ -104.045645, 48.246179 ], [ -104.045861, 48.255097 ], [ -104.046039, 48.256761 ], [ -104.046332, 48.342290 ], [ -104.046371, 48.374154 ], [ -104.046654, 48.374773 ], [ -104.046913, 48.389433 ], [ -104.046969, 48.390675 ], [ -104.047134, 48.411057 ], [ -104.046960, 48.421065 ], [ -104.047090, 48.445903 ], [ -104.047192, 48.447251 ], [ -104.047294, 48.452529 ], [ -104.047259, 48.452941 ], [ -104.047392, 48.467086 ], [ -104.047555, 48.494140 ], [ -104.048054, 48.500025 ], [ -104.047675, 48.517852 ], [ -104.047513, 48.525913 ], [ -104.047876, 48.530798 ], [ -104.047648, 48.531489 ], [ -104.047783, 48.539737 ], [ -104.047811, 48.562770 ], [ -104.047974, 48.591606 ], [ -104.048212, 48.599055 ], [ -104.047930, 48.620190 ], [ -104.047586, 48.625644 ], [ -104.047620, 48.627015 ], [ -104.047582, 48.633984 ], [ -104.047819, 48.648631 ], [ -104.047887, 48.649911 ], [ -104.047865, 48.657450 ], [ -104.047861, 48.658856 ], [ -104.047849, 48.663163 ], [ -104.047883, 48.664191 ], [ -104.048340, 48.747133 ], [ -104.048548, 48.751356 ], [ -104.048233, 48.765636 ], [ -104.048537, 48.788552 ], [ -104.048569, 48.797052 ], [ -104.048900, 48.847387 ], [ -104.048652, 48.865734 ], [ -104.048824, 48.867539 ], [ -104.048883, 48.874008 ], [ -104.048893, 48.875739 ], [ -104.048719, 48.879921 ], [ -104.048643, 48.902609 ], [ -104.048746, 48.906858 ], [ -104.048744, 48.912113 ], [ -104.048807, 48.933636 ], [ -104.048701, 48.940331 ], [ -104.048770, 48.943301 ], [ -104.048872, 48.949630 ], [ -104.048698, 48.951823 ], [ -104.048627, 48.957124 ], [ -104.048800, 48.958997 ], [ -104.048555, 48.963772 ], [ -104.048616, 48.966736 ], [ -104.048478, 48.987007 ], [ -104.048736, 48.999877 ], [ -103.992467, 48.999567 ], [ -103.988925, 48.999580 ], [ -103.983786, 48.999604 ], [ -103.982361, 48.999615 ], [ -103.980868, 48.999581 ], [ -103.976459, 48.999605 ], [ -103.969479, 48.999525 ], [ -103.968611, 48.999525 ], [ -103.923261, 48.999562 ], [ -103.921976, 48.999551 ], [ -103.918921, 48.999551 ], [ -103.917428, 48.999585 ], [ -103.876905, 48.999544 ], [ -103.865336, 48.999591 ], [ -103.862738, 48.999639 ], [ -103.858363, 48.999606 ], [ -103.856072, 48.999572 ], [ -103.852287, 48.999561 ], [ -103.375467, 48.998951 ], [ -103.355491, 48.999584 ], [ -102.850455, 48.999431 ], [ -102.216993, 48.998553 ], [ -102.211301, 48.998554 ], [ -102.151847, 48.998798 ], [ -102.131614, 48.998842 ], [ -102.021144, 48.999015 ], [ -101.625438, 48.999168 ], [ -101.500437, 48.999670 ], [ -101.456737, 48.999320 ], [ -101.225915, 48.999531 ], [ -101.225187, 48.999566 ], [ -101.220754, 48.999455 ], [ -101.216182, 48.999469 ], [ -101.125434, 48.999078 ], [ -100.920577, 48.999560 ], [ -100.917939, 48.999571 ], [ -100.913634, 48.999662 ], [ -100.907107, 48.999593 ], [ -100.433981, 48.999410 ], [ -100.434351, 48.999570 ], [ -100.431642, 48.999604 ], [ -100.431676, 48.999398 ], [ -99.913780, 48.999049 ], [ -99.913705, 48.999049 ], [ -99.861488, 48.999156 ], [ -99.861454, 48.999202 ], [ -99.376068, 48.999357 ], [ -98.869037, 49.000205 ], [ -97.775750, 49.000574 ], [ -97.411216, 49.000510 ], [ -97.229039, 49.000687 ], [ -97.231397, 48.997212 ], [ -97.231490, 48.995995 ], [ -97.230403, 48.993366 ], [ -97.230833, 48.991303 ], [ -97.234214, 48.988966 ], [ -97.237297, 48.985696 ], [ -97.238387, 48.982631 ], [ -97.238025, 48.975143 ], [ -97.239209, 48.968684 ], [ -97.238882, 48.966573 ], [ -97.237541, 48.965341 ], [ -97.232491, 48.963897 ], [ -97.231460, 48.962437 ], [ -97.230859, 48.960891 ], [ -97.230859, 48.958229 ], [ -97.232319, 48.950501 ], [ -97.232147, 48.948955 ], [ -97.227854, 48.945864 ], [ -97.226823, 48.943545 ], [ -97.226394, 48.938651 ], [ -97.224505, 48.934100 ], [ -97.218666, 48.931781 ], [ -97.217549, 48.929892 ], [ -97.217463, 48.927659 ], [ -97.219185, 48.924860 ], [ -97.219095, 48.922078 ], [ -97.217992, 48.919735 ], [ -97.212926, 48.918033 ], [ -97.211161, 48.916649 ], [ -97.210809, 48.913950 ], [ -97.212553, 48.909860 ], [ -97.212706, 48.908143 ], [ -97.210541, 48.904390 ], [ -97.207688, 48.902629 ], [ -97.198857, 48.899831 ], [ -97.197982, 48.898332 ], [ -97.198107, 48.893959 ], [ -97.199981, 48.891086 ], [ -97.197857, 48.886838 ], [ -97.197982, 48.884839 ], [ -97.198857, 48.882215 ], [ -97.197982, 48.880341 ], [ -97.190486, 48.875594 ], [ -97.187737, 48.874594 ], [ -97.186238, 48.873470 ], [ -97.185738, 48.872220 ], [ -97.187362, 48.867598 ], [ -97.187113, 48.866098 ], [ -97.185488, 48.864849 ], [ -97.182365, 48.863725 ], [ -97.180116, 48.861601 ], [ -97.179071, 48.856866 ], [ -97.175618, 48.853105 ], [ -97.175618, 48.849857 ], [ -97.176993, 48.847733 ], [ -97.177243, 48.846483 ], [ -97.174355, 48.842619 ], [ -97.173811, 48.838309 ], [ -97.174275, 48.837261 ], [ -97.175727, 48.836158 ], [ -97.180366, 48.834365 ], [ -97.181116, 48.832741 ], [ -97.180991, 48.828992 ], [ -97.177747, 48.824815 ], [ -97.180028, 48.818450 ], [ -97.178611, 48.815839 ], [ -97.177045, 48.814124 ], [ -97.174045, 48.812108 ], [ -97.168497, 48.811002 ], [ -97.165624, 48.809627 ], [ -97.164874, 48.808253 ], [ -97.164874, 48.807129 ], [ -97.165921, 48.805273 ], [ -97.165921, 48.803792 ], [ -97.163699, 48.799513 ], [ -97.163535, 48.795070 ], [ -97.162959, 48.792930 ], [ -97.161231, 48.791778 ], [ -97.158102, 48.791145 ], [ -97.157093, 48.790024 ], [ -97.157797, 48.787680 ], [ -97.157804, 48.784104 ], [ -97.157067, 48.783120 ], [ -97.154116, 48.781891 ], [ -97.153256, 48.781031 ], [ -97.153871, 48.777712 ], [ -97.154854, 48.776728 ], [ -97.155223, 48.775499 ], [ -97.154854, 48.774515 ], [ -97.153871, 48.773286 ], [ -97.152588, 48.772602 ], [ -97.147478, 48.766033 ], [ -97.147478, 48.763698 ], [ -97.151289, 48.757428 ], [ -97.151043, 48.755707 ], [ -97.150060, 48.754724 ], [ -97.143176, 48.750913 ], [ -97.139488, 48.746611 ], [ -97.139611, 48.738129 ], [ -97.138996, 48.736654 ], [ -97.135341, 48.734560 ], [ -97.134847, 48.733324 ], [ -97.135094, 48.729740 ], [ -97.136083, 48.727763 ], [ -97.135588, 48.726403 ], [ -97.134229, 48.725167 ], [ -97.126398, 48.721101 ], [ -97.124328, 48.719166 ], [ -97.121253, 48.713593 ], [ -97.116185, 48.709348 ], [ -97.116926, 48.705022 ], [ -97.119027, 48.703292 ], [ -97.118286, 48.700573 ], [ -97.108655, 48.691484 ], [ -97.098697, 48.687534 ], [ -97.097584, 48.686298 ], [ -97.097337, 48.685186 ], [ -97.097708, 48.683950 ], [ -97.100056, 48.681355 ], [ -97.100674, 48.679624 ], [ -97.099811, 48.671377 ], [ -97.100009, 48.667926 ], [ -97.101539, 48.666771 ], [ -97.102652, 48.664793 ], [ -97.100674, 48.661951 ], [ -97.100551, 48.658614 ], [ -97.101790, 48.656294 ], [ -97.104566, 48.654416 ], [ -97.105910, 48.652632 ], [ -97.107814, 48.647728 ], [ -97.111179, 48.644525 ], [ -97.111921, 48.642918 ], [ -97.109651, 48.638888 ], [ -97.108276, 48.634396 ], [ -97.108466, 48.632658 ], [ -97.109515, 48.631453 ], [ -97.111559, 48.630266 ], [ -97.115043, 48.629821 ], [ -97.120819, 48.631053 ], [ -97.125269, 48.629694 ], [ -97.125887, 48.629076 ], [ -97.125887, 48.626975 ], [ -97.124175, 48.625387 ], [ -97.124033, 48.623267 ], [ -97.124774, 48.621537 ], [ -97.125639, 48.620919 ], [ -97.130089, 48.621166 ], [ -97.131325, 48.619065 ], [ -97.130707, 48.616593 ], [ -97.131448, 48.613998 ], [ -97.132931, 48.613380 ], [ -97.136145, 48.613256 ], [ -97.137504, 48.612268 ], [ -97.138246, 48.609301 ], [ -97.137380, 48.607324 ], [ -97.138246, 48.604234 ], [ -97.140841, 48.600032 ], [ -97.142818, 48.598425 ], [ -97.143684, 48.597066 ], [ -97.143931, 48.594594 ], [ -97.142237, 48.592595 ], [ -97.141585, 48.590820 ], [ -97.142915, 48.583733 ], [ -97.143654, 48.582358 ], [ -97.144922, 48.581452 ], [ -97.148429, 48.581028 ], [ -97.149740, 48.579516 ], [ -97.149616, 48.576921 ], [ -97.148874, 48.575067 ], [ -97.148998, 48.571977 ], [ -97.149616, 48.569876 ], [ -97.151638, 48.567630 ], [ -97.157402, 48.565921 ], [ -97.158638, 48.564067 ], [ -97.158762, 48.560112 ], [ -97.158267, 48.558753 ], [ -97.156413, 48.557146 ], [ -97.153942, 48.556034 ], [ -97.152211, 48.553933 ], [ -97.152459, 48.552326 ], [ -97.153447, 48.551214 ], [ -97.155791, 48.551173 ], [ -97.160863, 48.549236 ], [ -97.162099, 48.548124 ], [ -97.162717, 48.546765 ], [ -97.163105, 48.543855 ], [ -97.159697, 48.541339 ], [ -97.153942, 48.539102 ], [ -97.150481, 48.536877 ], [ -97.148874, 48.534282 ], [ -97.149122, 48.532305 ], [ -97.151964, 48.529215 ], [ -97.153076, 48.524148 ], [ -97.148133, 48.503384 ], [ -97.147638, 48.501531 ], [ -97.146279, 48.499677 ], [ -97.140347, 48.496834 ], [ -97.138864, 48.494362 ], [ -97.139276, 48.486310 ], [ -97.140291, 48.484722 ], [ -97.143869, 48.482930 ], [ -97.144981, 48.481571 ], [ -97.144611, 48.478975 ], [ -97.142757, 48.477987 ], [ -97.141397, 48.476256 ], [ -97.142015, 48.474650 ], [ -97.143745, 48.473661 ], [ -97.144116, 48.469212 ], [ -97.143127, 48.466246 ], [ -97.141768, 48.464021 ], [ -97.134229, 48.461178 ], [ -97.132746, 48.459942 ], [ -97.132622, 48.456482 ], [ -97.133611, 48.452280 ], [ -97.137072, 48.449067 ], [ -97.137689, 48.447583 ], [ -97.137689, 48.444247 ], [ -97.137319, 48.443505 ], [ -97.135094, 48.442269 ], [ -97.134229, 48.439797 ], [ -97.134970, 48.436337 ], [ -97.136206, 48.434606 ], [ -97.139296, 48.432011 ], [ -97.139173, 48.430528 ], [ -97.137813, 48.428056 ], [ -97.135600, 48.426524 ], [ -97.135600, 48.424369 ], [ -97.136971, 48.422018 ], [ -97.142066, 48.420450 ], [ -97.142849, 48.419471 ], [ -97.142457, 48.416727 ], [ -97.138343, 48.415944 ], [ -97.135600, 48.411829 ], [ -97.135012, 48.406735 ], [ -97.135795, 48.404187 ], [ -97.140106, 48.399289 ], [ -97.143829, 48.397134 ], [ -97.145201, 48.395566 ], [ -97.145592, 48.394195 ], [ -97.145201, 48.388904 ], [ -97.143633, 48.386161 ], [ -97.140890, 48.384006 ], [ -97.140106, 48.382242 ], [ -97.140106, 48.380479 ], [ -97.142066, 48.374209 ], [ -97.144221, 48.371270 ], [ -97.146376, 48.370290 ], [ -97.147356, 48.368723 ], [ -97.147748, 48.366959 ], [ -97.147748, 48.359905 ], [ -97.143861, 48.354503 ], [ -97.139851, 48.353425 ], [ -97.137822, 48.352003 ], [ -97.137492, 48.350602 ], [ -97.138481, 48.347470 ], [ -97.137904, 48.344585 ], [ -97.131722, 48.341123 ], [ -97.131145, 48.339722 ], [ -97.131969, 48.335518 ], [ -97.134854, 48.331314 ], [ -97.134772, 48.328677 ], [ -97.133751, 48.327847 ], [ -97.131227, 48.327935 ], [ -97.127766, 48.326781 ], [ -97.127436, 48.325709 ], [ -97.127601, 48.323319 ], [ -97.129826, 48.320516 ], [ -97.131250, 48.319543 ], [ -97.131697, 48.318324 ], [ -97.132443, 48.315489 ], [ -97.131921, 48.312728 ], [ -97.130951, 48.311609 ], [ -97.127146, 48.310192 ], [ -97.126176, 48.309147 ], [ -97.126176, 48.303701 ], [ -97.122296, 48.301388 ], [ -97.122072, 48.300865 ], [ -97.122520, 48.299299 ], [ -97.123341, 48.298627 ], [ -97.127295, 48.298478 ], [ -97.128638, 48.297657 ], [ -97.129086, 48.295792 ], [ -97.128862, 48.292882 ], [ -97.127236, 48.291827 ], [ -97.125348, 48.291855 ], [ -97.122160, 48.290056 ], [ -97.117726, 48.283488 ], [ -97.116717, 48.281246 ], [ -97.116570, 48.279661 ], [ -97.124080, 48.271250 ], [ -97.125348, 48.270452 ], [ -97.130280, 48.269305 ], [ -97.131846, 48.267589 ], [ -97.131921, 48.266023 ], [ -97.130951, 48.265276 ], [ -97.128551, 48.264816 ], [ -97.127146, 48.262889 ], [ -97.127146, 48.260874 ], [ -97.129384, 48.258785 ], [ -97.129533, 48.257815 ], [ -97.129235, 48.256398 ], [ -97.127594, 48.254383 ], [ -97.127276, 48.253323 ], [ -97.127967, 48.251474 ], [ -97.129384, 48.250429 ], [ -97.133434, 48.249873 ], [ -97.138033, 48.246236 ], [ -97.138765, 48.244991 ], [ -97.138618, 48.242429 ], [ -97.135617, 48.238988 ], [ -97.135763, 48.237596 ], [ -97.139790, 48.235913 ], [ -97.141254, 48.234668 ], [ -97.140815, 48.232032 ], [ -97.139311, 48.230187 ], [ -97.136304, 48.228984 ], [ -97.136003, 48.228082 ], [ -97.136304, 48.226176 ], [ -97.137690, 48.225126 ], [ -97.138154, 48.223104 ], [ -97.137522, 48.221713 ], [ -97.135617, 48.220904 ], [ -97.135201, 48.219156 ], [ -97.135177, 48.217243 ], [ -97.137407, 48.215245 ], [ -97.137006, 48.212537 ], [ -97.134372, 48.210434 ], [ -97.134738, 48.207506 ], [ -97.137740, 48.206188 ], [ -97.138765, 48.204650 ], [ -97.139131, 48.202820 ], [ -97.138007, 48.197587 ], [ -97.141233, 48.193602 ], [ -97.141518, 48.192518 ], [ -97.146233, 48.186054 ], [ -97.146013, 48.184590 ], [ -97.144622, 48.183199 ], [ -97.142938, 48.182686 ], [ -97.141840, 48.181734 ], [ -97.141474, 48.179099 ], [ -97.141620, 48.177781 ], [ -97.142352, 48.176609 ], [ -97.145243, 48.174046 ], [ -97.146672, 48.171484 ], [ -97.146745, 48.168556 ], [ -97.144242, 48.162490 ], [ -97.141950, 48.160202 ], [ -97.139643, 48.159111 ], [ -97.138911, 48.157793 ], [ -97.138911, 48.155304 ], [ -97.139497, 48.153108 ], [ -97.140295, 48.150894 ], [ -97.142279, 48.148056 ], [ -97.142133, 48.144981 ], [ -97.141401, 48.143590 ], [ -97.134299, 48.141833 ], [ -97.131956, 48.139563 ], [ -97.132520, 48.137641 ], [ -97.132176, 48.135829 ], [ -97.129453, 48.133133 ], [ -97.128279, 48.127185 ], [ -97.126862, 48.124277 ], [ -97.121586, 48.116925 ], [ -97.120702, 48.114987 ], [ -97.120592, 48.113365 ], [ -97.121040, 48.112281 ], [ -97.123135, 48.109497 ], [ -97.123666, 48.108004 ], [ -97.123205, 48.106648 ], [ -97.119773, 48.105381 ], [ -97.113194, 48.106188 ], [ -97.111470, 48.105913 ], [ -97.109535, 48.104723 ], [ -97.108428, 48.099824 ], [ -97.104872, 48.097851 ], [ -97.103950, 48.096184 ], [ -97.103879, 48.094517 ], [ -97.105475, 48.092780 ], [ -97.105616, 48.091362 ], [ -97.105226, 48.090440 ], [ -97.102165, 48.089122 ], [ -97.099798, 48.085884 ], [ -97.099431, 48.082106 ], [ -97.100771, 48.077452 ], [ -97.104154, 48.074578 ], [ -97.104697, 48.073094 ], [ -97.104483, 48.072428 ], [ -97.103052, 48.071669 ], [ -97.097772, 48.071080 ], [ -97.086986, 48.058222 ], [ -97.082895, 48.055794 ], [ -97.075641, 48.052725 ], [ -97.074015, 48.051212 ], [ -97.072257, 48.048068 ], [ -97.070411, 48.041765 ], [ -97.068711, 48.027694 ], [ -97.068987, 48.026267 ], [ -97.071911, 48.021395 ], [ -97.072239, 48.019107 ], [ -97.070654, 48.016918 ], [ -97.069284, 48.016176 ], [ -97.064927, 48.015658 ], [ -97.063289, 48.014989 ], [ -97.063012, 48.013179 ], [ -97.065411, 48.011337 ], [ -97.066762, 48.009558 ], [ -97.064289, 47.998508 ], [ -97.062257, 47.995948 ], [ -97.054945, 47.992924 ], [ -97.053553, 47.991612 ], [ -97.053089, 47.990252 ], [ -97.053537, 47.987948 ], [ -97.056481, 47.980556 ], [ -97.059153, 47.975380 ], [ -97.059353, 47.973980 ], [ -97.057153, 47.970480 ], [ -97.057854, 47.968980 ], [ -97.061554, 47.965880 ], [ -97.061854, 47.964480 ], [ -97.061454, 47.963580 ], [ -97.059054, 47.962080 ], [ -97.054054, 47.959679 ], [ -97.052454, 47.957179 ], [ -97.052554, 47.954779 ], [ -97.055154, 47.950779 ], [ -97.055554, 47.949079 ], [ -97.054554, 47.946279 ], [ -97.051054, 47.943379 ], [ -97.044954, 47.941079 ], [ -97.039154, 47.940479 ], [ -97.036054, 47.939379 ], [ -97.035554, 47.936579 ], [ -97.037354, 47.933279 ], [ -97.035754, 47.930179 ], [ -97.029654, 47.927578 ], [ -97.017754, 47.919778 ], [ -97.018054, 47.918078 ], [ -97.023754, 47.915878 ], [ -97.017254, 47.913078 ], [ -97.015354, 47.910278 ], [ -97.015054, 47.907178 ], [ -97.017254, 47.905678 ], [ -97.020355, 47.906378 ], [ -97.023555, 47.908478 ], [ -97.024955, 47.908178 ], [ -97.024155, 47.905278 ], [ -97.020255, 47.902178 ], [ -97.020155, 47.900478 ], [ -97.023955, 47.898078 ], [ -97.024955, 47.894978 ], [ -97.018955, 47.891078 ], [ -97.019155, 47.889778 ], [ -97.024955, 47.886878 ], [ -97.025355, 47.884278 ], [ -97.023355, 47.882078 ], [ -97.019355, 47.880278 ], [ -97.017955, 47.878478 ], [ -97.018955, 47.876878 ], [ -97.023156, 47.874978 ], [ -97.023156, 47.873978 ], [ -97.021256, 47.872578 ], [ -97.017356, 47.871578 ], [ -97.005356, 47.870177 ], [ -97.002456, 47.868677 ], [ -97.001556, 47.867377 ], [ -97.003356, 47.865877 ], [ -97.005857, 47.865277 ], [ -97.005557, 47.863977 ], [ -97.001759, 47.861266 ], [ -97.000356, 47.860915 ], [ -96.998144, 47.858882 ], [ -96.996816, 47.854405 ], [ -96.996364, 47.844398 ], [ -96.997890, 47.843163 ], [ -96.998295, 47.841724 ], [ -96.992963, 47.837911 ], [ -96.986685, 47.837639 ], [ -96.981725, 47.830421 ], [ -96.982272, 47.826668 ], [ -96.981683, 47.825785 ], [ -96.979327, 47.824533 ], [ -96.979327, 47.821809 ], [ -96.980137, 47.821441 ], [ -96.980726, 47.820411 ], [ -96.980391, 47.815662 ], [ -96.977946, 47.811619 ], [ -96.978894, 47.809882 ], [ -96.980947, 47.808337 ], [ -96.981168, 47.806792 ], [ -96.980579, 47.805614 ], [ -96.976176, 47.801544 ], [ -96.976088, 47.799577 ], [ -96.975131, 47.798326 ], [ -96.973585, 47.797884 ], [ -96.971698, 47.798255 ], [ -96.966068, 47.797297 ], [ -96.963523, 47.794601 ], [ -96.957860, 47.792021 ], [ -96.957216, 47.790970 ], [ -96.957283, 47.790147 ], [ -96.961554, 47.788707 ], [ -96.963521, 47.787290 ], [ -96.965350, 47.784937 ], [ -96.965316, 47.783474 ], [ -96.964400, 47.782995 ], [ -96.961926, 47.783292 ], [ -96.956501, 47.779798 ], [ -96.956635, 47.776188 ], [ -96.949585, 47.775228 ], [ -96.939179, 47.768397 ], [ -96.936909, 47.764536 ], [ -96.938435, 47.762411 ], [ -96.937859, 47.760195 ], [ -96.935555, 47.758276 ], [ -96.932684, 47.756804 ], [ -96.932648, 47.755315 ], [ -96.934209, 47.754517 ], [ -96.934463, 47.752956 ], [ -96.934173, 47.752412 ], [ -96.929051, 47.750331 ], [ -96.928505, 47.748037 ], [ -96.928506, 47.744884 ], [ -96.929319, 47.742988 ], [ -96.933011, 47.739949 ], [ -96.933316, 47.738716 ], [ -96.932809, 47.737139 ], [ -96.930574, 47.734352 ], [ -96.925089, 47.729051 ], [ -96.919131, 47.724731 ], [ -96.918556, 47.723863 ], [ -96.919471, 47.722515 ], [ -96.923480, 47.719809 ], [ -96.923544, 47.718201 ], [ -96.920391, 47.716527 ], [ -96.919811, 47.714339 ], [ -96.920321, 47.712394 ], [ -96.920119, 47.710383 ], [ -96.915500, 47.707968 ], [ -96.914856, 47.707003 ], [ -96.914405, 47.704814 ], [ -96.915242, 47.703527 ], [ -96.915242, 47.702369 ], [ -96.913762, 47.701468 ], [ -96.912846, 47.701746 ], [ -96.911527, 47.700512 ], [ -96.909769, 47.697313 ], [ -96.907604, 47.695119 ], [ -96.907266, 47.693976 ], [ -96.910144, 47.691235 ], [ -96.909909, 47.689522 ], [ -96.908928, 47.688722 ], [ -96.907236, 47.688493 ], [ -96.905273, 47.689246 ], [ -96.902971, 47.691576 ], [ -96.901719, 47.691621 ], [ -96.900264, 47.690775 ], [ -96.899352, 47.689473 ], [ -96.896724, 47.674758 ], [ -96.895271, 47.673570 ], [ -96.891922, 47.673157 ], [ -96.889726, 47.670643 ], [ -96.889627, 47.668587 ], [ -96.887126, 47.666369 ], [ -96.885573, 47.663443 ], [ -96.885710, 47.661547 ], [ -96.887607, 47.658853 ], [ -96.886970, 47.653049 ], [ -96.882882, 47.650168 ], [ -96.882376, 47.649025 ], [ -96.882857, 47.641714 ], [ -96.884515, 47.640755 ], [ -96.888166, 47.639730 ], [ -96.888573, 47.638450 ], [ -96.882393, 47.633489 ], [ -96.879496, 47.620576 ], [ -96.876355, 47.619181 ], [ -96.870871, 47.618042 ], [ -96.870600, 47.617563 ], [ -96.871005, 47.616832 ], [ -96.874078, 47.614774 ], [ -96.873671, 47.613654 ], [ -96.860255, 47.612175 ], [ -96.857112, 47.610760 ], [ -96.855421, 47.608750 ], [ -96.854812, 47.606328 ], [ -96.856903, 47.602329 ], [ -96.855618, 47.600890 ], [ -96.853785, 47.599808 ], [ -96.852826, 47.597891 ], [ -96.853114, 47.596836 ], [ -96.854456, 47.596261 ], [ -96.854743, 47.594728 ], [ -96.851964, 47.591469 ], [ -96.851293, 47.589264 ], [ -96.853273, 47.579483 ], [ -96.856373, 47.575749 ], [ -96.855894, 47.573352 ], [ -96.854073, 47.572010 ], [ -96.853689, 47.570381 ], [ -96.856661, 47.567889 ], [ -96.858769, 47.567410 ], [ -96.859153, 47.566355 ], [ -96.858673, 47.564534 ], [ -96.857236, 47.564055 ], [ -96.856852, 47.563288 ], [ -96.857427, 47.561658 ], [ -96.859153, 47.559741 ], [ -96.859057, 47.558591 ], [ -96.858002, 47.556578 ], [ -96.855092, 47.554598 ], [ -96.853755, 47.552497 ], [ -96.854328, 47.550491 ], [ -96.856238, 47.548963 ], [ -96.856620, 47.548103 ], [ -96.856429, 47.546957 ], [ -96.854423, 47.545333 ], [ -96.854232, 47.544665 ], [ -96.854614, 47.542850 ], [ -96.856716, 47.540271 ], [ -96.856429, 47.538456 ], [ -96.855092, 47.537310 ], [ -96.854710, 47.535973 ], [ -96.860524, 47.529536 ], [ -96.862379, 47.529055 ], [ -96.864739, 47.527663 ], [ -96.866363, 47.525944 ], [ -96.866363, 47.524893 ], [ -96.863551, 47.520304 ], [ -96.863245, 47.517266 ], [ -96.861422, 47.515873 ], [ -96.858454, 47.514892 ], [ -96.854204, 47.514368 ], [ -96.853468, 47.513813 ], [ -96.853181, 47.511425 ], [ -96.851749, 47.510088 ], [ -96.851367, 47.509037 ], [ -96.851749, 47.507891 ], [ -96.853052, 47.506828 ], [ -96.853286, 47.503881 ], [ -96.853317, 47.501322 ], [ -96.851844, 47.499390 ], [ -96.851653, 47.497098 ], [ -96.857002, 47.493468 ], [ -96.857957, 47.492513 ], [ -96.858530, 47.490889 ], [ -96.858530, 47.489934 ], [ -96.855856, 47.488310 ], [ -96.855665, 47.487260 ], [ -96.856142, 47.485540 ], [ -96.857957, 47.484681 ], [ -96.858530, 47.483917 ], [ -96.858530, 47.482484 ], [ -96.858148, 47.481624 ], [ -96.854996, 47.479618 ], [ -96.854710, 47.478281 ], [ -96.855856, 47.475702 ], [ -96.859103, 47.472837 ], [ -96.859868, 47.470926 ], [ -96.859555, 47.466865 ], [ -96.856811, 47.463190 ], [ -96.857480, 47.460229 ], [ -96.859581, 47.458700 ], [ -96.859963, 47.457363 ], [ -96.859677, 47.456026 ], [ -96.858148, 47.454498 ], [ -96.858244, 47.453351 ], [ -96.859239, 47.451557 ], [ -96.859537, 47.445662 ], [ -96.857480, 47.441603 ], [ -96.857480, 47.440457 ], [ -96.859772, 47.437209 ], [ -96.860059, 47.435681 ], [ -96.858530, 47.433389 ], [ -96.860823, 47.430237 ], [ -96.861014, 47.428995 ], [ -96.860632, 47.427658 ], [ -96.858721, 47.426129 ], [ -96.859581, 47.424028 ], [ -96.862924, 47.422309 ], [ -96.864261, 47.420972 ], [ -96.864261, 47.419539 ], [ -96.863593, 47.418775 ], [ -96.861231, 47.417810 ], [ -96.861095, 47.417056 ], [ -96.862070, 47.415159 ], [ -96.861833, 47.414337 ], [ -96.858094, 47.410317 ], [ -96.853325, 47.408889 ], [ -96.852656, 47.407647 ], [ -96.852739, 47.405909 ], [ -96.848071, 47.403158 ], [ -96.845110, 47.400483 ], [ -96.844919, 47.399815 ], [ -96.845874, 47.396185 ], [ -96.845492, 47.394179 ], [ -96.841767, 47.392460 ], [ -96.840717, 47.391314 ], [ -96.840621, 47.389881 ], [ -96.841099, 47.384150 ], [ -96.845588, 47.381571 ], [ -96.846925, 47.376891 ], [ -96.848931, 47.375363 ], [ -96.852676, 47.374973 ], [ -96.853754, 47.373405 ], [ -96.852035, 47.371876 ], [ -96.848907, 47.370565 ], [ -96.848597, 47.369584 ], [ -96.849552, 47.368247 ], [ -96.852226, 47.367291 ], [ -96.852417, 47.366241 ], [ -96.849456, 47.363662 ], [ -96.849265, 47.359841 ], [ -96.848119, 47.358026 ], [ -96.846877, 47.356785 ], [ -96.844298, 47.356021 ], [ -96.843439, 47.354397 ], [ -96.845158, 47.349430 ], [ -96.844012, 47.346182 ], [ -96.840586, 47.340956 ], [ -96.836609, 47.338684 ], [ -96.835845, 47.335914 ], [ -96.838520, 47.332380 ], [ -96.838329, 47.331043 ], [ -96.836036, 47.329706 ], [ -96.835177, 47.328560 ], [ -96.835177, 47.326267 ], [ -96.836609, 47.323975 ], [ -96.835845, 47.321014 ], [ -96.836036, 47.320059 ], [ -96.836991, 47.318817 ], [ -96.841194, 47.317575 ], [ -96.841958, 47.316907 ], [ -96.842531, 47.312418 ], [ -96.841003, 47.311558 ], [ -96.837045, 47.311391 ], [ -96.835735, 47.310843 ], [ -96.832884, 47.307069 ], [ -96.832884, 47.304490 ], [ -96.843922, 47.293020 ], [ -96.844088, 47.289981 ], [ -96.841465, 47.284041 ], [ -96.840220, 47.276981 ], [ -96.840353, 47.275496 ], [ -96.842245, 47.273351 ], [ -96.843200, 47.270486 ], [ -96.842531, 47.269531 ], [ -96.839761, 47.268767 ], [ -96.838997, 47.267716 ], [ -96.839857, 47.265997 ], [ -96.842054, 47.265328 ], [ -96.842627, 47.263991 ], [ -96.842531, 47.262845 ], [ -96.841290, 47.262463 ], [ -96.840717, 47.261221 ], [ -96.841003, 47.259215 ], [ -96.841672, 47.258164 ], [ -96.840048, 47.256159 ], [ -96.839857, 47.255490 ], [ -96.840525, 47.253866 ], [ -96.840143, 47.253102 ], [ -96.835368, 47.250428 ], [ -96.834699, 47.248135 ], [ -96.834890, 47.246416 ], [ -96.837278, 47.244219 ], [ -96.838233, 47.242882 ], [ -96.838233, 47.241831 ], [ -96.837660, 47.240876 ], [ -96.832946, 47.237588 ], [ -96.832693, 47.236196 ], [ -96.833362, 47.235050 ], [ -96.836036, 47.233999 ], [ -96.837564, 47.231802 ], [ -96.837374, 47.229254 ], [ -96.835654, 47.227217 ], [ -96.835654, 47.226549 ], [ -96.838806, 47.225020 ], [ -96.839284, 47.223874 ], [ -96.838329, 47.222059 ], [ -96.835941, 47.221009 ], [ -96.835654, 47.219289 ], [ -96.836514, 47.216137 ], [ -96.833553, 47.212794 ], [ -96.833362, 47.211457 ], [ -96.833648, 47.210406 ], [ -96.835463, 47.208401 ], [ -96.835177, 47.207445 ], [ -96.833457, 47.206490 ], [ -96.832120, 47.204866 ], [ -96.832789, 47.203911 ], [ -96.837660, 47.201141 ], [ -96.838615, 47.199613 ], [ -96.838806, 47.197894 ], [ -96.838233, 47.196366 ], [ -96.836800, 47.195028 ], [ -96.833075, 47.193596 ], [ -96.831260, 47.191781 ], [ -96.831165, 47.190826 ], [ -96.832502, 47.188342 ], [ -96.832407, 47.187483 ], [ -96.831451, 47.185572 ], [ -96.830401, 47.184617 ], [ -96.828299, 47.183948 ], [ -96.826962, 47.182802 ], [ -96.826676, 47.181561 ], [ -96.826962, 47.180128 ], [ -96.829446, 47.177262 ], [ -96.829828, 47.176307 ], [ -96.829637, 47.174970 ], [ -96.825147, 47.172295 ], [ -96.824288, 47.170863 ], [ -96.824479, 47.167042 ], [ -96.822091, 47.165036 ], [ -96.822377, 47.162744 ], [ -96.824288, 47.161120 ], [ -96.824861, 47.159783 ], [ -96.824670, 47.159019 ], [ -96.822707, 47.157668 ], [ -96.822405, 47.156914 ], [ -96.822706, 47.156229 ], [ -96.828013, 47.153956 ], [ -96.831260, 47.150900 ], [ -96.831069, 47.149467 ], [ -96.830114, 47.148512 ], [ -96.830114, 47.146793 ], [ -96.832407, 47.143736 ], [ -96.831547, 47.142017 ], [ -96.828597, 47.139800 ], [ -96.827631, 47.136572 ], [ -96.827631, 47.134758 ], [ -96.828777, 47.131510 ], [ -96.827631, 47.129504 ], [ -96.824476, 47.127188 ], [ -96.824807, 47.124968 ], [ -96.825440, 47.123354 ], [ -96.826712, 47.122852 ], [ -96.827726, 47.121481 ], [ -96.827344, 47.120144 ], [ -96.821189, 47.115723 ], [ -96.820619, 47.113712 ], [ -96.822192, 47.111679 ], [ -96.822694, 47.109622 ], [ -96.821590, 47.108457 ], [ -96.818843, 47.107154 ], [ -96.817984, 47.106007 ], [ -96.818175, 47.104193 ], [ -96.819990, 47.100849 ], [ -96.819894, 47.099321 ], [ -96.818557, 47.097888 ], [ -96.818366, 47.093304 ], [ -96.820085, 47.091393 ], [ -96.820563, 47.089770 ], [ -96.819034, 47.087573 ], [ -96.820650, 47.083619 ], [ -96.820216, 47.082111 ], [ -96.819078, 47.081152 ], [ -96.819479, 47.078181 ], [ -96.821613, 47.076302 ], [ -96.820849, 47.073818 ], [ -96.821231, 47.073150 ], [ -96.823715, 47.071717 ], [ -96.824097, 47.070666 ], [ -96.823491, 47.065911 ], [ -96.821804, 47.064362 ], [ -96.821327, 47.062930 ], [ -96.822186, 47.062070 ], [ -96.824097, 47.061497 ], [ -96.824479, 47.059682 ], [ -96.822568, 47.055861 ], [ -96.819321, 47.052900 ], [ -96.818843, 47.047074 ], [ -96.820849, 47.041438 ], [ -96.820563, 47.039528 ], [ -96.818748, 47.037618 ], [ -96.818557, 47.035516 ], [ -96.818843, 47.034179 ], [ -96.821422, 47.032842 ], [ -96.821613, 47.031505 ], [ -96.821231, 47.029977 ], [ -96.818557, 47.027780 ], [ -96.817984, 47.026538 ], [ -96.819416, 47.024914 ], [ -96.826358, 47.023205 ], [ -96.829499, 47.021537 ], [ -96.833038, 47.016029 ], [ -96.832303, 47.015184 ], [ -96.833504, 47.010110 ], [ -96.834508, 47.008867 ], [ -96.834603, 47.007721 ], [ -96.834221, 47.006671 ], [ -96.831798, 47.004353 ], [ -96.827489, 47.001611 ], [ -96.826198, 47.001895 ], [ -96.823180, 46.999965 ], [ -96.823189, 46.998026 ], [ -96.824470, 46.996173 ], [ -96.824598, 46.993309 ], [ -96.822566, 46.990141 ], [ -96.819894, 46.977357 ], [ -96.822043, 46.971091 ], [ -96.821852, 46.969372 ], [ -96.819558, 46.967453 ], [ -96.809814, 46.963900 ], [ -96.802749, 46.965933 ], [ -96.801316, 46.965933 ], [ -96.799310, 46.964118 ], [ -96.798737, 46.962399 ], [ -96.799910, 46.959228 ], [ -96.799606, 46.954316 ], [ -96.798758, 46.952988 ], [ -96.799358, 46.947355 ], [ -96.797734, 46.946400 ], [ -96.792863, 46.946018 ], [ -96.791558, 46.944464 ], [ -96.790058, 46.937664 ], [ -96.791558, 46.934264 ], [ -96.791621, 46.931213 ], [ -96.791048, 46.929876 ], [ -96.790380, 46.929398 ], [ -96.786845, 46.928921 ], [ -96.785126, 46.925769 ], [ -96.783120, 46.925482 ], [ -96.780258, 46.928263 ], [ -96.775157, 46.930863 ], [ -96.763257, 46.935063 ], [ -96.761757, 46.934663 ], [ -96.760292, 46.933410 ], [ -96.760292, 46.932073 ], [ -96.762011, 46.929303 ], [ -96.762011, 46.928347 ], [ -96.761725, 46.927297 ], [ -96.759528, 46.925769 ], [ -96.760961, 46.923858 ], [ -96.761343, 46.922234 ], [ -96.760865, 46.920897 ], [ -96.759337, 46.919560 ], [ -96.759241, 46.918223 ], [ -96.762871, 46.916886 ], [ -96.763973, 46.912507 ], [ -96.763557, 46.909463 ], [ -96.765657, 46.905063 ], [ -96.767458, 46.905163 ], [ -96.770458, 46.906763 ], [ -96.773558, 46.903563 ], [ -96.776558, 46.895663 ], [ -96.773558, 46.884763 ], [ -96.771858, 46.884063 ], [ -96.769758, 46.884763 ], [ -96.768058, 46.884763 ], [ -96.767358, 46.883663 ], [ -96.768458, 46.879563 ], [ -96.769758, 46.877563 ], [ -96.771258, 46.877463 ], [ -96.775558, 46.879163 ], [ -96.780358, 46.880163 ], [ -96.781358, 46.879363 ], [ -96.780358, 46.877063 ], [ -96.779258, 46.875963 ], [ -96.779302, 46.872699 ], [ -96.780758, 46.867163 ], [ -96.782881, 46.864590 ], [ -96.782881, 46.862585 ], [ -96.781353, 46.860483 ], [ -96.781067, 46.859146 ], [ -96.781162, 46.857809 ], [ -96.781926, 46.856472 ], [ -96.782022, 46.853415 ], [ -96.780876, 46.852269 ], [ -96.779061, 46.851696 ], [ -96.777915, 46.850741 ], [ -96.777915, 46.849594 ], [ -96.779729, 46.847302 ], [ -96.780207, 46.845392 ], [ -96.779347, 46.843672 ], [ -96.779347, 46.842144 ], [ -96.780398, 46.841189 ], [ -96.783359, 46.840807 ], [ -96.783837, 46.840234 ], [ -96.784028, 46.838897 ], [ -96.783264, 46.837464 ], [ -96.783550, 46.835936 ], [ -96.785365, 46.834025 ], [ -96.789377, 46.833166 ], [ -96.789663, 46.832306 ], [ -96.787275, 46.829059 ], [ -96.787657, 46.827817 ], [ -96.789377, 46.827435 ], [ -96.791559, 46.827864 ], [ -96.797960, 46.822364 ], [ -96.800160, 46.819664 ], [ -96.799336, 46.815436 ], [ -96.800360, 46.813500 ], [ -96.802013, 46.812464 ], [ -96.802544, 46.811521 ], [ -96.801446, 46.810401 ], [ -96.796488, 46.808709 ], [ -96.795756, 46.807795 ], [ -96.796992, 46.791572 ], [ -96.796195, 46.789881 ], [ -96.793102, 46.787700 ], [ -96.791478, 46.785694 ], [ -96.791096, 46.783688 ], [ -96.792624, 46.780632 ], [ -96.792433, 46.778913 ], [ -96.792051, 46.778339 ], [ -96.788803, 46.777575 ], [ -96.788135, 46.776238 ], [ -96.789090, 46.773373 ], [ -96.788612, 46.771271 ], [ -96.784983, 46.768788 ], [ -96.784314, 46.767546 ], [ -96.784314, 46.766973 ], [ -96.785651, 46.766113 ], [ -96.785556, 46.764394 ], [ -96.783646, 46.762579 ], [ -96.784601, 46.761338 ], [ -96.786129, 46.760956 ], [ -96.787466, 46.758472 ], [ -96.787466, 46.756753 ], [ -96.783646, 46.753123 ], [ -96.783455, 46.750353 ], [ -96.784568, 46.748669 ], [ -96.785269, 46.746246 ], [ -96.784601, 46.743094 ], [ -96.781216, 46.740944 ], [ -96.781617, 46.737197 ], [ -96.784279, 46.732993 ], [ -96.781544, 46.730104 ], [ -96.779920, 46.729149 ], [ -96.779252, 46.727429 ], [ -96.779899, 46.722915 ], [ -96.784751, 46.720495 ], [ -96.786184, 46.712840 ], [ -96.791204, 46.703747 ], [ -96.790906, 46.702970 ], [ -96.787801, 46.700446 ], [ -96.786654, 46.695861 ], [ -96.786845, 46.692805 ], [ -96.787801, 46.691181 ], [ -96.786941, 46.688220 ], [ -96.785068, 46.687636 ], [ -96.784205, 46.686768 ], [ -96.784339, 46.685054 ], [ -96.788159, 46.681879 ], [ -96.787801, 46.679815 ], [ -96.788947, 46.678382 ], [ -96.792958, 46.677427 ], [ -96.793340, 46.676854 ], [ -96.793723, 46.674943 ], [ -96.792576, 46.672173 ], [ -96.793914, 46.669212 ], [ -96.798357, 46.665314 ], [ -96.798823, 46.658071 ], [ -96.796767, 46.653363 ], [ -96.790663, 46.649112 ], [ -96.789405, 46.641639 ], [ -96.789572, 46.639079 ], [ -96.790523, 46.636880 ], [ -96.791096, 46.633155 ], [ -96.789950, 46.631531 ], [ -96.784792, 46.629430 ], [ -96.784123, 46.628666 ], [ -96.783837, 46.627329 ], [ -96.784505, 46.625418 ], [ -96.783932, 46.621598 ], [ -96.779061, 46.620834 ], [ -96.778201, 46.619305 ], [ -96.778965, 46.617873 ], [ -96.778488, 46.616153 ], [ -96.774954, 46.614625 ], [ -96.774094, 46.613288 ], [ -96.775622, 46.609276 ], [ -96.774763, 46.607461 ], [ -96.772088, 46.606315 ], [ -96.771802, 46.605742 ], [ -96.772476, 46.603716 ], [ -96.772457, 46.601491 ], [ -96.772446, 46.600129 ], [ -96.770226, 46.598148 ], [ -96.766596, 46.597957 ], [ -96.763865, 46.594595 ], [ -96.762584, 46.593946 ], [ -96.761820, 46.592991 ], [ -96.762393, 46.589743 ], [ -96.761820, 46.588501 ], [ -96.757999, 46.586878 ], [ -96.756662, 46.585827 ], [ -96.756949, 46.583534 ], [ -96.755421, 46.582866 ], [ -96.752746, 46.582770 ], [ -96.752078, 46.582197 ], [ -96.753033, 46.578950 ], [ -96.752746, 46.577517 ], [ -96.751600, 46.576371 ], [ -96.748161, 46.575798 ], [ -96.746442, 46.574078 ], [ -96.744436, 46.565960 ], [ -96.746633, 46.560706 ], [ -96.748161, 46.559847 ], [ -96.748830, 46.558127 ], [ -96.748161, 46.556408 ], [ -96.746824, 46.555071 ], [ -96.744532, 46.551346 ], [ -96.744341, 46.550104 ], [ -96.746347, 46.546283 ], [ -96.743577, 46.544850 ], [ -96.742812, 46.543609 ], [ -96.743003, 46.542940 ], [ -96.745009, 46.541698 ], [ -96.745105, 46.541125 ], [ -96.745009, 46.540457 ], [ -96.742335, 46.538546 ], [ -96.742239, 46.536827 ], [ -96.744341, 46.534630 ], [ -96.744341, 46.533006 ], [ -96.742020, 46.529036 ], [ -96.738475, 46.525793 ], [ -96.737408, 46.517636 ], [ -96.736147, 46.513478 ], [ -96.738562, 46.509366 ], [ -96.735888, 46.506310 ], [ -96.735888, 46.504973 ], [ -96.737702, 46.500770 ], [ -96.735499, 46.497932 ], [ -96.733612, 46.497224 ], [ -96.734570, 46.494254 ], [ -96.737798, 46.489785 ], [ -96.737989, 46.487875 ], [ -96.737129, 46.485965 ], [ -96.735505, 46.484914 ], [ -96.735028, 46.483863 ], [ -96.736270, 46.481380 ], [ -96.736365, 46.480138 ], [ -96.735123, 46.478897 ], [ -96.726914, 46.476432 ], [ -96.726718, 46.474121 ], [ -96.724712, 46.473166 ], [ -96.722420, 46.472784 ], [ -96.721560, 46.472115 ], [ -96.720891, 46.471446 ], [ -96.721274, 46.470014 ], [ -96.720414, 46.468008 ], [ -96.717453, 46.464474 ], [ -96.715557, 46.463232 ], [ -96.714861, 46.459132 ], [ -96.715593, 46.453867 ], [ -96.718551, 46.451913 ], [ -96.718933, 46.451054 ], [ -96.718169, 46.448666 ], [ -96.717119, 46.448093 ], [ -96.716641, 46.447233 ], [ -96.716438, 46.444567 ], [ -96.717967, 46.442021 ], [ -96.718647, 46.439974 ], [ -96.718074, 46.438255 ], [ -96.715495, 46.436153 ], [ -96.711770, 46.436153 ], [ -96.709095, 46.435294 ], [ -96.707471, 46.432715 ], [ -96.706994, 46.430231 ], [ -96.706134, 46.429754 ], [ -96.703078, 46.429467 ], [ -96.701645, 46.428607 ], [ -96.701167, 46.426506 ], [ -96.702314, 46.423832 ], [ -96.702314, 46.422685 ], [ -96.701358, 46.420584 ], [ -96.697920, 46.420680 ], [ -96.696869, 46.420011 ], [ -96.696392, 46.418483 ], [ -96.696869, 46.416859 ], [ -96.696583, 46.415617 ], [ -96.694290, 46.414280 ], [ -96.688941, 46.413134 ], [ -96.688318, 46.410948 ], [ -96.688846, 46.409409 ], [ -96.688082, 46.407880 ], [ -96.684834, 46.407021 ], [ -96.682008, 46.407840 ], [ -96.680687, 46.407383 ], [ -96.678507, 46.404823 ], [ -96.669132, 46.390037 ], [ -96.669794, 46.384644 ], [ -96.667189, 46.375458 ], [ -96.666028, 46.374566 ], [ -96.658436, 46.373391 ], [ -96.658009, 46.370512 ], [ -96.655206, 46.365964 ], [ -96.650718, 46.363655 ], [ -96.646532, 46.362510 ], [ -96.646341, 46.360982 ], [ -96.647296, 46.358499 ], [ -96.645959, 46.353532 ], [ -96.644335, 46.351908 ], [ -96.640267, 46.351585 ], [ -96.631586, 46.353752 ], [ -96.629211, 46.352654 ], [ -96.629378, 46.350529 ], [ -96.628522, 46.349569 ], [ -96.620790, 46.347607 ], [ -96.618147, 46.344295 ], [ -96.620454, 46.341346 ], [ -96.619991, 46.340135 ], [ -96.614676, 46.337418 ], [ -96.608075, 46.332576 ], [ -96.601048, 46.331139 ], [ -96.599761, 46.330386 ], [ -96.601040, 46.319554 ], [ -96.598399, 46.314482 ], [ -96.598233, 46.312563 ], [ -96.601360, 46.304130 ], [ -96.600270, 46.300406 ], [ -96.599156, 46.299183 ], [ -96.598679, 46.297750 ], [ -96.600302, 46.294407 ], [ -96.599347, 46.292879 ], [ -96.596968, 46.291838 ], [ -96.596077, 46.290536 ], [ -96.596100, 46.286097 ], [ -96.598201, 46.283136 ], [ -96.598774, 46.281417 ], [ -96.598392, 46.280080 ], [ -96.595509, 46.276689 ], [ -96.595014, 46.275135 ], [ -96.596822, 46.267913 ], [ -96.599087, 46.263701 ], [ -96.599729, 46.262123 ], [ -96.598870, 46.260690 ], [ -96.595909, 46.259926 ], [ -96.594571, 46.258302 ], [ -96.593616, 46.256679 ], [ -96.593712, 46.254959 ], [ -96.594571, 46.253335 ], [ -96.594189, 46.251712 ], [ -96.592470, 46.250757 ], [ -96.590942, 46.250183 ], [ -96.590369, 46.249515 ], [ -96.590082, 46.248655 ], [ -96.590369, 46.247891 ], [ -96.591037, 46.247222 ], [ -96.592375, 46.246076 ], [ -96.594234, 46.245329 ], [ -96.598119, 46.243112 ], [ -96.598645, 46.241626 ], [ -96.597550, 46.227733 ], [ -96.595670, 46.219850 ], [ -96.591652, 46.218183 ], [ -96.586744, 46.209912 ], [ -96.584899, 46.204383 ], [ -96.584372, 46.204155 ], [ -96.583582, 46.201047 ], [ -96.584272, 46.198053 ], [ -96.584929, 46.197231 ], [ -96.587694, 46.195262 ], [ -96.587724, 46.191838 ], [ -96.588579, 46.189689 ], [ -96.588554, 46.185233 ], [ -96.587503, 46.183609 ], [ -96.587217, 46.182749 ], [ -96.587408, 46.181221 ], [ -96.587599, 46.180075 ], [ -96.587599, 46.178928 ], [ -96.587408, 46.178164 ], [ -96.586739, 46.177305 ], [ -96.585647, 46.177309 ], [ -96.584495, 46.177123 ], [ -96.583324, 46.174154 ], [ -96.583779, 46.173563 ], [ -96.582823, 46.170905 ], [ -96.580531, 46.169186 ], [ -96.578620, 46.168135 ], [ -96.577952, 46.165843 ], [ -96.577715, 46.162797 ], [ -96.580408, 46.151234 ], [ -96.579453, 46.147601 ], [ -96.577381, 46.144951 ], [ -96.574784, 46.143146 ], [ -96.569260, 46.133686 ], [ -96.570081, 46.127037 ], [ -96.571439, 46.125720 ], [ -96.570023, 46.123756 ], [ -96.563043, 46.119512 ], [ -96.562811, 46.116250 ], [ -96.566920, 46.114750 ], [ -96.565723, 46.111963 ], [ -96.563175, 46.107995 ], [ -96.559167, 46.105024 ], [ -96.557952, 46.102442 ], [ -96.556672, 46.097232 ], [ -96.556345, 46.086880 ], [ -96.554507, 46.083978 ], [ -96.558088, 46.072096 ], [ -96.558055, 46.071159 ], [ -96.556611, 46.068920 ], [ -96.556907, 46.064830 ], [ -96.559271, 46.058272 ], [ -96.560945, 46.055415 ], [ -96.566295, 46.051416 ], [ -96.573644, 46.037911 ], [ -96.577940, 46.026874 ], [ -96.577315, 46.023560 ], [ -96.574264, 46.016545 ], [ -96.575869, 46.007999 ], [ -96.574064, 46.004434 ], [ -96.573605, 46.002309 ], [ -96.572483, 45.989577 ], [ -96.572384, 45.980231 ], [ -96.570350, 45.963595 ], [ -96.564803, 45.950349 ], [ -96.562135, 45.947718 ], [ -96.561334, 45.945655 ], [ -96.562525, 45.937087 ], [ -96.563280, 45.935238 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US40", "STATE": "40", "NAME": "Oklahoma", "LSAD": "", "CENSUSAREA": 68594.921000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -94.617919, 36.499414 ], [ -94.615311, 36.484992 ], [ -94.613830, 36.476248 ], [ -94.611609, 36.461528 ], [ -94.605408, 36.421949 ], [ -94.602623, 36.405283 ], [ -94.601984, 36.402120 ], [ -94.599723, 36.387587 ], [ -94.593397, 36.345742 ], [ -94.586200, 36.299969 ], [ -94.577883, 36.250080 ], [ -94.577899, 36.249548 ], [ -94.576003, 36.240070 ], [ -94.575071, 36.233682 ], [ -94.574880, 36.232741 ], [ -94.574395, 36.229996 ], [ -94.571806, 36.213748 ], [ -94.571253, 36.210901 ], [ -94.566588, 36.183774 ], [ -94.565655, 36.178439 ], [ -94.562803, 36.161749 ], [ -94.561165, 36.152110 ], [ -94.547871, 36.078281 ], [ -94.547715, 36.077271 ], [ -94.535724, 36.007807 ], [ -94.534852, 36.002678 ], [ -94.533646, 35.996804 ], [ -94.532071, 35.987852 ], [ -94.528305, 35.966054 ], [ -94.528162, 35.965665 ], [ -94.524640, 35.945727 ], [ -94.524344, 35.944050 ], [ -94.522910, 35.936127 ], [ -94.522634, 35.934892 ], [ -94.522658, 35.934799 ], [ -94.522658, 35.934250 ], [ -94.517571, 35.901866 ], [ -94.507631, 35.845901 ], [ -94.505642, 35.833628 ], [ -94.504438, 35.826369 ], [ -94.503011, 35.817210 ], [ -94.501162, 35.806430 ], [ -94.500764, 35.803820 ], [ -94.500526, 35.802642 ], [ -94.499647, 35.796910 ], [ -94.499045, 35.793460 ], [ -94.494549, 35.768303 ], [ -94.493362, 35.761892 ], [ -94.488210, 35.729240 ], [ -94.487585, 35.726147 ], [ -94.472647, 35.638556 ], [ -94.465272, 35.594037 ], [ -94.464457, 35.588909 ], [ -94.464097, 35.587265 ], [ -94.463318, 35.582660 ], [ -94.449696, 35.496719 ], [ -94.431215, 35.394290 ], [ -94.433915, 35.387391 ], [ -94.432685, 35.380806 ], [ -94.433415, 35.376291 ], [ -94.431515, 35.369591 ], [ -94.432015, 35.367391 ], [ -94.431815, 35.362891 ], [ -94.434115, 35.306493 ], [ -94.435170, 35.291494 ], [ -94.435280, 35.287485 ], [ -94.435316, 35.275893 ], [ -94.435706, 35.274267 ], [ -94.435812, 35.271300 ], [ -94.436595, 35.250094 ], [ -94.437578, 35.242202 ], [ -94.437774, 35.239271 ], [ -94.437578, 35.230936 ], [ -94.438247, 35.210992 ], [ -94.438470, 35.208587 ], [ -94.439084, 35.197298 ], [ -94.439056, 35.193588 ], [ -94.438860, 35.187183 ], [ -94.439509, 35.171807 ], [ -94.439550, 35.169037 ], [ -94.440754, 35.128806 ], [ -94.441232, 35.119724 ], [ -94.449253, 34.895869 ], [ -94.449086, 34.894152 ], [ -94.449058, 34.890556 ], [ -94.449630, 34.875253 ], [ -94.450065, 34.861335 ], [ -94.450140, 34.858694 ], [ -94.450233, 34.855413 ], [ -94.457530, 34.642961 ], [ -94.457500, 34.634945 ], [ -94.460052, 34.547869 ], [ -94.460058, 34.545264 ], [ -94.461149, 34.507457 ], [ -94.463671, 34.419585 ], [ -94.463816, 34.414465 ], [ -94.464176, 34.402713 ], [ -94.465425, 34.359548 ], [ -94.465847, 34.352073 ], [ -94.474896, 34.021877 ], [ -94.474896, 34.021838 ], [ -94.474895, 34.019655 ], [ -94.476957, 33.957365 ], [ -94.477038, 33.953838 ], [ -94.477387, 33.937759 ], [ -94.478842, 33.881485 ], [ -94.478994, 33.881197 ], [ -94.479954, 33.851330 ], [ -94.480574, 33.830166 ], [ -94.481355, 33.802887 ], [ -94.481361, 33.802649 ], [ -94.481543, 33.795719 ], [ -94.481842, 33.789008 ], [ -94.482682, 33.756286 ], [ -94.482777, 33.753638 ], [ -94.482862, 33.750780 ], [ -94.482870, 33.750564 ], [ -94.483874, 33.716733 ], [ -94.483840, 33.711332 ], [ -94.484616, 33.691592 ], [ -94.484520, 33.687909 ], [ -94.485528, 33.663388 ], [ -94.485577, 33.653310 ], [ -94.485875, 33.637867 ], [ -94.487514, 33.628939 ], [ -94.491503, 33.625115 ], [ -94.504615, 33.620682 ], [ -94.520725, 33.616567 ], [ -94.526291, 33.619203 ], [ -94.528928, 33.621840 ], [ -94.529807, 33.627406 ], [ -94.528342, 33.629750 ], [ -94.529221, 33.634437 ], [ -94.533322, 33.637660 ], [ -94.538889, 33.637953 ], [ -94.543869, 33.635902 ], [ -94.549142, 33.635902 ], [ -94.552658, 33.638246 ], [ -94.553537, 33.642054 ], [ -94.551312, 33.644570 ], [ -94.551193, 33.650257 ], [ -94.552072, 33.653480 ], [ -94.557052, 33.656702 ], [ -94.564669, 33.655824 ], [ -94.568771, 33.654652 ], [ -94.570821, 33.654945 ], [ -94.572286, 33.656995 ], [ -94.571993, 33.659632 ], [ -94.569357, 33.663441 ], [ -94.569943, 33.666370 ], [ -94.572872, 33.669886 ], [ -94.576974, 33.673401 ], [ -94.579620, 33.677623 ], [ -94.586641, 33.678968 ], [ -94.590450, 33.677503 ], [ -94.593673, 33.673987 ], [ -94.596895, 33.671351 ], [ -94.603047, 33.671351 ], [ -94.607442, 33.672230 ], [ -94.611543, 33.674866 ], [ -94.616817, 33.679554 ], [ -94.621211, 33.681018 ], [ -94.627656, 33.677796 ], [ -94.630586, 33.673401 ], [ -94.635273, 33.669886 ], [ -94.642890, 33.668421 ], [ -94.646113, 33.669300 ], [ -94.648457, 33.673401 ], [ -94.647871, 33.680432 ], [ -94.648457, 33.684534 ], [ -94.649628, 33.688049 ], [ -94.652265, 33.690979 ], [ -94.659167, 33.692138 ], [ -94.684792, 33.684353 ], [ -94.707858, 33.686876 ], [ -94.710088, 33.688150 ], [ -94.710725, 33.691654 ], [ -94.710725, 33.696113 ], [ -94.709451, 33.699617 ], [ -94.711043, 33.705669 ], [ -94.714865, 33.707261 ], [ -94.719006, 33.708217 ], [ -94.721873, 33.707261 ], [ -94.724102, 33.705669 ], [ -94.725695, 33.702483 ], [ -94.728243, 33.699617 ], [ -94.732384, 33.700254 ], [ -94.737161, 33.704713 ], [ -94.739072, 33.710128 ], [ -94.737480, 33.716179 ], [ -94.739391, 33.722550 ], [ -94.742576, 33.727009 ], [ -94.753087, 33.729557 ], [ -94.759139, 33.729557 ], [ -94.762961, 33.731787 ], [ -94.767739, 33.737520 ], [ -94.768057, 33.742616 ], [ -94.766146, 33.748031 ], [ -94.766465, 33.750897 ], [ -94.768057, 33.753446 ], [ -94.770924, 33.754401 ], [ -94.775064, 33.755038 ], [ -94.789716, 33.746120 ], [ -94.798634, 33.744527 ], [ -94.809145, 33.749305 ], [ -94.812012, 33.751853 ], [ -94.817427, 33.752172 ], [ -94.821886, 33.750897 ], [ -94.824753, 33.749305 ], [ -94.826027, 33.743890 ], [ -94.827938, 33.741342 ], [ -94.830804, 33.740068 ], [ -94.841634, 33.739431 ], [ -94.849296, 33.739585 ], [ -94.869300, 33.745871 ], [ -94.874668, 33.749164 ], [ -94.877080, 33.752220 ], [ -94.875497, 33.755483 ], [ -94.876033, 33.760771 ], [ -94.879218, 33.764912 ], [ -94.881448, 33.765549 ], [ -94.886226, 33.764594 ], [ -94.888368, 33.767240 ], [ -94.902276, 33.776289 ], [ -94.906245, 33.778192 ], [ -94.911427, 33.778383 ], [ -94.919614, 33.786305 ], [ -94.920104, 33.789575 ], [ -94.919614, 33.794153 ], [ -94.916998, 33.801510 ], [ -94.916834, 33.804617 ], [ -94.917815, 33.808704 ], [ -94.919450, 33.810176 ], [ -94.921902, 33.811811 ], [ -94.924518, 33.812792 ], [ -94.928442, 33.812628 ], [ -94.932366, 33.810993 ], [ -94.935800, 33.810339 ], [ -94.939560, 33.810503 ], [ -94.944302, 33.812138 ], [ -94.948716, 33.818023 ], [ -94.949533, 33.825708 ], [ -94.957676, 33.835004 ], [ -94.964401, 33.837021 ], [ -94.965888, 33.848422 ], [ -94.968895, 33.860916 ], [ -94.971435, 33.862123 ], [ -94.973411, 33.861731 ], [ -94.976208, 33.859847 ], [ -94.981650, 33.852284 ], [ -94.983303, 33.851354 ], [ -94.988487, 33.851000 ], [ -94.992671, 33.852455 ], [ -94.995524, 33.857438 ], [ -95.000223, 33.862505 ], [ -95.008376, 33.866089 ], [ -95.016422, 33.861392 ], [ -95.022325, 33.859813 ], [ -95.037207, 33.860250 ], [ -95.046568, 33.862565 ], [ -95.049025, 33.864090 ], [ -95.058834, 33.886813 ], [ -95.061065, 33.895292 ], [ -95.065492, 33.899585 ], [ -95.071260, 33.901597 ], [ -95.078905, 33.898377 ], [ -95.084002, 33.893280 ], [ -95.090441, 33.893280 ], [ -95.093929, 33.895963 ], [ -95.095270, 33.899316 ], [ -95.095002, 33.904816 ], [ -95.098489, 33.909913 ], [ -95.100770, 33.912193 ], [ -95.103318, 33.913669 ], [ -95.110964, 33.912998 ], [ -95.119951, 33.915815 ], [ -95.122365, 33.918632 ], [ -95.122500, 33.921717 ], [ -95.121184, 33.931307 ], [ -95.124700, 33.934675 ], [ -95.131056, 33.936925 ], [ -95.149462, 33.936336 ], [ -95.161109, 33.937598 ], [ -95.166686, 33.939728 ], [ -95.168746, 33.941606 ], [ -95.184075, 33.950353 ], [ -95.219358, 33.961567 ], [ -95.226393, 33.961954 ], [ -95.230491, 33.960764 ], [ -95.252906, 33.933648 ], [ -95.253623, 33.929710 ], [ -95.253020, 33.927237 ], [ -95.251327, 33.924155 ], [ -95.250737, 33.917083 ], [ -95.250885, 33.913105 ], [ -95.253095, 33.905444 ], [ -95.255747, 33.902939 ], [ -95.261051, 33.899993 ], [ -95.263850, 33.899256 ], [ -95.272542, 33.902055 ], [ -95.275342, 33.901761 ], [ -95.277846, 33.900877 ], [ -95.279762, 33.899109 ], [ -95.280351, 33.896751 ], [ -95.281530, 33.887617 ], [ -95.281677, 33.882902 ], [ -95.283445, 33.877746 ], [ -95.287865, 33.874946 ], [ -95.294789, 33.875388 ], [ -95.325572, 33.885704 ], [ -95.333452, 33.886286 ], [ -95.334523, 33.885788 ], [ -95.334854, 33.876831 ], [ -95.339122, 33.868873 ], [ -95.352338, 33.867789 ], [ -95.375233, 33.868243 ], [ -95.407795, 33.866308 ], [ -95.447370, 33.868850 ], [ -95.463346, 33.872313 ], [ -95.464211, 33.873372 ], [ -95.461499, 33.883686 ], [ -95.462910, 33.885903 ], [ -95.464925, 33.886709 ], [ -95.469962, 33.886105 ], [ -95.478575, 33.879301 ], [ -95.492028, 33.874822 ], [ -95.502304, 33.874742 ], [ -95.506085, 33.876390 ], [ -95.506495, 33.878589 ], [ -95.506234, 33.886306 ], [ -95.510063, 33.890135 ], [ -95.515302, 33.891142 ], [ -95.520138, 33.889329 ], [ -95.525322, 33.885487 ], [ -95.533283, 33.881162 ], [ -95.539790, 33.879904 ], [ -95.545197, 33.880294 ], [ -95.548325, 33.882744 ], [ -95.552085, 33.888422 ], [ -95.552331, 33.894420 ], [ -95.549475, 33.901311 ], [ -95.549145, 33.907950 ], [ -95.551148, 33.914566 ], [ -95.556915, 33.927020 ], [ -95.559414, 33.930179 ], [ -95.561007, 33.931552 ], [ -95.563424, 33.932193 ], [ -95.585945, 33.934480 ], [ -95.599678, 33.934247 ], [ -95.603657, 33.927195 ], [ -95.636978, 33.906613 ], [ -95.647273, 33.905976 ], [ -95.659818, 33.909092 ], [ -95.665338, 33.908132 ], [ -95.669978, 33.905844 ], [ -95.676925, 33.897237 ], [ -95.684831, 33.890232 ], [ -95.696962, 33.885218 ], [ -95.710878, 33.884552 ], [ -95.713540, 33.885124 ], [ -95.728449, 33.893704 ], [ -95.737508, 33.895967 ], [ -95.747335, 33.895756 ], [ -95.756367, 33.892625 ], [ -95.758344, 33.890611 ], [ -95.761916, 33.883402 ], [ -95.762559, 33.874367 ], [ -95.760805, 33.870911 ], [ -95.757458, 33.867957 ], [ -95.753513, 33.856464 ], [ -95.754310, 33.853992 ], [ -95.758016, 33.850080 ], [ -95.763622, 33.847954 ], [ -95.772067, 33.843817 ], [ -95.773282, 33.843834 ], [ -95.776255, 33.845145 ], [ -95.787891, 33.856336 ], [ -95.789867, 33.857686 ], [ -95.800842, 33.861212 ], [ -95.805149, 33.861304 ], [ -95.820596, 33.858465 ], [ -95.821666, 33.856633 ], [ -95.821666, 33.855443 ], [ -95.820677, 33.850751 ], [ -95.819525, 33.848439 ], [ -95.818976, 33.844456 ], [ -95.819358, 33.842785 ], [ -95.820784, 33.840564 ], [ -95.822787, 33.838756 ], [ -95.828245, 33.836054 ], [ -95.831948, 33.835161 ], [ -95.837516, 33.835640 ], [ -95.840012, 33.836486 ], [ -95.843773, 33.838949 ], [ -95.849864, 33.844952 ], [ -95.859469, 33.852456 ], [ -95.881292, 33.860627 ], [ -95.887491, 33.863856 ], [ -95.893306, 33.868161 ], [ -95.905343, 33.875629 ], [ -95.915961, 33.881148 ], [ -95.922712, 33.883758 ], [ -95.935198, 33.887101 ], [ -95.936132, 33.886826 ], [ -95.937202, 33.884652 ], [ -95.936817, 33.882386 ], [ -95.935637, 33.880371 ], [ -95.935308, 33.878724 ], [ -95.935325, 33.875099 ], [ -95.936631, 33.870615 ], [ -95.941267, 33.861619 ], [ -95.944284, 33.859811 ], [ -95.951609, 33.857017 ], [ -95.972156, 33.856371 ], [ -95.980966, 33.859307 ], [ -95.984254, 33.864403 ], [ -95.988857, 33.866869 ], [ -95.991487, 33.866869 ], [ -95.993624, 33.866211 ], [ -95.996748, 33.864403 ], [ -95.997734, 33.860951 ], [ -95.997405, 33.855526 ], [ -95.997709, 33.852182 ], [ -95.998351, 33.851049 ], [ -96.005296, 33.845505 ], [ -96.019599, 33.840566 ], [ -96.021407, 33.841881 ], [ -96.022065, 33.843196 ], [ -96.022507, 33.846130 ], [ -96.021900, 33.849114 ], [ -96.022229, 33.850923 ], [ -96.025188, 33.852073 ], [ -96.029463, 33.852402 ], [ -96.031271, 33.850758 ], [ -96.037191, 33.841245 ], [ -96.048834, 33.836468 ], [ -96.055358, 33.838262 ], [ -96.063924, 33.841523 ], [ -96.084626, 33.846656 ], [ -96.100095, 33.847971 ], [ -96.101473, 33.846709 ], [ -96.101349, 33.845721 ], [ -96.100785, 33.844230 ], [ -96.099153, 33.842409 ], [ -96.097638, 33.837935 ], [ -96.097448, 33.832725 ], [ -96.099360, 33.830470 ], [ -96.104075, 33.830730 ], [ -96.109993, 33.832396 ], [ -96.118169, 33.837884 ], [ -96.122951, 33.839964 ], [ -96.138905, 33.839159 ], [ -96.148070, 33.837799 ], [ -96.150147, 33.835856 ], [ -96.151630, 33.831946 ], [ -96.148792, 33.819197 ], [ -96.150765, 33.816987 ], [ -96.164217, 33.817001 ], [ -96.175890, 33.814627 ], [ -96.176910, 33.813934 ], [ -96.178964, 33.810553 ], [ -96.177340, 33.805117 ], [ -96.175150, 33.801951 ], [ -96.173025, 33.800560 ], [ -96.170373, 33.799382 ], [ -96.166837, 33.797908 ], [ -96.162123, 33.796140 ], [ -96.162757, 33.788769 ], [ -96.169452, 33.770131 ], [ -96.174633, 33.763699 ], [ -96.178059, 33.760518 ], [ -96.186554, 33.756375 ], [ -96.199900, 33.752117 ], [ -96.220521, 33.747390 ], [ -96.229023, 33.748021 ], [ -96.248232, 33.758986 ], [ -96.269896, 33.768405 ], [ -96.277269, 33.769735 ], [ -96.292482, 33.766419 ], [ -96.294867, 33.764771 ], [ -96.301706, 33.753756 ], [ -96.303009, 33.750878 ], [ -96.306100, 33.741002 ], [ -96.307389, 33.735005 ], [ -96.306596, 33.726786 ], [ -96.307035, 33.719987 ], [ -96.309964, 33.710489 ], [ -96.316925, 33.698997 ], [ -96.318760, 33.696753 ], [ -96.321103, 33.695100 ], [ -96.342665, 33.686975 ], [ -96.348306, 33.686379 ], [ -96.355946, 33.687155 ], [ -96.362198, 33.691818 ], [ -96.363135, 33.694215 ], [ -96.363253, 33.701050 ], [ -96.366945, 33.711222 ], [ -96.369590, 33.716809 ], [ -96.384116, 33.730141 ], [ -96.403507, 33.746289 ], [ -96.408469, 33.751192 ], [ -96.413408, 33.757714 ], [ -96.416146, 33.766099 ], [ -96.417562, 33.769038 ], [ -96.419961, 33.773034 ], [ -96.422643, 33.776041 ], [ -96.430214, 33.778654 ], [ -96.436455, 33.780050 ], [ -96.448045, 33.781031 ], [ -96.450510, 33.780588 ], [ -96.456254, 33.776035 ], [ -96.459154, 33.775232 ], [ -96.486060, 33.773010 ], [ -96.500268, 33.772583 ], [ -96.502286, 33.773460 ], [ -96.511914, 33.781478 ], [ -96.515912, 33.787795 ], [ -96.515959, 33.798934 ], [ -96.516584, 33.803168 ], [ -96.519911, 33.811347 ], [ -96.523863, 33.818114 ], [ -96.526655, 33.820891 ], [ -96.529234, 33.822127 ], [ -96.532865, 33.823005 ], [ -96.551223, 33.819129 ], [ -96.566298, 33.818511 ], [ -96.572937, 33.819098 ], [ -96.587067, 33.828009 ], [ -96.592926, 33.830916 ], [ -96.601258, 33.834327 ], [ -96.623155, 33.841483 ], [ -96.629290, 33.845488 ], [ -96.630022, 33.847541 ], [ -96.629747, 33.850866 ], [ -96.628969, 33.852407 ], [ -96.625399, 33.856542 ], [ -96.611970, 33.869016 ], [ -96.601686, 33.872823 ], [ -96.597348, 33.875101 ], [ -96.590112, 33.880665 ], [ -96.587494, 33.884251 ], [ -96.585360, 33.888948 ], [ -96.585452, 33.891281 ], [ -96.587934, 33.894784 ], [ -96.592948, 33.895616 ], [ -96.607562, 33.894735 ], [ -96.628294, 33.894477 ], [ -96.630117, 33.895422 ], [ -96.644050, 33.905962 ], [ -96.659896, 33.916666 ], [ -96.664410, 33.917267 ], [ -96.667187, 33.916940 ], [ -96.670618, 33.914914 ], [ -96.673449, 33.912278 ], [ -96.675306, 33.909114 ], [ -96.680947, 33.896204 ], [ -96.683464, 33.884217 ], [ -96.682103, 33.876645 ], [ -96.682209, 33.873876 ], [ -96.684727, 33.862905 ], [ -96.688191, 33.854613 ], [ -96.690708, 33.849959 ], [ -96.699574, 33.839049 ], [ -96.704457, 33.835021 ], [ -96.708134, 33.833060 ], [ -96.712422, 33.831633 ], [ -96.746038, 33.825699 ], [ -96.754041, 33.824658 ], [ -96.761588, 33.824406 ], [ -96.766235, 33.825458 ], [ -96.769378, 33.827477 ], [ -96.770676, 33.829621 ], [ -96.776766, 33.841976 ], [ -96.777202, 33.848162 ], [ -96.779588, 33.857939 ], [ -96.780569, 33.860098 ], [ -96.783485, 33.863534 ], [ -96.794276, 33.868886 ], [ -96.812778, 33.872646 ], [ -96.832157, 33.874835 ], [ -96.837413, 33.871349 ], [ -96.839778, 33.868396 ], [ -96.840819, 33.863645 ], [ -96.841592, 33.852894 ], [ -96.845896, 33.848975 ], [ -96.850593, 33.847211 ], [ -96.856090, 33.847490 ], [ -96.866438, 33.853149 ], [ -96.875281, 33.860505 ], [ -96.883010, 33.868019 ], [ -96.895728, 33.896414 ], [ -96.897194, 33.902954 ], [ -96.896469, 33.913318 ], [ -96.899442, 33.933728 ], [ -96.902434, 33.942018 ], [ -96.905253, 33.947219 ], [ -96.907387, 33.950025 ], [ -96.911336, 33.953960 ], [ -96.916300, 33.957798 ], [ -96.918618, 33.958926 ], [ -96.922114, 33.959579 ], [ -96.924268, 33.959159 ], [ -96.932252, 33.955688 ], [ -96.944611, 33.949217 ], [ -96.952313, 33.944582 ], [ -96.972542, 33.935795 ], [ -96.973807, 33.935697 ], [ -96.976955, 33.937453 ], [ -96.979818, 33.941588 ], [ -96.981031, 33.949160 ], [ -96.980676, 33.951814 ], [ -96.979347, 33.955130 ], [ -96.979415, 33.956178 ], [ -96.981337, 33.956378 ], [ -96.987892, 33.954671 ], [ -96.990835, 33.952701 ], [ -96.994288, 33.949206 ], [ -96.995368, 33.947302 ], [ -96.996183, 33.941728 ], [ -96.995023, 33.932035 ], [ -96.993997, 33.928979 ], [ -96.988745, 33.918468 ], [ -96.984939, 33.904866 ], [ -96.983971, 33.892083 ], [ -96.985567, 33.886522 ], [ -97.017857, 33.850142 ], [ -97.023899, 33.844213 ], [ -97.038858, 33.838264 ], [ -97.041245, 33.837761 ], [ -97.048734, 33.840935 ], [ -97.052209, 33.841737 ], [ -97.055416, 33.841202 ], [ -97.057554, 33.840133 ], [ -97.058623, 33.837728 ], [ -97.057821, 33.834520 ], [ -97.055683, 33.830779 ], [ -97.055148, 33.825701 ], [ -97.055416, 33.823830 ], [ -97.058623, 33.818752 ], [ -97.062632, 33.816079 ], [ -97.067977, 33.814476 ], [ -97.078590, 33.812756 ], [ -97.087999, 33.808747 ], [ -97.092112, 33.804097 ], [ -97.094771, 33.798532 ], [ -97.095236, 33.794136 ], [ -97.093917, 33.789052 ], [ -97.087852, 33.774099 ], [ -97.085218, 33.765512 ], [ -97.084613, 33.759993 ], [ -97.084693, 33.753147 ], [ -97.086195, 33.743933 ], [ -97.091072, 33.735115 ], [ -97.094085, 33.730992 ], [ -97.097154, 33.727809 ], [ -97.104525, 33.722608 ], [ -97.108936, 33.720294 ], [ -97.113265, 33.718804 ], [ -97.121102, 33.717174 ], [ -97.126102, 33.716941 ], [ -97.137530, 33.718664 ], [ -97.149394, 33.721967 ], [ -97.155066, 33.724442 ], [ -97.163149, 33.729322 ], [ -97.172192, 33.737545 ], [ -97.181843, 33.755870 ], [ -97.187792, 33.769702 ], [ -97.190397, 33.781153 ], [ -97.194786, 33.785344 ], [ -97.203236, 33.797343 ], [ -97.205431, 33.801488 ], [ -97.205652, 33.809824 ], [ -97.204995, 33.818870 ], [ -97.203514, 33.821825 ], [ -97.199700, 33.827322 ], [ -97.197477, 33.829795 ], [ -97.195831, 33.830803 ], [ -97.193690, 33.831307 ], [ -97.186254, 33.830894 ], [ -97.181370, 33.831375 ], [ -97.171627, 33.835335 ], [ -97.166824, 33.840395 ], [ -97.166629, 33.847311 ], [ -97.179609, 33.892250 ], [ -97.180845, 33.895204 ], [ -97.185458, 33.900700 ], [ -97.206141, 33.914280 ], [ -97.210921, 33.916064 ], [ -97.226522, 33.914642 ], [ -97.242092, 33.906277 ], [ -97.244946, 33.903092 ], [ -97.246180, 33.900344 ], [ -97.249209, 33.875101 ], [ -97.254235, 33.865323 ], [ -97.255636, 33.863698 ], [ -97.256625, 33.863286 ], [ -97.271532, 33.862560 ], [ -97.275348, 33.863225 ], [ -97.279108, 33.864555 ], [ -97.285983, 33.868526 ], [ -97.294227, 33.876412 ], [ -97.299245, 33.880175 ], [ -97.302471, 33.880175 ], [ -97.307490, 33.878204 ], [ -97.314413, 33.866989 ], [ -97.315913, 33.865838 ], [ -97.318243, 33.865121 ], [ -97.322365, 33.864941 ], [ -97.324158, 33.866017 ], [ -97.326487, 33.872648 ], [ -97.327563, 33.873903 ], [ -97.329176, 33.874440 ], [ -97.332940, 33.874440 ], [ -97.336524, 33.872827 ], [ -97.339392, 33.867630 ], [ -97.340900, 33.860236 ], [ -97.348338, 33.843876 ], [ -97.358513, 33.830018 ], [ -97.365507, 33.823763 ], [ -97.368744, 33.821471 ], [ -97.372941, 33.819454 ], [ -97.410387, 33.818845 ], [ -97.426493, 33.819398 ], [ -97.444193, 33.823773 ], [ -97.453057, 33.828536 ], [ -97.459068, 33.834581 ], [ -97.462857, 33.841772 ], [ -97.461486, 33.849560 ], [ -97.459566, 33.853316 ], [ -97.457617, 33.855126 ], [ -97.451469, 33.870930 ], [ -97.450954, 33.891398 ], [ -97.458069, 33.901635 ], [ -97.460376, 33.903948 ], [ -97.486505, 33.916994 ], [ -97.494858, 33.919258 ], [ -97.500960, 33.919643 ], [ -97.519171, 33.913638 ], [ -97.525277, 33.911751 ], [ -97.532723, 33.906577 ], [ -97.543246, 33.901289 ], [ -97.551541, 33.897947 ], [ -97.555002, 33.897282 ], [ -97.558270, 33.897099 ], [ -97.582744, 33.900785 ], [ -97.587441, 33.902479 ], [ -97.589254, 33.903922 ], [ -97.596289, 33.913769 ], [ -97.597115, 33.917868 ], [ -97.596979, 33.920228 ], [ -97.596155, 33.922106 ], [ -97.595084, 33.922954 ], [ -97.591514, 33.928200 ], [ -97.588828, 33.951882 ], [ -97.589598, 33.953554 ], [ -97.609091, 33.968093 ], [ -97.633778, 33.981257 ], [ -97.656210, 33.989488 ], [ -97.661489, 33.990818 ], [ -97.671772, 33.991370 ], [ -97.688023, 33.986607 ], [ -97.693110, 33.983699 ], [ -97.697921, 33.977331 ], [ -97.704159, 33.963336 ], [ -97.709684, 33.954997 ], [ -97.716772, 33.947666 ], [ -97.725289, 33.941045 ], [ -97.732267, 33.936691 ], [ -97.733723, 33.936392 ], [ -97.736554, 33.936575 ], [ -97.738478, 33.937421 ], [ -97.752957, 33.937049 ], [ -97.762768, 33.934396 ], [ -97.762661, 33.930846 ], [ -97.759834, 33.925210 ], [ -97.759399, 33.918820 ], [ -97.760224, 33.917194 ], [ -97.763770, 33.914241 ], [ -97.765446, 33.913532 ], [ -97.772672, 33.914382 ], [ -97.783717, 33.910560 ], [ -97.780340, 33.904833 ], [ -97.779683, 33.899243 ], [ -97.780618, 33.895533 ], [ -97.784657, 33.890632 ], [ -97.801578, 33.885138 ], [ -97.803473, 33.880190 ], [ -97.805423, 33.877167 ], [ -97.834333, 33.857671 ], [ -97.865765, 33.849393 ], [ -97.871447, 33.849001 ], [ -97.877387, 33.850236 ], [ -97.896738, 33.857985 ], [ -97.905467, 33.863531 ], [ -97.936743, 33.879204 ], [ -97.938802, 33.879891 ], [ -97.942730, 33.879845 ], [ -97.946464, 33.878883 ], [ -97.951215, 33.878424 ], [ -97.958438, 33.879179 ], [ -97.967777, 33.882430 ], [ -97.974178, 33.886643 ], [ -97.977859, 33.889929 ], [ -97.983769, 33.897200 ], [ -97.984566, 33.899077 ], [ -97.984540, 33.900703 ], [ -97.983552, 33.904002 ], [ -97.979985, 33.911402 ], [ -97.978804, 33.912548 ], [ -97.976963, 33.912549 ], [ -97.973143, 33.908014 ], [ -97.969873, 33.905999 ], [ -97.964461, 33.907398 ], [ -97.960615, 33.910354 ], [ -97.957155, 33.914454 ], [ -97.953695, 33.924373 ], [ -97.952679, 33.929482 ], [ -97.953395, 33.936445 ], [ -97.954467, 33.937774 ], [ -97.955511, 33.938186 ], [ -97.963425, 33.936237 ], [ -97.965953, 33.936191 ], [ -97.971175, 33.937129 ], [ -97.972494, 33.937907 ], [ -97.974062, 33.940289 ], [ -97.974173, 33.942832 ], [ -97.972662, 33.944527 ], [ -97.965737, 33.947392 ], [ -97.960351, 33.951928 ], [ -97.956917, 33.958502 ], [ -97.945950, 33.988396 ], [ -97.945730, 33.989839 ], [ -97.946473, 33.990732 ], [ -97.947572, 33.991053 ], [ -97.952688, 33.990114 ], [ -97.955850, 33.990136 ], [ -97.958325, 33.990846 ], [ -97.963028, 33.994235 ], [ -97.968340, 34.000530 ], [ -97.971670, 34.005434 ], [ -97.974173, 34.006716 ], [ -97.978243, 34.005387 ], [ -97.982806, 34.001949 ], [ -97.987388, 33.999823 ], [ -98.005667, 33.995964 ], [ -98.019485, 33.993804 ], [ -98.027672, 33.993357 ], [ -98.041117, 33.993456 ], [ -98.055197, 33.995841 ], [ -98.082839, 34.002412 ], [ -98.085260, 34.003259 ], [ -98.088203, 34.005481 ], [ -98.103617, 34.029207 ], [ -98.105482, 34.031307 ], [ -98.105482, 34.033861 ], [ -98.104022, 34.036233 ], [ -98.102015, 34.037327 ], [ -98.098001, 34.038240 ], [ -98.097272, 34.038969 ], [ -98.096542, 34.040976 ], [ -98.096177, 34.044625 ], [ -98.099096, 34.048639 ], [ -98.114587, 34.062280 ], [ -98.118030, 34.067065 ], [ -98.120208, 34.072127 ], [ -98.121039, 34.081266 ], [ -98.119417, 34.084474 ], [ -98.104309, 34.098200 ], [ -98.099328, 34.104295 ], [ -98.095118, 34.111190 ], [ -98.092421, 34.116917 ], [ -98.090660, 34.121980 ], [ -98.089755, 34.128211 ], [ -98.090224, 34.130181 ], [ -98.101937, 34.146830 ], [ -98.107065, 34.152531 ], [ -98.109462, 34.154111 ], [ -98.114506, 34.154727 ], [ -98.123377, 34.154540 ], [ -98.130816, 34.150532 ], [ -98.136770, 34.144992 ], [ -98.142754, 34.136359 ], [ -98.154354, 34.122734 ], [ -98.157412, 34.120467 ], [ -98.169120, 34.114171 ], [ -98.191455, 34.115753 ], [ -98.200075, 34.116783 ], [ -98.203711, 34.117676 ], [ -98.216463, 34.121821 ], [ -98.223600, 34.125093 ], [ -98.225282, 34.127245 ], [ -98.241013, 34.133103 ], [ -98.247954, 34.130717 ], [ -98.256467, 34.129481 ], [ -98.280321, 34.130750 ], [ -98.293901, 34.133020 ], [ -98.300209, 34.134579 ], [ -98.318750, 34.146421 ], [ -98.322580, 34.149720 ], [ -98.325445, 34.151025 ], [ -98.364023, 34.157109 ], [ -98.367494, 34.156191 ], [ -98.381238, 34.149454 ], [ -98.384381, 34.146317 ], [ -98.398441, 34.128456 ], [ -98.400967, 34.122236 ], [ -98.400494, 34.121778 ], [ -98.398160, 34.121396 ], [ -98.398389, 34.104566 ], [ -98.399777, 34.099973 ], [ -98.414426, 34.085074 ], [ -98.417813, 34.083029 ], [ -98.419995, 34.082488 ], [ -98.422253, 34.083037 ], [ -98.425230, 34.084799 ], [ -98.428480, 34.085523 ], [ -98.432127, 34.085622 ], [ -98.440092, 34.084311 ], [ -98.442808, 34.083144 ], [ -98.443724, 34.082152 ], [ -98.445585, 34.079298 ], [ -98.445784, 34.076827 ], [ -98.446379, 34.075430 ], [ -98.449034, 34.073462 ], [ -98.475066, 34.064269 ], [ -98.482040, 34.062270 ], [ -98.486328, 34.062598 ], [ -98.504182, 34.072371 ], [ -98.528200, 34.094961 ], [ -98.530611, 34.099843 ], [ -98.536257, 34.107343 ], [ -98.550917, 34.119334 ], [ -98.558593, 34.128254 ], [ -98.560191, 34.133202 ], [ -98.572451, 34.145091 ], [ -98.577136, 34.148962 ], [ -98.599789, 34.160571 ], [ -98.603978, 34.160249 ], [ -98.608853, 34.157521 ], [ -98.611829, 34.156558 ], [ -98.616733, 34.156418 ], [ -98.621666, 34.157195 ], [ -98.635730, 34.161618 ], [ -98.643223, 34.164531 ], [ -98.648073, 34.164441 ], [ -98.650583, 34.163113 ], [ -98.655655, 34.158258 ], [ -98.690072, 34.133155 ], [ -98.696518, 34.133521 ], [ -98.716104, 34.135947 ], [ -98.717537, 34.136450 ], [ -98.734287, 34.135758 ], [ -98.735471, 34.135208 ], [ -98.736820, 34.133374 ], [ -98.737232, 34.130992 ], [ -98.739461, 34.127394 ], [ -98.741966, 34.125530 ], [ -98.749291, 34.124238 ], [ -98.757037, 34.124633 ], [ -98.759653, 34.126912 ], [ -98.759486, 34.128882 ], [ -98.760558, 34.132388 ], [ -98.761797, 34.133785 ], [ -98.765570, 34.136376 ], [ -98.792015, 34.143736 ], [ -98.806810, 34.155901 ], [ -98.812954, 34.158444 ], [ -98.831115, 34.162154 ], [ -98.855585, 34.161621 ], [ -98.857322, 34.161094 ], [ -98.857900, 34.159627 ], [ -98.858419, 34.152732 ], [ -98.860125, 34.149913 ], [ -98.862550, 34.149111 ], [ -98.868116, 34.149635 ], [ -98.873271, 34.153596 ], [ -98.874872, 34.155657 ], [ -98.874955, 34.157031 ], [ -98.872229, 34.160446 ], [ -98.871211, 34.163012 ], [ -98.871543, 34.165027 ], [ -98.872922, 34.166584 ], [ -98.909349, 34.177499 ], [ -98.918333, 34.181831 ], [ -98.920704, 34.183435 ], [ -98.923129, 34.185978 ], [ -98.927456, 34.191155 ], [ -98.928145, 34.192689 ], [ -98.940220, 34.203686 ], [ -98.950396, 34.211680 ], [ -98.952513, 34.212650 ], [ -98.958475, 34.213855 ], [ -98.960791, 34.213030 ], [ -98.962307, 34.211312 ], [ -98.962085, 34.206386 ], [ -98.962470, 34.204668 ], [ -98.966302, 34.201323 ], [ -98.969003, 34.201299 ], [ -98.974132, 34.203566 ], [ -98.976587, 34.206291 ], [ -98.978685, 34.210231 ], [ -98.981364, 34.217583 ], [ -98.987294, 34.221223 ], [ -98.990852, 34.221633 ], [ -99.000761, 34.217643 ], [ -99.003433, 34.214466 ], [ -99.002916, 34.208782 ], [ -99.005790, 34.206647 ], [ -99.013075, 34.203222 ], [ -99.036273, 34.206912 ], [ -99.037459, 34.206454 ], [ -99.039004, 34.204667 ], [ -99.040962, 34.200842 ], [ -99.043471, 34.198208 ], [ -99.048792, 34.198209 ], [ -99.058084, 34.200569 ], [ -99.058800, 34.201256 ], [ -99.059159, 34.202929 ], [ -99.060344, 34.204761 ], [ -99.066465, 34.208404 ], [ -99.075978, 34.211221 ], [ -99.079535, 34.211518 ], [ -99.092191, 34.209316 ], [ -99.108758, 34.203401 ], [ -99.119204, 34.201747 ], [ -99.126567, 34.203004 ], [ -99.129792, 34.204403 ], [ -99.131885, 34.207382 ], [ -99.131553, 34.209352 ], [ -99.130090, 34.212192 ], [ -99.127525, 34.213771 ], [ -99.126614, 34.215329 ], [ -99.127549, 34.217986 ], [ -99.128514, 34.218766 ], [ -99.130609, 34.219408 ], [ -99.138220, 34.219159 ], [ -99.143985, 34.214763 ], [ -99.159016, 34.208880 ], [ -99.189511, 34.214312 ], [ -99.192104, 34.216694 ], [ -99.192683, 34.218825 ], [ -99.192076, 34.222192 ], [ -99.190036, 34.227186 ], [ -99.190146, 34.229660 ], [ -99.191139, 34.232340 ], [ -99.195553, 34.240060 ], [ -99.197153, 34.244298 ], [ -99.196926, 34.260929 ], [ -99.194570, 34.272424 ], [ -99.195605, 34.280839 ], [ -99.196260, 34.281463 ], [ -99.200222, 34.281152 ], [ -99.203681, 34.281926 ], [ -99.207561, 34.283505 ], [ -99.209742, 34.286345 ], [ -99.211648, 34.292232 ], [ -99.213476, 34.310672 ], [ -99.211600, 34.313970 ], [ -99.209724, 34.324935 ], [ -99.210716, 34.336304 ], [ -99.213135, 34.340369 ], [ -99.217335, 34.341520 ], [ -99.219769, 34.341377 ], [ -99.221975, 34.340020 ], [ -99.226153, 34.339726 ], [ -99.229994, 34.340538 ], [ -99.232606, 34.342380 ], [ -99.233274, 34.344101 ], [ -99.234252, 34.353459 ], [ -99.237233, 34.362717 ], [ -99.242945, 34.372668 ], [ -99.248969, 34.375984 ], [ -99.251408, 34.375080 ], [ -99.254722, 34.372405 ], [ -99.258696, 34.372634 ], [ -99.271281, 34.381604 ], [ -99.274926, 34.384904 ], [ -99.275340, 34.386599 ], [ -99.273958, 34.387560 ], [ -99.264508, 34.388085 ], [ -99.261191, 34.389548 ], [ -99.258980, 34.391243 ], [ -99.261321, 34.403499 ], [ -99.264167, 34.405149 ], [ -99.289922, 34.414731 ], [ -99.294648, 34.415373 ], [ -99.299098, 34.414228 ], [ -99.308274, 34.410014 ], [ -99.316373, 34.408205 ], [ -99.318363, 34.408296 ], [ -99.319606, 34.408869 ], [ -99.324222, 34.414458 ], [ -99.328674, 34.422383 ], [ -99.334037, 34.427536 ], [ -99.341337, 34.431061 ], [ -99.350407, 34.437083 ], [ -99.356713, 34.442144 ], [ -99.357102, 34.444915 ], [ -99.356771, 34.446542 ], [ -99.354837, 34.449658 ], [ -99.354672, 34.451857 ], [ -99.358795, 34.455863 ], [ -99.369610, 34.458699 ], [ -99.375365, 34.458845 ], [ -99.381011, 34.456936 ], [ -99.394956, 34.442099 ], [ -99.397010, 34.424003 ], [ -99.396902, 34.418688 ], [ -99.396488, 34.417291 ], [ -99.393919, 34.415274 ], [ -99.391492, 34.405631 ], [ -99.397253, 34.377871 ], [ -99.399603, 34.375079 ], [ -99.402960, 34.373481 ], [ -99.407168, 34.372605 ], [ -99.408848, 34.372776 ], [ -99.420432, 34.380464 ], [ -99.430995, 34.373414 ], [ -99.440760, 34.374123 ], [ -99.445021, 34.379892 ], [ -99.452648, 34.388252 ], [ -99.470969, 34.396471 ], [ -99.477547, 34.396355 ], [ -99.487219, 34.397955 ], [ -99.490426, 34.399694 ], [ -99.494104, 34.404755 ], [ -99.497091, 34.407731 ], [ -99.499875, 34.409608 ], [ -99.514280, 34.414035 ], [ -99.517624, 34.414494 ], [ -99.523650, 34.412206 ], [ -99.529786, 34.411452 ], [ -99.549242, 34.412715 ], [ -99.555986, 34.414640 ], [ -99.562204, 34.417319 ], [ -99.569696, 34.418418 ], [ -99.574367, 34.418281 ], [ -99.580060, 34.416653 ], [ -99.584480, 34.407673 ], [ -99.585306, 34.398122 ], [ -99.584531, 34.391205 ], [ -99.585442, 34.388914 ], [ -99.587596, 34.385867 ], [ -99.596323, 34.377137 ], [ -99.600026, 34.374688 ], [ -99.624197, 34.373577 ], [ -99.630905, 34.376007 ], [ -99.649662, 34.379885 ], [ -99.654194, 34.376519 ], [ -99.659362, 34.374390 ], [ -99.662705, 34.373680 ], [ -99.665992, 34.374185 ], [ -99.671377, 34.377714 ], [ -99.678283, 34.379799 ], [ -99.696462, 34.381036 ], [ -99.707901, 34.387539 ], [ -99.712682, 34.390928 ], [ -99.714838, 34.394524 ], [ -99.714232, 34.397822 ], [ -99.715089, 34.400754 ], [ -99.716416, 34.402815 ], [ -99.720259, 34.406295 ], [ -99.730348, 34.411240 ], [ -99.740907, 34.414763 ], [ -99.754248, 34.421289 ], [ -99.767234, 34.430502 ], [ -99.767648, 34.431854 ], [ -99.764882, 34.435266 ], [ -99.764826, 34.436434 ], [ -99.765599, 34.437488 ], [ -99.775743, 34.444225 ], [ -99.782986, 34.444364 ], [ -99.793684, 34.453894 ], [ -99.814313, 34.476204 ], [ -99.818739, 34.484976 ], [ -99.818186, 34.487840 ], [ -99.825325, 34.497596 ], [ -99.832904, 34.500068 ], [ -99.853066, 34.511593 ], [ -99.868953, 34.527615 ], [ -99.872357, 34.532096 ], [ -99.873254, 34.535351 ], [ -99.874403, 34.537095 ], [ -99.887147, 34.549047 ], [ -99.893760, 34.554219 ], [ -99.896007, 34.555530 ], [ -99.898943, 34.555804 ], [ -99.915771, 34.565975 ], [ -99.921801, 34.570253 ], [ -99.923211, 34.574552 ], [ -99.929334, 34.576714 ], [ -99.945720, 34.579273 ], [ -99.954567, 34.578195 ], [ -99.956717, 34.576524 ], [ -99.957553, 34.574169 ], [ -99.957541, 34.572709 ], [ -99.958898, 34.571271 ], [ -99.965608, 34.565844 ], [ -99.971555, 34.562179 ], [ -99.974762, 34.561318 ], [ -99.985833, 34.560079 ], [ -100.000381, 34.560509 ], [ -100.000381, 34.746461 ], [ -100.000385, 35.182702 ], [ -100.000392, 35.619115 ], [ -100.000399, 36.055677 ], [ -100.000406, 36.499702 ], [ -100.090021, 36.499634 ], [ -100.181221, 36.499633 ], [ -100.310643, 36.499642 ], [ -100.311018, 36.499688 ], [ -100.311245, 36.499631 ], [ -100.324150, 36.499679 ], [ -100.334441, 36.499440 ], [ -100.334464, 36.499420 ], [ -100.351842, 36.499473 ], [ -100.351852, 36.499487 ], [ -100.378592, 36.499445 ], [ -100.378634, 36.499517 ], [ -100.413550, 36.499469 ], [ -100.413634, 36.499444 ], [ -100.421301, 36.499488 ], [ -100.421328, 36.499447 ], [ -100.433959, 36.499456 ], [ -100.441064, 36.499462 ], [ -100.441065, 36.499490 ], [ -100.522227, 36.499291 ], [ -100.530314, 36.499357 ], [ -100.530478, 36.499240 ], [ -100.531215, 36.499290 ], [ -100.531215, 36.499341 ], [ -100.546145, 36.499343 ], [ -100.578114, 36.499439 ], [ -100.578114, 36.499463 ], [ -100.583379, 36.499443 ], [ -100.583539, 36.499483 ], [ -100.592551, 36.499429 ], [ -100.592556, 36.499469 ], [ -100.592614, 36.499469 ], [ -100.648344, 36.499463 ], [ -100.648343, 36.499495 ], [ -100.657763, 36.499500 ], [ -100.657763, 36.499483 ], [ -100.708628, 36.499521 ], [ -100.708626, 36.499553 ], [ -100.724361, 36.499558 ], [ -100.724362, 36.499580 ], [ -100.761811, 36.499580 ], [ -100.761811, 36.499618 ], [ -100.802886, 36.499621 ], [ -100.802909, 36.499621 ], [ -100.806172, 36.499634 ], [ -100.806190, 36.499674 ], [ -100.824218, 36.499618 ], [ -100.824236, 36.499618 ], [ -100.850840, 36.499700 ], [ -100.859657, 36.499687 ], [ -100.884080, 36.499682 ], [ -100.884174, 36.499682 ], [ -100.918513, 36.499621 ], [ -100.936058, 36.499602 ], [ -100.977088, 36.499595 ], [ -101.045331, 36.499540 ], [ -101.052418, 36.499563 ], [ -101.085156, 36.499244 ], [ -101.623915, 36.499528 ], [ -101.649966, 36.499573 ], [ -101.653708, 36.499573 ], [ -101.698685, 36.499508 ], [ -101.709314, 36.499722 ], [ -101.779435, 36.499734 ], [ -101.780610, 36.499727 ], [ -101.781987, 36.499718 ], [ -101.783359, 36.499709 ], [ -101.788110, 36.499678 ], [ -101.826498, 36.499535 ], [ -101.826565, 36.499654 ], [ -101.930245, 36.500526 ], [ -102.122066, 36.500684 ], [ -102.125450, 36.500324 ], [ -102.162463, 36.500326 ], [ -102.244990, 36.500704 ], [ -102.250453, 36.500369 ], [ -103.002434, 36.500397 ], [ -103.002565, 36.526588 ], [ -103.002188, 36.602716 ], [ -103.002252, 36.617180 ], [ -103.002518, 36.675186 ], [ -103.002198, 36.719427 ], [ -103.001964, 36.909573 ], [ -103.002247, 36.911587 ], [ -103.002199, 37.000104 ], [ -102.986976, 36.998524 ], [ -102.985807, 36.998571 ], [ -102.979613, 36.998549 ], [ -102.841989, 36.999598 ], [ -102.814616, 37.000783 ], [ -102.806762, 37.000019 ], [ -102.778569, 36.999242 ], [ -102.759860, 37.000019 ], [ -102.742060, 36.997689 ], [ -102.698142, 36.995149 ], [ -102.355367, 36.994575 ], [ -102.355288, 36.994506 ], [ -102.260789, 36.994388 ], [ -102.208316, 36.993730 ], [ -102.184271, 36.993593 ], [ -102.054503, 36.993109 ], [ -102.042240, 36.993083 ], [ -102.028207, 36.993125 ], [ -102.000447, 36.993272 ], [ -102.000447, 36.993249 ], [ -101.902440, 36.993702 ], [ -101.601593, 36.995095 ], [ -101.600396, 36.995153 ], [ -101.555239, 36.995414 ], [ -101.519066, 36.995546 ], [ -101.485326, 36.995611 ], [ -101.415005, 36.995966 ], [ -101.413868, 36.996008 ], [ -101.378180, 36.996164 ], [ -101.359674, 36.996232 ], [ -101.357797, 36.996271 ], [ -101.212909, 36.997044 ], [ -101.211486, 36.997124 ], [ -101.066742, 36.997921 ], [ -101.053589, 36.997967 ], [ -101.012641, 36.998176 ], [ -100.996502, 36.998044 ], [ -100.945566, 36.998152 ], [ -100.904588, 36.998561 ], [ -100.904274, 36.998745 ], [ -100.891660, 36.998604 ], [ -100.855634, 36.998626 ], [ -100.814277, 36.999085 ], [ -100.806116, 36.999091 ], [ -100.765484, 36.999177 ], [ -100.756894, 36.999357 ], [ -100.734517, 36.999059 ], [ -100.675552, 36.999688 ], [ -100.633327, 36.999936 ], [ -100.629770, 37.000025 ], [ -100.591413, 37.000399 ], [ -100.591328, 37.000376 ], [ -100.552683, 37.000735 ], [ -100.551598, 37.000620 ], [ -100.201676, 37.002081 ], [ -100.193754, 37.002133 ], [ -100.192371, 37.002036 ], [ -100.187547, 37.002082 ], [ -100.115722, 37.002206 ], [ -100.005706, 37.001726 ], [ -100.002563, 37.001706 ], [ -100.001286, 37.001699 ], [ -99.995201, 37.001631 ], [ -99.875409, 37.001659 ], [ -99.786016, 37.000931 ], [ -99.774816, 37.000841 ], [ -99.774255, 37.000837 ], [ -99.657658, 37.000197 ], [ -99.648652, 36.999604 ], [ -99.625399, 36.999671 ], [ -99.558068, 36.999528 ], [ -99.508574, 36.999658 ], [ -99.504093, 36.999648 ], [ -99.502665, 36.999645 ], [ -99.500395, 36.999637 ], [ -99.500395, 36.999576 ], [ -99.484333, 36.999626 ], [ -99.456203, 36.999471 ], [ -99.407015, 36.999579 ], [ -99.375391, 37.000177 ], [ -99.277506, 36.999579 ], [ -99.248120, 36.999565 ], [ -99.129449, 36.999422 ], [ -99.124883, 36.999420 ], [ -99.049695, 36.999221 ], [ -99.029337, 36.999595 ], [ -98.994371, 36.999493 ], [ -98.880580, 36.999309 ], [ -98.880009, 36.999263 ], [ -98.869449, 36.999286 ], [ -98.797452, 36.999229 ], [ -98.793711, 36.999227 ], [ -98.791936, 36.999255 ], [ -98.761597, 36.999425 ], [ -98.718465, 36.999180 ], [ -98.714512, 36.999060 ], [ -98.544872, 36.998997 ], [ -98.420209, 36.998516 ], [ -98.418268, 36.998538 ], [ -98.408991, 36.998513 ], [ -98.354073, 36.997961 ], [ -98.346188, 36.997962 ], [ -98.237712, 36.997972 ], [ -98.219499, 36.997824 ], [ -98.208218, 36.997997 ], [ -98.177596, 36.998009 ], [ -98.147452, 36.998162 ], [ -98.111985, 36.998133 ], [ -98.045342, 36.998327 ], [ -98.039890, 36.998349 ], [ -98.033955, 36.998366 ], [ -97.802298, 36.998713 ], [ -97.783489, 36.998847 ], [ -97.783432, 36.998961 ], [ -97.768704, 36.998750 ], [ -97.697104, 36.998826 ], [ -97.650466, 36.999004 ], [ -97.637137, 36.999090 ], [ -97.606549, 36.998682 ], [ -97.564536, 36.998711 ], [ -97.546498, 36.998747 ], [ -97.545900, 36.998709 ], [ -97.527292, 36.998750 ], [ -97.472861, 36.998721 ], [ -97.462280, 36.998685 ], [ -97.384925, 36.998843 ], [ -97.372421, 36.998861 ], [ -97.147721, 36.999111 ], [ -97.122597, 36.999036 ], [ -97.120285, 36.999014 ], [ -97.104276, 36.999020 ], [ -97.100652, 36.998998 ], [ -97.039784, 36.999000 ], [ -97.030082, 36.998929 ], [ -96.975562, 36.999019 ], [ -96.967371, 36.999067 ], [ -96.934642, 36.999070 ], [ -96.921915, 36.999151 ], [ -96.917093, 36.999182 ], [ -96.903510, 36.999132 ], [ -96.902083, 36.999155 ], [ -96.876290, 36.999233 ], [ -96.867517, 36.999217 ], [ -96.822791, 36.999182 ], [ -96.795199, 36.998860 ], [ -96.792060, 36.999180 ], [ -96.749838, 36.998988 ], [ -96.741270, 36.999239 ], [ -96.736590, 36.999286 ], [ -96.710482, 36.999271 ], [ -96.705431, 36.999203 ], [ -96.500288, 36.998643 ], [ -96.415412, 36.999113 ], [ -96.394272, 36.999221 ], [ -96.279079, 36.999272 ], [ -96.276368, 36.999271 ], [ -96.217571, 36.999070 ], [ -96.200028, 36.999028 ], [ -96.184768, 36.999211 ], [ -96.154017, 36.999161 ], [ -96.152384, 36.999051 ], [ -96.149709, 36.999040 ], [ -96.147143, 36.999022 ], [ -96.143207, 36.999134 ], [ -96.141210, 36.998973 ], [ -96.000810, 36.998860 ], [ -95.936992, 36.999268 ], [ -95.928122, 36.999245 ], [ -95.910180, 36.999336 ], [ -95.877151, 36.999304 ], [ -95.875257, 36.999302 ], [ -95.873944, 36.999300 ], [ -95.866899, 36.999261 ], [ -95.807980, 36.999124 ], [ -95.786762, 36.999310 ], [ -95.768719, 36.999205 ], [ -95.759905, 36.999271 ], [ -95.741908, 36.999244 ], [ -95.718054, 36.999255 ], [ -95.714887, 36.999279 ], [ -95.710380, 36.999371 ], [ -95.696659, 36.999215 ], [ -95.686452, 36.999349 ], [ -95.664301, 36.999322 ], [ -95.630079, 36.999320 ], [ -95.624350, 36.999360 ], [ -95.615934, 36.999365 ], [ -95.612140, 36.999321 ], [ -95.573598, 36.999310 ], [ -95.534401, 36.999332 ], [ -95.511578, 36.999235 ], [ -95.407683, 36.999241 ], [ -95.331210, 36.999380 ], [ -95.328327, 36.999366 ], [ -95.328058, 36.999365 ], [ -95.322565, 36.999358 ], [ -95.195307, 36.999565 ], [ -95.177301, 36.999520 ], [ -95.155372, 36.999540 ], [ -95.155187, 36.999539 ], [ -95.073509, 36.999509 ], [ -95.049499, 36.999580 ], [ -95.037857, 36.999497 ], [ -95.030324, 36.999517 ], [ -95.011433, 36.999535 ], [ -95.007620, 36.999514 ], [ -94.995293, 36.999529 ], [ -94.853197, 36.998874 ], [ -94.849801, 36.998876 ], [ -94.840926, 36.998833 ], [ -94.831280, 36.998812 ], [ -94.777257, 36.998764 ], [ -94.739324, 36.998687 ], [ -94.737183, 36.998665 ], [ -94.712770, 36.998794 ], [ -94.701797, 36.998814 ], [ -94.699735, 36.998805 ], [ -94.625224, 36.998672 ], [ -94.618080, 36.998135 ], [ -94.618049, 36.996208 ], [ -94.618031, 36.994704 ], [ -94.618026, 36.950158 ], [ -94.618109, 36.946564 ], [ -94.618166, 36.937584 ], [ -94.618295, 36.929647 ], [ -94.618207, 36.926236 ], [ -94.618282, 36.911472 ], [ -94.618243, 36.897027 ], [ -94.618658, 36.880064 ], [ -94.618380, 36.847320 ], [ -94.618307, 36.766560 ], [ -94.618130, 36.701423 ], [ -94.618025, 36.669430 ], [ -94.617815, 36.612604 ], [ -94.617865, 36.606851 ], [ -94.617853, 36.599120 ], [ -94.617814, 36.577732 ], [ -94.617897, 36.536983 ], [ -94.617868, 36.536090 ], [ -94.617997, 36.534280 ], [ -94.617883, 36.517799 ], [ -94.617877, 36.514999 ], [ -94.617919, 36.499414 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US41", "STATE": "41", "NAME": "Oregon", "LSAD": "", "CENSUSAREA": 95988.013000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -117.220069, 44.301382 ], [ -117.222451, 44.298963 ], [ -117.222647, 44.297578 ], [ -117.216974, 44.288357 ], [ -117.198147, 44.273828 ], [ -117.193129, 44.270963 ], [ -117.170342, 44.258890 ], [ -117.157060, 44.257490 ], [ -117.143394, 44.258262 ], [ -117.138523, 44.259370 ], [ -117.133984, 44.262972 ], [ -117.133104, 44.264236 ], [ -117.132530, 44.267045 ], [ -117.130904, 44.269453 ], [ -117.121037, 44.277585 ], [ -117.118018, 44.278945 ], [ -117.111617, 44.280667 ], [ -117.107673, 44.280763 ], [ -117.104208, 44.279940 ], [ -117.102242, 44.278799 ], [ -117.098531, 44.275533 ], [ -117.094570, 44.270978 ], [ -117.093578, 44.269383 ], [ -117.090933, 44.260311 ], [ -117.089503, 44.258234 ], [ -117.078350, 44.249885 ], [ -117.067284, 44.244010 ], [ -117.059352, 44.237244 ], [ -117.056510, 44.230874 ], [ -117.053030, 44.229076 ], [ -117.050057, 44.228830 ], [ -117.047062, 44.229742 ], [ -117.045513, 44.232005 ], [ -117.042283, 44.242775 ], [ -117.035850, 44.246805 ], [ -117.031862, 44.248635 ], [ -117.027558, 44.248881 ], [ -117.025277, 44.248505 ], [ -117.020231, 44.246063 ], [ -117.016921, 44.245391 ], [ -117.001000, 44.245386 ], [ -116.986870, 44.245477 ], [ -116.975905, 44.242844 ], [ -116.973542, 44.239980 ], [ -116.971958, 44.235677 ], [ -116.973945, 44.225932 ], [ -116.973701, 44.208017 ], [ -116.971675, 44.197256 ], [ -116.967259, 44.194581 ], [ -116.965498, 44.194126 ], [ -116.947591, 44.191264 ], [ -116.945256, 44.191677 ], [ -116.940534, 44.193710 ], [ -116.935443, 44.193962 ], [ -116.925392, 44.191544 ], [ -116.902752, 44.179467 ], [ -116.900103, 44.176851 ], [ -116.895757, 44.171267 ], [ -116.894083, 44.160191 ], [ -116.894309, 44.158114 ], [ -116.895931, 44.154295 ], [ -116.927688, 44.109438 ], [ -116.928306, 44.107326 ], [ -116.933704, 44.100039 ], [ -116.937835, 44.096943 ], [ -116.943132, 44.094060 ], [ -116.957009, 44.091743 ], [ -116.967203, 44.090936 ], [ -116.974253, 44.088295 ], [ -116.977351, 44.085364 ], [ -116.974016, 44.053663 ], [ -116.973185, 44.049425 ], [ -116.972504, 44.048771 ], [ -116.956246, 44.042888 ], [ -116.943361, 44.035645 ], [ -116.937342, 44.029376 ], [ -116.934727, 44.023806 ], [ -116.934485, 44.021249 ], [ -116.936765, 44.010608 ], [ -116.942346, 43.989106 ], [ -116.942944, 43.987512 ], [ -116.957527, 43.972443 ], [ -116.966314, 43.968884 ], [ -116.969842, 43.967588 ], [ -116.971436, 43.964998 ], [ -116.971835, 43.962806 ], [ -116.971237, 43.960216 ], [ -116.970241, 43.958622 ], [ -116.969245, 43.957426 ], [ -116.966256, 43.955832 ], [ -116.963666, 43.952644 ], [ -116.962470, 43.928336 ], [ -116.963666, 43.921363 ], [ -116.966256, 43.918573 ], [ -116.977332, 43.905812 ], [ -116.976429, 43.901293 ], [ -116.976024, 43.895548 ], [ -116.982347, 43.868840 ], [ -116.982940, 43.867710 ], [ -116.989598, 43.864301 ], [ -116.991415, 43.863864 ], [ -116.997391, 43.864874 ], [ -116.999061, 43.864637 ], [ -117.010770, 43.862269 ], [ -117.013954, 43.859358 ], [ -117.026143, 43.834480 ], [ -117.026871, 43.832479 ], [ -117.026780, 43.829841 ], [ -117.026634, 43.808104 ], [ -117.026651, 43.733935 ], [ -117.026841, 43.732905 ], [ -117.026725, 43.714815 ], [ -117.026825, 43.706193 ], [ -117.026586, 43.683001 ], [ -117.026717, 43.675523 ], [ -117.026661, 43.664385 ], [ -117.026705, 43.631659 ], [ -117.026905, 43.624880 ], [ -117.027001, 43.621032 ], [ -117.026937, 43.617614 ], [ -117.026789, 43.610669 ], [ -117.026760, 43.601912 ], [ -117.026824, 43.600357 ], [ -117.026889, 43.596033 ], [ -117.026922, 43.593632 ], [ -117.026774, 43.578674 ], [ -117.026746, 43.577526 ], [ -117.026652, 43.025128 ], [ -117.026683, 43.024876 ], [ -117.026253, 42.807447 ], [ -117.026303, 42.807170 ], [ -117.026331, 42.807015 ], [ -117.026665, 42.624878 ], [ -117.026551, 42.378557 ], [ -117.026129, 42.357193 ], [ -117.026195, 42.166404 ], [ -117.026590, 42.133258 ], [ -117.026098, 42.117647 ], [ -117.026222, 42.000252 ], [ -117.040906, 41.999890 ], [ -117.048910, 41.998983 ], [ -117.055402, 41.999890 ], [ -117.068613, 42.000035 ], [ -117.197798, 42.000380 ], [ -117.217551, 41.999887 ], [ -117.403613, 41.999290 ], [ -117.443062, 41.999659 ], [ -117.623731, 41.998467 ], [ -117.625973, 41.998102 ], [ -117.873467, 41.998335 ], [ -118.197189, 41.996995 ], [ -118.501002, 41.995446 ], [ -118.601806, 41.993895 ], [ -118.696409, 41.991794 ], [ -118.775869, 41.992692 ], [ -118.777228, 41.992671 ], [ -118.795612, 41.992394 ], [ -119.001022, 41.993793 ], [ -119.208280, 41.993177 ], [ -119.231876, 41.994212 ], [ -119.251033, 41.993843 ], [ -119.360177, 41.994384 ], [ -119.444598, 41.995478 ], [ -119.725730, 41.996296 ], [ -119.790087, 41.997544 ], [ -119.848907, 41.997281 ], [ -119.872929, 41.997641 ], [ -119.876054, 41.997199 ], [ -119.986678, 41.995842 ], [ -119.999168, 41.994540 ], [ -120.001058, 41.995139 ], [ -120.181563, 41.994588 ], [ -120.286424, 41.993058 ], [ -120.326005, 41.993122 ], [ -120.501069, 41.993785 ], [ -120.647173, 41.993084 ], [ -120.692219, 41.993677 ], [ -120.693941, 41.993676 ], [ -120.812279, 41.994183 ], [ -120.879481, 41.993781 ], [ -121.035195, 41.993323 ], [ -121.094926, 41.994658 ], [ -121.126093, 41.996010 ], [ -121.247616, 41.997054 ], [ -121.251099, 41.997570 ], [ -121.309981, 41.997612 ], [ -121.334385, 41.996655 ], [ -121.335734, 41.996518 ], [ -121.340517, 41.996220 ], [ -121.360253, 41.996680 ], [ -121.376101, 41.997026 ], [ -121.434977, 41.997022 ], [ -121.439610, 41.997080 ], [ -121.520250, 41.997983 ], [ -121.580865, 41.998668 ], [ -121.675348, 42.000351 ], [ -121.689159, 42.000584 ], [ -121.705045, 42.000766 ], [ -121.708199, 42.000815 ], [ -121.846712, 42.003070 ], [ -122.000319, 42.003967 ], [ -122.101922, 42.005766 ], [ -122.155408, 42.007429 ], [ -122.156666, 42.007384 ], [ -122.160438, 42.007637 ], [ -122.161328, 42.007637 ], [ -122.261127, 42.007364 ], [ -122.289527, 42.007764 ], [ -122.378193, 42.009518 ], [ -122.397984, 42.008758 ], [ -122.501135, 42.008460 ], [ -122.634739, 42.004858 ], [ -122.712942, 42.004157 ], [ -122.800080, 42.004071 ], [ -122.876148, 42.003247 ], [ -122.893961, 42.002605 ], [ -122.941597, 42.003085 ], [ -123.045254, 42.003049 ], [ -123.065655, 42.004948 ], [ -123.083956, 42.005448 ], [ -123.145959, 42.009247 ], [ -123.154908, 42.008036 ], [ -123.192361, 42.005446 ], [ -123.230762, 42.003845 ], [ -123.347562, 41.999108 ], [ -123.381776, 41.999268 ], [ -123.434770, 42.001641 ], [ -123.498830, 42.000525 ], [ -123.498896, 42.000474 ], [ -123.501997, 42.000527 ], [ -123.525245, 42.001047 ], [ -123.552560, 42.000246 ], [ -123.624554, 41.999837 ], [ -123.656998, 41.995137 ], [ -123.728156, 41.997007 ], [ -123.789295, 41.996111 ], [ -123.813992, 41.995096 ], [ -123.821472, 41.995473 ], [ -123.834208, 41.996116 ], [ -124.001188, 41.996146 ], [ -124.086661, 41.996869 ], [ -124.087827, 41.996891 ], [ -124.100216, 41.996842 ], [ -124.100921, 41.996956 ], [ -124.126194, 41.996992 ], [ -124.211605, 41.998460 ], [ -124.214213, 42.005939 ], [ -124.270464, 42.045553 ], [ -124.287374, 42.046016 ], [ -124.299649, 42.051736 ], [ -124.314289, 42.067864 ], [ -124.341010, 42.092929 ], [ -124.356229, 42.114952 ], [ -124.357122, 42.118016 ], [ -124.351535, 42.129796 ], [ -124.351784, 42.134965 ], [ -124.355696, 42.141964 ], [ -124.361563, 42.143767 ], [ -124.366028, 42.152343 ], [ -124.366832, 42.158450 ], [ -124.363389, 42.158588 ], [ -124.360318, 42.162272 ], [ -124.361009, 42.180752 ], [ -124.367751, 42.188321 ], [ -124.373175, 42.190218 ], [ -124.374949, 42.193129 ], [ -124.376215, 42.196381 ], [ -124.375553, 42.208820 ], [ -124.377762, 42.218809 ], [ -124.383633, 42.227160 ], [ -124.410982, 42.250547 ], [ -124.411534, 42.254115 ], [ -124.408514, 42.260588 ], [ -124.405148, 42.278107 ], [ -124.410556, 42.307431 ], [ -124.420557, 42.320412 ], [ -124.425264, 42.322026 ], [ -124.427782, 42.318857 ], [ -124.433063, 42.323976 ], [ -124.431438, 42.329094 ], [ -124.429287, 42.331746 ], [ -124.429288, 42.331746 ], [ -124.427222, 42.334880 ], [ -124.425554, 42.351874 ], [ -124.424066, 42.377242 ], [ -124.424863, 42.395426 ], [ -124.428068, 42.420333 ], [ -124.434882, 42.434916 ], [ -124.435105, 42.440163 ], [ -124.422038, 42.461226 ], [ -124.423084, 42.478952 ], [ -124.421381, 42.491737 ], [ -124.399065, 42.539928 ], [ -124.390664, 42.566593 ], [ -124.389977, 42.574758 ], [ -124.400918, 42.597518 ], [ -124.399421, 42.618079 ], [ -124.401177, 42.627192 ], [ -124.413119, 42.657934 ], [ -124.416774, 42.661594 ], [ -124.450740, 42.675798 ], [ -124.451484, 42.677787 ], [ -124.447487, 42.684740 ], [ -124.448418, 42.689909 ], [ -124.473864, 42.732671 ], [ -124.491679, 42.741789 ], [ -124.498473, 42.741077 ], [ -124.499122, 42.738606 ], [ -124.510017, 42.734746 ], [ -124.513368, 42.735068 ], [ -124.514669, 42.736806 ], [ -124.516236, 42.753632 ], [ -124.524439, 42.789793 ], [ -124.536073, 42.814175 ], [ -124.544179, 42.822958 ], [ -124.565973, 42.835454 ], [ -124.564569, 42.839315 ], [ -124.552441, 42.840568 ], [ -124.500141, 42.917502 ], [ -124.480938, 42.951495 ], [ -124.462619, 42.991430 ], [ -124.456918, 43.000315 ], [ -124.436198, 43.071312 ], [ -124.432236, 43.097383 ], [ -124.434451, 43.115986 ], [ -124.424113, 43.126859 ], [ -124.401726, 43.184896 ], [ -124.395302, 43.211101 ], [ -124.395607, 43.223908 ], [ -124.382460, 43.270167 ], [ -124.388891, 43.290523 ], [ -124.393988, 43.299260 ], [ -124.400404, 43.302121 ], [ -124.402814, 43.305872 ], [ -124.387642, 43.325968 ], [ -124.373037, 43.338953 ], [ -124.353332, 43.342667 ], [ -124.341587, 43.351337 ], [ -124.315012, 43.388389 ], [ -124.286896, 43.436296 ], [ -124.255609, 43.502172 ], [ -124.233534, 43.557130 ], [ -124.203028, 43.667825 ], [ -124.204888, 43.673976 ], [ -124.198275, 43.689481 ], [ -124.193455, 43.706085 ], [ -124.168392, 43.808903 ], [ -124.150267, 43.910850 ], [ -124.142704, 43.958182 ], [ -124.133547, 44.035845 ], [ -124.122406, 44.104442 ], [ -124.125824, 44.126130 ], [ -124.117006, 44.171913 ], [ -124.114424, 44.198164 ], [ -124.115671, 44.206554 ], [ -124.111054, 44.235071 ], [ -124.108945, 44.265475 ], [ -124.109744, 44.270597 ], [ -124.114869, 44.272721 ], [ -124.115953, 44.274641 ], [ -124.115200, 44.286486 ], [ -124.109070, 44.303707 ], [ -124.108088, 44.309926 ], [ -124.109556, 44.314545 ], [ -124.100587, 44.331926 ], [ -124.092101, 44.370388 ], [ -124.084401, 44.415611 ], [ -124.080989, 44.419728 ], [ -124.071706, 44.423662 ], [ -124.067569, 44.428582 ], [ -124.073941, 44.434481 ], [ -124.079301, 44.430863 ], [ -124.082113, 44.441518 ], [ -124.082061, 44.478171 ], [ -124.084429, 44.486927 ], [ -124.083601, 44.501123 ], [ -124.076387, 44.531214 ], [ -124.067251, 44.608040 ], [ -124.069140, 44.612979 ], [ -124.082326, 44.608861 ], [ -124.084476, 44.611056 ], [ -124.065202, 44.622445 ], [ -124.065008, 44.632504 ], [ -124.058281, 44.658866 ], [ -124.060043, 44.669361 ], [ -124.070394, 44.683514 ], [ -124.063406, 44.703177 ], [ -124.059077, 44.737656 ], [ -124.066325, 44.762671 ], [ -124.075473, 44.771403 ], [ -124.074066, 44.798107 ], [ -124.066746, 44.831191 ], [ -124.063155, 44.835333 ], [ -124.054151, 44.838233 ], [ -124.048814, 44.850007 ], [ -124.032296, 44.900809 ], [ -124.025136, 44.928175 ], [ -124.025678, 44.936542 ], [ -124.023834, 44.949825 ], [ -124.015243, 44.982904 ], [ -124.004386, 45.046197 ], [ -124.004668, 45.048167 ], [ -124.009770, 45.047266 ], [ -124.017991, 45.049808 ], [ -124.015851, 45.064759 ], [ -124.012163, 45.076921 ], [ -124.006057, 45.084736 ], [ -124.004863, 45.084232 ], [ -123.989529, 45.094045 ], [ -123.975425, 45.145476 ], [ -123.968187, 45.201217 ], [ -123.972919, 45.216784 ], [ -123.962887, 45.280218 ], [ -123.964169, 45.317026 ], [ -123.972899, 45.336890 ], [ -123.978671, 45.338854 ], [ -124.007756, 45.336813 ], [ -124.007494, 45.339740 ], [ -123.979715, 45.347724 ], [ -123.973398, 45.354791 ], [ -123.965728, 45.386242 ], [ -123.960557, 45.430778 ], [ -123.964074, 45.449112 ], [ -123.972953, 45.467513 ], [ -123.976544, 45.489733 ], [ -123.970794, 45.493507 ], [ -123.966340, 45.493417 ], [ -123.957568, 45.510399 ], [ -123.947556, 45.564878 ], [ -123.956711, 45.571303 ], [ -123.951246, 45.585775 ], [ -123.939005, 45.661923 ], [ -123.939448, 45.708795 ], [ -123.943121, 45.727031 ], [ -123.946027, 45.733249 ], [ -123.968563, 45.757019 ], [ -123.982578, 45.761815 ], [ -123.981864, 45.768285 ], [ -123.969459, 45.782371 ], [ -123.961544, 45.837101 ], [ -123.962736, 45.869974 ], [ -123.967630, 45.907807 ], [ -123.979501, 45.930389 ], [ -123.993040, 45.938842 ], [ -123.993703, 45.946431 ], [ -123.969991, 45.969139 ], [ -123.957438, 45.974469 ], [ -123.941831, 45.975660 ], [ -123.937471, 45.977306 ], [ -123.927891, 46.009564 ], [ -123.929330, 46.041978 ], [ -123.933366, 46.071672 ], [ -123.947531, 46.116131 ], [ -123.959190, 46.141675 ], [ -123.974124, 46.168798 ], [ -123.996766, 46.203990 ], [ -124.010344, 46.223514 ], [ -124.024305, 46.229256 ], [ -124.011355, 46.236223 ], [ -124.001998, 46.237316 ], [ -123.998052, 46.235327 ], [ -123.988429, 46.224132 ], [ -123.990117, 46.217630 ], [ -123.987196, 46.211521 ], [ -123.982149, 46.209662 ], [ -123.961739, 46.207916 ], [ -123.950148, 46.204097 ], [ -123.927038, 46.191617 ], [ -123.912405, 46.179450 ], [ -123.904200, 46.169293 ], [ -123.891186, 46.164778 ], [ -123.854801, 46.157342 ], [ -123.842849, 46.160529 ], [ -123.841521, 46.169824 ], [ -123.863347, 46.182350 ], [ -123.866643, 46.187674 ], [ -123.864209, 46.189527 ], [ -123.838801, 46.192211 ], [ -123.821834, 46.190293 ], [ -123.793936, 46.196283 ], [ -123.759976, 46.207300 ], [ -123.736747, 46.200687 ], [ -123.712780, 46.198751 ], [ -123.706667, 46.199665 ], [ -123.675380, 46.212401 ], [ -123.673831, 46.215418 ], [ -123.666751, 46.218228 ], [ -123.655390, 46.217974 ], [ -123.636474, 46.214359 ], [ -123.632500, 46.216681 ], [ -123.626247, 46.226434 ], [ -123.625219, 46.233868 ], [ -123.622812, 46.236640 ], [ -123.613459, 46.239228 ], [ -123.605487, 46.239300 ], [ -123.600190, 46.234814 ], [ -123.586205, 46.228654 ], [ -123.548194, 46.248245 ], [ -123.547659, 46.259109 ], [ -123.538092, 46.260610 ], [ -123.526391, 46.263404 ], [ -123.516188, 46.266153 ], [ -123.501245, 46.271004 ], [ -123.479644, 46.269131 ], [ -123.474844, 46.267831 ], [ -123.468743, 46.264531 ], [ -123.447592, 46.249832 ], [ -123.427629, 46.229348 ], [ -123.430847, 46.181827 ], [ -123.371433, 46.146372 ], [ -123.332335, 46.146132 ], [ -123.301034, 46.144632 ], [ -123.280166, 46.144843 ], [ -123.251233, 46.156452 ], [ -123.231196, 46.166150 ], [ -123.213054, 46.172541 ], [ -123.166414, 46.188973 ], [ -123.115904, 46.185268 ], [ -123.105021, 46.177676 ], [ -123.051064, 46.153599 ], [ -123.041297, 46.146351 ], [ -123.033820, 46.144336 ], [ -123.022147, 46.139110 ], [ -123.009436, 46.136043 ], [ -123.004233, 46.133823 ], [ -122.962681, 46.104817 ], [ -122.904119, 46.083734 ], [ -122.884478, 46.060280 ], [ -122.878092, 46.031281 ], [ -122.856158, 46.014469 ], [ -122.837638, 45.980820 ], [ -122.813998, 45.960984 ], [ -122.806193, 45.932416 ], [ -122.811510, 45.912725 ], [ -122.798091, 45.884333 ], [ -122.785026, 45.867699 ], [ -122.785515, 45.850536 ], [ -122.785696, 45.844216 ], [ -122.795963, 45.825024 ], [ -122.795605, 45.810000 ], [ -122.769532, 45.780583 ], [ -122.761451, 45.759163 ], [ -122.760108, 45.734413 ], [ -122.772511, 45.699637 ], [ -122.774511, 45.680437 ], [ -122.763810, 45.657138 ], [ -122.738109, 45.644138 ], [ -122.713309, 45.637438 ], [ -122.691008, 45.624739 ], [ -122.675008, 45.618039 ], [ -122.643907, 45.609739 ], [ -122.602606, 45.607639 ], [ -122.581406, 45.603940 ], [ -122.548149, 45.596768 ], [ -122.523668, 45.589632 ], [ -122.492259, 45.583281 ], [ -122.479315, 45.579761 ], [ -122.474659, 45.578305 ], [ -122.453891, 45.567313 ], [ -122.438674, 45.563585 ], [ -122.410706, 45.567633 ], [ -122.391802, 45.574541 ], [ -122.380302, 45.575941 ], [ -122.352802, 45.569441 ], [ -122.331502, 45.548241 ], [ -122.294901, 45.543541 ], [ -122.266701, 45.543841 ], [ -122.262625, 45.544321 ], [ -122.248993, 45.547745 ], [ -122.201700, 45.564141 ], [ -122.183695, 45.577696 ], [ -122.140750, 45.584508 ], [ -122.129548, 45.582945 ], [ -122.129490, 45.582967 ], [ -122.126197, 45.582573 ], [ -122.126197, 45.582617 ], [ -122.112356, 45.581409 ], [ -122.101675, 45.583516 ], [ -122.044374, 45.609516 ], [ -122.022571, 45.615151 ], [ -122.003690, 45.615930 ], [ -121.983038, 45.622812 ], [ -121.979797, 45.624839 ], [ -121.963547, 45.632784 ], [ -121.955734, 45.643559 ], [ -121.951838, 45.644951 ], [ -121.935149, 45.644169 ], [ -121.908267, 45.654399 ], [ -121.900858, 45.662009 ], [ -121.901855, 45.670716 ], [ -121.867167, 45.693277 ], [ -121.811304, 45.706761 ], [ -121.735104, 45.694039 ], [ -121.707358, 45.694809 ], [ -121.668362, 45.705082 ], [ -121.631167, 45.704657 ], [ -121.533106, 45.726541 ], [ -121.522392, 45.724677 ], [ -121.499153, 45.720846 ], [ -121.462849, 45.701367 ], [ -121.423592, 45.693990 ], [ -121.401739, 45.692887 ], [ -121.372574, 45.703111 ], [ -121.337770, 45.704949 ], [ -121.312198, 45.699925 ], [ -121.287323, 45.687019 ], [ -121.251183, 45.678390 ], [ -121.215779, 45.671238 ], [ -121.200367, 45.649829 ], [ -121.195233, 45.629513 ], [ -121.196556, 45.616689 ], [ -121.183841, 45.606441 ], [ -121.167852, 45.606098 ], [ -121.145534, 45.607886 ], [ -121.139483, 45.611962 ], [ -121.131953, 45.609762 ], [ -121.122200, 45.616067 ], [ -121.117052, 45.618117 ], [ -121.120064, 45.623134 ], [ -121.084933, 45.647893 ], [ -121.064370, 45.652549 ], [ -121.033582, 45.650998 ], [ -121.007449, 45.653217 ], [ -120.983478, 45.648344 ], [ -120.977978, 45.649345 ], [ -120.953077, 45.656745 ], [ -120.943977, 45.656445 ], [ -120.915876, 45.641345 ], [ -120.913476, 45.640045 ], [ -120.895575, 45.642945 ], [ -120.870042, 45.661242 ], [ -120.855674, 45.671545 ], [ -120.788872, 45.686246 ], [ -120.724171, 45.706446 ], [ -120.689370, 45.715847 ], [ -120.668869, 45.730147 ], [ -120.634968, 45.745847 ], [ -120.591166, 45.746547 ], [ -120.559465, 45.738348 ], [ -120.521964, 45.709848 ], [ -120.505863, 45.700048 ], [ -120.482362, 45.694449 ], [ -120.403960, 45.699249 ], [ -120.329057, 45.711050 ], [ -120.288656, 45.720150 ], [ -120.282156, 45.721250 ], [ -120.210754, 45.725951 ], [ -120.170453, 45.761951 ], [ -120.141352, 45.773152 ], [ -120.070150, 45.785152 ], [ -120.001148, 45.811902 ], [ -119.965744, 45.824365 ], [ -119.907461, 45.828135 ], [ -119.876144, 45.834718 ], [ -119.868135, 45.835962 ], [ -119.802655, 45.847530 ], [ -119.772927, 45.845578 ], [ -119.669877, 45.856867 ], [ -119.623393, 45.905639 ], [ -119.600549, 45.919581 ], [ -119.571584, 45.925456 ], [ -119.524632, 45.908605 ], [ -119.487829, 45.906307 ], [ -119.450256, 45.917354 ], [ -119.364396, 45.921605 ], [ -119.322509, 45.933183 ], [ -119.257150, 45.939926 ], [ -119.225745, 45.932725 ], [ -119.195530, 45.927870 ], [ -119.169496, 45.927603 ], [ -119.126120, 45.932859 ], [ -119.093221, 45.942745 ], [ -119.061462, 45.958527 ], [ -119.027056, 45.969134 ], [ -119.008558, 45.979270 ], [ -118.987129, 45.999855 ], [ -118.941242, 46.000574 ], [ -118.677870, 46.000935 ], [ -118.658717, 46.000955 ], [ -118.639332, 46.000994 ], [ -118.637725, 46.000970 ], [ -118.579906, 46.000818 ], [ -118.575710, 46.000718 ], [ -118.569392, 46.000773 ], [ -118.537119, 46.000840 ], [ -118.497027, 46.000620 ], [ -118.470756, 46.000632 ], [ -118.378360, 46.000574 ], [ -118.367790, 46.000622 ], [ -118.314982, 46.000453 ], [ -118.283526, 46.000787 ], [ -118.256368, 46.000439 ], [ -118.252530, 46.000459 ], [ -118.236584, 46.000418 ], [ -118.228941, 46.000421 ], [ -118.146028, 46.000701 ], [ -118.131019, 46.000280 ], [ -118.126197, 46.000282 ], [ -117.996911, 46.000787 ], [ -117.717852, 45.999866 ], [ -117.603163, 45.998887 ], [ -117.504833, 45.998317 ], [ -117.480103, 45.997870 ], [ -117.475360, 45.997855 ], [ -117.475148, 45.997893 ], [ -117.439943, 45.998633 ], [ -117.390738, 45.998598 ], [ -117.353928, 45.996349 ], [ -117.337668, 45.998662 ], [ -117.216731, 45.998356 ], [ -117.214534, 45.998320 ], [ -117.212616, 45.998321 ], [ -117.070047, 45.997510 ], [ -117.051304, 45.996849 ], [ -116.985882, 45.996974 ], [ -116.940681, 45.996274 ], [ -116.915989, 45.995413 ], [ -116.911409, 45.988912 ], [ -116.892935, 45.974396 ], [ -116.886843, 45.958617 ], [ -116.875706, 45.945008 ], [ -116.869655, 45.923799 ], [ -116.866544, 45.916958 ], [ -116.859795, 45.907264 ], [ -116.857254, 45.904159 ], [ -116.843550, 45.892273 ], [ -116.830003, 45.886405 ], [ -116.819182, 45.880938 ], [ -116.814142, 45.877551 ], [ -116.796051, 45.858473 ], [ -116.790151, 45.849851 ], [ -116.787792, 45.844267 ], [ -116.787520, 45.840204 ], [ -116.788923, 45.836741 ], [ -116.789066, 45.833471 ], [ -116.788329, 45.831928 ], [ -116.782676, 45.825376 ], [ -116.763400, 45.816580 ], [ -116.759787, 45.816167 ], [ -116.755288, 45.817061 ], [ -116.750978, 45.818537 ], [ -116.745219, 45.821394 ], [ -116.740486, 45.824460 ], [ -116.736268, 45.826179 ], [ -116.715527, 45.826773 ], [ -116.711822, 45.826267 ], [ -116.708450, 45.825117 ], [ -116.698079, 45.820852 ], [ -116.697192, 45.820135 ], [ -116.687007, 45.806319 ], [ -116.680139, 45.793590 ], [ -116.665344, 45.781998 ], [ -116.659629, 45.780016 ], [ -116.646342, 45.779815 ], [ -116.639641, 45.781274 ], [ -116.635814, 45.783642 ], [ -116.632032, 45.784979 ], [ -116.605040, 45.781018 ], [ -116.593004, 45.778541 ], [ -116.577422, 45.767530 ], [ -116.559444, 45.755189 ], [ -116.553548, 45.753388 ], [ -116.549085, 45.752735 ], [ -116.546643, 45.750972 ], [ -116.537173, 45.737288 ], [ -116.535698, 45.734231 ], [ -116.538014, 45.714929 ], [ -116.536395, 45.696650 ], [ -116.535396, 45.691734 ], [ -116.528272, 45.681473 ], [ -116.523961, 45.677639 ], [ -116.512326, 45.670224 ], [ -116.494510, 45.655679 ], [ -116.487894, 45.649769 ], [ -116.482495, 45.639916 ], [ -116.477452, 45.631267 ], [ -116.472882, 45.624884 ], [ -116.469813, 45.620604 ], [ -116.465170, 45.617986 ], [ -116.463504, 45.615785 ], [ -116.463635, 45.602785 ], [ -116.481943, 45.577898 ], [ -116.482970, 45.577008 ], [ -116.490279, 45.574499 ], [ -116.502756, 45.566608 ], [ -116.523638, 45.546610 ], [ -116.535482, 45.525079 ], [ -116.543837, 45.514193 ], [ -116.548676, 45.510385 ], [ -116.553473, 45.499107 ], [ -116.558804, 45.481188 ], [ -116.558803, 45.480076 ], [ -116.554980, 45.472801 ], [ -116.554829, 45.462930 ], [ -116.561744, 45.461213 ], [ -116.563985, 45.460169 ], [ -116.575949, 45.452522 ], [ -116.581382, 45.448984 ], [ -116.588195, 45.442920 ], [ -116.592416, 45.427356 ], [ -116.597447, 45.412770 ], [ -116.619057, 45.398210 ], [ -116.626633, 45.388037 ], [ -116.653252, 45.351084 ], [ -116.673793, 45.321511 ], [ -116.674648, 45.314342 ], [ -116.672594, 45.298023 ], [ -116.672163, 45.288938 ], [ -116.672733, 45.283183 ], [ -116.674493, 45.276349 ], [ -116.675587, 45.274867 ], [ -116.681013, 45.270720 ], [ -116.687027, 45.267857 ], [ -116.691388, 45.263739 ], [ -116.696047, 45.254679 ], [ -116.703607, 45.239757 ], [ -116.709373, 45.219463 ], [ -116.709750, 45.217243 ], [ -116.708546, 45.207356 ], [ -116.709536, 45.203015 ], [ -116.724205, 45.171501 ], [ -116.724188, 45.162924 ], [ -116.728757, 45.144381 ], [ -116.729607, 45.142091 ], [ -116.731216, 45.139934 ], [ -116.754643, 45.113972 ], [ -116.774847, 45.105536 ], [ -116.782492, 45.095790 ], [ -116.783537, 45.093605 ], [ -116.784244, 45.088128 ], [ -116.783710, 45.076972 ], [ -116.797329, 45.060267 ], [ -116.808576, 45.050652 ], [ -116.825133, 45.037840 ], [ -116.830115, 45.035317 ], [ -116.841314, 45.030907 ], [ -116.847944, 45.022602 ], [ -116.848037, 45.021728 ], [ -116.845847, 45.018470 ], [ -116.844796, 45.015312 ], [ -116.844625, 45.001435 ], [ -116.846103, 44.999878 ], [ -116.856754, 44.984298 ], [ -116.858313, 44.978761 ], [ -116.851406, 44.959841 ], [ -116.850737, 44.958113 ], [ -116.846461, 44.951521 ], [ -116.835702, 44.940633 ], [ -116.831990, 44.933007 ], [ -116.832176, 44.931373 ], [ -116.833632, 44.928976 ], [ -116.838467, 44.923601 ], [ -116.842108, 44.914922 ], [ -116.846061, 44.905249 ], [ -116.850512, 44.893523 ], [ -116.852427, 44.887577 ], [ -116.857038, 44.880769 ], [ -116.865338, 44.870599 ], [ -116.883598, 44.858268 ], [ -116.896249, 44.848330 ], [ -116.905771, 44.834794 ], [ -116.920498, 44.814380 ], [ -116.928099, 44.808381 ], [ -116.931099, 44.804781 ], [ -116.933699, 44.798781 ], [ -116.933799, 44.796781 ], [ -116.933099, 44.794481 ], [ -116.930800, 44.790981 ], [ -116.930700, 44.789881 ], [ -116.931800, 44.787181 ], [ -116.934700, 44.783881 ], [ -116.936800, 44.782881 ], [ -116.949001, 44.777981 ], [ -116.966801, 44.775181 ], [ -116.970902, 44.773881 ], [ -116.972902, 44.772581 ], [ -116.977802, 44.767981 ], [ -116.986502, 44.762381 ], [ -116.992003, 44.759182 ], [ -116.998903, 44.756382 ], [ -117.006045, 44.756024 ], [ -117.013802, 44.756841 ], [ -117.038270, 44.748179 ], [ -117.044217, 44.745140 ], [ -117.062273, 44.727143 ], [ -117.060454, 44.721668 ], [ -117.061799, 44.706654 ], [ -117.063824, 44.703623 ], [ -117.072221, 44.700517 ], [ -117.079120, 44.692175 ], [ -117.080555, 44.686714 ], [ -117.080772, 44.684161 ], [ -117.091223, 44.668807 ], [ -117.095868, 44.664737 ], [ -117.096791, 44.657385 ], [ -117.094968, 44.652011 ], [ -117.098221, 44.640689 ], [ -117.108231, 44.627110 ], [ -117.114754, 44.624883 ], [ -117.117809, 44.620139 ], [ -117.120522, 44.614658 ], [ -117.125267, 44.593818 ], [ -117.124754, 44.583834 ], [ -117.126009, 44.581553 ], [ -117.133963, 44.575240 ], [ -117.138066, 44.572996 ], [ -117.142480, 44.571430 ], [ -117.146032, 44.568603 ], [ -117.148255, 44.564371 ], [ -117.147934, 44.562143 ], [ -117.142930, 44.557236 ], [ -117.144161, 44.545647 ], [ -117.149242, 44.536151 ], [ -117.152406, 44.531802 ], [ -117.161033, 44.525166 ], [ -117.167187, 44.523431 ], [ -117.181583, 44.522960 ], [ -117.185386, 44.519261 ], [ -117.189759, 44.513385 ], [ -117.191630, 44.509886 ], [ -117.191329, 44.506784 ], [ -117.192494, 44.503272 ], [ -117.194317, 44.499884 ], [ -117.200237, 44.492027 ], [ -117.208936, 44.485661 ], [ -117.211148, 44.485359 ], [ -117.216372, 44.486160 ], [ -117.224104, 44.483734 ], [ -117.225076, 44.482346 ], [ -117.225932, 44.479389 ], [ -117.225758, 44.477223 ], [ -117.224445, 44.473884 ], [ -117.221548, 44.470146 ], [ -117.217015, 44.459042 ], [ -117.215573, 44.453746 ], [ -117.214637, 44.448030 ], [ -117.215072, 44.427162 ], [ -117.218285, 44.420664 ], [ -117.225461, 44.407729 ], [ -117.226980, 44.405583 ], [ -117.234835, 44.399669 ], [ -117.242675, 44.396548 ], [ -117.243027, 44.390974 ], [ -117.235117, 44.373853 ], [ -117.227938, 44.367975 ], [ -117.216911, 44.360163 ], [ -117.210587, 44.357703 ], [ -117.206962, 44.355206 ], [ -117.197339, 44.347406 ], [ -117.196149, 44.346362 ], [ -117.189769, 44.336585 ], [ -117.189842, 44.335007 ], [ -117.191546, 44.329621 ], [ -117.192203, 44.328630 ], [ -117.203323, 44.313024 ], [ -117.205500, 44.311789 ], [ -117.215210, 44.309116 ], [ -117.216795, 44.308236 ], [ -117.217843, 44.307180 ], [ -117.220069, 44.301382 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US45", "STATE": "45", "NAME": "South Carolina", "LSAD": "", "CENSUSAREA": 30060.696000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.541087, 33.851112 ], [ -78.553944, 33.847831 ], [ -78.584841, 33.844282 ], [ -78.672260, 33.817587 ], [ -78.714116, 33.800138 ], [ -78.772737, 33.768511 ], [ -78.812931, 33.743472 ], [ -78.862931, 33.705654 ], [ -78.938076, 33.639826 ], [ -79.007356, 33.566565 ], [ -79.028516, 33.533365 ], [ -79.041125, 33.523773 ], [ -79.084588, 33.483669 ], [ -79.101360, 33.461016 ], [ -79.135441, 33.403867 ], [ -79.147496, 33.378243 ], [ -79.152035, 33.350925 ], [ -79.158429, 33.332811 ], [ -79.162332, 33.327246 ], [ -79.180318, 33.254141 ], [ -79.180563, 33.237955 ], [ -79.172394, 33.206577 ], [ -79.187870, 33.173712 ], [ -79.195631, 33.166016 ], [ -79.215453, 33.155569 ], [ -79.238262, 33.137055 ], [ -79.246090, 33.124865 ], [ -79.291591, 33.109773 ], [ -79.329909, 33.089986 ], [ -79.337169, 33.072302 ], [ -79.335346, 33.065362 ], [ -79.339313, 33.050336 ], [ -79.359961, 33.006672 ], [ -79.403712, 33.003903 ], [ -79.416515, 33.006815 ], [ -79.423447, 33.015085 ], [ -79.461047, 33.007639 ], [ -79.483499, 33.001265 ], [ -79.488727, 33.015832 ], [ -79.506923, 33.032813 ], [ -79.522449, 33.035350 ], [ -79.557560, 33.021269 ], [ -79.580725, 33.006447 ], [ -79.586590, 32.991334 ], [ -79.601020, 32.979282 ], [ -79.606615, 32.972248 ], [ -79.617611, 32.952726 ], [ -79.617715, 32.944870 ], [ -79.612928, 32.934815 ], [ -79.606194, 32.925953 ], [ -79.585897, 32.926461 ], [ -79.581687, 32.931341 ], [ -79.574951, 32.934526 ], [ -79.572614, 32.933885 ], [ -79.569762, 32.926692 ], [ -79.576006, 32.906235 ], [ -79.631149, 32.888606 ], [ -79.655426, 32.872705 ], [ -79.695141, 32.850398 ], [ -79.699482, 32.839997 ], [ -79.702956, 32.835781 ], [ -79.719879, 32.825796 ], [ -79.716761, 32.813627 ], [ -79.726389, 32.805996 ], [ -79.811021, 32.776960 ], [ -79.818237, 32.766352 ], [ -79.840350, 32.756816 ], [ -79.848527, 32.755248 ], [ -79.866742, 32.757422 ], [ -79.872232, 32.752128 ], [ -79.873605, 32.745657 ], [ -79.868352, 32.734849 ], [ -79.870336, 32.727777 ], [ -79.888028, 32.695177 ], [ -79.884961, 32.684402 ], [ -79.915682, 32.664915 ], [ -79.968468, 32.639732 ], [ -79.975248, 32.639537 ], [ -79.986917, 32.626388 ], [ -79.991750, 32.616389 ], [ -79.999374, 32.611851 ], [ -80.010505, 32.608852 ], [ -80.037276, 32.610236 ], [ -80.077039, 32.603319 ], [ -80.121368, 32.590523 ], [ -80.162327, 32.559681 ], [ -80.169030, 32.538887 ], [ -80.186043, 32.540606 ], [ -80.205230, 32.555547 ], [ -80.246361, 32.531114 ], [ -80.277681, 32.516161 ], [ -80.332438, 32.478104 ], [ -80.338354, 32.478730 ], [ -80.343883, 32.490795 ], [ -80.363956, 32.496098 ], [ -80.380716, 32.486359 ], [ -80.386827, 32.478810 ], [ -80.392561, 32.475332 ], [ -80.413487, 32.470672 ], [ -80.415943, 32.472074 ], [ -80.417896, 32.476076 ], [ -80.418502, 32.490894 ], [ -80.423454, 32.497989 ], [ -80.439407, 32.503472 ], [ -80.452078, 32.497286 ], [ -80.465710, 32.495300 ], [ -80.472068, 32.496964 ], [ -80.480250, 32.477407 ], [ -80.484617, 32.460976 ], [ -80.480156, 32.447048 ], [ -80.467588, 32.425259 ], [ -80.446075, 32.423721 ], [ -80.432960, 32.410659 ], [ -80.429941, 32.401782 ], [ -80.429291, 32.389667 ], [ -80.434303, 32.375193 ], [ -80.445451, 32.350335 ], [ -80.456814, 32.336884 ], [ -80.455192, 32.326458 ], [ -80.466342, 32.319170 ], [ -80.517871, 32.298796 ], [ -80.539429, 32.287024 ], [ -80.545688, 32.282076 ], [ -80.571096, 32.273278 ], [ -80.596394, 32.273549 ], [ -80.618286, 32.260183 ], [ -80.638857, 32.255618 ], [ -80.647025, 32.258555 ], [ -80.647501, 32.303289 ], [ -80.649880, 32.306620 ], [ -80.654163, 32.308524 ], [ -80.659874, 32.308048 ], [ -80.665109, 32.296151 ], [ -80.669868, 32.293771 ], [ -80.690807, 32.302337 ], [ -80.714601, 32.325656 ], [ -80.722216, 32.324704 ], [ -80.733637, 32.319469 ], [ -80.755052, 32.288061 ], [ -80.755052, 32.279970 ], [ -80.748866, 32.274736 ], [ -80.738872, 32.269501 ], [ -80.726975, 32.271880 ], [ -80.716505, 32.268549 ], [ -80.685096, 32.246182 ], [ -80.667057, 32.223160 ], [ -80.669166, 32.216783 ], [ -80.688857, 32.200971 ], [ -80.721463, 32.160427 ], [ -80.749091, 32.140137 ], [ -80.789996, 32.122494 ], [ -80.812503, 32.109746 ], [ -80.821530, 32.108589 ], [ -80.828394, 32.113222 ], [ -80.831531, 32.112709 ], [ -80.844431, 32.109709 ], [ -80.858735, 32.099581 ], [ -80.905378, 32.051943 ], [ -80.892344, 32.043764 ], [ -80.885517, 32.034600 ], [ -80.892977, 32.034949 ], [ -80.910669, 32.036735 ], [ -80.917845, 32.037575 ], [ -80.922794, 32.039151 ], [ -80.926753, 32.041672 ], [ -80.933557, 32.047554 ], [ -80.943226, 32.057824 ], [ -80.954482, 32.068622 ], [ -80.959402, 32.071259 ], [ -80.978833, 32.077309 ], [ -80.983133, 32.079609 ], [ -80.987733, 32.084209 ], [ -80.991733, 32.091208 ], [ -80.994333, 32.094608 ], [ -80.999833, 32.099014 ], [ -81.002297, 32.100048 ], [ -81.006745, 32.101152 ], [ -81.011961, 32.100176 ], [ -81.016009, 32.097424 ], [ -81.021622, 32.090897 ], [ -81.032674, 32.085450 ], [ -81.038265, 32.084469 ], [ -81.050234, 32.085308 ], [ -81.060442, 32.087503 ], [ -81.066906, 32.090351 ], [ -81.083546, 32.100782 ], [ -81.088234, 32.103950 ], [ -81.090874, 32.106990 ], [ -81.091498, 32.110782 ], [ -81.093386, 32.111230 ], [ -81.100458, 32.111181 ], [ -81.111134, 32.112005 ], [ -81.113334, 32.113205 ], [ -81.117234, 32.117605 ], [ -81.119994, 32.134268 ], [ -81.119134, 32.142104 ], [ -81.118334, 32.144403 ], [ -81.120034, 32.153303 ], [ -81.122034, 32.161803 ], [ -81.123134, 32.162902 ], [ -81.128434, 32.164402 ], [ -81.129634, 32.165602 ], [ -81.129402, 32.166922 ], [ -81.128134, 32.169102 ], [ -81.124492, 32.172120 ], [ -81.121134, 32.174902 ], [ -81.119434, 32.175402 ], [ -81.119361, 32.177142 ], [ -81.120434, 32.178702 ], [ -81.119834, 32.181202 ], [ -81.117934, 32.185301 ], [ -81.118234, 32.189201 ], [ -81.123150, 32.201329 ], [ -81.128283, 32.208634 ], [ -81.136012, 32.212858 ], [ -81.136727, 32.213669 ], [ -81.143139, 32.221731 ], [ -81.153531, 32.237687 ], [ -81.155995, 32.241478 ], [ -81.156587, 32.243910 ], [ -81.155595, 32.246022 ], [ -81.148334, 32.255098 ], [ -81.145834, 32.263397 ], [ -81.136534, 32.272697 ], [ -81.130834, 32.274597 ], [ -81.128034, 32.276297 ], [ -81.121433, 32.284496 ], [ -81.119633, 32.287596 ], [ -81.119833, 32.289596 ], [ -81.122333, 32.305395 ], [ -81.122933, 32.307295 ], [ -81.123933, 32.308695 ], [ -81.125433, 32.309295 ], [ -81.135733, 32.324594 ], [ -81.137633, 32.328194 ], [ -81.137032, 32.329994 ], [ -81.133032, 32.334794 ], [ -81.133632, 32.341293 ], [ -81.140932, 32.349393 ], [ -81.142532, 32.350893 ], [ -81.144032, 32.351093 ], [ -81.147632, 32.349393 ], [ -81.148477, 32.347549 ], [ -81.149073, 32.346682 ], [ -81.150589, 32.345870 ], [ -81.152105, 32.345816 ], [ -81.153296, 32.345816 ], [ -81.154000, 32.345924 ], [ -81.154433, 32.346087 ], [ -81.154812, 32.346412 ], [ -81.155136, 32.347170 ], [ -81.154974, 32.348794 ], [ -81.155032, 32.350093 ], [ -81.161732, 32.356092 ], [ -81.170126, 32.361318 ], [ -81.170858, 32.362722 ], [ -81.170553, 32.363821 ], [ -81.169332, 32.365591 ], [ -81.168722, 32.367544 ], [ -81.169332, 32.369436 ], [ -81.173432, 32.372591 ], [ -81.181072, 32.380398 ], [ -81.178131, 32.384590 ], [ -81.177231, 32.391690 ], [ -81.180931, 32.396490 ], [ -81.189731, 32.407289 ], [ -81.194931, 32.411489 ], [ -81.205130, 32.423788 ], [ -81.208430, 32.435987 ], [ -81.207246, 32.437542 ], [ -81.204530, 32.438687 ], [ -81.202588, 32.439833 ], [ -81.201595, 32.441360 ], [ -81.201137, 32.442964 ], [ -81.201137, 32.444033 ], [ -81.202206, 32.445484 ], [ -81.203046, 32.447164 ], [ -81.203046, 32.448844 ], [ -81.202359, 32.450448 ], [ -81.200908, 32.451593 ], [ -81.197529, 32.452086 ], [ -81.192629, 32.456286 ], [ -81.187329, 32.462886 ], [ -81.186829, 32.464086 ], [ -81.188129, 32.465386 ], [ -81.189229, 32.465586 ], [ -81.192429, 32.464786 ], [ -81.194829, 32.465086 ], [ -81.200029, 32.467985 ], [ -81.212428, 32.478685 ], [ -81.227528, 32.493884 ], [ -81.233585, 32.498488 ], [ -81.238281, 32.505988 ], [ -81.238728, 32.508896 ], [ -81.238411, 32.510192 ], [ -81.236707, 32.511402 ], [ -81.234834, 32.512271 ], [ -81.234023, 32.513778 ], [ -81.234660, 32.516270 ], [ -81.237095, 32.517314 ], [ -81.245010, 32.518317 ], [ -81.247874, 32.518231 ], [ -81.249827, 32.517541 ], [ -81.252882, 32.518330 ], [ -81.277131, 32.535417 ], [ -81.276242, 32.538558 ], [ -81.274802, 32.541143 ], [ -81.274927, 32.544158 ], [ -81.275213, 32.545202 ], [ -81.279238, 32.554590 ], [ -81.281324, 32.556464 ], [ -81.296760, 32.562648 ], [ -81.297955, 32.563026 ], [ -81.300593, 32.562843 ], [ -81.309009, 32.560970 ], [ -81.320588, 32.559534 ], [ -81.328753, 32.561228 ], [ -81.366964, 32.577059 ], [ -81.368386, 32.584221 ], [ -81.368982, 32.590025 ], [ -81.369757, 32.591231 ], [ -81.371570, 32.592018 ], [ -81.373178, 32.592115 ], [ -81.376237, 32.589217 ], [ -81.379216, 32.589022 ], [ -81.380999, 32.589652 ], [ -81.389338, 32.595436 ], [ -81.393865, 32.602340 ], [ -81.397106, 32.605587 ], [ -81.404714, 32.611207 ], [ -81.411906, 32.618410 ], [ -81.418660, 32.629392 ], [ -81.418431, 32.634704 ], [ -81.417014, 32.636147 ], [ -81.414761, 32.637440 ], [ -81.413411, 32.637368 ], [ -81.411523, 32.632907 ], [ -81.410260, 32.631392 ], [ -81.409330, 32.631096 ], [ -81.407271, 32.631737 ], [ -81.402846, 32.636210 ], [ -81.402735, 32.637032 ], [ -81.404238, 32.638258 ], [ -81.405109, 32.642690 ], [ -81.403582, 32.643398 ], [ -81.394589, 32.649570 ], [ -81.393033, 32.651543 ], [ -81.393818, 32.653491 ], [ -81.398314, 32.656307 ], [ -81.405273, 32.656517 ], [ -81.407193, 32.660519 ], [ -81.407300, 32.661560 ], [ -81.406646, 32.662515 ], [ -81.404287, 32.667798 ], [ -81.401029, 32.677494 ], [ -81.401256, 32.680156 ], [ -81.408310, 32.694908 ], [ -81.409349, 32.695269 ], [ -81.409982, 32.695179 ], [ -81.410750, 32.694772 ], [ -81.411157, 32.693959 ], [ -81.411609, 32.693145 ], [ -81.413100, 32.692648 ], [ -81.426735, 32.700867 ], [ -81.427517, 32.701896 ], [ -81.421194, 32.711978 ], [ -81.420516, 32.720238 ], [ -81.418542, 32.732586 ], [ -81.412670, 32.739083 ], [ -81.411549, 32.740145 ], [ -81.410845, 32.741694 ], [ -81.410563, 32.743244 ], [ -81.410281, 32.744653 ], [ -81.410563, 32.745920 ], [ -81.411408, 32.747329 ], [ -81.412817, 32.748174 ], [ -81.415353, 32.748879 ], [ -81.416198, 32.750428 ], [ -81.416761, 32.752259 ], [ -81.416479, 32.754654 ], [ -81.415212, 32.757753 ], [ -81.416479, 32.760289 ], [ -81.417606, 32.762684 ], [ -81.420142, 32.765501 ], [ -81.422396, 32.767051 ], [ -81.425017, 32.768058 ], [ -81.426199, 32.768319 ], [ -81.426481, 32.769023 ], [ -81.426481, 32.770291 ], [ -81.426059, 32.771136 ], [ -81.425636, 32.771840 ], [ -81.424714, 32.772648 ], [ -81.422678, 32.773249 ], [ -81.421269, 32.774658 ], [ -81.421128, 32.775926 ], [ -81.420987, 32.776912 ], [ -81.421128, 32.778039 ], [ -81.422114, 32.779306 ], [ -81.424227, 32.780152 ], [ -81.426481, 32.781420 ], [ -81.428313, 32.783110 ], [ -81.429017, 32.785505 ], [ -81.428031, 32.787618 ], [ -81.424999, 32.790334 ], [ -81.425234, 32.794190 ], [ -81.424874, 32.801882 ], [ -81.423772, 32.810514 ], [ -81.419752, 32.813731 ], [ -81.418497, 32.815664 ], [ -81.417984, 32.818196 ], [ -81.420620, 32.831223 ], [ -81.421614, 32.835178 ], [ -81.426475, 32.840773 ], [ -81.442671, 32.850107 ], [ -81.443595, 32.850628 ], [ -81.444866, 32.850967 ], [ -81.449396, 32.849126 ], [ -81.451199, 32.847925 ], [ -81.452573, 32.847950 ], [ -81.453949, 32.849761 ], [ -81.455978, 32.854107 ], [ -81.453017, 32.859636 ], [ -81.451351, 32.868583 ], [ -81.452883, 32.872964 ], [ -81.453920, 32.874074 ], [ -81.468042, 32.876675 ], [ -81.470376, 32.876267 ], [ -81.475918, 32.877641 ], [ -81.479445, 32.881082 ], [ -81.477100, 32.887469 ], [ -81.471703, 32.890439 ], [ -81.470836, 32.890521 ], [ -81.464655, 32.895999 ], [ -81.464069, 32.897814 ], [ -81.465924, 32.899889 ], [ -81.468978, 32.901083 ], [ -81.479184, 32.905638 ], [ -81.480008, 32.913444 ], [ -81.483198, 32.921802 ], [ -81.495092, 32.931596 ], [ -81.499829, 32.932614 ], [ -81.502427, 32.935353 ], [ -81.502716, 32.938688 ], [ -81.499566, 32.943722 ], [ -81.499446, 32.944988 ], [ -81.504016, 32.948091 ], [ -81.507045, 32.951194 ], [ -81.508138, 32.953976 ], [ -81.508436, 32.955765 ], [ -81.508536, 32.957156 ], [ -81.508436, 32.958349 ], [ -81.507741, 32.959243 ], [ -81.507442, 32.960237 ], [ -81.507144, 32.961330 ], [ -81.506449, 32.962423 ], [ -81.505256, 32.963019 ], [ -81.503346, 32.962950 ], [ -81.501369, 32.962914 ], [ -81.499830, 32.963816 ], [ -81.499471, 32.964780 ], [ -81.494736, 32.978998 ], [ -81.491457, 32.995437 ], [ -81.491197, 32.997824 ], [ -81.491419, 33.008078 ], [ -81.492253, 33.009342 ], [ -81.502030, 33.015113 ], [ -81.511245, 33.027786 ], [ -81.513231, 33.028546 ], [ -81.519632, 33.029181 ], [ -81.538789, 33.039185 ], [ -81.540081, 33.040613 ], [ -81.542092, 33.044859 ], [ -81.544258, 33.046905 ], [ -81.546785, 33.047145 ], [ -81.551838, 33.044739 ], [ -81.553643, 33.044137 ], [ -81.557013, 33.045100 ], [ -81.558336, 33.046183 ], [ -81.559179, 33.047386 ], [ -81.559660, 33.049070 ], [ -81.559173, 33.051765 ], [ -81.558938, 33.052921 ], [ -81.559179, 33.054124 ], [ -81.560502, 33.055207 ], [ -81.561344, 33.055568 ], [ -81.562066, 33.055568 ], [ -81.562548, 33.055568 ], [ -81.563270, 33.055568 ], [ -81.564714, 33.054726 ], [ -81.566759, 33.053763 ], [ -81.568925, 33.053523 ], [ -81.572880, 33.054180 ], [ -81.578332, 33.058936 ], [ -81.580994, 33.062697 ], [ -81.583804, 33.067021 ], [ -81.588539, 33.070850 ], [ -81.590705, 33.071211 ], [ -81.592645, 33.069910 ], [ -81.594555, 33.069887 ], [ -81.599248, 33.071813 ], [ -81.600091, 33.073497 ], [ -81.600211, 33.075182 ], [ -81.599369, 33.076867 ], [ -81.598286, 33.079153 ], [ -81.598165, 33.081078 ], [ -81.600211, 33.083966 ], [ -81.601655, 33.084688 ], [ -81.603587, 33.084578 ], [ -81.606836, 33.081717 ], [ -81.608995, 33.081800 ], [ -81.609837, 33.082161 ], [ -81.610078, 33.082883 ], [ -81.609837, 33.084929 ], [ -81.609533, 33.086877 ], [ -81.609476, 33.089862 ], [ -81.610800, 33.092630 ], [ -81.612725, 33.093953 ], [ -81.615132, 33.095036 ], [ -81.617779, 33.095277 ], [ -81.632232, 33.093952 ], [ -81.637232, 33.092952 ], [ -81.642333, 33.093152 ], [ -81.646433, 33.094552 ], [ -81.658433, 33.103152 ], [ -81.683533, 33.112651 ], [ -81.696934, 33.116551 ], [ -81.699834, 33.116751 ], [ -81.703134, 33.116151 ], [ -81.704634, 33.116451 ], [ -81.717134, 33.124051 ], [ -81.724334, 33.129451 ], [ -81.743835, 33.141450 ], [ -81.755135, 33.151550 ], [ -81.763135, 33.159449 ], [ -81.764435, 33.165549 ], [ -81.766735, 33.170749 ], [ -81.772435, 33.180449 ], [ -81.772435, 33.181249 ], [ -81.765735, 33.187948 ], [ -81.762835, 33.188248 ], [ -81.760635, 33.189248 ], [ -81.756935, 33.197848 ], [ -81.758235, 33.200248 ], [ -81.761635, 33.201748 ], [ -81.763535, 33.203648 ], [ -81.767635, 33.215747 ], [ -81.768935, 33.217447 ], [ -81.774035, 33.221147 ], [ -81.778435, 33.221847 ], [ -81.780135, 33.221147 ], [ -81.781035, 33.219847 ], [ -81.777335, 33.214947 ], [ -81.777535, 33.211347 ], [ -81.778935, 33.209847 ], [ -81.784535, 33.208147 ], [ -81.790236, 33.208447 ], [ -81.805236, 33.211447 ], [ -81.807336, 33.212647 ], [ -81.807936, 33.213747 ], [ -81.808136, 33.219447 ], [ -81.809636, 33.222647 ], [ -81.811736, 33.223847 ], [ -81.819636, 33.226646 ], [ -81.827936, 33.228746 ], [ -81.831736, 33.233546 ], [ -81.837016, 33.237652 ], [ -81.846536, 33.241746 ], [ -81.852136, 33.247544 ], [ -81.853137, 33.250745 ], [ -81.847336, 33.266345 ], [ -81.842522, 33.266584 ], [ -81.840078, 33.267040 ], [ -81.838337, 33.269098 ], [ -81.838257, 33.272975 ], [ -81.844036, 33.278644 ], [ -81.851836, 33.283544 ], [ -81.861336, 33.286244 ], [ -81.863236, 33.288844 ], [ -81.861536, 33.297944 ], [ -81.857336, 33.299544 ], [ -81.852936, 33.299644 ], [ -81.851636, 33.298544 ], [ -81.849636, 33.299544 ], [ -81.846136, 33.303843 ], [ -81.847296, 33.306783 ], [ -81.853652, 33.310326 ], [ -81.867936, 33.314043 ], [ -81.870436, 33.312943 ], [ -81.875836, 33.307443 ], [ -81.884137, 33.310443 ], [ -81.886637, 33.316943 ], [ -81.897329, 33.322331 ], [ -81.897064, 33.324445 ], [ -81.896937, 33.327642 ], [ -81.898187, 33.329664 ], [ -81.900301, 33.331117 ], [ -81.902613, 33.330258 ], [ -81.904132, 33.327286 ], [ -81.906444, 33.324181 ], [ -81.909285, 33.324181 ], [ -81.910342, 33.325370 ], [ -81.911266, 33.327616 ], [ -81.913314, 33.329532 ], [ -81.918337, 33.332842 ], [ -81.919137, 33.334442 ], [ -81.917973, 33.341590 ], [ -81.924737, 33.345341 ], [ -81.932737, 33.343541 ], [ -81.937237, 33.343641 ], [ -81.939737, 33.344941 ], [ -81.939837, 33.347741 ], [ -81.935637, 33.352041 ], [ -81.934837, 33.356041 ], [ -81.944737, 33.364041 ], [ -81.946737, 33.367340 ], [ -81.946337, 33.370640 ], [ -81.943737, 33.372340 ], [ -81.939637, 33.372540 ], [ -81.934637, 33.368940 ], [ -81.930634, 33.368165 ], [ -81.925737, 33.371140 ], [ -81.924837, 33.374140 ], [ -81.930861, 33.380076 ], [ -81.935453, 33.397851 ], [ -81.937300, 33.401259 ], [ -81.936961, 33.404197 ], [ -81.934927, 33.406006 ], [ -81.930519, 33.406797 ], [ -81.923060, 33.408266 ], [ -81.920121, 33.410753 ], [ -81.919217, 33.413126 ], [ -81.919330, 33.415613 ], [ -81.921068, 33.417419 ], [ -81.924893, 33.419307 ], [ -81.927241, 33.422846 ], [ -81.926789, 33.426576 ], [ -81.924981, 33.429288 ], [ -81.920716, 33.430986 ], [ -81.916236, 33.433114 ], [ -81.913356, 33.437418 ], [ -81.913457, 33.439641 ], [ -81.913532, 33.441274 ], [ -81.920836, 33.452038 ], [ -81.926336, 33.462937 ], [ -81.929436, 33.465837 ], [ -81.934136, 33.468337 ], [ -81.941737, 33.470037 ], [ -81.946437, 33.471737 ], [ -81.967037, 33.480636 ], [ -81.973537, 33.482636 ], [ -81.980637, 33.484036 ], [ -81.985938, 33.486536 ], [ -81.989338, 33.490036 ], [ -81.990938, 33.494235 ], [ -81.990382, 33.500759 ], [ -81.991938, 33.504435 ], [ -82.001338, 33.520135 ], [ -82.004338, 33.521935 ], [ -82.007138, 33.522835 ], [ -82.007638, 33.523335 ], [ -82.010038, 33.530435 ], [ -82.011538, 33.531735 ], [ -82.019838, 33.535035 ], [ -82.023438, 33.537935 ], [ -82.023438, 33.540734 ], [ -82.028238, 33.544934 ], [ -82.033023, 33.546454 ], [ -82.034895, 33.549158 ], [ -82.037375, 33.554662 ], [ -82.046335, 33.563830 ], [ -82.048959, 33.564870 ], [ -82.054943, 33.565382 ], [ -82.057727, 33.566774 ], [ -82.069039, 33.575382 ], [ -82.073104, 33.577510 ], [ -82.087488, 33.580614 ], [ -82.094128, 33.582742 ], [ -82.096352, 33.584070 ], [ -82.098816, 33.586358 ], [ -82.106240, 33.595637 ], [ -82.109376, 33.596581 ], [ -82.116545, 33.596485 ], [ -82.120385, 33.594885 ], [ -82.125864, 33.590741 ], [ -82.129080, 33.589925 ], [ -82.133523, 33.590535 ], [ -82.142872, 33.594278 ], [ -82.148816, 33.598092 ], [ -82.151060, 33.600956 ], [ -82.153357, 33.606319 ], [ -82.156288, 33.608630 ], [ -82.158331, 33.609710 ], [ -82.161908, 33.610643 ], [ -82.174351, 33.613117 ], [ -82.179854, 33.615945 ], [ -82.186154, 33.620880 ], [ -82.196583, 33.630582 ], [ -82.201186, 33.646898 ], [ -82.199747, 33.657611 ], [ -82.199847, 33.661758 ], [ -82.200718, 33.664640 ], [ -82.208411, 33.669872 ], [ -82.209677, 33.671760 ], [ -82.212047, 33.677317 ], [ -82.216868, 33.684400 ], [ -82.218649, 33.686299 ], [ -82.222709, 33.689124 ], [ -82.234576, 33.700216 ], [ -82.237192, 33.707880 ], [ -82.235753, 33.714390 ], [ -82.239098, 33.730872 ], [ -82.240405, 33.734901 ], [ -82.246161, 33.746347 ], [ -82.247472, 33.752591 ], [ -82.255267, 33.759690 ], [ -82.258049, 33.760429 ], [ -82.259471, 33.760245 ], [ -82.263206, 33.761962 ], [ -82.264380, 33.763481 ], [ -82.265019, 33.765742 ], [ -82.266127, 33.766745 ], [ -82.267719, 33.767651 ], [ -82.270445, 33.767913 ], [ -82.277681, 33.772032 ], [ -82.281060, 33.776056 ], [ -82.285804, 33.780058 ], [ -82.289762, 33.782032 ], [ -82.292468, 33.782406 ], [ -82.294984, 33.781868 ], [ -82.298286, 33.783518 ], [ -82.299393, 33.785037 ], [ -82.299601, 33.786483 ], [ -82.298923, 33.795839 ], [ -82.299280, 33.798939 ], [ -82.300213, 33.800627 ], [ -82.302885, 33.802907 ], [ -82.308997, 33.805892 ], [ -82.313339, 33.809205 ], [ -82.314746, 33.811499 ], [ -82.324480, 33.820033 ], [ -82.337829, 33.827156 ], [ -82.346933, 33.834298 ], [ -82.351881, 33.836432 ], [ -82.369107, 33.842375 ], [ -82.371775, 33.843813 ], [ -82.374286, 33.845590 ], [ -82.379750, 33.851086 ], [ -82.384973, 33.854428 ], [ -82.390527, 33.857162 ], [ -82.395736, 33.859089 ], [ -82.400517, 33.863343 ], [ -82.403881, 33.865477 ], [ -82.408354, 33.866320 ], [ -82.414259, 33.865348 ], [ -82.417871, 33.864233 ], [ -82.422803, 33.863754 ], [ -82.429164, 33.865844 ], [ -82.431150, 33.867051 ], [ -82.438644, 33.873919 ], [ -82.440503, 33.875123 ], [ -82.448109, 33.877543 ], [ -82.455105, 33.881650 ], [ -82.459391, 33.886386 ], [ -82.469913, 33.892838 ], [ -82.480111, 33.901897 ], [ -82.492929, 33.909754 ], [ -82.496109, 33.913459 ], [ -82.503584, 33.926048 ], [ -82.507640, 33.931456 ], [ -82.512950, 33.936969 ], [ -82.524515, 33.943360 ], [ -82.526741, 33.943765 ], [ -82.534111, 33.943651 ], [ -82.539770, 33.941551 ], [ -82.543128, 33.940949 ], [ -82.554497, 33.943819 ], [ -82.556835, 33.945353 ], [ -82.564582, 33.955810 ], [ -82.565700, 33.958682 ], [ -82.566145, 33.963900 ], [ -82.568288, 33.968772 ], [ -82.569864, 33.970684 ], [ -82.574724, 33.974113 ], [ -82.577540, 33.977034 ], [ -82.579576, 33.979761 ], [ -82.580551, 33.982463 ], [ -82.580571, 33.985140 ], [ -82.579996, 33.987011 ], [ -82.578244, 33.988671 ], [ -82.576330, 33.989694 ], [ -82.575351, 33.990904 ], [ -82.575540, 33.992049 ], [ -82.576222, 33.993106 ], [ -82.577735, 33.993743 ], [ -82.583394, 33.995286 ], [ -82.586234, 33.997151 ], [ -82.589245, 34.000118 ], [ -82.591855, 34.009018 ], [ -82.595655, 34.016118 ], [ -82.595855, 34.018518 ], [ -82.594055, 34.025917 ], [ -82.594555, 34.028717 ], [ -82.596155, 34.030517 ], [ -82.603055, 34.034817 ], [ -82.609655, 34.039917 ], [ -82.613355, 34.046816 ], [ -82.619155, 34.051316 ], [ -82.620955, 34.054416 ], [ -82.621255, 34.056916 ], [ -82.622155, 34.058516 ], [ -82.626963, 34.063457 ], [ -82.630972, 34.065528 ], [ -82.633565, 34.064822 ], [ -82.635991, 34.064941 ], [ -82.640543, 34.067595 ], [ -82.643980, 34.072237 ], [ -82.645661, 34.076046 ], [ -82.645220, 34.079046 ], [ -82.642797, 34.081312 ], [ -82.640345, 34.086304 ], [ -82.640151, 34.087609 ], [ -82.640701, 34.088341 ], [ -82.641252, 34.088914 ], [ -82.641030, 34.090861 ], [ -82.641553, 34.092212 ], [ -82.647028, 34.097825 ], [ -82.648184, 34.098649 ], [ -82.652175, 34.099704 ], [ -82.654019, 34.100346 ], [ -82.658561, 34.103118 ], [ -82.659077, 34.103544 ], [ -82.660322, 34.106897 ], [ -82.661851, 34.107754 ], [ -82.666879, 34.113591 ], [ -82.668113, 34.120160 ], [ -82.675220, 34.129779 ], [ -82.677320, 34.131657 ], [ -82.686290, 34.134454 ], [ -82.690386, 34.138293 ], [ -82.692152, 34.138986 ], [ -82.695530, 34.138815 ], [ -82.699758, 34.139318 ], [ -82.704140, 34.141007 ], [ -82.715373, 34.148165 ], [ -82.717507, 34.150504 ], [ -82.723312, 34.165895 ], [ -82.725409, 34.169774 ], [ -82.730824, 34.175906 ], [ -82.731881, 34.178363 ], [ -82.732359, 34.180564 ], [ -82.731975, 34.193154 ], [ -82.732761, 34.195338 ], [ -82.741920, 34.210063 ], [ -82.742380, 34.213766 ], [ -82.740544, 34.218387 ], [ -82.740447, 34.219679 ], [ -82.744415, 34.224913 ], [ -82.743461, 34.227343 ], [ -82.741980, 34.230196 ], [ -82.744834, 34.242957 ], [ -82.744982, 34.244861 ], [ -82.744056, 34.252407 ], [ -82.748756, 34.263407 ], [ -82.748656, 34.264107 ], [ -82.746656, 34.266407 ], [ -82.749856, 34.270870 ], [ -82.755028, 34.276067 ], [ -82.761995, 34.281492 ], [ -82.762945, 34.281990 ], [ -82.765266, 34.281539 ], [ -82.770928, 34.285402 ], [ -82.780308, 34.296701 ], [ -82.781752, 34.302901 ], [ -82.786840, 34.310381 ], [ -82.790966, 34.323550 ], [ -82.791608, 34.327428 ], [ -82.791235, 34.331048 ], [ -82.794054, 34.339772 ], [ -82.795223, 34.340960 ], [ -82.798198, 34.341317 ], [ -82.809949, 34.349998 ], [ -82.823420, 34.358872 ], [ -82.833702, 34.364242 ], [ -82.835004, 34.366069 ], [ -82.835413, 34.369177 ], [ -82.835203, 34.373899 ], [ -82.836611, 34.382676 ], [ -82.841524, 34.390130 ], [ -82.841997, 34.392503 ], [ -82.841326, 34.397332 ], [ -82.841997, 34.399766 ], [ -82.847446, 34.412049 ], [ -82.847781, 34.420571 ], [ -82.848651, 34.423844 ], [ -82.851367, 34.426812 ], [ -82.854434, 34.432275 ], [ -82.855762, 34.443977 ], [ -82.860127, 34.449707 ], [ -82.860874, 34.451469 ], [ -82.860707, 34.457428 ], [ -82.862156, 34.458748 ], [ -82.865345, 34.460319 ], [ -82.875463, 34.463503 ], [ -82.876464, 34.465803 ], [ -82.875864, 34.468003 ], [ -82.874864, 34.468891 ], [ -82.873831, 34.471508 ], [ -82.876864, 34.475303 ], [ -82.882864, 34.479003 ], [ -82.902665, 34.485902 ], [ -82.908365, 34.485402 ], [ -82.922866, 34.481402 ], [ -82.925766, 34.481802 ], [ -82.928466, 34.484202 ], [ -82.940867, 34.486102 ], [ -82.947367, 34.479602 ], [ -82.954667, 34.477302 ], [ -82.960668, 34.482002 ], [ -82.979568, 34.482702 ], [ -82.992671, 34.479072 ], [ -82.995279, 34.475648 ], [ -82.995090, 34.472483 ], [ -83.002924, 34.472132 ], [ -83.029315, 34.484147 ], [ -83.032513, 34.483032 ], [ -83.034712, 34.483495 ], [ -83.043771, 34.488816 ], [ -83.048289, 34.493254 ], [ -83.054463, 34.502890 ], [ -83.057843, 34.503711 ], [ -83.065515, 34.501126 ], [ -83.069451, 34.502131 ], [ -83.087189, 34.515939 ], [ -83.086861, 34.517798 ], [ -83.077995, 34.523746 ], [ -83.078113, 34.524837 ], [ -83.084855, 34.530967 ], [ -83.087789, 34.532078 ], [ -83.092564, 34.532944 ], [ -83.096858, 34.531524 ], [ -83.102179, 34.532179 ], [ -83.103176, 34.533406 ], [ -83.103987, 34.540166 ], [ -83.122901, 34.560129 ], [ -83.127176, 34.561999 ], [ -83.129676, 34.561699 ], [ -83.139876, 34.567999 ], [ -83.152577, 34.578299 ], [ -83.154577, 34.588198 ], [ -83.168278, 34.590998 ], [ -83.170278, 34.592398 ], [ -83.170978, 34.598798 ], [ -83.169994, 34.602010 ], [ -83.169572, 34.603866 ], [ -83.169994, 34.605444 ], [ -83.173428, 34.607162 ], [ -83.179439, 34.608020 ], [ -83.196979, 34.605998 ], [ -83.199779, 34.608398 ], [ -83.211598, 34.610905 ], [ -83.221402, 34.609947 ], [ -83.231780, 34.611297 ], [ -83.243381, 34.617997 ], [ -83.240676, 34.624307 ], [ -83.240669, 34.624507 ], [ -83.244581, 34.626297 ], [ -83.248281, 34.631696 ], [ -83.255281, 34.637696 ], [ -83.262282, 34.640296 ], [ -83.271982, 34.641896 ], [ -83.277960, 34.644853 ], [ -83.286583, 34.650896 ], [ -83.292883, 34.654196 ], [ -83.300848, 34.662470 ], [ -83.301477, 34.666582 ], [ -83.304641, 34.669561 ], [ -83.308917, 34.670273 ], [ -83.314394, 34.668944 ], [ -83.316401, 34.669316 ], [ -83.318524, 34.674773 ], [ -83.319440, 34.675974 ], [ -83.321463, 34.677543 ], [ -83.325336, 34.679517 ], [ -83.330284, 34.681342 ], [ -83.336207, 34.680534 ], [ -83.338690, 34.682002 ], [ -83.339029, 34.683807 ], [ -83.339367, 34.686967 ], [ -83.340383, 34.688998 ], [ -83.342414, 34.691255 ], [ -83.344671, 34.693512 ], [ -83.347831, 34.696108 ], [ -83.349411, 34.697575 ], [ -83.349975, 34.699155 ], [ -83.349636, 34.700960 ], [ -83.347831, 34.703669 ], [ -83.347718, 34.705474 ], [ -83.349788, 34.708274 ], [ -83.350976, 34.713243 ], [ -83.351392, 34.714456 ], [ -83.352485, 34.715993 ], [ -83.353238, 34.728648 ], [ -83.348829, 34.737194 ], [ -83.338666, 34.742295 ], [ -83.320062, 34.759616 ], [ -83.321008, 34.765371 ], [ -83.319945, 34.773725 ], [ -83.323866, 34.789712 ], [ -83.313782, 34.799911 ], [ -83.303643, 34.802403 ], [ -83.301182, 34.804008 ], [ -83.301482, 34.808677 ], [ -83.302965, 34.811073 ], [ -83.302965, 34.812214 ], [ -83.302395, 34.813241 ], [ -83.301368, 34.814154 ], [ -83.299428, 34.814268 ], [ -83.297259, 34.814268 ], [ -83.294292, 34.814725 ], [ -83.291325, 34.818833 ], [ -83.291120, 34.822508 ], [ -83.289914, 34.824477 ], [ -83.284812, 34.823043 ], [ -83.283151, 34.821328 ], [ -83.275656, 34.816862 ], [ -83.271214, 34.818440 ], [ -83.268159, 34.821393 ], [ -83.267293, 34.832748 ], [ -83.269982, 34.837196 ], [ -83.267656, 34.845289 ], [ -83.264520, 34.846402 ], [ -83.262193, 34.846402 ], [ -83.259860, 34.845629 ], [ -83.258146, 34.844985 ], [ -83.255718, 34.845592 ], [ -83.254605, 34.846402 ], [ -83.253762, 34.848057 ], [ -83.252582, 34.853483 ], [ -83.250053, 34.856012 ], [ -83.247220, 34.858440 ], [ -83.247018, 34.863094 ], [ -83.245602, 34.865522 ], [ -83.240847, 34.866736 ], [ -83.238419, 34.869771 ], [ -83.238557, 34.872868 ], [ -83.239081, 34.875661 ], [ -83.237510, 34.877057 ], [ -83.232379, 34.878051 ], [ -83.229240, 34.879907 ], [ -83.220099, 34.878124 ], [ -83.213323, 34.882796 ], [ -83.209683, 34.880279 ], [ -83.205627, 34.880142 ], [ -83.201183, 34.884653 ], [ -83.204572, 34.890284 ], [ -83.203351, 34.893717 ], [ -83.197627, 34.895046 ], [ -83.194786, 34.897843 ], [ -83.190409, 34.897940 ], [ -83.186541, 34.899534 ], [ -83.180871, 34.904708 ], [ -83.178932, 34.908250 ], [ -83.174034, 34.910911 ], [ -83.170754, 34.914231 ], [ -83.168524, 34.917880 ], [ -83.165022, 34.918853 ], [ -83.160937, 34.918269 ], [ -83.158019, 34.920117 ], [ -83.155879, 34.924300 ], [ -83.153253, 34.926342 ], [ -83.149946, 34.927218 ], [ -83.143261, 34.924756 ], [ -83.140621, 34.924915 ], [ -83.130554, 34.930932 ], [ -83.129885, 34.932351 ], [ -83.130356, 34.935167 ], [ -83.129493, 34.937402 ], [ -83.128070, 34.938113 ], [ -83.125175, 34.937047 ], [ -83.122585, 34.938062 ], [ -83.121112, 34.939129 ], [ -83.120502, 34.941262 ], [ -83.121214, 34.942684 ], [ -83.122940, 34.944513 ], [ -83.126761, 34.948742 ], [ -83.127035, 34.953778 ], [ -83.124378, 34.955240 ], [ -83.121140, 34.958966 ], [ -83.121803, 34.963620 ], [ -83.120387, 34.968406 ], [ -83.112021, 34.975896 ], [ -83.110025, 34.980635 ], [ -83.106991, 34.982720 ], [ -83.104490, 34.989332 ], [ -83.104600, 34.992783 ], [ -83.105531, 34.996344 ], [ -83.108535, 35.000771 ], [ -82.999867, 35.029950 ], [ -82.897499, 35.056021 ], [ -82.809766, 35.078748 ], [ -82.787867, 35.085024 ], [ -82.783283, 35.085600 ], [ -82.781130, 35.084585 ], [ -82.781062, 35.084492 ], [ -82.778651, 35.083575 ], [ -82.776357, 35.081349 ], [ -82.777407, 35.076885 ], [ -82.779116, 35.073674 ], [ -82.779928, 35.072206 ], [ -82.779928, 35.070435 ], [ -82.780546, 35.069043 ], [ -82.781973, 35.066817 ], [ -82.777376, 35.064143 ], [ -82.770046, 35.065476 ], [ -82.764464, 35.068177 ], [ -82.757704, 35.068019 ], [ -82.754162, 35.069629 ], [ -82.751265, 35.073463 ], [ -82.751102, 35.075749 ], [ -82.749491, 35.078487 ], [ -82.746431, 35.079131 ], [ -82.741761, 35.078326 ], [ -82.738379, 35.079453 ], [ -82.735904, 35.082701 ], [ -82.730971, 35.086378 ], [ -82.729683, 35.087827 ], [ -82.729517, 35.090590 ], [ -82.728961, 35.091978 ], [ -82.727010, 35.094142 ], [ -82.723462, 35.094341 ], [ -82.720442, 35.093265 ], [ -82.715297, 35.092943 ], [ -82.707152, 35.096542 ], [ -82.703916, 35.097651 ], [ -82.701017, 35.097490 ], [ -82.698602, 35.097168 ], [ -82.694898, 35.098456 ], [ -82.689634, 35.104117 ], [ -82.688456, 35.106347 ], [ -82.688778, 35.108602 ], [ -82.690711, 35.111501 ], [ -82.691355, 35.113272 ], [ -82.691194, 35.114721 ], [ -82.690549, 35.116171 ], [ -82.688939, 35.118103 ], [ -82.687641, 35.119287 ], [ -82.686738, 35.119790 ], [ -82.686496, 35.121822 ], [ -82.686040, 35.124545 ], [ -82.683625, 35.125833 ], [ -82.680887, 35.126155 ], [ -82.676861, 35.125350 ], [ -82.675089, 35.123257 ], [ -82.673318, 35.121002 ], [ -82.672513, 35.119392 ], [ -82.669614, 35.118103 ], [ -82.662381, 35.118123 ], [ -82.657858, 35.119392 ], [ -82.653510, 35.121968 ], [ -82.651416, 35.124867 ], [ -82.648694, 35.126770 ], [ -82.645296, 35.128410 ], [ -82.642237, 35.129215 ], [ -82.638210, 35.128088 ], [ -82.634668, 35.126317 ], [ -82.632574, 35.125833 ], [ -82.629031, 35.126155 ], [ -82.626436, 35.127903 ], [ -82.624847, 35.130432 ], [ -82.621185, 35.134635 ], [ -82.617993, 35.135270 ], [ -82.614402, 35.136701 ], [ -82.613866, 35.137529 ], [ -82.612444, 35.138234 ], [ -82.609706, 35.139039 ], [ -82.602358, 35.139036 ], [ -82.598140, 35.137729 ], [ -82.592430, 35.139002 ], [ -82.588158, 35.142928 ], [ -82.586035, 35.143142 ], [ -82.581836, 35.142352 ], [ -82.580687, 35.141742 ], [ -82.578316, 35.142104 ], [ -82.569912, 35.145268 ], [ -82.567486, 35.147694 ], [ -82.566193, 35.150119 ], [ -82.563767, 35.151575 ], [ -82.560807, 35.151644 ], [ -82.558593, 35.150928 ], [ -82.556168, 35.151736 ], [ -82.554874, 35.152868 ], [ -82.554871, 35.154639 ], [ -82.554227, 35.156911 ], [ -82.552934, 35.158042 ], [ -82.550508, 35.159498 ], [ -82.547436, 35.160306 ], [ -82.544525, 35.160306 ], [ -82.540483, 35.160306 ], [ -82.536218, 35.159259 ], [ -82.535967, 35.158664 ], [ -82.534662, 35.156911 ], [ -82.532560, 35.155617 ], [ -82.529973, 35.155617 ], [ -82.525930, 35.156749 ], [ -82.521403, 35.158851 ], [ -82.519210, 35.161044 ], [ -82.517284, 35.162643 ], [ -82.516910, 35.163029 ], [ -82.516044, 35.163442 ], [ -82.506137, 35.163894 ], [ -82.499843, 35.163675 ], [ -82.495506, 35.164312 ], [ -82.490766, 35.169715 ], [ -82.487357, 35.172494 ], [ -82.483937, 35.173798 ], [ -82.476136, 35.175486 ], [ -82.472313, 35.174619 ], [ -82.467991, 35.174633 ], [ -82.460092, 35.178143 ], [ -82.455609, 35.177425 ], [ -82.452987, 35.174690 ], [ -82.452764, 35.172626 ], [ -82.452931, 35.168999 ], [ -82.451201, 35.165260 ], [ -82.448969, 35.165037 ], [ -82.439595, 35.165863 ], [ -82.435689, 35.167715 ], [ -82.434126, 35.170784 ], [ -82.428000, 35.183224 ], [ -82.424461, 35.193092 ], [ -82.419744, 35.198613 ], [ -82.417597, 35.200131 ], [ -82.411301, 35.202483 ], [ -82.403348, 35.204473 ], [ -82.395697, 35.213214 ], [ -82.392930, 35.215402 ], [ -82.390439, 35.215395 ], [ -82.384029, 35.210542 ], [ -82.383776, 35.207646 ], [ -82.380524, 35.202276 ], [ -82.378744, 35.198053 ], [ -82.379191, 35.195894 ], [ -82.380605, 35.193586 ], [ -82.381201, 35.191203 ], [ -82.380903, 35.189565 ], [ -82.379712, 35.186884 ], [ -82.376808, 35.184427 ], [ -82.373218, 35.182201 ], [ -82.371298, 35.181449 ], [ -82.368990, 35.181747 ], [ -82.364299, 35.184725 ], [ -82.363479, 35.186214 ], [ -82.363554, 35.188001 ], [ -82.363256, 35.189639 ], [ -82.361469, 35.190831 ], [ -82.350086, 35.192858 ], [ -82.344554, 35.193115 ], [ -82.341194, 35.191510 ], [ -82.340133, 35.189188 ], [ -82.339508, 35.188930 ], [ -82.338013, 35.189010 ], [ -82.333934, 35.190661 ], [ -82.332975, 35.190645 ], [ -82.330779, 35.189032 ], [ -82.330549, 35.186767 ], [ -82.326917, 35.185056 ], [ -82.323350, 35.184789 ], [ -82.317871, 35.187858 ], [ -82.315871, 35.190678 ], [ -82.314863, 35.191089 ], [ -82.307166, 35.193012 ], [ -82.295354, 35.194965 ], [ -82.288453, 35.198605 ], [ -82.282516, 35.199858 ], [ -82.274920, 35.200071 ], [ -82.257515, 35.198636 ], [ -82.230915, 35.196784 ], [ -82.230517, 35.196764 ], [ -82.216217, 35.196044 ], [ -82.195483, 35.194951 ], [ -82.185513, 35.194355 ], [ -82.176874, 35.193790 ], [ -82.167676, 35.193699 ], [ -82.138947, 35.193122 ], [ -82.089586, 35.190698 ], [ -82.039651, 35.189449 ], [ -82.001422, 35.188493 ], [ -81.925612, 35.185505 ], [ -81.874433, 35.184113 ], [ -81.802081, 35.181395 ], [ -81.772351, 35.180514 ], [ -81.738492, 35.179511 ], [ -81.716259, 35.178852 ], [ -81.680801, 35.177331 ], [ -81.646707, 35.175869 ], [ -81.614877, 35.174504 ], [ -81.581681, 35.173080 ], [ -81.545150, 35.171744 ], [ -81.494265, 35.169882 ], [ -81.493401, 35.169951 ], [ -81.461408, 35.168657 ], [ -81.452398, 35.168293 ], [ -81.445627, 35.168024 ], [ -81.366691, 35.164893 ], [ -81.290672, 35.161967 ], [ -81.241686, 35.160081 ], [ -81.239358, 35.159974 ], [ -81.138207, 35.155417 ], [ -81.110840, 35.154185 ], [ -81.109295, 35.154115 ], [ -81.077253, 35.152047 ], [ -81.043625, 35.149877 ], [ -81.042870, 35.149248 ], [ -81.043407, 35.148390 ], [ -81.044391, 35.147918 ], [ -81.047091, 35.145157 ], [ -81.047826, 35.143743 ], [ -81.051204, 35.133237 ], [ -81.051037, 35.131654 ], [ -81.050420, 35.131048 ], [ -81.038968, 35.126299 ], [ -81.036759, 35.122552 ], [ -81.033005, 35.113747 ], [ -81.032471, 35.110033 ], [ -81.032806, 35.108049 ], [ -81.034958, 35.104105 ], [ -81.037369, 35.102541 ], [ -81.046524, 35.100617 ], [ -81.050079, 35.098817 ], [ -81.052078, 35.096276 ], [ -81.057236, 35.086129 ], [ -81.058029, 35.073190 ], [ -81.057648, 35.062433 ], [ -81.055695, 35.060121 ], [ -81.050018, 35.055246 ], [ -81.041489, 35.044703 ], [ -80.984160, 35.077568 ], [ -80.957870, 35.092639 ], [ -80.934950, 35.107409 ], [ -80.906553, 35.076763 ], [ -80.884887, 35.053510 ], [ -80.821560, 34.979695 ], [ -80.806784, 34.963249 ], [ -80.806461, 34.962894 ], [ -80.782042, 34.935782 ], [ -80.795109, 34.837999 ], [ -80.796997, 34.823874 ], [ -80.797543, 34.819786 ], [ -80.777712, 34.819697 ], [ -80.771792, 34.819646 ], [ -80.684074, 34.818907 ], [ -80.646601, 34.818592 ], [ -80.644656, 34.818568 ], [ -80.626077, 34.818217 ], [ -80.625993, 34.818239 ], [ -80.621222, 34.818174 ], [ -80.561657, 34.817481 ], [ -80.499788, 34.817261 ], [ -80.491814, 34.816798 ], [ -80.485234, 34.816732 ], [ -80.451660, 34.816396 ], [ -80.448766, 34.816332 ], [ -80.434843, 34.815968 ], [ -80.425902, 34.815810 ], [ -80.419586, 34.815581 ], [ -80.418433, 34.815622 ], [ -80.417014, 34.815508 ], [ -80.399871, 34.815128 ], [ -80.350068, 34.814469 ], [ -80.304690, 34.813868 ], [ -80.283627, 34.813589 ], [ -80.233960, 34.812931 ], [ -80.229705, 34.812843 ], [ -80.159252, 34.811390 ], [ -80.131169, 34.810811 ], [ -80.098994, 34.810147 ], [ -80.098022, 34.810147 ], [ -80.077223, 34.809716 ], [ -80.072912, 34.809736 ], [ -80.042764, 34.809097 ], [ -80.027464, 34.808726 ], [ -80.000541, 34.808141 ], [ -79.927618, 34.806555 ], [ -79.891443, 34.805807 ], [ -79.870693, 34.805378 ], [ -79.773607, 34.805931 ], [ -79.772829, 34.805954 ], [ -79.744925, 34.805686 ], [ -79.744116, 34.805651 ], [ -79.690201, 34.804937 ], [ -79.688088, 34.804897 ], [ -79.675299, 34.804744 ], [ -79.634216, 34.771012 ], [ -79.631577, 34.768835 ], [ -79.561691, 34.711996 ], [ -79.554454, 34.706363 ], [ -79.520269, 34.678327 ], [ -79.519043, 34.677321 ], [ -79.490201, 34.653819 ], [ -79.479305, 34.644640 ], [ -79.471599, 34.637200 ], [ -79.468717, 34.635323 ], [ -79.461318, 34.630126 ], [ -79.459766, 34.629027 ], [ -79.450034, 34.621036 ], [ -79.358317, 34.545358 ], [ -79.331328, 34.521869 ], [ -79.324854, 34.516282 ], [ -79.323249, 34.514634 ], [ -79.306653, 34.500426 ], [ -79.286703, 34.482664 ], [ -79.249763, 34.449774 ], [ -79.244886, 34.445637 ], [ -79.215993, 34.421129 ], [ -79.198982, 34.406699 ], [ -79.192041, 34.401040 ], [ -79.190739, 34.399751 ], [ -79.151485, 34.366753 ], [ -79.143242, 34.359817 ], [ -79.071169, 34.299240 ], [ -78.995760, 34.235954 ], [ -78.963692, 34.209041 ], [ -78.909881, 34.163881 ], [ -78.874747, 34.134395 ], [ -78.855385, 34.117996 ], [ -78.811710, 34.081006 ], [ -78.769483, 34.045242 ], [ -78.712206, 33.996732 ], [ -78.710141, 33.994688 ], [ -78.702771, 33.989268 ], [ -78.662530, 33.954520 ], [ -78.651629, 33.945397 ], [ -78.621369, 33.920073 ], [ -78.615932, 33.915523 ], [ -78.580378, 33.884925 ], [ -78.541087, 33.851112 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US46", "STATE": "46", "NAME": "South Dakota", "LSAD": "", "CENSUSAREA": 75811.000000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -96.443408, 42.489495 ], [ -96.459709, 42.486037 ], [ -96.465671, 42.483132 ], [ -96.475565, 42.480036 ], [ -96.478792, 42.479635 ], [ -96.489497, 42.480112 ], [ -96.501321, 42.482749 ], [ -96.505704, 42.484723 ], [ -96.508587, 42.486691 ], [ -96.515891, 42.494270 ], [ -96.517557, 42.496902 ], [ -96.518752, 42.500839 ], [ -96.520683, 42.504761 ], [ -96.525142, 42.510234 ], [ -96.528753, 42.513273 ], [ -96.531616, 42.515170 ], [ -96.538036, 42.518131 ], [ -96.548791, 42.520547 ], [ -96.557775, 42.520380 ], [ -96.567896, 42.517877 ], [ -96.572510, 42.515737 ], [ -96.584348, 42.507834 ], [ -96.591121, 42.505410 ], [ -96.595992, 42.504621 ], [ -96.603468, 42.504460 ], [ -96.608883, 42.505218 ], [ -96.611489, 42.506088 ], [ -96.625958, 42.513576 ], [ -96.628179, 42.516963 ], [ -96.631494, 42.524319 ], [ -96.632882, 42.528987 ], [ -96.633343, 42.531984 ], [ -96.633321, 42.540211 ], [ -96.635330, 42.547640 ], [ -96.638033, 42.551960 ], [ -96.643589, 42.557604 ], [ -96.648135, 42.560877 ], [ -96.658754, 42.566426 ], [ -96.675952, 42.571600 ], [ -96.681369, 42.574486 ], [ -96.685746, 42.577944 ], [ -96.697313, 42.590412 ], [ -96.706416, 42.599413 ], [ -96.709300, 42.603753 ], [ -96.710995, 42.608128 ], [ -96.711546, 42.614758 ], [ -96.711312, 42.617375 ], [ -96.709485, 42.621932 ], [ -96.707290, 42.625317 ], [ -96.696852, 42.637596 ], [ -96.692599, 42.642040 ], [ -96.689083, 42.644081 ], [ -96.687788, 42.645992 ], [ -96.686982, 42.649783 ], [ -96.687082, 42.652093 ], [ -96.687669, 42.653126 ], [ -96.691269, 42.656200 ], [ -96.697639, 42.659143 ], [ -96.728024, 42.666882 ], [ -96.735460, 42.667164 ], [ -96.746949, 42.666223 ], [ -96.749372, 42.665733 ], [ -96.751239, 42.664360 ], [ -96.764060, 42.661985 ], [ -96.778182, 42.662993 ], [ -96.793238, 42.666024 ], [ -96.798745, 42.668243 ], [ -96.800986, 42.669758 ], [ -96.802178, 42.672237 ], [ -96.800193, 42.684346 ], [ -96.800485, 42.692466 ], [ -96.801652, 42.698774 ], [ -96.806223, 42.704154 ], [ -96.813148, 42.706397 ], [ -96.819452, 42.707774 ], [ -96.829554, 42.708441 ], [ -96.843419, 42.712024 ], [ -96.849956, 42.715034 ], [ -96.860436, 42.720797 ], [ -96.872789, 42.724096 ], [ -96.886845, 42.725222 ], [ -96.906797, 42.733800 ], [ -96.920494, 42.731432 ], [ -96.924156, 42.730327 ], [ -96.930247, 42.726441 ], [ -96.936773, 42.723428 ], [ -96.941111, 42.721569 ], [ -96.948902, 42.719465 ], [ -96.955862, 42.719178 ], [ -96.961576, 42.719841 ], [ -96.963531, 42.720643 ], [ -96.964776, 42.722455 ], [ -96.965679, 42.724532 ], [ -96.965833, 42.727096 ], [ -96.961291, 42.736569 ], [ -96.960866, 42.739089 ], [ -96.961230, 42.740623 ], [ -96.968880, 42.754278 ], [ -96.975339, 42.758321 ], [ -96.979120, 42.760090 ], [ -96.982197, 42.760554 ], [ -96.992820, 42.759481 ], [ -97.024850, 42.762430 ], [ -97.030189, 42.763712 ], [ -97.033229, 42.765904 ], [ -97.052180, 42.770187 ], [ -97.065592, 42.772189 ], [ -97.071849, 42.772305 ], [ -97.079356, 42.771406 ], [ -97.085463, 42.770061 ], [ -97.096128, 42.769340 ], [ -97.101265, 42.769697 ], [ -97.111622, 42.769390 ], [ -97.131331, 42.771929 ], [ -97.134461, 42.774494 ], [ -97.137101, 42.778932 ], [ -97.137028, 42.780963 ], [ -97.138216, 42.783428 ], [ -97.144595, 42.790113 ], [ -97.150763, 42.795566 ], [ -97.163857, 42.801257 ], [ -97.166978, 42.802087 ], [ -97.172083, 42.802925 ], [ -97.178488, 42.803230 ], [ -97.187600, 42.804835 ], [ -97.200431, 42.805485 ], [ -97.204726, 42.806505 ], [ -97.210126, 42.809296 ], [ -97.211654, 42.810684 ], [ -97.213084, 42.813007 ], [ -97.213957, 42.820143 ], [ -97.215059, 42.822977 ], [ -97.217830, 42.827766 ], [ -97.218269, 42.829561 ], [ -97.217411, 42.843519 ], [ -97.218825, 42.845848 ], [ -97.231929, 42.851335 ], [ -97.237868, 42.853139 ], [ -97.248556, 42.855386 ], [ -97.251764, 42.855432 ], [ -97.256752, 42.853913 ], [ -97.267946, 42.852583 ], [ -97.289859, 42.855499 ], [ -97.302075, 42.865660 ], [ -97.306677, 42.867604 ], [ -97.308853, 42.867307 ], [ -97.311091, 42.865821 ], [ -97.318066, 42.863247 ], [ -97.324457, 42.861998 ], [ -97.326348, 42.861289 ], [ -97.328511, 42.859501 ], [ -97.330749, 42.858406 ], [ -97.336156, 42.856802 ], [ -97.341181, 42.855882 ], [ -97.359569, 42.854816 ], [ -97.361784, 42.855123 ], [ -97.368643, 42.858419 ], [ -97.375337, 42.862991 ], [ -97.376695, 42.865195 ], [ -97.393966, 42.864250 ], [ -97.399303, 42.864835 ], [ -97.404442, 42.867750 ], [ -97.408315, 42.868334 ], [ -97.413422, 42.867351 ], [ -97.417066, 42.865918 ], [ -97.423190, 42.861168 ], [ -97.425087, 42.858221 ], [ -97.425543, 42.856658 ], [ -97.431951, 42.851542 ], [ -97.439114, 42.847110 ], [ -97.442279, 42.846224 ], [ -97.452177, 42.846048 ], [ -97.456383, 42.846937 ], [ -97.458772, 42.848322 ], [ -97.461666, 42.849176 ], [ -97.470529, 42.850455 ], [ -97.484921, 42.850368 ], [ -97.491490, 42.851625 ], [ -97.496230, 42.853231 ], [ -97.499088, 42.855197 ], [ -97.500341, 42.857220 ], [ -97.504847, 42.858477 ], [ -97.515948, 42.853752 ], [ -97.531867, 42.850105 ], [ -97.547473, 42.848028 ], [ -97.561928, 42.847552 ], [ -97.574551, 42.849653 ], [ -97.591916, 42.853837 ], [ -97.599260, 42.856229 ], [ -97.603762, 42.858329 ], [ -97.611811, 42.858367 ], [ -97.620276, 42.856598 ], [ -97.646719, 42.847602 ], [ -97.657846, 42.844626 ], [ -97.668294, 42.843031 ], [ -97.686506, 42.842435 ], [ -97.701030, 42.843797 ], [ -97.720450, 42.847439 ], [ -97.750343, 42.849493 ], [ -97.753801, 42.849012 ], [ -97.764730, 42.849100 ], [ -97.774456, 42.849774 ], [ -97.788462, 42.853375 ], [ -97.801344, 42.858003 ], [ -97.817075, 42.861781 ], [ -97.825804, 42.867532 ], [ -97.828496, 42.868797 ], [ -97.834172, 42.868794 ], [ -97.845270, 42.867734 ], [ -97.857957, 42.865093 ], [ -97.865695, 42.862860 ], [ -97.875345, 42.858724 ], [ -97.877003, 42.854394 ], [ -97.876887, 42.852663 ], [ -97.875651, 42.850307 ], [ -97.875849, 42.847725 ], [ -97.878976, 42.843673 ], [ -97.879878, 42.835395 ], [ -97.884864, 42.826231 ], [ -97.888562, 42.817251 ], [ -97.890241, 42.815113 ], [ -97.894390, 42.811682 ], [ -97.905001, 42.798872 ], [ -97.908983, 42.794909 ], [ -97.915947, 42.789901 ], [ -97.921434, 42.788352 ], [ -97.932962, 42.778203 ], [ -97.936716, 42.775754 ], [ -97.950147, 42.769619 ], [ -97.953492, 42.769040 ], [ -97.962044, 42.768708 ], [ -97.977588, 42.769923 ], [ -97.992507, 42.765111 ], [ -98.000348, 42.763256 ], [ -98.002532, 42.763264 ], [ -98.005739, 42.764167 ], [ -98.013046, 42.762299 ], [ -98.017228, 42.762411 ], [ -98.035034, 42.764205 ], [ -98.037114, 42.765724 ], [ -98.042011, 42.767316 ], [ -98.044688, 42.768029 ], [ -98.051624, 42.768769 ], [ -98.056625, 42.770781 ], [ -98.059838, 42.772772 ], [ -98.061254, 42.777954 ], [ -98.062913, 42.781119 ], [ -98.067388, 42.784759 ], [ -98.082782, 42.794342 ], [ -98.087819, 42.795789 ], [ -98.094574, 42.799309 ], [ -98.104700, 42.808475 ], [ -98.107688, 42.810633 ], [ -98.127489, 42.820127 ], [ -98.129038, 42.821228 ], [ -98.137912, 42.832728 ], [ -98.146933, 42.839823 ], [ -98.148060, 42.840013 ], [ -98.163262, 42.837143 ], [ -98.167523, 42.836925 ], [ -98.171113, 42.837114 ], [ -98.189765, 42.841628 ], [ -98.204506, 42.846845 ], [ -98.219826, 42.853157 ], [ -98.224231, 42.855521 ], [ -98.226512, 42.857742 ], [ -98.231922, 42.861140 ], [ -98.246830, 42.868397 ], [ -98.249820, 42.871843 ], [ -98.251810, 42.872824 ], [ -98.258276, 42.874390 ], [ -98.268363, 42.874152 ], [ -98.280007, 42.874996 ], [ -98.297465, 42.880059 ], [ -98.319513, 42.884540 ], [ -98.325864, 42.886500 ], [ -98.329663, 42.888441 ], [ -98.332423, 42.890501 ], [ -98.333497, 42.891532 ], [ -98.335846, 42.895654 ], [ -98.337990, 42.897760 ], [ -98.342408, 42.900847 ], [ -98.346230, 42.902747 ], [ -98.358047, 42.907516 ], [ -98.375358, 42.913132 ], [ -98.386445, 42.918407 ], [ -98.399298, 42.922465 ], [ -98.407824, 42.925750 ], [ -98.420740, 42.931924 ], [ -98.426287, 42.932100 ], [ -98.430934, 42.931504 ], [ -98.434503, 42.929227 ], [ -98.437285, 42.928393 ], [ -98.439743, 42.928195 ], [ -98.444145, 42.929242 ], [ -98.445861, 42.930620 ], [ -98.447047, 42.935117 ], [ -98.448309, 42.936428 ], [ -98.452220, 42.938389 ], [ -98.458515, 42.943374 ], [ -98.461673, 42.944427 ], [ -98.467356, 42.947556 ], [ -98.478919, 42.963539 ], [ -98.490483, 42.977948 ], [ -98.495747, 42.988032 ], [ -98.498550, 42.998560 ], [ -98.565072, 42.998400 ], [ -98.568936, 42.998537 ], [ -98.663712, 42.998444 ], [ -98.665613, 42.998536 ], [ -98.742394, 42.998343 ], [ -98.764378, 42.998323 ], [ -98.801304, 42.998241 ], [ -98.823989, 42.998310 ], [ -98.899944, 42.998122 ], [ -98.903154, 42.998306 ], [ -98.919136, 42.998242 ], [ -98.919234, 42.998241 ], [ -98.962081, 42.998286 ], [ -99.000370, 42.998273 ], [ -99.021909, 42.998365 ], [ -99.022300, 42.998237 ], [ -99.080011, 42.998357 ], [ -99.081880, 42.998288 ], [ -99.135961, 42.998301 ], [ -99.139045, 42.998508 ], [ -99.151143, 42.998344 ], [ -99.161388, 42.998465 ], [ -99.195199, 42.998107 ], [ -99.234462, 42.998281 ], [ -99.254297, 42.998138 ], [ -99.262710, 42.998234 ], [ -99.288045, 42.998152 ], [ -99.347283, 42.998217 ], [ -99.368628, 42.998140 ], [ -99.371121, 42.998093 ], [ -99.374268, 42.998047 ], [ -99.395568, 42.998170 ], [ -99.471353, 42.997967 ], [ -99.474531, 42.998081 ], [ -99.490798, 42.998143 ], [ -99.494287, 42.998118 ], [ -99.535375, 42.998038 ], [ -99.569277, 42.997995 ], [ -99.699234, 42.997880 ], [ -99.701446, 42.997994 ], [ -99.719177, 42.997899 ], [ -99.726788, 42.997892 ], [ -99.743138, 42.997912 ], [ -99.768524, 42.998125 ], [ -99.788247, 42.998016 ], [ -99.800306, 42.997972 ], [ -99.803328, 42.998064 ], [ -99.809373, 42.998178 ], [ -99.821868, 42.997995 ], [ -99.850037, 42.998171 ], [ -99.859945, 42.997962 ], [ -99.869885, 42.998094 ], [ -99.877697, 42.998094 ], [ -99.918401, 42.998057 ], [ -99.927645, 42.998113 ], [ -99.950411, 42.998286 ], [ -99.950921, 42.998291 ], [ -99.961204, 42.998335 ], [ -100.004757, 42.998392 ], [ -100.027815, 42.998424 ], [ -100.034389, 42.998425 ], [ -100.119297, 42.998689 ], [ -100.126427, 42.998710 ], [ -100.126896, 42.998711 ], [ -100.198434, 42.998542 ], [ -100.277793, 42.998674 ], [ -100.283713, 42.998767 ], [ -100.349548, 42.998740 ], [ -100.355406, 42.998760 ], [ -100.472742, 42.999288 ], [ -100.534335, 42.999017 ], [ -100.544018, 42.998795 ], [ -100.553131, 42.998721 ], [ -100.625414, 42.998584 ], [ -100.631728, 42.998092 ], [ -100.867473, 42.998266 ], [ -100.887898, 42.997881 ], [ -100.906714, 42.997910 ], [ -100.958365, 42.997796 ], [ -100.964190, 42.997886 ], [ -101.000429, 42.997530 ], [ -101.043147, 42.997960 ], [ -101.226494, 42.997901 ], [ -101.226853, 42.997896 ], [ -101.229203, 42.997854 ], [ -101.230325, 42.997899 ], [ -101.500424, 42.997115 ], [ -101.625424, 42.996238 ], [ -101.713573, 42.996620 ], [ -101.849982, 42.999329 ], [ -102.082546, 42.999356 ], [ -102.440547, 42.999609 ], [ -102.487329, 42.999559 ], [ -102.792111, 42.999980 ], [ -103.131740, 43.000783 ], [ -103.132955, 43.000784 ], [ -103.340829, 43.000879 ], [ -103.404579, 43.000737 ], [ -103.505219, 43.000770 ], [ -103.506151, 43.000771 ], [ -103.506556, 43.000771 ], [ -103.576329, 43.000807 ], [ -103.576966, 43.000746 ], [ -103.618334, 43.000679 ], [ -103.652919, 43.001409 ], [ -103.715084, 43.000983 ], [ -103.813939, 43.001378 ], [ -103.815573, 43.001279 ], [ -103.924921, 43.000918 ], [ -103.966270, 43.001708 ], [ -103.991077, 43.001691 ], [ -104.053127, 43.000585 ], [ -104.053876, 43.289801 ], [ -104.053884, 43.297047 ], [ -104.054218, 43.304370 ], [ -104.054403, 43.325914 ], [ -104.054614, 43.390949 ], [ -104.054766, 43.428914 ], [ -104.054786, 43.503072 ], [ -104.055032, 43.558603 ], [ -104.054840, 43.579368 ], [ -104.054885, 43.583512 ], [ -104.054902, 43.583852 ], [ -104.055133, 43.747105 ], [ -104.055138, 43.750421 ], [ -104.055488, 43.853477 ], [ -104.055077, 43.936535 ], [ -104.054950, 43.938090 ], [ -104.054487, 44.180381 ], [ -104.055389, 44.249983 ], [ -104.055927, 44.517730 ], [ -104.055892, 44.543341 ], [ -104.055810, 44.691343 ], [ -104.055938, 44.693881 ], [ -104.055777, 44.700466 ], [ -104.055870, 44.723422 ], [ -104.055934, 44.723720 ], [ -104.055963, 44.767962 ], [ -104.055963, 44.768236 ], [ -104.056496, 44.867034 ], [ -104.055914, 44.874986 ], [ -104.057698, 44.997431 ], [ -104.039681, 44.998041 ], [ -104.040128, 44.999987 ], [ -104.039563, 45.124039 ], [ -104.039977, 45.124988 ], [ -104.040358, 45.335946 ], [ -104.040265, 45.345356 ], [ -104.040114, 45.374214 ], [ -104.040410, 45.393474 ], [ -104.040816, 45.462708 ], [ -104.041764, 45.490789 ], [ -104.041274, 45.499994 ], [ -104.041145, 45.503367 ], [ -104.041717, 45.539122 ], [ -104.041647, 45.550691 ], [ -104.041937, 45.557915 ], [ -104.042597, 45.749998 ], [ -104.043814, 45.868385 ], [ -104.044009, 45.871974 ], [ -104.044030, 45.881975 ], [ -104.045443, 45.945310 ], [ -103.668479, 45.945242 ], [ -103.660779, 45.945241 ], [ -103.660779, 45.945231 ], [ -103.577083, 45.945283 ], [ -103.558710, 45.945131 ], [ -103.434851, 45.945291 ], [ -103.432393, 45.945313 ], [ -103.418040, 45.945186 ], [ -103.411325, 45.945264 ], [ -103.375460, 45.944797 ], [ -103.369148, 45.945152 ], [ -103.284109, 45.945152 ], [ -103.284092, 45.945149 ], [ -103.218396, 45.945208 ], [ -103.210634, 45.945222 ], [ -103.161251, 45.945309 ], [ -103.140939, 45.945257 ], [ -103.097872, 45.945262 ], [ -103.078477, 45.945289 ], [ -103.047779, 45.945335 ], [ -103.026058, 45.945307 ], [ -102.995345, 45.945166 ], [ -102.989902, 45.945211 ], [ -102.920482, 45.945038 ], [ -102.880252, 45.945069 ], [ -102.704871, 45.945072 ], [ -102.674077, 45.945274 ], [ -102.672474, 45.945244 ], [ -102.666684, 45.945307 ], [ -102.651620, 45.945450 ], [ -102.642555, 45.945404 ], [ -102.558579, 45.945129 ], [ -102.550947, 45.945015 ], [ -102.476024, 45.945183 ], [ -102.467563, 45.945159 ], [ -102.459586, 45.945081 ], [ -102.446419, 45.945083 ], [ -102.425397, 45.945041 ], [ -102.425358, 45.944990 ], [ -102.420173, 45.945070 ], [ -102.410346, 45.945079 ], [ -102.406176, 45.944997 ], [ -102.398575, 45.944868 ], [ -102.396359, 45.944916 ], [ -102.392767, 45.944979 ], [ -102.392696, 45.944951 ], [ -102.354283, 45.944901 ], [ -102.353384, 45.944984 ], [ -102.328230, 45.944806 ], [ -102.217867, 45.944711 ], [ -102.176993, 45.944622 ], [ -102.176698, 45.944622 ], [ -102.159439, 45.944641 ], [ -102.157965, 45.944641 ], [ -102.156393, 45.944663 ], [ -102.145356, 45.944659 ], [ -102.135269, 45.944586 ], [ -102.125429, 45.944652 ], [ -102.124628, 45.944813 ], [ -102.087555, 45.944598 ], [ -102.085122, 45.944642 ], [ -102.060930, 45.944622 ], [ -102.000656, 45.944515 ], [ -102.000425, 45.944581 ], [ -101.998703, 45.944557 ], [ -101.992187, 45.944471 ], [ -101.989501, 45.944472 ], [ -101.973749, 45.944456 ], [ -101.957439, 45.944484 ], [ -101.886838, 45.944559 ], [ -101.852642, 45.944457 ], [ -101.832991, 45.944464 ], [ -101.794606, 45.944397 ], [ -101.790054, 45.944442 ], [ -101.766177, 45.944322 ], [ -101.765293, 45.944367 ], [ -101.764277, 45.944412 ], [ -101.758611, 45.944478 ], [ -101.730069, 45.944356 ], [ -101.723380, 45.944187 ], [ -101.708785, 45.944348 ], [ -101.681819, 45.944444 ], [ -101.680574, 45.944329 ], [ -101.657631, 45.944387 ], [ -101.628597, 45.944293 ], [ -101.562156, 45.944237 ], [ -101.557276, 45.944100 ], [ -101.419890, 45.943763 ], [ -101.373769, 45.944265 ], [ -101.370690, 45.944198 ], [ -101.365283, 45.944092 ], [ -101.333871, 45.944166 ], [ -101.313272, 45.944164 ], [ -101.287223, 45.944107 ], [ -101.271524, 45.944209 ], [ -101.224006, 45.944025 ], [ -101.203787, 45.943895 ], [ -101.179103, 45.943896 ], [ -101.175693, 45.943983 ], [ -101.171074, 45.943959 ], [ -101.163241, 45.943915 ], [ -101.146076, 45.943842 ], [ -101.142571, 45.943841 ], [ -101.106826, 45.943984 ], [ -101.101334, 45.943841 ], [ -100.980693, 45.944068 ], [ -100.976565, 45.943864 ], [ -100.964411, 45.943822 ], [ -100.938989, 45.943848 ], [ -100.935582, 45.943757 ], [ -100.890176, 45.943861 ], [ -100.769751, 45.943766 ], [ -100.762110, 45.943767 ], [ -100.762072, 45.943803 ], [ -100.750407, 45.943649 ], [ -100.720865, 45.944024 ], [ -100.650820, 45.943680 ], [ -100.627681, 45.943642 ], [ -100.511793, 45.943654 ], [ -100.462838, 45.943566 ], [ -100.430597, 45.943638 ], [ -100.424438, 45.943569 ], [ -100.420162, 45.943533 ], [ -100.410386, 45.943453 ], [ -100.294126, 45.943269 ], [ -100.285345, 45.943130 ], [ -100.284134, 45.942951 ], [ -100.275614, 45.942922 ], [ -100.274762, 45.942945 ], [ -100.170826, 45.942514 ], [ -100.152084, 45.942486 ], [ -100.141730, 45.942506 ], [ -100.110339, 45.942367 ], [ -100.108471, 45.942391 ], [ -100.084163, 45.942301 ], [ -100.069020, 45.942170 ], [ -100.005486, 45.941950 ], [ -99.965775, 45.941822 ], [ -99.880292, 45.941672 ], [ -99.838680, 45.941293 ], [ -99.750396, 45.940935 ], [ -99.749494, 45.940956 ], [ -99.749325, 45.940935 ], [ -99.747870, 45.940933 ], [ -99.718073, 45.940907 ], [ -99.692975, 45.940949 ], [ -99.671938, 45.941062 ], [ -99.611160, 45.941098 ], [ -99.588780, 45.941104 ], [ -99.493140, 45.940383 ], [ -99.490254, 45.940362 ], [ -99.401260, 45.940367 ], [ -99.385565, 45.940407 ], [ -99.378486, 45.940403 ], [ -99.344960, 45.940299 ], [ -99.344774, 45.940299 ], [ -99.317875, 45.940263 ], [ -99.297272, 45.940165 ], [ -99.283968, 45.940195 ], [ -99.276266, 45.940188 ], [ -99.257745, 45.940060 ], [ -99.222269, 45.940071 ], [ -99.221672, 45.940069 ], [ -99.213644, 45.940116 ], [ -99.212571, 45.940108 ], [ -99.102372, 45.940158 ], [ -99.092868, 45.940184 ], [ -99.005642, 45.939944 ], [ -98.905477, 45.939520 ], [ -98.904429, 45.939520 ], [ -98.625379, 45.938228 ], [ -98.414518, 45.936504 ], [ -98.185630, 45.936185 ], [ -98.184637, 45.936183 ], [ -98.070515, 45.936180 ], [ -98.008202, 45.936096 ], [ -97.986893, 45.935961 ], [ -97.958718, 45.935878 ], [ -97.784575, 45.935327 ], [ -97.777040, 45.935393 ], [ -97.696691, 45.935352 ], [ -97.542598, 45.935258 ], [ -97.519035, 45.935304 ], [ -97.518944, 45.935304 ], [ -97.491892, 45.935111 ], [ -97.481967, 45.935138 ], [ -97.318899, 45.935054 ], [ -97.312184, 45.935077 ], [ -97.228323, 45.935141 ], [ -97.144987, 45.935278 ], [ -97.118053, 45.935485 ], [ -97.103218, 45.935991 ], [ -97.019596, 45.935382 ], [ -97.000361, 45.935233 ], [ -96.998652, 45.935700 ], [ -96.805155, 45.935431 ], [ -96.791505, 45.935857 ], [ -96.701313, 45.935807 ], [ -96.680646, 45.935716 ], [ -96.659895, 45.935560 ], [ -96.639066, 45.935318 ], [ -96.618295, 45.935407 ], [ -96.607142, 45.935301 ], [ -96.597432, 45.935209 ], [ -96.576897, 45.935259 ], [ -96.563280, 45.935238 ], [ -96.564518, 45.926256 ], [ -96.564317, 45.921074 ], [ -96.564002, 45.919560 ], [ -96.566562, 45.916931 ], [ -96.567030, 45.915682 ], [ -96.566534, 45.911876 ], [ -96.565541, 45.910883 ], [ -96.564420, 45.909415 ], [ -96.567268, 45.905393 ], [ -96.568315, 45.902902 ], [ -96.568053, 45.898697 ], [ -96.568281, 45.891203 ], [ -96.568772, 45.888072 ], [ -96.571354, 45.886673 ], [ -96.572651, 45.876474 ], [ -96.571871, 45.871846 ], [ -96.574667, 45.866816 ], [ -96.574417, 45.865010 ], [ -96.572984, 45.861602 ], [ -96.574517, 45.843098 ], [ -96.576544, 45.839945 ], [ -96.577534, 45.837930 ], [ -96.577484, 45.833108 ], [ -96.579740, 45.825820 ], [ -96.583085, 45.820024 ], [ -96.587093, 45.816445 ], [ -96.593216, 45.813873 ], [ -96.596704, 45.811801 ], [ -96.601863, 45.806343 ], [ -96.607621, 45.799070 ], [ -96.612512, 45.794442 ], [ -96.618195, 45.791063 ], [ -96.625347, 45.787924 ], [ -96.627778, 45.786239 ], [ -96.629426, 45.784211 ], [ -96.630512, 45.781157 ], [ -96.636646, 45.773702 ], [ -96.638726, 45.770171 ], [ -96.639685, 45.765400 ], [ -96.641941, 45.759871 ], [ -96.652226, 45.746809 ], [ -96.662595, 45.738682 ], [ -96.672665, 45.732336 ], [ -96.687224, 45.725931 ], [ -96.711157, 45.717561 ], [ -96.745086, 45.701576 ], [ -96.750350, 45.698782 ], [ -96.757174, 45.690957 ], [ -96.760866, 45.687518 ], [ -96.800156, 45.668355 ], [ -96.826160, 45.654164 ], [ -96.827428, 45.653067 ], [ -96.832659, 45.651716 ], [ -96.835769, 45.649648 ], [ -96.840746, 45.645294 ], [ -96.844211, 45.639583 ], [ -96.851621, 45.619412 ], [ -96.852392, 45.614840 ], [ -96.856657, 45.609041 ], [ -96.857751, 45.605962 ], [ -96.853646, 45.602307 ], [ -96.849444, 45.598944 ], [ -96.844334, 45.594375 ], [ -96.843957, 45.594003 ], [ -96.835451, 45.586129 ], [ -96.801987, 45.555414 ], [ -96.799102, 45.554225 ], [ -96.793840, 45.550724 ], [ -96.784863, 45.541300 ], [ -96.781036, 45.535972 ], [ -96.765280, 45.521414 ], [ -96.760591, 45.514895 ], [ -96.752865, 45.502163 ], [ -96.745487, 45.488712 ], [ -96.743683, 45.484439 ], [ -96.743486, 45.480649 ], [ -96.742509, 45.478723 ], [ -96.738446, 45.473499 ], [ -96.736837, 45.466775 ], [ -96.732739, 45.458737 ], [ -96.731396, 45.457020 ], [ -96.724250, 45.451482 ], [ -96.710786, 45.436930 ], [ -96.702006, 45.426247 ], [ -96.692541, 45.417338 ], [ -96.683753, 45.411556 ], [ -96.680454, 45.410499 ], [ -96.675447, 45.410216 ], [ -96.670301, 45.410545 ], [ -96.662258, 45.409011 ], [ -96.647888, 45.410126 ], [ -96.640624, 45.409227 ], [ -96.631204, 45.409238 ], [ -96.617726, 45.408092 ], [ -96.601180, 45.403181 ], [ -96.584764, 45.395705 ], [ -96.578879, 45.392295 ], [ -96.571364, 45.389871 ], [ -96.562142, 45.386090 ], [ -96.545973, 45.381050 ], [ -96.539722, 45.380338 ], [ -96.530944, 45.378495 ], [ -96.521787, 45.375645 ], [ -96.508132, 45.367832 ], [ -96.502006, 45.365473 ], [ -96.489065, 45.357071 ], [ -96.482556, 45.346273 ], [ -96.479323, 45.339644 ], [ -96.469246, 45.324941 ], [ -96.468756, 45.320564 ], [ -96.468027, 45.318619 ], [ -96.466644, 45.317162 ], [ -96.461910, 45.313884 ], [ -96.457781, 45.307610 ], [ -96.456941, 45.303652 ], [ -96.454094, 45.301546 ], [ -96.453067, 45.298115 ], [ -96.452791, 45.284280 ], [ -96.452949, 45.269059 ], [ -96.452315, 45.208986 ], [ -96.452152, 45.204849 ], [ -96.452162, 45.203109 ], [ -96.452304, 45.178563 ], [ -96.452353, 45.124071 ], [ -96.452418, 45.122677 ], [ -96.452026, 45.095138 ], [ -96.452219, 45.093836 ], [ -96.452210, 45.051602 ], [ -96.452177, 45.050185 ], [ -96.452240, 45.042347 ], [ -96.452092, 44.977475 ], [ -96.452347, 44.962734 ], [ -96.452047, 44.910695 ], [ -96.451853, 44.906672 ], [ -96.452009, 44.890080 ], [ -96.451559, 44.805468 ], [ -96.451829, 44.797691 ], [ -96.451888, 44.792299 ], [ -96.451823, 44.790471 ], [ -96.451620, 44.776191 ], [ -96.451380, 44.761788 ], [ -96.451573, 44.760510 ], [ -96.451232, 44.718375 ], [ -96.451543, 44.703135 ], [ -96.451761, 44.631194 ], [ -96.451720, 44.630708 ], [ -96.451888, 44.544058 ], [ -96.452016, 44.543533 ], [ -96.452236, 44.526871 ], [ -96.452010, 44.516929 ], [ -96.451974, 44.506849 ], [ -96.452122, 44.473043 ], [ -96.452218, 44.470873 ], [ -96.451816, 44.460402 ], [ -96.451924, 44.441549 ], [ -96.452073, 44.389690 ], [ -96.452134, 44.383679 ], [ -96.452213, 44.360149 ], [ -96.452282, 44.354857 ], [ -96.452305, 44.345332 ], [ -96.452152, 44.342219 ], [ -96.452248, 44.340642 ], [ -96.452309, 44.328094 ], [ -96.452372, 44.325991 ], [ -96.452248, 44.313362 ], [ -96.452369, 44.312071 ], [ -96.452239, 44.298655 ], [ -96.452334, 44.297009 ], [ -96.452500, 44.285687 ], [ -96.452617, 44.282702 ], [ -96.452365, 44.271972 ], [ -96.452369, 44.268967 ], [ -96.452419, 44.255274 ], [ -96.452673, 44.254588 ], [ -96.452774, 44.196895 ], [ -96.453187, 44.038350 ], [ -96.453313, 44.036430 ], [ -96.453405, 44.025413 ], [ -96.453373, 44.023744 ], [ -96.453053, 44.008887 ], [ -96.453116, 44.006876 ], [ -96.453297, 43.994723 ], [ -96.453328, 43.992871 ], [ -96.453263, 43.980277 ], [ -96.453389, 43.978060 ], [ -96.453292, 43.967180 ], [ -96.453165, 43.966540 ], [ -96.453289, 43.950814 ], [ -96.453352, 43.949122 ], [ -96.453183, 43.878650 ], [ -96.453304, 43.878583 ], [ -96.453335, 43.877029 ], [ -96.453264, 43.849604 ], [ -96.453088, 43.805123 ], [ -96.453281, 43.791435 ], [ -96.453380, 43.689637 ], [ -96.453408, 43.675008 ], [ -96.453387, 43.609944 ], [ -96.453356, 43.607544 ], [ -96.453383, 43.588183 ], [ -96.453352, 43.587040 ], [ -96.453049, 43.500415 ], [ -96.591213, 43.500514 ], [ -96.598928, 43.500457 ], [ -96.599182, 43.496011 ], [ -96.598396, 43.495074 ], [ -96.594722, 43.493314 ], [ -96.591676, 43.494367 ], [ -96.590452, 43.494298 ], [ -96.586274, 43.491099 ], [ -96.585049, 43.489887 ], [ -96.580997, 43.481384 ], [ -96.586364, 43.478251 ], [ -96.585137, 43.471141 ], [ -96.584603, 43.469610 ], [ -96.587929, 43.464878 ], [ -96.600039, 43.457080 ], [ -96.602860, 43.450907 ], [ -96.602608, 43.449649 ], [ -96.594254, 43.434153 ], [ -96.592905, 43.433170 ], [ -96.587884, 43.431685 ], [ -96.581956, 43.432212 ], [ -96.575181, 43.431756 ], [ -96.570224, 43.428601 ], [ -96.569628, 43.427527 ], [ -96.570788, 43.423755 ], [ -96.573579, 43.419228 ], [ -96.568499, 43.417217 ], [ -96.562728, 43.412782 ], [ -96.557586, 43.406792 ], [ -96.553008, 43.404117 ], [ -96.537116, 43.395063 ], [ -96.531159, 43.395610 ], [ -96.530124, 43.396410 ], [ -96.530124, 43.397553 ], [ -96.529152, 43.397735 ], [ -96.525453, 43.396317 ], [ -96.524044, 43.394762 ], [ -96.521572, 43.385640 ], [ -96.521297, 43.375947 ], [ -96.521323, 43.374607 ], [ -96.522203, 43.371947 ], [ -96.526467, 43.368314 ], [ -96.527345, 43.368109 ], [ -96.527223, 43.362257 ], [ -96.526635, 43.351833 ], [ -96.525510, 43.348335 ], [ -96.524476, 43.348151 ], [ -96.524289, 43.347214 ], [ -96.531905, 43.338690 ], [ -96.534913, 43.336473 ], [ -96.533101, 43.328587 ], [ -96.528817, 43.316561 ], [ -96.525564, 43.312467 ], [ -96.526004, 43.309999 ], [ -96.530392, 43.300034 ], [ -96.541037, 43.295556 ], [ -96.553087, 43.292860 ], [ -96.555246, 43.294803 ], [ -96.563523, 43.294804 ], [ -96.564290, 43.294804 ], [ -96.569110, 43.295535 ], [ -96.570707, 43.296701 ], [ -96.571646, 43.298187 ], [ -96.573556, 43.299170 ], [ -96.580346, 43.298204 ], [ -96.581052, 43.297118 ], [ -96.580409, 43.295854 ], [ -96.579478, 43.295110 ], [ -96.579094, 43.293797 ], [ -96.578823, 43.291095 ], [ -96.577588, 43.278800 ], [ -96.580904, 43.274800 ], [ -96.582876, 43.274594 ], [ -96.582939, 43.276536 ], [ -96.583533, 43.276879 ], [ -96.586317, 43.274319 ], [ -96.585220, 43.268878 ], [ -96.582904, 43.267690 ], [ -96.576804, 43.268308 ], [ -96.568576, 43.262662 ], [ -96.564165, 43.260239 ], [ -96.560099, 43.259279 ], [ -96.556970, 43.259096 ], [ -96.554965, 43.259999 ], [ -96.553217, 43.259141 ], [ -96.552591, 43.257769 ], [ -96.552030, 43.251117 ], [ -96.552963, 43.247281 ], [ -96.559186, 43.245155 ], [ -96.565253, 43.244241 ], [ -96.571194, 43.238961 ], [ -96.568505, 43.231554 ], [ -96.560440, 43.224219 ], [ -96.558995, 43.224126 ], [ -96.557317, 43.224778 ], [ -96.556313, 43.226135 ], [ -96.554937, 43.226775 ], [ -96.548184, 43.226912 ], [ -96.544902, 43.225928 ], [ -96.540088, 43.225698 ], [ -96.535741, 43.227640 ], [ -96.526865, 43.224071 ], [ -96.522084, 43.220960 ], [ -96.520961, 43.218240 ], [ -96.519273, 43.217690 ], [ -96.512458, 43.218556 ], [ -96.500759, 43.220767 ], [ -96.496454, 43.223652 ], [ -96.485264, 43.224183 ], [ -96.476697, 43.222014 ], [ -96.475571, 43.221054 ], [ -96.474912, 43.217351 ], [ -96.472158, 43.209534 ], [ -96.470626, 43.207225 ], [ -96.470781, 43.205099 ], [ -96.473777, 43.198766 ], [ -96.473834, 43.189804 ], [ -96.472395, 43.185644 ], [ -96.468802, 43.184525 ], [ -96.467146, 43.184502 ], [ -96.465146, 43.182971 ], [ -96.464896, 43.182034 ], [ -96.467292, 43.164066 ], [ -96.467384, 43.159608 ], [ -96.466537, 43.150281 ], [ -96.465099, 43.147515 ], [ -96.459978, 43.143516 ], [ -96.458854, 43.143356 ], [ -96.455544, 43.144157 ], [ -96.450361, 43.142237 ], [ -96.443431, 43.133825 ], [ -96.442711, 43.128841 ], [ -96.441644, 43.124687 ], [ -96.440801, 43.123129 ], [ -96.439615, 43.121963 ], [ -96.436589, 43.120842 ], [ -96.439335, 43.113916 ], [ -96.448134, 43.104452 ], [ -96.451877, 43.100474 ], [ -96.460516, 43.094940 ], [ -96.462855, 43.091419 ], [ -96.462636, 43.089614 ], [ -96.455337, 43.088129 ], [ -96.454526, 43.086826 ], [ -96.454088, 43.084197 ], [ -96.455209, 43.075053 ], [ -96.458201, 43.067554 ], [ -96.460850, 43.064033 ], [ -96.463094, 43.062981 ], [ -96.468207, 43.061860 ], [ -96.469953, 43.062088 ], [ -96.473165, 43.063550 ], [ -96.476905, 43.062383 ], [ -96.486722, 43.055498 ], [ -96.488155, 43.054013 ], [ -96.488839, 43.051475 ], [ -96.490365, 43.050789 ], [ -96.501748, 43.048632 ], [ -96.505239, 43.048726 ], [ -96.508916, 43.049985 ], [ -96.510256, 43.049917 ], [ -96.518431, 43.042068 ], [ -96.517319, 43.040247 ], [ -96.515752, 43.039388 ], [ -96.513873, 43.039814 ], [ -96.511605, 43.039927 ], [ -96.509145, 43.037297 ], [ -96.509146, 43.036680 ], [ -96.510802, 43.031902 ], [ -96.512916, 43.029962 ], [ -96.513085, 43.028437 ], [ -96.511804, 43.025799 ], [ -96.510995, 43.024701 ], [ -96.503209, 43.019805 ], [ -96.499187, 43.019213 ], [ -96.494416, 43.014551 ], [ -96.491670, 43.009707 ], [ -96.492693, 43.005089 ], [ -96.494341, 43.001819 ], [ -96.496699, 42.998807 ], [ -96.497820, 42.998143 ], [ -96.502728, 42.997066 ], [ -96.507337, 42.996519 ], [ -96.509986, 42.995126 ], [ -96.512886, 42.991424 ], [ -96.512203, 42.988818 ], [ -96.512237, 42.985937 ], [ -96.516724, 42.981458 ], [ -96.520773, 42.980385 ], [ -96.520246, 42.977643 ], [ -96.515922, 42.972886 ], [ -96.510693, 42.971260 ], [ -96.506148, 42.971348 ], [ -96.505028, 42.970844 ], [ -96.503132, 42.968192 ], [ -96.500308, 42.959391 ], [ -96.504857, 42.954659 ], [ -96.508069, 42.948534 ], [ -96.509472, 42.945151 ], [ -96.510749, 42.944397 ], [ -96.514888, 42.943668 ], [ -96.519994, 42.939760 ], [ -96.520120, 42.938183 ], [ -96.516419, 42.935438 ], [ -96.516203, 42.933769 ], [ -96.516888, 42.932512 ], [ -96.518258, 42.931849 ], [ -96.519378, 42.931987 ], [ -96.520559, 42.932765 ], [ -96.521180, 42.934846 ], [ -96.523513, 42.935784 ], [ -96.525536, 42.935511 ], [ -96.541098, 42.924496 ], [ -96.541689, 42.922576 ], [ -96.541628, 42.920678 ], [ -96.540229, 42.918666 ], [ -96.537837, 42.910709 ], [ -96.536564, 42.905656 ], [ -96.538555, 42.904605 ], [ -96.542473, 42.905040 ], [ -96.542971, 42.904560 ], [ -96.542847, 42.903737 ], [ -96.539397, 42.899964 ], [ -96.536007, 42.900901 ], [ -96.528886, 42.897950 ], [ -96.526563, 42.893755 ], [ -96.526357, 42.891852 ], [ -96.527740, 42.890588 ], [ -96.534395, 42.890659 ], [ -96.540116, 42.889678 ], [ -96.540396, 42.888877 ], [ -96.538438, 42.886111 ], [ -96.537851, 42.878475 ], [ -96.543908, 42.874614 ], [ -96.546394, 42.874464 ], [ -96.547327, 42.873710 ], [ -96.549659, 42.870281 ], [ -96.550469, 42.863742 ], [ -96.550439, 42.863171 ], [ -96.546556, 42.857273 ], [ -96.545282, 42.857158 ], [ -96.543790, 42.858254 ], [ -96.543417, 42.859466 ], [ -96.542702, 42.859717 ], [ -96.541708, 42.858871 ], [ -96.541460, 42.857682 ], [ -96.544321, 42.851282 ], [ -96.545502, 42.849956 ], [ -96.550847, 42.847648 ], [ -96.553772, 42.847501 ], [ -96.554709, 42.846142 ], [ -96.554203, 42.843648 ], [ -96.552184, 42.841864 ], [ -96.549976, 42.840705 ], [ -96.549513, 42.839143 ], [ -96.551285, 42.836606 ], [ -96.552092, 42.836057 ], [ -96.553987, 42.836034 ], [ -96.556162, 42.836675 ], [ -96.558584, 42.839487 ], [ -96.560572, 42.839373 ], [ -96.562840, 42.836309 ], [ -96.563058, 42.831051 ], [ -96.565605, 42.830434 ], [ -96.571353, 42.837155 ], [ -96.579772, 42.838093 ], [ -96.581604, 42.837521 ], [ -96.582380, 42.833657 ], [ -96.577813, 42.828719 ], [ -96.577937, 42.827645 ], [ -96.584488, 42.818979 ], [ -96.585699, 42.818041 ], [ -96.591039, 42.815365 ], [ -96.594983, 42.815844 ], [ -96.596008, 42.815044 ], [ -96.595664, 42.810426 ], [ -96.592155, 42.809924 ], [ -96.590913, 42.808987 ], [ -96.590757, 42.808255 ], [ -96.592493, 42.801122 ], [ -96.595283, 42.792982 ], [ -96.602575, 42.787767 ], [ -96.603784, 42.783720 ], [ -96.604559, 42.783034 ], [ -96.615579, 42.784996 ], [ -96.619490, 42.784034 ], [ -96.621875, 42.779255 ], [ -96.626406, 42.773518 ], [ -96.630311, 42.770885 ], [ -96.632142, 42.770863 ], [ -96.633168, 42.768325 ], [ -96.632212, 42.761512 ], [ -96.628741, 42.757532 ], [ -96.624120, 42.757808 ], [ -96.622538, 42.758449 ], [ -96.621235, 42.758084 ], [ -96.620272, 42.757124 ], [ -96.619494, 42.754792 ], [ -96.620548, 42.753534 ], [ -96.626108, 42.752729 ], [ -96.630485, 42.750378 ], [ -96.632314, 42.745641 ], [ -96.635886, 42.741002 ], [ -96.639704, 42.737071 ], [ -96.638621, 42.734921 ], [ -96.631931, 42.725086 ], [ -96.626317, 42.725951 ], [ -96.624704, 42.725497 ], [ -96.624446, 42.714294 ], [ -96.627233, 42.709947 ], [ -96.629777, 42.708852 ], [ -96.630617, 42.705880 ], [ -96.629625, 42.705102 ], [ -96.619536, 42.700189 ], [ -96.615257, 42.698613 ], [ -96.614516, 42.698654 ], [ -96.613912, 42.698704 ], [ -96.613409, 42.698704 ], [ -96.613058, 42.698603 ], [ -96.612555, 42.698402 ], [ -96.612203, 42.698151 ], [ -96.611851, 42.697548 ], [ -96.611901, 42.697095 ], [ -96.612124, 42.696580 ], [ -96.612061, 42.695688 ], [ -96.610170, 42.694568 ], [ -96.606140, 42.694661 ], [ -96.604839, 42.695119 ], [ -96.601989, 42.697429 ], [ -96.600789, 42.697698 ], [ -96.599080, 42.697296 ], [ -96.596625, 42.695122 ], [ -96.595548, 42.691222 ], [ -96.596405, 42.688514 ], [ -96.591602, 42.688081 ], [ -96.585620, 42.687076 ], [ -96.575299, 42.682665 ], [ -96.574064, 42.678010 ], [ -96.574318, 42.676997 ], [ -96.575272, 42.675417 ], [ -96.578148, 42.672765 ], [ -96.578581, 42.672079 ], [ -96.576381, 42.671302 ], [ -96.572261, 42.670776 ], [ -96.570743, 42.671691 ], [ -96.570247, 42.674068 ], [ -96.569194, 42.675509 ], [ -96.568078, 42.676241 ], [ -96.566684, 42.675942 ], [ -96.560550, 42.669198 ], [ -96.556244, 42.664396 ], [ -96.556461, 42.663939 ], [ -96.558939, 42.663642 ], [ -96.559900, 42.662819 ], [ -96.559962, 42.658543 ], [ -96.559281, 42.657903 ], [ -96.556214, 42.657949 ], [ -96.546827, 42.661491 ], [ -96.543698, 42.661377 ], [ -96.542366, 42.660736 ], [ -96.537877, 42.655431 ], [ -96.537600, 42.652161 ], [ -96.538468, 42.648092 ], [ -96.537881, 42.646446 ], [ -96.533701, 42.643541 ], [ -96.526766, 42.641184 ], [ -96.516338, 42.630435 ], [ -96.515350, 42.627645 ], [ -96.515918, 42.624994 ], [ -96.516599, 42.622361 ], [ -96.518542, 42.620350 ], [ -96.521158, 42.619229 ], [ -96.523998, 42.618631 ], [ -96.528185, 42.618447 ], [ -96.530896, 42.617129 ], [ -96.531604, 42.615148 ], [ -96.529894, 42.610432 ], [ -96.527928, 42.608986 ], [ -96.525671, 42.609312 ], [ -96.522309, 42.612558 ], [ -96.519514, 42.614371 ], [ -96.517048, 42.615343 ], [ -96.513237, 42.614894 ], [ -96.509468, 42.612730 ], [ -96.504654, 42.605001 ], [ -96.500183, 42.594106 ], [ -96.500243, 42.592731 ], [ -96.501434, 42.590610 ], [ -96.501037, 42.589247 ], [ -96.499885, 42.588539 ], [ -96.496792, 42.587655 ], [ -96.494777, 42.585741 ], [ -96.494676, 42.584028 ], [ -96.495570, 42.582722 ], [ -96.496066, 42.580872 ], [ -96.495450, 42.579474 ], [ -96.491402, 42.577023 ], [ -96.486606, 42.576062 ], [ -96.485796, 42.575001 ], [ -96.485937, 42.573524 ], [ -96.486855, 42.572198 ], [ -96.489328, 42.570800 ], [ -96.493279, 42.570736 ], [ -96.497186, 42.571464 ], [ -96.498709, 42.570870 ], [ -96.499414, 42.567552 ], [ -96.498041, 42.558153 ], [ -96.494699, 42.556745 ], [ -96.476952, 42.556079 ], [ -96.476962, 42.546434 ], [ -96.477709, 42.535595 ], [ -96.479809, 42.529595 ], [ -96.479009, 42.526395 ], [ -96.479909, 42.524195 ], [ -96.490802, 42.520331 ], [ -96.492970, 42.517282 ], [ -96.490089, 42.512441 ], [ -96.483592, 42.510345 ], [ -96.479384, 42.511138 ], [ -96.477454, 42.509589 ], [ -96.473339, 42.503537 ], [ -96.474709, 42.500095 ], [ -96.476909, 42.497795 ], [ -96.476509, 42.493595 ], [ -96.474409, 42.491895 ], [ -96.462550, 42.490788 ], [ -96.456348, 42.492478 ], [ -96.443408, 42.489495 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US50", "STATE": "50", "NAME": "Vermont", "LSAD": "", "CENSUSAREA": 9216.657000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -72.040082, 44.155749 ], [ -72.042708, 44.152270 ], [ -72.042867, 44.151288 ], [ -72.041983, 44.137165 ], [ -72.037859, 44.133782 ], [ -72.034242, 44.132524 ], [ -72.033703, 44.131541 ], [ -72.037506, 44.124708 ], [ -72.038839, 44.124628 ], [ -72.040728, 44.125668 ], [ -72.041948, 44.125653 ], [ -72.046430, 44.123911 ], [ -72.052342, 44.119891 ], [ -72.054675, 44.112147 ], [ -72.054831, 44.110137 ], [ -72.052391, 44.101088 ], [ -72.050997, 44.098848 ], [ -72.048334, 44.096905 ], [ -72.044909, 44.096402 ], [ -72.043482, 44.096996 ], [ -72.042943, 44.097636 ], [ -72.042592, 44.100744 ], [ -72.040911, 44.102686 ], [ -72.039674, 44.103371 ], [ -72.036883, 44.103119 ], [ -72.032983, 44.101655 ], [ -72.031240, 44.100101 ], [ -72.031019, 44.097975 ], [ -72.031878, 44.093359 ], [ -72.032894, 44.091440 ], [ -72.034290, 44.090138 ], [ -72.036291, 44.089236 ], [ -72.040012, 44.088762 ], [ -72.046235, 44.089538 ], [ -72.047684, 44.088873 ], [ -72.048781, 44.087141 ], [ -72.047305, 44.085382 ], [ -72.039783, 44.081271 ], [ -72.033739, 44.078830 ], [ -72.032009, 44.077174 ], [ -72.031898, 44.076241 ], [ -72.033450, 44.074531 ], [ -72.036641, 44.073999 ], [ -72.039076, 44.074520 ], [ -72.040912, 44.076659 ], [ -72.042088, 44.077008 ], [ -72.051166, 44.075826 ], [ -72.051602, 44.075193 ], [ -72.051144, 44.073850 ], [ -72.048570, 44.071359 ], [ -72.048289, 44.069136 ], [ -72.053482, 44.064730 ], [ -72.056341, 44.059582 ], [ -72.057173, 44.058646 ], [ -72.058863, 44.057921 ], [ -72.065415, 44.058344 ], [ -72.067612, 44.058034 ], [ -72.069150, 44.054817 ], [ -72.068405, 44.054021 ], [ -72.062713, 44.051618 ], [ -72.062150, 44.049931 ], [ -72.066422, 44.049299 ], [ -72.074881, 44.045892 ], [ -72.077372, 44.044591 ], [ -72.078989, 44.042886 ], [ -72.079595, 44.041429 ], [ -72.079397, 44.039531 ], [ -72.075486, 44.034614 ], [ -72.075004, 44.032789 ], [ -72.075648, 44.031654 ], [ -72.079996, 44.029764 ], [ -72.081357, 44.028529 ], [ -72.081864, 44.026952 ], [ -72.081673, 44.023638 ], [ -72.082432, 44.022154 ], [ -72.084871, 44.021308 ], [ -72.090478, 44.024299 ], [ -72.092030, 44.024459 ], [ -72.094056, 44.023179 ], [ -72.095100, 44.021831 ], [ -72.095669, 44.019683 ], [ -72.095193, 44.016666 ], [ -72.090504, 44.012736 ], [ -72.089807, 44.011274 ], [ -72.090059, 44.009903 ], [ -72.091230, 44.009125 ], [ -72.093257, 44.009376 ], [ -72.093384, 44.010450 ], [ -72.095247, 44.013580 ], [ -72.098897, 44.015477 ], [ -72.102475, 44.014882 ], [ -72.105292, 44.012663 ], [ -72.104941, 44.009395 ], [ -72.103576, 44.004231 ], [ -72.103765, 44.002837 ], [ -72.109019, 44.000535 ], [ -72.116985, 43.994480 ], [ -72.116706, 43.991954 ], [ -72.112813, 43.988020 ], [ -72.111756, 43.984943 ], [ -72.112490, 43.975654 ], [ -72.113078, 43.972790 ], [ -72.114702, 43.969478 ], [ -72.114726, 43.968332 ], [ -72.114273, 43.967513 ], [ -72.110945, 43.966959 ], [ -72.107042, 43.969513 ], [ -72.104972, 43.969950 ], [ -72.096161, 43.968132 ], [ -72.091104, 43.966443 ], [ -72.090214, 43.965814 ], [ -72.090357, 43.965409 ], [ -72.098563, 43.963833 ], [ -72.100543, 43.962478 ], [ -72.100894, 43.960851 ], [ -72.098955, 43.958879 ], [ -72.098689, 43.957660 ], [ -72.104421, 43.950536 ], [ -72.105875, 43.949370 ], [ -72.110872, 43.947654 ], [ -72.115268, 43.947629 ], [ -72.117839, 43.946828 ], [ -72.118698, 43.945360 ], [ -72.118985, 43.943225 ], [ -72.116766, 43.935278 ], [ -72.116767, 43.933923 ], [ -72.118013, 43.923292 ], [ -72.119190, 43.920952 ], [ -72.121002, 43.918956 ], [ -72.135117, 43.910024 ], [ -72.145041, 43.905288 ], [ -72.151324, 43.901704 ], [ -72.155724, 43.897120 ], [ -72.158585, 43.892762 ], [ -72.159216, 43.888313 ], [ -72.160819, 43.887223 ], [ -72.167224, 43.886113 ], [ -72.170604, 43.886388 ], [ -72.171648, 43.885361 ], [ -72.172785, 43.883716 ], [ -72.173576, 43.879670 ], [ -72.171904, 43.876149 ], [ -72.169780, 43.873425 ], [ -72.167476, 43.869150 ], [ -72.174774, 43.866386 ], [ -72.179386, 43.866181 ], [ -72.182956, 43.865335 ], [ -72.184788, 43.863393 ], [ -72.187916, 43.856126 ], [ -72.187379, 43.853612 ], [ -72.182864, 43.845109 ], [ -72.182203, 43.834032 ], [ -72.183337, 43.830699 ], [ -72.186238, 43.826931 ], [ -72.188255, 43.822888 ], [ -72.188570, 43.821153 ], [ -72.186424, 43.815857 ], [ -72.184184, 43.812524 ], [ -72.183333, 43.808177 ], [ -72.184847, 43.804698 ], [ -72.190754, 43.800807 ], [ -72.193184, 43.794697 ], [ -72.195552, 43.791492 ], [ -72.197036, 43.790006 ], [ -72.204070, 43.786097 ], [ -72.205300, 43.784474 ], [ -72.205521, 43.782279 ], [ -72.204760, 43.771263 ], [ -72.207535, 43.769274 ], [ -72.210815, 43.767696 ], [ -72.216491, 43.766507 ], [ -72.218099, 43.765729 ], [ -72.220116, 43.763626 ], [ -72.222069, 43.759831 ], [ -72.223645, 43.757842 ], [ -72.232713, 43.748286 ], [ -72.245068, 43.743093 ], [ -72.264245, 43.734158 ], [ -72.271180, 43.734138 ], [ -72.276072, 43.727054 ], [ -72.279855, 43.724633 ], [ -72.284805, 43.720360 ], [ -72.286950, 43.717252 ], [ -72.292215, 43.711333 ], [ -72.294894, 43.709003 ], [ -72.299715, 43.706558 ], [ -72.302867, 43.702718 ], [ -72.305326, 43.695770 ], [ -72.306020, 43.683061 ], [ -72.304351, 43.681141 ], [ -72.303092, 43.678078 ], [ -72.303408, 43.674055 ], [ -72.304322, 43.669507 ], [ -72.305771, 43.666535 ], [ -72.310841, 43.659724 ], [ -72.312887, 43.658444 ], [ -72.314020, 43.656158 ], [ -72.315059, 43.649415 ], [ -72.313863, 43.646558 ], [ -72.314083, 43.642810 ], [ -72.315247, 43.641164 ], [ -72.322517, 43.638901 ], [ -72.327395, 43.636774 ], [ -72.329126, 43.635563 ], [ -72.329660, 43.634648 ], [ -72.329471, 43.632843 ], [ -72.327362, 43.631174 ], [ -72.327236, 43.630534 ], [ -72.328966, 43.626991 ], [ -72.332360, 43.625070 ], [ -72.334401, 43.619250 ], [ -72.334745, 43.614519 ], [ -72.332700, 43.610313 ], [ -72.329522, 43.608393 ], [ -72.328232, 43.606839 ], [ -72.327665, 43.602679 ], [ -72.328514, 43.600805 ], [ -72.329620, 43.600201 ], [ -72.332382, 43.599364 ], [ -72.349926, 43.587726 ], [ -72.363916, 43.583652 ], [ -72.373126, 43.579419 ], [ -72.379440, 43.574069 ], [ -72.382625, 43.564127 ], [ -72.382783, 43.562459 ], [ -72.381187, 43.554915 ], [ -72.380383, 43.540880 ], [ -72.383310, 43.535190 ], [ -72.389097, 43.528266 ], [ -72.390700, 43.527261 ], [ -72.394218, 43.527400 ], [ -72.395949, 43.523880 ], [ -72.395825, 43.520560 ], [ -72.398563, 43.513435 ], [ -72.398376, 43.510829 ], [ -72.396305, 43.508062 ], [ -72.389556, 43.503899 ], [ -72.384773, 43.500259 ], [ -72.380894, 43.493394 ], [ -72.380362, 43.491634 ], [ -72.380428, 43.488525 ], [ -72.381723, 43.480091 ], [ -72.382951, 43.476000 ], [ -72.384491, 43.474195 ], [ -72.391526, 43.468780 ], [ -72.392500, 43.467364 ], [ -72.392628, 43.465078 ], [ -72.390567, 43.451225 ], [ -72.391196, 43.449305 ], [ -72.393992, 43.444666 ], [ -72.395659, 43.438541 ], [ -72.395916, 43.430974 ], [ -72.399972, 43.415249 ], [ -72.400131, 43.410997 ], [ -72.403811, 43.391935 ], [ -72.405253, 43.389992 ], [ -72.413154, 43.384302 ], [ -72.415381, 43.380211 ], [ -72.415978, 43.376531 ], [ -72.415099, 43.365896 ], [ -72.414692, 43.364273 ], [ -72.413377, 43.362741 ], [ -72.403949, 43.358098 ], [ -72.400441, 43.357685 ], [ -72.392170, 43.357865 ], [ -72.390103, 43.356926 ], [ -72.390920, 43.354984 ], [ -72.395403, 43.350414 ], [ -72.399289, 43.347581 ], [ -72.400981, 43.345775 ], [ -72.409037, 43.334395 ], [ -72.410353, 43.331675 ], [ -72.410197, 43.330395 ], [ -72.408696, 43.327674 ], [ -72.402532, 43.320380 ], [ -72.397619, 43.317064 ], [ -72.395805, 43.314617 ], [ -72.395462, 43.312994 ], [ -72.401666, 43.303395 ], [ -72.407842, 43.282892 ], [ -72.415450, 43.271374 ], [ -72.421583, 43.263442 ], [ -72.435221, 43.258483 ], [ -72.436378, 43.257454 ], [ -72.438693, 43.252905 ], [ -72.438937, 43.244240 ], [ -72.436654, 43.238319 ], [ -72.434216, 43.234958 ], [ -72.433684, 43.233427 ], [ -72.434466, 43.230432 ], [ -72.437656, 43.225266 ], [ -72.440500, 43.219049 ], [ -72.440563, 43.215254 ], [ -72.438594, 43.209013 ], [ -72.437719, 43.202750 ], [ -72.438969, 43.201035 ], [ -72.450280, 43.192485 ], [ -72.449435, 43.189170 ], [ -72.443749, 43.182221 ], [ -72.443405, 43.179729 ], [ -72.444904, 43.177969 ], [ -72.452556, 43.172117 ], [ -72.451868, 43.170174 ], [ -72.452100, 43.161414 ], [ -72.451553, 43.155155 ], [ -72.451802, 43.153486 ], [ -72.452801, 43.151977 ], [ -72.456537, 43.149528 ], [ -72.457140, 43.148493 ], [ -72.456890, 43.146558 ], [ -72.451986, 43.138924 ], [ -72.448303, 43.137187 ], [ -72.444214, 43.137370 ], [ -72.441904, 43.136615 ], [ -72.440905, 43.135793 ], [ -72.440624, 43.132203 ], [ -72.440780, 43.131472 ], [ -72.442746, 43.131152 ], [ -72.442933, 43.130192 ], [ -72.440967, 43.127608 ], [ -72.435936, 43.123381 ], [ -72.432972, 43.119655 ], [ -72.432661, 43.114077 ], [ -72.433129, 43.112637 ], [ -72.434845, 43.109917 ], [ -72.440587, 43.106145 ], [ -72.442427, 43.103630 ], [ -72.443051, 43.100841 ], [ -72.439214, 43.094852 ], [ -72.435191, 43.086622 ], [ -72.435316, 43.083536 ], [ -72.436190, 43.081730 ], [ -72.439870, 43.077043 ], [ -72.445202, 43.071352 ], [ -72.454710, 43.063487 ], [ -72.463812, 43.057404 ], [ -72.466491, 43.054729 ], [ -72.467363, 43.052648 ], [ -72.466832, 43.049197 ], [ -72.465896, 43.047505 ], [ -72.462248, 43.044214 ], [ -72.460252, 43.040671 ], [ -72.460905, 43.035961 ], [ -72.462990, 43.028531 ], [ -72.462397, 43.025560 ], [ -72.458998, 43.019388 ], [ -72.457035, 43.017285 ], [ -72.452984, 43.015731 ], [ -72.444635, 43.010566 ], [ -72.443825, 43.008965 ], [ -72.443762, 43.006245 ], [ -72.444977, 43.004416 ], [ -72.448714, 43.001169 ], [ -72.451797, 43.000577 ], [ -72.456936, 43.001306 ], [ -72.459951, 43.000080 ], [ -72.462940, 42.996943 ], [ -72.464714, 42.993582 ], [ -72.465335, 42.989558 ], [ -72.464026, 42.986107 ], [ -72.461597, 42.984049 ], [ -72.461627, 42.982906 ], [ -72.465985, 42.978470 ], [ -72.473827, 42.972045 ], [ -72.476722, 42.971746 ], [ -72.479245, 42.973597 ], [ -72.481706, 42.973985 ], [ -72.486872, 42.971789 ], [ -72.492597, 42.967648 ], [ -72.504226, 42.965815 ], [ -72.507901, 42.964171 ], [ -72.518422, 42.963170 ], [ -72.532186, 42.954945 ], [ -72.534117, 42.952133 ], [ -72.534554, 42.949894 ], [ -72.533901, 42.948591 ], [ -72.531693, 42.946510 ], [ -72.529763, 42.946120 ], [ -72.528550, 42.945320 ], [ -72.527431, 42.943148 ], [ -72.526624, 42.939901 ], [ -72.526346, 42.935717 ], [ -72.527097, 42.928584 ], [ -72.524242, 42.918501 ], [ -72.524430, 42.915575 ], [ -72.525271, 42.914363 ], [ -72.529191, 42.912719 ], [ -72.530218, 42.911576 ], [ -72.531588, 42.907164 ], [ -72.531469, 42.897950 ], [ -72.532777, 42.896076 ], [ -72.537287, 42.891870 ], [ -72.540708, 42.889379 ], [ -72.546491, 42.887140 ], [ -72.552025, 42.885631 ], [ -72.552834, 42.884968 ], [ -72.555415, 42.875428 ], [ -72.555131, 42.871058 ], [ -72.556214, 42.866950 ], [ -72.556112, 42.866252 ], [ -72.555132, 42.865731 ], [ -72.554232, 42.860038 ], [ -72.557247, 42.853019 ], [ -72.553426, 42.846709 ], [ -72.548550, 42.842021 ], [ -72.547402, 42.837587 ], [ -72.547434, 42.832603 ], [ -72.546133, 42.823938 ], [ -72.542784, 42.808482 ], [ -72.539600, 42.804832 ], [ -72.518354, 42.790651 ], [ -72.515838, 42.788560 ], [ -72.511746, 42.784114 ], [ -72.508858, 42.779919 ], [ -72.508048, 42.776885 ], [ -72.508372, 42.774610 ], [ -72.510154, 42.773221 ], [ -72.514836, 42.771436 ], [ -72.516731, 42.768670 ], [ -72.516082, 42.765949 ], [ -72.513105, 42.763822 ], [ -72.510871, 42.763752 ], [ -72.507985, 42.764414 ], [ -72.500690, 42.767657 ], [ -72.499249, 42.769054 ], [ -72.498786, 42.771981 ], [ -72.497949, 42.772918 ], [ -72.495343, 42.773286 ], [ -72.491122, 42.772465 ], [ -72.487767, 42.769380 ], [ -72.486400, 42.766980 ], [ -72.484878, 42.765540 ], [ -72.479354, 42.763119 ], [ -72.477615, 42.761245 ], [ -72.475938, 42.757702 ], [ -72.474723, 42.750729 ], [ -72.473071, 42.745916 ], [ -72.467827, 42.741209 ], [ -72.461001, 42.733209 ], [ -72.458488, 42.729094 ], [ -72.458519, 42.726853 ], [ -72.809113, 42.736581 ], [ -73.022903, 42.741133 ], [ -73.264957, 42.745940 ], [ -73.276421, 42.746019 ], [ -73.290944, 42.801920 ], [ -73.286337, 42.808038 ], [ -73.283750, 42.813864 ], [ -73.287063, 42.820140 ], [ -73.285388, 42.834093 ], [ -73.284311, 42.834954 ], [ -73.278673, 42.833410 ], [ -73.275804, 42.897249 ], [ -73.274466, 42.940361 ], [ -73.274393, 42.942482 ], [ -73.274294, 42.943652 ], [ -73.269780, 43.035923 ], [ -73.265574, 43.096223 ], [ -73.258718, 43.229894 ], [ -73.256493, 43.259249 ], [ -73.253084, 43.354714 ], [ -73.252832, 43.363493 ], [ -73.252674, 43.370285 ], [ -73.252582, 43.370997 ], [ -73.248401, 43.470443 ], [ -73.247061, 43.514919 ], [ -73.246720, 43.518875 ], [ -73.247631, 43.519240 ], [ -73.247698, 43.523173 ], [ -73.246821, 43.525780 ], [ -73.243366, 43.527726 ], [ -73.241891, 43.529418 ], [ -73.241390, 43.532345 ], [ -73.241589, 43.534973 ], [ -73.242042, 43.534925 ], [ -73.246585, 43.541855 ], [ -73.247812, 43.542814 ], [ -73.250132, 43.543429 ], [ -73.250408, 43.550425 ], [ -73.248420, 43.552577 ], [ -73.248641, 43.553857 ], [ -73.252602, 43.556851 ], [ -73.258631, 43.564949 ], [ -73.264099, 43.568884 ], [ -73.269380, 43.571973 ], [ -73.279726, 43.574241 ], [ -73.280952, 43.575407 ], [ -73.281296, 43.577579 ], [ -73.284912, 43.579272 ], [ -73.293536, 43.578518 ], [ -73.294621, 43.578970 ], [ -73.295344, 43.580235 ], [ -73.294440, 43.582494 ], [ -73.292113, 43.584509 ], [ -73.292364, 43.585104 ], [ -73.296924, 43.587323 ], [ -73.293242, 43.592558 ], [ -73.292801, 43.593861 ], [ -73.292202, 43.598160 ], [ -73.292232, 43.602550 ], [ -73.293741, 43.605203 ], [ -73.298020, 43.610028 ], [ -73.300285, 43.610806 ], [ -73.302076, 43.624364 ], [ -73.302552, 43.625708 ], [ -73.304125, 43.627057 ], [ -73.306234, 43.628018 ], [ -73.307682, 43.627492 ], [ -73.310606, 43.624114 ], [ -73.312809, 43.624602 ], [ -73.317566, 43.627355 ], [ -73.323893, 43.627629 ], [ -73.327702, 43.625913 ], [ -73.342181, 43.626070 ], [ -73.347621, 43.622509 ], [ -73.358593, 43.625065 ], [ -73.359110, 43.624598 ], [ -73.365562, 43.623440 ], [ -73.367167, 43.623622 ], [ -73.368899, 43.624710 ], [ -73.371889, 43.624489 ], [ -73.372486, 43.622751 ], [ -73.369870, 43.619711 ], [ -73.369933, 43.619093 ], [ -73.374557, 43.614677 ], [ -73.376036, 43.612596 ], [ -73.372375, 43.606014 ], [ -73.372469, 43.604848 ], [ -73.373443, 43.603292 ], [ -73.377748, 43.599656 ], [ -73.383446, 43.596778 ], [ -73.383426, 43.584727 ], [ -73.382549, 43.579193 ], [ -73.383369, 43.576770 ], [ -73.384188, 43.575512 ], [ -73.391960, 43.569915 ], [ -73.395767, 43.568087 ], [ -73.398125, 43.568065 ], [ -73.400295, 43.568889 ], [ -73.405629, 43.571179 ], [ -73.416964, 43.577730 ], [ -73.420378, 43.581489 ], [ -73.426663, 43.582974 ], [ -73.428636, 43.583994 ], [ -73.430947, 43.587036 ], [ -73.431229, 43.588285 ], [ -73.430325, 43.590532 ], [ -73.424977, 43.598775 ], [ -73.421616, 43.603023 ], [ -73.422154, 43.606511 ], [ -73.423815, 43.610989 ], [ -73.423708, 43.612356 ], [ -73.417827, 43.620586 ], [ -73.417668, 43.621687 ], [ -73.418319, 43.623325 ], [ -73.427910, 43.634428 ], [ -73.428583, 43.636543 ], [ -73.426463, 43.642598 ], [ -73.425217, 43.644290 ], [ -73.423539, 43.645676 ], [ -73.418763, 43.647880 ], [ -73.415513, 43.652450 ], [ -73.414546, 43.658209 ], [ -73.408061, 43.669438 ], [ -73.407776, 43.672519 ], [ -73.404126, 43.681339 ], [ -73.403474, 43.684694 ], [ -73.405243, 43.688367 ], [ -73.404739, 43.690213 ], [ -73.402078, 43.693106 ], [ -73.398332, 43.694625 ], [ -73.395517, 43.696831 ], [ -73.393723, 43.699200 ], [ -73.391790, 43.703481 ], [ -73.385883, 43.711336 ], [ -73.382965, 43.714058 ], [ -73.377756, 43.717712 ], [ -73.370612, 43.725329 ], [ -73.369916, 43.728789 ], [ -73.370724, 43.735571 ], [ -73.370287, 43.742269 ], [ -73.369725, 43.744274 ], [ -73.354597, 43.764167 ], [ -73.350707, 43.770463 ], [ -73.350593, 43.771939 ], [ -73.354758, 43.776721 ], [ -73.355545, 43.778468 ], [ -73.357547, 43.785933 ], [ -73.362498, 43.790211 ], [ -73.368184, 43.793346 ], [ -73.376361, 43.798766 ], [ -73.377232, 43.800565 ], [ -73.378270, 43.805995 ], [ -73.379279, 43.808391 ], [ -73.380804, 43.810951 ], [ -73.383259, 43.813310 ], [ -73.390302, 43.817371 ], [ -73.392492, 43.820779 ], [ -73.392751, 43.822196 ], [ -73.390194, 43.829364 ], [ -73.388389, 43.832404 ], [ -73.381865, 43.837315 ], [ -73.376598, 43.839357 ], [ -73.373688, 43.842610 ], [ -73.372247, 43.845337 ], [ -73.372462, 43.846266 ], [ -73.373742, 43.847693 ], [ -73.380987, 43.852633 ], [ -73.382046, 43.855008 ], [ -73.381501, 43.859235 ], [ -73.379334, 43.864648 ], [ -73.374150, 43.874163 ], [ -73.374051, 43.875563 ], [ -73.376312, 43.880292 ], [ -73.383491, 43.890951 ], [ -73.395878, 43.903044 ], [ -73.397256, 43.905668 ], [ -73.400926, 43.917048 ], [ -73.407742, 43.929887 ], [ -73.408589, 43.932933 ], [ -73.405525, 43.948813 ], [ -73.406823, 43.967317 ], [ -73.411248, 43.975596 ], [ -73.412613, 43.979980 ], [ -73.412581, 43.982720 ], [ -73.411224, 43.986202 ], [ -73.405977, 44.011485 ], [ -73.405999, 44.016229 ], [ -73.407739, 44.021312 ], [ -73.410776, 44.026944 ], [ -73.414364, 44.029526 ], [ -73.420160, 44.032004 ], [ -73.423120, 44.032759 ], [ -73.427987, 44.037708 ], [ -73.430772, 44.038746 ], [ -73.436880, 44.042578 ], [ -73.437740, 44.045006 ], [ -73.431991, 44.063450 ], [ -73.430207, 44.071716 ], [ -73.429239, 44.079414 ], [ -73.416319, 44.099422 ], [ -73.411316, 44.112686 ], [ -73.411722, 44.117540 ], [ -73.413751, 44.126068 ], [ -73.415780, 44.131523 ], [ -73.415761, 44.132826 ], [ -73.411720, 44.137825 ], [ -73.408118, 44.139373 ], [ -73.403268, 44.144295 ], [ -73.402381, 44.145856 ], [ -73.399634, 44.155326 ], [ -73.398728, 44.162248 ], [ -73.395532, 44.166122 ], [ -73.395399, 44.166903 ], [ -73.396664, 44.168831 ], [ -73.397385, 44.171596 ], [ -73.396892, 44.173846 ], [ -73.395862, 44.175785 ], [ -73.390383, 44.179486 ], [ -73.389658, 44.181249 ], [ -73.390805, 44.189072 ], [ -73.390583, 44.190886 ], [ -73.388502, 44.192318 ], [ -73.385326, 44.192597 ], [ -73.383987, 44.193158 ], [ -73.382252, 44.197178 ], [ -73.377693, 44.199453 ], [ -73.375289, 44.199868 ], [ -73.372405, 44.202165 ], [ -73.370678, 44.204546 ], [ -73.362013, 44.208545 ], [ -73.361476, 44.210374 ], [ -73.357908, 44.216193 ], [ -73.355276, 44.219554 ], [ -73.355252, 44.222870 ], [ -73.354747, 44.223599 ], [ -73.350806, 44.225943 ], [ -73.349889, 44.230356 ], [ -73.342312, 44.234531 ], [ -73.343230, 44.238049 ], [ -73.336778, 44.239557 ], [ -73.334042, 44.240971 ], [ -73.330500, 44.244254 ], [ -73.329322, 44.244504 ], [ -73.324681, 44.243614 ], [ -73.323596, 44.243897 ], [ -73.319802, 44.249547 ], [ -73.316618, 44.257769 ], [ -73.312852, 44.265346 ], [ -73.311025, 44.274240 ], [ -73.312299, 44.280025 ], [ -73.316838, 44.287683 ], [ -73.322267, 44.301523 ], [ -73.324229, 44.310023 ], [ -73.324545, 44.319247 ], [ -73.323835, 44.325418 ], [ -73.323997, 44.333842 ], [ -73.325127, 44.338534 ], [ -73.327335, 44.344369 ], [ -73.334637, 44.356877 ], [ -73.334939, 44.364441 ], [ -73.333575, 44.372288 ], [ -73.330369, 44.375987 ], [ -73.320954, 44.382669 ], [ -73.317029, 44.385978 ], [ -73.315016, 44.388513 ], [ -73.312418, 44.394710 ], [ -73.310491, 44.402601 ], [ -73.296031, 44.428339 ], [ -73.293855, 44.437556 ], [ -73.293613, 44.440559 ], [ -73.295216, 44.445884 ], [ -73.300114, 44.454711 ], [ -73.298725, 44.463957 ], [ -73.298939, 44.471304 ], [ -73.299885, 44.476652 ], [ -73.304418, 44.485739 ], [ -73.304921, 44.492209 ], [ -73.306707, 44.500334 ], [ -73.312871, 44.507246 ], [ -73.319265, 44.511960 ], [ -73.320836, 44.513631 ], [ -73.321416, 44.516454 ], [ -73.321111, 44.519857 ], [ -73.322026, 44.525289 ], [ -73.323935, 44.527120 ], [ -73.328512, 44.528478 ], [ -73.329458, 44.529203 ], [ -73.330588, 44.531034 ], [ -73.330893, 44.534269 ], [ -73.331595, 44.535924 ], [ -73.338995, 44.543302 ], [ -73.339300, 44.544477 ], [ -73.338630, 44.546844 ], [ -73.338751, 44.548046 ], [ -73.342932, 44.551907 ], [ -73.350027, 44.555392 ], [ -73.355186, 44.556918 ], [ -73.356788, 44.557918 ], [ -73.360088, 44.562546 ], [ -73.367275, 44.567545 ], [ -73.374389, 44.575455 ], [ -73.375666, 44.582038 ], [ -73.377794, 44.585128 ], [ -73.381848, 44.589316 ], [ -73.381640, 44.590583 ], [ -73.377897, 44.593848 ], [ -73.376806, 44.595455 ], [ -73.376332, 44.597218 ], [ -73.376849, 44.599598 ], [ -73.380726, 44.605239 ], [ -73.382932, 44.612184 ], [ -73.389820, 44.617210 ], [ -73.390231, 44.618353 ], [ -73.389966, 44.619620 ], [ -73.387346, 44.623672 ], [ -73.386497, 44.626924 ], [ -73.385899, 44.631044 ], [ -73.387169, 44.635542 ], [ -73.386783, 44.636369 ], [ -73.379748, 44.640360 ], [ -73.378561, 44.641475 ], [ -73.383157, 44.645764 ], [ -73.377973, 44.652918 ], [ -73.378014, 44.653846 ], [ -73.378968, 44.655180 ], [ -73.379074, 44.656772 ], [ -73.374134, 44.662340 ], [ -73.373063, 44.662713 ], [ -73.370590, 44.662518 ], [ -73.369669, 44.663478 ], [ -73.370065, 44.666071 ], [ -73.372720, 44.668739 ], [ -73.371843, 44.676956 ], [ -73.371089, 44.677530 ], [ -73.367209, 44.678513 ], [ -73.367414, 44.681292 ], [ -73.369685, 44.683758 ], [ -73.370142, 44.684853 ], [ -73.365297, 44.687546 ], [ -73.361308, 44.694523 ], [ -73.361323, 44.695369 ], [ -73.365560, 44.700297 ], [ -73.365068, 44.725646 ], [ -73.365561, 44.741786 ], [ -73.363791, 44.745254 ], [ -73.357671, 44.751018 ], [ -73.354361, 44.755296 ], [ -73.348694, 44.768246 ], [ -73.347072, 44.772988 ], [ -73.344254, 44.776282 ], [ -73.335713, 44.782086 ], [ -73.333771, 44.785192 ], [ -73.333154, 44.788759 ], [ -73.333933, 44.799200 ], [ -73.334430, 44.802188 ], [ -73.335443, 44.804602 ], [ -73.350200, 44.816394 ], [ -73.353472, 44.820386 ], [ -73.354945, 44.821500 ], [ -73.358080, 44.823310 ], [ -73.365678, 44.826451 ], [ -73.369647, 44.829136 ], [ -73.371329, 44.830742 ], [ -73.375345, 44.836307 ], [ -73.378717, 44.837358 ], [ -73.379452, 44.838010 ], [ -73.381359, 44.845021 ], [ -73.381397, 44.848805 ], [ -73.379822, 44.857037 ], [ -73.375709, 44.860745 ], [ -73.371967, 44.862414 ], [ -73.369103, 44.866680 ], [ -73.366459, 44.875040 ], [ -73.362229, 44.891463 ], [ -73.360327, 44.897236 ], [ -73.358080, 44.901325 ], [ -73.356218, 44.904492 ], [ -73.353657, 44.907346 ], [ -73.347837, 44.911309 ], [ -73.341106, 44.914632 ], [ -73.338979, 44.917681 ], [ -73.338482, 44.924112 ], [ -73.339603, 44.943370 ], [ -73.337906, 44.960541 ], [ -73.338243, 44.964750 ], [ -73.338734, 44.965886 ], [ -73.344740, 44.970468 ], [ -73.350218, 44.976222 ], [ -73.352886, 44.980644 ], [ -73.354112, 44.984062 ], [ -73.354633, 44.987352 ], [ -73.353429, 44.990165 ], [ -73.350188, 44.994304 ], [ -73.343124, 45.010840 ], [ -73.249323, 45.012181 ], [ -73.241061, 45.012752 ], [ -73.085972, 45.015494 ], [ -73.084969, 45.014751 ], [ -73.065098, 45.014786 ], [ -73.059685, 45.015869 ], [ -73.052438, 45.015721 ], [ -73.048386, 45.014790 ], [ -73.015539, 45.015072 ], [ -73.014766, 45.014980 ], [ -72.968039, 45.014098 ], [ -72.936440, 45.014267 ], [ -72.936365, 45.014656 ], [ -72.930599, 45.015152 ], [ -72.845633, 45.016659 ], [ -72.777306, 45.015873 ], [ -72.674770, 45.015459 ], [ -72.589880, 45.013237 ], [ -72.586752, 45.012881 ], [ -72.582371, 45.011543 ], [ -72.555912, 45.008304 ], [ -72.532503, 45.007860 ], [ -72.481033, 45.008870 ], [ -72.448865, 45.008537 ], [ -72.401298, 45.006589 ], [ -72.348583, 45.005625 ], [ -72.310073, 45.003822 ], [ -72.291866, 45.004496 ], [ -72.270869, 45.004186 ], [ -72.160506, 45.006185 ], [ -72.103058, 45.005598 ], [ -72.052169, 45.006369 ], [ -72.033614, 45.008878 ], [ -72.029739, 45.006782 ], [ -72.023292, 45.006792 ], [ -71.986705, 45.007872 ], [ -71.947201, 45.008359 ], [ -71.915009, 45.007791 ], [ -71.767452, 45.011437 ], [ -71.691898, 45.011419 ], [ -71.609840, 45.012709 ], [ -71.560562, 45.012555 ], [ -71.502487, 45.013367 ], [ -71.464555, 45.013637 ], [ -71.466247, 45.011959 ], [ -71.473269, 45.010586 ], [ -71.476168, 45.009054 ], [ -71.477907, 45.007453 ], [ -71.479611, 45.002905 ], [ -71.487565, 45.000936 ], [ -71.497412, 45.003878 ], [ -71.501055, 45.006742 ], [ -71.505000, 45.008151 ], [ -71.507767, 45.008170 ], [ -71.514609, 45.003957 ], [ -71.520022, 45.002291 ], [ -71.525016, 45.001881 ], [ -71.530091, 44.999656 ], [ -71.536980, 44.994177 ], [ -71.538592, 44.988182 ], [ -71.537784, 44.984298 ], [ -71.531605, 44.976023 ], [ -71.527163, 44.973668 ], [ -71.522370, 44.966308 ], [ -71.516223, 44.964569 ], [ -71.514843, 44.958741 ], [ -71.516814, 44.947588 ], [ -71.515498, 44.943520 ], [ -71.516144, 44.940846 ], [ -71.516949, 44.939704 ], [ -71.515189, 44.927317 ], [ -71.509207, 44.923429 ], [ -71.504483, 44.919062 ], [ -71.500788, 44.914535 ], [ -71.494403, 44.911837 ], [ -71.493920, 44.910923 ], [ -71.495844, 44.904980 ], [ -71.496968, 44.904225 ], [ -71.499528, 44.904774 ], [ -71.501088, 44.904433 ], [ -71.502473, 44.902720 ], [ -71.508642, 44.897703 ], [ -71.513870, 44.894648 ], [ -71.514350, 44.893964 ], [ -71.514090, 44.893149 ], [ -71.511712, 44.891571 ], [ -71.512292, 44.890246 ], [ -71.522393, 44.880811 ], [ -71.526638, 44.879098 ], [ -71.528342, 44.877819 ], [ -71.528889, 44.876928 ], [ -71.529154, 44.873559 ], [ -71.534588, 44.869698 ], [ -71.540116, 44.868625 ], [ -71.545901, 44.866134 ], [ -71.549533, 44.862592 ], [ -71.550176, 44.861609 ], [ -71.550304, 44.859552 ], [ -71.548377, 44.857016 ], [ -71.548345, 44.855530 ], [ -71.553656, 44.852123 ], [ -71.555600, 44.850547 ], [ -71.556805, 44.848808 ], [ -71.556750, 44.846862 ], [ -71.555036, 44.845733 ], [ -71.552654, 44.842049 ], [ -71.552005, 44.839208 ], [ -71.552218, 44.837775 ], [ -71.553712, 44.836065 ], [ -71.557672, 44.834421 ], [ -71.562256, 44.824632 ], [ -71.563701, 44.823901 ], [ -71.564760, 44.823901 ], [ -71.565146, 44.824678 ], [ -71.567907, 44.823832 ], [ -71.574314, 44.818079 ], [ -71.575500, 44.816058 ], [ -71.575139, 44.813565 ], [ -71.572864, 44.810383 ], [ -71.569216, 44.808813 ], [ -71.569098, 44.807044 ], [ -71.570402, 44.805276 ], [ -71.573129, 44.797947 ], [ -71.571706, 44.794830 ], [ -71.573247, 44.791882 ], [ -71.578938, 44.786070 ], [ -71.580005, 44.785480 ], [ -71.584392, 44.785733 ], [ -71.592966, 44.782776 ], [ -71.596949, 44.778987 ], [ -71.596680, 44.777416 ], [ -71.595913, 44.776272 ], [ -71.596035, 44.775422 ], [ -71.601471, 44.772067 ], [ -71.604615, 44.767738 ], [ -71.608234, 44.765658 ], [ -71.611767, 44.764345 ], [ -71.614267, 44.760622 ], [ -71.614238, 44.758664 ], [ -71.617941, 44.755883 ], [ -71.623924, 44.755135 ], [ -71.631255, 44.753253 ], [ -71.631883, 44.752463 ], [ -71.631967, 44.750333 ], [ -71.631109, 44.748689 ], [ -71.626909, 44.747224 ], [ -71.625180, 44.743978 ], [ -71.625059, 44.737099 ], [ -71.625638, 44.735065 ], [ -71.625611, 44.730312 ], [ -71.624922, 44.729032 ], [ -71.623266, 44.727795 ], [ -71.622593, 44.727773 ], [ -71.619067, 44.729283 ], [ -71.617656, 44.728918 ], [ -71.617431, 44.728050 ], [ -71.618516, 44.723913 ], [ -71.618355, 44.722610 ], [ -71.613094, 44.718933 ], [ -71.604912, 44.708150 ], [ -71.599750, 44.705318 ], [ -71.599205, 44.703878 ], [ -71.600772, 44.700815 ], [ -71.600772, 44.699901 ], [ -71.600162, 44.698919 ], [ -71.598656, 44.698005 ], [ -71.594136, 44.696932 ], [ -71.594360, 44.695996 ], [ -71.596858, 44.694921 ], [ -71.598042, 44.692818 ], [ -71.596437, 44.687059 ], [ -71.594224, 44.683815 ], [ -71.594671, 44.681643 ], [ -71.596400, 44.679677 ], [ -71.596304, 44.679083 ], [ -71.590024, 44.675543 ], [ -71.587365, 44.674926 ], [ -71.583009, 44.674836 ], [ -71.581983, 44.673533 ], [ -71.582527, 44.672253 ], [ -71.584478, 44.670211 ], [ -71.585645, 44.669277 ], [ -71.585645, 44.667644 ], [ -71.584574, 44.665351 ], [ -71.585246, 44.663523 ], [ -71.586578, 44.661111 ], [ -71.586578, 44.659478 ], [ -71.584848, 44.657816 ], [ -71.582965, 44.656621 ], [ -71.576013, 44.655691 ], [ -71.575710, 44.654574 ], [ -71.576312, 44.653179 ], [ -71.576079, 44.652012 ], [ -71.575145, 44.650612 ], [ -71.572163, 44.650373 ], [ -71.570235, 44.650483 ], [ -71.568677, 44.651537 ], [ -71.567645, 44.653560 ], [ -71.566144, 44.653863 ], [ -71.564411, 44.652827 ], [ -71.561772, 44.650224 ], [ -71.558571, 44.644373 ], [ -71.558026, 44.641791 ], [ -71.558859, 44.640122 ], [ -71.562636, 44.639505 ], [ -71.562636, 44.637266 ], [ -71.562124, 44.636580 ], [ -71.554634, 44.632197 ], [ -71.551722, 44.627598 ], [ -71.553156, 44.626645 ], [ -71.553898, 44.625410 ], [ -71.554666, 44.625387 ], [ -71.555760, 44.624119 ], [ -71.556560, 44.616988 ], [ -71.554097, 44.609583 ], [ -71.553873, 44.607069 ], [ -71.554833, 44.605172 ], [ -71.555781, 44.603483 ], [ -71.556014, 44.601383 ], [ -71.554449, 44.598408 ], [ -71.554614, 44.595784 ], [ -71.553447, 44.593451 ], [ -71.549268, 44.593174 ], [ -71.540601, 44.590453 ], [ -71.536251, 44.588441 ], [ -71.537724, 44.584785 ], [ -71.540123, 44.582522 ], [ -71.544922, 44.579278 ], [ -71.547448, 44.578547 ], [ -71.549270, 44.579164 ], [ -71.551145, 44.580405 ], [ -71.553200, 44.580683 ], [ -71.553699, 44.579628 ], [ -71.553755, 44.578406 ], [ -71.553300, 44.576924 ], [ -71.548952, 44.573084 ], [ -71.548728, 44.571873 ], [ -71.549655, 44.570708 ], [ -71.551670, 44.569657 ], [ -71.552629, 44.569543 ], [ -71.556497, 44.570777 ], [ -71.557972, 44.570451 ], [ -71.558985, 44.568779 ], [ -71.558565, 44.565572 ], [ -71.559846, 44.564119 ], [ -71.563399, 44.563218 ], [ -71.569599, 44.562777 ], [ -71.575519, 44.564775 ], [ -71.590170, 44.565694 ], [ -71.592091, 44.565118 ], [ -71.593923, 44.563813 ], [ -71.596137, 44.560898 ], [ -71.597797, 44.557172 ], [ -71.598116, 44.555412 ], [ -71.596804, 44.553424 ], [ -71.588076, 44.547850 ], [ -71.575193, 44.540859 ], [ -71.573083, 44.537980 ], [ -71.573019, 44.536312 ], [ -71.574456, 44.533660 ], [ -71.576884, 44.530323 ], [ -71.582505, 44.524403 ], [ -71.585731, 44.522665 ], [ -71.587104, 44.522436 ], [ -71.592855, 44.523006 ], [ -71.594259, 44.521680 ], [ -71.593971, 44.519738 ], [ -71.592117, 44.517773 ], [ -71.586909, 44.514666 ], [ -71.585950, 44.513432 ], [ -71.584959, 44.510141 ], [ -71.583233, 44.508268 ], [ -71.577771, 44.504886 ], [ -71.577068, 44.504041 ], [ -71.577643, 44.502692 ], [ -71.578760, 44.501915 ], [ -71.579974, 44.501778 ], [ -71.583870, 44.503217 ], [ -71.586648, 44.502873 ], [ -71.585881, 44.500057 ], [ -71.586972, 44.498526 ], [ -71.589622, 44.498525 ], [ -71.589623, 44.499371 ], [ -71.590256, 44.500057 ], [ -71.591917, 44.500975 ], [ -71.594303, 44.500749 ], [ -71.595027, 44.498669 ], [ -71.595484, 44.494424 ], [ -71.597917, 44.488375 ], [ -71.599480, 44.486455 ], [ -71.609568, 44.484348 ], [ -71.615923, 44.485944 ], [ -71.617614, 44.485715 ], [ -71.619624, 44.484411 ], [ -71.622089, 44.481387 ], [ -71.625019, 44.481784 ], [ -71.625676, 44.483201 ], [ -71.627655, 44.484207 ], [ -71.631007, 44.484323 ], [ -71.632795, 44.483890 ], [ -71.639312, 44.477836 ], [ -71.643111, 44.476649 ], [ -71.645890, 44.475141 ], [ -71.647693, 44.473125 ], [ -71.648178, 44.472023 ], [ -71.647864, 44.469976 ], [ -71.646551, 44.468869 ], [ -71.640847, 44.465935 ], [ -71.640404, 44.464186 ], [ -71.642851, 44.461734 ], [ -71.645068, 44.460545 ], [ -71.652320, 44.461117 ], [ -71.653348, 44.460499 ], [ -71.657313, 44.454003 ], [ -71.659021, 44.444932 ], [ -71.661830, 44.440293 ], [ -71.664191, 44.438351 ], [ -71.668944, 44.436523 ], [ -71.677384, 44.435702 ], [ -71.679263, 44.435018 ], [ -71.679933, 44.434062 ], [ -71.679158, 44.432174 ], [ -71.679950, 44.427908 ], [ -71.685850, 44.423405 ], [ -71.690920, 44.421234 ], [ -71.699434, 44.416069 ], [ -71.708041, 44.411977 ], [ -71.715087, 44.410490 ], [ -71.726199, 44.411385 ], [ -71.731520, 44.411015 ], [ -71.735923, 44.410062 ], [ -71.737836, 44.408921 ], [ -71.739921, 44.406778 ], [ -71.742308, 44.402366 ], [ -71.743104, 44.401657 ], [ -71.745011, 44.401359 ], [ -71.749533, 44.401955 ], [ -71.754340, 44.405577 ], [ -71.756091, 44.406401 ], [ -71.761966, 44.407027 ], [ -71.764977, 44.406587 ], [ -71.767888, 44.405445 ], [ -71.772801, 44.403097 ], [ -71.775399, 44.401126 ], [ -71.778613, 44.399799 ], [ -71.790688, 44.400260 ], [ -71.793924, 44.399271 ], [ -71.802353, 44.393380 ], [ -71.803488, 44.391890 ], [ -71.803489, 44.390384 ], [ -71.799899, 44.385951 ], [ -71.800316, 44.384276 ], [ -71.803461, 44.383335 ], [ -71.808828, 44.383862 ], [ -71.813130, 44.382801 ], [ -71.814388, 44.381932 ], [ -71.815773, 44.375464 ], [ -71.815251, 44.374594 ], [ -71.812424, 44.372532 ], [ -71.812235, 44.371492 ], [ -71.812832, 44.370448 ], [ -71.815490, 44.368836 ], [ -71.816157, 44.367559 ], [ -71.814991, 44.363686 ], [ -71.812473, 44.358477 ], [ -71.812206, 44.357356 ], [ -71.812902, 44.355547 ], [ -71.814351, 44.354541 ], [ -71.818838, 44.352939 ], [ -71.826246, 44.352006 ], [ -71.833261, 44.350136 ], [ -71.844319, 44.344204 ], [ -71.852628, 44.340873 ], [ -71.861941, 44.340109 ], [ -71.869910, 44.336962 ], [ -71.872472, 44.336628 ], [ -71.875863, 44.337370 ], [ -71.881895, 44.340209 ], [ -71.902332, 44.347499 ], [ -71.906909, 44.348284 ], [ -71.917434, 44.346535 ], [ -71.925088, 44.342024 ], [ -71.929110, 44.337577 ], [ -71.935395, 44.335770 ], [ -71.939049, 44.335844 ], [ -71.945163, 44.337744 ], [ -71.958119, 44.337544 ], [ -71.963133, 44.336556 ], [ -71.981120, 44.337500 ], [ -71.984617, 44.336243 ], [ -71.986484, 44.331218 ], [ -71.988306, 44.329768 ], [ -72.002314, 44.324871 ], [ -72.009977, 44.321951 ], [ -72.014543, 44.321032 ], [ -72.019130, 44.320383 ], [ -72.025783, 44.322054 ], [ -72.029061, 44.322398 ], [ -72.033136, 44.320365 ], [ -72.033806, 44.317349 ], [ -72.032341, 44.315752 ], [ -72.032317, 44.306677 ], [ -72.032541, 44.303752 ], [ -72.033465, 44.301878 ], [ -72.037030, 44.297834 ], [ -72.039004, 44.296463 ], [ -72.046302, 44.291983 ], [ -72.053355, 44.290501 ], [ -72.058880, 44.286240 ], [ -72.065434, 44.277235 ], [ -72.067774, 44.270976 ], [ -72.066464, 44.268331 ], [ -72.064544, 44.267997 ], [ -72.060846, 44.269972 ], [ -72.058740, 44.270005 ], [ -72.058475, 44.267886 ], [ -72.058969, 44.265911 ], [ -72.059832, 44.264984 ], [ -72.060378, 44.264951 ], [ -72.061174, 44.263377 ], [ -72.059782, 44.256018 ], [ -72.053990, 44.246926 ], [ -72.050112, 44.244046 ], [ -72.048460, 44.241212 ], [ -72.047889, 44.238493 ], [ -72.050656, 44.233581 ], [ -72.053582, 44.226040 ], [ -72.053900, 44.222703 ], [ -72.052662, 44.218841 ], [ -72.053233, 44.216876 ], [ -72.058605, 44.208215 ], [ -72.058066, 44.206067 ], [ -72.058987, 44.202114 ], [ -72.060067, 44.200446 ], [ -72.063561, 44.198457 ], [ -72.064577, 44.196949 ], [ -72.066166, 44.189773 ], [ -72.061338, 44.184951 ], [ -72.057496, 44.179444 ], [ -72.053021, 44.167903 ], [ -72.047593, 44.161801 ], [ -72.042387, 44.160817 ], [ -72.040167, 44.157023 ], [ -72.040082, 44.155749 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US51", "STATE": "51", "NAME": "Virginia", "LSAD": "", "CENSUSAREA": 39490.086000 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -76.046530, 37.953586 ], [ -76.041691, 37.954000 ], [ -76.041402, 37.954006 ], [ -76.030122, 37.953655 ], [ -76.029463, 37.953775 ], [ -76.021714, 37.953887 ], [ -76.020932, 37.953879 ], [ -75.993905, 37.953489 ], [ -76.003130, 37.947997 ], [ -76.017592, 37.935161 ], [ -76.032491, 37.915008 ], [ -76.035802, 37.929008 ], [ -76.046530, 37.953586 ] ] ], [ [ [ -75.242266, 38.027209 ], [ -75.296871, 37.959043 ], [ -75.319335, 37.922484 ], [ -75.334296, 37.893477 ], [ -75.349338, 37.873143 ], [ -75.359036, 37.864143 ], [ -75.366830, 37.859446 ], [ -75.381376, 37.852711 ], [ -75.392008, 37.867738 ], [ -75.400540, 37.874865 ], [ -75.428956, 37.875305 ], [ -75.437868, 37.872324 ], [ -75.452681, 37.863510 ], [ -75.467951, 37.851328 ], [ -75.487485, 37.832136 ], [ -75.514921, 37.799149 ], [ -75.548082, 37.742383 ], [ -75.556868, 37.724410 ], [ -75.572464, 37.701565 ], [ -75.581333, 37.683593 ], [ -75.586136, 37.660653 ], [ -75.603220, 37.620243 ], [ -75.610808, 37.605909 ], [ -75.611683, 37.593469 ], [ -75.601018, 37.586489 ], [ -75.595716, 37.576657 ], [ -75.594044, 37.569698 ], [ -75.606720, 37.557170 ], [ -75.633370, 37.522140 ], [ -75.666178, 37.472124 ], [ -75.665499, 37.467318 ], [ -75.657623, 37.462372 ], [ -75.655634, 37.446959 ], [ -75.665957, 37.439209 ], [ -75.672648, 37.429915 ], [ -75.697914, 37.405301 ], [ -75.720739, 37.373129 ], [ -75.727335, 37.360346 ], [ -75.725634, 37.358416 ], [ -75.726691, 37.350127 ], [ -75.735829, 37.335426 ], [ -75.765401, 37.305596 ], [ -75.778817, 37.297176 ], [ -75.780766, 37.297222 ], [ -75.784634, 37.300976 ], [ -75.791913, 37.300589 ], [ -75.798448, 37.296285 ], [ -75.790830, 37.276207 ], [ -75.799343, 37.251779 ], [ -75.795881, 37.236922 ], [ -75.790386, 37.231225 ], [ -75.789929, 37.228134 ], [ -75.790903, 37.225066 ], [ -75.804446, 37.208011 ], [ -75.800468, 37.201029 ], [ -75.800755, 37.197297 ], [ -75.830341, 37.170600 ], [ -75.877670, 37.135604 ], [ -75.886369, 37.126085 ], [ -75.897298, 37.118037 ], [ -75.906734, 37.114193 ], [ -75.920444, 37.110679 ], [ -75.924225, 37.113085 ], [ -75.913222, 37.119849 ], [ -75.925520, 37.133601 ], [ -75.942539, 37.125142 ], [ -75.945872, 37.120514 ], [ -75.962596, 37.117535 ], [ -75.943915, 37.103885 ], [ -75.939790, 37.089449 ], [ -75.956976, 37.081888 ], [ -75.975536, 37.085669 ], [ -75.981722, 37.099073 ], [ -75.970430, 37.118608 ], [ -75.970004, 37.128861 ], [ -75.978083, 37.157338 ], [ -75.998647, 37.188739 ], [ -76.006094, 37.194810 ], [ -76.013071, 37.205366 ], [ -76.013778, 37.219263 ], [ -76.010535, 37.231579 ], [ -76.014026, 37.235381 ], [ -76.025753, 37.257407 ], [ -76.023664, 37.268971 ], [ -76.015507, 37.280874 ], [ -76.023475, 37.289067 ], [ -76.018645, 37.317820 ], [ -76.014251, 37.331943 ], [ -75.997778, 37.351739 ], [ -75.987122, 37.368548 ], [ -75.979970, 37.404608 ], [ -75.983105, 37.415802 ], [ -75.981624, 37.434116 ], [ -75.976491, 37.444878 ], [ -75.960877, 37.467562 ], [ -75.963496, 37.475352 ], [ -75.963326, 37.481785 ], [ -75.958966, 37.500133 ], [ -75.949974, 37.521876 ], [ -75.940318, 37.534582 ], [ -75.937299, 37.551729 ], [ -75.941153, 37.558436 ], [ -75.941182, 37.563839 ], [ -75.924756, 37.600215 ], [ -75.909586, 37.622671 ], [ -75.877059, 37.660641 ], [ -75.868481, 37.668224 ], [ -75.869523, 37.674356 ], [ -75.868355, 37.687609 ], [ -75.859262, 37.703111 ], [ -75.845579, 37.707993 ], [ -75.837685, 37.712985 ], [ -75.830773, 37.725486 ], [ -75.831438, 37.731690 ], [ -75.827922, 37.737986 ], [ -75.824810, 37.741671 ], [ -75.812155, 37.749502 ], [ -75.803041, 37.762464 ], [ -75.812125, 37.776589 ], [ -75.818125, 37.791698 ], [ -75.793399, 37.804493 ], [ -75.784599, 37.806826 ], [ -75.770607, 37.804602 ], [ -75.743097, 37.806656 ], [ -75.735880, 37.816561 ], [ -75.723224, 37.820124 ], [ -75.716590, 37.826696 ], [ -75.714487, 37.837777 ], [ -75.709114, 37.847700 ], [ -75.702914, 37.849659 ], [ -75.689837, 37.861817 ], [ -75.685293, 37.873341 ], [ -75.687584, 37.886340 ], [ -75.709626, 37.900622 ], [ -75.720490, 37.901926 ], [ -75.724505, 37.900184 ], [ -75.726699, 37.897299 ], [ -75.753048, 37.896605 ], [ -75.758796, 37.897615 ], [ -75.759835, 37.899333 ], [ -75.757694, 37.903912 ], [ -75.712065, 37.936082 ], [ -75.704318, 37.929010 ], [ -75.693942, 37.930362 ], [ -75.669711, 37.950796 ], [ -75.665012, 37.949387 ], [ -75.655681, 37.945435 ], [ -75.647606, 37.947027 ], [ -75.648229, 37.966775 ], [ -75.644725, 37.969779 ], [ -75.641823, 37.975967 ], [ -75.638221, 37.979397 ], [ -75.635736, 37.979536 ], [ -75.634209, 37.977672 ], [ -75.632010, 37.976020 ], [ -75.630992, 37.975667 ], [ -75.629532, 37.975966 ], [ -75.628839, 37.976789 ], [ -75.628855, 37.977798 ], [ -75.633712, 37.983057 ], [ -75.633833, 37.984519 ], [ -75.632532, 37.986693 ], [ -75.630869, 37.987818 ], [ -75.627607, 37.988521 ], [ -75.625612, 37.989800 ], [ -75.624341, 37.994211 ], [ -75.435956, 38.010282 ], [ -75.428810, 38.010854 ], [ -75.398839, 38.013277 ], [ -75.242266, 38.027209 ] ] ], [ [ [ -75.973607, 37.835817 ], [ -75.971705, 37.830928 ], [ -75.977301, 37.825821 ], [ -75.982158, 37.806226 ], [ -75.987301, 37.804917 ], [ -75.998300, 37.812626 ], [ -76.001116, 37.834947 ], [ -75.999658, 37.848198 ], [ -75.996859, 37.850420 ], [ -75.992556, 37.848889 ], [ -75.988018, 37.841085 ], [ -75.982098, 37.837253 ], [ -75.973607, 37.835817 ] ] ], [ [ [ -82.565329, 37.196118 ], [ -82.558178, 37.199606 ], [ -82.553835, 37.202841 ], [ -82.550372, 37.204458 ], [ -82.545804, 37.203070 ], [ -82.541302, 37.206530 ], [ -82.536627, 37.206920 ], [ -82.531576, 37.209163 ], [ -82.532051, 37.210808 ], [ -82.531787, 37.212097 ], [ -82.528746, 37.213742 ], [ -82.524464, 37.214957 ], [ -82.520117, 37.212906 ], [ -82.509431, 37.218924 ], [ -82.508062, 37.220964 ], [ -82.508342, 37.222385 ], [ -82.507895, 37.222727 ], [ -82.498858, 37.227044 ], [ -82.496308, 37.227562 ], [ -82.495243, 37.225606 ], [ -82.491486, 37.225086 ], [ -82.487219, 37.227799 ], [ -82.487317, 37.230578 ], [ -82.486439, 37.231204 ], [ -82.473275, 37.235569 ], [ -82.463073, 37.238292 ], [ -82.457016, 37.238288 ], [ -82.451998, 37.242559 ], [ -82.449164, 37.243908 ], [ -82.435728, 37.246491 ], [ -82.431022, 37.246773 ], [ -82.418085, 37.251331 ], [ -82.385663, 37.259631 ], [ -82.383285, 37.260154 ], [ -82.376595, 37.259900 ], [ -82.364535, 37.264415 ], [ -82.355343, 37.265220 ], [ -82.350948, 37.267077 ], [ -82.342068, 37.274109 ], [ -82.341849, 37.280886 ], [ -82.336942, 37.279737 ], [ -82.331570, 37.282211 ], [ -82.324619, 37.283180 ], [ -82.318957, 37.287524 ], [ -82.317395, 37.290975 ], [ -82.317083, 37.293635 ], [ -82.316028, 37.294879 ], [ -82.309415, 37.300066 ], [ -82.291908, 37.311642 ], [ -82.254352, 37.337745 ], [ -82.202688, 37.374041 ], [ -82.201745, 37.375108 ], [ -82.124854, 37.427272 ], [ -82.062809, 37.470911 ], [ -82.050888, 37.480527 ], [ -81.968297, 37.537798 ], [ -81.969279, 37.534325 ], [ -81.967583, 37.532815 ], [ -81.959362, 37.535220 ], [ -81.957379, 37.535198 ], [ -81.956947, 37.534259 ], [ -81.957436, 37.533206 ], [ -81.957693, 37.529841 ], [ -81.956630, 37.528490 ], [ -81.953524, 37.528056 ], [ -81.946022, 37.531742 ], [ -81.944010, 37.530964 ], [ -81.943981, 37.530300 ], [ -81.947545, 37.527530 ], [ -81.947660, 37.525080 ], [ -81.947085, 37.523913 ], [ -81.943693, 37.521212 ], [ -81.943779, 37.519609 ], [ -81.945475, 37.516610 ], [ -81.944756, 37.513657 ], [ -81.943865, 37.512879 ], [ -81.941968, 37.512306 ], [ -81.938749, 37.512902 ], [ -81.936996, 37.514230 ], [ -81.933088, 37.518968 ], [ -81.926391, 37.514207 ], [ -81.926736, 37.513040 ], [ -81.927870, 37.512118 ], [ -81.932279, 37.511961 ], [ -81.941151, 37.509483 ], [ -81.943045, 37.508609 ], [ -81.944188, 37.506976 ], [ -81.943912, 37.502929 ], [ -81.945957, 37.501901 ], [ -81.949188, 37.502376 ], [ -81.951831, 37.502050 ], [ -81.953147, 37.501314 ], [ -81.954077, 37.499822 ], [ -81.954364, 37.496084 ], [ -81.954167, 37.495302 ], [ -81.952735, 37.494162 ], [ -81.952681, 37.492274 ], [ -81.953264, 37.491763 ], [ -81.957213, 37.491504 ], [ -81.964986, 37.493488 ], [ -81.970730, 37.489904 ], [ -81.977593, 37.484603 ], [ -81.979169, 37.484604 ], [ -81.980327, 37.485447 ], [ -81.985703, 37.485681 ], [ -81.989849, 37.484879 ], [ -81.992916, 37.482969 ], [ -81.996578, 37.476705 ], [ -81.995649, 37.469833 ], [ -81.992270, 37.460916 ], [ -81.987006, 37.454878 ], [ -81.984891, 37.454315 ], [ -81.980013, 37.457210 ], [ -81.976176, 37.457186 ], [ -81.968795, 37.451496 ], [ -81.969342, 37.450324 ], [ -81.965582, 37.446918 ], [ -81.958672, 37.448045 ], [ -81.949367, 37.445687 ], [ -81.945765, 37.440214 ], [ -81.942856, 37.439929 ], [ -81.941175, 37.440485 ], [ -81.938843, 37.440463 ], [ -81.935621, 37.438397 ], [ -81.935316, 37.436390 ], [ -81.937838, 37.432111 ], [ -81.940553, 37.429058 ], [ -81.936950, 37.419920 ], [ -81.932468, 37.415217 ], [ -81.923481, 37.411379 ], [ -81.924506, 37.407613 ], [ -81.925764, 37.406874 ], [ -81.927338, 37.406844 ], [ -81.930042, 37.405291 ], [ -81.930786, 37.401656 ], [ -81.928280, 37.398059 ], [ -81.928778, 37.393845 ], [ -81.933601, 37.389217 ], [ -81.936744, 37.380730 ], [ -81.935872, 37.378554 ], [ -81.933880, 37.377796 ], [ -81.932763, 37.374229 ], [ -81.933895, 37.372747 ], [ -81.930194, 37.366728 ], [ -81.929915, 37.366589 ], [ -81.926697, 37.364618 ], [ -81.928497, 37.360645 ], [ -81.926589, 37.358942 ], [ -81.925643, 37.357316 ], [ -81.921571, 37.356423 ], [ -81.920711, 37.355416 ], [ -81.920279, 37.353402 ], [ -81.916678, 37.349346 ], [ -81.911951, 37.349339 ], [ -81.911487, 37.348839 ], [ -81.910875, 37.348729 ], [ -81.907895, 37.343783 ], [ -81.907322, 37.343119 ], [ -81.906368, 37.342760 ], [ -81.905945, 37.342775 ], [ -81.903795, 37.343050 ], [ -81.902992, 37.342340 ], [ -81.899495, 37.341102 ], [ -81.899459, 37.340277 ], [ -81.896001, 37.331967 ], [ -81.895489, 37.332022 ], [ -81.894797, 37.332012 ], [ -81.894768, 37.331381 ], [ -81.893773, 37.330105 ], [ -81.892876, 37.330134 ], [ -81.887722, 37.331156 ], [ -81.886952, 37.330725 ], [ -81.885075, 37.330665 ], [ -81.880886, 37.331146 ], [ -81.879601, 37.332074 ], [ -81.878713, 37.331753 ], [ -81.878343, 37.328837 ], [ -81.873213, 37.325065 ], [ -81.872662, 37.323314 ], [ -81.870180, 37.320667 ], [ -81.867425, 37.320838 ], [ -81.860267, 37.315715 ], [ -81.859928, 37.313965 ], [ -81.863712, 37.312230 ], [ -81.865429, 37.310120 ], [ -81.865683, 37.309484 ], [ -81.865219, 37.308839 ], [ -81.864760, 37.308404 ], [ -81.862031, 37.305648 ], [ -81.859624, 37.304765 ], [ -81.856032, 37.306742 ], [ -81.854460, 37.306570 ], [ -81.853645, 37.300779 ], [ -81.853978, 37.300418 ], [ -81.854465, 37.299937 ], [ -81.853488, 37.294763 ], [ -81.854059, 37.291352 ], [ -81.853551, 37.287701 ], [ -81.849949, 37.285227 ], [ -81.846807, 37.284649 ], [ -81.843167, 37.285586 ], [ -81.842310, 37.285556 ], [ -81.838762, 37.286343 ], [ -81.834432, 37.285416 ], [ -81.833406, 37.284535 ], [ -81.834387, 37.283086 ], [ -81.834470, 37.281763 ], [ -81.825065, 37.279536 ], [ -81.819625, 37.279411 ], [ -81.816702, 37.279865 ], [ -81.813222, 37.281091 ], [ -81.810559, 37.282980 ], [ -81.809184, 37.283003 ], [ -81.807232, 37.283175 ], [ -81.805382, 37.285622 ], [ -81.803275, 37.285916 ], [ -81.793595, 37.284838 ], [ -81.793115, 37.283538 ], [ -81.793639, 37.282188 ], [ -81.793425, 37.281674 ], [ -81.789294, 37.284416 ], [ -81.783122, 37.282580 ], [ -81.779362, 37.279982 ], [ -81.779350, 37.277394 ], [ -81.777319, 37.275873 ], [ -81.774747, 37.274847 ], [ -81.774684, 37.274807 ], [ -81.767837, 37.274216 ], [ -81.765195, 37.275099 ], [ -81.763836, 37.275218 ], [ -81.762776, 37.275391 ], [ -81.761752, 37.275713 ], [ -81.760220, 37.275254 ], [ -81.757631, 37.274003 ], [ -81.757730, 37.271934 ], [ -81.757714, 37.271124 ], [ -81.757531, 37.270010 ], [ -81.755012, 37.267720 ], [ -81.752912, 37.266614 ], [ -81.752123, 37.265568 ], [ -81.751290, 37.265131 ], [ -81.747656, 37.264329 ], [ -81.746109, 37.263597 ], [ -81.745505, 37.261330 ], [ -81.745445, 37.258125 ], [ -81.743008, 37.255127 ], [ -81.741662, 37.254784 ], [ -81.740974, 37.254052 ], [ -81.743505, 37.247601 ], [ -81.743420, 37.245858 ], [ -81.744291, 37.244178 ], [ -81.744003, 37.242528 ], [ -81.738543, 37.238264 ], [ -81.733320, 37.238127 ], [ -81.728194, 37.239823 ], [ -81.726171, 37.240522 ], [ -81.723061, 37.240493 ], [ -81.719554, 37.237785 ], [ -81.716248, 37.234321 ], [ -81.715730, 37.228771 ], [ -81.698954, 37.218201 ], [ -81.695113, 37.213570 ], [ -81.686717, 37.213105 ], [ -81.683544, 37.211452 ], [ -81.684012, 37.211098 ], [ -81.683268, 37.205649 ], [ -81.681379, 37.203634 ], [ -81.678603, 37.202467 ], [ -81.678210, 37.201483 ], [ -81.560625, 37.206663 ], [ -81.558353, 37.208145 ], [ -81.557315, 37.207697 ], [ -81.556892, 37.207275 ], [ -81.556119, 37.207413 ], [ -81.553600, 37.208443 ], [ -81.549248, 37.213732 ], [ -81.545211, 37.220165 ], [ -81.544437, 37.220761 ], [ -81.533070, 37.223414 ], [ -81.527458, 37.225817 ], [ -81.520729, 37.226914 ], [ -81.508786, 37.232564 ], [ -81.507325, 37.233800 ], [ -81.506260, 37.239272 ], [ -81.506428, 37.244469 ], [ -81.504880, 37.247697 ], [ -81.504168, 37.250115 ], [ -81.503190, 37.252579 ], [ -81.498874, 37.258025 ], [ -81.497775, 37.257899 ], [ -81.497773, 37.257190 ], [ -81.498445, 37.256568 ], [ -81.498045, 37.254659 ], [ -81.495738, 37.252393 ], [ -81.492287, 37.250960 ], [ -81.483559, 37.250604 ], [ -81.480144, 37.251121 ], [ -81.476431, 37.255127 ], [ -81.462107, 37.259899 ], [ -81.460000, 37.262547 ], [ -81.459874, 37.263901 ], [ -81.460585, 37.265527 ], [ -81.458895, 37.266466 ], [ -81.454199, 37.266999 ], [ -81.449068, 37.269583 ], [ -81.448285, 37.270575 ], [ -81.432850, 37.272697 ], [ -81.427946, 37.271015 ], [ -81.416663, 37.273214 ], [ -81.411593, 37.280330 ], [ -81.409577, 37.284025 ], [ -81.409729, 37.284837 ], [ -81.409196, 37.286071 ], [ -81.403764, 37.296597 ], [ -81.405060, 37.298794 ], [ -81.402195, 37.301660 ], [ -81.398185, 37.302965 ], [ -81.396817, 37.304498 ], [ -81.397357, 37.306358 ], [ -81.398702, 37.307806 ], [ -81.398548, 37.310635 ], [ -81.394287, 37.316411 ], [ -81.388132, 37.319903 ], [ -81.386727, 37.320474 ], [ -81.385810, 37.320085 ], [ -81.384914, 37.318832 ], [ -81.384127, 37.318596 ], [ -81.380159, 37.317838 ], [ -81.377349, 37.318447 ], [ -81.374455, 37.318614 ], [ -81.372610, 37.320195 ], [ -81.371315, 37.324115 ], [ -81.367599, 37.327569 ], [ -81.368030, 37.329447 ], [ -81.369264, 37.330568 ], [ -81.369379, 37.331827 ], [ -81.368090, 37.332423 ], [ -81.367052, 37.334504 ], [ -81.366315, 37.335927 ], [ -81.362156, 37.337687 ], [ -81.320105, 37.299323 ], [ -81.225104, 37.234874 ], [ -81.204774, 37.243013 ], [ -81.178151, 37.257979 ], [ -81.167029, 37.262881 ], [ -81.158964, 37.265382 ], [ -81.142404, 37.269165 ], [ -81.112596, 37.278497 ], [ -81.094820, 37.282640 ], [ -81.084012, 37.284401 ], [ -81.037191, 37.290251 ], [ -81.021937, 37.294143 ], [ -81.008457, 37.296073 ], [ -81.000576, 37.297868 ], [ -80.996013, 37.299545 ], [ -80.979589, 37.302279 ], [ -80.979106, 37.300581 ], [ -80.982173, 37.296023 ], [ -80.981322, 37.293465 ], [ -80.980146, 37.292743 ], [ -80.973889, 37.291444 ], [ -80.966556, 37.292158 ], [ -80.947896, 37.295872 ], [ -80.938135, 37.300278 ], [ -80.931118, 37.302872 ], [ -80.927040, 37.303683 ], [ -80.919259, 37.306163 ], [ -80.900535, 37.315000 ], [ -80.880103, 37.328903 ], [ -80.868986, 37.338573 ], [ -80.865321, 37.340523 ], [ -80.849451, 37.346909 ], [ -80.883248, 37.383933 ], [ -80.862761, 37.411829 ], [ -80.864455, 37.414180 ], [ -80.865174, 37.416996 ], [ -80.865148, 37.419927 ], [ -80.863142, 37.424644 ], [ -80.859556, 37.429568 ], [ -80.858360, 37.428168 ], [ -80.856997, 37.427052 ], [ -80.853163, 37.426902 ], [ -80.850656, 37.426062 ], [ -80.846324, 37.423394 ], [ -80.844213, 37.423555 ], [ -80.841672, 37.425971 ], [ -80.837678, 37.425658 ], [ -80.836446, 37.424355 ], [ -80.811639, 37.407507 ], [ -80.808769, 37.406271 ], [ -80.806358, 37.404119 ], [ -80.807134, 37.401348 ], [ -80.806129, 37.398074 ], [ -80.800447, 37.395738 ], [ -80.798869, 37.395807 ], [ -80.790317, 37.395668 ], [ -80.784188, 37.394587 ], [ -80.783324, 37.392793 ], [ -80.783382, 37.390649 ], [ -80.782295, 37.389016 ], [ -80.776766, 37.384131 ], [ -80.776649, 37.383679 ], [ -80.770082, 37.372363 ], [ -80.759886, 37.374882 ], [ -80.748722, 37.380050 ], [ -80.745527, 37.380111 ], [ -80.738040, 37.382547 ], [ -80.731589, 37.384710 ], [ -80.723596, 37.388261 ], [ -80.715479, 37.390707 ], [ -80.705203, 37.394618 ], [ -80.691709, 37.401749 ], [ -80.684576, 37.404630 ], [ -80.664971, 37.414215 ], [ -80.664112, 37.414220 ], [ -80.656687, 37.417585 ], [ -80.653589, 37.419514 ], [ -80.645893, 37.422147 ], [ -80.636947, 37.427471 ], [ -80.637554, 37.428556 ], [ -80.637379, 37.429372 ], [ -80.634390, 37.431227 ], [ -80.632365, 37.432125 ], [ -80.626365, 37.433328 ], [ -80.622664, 37.433307 ], [ -80.622117, 37.435969 ], [ -80.616802, 37.439443 ], [ -80.600204, 37.446173 ], [ -80.591377, 37.451440 ], [ -80.590240, 37.453296 ], [ -80.585856, 37.456654 ], [ -80.566297, 37.466575 ], [ -80.561442, 37.469775 ], [ -80.552036, 37.473563 ], [ -80.544836, 37.474695 ], [ -80.539786, 37.474527 ], [ -80.533449, 37.476406 ], [ -80.532372, 37.477124 ], [ -80.528349, 37.477368 ], [ -80.523481, 37.476905 ], [ -80.515139, 37.478566 ], [ -80.513409, 37.479446 ], [ -80.511391, 37.481672 ], [ -80.492981, 37.457749 ], [ -80.497280, 37.444779 ], [ -80.494867, 37.435070 ], [ -80.475601, 37.422949 ], [ -80.464820, 37.426144 ], [ -80.457313, 37.432267 ], [ -80.451367, 37.434039 ], [ -80.443025, 37.438126 ], [ -80.425656, 37.449876 ], [ -80.402816, 37.460322 ], [ -80.399880, 37.462314 ], [ -80.382535, 37.470367 ], [ -80.378308, 37.471381 ], [ -80.371952, 37.474069 ], [ -80.369449, 37.476599 ], [ -80.363170, 37.480001 ], [ -80.366838, 37.484879 ], [ -80.343789, 37.492148 ], [ -80.332038, 37.493744 ], [ -80.327103, 37.495376 ], [ -80.320627, 37.498880 ], [ -80.314806, 37.500943 ], [ -80.309331, 37.502880 ], [ -80.309833, 37.503827 ], [ -80.299789, 37.508271 ], [ -80.282385, 37.533517 ], [ -80.291644, 37.536505 ], [ -80.309346, 37.527381 ], [ -80.330306, 37.536244 ], [ -80.327489, 37.540022 ], [ -80.324384, 37.541052 ], [ -80.321249, 37.541419 ], [ -80.314464, 37.544120 ], [ -80.312393, 37.546239 ], [ -80.328504, 37.564315 ], [ -80.294882, 37.578770 ], [ -80.282440, 37.585481 ], [ -80.270342, 37.591149 ], [ -80.263560, 37.593374 ], [ -80.258919, 37.595499 ], [ -80.249780, 37.602117 ], [ -80.240272, 37.606961 ], [ -80.226017, 37.620059 ], [ -80.223386, 37.623185 ], [ -80.220984, 37.627767 ], [ -80.239288, 37.637672 ], [ -80.254431, 37.642352 ], [ -80.254469, 37.642333 ], [ -80.263281, 37.645082 ], [ -80.263291, 37.645101 ], [ -80.264830, 37.645526 ], [ -80.264874, 37.645511 ], [ -80.267228, 37.646011 ], [ -80.267455, 37.646108 ], [ -80.270352, 37.648929 ], [ -80.270323, 37.648982 ], [ -80.279372, 37.657077 ], [ -80.292258, 37.683732 ], [ -80.292337, 37.683976 ], [ -80.296138, 37.691783 ], [ -80.294108, 37.693852 ], [ -80.287107, 37.696403 ], [ -80.275007, 37.707844 ], [ -80.271990, 37.711532 ], [ -80.264406, 37.718786 ], [ -80.258143, 37.720612 ], [ -80.253077, 37.725899 ], [ -80.252227, 37.727261 ], [ -80.252024, 37.729825 ], [ -80.260313, 37.733517 ], [ -80.262765, 37.738336 ], [ -80.257411, 37.756084 ], [ -80.256410, 37.756372 ], [ -80.251622, 37.755866 ], [ -80.249790, 37.757111 ], [ -80.250427, 37.761301 ], [ -80.251319, 37.762958 ], [ -80.246902, 37.768309 ], [ -80.241390, 37.769443 ], [ -80.232011, 37.775621 ], [ -80.230458, 37.778305 ], [ -80.227498, 37.778889 ], [ -80.221827, 37.778293 ], [ -80.217634, 37.776775 ], [ -80.216899, 37.776056 ], [ -80.216498, 37.776445 ], [ -80.215658, 37.777481 ], [ -80.215892, 37.781989 ], [ -80.218616, 37.783291 ], [ -80.220092, 37.783160 ], [ -80.227965, 37.791714 ], [ -80.229489, 37.792331 ], [ -80.229228, 37.794660 ], [ -80.227092, 37.798886 ], [ -80.218611, 37.809783 ], [ -80.216939, 37.809505 ], [ -80.216229, 37.809820 ], [ -80.210965, 37.812598 ], [ -80.206482, 37.815970 ], [ -80.205841, 37.818921 ], [ -80.202853, 37.824240 ], [ -80.199633, 37.827507 ], [ -80.194650, 37.831759 ], [ -80.186380, 37.837741 ], [ -80.181768, 37.838343 ], [ -80.179391, 37.839751 ], [ -80.183555, 37.846810 ], [ -80.183062, 37.850646 ], [ -80.181815, 37.852724 ], [ -80.176712, 37.854029 ], [ -80.172076, 37.860066 ], [ -80.172033, 37.862144 ], [ -80.168957, 37.867116 ], [ -80.162202, 37.875122 ], [ -80.153832, 37.881824 ], [ -80.148951, 37.886892 ], [ -80.147316, 37.885936 ], [ -80.146130, 37.884453 ], [ -80.141947, 37.882616 ], [ -80.131931, 37.889500 ], [ -80.131040, 37.890697 ], [ -80.130464, 37.893194 ], [ -80.129555, 37.894134 ], [ -80.123620, 37.897943 ], [ -80.123021, 37.898046 ], [ -80.120613, 37.896735 ], [ -80.117747, 37.897720 ], [ -80.117480, 37.900581 ], [ -80.119106, 37.902018 ], [ -80.118967, 37.903614 ], [ -80.116884, 37.906292 ], [ -80.106819, 37.914698 ], [ -80.102931, 37.918911 ], [ -80.096563, 37.918112 ], [ -80.086954, 37.929547 ], [ -80.080823, 37.935526 ], [ -80.075441, 37.939629 ], [ -80.074514, 37.942221 ], [ -80.066569, 37.947171 ], [ -80.063682, 37.947968 ], [ -80.056839, 37.951833 ], [ -80.051043, 37.956852 ], [ -80.048410, 37.957481 ], [ -80.036236, 37.967920 ], [ -80.024168, 37.976907 ], [ -80.013145, 37.984253 ], [ -80.012555, 37.985999 ], [ -80.012891, 37.987443 ], [ -80.012193, 37.988633 ], [ -80.008888, 37.990830 ], [ -80.002507, 37.992767 ], [ -79.999384, 37.995842 ], [ -79.996134, 38.000996 ], [ -79.995398, 38.003309 ], [ -79.995901, 38.005791 ], [ -79.994985, 38.007853 ], [ -79.990114, 38.013246 ], [ -79.986142, 38.014182 ], [ -79.984842, 38.016610 ], [ -79.985792, 38.018089 ], [ -79.985619, 38.019160 ], [ -79.980290, 38.027596 ], [ -79.978427, 38.029082 ], [ -79.976732, 38.029278 ], [ -79.975269, 38.030075 ], [ -79.973701, 38.032556 ], [ -79.972165, 38.036102 ], [ -79.973777, 38.038744 ], [ -79.973895, 38.040004 ], [ -79.971231, 38.044326 ], [ -79.968189, 38.047709 ], [ -79.959844, 38.063697 ], [ -79.960093, 38.068677 ], [ -79.954369, 38.080397 ], [ -79.953509, 38.081484 ], [ -79.949113, 38.084238 ], [ -79.942364, 38.091588 ], [ -79.938274, 38.094741 ], [ -79.935101, 38.096541 ], [ -79.934250, 38.097669 ], [ -79.933911, 38.099168 ], [ -79.931034, 38.101402 ], [ -79.927645, 38.104826 ], [ -79.926330, 38.107151 ], [ -79.929687, 38.109197 ], [ -79.934364, 38.109718 ], [ -79.938051, 38.110759 ], [ -79.938952, 38.111619 ], [ -79.944843, 38.131585 ], [ -79.942747, 38.134333 ], [ -79.933751, 38.135508 ], [ -79.929031, 38.139771 ], [ -79.928747, 38.144436 ], [ -79.928683, 38.144928 ], [ -79.925512, 38.150237 ], [ -79.925251, 38.150465 ], [ -79.923125, 38.150874 ], [ -79.918662, 38.154790 ], [ -79.914884, 38.167524 ], [ -79.915065, 38.168088 ], [ -79.916072, 38.168428 ], [ -79.917924, 38.168399 ], [ -79.918913, 38.170439 ], [ -79.918629, 38.172671 ], [ -79.916765, 38.175504 ], [ -79.916622, 38.177994 ], [ -79.921026, 38.179954 ], [ -79.921196, 38.180378 ], [ -79.917061, 38.183741 ], [ -79.916174, 38.184386 ], [ -79.916344, 38.186278 ], [ -79.914410, 38.188418 ], [ -79.910961, 38.187920 ], [ -79.906090, 38.188999 ], [ -79.898426, 38.193045 ], [ -79.892916, 38.199868 ], [ -79.892345, 38.202397 ], [ -79.891999, 38.203378 ], [ -79.891591, 38.204652 ], [ -79.888045, 38.207360 ], [ -79.886413, 38.207953 ], [ -79.884234, 38.207868 ], [ -79.879087, 38.211016 ], [ -79.863625, 38.223945 ], [ -79.856962, 38.231075 ], [ -79.850324, 38.233329 ], [ -79.846445, 38.240003 ], [ -79.845207, 38.241082 ], [ -79.842981, 38.241594 ], [ -79.837494, 38.241276 ], [ -79.835124, 38.241892 ], [ -79.834171, 38.242899 ], [ -79.834031, 38.244957 ], [ -79.832971, 38.247553 ], [ -79.830882, 38.249687 ], [ -79.825283, 38.250488 ], [ -79.821010, 38.248277 ], [ -79.819623, 38.248234 ], [ -79.817149, 38.249511 ], [ -79.814865, 38.251568 ], [ -79.815719, 38.253645 ], [ -79.815708, 38.255065 ], [ -79.814202, 38.258174 ], [ -79.811987, 38.260401 ], [ -79.806333, 38.259193 ], [ -79.801274, 38.261474 ], [ -79.798295, 38.265957 ], [ -79.790134, 38.267654 ], [ -79.788945, 38.268703 ], [ -79.787542, 38.273298 ], [ -79.789791, 38.281167 ], [ -79.795448, 38.290228 ], [ -79.797848, 38.292053 ], [ -79.802778, 38.292073 ], [ -79.803346, 38.296682 ], [ -79.804026, 38.298622 ], [ -79.807542, 38.301694 ], [ -79.810115, 38.305037 ], [ -79.810154, 38.306707 ], [ -79.808711, 38.309429 ], [ -79.804093, 38.313922 ], [ -79.799617, 38.317149 ], [ -79.798159, 38.319161 ], [ -79.796550, 38.323480 ], [ -79.785972, 38.330878 ], [ -79.779272, 38.331609 ], [ -79.773090, 38.335529 ], [ -79.769906, 38.341843 ], [ -79.766403, 38.350873 ], [ -79.767263, 38.353395 ], [ -79.764432, 38.356514 ], [ -79.757626, 38.357566 ], [ -79.755560, 38.357372 ], [ -79.744105, 38.353968 ], [ -79.740615, 38.354101 ], [ -79.734600, 38.356728 ], [ -79.732059, 38.360168 ], [ -79.729344, 38.361830 ], [ -79.727053, 38.362233 ], [ -79.725973, 38.363229 ], [ -79.725597, 38.363828 ], [ -79.725804, 38.366128 ], [ -79.726790, 38.370832 ], [ -79.727676, 38.371701 ], [ -79.730494, 38.372217 ], [ -79.731698, 38.373376 ], [ -79.729895, 38.380351 ], [ -79.726350, 38.387070 ], [ -79.722653, 38.389517 ], [ -79.717365, 38.401562 ], [ -79.712904, 38.405034 ], [ -79.708965, 38.409553 ], [ -79.709140, 38.412064 ], [ -79.706634, 38.415730 ], [ -79.689675, 38.431439 ], [ -79.689909, 38.432864 ], [ -79.690930, 38.433995 ], [ -79.691656, 38.436436 ], [ -79.691377, 38.439558 ], [ -79.689544, 38.442511 ], [ -79.691478, 38.446282 ], [ -79.688962, 38.449538 ], [ -79.688205, 38.450476 ], [ -79.688365, 38.456870 ], [ -79.688882, 38.458714 ], [ -79.691088, 38.463744 ], [ -79.695588, 38.469058 ], [ -79.698929, 38.469869 ], [ -79.699622, 38.473967 ], [ -79.699006, 38.475148 ], [ -79.695565, 38.477842 ], [ -79.694180, 38.478311 ], [ -79.693424, 38.481011 ], [ -79.695462, 38.481454 ], [ -79.696959, 38.484574 ], [ -79.697572, 38.487223 ], [ -79.694506, 38.494232 ], [ -79.692273, 38.496474 ], [ -79.691301, 38.496768 ], [ -79.688345, 38.496183 ], [ -79.682974, 38.501317 ], [ -79.681606, 38.504504 ], [ -79.681574, 38.508217 ], [ -79.680374, 38.510617 ], [ -79.674074, 38.510417 ], [ -79.670474, 38.507717 ], [ -79.669128, 38.510883 ], [ -79.669128, 38.510975 ], [ -79.668774, 38.512017 ], [ -79.667574, 38.512917 ], [ -79.665674, 38.513817 ], [ -79.663474, 38.514117 ], [ -79.662074, 38.515517 ], [ -79.662974, 38.518717 ], [ -79.666774, 38.524317 ], [ -79.669774, 38.526917 ], [ -79.671574, 38.527517 ], [ -79.672974, 38.528717 ], [ -79.668774, 38.534217 ], [ -79.666874, 38.538317 ], [ -79.669675, 38.543416 ], [ -79.669275, 38.549516 ], [ -79.665075, 38.560916 ], [ -79.662575, 38.560516 ], [ -79.659275, 38.562416 ], [ -79.660675, 38.566216 ], [ -79.661575, 38.567316 ], [ -79.659375, 38.572616 ], [ -79.658175, 38.573016 ], [ -79.656109, 38.576200 ], [ -79.649075, 38.591515 ], [ -79.571771, 38.563117 ], [ -79.566271, 38.562517 ], [ -79.555471, 38.560217 ], [ -79.542570, 38.553217 ], [ -79.538270, 38.551817 ], [ -79.536870, 38.550917 ], [ -79.533370, 38.546217 ], [ -79.533170, 38.544717 ], [ -79.531870, 38.542817 ], [ -79.521469, 38.533918 ], [ -79.499768, 38.497720 ], [ -79.476638, 38.457228 ], [ -79.370302, 38.427244 ], [ -79.312276, 38.411876 ], [ -79.300081, 38.414888 ], [ -79.297758, 38.416438 ], [ -79.295712, 38.418129 ], [ -79.291813, 38.419627 ], [ -79.290529, 38.420757 ], [ -79.288432, 38.420960 ], [ -79.286874, 38.420555 ], [ -79.285613, 38.419249 ], [ -79.282971, 38.418095 ], [ -79.280149, 38.420760 ], [ -79.279678, 38.424173 ], [ -79.280263, 38.425475 ], [ -79.280581, 38.426833 ], [ -79.282470, 38.429168 ], [ -79.282663, 38.431021 ], [ -79.282762, 38.431647 ], [ -79.282225, 38.432078 ], [ -79.274529, 38.436337 ], [ -79.272064, 38.437376 ], [ -79.267414, 38.438322 ], [ -79.265327, 38.441772 ], [ -79.263376, 38.443762 ], [ -79.262910, 38.444586 ], [ -79.261107, 38.448082 ], [ -79.254435, 38.455949 ], [ -79.253067, 38.455818 ], [ -79.247342, 38.453294 ], [ -79.242641, 38.454168 ], [ -79.241854, 38.457055 ], [ -79.242024, 38.464332 ], [ -79.240059, 38.469841 ], [ -79.234408, 38.473011 ], [ -79.231620, 38.474041 ], [ -79.225669, 38.476471 ], [ -79.220961, 38.480590 ], [ -79.221406, 38.484837 ], [ -79.219067, 38.487441 ], [ -79.215212, 38.489261 ], [ -79.210591, 38.492913 ], [ -79.210026, 38.494231 ], [ -79.210008, 38.494283 ], [ -79.209703, 38.495574 ], [ -79.207873, 38.500122 ], [ -79.207884, 38.500428 ], [ -79.206959, 38.503522 ], [ -79.210959, 38.507422 ], [ -79.205859, 38.524521 ], [ -79.201459, 38.527821 ], [ -79.196959, 38.536721 ], [ -79.193458, 38.542421 ], [ -79.188958, 38.547420 ], [ -79.184058, 38.551520 ], [ -79.180858, 38.559920 ], [ -79.176658, 38.565520 ], [ -79.174881, 38.566314 ], [ -79.174512, 38.566531 ], [ -79.170958, 38.568120 ], [ -79.170658, 38.569220 ], [ -79.171658, 38.571620 ], [ -79.170858, 38.574119 ], [ -79.168058, 38.578619 ], [ -79.163458, 38.583119 ], [ -79.158657, 38.592319 ], [ -79.158257, 38.593919 ], [ -79.158957, 38.594519 ], [ -79.159158, 38.601219 ], [ -79.154357, 38.606518 ], [ -79.155557, 38.609218 ], [ -79.155355, 38.611225 ], [ -79.151257, 38.620618 ], [ -79.146974, 38.625641 ], [ -79.146741, 38.625819 ], [ -79.142657, 38.634417 ], [ -79.139657, 38.637217 ], [ -79.137557, 38.638017 ], [ -79.137012, 38.640655 ], [ -79.136374, 38.642400 ], [ -79.135546, 38.643715 ], [ -79.135472, 38.644057 ], [ -79.133557, 38.646017 ], [ -79.131057, 38.653217 ], [ -79.129757, 38.655017 ], [ -79.122256, 38.659817 ], [ -79.120256, 38.660216 ], [ -79.111556, 38.659717 ], [ -79.106356, 38.656217 ], [ -79.092955, 38.659517 ], [ -79.092755, 38.662816 ], [ -79.091055, 38.669316 ], [ -79.087855, 38.673816 ], [ -79.084355, 38.686516 ], [ -79.085555, 38.688816 ], [ -79.088055, 38.690115 ], [ -79.090755, 38.692515 ], [ -79.092271, 38.699208 ], [ -79.092555, 38.700149 ], [ -79.092755, 38.702315 ], [ -79.086555, 38.716015 ], [ -79.087255, 38.720114 ], [ -79.085455, 38.724614 ], [ -79.081955, 38.729714 ], [ -79.079655, 38.734714 ], [ -79.076555, 38.739214 ], [ -79.073855, 38.742114 ], [ -79.072755, 38.744614 ], [ -79.072555, 38.747513 ], [ -79.064854, 38.754413 ], [ -79.060954, 38.756713 ], [ -79.057554, 38.760213 ], [ -79.057253, 38.761413 ], [ -79.056754, 38.766513 ], [ -79.055654, 38.770913 ], [ -79.053754, 38.772313 ], [ -79.051554, 38.772613 ], [ -79.051254, 38.773913 ], [ -79.051654, 38.778013 ], [ -79.052454, 38.779213 ], [ -79.054354, 38.780613 ], [ -79.055654, 38.783013 ], [ -79.054954, 38.785713 ], [ -79.048954, 38.790713 ], [ -79.046554, 38.792113 ], [ -79.033153, 38.791013 ], [ -79.029253, 38.791013 ], [ -79.027253, 38.792113 ], [ -79.023053, 38.798613 ], [ -79.023453, 38.802612 ], [ -79.024453, 38.803712 ], [ -79.024053, 38.809212 ], [ -79.019553, 38.817912 ], [ -79.016752, 38.820012 ], [ -79.011952, 38.820412 ], [ -79.007952, 38.822312 ], [ -79.006552, 38.823712 ], [ -79.006152, 38.824512 ], [ -79.006352, 38.826112 ], [ -79.005152, 38.829912 ], [ -79.002352, 38.836512 ], [ -78.999014, 38.840074 ], [ -78.998863, 38.840962 ], [ -79.000252, 38.845412 ], [ -78.998171, 38.847353 ], [ -78.993997, 38.850102 ], [ -78.869276, 38.762991 ], [ -78.865905, 38.767034 ], [ -78.863684, 38.771800 ], [ -78.848187, 38.794978 ], [ -78.835191, 38.811499 ], [ -78.832267, 38.814388 ], [ -78.827262, 38.821610 ], [ -78.821167, 38.830982 ], [ -78.815116, 38.841594 ], [ -78.810943, 38.849616 ], [ -78.808181, 38.856175 ], [ -78.796213, 38.874606 ], [ -78.791610, 38.877593 ], [ -78.790078, 38.880076 ], [ -78.788031, 38.885123 ], [ -78.786025, 38.887187 ], [ -78.779198, 38.892298 ], [ -78.772793, 38.893742 ], [ -78.759085, 38.900529 ], [ -78.757278, 38.903203 ], [ -78.754516, 38.905728 ], [ -78.754658, 38.907582 ], [ -78.750517, 38.916029 ], [ -78.738921, 38.927283 ], [ -78.726222, 38.930932 ], [ -78.724062, 38.930846 ], [ -78.722451, 38.931405 ], [ -78.718482, 38.934267 ], [ -78.717076, 38.936028 ], [ -78.719620, 38.926510 ], [ -78.720095, 38.923863 ], [ -78.719806, 38.922638 ], [ -78.719755, 38.922135 ], [ -78.719451, 38.920260 ], [ -78.720900, 38.909844 ], [ -78.719810, 38.905907 ], [ -78.718647, 38.904561 ], [ -78.717178, 38.904296 ], [ -78.716168, 38.904830 ], [ -78.712622, 38.908665 ], [ -78.704323, 38.915231 ], [ -78.697380, 38.915602 ], [ -78.691450, 38.922195 ], [ -78.688266, 38.924780 ], [ -78.681617, 38.925840 ], [ -78.680456, 38.925313 ], [ -78.670679, 38.933800 ], [ -78.666594, 38.939200 ], [ -78.665886, 38.941579 ], [ -78.662083, 38.945702 ], [ -78.659050, 38.947375 ], [ -78.655043, 38.953766 ], [ -78.652352, 38.960677 ], [ -78.646589, 38.968138 ], [ -78.638423, 38.966819 ], [ -78.632471, 38.974739 ], [ -78.632452, 38.976983 ], [ -78.630846, 38.979586 ], [ -78.629553, 38.980866 ], [ -78.625672, 38.982575 ], [ -78.620453, 38.982601 ], [ -78.619914, 38.981288 ], [ -78.619982, 38.977338 ], [ -78.618676, 38.974082 ], [ -78.614312, 38.975850 ], [ -78.611184, 38.976134 ], [ -78.608369, 38.969743 ], [ -78.601655, 38.964603 ], [ -78.601399, 38.966530 ], [ -78.598894, 38.969546 ], [ -78.596015, 38.970192 ], [ -78.593261, 38.971918 ], [ -78.588704, 38.978579 ], [ -78.582928, 38.985416 ], [ -78.581981, 38.988398 ], [ -78.580465, 38.990567 ], [ -78.570462, 39.001552 ], [ -78.561711, 39.009007 ], [ -78.559400, 39.011877 ], [ -78.554919, 39.015124 ], [ -78.552321, 39.016374 ], [ -78.550467, 39.018065 ], [ -78.557380, 39.021393 ], [ -78.559640, 39.024456 ], [ -78.563294, 39.026328 ], [ -78.565073, 39.025935 ], [ -78.565837, 39.026303 ], [ -78.571901, 39.031995 ], [ -78.559997, 39.041573 ], [ -78.556748, 39.044527 ], [ -78.554263, 39.048058 ], [ -78.547734, 39.054069 ], [ -78.545679, 39.055052 ], [ -78.540216, 39.060631 ], [ -78.531695, 39.066519 ], [ -78.526543, 39.068221 ], [ -78.522714, 39.071062 ], [ -78.516789, 39.077569 ], [ -78.515955, 39.080046 ], [ -78.516479, 39.081802 ], [ -78.512103, 39.084878 ], [ -78.508132, 39.088630 ], [ -78.504384, 39.091398 ], [ -78.495984, 39.098980 ], [ -78.495160, 39.100992 ], [ -78.484283, 39.107372 ], [ -78.478426, 39.109843 ], [ -78.477320, 39.109398 ], [ -78.475376, 39.107469 ], [ -78.473209, 39.108143 ], [ -78.470261, 39.110063 ], [ -78.469530, 39.111204 ], [ -78.466662, 39.112858 ], [ -78.459869, 39.113351 ], [ -78.439429, 39.132146 ], [ -78.437771, 39.135426 ], [ -78.436658, 39.141691 ], [ -78.427294, 39.152726 ], [ -78.413943, 39.158415 ], [ -78.412599, 39.160038 ], [ -78.403697, 39.167451 ], [ -78.406966, 39.170903 ], [ -78.411972, 39.172734 ], [ -78.426315, 39.182762 ], [ -78.428697, 39.187217 ], [ -78.424292, 39.192156 ], [ -78.424905, 39.193301 ], [ -78.430846, 39.196227 ], [ -78.436662, 39.196658 ], [ -78.438651, 39.198049 ], [ -78.437053, 39.199766 ], [ -78.432130, 39.204717 ], [ -78.431167, 39.205744 ], [ -78.429803, 39.207014 ], [ -78.427911, 39.208611 ], [ -78.423968, 39.212049 ], [ -78.417890, 39.217504 ], [ -78.405585, 39.231176 ], [ -78.404980, 39.238006 ], [ -78.404214, 39.241214 ], [ -78.399669, 39.243874 ], [ -78.399785, 39.244129 ], [ -78.409116, 39.252564 ], [ -78.414631, 39.255733 ], [ -78.416120, 39.255410 ], [ -78.418584, 39.256065 ], [ -78.419422, 39.257476 ], [ -78.414204, 39.263910 ], [ -78.402783, 39.275471 ], [ -78.401813, 39.276754 ], [ -78.402275, 39.277238 ], [ -78.398682, 39.281332 ], [ -78.393371, 39.282988 ], [ -78.388785, 39.288572 ], [ -78.387194, 39.291444 ], [ -78.387242, 39.293430 ], [ -78.385888, 39.294888 ], [ -78.374728, 39.305136 ], [ -78.371604, 39.307692 ], [ -78.367242, 39.310148 ], [ -78.364686, 39.317312 ], [ -78.361567, 39.318037 ], [ -78.360035, 39.317771 ], [ -78.358940, 39.319484 ], [ -78.346301, 39.339108 ], [ -78.345460, 39.341024 ], [ -78.347634, 39.342720 ], [ -78.347409, 39.343402 ], [ -78.343685, 39.346713 ], [ -78.342514, 39.346769 ], [ -78.341308, 39.345555 ], [ -78.339284, 39.348605 ], [ -78.338958, 39.349889 ], [ -78.340480, 39.353492 ], [ -78.348698, 39.354744 ], [ -78.362267, 39.357784 ], [ -78.366867, 39.359290 ], [ -78.362632, 39.362888 ], [ -78.354837, 39.371616 ], [ -78.343214, 39.388807 ], [ -78.350014, 39.392861 ], [ -78.349436, 39.397252 ], [ -78.357949, 39.404192 ], [ -78.359918, 39.409028 ], [ -78.359352, 39.412534 ], [ -78.356627, 39.415902 ], [ -78.351236, 39.420595 ], [ -78.348354, 39.424431 ], [ -78.346718, 39.427618 ], [ -78.347942, 39.430879 ], [ -78.353227, 39.436792 ], [ -78.347773, 39.440583 ], [ -78.346546, 39.442616 ], [ -78.346061, 39.445613 ], [ -78.347333, 39.447659 ], [ -78.346962, 39.450679 ], [ -78.345823, 39.453499 ], [ -78.345143, 39.459484 ], [ -78.349476, 39.462205 ], [ -78.347087, 39.466012 ], [ -78.287980, 39.428755 ], [ -78.262785, 39.414323 ], [ -78.228766, 39.391233 ], [ -78.205401, 39.375099 ], [ -78.187370, 39.363989 ], [ -78.158194, 39.343392 ], [ -78.140920, 39.333745 ], [ -78.108746, 39.312460 ], [ -78.032841, 39.264403 ], [ -77.828157, 39.132329 ], [ -77.822182, 39.139985 ], [ -77.822230, 39.142734 ], [ -77.822990, 39.145451 ], [ -77.822874, 39.147755 ], [ -77.821413, 39.152410 ], [ -77.818446, 39.155279 ], [ -77.813206, 39.165023 ], [ -77.811295, 39.167563 ], [ -77.809125, 39.168567 ], [ -77.805991, 39.172421 ], [ -77.805099, 39.174222 ], [ -77.804415, 39.178045 ], [ -77.804712, 39.179419 ], [ -77.797943, 39.192826 ], [ -77.797714, 39.194240 ], [ -77.798478, 39.199574 ], [ -77.798190, 39.200658 ], [ -77.794596, 39.206299 ], [ -77.793631, 39.210125 ], [ -77.788763, 39.215243 ], [ -77.783640, 39.224081 ], [ -77.781268, 39.226909 ], [ -77.778068, 39.229305 ], [ -77.771415, 39.236776 ], [ -77.767277, 39.249380 ], [ -77.770589, 39.249393 ], [ -77.770876, 39.249760 ], [ -77.770669, 39.255262 ], [ -77.770281, 39.255977 ], [ -77.768992, 39.256417 ], [ -77.768000, 39.257657 ], [ -77.766525, 39.257340 ], [ -77.762844, 39.258445 ], [ -77.761768, 39.263031 ], [ -77.761217, 39.263721 ], [ -77.758733, 39.268114 ], [ -77.758412, 39.269197 ], [ -77.755698, 39.274575 ], [ -77.755193, 39.275191 ], [ -77.753105, 39.277340 ], [ -77.753060, 39.277971 ], [ -77.753357, 39.280331 ], [ -77.752726, 39.283373 ], [ -77.750267, 39.289284 ], [ -77.747287, 39.295001 ], [ -77.734899, 39.312409 ], [ -77.730047, 39.315666 ], [ -77.721638, 39.318494 ], [ -77.719946, 39.319693 ], [ -77.719029, 39.321125 ], [ -77.715865, 39.320641 ], [ -77.707709, 39.321559 ], [ -77.697461, 39.318633 ], [ -77.692984, 39.318450 ], [ -77.687124, 39.319914 ], [ -77.681706, 39.323666 ], [ -77.675846, 39.324192 ], [ -77.671341, 39.321675 ], [ -77.666130, 39.317008 ], [ -77.650997, 39.310784 ], [ -77.640282, 39.308241 ], [ -77.636101, 39.307782 ], [ -77.615939, 39.302722 ], [ -77.605900, 39.303688 ], [ -77.598892, 39.301883 ], [ -77.592739, 39.301290 ], [ -77.588235, 39.301955 ], [ -77.578491, 39.305228 ], [ -77.570041, 39.306350 ], [ -77.566596, 39.306121 ], [ -77.563210, 39.303903 ], [ -77.561826, 39.301913 ], [ -77.562768, 39.294501 ], [ -77.560854, 39.286152 ], [ -77.553114, 39.279268 ], [ -77.551054, 39.275882 ], [ -77.545846, 39.271535 ], [ -77.544258, 39.269660 ], [ -77.543228, 39.266937 ], [ -77.540581, 39.264947 ], [ -77.534461, 39.262361 ], [ -77.522486, 39.259086 ], [ -77.520986, 39.258491 ], [ -77.519634, 39.257232 ], [ -77.508427, 39.252630 ], [ -77.496606, 39.251045 ], [ -77.486813, 39.247586 ], [ -77.484664, 39.246123 ], [ -77.480807, 39.241664 ], [ -77.471213, 39.234509 ], [ -77.460210, 39.228359 ], [ -77.458120, 39.226140 ], [ -77.457680, 39.225020 ], [ -77.457943, 39.222023 ], [ -77.459883, 39.218682 ], [ -77.470113, 39.211840 ], [ -77.473610, 39.208407 ], [ -77.475929, 39.202024 ], [ -77.475013, 39.194934 ], [ -77.477362, 39.190495 ], [ -77.478596, 39.189168 ], [ -77.485971, 39.185665 ], [ -77.505162, 39.182050 ], [ -77.510631, 39.178484 ], [ -77.516426, 39.170891 ], [ -77.521222, 39.161057 ], [ -77.524872, 39.148455 ], [ -77.527282, 39.146236 ], [ -77.526728, 39.137315 ], [ -77.524559, 39.127821 ], [ -77.519929, 39.120925 ], [ -77.515320, 39.118591 ], [ -77.499711, 39.113950 ], [ -77.494955, 39.113038 ], [ -77.485800, 39.109303 ], [ -77.481279, 39.105658 ], [ -77.477010, 39.100331 ], [ -77.472414, 39.092524 ], [ -77.469443, 39.086387 ], [ -77.462617, 39.076248 ], [ -77.461450, 39.075151 ], [ -77.458202, 39.073723 ], [ -77.452827, 39.072468 ], [ -77.437400, 39.070611 ], [ -77.423180, 39.066878 ], [ -77.415430, 39.066435 ], [ -77.404593, 39.064496 ], [ -77.399204, 39.064784 ], [ -77.385680, 39.061987 ], [ -77.380108, 39.062808 ], [ -77.375079, 39.061297 ], [ -77.367529, 39.061087 ], [ -77.359702, 39.062004 ], [ -77.350311, 39.062133 ], [ -77.340287, 39.062991 ], [ -77.335511, 39.061771 ], [ -77.334010, 39.060989 ], [ -77.333706, 39.059508 ], [ -77.324206, 39.056508 ], [ -77.314905, 39.052208 ], [ -77.310705, 39.052008 ], [ -77.301005, 39.049508 ], [ -77.293105, 39.046508 ], [ -77.274706, 39.034091 ], [ -77.266004, 39.031909 ], [ -77.255303, 39.030009 ], [ -77.248403, 39.026909 ], [ -77.246003, 39.024909 ], [ -77.244603, 39.020109 ], [ -77.246903, 39.014809 ], [ -77.251803, 39.011409 ], [ -77.255703, 39.002409 ], [ -77.253003, 38.995709 ], [ -77.249203, 38.993709 ], [ -77.248303, 38.992309 ], [ -77.249803, 38.985909 ], [ -77.234803, 38.976310 ], [ -77.232268, 38.979502 ], [ -77.231601, 38.979917 ], [ -77.229992, 38.979858 ], [ -77.228395, 38.978404 ], [ -77.224969, 38.973349 ], [ -77.221502, 38.971310 ], [ -77.211502, 38.969410 ], [ -77.209302, 38.970410 ], [ -77.203602, 38.968910 ], [ -77.202502, 38.967910 ], [ -77.197502, 38.966810 ], [ -77.188302, 38.967510 ], [ -77.183002, 38.968810 ], [ -77.171901, 38.967510 ], [ -77.168001, 38.967410 ], [ -77.166901, 38.968110 ], [ -77.165301, 38.968010 ], [ -77.151084, 38.965832 ], [ -77.148179, 38.965002 ], [ -77.146601, 38.964210 ], [ -77.137701, 38.955310 ], [ -77.131901, 38.947410 ], [ -77.127601, 38.940010 ], [ -77.119900, 38.934311 ], [ -77.117900, 38.932411 ], [ -77.116600, 38.928911 ], [ -77.113400, 38.925211 ], [ -77.106300, 38.919111 ], [ -77.103400, 38.912911 ], [ -77.101200, 38.911111 ], [ -77.093700, 38.905911 ], [ -77.090200, 38.904211 ], [ -77.082200, 38.901911 ], [ -77.070099, 38.900711 ], [ -77.068199, 38.899811 ], [ -77.067299, 38.899211 ], [ -77.063499, 38.888611 ], [ -77.058254, 38.880069 ], [ -77.055199, 38.880012 ], [ -77.054099, 38.879112 ], [ -77.051099, 38.875212 ], [ -77.051299, 38.873212 ], [ -77.049099, 38.870712 ], [ -77.046299, 38.871312 ], [ -77.045599, 38.873012 ], [ -77.046599, 38.874912 ], [ -77.045399, 38.875212 ], [ -77.043299, 38.874012 ], [ -77.040599, 38.871212 ], [ -77.039099, 38.868112 ], [ -77.038899, 38.865812 ], [ -77.039299, 38.864312 ], [ -77.031698, 38.850512 ], [ -77.032798, 38.841712 ], [ -77.041699, 38.840212 ], [ -77.044199, 38.840212 ], [ -77.044999, 38.838512 ], [ -77.044899, 38.834712 ], [ -77.043499, 38.833212 ], [ -77.042599, 38.833812 ], [ -77.041199, 38.833712 ], [ -77.039199, 38.832212 ], [ -77.038098, 38.828612 ], [ -77.039098, 38.821413 ], [ -77.038098, 38.815613 ], [ -77.035798, 38.814913 ], [ -77.038898, 38.800813 ], [ -77.038598, 38.791513 ], [ -77.039498, 38.791113 ], [ -77.040098, 38.789913 ], [ -77.041098, 38.773313 ], [ -77.041898, 38.741514 ], [ -77.040998, 38.737914 ], [ -77.041398, 38.724515 ], [ -77.042298, 38.718515 ], [ -77.045498, 38.714315 ], [ -77.053199, 38.709915 ], [ -77.065322, 38.709564 ], [ -77.071861, 38.710581 ], [ -77.072807, 38.711526 ], [ -77.079499, 38.709515 ], [ -77.091800, 38.703415 ], [ -77.099000, 38.698615 ], [ -77.102700, 38.698315 ], [ -77.105900, 38.696815 ], [ -77.122001, 38.685816 ], [ -77.132501, 38.673816 ], [ -77.135901, 38.649817 ], [ -77.131901, 38.644217 ], [ -77.132201, 38.641217 ], [ -77.130200, 38.635017 ], [ -77.157501, 38.636417 ], [ -77.174902, 38.624217 ], [ -77.202002, 38.617217 ], [ -77.204302, 38.617817 ], [ -77.205103, 38.623917 ], [ -77.216303, 38.637817 ], [ -77.240604, 38.638917 ], [ -77.246704, 38.635217 ], [ -77.248904, 38.628617 ], [ -77.245104, 38.620717 ], [ -77.247003, 38.590618 ], [ -77.264430, 38.582845 ], [ -77.265304, 38.580319 ], [ -77.260830, 38.565330 ], [ -77.276603, 38.547120 ], [ -77.276303, 38.539620 ], [ -77.283503, 38.525221 ], [ -77.291103, 38.515721 ], [ -77.300776, 38.506978 ], [ -77.310334, 38.493926 ], [ -77.322622, 38.467131 ], [ -77.325440, 38.448850 ], [ -77.319036, 38.417803 ], [ -77.310719, 38.397669 ], [ -77.312201, 38.390958 ], [ -77.314848, 38.389579 ], [ -77.317288, 38.383576 ], [ -77.296077, 38.369797 ], [ -77.288145, 38.359477 ], [ -77.288350, 38.351286 ], [ -77.286202, 38.347025 ], [ -77.279633, 38.339444 ], [ -77.265295, 38.333165 ], [ -77.240072, 38.331598 ], [ -77.199433, 38.340890 ], [ -77.179340, 38.341915 ], [ -77.162692, 38.345994 ], [ -77.155191, 38.351047 ], [ -77.138224, 38.367917 ], [ -77.104717, 38.369655 ], [ -77.094665, 38.367715 ], [ -77.084810, 38.368297 ], [ -77.069956, 38.377895 ], [ -77.056032, 38.396200 ], [ -77.051437, 38.399083 ], [ -77.043526, 38.400548 ], [ -77.024866, 38.386791 ], [ -77.011827, 38.374554 ], [ -77.016932, 38.341697 ], [ -77.020947, 38.329273 ], [ -77.030683, 38.311623 ], [ -77.026304, 38.302685 ], [ -76.997670, 38.278047 ], [ -76.990255, 38.273935 ], [ -76.981372, 38.274214 ], [ -76.962150, 38.256486 ], [ -76.957796, 38.243183 ], [ -76.957417, 38.236341 ], [ -76.962375, 38.230093 ], [ -76.966553, 38.229542 ], [ -76.967335, 38.227185 ], [ -76.962311, 38.214075 ], [ -76.937134, 38.202384 ], [ -76.916922, 38.199751 ], [ -76.910832, 38.197073 ], [ -76.875272, 38.172207 ], [ -76.838795, 38.163476 ], [ -76.824274, 38.163639 ], [ -76.802968, 38.167988 ], [ -76.788445, 38.169199 ], [ -76.760241, 38.166581 ], [ -76.749685, 38.162114 ], [ -76.743064, 38.156988 ], [ -76.740278, 38.152824 ], [ -76.738938, 38.146510 ], [ -76.721722, 38.137635 ], [ -76.704048, 38.149264 ], [ -76.701297, 38.155718 ], [ -76.684892, 38.156497 ], [ -76.665127, 38.147638 ], [ -76.643448, 38.148250 ], [ -76.638983, 38.151476 ], [ -76.629476, 38.153050 ], [ -76.613939, 38.148587 ], [ -76.604131, 38.128771 ], [ -76.600937, 38.110084 ], [ -76.579497, 38.094870 ], [ -76.543155, 38.076971 ], [ -76.535919, 38.069532 ], [ -76.522354, 38.042590 ], [ -76.516547, 38.026566 ], [ -76.491998, 38.017222 ], [ -76.469343, 38.013544 ], [ -76.465291, 38.010226 ], [ -76.462542, 37.998572 ], [ -76.427487, 37.977038 ], [ -76.416299, 37.966828 ], [ -76.391439, 37.958742 ], [ -76.360211, 37.952329 ], [ -76.343848, 37.947345 ], [ -76.265998, 37.911380 ], [ -76.236725, 37.889174 ], [ -76.245072, 37.861918 ], [ -76.251358, 37.833072 ], [ -76.266057, 37.817400 ], [ -76.275178, 37.812664 ], [ -76.280544, 37.812597 ], [ -76.282592, 37.814109 ], [ -76.281985, 37.818068 ], [ -76.284904, 37.822308 ], [ -76.293525, 37.822717 ], [ -76.307482, 37.812350 ], [ -76.310307, 37.794849 ], [ -76.306489, 37.788646 ], [ -76.312108, 37.750522 ], [ -76.304917, 37.729913 ], [ -76.312858, 37.720338 ], [ -76.302803, 37.704474 ], [ -76.300067, 37.695364 ], [ -76.302545, 37.689000 ], [ -76.312079, 37.684651 ], [ -76.315161, 37.684720 ], [ -76.324808, 37.676983 ], [ -76.339892, 37.655966 ], [ -76.332562, 37.645817 ], [ -76.306464, 37.642005 ], [ -76.292534, 37.636098 ], [ -76.287959, 37.631771 ], [ -76.279447, 37.618225 ], [ -76.280370, 37.613715 ], [ -76.309174, 37.621892 ], [ -76.362320, 37.610368 ], [ -76.381106, 37.627003 ], [ -76.390054, 37.630326 ], [ -76.399236, 37.628636 ], [ -76.443254, 37.652347 ], [ -76.472392, 37.665772 ], [ -76.489576, 37.666201 ], [ -76.491799, 37.663614 ], [ -76.497564, 37.647056 ], [ -76.501522, 37.643762 ], [ -76.510187, 37.642324 ], [ -76.536548, 37.663574 ], [ -76.537698, 37.668930 ], [ -76.535302, 37.687516 ], [ -76.537228, 37.698892 ], [ -76.540050, 37.704432 ], [ -76.560476, 37.727827 ], [ -76.576387, 37.757493 ], [ -76.584289, 37.768890 ], [ -76.593835, 37.772848 ], [ -76.595939, 37.771680 ], [ -76.602024, 37.772731 ], [ -76.615351, 37.780759 ], [ -76.651413, 37.796239 ], [ -76.658302, 37.806815 ], [ -76.680197, 37.825654 ], [ -76.692747, 37.822770 ], [ -76.701606, 37.822677 ], [ -76.722156, 37.836680 ], [ -76.727180, 37.842263 ], [ -76.733046, 37.852009 ], [ -76.738395, 37.865373 ], [ -76.747552, 37.875864 ], [ -76.765711, 37.879274 ], [ -76.784618, 37.869569 ], [ -76.782826, 37.863184 ], [ -76.766328, 37.840437 ], [ -76.751200, 37.824141 ], [ -76.734309, 37.798660 ], [ -76.723863, 37.788503 ], [ -76.715498, 37.785873 ], [ -76.689773, 37.785190 ], [ -76.683775, 37.781391 ], [ -76.681901, 37.778118 ], [ -76.683343, 37.775783 ], [ -76.683372, 37.765507 ], [ -76.680922, 37.759647 ], [ -76.677002, 37.756100 ], [ -76.663887, 37.751887 ], [ -76.639962, 37.750941 ], [ -76.619710, 37.744795 ], [ -76.617373, 37.742347 ], [ -76.621433, 37.737973 ], [ -76.619970, 37.731271 ], [ -76.606466, 37.724819 ], [ -76.597213, 37.717269 ], [ -76.595943, 37.712989 ], [ -76.598073, 37.709120 ], [ -76.597868, 37.702918 ], [ -76.579591, 37.671508 ], [ -76.583143, 37.661986 ], [ -76.574049, 37.646781 ], [ -76.542666, 37.616857 ], [ -76.533777, 37.612530 ], [ -76.527188, 37.611315 ], [ -76.435474, 37.612807 ], [ -76.420252, 37.598686 ], [ -76.410781, 37.581815 ], [ -76.383188, 37.573056 ], [ -76.357835, 37.573699 ], [ -76.332641, 37.570042 ], [ -76.300144, 37.561734 ], [ -76.297960, 37.557636 ], [ -76.302762, 37.551295 ], [ -76.330598, 37.536391 ], [ -76.339989, 37.538330 ], [ -76.348992, 37.536548 ], [ -76.360474, 37.519240 ], [ -76.359378, 37.513426 ], [ -76.352678, 37.504913 ], [ -76.329470, 37.494920 ], [ -76.306952, 37.497488 ], [ -76.297739, 37.506863 ], [ -76.296445, 37.511235 ], [ -76.298456, 37.512677 ], [ -76.297651, 37.515424 ], [ -76.293599, 37.516499 ], [ -76.288167, 37.514118 ], [ -76.281043, 37.507821 ], [ -76.265056, 37.481365 ], [ -76.252415, 37.447274 ], [ -76.250454, 37.421886 ], [ -76.246617, 37.404122 ], [ -76.245283, 37.386839 ], [ -76.248460, 37.375135 ], [ -76.258277, 37.362020 ], [ -76.262407, 37.360786 ], [ -76.264847, 37.357399 ], [ -76.272888, 37.335174 ], [ -76.272005, 37.322194 ], [ -76.275552, 37.309964 ], [ -76.282555, 37.319107 ], [ -76.291324, 37.324145 ], [ -76.308581, 37.329366 ], [ -76.312050, 37.338088 ], [ -76.337476, 37.364014 ], [ -76.366751, 37.374495 ], [ -76.387112, 37.385061 ], [ -76.391437, 37.390284 ], [ -76.393958, 37.395940 ], [ -76.393125, 37.398068 ], [ -76.415167, 37.402133 ], [ -76.418719, 37.397800 ], [ -76.407497, 37.369836 ], [ -76.414700, 37.367778 ], [ -76.428752, 37.380687 ], [ -76.437525, 37.379750 ], [ -76.445333, 37.366460 ], [ -76.434965, 37.354524 ], [ -76.406388, 37.332924 ], [ -76.387770, 37.307670 ], [ -76.385603, 37.294108 ], [ -76.381075, 37.285340 ], [ -76.369029, 37.279311 ], [ -76.352556, 37.278334 ], [ -76.349489, 37.273963 ], [ -76.362290, 37.270226 ], [ -76.392788, 37.264973 ], [ -76.417173, 37.263950 ], [ -76.421765, 37.255198 ], [ -76.429141, 37.253310 ], [ -76.475927, 37.250543 ], [ -76.482840, 37.254831 ], [ -76.493302, 37.249470 ], [ -76.503640, 37.233856 ], [ -76.494008, 37.225408 ], [ -76.471799, 37.216016 ], [ -76.394132, 37.225150 ], [ -76.389793, 37.222981 ], [ -76.393600, 37.214049 ], [ -76.396052, 37.201087 ], [ -76.389284, 37.193503 ], [ -76.391252, 37.179887 ], [ -76.399659, 37.160272 ], [ -76.394756, 37.157568 ], [ -76.381379, 37.155711 ], [ -76.375255, 37.160840 ], [ -76.359690, 37.168580 ], [ -76.348658, 37.170655 ], [ -76.343234, 37.166207 ], [ -76.344898, 37.164479 ], [ -76.344050, 37.160367 ], [ -76.340129, 37.151823 ], [ -76.334017, 37.144223 ], [ -76.330481, 37.141727 ], [ -76.324353, 37.142895 ], [ -76.311088, 37.138495 ], [ -76.292344, 37.126615 ], [ -76.274463, 37.094544 ], [ -76.271262, 37.084544 ], [ -76.292863, 37.035145 ], [ -76.300352, 37.008850 ], [ -76.304272, 37.001378 ], [ -76.312048, 37.000371 ], [ -76.315008, 37.001683 ], [ -76.314624, 37.009330 ], [ -76.318065, 37.013846 ], [ -76.340666, 37.015246 ], [ -76.348066, 37.006747 ], [ -76.356366, 37.002947 ], [ -76.373567, 36.998347 ], [ -76.383367, 36.993347 ], [ -76.396368, 36.982347 ], [ -76.408568, 36.969147 ], [ -76.411768, 36.962847 ], [ -76.418969, 36.964047 ], [ -76.428869, 36.969947 ], [ -76.452118, 36.998163 ], [ -76.452461, 37.004603 ], [ -76.449891, 37.004868 ], [ -76.448231, 37.007705 ], [ -76.464471, 37.027547 ], [ -76.512289, 37.054858 ], [ -76.518242, 37.055351 ], [ -76.526273, 37.062947 ], [ -76.527973, 37.068247 ], [ -76.526573, 37.070047 ], [ -76.526203, 37.077773 ], [ -76.536875, 37.083942 ], [ -76.555066, 37.075859 ], [ -76.564219, 37.077507 ], [ -76.567931, 37.080467 ], [ -76.579499, 37.096627 ], [ -76.618252, 37.119347 ], [ -76.624780, 37.127091 ], [ -76.622252, 37.142146 ], [ -76.617084, 37.144498 ], [ -76.604476, 37.160034 ], [ -76.606684, 37.166674 ], [ -76.610972, 37.166994 ], [ -76.616268, 37.178962 ], [ -76.619340, 37.192146 ], [ -76.623292, 37.198738 ], [ -76.629868, 37.206738 ], [ -76.641085, 37.216002 ], [ -76.649869, 37.220914 ], [ -76.689166, 37.222866 ], [ -76.698943, 37.219059 ], [ -76.730951, 37.213813 ], [ -76.734320, 37.204211 ], [ -76.740000, 37.195379 ], [ -76.743040, 37.192611 ], [ -76.750470, 37.190098 ], [ -76.757765, 37.191658 ], [ -76.773752, 37.206061 ], [ -76.780532, 37.209336 ], [ -76.789086, 37.224252 ], [ -76.799079, 37.233294 ], [ -76.813832, 37.239481 ], [ -76.828109, 37.241385 ], [ -76.869035, 37.241385 ], [ -76.874746, 37.250427 ], [ -76.877126, 37.251854 ], [ -76.884264, 37.251854 ], [ -76.898065, 37.243764 ], [ -76.913293, 37.235674 ], [ -76.919956, 37.230439 ], [ -76.924239, 37.222349 ], [ -76.923763, 37.216162 ], [ -76.912818, 37.207120 ], [ -76.898541, 37.199982 ], [ -76.890927, 37.199506 ], [ -76.865704, 37.209024 ], [ -76.801023, 37.206043 ], [ -76.803198, 37.201513 ], [ -76.802511, 37.198308 ], [ -76.796905, 37.189404 ], [ -76.756899, 37.161582 ], [ -76.747632, 37.150548 ], [ -76.737280, 37.146164 ], [ -76.730320, 37.145395 ], [ -76.715295, 37.148035 ], [ -76.696735, 37.174403 ], [ -76.692926, 37.186147 ], [ -76.691918, 37.195731 ], [ -76.685614, 37.198851 ], [ -76.669886, 37.183571 ], [ -76.663774, 37.173875 ], [ -76.664270, 37.171027 ], [ -76.668670, 37.166771 ], [ -76.671470, 37.158739 ], [ -76.671588, 37.142060 ], [ -76.666542, 37.138179 ], [ -76.656894, 37.109843 ], [ -76.658110, 37.096787 ], [ -76.667646, 37.076228 ], [ -76.669822, 37.064260 ], [ -76.668350, 37.055060 ], [ -76.662558, 37.045748 ], [ -76.653998, 37.039172 ], [ -76.646013, 37.036228 ], [ -76.612124, 37.035604 ], [ -76.586491, 37.028740 ], [ -76.577531, 37.022548 ], [ -76.562923, 37.003796 ], [ -76.551246, 36.998946 ], [ -76.524853, 36.983833 ], [ -76.522971, 36.981085 ], [ -76.524142, 36.978316 ], [ -76.521006, 36.973187 ], [ -76.513363, 36.968057 ], [ -76.500355, 36.965212 ], [ -76.487559, 36.952372 ], [ -76.482407, 36.917364 ], [ -76.482135, 36.901108 ], [ -76.483369, 36.896239 ], [ -76.469914, 36.882898 ], [ -76.454692, 36.884077 ], [ -76.453290, 36.887031 ], [ -76.453941, 36.892740 ], [ -76.447413, 36.903220 ], [ -76.441605, 36.906116 ], [ -76.431220, 36.904532 ], [ -76.407507, 36.897444 ], [ -76.387567, 36.899547 ], [ -76.385867, 36.923247 ], [ -76.353765, 36.922747 ], [ -76.345569, 36.924531 ], [ -76.344663, 36.919313 ], [ -76.333158, 36.917293 ], [ -76.328864, 36.918447 ], [ -76.330765, 36.938647 ], [ -76.327365, 36.959447 ], [ -76.322764, 36.959147 ], [ -76.315867, 36.955351 ], [ -76.299364, 36.965547 ], [ -76.297663, 36.968147 ], [ -76.285063, 36.968747 ], [ -76.267962, 36.964547 ], [ -76.234961, 36.945147 ], [ -76.221660, 36.939547 ], [ -76.189959, 36.931447 ], [ -76.139557, 36.923047 ], [ -76.095508, 36.908817 ], [ -76.087955, 36.908647 ], [ -76.058154, 36.916947 ], [ -76.043054, 36.927547 ], [ -76.033454, 36.931946 ], [ -76.013753, 36.930746 ], [ -76.007553, 36.929047 ], [ -75.996252, 36.922047 ], [ -75.991552, 36.910847 ], [ -75.972151, 36.842268 ], [ -75.965451, 36.812449 ], [ -75.949550, 36.761150 ], [ -75.921748, 36.692051 ], [ -75.890946, 36.630753 ], [ -75.874145, 36.583853 ], [ -75.867044, 36.550754 ], [ -75.879744, 36.550754 ], [ -75.880644, 36.550754 ], [ -75.885945, 36.550754 ], [ -75.886545, 36.550754 ], [ -75.891945, 36.550754 ], [ -75.893245, 36.550654 ], [ -75.894145, 36.550754 ], [ -75.903445, 36.550654 ], [ -75.904745, 36.550654 ], [ -75.909046, 36.550654 ], [ -75.911446, 36.550654 ], [ -75.922046, 36.550654 ], [ -75.952847, 36.550553 ], [ -75.953447, 36.550553 ], [ -75.955748, 36.550553 ], [ -75.957648, 36.550553 ], [ -76.026750, 36.550553 ], [ -76.034751, 36.550653 ], [ -76.313215, 36.550551 ], [ -76.465268, 36.550951 ], [ -76.541687, 36.550312 ], [ -76.575496, 36.550744 ], [ -76.738329, 36.550985 ], [ -76.749678, 36.550381 ], [ -76.781296, 36.550659 ], [ -76.807078, 36.550606 ], [ -76.915897, 36.552093 ], [ -76.916989, 36.550742 ], [ -76.917318, 36.546046 ], [ -76.916048, 36.543815 ], [ -77.095062, 36.544626 ], [ -77.124812, 36.543986 ], [ -77.152691, 36.544078 ], [ -77.164500, 36.546330 ], [ -77.169660, 36.547315 ], [ -77.190175, 36.546164 ], [ -77.205156, 36.544581 ], [ -77.749706, 36.545520 ], [ -77.875280, 36.544754 ], [ -77.882357, 36.544737 ], [ -77.899771, 36.544663 ], [ -78.038938, 36.544173 ], [ -78.039420, 36.544196 ], [ -78.132911, 36.543811 ], [ -78.133323, 36.543847 ], [ -78.245462, 36.544411 ], [ -78.246681, 36.544341 ], [ -78.323912, 36.543809 ], [ -78.436333, 36.542666 ], [ -78.441199, 36.542687 ], [ -78.456970, 36.542474 ], [ -78.470792, 36.542316 ], [ -78.471022, 36.542307 ], [ -78.509965, 36.541065 ], [ -78.529722, 36.540981 ], [ -78.533013, 36.541004 ], [ -78.605304, 36.541092 ], [ -78.663317, 36.542011 ], [ -78.670051, 36.542035 ], [ -78.758392, 36.541852 ], [ -78.765430, 36.541727 ], [ -78.796300, 36.541713 ], [ -78.914543, 36.541972 ], [ -78.915420, 36.541974 ], [ -78.942009, 36.542113 ], [ -78.942254, 36.542079 ], [ -78.970577, 36.542154 ], [ -78.971814, 36.542123 ], [ -79.124736, 36.541568 ], [ -79.126078, 36.541533 ], [ -79.137936, 36.541739 ], [ -79.208686, 36.541571 ], [ -79.209480, 36.541594 ], [ -79.249740, 36.541139 ], [ -79.445687, 36.541218 ], [ -79.445961, 36.541195 ], [ -79.510647, 36.540738 ], [ -79.666827, 36.541772 ], [ -79.667309, 36.541772 ], [ -79.887262, 36.542838 ], [ -79.904662, 36.542438 ], [ -79.966979, 36.542475 ], [ -79.967511, 36.542502 ], [ -80.027269, 36.542495 ], [ -80.122183, 36.542646 ], [ -80.169535, 36.543190 ], [ -80.171636, 36.543219 ], [ -80.225408, 36.543748 ], [ -80.228263, 36.543867 ], [ -80.295243, 36.543973 ], [ -80.431605, 36.550219 ], [ -80.432628, 36.550302 ], [ -80.440100, 36.550630 ], [ -80.624788, 36.558408 ], [ -80.653349, 36.559221 ], [ -80.704831, 36.562319 ], [ -80.730351, 36.562349 ], [ -80.773663, 36.560307 ], [ -80.803920, 36.560813 ], [ -80.837089, 36.559154 ], [ -80.837641, 36.559118 ], [ -80.901726, 36.561751 ], [ -80.944338, 36.563058 ], [ -80.945988, 36.563196 ], [ -81.003802, 36.563629 ], [ -81.011402, 36.564429 ], [ -81.058844, 36.566976 ], [ -81.061866, 36.567020 ], [ -81.083206, 36.567328 ], [ -81.124809, 36.569227 ], [ -81.141810, 36.569527 ], [ -81.171212, 36.571026 ], [ -81.176712, 36.571926 ], [ -81.249816, 36.573225 ], [ -81.262303, 36.573924 ], [ -81.307511, 36.575024 ], [ -81.353322, 36.574723 ], [ -81.374824, 36.574673 ], [ -81.442228, 36.576822 ], [ -81.476430, 36.580421 ], [ -81.489387, 36.579026 ], [ -81.499831, 36.579820 ], [ -81.521032, 36.580520 ], [ -81.600934, 36.587019 ], [ -81.677535, 36.588117 ], [ -81.646900, 36.611918 ], [ -81.736940, 36.612379 ], [ -81.826742, 36.614215 ], [ -81.922644, 36.616213 ], [ -81.934144, 36.594213 ], [ -82.148569, 36.594718 ], [ -82.150727, 36.594673 ], [ -82.173982, 36.594607 ], [ -82.177247, 36.594768 ], [ -82.180740, 36.594928 ], [ -82.188491, 36.595179 ], [ -82.210497, 36.595772 ], [ -82.211005, 36.595860 ], [ -82.221713, 36.595814 ], [ -82.223445, 36.595721 ], [ -82.225716, 36.595744 ], [ -82.226653, 36.595743 ], [ -82.296995, 36.595704 ], [ -82.466613, 36.594481 ], [ -82.478668, 36.595588 ], [ -82.487238, 36.595822 ], [ -82.554294, 36.594876 ], [ -82.559774, 36.594800 ], [ -82.561074, 36.594800 ], [ -82.609176, 36.594099 ], [ -82.679879, 36.593698 ], [ -82.695780, 36.593698 ], [ -82.830433, 36.593761 ], [ -82.888013, 36.593461 ], [ -83.027250, 36.593847 ], [ -83.028357, 36.593893 ], [ -83.248933, 36.593827 ], [ -83.249899, 36.593898 ], [ -83.250304, 36.593935 ], [ -83.261099, 36.593887 ], [ -83.276300, 36.598187 ], [ -83.374904, 36.597386 ], [ -83.472108, 36.597284 ], [ -83.556810, 36.597384 ], [ -83.622624, 36.598061 ], [ -83.645586, 36.600002 ], [ -83.670128, 36.600764 ], [ -83.670141, 36.600797 ], [ -83.675413, 36.600814 ], [ -83.674614, 36.603082 ], [ -83.673114, 36.604682 ], [ -83.665614, 36.605782 ], [ -83.663614, 36.606782 ], [ -83.657714, 36.611782 ], [ -83.649513, 36.616683 ], [ -83.648314, 36.622683 ], [ -83.645213, 36.624183 ], [ -83.639813, 36.624783 ], [ -83.635013, 36.622883 ], [ -83.628913, 36.624083 ], [ -83.625013, 36.625183 ], [ -83.619913, 36.627983 ], [ -83.616413, 36.631383 ], [ -83.614513, 36.633983 ], [ -83.607913, 36.637083 ], [ -83.605613, 36.637783 ], [ -83.604313, 36.637683 ], [ -83.603013, 36.636883 ], [ -83.600713, 36.637084 ], [ -83.584512, 36.641384 ], [ -83.577312, 36.641784 ], [ -83.569812, 36.645684 ], [ -83.565712, 36.648384 ], [ -83.562612, 36.651284 ], [ -83.554112, 36.653784 ], [ -83.547312, 36.654484 ], [ -83.541812, 36.656584 ], [ -83.533112, 36.661884 ], [ -83.533012, 36.663284 ], [ -83.531912, 36.664984 ], [ -83.529612, 36.666184 ], [ -83.527112, 36.665985 ], [ -83.516011, 36.667585 ], [ -83.511711, 36.669085 ], [ -83.506911, 36.668685 ], [ -83.501411, 36.669085 ], [ -83.499911, 36.670185 ], [ -83.498011, 36.670485 ], [ -83.493911, 36.670085 ], [ -83.488910, 36.667685 ], [ -83.482610, 36.666185 ], [ -83.466483, 36.664700 ], [ -83.460808, 36.664885 ], [ -83.458009, 36.665785 ], [ -83.454709, 36.664785 ], [ -83.448108, 36.665285 ], [ -83.440808, 36.666885 ], [ -83.436508, 36.666185 ], [ -83.431708, 36.666485 ], [ -83.423707, 36.667385 ], [ -83.419507, 36.668486 ], [ -83.411807, 36.670786 ], [ -83.395806, 36.676786 ], [ -83.394906, 36.677586 ], [ -83.395607, 36.678987 ], [ -83.395306, 36.679486 ], [ -83.389306, 36.684986 ], [ -83.386099, 36.686589 ], [ -83.367505, 36.692686 ], [ -83.364005, 36.694586 ], [ -83.362105, 36.694786 ], [ -83.360205, 36.693586 ], [ -83.359205, 36.693586 ], [ -83.356405, 36.694686 ], [ -83.354606, 36.696153 ], [ -83.353613, 36.696699 ], [ -83.350805, 36.697386 ], [ -83.349705, 36.698386 ], [ -83.342804, 36.701286 ], [ -83.315703, 36.708187 ], [ -83.313003, 36.709087 ], [ -83.311403, 36.710287 ], [ -83.307103, 36.711387 ], [ -83.287802, 36.713787 ], [ -83.286902, 36.713987 ], [ -83.285702, 36.715187 ], [ -83.275501, 36.717987 ], [ -83.272501, 36.717787 ], [ -83.269301, 36.718487 ], [ -83.263601, 36.720987 ], [ -83.255500, 36.721787 ], [ -83.246300, 36.725287 ], [ -83.238499, 36.727087 ], [ -83.236399, 36.726887 ], [ -83.219999, 36.731287 ], [ -83.199698, 36.737487 ], [ -83.194597, 36.739487 ], [ -83.175696, 36.739587 ], [ -83.167396, 36.739187 ], [ -83.161496, 36.739887 ], [ -83.156696, 36.742187 ], [ -83.146095, 36.741788 ], [ -83.136395, 36.743088 ], [ -83.134294, 36.746588 ], [ -83.130994, 36.749788 ], [ -83.127833, 36.750828 ], [ -83.128272, 36.756370 ], [ -83.128813, 36.757864 ], [ -83.126719, 36.761000 ], [ -83.125728, 36.761276 ], [ -83.125655, 36.761407 ], [ -83.132477, 36.764398 ], [ -83.132286, 36.765610 ], [ -83.131245, 36.767105 ], [ -83.128894, 36.769888 ], [ -83.128494, 36.775588 ], [ -83.131694, 36.781488 ], [ -83.128794, 36.785388 ], [ -83.123341, 36.786654 ], [ -83.119144, 36.789531 ], [ -83.114693, 36.796088 ], [ -83.110793, 36.800388 ], [ -83.108029, 36.802181 ], [ -83.103092, 36.806689 ], [ -83.098492, 36.814289 ], [ -83.098892, 36.822989 ], [ -83.099792, 36.824889 ], [ -83.101692, 36.826689 ], [ -83.102092, 36.828189 ], [ -83.101792, 36.829089 ], [ -83.098892, 36.831789 ], [ -83.091291, 36.834389 ], [ -83.088991, 36.835989 ], [ -83.086991, 36.838189 ], [ -83.079690, 36.840589 ], [ -83.075190, 36.840889 ], [ -83.073790, 36.844889 ], [ -83.075590, 36.850589 ], [ -83.072590, 36.854589 ], [ -83.069290, 36.853589 ], [ -83.066189, 36.851889 ], [ -83.063989, 36.851689 ], [ -83.060489, 36.853789 ], [ -83.052489, 36.851989 ], [ -83.047589, 36.851789 ], [ -83.044288, 36.852989 ], [ -83.042188, 36.854389 ], [ -83.026887, 36.855489 ], [ -83.025887, 36.855289 ], [ -83.024387, 36.851689 ], [ -83.021887, 36.849989 ], [ -83.012587, 36.847289 ], [ -83.009222, 36.847295 ], [ -83.006086, 36.847889 ], [ -83.003786, 36.851789 ], [ -82.998376, 36.856630 ], [ -82.988707, 36.859137 ], [ -82.979227, 36.859693 ], [ -82.973395, 36.859097 ], [ -82.971934, 36.857767 ], [ -82.970253, 36.857686 ], [ -82.960955, 36.862536 ], [ -82.951685, 36.866152 ], [ -82.937573, 36.867275 ], [ -82.922410, 36.873925 ], [ -82.911824, 36.874243 ], [ -82.911690, 36.874248 ], [ -82.910315, 36.874055 ], [ -82.907774, 36.874706 ], [ -82.907276, 36.875643 ], [ -82.908004, 36.877233 ], [ -82.907981, 36.878749 ], [ -82.906325, 36.879740 ], [ -82.895445, 36.882145 ], [ -82.890028, 36.884287 ], [ -82.887627, 36.886890 ], [ -82.884626, 36.888477 ], [ -82.879492, 36.889085 ], [ -82.878569, 36.889585 ], [ -82.877862, 36.891843 ], [ -82.878639, 36.893981 ], [ -82.876438, 36.896238 ], [ -82.873213, 36.897263 ], [ -82.870068, 36.901735 ], [ -82.872561, 36.903376 ], [ -82.877473, 36.907960 ], [ -82.876215, 36.910218 ], [ -82.873777, 36.912299 ], [ -82.872136, 36.913456 ], [ -82.867116, 36.917965 ], [ -82.865192, 36.920923 ], [ -82.863468, 36.922308 ], [ -82.861943, 36.924236 ], [ -82.860032, 36.925241 ], [ -82.858635, 36.927785 ], [ -82.857965, 36.929529 ], [ -82.858461, 36.932717 ], [ -82.858784, 36.933065 ], [ -82.860537, 36.937439 ], [ -82.861684, 36.939316 ], [ -82.861282, 36.944848 ], [ -82.860633, 36.945840 ], [ -82.859969, 36.949074 ], [ -82.856099, 36.952471 ], [ -82.855705, 36.953808 ], [ -82.858443, 36.954036 ], [ -82.860534, 36.956015 ], [ -82.862866, 36.957765 ], [ -82.864211, 36.957983 ], [ -82.865404, 36.958084 ], [ -82.867358, 36.963182 ], [ -82.870230, 36.965498 ], [ -82.870274, 36.965993 ], [ -82.869183, 36.974182 ], [ -82.868455, 36.976481 ], [ -82.867535, 36.977518 ], [ -82.866689, 36.978052 ], [ -82.866019, 36.978272 ], [ -82.864909, 36.979010 ], [ -82.862926, 36.979975 ], [ -82.860561, 36.978265 ], [ -82.857936, 36.978276 ], [ -82.856768, 36.979095 ], [ -82.856417, 36.982216 ], [ -82.853729, 36.985178 ], [ -82.852614, 36.984963 ], [ -82.851397, 36.984497 ], [ -82.849429, 36.983479 ], [ -82.845002, 36.983812 ], [ -82.841252, 36.986858 ], [ -82.840051, 36.987113 ], [ -82.838549, 36.987027 ], [ -82.836008, 36.988837 ], [ -82.833843, 36.991973 ], [ -82.830802, 36.993445 ], [ -82.829125, 36.997541 ], [ -82.830588, 37.000945 ], [ -82.829961, 37.003555 ], [ -82.828592, 37.005707 ], [ -82.825224, 37.006279 ], [ -82.822684, 37.004128 ], [ -82.821798, 37.004380 ], [ -82.819715, 37.006212 ], [ -82.818006, 37.006161 ], [ -82.815748, 37.007196 ], [ -82.813579, 37.005320 ], [ -82.800531, 37.007944 ], [ -82.797487, 37.009654 ], [ -82.796187, 37.008502 ], [ -82.795695, 37.006702 ], [ -82.794824, 37.005899 ], [ -82.793441, 37.005491 ], [ -82.790890, 37.006760 ], [ -82.790462, 37.007263 ], [ -82.789092, 37.007995 ], [ -82.788897, 37.008160 ], [ -82.782144, 37.008242 ], [ -82.778386, 37.012521 ], [ -82.777368, 37.015279 ], [ -82.771795, 37.015716 ], [ -82.767083, 37.020935 ], [ -82.766408, 37.023106 ], [ -82.759175, 37.027333 ], [ -82.754051, 37.026587 ], [ -82.751852, 37.025624 ], [ -82.750715, 37.024107 ], [ -82.747981, 37.025214 ], [ -82.745562, 37.029839 ], [ -82.743684, 37.041397 ], [ -82.742454, 37.042980 ], [ -82.733603, 37.044525 ], [ -82.731722, 37.043447 ], [ -82.726279, 37.042098 ], [ -82.724714, 37.042758 ], [ -82.722472, 37.045101 ], [ -82.723279, 37.047616 ], [ -82.723128, 37.052436 ], [ -82.722254, 37.057948 ], [ -82.723904, 37.062542 ], [ -82.726312, 37.066870 ], [ -82.727022, 37.073019 ], [ -82.723747, 37.075525 ], [ -82.721676, 37.075190 ], [ -82.718353, 37.075706 ], [ -82.716740, 37.077220 ], [ -82.717204, 37.079544 ], [ -82.718183, 37.080679 ], [ -82.720597, 37.081833 ], [ -82.723040, 37.084992 ], [ -82.724954, 37.091905 ], [ -82.724358, 37.092990 ], [ -82.722179, 37.094309 ], [ -82.721617, 37.101276 ], [ -82.721941, 37.105689 ], [ -82.726294, 37.111852 ], [ -82.726449, 37.114985 ], [ -82.726201, 37.115882 ], [ -82.722097, 37.120168 ], [ -82.718334, 37.122267 ], [ -82.716334, 37.122093 ], [ -82.707870, 37.125488 ], [ -82.695667, 37.131514 ], [ -82.684601, 37.135835 ], [ -82.679428, 37.135575 ], [ -82.676765, 37.134965 ], [ -82.671530, 37.138444 ], [ -82.667717, 37.141949 ], [ -82.662449, 37.143865 ], [ -82.657468, 37.145024 ], [ -82.654760, 37.150601 ], [ -82.653268, 37.151314 ], [ -82.651646, 37.151908 ], [ -82.633493, 37.154264 ], [ -82.624878, 37.162932 ], [ -82.617423, 37.168129 ], [ -82.608290, 37.173047 ], [ -82.597447, 37.177088 ], [ -82.592766, 37.180391 ], [ -82.593232, 37.182060 ], [ -82.592451, 37.182847 ], [ -82.586718, 37.185623 ], [ -82.578988, 37.188498 ], [ -82.565329, 37.196118 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US54", "STATE": "54", "NAME": "West Virginia", "LSAD": "", "CENSUSAREA": 24038.210000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -81.968297, 37.537798 ], [ -81.965401, 37.541171 ], [ -81.964971, 37.543026 ], [ -81.970147, 37.546504 ], [ -81.976386, 37.545426 ], [ -81.980841, 37.542357 ], [ -81.982479, 37.541807 ], [ -81.987511, 37.542835 ], [ -81.989092, 37.542514 ], [ -81.992597, 37.538323 ], [ -81.994033, 37.537612 ], [ -81.996909, 37.538572 ], [ -81.996912, 37.542808 ], [ -81.998177, 37.543082 ], [ -81.999844, 37.542579 ], [ -82.007412, 37.533677 ], [ -82.009194, 37.533243 ], [ -82.013966, 37.533564 ], [ -82.015920, 37.534321 ], [ -82.016925, 37.538556 ], [ -82.018878, 37.540572 ], [ -82.021006, 37.540526 ], [ -82.025261, 37.538261 ], [ -82.028826, 37.537667 ], [ -82.036932, 37.542729 ], [ -82.038024, 37.546918 ], [ -82.038972, 37.547926 ], [ -82.042825, 37.548361 ], [ -82.044780, 37.546713 ], [ -82.045155, 37.544516 ], [ -82.044810, 37.541814 ], [ -82.042396, 37.535770 ], [ -82.042397, 37.533916 ], [ -82.044382, 37.529017 ], [ -82.046653, 37.528193 ], [ -82.048205, 37.528972 ], [ -82.048463, 37.533962 ], [ -82.049584, 37.535222 ], [ -82.054787, 37.536756 ], [ -82.057460, 37.536893 ], [ -82.061256, 37.536001 ], [ -82.063326, 37.536206 ], [ -82.064418, 37.536870 ], [ -82.064792, 37.539021 ], [ -82.063671, 37.541929 ], [ -82.064418, 37.544516 ], [ -82.073246, 37.555023 ], [ -82.075030, 37.555824 ], [ -82.084605, 37.555410 ], [ -82.089178, 37.556004 ], [ -82.098924, 37.553300 ], [ -82.102893, 37.553046 ], [ -82.104532, 37.553275 ], [ -82.105136, 37.554007 ], [ -82.104303, 37.555655 ], [ -82.101946, 37.558106 ], [ -82.102263, 37.559456 ], [ -82.103127, 37.560097 ], [ -82.116584, 37.559588 ], [ -82.120609, 37.556999 ], [ -82.121985, 37.552763 ], [ -82.123824, 37.551389 ], [ -82.127089, 37.551345 ], [ -82.131776, 37.552423 ], [ -82.133299, 37.552996 ], [ -82.134506, 37.554439 ], [ -82.134705, 37.557278 ], [ -82.133495, 37.560711 ], [ -82.133954, 37.562245 ], [ -82.136800, 37.564421 ], [ -82.143183, 37.565773 ], [ -82.144563, 37.566941 ], [ -82.144648, 37.568315 ], [ -82.143468, 37.570375 ], [ -82.141828, 37.570946 ], [ -82.129604, 37.571972 ], [ -82.127303, 37.572681 ], [ -82.124372, 37.576410 ], [ -82.124307, 37.577806 ], [ -82.125601, 37.579021 ], [ -82.127321, 37.586667 ], [ -82.130165, 37.591544 ], [ -82.131977, 37.593537 ], [ -82.141555, 37.595166 ], [ -82.146419, 37.592650 ], [ -82.148434, 37.590910 ], [ -82.156718, 37.592790 ], [ -82.157609, 37.596773 ], [ -82.156110, 37.604945 ], [ -82.156741, 37.609202 ], [ -82.158554, 37.609546 ], [ -82.164454, 37.608014 ], [ -82.168137, 37.608495 ], [ -82.169057, 37.609869 ], [ -82.169200, 37.613028 ], [ -82.164767, 37.618292 ], [ -82.164191, 37.620192 ], [ -82.167126, 37.621818 ], [ -82.169515, 37.621978 ], [ -82.172710, 37.619850 ], [ -82.176682, 37.618202 ], [ -82.181430, 37.621842 ], [ -82.182438, 37.623971 ], [ -82.181398, 37.626798 ], [ -82.173482, 37.631055 ], [ -82.172446, 37.632589 ], [ -82.172762, 37.634008 ], [ -82.175956, 37.637396 ], [ -82.177511, 37.640417 ], [ -82.177338, 37.641722 ], [ -82.174688, 37.646529 ], [ -82.174631, 37.647422 ], [ -82.175264, 37.647971 ], [ -82.177625, 37.648956 ], [ -82.185456, 37.648933 ], [ -82.187989, 37.647582 ], [ -82.191444, 37.644378 ], [ -82.191242, 37.642867 ], [ -82.189688, 37.640394 ], [ -82.187845, 37.638540 ], [ -82.187471, 37.637029 ], [ -82.186320, 37.629292 ], [ -82.186694, 37.627576 ], [ -82.187298, 37.626935 ], [ -82.192394, 37.625606 ], [ -82.201201, 37.627895 ], [ -82.202467, 37.627483 ], [ -82.203388, 37.626132 ], [ -82.204337, 37.625811 ], [ -82.209691, 37.625103 ], [ -82.213490, 37.625408 ], [ -82.215649, 37.626244 ], [ -82.214815, 37.627572 ], [ -82.220200, 37.633912 ], [ -82.220257, 37.634781 ], [ -82.219078, 37.635903 ], [ -82.216690, 37.639956 ], [ -82.216691, 37.641329 ], [ -82.219340, 37.642931 ], [ -82.223602, 37.644554 ], [ -82.224956, 37.647003 ], [ -82.225535, 37.651947 ], [ -82.226111, 37.653092 ], [ -82.239390, 37.661465 ], [ -82.240773, 37.661785 ], [ -82.243911, 37.660959 ], [ -82.252273, 37.656907 ], [ -82.257111, 37.656749 ], [ -82.267962, 37.662407 ], [ -82.272021, 37.663782 ], [ -82.277876, 37.669998 ], [ -82.282297, 37.675826 ], [ -82.283506, 37.676078 ], [ -82.284687, 37.675277 ], [ -82.286446, 37.670127 ], [ -82.288174, 37.668227 ], [ -82.291773, 37.669143 ], [ -82.294393, 37.670448 ], [ -82.294710, 37.672257 ], [ -82.294134, 37.673378 ], [ -82.294392, 37.677957 ], [ -82.294737, 37.678277 ], [ -82.296724, 37.678071 ], [ -82.302312, 37.675554 ], [ -82.303953, 37.675760 ], [ -82.304501, 37.677157 ], [ -82.303867, 37.678392 ], [ -82.297126, 37.684228 ], [ -82.296118, 37.686174 ], [ -82.296262, 37.687067 ], [ -82.297788, 37.687753 ], [ -82.301504, 37.690775 ], [ -82.302886, 37.693683 ], [ -82.301964, 37.696223 ], [ -82.297325, 37.699817 ], [ -82.296634, 37.702403 ], [ -82.298074, 37.704143 ], [ -82.300954, 37.706135 ], [ -82.305679, 37.706708 ], [ -82.307235, 37.707669 ], [ -82.310665, 37.713300 ], [ -82.311097, 37.717329 ], [ -82.311702, 37.718771 ], [ -82.316197, 37.721541 ], [ -82.317869, 37.727720 ], [ -82.318302, 37.733053 ], [ -82.318879, 37.733763 ], [ -82.319686, 37.734404 ], [ -82.326834, 37.736257 ], [ -82.333349, 37.741200 ], [ -82.333581, 37.743283 ], [ -82.328221, 37.748480 ], [ -82.321415, 37.751269 ], [ -82.321012, 37.755435 ], [ -82.319023, 37.758892 ], [ -82.317668, 37.759624 ], [ -82.312968, 37.760677 ], [ -82.310893, 37.762005 ], [ -82.310777, 37.762692 ], [ -82.311642, 37.764294 ], [ -82.312824, 37.765027 ], [ -82.317611, 37.764889 ], [ -82.327356, 37.762233 ], [ -82.329460, 37.762393 ], [ -82.331162, 37.763125 ], [ -82.333816, 37.765391 ], [ -82.333903, 37.766306 ], [ -82.331654, 37.768161 ], [ -82.323696, 37.772534 ], [ -82.323004, 37.773907 ], [ -82.323696, 37.775028 ], [ -82.325830, 37.776172 ], [ -82.329867, 37.775897 ], [ -82.332607, 37.774249 ], [ -82.335981, 37.774500 ], [ -82.337596, 37.775369 ], [ -82.338895, 37.776857 ], [ -82.339097, 37.778276 ], [ -82.338377, 37.780428 ], [ -82.339705, 37.785509 ], [ -82.340455, 37.786058 ], [ -82.348849, 37.787178 ], [ -82.354275, 37.793104 ], [ -82.356122, 37.793859 ], [ -82.361199, 37.794429 ], [ -82.363795, 37.795435 ], [ -82.364979, 37.796784 ], [ -82.365557, 37.798318 ], [ -82.367780, 37.800628 ], [ -82.369973, 37.801749 ], [ -82.374867, 37.802160 ], [ -82.377393, 37.803009 ], [ -82.378514, 37.808320 ], [ -82.379580, 37.810907 ], [ -82.385259, 37.817410 ], [ -82.386586, 37.818212 ], [ -82.387769, 37.818212 ], [ -82.389212, 37.817206 ], [ -82.393746, 37.811668 ], [ -82.396978, 37.809014 ], [ -82.398710, 37.808785 ], [ -82.401652, 37.810091 ], [ -82.402228, 37.810984 ], [ -82.402199, 37.812678 ], [ -82.398444, 37.821648 ], [ -82.399680, 37.829935 ], [ -82.407874, 37.835499 ], [ -82.408941, 37.836644 ], [ -82.412172, 37.844793 ], [ -82.413153, 37.845343 ], [ -82.417367, 37.845664 ], [ -82.420484, 37.846809 ], [ -82.420484, 37.847496 ], [ -82.415460, 37.854132 ], [ -82.414651, 37.856260 ], [ -82.421983, 37.859397 ], [ -82.423513, 37.860313 ], [ -82.424264, 37.861709 ], [ -82.424090, 37.863037 ], [ -82.422127, 37.863952 ], [ -82.409799, 37.865392 ], [ -82.408441, 37.866056 ], [ -82.407459, 37.867475 ], [ -82.410288, 37.868826 ], [ -82.414417, 37.869033 ], [ -82.416323, 37.869628 ], [ -82.417679, 37.870658 ], [ -82.418690, 37.872375 ], [ -82.419337, 37.875095 ], [ -82.419204, 37.882081 ], [ -82.419781, 37.883821 ], [ -82.421484, 37.885652 ], [ -82.429023, 37.888285 ], [ -82.432113, 37.889910 ], [ -82.435751, 37.897028 ], [ -82.438582, 37.900256 ], [ -82.447596, 37.904352 ], [ -82.451352, 37.908472 ], [ -82.452883, 37.908998 ], [ -82.457794, 37.909089 ], [ -82.459759, 37.909569 ], [ -82.460741, 37.910736 ], [ -82.461493, 37.913093 ], [ -82.462881, 37.914832 ], [ -82.464297, 37.915038 ], [ -82.468197, 37.913847 ], [ -82.468947, 37.910962 ], [ -82.468568, 37.904005 ], [ -82.469058, 37.902220 ], [ -82.471223, 37.899358 ], [ -82.472523, 37.899243 ], [ -82.474574, 37.900295 ], [ -82.475991, 37.902400 ], [ -82.475818, 37.904048 ], [ -82.474635, 37.905902 ], [ -82.474232, 37.908054 ], [ -82.474666, 37.910388 ], [ -82.475534, 37.911945 ], [ -82.479320, 37.914827 ], [ -82.487556, 37.916975 ], [ -82.488279, 37.918120 ], [ -82.487616, 37.919905 ], [ -82.481001, 37.924303 ], [ -82.480338, 37.925836 ], [ -82.483951, 37.927025 ], [ -82.495740, 37.927043 ], [ -82.498140, 37.928300 ], [ -82.501862, 37.933200 ], [ -82.501948, 37.934756 ], [ -82.500386, 37.936518 ], [ -82.497540, 37.936791 ], [ -82.491182, 37.935810 ], [ -82.489737, 37.936635 ], [ -82.489160, 37.937963 ], [ -82.489045, 37.938718 ], [ -82.489566, 37.939107 ], [ -82.493728, 37.940455 ], [ -82.496822, 37.942262 ], [ -82.497285, 37.942903 ], [ -82.497300, 37.945507 ], [ -82.496681, 37.946405 ], [ -82.495294, 37.946612 ], [ -82.487836, 37.945288 ], [ -82.485120, 37.946044 ], [ -82.480960, 37.949136 ], [ -82.475096, 37.954906 ], [ -82.471801, 37.959119 ], [ -82.471657, 37.959988 ], [ -82.472669, 37.960721 ], [ -82.479031, 37.962000 ], [ -82.484265, 37.963646 ], [ -82.484758, 37.965752 ], [ -82.484413, 37.969895 ], [ -82.483836, 37.971566 ], [ -82.479963, 37.973169 ], [ -82.469380, 37.973059 ], [ -82.464987, 37.976859 ], [ -82.464067, 37.980295 ], [ -82.464257, 37.983412 ], [ -82.465473, 37.984780 ], [ -82.467015, 37.985578 ], [ -82.471629, 37.986826 ], [ -82.482695, 37.984014 ], [ -82.483871, 37.984505 ], [ -82.485128, 37.986920 ], [ -82.485675, 37.989352 ], [ -82.485967, 37.995705 ], [ -82.487732, 37.998330 ], [ -82.489780, 37.998869 ], [ -82.499874, 37.999157 ], [ -82.507197, 38.001512 ], [ -82.509812, 38.001249 ], [ -82.513271, 37.999674 ], [ -82.515974, 37.999929 ], [ -82.517351, 38.001204 ], [ -82.517810, 38.002479 ], [ -82.517351, 38.005131 ], [ -82.517606, 38.007222 ], [ -82.519665, 38.008538 ], [ -82.522591, 38.012968 ], [ -82.525831, 38.019564 ], [ -82.525817, 38.026406 ], [ -82.527068, 38.027586 ], [ -82.530371, 38.028792 ], [ -82.534976, 38.032250 ], [ -82.538639, 38.037381 ], [ -82.539071, 38.039788 ], [ -82.537470, 38.042701 ], [ -82.537293, 38.045204 ], [ -82.541245, 38.048444 ], [ -82.543916, 38.052133 ], [ -82.544779, 38.054262 ], [ -82.544850, 38.058521 ], [ -82.547284, 38.061094 ], [ -82.549407, 38.063063 ], [ -82.549580, 38.068579 ], [ -82.551259, 38.070799 ], [ -82.559598, 38.072837 ], [ -82.565736, 38.080640 ], [ -82.574075, 38.082104 ], [ -82.584039, 38.090663 ], [ -82.585488, 38.094256 ], [ -82.585142, 38.098055 ], [ -82.585696, 38.107003 ], [ -82.587782, 38.108879 ], [ -82.591780, 38.109908 ], [ -82.593605, 38.110869 ], [ -82.598011, 38.115925 ], [ -82.600127, 38.117389 ], [ -82.602618, 38.118350 ], [ -82.606589, 38.120843 ], [ -82.616149, 38.120221 ], [ -82.619452, 38.120745 ], [ -82.620351, 38.121477 ], [ -82.621164, 38.123239 ], [ -82.621167, 38.131996 ], [ -82.622125, 38.133414 ], [ -82.626182, 38.134835 ], [ -82.634265, 38.136669 ], [ -82.636466, 38.137860 ], [ -82.637306, 38.139050 ], [ -82.638288, 38.143491 ], [ -82.638398, 38.152157 ], [ -82.638947, 38.156742 ], [ -82.644739, 38.165487 ], [ -82.642997, 38.169560 ], [ -82.639054, 38.171114 ], [ -82.625457, 38.170491 ], [ -82.619429, 38.169027 ], [ -82.613487, 38.170242 ], [ -82.611343, 38.171548 ], [ -82.604250, 38.187639 ], [ -82.599326, 38.197231 ], [ -82.598864, 38.201007 ], [ -82.598437, 38.217393 ], [ -82.600353, 38.218949 ], [ -82.605750, 38.221144 ], [ -82.608944, 38.223660 ], [ -82.610367, 38.226772 ], [ -82.612520, 38.234553 ], [ -82.612260, 38.236087 ], [ -82.607131, 38.245975 ], [ -82.605333, 38.247303 ], [ -82.604230, 38.247303 ], [ -82.594970, 38.245453 ], [ -82.586061, 38.245616 ], [ -82.584001, 38.246371 ], [ -82.581796, 38.248592 ], [ -82.578254, 38.254809 ], [ -82.574656, 38.263873 ], [ -82.574600, 38.274721 ], [ -82.576720, 38.277513 ], [ -82.578782, 38.281747 ], [ -82.579480, 38.284928 ], [ -82.579743, 38.291726 ], [ -82.582823, 38.295478 ], [ -82.583056, 38.296829 ], [ -82.581460, 38.300445 ], [ -82.578352, 38.305458 ], [ -82.572893, 38.311981 ], [ -82.571964, 38.313606 ], [ -82.571877, 38.315781 ], [ -82.572691, 38.318801 ], [ -82.576936, 38.328275 ], [ -82.585363, 38.334064 ], [ -82.587951, 38.338595 ], [ -82.589724, 38.340265 ], [ -82.592543, 38.341660 ], [ -82.596525, 38.342849 ], [ -82.597979, 38.344909 ], [ -82.598189, 38.357885 ], [ -82.597524, 38.364843 ], [ -82.596654, 38.367338 ], [ -82.593952, 38.371847 ], [ -82.593008, 38.375082 ], [ -82.595382, 38.382712 ], [ -82.595369, 38.382722 ], [ -82.599273, 38.388738 ], [ -82.599737, 38.390370 ], [ -82.599241, 38.393170 ], [ -82.597801, 38.395154 ], [ -82.595001, 38.401330 ], [ -82.597033, 38.409937 ], [ -82.597113, 38.412881 ], [ -82.596281, 38.417681 ], [ -82.593673, 38.421809 ], [ -82.588249, 38.415489 ], [ -82.579976, 38.410130 ], [ -82.577176, 38.408770 ], [ -82.569368, 38.406258 ], [ -82.560664, 38.404338 ], [ -82.549799, 38.403202 ], [ -82.540199, 38.403666 ], [ -82.529579, 38.405182 ], [ -82.507678, 38.410782 ], [ -82.486577, 38.418082 ], [ -82.459676, 38.424682 ], [ -82.447076, 38.426982 ], [ -82.434375, 38.430082 ], [ -82.404882, 38.439347 ], [ -82.389746, 38.434355 ], [ -82.381773, 38.434783 ], [ -82.360145, 38.438596 ], [ -82.340640, 38.440948 ], [ -82.330335, 38.444500 ], [ -82.323999, 38.449268 ], [ -82.318111, 38.457876 ], [ -82.313935, 38.468084 ], [ -82.312511, 38.476116 ], [ -82.310639, 38.483172 ], [ -82.306351, 38.490692 ], [ -82.304223, 38.496308 ], [ -82.303071, 38.504384 ], [ -82.303971, 38.517683 ], [ -82.302871, 38.523183 ], [ -82.300271, 38.529383 ], [ -82.297771, 38.533283 ], [ -82.295671, 38.538483 ], [ -82.293271, 38.560283 ], [ -82.293871, 38.572683 ], [ -82.293471, 38.575383 ], [ -82.291271, 38.578983 ], [ -82.274270, 38.593683 ], [ -82.271470, 38.595383 ], [ -82.262070, 38.598183 ], [ -82.252469, 38.598783 ], [ -82.245969, 38.598483 ], [ -82.222168, 38.591384 ], [ -82.218967, 38.591683 ], [ -82.205171, 38.591719 ], [ -82.193824, 38.593096 ], [ -82.188767, 38.594984 ], [ -82.181967, 38.599384 ], [ -82.177267, 38.603784 ], [ -82.175167, 38.608484 ], [ -82.172066, 38.619284 ], [ -82.172066, 38.625984 ], [ -82.172667, 38.629684 ], [ -82.174267, 38.633183 ], [ -82.176767, 38.642783 ], [ -82.179067, 38.648883 ], [ -82.185567, 38.659583 ], [ -82.186067, 38.666783 ], [ -82.187667, 38.672683 ], [ -82.190867, 38.680383 ], [ -82.190167, 38.687382 ], [ -82.185067, 38.699182 ], [ -82.182867, 38.705482 ], [ -82.182467, 38.708782 ], [ -82.184567, 38.715882 ], [ -82.186568, 38.722482 ], [ -82.188268, 38.734082 ], [ -82.189668, 38.737382 ], [ -82.193268, 38.741182 ], [ -82.195606, 38.752441 ], [ -82.198882, 38.757725 ], [ -82.201537, 38.760372 ], [ -82.207141, 38.763943 ], [ -82.216614, 38.768350 ], [ -82.220449, 38.773739 ], [ -82.221518, 38.779810 ], [ -82.221566, 38.787187 ], [ -82.217269, 38.795680 ], [ -82.214494, 38.798691 ], [ -82.209290, 38.802672 ], [ -82.199280, 38.808688 ], [ -82.191172, 38.815137 ], [ -82.179478, 38.817376 ], [ -82.165898, 38.822437 ], [ -82.161570, 38.824632 ], [ -82.147667, 38.836980 ], [ -82.144867, 38.840480 ], [ -82.141616, 38.851394 ], [ -82.139224, 38.865020 ], [ -82.139988, 38.870345 ], [ -82.142167, 38.877080 ], [ -82.145267, 38.883479 ], [ -82.144567, 38.891679 ], [ -82.143167, 38.898079 ], [ -82.134766, 38.905579 ], [ -82.128866, 38.909979 ], [ -82.120966, 38.921079 ], [ -82.111666, 38.932579 ], [ -82.110565, 38.935279 ], [ -82.110866, 38.940379 ], [ -82.109065, 38.945579 ], [ -82.100565, 38.955678 ], [ -82.094865, 38.964578 ], [ -82.093165, 38.970980 ], [ -82.091565, 38.973778 ], [ -82.089065, 38.975978 ], [ -82.079364, 38.981078 ], [ -82.068864, 38.984878 ], [ -82.058764, 38.990078 ], [ -82.051563, 38.994378 ], [ -82.049163, 38.997278 ], [ -82.045663, 39.003778 ], [ -82.041563, 39.017878 ], [ -82.038763, 39.022678 ], [ -82.035963, 39.025478 ], [ -82.027262, 39.028378 ], [ -82.017562, 39.030078 ], [ -82.007062, 39.029578 ], [ -82.002261, 39.027878 ], [ -81.994961, 39.022478 ], [ -81.991361, 39.018378 ], [ -81.987061, 39.011978 ], [ -81.983761, 39.005478 ], [ -81.982761, 39.001978 ], [ -81.982032, 38.995697 ], [ -81.981158, 38.994351 ], [ -81.979371, 38.993193 ], [ -81.977455, 38.992679 ], [ -81.973871, 38.992413 ], [ -81.967769, 38.992955 ], [ -81.960832, 38.994275 ], [ -81.959260, 38.995227 ], [ -81.951447, 38.996032 ], [ -81.941829, 38.993295 ], [ -81.936828, 38.990414 ], [ -81.933186, 38.987659 ], [ -81.926561, 38.977508 ], [ -81.918214, 38.966595 ], [ -81.912443, 38.954343 ], [ -81.906600, 38.945262 ], [ -81.900595, 38.937671 ], [ -81.898470, 38.929603 ], [ -81.899953, 38.925405 ], [ -81.900910, 38.924338 ], [ -81.908341, 38.917403 ], [ -81.911936, 38.915564 ], [ -81.917757, 38.910604 ], [ -81.919098, 38.908615 ], [ -81.926671, 38.901311 ], [ -81.928352, 38.895371 ], [ -81.928000, 38.893492 ], [ -81.926967, 38.891602 ], [ -81.915898, 38.884270 ], [ -81.910312, 38.879294 ], [ -81.908645, 38.878460 ], [ -81.898541, 38.874582 ], [ -81.892837, 38.873869 ], [ -81.889233, 38.874279 ], [ -81.874857, 38.881174 ], [ -81.858921, 38.890190 ], [ -81.855971, 38.892734 ], [ -81.848653, 38.901407 ], [ -81.845312, 38.910088 ], [ -81.846070, 38.913192 ], [ -81.844486, 38.928746 ], [ -81.838067, 38.937135 ], [ -81.831516, 38.943697 ], [ -81.827354, 38.945898 ], [ -81.825026, 38.946603 ], [ -81.819692, 38.947016 ], [ -81.814235, 38.946168 ], [ -81.806137, 38.942112 ], [ -81.796376, 38.932498 ], [ -81.793372, 38.930204 ], [ -81.785647, 38.926193 ], [ -81.781248, 38.924804 ], [ -81.774106, 38.922965 ], [ -81.769760, 38.922730 ], [ -81.766227, 38.922946 ], [ -81.762659, 38.924121 ], [ -81.759995, 38.925828 ], [ -81.758506, 38.927942 ], [ -81.756131, 38.933545 ], [ -81.756975, 38.937152 ], [ -81.769703, 38.948707 ], [ -81.773960, 38.951645 ], [ -81.778845, 38.955892 ], [ -81.780736, 38.958975 ], [ -81.781820, 38.964935 ], [ -81.779883, 38.972773 ], [ -81.775734, 38.980737 ], [ -81.776466, 38.982048 ], [ -81.776723, 38.985142 ], [ -81.775551, 38.990107 ], [ -81.774062, 38.993682 ], [ -81.771975, 38.996845 ], [ -81.767188, 39.000115 ], [ -81.765153, 39.002579 ], [ -81.764253, 39.006579 ], [ -81.764253, 39.015279 ], [ -81.767253, 39.019979 ], [ -81.772854, 39.026179 ], [ -81.786554, 39.036579 ], [ -81.793304, 39.040353 ], [ -81.800355, 39.044978 ], [ -81.803355, 39.047678 ], [ -81.808955, 39.055178 ], [ -81.811655, 39.059578 ], [ -81.813355, 39.065878 ], [ -81.814155, 39.073478 ], [ -81.813855, 39.079278 ], [ -81.812355, 39.082078 ], [ -81.810655, 39.083278 ], [ -81.807855, 39.083978 ], [ -81.803055, 39.083878 ], [ -81.798155, 39.082878 ], [ -81.790754, 39.079778 ], [ -81.785554, 39.078578 ], [ -81.781454, 39.078078 ], [ -81.775554, 39.078378 ], [ -81.764854, 39.081978 ], [ -81.760753, 39.084078 ], [ -81.752353, 39.089878 ], [ -81.747253, 39.095378 ], [ -81.745453, 39.098078 ], [ -81.743853, 39.102378 ], [ -81.742953, 39.106578 ], [ -81.742153, 39.116777 ], [ -81.744568, 39.126816 ], [ -81.744838, 39.130898 ], [ -81.744525, 39.138829 ], [ -81.743565, 39.141933 ], [ -81.744621, 39.148413 ], [ -81.754254, 39.171476 ], [ -81.756254, 39.177276 ], [ -81.755754, 39.180976 ], [ -81.752754, 39.184676 ], [ -81.749853, 39.186489 ], [ -81.741533, 39.189596 ], [ -81.737085, 39.193836 ], [ -81.735805, 39.196268 ], [ -81.733357, 39.205868 ], [ -81.729949, 39.211884 ], [ -81.726973, 39.215068 ], [ -81.724365, 39.216508 ], [ -81.711628, 39.219228 ], [ -81.700908, 39.220844 ], [ -81.694603, 39.224107 ], [ -81.692395, 39.226443 ], [ -81.691339, 39.227947 ], [ -81.691067, 39.230139 ], [ -81.692203, 39.236091 ], [ -81.695724, 39.242859 ], [ -81.696636, 39.246123 ], [ -81.696988, 39.248747 ], [ -81.696380, 39.257035 ], [ -81.692060, 39.263227 ], [ -81.689483, 39.266043 ], [ -81.683627, 39.270939 ], [ -81.678331, 39.273755 ], [ -81.670187, 39.275963 ], [ -81.656138, 39.277355 ], [ -81.643178, 39.277195 ], [ -81.621305, 39.273643 ], [ -81.613896, 39.275339 ], [ -81.608408, 39.276043 ], [ -81.603352, 39.275531 ], [ -81.595160, 39.273387 ], [ -81.588583, 39.269787 ], [ -81.585559, 39.268747 ], [ -81.570247, 39.267675 ], [ -81.567347, 39.270675 ], [ -81.565247, 39.276175 ], [ -81.565047, 39.293874 ], [ -81.560147, 39.317874 ], [ -81.559647, 39.330774 ], [ -81.557547, 39.338774 ], [ -81.542346, 39.352874 ], [ -81.534470, 39.358234 ], [ -81.524309, 39.361610 ], [ -81.513493, 39.367050 ], [ -81.503189, 39.373242 ], [ -81.489044, 39.384074 ], [ -81.482900, 39.389674 ], [ -81.473188, 39.400170 ], [ -81.467744, 39.403774 ], [ -81.456143, 39.409274 ], [ -81.446543, 39.410374 ], [ -81.435642, 39.408474 ], [ -81.428642, 39.405374 ], [ -81.420578, 39.400378 ], [ -81.412706, 39.394618 ], [ -81.406689, 39.388090 ], [ -81.402770, 39.376914 ], [ -81.400744, 39.369221 ], [ -81.395883, 39.355553 ], [ -81.393794, 39.351706 ], [ -81.391249, 39.348814 ], [ -81.384556, 39.343449 ], [ -81.379674, 39.342081 ], [ -81.375961, 39.341697 ], [ -81.356911, 39.343178 ], [ -81.347567, 39.345770 ], [ -81.342623, 39.348042 ], [ -81.335599, 39.352794 ], [ -81.326174, 39.358186 ], [ -81.319598, 39.361290 ], [ -81.304798, 39.370538 ], [ -81.297517, 39.374378 ], [ -81.281405, 39.379258 ], [ -81.275677, 39.383786 ], [ -81.270716, 39.385914 ], [ -81.259788, 39.386698 ], [ -81.249088, 39.389992 ], [ -81.241840, 39.390276 ], [ -81.223581, 39.386062 ], [ -81.221372, 39.386172 ], [ -81.217315, 39.387590 ], [ -81.213064, 39.390656 ], [ -81.211654, 39.392977 ], [ -81.210870, 39.397112 ], [ -81.211433, 39.402031 ], [ -81.210833, 39.403563 ], [ -81.208231, 39.407147 ], [ -81.205223, 39.410786 ], [ -81.200412, 39.415303 ], [ -81.190714, 39.423562 ], [ -81.185946, 39.430731 ], [ -81.182307, 39.433533 ], [ -81.179934, 39.435121 ], [ -81.170634, 39.439175 ], [ -81.163520, 39.441186 ], [ -81.152534, 39.443175 ], [ -81.138134, 39.443775 ], [ -81.134434, 39.445075 ], [ -81.132534, 39.446275 ], [ -81.128533, 39.449375 ], [ -81.124733, 39.453375 ], [ -81.115133, 39.466275 ], [ -81.114433, 39.466275 ], [ -81.100833, 39.487175 ], [ -81.091433, 39.496975 ], [ -81.075950, 39.509660 ], [ -81.070594, 39.515991 ], [ -81.060379, 39.522744 ], [ -81.051982, 39.529310 ], [ -81.049955, 39.531893 ], [ -81.044902, 39.536300 ], [ -81.030169, 39.545211 ], [ -81.026662, 39.548547 ], [ -81.023900, 39.552313 ], [ -81.020055, 39.555410 ], [ -81.008660, 39.562798 ], [ -80.996804, 39.569120 ], [ -80.993695, 39.571253 ], [ -80.987732, 39.577262 ], [ -80.978664, 39.583517 ], [ -80.970436, 39.590127 ], [ -80.943782, 39.606926 ], [ -80.936906, 39.612616 ], [ -80.933292, 39.614812 ], [ -80.925841, 39.617396 ], [ -80.917620, 39.618703 ], [ -80.906247, 39.618431 ], [ -80.896514, 39.616757 ], [ -80.892208, 39.616756 ], [ -80.880360, 39.620706 ], [ -80.876002, 39.627084 ], [ -80.871020, 39.638963 ], [ -80.870473, 39.641764 ], [ -80.870771, 39.642885 ], [ -80.869802, 39.646896 ], [ -80.866647, 39.652616 ], [ -80.865575, 39.662751 ], [ -80.866670, 39.678487 ], [ -80.866330, 39.683167 ], [ -80.865805, 39.686484 ], [ -80.863698, 39.691724 ], [ -80.861718, 39.693625 ], [ -80.854599, 39.697473 ], [ -80.852000, 39.698560 ], [ -80.844721, 39.699440 ], [ -80.839112, 39.701033 ], [ -80.833882, 39.703497 ], [ -80.831871, 39.705655 ], [ -80.829764, 39.711839 ], [ -80.829723, 39.714041 ], [ -80.831551, 39.719475 ], [ -80.834563, 39.721582 ], [ -80.836597, 39.723925 ], [ -80.846091, 39.737812 ], [ -80.852738, 39.741040 ], [ -80.854717, 39.742592 ], [ -80.865339, 39.753251 ], [ -80.867596, 39.757116 ], [ -80.869933, 39.763555 ], [ -80.869092, 39.766364 ], [ -80.866329, 39.771738 ], [ -80.863048, 39.775197 ], [ -80.835311, 39.790690 ], [ -80.826079, 39.798584 ], [ -80.824969, 39.801092 ], [ -80.822181, 39.811708 ], [ -80.822480, 39.824971 ], [ -80.823030, 39.827484 ], [ -80.826228, 39.835802 ], [ -80.826964, 39.841656 ], [ -80.826124, 39.844238 ], [ -80.824276, 39.847159 ], [ -80.821279, 39.849982 ], [ -80.816430, 39.853032 ], [ -80.799898, 39.858912 ], [ -80.793131, 39.863751 ], [ -80.790761, 39.867280 ], [ -80.790156, 39.872252 ], [ -80.793989, 39.882787 ], [ -80.796162, 39.885530 ], [ -80.802339, 39.891610 ], [ -80.806179, 39.897306 ], [ -80.809011, 39.903226 ], [ -80.809683, 39.906106 ], [ -80.809283, 39.910314 ], [ -80.807618, 39.914938 ], [ -80.806018, 39.917130 ], [ -80.803394, 39.918762 ], [ -80.800530, 39.919434 ], [ -80.795714, 39.919690 ], [ -80.782849, 39.917162 ], [ -80.772641, 39.911306 ], [ -80.768272, 39.909642 ], [ -80.762592, 39.908906 ], [ -80.760656, 39.908906 ], [ -80.759296, 39.909466 ], [ -80.758304, 39.910426 ], [ -80.756432, 39.913930 ], [ -80.755936, 39.916554 ], [ -80.756784, 39.920586 ], [ -80.761312, 39.929098 ], [ -80.764511, 39.946602 ], [ -80.764479, 39.950250 ], [ -80.763375, 39.953514 ], [ -80.758527, 39.959241 ], [ -80.755135, 39.961561 ], [ -80.746270, 39.966233 ], [ -80.743166, 39.969113 ], [ -80.740126, 39.970793 ], [ -80.738717, 39.985113 ], [ -80.740045, 39.993929 ], [ -80.741085, 39.996857 ], [ -80.742045, 40.005641 ], [ -80.741901, 40.007929 ], [ -80.740509, 40.015225 ], [ -80.737805, 40.020761 ], [ -80.737341, 40.022969 ], [ -80.737389, 40.027593 ], [ -80.736300, 40.029929 ], [ -80.733304, 40.033272 ], [ -80.731504, 40.037472 ], [ -80.730904, 40.046672 ], [ -80.730904, 40.049172 ], [ -80.733104, 40.058772 ], [ -80.734304, 40.059672 ], [ -80.737104, 40.064972 ], [ -80.738504, 40.071472 ], [ -80.738604, 40.075672 ], [ -80.736804, 40.080072 ], [ -80.730704, 40.086472 ], [ -80.713003, 40.096872 ], [ -80.710203, 40.099572 ], [ -80.709102, 40.101472 ], [ -80.707702, 40.105372 ], [ -80.706702, 40.110872 ], [ -80.707002, 40.113272 ], [ -80.708106, 40.117256 ], [ -80.708810, 40.118088 ], [ -80.710554, 40.125271 ], [ -80.710042, 40.138311 ], [ -80.707322, 40.144999 ], [ -80.705994, 40.151591 ], [ -80.704602, 40.154823 ], [ -80.686137, 40.181607 ], [ -80.683705, 40.184215 ], [ -80.682008, 40.185495 ], [ -80.679600, 40.186371 ], [ -80.672600, 40.192371 ], [ -80.668100, 40.199671 ], [ -80.666299, 40.206271 ], [ -80.664299, 40.219170 ], [ -80.661543, 40.229798 ], [ -80.652098, 40.244970 ], [ -80.644598, 40.251270 ], [ -80.637198, 40.255070 ], [ -80.637098, 40.254270 ], [ -80.622497, 40.261770 ], [ -80.619297, 40.265170 ], [ -80.616196, 40.272270 ], [ -80.616796, 40.285269 ], [ -80.614896, 40.291969 ], [ -80.606596, 40.303869 ], [ -80.602895, 40.307069 ], [ -80.599895, 40.317669 ], [ -80.600495, 40.321169 ], [ -80.602895, 40.327869 ], [ -80.610796, 40.340868 ], [ -80.612796, 40.347668 ], [ -80.611796, 40.355168 ], [ -80.608695, 40.361968 ], [ -80.607595, 40.369568 ], [ -80.609695, 40.374968 ], [ -80.614396, 40.378768 ], [ -80.619196, 40.381768 ], [ -80.630740, 40.384900 ], [ -80.631596, 40.385468 ], [ -80.633596, 40.390467 ], [ -80.632196, 40.393667 ], [ -80.628096, 40.395867 ], [ -80.615195, 40.399867 ], [ -80.612195, 40.402667 ], [ -80.611795, 40.403867 ], [ -80.612695, 40.407667 ], [ -80.612295, 40.418567 ], [ -80.612995, 40.429367 ], [ -80.612295, 40.434867 ], [ -80.611195, 40.437767 ], [ -80.604895, 40.446667 ], [ -80.604395, 40.449767 ], [ -80.598294, 40.458366 ], [ -80.596094, 40.463366 ], [ -80.594794, 40.471366 ], [ -80.595494, 40.475266 ], [ -80.599194, 40.482566 ], [ -80.602450, 40.484226 ], [ -80.609058, 40.489506 ], [ -80.618003, 40.502049 ], [ -80.620883, 40.512257 ], [ -80.622195, 40.520497 ], [ -80.627507, 40.535793 ], [ -80.630483, 40.537921 ], [ -80.633107, 40.538705 ], [ -80.641380, 40.548417 ], [ -80.652436, 40.562544 ], [ -80.655316, 40.565184 ], [ -80.662708, 40.570176 ], [ -80.666917, 40.573664 ], [ -80.667781, 40.578096 ], [ -80.667957, 40.582496 ], [ -80.665892, 40.587728 ], [ -80.662564, 40.591600 ], [ -80.655188, 40.596544 ], [ -80.653972, 40.596480 ], [ -80.651716, 40.597744 ], [ -80.644963, 40.603648 ], [ -80.639379, 40.611280 ], [ -80.634355, 40.616095 ], [ -80.627171, 40.619936 ], [ -80.616002, 40.621696 ], [ -80.603876, 40.625064 ], [ -80.598764, 40.625263 ], [ -80.594065, 40.623664 ], [ -80.592049, 40.622496 ], [ -80.583633, 40.615520 ], [ -80.579856, 40.614304 ], [ -80.576736, 40.614224 ], [ -80.571936, 40.615456 ], [ -80.567840, 40.617552 ], [ -80.560720, 40.623680 ], [ -80.551126, 40.628847 ], [ -80.545892, 40.629702 ], [ -80.539541, 40.632122 ], [ -80.532737, 40.635590 ], [ -80.530093, 40.636255 ], [ -80.525660, 40.636068 ], [ -80.521917, 40.636992 ], [ -80.518991, 40.638801 ], [ -80.519039, 40.616391 ], [ -80.519086, 40.616385 ], [ -80.519086, 40.590161 ], [ -80.519055, 40.590173 ], [ -80.519057, 40.517922 ], [ -80.519054, 40.517922 ], [ -80.518990, 40.473667 ], [ -80.517690, 40.462467 ], [ -80.517991, 40.398868 ], [ -80.517991, 40.367968 ], [ -80.519039, 40.342101 ], [ -80.519056, 40.172771 ], [ -80.519056, 40.172744 ], [ -80.519104, 40.159672 ], [ -80.518960, 40.078089 ], [ -80.519008, 40.077001 ], [ -80.519120, 40.016410 ], [ -80.519207, 39.963381 ], [ -80.519218, 39.962424 ], [ -80.519203, 39.959394 ], [ -80.519175, 39.956648 ], [ -80.519115, 39.939188 ], [ -80.519248, 39.936967 ], [ -80.518891, 39.890964 ], [ -80.519423, 39.806181 ], [ -80.519342, 39.721403 ], [ -80.421388, 39.721189 ], [ -80.309457, 39.721264 ], [ -80.308651, 39.721283 ], [ -80.075947, 39.721350 ], [ -79.853131, 39.720713 ], [ -79.852904, 39.720713 ], [ -79.763774, 39.720776 ], [ -79.610623, 39.721245 ], [ -79.608223, 39.721154 ], [ -79.548465, 39.720778 ], [ -79.476662, 39.721078 ], [ -79.476574, 39.644206 ], [ -79.476968, 39.642986 ], [ -79.477764, 39.642282 ], [ -79.478866, 39.531689 ], [ -79.482366, 39.531689 ], [ -79.482354, 39.524682 ], [ -79.482648, 39.521364 ], [ -79.484372, 39.344300 ], [ -79.486072, 39.344300 ], [ -79.486812, 39.296367 ], [ -79.487651, 39.279933 ], [ -79.486737, 39.278149 ], [ -79.487274, 39.265205 ], [ -79.486179, 39.264970 ], [ -79.485874, 39.264905 ], [ -79.486873, 39.205961 ], [ -79.476037, 39.203728 ], [ -79.469156, 39.207300 ], [ -79.452685, 39.211719 ], [ -79.439830, 39.217074 ], [ -79.424413, 39.228171 ], [ -79.425059, 39.233686 ], [ -79.420350, 39.238880 ], [ -79.412051, 39.240546 ], [ -79.387023, 39.265540 ], [ -79.376154, 39.273154 ], [ -79.361343, 39.274924 ], [ -79.353750, 39.278039 ], [ -79.343801, 39.286096 ], [ -79.343625, 39.287148 ], [ -79.345599, 39.289733 ], [ -79.344344, 39.293534 ], [ -79.332380, 39.299919 ], [ -79.314768, 39.304381 ], [ -79.302311, 39.299554 ], [ -79.292710, 39.298729 ], [ -79.290236, 39.299323 ], [ -79.283723, 39.309640 ], [ -79.282037, 39.323048 ], [ -79.269365, 39.330732 ], [ -79.255306, 39.335874 ], [ -79.253891, 39.337222 ], [ -79.253928, 39.354085 ], [ -79.252270, 39.356663 ], [ -79.235878, 39.358689 ], [ -79.229247, 39.363662 ], [ -79.220357, 39.363157 ], [ -79.213961, 39.365320 ], [ -79.202943, 39.377872 ], [ -79.197937, 39.386132 ], [ -79.195543, 39.387790 ], [ -79.193332, 39.387974 ], [ -79.189465, 39.386500 ], [ -79.179335, 39.388342 ], [ -79.176977, 39.392130 ], [ -79.174600, 39.392756 ], [ -79.170494, 39.392026 ], [ -79.167220, 39.393256 ], [ -79.165593, 39.397134 ], [ -79.166497, 39.400888 ], [ -79.161340, 39.411895 ], [ -79.159213, 39.413021 ], [ -79.157212, 39.413021 ], [ -79.153584, 39.412020 ], [ -79.151583, 39.408768 ], [ -79.149581, 39.407767 ], [ -79.147455, 39.407767 ], [ -79.145453, 39.407767 ], [ -79.143827, 39.408517 ], [ -79.142701, 39.410519 ], [ -79.141950, 39.414272 ], [ -79.140699, 39.416649 ], [ -79.136696, 39.417649 ], [ -79.132193, 39.418275 ], [ -79.129816, 39.419901 ], [ -79.128941, 39.423279 ], [ -79.129404, 39.426637 ], [ -79.129047, 39.429542 ], [ -79.124036, 39.433204 ], [ -79.121560, 39.432786 ], [ -79.119433, 39.433161 ], [ -79.117932, 39.434412 ], [ -79.116932, 39.435788 ], [ -79.116574, 39.438058 ], [ -79.116369, 39.440482 ], [ -79.114070, 39.443321 ], [ -79.107933, 39.445748 ], [ -79.104217, 39.448358 ], [ -79.095428, 39.462548 ], [ -79.096154, 39.465542 ], [ -79.098240, 39.468445 ], [ -79.099057, 39.470259 ], [ -79.098875, 39.471438 ], [ -79.098059, 39.472073 ], [ -79.096517, 39.472799 ], [ -79.094702, 39.473253 ], [ -79.091329, 39.472407 ], [ -79.083270, 39.471379 ], [ -79.068627, 39.474515 ], [ -79.056583, 39.471014 ], [ -79.054989, 39.473096 ], [ -79.053880, 39.480094 ], [ -79.052447, 39.482315 ], [ -79.050528, 39.483299 ], [ -79.046276, 39.483801 ], [ -79.036915, 39.476795 ], [ -79.035623, 39.473344 ], [ -79.035712, 39.471331 ], [ -79.033884, 39.467761 ], [ -79.030343, 39.465403 ], [ -79.028159, 39.465060 ], [ -79.020542, 39.467002 ], [ -79.017147, 39.466977 ], [ -79.010097, 39.461048 ], [ -78.996950, 39.454961 ], [ -78.978826, 39.448678 ], [ -78.970118, 39.443327 ], [ -78.967461, 39.439804 ], [ -78.965484, 39.438455 ], [ -78.956751, 39.440264 ], [ -78.955483, 39.442277 ], [ -78.953333, 39.463645 ], [ -78.946603, 39.466140 ], [ -78.941969, 39.469959 ], [ -78.938869, 39.474100 ], [ -78.939164, 39.475267 ], [ -78.941526, 39.476869 ], [ -78.942618, 39.479614 ], [ -78.942293, 39.480987 ], [ -78.938751, 39.483732 ], [ -78.933613, 39.486180 ], [ -78.926999, 39.487003 ], [ -78.918142, 39.485858 ], [ -78.916488, 39.486544 ], [ -78.908719, 39.496699 ], [ -78.895307, 39.512085 ], [ -78.891197, 39.518900 ], [ -78.885996, 39.522581 ], [ -78.879084, 39.521205 ], [ -78.876810, 39.521250 ], [ -78.874744, 39.522611 ], [ -78.868966, 39.531366 ], [ -78.868908, 39.532487 ], [ -78.851931, 39.551848 ], [ -78.851016, 39.554044 ], [ -78.851196, 39.559924 ], [ -78.838553, 39.567300 ], [ -78.830298, 39.565355 ], [ -78.826407, 39.562589 ], [ -78.821404, 39.560616 ], [ -78.816764, 39.561691 ], [ -78.813512, 39.567720 ], [ -78.815114, 39.571351 ], [ -78.820104, 39.576287 ], [ -78.826360, 39.577333 ], [ -78.826009, 39.588829 ], [ -78.824788, 39.590233 ], [ -78.818899, 39.590370 ], [ -78.812215, 39.597717 ], [ -78.812154, 39.600540 ], [ -78.809347, 39.608063 ], [ -78.801792, 39.606812 ], [ -78.800434, 39.605232 ], [ -78.797840, 39.604897 ], [ -78.795857, 39.606934 ], [ -78.795368, 39.610710 ], [ -78.795964, 39.614205 ], [ -78.801741, 39.627488 ], [ -78.795941, 39.637287 ], [ -78.790941, 39.638287 ], [ -78.784041, 39.636687 ], [ -78.781341, 39.636787 ], [ -78.775241, 39.645687 ], [ -78.765840, 39.648487 ], [ -78.765040, 39.646087 ], [ -78.765340, 39.643987 ], [ -78.768140, 39.639287 ], [ -78.771140, 39.638387 ], [ -78.772640, 39.636887 ], [ -78.778477, 39.624405 ], [ -78.778477, 39.622650 ], [ -78.777516, 39.621712 ], [ -78.769565, 39.619431 ], [ -78.763171, 39.618897 ], [ -78.756686, 39.622971 ], [ -78.748499, 39.626262 ], [ -78.742880, 39.625088 ], [ -78.736189, 39.621708 ], [ -78.733553, 39.615533 ], [ -78.733759, 39.613931 ], [ -78.739050, 39.609697 ], [ -78.747063, 39.605690 ], [ -78.749222, 39.606536 ], [ -78.749350, 39.608572 ], [ -78.751514, 39.609947 ], [ -78.760497, 39.609984 ], [ -78.768115, 39.608704 ], [ -78.776860, 39.604027 ], [ -78.778096, 39.602097 ], [ -78.778141, 39.601364 ], [ -78.774281, 39.597328 ], [ -78.772128, 39.596497 ], [ -78.770511, 39.594994 ], [ -78.768481, 39.591583 ], [ -78.768314, 39.589394 ], [ -78.767490, 39.587487 ], [ -78.760196, 39.582154 ], [ -78.756747, 39.580690 ], [ -78.746421, 39.579544 ], [ -78.743318, 39.580712 ], [ -78.740246, 39.585655 ], [ -78.738502, 39.586319 ], [ -78.733979, 39.586618 ], [ -78.733149, 39.583690 ], [ -78.731992, 39.575364 ], [ -78.726342, 39.567587 ], [ -78.725010, 39.563973 ], [ -78.714784, 39.562558 ], [ -78.713335, 39.562032 ], [ -78.708664, 39.556795 ], [ -78.707098, 39.555857 ], [ -78.694626, 39.553251 ], [ -78.692824, 39.551970 ], [ -78.691996, 39.550780 ], [ -78.691494, 39.547646 ], [ -78.689455, 39.545770 ], [ -78.682423, 39.543848 ], [ -78.675629, 39.540371 ], [ -78.668745, 39.540164 ], [ -78.663990, 39.536778 ], [ -78.655984, 39.534695 ], [ -78.630842, 39.537109 ], [ -78.628744, 39.537863 ], [ -78.628566, 39.539190 ], [ -78.623037, 39.539512 ], [ -78.614526, 39.537595 ], [ -78.606873, 39.535082 ], [ -78.605868, 39.534304 ], [ -78.600511, 39.533434 ], [ -78.597659, 39.535050 ], [ -78.595603, 39.535483 ], [ -78.593871, 39.535158 ], [ -78.593114, 39.534401 ], [ -78.592131, 39.531816 ], [ -78.590654, 39.530192 ], [ -78.587079, 39.528020 ], [ -78.578956, 39.526695 ], [ -78.572692, 39.522372 ], [ -78.567937, 39.519902 ], [ -78.565929, 39.519444 ], [ -78.557127, 39.521526 ], [ -78.552756, 39.521388 ], [ -78.550128, 39.520702 ], [ -78.546584, 39.520998 ], [ -78.527886, 39.524654 ], [ -78.521388, 39.524790 ], [ -78.513622, 39.522545 ], [ -78.503200, 39.518652 ], [ -78.499017, 39.518906 ], [ -78.489742, 39.517789 ], [ -78.485697, 39.519392 ], [ -78.484044, 39.519507 ], [ -78.480677, 39.518960 ], [ -78.474178, 39.516240 ], [ -78.471166, 39.516103 ], [ -78.468639, 39.516789 ], [ -78.462899, 39.520840 ], [ -78.460951, 39.525987 ], [ -78.461071, 39.529304 ], [ -78.461911, 39.532971 ], [ -78.461291, 39.534678 ], [ -78.459274, 39.535919 ], [ -78.451050, 39.536695 ], [ -78.449499, 39.538092 ], [ -78.449654, 39.539643 ], [ -78.449964, 39.541040 ], [ -78.449499, 39.542281 ], [ -78.447171, 39.543367 ], [ -78.445309, 39.543367 ], [ -78.441961, 39.541223 ], [ -78.438357, 39.538753 ], [ -78.436378, 39.539302 ], [ -78.435107, 39.541658 ], [ -78.434759, 39.543988 ], [ -78.434759, 39.546780 ], [ -78.433828, 39.548953 ], [ -78.430414, 39.549418 ], [ -78.426953, 39.546598 ], [ -78.424053, 39.546315 ], [ -78.421105, 39.546780 ], [ -78.419398, 39.547401 ], [ -78.418777, 39.548953 ], [ -78.420019, 39.551745 ], [ -78.423287, 39.556319 ], [ -78.426537, 39.559155 ], [ -78.438179, 39.563524 ], [ -78.450207, 39.570889 ], [ -78.454376, 39.574319 ], [ -78.458338, 39.580426 ], [ -78.458052, 39.585241 ], [ -78.457187, 39.587379 ], [ -78.454527, 39.588958 ], [ -78.451186, 39.590193 ], [ -78.445983, 39.591223 ], [ -78.443175, 39.591155 ], [ -78.428246, 39.586717 ], [ -78.422985, 39.584109 ], [ -78.420059, 39.581706 ], [ -78.418670, 39.581111 ], [ -78.408031, 39.578593 ], [ -78.400936, 39.580214 ], [ -78.397446, 39.581952 ], [ -78.395317, 39.584215 ], [ -78.395463, 39.587372 ], [ -78.397471, 39.590232 ], [ -78.402702, 39.593596 ], [ -78.412870, 39.598311 ], [ -78.420644, 39.603183 ], [ -78.425581, 39.607599 ], [ -78.431524, 39.614484 ], [ -78.433002, 39.616520 ], [ -78.433623, 39.618259 ], [ -78.433297, 39.620569 ], [ -78.430250, 39.623290 ], [ -78.425902, 39.624548 ], [ -78.420549, 39.624021 ], [ -78.412860, 39.621091 ], [ -78.395828, 39.616076 ], [ -78.390774, 39.612117 ], [ -78.383591, 39.608912 ], [ -78.378181, 39.608178 ], [ -78.374732, 39.608635 ], [ -78.373200, 39.609530 ], [ -78.372255, 39.611200 ], [ -78.372404, 39.612297 ], [ -78.379118, 39.618127 ], [ -78.382959, 39.622246 ], [ -78.383461, 39.623321 ], [ -78.383447, 39.625091 ], [ -78.382487, 39.628216 ], [ -78.380504, 39.629359 ], [ -78.373166, 39.630459 ], [ -78.367959, 39.628929 ], [ -78.366212, 39.627534 ], [ -78.362485, 39.626049 ], [ -78.358343, 39.625581 ], [ -78.355770, 39.626258 ], [ -78.353878, 39.627722 ], [ -78.353465, 39.628912 ], [ -78.353673, 39.630787 ], [ -78.355567, 39.633463 ], [ -78.358735, 39.635589 ], [ -78.359506, 39.638081 ], [ -78.358264, 39.639660 ], [ -78.355218, 39.640576 ], [ -78.351905, 39.640486 ], [ -78.331934, 39.636054 ], [ -78.313033, 39.631001 ], [ -78.308152, 39.629606 ], [ -78.283039, 39.620470 ], [ -78.271122, 39.619642 ], [ -78.266833, 39.618818 ], [ -78.265088, 39.619274 ], [ -78.263371, 39.621675 ], [ -78.263344, 39.626417 ], [ -78.262189, 39.630464 ], [ -78.254077, 39.640089 ], [ -78.246722, 39.644758 ], [ -78.238059, 39.652081 ], [ -78.227677, 39.656796 ], [ -78.225075, 39.658878 ], [ -78.223597, 39.661097 ], [ -78.223864, 39.662607 ], [ -78.233012, 39.670471 ], [ -78.233138, 39.672875 ], [ -78.231564, 39.674382 ], [ -78.227333, 39.676121 ], [ -78.206763, 39.675990 ], [ -78.202945, 39.676653 ], [ -78.201081, 39.677866 ], [ -78.196701, 39.682074 ], [ -78.192439, 39.689118 ], [ -78.191107, 39.690262 ], [ -78.182759, 39.695110 ], [ -78.176625, 39.695967 ], [ -78.171361, 39.695612 ], [ -78.162126, 39.693643 ], [ -78.154164, 39.690531 ], [ -78.143478, 39.690412 ], [ -78.135221, 39.688305 ], [ -78.132706, 39.686977 ], [ -78.123939, 39.685652 ], [ -78.111830, 39.682593 ], [ -78.107834, 39.682137 ], [ -78.101737, 39.680286 ], [ -78.097118, 39.678161 ], [ -78.089835, 39.671668 ], [ -78.088592, 39.671211 ], [ -78.082260, 39.671166 ], [ -78.077525, 39.668880 ], [ -78.074595, 39.666686 ], [ -78.068291, 39.661060 ], [ -78.051932, 39.648207 ], [ -78.049950, 39.645349 ], [ -78.047672, 39.643107 ], [ -78.038860, 39.638121 ], [ -78.035992, 39.635720 ], [ -78.030140, 39.627462 ], [ -78.023896, 39.621697 ], [ -78.011343, 39.604083 ], [ -78.009985, 39.602893 ], [ -78.006734, 39.601337 ], [ -78.002330, 39.600488 ], [ -77.991437, 39.600194 ], [ -77.984815, 39.599420 ], [ -77.976686, 39.599744 ], [ -77.973967, 39.601071 ], [ -77.970150, 39.605091 ], [ -77.966223, 39.607435 ], [ -77.962092, 39.608702 ], [ -77.957642, 39.608614 ], [ -77.952104, 39.606358 ], [ -77.950599, 39.603944 ], [ -77.950916, 39.601163 ], [ -77.952152, 39.597272 ], [ -77.951955, 39.592709 ], [ -77.949836, 39.587110 ], [ -77.946182, 39.584814 ], [ -77.942150, 39.584933 ], [ -77.939050, 39.587139 ], [ -77.936371, 39.594508 ], [ -77.935450, 39.608076 ], [ -77.938362, 39.612580 ], [ -77.944133, 39.614617 ], [ -77.944622, 39.616772 ], [ -77.941940, 39.618790 ], [ -77.937492, 39.619150 ], [ -77.932862, 39.617676 ], [ -77.928738, 39.613908 ], [ -77.925988, 39.607642 ], [ -77.923298, 39.604852 ], [ -77.916836, 39.602942 ], [ -77.916410, 39.602816 ], [ -77.888477, 39.597343 ], [ -77.885077, 39.597937 ], [ -77.882977, 39.598828 ], [ -77.881823, 39.600039 ], [ -77.880993, 39.602852 ], [ -77.881110, 39.606214 ], [ -77.881936, 39.608112 ], [ -77.886959, 39.613329 ], [ -77.887017, 39.614518 ], [ -77.885124, 39.615775 ], [ -77.874718, 39.614293 ], [ -77.868679, 39.611138 ], [ -77.857800, 39.607880 ], [ -77.853436, 39.607117 ], [ -77.842785, 39.607255 ], [ -77.838008, 39.606125 ], [ -77.833568, 39.602936 ], [ -77.831813, 39.601105 ], [ -77.829753, 39.591050 ], [ -77.829814, 39.587288 ], [ -77.830775, 39.581178 ], [ -77.833217, 39.571016 ], [ -77.836330, 39.566370 ], [ -77.842174, 39.564333 ], [ -77.855847, 39.564607 ], [ -77.865734, 39.563547 ], [ -77.872723, 39.563895 ], [ -77.878451, 39.563493 ], [ -77.886135, 39.560432 ], [ -77.887968, 39.559198 ], [ -77.888648, 39.558054 ], [ -77.888945, 39.555950 ], [ -77.886436, 39.551947 ], [ -77.871530, 39.544278 ], [ -77.865351, 39.538381 ], [ -77.864434, 39.536483 ], [ -77.864315, 39.534813 ], [ -77.865078, 39.528226 ], [ -77.866138, 39.524727 ], [ -77.866518, 39.520039 ], [ -77.866132, 39.517661 ], [ -77.863680, 39.515032 ], [ -77.860195, 39.514325 ], [ -77.850747, 39.515403 ], [ -77.841920, 39.518470 ], [ -77.840651, 39.520941 ], [ -77.840536, 39.529196 ], [ -77.839061, 39.531117 ], [ -77.836935, 39.532170 ], [ -77.833509, 39.532628 ], [ -77.827188, 39.530458 ], [ -77.825357, 39.529177 ], [ -77.823762, 39.525907 ], [ -77.823555, 39.524077 ], [ -77.825650, 39.516895 ], [ -77.829045, 39.514425 ], [ -77.845103, 39.505845 ], [ -77.847611, 39.503351 ], [ -77.848112, 39.502093 ], [ -77.847639, 39.500698 ], [ -77.845666, 39.498628 ], [ -77.831909, 39.494744 ], [ -77.820781, 39.493900 ], [ -77.807821, 39.490241 ], [ -77.801830, 39.489395 ], [ -77.795631, 39.489623 ], [ -77.791765, 39.490789 ], [ -77.789757, 39.492207 ], [ -77.786539, 39.496598 ], [ -77.784442, 39.498061 ], [ -77.781608, 39.499067 ], [ -77.774374, 39.499500 ], [ -77.770950, 39.499087 ], [ -77.768442, 39.497783 ], [ -77.765993, 39.495724 ], [ -77.765403, 39.494397 ], [ -77.765551, 39.493025 ], [ -77.767087, 39.491333 ], [ -77.769125, 39.490281 ], [ -77.771723, 39.489207 ], [ -77.781760, 39.487128 ], [ -77.788519, 39.485048 ], [ -77.795485, 39.481824 ], [ -77.796695, 39.480498 ], [ -77.797787, 39.478760 ], [ -77.798201, 39.475719 ], [ -77.796755, 39.472448 ], [ -77.795634, 39.471259 ], [ -77.789645, 39.467827 ], [ -77.778522, 39.463663 ], [ -77.777815, 39.462816 ], [ -77.777815, 39.461924 ], [ -77.779202, 39.460392 ], [ -77.780471, 39.459867 ], [ -77.783539, 39.460073 ], [ -77.793157, 39.462042 ], [ -77.796196, 39.461722 ], [ -77.798468, 39.460670 ], [ -77.799294, 39.458383 ], [ -77.798144, 39.455981 ], [ -77.793100, 39.451406 ], [ -77.786110, 39.447197 ], [ -77.785580, 39.445367 ], [ -77.786052, 39.444224 ], [ -77.788560, 39.442829 ], [ -77.800860, 39.440841 ], [ -77.802866, 39.439285 ], [ -77.803249, 39.437136 ], [ -77.802542, 39.435969 ], [ -77.798855, 39.433339 ], [ -77.792751, 39.430593 ], [ -77.787266, 39.429335 ], [ -77.774850, 39.427845 ], [ -77.763319, 39.428436 ], [ -77.758720, 39.426810 ], [ -77.754681, 39.424658 ], [ -77.753090, 39.423262 ], [ -77.752680, 39.420174 ], [ -77.747478, 39.410930 ], [ -77.740012, 39.401694 ], [ -77.736409, 39.392684 ], [ -77.735905, 39.389665 ], [ -77.736317, 39.387744 ], [ -77.738084, 39.386211 ], [ -77.740765, 39.385409 ], [ -77.749715, 39.384171 ], [ -77.752209, 39.383328 ], [ -77.753389, 39.382094 ], [ -77.753804, 39.379624 ], [ -77.753274, 39.378320 ], [ -77.744144, 39.365139 ], [ -77.743874, 39.359947 ], [ -77.745930, 39.353221 ], [ -77.750387, 39.349450 ], [ -77.759315, 39.345314 ], [ -77.760435, 39.344171 ], [ -77.761084, 39.342524 ], [ -77.761115, 39.339757 ], [ -77.759615, 39.337331 ], [ -77.755789, 39.333899 ], [ -77.735009, 39.327015 ], [ -77.730914, 39.324684 ], [ -77.727379, 39.321666 ], [ -77.719029, 39.321125 ], [ -77.719946, 39.319693 ], [ -77.721638, 39.318494 ], [ -77.730047, 39.315666 ], [ -77.734899, 39.312409 ], [ -77.747287, 39.295001 ], [ -77.750267, 39.289284 ], [ -77.752726, 39.283373 ], [ -77.753357, 39.280331 ], [ -77.753060, 39.277971 ], [ -77.753105, 39.277340 ], [ -77.755193, 39.275191 ], [ -77.755698, 39.274575 ], [ -77.758412, 39.269197 ], [ -77.758733, 39.268114 ], [ -77.761217, 39.263721 ], [ -77.761768, 39.263031 ], [ -77.762844, 39.258445 ], [ -77.766525, 39.257340 ], [ -77.768000, 39.257657 ], [ -77.768992, 39.256417 ], [ -77.770281, 39.255977 ], [ -77.770669, 39.255262 ], [ -77.770876, 39.249760 ], [ -77.770589, 39.249393 ], [ -77.767277, 39.249380 ], [ -77.771415, 39.236776 ], [ -77.778068, 39.229305 ], [ -77.781268, 39.226909 ], [ -77.783640, 39.224081 ], [ -77.788763, 39.215243 ], [ -77.793631, 39.210125 ], [ -77.794596, 39.206299 ], [ -77.798190, 39.200658 ], [ -77.798478, 39.199574 ], [ -77.797714, 39.194240 ], [ -77.797943, 39.192826 ], [ -77.804712, 39.179419 ], [ -77.804415, 39.178045 ], [ -77.805099, 39.174222 ], [ -77.805991, 39.172421 ], [ -77.809125, 39.168567 ], [ -77.811295, 39.167563 ], [ -77.813206, 39.165023 ], [ -77.818446, 39.155279 ], [ -77.821413, 39.152410 ], [ -77.822874, 39.147755 ], [ -77.822990, 39.145451 ], [ -77.822230, 39.142734 ], [ -77.822182, 39.139985 ], [ -77.828157, 39.132329 ], [ -78.032841, 39.264403 ], [ -78.108746, 39.312460 ], [ -78.140920, 39.333745 ], [ -78.158194, 39.343392 ], [ -78.187370, 39.363989 ], [ -78.205401, 39.375099 ], [ -78.228766, 39.391233 ], [ -78.262785, 39.414323 ], [ -78.287980, 39.428755 ], [ -78.347087, 39.466012 ], [ -78.349476, 39.462205 ], [ -78.345143, 39.459484 ], [ -78.345823, 39.453499 ], [ -78.346962, 39.450679 ], [ -78.347333, 39.447659 ], [ -78.346061, 39.445613 ], [ -78.346546, 39.442616 ], [ -78.347773, 39.440583 ], [ -78.353227, 39.436792 ], [ -78.347942, 39.430879 ], [ -78.346718, 39.427618 ], [ -78.348354, 39.424431 ], [ -78.351236, 39.420595 ], [ -78.356627, 39.415902 ], [ -78.359352, 39.412534 ], [ -78.359918, 39.409028 ], [ -78.357949, 39.404192 ], [ -78.349436, 39.397252 ], [ -78.350014, 39.392861 ], [ -78.343214, 39.388807 ], [ -78.354837, 39.371616 ], [ -78.362632, 39.362888 ], [ -78.366867, 39.359290 ], [ -78.362267, 39.357784 ], [ -78.348698, 39.354744 ], [ -78.340480, 39.353492 ], [ -78.338958, 39.349889 ], [ -78.339284, 39.348605 ], [ -78.341308, 39.345555 ], [ -78.342514, 39.346769 ], [ -78.343685, 39.346713 ], [ -78.347409, 39.343402 ], [ -78.347634, 39.342720 ], [ -78.345460, 39.341024 ], [ -78.346301, 39.339108 ], [ -78.358940, 39.319484 ], [ -78.360035, 39.317771 ], [ -78.361567, 39.318037 ], [ -78.364686, 39.317312 ], [ -78.367242, 39.310148 ], [ -78.371604, 39.307692 ], [ -78.374728, 39.305136 ], [ -78.385888, 39.294888 ], [ -78.387242, 39.293430 ], [ -78.387194, 39.291444 ], [ -78.388785, 39.288572 ], [ -78.393371, 39.282988 ], [ -78.398682, 39.281332 ], [ -78.402275, 39.277238 ], [ -78.401813, 39.276754 ], [ -78.402783, 39.275471 ], [ -78.414204, 39.263910 ], [ -78.419422, 39.257476 ], [ -78.418584, 39.256065 ], [ -78.416120, 39.255410 ], [ -78.414631, 39.255733 ], [ -78.409116, 39.252564 ], [ -78.399785, 39.244129 ], [ -78.399669, 39.243874 ], [ -78.404214, 39.241214 ], [ -78.404980, 39.238006 ], [ -78.405585, 39.231176 ], [ -78.417890, 39.217504 ], [ -78.423968, 39.212049 ], [ -78.427911, 39.208611 ], [ -78.429803, 39.207014 ], [ -78.431167, 39.205744 ], [ -78.432130, 39.204717 ], [ -78.437053, 39.199766 ], [ -78.438651, 39.198049 ], [ -78.436662, 39.196658 ], [ -78.430846, 39.196227 ], [ -78.424905, 39.193301 ], [ -78.424292, 39.192156 ], [ -78.428697, 39.187217 ], [ -78.426315, 39.182762 ], [ -78.411972, 39.172734 ], [ -78.406966, 39.170903 ], [ -78.403697, 39.167451 ], [ -78.412599, 39.160038 ], [ -78.413943, 39.158415 ], [ -78.427294, 39.152726 ], [ -78.436658, 39.141691 ], [ -78.437771, 39.135426 ], [ -78.439429, 39.132146 ], [ -78.459869, 39.113351 ], [ -78.466662, 39.112858 ], [ -78.469530, 39.111204 ], [ -78.470261, 39.110063 ], [ -78.473209, 39.108143 ], [ -78.475376, 39.107469 ], [ -78.477320, 39.109398 ], [ -78.478426, 39.109843 ], [ -78.484283, 39.107372 ], [ -78.495160, 39.100992 ], [ -78.495984, 39.098980 ], [ -78.504384, 39.091398 ], [ -78.508132, 39.088630 ], [ -78.512103, 39.084878 ], [ -78.516479, 39.081802 ], [ -78.515955, 39.080046 ], [ -78.516789, 39.077569 ], [ -78.522714, 39.071062 ], [ -78.526543, 39.068221 ], [ -78.531695, 39.066519 ], [ -78.540216, 39.060631 ], [ -78.545679, 39.055052 ], [ -78.547734, 39.054069 ], [ -78.554263, 39.048058 ], [ -78.556748, 39.044527 ], [ -78.559997, 39.041573 ], [ -78.571901, 39.031995 ], [ -78.565837, 39.026303 ], [ -78.565073, 39.025935 ], [ -78.563294, 39.026328 ], [ -78.559640, 39.024456 ], [ -78.557380, 39.021393 ], [ -78.550467, 39.018065 ], [ -78.552321, 39.016374 ], [ -78.554919, 39.015124 ], [ -78.559400, 39.011877 ], [ -78.561711, 39.009007 ], [ -78.570462, 39.001552 ], [ -78.580465, 38.990567 ], [ -78.581981, 38.988398 ], [ -78.582928, 38.985416 ], [ -78.588704, 38.978579 ], [ -78.593261, 38.971918 ], [ -78.596015, 38.970192 ], [ -78.598894, 38.969546 ], [ -78.601399, 38.966530 ], [ -78.601655, 38.964603 ], [ -78.608369, 38.969743 ], [ -78.611184, 38.976134 ], [ -78.614312, 38.975850 ], [ -78.618676, 38.974082 ], [ -78.619982, 38.977338 ], [ -78.619914, 38.981288 ], [ -78.620453, 38.982601 ], [ -78.625672, 38.982575 ], [ -78.629553, 38.980866 ], [ -78.630846, 38.979586 ], [ -78.632452, 38.976983 ], [ -78.632471, 38.974739 ], [ -78.638423, 38.966819 ], [ -78.646589, 38.968138 ], [ -78.652352, 38.960677 ], [ -78.655043, 38.953766 ], [ -78.659050, 38.947375 ], [ -78.662083, 38.945702 ], [ -78.665886, 38.941579 ], [ -78.666594, 38.939200 ], [ -78.670679, 38.933800 ], [ -78.680456, 38.925313 ], [ -78.681617, 38.925840 ], [ -78.688266, 38.924780 ], [ -78.691450, 38.922195 ], [ -78.697380, 38.915602 ], [ -78.704323, 38.915231 ], [ -78.712622, 38.908665 ], [ -78.716168, 38.904830 ], [ -78.717178, 38.904296 ], [ -78.718647, 38.904561 ], [ -78.719810, 38.905907 ], [ -78.720900, 38.909844 ], [ -78.719451, 38.920260 ], [ -78.719755, 38.922135 ], [ -78.719806, 38.922638 ], [ -78.720095, 38.923863 ], [ -78.719620, 38.926510 ], [ -78.717076, 38.936028 ], [ -78.718482, 38.934267 ], [ -78.722451, 38.931405 ], [ -78.724062, 38.930846 ], [ -78.726222, 38.930932 ], [ -78.738921, 38.927283 ], [ -78.750517, 38.916029 ], [ -78.754658, 38.907582 ], [ -78.754516, 38.905728 ], [ -78.757278, 38.903203 ], [ -78.759085, 38.900529 ], [ -78.772793, 38.893742 ], [ -78.779198, 38.892298 ], [ -78.786025, 38.887187 ], [ -78.788031, 38.885123 ], [ -78.790078, 38.880076 ], [ -78.791610, 38.877593 ], [ -78.796213, 38.874606 ], [ -78.808181, 38.856175 ], [ -78.810943, 38.849616 ], [ -78.815116, 38.841594 ], [ -78.821167, 38.830982 ], [ -78.827262, 38.821610 ], [ -78.832267, 38.814388 ], [ -78.835191, 38.811499 ], [ -78.848187, 38.794978 ], [ -78.863684, 38.771800 ], [ -78.865905, 38.767034 ], [ -78.869276, 38.762991 ], [ -78.993997, 38.850102 ], [ -78.998171, 38.847353 ], [ -79.000252, 38.845412 ], [ -78.998863, 38.840962 ], [ -78.999014, 38.840074 ], [ -79.002352, 38.836512 ], [ -79.005152, 38.829912 ], [ -79.006352, 38.826112 ], [ -79.006152, 38.824512 ], [ -79.006552, 38.823712 ], [ -79.007952, 38.822312 ], [ -79.011952, 38.820412 ], [ -79.016752, 38.820012 ], [ -79.019553, 38.817912 ], [ -79.024053, 38.809212 ], [ -79.024453, 38.803712 ], [ -79.023453, 38.802612 ], [ -79.023053, 38.798613 ], [ -79.027253, 38.792113 ], [ -79.029253, 38.791013 ], [ -79.033153, 38.791013 ], [ -79.046554, 38.792113 ], [ -79.048954, 38.790713 ], [ -79.054954, 38.785713 ], [ -79.055654, 38.783013 ], [ -79.054354, 38.780613 ], [ -79.052454, 38.779213 ], [ -79.051654, 38.778013 ], [ -79.051254, 38.773913 ], [ -79.051554, 38.772613 ], [ -79.053754, 38.772313 ], [ -79.055654, 38.770913 ], [ -79.056754, 38.766513 ], [ -79.057253, 38.761413 ], [ -79.057554, 38.760213 ], [ -79.060954, 38.756713 ], [ -79.064854, 38.754413 ], [ -79.072555, 38.747513 ], [ -79.072755, 38.744614 ], [ -79.073855, 38.742114 ], [ -79.076555, 38.739214 ], [ -79.079655, 38.734714 ], [ -79.081955, 38.729714 ], [ -79.085455, 38.724614 ], [ -79.087255, 38.720114 ], [ -79.086555, 38.716015 ], [ -79.092755, 38.702315 ], [ -79.092555, 38.700149 ], [ -79.092271, 38.699208 ], [ -79.090755, 38.692515 ], [ -79.088055, 38.690115 ], [ -79.085555, 38.688816 ], [ -79.084355, 38.686516 ], [ -79.087855, 38.673816 ], [ -79.091055, 38.669316 ], [ -79.092755, 38.662816 ], [ -79.092955, 38.659517 ], [ -79.106356, 38.656217 ], [ -79.111556, 38.659717 ], [ -79.120256, 38.660216 ], [ -79.122256, 38.659817 ], [ -79.129757, 38.655017 ], [ -79.131057, 38.653217 ], [ -79.133557, 38.646017 ], [ -79.135472, 38.644057 ], [ -79.135546, 38.643715 ], [ -79.136374, 38.642400 ], [ -79.137012, 38.640655 ], [ -79.137557, 38.638017 ], [ -79.139657, 38.637217 ], [ -79.142657, 38.634417 ], [ -79.146741, 38.625819 ], [ -79.146974, 38.625641 ], [ -79.151257, 38.620618 ], [ -79.155355, 38.611225 ], [ -79.155557, 38.609218 ], [ -79.154357, 38.606518 ], [ -79.159158, 38.601219 ], [ -79.158957, 38.594519 ], [ -79.158257, 38.593919 ], [ -79.158657, 38.592319 ], [ -79.163458, 38.583119 ], [ -79.168058, 38.578619 ], [ -79.170858, 38.574119 ], [ -79.171658, 38.571620 ], [ -79.170658, 38.569220 ], [ -79.170958, 38.568120 ], [ -79.174512, 38.566531 ], [ -79.174881, 38.566314 ], [ -79.176658, 38.565520 ], [ -79.180858, 38.559920 ], [ -79.184058, 38.551520 ], [ -79.188958, 38.547420 ], [ -79.193458, 38.542421 ], [ -79.196959, 38.536721 ], [ -79.201459, 38.527821 ], [ -79.205859, 38.524521 ], [ -79.210959, 38.507422 ], [ -79.206959, 38.503522 ], [ -79.207884, 38.500428 ], [ -79.207873, 38.500122 ], [ -79.209703, 38.495574 ], [ -79.210008, 38.494283 ], [ -79.210026, 38.494231 ], [ -79.210591, 38.492913 ], [ -79.215212, 38.489261 ], [ -79.219067, 38.487441 ], [ -79.221406, 38.484837 ], [ -79.220961, 38.480590 ], [ -79.225669, 38.476471 ], [ -79.231620, 38.474041 ], [ -79.234408, 38.473011 ], [ -79.240059, 38.469841 ], [ -79.242024, 38.464332 ], [ -79.241854, 38.457055 ], [ -79.242641, 38.454168 ], [ -79.247342, 38.453294 ], [ -79.253067, 38.455818 ], [ -79.254435, 38.455949 ], [ -79.261107, 38.448082 ], [ -79.262910, 38.444586 ], [ -79.263376, 38.443762 ], [ -79.265327, 38.441772 ], [ -79.267414, 38.438322 ], [ -79.272064, 38.437376 ], [ -79.274529, 38.436337 ], [ -79.282225, 38.432078 ], [ -79.282762, 38.431647 ], [ -79.282663, 38.431021 ], [ -79.282470, 38.429168 ], [ -79.280581, 38.426833 ], [ -79.280263, 38.425475 ], [ -79.279678, 38.424173 ], [ -79.280149, 38.420760 ], [ -79.282971, 38.418095 ], [ -79.285613, 38.419249 ], [ -79.286874, 38.420555 ], [ -79.288432, 38.420960 ], [ -79.290529, 38.420757 ], [ -79.291813, 38.419627 ], [ -79.295712, 38.418129 ], [ -79.297758, 38.416438 ], [ -79.300081, 38.414888 ], [ -79.312276, 38.411876 ], [ -79.370302, 38.427244 ], [ -79.476638, 38.457228 ], [ -79.499768, 38.497720 ], [ -79.521469, 38.533918 ], [ -79.531870, 38.542817 ], [ -79.533170, 38.544717 ], [ -79.533370, 38.546217 ], [ -79.536870, 38.550917 ], [ -79.538270, 38.551817 ], [ -79.542570, 38.553217 ], [ -79.555471, 38.560217 ], [ -79.566271, 38.562517 ], [ -79.571771, 38.563117 ], [ -79.649075, 38.591515 ], [ -79.656109, 38.576200 ], [ -79.658175, 38.573016 ], [ -79.659375, 38.572616 ], [ -79.661575, 38.567316 ], [ -79.660675, 38.566216 ], [ -79.659275, 38.562416 ], [ -79.662575, 38.560516 ], [ -79.665075, 38.560916 ], [ -79.669275, 38.549516 ], [ -79.669675, 38.543416 ], [ -79.666874, 38.538317 ], [ -79.668774, 38.534217 ], [ -79.672974, 38.528717 ], [ -79.671574, 38.527517 ], [ -79.669774, 38.526917 ], [ -79.666774, 38.524317 ], [ -79.662974, 38.518717 ], [ -79.662074, 38.515517 ], [ -79.663474, 38.514117 ], [ -79.665674, 38.513817 ], [ -79.667574, 38.512917 ], [ -79.668774, 38.512017 ], [ -79.669128, 38.510975 ], [ -79.669128, 38.510883 ], [ -79.670474, 38.507717 ], [ -79.674074, 38.510417 ], [ -79.680374, 38.510617 ], [ -79.681574, 38.508217 ], [ -79.681606, 38.504504 ], [ -79.682974, 38.501317 ], [ -79.688345, 38.496183 ], [ -79.691301, 38.496768 ], [ -79.692273, 38.496474 ], [ -79.694506, 38.494232 ], [ -79.697572, 38.487223 ], [ -79.696959, 38.484574 ], [ -79.695462, 38.481454 ], [ -79.693424, 38.481011 ], [ -79.694180, 38.478311 ], [ -79.695565, 38.477842 ], [ -79.699006, 38.475148 ], [ -79.699622, 38.473967 ], [ -79.698929, 38.469869 ], [ -79.695588, 38.469058 ], [ -79.691088, 38.463744 ], [ -79.688882, 38.458714 ], [ -79.688365, 38.456870 ], [ -79.688205, 38.450476 ], [ -79.688962, 38.449538 ], [ -79.691478, 38.446282 ], [ -79.689544, 38.442511 ], [ -79.691377, 38.439558 ], [ -79.691656, 38.436436 ], [ -79.690930, 38.433995 ], [ -79.689909, 38.432864 ], [ -79.689675, 38.431439 ], [ -79.706634, 38.415730 ], [ -79.709140, 38.412064 ], [ -79.708965, 38.409553 ], [ -79.712904, 38.405034 ], [ -79.717365, 38.401562 ], [ -79.722653, 38.389517 ], [ -79.726350, 38.387070 ], [ -79.729895, 38.380351 ], [ -79.731698, 38.373376 ], [ -79.730494, 38.372217 ], [ -79.727676, 38.371701 ], [ -79.726790, 38.370832 ], [ -79.725804, 38.366128 ], [ -79.725597, 38.363828 ], [ -79.725973, 38.363229 ], [ -79.727053, 38.362233 ], [ -79.729344, 38.361830 ], [ -79.732059, 38.360168 ], [ -79.734600, 38.356728 ], [ -79.740615, 38.354101 ], [ -79.744105, 38.353968 ], [ -79.755560, 38.357372 ], [ -79.757626, 38.357566 ], [ -79.764432, 38.356514 ], [ -79.767263, 38.353395 ], [ -79.766403, 38.350873 ], [ -79.769906, 38.341843 ], [ -79.773090, 38.335529 ], [ -79.779272, 38.331609 ], [ -79.785972, 38.330878 ], [ -79.796550, 38.323480 ], [ -79.798159, 38.319161 ], [ -79.799617, 38.317149 ], [ -79.804093, 38.313922 ], [ -79.808711, 38.309429 ], [ -79.810154, 38.306707 ], [ -79.810115, 38.305037 ], [ -79.807542, 38.301694 ], [ -79.804026, 38.298622 ], [ -79.803346, 38.296682 ], [ -79.802778, 38.292073 ], [ -79.797848, 38.292053 ], [ -79.795448, 38.290228 ], [ -79.789791, 38.281167 ], [ -79.787542, 38.273298 ], [ -79.788945, 38.268703 ], [ -79.790134, 38.267654 ], [ -79.798295, 38.265957 ], [ -79.801274, 38.261474 ], [ -79.806333, 38.259193 ], [ -79.811987, 38.260401 ], [ -79.814202, 38.258174 ], [ -79.815708, 38.255065 ], [ -79.815719, 38.253645 ], [ -79.814865, 38.251568 ], [ -79.817149, 38.249511 ], [ -79.819623, 38.248234 ], [ -79.821010, 38.248277 ], [ -79.825283, 38.250488 ], [ -79.830882, 38.249687 ], [ -79.832971, 38.247553 ], [ -79.834031, 38.244957 ], [ -79.834171, 38.242899 ], [ -79.835124, 38.241892 ], [ -79.837494, 38.241276 ], [ -79.842981, 38.241594 ], [ -79.845207, 38.241082 ], [ -79.846445, 38.240003 ], [ -79.850324, 38.233329 ], [ -79.856962, 38.231075 ], [ -79.863625, 38.223945 ], [ -79.879087, 38.211016 ], [ -79.884234, 38.207868 ], [ -79.886413, 38.207953 ], [ -79.888045, 38.207360 ], [ -79.891591, 38.204652 ], [ -79.891999, 38.203378 ], [ -79.892345, 38.202397 ], [ -79.892916, 38.199868 ], [ -79.898426, 38.193045 ], [ -79.906090, 38.188999 ], [ -79.910961, 38.187920 ], [ -79.914410, 38.188418 ], [ -79.916344, 38.186278 ], [ -79.916174, 38.184386 ], [ -79.917061, 38.183741 ], [ -79.921196, 38.180378 ], [ -79.921026, 38.179954 ], [ -79.916622, 38.177994 ], [ -79.916765, 38.175504 ], [ -79.918629, 38.172671 ], [ -79.918913, 38.170439 ], [ -79.917924, 38.168399 ], [ -79.916072, 38.168428 ], [ -79.915065, 38.168088 ], [ -79.914884, 38.167524 ], [ -79.918662, 38.154790 ], [ -79.923125, 38.150874 ], [ -79.925251, 38.150465 ], [ -79.925512, 38.150237 ], [ -79.928683, 38.144928 ], [ -79.928747, 38.144436 ], [ -79.929031, 38.139771 ], [ -79.933751, 38.135508 ], [ -79.942747, 38.134333 ], [ -79.944843, 38.131585 ], [ -79.938952, 38.111619 ], [ -79.938051, 38.110759 ], [ -79.934364, 38.109718 ], [ -79.929687, 38.109197 ], [ -79.926330, 38.107151 ], [ -79.927645, 38.104826 ], [ -79.931034, 38.101402 ], [ -79.933911, 38.099168 ], [ -79.934250, 38.097669 ], [ -79.935101, 38.096541 ], [ -79.938274, 38.094741 ], [ -79.942364, 38.091588 ], [ -79.949113, 38.084238 ], [ -79.953509, 38.081484 ], [ -79.954369, 38.080397 ], [ -79.960093, 38.068677 ], [ -79.959844, 38.063697 ], [ -79.968189, 38.047709 ], [ -79.971231, 38.044326 ], [ -79.973895, 38.040004 ], [ -79.973777, 38.038744 ], [ -79.972165, 38.036102 ], [ -79.973701, 38.032556 ], [ -79.975269, 38.030075 ], [ -79.976732, 38.029278 ], [ -79.978427, 38.029082 ], [ -79.980290, 38.027596 ], [ -79.985619, 38.019160 ], [ -79.985792, 38.018089 ], [ -79.984842, 38.016610 ], [ -79.986142, 38.014182 ], [ -79.990114, 38.013246 ], [ -79.994985, 38.007853 ], [ -79.995901, 38.005791 ], [ -79.995398, 38.003309 ], [ -79.996134, 38.000996 ], [ -79.999384, 37.995842 ], [ -80.002507, 37.992767 ], [ -80.008888, 37.990830 ], [ -80.012193, 37.988633 ], [ -80.012891, 37.987443 ], [ -80.012555, 37.985999 ], [ -80.013145, 37.984253 ], [ -80.024168, 37.976907 ], [ -80.036236, 37.967920 ], [ -80.048410, 37.957481 ], [ -80.051043, 37.956852 ], [ -80.056839, 37.951833 ], [ -80.063682, 37.947968 ], [ -80.066569, 37.947171 ], [ -80.074514, 37.942221 ], [ -80.075441, 37.939629 ], [ -80.080823, 37.935526 ], [ -80.086954, 37.929547 ], [ -80.096563, 37.918112 ], [ -80.102931, 37.918911 ], [ -80.106819, 37.914698 ], [ -80.116884, 37.906292 ], [ -80.118967, 37.903614 ], [ -80.119106, 37.902018 ], [ -80.117480, 37.900581 ], [ -80.117747, 37.897720 ], [ -80.120613, 37.896735 ], [ -80.123021, 37.898046 ], [ -80.123620, 37.897943 ], [ -80.129555, 37.894134 ], [ -80.130464, 37.893194 ], [ -80.131040, 37.890697 ], [ -80.131931, 37.889500 ], [ -80.141947, 37.882616 ], [ -80.146130, 37.884453 ], [ -80.147316, 37.885936 ], [ -80.148951, 37.886892 ], [ -80.153832, 37.881824 ], [ -80.162202, 37.875122 ], [ -80.168957, 37.867116 ], [ -80.172033, 37.862144 ], [ -80.172076, 37.860066 ], [ -80.176712, 37.854029 ], [ -80.181815, 37.852724 ], [ -80.183062, 37.850646 ], [ -80.183555, 37.846810 ], [ -80.179391, 37.839751 ], [ -80.181768, 37.838343 ], [ -80.186380, 37.837741 ], [ -80.194650, 37.831759 ], [ -80.199633, 37.827507 ], [ -80.202853, 37.824240 ], [ -80.205841, 37.818921 ], [ -80.206482, 37.815970 ], [ -80.210965, 37.812598 ], [ -80.216229, 37.809820 ], [ -80.216939, 37.809505 ], [ -80.218611, 37.809783 ], [ -80.227092, 37.798886 ], [ -80.229228, 37.794660 ], [ -80.229489, 37.792331 ], [ -80.227965, 37.791714 ], [ -80.220092, 37.783160 ], [ -80.218616, 37.783291 ], [ -80.215892, 37.781989 ], [ -80.215658, 37.777481 ], [ -80.216498, 37.776445 ], [ -80.216899, 37.776056 ], [ -80.217634, 37.776775 ], [ -80.221827, 37.778293 ], [ -80.227498, 37.778889 ], [ -80.230458, 37.778305 ], [ -80.232011, 37.775621 ], [ -80.241390, 37.769443 ], [ -80.246902, 37.768309 ], [ -80.251319, 37.762958 ], [ -80.250427, 37.761301 ], [ -80.249790, 37.757111 ], [ -80.251622, 37.755866 ], [ -80.256410, 37.756372 ], [ -80.257411, 37.756084 ], [ -80.262765, 37.738336 ], [ -80.260313, 37.733517 ], [ -80.252024, 37.729825 ], [ -80.252227, 37.727261 ], [ -80.253077, 37.725899 ], [ -80.258143, 37.720612 ], [ -80.264406, 37.718786 ], [ -80.271990, 37.711532 ], [ -80.275007, 37.707844 ], [ -80.287107, 37.696403 ], [ -80.294108, 37.693852 ], [ -80.296138, 37.691783 ], [ -80.292337, 37.683976 ], [ -80.292258, 37.683732 ], [ -80.279372, 37.657077 ], [ -80.270323, 37.648982 ], [ -80.270352, 37.648929 ], [ -80.267455, 37.646108 ], [ -80.267228, 37.646011 ], [ -80.264874, 37.645511 ], [ -80.264830, 37.645526 ], [ -80.263291, 37.645101 ], [ -80.263281, 37.645082 ], [ -80.254469, 37.642333 ], [ -80.254431, 37.642352 ], [ -80.239288, 37.637672 ], [ -80.220984, 37.627767 ], [ -80.223386, 37.623185 ], [ -80.226017, 37.620059 ], [ -80.240272, 37.606961 ], [ -80.249780, 37.602117 ], [ -80.258919, 37.595499 ], [ -80.263560, 37.593374 ], [ -80.270342, 37.591149 ], [ -80.282440, 37.585481 ], [ -80.294882, 37.578770 ], [ -80.328504, 37.564315 ], [ -80.312393, 37.546239 ], [ -80.314464, 37.544120 ], [ -80.321249, 37.541419 ], [ -80.324384, 37.541052 ], [ -80.327489, 37.540022 ], [ -80.330306, 37.536244 ], [ -80.309346, 37.527381 ], [ -80.291644, 37.536505 ], [ -80.282385, 37.533517 ], [ -80.299789, 37.508271 ], [ -80.309833, 37.503827 ], [ -80.309331, 37.502880 ], [ -80.314806, 37.500943 ], [ -80.320627, 37.498880 ], [ -80.327103, 37.495376 ], [ -80.332038, 37.493744 ], [ -80.343789, 37.492148 ], [ -80.366838, 37.484879 ], [ -80.363170, 37.480001 ], [ -80.369449, 37.476599 ], [ -80.371952, 37.474069 ], [ -80.378308, 37.471381 ], [ -80.382535, 37.470367 ], [ -80.399880, 37.462314 ], [ -80.402816, 37.460322 ], [ -80.425656, 37.449876 ], [ -80.443025, 37.438126 ], [ -80.451367, 37.434039 ], [ -80.457313, 37.432267 ], [ -80.464820, 37.426144 ], [ -80.475601, 37.422949 ], [ -80.494867, 37.435070 ], [ -80.497280, 37.444779 ], [ -80.492981, 37.457749 ], [ -80.511391, 37.481672 ], [ -80.513409, 37.479446 ], [ -80.515139, 37.478566 ], [ -80.523481, 37.476905 ], [ -80.528349, 37.477368 ], [ -80.532372, 37.477124 ], [ -80.533449, 37.476406 ], [ -80.539786, 37.474527 ], [ -80.544836, 37.474695 ], [ -80.552036, 37.473563 ], [ -80.561442, 37.469775 ], [ -80.566297, 37.466575 ], [ -80.585856, 37.456654 ], [ -80.590240, 37.453296 ], [ -80.591377, 37.451440 ], [ -80.600204, 37.446173 ], [ -80.616802, 37.439443 ], [ -80.622117, 37.435969 ], [ -80.622664, 37.433307 ], [ -80.626365, 37.433328 ], [ -80.632365, 37.432125 ], [ -80.634390, 37.431227 ], [ -80.637379, 37.429372 ], [ -80.637554, 37.428556 ], [ -80.636947, 37.427471 ], [ -80.645893, 37.422147 ], [ -80.653589, 37.419514 ], [ -80.656687, 37.417585 ], [ -80.664112, 37.414220 ], [ -80.664971, 37.414215 ], [ -80.684576, 37.404630 ], [ -80.691709, 37.401749 ], [ -80.705203, 37.394618 ], [ -80.715479, 37.390707 ], [ -80.723596, 37.388261 ], [ -80.731589, 37.384710 ], [ -80.738040, 37.382547 ], [ -80.745527, 37.380111 ], [ -80.748722, 37.380050 ], [ -80.759886, 37.374882 ], [ -80.770082, 37.372363 ], [ -80.776649, 37.383679 ], [ -80.776766, 37.384131 ], [ -80.782295, 37.389016 ], [ -80.783382, 37.390649 ], [ -80.783324, 37.392793 ], [ -80.784188, 37.394587 ], [ -80.790317, 37.395668 ], [ -80.798869, 37.395807 ], [ -80.800447, 37.395738 ], [ -80.806129, 37.398074 ], [ -80.807134, 37.401348 ], [ -80.806358, 37.404119 ], [ -80.808769, 37.406271 ], [ -80.811639, 37.407507 ], [ -80.836446, 37.424355 ], [ -80.837678, 37.425658 ], [ -80.841672, 37.425971 ], [ -80.844213, 37.423555 ], [ -80.846324, 37.423394 ], [ -80.850656, 37.426062 ], [ -80.853163, 37.426902 ], [ -80.856997, 37.427052 ], [ -80.858360, 37.428168 ], [ -80.859556, 37.429568 ], [ -80.863142, 37.424644 ], [ -80.865148, 37.419927 ], [ -80.865174, 37.416996 ], [ -80.864455, 37.414180 ], [ -80.862761, 37.411829 ], [ -80.883248, 37.383933 ], [ -80.849451, 37.346909 ], [ -80.865321, 37.340523 ], [ -80.868986, 37.338573 ], [ -80.880103, 37.328903 ], [ -80.900535, 37.315000 ], [ -80.919259, 37.306163 ], [ -80.927040, 37.303683 ], [ -80.931118, 37.302872 ], [ -80.938135, 37.300278 ], [ -80.947896, 37.295872 ], [ -80.966556, 37.292158 ], [ -80.973889, 37.291444 ], [ -80.980146, 37.292743 ], [ -80.981322, 37.293465 ], [ -80.982173, 37.296023 ], [ -80.979106, 37.300581 ], [ -80.979589, 37.302279 ], [ -80.996013, 37.299545 ], [ -81.000576, 37.297868 ], [ -81.008457, 37.296073 ], [ -81.021937, 37.294143 ], [ -81.037191, 37.290251 ], [ -81.084012, 37.284401 ], [ -81.094820, 37.282640 ], [ -81.112596, 37.278497 ], [ -81.142404, 37.269165 ], [ -81.158964, 37.265382 ], [ -81.167029, 37.262881 ], [ -81.178151, 37.257979 ], [ -81.204774, 37.243013 ], [ -81.225104, 37.234874 ], [ -81.320105, 37.299323 ], [ -81.362156, 37.337687 ], [ -81.366315, 37.335927 ], [ -81.367052, 37.334504 ], [ -81.368090, 37.332423 ], [ -81.369379, 37.331827 ], [ -81.369264, 37.330568 ], [ -81.368030, 37.329447 ], [ -81.367599, 37.327569 ], [ -81.371315, 37.324115 ], [ -81.372610, 37.320195 ], [ -81.374455, 37.318614 ], [ -81.377349, 37.318447 ], [ -81.380159, 37.317838 ], [ -81.384127, 37.318596 ], [ -81.384914, 37.318832 ], [ -81.385810, 37.320085 ], [ -81.386727, 37.320474 ], [ -81.388132, 37.319903 ], [ -81.394287, 37.316411 ], [ -81.398548, 37.310635 ], [ -81.398702, 37.307806 ], [ -81.397357, 37.306358 ], [ -81.396817, 37.304498 ], [ -81.398185, 37.302965 ], [ -81.402195, 37.301660 ], [ -81.405060, 37.298794 ], [ -81.403764, 37.296597 ], [ -81.409196, 37.286071 ], [ -81.409729, 37.284837 ], [ -81.409577, 37.284025 ], [ -81.411593, 37.280330 ], [ -81.416663, 37.273214 ], [ -81.427946, 37.271015 ], [ -81.432850, 37.272697 ], [ -81.448285, 37.270575 ], [ -81.449068, 37.269583 ], [ -81.454199, 37.266999 ], [ -81.458895, 37.266466 ], [ -81.460585, 37.265527 ], [ -81.459874, 37.263901 ], [ -81.460000, 37.262547 ], [ -81.462107, 37.259899 ], [ -81.476431, 37.255127 ], [ -81.480144, 37.251121 ], [ -81.483559, 37.250604 ], [ -81.492287, 37.250960 ], [ -81.495738, 37.252393 ], [ -81.498045, 37.254659 ], [ -81.498445, 37.256568 ], [ -81.497773, 37.257190 ], [ -81.497775, 37.257899 ], [ -81.498874, 37.258025 ], [ -81.503190, 37.252579 ], [ -81.504168, 37.250115 ], [ -81.504880, 37.247697 ], [ -81.506428, 37.244469 ], [ -81.506260, 37.239272 ], [ -81.507325, 37.233800 ], [ -81.508786, 37.232564 ], [ -81.520729, 37.226914 ], [ -81.527458, 37.225817 ], [ -81.533070, 37.223414 ], [ -81.544437, 37.220761 ], [ -81.545211, 37.220165 ], [ -81.549248, 37.213732 ], [ -81.553600, 37.208443 ], [ -81.556119, 37.207413 ], [ -81.556892, 37.207275 ], [ -81.557315, 37.207697 ], [ -81.558353, 37.208145 ], [ -81.560625, 37.206663 ], [ -81.678210, 37.201483 ], [ -81.678603, 37.202467 ], [ -81.681379, 37.203634 ], [ -81.683268, 37.205649 ], [ -81.684012, 37.211098 ], [ -81.683544, 37.211452 ], [ -81.686717, 37.213105 ], [ -81.695113, 37.213570 ], [ -81.698954, 37.218201 ], [ -81.715730, 37.228771 ], [ -81.716248, 37.234321 ], [ -81.719554, 37.237785 ], [ -81.723061, 37.240493 ], [ -81.726171, 37.240522 ], [ -81.728194, 37.239823 ], [ -81.733320, 37.238127 ], [ -81.738543, 37.238264 ], [ -81.744003, 37.242528 ], [ -81.744291, 37.244178 ], [ -81.743420, 37.245858 ], [ -81.743505, 37.247601 ], [ -81.740974, 37.254052 ], [ -81.741662, 37.254784 ], [ -81.743008, 37.255127 ], [ -81.745445, 37.258125 ], [ -81.745505, 37.261330 ], [ -81.746109, 37.263597 ], [ -81.747656, 37.264329 ], [ -81.751290, 37.265131 ], [ -81.752123, 37.265568 ], [ -81.752912, 37.266614 ], [ -81.755012, 37.267720 ], [ -81.757531, 37.270010 ], [ -81.757714, 37.271124 ], [ -81.757730, 37.271934 ], [ -81.757631, 37.274003 ], [ -81.760220, 37.275254 ], [ -81.761752, 37.275713 ], [ -81.762776, 37.275391 ], [ -81.763836, 37.275218 ], [ -81.765195, 37.275099 ], [ -81.767837, 37.274216 ], [ -81.774684, 37.274807 ], [ -81.774747, 37.274847 ], [ -81.777319, 37.275873 ], [ -81.779350, 37.277394 ], [ -81.779362, 37.279982 ], [ -81.783122, 37.282580 ], [ -81.789294, 37.284416 ], [ -81.793425, 37.281674 ], [ -81.793639, 37.282188 ], [ -81.793115, 37.283538 ], [ -81.793595, 37.284838 ], [ -81.803275, 37.285916 ], [ -81.805382, 37.285622 ], [ -81.807232, 37.283175 ], [ -81.809184, 37.283003 ], [ -81.810559, 37.282980 ], [ -81.813222, 37.281091 ], [ -81.816702, 37.279865 ], [ -81.819625, 37.279411 ], [ -81.825065, 37.279536 ], [ -81.834470, 37.281763 ], [ -81.834387, 37.283086 ], [ -81.833406, 37.284535 ], [ -81.834432, 37.285416 ], [ -81.838762, 37.286343 ], [ -81.842310, 37.285556 ], [ -81.843167, 37.285586 ], [ -81.846807, 37.284649 ], [ -81.849949, 37.285227 ], [ -81.853551, 37.287701 ], [ -81.854059, 37.291352 ], [ -81.853488, 37.294763 ], [ -81.854465, 37.299937 ], [ -81.853978, 37.300418 ], [ -81.853645, 37.300779 ], [ -81.854460, 37.306570 ], [ -81.856032, 37.306742 ], [ -81.859624, 37.304765 ], [ -81.862031, 37.305648 ], [ -81.864760, 37.308404 ], [ -81.865219, 37.308839 ], [ -81.865683, 37.309484 ], [ -81.865429, 37.310120 ], [ -81.863712, 37.312230 ], [ -81.859928, 37.313965 ], [ -81.860267, 37.315715 ], [ -81.867425, 37.320838 ], [ -81.870180, 37.320667 ], [ -81.872662, 37.323314 ], [ -81.873213, 37.325065 ], [ -81.878343, 37.328837 ], [ -81.878713, 37.331753 ], [ -81.879601, 37.332074 ], [ -81.880886, 37.331146 ], [ -81.885075, 37.330665 ], [ -81.886952, 37.330725 ], [ -81.887722, 37.331156 ], [ -81.892876, 37.330134 ], [ -81.893773, 37.330105 ], [ -81.894768, 37.331381 ], [ -81.894797, 37.332012 ], [ -81.895489, 37.332022 ], [ -81.896001, 37.331967 ], [ -81.899459, 37.340277 ], [ -81.899495, 37.341102 ], [ -81.902992, 37.342340 ], [ -81.903795, 37.343050 ], [ -81.905945, 37.342775 ], [ -81.906368, 37.342760 ], [ -81.907322, 37.343119 ], [ -81.907895, 37.343783 ], [ -81.910875, 37.348729 ], [ -81.911487, 37.348839 ], [ -81.911951, 37.349339 ], [ -81.916678, 37.349346 ], [ -81.920279, 37.353402 ], [ -81.920711, 37.355416 ], [ -81.921571, 37.356423 ], [ -81.925643, 37.357316 ], [ -81.926589, 37.358942 ], [ -81.928497, 37.360645 ], [ -81.926697, 37.364618 ], [ -81.929915, 37.366589 ], [ -81.930194, 37.366728 ], [ -81.933895, 37.372747 ], [ -81.932763, 37.374229 ], [ -81.933880, 37.377796 ], [ -81.935872, 37.378554 ], [ -81.936744, 37.380730 ], [ -81.933601, 37.389217 ], [ -81.928778, 37.393845 ], [ -81.928280, 37.398059 ], [ -81.930786, 37.401656 ], [ -81.930042, 37.405291 ], [ -81.927338, 37.406844 ], [ -81.925764, 37.406874 ], [ -81.924506, 37.407613 ], [ -81.923481, 37.411379 ], [ -81.932468, 37.415217 ], [ -81.936950, 37.419920 ], [ -81.940553, 37.429058 ], [ -81.937838, 37.432111 ], [ -81.935316, 37.436390 ], [ -81.935621, 37.438397 ], [ -81.938843, 37.440463 ], [ -81.941175, 37.440485 ], [ -81.942856, 37.439929 ], [ -81.945765, 37.440214 ], [ -81.949367, 37.445687 ], [ -81.958672, 37.448045 ], [ -81.965582, 37.446918 ], [ -81.969342, 37.450324 ], [ -81.968795, 37.451496 ], [ -81.976176, 37.457186 ], [ -81.980013, 37.457210 ], [ -81.984891, 37.454315 ], [ -81.987006, 37.454878 ], [ -81.992270, 37.460916 ], [ -81.995649, 37.469833 ], [ -81.996578, 37.476705 ], [ -81.992916, 37.482969 ], [ -81.989849, 37.484879 ], [ -81.985703, 37.485681 ], [ -81.980327, 37.485447 ], [ -81.979169, 37.484604 ], [ -81.977593, 37.484603 ], [ -81.970730, 37.489904 ], [ -81.964986, 37.493488 ], [ -81.957213, 37.491504 ], [ -81.953264, 37.491763 ], [ -81.952681, 37.492274 ], [ -81.952735, 37.494162 ], [ -81.954167, 37.495302 ], [ -81.954364, 37.496084 ], [ -81.954077, 37.499822 ], [ -81.953147, 37.501314 ], [ -81.951831, 37.502050 ], [ -81.949188, 37.502376 ], [ -81.945957, 37.501901 ], [ -81.943912, 37.502929 ], [ -81.944188, 37.506976 ], [ -81.943045, 37.508609 ], [ -81.941151, 37.509483 ], [ -81.932279, 37.511961 ], [ -81.927870, 37.512118 ], [ -81.926736, 37.513040 ], [ -81.926391, 37.514207 ], [ -81.933088, 37.518968 ], [ -81.936996, 37.514230 ], [ -81.938749, 37.512902 ], [ -81.941968, 37.512306 ], [ -81.943865, 37.512879 ], [ -81.944756, 37.513657 ], [ -81.945475, 37.516610 ], [ -81.943779, 37.519609 ], [ -81.943693, 37.521212 ], [ -81.947085, 37.523913 ], [ -81.947660, 37.525080 ], [ -81.947545, 37.527530 ], [ -81.943981, 37.530300 ], [ -81.944010, 37.530964 ], [ -81.946022, 37.531742 ], [ -81.953524, 37.528056 ], [ -81.956630, 37.528490 ], [ -81.957693, 37.529841 ], [ -81.957436, 37.533206 ], [ -81.956947, 37.534259 ], [ -81.957379, 37.535198 ], [ -81.959362, 37.535220 ], [ -81.967583, 37.532815 ], [ -81.969279, 37.534325 ], [ -81.968297, 37.537798 ] ] ] } } +, +{ "type": "Feature", "properties": { "GEO_ID": "0400000US56", "STATE": "56", "NAME": "Wyoming", "LSAD": "", "CENSUSAREA": 97093.141000 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -109.050076, 41.000659 ], [ -109.173682, 41.000859 ], [ -109.231985, 41.002059 ], [ -109.250735, 41.001009 ], [ -109.500694, 40.999127 ], [ -109.534926, 40.998143 ], [ -109.676421, 40.998395 ], [ -109.713877, 40.998266 ], [ -109.715409, 40.998191 ], [ -109.854302, 40.997661 ], [ -109.855299, 40.997614 ], [ -109.975530, 40.997912 ], [ -109.999838, 40.997330 ], [ -110.000708, 40.997352 ], [ -110.006495, 40.997815 ], [ -110.121639, 40.997101 ], [ -110.125709, 40.996550 ], [ -110.237848, 40.995427 ], [ -110.250709, 40.996089 ], [ -110.375714, 40.994947 ], [ -110.500718, 40.994746 ], [ -110.539819, 40.996346 ], [ -110.715026, 40.996347 ], [ -110.750727, 40.996847 ], [ -111.046723, 40.997959 ], [ -111.046551, 41.251716 ], [ -111.046600, 41.360692 ], [ -111.046264, 41.377731 ], [ -111.045789, 41.565571 ], [ -111.046689, 42.001567 ], [ -111.047109, 42.142497 ], [ -111.047107, 42.148971 ], [ -111.047058, 42.182672 ], [ -111.047097, 42.194773 ], [ -111.047074, 42.280787 ], [ -111.047080, 42.349420 ], [ -111.046801, 42.504946 ], [ -111.046017, 42.582723 ], [ -111.043564, 42.722624 ], [ -111.044135, 42.874924 ], [ -111.043959, 42.964450 ], [ -111.043957, 42.969482 ], [ -111.043924, 42.975063 ], [ -111.044129, 43.018702 ], [ -111.044206, 43.022614 ], [ -111.044034, 43.024581 ], [ -111.044034, 43.024844 ], [ -111.044033, 43.026411 ], [ -111.044094, 43.029270 ], [ -111.043997, 43.041415 ], [ -111.044058, 43.044640 ], [ -111.044063, 43.046302 ], [ -111.044086, 43.054819 ], [ -111.044117, 43.060309 ], [ -111.044150, 43.066172 ], [ -111.044162, 43.068222 ], [ -111.044143, 43.072364 ], [ -111.044235, 43.177121 ], [ -111.044266, 43.177236 ], [ -111.044232, 43.184440 ], [ -111.044168, 43.189244 ], [ -111.044229, 43.195579 ], [ -111.044617, 43.315720 ], [ -111.045706, 43.659112 ], [ -111.045880, 43.681033 ], [ -111.046118, 43.684902 ], [ -111.046051, 43.685812 ], [ -111.046110, 43.687848 ], [ -111.046421, 43.722059 ], [ -111.046435, 43.726545 ], [ -111.046340, 43.726957 ], [ -111.046715, 43.815832 ], [ -111.046515, 43.908376 ], [ -111.046917, 43.974978 ], [ -111.047349, 43.999921 ], [ -111.049077, 44.020072 ], [ -111.048751, 44.060403 ], [ -111.048751, 44.060838 ], [ -111.048633, 44.062903 ], [ -111.048452, 44.114831 ], [ -111.049119, 44.124923 ], [ -111.049695, 44.353626 ], [ -111.049148, 44.374925 ], [ -111.049216, 44.435811 ], [ -111.049194, 44.438058 ], [ -111.048974, 44.474072 ], [ -111.055208, 44.624927 ], [ -111.055511, 44.725343 ], [ -111.056416, 44.749928 ], [ -111.056888, 44.866658 ], [ -111.055629, 44.933578 ], [ -111.056207, 44.935901 ], [ -111.055199, 45.001321 ], [ -111.044275, 45.001345 ], [ -110.785008, 45.002952 ], [ -110.761554, 44.999934 ], [ -110.750767, 44.997948 ], [ -110.705272, 44.992324 ], [ -110.552433, 44.992237 ], [ -110.547165, 44.992459 ], [ -110.488070, 44.992361 ], [ -110.402927, 44.993810 ], [ -110.362698, 45.000593 ], [ -110.342131, 44.999053 ], [ -110.324441, 44.999156 ], [ -110.286770, 44.996850 ], [ -110.199503, 44.996188 ], [ -110.110103, 45.003905 ], [ -110.026347, 45.003665 ], [ -110.025544, 45.003602 ], [ -109.995050, 45.003174 ], [ -109.875735, 45.003275 ], [ -109.798687, 45.002188 ], [ -109.750730, 45.001605 ], [ -109.663673, 45.002536 ], [ -109.574321, 45.002631 ], [ -109.386432, 45.004887 ], [ -109.375713, 45.004610 ], [ -109.269294, 45.005283 ], [ -109.263431, 45.005345 ], [ -109.103445, 45.005904 ], [ -109.083010, 44.999610 ], [ -109.062262, 44.999623 ], [ -108.578484, 45.000484 ], [ -108.565921, 45.000578 ], [ -108.500679, 44.999691 ], [ -108.271201, 45.000251 ], [ -108.249345, 44.999458 ], [ -108.238139, 45.000206 ], [ -108.218479, 45.000541 ], [ -108.149390, 45.001062 ], [ -108.000663, 45.001223 ], [ -107.997353, 45.001565 ], [ -107.750654, 45.000778 ], [ -107.608854, 45.000860 ], [ -107.607824, 45.000929 ], [ -107.492050, 45.001480 ], [ -107.351441, 45.001407 ], [ -107.134180, 45.000109 ], [ -107.125633, 44.999388 ], [ -107.105685, 44.998734 ], [ -107.084939, 44.996599 ], [ -107.074996, 44.997004 ], [ -107.050801, 44.996424 ], [ -106.892875, 44.995947 ], [ -106.888773, 44.995885 ], [ -106.263586, 44.993788 ], [ -105.928184, 44.993647 ], [ -105.914258, 44.999986 ], [ -105.913382, 45.000941 ], [ -105.848065, 45.000396 ], [ -105.038405, 45.000345 ], [ -105.025266, 45.000290 ], [ -105.019284, 45.000329 ], [ -105.018240, 45.000437 ], [ -104.765063, 44.999183 ], [ -104.759855, 44.999066 ], [ -104.726370, 44.999518 ], [ -104.665171, 44.998618 ], [ -104.663882, 44.998869 ], [ -104.470422, 44.998453 ], [ -104.470117, 44.998453 ], [ -104.250145, 44.998220 ], [ -104.057698, 44.997431 ], [ -104.055914, 44.874986 ], [ -104.056496, 44.867034 ], [ -104.055963, 44.768236 ], [ -104.055963, 44.767962 ], [ -104.055934, 44.723720 ], [ -104.055870, 44.723422 ], [ -104.055777, 44.700466 ], [ -104.055938, 44.693881 ], [ -104.055810, 44.691343 ], [ -104.055892, 44.543341 ], [ -104.055927, 44.517730 ], [ -104.055389, 44.249983 ], [ -104.054487, 44.180381 ], [ -104.054950, 43.938090 ], [ -104.055077, 43.936535 ], [ -104.055488, 43.853477 ], [ -104.055138, 43.750421 ], [ -104.055133, 43.747105 ], [ -104.054902, 43.583852 ], [ -104.054885, 43.583512 ], [ -104.054840, 43.579368 ], [ -104.055032, 43.558603 ], [ -104.054786, 43.503072 ], [ -104.054766, 43.428914 ], [ -104.054614, 43.390949 ], [ -104.054403, 43.325914 ], [ -104.054218, 43.304370 ], [ -104.053884, 43.297047 ], [ -104.053876, 43.289801 ], [ -104.053127, 43.000585 ], [ -104.052863, 42.754569 ], [ -104.052809, 42.749966 ], [ -104.052583, 42.650062 ], [ -104.052741, 42.633982 ], [ -104.052586, 42.630917 ], [ -104.052775, 42.611590 ], [ -104.052775, 42.610813 ], [ -104.053107, 42.499964 ], [ -104.052776, 42.258220 ], [ -104.052793, 42.249962 ], [ -104.053125, 42.249962 ], [ -104.052761, 42.170278 ], [ -104.052547, 42.166801 ], [ -104.053001, 42.137254 ], [ -104.052738, 42.133769 ], [ -104.052600, 42.124963 ], [ -104.052954, 42.089077 ], [ -104.052967, 42.075004 ], [ -104.052880, 42.021761 ], [ -104.052729, 42.016318 ], [ -104.052699, 41.998673 ], [ -104.052761, 41.994967 ], [ -104.052830, 41.994600 ], [ -104.052856, 41.975958 ], [ -104.052734, 41.973007 ], [ -104.052991, 41.914973 ], [ -104.052931, 41.906143 ], [ -104.053026, 41.885464 ], [ -104.052774, 41.733401 ], [ -104.052913, 41.645190 ], [ -104.052945, 41.638167 ], [ -104.052975, 41.622931 ], [ -104.052735, 41.613676 ], [ -104.052859, 41.592254 ], [ -104.052540, 41.564274 ], [ -104.052531, 41.552723 ], [ -104.052584, 41.552650 ], [ -104.052692, 41.541154 ], [ -104.052686, 41.539111 ], [ -104.052476, 41.522343 ], [ -104.052478, 41.515754 ], [ -104.052340, 41.417865 ], [ -104.052160, 41.407662 ], [ -104.052287, 41.393307 ], [ -104.052687, 41.330569 ], [ -104.052324, 41.321144 ], [ -104.052476, 41.320961 ], [ -104.052568, 41.316202 ], [ -104.052453, 41.278202 ], [ -104.052574, 41.278019 ], [ -104.052666, 41.275251 ], [ -104.053514, 41.157257 ], [ -104.053142, 41.114457 ], [ -104.053083, 41.104985 ], [ -104.053025, 41.090274 ], [ -104.053177, 41.089725 ], [ -104.053097, 41.018045 ], [ -104.053158, 41.016809 ], [ -104.053249, 41.001406 ], [ -104.066961, 41.001504 ], [ -104.086068, 41.001563 ], [ -104.104590, 41.001543 ], [ -104.123586, 41.001626 ], [ -104.211473, 41.001591 ], [ -104.214191, 41.001568 ], [ -104.214692, 41.001657 ], [ -104.467672, 41.001473 ], [ -104.497058, 41.001805 ], [ -104.497149, 41.001828 ], [ -104.675999, 41.000957 ], [ -104.829504, 40.999270 ], [ -104.855273, 40.998048 ], [ -105.254779, 40.998210 ], [ -105.256527, 40.998191 ], [ -105.277138, 40.998173 ], [ -105.724804, 40.996910 ], [ -105.730421, 40.996886 ], [ -106.061181, 40.996999 ], [ -106.217573, 40.997734 ], [ -106.321165, 40.999123 ], [ -106.386356, 41.001144 ], [ -106.391852, 41.001176 ], [ -106.430950, 41.001752 ], [ -106.437419, 41.001795 ], [ -106.439563, 41.001978 ], [ -106.453859, 41.002057 ], [ -106.857773, 41.002663 ], [ -107.000606, 41.003444 ], [ -107.241194, 41.002804 ], [ -107.367443, 41.003073 ], [ -107.625624, 41.002124 ], [ -107.918421, 41.002036 ], [ -108.046539, 41.002064 ], [ -108.181227, 41.000455 ], [ -108.250649, 41.000114 ], [ -108.500659, 41.000112 ], [ -108.526667, 40.999608 ], [ -108.631108, 41.000156 ], [ -108.884138, 41.000094 ], [ -109.050076, 41.000659 ] ] ] } } + +] +} diff --git a/server.js b/server.js new file mode 100644 index 00000000..99203e71 --- /dev/null +++ b/server.js @@ -0,0 +1,100 @@ +const express = require("express"); +const app = express(); +const bodyparser = require("body-parser") +const fs = require('fs'); + + +// make all the files in 'public' available +// https://expressjs.com/en/starter/static-files.html +app.use(express.static("public")); +app.use(express.static("views")); + + +var parse = require('csv-parse'); + +var csvData=[]; +fs.createReadStream('./all-states-history.csv') + .pipe(parse({delimiter: ','})) + .on('data', function(csvrow) { + // console.log(csvrow); + csvData.push(csvrow); + }) + .on('end',function() { + //do something with csvData + // console.log(csvData); + }); +var populationData = [] +fs.createReadStream('./all-states-population.csv') + .pipe(parse({delimiter: ','})) + .on('data', function(csvrow) { + // console.log(csvrow); + populationData.push(csvrow); + }) + .on('end',function() { + //do something with csvData + // console.log(populationData); + }); + + + +// https://expressjs.com/en/starter/basic-routing.html +app.get("/", (request, response) => { + response.sendFile(__dirname + "/index.html"); +}); + + +// listen for requests :) +const listener = app.listen(process.env.PORT || 3000, () => { + console.log("Your app is listening on port " + listener.address().port); +}); + +let stateID +let chartType +app.post('/postStateId', bodyparser.json(), function( req, res ){ + stateID = 0 + stateID = req.body.stateId + console.log(stateID) + res.json({response: 'sent'}) +}) +app.post('/postType', bodyparser.json(), function( req, res ){ + chartType = '' + chartType = req.body.chartType + console.log(chartType) + res.json({response: 'sent'}) +}) + +app.get('/redirectPage', function(req, res) { + if (chartType === 'checkDeath') { + res.sendFile(__dirname + '/views/deathStatistics.html') + } + if (chartType === 'checkPositive') { + res.sendFile(__dirname + '/views/positiveStatistics.html') + } + if (chartType === 'checkAirport') { + res.sendFile(__dirname + '/views/airport.html') + } +}); + +app.get('/getIdTypeCsv', function( req, res ){ + res.end(JSON.stringify({ + stateId: stateID, + chartType: chartType, + rawCsv: csvData + })) +}) + +app.get('/getCsv', function( req, res ){ + res.end(JSON.stringify({ + rawCsv: csvData + })) +}) + +app.get('/getPopulationCsv', function( req, res ){ + res.end(JSON.stringify({ + rawPopulationCsv: populationData + })) +}) + +app.get('/gotoVideo', function(req, res) { + res.sendFile(__dirname + '/views/video.html') +}); \ No newline at end of file diff --git a/views/airport.html b/views/airport.html new file mode 100644 index 00000000..9945fed1 --- /dev/null +++ b/views/airport.html @@ -0,0 +1,117 @@ + + + + +
+ + \ No newline at end of file diff --git a/views/all-states-history.csv b/views/all-states-history.csv new file mode 100644 index 00000000..1ff2bfb2 --- /dev/null +++ b/views/all-states-history.csv @@ -0,0 +1,20781 @@ +"date","state","death","deathConfirmed","deathIncrease","deathProbable","hospitalized","hospitalizedCumulative","hospitalizedCurrently","hospitalizedIncrease","inIcuCumulative","inIcuCurrently","negative","negativeIncrease","negativeTestsAntibody","negativeTestsPeopleAntibody","negativeTestsViral","onVentilatorCumulative","onVentilatorCurrently","positive","positiveCasesViral","positiveIncrease","positiveScore","positiveTestsAntibody","positiveTestsAntigen","positiveTestsPeopleAntibody","positiveTestsPeopleAntigen","positiveTestsViral","recovered","totalTestEncountersViral","totalTestEncountersViralIncrease","totalTestResults","totalTestResultsIncrease","totalTestsAntibody","totalTestsAntigen","totalTestsPeopleAntibody","totalTestsPeopleAntigen","totalTestsPeopleViral","totalTestsPeopleViralIncrease","totalTestsViral","totalTestsViralIncrease" +"2021-03-07","AK",305,,0,,1293,1293,33,0,,,,0,,,1660758,,2,56886,,0,0,,,,,68693,,,0,1731628,0,,,,,,0,1731628,0 +"2021-03-07","AL",10148,7963,-1,2185,45976,45976,494,0,2676,,1931711,2087,,,,1515,,499819,392077,408,0,,,,,,295690,,0,2323788,2347,,,119757,,2323788,2347,,0 +"2021-03-07","AR",5319,4308,22,1011,14926,14926,335,11,,141,2480716,3267,,,2480716,1533,65,324818,255726,165,0,,,,81803,,315517,,0,2736442,3380,,,,481311,,0,2736442,3380 +"2021-03-07","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-03-07","AZ",16328,14403,5,1925,57907,57907,963,44,,273,3073010,13678,,,,,143,826454,769935,1335,0,,,,,,,,0,7908105,45110,580569,,444089,,3842945,14856,7908105,45110 +"2021-03-07","CA",54124,,258,,,,4291,0,,1159,,0,,,,,,3501394,3501394,3816,0,,,,,,,,0,49646014,133186,,,,,,0,49646014,133186 +"2021-03-07","CO",5989,5251,3,735,23904,23904,326,18,,,2199458,0,369995,,,,,436602,410976,840,0,63087,,,,,,6415123,38163,6415123,38163,435053,,,,2616541,6107,,0 +"2021-03-07","CT",7704,6327,0,1377,12257,12257,428,0,,,,0,,,6188566,,,285330,265709,0,0,,22245,,,323284,,,0,6520366,0,,396680,,,,0,6520366,0 +"2021-03-07","DC",1030,,0,,,,150,0,,38,,0,,,,,16,41419,,146,0,,,,,,29570,1261363,5726,1261363,5726,,,,,441942,1149,,0 +"2021-03-07","DE",1473,1337,9,136,,,104,0,,13,545070,917,,,,,,88354,83621,215,0,,,,,91873,,1431942,5867,1431942,5867,,,,,633424,1132,,0 +"2021-03-07","FL",32266,,66,,82237,82237,3307,92,,,9339038,19166,864153,816231,16887410,,,1909209,1548837,4024,0,190026,,178979,,2502506,,22339182,64599,22339182,64599,1054711,,995580,,11248247,23190,19482607,52132 +"2021-03-07","GA",17906,15598,1,2308,56797,56797,2008,35,9263,,,0,,,,,,1023487,828336,1709,0,78312,168867,,,803515,,,0,7359069,18827,482568,1484921,,,,0,7359069,18827 +"2021-03-07","GU",133,,0,,,,2,0,,1,112887,0,,,,,1,7749,7540,0,0,27,248,,,,7590,,0,120636,0,358,9299,,,,0,120426,0 +"2021-03-07","HI",445,445,1,,2226,2226,27,0,,5,,0,,,,,3,28699,27891,53,0,,,,,27774,,1146796,5117,1146796,5117,,,,,,0,,0 +"2021-03-07","IA",5558,,6,,,,167,0,,35,1044418,1299,,93984,2432425,,6,282384,282384,257,0,,60700,19704,57190,306343,320054,,0,1326802,1556,,1390094,113739,247999,1329195,1555,2753899,4464 +"2021-03-07","ID",1879,1652,3,227,7184,7184,150,5,1245,33,505964,535,,,,,,172931,139874,104,0,,,,,,96017,,0,645838,396,,123809,,,645838,396,1103725,877 +"2021-03-07","IL",23014,20763,12,2251,,,1141,0,,255,,0,,,,,112,1198335,,1068,0,,,,,,,,0,18640190,68094,,,,,,0,18640190,68094 +"2021-03-07","IN",12737,12310,11,427,43217,43217,656,64,7600,104,2483156,4643,,,,,50,667262,,746,0,,,,,760491,,,0,8242367,29427,,,,,3150418,5389,8242367,29427 +"2021-03-07","KS",4812,,0,,9387,9387,235,0,2554,50,974686,0,,,,411,22,295861,,0,0,,,,,,,,0,1270547,0,,602322,,,1270547,0,2525259,0 +"2021-03-07","KY",4819,4369,13,450,19457,19457,558,6,4034,156,,0,,,,,82,410709,314385,525,0,9929,37655,,,251921,48145,,0,3975672,0,111886,509047,,,,0,3975672,0 +"2021-03-07","LA",9748,9033,32,715,,,532,0,,,5261679,20578,,,,,75,433785,372514,740,0,,,,,,415954,,0,5695464,21318,,469967,,,,0,5634193,21098 +"2021-03-07","MA",16417,16085,43,332,19713,19713,665,0,,174,4404792,8028,,,,,116,591356,559083,1425,0,,,15425,,668145,508745,,0,16825551,96578,,,156185,580372,4963875,9309,16825551,96578 +"2021-03-07","MD",7955,7773,14,182,35651,35651,818,79,,215,3034546,2050,,169779,,,,387319,387319,709,0,,,28360,,472716,9703,,0,8097590,33128,,,198139,,3421865,2759,8097590,33128 +"2021-03-07","ME",706,683,2,23,1570,1570,67,4,,16,,0,14232,,,,8,45794,35846,159,0,869,10749,,,41510,12840,,0,1660180,7490,15113,213426,,,,0,1660180,7490 +"2021-03-07","MI",16658,15666,0,992,,,866,0,,222,,0,,,9869602,,97,656072,596054,0,0,,,,,752365,549881,,0,10621967,0,537073,,,,,0,10621967,0 +"2021-03-07","MN",6550,6276,4,274,25978,25978,224,2,5364,57,3058514,8218,,,,,,490011,465547,895,0,,,,,,476055,7111428,25369,7111428,25369,,451963,,,3524061,8998,,0 +"2021-03-07","MO",8161,,0,,,,955,0,,197,1878583,2950,127001,,4025535,,135,480643,480643,291,0,24926,83657,,,530741,,,0,4565866,10659,152126,906752,135759,366813,2359226,3241,4565866,10659 +"2021-03-07","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,145,145,1,0,,,,,,29,,0,17574,1,,,,,17542,0,26131,0 +"2021-03-07","MS",6808,4737,3,2071,9162,9162,419,0,,89,1459374,0,,,,,47,297581,184278,260,0,,,,,,278162,,0,1756955,260,81986,748339,,,,0,1642348,0 +"2021-03-07","MT",1381,,0,,4630,4630,63,1,,12,,0,,,,,6,100914,95390,72,0,,,,,,97943,,0,1104488,3132,,,,,,0,1104488,3132 +"2021-03-07","NC",11502,10169,0,1333,,,1179,0,,309,,0,,,,,,872176,759617,0,0,,,,,,,,0,9688838,0,,805924,,,,0,9688838,0 +"2021-03-07","ND",1478,,0,,3880,3880,23,2,567,3,305912,-109,11953,,,,,100391,94928,34,0,1442,,,,,98326,1425146,679,1425146,679,13395,156698,,,406303,-75,1536487,881 +"2021-03-07","NE",2113,,0,,6237,6237,137,8,,,771128,542,,,2182938,,,203026,,373,0,,,,,235965,157144,,0,2421684,1,,,,,974759,978,2421684,1 +"2021-03-07","NH",1184,,3,,1131,1131,68,4,348,,579582,396,,,,,,76861,54064,166,0,,,,,,73615,,0,1497185,15697,39545,205103,37918,,633646,521,1497185,15697 +"2021-03-07","NJ",23574,21177,17,2397,64396,64396,1792,58,,376,10186941,0,,,,,232,812609,720939,2519,0,,,,,,,,0,10999550,2519,,,,,,0,10902830,0 +"2021-03-07","NM",3808,,12,,13252,13252,169,10,,,,0,,,,,,186922,,180,0,,,,,,156554,,0,2783542,11702,,,,,,0,2783542,11702 +"2021-03-07","NV",5037,,1,,,,399,0,,87,1131758,1829,,,,,48,296190,296190,730,0,,,,,,,2770192,6201,2770192,6201,,,,,1427948,2059,,0 +"2021-03-07","NY",39029,,59,,89995,89995,4789,0,,999,,0,,,,,682,1681169,,6789,0,,,,,,,39695100,227768,39695100,227768,,,,,,0,,0 +"2021-03-07","OH",17656,14752,0,2594,50881,50881,820,33,7207,260,,0,,,,,171,978471,836358,735,0,,86990,,,864925,925655,,0,10257157,29289,,1798150,,,,0,10257157,29289 +"2021-03-07","OK",4534,,0,,24332,24332,346,55,,100,3146300,0,,,3146300,,,428997,,461,0,23139,,,,389855,412177,,0,3575297,461,152279,,,,,0,3548479,0 +"2021-03-07","OR",2296,,3,,8714,8714,158,0,,32,,0,,,3624001,,12,157079,,195,0,,,,,226972,,,0,3850973,0,,,,,,0,3850973,0 +"2021-03-07","PA",24349,,32,,,,1587,0,,314,3942124,6592,,,,,183,948643,814540,1658,0,,,,,,861756,10681716,52432,10681716,52432,,,,,4756664,8073,,0 +"2021-03-07","PR",2059,1749,0,310,,,147,0,,24,305972,0,,,395291,,18,101327,93336,0,0,84115,,,,20103,91987,,0,407299,0,,,,,,0,415664,0 +"2021-03-07","RI",2547,,0,,9020,9020,141,0,,25,677570,1421,,,2970088,,16,128781,,265,0,,,,,153260,,3123348,13513,3123348,13513,,,,,806351,1686,,0 +"2021-03-07","SC",8754,7744,35,1010,20725,20725,579,66,,137,4657179,25856,106809,,4526263,,83,525865,449977,1408,0,28316,111239,,,580893,218863,,0,5183044,27264,135125,912838,,,,0,5107156,26282 +"2021-03-07","SD",1900,,2,,6705,6705,72,13,,9,314540,524,,,,,6,113589,100690,211,0,,,,,105096,109531,,0,701924,1275,,,,,428129,735,701924,1275 +"2021-03-07","TN",11543,9278,0,2265,18870,18870,851,0,,218,,0,,,6119050,,127,782206,653905,0,0,,140582,,,753695,756793,,0,6872745,0,,1430665,,,,0,6872745,0 +"2021-03-07","TX",44451,,84,,,,4721,0,,1463,,0,,,,,,2686818,2320857,2953,0,159003,211014,,,2628176,2502609,,0,19907384,76040,1033285,2664340,,,,0,19907384,76040 +"2021-03-07","UT",1976,,1,,14891,14891,212,24,2344,73,1560293,3204,,,2564131,822,,374850,,412,0,,60158,,57683,345990,358958,,0,2910121,6828,,1002177,,371319,1876802,3460,2910121,6828 +"2021-03-07","VA",9596,8104,77,1492,24661,24661,1127,24,,258,,0,,,,,168,585700,461172,1163,0,28980,125061,,,562266,,6038209,19925,6038209,19925,224284,1454389,,,,0,,0 +"2021-03-07","VI",25,25,0,,,,,0,,,46167,0,,,,,,2714,,0,0,,,,,,2559,,0,48881,0,,,,,48961,0,,0 +"2021-03-07","VT",208,,0,,,,31,0,,1,320060,643,,,,,,16083,15635,119,0,,,,,,13384,,0,1124215,8748,,,,,335695,759,1124215,8748 +"2021-03-07","WA",5041,,0,,19599,19599,431,43,,98,,0,,,5068404,,43,344532,325053,664,0,,,,,324994,,5393756,24040,5393756,24040,,,,,,0,,0 +"2021-03-07","WI",7106,6481,4,625,26457,26457,249,25,2273,66,2647864,3521,,,,,,621654,566693,377,0,,,,,,553203,7080595,19193,7080595,19193,,,,,3214557,3850,,0 +"2021-03-07","WV",2325,1981,2,344,,,179,0,,40,,0,,,,,26,133445,106629,155,0,,,,,,125383,,0,2236551,6449,33011,,,,,0,2236551,6449 +"2021-03-07","WY",682,,0,,1391,1391,21,0,,,182264,0,,,602513,,,54764,46397,0,0,,,,,38993,53550,,0,649293,0,,,,,228661,0,649293,0 +"2021-03-06","AK",305,,0,,1293,1293,33,0,,,,0,,,1660758,,2,56886,,0,0,,,,,68693,,,0,1731628,0,,,,,,0,1731628,0 +"2021-03-06","AL",10149,7963,27,2186,45976,45976,526,0,2675,,1929624,4866,,,,1514,,499411,391817,524,0,,,,,,295690,,0,2321441,5314,,,119456,,2321441,5314,,0 +"2021-03-06","AR",5297,4302,14,995,14915,14915,345,12,,148,2477449,4711,,,2477449,1533,75,324653,255613,327,0,,,,81756,,315181,,0,2733062,4959,,,,479963,,0,2733062,4959 +"2021-03-06","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-03-06","AZ",16323,14395,54,1928,57863,57863,966,44,,280,3059332,8442,,,,,140,825119,768757,1735,0,,,,,,,,0,7862995,35425,,,443336,,3828089,9639,7862995,35425 +"2021-03-06","CA",53866,,418,,,,4513,0,,1221,,0,,,,,,3497578,3497578,4452,0,,,,,,,,0,49512828,218325,,,,,,0,49512828,218325 +"2021-03-06","CO",5986,5251,0,735,23886,23886,326,23,,,2199458,5505,368326,,,,,435762,410976,1108,0,62612,,,,,,6376960,33600,6376960,33600,433082,,,,2610434,6427,,0 +"2021-03-06","CT",7704,6327,0,1377,12257,12257,428,0,,,,0,,,6188566,,,285330,265709,0,0,,22245,,,323284,,,0,6520366,0,,396680,,,,0,6520366,0 +"2021-03-06","DC",1030,,3,,,,150,0,,40,,0,,,,,15,41273,,151,0,,,,,,29470,1255637,8000,1255637,8000,,,,,440793,1280,,0 +"2021-03-06","DE",1464,1328,11,136,,,114,0,,12,544153,1362,,,,,,88139,83424,265,0,,,,,91685,,1426075,8757,1426075,8757,,,,,632292,1627,,0 +"2021-03-06","FL",32200,,107,,82145,82145,3352,243,,,9319872,23282,864153,816231,16841086,,,1905185,1545643,4587,0,190026,,178979,,2496909,,22274583,87820,22274583,87820,1054711,,995580,,11225057,27869,19430475,59303 +"2021-03-06","GA",17905,15597,90,2308,56762,56762,2071,135,9260,,,0,,,,,,1021778,827397,2269,0,77793,168005,,,802411,,,0,7340242,24765,481545,1478232,,,,0,7340242,24765 +"2021-03-06","GU",133,,0,,,,2,0,,1,112887,0,,,,,1,7749,7540,1,0,27,248,,,,7590,,0,120636,1,358,9299,,,,0,120426,0 +"2021-03-06","HI",444,444,1,,2226,2226,27,1,,5,,0,,,,,3,28646,27838,85,0,,,,,27726,,1141679,5284,1141679,5284,,,,,,0,,0 +"2021-03-06","IA",5552,,3,,,,170,0,,38,1043119,1515,,93873,2428315,,10,282127,282127,362,0,,60633,19635,57133,306056,319780,,0,1325246,1877,,1388623,113559,247775,1327640,1871,2749435,7094 +"2021-03-06","ID",1876,1649,0,227,7179,7179,150,15,1245,33,505429,504,,,,,,172827,140013,240,0,,,,,,95808,,0,645442,646,,123809,,,645442,646,1102848,2572 +"2021-03-06","IL",23002,20750,56,2252,,,1210,0,,261,,0,,,,,108,1197267,,2565,0,,,,,,,,0,18572096,79248,,,,,,0,18572096,79248 +"2021-03-06","IN",12726,12299,29,427,43153,43153,663,49,7586,118,2478513,5155,,,,,60,666516,,1231,0,,,,,759598,,,0,8212940,41718,,,,,3145029,6386,8212940,41718 +"2021-03-06","KS",4812,,0,,9387,9387,235,0,2554,50,974686,0,,,,411,22,295861,,0,0,,,,,,,,0,1270547,0,,602322,,,1270547,0,2525259,0 +"2021-03-06","KY",4806,4356,52,450,19451,19451,591,71,4034,171,,0,,,,,72,410184,313998,839,0,9929,37655,,,251921,48131,,0,3975672,5773,111886,509047,,,,0,3975672,5773 +"2021-03-06","LA",9716,9007,0,709,,,538,0,,,5241101,0,,,,,77,433045,371994,0,0,,,,,,415954,,0,5674146,0,,466494,,,,0,5613095,0 +"2021-03-06","MA",16374,16044,52,330,19713,19713,687,0,,176,4396764,7826,,,,,114,589931,557802,1722,0,,,15425,,666605,508745,,0,16728973,100359,,,156185,578153,4954566,9321,16728973,100359 +"2021-03-06","MD",7941,7759,11,182,35572,35572,830,194,,230,3032496,7547,,169779,,,,386610,386610,932,0,,,28360,,471762,9703,,0,8064462,40384,,,198139,,3419106,8479,8064462,40384 +"2021-03-06","ME",704,681,0,23,1566,1566,74,6,,20,,0,14232,,,,9,45635,35759,183,0,869,10646,,,41390,12838,,0,1652690,8103,15113,210929,,,,0,1652690,8103 +"2021-03-06","MI",16658,15666,57,992,,,866,0,,222,,0,,,9869602,,97,656072,596054,1692,0,,,,,752365,549881,,0,10621967,37232,537073,,,,,0,10621967,37232 +"2021-03-06","MN",6546,6272,12,274,25976,25976,224,38,5364,57,3050296,6988,,,,,,489116,464767,946,0,,,,,,475170,7086059,28026,7086059,28026,,448578,,,3515063,7786,,0 +"2021-03-06","MO",8161,,3,,,,1001,0,,198,1875633,3308,126755,,4015210,,136,480352,480352,386,0,24832,83481,,,530416,,,0,4555207,14140,151786,900275,135520,364697,2355985,3694,4555207,14140 +"2021-03-06","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,144,144,0,0,,,,,,29,,0,17573,0,,,,,17542,0,26131,0 +"2021-03-06","MS",6805,4734,22,2071,9162,9162,419,0,,89,1459374,0,,,,,47,297321,184157,576,0,,,,,,278162,,0,1756695,576,81986,748339,,,,0,1642348,0 +"2021-03-06","MT",1381,,2,,4629,4629,63,19,,12,,0,,,,,6,100842,95336,186,0,,,,,,97801,,0,1101356,4443,,,,,,0,1101356,4443 +"2021-03-06","NC",11502,10169,56,1333,,,1179,0,,309,,0,,,,,,872176,759617,2027,0,,,,,,,,0,9688838,38654,,805924,,,,0,9688838,38654 +"2021-03-06","ND",1478,,0,,3878,3878,21,3,567,3,306021,111,11953,,,,,100357,94906,79,0,1442,,,,,98240,1424467,1930,1424467,1930,13395,156289,,,406378,190,1535606,2599 +"2021-03-06","NE",2113,,1,,6229,6229,136,3,,,770586,1354,,,2183243,,,202653,,343,0,,,,,235726,156825,,0,2421683,10138,,,,,973781,1701,2421683,10138 +"2021-03-06","NH",1181,,3,,1127,1127,90,1,348,,579186,1496,,,,,,76695,53939,273,0,,,,,,73327,,0,1481488,0,39484,201268,37902,,633125,1680,1481488,0 +"2021-03-06","NJ",23557,21160,36,2397,64338,64338,1862,-916,,382,10186941,0,,,,,233,810090,718873,3720,0,,,,,,,,0,10997031,3720,,,,,,0,10902830,0 +"2021-03-06","NM",3796,,9,,13242,13242,148,13,,,,0,,,,,,186742,,282,0,,,,,,155000,,0,2771840,13846,,,,,,0,2771840,13846 +"2021-03-06","NV",5036,,16,,,,399,0,,87,1129929,2551,,,,,48,295460,295960,0,0,,,,,,,2763991,9659,2763991,9659,,,,,1425889,3051,,0 +"2021-03-06","NY",38970,,79,,89995,89995,4954,0,,1012,,0,,,,,694,1674380,,7647,0,,,,,,,39467332,273132,39467332,273132,,,,,,0,,0 +"2021-03-06","OH",17656,14752,0,2594,50848,50848,922,66,7205,273,,0,,,,,188,977736,835856,1506,0,,86651,,,863985,923986,,0,10227868,40190,,1787169,,,,0,10227868,40190 +"2021-03-06","OK",4534,,0,,24277,24277,346,120,,100,3146300,11240,,,3146300,,,428536,,978,0,23139,,,,389855,411624,,0,3574836,12218,152279,,,,,0,3548479,11750 +"2021-03-06","OR",2293,,9,,8714,8714,158,15,,32,,0,,,3624001,,12,156884,,211,0,,,,,226972,,,0,3850973,52906,,,,,,0,3850973,52906 +"2021-03-06","PA",24317,,55,,,,1513,0,,314,3935532,9494,,,,,171,946985,813059,2789,0,,,,,,859218,10629284,0,10629284,0,,,,,4748591,11534,,0 +"2021-03-06","PR",2059,1749,3,310,,,147,0,,24,305972,0,,,395291,,18,101327,93336,261,0,84115,,,,20103,91987,,0,407299,261,,,,,,0,415664,0 +"2021-03-06","RI",2547,,6,,9020,9020,141,0,,25,676149,1634,,,2956871,,16,128516,,395,0,,,,,152964,,3109835,21854,3109835,21854,,,,,804665,2029,,0 +"2021-03-06","SC",8719,7711,20,1008,20659,20659,623,54,,157,4631323,27774,106601,,4501627,,86,524457,449151,1199,0,28174,110613,,,579247,218863,,0,5155780,28973,134775,902974,,,,0,5080874,29050 +"2021-03-06","SD",1898,,2,,6692,6692,74,11,,10,314016,756,,,,,7,113378,100533,149,0,,,,,105003,109371,,0,700649,2193,,,,,427394,905,700649,2193 +"2021-03-06","TN",11543,9278,9,2265,18870,18870,879,33,,223,,0,,,6119050,,127,782206,653905,1312,0,,140582,,,753695,756793,,0,6872745,16164,,1430665,,,,0,6872745,16164 +"2021-03-06","TX",44367,,233,,,,4921,0,,1503,,0,,,,,,2683865,2318522,5570,0,157037,211546,,,2622781,2491753,,0,19831344,11292,1025375,2630435,,,,0,19831344,11292 +"2021-03-06","UT",1975,,5,,14867,14867,216,26,2344,77,1557089,3556,,,2557616,822,,374438,,570,0,,60002,,57529,345677,358249,,0,2903293,8211,,1000187,,370352,1873342,3904,2903293,8211 +"2021-03-06","VA",9519,8090,91,1429,24637,24637,1164,123,,263,,0,,,,,160,584537,460273,1477,0,28805,124666,,,561305,,6018284,21456,6018284,21456,223817,1449641,,,,0,,0 +"2021-03-06","VI",25,25,0,,,,,0,,,46167,0,,,,,,2714,,0,0,,,,,,2559,,0,48881,0,,,,,48961,0,,0 +"2021-03-06","VT",208,,1,,,,26,0,,2,319417,697,,,,,,15964,15519,145,0,,,,,,13305,,0,1115467,8171,,,,,334936,840,1115467,8171 +"2021-03-06","WA",5041,,9,,19556,19556,431,56,,98,,0,,,5044931,,30,343868,324469,778,0,,,,,324428,,5369716,25314,5369716,25314,,,,,,0,,0 +"2021-03-06","WI",7102,6478,8,624,26432,26432,260,45,2271,77,2644343,2161,,,,,,621277,566364,614,0,,,,,,552642,7061402,24321,7061402,24321,,,,,3210707,2367,,0 +"2021-03-06","WV",2323,1979,5,344,,,196,0,,56,,0,,,,,27,133290,106513,326,0,,,,,,124983,,0,2230102,11614,32961,,,,,0,2230102,11614 +"2021-03-06","WY",682,,0,,1391,1391,21,0,,,182264,0,,,602513,,,54764,46397,0,0,,,,,38993,53550,,0,649293,0,,,,,228661,0,649293,0 +"2021-03-05","AK",305,,2,,1293,1293,33,3,,,,0,,,1660758,,2,56886,,141,0,,,,,68693,,,0,1731628,7144,,,,,,0,1731628,7144 +"2021-03-05","AL",10122,7943,28,2179,45976,45976,526,169,2672,,1924758,4223,,,,1514,,498887,391369,811,0,,,,,,295690,,0,2316127,4920,,,119005,,2316127,4920,,0 +"2021-03-05","AR",5283,4291,10,992,14903,14903,359,27,,153,2472738,8452,,,2472738,1530,86,324326,255365,570,0,,,,81647,,314732,,0,2728103,8874,,,,479119,,0,2728103,8874 +"2021-03-05","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-03-05","AZ",16269,14339,84,1930,57819,57819,1043,72,,325,3050890,18778,,,,,154,823384,767560,2276,0,,,,,,,,0,7827570,51727,,,441664,,3818450,20834,7827570,51727 +"2021-03-05","CA",53448,,400,,,,4714,0,,1236,,0,,,,,,3493126,3493126,4659,0,,,,,,,,0,49294503,146818,,,,,,0,49294503,146818 +"2021-03-05","CO",5986,5250,12,736,23863,23863,356,72,,,2193953,5212,366328,,,,,434654,410054,1633,0,61933,,,,,,6343360,33127,6343360,33127,430938,,,,2604007,6312,,0 +"2021-03-05","CT",7704,6327,11,1377,12257,12257,428,0,,,,0,,,6188566,,,285330,265709,830,0,,22245,,,323284,,,0,6520366,41868,,396680,,,,0,6520366,41868 +"2021-03-05","DC",1027,,3,,,,160,0,,45,,0,,,,,19,41122,,108,0,,,,,,29417,1247637,5821,1247637,5821,,,,,439513,1038,,0 +"2021-03-05","DE",1453,1317,9,136,,,127,0,,15,542791,1020,,,,,,87874,83187,231,0,,,,,91372,,1417318,3678,1417318,3678,,,,,630665,1251,,0 +"2021-03-05","FL",32093,,138,,81902,81902,3419,302,,,9296590,26910,864153,816231,16788533,,,1900598,1542400,5876,0,190026,,178979,,2490463,,22186763,106925,22186763,106925,1054711,,995580,,11197188,32786,19371172,77877 +"2021-03-05","GA",17815,15526,65,2289,56627,56627,2099,115,9236,,,0,,,,,,1019509,826117,2081,0,77232,166895,,,801097,,,0,7315477,35861,480456,1463362,,,,0,7315477,35861 +"2021-03-05","GU",133,,2,,,,2,0,,1,112887,538,,,,,1,7748,7539,1,0,27,248,,,,7590,,0,120635,539,358,9299,,,,0,120426,539 +"2021-03-05","HI",443,443,2,,2225,2225,28,0,,5,,0,,,,,3,28561,27753,95,0,,,,,27648,,1136395,5302,1136395,5302,,,,,,0,,0 +"2021-03-05","IA",5549,,13,,,,176,0,,39,1041604,1549,,93908,2421684,,9,281765,281765,374,0,,60505,19454,57011,305649,318996,,0,1323369,1923,,1381718,113413,246773,1325769,1924,2742341,7564 +"2021-03-05","ID",1876,1649,0,227,7164,7164,139,20,1242,32,504925,1234,,,,,,172587,139871,299,0,,,,,,95524,,0,644796,1438,,123809,,,644796,1438,1100276,3452 +"2021-03-05","IL",22946,20700,44,2246,,,1166,0,,263,,0,,,,,121,1194702,,1442,0,,,,,,,,0,18492848,103336,,,,,,0,18492848,103336 +"2021-03-05","IN",12697,12263,34,434,43104,43104,730,60,7588,123,2473358,4481,,,,,64,665285,,839,0,,,,,758078,,,0,8171222,37626,,,,,3138643,5320,8171222,37626 +"2021-03-05","KS",4812,,-4,,9387,9387,235,32,2554,50,974686,5035,,,,411,22,295861,,752,0,,,,,,,,0,1270547,5787,,602322,,,1270547,5787,2525259,21021 +"2021-03-05","KY",4754,4311,22,443,19380,19380,606,16,4023,179,,0,,,,,76,409345,313491,905,0,9894,37518,,,251729,48038,,0,3969899,15260,111829,506024,,,,0,3969899,15260 +"2021-03-05","LA",9716,9007,30,709,,,538,0,,,5241101,18643,,,,,77,433045,371994,518,0,,,,,,415954,,0,5674146,19161,,466494,,,,0,5613095,19007 +"2021-03-05","MA",16322,15992,26,330,19713,19713,716,0,,180,4388938,8907,,,,,109,588209,556307,1899,0,,,15425,,664893,508745,,0,16628614,106263,,,156185,574434,4945245,10584,16628614,106263 +"2021-03-05","MD",7930,7748,8,182,35378,35378,849,74,,229,3024949,6829,,169779,,,,385678,385678,913,0,,,28360,,470625,9701,,0,8024078,41728,,,198139,,3410627,7742,8024078,41728 +"2021-03-05","ME",704,681,-1,23,1560,1560,74,11,,27,,0,14232,,,,10,45452,35636,225,0,869,10587,,,41262,12833,,0,1644587,11279,15113,209745,,,,0,1644587,11279 +"2021-03-05","MI",16601,15610,12,991,,,866,0,,222,,0,,,9833789,,97,654380,594765,1791,0,,,,,750946,541258,,0,10584735,46112,535084,,,,,0,10584735,46112 +"2021-03-05","MN",6534,6261,13,273,25938,25938,224,42,5352,57,3043308,7310,,,,,,488170,463969,796,0,,,,,,474175,7058033,34207,7058033,34207,,444689,,,3507277,7978,,0 +"2021-03-05","MO",8158,,8,,,,1019,0,,202,1872325,3724,126530,,4001529,,135,479966,479966,430,0,24695,83209,,,529982,,,0,4541067,16593,151424,892648,135245,362075,2352291,4154,4541067,16593 +"2021-03-05","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,144,144,0,0,,,,,,29,,0,17573,0,,,,,17542,0,26131,0 +"2021-03-05","MS",6783,4724,19,2059,9162,9162,445,0,,99,1459374,0,,,,,53,296745,183930,591,0,,,,,,278162,,0,1756119,591,81986,748339,,,,0,1642348,0 +"2021-03-05","MT",1379,,4,,4610,4610,67,2,,12,,0,,,,,7,100656,95509,125,0,,,,,,97541,,0,1096913,5391,,,,,,0,1096913,5391 +"2021-03-05","NC",11446,10125,47,1321,,,1226,0,,314,,0,,,,,,870149,758115,2093,0,,,,,,,,0,9650184,44487,,798257,,,,0,9650184,44487 +"2021-03-05","ND",1478,,0,,3875,3875,22,0,567,3,305910,312,11953,,,,,100278,94866,94,0,1442,,,,,98164,1422537,2917,1422537,2917,13395,154678,,,406188,406,1533007,4170 +"2021-03-05","NE",2112,,20,,6226,6226,143,69,,,769232,1102,,,2173557,,,202310,,337,0,,,,,235280,156510,,0,2411545,7859,,,,,972080,1441,2411545,7859 +"2021-03-05","NH",1178,,0,,1126,1126,90,-1,348,,577690,445,,,,,,76422,53755,244,0,,,,,,73004,,0,1481488,7047,39484,201268,37863,,631445,619,1481488,7047 +"2021-03-05","NJ",23521,21124,30,2397,65254,65254,1881,1117,,389,10186941,90590,,,,,223,806370,715889,3701,0,,,,,,,,0,10993311,94291,,,,,,0,10902830,96433 +"2021-03-05","NM",3787,,18,,13229,13229,183,14,,,,0,,,,,,186460,,304,0,,,,,,153376,,0,2757994,19260,,,,,,0,2757994,19260 +"2021-03-05","NV",5020,,15,,,,393,0,,88,1127378,2124,,,,,49,295460,295460,391,0,,,,,,,2754332,8024,2754332,8024,,,,,1422838,2515,,0 +"2021-03-05","NY",38891,,95,,89995,89995,5034,0,,1030,,0,,,,,700,1666733,,8956,0,,,,,,,39194200,296935,39194200,296935,,,,,,0,,0 +"2021-03-05","OH",17656,14752,467,2594,50782,50782,919,87,7184,266,,0,,,,,185,976230,834857,1750,0,,85756,,,861702,921707,,0,10187678,43131,,1751798,,,,0,10187678,43131 +"2021-03-05","OK",4534,,0,,24157,24157,366,54,,109,3135060,8299,,,3135060,,,427558,,917,0,21760,,,,389240,410778,,0,3562618,9216,148204,,,,,0,3536729,9046 +"2021-03-05","OR",2284,,32,,8699,8699,154,17,,30,,0,,,3571922,,14,156673,,386,0,,,,,226145,,,0,3798067,10629,,,,,,0,3798067,10629 +"2021-03-05","PA",24262,,43,,,,1587,0,,325,3926038,10767,,,,,173,944196,811019,2757,0,,,,,,859218,10629284,59517,10629284,59517,,,,,4737057,12998,,0 +"2021-03-05","PR",2056,1747,3,309,,,136,0,,23,305972,0,,,395291,,18,101066,93114,199,0,83339,,,,20103,91833,,0,407038,199,,,,,,0,415664,0 +"2021-03-05","RI",2541,,2,,9020,9020,141,18,,25,674515,1387,,,2935432,,16,128121,,394,0,,,,,152549,,3087981,22869,3087981,22869,,,,,802636,1781,,0 +"2021-03-05","SC",8699,7697,39,1002,20605,20605,664,63,,163,4603549,25299,106319,,4473811,,88,523258,448275,1695,0,27965,110026,,,578013,230793,,0,5126807,26994,134284,893871,,,,0,5051824,26489 +"2021-03-05","SD",1896,,0,,6681,6681,74,17,,16,313260,839,,,,,8,113229,100412,164,0,,,,,104870,109237,,0,698456,1800,,,,,426489,1003,698456,1800 +"2021-03-05","TN",11534,9272,33,2262,18837,18837,939,58,,246,,0,,,6103817,,135,780894,653053,1445,0,,139970,,,752764,755474,,0,6856581,21699,,1420353,,,,0,6856581,21699 +"2021-03-05","TX",44134,,256,,,,5065,0,,1530,,0,,,,,,2678295,2314187,6853,0,156198,210359,,,2622199,2470308,,0,19820052,55875,1025537,2624414,,,,0,19820052,55875 +"2021-03-05","UT",1970,,15,,14841,14841,238,58,2339,85,1553533,3773,,,2549818,820,,373868,,1160,0,,59774,,57308,345264,357312,,0,2895082,8713,,989804,,367204,1869438,4125,2895082,8713 +"2021-03-05","VA",9428,8049,71,1379,24514,24514,1222,100,,254,,0,,,,,150,583060,458696,1652,0,28595,124169,,,560226,,5996828,24556,5996828,24556,223275,1434691,,,,0,,0 +"2021-03-05","VI",25,25,0,,,,,0,,,46167,160,,,,,,2714,,10,0,,,,,,2559,,0,48881,170,,,,,48961,137,,0 +"2021-03-05","VT",207,,0,,,,26,0,,4,318720,634,,,,,,15819,15376,133,0,,,,,,13145,,0,1107296,12441,,,,,334096,765,1107296,12441 +"2021-03-05","WA",5032,,20,,19500,19500,413,34,,108,,0,,,5020273,,57,343090,323839,854,0,,,,,323771,,5344402,24021,5344402,24021,,,,,,0,,0 +"2021-03-05","WI",7094,6477,12,617,26387,26387,260,57,2268,77,2642182,3034,,,,,,620663,566158,721,0,,,,,,552311,7037081,28542,7037081,28542,,,,,3208340,3384,,0 +"2021-03-05","WV",2318,1971,9,347,,,200,0,,55,,0,,,,,28,132964,106259,287,0,,,,,,124502,,0,2218488,10812,32864,,,,,0,2218488,10812 +"2021-03-05","WY",682,,0,,1391,1391,21,2,,,182264,307,,,602513,,,54764,46397,79,0,,,,,38993,53550,,0,649293,3114,,,,,228661,376,649293,3114 +"2021-03-04","AK",303,,0,,1290,1290,32,5,,,,0,,,1653763,,2,56745,,140,0,,,,,68549,,,0,1724484,13466,,,,,,0,1724484,13466 +"2021-03-04","AL",10094,7920,65,2174,45807,45807,544,84,2666,,1920535,4990,,,,1513,,498076,390672,922,0,,,,,,295690,,0,2311207,5890,,,118631,,2311207,5890,,0 +"2021-03-04","AR",5273,4283,12,990,14876,14876,397,50,,165,2464286,8977,,,2464286,1525,91,323756,254943,403,0,,,,81463,,314207,,0,2719229,9283,,,,474331,,0,2719229,9283 +"2021-03-04","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-03-04","AZ",16185,14264,96,1921,57747,57747,1072,50,,343,3032112,9402,,,,,165,821108,765504,1154,0,,,,,,,,0,7775843,36482,,,441041,,3797616,10375,7775843,36482 +"2021-03-04","CA",53048,,273,,,,4967,0,,1327,,0,,,,,,3488467,3488467,3504,0,,,,,,,,0,49147685,119637,,,,,,0,49147685,119637 +"2021-03-04","CO",5974,5238,4,736,23791,23791,355,56,,,2188741,5603,364091,,,,,433021,408954,1351,0,61329,,,,,,6310233,36564,6310233,36564,428261,,,,2597695,6832,,0 +"2021-03-04","CT",7693,6320,15,1373,12257,12257,433,0,,,,0,,,6147613,,,284500,264992,878,0,,22088,,,322440,,,0,6478498,42863,,393486,,,,0,6478498,42863 +"2021-03-04","DC",1024,,1,,,,170,0,,49,,0,,,,,18,41014,,196,0,,,,,,29287,1241816,7833,1241816,7833,,,,,438475,1619,,0 +"2021-03-04","DE",1444,1308,4,136,,,130,0,,18,541771,807,,,,,,87643,82971,218,0,,,,,91186,,1413640,3724,1413640,3724,,,,,629414,1025,,0 +"2021-03-04","FL",31955,,126,,81600,81600,3566,322,,,9269680,26450,847365,803582,16719252,,,1894722,1538139,5997,0,176911,,166506,,2482227,,22079838,104245,22079838,104245,1024780,,970437,,11164402,32447,19293295,74448 +"2021-03-04","GA",17750,15462,125,2288,56512,56512,2191,143,9221,,,0,,,,,,1017428,824804,2886,0,76680,166192,,,799666,,,0,7279616,28189,479300,1451169,,,,0,7279616,28189 +"2021-03-04","GU",131,,0,,,,5,0,,1,112349,424,,,,,1,7747,7538,2,0,24,248,,,,7590,,0,120096,426,357,9262,,,,0,119887,426 +"2021-03-04","HI",441,441,0,,2225,2225,28,-1,,5,,0,,,,,3,28466,27699,59,0,,,,,27595,,1131093,6227,1131093,6227,,,,,,0,,0 +"2021-03-04","IA",5536,,35,,,,184,0,,39,1040055,2052,,93776,2414548,,11,281391,281391,400,0,,60354,19240,56878,305285,318560,,0,1321446,2452,,1372820,113067,245588,1323845,2461,2734777,9441 +"2021-03-04","ID",1876,1649,5,227,7144,7144,139,13,1241,32,503691,1096,,,,,,172288,139667,452,0,,,,,,95222,,0,643358,1441,,123809,,,643358,1441,1096824,3953 +"2021-03-04","IL",22902,20668,49,2234,,,1200,0,,260,,0,,,,,128,1193260,,1740,0,,,,,,,,0,18389512,73990,,,,,,0,18389512,73990 +"2021-03-04","IN",12663,12231,30,432,43044,43044,692,89,7567,131,2468877,4795,,,,,63,664446,,935,0,,,,,757099,,,0,8133596,40539,,,,,3133323,5730,8133596,40539 +"2021-03-04","KS",4816,,0,,9355,9355,203,0,2541,59,969651,0,,,,411,23,295109,,0,0,,,,,,,,0,1264760,0,,594470,,,1264760,0,2504238,0 +"2021-03-04","KY",4732,4292,28,440,19364,19364,645,60,4020,172,,0,,,,,91,408440,312930,1067,0,9815,37408,,,251183,47992,,0,3954639,14273,111691,501372,,,,0,3954639,14273 +"2021-03-04","LA",9686,8986,18,700,,,554,0,,,5222458,24034,,,,,74,432527,371630,756,0,,,,,,415954,,0,5654985,24790,,463554,,,,0,5594088,24564 +"2021-03-04","MA",16296,15967,44,329,19713,19713,741,0,,168,4380031,8554,,,,,100,586310,554630,1567,0,,,15425,,662972,508745,,0,16522351,102362,,,156185,571445,4934661,9964,16522351,102362 +"2021-03-04","MD",7922,7740,3,182,35304,35304,856,81,,216,3018120,5941,,169779,,,,384765,384765,809,0,,,28360,,469489,9691,,0,7982350,33723,,,198139,,3402885,6750,7982350,33723 +"2021-03-04","ME",705,682,0,23,1549,1549,69,4,,23,,0,14201,,,,8,45227,35507,136,0,861,10511,,,41114,12827,,0,1633308,11093,15074,208014,,,,0,1633308,11093 +"2021-03-04","MI",16589,15600,39,989,,,890,0,,229,,0,,,9789502,,102,652589,593279,1827,0,,,,,749121,541258,,0,10538623,46486,532658,,,,,0,10538623,46486 +"2021-03-04","MN",6521,6248,14,273,25896,25896,229,33,5344,59,3035998,14444,,,,,,487374,463301,940,0,,,,,,473728,7023826,62827,7023826,62827,,441373,,,3499299,15254,,0 +"2021-03-04","MO",8150,,2,,,,999,0,,213,1868601,3588,126213,,3985463,,136,479536,479536,467,0,24488,82909,,,529491,,,0,4524474,16298,150900,878145,134839,359455,2348137,4055,4524474,16298 +"2021-03-04","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,144,144,0,0,,,,,,29,,0,17573,0,,,,,17542,0,26131,0 +"2021-03-04","MS",6764,4717,21,2047,9162,9162,448,0,,101,1459374,0,,,,,62,296154,183586,479,0,,,,,,278162,,0,1755528,479,81986,748339,,,,0,1642348,0 +"2021-03-04","MT",1375,,2,,4608,4608,73,8,,14,,0,,,,,7,100531,95413,180,0,,,,,,97499,,0,1091522,4974,,,,,,0,1091522,4974 +"2021-03-04","NC",11399,10083,36,1316,,,1290,0,,326,,0,,,,,,868056,756509,2502,0,,,,,,,,0,9605697,44050,,790416,,,,0,9605697,44050 +"2021-03-04","ND",1478,,0,,3875,3875,22,4,567,3,305598,94,11953,,,,,100184,94807,117,0,1442,,,,,98071,1419620,3575,1419620,3575,13395,152080,,,405782,211,1528837,4808 +"2021-03-04","NE",2092,,1,,6157,6157,151,10,,,768130,1349,,,2166160,,,201973,,365,0,,,,,234838,156048,,0,2403686,11285,,,,,970639,1714,2403686,11285 +"2021-03-04","NH",1178,,3,,1127,1127,92,4,348,,577245,1620,,,,,,76178,53581,188,0,,,,,,72809,,0,1474441,7052,39421,198915,37805,,630826,1781,1474441,7052 +"2021-03-04","NJ",23491,21094,42,2397,64137,64137,1900,87,,376,10096351,0,,,,,214,802669,712585,3193,0,,,,,,,,0,10899020,3193,,,,,,0,10806397,0 +"2021-03-04","NM",3769,,16,,13215,13215,177,25,,,,0,,,,,,186156,,258,0,,,,,,151708,,0,2738734,18352,,,,,,0,2738734,18352 +"2021-03-04","NV",5005,,18,,,,407,0,,97,1125254,2431,,,,,47,295069,295069,385,0,,,,,,,2746308,8243,2746308,8243,,,,,1420323,2816,,0 +"2021-03-04","NY",38796,,61,,89995,89995,5177,0,,1043,,0,,,,,712,1657777,,7593,0,,,,,,,38897265,270089,38897265,270089,,,,,,0,,0 +"2021-03-04","OH",17189,14752,0,2594,50695,50695,1009,82,7181,270,,0,,,,,196,974480,833772,1875,0,,85756,,,861702,919296,,0,10144547,43325,,1751798,,,,0,10144547,43325 +"2021-03-04","OK",4534,,0,,24103,24103,404,39,,118,3126761,10458,,,3126761,,,426641,,895,0,21760,,,,388328,409728,,0,3553402,11353,148204,,,,,0,3527683,11432 +"2021-03-04","OR",2252,,27,,8682,8682,165,29,,37,,0,,,3562140,,12,156287,,250,0,,,,,225298,,,0,3787438,27038,,,,,,0,3787438,27038 +"2021-03-04","PA",24219,,50,,,,1628,0,,350,3915271,8736,,,,,177,941439,808788,3028,0,,,,,,856709,10569767,55306,10569767,55306,,,,,4724059,10836,,0 +"2021-03-04","PR",2053,1745,5,308,,,171,0,,23,305972,0,,,395291,,19,100867,92939,102,0,82809,,,,20103,91530,,0,406839,102,,,,,,0,415664,0 +"2021-03-04","RI",2539,,5,,9002,9002,148,20,,23,673128,1586,,,2913009,,16,127727,,442,0,,,,,152103,,3065112,23431,3065112,23431,,,,,800855,2028,,0 +"2021-03-04","SC",8660,7660,40,1000,20542,20542,734,41,,180,4578250,20102,106051,,4448820,,91,521563,447085,1567,0,27765,109525,,,576515,230793,,0,5099813,21669,133816,885397,,,,0,5025335,21018 +"2021-03-04","SD",1896,,3,,6664,6664,87,10,,17,312421,909,,,,,10,113065,100284,232,0,,,,,105443,109113,,0,696656,1773,,,,,425486,1141,696656,1773 +"2021-03-04","TN",11501,9248,42,2253,18779,18779,970,37,,258,,0,,,6083248,,127,779449,652083,1514,0,,139528,,,751634,754465,,0,6834882,17761,,1408619,,,,0,6834882,17761 +"2021-03-04","TX",43878,,315,,,,5263,0,,1599,,0,,,,,,2671442,2309124,8028,0,155146,208427,,,2618057,2458818,,0,19764177,56522,1022798,2606279,,,,0,19764177,56522 +"2021-03-04","UT",1955,,0,,14783,14783,247,0,2331,92,1549760,4202,,,2541524,818,,372708,,0,0,,59586,,57124,344845,355033,,0,2886369,10193,,981583,,364728,1865313,4636,2886369,10193 +"2021-03-04","VA",9357,8018,31,1339,24414,24414,1352,60,,284,,0,,,,,184,581408,457348,1300,0,28396,123686,,,558837,,5972272,25300,5972272,25300,222742,1421319,,,,0,,0 +"2021-03-04","VI",25,25,0,,,,,0,,,46007,166,,,,,,2704,,9,0,,,,,,2547,,0,48711,175,,,,,48824,181,,0 +"2021-03-04","VT",207,,0,,,,27,0,,5,318086,722,,,,,,15686,15245,199,0,,,,,,12990,,0,1094855,11657,,,,,333331,920,1094855,11657 +"2021-03-04","WA",5012,,24,,19466,19466,461,33,,121,,0,,,4996968,,61,342236,323123,795,0,,,,,323057,,5320381,18873,5320381,18873,,,,,,0,,0 +"2021-03-04","WI",7082,6470,13,612,26330,26330,262,51,2266,67,2639148,4149,,,,,,619942,565808,855,0,,,,,,551885,7008539,37986,7008539,37986,,,,,3204956,4826,,0 +"2021-03-04","WV",2309,1962,0,347,,,193,0,,57,,0,,,,,22,132677,106040,261,0,,,,,,124050,,0,2207676,9422,32758,,,,,0,2207676,9422 +"2021-03-04","WY",682,,0,,1389,1389,23,1,,,181957,276,,,599452,,,54685,46328,69,0,,,,,38946,53481,,0,646179,2703,,,,,228285,336,646179,2703 +"2021-03-03","AK",303,,1,,1285,1285,26,-1,,,,0,,,1640525,,2,56605,,177,0,,,,,68343,,,0,1711018,6358,,,,,,0,1711018,6358 +"2021-03-03","AL",10029,7872,38,2157,45723,45723,559,24,2662,,1915545,7243,,,,1510,,497154,389772,2733,0,,,,,,295690,,0,2305317,9595,,,118154,,2305317,9595,,0 +"2021-03-03","AR",5261,4272,7,989,14826,14826,397,31,,165,2455309,7267,,,2455309,1521,91,323353,254637,404,0,,,,81353,,313799,,0,2709946,7551,,,,469256,,0,2709946,7551 +"2021-03-03","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-03-03","AZ",16089,14176,29,1913,57697,57697,1165,106,,381,3022710,15039,,,,,177,819954,764531,1284,0,,,,,,,,0,7739361,37881,,,440209,,3787241,16154,7739361,37881 +"2021-03-03","CA",52775,,278,,,,5110,0,,1403,,0,,,,,,3484963,3484963,3352,0,,,,,,,,0,49028048,130858,,,,,,0,49028048,130858 +"2021-03-03","CO",5970,5235,11,735,23735,23735,389,142,,,2183138,4583,361719,,,,,431670,407725,1055,0,60537,,,,,,6273669,29808,6273669,29808,425420,,,,2590863,5473,,0 +"2021-03-03","CT",7678,6306,20,1372,12257,12257,451,0,,,,0,,,6105720,,,283622,264198,494,0,,21962,,,321537,,,0,6435635,17168,,389220,,,,0,6435635,17168 +"2021-03-03","DC",1023,,4,,,,177,0,,47,,0,,,,,23,40818,,51,0,,,,,,29213,1233983,139,1233983,139,,,,,436856,80,,0 +"2021-03-03","DE",1440,1304,14,136,,,135,0,,17,540964,1073,,,,,,87425,82777,232,0,,,,,91050,,1409916,4613,1409916,4613,,,,,628389,1305,,0 +"2021-03-03","FL",31829,,133,,81278,81278,3596,306,,,9243230,17249,847365,803582,16653274,,,1888725,1534186,5860,0,176911,,166506,,2474106,,21975593,73990,21975593,73990,1024780,,970437,,11131955,23109,19218847,51529 +"2021-03-03","GA",17625,15349,145,2276,56369,56369,2299,118,9186,,,0,,,,,,1014542,823008,2735,0,76149,165060,,,798161,,,0,7251427,16983,478229,1437822,,,,0,7251427,16983 +"2021-03-03","GU",131,,0,,,,4,0,,1,111925,378,,,,,1,7745,7536,3,0,24,248,,,,7583,,0,119670,381,356,9234,,,,0,119461,381 +"2021-03-03","HI",441,441,2,,2226,2226,26,0,,7,,0,,,,,3,28407,27640,17,0,,,,,27528,,1124866,4206,1124866,4206,,,,,,0,,0 +"2021-03-03","IA",5501,,3,,,,191,0,,40,1038003,1896,,93681,2405624,,11,280991,280991,482,0,,60142,18996,56695,304861,317731,,0,1318994,2378,,1365388,112728,244598,1321384,2382,2725336,8811 +"2021-03-03","ID",1871,1645,4,226,7131,7131,121,20,1239,32,502595,1239,,,,,,171836,139322,374,0,,,,,,94936,,0,641917,1505,,123809,,,641917,1505,1092871,3903 +"2021-03-03","IL",22853,20626,50,2227,,,1260,0,,275,,0,,,,,138,1191520,,2104,0,,,,,,,,0,18315522,80854,,,,,,0,18315522,80854 +"2021-03-03","IN",12633,12200,10,433,42955,42955,731,93,7555,131,2464082,3803,,,,,65,663511,,761,0,,,,,756009,,,0,8093057,36945,,,,,3127593,4564,8093057,36945 +"2021-03-03","KS",4816,,73,,9355,9355,203,65,2541,59,969651,4848,,,,411,23,295109,,807,0,,,,,,,,0,1264760,5655,,594470,,,1264760,5655,2504238,19057 +"2021-03-03","KY",4704,4267,33,437,19304,19304,680,70,4008,175,,0,,,,,79,407373,312179,1172,0,9793,37274,,,250725,47927,,0,3940366,18213,111611,497009,,,,0,3940366,18213 +"2021-03-03","LA",9668,8973,21,695,,,588,0,,,5198424,20999,,,,,78,431771,371100,500,0,,,,,,415954,,0,5630195,21499,,459742,,,,0,5569524,21302 +"2021-03-03","MA",16252,15925,70,327,19713,19713,755,269,,173,4371477,8511,,,,,109,584743,553220,1899,0,,,15162,,661370,494740,,0,16419989,102052,,,154697,568678,4924697,10064,16419989,102052 +"2021-03-03","MD",7919,7737,14,182,35223,35223,863,71,,228,3012179,5489,,169779,,,,383956,383956,786,0,,,28360,,468532,9685,,0,7948627,31296,,,198139,,3396135,6275,7948627,31296 +"2021-03-03","ME",705,682,2,23,1545,1545,67,9,,24,,0,14186,,,,8,45091,35411,147,0,855,10420,,,40984,12820,,0,1622215,13065,15053,205648,,,,0,1622215,13065 +"2021-03-03","MI",16550,15563,6,987,,,882,0,,234,,0,,,9744673,,100,650762,591753,1705,0,,,,,747464,541258,,0,10492137,36453,530799,,,,,0,10492137,36453 +"2021-03-03","MN",6507,6235,17,272,25863,25863,243,37,5340,57,3021554,4521,,,,,,486434,462491,779,0,,,,,,473252,6960999,17007,6960999,17007,,435424,,,3484045,5154,,0 +"2021-03-03","MO",8148,,216,,,,989,0,,213,1865013,2872,125869,,3969719,,146,479069,479069,387,0,24339,82577,,,528968,,,0,4508176,10271,150407,867554,134485,356212,2344082,3259,4508176,10271 +"2021-03-03","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,144,144,1,0,,,,,,29,,0,17573,1,,,,,17542,0,26131,0 +"2021-03-03","MS",6743,4705,19,2038,9162,9162,469,0,,120,1459374,0,,,,,64,295675,183292,380,0,,,,,,278162,,0,1755049,380,81986,748339,,,,0,1642348,0 +"2021-03-03","MT",1373,,1,,4600,4600,67,9,,13,,0,,,,,7,100351,95256,193,0,,,,,,97327,,0,1086548,4986,,,,,,0,1086548,4986 +"2021-03-03","NC",11363,10050,75,1313,,,1303,0,,332,,0,,,,,,865554,754610,2145,0,,,,,,,,0,9561647,19976,,779652,,,,0,9561647,19976 +"2021-03-03","ND",1478,,1,,3871,3871,20,-3,567,3,305504,74,11953,,,,,100067,94735,110,0,1442,,,,,98014,1416045,2904,1416045,2904,13395,149645,,,405571,184,1524029,4369 +"2021-03-03","NE",2091,,7,,6147,6147,150,7,,,766781,1105,,,2155329,,,201608,,262,0,,,,,234408,155933,,0,2392401,10150,,,,,968925,1374,2392401,10150 +"2021-03-03","NH",1175,,5,,1123,1123,89,4,347,,575625,-447,,,,,,75990,53420,187,0,,,,,,72600,,0,1467389,1914,39358,198053,37750,,629045,-320,1467389,1914 +"2021-03-03","NJ",23449,21052,128,2397,64050,64050,1921,133,,403,10096351,112825,,,,,243,799476,710046,3691,0,,,,,,,,0,10895827,116516,,,,,,0,10806397,115772 +"2021-03-03","NM",3753,,13,,13190,13190,195,42,,,,0,,,,,,185898,,356,0,,,,,,150168,,0,2720382,10231,,,,,,0,2720382,10231 +"2021-03-03","NV",4987,,20,,,,440,0,,100,1122823,2581,,,,,53,294684,294684,395,0,,,,,,,2738065,8438,2738065,8438,,,,,1417507,2976,,0 +"2021-03-03","NY",38735,,75,,89995,89995,5323,0,,1047,,0,,,,,735,1650184,,7704,0,,,,,,,38627176,218069,38627176,218069,,,,,,0,,0 +"2021-03-03","OH",17189,14752,0,2594,50613,50613,1081,110,7174,279,,0,,,,,195,972605,832502,2022,0,,85336,,,860507,916592,,0,10101222,16741,,1734699,,,,0,10101222,16741 +"2021-03-03","OK",4534,,0,,24064,24064,427,65,,135,3116303,16023,,,3116303,,,425746,,747,0,21760,,,,387913,408963,,0,3542049,16770,148204,,,,,0,3516251,16570 +"2021-03-03","OR",2225,,13,,8653,8653,184,32,,33,,0,,,3535703,,11,156037,,250,0,,,,,224697,,,0,3760400,11956,,,,,,0,3760400,11956 +"2021-03-03","PA",24169,,69,,,,1648,0,,357,3906535,8368,,,,,186,938411,806688,2577,0,,,,,,844569,10514461,38138,10514461,38138,,,,,4713223,10204,,0 +"2021-03-03","PR",2048,1741,8,307,,,169,0,,33,305972,0,,,395291,,25,100765,92856,30,0,82667,,,,20103,91338,,0,406737,30,,,,,,0,415664,0 +"2021-03-03","RI",2534,,9,,8982,8982,147,16,,23,671542,1258,,,2890061,,14,127285,,436,0,,,,,151620,,3041681,19375,3041681,19375,,,,,798827,1694,,0 +"2021-03-03","SC",8620,7626,44,994,20501,20501,706,73,,190,4558148,8550,105881,,4428962,,86,519996,446169,1173,0,27609,108884,,,575355,230793,,0,5078144,9723,133490,877322,,,,0,5004317,9196 +"2021-03-03","SD",1893,,5,,6654,6654,97,14,,16,311512,701,,,,,8,112833,100146,181,0,,,,,105291,108947,,0,694883,2025,,,,,424345,882,694883,2025 +"2021-03-03","TN",11459,9215,23,2244,18742,18742,1033,63,,259,,0,,,6066316,,140,777935,651124,1598,0,,138810,,,750805,752966,,0,6817121,19646,,1397191,,,,0,6817121,19646 +"2021-03-03","TX",43563,,297,,,,5508,0,,1713,,0,,,,,,2663414,2304081,7822,0,154259,206875,,,2613982,2450229,,0,19707655,64597,1020452,2564354,,,,0,19707655,64597 +"2021-03-03","UT",1955,,6,,14783,14783,247,30,2331,92,1545558,4413,,,2531859,818,,372708,,729,0,,59406,,56948,344317,355033,,0,2876176,10703,,973413,,362078,1860677,4845,2876176,10703 +"2021-03-03","VA",9326,7993,383,1333,24354,24354,1352,96,,284,,0,,,,,184,580108,456462,1549,0,28222,123249,,,557574,,5946972,18293,5946972,18293,222307,1410716,,,,0,,0 +"2021-03-03","VI",25,25,0,,,,,0,,,45841,616,,,,,,2695,,49,0,,,,,,2539,,0,48536,665,,,,,48643,662,,0 +"2021-03-03","VT",207,,1,,,,24,0,,5,317364,359,,,,,,15487,15047,115,0,,,,,,12842,,0,1083198,4358,,,,,332411,474,1083198,4358 +"2021-03-03","WA",4988,,19,,19433,19433,467,61,,131,,0,,,4978720,,64,341441,322487,733,0,,,,,322430,,5301508,21178,5301508,21178,,,,,,0,,0 +"2021-03-03","WI",7069,6458,19,611,26279,26279,267,57,2264,69,2634999,3287,,,,,,619087,565131,780,0,,,,,,551329,6970553,31959,6970553,31959,,,,,3200130,3826,,0 +"2021-03-03","WV",2309,1962,8,347,,,197,0,,60,,0,,,,,25,132416,105833,232,0,,,,,,123656,,0,2198254,8253,32689,,,,,0,2198254,8253 +"2021-03-03","WY",682,,0,,1388,1388,24,3,,,181681,278,,,596799,,,54616,46268,89,0,,,,,38905,53375,,0,643476,2096,,,,,227949,356,643476,2096 +"2021-03-02","AK",302,,2,,1286,1286,26,7,,,,0,,,1634388,,6,56428,,89,0,,,,,68132,,,0,1704660,6629,,,,,,0,1704660,6629 +"2021-03-02","AL",9991,7840,60,2151,45699,45699,631,51,2659,,1908302,3161,,,,1509,,494421,387420,652,0,,,,,,285130,,0,2295722,3648,,,117904,,2295722,3648,,0 +"2021-03-02","AR",5254,4265,4,989,14795,14795,416,32,,160,2448042,3673,,,2448042,1519,80,322949,254353,440,0,,,,81207,,313426,,0,2702395,3898,,,,467054,,0,2702395,3898 +"2021-03-02","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-03-02","AZ",16060,14158,81,1902,57591,57591,1202,2,,385,3007671,5459,,,,,203,818670,763416,849,0,,,,,,,,0,7701480,18991,,,439893,,3771087,6223,7701480,18991 +"2021-03-02","CA",52497,,303,,,,5302,0,,1452,,0,,,,,,3481611,3481611,2533,0,,,,,,,,0,48897190,184514,,,,,,0,48897190,184514 +"2021-03-02","CO",5959,5223,7,736,23593,23593,395,43,,,2178555,3053,359976,,,,,430615,406835,776,0,60044,,,,,,6243861,14006,6243861,14006,422256,,,,2585390,3669,,0 +"2021-03-02","CT",7658,6287,7,1371,12257,12257,413,0,,,,0,,,6089025,,,283128,263876,502,0,,21744,,,321160,,,0,6418467,15041,,384222,,,,0,6418467,15041 +"2021-03-02","DC",1019,,0,,,,177,0,,47,,0,,,,,29,40767,,83,0,,,,,,29111,1233844,2251,1233844,2251,,,,,436776,533,,0 +"2021-03-02","DE",1426,1290,4,136,,,151,0,,18,539891,340,,,,,,87193,82571,113,0,,,,,90814,,1405303,4849,1405303,4849,,,,,627084,453,,0 +"2021-03-02","FL",31696,,140,,80972,80972,3674,313,,,9225981,33192,847365,803582,16607639,,,1882865,1529740,7047,0,176911,,166506,,2468530,,21901603,116917,21901603,116917,1024780,,970437,,11108846,40239,19167318,89285 +"2021-03-02","GA",17480,15209,104,2271,56251,56251,2348,162,9158,,,0,,,,,,1011807,821482,3147,0,75800,163820,,,797157,,,0,7234444,19275,477580,1422062,,,,0,7234444,19275 +"2021-03-02","GU",131,,0,,,,4,0,,2,111547,1680,,,,,1,7742,7533,5,0,24,248,,,,7580,,0,119289,1685,356,9204,,,,0,119080,1688 +"2021-03-02","HI",439,439,0,,2226,2226,31,12,,6,,0,,,,,3,28390,27623,35,0,,,,,27514,,1120660,3503,1120660,3503,,,,,,0,,0 +"2021-03-02","IA",5498,,26,,,,209,0,,39,1036107,988,,93450,2397458,,11,280509,280509,230,0,,60009,18760,56553,304305,316185,,0,1316616,1218,,1356153,112261,243583,1319002,1225,2716525,5341 +"2021-03-02","ID",1867,1641,7,226,7111,7111,121,35,1234,32,501356,1260,,,,,,171462,139056,322,0,,,,,,94707,,0,640412,1493,,123809,,,640412,1493,1088968,5584 +"2021-03-02","IL",22803,20583,44,2220,,,1231,0,,281,,0,,,,,148,1189416,,1577,0,,,,,,,,0,18234668,56181,,,,,,0,18234668,56181 +"2021-03-02","IN",12623,12192,28,431,42862,42862,765,47,7535,123,2460279,2297,,,,,64,662750,,537,0,,,,,755102,,,0,8056112,20386,,,,,3123029,2834,8056112,20386 +"2021-03-02","KS",4743,,0,,9290,9290,165,0,2521,43,964803,0,,,,411,16,294302,,0,0,,,,,,,,0,1259105,0,,586346,,,1259105,0,2485181,0 +"2021-03-02","KY",4671,4241,19,430,19234,19234,684,91,3993,178,,0,,,,,82,406201,311489,1075,0,9705,36973,,,250331,47787,,0,3922153,3011,111402,487694,,,,0,3922153,3011 +"2021-03-02","LA",9647,8957,19,690,,,629,0,,,5177425,22425,,,,,89,431271,370797,767,0,,,,,,408463,,0,5608696,23192,,456777,,,,0,5548222,22975 +"2021-03-02","MA",16182,15859,38,323,19444,19444,775,0,,187,4362966,7609,,,,,116,582844,551667,301,0,,,15162,,659584,494740,,0,16317937,56007,,,154697,564788,4914633,7726,16317937,56007 +"2021-03-02","MD",7905,7723,26,182,35152,35152,896,83,,232,3006690,2973,,168551,,,,383170,383170,468,0,,,27357,,467555,9677,,0,7917331,11040,,,195908,,3389860,3441,7917331,11040 +"2021-03-02","ME",703,680,0,23,1536,1536,69,7,,25,,0,14170,,,,8,44944,35311,182,0,844,10379,,,40852,12811,,0,1609150,8707,15026,204110,,,,0,1609150,8707 +"2021-03-02","MI",16544,15558,25,986,,,959,0,,228,,0,,,9709698,,99,649057,590217,1642,0,,,,,745986,541258,,0,10455684,19406,529930,,,,,0,10455684,19406 +"2021-03-02","MN",6490,6219,4,271,25826,25826,243,99,5329,57,3017033,1836,,,,,,485655,461858,425,0,,,,,,472470,6943992,9255,6943992,9255,,432472,,,3478891,2167,,0 +"2021-03-02","MO",7932,,13,,,,1025,0,,213,1862141,2453,125543,,3959906,,141,478682,478682,266,0,24161,82225,,,528521,,,0,4497905,7904,149903,856635,134119,353410,2340823,2719,4497905,7904 +"2021-03-02","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,143,143,0,0,,,,,,29,,0,17572,0,,,,,17542,0,26131,0 +"2021-03-02","MS",6724,4698,43,2026,9162,9162,457,150,,109,1459374,0,,,,,69,295295,183164,301,0,,,,,,278162,,0,1754669,301,81986,748339,,,,0,1642348,0 +"2021-03-02","MT",1372,,15,,4591,4591,83,7,,20,,0,,,,,7,100158,95381,155,0,,,,,,97199,,0,1081562,1891,,,,,,0,1081562,1891 +"2021-03-02","NC",11288,9987,34,1301,,,1353,0,,334,,0,,,,,,863409,753280,1239,0,,,,,,,,0,9541671,16397,,770210,,,,0,9541671,16397 +"2021-03-02","ND",1477,,2,,3874,3874,24,3,566,3,305430,411,11953,,,,,99957,94684,105,0,1442,,,,,97934,1413141,2314,1413141,2314,13395,147350,,,405387,516,1519660,2977 +"2021-03-02","NE",2084,,2,,6140,6140,154,34,,,765676,1216,,,2145644,,,201346,,400,0,,,,,233966,155712,,0,2382251,8520,,,,,967551,1616,2382251,8520 +"2021-03-02","NH",1170,,0,,1119,1119,88,1,346,,576072,150,,,,,,75803,53293,215,0,,,,,,72359,,0,1465475,3896,39347,197267,37741,,629365,239,1465475,3896 +"2021-03-02","NJ",23321,20990,48,2331,63917,63917,1915,140,,395,9983526,115444,,,,,228,795785,707099,3289,0,,,,,,,,0,10779311,118733,,,,,,0,10690625,122979 +"2021-03-02","NM",3740,,11,,13148,13148,199,21,,,,0,,,,,,185542,,245,0,,,,,,148641,,0,2710151,10359,,,,,,0,2710151,10359 +"2021-03-02","NV",4967,,10,,,,459,0,,108,1120242,817,,,,,53,294289,294289,309,0,,,,,,,2729627,3926,2729627,3926,,,,,1414531,1126,,0 +"2021-03-02","NY",38660,,83,,89995,89995,5369,0,,1076,,0,,,,,747,1642480,,5800,0,,,,,,,38409107,128034,38409107,128034,,,,,,0,,0 +"2021-03-02","OH",17189,14752,-157,2594,50503,50503,1131,121,7160,295,,0,,,,,207,970583,831329,1736,0,,84953,,,859698,914893,,0,10084481,27879,,1711925,,,,0,10084481,27879 +"2021-03-02","OK",4534,,56,,23999,23999,447,4,,134,3100280,15451,,,3100280,,,424999,,111,0,21760,,,,387452,407934,,0,3525279,15562,148204,,,,,0,3499681,16231 +"2021-03-02","OR",2212,,4,,8621,8621,158,51,,33,,0,,,3524093,,13,155787,,190,0,,,,,224351,,,0,3748444,184324,,,,,,0,3748444,184324 +"2021-03-02","PA",24100,,74,,,,1670,0,,354,3898167,8325,,,,,190,935834,804852,2564,0,,,,,,851608,10476323,33165,10476323,33165,,,,,4703019,10168,,0 +"2021-03-02","PR",2040,1736,3,304,,,162,0,,23,305972,0,,,395291,,24,100735,92834,151,0,82600,,,,20103,91134,,0,406707,151,,,,,,0,415664,0 +"2021-03-02","RI",2525,,8,,8966,8966,157,19,,25,670284,1152,,,2871163,,17,126849,,261,0,,,,,151143,,3022306,10995,3022306,10995,,,,,797133,1413,,0 +"2021-03-02","SC",8576,7606,14,970,20428,20428,706,22,,190,4549598,14264,105789,,4420658,,86,518823,445523,847,0,27524,108441,,,574463,230793,,0,5068421,15111,133313,869734,,,,0,4995121,14796 +"2021-03-02","SD",1888,,0,,6640,6640,92,8,,13,310811,464,,,,,10,112652,100014,182,0,,,,,105106,108789,,0,692858,537,,,,,423463,646,692858,537 +"2021-03-02","TN",11436,9195,15,2241,18679,18679,991,59,,256,,0,,,6047838,,133,776337,650084,644,0,,138243,,,749637,751776,,0,6797475,7505,,1382459,,,,0,6797475,7505 +"2021-03-02","TX",43266,,271,,,,5644,0,,1728,,0,,,,,,2655592,2297878,7747,0,153487,205481,,,2608239,2441822,,0,19643058,47847,1018098,2543010,,,,0,19643058,47847 +"2021-03-02","UT",1949,,9,,14753,14753,237,29,2324,92,1541145,3142,,,2521663,818,,371979,,487,0,,59080,,56633,343810,353737,,0,2865473,6285,,962849,,358674,1855832,3425,2865473,6285 +"2021-03-02","VA",8943,7674,160,1269,24258,24258,1345,100,,305,,0,,,,,200,578559,455578,1385,0,28135,122592,,,556553,,5928679,12765,5928679,12765,222031,1396985,,,,0,,0 +"2021-03-02","VI",25,,0,,,,,0,,,45225,0,,,,,,2646,,0,0,,,,,,2511,,0,47871,0,,,,,47981,0,,0 +"2021-03-02","VT",206,,1,,,,24,0,,7,317005,247,,,,,,15372,14932,88,0,,,,,,12759,,0,1078840,2581,,,,,331937,332,1078840,2581 +"2021-03-02","WA",4969,,13,,19372,19372,473,53,,125,,0,,,4958153,,61,340708,321881,935,0,,,,,321822,,5280330,45898,5280330,45898,,,,,,0,,0 +"2021-03-02","WI",7050,6440,36,610,26222,26222,275,64,2259,71,2631712,2090,,,,,,618307,564592,607,0,,,,,,550730,6938594,16676,6938594,16676,,,,,3196304,2414,,0 +"2021-03-02","WV",2301,1955,1,346,,,210,0,,61,,0,,,,,28,132184,105593,136,0,,,,,,123191,,0,2190001,8074,32656,,,,,0,2190001,8074 +"2021-03-02","WY",682,,11,,1385,1385,24,1,,,181403,207,,,594768,,,54527,46190,56,0,,,,,38847,53339,,0,641380,786,,,,,227593,250,641380,786 +"2021-03-01","AK",300,,10,,1279,1279,25,2,,,,0,,,1627988,,5,56339,,350,0,,,,,67948,,,0,1698031,18356,,,,,,0,1698031,18356 +"2021-03-01","AL",9931,7789,2,2142,45648,45648,651,220,2651,,1905141,1450,,,,1508,,493769,386933,517,0,,,,,,285130,,0,2292074,1858,,,117746,,2292074,1858,,0 +"2021-03-01","AR",5250,4257,7,993,14763,14763,441,0,,173,2444369,2512,,,2444369,1520,84,322509,254128,94,0,,,,80980,,313002,,0,2698497,2610,,,,464239,,0,2698497,2610 +"2021-03-01","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-03-01","AZ",15979,14100,-1,1879,57589,57589,1241,-10,,382,3002212,5381,,,,,196,817821,762652,1039,0,,,,,,,,0,7682489,19066,,,439644,,3764864,6365,7682489,19066 +"2021-03-01","CA",52194,,215,,,,5409,0,,1518,,0,,,,,,3479078,3479078,3516,0,,,,,,,,0,48712676,243570,,,,,,0,48712676,243570 +"2021-03-01","CO",5952,5218,1,734,23550,23550,427,74,,,2175502,2874,358510,,,,,429839,406219,1536,0,59574,,,,,,6229855,13654,6229855,13654,420020,,,,2581721,4366,,0 +"2021-03-01","CT",7651,6280,29,1371,12257,12257,417,0,,,,0,,,6074561,,,282626,263448,2680,0,,21643,,,320670,,,0,6403426,104149,,381930,,,,0,6403426,104149 +"2021-03-01","DC",1019,,2,,,,168,0,,46,,0,,,,,25,40684,,86,0,,,,,,29019,1231593,3234,1231593,3234,,,,,436243,575,,0 +"2021-03-01","DE",1422,1286,0,136,,,151,0,,23,539551,907,,,,,,87080,82476,281,0,,,,,90549,,1400454,4870,1400454,4870,,,,,626631,1188,,0 +"2021-03-01","FL",31556,,150,,80659,80659,3686,87,,,9192789,7255,847365,803582,16528453,,,1875818,1524995,1664,0,176911,,166506,,2458948,,21784686,22888,21784686,22888,1024780,,970437,,11068607,8919,19078033,22915 +"2021-03-01","GA",17376,15148,81,2228,56089,56089,2348,50,9132,,,0,,,,,,1008660,819730,2139,0,75711,162411,,,795852,,,0,7215169,13195,477400,1406064,,,,0,7215169,13195 +"2021-03-01","GU",131,,0,,,,3,0,,2,109867,0,,,,,1,7737,7528,1,0,24,248,,,,7564,,0,117604,1,352,9111,,,,0,117392,0 +"2021-03-01","HI",439,439,0,,2214,2214,31,0,,3,,0,,,,,3,28355,27588,29,0,,,,,27477,,1117157,4179,1117157,4179,,,,,,0,,0 +"2021-03-01","IA",5472,,1,,,,197,0,,48,1035119,1329,,93389,2392446,,15,280279,280279,240,0,,59842,18571,56368,304008,315443,,0,1315398,1569,,1346025,112011,242163,1317777,1562,2711184,4675 +"2021-03-01","ID",1860,1634,0,226,7076,7076,162,0,1231,35,500096,0,,,,,,171140,138823,0,0,,,,,,94230,,0,638919,0,,123809,,,638919,0,1083384,0 +"2021-03-01","IL",22759,20536,24,2223,,,1288,0,,308,,0,,,,,148,1187839,,1143,0,,,,,,,,0,18178487,42234,,,,,,0,18178487,42234 +"2021-03-01","IN",12595,12162,22,433,42815,42815,763,40,7514,124,2457982,2454,,,,,66,662213,,540,0,,,,,754471,,,0,8035726,14296,,,,,3120195,2994,8035726,14296 +"2021-03-01","KS",4743,,8,,9290,9290,165,41,2521,43,964803,4003,,,,411,16,294302,,639,0,,,,,,,,0,1259105,4642,,586346,,,1259105,4642,2485181,16491 +"2021-03-01","KY",4652,4224,15,428,19143,19143,719,42,3976,180,,0,,,,,82,405126,310885,504,0,9686,36741,,,250151,47592,,0,3919142,14575,111352,484384,,,,0,3919142,14575 +"2021-03-01","LA",9628,8941,20,687,,,629,0,,,5155000,7933,,,,,91,430504,370247,404,0,,,,,,408463,,0,5585504,8337,,453562,,,,0,5525247,8232 +"2021-03-01","MA",16144,15822,26,322,19444,19444,788,0,,184,4355357,6818,,,,,119,582543,551550,1395,0,,,15162,,659307,494740,,0,16261930,53839,,,154697,561797,4906907,8066,16261930,53839 +"2021-03-01","MD",7879,7697,10,182,35069,35069,904,69,,235,3003717,4132,,168551,,,,382702,382702,603,0,,,27357,,466972,9669,,0,7906291,19263,,,195908,,3386419,4735,7906291,19263 +"2021-03-01","ME",703,680,0,23,1529,1529,62,2,,20,,0,14157,,,,8,44762,35230,128,0,845,10272,,,40784,12805,,0,1600443,3345,15014,200605,,,,0,1600443,3345 +"2021-03-01","MI",16519,15534,11,985,,,893,0,,226,,0,,,9691266,,103,647415,589150,1865,0,,,,,745012,541258,,0,10436278,48387,528838,,,,,0,10436278,48387 +"2021-03-01","MN",6486,6215,3,271,25727,25727,230,8,5308,47,3015197,6494,,,,,,485230,461527,636,0,,,,,,471647,6934737,18160,6934737,18160,,431055,,,3476724,7018,,0 +"2021-03-01","MO",7919,,0,,,,1066,0,,212,1859688,2242,125380,,3952312,,125,478416,478416,192,0,24094,81976,,,528222,,,0,4490001,7708,149673,850813,133962,351383,2338104,2434,4490001,7708 +"2021-03-01","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,143,143,0,0,,,,,,29,,0,17572,0,,,,,17542,0,26131,0 +"2021-03-01","MS",6681,4672,0,2009,9012,9012,455,0,,111,1459374,23188,,,,,65,294994,182974,199,0,,,,,,273437,,0,1754368,23387,81986,748339,,,,0,1642348,25168 +"2021-03-01","MT",1357,,0,,4584,4584,68,3,,13,,0,,,,,6,100003,95472,49,0,,,,,,97037,,0,1079671,1683,,,,,,0,1079671,1683 +"2021-03-01","NC",11254,9959,42,1295,,,1319,0,,333,,0,,,,,,862170,752406,3622,0,,,,,,,,0,9525274,25289,,766208,,,,0,9525274,25289 +"2021-03-01","ND",1475,,3,,3871,3871,25,4,565,3,305019,68,11953,,,,,99852,94623,43,0,1442,,,,,97836,1410827,1212,1410827,1212,13395,144401,,,404871,111,1516683,1648 +"2021-03-01","NE",2082,,0,,6106,6106,158,4,,,764460,456,,,2137624,,,200946,,98,0,,,,,233457,155333,,0,2373731,2529,,,,,965935,556,2373731,2529 +"2021-03-01","NH",1170,,0,,1118,1118,90,0,345,,575922,-681,,,,,,75588,53204,164,0,,,,,,72055,,0,1461579,2829,39325,194993,37723,,629126,-563,1461579,2829 +"2021-03-01","NJ",23273,20942,21,2331,63777,63777,1865,64,,387,9868082,0,,,,,226,792496,704362,3140,0,,,,,,,,0,10660578,3140,,,,,,0,10567646,0 +"2021-03-01","NM",3729,,13,,13127,13127,186,19,,,,0,,,,,,185297,,165,0,,,,,,147446,,0,2699792,6331,,,,,,0,2699792,6331 +"2021-03-01","NV",4957,,0,,,,464,0,,105,1119425,2196,,,,,56,293980,293980,226,0,,,,,,,2725701,6482,2725701,6482,,,,,1413405,2422,,0 +"2021-03-01","NY",38577,,80,,89995,89995,5307,0,,1065,,0,,,,,741,1636680,,6235,0,,,,,,,38281073,174158,38281073,174158,,,,,,0,,0 +"2021-03-01","OH",17346,14752,49,2594,50382,50382,1181,103,7148,295,,0,,,,,224,968847,830282,1425,0,,84593,,,858743,911474,,0,10056602,26079,,1700473,,,,0,10056602,26079 +"2021-03-01","OK",4478,,50,,23995,23995,484,10,,150,3084829,0,,,3084829,,,424888,,380,0,21760,,,,386563,407665,,0,3509717,380,148204,,,,,0,3483450,12058 +"2021-03-01","OR",2208,,0,,8570,8570,177,0,,35,,0,,,3361555,,16,155597,,282,0,,,,,202565,,,0,3564120,0,,,,,,0,3564120,0 +"2021-03-01","PA",24026,,5,,,,1715,0,,366,3889842,5256,,,,,203,933270,803009,1628,0,,,,,,849275,10443158,64369,10443158,64369,,,,,4692851,6520,,0 +"2021-03-01","PR",2037,1733,1,304,,,155,0,,23,305972,0,,,395291,,23,100584,92708,287,0,82090,,,,20103,90891,,0,406556,287,,,,,,0,415664,0 +"2021-03-01","RI",2517,,3,,8947,8947,162,47,,28,669132,690,,,2860484,,18,126588,,152,0,,,,,150827,,3011311,5788,3011311,5788,,,,,795720,842,,0 +"2021-03-01","SC",8562,7592,32,970,20406,20406,725,19,,194,4535334,24419,105661,,4406533,,88,517976,444991,1153,0,27409,108193,,,573792,230793,,0,5053310,25572,133070,867036,,,,0,4980325,25203 +"2021-03-01","SD",1888,,0,,6632,6632,92,6,,15,310347,225,,,,,7,112470,99873,43,0,,,,,105054,108664,,0,692321,629,,,,,422817,268,692321,629 +"2021-03-01","TN",11421,9181,10,2240,18620,18620,1009,15,,257,,0,,,6040778,,127,775693,649664,689,0,,137917,,,749192,750755,,0,6789970,9109,,1372301,,,,0,6789970,9109 +"2021-03-01","TX",42995,,59,,,,5611,0,,1747,,0,,,,,,2647845,2292097,3821,0,153078,199506,,,2604373,2429453,,0,19595211,37529,1016619,2481635,,,,0,19595211,37529 +"2021-03-01","UT",1940,,5,,14724,14724,238,29,2309,89,1538003,2400,,,2515715,813,,371492,,257,0,,58884,,56440,343473,352814,,0,2859188,5273,,954594,,356517,1852407,2642,2859188,5273 +"2021-03-01","VA",8783,7530,231,1253,24158,24158,1321,43,,295,,0,,,,,196,577174,454735,1124,0,28067,122040,,,555429,,5915914,13192,5915914,13192,221809,1384143,,,,0,,0 +"2021-03-01","VI",25,,0,,,,,0,,,45225,0,,,,,,2646,,0,0,,,,,,2511,,0,47871,0,,,,,47981,0,,0 +"2021-03-01","VT",205,,1,,,,29,0,,8,316758,880,,,,,,15284,14847,86,0,,,,,,12626,,0,1076259,7960,,,,,331605,965,1076259,7960 +"2021-03-01","WA",4956,,0,,19319,19319,498,0,,135,,0,,,4913062,,58,339773,321079,0,0,,,,,321014,,5234432,0,5234432,0,,,,,,0,,0 +"2021-03-01","WI",7014,6412,0,602,26158,26158,287,31,2256,73,2629622,2826,,,,,,617700,564268,333,0,,,,,,550280,6921918,15040,6921918,15040,,,,,3193890,3134,,0 +"2021-03-01","WV",2300,1955,0,345,,,225,0,,59,,0,,,,,30,132048,105464,193,0,,,,,,122751,,0,2181927,4330,32608,,,,,0,2181927,4330 +"2021-03-01","WY",671,,0,,1384,1384,28,2,,,181196,370,,,594005,,,54471,46147,77,0,,,,,38827,53248,,0,640594,3878,,,,,227343,473,640594,3878 +"2021-02-28","AK",290,,0,,1277,1277,43,0,,,,0,,,1610023,,5,55989,,0,0,,,,,67580,,,0,1679675,0,,,,,,0,1679675,0 +"2021-02-28","AL",9929,7787,-1,2142,45428,45428,657,0,2650,,1903691,2776,,,,1508,,493252,386525,569,0,,,,,,285130,,0,2290216,3265,,,117548,,2290216,3265,,0 +"2021-02-28","AR",5243,4251,-174,992,14763,14763,455,0,,183,2441857,51991,,,2441857,1520,85,322415,254030,3220,0,,,,80979,,312758,,0,2695887,53995,,,,462977,,0,2695887,53995 +"2021-02-28","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-28","AZ",15980,14099,13,1881,57599,57599,1251,91,,402,2996831,9935,,,,,210,816782,761668,1075,0,,,,,,,,0,7663423,40030,,,438754,,3758499,10924,7663423,40030 +"2021-02-28","CA",51979,,158,,,,5674,0,,1585,,0,,,,,,3475562,3475562,4685,0,,,,,,,,0,48469106,249616,,,,,,0,48469106,249616 +"2021-02-28","CO",5951,5217,6,734,23476,23476,404,17,,,2172628,4673,357344,,,,,428303,404727,841,0,59306,,,,,,6216201,25679,6216201,25679,418084,,,,2577355,5467,,0 +"2021-02-28","CT",7622,6254,0,1368,12257,12257,451,0,,,,0,,,5973606,,,279946,261052,0,0,,21235,,,317614,,,0,6299277,0,,371931,,,,0,6299277,0 +"2021-02-28","DC",1017,,7,,,,163,0,,45,,0,,,,,26,40598,,120,0,,,,,,28881,1228359,6796,1228359,6796,,,,,435668,1288,,0 +"2021-02-28","DE",1422,1286,4,136,,,142,0,,22,538644,1037,,,,,,86799,82218,282,0,,,,,90267,,1395584,8220,1395584,8220,,,,,625443,1319,,0 +"2021-02-28","FL",31406,,126,,80572,80572,3679,105,,,9185534,22572,847365,803582,16508139,,,1874154,1523359,5385,0,176911,,166506,,2456389,,21761798,77453,21761798,77453,1024780,,970437,,11059688,27957,19055118,64408 +"2021-02-28","GA",17295,15068,1,2227,56039,56039,2341,76,9126,,,0,,,,,,1006521,818516,2334,0,75407,161352,,,794784,,,0,7201974,19980,476724,1397752,,,,0,7201974,19980 +"2021-02-28","GU",131,,0,,,,4,0,,1,109867,0,,,,,1,7736,7527,1,0,24,248,,,,7564,,0,117603,1,352,9111,,,,0,117392,0 +"2021-02-28","HI",439,439,0,,2214,2214,30,0,,3,,0,,,,,3,28326,27559,56,0,,,,,27437,,1112978,5461,1112978,5461,,,,,,0,,0 +"2021-02-28","IA",5471,,1,,,,196,0,,50,1033790,1527,,93338,2388052,,19,280039,280039,295,0,,59760,18549,56292,303738,315134,,0,1313829,1822,,1343678,111938,241907,1316215,1822,2706509,5093 +"2021-02-28","ID",1860,1634,1,226,7076,7076,162,11,1231,35,500096,865,,,,,,171140,138823,233,0,,,,,,94230,,0,638919,1036,,123809,,,638919,1036,1083384,2676 +"2021-02-28","IL",22735,20516,25,2219,,,1265,0,,303,,0,,,,,150,1186696,,1249,0,,,,,,,,0,18136253,66500,,,,,,0,18136253,66500 +"2021-02-28","IN",12573,12142,17,431,42775,42775,778,39,7508,116,2455528,4296,,,,,67,661673,,731,0,,,,,753811,,,0,8021430,31476,,,,,3117201,5027,8021430,31476 +"2021-02-28","KS",4735,,0,,9249,9249,258,0,2510,63,960800,0,,,,411,29,293663,,0,0,,,,,,,,0,1254463,0,,580453,,,1254463,0,2468690,0 +"2021-02-28","KY",4637,4209,12,428,19101,19101,732,11,3970,187,,0,,,,,118,404622,310481,675,0,9607,36671,,,249554,47544,,0,3904567,0,111128,482091,,,,0,3904567,0 +"2021-02-28","LA",9608,8923,21,685,,,630,0,,,5147067,30981,,,,,91,430100,369948,1508,0,,,,,,408463,,0,5577167,32489,,452263,,,,0,5517015,32027 +"2021-02-28","MA",16118,15796,51,322,19444,19444,760,0,,183,4348539,8459,,,,,124,581148,550302,1468,0,,,15162,,657840,494740,,0,16208091,102571,,,154697,559897,4898841,9887,16208091,102571 +"2021-02-28","MD",7869,7687,13,182,35000,35000,868,73,,240,2999585,6487,,168551,,,,382099,382099,827,0,,,27357,,466224,9667,,0,7887028,38783,,,195908,,3381684,7314,7887028,38783 +"2021-02-28","ME",703,681,1,22,1527,1527,72,2,,24,,0,14120,,,,8,44634,35158,142,0,815,10209,,,40699,12800,,0,1597098,8594,14947,199400,,,,0,1597098,8594 +"2021-02-28","MI",16508,15522,0,986,,,841,0,,195,,0,,,9644816,,93,645550,587581,0,0,,,,,743075,541258,,0,10387891,0,527911,,,,,0,10387891,0 +"2021-02-28","MN",6483,6212,8,271,25719,25719,263,5,5306,60,3008703,9667,,,,,,484594,461003,804,0,,,,,,470819,6916577,24903,6916577,24903,,429880,,,3469706,10325,,0 +"2021-02-28","MO",7919,,-1,,,,1172,0,,229,1857446,2656,125310,,3944835,,136,478224,478224,274,0,24065,81826,,,528004,,,0,4482293,9471,149574,849069,133890,350335,2335670,2930,4482293,9471 +"2021-02-28","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,143,143,0,0,,,,,,29,,0,17572,0,,,,,17542,0,26131,0 +"2021-02-28","MS",6681,4672,12,2009,9012,9012,492,0,,114,1436186,0,,,,,69,294795,182857,704,0,,,,,,273437,,0,1730981,704,80525,728148,,,,0,1617180,0 +"2021-02-28","MT",1357,,1,,4581,4581,68,2,,13,,0,,,,,6,99954,95430,117,0,,,,,,96982,,0,1077988,3551,,,,,,0,1077988,3551 +"2021-02-28","NC",11212,9922,0,1290,,,1414,0,,348,,0,,,,,,858548,749388,0,0,,,,,,,,0,9499985,36576,,759541,,,,0,9499985,36576 +"2021-02-28","ND",1472,,0,,3867,3867,21,1,565,3,304951,141,11953,,,,,99809,94590,29,0,1442,,,,,97759,1409615,529,1409615,529,13395,144077,,,404760,170,1515035,690 +"2021-02-28","NE",2082,,0,,6102,6102,151,3,,,764004,598,,,2135250,,,200848,,167,0,,,,,233302,154909,,0,2371202,5076,,,,,965379,767,2371202,5076 +"2021-02-28","NH",1170,,0,,1118,1118,87,4,345,,576603,157,,,,,,75424,53086,258,0,,,,,,71722,,0,1458750,7065,39290,194085,37687,,629689,363,1458750,7065 +"2021-02-28","NJ",23252,20921,14,2331,63713,63713,1849,49,,393,9868082,0,,,,,229,789356,701725,2389,0,,,,,,,,0,10657438,2389,,,,,,0,10567646,0 +"2021-02-28","NM",3716,,16,,13108,13108,192,11,,,,0,,,,,,185132,,244,0,,,,,,146013,,0,2693461,12078,,,,,,0,2693461,12078 +"2021-02-28","NV",4957,,0,,,,491,0,,115,1117229,1870,,,,,67,293754,293754,266,0,,,,,,,2719219,6710,2719219,6710,,,,,1410983,2136,,0 +"2021-02-28","NY",38497,,90,,89995,89995,5259,0,,1083,,0,,,,,728,1630445,,7580,0,,,,,,,38106915,273720,38106915,273720,,,,,,0,,0 +"2021-02-28","OH",17297,14709,60,2588,50279,50279,1149,82,7134,316,,0,,,,,203,967422,829430,1268,0,,84337,,,857692,909524,,0,10030523,36196,,1696378,,,,0,10030523,36196 +"2021-02-28","OK",4428,,49,,23985,23985,484,76,,150,3084829,0,,,3084829,,,424508,,706,0,21760,,,,386563,407312,,0,3509337,706,148204,,,,,0,3471392,0 +"2021-02-28","OR",2208,,2,,8570,8570,177,0,,35,,0,,,3361555,,16,155315,,437,0,,,,,202565,,,0,3564120,0,,,,,,0,3564120,0 +"2021-02-28","PA",24021,,84,,,,1720,0,,374,3884586,8370,,,,,211,931642,801745,1945,0,,,,,,836727,10378789,0,10378789,0,,,,,4686331,10075,,0 +"2021-02-28","PR",2036,1733,4,303,,,150,0,,25,305972,0,,,395291,,20,100297,92469,253,0,81239,,,,20103,90896,,0,406269,253,,,,,,0,415664,0 +"2021-02-28","RI",2514,,2,,8900,8900,168,0,,34,668442,1637,,,2854878,,19,126436,,343,0,,,,,150645,,3005523,15080,3005523,15080,,,,,794878,1980,,0 +"2021-02-28","SC",8530,7578,32,952,20387,20387,769,47,,203,4510915,25527,105429,,4382363,,97,516823,444207,1751,0,27243,107862,,,572759,230793,,0,5027738,27278,132672,862952,,,,0,4955122,26777 +"2021-02-28","SD",1888,,2,,6626,6626,89,16,,15,310122,388,,,,,9,112427,99836,134,0,,,,,104997,108606,,0,691692,1353,,,,,422549,522,691692,1353 +"2021-02-28","TN",11411,9170,18,2241,18605,18605,1004,19,,255,,0,,,6032229,,134,775004,649166,1117,0,,137689,,,748632,749863,,0,6780861,11423,,1369842,,,,0,6780861,11423 +"2021-02-28","TX",42936,,197,,,,5696,0,,1740,,0,,,,,,2644024,2287135,3815,0,152353,199343,,,2600487,2422369,,0,19557682,68999,1014806,2477824,,,,0,19557682,68999 +"2021-02-28","UT",1935,,6,,14695,14695,230,31,2308,84,1535603,3044,,,2510726,813,,371235,,465,0,,58863,,56419,343189,352303,,0,2853915,6209,,953350,,356026,1849765,3360,2853915,6209 +"2021-02-28","VA",8552,7334,170,1218,24115,24115,1323,24,,295,,0,,,,,180,576050,453932,1736,0,27946,121752,,,554480,,5902722,23722,5902722,23722,221493,1380463,,,,0,,0 +"2021-02-28","VI",25,,0,,,,,0,,,45225,0,,,,,,2646,,0,0,,,,,,2511,,0,47871,0,,,,,47981,0,,0 +"2021-02-28","VT",204,,0,,,,26,0,,8,315878,647,,,,,,15198,14762,100,0,,,,,,12532,,0,1068299,8593,,,,,330640,742,1068299,8593 +"2021-02-28","WA",4956,,0,,19319,19319,498,44,,135,,0,,,4913062,,58,339773,321079,951,0,,,,,321014,,5234432,21008,5234432,21008,,,,,,0,,0 +"2021-02-28","WI",7014,6412,0,602,26127,26127,290,39,2254,73,2626796,3298,,,,,,617367,563960,481,0,,,,,,549668,6906878,20046,6906878,20046,,,,,3190756,3762,,0 +"2021-02-28","WV",2300,1955,3,345,,,239,0,,65,,0,,,,,34,131855,105325,275,0,,,,,,121797,,0,2177597,11017,32546,,,,,0,2177597,11017 +"2021-02-28","WY",671,,0,,1382,1382,25,1,,,180826,0,,,590006,,,54394,46076,44,0,,,,,38734,53132,,0,636716,0,,,,,226870,0,636716,0 +"2021-02-27","AK",290,,0,,1277,1277,43,0,,,,0,,,1610023,,5,55989,,0,0,,,,,67580,,,0,1679675,0,,,,,,0,1679675,0 +"2021-02-27","AL",9930,7787,61,2143,45428,45428,622,0,2650,,1900915,4496,,,,1508,,492683,386036,834,0,,,,,,285130,,0,2286951,5303,,,117249,,2286951,5303,,0 +"2021-02-27","AR",5417,4357,10,1060,14763,14763,475,16,,172,2389866,7238,,,2389866,1520,97,319195,252026,557,0,,,,78818,,309268,,0,2641892,7553,,,,445973,,0,2641892,7553 +"2021-02-27","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-27","AZ",15967,14091,70,1876,57508,57508,1317,48,,415,2986896,6455,,,,,220,815707,760679,1179,0,,,,,,,,0,7623393,26841,,,438011,,3747575,7508,7623393,26841 +"2021-02-27","CA",51821,,439,,,,5897,0,,1651,,0,,,,,,3470877,3470877,5151,0,,,,,,,,0,48219490,223914,,,,,,0,48219490,223914 +"2021-02-27","CO",5945,5211,5,734,23459,23459,393,21,,,2167955,5022,354803,,,,,427462,403933,1264,0,58749,,,,,,6190522,31219,6190522,31219,416650,,,,2571888,6096,,0 +"2021-02-27","CT",7622,6254,0,1368,12257,12257,451,0,,,,0,,,5973606,,,279946,261052,0,0,,21235,,,317614,,,0,6299277,0,,371931,,,,0,6299277,0 +"2021-02-27","DC",1010,,1,,,,171,0,,49,,0,,,,,26,40478,,194,0,,,,,,28842,1221563,6232,1221563,6232,,,,,434380,1174,,0 +"2021-02-27","DE",1418,1283,0,135,,,159,0,,22,537607,1425,,,,,,86517,81952,419,0,,,,,89959,,1387364,9562,1387364,9562,,,,,624124,1844,,0 +"2021-02-27","FL",31280,,118,,80467,80467,3728,229,,,9162962,25314,847365,803582,16451917,,,1868769,1519444,5316,0,176911,,166506,,2448448,,21684345,90722,21684345,90722,1024780,,970437,,11031731,30630,18990710,68213 +"2021-02-27","GA",17294,15067,75,2227,55963,55963,2405,185,9115,,,0,,,,,,1004187,816973,3365,0,74913,160451,,,793286,,,0,7181994,28470,475609,1390595,,,,0,7181994,28470 +"2021-02-27","GU",131,,1,,,,4,0,,1,109867,0,,,,,1,7735,7526,1,0,24,248,,,,7564,,0,117602,1,352,9111,,,,0,117392,0 +"2021-02-27","HI",439,439,2,,2214,2214,30,0,,3,,0,,,,,3,28270,27503,104,0,,,,,27366,,1107517,22034,1107517,22034,,,,,,0,,0 +"2021-02-27","IA",5470,,7,,,,181,0,,43,1032263,1273,,93328,2383385,,18,279744,279744,315,0,,59727,18534,56264,303407,314750,,0,1312007,1588,,1342398,111913,241787,1314393,1586,2701416,5674 +"2021-02-27","ID",1859,1633,9,226,7065,7065,162,8,1229,35,499231,1131,,,,,,170907,138652,312,0,,,,,,93975,,0,637883,1350,,123809,,,637883,1350,1080708,5452 +"2021-02-27","IL",22710,20494,35,2216,,,1353,0,,312,,0,,,,,160,1185447,,1780,0,,,,,,,,0,18069753,81668,,,,,,0,18069753,81668 +"2021-02-27","IN",12556,12125,25,431,42736,42736,800,28,7497,138,2451232,4877,,,,,73,660942,,871,0,,,,,752905,,,0,7989954,47002,,,,,3112174,5748,7989954,47002 +"2021-02-27","KS",4735,,0,,9249,9249,258,0,2510,63,960800,0,,,,411,29,293663,,0,0,,,,,,,,0,1254463,0,,580453,,,1254463,0,2468690,0 +"2021-02-27","KY",4625,4199,25,426,19090,19090,765,109,3968,209,,0,,,,,87,403947,310029,1021,0,9607,36671,,,249554,47525,,0,3904567,12866,111128,482091,,,,0,3904567,12866 +"2021-02-27","LA",9587,8906,0,681,,,651,0,,,5116086,0,,,,,95,428592,368902,0,0,,,,,,408463,,0,5544678,0,,446071,,,,0,5484988,0 +"2021-02-27","MA",16067,15744,43,323,19444,19444,785,0,,204,4340080,8439,,,,,139,579680,548874,1700,0,,,15162,,656217,494740,,0,16105520,108261,,,154697,557826,4888954,9955,16105520,108261 +"2021-02-27","MD",7856,7674,18,182,34927,34927,892,79,,222,2993098,6547,,168551,,,,381272,381272,836,0,,,27357,,465175,9659,,0,7848245,44150,,,195908,,3374370,7383,7848245,44150 +"2021-02-27","ME",702,680,1,22,1525,1525,74,6,,24,,0,14120,,,,8,44492,35058,197,0,815,10146,,,40576,12798,,0,1588504,8529,14947,197763,,,,0,1588504,8529 +"2021-02-27","MI",16508,15522,70,986,,,841,0,,195,,0,,,9644816,,93,645550,587581,1425,0,,,,,743075,541258,,0,10387891,36981,527911,,,,,0,10387891,36981 +"2021-02-27","MN",6475,6204,13,271,25714,25714,263,31,5304,60,2999036,5472,,,,,,483790,460345,812,0,,,,,,469959,6891674,24763,6891674,24763,,425249,,,3459381,6167,,0 +"2021-02-27","MO",7920,,7,,,,1209,0,,238,1854790,3065,125105,,3935700,,150,477950,477950,478,0,23974,81593,,,527680,,,0,4472822,13647,149277,845921,133672,348751,2332740,3543,4472822,13647 +"2021-02-27","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,143,143,0,0,,,,,,29,,0,17572,0,,,,,17542,0,26131,0 +"2021-02-27","MS",6669,4667,31,2002,9012,9012,492,0,,114,1436186,0,,,,,69,294091,182631,549,0,,,,,,273437,,0,1730277,549,80525,728148,,,,0,1617180,0 +"2021-02-27","MT",1356,,2,,4579,4579,68,8,,13,,0,,,,,6,99837,95360,224,0,,,,,,96724,,0,1074437,4473,,,,,,0,1074437,4473 +"2021-02-27","NC",11212,9922,26,1290,,,1414,0,,348,,0,,,,,,858548,749388,2643,0,,,,,,,,0,9463409,40943,,759541,,,,0,9463409,40943 +"2021-02-27","ND",1472,,0,,3866,3866,21,2,565,3,304810,463,11953,,,,,99780,94576,69,0,1442,,,,,97678,1409086,1967,1409086,1967,13395,143485,,,404590,532,1514345,2611 +"2021-02-27","NE",2082,,4,,6099,6099,154,11,,,763406,1160,,,2130434,,,200681,,278,0,,,,,233075,154339,,0,2366126,9331,,,,,964612,1442,2366126,9331 +"2021-02-27","NH",1170,,3,,1114,1114,93,5,345,,576446,986,,,,,,75166,52880,273,0,,,,,,71324,,0,1451685,15017,39267,193551,37668,,629326,1184,1451685,15017 +"2021-02-27","NJ",23238,20907,46,2331,63664,63664,1919,104,,404,9868082,60415,,,,,248,786967,699564,4134,0,,,,,,,,0,10655049,64549,,,,,,0,10567646,63979 +"2021-02-27","NM",3700,,15,,13097,13097,227,18,,,,0,,,,,,184888,,152,0,,,,,,143774,,0,2681383,11818,,,,,,0,2681383,11818 +"2021-02-27","NV",4957,,15,,,,491,0,,115,1115359,419,,,,,67,293488,293488,459,0,,,,,,,2712509,9597,2712509,9597,,,,,1408847,878,,0 +"2021-02-27","NY",38407,,86,,89995,89995,5445,0,,1121,,0,,,,,753,1622865,,8141,0,,,,,,,37833195,285307,37833195,285307,,,,,,0,,0 +"2021-02-27","OH",17237,14660,54,2577,50197,50197,1204,79,7130,313,,0,,,,,201,966154,828470,1774,0,,83949,,,856671,907410,,0,9994327,54040,,1686131,,,,0,9994327,54040 +"2021-02-27","OK",4379,,59,,23909,23909,484,30,,150,3084829,6841,,,3084829,,,423802,,779,0,21760,,,,386563,406494,,0,3508631,7620,148204,,,,,0,3471392,-3314 +"2021-02-27","OR",2206,,2,,8570,8570,177,19,,35,,0,,,3361555,,16,154878,,324,0,,,,,202565,,,0,3564120,17803,,,,,,0,3564120,17803 +"2021-02-27","PA",23937,,0,,,,1785,0,,386,3876216,12281,,,,,209,929697,800040,3361,0,,,,,,836727,10378789,65055,10378789,65055,,,,,4676256,15011,,0 +"2021-02-27","PR",2032,1729,9,303,,,174,0,,30,305972,0,,,395291,,19,100044,92262,184,0,80326,,,,20103,90738,,0,406016,184,,,,,,0,415664,0 +"2021-02-27","RI",2512,,10,,8900,8900,168,0,,34,666805,1226,,,2840175,,19,126093,,471,0,,,,,150268,,2990443,21802,2990443,21802,,,,,792898,1697,,0 +"2021-02-27","SC",8498,7546,21,952,20340,20340,865,65,,221,4485388,32242,105088,,4357443,,109,515072,442957,1777,0,27010,107150,,,570902,230793,,0,5000460,34019,132098,855067,,,,0,4928345,33502 +"2021-02-27","SD",1886,,7,,6610,6610,91,19,,22,309734,553,,,,,10,112293,99744,186,0,,,,,104876,108497,,0,690339,1664,,,,,422027,739,690339,1664 +"2021-02-27","TN",11393,9152,16,2241,18586,18586,1038,33,,251,,0,,,6021579,,124,773887,648472,1374,0,,137259,,,747859,748739,,0,6769438,15679,,1366306,,,,0,6769438,15679 +"2021-02-27","TX",42739,,164,,,,5912,0,,1813,,0,,,,,,2640209,2284059,11073,0,151216,198869,,,2594731,2417585,,0,19488683,62170,1011849,2451395,,,,0,19488683,62170 +"2021-02-27","UT",1929,,22,,14664,14664,252,36,2308,89,1532559,3465,,,2504904,813,,370770,,686,0,,58739,,56300,342802,351396,,0,2847706,8715,,951137,,355021,1846405,3855,2847706,8715 +"2021-02-27","VA",8382,7189,185,1193,24091,24091,1374,113,,303,,0,,,,,185,574314,452664,1675,0,27768,121312,,,552892,,5879000,24347,5879000,24347,221033,1375123,,,,0,,0 +"2021-02-27","VI",25,,0,,,,,0,,,45225,151,,,,,,2646,,10,0,,,,,,2511,,0,47871,161,,,,,47981,168,,0 +"2021-02-27","VT",204,,0,,,,30,0,,4,315231,933,,,,,,15098,14667,135,0,,,,,,12436,,0,1059706,10501,,,,,329898,1066,1059706,10501 +"2021-02-27","WA",4956,,14,,19275,19275,498,51,,135,,0,,,4892820,,59,338822,320317,1169,0,,,,,320250,,5213424,20174,5213424,20174,,,,,,0,,0 +"2021-02-27","WI",7014,6412,15,602,26088,26088,304,75,2254,89,2623498,3201,,,,,,616886,563496,868,0,,,,,,548884,6886832,26314,6886832,26314,,,,,3186994,3890,,0 +"2021-02-27","WV",2297,1952,6,345,,,237,0,,65,,0,,,,,37,131580,105098,346,0,,,,,,121797,,0,2166580,8724,32481,,,,,0,2166580,8724 +"2021-02-27","WY",671,,0,,1381,1381,25,0,,,180826,0,,,590006,,,54350,46044,0,0,,,,,38734,52998,,0,636716,0,,,,,226870,0,636716,0 +"2021-02-26","AK",290,,0,,1277,1277,43,6,,,,0,,,1610023,,5,55989,,103,0,,,,,67580,,,0,1679675,8632,,,,,,0,1679675,8632 +"2021-02-26","AL",9869,7734,38,2135,45428,45428,691,116,2650,,1896419,4871,,,,1507,,491849,385229,739,0,,,,,,285130,,0,2281648,5460,,,116701,,2281648,5460,,0 +"2021-02-26","AR",5407,4348,10,1059,14747,14747,504,98,,184,2382628,6194,,,2382628,1518,98,318638,251711,516,0,,,,78546,,308725,,0,2634339,6606,,,,444073,,0,2634339,6606 +"2021-02-26","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-26","AZ",15897,14028,83,1869,57460,57460,1354,70,,419,2980441,10049,,,,,225,814528,759626,1621,0,,,,,,,,0,7596552,46775,,,437195,,3740067,11498,7596552,46775 +"2021-02-26","CA",51382,,391,,,,6152,0,,1725,,0,,,,,,3465726,3465726,5400,0,,,,,,,,0,47995576,181416,,,,,,0,47995576,181416 +"2021-02-26","CO",5940,5207,15,733,23438,23438,409,53,,,2162933,6034,351755,,,,,426198,402859,1521,0,58079,,,,,,6159303,39957,6159303,39957,413552,,,,2565792,7357,,0 +"2021-02-26","CT",7622,6254,8,1368,12257,12257,451,0,,,,0,,,5973606,,,279946,261052,787,0,,21235,,,317614,,,0,6299277,32146,,371931,,,,0,6299277,32146 +"2021-02-26","DC",1009,,4,,,,179,0,,50,,0,,,,,24,40284,,162,0,,,,,,28757,1215331,5678,1215331,5678,,,,,433206,967,,0 +"2021-02-26","DE",1418,1283,12,135,,,156,0,,26,536182,1217,,,,,,86098,81546,297,0,,,,,89597,,1377802,6251,1377802,6251,,,,,622280,1514,,0 +"2021-02-26","FL",31162,,144,,80238,80238,3864,282,,,9137648,26855,847365,803582,16391386,,,1863453,1515826,5783,0,176911,,166506,,2441154,,21593623,105518,21593623,105518,1024780,,970437,,11001101,32638,18922497,75982 +"2021-02-26","GA",17219,15007,20,2212,55778,55778,2476,174,9087,,,0,,,,,,1000822,814820,3434,0,74309,159339,,,791209,,,0,7153524,27773,474319,1375548,,,,0,7153524,27773 +"2021-02-26","GU",130,,0,,,,4,0,,1,109867,332,,,,,1,7734,7525,4,0,24,248,,,,7564,,0,117601,336,352,9111,,,,0,117392,336 +"2021-02-26","HI",437,437,2,,2214,2214,30,5,,3,,0,,,,,3,28166,27399,78,0,,,,,26939,,1085483,4768,1085483,4768,,,,,,0,,0 +"2021-02-26","IA",5463,,25,,,,196,0,,46,1030990,1377,,93253,2378147,,18,279429,279429,546,0,,59599,18258,56159,303076,313771,,0,1310419,1923,,1336491,111562,240854,1312807,1928,2695742,8407 +"2021-02-26","ID",1850,1628,10,222,7057,7057,143,13,1228,38,498100,1037,,,,,,170595,138433,306,0,,,,,,93679,,0,636533,1219,,123809,,,636533,1219,1075256,4729 +"2021-02-26","IL",22675,20460,68,2215,,,1393,0,,336,,0,,,,,174,1183667,,2441,0,,,,,,,,0,17988085,92256,,,,,,0,17988085,92256 +"2021-02-26","IN",12531,12098,37,433,42708,42708,781,36,7490,151,2446355,5371,,,,,79,660071,,944,0,,,,,751829,,,0,7942952,40443,,,,,3106426,6315,7942952,40443 +"2021-02-26","KS",4735,,11,,9249,9249,258,60,2510,63,960800,4869,,,,411,29,293663,,826,0,,,,,,,,0,1254463,5695,,580453,,,1254463,5695,2468690,29950 +"2021-02-26","KY",4600,4175,30,425,18981,18981,818,93,3950,218,,0,,,,,105,402926,309388,1176,0,9579,36568,,,249064,47391,,0,3891701,12789,111061,477737,,,,0,3891701,12789 +"2021-02-26","LA",9587,8906,26,681,,,651,0,,,5116086,22678,,,,,95,428592,368902,903,0,,,,,,408463,,0,5544678,23581,,446071,,,,0,5484988,23362 +"2021-02-26","MA",16024,15703,46,321,19444,19444,807,0,,211,4331641,9469,,,,,137,577980,547358,1987,0,,,15162,,654425,494740,,0,15997259,102584,,,154697,554801,4878999,11203,15997259,102584 +"2021-02-26","MD",7838,7656,33,182,34848,34848,943,89,,245,2986551,7420,,168551,,,,380436,380436,970,0,,,27357,,464138,9643,,0,7804095,48121,,,195908,,3366987,8390,7804095,48121 +"2021-02-26","ME",701,679,0,22,1519,1519,68,-2,,23,,0,14120,,,,9,44295,34952,178,0,815,10051,,,40447,12794,,0,1579975,12547,14947,195529,,,,0,1579975,12547 +"2021-02-26","MI",16438,15454,2,984,,,841,0,,195,,0,,,9609112,,93,644125,586425,1257,0,,,,,741798,529080,,0,10350910,41966,525927,,,,,0,10350910,41966 +"2021-02-26","MN",6462,6191,12,271,25683,25683,263,58,5295,60,2993564,9310,,,,,,482978,459650,1147,0,,,,,,469149,6866911,35422,6866911,35422,,422499,,,3453214,10307,,0 +"2021-02-26","MO",7913,,11,,,,1214,0,,238,1851725,2989,124847,,3922618,,156,477472,477472,394,0,23724,81328,,,527137,,,0,4459175,13834,148769,838441,133288,346514,2329197,3383,4459175,13834 +"2021-02-26","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,143,143,0,0,,,,,,29,,0,17572,0,,,,,17542,0,26131,0 +"2021-02-26","MS",6638,4650,25,1988,9012,9012,522,0,,120,1436186,0,,,,,70,293542,182337,731,0,,,,,,273437,,0,1729728,731,80525,728148,,,,0,1617180,0 +"2021-02-26","MT",1354,,4,,4571,4571,76,4,,14,,0,,,,,7,99613,95356,168,0,,,,,,96362,,0,1069964,6545,,,,,,0,1069964,6545 +"2021-02-26","NC",11186,9897,49,1289,,,1465,0,,367,,0,,,,,,855905,747385,2924,0,,,,,,,,0,9422466,60691,,749095,,,,0,9422466,60691 +"2021-02-26","ND",1472,,1,,3864,3864,21,1,563,2,304347,437,11953,,,,,99711,94530,90,0,1442,,,,,97562,1407119,4039,1407119,4039,13395,141097,,,404058,527,1511734,5739 +"2021-02-26","NE",2078,,15,,6088,6088,166,6,,,762246,1405,,,2121457,,,200403,,297,0,,,,,232720,153937,,0,2356795,9342,,,,,963170,1706,2356795,9342 +"2021-02-26","NH",1167,,4,,1109,1109,95,3,344,,575460,651,,,,,,74893,52682,325,0,,,,,,70899,,0,1436668,0,39155,188515,37609,,628142,866,1436668,0 +"2021-02-26","NJ",23192,20861,45,2331,63560,63560,2008,119,,439,9807667,51612,,,,,270,782833,696000,3870,0,,,,,,,,0,10590500,55482,,,,,,0,10503667,54681 +"2021-02-26","NM",3685,,14,,13079,13079,226,25,,,,0,,,,,,184736,,656,0,,,,,,141833,,0,2669565,17355,,,,,,0,2669565,17355 +"2021-02-26","NV",4942,,9,,,,509,0,,118,1114940,3450,,,,,72,293029,293029,399,0,,,,,,,2702912,6263,2702912,6263,,,,,1407969,3849,,0 +"2021-02-26","NY",38321,,94,,89995,89995,5626,0,,1132,,0,,,,,771,1614724,,8204,0,,,,,,,37547888,291189,37547888,291189,,,,,,0,,0 +"2021-02-26","OH",17183,14621,58,2562,50118,50118,1235,167,7119,308,,0,,,,,214,964380,826149,1976,0,,83532,,,855124,904270,,0,9940287,45771,,1660958,,,,0,9940287,45771 +"2021-02-26","OK",4320,,18,,23879,23879,526,66,,150,3077988,43699,,,3077988,,,423023,,867,0,20802,,,,385898,405367,,0,3501011,44566,145659,,,,,0,3474706,45525 +"2021-02-26","OR",2204,,10,,8551,8551,181,23,,40,,0,,,3344375,,13,154554,,492,0,,,,,201942,,,0,3546317,20098,,,,,,0,3546317,20098 +"2021-02-26","PA",23937,,69,,,,1897,0,,403,3863935,11489,,,,,218,926336,797310,3346,0,,,,,,833702,10313734,68766,10313734,68766,,,,,4661245,14211,,0 +"2021-02-26","PR",2023,1720,7,303,,,169,0,,28,305972,0,,,395291,,24,99860,92128,241,0,79732,,,,20103,90491,,0,405832,241,,,,,,0,415664,0 +"2021-02-26","RI",2502,,6,,8900,8900,168,25,,34,665579,1632,,,2818859,,19,125622,,437,0,,,,,149782,,2968641,21945,2968641,21945,,,,,791201,2069,,0 +"2021-02-26","SC",8477,7528,34,949,20275,20275,916,80,,212,4453146,31700,104781,,4325608,,113,513295,441697,1749,0,26805,106561,,,569235,230793,,0,4966441,33449,131586,846034,,,,0,4894843,32880 +"2021-02-26","SD",1879,,7,,6591,6591,96,2,,21,309181,580,,,,,8,112107,99603,143,0,,,,,104757,108284,,0,688675,1917,,,,,421288,723,688675,1917 +"2021-02-26","TN",11377,9138,56,2239,18553,18553,1432,47,,271,,0,,,6006830,,134,772513,647629,1573,0,,136650,,,746929,746954,,0,6753759,18655,,1354818,,,,0,6753759,18655 +"2021-02-26","TX",42575,,290,,,,6185,0,,1839,,0,,,,,,2629136,2275506,7955,0,150153,197877,,,2588505,2393568,,0,19426513,68600,1008485,2420865,,,,0,19426513,68600 +"2021-02-26","UT",1907,,17,,14628,14628,254,31,2303,94,1529094,3536,,,2496696,811,,370084,,651,0,,58434,,56004,342295,350198,,0,2838991,9086,,942128,,352124,1842550,4009,2838991,9086 +"2021-02-26","VA",8197,7037,234,1160,23978,23978,1481,107,,313,,0,,,,,187,572639,451539,1657,0,27539,120821,,,551608,,5854653,24186,5854653,24186,220451,1362562,,,,0,,0 +"2021-02-26","VI",25,,0,,,,,0,,,45074,424,,,,,,2636,,13,0,,,,,,2501,,0,47710,437,,,,,47813,438,,0 +"2021-02-26","VT",204,,1,,,,25,0,,10,314298,942,,,,,,14963,14534,123,0,,,,,,12286,,0,1049205,15651,,,,,328832,1063,1049205,15651 +"2021-02-26","WA",4942,,30,,19224,19224,548,13,,168,,0,,,4873457,,62,337653,319498,1088,0,,,,,319438,,5193250,25737,5193250,25737,,,,,,0,,0 +"2021-02-26","WI",6999,6399,5,600,26013,26013,304,59,2252,89,2620297,4842,,,,,,616018,562807,793,0,,,,,,548040,6860518,35113,6860518,35113,,,,,3183104,5498,,0 +"2021-02-26","WV",2291,1945,1,346,,,267,0,,62,,0,,,,,33,131234,104827,421,0,,,,,,121143,,0,2157856,10668,32357,,,,,0,2157856,10668 +"2021-02-26","WY",671,,0,,1381,1381,25,4,,,180826,358,,,590006,,,54350,46044,148,0,,,,,38734,52998,,0,636716,3090,,,,,226870,477,636716,3090 +"2021-02-25","AK",290,,0,,1271,1271,45,11,,,,0,,,1601583,,5,55886,,150,0,,,,,67403,,,0,1671043,8887,,,,,,0,1671043,8887 +"2021-02-25","AL",9831,7706,87,2125,45312,45312,722,62,2642,,1891548,6397,,,,1503,,491110,384640,890,0,,,,,,285130,,0,2276188,7155,,,116251,,2276188,7155,,0 +"2021-02-25","AR",5397,4339,10,1058,14649,14649,522,0,,204,2376434,8483,,,2376434,1509,108,318122,251299,726,0,,,,78391,,307978,,0,2627733,9057,,,,441671,,0,2627733,9057 +"2021-02-25","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-25","AZ",15814,13957,121,1857,57390,57390,1385,234,,415,2970392,10195,,,,,241,812907,758177,939,0,,,,,,,,0,7549777,37382,,,436216,,3728569,11019,7549777,37382 +"2021-02-25","CA",50991,,1114,,,,6520,0,,1783,,0,,,,,,3460326,3460326,4965,0,,,,,,,,0,47814160,161988,,,,,,0,47814160,161988 +"2021-02-25","CO",5925,5193,8,732,23385,23385,412,36,,,2156899,6982,350092,,,,,424677,401536,1119,0,57580,,,,,,6119346,39073,6119346,39073,409834,,,,2558435,7962,,0 +"2021-02-25","CT",7614,6248,19,1366,12257,12257,485,0,,,,0,,,5942165,,,279159,260425,975,0,,21021,,,316978,,,0,6267131,39700,,368567,,,,0,6267131,39700 +"2021-02-25","DC",1005,,4,,,,205,0,,55,,0,,,,,26,40122,,179,0,,,,,,28679,1209653,5048,1209653,5048,,,,,432239,991,,0 +"2021-02-25","DE",1406,1273,4,133,,,164,0,,26,534965,1061,,,,,,85801,81257,295,0,,,,,89237,,1371551,2817,1371551,2817,,,,,620766,1356,,0 +"2021-02-25","FL",31018,,140,,79956,79956,3957,281,,,9110793,29829,831212,790547,16324065,,,1857670,1511628,6519,0,165482,,155757,,2432878,,21488105,118508,21488105,118508,997190,,946648,,10968463,36348,18846515,83120 +"2021-02-25","GA",17199,14989,135,2210,55604,55604,2583,210,9036,,,0,,,,,,997388,812612,3327,0,73707,158218,,,789261,,,0,7125751,28972,473127,1360896,,,,0,7125751,28972 +"2021-02-25","GU",130,,0,,,,4,0,,1,109535,371,,,,,1,7730,7521,1,0,23,248,,,,7559,,0,117265,372,352,9085,,,,0,117056,372 +"2021-02-25","HI",435,435,0,,2209,2209,34,5,,5,,0,,,,,5,28088,27358,38,0,,,,,26900,,1080715,5490,1080715,5490,,,,,,0,,0 +"2021-02-25","IA",5438,,23,,,,227,0,,55,1029613,2121,,93163,2370413,,22,278883,278883,473,0,,59448,18054,56023,302488,312817,,0,1308496,2594,,1328035,111268,239898,1310879,2606,2687335,9878 +"2021-02-25","ID",1840,1620,0,220,7044,7044,143,11,1229,38,497063,1212,,,,,,170289,138251,423,0,,,,,,93252,,0,635314,1456,,123809,,,635314,1456,1070527,4432 +"2021-02-25","IL",22607,20406,32,2201,,,1463,0,,334,,0,,,,,168,1181226,,1884,0,,,,,,,,0,17895829,91292,,,,,,0,17895829,91292 +"2021-02-25","IN",12494,12065,27,429,42672,42672,889,37,7467,147,2440984,5338,,,,,80,659127,,1084,0,,,,,750751,,,0,7902509,45517,,,,,3100111,6422,7902509,45517 +"2021-02-25","KS",4724,,0,,9189,9189,214,0,2482,52,955931,0,,,,411,22,292837,,0,0,,,,,,,,0,1248768,0,,573408,,,1248768,0,2438740,0 +"2021-02-25","KY",4570,4146,43,424,18888,18888,843,29,3937,220,,0,,,,,122,401750,308600,1443,0,9529,36471,,,248402,47259,,0,3878912,16035,110911,471067,,,,0,3878912,16035 +"2021-02-25","LA",9561,8885,33,676,,,679,0,,,5093408,52436,,,,,100,427689,368218,764,0,,,,,,408463,,0,5521097,53200,,443438,,,,0,5461626,53072 +"2021-02-25","MA",15978,15657,33,321,19444,19444,853,0,,221,4322172,11013,,,,,142,575993,545624,2108,0,,,15162,,652400,494740,,0,15894675,118144,,,154697,551474,4867796,12941,15894675,118144 +"2021-02-25","MD",7805,7623,16,182,34759,34759,952,87,,243,2979131,6531,,168551,,,,379466,379466,976,0,,,27357,,463130,9635,,0,7755974,37184,,,195908,,3358597,7507,7755974,37184 +"2021-02-25","ME",701,679,24,22,1521,1521,67,6,,22,,0,14100,,,,8,44117,34820,217,0,806,10001,,,40281,12786,,0,1567428,11336,14918,193912,,,,0,1567428,11336 +"2021-02-25","MI",16436,15453,47,983,,,821,0,,186,,0,,,9568418,,86,642868,585352,1598,0,,,,,740526,529080,,0,10308944,50160,524489,,,,,0,10308944,50160 +"2021-02-25","MN",6450,6179,7,271,25625,25625,265,46,5287,50,2984254,11504,,,,,,481831,458653,986,0,,,,,,468498,6831489,45708,6831489,45708,,418488,,,3442907,12287,,0 +"2021-02-25","MO",7902,,8,,,,1202,0,,257,1848736,5522,124589,,3909261,,163,477078,477078,727,0,23586,81030,,,526690,,,0,4445341,22411,148373,830943,133005,343700,2325814,6249,4445341,22411 +"2021-02-25","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,143,143,0,0,,,,,,29,,0,17572,0,,,,,17542,0,26131,0 +"2021-02-25","MS",6613,4637,8,1976,9012,9012,534,0,,130,1436186,0,,,,,76,292811,181997,920,0,,,,,,273437,,0,1728997,920,80525,728148,,,,0,1617180,0 +"2021-02-25","MT",1350,,2,,4567,4567,75,8,,15,,0,,,,,6,99445,95356,203,0,,,,,,96178,,0,1063419,7249,,,,,,0,1063419,7249 +"2021-02-25","NC",11137,9856,63,1281,,,1498,0,,373,,0,,,,,,852981,745214,3351,0,,,,,,,,0,9361775,51032,,741362,,,,0,9361775,51032 +"2021-02-25","ND",1471,,1,,3863,3863,25,3,563,4,303910,328,11953,,,,,99621,94459,90,0,1442,,,,,97474,1403080,3738,1403080,3738,13395,138677,,,403531,418,1505995,5157 +"2021-02-25","NE",2063,,9,,6082,6082,160,23,,,760841,1126,,,2112522,,,200106,,324,0,,,,,232314,153753,,0,2347453,12000,,,,,961464,1450,2347453,12000 +"2021-02-25","NH",1163,,6,,1106,1106,97,5,343,,574809,1599,,,,,,74568,52467,310,0,,,,,,70547,,0,1436668,17172,39155,188515,37558,,627276,1811,1436668,17172 +"2021-02-25","NJ",23147,20816,70,2331,63441,63441,2032,189,,438,9756055,43950,,,,,268,778963,692931,3577,0,,,,,,,,0,10535018,47527,,,,,,0,10448986,46937 +"2021-02-25","NM",3671,,13,,13054,13054,245,30,,,,0,,,,,,184080,,299,0,,,,,,139593,,0,2652210,9788,,,,,,0,2652210,9788 +"2021-02-25","NV",4933,,14,,,,532,0,,116,1111490,2718,,,,,71,292630,292630,571,0,,,,,,,2696649,10057,2696649,10057,,,,,1404120,3289,,0 +"2021-02-25","NY",38227,,92,,89995,89995,5703,0,,1124,,0,,,,,774,1606520,,8746,0,,,,,,,37256699,278942,37256699,278942,,,,,,0,,0 +"2021-02-25","OH",17125,14573,80,2552,49951,49951,1262,163,7104,338,,0,,,,,215,962404,826149,2409,0,,82707,,,852166,901025,,0,9894516,44938,,1629432,,,,0,9894516,44938 +"2021-02-25","OK",4302,,38,,23813,23813,491,45,,145,3034289,9858,,,3034289,,,422156,,1146,0,20802,,,,383081,404310,,0,3456445,11004,145659,,,,,0,3429181,10444 +"2021-02-25","OR",2194,,32,,8528,8528,191,32,,49,,0,,,3324832,,24,154062,,417,0,,,,,201387,,,0,3526219,15528,,,,,,0,3526219,15528 +"2021-02-25","PA",23868,,81,,,,1962,0,,421,3852446,8653,,,,,229,922990,794588,2356,0,,,,,,830691,10244968,54200,10244968,54200,,,,,4647034,10539,,0 +"2021-02-25","PR",2016,1714,9,302,,,184,0,,35,305972,0,,,395291,,28,99619,91919,100,0,78969,,,,20103,90223,,0,405591,100,,,,,,0,415664,0 +"2021-02-25","RI",2496,,9,,8875,8875,163,25,,34,663947,1811,,,2797434,,17,125185,,467,0,,,,,149262,,2946696,24685,2946696,24685,,,,,789132,2278,,0 +"2021-02-25","SC",8443,7502,45,941,20195,20195,939,78,,223,4421446,25187,104552,,4294390,,128,511546,440517,2502,0,26631,106000,,,567573,230793,,0,4932992,27689,131183,836918,,,,0,4861963,26843 +"2021-02-25","SD",1872,,8,,6589,6589,100,19,,20,308601,582,,,,,12,111964,99499,156,0,,,,,104622,108144,,0,686758,1695,,,,,420565,738,686758,1695 +"2021-02-25","TN",11321,9098,55,2223,18506,18506,1139,76,,286,,0,,,5989429,,137,770940,646494,1994,0,,136109,,,745675,745200,,0,6735104,25704,,1340603,,,,0,6735104,25704 +"2021-02-25","TX",42285,,305,,,,6724,0,,2061,,0,,,,,,2621181,2269871,7389,0,148914,196451,,,2581928,2380295,,0,19357913,53992,1005419,2373470,,,,0,19357913,53992 +"2021-02-25","UT",1890,,11,,14597,14597,248,43,2295,87,1525558,4183,,,2488171,810,,369433,,832,0,,58304,,55884,341734,348982,,0,2829905,10605,,935615,,350635,1838541,4765,2829905,10605 +"2021-02-25","VA",7963,6848,156,1115,23871,23871,1488,73,,303,,0,,,,,183,570982,450388,2036,0,27322,120290,,,550195,,5830467,30668,5830467,30668,219906,1349150,,,,0,,0 +"2021-02-25","VI",25,,0,,,,,0,,,44650,284,,,,,,2623,,10,0,,,,,,2497,,0,47273,294,,,,,47375,279,,0 +"2021-02-25","VT",203,,2,,,,30,0,,11,313356,358,,,,,,14840,14413,72,0,,,,,,12135,,0,1033554,1603,,,,,327769,426,1033554,1603 +"2021-02-25","WA",4912,,31,,19211,19211,534,51,,152,,0,,,4848716,,60,336565,318510,872,0,,,,,318442,,5167513,21996,5167513,21996,,,,,,0,,0 +"2021-02-25","WI",6994,6394,58,600,25954,25954,355,61,2251,93,2615455,12337,,,,,,615225,562151,965,0,,,,,,547168,6825405,88386,6825405,88386,,,,,3177606,13177,,0 +"2021-02-25","WV",2290,1944,5,346,,,282,0,,74,,0,,,,,40,130813,104604,431,0,,,,,,120503,,0,2147188,11358,32291,,,,,0,2147188,11358 +"2021-02-25","WY",671,,0,,1377,1377,20,3,,,180468,240,,,586971,,,54202,45925,214,0,,,,,38686,52879,,0,633626,3788,,,,,226393,364,633626,3788 +"2021-02-24","AK",290,,0,,1260,1260,46,0,,,,0,,,1592879,,4,55736,,176,0,,,,,67232,,,0,1662156,8731,,,,,,0,1662156,8731 +"2021-02-24","AL",9744,7643,84,2101,45250,45250,773,0,2641,,1885151,2971,,,,1500,,490220,383882,1247,0,,,,,,275245,,0,2269033,3947,,,115627,,2269033,3947,,0 +"2021-02-24","AR",5387,4330,10,1057,14649,14649,545,32,,204,2367951,8380,,,2367951,1509,99,317396,250725,803,0,,,,78202,,307306,,0,2618676,8839,,,,439073,,0,2618676,8839 +"2021-02-24","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-24","AZ",15693,13846,43,1847,57156,57156,1449,84,,430,2960197,6987,,,,,253,811968,757353,1310,0,,,,,,,,0,7512395,34072,,,435519,,3717550,8185,7512395,34072 +"2021-02-24","CA",49877,,314,,,,6764,0,,1842,,0,,,,,,3455361,3455361,5303,0,,,,,,,,0,47652172,138805,,,,,,0,47652172,138805 +"2021-02-24","CO",5917,5185,10,732,23349,23349,427,56,,,2149917,6888,338578,,,,,423558,400556,1168,0,55797,,,,,,6080273,36690,6080273,36690,407672,,,,2550473,7918,,0 +"2021-02-24","CT",7595,6230,23,1365,12257,12257,495,0,,,,0,,,5903519,,,278184,259600,1493,0,,20801,,,315971,,,0,6227431,28724,,362250,,,,0,6227431,28724 +"2021-02-24","DC",1001,,3,,,,211,0,,57,,0,,,,,31,39943,,99,0,,,,,,28532,1204605,3000,1204605,3000,,,,,431248,750,,0 +"2021-02-24","DE",1402,1269,23,133,,,182,0,,27,533904,1231,,,,,,85506,80991,278,0,,,,,89126,,1368734,5059,1368734,5059,,,,,619410,1509,,0 +"2021-02-24","FL",30878,,129,,79675,79675,4077,265,,,9080964,29359,831212,790547,16250525,,,1851151,1506867,6923,0,165482,,155757,,2423735,,21369597,105398,21369597,105398,997190,,946648,,10932115,36282,18763395,85494 +"2021-02-24","GA",17064,14882,137,2182,55394,55394,2615,227,8999,,,0,,,,,,994061,810473,3240,0,73122,157551,,,787153,,,0,7096779,20380,471938,1350009,,,,0,7096779,20380 +"2021-02-24","GU",130,,0,,,,6,0,,2,109164,431,,,,,2,7729,7520,2,0,23,248,,,,7555,,0,116893,433,352,9047,,,,0,116684,433 +"2021-02-24","HI",435,435,4,,2204,2204,37,8,,6,,0,,,,,6,28050,27320,50,0,,,,,26853,,1075225,5055,1075225,5055,,,,,,0,,0 +"2021-02-24","IA",5415,,15,,,,233,0,,57,1027492,2101,,92925,2361198,,23,278410,278410,589,0,,59265,17836,55836,301944,311666,,0,1305902,2690,,1320798,110812,238935,1308273,2683,2677457,10092 +"2021-02-24","ID",1840,1620,14,220,7033,7033,110,26,1227,25,495851,1078,,,,,,169866,138007,282,0,,,,,,92859,,0,633858,1297,,123809,,,633858,1297,1066095,3465 +"2021-02-24","IL",22575,20374,47,2201,,,1511,0,,338,,0,,,,,172,1179342,,2022,0,,,,,,,,0,17804537,82976,,,,,,0,17804537,82976 +"2021-02-24","IN",12467,12039,17,428,42635,42635,886,78,7445,158,2435646,3954,,,,,79,658043,,1006,0,,,,,749447,,,0,7856992,41241,,,,,3093689,4960,7856992,41241 +"2021-02-24","KS",4724,,81,,9189,9189,214,86,2482,52,955931,4147,,,,411,22,292837,,1122,0,,,,,,,,0,1248768,5269,,573408,,,1248768,5269,2438740,19844 +"2021-02-24","KY",4527,4107,51,420,18859,18859,883,91,3930,228,,0,,,,,112,400307,307541,1294,0,9471,36262,,,247781,47225,,0,3862877,5572,110788,465656,,,,0,3862877,5572 +"2021-02-24","LA",9528,8860,25,668,,,687,0,,,5040972,20853,,,,,102,426925,367582,877,0,,,,,,408463,,0,5467897,21730,,440757,,,,0,5408554,21395 +"2021-02-24","MA",15945,15624,62,321,19444,19444,875,268,,219,4311159,11201,,,,,151,573885,543696,2102,0,,,14895,,650220,477796,,0,15776531,114127,,,153152,548242,4854855,12989,15776531,114127 +"2021-02-24","MD",7789,7607,27,182,34672,34672,960,95,,249,2972600,4940,,168551,,,,378490,378490,862,0,,,27357,,461976,9626,,0,7718790,29249,,,195908,,3351090,5802,7718790,29249 +"2021-02-24","ME",677,658,17,19,1515,1515,74,4,,25,,0,14088,,,,7,43900,34723,164,0,805,9867,,,40133,12779,,0,1556092,12602,14905,189401,,,,0,1556092,12602 +"2021-02-24","MI",16389,15405,9,984,,,855,0,,200,,0,,,9519738,,86,641270,583964,1558,0,,,,,739046,529080,,0,10258784,41891,522406,,,,,0,10258784,41891 +"2021-02-24","MN",6443,6173,9,270,25579,25579,292,51,5284,59,2972750,4753,,,,,,480845,457870,754,0,,,,,,467969,6785781,6168,6785781,6168,,411600,,,3430620,5355,,0 +"2021-02-24","MO",7894,,9,,,,1182,0,,244,1843214,2857,124325,,3887769,,161,476351,476351,560,0,23441,80711,,,525813,,,0,4422930,11920,147964,820678,132696,340085,2319565,3417,4422930,11920 +"2021-02-24","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,143,143,0,0,,,,,,29,,0,17572,0,,,,,17542,0,26131,0 +"2021-02-24","MS",6605,4633,28,1972,9012,9012,554,0,,141,1436186,0,,,,,90,291891,181549,669,0,,,,,,273437,,0,1728077,669,80525,728148,,,,0,1617180,0 +"2021-02-24","MT",1348,,2,,4559,4559,97,5,,18,,0,,,,,12,99242,95439,202,0,,,,,,96040,,0,1056170,3437,,,,,,0,1056170,3437 +"2021-02-24","NC",11074,9804,109,1270,,,1530,0,,380,,0,,,,,,849630,742766,3346,0,,,,,,,,0,9310743,27606,,729784,,,,0,9310743,27606 +"2021-02-24","ND",1470,,2,,3860,3860,28,1,563,5,303582,315,11953,,,,,99531,94394,115,0,1442,,,,,97389,1399342,3513,1399342,3513,13395,136833,,,403113,430,1500838,5000 +"2021-02-24","NE",2054,,4,,6059,6059,178,11,,,759715,1448,,,2101080,,,199782,,380,0,,,,,231778,153585,,0,2335453,12443,,,,,960014,1834,2335453,12443 +"2021-02-24","NH",1157,,2,,1101,1101,103,6,342,,573210,1309,,,,,,74258,52255,335,0,,,,,,70318,,0,1419496,5611,39056,185376,37511,,625465,1511,1419496,5611 +"2021-02-24","NJ",23077,20746,99,2331,63252,63252,2070,62,,435,9712105,37620,,,,,273,775386,689944,3119,0,,,,,,,,0,10487491,40739,,,,,,0,10402049,40178 +"2021-02-24","NM",3658,,14,,13024,13024,251,35,,,,0,,,,,,183781,,446,0,,,,,,137250,,0,2642422,14605,,,,,,0,2642422,14605 +"2021-02-24","NV",4919,,16,,,,534,0,,120,1108772,2124,,,,,78,292059,292059,516,0,,,,,,,2686592,8343,2686592,8343,,,,,1400831,2640,,0 +"2021-02-24","NY",38135,,104,,89995,89995,5876,0,,1154,,0,,,,,800,1597774,,6189,0,,,,,,,36977757,216813,36977757,216813,,,,,,0,,0 +"2021-02-24","OH",17045,14500,77,2545,49788,49788,1338,137,7083,356,,0,,,,,236,959995,824401,1842,0,,82707,,,852166,897425,,0,9849578,18715,,1629432,,,,0,9849578,18715 +"2021-02-24","OK",4264,,37,,23768,23768,591,68,,161,3024431,14553,,,3024431,,,421010,,798,0,20802,,,,382869,403159,,0,3445441,15351,145659,,,,,0,3418737,16079 +"2021-02-24","OR",2162,,7,,8496,8496,191,39,,49,,0,,,3309776,,24,153645,,511,0,,,,,200915,,,0,3510691,12526,,,,,,0,3510691,12526 +"2021-02-24","PA",23787,,76,,,,1972,0,,433,3843793,9323,,,,,239,920634,792702,2786,0,,,,,,828570,10190768,39966,10190768,39966,,,,,4636495,11297,,0 +"2021-02-24","PR",2007,1706,21,301,,,242,0,,46,305972,0,,,395291,,38,99519,91834,43,0,78747,,,,20103,90027,,0,405491,43,,,,,,0,415664,0 +"2021-02-24","RI",2487,,11,,8850,8850,168,15,,32,662136,1600,,,2773257,,16,124718,,456,0,,,,,148754,,2922011,19189,2922011,19189,,,,,786854,2056,,0 +"2021-02-24","SC",8398,7460,41,938,20117,20117,968,93,,231,4396259,53546,104336,,4269806,,129,509044,438861,2132,0,26483,105305,,,565314,230793,,0,4905303,55678,130819,827985,,,,0,4835120,55389 +"2021-02-24","SD",1864,,1,,6570,6570,102,22,,17,308019,778,,,,,9,111808,99358,262,0,,,,,104479,108053,,0,685063,2103,,,,,419827,1040,685063,2103 +"2021-02-24","TN",11266,9060,68,2206,18430,18430,1142,67,,280,,0,,,5965383,,148,768946,645002,1631,0,,135530,,,744017,743254,,0,6709400,15755,,1329787,,,,0,6709400,15755 +"2021-02-24","TX",41980,,339,,,,6738,0,,2063,,0,,,,,,2613792,2264763,7517,0,144994,195226,,,2576255,2368008,,0,19303921,61640,1000019,2358865,,,,0,19303921,61640 +"2021-02-24","UT",1879,,14,,14554,14554,252,34,2288,91,1521375,4362,,,2478293,807,,368601,,812,0,,57982,,55574,341007,347721,,0,2819300,9940,,925044,,346818,1833776,4882,2819300,9940 +"2021-02-24","VA",7807,6712,149,1095,23798,23798,1564,100,,318,,0,,,,,185,568946,449000,1907,0,27100,119584,,,548449,,5799799,20805,5799799,20805,219361,1333909,,,,0,,0 +"2021-02-24","VI",25,,0,,,,,0,,,44366,469,,,,,,2613,,24,0,,,,,,2487,,0,46979,493,,,,,47096,493,,0 +"2021-02-24","VT",201,,2,,,,32,0,,10,312998,426,,,,,,14768,14345,77,0,,,,,,11998,,0,1031951,2902,,,,,327343,505,1031951,2902 +"2021-02-24","WA",4881,,24,,19160,19160,544,50,,98,,0,,,4827423,,58,335693,317805,731,0,,,,,317740,,5145517,25291,5145517,25291,,,,,,0,,0 +"2021-02-24","WI",6936,6342,26,594,25893,25893,347,55,2250,92,2603118,4517,,,,,,614260,561311,841,0,,,,,,546408,6737019,27260,6737019,27260,,,,,3164429,5264,,0 +"2021-02-24","WV",2285,1941,11,344,,,292,0,,74,,0,,,,,40,130382,104276,243,0,,,,,,120030,,0,2135830,8563,31752,,,,,0,2135830,8563 +"2021-02-24","WY",671,,0,,1374,1374,25,1,,,180228,797,,,583283,,,53988,45801,44,0,,,,,38597,52679,,0,629838,4802,,,,,226029,852,629838,4802 +"2021-02-23","AK",290,,0,,1260,1260,38,9,,,,0,,,1584367,,5,55560,,53,0,,,,,67036,,,0,1653425,4640,,,,,,0,1653425,4640 +"2021-02-23","AL",9660,7575,68,2085,45250,45250,762,122,2632,,1882180,4250,,,,1497,,488973,382906,1453,0,,,,,,275245,,0,2265086,4825,,,115256,,2265086,4825,,0 +"2021-02-23","AR",5377,4321,14,1056,14617,14617,545,47,,204,2359571,4360,,,2359571,1505,99,316593,250266,834,0,,,,77812,,306382,,0,2609837,4779,,,,436309,,0,2609837,4779 +"2021-02-23","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-23","AZ",15650,13821,148,1829,57072,57072,1515,78,,447,2953210,5108,,,,,266,810658,756155,1184,0,,,,,,,,0,7478323,19439,,,435091,,3709365,6212,7478323,19439 +"2021-02-23","CA",49563,,225,,,,6908,0,,1898,,0,,,,,,3450058,3450058,3447,0,,,,,,,,0,47513367,192565,,,,,,0,47513367,192565 +"2021-02-23","CO",5907,5175,14,732,23293,23293,447,110,,,2143029,3994,337061,,,,,422390,399526,1096,0,55320,,,,,,6043583,17107,6043583,17107,394375,,,,2542555,4854,,0 +"2021-02-23","CT",7572,6211,10,1361,12257,12257,511,0,,,,0,,,5875715,,,276691,258845,1357,0,,19450,,,315104,,,0,6198707,21232,,343598,,,,0,6198707,21232 +"2021-02-23","DC",998,,3,,,,211,0,,57,,0,,,,,31,39844,,89,0,,,,,,28532,1201605,2843,1201605,2843,,,,,430498,542,,0 +"2021-02-23","DE",1379,1248,11,131,,,181,0,,27,532673,221,,,,,,85228,80744,138,0,,,,,88810,,1363675,4416,1363675,4416,,,,,617901,359,,0 +"2021-02-23","FL",30749,,154,,79410,79410,4198,314,,,9051605,21886,831212,790547,16175417,,,1844228,1502549,5483,0,165482,,155757,,2413918,,21264199,76769,21264199,76769,997190,,946648,,10895833,27369,18677901,63708 +"2021-02-23","GA",16927,14761,92,2166,55167,55167,2696,284,8967,,,0,,,,,,990821,808416,3780,0,72526,156556,,,785680,,,0,7076399,19117,470774,1333372,,,,0,7076399,19117 +"2021-02-23","GU",130,,0,,,,4,0,,2,108733,592,,,,,2,7727,7518,0,0,23,248,,,,7555,,0,116460,592,351,9034,,,,0,116251,592 +"2021-02-23","HI",431,431,0,,2196,2196,37,-14,,7,,0,,,,,6,28000,27270,47,0,,,,,26785,,1070170,784,1070170,784,,,,,,0,,0 +"2021-02-23","IA",5400,,26,,,,227,0,,58,1025391,1101,,92898,2351828,,25,277821,277821,241,0,,59115,17705,55682,301276,310864,,0,1303212,1342,,1311504,110653,237914,1305590,1344,2667365,5392 +"2021-02-23","ID",1826,1607,0,219,7007,7007,110,24,1224,25,494773,1479,,,,,,169584,137788,434,0,,,,,,92573,,0,632561,1837,,123809,,,632561,1837,1062630,2788 +"2021-02-23","IL",22528,20330,22,2198,,,1488,0,,361,,0,,,,,172,1177320,,1665,0,,,,,,,,0,17721561,61400,,,,,,0,17721561,61400 +"2021-02-23","IN",12450,12025,43,425,42557,42557,873,57,7438,159,2431692,2496,,,,,75,657037,,679,0,,,,,748268,,,0,7815751,20986,,,,,3088729,3175,7815751,20986 +"2021-02-23","KS",4643,,0,,9103,9103,214,0,2466,52,951784,0,,,,411,22,291715,,0,0,,,,,,,,0,1243499,0,,563612,,,1243499,0,2418896,0 +"2021-02-23","KY",4476,4061,16,415,18768,18768,894,143,3912,242,,0,,,,,121,399013,306745,1487,0,9439,35970,,,247503,47067,,0,3857305,6072,110719,458949,,,,0,3857305,6072 +"2021-02-23","LA",9503,8834,26,669,,,715,0,,,5020119,20820,,,,,111,426048,367040,1404,0,,,,,,396834,,0,5446167,22224,,435095,,,,0,5387159,21558 +"2021-02-23","MA",15883,15564,30,319,19176,19176,879,0,,225,4299958,7928,,,,,147,571783,541908,1237,0,,,14895,,648142,477796,,0,15662404,62531,,,153152,543942,4841866,9042,15662404,62531 +"2021-02-23","MD",7762,7580,30,182,34577,34577,978,84,,258,2967660,2964,,167357,,,,377628,377628,662,0,,,26456,,460924,9606,,0,7689541,12535,,,193813,,3345288,3626,7689541,12535 +"2021-02-23","ME",660,645,2,15,1511,1511,67,3,,25,,0,14076,,,,7,43736,34634,142,0,796,9796,,,40025,12772,,0,1543490,5227,14884,187167,,,,0,1543490,5227 +"2021-02-23","MI",16380,15396,37,984,,,891,0,,207,,0,,,9479256,,93,639712,582719,1784,0,,,,,737637,529080,,0,10216893,25490,519731,,,,,0,10216893,25490 +"2021-02-23","MN",6434,6164,1,270,25528,25528,269,50,5276,54,2967997,2043,,,,,,480091,457268,500,0,,,,,,467147,6779613,8425,6779613,8425,,408372,,,3425265,2452,,0 +"2021-02-23","MO",7885,,170,,,,1127,0,,234,1840357,1967,124083,,3876520,,160,475791,475791,443,0,23294,79878,,,525159,,,0,4411010,7175,147575,807157,132416,335183,2316148,2410,4411010,7175 +"2021-02-23","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,143,143,0,0,,,,,,29,,0,17572,0,,,,,17542,0,26131,0 +"2021-02-23","MS",6577,4619,24,1958,9012,9012,571,34,,153,1436186,0,,,,,93,291222,181206,348,0,,,,,,273437,,0,1727408,348,80525,728148,,,,0,1617180,0 +"2021-02-23","MT",1346,,5,,4554,4554,85,27,,21,,0,,,,,13,99040,95556,230,0,,,,,,95772,,0,1052733,2341,,,,,,0,1052733,2341 +"2021-02-23","NC",10965,9718,31,1247,,,1563,0,,384,,0,,,,,,846284,740772,1514,0,,,,,,,,0,9283137,20738,,718636,,,,0,9283137,20738 +"2021-02-23","ND",1468,,0,,3859,3859,31,-1,562,5,303267,295,11953,,,,,99416,94322,104,0,1442,,,,,97286,1395829,924,1395829,924,13395,134424,,,402683,399,1495838,1112 +"2021-02-23","NE",2050,,3,,6048,6048,166,17,,,758267,933,,,2089213,,,199402,,357,0,,,,,231219,142336,,0,2323010,6612,,,,,958180,1288,2323010,6612 +"2021-02-23","NH",1155,,1,,1095,1095,112,2,341,,571901,425,,,,,,73923,52053,258,0,,,,,,70040,,0,1413885,0,39002,184283,37467,,623954,560,1413885,0 +"2021-02-23","NJ",22978,20689,104,2289,63190,63190,2047,18,,451,9674485,108303,,,,,281,772267,687386,3158,0,,,,,,,,0,10446752,111461,,,,,,0,10361871,117383 +"2021-02-23","NM",3644,,9,,12989,12989,261,51,,,,0,,,,,,183335,,312,0,,,,,,135608,,0,2627817,8710,,,,,,0,2627817,8710 +"2021-02-23","NV",4903,,21,,,,581,0,,131,1106648,3439,,,,,84,291543,291543,398,0,,,,,,,2678249,10449,2678249,10449,,,,,1398191,3837,,0 +"2021-02-23","NY",38031,,90,,89995,89995,5977,0,,1176,,0,,,,,799,1591585,,6654,0,,,,,,,36760944,157333,36760944,157333,,,,,,0,,0 +"2021-02-23","OH",16968,14430,94,2538,49651,49651,1359,159,7073,366,,0,,,,,242,958153,823091,2775,0,,81828,,,849930,894113,,0,9830863,25465,,1596616,,,,0,9830863,25465 +"2021-02-23","OK",4227,,24,,23700,23700,602,16,,168,3009878,13683,,,3009878,,,420212,,359,0,20802,,,,380878,401945,,0,3430090,14042,145659,,,,,0,3402658,14479 +"2021-02-23","OR",2155,,0,,8457,8457,191,54,,50,,0,,,3297657,,23,153134,,316,0,,,,,200508,,,0,3498165,32378,,,,,,0,3498165,32378 +"2021-02-23","PA",23711,,97,,,,1963,0,,418,3834470,7311,,,,,240,917848,790728,2830,0,,,,,,816884,10150802,28822,10150802,28822,,,,,4625198,9325,,0 +"2021-02-23","PR",1986,1692,3,294,,,225,0,,43,305972,0,,,395291,,39,99476,91816,219,0,78589,,,,20103,89469,,0,405448,219,,,,,,0,415664,0 +"2021-02-23","RI",2476,,10,,8835,8835,170,20,,32,660536,1470,,,2754539,,19,124262,,282,0,,,,,148283,,2902822,11383,2902822,11383,,,,,784798,1752,,0 +"2021-02-23","SC",8357,7436,25,921,20024,20024,977,30,,232,4342713,0,103882,,4217953,,126,506912,437806,1323,0,26152,104006,,,561778,230793,,0,4849625,1323,130034,813069,,,,0,4779731,0 +"2021-02-23","SD",1863,,0,,6548,6548,91,11,,17,307241,671,,,,,10,111546,99175,212,0,,,,,104245,107745,,0,682960,312,,,,,418787,883,682960,312 +"2021-02-23","TN",11198,9007,45,2191,18363,18363,1129,52,,285,,0,,,5950790,,158,767315,643928,1226,0,,134930,,,742855,741057,,0,6693645,12245,,1318241,,,,0,6693645,12245 +"2021-02-23","TX",41641,,234,,,,7014,0,,2085,,0,,,,,,2606275,2259407,11809,0,144328,194246,,,2568513,2353741,,0,19242281,43164,997580,2341176,,,,0,19242281,43164 +"2021-02-23","UT",1865,,12,,14520,14520,271,54,2280,95,1517013,3273,,,2468959,801,,367789,,716,0,,57692,,55291,340401,346157,,0,2809360,8242,,915595,,344069,1828894,3736,2809360,8242 +"2021-02-23","VA",7658,6590,172,1068,23698,23698,1621,168,,315,,0,,,,,196,567039,447840,1769,0,27002,118885,,,547369,,5778994,16605,5778994,16605,219086,1318154,,,,0,,0 +"2021-02-23","VI",25,,0,,,,,0,,,43897,204,,,,,,2589,,10,0,,,,,,2483,,0,46486,214,,,,,46603,223,,0 +"2021-02-23","VT",199,,1,,,,37,0,,12,312572,1064,,,,,,14691,14266,83,0,,,,,,11907,,0,1029049,4477,,,,,326838,1144,1029049,4477 +"2021-02-23","WA",4857,,35,,19110,19110,565,77,,121,,0,,,4802711,,55,334962,317223,1168,0,,,,,317161,,5120226,46148,5120226,46148,,,,,,0,,0 +"2021-02-23","WI",6910,6317,39,593,25838,25838,347,63,2249,92,2598601,2987,,,,,,613419,560564,707,0,,,,,,545562,6709759,16989,6709759,16989,,,,,3159165,3553,,0 +"2021-02-23","WV",2274,1934,11,340,,,296,0,,78,,0,,,,,35,130139,104084,285,0,,,,,,119337,,0,2127267,8539,31754,,,,,0,2127267,8539 +"2021-02-23","WY",671,,9,,1373,1373,21,1,,,179431,0,,,581297,,,53944,45780,44,0,,,,,38552,52668,,0,625036,0,,,,,225177,0,625036,0 +"2021-02-22","AK",290,,1,,1251,1251,39,8,,,,0,,,1579837,,5,55507,,309,0,,,,,66945,,,0,1648785,18956,,,,,,0,1648785,18956 +"2021-02-22","AL",9592,7526,0,2066,45128,45128,862,361,2623,,1877930,2101,,,,1490,,487520,382331,677,0,,,,,,275245,,0,2260261,2586,,,115044,,2260261,2586,,0 +"2021-02-22","AR",5363,4311,6,1052,14570,14570,588,30,,225,2355211,2239,,,2355211,1503,109,315759,249847,245,0,,,,77370,,305470,,0,2605058,2434,,,,429300,,0,2605058,2434 +"2021-02-22","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-22","AZ",15502,13692,-3,1810,56994,56994,1590,48,,478,2948102,7865,,,,,299,809474,755051,1507,0,,,,,,,,0,7458884,25436,,,434783,,3703153,9336,7458884,25436 +"2021-02-22","CA",49338,,233,,,,7165,0,,2010,,0,,,,,,3446611,3446611,4665,0,,,,,,,,0,47320802,277454,,,,,,0,47320802,277454 +"2021-02-22","CO",5893,5165,1,728,23183,23183,433,14,,,2139035,3784,335968,,,,,421294,398666,680,0,55045,,,,,,6026476,15137,6026476,15137,392381,,,,2537701,4430,,0 +"2021-02-22","CT",7562,6202,39,1360,12257,12257,500,0,,,,0,,,5855183,,,275334,258293,2233,0,,18301,,,314431,,,0,6177475,80961,,330182,,,,0,6177475,80961 +"2021-02-22","DC",995,,0,,,,207,0,,54,,0,,,,,33,39755,,107,0,,,,,,28457,1198762,3509,1198762,3509,,,,,429956,568,,0 +"2021-02-22","DE",1368,1237,1,131,,,182,0,,19,532452,847,,,,,,85090,80609,358,0,,,,,88513,,1359259,2288,1359259,2288,,,,,617542,1205,,0 +"2021-02-22","FL",30595,,161,,79096,79096,4175,150,,,9029719,17496,831212,790547,16119985,,,1838745,1498857,4037,0,165482,,155757,,2406192,,21187430,54779,21187430,54779,997190,,946648,,10868464,21533,18614193,46923 +"2021-02-22","GA",16835,14689,91,2146,54883,54883,2760,130,8931,,,0,,,,,,987041,806119,1536,0,72459,155590,,,784449,,,0,7057282,15053,470584,1318989,,,,0,7057282,15053 +"2021-02-22","GU",130,,0,,,,5,0,,2,108141,1147,,,,,2,7727,7518,7,0,23,248,,,,7544,,0,115868,1154,351,9021,,,,0,115659,1159 +"2021-02-22","HI",431,431,0,,2210,2210,54,28,,24,,0,,,,,23,27953,27223,49,0,,,,,26748,,1069386,5810,1069386,5810,,,,,,0,,0 +"2021-02-22","IA",5374,,38,,,,222,0,,54,1024290,1387,,92729,2346702,,25,277580,277580,312,0,,58913,17557,55488,301026,309539,,0,1301870,1699,,1299980,110336,236660,1304246,1695,2661973,4901 +"2021-02-22","ID",1826,1607,0,219,6983,6983,142,0,1220,37,493294,0,,,,,,169150,137430,0,0,,,,,,91926,,0,630724,0,,123809,,,630724,0,1059842,0 +"2021-02-22","IL",22506,20303,40,2203,,,1504,0,,377,,0,,,,,169,1175655,,1246,0,,,,,,,,0,17660161,37361,,,,,,0,17660161,37361 +"2021-02-22","IN",12407,11982,35,425,42500,42500,878,55,7411,163,2429196,844,,,,,73,656358,,817,0,,,,,747519,,,0,7794765,40727,,,,,3085554,1661,7794765,40727 +"2021-02-22","KS",4643,,29,,9103,9103,214,32,2466,52,951784,4193,,,,411,22,291715,,883,0,,,,,,,,0,1243499,5076,,563612,,,1243499,5076,2418896,15821 +"2021-02-22","KY",4460,4046,13,414,18625,18625,870,24,3888,243,,0,,,,,119,397526,305904,529,0,9409,35823,,,247509,46779,,0,3851233,43677,110655,455752,,,,0,3851233,43677 +"2021-02-22","LA",9477,8808,11,669,,,740,0,,,4999299,6788,,,,,113,424644,366302,468,0,,,,,,396834,,0,5423943,7256,,429587,,,,0,5365601,7231 +"2021-02-22","MA",15853,15534,27,319,19176,19176,888,0,,229,4292030,7086,,,,,140,570546,540794,1262,0,,,14895,,646850,477796,,0,15599873,49929,,,153152,541220,4832824,8236,15599873,49929 +"2021-02-22","MD",7732,7550,17,182,34493,34493,992,54,,276,2964696,3993,,167357,,,,376966,376966,611,0,,,26456,,460098,9606,,0,7677006,22188,,,193813,,3341662,4604,7677006,22188 +"2021-02-22","ME",658,643,0,15,1508,1508,72,2,,22,,0,14062,,,,6,43594,34559,97,0,794,9733,,,39945,12766,,0,1538263,3825,14868,185172,,,,0,1538263,3825 +"2021-02-22","MI",16343,15362,1,981,,,841,0,,225,,0,,,9454830,,93,637928,581403,1659,0,,,,,736573,529080,,0,10191403,46336,518209,,,,,0,10191403,46336 +"2021-02-22","MN",6433,6163,1,270,25478,25478,235,23,5264,48,2965954,5199,,,,,,479591,456859,555,0,,,,,,466311,6771188,16478,6771188,16478,,407525,,,3422813,5688,,0 +"2021-02-22","MO",7715,,0,,,,1206,0,,244,1838390,2205,123745,,3869864,,165,475348,475348,351,0,23152,79401,,,524655,,,0,4403835,7950,147095,800188,132074,332567,2313738,2556,4403835,7950 +"2021-02-22","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,143,143,0,0,,,,,,29,,0,17572,0,,,,,17542,0,26131,0 +"2021-02-22","MS",6553,4610,0,1943,8978,8978,560,0,,143,1436186,42803,,,,,92,290874,180994,242,0,,,,,,264456,,0,1727060,43045,80525,728148,,,,0,1617180,43915 +"2021-02-22","MT",1341,,-1,,4527,4527,78,5,,18,,0,,,,,11,98810,95524,31,0,,,,,,95299,,0,1050392,1491,,,,,,0,1050392,1491 +"2021-02-22","NC",10934,9691,8,1243,,,1567,0,,383,,0,,,,,,844770,739768,2133,0,,,,,,,,0,9262399,35699,,714035,,,,0,9262399,35699 +"2021-02-22","ND",1468,,3,,3860,3860,38,3,562,7,302972,87,11953,,,,,99312,94273,35,0,1442,,,,,97164,1394905,1445,1394905,1445,13395,131757,,,402284,122,1494726,1838 +"2021-02-22","NE",2047,,0,,6031,6031,161,-3,,,757334,342,,,2082984,,,199045,,96,0,,,,,230838,142336,,0,2316398,2001,,,,,956892,440,2316398,2001 +"2021-02-22","NH",1154,,0,,1093,1093,109,0,340,,571476,180,,,,,,73665,51918,252,0,,,,,,69628,,0,1413885,3154,39002,184283,37436,,623394,348,1413885,3154 +"2021-02-22","NJ",22874,20585,16,2289,63172,63172,2023,64,,438,9566182,0,,,,,289,769109,684902,2704,0,,,,,,,,0,10335291,2704,,,,,,0,10244488,0 +"2021-02-22","NM",3635,,11,,12938,12938,247,22,,,,0,,,,,,183023,,234,0,,,,,,134105,,0,2619107,9346,,,,,,0,2619107,9346 +"2021-02-22","NV",4882,,10,,,,580,0,,142,1103209,1263,,,,,87,291145,291145,173,0,,,,,,,2667800,4933,2667800,4933,,,,,1394354,1436,,0 +"2021-02-22","NY",37941,,90,,89995,89995,5804,0,,1148,,0,,,,,780,1584931,,6146,0,,,,,,,36603611,142019,36603611,142019,,,,,,0,,0 +"2021-02-22","OH",16874,14351,58,2523,49492,49492,1374,120,7044,367,,0,,,,,250,955378,821016,1611,0,,81828,,,849930,889959,,0,9805398,23504,,1596616,,,,0,9805398,23504 +"2021-02-22","OK",4203,,22,,23684,23684,620,17,,188,2996195,0,,,2996195,,,419853,,499,0,20802,,,,379753,400597,,0,3416048,499,145659,,,,,0,3388179,0 +"2021-02-22","OR",2155,,1,,8403,8403,206,0,,56,,0,,,3266406,,24,152818,,107,0,,,,,199381,,,0,3465787,0,,,,,,0,3465787,0 +"2021-02-22","PA",23614,,17,,,,1963,0,,418,3827159,4513,,,,,240,915018,788714,1521,0,,,,,,814366,10121980,51198,10121980,51198,,,,,4615873,5613,,0 +"2021-02-22","PR",1983,1689,4,294,,,233,0,,41,305972,0,,,395291,,34,99257,91680,173,0,78173,,,,20103,89469,,0,405229,173,,,,,,0,415664,0 +"2021-02-22","RI",2466,,3,,8815,8815,186,-55,,27,659066,787,,,2743555,,18,123980,,159,0,,,,,147884,,2891439,6094,2891439,6094,,,,,783046,946,,0 +"2021-02-22","SC",8332,7417,8,915,19994,19994,993,28,,231,4342713,-848,103882,,4217953,,135,505589,437018,1440,0,26152,104006,,,561778,230793,,0,4848302,592,130034,813069,,,,0,4779731,9 +"2021-02-22","SD",1863,,0,,6537,6537,91,13,,10,306570,99,,,,,7,111334,99006,30,0,,,,,104210,107538,,0,682648,467,,,,,417904,129,682648,467 +"2021-02-22","TN",11153,8974,20,2179,18311,18311,1128,27,,295,,0,,,5939459,,167,766089,643282,952,0,,134246,,,741941,738731,,0,6681400,6909,,1302364,,,,0,6681400,6909 +"2021-02-22","TX",41407,,64,,,,6964,0,,2114,,0,,,,,,2594466,2251388,6365,0,143841,192845,,,2562136,2331940,,0,19199117,33266,996125,2320201,,,,0,19199117,33266 +"2021-02-22","UT",1853,,1,,14466,14466,265,21,2270,99,1513740,2330,,,2461257,796,,367073,,338,0,,57399,,55010,339861,344965,,0,2801118,4774,,905357,,341347,1825158,2617,2801118,4774 +"2021-02-22","VA",7486,6445,155,1041,23530,23530,1540,49,,318,,0,,,,,187,565270,446642,1155,0,26953,118379,,,545660,,5762389,12655,5762389,12655,218920,1307285,,,,0,,0 +"2021-02-22","VI",25,,0,,,,,0,,,43693,129,,,,,,2579,,4,0,,,,,,2465,,0,46272,133,,,,,46380,133,,0 +"2021-02-22","VT",198,,1,,,,38,0,,13,311508,718,,,,,,14608,14186,115,0,,,,,,11761,,0,1024572,2687,,,,,325694,830,1024572,2687 +"2021-02-22","WA",4822,,0,,19033,19033,608,0,,123,,0,,,4757606,,54,333794,316186,0,0,,,,,316119,,5074078,0,5074078,0,,,,,,0,,0 +"2021-02-22","WI",6871,6284,0,587,25775,25775,348,32,2247,95,2595614,3251,,,,,,612712,559998,472,0,,,,,,544926,6692770,15157,6692770,15157,,,,,3155612,3674,,0 +"2021-02-22","WV",2263,1926,2,337,,,294,0,,80,,0,,,,,33,129854,103888,238,0,,,,,,118796,,0,2118728,4595,31754,,,,,0,2118728,4595 +"2021-02-22","WY",662,,0,,1372,1372,21,3,,,179431,783,,,578588,,,53900,45746,105,0,,,,,38508,52567,,0,625036,4648,,,,,225177,946,625036,4648 +"2021-02-21","AK",289,,0,,1243,1243,34,0,,,,0,,,1561281,,4,55198,,0,0,,,,,66577,,,0,1629829,0,,,,,,0,1629829,0 +"2021-02-21","AL",9592,7526,2,2066,44767,44767,867,0,2623,,1875829,3104,,,,1490,,486843,381846,857,0,,,,,,275245,,0,2257675,3784,,,114835,,2257675,3784,,0 +"2021-02-21","AR",5357,4306,9,1051,14540,14540,577,14,,219,2352972,2021,,,2352972,1500,114,315514,249652,284,0,,,,77315,,304460,,0,2602624,2181,,,,427946,,0,2602624,2181 +"2021-02-21","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-21","AZ",15505,13694,25,1811,56946,56946,1598,74,,501,2940237,9077,,,,,286,807967,753580,1804,0,,,,,,,,0,7433448,37120,,,433811,,3693817,10706,7433448,37120 +"2021-02-21","CA",49105,,280,,,,7313,0,,2073,,0,,,,,,3441946,3441946,6760,0,,,,,,,,0,47043348,229472,,,,,,0,47043348,229472 +"2021-02-21","CO",5892,5164,5,728,23169,23169,440,13,,,2135251,4448,334394,,,,,420614,398020,802,0,54620,,,,,,6011339,24094,6011339,24094,391013,,,,2533271,5199,,0 +"2021-02-21","CT",7523,6166,0,1357,12257,12257,535,0,,,,0,,,5777127,,,273101,256139,0,0,,18150,,,311736,,,0,6096514,0,,324744,,,,0,6096514,0 +"2021-02-21","DC",995,,1,,,,196,0,,52,,0,,,,,28,39648,,95,0,,,,,,28365,1195253,4244,1195253,4244,,,,,429388,696,,0 +"2021-02-21","DE",1367,1236,1,131,,,175,0,,24,531605,687,,,,,,84732,80291,201,0,,,,,88415,,1356971,8317,1356971,8317,,,,,616337,888,,0 +"2021-02-21","FL",30434,,95,,78946,78946,4160,106,,,9012223,22676,831212,790547,16078849,,,1834708,1495704,4935,0,165482,,155757,,2400590,,21132651,72854,21132651,72854,997190,,946648,,10846931,27611,18567270,57184 +"2021-02-21","GA",16744,14633,2,2111,54753,54753,2778,106,8927,,,0,,,,,,985505,804812,1758,0,72085,155284,,,782965,,,0,7042229,22719,469788,1316079,,,,0,7042229,22719 +"2021-02-21","GU",130,,0,,,,5,0,,2,106994,0,,,,,2,7720,7511,4,0,23,248,,,,7528,,0,114714,4,349,9003,,,,0,114500,0 +"2021-02-21","HI",431,431,1,,2182,2182,42,0,,11,,0,,,,,7,27904,27174,67,0,,,,,26711,,1063576,9477,1063576,9477,,,,,,0,,0 +"2021-02-21","IA",5336,,0,,,,229,0,,58,1022903,1262,,92673,2342175,,27,277268,277268,302,0,,58786,17472,55373,300663,309192,,0,1300171,1564,,1296918,110195,236184,1302551,1565,2657072,4792 +"2021-02-21","ID",1826,1607,0,219,6983,6983,142,10,1220,37,493294,926,,,,,,169150,137430,197,0,,,,,,91926,,0,630724,1077,,123809,,,630724,1077,1059842,3103 +"2021-02-21","IL",22466,20269,40,2197,,,1468,0,,356,,0,,,,,170,1174409,,1585,0,,,,,,,,0,17622800,75269,,,,,,0,17622800,75269 +"2021-02-21","IN",12372,11947,36,425,42445,42445,870,67,7408,161,2428352,6767,,,,,80,655541,,881,0,,,,,746727,,,0,7754038,32380,,,,,3083893,7648,7754038,32380 +"2021-02-21","KS",4614,,0,,9071,9071,290,0,2457,82,947591,0,,,,411,34,290832,,0,0,,,,,,,,0,1238423,0,,558292,,,1238423,0,2403075,0 +"2021-02-21","KY",4447,4033,21,414,18601,18601,902,46,3883,248,,0,,,,,148,396997,305543,979,0,9377,35540,,,242898,46753,,0,3807556,0,110578,451504,,,,0,3807556,0 +"2021-02-21","LA",9466,8798,26,668,,,756,0,,,4992511,24668,,,,,120,424176,365859,1889,0,,,,,,396834,,0,5416687,26557,,429239,,,,0,5358370,25615 +"2021-02-21","MA",15826,15508,47,318,19176,19176,927,0,,234,4284944,8716,,,,,153,569284,539644,1520,0,,,14895,,645482,477796,,0,15549944,87420,,,153152,539089,4824588,10032,15549944,87420 +"2021-02-21","MD",7715,7533,18,182,34439,34439,973,84,,284,2960703,4386,,167357,,,,376355,376355,618,0,,,26456,,457509,9606,,0,7654818,32164,,,193813,,3337058,5004,7654818,32164 +"2021-02-21","ME",658,643,0,15,1506,1506,75,1,,24,,0,14011,,,,6,43497,34502,130,0,783,9685,,,39876,12761,,0,1534438,7684,14806,183722,,,,0,1534438,7684 +"2021-02-21","MI",16342,15359,0,983,,,860,0,,217,,0,,,9410432,,107,636269,579919,0,0,,,,,734635,529080,,0,10145067,0,517160,,,,,0,10145067,0 +"2021-02-21","MN",6432,6162,9,270,25455,25455,282,29,5258,59,2960755,10027,,,,,,479036,456370,879,0,,,,,,465382,6754710,25448,6754710,25448,,406336,,,3417125,10778,,0 +"2021-02-21","MO",7715,,0,,,,1234,0,,257,1836185,2645,123655,,3862361,,178,474997,474997,410,0,23094,79192,,,524228,,,0,4395885,10912,146947,798081,131973,331418,2311182,3055,4395885,10912 +"2021-02-21","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,143,143,8,0,,,,,,29,,0,17572,8,,,,,17542,0,26131,0 +"2021-02-21","MS",6553,4610,0,1943,8978,8978,563,0,,152,1393383,0,,,,,89,290632,180867,390,0,,,,,,264456,,0,1684015,390,79693,712107,,,,0,1573265,0 +"2021-02-21","MT",1342,,1,,4522,4522,78,5,,18,,0,,,,,11,98779,95500,138,0,,,,,,95211,,0,1048901,3228,,,,,,0,1048901,3228 +"2021-02-21","NC",10926,9683,30,1243,,,1647,0,,402,,0,,,,,,842637,737992,2541,0,,,,,,,,0,9226700,34955,,710973,,,,0,9226700,34955 +"2021-02-21","ND",1465,,0,,3857,3857,40,1,562,8,302885,198,11953,,,,,99277,94232,49,0,1442,,,,,97114,1393460,912,1393460,912,13395,131404,,,402162,247,1492888,1133 +"2021-02-21","NE",2047,,0,,6034,6034,163,2,,,756992,688,,,2081186,,,198949,,198,0,,,,,230666,142336,,0,2314397,5164,,,,,956452,886,2314397,5164 +"2021-02-21","NH",1154,,1,,1093,1093,109,1,339,,571296,807,,,,,,73413,51750,252,0,,,,,,69319,,0,1410731,7489,38983,183338,37421,,623046,985,1410731,7489 +"2021-02-21","NJ",22858,20569,24,2289,63108,63108,2065,46,,434,9566182,0,,,,,288,766405,682746,2031,0,,,,,,,,0,10332587,2031,,,,,,0,10244488,0 +"2021-02-21","NM",3624,,14,,12916,12916,242,15,,,,0,,,,,,182789,,314,0,,,,,,132219,,0,2609761,9486,,,,,,0,2609761,9486 +"2021-02-21","NV",4872,,4,,,,639,0,,145,1101946,1807,,,,,103,290972,290972,301,0,,,,,,,2662867,6034,2662867,6034,,,,,1392918,2108,,0 +"2021-02-21","NY",37851,,75,,89995,89995,5764,0,,1162,,0,,,,,794,1578785,,6610,0,,,,,,,36461592,221157,36461592,221157,,,,,,0,,0 +"2021-02-21","OH",16816,14301,67,2515,49372,49372,1434,55,7028,382,,0,,,,,231,953767,820039,1461,0,,81263,,,848717,887612,,0,9781894,31139,,1589581,,,,0,9781894,31139 +"2021-02-21","OK",4181,,26,,23667,23667,620,61,,188,2996195,0,,,2996195,,,419354,,1036,0,20802,,,,379753,399817,,0,3415549,1036,145659,,,,,0,3388179,0 +"2021-02-21","OR",2154,,5,,8403,8403,206,0,,56,,0,,,3266406,,24,152711,,521,0,,,,,199381,,,0,3465787,0,,,,,,0,3465787,0 +"2021-02-21","PA",23597,,27,,,,1959,0,,421,3822646,6868,,,,,253,913497,787614,1906,0,,,,,,811315,10070782,0,10070782,0,,,,,4610260,8351,,0 +"2021-02-21","PR",1979,1686,22,293,,,217,0,,44,305972,0,,,395291,,37,99084,91527,249,0,77685,,,,20103,89496,,0,405056,249,,,,,,0,415664,0 +"2021-02-21","RI",2463,,1,,8870,8870,177,0,,29,658279,1336,,,2737654,,18,123821,,273,0,,,,,147691,,2885345,10911,2885345,10911,,,,,782100,1609,,0 +"2021-02-21","SC",8324,7409,68,915,19966,19966,1013,67,,240,4343561,34511,103880,,4217946,,144,504149,436161,2872,0,26152,104005,,,561776,229445,,0,4847710,37383,130032,813049,,,,0,4779722,36083 +"2021-02-21","SD",1863,,4,,6524,6524,90,15,,17,306471,301,,,,,9,111304,98986,139,0,,,,,104179,107475,,0,682181,1478,,,,,417775,440,682181,1478 +"2021-02-21","TN",11133,8956,18,2177,18284,18284,1128,17,,300,,0,,,5933237,,171,765137,642673,1129,0,,133897,,,741254,737635,,0,6674491,9062,,1299544,,,,0,6674491,9062 +"2021-02-21","TX",41343,,130,,,,7146,0,,2268,,0,,,,,,2588101,2245634,4484,0,143699,192327,,,2558042,2318193,,0,19165851,38019,995393,2303319,,,,0,19165851,38019 +"2021-02-21","UT",1852,,10,,14445,14445,263,24,2269,100,1511410,3535,,,2456796,796,,366735,,701,0,,57347,,54964,339548,344387,,0,2796344,7462,,904200,,341072,1822541,4035,2796344,7462 +"2021-02-21","VA",7331,6320,134,1011,23481,23481,1548,45,,306,,0,,,,,186,564115,445808,2303,0,26839,118050,,,544620,,5749734,21526,5749734,21526,218635,1302156,,,,0,,0 +"2021-02-21","VI",25,,0,,,,,0,,,43564,0,,,,,,2575,,0,0,,,,,,2464,,0,46139,0,,,,,46247,0,,0 +"2021-02-21","VT",197,,1,,,,39,0,,10,310790,1455,,,,,,14493,14074,134,0,,,,,,11649,,0,1021885,12600,,,,,324864,1581,1021885,12600 +"2021-02-21","WA",4822,,0,,19033,19033,608,64,,123,,0,,,4757606,,54,333794,316186,890,0,,,,,316119,,5074078,26024,5074078,26024,,,,,,0,,0 +"2021-02-21","WI",6871,6284,0,587,25743,25743,353,27,2242,83,2592363,3862,,,,,,612240,559575,451,0,,,,,,544250,6677613,24235,6677613,24235,,,,,3151938,4265,,0 +"2021-02-21","WV",2261,1923,7,338,,,289,0,,75,,0,,,,,39,129616,103716,252,0,,,,,,118401,,0,2114133,6276,31754,,,,,0,2114133,6276 +"2021-02-21","WY",662,,0,,1369,1369,31,2,,,178648,0,,,574121,,,53795,45653,112,0,,,,,38351,52431,,0,620388,0,,,,,224231,0,620388,0 +"2021-02-20","AK",289,,0,,1243,1243,34,0,,,,0,,,1561281,,4,55198,,0,0,,,,,66577,,,0,1629829,0,,,,,,0,1629829,0 +"2021-02-20","AL",9590,7525,17,2065,44767,44767,895,0,2623,,1872725,4864,,,,1490,,485986,381166,774,0,,,,,,275245,,0,2253891,5436,,,114532,,2253891,5436,,0 +"2021-02-20","AR",5348,4298,12,1050,14526,14526,605,26,,223,2350951,2744,,,2350951,1500,103,315230,249492,517,0,,,,77180,,303777,,0,2600443,3060,,,,426611,,0,2600443,3060 +"2021-02-20","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-20","AZ",15480,13674,59,1806,56872,56872,1650,140,,517,2931160,12255,,,,,294,806163,751951,2047,0,,,,,,,,0,7396328,45153,,,432949,,3683111,14137,7396328,45153 +"2021-02-20","CA",48825,,481,,,,7747,0,,2168,,0,,,,,,3435186,3435186,6668,0,,,,,,,,0,46813876,192222,,,,,,0,46813876,192222 +"2021-02-20","CO",5887,5159,9,728,23156,23156,437,55,,,2130803,4193,332508,,,,,419812,397269,1117,0,54082,,,,,,5987245,26473,5987245,26473,389014,,,,2528072,5171,,0 +"2021-02-20","CT",7523,6166,0,1357,12257,12257,535,0,,,,0,,,5777127,,,273101,256139,0,0,,18150,,,311736,,,0,6096514,0,,324744,,,,0,6096514,0 +"2021-02-20","DC",994,,1,,,,206,0,,53,,0,,,,,30,39553,,92,0,,,,,,28298,1191009,4022,1191009,4022,,,,,428692,625,,0 +"2021-02-20","DE",1366,1235,23,131,,,178,0,,21,530918,1111,,,,,,84531,80117,350,0,,,,,88110,,1348654,6735,1348654,6735,,,,,615449,1461,,0 +"2021-02-20","FL",30339,,125,,78840,78840,4213,250,,,8989547,32585,831212,790547,16028333,,,1829773,1492000,7129,0,165482,,155757,,2394125,,21059797,115318,21059797,115318,997190,,946648,,10819320,39714,18510086,83211 +"2021-02-20","GA",16742,14629,132,2113,54647,54647,2840,213,8924,,,0,,,,,,983747,803349,3336,0,71431,154830,,,781166,,,0,7019510,31286,468310,1312100,,,,0,7019510,31286 +"2021-02-20","GU",130,,0,,,,5,0,,2,106994,0,,,,,2,7716,7507,1,0,23,248,,,,7528,,0,114710,1,349,9003,,,,0,114500,0 +"2021-02-20","HI",430,430,0,,2182,2182,42,0,,11,,0,,,,,7,27837,27107,59,0,,,,,26648,,1054099,303,1054099,303,,,,,,0,,0 +"2021-02-20","IA",5336,,0,,,,238,0,,56,1021641,948,,92659,2337743,,24,276966,276966,345,0,,58671,17455,55262,300322,308712,,0,1298607,1293,,1295002,110164,235832,1300986,1298,2652280,5298 +"2021-02-20","ID",1826,1607,0,219,6973,6973,142,9,1219,37,492368,1105,,,,,,168953,137279,314,0,,,,,,91637,,0,629647,1380,,123809,,,629647,1380,1056739,4669 +"2021-02-20","IL",22426,20234,58,2192,,,1551,0,,351,,0,,,,,171,1172824,,1922,0,,,,,,,,0,17547531,73212,,,,,,0,17547531,73212 +"2021-02-20","IN",12336,11912,11,424,42378,42378,923,45,7391,172,2421585,4964,,,,,78,654660,,1415,0,,,,,745419,,,0,7721658,38624,,,,,3076245,6379,7721658,38624 +"2021-02-20","KS",4614,,0,,9071,9071,290,0,2457,82,947591,0,,,,411,34,290832,,0,0,,,,,,,,0,1238423,0,,558292,,,1238423,0,2403075,0 +"2021-02-20","KY",4426,4017,25,409,18555,18555,921,117,3871,245,,0,,,,,125,396018,304886,1331,0,9377,35540,,,242898,46702,,0,3807556,9252,110578,451504,,,,0,3807556,9252 +"2021-02-20","LA",9440,8778,0,662,,,806,0,,,4967843,0,,,,,129,422287,364912,0,0,,,,,,396834,,0,5390130,0,,422850,,,,0,5332755,0 +"2021-02-20","MA",15779,15462,53,317,19176,19176,970,0,,246,4276228,9150,,,,,152,567764,538328,1970,0,,,14895,,643953,477796,,0,15462524,115002,,,153152,535624,4814556,10972,15462524,115002 +"2021-02-20","MD",7697,7515,20,182,34355,34355,1049,90,,278,2956317,4882,,167357,,,,375737,375737,763,0,,,26456,,457509,9600,,0,7622654,25434,,,193813,,3332054,5645,7622654,25434 +"2021-02-20","ME",658,643,2,15,1505,1505,75,2,,24,,0,14011,,,,6,43367,34431,143,0,783,9634,,,39793,12759,,0,1526754,10126,14806,182239,,,,0,1526754,10126 +"2021-02-20","MI",16342,15359,68,983,,,860,0,,217,,0,,,9410432,,107,636269,579919,823,0,,,,,734635,529080,,0,10145067,39029,517160,,,,,0,10145067,39029 +"2021-02-20","MN",6423,6153,11,270,25426,25426,282,58,5249,59,2950728,7046,,,,,,478157,455619,870,0,,,,,,464504,6729262,28269,6729262,28269,,403179,,,3406347,7755,,0 +"2021-02-20","MO",7715,,6,,,,1257,0,,275,1833540,2609,123456,,3851925,,190,474587,474587,566,0,22986,78958,,,523776,,,0,4384973,11952,146636,792819,131756,329108,2308127,3175,4384973,11952 +"2021-02-20","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,135,135,0,0,,,,,,29,,0,17564,0,,,,,17542,0,26131,0 +"2021-02-20","MS",6553,4610,19,1943,8978,8978,563,0,,152,1393383,0,,,,,89,290242,180717,350,0,,,,,,264456,,0,1683625,350,79693,712107,,,,0,1573265,0 +"2021-02-20","MT",1341,,2,,4517,4517,78,11,,18,,0,,,,,11,98641,95400,264,0,,,,,,94874,,0,1045673,5329,,,,,,0,1045673,5329 +"2021-02-20","NC",10896,9655,76,1241,,,1708,0,,409,,0,,,,,,840096,735879,3446,0,,,,,,,,0,9191745,41747,,704644,,,,0,9191745,41747 +"2021-02-20","ND",1465,,0,,3856,3856,39,9,562,8,302687,714,11953,,,,,99228,94189,75,0,1442,,,,,97002,1392548,5295,1392548,5295,13395,130442,,,401915,414,1491755,7546 +"2021-02-20","NE",2047,,4,,6032,6032,170,23,,,756304,964,,,2076255,,,198751,,309,0,,,,,230417,142336,,0,2309233,7975,,,,,955566,1274,2309233,7975 +"2021-02-20","NH",1153,,1,,1092,1092,109,0,338,,570489,1550,,,,,,73161,51572,394,0,,,,,,68927,,0,1403242,9549,38942,182334,37386,,622061,1813,1403242,9549 +"2021-02-20","NJ",22834,20545,50,2289,63062,63062,2145,104,,454,9566182,0,,,,,290,764374,680937,2876,0,,,,,,,,0,10330556,2876,,,,,,0,10244488,0 +"2021-02-20","NM",3610,,11,,12901,12901,278,10,,,,0,,,,,,182475,,425,0,,,,,,130775,,0,2600275,13613,,,,,,0,2600275,13613 +"2021-02-20","NV",4868,,37,,,,639,0,,145,1100139,1534,,,,,103,290671,290671,371,0,,,,,,,2656833,6747,2656833,6747,,,,,1390810,1905,,0 +"2021-02-20","NY",37776,,101,,89995,89995,5977,0,,1162,,0,,,,,801,1572175,,7692,0,,,,,,,36240435,251645,36240435,251645,,,,,,0,,0 +"2021-02-20","OH",16749,14248,56,2501,49317,49317,1454,104,7023,386,,0,,,,,239,952306,818994,2611,0,,81153,,,847186,884877,,0,9750755,27257,,1580160,,,,0,9750755,27257 +"2021-02-20","OK",4155,,23,,23606,23606,620,69,,188,2996195,3941,,,2996195,,,418318,,973,0,20802,,,,379753,398563,,0,3414513,4914,145659,,,,,0,3388179,4969 +"2021-02-20","OR",2149,,0,,8403,8403,206,23,,56,,0,,,3266406,,24,152190,,477,0,,,,,199381,,,0,3465787,16461,,,,,,0,3465787,16461 +"2021-02-20","PA",23570,,90,,,,2060,0,,443,3815778,8051,,,,,259,911591,786131,2818,0,,,,,,811315,10070782,38280,10070782,38280,,,,,4601909,10276,,0 +"2021-02-20","PR",1957,1664,10,293,,,215,0,,39,305972,0,,,395291,,37,98835,91324,211,0,77249,,,,20103,89460,,0,404807,211,,,,,,0,415664,0 +"2021-02-20","RI",2462,,86,,8870,8870,177,0,,29,656943,1249,,,2727083,,18,123548,,403,0,,,,,147351,,2874434,20650,2874434,20650,,,,,780491,1652,,0 +"2021-02-20","SC",8256,7352,43,904,19899,19899,1086,103,,246,4309050,26259,103595,,4184082,,144,501277,434589,3340,0,25951,103360,,,559557,227933,,0,4810327,29599,129546,804990,,,,0,4743639,28068 +"2021-02-20","SD",1859,,6,,6509,6509,95,17,,17,306170,646,,,,,9,111165,98880,147,0,,,,,104059,107309,,0,680703,1895,,,,,417335,793,680703,1895 +"2021-02-20","TN",11115,8942,51,2173,18267,18267,1123,32,,292,,0,,,5924910,,165,764008,641998,1335,0,,133433,,,740519,736300,,0,6665429,10943,,1295558,,,,0,6665429,10943 +"2021-02-20","TX",41213,,227,,,,7535,0,,2321,,0,,,,,,2583617,2241808,6486,0,143484,192203,,,2568426,2312445,,0,19127832,-84769,994702,2300546,,,,0,19127832,-84769 +"2021-02-20","UT",1842,,8,,14421,14421,260,39,2269,99,1507875,3531,,,2449909,796,,366034,,778,0,,57171,,54796,338973,343202,,0,2788882,8812,,901208,,339630,1818506,4049,2788882,8812 +"2021-02-20","VA",7197,6198,99,999,23436,23436,1594,67,,312,,0,,,,,186,561812,444150,1882,0,26753,117496,,,542768,,5728208,24574,5728208,24574,218376,1296216,,,,0,,0 +"2021-02-20","VI",25,,0,,,,,0,,,43564,205,,,,,,2575,,10,0,,,,,,2464,,0,46139,215,,,,,46247,215,,0 +"2021-02-20","VT",196,,3,,,,39,0,,11,309335,564,,,,,,14359,13948,108,0,,,,,,11540,,0,1009285,6027,,,,,323283,670,1009285,6027 +"2021-02-20","WA",4822,,19,,18969,18969,608,35,,123,,0,,,4732340,,59,332904,315419,897,0,,,,,315364,,5048054,22760,5048054,22760,,,,,,0,,0 +"2021-02-20","WI",6871,6284,19,587,25716,25716,370,81,2240,96,2588501,4126,,,,,,611789,559172,815,0,,,,,,543411,6653378,25296,6653378,25296,,,,,3147673,4802,,0 +"2021-02-20","WV",2254,1919,6,335,,,292,0,,77,,0,,,,,42,129364,103525,309,0,,,,,,117974,,0,2107857,8648,31752,,,,,0,2107857,8648 +"2021-02-20","WY",662,,0,,1367,1367,31,0,,,178648,0,,,574121,,,53683,45583,0,0,,,,,38351,52259,,0,620388,0,,,,,224231,0,620388,0 +"2021-02-19","AK",289,,1,,1243,1243,34,0,,,,0,,,1561281,,4,55198,,189,0,,,,,66577,,,0,1629829,10370,,,,,,0,1629829,10370 +"2021-02-19","AL",9573,7514,149,2059,44767,44767,951,0,2619,,1867861,4264,,,,1488,,485212,380594,847,0,,,,,,275245,,0,2248455,5063,,,114143,,2248455,5063,,0 +"2021-02-19","AR",5336,4287,13,1049,14500,14500,630,31,,237,2348207,2199,,,2348207,1495,108,314713,249176,268,0,,,,76961,,302872,,0,2597383,2379,,,,423896,,0,2597383,2379 +"2021-02-19","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-19","AZ",15421,13628,145,1793,56732,56732,1738,642,,563,2918905,12203,,,,,334,804116,750069,1918,0,,,,,,,,0,7351175,44506,,,432012,,3668974,13945,7351175,44506 +"2021-02-19","CA",48344,,420,,,,8156,0,,2291,,0,,,,,,3428518,3428518,6798,0,,,,,,,,0,46621654,117399,,,,,,0,46621654,117399 +"2021-02-19","CO",5878,5148,14,730,23101,23101,451,54,,,2126610,5386,330617,,,,,418695,396291,1280,0,53491,,,,,,5960772,33980,5960772,33980,386590,,,,2522901,6543,,0 +"2021-02-19","CT",7523,6166,27,1357,12257,12257,535,0,,,,0,,,5777127,,,273101,256139,1198,0,,18150,,,311736,,,0,6096514,42964,,324744,,,,0,6096514,42964 +"2021-02-19","DC",993,,1,,,,209,0,,48,,0,,,,,24,39461,,160,0,,,,,,28202,1186987,5825,1186987,5825,,,,,428067,1030,,0 +"2021-02-19","DE",1343,1213,17,130,,,173,0,,20,529807,1165,,,,,,84181,79797,329,0,,,,,87719,,1341919,6322,1341919,6322,,,,,613988,1494,,0 +"2021-02-19","FL",30214,,224,,78590,78590,4298,295,,,8956962,27701,831212,790547,15954828,,,1822644,1487253,6536,0,165482,,155757,,2384901,,20944479,101356,20944479,101356,997190,,946648,,10779606,34237,18426875,76321 +"2021-02-19","GA",16610,14530,207,2080,54434,54434,2973,261,8898,,,0,,,,,,980411,800959,3679,0,70995,154024,,,778851,,,0,6988224,24512,467159,1300188,,,,0,6988224,24512 +"2021-02-19","GU",130,,0,,,,5,0,,2,106994,373,,,,,2,7715,7506,10,0,23,248,,,,7528,,0,114709,383,349,9003,,,,0,114500,382 +"2021-02-19","HI",430,430,2,,2182,2182,42,3,,11,,0,,,,,7,27778,27048,61,0,,,,,26569,,1053796,4498,1053796,4498,,,,,,0,,0 +"2021-02-19","IA",5336,,15,,,,241,0,,60,1020693,1366,,92536,2332876,,26,276621,276621,392,0,,58545,17286,55147,299936,307605,,0,1297314,1758,,1287352,109872,234889,1299688,1762,2646982,8127 +"2021-02-19","ID",1826,1607,9,219,6964,6964,164,17,1218,37,491263,1397,,,,,,168639,137004,286,0,,,,,,91241,,0,628267,1591,,123809,,,628267,1591,1052070,4190 +"2021-02-19","IL",22368,20192,71,2176,,,1596,0,,366,,0,,,,,190,1170902,,2219,0,,,,,,,,0,17474319,85963,,,,,,0,17474319,85963 +"2021-02-19","IN",12325,11898,44,427,42333,42333,948,87,7383,179,2416621,3489,,,,,88,653245,,1035,0,,,,,743777,,,0,7683034,32361,,,,,3069866,4524,7683034,32361 +"2021-02-19","KS",4614,,93,,9071,9071,290,69,2457,82,947591,7010,,,,411,34,290832,,2115,0,,,,,,,,0,1238423,9125,,558292,,,1238423,9125,2403075,20552 +"2021-02-19","KY",4401,3995,28,406,18438,18438,923,124,3853,265,,0,,,,,131,394687,304086,1958,0,9335,35390,,,242428,46473,,0,3798304,11630,110492,446121,,,,0,3798304,11630 +"2021-02-19","LA",9440,8778,34,662,,,806,0,,,4967843,11420,,,,,129,422287,364912,441,0,,,,,,396834,,0,5390130,11861,,422850,,,,0,5332755,11797 +"2021-02-19","MA",15726,15409,40,317,19176,19176,990,0,,258,4267078,8800,,,,,163,565794,536506,1818,0,,,14895,,641849,477796,,0,15347522,106656,,,153152,533272,4803584,10479,15347522,106656 +"2021-02-19","MD",7677,7495,16,182,34265,34265,1016,97,,272,2951435,6451,,167357,,,,374974,374974,1008,0,,,26456,,457509,9591,,0,7597220,42207,,,193813,,3326409,7459,7597220,42207 +"2021-02-19","ME",656,641,1,15,1503,1503,87,8,,29,,0,14011,,,,7,43224,34333,134,0,783,9578,,,39671,12755,,0,1516628,10983,14806,180442,,,,0,1516628,10983 +"2021-02-19","MI",16274,15296,23,978,,,860,0,,217,,0,,,9372640,,107,635446,579284,1473,0,,,,,733398,517991,,0,10106038,38083,515054,,,,,0,10106038,38083 +"2021-02-19","MN",6412,6143,8,269,25368,25368,282,27,5240,59,2943682,11349,,,,,,477287,454910,995,0,,,,,,463454,6700993,39244,6700993,39244,,399504,,,3398592,12174,,0 +"2021-02-19","MO",7709,,14,,,,1254,0,,287,1830931,2762,123204,,3840620,,194,474021,474021,562,0,22891,78578,,,523163,,,0,4373021,13181,146288,780811,131494,326217,2304952,3324,4373021,13181 +"2021-02-19","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,135,135,0,0,,,,,,29,,0,17564,0,,,,,17542,0,26131,0 +"2021-02-19","MS",6534,4603,3,1931,8978,8978,560,0,,154,1393383,0,,,,,87,289892,180550,360,0,,,,,,264456,,0,1683275,360,79693,712107,,,,0,1573265,0 +"2021-02-19","MT",1339,,2,,4506,4506,96,22,,18,,0,,,,,12,98377,95274,277,0,,,,,,94613,,0,1040344,4904,,,,,,0,1040344,4904 +"2021-02-19","NC",10820,9595,54,1225,,,1780,0,,411,,0,,,,,,836650,733964,3227,0,,,,,,,,0,9149998,44322,,686193,,,,0,9149998,44322 +"2021-02-19","ND",1465,,0,,3847,3847,36,2,561,11,301973,0,11953,,,,,99153,94150,119,0,1442,,,,,96864,1387253,0,1387253,0,13395,125668,,,401501,494,1484209,0 +"2021-02-19","NE",2043,,18,,6009,6009,185,12,,,755340,1171,,,2068787,,,198442,,400,0,,,,,229934,142336,,0,2301258,10947,,,,,954292,1570,2301258,10947 +"2021-02-19","NH",1152,,2,,1092,1092,116,7,338,,568939,1144,,,,,,72767,51309,368,0,,,,,,68559,,0,1393693,6782,38859,179392,37313,,620248,1345,1393693,6782 +"2021-02-19","NJ",22784,20495,63,2289,62958,62958,2202,123,,443,9566182,63518,,,,,300,761498,678306,3047,0,,,,,,,,0,10327680,66565,,,,,,0,10244488,66111 +"2021-02-19","NM",3599,,19,,12891,12891,278,43,,,,0,,,,,,182050,,311,0,,,,,,128299,,0,2586662,10976,,,,,,0,2586662,10976 +"2021-02-19","NV",4831,,26,,,,670,0,,154,1098605,1707,,,,,106,290300,290300,420,0,,,,,,,2650086,7193,2650086,7193,,,,,1388905,2127,,0 +"2021-02-19","NY",37675,,119,,89995,89995,6155,0,,1199,,0,,,,,834,1564483,,8710,0,,,,,,,35988790,249248,35988790,249248,,,,,,0,,0 +"2021-02-19","OH",16693,14204,82,2489,49213,49213,1493,152,7014,395,,0,,,,,270,949695,817493,2306,0,,80691,,,845852,880613,,0,9723498,32069,,1557261,,,,0,9723498,32069 +"2021-02-19","OK",4132,,20,,23537,23537,663,73,,199,2992254,5069,,,2992254,,,417345,,869,0,20802,,,,379464,396736,,0,3409599,5938,145659,,,,,0,3383210,5083 +"2021-02-19","OR",2149,,6,,8380,8380,199,34,,59,,0,,,3250432,,28,151713,,456,0,,,,,198894,,,0,3449326,17415,,,,,,0,3449326,17415 +"2021-02-19","PA",23480,,67,,,,2061,0,,441,3807727,7811,,,,,266,908773,783906,2778,0,,,,,,799720,10032502,41222,10032502,41222,,,,,4591633,9829,,0 +"2021-02-19","PR",1947,1655,7,292,,,214,0,,45,305972,0,,,395291,,38,98624,91149,118,0,76697,,,,20103,89326,,0,404596,118,,,,,,0,415664,0 +"2021-02-19","RI",2376,,9,,8870,8870,177,24,,29,655694,1386,,,2706898,,18,123145,,286,0,,,,,146886,,2853784,21423,2853784,21423,,,,,778839,1672,,0 +"2021-02-19","SC",8213,7325,58,888,19796,19796,1122,95,,265,4282791,25376,103366,,4158340,,151,497937,432780,2893,0,25710,102630,,,557231,226443,,0,4780728,28269,129076,796594,,,,0,4715571,27082 +"2021-02-19","SD",1853,,6,,6492,6492,91,17,,12,305524,573,,,,,9,111018,98775,147,0,,,,,103964,107137,,0,678808,1655,,,,,416542,720,678808,1655 +"2021-02-19","TN",11064,8898,7,2166,18235,18235,1095,60,,268,,0,,,5914969,,150,762673,641115,1372,0,,132915,,,739517,734152,,0,6654486,9534,,1285118,,,,0,6654486,9534 +"2021-02-19","TX",40986,,172,,,,7757,0,,2367,,0,,,,,,2577131,2236776,2937,0,143340,190800,,,2560644,2289773,,0,19212601,401870,992781,2245228,,,,0,19212601,401870 +"2021-02-19","UT",1834,,21,,14382,14382,276,39,2265,103,1504344,3345,,,2441705,793,,365256,,857,0,,56874,,54511,338365,341731,,0,2780070,7950,,890374,,336787,1814457,3886,2780070,7950 +"2021-02-19","VA",7098,6107,8,991,23369,23369,1671,101,,329,,0,,,,,204,559930,442757,2034,0,26573,116931,,,540755,,5703634,23800,5703634,23800,217916,1283107,,,,0,,0 +"2021-02-19","VI",25,,0,,,,,0,,,43359,469,,,,,,2565,,7,0,,,,,,2454,,0,45924,476,,,,,46032,469,,0 +"2021-02-19","VT",193,,0,,,,39,0,,13,308771,1057,,,,,,14251,13842,102,0,,,,,,11378,,0,1003258,12327,,,,,322613,1151,1003258,12327 +"2021-02-19","WA",4803,,44,,18934,18934,600,73,,129,,0,,,4710363,,64,332007,314655,1200,0,,,,,314601,,5025294,27554,5025294,27554,,,,,,0,,0 +"2021-02-19","WI",6852,6267,36,585,25635,25635,370,79,2239,96,2584375,4535,,,,,,610974,558496,919,0,,,,,,542495,6628082,28691,6628082,28691,,,,,3142871,5309,,0 +"2021-02-19","WV",2248,1915,12,333,,,293,0,,68,,0,,,,,33,129055,103262,295,0,,,,,,117183,,0,2099209,9305,31873,,,,,0,2099209,9305 +"2021-02-19","WY",662,,0,,1367,1367,31,3,,,178648,259,,,574121,,,53683,45583,152,0,,,,,38351,52259,,0,620388,2920,,,,,224231,371,620388,2920 +"2021-02-18","AK",288,,0,,1243,1243,37,5,,,,0,,,1551117,,3,55009,,210,0,,,,,66411,,,0,1619459,7488,,,,,,0,1619459,7488 +"2021-02-18","AL",9424,7391,78,2033,44767,44767,1003,226,2616,,1863597,4081,,,,1485,,484365,379795,1198,0,,,,,,275245,,0,2243392,5091,,,113810,,2243392,5091,,0 +"2021-02-18","AR",5323,4276,10,1047,14469,14469,625,77,,241,2346008,1432,,,2346008,1494,107,314445,248996,253,0,,,,76855,,301772,,0,2595004,1573,,,,421289,,0,2595004,1573 +"2021-02-18","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-18","AZ",15276,13510,213,1766,56090,56090,1823,107,,566,2906702,5466,,,,,330,802198,748327,1143,0,,,,,,,,0,7306669,25392,,,430690,,3655029,6423,7306669,25392 +"2021-02-18","CA",47924,,417,,,,8566,0,,2427,,0,,,,,,3421720,3421720,5573,0,,,,,,,,0,46504255,119323,,,,,,0,46504255,119323 +"2021-02-18","CO",5864,5135,26,729,23047,23047,462,125,,,2121224,4617,329403,,,,,417415,395134,1241,0,53202,,,,,,5926792,30591,5926792,30591,384108,,,,2516358,5719,,0 +"2021-02-18","CT",7496,6145,20,1351,12257,12257,568,0,,,,0,,,5735579,,,271903,254980,547,0,,18068,,,310391,,,0,6053550,24953,,321303,,,,0,6053550,24953 +"2021-02-18","DC",992,,7,,,,211,0,,51,,0,,,,,19,39301,,121,0,,,,,,28108,1181162,3695,1181162,3695,,,,,427037,612,,0 +"2021-02-18","DE",1326,1196,10,130,,,197,0,,18,528642,1020,,,,,,83852,79506,271,0,,,,,87442,,1335597,2593,1335597,2593,,,,,612494,1291,,0 +"2021-02-18","FL",29990,,166,,78295,78295,4367,301,,,8929261,19376,813960,776136,15887541,,,1816108,1482196,5030,0,154948,,145802,,2376205,,20843123,73326,20843123,73326,969396,,922278,,10745369,24406,18350554,50223 +"2021-02-18","GA",16403,14358,130,2045,54173,54173,3117,293,8869,,,0,,,,,,976732,798785,3485,0,70383,152547,,,776980,,,0,6963712,48940,465859,1280884,,,,0,6963712,48940 +"2021-02-18","GU",130,,0,,,,6,0,,2,106621,390,,,,,2,7705,7497,2,0,23,247,,,,7528,,0,114326,392,349,8864,,,,0,114118,392 +"2021-02-18","HI",428,428,1,,2179,2179,39,5,,12,,0,,,,,8,27717,27000,65,0,,,,,26534,,1049298,7642,1049298,7642,,,,,,0,,0 +"2021-02-18","IA",5321,,15,,,,252,0,,59,1019327,1708,,92387,2325188,,24,276229,276229,516,0,,58388,17082,54992,299530,306399,,0,1295556,2224,,1277680,109519,233996,1297926,2223,2638855,8475 +"2021-02-18","ID",1817,1600,11,217,6947,6947,164,14,1214,37,489866,1060,,,,,,168353,136810,408,0,,,,,,90706,,0,626676,1357,,78973,,,626676,1357,1047880,3956 +"2021-02-18","IL",22297,20129,73,2168,,,1655,0,,386,,0,,,,,184,1168683,,1966,0,,,,,,,,0,17388356,67542,,,,,,0,17388356,67542 +"2021-02-18","IN",12281,11854,31,427,42246,42246,966,160,7372,178,2413132,2577,,,,,90,652210,,757,0,,,,,742550,,,0,7650673,25717,,,,,3065342,3334,7650673,25717 +"2021-02-18","KS",4521,,0,,9002,9002,300,0,2432,68,940581,0,,,,411,34,288717,,0,0,,,,,,,,0,1229298,0,,543223,,,1229298,0,2382523,0 +"2021-02-18","KY",4373,3972,37,401,18314,18314,935,25,3836,260,,0,,,,,130,392729,302781,957,0,9246,35276,,,241915,46254,,0,3786674,6522,110363,438613,,,,0,3786674,6522 +"2021-02-18","LA",9406,8753,15,653,,,823,0,,,4956423,10349,,,,,128,421846,364535,828,0,,,,,,396834,,0,5378269,11177,,421512,,,,0,5320958,10860 +"2021-02-18","MA",15686,15373,63,313,19176,19176,1029,0,,271,4258278,8646,,,,,173,563976,534827,2040,0,,,14895,,639875,477796,,0,15240866,100002,,,153152,530569,4793105,10449,15240866,100002 +"2021-02-18","MD",7661,7479,31,182,34168,34168,1048,90,,279,2944984,6568,,167357,,,,373966,373966,986,0,,,26456,,456223,9587,,0,7555013,35950,,,193813,,3318950,7554,7555013,35950 +"2021-02-18","ME",655,641,1,14,1495,1495,89,5,,27,,0,14011,,,,9,43090,34239,218,0,783,9519,,,39556,12728,,0,1505645,7331,14806,178668,,,,0,1505645,7331 +"2021-02-18","MI",16251,15273,91,978,,,877,0,,220,,0,,,9335801,,110,633973,578091,1201,0,,,,,732154,517991,,0,10067955,32529,514207,,,,,0,10067955,32529 +"2021-02-18","MN",6404,6135,14,269,25341,25341,287,54,5230,54,2932333,6988,,,,,,476292,454085,913,0,,,,,,463041,6661749,31623,6661749,31623,,393801,,,3386418,7749,,0 +"2021-02-18","MO",7695,,225,,,,1281,0,,287,1828169,2408,122989,,3828077,,194,473459,473459,718,0,22732,78226,,,522543,,,0,4359840,9448,145914,773177,131222,323969,2301628,3126,4359840,9448 +"2021-02-18","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,135,135,0,0,,,,,,29,,0,17564,0,,,,,17542,0,26131,0 +"2021-02-18","MS",6531,4601,7,1930,8978,8978,565,0,,152,1393383,0,,,,,89,289532,180408,134,0,,,,,,264456,,0,1682915,134,79693,712107,,,,0,1573265,0 +"2021-02-18","MT",1337,,3,,4484,4484,109,7,,19,,0,,,,,13,98100,95062,200,0,,,,,,94201,,0,1035440,6120,,,,,,0,1035440,6120 +"2021-02-18","NC",10766,9554,96,1212,,,1892,0,,436,,0,,,,,,833423,731595,3916,0,,,,,,,,0,9105676,47256,,678996,,,,0,9105676,47256 +"2021-02-18","ND",1465,,4,,3845,3845,31,-5,561,7,301973,410,11953,,,,,99034,94069,133,0,1442,,,,,96763,1387253,3104,1387253,3104,13395,125668,,,401007,543,1484209,4002 +"2021-02-18","NE",2025,,7,,5997,5997,188,16,,,754169,962,,,2058349,,,198042,,296,0,,,,,229423,142336,,0,2290311,10386,,,,,952722,1259,2290311,10386 +"2021-02-18","NH",1150,,2,,1085,1085,126,2,338,,567795,591,,,,,,72399,51108,434,0,,,,,,68201,,0,1386911,9808,38832,176159,37290,,618903,902,1386911,9808 +"2021-02-18","NJ",22721,20432,89,2289,62835,62835,2327,117,,474,9502664,93402,,,,,306,758451,675713,3277,0,,,,,,,,0,10261115,96679,,,,,,0,10178377,96007 +"2021-02-18","NM",3580,,18,,12848,12848,284,58,,,,0,,,,,,181739,,407,0,,,,,,126446,,0,2575686,7809,,,,,,0,2575686,7809 +"2021-02-18","NV",4805,,31,,,,698,0,,173,1096898,2366,,,,,111,289880,289880,488,0,,,,,,,2642893,7902,2642893,7902,,,,,1386778,2854,,0 +"2021-02-18","NY",37556,,116,,89995,89995,6434,0,,1258,,0,,,,,863,1555773,,6794,0,,,,,,,35739542,215731,35739542,215731,,,,,,0,,0 +"2021-02-18","OH",16611,14132,98,2479,49061,49061,1516,173,7002,422,,0,,,,,283,947389,816057,2282,0,,80172,,,844425,876697,,0,9691429,19841,,1543198,,,,0,9691429,19841 +"2021-02-18","OK",4112,,23,,23464,23464,705,72,,216,2987185,2542,,,2987185,,,416476,,618,0,19845,,,,379130,394968,,0,3403661,3160,142681,,,,,0,3378127,4029 +"2021-02-18","OR",2143,,5,,8346,8346,220,48,,52,,0,,,3233657,,24,151257,,382,0,,,,,198254,,,0,3431911,11926,,,,,,0,3431911,11926 +"2021-02-18","PA",23413,,94,,,,2124,0,,467,3799916,8895,,,,,255,905995,781888,3345,0,,,,,,797275,9991280,45870,9991280,45870,,,,,4581804,11145,,0 +"2021-02-18","PR",1940,1648,10,292,,,233,0,,45,305972,0,,,395291,,45,98506,91047,78,0,76385,,,,20103,88997,,0,404478,78,,,,,,0,415664,0 +"2021-02-18","RI",2367,,15,,8846,8846,180,35,,32,654308,1508,,,2685859,,18,122859,,419,0,,,,,146502,,2832361,22035,2832361,22035,,,,,777167,1927,,0 +"2021-02-18","SC",8155,7277,38,878,19701,19701,1137,129,,265,4257415,20038,103119,,4133611,,152,495044,431074,2675,0,25511,101765,,,554878,225005,,0,4752459,22713,128630,786007,,,,0,4688489,21618 +"2021-02-18","SD",1847,,3,,6475,6475,92,9,,10,304951,747,,,,,10,110871,98648,186,0,,,,,103835,106956,,0,677153,1543,,,,,415822,933,677153,1543 +"2021-02-18","TN",11057,8892,72,2165,18175,18175,1250,55,,309,,0,,,5906425,,163,761301,640214,998,0,,132418,,,738527,731791,,0,6644952,10515,,1274722,,,,0,6644952,10515 +"2021-02-18","TX",40814,,97,,,,7874,0,,2459,,0,,,,,,2574194,2234506,3131,0,141470,188051,,,2521479,2279684,,0,18810731,0,987853,2200714,,,,0,18810731,0 +"2021-02-18","UT",1813,,7,,14343,14343,291,49,2255,105,1500999,4502,,,2434369,788,,364399,,1151,0,,56587,,54230,337751,340227,,0,2772120,11992,,880328,,334138,1810571,5294,2772120,11992 +"2021-02-18","VA",7090,6096,15,994,23268,23268,1828,89,,364,,0,,,,,218,557896,441200,2304,0,26374,116379,,,538967,,5679834,26622,5679834,26622,217401,1272736,,,,0,,0 +"2021-02-18","VI",25,,0,,,,,0,,,42890,166,,,,,,2558,,13,0,,,,,,2448,,0,45448,179,,,,,45563,173,,0 +"2021-02-18","VT",193,,2,,,,42,0,,13,307714,515,,,,,,14149,13748,153,0,,,,,,11221,,0,990931,3743,,,,,321462,664,990931,3743 +"2021-02-18","WA",4759,,50,,18861,18861,704,97,,160,,0,,,4683820,,60,330807,313633,1061,0,,,,,313595,,4997740,30274,4997740,30274,,,,,,0,,0 +"2021-02-18","WI",6816,6232,18,584,25556,25556,391,58,2239,107,2579840,4814,,,,,,610055,557722,866,0,,,,,,541515,6599391,36012,6599391,36012,,,,,3137562,5547,,0 +"2021-02-18","WV",2236,1909,11,327,,,301,0,,57,,0,,,,,25,128760,103057,355,0,,,,,,116436,,0,2089904,9865,31873,,,,,0,2089904,9865 +"2021-02-18","WY",662,,0,,1364,1364,31,1,,,178389,347,,,571305,,,53531,45471,81,0,,,,,38266,52149,,0,617468,2131,,,,,223860,380,617468,2131 +"2021-02-17","AK",288,,1,,1238,1238,32,5,,,,0,,,1543783,,2,54799,,63,0,,,,,66264,,,0,1611971,6144,,,,,,0,1611971,6144 +"2021-02-17","AL",9346,7324,89,2022,44541,44541,1030,0,2609,,1859516,2428,,,,1479,,483167,378785,679,0,,,,,,264621,,0,2238301,2844,,,113251,,2238301,2844,,0 +"2021-02-17","AR",5313,4268,26,1045,14392,14392,638,0,,250,2344576,4013,,,2344576,1480,110,314192,248855,667,0,,,,76727,,300613,,0,2593431,4423,,,,419081,,0,2593431,4423 +"2021-02-17","AS",0,,0,,,,,0,,,2140,0,,,,,,0,,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-17","AZ",15063,13328,82,1735,55983,55983,1941,118,,593,2901236,4592,,,,,354,801055,747370,1315,0,,,,,,,,0,7281277,19717,,,430371,,3648606,5812,7281277,19717 +"2021-02-17","CA",47507,,400,,,,8855,0,,2533,,0,,,,,,3416147,3416147,4090,0,,,,,,,,0,46384932,157207,,,,,,0,46384932,157207 +"2021-02-17","CO",5838,5114,10,724,22922,22922,482,85,,,2116607,4108,327849,,,,,416174,394032,1137,0,52791,,,,,,5896201,26832,5896201,26832,382605,,,,2510639,5052,,0 +"2021-02-17","CT",7476,6129,27,1347,12257,12257,584,0,,,,0,,,5711235,,,271356,254520,534,0,,17961,,,309814,,,0,6028597,23666,,319256,,,,0,6028597,23666 +"2021-02-17","DC",985,,3,,,,206,0,,54,,0,,,,,24,39180,,49,0,,,,,,27930,1177467,4699,1177467,4699,,,,,426425,1094,,0 +"2021-02-17","DE",1316,1190,25,126,,,195,0,,15,527622,1233,,,,,,83581,79257,212,0,,,,,87335,,1333004,5155,1333004,5155,,,,,611203,1445,,0 +"2021-02-17","FL",29824,,165,,77994,77994,4465,308,,,8909885,28762,813960,776136,15844134,,,1811078,1478634,7185,0,154948,,145802,,2369671,,20769797,103720,20769797,103720,969396,,922278,,10720963,35947,18300331,77389 +"2021-02-17","GA",16273,14254,99,2019,53880,53880,3176,222,8838,,,0,,,,,,973247,796547,3545,0,69684,,,,769319,,,0,6914772,19391,464369,,,,,0,6914772,19391 +"2021-02-17","GU",130,,0,,,,4,0,,2,106231,478,,,,,2,7703,7495,2,0,23,247,,,,7523,,0,113934,480,348,8853,,,,0,113726,480 +"2021-02-17","HI",427,427,1,,2174,2174,39,0,,12,,0,,,,,8,27652,26935,29,0,,,,,26458,,1041656,2184,1041656,2184,,,,,,0,,0 +"2021-02-17","IA",5306,,43,,,,235,0,,52,1017619,1933,,91925,2317402,,20,275713,275713,466,0,,58175,16843,54794,298944,305238,,0,1293332,2399,,1270242,108818,233113,1295703,2398,2630380,8078 +"2021-02-17","ID",1806,1589,3,217,6933,6933,177,43,1206,38,488806,2602,,,,,,167945,136513,462,0,,,,,,90300,,0,625319,2966,,78973,,,625319,2966,1043924,8805 +"2021-02-17","IL",22224,20057,25,2167,,,1719,0,,375,,0,,,,,176,1166717,,1795,0,,,,,,,,0,17320814,49937,,,,,,0,17320814,49937 +"2021-02-17","IN",12250,11825,19,425,42086,42086,955,246,7336,193,2410555,3587,,,,,98,651453,,923,0,,,,,741642,,,0,7624956,31115,,,,,3062008,4510,7624956,31115 +"2021-02-17","KS",4521,,115,,9002,9002,300,79,2432,68,940581,3799,,,,411,34,288717,,1267,0,,,,,,,,0,1229298,5066,,543223,,,1229298,5066,2382523,17858 +"2021-02-17","KY",4336,3941,18,395,18289,18289,934,106,3834,259,,0,,,,,128,391772,302264,1010,0,9225,34477,,,241502,46225,,0,3780152,6574,110306,431302,,,,0,3780152,6574 +"2021-02-17","LA",9391,8740,66,651,,,849,0,,,4946074,20670,,,,,126,421018,364024,624,0,,,,,,396834,,0,5367092,21294,,418034,,,,0,5310098,21225 +"2021-02-17","MA",15623,15312,56,311,19176,19176,1088,317,,273,4249632,6666,,,,,179,561936,533024,1360,0,,,14572,,637799,453740,,0,15140864,82971,,,151476,527202,4782656,7988,15140864,82971 +"2021-02-17","MD",7630,7449,18,181,34078,34078,1096,98,,272,2938416,4835,,167357,,,,372980,372980,759,0,,,26456,,454985,9571,,0,7519063,23155,,,193813,,3311396,5594,7519063,23155 +"2021-02-17","ME",654,640,3,14,1490,1490,91,3,,25,,0,14004,,,,9,42872,34120,104,0,781,9455,,,39473,12693,,0,1498314,10934,14797,176916,,,,0,1498314,10934 +"2021-02-17","MI",16160,15188,11,972,,,929,0,,237,,0,,,9304200,,116,632772,577203,1240,0,,,,,731226,517991,,0,10035426,28292,512204,,,,,0,10035426,28292 +"2021-02-17","MN",6390,6124,10,266,25287,25287,314,44,5212,54,2925345,4390,,,,,,475379,453324,758,0,,,,,,462502,6630126,18370,6630126,18370,,391083,,,3378669,5037,,0 +"2021-02-17","MO",7470,,12,,,,1279,0,,286,1825761,1901,122836,,3819449,,201,472741,472741,598,0,22615,77843,,,521735,,,0,4350392,7086,145644,763354,131050,321162,2298502,2499,4350392,7086 +"2021-02-17","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,135,135,1,0,,,,,,29,,0,17564,1,,,,,17542,0,26131,0 +"2021-02-17","MS",6524,4600,23,1924,8978,8978,587,0,,168,1393383,0,,,,,91,289398,180331,684,0,,,,,,264456,,0,1682781,684,79693,712107,,,,0,1573265,0 +"2021-02-17","MT",1334,,3,,4477,4477,91,16,,23,,0,,,,,14,97900,94892,234,0,,,,,,94034,,0,1029320,3953,,,,,,0,1029320,3953 +"2021-02-17","NC",10670,9482,108,1188,,,1954,0,,446,,0,,,,,,829507,728776,3167,0,,,,,,,,0,9058420,22102,,669667,,,,0,9058420,22102 +"2021-02-17","ND",1461,,0,,3850,3850,43,5,560,7,301563,472,11953,,,,,98901,93965,120,0,1442,,,,,96673,1384149,2979,1384149,2979,13395,123131,,,400464,592,1480207,4003 +"2021-02-17","NE",2018,,14,,5981,5981,185,17,,,753207,1520,,,2048349,,,197746,,299,0,,,,,229051,142335,,0,2279925,22132,,,,,951463,1824,2279925,22132 +"2021-02-17","NH",1148,,12,,1083,1083,126,3,338,,567204,888,,,,,,71965,50797,750,0,,,,,,67445,,0,1377103,6214,38765,172069,37226,,618001,1112,1377103,6214 +"2021-02-17","NJ",22632,20343,135,2289,62718,62718,2370,127,,411,9409262,75547,,,,,309,755174,673108,4109,0,,,,,,,,0,10164436,79656,,,,,,0,10082370,85239 +"2021-02-17","NM",3562,,12,,12790,12790,280,33,,,,0,,,,,,181332,,272,0,,,,,,125064,,0,2567877,11363,,,,,,0,2567877,11363 +"2021-02-17","NV",4774,,41,,,,740,0,,176,1094532,3701,,,,,110,289392,289392,363,0,,,,,,,2634991,8214,2634991,8214,,,,,1383924,4064,,0 +"2021-02-17","NY",37440,,112,,89995,89995,6574,0,,1273,,0,,,,,854,1548979,,6092,0,,,,,,,35523811,169963,35523811,169963,,,,,,0,,0 +"2021-02-17","OH",16513,14046,60,2467,48888,48888,1539,149,6974,447,,0,,,,,299,945107,814532,1816,0,,79767,,,843317,872282,,0,9671588,16874,,1529612,,,,0,9671588,16874 +"2021-02-17","OK",4089,,28,,23392,23392,711,122,,202,2984643,27038,,,2984643,,,415858,,1078,0,19845,,,,378721,393169,,0,3400501,28116,142681,,,,,0,3374098,30996 +"2021-02-17","OR",2138,,1,,8298,8298,231,113,,53,,0,,,3222103,,26,150875,,411,0,,,,,197882,,,0,3419985,35282,,,,,,0,3419985,35282 +"2021-02-17","PA",23319,,193,,,,2174,0,,465,3791021,7922,,,,,255,902650,779638,3413,0,,,,,,794332,9945410,34524,9945410,34524,,,,,4570659,10383,,0 +"2021-02-17","PR",1930,1640,6,290,,,241,0,,44,305972,0,,,395291,,42,98428,90989,111,0,76198,,,,20103,88381,,0,404400,111,,,,,,0,415664,0 +"2021-02-17","RI",2352,,8,,8811,8811,193,25,,30,652800,1773,,,2664274,,19,122440,,368,0,,,,,146052,,2810326,19330,2810326,19330,,,,,775240,2141,,0 +"2021-02-17","SC",8117,7248,62,869,19572,19572,1205,120,,278,4237377,8899,102961,,4114138,,162,492369,429494,1916,0,25408,100943,,,552733,223251,,0,4729746,10815,128369,777701,,,,0,4666871,9709 +"2021-02-17","SD",1844,,0,,6466,6466,94,5,,11,304204,286,,,,,4,110685,98499,92,0,,,,,103695,106769,,0,675610,1127,,,,,414889,378,675610,1127 +"2021-02-17","TN",10985,8834,31,2151,18120,18120,1245,57,,320,,0,,,5896787,,173,760303,639607,780,0,,131976,,,737650,729629,,0,6634437,7904,,1265367,,,,0,6634437,7904 +"2021-02-17","TX",40717,,72,,,,7609,0,,2324,,0,,,,,,2571063,2231717,3766,0,141470,188051,,,2521479,2268067,,0,18810731,0,987853,2200714,,,,0,18810731,0 +"2021-02-17","UT",1806,,9,,14294,14294,290,55,2248,99,1496497,3812,,,2423279,784,,363248,,901,0,,56228,,53890,336849,338469,,0,2760128,9213,,871265,,331311,1805277,4435,2760128,9213 +"2021-02-17","VA",7075,6080,38,995,23179,23179,1823,137,,386,,0,,,,,239,555592,439674,2284,0,26169,115591,,,536977,,5653212,19394,5653212,19394,216809,1258454,,,,0,,0 +"2021-02-17","VI",25,,0,,,,,0,,,42724,134,,,,,,2545,,3,0,,,,,,2441,,0,45269,137,,,,,45390,157,,0 +"2021-02-17","VT",191,,0,,,,46,0,,8,307199,1222,,,,,,13996,13599,79,0,,,,,,11072,,0,987188,9621,,,,,320798,1288,987188,9621 +"2021-02-17","WA",4709,,34,,18764,18764,704,121,,160,,0,,,4654384,,55,329746,312828,1699,0,,,,,312773,,4967466,71312,4967466,71312,,,,,,0,,0 +"2021-02-17","WI",6798,6214,10,584,25498,25498,385,76,2236,107,2575026,4228,,,,,,609189,556989,771,0,,,,,,540524,6563379,31540,6563379,31540,,,,,3132015,4885,,0 +"2021-02-17","WV",2225,1898,9,327,,,320,0,,74,,0,,,,,32,128405,102744,288,0,,,,,,115658,,0,2080039,8258,31951,,,,,0,2080039,8258 +"2021-02-17","WY",662,,0,,1363,1363,32,2,,,178042,227,,,569232,,,53450,45438,99,0,,,,,38213,52039,,0,615337,981,,,,,223480,278,615337,981 +"2021-02-16","AK",287,,5,,1233,1233,43,3,,,,0,,,1537830,,2,54736,,454,0,,,,,66077,,,0,1605827,21279,,,,,,0,1605827,21279 +"2021-02-16","AL",9257,7261,13,1996,44541,44541,1104,199,2607,,1857088,3250,,,,1479,,482488,378369,883,0,,,,,,264621,,0,2235457,3816,,,113087,,2235457,3816,,0 +"2021-02-16","AR",5287,4233,12,1054,14392,14392,638,37,,250,2340563,1608,,,2340563,1480,110,313525,248445,177,0,,,,76422,,299107,,0,2589008,1702,,,,414291,,0,2589008,1702 +"2021-02-16","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-16","AZ",14981,13253,3,1728,55865,55865,2047,88,,601,2896644,5017,,,,,383,799740,746150,1132,0,,,,,,,,0,7261560,18492,,,429909,,3642794,6118,7261560,18492 +"2021-02-16","CA",47107,,64,,,,9075,0,,2604,,0,,,,,,3412057,3412057,5692,0,,,,,,,,0,46227725,263598,,,,,,0,46227725,263598 +"2021-02-16","CO",5828,5108,2,720,22837,22837,441,25,,,2112499,1828,326436,,,,,415037,393088,668,0,52311,,,,,,5869369,8056,5869369,8056,380640,,,,2505587,2325,,0 +"2021-02-16","CT",7449,6106,2,1343,12257,12257,606,0,,,,0,,,5688069,,,270822,254194,580,0,,17701,,,309330,,,0,6004931,18312,,309117,,,,0,6004931,18312 +"2021-02-16","DC",982,,2,,,,204,0,,52,,0,,,,,21,39131,,130,0,,,,,,27930,1172768,0,1172768,0,,,,,425331,0,,0 +"2021-02-16","DE",1291,1168,8,123,,,186,0,,17,526389,305,,,,,,83369,79071,130,0,,,,,87082,,1327849,4758,1327849,4758,,,,,609758,435,,0 +"2021-02-16","FL",29659,,225,,77686,77686,4646,314,,,8881123,25432,813960,776136,15776618,,,1803893,1474383,6165,0,154948,,145802,,2360095,,20666077,90631,20666077,90631,969396,,922278,,10685016,31597,18222942,70063 +"2021-02-16","GA",16174,14176,246,1998,53658,53658,3119,255,8801,,,0,,,,,,969702,794349,2895,0,69353,,,,767461,,,0,6895381,24704,463685,,,,,0,6895381,24704 +"2021-02-16","GU",130,,0,,,,6,0,,2,105753,537,,,,,2,7701,7493,2,0,23,247,,,,7500,,0,113454,539,348,8837,,,,0,113246,539 +"2021-02-16","HI",426,426,0,,2174,2174,38,25,,14,,0,,,,,9,27623,26906,17,0,,,,,26433,,1039472,459,1039472,459,,,,,,0,,0 +"2021-02-16","IA",5263,,26,,,,255,0,,57,1015686,8318,,91894,2309877,,25,275247,275247,292,0,,58034,16712,54662,298412,303697,,0,1290933,8610,,1260611,108656,232344,1293305,8625,2622302,21221 +"2021-02-16","ID",1803,1587,0,216,6890,6890,180,0,1206,45,486204,0,,,,,,167483,136149,0,0,,,,,,89410,,0,622353,0,,78973,,,622353,0,1035119,0 +"2021-02-16","IL",22199,20034,33,2165,,,1726,0,,385,,0,,,,,179,1164922,,1348,0,,,,,,,,0,17270877,46630,,,,,,0,17270877,46630 +"2021-02-16","IN",12231,11805,40,426,41840,41840,1018,194,7312,201,2406968,2691,,,,,107,650530,,878,0,,,,,740557,,,0,7593841,20208,,,,,3057498,3569,7593841,20208 +"2021-02-16","KS",4406,,0,,8923,8923,279,0,2421,77,936782,0,,,,411,38,287450,,0,0,,,,,,,,0,1224232,0,,534602,,,1224232,0,2364665,0 +"2021-02-16","KY",4318,3925,27,393,18183,18183,935,97,3814,272,,0,,,,,133,390762,301646,1241,0,9187,34431,,,241069,46074,,0,3773578,2665,110221,427460,,,,0,3773578,2665 +"2021-02-16","LA",9325,8691,0,634,,,849,0,,,4925404,0,,,,,137,420394,363469,0,0,,,,,,380673,,0,5345798,0,,416361,,,,0,5288873,0 +"2021-02-16","MA",15567,15257,50,310,18859,18859,1096,0,,275,4242966,5070,,,,,177,560576,531702,1226,0,,,14572,,636172,453740,,0,15057893,46488,,,151476,524006,4774668,6037,15057893,46488 +"2021-02-16","MD",7612,7430,32,182,33980,33980,1110,77,,293,2933581,2843,,166267,,,,372221,372221,516,0,,,25610,,453991,9571,,0,7495908,9967,,,191877,,3305802,3359,7495908,9967 +"2021-02-16","ME",651,638,2,13,1487,1487,92,3,,24,,0,13938,,,,11,42768,34054,91,0,762,9374,,,39382,12663,,0,1487380,4553,14712,174557,,,,0,1487380,4553 +"2021-02-16","MI",16149,15177,19,972,,,939,0,,240,,0,,,9276991,,123,631532,576264,1124,0,,,,,730143,517991,,0,10007134,17169,511585,,,,,0,10007134,17169 +"2021-02-16","MN",6380,6115,2,265,25243,25243,315,46,5206,57,2920955,1987,,,,,,474621,452677,452,0,,,,,,461406,6611756,7852,6611756,7852,,387566,,,3373632,2356,,0 +"2021-02-16","MO",7458,,3,,,,1309,0,,296,1823860,1378,122633,,3813037,,197,472143,472143,481,0,22446,77551,,,521072,,,0,4343306,5297,145269,757763,130776,319507,2296003,1859,4343306,5297 +"2021-02-16","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,134,134,0,0,,,,,,29,,0,17563,0,,,,,17542,0,26131,0 +"2021-02-16","MS",6501,4594,37,1907,8978,8978,602,76,,157,1393383,0,,,,,97,288714,180207,734,0,,,,,,264456,,0,1682097,734,79693,712107,,,,0,1573265,0 +"2021-02-16","MT",1331,,3,,4461,4461,96,17,,26,,0,,,,,11,97666,94747,127,0,,,,,,93669,,0,1025367,1383,,,,,,0,1025367,1383 +"2021-02-16","NC",10562,9392,61,1170,,,1958,0,,473,,0,,,,,,826340,726761,1988,0,,,,,,,,0,9036318,21872,,662764,,,,0,9036318,21872 +"2021-02-16","ND",1461,,0,,3845,3845,46,8,559,8,301091,-451,11953,,,,,98781,93925,138,0,1442,,,,,96564,1381170,1828,1381170,1828,13395,120082,,,399872,483,1476204,2327 +"2021-02-16","NE",2004,,1,,5964,5964,177,2,,,751687,332,,,2027634,,,197447,,119,0,,,,,228110,142335,,0,2257793,3235,,,,,949639,452,2257793,3235 +"2021-02-16","NH",1136,,1,,1080,1080,119,3,336,,566316,-234,,,,,,71215,50573,198,0,,,,,,67222,,0,1370889,4473,38713,168093,37178,,616889,-139,1370889,4473 +"2021-02-16","NJ",22497,20251,31,2246,62591,62591,2411,137,,494,9333715,0,,,,,312,751065,669481,3633,0,,,,,,,,0,10084780,3633,,,,,,0,9997131,0 +"2021-02-16","NM",3550,,12,,12757,12757,290,41,,,,0,,,,,,181060,,299,0,,,,,,123507,,0,2556514,5282,,,,,,0,2556514,5282 +"2021-02-16","NV",4733,,13,,,,773,0,,193,1090831,3280,,,,,113,289029,289029,290,0,,,,,,,2626777,7971,2626777,7971,,,,,1379860,3570,,0 +"2021-02-16","NY",37328,,107,,89995,89995,6620,0,,1271,,0,,,,,878,1542887,,6753,0,,,,,,,35353848,136392,35353848,136392,,,,,,0,,0 +"2021-02-16","OH",16453,14000,59,2453,48739,48739,1566,104,6949,466,,0,,,,,303,943291,813465,2026,0,,79267,,,842377,867627,,0,9654714,35453,,1509229,,,,0,9654714,35453 +"2021-02-16","OK",4061,,20,,23270,23270,755,14,,229,2957605,0,,,2957605,,,414780,,508,0,19845,,,,376862,391156,,0,3372385,508,142681,,,,,0,3343102,0 +"2021-02-16","OR",2137,,0,,8185,8185,226,0,,51,,0,,,3187079,,27,150464,,183,0,,,,,196624,,,0,3384703,0,,,,,,0,3384703,0 +"2021-02-16","PA",23126,,7,,,,2356,0,,491,3783099,7712,,,,,271,899237,777177,2377,0,,,,,,791328,9910886,111004,9910886,111004,,,,,4560276,9584,,0 +"2021-02-16","PR",1924,1626,4,298,,,220,0,,42,305972,0,,,395291,,36,98317,90881,480,0,75980,,,,20103,88084,,0,404289,480,,,,,,0,415664,0 +"2021-02-16","RI",2344,,10,,8786,8786,197,32,,36,651027,1107,,,2645396,,20,122072,,285,0,,,,,145600,,2790996,10557,2790996,10557,,,,,773099,1392,,0 +"2021-02-16","SC",8055,7196,21,859,19452,19452,1230,31,,303,4228478,20359,102844,,4105323,,167,490453,428684,1435,0,25292,100338,,,551839,221360,,0,4718931,21794,128136,771148,,,,0,4657162,21280 +"2021-02-16","SD",1844,,0,,6461,6461,97,15,,10,303918,510,,,,,16,110593,98407,217,0,,,,,103588,106545,,0,674483,607,,,,,414511,727,674483,607 +"2021-02-16","TN",10954,8810,17,2144,18063,18063,1219,36,,329,,0,,,5889487,,173,759523,639126,962,0,,131553,,,737046,726910,,0,6626533,8252,,1255785,,,,0,6626533,8252 +"2021-02-16","TX",40645,,52,,,,7661,0,,2397,,0,,,,,,2567297,2229008,3348,0,141470,188051,,,2521479,2257030,,0,18810731,0,987853,2200714,,,,0,18810731,0 +"2021-02-16","UT",1797,,1,,14239,14239,297,30,2231,106,1492685,2278,,,2414764,779,,362347,,591,0,,55929,,53598,336151,336460,,0,2750915,5681,,860192,,328683,1800842,2685,2750915,5681 +"2021-02-16","VA",7037,6047,21,990,23042,23042,1849,98,,401,,0,,,,,241,553308,438276,1770,0,26000,114787,,,535437,,5633818,11473,5633818,11473,216440,1243658,,,,0,,0 +"2021-02-16","VI",25,,0,,,,,0,,,42590,0,,,,,,2542,,0,0,,,,,,2412,,0,45132,0,,,,,45233,0,,0 +"2021-02-16","VT",191,,1,,,,42,0,,12,305977,583,,,,,,13917,13533,55,0,,,,,,10803,,0,977567,2551,,,,,319510,638,977567,2551 +"2021-02-16","WA",4675,,0,,18643,18643,704,0,,160,,0,,,4584757,,48,328047,311288,0,0,,,,,311237,,4896154,0,4896154,0,,,,,,0,,0 +"2021-02-16","WI",6788,6204,39,584,25422,25422,411,82,2231,117,2570798,2594,,,,,,608418,556332,779,0,,,,,,539657,6531839,16160,6531839,16160,,,,,3127130,3218,,0 +"2021-02-16","WV",2216,1889,4,327,,,321,0,,82,,0,,,,,39,128117,102524,228,0,,,,,,114932,,0,2071781,6812,31906,,,,,0,2071781,6812 +"2021-02-16","WY",662,,15,,1361,1361,34,5,,,177815,2768,,,568297,,,53351,45387,215,0,,,,,38169,52000,,0,614356,9778,,,,,223202,2944,614356,9778 +"2021-02-15","AK",282,,0,,1230,1230,35,0,,,,0,,,1517076,,5,54282,,0,0,,,,,65613,,,0,1584548,0,,,,,,0,1584548,0 +"2021-02-15","AL",9244,7252,2,1992,44342,44342,1087,194,2605,,1853838,2230,,,,1479,,481605,377803,674,0,,,,,,264621,,0,2231641,2735,,,112933,,2231641,2735,,0 +"2021-02-15","AR",5275,4222,10,1053,14355,14355,642,23,,244,2338955,2537,,,2338955,1475,111,313348,248351,320,0,,,,76323,,297552,,0,2587306,2808,,,,410679,,0,2587306,2808 +"2021-02-15","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-15","AZ",14978,13250,0,1728,55777,55777,2119,110,,644,2891627,7240,,,,,397,798608,745049,1338,0,,,,,,,,0,7243068,24365,,,429882,,3636676,8513,7243068,24365 +"2021-02-15","CA",47043,,200,,,,9299,0,,2650,,0,,,,,,3406365,3406365,6487,0,,,,,,,,0,45964127,260910,,,,,,0,45964127,260910 +"2021-02-15","CO",5826,5106,2,720,22812,22812,462,15,,,2110671,2769,325347,,,,,414369,392591,533,0,52077,,,,,,5861313,9356,5861313,9356,378747,,,,2503262,3268,,0 +"2021-02-15","CT",7447,6105,66,1342,12257,12257,618,0,,,,0,,,5670458,,,270242,253656,2905,0,,17641,,,308684,,,0,5986619,88720,,306944,,,,0,5986619,88720 +"2021-02-15","DC",980,,1,,,,196,0,,46,,0,,,,,21,39001,,83,0,,,,,,27677,1172768,3084,1172768,3084,,,,,425331,488,,0 +"2021-02-15","DE",1283,1160,0,123,,,200,0,,19,526084,766,,,,,,83239,78954,236,0,,,,,86783,,1323091,3871,1323091,3871,,,,,609323,1002,,0 +"2021-02-15","FL",29434,,159,,77372,77372,4676,117,,,8855691,15019,813960,776136,15715678,,,1797728,1470839,3573,0,154948,,145802,,2351480,,20575446,49636,20575446,49636,969396,,922278,,10653419,18592,18152879,42868 +"2021-02-15","GA",15928,13997,57,1931,53403,53403,3181,24,8762,,,0,,,,,,966807,792509,2070,0,69202,,,,765545,,,0,6870677,17616,463362,,,,,0,6870677,17616 +"2021-02-15","GU",130,,0,,,,6,0,,3,105216,677,,,,,2,7699,7491,4,0,23,247,,,,7484,,0,112915,681,347,8785,,,,0,112707,687 +"2021-02-15","HI",426,426,0,,2149,2149,40,0,,13,,0,,,,,10,27606,26889,33,0,,,,,26420,,1039013,4273,1039013,4273,,,,,,0,,0 +"2021-02-15","IA",5237,,1,,,,242,0,,57,1007368,1117,,91098,2289099,,28,274955,274955,214,0,,57858,16436,54498,298099,302158,,0,1282323,1331,,1246489,107584,230635,1284680,1333,2601081,4219 +"2021-02-15","ID",1803,1587,0,216,6890,6890,180,0,1206,45,486204,0,,,,,,167483,136149,0,0,,,,,,89410,,0,622353,0,,78973,,,622353,0,1035119,0 +"2021-02-15","IL",22166,20002,45,2164,,,1789,0,,389,,0,,,,,184,1163574,,1420,0,,,,,,,,0,17224247,52389,,,,,,0,17224247,52389 +"2021-02-15","IN",12191,11765,18,426,41646,41646,1066,42,7285,200,2404277,3324,,,,,104,649652,,777,0,,,,,739554,,,0,7573633,16103,,,,,3053929,4101,7573633,16103 +"2021-02-15","KS",4406,,42,,8923,8923,279,36,2421,77,936782,5295,,,,411,38,287450,,1348,0,,,,,,,,0,1224232,6643,,534602,,,1224232,6643,2364665,18212 +"2021-02-15","KY",4291,3901,9,390,18086,18086,969,32,3791,268,,0,,,,,132,389521,300855,723,0,9170,34267,,,240831,45949,,0,3770913,12649,110164,425426,,,,0,3770913,12649 +"2021-02-15","LA",9325,8691,33,634,,,849,0,,,4925404,7261,,,,,137,420394,363469,503,0,,,,,,380673,,0,5345798,7764,,416361,,,,0,5288873,7744 +"2021-02-15","MA",15517,15208,33,309,18859,18859,1107,0,,286,4237896,8588,,,,,174,559350,530735,1573,0,,,14572,,634991,453740,,0,15011405,62852,,,151476,520326,4768631,10068,15011405,62852 +"2021-02-15","MD",7580,7400,26,180,33903,33903,1113,95,,285,2930738,4336,,166267,,,,371705,371705,722,0,,,25610,,453329,9569,,0,7485941,19761,,,191877,,3302443,5058,7485941,19761 +"2021-02-15","ME",649,636,0,13,1484,1484,94,0,,25,,0,13938,,,,10,42677,34003,148,0,762,9343,,,39311,12656,,0,1482827,4330,14712,173565,,,,0,1482827,4330 +"2021-02-15","MI",16130,15158,11,972,,,957,0,,258,,0,,,9260443,,135,630408,575489,1452,0,,,,,729522,517991,,0,9989965,51616,510509,,,,,0,9989965,51616 +"2021-02-15","MN",6378,6113,2,265,25197,25197,326,41,5197,73,2918968,5130,,,,,,474169,452308,602,0,,,,,,460537,6603904,17423,6603904,17423,,386181,,,3371276,5677,,0 +"2021-02-15","MO",7455,,0,,,,1402,0,,297,1822482,2039,122320,,3808290,,195,471662,471662,421,0,22321,77279,,,520528,,,0,4338009,6266,144829,754799,130451,318268,2294144,2460,4338009,6266 +"2021-02-15","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,134,134,0,0,,,,,,29,,0,17563,0,,,,,17542,0,26131,0 +"2021-02-15","MS",6464,4570,2,1894,8902,8902,599,0,,153,1393383,32746,,,,,96,287980,179882,544,0,,,,,,253140,,0,1681363,33290,79693,712107,,,,0,1573265,35171 +"2021-02-15","MT",1328,,1,,4444,4444,92,5,,24,,0,,,,,15,97539,94708,138,0,,,,,,93476,,0,1023984,2923,,,,,,0,1023984,2923 +"2021-02-15","NC",10501,9345,10,1156,,,1941,0,,471,,0,,,,,,824352,725385,2458,0,,,,,,,,0,9014446,31628,,657215,,,,0,9014446,31628 +"2021-02-15","ND",1461,,0,,3837,3837,42,6,557,6,301542,0,11953,,,,,98643,93832,46,0,1442,,,,,96445,1379342,1051,1379342,1051,13395,118254,,,399389,59,1473877,1357 +"2021-02-15","NE",2003,,1,,5962,5962,195,12,,,751355,304,,,2024401,,,197328,,92,0,,,,,227945,142335,,0,2254558,1639,,,,,949187,396,2254558,1639 +"2021-02-15","NH",1135,,2,,1077,1077,125,2,336,,566550,431,,,,,,71017,50478,232,0,,,,,,66929,,0,1366416,3268,38697,165284,37164,,617028,609,1366416,3268 +"2021-02-15","NJ",22466,20220,12,2246,62454,62454,2408,48,,513,9333715,0,,,,,298,747432,666399,1445,0,,,,,,,,0,10081147,1445,,,,,,0,9997131,0 +"2021-02-15","NM",3538,,9,,12716,12716,286,37,,,,0,,,,,,180761,,190,0,,,,,,121606,,0,2551232,7887,,,,,,0,2551232,7887 +"2021-02-15","NV",4720,,11,,,,755,0,,197,1087551,1666,,,,,117,288739,288739,391,0,,,,,,,2618806,6386,2618806,6386,,,,,1376290,2057,,0 +"2021-02-15","NY",37221,,103,,89995,89995,6623,0,,1270,,0,,,,,875,1536134,,6365,0,,,,,,,35217456,180504,35217456,180504,,,,,,0,,0 +"2021-02-15","OH",16394,13945,48,2449,48635,48635,1633,79,6939,474,,0,,,,,306,941265,812300,1915,0,,78792,,,841077,862328,,0,9619261,31786,,1498164,,,,0,9619261,31786 +"2021-02-15","OK",4041,,17,,23256,23256,755,8,,229,2957605,0,,,2957605,,,414272,,730,0,19845,,,,376862,389035,,0,3371877,730,142681,,,,,0,3343102,0 +"2021-02-15","OR",2137,,0,,8185,8185,226,0,,51,,0,,,3187079,,27,150281,,247,0,,,,,196624,,,0,3384703,0,,,,,,0,3384703,0 +"2021-02-15","PA",23119,,23,,,,2447,0,,504,3775387,7281,,,,,265,896860,775305,1945,0,,,,,,776339,9799882,0,9799882,0,,,,,4550692,8972,,0 +"2021-02-15","PR",1920,1623,1,297,,,209,0,,48,305972,0,,,395291,,42,97837,90429,228,0,75515,,,,20103,87661,,0,403809,228,,,,,,0,415664,0 +"2021-02-15","RI",2334,,2,,8754,8754,181,65,,35,649920,780,,,2635191,,16,121787,,203,0,,,,,145248,,2780439,5975,2780439,5975,,,,,771707,983,,0 +"2021-02-15","SC",8034,7180,36,854,19421,19421,1222,25,,301,4208119,23386,102747,,4085302,,173,489018,427763,1725,0,25243,100035,,,550580,220197,,0,4697137,25111,127990,768324,,,,0,4635882,24569 +"2021-02-15","SD",1844,,0,,6446,6446,86,8,,12,303408,275,,,,,16,110376,98253,61,0,,,,,103532,106440,,0,673876,918,,,,,413784,336,673876,918 +"2021-02-15","TN",10937,8797,4,2140,18027,18027,1221,10,,332,,0,,,5881967,,180,758561,638550,1143,0,,131141,,,736314,724031,,0,6618281,11332,,1243972,,,,0,6618281,11332 +"2021-02-15","TX",40593,,66,,,,7824,0,,2428,,0,,,,,,2563949,2225399,3889,0,141470,188051,,,2521479,2260840,,0,18810731,0,987853,2200714,,,,0,18810731,0 +"2021-02-15","UT",1796,,2,,14209,14209,298,20,2228,104,1490407,2588,,,2409538,778,,361756,,462,0,,55672,,53353,335696,335049,,0,2745234,5736,,855888,,327353,1798157,2997,2745234,5736 +"2021-02-15","VA",7016,6028,4,988,22944,22944,1833,38,,398,,0,,,,,251,551538,437262,1539,0,25904,114185,,,534179,,5622345,14695,5622345,14695,216124,1231738,,,,0,,0 +"2021-02-15","VI",25,,0,,,,,0,,,42590,666,,,,,,2542,,18,0,,,,,,2412,,0,45132,684,,,,,45233,686,,0 +"2021-02-15","VT",190,,1,,,,40,0,,12,305394,1256,,,,,,13862,13478,185,0,,,,,,10798,,0,975016,8323,,,,,318872,1402,975016,8323 +"2021-02-15","WA",4675,,0,,18643,18643,704,0,,160,,0,,,4584757,,48,328047,311288,0,0,,,,,311237,,4896154,0,4896154,0,,,,,,0,,0 +"2021-02-15","WI",6749,6166,4,583,25340,25340,413,38,2226,118,2568204,3681,,,,,,607639,555708,426,0,,,,,,538767,6515679,15430,6515679,15430,,,,,3123912,4086,,0 +"2021-02-15","WV",2212,1886,2,326,,,319,0,,80,,0,,,,,46,127889,102399,301,0,,,,,,113994,,0,2064969,5409,31867,,,,,0,2064969,5409 +"2021-02-15","WY",647,,0,,1356,1356,44,0,,,175047,0,,,559222,,,53136,45225,0,0,,,,,37735,51716,,0,604578,0,,,,,220258,0,604578,0 +"2021-02-14","AK",282,,0,,1230,1230,35,0,,,,0,,,1517076,,5,54282,,0,0,,,,,65613,,,0,1584548,0,,,,,,0,1584548,0 +"2021-02-14","AL",9242,7250,0,1992,44148,44148,1136,0,2605,,1851608,3050,,,,1479,,480931,377298,1075,0,,,,,,264621,,0,2228906,3890,,,112730,,2228906,3890,,0 +"2021-02-14","AR",5265,4212,13,1053,14332,14332,669,34,,254,2336418,5553,,,2336418,1474,109,313028,248080,466,0,,,,76255,,296050,,0,2584498,5986,,,,409453,,0,2584498,5986 +"2021-02-14","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-14","AZ",14978,13250,30,1728,55667,55667,2213,108,,661,2884387,9627,,,,,399,797270,743776,1947,0,,,,,,,,0,7218703,39033,,,429001,,3628163,11437,7218703,39033 +"2021-02-14","CA",46843,,408,,,,9636,0,,2733,,0,,,,,,3399878,3399878,8842,0,,,,,,,,0,45703217,291580,,,,,,0,45703217,291580 +"2021-02-14","CO",5824,5104,10,720,22797,22797,485,19,,,2107902,4289,324201,,,,,413836,392092,853,0,51825,,,,,,5851957,22002,5851957,22002,377424,,,,2499994,5124,,0 +"2021-02-14","CT",7381,6049,0,1332,12257,12257,674,0,,,,0,,,5585218,,,267337,250915,0,0,,17354,,,305265,,,0,5897899,0,,299011,,,,0,5897899,0 +"2021-02-14","DC",979,,0,,,,197,0,,50,,0,,,,,24,38918,,122,0,,,,,,27677,1169684,5762,1169684,5762,,,,,424843,-1987,,0 +"2021-02-14","DE",1283,1160,1,123,,,216,0,,18,525318,1313,,,,,,83003,78743,331,0,,,,,86579,,1319220,9832,1319220,9832,,,,,608321,1644,,0 +"2021-02-14","FL",29275,,96,,77255,77255,4672,121,,,8840672,24458,813960,776136,15678301,,,1794155,1467690,5328,0,154948,,145802,,2346147,,20525810,77846,20525810,77846,969396,,922278,,10634827,29786,18110011,65503 +"2021-02-14","GA",15871,13964,21,1907,53379,53379,3271,39,8760,,,0,,,,,,964737,790779,1929,0,68803,,,,763583,,,0,6853061,24113,462492,,,,,0,6853061,24113 +"2021-02-14","GU",130,,0,,,,6,0,,3,104539,0,,,,,2,7695,7487,3,0,23,247,,,,7472,,0,112234,3,347,8727,,,,0,112020,0 +"2021-02-14","HI",426,426,1,,2149,2149,40,0,,13,,0,,,,,10,27573,26856,46,0,,,,,26354,,1034740,5584,1034740,5584,,,,,,0,,0 +"2021-02-14","IA",5236,,0,,,,240,0,,57,1006251,1304,,90583,2285173,,29,274741,274741,355,0,,57745,16331,54378,297817,301774,,0,1280992,1659,,1243995,106966,230121,1283347,1655,2596862,4711 +"2021-02-14","ID",1803,1587,7,216,6890,6890,180,15,1206,45,486204,726,,,,,,167483,136149,258,0,,,,,,89410,,0,622353,926,,78973,,,622353,926,1035119,2296 +"2021-02-14","IL",22121,19961,34,2160,,,1777,0,,373,,0,,,,,189,1162154,,1631,0,,,,,,,,0,17171858,64949,,,,,,0,17171858,64949 +"2021-02-14","IN",12173,11746,24,427,41604,41604,1031,74,7283,214,2400953,4756,,,,,108,648875,,1218,0,,,,,738594,,,0,7557530,40801,,,,,3049828,5974,7557530,40801 +"2021-02-14","KS",4364,,0,,8887,8887,348,0,2413,87,931487,0,,,,411,42,286102,,0,0,,,,,,,,0,1217589,0,,527485,,,1217589,0,2346453,0 +"2021-02-14","KY",4282,3893,10,389,18054,18054,1019,112,3786,270,,0,,,,,147,388798,300366,1708,0,9089,34178,,,240169,45880,,0,3758264,0,110038,422540,,,,0,3758264,0 +"2021-02-14","LA",9292,8663,16,629,,,875,0,,,4918143,30446,,,,,142,419891,362986,1306,0,,,,,,380673,,0,5338034,31752,,415886,,,,0,5281129,31571 +"2021-02-14","MA",15484,15176,60,308,18859,18859,1125,0,,290,4229308,10250,,,,,183,557777,529255,1882,0,,,14572,,633210,453740,,0,14948553,110894,,,151476,518763,4758563,12070,14948553,110894 +"2021-02-14","MD",7554,7374,18,180,33808,33808,1166,80,,293,2926402,5051,,166267,,,,370983,370983,847,0,,,25610,,452414,9569,,0,7466180,36438,,,191877,,3297385,5898,7466180,36438 +"2021-02-14","ME",649,636,2,13,1484,1484,101,8,,28,,0,13938,,,,10,42529,33935,110,0,762,9243,,,39224,12645,,0,1478497,9627,14712,171004,,,,0,1478497,9627 +"2021-02-14","MI",16119,15150,0,969,,,1024,0,,293,,0,,,9210589,,123,628956,574224,0,0,,,,,727760,517991,,0,9938349,0,509378,,,,,0,9938349,0 +"2021-02-14","MN",6376,6111,7,265,25156,25156,326,40,5190,73,2913838,8955,,,,,,473567,451761,776,0,,,,,,459525,6586481,22993,6586481,22993,,385398,,,3365599,9594,,0 +"2021-02-14","MO",7455,,2,,,,1438,0,,305,1820443,2829,122257,,3802479,,207,471241,471241,489,0,22266,77161,,,520075,,,0,4331743,10569,144711,753372,130372,317603,2291684,3318,4331743,10569 +"2021-02-14","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,134,134,0,0,,,,,,29,,0,17563,0,,,,,17542,0,26131,0 +"2021-02-14","MS",6462,4569,1,1893,8902,8902,648,0,,165,1360637,0,,,,,108,287436,179575,1093,0,,,,,,253140,,0,1648073,1093,77438,680977,,,,0,1538094,0 +"2021-02-14","MT",1327,,0,,4439,4439,92,-2,,24,,0,,,,,15,97401,94591,104,0,,,,,,93328,,0,1021061,3082,,,,,,0,1021061,3082 +"2021-02-14","NC",10491,9337,38,1154,,,1989,0,,481,,0,,,,,,821894,723162,3170,0,,,,,,,,0,8982818,46585,,653807,,,,0,8982818,46585 +"2021-02-14","ND",1461,,0,,3831,3831,38,3,557,6,301542,0,11953,,,,,98597,93789,46,0,1442,,,,,96404,1378291,926,1378291,926,13395,117898,,,399330,144,1472520,1242 +"2021-02-14","NE",2002,,0,,5950,5950,197,8,,,751051,781,,,2023233,,,197236,,209,0,,,,,227838,142312,,0,2252919,5671,,,,,948791,992,2252919,5671 +"2021-02-14","NH",1133,,3,,1075,1075,126,2,336,,566119,412,,,,,,70785,50300,280,0,,,,,,66287,,0,1363148,7896,38670,164366,37136,,616419,620,1363148,7896 +"2021-02-14","NJ",22454,20208,14,2246,62406,62406,2449,59,,520,9333715,0,,,,,326,745987,665197,2168,0,,,,,,,,0,10079702,2168,,,,,,0,9997131,0 +"2021-02-14","NM",3529,,13,,12679,12679,292,22,,,,0,,,,,,180571,,282,0,,,,,,120051,,0,2543345,8060,,,,,,0,2543345,8060 +"2021-02-14","NV",4709,,15,,,,827,0,,201,1085885,2147,,,,,127,288348,288348,512,0,,,,,,,2612420,8210,2612420,8210,,,,,1374233,2659,,0 +"2021-02-14","NY",37118,,109,,89995,89995,6593,0,,1285,,0,,,,,881,1529769,,8316,0,,,,,,,35036952,234708,35036952,234708,,,,,,0,,0 +"2021-02-14","OH",16346,13904,6,2442,48556,48556,1657,64,6933,452,,0,,,,,285,939350,810922,1809,0,,78452,,,839477,859221,,0,9587475,27695,,1493863,,,,0,9587475,27695 +"2021-02-14","OK",4024,,30,,23248,23248,755,98,,229,2957605,0,,,2957605,,,413542,,1266,0,19845,,,,376862,387837,,0,3371147,1266,142681,,,,,0,3343102,0 +"2021-02-14","OR",2137,,43,,8185,8185,226,0,,51,,0,,,3187079,,27,150034,,458,0,,,,,196624,,,0,3384703,0,,,,,,0,3384703,0 +"2021-02-14","PA",23096,,24,,,,2348,0,,503,3768106,10202,,,,,263,894915,773614,2571,0,,,,,,776339,9799882,0,9799882,0,,,,,4541720,12364,,0 +"2021-02-14","PR",1919,1623,4,296,,,216,0,,50,305972,0,,,395291,,46,97609,90226,296,0,75188,,,,20103,87616,,0,403581,296,,,,,,0,415664,0 +"2021-02-14","RI",2332,,3,,8689,8689,222,0,,39,649140,1525,,,2629454,,20,121584,,320,0,,,,,145010,,2774464,14090,2774464,14090,,,,,770724,1845,,0 +"2021-02-14","SC",7998,7149,87,849,19396,19396,1269,89,,313,4184733,36125,102532,,4062334,,184,487293,426580,4153,0,25072,99645,,,548979,218717,,0,4672026,40278,127604,764008,,,,0,4611313,38994 +"2021-02-14","SD",1844,,6,,6438,6438,87,7,,12,303133,490,,,,,16,110315,98208,110,0,,,,,103461,106398,,0,672958,1483,,,,,413448,600,672958,1483 +"2021-02-14","TN",10933,8793,31,2140,18017,18017,1246,20,,313,,0,,,5871524,,182,757418,637753,1347,0,,130775,,,735425,722598,,0,6606949,14674,,1240889,,,,0,6606949,14674 +"2021-02-14","TX",40527,,149,,,,8107,0,,2473,,0,,,,,,2560060,2221955,6933,0,141470,188051,,,2521479,2231709,,0,18810731,109964,987853,2200714,,,,0,18810731,109964 +"2021-02-14","UT",1794,,4,,14189,14189,307,38,2227,111,1487819,2986,,,2404263,777,,361294,,710,0,,55612,,53295,335235,334201,,0,2739498,6690,,854980,,327037,1795160,3453,2739498,6690 +"2021-02-14","VA",7012,6024,16,988,22906,22906,1906,60,,392,,0,,,,,238,549999,436206,2575,0,25842,113849,,,532833,,5607650,24395,5607650,24395,215925,1228812,,,,0,,0 +"2021-02-14","VI",25,,0,,,,,0,,,41924,0,,,,,,2524,,0,0,,,,,,2399,,0,44448,0,,,,,44547,0,,0 +"2021-02-14","VT",189,,0,,,,49,0,,11,304138,919,,,,,,13677,13332,116,0,,,,,,10659,,0,966693,8027,,,,,317470,1032,966693,8027 +"2021-02-14","WA",4675,,0,,18643,18643,704,39,,160,,0,,,4584757,,48,328047,311288,880,0,,,,,311237,,4896154,29161,4896154,29161,,,,,,0,,0 +"2021-02-14","WI",6745,6162,1,583,25302,25302,402,34,2220,116,2564523,3683,,,,,,607213,555303,562,0,,,,,,537955,6500249,20460,6500249,20460,,,,,3119826,4186,,0 +"2021-02-14","WV",2210,1884,9,326,,,327,0,,80,,0,,,,,43,127588,102192,306,0,,,,,,113555,,0,2059560,6514,31822,,,,,0,2059560,6514 +"2021-02-14","WY",647,,0,,1356,1356,44,45,,,175047,0,,,559222,,,53136,45225,50,0,,,,,37735,51716,,0,604578,0,,,,,220258,0,604578,0 +"2021-02-13","AK",282,,0,,1230,1230,35,0,,,,0,,,1517076,,5,54282,,0,0,,,,,65613,,,0,1584548,0,,,,,,0,1584548,0 +"2021-02-13","AL",9242,7250,62,1992,44148,44148,1140,0,2604,,1848558,6042,,,,1479,,479856,376458,1189,0,,,,,,264621,,0,2225016,6873,,,112337,,2225016,6873,,0 +"2021-02-13","AR",5252,4201,40,1051,14298,14298,690,20,,256,2330865,7949,,,2330865,1474,113,312562,247647,954,0,,,,76184,,295061,,0,2578512,8568,,,,408314,,0,2578512,8568 +"2021-02-13","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-13","AZ",14948,13229,114,1719,55559,55559,2300,146,,701,2874760,9905,,,,,412,795323,741966,1791,0,,,,,,,,0,7179670,38753,,,428010,,3616726,11557,7179670,38753 +"2021-02-13","CA",46435,,433,,,,9998,0,,2808,,0,,,,,,3391036,3391036,9421,0,,,,,,,,0,45411637,286196,,,,,,0,45411637,286196 +"2021-02-13","CO",5814,5094,24,720,22778,22778,481,75,,,2103613,5157,322549,,,,,412983,391257,1209,0,51235,,,,,,5829955,30597,5829955,30597,376026,,,,2494870,6261,,0 +"2021-02-13","CT",7381,6049,0,1332,12257,12257,674,0,,,,0,,,5585218,,,267337,250915,0,0,,17354,,,305265,,,0,5897899,0,,299011,,,,0,5897899,0 +"2021-02-13","DC",979,,3,,,,191,0,,48,,0,,,,,26,38796,,126,0,,,,,,27549,1163922,9613,1163922,9613,,,,,426830,-751,,0 +"2021-02-13","DE",1282,1159,13,123,,,282,0,,20,524005,2034,,,,,,82672,78459,409,0,,,,,86129,,1309388,9113,1309388,9113,,,,,606677,2443,,0 +"2021-02-13","FL",29179,,118,,77134,77134,4681,261,,,8816214,28940,813960,776136,15620610,,,1788827,1463518,7377,0,154948,,145802,,2338601,,20447964,104841,20447964,104841,969396,,922278,,10605041,36317,18044508,80932 +"2021-02-13","GA",15850,13961,142,1889,53340,53340,3385,229,8756,,,0,,,,,,962808,789070,3823,0,68116,,,,761246,,,0,6828948,35988,460940,,,,,0,6828948,35988 +"2021-02-13","GU",130,,0,,,,7,0,,4,104539,0,,,,,2,7692,7484,3,0,23,247,,,,7472,,0,112231,3,347,8727,,,,0,112020,0 +"2021-02-13","HI",425,425,0,,2149,2149,40,0,,13,,0,,,,,10,27527,26810,67,0,,,,,26354,,1029156,5604,1029156,5604,,,,,,0,,0 +"2021-02-13","IA",5236,,13,,,,225,0,,55,1004947,1392,,90406,2280957,,33,274386,274386,450,0,,57698,16244,54333,297412,301196,,0,1279333,1842,,1242704,106700,229994,1281692,1839,2592151,6342 +"2021-02-13","ID",1796,1582,5,214,6875,6875,180,23,1204,45,485478,1246,,,,,,167225,135949,349,0,,,,,,89126,,0,621427,1484,,78973,,,621427,1484,1032823,4967 +"2021-02-13","IL",22087,19926,60,2161,,,1892,0,,425,,0,,,,,202,1160523,,2092,0,,,,,,,,0,17106909,84990,,,,,,0,17106909,84990 +"2021-02-13","IN",12149,11722,32,427,41530,41530,1079,71,7267,211,2396197,6068,,,,,109,647657,,1232,0,,,,,737120,,,0,7516729,46516,,,,,3043854,7300,7516729,46516 +"2021-02-13","KS",4364,,0,,8887,8887,348,0,2413,87,931487,0,,,,411,42,286102,,0,0,,,,,,,,0,1217589,0,,527485,,,1217589,0,2346453,0 +"2021-02-13","KY",4272,3884,19,388,17942,17942,1059,13,3774,266,,0,,,,,143,387090,299318,764,0,9089,34178,,,240169,45606,,0,3758264,7577,110038,422540,,,,0,3758264,7577 +"2021-02-13","LA",9276,8646,0,630,,,1001,0,,,4887697,0,,,,,151,418585,361861,0,0,,,,,,380673,,0,5306282,0,,412988,,,,0,5249558,0 +"2021-02-13","MA",15424,15116,66,308,18859,18859,1149,0,,291,4219058,10085,,,,,196,555895,527435,2083,0,,,14572,,631088,453740,,0,14837659,99915,,,151476,516146,4746493,12034,14837659,99915 +"2021-02-13","MD",7536,7356,33,180,33728,33728,1192,99,,316,2921351,7608,,166267,,,,370136,370136,1159,0,,,25610,,451276,9565,,0,7429742,41128,,,191877,,3291487,8767,7429742,41128 +"2021-02-13","ME",647,634,4,13,1476,1476,100,7,,27,,0,13938,,,,9,42419,33823,160,0,762,9243,,,39087,12641,,0,1468870,7598,14712,170971,,,,0,1468870,7598 +"2021-02-13","MI",16119,15150,92,969,,,1024,0,,293,,0,,,9210589,,123,628956,574224,944,0,,,,,727760,517991,,0,9938349,34182,509378,,,,,0,9938349,34182 +"2021-02-13","MN",6369,6104,7,265,25116,25116,326,69,5183,73,2904883,7153,,,,,,472791,451122,940,0,,,,,,458492,6563488,27770,6563488,27770,,381199,,,3356005,7962,,0 +"2021-02-13","MO",7453,,11,,,,1490,0,,327,1817614,2745,122126,,3792467,,211,470752,470752,645,0,22193,76962,,,519546,,,0,4321174,10112,144507,748734,130204,315781,2288366,3390,4321174,10112 +"2021-02-13","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,134,134,0,0,,,,,,29,,0,17563,0,,,,,17542,0,26131,0 +"2021-02-13","MS",6461,4568,32,1893,8902,8902,648,0,,165,1360637,0,,,,,108,286343,179167,695,0,,,,,,253140,,0,1646980,695,77438,680977,,,,0,1538094,0 +"2021-02-13","MT",1327,,3,,4441,4441,92,9,,24,,0,,,,,15,97297,94499,234,0,,,,,,93148,,0,1017979,5734,,,,,,0,1017979,5734 +"2021-02-13","NC",10453,9306,77,1147,,,2101,0,,496,,0,,,,,,818724,720453,4130,0,,,,,,,,0,8936233,46903,,649506,,,,0,8936233,46903 +"2021-02-13","ND",1461,,0,,3828,3828,36,1,557,6,301542,0,11953,,,,,98551,93764,85,0,1442,,,,,96305,1377365,1152,1377365,1152,13395,117414,,,399186,-822,1471278,1640 +"2021-02-13","NE",2002,,0,,5942,5942,201,6,,,750270,2051,,,2018183,,,197027,,1542,0,,,,,227596,142112,,0,2247248,15802,,,,,947799,3610,2247248,15802 +"2021-02-13","NH",1130,,4,,1073,1073,128,2,336,,565707,527,,,,,,70505,50092,433,0,,,,,,66122,,0,1355252,13771,38628,163630,37090,,615799,809,1355252,13771 +"2021-02-13","NJ",22440,20194,47,2246,62347,62347,2514,126,,519,9333715,65979,,,,,343,743819,663416,3757,0,,,,,,,,0,10077534,69736,,,,,,0,9997131,69328 +"2021-02-13","NM",3516,,14,,12657,12657,341,23,,,,0,,,,,,180289,,565,0,,,,,,118926,,0,2535285,23184,,,,,,0,2535285,23184 +"2021-02-13","NV",4694,,31,,,,827,0,,201,1083738,3295,,,,,127,287836,287836,813,0,,,,,,,2604210,13564,2604210,13564,,,,,1371574,4108,,0 +"2021-02-13","NY",37009,,127,,89995,89995,6888,0,,1328,,0,,,,,908,1521453,,8763,0,,,,,,,34802244,253563,34802244,253563,,,,,,0,,0 +"2021-02-13","OH",16340,13898,1204,2442,48492,48492,1703,81,6925,462,,0,,,,,282,937541,809589,2799,0,,77974,,,837622,855734,,0,9559780,35120,,1483582,,,,0,9559780,35120 +"2021-02-13","OK",3994,,35,,23150,23150,755,65,,229,2957605,9971,,,2957605,,,412276,,1458,0,19845,,,,376862,386420,,0,3369881,11429,142681,,,,,0,3343102,10472 +"2021-02-13","OR",2094,,38,,8185,8185,226,23,,51,,0,,,3187079,,27,149576,,494,0,,,,,196624,,,0,3384703,20326,,,,,,0,3384703,20326 +"2021-02-13","PA",23072,,113,,,,2452,0,,489,3757904,13578,,,,,271,892344,771452,4088,0,,,,,,776339,9799882,72154,9799882,72154,,,,,4529356,16945,,0 +"2021-02-13","PR",1915,1619,8,296,,,213,0,,45,305972,0,,,395291,,45,97313,89957,389,0,74370,,,,20103,87165,,0,403285,389,,,,,,0,415664,0 +"2021-02-13","RI",2329,,39,,8689,8689,222,0,,39,647615,1448,,,2615737,,20,121264,,443,0,,,,,144637,,2760374,23401,2760374,23401,,,,,768879,1891,,0 +"2021-02-13","SC",7911,7072,17,839,19307,19307,1302,102,,301,4148608,32800,102162,,4027772,,174,483140,423711,2983,0,24790,98715,,,544547,217023,,0,4631748,35783,126952,754716,,,,0,4572319,34635 +"2021-02-13","SD",1838,,7,,6431,6431,82,6,,12,302643,535,,,,,13,110205,98106,137,0,,,,,103366,106248,,0,671475,1663,,,,,412848,672,671475,1663 +"2021-02-13","TN",10902,8769,9,2133,17997,17997,1285,28,,331,,0,,,5857936,,181,756071,636791,1792,0,,130365,,,734339,720977,,0,6592275,20034,,1236965,,,,0,6592275,20034 +"2021-02-13","TX",40378,,283,,,,8395,0,,2543,,0,,,,,,2553127,2215885,11282,0,139990,186571,,,2510207,2220233,,0,18700767,95013,983897,2168000,,,,0,18700767,95013 +"2021-02-13","UT",1790,,5,,14151,14151,333,48,2225,116,1484833,3591,,,2398120,776,,360584,,943,0,,55400,,53095,334688,332702,,0,2732808,9475,,851984,,325855,1791707,4223,2732808,9475 +"2021-02-13","VA",6996,6010,30,986,22846,22846,1991,128,,408,,0,,,,,262,547424,434413,3215,0,25630,113322,,,530908,,5583255,29300,5583255,29300,215396,1222541,,,,0,,0 +"2021-02-13","VI",25,,0,,,,,0,,,41924,0,,,,,,2524,,0,0,,,,,,2399,,0,44448,0,,,,,44547,0,,0 +"2021-02-13","VT",189,,0,,,,49,0,,8,303219,442,,,,,,13561,13219,146,0,,,,,,10547,,0,958666,-2876,,,,,316438,587,958666,-2876 +"2021-02-13","WA",4675,,42,,18604,18604,704,73,,160,,0,,,4556332,,48,327167,310541,1008,0,,,,,310521,,4866993,26917,4866993,26917,,,,,,0,,0 +"2021-02-13","WI",6744,6161,10,583,25268,25268,461,71,2219,120,2560840,3752,,,,,,606651,554800,866,0,,,,,,536864,6479789,25645,6479789,25645,,,,,3115640,4504,,0 +"2021-02-13","WV",2201,1875,1,326,,,321,0,,77,,0,,,,,37,127282,101966,395,0,,,,,,112541,,0,2053046,10468,31742,,,,,0,2053046,10468 +"2021-02-13","WY",647,,0,,1311,1311,44,0,,,175047,0,,,559222,,,53086,45211,0,0,,,,,37735,51640,,0,604578,0,,,,,220258,0,604578,0 +"2021-02-12","AK",282,,2,,1230,1230,35,3,,,,0,,,1517076,,5,54282,,148,0,,,,,65613,,,0,1584548,7192,,,,,,0,1584548,7192 +"2021-02-12","AL",9180,7204,159,1976,44148,44148,1267,242,2595,,1842516,5891,,,,1472,,478667,375627,1097,0,,,,,,264621,,0,2218143,6772,,,111655,,2218143,6772,,0 +"2021-02-12","AR",5212,4179,13,1033,14278,14278,712,23,,258,2322916,6230,,,2322916,1473,123,311608,247028,565,0,,,,75810,,293796,,0,2569944,6669,,,,405490,,0,2569944,6669 +"2021-02-12","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-12","AZ",14834,13128,172,1706,55413,55413,2396,141,,705,2864855,9590,,,,,466,793532,740314,2426,0,,,,,,,,0,7140917,35221,,,427041,,3605169,11776,7140917,35221 +"2021-02-12","CA",46002,,546,,,,10505,0,,2930,,0,,,,,,3381615,3381615,10059,0,,,,,,,,0,45125441,201460,,,,,,0,45125441,201460 +"2021-02-12","CO",5790,5071,9,719,22703,22703,470,48,,,2098456,8431,320525,,,,,411774,390153,2091,0,50461,,,,,,5799358,43208,5799358,43208,373784,,,,2488609,10293,,0 +"2021-02-12","CT",7381,6049,27,1332,12257,12257,674,0,,,,0,,,5585218,,,267337,250915,838,0,,17354,,,305265,,,0,5897899,33093,,299011,,,,0,5897899,33093 +"2021-02-12","DC",976,,3,,,,207,0,,57,,0,,,,,32,38670,,137,0,,,,,,27473,1154309,2825,1154309,2825,,,,,427581,5828,,0 +"2021-02-12","DE",1269,1148,7,121,,,247,0,,23,521971,1510,,,,,,82263,78066,388,0,,,,,85725,,1300275,7055,1300275,7055,,,,,604234,1898,,0 +"2021-02-12","FL",29061,,190,,76873,76873,4825,286,,,8787274,29198,813960,776136,15549919,,,1781450,1458398,7437,0,154948,,145802,,2328793,,20343123,109356,20343123,109356,969396,,922278,,10568724,36635,17963576,85324 +"2021-02-12","GA",15708,13856,195,1852,53111,53111,3362,258,8741,,,0,,,,,,958985,786277,3900,0,67173,,,,758098,,,0,6792960,27070,458930,,,,,0,6792960,27070 +"2021-02-12","GU",130,,0,,,,8,0,,4,104539,367,,,,,4,7689,7481,3,0,23,247,,,,7472,,0,112228,370,347,8727,,,,0,112020,370 +"2021-02-12","HI",425,425,1,,2149,2149,40,2,,13,,0,,,,,10,27460,26743,90,0,,,,,26290,,1023552,5556,1023552,5556,,,,,,0,,0 +"2021-02-12","IA",5223,,27,,,,249,0,,59,1003555,1290,,90334,2275171,,33,273936,273936,519,0,,57564,16144,54203,296909,300366,,0,1277491,1809,,1234633,106528,229287,1279853,1809,2585809,8340 +"2021-02-12","ID",1791,1577,0,214,6852,6852,176,14,1201,37,484232,1472,,,,,,166876,135711,323,0,,,,,,88672,,0,619943,1720,,78973,,,619943,1720,1027856,5329 +"2021-02-12","IL",22027,19873,42,2154,,,1910,0,,437,,0,,,,,211,1158431,,2598,0,,,,,,,,0,17021919,103009,,,,,,0,17021919,103009 +"2021-02-12","IN",12117,11690,90,427,41459,41459,1178,81,7253,227,2390129,5192,,,,,119,646425,,1419,0,,,,,735665,,,0,7470213,45132,,,,,3036554,6611,7470213,45132 +"2021-02-12","KS",4364,,61,,8887,8887,348,47,2413,87,931487,4888,,,,411,42,286102,,1208,0,,,,,,,,0,1217589,6096,,527485,,,1217589,6096,2346453,21097 +"2021-02-12","KY",4253,3865,42,388,17929,17929,1063,105,3768,277,,0,,,,,154,386326,298878,1423,0,9076,34019,,,240026,45589,,0,3750687,25102,109999,420071,,,,0,3750687,25102 +"2021-02-12","LA",9276,8646,37,630,,,1001,0,,,4887697,27950,,,,,151,418585,361861,1170,0,,,,,,380673,,0,5306282,29120,,412988,,,,0,5249558,28773 +"2021-02-12","MA",15358,15051,89,307,18859,18859,1223,0,,300,4208973,10832,,,,,180,553812,525486,2416,0,,,14572,,628806,453740,,0,14737744,106107,,,151476,512923,4734459,13060,14737744,106107 +"2021-02-12","MD",7503,7324,36,179,33629,33629,1225,121,,326,2913743,7812,,166267,,,,368977,368977,1112,0,,,25610,,449777,9559,,0,7388614,44606,,,191877,,3282720,8924,7388614,44606 +"2021-02-12","ME",643,630,2,13,1469,1469,102,5,,24,,0,13938,,,,9,42259,33713,201,0,762,9181,,,38956,12619,,0,1461272,10089,14712,169187,,,,0,1461272,10089 +"2021-02-12","MI",16027,15062,8,965,,,1024,0,,293,,0,,,9177670,,123,628012,573372,1535,0,,,,,726497,498495,,0,9904167,41708,507720,,,,,0,9904167,41708 +"2021-02-12","MN",6362,6097,19,265,25047,25047,326,58,5176,73,2897730,9353,,,,,,471851,450313,1048,0,,,,,,457359,6535718,38467,6535718,38467,,378417,,,3348043,10253,,0 +"2021-02-12","MO",7442,,11,,,,1466,0,,328,1814869,3684,121792,,3783070,,208,470107,470107,884,0,22059,76741,,,518852,,,0,4311062,16417,144038,738701,129834,313694,2284976,4568,4311062,16417 +"2021-02-12","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,134,134,1,0,,,,,,29,,0,17563,1,,,,,17542,0,26131,0 +"2021-02-12","MS",6429,4554,39,1875,8902,8902,659,0,,168,1360637,0,,,,,112,285648,178793,984,0,,,,,,253140,,0,1646285,984,77438,680977,,,,0,1538094,0 +"2021-02-12","MT",1324,,4,,4432,4432,100,18,,23,,0,,,,,13,97063,94303,221,0,,,,,,92822,,0,1012245,4616,,,,,,0,1012245,4616 +"2021-02-12","NC",10376,9254,82,1122,,,2151,0,,506,,0,,,,,,814594,717498,4128,0,,,,,,,,0,8889330,60115,,639481,,,,0,8889330,60115 +"2021-02-12","ND",1461,,1,,3827,3827,39,0,556,5,301542,464,11953,,,,,98466,93723,113,0,1442,,,,,96234,1376213,3625,1376213,3625,13395,116566,,,400008,577,1469638,4775 +"2021-02-12","NE",2002,,12,,5936,5936,216,5,,,748219,1722,,,2003421,,,195485,,479,0,,,,,226095,141783,,0,2231446,16875,,,,,944189,2201,2231446,16875 +"2021-02-12","NH",1126,,9,,1071,1071,131,2,334,,565180,1530,,,,,,70072,49810,460,0,,,,,,65730,,0,1341481,0,38497,154952,37010,,614990,1780,1341481,0 +"2021-02-12","NJ",22393,20147,64,2246,62221,62221,2565,113,,525,9267736,46937,,,,,336,740062,660067,3732,0,,,,,,,,0,10007798,50669,,,,,,0,9927803,50100 +"2021-02-12","NM",3502,,23,,12634,12634,365,75,,,,0,,,,,,179724,,401,0,,,,,,117635,,0,2512101,25499,,,,,,0,2512101,25499 +"2021-02-12","NV",4663,,26,,,,847,0,,219,1080443,1976,,,,,137,287023,287023,636,0,,,,,,,2590646,7807,2590646,7807,,,,,1367466,2612,,0 +"2021-02-12","NY",36882,,139,,89995,89995,7068,0,,1358,,0,,,,,941,1512690,,8404,0,,,,,,,34548681,237134,34548681,237134,,,,,,0,,0 +"2021-02-12","OH",15136,13005,2559,2131,48411,48411,1799,142,6917,482,,0,,,,,307,934742,807727,3305,0,,77496,,,835896,851653,,0,9524660,55022,,1461906,,,,0,9524660,55022 +"2021-02-12","OK",3959,,11,,23085,23085,806,65,,235,2947634,13331,,,2947634,,,410818,,1417,0,18634,,,,376301,384398,,0,3358452,14748,139139,,,,,0,3332630,14833 +"2021-02-12","OR",2056,,12,,8162,8162,236,55,,54,,0,,,3168375,,27,149082,,607,0,,,,,196002,,,0,3364377,20150,,,,,,0,3364377,20150 +"2021-02-12","PA",22959,,99,,,,2548,0,,496,3744326,8550,,,,,286,888256,768085,3987,0,,,,,,772782,9727728,41801,9727728,41801,,,,,4512411,11887,,0 +"2021-02-12","PR",1907,1612,5,295,,,240,0,,45,305972,0,,,395291,,45,96924,89636,288,0,73539,,,,20103,86798,,0,402896,288,,,,,,0,415664,0 +"2021-02-12","RI",2290,,16,,8689,8689,222,32,,39,646167,1860,,,2592791,,20,120821,,440,0,,,,,144182,,2736973,22782,2736973,22782,,,,,766988,2300,,0 +"2021-02-12","SC",7894,7057,57,837,19205,19205,1375,119,,310,4115808,35112,101856,,3995349,,174,480157,421876,3870,0,24495,97845,,,542335,215306,,0,4595965,38982,126351,745917,,,,0,4537684,37553 +"2021-02-12","SD",1831,,2,,6425,6425,84,14,,13,302108,662,,,,,11,110068,98010,209,0,,,,,103250,106057,,0,669812,2645,,,,,412176,871,669812,2645 +"2021-02-12","TN",10893,8761,81,2132,17969,17969,1332,49,,338,,0,,,5839323,,184,754279,635535,2246,0,,129787,,,732918,718749,,0,6572241,24807,,1226193,,,,0,6572241,24807 +"2021-02-12","TX",40095,,324,,,,8607,0,,2582,,0,,,,,,2541845,2206982,12502,0,139080,184313,,,2500055,2204146,,0,18605754,99489,981011,2127545,,,,0,18605754,99489 +"2021-02-12","UT",1785,,11,,14103,14103,345,49,2217,118,1481242,4175,,,2389372,770,,359641,,1060,0,,55066,,52778,333961,330949,,0,2723333,11135,,843226,,323275,1787484,4922,2723333,11135 +"2021-02-12","VA",6966,5988,8,978,22718,22718,2117,103,,430,,0,,,,,268,544209,432084,3191,0,25169,111809,,,526013,,5553955,35220,5553955,35220,214814,1207358,,,,0,,0 +"2021-02-12","VI",25,,0,,,,,0,,,41924,48,,,,,,2524,,19,0,,,,,,2399,,0,44448,67,,,,,44547,67,,0 +"2021-02-12","VT",189,,1,,,,49,0,,11,302777,880,,,,,,13415,13074,166,0,,,,,,10331,,0,961542,9822,,,,,315851,1046,961542,9822 +"2021-02-12","WA",4633,,30,,18531,18531,704,15,,160,,0,,,4530317,,79,326159,309673,1453,0,,,,,309629,,4840076,25411,4840076,25411,,,,,,0,,0 +"2021-02-12","WI",6734,6151,11,583,25197,25197,461,55,2218,120,2557088,4607,,,,,,605785,554048,1102,0,,,,,,535627,6454144,29891,6454144,29891,,,,,3111136,5545,,0 +"2021-02-12","WV",2200,1873,13,327,,,348,0,,80,,0,,,,,39,126887,101628,467,0,,,,,,111584,,0,2042578,14165,31692,,,,,0,2042578,14165 +"2021-02-12","WY",647,,0,,1311,1311,44,2,,,175047,439,,,559222,,,53086,45211,107,0,,,,,37735,51640,,0,604578,3475,,,,,220258,495,604578,3475 +"2021-02-11","AK",280,,0,,1227,1227,33,3,,,,0,,,1510067,,6,54134,,143,0,,,,,65457,,,0,1577356,9353,,,,,,0,1577356,9353 +"2021-02-11","AL",9021,7089,133,1932,43906,43906,1281,221,2588,,1836625,5952,,,,1465,,477570,374746,1503,0,,,,,,264621,,0,2211371,7097,,,111066,,2211371,7097,,0 +"2021-02-11","AR",5199,4165,25,1034,14255,14255,712,44,,256,2316686,10297,,,2316686,1471,117,311043,246589,1103,0,,,,75633,,292298,,0,2563275,11021,,,,402977,,0,2563275,11021 +"2021-02-11","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-11","AZ",14662,12983,200,1679,55272,55272,2507,184,,719,2855265,13770,,,,,481,791106,738128,1861,0,,,,,,,,0,7105696,43920,,,426189,,3593393,15178,7105696,43920 +"2021-02-11","CA",45456,,461,,,,11045,0,,2996,,0,,,,,,3371556,3371556,8575,0,,,,,,,,0,44923981,153380,,,,,,0,44923981,153380 +"2021-02-11","CO",5781,5063,11,718,22655,22655,507,39,,,2090025,13828,317419,,,,,409683,388291,1722,0,49359,,,,,,5756150,71519,5756150,71519,370986,,,,2478316,16006,,0 +"2021-02-11","CT",7354,6025,28,1329,12257,12257,731,0,,,,0,,,5553087,,,266499,250131,1003,0,,17255,,,304302,,,0,5864806,40185,,294317,,,,0,5864806,40185 +"2021-02-11","DC",973,,8,,,,225,0,,57,,0,,,,,32,38533,,185,0,,,,,,27398,1151484,5212,1151484,5212,,,,,421753,1086,,0 +"2021-02-11","DE",1262,1141,17,121,,,253,0,,24,520461,1357,,,,,,81875,77737,414,0,,,,,85297,,1293220,3937,1293220,3937,,,,,602336,1771,,0 +"2021-02-11","FL",28871,,180,,76587,76587,4906,301,,,8758076,30793,796185,761003,15475357,,,1774013,1453130,8354,0,144432,,135966,,2318546,,20233767,122288,20233767,122288,941088,,897303,,10532089,39147,17878252,88408 +"2021-02-11","GA",15513,13672,92,1841,52853,52853,3511,310,8717,,,0,,,,,,955085,783821,4179,0,66659,,,,755717,,,0,6765890,31509,457835,,,,,0,6765890,31509 +"2021-02-11","GU",130,,0,,,,10,0,,4,104172,518,,,,,4,7686,7478,3,0,23,246,,,,7467,,0,111858,521,347,8674,,,,0,111650,520 +"2021-02-11","HI",424,424,1,,2147,2147,49,8,,14,,0,,,,,12,27370,26675,91,0,,,,,26227,,1017996,5184,1017996,5184,,,,,,0,,0 +"2021-02-11","IA",5196,,22,,,,273,0,,64,1002265,1762,,89660,2267439,,26,273417,273417,593,0,,57368,15820,54009,296332,299106,,0,1275682,2355,,1222971,105528,227836,1278044,2350,2577469,9988 +"2021-02-11","ID",1791,1577,11,214,6838,6838,176,-1,1199,37,482760,1021,,,,,,166553,135463,458,0,,,,,,88126,,0,618223,1366,,78973,,,618223,1366,1022527,4475 +"2021-02-11","IL",21985,19841,116,2144,,,1954,0,,448,,0,,,,,227,1155833,,2838,0,,,,,,,,0,16918910,96525,,,,,,0,16918910,96525 +"2021-02-11","IN",12027,11604,26,423,41378,41378,1226,86,7240,239,2384937,6629,,,,,118,645006,,1701,0,,,,,734071,,,0,7425081,57871,,,,,3029943,8330,7425081,57871 +"2021-02-11","KS",4303,,0,,8840,8840,377,0,2401,98,926599,0,,,,411,41,284894,,0,0,,,,,,,,0,1211493,0,,,,,1211493,0,2325356,0 +"2021-02-11","KY",4211,3830,36,381,17824,17824,1142,109,3751,278,,0,,,,,156,384903,297942,1871,0,8933,33878,,,237278,45451,,0,3725585,11945,109575,417147,,,,0,3725585,11945 +"2021-02-11","LA",9239,8617,27,622,,,1052,0,,,4859747,39044,,,,,151,417415,361038,2728,0,,,,,,380673,,0,5277162,41772,,409399,,,,0,5220785,40903 +"2021-02-11","MA",15269,14964,62,305,18859,18859,1313,0,,304,4198141,10634,,,,,185,551396,523258,2450,0,,,14572,,626284,453740,,0,14631637,110792,,,151476,509874,4721399,12847,14631637,110792 +"2021-02-11","MD",7467,7288,21,179,33508,33508,1272,110,,324,2905931,7395,,166267,,,,367865,367865,1199,0,,,25610,,448364,9554,,0,7344008,39191,,,191877,,3273796,8594,7344008,39191 +"2021-02-11","ME",641,628,0,13,1464,1464,100,6,,22,,0,13914,,,,11,42058,33576,175,0,754,9116,,,38809,12588,,0,1451183,10640,14680,167239,,,,0,1451183,10640 +"2021-02-11","MI",16019,15052,80,967,,,1061,0,,266,,0,,,9137481,,125,626477,572179,1507,0,,,,,724978,498495,,0,9862459,48676,505644,,,,,0,9862459,48676 +"2021-02-11","MN",6343,6081,24,262,24989,24989,320,65,5168,78,2888377,9666,,,,,,470803,449413,898,0,,,,,,456849,6497251,37998,6497251,37998,,373826,,,3337790,10454,,0 +"2021-02-11","MO",7431,,270,,,,1488,0,,319,1811185,4089,121516,,3767653,,200,469223,469223,1034,0,21906,76365,,,517881,,,0,4294645,18087,143609,731148,129496,311278,2280408,5123,4294645,18087 +"2021-02-11","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,133,133,0,0,,,,,,29,,0,17562,0,,,,,17542,0,26131,0 +"2021-02-11","MS",6390,4532,23,1858,8902,8902,690,0,,178,1360637,0,,,,,119,284664,178340,911,0,,,,,,253140,,0,1645301,911,77438,680977,,,,0,1538094,0 +"2021-02-11","MT",1320,,0,,4414,4414,111,14,,25,,0,,,,,12,96842,94130,247,0,,,,,,92497,,0,1007629,6555,,,,,,0,1007629,6555 +"2021-02-11","NC",10294,9189,113,1105,,,2185,0,,516,,0,,,,,,810466,714012,4568,0,,,,,,,,0,8829215,55752,,632433,,,,0,8829215,55752 +"2021-02-11","ND",1460,,1,,3827,3827,39,7,556,5,301078,518,11953,,,,,98353,93632,139,0,1442,,,,,96127,1372588,4697,1372588,4697,13395,114136,,,399431,657,1464863,6274 +"2021-02-11","NE",1990,,4,,5931,5931,230,3,,,746497,1573,,,1986778,,,195006,,374,0,,,,,225461,141236,,0,2214571,9443,,,,,941988,1945,2214571,9443 +"2021-02-11","NH",1117,,1,,1069,1069,138,4,334,,563650,1721,,,,,,69612,49560,365,0,,,,,,65349,,0,1341481,11049,38497,154952,36974,,613210,2020,1341481,11049 +"2021-02-11","NJ",22329,20083,79,2246,62108,62108,2656,156,,519,9220799,36846,,,,,348,736330,656904,3656,0,,,,,,,,0,9957129,40502,,,,,,0,9877703,43487 +"2021-02-11","NM",3479,,18,,12559,12559,371,2,,,,0,,,,,,179323,,533,0,,,,,,116518,,0,2486602,28354,,,,,,0,2486602,28354 +"2021-02-11","NV",4637,,55,,,,879,0,,223,1078467,2476,,,,,147,286387,286387,592,0,,,,,,,2582839,9894,2582839,9894,,,,,1364854,3068,,0 +"2021-02-11","NY",36743,,124,,89995,89995,7342,0,,1402,,0,,,,,941,1504286,,10099,0,,,,,,,34311547,285499,34311547,285499,,,,,,0,,0 +"2021-02-11","OH",12577,11104,721,1473,48269,48269,1862,189,6908,479,,0,,,,,321,931437,805971,2806,0,,76473,,,831251,848058,,0,9469638,42875,,1431133,,,,0,9469638,42875 +"2021-02-11","OK",3948,,48,,23020,23020,807,90,,240,2934303,14947,,,2934303,,,409401,,1677,0,18634,,,,375771,382342,,0,3343704,16624,139139,,,,,0,3317797,15757 +"2021-02-11","OR",2044,,13,,8107,8107,241,31,,57,,0,,,3148872,,30,148475,,543,0,,,,,195355,,,0,3344227,15229,,,,,,0,3344227,15229 +"2021-02-11","PA",22860,,115,,,,2687,0,,538,3735776,10540,,,,,301,884269,764748,3978,0,,,,,,760471,9685927,51505,9685927,51505,,,,,4500524,13583,,0 +"2021-02-11","PR",1902,1607,5,295,,,261,0,,47,305972,0,,,395291,,47,96636,89414,142,0,73069,,,,20103,86310,,0,402608,142,,,,,,0,415664,0 +"2021-02-11","RI",2274,,15,,8657,8657,238,42,,45,644307,1795,,,2570517,,22,120381,,488,0,,,,,143674,,2714191,23169,2714191,23169,,,,,764688,2283,,0 +"2021-02-11","SC",7837,7010,95,827,19086,19086,1391,145,,329,4080696,19004,101550,,3961152,,195,476287,419435,3147,0,24233,96880,,,538979,213484,,0,4556983,22151,125783,738044,,,,0,4500131,20632 +"2021-02-11","SD",1829,,14,,6411,6411,104,14,,17,301446,1385,,,,,6,109859,97852,279,0,,,,,103075,105821,,0,667167,3040,,,,,411305,1664,667167,3040 +"2021-02-11","TN",10812,8706,81,2106,17920,17920,1385,45,,362,,0,,,5816398,,199,752033,633907,1624,0,,129106,,,731036,716136,,0,6547434,24051,,1212208,,,,0,6547434,24051 +"2021-02-11","TX",39771,,385,,,,8933,0,,2703,,0,,,,,,2529343,2196882,11890,0,137659,182973,,,2489681,2184719,,0,18506265,91398,977294,2083584,,,,0,18506265,91398 +"2021-02-11","UT",1774,,9,,14054,14054,363,47,2212,128,1477067,4998,,,2379090,766,,358581,,1242,0,,54791,,52517,333108,328315,,0,2712198,11904,,834266,,321054,1782562,5878,2712198,11904 +"2021-02-11","VA",6958,5978,26,980,22615,22615,2136,145,,451,,0,,,,,289,541018,429779,3699,0,25169,111809,,,526013,,5518735,32599,5518735,32599,214093,1192537,,,,0,,0 +"2021-02-11","VI",25,,1,,,,,0,,,41876,435,,,,,,2505,,20,0,,,,,,2396,,0,44381,455,,,,,44480,448,,0 +"2021-02-11","VT",188,,1,,,,54,0,,10,301897,947,,,,,,13249,12908,127,0,,,,,,10154,,0,951720,9444,,,,,314805,1071,951720,9444 +"2021-02-11","WA",4603,,45,,18516,18516,704,-14,,160,,0,,,4506197,,61,324706,308392,681,0,,,,,308338,,4814665,20740,4814665,20740,,,,,,0,,0 +"2021-02-11","WI",6723,6140,18,583,25142,25142,489,52,2217,127,2552481,5905,,,,,,604683,553110,1428,0,,,,,,534164,6424253,39684,6424253,39684,,,,,3105591,7144,,0 +"2021-02-11","WV",2187,1863,12,324,,,364,0,,82,,0,,,,,40,126420,101251,469,0,,,,,,110698,,0,2028413,12665,31492,,,,,0,2028413,12665 +"2021-02-11","WY",647,,0,,1309,1309,41,3,,,174608,279,,,555831,,,52979,45155,105,0,,,,,37659,51525,,0,601103,3254,,,,,219763,366,601103,3254 +"2021-02-10","AK",280,,0,,1224,1224,34,1,,,,0,,,1500923,,6,53991,,182,0,,,,,65272,,,0,1568003,6754,,,,,,0,1568003,6754 +"2021-02-10","AL",8888,6990,309,1898,43685,43685,1401,186,2584,,1830673,5488,,,,1463,,476067,373601,1401,0,,,,,,264621,,0,2204274,6463,,,110429,,2204274,6463,,0 +"2021-02-10","AR",5174,4144,26,1030,14211,14211,735,37,,283,2306389,9188,,,2306389,1469,138,309940,245865,1092,0,,,,75183,,290548,,0,2552254,9820,,,,400253,,0,2552254,9820 +"2021-02-10","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-10","AZ",14462,12837,176,1625,55088,55088,2589,121,,763,2841495,6965,,,,,508,789245,736720,1977,0,,,,,,,,0,7061776,24650,,,425012,,3578215,8449,7061776,24650 +"2021-02-10","CA",44995,,518,,,,11516,0,,3127,,0,,,,,,3362981,3362981,8390,0,,,,,,,,0,44770601,187297,,,,,,0,44770601,187297 +"2021-02-10","CO",5770,5055,24,715,22616,22616,534,55,,,2076197,0,317419,,,,,407961,386723,751,0,49359,,,,,,5684631,0,5684631,0,366778,,,,2462310,0,,0 +"2021-02-10","CT",7326,5999,28,1327,12257,12257,770,0,,,,0,,,5514000,,,265496,249245,888,0,,17090,,,303237,,,0,5824621,25546,,291264,,,,0,5824621,25546 +"2021-02-10","DC",965,,4,,,,226,0,,56,,0,,,,,34,38348,,67,0,,,,,,27238,1146272,3165,1146272,3165,,,,,420667,612,,0 +"2021-02-10","DE",1245,1127,24,118,,,252,0,,25,519104,755,,,,,,81461,77360,251,0,,,,,85005,,1289283,3470,1289283,3470,,,,,600565,1006,,0 +"2021-02-10","FL",28691,,165,,76286,76286,5129,285,,,8727283,27677,796185,761003,15398684,,,1765659,1447250,7405,0,144432,,135966,,2307417,,20111479,101357,20111479,101357,941088,,897303,,10492942,35082,17789844,79153 +"2021-02-10","GA",15421,13599,120,1822,52543,52543,3617,281,8684,,,0,,,,,,950906,780494,3490,0,66061,,,,752452,,,0,6734381,22794,456581,,,,,0,6734381,22794 +"2021-02-10","GU",130,,0,,,,10,0,,3,103654,525,,,,,3,7683,7476,10,0,23,246,,,,7460,,0,111337,535,345,8661,,,,0,111130,535 +"2021-02-10","HI",423,423,5,,2139,2139,58,-1,,16,,0,,,,,17,27279,26584,53,0,,,,,26147,,1012812,4322,1012812,4322,,,,,,0,,0 +"2021-02-10","IA",5174,,29,,,,292,0,,67,1000503,1593,,89342,2258224,,27,272824,272824,721,0,,57113,15683,53749,295657,297805,,0,1273327,2314,,1214772,105073,226576,1275694,2308,2567481,9630 +"2021-02-10","ID",1780,1567,4,213,6839,6839,178,20,1194,39,481739,1287,,,,,,166095,135118,437,0,,,,,,87505,,0,616857,1587,,78973,,,616857,1587,1018052,0 +"2021-02-10","IL",21869,19739,67,2130,,,2082,0,,464,,0,,,,,232,1152995,,2825,0,,,,,,,,0,16822385,82885,,,,,,0,16822385,82885 +"2021-02-10","IN",12001,11578,59,423,41292,41292,1273,85,7228,262,2378308,4797,,,,,138,643305,,1431,0,,,,,732027,,,0,7367210,38386,,,,,3021613,6228,7367210,38386 +"2021-02-10","KS",4303,,106,,8840,8840,377,91,2401,98,926599,5800,,,,411,41,284894,,1934,0,,,,,,,,0,1211493,7734,,,,,1211493,7734,2325356,23909 +"2021-02-10","KY",4175,3799,49,376,17715,17715,1191,197,3743,336,,0,,,,,169,383032,296748,1911,0,8908,33575,,,236858,45297,,0,3713640,14840,109485,412866,,,,0,3713640,14840 +"2021-02-10","LA",9212,8594,50,618,,,1076,0,,,4820703,10529,,,,,151,414687,359179,333,0,,,,,,380673,,0,5235390,10862,,400029,,,,0,5179882,10846 +"2021-02-10","MA",15207,14903,83,304,18859,18859,1358,457,,309,4187507,9337,,,,,183,548946,521045,2050,0,,,14275,,623666,425717,,0,14520845,100271,,,149467,506940,4708552,11257,14520845,100271 +"2021-02-10","MD",7446,7267,33,179,33398,33398,1282,110,,324,2898536,4880,,166267,,,,366666,366666,1137,0,,,25610,,446903,9526,,0,7304817,30366,,,191877,,3265202,6017,7304817,30366 +"2021-02-10","ME",641,628,2,13,1458,1458,112,8,,23,,0,13887,,,,13,41883,33469,253,0,749,9044,,,38666,12582,,0,1440543,9086,14648,165452,,,,0,1440543,9086 +"2021-02-10","MI",15939,14977,14,962,,,1175,0,,299,,0,,,9090230,,149,624970,570895,1239,0,,,,,723553,498495,,0,9813783,34376,504736,,,,,0,9813783,34376 +"2021-02-10","MN",6319,6057,11,262,24924,24924,317,61,5155,78,2878711,4215,,,,,,469905,448625,651,0,,,,,,456244,6459253,16740,6459253,16740,,369634,,,3327336,4742,,0 +"2021-02-10","MO",7161,,12,,,,1502,0,,323,1807096,3334,121183,,3750732,,199,468189,468189,876,0,21734,75894,,,516745,,,0,4276558,11473,143104,720611,129124,308002,2275285,4210,4276558,11473 +"2021-02-10","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,133,133,0,0,,,,,,29,,0,17562,0,,,,,17542,0,26131,0 +"2021-02-10","MS",6367,4527,25,1840,8902,8902,743,0,,195,1360637,0,,,,,127,283753,177847,784,0,95,,,,,253140,,0,1644390,784,77438,680977,,,,0,1538094,0 +"2021-02-10","MT",1320,,5,,4400,4400,108,26,,19,,0,,,,,11,96595,93921,307,0,,,,,,92248,,0,1001074,3795,,,,,,0,1001074,3795 +"2021-02-10","NC",10181,9107,135,1074,,,2291,0,,540,,0,,,,,,805898,710653,3833,0,,,,,,,,0,8773463,29670,,618482,,,,0,8773463,29670 +"2021-02-10","ND",1459,,2,,3820,3820,34,6,556,6,300560,700,11953,,,,,98214,93516,39,0,1442,,,,,96026,1367891,3155,1367891,3155,13395,111861,,,398774,739,1458589,3971 +"2021-02-10","NE",1986,,8,,5928,5928,240,11,,,744924,1392,,,1977788,,,194632,,462,0,,,,,225021,141239,,0,2205128,15069,,,,,940043,1853,2205128,15069 +"2021-02-10","NH",1116,,7,,1065,1065,142,2,334,,561929,528,,,,,,69247,49261,329,0,,,,,,64989,,0,1330432,8424,38432,153920,36918,,611190,770,1330432,8424 +"2021-02-10","NJ",22250,20004,147,2246,61952,61952,2786,155,,533,9183953,0,,,,,341,732674,653955,4370,0,,,,,,,,0,9916627,4370,,,,,,0,9834216,0 +"2021-02-10","NM",3461,,31,,12557,12557,379,52,,,,0,,,,,,178790,,510,0,,,,,,114976,,0,2458248,9697,,,,,,0,2458248,9697 +"2021-02-10","NV",4582,,23,,,,922,0,,226,1075991,2495,,,,,139,285795,285795,659,0,,,,,,,2572945,8965,2572945,8965,,,,,1361786,3154,,0 +"2021-02-10","NY",36619,,138,,89995,89995,7593,0,,1423,,0,,,,,955,1494187,,7101,0,,,,,,,34026048,176750,34026048,176750,,,,,,0,,0 +"2021-02-10","OH",11856,10522,63,1334,48080,48080,1922,227,6889,508,,0,,,,,330,928631,803885,3281,0,,76473,,,831251,841193,,0,9426763,19617,,1431133,,,,0,9426763,19617 +"2021-02-10","OK",3900,,30,,22930,22930,856,141,,270,2919356,16304,,,2919356,,,407724,,1660,0,18634,,,,374806,380167,,0,3327080,17964,139139,,,,,0,3302040,16959 +"2021-02-10","OR",2031,,7,,8076,8076,243,51,,57,,0,,,3134120,,31,147932,,513,0,,,,,194878,,,0,3328998,14063,,,,,,0,3328998,14063 +"2021-02-10","PA",22745,,125,,,,2789,0,,569,3725236,7567,,,,,293,880291,761705,3378,0,,,,,,757050,9634422,34200,9634422,34200,,,,,4486941,9806,,0 +"2021-02-10","PR",1897,1603,4,294,,,251,0,,44,305972,0,,,395291,,43,96494,89312,92,0,72852,,,,20103,86332,,0,402466,92,,,,,,0,415664,0 +"2021-02-10","RI",2259,,11,,8615,8615,238,28,,42,642512,1384,,,2547911,,22,119893,,459,0,,,,,143111,,2691022,17674,2691022,17674,,,,,762405,1843,,0 +"2021-02-10","SC",7742,6923,49,819,18941,18941,1439,127,,334,4061692,17281,101380,,3942645,,200,473140,417807,2829,0,24096,95796,,,536854,211845,,0,4534832,20110,125476,727743,,,,0,4479499,19015 +"2021-02-10","SD",1815,,6,,6397,6397,109,10,,20,300061,1089,,,,,12,109580,97672,175,0,,,,,102950,105614,,0,664127,1531,,,,,409641,1264,664127,1531 +"2021-02-10","TN",10731,8652,100,2079,17875,17875,1419,89,,393,,0,,,5794129,,214,750409,632860,2947,0,,128389,,,729254,714067,,0,6523383,27589,,1200650,,,,0,6523383,27589 +"2021-02-10","TX",39386,,385,,,,9165,0,,2740,,0,,,,,,2517453,2187850,12897,0,136762,181535,,,2479268,2168762,,0,18414867,113195,974278,2063225,,,,0,18414867,113195 +"2021-02-10","UT",1765,,17,,14007,14007,365,57,2202,131,1472069,4527,,,2368197,763,,357339,,1299,0,,54383,,52127,332097,326237,,0,2700294,11452,,821952,,318125,1776684,5380,2700294,11452 +"2021-02-10","VA",6932,5951,34,981,22470,22470,2201,131,,449,,0,,,,,286,537319,427188,3203,0,24975,110865,,,523178,,5486136,16359,5486136,16359,213550,1178588,,,,0,,0 +"2021-02-10","VI",24,,0,,,,,0,,,41441,325,,,,,,2485,,12,0,,,,,,2393,,0,43926,337,,,,,44032,340,,0 +"2021-02-10","VT",187,,1,,,,58,0,,10,300950,563,,,,,,13122,12784,17,0,,,,,,9988,,0,942276,4946,,,,,313734,568,942276,4946 +"2021-02-10","WA",4558,,107,,18530,18530,704,50,,160,,0,,,4485964,,62,324025,307867,811,0,,,,,307829,,4793925,22088,4793925,22088,,,,,,0,,0 +"2021-02-10","WI",6705,6129,42,576,25090,25090,489,69,2214,127,2546576,4992,,,,,,603255,551871,999,0,,,,,,532793,6384569,32691,6384569,32691,,,,,3098447,5813,,0 +"2021-02-10","WV",2175,1857,25,318,,,362,0,,97,,0,,,,,47,125951,100878,429,0,,,,,,109700,,0,2015748,9150,31405,,,,,0,2015748,9150 +"2021-02-10","WY",647,,0,,1306,1306,45,0,,,174329,344,,,552662,,,52874,45068,44,0,,,,,37588,51419,,0,597849,1879,,,,,219397,356,597849,1879 +"2021-02-09","AK",280,,1,,1223,1223,35,4,,,,0,,,1494355,,6,53809,,115,0,,,,,65100,,,0,1561249,5717,,,,,,0,1561249,5717 +"2021-02-09","AL",8579,6783,56,1796,43499,43499,1441,116,2583,,1825185,5105,,,,1463,,474666,372626,1318,0,,,,,,252880,,0,2197811,5960,,,109997,,2197811,5960,,0 +"2021-02-09","AR",5148,4119,42,1029,14174,14174,775,75,,276,2297201,6459,,,2297201,1464,137,308848,245233,1475,0,,,,74670,,288774,,0,2542434,7279,,,,396361,,0,2542434,7279 +"2021-02-09","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-09","AZ",14286,12702,231,1584,54967,54967,2744,254,,797,2834530,14216,,,,,524,787268,735236,4381,0,,,,,,,,0,7037126,43464,,,424813,,3569766,17665,7037126,43464 +"2021-02-09","CA",44477,,327,,,,11904,0,,3264,,0,,,,,,3354591,3354591,8251,0,,,,,,,,0,44583304,259754,,,,,,0,44583304,259754 +"2021-02-09","CO",5746,5031,13,715,22561,22561,538,232,,,2076197,3113,315946,,,,,407210,386113,934,0,48994,,,,,,5684631,12417,5684631,12417,366778,,,,2462310,3842,,0 +"2021-02-09","CT",7298,5979,16,1319,12257,12257,826,0,,,,0,,,5489419,,,264608,248486,869,0,,16943,,,302302,,,0,5799075,19235,,288150,,,,0,5799075,19235 +"2021-02-09","DC",961,,5,,,,241,0,,58,,0,,,,,31,38281,,145,0,,,,,,27121,1143107,4582,1143107,4582,,,,,420055,821,,0 +"2021-02-09","DE",1221,1104,13,117,,,254,0,,27,518349,829,,,,,,81210,77141,279,0,,,,,84811,,1285813,7785,1285813,7785,,,,,599559,1108,,0 +"2021-02-09","FL",28526,,239,,76001,76001,5307,353,,,8699606,24690,796185,761003,15329888,,,1758254,1442865,6911,0,144432,,135966,,2297581,,20010122,91141,20010122,91141,941088,,897303,,10457860,31601,17710691,72831 +"2021-02-09","GA",15301,13481,171,1820,52262,52262,3689,334,8651,,,0,,,,,,947416,778049,3721,0,65804,,,,750186,,,0,6711587,24135,455997,,,,,0,6711587,24135 +"2021-02-09","GU",130,,0,,,,8,0,,3,103129,399,,,,,3,7673,7466,9,0,23,246,,,,7451,,0,110802,408,345,8518,,,,0,110595,408 +"2021-02-09","HI",418,418,0,,2140,2140,63,0,,16,,0,,,,,12,27226,26531,31,0,,,,,26098,,1008490,2809,1008490,2809,,,,,,0,,0 +"2021-02-09","IA",5145,,35,,,,327,0,,67,998910,1189,,89113,2249469,,29,272103,272103,405,0,,56826,15478,53480,294857,296420,,0,1271013,1594,,1203429,104639,225241,1273386,1605,2557851,6112 +"2021-02-09","ID",1776,1562,9,214,6819,6819,178,26,1191,39,480452,1685,,,,,,165658,134818,449,0,,,,,,86880,,0,615270,2060,,78973,,,615270,2060,1018052,3496 +"2021-02-09","IL",21802,19686,23,2116,,,2117,0,,497,,0,,,,,240,1150170,,2082,0,,,,,,,,0,16739500,55705,,,,,,0,16739500,55705 +"2021-02-09","IN",11942,11526,67,416,41207,41207,1265,98,7207,274,2373511,3070,,,,,142,641874,,1130,0,,,,,730482,,,0,7328824,25604,,,,,3015385,4200,7328824,25604 +"2021-02-09","KS",4197,,0,,8749,8749,319,0,2373,93,920799,0,,,,411,39,282960,,0,0,,,,,,,,0,1203759,0,,,,,1203759,0,2301447,0 +"2021-02-09","KY",4126,3753,35,373,17518,17518,1204,89,3712,282,,0,,,,,148,381121,295779,2328,0,8881,33191,,,235513,45148,,0,3698800,4625,109392,403009,,,,0,3698800,4625 +"2021-02-09","LA",9162,8559,20,603,,,1122,0,,,4810174,26406,,,,,151,414354,358862,1365,0,,,,,,363457,,0,5224528,27771,,399659,,,,0,5169036,27273 +"2021-02-09","MA",15124,14821,70,303,18402,18402,1401,0,,324,4178170,5916,,,,,191,546896,519125,1593,0,,,14275,,621401,425717,,0,14420574,52112,,,149467,503752,4697295,7235,14420574,52112 +"2021-02-09","MD",7413,7234,41,179,33288,33288,1377,101,,326,2893656,3417,,164849,,,,365529,365529,976,0,,,24579,,445481,9526,,0,7274451,14360,,,189428,,3259185,4393,7274451,14360 +"2021-02-09","ME",639,626,3,13,1450,1450,117,5,,24,,0,13865,,,,13,41630,33301,211,0,745,8982,,,38513,12568,,0,1431457,2999,14622,163885,,,,0,1431457,2999 +"2021-02-09","MI",15925,14965,62,960,,,1175,0,,299,,0,,,9056982,,149,623731,569980,918,0,,,,,722425,498495,,0,9779407,18303,502950,,,,,0,9779407,18303 +"2021-02-09","MN",6308,6046,6,262,24863,24863,321,83,5121,74,2874496,782,,,,,,469254,448098,572,0,,,,,,455280,6442513,9373,6442513,9373,,366121,,,3322594,1279,,0 +"2021-02-09","MO",7149,,6,,,,1538,0,,327,1803762,2182,120614,,3740205,,188,467313,467313,649,0,21568,75308,,,515809,,,0,4265085,8247,142369,708780,128583,303767,2271075,2831,4265085,8247 +"2021-02-09","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,133,133,0,0,,,,,,29,,0,17562,0,,,,,17542,0,26131,0 +"2021-02-09","MS",6342,4522,72,1820,8902,8902,743,125,,195,1360637,33007,,,,,127,282969,177457,656,0,,,,,,253140,,0,1643606,33663,77438,680977,,,,0,1538094,36681 +"2021-02-09","MT",1315,,1,,4374,4374,102,18,,24,,0,,,,,14,96288,93658,374,0,,,,,,91784,,0,997279,4341,,,,,,0,997279,4341 +"2021-02-09","NC",10046,9002,55,1044,,,2374,0,,558,,0,,,,,,802065,708165,2786,0,,,,,,,,0,8743793,24241,,612328,,,,0,8743793,24241 +"2021-02-09","ND",1457,,3,,3814,3814,37,3,556,7,299860,662,11953,,,,,98175,93548,-9,0,1442,,,,,96014,1364736,578,1364736,578,13395,108840,,,398035,653,1454618,523 +"2021-02-09","NE",1978,,10,,5917,5917,257,16,,,743532,757,,,1963281,,,194170,,344,0,,,,,224467,141108,,0,2190059,6394,,,,,938190,1104,2190059,6394 +"2021-02-09","NH",1109,,3,,1063,1063,159,5,335,,561401,1342,,,,,,68918,49019,419,0,,,,,,64639,,0,1322008,7350,38388,152716,36881,,610420,1576,1322008,7350 +"2021-02-09","NJ",22103,19916,92,2187,61797,61797,2827,200,,544,9183953,185042,,,,,360,728304,650263,3576,0,,,,,,,,0,9912257,188618,,,,,,0,9834216,194218 +"2021-02-09","NM",3430,,18,,12505,12505,369,60,,,,0,,,,,,178280,,413,0,,,,,,113448,,0,2448551,8701,,,,,,0,2448551,8701 +"2021-02-09","NV",4559,,37,,,,971,0,,237,1073496,3176,,,,,151,285136,285136,546,0,,,,,,,2563980,6212,2563980,6212,,,,,1358632,3722,,0 +"2021-02-09","NY",36481,,142,,89995,89995,7875,0,,1412,,0,,,,,971,1487086,,7866,0,,,,,,,33849298,153648,33849298,153648,,,,,,0,,0 +"2021-02-09","OH",11793,10468,98,1325,47853,47853,1974,181,6869,528,,0,,,,,340,925350,801505,3207,0,,75779,,,829527,834389,,0,9407146,32741,,1409849,,,,0,9407146,32741 +"2021-02-09","OK",3870,,53,,22789,22789,864,15,,256,2903052,13517,,,2903052,,,406064,,1070,0,18634,,,,373582,377678,,0,3309116,14587,139139,,,,,0,3285081,15118 +"2021-02-09","OR",2024,,1,,8025,8025,244,54,,58,,0,,,3120679,,29,147419,,297,0,,,,,194256,,,0,3314935,43454,,,,,,0,3314935,43454 +"2021-02-09","PA",22620,,149,,,,2890,0,,574,3717669,8557,,,,,304,876913,759466,4088,0,,,,,,745376,9600222,140760,9600222,140760,,,,,4477135,11498,,0 +"2021-02-09","PR",1893,1599,5,294,,,249,0,,39,305972,0,,,395291,,38,96402,89242,241,0,72667,,,,20103,85365,,0,402374,241,,,,,,0,415664,0 +"2021-02-09","RI",2248,,12,,8587,8587,242,38,,44,641128,-33962,,,2530755,,20,119434,,330,0,,,,,142593,,2673348,5498,2673348,5498,,,,,760562,-33632,,0 +"2021-02-09","SC",7693,6885,3,808,18814,18814,1465,26,,348,4044411,18010,101339,,3926014,,208,470311,416073,1908,0,24015,94897,,,534470,209900,,0,4514722,19918,125354,719416,,,,0,4460484,19510 +"2021-02-09","SD",1809,,0,,6387,6387,109,10,,18,298972,459,,,,,13,109405,97556,122,0,,,,,102829,105352,,0,662596,633,,,,,408377,581,662596,633 +"2021-02-09","TN",10631,8586,65,2045,17786,17786,1404,91,,409,,0,,,5768956,,220,747462,630739,1636,0,,127541,,,726838,710742,,0,6495794,8984,,1184877,,,,0,6495794,8984 +"2021-02-09","TX",39001,,301,,,,9401,0,,2777,,0,,,,,,2504556,2177572,13329,0,135461,179936,,,2463920,2125302,,0,18301672,80902,970422,2030649,,,,0,18301672,80902 +"2021-02-09","UT",1748,,10,,13950,13950,359,61,2194,124,1467542,2054,,,2357719,754,,356040,,918,0,,53886,,51649,331123,324102,,0,2688842,5426,,810070,,314517,1771304,2524,2688842,5426 +"2021-02-09","VA",6898,5932,78,966,22339,22339,2248,172,,467,,0,,,,,290,534116,425066,3291,0,24883,110075,,,521778,,5469777,19803,5469777,19803,213288,1164412,,,,0,,0 +"2021-02-09","VI",24,,0,,,,,0,,,41116,526,,,,,,2473,,7,0,,,,,,2390,,0,43589,533,,,,,43692,532,,0 +"2021-02-09","VT",186,,3,,,,60,0,,13,300387,842,,,,,,13105,12779,59,0,,,,,,9866,,0,937330,3037,,,,,313166,896,937330,3037 +"2021-02-09","WA",4451,,2,,18480,18480,719,197,,188,,0,,,4464543,,78,323214,307189,3068,0,,,,,307163,,4771837,54978,4771837,54978,,,,,,0,,0 +"2021-02-09","WI",6663,6094,49,569,25021,25021,525,102,2208,133,2541584,3487,,,,,,602256,551050,865,0,,,,,,531343,6351878,16626,6351878,16626,,,,,3092634,4168,,0 +"2021-02-09","WV",2150,1835,19,315,,,394,0,,109,,0,,,,,50,125522,100557,416,0,,,,,,108616,,0,2006598,8041,31346,,,,,0,2006598,8041 +"2021-02-09","WY",647,,23,,1306,1306,32,0,,,173985,234,,,657100,,,52830,45056,46,0,,,,,47688,51386,,0,595970,-108866,,,,,219041,243,595970,-108866 +"2021-02-08","AK",279,,0,,1219,1219,39,0,,,,0,,,1488905,,9,53694,,415,0,,,,,64862,,,0,1555532,18621,,,,,,0,1555532,18621 +"2021-02-08","AL",8523,6753,8,1770,43383,43383,1524,378,2577,,1820080,3807,,,,1460,,473348,371771,925,0,,,,,,252880,,0,2191851,4522,,,109716,,2191851,4522,,0 +"2021-02-08","AR",5106,4081,30,1025,14099,14099,777,33,,274,2290742,5291,,,2290742,1458,142,307373,244413,637,0,,,,73931,,286917,,0,2535155,5830,,,,391322,,0,2535155,5830 +"2021-02-08","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-08","AZ",14055,12487,7,1568,54713,54713,2853,56,,828,2820314,2049,,,,,536,782887,731787,2250,0,,,,,,,,0,6993662,11514,,,423799,,3552101,3708,6993662,11514 +"2021-02-08","CA",44150,,208,,,,12085,0,,3313,,0,,,,,,3346340,3346340,10414,0,,,,,,,,0,44323550,329228,,,,,,0,44323550,329228 +"2021-02-08","CO",5733,5020,2,713,22329,22329,535,23,,,2073084,4993,314239,,,,,406276,385384,987,0,48488,,,,,,5672214,18685,5672214,18685,364940,,,,2458468,5832,,0 +"2021-02-08","CT",7282,5966,68,1316,12257,12257,815,0,,,,0,,,5471222,,,263739,247681,4367,0,,16843,,,301260,,,0,5779840,112191,,284789,,,,0,5779840,112191 +"2021-02-08","DC",956,,4,,,,237,0,,58,,0,,,,,30,38136,,101,0,,,,,,28986,1138525,2920,1138525,2920,,,,,419234,524,,0 +"2021-02-08","DE",1208,1091,0,117,,,243,0,,32,517520,863,,,,,,80931,76900,337,0,,,,,84228,,1278028,8140,1278028,8140,,,,,598451,1200,,0 +"2021-02-08","FL",28287,,126,,75648,75648,5381,133,,,8674916,21924,796185,761003,15267391,,,1751343,1438543,5599,0,144432,,135966,,2287907,,19918981,69118,19918981,69118,941088,,897303,,10426259,27523,17637860,63818 +"2021-02-08","GA",15130,13361,38,1769,51928,51928,3715,86,8601,,,0,,,,,,943695,775466,2704,0,65662,,,,747779,,,0,6687452,23176,455663,,,,,0,6687452,23176 +"2021-02-08","GU",130,,0,,,,9,0,,3,102730,1178,,,,,3,7664,7457,15,0,23,246,,,,7431,,0,110394,1193,344,8506,,,,0,110187,1206 +"2021-02-08","HI",418,418,0,,2140,2140,82,34,,22,,0,,,,,16,27195,26500,32,0,,,,,26071,,1005681,3662,1005681,3662,,,,,,0,,0 +"2021-02-08","IA",5110,,2,,,,318,0,,69,997721,941,,88891,2243854,,35,271698,271698,317,0,,56540,15252,53210,294404,294118,,0,1269419,1258,,1190444,104191,223833,1271781,1261,2551739,4139 +"2021-02-08","ID",1767,1553,0,214,6793,6793,207,0,1184,41,478767,0,,,,,,165209,134443,0,0,,,,,,86078,,0,613210,0,,78973,,,613210,0,1014556,0 +"2021-02-08","IL",21779,19668,41,2111,,,2161,0,,469,,0,,,,,251,1148088,,1747,0,,,,,,,,0,16683795,47210,,,,,,0,16683795,47210 +"2021-02-08","IN",11875,11459,58,416,41109,41109,1292,75,7190,285,2370441,3722,,,,,146,640744,,1033,0,,,,,729157,,,0,7303220,17399,,,,,3011185,4755,7303220,17399 +"2021-02-08","KS",4197,,96,,8749,8749,319,69,2373,93,920799,5308,,,,411,39,282960,,1398,0,,,,,,,,0,1203759,6706,,,,,1203759,6706,2301447,18488 +"2021-02-08","KY",4091,3720,40,371,17429,17429,1163,18,3689,274,,0,,,,,142,378793,294457,1003,0,8843,32710,,,235000,44961,,0,3694175,17874,109151,393967,,,,0,3694175,17874 +"2021-02-08","LA",9142,8541,23,601,,,1144,0,,,4783768,20741,,,,,149,412989,357995,1177,0,,,,,,363457,,0,5196757,21918,,393696,,,,0,5141763,21884 +"2021-02-08","MA",15054,14753,55,301,18402,18402,1387,0,,329,4172254,5777,,,,,188,545303,517806,1369,0,,,14275,,619858,425717,,0,14368462,42946,,,149467,500166,4690060,7053,14368462,42946 +"2021-02-08","MD",7372,7193,23,179,33187,33187,1413,122,,318,2890239,5187,,164849,,,,364553,364553,903,0,,,24579,,444221,9526,,0,7260091,22844,,,189428,,3254792,6090,7260091,22844 +"2021-02-08","ME",636,623,1,13,1445,1445,123,3,,32,,0,13850,,,,13,41419,33176,201,0,739,8895,,,38421,12535,,0,1428458,5867,14601,162226,,,,0,1428458,5867 +"2021-02-08","MI",15863,14905,9,958,,,1211,0,,294,,0,,,9039456,,163,622813,569417,2128,0,,,,,721648,498495,,0,9761104,52588,501886,,,,,0,9761104,52588 +"2021-02-08","MN",6302,6041,3,261,24780,24780,330,35,5105,80,2873714,6358,,,,,,468682,447601,564,0,,,,,,454290,6433140,17843,6433140,17843,,365407,,,3321315,6888,,0 +"2021-02-08","MO",7143,,0,,,,1587,0,,329,1801580,2428,120183,,3732692,,194,466664,466664,447,0,21420,74997,,,515102,,,0,4256838,7307,141790,703232,128151,301641,2268244,2875,4256838,7307 +"2021-02-08","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,133,133,0,0,,,,,,29,,0,17562,0,,,,,17542,0,26131,0 +"2021-02-08","MS",6270,4481,1,1789,8777,8777,842,0,,215,1327630,0,,,,,120,282313,177196,635,0,,,,,,238176,,0,1609943,635,74723,648722,,,,0,1501413,0 +"2021-02-08","MT",1314,,0,,4356,4356,101,3,,18,,0,,,,,10,95914,93352,124,0,,,,,,91380,,0,992938,4341,,,,,,0,992938,4341 +"2021-02-08","NC",9991,8958,8,1033,,,2339,0,,559,,0,,,,,,799279,705950,3084,0,,,,,,,,0,8719552,40452,,607292,,,,0,8719552,40452 +"2021-02-08","ND",1454,,3,,3811,3811,40,6,557,9,299198,97,11953,,,,,98184,93610,29,0,1442,,,,,95991,1364158,1316,1364158,1316,13395,106097,,,397382,126,1454095,1586 +"2021-02-08","NE",1968,,0,,5901,5901,250,5,,,742775,366,,,1957270,,,193826,,104,0,,,,,224093,140902,,0,2183665,2157,,,,,937086,471,2183665,2157 +"2021-02-08","NH",1106,,2,,1058,1058,179,2,335,,560059,2,,,,,,68499,48785,120,0,,,,,,64148,,0,1314658,468,38347,150650,36844,,608844,83,1314658,468 +"2021-02-08","NJ",22011,19824,22,2187,61597,61597,2814,74,,540,8998911,0,,,,,373,724728,647194,2561,0,,,,,,,,0,9723639,2561,,,,,,0,9639998,0 +"2021-02-08","NM",3412,,13,,12445,12445,396,37,,,,0,,,,,,177867,,311,0,,,,,,112051,,0,2439850,9523,,,,,,0,2439850,9523 +"2021-02-08","NV",4522,,2,,,,964,0,,259,1070320,1842,,,,,147,284590,284590,548,0,,,,,,,2557768,7702,2557768,7702,,,,,1354910,2390,,0 +"2021-02-08","NY",36339,,115,,89995,89995,7716,0,,1454,,0,,,,,961,1479220,,8448,0,,,,,,,33695650,197183,33695650,197183,,,,,,0,,0 +"2021-02-08","OH",11695,10384,36,1311,47672,47672,2012,134,6847,521,,0,,,,,351,922143,799445,1926,0,,75344,,,827649,828455,,0,9374405,26509,,1399691,,,,0,9374405,26509 +"2021-02-08","OK",3817,,4,,22774,22774,917,23,,283,2889535,0,,,2889535,,,404994,,1040,0,18634,,,,372068,374950,,0,3294529,1040,139139,,,,,0,3269963,0 +"2021-02-08","OR",2023,,4,,7971,7971,263,0,,61,,0,,,3078780,,28,147122,,381,0,,,,,192701,,,0,3271481,0,,,,,,0,3271481,0 +"2021-02-08","PA",22471,,4,,,,2881,0,,565,3709112,8084,,,,,296,872825,756525,2504,0,,,,,,735763,9459462,0,9459462,0,,,,,4465637,10369,,0 +"2021-02-08","PR",1888,1595,5,293,,,263,0,,47,305972,0,,,395291,,44,96161,89053,322,0,72341,,,,20103,84983,,0,402133,322,,,,,,0,415664,0 +"2021-02-08","RI",2236,,8,,8549,8549,241,81,,42,675090,3437,,,2525531,,20,119104,,211,0,,,,,142319,,2667850,5088,2667850,5088,,,,,794194,3648,,0 +"2021-02-08","SC",7690,6881,39,809,18788,18788,1517,32,,354,4026401,29712,101118,,3908473,,211,468403,414573,2030,0,23844,94463,,,532501,208593,,0,4494804,31742,124962,715573,,,,0,4440974,31289 +"2021-02-08","SD",1809,,0,,6377,6377,112,7,,19,298513,279,,,,,12,109283,97449,54,0,,,,,102785,105166,,0,661963,1033,,,,,407796,333,661963,1033 +"2021-02-08","TN",10566,8536,97,2030,17695,17695,1431,39,,398,,0,,,5761000,,208,745826,629838,1226,0,,126743,,,725810,707098,,0,6486810,11616,,1168830,,,,0,6486810,11616 +"2021-02-08","TX",38700,,57,,,,9401,0,,2667,,0,,,,,,2491227,2166919,7485,0,135101,177559,,,2453191,2104894,,0,18220770,148480,969047,1993396,,,,0,18220770,148480 +"2021-02-08","UT",1738,,2,,13889,13889,353,27,2173,112,1465488,2943,,,2352848,751,,355122,,514,0,,53450,,51223,330568,322825,,0,2683416,6337,,797087,,310908,1768780,3391,2683416,6337 +"2021-02-08","VA",6820,5874,42,946,22167,22167,2285,65,,464,,0,,,,,298,530825,422723,1700,0,24815,109351,,,519071,,5449974,12201,5449974,12201,213022,1149778,,,,0,,0 +"2021-02-08","VI",24,,0,,,,,0,,,40590,0,,,,,,2466,,0,0,,,,,,2371,,0,43056,0,,,,,43160,0,,0 +"2021-02-08","VT",183,,0,,,,63,0,,17,299545,814,,,,,,13046,12725,146,0,,,,,,9675,,0,934293,3792,,,,,312270,960,934293,3792 +"2021-02-08","WA",4449,,0,,18283,18283,737,0,,186,,0,,,4412414,,73,320146,304382,0,0,,,,,304315,,4716859,0,4716859,0,,,,,,0,,0 +"2021-02-08","WI",6614,6055,1,559,24919,24919,572,34,2202,134,2538097,3175,,,,,,601391,550369,609,0,,,,,,530216,6335252,-13449,6335252,-13449,,,,,3088466,3718,,0 +"2021-02-08","WV",2131,1822,2,309,,,375,0,,107,,0,,,,,52,125106,100235,398,0,,,,,,107418,,0,1998557,6978,31292,,,,,0,1998557,6978 +"2021-02-08","WY",624,,0,,1306,1306,41,4,,,173751,838,,,657100,,,52784,45047,157,0,,,,,47688,51291,,0,704836,21422,,,,,218798,974,704836,21422 +"2021-02-07","AK",279,,0,,1219,1219,44,0,,,,0,,,1470760,,11,53279,,0,0,,,,,64404,,,0,1536911,0,,,,,,0,1536911,0 +"2021-02-07","AL",8515,6747,2,1768,43005,43005,1513,0,2576,,1816273,4462,,,,1460,,472423,371056,1112,0,,,,,,252880,,0,2187329,5308,,,109260,,2187329,5308,,0 +"2021-02-07","AR",5076,4054,15,1022,14066,14066,781,17,,270,2285451,8180,,,2285451,1458,126,306736,243874,672,0,,,,73756,,285306,,0,2529325,8840,,,,389367,,0,2529325,8840 +"2021-02-07","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-07","AZ",14048,12480,37,1568,54657,54657,2910,150,,838,2818265,16776,,,,,561,780637,730128,1544,0,,,,,,,,0,6982148,59968,,,423601,,3548393,18296,6982148,59968 +"2021-02-07","CA",43942,,295,,,,12476,0,,3339,,0,,,,,,3335926,3335926,15064,0,,,,,,,,0,43994322,275167,,,,,,0,43994322,275167 +"2021-02-07","CO",5731,5020,10,711,22306,22306,527,29,,,2068091,5694,308913,,,,,405289,384545,1034,0,46993,,,,,,5653529,25243,5653529,25243,362727,,,,2452636,6637,,0 +"2021-02-07","CT",7214,5895,0,1319,12257,12257,827,0,,,,0,,,5364339,,,259372,243583,0,0,,16362,,,295992,,,0,5667649,0,,274842,,,,0,5667649,0 +"2021-02-07","DC",952,,5,,,,240,0,,59,,0,,,,,30,38035,,158,0,,,,,,26835,1135605,6163,1135605,6163,,,,,418710,1108,,0 +"2021-02-07","DE",1208,1091,6,117,,,263,0,,33,516657,1736,,,,,,80594,76594,762,0,,,,,83588,,1269888,9233,1269888,9233,,,,,597251,2498,,0 +"2021-02-07","FL",28161,,103,,75515,75515,5381,152,,,8652992,27601,578113,560932,15211678,,,1745744,1434511,6468,0,71851,,69600,,2280071,,19849863,89947,19849863,89947,650372,,630838,,10398736,34069,17574042,79722 +"2021-02-07","GA",15092,13326,2,1766,51842,51842,3740,110,8598,,,0,,,,,,940991,772978,3589,0,64668,,,,744698,,,0,6664276,35699,453432,,,,,0,6664276,35699 +"2021-02-07","GU",130,,1,,,,9,0,,3,101552,0,,,,,2,7649,7442,6,0,23,246,,,,7416,,0,109201,6,343,8392,,,,0,108981,0 +"2021-02-07","HI",418,418,2,,2106,2106,64,0,,17,,0,,,,,13,27163,26468,75,0,,,,,26043,,1002019,4696,1002019,4696,,,,,,0,,0 +"2021-02-07","IA",5108,,0,,,,316,0,,68,996780,1652,,88766,2240056,,32,271381,271381,446,0,,56369,15165,53063,294069,293597,,0,1268161,2098,,1187711,103979,223290,1270520,2104,2547600,6050 +"2021-02-07","ID",1767,1553,9,214,6793,6793,207,8,1184,41,478767,951,,,,,,165209,134443,240,0,,,,,,86078,,0,613210,1129,,78973,,,613210,1129,1014556,2720 +"2021-02-07","IL",21738,19633,62,2105,,,2188,0,,507,,0,,,,,245,1146341,,2060,0,,,,,,,,0,16636585,81550,,,,,,0,16636585,81550 +"2021-02-07","IN",11817,11401,65,416,41034,41034,1287,63,7177,290,2366719,5633,,,,,153,639711,,1724,0,,,,,727970,,,0,7285821,48517,,,,,3006430,7357,7285821,48517 +"2021-02-07","KS",4101,,0,,8680,8680,526,0,2361,129,915491,0,,,,411,52,281562,,0,0,,,,,,,,0,1197053,0,,,,,1197053,0,2282959,0 +"2021-02-07","KY",4051,3689,31,362,17411,17411,1235,31,3684,290,,0,,,,,140,377790,293708,1528,0,8784,32570,,,233912,44945,,0,3676301,0,108970,390097,,,,0,3676301,0 +"2021-02-07","LA",9119,8522,43,597,,,1166,0,,,4763027,33259,,,,,143,411812,356852,1951,0,,,,,,363457,,0,5174839,35210,,392574,,,,0,5119879,34589 +"2021-02-07","MA",14999,14698,78,301,18402,18402,1389,0,,318,4166477,12364,,,,,191,543934,516530,3107,0,,,14275,,618310,425717,,0,14325516,113095,,,149467,497964,4683007,15368,14325516,113095 +"2021-02-07","MD",7349,7170,20,179,33065,33065,1402,202,,326,2885052,8174,,164849,,,,363650,363650,1566,0,,,24579,,443007,9525,,0,7237247,48609,,,189428,,3248702,9740,7237247,48609 +"2021-02-07","ME",635,622,1,13,1442,1442,123,6,,35,,0,13798,,,,17,41218,33022,154,0,729,8822,,,38292,12526,,0,1422591,9284,14539,160879,,,,0,1422591,9284 +"2021-02-07","MI",15854,14894,0,960,,,1296,0,,300,,0,,,8989236,,155,620685,567648,0,0,,,,,719280,498495,,0,9708516,0,500609,,,,,0,9708516,0 +"2021-02-07","MN",6299,6038,10,261,24745,24745,362,59,5101,82,2867356,7676,,,,,,468118,447071,901,0,,,,,,453225,6415297,23541,6415297,23541,,364727,,,3314427,8438,,0 +"2021-02-07","MO",7143,,1,,,,1637,0,,348,1799152,3234,120119,,3725886,,210,466217,466217,769,0,21351,74876,,,514614,,,0,4249531,11676,141657,701782,128051,300966,2265369,4003,4249531,11676 +"2021-02-07","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,133,133,0,0,,,,,,29,,0,17562,0,,,,,17542,0,26131,0 +"2021-02-07","MS",6269,4480,3,1789,8777,8777,842,0,,215,1327630,0,,,,,120,281678,176889,900,0,,,,,,238176,,0,1609308,900,74723,648722,,,,0,1501413,0 +"2021-02-07","MT",1314,,2,,4353,4353,101,3,,18,,0,,,,,10,95790,93246,73,0,,,,,,91162,,0,988597,1962,,,,,,0,988597,1962 +"2021-02-07","NC",9983,8951,57,1032,,,2378,0,,584,,0,,,,,,796195,703244,4674,0,,,,,,,,0,8679100,52994,,602161,,,,0,8679100,52994 +"2021-02-07","ND",1451,,0,,3805,3805,39,4,557,9,299101,57,11953,,,,,98155,93583,49,0,1442,,,,,95946,1362842,919,1362842,919,13395,105862,,,397256,106,1452509,1130 +"2021-02-07","NE",1968,,0,,5896,5896,272,9,,,742409,1057,,,1955313,,,193722,,301,0,,,,,223900,140408,,0,2181508,10003,,,,,936615,1358,2181508,10003 +"2021-02-07","NH",1104,,6,,1056,1056,186,2,334,,560057,796,,,,,,68379,48704,318,0,,,,,,63614,,0,1314190,6587,38344,150752,36844,,608761,1023,1314190,6587 +"2021-02-07","NJ",21989,19802,25,2187,61523,61523,2837,71,,571,8998911,0,,,,,373,722167,645011,4332,0,,,,,,,,0,9721078,4332,,,,,,0,9639998,0 +"2021-02-07","NM",3399,,13,,12408,12408,403,16,,,,0,,,,,,177556,,342,0,,,,,,111037,,0,2430327,11870,,,,,,0,2430327,11870 +"2021-02-07","NV",4520,,24,,,,983,0,,250,1068478,1987,,,,,151,284042,284042,651,0,,,,,,,2550066,7772,2550066,7772,,,,,1352520,2638,,0 +"2021-02-07","NY",36224,,145,,89995,89995,7649,0,,1459,,0,,,,,979,1470772,,10025,0,,,,,,,33498467,250892,33498467,250892,,,,,,0,,0 +"2021-02-07","OH",11659,10351,7,1308,47538,47538,1978,61,6836,530,,0,,,,,339,920217,798069,2138,0,,74971,,,826218,824080,,0,9347896,36499,,1394769,,,,0,9347896,36499 +"2021-02-07","OK",3813,,52,,22751,22751,917,158,,283,2889535,0,,,2889535,,,403954,,2174,0,18634,,,,372068,373490,,0,3293489,2174,139139,,,,,0,3269963,0 +"2021-02-07","OR",2019,,17,,7971,7971,263,0,,61,,0,,,3078780,,28,146741,,603,0,,,,,192701,,,0,3271481,0,,,,,,0,3271481,0 +"2021-02-07","PA",22467,,71,,,,2913,0,,592,3701028,12843,,,,,329,870321,754240,4717,0,,,,,,735763,9459462,0,9459462,0,,,,,4455268,17098,,0 +"2021-02-07","PR",1883,1590,11,293,,,258,0,,37,305972,0,,,395291,,37,95839,88810,484,0,71815,,,,20103,84935,,0,401811,484,,,,,,0,415664,0 +"2021-02-07","RI",2228,,5,,8468,8468,288,0,,41,671653,11005,,,2520674,,20,118893,,372,0,,,,,142088,,2662762,17710,2662762,17710,,,,,790546,11377,,0 +"2021-02-07","SC",7651,6849,40,802,18756,18756,1526,79,,359,3996689,33408,100845,,3879380,,224,466373,412996,3392,0,23601,93941,,,530305,207101,,0,4463062,36800,124446,711154,,,,0,4409685,35765 +"2021-02-07","SD",1809,,5,,6370,6370,113,11,,25,298234,412,,,,,15,109229,97406,97,0,,,,,102714,105104,,0,660930,1384,,,,,407463,509,660930,1384 +"2021-02-07","TN",10469,8465,6,2004,17656,17656,1439,14,,405,,0,,,5750383,,211,744600,628968,2387,0,,126335,,,724811,705492,,0,6475194,27884,,960489,,,,0,6475194,27884 +"2021-02-07","TX",38643,,167,,,,9652,0,,2843,,0,,,,,,2483742,2160098,6959,0,133447,177045,,,2435800,2091113,,0,18072290,37467,964000,1980915,,,,0,18072290,37467 +"2021-02-07","UT",1736,,3,,13862,13862,391,34,2170,120,1462545,3620,,,2347026,750,,354608,,908,0,,53389,,51166,330053,321756,,0,2677079,8083,,796208,,310646,1765389,4226,2677079,8083 +"2021-02-07","VA",6778,5840,5,938,22102,22102,2303,67,,456,,0,,,,,301,529125,421466,2949,0,24642,109147,,,517910,,5437773,27356,5437773,27356,212551,1147133,,,,0,,0 +"2021-02-07","VI",24,,0,,,,,0,,,40590,477,,,,,,2466,,17,0,,,,,,2371,,0,43056,494,,,,,43160,493,,0 +"2021-02-07","VT",183,,1,,,,67,0,,20,298731,1393,,,,,,12900,12579,134,0,,,,,,9528,,0,930501,13310,,,,,311310,1525,930501,13310 +"2021-02-07","WA",4449,,0,,18283,18283,737,127,,186,,0,,,,,73,320146,304382,775,0,,,,,,,4716859,22209,4716859,22209,,,,,,0,,0 +"2021-02-07","WI",6613,6054,2,559,24885,24885,570,61,2201,144,2534922,3856,,,,,,600782,549826,766,0,,,,,,529120,6348701,14437,6348701,14437,,,,,3084748,4527,,0 +"2021-02-07","WV",2129,1820,10,309,,,381,0,,115,,0,,,,,51,124708,99933,518,0,,,,,,106442,,0,1991579,9307,31206,,,,,0,1991579,9307 +"2021-02-07","WY",624,,0,,1302,1302,44,-1,,,172913,0,,,636359,,,52627,44897,9,0,,,,,47008,51016,,0,683414,0,,,,,217824,0,683414,0 +"2021-02-06","AK",279,,0,,1219,1219,44,0,,,,0,,,1470760,,11,53279,,0,0,,,,,64404,,,0,1536911,0,,,,,,0,1536911,0 +"2021-02-06","AL",8513,6746,64,1767,43005,43005,1551,0,2575,,1811811,29900,,,,1460,,471311,370210,1992,0,,,,,,252880,,0,2182021,32337,,,108818,,2182021,32337,,0 +"2021-02-06","AR",5061,4043,11,1018,14049,14049,750,147,,263,2277271,11290,,,2277271,1458,124,306064,243214,1341,0,,,,73688,,284162,,0,2520485,12253,,,,388441,,0,2520485,12253 +"2021-02-06","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-06","AZ",14011,12451,63,1560,54507,54507,3060,198,,849,2801489,7563,,,,,561,779093,728608,3471,0,,,,,,,,0,6922180,33060,,,421751,,3530097,10512,6922180,33060 +"2021-02-06","CA",43647,,623,,,,13137,0,,3479,,0,,,,,,3320862,3320862,12394,0,,,,,,,,0,43719155,286051,,,,,,0,43719155,286051 +"2021-02-06","CO",5721,5010,17,711,22277,22277,538,19,,,2062397,7057,308913,,,,,404255,383602,1541,0,46993,,,,,,5628286,33861,5628286,33861,360904,,,,2445999,8373,,0 +"2021-02-06","CT",7214,5895,0,1319,12257,12257,827,0,,,,0,,,5364339,,,259372,243583,0,0,,16362,,,295992,,,0,5667649,0,,274842,,,,0,5667649,0 +"2021-02-06","DC",947,,7,,,,239,0,,56,,0,,,,,39,37877,,243,0,,,,,,26680,1129442,6537,1129442,6537,,,,,417602,1397,,0 +"2021-02-06","DE",1202,1087,11,115,,,267,0,,31,514921,1742,,,,,,79832,75875,286,0,,,,,83169,,1260655,7001,1260655,7001,,,,,594753,2028,,0 +"2021-02-06","FL",28058,,145,,75363,75363,5377,301,,,8625391,28676,578113,560932,15141916,,,1739276,1430155,7345,0,71851,,69600,,2270480,,19759916,108034,19759916,108034,650372,,630838,,10364667,36021,17494320,79877 +"2021-02-06","GA",15090,13324,232,1766,51732,51732,4239,253,8590,,,0,,,,,,937402,769825,4490,0,64114,,,,740654,,,0,6628577,31527,452034,,,,,0,6628577,31527 +"2021-02-06","GU",129,,0,,,,8,0,,3,101552,0,,,,,2,7643,7436,7,0,23,246,,,,7416,,0,109195,7,343,8392,,,,0,108981,0 +"2021-02-06","HI",416,416,0,,2106,2106,64,0,,17,,0,,,,,13,27088,26393,107,0,,,,,25966,,997323,9206,997323,9206,,,,,,0,,0 +"2021-02-06","IA",5108,,41,,,,336,0,,67,995128,822,,88754,2234618,,30,270935,270935,302,0,,56308,15154,53001,293563,293073,,0,1266063,1124,,1185288,103956,223218,1268416,1127,2541550,4656 +"2021-02-06","ID",1758,1544,11,214,6785,6785,199,14,1184,41,477816,1119,,,,,,164969,134265,404,0,,,,,,85439,,0,612081,1445,,78973,,,612081,1445,1011836,3937 +"2021-02-06","IL",21676,19585,73,2091,,,2271,0,,485,,0,,,,,246,1144281,,3062,0,,,,,,,,0,16555035,90295,,,,,,0,16555035,90295 +"2021-02-06","IN",11752,11346,66,406,40971,40971,1399,80,7158,300,2361086,7188,,,,,163,637987,,2816,0,,,,,725910,,,0,7237304,56220,,,,,2999073,10004,7237304,56220 +"2021-02-06","KS",4101,,0,,8680,8680,526,0,2361,129,915491,0,,,,411,52,281562,,0,0,,,,,,,,0,1197053,0,,,,,1197053,0,2282959,0 +"2021-02-06","KY",4020,3660,49,360,17380,17380,1294,98,3679,318,,0,,,,,164,376262,292581,1994,0,8784,32570,,,233912,44916,,0,3676301,7818,108970,390097,,,,0,3676301,7818 +"2021-02-06","LA",9076,8482,0,594,,,1275,0,,,4729768,0,,,,,167,409861,355522,0,0,,,,,,363457,,0,5139629,0,,386571,,,,0,5085290,0 +"2021-02-06","MA",14921,14622,62,299,18402,18402,1451,0,,310,4154113,11850,,,,,189,540827,513526,3619,0,,,14275,,614847,425717,,0,14212421,129509,,,149467,496324,4667639,15228,14212421,129509 +"2021-02-06","MD",7329,7150,42,179,32863,32863,1419,176,,337,2876878,6751,,164849,,,,362084,362084,1500,0,,,24579,,439220,9514,,0,7188638,44020,,,189428,,3238962,8251,7188638,44020 +"2021-02-06","ME",634,621,2,13,1436,1436,132,5,,40,,0,13798,,,,21,41064,32901,265,0,729,8754,,,38073,12521,,0,1413307,9997,14539,159326,,,,0,1413307,9997 +"2021-02-06","MI",15854,14894,104,960,,,1296,0,,300,,0,,,8989236,,155,620685,567648,1186,0,,,,,719280,498495,,0,9708516,37025,500609,,,,,0,9708516,37025 +"2021-02-06","MN",6289,6028,16,261,24686,24686,362,69,5098,82,2859680,8283,,,,,,467217,446309,993,0,,,,,,452183,6391756,30774,6391756,30774,,359988,,,3305989,9113,,0 +"2021-02-06","MO",7142,,12,,,,1666,0,,353,1795918,3606,119875,,3715054,,220,465448,465448,1004,0,21197,74535,,,513798,,,0,4237855,14508,141259,697891,127745,298947,2261366,4610,4237855,14508 +"2021-02-06","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,133,133,0,0,,,,,,29,,0,17562,0,,,,,17542,0,26131,0 +"2021-02-06","MS",6266,4479,44,1787,8777,8777,842,0,,215,1327630,0,,,,,120,280778,176369,1036,0,,,,,,238176,,0,1608408,1036,74723,648722,,,,0,1501413,0 +"2021-02-06","MT",1312,,5,,4350,4350,107,9,,18,,0,,,,,10,95717,93186,259,0,,,,,,91060,,0,986635,5457,,,,,,0,986635,5457 +"2021-02-06","NC",9926,8901,85,1025,,,2468,0,,591,,0,,,,,,791521,699321,4172,0,,,,,,,,0,8626106,54563,,598343,,,,0,8626106,54563 +"2021-02-06","ND",1451,,0,,3801,3801,36,4,556,8,299044,441,11953,,,,,98106,93547,11,0,1442,,,,,95834,1361923,1736,1361923,1736,13395,105338,,,397150,452,1451379,2339 +"2021-02-06","NE",1968,,10,,5887,5887,275,14,,,741352,1362,,,1945734,,,193421,,352,0,,,,,223487,139885,,0,2171505,12534,,,,,935257,1715,2171505,12534 +"2021-02-06","NH",1098,,7,,1054,1054,183,4,334,,559261,2245,,,,,,68061,48477,466,0,,,,,,62942,,0,1307603,10132,38287,150114,36786,,607738,2517,1307603,10132 +"2021-02-06","NJ",21964,19777,78,2187,61452,61452,2895,119,,737,8998911,49996,,,,,380,717835,641087,4511,0,,,,,,,,0,9716746,54507,,,,,,0,9639998,53726 +"2021-02-06","NM",3386,,8,,12392,12392,419,11,,,,0,,,,,,177214,,421,0,,,,,,110240,,0,2418457,15973,,,,,,0,2418457,15973 +"2021-02-06","NV",4496,,33,,,,983,0,,250,1066491,2493,,,,,151,283391,283391,898,0,,,,,,,2542294,10408,2542294,10408,,,,,1349882,3391,,0 +"2021-02-06","NY",36079,,159,,89995,89995,7804,0,,1481,,0,,,,,995,1460747,,11252,0,,,,,,,33247575,261285,33247575,261285,,,,,,0,,0 +"2021-02-06","OH",11652,10344,81,1308,47477,47477,2030,139,6832,529,,0,,,,,348,918079,796430,3549,0,,74412,,,823573,819180,,0,9311397,45955,,1382745,,,,0,9311397,45955 +"2021-02-06","OK",3761,,51,,22593,22593,917,140,,283,2889535,23118,,,2889535,,,401780,,2053,0,18634,,,,372068,371736,,0,3291315,25171,139139,,,,,0,3269963,26172 +"2021-02-06","OR",2002,,4,,7971,7971,263,45,,61,,0,,,3078780,,28,146138,,818,0,,,,,192701,,,0,3271481,17816,,,,,,0,3271481,17816 +"2021-02-06","PA",22396,,157,,,,2934,0,,609,3688185,9961,,,,,338,865604,749985,3930,0,,,,,,735763,9459462,51745,9459462,51745,,,,,4438170,13108,,0 +"2021-02-06","PR",1872,1580,5,292,,,265,0,,42,305972,0,,,395291,,38,95355,88352,291,0,71063,,,,20103,84659,,0,401327,291,,,,,,0,415664,0 +"2021-02-06","RI",2223,,11,,8468,8468,288,0,,41,660648,25801,,,2503381,,20,118521,,630,0,,,,,141671,,2645052,33795,2645052,33795,,,,,779169,26431,,0 +"2021-02-06","SC",7611,6816,58,795,18677,18677,1600,116,,371,3963281,31963,100546,,3846781,,224,462981,410639,3007,0,23355,93085,,,527139,205514,,0,4426262,34970,123901,704179,,,,0,4373920,33815 +"2021-02-06","SD",1804,,6,,6359,6359,115,13,,25,297822,648,,,,,15,109132,97342,188,0,,,,,102622,104956,,0,659546,1526,,,,,406954,836,659546,1526 +"2021-02-06","TN",10463,8457,58,2006,17642,17642,1514,78,,418,,0,,,5724638,,228,742213,627141,3182,0,,125726,,,722672,703426,,0,6447310,29654,,956295,,,,0,6447310,29654 +"2021-02-06","TX",38476,,348,,,,9957,0,,2885,,0,,,,,,2476783,2154678,13897,0,133307,175629,,,2430693,2080185,,0,18034823,111908,963296,1955420,,,,0,18034823,111908 +"2021-02-06","UT",1733,,5,,13828,13828,419,73,2169,123,1458925,4274,,,2339650,749,,353700,,1211,0,,53132,,50920,329346,320182,,0,2668996,10924,,792696,,309027,1761163,5144,2668996,10924 +"2021-02-06","VA",6773,5835,41,938,22035,22035,2376,142,,465,,0,,,,,294,526176,419382,4709,0,24445,108449,,,515484,,5410417,39368,5410417,39368,211924,1140604,,,,0,,0 +"2021-02-06","VI",24,,0,,,,,0,,,40113,0,,,,,,2449,,0,0,,,,,,2359,,0,42562,0,,,,,42667,0,,0 +"2021-02-06","VT",182,,1,,,,64,0,,16,297338,824,,,,,,12766,12447,154,0,,,,,,9372,,0,917191,9193,,,,,309785,972,917191,9193 +"2021-02-06","WA",4449,,33,,18156,18156,737,85,,186,,0,,,,,73,319371,303961,1493,0,,,,,,,4694650,23835,4694650,23835,,,,,,0,,0 +"2021-02-06","WI",6611,6052,36,559,24824,24824,593,90,2194,164,2531066,3504,,,,,,600016,549155,1114,0,,,,,,527575,6334264,29609,6334264,29609,,,,,3080221,4438,,0 +"2021-02-06","WV",2119,1812,19,307,,,378,0,,115,,0,,,,,56,124190,99515,549,0,,,,,,105185,,0,1982272,12854,31074,,,,,0,1982272,12854 +"2021-02-06","WY",624,,0,,1303,1303,44,1,,,172913,0,,,636359,,,52618,44933,42,0,,,,,47008,51018,,0,683414,0,,,,,217824,0,683414,0 +"2021-02-05","AK",279,,0,,1219,1219,44,5,,,,0,,,1470760,,11,53279,,165,0,,,,,64404,,,0,1536911,7345,,,,,,0,1536911,7345 +"2021-02-05","AL",8449,6697,84,1752,43005,43005,1671,194,2566,,1781911,0,,,,1458,,469319,368853,1496,0,,,,,,252880,,0,2149684,0,,,140376,,2149684,0,,0 +"2021-02-05","AR",5050,4032,41,1018,13902,13902,808,0,,289,2265981,10427,,,2265981,1449,144,304723,242251,1824,0,,,,73205,,282699,,0,2508232,11719,,,,385223,,0,2508232,11719 +"2021-02-05","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-05","AZ",13948,12399,196,1549,54309,54309,3167,218,,909,2793926,12298,,,,,573,775622,725659,3826,0,,,,,,,,0,6889120,47208,,,421679,,3519585,15705,6889120,47208 +"2021-02-05","CA",43024,,558,,,,13672,0,,3527,,0,,,,,,3308468,3308468,14021,0,,,,,,,,0,43433104,197777,,,,,,0,43433104,197777 +"2021-02-05","CO",5704,4994,27,710,22258,22258,564,82,,,2055340,8821,308913,,,,,402714,382286,1863,0,46993,,,,,,5594425,43290,5594425,43290,358310,,,,2437626,10483,,0 +"2021-02-05","CT",7214,5895,29,1319,12257,12257,827,0,,,,0,,,5364339,,,259372,243583,1431,0,,16362,,,295992,,,0,5667649,43340,,274842,,,,0,5667649,43340 +"2021-02-05","DC",940,,8,,,,251,0,,67,,0,,,,,39,37634,,269,0,,,,,,26551,1122905,6563,1122905,6563,,,,,416205,1355,,0 +"2021-02-05","DE",1191,1076,56,115,,,290,0,,40,513179,1119,,,,,,79546,75589,321,0,,,,,82785,,1253654,2802,1253654,2802,,,,,592725,1440,,0 +"2021-02-05","FL",27913,,215,,75062,75062,5428,341,,,8596715,44918,578113,560932,15072874,,,1731931,1424463,11171,0,71851,,69600,,2260188,,19651882,176996,19651882,176996,650372,,630838,,10328646,56089,17414443,122801 +"2021-02-05","GA",14858,13146,102,1712,51479,51479,4239,232,8555,,,0,,,,,,932912,766604,4842,0,63710,,,,737367,,,0,6597050,35415,451037,,,,,0,6597050,35415 +"2021-02-05","GU",129,,0,,,,6,0,,2,101552,355,,,,,2,7636,7429,14,0,23,246,,,,7416,,0,109188,369,343,8392,,,,0,108981,369 +"2021-02-05","HI",416,416,0,,2106,2106,64,3,,17,,0,,,,,13,26981,26286,129,0,,,,,25847,,988117,5096,988117,5096,,,,,,0,,0 +"2021-02-05","IA",5067,,34,,,,348,0,,66,994306,1857,,88493,2230348,,31,270633,270633,649,0,,56185,14916,52876,293232,291527,,0,1264939,2506,,1175736,103457,222308,1267289,2502,2536894,9391 +"2021-02-05","ID",1747,1533,-1,214,6771,6771,203,22,1183,47,476697,1432,,,,,,164565,133939,402,0,,,,,,84824,,0,610636,1740,,78973,,,610636,1740,1007899,4901 +"2021-02-05","IL",21603,19526,106,2077,,,2318,0,,491,,0,,,,,254,1141219,,3660,0,,,,,,,,0,16464740,105085,,,,,,0,16464740,105085 +"2021-02-05","IN",11686,11280,49,406,40891,40891,1446,117,7148,322,2353898,4562,,,,,165,635171,,1481,0,,,,,722479,,,0,7181084,30280,,,,,2989069,6043,7181084,30280 +"2021-02-05","KS",4101,,206,,8680,8680,526,102,2361,129,915491,7557,,,,411,52,281562,,2647,0,,,,,,,,0,1197053,10204,,,,,1197053,10204,2282959,34877 +"2021-02-05","KY",3971,3619,50,352,17282,17282,1318,112,3658,330,,0,,,,,167,374268,291375,2256,0,8716,32412,,,233174,44692,,0,3668483,14932,108721,385950,,,,0,3668483,14932 +"2021-02-05","LA",9076,8482,32,594,,,1275,0,,,4729768,17741,,,,,167,409861,355522,866,0,,,,,,363457,,0,5139629,18607,,386571,,,,0,5085290,18475 +"2021-02-05","MA",14859,14563,75,296,18402,18402,1503,0,,322,4142263,12608,,,,,196,537208,510148,3287,0,,,14275,,610865,425717,,0,14082912,127468,,,149467,491939,4652411,15590,14082912,127468 +"2021-02-05","MD",7287,7109,36,178,32687,32687,1444,156,,341,2870127,7637,,164849,,,,360584,360584,1547,0,,,24579,,439220,9514,,0,7144618,42260,,,189428,,3230711,9184,7144618,42260 +"2021-02-05","ME",632,619,2,13,1431,1431,131,11,,45,,0,13798,,,,22,40799,32729,265,0,729,8654,,,37849,12498,,0,1403310,8147,14539,157104,,,,0,1403310,8147 +"2021-02-05","MI",15750,14798,25,952,,,1296,0,,300,,0,,,8953726,,155,619499,566630,1754,0,,,,,717765,481801,,0,9671491,47633,499022,,,,,0,9671491,47633 +"2021-02-05","MN",6273,6014,22,259,24617,24617,362,52,5092,82,2851397,7129,,,,,,466224,445479,1048,0,,,,,,450924,6360982,34889,6360982,34889,,356437,,,3296876,8042,,0 +"2021-02-05","MO",7130,,13,,,,1682,0,,364,1792312,4803,118958,,3701664,,224,464444,464444,1325,0,20915,73638,,,512724,,,0,4223347,20146,140060,685880,126852,294156,2256756,6128,4223347,20146 +"2021-02-05","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,133,133,0,0,,,,,,29,,0,17562,0,,,,,17542,0,26131,0 +"2021-02-05","MS",6222,4461,40,1761,8777,8777,858,0,,229,1327630,0,,,,,128,279742,175814,1210,0,,,,,,238176,,0,1607372,1210,74723,648722,,,,0,1501413,0 +"2021-02-05","MT",1307,,-1,,4341,4341,102,14,,24,,0,,,,,14,95458,92956,347,0,,,,,,90654,,0,981178,6455,,,,,,0,981178,6455 +"2021-02-05","NC",9841,8838,113,1003,,,2523,0,,599,,0,,,,,,787349,696096,5547,0,,,,,,,,0,8571543,60695,,590881,,,,0,8571543,60695 +"2021-02-05","ND",1451,,4,,3797,3797,33,0,555,7,298603,528,11953,,,,,98095,93583,61,0,1442,,,,,95777,1360187,3105,1360187,3105,13395,103537,,,396698,589,1449040,4091 +"2021-02-05","NE",1958,,6,,5873,5873,285,11,,,739990,1919,,,1933683,,,193069,,520,0,,,,,223003,139287,,0,2158971,12700,,,,,933542,2441,2158971,12700 +"2021-02-05","NH",1091,,6,,1050,1050,198,2,333,,557016,1412,,,,,,67595,48205,478,0,,,,,,62442,,0,1297471,9642,38207,144872,36713,,605221,1720,1297471,9642 +"2021-02-05","NJ",21886,19699,93,2187,61333,61333,2825,161,,506,8948915,30206,,,,,342,713324,637357,4228,0,,,,,,,,0,9662239,34434,,,,,,0,9586272,33832 +"2021-02-05","NM",3378,,23,,12381,12381,396,61,,,,0,,,,,,176793,,582,0,,,,,,109068,,0,2402484,15625,,,,,,0,2402484,15625 +"2021-02-05","NV",4463,,39,,,,1072,0,,268,1063998,2302,,,,,155,282493,282493,897,0,,,,,,,2531886,9335,2531886,9335,,,,,1346491,3199,,0 +"2021-02-05","NY",35920,,153,,89995,89995,7937,0,,1516,,0,,,,,1000,1449495,,8777,0,,,,,,,32986290,203627,32986290,203627,,,,,,0,,0 +"2021-02-05","OH",11571,10270,62,1301,47338,47338,2170,228,6821,552,,0,,,,,377,914530,793822,3683,0,,73689,,,820770,812707,,0,9265442,51769,,1358995,,,,0,9265442,51769 +"2021-02-05","OK",3710,,29,,22453,22453,951,136,,284,2866417,11978,,,2866417,,,399727,,2662,0,11794,,,,369792,369278,,0,3266144,14640,115559,,,,,0,3243791,13228 +"2021-02-05","OR",1998,,7,,7926,7926,287,30,,64,,0,,,3061742,,27,145320,,715,0,,,,,191923,,,0,3253665,19839,,,,,,0,3253665,19839 +"2021-02-05","PA",22239,,138,,,,3041,0,,644,3678224,7420,,,,,371,861674,746838,4688,0,,,,,,723806,9407717,40532,9407717,40532,,,,,4425062,10183,,0 +"2021-02-05","PR",1867,1576,6,291,,,278,0,,41,305972,0,,,395291,,34,95064,88119,80,0,70437,,,,20103,84629,,0,401036,80,,,,,,0,415664,0 +"2021-02-05","RI",2212,,3,,8468,8468,288,56,,41,634847,1897,,,2470800,,20,117891,,600,0,,,,,140457,,2611257,22174,2611257,22174,,,,,752738,2497,,0 +"2021-02-05","SC",7553,6770,66,783,18561,18561,1637,99,,368,3931318,59298,100189,,3815603,,232,459974,408787,6096,0,23032,92185,,,524502,203808,,0,4391292,65394,123221,695882,,,,0,4340105,64157 +"2021-02-05","SD",1798,,10,,6346,6346,121,12,,27,297174,583,,,,,17,108944,97221,131,0,,,,,102524,104716,,0,658020,2038,,,,,406118,714,658020,2038 +"2021-02-05","TN",10405,8414,203,1991,17564,17564,1558,95,,438,,0,,,5697699,,235,739031,624834,2661,0,,124762,,,719957,700620,,0,6417656,27910,,944196,,,,0,6417656,27910 +"2021-02-05","TX",38128,,401,,,,10259,0,,2931,,0,,,,,,2462886,2143353,14495,0,132409,174443,,,2418530,2060478,,0,17922915,76029,959934,1926967,,,,0,17922915,76029 +"2021-02-05","UT",1728,,17,,13755,13755,433,58,2162,117,1454651,4057,,,2329726,742,,352489,,1216,0,,52754,,50560,328346,318034,,0,2658072,11328,,780098,,305907,1756019,4919,2658072,11328 +"2021-02-05","VA",6732,5816,82,916,21893,21893,2363,144,,462,,0,,,,,294,521467,416189,5069,0,24182,107181,,,511563,,5371049,54599,5371049,54599,211152,1122200,,,,0,,0 +"2021-02-05","VI",24,,0,,,,,0,,,40113,295,,,,,,2449,,19,0,,,,,,2359,,0,42562,314,,,,,42667,318,,0 +"2021-02-05","VT",181,,0,,,,64,0,,17,296514,648,,,,,,12612,12299,109,0,,,,,,9126,,0,907998,4745,,,,,308813,758,907998,4745 +"2021-02-05","WA",4416,,28,,18071,18071,789,84,,183,,0,,,,,80,317878,302782,1584,0,,,,,,,4670815,24987,4670815,24987,,,,,,0,,0 +"2021-02-05","WI",6575,6020,30,555,24734,24734,594,100,2192,160,2527562,4460,,,,,,598902,548221,1427,0,,,,,,526004,6304655,25984,6304655,25984,,,,,3075783,5726,,0 +"2021-02-05","WV",2100,1797,20,303,,,384,0,,116,,0,,,,,55,123641,99120,597,0,,,,,,103780,,0,1969418,14763,30912,,,,,0,1969418,14763 +"2021-02-05","WY",624,,0,,1302,1302,44,2,,,172913,487,,,636359,,,52576,44911,108,0,,,,,47008,50926,,0,683414,12726,,,,,217824,550,683414,12726 +"2021-02-04","AK",279,,0,,1214,1214,43,1,,,,0,,,1463638,,10,53114,,158,0,,,,,64183,,,0,1529566,9360,,,,,,0,1529566,9360 +"2021-02-04","AL",8365,6642,162,1723,42811,42811,1666,84,2564,,1781911,7810,,,,1457,,467823,367773,2767,0,,,,,,252880,,0,2149684,9765,,,140376,,2149684,9765,,0 +"2021-02-04","AR",5009,4013,24,996,13902,13902,815,89,,308,2255554,14176,,,2255554,1449,145,302899,240959,2469,0,,,,72563,,280868,,0,2496513,16070,,,,380737,,0,2496513,16070 +"2021-02-04","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-04","AZ",13752,12224,176,1528,54091,54091,3303,659,,946,2781628,10763,,,,,618,771796,722252,4417,0,,,,,,,,0,6841912,46724,,,420413,,3503880,14529,6841912,46724 +"2021-02-04","CA",42466,,655,,,,14138,0,,3756,,0,,,,,,3294447,3294447,13176,0,,,,,,,,0,43235327,168094,,,,,,0,43235327,168094 +"2021-02-04","CO",5677,4970,13,707,22176,22176,595,59,,,2046519,8041,306480,,,,,400851,380624,1584,0,46365,,,,,,5551135,36937,5551135,36937,355906,,,,2427143,9490,,0 +"2021-02-04","CT",7185,5872,28,1313,12257,12257,837,0,,,,0,,,5322627,,,257941,242274,937,0,,16175,,,294361,,,0,5624309,26207,,271157,,,,0,5624309,26207 +"2021-02-04","DC",932,,6,,,,248,0,,63,,0,,,,,41,37365,,166,0,,,,,,26453,1116342,4103,1116342,4103,,,,,414850,1217,,0 +"2021-02-04","DE",1135,1022,5,113,,,315,0,,39,512060,729,,,,,,79225,75276,243,0,,,,,82586,,1250852,1561,1250852,1561,,,,,591285,972,,0 +"2021-02-04","FL",27698,,226,,74721,74721,5607,338,,,8551797,17814,578113,560932,14964527,,,1720760,1416199,8434,0,71851,,69600,,2246336,,19474886,68280,19474886,68280,650372,,630838,,10272557,26248,17291642,62373 +"2021-02-04","GA",14756,13048,169,1708,51247,51247,4239,294,8511,,,0,,,,,,928070,763077,5706,0,62937,,,,733538,,,0,6561635,37412,449321,,,,,0,6561635,37412 +"2021-02-04","GU",129,,0,,,,5,0,,2,101197,446,,,,,2,7622,7415,4,0,22,270,,,,7410,,0,108819,450,343,8333,,,,0,108612,450 +"2021-02-04","HI",416,416,2,,2103,2103,57,7,,19,,0,,,,,12,26852,26187,106,0,,,,,25764,,983021,4120,983021,4120,,,,,,0,,0 +"2021-02-04","IA",5033,,58,,,,360,0,,77,992449,1548,,88383,2221735,,31,269984,269984,700,0,,56018,14854,52725,292520,289989,,0,1262433,2248,,1165803,103285,221403,1264787,2257,2527503,8263 +"2021-02-04","ID",1748,1534,7,214,6749,6749,203,17,1181,47,475265,1388,,,,,,164163,133631,507,0,,,,,,84159,,0,608896,1781,,78973,,,608896,1781,1002998,5373 +"2021-02-04","IL",21497,19444,77,2053,,,2341,0,,513,,0,,,,,265,1137559,,3328,0,,,,,,,,0,16359655,101307,,,,,,0,16359655,101307 +"2021-02-04","IN",11637,11231,1546,406,40774,40774,1541,107,7135,331,2349336,7049,,,,,175,633690,,2359,0,,,,,720786,,,0,7150804,54480,,,,,2983026,9408,7150804,54480 +"2021-02-04","KS",3895,,0,,8578,8578,526,0,2333,129,907934,0,,,,411,52,278915,,0,0,,,,,,,,0,1186849,0,,,,,1186849,0,2248082,0 +"2021-02-04","KY",3921,3576,58,345,17170,17170,1340,160,3639,368,,0,,,,,171,372012,290000,2493,0,8700,31995,,,232232,44394,,0,3653551,17862,108691,376312,,,,0,3653551,17862 +"2021-02-04","LA",9044,8453,38,591,,,1295,0,,,4712027,28733,,,,,162,408995,354788,2760,0,,,,,,363457,,0,5121022,31493,,384783,,,,0,5066815,30014 +"2021-02-04","MA",14784,14489,76,295,18402,18402,1554,0,,335,4129655,8753,,,,,208,533921,507166,2804,0,,,14275,,607390,425717,,0,13955444,81286,,,149467,487573,4636821,11355,13955444,81286 +"2021-02-04","MD",7251,7074,31,177,32531,32531,1426,125,,340,2862490,8652,,164849,,,,359037,359037,1554,0,,,24579,,437155,9511,,0,7102358,35487,,,189428,,3221527,10206,7102358,35487 +"2021-02-04","ME",630,617,3,13,1420,1420,145,10,,46,,0,13771,,,,22,40534,32537,301,0,725,8568,,,37643,12481,,0,1395163,6920,14508,155136,,,,0,1395163,6920 +"2021-02-04","MI",15725,14778,81,947,,,1376,0,,314,,0,,,8907925,,165,617745,565251,1885,0,,,,,715933,481801,,0,9623858,50126,497112,,,,,0,9623858,50126 +"2021-02-04","MN",6251,5997,17,254,24565,24565,369,72,5079,82,2844268,11531,,,,,,465176,444566,1410,0,,,,,,450383,6326093,44313,6326093,44313,,353088,,,3288834,12723,,0 +"2021-02-04","MO",7117,,19,,,,1675,0,,381,1787509,3690,118416,,3682943,,229,463119,463119,1399,0,20662,72867,,,511341,,,0,4203201,17560,139265,676537,126251,289886,2250628,5089,4203201,17560 +"2021-02-04","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,133,133,0,0,,,,,,29,,0,17562,0,,,,,17542,0,26131,0 +"2021-02-04","MS",6182,4441,24,1741,8777,8777,897,0,,235,1327630,0,,,,,138,278532,175202,1210,0,,,,,,238176,,0,1606162,1210,74723,648722,,,,0,1501413,0 +"2021-02-04","MT",1308,,5,,4327,4327,115,20,,23,,0,,,,,13,95111,92644,301,0,,,,,,90402,,0,974723,6608,,,,,,0,974723,6608 +"2021-02-04","NC",9728,8753,150,975,,,2630,0,,630,,0,,,,,,781802,692010,5495,0,,,,,,,,0,8510848,58946,,580959,,,,0,8510848,58946 +"2021-02-04","ND",1447,,0,,3797,3797,37,3,554,8,298075,716,11953,,,,,98034,93546,98,0,1442,,,,,95691,1357082,5097,1357082,5097,13395,100801,,,396109,814,1444949,6159 +"2021-02-04","NE",1952,,21,,5862,5862,278,18,,,738071,1563,,,1921652,,,192549,,507,0,,,,,222359,138647,,0,2146271,13347,,,,,931101,2069,2146271,13347 +"2021-02-04","NH",1085,,9,,1048,1048,209,6,332,,555604,749,,,,,,67117,47897,396,0,,,,,,61933,,0,1287829,6808,38156,143058,36664,,603501,1030,1287829,6808 +"2021-02-04","NJ",21793,19606,100,2187,61172,61172,2971,188,,531,8918709,20532,,,,,362,709096,633731,3289,0,,,,,,,,0,9627805,23821,,,,,,0,9552440,22954 +"2021-02-04","NM",3355,,17,,12320,12320,445,73,,,,0,,,,,,176211,,559,0,,,,,,108144,,0,2386859,10345,,,,,,0,2386859,10345 +"2021-02-04","NV",4424,,51,,,,1121,0,,254,1061696,2878,,,,,153,281596,281596,889,0,,,,,,,2522551,11391,2522551,11391,,,,,1343292,3767,,0 +"2021-02-04","NY",35767,,136,,89995,89995,7967,0,,1506,,0,,,,,986,1440718,,7414,0,,,,,,,32782663,169186,32782663,169186,,,,,,0,,0 +"2021-02-04","OH",11509,10225,79,1284,47110,47110,2252,237,6800,569,,0,,,,,395,910847,791191,4120,0,,73068,,,817865,806397,,0,9213673,48474,,1345147,,,,0,9213673,48474 +"2021-02-04","OK",3681,,27,,22317,22317,1008,150,,315,2854439,15450,,,2854439,,,397065,,2782,0,11794,,,,367514,366449,,0,3251504,18232,115559,,,,,0,3230563,16906 +"2021-02-04","OR",1991,,10,,7896,7896,299,42,,71,,0,,,3042736,,29,144605,,627,0,,,,,191090,,,0,3233826,15079,,,,,,0,3233826,15079 +"2021-02-04","PA",22101,,146,,,,3138,0,,653,3670804,8302,,,,,374,856986,744075,3370,0,,,,,,719868,9367185,37294,9367185,37294,,,,,4414879,10760,,0 +"2021-02-04","PR",1861,1570,8,291,,,270,0,,44,305972,0,,,395291,,30,94984,88060,322,0,70343,,,,20103,83579,,0,400956,322,,,,,,0,415664,0 +"2021-02-04","RI",2209,,11,,8412,8412,290,43,,43,632950,1850,,,2449320,,23,117291,,587,0,,,,,139763,,2589083,20760,2589083,20760,,,,,750241,2437,,0 +"2021-02-04","SC",7487,6730,93,757,18462,18462,1677,138,,382,3872020,22128,99849,,3758658,,239,453878,403928,3084,0,22744,91109,,,517290,202372,,0,4325898,25212,122593,686188,,,,0,4275948,23695 +"2021-02-04","SD",1788,,6,,6334,6334,126,13,,23,296591,863,,,,,17,108813,97115,174,0,,,,,102434,104508,,0,655982,1703,,,,,405404,1037,655982,1703 +"2021-02-04","TN",10202,8279,169,1923,17469,17469,1562,107,,433,,0,,,5671947,,236,736370,622951,3154,0,,123907,,,717799,697110,,0,6389746,29948,,933177,,,,0,6389746,29948 +"2021-02-04","TX",37727,,439,,,,10523,0,,3014,,0,,,,,,2448391,2132593,15281,0,128401,172200,,,2409593,2037888,,0,17846886,152012,937452,1880415,,,,0,17846886,152012 +"2021-02-04","UT",1711,,14,,13697,13697,449,49,2158,125,1450594,4397,,,2319351,742,,351273,,1273,0,,52386,,50209,327393,315614,,0,2646744,10759,,770263,,303130,1751100,5255,2646744,10759 +"2021-02-04","VA",6650,5755,75,895,21749,21749,2444,111,,486,,0,,,,,294,516398,412548,3059,0,23295,105474,,,506613,,5316450,15624,5316450,15624,209499,1102576,,,,0,,0 +"2021-02-04","VI",24,,0,,,,,0,,,39818,0,,,,,,2430,,0,0,,,,,,2336,,0,42248,0,,,,,42349,0,,0 +"2021-02-04","VT",181,,2,,,,69,0,,12,295866,1031,,,,,,12503,12189,174,0,,,,,,8953,,0,903253,8696,,,,,308055,1202,903253,8696 +"2021-02-04","WA",4388,,72,,17987,17987,789,95,,183,,0,,,,,83,316294,301372,1602,0,,,,,,,4645828,31042,4645828,31042,,,,,,0,,0 +"2021-02-04","WI",6545,5992,49,553,24634,24634,639,80,2186,173,2523102,5656,,,,,,597475,546955,1719,0,,,,,,524120,6278671,41946,6278671,41946,,,,,3070057,7174,,0 +"2021-02-04","WV",2080,1783,22,297,,,396,0,,109,,0,,,,,52,123044,98631,574,0,,,,,,102495,,0,1954655,12042,30826,,,,,0,1954655,12042 +"2021-02-04","WY",624,,0,,1300,1300,48,7,,,172426,258,,,624095,,,52468,44848,180,0,,,,,46545,50775,,0,670688,14145,,,,,217274,502,670688,14145 +"2021-02-03","AK",279,,0,,1213,1213,42,4,,,,0,,,1454776,,10,52956,,181,0,,,,,63692,,,0,1520206,8421,,,,,,0,1520206,8421 +"2021-02-03","AL",8203,6529,309,1674,42727,42727,1777,399,2561,,1774101,4663,,,,1457,,465056,365818,2118,0,,,,,,242143,,0,2139919,6083,,,139309,,2139919,6083,,0 +"2021-02-03","AR",4985,3994,46,991,13813,13813,884,83,,306,2241378,32481,,,2241378,1440,142,300430,239065,2426,0,,,,71874,,278882,,0,2480443,34213,,,,376729,,0,2480443,34213 +"2021-02-03","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-03","AZ",13576,12059,214,1517,53432,53432,3456,283,,955,2770865,10453,,,,,646,767379,718486,2296,0,,,,,,,,0,6795188,40519,,,419516,,3489351,12430,6795188,40519 +"2021-02-03","CA",41811,,481,,,,14578,0,,3772,,0,,,,,,3281271,3281271,10501,0,,,,,,,,0,43067233,215342,,,,,,0,43067233,215342 +"2021-02-03","CO",5664,4957,14,707,22117,22117,572,121,,,2038478,6571,305403,,,,,399267,379175,1269,0,46020,,,,,,5514198,32093,5514198,32093,352845,,,,2417653,7626,,0 +"2021-02-03","CT",7157,5839,24,1318,12257,12257,874,0,,,,0,,,5297652,,,257004,241353,482,0,,16128,,,293161,,,0,5598102,9509,,267549,,,,0,5598102,9509 +"2021-02-03","DC",926,,5,,,,237,0,,63,,0,,,,,34,37199,,61,0,,,,,,26226,1112239,1945,1112239,1945,,,,,413633,499,,0 +"2021-02-03","DE",1130,1017,22,113,,,332,0,,44,511331,1574,,,,,,78982,75074,286,0,,,,,82487,,1249291,5702,1249291,5702,,,,,590313,1860,,0 +"2021-02-03","FL",27472,,203,,74383,74383,5824,422,,,8533983,21756,578113,560932,14913135,,,1712326,1409576,6694,0,71851,,69600,,2235900,,19406606,79696,19406606,79696,650372,,630838,,10246309,28450,17229269,52205 +"2021-02-03","GA",14587,12907,137,1680,50953,50953,4335,268,8471,,,0,,,,,,922364,759228,4924,0,62078,,,,729320,,,0,6524223,30175,447290,,,,,0,6524223,30175 +"2021-02-03","GU",129,,0,,,,6,0,,2,100751,529,,,,,2,7618,7411,8,0,22,270,,,,7407,,0,108369,537,343,8321,,,,0,108162,537 +"2021-02-03","HI",414,414,4,,2096,2096,55,6,,21,,0,,,,,16,26746,26081,74,0,,,,,25665,,978901,-16946,978901,-16946,,,,,,0,,0 +"2021-02-03","IA",4975,,56,,,,382,0,,86,990901,2615,,88076,2214317,,34,269284,269284,908,0,,55837,14602,52546,291757,288259,,0,1260185,3523,,1158058,102726,220482,1262530,3522,2519240,12741 +"2021-02-03","ID",1741,1527,6,214,6732,6732,157,30,1176,46,473877,1498,,,,,,163656,133238,491,0,,,,,,83336,,0,607115,1878,,78973,,,607115,1878,997625,3647 +"2021-02-03","IL",21420,19375,84,2045,,,2469,0,,520,,0,,,,,270,1134231,,3314,0,,,,,,,,0,16258348,96894,,,,,,0,16258348,96894 +"2021-02-03","IN",10091,9713,37,378,40667,40667,1582,97,7116,344,2342287,3599,,,,,188,631331,,1428,0,,,,,718064,,,0,7096324,29149,,,,,2973618,5027,7096324,29149 +"2021-02-03","KS",3895,,86,,8578,8578,526,89,2333,129,907934,6985,,,,411,52,278915,,2247,0,,,,,,,,0,1186849,9232,,,,,1186849,9232,2248082,26268 +"2021-02-03","KY",3863,3523,51,340,17010,17010,1340,196,3618,368,,0,,,,,171,369519,288244,2581,0,8673,31691,,,231198,44073,,0,3635689,8825,108611,366826,,,,0,3635689,8825 +"2021-02-03","LA",9006,8421,53,585,,,1386,0,,,4683294,25050,,,,,180,406235,353507,2041,0,,,,,,363457,,0,5089529,27091,,375278,,,,0,5036801,26280 +"2021-02-03","MA",14708,14415,56,293,18402,18402,1635,394,,335,4120902,9229,,,,,203,531117,504564,2455,0,,,13999,,604434,389717,,0,13874158,91693,,,147875,484563,4625466,11415,13874158,91693 +"2021-02-03","MD",7220,7043,32,177,32406,32406,1485,115,,361,2853838,2148,,164849,,,,357483,357483,942,0,,,24579,,435241,9511,,0,7066871,14607,,,189428,,3211321,3090,7066871,14607 +"2021-02-03","ME",627,614,9,13,1410,1410,158,7,,49,,0,13740,,,,23,40233,32315,273,0,719,8496,,,37431,12467,,0,1388243,10231,14471,153722,,,,0,1388243,10231 +"2021-02-03","MI",15644,14704,35,940,,,1376,0,,314,,0,,,8859514,,165,615860,563893,1717,0,,,,,714218,481801,,0,9573732,40276,495084,,,,,0,9573732,40276 +"2021-02-03","MN",6234,5980,24,254,24493,24493,379,46,5065,77,2832737,4449,,,,,,463766,443374,634,0,,,,,,449707,6281780,16944,6281780,16944,,347181,,,3276111,4953,,0 +"2021-02-03","MO",7098,,10,,,,1680,0,,386,1783819,3747,118118,,3666943,,232,461720,461720,1233,0,20444,72355,,,509816,,,0,4185641,12358,138749,662502,125831,286721,2245539,4980,4185641,12358 +"2021-02-03","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,133,133,0,0,,,,,,29,,0,17562,0,,,,,17542,0,26131,0 +"2021-02-03","MS",6158,4430,26,1728,8777,8777,930,0,,242,1327630,0,,,,,148,277322,174612,791,0,,,,,,222812,,0,1604952,791,74723,648722,,,,0,1501413,0 +"2021-02-03","MT",1303,,54,,4307,4307,121,34,,18,,0,,,,,13,94810,92398,426,0,,,,,,90086,,0,968115,7985,,,,,,0,968115,7985 +"2021-02-03","NC",9578,8630,169,948,,,2706,0,,635,,0,,,,,,776307,687750,12079,0,,,,,,,,0,8451902,29042,,571413,,,,0,8451902,29042 +"2021-02-03","ND",1447,,0,,3794,3794,42,5,554,8,297359,527,11953,,,,,97936,93468,138,0,1442,,,,,95601,1351985,3781,1351985,3781,13395,98674,,,395295,665,1438790,4878 +"2021-02-03","NE",1931,,2,,5844,5844,305,12,,,736508,2229,,,1908965,,,192042,,605,0,,,,,221689,137684,,0,2132924,22776,,,,,929032,2834,2132924,22776 +"2021-02-03","NH",1076,,10,,1042,1042,207,6,331,,554855,2236,,,,,,66721,47616,337,0,,,,,,61564,,0,1281021,13649,38117,140874,36631,,602471,1971,1281021,13649 +"2021-02-03","NJ",21693,19506,109,2187,60984,60984,2986,162,,525,8898177,30865,,,,,374,705807,631309,2311,0,,,,,,,,0,9603984,33176,,,,,,0,9529486,35529 +"2021-02-03","NM",3338,,28,,12247,12247,476,62,,,,0,,,,,,175652,,670,0,,,,,,107645,,0,2376514,10620,,,,,,0,2376514,10620 +"2021-02-03","NV",4373,,49,,,,1145,0,,259,1058818,2192,,,,,159,280707,280707,750,0,,,,,,,2511160,7840,2511160,7840,,,,,1339525,2942,,0 +"2021-02-03","NY",35631,,165,,89995,89995,8082,0,,1522,,0,,,,,1003,1433304,,5925,0,,,,,,,32613477,126489,32613477,126489,,,,,,0,,0 +"2021-02-03","OH",11430,10167,94,1263,46873,46873,2379,214,6766,627,,0,,,,,415,906727,788126,3991,0,,72309,,,814771,799819,,0,9165199,18723,,1326543,,,,0,9165199,18723 +"2021-02-03","OK",3654,,52,,22167,22167,1048,171,,303,2838989,16519,,,2838989,,,394283,,2119,0,11794,,,,366140,363808,,0,3233272,18638,115559,,,,,0,3213657,18048 +"2021-02-03","OR",1981,,23,,7854,7854,291,58,,65,,0,,,3028232,,35,143978,,605,0,,,,,190515,,,0,3218747,16540,,,,,,0,3218747,16540 +"2021-02-03","PA",21955,,143,,,,3224,0,,657,3662502,5873,,,,,378,853616,741617,3128,0,,,,,,708501,9329891,22984,9329891,22984,,,,,4404119,8157,,0 +"2021-02-03","PR",1853,1562,7,291,,,307,0,,54,305972,0,,,395291,,34,94662,87749,136,0,69838,,,,20103,78813,,0,400634,136,,,,,,0,415664,0 +"2021-02-03","RI",2198,,12,,8369,8369,298,38,,42,631100,1646,,,2429232,,23,116704,,513,0,,,,,139091,,2568323,14579,2568323,14579,,,,,747804,2159,,0 +"2021-02-03","SC",7394,6663,76,731,18324,18324,1760,178,,391,3849892,13459,99705,,3737363,,238,450794,402361,2890,0,22637,89825,,,514890,200634,,0,4300686,16349,122342,675171,,,,0,4252253,15348 +"2021-02-03","SD",1782,,3,,6321,6321,133,17,,25,295728,752,,,,,13,108639,96989,208,0,,,,,102305,104305,,0,654279,1599,,,,,404367,960,654279,1599 +"2021-02-03","TN",10033,8168,133,1865,17362,17362,1638,86,,474,,0,,,5644464,,266,733216,620684,1856,0,,122962,,,715334,693707,,0,6359798,12728,,923149,,,,0,6359798,12728 +"2021-02-03","TX",37288,,418,,,,10827,0,,3014,,0,,,,,,2433110,2120299,17620,0,126983,171709,,,2390223,2015866,,0,17694874,89053,933639,1868992,,,,0,17694874,89053 +"2021-02-03","UT",1697,,12,,13648,13648,413,72,2146,119,1446197,4767,,,2309587,736,,350000,,1591,0,,51959,,49806,326398,312872,,0,2635985,12545,,757818,,298966,1745845,5870,2635985,12545 +"2021-02-03","VA",6575,5712,58,863,21638,21638,2545,122,,500,,0,,,,,309,513339,410550,2959,0,23249,104600,,,504780,,5300826,19100,5300826,19100,209321,1089699,,,,0,,0 +"2021-02-03","VI",24,,0,,,,,0,,,39818,118,,,,,,2430,,4,0,,,,,,2336,,0,42248,122,,,,,42349,126,,0 +"2021-02-03","VT",179,,3,,,,54,0,,8,294835,937,,,,,,12329,12018,133,0,,,,,,8759,,0,894557,8436,,,,,306853,1068,894557,8436 +"2021-02-03","WA",4316,,-2,,17892,17892,838,80,,194,,0,,,,,89,314692,300018,1357,0,,,,,,,4614786,17196,4614786,17196,,,,,,0,,0 +"2021-02-03","WI",6496,5951,16,545,24554,24554,655,94,2186,158,2517446,4689,,,,,,595756,545437,1539,0,,,,,,522361,6236725,32129,6236725,32129,,,,,3062883,5866,,0 +"2021-02-03","WV",2058,1762,27,296,,,456,0,,129,,0,,,,,55,122470,98180,535,0,,,,,,101200,,0,1942613,8491,30695,,,,,0,1942613,8491 +"2021-02-03","WY",624,,0,,1293,1293,47,4,,,172168,343,,,610246,,,52288,44604,160,0,,,,,46250,50499,,0,656543,9394,,,,,216772,478,656543,9394 +"2021-02-02","AK",279,,17,,1209,1209,49,4,,,,0,,,1446577,,10,52775,,107,0,,,,,63485,,,0,1511785,4123,,,,,,0,1511785,4123 +"2021-02-02","AL",7894,6314,206,1580,42328,42328,1868,469,2555,,1769438,-11759,,,,1456,,462938,364398,2078,0,,,,,,242143,,0,2133836,-10589,,,138639,,2133836,-10589,,0 +"2021-02-02","AR",4939,3971,44,968,13730,13730,869,79,,260,2208897,6936,,,2208897,1433,141,298004,237333,1510,0,,,,71087,,276704,,0,2446230,7729,,,,371564,,0,2446230,7729 +"2021-02-02","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-02","AZ",13362,11912,238,1450,53149,53149,3513,163,,944,2760412,6876,,,,,671,765083,716509,2938,0,,,,,,,,0,6754669,28419,,,418964,,3476921,9584,6754669,28419 +"2021-02-02","CA",41330,,422,,,,14999,0,,3894,,0,,,,,,3270770,3270770,12064,0,,,,,,,,0,42851891,282698,,,,,,0,42851891,282698 +"2021-02-02","CO",5650,4942,9,708,21996,21996,599,152,,,2031907,3429,304125,,,,,397998,378120,935,0,45740,,,,,,5482105,14235,5482105,14235,351423,,,,2410027,4148,,0 +"2021-02-02","CT",7133,5822,14,1311,12257,12257,900,0,,,,0,,,5288674,,,256522,240938,2568,0,,16028,,,292660,,,0,5588593,51862,,264276,,,,0,5588593,51862 +"2021-02-02","DC",921,,5,,,,232,0,,62,,0,,,,,34,37138,,130,0,,,,,,26086,1110294,4224,1110294,4224,,,,,413134,860,,0 +"2021-02-02","DE",1108,997,7,111,,,326,0,,42,509757,437,,,,,,78696,74827,201,0,,,,,82026,,1243589,6669,1243589,6669,,,,,588453,638,,0 +"2021-02-02","FL",27269,,140,,73961,73961,6020,410,,,8512227,31742,578113,560932,14870465,,,1705632,1405015,10332,0,71851,,69600,,2226645,,19326910,109904,19326910,109904,650372,,630838,,10217859,42074,17177064,93464 +"2021-02-02","GA",14450,12772,208,1678,50685,50685,4335,362,8439,,,0,,,,,,917440,755412,4961,0,61862,,,,725757,,,0,6494048,19915,446775,,,,,0,6494048,19915 +"2021-02-02","GU",129,,0,,,,6,0,,2,100222,458,,,,,2,7610,7403,2,0,22,270,,,,7381,,0,107832,460,343,8305,,,,0,107625,460 +"2021-02-02","HI",410,410,0,,2090,2090,61,4,,19,,0,,,,,15,26672,26007,64,0,,,,,25821,,995847,2541,995847,2541,,,,,,0,,0 +"2021-02-02","IA",4919,,13,,,,390,0,,88,988286,1011,,87806,2202680,,31,268376,268376,463,0,,55511,14364,52242,290749,286315,,0,1256662,1474,,1146087,102218,219208,1259008,1481,2506499,6612 +"2021-02-02","ID",1735,1522,10,213,6702,6702,157,28,1172,46,472379,1742,,,,,,163165,132858,482,0,,,,,,82721,,0,605237,2122,,78973,,,605237,2122,993978,3534 +"2021-02-02","IL",21336,19306,63,2030,,,2447,0,,533,,0,,,,,265,1130917,,2304,0,,,,,,,,0,16161454,60899,,,,,,0,16161454,60899 +"2021-02-02","IN",10054,9677,65,377,40570,40570,1624,133,7097,347,2338688,3498,,,,,200,629903,,1512,0,,,,,716476,,,0,7067175,27431,,,,,2968591,5010,7067175,27431 +"2021-02-02","KS",3809,,0,,8489,8489,381,0,2311,97,900949,0,,,,412,48,276668,,0,0,,,,,,,,0,1177617,0,,,,,1177617,0,2221814,0 +"2021-02-02","KY",3812,3478,32,334,16814,16814,1335,89,3584,373,,0,,,,,172,366938,286537,2431,0,8653,31005,,,230294,43714,,0,3626864,5403,108556,348469,,,,0,3626864,5403 +"2021-02-02","LA",8953,8375,41,578,,,1440,0,,,4658244,40874,,,,,189,404194,352277,2603,0,,,,,,344321,,0,5062438,43477,,367908,,,,0,5010521,42528 +"2021-02-02","MA",14652,14362,45,290,18008,18008,1631,0,,353,4111673,8264,,,,,224,528662,502378,2239,0,,,13999,,601762,389717,,0,13782465,61265,,,147875,480992,4614051,10227,13782465,61265 +"2021-02-02","MD",7188,7012,34,176,32291,32291,1467,110,,366,2851690,3127,,163059,,,,356541,356541,905,0,,,23333,,434121,9502,,0,7052264,13702,,,186392,,3208231,4032,7052264,13702 +"2021-02-02","ME",618,605,23,13,1403,1403,157,9,,48,,0,13725,,,,24,39960,32118,417,0,714,8411,,,37198,12440,,0,1378012,3922,14451,152125,,,,0,1378012,3922 +"2021-02-02","MI",15609,14672,73,937,,,1404,0,,337,,0,,,8820814,,174,614143,562510,1433,0,,,,,712642,481801,,0,9533456,18400,493773,,,,,0,9533456,18400 +"2021-02-02","MN",6210,5961,8,249,24447,24447,394,95,5056,84,2828288,-217,,,,,,463132,442870,604,0,,,,,,448595,6264836,8980,6264836,8980,,343096,,,3271158,263,,0 +"2021-02-02","MO",7088,,340,,,,1746,0,,398,1780072,2022,117699,,3655928,,236,460487,460487,890,0,20281,71453,,,508482,,,0,4173283,7771,138167,648239,125388,282015,2240559,2912,4173283,7771 +"2021-02-02","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,133,133,1,0,,,,,,29,,0,17562,1,,,,,17542,0,26131,0 +"2021-02-02","MS",6132,4418,76,1714,8777,8777,941,0,,262,1327630,0,,,,,152,276531,174208,825,0,,,,,,222812,,0,1604161,825,74723,648722,,,,0,1501413,0 +"2021-02-02","MT",1249,,15,,4273,4273,116,25,,20,,0,,,,,13,94384,92062,314,0,,,,,,89542,,0,960130,3412,,,,,,0,960130,3412 +"2021-02-02","NC",9409,8503,67,906,,,2741,0,,645,,0,,,,,,764228,682726,2926,0,,,,,,,,0,8422860,21451,,527866,,,,0,8422860,21451 +"2021-02-02","ND",1447,,0,,3789,3789,45,7,553,7,296832,345,11953,,,,,97798,93381,115,0,1442,,,,,95491,1348204,1650,1348204,1650,13395,96270,,,394630,460,1433912,1979 +"2021-02-02","NE",1929,,9,,5832,5832,305,17,,,734279,931,,,1887002,,,191437,,487,0,,,,,220917,137446,,0,2110148,7171,,,,,926198,1418,2110148,7171 +"2021-02-02","NH",1066,,7,,1036,1036,202,0,330,,552619,0,,,,,,66384,47263,326,0,,,,,,61096,,0,1267372,0,38048,136456,36609,,600500,618,1267372,0 +"2021-02-02","NJ",21584,19455,71,2129,60822,60822,2892,201,,516,8867312,0,,,,,366,703496,629360,3150,0,,,,,,,,0,9570808,3150,,,,,,0,9493957,0 +"2021-02-02","NM",3310,,15,,12185,12185,492,66,,,,0,,,,,,174982,,432,0,,,,,,105568,,0,2365894,10994,,,,,,0,2365894,10994 +"2021-02-02","NV",4324,,46,,,,1209,0,,265,1056626,1605,,,,,182,279957,279957,811,0,,,,,,,2503320,7250,2503320,7250,,,,,1336583,2416,,0 +"2021-02-02","NY",35466,,147,,89995,89995,8067,0,,1503,,0,,,,,1004,1427379,,8215,0,,,,,,,32486988,150199,32486988,150199,,,,,,0,,0 +"2021-02-02","OH",11336,10084,106,1252,46659,46659,2488,221,6730,641,,0,,,,,426,902736,785395,3657,0,,71512,,,812704,793766,,0,9146476,41619,,1303927,,,,0,9146476,41619 +"2021-02-02","OK",3602,,38,,21996,21996,1123,39,,320,2822470,27129,,,2822470,,,392164,,1296,0,11794,,,,364500,360702,,0,3214634,28425,115559,,,,,0,3195609,29609 +"2021-02-02","OR",1958,,1,,7796,7796,336,58,,68,,0,,,3012391,,32,143373,,957,0,,,,,189816,,,0,3202207,39457,,,,,,0,3202207,39457 +"2021-02-02","PA",21812,,125,,,,3281,0,,669,3656629,9981,,,,,380,850488,739333,4410,0,,,,,,697400,9306907,42303,9306907,42303,,,,,4395962,13078,,0 +"2021-02-02","PR",1846,1555,10,291,,,298,0,,57,305972,0,,,395291,,41,94526,87665,288,0,69596,,,,20103,78813,,0,400498,288,,,,,,0,415664,0 +"2021-02-02","RI",2186,,13,,8331,8331,307,35,,41,629454,660,,,2415208,,25,116191,,235,0,,,,,138536,,2553744,8240,2553744,8240,,,,,745645,895,,0 +"2021-02-02","SC",7318,6599,35,719,18146,18146,1832,33,,401,3836433,23556,99617,,3724524,,245,447904,400472,1988,0,22564,88545,,,512381,199045,,0,4284337,25544,122181,666223,,,,0,4236905,25136 +"2021-02-02","SD",1779,,1,,6304,6304,131,10,,21,294976,408,,,,,17,108431,96847,116,0,,,,,102173,104052,,0,652680,593,,,,,403407,524,652680,593 +"2021-02-02","TN",9900,8068,147,1832,17276,17276,1687,104,,471,,0,,,5633076,,277,731360,619612,2173,0,,122057,,,713994,688963,,0,6347070,10080,,915501,,,,0,6347070,10080 +"2021-02-02","TX",36870,,331,,,,11002,0,,3073,,0,,,,,,2415490,2106729,23047,0,126251,169937,,,2377723,1993704,,0,17605821,101463,931104,1849176,,,,0,17605821,101463 +"2021-02-02","UT",1685,,17,,13576,13576,485,61,2136,130,1441430,3224,,,2298281,734,,348409,,1201,0,,51451,,49315,325159,309977,,0,2623440,9622,,746132,,295687,1739975,3940,2623440,9622 +"2021-02-02","VA",6517,5684,43,833,21516,21516,2473,72,,493,,0,,,,,304,510380,408421,2740,0,23215,104031,,,502961,,5281726,19925,5281726,19925,209170,1078482,,,,0,,0 +"2021-02-02","VI",24,,0,,,,,0,,,39700,246,,,,,,2426,,5,0,,,,,,2317,,0,42126,251,,,,,42223,255,,0 +"2021-02-02","VT",176,,1,,,,59,0,,12,293898,24,,,,,,12196,11887,113,0,,,,,,8581,,0,886121,-22702,,,,,305785,136,886121,-22702 +"2021-02-02","WA",4318,,33,,17812,17812,814,106,,203,,0,,,,,90,313335,299098,1738,0,,,,,,,4597590,49351,4597590,49351,,,,,,0,,0 +"2021-02-02","WI",6480,5937,44,543,24460,24460,686,123,2185,146,2512757,2087,,,,,,594217,544260,1296,0,,,,,,520325,6204596,43823,6204596,43823,,,,,3057017,3182,,0 +"2021-02-02","WV",2031,1737,3,294,,,465,0,,131,,0,,,,,57,121935,97797,510,0,,,,,,99857,,0,1934122,8816,30614,,,,,0,1934122,8816 +"2021-02-02","WY",624,,28,,1289,1289,53,0,,,171825,-1554,,,607903,,,52128,44469,71,0,,,,,46168,50431,,0,647149,-4642,,,,,216294,-1539,647149,-4642 +"2021-02-01","AK",262,,0,,1205,1205,43,0,,,,0,,,1442574,,10,52668,,70,0,,,,,63384,,,0,1507662,7337,,,,,,0,1507662,7337 +"2021-02-01","AL",7688,6171,0,1517,41859,41859,1888,0,2552,,1781197,2811,,,,1456,,460860,363228,1221,0,,,,,,242143,,0,2144425,3720,,,105851,,2144425,3720,,0 +"2021-02-01","AR",4895,3937,27,958,13651,13651,889,41,,276,2201961,6091,,,2201961,1426,146,296494,236540,1226,0,,,,70315,,274904,,0,2438501,6963,,,,363592,,0,2438501,6963 +"2021-02-01","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-02-01","AZ",13124,11707,4,1417,52986,52986,3654,222,,984,2753536,6493,,,,,662,762145,713801,3741,0,,,,,,,,0,6726250,27498,,,418734,,3467337,10021,6726250,27498 +"2021-02-01","CA",40908,,211,,,,15212,0,,3949,,0,,,,,,3258706,3258706,15358,0,,,,,,,,0,42569193,290175,,,,,,0,42569193,290175 +"2021-02-01","CO",5641,4932,4,709,21844,21844,611,11,,,2028478,16736,303256,,,,,397063,377401,884,0,45552,,,,,,5467870,15820,5467870,15820,349865,,,,2405879,5316,,0 +"2021-02-01","CT",7119,5806,73,1313,12257,12257,912,0,,,,0,,,5239888,,,253954,238535,3931,0,,15705,,,289594,,,0,5536731,98,,257183,,,,0,5536731,98 +"2021-02-01","DC",916,,3,,,,240,0,,66,,0,,,,,46,37008,,136,0,,,,,,25915,1106070,5604,1106070,5604,,,,,412274,1134,,0 +"2021-02-01","DE",1101,991,11,110,,,321,0,,39,509320,1379,,,,,,78495,74678,424,0,,,,,81472,,1236920,6037,1236920,6037,,,,,587815,1803,,0 +"2021-02-01","FL",27129,,214,,73551,73551,6142,167,,,8480485,19021,578113,560932,14791520,,,1695300,1398012,5600,0,71851,,69600,,2212703,,19217006,59496,19217006,59496,650372,,630838,,10175785,24621,17083600,54434 +"2021-02-01","GA",14242,12613,44,1629,50323,50323,4438,86,8400,,,0,,,,,,912479,752448,3034,0,61724,,,,723022,,,0,6474133,21387,446424,,,,,0,6474133,21387 +"2021-02-01","GU",129,,0,,,,6,0,,2,99764,1221,,,,,2,7608,7401,21,0,22,270,,,,7377,,0,107372,1242,343,8240,,,,0,107165,1250 +"2021-02-01","HI",410,410,0,,2086,2086,63,19,,16,,0,,,,,12,26608,25943,90,0,,,,,25806,,993306,5831,993306,5831,,,,,,0,,0 +"2021-02-01","IA",4906,,5,,,,368,0,,92,987275,1145,,87398,2196634,,28,267913,267913,355,0,,55190,14114,51905,290215,283036,,0,1255188,1500,,1131661,101560,217424,1257527,1501,2499887,4497 +"2021-02-01","ID",1725,1513,0,212,6674,6674,225,0,1169,57,470637,0,,,,,,162683,132478,0,0,,,,,,81591,,0,603115,0,,78973,,,603115,0,990444,0 +"2021-02-01","IL",21273,19259,20,2014,,,2387,0,,515,,0,,,,,278,1128613,,2312,0,,,,,,,,0,16100555,61263,,,,,,0,16100555,61263 +"2021-02-01","IN",9989,9613,15,376,40437,40437,1594,89,7065,374,2335190,4005,,,,,201,628391,,1709,0,,,,,714746,,,0,7039744,25221,,,,,2963581,5714,7039744,25221 +"2021-02-01","KS",3809,,30,,8489,8489,381,72,2311,97,900949,6911,,,,412,48,276668,,1983,0,,,,,,,,0,1177617,8894,,,,,1177617,8894,2221814,26960 +"2021-02-01","KY",3780,3450,35,330,16725,16725,1314,38,3568,337,,0,,,,,178,364507,285138,1617,0,8605,30681,,,229908,43492,,0,3621461,31239,108391,341177,,,,0,3621461,31239 +"2021-02-01","LA",8912,8340,53,572,,,1403,0,,,4617370,10548,,,,,187,401591,350623,965,0,,,,,,344321,,0,5018961,11513,,360086,,,,0,4967993,11474 +"2021-02-01","MA",14607,14317,30,290,18008,18008,1676,0,,373,4103409,11221,,,,,222,526423,500415,2398,0,,,13999,,599434,389717,,0,13721200,88302,,,147875,476976,4603824,13491,13721200,88302 +"2021-02-01","MD",7154,6978,27,176,32181,32181,1437,126,,371,2848563,7449,,163059,,,,355636,355636,1163,0,,,23333,,433006,9501,,0,7038562,25408,,,186392,,3204199,8612,7038562,25408 +"2021-02-01","ME",595,585,5,10,1394,1394,164,4,,51,,0,13707,,,,28,39543,31853,219,0,713,8305,,,37042,12422,,0,1374090,7270,14432,150334,,,,0,1374090,7270 +"2021-02-01","MI",15536,14609,11,927,,,1409,0,,336,,0,,,8803464,,170,612710,561307,2572,0,,,,,711592,481801,,0,9515056,49911,492095,,,,,0,9515056,49911 +"2021-02-01","MN",6202,5953,2,249,24352,24352,387,44,5045,92,2828505,5983,,,,,,462528,442390,721,0,,,,,,447420,6255856,19216,6255856,19216,,341986,,,3270895,6595,,0 +"2021-02-01","MO",6748,,0,,,,1778,0,,401,1778050,2661,116694,,3649122,,244,459597,459597,778,0,20061,70855,,,507534,,,0,4165512,8720,136941,640880,124439,278896,2237647,3439,4165512,8720 +"2021-02-01","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,132,132,0,0,,,,,,29,,0,17561,0,,,,,17542,0,26131,0 +"2021-02-01","MS",6056,4385,11,1671,8777,8777,948,130,,269,1327630,33142,,,,,152,275706,173783,705,0,,,,,,222812,,0,1603336,33847,74723,648722,,,,0,1501413,37779 +"2021-02-01","MT",1234,,1,,4248,4248,108,3,,20,,0,,,,,15,94070,91810,121,0,,,,,,89218,,0,956718,2469,,,,,,0,956718,2469 +"2021-02-01","NC",9342,8448,7,894,,,2781,0,,636,,0,,,,,,761302,680446,3776,0,,,,,,,,0,8401409,45291,,524653,,,,0,8401409,45291 +"2021-02-01","ND",1447,,5,,3782,3782,47,2,553,8,296487,31,11953,,,,,97683,93323,53,0,1442,,,,,95308,1346554,555,1346554,555,13395,93194,,,394170,84,1431933,687 +"2021-02-01","NE",1920,,0,,5815,5815,312,11,,,733348,629,,,1880481,,,190950,,237,0,,,,,220260,136972,,0,2102977,2854,,,,,924780,866,2102977,2854 +"2021-02-01","NH",1059,,2,,1036,1036,193,-1,330,,552619,792,,,,,,66058,47263,363,0,,,,,,60337,,0,1267372,5215,38048,136456,36570,,599882,1049,1267372,5215 +"2021-02-01","NJ",21513,19384,29,2129,60621,60621,2865,77,,531,8867312,156167,,,,,355,700346,626645,3517,0,,,,,,,,0,9567658,159684,,,,,,0,9493957,167610 +"2021-02-01","NM",3295,,12,,12119,12119,477,44,,,,0,,,,,,174550,,486,0,,,,,,104125,,0,2354900,11445,,,,,,0,2354900,11445 +"2021-02-01","NV",4278,,8,,,,1247,0,,290,1055021,2204,,,,,184,279146,279146,838,0,,,,,,,2496070,8021,2496070,8021,,,,,1334167,3042,,0 +"2021-02-01","NY",35319,,141,,89995,89995,8003,0,,1500,,0,,,,,987,1419164,,8508,0,,,,,,,32336789,175038,32336789,175038,,,,,,0,,0 +"2021-02-01","OH",11230,10000,55,1230,46438,46438,2521,223,6709,652,,0,,,,,454,899079,783158,3287,0,,70877,,,810600,786249,,0,9104857,30787,,1291665,,,,0,9104857,30787 +"2021-02-01","OK",3564,,17,,21957,21957,1184,36,,345,2795341,0,,,2795341,,,390868,,1396,0,11794,,,,360890,358040,,0,3186209,1396,115559,,,,,0,3166000,0 +"2021-02-01","OR",1957,,0,,7738,7738,320,0,,73,,0,,,2947838,,35,142416,,0,0,,,,,187912,,,0,3162750,0,,,,,,0,3162750,0 +"2021-02-01","PA",21687,,26,,,,3280,0,,650,3646648,9497,,,,,420,846078,736236,2854,0,,,,,,693783,9264604,35893,9264604,35893,,,,,4382884,11990,,0 +"2021-02-01","PR",1836,1547,7,289,,,282,0,,55,305972,0,,,395291,,40,94238,87440,614,0,69231,,,,20103,78813,,0,400210,614,,,,,,0,415664,0 +"2021-02-01","RI",2173,,5,,8296,8296,316,117,,47,628794,975,,,2407225,,29,115956,,249,0,,,,,138279,,2545504,6710,2545504,6710,,,,,744750,1224,,0 +"2021-02-01","SC",7283,6564,241,719,18113,18113,1842,23,,391,3812877,28738,99396,,3701596,,240,445916,398892,2530,0,22421,88101,,,510173,197810,,0,4258793,31268,121817,662554,,,,0,4211769,30918 +"2021-02-01","SD",1778,,0,,6294,6294,126,4,,27,294568,205,,,,,20,108315,96735,65,0,,,,,102120,103709,,0,652087,974,,,,,402883,270,652087,974 +"2021-02-01","TN",9753,7975,103,1778,17172,17172,1682,52,,447,,0,,,5624287,,253,729187,618319,1326,0,,121133,,,712703,685162,,0,6336990,9606,,905061,,,,0,6336990,9606 +"2021-02-01","TX",36539,,48,,,,11074,0,,3111,,0,,,,,,2392443,2087170,31811,0,124863,167830,,,2362669,1974572,,0,17504358,105238,924087,1819443,,,,0,17504358,105238 +"2021-02-01","UT",1668,,3,,13515,13515,488,47,2115,129,1438206,2738,,,2289501,731,,347208,,584,0,,50888,,48785,324317,307848,,0,2613818,6460,,733183,,292128,1736035,3309,2613818,6460 +"2021-02-01","VA",6474,5666,10,808,21444,21444,2446,35,,478,,0,,,,,304,507640,406591,2861,0,22977,103381,,,500306,,5261801,27646,5261801,27646,208424,1064820,,,,0,,0 +"2021-02-01","VI",24,,0,,,,,0,,,39454,364,,,,,,2421,,23,0,,,,,,2306,,0,41875,387,,,,,41968,381,,0 +"2021-02-01","VT",175,,1,,,,67,0,,6,293874,1826,,,,,,12083,11775,118,0,,,,,,8268,,0,908823,11472,,,,,305649,1938,908823,11472 +"2021-02-01","WA",4285,,0,,17706,17706,797,0,,193,,0,,,,,88,311597,297513,0,0,,,,,,,4548239,0,4548239,0,,,,,,0,,0 +"2021-02-01","WI",6436,5897,2,539,24337,24337,697,39,2181,168,2510670,3070,,,,,,592921,543165,781,0,,,,,,518801,6160773,-16802,6160773,-16802,,,,,3053835,3820,,0 +"2021-02-01","WV",2028,1735,4,293,,,438,0,,118,,0,,,,,48,121425,97374,424,0,,,,,,98782,,0,1925306,5006,30598,,,,,0,1925306,5006 +"2021-02-01","WY",596,,0,,1289,1289,53,5,,,173379,922,,,605608,,,52057,44454,145,0,,,,,46137,50317,,0,651791,16806,,,,,217833,1260,651791,16806 +"2021-01-31","AK",262,,0,,1205,1205,42,0,,,,0,,,1435424,,9,52598,,128,0,,,,,63202,,,0,1500325,4440,,,,,,0,1500325,4440 +"2021-01-31","AL",7688,6171,122,1517,41859,41859,1884,0,2551,,1778386,10433,,,,1455,,459639,362319,4057,0,,,,,,242143,,0,2140705,13397,,,105584,,2140705,13397,,0 +"2021-01-31","AR",4868,3915,30,953,13610,13610,913,11,,272,2195870,10581,,,2195870,1421,148,295268,235668,881,0,,,,69915,,273216,,0,2431538,11344,,,,361830,,0,2431538,11344 +"2021-01-31","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-31","AZ",13120,11702,22,1418,52764,52764,3664,758,,979,2747043,12580,,,,,663,758404,710273,5025,0,,,,,,,,0,6698752,54820,,,418037,,3457316,17189,6698752,54820 +"2021-01-31","CA",40697,,481,,,,15676,0,,4047,,0,,,,,,3243348,3243348,18974,0,,,,,,,,0,42279018,298562,,,,,,0,42279018,298562 +"2021-01-31","CO",5637,4882,21,712,21833,21833,652,21,,,2011742,0,301448,,,,,396179,374087,1163,0,45018,,,,,,5452050,25991,5452050,25991,348808,,,,2400563,6813,,0 +"2021-01-31","CT",7046,5741,0,1305,12257,12257,985,0,,,,0,,,5239795,,,250023,234814,0,0,,15351,,,289589,,,0,5536633,1952,,249128,,,,0,5536633,1952 +"2021-01-31","DC",913,,4,,,,251,0,,72,,0,,,,,46,36872,,210,0,,,,,,25810,1100466,7857,1100466,7857,,,,,411140,1805,,0 +"2021-01-31","DE",1090,982,9,108,,,315,0,,43,507941,1680,,,,,,78071,74279,520,0,,,,,80995,,1230883,9697,1230883,9697,,,,,586012,2200,,0 +"2021-01-31","FL",26915,,120,,73384,73384,6101,164,,,8461464,39124,578113,560932,14745059,,,1689700,1394061,7604,0,71851,,69600,,2204930,,19157510,129743,19157510,129743,650372,,630838,,10151164,46728,17029166,106467 +"2021-01-31","GA",14198,12570,2,1628,50237,50237,4476,105,8399,,,0,,,,,,909445,749867,3587,0,61213,,,,719935,,,0,6452746,27704,445208,,,,,0,6452746,27704 +"2021-01-31","GU",129,,0,,,,7,0,,2,98543,0,,,,,2,7587,7380,1,0,22,270,,,,7355,,0,106130,1,340,8139,,,,0,105915,0 +"2021-01-31","HI",410,410,3,,2067,2067,73,0,,19,,0,,,,,15,26518,25853,82,0,,,,,25468,,987475,4569,987475,4569,,,,,,0,,0 +"2021-01-31","IA",4901,,250,,,,358,0,,94,986130,1812,,87256,2192534,,29,267558,267558,624,0,,54951,14024,51688,289845,282324,,0,1253688,2436,,1127364,101326,216692,1256026,2440,2495390,6728 +"2021-01-31","ID",1725,1513,0,212,6674,6674,225,15,1169,57,470637,1208,,,,,,162683,132478,328,0,,,,,,81591,,0,603115,1469,,78973,,,603115,1469,990444,3333 +"2021-01-31","IL",21253,19243,40,2010,,,2467,0,,538,,0,,,,,289,1126301,,2428,0,,,,,,,,0,16039292,86871,,,,,,0,16039292,86871 +"2021-01-31","IN",9974,9598,7,376,40348,40348,1584,82,7054,372,2331185,6699,,,,,214,626682,,1723,0,,,,,712717,,,0,7014523,38115,,,,,2957867,8422,7014523,38115 +"2021-01-31","KS",3779,,0,,8417,8417,550,0,2290,145,894038,0,,,,412,65,274685,,0,0,,,,,,,,0,1168723,0,,,,,1168723,0,2194854,0 +"2021-01-31","KY",3745,3418,31,327,16687,16687,1327,28,3565,354,,0,,,,,173,362890,284053,1766,0,8510,30158,,,227750,43380,,0,3590222,0,108050,336746,,,,0,3590222,0 +"2021-01-31","LA",8859,8291,58,568,,,1416,0,,,4606822,40046,,,,,199,400626,349697,3350,0,,,,,,344321,,0,5007448,43396,,359162,,,,0,4956519,42749 +"2021-01-31","MA",14577,14287,46,290,18008,18008,1676,0,,371,4092188,11888,,,,,231,524025,498145,2665,0,,,13999,,596510,389717,,0,13632898,93918,,,147875,475368,4590333,14434,13632898,93918 +"2021-01-31","MD",7127,6951,20,176,32055,32055,1471,167,,364,2841114,9301,,163059,,,,354473,354473,1747,0,,,23333,,429336,9499,,0,7013154,46230,,,186392,,3195587,11048,7013154,46230 +"2021-01-31","ME",590,580,0,10,1390,1390,160,4,,52,,0,13643,,,,29,39324,31689,156,0,698,8221,,,36795,12409,,0,1366820,12110,14353,148776,,,,0,1366820,12110 +"2021-01-31","MI",15525,14601,0,924,,,1479,0,,364,,0,,,8756219,,193,610138,559241,0,0,,,,,708926,481801,,0,9465145,0,490470,,,,,0,9465145,0 +"2021-01-31","MN",6200,5952,13,248,24308,24308,450,39,5040,95,2822522,10431,,,,,,461807,441778,988,0,,,,,,446137,6236640,26296,6236640,26296,,340162,,,3264300,11270,,0 +"2021-01-31","MO",6748,,0,,,,1908,0,,427,1775389,3757,116579,,3641261,,273,458819,458819,1040,0,19994,70617,,,506692,,,0,4156792,13317,136758,638827,124288,277822,2234208,4797,4156792,13317 +"2021-01-31","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,132,132,0,0,,,,,,29,,0,17561,0,,,,,17542,0,26131,0 +"2021-01-31","MS",6045,4383,27,1662,8647,8647,953,0,,242,1294488,0,,,,,155,275001,173349,811,0,,,,,,222812,,0,1569489,811,72089,617477,,,,0,1463634,0 +"2021-01-31","MT",1233,,1,,4245,4245,101,-1,,20,,0,,,,,15,93949,91710,187,0,,,,,,89073,,0,954249,3506,,,,,,0,954249,3506 +"2021-01-31","NC",9335,8442,48,893,,,2782,0,,635,,0,,,,,,757526,676973,4899,0,,,,,,,,0,8356118,56855,,522474,,,,0,8356118,56855 +"2021-01-31","ND",1442,,0,,3780,3780,50,2,553,8,296456,226,11953,,,,,97630,93293,68,0,1442,,,,,95227,1345999,1600,1345999,1600,13395,92905,,,394086,294,1431246,1880 +"2021-01-31","NE",1920,,0,,5804,5804,320,8,,,732719,338,,,1877955,,,190713,,143,0,,,,,219936,136686,,0,2100123,9161,,,,,923914,481,2100123,9161 +"2021-01-31","NH",1057,,15,,1037,1037,200,4,330,,551827,1078,,,,,,65695,47006,333,0,,,,,,59752,,0,1262157,7255,38016,135776,36544,,598833,1307,1262157,7255 +"2021-01-31","NJ",21484,19355,29,2129,60544,60544,2901,73,,519,8711145,0,,,,,355,696829,623541,4286,0,,,,,,,,0,9407974,4286,,,,,,0,9326347,0 +"2021-01-31","NM",3283,,18,,12075,12075,479,28,,,,0,,,,,,174064,,525,0,,,,,,102961,,0,2343455,15121,,,,,,0,2343455,15121 +"2021-01-31","NV",4270,,6,,,,1242,0,,293,1052817,2238,,,,,203,278308,278308,959,0,,,,,,,2488049,8856,2488049,8856,,,,,1331125,3197,,0 +"2021-01-31","NY",35178,,142,,89995,89995,7976,0,,1534,,0,,,,,1008,1410656,,10793,0,,,,,,,32161751,243066,32161751,243066,,,,,,0,,0 +"2021-01-31","OH",11175,9955,54,1220,46215,46215,2441,80,6690,631,,0,,,,,445,895792,780982,3011,0,,70427,,,807984,779888,,0,9074070,40927,,1287212,,,,0,9074070,40927 +"2021-01-31","OK",3547,,43,,21921,21921,1184,153,,345,2795341,0,,,2795341,,,389472,,2882,0,11794,,,,360890,356386,,0,3184813,2882,115559,,,,,0,3166000,0 +"2021-01-31","OR",1957,,19,,7738,7738,320,0,,73,,0,,,2947838,,35,142416,,687,0,,,,,187912,,,0,3162750,0,,,,,,0,3162750,0 +"2021-01-31","PA",21661,,59,,,,3370,0,,695,3637151,13023,,,,,428,843224,733743,3985,0,,,,,,688175,9228711,54810,9228711,54810,,,,,4370894,16584,,0 +"2021-01-31","PR",1829,1541,6,288,,,285,0,,50,305972,0,,,395291,,40,93624,86891,218,0,68505,,,,20103,78813,,0,399596,218,,,,,,0,415664,0 +"2021-01-31","RI",2168,,4,,8179,8179,324,0,,50,627819,2295,,,2400811,,31,115707,,569,0,,,,,137983,,2538794,16768,2538794,16768,,,,,743526,2864,,0 +"2021-01-31","SC",7042,6355,28,687,18090,18090,1841,102,,413,3784139,35663,99070,,3673436,,261,443386,396712,3601,0,22136,87469,,,507415,196661,,0,4227525,39264,121206,657941,,,,0,4180851,38222 +"2021-01-31","SD",1778,,3,,6290,6290,125,4,,25,294363,816,,,,,19,108250,96683,180,0,,,,,102024,103639,,0,651113,1720,,,,,402613,996,651113,1720 +"2021-01-31","TN",9650,7902,76,1748,17120,17120,1699,28,,435,,0,,,5615708,,254,727861,617405,3119,0,,120656,,,711676,683295,,0,6327384,32363,,902832,,,,0,6327384,32363 +"2021-01-31","TX",36491,,171,,,,11220,0,,3195,,0,,,,,,2360632,2059143,11370,0,123868,166320,,,2347904,1947493,,0,17399120,136074,918035,1803806,,,,0,17399120,136074 +"2021-01-31","UT",1665,,2,,13468,13468,519,41,2114,131,1435468,3953,,,2283684,731,,346624,,1194,0,,50836,,48735,323674,306385,,0,2607358,8955,,732319,,291921,1732726,4727,2607358,8955 +"2021-01-31","VA",6464,5657,15,807,21409,21409,2516,32,,496,,0,,,,,315,504779,404469,2558,0,22763,102362,,,496769,,5234155,23920,5234155,23920,207762,1057980,,,,0,,0 +"2021-01-31","VI",24,,0,,,,,0,,,39090,0,,,,,,2398,,0,0,,,,,,2283,,0,41488,0,,,,,41587,0,,0 +"2021-01-31","VT",174,,1,,,,68,0,,5,292048,1210,,,,,,11965,11663,134,0,,,,,,8254,,0,897351,7674,,,,,303711,1345,897351,7674 +"2021-01-31","WA",4285,,0,,17706,17706,797,163,,193,,0,,,,,88,311597,297513,1796,0,,,,,,,4548239,24018,4548239,24018,,,,,,0,,0 +"2021-01-31","WI",6434,5896,4,538,24298,24298,680,55,2179,185,2507600,4213,,,,,,592140,542415,1143,0,,,,,,517169,6177575,22737,6177575,22737,,,,,3050015,5220,,0 +"2021-01-31","WV",2024,1730,9,294,,,456,0,,128,,0,,,,,61,121001,97076,661,0,,,,,,97782,,0,1920300,8642,30517,,,,,0,1920300,8642 +"2021-01-31","WY",596,,0,,1284,1284,54,5,,,172457,0,,,588897,,,51912,44304,208,0,,,,,45638,50003,,0,634985,0,,,,,216573,0,634985,0 +"2021-01-30","AK",262,,0,,1205,1205,39,3,,,,0,,,1431069,,10,52470,,135,0,,,,,63117,,,0,1495885,6119,,,,,,0,1495885,6119 +"2021-01-30","AL",7566,6094,0,1472,41859,41859,1879,376,2539,,1767953,0,,,,1452,,455582,359355,0,0,,,,,,242143,,0,2127308,0,,,104420,,2127308,0,,0 +"2021-01-30","AR",4838,3896,7,942,13599,13599,911,47,,280,2185289,11145,,,2185289,1421,146,294387,234905,1824,0,,,,69741,,271911,,0,2420194,12494,,,,360922,,0,2420194,12494 +"2021-01-30","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-30","AZ",13098,11682,76,1416,52006,52006,3828,435,,984,2734463,12170,,,,,645,753379,705664,5119,0,,,,,,,,0,6643932,54791,,,416806,,3440127,16808,6643932,54791 +"2021-01-30","CA",40216,,638,,,,15941,0,,4042,,0,,,,,,3224374,3224374,18427,0,,,,,,,,0,41980456,303051,,,,,,0,41980456,303051 +"2021-01-30","CO",5616,4882,22,712,21812,21812,652,68,,,2011742,0,299753,,,,,395016,374087,1595,0,44482,,,,,,5426059,32325,5426059,32325,346466,,,,2393750,7921,,0 +"2021-01-30","CT",7046,5741,0,1305,12257,12257,985,0,,,,0,,,5237934,,,250023,234814,0,0,,15351,,,289498,,,0,5534681,13839,,249128,,,,0,5534681,13839 +"2021-01-30","DC",909,,2,,,,247,0,,69,,0,,,,,46,36662,,248,0,,,,,,25722,1092609,13603,1092609,13603,,,,,409335,7425,,0 +"2021-01-30","DE",1081,974,3,107,,,303,0,,43,506261,2176,,,,,,77551,73813,616,0,,,,,80445,,1221186,9656,1221186,9656,,,,,583812,2792,,0 +"2021-01-30","FL",26795,,110,,73220,73220,6153,276,,,8422340,63111,578113,560932,14649647,,,1682096,1388595,14654,0,71851,,69600,,2194399,,19027767,207768,19027767,207768,650372,,630838,,10104436,77765,16922699,164521 +"2021-01-30","GA",14196,12568,210,1628,50132,50132,4574,263,8390,,,0,,,,,,905858,746867,6343,0,60474,,,,716476,,,0,6425042,46500,443440,,,,,0,6425042,46500 +"2021-01-30","GU",129,,0,,,,8,0,,2,98543,0,,,,,2,7586,7379,7,0,22,270,,,,7355,,0,106129,7,340,8139,,,,0,105915,0 +"2021-01-30","HI",407,407,0,,2067,2067,73,3,,19,,0,,,,,15,26436,25771,115,0,,,,,25392,,982906,9472,982906,9472,,,,,,0,,0 +"2021-01-30","IA",4651,,74,,,,376,0,,84,984318,3730,,87229,2186570,,31,266934,266934,654,0,,54853,14015,51627,289190,281466,,0,1251252,4384,,1125151,101290,216558,1253586,4390,2488662,12830 +"2021-01-30","ID",1725,1513,4,212,6659,6659,225,30,1165,57,469429,1475,,,,,,162355,132217,635,0,,,,,,81034,,0,601646,2010,,78973,,,601646,2010,987111,5749 +"2021-01-30","IL",21213,19203,67,2010,,,2600,0,,522,,0,,,,,284,1123873,,3345,0,,,,,,,,0,15952421,107802,,,,,,0,15952421,107802 +"2021-01-30","IN",9967,9592,42,375,40266,40266,1648,116,7039,387,2324486,6878,,,,,212,624959,,2334,0,,,,,710665,,,0,6976408,47203,,,,,2949445,9212,6976408,47203 +"2021-01-30","KS",3779,,0,,8417,8417,550,0,2290,145,894038,0,,,,412,65,274685,,0,0,,,,,,,,0,1168723,0,,,,,1168723,0,2194854,0 +"2021-01-30","KY",3714,3391,46,323,16659,16659,1415,113,3560,362,,0,,,,,185,361124,282810,2646,0,8510,30158,,,227750,43298,,0,3590222,12805,108050,336746,,,,0,3590222,12805 +"2021-01-30","LA",8801,8241,0,560,,,1546,0,,,4566776,0,,,,,198,397276,346994,0,0,,,,,,344321,,0,4964052,0,,353166,,,,0,4913770,0 +"2021-01-30","MA",14531,14241,87,290,18008,18008,1739,0,,393,4080300,16445,,,,,239,521360,495599,4108,0,,,13999,,593486,389717,,0,13538980,143342,,,147875,473061,4575899,20402,13538980,143342 +"2021-01-30","MD",7107,6931,31,176,31888,31888,1560,129,,380,2831813,10634,,163059,,,,352726,352726,2097,0,,,23333,,429336,9491,,0,6966924,48616,,,186392,,3184539,12731,6966924,48616 +"2021-01-30","ME",590,580,20,10,1386,1386,161,5,,51,,0,13643,,,,27,39168,31567,355,0,698,8126,,,36484,12398,,0,1354710,12154,14353,146663,,,,0,1354710,12154 +"2021-01-30","MI",15525,14601,115,924,,,1479,0,,364,,0,,,8756219,,193,610138,559241,1511,0,,,,,708926,481801,,0,9465145,43036,490470,,,,,0,9465145,43036 +"2021-01-30","MN",6187,5940,19,247,24269,24269,450,69,5034,95,2812091,8105,,,,,,460819,440939,1072,0,,,,,,444782,6210344,29274,6210344,29274,,335624,,,3253030,9025,,0 +"2021-01-30","MO",6748,,9,,,,1908,0,,427,1771632,3537,116398,,3629100,,273,457779,457779,1249,0,19889,70177,,,505565,,,0,4143475,14487,136472,633450,124066,275570,2229411,4786,4143475,14487 +"2021-01-30","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,132,132,0,0,,,,,,29,,0,17561,0,,,,,17542,0,26131,0 +"2021-01-30","MS",6018,4374,35,1644,8647,8647,953,0,,242,1294488,0,,,,,155,274190,172998,1528,0,,,,,,222812,,0,1568678,1528,72089,617477,,,,0,1463634,0 +"2021-01-30","MT",1232,,5,,4246,4246,101,29,,20,,0,,,,,15,93762,91545,516,0,,,,,,88822,,0,950743,8353,,,,,,0,950743,8353 +"2021-01-30","NC",9287,8404,130,883,,,2883,0,,651,,0,,,,,,752627,672774,6168,0,,,,,,,,0,8299263,55755,,517276,,,,0,8299263,55755 +"2021-01-30","ND",1442,,0,,3778,3778,48,3,553,8,296230,363,11953,,,,,97562,93245,104,0,1442,,,,,95108,1344399,2798,1344399,2798,13395,92276,,,393792,467,1429366,3439 +"2021-01-30","NE",1920,,-1,,5796,5796,325,21,,,732381,3070,,,1873158,,,190570,,973,0,,,,,219706,135957,,0,2090962,15600,,,,,923433,4048,2090962,15600 +"2021-01-30","NH",1042,,6,,1033,1033,217,4,329,,550749,2066,,,,,,65362,46777,524,0,,,,,,59082,,0,1254902,11075,37957,134452,36487,,597526,2445,1254902,11075 +"2021-01-30","NJ",21455,19326,72,2129,60471,60471,3075,145,,533,8711145,0,,,,,359,692543,619732,5274,0,,,,,,,,0,9403688,5274,,,,,,0,9326347,0 +"2021-01-30","NM",3265,,17,,12047,12047,548,58,,,,0,,,,,,173539,,741,0,,,,,,102298,,0,2328334,21460,,,,,,0,2328334,21460 +"2021-01-30","NV",4264,,46,,,,1242,0,,293,1050579,2375,,,,,203,277349,277349,1070,0,,,,,,,2479193,10512,2479193,10512,,,,,1327928,3445,,0 +"2021-01-30","NY",35036,,143,,89995,89995,8176,0,,1551,,0,,,,,1017,1399863,,12804,0,,,,,,,31918685,269350,31918685,269350,,,,,,0,,0 +"2021-01-30","OH",11121,9907,51,1214,46135,46135,2506,183,6682,611,,0,,,,,424,892781,778650,4191,0,,69807,,,805019,775893,,0,9033143,50263,,1276846,,,,0,9033143,50263 +"2021-01-30","OK",3504,,33,,21768,21768,1184,148,,345,2795341,22371,,,2795341,,,386590,,2373,0,11794,,,,360890,354223,,0,3181931,24744,115559,,,,,0,3166000,26163 +"2021-01-30","OR",1938,,8,,7738,7738,320,30,,73,,0,,,2947838,,35,141729,,946,0,,,,,187912,,,0,3162750,29072,,,,,,0,3162750,29072 +"2021-01-30","PA",21602,,140,,,,3551,0,,724,3624128,12762,,,,,451,839239,730182,5191,0,,,,,,688175,9173901,62000,9173901,62000,,,,,4354310,16913,,0 +"2021-01-30","PR",1823,1536,11,287,,,279,0,,57,305972,0,,,395291,,38,93406,86713,438,0,68342,,,,20103,78813,,0,399378,438,,,,,,0,415664,0 +"2021-01-30","RI",2164,,10,,8179,8179,324,0,,50,625524,2072,,,2384732,,31,115138,,700,0,,,,,137294,,2522026,24755,2522026,24755,,,,,740662,2772,,0 +"2021-01-30","SC",7014,6336,72,678,17988,17988,1927,100,,415,3748476,36331,98683,,3638893,,261,439785,394153,4152,0,21905,85539,,,503736,194982,,0,4188261,40483,120588,642800,,,,0,4142629,39507 +"2021-01-30","SD",1775,,7,,6286,6286,145,14,,35,293547,678,,,,,27,108070,96549,115,0,,,,,101886,103401,,0,649393,1657,,,,,401617,793,649393,1657 +"2021-01-30","TN",9574,7846,113,1728,17092,17092,1806,154,,467,,0,,,5586102,,274,724742,615041,2251,0,,119881,,,708919,680847,,0,6295021,17253,,895970,,,,0,6295021,17253 +"2021-01-30","TX",36320,,332,,,,11473,0,,3183,,0,,,,,,2349262,2049055,19234,0,122686,164416,,,2328705,1932694,,0,17263046,189112,914683,1778369,,,,0,17263046,189112 +"2021-01-30","UT",1663,,8,,13427,13427,522,74,2113,139,1431515,4642,,,2275681,731,,345430,,1468,0,,50479,,48395,322722,304074,,0,2598403,12012,,728412,,290176,1727999,5691,2598403,12012 +"2021-01-30","VA",6449,5646,70,803,21377,21377,2632,136,,507,,0,,,,,311,502221,402532,4309,0,22695,101679,,,494447,,5210235,30033,5210235,30033,207415,1051469,,,,0,,0 +"2021-01-30","VI",24,,0,,,,,0,,,39090,0,,,,,,2398,,0,0,,,,,,2283,,0,41488,0,,,,,41587,0,,0 +"2021-01-30","VT",173,,1,,,,62,0,,10,290838,1293,,,,,,11831,11528,173,0,,,,,,8095,,0,889677,8245,,,,,302366,1454,889677,8245 +"2021-01-30","WA",4285,,42,,17543,17543,797,26,,193,,0,,,,,102,309801,295861,1992,0,,,,,,,4524221,28758,4524221,28758,,,,,,0,,0 +"2021-01-30","WI",6430,5893,40,537,24243,24243,680,89,2178,185,2503387,4870,,,,,,590997,541408,1613,0,,,,,,515745,6154838,30427,6154838,30427,,,,,3044795,6363,,0 +"2021-01-30","WV",2015,1721,9,294,,,481,0,,132,,0,,,,,55,120340,96548,873,0,,,,,,96518,,0,1911658,13884,30456,,,,,0,1911658,13884 +"2021-01-30","WY",596,,0,,1279,1279,54,0,,,172457,0,,,588897,,,51704,44122,14,0,,,,,45638,49981,,0,634985,0,,,,,216573,0,634985,0 +"2021-01-29","AK",262,,0,,1202,1202,48,1,,,,0,,,1425130,,10,52335,,185,0,,,,,62949,,,0,1489766,9917,,,,,,0,1489766,9917 +"2021-01-29","AL",7566,6094,226,1472,41483,41483,1978,0,2539,,1767953,8782,,,,1452,,455582,359355,2848,0,,,,,,242143,,0,2127308,10666,,,104420,,2127308,10666,,0 +"2021-01-29","AR",4831,3887,47,944,13552,13552,951,47,,298,2174144,12311,,,2174144,1420,144,292563,233556,1707,0,,,,69189,,270376,,0,2407700,13529,,,,357530,,0,2407700,13529 +"2021-01-29","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-29","AZ",13022,11612,203,1410,51571,51571,3970,222,,1002,2722293,9446,,,,,678,748260,701026,5028,0,,,,,,,,0,6589141,39573,,,416081,,3423319,13924,6589141,39573 +"2021-01-29","CA",39578,,617,,,,16581,0,,4232,,0,,,,,,3205947,3205947,19337,0,,,,,,,,0,41677405,206771,,,,,,0,41677405,206771 +"2021-01-29","CO",5594,4882,25,712,21744,21744,652,31,,,2011742,8470,297809,,,,,393421,374087,1722,0,43995,,,,,,5393734,50870,5393734,50870,344235,,,,2385829,10053,,0 +"2021-01-29","CT",7046,5741,26,1305,12257,12257,985,0,,,,0,,,5224810,,,250023,234814,1258,0,,15351,,,288783,,,0,5520842,25370,,249128,,,,0,5520842,25370 +"2021-01-29","DC",907,,5,,,,241,0,,70,,0,,,,,46,36414,,282,0,,,,,,25588,1079006,8067,1079006,8067,,,,,401910,2888,,0 +"2021-01-29","DE",1078,971,3,107,,,320,0,,46,504085,1542,,,,,,76935,73253,440,0,,,,,79929,,1211530,8319,1211530,8319,,,,,581020,1982,,0 +"2021-01-29","FL",26685,,229,,72944,72944,6375,341,,,8359229,11105,578113,560932,14506280,,,1667442,1378524,10745,0,71851,,69600,,2174542,,18819999,54799,18819999,54799,650372,,630838,,10026671,21850,16758178,56253 +"2021-01-29","GA",13986,12410,159,1576,49869,49869,4777,261,8360,,,0,,,,,,899515,741991,6558,0,59736,,,,710996,,,0,6378542,40314,441761,,,,,0,6378542,40314 +"2021-01-29","GU",129,,0,,,,8,0,,2,98543,321,,,,,2,7579,7372,7,0,22,270,,,,7355,,0,106122,328,340,8139,,,,0,105915,328 +"2021-01-29","HI",407,407,1,,2064,2064,71,0,,20,,0,,,,,16,26321,25656,152,0,,,,,25289,,973434,15171,973434,15171,,,,,,0,,0 +"2021-01-29","IA",4577,,45,,,,383,0,,82,980588,1915,,86595,2174598,,29,266280,266280,734,0,,54661,13685,51409,288437,281179,,0,1246868,2649,,1115432,100325,215555,1249196,2654,2475832,10202 +"2021-01-29","ID",1721,1508,7,213,6629,6629,241,25,1157,64,467954,1799,,,,,,161720,131682,508,0,,,,,,80252,,0,599636,2123,,78973,,,599636,2123,981362,5807 +"2021-01-29","IL",21146,19138,72,2008,,,2735,0,,532,,0,,,,,297,1120528,,4156,0,,,,,,,,0,15844619,111057,,,,,,0,15844619,111057 +"2021-01-29","IN",9925,9549,46,376,40150,40150,1725,132,7019,399,2317608,7250,,,,,219,622625,,2630,0,,,,,707942,,,0,6929205,44714,,,,,2940233,9880,6929205,44714 +"2021-01-29","KS",3779,,61,,8417,8417,550,149,2290,145,894038,6779,,,,412,65,274685,,2168,0,,,,,,,,0,1168723,8947,,,,,1168723,8947,2194854,30311 +"2021-01-29","KY",3668,3351,57,317,16546,16546,1505,142,3547,355,,0,,,,,199,358478,281086,2601,0,8458,30139,,,226597,43052,,0,3577417,16514,107873,336517,,,,0,3577417,16514 +"2021-01-29","LA",8801,8241,58,560,,,1546,0,,,4566776,22901,,,,,198,397276,346994,2367,0,,,,,,344321,,0,4964052,25268,,353166,,,,0,4913770,24438 +"2021-01-29","MA",14444,14154,96,290,18008,18008,1789,0,,412,4063855,11705,,,,,248,517252,491642,3118,0,,,13999,,588725,389717,,0,13395638,86197,,,147875,470635,4555497,14486,13395638,86197 +"2021-01-29","MD",7076,6900,39,176,31759,31759,1616,145,,367,2821179,10653,,163059,,,,350629,350629,1880,0,,,23333,,426842,9482,,0,6918308,52783,,,186392,,3171808,12533,6918308,52783 +"2021-01-29","ME",570,560,3,10,1381,1381,176,6,,54,,0,13643,,,,31,38813,31284,359,0,698,8023,,,36134,12379,,0,1342556,12757,14353,144355,,,,0,1342556,12757 +"2021-01-29","MI",15410,14497,8,913,,,1479,0,,364,,0,,,8715100,,193,608627,557883,2139,0,,,,,707009,463106,,0,9422109,52513,487677,,,,,0,9422109,52513 +"2021-01-29","MN",6168,5921,28,247,24200,24200,450,74,5024,95,2803986,9968,,,,,,459747,440019,1114,0,,,,,,443253,6181070,42216,6181070,42216,,332727,,,3244005,10935,,0 +"2021-01-29","MO",6739,,14,,,,1908,0,,427,1768095,6879,116092,,3616485,,273,456530,456530,1957,0,19673,69638,,,504220,,,0,4128988,22159,135949,616786,123679,272716,2224625,8836,4128988,22159 +"2021-01-29","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,132,132,0,0,,,,,,29,,0,17561,0,,,,,17542,0,26131,0 +"2021-01-29","MS",5983,4356,38,1627,8647,8647,999,0,,244,1294488,0,,,,,149,272662,172305,2186,0,,,,,,222812,,0,1567150,2186,72089,617477,,,,0,1463634,0 +"2021-01-29","MT",1227,,17,,4217,4217,103,14,,23,,0,,,,,17,93246,91133,312,0,,,,,,88291,,0,942390,5462,,,,,,0,942390,5462 +"2021-01-29","NC",9157,8303,111,854,,,3048,0,,644,,0,,,,,,746459,667836,6959,0,,,,,,,,0,8243508,70192,,507604,,,,0,8243508,70192 +"2021-01-29","ND",1442,,0,,3775,3775,51,9,552,9,295867,557,11953,,,,,97458,93182,153,0,1442,,,,,94966,1341601,4326,1341601,4326,13395,90682,,,393325,710,1425927,5384 +"2021-01-29","NE",1921,,4,,5775,5775,341,19,,,729311,1785,,,1854627,,,189597,,813,0,,,,,218517,134492,,0,2075362,11128,,,,,919385,2598,2075362,11128 +"2021-01-29","NH",1036,,14,,1029,1029,214,8,329,,548683,2196,,,,,,64838,46398,580,0,,,,,,58414,,0,1243827,9073,37871,131089,36412,,595081,2560,1243827,9073 +"2021-01-29","NJ",21383,19254,82,2129,60326,60326,3116,201,,548,8711145,51397,,,,,378,687269,615202,5986,0,,,,,,,,0,9398414,57383,,,,,,0,9326347,56275 +"2021-01-29","NM",3248,,22,,11989,11989,538,83,,,,0,,,,,,172798,,1079,0,,,,,,101054,,0,2306874,20939,,,,,,0,2306874,20939 +"2021-01-29","NV",4218,,37,,,,1290,0,,305,1048204,3310,,,,,221,276279,276279,1328,0,,,,,,,2468681,12493,2468681,12493,,,,,1324483,4638,,0 +"2021-01-29","NY",34893,,151,,89995,89995,8357,0,,1543,,0,,,,,1012,1387059,,12579,0,,,,,,,31649335,270518,31649335,270518,,,,,,0,,0 +"2021-01-29","OH",11070,9861,64,1209,45952,45952,2706,166,6667,658,,0,,,,,451,888590,775353,4874,0,,69732,,,801005,770597,,0,8982880,61451,,1271764,,,,0,8982880,61451 +"2021-01-29","OK",3471,,48,,21620,21620,1247,142,,352,2772970,22490,,,2772970,,,384217,,2787,0,11016,,,,357641,351545,,0,3157187,25277,113470,,,,,0,3139837,25547 +"2021-01-29","OR",1930,,6,,7708,7708,321,44,,73,,0,,,2947536,,32,140783,,720,0,,,,,186142,,,0,3133678,10974,,,,,,0,3133678,10974 +"2021-01-29","PA",21462,,159,,,,3586,0,,699,3611366,10401,,,,,425,834048,726031,9643,0,,,,,,675578,9111901,60973,9111901,60973,,,,,4337397,14385,,0 +"2021-01-29","PR",1812,1526,11,286,,,280,0,,54,305972,0,,,395291,,36,92968,86302,427,0,67819,,,,20103,78813,,0,398940,427,,,,,,0,415664,0 +"2021-01-29","RI",2154,,10,,8179,8179,324,48,,50,623452,2893,,,2360768,,31,114438,,684,0,,,,,136503,,2497271,23241,2497271,23241,,,,,737890,3577,,0 +"2021-01-29","SC",6942,6271,39,671,17888,17888,1986,149,,435,3712145,44120,98196,,3603314,,278,435633,390977,4464,0,21611,84194,,,499808,193525,,0,4147778,48584,119807,632170,,,,0,4103122,47494 +"2021-01-29","SD",1768,,5,,6272,6272,152,8,,41,292869,594,,,,,28,107955,96460,160,0,,,,,101811,103127,,0,647736,2177,,,,,400824,754,647736,2177 +"2021-01-29","TN",9461,7768,44,1693,16938,16938,1960,0,,522,,0,,,5570958,,306,722491,613161,4908,0,,117024,,,706810,676878,,0,6277768,30553,,870493,,,,0,6277768,30553 +"2021-01-29","TX",35988,,349,,,,11981,0,,3255,,0,,,,,,2330028,2033353,19076,0,121557,162812,,,2299772,1912861,,0,17073934,124795,911376,1749834,,,,0,17073934,124795 +"2021-01-29","UT",1655,,35,,13353,13353,533,74,2103,148,1426873,4886,,,2264864,727,,343962,,1517,0,,49984,,47918,321527,301462,,0,2586391,12480,,717995,,287099,1722308,5903,2586391,12480 +"2021-01-29","VA",6379,5606,71,773,21241,21241,2691,128,,511,,0,,,,,309,497912,399577,4238,0,22451,100480,,,490721,,5180202,33217,5180202,33217,206752,1032759,,,,0,,0 +"2021-01-29","VI",24,,0,,,,,0,,,39090,523,,,,,,2398,,14,0,,,,,,2283,,0,41488,537,,,,,41587,522,,0 +"2021-01-29","VT",172,,0,,,,60,0,,11,289545,1437,,,,,,11658,11367,135,0,,,,,,7926,,0,881432,10485,,,,,300912,1573,881432,10485 +"2021-01-29","WA",4243,,32,,17517,17517,806,68,,195,,0,,,,,102,307809,293978,2520,0,,,,,,,4495463,25248,4495463,25248,,,,,,0,,0 +"2021-01-29","WI",6390,5860,56,530,24154,24154,680,91,2171,185,2498517,5373,,,,,,589384,539915,1804,0,,,,,,513809,6124411,31499,6124411,31499,,,,,3038432,6940,,0 +"2021-01-29","WV",2006,1705,23,301,,,519,0,,138,,0,,,,,60,119467,95813,905,0,,,,,,94891,,0,1897774,16289,30297,,,,,0,1897774,16289 +"2021-01-29","WY",596,,0,,1279,1279,54,7,,,172457,380,,,588897,,,51690,44116,260,0,,,,,45638,49785,,0,634985,9603,,,,,216573,612,634985,9603 +"2021-01-28","AK",262,,1,,1201,1201,42,1,,,,0,,,1415473,,5,52150,,199,0,,,,,62705,,,0,1479849,12449,,,,,,0,1479849,12449 +"2021-01-28","AL",7340,5928,168,1412,41483,41483,2052,0,2533,,1759171,8103,,,,1449,,452734,357471,3648,0,,,,,,242143,,0,2116642,10607,,,103530,,2116642,10607,,0 +"2021-01-28","AR",4784,3864,42,920,13505,13505,996,58,,307,2161833,12762,,,2161833,1414,143,290856,232338,1892,0,,,,68660,,268495,,0,2394171,14233,,,,354207,,0,2394171,14233 +"2021-01-28","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-28","AZ",12819,11440,176,1379,51349,51349,4087,312,,1023,2712847,10704,,,,,692,743232,696548,4671,0,,,,,,,,0,6549568,45161,,,415234,,3409395,14753,6549568,45161 +"2021-01-28","CA",38961,,737,,,,17143,0,,4283,,0,,,,,,3186610,3186610,16696,0,,,,,,,,0,41470634,218152,,,,,,0,41470634,218152 +"2021-01-28","CO",5569,4858,17,711,21713,21713,702,103,,,2003272,6241,296319,,,,,391699,372504,1441,0,43663,,,,,,5342864,32548,5342864,32548,341804,,,,2375776,7535,,0 +"2021-01-28","CT",7020,5718,44,1302,12257,12257,995,0,,,,0,,,5200823,,,248765,233661,1426,0,,15185,,,287407,,,0,5495472,32888,,246797,,,,0,5495472,32888 +"2021-01-28","DC",902,,7,,,,255,0,,69,,0,,,,,35,36132,,267,0,,,,,,25442,1070939,6610,1070939,6610,,,,,399022,1454,,0 +"2021-01-28","DE",1075,968,3,107,,,333,0,,51,502543,1961,,,,,,76495,72850,663,0,,,,,79306,,1203211,3076,1203211,3076,,,,,579038,2624,,0 +"2021-01-28","FL",26456,,207,,72603,72603,6565,388,,,8348124,36266,578113,560932,14465108,,,1656697,1371175,11190,0,71851,,69600,,2159694,,18765200,133418,18765200,133418,650372,,630838,,10004821,47456,16701925,71394 +"2021-01-28","GA",13827,12280,184,1547,49608,49608,4953,361,8331,,,0,,,,,,892957,737205,7352,0,58885,,,,705770,,,0,6338228,42184,439649,,,,,0,6338228,42184 +"2021-01-28","GU",129,,0,,,,8,0,,2,98222,403,,,,,2,7572,7365,4,0,22,270,,,,7353,,0,105794,407,340,8100,,,,0,105587,407 +"2021-01-28","HI",406,406,2,,2064,2064,71,7,,20,,0,,,,,16,26169,25541,99,0,,,,,25177,,958263,5072,958263,5072,,,,,,0,,0 +"2021-01-28","IA",4532,,32,,,,391,0,,80,978673,2177,,86462,2165346,,32,265546,265546,963,0,,54358,13557,51138,287616,279641,,0,1244219,3140,,1102683,100064,214221,1246542,3135,2465630,11505 +"2021-01-28","ID",1714,1501,26,213,6604,6604,241,44,1153,64,466155,1876,,,,,,161212,131358,620,0,,,,,,79298,,0,597513,2326,,78973,,,597513,2326,975555,5230 +"2021-01-28","IL",21074,19067,125,2007,,,2802,0,,567,,0,,,,,292,1116372,,4191,0,,,,,,,,0,15733562,100119,,,,,,0,15733562,100119 +"2021-01-28","IN",9879,9504,34,375,40018,40018,1915,124,6993,420,2310358,7407,,,,,232,619995,,2819,0,,,,,704889,,,0,6884491,54195,,,,,2930353,10226,6884491,54195 +"2021-01-28","KS",3718,,0,,8268,8268,649,0,2259,165,887259,0,,,,412,74,272517,,0,0,,,,,,,,0,1159776,0,,,,,1159776,0,2164543,0 +"2021-01-28","KY",3611,3311,69,300,16404,16404,1561,303,3520,370,,0,,,,,205,355877,279340,2934,0,8399,29481,,,225126,42684,,0,3560903,15854,107732,316708,,,,0,3560903,15854 +"2021-01-28","LA",8743,8202,55,541,,,1590,0,,,4543875,28249,,,,,206,394909,345457,2493,0,,,,,,344321,,0,4938784,30742,,346830,,,,0,4889332,30123 +"2021-01-28","MA",14348,14056,44,292,18008,18008,1878,0,,442,4052150,15398,,,,,255,514134,488861,4631,0,,,13999,,585540,389717,,0,13309441,116963,,,147875,466795,4541011,19620,13309441,116963 +"2021-01-28","MD",7037,6861,41,176,31614,31614,1636,146,,376,2810526,8555,,163059,,,,348749,348749,2190,0,,,23333,,424593,9482,,0,6865525,46476,,,186392,,3159275,10745,6865525,46476 +"2021-01-28","ME",567,557,5,10,1375,1375,171,9,,51,,0,13609,,,,31,38454,31064,284,0,685,7919,,,35754,12337,,0,1329799,11550,14306,142098,,,,0,1329799,11550 +"2021-01-28","MI",15402,14491,88,911,,,1536,0,,363,,0,,,8664776,,192,606488,556109,2255,0,,,,,704820,463106,,0,9369596,51507,486152,,,,,0,9369596,51507 +"2021-01-28","MN",6140,5896,16,244,24126,24126,477,53,5015,97,2794018,11471,,,,,,458633,439052,1316,0,,,,,,442600,6138854,42429,6138854,42429,,329014,,,3233070,12581,,0 +"2021-01-28","MO",6725,,16,,,,1908,0,,427,1761216,4687,115325,,3596440,,273,454573,454573,1636,0,19379,69051,,,502139,,,0,4106829,20683,134890,606339,122850,268802,2215789,6323,4106829,20683 +"2021-01-28","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,132,132,0,0,,,,,,29,,0,17561,0,,,,,17542,0,26131,0 +"2021-01-28","MS",5945,4342,28,1603,8647,8647,1059,0,,257,1294488,0,,,,,157,270476,171313,1804,0,,,,,,222812,,0,1564964,1804,72089,617477,,,,0,1463634,0 +"2021-01-28","MT",1210,,9,,4203,4203,114,26,,19,,0,,,,,15,92934,90895,403,0,,,,,,87720,,0,936928,8947,,,,,,0,936928,8947 +"2021-01-28","NC",9046,8213,131,833,,,3238,0,,660,,0,,,,,,739500,662186,6490,0,,,,,,,,0,8173316,62431,,500469,,,,0,8173316,62431 +"2021-01-28","ND",1442,,1,,3766,3766,49,9,551,9,295310,469,11953,,,,,97305,93074,145,0,1442,,,,,94837,1337275,4246,1337275,4246,13395,88609,,,392615,614,1420543,4937 +"2021-01-28","NE",1917,,12,,5756,5756,343,27,,,727526,1217,,,1844539,,,188784,,662,0,,,,,217494,133469,,0,2064234,11527,,,,,916787,1878,2064234,11527 +"2021-01-28","NH",1022,,16,,1021,1021,222,7,327,,546487,2717,,,,,,64258,46034,695,0,,,,,,57862,,0,1234754,10265,37793,128128,36343,,592521,3186,1234754,10265 +"2021-01-28","NJ",21301,19172,81,2129,60125,60125,3121,246,,563,8659748,41277,,,,,406,681283,610324,4746,0,,,,,,,,0,9341031,46023,,,,,,0,9270072,45109 +"2021-01-28","NM",3226,,28,,11906,11906,556,82,,,,0,,,,,,171719,,672,0,,,,,,99524,,0,2285935,14678,,,,,,0,2285935,14678 +"2021-01-28","NV",4181,,47,,,,1322,0,,322,1044894,2731,,,,,236,274951,274951,1078,0,,,,,,,2456188,10802,2456188,10802,,,,,1319845,3809,,0 +"2021-01-28","NY",34742,,163,,89995,89995,8520,0,,1584,,0,,,,,1024,1374480,,13398,0,,,,,,,31378817,250668,31378817,250668,,,,,,0,,0 +"2021-01-28","OH",11006,9803,75,1203,45786,45786,2829,256,6644,708,,0,,,,,469,883716,771743,5432,0,,68992,,,796353,764480,,0,8921429,48565,,1258301,,,,0,8921429,48565 +"2021-01-28","OK",3423,,35,,21478,21478,1250,164,,341,2750480,14393,,,2750480,,,381430,,2320,0,11016,,,,354444,348836,,0,3131910,16713,113470,,,,,0,3114290,18273 +"2021-01-28","OR",1924,,20,,7664,7664,328,72,,76,,0,,,2937471,,37,140063,,708,0,,,,,185233,,,0,3122704,17604,,,,,,0,3122704,17604 +"2021-01-28","PA",21303,,198,,,,3691,0,,753,3600965,10781,,,,,435,824405,722047,6036,0,,,,,,667768,9050928,53378,9050928,53378,,,,,4323012,14442,,0 +"2021-01-28","PR",1801,1516,7,285,,,293,0,,55,305972,0,,,395291,,37,92541,85954,297,0,67126,,,,20103,78813,,0,398513,297,,,,,,0,415664,0 +"2021-01-28","RI",2144,,9,,8131,8131,335,33,,47,620559,2939,,,2338306,,31,113754,,745,0,,,,,135724,,2474030,22883,2474030,22883,,,,,734313,3684,,0 +"2021-01-28","SC",6903,6235,230,668,17739,17739,2086,159,,443,3668025,23159,97856,,3560266,,286,431169,387603,3938,0,21361,82942,,,495362,191902,,0,4099194,27097,119217,623254,,,,0,4055628,26206 +"2021-01-28","SD",1763,,24,,6264,6264,161,22,,38,292275,673,,,,,28,107795,96327,187,0,,,,,101656,102895,,0,645559,1421,,,,,400070,860,645559,1421 +"2021-01-28","TN",9417,7737,101,1680,16938,16938,2009,115,,533,,0,,,5543450,,315,717583,610541,1777,0,,117024,,,703765,672110,,0,6247215,13969,,870493,,,,0,6247215,13969 +"2021-01-28","TX",35639,,471,,,,12380,0,,3343,,0,,,,,,2310952,2018127,18220,0,120539,161156,,,2281713,1894564,,0,16949139,111345,908175,1735794,,,,0,16949139,111345 +"2021-01-28","UT",1620,,0,,13279,13279,536,62,2092,157,1421987,5188,,,2253588,725,,342445,,1761,0,,49531,,47491,320323,297638,,0,2573911,16033,,708021,,283618,1716405,6502,2573911,16033 +"2021-01-28","VA",6308,5566,80,742,21113,21113,2706,127,,515,,0,,,,,322,493674,396440,5121,0,21940,97871,,,482836,,5146985,34288,5146985,34288,205994,1022074,,,,0,,0 +"2021-01-28","VI",24,,0,,,,,0,,,38567,259,,,,,,2384,,11,0,,,,,,2266,,0,40951,270,,,,,41065,284,,0 +"2021-01-28","VT",172,,0,,,,62,0,,10,288108,1031,,,,,,11523,11231,144,0,,,,,,7826,,0,870947,8126,,,,,299339,1163,870947,8126 +"2021-01-28","WA",4211,,44,,17449,17449,823,95,,197,,0,,,,,99,305289,291701,1807,0,,,,,,,4470215,23371,4470215,23371,,,,,,0,,0 +"2021-01-28","WI",6334,5811,32,523,24063,24063,710,87,2170,166,2493144,6184,,,,,,587580,538348,1980,0,,,,,,511859,6092912,42793,6092912,42793,,,,,3031492,7986,,0 +"2021-01-28","WV",1983,1690,30,293,,,539,0,,140,,0,,,,,60,118562,95115,787,0,,,,,,93439,,0,1881485,15723,30113,,,,,0,1881485,15723 +"2021-01-28","WY",596,,0,,1272,1272,64,2,,,172077,389,,,579654,,,51430,43884,62,0,,,,,45277,49592,,0,625382,8705,,,,,215961,447,625382,8705 +"2021-01-27","AK",261,,1,,1200,1200,49,6,,,,0,,,1403422,,5,51951,,173,0,,,,,62323,,,0,1467400,7211,,,,,,0,1467400,7211 +"2021-01-27","AL",7172,5817,276,1355,41483,41483,2122,168,2524,,1751068,6016,,,,1444,,449086,354967,3177,0,,,,,,233211,,0,2106035,8065,,,102717,,2106035,8065,,0 +"2021-01-27","AR",4742,3839,52,903,13447,13447,1029,46,,321,2149071,10118,,,2149071,1410,157,288964,230867,1777,0,,,,68095,,266506,,0,2379938,11258,,,,350434,,0,2379938,11258 +"2021-01-27","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-27","AZ",12643,11292,195,1351,51037,51037,4250,380,,1024,2702143,10852,,,,,686,738561,692499,5918,0,,,,,,,,0,6504407,42093,,,414456,,3394642,15595,6504407,42093 +"2021-01-27","CA",38224,,697,,,,17710,0,,4375,,0,,,,,,3169914,3169914,16728,0,,,,,,,,0,41252482,241712,,,,,,0,41252482,241712 +"2021-01-27","CO",5552,4843,35,709,21610,21610,724,48,,,1997031,5620,293625,,,,,390258,371210,1638,0,42930,,,,,,5310316,30453,5310316,30453,339982,,,,2368241,7050,,0 +"2021-01-27","CT",6976,5679,42,1297,12257,12257,1016,0,,,,0,,,5169488,,,247339,232354,2440,0,,15009,,,285869,,,0,5462584,43223,,243173,,,,0,5462584,43223 +"2021-01-27","DC",895,,7,,,,253,0,,69,,0,,,,,35,35865,,165,0,,,,,,25271,1064329,4647,1064329,4647,,,,,397568,2431,,0 +"2021-01-27","DE",1072,965,7,107,,,355,0,,48,500582,1725,,,,,,75832,72267,342,0,,,,,79110,,1200135,7403,1200135,7403,,,,,576414,2067,,0 +"2021-01-27","FL",26249,,169,,72215,72215,6679,363,,,8311858,19453,578113,560932,14407095,,,1645507,1363201,8211,0,71851,,69600,,2146712,,18631782,65513,18631782,65513,650372,,630838,,9957365,27664,16630531,22113 +"2021-01-27","GA",13643,12135,161,1508,49247,49247,5074,332,8290,,,0,,,,,,885605,731826,6384,0,58216,,,,700011,,,0,6296044,24499,437886,,,,,0,6296044,24499 +"2021-01-27","GU",129,,0,,,,9,0,,3,97819,502,,,,,2,7568,7361,2,0,22,270,,,,7351,,0,105387,504,338,8087,,,,0,105180,504 +"2021-01-27","HI",404,404,3,,2057,2057,80,7,,22,,0,,,,,25,26070,25442,103,0,,,,,25062,,953191,4500,953191,4500,,,,,,0,,0 +"2021-01-27","IA",4500,,8,,,,408,0,,81,976496,1866,,85750,2154915,,37,264583,264583,731,0,,54027,13226,50829,286587,277824,,0,1241079,2597,,1093439,99020,213029,1243407,2591,2454125,9796 +"2021-01-27","ID",1688,1481,7,207,6560,6560,241,35,1144,64,464279,2151,,,,,,160592,130908,559,0,,,,,,78246,,0,595187,2540,,78973,,,595187,2540,970325,4067 +"2021-01-27","IL",20949,18964,96,1985,,,2931,0,,591,,0,,,,,300,1112181,,3751,0,,,,,,,,0,15633443,80124,,,,,,0,15633443,80124 +"2021-01-27","IN",9845,9470,38,375,39894,39894,1902,141,6974,430,2302951,5714,,,,,242,617176,,2230,0,,,,,701673,,,0,6830296,43069,,,,,2920127,7944,6830296,43069 +"2021-01-27","KS",3718,,96,,8268,8268,649,151,2259,165,887259,8877,,,,412,74,272517,,3262,0,,,,,,,,0,1159776,12139,,,,,1159776,12139,2164543,2164543 +"2021-01-27","KY",3542,3248,47,294,16101,16101,1597,99,3459,387,,0,,,,,225,352943,277341,2415,0,8213,29241,,,223506,41925,,0,3545049,10929,106506,312669,,,,0,3545049,10929 +"2021-01-27","LA",8688,8152,67,536,,,1625,0,,,4515626,30276,,,,,203,392416,343583,3854,0,,,,,,344321,,0,4908042,34130,,341039,,,,0,4859209,32648 +"2021-01-27","MA",14304,14013,84,291,18008,18008,1930,452,,418,4036752,12377,,,,,270,509503,484639,3320,0,,,13695,,580673,354388,,0,13192478,96203,,,145958,461885,4521391,15399,13192478,96203 +"2021-01-27","MD",6996,6821,33,175,31468,31468,1647,138,,374,2801971,8555,,163059,,,,346559,346559,1939,0,,,23333,,421831,9479,,0,6819049,34887,,,186392,,3148530,10494,6819049,34887 +"2021-01-27","ME",562,553,4,9,1366,1366,183,9,,51,,0,13591,,,,30,38170,30817,462,0,680,7801,,,35514,12316,,0,1318249,7572,14283,139810,,,,0,1318249,7572 +"2021-01-27","MI",15314,14411,9,903,,,1594,0,,377,,0,,,8615710,,202,604233,554237,2065,0,,,,,702379,463106,,0,9318089,48890,483813,,,,,0,9318089,48890 +"2021-01-27","MN",6124,5882,18,242,24073,24073,477,59,5004,97,2782547,5020,,,,,,457317,437942,827,0,,,,,,441740,6096425,15521,6096425,15521,,323843,,,3220489,5698,,0 +"2021-01-27","MO",6709,,23,,,,1900,0,,444,1756529,3997,114336,,3577622,,287,452937,452937,1444,0,19105,68189,,,500337,,,0,4086146,14885,133627,595892,121846,264211,2209466,5441,4086146,14885 +"2021-01-27","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,132,132,0,0,,,,,,29,,0,17561,0,,,,,17542,0,26131,0 +"2021-01-27","MS",5917,4331,65,1586,8647,8647,1063,0,,249,1294488,0,,,,,162,268672,170594,2074,0,,,,,,222812,,0,1563160,2074,72089,617477,,,,0,1463634,0 +"2021-01-27","MT",1201,,16,,4177,4177,118,36,,22,,0,,,,,15,92531,90553,371,0,,,,,,87018,,0,927981,5025,,,,,,0,927981,5025 +"2021-01-27","NC",8915,8120,139,795,,,3305,0,,676,,0,,,,,,733010,657038,5587,0,,,,,,,,0,8110885,35058,,492898,,,,0,8110885,35058 +"2021-01-27","ND",1441,,1,,3757,3757,49,5,551,10,294841,556,11953,,,,,97160,92967,154,0,1442,,,,,94728,1333029,4629,1333029,4629,13395,86970,,,392001,710,1415606,5552 +"2021-01-27","NE",1905,,11,,5729,5729,360,27,,,726309,2151,,,1833733,,,188122,,329,0,,,,,216775,133206,,0,2052707,11920,,,,,914909,2481,2052707,11920 +"2021-01-27","NH",1006,,12,,1014,1014,223,2,327,,543770,1722,,,,,,63563,45565,391,0,,,,,,57343,,0,1224489,9270,37719,125242,36157,,589335,1962,1224489,9270 +"2021-01-27","NJ",21220,19091,115,2129,59879,59879,3190,218,,578,8618471,38377,,,,,406,676537,606492,4810,0,,,,,,,,0,9295008,43187,,,,,,0,9224963,42209 +"2021-01-27","NM",3198,,27,,11824,11824,586,124,,,,0,,,,,,171047,,751,0,,,,,,98042,,0,2271257,8866,,,,,,0,2271257,8866 +"2021-01-27","NV",4134,,46,,,,1400,0,,344,1042163,2195,,,,,235,273873,273873,1020,0,,,,,,,2445386,8401,2445386,8401,,,,,1316036,3215,,0 +"2021-01-27","NY",34579,,172,,89995,89995,8771,0,,1558,,0,,,,,1027,1361082,,11028,0,,,,,,,31128149,202661,31128149,202661,,,,,,0,,0 +"2021-01-27","OH",10931,9737,75,1194,45530,45530,2944,254,6621,735,,0,,,,,482,878284,767576,5366,0,,67275,,,790325,757003,,0,8872864,22128,,1214822,,,,0,8872864,22128 +"2021-01-27","OK",3388,,65,,21314,21314,1322,221,,368,2736087,19379,,,2736087,,,379110,,2686,0,11016,,,,351659,345867,,0,3115197,22065,113470,,,,,0,3096017,22115 +"2021-01-27","OR",1904,,22,,7592,7592,338,47,,78,,0,,,2920673,,34,139355,,768,0,,,,,184427,,,0,3105100,23706,,,,,,0,3105100,23706 +"2021-01-27","PA",21105,,222,,,,3768,0,,759,3590184,10333,,,,,447,818369,718386,5874,0,,,,,,654695,8997550,42801,8997550,42801,,,,,4308570,14476,,0 +"2021-01-27","PR",1794,1509,11,285,,,301,0,,50,305972,0,,,395291,,35,92244,85694,175,0,66871,,,,20103,78813,,0,398216,175,,,,,,0,415664,0 +"2021-01-27","RI",2135,,9,,8098,8098,334,35,,50,617620,2953,,,2316295,,35,113009,,613,0,,,,,134852,,2451147,19224,2451147,19224,,,,,730629,3566,,0 +"2021-01-27","SC",6673,6030,95,643,17580,17580,2140,190,,437,3644866,19907,97657,,3538011,,281,427231,384556,3564,0,21236,81149,,,491411,190336,,0,4072097,23471,118893,610598,,,,0,4029422,22651 +"2021-01-27","SD",1739,,34,,6242,6242,161,26,,36,291602,792,,,,,25,107608,96190,228,0,,,,,101543,102631,,0,644138,1585,,,,,399210,1020,644138,1585 +"2021-01-27","TN",9316,7667,154,1649,16823,16823,2167,116,,580,,0,,,5531270,,347,715806,609183,3400,0,,116453,,,701976,668021,,0,6233246,26094,,868070,,,,0,6233246,26094 +"2021-01-27","TX",35168,,467,,,,12795,0,,3439,,0,,,,,,2292732,2003135,19613,0,119521,159262,,,2262490,1867289,,0,16837794,99636,905351,1705585,,,,0,16837794,99636 +"2021-01-27","UT",1620,,7,,13217,13217,537,80,2082,161,1416799,4603,,,2239119,719,,340684,,2009,0,,49010,,46996,318759,293030,,0,2557878,12865,,693217,,279203,1709903,5953,2557878,12865 +"2021-01-27","VA",6228,5489,54,739,20986,20986,2868,126,,537,,0,,,,,332,488553,392935,5227,0,21940,97871,,,482836,,5112697,33386,5112697,33386,205175,1005293,,,,0,,0 +"2021-01-27","VI",24,,0,,,,,0,,,38308,193,,,,,,2373,,23,0,,,,,,2260,,0,40681,216,,,,,40781,214,,0 +"2021-01-27","VT",172,,1,,,,47,0,,8,287077,878,,,,,,11379,11099,94,0,,,,,,7696,,0,862821,3987,,,,,298176,964,862821,3987 +"2021-01-27","WA",4167,,19,,17354,17354,869,95,,184,,0,,,,,100,303482,290168,1341,0,,,,,,,4446844,22614,4446844,22614,,,,,,0,,0 +"2021-01-27","WI",6302,5787,38,515,23976,23976,734,93,2167,160,2486960,5225,,,,,,585600,536546,1559,0,,,,,,510012,6050119,29580,6050119,29580,,,,,3023506,6553,,0 +"2021-01-27","WV",1953,1667,25,286,,,550,0,,137,,0,,,,,63,117775,94512,797,0,,,,,,92251,,0,1865762,10098,30003,,,,,0,1865762,10098 +"2021-01-27","WY",596,,0,,1270,1270,70,5,,,171688,2170,,,571105,,,51368,43826,216,0,,,,,45120,49338,,0,616677,7104,,,,,215514,2345,616677,7104 +"2021-01-26","AK",260,,1,,1194,1194,57,9,,,,0,,,1396391,,5,51778,,85,0,,,,,62144,,,0,1460189,3136,,,,,,0,1460189,3136 +"2021-01-26","AL",6896,5638,234,1258,41315,41315,2222,246,2518,,1745052,5029,,,,1440,,445909,352918,2900,0,,,,,,233211,,0,2097970,6959,,,102195,,2097970,6959,,0 +"2021-01-26","AR",4690,3810,40,880,13401,13401,1095,89,,347,2138953,10829,,,2138953,1408,176,287187,229727,2485,0,,,,67423,,264308,,0,2368680,12146,,,,346046,,0,2368680,12146 +"2021-01-26","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-26","AZ",12448,11117,209,1331,50657,50657,4221,174,,1028,2691291,8414,,,,,687,732643,687756,4748,0,,,,,,,,0,6462314,32515,,,413431,,3379047,12854,6462314,32515 +"2021-01-26","CA",37527,,409,,,,18039,0,,4384,,0,,,,,,3153186,3153186,17028,0,,,,,,,,0,41010770,321862,,,,,,0,41010770,321862 +"2021-01-26","CO",5517,4809,5,708,21562,21562,740,299,,,1991411,9007,292231,,,,,388620,369780,1158,0,42590,,,,,,5279863,16390,5279863,16390,336555,,,,2361191,5060,,0 +"2021-01-26","CT",6934,5638,23,1296,12257,12257,1068,0,,,,0,,,5128108,,,244899,230145,1267,0,,14675,,,284041,,,0,5419361,53659,,237037,,,,0,5419361,53659 +"2021-01-26","DC",888,,9,,,,240,0,,63,,0,,,,,33,35700,,195,0,,,,,,25008,1059682,4945,1059682,4945,,,,,395137,1189,,0 +"2021-01-26","DE",1065,958,16,107,,,383,0,,47,498857,634,,,,,,75490,71983,299,0,,,,,78557,,1192732,7775,1192732,7775,,,,,574347,933,,0 +"2021-01-26","FL",26080,,231,,71852,71852,6775,465,,,8292405,23990,578113,560932,14393554,,,1637296,1357398,9466,0,71851,,69600,,2138319,,18566269,88400,18566269,88400,650372,,630838,,9929701,33456,16608418,75761 +"2021-01-26","GA",13482,11996,179,1486,48915,48915,5157,417,8248,,,0,,,,,,879221,727752,8393,0,57994,,,,696183,,,0,6271545,36649,437302,,,,,0,6271545,36649 +"2021-01-26","GU",129,,0,,,,11,0,,2,97317,544,,,,,1,7566,7359,12,0,22,270,,,,7335,,0,104883,556,338,8075,,,,0,104676,556 +"2021-01-26","HI",401,401,59,,2050,2050,82,11,,21,,0,,,,,18,25967,25339,64,0,,,,,24951,,948691,2346,948691,2346,,,,,,0,,0 +"2021-01-26","IA",4492,,4,,,,415,0,,78,974630,1367,,85379,2146053,,37,263852,263852,591,0,,53762,13016,50559,285750,276465,,0,1238482,1958,,1084132,98439,212097,1240816,1959,2444329,7153 +"2021-01-26","ID",1681,1475,12,206,6525,6525,169,29,1135,53,462128,1266,,,,,,160033,130519,527,0,,,,,,77351,,0,592647,1680,,78973,,,592647,1680,966258,5152 +"2021-01-26","IL",20853,18883,109,1970,,,3001,0,,608,,0,,,,,320,1108430,,3667,0,,,,,,,,0,15553319,69285,,,,,,0,15553319,69285 +"2021-01-26","IN",9807,9432,79,375,39753,39753,1976,144,6935,449,2297237,3433,,,,,249,614946,,1718,0,,,,,699136,,,0,6787227,25789,,,,,2912183,5151,6787227,25789 +"2021-01-26","KS",3622,,0,,8117,8117,708,0,2210,182,878382,0,,,,412,66,269255,,0,0,,,,,,,,0,1147637,0,,,,,1147637,0,,0 +"2021-01-26","KY",3495,3207,35,288,16002,16002,1566,83,3451,391,,0,,,,,228,350528,276016,2692,0,8186,28477,,,222595,41878,,0,3534120,9013,106392,302694,,,,0,3534120,9013 +"2021-01-26","LA",8621,8090,31,531,,,1646,0,,,4485350,28636,,,,,217,388562,341211,2620,0,,,,,,320025,,0,4873912,31256,,332212,,,,0,4826561,30640 +"2021-01-26","MA",14220,13930,42,290,17556,17556,1951,0,,431,4024375,9327,,,,,278,506183,481617,2495,0,,,13695,,576989,354388,,0,13096275,49701,,,145958,458143,4505992,11542,13096275,49701 +"2021-01-26","MD",6963,6788,63,175,31330,31330,1642,142,,367,2793416,6332,,161002,,,,344620,344620,1482,0,,,22101,,419497,9477,,0,6784162,25926,,,183103,,3138036,7814,6784162,25926 +"2021-01-26","ME",558,549,11,9,1357,1357,194,15,,59,,0,13568,,,,25,37708,30496,662,0,675,7684,,,35183,12275,,0,1310677,4894,14255,137775,,,,0,1310677,4894 +"2021-01-26","MI",15305,14405,86,900,,,1638,0,,382,,0,,,8569233,,210,602168,552556,2075,0,,,,,699966,463106,,0,9269199,26808,481240,,,,,0,9269199,26808 +"2021-01-26","MN",6106,5867,8,239,24014,24014,496,82,4995,100,2777527,-234,,,,,,456490,437264,707,0,,,,,,440596,6080904,9512,6080904,9512,,318649,,,3214791,346,,0 +"2021-01-26","MO",6686,,133,,,,1953,0,,443,1752532,2567,113874,,3564302,,288,451493,451493,1079,0,18879,67033,,,498809,,,0,4071261,10826,132940,583703,121345,258191,2204025,3646,4071261,10826 +"2021-01-26","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,132,132,0,0,,,,,,29,,0,17561,0,,,,,17542,0,26131,0 +"2021-01-26","MS",5852,4309,75,1543,8647,8647,1023,0,,247,1294488,0,,,,,163,266598,169823,1452,0,,,,,,222812,,0,1561086,1452,72089,617477,,,,0,1463634,0 +"2021-01-26","MT",1185,,34,,4141,4141,128,13,,23,,0,,,,,16,92160,,344,0,,,,,,86733,,0,922956,2840,,,,,,0,922956,2840 +"2021-01-26","NC",8776,8005,56,771,,,3368,0,,696,,0,,,,,,727423,652993,3978,0,,,,,,,,0,8075827,24820,,483594,,,,0,8075827,24820 +"2021-01-26","ND",1440,,4,,3752,3752,48,7,549,8,294285,396,11953,,,,,97006,92865,132,0,1442,,,,,94584,1328400,1173,1328400,1173,13395,85176,,,391291,528,1410054,1380 +"2021-01-26","NE",1894,,15,,5702,5702,373,20,,,724158,4158,,,1822202,,,187793,,646,0,,,,,216396,132495,,0,2040787,14759,,,,,912428,4800,2040787,14759 +"2021-01-26","NH",994,,4,,1012,1012,213,5,326,,542048,792,,,,,,63172,45325,404,0,,,,,,56748,,0,1215219,3968,37644,122247,36105,,587373,966,1215219,3968 +"2021-01-26","NJ",21105,18984,133,2121,59661,59661,3251,223,,572,8580094,184415,,,,,404,671727,602660,4776,0,,,,,,,,0,9251821,189191,,,,,,0,9182754,196675 +"2021-01-26","NM",3171,,14,,11700,11700,561,102,,,,0,,,,,,170296,,600,0,,,,,,96659,,0,2262391,7325,,,,,,0,2262391,7325 +"2021-01-26","NV",4088,,59,,,,1462,0,,335,1039968,2517,,,,,243,272853,272853,956,0,,,,,,,2436985,9545,2436985,9545,,,,,1312821,3473,,0 +"2021-01-26","NY",34407,,165,,89995,89995,8831,0,,1544,,0,,,,,1006,1350054,,11064,0,,,,,,,30925488,162938,30925488,162938,,,,,,0,,0 +"2021-01-26","OH",10856,9678,88,1178,45276,45276,2964,295,6600,741,,0,,,,,486,872918,763650,4262,0,,67275,,,790325,748132,,0,8850736,36502,,1214822,,,,0,8850736,36502 +"2021-01-26","OK",3323,,30,,21093,21093,1454,40,,410,2716708,25994,,,2716708,,,376424,,1571,0,11016,,,,349548,342697,,0,3093132,27565,113470,,,,,0,3073902,28777 +"2021-01-26","OR",1882,,2,,7545,7545,359,76,,79,,0,,,2898132,,38,138587,,419,0,,,,,183262,,,0,3081394,37602,,,,,,0,3081394,37602 +"2021-01-26","PA",20883,,219,,,,3790,0,,760,3579851,10411,,,,,436,812495,714243,4628,0,,,,,,641871,8954749,45513,8954749,45513,,,,,4294094,14198,,0 +"2021-01-26","PR",1783,1499,5,284,,,312,0,,54,305972,0,,,395291,,43,92069,85551,473,0,66734,,,,20103,78813,,0,398041,473,,,,,,0,415664,0 +"2021-01-26","RI",2126,,16,,8063,8063,346,57,,51,614667,2054,,,2297784,,35,112396,,642,0,,,,,134139,,2431923,13904,2431923,13904,,,,,727063,2696,,0 +"2021-01-26","SC",6578,5944,26,634,17390,17390,2173,55,,440,3624959,25270,97566,,3518698,,279,423667,381812,2250,0,21179,80119,,,488073,188788,,0,4048626,27520,118745,603106,,,,0,4006771,27307 +"2021-01-26","SD",1705,,0,,6216,6216,152,15,,40,290810,469,,,,,24,107380,96021,200,0,,,,,101401,102247,,0,642553,685,,,,,398190,669,642553,685 +"2021-01-26","TN",9162,7571,192,1591,16707,16707,2166,147,,604,,0,,,5508047,,359,712406,606592,1979,0,,115631,,,699105,662533,,0,6207152,8529,,859827,,,,0,6207152,8529 +"2021-01-26","TX",34701,,307,,,,12851,0,,3348,,0,,,,,,2273119,1988063,26274,0,119004,156909,,,2245329,1845210,,0,16738158,108492,903308,1687621,,,,0,16738158,108492 +"2021-01-26","UT",1613,,16,,13137,13137,540,83,2074,158,1412196,3212,,,2227802,716,,338675,,1411,0,,48458,,46462,317211,289231,,0,2545013,8707,,680933,,275000,1703950,3962,2545013,8707 +"2021-01-26","VA",6174,5442,93,732,20860,20860,2847,96,,539,,0,,,,,316,483326,389259,4707,0,21809,96316,,,478535,,5079311,22879,5079311,22879,204758,987681,,,,0,,0 +"2021-01-26","VI",24,,0,,,,,0,,,38115,159,,,,,,2350,,9,0,,,,,,2254,,0,40465,168,,,,,40567,175,,0 +"2021-01-26","VT",171,,0,,,,58,0,,9,286199,168,,,,,,11285,11013,120,0,,,,,,7574,,0,858834,5283,,,,,297212,287,858834,5283 +"2021-01-26","WA",4148,,34,,17259,17259,846,130,,173,,0,,,,,82,302141,288948,1943,0,,,,,,,4424230,50584,4424230,50584,,,,,,0,,0 +"2021-01-26","WI",6264,5753,65,511,23883,23883,746,135,2164,155,2481735,4147,,,,,,584041,535218,1564,0,,,,,,507760,6020539,17138,6020539,17138,,,,,3016953,5448,,0 +"2021-01-26","WV",1928,1644,29,284,,,582,0,,152,,0,,,,,64,116978,93905,1139,0,,,,,,90875,,0,1855664,14553,29932,,,,,0,1855664,14553 +"2021-01-26","WY",596,,25,,1265,1265,71,1,,,169518,2147,,,564215,,,51152,43651,90,0,,,,,44908,49268,,0,609573,35705,,,,,213169,2757,609573,35705 +"2021-01-25","AK",259,,0,,1185,1185,54,0,,,,0,,,1393392,,7,51693,,83,0,,,,,62017,,,0,1457053,3583,,,,,,0,1457053,3583 +"2021-01-25","AL",6662,5469,2,1193,41069,41069,2285,555,2511,,1740023,2929,,,,1433,,443009,350988,1839,0,,,,,,233211,,0,2091011,4456,,,101423,,2091011,4456,,0 +"2021-01-25","AR",4650,3778,44,872,13312,13312,1084,45,,336,2128124,8564,,,2128124,1395,187,284702,228410,636,0,,,,66176,,262229,,0,2356534,9146,,,,339424,,0,2356534,9146 +"2021-01-25","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-25","AZ",12239,10942,1,1297,50483,50483,4229,219,,1027,2682877,11106,,,,,702,727895,683316,5321,0,,,,,,,,0,6429799,44580,,,413052,,3366193,15947,6429799,44580 +"2021-01-25","CA",37118,,328,,,,18347,0,,4475,,0,,,,,,3136158,3136158,27007,0,,,,,,,,0,40688908,403193,,,,,,0,40688908,403193 +"2021-01-25","CO",5512,4801,7,704,21263,21263,737,26,,,1982404,0,290389,,,,,387462,367746,1177,0,42087,,,,,,5263473,16562,5263473,16562,334821,,,,2356131,5981,,0 +"2021-01-25","CT",6911,5621,92,1290,12257,12257,1068,0,,,,0,,,5076818,,,243632,228977,5817,0,,14427,,,281700,,,0,5365702,17436,,233960,,,,0,5365702,17436 +"2021-01-25","DC",879,,7,,,,248,0,,67,,0,,,,,39,35505,,204,0,,,,,,24818,1054737,5786,1054737,5786,,,,,393948,1395,,0 +"2021-01-25","DE",1049,942,8,107,,,385,0,,50,498223,2081,,,,,,75191,71727,616,0,,,,,77834,,1184957,8116,1184957,8116,,,,,573414,2697,,0 +"2021-01-25","FL",25849,,156,,71387,71387,6899,168,,,8268415,25355,578113,560932,14330802,,,1627830,1350703,8542,0,71851,,69600,,2125816,,18477869,80045,18477869,80045,650372,,630838,,9896245,33897,16532657,76322 +"2021-01-25","GA",13303,11854,53,1449,48498,48498,5231,113,8203,,,0,,,,,,870828,722062,3917,0,57763,,,,690288,,,0,6234896,26036,436787,,,,,0,6234896,26036 +"2021-01-25","GU",129,,1,,,,10,0,,2,96773,1046,,,,,2,7554,7347,7,0,22,270,,,,7319,,0,104327,1053,338,8061,,,,0,104120,1053 +"2021-01-25","HI",342,342,0,,2039,2039,89,25,,21,,0,,,,,17,25903,25275,121,0,,,,,24898,,946345,4042,946345,4042,,,,,,0,,0 +"2021-01-25","IA",4488,,0,,,,383,0,,78,973263,1064,,85185,2139510,,37,263261,263261,401,0,,53417,12898,50254,285129,273751,,0,1236524,1465,,1070588,98127,210952,1238857,1464,2437176,4373 +"2021-01-25","ID",1669,1464,1,205,6496,6496,252,15,1129,67,460862,1188,,,,,,159506,130105,181,0,,,,,,76392,,0,590967,1338,,78973,,,590967,1338,961106,2450 +"2021-01-25","IL",20744,18798,64,1946,,,2962,0,,601,,0,,,,,302,1104763,,2944,0,,,,,,,,0,15484034,74202,,,,,,0,15484034,74202 +"2021-01-25","IN",9728,9352,12,376,39609,39609,2045,104,6916,459,2293804,4792,,,,,257,613228,,2189,0,,,,,697231,,,0,6761438,23097,,,,,2907032,6981,6761438,23097 +"2021-01-25","KS",3622,,24,,8117,8117,708,76,2210,182,878382,7624,,,,412,66,269255,,2602,0,,,,,,,,0,1147637,10226,,,,,1147637,10226,,0 +"2021-01-25","KY",3460,3177,39,283,15919,15919,1537,30,3442,374,,0,,,,,203,347836,274512,1250,0,8156,28128,,,221809,41760,,0,3525107,22043,106274,298537,,,,0,3525107,22043 +"2021-01-25","LA",8590,8064,25,526,,,1638,0,,,4456714,25006,,,,,219,385942,339207,2080,0,,,,,,320025,,0,4842656,27086,,327660,,,,0,4795921,26998 +"2021-01-25","MA",14178,13889,45,289,17556,17556,1955,0,,418,4015048,12888,,,,,285,503688,479402,3651,0,,,13695,,574385,354388,,0,13046574,78650,,,145958,455076,4494450,16365,13046574,78650 +"2021-01-25","MD",6900,6726,35,174,31188,31188,1669,154,,395,2787084,7679,,161002,,,,343138,343138,1686,0,,,22101,,417738,9476,,0,6758236,34734,,,183103,,3130222,9365,6758236,34734 +"2021-01-25","ME",547,538,3,9,1342,1342,193,20,,59,,0,13554,,,,20,37046,30108,448,0,672,7520,,,34968,12245,,0,1305783,7482,14238,135771,,,,0,1305783,7482 +"2021-01-25","MI",15219,14326,38,893,,,1668,0,,392,,0,,,8544339,,199,600093,551080,3347,0,,,,,698052,463106,,0,9242391,60168,479890,,,,,0,9242391,60168 +"2021-01-25","MN",6098,5859,3,239,23932,23932,543,48,4974,104,2777761,7274,,,,,,455783,436684,794,0,,,,,,439283,6071392,19169,6071392,19169,,317567,,,3214445,7936,,0 +"2021-01-25","MO",6553,,5,,,,2067,0,,462,1749965,2431,113704,,3554582,,284,450414,450414,879,0,18767,66461,,,497694,,,0,4060435,9047,132661,577076,121134,255918,2200379,3310,4060435,9047 +"2021-01-25","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,132,132,3,0,,,,,,29,,0,17561,3,,,,,17542,0,26131,0 +"2021-01-25","MS",5777,4271,5,1506,8647,8647,1028,101,,245,1294488,38373,,,,,163,265146,169146,927,0,,,,,,222812,,0,1559634,39300,72089,617477,,,,0,1463634,43038 +"2021-01-25","MT",1151,,0,,4128,4128,129,3,,25,,0,,,,,15,91816,,164,0,,,,,,86274,,0,920116,8430,,,,,,0,920116,8430 +"2021-01-25","NC",8720,7964,25,756,,,3287,0,,703,,0,,,,,,723445,649864,4633,0,,,,,,,,0,8051007,50620,,477337,,,,0,8051007,50620 +"2021-01-25","ND",1436,,8,,3745,3745,50,4,547,7,293889,81,11953,,,,,96874,92799,57,0,1442,,,,,94381,1327227,1336,1327227,1336,13395,82941,,,390763,138,1408674,1627 +"2021-01-25","NE",1879,,0,,5682,5682,392,4,,,720000,1066,,,1808706,,,187147,,293,0,,,,,215632,132453,,0,2026028,4612,,,,,907628,1360,2026028,4612 +"2021-01-25","NH",990,,3,,1007,1007,230,7,324,,541256,2027,,,,,,62768,45151,431,0,,,,,,56151,,0,1211251,6230,37603,119746,36070,,586407,2335,1211251,6230 +"2021-01-25","NJ",20972,18851,21,2121,59438,59438,3238,69,,596,8395679,0,,,,,390,666951,598660,4143,0,,,,,,,,0,9062630,4143,,,,,,0,8986079,0 +"2021-01-25","NM",3157,,12,,11598,11598,435,75,,,,0,,,,,,169696,,491,0,,,,,,95848,,0,2255066,9958,,,,,,0,2255066,9958 +"2021-01-25","NV",4029,,3,,,,1441,0,,323,1037451,2122,,,,,247,271897,271897,990,0,,,,,,,2427440,8405,2427440,8405,,,,,1309348,3112,,0 +"2021-01-25","NY",34242,,173,,89995,89995,8730,0,,1522,,0,,,,,1005,1338990,,12003,0,,,,,,,30762550,219538,30762550,219538,,,,,,0,,0 +"2021-01-25","OH",10768,9602,57,1166,44981,44981,3037,198,6560,760,,0,,,,,505,868656,760837,4334,0,,66558,,,787003,736651,,0,8814234,36363,,1202451,,,,0,8814234,36363 +"2021-01-25","OK",3293,,14,,21053,21053,1595,33,,433,2690714,0,,,2690714,,,374853,,1763,0,11016,,,,345733,339014,,0,3065567,1763,113470,,,,,0,3045125,0 +"2021-01-25","OR",1880,,3,,7469,7469,342,0,,83,,0,,,2862408,,41,138168,,568,0,,,,,181384,,,0,3043792,0,,,,,,0,3043792,0 +"2021-01-25","PA",20664,,55,,,,3887,0,,770,3569440,10776,,,,,461,807867,710456,3934,0,,,,,,638214,8909236,39402,8909236,39402,,,,,4279896,13877,,0 +"2021-01-25","PR",1778,1494,5,284,,,312,0,,56,305972,0,,,395291,,41,91596,85114,568,0,66352,,,,20103,78813,,0,397568,568,,,,,,0,415664,0 +"2021-01-25","RI",2110,,9,,8006,8006,347,162,,50,612613,1164,,,2284592,,33,111754,,301,0,,,,,133427,,2418019,7994,2418019,7994,,,,,724367,1465,,0 +"2021-01-25","SC",6552,5920,5,632,17335,17335,2201,46,,429,3599689,32902,97328,,3494165,,262,421417,379775,3092,0,20967,79744,,,485299,187423,,0,4021106,35994,118295,600042,,,,0,3979464,35690 +"2021-01-25","SD",1705,,0,,6201,6201,161,8,,37,290341,250,,,,,26,107180,95865,32,0,,,,,101333,101797,,0,641868,1095,,,,,397521,282,641868,1095 +"2021-01-25","TN",8970,7431,111,1539,16560,16560,2196,56,,608,,0,,,5500435,,355,710427,605335,1710,0,,114917,,,698188,657031,,0,6198623,14033,,849191,,,,0,6198623,14033 +"2021-01-25","TX",34394,,72,,,,12785,0,,3352,,0,,,,,,2246845,1965585,6319,0,117468,154475,,,2227866,1818785,,0,16629666,68526,898817,1652273,,,,0,16629666,68526 +"2021-01-25","UT",1597,,2,,13054,13054,528,38,2054,179,1408984,2796,,,2219946,709,,337264,,859,0,,47698,,45731,316360,285852,,0,2536306,6510,,666441,,269671,1699988,3500,2536306,6510 +"2021-01-25","VA",6081,5363,3,718,20764,20764,2892,52,,554,,0,,,,,324,478619,385892,6172,0,21577,95014,,,474962,,5056432,49382,5056432,49382,203887,973893,,,,0,,0 +"2021-01-25","VI",24,,0,,,,,0,,,37956,0,,,,,,2341,,0,0,,,,,,2234,,0,40297,0,,,,,40392,0,,0 +"2021-01-25","VT",171,,1,,,,56,0,,6,286031,1169,,,,,,11165,10894,132,0,,,,,,7476,,0,853551,5568,,,,,296925,1300,853551,5568 +"2021-01-25","WA",4114,,0,,17129,17129,916,0,,242,,0,,,,,100,300198,287031,0,0,,,,,,,4373646,0,4373646,0,,,,,,0,,0 +"2021-01-25","WI",6199,5699,9,500,23748,23748,772,56,2158,175,2477588,3253,,,,,,582477,533917,1100,0,,,,,,505987,6003401,12931,6003401,12931,,,,,3011505,4199,,0 +"2021-01-25","WV",1899,1624,4,275,,,597,0,,151,,0,,,,,63,115839,93114,532,0,,,,,,89575,,0,1841111,4946,29826,,,,,0,1841111,4946 +"2021-01-25","WY",571,,0,,1264,1264,66,5,,,167371,0,,,551775,,,51062,43599,164,0,,,,,44303,49008,,0,573868,0,,,,,210412,0,573868,0 +"2021-01-24","AK",259,,0,,1185,1185,57,1,,,,0,,,1389919,,7,51610,,165,0,,,,,61912,,,0,1453470,6956,,,,,,0,1453470,6956 +"2021-01-24","AL",6660,5467,3,1193,40514,40514,2254,0,2511,,1737094,6623,,,,1433,,441170,349461,1728,0,,,,,,233211,,0,2086555,8067,,,101051,,2086555,8067,,0 +"2021-01-24","AR",4606,3758,43,848,13267,13267,1080,17,,345,2119560,7926,,,2119560,1390,170,284066,227828,1071,0,,,,66049,,260034,,0,2347388,8867,,,,338214,,0,2347388,8867 +"2021-01-24","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-24","AZ",12238,10941,68,1297,50264,50264,4320,301,,1054,2671771,14605,,,,,720,722574,678475,7217,0,,,,,,,,0,6385219,60774,,,412340,,3350246,21051,6385219,60774 +"2021-01-24","CA",36790,,429,,,,18638,0,,4542,,0,,,,,,3109151,3109151,24111,0,,,,,,,,0,40285715,315596,,,,,,0,40285715,315596 +"2021-01-24","CO",5505,4801,23,704,21237,21237,737,18,,,1982404,5827,289585,,,,,386285,367746,1319,0,41877,,,,,,5246911,25746,5246911,25746,332476,,,,2350150,7053,,0 +"2021-01-24","CT",6819,5545,0,1274,12257,12257,1058,0,,,,0,,,5060586,,,237815,223508,0,0,,14025,,,280502,,,0,5348266,18679,,221289,,,,0,5348266,18679 +"2021-01-24","DC",872,,2,,,,254,0,,67,,0,,,,,39,35301,,224,0,,,,,,24697,1048951,5839,1048951,5839,,,,,392553,1326,,0 +"2021-01-24","DE",1041,934,5,107,,,388,0,,52,496142,1432,,,,,,74575,71112,660,0,,,,,77099,,1176841,8844,1176841,8844,,,,,570717,2092,,0 +"2021-01-24","FL",25693,,132,,71219,71219,6727,182,,,8243060,27674,578113,560932,14266676,,,1619288,1344147,9335,0,71851,,69600,,2114100,,18397824,102178,18397824,102178,650372,,630838,,9862348,37009,16456335,82643 +"2021-01-24","GA",13250,11801,4,1449,48385,48385,5293,115,8199,,,0,,,,,,866911,718532,4753,0,57197,,,,686333,,,0,6208860,34390,435326,,,,,0,6208860,34390 +"2021-01-24","GU",128,,0,,,,11,0,,3,95727,0,,,,,3,7547,7340,0,0,22,270,,,,7293,,0,103274,0,337,8012,,,,0,103067,0 +"2021-01-24","HI",342,342,6,,2014,2014,84,0,,21,,0,,,,,18,25782,25154,151,0,,,,,24783,,942303,5853,942303,5853,,,,,,0,,0 +"2021-01-24","IA",4488,,1,,,,382,0,,79,972199,1885,,85093,2135604,,36,262860,262860,711,0,,53243,12811,50072,284695,274101,,0,1235059,2596,,1067363,97948,210197,1237393,2600,2432803,7486 +"2021-01-24","ID",1668,1464,1,204,6481,6481,252,17,1127,67,459674,1359,,,,,,159325,129955,527,0,,,,,,75752,,0,589629,1802,,78973,,,589629,1802,958656,3998 +"2021-01-24","IL",20680,18750,35,1930,,,2994,0,,617,,0,,,,,321,1101819,,3292,0,,,,,,,,0,15409832,90138,,,,,,0,15409832,90138 +"2021-01-24","IN",9716,9340,23,376,39505,39505,2118,109,6917,478,2289012,6575,,,,,243,611039,,2520,0,,,,,694707,,,0,6738341,36864,,,,,2900051,9095,6738341,36864 +"2021-01-24","KS",3598,,0,,8041,8041,708,0,2181,182,870758,0,,,,412,66,266653,,0,0,,,,,,,,0,1137411,0,,,,,1137411,0,,0 +"2021-01-24","KY",3421,3145,35,276,15889,15889,1540,34,3435,371,,0,,,,,218,346586,273686,2018,0,8014,27693,,,219976,41660,,0,3503064,0,105575,294279,,,,0,3503064,0 +"2021-01-24","LA",8565,8038,82,527,,,1641,0,,,4431708,36011,,,,,215,383862,337215,3607,0,,,,,,320025,,0,4815570,39618,,326381,,,,0,4768923,38457 +"2021-01-24","MA",14133,13844,69,289,17556,17556,1946,0,,409,4002160,14051,,,,,286,500037,475925,3944,0,,,13695,,570238,354388,,0,12967924,101327,,,145958,453187,4478085,17801,12967924,101327 +"2021-01-24","MD",6865,6690,28,175,31034,31034,1668,168,,392,2779405,7679,,161002,,,,341452,341452,2145,0,,,22101,,415608,9474,,0,6723502,45247,,,183103,,3120857,9824,6723502,45247 +"2021-01-24","ME",544,535,0,9,1322,1322,189,0,,55,,0,13500,,,,20,36598,29780,0,0,658,7408,,,34669,12225,,0,1298301,15504,14170,133966,,,,0,1298301,15504 +"2021-01-24","MI",15181,14291,0,890,,,1843,0,,396,,0,,,8489363,,191,596746,548069,0,0,,,,,692860,463106,,0,9182223,0,476180,,,,,0,9182223,0 +"2021-01-24","MN",6095,5857,32,238,23884,23884,543,19,4965,104,2770487,11728,,,,,,454989,436022,1181,0,,,,,,437827,6052223,28051,6052223,28051,,315498,,,3206509,12726,,0 +"2021-01-24","MO",6548,,7,,,,2158,0,,495,1747534,5735,113605,,3546433,,301,449535,449535,2137,0,18636,66185,,,496737,,,0,4051388,19830,132456,574753,121001,254584,2197069,7872,4051388,19830 +"2021-01-24","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,129,129,0,0,,,,,,29,,0,17558,0,,,,,17542,0,26131,0 +"2021-01-24","MS",5772,4268,20,1504,8546,8546,1102,0,,284,1256115,0,,,,,174,264219,168651,1196,0,,,,,,207769,,0,1520334,1196,68780,567025,,,,0,1420596,0 +"2021-01-24","MT",1151,,10,,4125,4125,135,13,,25,,0,,,,,15,91652,,242,0,,,,,,85881,,0,911686,4933,,,,,,0,911686,4933 +"2021-01-24","NC",8695,7942,109,753,,,3303,0,,713,,0,,,,,,718812,645559,6096,0,,,,,,,,0,8000387,55905,,475269,,,,0,8000387,55905 +"2021-01-24","ND",1428,,0,,3741,3741,49,2,547,7,293808,340,11953,,,,,96817,92750,97,0,1442,,,,,94309,1325891,1893,1325891,1893,13395,82510,,,390625,437,1407047,2198 +"2021-01-24","NE",1879,,1,,5678,5678,390,8,,,718934,7181,,,1803954,,,186854,,599,0,,,,,215275,131828,,0,2021416,22978,,,,,906268,7785,2021416,22978 +"2021-01-24","NH",987,,6,,1000,1000,239,8,321,,539229,1503,,,,,,62337,44843,761,0,,,,,,55228,,0,1205021,7074,37563,118491,36033,,584072,2038,1205021,7074 +"2021-01-24","NJ",20951,18830,17,2121,59369,59369,3186,105,,590,8395679,0,,,,,376,662808,595002,5272,0,,,,,,,,0,9058487,5272,,,,,,0,8986079,0 +"2021-01-24","NM",3145,,30,,11523,11523,435,66,,,,0,,,,,,169205,,626,0,,,,,,94141,,0,2245108,12868,,,,,,0,2245108,12868 +"2021-01-24","NV",4026,,15,,,,1499,0,,357,1035329,2215,,,,,258,270907,270907,1194,0,,,,,,,2419035,9308,2419035,9308,,,,,1306236,3409,,0 +"2021-01-24","NY",34069,,162,,89995,89995,8613,0,,1527,,0,,,,,997,1326987,,12720,0,,,,,,,30543012,249955,30543012,249955,,,,,,0,,0 +"2021-01-24","OH",10711,9555,31,1156,44783,44783,2993,98,6521,764,,0,,,,,532,864322,757622,4481,0,,66058,,,784227,731088,,0,8777871,39314,,1198510,,,,0,8777871,39314 +"2021-01-24","OK",3279,,48,,21020,21020,1595,171,,433,2690714,0,,,2690714,,,373090,,2941,0,11016,,,,345733,337228,,0,3063804,2941,113470,,,,,0,3045125,0 +"2021-01-24","OR",1877,,12,,7469,7469,342,0,,83,,0,,,2862408,,41,137600,,761,0,,,,,181384,,,0,3043792,0,,,,,,0,3043792,0 +"2021-01-24","PA",20609,,83,,,,3910,0,,790,3558664,11754,,,,,492,803933,707355,3976,0,,,,,,631966,8869834,51189,8869834,51189,,,,,4266019,15201,,0 +"2021-01-24","PR",1773,1485,2,288,,,310,0,,50,305972,0,,,395291,,43,91028,84578,955,0,65807,,,,20103,73760,,0,397000,955,,,,,,0,415664,0 +"2021-01-24","RI",2101,,4,,7844,7844,352,0,,43,611449,3108,,,2276968,,31,111453,,742,0,,,,,133057,,2410025,19787,2410025,19787,,,,,722902,3850,,0 +"2021-01-24","SC",6547,5915,68,632,17289,17289,2189,125,,428,3566787,36458,96952,,3462590,,274,418325,376987,4536,0,20730,78875,,,481184,186248,,0,3985112,40994,117682,595417,,,,0,3943774,40046 +"2021-01-24","SD",1705,,9,,6193,6193,162,16,,36,290091,634,,,,,27,107148,95841,185,0,,,,,101238,101438,,0,640773,1893,,,,,397239,819,640773,1893 +"2021-01-24","TN",8859,7351,40,1508,16504,16504,2269,23,,627,,0,,,5488083,,376,708717,603856,2841,0,,114543,,,696507,654335,,0,6184590,25838,,847549,,,,0,6184590,25838 +"2021-01-24","TX",34322,,208,,,,12899,0,,3384,,0,,,,,,2240526,1960061,11565,0,117189,149509,,,2217409,1809067,,0,16561140,155513,897815,1599086,,,,0,16561140,155513 +"2021-01-24","UT",1595,,13,,13016,13016,523,68,2054,182,1406188,4554,,,2214227,708,,336405,,1516,0,,47527,,45568,315569,283690,,0,2529796,10827,,664408,,268997,1696488,5663,2529796,10827 +"2021-01-24","VA",6078,5361,-1,717,20712,20712,2850,58,,546,,0,,,,,329,472447,381441,3792,0,21379,93794,,,469204,,5007050,29079,5007050,29079,203229,964092,,,,0,,0 +"2021-01-24","VI",24,,0,,,,,0,,,37956,155,,,,,,2341,,6,0,,,,,,2234,,0,40297,161,,,,,40392,161,,0 +"2021-01-24","VT",170,,0,,,,51,0,,8,284862,1223,,,,,,11033,10763,125,0,,,,,,7396,,0,847983,6732,,,,,295625,1345,847983,6732 +"2021-01-24","WA",4114,,0,,17129,17129,916,92,,242,,0,,,,,100,300198,287031,1949,0,,,,,,,4373646,23867,4373646,23867,,,,,,0,,0 +"2021-01-24","WI",6190,5691,6,499,23692,23692,761,67,2153,169,2474335,5212,,,,,,581377,532971,1374,0,,,,,,504238,5990470,23209,5990470,23209,,,,,3007306,6331,,0 +"2021-01-24","WV",1895,1620,23,275,,,607,0,,151,,0,,,,,70,115307,92717,555,0,,,,,,88933,,0,1836165,6445,29695,,,,,0,1836165,6445 +"2021-01-24","WY",571,,0,,1259,1259,65,8,,,167371,0,,,530355,,,50898,43443,315,0,,,,,43473,48571,,0,573868,0,,,,,210412,0,573868,0 +"2021-01-23","AK",259,,5,,1184,1184,56,0,,,,0,,,1383165,,7,51445,,241,0,,,,,61718,,,0,1446514,7556,,,,,,0,1446514,7556 +"2021-01-23","AL",6657,5464,171,1193,40514,40514,2258,0,2510,,1730471,9797,,,,1432,,439442,348017,3355,0,,,,,,233211,,0,2078488,12137,,,100580,,2078488,12137,,0 +"2021-01-23","AR",4563,3734,14,829,13250,13250,1094,120,,354,2111634,9943,,,2111634,1390,184,282995,226887,1613,0,,,,65912,,258483,,0,2338521,11093,,,,337916,,0,2338521,11093 +"2021-01-23","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-23","AZ",12170,10879,169,1291,49963,49963,4442,361,,1049,2657166,13981,,,,,728,715357,672029,7316,0,,,,,,,,0,6324445,55354,,,409919,,3329195,20504,6324445,55354 +"2021-01-23","CA",36361,,593,,,,19293,0,,4641,,0,,,,,,3085040,3085040,22972,0,,,,,,,,0,39970119,244280,,,,,,0,39970119,244280 +"2021-01-23","CO",5482,4778,20,704,21219,21219,716,73,,,1976577,7182,286808,,,,,384966,366520,1958,0,41231,,,,,,5221165,35757,5221165,35757,331462,,,,2343097,8927,,0 +"2021-01-23","CT",6819,5545,0,1274,12257,12257,1058,0,,,,0,,,5043440,,,237815,223508,0,0,,14025,,,278994,,,0,5329587,33656,,221289,,,,0,5329587,33656 +"2021-01-23","DC",870,,3,,,,256,0,,63,,0,,,,,31,35077,,172,0,,,,,,24572,1043112,4632,1043112,4632,,,,,391227,958,,0 +"2021-01-23","DE",1036,929,9,107,,,401,0,,55,494710,2238,,,,,,73915,70480,682,0,,,,,76487,,1167997,10871,1167997,10871,,,,,568625,2920,,0 +"2021-01-23","FL",25561,,156,,71037,71037,6711,270,,,8215386,48994,578113,560932,14197211,,,1609953,1336510,12104,0,71851,,69600,,2101456,,18295646,169590,18295646,169590,650372,,630838,,9825339,61098,16373692,138643 +"2021-01-23","GA",13246,11798,186,1448,48270,48270,5370,320,8183,,,0,,,,,,862158,714322,8985,0,56552,,,,681424,,,0,6174470,52404,433621,,,,,0,6174470,52404 +"2021-01-23","GU",128,,0,,,,9,0,,3,95727,0,,,,,3,7547,7340,0,0,22,270,,,,7293,,0,103274,0,337,8012,,,,0,103067,0 +"2021-01-23","HI",336,336,4,,2014,2014,84,0,,21,,0,,,,,18,25631,25003,133,0,,,,,24633,,936450,4974,936450,4974,,,,,,0,,0 +"2021-01-23","IA",4487,,9,,,,419,0,,76,970314,2393,,84239,2129046,,38,262149,262149,956,0,,53102,12532,49935,283898,273189,,0,1232463,3349,,1065393,96814,210043,1234793,3344,2425317,10728 +"2021-01-23","ID",1667,1462,13,205,6464,6464,252,24,1127,67,458315,2019,,,,,,158798,129512,598,0,,,,,,75041,,0,587827,2468,,78973,,,587827,2468,954658,6899 +"2021-01-23","IL",20645,18711,111,1934,,,3121,0,,644,,0,,,,,338,1098527,,5152,0,,,,,,,,0,15319694,110178,,,,,,0,15319694,110178 +"2021-01-23","IN",9693,9317,51,376,39396,39396,2134,154,6885,478,2282437,7967,,,,,261,608519,,3093,0,,,,,691677,,,0,6701477,48977,,,,,2890956,11060,6701477,48977 +"2021-01-23","KS",3598,,0,,8041,8041,708,0,2181,182,870758,0,,,,412,66,266653,,0,0,,,,,,,,0,1137411,0,,,,,1137411,0,,0 +"2021-01-23","KY",3386,3114,49,272,15855,15855,1604,95,3434,403,,0,,,,,209,344568,272191,3789,0,8014,27693,,,219976,41633,,0,3503064,18278,105575,294279,,,,0,3503064,18278 +"2021-01-23","LA",8483,7964,0,519,,,1747,0,,,4395697,0,,,,,216,380255,334769,0,0,,,,,,320025,,0,4775952,0,,317521,,,,0,4730466,0 +"2021-01-23","MA",14064,13777,77,287,17556,17556,2055,0,,418,3988109,15036,,,,,291,496093,472175,4641,0,,,13695,,565771,354388,,0,12866597,112391,,,145958,450046,4460284,19366,12866597,112391 +"2021-01-23","MD",6837,6662,45,175,30866,30866,1717,169,,405,2771726,11008,,161002,,,,339307,339307,2392,0,,,22101,,413118,9471,,0,6678255,47691,,,183103,,3111033,13400,6678255,47691 +"2021-01-23","ME",544,535,4,9,1322,1322,185,13,,57,,0,13500,,,,19,36598,29780,324,0,658,7150,,,34152,12225,,0,1282797,6372,14170,129992,,,,0,1282797,6372 +"2021-01-23","MI",15181,14291,230,890,,,1843,0,,396,,0,,,8489363,,191,596746,548069,1826,0,,,,,692860,463106,,0,9182223,53925,476180,,,,,0,9182223,53925 +"2021-01-23","MN",6063,5832,31,231,23865,23865,543,98,4961,104,2758759,11334,,,,,,453808,435024,1540,0,,,,,,436544,6024172,39240,6024172,39240,,308475,,,3193783,12717,,0 +"2021-01-23","MO",6541,,14,,,,2264,0,,520,1741799,4116,112896,,3529052,,309,447398,447398,1777,0,18337,65451,,,494281,,,0,4031558,18527,131452,565976,120199,250700,2189197,5893,4031558,18527 +"2021-01-23","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,129,129,0,0,,,,,,29,,0,17558,0,,,,,17542,0,26131,0 +"2021-01-23","MS",5752,4257,39,1495,8546,8546,1102,0,,284,1256115,0,,,,,174,263023,168027,1856,0,,,,,,207769,,0,1519138,1856,68780,567025,,,,0,1420596,0 +"2021-01-23","MT",1141,,37,,4112,4112,141,31,,25,,0,,,,,15,91410,,361,0,,,,,,85686,,0,906753,6984,,,,,,0,906753,6984 +"2021-01-23","NC",8586,7858,122,728,,,3416,0,,736,,0,,,,,,712716,640436,7181,0,,,,,,,,0,7944482,56090,,470849,,,,0,7944482,56090 +"2021-01-23","ND",1428,,0,,3739,3739,50,3,546,6,293468,338,11953,,,,,96720,92676,153,0,1442,,,,,94148,1323998,4097,1323998,4097,13395,81663,,,390188,491,1404849,5040 +"2021-01-23","NE",1878,,10,,5670,5670,414,23,,,711753,1608,,,1784925,,,186255,,909,0,,,,,214492,131242,,0,1998438,9534,,,,,898483,2514,1998438,9534 +"2021-01-23","NH",981,,10,,992,992,229,3,319,,537726,2962,,,,,,61576,44308,625,0,,,,,,54644,,0,1197947,10043,37498,116625,35975,,582034,3425,1197947,10043 +"2021-01-23","NJ",20934,18813,59,2121,59264,59264,3236,3909,,603,8395679,39124,,,,,425,657536,590400,7147,0,,,,,,,,0,9053215,46271,,,,,,0,8986079,45233 +"2021-01-23","NM",3115,,38,,11457,11457,627,45,,,,0,,,,,,168579,,848,0,,,,,,93141,,0,2232240,17745,,,,,,0,2232240,17745 +"2021-01-23","NV",4011,,53,,,,1499,0,,357,1033114,2990,,,,,258,269713,269713,1501,0,,,,,,,2409727,14585,2409727,14585,,,,,1302827,4491,,0 +"2021-01-23","NY",33907,,144,,89995,89995,8802,0,,1562,,0,,,,,1023,1314267,,13786,0,,,,,,,30293057,262106,30293057,262106,,,,,,0,,0 +"2021-01-23","OH",10680,9532,81,1148,44685,44685,3117,166,6507,772,,0,,,,,536,859841,754315,5859,0,,64329,,,776438,724135,,0,8738557,55926,,1161476,,,,0,8738557,55926 +"2021-01-23","OK",3231,,44,,20849,20849,1595,157,,433,2690714,16353,,,2690714,,,370149,,4157,0,11016,,,,345733,334643,,0,3060863,20510,113470,,,,,0,3045125,19132 +"2021-01-23","OR",1865,,22,,7469,7469,342,43,,83,,0,,,2862408,,41,136839,,866,0,,,,,181384,,,0,3043792,20460,,,,,,0,3043792,20460 +"2021-01-23","PA",20526,,205,,,,3997,0,,803,3546910,13149,,,,,479,799957,703908,5785,0,,,,,,631966,8818645,62160,8818645,62160,,,,,4250818,17886,,0 +"2021-01-23","PR",1771,1483,10,288,,,325,0,,54,305972,0,,,395291,,46,90073,83670,791,0,64390,,,,20103,73760,,0,396045,791,,,,,,0,415664,0 +"2021-01-23","RI",2097,,14,,7844,7844,352,0,,43,608341,2638,,,2258082,,31,110711,,976,0,,,,,132156,,2390238,27107,2390238,27107,,,,,719052,3614,,0 +"2021-01-23","SC",6479,5855,75,624,17164,17164,2224,137,,445,3530329,38986,96565,,3427043,,283,413789,373399,4601,0,20520,77497,,,476685,184542,,0,3944118,43587,117085,586940,,,,0,3903728,42603 +"2021-01-23","SD",1696,,12,,6177,6177,172,18,,42,289457,696,,,,,27,106963,95683,247,0,,,,,101058,101246,,0,638880,1907,,,,,396420,943,638880,1907 +"2021-01-23","TN",8819,7322,42,1497,16481,16481,2396,59,,648,,0,,,5464772,,386,705876,601695,4029,0,,113751,,,693980,651283,,0,6158752,30447,,843511,,,,0,6158752,30447 +"2021-01-23","TX",34114,,407,,,,13309,0,,3475,,0,,,,,,2228961,1949885,17672,0,115099,148796,,,2195266,1797979,,0,16405627,84547,891438,1594480,,,,0,16405627,84547 +"2021-01-23","UT",1582,,11,,12948,12948,548,64,2052,196,1401634,2526,,,2204690,707,,334889,,1771,0,,47153,,45209,314279,281854,,0,2518969,8415,,660660,,267329,1690825,3682,2518969,8415 +"2021-01-23","VA",6079,5334,77,745,20654,20654,2927,110,,567,,0,,,,,320,468655,378689,4904,0,21064,92343,,,465744,,4977971,29486,4977971,29486,202226,953844,,,,0,,0 +"2021-01-23","VI",24,,0,,,,,0,,,37801,73,,,,,,2335,,14,0,,,,,,2213,,0,40136,87,,,,,40231,87,,0 +"2021-01-23","VT",170,,1,,,,49,0,,7,283639,1317,,,,,,10908,10641,149,0,,,,,,7294,,0,841251,7184,,,,,294280,1461,841251,7184 +"2021-01-23","WA",4114,,49,,17037,17037,916,98,,242,,0,,,,,83,298249,285187,2162,0,,,,,,,4349779,23981,4349779,23981,,,,,,0,,0 +"2021-01-23","WI",6184,5685,49,499,23625,23625,785,89,2148,178,2469123,5779,,,,,,580003,531852,2012,0,,,,,,502593,5967261,29672,5967261,29672,,,,,3000975,7460,,0 +"2021-01-23","WV",1872,1604,16,268,,,624,0,,160,,0,,,,,74,114752,92300,1137,0,,,,,,88024,,0,1829720,10794,29651,,,,,0,1829720,10794 +"2021-01-23","WY",571,,0,,1251,1251,75,0,,,167371,0,,,530355,,,50583,43151,0,0,,,,,43473,48316,,0,573868,0,,,,,210412,0,573868,0 +"2021-01-22","AK",254,,0,,1184,1184,51,7,,,,0,,,1375841,,7,51204,,263,0,,,,,61488,,,0,1438958,7991,,,,,,0,1438958,7991 +"2021-01-22","AL",6486,5350,107,1136,40514,40514,2408,237,2500,,1720674,5432,,,,1426,,436087,345677,3551,0,,,,,,233211,,0,2066351,8127,,,99830,,2066351,8127,,0 +"2021-01-22","AR",4549,3723,53,826,13130,13130,1142,75,,364,2101691,10399,,,2101691,1383,193,281382,225737,2162,0,,,,65389,,256696,,0,2327428,11893,,,,335347,,0,2327428,11893 +"2021-01-22","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-22","AZ",12001,10734,229,1267,49602,49602,4495,998,,1054,2643185,14839,,,,,739,708041,665506,8099,0,,,,,,,,0,6269091,53519,,,408936,,3308691,21391,6269091,53519 +"2021-01-22","CA",35768,,764,,,,19855,0,,4718,,0,,,,,,3062068,3062068,23024,0,,,,,,,,0,39725839,213083,,,,,,0,39725839,213083 +"2021-01-22","CO",5462,4761,22,701,21146,21146,772,105,,,1969395,6963,285409,,,,,383008,364775,1798,0,40775,,,,,,5185408,45107,5185408,45107,328039,,,,2334170,8597,,0 +"2021-01-22","CT",6819,5545,45,1274,12257,12257,1058,0,,,,0,,,5012080,,,237815,223508,2019,0,,14025,,,276716,,,0,5295931,38323,,221289,,,,0,5295931,38323 +"2021-01-22","DC",867,,3,,,,255,0,,63,,0,,,,,25,34905,,293,0,,,,,,24251,1038480,6788,1038480,6788,,,,,390269,2067,,0 +"2021-01-22","DE",1027,920,0,107,,,420,0,,59,492472,2006,,,,,,73233,69860,710,0,,,,,75751,,1157126,8760,1157126,8760,,,,,565705,2716,,0 +"2021-01-22","FL",25405,,277,,70767,70767,6904,461,,,8166392,22189,578113,560932,14075413,,,1597849,1328700,13407,0,71851,,69600,,2085129,,18126056,83831,18126056,83831,650372,,630838,,9764241,35596,16235049,82008 +"2021-01-22","GA",13060,11670,171,1390,47950,47950,5559,270,8136,,,0,,,,,,853173,707750,8374,0,55755,,,,673983,,,0,6122066,49452,431565,,,,,0,6122066,49452 +"2021-01-22","GU",128,,0,,,,10,0,,3,95727,322,,,,,3,7547,7340,19,0,22,270,,,,7293,,0,103274,341,337,8012,,,,0,103067,341 +"2021-01-22","HI",332,332,4,,2014,2014,84,9,,21,,0,,,,,18,25498,24870,169,0,,,,,24497,,931476,5065,931476,5065,,,,,,0,,0 +"2021-01-22","IA",4478,,33,,,,450,0,,89,967921,1797,,84010,2119392,,34,261193,261193,966,0,,52883,12380,49742,282868,273035,,0,1229114,2763,,1055116,96432,209236,1231449,2770,2414589,10730 +"2021-01-22","ID",1654,1452,19,202,6440,6440,286,34,1125,71,456296,1488,,,,,,158200,129063,612,0,,,,,,74269,,0,585359,1918,,78973,,,585359,1918,947759,5487 +"2021-01-22","IL",20534,18615,111,1919,,,3179,0,,661,,0,,,,,348,1093375,,7042,0,,,,,,,,0,15209516,125831,,,,,,0,15209516,125831 +"2021-01-22","IN",9642,9267,49,375,39242,39242,2151,197,6849,496,2274470,8417,,,,,266,605426,,3489,0,,,,,688073,,,0,6652500,52461,,,,,2879896,11906,6652500,52461 +"2021-01-22","KS",3598,,23,,8041,8041,708,111,2181,182,870758,8465,,,,412,66,266653,,3241,0,,,,,,,,0,1137411,11706,,,,,1137411,11706,,0 +"2021-01-22","KY",3337,3069,36,268,15760,15760,1561,68,3413,387,,0,,,,,195,340779,269421,2745,0,7955,27457,,,218497,41562,,0,3484786,23688,105608,284932,,,,0,3484786,23688 +"2021-01-22","LA",8483,7964,41,519,,,1747,0,,,4395697,25125,,,,,216,380255,334769,1937,0,,,,,,320025,,0,4775952,27062,,317521,,,,0,4730466,26921 +"2021-01-22","MA",13987,13702,81,285,17556,17556,2098,0,,426,3973073,16846,,,,,282,491452,467845,5272,0,,,13695,,560724,354388,,0,12754206,105768,,,145958,445881,4440918,21781,12754206,105768 +"2021-01-22","MD",6792,6617,57,175,30697,30697,1768,199,,424,2760718,11091,,161002,,,,336915,336915,2396,0,,,22101,,410142,9469,,0,6630564,51989,,,183103,,3097633,13487,6630564,51989 +"2021-01-22","ME",540,531,4,9,1309,1309,190,15,,61,,0,13500,,,,19,36274,29472,636,0,658,7122,,,33814,12187,,0,1276425,9984,14170,129510,,,,0,1276425,9984 +"2021-01-22","MI",14951,14070,18,881,,,1843,0,,396,,0,,,8438452,,191,594920,546468,2538,0,,,,,689846,442408,,0,9128298,44578,474589,,,,,0,9128298,44578 +"2021-01-22","MN",6032,5805,21,227,23767,23767,558,91,4945,98,2747425,8790,,,,,,452268,433641,1506,0,,,,,,434515,5984932,39150,5984932,39150,,304730,,,3181066,10119,,0 +"2021-01-22","MO",6527,,42,,,,2328,0,,532,1737683,4290,112458,,3512558,,308,445621,445621,1783,0,18124,64685,,,492296,,,0,4013031,19591,130801,556227,119679,246883,2183304,6073,4013031,19591 +"2021-01-22","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,129,129,0,0,,,,,,29,,0,17558,0,,,,,17542,0,26131,0 +"2021-01-22","MS",5713,4241,45,1472,8546,8546,1128,0,,307,1256115,0,,,,,181,261167,167226,2050,0,,,,,,207769,,0,1517282,2050,68780,567025,,,,0,1420596,0 +"2021-01-22","MT",1104,,4,,4081,4081,138,32,,27,,0,,,,,14,91049,,400,0,,,,,,85095,,0,899769,6999,,,,,,0,899769,6999 +"2021-01-22","NC",8464,7756,125,708,,,3512,0,,752,,0,,,,,,705535,634593,7436,0,,,,,,,,0,7888392,69854,,460479,,,,0,7888392,69854 +"2021-01-22","ND",1428,,6,,3736,3736,53,4,546,8,293130,206,11953,,,,,96567,92555,197,0,1442,,,,,93980,1319901,4124,1319901,4124,13395,79723,,,389697,403,1399809,4899 +"2021-01-22","NE",1868,,6,,5647,5647,421,15,,,710145,1865,,,1763365,,,185346,,864,0,,,,,213854,130527,,0,1988904,22737,,,,,895969,2733,1988904,22737 +"2021-01-22","NH",971,,9,,989,989,249,7,319,,534764,2156,,,,,,60951,43845,657,0,,,,,,53773,,0,1187904,8439,37402,114324,35900,,578609,2572,1187904,8439 +"2021-01-22","NJ",20875,18754,115,2121,55355,55355,3328,164,,638,8356555,45878,,,,,445,650389,584291,4200,0,,,,,,,,0,9006944,50078,,,,,,0,8940846,53449 +"2021-01-22","NM",3077,,33,,11412,11412,624,72,,,,0,,,,,,167731,,908,0,,,,,,92109,,0,2214495,15645,,,,,,0,2214495,15645 +"2021-01-22","NV",3958,,48,,,,1549,0,,359,1030124,2800,,,,,256,268212,268212,1869,0,,,,,,,2395142,13359,2395142,13359,,,,,1298336,4669,,0 +"2021-01-22","NY",33763,,169,,89995,89995,8846,0,,1546,,0,,,,,992,1300481,,15144,0,,,,,,,30030951,268001,30030951,268001,,,,,,0,,0 +"2021-01-22","OH",10599,9464,81,1135,44519,44519,3270,204,6485,819,,0,,,,,563,853982,749592,4278,0,,64329,,,776438,720171,,0,8682631,59759,,1161476,,,,0,8682631,59759 +"2021-01-22","OK",3187,,47,,20692,20692,1634,187,,438,2674361,20759,,,2674361,,,365992,,2946,0,10335,,,,343616,330478,,0,3040353,23705,111630,,,,,0,3025993,23128 +"2021-01-22","OR",1843,,11,,7426,7426,365,39,,91,,0,,,2842996,,50,135973,,831,0,,,,,180336,,,0,3023332,20119,,,,,,0,3023332,20119 +"2021-01-22","PA",20321,,193,,,,4169,0,,822,3533761,12925,,,,,507,794172,699171,5338,0,,,,,,627395,8756485,62221,8756485,62221,,,,,4232932,17604,,0 +"2021-01-22","PR",1761,1471,29,290,,,341,0,,56,305972,0,,,395291,,53,89282,82990,554,0,63594,,,,20103,73760,,0,395254,554,,,,,,0,415664,0 +"2021-01-22","RI",2083,,7,,7844,7844,352,57,,43,605703,3266,,,2232104,,31,109735,,949,0,,,,,131027,,2363131,22450,2363131,22450,,,,,715438,4215,,0 +"2021-01-22","SC",6404,5791,31,613,17027,17027,2293,158,,460,3491343,33568,96181,,3388820,,311,409188,369782,4696,0,20188,76177,,,472305,183146,,0,3900531,38264,116369,577022,,,,0,3861125,37201 +"2021-01-22","SD",1684,,11,,6159,6159,177,26,,37,288761,646,,,,,25,106716,95473,316,0,,,,,100883,100942,,0,636973,2151,,,,,395477,962,636973,2151 +"2021-01-22","TN",8777,7292,93,1485,16422,16422,2514,78,,670,,0,,,5437802,,398,701847,598674,4064,0,,112679,,,690503,646144,,0,6128305,27146,,834436,,,,0,6128305,27146 +"2021-01-22","TX",33707,,422,,,,13344,0,,3536,,0,,,,,,2211289,1935747,22646,0,114880,147469,,,2182159,1785578,,0,16321080,118710,890509,1582586,,,,0,16321080,118710 +"2021-01-22","UT",1571,,24,,12884,12884,549,81,2044,192,1399108,3949,,,2197601,698,,333118,,2649,0,,46402,,44503,312953,279908,,0,2510554,12392,,644117,,261010,1687143,5452,2510554,12392 +"2021-01-22","VA",6002,5269,62,733,20544,20544,2972,139,,509,,0,,,,,332,463751,374908,4147,0,20963,91219,,,462102,,4948485,24875,4948485,24875,201866,937337,,,,0,,0 +"2021-01-22","VI",24,,0,,,,,0,,,37728,263,,,,,,2321,,16,0,,,,,,2190,,0,40049,279,,,,,40144,267,,0 +"2021-01-22","VT",169,,1,,,,46,0,,5,282322,1340,,,,,,10759,10497,179,0,,,,,,7177,,0,834067,11179,,,,,292819,1522,834067,11179 +"2021-01-22","WA",4065,,125,,16939,16939,1012,91,,243,,0,,,,,80,296087,283188,2070,0,,,,,,,4325798,28492,4325798,28492,,,,,,0,,0 +"2021-01-22","WI",6135,5643,45,492,23536,23536,785,91,2144,178,2463344,6312,,,,,,577991,530171,2303,0,,,,,,500685,5937589,40284,5937589,40284,,,,,2993515,8382,,0 +"2021-01-22","WV",1856,1589,7,267,,,638,0,,167,,0,,,,,88,113615,91358,998,0,,,,,,86417,,0,1818926,19393,29481,,,,,0,1818926,19393 +"2021-01-22","WY",571,,21,,1251,1251,75,3,,,167371,0,,,530355,,,50583,43151,159,0,,,,,43473,48316,,0,573868,0,,,,,210412,0,573868,0 +"2021-01-21","AK",254,,1,,1177,1177,58,7,,,,0,,,1368174,,7,50941,,209,0,,,,,61170,,,0,1430967,10845,,,,,,0,1430967,10845 +"2021-01-21","AL",6379,5279,96,1100,40277,40277,2478,349,2495,,1715242,5492,,,,1424,,432536,342982,2881,0,,,,,,233211,,0,2058224,7587,,,99018,,2058224,7587,,0 +"2021-01-21","AR",4496,3689,55,807,13055,13055,1160,73,,375,2091292,11085,,,2091292,1379,195,279220,224243,3106,0,,,,64657,,254076,,0,2315535,13041,,,,331152,,0,2315535,13041 +"2021-01-21","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-21","AZ",11772,10543,244,1229,48604,48604,4580,397,,1058,2628346,25262,,,,,731,699942,658954,9398,0,,,,,,,,0,6215572,69803,,,407811,,3287300,32025,6215572,69803 +"2021-01-21","CA",35004,,571,,,,20408,0,,4746,,0,,,,,,3039044,3039044,19673,0,,,,,,,,0,39512756,224393,,,,,,0,39512756,224393 +"2021-01-21","CO",5440,4746,18,694,21041,21041,783,64,,,1962432,7831,283758,,,,,381210,363141,1983,0,40224,,,,,,5140301,41760,5140301,41760,326184,,,,2325573,9599,,0 +"2021-01-21","CT",6774,5511,48,1263,12257,12257,1069,0,,,,0,,,4976108,,,235796,221645,1662,0,,13800,,,274382,,,0,5257608,41416,,216470,,,,0,5257608,41416 +"2021-01-21","DC",864,,1,,,,256,0,,67,,0,,,,,23,34612,,209,0,,,,,,24251,1031692,7161,1031692,7161,,,,,388202,2445,,0 +"2021-01-21","DE",1027,920,1,107,,,448,0,,60,490466,1741,,,,,,72523,69221,748,0,,,,,74937,,1148366,6275,1148366,6275,,,,,562989,2489,,0 +"2021-01-21","FL",25128,,163,,70306,70306,7023,352,,,8144203,37904,578113,560932,14012187,,,1584442,1318943,12602,0,71851,,69600,,2066910,,18042225,131557,18042225,131557,650372,,630838,,9728645,50506,16153041,111467 +"2021-01-21","GA",12889,11511,111,1378,47680,47680,5747,369,8092,,,0,,,,,,844799,701308,8150,0,54947,,,,667088,,,0,6072614,39417,429419,,,,,0,6072614,39417 +"2021-01-21","GU",128,,0,,,,8,0,,3,95405,614,,,,,3,7528,7321,7,0,22,264,,,,7279,,0,102933,621,337,7983,,,,0,102726,621 +"2021-01-21","HI",328,328,3,,2005,2005,100,9,,23,,0,,,,,21,25329,24739,119,0,,,,,24377,,926411,4503,926411,4503,,,,,,0,,0 +"2021-01-21","IA",4445,,51,,,,474,0,,86,966124,2526,,83383,2109809,,36,260227,260227,1362,0,,52478,12076,49373,281824,272004,,0,1226351,3888,,1043078,95501,207629,1228679,3890,2403859,14003 +"2021-01-21","ID",1635,1436,-2,199,6406,6406,286,36,1117,71,454808,1576,,,,,,157588,128633,810,0,,,,,,73517,,0,583441,2142,,78973,,,583441,2142,942272,4873 +"2021-01-21","IL",20423,18520,138,1903,,,3281,0,,662,,0,,,,,358,1086333,,4979,0,,,,,,,,0,15083685,99036,,,,,,0,15083685,99036 +"2021-01-21","IN",9593,9218,64,375,39045,39045,2303,188,6811,519,2266053,8375,,,,,266,601937,,3624,0,,,,,684081,,,0,6600039,54719,,,,,2867990,11999,6600039,54719 +"2021-01-21","KS",3575,,0,,7930,7930,708,0,2141,182,862293,0,,,,413,66,263412,,0,0,,,,,,,,0,1125705,0,,,,,1125705,0,,0 +"2021-01-21","KY",3301,3034,58,267,15692,15692,1604,130,3402,395,,0,,,,,209,338034,267624,3713,0,7911,26487,,,215140,41469,,0,3461098,9898,105445,270001,,,,0,3461098,9898 +"2021-01-21","LA",8442,7928,59,514,,,1800,0,,,4370572,39673,,,,,233,378318,332973,3736,0,,,,,,320025,,0,4748890,43409,,315365,,,,0,4703545,42352 +"2021-01-21","MA",13906,13622,77,284,17556,17556,2152,0,,430,3956227,16064,,,,,287,486180,462910,5140,0,,,13369,,555016,324203,,0,12648438,111726,,,143396,442175,4419137,20885,12648438,111726 +"2021-01-21","MD",6735,6560,46,175,30498,30498,1812,171,,424,2749627,9466,,161002,,,,334519,334519,2166,0,,,22101,,407168,9459,,0,6578575,37523,,,183103,,3084146,11632,6578575,37523 +"2021-01-21","ME",536,527,6,9,1294,1294,182,7,,54,,0,13472,,,,21,35638,28999,675,0,650,7001,,,33460,12128,,0,1266441,16576,14134,127566,,,,0,1266441,16576 +"2021-01-21","MI",14933,14053,163,880,,,1907,0,,385,,0,,,8396146,,199,592382,544311,2513,0,,,,,687574,442408,,0,9083720,55655,472922,,,,,0,9083720,55655 +"2021-01-21","MN",6011,5785,32,226,23676,23676,558,68,4926,98,2738635,7615,,,,,,450762,432312,1270,0,,,,,,433722,5945782,35428,5945782,35428,,301660,,,3170947,8689,,0 +"2021-01-21","MO",6485,,24,,,,2367,0,,509,1733393,4399,111066,,3494929,,284,443838,443838,2049,0,17725,63730,,,490367,,,0,3993440,20651,129010,543507,118300,242612,2177231,6448,3993440,20651 +"2021-01-21","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,129,129,0,0,,,,,,29,,0,17558,0,,,,,17542,0,26131,0 +"2021-01-21","MS",5668,4218,30,1450,8546,8546,1212,0,,306,1256115,0,,,,,192,259117,166398,2290,0,,,,,,207769,,0,1515232,2290,68780,567025,,,,0,1420596,0 +"2021-01-21","MT",1100,,6,,4049,4049,137,27,,26,,0,,,,,12,90649,,394,0,,,,,,84708,,0,892770,4886,,,,,,0,892770,4886 +"2021-01-21","NC",8339,7663,139,676,,,3666,0,,780,,0,,,,,,698099,628562,7187,0,,,,,,,,0,7818538,56443,,449888,,,,0,7818538,56443 +"2021-01-21","ND",1422,,13,,3732,3732,54,9,546,7,292924,280,11953,,,,,96370,92396,148,0,1442,,,,,93801,1315777,4640,1315777,4640,13395,77242,,,389294,428,1394910,5414 +"2021-01-21","NE",1862,,12,,5632,5632,433,42,,,708280,4167,,,1761252,,,184482,,1164,0,,,,,212272,129608,,0,1966167,22156,,,,,893236,6472,1966167,22156 +"2021-01-21","NH",962,,12,,982,982,240,6,318,,532608,2830,,,,,,60294,43429,857,0,,,,,,53128,,0,1179465,9918,37322,111964,35840,,576037,3388,1179465,9918 +"2021-01-21","NJ",20760,18639,96,2121,55191,55191,3395,184,,626,8310677,0,,,,,427,646189,580688,5049,0,,,,,,,,0,8956866,5049,,,,,,0,8887397,0 +"2021-01-21","NM",3044,,35,,11340,11340,644,60,,,,0,,,,,,166823,,988,0,,,,,,91096,,0,2198850,13841,,,,,,0,2198850,13841 +"2021-01-21","NV",3910,,47,,,,1640,0,,371,1027324,5312,,,,,273,266343,266343,1200,0,,,,,,,2381783,19271,2381783,19271,,,,,1293667,6512,,0 +"2021-01-21","NY",33594,,179,,89995,89995,9055,0,,1560,,0,,,,,1011,1285337,,13886,0,,,,,,,29762950,224569,29762950,224569,,,,,,0,,0 +"2021-01-21","OH",10518,9402,109,1116,44315,44315,3406,306,6465,845,,0,,,,,575,849704,746398,7271,0,,62506,,,767184,712864,,0,8622872,46412,,1126259,,,,0,8622872,46412 +"2021-01-21","OK",3140,,55,,20505,20505,1722,210,,449,2653602,0,,,2653602,,,363046,,2686,0,10335,,,,341025,327135,,0,3016648,2686,111630,,,,,0,3002865,0 +"2021-01-21","OR",1832,,24,,7387,7387,387,63,,96,,0,,,2823829,,50,135142,,674,0,,,,,179384,,,0,3003213,15950,,,,,,0,3003213,15950 +"2021-01-21","PA",20128,,260,,,,4758,0,,851,3520836,13744,,,,,530,788834,694492,5664,0,,,,,,615290,8694264,55657,8694264,55657,,,,,4215328,18323,,0 +"2021-01-21","PR",1732,1447,15,285,,,344,0,,60,305972,0,,,395291,,52,88728,82540,215,0,63333,,,,20103,73760,,0,394700,215,,,,,,0,415664,0 +"2021-01-21","RI",2076,,18,,7787,7787,379,67,,51,602437,3115,,,2210799,,36,108786,,910,0,,,,,129882,,2340681,26772,2340681,26772,,,,,711223,4025,,0 +"2021-01-21","SC",6373,5768,45,605,16869,16869,2345,180,,479,3457775,34032,95874,,3356549,,311,404492,366149,4649,0,19962,74566,,,467375,181322,,0,3862267,38681,115836,567614,,,,0,3823924,37730 +"2021-01-21","SD",1673,,6,,6133,6133,185,24,,38,288115,835,,,,,26,106400,95221,337,0,,,,,100674,100638,,0,634822,2210,,,,,394515,1172,634822,2210 +"2021-01-21","TN",8684,7221,128,1463,16344,16344,2673,111,,688,,0,,,5413982,,412,697783,595776,3492,0,,111498,,,687177,639444,,0,6101159,22675,,823566,,,,0,6101159,22675 +"2021-01-21","TX",33285,,441,,,,13564,0,,3609,,0,,,,,,2188643,1917513,22360,0,113423,144841,,,2163363,1763247,,0,16202370,126342,885758,1560260,,,,0,16202370,126342 +"2021-01-21","UT",1547,,30,,12803,12803,590,74,2028,209,1395159,4443,,,2186927,694,,330469,,2089,0,,45275,,43418,311235,276793,,0,2498162,12686,,628565,,253888,1681691,5896,2498162,12686 +"2021-01-21","VA",5940,5211,79,729,20405,20405,3011,174,,545,,0,,,,,337,459604,372216,4013,0,20541,89831,,,458335,,4923610,24529,4923610,24529,200759,924129,,,,0,,0 +"2021-01-21","VI",24,,0,,,,,0,,,37465,167,,,,,,2305,,22,0,,,,,,2166,,0,39770,189,,,,,39877,201,,0 +"2021-01-21","VT",168,,3,,,,50,0,,5,280982,598,,,,,,10580,10315,109,0,,,,,,7083,,0,822888,4412,,,,,291297,704,822888,4412 +"2021-01-21","WA",3940,,0,,16848,16848,977,206,,221,,0,,,,,99,294017,281258,2028,0,,,,,,,4297306,31758,4297306,31758,,,,,,0,,0 +"2021-01-21","WI",6090,5607,55,483,23445,23445,808,82,2140,173,2457032,6510,,,,,,575688,528101,2569,0,,,,,,498368,5897305,35774,5897305,35774,,,,,2985133,8687,,0 +"2021-01-21","WV",1849,1580,13,269,,,638,0,,167,,0,,,,,88,112617,90494,940,0,,,,,,85031,,0,1799533,16696,29265,,,,,0,1799533,16696 +"2021-01-21","WY",550,,0,,1248,1248,84,8,,,167371,512,,,530355,,,50424,43041,300,0,,,,,43473,47964,,0,573868,6418,,,,,210412,765,573868,6418 +"2021-01-20","AK",253,,23,,1170,1170,57,8,,,,0,,,1357771,,9,50732,,160,0,,,,,60791,,,0,1420122,5591,,,,,,0,1420122,5591 +"2021-01-20","AL",6283,5211,157,1072,39928,39928,2522,424,2493,,1709750,7626,,,,1423,,429655,340887,3112,0,,,,,,233211,,0,2050637,9530,,,98329,,2050637,9530,,0 +"2021-01-20","AR",4441,3657,55,784,12982,12982,1179,131,,388,2080207,12410,,,2080207,1374,212,276114,222287,2520,0,,,,63401,,251252,,0,2302494,13900,,,,326158,,0,2302494,13900 +"2021-01-20","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-20","AZ",11528,10341,262,1187,48207,48207,4663,486,,1050,2603084,13211,,,,,778,690544,652191,4845,0,,,,,,,,0,6145769,44229,,,406778,,3255275,17699,6145769,44229 +"2021-01-20","CA",34433,,694,,,,20814,0,,4758,,0,,,,,,3019371,3019371,22403,0,,,,,,,,0,39288363,263820,,,,,,0,39288363,263820 +"2021-01-20","CO",5422,4731,34,691,20977,20977,827,208,,,1954601,5004,282173,,,,,379227,361373,1371,0,39822,,,,,,5098541,40778,5098541,40778,323982,,,,2315974,6201,,0 +"2021-01-20","CT",6726,5470,44,1256,12257,12257,1124,0,,,,0,,,4937069,,,234134,220121,1915,0,,13651,,,272032,,,0,5216192,46305,,213226,,,,0,5216192,46305 +"2021-01-20","DC",863,,2,,,,262,0,,62,,0,,,,,25,34403,,144,0,,,,,,24009,1024531,4269,1024531,4269,,,,,385757,1674,,0 +"2021-01-20","DE",1026,919,5,107,,,456,0,,53,488725,1737,,,,,,71775,68532,464,0,,,,,74311,,1142091,7640,1142091,7640,,,,,560500,2201,,0 +"2021-01-20","FL",24965,,145,,69954,69954,7141,471,,,8106299,26957,578113,560932,13918123,,,1571840,1310118,11825,0,71851,,69600,,2049979,,17910668,89293,17910668,89293,650372,,630838,,9678139,38782,16041574,85876 +"2021-01-20","GA",12778,11411,196,1367,47311,47311,5783,305,8041,,,0,,,,,,836649,695400,8205,0,54174,,,,661138,,,0,6033197,44460,427488,,,,,0,6033197,44460 +"2021-01-20","GU",128,,0,,,,9,0,,3,94791,524,,,,,3,7521,7314,6,0,22,264,,,,7274,,0,102312,530,337,7960,,,,0,102105,529 +"2021-01-20","HI",325,325,1,,1996,1996,102,13,,21,,0,,,,,15,25210,24620,74,0,,,,,24265,,921908,3547,921908,3547,,,,,,0,,0 +"2021-01-20","IA",4394,,62,,,,474,0,,86,963598,1295,,82100,2097416,,36,258865,258865,717,0,,52151,11562,49043,280272,270625,,0,1222463,2012,,1034330,93702,206525,1224789,2019,2389856,8132 +"2021-01-20","ID",1637,1438,30,199,6370,6370,266,63,1114,77,453232,2386,,,,,,156778,128067,1224,0,,,,,,72711,,0,581299,3361,,78973,,,581299,3361,937399,7801 +"2021-01-20","IL",20285,18398,132,1887,,,3284,0,,722,,0,,,,,379,1081354,,4822,0,,,,,,,,0,14984649,86121,,,,,,0,14984649,86121 +"2021-01-20","IN",9529,9154,63,375,38857,38857,2302,162,6799,522,2257678,5482,,,,,275,598313,,2877,0,,,,,679955,,,0,6545320,46558,,,,,2855991,8359,6545320,46558 +"2021-01-20","KS",3575,,50,,7930,7930,708,123,2141,182,862293,8349,,,,413,66,263412,,3590,0,,,,,,,,0,1125705,11939,,,,,1125705,11939,,0 +"2021-01-20","KY",3243,2983,49,260,15562,15562,1678,121,3386,399,,0,,,,,205,334321,265333,3414,0,7862,26103,,,214119,41240,,0,3451200,10578,105270,263060,,,,0,3451200,10578 +"2021-01-20","LA",8383,7881,59,502,,,1858,0,,,4330899,29041,,,,,243,374582,330294,2493,0,,,,,,320025,,0,4705481,31534,,307053,,,,0,4661193,30475 +"2021-01-20","MA",13829,13547,80,282,17556,17556,2209,447,,444,3940163,12926,,,,,299,481040,458089,4514,0,,,13369,,549371,324203,,0,12536712,82567,,,143396,437602,4398252,16913,12536712,82567 +"2021-01-20","MD",6689,6514,39,175,30327,30327,1858,170,,420,2740161,8240,,161002,,,,332353,332353,2167,0,,,22101,,404342,9457,,0,6541052,30896,,,183103,,3072514,10407,6541052,30896 +"2021-01-20","ME",530,521,11,9,1287,1287,198,18,,71,,0,13451,,,,37,34963,28523,701,0,647,6858,,,32968,12102,,0,1249865,9076,14110,125381,,,,0,1249865,9076 +"2021-01-20","MI",14770,13905,35,865,,,2077,0,,396,,0,,,8343227,,214,589869,542146,2421,0,,,,,684838,442408,,0,9028065,40284,470055,,,,,0,9028065,40284 +"2021-01-20","MN",5979,5756,34,223,23608,23608,570,91,4913,111,2731020,4401,,,,,,449492,431238,1224,0,,,,,,432738,5910354,14453,5910354,14453,,295842,,,3162258,5405,,0 +"2021-01-20","MO",6461,,198,,,,2397,0,,538,1728994,3237,110623,,3476604,,287,441789,441789,1592,0,17480,62694,,,488100,,,0,3972789,13702,128322,532197,117792,237668,2170783,4829,3972789,13702 +"2021-01-20","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,129,129,0,0,,,,,,29,,0,17558,0,,,,,17542,0,26131,0 +"2021-01-20","MS",5638,4204,64,1434,8546,8546,1231,0,,301,1256115,0,,,,,180,256827,165545,1702,0,,,,,,207769,,0,1512942,1702,68780,567025,,,,0,1420596,0 +"2021-01-20","MT",1094,,1,,4022,4022,159,30,,25,,0,,,,,13,90255,,391,0,,,,,,84255,,0,887884,4212,,,,,,0,887884,4212 +"2021-01-20","NC",8200,7542,61,658,,,3740,0,,803,,0,,,,,,690912,622857,6415,0,,,,,,,,0,7762095,37882,,438994,,,,0,7762095,37882 +"2021-01-20","ND",1409,,1,,3723,3723,55,4,545,7,292644,210,11953,,,,,96222,92275,151,0,1442,,,,,93658,1311137,3175,1311137,3175,13395,75235,,,388866,361,1389496,3977 +"2021-01-20","NE",1850,,8,,5590,5590,438,0,,,704113,0,,,1732116,,,183318,,900,0,,,,,209752,127221,,0,1944011,0,,,,,886764,0,1944011,0 +"2021-01-20","NH",950,,12,,976,976,254,5,317,,529778,2710,,,,,,59437,42871,728,0,,,,,,52251,,0,1169547,11441,37257,109242,35793,,572649,3164,1169547,11441 +"2021-01-20","NJ",20664,18543,152,2121,55007,55007,3547,205,,635,8310677,81088,,,,,432,641140,576720,5438,0,,,,,,,,0,8951817,86526,,,,,,0,8887397,85502 +"2021-01-20","NM",3009,,34,,11280,11280,605,70,,,,0,,,,,,165835,,881,0,,,,,,89756,,0,2185009,9986,,,,,,0,2185009,9986 +"2021-01-20","NV",3863,,71,,,,1727,0,,408,1022012,2815,,,,,287,265143,265143,1171,0,,,,,,,2362512,12084,2362512,12084,,,,,1287155,3986,,0 +"2021-01-20","NY",33415,,191,,89995,89995,9273,0,,1621,,0,,,,,1044,1271451,,13364,0,,,,,,,29538381,195409,29538381,195409,,,,,,0,,0 +"2021-01-20","OH",10409,9313,73,1096,44009,44009,3566,404,6430,870,,0,,,,,562,842433,740926,6378,0,,62506,,,767184,704045,,0,8576460,22347,,1126259,,,,0,8576460,22347 +"2021-01-20","OK",3085,,48,,20295,20295,1722,200,,449,2653602,11527,,,2653602,,,360360,,1986,0,10335,,,,341025,323240,,0,3013962,13513,111630,,,,,0,3002865,12985 +"2021-01-20","OR",1808,,5,,7324,7324,379,126,,98,,0,,,2808688,,55,134468,,617,0,,,,,178575,,,0,2987263,67697,,,,,,0,2987263,67697 +"2021-01-20","PA",19868,,401,,,,4882,0,,889,3507092,12813,,,,,546,783170,689913,5984,0,,,,,,610872,8638607,53928,8638607,53928,,,,,4197005,17181,,0 +"2021-01-20","PR",1717,1432,14,285,,,331,0,,48,305972,0,,,395291,,52,88513,82378,140,0,63188,,,,20103,73760,,0,394485,140,,,,,,0,415664,0 +"2021-01-20","RI",2058,,13,,7720,7720,379,70,,48,599322,2504,,,2185137,,36,107876,,810,0,,,,,128772,,2313909,15908,2313909,15908,,,,,707198,3314,,0 +"2021-01-20","SC",6328,5729,69,599,16689,16689,2386,178,,471,3423743,45120,95655,,3323571,,307,399843,362451,5525,0,19815,72879,,,462623,179632,,0,3823586,50645,115470,555200,,,,0,3786194,50063 +"2021-01-20","SD",1667,,0,,6109,6109,195,17,,41,287280,741,,,,,28,106063,94967,277,0,,,,,100440,100293,,0,632612,1138,,,,,393343,1018,632612,1138 +"2021-01-20","TN",8556,7134,86,1422,16233,16233,2813,99,,738,,0,,,5394293,,418,694291,593314,4483,0,,109839,,,684191,633428,,0,6078484,21951,,810417,,,,0,6078484,21951 +"2021-01-20","TX",32844,,450,,,,13870,0,,3686,,0,,,,,,2166283,1898549,31255,0,112159,142817,,,2143645,1739136,,0,16076028,140992,881456,1545919,,,,0,16076028,140992 +"2021-01-20","UT",1517,,10,,12729,12729,604,84,2023,210,1390716,4820,,,2175862,687,,328380,,2159,0,,44661,,42831,309614,272113,,0,2485476,12579,,610661,,246991,1675795,6475,2485476,12579 +"2021-01-20","VA",5861,5137,63,724,20231,20231,3098,165,,554,,0,,,,,338,455591,369056,4515,0,20484,89046,,,455305,,4899081,20924,4899081,20924,200591,913437,,,,0,,0 +"2021-01-20","VI",24,,0,,,,,0,,,37298,179,,,,,,2283,,23,0,,,,,,2159,,0,39581,202,,,,,39676,185,,0 +"2021-01-20","VT",165,,2,,,,46,0,,7,280384,50,,,,,,10471,10209,150,0,,,,,,7020,,0,818476,5121,,,,,290593,200,818476,5121 +"2021-01-20","WA",3940,,37,,16642,16642,1012,84,,243,,0,,,,,104,291989,279421,2050,0,,,,,,,4265548,31790,4265548,31790,,,,,,0,,0 +"2021-01-20","WI",6035,5562,62,473,23363,23363,834,119,2138,193,2450522,5123,,,,,,573119,525924,1851,0,,,,,,496297,5861531,28822,5861531,28822,,,,,2976446,6645,,0 +"2021-01-20","WV",1836,1568,21,268,,,655,0,,161,,0,,,,,79,111677,89711,857,0,,,,,,83624,,0,1782837,10302,29182,,,,,0,1782837,10302 +"2021-01-20","WY",550,,0,,1240,1240,81,4,,,166859,376,,,524223,,,50124,42788,202,0,,,,,43188,47693,,0,567450,4413,,,,,209647,526,567450,4413 +"2021-01-19","AK",230,,1,,1162,1162,61,9,,,,0,,,1352390,,9,50572,,125,0,,,,,60601,,,0,1414531,3771,,,,,,0,1414531,3771 +"2021-01-19","AL",6126,5101,5,1025,39504,39504,2724,0,2486,,1702124,5109,,,,1421,,426543,338983,2515,0,,,,,,221961,,0,2041107,6912,,,97744,,2041107,6912,,0 +"2021-01-19","AR",4386,3621,43,765,12851,12851,1265,95,,394,2067797,5542,,,2067797,1368,209,273594,220797,1331,0,,,,62267,,248238,,0,2288594,6383,,,,320761,,0,2288594,6383 +"2021-01-19","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-19","AZ",11266,10128,1,1138,47721,47721,4780,526,,1105,2589873,5987,,,,,797,685699,647703,6417,0,,,,,,,,0,6101540,32341,,,406440,,3237576,12171,6101540,32341 +"2021-01-19","CA",33739,,146,,,,20942,0,,4793,,0,,,,,,2996968,2996968,23794,0,,,,,,,,0,39024543,368787,,,,,,0,39024543,368787 +"2021-01-19","CO",5388,4702,2,686,20769,20769,786,52,,,1949597,6519,279526,,,,,377856,360176,1685,0,38927,,,,,,5057763,25722,5057763,25722,321995,,,,2309773,7989,,0 +"2021-01-19","CT",6682,5433,12,1249,12257,12257,1141,0,,,,0,,,4893232,,,232219,218760,2094,0,,12967,,,269606,,,0,5169887,41758,,204753,,,,0,5169887,41758 +"2021-01-19","DC",861,,4,,,,273,0,,58,,0,,,,,29,34259,,226,0,,,,,,23632,1020262,6310,1020262,6310,,,,,384083,1957,,0 +"2021-01-19","DE",1021,915,5,106,,,454,0,,53,486988,988,,,,,,71311,68095,401,0,,,,,73600,,1134451,7821,1134451,7821,,,,,558299,1389,,0 +"2021-01-19","FL",24820,,163,,69483,69483,7367,318,,,8079342,26994,578113,560932,13847927,,,1560015,1302326,9571,0,71851,,69600,,2034689,,17821375,92379,17821375,92379,650372,,630838,,9639357,36565,15955698,86434 +"2021-01-19","GA",12582,11265,222,1317,47006,47006,5905,265,8004,,,0,,,,,,828444,689676,7492,0,53977,,,,655190,,,0,5988737,31431,426980,,,,,0,5988737,31431 +"2021-01-19","GU",128,,0,,,,8,0,,3,94267,1274,,,,,3,7515,7309,30,0,22,264,,,,7251,,0,101782,1304,337,7924,,,,0,101576,1307 +"2021-01-19","HI",324,324,2,,1983,1983,55,55,,13,,0,,,,,10,25136,24546,64,0,,,,,24196,,918361,3275,918361,3275,,,,,,0,,0 +"2021-01-19","IA",4332,,8,,,,490,0,,85,962303,1309,,80782,2090071,,36,258148,258148,717,0,,51620,11104,48531,279548,268931,,0,1220451,2026,,1022228,91926,204635,1222770,2023,2381724,7548 +"2021-01-19","ID",1607,1415,0,192,6307,6307,345,0,1106,90,450846,0,,,,,,155554,127092,0,0,,,,,,71374,,0,577938,0,,78973,,,577938,0,929598,0 +"2021-01-19","IL",20153,18291,35,1862,,,3335,0,,713,,0,,,,,395,1076532,,4318,0,,,,,,,,0,14898528,71533,,,,,,0,14898528,71533 +"2021-01-19","IN",9466,9092,126,374,38695,38695,2332,151,6764,525,2252196,5400,,,,,263,595436,,2727,0,,,,,676693,,,0,6498762,35976,,,,,2847632,8127,6498762,35976 +"2021-01-19","KS",3525,,0,,7807,7807,599,0,2098,168,853944,0,,,,413,61,259822,,0,0,,,,,,,,0,1113766,0,,,,,1113766,0,,0 +"2021-01-19","KY",3194,2941,27,253,15441,15441,1633,94,3375,442,,0,,,,,208,330907,263094,2239,0,7790,25108,,,212992,41009,,0,3440622,5112,105037,253019,,,,0,3440622,5112 +"2021-01-19","LA",8324,7833,71,491,,,1905,0,,,4301858,23312,,,,,249,372089,328860,2138,0,,,,,,298614,,0,4673947,25450,,300098,,,,0,4630718,25118 +"2021-01-19","MA",13749,13469,44,280,17109,17109,2213,0,,432,3927237,10908,,,,,277,476526,454102,3085,0,,,13369,,544670,324203,,0,12454145,55565,,,143396,432942,4381339,13475,12454145,55565 +"2021-01-19","MD",6650,6476,54,174,30157,30157,1875,315,,411,2731921,7430,,158859,,,,330186,330186,1972,0,,,20915,,401702,9456,,0,6510156,29370,,,179774,,3062107,9402,6510156,29370 +"2021-01-19","ME",519,511,5,8,1269,1269,191,15,,68,,0,13429,,,,27,34262,28034,386,0,642,6694,,,32599,12071,,0,1240789,5773,14083,122932,,,,0,1240789,5773 +"2021-01-19","MI",14735,13865,49,870,,,2055,0,,413,,0,,,8305589,,228,587448,540115,2320,0,,,,,682192,442408,,0,8987781,19436,468615,,,,,0,8987781,19436 +"2021-01-19","MN",5945,5726,6,219,23517,23517,584,89,4895,110,2726619,3887,,,,,,448268,430234,919,0,,,,,,431096,5895901,12684,5895901,12684,,292190,,,3156853,4729,,0 +"2021-01-19","MO",6263,,7,,,,2392,0,,551,1725757,2890,109261,,3464699,,299,440197,440197,1357,0,17195,61608,,,486335,,,0,3959087,11890,126674,521384,116513,232884,2165954,4247,3959087,11890 +"2021-01-19","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,129,129,1,0,,,,,,29,,0,17558,1,,,,,17542,0,26131,0 +"2021-01-19","MS",5574,4182,50,1392,8546,8546,1280,0,,329,1256115,0,,,,,192,255125,164977,1193,0,,,,,,207769,,0,1511240,1193,68780,567025,,,,0,1420596,0 +"2021-01-19","MT",1093,,0,,3992,3992,163,18,,26,,0,,,,,13,89864,,288,0,,,,,,83825,,0,883672,2260,,,,,,0,883672,2260 +"2021-01-19","NC",8139,7495,56,644,,,3881,0,,861,,0,,,,,,684497,618570,9860,0,,,,,,,,0,7724213,31361,,426781,,,,0,7724213,31361 +"2021-01-19","ND",1408,,13,,3719,3719,88,9,539,9,292434,269,11953,,,,,96071,92192,137,0,1442,,,,,93451,1307962,1242,1307962,1242,13395,72918,,,388505,406,1385519,1391 +"2021-01-19","NE",1842,,5,,5590,5590,429,15,,,704113,335,,,1732116,,,182418,,440,0,,,,,209752,127221,,0,1944011,2267,,,,,886764,536,1944011,2267 +"2021-01-19","NH",938,,5,,971,971,254,14,315,,527068,3645,,,,,,58709,42417,845,0,,,,,,51645,,0,1158106,5710,37133,106550,35729,,569485,1917,1158106,5710 +"2021-01-19","NJ",20512,18421,54,2091,54802,54802,3506,236,,643,8229589,168877,,,,,429,635702,572306,4628,0,,,,,,,,0,8865291,173505,,,,,,0,8801895,185884 +"2021-01-19","NM",2975,,17,,11210,11210,643,35,,,,0,,,,,,164954,,691,0,,,,,,88982,,0,2175023,11059,,,,,,0,2175023,11059 +"2021-01-19","NV",3792,,8,,,,1716,0,,404,1019197,1479,,,,,289,263972,263972,1178,0,,,,,,,2350428,11156,2350428,11156,,,,,1283169,2657,,0 +"2021-01-19","NY",33224,,172,,89995,89995,9236,0,,1614,,0,,,,,1049,1258087,,12512,0,,,,,,,29342972,177269,29342972,177269,,,,,,0,,0 +"2021-01-19","OH",10336,9252,55,1084,43605,43605,3643,254,6391,885,,0,,,,,573,836055,736291,4989,0,,61383,,,763957,694905,,0,8554113,38468,,1102487,,,,0,8554113,38468 +"2021-01-19","OK",3037,,43,,20095,20095,1776,32,,474,2642075,41075,,,2642075,,,358374,,1558,0,10335,,,,339128,319201,,0,3000449,42633,111630,,,,,0,2989880,46471 +"2021-01-19","OR",1803,,3,,7198,7198,418,0,,101,,0,,,2744560,,59,133851,,646,0,,,,,175006,,,0,2919566,0,,,,,,0,2919566,0 +"2021-01-19","PA",19467,,77,,,,4593,0,,918,3494279,12563,,,,,564,777186,685545,5341,0,,,,,,598433,8584679,47779,8584679,47779,,,,,4179824,16647,,0 +"2021-01-19","PR",1703,1420,0,283,,,351,0,,46,305972,0,,,395291,,49,88373,82259,434,0,63063,,,,20103,73760,,0,394345,434,,,,,,0,415664,0 +"2021-01-19","RI",2045,,12,,7650,7650,366,218,,50,596818,1196,,,2170139,,37,107066,,361,0,,,,,127862,,2298001,8736,2298001,8736,,,,,703884,1557,,0 +"2021-01-19","SC",6259,5673,11,586,16511,16511,2353,37,,483,3378623,24622,95520,,3279860,,313,394318,357508,2854,0,19742,71839,,,456271,177738,,0,3772941,27476,115262,550200,,,,0,3736131,27235 +"2021-01-19","SD",1667,,0,,6092,6092,200,10,,35,286539,334,,,,,27,105786,94764,127,0,,,,,100294,99887,,0,631474,794,,,,,392325,461,631474,794 +"2021-01-19","TN",8470,7082,40,1388,16134,16134,2775,73,,693,,0,,,5375397,,404,689808,590599,2057,0,,108042,,,681136,624306,,0,6056533,11986,,797881,,,,0,6056533,11986 +"2021-01-19","TX",32394,,310,,,,13928,0,,3619,,0,,,,,,2135028,1872614,9476,0,111308,141632,,,2117321,1711009,,0,15935036,57357,878299,1537217,,,,0,15935036,57357 +"2021-01-19","UT",1507,,7,,12645,12645,638,69,1994,216,1385896,2760,,,2165111,681,,326221,,1302,0,,44139,,42336,307786,269487,,0,2472897,7224,,596393,,242550,1669320,3762,2472897,7224 +"2021-01-19","VA",5798,5084,59,714,20066,20066,3173,84,,588,,0,,,,,347,451076,366159,4526,0,20314,87697,,,452111,,4878157,25428,4878157,25428,199956,899414,,,,0,,0 +"2021-01-19","VI",24,,0,,,,,0,,,37119,0,,,,,,2260,,0,0,,,,,,2120,,0,39379,0,,,,,39491,0,,0 +"2021-01-19","VT",163,,0,,,,43,0,,5,280334,980,,,,,,10321,10059,101,0,,,,,,6925,,0,813355,4197,,,,,290393,1078,813355,4197 +"2021-01-19","WA",3903,,0,,16558,16558,1066,0,,238,,0,,,,,158,289939,277404,0,0,,,,,,,4233758,0,4233758,0,,,,,,0,,0 +"2021-01-19","WI",5973,5512,47,461,23244,23244,865,114,2136,203,2445399,3556,,,,,,571268,524402,1933,0,,,,,,494029,5832709,19302,5832709,19302,,,,,2969801,5081,,0 +"2021-01-19","WV",1815,1552,31,263,,,638,0,,162,,0,,,,,85,110820,89149,1011,0,,,,,,82330,,0,1772535,12860,28754,,,,,0,1772535,12860 +"2021-01-19","WY",550,,28,,1236,1236,88,4,,,166483,1682,,,520004,,,49922,42638,214,0,,,,,42994,47583,,0,563037,13232,,,,,209121,2547,563037,13232 +"2021-01-18","AK",229,,0,,1153,1153,58,0,,,,0,,,1348813,,8,50447,,151,0,,,,,60409,,,0,1410760,6004,,,,,,0,1410760,6004 +"2021-01-18","AL",6121,5099,1,1022,39504,39504,2798,741,2485,,1697015,3580,,,,1420,,424028,337180,1430,0,,,,,,221961,,0,2034195,4707,,,97349,,2034195,4707,,0 +"2021-01-18","AR",4343,3585,32,758,12756,12756,1263,55,,410,2062255,8525,,,2062255,1353,216,272263,219956,1109,0,,,,61713,,245096,,0,2282211,9513,,,,316189,,0,2282211,9513 +"2021-01-18","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-18","AZ",11265,10125,-1,1140,47195,47195,4752,114,,1097,2583886,9529,,,,,797,679282,641519,5400,0,,,,,,,,0,6069199,39679,,,405387,,3225405,14584,6069199,39679 +"2021-01-18","CA",33593,,201,,,,20968,0,,4826,,0,,,,,,2973174,2973174,30699,0,,,,,,,,0,38655756,427141,,,,,,0,38655756,427141 +"2021-01-18","CO",5386,4699,7,687,20717,20717,862,30,,,1943078,4572,278992,,,,,376171,358706,1190,0,38783,,,,,,5032041,24915,5032041,24915,318453,,,,2301784,5684,,0 +"2021-01-18","CT",6670,5355,76,1239,12257,12257,1114,0,,,,0,,,4853775,,,230125,216692,6703,0,,12856,,,267326,,,0,5128129,16759,,201942,,,,0,5128129,16759 +"2021-01-18","DC",857,,7,,,,275,0,,63,,0,,,,,33,34033,,182,0,,,,,,23554,1013952,4560,1013952,4560,,,,,382126,1056,,0 +"2021-01-18","DE",1016,910,0,106,,,434,0,,55,486000,1539,,,,,,70910,67705,616,0,,,,,72747,,1126630,10468,1126630,10468,,,,,556910,2155,,0 +"2021-01-18","FL",24657,,142,,69165,69165,7448,178,,,8052348,22048,578113,560932,13775503,,,1550444,1295924,7877,0,71851,,69600,,2021381,,17728996,74912,17728996,74912,650372,,630838,,9602792,29925,15869264,68542 +"2021-01-18","GA",12360,11095,64,1265,46741,46741,5902,122,7964,,,0,,,,,,820952,684763,4957,0,53759,,,,649691,,,0,5957306,31865,426349,,,,,0,5957306,31865 +"2021-01-18","GU",128,,1,,,,7,0,,3,92993,0,,,,,3,7485,7287,1,0,22,264,,,,7220,,0,100478,1,337,7258,,,,0,100269,0 +"2021-01-18","HI",322,322,0,,1928,1928,108,0,,20,,0,,,,,18,25072,24482,129,0,,,,,24132,,915086,4307,915086,4307,,,,,,0,,0 +"2021-01-18","IA",4324,,1,,,,483,0,,84,960994,1252,,80591,2083330,,38,257431,257431,480,0,,51266,10980,48191,278762,266453,,0,1218425,1732,,1007063,91611,203355,1220747,1736,2374176,4803 +"2021-01-18","ID",1607,1415,2,192,6307,6307,345,12,1106,90,450846,1783,,,,,,155554,127092,278,0,,,,,,71374,,0,577938,1930,,78973,,,577938,1930,929598,3261 +"2021-01-18","IL",20118,18258,68,1860,,,3345,0,,705,,0,,,,,392,1072214,,3385,0,,,,,,,,0,14826995,63002,,,,,,0,14826995,63002 +"2021-01-18","IN",9340,8966,30,374,38544,38544,2386,146,6742,557,2246796,5655,,,,,282,592709,,2498,0,,,,,673631,,,0,6462786,31601,,,,,2839505,8153,6462786,31601 +"2021-01-18","KS",3525,,23,,7807,7807,599,94,2098,168,853944,9713,,,,413,61,259822,,3688,0,,,,,,,,0,1113766,13401,,,,,1113766,13401,,0 +"2021-01-18","KY",3167,2923,40,244,15347,15347,1587,101,3368,397,,0,,,,,208,328668,261527,1993,0,7755,24634,,,212352,40761,,0,3435510,34769,104916,248382,,,,0,3435510,34769 +"2021-01-18","LA",8253,7784,50,469,,,1894,0,,,4278546,9180,,,,,239,369951,327054,971,0,,,,,,298614,,0,4648497,10151,,297680,,,,0,4605600,10133 +"2021-01-18","MA",13705,13424,53,281,17109,17109,2206,0,,427,3916329,10804,,,,,288,473441,451535,3301,0,,,13369,,541576,324203,,0,12398580,49917,,,143396,428059,4367864,14028,12398580,49917 +"2021-01-18","MD",6596,6423,29,173,29842,29842,1850,211,,421,2724491,8027,,158859,,,,328214,328214,1769,0,,,20915,,399284,9455,,0,6480786,25738,,,179774,,3052705,9796,6480786,25738 +"2021-01-18","ME",514,506,3,8,1254,1254,194,10,,63,,0,13361,,,,31,33876,27768,317,0,625,6535,,,32326,12039,,0,1235016,6374,13998,120495,,,,0,1235016,6374 +"2021-01-18","MI",14686,13824,17,862,,,2140,0,,475,,0,,,8287640,,236,585128,538377,3343,0,,,,,680705,442408,,0,8968345,65957,466525,,,,,0,8968345,65957 +"2021-01-18","MN",5939,5721,12,218,23428,23428,612,61,4881,125,2722732,5981,,,,,,447349,429392,969,0,,,,,,429325,5883217,19999,5883217,19999,,290447,,,3152124,6854,,0 +"2021-01-18","MO",6256,,2,,,,2509,0,,585,1722867,3869,109062,,3454314,,312,438840,438840,1291,0,17043,61145,,,484853,,,0,3947197,13741,126323,517503,116227,231402,2161707,5160,3947197,13741 +"2021-01-18","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,128,128,0,0,,,,,,29,,0,17557,0,,,,,17542,0,26131,0 +"2021-01-18","MS",5524,4163,3,1361,8546,8546,1249,121,,336,1256115,33189,,,,,193,253932,164481,1457,0,,,,,,207769,,0,1510047,34646,68780,567025,,,,0,1420596,39404 +"2021-01-18","MT",1093,,1,,3974,3974,169,12,,32,,0,,,,,17,89576,,183,0,,,,,,83527,,0,881412,1684,,,,,,0,881412,1684 +"2021-01-18","NC",8083,7446,0,637,,,3862,0,,863,,0,,,,,,674637,609633,0,0,,,,,,,,0,7692852,55844,,422577,,,,0,7692852,55844 +"2021-01-18","ND",1395,,0,,3710,3710,91,6,539,9,292165,189,11953,,,,,95934,92104,70,0,1442,,,,,93173,1306720,1432,1306720,1432,13395,70554,,,388099,259,1384128,1672 +"2021-01-18","NE",1837,,0,,5575,5575,429,10,,,703778,1816,,,1729927,,,181978,,1068,0,,,,,209674,126504,,0,1941744,33052,,,,,886228,2884,1941744,33052 +"2021-01-18","NH",933,,0,,957,957,237,0,312,,523423,0,,,,,,57864,41351,1000,0,,,,,,50487,,0,1152396,5819,37080,104225,35687,,567568,2794,1152396,5819 +"2021-01-18","NJ",20458,18367,19,2091,54566,54566,3432,79,,632,8060712,0,,,,,426,631074,568573,3853,0,,,,,,,,0,8691786,3853,,,,,,0,8616011,0 +"2021-01-18","NM",2958,,26,,11175,11175,611,69,,,,0,,,,,,164263,,626,0,,,,,,87502,,0,2163964,6446,,,,,,0,2163964,6446 +"2021-01-18","NV",3784,,5,,,,1702,0,,409,1017718,2324,,,,,285,262794,262794,1221,0,,,,,,,2339272,9596,2339272,9596,,,,,1280512,3545,,0 +"2021-01-18","NY",33052,,155,,89995,89995,8868,0,,1523,,0,,,,,997,1245575,,12185,0,,,,,,,29165703,186205,29165703,186205,,,,,,0,,0 +"2021-01-18","OH",10281,9205,81,1076,43351,43351,3765,162,6371,909,,0,,,,,610,831066,732762,4312,0,,60356,,,759828,684072,,0,8515645,37608,,1088568,,,,0,8515645,37608 +"2021-01-18","OK",2994,,7,,20063,20063,1866,27,,499,2601000,0,,,2601000,,,356816,,1837,0,10335,,,,335178,314236,,0,2957816,1837,111630,,,,,0,2943409,0 +"2021-01-18","OR",1800,,1,,7198,7198,418,0,,101,,0,,,2744560,,59,133205,,793,0,,,,,175006,,,0,2919566,0,,,,,,0,2919566,0 +"2021-01-18","PA",19390,,80,,,,4582,0,,950,3481716,10710,,,,,583,771845,681461,4045,0,,,,,,594320,8536900,42055,8536900,42055,,,,,4163177,14397,,0 +"2021-01-18","PR",1703,1420,0,283,,,348,0,,60,305972,0,,,395291,,53,87939,81855,558,0,62379,,,,20103,73760,,0,393911,558,,,,,,0,415664,0 +"2021-01-18","RI",2033,,5,,7432,7432,384,0,,51,595622,1713,,,2161866,,35,106705,,481,0,,,,,127399,,2289265,9479,2289265,9479,,,,,702327,2194,,0 +"2021-01-18","SC",6248,5662,11,586,16474,16474,2342,38,,478,3354001,28277,95312,,3255897,,317,391464,354895,3280,0,19621,71128,,,452999,176129,,0,3745465,31557,114933,545242,,,,0,3708896,31285 +"2021-01-18","SD",1667,,11,,6082,6082,203,19,,37,286205,327,,,,,30,105659,94652,115,0,,,,,100220,99379,,0,630680,1349,,,,,391864,442,630680,1349 +"2021-01-18","TN",8430,7050,39,1380,16061,16061,2810,43,,723,,0,,,5364901,,402,687751,589550,2430,0,,106748,,,679646,614720,,0,6044547,14116,,785040,,,,0,6044547,14116 +"2021-01-18","TX",32084,,46,,,,13858,0,,3619,,0,,,,,,2125552,1864249,11590,0,111158,139552,,,2109723,1697272,,0,15877679,159658,877677,1511420,,,,0,15877679,159658 +"2021-01-18","UT",1500,,7,,12576,12576,619,58,1980,214,1383136,2855,,,2159012,679,,324919,,1082,0,,43808,,42015,306661,266752,,0,2465673,6940,,591764,,241351,1665558,3652,2465673,6940 +"2021-01-18","VA",5739,5042,10,697,19982,19982,3151,69,,584,,0,,,,,354,446550,362732,7245,0,20179,86391,,,448402,,4852729,45333,4852729,45333,199429,882070,,,,0,,0 +"2021-01-18","VI",24,,0,,,,,0,,,37119,0,,,,,,2260,,0,0,,,,,,2120,,0,39379,0,,,,,39491,0,,0 +"2021-01-18","VT",163,,0,,,,44,0,,7,279354,1319,,,,,,10220,9961,163,0,,,,,,6825,,0,809158,4139,,,,,289315,1482,809158,4139 +"2021-01-18","WA",3903,,0,,16558,16558,1066,188,,238,,0,,,,,158,289939,277404,3969,0,,,,,,,4233758,53925,4233758,53925,,,,,,0,,0 +"2021-01-18","WI",5926,5470,20,456,23130,23130,875,54,2127,209,2441843,4049,,,,,,569335,522877,1169,0,,,,,,491962,5813407,15335,5813407,15335,,,,,2964720,5132,,0 +"2021-01-18","WV",1784,1530,8,254,,,643,0,,172,,0,,,,,91,109809,88434,988,0,,,,,,81248,,0,1759675,15659,28616,,,,,0,1759675,15659 +"2021-01-18","WY",522,,0,,1232,1232,85,9,,,164801,0,,,507680,,,49708,42515,345,0,,,,,42087,46908,,0,549805,0,,,,,206574,0,549805,0 +"2021-01-17","AK",229,,0,,1153,1153,70,1,,,,0,,,1343030,,8,50296,,279,0,,,,,60195,,,0,1404756,6107,,,,,,0,1404756,6107 +"2021-01-17","AL",6120,5098,1,1022,38763,38763,2716,0,2484,,1693435,6755,,,,1420,,422598,336053,1917,0,,,,,,221961,,0,2029488,8365,,,97007,,2029488,8365,,0 +"2021-01-17","AR",4311,3562,18,749,12701,12701,1271,15,,423,2053730,10573,,,2053730,1348,221,271154,218968,976,0,,,,61516,,241926,,0,2272698,11493,,,,312662,,0,2272698,11493 +"2021-01-17","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-17","AZ",11266,10124,18,1142,47081,47081,4773,433,,1118,2574357,11175,,,,,800,673882,636464,6981,0,,,,,,,,0,6029520,60494,,,404864,,3210821,17644,6029520,60494 +"2021-01-17","CA",33392,,432,,,,21143,0,,4820,,0,,,,,,2942475,2942475,42229,0,,,,,,,,0,38228615,426360,,,,,,0,38228615,426360 +"2021-01-17","CO",5379,4694,16,685,20687,20687,879,23,,,1938506,6473,278015,,,,,374981,357594,1498,0,38519,,,,,,5007126,33385,5007126,33385,317775,,,,2296100,7898,,0 +"2021-01-17","CT",6594,5355,0,1239,12257,12257,1098,0,,,,0,,,4838433,,,223422,210193,0,0,,12124,,,265917,,,0,5111370,18056,,190080,,,,0,5111370,18056 +"2021-01-17","DC",850,,3,,,,287,0,,64,,0,,,,,36,33851,,314,0,,,,,,23456,1009392,8900,1009392,8900,,,,,381070,1751,,0 +"2021-01-17","DE",1016,910,0,106,,,450,0,,57,484461,2670,,,,,,70294,67097,922,0,,,,,71884,,1116162,8031,1116162,8031,,,,,554755,3592,,0 +"2021-01-17","FL",24515,,135,,68987,68987,7421,207,,,8030300,66648,578113,560932,13718519,,,1542567,1288766,10737,0,71851,,69600,,2010231,,17654084,107367,17654084,107367,650372,,630838,,9572867,77385,15800722,95191 +"2021-01-17","GA",12296,11032,5,1264,46619,46619,5835,104,7957,,,0,,,,,,815995,680378,6332,0,53314,,,,644603,,,0,5925441,37741,425142,,,,,0,5925441,37741 +"2021-01-17","GU",127,,1,,,,7,0,,4,92993,0,,,,,4,7484,7286,3,0,22,264,,,,7220,,0,100477,3,337,7258,,,,0,100269,0 +"2021-01-17","HI",322,322,2,,1928,1928,108,0,,20,,0,,,,,18,24943,24353,130,0,,,,,24006,,910779,5457,910779,5457,,,,,,0,,0 +"2021-01-17","IA",4323,,2,,,,474,0,,93,959742,1416,,80578,2079011,,40,256951,256951,548,0,,50995,10967,47954,278288,265923,,0,1216693,1964,,1004137,91585,202610,1219011,1967,2369373,5318 +"2021-01-17","ID",1605,1414,2,191,6295,6295,345,26,1103,90,449063,1197,,,,,,155276,126945,806,0,,,,,,70736,,0,576008,1720,,78973,,,576008,1720,926337,3130 +"2021-01-17","IL",20050,18208,30,1842,,,3408,0,,720,,0,,,,,387,1068829,,4162,0,,,,,,,,0,14763993,96845,,,,,,0,14763993,96845 +"2021-01-17","IN",9310,8936,23,374,38398,38398,2348,132,6719,527,2241141,8326,,,,,279,590211,,3162,0,,,,,670629,,,0,6431185,44991,,,,,2831352,11488,6431185,44991 +"2021-01-17","KS",3502,,0,,7713,7713,776,0,2068,201,844231,0,,,,413,67,256134,,0,0,,,,,,,,0,1100365,0,,,,,1100365,0,,0 +"2021-01-17","KY",3127,2884,34,243,15246,15246,1631,0,3344,408,,0,,,,,214,326675,259967,2350,0,7676,24415,,,209782,40541,,0,3400741,0,104683,246465,,,,0,3400741,0 +"2021-01-17","LA",8203,7742,123,461,,,1930,0,,,4269366,40791,,,,,237,368980,326101,4127,0,,,,,,298614,,0,4638346,44918,,297348,,,,0,4595467,44327 +"2021-01-17","MA",13652,13372,69,280,17109,17109,2165,0,,433,3905525,15477,,,,,288,470140,448311,4414,0,,,13369,,537842,324203,,0,12348663,89177,,,143396,427115,4353836,19760,12348663,89177 +"2021-01-17","MD",6567,6394,26,173,29631,29631,1823,219,,408,2716464,11257,,158859,,,,326445,326445,2414,0,,,20915,,393883,9454,,0,6455048,46725,,,179774,,3042909,13671,6455048,46725 +"2021-01-17","ME",511,503,4,8,1244,1244,205,2,,66,,0,13361,,,,26,33559,27511,340,0,625,6411,,,32031,11989,,0,1228642,10009,13998,118648,,,,0,1228642,10009 +"2021-01-17","MI",14669,13804,0,865,,,2222,0,,493,,0,,,8225829,,256,581785,535534,0,0,,,,,676559,442408,,0,8902388,0,463812,,,,,0,8902388,0 +"2021-01-17","MN",5927,5710,40,217,23367,23367,612,76,4879,125,2716751,9512,,,,,,446380,428519,1333,0,,,,,,427468,5863218,27111,5863218,27111,,289418,,,3145270,10713,,0 +"2021-01-17","MO",6254,,1,,,,2522,0,,593,1718998,3275,107580,,3442020,,319,437549,437549,1350,0,16859,60555,,,483427,,,0,3933456,12711,124657,513057,114791,228851,2156547,4625,3933456,12711 +"2021-01-17","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,128,128,0,0,,,,,,29,,0,17557,0,,,,,17542,0,26131,0 +"2021-01-17","MS",5521,4162,40,1359,8425,8425,1336,0,,333,1222926,0,,,,,207,252475,163816,1606,0,,,,,,198888,,0,1475401,1606,66266,522512,,,,0,1381192,0 +"2021-01-17","MT",1092,,4,,3962,3962,172,5,,32,,0,,,,,17,89393,,337,0,,,,,,83154,,0,879728,4785,,,,,,0,879728,4785 +"2021-01-17","NC",8083,7446,67,637,,,3862,0,,863,,0,,,,,,674637,609633,6811,0,,,,,,,,0,7637008,69833,,422577,,,,0,7637008,69833 +"2021-01-17","ND",1395,,0,,3704,3704,85,0,539,9,291976,395,11953,,,,,95864,92058,150,0,1442,,,,,93020,1305288,3861,1305288,3861,13395,70054,,,387840,545,1382456,4413 +"2021-01-17","NE",1837,,0,,5565,5565,457,0,,,701962,0,,,1699670,,,180910,,0,0,,,,,206887,124963,,0,1908692,0,,,,,883344,0,1908692,0 +"2021-01-17","NH",933,,6,,957,957,243,2,312,,523423,3041,,,,,,56864,41351,919,0,,,,,,49544,,0,1146577,8028,37023,103374,35642,,564774,3693,1146577,8028 +"2021-01-17","NJ",20439,18348,25,2091,54487,54487,3677,92,,651,8060712,0,,,,,427,627221,565097,5132,0,,,,,,,,0,8687933,5132,,,,,,0,8616011,0 +"2021-01-17","NM",2932,,22,,11106,11106,612,31,,,,0,,,,,,163637,,744,0,,,,,,86110,,0,2157518,16913,,,,,,0,2157518,16913 +"2021-01-17","NV",3779,,18,,,,1702,0,,409,1015394,2812,,,,,285,261573,261573,1483,0,,,,,,,2329676,11816,2329676,11816,,,,,1276967,4295,,0 +"2021-01-17","NY",32897,,172,,89995,89995,8771,0,,1550,,0,,,,,1004,1233390,,13842,0,,,,,,,28979498,246507,28979498,246507,,,,,,0,,0 +"2021-01-17","OH",10200,9132,65,1068,43189,43189,3686,141,6355,946,,0,,,,,622,826754,729578,5247,0,,60151,,,756262,678264,,0,8478037,46797,,1085314,,,,0,8478037,46797 +"2021-01-17","OK",2987,,35,,20036,20036,1866,230,,499,2601000,0,,,2601000,,,354979,,3314,0,10335,,,,335178,311883,,0,2955979,3314,111630,,,,,0,2943409,0 +"2021-01-17","OR",1799,,41,,7198,7198,418,0,,101,,0,,,2744560,,59,132412,,1154,0,,,,,175006,,,0,2919566,0,,,,,,0,2919566,0 +"2021-01-17","PA",19310,,122,,,,4614,0,,945,3471006,15775,,,,,589,767800,677774,6023,0,,,,,,578950,8494845,60944,8494845,60944,,,,,4148780,21110,,0 +"2021-01-17","PR",1703,1420,0,283,,,363,0,,53,305972,0,,,395291,,53,87381,81394,858,0,61972,,,,20103,73760,,0,393353,858,,,,,,0,415664,0 +"2021-01-17","RI",2028,,9,,7432,7432,384,0,,51,593909,2846,,,2152984,,35,106224,,752,0,,,,,126802,,2279786,17237,2279786,17237,,,,,700133,3598,,0 +"2021-01-17","SC",6237,5654,129,583,16436,16436,2375,148,,495,3325724,44834,94963,,3228308,,316,388184,351887,5762,0,19395,70139,,,449303,174706,,0,3713908,50596,114358,540106,,,,0,3677611,49841 +"2021-01-17","SD",1656,,23,,6063,6063,213,24,,45,285878,636,,,,,39,105544,94557,266,0,,,,,100086,99226,,0,629331,1896,,,,,391422,902,629331,1896 +"2021-01-17","TN",8391,7020,36,1371,16018,16018,2856,65,,740,,0,,,5352914,,411,685321,587694,4474,0,,106105,,,677517,610796,,0,6030431,29740,,782409,,,,0,6030431,29740 +"2021-01-17","TX",32038,,207,,,,13728,0,,3605,,0,,,,,,2113962,1853521,16402,0,109520,138579,,,2082241,1677588,,0,15718021,133767,872211,1504491,,,,0,15718021,133767 +"2021-01-17","UT",1493,,8,,12518,12518,594,66,1980,226,1380281,3836,,,2152989,679,,323837,,1585,0,,43529,,41752,305744,265051,,0,2458733,9859,,589651,,240354,1661906,5143,2458733,9859 +"2021-01-17","VA",5729,5037,23,692,19913,19913,3058,67,,566,,0,,,,,339,439305,357345,9914,0,19910,84857,,,442196,,4807396,42583,4807396,42583,198429,872919,,,,0,,0 +"2021-01-17","VI",24,,0,,,,,0,,,37119,1360,,,,,,2260,,94,0,,,,,,2120,,0,39379,1454,,,,,39491,1472,,0 +"2021-01-17","VT",163,,0,,,,45,0,,7,278035,1694,,,,,,10057,9798,142,0,,,,,,6719,,0,805019,8115,,,,,287833,1833,805019,8115 +"2021-01-17","WA",3903,,0,,16370,16370,1066,0,,238,,0,,,,,105,285970,273703,0,0,,,,,,,4179833,0,4179833,0,,,,,,0,,0 +"2021-01-17","WI",5906,5451,1,455,23076,23076,953,50,2124,227,2437794,5068,,,,,,568166,521794,1891,0,,,,,,490043,5798072,25805,5798072,25805,,,,,2959588,6674,,0 +"2021-01-17","WV",1776,1524,15,252,,,648,0,,178,,0,,,,,89,108821,87545,697,0,,,,,,80187,,0,1744016,7380,28544,,,,,0,1744016,7380 +"2021-01-17","WY",522,,0,,1223,1223,84,8,,,164801,0,,,507680,,,49363,42173,295,0,,,,,42087,46820,,0,549805,0,,,,,206574,0,549805,0 +"2021-01-16","AK",229,,0,,1152,1152,67,0,,,,0,,,1337142,,9,50017,,182,0,,,,,59982,,,0,1398649,9423,,,,,,0,1398649,9423 +"2021-01-16","AL",6119,5098,89,1021,38763,38763,2772,0,2483,,1686680,6552,,,,1419,,420681,334443,3153,0,,,,,,221961,,0,2021123,8910,,,96429,,2021123,8910,,0 +"2021-01-16","AR",4293,3550,30,743,12686,12686,1292,88,,421,2043157,10884,,,2043157,1348,214,270178,218048,2543,0,,,,61405,,240051,,0,2261205,12593,,,,311571,,0,2261205,12593 +"2021-01-16","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-16","AZ",11248,10115,208,1133,46648,46648,4849,983,,1144,2563182,11054,,,,,821,666901,629995,8715,0,,,,,,,,0,5969026,56755,,,403762,,3193177,19272,5969026,56755 +"2021-01-16","CA",32960,,669,,,,21579,0,,4846,,0,,,,,,2900246,2900246,40622,0,,,,,,,,0,37802255,352719,,,,,,0,37802255,352719 +"2021-01-16","CO",5363,4679,20,684,20664,20664,911,37,,,1932033,6809,276206,,,,,373483,356169,2025,0,38074,,,,,,4973741,36638,4973741,36638,316534,,,,2288202,8588,,0 +"2021-01-16","CT",6594,5355,0,1239,12257,12257,1098,0,,,,0,,,4821960,,,223422,210193,0,0,,12124,,,264343,,,0,5093314,33017,,190080,,,,0,5093314,33017 +"2021-01-16","DC",847,,5,,,,280,0,,67,,0,,,,,29,33537,,397,0,,,,,,23319,1000492,13697,1000492,13697,,,,,379319,2461,,0 +"2021-01-16","DE",1016,910,14,106,,,441,0,,54,481791,1525,,,,,,69372,66226,645,0,,,,,71272,,1108131,6641,1108131,6641,,,,,551163,2170,,0 +"2021-01-16","FL",24380,,211,,68780,68780,7347,336,,,7963652,36230,578113,560932,13638884,,,1531830,1281127,11886,0,71851,,69600,,1995165,,17546717,122159,17546717,122159,650372,,630838,,9495482,48116,15705531,101755 +"2021-01-16","GA",12291,11029,153,1262,46515,46515,5910,307,7954,,,0,,,,,,809663,674994,8533,0,52635,,,,638495,,,0,5887700,43679,423166,,,,,0,5887700,43679 +"2021-01-16","GU",126,,1,,,,8,0,,5,92993,0,,,,,4,7481,7283,7,0,19,253,,,,7220,,0,100474,7,337,7258,,,,0,100269,0 +"2021-01-16","HI",320,320,2,,1928,1928,108,0,,20,,0,,,,,18,24813,24223,229,0,,,,,23854,,905322,10634,905322,10634,,,,,,0,,0 +"2021-01-16","IA",4321,,64,,,,505,0,,91,958326,1693,,80548,2074377,,39,256403,256403,915,0,,50909,10946,47868,277635,265320,,0,1214729,2608,,1002439,91534,202381,1217044,2612,2364055,8850 +"2021-01-16","ID",1603,1412,12,191,6269,6269,345,44,1098,90,447866,1804,,,,,,154470,126422,1112,0,,,,,,70163,,0,574288,2475,,78973,,,574288,2475,923207,5306 +"2021-01-16","IL",20020,18179,147,1841,,,3406,0,,711,,0,,,,,379,1064667,,5343,0,,,,,,,,0,14667148,102372,,,,,,0,14667148,102372 +"2021-01-16","IN",9287,8913,41,374,38266,38266,2404,210,6685,525,2232815,9232,,,,,269,587049,,3889,0,,,,,666864,,,0,6386194,58171,,,,,2819864,13121,6386194,58171 +"2021-01-16","KS",3502,,0,,7713,7713,776,0,2068,201,844231,0,,,,413,67,256134,,0,0,,,,,,,,0,1100365,0,,,,,1100365,0,,0 +"2021-01-16","KY",3093,2858,32,235,15246,15246,1631,144,3344,408,,0,,,,,214,324325,257994,3055,0,7676,24415,,,209782,40541,,0,3400741,8631,104683,246465,,,,0,3400741,8631 +"2021-01-16","LA",8080,7631,0,449,,,2001,0,,,4228575,0,,,,,242,364853,322565,0,0,,,,,,298614,,0,4593428,0,,292095,,,,0,4551140,0 +"2021-01-16","MA",13583,13305,74,278,17109,17109,2197,0,,433,3890048,19397,,,,,294,465726,444028,5799,0,,,13369,,532622,324203,,0,12259486,112120,,,143396,425322,4334076,25054,12259486,112120 +"2021-01-16","MD",6541,6369,47,172,29412,29412,1821,127,,412,2705207,13534,,158859,,,,324031,324031,3292,0,,,20915,,393883,9451,,0,6408323,55848,,,179774,,3029238,16826,6408323,55848 +"2021-01-16","ME",507,499,30,8,1242,1242,194,14,,59,,0,13361,,,,22,33219,27249,438,0,625,6275,,,31606,11952,,0,1218633,9566,13998,116593,,,,0,1218633,9566 +"2021-01-16","MI",14669,13804,119,865,,,2222,0,,493,,0,,,8225829,,256,581785,535534,2211,0,,,,,676559,442408,,0,8902388,51259,463812,,,,,0,8902388,51259 +"2021-01-16","MN",5887,5673,37,214,23291,23291,612,106,4868,125,2707239,8321,,,,,,445047,427318,1485,0,,,,,,425253,5836107,27757,5836107,27757,,284894,,,3134557,9654,,0 +"2021-01-16","MO",6253,,24,,,,2597,0,,576,1715723,4613,107080,,3430814,,321,436199,436199,2011,0,16625,58343,,,481959,,,0,3920745,17629,123923,498569,114221,219122,2151922,6624,3920745,17629 +"2021-01-16","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,128,128,0,0,,,,,,29,,0,17557,0,,,,,17542,0,26131,0 +"2021-01-16","MS",5481,4147,70,1334,8425,8425,1336,0,,333,1222926,0,,,,,207,250869,162949,2680,0,,,,,,198888,,0,1473795,2680,66266,522512,,,,0,1381192,0 +"2021-01-16","MT",1088,,2,,3957,3957,190,17,,32,,0,,,,,17,89056,,421,0,,,,,,82920,,0,874943,5379,,,,,,0,874943,5379 +"2021-01-16","NC",8016,7384,83,632,,,3895,0,,880,,0,,,,,,667826,603682,7986,0,,,,,,,,0,7567175,71081,,417786,,,,0,7567175,71081 +"2021-01-16","ND",1395,,0,,3704,3704,95,5,539,10,291581,361,11953,,,,,95714,91924,115,0,1442,,,,,92820,1301427,2686,1301427,2686,13395,69703,,,387295,476,1378043,3098 +"2021-01-16","NE",1837,,19,,5565,5565,457,26,,,701962,1455,,,1699670,,,180910,,779,0,,,,,206887,124963,,0,1908692,14078,,,,,883344,2266,1908692,14078 +"2021-01-16","NH",927,,19,,955,955,252,2,311,,520382,2196,,,,,,55945,40699,445,0,,,,,,48937,,0,1138549,7744,36947,101736,35589,,561081,2504,1138549,7744 +"2021-01-16","NJ",20414,18323,94,2091,54395,54395,3677,215,,651,8060712,0,,,,,427,622089,560423,5999,0,,,,,,,,0,8682801,5999,,,,,,0,8616011,0 +"2021-01-16","NM",2910,,36,,11075,11075,632,70,,,,0,,,,,,162893,,1088,0,,,,,,84803,,0,2140605,13111,,,,,,0,2140605,13111 +"2021-01-16","NV",3761,,63,,,,1702,0,,409,1012582,3232,,,,,285,260090,260090,2040,0,,,,,,,2317860,13733,2317860,13733,,,,,1272672,5272,,0 +"2021-01-16","NY",32725,,159,,89995,89995,8888,0,,1580,,0,,,,,983,1219548,,15998,0,,,,,,,28732991,277286,28732991,277286,,,,,,0,,0 +"2021-01-16","OH",10135,9080,78,1055,43048,43048,3742,241,6345,934,,0,,,,,627,821507,725111,7065,0,,59487,,,751588,672231,,0,8431240,62719,,1073706,,,,0,8431240,62719 +"2021-01-16","OK",2952,,27,,19806,19806,1866,190,,499,2601000,11592,,,2601000,,,351665,,3621,0,10335,,,,335178,309057,,0,2952665,15213,111630,,,,,0,2943409,14996 +"2021-01-16","OR",1758,,21,,7198,7198,418,25,,101,,0,,,2744560,,59,131258,,1012,0,,,,,175006,,,0,2919566,23886,,,,,,0,2919566,23886 +"2021-01-16","PA",19188,,231,,,,4743,0,,962,3455231,14737,,,,,594,761777,672439,7166,0,,,,,,578950,8433901,65053,8433901,65053,,,,,4127670,20655,,0 +"2021-01-16","PR",1703,1419,11,284,,,377,0,,53,305972,0,,,395291,,57,86523,80590,569,0,61432,,,,20103,73760,,0,392495,569,,,,,,0,415664,0 +"2021-01-16","RI",2019,,14,,7432,7432,384,0,,51,591063,2354,,,2136636,,35,105472,,1029,0,,,,,125913,,2262549,20254,2262549,20254,,,,,696535,3383,,0 +"2021-01-16","SC",6108,5577,71,531,16288,16288,2387,153,,474,3280890,47105,94100,,3184709,,291,382422,346880,6455,0,18984,69003,,,443061,173075,,0,3663312,53560,113084,531943,,,,0,3627770,52388 +"2021-01-16","SD",1633,,4,,6039,6039,209,16,,44,285242,671,,,,,33,105278,94366,341,0,,,,,99904,98808,,0,627435,2324,,,,,390520,1012,627435,2324 +"2021-01-16","TN",8355,6987,44,1368,15953,15953,2972,80,,722,,0,,,5327070,,388,680847,584387,4808,0,,104924,,,673621,605596,,0,6000691,28318,,777061,,,,0,6000691,28318 +"2021-01-16","TX",31831,,381,,,,13929,0,,3656,,0,,,,,,2097560,1837552,24657,0,107306,134233,,,2060159,1666745,,0,15584254,140355,862717,1459365,,,,0,15584254,140355 +"2021-01-16","UT",1485,,13,,12452,12452,627,101,1979,231,1376445,4289,,,2144626,678,,322252,,2150,0,,43229,,41470,304248,264246,,0,2448874,12569,,584783,,238298,1656763,5909,2448874,12569 +"2021-01-16","VA",5706,5016,50,690,19846,19846,3119,105,,561,,0,,,,,354,429391,351970,6757,0,19647,80504,,,437141,,4764813,34133,4764813,34133,197591,852859,,,,0,,0 +"2021-01-16","VI",24,,0,,,,,0,,,35759,0,,,,,,2166,,0,0,,,,,,2008,,0,37925,0,,,,,38019,0,,0 +"2021-01-16","VT",163,,0,,,,46,0,,5,276341,1607,,,,,,9915,9659,181,0,,,,,,6633,,0,796904,8145,,,,,286000,1785,796904,8145 +"2021-01-16","WA",3903,,27,,16370,16370,1066,290,,238,,0,,,,,105,285970,273703,2193,0,,,,,,,4179833,26619,4179833,26619,,,,,,0,,0 +"2021-01-16","WI",5905,5450,135,455,23026,23026,953,103,2123,227,2432726,5095,,,,,,566275,520188,2409,0,,,,,,487754,5772267,26697,5772267,26697,,,,,2952914,7032,,0 +"2021-01-16","WV",1761,1512,28,249,,,718,0,,190,,0,,,,,95,108124,86951,1475,0,,,,,,79109,,0,1736636,26725,28414,,,,,0,1736636,26725 +"2021-01-16","WY",522,,0,,1215,1215,86,4,,,164801,0,,,507680,,,49068,41917,159,0,,,,,42087,46734,,0,549805,0,,,,,206574,0,549805,0 +"2021-01-15","AK",229,,1,,1152,1152,77,3,,,,0,,,1328089,,10,49835,,300,0,,,,,59624,,,0,1389226,6950,,,,,,0,1389226,6950 +"2021-01-15","AL",6030,5038,85,992,38763,38763,2863,313,2476,,1680128,10166,,,,1415,,417528,332085,2945,0,,,,,,221961,,0,2012213,12520,,,95644,,2012213,12520,,0 +"2021-01-15","AR",4263,3525,35,738,12598,12598,1314,95,,434,2032273,12628,,,2032273,1340,226,267635,216339,3124,0,,,,60426,,237729,,0,2248612,14768,,,,307478,,0,2248612,14768 +"2021-01-15","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-15","AZ",11040,9931,185,1109,45665,45665,4866,405,,1138,2552128,12383,,,,,753,658186,621777,9146,0,,,,,,,,0,5912271,58182,,,402939,,3173905,20858,5912271,58182 +"2021-01-15","CA",32291,,637,,,,21856,0,,4833,,0,,,,,,2859624,2859624,42655,0,,,,,,,,0,37449536,319170,,,,,,0,37449536,319170 +"2021-01-15","CO",5343,4659,27,684,20627,20627,891,101,,,1925224,6770,273944,,,,,371458,354390,2281,0,37552,,,,,,4937103,41266,4937103,41266,314280,,,,2279614,8852,,0 +"2021-01-15","CT",6594,5355,41,1239,12257,12257,1098,0,,,,0,,,4791447,,,223422,210193,1878,0,,12124,,,261875,,,0,5060297,36233,,190080,,,,0,5060297,36233 +"2021-01-15","DC",842,,0,,,,285,0,,71,,0,,,,,30,33140,,320,0,,,,,,23131,986795,7962,986795,7962,,,,,376858,1621,,0 +"2021-01-15","DE",1002,897,7,105,,,451,0,,56,480266,1932,,,,,,68727,65649,662,0,,,,,70699,,1101490,11518,1101490,11518,,,,,548993,2594,,0 +"2021-01-15","FL",24169,,188,,68444,68444,7528,433,,,7927422,39799,578113,560932,13554101,,,1519944,1271326,16415,0,71851,,69600,,1978821,,17424558,141762,17424558,141762,650372,,630838,,9447366,56214,15603776,127003 +"2021-01-15","GA",12138,10878,163,1260,46208,46208,5967,315,7919,,,0,,,,,,801130,668068,9806,0,51947,,,,631627,,,0,5844021,43014,421324,,,,,0,5844021,43014 +"2021-01-15","GU",125,,1,,,,6,0,,4,92993,227,,,,,3,7474,7276,17,0,19,253,,,,7220,,0,100467,244,337,7258,,,,0,100269,240 +"2021-01-15","HI",318,318,0,,1928,1928,108,8,,20,,0,,,,,18,24584,24058,150,0,,,,,23695,,894688,5812,894688,5812,,,,,,0,,0 +"2021-01-15","IA",4257,,6,,,,513,0,,91,956633,2208,,80389,2066591,,35,255488,255488,1035,0,,50653,10797,47623,276641,263844,,0,1212121,3243,,993311,91226,201353,1214432,3250,2355205,12127 +"2021-01-15","ID",1591,1401,27,190,6225,6225,338,47,1091,88,446062,1899,,,,,,153358,125751,994,0,,,,,,69460,,0,571813,2614,,78973,,,571813,2614,917901,8179 +"2021-01-15","IL",19873,18049,149,1824,,,3446,0,,712,,0,,,,,386,1059324,,6642,0,,,,,,,,0,14564776,107156,,,,,,0,14564776,107156 +"2021-01-15","IN",9246,8872,44,374,38056,38056,2432,188,6641,551,2223583,9786,,,,,285,583160,,4666,0,,,,,662323,,,0,6328023,56420,,,,,2806743,14452,6328023,56420 +"2021-01-15","KS",3502,,147,,7713,7713,776,173,2068,201,844231,12340,,,,413,67,256134,,4093,0,,,,,,,,0,1100365,16433,,,,,1100365,16433,,0 +"2021-01-15","KY",3061,2829,19,232,15102,15102,1644,80,3320,392,,0,,,,,203,321270,255670,3925,0,7617,23884,,,208553,40100,,0,3392110,13548,104448,239362,,,,0,3392110,13548 +"2021-01-15","LA",8080,7631,0,449,,,2001,0,,,4228575,25774,,,,,242,364853,322565,3705,0,,,,,,298614,,0,4593428,29479,,292095,,,,0,4551140,27877 +"2021-01-15","MA",13509,13231,76,278,17109,17109,2201,0,,451,3870651,16536,,,,,293,459927,438371,5525,0,,,13369,,526114,324203,,0,12147366,100968,,,143396,421870,4309022,21610,12147366,100968 +"2021-01-15","MD",6494,6322,45,172,29285,29285,1848,162,,421,2691673,12328,,158859,,,,320739,320739,2924,0,,,20915,,389956,9444,,0,6352475,54297,,,179774,,3012412,15252,6352475,54297 +"2021-01-15","ME",477,470,16,7,1228,1228,193,11,,61,,0,13361,,,,24,32781,26923,823,0,625,6132,,,31146,11876,,0,1209067,14194,13998,114394,,,,0,1209067,14194 +"2021-01-15","MI",14550,13701,39,849,,,2222,0,,493,,0,,,8177683,,256,579574,533602,3001,0,,,,,673446,415079,,0,8851129,42191,461932,,,,,0,8851129,42191 +"2021-01-15","MN",5850,5637,33,213,23185,23185,612,72,4850,125,2698918,10618,,,,,,443562,425985,1627,0,,,,,,422289,5808350,41027,5808350,41027,,281764,,,3124903,12019,,0 +"2021-01-15","MO",6229,,28,,,,2611,0,,592,1711110,4543,106618,,3415431,,334,434188,434188,2231,0,16367,57599,,,479752,,,0,3903116,21019,123203,489920,113657,216208,2145298,6774,3903116,21019 +"2021-01-15","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,128,128,0,0,,,,,,29,,0,17557,0,,,,,17542,0,26131,0 +"2021-01-15","MS",5411,4113,55,1248,8425,8425,1407,0,,340,1222926,0,,,,,212,248189,161797,2342,0,,,,,,198888,,0,1471115,2342,66266,522512,,,,0,1381192,0 +"2021-01-15","MT",1086,,9,,3940,3940,188,23,,34,,0,,,,,17,88635,,525,0,,,,,,82460,,0,869564,7137,,,,,,0,869564,7137 +"2021-01-15","NC",7933,7323,108,610,,,3916,0,,861,,0,,,,,,659840,596770,8914,0,,,,,,,,0,7496094,69928,,408021,,,,0,7496094,69928 +"2021-01-15","ND",1395,,23,,3699,3699,88,10,539,10,291220,467,11953,,,,,95599,91837,221,0,1442,,,,,92551,1298741,4640,1298741,4640,13395,67850,,,386819,688,1374945,5442 +"2021-01-15","NE",1818,,15,,5539,5539,465,19,,,700507,899,,,1686804,,,180131,,932,0,,,,,205736,124233,,0,1894614,7460,,,,,881078,1836,1894614,7460 +"2021-01-15","NH",908,,11,,953,953,255,9,310,,518186,3363,,,,,,55500,40391,722,0,,,,,,48018,,0,1130805,8568,36863,98779,35519,,558577,3888,1130805,8568 +"2021-01-15","NJ",20320,18229,67,2091,54180,54180,3543,176,,626,8060712,136196,,,,,438,616090,555299,6369,0,,,,,,,,0,8676802,142565,,,,,,0,8616011,141655 +"2021-01-15","NM",2874,,38,,11005,11005,670,58,,,,0,,,,,,161805,,1262,0,,,,,,84015,,0,2127494,-13068,,,,,,0,2127494,-13068 +"2021-01-15","NV",3698,,40,,,,1676,0,,418,1009350,3931,,,,,287,258050,258050,1878,0,,,,,,,2304127,14971,2304127,14971,,,,,1267400,5809,,0 +"2021-01-15","NY",32566,,187,,89995,89995,8808,0,,1570,,0,,,,,962,1203550,,19942,0,,,,,,,28455705,324671,28455705,324671,,,,,,0,,0 +"2021-01-15","OH",10057,9030,67,1027,42807,42807,3793,316,6328,945,,0,,,,,646,814442,719642,7149,0,,58673,,,745149,669448,,0,8368521,63540,,1050019,,,,0,8368521,63540 +"2021-01-15","OK",2925,,43,,19616,19616,1847,156,,470,2589408,25547,,,2589408,,,348044,,3538,0,9516,,,,331450,306874,,0,2937452,29085,109422,,,,,0,2928413,29952 +"2021-01-15","OR",1737,,29,,7173,7173,444,50,,108,,0,,,2721652,,58,130246,,1137,0,,,,,174028,,,0,2895680,21108,,,,,,0,2895680,21108 +"2021-01-15","PA",18957,,215,,,,4848,0,,1010,3440494,12519,,,,,604,754611,666521,6047,0,,,,,,573504,8368848,61226,8368848,61226,,,,,4107015,17340,,0 +"2021-01-15","PR",1692,1410,13,282,,,382,0,,50,305972,0,,,395291,,60,85954,80111,1138,0,61016,,,,20103,73760,,0,391926,1138,,,,,,0,415664,0 +"2021-01-15","RI",2005,,9,,7432,7432,384,66,,51,588709,3519,,,2117548,,35,104443,,1057,0,,,,,124747,,2242295,22490,2242295,22490,,,,,693152,4576,,0 +"2021-01-15","SC",6037,5513,103,524,16135,16135,2424,195,,473,3233785,28845,93597,,3138359,,289,375967,341597,4787,0,18678,67442,,,437023,171539,,0,3609752,33632,112275,521315,,,,0,3575382,32597 +"2021-01-15","SD",1629,,15,,6023,6023,227,25,,53,284571,911,,,,,40,104937,94113,425,0,,,,,99600,98576,,0,625111,2513,,,,,389508,1336,625111,2513 +"2021-01-15","TN",8311,6970,79,1341,15873,15873,3034,120,,755,,0,,,5302944,,402,676039,580743,5557,0,,103634,,,669429,602938,,0,5972373,32918,,767817,,,,0,5972373,32918 +"2021-01-15","TX",31450,,400,,,,13953,0,,3663,,0,,,,,,2072903,1816535,27204,0,106216,132681,,,2037868,1649735,,0,15443899,139440,858535,1443336,,,,0,15443899,139440 +"2021-01-15","UT",1472,,12,,12351,12351,635,102,1967,210,1372156,5377,,,2133909,677,,320102,,2543,0,,42752,,41028,302396,263256,,0,2436305,14503,,571424,,233747,1650854,7141,2436305,14503 +"2021-01-15","VA",5656,4982,30,674,19741,19741,3147,146,,580,,0,,,,,362,422634,346917,4795,0,19422,79389,,,432556,,4730680,23966,4730680,23966,196733,836380,,,,0,,0 +"2021-01-15","VI",24,,0,,,,,0,,,35759,0,,,,,,2166,,0,0,,,,,,2008,,0,37925,0,,,,,38019,0,,0 +"2021-01-15","VT",163,,1,,,,45,0,,6,274734,1542,,,,,,9734,9481,161,0,,,,,,6506,,0,788759,9581,,,,,284215,1698,788759,9581 +"2021-01-15","WA",3876,,38,,16080,16080,1105,0,,202,,0,,,,,93,283777,271643,2575,0,,,,,,,4153214,24797,4153214,24797,,,,,,0,,0 +"2021-01-15","WI",5770,5322,42,448,22923,22923,998,119,2117,229,2427631,5771,,,,,,563866,518251,2706,0,,,,,,485157,5745570,29446,5745570,29446,,,,,2945882,8040,,0 +"2021-01-15","WV",1733,1488,31,245,,,717,0,,195,,0,,,,,102,106649,85713,1430,0,,,,,,77900,,0,1709911,21808,28144,,,,,0,1709911,21808 +"2021-01-15","WY",522,,0,,1211,1211,89,4,,,164801,2173,,,507680,,,48909,41773,208,0,,,,,42087,46502,,0,549805,7489,,,,,206574,2318,549805,7489 +"2021-01-14","AK",228,,2,,1149,1149,81,11,,,,0,,,1321433,,10,49535,,332,0,,,,,59332,,,0,1382276,11441,,,,,,0,1382276,11441 +"2021-01-14","AL",5945,4977,185,968,38450,38450,2850,221,2470,,1669962,7366,,,,1412,,414583,329731,3588,0,,,,,,221961,,0,1999693,9969,,,94965,,1999693,9969,,0 +"2021-01-14","AR",4228,3495,42,733,12503,12503,1295,89,,426,2019645,12685,,,2019645,1329,241,264511,214199,2491,0,,,,59307,,235513,,0,2233844,14420,,,,302836,,0,2233844,14420 +"2021-01-14","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-14","AZ",10855,9778,182,1077,45260,45260,4930,397,,1167,2539745,14858,,,,,821,649040,613302,7311,0,,,,,,,,0,5854089,65768,,,401958,,3153047,21312,5854089,65768 +"2021-01-14","CA",31654,,552,,,,22210,0,,4878,,0,,,,,,2816969,2816969,35930,0,,,,,,,,0,37130366,287715,,,,,,0,37130366,287715 +"2021-01-14","CO",5316,4632,31,684,20526,20526,903,94,,,1918454,6227,270876,,,,,369177,352308,2403,0,36847,,,,,,4895837,38882,4895837,38882,311496,,,,2270762,8390,,0 +"2021-01-14","CT",6553,5319,17,1234,12257,12257,1118,0,,,,0,,,4757850,,,221544,208489,968,0,,11908,,,259263,,,0,5024064,42449,,186871,,,,0,5024064,42449 +"2021-01-14","DC",842,,11,,,,287,0,,74,,0,,,,,29,32820,,220,0,,,,,,22899,978833,5263,978833,5263,,,,,375237,1164,,0 +"2021-01-14","DE",995,890,1,105,,,466,0,,56,478334,2154,,,,,,68065,65031,892,0,,,,,69690,,1089972,8527,1089972,8527,,,,,546399,3046,,0 +"2021-01-14","FL",23981,,222,,68011,68011,7762,413,,,7887623,37435,578113,560932,13450244,,,1503529,1259047,13381,0,71851,,69600,,1956768,,17282796,134756,17282796,134756,650372,,630838,,9391152,50816,15476773,109483 +"2021-01-14","GA",11975,10721,172,1254,45893,45893,5968,360,7869,,,0,,,,,,791324,660720,9036,0,51320,,,,624405,,,0,5801007,37033,419581,,,,,0,5801007,37033 +"2021-01-14","GU",124,,0,,,,6,0,,3,92766,391,,,,,3,7457,7263,13,0,19,253,,,,7218,,0,100223,404,337,7058,,,,0,100029,404 +"2021-01-14","HI",318,318,6,,1920,1920,104,7,,24,,0,,,,,19,24434,23908,175,0,,,,,23547,,888876,5983,888876,5983,,,,,,0,,0 +"2021-01-14","IA",4251,,19,,,,532,0,,85,954425,2510,,80258,2055687,,35,254453,254453,1146,0,,50390,10623,47353,275473,262266,,0,1208878,3656,,980719,90921,200217,1211182,3684,2343078,11531 +"2021-01-14","ID",1564,1378,8,186,6178,6178,338,50,1084,88,444163,2186,,,,,,152364,125036,1091,0,,,,,,68657,,0,569199,2974,,78973,,,569199,2974,909722,6361 +"2021-01-14","IL",19724,17928,107,1796,,,3511,0,,742,,0,,,,,382,1052682,,6652,0,,,,,,,,0,14457620,118036,,,,,,0,14457620,118036 +"2021-01-14","IN",9202,8830,39,372,37868,37868,2440,189,6610,550,2213797,7925,,,,,280,578494,,4375,0,,,,,656974,,,0,6271603,51516,,,,,2792291,12300,6271603,51516 +"2021-01-14","KS",3355,,0,,7540,7540,892,0,2027,217,831891,0,,,,413,65,252041,,0,0,,,,,,,,0,1083932,0,,,,,1083932,0,,0 +"2021-01-14","KY",3042,2813,51,229,15022,15022,1661,130,3312,548,,0,,,,,196,317345,252694,4063,0,7573,23084,,,206925,39998,,0,3378562,11707,104306,226614,,,,0,3378562,11707 +"2021-01-14","LA",8080,7631,58,449,,,1975,0,,,4202801,30778,,,,,245,361148,320462,5313,0,,,,,,298614,,0,4563949,36091,,281939,,,,0,4523263,33904 +"2021-01-14","MA",13433,13156,74,277,17109,17109,2226,0,,454,3854115,16498,,,,,294,454402,433297,5955,0,,,13369,,520263,324203,,0,12046398,101413,,,143396,415649,4287412,22043,12046398,101413 +"2021-01-14","MD",6449,6277,45,172,29123,29123,1843,137,,425,2679345,11783,,158859,,,,317815,317815,2948,0,,,20915,,386395,9443,,0,6298178,43825,,,179774,,2997160,14731,6298178,43825 +"2021-01-14","ME",461,456,8,5,1217,1217,193,16,,63,,0,13329,,,,23,31958,26334,808,0,619,5950,,,30465,11840,,0,1194873,8987,13960,111883,,,,0,1194873,8987 +"2021-01-14","MI",14511,13672,175,839,,,2238,0,,499,,0,,,8138266,,258,576573,531004,3295,0,,,,,670672,415079,,0,8808938,48921,459952,,,,,0,8808938,48921 +"2021-01-14","MN",5817,5606,43,211,23113,23113,645,95,4836,131,2688300,7021,,,,,,441935,424584,1581,0,,,,,,420919,5767323,33345,5767323,33345,,276479,,,3112884,8376,,0 +"2021-01-14","MO",6201,,30,,,,2614,0,,588,1706567,4738,106287,,3396908,,332,431957,431957,2780,0,16113,56849,,,477311,,,0,3882097,23074,122638,480010,113252,213236,2138524,7518,3882097,23074 +"2021-01-14","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,128,128,0,0,,,,,,29,,0,17557,0,,,,,17542,0,26131,0 +"2021-01-14","MS",5356,4066,41,1249,8425,8425,1453,0,,347,1222926,0,,,,,219,245847,160683,1948,0,,,,,,198888,,0,1468773,1948,66266,522512,,,,0,1381192,0 +"2021-01-14","MT",1077,,8,,3917,3917,192,14,,36,,0,,,,,21,88110,,457,0,,,,,,82190,,0,862427,7358,,,,,,0,862427,7358 +"2021-01-14","NC",7825,7230,80,595,,,3990,0,,858,,0,,,,,,650926,589265,9853,0,,,,,,,,0,7426166,68243,,398903,,,,0,7426166,68243 +"2021-01-14","ND",1372,,8,,3689,3689,78,6,539,10,290753,869,11953,,,,,95378,91651,243,0,1442,,,,,92249,1294101,6580,1294101,6580,13395,66154,,,386131,1112,1369503,7508 +"2021-01-14","NE",1803,,12,,5520,5520,449,23,,,699608,3169,,,1680017,,,179199,,1529,0,,,,,205069,123234,,0,1887154,12447,,,,,879242,4699,1887154,12447 +"2021-01-14","NH",897,,12,,944,944,270,2,310,,514823,3098,,,,,,54778,39866,653,0,,,,,,47153,,0,1122237,10190,36785,96283,35379,,554689,3592,1122237,10190 +"2021-01-14","NJ",20253,18162,92,2091,54004,54004,3638,190,,644,7924516,49859,,,,,456,609721,549840,7092,0,,,,,,,,0,8534237,56951,,,,,,0,8474356,62584 +"2021-01-14","NM",2836,,29,,10947,10947,691,75,,,,0,,,,,,160543,,1424,0,,,,,,82809,,0,2140562,15572,,,,,,0,2140562,15572 +"2021-01-14","NV",3658,,62,,,,1746,0,,410,1005419,4238,,,,,288,256172,256172,2187,0,,,,,,,2289156,20465,2289156,20465,,,,,1261591,6425,,0 +"2021-01-14","NY",32379,,204,,89995,89995,8823,0,,1536,,0,,,,,956,1183608,,13661,0,,,,,,,28131034,212589,28131034,212589,,,,,,0,,0 +"2021-01-14","OH",9990,8974,109,1016,42491,42491,3789,340,6289,952,,0,,,,,618,807293,714168,7654,0,,57832,,,738897,663856,,0,8304981,54001,,1036519,,,,0,8304981,54001 +"2021-01-14","OK",2882,,34,,19460,19460,1844,261,,474,2563861,15835,,,2563861,,,344506,,3142,0,9516,,,,327292,303476,,0,2908367,18977,109422,,,,,0,2898461,17359 +"2021-01-14","OR",1708,,41,,7123,7123,470,71,,113,,0,,,2701828,,53,129109,,1329,0,,,,,172744,,,0,2874572,17886,,,,,,0,2874572,17886 +"2021-01-14","PA",18742,,313,,,,4980,0,,1013,3427975,11603,,,,,626,748564,661700,7175,0,,,,,,568908,8307622,52579,8307622,52579,,,,,4089675,17172,,0 +"2021-01-14","PR",1679,1397,20,282,,,407,0,,52,305972,0,,,395291,,61,84816,79114,177,0,60303,,,,20103,73760,,0,390788,177,,,,,,0,415664,0 +"2021-01-14","RI",1996,,9,,7366,7366,375,56,,53,585190,3467,,,2096250,,34,103386,,901,0,,,,,123555,,2219805,20175,2219805,20175,,,,,688576,4368,,0 +"2021-01-14","SC",5934,5420,23,514,15940,15940,2427,92,,465,3204940,34882,93277,,3110135,,290,371180,337845,5802,0,18522,66213,,,432650,170072,,0,3576120,40684,111799,512362,,,,0,3542785,39737 +"2021-01-14","SD",1614,,10,,5998,5998,247,20,,56,283660,556,,,,,31,104512,93814,317,0,,,,,99353,98170,,0,622598,2278,,,,,388172,873,622598,2278 +"2021-01-14","TN",8232,6909,84,1323,15753,15753,3150,98,,781,,0,,,5274954,,436,670482,576406,4983,0,,102283,,,664501,596883,,0,5939455,24216,,756813,,,,0,5939455,24216 +"2021-01-14","TX",31050,,426,,,,14052,0,,3662,,0,,,,,,2045699,1794545,23064,0,104726,130380,,,2013598,1630778,,0,15304459,125371,853435,1427906,,,,0,15304459,125371 +"2021-01-14","UT",1460,,11,,12249,12249,614,89,1957,194,1366779,5274,,,2121421,675,,317559,,2742,0,,42040,,40351,300381,260728,,0,2421802,14810,,559136,,227903,1643713,7072,2421802,14810 +"2021-01-14","VA",5626,4952,74,674,19595,19595,3196,125,,583,,0,,,,,366,417839,343304,5294,0,19240,78154,,,429112,,4706714,32084,4706714,32084,196019,822044,,,,0,,0 +"2021-01-14","VI",24,,0,,,,,0,,,35759,0,,,,,,2166,,0,0,,,,,,2008,,0,37925,0,,,,,38019,0,,0 +"2021-01-14","VT",162,,4,,,,45,0,,8,273192,1282,,,,,,9573,9325,205,0,,,,,,6403,,0,779178,8160,,,,,282517,1485,779178,8160 +"2021-01-14","WA",3838,,49,,16080,16080,1083,12,,215,,0,,,,,93,281202,269201,2658,0,,,,,,,4128417,17770,4128417,17770,,,,,,0,,0 +"2021-01-14","WI",5728,5290,49,438,22804,22804,1025,99,2115,224,2421860,6987,,,,,,561160,515982,3140,0,,,,,,482669,5716124,41690,5716124,41690,,,,,2937842,9699,,0 +"2021-01-14","WV",1702,1464,31,238,,,736,0,,187,,0,,,,,97,105219,84569,827,0,,,,,,76272,,0,1688103,14906,27515,,,,,0,1688103,14906 +"2021-01-14","WY",522,,0,,1207,1207,89,10,,,162628,220,,,501049,,,48701,41628,412,0,,,,,41241,46127,,0,542316,4637,,,,,204256,565,542316,4637 +"2021-01-13","AK",226,,2,,1138,1138,68,34,,,,0,,,1310360,,8,49203,,406,0,,,,,58985,,,0,1370835,13127,,,,,,0,1370835,13127 +"2021-01-13","AL",5760,4862,187,898,38229,38229,2975,642,2466,,1662596,6653,,,,1410,,410995,327128,3147,0,,,,,,211684,,0,1989724,8705,,,94370,,1989724,8705,,0 +"2021-01-13","AR",4186,3470,65,716,12414,12414,1362,101,,432,2006960,9097,,,2006960,1315,255,262020,212464,2467,0,,,,58485,,232709,,0,2219424,10688,,,,299123,,0,2219424,10688 +"2021-01-13","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-13","AZ",10673,9620,191,1053,44863,44863,5055,474,,1158,2524887,10993,,,,,805,641729,606848,5629,0,,,,,,,,0,5788321,45878,,,401017,,3131735,15991,5788321,45878 +"2021-01-13","CA",31102,,589,,,,22550,0,,4929,,0,,,,,,2781039,2781039,33751,0,,,,,,,,0,36842651,334267,,,,,,0,36842651,334267 +"2021-01-13","CO",5285,4596,43,689,20432,20432,886,152,,,1912227,7235,268778,,,,,366774,350145,2438,0,36230,,,,,,4856955,35319,4856955,35319,307723,,,,2262372,9350,,0 +"2021-01-13","CT",6536,5305,87,1231,12257,12257,1148,0,,,,0,,,4718071,,,220576,207740,3529,0,,11642,,,256632,,,0,4981615,45116,,181632,,,,0,4981615,45116 +"2021-01-13","DC",831,,6,,,,293,0,,59,,0,,,,,20,32600,,177,0,,,,,,22673,973570,3522,973570,3522,,,,,374073,740,,0 +"2021-01-13","DE",994,889,3,105,,,474,0,,55,476180,2893,,,,,,67173,64194,727,0,,,,,68972,,1081445,7745,1081445,7745,,,,,543353,3620,,0 +"2021-01-13","FL",23759,,174,,67598,67598,7584,440,,,7850188,39033,578113,560932,13360126,,,1490148,1249346,13664,0,71851,,69600,,1938562,,17148040,116070,17148040,116070,650372,,630838,,9340336,52697,15367290,105916 +"2021-01-13","GA",11803,10580,141,1223,45533,45533,6108,356,7837,,,0,,,,,,782288,654356,8596,0,50661,,,,618324,,,0,5763974,26112,417679,,,,,0,5763974,26112 +"2021-01-13","GU",124,,0,,,,7,0,,3,92375,295,,,,,3,7444,7250,21,0,19,253,,,,7208,,0,99819,316,337,7013,,,,0,99625,306 +"2021-01-13","HI",312,312,3,,1913,1913,114,11,,26,,0,,,,,22,24259,23733,106,0,,,,,23384,,882893,4819,882893,4819,,,,,,0,,0 +"2021-01-13","IA",4232,,10,,,,516,0,,79,951915,2310,,79933,2045503,,30,253307,253307,1441,0,,50025,10446,47012,274250,260557,,0,1205222,3751,,972075,90419,198901,1207498,3753,2331547,12289 +"2021-01-13","ID",1556,1373,12,183,6128,6128,283,49,1076,72,441977,779,,,,,,151273,124248,1034,0,,,,,,67633,,0,566225,1510,,78973,,,566225,1510,903361,3474 +"2021-01-13","IL",19617,17840,120,1777,,,3642,0,,749,,0,,,,,386,1046030,,5862,0,,,,,,,,0,14339584,76107,,,,,,0,14339584,76107 +"2021-01-13","IN",9163,8790,59,373,37679,37679,2484,174,6583,550,2205872,6192,,,,,284,574119,,3642,0,,,,,652054,,,0,6220087,44959,,,,,2779991,9834,6220087,44959 +"2021-01-13","KS",3355,,100,,7540,7540,892,189,2027,217,831891,12877,,,,413,65,252041,,4539,0,,,,,,,,0,1083932,17416,,,,,1083932,17416,,0 +"2021-01-13","KY",2991,2767,47,224,14892,14892,1702,154,3278,403,,0,,,,,225,313282,249686,4553,0,7527,22727,,,205437,39723,,0,3366855,23494,104207,221181,,,,0,3366855,23494 +"2021-01-13","LA",8022,7582,51,440,,,2029,0,,,4172023,16174,,,,,235,355835,317336,2896,0,,,,,,298614,,0,4527858,19070,,267725,,,,0,4489359,17928 +"2021-01-13","MA",13359,13082,86,277,17109,17109,2200,506,,461,3837617,15517,,,,,286,448447,427752,5918,0,,,13123,,513918,293522,,0,11944985,100276,,,141687,411710,4265369,20795,11944985,100276 +"2021-01-13","MD",6404,6233,37,171,28986,28986,1929,126,,454,2667562,8820,,158859,,,,314867,314867,2516,0,,,20915,,382784,9439,,0,6254353,34334,,,179774,,2982429,11336,6254353,34334 +"2021-01-13","ME",453,447,4,6,1201,1201,207,12,,64,,0,13301,,,,23,31150,25708,824,0,614,5782,,,30090,11809,,0,1185886,10637,13927,109410,,,,0,1185886,10637 +"2021-01-13","MI",14336,13533,40,803,,,2246,0,,501,,0,,,8092393,,255,573278,528306,3128,0,,,,,667624,415079,,0,8760017,41461,457314,,,,,0,8760017,41461 +"2021-01-13","MN",5774,5567,50,207,23018,23018,665,87,4822,129,2681279,6151,,,,,,440354,423229,1487,0,,,,,,419139,5733978,18984,5733978,18984,,272733,,,3104508,7434,,0 +"2021-01-13","MO",6171,,16,,,,2545,0,,602,1701829,3807,105952,,3376838,,327,429177,429177,2060,0,15943,56007,,,474343,,,0,3859023,14785,122113,469612,112815,209438,2131006,5867,3859023,14785 +"2021-01-13","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,128,128,0,0,,,,,,29,,0,17557,0,,,,,17542,0,26131,0 +"2021-01-13","MS",5315,4066,31,1249,8425,8425,1446,0,,360,1222926,0,,,,,228,243899,159985,1942,0,,,,,,198888,,0,1466825,1942,66266,522512,,,,0,1381192,0 +"2021-01-13","MT",1069,,2,,3903,3903,199,20,,36,,0,,,,,21,87653,,576,0,,,,,,81676,,0,855069,3475,,,,,,0,855069,3475 +"2021-01-13","NC",7745,7167,107,578,,,3951,0,,848,,0,,,,,,641073,581331,5098,0,,,,,,,,0,7357923,41106,,388038,,,,0,7357923,41106 +"2021-01-13","ND",1364,,1,,3683,3683,72,16,539,10,289884,573,11953,,,,,95135,91463,167,0,1442,,,,,92029,1287521,4722,1287521,4722,13395,63434,,,385019,740,1361995,5373 +"2021-01-13","NE",1791,,19,,5497,5497,457,22,,,696439,1271,,,1668291,,,177670,,1000,0,,,,,204358,120700,,0,1874707,13341,,,,,874543,2273,1874707,13341 +"2021-01-13","NH",885,,7,,942,942,275,5,310,,511725,2025,,,,,,54125,39372,977,0,,,,,,46633,,0,1112047,7445,36708,93980,35313,,551097,2606,1112047,7445 +"2021-01-13","NJ",20161,18070,122,2091,53814,53814,3726,237,,648,7874657,0,,,,,452,602629,543974,7880,0,,,,,,,,0,8477286,7880,,,,,,0,8411772,0 +"2021-01-13","NM",2807,,13,,10872,10872,702,57,,,,0,,,,,,159119,,1145,0,,,,,,81603,,0,2124990,11205,,,,,,0,2124990,11205 +"2021-01-13","NV",3596,,50,,,,1784,0,,411,1001181,3693,,,,,280,253985,253985,1143,0,,,,,,,2268691,13943,2268691,13943,,,,,1255166,4836,,0 +"2021-01-13","NY",32175,,168,,89995,89995,8929,0,,1501,,0,,,,,924,1169947,,14577,0,,,,,,,27918445,196868,27918445,196868,,,,,,0,,0 +"2021-01-13","OH",9881,8874,79,1007,42151,42151,3923,288,6252,959,,0,,,,,636,799639,707885,6701,0,,56635,,,733473,656433,,0,8250980,25345,,1017161,,,,0,8250980,25345 +"2021-01-13","OK",2848,,44,,19199,19199,1856,247,,477,2548026,21403,,,2548026,,,341364,,3907,0,9516,,,,325935,299375,,0,2889390,25310,109422,,,,,0,2881102,24554 +"2021-01-13","OR",1667,,54,,7052,7052,447,60,,103,,0,,,2685110,,50,127780,,1173,0,,,,,171576,,,0,2856686,16847,,,,,,0,2856686,16847 +"2021-01-13","PA",18429,,349,,,,5069,0,,1035,3416372,13212,,,,,645,741389,656131,7960,0,,,,,,556041,8255043,56546,8255043,56546,,,,,4072503,19227,,0 +"2021-01-13","PR",1659,1379,14,280,,,388,0,,61,305972,0,,,395291,,73,84639,79006,212,0,60142,,,,20103,73760,,0,390611,212,,,,,,0,415664,0 +"2021-01-13","RI",1987,,17,,7310,7310,402,69,,49,581723,3226,,,2077108,,35,102485,,1092,0,,,,,122522,,2199630,19809,2199630,19809,,,,,684208,4318,,0 +"2021-01-13","SC",5911,5402,51,509,15848,15848,2466,142,,475,3170058,31227,92790,,3076502,,277,365378,332990,6021,0,18269,64368,,,426546,168440,,0,3535436,37248,111059,503983,,,,0,3503048,36189 +"2021-01-13","SD",1604,,19,,5978,5978,253,35,,62,283104,1465,,,,,33,104195,93580,452,0,,,,,99111,97829,,0,620320,2344,,,,,387299,1917,620320,2344 +"2021-01-13","TN",8148,6856,137,1292,15655,15655,3193,145,,783,,0,,,5254875,,445,665499,572619,4625,0,,100966,,,660364,588974,,0,5915239,20426,,746789,,,,0,5915239,20426 +"2021-01-13","TX",30624,,405,,,,14106,0,,3662,,0,,,,,,2022635,1775619,27343,0,104043,127818,,,1991275,1612188,,0,15179088,147557,850565,1404149,,,,0,15179088,147557 +"2021-01-13","UT",1449,,27,,12160,12160,612,101,1945,194,1361505,4704,,,2108668,673,,314817,,5188,0,,41058,,39404,298324,257824,,0,2406992,12444,,538572,,218744,1636641,6362,2406992,12444 +"2021-01-13","VA",5552,4892,75,660,19470,19470,3209,144,,587,,0,,,,,362,412545,339468,4598,0,19128,76731,,,424808,,4674630,33663,4674630,33663,195642,808831,,,,0,,0 +"2021-01-13","VI",24,,0,,,,,0,,,35759,0,,,,,,2166,,0,0,,,,,,2008,,0,37925,0,,,,,38019,0,,0 +"2021-01-13","VT",158,,0,,,,51,0,,8,271910,746,,,,,,9368,9122,121,0,,,,,,6321,,0,771018,3693,,,,,281032,859,771018,3693 +"2021-01-13","WA",3789,,90,,16068,16068,1076,90,,216,,0,,,,,111,278544,266701,1858,0,,,,,,,4110647,23116,4110647,23116,,,,,,0,,0 +"2021-01-13","WI",5679,5248,46,431,22705,22705,988,122,2113,225,2414873,5293,,,,,,558020,513270,2771,0,,,,,,480112,5674434,29499,5674434,29499,,,,,2928143,7427,,0 +"2021-01-13","WV",1671,1441,37,230,,,765,0,,204,,0,,,,,101,104392,83885,1189,0,,,,,,74739,,0,1673197,11333,27404,,,,,0,1673197,11333 +"2021-01-13","WY",522,,0,,1197,1197,82,5,,,162408,221,,,496617,,,48289,41283,217,0,,,,,41036,45904,,0,537679,1609,,,,,203691,388,537679,1609 +"2021-01-12","AK",224,,0,,1104,1104,79,0,,,,0,,,1297818,,9,48797,,0,0,,,,,58423,,,0,1357708,0,,,,,,0,1357708,0 +"2021-01-12","AL",5573,4732,226,841,37587,37587,3076,0,2462,,1655943,6125,,,,1409,,407848,325076,3848,0,,,,,,211684,,0,1981019,8156,,,93710,,1981019,8156,,0 +"2021-01-12","AR",4121,3424,40,697,12313,12313,1354,198,,452,1997863,4150,,,1997863,1306,251,259553,210873,3209,0,,,,57537,,229700,,0,2208736,6245,,,,294790,,0,2208736,6245 +"2021-01-12","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-12","AZ",10482,9438,335,1044,44389,44389,5082,753,,1183,2513894,10178,,,,,786,636100,601850,8559,0,,,,,,,,0,5742443,45750,,,399611,,3115744,18335,5742443,45750 +"2021-01-12","CA",30513,,548,,,,22665,0,,4962,,0,,,,,,2747288,2747288,36487,0,,,,,,,,0,36508384,337856,,,,,,0,36508384,337856 +"2021-01-12","CO",5242,4558,29,684,20280,20280,930,265,,,1904992,4291,266762,,,,,364336,348030,1511,0,35596,,,,,,4821636,23473,4821636,23473,305008,,,,2253022,5567,,0 +"2021-01-12","CT",6449,5236,33,1213,12257,12257,1154,0,,,,0,,,4675758,,,217047,204505,3689,0,,11299,,,253845,,,0,4936499,50607,,175036,,,,0,4936499,50607 +"2021-01-12","DC",825,,4,,,,283,0,,69,,0,,,,,34,32423,,430,0,,,,,,22464,970048,9132,970048,9132,,,,,373333,2239,,0 +"2021-01-12","DE",991,886,5,105,,,473,0,,55,473287,1133,,,,,,66446,63532,619,0,,,,,68284,,1073700,9900,1073700,9900,,,,,539733,1752,,0 +"2021-01-12","FL",23585,,161,,67158,67158,7720,420,,,7811155,40252,578113,560932,13272560,,,1476484,1239950,14526,0,71851,,69600,,1920618,,17031970,117059,17031970,117059,650372,,630838,,9287639,54778,15261374,113009 +"2021-01-12","GA",11662,10444,187,1218,45177,45177,6097,435,7799,,,0,,,,,,773692,648694,9193,0,50103,,,,613704,,,0,5737862,29802,416089,,,,,0,5737862,29802 +"2021-01-12","GU",124,,0,,,,9,0,,4,92080,343,,,,,4,7423,7239,0,0,19,253,,,,7189,,0,99503,343,337,6813,,,,0,99319,348 +"2021-01-12","HI",309,309,0,,1902,1902,124,7,,26,,0,,,,,22,24153,23627,114,0,,,,,23283,,878074,3054,878074,3054,,,,,,0,,0 +"2021-01-12","IA",4222,,83,,,,552,0,,90,949605,1075,,79806,2034801,,30,251866,251866,637,0,,49499,10320,46529,272707,258758,,0,1201471,1712,,960489,90166,197154,1203745,1707,2319258,7172 +"2021-01-12","ID",1544,1363,10,179,6079,6079,283,42,1076,72,441198,1560,,,,,,150239,123517,572,0,,,,,,66796,,0,564715,2000,,78973,,,564715,2000,899887,4438 +"2021-01-12","IL",19497,17743,134,1754,,,3553,0,,757,,0,,,,,409,1040168,,6642,0,,,,,,,,0,14263477,93491,,,,,,0,14263477,93491 +"2021-01-12","IN",9104,8731,88,373,37505,37505,2515,217,6540,553,2199680,4445,,,,,293,570477,,3139,0,,,,,647868,,,0,6175128,34244,,,,,2770157,7584,6175128,34244 +"2021-01-12","KS",3255,,0,,7351,7351,590,0,1981,156,819014,0,,,,413,48,247502,,0,0,,,,,,,,0,1066516,0,,,,,1066516,0,,0 +"2021-01-12","KY",2944,2730,22,214,14738,14738,1733,117,3256,397,,0,,,,,205,308729,246392,3022,0,7459,21988,,,202895,39200,,0,3343361,7879,103953,212102,,,,0,3343361,7879 +"2021-01-12","LA",7971,7536,53,435,,,2035,0,,,4155849,45336,,,,,244,352939,315582,4705,0,,,,,,280373,,0,4508788,50041,,259866,,,,0,4471431,48628 +"2021-01-12","MA",13273,12996,67,277,16603,16603,2219,0,,451,3822100,14061,,,,,271,442529,422474,5487,0,,,13123,,507881,293522,,0,11844709,69982,,,141687,406242,4244574,18967,11844709,69982 +"2021-01-12","MD",6367,6196,66,171,28860,28860,1952,129,,456,2658742,9164,,154692,,,,312351,312351,2665,0,,,19059,,379748,9434,,0,6220019,31254,,,173751,,2971093,11829,6220019,31254 +"2021-01-12","ME",449,443,11,6,1189,1189,203,18,,68,,0,13282,,,,27,30326,25163,715,0,606,5615,,,29633,11768,,0,1175249,7105,13900,106979,,,,0,1175249,7105 +"2021-01-12","MI",14296,13501,104,795,,,2443,0,,525,,0,,,8053893,,285,570150,525612,2468,0,,,,,664663,415079,,0,8718556,35336,455811,,,,,0,8718556,35336 +"2021-01-12","MN",5724,5521,13,203,22931,22931,692,116,4811,135,2675128,6787,,,,,,438867,421946,1315,0,,,,,,418610,5714994,27626,5714994,27626,,267462,,,3097074,8017,,0 +"2021-01-12","MO",6155,,204,,,,2605,0,,588,1698022,3358,105738,,3364375,,341,427117,427117,2131,0,15781,54910,,,472050,,,0,3844238,13957,121735,454080,112498,205487,2125139,5489,3844238,13957 +"2021-01-12","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,128,128,3,0,,,,,,29,,0,17557,3,,,,,17542,0,26131,0 +"2021-01-12","MS",5284,4047,98,1237,8425,8425,1466,0,,354,1222926,0,,,,,222,241957,159043,1648,0,,,,,,198888,,0,1464883,1648,66266,522512,,,,0,1381192,0 +"2021-01-12","MT",1067,,10,,3883,3883,187,30,,36,,0,,,,,21,87077,,424,0,,,,,,81183,,0,851594,6155,,,,,,0,851594,6155 +"2021-01-12","NC",7638,7080,60,558,,,3940,0,,839,,0,,,,,,635975,577872,6851,0,,,,,,,,0,7316817,30153,,376857,,,,0,7316817,30153 +"2021-01-12","ND",1363,,3,,3667,3667,70,11,539,10,289311,1553,11953,,,,,94968,91357,138,0,1442,,,,,91850,1282799,2173,1282799,2173,13395,60944,,,384279,860,1356622,2425 +"2021-01-12","NE",1772,,12,,5475,5475,484,15,,,695168,727,,,1656163,,,176670,,644,0,,,,,203155,122564,,0,1861366,9315,,,,,872270,1369,1861366,9315 +"2021-01-12","NH",878,,9,,937,937,287,3,308,,509700,-218,,,,,,53148,38791,841,0,,,,,,46031,,0,1104602,5777,36636,91697,35253,,548491,2536,1104602,5777 +"2021-01-12","NJ",20039,17980,107,2059,53577,53577,3703,242,,658,7874657,212974,,,,,440,594749,537115,4587,0,,,,,,,,0,8469406,217561,,,,,,0,8411772,227054 +"2021-01-12","NM",2794,,30,,10815,10815,715,94,,,,0,,,,,,157974,,887,0,,,,,,80580,,0,2113785,12630,,,,,,0,2113785,12630 +"2021-01-12","NV",3546,,46,,,,1827,0,,425,997488,3915,,,,,292,252842,252842,2593,0,,,,,,,2254748,19664,2254748,19664,,,,,1250330,6508,,0 +"2021-01-12","NY",32007,,166,,89995,89995,8926,0,,1492,,0,,,,,909,1155370,,15214,0,,,,,,,27721577,196671,27721577,196671,,,,,,0,,0 +"2021-01-12","OH",9802,8805,100,997,41863,41863,4010,486,6237,968,,0,,,,,638,792938,702846,7981,0,,55536,,,728881,648724,,0,8225635,39493,,993668,,,,0,8225635,39493 +"2021-01-12","OK",2804,,29,,18952,18952,1902,67,,471,2526623,26707,,,2526623,,,337457,,2210,0,9516,,,,322888,294629,,0,2864080,28917,109422,,,,,0,2856548,29426 +"2021-01-12","OR",1613,,8,,6992,6992,453,128,,85,,0,,,2669293,,49,126607,,924,0,,,,,170546,,,0,2839839,53215,,,,,,0,2839839,53215 +"2021-01-12","PA",18080,,227,,,,5204,0,,1060,3403160,10914,,,,,639,733429,650116,7275,0,,,,,,542737,8198497,52516,8198497,52516,,,,,4053276,16573,,0 +"2021-01-12","PR",1645,1365,3,280,,,390,0,,77,305972,0,,,395291,,73,84427,78815,959,0,60006,,,,20103,73760,,0,390399,959,,,,,,0,415664,0 +"2021-01-12","RI",1970,,23,,7241,7241,402,50,,53,578497,2695,,,2058594,,34,101393,,786,0,,,,,121227,,2179821,13001,2179821,13001,,,,,679890,3481,,0 +"2021-01-12","SC",5860,5358,34,502,15706,15706,2453,42,,485,3138831,7870,92400,,3046135,,270,359357,328028,1703,0,18069,62535,,,420724,166724,,0,3498188,9573,110469,495253,,,,0,3466859,9310 +"2021-01-12","SD",1585,,0,,5943,5943,240,26,,57,281639,426,,,,,32,103743,93276,244,0,,,,,98866,97407,,0,617976,871,,,,,385382,670,617976,871 +"2021-01-12","TN",8011,6757,146,1254,15510,15510,3230,151,,756,,0,,,5236613,,432,660874,569671,3478,0,,99157,,,658200,579345,,0,5894813,14953,,733789,,,,0,5894813,14953 +"2021-01-12","TX",30219,,286,,,,14218,0,,3619,,0,,,,,,1995292,1753059,26052,0,103243,126267,,,1965279,1595600,,0,15031531,92226,847195,1394289,,,,0,15031531,92226 +"2021-01-12","UT",1422,,26,,12059,12059,605,119,1933,187,1356801,4785,,,2098141,668,,309629,,2146,0,,40124,,38501,296407,253415,,0,2394548,12698,,527054,,212834,1630279,6500,2394548,12698 +"2021-01-12","VA",5477,4833,84,644,19326,19326,3185,144,,582,,0,,,,,349,407947,336203,4561,0,18945,75090,,,419898,,4640967,19827,4640967,19827,194986,793498,,,,0,,0 +"2021-01-12","VI",24,,0,,,,,0,,,35759,433,,,,,,2166,,23,0,,,,,,2008,,0,37925,456,,,,,38019,463,,0 +"2021-01-12","VT",158,,2,,,,56,0,,10,271164,-5,,,,,,9247,9009,169,0,,,,,,6226,,0,767325,5585,,,,,280173,161,767325,5585 +"2021-01-12","WA",3699,,1,,15978,15978,1074,207,,234,,0,,,,,116,276686,265312,5091,0,,,,,,,4087531,52757,4087531,52757,,,,,,0,,0 +"2021-01-12","WI",5633,5211,58,422,22583,22583,1017,149,2107,221,2409580,3846,,,,,,555249,511136,3307,0,,,,,,477460,5644935,18049,5644935,18049,,,,,2920716,6636,,0 +"2021-01-12","WV",1634,1411,40,223,,,755,0,,203,,0,,,,,104,103203,83089,921,0,,,,,,72992,,0,1661864,9928,27227,,,,,0,1661864,9928 +"2021-01-12","WY",522,,33,,1192,1192,106,-24,,,162187,-85,,,495110,,,48072,41116,677,0,,,,,40935,45223,,0,536070,1456,,,,,203303,477,536070,1456 +"2021-01-11","AK",224,,0,,1104,1104,79,3,,,,0,,,1297818,,9,48797,,173,0,,,,,58423,,,0,1357708,5228,,,,,,0,1357708,5228 +"2021-01-11","AL",5347,4593,13,754,37587,37587,3088,833,2459,,1649818,4447,,,,1406,,404000,323045,2100,0,,,,,,211684,,0,1972863,6207,,,93355,,1972863,6207,,0 +"2021-01-11","AR",4081,3392,38,689,12115,12115,1371,0,,460,1993713,8867,,,1993713,1290,268,256344,208778,1268,0,,,,56293,,226700,,0,2202491,9896,,,,288775,,0,2202491,9896 +"2021-01-11","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-11","AZ",10147,9123,6,1024,43636,43636,4997,54,,1158,2503716,13545,,,,,783,627541,593693,8995,0,,,,,,,,0,5696693,61574,,,399328,,3097409,22147,5696693,61574 +"2021-01-11","CA",29965,,264,,,,22633,0,,4971,,0,,,,,,2710801,2710801,39839,0,,,,,,,,0,36170528,343704,,,,,,0,36170528,343704 +"2021-01-11","CO",5213,4539,5,674,20015,20015,914,30,,,1900701,5880,266762,,,,,362825,346754,1677,0,35596,,,,,,4798163,27412,4798163,27412,302358,,,,2247455,7538,,0 +"2021-01-11","CT",6416,5210,92,1206,12257,12257,1142,0,,,,0,,,4628348,,,213358,201124,7364,0,,10919,,,250671,,,0,4885892,15246,,171097,,,,0,4885892,15246 +"2021-01-11","DC",821,,4,,,,298,0,,71,,0,,,,,41,31993,,202,0,,,,,,22153,960916,3566,960916,3566,,,,,371094,804,,0 +"2021-01-11","DE",986,881,14,105,,,471,0,,58,472154,1869,,,,,,65827,62960,554,0,,,,,67385,,1063800,10925,1063800,10925,,,,,537981,2423,,0 +"2021-01-11","FL",23424,,163,,66738,66738,7650,205,,,7770903,26775,578113,560932,13179694,,,1461958,1229770,11338,0,71851,,69600,,1901127,,16914911,96946,16914911,96946,650372,,630838,,9232861,38113,15148365,93865 +"2021-01-11","GA",11475,10299,17,1176,44742,44742,6064,107,7744,,,0,,,,,,764499,642712,7454,0,49883,,,,607912,,,0,5708060,35770,415543,,,,,0,5708060,35770 +"2021-01-11","GU",124,,0,,,,9,0,,4,91737,630,,,,,4,7423,7234,11,0,19,253,,,,7164,,0,99160,641,331,6552,,,,0,98971,651 +"2021-01-11","HI",309,309,0,,1895,1895,126,31,,25,,0,,,,,21,24039,23513,172,0,,,,,23188,,875020,5448,875020,5448,,,,,,0,,0 +"2021-01-11","IA",4139,,1,,,,555,0,,96,948530,992,,79543,2028374,,36,251229,251229,476,0,,49008,10106,46066,272000,256151,,0,1199759,1468,,945534,89689,195523,1202038,1460,2312086,4973 +"2021-01-11","ID",1534,1355,6,179,6037,6037,375,22,1074,76,439638,1067,,,,,,149667,123077,432,0,,,,,,66012,,0,562715,1408,,78973,,,562715,1408,895449,2439 +"2021-01-11","IL",19363,17627,70,1736,,,3540,0,,759,,0,,,,,401,1033526,,4776,0,,,,,,,,0,14169986,66697,,,,,,0,14169986,66697 +"2021-01-11","IN",9016,8643,31,373,37288,37288,2537,163,6510,568,2195235,6364,,,,,286,567338,,3685,0,,,,,644393,,,0,6140884,31731,,,,,2762573,10049,6140884,31731 +"2021-01-11","KS",3255,,107,,7351,7351,590,94,1981,156,819014,10129,,,,413,48,247502,,5180,0,,,,,,,,0,1066516,15309,,,,,1066516,15309,,0 +"2021-01-11","KY",2922,2709,21,213,14621,14621,1709,61,3234,381,,0,,,,,207,305707,244578,2082,0,7415,21565,,,201852,39020,,0,3335482,24683,103800,208876,,,,0,3335482,24683 +"2021-01-11","LA",7918,7489,45,429,,,1982,0,,,4110513,11423,,,,,232,348234,312290,1405,0,,,,,,280373,,0,4458747,12828,,251592,,,,0,4422803,12756 +"2021-01-11","MA",13206,12929,55,277,16603,16603,2211,0,,451,3808039,12662,,,,,285,437042,417568,4251,0,,,13123,,502356,293522,,0,11774727,57414,,,141687,401034,4225607,16901,11774727,57414 +"2021-01-11","MD",6301,6129,29,172,28731,28731,1957,208,,447,2649578,13513,,154692,,,,309686,309686,3012,0,,,19059,,376250,9431,,0,6188765,43520,,,173751,,2959264,16525,6188765,43520 +"2021-01-11","ME",438,432,6,6,1171,1171,190,13,,57,,0,13267,,,,21,29611,24679,313,0,596,5460,,,29229,11752,,0,1168144,5458,13875,104840,,,,0,1168144,5458 +"2021-01-11","MI",14192,13401,47,791,,,2396,0,,485,,0,,,8021131,,272,567682,523618,5129,0,,,,,662089,415079,,0,8683220,74472,453747,,,,,0,8683220,74472 +"2021-01-11","MN",5711,5509,4,202,22815,22815,686,52,4783,141,2668341,5517,,,,,,437552,420716,980,0,,,,,,417005,5687368,16981,5687368,16981,,266495,,,3089057,6310,,0 +"2021-01-11","MO",5951,,3,,,,2608,0,,586,1694664,3240,105548,,3352795,,326,424986,424986,1659,0,15537,54083,,,469691,,,0,3830281,11128,121301,444665,112174,202285,2119650,4899,3830281,11128 +"2021-01-11","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,125,125,0,0,,,,,,29,,0,17554,0,,,,,17542,0,26131,0 +"2021-01-11","MS",5186,3988,19,1179,8425,8425,1424,165,,344,1222926,39348,,,,,221,240309,158266,1227,0,,,,,,198888,,0,1463235,40575,66266,522512,,,,0,1381192,45719 +"2021-01-11","MT",1057,,1,,3853,3853,207,19,,35,,0,,,,,18,86653,,329,0,,,,,,80674,,0,845439,3189,,,,,,0,845439,3189 +"2021-01-11","NC",7578,7031,11,547,,,3843,0,,811,,0,,,,,,629124,571758,5936,0,,,,,,,,0,7286664,59826,,372216,,,,0,7286664,59826 +"2021-01-11","ND",1360,,0,,3656,3656,74,5,536,10,287758,0,11953,,,,,94830,91308,114,0,1442,,,,,91597,1280626,2073,1280626,2073,13395,57302,,,383419,140,1354197,2317 +"2021-01-11","NE",1760,,23,,5460,5460,475,16,,,694441,928,,,1647683,,,176026,,406,0,,,,,202327,121710,,0,1852051,3962,,,,,870901,1337,1852051,3962 +"2021-01-11","NH",869,,0,,934,934,267,12,305,,509918,15198,,,,,,52307,36037,707,0,,,,,,45320,,0,1098825,7117,36601,89085,35235,,545955,3938,1098825,7117 +"2021-01-11","NJ",19932,17873,46,2059,53335,53335,3653,82,,649,7661683,0,,,,,438,590162,532959,5334,0,,,,,,,,0,8251845,5334,,,,,,0,8184718,0 +"2021-01-11","NM",2764,,15,,10721,10721,704,62,,,,0,,,,,,157087,,930,0,,,,,,78826,,0,2101155,7580,,,,,,0,2101155,7580 +"2021-01-11","NV",3500,,33,,,,1777,0,,404,993573,2977,,,,,279,250249,250249,1681,0,,,,,,,2235084,11767,2235084,11767,,,,,1243822,4658,,0 +"2021-01-11","NY",31841,,169,,89995,89995,8645,0,,1426,,0,,,,,891,1140156,,13714,0,,,,,,,27524906,203904,27524906,203904,,,,,,0,,0 +"2021-01-11","OH",9702,8730,75,972,41377,41377,4056,219,6188,971,,0,,,,,607,784957,696826,7892,0,,54934,,,723638,639080,,0,8186142,40490,,984188,,,,0,8186142,40490 +"2021-01-11","OK",2775,,14,,18885,18885,1926,61,,467,2499916,0,,,2499916,,,335247,,3885,0,9516,,,,317146,289309,,0,2835163,3885,109422,,,,,0,2827122,0 +"2021-01-11","OR",1605,,2,,6864,6864,498,0,,92,,0,,,2620029,,54,125683,,1207,0,,,,,166595,,,0,2786624,0,,,,,,0,2786624,0 +"2021-01-11","PA",17853,,83,,,,5232,0,,1070,3392246,10783,,,,,663,726154,644457,5338,0,,,,,,537353,8145981,39353,8145981,39353,,,,,4036703,15727,,0 +"2021-01-11","PR",1642,1362,12,280,,,392,0,,70,305972,0,,,395291,,73,83468,77927,349,0,58872,,,,20103,73760,,0,389440,349,,,,,,0,415664,0 +"2021-01-11","RI",1947,,7,,7191,7191,399,164,,47,575802,1975,,,2046460,,33,100607,,568,0,,,,,120360,,2166820,8328,2166820,8328,,,,,676409,2543,,0 +"2021-01-11","SC",5826,5329,15,497,15664,15664,2387,66,,465,3130961,18901,92372,,3038883,,250,357654,326588,3129,0,18058,61931,,,418666,165305,,0,3488615,22030,110430,492534,,,,0,3457549,21634 +"2021-01-11","SD",1585,,0,,5917,5917,242,13,,49,281213,370,,,,,30,103499,93098,181,0,,,,,98766,96812,,0,617105,1599,,,,,384712,551,617105,1599 +"2021-01-11","TN",7865,6659,80,1206,15359,15359,3249,52,,766,,0,,,5224227,,447,657396,567602,3527,0,,97320,,,655633,568910,,0,5879860,20996,,720816,,,,0,5879860,20996 +"2021-01-11","TX",29933,,56,,,,13397,0,,3424,,0,,,,,,1969240,1730312,14834,0,102405,123161,,,1948046,1568710,,0,14939305,148261,843839,1365082,,,,0,14939305,148261 +"2021-01-11","UT",1396,,4,,11940,11940,595,74,1909,194,1352016,3089,,,2087342,664,,307483,,1484,0,,39280,,37694,294508,251170,,0,2381850,7852,,513177,,207343,1623779,4156,2381850,7852 +"2021-01-11","VA",5393,4758,10,635,19182,19182,3117,87,,571,,0,,,,,352,403386,332730,4530,0,18887,73676,,,416129,,4621140,32988,4621140,32988,194816,778957,,,,0,,0 +"2021-01-11","VI",24,,0,,,,,0,,,35326,0,,,,,,2143,,0,0,,,,,,1984,,0,37469,0,,,,,37556,0,,0 +"2021-01-11","VT",156,,0,,,,53,0,,10,271169,740,,,,,,9078,8843,111,0,,,,,,6027,,0,761740,2649,,,,,280012,849,761740,2649 +"2021-01-11","WA",3698,,0,,15771,15771,1177,0,,245,,0,,,,,86,271595,260360,0,0,,,,,,,4034774,0,4034774,0,,,,,,0,,0 +"2021-01-11","WI",5575,5162,5,413,22434,22434,973,56,2100,219,2405734,3998,,,,,,551942,508346,1682,0,,,,,,474830,5626886,18002,5626886,18002,,,,,2914080,5454,,0 +"2021-01-11","WV",1594,1378,12,216,,,755,0,,212,,0,,,,,104,102282,82440,1070,0,,,,,,71431,,0,1651936,11521,27198,,,,,0,1651936,11521 +"2021-01-11","WY",489,,0,,1216,1216,98,16,,,162272,581,,,493776,,,47395,40554,563,0,,,,,40816,44982,,0,534614,6477,,,,,202826,1253,534614,6477 +"2021-01-10","AK",224,,0,,1101,1101,82,1,,,,0,,,1292805,,10,48624,,250,0,,,,,58210,,,0,1352480,6907,,,,,,0,1352480,6907 +"2021-01-10","AL",5334,4587,35,747,36754,36754,2863,0,2459,,1645371,7584,,,,1405,,401900,321285,2750,0,,,,,,211684,,0,1966656,9870,,,92956,,1966656,9870,,0 +"2021-01-10","AR",4043,3363,33,680,12115,12115,1340,28,,441,1984846,31723,,,1984846,1290,319,255076,207749,3330,0,,,,55915,,223513,,0,2192595,34579,,,,286218,,0,2192595,34579 +"2021-01-10","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-10","AZ",10141,9102,105,1039,43582,43582,4988,487,,1122,2490171,20312,,,,,791,618546,585091,11201,0,,,,,,,,0,5635119,77755,,,398856,,3075262,30756,5635119,77755 +"2021-01-10","CA",29701,,468,,,,22513,0,,4965,,0,,,,,,2670962,2670962,49685,0,,,,,,,,0,35826824,473076,,,,,,0,35826824,473076 +"2021-01-10","CO",5208,4534,18,674,19985,19985,873,23,,,1894821,7972,264123,,,,,361148,345096,2201,0,34893,,,,,,4770751,33948,4770751,33948,300702,,,,2239917,9993,,0 +"2021-01-10","CT",6324,5127,0,1197,12257,12257,1109,0,,,,0,,,4614584,,,205994,193991,0,0,,10518,,,249197,,,0,4870646,19635,,163058,,,,0,4870646,19635 +"2021-01-10","DC",817,,4,,,,292,0,,69,,0,,,,,47,31791,,334,0,,,,,,22153,957350,6588,957350,6588,,,,,370290,1330,,0 +"2021-01-10","DE",972,869,3,103,,,472,0,,62,470285,2636,,,,,,65273,62409,798,0,,,,,66469,,1052875,8365,1052875,8365,,,,,535558,3434,,0 +"2021-01-10","FL",23261,,111,,66533,66533,7494,201,,,7744128,35722,578113,560932,13101989,,,1450620,1221484,12041,0,71851,,69600,,1885337,,16817965,102271,16817965,102271,650372,,630838,,9194748,47763,15054500,94979 +"2021-01-10","GA",11458,10282,1,1176,44635,44635,5993,125,7742,,,0,,,,,,757045,636373,8193,0,49201,,,,601352,,,0,5672290,39819,413263,,,,,0,5672290,39819 +"2021-01-10","GU",124,,0,,,,11,0,,4,91107,0,,,,,3,7412,7226,8,0,19,253,,,,7146,,0,98519,8,331,6149,,,,0,98320,0 +"2021-01-10","HI",309,309,2,,1864,1864,129,0,,24,,0,,,,,20,23867,23341,198,0,,,,,23022,,869572,6544,869572,6544,,,,,,0,,0 +"2021-01-10","IA",4138,,11,,,,541,0,,105,947538,1815,,79499,2023893,,41,250753,250753,940,0,,48638,10043,45727,271514,255593,,0,1198291,2755,,941644,89582,194313,1200578,2766,2307113,7687 +"2021-01-10","ID",1528,1349,5,179,6015,6015,375,20,1070,76,438571,1154,,,,,,149235,122736,977,0,,,,,,64785,,0,561307,1936,,78973,,,561307,1936,893010,4294 +"2021-01-10","IL",19293,17574,83,1719,,,3527,0,,740,,0,,,,,391,1028750,,4711,0,,,,,,,,0,14103289,77775,,,,,,0,14103289,77775 +"2021-01-10","IN",8985,8613,19,372,37125,37125,2593,166,6481,556,2188871,8517,,,,,291,563653,,5093,0,,,,,640198,,,0,6109153,47654,,,,,2752524,13610,6109153,47654 +"2021-01-10","KS",3148,,0,,7257,7257,869,0,1955,221,808885,0,,,,413,61,242322,,0,0,,,,,,,,0,1051207,0,,,,,1051207,0,,0 +"2021-01-10","KY",2901,2692,25,209,14560,14560,1713,49,3228,380,,0,,,,,212,303625,242993,3227,0,7341,21011,,,198605,39006,,0,3310799,0,103544,205091,,,,0,3310799,0 +"2021-01-10","LA",7873,7447,40,426,,,1960,0,,,4099090,41263,,,,,225,346829,310957,5398,0,,,,,,280373,,0,4445919,46661,,251094,,,,0,4410047,45778 +"2021-01-10","MA",13151,12875,77,276,16603,16603,2225,0,,459,3795377,14857,,,,,282,432791,413329,5656,0,,,13123,,497572,293522,,0,11717313,81754,,,141687,399660,4208706,20253,11717313,81754 +"2021-01-10","MD",6272,6100,26,172,28523,28523,1950,227,,485,2636065,14820,,154692,,,,306674,306674,3310,0,,,19059,,372717,9427,,0,6145245,60177,,,173751,,2942739,18130,6145245,60177 +"2021-01-10","ME",432,426,0,6,1158,1158,191,0,,51,,0,13198,,,,24,29298,24430,279,0,574,5279,,,28936,11735,,0,1162686,9151,13784,102726,,,,0,1162686,9151 +"2021-01-10","MI",14145,13355,0,790,,,2480,0,,517,,0,,,7952474,,294,562553,519082,0,0,,,,,656274,415079,,0,8608748,0,450681,,,,,0,8608748,0 +"2021-01-10","MN",5707,5506,44,201,22763,22763,759,64,4770,130,2662824,12921,,,,,,436572,419923,2159,0,,,,,,414756,5670387,34806,5670387,34806,,265515,,,3082747,14863,,0 +"2021-01-10","MO",5948,,4,,,,2700,0,,597,1691424,6463,104264,,3343465,,322,423327,423327,2744,0,15005,53772,,,467917,,,0,3819153,20717,119485,442011,110527,200843,2114751,9207,3819153,20717 +"2021-01-10","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,125,125,0,0,,,,,,29,,0,17554,0,,,,,17542,0,26131,0 +"2021-01-10","MS",5167,3988,21,1179,8260,8260,1460,0,,329,1183578,0,,,,,219,239082,157690,2214,0,,,,,,182103,,0,1422660,2214,64321,486742,,,,0,1335473,0 +"2021-01-10","MT",1056,,2,,3834,3834,201,-3,,36,,0,,,,,17,86324,,222,0,,,,,,80237,,0,842250,5114,,,,,,0,842250,5114 +"2021-01-10","NC",7567,7021,142,546,,,3774,0,,790,,0,,,,,,623188,566175,8833,0,,,,,,,,0,7226838,67844,,312430,,,,0,7226838,67844 +"2021-01-10","ND",1360,,0,,3651,3651,72,7,536,10,287758,0,11953,,,,,94716,91196,158,0,1442,,,,,91465,1278553,2646,1278553,2646,13395,56720,,,383279,963,1351880,2993 +"2021-01-10","NE",1737,,4,,5444,5444,471,10,,,693513,1809,,,1644150,,,175620,,1006,0,,,,,201900,120729,,0,1848089,10418,,,,,869564,2816,1848089,10418 +"2021-01-10","NH",869,,7,,922,922,262,0,305,,494720,0,,,,,,51600,36037,729,0,,,,,,44277,,0,1091708,5879,36569,87646,35206,,542017,2859,1091708,5879 +"2021-01-10","NJ",19886,17827,32,2059,53253,53253,3589,82,,625,7661683,0,,,,,431,584828,528054,5646,0,,,,,,,,0,8246511,5646,,,,,,0,8184718,0 +"2021-01-10","NM",2749,,17,,10659,10659,682,37,,,,0,,,,,,156157,,1203,0,,,,,,77731,,0,2093575,14759,,,,,,0,2093575,14759 +"2021-01-10","NV",3467,,17,,,,1758,0,,407,990596,3046,,,,,277,248568,248568,2259,0,,,,,,,2223317,12541,2223317,12541,,,,,1239164,5305,,0 +"2021-01-10","NY",31672,,153,,89995,89995,8484,0,,1436,,0,,,,,892,1126442,,15355,0,,,,,,,27321002,246836,27321002,246836,,,,,,0,,0 +"2021-01-10","OH",9627,8666,28,961,41158,41158,4236,101,6160,1033,,0,,,,,632,777065,690473,6088,0,,54458,,,718796,634085,,0,8145652,53492,,978928,,,,0,8145652,53492 +"2021-01-10","OK",2761,,23,,18824,18824,1926,186,,467,2499916,0,,,2499916,,,331362,,6487,0,9516,,,,317146,285645,,0,2831278,6487,109422,,,,,0,2827122,0 +"2021-01-10","OR",1603,,28,,6864,6864,498,0,,92,,0,,,2620029,,54,124476,,1629,0,,,,,166595,,,0,2786624,0,,,,,,0,2786624,0 +"2021-01-10","PA",17770,,103,,,,5201,0,,1062,3381463,13870,,,,,640,720816,639513,7506,0,,,,,,520490,8106628,58042,8106628,58042,,,,,4020976,20448,,0 +"2021-01-10","PR",1630,1350,14,280,,,402,0,,67,305972,0,,,395291,,71,83119,77630,489,0,58777,,,,20103,73760,,0,389091,489,,,,,,0,415664,0 +"2021-01-10","RI",1940,,10,,7027,7027,390,0,,55,573827,3398,,,2038804,,39,100039,,1038,0,,,,,119688,,2158492,18188,2158492,18188,,,,,673866,4436,,0 +"2021-01-10","SC",5811,5315,53,496,15598,15598,2374,89,,464,3112060,27411,91989,,3020377,,250,354525,323855,4441,0,17831,61077,,,415538,163716,,0,3466585,31852,109820,486702,,,,0,3435915,31161 +"2021-01-10","SD",1585,,15,,5904,5904,237,33,,54,280843,651,,,,,31,103318,92967,417,0,,,,,98618,96693,,0,615506,1810,,,,,384161,1068,615506,1810 +"2021-01-10","TN",7785,6607,81,1178,15307,15307,3263,53,,778,,0,,,5206785,,459,653869,564674,7419,0,,96638,,,652079,565197,,0,5858864,37062,,718561,,,,0,5858864,37062 +"2021-01-10","TX",29877,,186,,,,13111,0,,3478,,0,,,,,,1954406,1716824,15855,0,100971,120797,,,1918146,1558945,,0,14791044,137233,838680,1345957,,,,0,14791044,137233 +"2021-01-10","UT",1392,,2,,11866,11866,588,88,1902,189,1348927,5080,,,2080737,663,,305999,,2276,0,,39058,,37479,293261,249390,,0,2373998,11978,,511430,,206762,1619623,6881,2373998,11978 +"2021-01-10","VA",5383,4749,2,634,19095,19095,3060,70,,553,,0,,,,,348,398856,329185,5141,0,18644,70387,,,411465,,4588152,50192,4588152,50192,193731,772466,,,,0,,0 +"2021-01-10","VI",24,,0,,,,,0,,,35326,0,,,,,,2143,,0,0,,,,,,1984,,0,37469,0,,,,,37556,0,,0 +"2021-01-10","VT",156,,0,,,,43,0,,10,270429,1728,,,,,,8967,8734,177,0,,,,,,6015,,0,759091,6185,,,,,279163,1903,759091,6185 +"2021-01-10","WA",3698,,-1,,15771,15771,1177,214,,245,,0,,,,,86,271595,260360,2988,0,,,,,,,4034774,24990,4034774,24990,,,,,,0,,0 +"2021-01-10","WI",5570,5157,3,413,22378,22378,1054,52,2098,242,2401736,5630,,,,,,550260,506890,2126,0,,,,,,472862,5608884,23843,5608884,23843,,,,,2908626,7462,,0 +"2021-01-10","WV",1582,1369,12,213,,,760,0,,214,,0,,,,,99,101212,81581,1434,0,,,,,,70382,,0,1640415,13170,26957,,,,,0,1640415,13170 +"2021-01-10","WY",489,,0,,1200,1200,108,3,,,161691,0,,,487724,,,46832,40013,113,0,,,,,40391,44556,,0,528137,0,,,,,201573,0,528137,0 +"2021-01-09","AK",224,,1,,1100,1100,86,5,,,,0,,,1286179,,8,48374,,311,0,,,,,57933,,,0,1345573,7824,,,,,,0,1345573,7824 +"2021-01-09","AL",5299,4563,108,736,36754,36754,2995,0,2459,,1637787,8919,,,,1405,,399150,318999,4863,0,,,,,,211684,,0,1956786,12553,,,92210,,1956786,12553,,0 +"2021-01-09","AR",4010,3338,44,672,12087,12087,1346,119,,426,1953123,13126,,,1953123,1289,223,251746,204893,2886,0,,,,55322,,219887,,0,2158016,15277,,,,284502,,0,2158016,15277 +"2021-01-09","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-09","AZ",10036,9001,98,1035,43095,43095,4918,377,,1121,2469859,17242,,,,,791,607345,574647,11094,0,,,,,,,,0,5557364,75067,,,398232,,3044506,27352,5557364,75067 +"2021-01-09","CA",29233,,695,,,,22600,0,,4939,,0,,,,,,2621277,2621277,52636,0,,,,,,,,0,35353748,326418,,,,,,0,35353748,326418 +"2021-01-09","CO",5190,4469,52,669,19962,19962,915,107,,,1886849,8733,264123,,,,,358947,343075,2837,0,34893,,,,,,4736803,43809,4736803,43809,299016,,,,2229924,11417,,0 +"2021-01-09","CT",6324,5127,0,1197,12257,12257,1109,0,,,,0,,,4597025,,,205994,193991,0,0,,10518,,,247138,,,0,4851011,32281,,163058,,,,0,4851011,32281 +"2021-01-09","DC",813,,4,,,,280,0,,72,,0,,,,,46,31457,,350,0,,,,,,22042,950762,6944,950762,6944,,,,,368960,1532,,0 +"2021-01-09","DE",969,866,12,103,,,464,0,,62,467649,2262,,,,,,64475,61684,972,0,,,,,65879,,1044510,5091,1044510,5091,,,,,532124,3234,,0 +"2021-01-09","FL",23150,,139,,66332,66332,7455,346,,,7708406,31803,578113,560932,13023880,,,1438579,1212244,15069,0,71851,,69600,,1868967,,16715694,122817,16715694,122817,650372,,630838,,9146985,46872,14959521,107151 +"2021-01-09","GA",11457,10280,143,1177,44510,44510,5892,323,7727,,,0,,,,,,748852,629204,11926,0,48712,,,,593881,,,0,5632471,48477,411942,,,,,0,5632471,48477 +"2021-01-09","GU",124,,0,,,,11,0,,4,91107,0,,,,,3,7404,7218,5,0,19,253,,,,7146,,0,98511,5,331,6149,,,,0,98320,0 +"2021-01-09","HI",307,307,4,,1864,1864,129,0,,24,,0,,,,,20,23669,23143,248,0,,,,,22837,,863028,6502,863028,6502,,,,,,0,,0 +"2021-01-09","IA",4127,,3,,,,549,0,,110,945723,1983,,79469,2017300,,47,249813,249813,1072,0,,48442,10029,45539,270502,255103,,0,1195536,3055,,939073,89538,193740,1197812,3061,2299426,9867 +"2021-01-09","ID",1523,1344,6,179,5995,5995,375,57,1062,76,437417,1389,,,,,,148258,121954,1085,0,,,,,,64538,,0,559371,2227,,78973,,,559371,2227,888716,6864 +"2021-01-09","IL",19210,17494,102,1716,,,3589,0,,742,,0,,,,,393,1024039,,6717,0,,,,,,,,0,14025514,102903,,,,,,0,14025514,102903 +"2021-01-09","IN",8966,8595,74,371,36959,36959,2678,193,6441,579,2180354,8559,,,,,299,558560,,5966,0,,,,,634311,,,0,6061499,56096,,,,,2738914,14525,6061499,56096 +"2021-01-09","KS",3148,,0,,7257,7257,869,0,1955,221,808885,0,,,,413,61,242322,,0,0,,,,,,,,0,1051207,0,,,,,1051207,0,,0 +"2021-01-09","KY",2876,2672,20,204,14511,14511,1752,152,3223,384,,0,,,,,201,300398,240337,4231,0,7341,21011,,,198605,38905,,0,3310799,10504,103544,205091,,,,0,3310799,10504 +"2021-01-09","LA",7833,7411,0,422,,,2069,0,,,4057827,0,,,,,220,341431,306442,0,0,,,,,,280373,,0,4399258,0,,244578,,,,0,4364269,0 +"2021-01-09","MA",13074,12798,89,276,16603,16603,2291,0,,445,3780520,18180,,,,,280,427135,407933,7414,0,,,13123,,491419,293522,,0,11635559,109793,,,141687,396117,4188453,25290,11635559,109793 +"2021-01-09","MD",6246,6075,30,171,28296,28296,1877,228,,449,2621245,12654,,154692,,,,303364,303364,3758,0,,,19059,,368626,9427,,0,6085068,55586,,,173751,,2924609,16412,6085068,55586 +"2021-01-09","ME",432,426,6,6,1158,1158,205,8,,56,,0,13198,,,,26,29019,24218,612,0,574,5110,,,28482,11728,,0,1153535,8368,13784,100427,,,,0,1153535,8368 +"2021-01-09","MI",14145,13355,232,790,,,2480,0,,517,,0,,,7952474,,294,562553,519082,2898,0,,,,,656274,415079,,0,8608748,53347,450681,,,,,0,8608748,53347 +"2021-01-09","MN",5663,5463,43,200,22699,22699,759,82,4762,130,2649903,11272,,,,,,434413,417981,2469,0,,,,,,412546,5635581,37849,5635581,37849,,259861,,,3067884,13505,,0 +"2021-01-09","MO",5944,,32,,,,2831,0,,602,1684961,6134,103462,,3325701,,339,420583,420583,3825,0,14642,52902,,,465003,,,0,3798436,24853,118320,435035,109517,197196,2105544,9959,3798436,24853 +"2021-01-09","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,125,125,0,0,,,,,,29,,0,17554,0,,,,,17542,0,26131,0 +"2021-01-09","MS",5146,3978,45,1168,8260,8260,1460,0,,329,1183578,0,,,,,219,236868,156621,3203,0,,,,,,182103,,0,1420446,3203,64321,486742,,,,0,1335473,0 +"2021-01-09","MT",1054,,5,,3837,3837,204,23,,40,,0,,,,,22,86102,,534,0,,,,,,79906,,0,837136,5249,,,,,,0,837136,5249 +"2021-01-09","NC",7425,6901,97,524,,,3871,0,,834,,0,,,,,,614355,558293,11581,0,,,,,,,,0,7158994,65774,,309520,,,,0,7158994,65774 +"2021-01-09","ND",1360,,0,,3644,3644,76,2,535,9,287758,-218,11953,,,,,94558,91082,120,0,1442,,,,,91222,1275907,1996,1275907,1996,13395,55765,,,382316,-98,1348887,2280 +"2021-01-09","NE",1733,,-78,,5434,5434,481,20,,,691704,1373,,,1634913,,,174614,,1023,0,,,,,200730,119393,,0,1837671,12039,,,,,866748,2406,1837671,12039 +"2021-01-09","NH",862,,16,,922,922,268,0,305,,494720,0,,,,,,50871,36037,719,0,,,,,,43374,,0,1085829,0,36232,46479,35158,,539158,4375,1085829,0 +"2021-01-09","NJ",19854,17795,98,2059,53171,53171,3638,3434,,652,7661683,59386,,,,,423,579182,523035,7427,0,,,,,,,,0,8240865,66813,,,,,,0,8184718,65813 +"2021-01-09","NM",2732,,22,,10622,10622,696,112,,,,0,,,,,,154954,,1498,0,,,,,,76801,,0,2078816,16831,,,,,,0,2078816,16831 +"2021-01-09","NV",3450,,56,,,,1758,0,,407,987550,2808,,,,,277,246309,246309,2648,0,,,,,,,2210776,12293,2210776,12293,,,,,1233859,5456,,0 +"2021-01-09","NY",31519,,190,,89995,89995,8527,0,,1428,,0,,,,,876,1111087,,16943,0,,,,,,,27074166,258031,27074166,258031,,,,,,0,,0 +"2021-01-09","OH",9599,8639,55,960,41057,41057,4007,270,6148,987,,0,,,,,618,770977,685423,8374,0,,53564,,,712077,628964,,0,8092160,58892,,967576,,,,0,8092160,58892 +"2021-01-09","OK",2738,,35,,18638,18638,1926,220,,467,2499916,22588,,,2499916,,,324875,,4289,0,9516,,,,317146,281869,,0,2824791,26877,109422,,,,,0,2827122,28050 +"2021-01-09","OR",1575,,7,,6864,6864,498,19,,92,,0,,,2620029,,54,122847,,1762,0,,,,,166595,,,0,2786624,24293,,,,,,0,2786624,24293 +"2021-01-09","PA",17667,,273,,,,5298,0,,1081,3367593,15216,,,,,611,713310,632935,10045,0,,,,,,520490,8048586,72839,8048586,72839,,,,,4000528,23463,,0 +"2021-01-09","PR",1616,1342,24,274,,,420,0,,77,305972,0,,,395291,,77,82630,77280,563,0,58144,,,,20103,72747,,0,388602,563,,,,,,0,415664,0 +"2021-01-09","RI",1930,,14,,7027,7027,390,0,,55,570429,2773,,,2021859,,39,99001,,1387,0,,,,,118445,,2140304,24337,2140304,24337,,,,,669430,4160,,0 +"2021-01-09","SC",5758,5267,63,491,15509,15509,2383,174,,457,3084649,30711,91859,,2994228,,243,350084,320105,5908,0,17776,59701,,,410526,162451,,0,3434733,36619,109635,479452,,,,0,3404754,35463 +"2021-01-09","SD",1570,,14,,5871,5871,234,20,,55,280192,980,,,,,30,102901,92726,321,0,,,,,98380,96291,,0,613696,2906,,,,,383093,1301,613696,2906 +"2021-01-09","TN",7704,6545,86,1159,15254,15254,3416,76,,828,,0,,,5175768,,487,646450,559331,5844,0,,94436,,,646034,560642,,0,5821802,32100,,709263,,,,0,5821802,32100 +"2021-01-09","TX",29691,,381,,,,13935,0,,3521,,0,,,,,,1938551,1703634,23290,0,100438,118061,,,1892758,1549210,,0,14653811,121068,836194,1326296,,,,0,14653811,121068 +"2021-01-09","UT",1390,,9,,11778,11778,592,99,1897,181,1343847,4665,,,2070767,660,,303723,,2613,0,,38567,,37009,291253,247390,,0,2362020,12654,,505422,,203587,1612742,6601,2362020,12654 +"2021-01-09","VA",5381,4748,69,633,19025,19025,3032,107,,565,,0,,,,,348,393715,325517,5798,0,18516,70186,,,404268,,4537960,37958,4537960,37958,193186,763167,,,,0,,0 +"2021-01-09","VI",24,,0,,,,,0,,,35326,0,,,,,,2143,,0,0,,,,,,1984,,0,37469,0,,,,,37556,0,,0 +"2021-01-09","VT",156,,0,,,,40,0,,7,268701,2077,,,,,,8790,8559,171,0,,,,,,5902,,0,752906,9055,,,,,277260,2245,752906,9055 +"2021-01-09","WA",3699,,65,,15557,15557,1177,-11,,245,,0,,,,,118,268607,257447,4595,0,,,,,,,4009784,22646,4009784,22646,,,,,,0,,0 +"2021-01-09","WI",5567,5155,38,412,22326,22326,1054,120,2093,242,2396106,5568,,,,,,548134,505058,3516,0,,,,,,470385,5585041,26539,5585041,26539,,,,,2901164,8614,,0 +"2021-01-09","WV",1570,1359,16,211,,,768,0,,200,,0,,,,,98,99778,80408,1880,0,,,,,,69228,,0,1627245,18479,26885,,,,,0,1627245,18479 +"2021-01-09","WY",489,,0,,1197,1197,108,1,,,161691,0,,,487724,,,46719,39925,72,0,,,,,40391,44490,,0,528137,0,,,,,201573,0,528137,0 +"2021-01-08","AK",223,,0,,1095,1095,86,11,,,,0,,,1278710,,8,48063,,403,0,,,,,57584,,,0,1337749,11207,,,,,,0,1337749,11207 +"2021-01-08","AL",5191,4482,111,709,36754,36754,3046,343,2456,,1628868,8420,,,,1404,,394287,315365,5057,0,,,,,,211684,,0,1944233,12202,,,91475,,1944233,12202,,0 +"2021-01-08","AR",3966,3304,40,662,11968,11968,1342,68,,439,1939997,11298,,,1939997,1282,219,248860,202742,2944,0,,,,54459,,217578,,0,2142739,13509,,,,280251,,0,2142739,13509 +"2021-01-08","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-08","AZ",9938,8918,197,1020,42718,42718,4907,606,,1122,2452617,16778,,,,,799,596251,564537,11658,0,,,,,,,,0,5482297,66243,,,395565,,3017154,27342,5482297,66243 +"2021-01-08","CA",28538,,493,,,,22836,0,,4905,,0,,,,,,2568641,2568641,50030,0,,,,,,,,0,35027330,266975,,,,,,0,35027330,266975 +"2021-01-08","CO",5138,4469,36,669,19855,19855,915,121,,,1878116,7884,260831,,,,,356110,340391,3187,0,33998,,,,,,4692994,43560,4692994,43560,297755,,,,2218507,10819,,0 +"2021-01-08","CT",6324,5127,37,1197,12257,12257,1109,0,,,,0,,,4567672,,,205994,193991,3236,0,,10518,,,244237,,,0,4818730,38425,,163058,,,,0,4818730,38425 +"2021-01-08","DC",809,,1,,,,271,0,,66,,0,,,,,38,31107,,357,0,,,,,,21851,943818,6783,943818,6783,,,,,367428,1401,,0 +"2021-01-08","DE",957,854,8,103,,,451,0,,59,465387,1411,,,,,,63503,60758,554,0,,,,,65388,,1039419,9983,1039419,9983,,,,,528890,1965,,0 +"2021-01-08","FL",23011,,194,,65986,65986,7407,364,,,7676603,42110,578113,560932,12936919,,,1423510,1202042,19136,0,71851,,69600,,1849493,,16592877,141599,16592877,141599,650372,,630838,,9100113,61246,14852370,129677 +"2021-01-08","GA",11314,10180,84,1134,44187,44187,5899,391,7690,,,0,,,,,,736926,620247,13296,0,48195,,,,585062,,,0,5583994,14381,410456,,,,,0,5583994,14381 +"2021-01-08","GU",124,,0,,,,10,0,,3,91107,223,,,,,2,7399,7213,13,0,19,253,,,,7146,,0,98506,236,331,6149,,,,0,98320,236 +"2021-01-08","HI",303,303,4,,1864,1864,129,12,,24,,0,,,,,20,23421,22895,308,0,,,,,22630,,856526,6634,856526,6634,,,,,,0,,0 +"2021-01-08","IA",4124,,59,,,,579,0,,108,943740,1965,,79254,2008682,,51,248741,248741,1608,0,,48160,9833,45266,269326,253501,,0,1192481,3573,,928678,89127,192781,1194751,3589,2289559,14358 +"2021-01-08","ID",1517,1339,29,178,5938,5938,366,67,1055,77,436028,2126,,,,,,147173,121116,1067,0,,,,,,63778,,0,557144,2848,,78973,,,557144,2848,881852,5482 +"2021-01-08","IL",19108,17395,167,1713,,,3777,0,,780,,0,,,,,422,1017322,,9277,0,,,,,,,,0,13922611,118665,,,,,,0,13922611,118665 +"2021-01-08","IN",8892,8521,69,371,36766,36766,2769,249,6408,584,2171795,7656,,,,,295,552594,,6095,0,,,,,627575,,,0,6005403,54481,,,,,2724389,13751,6005403,54481 +"2021-01-08","KS",3148,,121,,7257,7257,869,144,1955,221,808885,8184,,,,413,61,242322,,5504,0,,,,,,,,0,1051207,13688,,,,,1051207,13688,,0 +"2021-01-08","KY",2856,2652,13,204,14359,14359,1748,108,3192,393,,0,,,,,217,296167,237108,4737,0,7264,20677,,,197538,38445,,0,3300295,32239,103203,201509,,,,0,3300295,32239 +"2021-01-08","LA",7833,7411,105,422,,,2069,0,,,4057827,26432,,,,,220,341431,306442,3377,0,,,,,,280373,,0,4399258,29809,,244578,,,,0,4364269,28985 +"2021-01-08","MA",12985,12708,76,277,16603,16603,2311,0,,440,3762340,18874,,,,,280,419721,400823,8120,0,,,13123,,483506,293522,,0,11525766,108569,,,141687,392437,4163163,26509,11525766,108569 +"2021-01-08","MD",6216,6047,43,169,28068,28068,1885,168,,447,2608591,12977,,154692,,,,299606,299606,3732,0,,,19059,,359707,9419,,0,6029482,57050,,,173751,,2908197,16709,6029482,57050 +"2021-01-08","ME",426,420,41,6,1150,1150,205,15,,56,,0,13198,,,,26,28407,23803,782,0,574,4892,,,27926,11690,,0,1145167,10245,13784,97820,,,,0,1145167,10245 +"2021-01-08","MI",13913,13132,40,781,,,2480,0,,517,,0,,,7903573,,294,559655,516376,3908,0,,,,,651828,363611,,0,8555401,54079,447754,,,,,0,8555401,54079 +"2021-01-08","MN",5620,5425,48,195,22617,22617,759,76,4742,130,2638631,10393,,,,,,431944,415748,2374,0,,,,,,409727,5597732,43881,5597732,43881,,255098,,,3054379,12488,,0 +"2021-01-08","MO",5912,,30,,,,2841,0,,634,1678827,5086,103085,,3304977,,358,416758,416758,4332,0,14409,51742,,,460925,,,0,3773583,26193,117710,423353,109025,192711,2095585,9418,3773583,26193 +"2021-01-08","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,125,125,0,0,,,,,,29,,0,17554,0,,,,,17542,0,26131,0 +"2021-01-08","MS",5101,3955,40,1146,8260,8260,1480,0,,348,1183578,0,,,,,229,233665,155149,2175,0,,,,,,182103,,0,1417243,2175,64321,486742,,,,0,1335473,0 +"2021-01-08","MT",1049,,11,,3814,3814,205,32,,37,,0,,,,,21,85568,,818,0,,,,,,79114,,0,831887,8608,,,,,,0,831887,8608 +"2021-01-08","NC",7328,6821,115,507,,,3960,0,,833,,0,,,,,,602774,548133,10028,0,,,,,,,,0,7093220,73607,,302335,,,,0,7093220,73607 +"2021-01-08","ND",1360,,12,,3642,3642,85,19,534,11,287976,553,11953,,,,,94438,90999,282,0,1442,,,,,90964,1273911,5828,1273911,5828,13395,53662,,,382414,835,1346607,6527 +"2021-01-08","NE",1811,,108,,5414,5414,491,28,,,690331,2038,,,1624042,,,173591,,1122,0,,,,,199599,117589,,0,1825632,12110,,,,,864342,3160,1825632,12110 +"2021-01-08","NH",846,,19,,922,922,297,0,305,,494720,0,,,,,,50152,36037,891,0,,,,,,42495,,0,1085829,10142,36232,46479,35065,,534783,4026,1085829,10142 +"2021-01-08","NJ",19756,17697,110,2059,49737,49737,3669,222,,655,7602297,46041,,,,,439,571755,516608,6949,0,,,,,,,,0,8174052,52990,,,,,,0,8118905,58002 +"2021-01-08","NM",2710,,30,,10510,10510,703,144,,,,0,,,,,,153456,,1637,0,,,,,,75883,,0,2061985,13649,,,,,,0,2061985,13649 +"2021-01-08","NV",3394,,55,,,,1874,0,,399,984742,4666,,,,,263,243661,243661,2866,0,,,,,,,2198483,18452,2198483,18452,,,,,1228403,7532,,0 +"2021-01-08","NY",31329,,165,,89995,89995,8561,0,,1475,,0,,,,,912,1094144,,18832,0,,,,,,,26816135,243903,26816135,243903,,,,,,0,,0 +"2021-01-08","OH",9544,8589,82,955,40787,40787,4066,318,6126,1004,,0,,,,,645,762603,678441,9535,0,,52229,,,704378,621185,,0,8033268,69947,,942258,,,,0,8033268,69947 +"2021-01-08","OK",2703,,31,,18418,18418,1961,225,,477,2477328,14387,,,2477328,,,320586,,5232,0,9516,,,,313050,280430,,0,2797914,19619,109422,,,,,0,2799072,19327 +"2021-01-08","OR",1568,,10,,6845,6845,530,108,,118,,0,,,2597543,,53,121085,,862,0,,,,,164788,,,0,2762331,21215,,,,,,0,2762331,21215 +"2021-01-08","PA",17394,,215,,,,5318,0,,1092,3352377,14661,,,,,600,703265,624688,10178,0,,,,,,513383,7975747,70945,7975747,70945,,,,,3977065,22830,,0 +"2021-01-08","PR",1592,1323,4,269,,,414,0,,79,305972,0,,,395291,,78,82067,76726,2169,0,57768,,,,20103,72747,,0,388039,2169,,,,,,0,415664,0 +"2021-01-08","RI",1916,,6,,7027,7027,390,71,,55,567656,2557,,,1999083,,39,97614,,1023,0,,,,,116884,,2115967,16222,2115967,16222,,,,,665270,3580,,0 +"2021-01-08","SC",5695,5217,34,478,15335,15335,2396,133,,488,3053938,35196,91357,,2964302,,251,344176,315353,6064,0,17490,57927,,,404989,161183,,0,3398114,41260,108847,468863,,,,0,3369291,40303 +"2021-01-08","SD",1556,,12,,5851,5851,247,22,,59,279212,1110,,,,,37,102580,92489,448,0,,,,,98124,95783,,0,610790,2848,,,,,381792,1558,610790,2848 +"2021-01-08","TN",7618,6491,126,1127,15178,15178,3482,110,,811,,0,,,5149497,,474,640606,554782,6369,0,,93026,,,640205,559625,,0,5789702,33593,,701348,,,,0,5789702,33593 +"2021-01-08","TX",29310,,372,,,,13921,0,,3521,,0,,,,,,1915261,1684271,23520,0,99392,114910,,,1866444,1536690,,0,14532743,86834,831020,1297609,,,,0,14532743,86834 +"2021-01-08","UT",1381,,22,,11679,11679,610,101,1889,196,1339182,6083,,,2060289,657,,301110,,3793,0,,37782,,36256,289077,244990,,0,2349366,16979,,489562,,197084,1606141,9054,2349366,16979 +"2021-01-08","VA",5312,4681,37,631,18918,18918,2991,128,,547,,0,,,,,351,387917,321172,5238,0,18259,68458,,,398661,,4500002,36234,4500002,36234,191817,761716,,,,0,,0 +"2021-01-08","VI",24,,0,,,,,0,,,35326,390,,,,,,2143,,37,0,,,,,,1984,,0,37469,427,,,,,37556,441,,0 +"2021-01-08","VT",156,,1,,,,35,0,,8,266624,3233,,,,,,8619,8391,216,0,,,,,,5778,,0,743851,12224,,,,,275015,3447,743851,12224 +"2021-01-08","WA",3634,,29,,15568,15568,1197,153,,242,,0,,,,,104,264012,253401,3260,0,,,,,,,3987138,17549,3987138,17549,,,,,,0,,0 +"2021-01-08","WI",5529,5119,52,410,22206,22206,1077,136,2080,244,2390538,7128,,,,,,544618,502012,4110,0,,,,,,467069,5558502,40683,5558502,40683,,,,,2892550,10602,,0 +"2021-01-08","WV",1554,1346,36,208,,,787,0,,208,,0,,,,,102,97898,78838,1896,0,,,,,,68155,,0,1608766,23505,26719,,,,,0,1608766,23505 +"2021-01-08","WY",489,,0,,1196,1196,108,12,,,161691,424,,,487724,,,46647,39882,479,0,,,,,40391,44279,,0,528137,5449,,,,,201573,830,528137,5449 +"2021-01-07","AK",223,,3,,1084,1084,89,10,,,,0,,,1267982,,8,47660,,326,0,,,,,57120,,,0,1326542,15527,,,,,,0,1326542,15527 +"2021-01-07","AL",5080,4408,86,672,36411,36411,3015,352,2449,,1620448,7507,,,,1404,,389230,311583,5046,0,,,,,,211684,,0,1932031,10821,,,90442,,1932031,10821,,0 +"2021-01-07","AR",3926,3273,25,653,11900,11900,1326,33,,427,1928699,9261,,,1928699,1277,218,245916,200531,3323,0,,,,53589,,215980,,0,2129230,11538,,,,274823,,0,2129230,11538 +"2021-01-07","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-07","AZ",9741,8753,297,988,42112,42112,4920,1049,,1101,2435839,6941,,,,,776,584593,553973,9913,0,,,,,,,,0,5416054,41550,,,394583,,2989812,15778,5416054,41550 +"2021-01-07","CA",28045,,583,,,,22851,0,,4811,,0,,,,,,2518611,2518611,36385,0,,,,,,,,0,34760355,211734,,,,,,0,34760355,211734 +"2021-01-07","CO",5102,4436,52,666,19734,19734,954,31,,,1870232,19343,260831,,,,,352923,337456,3473,0,33998,,,,,,4649434,51679,4649434,51679,294829,,,,2207688,12377,,0 +"2021-01-07","CT",6287,5096,57,1191,12257,12257,1087,0,,,,0,,,4532364,,,202758,190767,3304,0,,10455,,,241182,,,0,4780305,43574,,160663,,,,0,4780305,43574 +"2021-01-07","DC",808,,2,,,,278,0,,63,,0,,,,,36,30750,,268,0,,,,,,21660,937035,4933,937035,4933,,,,,366027,1272,,0 +"2021-01-07","DE",949,846,2,103,,,453,0,,57,463976,1779,,,,,,62949,60274,1220,0,,,,,64153,,1029436,9107,1029436,9107,,,,,526925,2999,,0 +"2021-01-07","FL",22817,,170,,65622,65622,7327,390,,,7634493,42130,578113,560932,12832829,,,1404374,1187619,19334,0,71851,,69600,,1824592,,16451278,140840,16451278,140840,650372,,630838,,9038867,61464,14722693,123722 +"2021-01-07","GA",11230,10100,65,1130,43796,43796,5751,167,7642,,,0,,,,,,723630,609868,9790,0,48102,,,,581928,,,0,5569613,46392,410091,,,,,0,5569613,46392 +"2021-01-07","GU",124,,1,,,,12,0,,2,90884,431,,,,,1,7386,7200,8,0,17,243,,,,7145,,0,98270,439,331,6135,,,,0,98084,439 +"2021-01-07","HI",299,299,0,,1852,1852,121,9,,24,,0,,,,,24,23113,22631,321,0,,,,,22369,,849892,13546,849892,13546,,,,,,0,,0 +"2021-01-07","IA",4065,,5,,,,613,0,,119,941775,2136,,79007,1996135,,52,247133,247133,1294,0,,47470,9677,44620,267595,251659,,0,1188908,3430,,913003,88724,190342,1191162,3433,2275201,10707 +"2021-01-07","ID",1488,1313,17,175,5871,5871,366,47,1043,77,433902,1337,,,,,,146106,120394,1263,0,,,,,,63097,,0,554296,2270,,52274,,,554296,2270,876370,4482 +"2021-01-07","IL",18941,17272,206,1669,,,3921,0,,783,,0,,,,,450,1008045,,8757,0,,,,,,,,0,13803946,105518,,,,,,0,13803946,105518 +"2021-01-07","IN",8823,8452,80,371,36517,36517,2812,203,6377,593,2164139,8783,,,,,306,546499,,7270,0,,,,,620799,,,0,5950922,56417,,,,,2710638,16053,5950922,56417 +"2021-01-07","KS",3027,,0,,7113,7113,838,0,1928,206,800701,0,,,,413,70,236818,,0,0,,,,,,,,0,1037519,0,,,,,1037519,0,,0 +"2021-01-07","KY",2843,2643,37,200,14251,14251,1744,212,3174,424,,0,,,,,217,291430,233472,4889,0,7187,20065,,,194320,38173,,0,3268056,20684,103031,193957,,,,0,3268056,20684 +"2021-01-07","LA",7728,7319,47,409,,,2033,0,,,4031395,29927,,,,,219,338054,303889,4530,0,,,,,,280373,,0,4369449,34457,,239754,,,,0,4335284,33849 +"2021-01-07","MA",12909,12634,73,275,16603,16603,2386,505,,455,3743466,18088,,,,,277,411601,393188,7548,0,,,13123,,474982,293522,,0,11417197,108412,,,141687,387433,4136654,25224,11417197,108412 +"2021-01-07","MD",6173,6004,41,169,27900,27900,1834,189,,427,2595614,9368,,154692,,,,295874,295874,2970,0,,,19059,,359707,9404,,0,5972432,39652,,,173751,,2891488,12338,5972432,39652 +"2021-01-07","ME",385,379,13,6,1135,1135,202,11,,55,,0,13169,,,,25,27625,23193,535,0,568,4510,,,27329,11658,,0,1134922,10927,13749,93165,,,,0,1134922,10927 +"2021-01-07","MI",13873,13094,206,779,,,2578,0,,509,,0,,,7854280,,300,555747,512751,4249,0,,,,,647042,363611,,0,8501322,45058,445336,,,,,0,8501322,45058 +"2021-01-07","MN",5572,5381,44,191,22541,22541,787,104,4733,135,2628238,8211,,,,,,429570,413653,1983,0,,,,,,408510,5553851,34673,5553851,34673,,249978,,,3041891,9908,,0 +"2021-01-07","MO",5882,,24,,,,2784,0,,636,1673741,3708,102764,,3283467,,355,412426,412426,3983,0,14204,50217,,,456311,,,0,3747390,22787,117184,412706,108619,186902,2086167,7691,3747390,22787 +"2021-01-07","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,125,125,1,0,,,,,,29,,0,17554,1,,,,,17542,0,26131,0 +"2021-01-07","MS",5061,3938,48,1123,8260,8260,1495,0,,358,1183578,0,,,,,222,231490,154334,3255,0,,,,,,182103,,0,1415068,3255,64321,486742,,,,0,1335473,0 +"2021-01-07","MT",1038,,23,,3782,3782,208,44,,40,,0,,,,,21,84750,,690,0,,,,,,78796,,0,823279,6137,,,,,,0,823279,6137 +"2021-01-07","NC",7213,6727,137,486,,,3960,0,,826,,0,,,,,,592746,539544,10398,0,,,,,,,,0,7019613,64054,,295778,,,,0,7019613,64054 +"2021-01-07","ND",1348,,7,,3623,3623,83,13,533,12,287423,389,11953,,,,,94156,90741,324,0,1442,,,,,90726,1268083,5410,1268083,5410,13395,52045,,,381579,713,1340080,6183 +"2021-01-07","NE",1703,,11,,5386,5386,506,28,,,688293,1952,,,1613363,,,172469,,1436,0,,,,,198164,116295,,0,1813522,17840,,,,,861182,3393,1813522,17840 +"2021-01-07","NH",827,,11,,922,922,314,3,305,,494720,1926,,,,,,49261,36037,423,0,,,,,,41804,,0,1075687,7576,36145,46416,34985,,530757,2107,1075687,7576 +"2021-01-07","NJ",19646,17587,123,2059,49515,49515,3711,191,,654,7556256,0,,,,,430,564806,510839,7539,0,,,,,,,,0,8121062,7539,,,,,,0,8060903,0 +"2021-01-07","NM",2680,,39,,10366,10366,722,88,,,,0,,,,,,151819,,1835,0,,,,,,74235,,0,2048336,15758,,,,,,0,2048336,15758 +"2021-01-07","NV",3339,,44,,,,1918,0,,411,980076,3535,,,,,280,240795,240795,3402,0,,,,,,,2180031,17902,2180031,17902,,,,,1220871,6937,,0 +"2021-01-07","NY",31164,,199,,89995,89995,8548,0,,1424,,0,,,,,859,1075312,,17636,0,,,,,,,26572232,238550,26572232,238550,,,,,,0,,0 +"2021-01-07","OH",9462,8522,94,940,40469,40469,4180,365,6092,997,,0,,,,,636,753068,670586,10251,0,,50979,,,695616,613418,,0,7963321,54676,,928085,,,,0,7963321,54676 +"2021-01-07","OK",2672,,39,,18193,18193,1987,307,,489,2462941,15591,,,2462941,,,315354,,3781,0,8943,,,,309980,277828,,0,2778295,19372,107663,,,,,0,2779745,20623 +"2021-01-07","OR",1558,,8,,6737,6737,530,102,,118,,0,,,2578086,,53,120223,,735,0,,,,,163030,,,0,2741116,18339,,,,,,0,2741116,18339 +"2021-01-07","PA",17179,,265,,,,5491,0,,1113,3337716,10760,,,,,625,693087,616519,9698,0,,,,,,499022,7904802,51502,7904802,51502,,,,,3954235,17374,,0 +"2021-01-07","PR",1588,1319,18,269,,,411,0,,72,305972,0,,,395291,,74,79898,74967,286,0,57481,,,,20103,70374,,0,385870,286,,,,,,0,415664,0 +"2021-01-07","RI",1910,,20,,6956,6956,397,51,,59,565099,2465,,,1984030,,40,96591,,1128,0,,,,,115715,,2099745,19820,2099745,19820,,,,,661690,3593,,0 +"2021-01-07","SC",5661,5189,79,472,15202,15202,2425,187,,476,3018742,25101,90700,,2930137,,245,338112,310246,4877,0,17263,55426,,,398851,159700,,0,3356854,29978,107963,457586,,,,0,3328988,29143 +"2021-01-07","SD",1544,,25,,5829,5829,264,24,,56,278102,745,,,,,36,102132,92166,448,0,,,,,97815,94513,,0,607942,2228,,,,,380234,1193,607942,2228 +"2021-01-07","TN",7492,6405,111,1087,15068,15068,3533,133,,819,,0,,,5121761,,474,634237,549527,9000,0,,91543,,,634348,555634,,0,5756109,39767,,691687,,,,0,5756109,39767 +"2021-01-07","TX",28938,,393,,,,13784,0,,3502,,0,,,,,,1891741,1666487,24578,0,98318,114160,,,1851122,1522105,,0,14445909,75756,826923,1293168,,,,0,14445909,75756 +"2021-01-07","UT",1359,,29,,11578,11578,594,115,1880,187,1333099,6890,,,2046589,654,,297317,,4597,0,,37038,,35532,285798,242361,,0,2332387,20004,,480288,,193102,1597087,10505,2332387,20004 +"2021-01-07","VA",5275,4646,49,629,18790,18790,3000,154,,568,,0,,,,,366,382679,317123,5379,0,18068,66883,,,392694,,4463768,35557,4463768,35557,191056,746104,,,,0,,0 +"2021-01-07","VI",24,,0,,,,,0,,,34936,66,,,,,,2106,,23,0,,,,,,1955,,0,37042,89,,,,,37115,83,,0 +"2021-01-07","VT",155,,3,,,,39,0,,8,263391,1651,,,,,,8403,8177,245,0,,,,,,5657,,0,731627,8882,,,,,271568,1878,731627,8882 +"2021-01-07","WA",3605,,64,,15415,15415,1159,88,,266,,0,,,,,109,260752,250306,1985,0,,,,,,,3969589,19957,3969589,19957,,,,,,0,,0 +"2021-01-07","WI",5477,5079,42,398,22070,22070,1128,99,2080,243,2383410,6357,,,,,,540508,498538,4509,0,,,,,,464443,5517819,39652,5517819,39652,,,,,2881948,10148,,0 +"2021-01-07","WV",1518,1322,37,196,,,789,0,,219,,0,,,,,96,96002,77233,1324,0,,,,,,66881,,0,1585261,17561,26618,,,,,0,1585261,17561 +"2021-01-07","WY",489,,25,,1184,1184,112,8,,,161267,200,,,482574,,,46168,39476,278,0,,,,,40097,43949,,0,522688,4849,,,,,200743,461,522688,4849 +"2021-01-06","AK",220,,2,,1074,1074,101,18,,,,0,,,1253043,,6,47334,,328,0,,,,,56554,,,0,1311015,8156,,,,,,0,1311015,8156 +"2021-01-06","AL",4994,4346,108,648,36059,36059,2967,629,2448,,1612941,7150,,,,1404,,384184,308269,4591,0,,,,,,211684,,0,1921210,10329,,,89641,,1921210,10329,,0 +"2021-01-06","AR",3901,3252,65,649,11867,11867,1321,124,,427,1919438,11045,,,1919438,1271,217,242593,198254,3705,0,,,,52442,,213574,,0,2117692,13369,,,,268259,,0,2117692,13369 +"2021-01-06","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-06","AZ",9444,8493,127,951,41063,41063,4877,760,,1084,2428898,13885,,,,,747,574680,545136,7206,0,,,,,,,,0,5374504,50474,,,394030,,2974034,20302,5374504,50474 +"2021-01-06","CA",27462,,459,,,,22820,0,,4731,,0,,,,,,2482226,2482226,29892,0,,,,,,,,0,34548621,217837,,,,,,0,34548621,217837 +"2021-01-06","CO",5050,4333,59,658,19703,19703,988,885,,,1850889,0,258225,,,,,349450,332332,2557,0,33330,,,,,,4597755,35699,4597755,35699,291555,,,,2195311,12090,,0 +"2021-01-06","CT",6230,5048,38,1182,12257,12257,1139,0,,,,0,,,4492309,,,199454,187749,2486,0,,10054,,,237731,,,0,4736731,46602,,152840,,,,0,4736731,46602 +"2021-01-06","DC",806,,5,,,,265,0,,69,,0,,,,,34,30482,,316,0,,,,,,21461,932102,5385,932102,5385,,,,,364755,1375,,0 +"2021-01-06","DE",947,844,0,103,,,458,0,,65,462197,1547,,,,,,61729,59134,629,0,,,,,63121,,1020329,6606,1020329,6606,,,,,523926,2176,,0 +"2021-01-06","FL",22647,,132,,65232,65232,7303,449,,,7592363,38374,578113,560932,12733963,,,1385040,1174410,17262,0,71851,,69600,,1800408,,16310438,114362,16310438,114362,650372,,630838,,8977403,55636,14598971,110152 +"2021-01-06","GA",11165,10035,93,1130,43629,43629,5782,611,7605,,,0,,,,,,713840,602796,7686,0,47855,,,,574307,,,0,5523221,13341,409076,,,,,0,5523221,13341 +"2021-01-06","GU",123,,0,,,,11,0,,3,90453,307,,,,,1,7378,7192,21,0,17,243,,,,7145,,0,97831,328,329,6111,,,,0,97645,326 +"2021-01-06","HI",299,299,10,,1843,1843,123,26,,21,,0,,,,,16,22792,22310,142,0,,,,,22083,,836346,3870,836346,3870,,,,,,0,,0 +"2021-01-06","IA",4060,,61,,,,604,0,,116,939639,2224,,78709,1986902,,54,245839,245839,2010,0,,46889,9518,44077,266187,249919,,0,1185478,4234,,904912,88267,189129,1187729,4238,2264494,13413 +"2021-01-06","ID",1471,1298,12,173,5824,5824,254,79,1040,54,432565,735,,,,,,144843,119461,1538,0,,,,,,62215,,0,552026,1718,,52274,,,552026,1718,871888,4426 +"2021-01-06","IL",18735,17096,173,1639,,,3928,0,,812,,0,,,,,451,999288,,7569,0,,,,,,,,0,13698428,80974,,,,,,0,13698428,80974 +"2021-01-06","IN",8743,8371,80,372,36314,36314,2782,193,6355,586,2155356,6700,,,,,303,539229,,6146,0,,,,,612814,,,0,5894505,49161,,,,,2694585,12846,5894505,49161 +"2021-01-06","KS",3027,,130,,7113,7113,838,158,1928,206,800701,7889,,,,413,70,236818,,5501,0,,,,,,,,0,1037519,13390,,,,,1037519,13390,,0 +"2021-01-06","KY",2806,2609,34,197,14039,14039,1778,189,3127,428,,0,,,,,244,286541,229808,5705,0,7145,19696,,,191733,37821,,0,3247372,12871,102804,189753,,,,0,3247372,12871 +"2021-01-06","LA",7681,7273,46,408,,,1993,0,,,4001468,20361,,,,,207,333524,299967,6876,0,,,,,,280373,,0,4334992,27237,,235661,,,,0,4301435,24503 +"2021-01-06","MA",12836,12563,102,273,16098,16098,2416,0,,442,3725378,15039,,,,,281,404053,386052,6851,0,,,12915,,467138,261672,,0,11308785,102573,,,140254,383427,4111430,21458,11308785,102573 +"2021-01-06","MD",6132,5960,50,172,27711,27711,1862,169,,444,2586246,10904,,154692,,,,292904,292904,3146,0,,,19059,,356165,9391,,0,5932780,38281,,,173751,,2879150,14050,5932780,38281 +"2021-01-06","ME",372,366,3,6,1124,1124,191,7,,50,,0,13135,,,,21,27090,22794,525,0,562,4446,,,26816,11607,,0,1123995,7588,13709,92326,,,,0,1123995,7588 +"2021-01-06","MI",13667,12918,59,749,,,2657,0,,523,,0,,,7813432,,304,551498,508736,4856,0,,,,,642832,363611,,0,8456264,45351,443670,,,,,0,8456264,45351 +"2021-01-06","MN",5528,5340,67,188,22437,22437,817,100,4722,140,2620027,5767,,,,,,427587,411956,2326,0,,,,,,406910,5519178,19875,5519178,19875,,243129,,,3031983,7687,,0 +"2021-01-06","MO",5858,,33,,,,2738,0,,624,1670033,2759,101554,,3265005,,344,408443,408443,2854,0,13931,48588,,,452047,,,0,3724603,13275,115701,400398,107373,181514,2078476,5613,3724603,13275 +"2021-01-06","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,124,124,2,0,,,,,,29,,0,17553,2,,,,,17542,0,26131,0 +"2021-01-06","MS",5013,3920,38,1093,8260,8260,1495,0,,358,1183578,0,,,,,222,228235,152906,2791,0,,,,,,182103,,0,1411813,2791,64321,486742,,,,0,1335473,0 +"2021-01-06","MT",1015,,10,,3738,3738,219,52,,41,,0,,,,,21,84060,,682,0,,,,,,78114,,0,817142,4060,,,,,,0,817142,4060 +"2021-01-06","NC",7076,6615,80,461,,,3893,0,,823,,0,,,,,,582348,530830,6952,0,,,,,,,,0,6955559,40448,,288492,,,,0,6955559,40448 +"2021-01-06","ND",1341,,5,,3610,3610,85,13,530,13,287034,846,11953,,,,,93832,90478,338,0,1442,,,,,90511,1262673,4309,1262673,4309,13395,48034,,,380866,1184,1333897,4816 +"2021-01-06","NE",1692,,10,,5358,5358,515,37,,,686341,1626,,,1597330,,,171033,,1448,0,,,,,196373,114249,,0,1795682,13885,,,,,857789,3073,1795682,13885 +"2021-01-06","NH",816,,24,,919,919,301,1,304,,492794,2330,,,,,,48838,35856,846,0,,,,,,41237,,0,1068111,6778,36097,46334,34944,,528650,2824,1068111,6778 +"2021-01-06","NJ",19523,17464,141,2059,49324,49324,3744,266,,668,7556256,40002,,,,,456,557267,504647,5848,0,,,,,,,,0,8113523,45850,,,,,,0,8060903,45013 +"2021-01-06","NM",2641,,47,,10278,10278,712,115,,,,0,,,,,,149984,,1485,0,,,,,,72089,,0,2032578,9119,,,,,,0,2032578,9119 +"2021-01-06","NV",3295,,60,,,,1919,0,,411,976541,3679,,,,,280,237393,237393,1938,0,,,,,,,2162129,11391,2162129,11391,,,,,1213934,5617,,0 +"2021-01-06","NY",30965,,163,,89995,89995,8665,0,,1408,,0,,,,,851,1057676,,16648,0,,,,,,,26333682,197816,26333682,197816,,,,,,0,,0 +"2021-01-06","OH",9368,8443,121,925,40104,40104,4319,454,6065,1021,,0,,,,,649,742817,662217,7814,0,,49738,,,687682,605474,,0,7908645,25962,,910844,,,,0,7908645,25962 +"2021-01-06","OK",2633,,62,,17886,17886,1994,332,,494,2447350,17585,,,2447350,,,311573,,3305,0,8943,,,,306460,274657,,0,2758923,20890,107663,,,,,0,2759122,24539 +"2021-01-06","OR",1550,,44,,6635,6635,540,0,,110,,0,,,2560960,,55,119488,,1035,0,,,,,161817,,,0,2722777,0,,,,,,0,2722777,0 +"2021-01-06","PA",16914,,368,,,,5613,0,,1120,3326956,11822,,,,,673,683389,609905,9474,0,,,,,,485206,7853300,58751,7853300,58751,,,,,3936861,18852,,0 +"2021-01-06","PR",1570,1303,8,267,,,417,0,,65,305972,0,,,395291,,73,79612,74756,293,0,57402,,,,20103,70374,,0,385584,293,,,,,,0,415664,0 +"2021-01-06","RI",1890,,20,,6905,6905,405,68,,59,562634,2945,,,1965528,,40,95463,,1611,0,,,,,114397,,2079925,20481,2079925,20481,,,,,658097,4556,,0 +"2021-01-06","SC",5582,5139,84,443,15015,15015,2424,164,,469,2993641,23233,90487,,2905531,,247,333235,306204,5162,0,17169,53786,,,394314,158273,,0,3326876,28395,107656,447762,,,,0,3299845,27434 +"2021-01-06","SD",1519,,6,,5805,5805,264,41,,56,277357,1071,,,,,33,101684,91875,608,0,,,,,97434,93778,,0,605714,2322,,,,,379041,1679,605714,2322 +"2021-01-06","TN",7381,6326,114,1055,14935,14935,3554,100,,831,,0,,,5089894,,478,625237,542490,7588,0,,89286,,,626448,548838,,0,5716342,29875,,680506,,,,0,5716342,29875 +"2021-01-06","TX",28545,,326,,,,13628,0,,3477,,0,,,,,,1867163,1646382,24010,0,93511,112156,,,1835626,1504643,,0,14370153,80276,801027,1267667,,,,0,14370153,80276 +"2021-01-06","UT",1330,,18,,11463,11463,589,107,1866,192,1326209,5654,,,2030447,651,,292720,,3769,0,,36049,,34606,281936,239203,,0,2312383,16987,,465950,,188053,1586582,8714,2312383,16987 +"2021-01-06","VA",5226,4604,35,622,18636,18636,2925,110,,537,,0,,,,,357,377300,313349,5387,0,17863,65180,,,386635,,4428211,23570,4428211,23570,190313,734696,,,,0,,0 +"2021-01-06","VI",24,,0,,,,,0,,,34870,228,,,,,,2083,,28,0,,,,,,1955,,0,36953,256,,,,,37032,248,,0 +"2021-01-06","VT",152,,3,,,,40,0,,6,261740,573,,,,,,8158,7950,120,0,,,,,,5546,,0,722745,2987,,,,,269690,680,722745,2987 +"2021-01-06","WA",3541,,59,,15327,15327,1167,167,,262,,0,,,,,121,258767,248580,2332,0,,,,,,,3949632,13872,3949632,13872,,,,,,0,,0 +"2021-01-06","WI",5435,5039,69,396,21971,21971,1104,175,2074,245,2377053,6568,,,,,,535999,494747,4109,0,,,,,,461729,5478167,32470,5478167,32470,,,,,2871800,9974,,0 +"2021-01-06","WV",1481,1298,39,183,,,818,0,,217,,0,,,,,90,94678,76067,1516,0,,,,,,65571,,0,1567700,11459,26413,,,,,0,1567700,11459 +"2021-01-06","WY",464,,0,,1176,1176,112,8,,,161067,240,,,477981,,,45890,39215,321,0,,,,,39842,43642,,0,517839,2312,,,,,200282,501,517839,2312 +"2021-01-05","AK",218,,0,,1056,1056,93,23,,,,0,,,1245250,,6,47006,,194,0,,,,,56193,,,0,1302859,5361,,,,,,0,1302859,5361 +"2021-01-05","AL",4886,4266,8,620,35430,35430,3080,0,2445,,1605791,3889,,,,1400,,379593,305090,5498,0,,,,,,202137,,0,1910881,7493,,,89088,,1910881,7493,,0 +"2021-01-05","AR",3836,3205,36,631,11743,11743,1323,229,,426,1908393,6427,,,1908393,1256,224,238888,195930,4107,0,,,,50949,,210617,,0,2104323,8702,,,,261928,,0,2104323,8702 +"2021-01-05","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-05","AZ",9317,8398,253,919,40303,40303,4789,406,,1096,2415013,10699,,,,,761,567474,538719,5932,0,,,,,,,,0,5324030,35372,,,393396,,2953732,16143,5324030,35372 +"2021-01-05","CA",27003,,368,,,,22485,0,,4734,,0,,,,,,2452334,2452334,31440,0,,,,,,,,0,34330784,203771,,,,,,0,34330784,203771 +"2021-01-05","CO",4991,4333,47,658,18818,18818,988,71,,,1850889,13956,255008,,,,,346893,332332,3458,0,32506,,,,,,4562056,32282,4562056,32282,289064,,,,2183221,17209,,0 +"2021-01-05","CT",6192,5017,24,1175,12257,12257,1149,0,,,,0,,,4449554,,,196968,185445,2332,0,,9844,,,233917,,,0,4690129,51399,,149584,,,,0,4690129,51399 +"2021-01-05","DC",801,,4,,,,260,0,,72,,0,,,,,32,30166,,262,0,,,,,,21337,926717,5598,926717,5598,,,,,363380,1323,,0 +"2021-01-05","DE",947,844,10,103,,,431,0,,56,460650,1563,,,,,,61100,58560,767,0,,,,,62434,,1013723,9544,1013723,9544,,,,,521750,2330,,0 +"2021-01-05","FL",22515,,100,,64783,64783,7345,386,,,7553989,33771,578113,560932,12645924,,,1367778,1163846,15556,0,71851,,69600,,1778813,,16196076,100188,16196076,100188,650372,,630838,,8921767,49327,14488819,91766 +"2021-01-05","GA",11072,9966,101,1106,43018,43018,5642,423,7535,,,0,,,,,,706154,597208,10091,0,47497,,,,571561,,,0,5509880,27090,408030,,,,,0,5509880,27090 +"2021-01-05","GU",123,,0,,,,10,0,,3,90146,654,,,,,2,7357,7173,13,0,17,243,,,,7132,,0,97503,667,329,5883,,,,0,97319,664 +"2021-01-05","HI",289,289,0,,1817,1817,96,42,,18,,0,,,,,15,22650,22168,123,0,,,,,21969,,832476,4066,832476,4066,,,,,,0,,0 +"2021-01-05","IA",3999,,7,,,,582,0,,115,937415,602,,78405,1975711,,53,243829,243829,1021,0,,46281,9315,43476,263998,247853,,0,1181244,1623,,894222,87760,187445,1183491,1628,2251081,6983 +"2021-01-05","ID",1459,1290,11,169,5745,5745,254,39,1036,54,431830,629,,,,,,143305,118478,798,0,,,,,,61493,,0,550308,1209,,52274,,,550308,1209,867462,3802 +"2021-01-05","IL",18562,16959,150,1603,,,3905,0,,800,,0,,,,,457,991719,,6839,0,,,,,,,,0,13617454,87083,,,,,,0,13617454,87083 +"2021-01-05","IN",8663,8292,149,371,36121,36121,2907,265,6364,591,2148656,3288,,,,,326,533083,,3395,0,,,,,606160,,,0,5845344,31318,,,,,2681739,6683,5845344,31318 +"2021-01-05","KS",2897,,0,,6955,6955,662,0,1876,180,792812,0,,,,412,65,231317,,0,0,,,,,,,,0,1024129,0,,,,,1024129,0,,0 +"2021-01-05","KY",2772,2578,23,194,13850,13850,1760,56,3098,430,,0,,,,,215,280836,225611,1693,0,7102,19005,,,190465,37502,,0,3234501,9630,102678,182030,,,,0,3234501,9630 +"2021-01-05","LA",7635,7241,50,394,,,1974,0,,,3981107,37529,,,,,205,326648,295825,4467,0,,,,,,263712,,0,4307755,41996,,223291,,,,0,4276932,41170 +"2021-01-05","MA",12734,12464,63,270,16098,16098,2428,0,,425,3710339,11590,,,,,264,397202,379633,4634,0,,,12915,,459850,261672,,0,11206212,59718,,,140254,379103,4089972,15768,11206212,59718 +"2021-01-05","MD",6082,5913,55,169,27542,27542,1771,175,,410,2575342,5670,,154692,,,,289758,289758,1956,0,,,19059,,352155,9388,,0,5894499,24882,,,173751,,2865100,7626,5894499,24882 +"2021-01-05","ME",369,363,9,6,1117,1117,191,10,,50,,0,13117,,,,21,26565,22448,597,0,560,4206,,,26305,11582,,0,1116407,6070,13689,89702,,,,0,1116407,6070 +"2021-01-05","MI",13608,12867,217,741,,,2758,0,,548,,0,,,7772844,,308,546642,504410,3031,0,,,,,638069,363611,,0,8410913,24546,440635,,,,,0,8410913,24546 +"2021-01-05","MN",5461,5275,18,186,22337,22337,842,157,4708,155,2614260,2758,,,,,,425261,410036,1573,0,,,,,,406667,5499303,14452,5499303,14452,,239412,,,3024296,4164,,0 +"2021-01-05","MO",5825,,263,,,,2657,0,,612,1667274,2837,101384,,3254779,,345,405589,405589,2632,0,13818,47199,,,449019,,,0,3711328,13972,115418,390860,107153,177319,2072863,5469,3711328,13972 +"2021-01-05","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,122,122,0,0,,,,,,29,,0,17551,0,,,,,17542,0,26131,0 +"2021-01-05","MS",4975,3902,91,1073,8260,8260,1518,0,,349,1183578,55920,,,,,223,225444,151895,1767,0,,,,,,182103,,0,1409022,57687,64321,486742,,,,0,1335473,67871 +"2021-01-05","MT",1005,,30,,3686,3686,212,36,,37,,0,,,,,22,83378,,714,0,,,,,,77449,,0,813082,2202,,,,,,0,813082,2202 +"2021-01-05","NC",6996,6552,55,444,,,3781,0,,813,,0,,,,,,575396,525813,5285,0,,,,,,,,0,6915111,24539,,278875,,,,0,6915111,24539 +"2021-01-05","ND",1336,,17,,3597,3597,93,21,529,15,286188,515,11953,,,,,93494,90228,254,0,1442,,,,,90281,1258364,1859,1258364,1859,13395,45871,,,379682,769,1329081,2033 +"2021-01-05","NE",1682,,10,,5321,5321,527,31,,,684715,645,,,1585220,,,169585,,585,0,,,,,194614,114249,,0,1781797,5889,,,,,854716,1231,1781797,5889 +"2021-01-05","NH",792,,11,,918,918,305,2,303,,490464,2199,,,,,,47992,35362,664,0,,,,,,40720,,0,1061333,5566,36057,46255,34909,,525826,2625,1061333,5566 +"2021-01-05","NJ",19382,17361,138,2021,49058,49058,3702,288,,679,7516254,206401,,,,,481,551419,499636,6271,0,,,,,,,,0,8067673,212672,,,,,,0,8015890,223176 +"2021-01-05","NM",2594,,20,,10163,10163,740,129,,,,0,,,,,,148499,,1184,0,,,,,,70737,,0,2023459,10700,,,,,,0,2023459,10700 +"2021-01-05","NV",3235,,29,,,,1867,0,,415,972862,2568,,,,,278,235455,235455,2423,0,,,,,,,2150738,10296,2150738,10296,,,,,1208317,4991,,0 +"2021-01-05","NY",30802,,154,,89995,89995,8590,0,,1392,,0,,,,,851,1041028,,12666,0,,,,,,,26135866,152402,26135866,152402,,,,,,0,,0 +"2021-01-05","OH",9247,8352,104,895,39650,39650,4446,538,6022,1054,,0,,,,,670,735003,656581,7580,0,,48135,,,682613,596221,,0,7882683,20052,,886882,,,,0,7882683,20052 +"2021-01-05","OK",2571,,19,,17554,17554,1909,61,,488,2429765,35447,,,2429765,,,308268,,1497,0,8943,,,,300206,271693,,0,2738033,36944,107663,,,,,0,2734583,43411 +"2021-01-05","OR",1506,,6,,6635,6635,520,137,,107,,0,,,2560960,,55,118453,,708,0,,,,,161817,,,0,2722777,70107,,,,,,0,2722777,70107 +"2021-01-05","PA",16546,,185,,,,5684,0,,1148,3315134,13948,,,,,700,673915,602875,8818,0,,,,,,471740,7794549,58741,7794549,58741,,,,,3918009,21227,,0 +"2021-01-05","PR",1562,1296,7,266,,,423,0,,69,305972,0,,,395291,,74,79319,74458,514,0,57221,,,,20103,70374,,0,385291,514,,,,,,0,415664,0 +"2021-01-05","RI",1870,,15,,6837,6837,409,50,,56,559689,2411,,,1946881,,40,93852,,1144,0,,,,,112563,,2059444,13069,2059444,13069,,,,,653541,3555,,0 +"2021-01-05","SC",5498,5068,14,430,14851,14851,2344,53,,447,2970408,13642,90335,,2882982,,241,328073,302003,2601,0,17062,52129,,,389429,157106,,0,3298481,16243,107397,437379,,,,0,3272411,15960 +"2021-01-05","SD",1513,,0,,5764,5764,270,22,,56,276286,573,,,,,35,101076,91455,433,0,,,,,97052,93529,,0,603392,932,,,,,377362,1006,603392,932 +"2021-01-05","TN",7267,6241,99,1026,14835,14835,3465,75,,816,,0,,,5066078,,469,617649,537128,5399,0,,86762,,,620389,539207,,0,5686467,13228,,666463,,,,0,5686467,13228 +"2021-01-05","TX",28219,,250,,,,13308,0,,3356,,0,,,,,,1843153,1626568,31630,0,93053,110302,,,1820127,1488189,,0,14289877,100710,798283,1257275,,,,0,14289877,100710 +"2021-01-05","UT",1312,,7,,11356,11356,578,116,1859,177,1320555,3579,,,2016750,650,,288951,,3318,0,,35188,,33769,278646,236196,,0,2295396,10709,,454560,,184310,1577868,5839,2295396,10709 +"2021-01-05","VA",5191,4572,59,619,18526,18526,2918,139,,558,,0,,,,,337,371913,309659,4377,0,17753,63223,,,382344,,4404641,21164,4404641,21164,189835,721628,,,,0,,0 +"2021-01-05","VI",24,,1,,,,,0,,,34642,276,,,,,,2055,,13,0,,,,,,1938,,0,36697,289,,,,,36784,321,,0 +"2021-01-05","VT",149,,5,,,,44,0,,8,261167,1311,,,,,,8038,7843,165,0,,,,,,5463,,0,719758,6897,,,,,269010,1477,719758,6897 +"2021-01-05","WA",3482,,23,,15160,15160,1117,49,,249,,0,,,,,109,256435,246376,1039,0,,,,,,,3935760,25788,3935760,25788,,,,,,0,,0 +"2021-01-05","WI",5366,4979,97,387,21796,21796,1123,216,2066,231,2370485,4805,,,,,,531890,491341,4019,0,,,,,,458650,5445697,22559,5445697,22559,,,,,2861826,8208,,0 +"2021-01-05","WV",1442,1270,46,172,,,806,0,,214,,0,,,,,92,93162,75114,1276,0,,,,,,64404,,0,1556241,10024,26320,,,,,0,1556241,10024 +"2021-01-05","WY",464,,26,,1168,1168,114,45,,,160827,154,,,462878,,,45569,38954,322,0,,,,,38891,43563,,0,515527,1193,,,,,199781,366,515527,1193 +"2021-01-04","AK",218,,3,,1033,1033,97,0,,,,0,,,1240213,,9,46812,,260,0,,,,,55869,,,0,1297498,3661,,,,,,0,1297498,3661 +"2021-01-04","AL",4878,4259,5,619,35430,35430,3064,1057,2445,,1601902,1632,,,,1399,,374095,301486,2161,0,,,,,,202137,,0,1903388,3318,,,88653,,1903388,3318,,0 +"2021-01-04","AR",3800,3178,51,622,11514,11514,1296,0,,412,1901966,4578,,,1901966,1234,212,234781,193655,1306,0,,,,48977,,207898,,0,2095621,5424,,,,254026,,0,2095621,5424 +"2021-01-04","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-04","AZ",9064,8173,3,891,39897,39897,4647,169,,1082,2404314,9906,,,,,782,561542,533275,5158,0,,,,,,,,0,5288658,31186,,,393204,,2937589,14822,5288658,31186 +"2021-01-04","CA",26635,,97,,,,22003,0,,4671,,0,,,,,,2420894,2420894,29633,0,,,,,,,,0,34127013,314227,,,,,,0,34127013,314227 +"2021-01-04","CO",4944,4290,10,654,18747,18747,1015,34,,,1836933,5058,254127,,,,,343435,329079,2185,0,32293,,,,,,4529774,27278,4529774,27278,287514,,,,2166012,7184,,0 +"2021-01-04","CT",6168,4997,69,1171,12257,12257,1111,0,,,,0,,,4402063,,,194636,183310,4516,0,,9609,,,230057,,,0,4638730,17584,,145571,,,,0,4638730,17584 +"2021-01-04","DC",797,,3,,,,251,0,,71,,0,,,,,40,29904,,140,0,,,,,,21127,921119,3119,921119,3119,,,,,362057,562,,0 +"2021-01-04","DE",937,834,7,103,,,432,0,,52,459087,1801,,,,,,60333,57842,849,0,,,,,61515,,1004179,8083,1004179,8083,,,,,519420,2650,,0 +"2021-01-04","FL",22415,,105,,64397,64397,7238,181,,,7520218,22720,578113,560932,12572955,,,1352222,1154585,10935,0,71851,,69600,,1760357,,16095888,75287,16095888,75287,650372,,630838,,8872440,33655,14397053,71627 +"2021-01-04","GA",10971,9900,7,1071,42595,42595,5514,112,7471,,,0,,,,,,696063,591106,5163,0,47231,,,,566075,,,0,5482790,20549,407192,,,,,0,5482790,20549 +"2021-01-04","GU",123,,0,,,,8,0,,2,89492,617,,,,,2,7344,7163,17,0,17,243,,,,7089,,0,96836,634,326,5739,,,,0,96655,641 +"2021-01-04","HI",289,289,0,,1775,1775,86,0,,11,,0,,,,,9,22527,22045,89,0,,,,,21849,,828410,2454,828410,2454,,,,,,0,,0 +"2021-01-04","IA",3992,,46,,,,571,0,,117,936813,824,,78128,1969809,,55,242808,242808,701,0,,45458,9087,42668,262936,244677,,0,1179621,1525,,875556,87255,184968,1181863,1526,2244098,4779 +"2021-01-04","ID",1448,1281,0,167,5706,5706,352,19,1030,84,431201,829,,,,,,142507,117898,308,0,,,,,,60820,,0,549099,1091,,52274,,,549099,1091,863660,2017 +"2021-01-04","IL",18412,16834,90,1578,,,3948,0,,816,,0,,,,,471,984880,,5059,0,,,,,,,,0,13530371,48254,,,,,,0,13530371,48254 +"2021-01-04","IN",8514,8150,39,364,35856,35856,2836,210,6292,649,2145368,3966,,,,,321,529688,,3617,0,,,,,602535,,,0,5814026,21329,,,,,2675056,7583,5814026,21329 +"2021-01-04","KS",2897,,18,,6955,6955,662,52,1876,180,792812,8051,,,,412,65,231317,,3572,0,,,,,,,,0,1024129,11623,,,,,1024129,11623,,0 +"2021-01-04","KY",2749,2559,26,190,13794,13794,1737,55,3092,456,,0,,,,,216,279143,224348,2317,0,7054,18289,,,189223,37455,,0,3224871,14067,102490,177192,,,,0,3224871,14067 +"2021-01-04","LA",7585,7198,48,387,,,1891,0,,,3943578,8170,,,,,207,322181,292184,1123,0,,,,,,263712,,0,4265759,9293,,217869,,,,0,4235762,9275 +"2021-01-04","MA",12671,12401,61,270,16098,16098,2339,0,,423,3698749,10838,,,,,258,392568,375455,4906,0,,,12915,,455201,261672,,0,11146494,55570,,,140254,374565,4074204,15196,11146494,55570 +"2021-01-04","MD",6027,5859,33,168,27367,27367,1751,171,,418,2569672,11291,,154692,,,,287802,287802,2483,0,,,19059,,349733,9383,,0,5869617,35491,,,173751,,2857474,13774,5869617,35491 +"2021-01-04","ME",360,354,1,6,1107,1107,180,8,,47,,0,13111,,,,20,25968,21998,376,0,557,4057,,,25950,11548,,0,1110337,6066,13680,87654,,,,0,1110337,6066 +"2021-01-04","MI",13391,12678,85,713,,,2698,0,,550,,0,,,7750868,,313,543611,502119,5490,0,,,,,635499,363611,,0,8386367,183614,439529,,,,,0,8386367,183614 +"2021-01-04","MN",5443,5259,13,184,22180,22180,810,85,4676,156,2611502,-121,,,,,,423688,408630,3144,0,,,,,,405556,5484851,8655,5484851,8655,,238315,,,3020132,2823,,0 +"2021-01-04","MO",5562,,0,,,,2448,0,,590,1664437,1246,101162,,3243629,,324,402957,402957,1196,0,13697,46369,,,446232,,,0,3697356,6125,115074,385815,106883,174459,2067394,2442,3697356,6125 +"2021-01-04","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,122,122,0,0,,,,,,29,,0,17551,0,,,,,17542,0,26131,0 +"2021-01-04","MS",4884,3859,13,1025,8260,8260,1432,115,,337,1127658,0,,,,,205,223677,151087,1616,0,,,,,,182103,,0,1351335,1616,60877,401956,,,,0,1267602,0 +"2021-01-04","MT",975,,3,,3650,3650,191,19,,39,,0,,,,,22,82664,,283,0,,,,,,76633,,0,810880,15084,,,,,,0,810880,15084 +"2021-01-04","NC",6941,6509,31,432,,,3635,0,,783,,0,,,,,,570111,521426,5187,0,,,,,,,,0,6890572,37920,,275518,,,,0,6890572,37920 +"2021-01-04","ND",1319,,2,,3576,3576,98,6,528,15,285673,179,11953,,,,,93240,90096,199,0,1442,,,,,90013,1256505,2084,1256505,2084,13395,43735,,,378913,379,1327048,2313 +"2021-01-04","NE",1672,,3,,5290,5290,511,20,,,684070,1038,,,1580032,,,169000,,738,0,,,,,193920,112856,,0,1775908,6110,,,,,853485,1781,1775908,6110 +"2021-01-04","NH",781,,1,,916,916,319,3,303,,488265,1800,,,,,,47328,34936,878,0,,,,,,40347,,0,1055767,4713,36037,46108,34891,,523201,2316,1055767,4713 +"2021-01-04","NJ",19244,17223,36,2021,48770,48770,3633,27,,664,7309853,0,,,,,476,545148,494317,2358,0,,,,,,,,0,7855001,2358,,,,,,0,7792714,0 +"2021-01-04","NM",2574,,23,,10034,10034,703,128,,,,0,,,,,,147315,,921,0,,,,,,69903,,0,2012759,6591,,,,,,0,2012759,6591 +"2021-01-04","NV",3206,,23,,,,1879,0,,423,970294,23032,,,,,268,233032,233032,1414,0,,,,,,,2140442,17649,2140442,17649,,,,,1203326,24446,,0 +"2021-01-04","NY",30648,,172,,89995,89995,8251,0,,1357,,0,,,,,843,1028362,,11209,0,,,,,,,25983464,134360,25983464,134360,,,,,,0,,0 +"2021-01-04","OH",9143,8262,67,881,39112,39112,4405,314,5978,1073,,0,,,,,691,727423,650929,5942,0,,47486,,,679003,585091,,0,7862631,30821,,882995,,,,0,7862631,30821 +"2021-01-04","OK",2552,,5,,17493,17493,1910,52,,498,2394318,0,,,2394318,,,306771,,2699,0,8943,,,,291996,267573,,0,2701089,2699,107663,,,,,0,2691172,0 +"2021-01-04","OR",1500,,8,,6498,6498,524,0,,119,,0,,,2496394,,60,117745,,1397,0,,,,,156276,,,0,2652670,0,,,,,,0,2652670,0 +"2021-01-04","PA",16361,,66,,,,5630,0,,1182,3301186,3874,,,,,678,665097,595596,3226,0,,,,,,465567,7735808,20299,7735808,20299,,,,,3896782,6095,,0 +"2021-01-04","PR",1555,1289,10,266,,,421,0,,77,305972,0,,,395291,,74,78805,73957,636,0,56988,,,,20103,69699,,0,384777,636,,,,,,0,415664,0 +"2021-01-04","RI",1855,,12,,6787,6787,415,281,,53,557278,2111,,,1935122,,40,92708,,633,0,,,,,111253,,2046375,8691,2046375,8691,,,,,649986,2744,,0 +"2021-01-04","SC",5484,5056,15,428,14798,14798,2155,71,,419,2956766,17008,90229,,2869765,,215,325472,299685,3803,0,17013,51014,,,386686,156090,,0,3282238,20811,107242,432727,,,,0,3256451,20600 +"2021-01-04","SD",1513,,0,,5742,5742,268,10,,55,275713,290,,,,,37,100643,91113,111,0,,,,,96881,93099,,0,602460,1234,,,,,376356,401,602460,1234 +"2021-01-04","TN",7168,6182,143,986,14760,14760,3407,112,,825,,0,,,5055608,,471,612250,534474,3953,0,,83849,,,617631,530494,,0,5673239,14598,,650344,,,,0,5673239,14598 +"2021-01-04","TX",27969,,52,,,,12961,0,,3317,,0,,,,,,1811523,1598713,18182,0,92554,108130,,,1799060,1464746,,0,14189167,135457,795422,1241302,,,,0,14189167,135457 +"2021-01-04","UT",1305,,4,,11240,11240,551,81,1837,167,1316976,3667,,,2008430,647,,285633,,2160,0,,34033,,32643,276257,234298,,0,2284687,9849,,441464,,180295,1572029,5687,2284687,9849 +"2021-01-04","VA",5132,4522,8,610,18387,18387,2765,77,,563,,0,,,,,339,367536,306617,3771,0,17687,60888,,,378485,,4383477,17997,4383477,17997,189476,700852,,,,0,,0 +"2021-01-04","VI",23,,0,,,,,0,,,34366,0,,,,,,2042,,1,0,,,,,,1920,,0,36408,1,,,,,36463,1,,0 +"2021-01-04","VT",144,,4,,,,41,0,,4,259856,559,,,,,,7873,7677,80,0,,,,,,5361,,0,712861,1757,,,,,267533,636,712861,1757 +"2021-01-04","WA",3459,,-2,,15111,15111,1138,363,,248,,0,,,,,116,255396,245381,8644,0,,,,,,,3909972,73152,3909972,73152,,,,,,0,,0 +"2021-01-04","WI",5269,4884,8,385,21580,21580,1069,51,2058,225,2365680,2505,,,,,,527871,487938,1626,0,,,,,,456529,5423138,12009,5423138,12009,,,,,2853618,3912,,0 +"2021-01-04","WV",1396,1237,20,159,,,799,0,,205,,0,,,,,91,91886,74329,828,0,,,,,,63128,,0,1546217,6058,26227,,,,,0,1546217,6058 +"2021-01-04","WY",438,,0,,1123,1123,114,9,,,160673,1145,,,462878,,,45247,38742,372,0,,,,,38891,43420,,0,514334,12550,,,,,199415,1877,514334,12550 +"2021-01-03","AK",215,215,0,,1033,1033,87,3,,,,0,,,1236758,,7,46552,,290,0,,,,,55664,,,0,1293837,3488,,,,,,0,1293837,3488 +"2021-01-03","AL",4873,4255,1,618,34373,34373,2885,0,2442,,1600270,6555,,,,1399,,371934,299800,2476,0,,,,,,202137,,0,1900070,8602,,,88557,,1900070,8602,,0 +"2021-01-03","AR",3749,3137,20,612,11514,11514,1234,27,,405,1897388,8766,,,1897388,1234,194,233475,192809,2033,0,,,,48432,,205462,,0,2090197,10409,,,,252221,,0,2090197,10409 +"2021-01-03","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-03","AZ",9061,8168,0,893,39728,39728,4557,289,,1081,2394408,1072,,,,,762,556384,528359,17234,0,,,,,,,,0,5257472,38751,,,392432,,2922767,17384,5257472,38751 +"2021-01-03","CA",26538,,181,,,,21510,0,,4613,,0,,,,,,2391261,2391261,45352,0,,,,,,,,0,33812786,421344,,,,,,0,33812786,421344 +"2021-01-03","CO",4934,4280,22,654,18713,18713,991,35,,,1831875,4869,252963,,,,,341250,326953,2078,0,32004,,,,,,4502496,27749,4502496,27749,286420,,,,2158828,6876,,0 +"2021-01-03","CT",6099,4937,0,1162,12257,12257,1056,0,,,,0,,,4386384,,,190120,178949,0,0,,9340,,,228170,,,0,4621146,22317,,137821,,,,0,4621146,22317 +"2021-01-03","DC",794,,2,,,,245,0,,69,,0,,,,,35,29764,,255,0,,,,,,21072,918000,6622,918000,6622,,,,,361495,1471,,0 +"2021-01-03","DE",930,828,0,102,,,421,0,,53,457286,1324,,,,,,59484,57035,611,0,,,,,60849,,996096,4778,996096,4778,,,,,516770,1935,,0 +"2021-01-03","FL",22310,,100,,64216,64216,6969,187,,,7497498,24021,578113,560932,12515766,,,1341287,1147550,10228,0,71851,,69600,,1746256,,16020601,69851,16020601,69851,650372,,630838,,8838785,34249,14325426,66554 +"2021-01-03","GA",10964,9893,4,1071,42483,42483,5304,56,7466,,,0,,,,,,690900,587076,5778,0,47080,,,,561892,,,0,5462241,25253,406672,,,,,0,5462241,25253 +"2021-01-03","GU",123,,0,,,,11,0,,2,88875,0,,,,,2,7327,7149,1,0,17,239,,,,7047,,0,96202,1,325,5645,,,,0,96014,0 +"2021-01-03","HI",289,289,0,,1775,1775,86,0,,11,,0,,,,,9,22438,21956,149,0,,,,,21766,,825956,3151,825956,3151,,,,,,0,,0 +"2021-01-03","IA",3946,,0,,,,577,0,,120,935989,1311,,78143,1965775,,52,242107,242107,865,0,,45041,9083,42273,262206,244021,,0,1178096,2176,,872129,87266,184153,1180337,2173,2239319,5725 +"2021-01-03","ID",1448,1281,12,167,5687,5687,352,57,1024,84,430372,1604,,,,,,142199,117636,1122,0,,,,,,60164,,0,548008,2523,,52274,,,548008,2523,861643,1792 +"2021-01-03","IL",18322,16755,105,1567,,,3817,0,,798,,0,,,,,462,979821,,4469,0,,,,,,,,0,13482117,45465,,,,,,0,13482117,45465 +"2021-01-03","IN",8475,8111,65,364,35646,35646,2714,239,6251,648,2141402,3796,,,,,326,526071,,2981,0,,,,,598551,,,0,5792697,23424,,,,,2667473,6777,5792697,23424 +"2021-01-03","KS",2879,,0,,6903,6903,825,0,1862,221,784761,0,,,,412,97,227745,,0,0,,,,,,,,0,1012506,0,,,,,1012506,0,,0 +"2021-01-03","KY",2723,2533,25,190,13739,13739,1677,53,3081,421,,0,,,,,196,276826,222545,2855,0,7003,17936,,,187334,37375,,0,3210804,0,102295,175031,,,,0,3210804,0 +"2021-01-03","LA",7537,7162,49,375,,,1833,0,,,3935408,36501,,,,,204,321058,291079,5783,0,,,,,,263712,,0,4256466,42284,,217582,,,,0,4226487,42103 +"2021-01-03","MA",12610,12341,108,269,16098,16098,2291,0,,416,3687911,8542,,,,,258,387662,371097,3481,0,,,12915,,450251,261672,,0,11090924,44831,,,140254,370296,4059008,11652,11090924,44831 +"2021-01-03","MD",5994,5826,27,168,27196,27196,1709,145,,412,2558381,7841,,154692,,,,285319,285319,2148,0,,,19059,,346444,9378,,0,5834126,26460,,,173751,,2843700,9989,5834126,26460 +"2021-01-03","ME",359,353,1,6,1099,1099,180,8,,47,,0,13031,,,,20,25592,21693,347,0,545,3802,,,25669,11465,,0,1104271,3134,13588,83389,,,,0,1104271,3134 +"2021-01-03","MI",13306,12598,0,708,,,2758,0,,629,,0,,,7584454,,368,538121,497127,0,0,,,,,618299,363611,,0,8202753,0,427428,,,,,0,8202753,0 +"2021-01-03","MN",5430,5248,53,182,22095,22095,895,111,4658,196,2611623,31920,,,,,,420544,405686,2712,0,,,,,,403419,5476196,88260,5476196,88260,,237044,,,3017309,34456,,0 +"2021-01-03","MO",5562,,19,,,,2701,0,,627,1663191,2519,98986,,3238815,,350,401761,401761,2305,0,13529,45684,,,444942,,,0,3691231,11566,112730,381993,104791,171763,2064952,4824,3691231,11566 +"2021-01-03","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,122,122,0,0,,,,,,29,,0,17551,0,,,,,17542,0,26131,0 +"2021-01-03","MS",4871,3857,31,1014,8145,8145,1456,0,,346,1127658,0,,,,,219,222061,150385,1784,0,,,,,,167263,,0,1349719,1784,60877,401956,,,,0,1267602,0 +"2021-01-03","MT",972,,1,,3631,3631,192,13,,39,,0,,,,,22,82381,,437,0,,,,,,76501,,0,795796,3017,,,,,,0,795796,3017 +"2021-01-03","NC",6910,6482,18,428,,,3576,0,,776,,0,,,,,,564924,516657,6487,0,,,,,,,,0,6852652,45161,,274061,,,,0,6852652,45161 +"2021-01-03","ND",1317,,0,,3570,3570,98,9,527,16,285494,68,11953,,,,,93041,89955,150,0,1442,,,,,89879,1254421,526,1254421,526,13395,42834,,,378534,217,1324735,559 +"2021-01-03","NE",1669,,1,,5270,5270,503,5,,,683032,795,,,1574795,,,168262,,546,0,,,,,193046,105963,,0,1769798,3694,,,,,851704,1342,1769798,3694 +"2021-01-03","NH",780,,11,,913,913,325,3,302,,486465,6875,,,,,,46450,34420,1266,0,,,,,,39574,,0,1051054,18125,36016,46013,34874,,520885,4219,1051054,18125 +"2021-01-03","NJ",19208,17187,21,2021,48743,48743,3521,107,,669,7309853,0,,,,,462,542790,492042,4088,0,,,,,,,,0,7852643,4088,,,,,,0,7792714,0 +"2021-01-03","NM",2551,,17,,9906,9906,716,92,,,,0,,,,,,146394,,1015,0,,,,,,68876,,0,2006168,10839,,,,,,0,2006168,10839 +"2021-01-03","NV",3183,,32,,,,1871,0,,398,947262,2237,,,,,273,231618,231618,2747,0,,,,,,,2122793,11234,2122793,11234,,,,,1178880,4984,,0 +"2021-01-03","NY",30476,,139,,89995,89995,7963,0,,1344,,0,,,,,815,1017153,,11368,0,,,,,,,25849104,142345,25849104,142345,,,,,,0,,0 +"2021-01-03","OH",9076,8199,59,877,38798,38798,4237,165,5933,1054,,0,,,,,684,721481,646474,6808,0,,46691,,,674886,579583,,0,7831810,36600,,878565,,,,0,7831810,36600 +"2021-01-03","OK",2547,,20,,17441,17441,1910,194,,498,2394318,0,,,2394318,,,304072,,8017,0,8943,,,,291996,265293,,0,2698390,8017,107663,,,,,0,2691172,0 +"2021-01-03","OR",1492,,2,,6498,6498,524,0,,119,,0,,,2496394,,60,116348,,1009,0,,,,,156276,,,0,2652670,0,,,,,,0,2652670,0 +"2021-01-03","PA",16295,,56,,,,5529,0,,1149,3297312,7804,,,,,674,661871,593375,4579,0,,,,,,453531,7715509,40499,7715509,40499,,,,,3890687,11966,,0 +"2021-01-03","PR",1545,1279,19,266,,,415,0,,74,305972,0,,,395291,,72,78169,73399,237,0,56613,,,,20103,68661,,0,384141,237,,,,,,0,415664,0 +"2021-01-03","RI",1843,,10,,6506,6506,426,0,,61,555167,2178,,,1927161,,47,92075,,888,0,,,,,110523,,2037684,10629,2037684,10629,,,,,647242,3066,,0 +"2021-01-03","SC",5469,5042,84,427,14727,14727,2072,141,,414,2939758,48221,90059,,2853298,,217,321669,296093,8951,0,16912,50632,,,382553,154943,,0,3261427,57172,106971,432080,,,,0,3235851,56538 +"2021-01-03","SD",1513,,12,,5732,5732,262,30,,54,275423,1306,,,,,33,100532,91027,703,0,,,,,96685,93031,,0,601226,1259,,,,,375955,2009,601226,1259 +"2021-01-03","TN",7025,6070,55,955,14648,14648,3371,41,,792,,0,,,5044159,,467,608297,531535,4165,0,,82663,,,614482,526966,,0,5658641,15364,,646912,,,,0,5658641,15364 +"2021-01-03","TX",27917,,50,,,,12563,0,,3184,,0,,,,,,1793341,1582615,16095,0,92091,103982,,,1770143,1451846,,0,14053710,48073,792757,1210365,,,,0,14053710,48073 +"2021-01-03","UT",1301,,7,,11159,11159,548,58,1830,164,1313309,2359,,,2000734,643,,283473,,1819,0,,33680,,32296,274104,232355,,0,2274838,6651,,439364,,179363,1566342,3782,2274838,6651 +"2021-01-03","VA",5124,4516,7,608,18310,18310,2708,70,,557,,0,,,,,344,363765,303881,5010,0,17625,59684,,,375690,,4365480,27541,4365480,27541,189200,695855,,,,0,,0 +"2021-01-03","VI",23,,0,,,,,0,,,34366,190,,,,,,2041,,5,0,,,,,,1920,,0,36407,195,,,,,36462,196,,0 +"2021-01-03","VT",140,140,1,,,,31,0,,2,259297,767,,,,,,7793,7600,104,0,,,,,,5272,,0,711104,2858,,,,,266897,866,711104,2858 +"2021-01-03","WA",3461,,0,,14748,14748,1138,0,,248,,0,,,,,118,246752,237165,0,0,,,,,,,3836820,0,3836820,0,,,,,,0,,0 +"2021-01-03","WI",5261,4875,5,386,21529,21529,1018,80,2057,230,2363175,2142,,,,,,526245,486531,2593,0,,,,,,454850,5411129,8455,5411129,8455,,,,,2849706,4588,,0 +"2021-01-03","WV",1376,1221,3,155,,,805,0,,202,,0,,,,,90,91058,73829,1731,0,,,,,,62264,,0,1540159,7455,26212,,,,,0,1540159,7455 +"2021-01-03","WY",438,,0,,1114,1114,99,8,,,159528,0,,,462878,,,44875,38440,302,0,,,,,38891,43068,,0,501784,0,,,,,197538,0,501784,0 +"2021-01-02","AK",215,215,9,,1030,1030,77,7,,,,0,,,1233474,,6,46262,,801,0,,,,,55462,,,0,1290349,14599,,,,,,0,1290349,14599 +"2021-01-02","AL",4872,4254,0,618,34373,34373,2815,0,2440,,1593715,2965,,,,1398,,369458,297753,3711,0,,,,,,202137,,0,1891468,6252,,,88383,,1891468,6252,,0 +"2021-01-02","AR",3729,3121,18,608,11487,11487,1216,37,,393,1888622,10107,,,1888622,1231,197,231442,191166,2000,0,,,,47972,,203701,,0,2079788,11704,,,,251156,,0,2079788,11704 +"2021-01-02","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-02","AZ",9061,8166,46,895,39439,39439,4484,593,,1074,2393336,18266,,,,,761,539150,512047,8883,0,,,,,,,,0,5218721,63391,,,391561,,2905383,26515,5218721,63391 +"2021-01-02","CA",26357,,386,,,,21213,0,,4606,,0,,,,,,2345909,2345909,53341,0,,,,,,,,0,33391442,333131,,,,,,0,33391442,333131 +"2021-01-02","CO",4912,4259,39,653,18678,18678,1016,27,,,1827006,4539,251504,,,,,339172,324946,2011,0,31514,,,,,,4474747,30541,4474747,30541,284967,,,,2151952,6541,,0 +"2021-01-02","CT",6099,4937,104,1162,12257,12257,1056,0,,,,0,,,4366522,,,190120,178949,4412,0,,9340,,,225736,,,0,4598829,5369,,137821,,,,0,4598829,5369 +"2021-01-02","DC",792,,4,,,,237,0,,70,,0,,,,,33,29509,,257,0,,,,,,21002,911378,7076,911378,7076,,,,,360024,1473,,0 +"2021-01-02","DE",930,828,0,102,,,412,0,,59,455962,2102,,,,,,58873,56455,809,0,,,,,60390,,991318,6712,991318,6712,,,,,514835,2911,,0 +"2021-01-02","FL",22210,,220,,64029,64029,6701,288,,,7473477,68413,578113,560932,12462940,,,1331059,1141210,30531,0,71851,,69600,,1732821,,15950750,247151,15950750,247151,650372,,630838,,8804536,98944,14258872,217713 +"2021-01-02","GA",10960,9891,2,1069,42427,42427,5101,65,7457,,,0,,,,,,685122,581999,7533,0,46987,,,,556630,,,0,5436988,35934,406396,,,,,0,5436988,35934 +"2021-01-02","GU",123,,1,,,,13,0,,3,88875,0,,,,,2,7326,7148,0,0,17,239,,,,7047,,0,96201,0,325,5645,,,,0,96014,0 +"2021-01-02","HI",289,289,0,,1775,1775,86,0,,11,,0,,,,,9,22289,21807,169,0,,,,,21608,,822805,5994,822805,5994,,,,,,0,,0 +"2021-01-02","IA",3946,,48,,,,572,0,,119,934678,1038,,78109,1960998,,60,241242,241242,476,0,,44837,9062,42087,261270,243214,,0,1175920,1514,,870488,87211,183907,1178164,1513,2233594,4690 +"2021-01-02","ID",1436,1269,0,167,5630,5630,375,0,1018,85,428768,0,,,,,,141077,116717,0,0,,,,,,58649,,0,545485,0,,52274,,,545485,0,859851,0 +"2021-01-02","IL",18217,16674,44,1543,,,3799,0,,783,,0,,,,,458,975352,,4762,0,,,,,,,,0,13436652,61987,,,,,,0,13436652,61987 +"2021-01-02","IN",8410,8055,39,355,35407,35407,2655,197,6206,663,2137606,5415,,,,,342,523090,,5317,0,,,,,595137,,,0,5769273,39230,,,,,2660696,10732,5769273,39230 +"2021-01-02","KS",2879,,0,,6903,6903,825,0,1862,221,784761,0,,,,412,97,227745,,0,0,,,,,,,,0,1012506,0,,,,,1012506,0,,0 +"2021-01-02","KY",2698,2513,75,185,13686,13686,1635,198,3070,428,,0,,,,,211,273971,220231,8709,0,7003,17936,,,187334,37273,,0,3210804,62198,102295,175031,,,,0,3210804,62198 +"2021-01-02","LA",7488,7115,0,373,,,1731,0,,,3898907,0,,,,,202,315275,285477,0,0,,,,,,263712,,0,4214182,0,,215765,,,,0,4184384,0 +"2021-01-02","MA",12502,12236,79,266,16098,16098,2280,0,,412,3679369,21204,,,,,246,384181,367987,9003,0,,,12915,,446675,261672,,0,11046093,101394,,,140254,366370,4047356,29746,11046093,101394 +"2021-01-02","MD",5967,5799,25,168,27051,27051,1692,232,,415,2550540,12398,,154692,,,,283171,283171,2952,0,,,19059,,343848,9374,,0,5807666,46132,,,173751,,2833711,15350,5807666,46132 +"2021-01-02","ME",358,352,11,6,1091,1091,188,26,,48,,0,13031,,,,19,25245,21412,1044,0,545,3785,,,25414,11438,,0,1101137,5751,13588,83283,,,,0,1101137,5751 +"2021-01-02","MI",13306,12598,288,708,,,2758,0,,629,,0,,,7584454,,368,538121,497127,9500,0,,,,,618299,363611,,0,8202753,0,427428,,,,,0,8202753,0 +"2021-01-02","MN",5377,5201,54,176,21984,21984,895,120,4638,196,2579703,7857,,,,,,417832,403150,2530,0,,,,,,398199,5387936,36557,5387936,36557,,228631,,,2982853,10049,,0 +"2021-01-02","MO",5543,,3,,,,2804,0,,653,1660672,3291,97967,,3229749,,357,399456,399456,2157,0,13399,44988,,,442478,,,0,3679665,13685,111581,378140,103769,169374,2060128,5448,3679665,13685 +"2021-01-02","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,122,122,0,0,,,,,,29,,0,17551,0,,,,,17542,0,26131,0 +"2021-01-02","MS",4840,3840,24,1000,8145,8145,1456,0,,346,1127658,0,,,,,219,220277,149595,1891,0,,,,,,167263,,0,1347935,1891,60877,401956,,,,0,1267602,0 +"2021-01-02","MT",971,,10,,3618,3618,194,50,,39,,0,,,,,23,81944,,389,0,,,,,,75974,,0,792779,1190,,,,,,0,792779,1190 +"2021-01-02","NC",6892,6467,144,425,,,3479,0,,783,,0,,,,,,558437,510515,18892,0,,,,,,,,0,6807491,66243,,272296,,,,0,6807491,66243 +"2021-01-02","ND",1317,,28,,3561,3561,92,9,527,16,285426,398,11953,,,,,92891,89829,396,0,1442,,,,,89582,1253895,4098,1253895,4098,13395,41922,,,378317,1407,1324176,4507 +"2021-01-02","NE",1668,,17,,5265,5265,517,11,,,682237,1378,,,1571723,,,167716,,918,0,,,,,192429,109705,,0,1766104,10284,,,,,850362,2295,1766104,10284 +"2021-01-02","NH",769,,10,,910,910,335,8,300,,479590,0,,,,,,45184,32696,1156,0,,,,,,37947,,0,1032929,0,35841,45901,34799,,516666,4380,1032929,0 +"2021-01-02","NJ",19187,17166,27,2021,48636,48636,3497,64,,678,7309853,0,,,,,465,538702,488372,5799,0,,,,,,,,0,7848555,5799,,,,,,0,7792714,0 +"2021-01-02","NM",2534,,32,,9814,9814,662,58,,,,0,,,,,,145379,,1237,0,,,,,,67573,,0,1995329,11822,,,,,,0,1995329,11822 +"2021-01-02","NV",3151,,5,,,,1871,0,,398,945025,4212,,,,,273,228871,228871,1825,0,,,,,,,2111559,15781,2111559,15781,,,,,1173896,6037,,0 +"2021-01-02","NY",30337,,129,,89995,89995,7814,0,,1321,,0,,,,,786,1005785,,15074,0,,,,,,,25706759,202446,25706759,202446,,,,,,0,,0 +"2021-01-02","OH",9017,8154,55,863,38633,38633,4102,299,5910,1036,,0,,,,,696,714673,640812,14293,0,,46536,,,669869,573641,,0,7795210,49290,,875922,,,,0,7795210,49290 +"2021-01-02","OK",2527,,38,,17247,17247,1910,188,,498,2394318,0,,,2394318,,,296055,,5119,0,8502,,,,291996,259841,,0,2690373,5119,106188,,,,,0,2691172,0 +"2021-01-02","OR",1490,,13,,6498,6498,524,0,,119,,0,,,2496394,,60,115339,,1430,0,,,,,156276,,,0,2652670,0,,,,,,0,2652670,0 +"2021-01-02","PA",16239,,25,,,,5460,0,,1159,3289508,14303,,,,,649,657292,589213,9253,0,,,,,,453531,7675010,67346,7675010,67346,,,,,3878721,22256,,0 +"2021-01-02","PR",1526,1261,5,265,,,391,0,,73,305972,0,,,395291,,72,77932,73162,878,0,56546,,,,20103,68340,,0,383904,878,,,,,,0,415664,0 +"2021-01-02","RI",1833,,10,,6506,6506,426,0,,61,552989,1961,,,1917525,,47,91187,,783,0,,,,,109530,,2027055,11599,2027055,11599,,,,,644176,2744,,0 +"2021-01-02","SC",5385,4968,89,417,14586,14586,1994,196,,413,2891537,26023,89362,,2806376,,214,312718,287776,5211,0,16606,48175,,,372937,152535,,0,3204255,31234,105968,416971,,,,0,3179313,30375 +"2021-01-02","SD",1501,,13,,5702,5702,282,30,,59,274117,641,,,,,40,99829,90544,665,0,,,,,96498,92595,,0,599967,2681,,,,,373946,1306,599967,2681 +"2021-01-02","TN",6970,6029,63,941,14607,14607,3303,76,,791,,0,,,5032085,,453,604132,528509,17330,0,,81422,,,611192,523089,,0,5643277,35328,,644293,,,,0,5643277,35328 +"2021-01-02","TX",27867,,96,,,,12319,0,,3072,,0,,,,,,1777246,1568034,4763,0,91676,103675,,,1759509,1443061,,0,14005637,156847,791133,1207649,,,,0,14005637,156847 +"2021-01-02","UT",1294,,25,,11101,11101,552,145,1828,158,1310950,8459,,,1995593,643,,281654,,5042,0,,33317,,31944,272594,230287,,0,2268187,22884,,436906,,178343,1562560,12829,2268187,22884 +"2021-01-02","VA",5117,4509,36,608,18240,18240,2710,74,,557,,0,,,,,335,358755,299963,3989,0,17481,58336,,,371576,,4337939,46619,4337939,46619,188540,690483,,,,0,,0 +"2021-01-02","VI",23,,0,,,,,0,,,34176,0,,,,,,2036,,0,0,,,,,,1901,,0,36212,0,,,,,36266,0,,0 +"2021-01-02","VT",139,139,3,,,,27,0,,5,258530,2846,,,,,,7689,7501,277,0,,,,,,5188,,0,708246,10541,,,,,266031,3107,708246,10541 +"2021-01-02","WA",3461,,0,,14748,14748,1138,0,,248,,0,,,,,118,246752,237165,0,0,,,,,,,3836820,0,3836820,0,,,,,,0,,0 +"2021-01-02","WI",5256,4870,2,386,21449,21449,1018,49,2053,230,2361033,3976,,,,,,523652,484085,1129,0,,,,,,452502,5402674,21846,5402674,21846,,,,,2845118,5054,,0 +"2021-01-02","WV",1373,1218,12,155,,,810,0,,205,,0,,,,,92,89327,72463,1507,0,,,,,,61120,,0,1532704,16282,26120,,,,,0,1532704,16282 +"2021-01-02","WY",438,,0,,1106,1106,95,4,,,159528,0,,,462878,,,44573,38163,164,0,,,,,38891,43037,,0,501784,0,,,,,197538,0,501784,0 +"2021-01-01","AK",206,206,0,,1023,1023,79,0,,,,0,,,1219592,,6,45461,,0,0,,,,,54763,,,0,1275750,0,,,,,,0,1275750,0 +"2021-01-01","AL",4872,4254,45,618,34373,34373,2815,189,2440,,1590750,7331,,,,1398,,365747,294466,4521,0,,,,,,202137,,0,1885216,11216,,,87982,,1885216,11216,,0 +"2021-01-01","AR",3711,3106,35,605,11450,11450,1185,92,,398,1878515,13811,,,1878515,1230,205,229442,189569,4304,0,,,,47452,,201774,,0,2068084,16596,,,,249911,,0,2068084,16596 +"2021-01-01","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2021-01-01","AZ",9015,8128,151,887,38846,38846,4501,1589,,1072,2375070,35435,,,,,759,530267,503798,10060,0,,,,,,,,0,5155330,95560,,,391040,,2878868,44116,5155330,95560 +"2021-01-01","CA",25971,,585,,,,21433,0,,4618,,0,,,,,,2292568,2292568,47189,0,,,,,,,,0,33058311,202829,,,,,,0,33058311,202829 +"2021-01-01","CO",4873,4221,59,652,18651,18651,1044,53,,,1822467,6898,249633,,,,,337161,322944,3064,0,31022,,,,,,4444206,37539,4444206,37539,283018,,,,2145411,9821,,0 +"2021-01-01","CT",5995,4854,0,1141,12257,12257,1136,0,,,,0,,,4361730,,,185708,174679,0,0,,9121,,,225168,,,0,4593460,28386,,132201,,,,0,4593460,28386 +"2021-01-01","DC",788,,2,,,,226,0,,63,,0,,,,,31,29252,,269,0,,,,,,20941,904302,6863,904302,6863,,,,,358551,1413,,0 +"2021-01-01","DE",930,828,4,102,,,412,0,,58,453860,1231,,,,,,58064,55670,608,0,,,,,59741,,984606,6402,984606,6402,,,,,511924,1839,,0 +"2021-01-01","FL",21990,,0,,63741,63741,6454,0,,,7405064,0,578113,560932,12286661,,,1300528,1117552,0,0,71851,,69600,,1692583,,15703599,0,15703599,0,650372,,630838,,8705592,0,14041159,0 +"2021-01-01","GA",10958,9889,24,1069,42362,42362,4890,278,7448,,,0,,,,,,677589,575395,11137,0,46536,,,,549842,,,0,5401054,51664,404968,,,,,0,5401054,51664 +"2021-01-01","GU",122,,0,,,,13,0,,3,88875,0,,,,,2,7326,7148,9,0,17,239,,,,7047,,0,96201,9,325,5645,,,,0,96014,0 +"2021-01-01","HI",289,289,1,,1775,1775,86,7,,11,,0,,,,,9,22120,21638,288,0,,,,,21470,,816811,4473,816811,4473,,,,,,0,,0 +"2021-01-01","IA",3898,,7,,,,575,0,,117,933640,1594,,78084,1956842,,63,240766,240766,1593,0,,44622,9050,41898,260753,241229,,0,1174406,3187,,867217,87174,183464,1176651,3184,2228904,10751 +"2021-01-01","ID",1436,1269,33,167,5630,5630,375,63,1018,85,428768,1350,,,,,,141077,116717,1213,0,,,,,,58649,,0,545485,2217,,52274,,,545485,2217,859851,4284 +"2021-01-01","IL",18173,16647,195,1526,,,3992,0,,808,,0,,,,,464,970590,,7201,0,,,,,,,,0,13374665,97222,,,,,,0,13374665,97222 +"2021-01-01","IN",8371,8016,108,355,35210,35210,2786,211,6194,676,2132191,6981,,,,,348,517773,,6288,0,,,,,589048,,,0,5730043,48333,,,,,2649964,13269,5730043,48333 +"2021-01-01","KS",2879,,138,,6903,6903,825,143,1862,221,784761,5962,,,,412,97,227745,,5312,0,,,,,,,,0,1012506,11274,,,,,1012506,11274,,0 +"2021-01-01","KY",2623,2446,0,177,13488,13488,1673,0,3045,433,,0,,,,,234,265262,213256,0,0,6863,16918,,,182341,36740,,0,3148606,0,101804,164469,,,,0,3148606,0 +"2021-01-01","LA",7488,7115,0,373,,,1731,0,,,3898907,0,,,,,202,315275,285477,0,0,,,,,,263712,,0,4214182,0,,215765,,,,0,4184384,0 +"2021-01-01","MA",12423,12157,0,266,16098,16098,2271,0,,417,3658165,0,,,,,240,375178,359445,0,0,,,12915,,437155,261672,,0,10944699,0,,,140254,360840,4017610,0,10944699,0 +"2021-01-01","MD",5942,5774,47,168,26819,26819,1734,183,,388,2538142,12336,,154692,,,,280219,280219,3557,0,,,19059,,340048,9358,,0,5761534,53504,,,173751,,2818361,15893,5761534,53504 +"2021-01-01","ME",347,341,0,6,1065,1065,182,0,,46,,0,13031,,,,18,24201,20637,0,0,545,3745,,,24975,11374,,0,1095386,9404,13588,83034,,,,0,1095386,9404 +"2021-01-01","MI",13018,12333,0,685,,,2758,0,,629,,0,,,7584454,,368,528621,488144,0,0,,,,,618299,318389,,0,8202753,0,427428,,,,,0,8202753,0 +"2021-01-01","MN",5323,5151,0,172,21864,21864,895,0,4620,196,2571846,0,,,,,,415302,400958,0,0,,,,,,397080,5351379,0,5351379,0,,223583,,,2972804,0,,0 +"2021-01-01","MO",5540,,21,,,,2779,0,,648,1657381,5079,97712,,3218368,,364,397299,397299,4729,0,13267,44239,,,440219,,,0,3665980,27742,111194,372178,103463,166516,2054680,9808,3665980,27742 +"2021-01-01","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,122,122,0,0,,,,,,29,,0,17551,0,,,,,17542,0,26131,0 +"2021-01-01","MS",4816,3834,29,982,8145,8145,1456,0,,346,1127658,0,,,,,219,218386,148911,2575,0,,,,,,167263,,0,1346044,2575,60877,401956,,,,0,1267602,0 +"2021-01-01","MT",961,,0,,3568,3568,203,0,,39,,0,,,,,23,81555,,0,0,,,,,,74991,,0,791589,0,,,,,,0,791589,0 +"2021-01-01","NC",6748,6342,0,406,,,3472,0,,774,,0,,,,,,539545,493951,0,0,,,,,,,,0,6741248,72923,,262773,,,,0,6741248,72923 +"2021-01-01","ND",1289,,0,,3552,3552,94,0,524,16,285028,1775,11953,,,,,92495,89525,0,0,1442,,,,,89314,1249797,5489,1249797,5489,13395,41599,,,376910,0,1319669,6109 +"2021-01-01","NE",1651,,40,,5254,5254,534,34,,,680859,1624,,,1562488,,,166798,,1501,0,,,,,191386,107694,,0,1755820,12101,,,,,848067,3125,1755820,12101 +"2021-01-01","NH",759,,0,,902,902,317,0,300,,479590,0,,,,,,44028,32696,0,0,,,,,,37350,,0,1032929,0,35841,45901,34671,,512286,0,1032929,0 +"2021-01-01","NJ",19160,17139,118,2021,48572,48572,3625,1246,,693,7309853,51438,,,,,471,532903,482861,5918,0,,,,,,,,0,7842756,57356,,,,,,0,7792714,56939 +"2021-01-01","NM",2502,,25,,9756,9756,791,67,,,,0,,,,,,144142,,1278,0,,,,,,66638,,0,1983507,13295,,,,,,0,1983507,13295 +"2021-01-01","NV",3146,,21,,,,1871,0,,398,940813,2789,,,,,273,227046,227046,2315,0,,,,,,,2095778,13824,2095778,13824,,,,,1167859,5104,,0 +"2021-01-01","NY",30208,,168,,89995,89995,7886,0,,1292,,0,,,,,776,990711,,16497,0,,,,,,,25504313,219253,25504313,219253,,,,,,0,,0 +"2021-01-01","OH",8962,8112,0,850,38334,38334,4367,0,5870,1059,,0,,,,,722,700380,628336,0,0,,45805,,,662771,556106,,0,7745920,63336,,860951,,,,0,7745920,63336 +"2021-01-01","OK",2489,,0,,17059,17059,1910,0,,498,2394318,17009,,,2394318,,,290936,,0,0,8502,,,,291996,255843,,0,2685254,17009,106188,,,,,0,2691172,22002 +"2021-01-01","OR",1477,,9,,6498,6498,524,43,,119,,0,,,2496394,,60,113909,,1649,0,,,,,156276,,,0,2652670,20195,,,,,,0,2652670,20195 +"2021-01-01","PA",16214,,236,,,,5624,0,,1172,3275205,10076,,,,,661,648039,581260,7714,0,,,,,,429017,7607664,52987,7607664,52987,,,,,3856465,16972,,0 +"2021-01-01","PR",1521,1257,18,264,,,432,0,,77,305972,0,,,395291,,70,77054,72327,763,0,56216,,,,20103,66930,,0,383026,763,,,,,,0,415664,0 +"2021-01-01","RI",1823,,14,,6506,6506,426,0,,61,551028,2904,,,1906838,,47,90404,,863,0,,,,,108618,,2015456,14674,2015456,14674,,,,,641432,3767,,0 +"2021-01-01","SC",5296,4885,0,411,14390,14390,2025,0,,400,2865514,0,88978,,2781083,,199,307507,283424,0,0,16447,46617,,,367855,151084,,0,3173021,0,105425,407614,,,,0,3148938,0 +"2021-01-01","SD",1488,,0,,5672,5672,297,0,,62,273476,0,,,,,46,99164,90050,0,0,,,,,96130,91980,,0,597286,2410,,,,,372640,0,597286,2410 +"2021-01-01","TN",6907,5990,0,917,14531,14531,3378,0,,813,,0,,,5004400,,471,586802,514459,0,0,,77898,,,603549,508914,,0,5607949,36234,,624501,,,,0,5607949,36234 +"2021-01-01","TX",27771,,334,,,,12481,0,,3124,,0,,,,,,1772483,1563758,16311,0,90397,102780,,,1729239,1435164,,0,13848790,105811,785916,1198101,,,,0,13848790,105811 +"2021-01-01","UT",1269,,0,,10956,10956,565,0,1824,158,1302491,0,,,1977503,641,,276612,,0,0,,32636,,31285,267800,224439,,0,2245303,0,,428308,,176272,1549731,0,2245303,0 +"2021-01-01","VA",5081,4478,49,603,18166,18166,2754,125,,557,,0,,,,,322,354766,297053,5182,0,17347,57410,,,364782,,4291320,35329,4291320,35329,187996,685608,,,,0,,0 +"2021-01-01","VI",23,,0,,,,,0,,,34176,37,,,,,,2036,,5,0,,,,,,1901,,0,36212,42,,,,,36266,25,,0 +"2021-01-01","VT",136,136,0,,,,31,0,,7,255684,0,,,,,,7412,7240,0,0,,,,,,4959,,0,697705,0,,,,,262924,0,697705,0 +"2021-01-01","WA",3461,,41,,14748,14748,1138,177,,248,,0,,,,,118,246752,237165,4422,0,,,,,,,3836820,31430,3836820,31430,,,,,,0,,0 +"2021-01-01","WI",5254,4869,12,385,21400,21400,1074,50,2051,244,2357057,6388,,,,,,522523,483007,2085,0,,,,,,450358,5380828,32340,5380828,32340,,,,,2840064,8293,,0 +"2021-01-01","WV",1361,1210,23,151,,,809,0,,211,,0,,,,,102,87820,71250,2486,0,,,,,,60316,,0,1516422,21741,26060,,,,,0,1516422,21741 +"2021-01-01","WY",438,,0,,1102,1102,113,0,,,159528,0,,,462878,,,44409,38010,0,0,,,,,38891,42570,,0,501784,0,,,,,197538,0,501784,0 +"2020-12-31","AK",206,206,3,,1023,1023,79,6,,,,0,,,1219592,,6,45461,,495,0,,,,,54763,,,0,1275750,8658,,,,,,0,1275750,8658 +"2020-12-31","AL",4827,4219,53,608,34184,34184,2815,353,2438,,1583419,8344,,,,1396,,361226,290581,4406,0,,,,,,202137,,0,1874000,11752,,,87409,,1874000,11752,,0 +"2020-12-31","AR",3676,3088,39,588,11358,11358,1195,87,,396,1864704,10591,,,1864704,1223,209,225138,186784,2708,0,,,,45818,,199247,,0,2051488,12428,,,,246022,,0,2051488,12428 +"2020-12-31","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-31","AZ",8864,8006,146,858,37257,37257,4564,473,,1028,2339635,15472,,,,,746,520207,495117,7718,0,,,,,,,,0,5059770,55959,,,390387,,2834752,22286,5059770,55959 +"2020-12-31","CA",25386,,428,,,,21449,0,,4518,,0,,,,,,2245379,2245379,27237,0,,,,,,,,0,32855482,232406,,,,,,0,32855482,232406 +"2020-12-31","CO",4814,4168,64,646,18598,18598,1086,96,,,1815569,6029,247103,,,,,334097,320021,3238,0,30488,,,,,,4406667,38536,4406667,38536,280655,,,,2135590,9018,,0 +"2020-12-31","CT",5995,4854,31,1141,12257,12257,1136,0,,,,0,,,4335940,,,185708,174679,2045,0,,9121,,,222595,,,0,4565074,41409,,132201,,,,0,4565074,41409 +"2020-12-31","DC",786,,6,,,,234,0,,72,,0,,,,,31,28983,,225,0,,,,,,20770,897439,4675,897439,4675,,,,,357138,1007,,0 +"2020-12-31","DE",926,824,5,102,,,411,0,,58,452629,1747,,,,,,57456,55112,860,0,,,,,59007,,978204,5648,978204,5648,,,,,510085,2607,,0 +"2020-12-31","FL",21990,,133,,63741,63741,6363,366,,,7405064,44106,578113,560932,12286661,,,1300528,1117552,16827,0,71851,,69600,,1692583,,15703599,119229,15703599,119229,650372,,630838,,8705592,60933,14041159,113684 +"2020-12-31","GA",10934,9872,88,1062,42084,42084,4937,306,7417,,,0,,,,,,666452,566676,11709,0,46052,,,,540689,,,0,5349390,44597,403179,,,,,0,5349390,44597 +"2020-12-31","GU",122,,1,,,,14,0,,3,88875,242,,,,,2,7317,7139,9,0,17,239,,,,7047,,0,96192,251,325,5645,,,,0,96014,252 +"2020-12-31","HI",288,288,3,,1768,1768,97,12,,16,,0,,,,,18,21832,21397,188,0,,,,,21233,,812338,5203,812338,5203,,,,,,0,,0 +"2020-12-31","IA",3891,,69,,,,600,0,,134,932046,1726,,77899,1947769,,69,239173,239173,1323,0,,44174,8910,41484,259105,238982,,0,1171219,3049,,854563,86849,182537,1173467,3052,2218153,10357 +"2020-12-31","ID",1403,1240,10,163,5567,5567,375,48,1012,85,427418,1781,,,,,,139864,115850,1340,0,,,,,,57770,,0,543268,2798,,52274,,,543268,2798,855567,5398 +"2020-12-31","IL",17978,16490,167,1488,,,4093,0,,837,,0,,,,,496,963389,,8009,0,,,,,,,,0,13277443,99426,,,,,,0,13277443,99426 +"2020-12-31","IN",8263,7911,103,352,34999,34999,2842,238,6144,633,2125210,7348,,,,,353,511485,,6468,0,,,,,581967,,,0,5681710,54368,,,,,2636695,13816,5681710,54368 +"2020-12-31","KS",2741,,0,,6760,6760,767,0,1823,234,778799,0,,,,412,99,222433,,0,0,,,,,,,,0,1001232,0,,,,,1001232,0,,0 +"2020-12-31","KY",2623,2446,0,177,13488,13488,1673,0,3045,433,,0,,,,,234,265262,213256,0,0,6863,16918,,,182341,36740,,0,3148606,0,101804,164469,,,,0,3148606,0 +"2020-12-31","LA",7488,7115,40,373,,,1731,0,,,3898907,25368,,,,,202,315275,285477,4046,0,,,,,,263712,,0,4214182,29414,,215765,,,,0,4184384,28697 +"2020-12-31","MA",12423,12157,85,266,16098,16098,2271,193,,417,3658165,17397,,,,,240,375178,359445,7260,0,,,12915,,437155,261672,,0,10944699,95827,,,140254,360840,4017610,24284,10944699,95827 +"2020-12-31","MD",5895,5727,47,168,26636,26636,1773,189,,399,2525806,8950,,154692,,,,276662,276662,2973,0,,,19059,,335400,9355,,0,5708030,35350,,,173751,,2802468,11923,5708030,35350 +"2020-12-31","ME",347,341,13,6,1065,1065,177,26,,48,,0,13031,,,,19,24201,20637,702,0,545,3592,,,24418,11374,,0,1085982,8644,13588,80252,,,,0,1085982,8644 +"2020-12-31","MI",13018,12333,0,685,,,2758,0,,629,,0,,,7584454,,368,528621,488144,0,0,,,,,618299,318389,,0,8202753,0,427428,,,,,0,8202753,0 +"2020-12-31","MN",5323,5151,61,172,21864,21864,895,116,4620,196,2571846,9767,,,,,,415302,400958,2195,0,,,,,,397080,5351379,42249,5351379,42249,,223583,,,2972804,11562,,0 +"2020-12-31","MO",5519,,28,,,,2777,0,,640,1652302,3333,97420,,3195736,,359,392570,392570,3714,0,13063,42507,,,435168,,,0,3638238,19899,110698,360428,103066,160425,2044872,7047,3638238,19899 +"2020-12-31","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,122,122,0,0,,,,,,29,,0,17551,0,,,,,17542,0,26131,0 +"2020-12-31","MS",4787,3825,40,962,8145,8145,1463,0,,321,1127658,0,,,,,208,215811,147965,2756,0,,,,,,167263,,0,1343469,2756,60877,401956,,,,0,1267602,0 +"2020-12-31","MT",961,,11,,3568,3568,203,15,,44,,0,,,,,25,81555,,255,0,,,,,,74991,,0,791589,4781,,,,,,0,791589,4781 +"2020-12-31","NC",6748,6342,19,406,,,3472,0,,774,,0,,,,,,539545,493951,6715,0,,,,,,,,0,6668325,59022,,262773,,,,0,6668325,59022 +"2020-12-31","ND",1289,,0,,3552,3552,94,10,524,16,283253,-581,11953,,,,,92495,89525,293,0,1442,,,,,89314,1244308,11127,1244308,11127,13395,38942,,,376910,875,1313560,12420 +"2020-12-31","NE",1611,,8,,5220,5220,544,33,,,679235,2224,,,1552166,,,165297,,1516,0,,,,,189628,105574,,0,1743719,17389,,,,,844942,3739,1743719,17389 +"2020-12-31","NH",759,,18,,902,902,317,1,300,,479590,2517,,,,,,44028,32696,786,0,,,,,,37350,,0,1032929,7703,35841,45901,34671,,512286,2960,1032929,7703 +"2020-12-31","NJ",19042,17021,90,2021,47326,47326,3716,236,,693,7258415,32551,,,,,462,526985,477360,5712,0,,,,,,,,0,7785400,38263,,,,,,0,7735775,42289 +"2020-12-31","NM",2477,,41,,9689,9689,803,75,,,,0,,,,,,142864,,1678,0,,,,,,65533,,0,1970212,15532,,,,,,0,1970212,15532 +"2020-12-31","NV",3125,,59,,,,1927,0,,404,938024,2964,,,,,278,224731,224731,2137,0,,,,,,,2081954,13435,2081954,13435,,,,,1162755,5101,,0 +"2020-12-31","NY",30040,,135,,89995,89995,7935,0,,1276,,0,,,,,723,974214,,16802,0,,,,,,,25285060,216587,25285060,216587,,,,,,0,,0 +"2020-12-31","OH",8962,8112,107,850,38334,38334,4367,332,5870,1059,,0,,,,,722,700380,628336,9632,0,,44661,,,654120,556106,,0,7682584,56943,,842642,,,,0,7682584,56943 +"2020-12-31","OK",2489,,36,,17059,17059,1924,246,,501,2377309,14965,,,2377309,,,290936,,3906,0,8502,,,,287543,255843,,0,2668245,18871,106188,,,,,0,2669170,18446 +"2020-12-31","OR",1468,,19,,6455,6455,568,101,,117,,0,,,2477988,,61,112260,,1033,0,,,,,154487,,,0,2632475,18917,,,,,,0,2632475,18917 +"2020-12-31","PA",15978,,306,,,,5677,0,,1205,3265129,10832,,,,,692,640325,574364,8992,0,,,,,,429017,7554677,57895,7554677,57895,,,,,3839493,17915,,0 +"2020-12-31","PR",1503,1243,19,260,,,440,0,,80,305972,0,,,395291,,70,76291,71650,403,0,55704,,,,20103,66113,,0,382263,403,,,,,,0,415664,0 +"2020-12-31","RI",1809,,32,,6506,6506,426,0,,61,548124,2460,,,1893147,,47,89541,,1592,0,,,,,107635,,2000782,26284,2000782,26284,,,,,637665,4052,,0 +"2020-12-31","SC",5296,4885,47,411,14390,14390,2025,154,,400,2865514,18155,88978,,2781083,,199,307507,283424,4032,0,16447,46617,,,367855,151084,,0,3173021,22187,105425,407614,,,,0,3148938,21555 +"2020-12-31","SD",1488,,24,,5672,5672,297,33,,62,273476,737,,,,,46,99164,90050,444,0,,,,,95731,91980,,0,594876,2222,,,,,372640,1181,594876,2222 +"2020-12-31","TN",6907,5990,97,917,14531,14531,3429,114,,826,,0,,,4976015,,475,586802,514459,5993,0,,77898,,,595700,508914,,0,5571715,24402,,624501,,,,0,5571715,24402 +"2020-12-31","TX",27437,,349,,,,12268,0,,3107,,0,,,,,,1756172,1551250,18725,0,89396,100267,,,1709376,1423001,,0,13742979,81366,781869,1174394,,,,0,13742979,81366 +"2020-12-31","UT",1269,,13,,10956,10956,565,83,1824,158,1302491,5624,,,1977503,641,,276612,,4672,0,,32636,,31285,267800,224439,,0,2245303,17418,,428308,,176272,1549731,9320,2245303,17418 +"2020-12-31","VA",5032,4437,48,595,18041,18041,2744,131,,525,,0,,,,,328,349584,293446,5239,0,17177,55902,,,359589,,4255991,35048,4255991,35048,187352,671049,,,,0,,0 +"2020-12-31","VI",23,,0,,,,,0,,,34139,558,,,,,,2031,,21,0,,,,,,1884,,0,36170,579,,,,,36241,580,,0 +"2020-12-31","VT",136,136,2,,,,31,0,,7,255684,1152,,,,,,7412,7240,136,0,,,,,,4959,,0,697705,8108,,,,,262924,1284,697705,8108 +"2020-12-31","WA",3420,,51,,14571,14571,1088,126,,235,,0,,,,,118,242330,232993,1484,0,,,,,,,3805390,7069,3805390,7069,,,,,,0,,0 +"2020-12-31","WI",5242,4859,50,383,21350,21350,1074,143,2049,244,2350669,5898,,,,,,520438,481102,4212,0,,,,,,447500,5348488,39680,5348488,39680,,,,,2831771,9708,,0 +"2020-12-31","WV",1338,1192,20,146,,,801,0,,206,,0,,,,,99,85334,69506,1109,0,,,,,,59508,,0,1494681,17737,25825,,,,,0,1494681,17737 +"2020-12-31","WY",438,,33,,1102,1102,113,6,,,159528,598,,,462878,,,44409,38010,276,0,,,,,38891,42570,,0,501784,3721,,,,,197538,810,501784,3721 +"2020-12-30","AK",203,203,2,,1017,1017,75,13,,,,0,,,1211380,,10,44966,,385,0,,,,,54317,,,0,1267092,7247,,,,,,0,1267092,7247 +"2020-12-30","AL",4774,4174,37,600,33831,33831,2813,379,2429,,1575075,3822,,,,1396,,356820,287173,5016,0,,,,,,202137,,0,1862248,7056,,,86794,,1862248,7056,,0 +"2020-12-30","AR",3637,3068,34,569,11271,11271,1174,103,,385,1854113,12244,,,1854113,1212,205,222430,184947,3184,0,,,,44836,,196914,,0,2039060,14564,,,,241791,,0,2039060,14564 +"2020-12-30","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-30","AZ",8718,7892,78,826,36784,36784,4526,709,,1076,2324163,13587,,,,,750,512489,488303,5267,0,,,,,,,,0,5003811,42124,,,389684,,2812466,18104,5003811,42124 +"2020-12-30","CA",24958,,432,,,,21433,0,,4478,,0,,,,,,2218142,2218142,30921,0,,,,,,,,0,32623076,248605,,,,,,0,32623076,248605 +"2020-12-30","CO",4750,4111,63,639,18502,18502,1150,272,,,1809540,5337,247103,,,,,330859,317032,2451,0,30488,,,,,,4368131,24722,4368131,24722,277591,,,,2126572,7598,,0 +"2020-12-30","CT",5964,4828,40,1136,12257,12257,1167,0,,,,0,,,4297866,,,183663,172907,1696,0,,8783,,,219317,,,0,4523665,44596,,127711,,,,0,4523665,44596 +"2020-12-30","DC",780,,5,,,,240,0,,71,,0,,,,,33,28758,,223,0,,,,,,20587,892764,3772,892764,3772,,,,,356131,995,,0 +"2020-12-30","DE",921,819,23,102,,,425,0,,56,450882,1259,,,,,,56596,54292,407,0,,,,,58156,,972556,5685,972556,5685,,,,,507478,1666,,0 +"2020-12-30","FL",21857,,139,,63375,63375,6298,376,,,7360958,28033,578113,560932,12194345,,,1283701,1106788,13638,0,71851,,69600,,1671699,,15584370,140593,15584370,140593,650372,,630838,,8644659,41671,13927475,131549 +"2020-12-30","GA",10846,9808,67,1038,41778,41778,4926,375,7375,,,0,,,,,,654743,558177,9053,0,45463,,,,531566,,,0,5304793,23511,401264,,,,,0,5304793,23511 +"2020-12-30","GU",121,,0,,,,15,0,,3,88633,257,,,,,2,7308,7129,15,0,17,239,,,,7018,,0,95941,272,323,5645,,,,0,95762,272 +"2020-12-30","HI",285,285,0,,1756,1756,81,10,,14,,0,,,,,12,21644,21209,106,0,,,,,21063,,807135,3420,807135,3420,,,,,,0,,0 +"2020-12-30","IA",3822,,10,,,,612,0,,127,930320,1067,,77781,1938935,,66,237850,237850,1052,0,,43739,8760,41084,257617,236666,,0,1168170,2119,,844222,86581,181210,1170415,2116,2207796,8450 +"2020-12-30","ID",1393,1232,16,161,5519,5519,280,43,1003,77,425637,492,,,,,,138524,114833,1514,0,,,,,,56799,,0,540470,1590,,52274,,,540470,1590,850169,3281 +"2020-12-30","IL",17811,16357,215,1454,,,4244,0,,882,,0,,,,,496,955380,,7374,0,,,,,,,,0,13178017,74573,,,,,,0,13178017,74573 +"2020-12-30","IN",8160,7812,109,348,34761,34761,2941,227,6078,659,2117862,4469,,,,,365,505017,,4735,0,,,,,455701,,,0,5627342,42249,,,,,2622879,9204,5627342,42249 +"2020-12-30","KS",2741,,193,,6760,6760,767,192,1823,234,778799,9048,,,,412,99,222433,,6371,0,,,,,,,,0,1001232,15419,,,,,1001232,15419,,0 +"2020-12-30","KY",2623,2446,29,177,13488,13488,1673,264,3045,433,,0,,,,,234,265262,213256,3770,0,6863,16918,,,182341,36740,,0,3148606,20426,101804,164469,,,,0,3148606,20426 +"2020-12-30","LA",7448,7078,51,370,,,1717,0,,,3873539,35916,,,,,210,311229,282148,6744,0,,,,,,263712,,0,4184768,42660,,211855,,,,0,4155687,40177 +"2020-12-30","MA",12338,12076,120,262,15905,15905,2257,0,,433,3640768,15115,,,,,231,367918,352558,6839,0,,,12756,,429346,229910,,0,10848872,86050,,,139022,356615,3993326,21250,10848872,86050 +"2020-12-30","MD",5848,5681,45,167,26447,26447,1756,200,,410,2516856,8777,,154692,,,,273689,273689,2628,0,,,19059,,331887,9302,,0,5672680,40279,,,173751,,2790545,11405,5672680,40279 +"2020-12-30","ME",334,329,1,5,1039,1039,177,-2,,48,,0,13000,,,,19,23499,20064,590,0,537,3326,,,23939,11326,,0,1077338,5725,13549,75562,,,,0,1077338,5725 +"2020-12-30","MI",13018,12333,52,685,,,2758,0,,629,,0,,,7584454,,368,528621,488144,4782,0,,,,,618299,318389,,0,8202753,48416,427428,,,,,0,8202753,48416 +"2020-12-30","MN",5262,5100,66,162,21748,21748,926,143,4597,207,2562079,6325,,,,,,413107,399163,1997,0,,,,,,395679,5309130,20796,5309130,20796,,217907,,,2961242,8013,,0 +"2020-12-30","MO",5491,,58,,,,2540,0,,623,1648969,3080,97042,,3179838,,356,388856,388856,2761,0,12843,41349,,,431221,,,0,3618339,18470,110099,351864,102576,156795,2037825,5841,3618339,18470 +"2020-12-30","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,122,122,0,0,,,,,,29,,0,17551,0,,,,,17542,0,26131,0 +"2020-12-30","MS",4747,3804,28,943,8145,8145,1463,0,,321,1127658,0,,,,,208,213055,146932,3023,0,,,,,,167263,,0,1340713,3023,60877,401956,,,,0,1267602,0 +"2020-12-30","MT",950,,11,,3553,3553,223,39,,46,,0,,,,,26,81300,,874,0,,,,,,74970,,0,786808,3313,,,,,,0,786808,3313 +"2020-12-30","NC",6729,6325,155,404,,,3339,0,,768,,0,,,,,,532830,487967,8551,0,,,,,,,,0,6609303,30528,,256286,,,,0,6609303,30528 +"2020-12-30","ND",1289,,6,,3542,3542,96,9,521,15,283834,-2210,11953,,,,,92202,89299,371,0,1442,,,,,89099,1233181,-23,1233181,-23,13395,36604,,,376035,950,1301140,0 +"2020-12-30","NE",1603,,16,,5187,5187,517,28,,,677011,1062,,,1536623,,,163781,,932,0,,,,,187806,105135,,0,1726330,8847,,,,,841203,1996,1726330,8847 +"2020-12-30","NH",741,,6,,901,901,306,0,300,,477073,1062,,,,,,43242,32253,545,0,,,,,,36739,,0,1025226,5427,35757,45740,34637,,509326,1397,1025226,5427 +"2020-12-30","NJ",18952,16931,175,2021,47090,47090,3727,306,,701,7225864,0,,,,,467,521273,472264,5230,0,,,,,,,,0,7747137,5230,,,,,,0,7693486,0 +"2020-12-30","NM",2436,,33,,9614,9614,792,101,,,,0,,,,,,141186,,1311,0,,,,,,64218,,0,1954680,8395,,,,,,0,1954680,8395 +"2020-12-30","NV",3066,,47,,,,1988,0,,408,935060,2170,,,,,282,222594,222594,2470,0,,,,,,,2068519,11253,2068519,11253,,,,,1157654,4640,,0 +"2020-12-30","NY",29905,,149,,89995,89995,7892,0,,1250,,0,,,,,702,957412,,13422,0,,,,,,,25068473,154949,25068473,154949,,,,,,0,,0 +"2020-12-30","OH",8855,8009,133,846,38002,38002,4409,366,5837,1087,,0,,,,,693,690748,620181,8178,0,,43499,,,645879,546305,,0,7625641,24563,,828903,,,,0,7625641,24563 +"2020-12-30","OK",2453,,48,,16813,16813,1916,387,,486,2362344,26435,,,2362344,,,287030,,3249,0,8502,,,,283404,252214,,0,2649374,29684,106188,,,,,0,2650724,31749 +"2020-12-30","OR",1449,,16,,6354,6354,570,77,,127,,0,,,2460231,,60,111227,,682,0,,,,,153327,,,0,2613558,15167,,,,,,0,2613558,15167 +"2020-12-30","PA",15672,,319,,,,5962,0,,1178,3254297,10194,,,,,681,631333,567281,8984,0,,,,,,416679,7496782,52869,7496782,52869,,,,,3821578,17440,,0 +"2020-12-30","PR",1484,1228,24,256,,,450,0,,82,305972,0,,,395291,,70,75888,71342,98,0,55473,,,,20103,65045,,0,381860,98,,,,,,0,415664,0 +"2020-12-30","RI",1777,,17,,6506,6506,426,53,,61,545664,1581,,,1868837,,47,87949,,1160,0,,,,,105661,,1974498,13252,1974498,13252,,,,,633613,2741,,0 +"2020-12-30","SC",5249,4846,51,403,14236,14236,2001,133,,393,2847359,14676,88648,,2763870,,198,303475,280024,2873,0,16367,44962,,,363513,149770,,0,3150834,17549,105015,396295,,,,0,3127383,17137 +"2020-12-30","SD",1464,,18,,5639,5639,293,34,,57,272739,738,,,,,43,98720,89725,562,0,,,,,95386,91527,,0,592654,2196,,,,,371459,1300,592654,2196 +"2020-12-30","TN",6810,5923,100,887,14417,14417,3425,141,,819,,0,,,4957138,,466,580809,509854,8220,0,,76280,,,590175,501691,,0,5547313,26426,,615891,,,,0,5547313,26426 +"2020-12-30","TX",27088,,326,,,,11992,0,,3012,,0,,,,,,1737447,1536265,21469,0,82876,97753,,,1694131,1402336,,0,13661613,69846,701794,1157852,,,,0,13661613,69846 +"2020-12-30","UT",1256,,21,,10873,10873,537,110,1813,156,1296867,4593,,,1964007,633,,271940,,2614,0,,31909,,30583,263878,221055,,0,2227885,13816,,421857,,174180,1540411,6924,2227885,13816 +"2020-12-30","VA",4984,4394,64,590,17910,17910,2707,128,,553,,0,,,,,330,344345,289732,4048,0,16954,54057,,,354682,,4220943,29760,4220943,29760,186372,656121,,,,0,,0 +"2020-12-30","VI",23,,0,,,,,0,,,33581,376,,,,,,2010,,31,0,,,,,,1875,,0,35591,407,,,,,35661,392,,0 +"2020-12-30","VT",134,134,4,,,,33,0,,6,254532,473,,,,,,7276,7108,74,0,,,,,,4883,,0,689597,2210,,,,,261640,545,689597,2210 +"2020-12-30","WA",3369,,174,,14445,14445,1201,169,,245,,0,,,,,108,240846,231724,2174,0,,,,,,,3798321,29659,3798321,29659,,,,,,0,,0 +"2020-12-30","WI",5192,4818,40,374,21207,21207,1074,126,2034,244,2344771,4607,,,,,,516226,477292,3170,0,,,,,,444609,5308808,25493,5308808,25493,,,,,2822063,7362,,0 +"2020-12-30","WV",1318,1176,34,142,,,797,0,,209,,0,,,,,93,84225,68394,1452,0,,,,,,58474,,0,1476944,11165,25646,,,,,0,1476944,11165 +"2020-12-30","WY",405,,0,,1096,1096,113,3,,,158930,522,,,459398,,,44133,37798,210,0,,,,,38651,42197,,0,498063,3672,,,,,196728,600,498063,3672 +"2020-12-29","AK",201,201,1,,1004,1004,83,10,,,,0,,,1204992,,10,44581,,175,0,,,,,53470,,,0,1259845,5448,,,,,,0,1259845,5448 +"2020-12-29","AL",4737,4138,25,599,33452,33452,2804,453,2424,,1571253,5055,,,,1394,,351804,283939,3907,0,,,,,,193149,,0,1855192,7075,,,86415,,1855192,7075,,0 +"2020-12-29","AR",3603,3042,66,561,11168,11168,1161,106,,382,1841869,5901,,,1841869,1199,198,219246,182627,2718,0,,,,43844,,194436,,0,2024496,7350,,,,232799,,0,2024496,7350 +"2020-12-29","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-29","AZ",8640,7837,171,803,36075,36075,4475,445,,1053,2310576,9244,,,,,720,507222,483786,2799,0,,,,,,,,0,4961687,27199,,,389267,,2794362,11607,4961687,27199 +"2020-12-29","CA",24526,,242,,,,21240,0,,4390,,0,,,,,,2187221,2187221,31245,0,,,,,,,,0,32374471,245955,,,,,,0,32374471,245955 +"2020-12-29","CO",4687,4047,56,640,18230,18230,1188,268,,,1804203,3265,244844,,,,,328408,314771,1740,0,29935,,,,,,4343409,14513,4343409,14513,276149,,,,2118974,4718,,0 +"2020-12-29","CT",5924,4792,20,1132,12257,12257,1226,0,,,,0,,,4256777,,,181967,171329,767,0,,8632,,,215854,,,0,4479069,47051,,125114,,,,0,4479069,47051 +"2020-12-29","DC",775,,4,,,,233,0,,72,,0,,,,,35,28535,,193,0,,,,,,20316,888992,3117,888992,3117,,,,,355136,1090,,0 +"2020-12-29","DE",898,798,0,100,,,427,0,,60,449623,1454,,,,,,56189,53919,701,0,,,,,57650,,966871,10505,966871,10505,,,,,505812,2155,,0 +"2020-12-29","FL",21718,,105,,62999,62999,6280,492,,,7332925,32749,578113,560932,12081459,,,1270063,1098799,11748,0,71851,,69600,,1653626,,15443777,35797,15443777,35797,650372,,630838,,8602988,44497,13795926,50317 +"2020-12-29","GA",10779,9759,83,1020,41403,41403,4839,451,7322,,,0,,,,,,645690,552712,9450,0,45356,,,,526895,,,0,5281282,32689,400939,,,,,0,5281282,32689 +"2020-12-29","GU",121,,0,,,,19,0,,4,88376,344,,,,,2,7293,7114,12,0,17,239,,,,6954,,0,95669,356,323,5578,,,,0,95490,356 +"2020-12-29","HI",285,285,0,,1746,1746,89,-5,,14,,0,,,,,11,21538,21103,75,0,,,,,20964,,803715,3070,803715,3070,,,,,,0,,0 +"2020-12-29","IA",3812,,67,,,,620,0,,117,929253,519,,77541,1931640,,67,236798,236798,697,0,,43076,8636,40439,256495,233736,,0,1166051,1216,,832621,86217,179118,1168299,1224,2199346,5796 +"2020-12-29","ID",1377,1216,23,161,5476,5476,280,51,999,77,425145,778,,,,,,137010,113735,795,0,,,,,,55959,,0,538880,1344,,52274,,,538880,1344,846888,4650 +"2020-12-29","IL",17596,16179,126,1417,,,4313,0,,904,,0,,,,,506,948006,,5644,0,,,,,,,,0,13103444,66786,,,,,,0,13103444,66786 +"2020-12-29","IN",8051,7703,165,348,34534,34534,2951,262,6044,646,2113393,4030,,,,,363,500282,,3976,0,,,,,455701,,,0,5585093,31548,,,,,2613675,8006,5585093,31548 +"2020-12-29","KS",2548,,0,,6568,6568,554,0,1762,117,769751,0,,,,411,68,216062,,0,0,,,,,,,,0,985813,0,,,,,985813,0,,0 +"2020-12-29","KY",2594,2424,31,170,13224,13224,1635,125,2998,380,,0,,,,,211,261492,210548,2975,0,6818,16611,,,180583,36124,,0,3128180,3765,101636,162399,,,,0,3128180,3765 +"2020-12-29","LA",7397,7034,61,363,,,1689,0,,,3837623,29998,,,,,218,304485,277887,3946,0,,,,,,247501,,0,4142108,33944,,199923,,,,0,4115510,33104 +"2020-12-29","MA",12218,11958,60,260,15905,15905,2259,0,,431,3625653,10993,,,,,225,361079,346423,4145,0,,,12756,,422263,229910,,0,10762822,49229,,,139022,349077,3972076,14652,10762822,49229 +"2020-12-29","MD",5803,5636,63,167,26247,26247,1725,169,,420,2508079,5754,,153039,,,,271061,271061,1878,0,,,18370,,328355,9302,,0,5632401,20710,,,171409,,2779140,7632,5632401,20710 +"2020-12-29","ME",333,328,7,5,1041,1041,181,9,,48,,0,12986,,,,14,22909,19582,590,0,535,3295,,,23535,11248,,0,1071613,4303,13533,75355,,,,0,1071613,4303 +"2020-12-29","MI",12966,12282,212,684,,,2906,0,,649,,0,,,7540632,,390,523839,483922,3963,0,,,,,613705,318389,,0,8154337,21648,425918,,,,,0,8154337,21648 +"2020-12-29","MN",5196,5038,36,158,21605,21605,966,185,4575,214,2555754,304,,,,,,411110,397475,972,0,,,,,,393506,5288334,6470,5288334,6470,,212943,,,2953229,1114,,0 +"2020-12-29","MO",5433,,117,,,,2540,0,,623,1645889,3275,96807,,3166148,,356,386095,386095,2479,0,12726,39564,,,426499,,,0,3599869,16082,109747,333677,102326,150233,2031984,5754,3599869,16082 +"2020-12-29","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,122,122,0,0,,,,,,29,,0,17551,0,,,,,17542,0,26131,0 +"2020-12-29","MS",4719,3790,85,929,8145,8145,1409,0,,325,1127658,0,,,,,201,210032,145829,1943,0,,,,,,167263,,0,1337690,1943,60877,401956,,,,0,1267602,0 +"2020-12-29","MT",939,,12,,3514,3514,218,50,,47,,0,,,,,24,80426,,427,0,,,,,,74096,,0,783495,1477,,,,,,0,783495,1477 +"2020-12-29","NC",6574,6199,13,375,,,3377,0,,761,,0,,,,,,524279,481665,3563,0,,,,,,,,0,6578775,19697,,249893,,,,0,6578775,19697 +"2020-12-29","ND",1283,,12,,3533,3533,115,33,522,18,286044,605,11953,,,,,91831,89043,272,0,1442,,,,,88854,1233204,1480,1233204,1480,13395,33487,,,375085,764,1301140,1555 +"2020-12-29","NE",1587,,28,,5159,5159,534,51,,,675949,1644,,,1528896,,,162849,,875,0,,,,,186686,103592,,0,1717483,11881,,,,,839207,2519,1717483,11881 +"2020-12-29","NH",735,,20,,901,901,295,6,299,,476011,1159,,,,,,42697,31918,1027,0,,,,,,36079,,0,1019799,4319,35715,45609,34597,,507929,1789,1019799,4319 +"2020-12-29","NJ",18777,16832,126,1945,46784,46784,3765,301,,723,7225864,32311,,,,,473,516043,467622,4407,0,,,,,,,,0,7741907,36718,,,,,,0,7693486,35968 +"2020-12-29","NM",2403,,23,,9513,9513,806,108,,,,0,,,,,,139875,,1216,0,,,,,,63232,,0,1946285,7204,,,,,,0,1946285,7204 +"2020-12-29","NV",3019,,46,,,,1929,0,,414,932890,1481,,,,,282,220124,220124,1747,0,,,,,,,2057266,9902,2057266,9902,,,,,1153014,3228,,0 +"2020-12-29","NY",29756,,127,,89995,89995,7814,0,,1224,,0,,,,,711,943990,,11438,0,,,,,,,24913524,160164,24913524,160164,,,,,,0,,0 +"2020-12-29","OH",8722,7903,151,819,37636,37636,4516,560,5801,1110,,0,,,,,706,682570,614031,7526,0,,41995,,,641245,535487,,0,7601078,20329,,800455,,,,0,7601078,20329 +"2020-12-29","OK",2405,,22,,16426,16426,1927,90,,499,2335909,21237,,,2335909,,,283781,,1194,0,8502,,,,278250,248748,,0,2619690,22431,106188,,,,,0,2618975,27067 +"2020-12-29","OR",1433,,6,,6277,6277,563,109,,122,,0,,,2445880,,62,110545,,820,0,,,,,152511,,,0,2598391,60909,,,,,,0,2598391,60909 +"2020-12-29","PA",15353,,267,,,,6022,0,,1174,3244103,6012,,,,,698,622349,560035,8545,0,,,,,,404526,7443913,44941,7443913,44941,,,,,3804138,11143,,0 +"2020-12-29","PR",1460,1209,4,251,,,462,0,,78,305972,0,,,395291,,71,75790,71262,2132,0,55457,,,,20103,64210,,0,381762,2132,,,,,,0,415664,0 +"2020-12-29","RI",1760,,18,,6453,6453,423,50,,55,544083,2423,,,1856741,,46,86789,,1187,0,,,,,104505,,1961246,13139,1961246,13139,,,,,630872,3610,,0 +"2020-12-29","SC",5198,4804,25,394,14103,14103,1954,53,,379,2832683,13606,88512,,2749596,,189,300602,277563,2552,0,16320,43968,,,360650,148226,,0,3133285,16158,104832,389817,,,,0,3110246,15884 +"2020-12-29","SD",1446,,0,,5605,5605,303,22,,62,272001,389,,,,,44,98158,89314,501,0,,,,,94974,90974,,0,590458,916,,,,,370159,890,590458,916 +"2020-12-29","TN",6710,5853,122,857,14276,14276,3274,120,,798,,0,,,4936970,,455,572589,504543,4797,0,,72935,,,583917,493743,,0,5520887,11429,,601730,,,,0,5520887,11429 +"2020-12-29","TX",26762,,241,,,,11775,0,,3012,,0,,,,,,1715978,1518499,32552,0,81689,96754,,,1680061,1387358,,0,13591767,75524,683203,1144302,,,,0,13591767,75524 +"2020-12-29","UT",1235,,16,,10763,10763,548,120,1806,164,1292274,3104,,,1952711,631,,269326,,2736,0,,31086,,29797,261358,218522,,0,2214069,10464,,413901,,171965,1533487,5032,2214069,10464 +"2020-12-29","VA",4920,4340,59,580,17782,17782,2698,177,,539,,0,,,,,326,340297,287216,4122,0,16832,52378,,,350261,,4191183,22510,4191183,22510,185880,643688,,,,0,,0 +"2020-12-29","VI",23,,0,,,,,0,,,33205,0,,,,,,1979,,0,0,,,,,,1824,,0,35184,0,,,,,35269,0,,0 +"2020-12-29","VT",130,130,1,,,,34,0,,6,254059,200,,,,,,7202,7036,82,0,,,,,,4804,,0,687387,2410,,,,,261095,281,687387,2410 +"2020-12-29","WA",3195,,11,,14276,14276,1280,180,,265,,0,,,,,105,238672,229672,1953,0,,,,,,,3768662,57883,3768662,57883,,,,,,0,,0 +"2020-12-29","WI",5152,4783,92,369,21081,21081,1082,170,2031,249,2340164,3633,,,,,,513056,474537,2919,0,,,,,,440857,5283315,17549,5283315,17549,,,,,2814701,6017,,0 +"2020-12-29","WV",1284,1148,21,136,,,761,0,,213,,0,,,,,98,82773,67437,1337,0,,,,,,57225,,0,1465779,11524,25572,,,,,0,1465779,11524 +"2020-12-29","WY",405,,0,,1093,1093,119,40,,,158408,231,,,455938,,,43923,37720,219,0,,,,,38439,42123,,0,494391,1311,,,,,196128,328,494391,1311 +"2020-12-28","AK",200,200,0,,994,994,78,2,,,,0,,,1199815,,10,44406,,126,0,,,,,53213,,,0,1254397,4146,,,,,,0,1254397,4146 +"2020-12-28","AL",4712,4120,21,592,32999,32999,2802,884,2421,,1566198,2717,,,,1388,,347897,281919,2269,0,,,,,,193149,,0,1848117,4377,,,86081,,1848117,4377,,0 +"2020-12-28","AR",3537,3005,55,532,11062,11062,1155,53,,380,1835968,4649,,,1835968,1188,201,216528,181178,1651,0,,,,42473,,192134,,0,2017146,5538,,,,227008,,0,2017146,5538 +"2020-12-28","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-28","AZ",8469,7693,42,776,35630,35630,4390,240,,1007,2301332,-2426,,,,,715,504423,481423,10086,0,,,,,,,,0,4934488,15761,,,389121,,2782755,7269,4934488,15761 +"2020-12-28","CA",24284,,64,,,,20642,0,,4360,,0,,,,,,2155976,2155976,33170,0,,,,,,,,0,32128516,301820,,,,,,0,32128516,301820 +"2020-12-28","CO",4631,4001,21,630,17962,17962,1173,50,,,1800938,4869,243873,,,,,326668,313318,1650,0,29709,,,,,,4328896,22325,4328896,22325,274779,,,,2114256,6480,,0 +"2020-12-28","CT",5904,4773,113,1131,12257,12257,1219,0,,,,0,,,4213468,,,181200,170642,8457,0,,8544,,,212169,,,0,4432018,15416,,123538,,,,0,4432018,15416 +"2020-12-28","DC",771,,3,,,,232,0,,71,,0,,,,,35,28342,,140,0,,,,,,20143,885875,3028,885875,3028,,,,,354046,553,,0 +"2020-12-28","DE",898,798,1,100,,,428,0,,60,448169,1222,,,,,,55488,53288,431,0,,,,,56881,,956366,10026,956366,10026,,,,,503657,1653,,0 +"2020-12-28","FL",21613,,99,,62507,62507,6109,211,,,7300176,19734,578113,560932,12046324,,,1258315,1092688,8040,0,71851,,69600,,1638660,,15407980,63988,15407980,63988,650372,,630838,,8558491,27774,13745609,64592 +"2020-12-28","GA",10696,9719,7,977,40952,40952,4729,165,7247,,,0,,,,,,636240,546859,3941,0,45163,,,,520787,,,0,5248593,15065,400465,,,,,0,5248593,15065 +"2020-12-28","GU",121,,0,,,,19,0,,5,88032,616,,,,,2,7281,7102,11,0,17,239,,,,6908,,0,95313,627,323,5576,,,,0,95134,627 +"2020-12-28","HI",285,285,0,,1751,1751,125,40,,23,,0,,,,,18,21463,21028,45,0,,,,,20895,,800645,2343,800645,2343,,,,,,0,,0 +"2020-12-28","IA",3745,,0,,,,586,0,,111,928734,906,,77181,1926606,,60,236101,236101,562,0,,42361,8330,39755,255770,229624,,0,1164835,1468,,814235,85551,177010,1167075,1461,2193550,5941 +"2020-12-28","ID",1354,1195,0,159,5425,5425,393,33,993,95,424367,438,,,,,,136215,113169,428,0,,,,,,55186,,0,537536,769,,52274,,,537536,769,842238,1307 +"2020-12-28","IL",17470,16074,134,1396,,,4243,0,,884,,0,,,,,515,942362,,4453,0,,,,,,,,0,13036658,51046,,,,,,0,13036658,51046 +"2020-12-28","IN",7886,7539,43,347,34272,34272,2866,170,5993,632,2109363,2993,,,,,364,496306,,2465,0,,,,,452139,,,0,5553545,17489,,,,,2605669,5458,5553545,17489 +"2020-12-28","KS",2548,,41,,6568,6568,554,144,1762,117,769751,17236,,,,411,68,216062,,6373,0,,,,,,,,0,985813,23609,,,,,985813,23609,,0 +"2020-12-28","KY",2563,2398,8,165,13099,13099,1552,32,2984,411,,0,,,,,217,258517,208615,1454,0,6800,16293,,,180115,35988,,0,3124415,10760,101548,160008,,,,0,3124415,10760 +"2020-12-28","LA",7336,6980,45,356,,,1597,0,,,3807625,4695,,,,,201,300539,274781,817,0,,,,,,247501,,0,4108164,5512,,195671,,,,0,4082406,5428 +"2020-12-28","MA",12158,11900,48,258,15905,15905,2230,0,,430,3614660,10932,,,,,234,356934,342764,4198,0,,,12756,,418051,229910,,0,10713593,49772,,,139022,344885,3957424,14992,10713593,49772 +"2020-12-28","MD",5740,5573,28,167,26078,26078,1738,227,,423,2502325,11384,,153039,,,,269183,269183,1985,0,,,18370,,325932,9300,,0,5611691,38928,,,171409,,2771508,13369,5611691,38928 +"2020-12-28","ME",326,321,3,5,1032,1032,181,8,,48,,0,12977,,,,14,22319,19128,439,0,534,3157,,,23277,11184,,0,1067310,5331,13523,73422,,,,0,1067310,5331 +"2020-12-28","MI",12754,12089,64,665,,,2811,0,,662,,0,,,7520960,,407,519876,480508,3550,0,,,,,611729,318389,,0,8132689,62944,423406,,,,,0,8132689,62944 +"2020-12-28","MN",5160,5003,13,157,21420,21420,878,105,4539,203,2555450,3529,,,,,,410138,396665,1077,0,,,,,,391248,5281864,12110,5281864,12110,,211909,,,2952115,4481,,0 +"2020-12-28","MO",5316,,4,,,,2429,0,,627,1642614,1120,96696,,3153264,,334,383616,383616,1522,0,12631,38898,,,423343,,,0,3583787,7149,109540,330575,102147,148778,2026230,2642,3583787,7149 +"2020-12-28","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,122,122,0,0,,,,,,29,,0,17551,0,,,,,17542,0,26131,0 +"2020-12-28","MS",4634,3746,28,888,8145,8145,1325,106,,321,1127658,0,,,,,193,208089,144991,1701,0,,,,,,167263,,0,1335747,1701,60877,401956,,,,0,1267602,0 +"2020-12-28","MT",927,,3,,3464,3464,213,13,,43,,0,,,,,21,79999,,219,0,,,,,,73481,,0,782018,1899,,,,,,0,782018,1899 +"2020-12-28","NC",6561,6186,12,375,,,3192,0,,733,,0,,,,,,520716,478714,3888,0,,,,,,,,0,6559078,17302,,247223,,,,0,6559078,17302 +"2020-12-28","ND",1271,,0,,3500,3500,108,5,518,18,285439,194,11953,,,,,91559,88883,93,0,1442,,,,,88411,1231724,1954,1231724,1954,13395,31170,,,374321,273,1299585,2195 +"2020-12-28","NE",1559,,0,,5108,5108,527,4,,,674305,857,,,1518201,,,161974,,637,0,,,,,185515,102169,,0,1705602,4424,,,,,836688,1494,1705602,4424 +"2020-12-28","NH",715,,7,,895,895,269,0,297,,474852,2339,,,,,,41670,31288,861,0,,,,,,35447,,0,1015480,5673,35689,45509,34577,,506140,3000,1015480,5673 +"2020-12-28","NJ",18651,16706,21,1945,46483,46483,3619,110,,704,7193553,188090,,,,,499,511636,463965,3313,0,,,,,,,,0,7705189,191403,,,,,,0,7657518,197153 +"2020-12-28","NM",2380,,34,,9405,9405,788,139,,,,0,,,,,,138659,,691,0,,,,,,61899,,0,1939081,6342,,,,,,0,1939081,6342 +"2020-12-28","NV",2973,,21,,,,1899,0,,427,931409,2630,,,,,283,218377,218377,868,0,,,,,,,2047364,7574,2047364,7574,,,,,1149786,3498,,0 +"2020-12-28","NY",29629,,118,,89995,89995,7559,0,,1222,,0,,,,,717,932552,,10407,0,,,,,,,24753360,124866,24753360,124866,,,,,,0,,0 +"2020-12-28","OH",8571,7791,62,780,37076,37076,4511,290,5749,1108,,0,,,,,729,675044,608429,4519,0,,41388,,,638135,523494,,0,7580749,28792,,796441,,,,0,7580749,28792 +"2020-12-28","OK",2383,,13,,16336,16336,1729,47,,451,2314672,0,,,2314672,,,282587,,3448,0,8502,,,,272549,244676,,0,2597259,3448,106188,,,,,0,2591908,0 +"2020-12-28","OR",1427,,5,,6168,6168,530,0,,109,,0,,,2389013,,59,109725,,1399,0,,,,,148469,,,0,2537482,0,,,,,,0,2537482,0 +"2020-12-28","PA",15086,,76,,,,5995,0,,1174,3238091,6628,,,,,715,613804,554904,3779,0,,,,,,392834,7398972,26843,7398972,26843,,,,,3792995,9790,,0 +"2020-12-28","PR",1456,1205,11,251,,,447,0,,81,305972,0,,,395291,,93,73658,69661,431,0,55046,,,,20103,63385,,0,379630,431,,,,,,0,415664,0 +"2020-12-28","RI",1742,,3,,6403,6403,412,272,,54,541660,1935,,,1844956,,47,85602,,661,0,,,,,103151,,1948107,8118,1948107,8118,,,,,627262,2596,,0 +"2020-12-28","SC",5173,4782,18,391,14050,14050,1867,75,,380,2819077,12372,88408,,2736587,,175,298050,275285,1871,0,16246,43262,,,357775,147106,,0,3117127,14243,104654,387061,,,,0,3094362,13998 +"2020-12-28","SD",1446,,0,,5583,5583,288,22,,60,271612,217,,,,,35,97657,88894,267,0,,,,,94793,89688,,0,589542,935,,,,,369269,484,589542,935 +"2020-12-28","TN",6588,5766,76,822,14156,14156,3151,65,,797,,0,,,4928121,,485,567792,502070,3712,0,,70389,,,581337,483525,,0,5509458,13344,,586106,,,,0,5509458,13344 +"2020-12-28","TX",26521,,49,,,,11351,0,,2969,,0,,,,,,1683426,1490479,14829,0,81251,94801,,,1665082,1357576,,0,13516243,59907,680733,1129749,,,,0,13516243,59907 +"2020-12-28","UT",1219,,5,,10643,10643,532,59,1784,168,1289170,2948,,,1944341,625,,266590,,1716,0,,30293,,29033,259264,216242,,0,2203605,7720,,406081,,169650,1528455,4357,2203605,7720 +"2020-12-28","VA",4861,4288,7,573,17605,17605,2563,57,,526,,0,,,,,321,336175,284344,2599,0,16752,50403,,,347136,,4168673,18686,4168673,18686,185503,623181,,,,0,,0 +"2020-12-28","VI",23,,0,,,,,0,,,33205,0,,,,,,1979,,0,0,,,,,,1824,,0,35184,0,,,,,35269,0,,0 +"2020-12-28","VT",129,129,2,,,,20,0,,5,253859,938,,,,,,7120,6955,91,0,,,,,,4732,,0,684977,2894,,,,,260814,1026,684977,2894 +"2020-12-28","WA",3184,,0,,14096,14096,1200,0,,243,,0,,,,,90,236719,227795,0,0,,,,,,,3710779,0,3710779,0,,,,,,0,,0 +"2020-12-28","WI",5060,4711,21,349,20911,20911,1113,82,2021,237,2336531,3836,,,,,,510137,472153,1557,0,,,,,,438394,5265766,13074,5265766,13074,,,,,2808684,5171,,0 +"2020-12-28","WV",1263,1134,9,129,,,720,0,,200,,0,,,,,91,81436,66631,726,0,,,,,,55900,,0,1454255,4473,25497,,,,,0,1454255,4473 +"2020-12-28","WY",405,,32,,1053,1053,115,13,,,158177,2123,,,454706,,,43704,37623,504,0,,,,,38363,41878,,0,493080,14729,,,,,195800,3046,493080,14729 +"2020-12-27","AK",200,200,0,,992,992,71,1,,,,0,,,1195838,,9,44280,,290,0,,,,,53053,,,0,1250251,5188,,,,,,0,1250251,5188 +"2020-12-27","AL",4691,4105,6,586,32115,32115,2585,0,2421,,1563481,2503,,,,1388,,345628,280259,2170,0,,,,,,193149,,0,1843740,4105,,,85907,,1843740,4105,,0 +"2020-12-27","AR",3482,2976,41,506,11009,11009,1093,53,,365,1831319,4167,,,1831319,1180,186,214877,180289,908,0,,,,41610,,189915,,0,2011608,4816,,,,224291,,0,2011608,4816 +"2020-12-27","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-27","AZ",8427,7653,3,774,35390,35390,4190,53,,988,2303758,10496,,,,,667,494337,471728,1296,0,,,,,,,,0,4918727,25431,,,388745,,2775486,11750,4918727,25431 +"2020-12-27","CA",24220,,237,,,,20059,0,,4214,,0,,,,,,2122806,2122806,50141,0,,,,,,,,0,31826696,380154,,,,,,0,31826696,380154 +"2020-12-27","CO",4610,3979,18,631,17912,17912,1186,52,,,1796069,4142,243405,,,,,325018,311707,1399,0,29565,,,,,,4306571,31783,4306571,31783,273582,,,,2107776,5504,,0 +"2020-12-27","CT",5791,4686,0,1105,12257,12257,1200,0,,,,0,,,4199743,,,172743,162449,0,0,,8079,,,210500,,,0,4416602,17518,,113686,,,,0,4416602,17518 +"2020-12-27","DC",768,,6,,,,232,0,,65,,0,,,,,32,28202,,492,0,,,,,,20040,882847,18440,882847,18440,,,,,353493,3718,,0 +"2020-12-27","DE",897,797,2,100,,,403,0,,64,446947,1673,,,,,,55057,52861,584,0,,,,,56125,,946340,7111,946340,7111,,,,,502004,2257,,0 +"2020-12-27","FL",21514,,77,,62296,62296,5910,178,,,7280442,20227,578113,560932,11992748,,,1250275,1087472,7157,0,71851,,69600,,1627897,,15343992,62641,15343992,62641,650372,,630838,,8530717,27384,13681017,51462 +"2020-12-27","GA",10689,9714,4,975,40787,40787,4499,139,7236,,,0,,,,,,632299,543707,3511,0,44953,,,,517672,,,0,5233528,15054,399649,,,,,0,5233528,15054 +"2020-12-27","GU",121,,0,,,,18,0,,7,87416,0,,,,,3,7270,7095,1,0,17,224,,,,6743,,0,94686,1,321,5347,,,,0,94507,0 +"2020-12-27","HI",285,285,0,,1711,1711,64,0,,11,,0,,,,,10,21418,20983,95,0,,,,,20854,,798302,2724,798302,2724,,,,,,0,,0 +"2020-12-27","IA",3745,,1,,,,553,0,,109,927828,1209,,77194,1921310,,65,235539,235539,478,0,,42002,8327,39443,255146,228761,,0,1163367,1687,,810077,85561,175915,1165614,1695,2187609,4487 +"2020-12-27","ID",1354,1195,5,159,5392,5392,393,35,984,95,423929,1694,,,,,,135787,112838,554,0,,,,,,54574,,0,536767,2135,,52274,,,536767,2135,840931,3428 +"2020-12-27","IL",17336,15969,112,1367,,,4083,0,,905,,0,,,,,497,937909,,3767,0,,,,,,,,0,12985612,46226,,,,,,0,12985612,46226 +"2020-12-27","IN",7843,7496,42,347,34102,34102,2811,267,5963,638,2106370,2422,,,,,360,493841,,1820,0,,,,,449547,,,0,5536056,18542,,,,,2600211,4242,5536056,18542 +"2020-12-27","KS",2507,,0,,6424,6424,1014,0,1722,255,752515,0,,,,411,119,209689,,0,0,,,,,,,,0,962204,0,,,,,962204,0,,0 +"2020-12-27","KY",2555,2391,21,164,13067,13067,1504,32,2981,411,,0,,,,,217,257063,207578,1500,0,6748,16079,,,179183,35952,,0,3113655,0,101339,158498,,,,0,3113655,0 +"2020-12-27","LA",7291,6936,19,355,,,1530,0,,,3802930,23607,,,,,191,299722,274048,3223,0,,,,,,247501,,0,4102652,26830,,195221,,,,0,4076978,26478 +"2020-12-27","MA",12110,11852,100,258,15905,15905,2156,0,,416,3603728,8646,,,,,230,352736,338704,3134,0,,,12756,,413307,229910,,0,10663821,41331,,,139022,343468,3942432,11619,10663821,41331 +"2020-12-27","MD",5712,5545,32,167,25851,25851,1692,134,,418,2490941,8221,,153039,,,,267198,267198,1758,0,,,18370,,323186,9300,,0,5572763,26728,,,171409,,2758139,9979,5572763,26728 +"2020-12-27","ME",323,318,4,5,1024,1024,183,4,,56,,0,12910,,,,16,21880,18769,333,0,522,3038,,,22980,11150,,0,1061979,2868,13444,71450,,,,0,1061979,2868 +"2020-12-27","MI",12690,12029,0,661,,,3108,0,,738,,0,,,7462943,,416,516326,477269,0,0,,,,,606802,318389,,0,8069745,0,422569,,,,,0,8069745,0 +"2020-12-27","MN",5147,4993,40,154,21315,21315,1048,102,4527,238,2551921,27069,,,,,,409061,395713,2516,0,,,,,,388919,5269754,82728,5269754,82728,,210685,,,2947634,29391,,0 +"2020-12-27","MO",5312,,3,,,,2696,0,,659,1641494,1835,96620,,3147819,,349,382094,382094,1451,0,12557,38496,,,421654,,,0,3576638,8089,109390,329341,102024,147939,2023588,3286,3576638,8089 +"2020-12-27","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,122,122,0,0,,,,,,29,,0,17551,0,,,,,17542,0,26131,0 +"2020-12-27","MS",4606,3738,41,868,8039,8039,1377,0,,339,1127658,0,,,,,195,206388,144230,1365,0,,,,,,154669,,0,1334046,1365,60877,401956,,,,0,1267602,0 +"2020-12-27","MT",924,,5,,3451,3451,200,22,,44,,0,,,,,22,79780,,347,0,,,,,,72729,,0,780119,1578,,,,,,0,780119,1578 +"2020-12-27","NC",6549,6176,23,373,,,3123,0,,721,,0,,,,,,516828,475269,2898,0,,,,,,,,0,6541776,35786,,245762,,,,0,6541776,35786 +"2020-12-27","ND",1271,,0,,3495,3495,106,10,516,17,285245,110,11953,,,,,91466,88804,111,0,1442,,,,,88177,1229770,1573,1229770,1573,13395,30714,,,374048,194,1297390,1779 +"2020-12-27","NE",1559,,1,,5104,5104,503,19,,,673448,389,,,1514442,,,161337,,175,0,,,,,184851,102012,,0,1701178,1651,,,,,835194,567,1701178,1651 +"2020-12-27","NH",708,,7,,895,895,270,1,297,,472513,2792,,,,,,40809,30627,876,0,,,,,,33107,,0,1009807,4198,35677,45471,34567,,503140,3373,1009807,4198 +"2020-12-27","NJ",18630,16685,17,1945,46373,46373,3469,116,,686,7005463,0,,,,,487,508323,461221,2895,0,,,,,,,,0,7513786,2895,,,,,,0,7460365,0 +"2020-12-27","NM",2346,,30,,9266,9266,758,85,,,,0,,,,,,137968,,742,0,,,,,,60528,,0,1932739,8832,,,,,,0,1932739,8832 +"2020-12-27","NV",2952,,8,,,,1885,0,,442,928779,1726,,,,,298,217509,217509,1856,0,,,,,,,2039790,9107,2039790,9107,,,,,1146288,3582,,0 +"2020-12-27","NY",29511,,115,,89995,89995,7183,0,,1187,,0,,,,,687,922145,,7623,0,,,,,,,24628494,130299,24628494,130299,,,,,,0,,0 +"2020-12-27","OH",8509,7732,33,777,36786,36786,4371,273,5719,1083,,0,,,,,731,670525,605214,5857,0,,40678,,,634574,517057,,0,7551957,30143,,792278,,,,0,7551957,30143 +"2020-12-27","OK",2370,,13,,16289,16289,1729,167,,451,2314672,0,,,2314672,,,279139,,2631,0,8502,,,,272549,243018,,0,2593811,2631,106188,,,,,0,2591908,0 +"2020-12-27","OR",1422,,0,,6168,6168,530,0,,109,,0,,,2389013,,59,108326,,608,0,,,,,148469,,,0,2537482,0,,,,,,0,2537482,0 +"2020-12-27","PA",15010,,127,,,,5905,0,,1145,3231463,10355,,,,,747,610025,551742,4884,0,,,,,,381238,7372129,45649,7372129,45649,,,,,3783205,14972,,0 +"2020-12-27","PR",1445,1196,13,249,,,445,0,,89,305972,0,,,395291,,85,73227,69265,784,0,54571,,,,20103,63385,,0,379199,784,,,,,,0,415664,0 +"2020-12-27","RI",1739,,7,,6131,6131,442,0,,49,539725,1916,,,1837603,,35,84941,,733,0,,,,,102386,,1939989,10188,1939989,10188,,,,,624666,2649,,0 +"2020-12-27","SC",5155,4764,31,391,13975,13975,1780,81,,365,2806705,64262,88282,,2724488,,177,296179,273659,7287,0,16206,42989,,,355876,145988,,0,3102884,71549,104488,385700,,,,0,3080364,71243 +"2020-12-27","SD",1446,,0,,5561,5561,274,28,,62,271395,577,,,,,29,97390,88648,427,0,,,,,94613,89249,,0,588607,910,,,,,368785,1004,588607,910 +"2020-12-27","TN",6512,5708,69,804,14091,14091,3023,20,,799,,0,,,4917841,,462,564080,499276,3188,0,,69248,,,578273,480227,,0,5496114,11517,,582881,,,,0,5496114,11517 +"2020-12-27","TX",26472,,51,,,,10886,0,,2856,,0,,,,,,1668597,1476674,8046,0,80953,94036,,,1653830,1346963,,0,13456336,88998,679419,1122377,,,,0,13456336,88998 +"2020-12-27","UT",1214,,2,,10584,10584,517,62,1780,166,1286222,1187,,,1938175,625,,264874,,796,0,,30042,,28800,257710,214048,,0,2195885,3261,,404456,,169031,1524098,1666,2195885,3261 +"2020-12-27","VA",4854,4285,14,569,17548,17548,2495,84,,514,,0,,,,,318,333576,282407,3999,0,16713,49300,,,344591,,4149987,21188,4149987,21188,185281,618369,,,,0,,0 +"2020-12-27","VI",23,,0,,,,,0,,,33205,0,,,,,,1979,,0,0,,,,,,1824,,0,35184,0,,,,,35269,0,,0 +"2020-12-27","VT",127,127,6,,,,34,0,,2,252921,448,,,,,,7029,6867,63,0,,,,,,4667,,0,682083,1267,,,,,259788,512,682083,1267 +"2020-12-27","WA",3184,,0,,14096,14096,1200,188,,243,,0,,,,,90,236719,227795,3626,0,,,,,,,3710779,61569,3710779,61569,,,,,,0,,0 +"2020-12-27","WI",5039,4692,10,347,20829,20829,1089,95,2018,240,2332695,2615,,,,,,508580,470818,2558,0,,,,,,436233,5252692,11349,5252692,11349,,,,,2803513,4902,,0 +"2020-12-27","WV",1254,1127,1,127,,,699,0,,186,,0,,,,,89,80710,66295,533,0,,,,,,55019,,0,1449782,4823,25488,,,,,0,1449782,4823 +"2020-12-27","WY",373,,0,,1040,1040,146,1,,,156054,0,,,440841,,,43200,37167,54,0,,,,,37502,41346,,0,478351,0,,,,,192754,0,478351,0 +"2020-12-26","AK",200,200,1,,991,991,79,8,,,,0,,,1190997,,10,43990,,361,0,,,,,52716,,,0,1245063,17328,,,,,,0,1245063,17328 +"2020-12-26","AL",4685,4101,5,584,32115,32115,2470,161,2421,,1560978,4308,,,,1387,,343458,278657,1032,0,,,,,,193149,,0,1839635,5211,,,85602,,1839635,5211,,0 +"2020-12-26","AR",3441,2962,3,479,10956,10956,1059,29,,364,1827152,7224,,,1827152,1170,173,213969,179640,702,0,,,,41321,,188213,,0,2006792,7884,,,,223215,,0,2006792,7884 +"2020-12-26","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-26","AZ",8424,7650,15,774,35337,35337,4165,360,,983,2293262,17303,,,,,652,493041,470474,6106,0,,,,,,,,0,4893296,56365,,,388363,,2763736,22764,4893296,56365 +"2020-12-26","CA",23983,,36,,,,19797,0,,4131,,0,,,,,,2072665,2072665,30375,0,,,,,,,,0,31446542,379681,,,,,,0,31446542,379681 +"2020-12-26","CO",4592,3953,6,639,17860,17860,1168,21,,,1791927,4333,241681,,,,,323619,310345,1430,0,29117,,,,,,4274788,23746,4274788,23746,272970,,,,2102272,5771,,0 +"2020-12-26","CT",5791,4686,0,1105,12257,12257,1200,0,,,,0,,,4184311,,,172743,162449,0,0,,8079,,,208429,,,0,4399084,2625,,113686,,,,0,4399084,2625 +"2020-12-26","DC",762,,6,,,,244,0,,70,,0,,,,,26,27710,,274,0,,,,,,19883,864407,7626,864407,7626,,,,,349775,1586,,0 +"2020-12-26","DE",895,795,4,100,,,400,0,,55,445274,2518,,,,,,54473,52288,820,0,,,,,55667,,939229,9800,939229,9800,,,,,499747,3338,,0 +"2020-12-26","FL",21437,,142,,62118,62118,5647,196,,,7260215,49967,578113,560932,11950775,,,1243118,1082459,16588,0,71851,,69600,,1618706,,15281351,187895,15281351,187895,650372,,630838,,8503333,66555,13629555,160584 +"2020-12-26","GA",10685,9710,54,975,40648,40648,4325,18,7224,,,0,,,,,,628788,540758,4158,0,44752,,,,514953,,,0,5218474,29639,399032,,,,,0,5218474,29639 +"2020-12-26","GU",121,,0,,,,18,0,,7,87416,0,,,,,3,7269,7094,1,0,17,224,,,,6743,,0,94685,1,321,5347,,,,0,94507,0 +"2020-12-26","HI",285,285,0,,1711,1711,64,0,,11,,0,,,,,10,21323,20888,119,0,,,,,20758,,795578,15121,795578,15121,,,,,,0,,0 +"2020-12-26","IA",3744,,0,,,,558,0,,114,926619,950,,77173,1917372,,63,235061,235061,310,0,,41923,8322,39343,254620,227670,,0,1161680,1260,,808492,85535,175811,1163919,1256,2183122,3447 +"2020-12-26","ID",1349,1191,0,158,5357,5357,433,0,978,106,422235,0,,,,,,135233,112397,0,0,,,,,,53535,,0,534632,0,,52274,,,534632,0,837503,0 +"2020-12-26","IL",17224,15865,70,1359,,,4021,0,,874,,0,,,,,494,934142,,3293,0,,,,,,,,0,12939386,57448,,,,,,0,12939386,57448 +"2020-12-26","IN",7801,7461,31,340,33835,33835,2808,171,5908,636,2103948,5963,,,,,352,492021,,3841,0,,,,,447970,,,0,5517514,32679,,,,,2595969,9804,5517514,32679 +"2020-12-26","KS",2507,,0,,6424,6424,1014,0,1722,255,752515,0,,,,411,119,209689,,0,0,,,,,,,,0,962204,0,,,,,962204,0,,0 +"2020-12-26","KY",2534,2372,68,162,13035,13035,1511,208,2975,396,,0,,,,,237,255563,206356,5283,0,6748,16079,,,179183,35936,,0,3113655,51963,101339,158498,,,,0,3113655,51963 +"2020-12-26","LA",7272,6918,0,354,,,1633,0,,,3779323,0,,,,,199,296499,271177,0,0,,,,,,247501,,0,4075822,0,,192515,,,,0,4050500,0 +"2020-12-26","MA",12010,11752,47,258,15905,15905,2077,0,,416,3595082,22818,,,,,232,349602,335731,7677,0,,,12756,,409908,229910,,0,10622490,108445,,,139022,340254,3930813,30242,10622490,108445 +"2020-12-26","MD",5680,5514,21,166,25717,25717,1685,176,,424,2482720,10916,,153039,,,,265440,265440,2280,0,,,18370,,320964,9272,,0,5546035,38087,,,171409,,2748160,13196,5546035,38087 +"2020-12-26","ME",319,314,0,5,1020,1020,183,0,,56,,0,12910,,,,16,21547,18517,0,0,522,3016,,,22799,11108,,0,1059111,5456,13444,71364,,,,0,1059111,5456 +"2020-12-26","MI",12690,12029,275,661,,,3108,0,,738,,0,,,7462943,,416,516326,477269,7877,0,,,,,606802,318389,,0,8069745,132087,422569,,,,,0,8069745,132087 +"2020-12-26","MN",5107,4957,57,150,21213,21213,1048,108,4516,238,2524852,12954,,,,,,406545,393391,2142,0,,,,,,382705,5187026,45364,5187026,45364,,205385,,,2918243,14904,,0 +"2020-12-26","MO",5309,,1,,,,2821,0,,685,1639659,3290,96517,,3141306,,377,380643,380643,1756,0,12510,38275,,,420090,,,0,3568549,13518,109240,328173,101902,147493,2020302,5046,3568549,13518 +"2020-12-26","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,122,122,4,0,,,,,,29,,0,17551,4,,,,,17542,0,26131,0 +"2020-12-26","MS",4565,3718,3,847,8039,8039,1377,0,,339,1127658,0,,,,,195,205023,143736,845,0,,,,,,154669,,0,1332681,845,60877,401956,,,,0,1267602,0 +"2020-12-26","MT",919,,3,,3429,3429,216,23,,46,,0,,,,,21,79433,,504,0,,,,,,72284,,0,778541,6848,,,,,,0,778541,6848 +"2020-12-26","NC",6526,6154,166,372,,,3023,0,,714,,0,,,,,,513930,472488,19419,0,,,,,,,,0,6505990,53246,,245322,,,,0,6505990,53246 +"2020-12-26","ND",1271,,4,,3485,3485,111,13,516,21,285135,788,11953,,,,,91355,88719,407,0,1442,,,,,87762,1228197,9496,1228197,9496,13395,29959,,,373854,1190,1295611,10500 +"2020-12-26","NE",1558,,-10,,5085,5085,505,-3,,,673059,1620,,,1513049,,,161162,,805,0,,,,,184584,94708,,0,1699527,9244,,,,,834627,2426,1699527,9244 +"2020-12-26","NH",701,,11,,894,894,277,0,297,,469721,4355,,,,,,39933,30046,1031,0,,,,,,33113,,0,1005609,13326,35661,45442,34544,,499767,4747,1005609,13326 +"2020-12-26","NJ",18613,16668,18,1945,46257,46257,3431,55,,724,7005463,0,,,,,478,505428,458901,4331,0,,,,,,,,0,7510891,4331,,,,,,0,7460365,0 +"2020-12-26","NM",2316,,9,,9181,9181,749,22,,,,0,,,,,,137226,,604,0,,,,,,59506,,0,1923907,11356,,,,,,0,1923907,11356 +"2020-12-26","NV",2944,,1,,,,1885,0,,442,927053,4770,,,,,298,215653,215653,1589,0,,,,,,,2030683,16744,2030683,16744,,,,,1142706,6359,,0 +"2020-12-26","NY",29396,,126,,89995,89995,6884,0,,1129,,0,,,,,638,914522,,10806,0,,,,,,,24498195,201442,24498195,201442,,,,,,0,,0 +"2020-12-26","OH",8476,7704,20,772,36513,36513,4298,168,5689,1082,,0,,,,,694,664668,600330,11018,0,,40567,,,630989,510332,,0,7521814,49574,,790383,,,,0,7521814,49574 +"2020-12-26","OK",2357,,29,,16122,16122,1729,210,,451,2314672,0,,,2314672,,,276508,,3955,0,7767,,,,272549,238103,,0,2591180,3955,103518,,,,,0,2591908,0 +"2020-12-26","OR",1422,,7,,6168,6168,530,0,,109,,0,,,2389013,,59,107718,,897,0,,,,,148469,,,0,2537482,0,,,,,,0,2537482,0 +"2020-12-26","PA",14883,,26,,,,5806,0,,1161,3221108,14229,,,,,769,605141,547125,7581,0,,,,,,381238,7326480,57329,7326480,57329,,,,,3768233,21835,,0 +"2020-12-26","PR",1432,1187,0,245,,,451,0,,82,305972,0,,,395291,,80,72443,68461,1019,0,53157,,,,20103,62579,,0,378415,1019,,,,,,0,415664,0 +"2020-12-26","RI",1732,,10,,6131,6131,442,0,,49,537809,604,,,1828284,,35,84208,,226,0,,,,,101517,,1929801,3504,1929801,3504,,,,,622017,830,,0 +"2020-12-26","SC",5124,4736,81,388,13894,13894,1758,118,,357,2742443,28716,87474,,2662483,,176,288892,266678,3864,0,15855,42119,,,346638,143320,,0,3031335,32580,103329,373991,,,,0,3009121,32002 +"2020-12-26","SD",1446,,16,,5533,5533,289,30,,65,270818,854,,,,,41,96963,88297,417,0,,,,,94483,88428,,0,587697,1754,,,,,367781,1271,587697,1754 +"2020-12-26","TN",6443,5657,12,786,14071,14071,3002,27,,773,,0,,,4908413,,460,560892,497374,14395,0,,67867,,,576184,476700,,0,5484597,27158,,580083,,,,0,5484597,27158 +"2020-12-26","TX",26421,,13,,,,10773,0,,2856,,0,,,,,,1660551,1470154,2694,0,79756,93216,,,1639161,1339447,,0,13367338,116767,672553,1114467,,,,0,13367338,116767 +"2020-12-26","UT",1212,,8,,10522,10522,526,116,1777,172,1285035,8447,,,1935460,625,,264078,,3489,0,,29632,,28402,257164,211473,,0,2192624,20856,,402138,,168034,1522432,11516,2192624,20856 +"2020-12-26","VA",4840,4272,20,568,17464,17464,2454,14,,548,,0,,,,,299,329577,279153,1584,0,16628,48074,,,341947,,4128799,58799,4128799,58799,184862,613309,,,,0,,0 +"2020-12-26","VI",23,,0,,,,,0,,,33205,0,,,,,,1979,,0,0,,,,,,1824,,0,35184,0,,,,,35269,0,,0 +"2020-12-26","VT",121,121,1,,,,17,0,,3,252473,2367,,,,,,6966,6803,185,0,,,,,,4591,,0,680816,9586,,,,,259276,2553,680816,9586 +"2020-12-26","WA",3184,,0,,13908,13908,1200,0,,243,,0,,,,,108,233093,224399,0,0,,,,,,,3649210,0,3649210,0,,,,,,0,,0 +"2020-12-26","WI",5029,4683,4,346,20734,20734,1243,31,2015,260,2330080,5261,,,,,,506022,468531,677,0,,,,,,433415,5241343,23019,5241343,23019,,,,,2798611,5893,,0 +"2020-12-26","WV",1253,1126,6,127,,,686,0,,188,,0,,,,,79,80177,65833,1341,0,,,,,,54295,,0,1444959,12287,25441,,,,,0,1444959,12287 +"2020-12-26","WY",373,,0,,1039,1039,146,12,,,156054,0,,,440841,,,43146,37129,482,0,,,,,37502,40423,,0,478351,0,,,,,192754,0,478351,0 +"2020-12-25","AK",199,199,0,,983,983,105,0,,,,0,,,1174340,,14,43629,,0,0,,,,,52047,,,0,1227735,0,,,,,,0,1227735,0 +"2020-12-25","AL",4680,4096,4,584,31954,31954,2465,0,2421,,1556670,6668,,,,1387,,342426,277754,3625,0,,,,,,193149,,0,1834424,9743,,,85353,,1834424,9743,,0 +"2020-12-25","AR",3438,2959,32,479,10927,10927,1062,48,,364,1819928,7995,,,1819928,1171,183,213267,178980,2122,0,,,,41184,,186425,,0,1998908,9835,,,,222349,,0,1998908,9835 +"2020-12-25","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-25","AZ",8409,7635,115,774,34977,34977,4226,457,,976,2275959,14444,,,,,636,486935,465013,6616,0,,,,,,,,0,4836931,49701,,,387374,,2740972,20455,4836931,49701 +"2020-12-25","CA",23947,,312,,,,19771,0,,4035,,0,,,,,,2042290,2042290,39144,0,,,,,,,,0,31066861,297112,,,,,,0,31066861,297112 +"2020-12-25","CO",4586,3948,36,638,17839,17839,1169,46,,,1787594,10386,239810,,,,,322189,308907,2659,0,28563,,,,,,4251042,53092,4251042,53092,270798,,,,2096501,12954,,0 +"2020-12-25","CT",5791,4686,0,1105,12257,12257,1200,0,,,,0,,,4182022,,,172743,162449,0,0,,8079,,,208095,,,0,4396459,20562,,113686,,,,0,4396459,20562 +"2020-12-25","DC",756,,0,,,,250,0,,72,,0,,,,,33,27436,,0,0,,,,,,19740,856781,0,856781,0,,,,,348189,0,,0 +"2020-12-25","DE",891,791,3,100,,,404,0,,62,442756,2121,,,,,,53653,51486,638,0,,,,,54697,,929429,7846,929429,7846,,,,,496409,2759,,0 +"2020-12-25","FL",21295,,0,,61922,61922,5457,0,,,7210248,0,578113,560932,11814196,,,1226530,1067767,0,0,71851,,69600,,1595315,,15093456,0,15093456,0,650372,,630838,,8436778,0,13468971,0 +"2020-12-25","GA",10631,9656,49,975,40630,40630,4216,91,7224,,,0,,,,,,624630,537079,6054,0,44423,,,,510539,,,0,5188835,53529,397795,,,,,0,5188835,53529 +"2020-12-25","GU",121,,0,,,,17,0,,7,87416,0,,,,,3,7268,7093,2,0,17,224,,,,6743,,0,94684,2,321,5347,,,,0,94507,0 +"2020-12-25","HI",285,285,0,,1711,1711,64,8,,11,,0,,,,,10,21204,20769,156,0,,,,,20662,,780457,-6184,780457,-6184,,,,,,0,,0 +"2020-12-25","IA",3744,,5,,,,600,0,,121,925669,1839,,77164,1914292,,69,234751,234751,870,0,,41836,8319,39264,254266,225156,,0,1160420,2709,,806456,85523,175519,1162663,2706,2179675,9513 +"2020-12-25","ID",1349,1191,25,158,5357,5357,433,41,978,106,422235,981,,,,,,135233,112397,1248,0,,,,,,53535,,0,534632,1917,,52274,,,534632,1917,837503,4134 +"2020-12-25","IL",17154,15799,194,1355,,,4352,0,,928,,0,,,,,538,930849,,5742,0,,,,,,,,0,12881938,98958,,,,,,0,12881938,98958 +"2020-12-25","IN",7770,7431,40,339,33664,33664,2918,199,5881,633,2097985,8174,,,,,369,488180,,5446,0,,,,,438752,,,0,5484835,53689,,,,,2586165,13620,5484835,53689 +"2020-12-25","KS",2507,,0,,6424,6424,1014,0,1722,255,752515,0,,,,411,119,209689,,0,0,,,,,,,,0,962204,0,,,,,962204,0,,0 +"2020-12-25","KY",2466,2312,0,154,12827,12827,1644,0,2944,413,,0,,,,,222,250280,202044,0,0,6485,15274,,,175378,35478,,0,3061692,0,100450,152691,,,,0,3061692,0 +"2020-12-25","LA",7272,6918,0,354,,,1633,0,,,3779323,0,,,,,199,296499,271177,0,0,,,,,,247501,,0,4075822,0,,192515,,,,0,4050500,0 +"2020-12-25","MA",11963,11706,0,257,15905,15905,2095,0,,409,3572264,0,,,,,232,341925,328307,0,0,,,12756,,401647,229910,,0,10514045,0,,,139022,335800,3900571,0,10514045,0 +"2020-12-25","MD",5659,5493,32,166,25541,25541,1721,469,,424,2471804,11313,,153039,,,,263160,263160,2432,0,,,18370,,315361,9272,,0,5507948,42080,,,171409,,2734964,13745,5507948,42080 +"2020-12-25","ME",319,314,2,5,1020,1020,187,5,,46,,0,12910,,,,19,21547,18517,321,0,522,2945,,,22424,11107,,0,1053655,9209,13444,69035,,,,0,1053655,9209 +"2020-12-25","MI",12415,11775,0,640,,,3108,0,,738,,0,,,7341599,,416,508449,469928,0,0,,,,,596059,284731,,0,7937658,0,415661,,,,,0,7937658,0 +"2020-12-25","MN",5050,4904,0,146,21105,21105,1048,0,4500,238,2511898,0,,,,,,404403,391441,0,0,,,,,,381269,5141662,0,5141662,0,,197888,,,2903339,0,,0 +"2020-12-25","MO",5308,,14,,,,2862,0,,685,1636369,3844,96329,,3129681,,366,378887,378887,2076,0,12392,38095,,,418233,,,0,3555031,19095,108934,326217,101662,146717,2015256,5920,3555031,19095 +"2020-12-25","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,118,118,0,0,,,,,,29,,0,17547,0,,,,,17542,0,26131,0 +"2020-12-25","MS",4562,3717,6,845,8039,8039,1377,0,,339,1127658,0,,,,,195,204178,143417,1527,0,,,,,,154669,,0,1331836,1527,60877,401956,,,,0,1267602,0 +"2020-12-25","MT",916,,0,,3406,3406,241,0,,46,,0,,,,,21,78929,,0,0,,,,,,70176,,0,771693,0,,,,,,0,771693,0 +"2020-12-25","NC",6360,6029,0,331,,,3043,0,,696,,0,,,,,,494511,455469,0,0,,,,,,,,0,6452744,76094,,230958,,,,0,6452744,76094 +"2020-12-25","ND",1267,,0,,3472,3472,122,0,512,21,284347,0,11953,,,,,90948,88317,0,0,1442,,,,,87367,1218701,0,1218701,0,13395,29892,,,372664,0,1285111,0 +"2020-12-25","NE",1568,,7,,5088,5088,538,24,,,671439,1352,,,1504685,,,160357,,695,0,,,,,183727,98973,,0,1690283,8512,,,,,832201,2046,1690283,8512 +"2020-12-25","NH",690,,0,,894,894,298,0,297,,465366,0,,,,,,38902,29654,0,0,,,,,,32324,,0,992283,0,35561,45360,34465,,495020,0,992283,0 +"2020-12-25","NJ",18595,16650,51,1945,46202,46202,3669,164,,753,7005463,56944,,,,,524,501097,454902,5605,0,,,,,,,,0,7506560,62549,,,,,,0,7460365,62004 +"2020-12-25","NM",2307,,35,,9159,9159,774,41,,,,0,,,,,,136622,,1456,0,,,,,,59178,,0,1912551,35627,,,,,,0,1912551,35627 +"2020-12-25","NV",2943,,27,,,,1885,0,,442,922283,2229,,,,,298,214064,214064,1853,0,,,,,,,2013939,10343,2013939,10343,,,,,1136347,4082,,0 +"2020-12-25","NY",29270,,121,,89995,89995,6950,0,,1148,,0,,,,,621,903716,,12446,0,,,,,,,24296753,226560,24296753,226560,,,,,,0,,0 +"2020-12-25","OH",8456,7687,0,769,36345,36345,4494,0,5675,1124,,0,,,,,683,653650,590630,0,0,,39910,,,624935,489808,,0,7472240,62370,,776605,,,,0,7472240,62370 +"2020-12-25","OK",2328,,0,,15912,15912,1729,0,,451,2314672,18341,,,2314672,,,272553,,0,0,7767,,,,272549,234967,,0,2587225,18341,103518,,,,,0,2591908,21788 +"2020-12-25","OR",1415,,12,,6168,6168,530,46,,109,,0,,,2389013,,59,106821,,851,0,,,,,148469,,,0,2537482,19586,,,,,,0,2537482,19586 +"2020-12-25","PA",14857,,139,,,,5925,0,,1196,3206879,13351,,,,,737,597560,539519,7174,0,,,,,,371943,7269151,63394,7269151,63394,,,,,3746398,19931,,0 +"2020-12-25","PR",1432,1187,9,245,,,475,0,,87,305972,0,,,395291,,90,71424,67426,616,0,51457,,,,20103,60901,,0,377396,616,,,,,,0,415664,0 +"2020-12-25","RI",1722,,7,,6131,6131,442,0,,49,537205,3410,,,1825064,,35,83982,,870,0,,,,,101233,,1926297,17783,1926297,17783,,,,,621187,4280,,0 +"2020-12-25","SC",5043,4662,0,381,13776,13776,1766,0,,365,2713727,0,87064,,2634628,,177,285028,263392,0,0,15698,40482,,,342491,141962,,0,2998755,0,102762,360223,,,,0,2977119,0 +"2020-12-25","SD",1430,,0,,5503,5503,312,0,,68,269964,0,,,,,36,96546,88003,0,0,,,,,94251,88018,,0,585943,2427,,,,,366510,0,585943,2427 +"2020-12-25","TN",6431,5646,0,785,14044,14044,3092,0,,757,,0,,,4886409,,451,546497,485728,0,0,,64996,,,571030,462694,,0,5457439,44357,,562546,,,,0,5457439,44357 +"2020-12-25","TX",26408,,200,,,,10868,0,,2856,,0,,,,,,1657857,1467898,4335,0,77870,90155,,,1620425,1332913,,0,13250571,113871,664120,1086179,,,,0,13250571,113871 +"2020-12-25","UT",1204,,0,,10406,10406,605,0,1776,180,1276588,0,,,1918035,623,,260589,,0,0,,29207,,28010,253733,204844,,0,2171768,0,,396276,,166594,1510916,0,2171768,0 +"2020-12-25","VA",4820,4268,29,552,17450,17450,2478,61,,518,,0,,,,,291,327993,278048,4078,0,16504,47681,,,338769,,4070000,0,4070000,0,184332,611273,,,,0,,0 +"2020-12-25","VI",23,,0,,,,,0,,,33205,189,,,,,,1979,,12,0,,,,,,1824,,0,35184,201,,,,,35269,169,,0 +"2020-12-25","VT",120,120,0,,,,23,0,,6,250106,0,,,,,,6781,6617,0,0,,,,,,4442,,0,671230,0,,,,,256723,0,671230,0 +"2020-12-25","WA",3184,,22,,13908,13908,1200,291,,243,,0,,,,,108,233093,224399,2891,0,,,,,,,3649210,28560,3649210,28560,,,,,,0,,0 +"2020-12-25","WI",5025,4679,6,346,20703,20703,1243,56,2015,260,2324819,7109,,,,,,505345,467899,1639,0,,,,,,431428,5218324,39125,5218324,39125,,,,,2792718,8615,,0 +"2020-12-25","WV",1247,1123,19,124,,,702,0,,181,,0,,,,,77,78836,64718,1597,0,,,,,,53729,,0,1432672,13302,25342,,,,,0,1432672,13302 +"2020-12-25","WY",373,,0,,1027,1027,146,0,,,156054,0,,,440841,,,42664,36700,0,0,,,,,37502,40258,,0,478351,0,,,,,192754,0,478351,0 +"2020-12-24","AK",199,199,2,,983,983,105,22,,,,0,,,1174340,,14,43629,,268,0,,,,,52047,,,0,1227735,5708,,,,,,0,1227735,5708 +"2020-12-24","AL",4676,4093,89,583,31954,31954,2542,303,2418,,1550002,8151,,,,1387,,338801,274679,4232,0,,,,,,193149,,0,1824681,11330,,,84371,,1824681,11330,,0 +"2020-12-24","AR",3406,2946,30,460,10879,10879,1093,53,,360,1811933,15860,,,1811933,1166,178,211145,177140,3204,0,,,,40784,,184335,,0,1989073,18218,,,,221177,,0,1989073,18218 +"2020-12-24","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-24","AZ",8294,7538,115,756,34520,34520,4221,408,,965,2261515,16180,,,,,620,480319,459002,7046,0,,,,,,,,0,4787230,54963,,,386490,,2720517,22502,4787230,54963 +"2020-12-24","CA",23635,,351,,,,19771,0,,4069,,0,,,,,,2003146,2003146,39070,0,,,,,,,,0,30769749,301189,,,,,,0,30769749,301189 +"2020-12-24","CO",4550,3913,88,637,17793,17793,1260,151,,,1777208,10504,237668,,,,,319530,306339,3030,0,28074,,,,,,4197950,44166,4197950,44166,268373,,,,2083547,13350,,0 +"2020-12-24","CT",5791,4686,55,1105,12257,12257,1200,0,,,,0,,,4163338,,,172743,162449,2038,0,,8079,,,206231,,,0,4375897,39237,,113686,,,,0,4375897,39237 +"2020-12-24","DC",756,,5,,,,250,0,,72,,0,,,,,33,27436,,210,0,,,,,,19740,856781,6789,856781,6789,,,,,348189,1495,,0 +"2020-12-24","DE",888,788,16,100,,,426,0,,60,440635,2622,,,,,,53015,50887,780,0,,,,,53999,,921583,7829,921583,7829,,,,,493650,3402,,0 +"2020-12-24","FL",21295,,122,,61922,61922,5619,305,,,7210248,47074,578113,560932,11814196,,,1226530,1067767,12770,0,71851,,69600,,1595315,,15093456,151586,15093456,151586,650372,,630838,,8436778,59844,13468971,128510 +"2020-12-24","GA",10582,9607,63,975,40539,40539,4240,400,7217,,,0,,,,,,618576,531954,10286,0,44099,,,,503859,,,0,5135306,49170,396503,,,,,0,5135306,49170 +"2020-12-24","GU",121,,0,,,,20,0,,7,87416,191,,,,,3,7266,7091,9,0,17,224,,,,6743,,0,94682,200,321,5347,,,,0,94507,198 +"2020-12-24","HI",285,285,0,,1703,1703,67,0,,14,,0,,,,,11,21048,20650,128,0,,,,,20526,,786641,5206,786641,5206,,,,,,0,,0 +"2020-12-24","IA",3739,,71,,,,625,0,,127,923830,1811,,77090,1905791,,70,233881,233881,1116,0,,41540,8278,38958,253283,224817,,0,1157711,2927,,796334,85408,174174,1159957,2928,2170162,11080 +"2020-12-24","ID",1324,1169,11,155,5316,5316,433,49,965,106,421254,1067,,,,,,133985,111461,1391,0,,,,,,52799,,0,532715,2177,,52274,,,532715,2177,833369,4511 +"2020-12-24","IL",16960,15643,118,1317,,,4488,0,,944,,0,,,,,518,925107,,7037,0,,,,,,,,0,12782980,94909,,,,,,0,12782980,94909 +"2020-12-24","IN",7730,7391,85,339,33465,33465,3013,251,5857,633,2089811,9856,,,,,369,482734,,6196,0,,,,,438752,,,0,5431146,54571,,,,,2572545,16052,5431146,54571 +"2020-12-24","KS",2507,,0,,6424,6424,1014,0,1722,255,752515,0,,,,411,119,209689,,0,0,,,,,,,,0,962204,0,,,,,962204,0,,0 +"2020-12-24","KY",2466,2312,0,154,12827,12827,1644,0,2944,413,,0,,,,,222,250280,202044,0,0,6485,15274,,,175378,35478,,0,3061692,0,100450,152691,,,,0,3061692,0 +"2020-12-24","LA",7272,6918,46,354,,,1633,0,,,3779323,22791,,,,,199,296499,271177,2565,0,,,,,,247501,,0,4075822,25356,,192515,,,,0,4050500,24984 +"2020-12-24","MA",11963,11706,76,257,15905,15905,2095,533,,409,3572264,23429,,,,,232,341925,328307,5937,0,,,12756,,401647,229910,,0,10514045,114476,,,139022,335800,3900571,29084,10514045,114476 +"2020-12-24","MD",5627,5462,59,165,25072,25072,1760,0,,426,2460491,13413,,153039,,,,260728,260728,2866,0,,,18370,,315361,9197,,0,5465868,45869,,,171409,,2721219,16279,5465868,45869 +"2020-12-24","ME",317,312,6,5,1015,1015,187,15,,46,,0,12910,,,,19,21226,18258,735,0,522,2888,,,21956,11078,,0,1044446,9245,13444,66464,,,,0,1044446,9245 +"2020-12-24","MI",12415,11775,0,640,,,3108,0,,738,,0,,,7341599,,416,508449,469928,0,0,,,,,596059,284731,,0,7937658,0,415661,,,,,0,7937658,0 +"2020-12-24","MN",5050,4904,79,146,21105,21105,1048,142,4500,238,2511898,12130,,,,,,404403,391441,1884,0,,,,,,381269,5141662,46859,5141662,46859,,197888,,,2903339,13689,,0 +"2020-12-24","MO",5294,,39,,,,2749,0,,667,1632525,5259,95957,,3112868,,349,376811,376811,3231,0,12229,37694,,,415974,,,0,3535936,22323,108399,319585,101217,144738,2009336,8490,3535936,22323 +"2020-12-24","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,118,118,2,0,,,,,,29,,0,17547,2,,,,,17542,0,26131,0 +"2020-12-24","MS",4556,3715,23,841,8039,8039,1377,0,,339,1127658,0,,,,,195,202651,142715,2326,0,,,,,,154669,,0,1330309,2326,60877,401956,,,,0,1267602,0 +"2020-12-24","MT",916,,2,,3406,3406,241,46,,47,,0,,,,,19,78929,,407,0,,,,,,70176,,0,771693,5497,,,,,,0,771693,5497 +"2020-12-24","NC",6360,6029,0,331,,,3043,0,,696,,0,,,,,,494511,455469,0,0,,,,,,,,0,6376650,57913,,230958,,,,0,6376650,57913 +"2020-12-24","ND",1267,,18,,3472,3472,122,36,512,21,284347,806,11953,,,,,90948,88317,225,0,1442,,,,,87367,1218701,6981,1218701,6981,13395,29111,,,372664,995,1285111,7668 +"2020-12-24","NE",1561,,40,,5064,5064,572,28,,,670087,3150,,,1497056,,,159662,,1338,0,,,,,182843,96706,,0,1681771,19447,,,,,830155,4494,1681771,19447 +"2020-12-24","NH",690,,13,,894,894,298,2,297,,465366,2992,,,,,,38902,29654,390,0,,,,,,32324,,0,992283,12749,35561,45360,34465,,495020,3344,992283,12749 +"2020-12-24","NJ",18544,16599,78,1945,46038,46038,3802,231,,749,6948519,46010,,,,,524,495492,449842,5330,0,,,,,,,,0,7444011,51340,,,,,,0,7398361,50714 +"2020-12-24","NM",2272,,29,,9118,9118,811,111,,,,0,,,,,,135166,,1924,0,,,,,,58917,,0,1876924,15062,,,,,,0,1876924,15062 +"2020-12-24","NV",2916,,45,,,,1908,0,,458,920054,5829,,,,,287,212211,212211,2249,0,,,,,,,2003596,18658,2003596,18658,,,,,1132265,8078,,0 +"2020-12-24","NY",29149,,133,,89995,89995,6928,0,,1160,,0,,,,,621,891270,,12568,0,,,,,,,24070193,226296,24070193,226296,,,,,,0,,0 +"2020-12-24","OH",8456,7687,95,769,36345,36345,4494,320,5675,1124,,0,,,,,683,653650,590630,8828,0,,38880,,,617567,489808,,0,7409870,57406,,753351,,,,0,7409870,57406 +"2020-12-24","OK",2328,,45,,15912,15912,1836,234,,477,2296331,22352,,,2296331,,,272553,,3277,0,7767,,,,268811,234967,,0,2568884,25629,103518,,,,,0,2570120,26144 +"2020-12-24","OR",1403,,21,,6122,6122,579,108,,125,,0,,,2370768,,67,105970,,897,0,,,,,147128,,,0,2517896,26459,,,,,,0,2517896,26459 +"2020-12-24","PA",14718,,276,,,,6077,0,,1219,3193528,12262,,,,,743,590386,532939,9230,0,,,,,,371943,7205757,57447,7205757,57447,,,,,3726467,19398,,0 +"2020-12-24","PR",1423,1179,15,244,,,534,0,,90,305972,0,,,395291,,88,70808,66871,320,0,51209,,,,20103,59690,,0,376780,320,,,,,,0,415664,0 +"2020-12-24","RI",1715,,11,,6131,6131,442,0,,49,533795,2022,,,1808334,,35,83112,,1046,0,,,,,100180,,1908514,21057,1908514,21057,,,,,616907,3068,,0 +"2020-12-24","SC",5043,4662,15,381,13776,13776,1766,104,,365,2713727,20238,87064,,2634628,,177,285028,263392,2798,0,15698,40482,,,342491,141962,,0,2998755,23036,102762,360223,,,,0,2977119,22606 +"2020-12-24","SD",1430,,41,,5503,5503,312,11,,68,269964,878,,,,,36,96546,88003,506,0,,,,,93957,88018,,0,583516,2733,,,,,366510,1384,583516,2733 +"2020-12-24","TN",6431,5646,51,785,14044,14044,3173,74,,813,,0,,,4849895,,471,546497,485728,5257,0,,64996,,,563187,462694,,0,5413082,26257,,562546,,,,0,5413082,26257 +"2020-12-24","TX",26208,,308,,,,10724,0,,2865,,0,,,,,,1653522,1464556,17064,0,76711,89067,,,1603396,1326975,,0,13136700,114845,658985,1070160,,,,0,13136700,114845 +"2020-12-24","UT",1204,,8,,10406,10406,605,79,1776,180,1276588,5748,,,1918035,623,,260589,,2892,0,,29207,,28010,253733,204844,,0,2171768,16060,,396276,,166594,1510916,7858,2171768,16060 +"2020-12-24","VA",4791,4263,31,528,17389,17389,2577,118,,530,,0,,,,,294,323915,275235,4782,0,16337,46717,,,334662,,4070000,40097,4070000,40097,183622,600101,,,,0,,0 +"2020-12-24","VI",23,,0,,,,,0,,,33016,255,,,,,,1967,,17,0,,,,,,1817,,0,34983,272,,,,,35100,284,,0 +"2020-12-24","VT",120,120,3,,,,23,0,,6,250106,1518,,,,,,6781,6617,101,0,,,,,,4442,,0,671230,7546,,,,,256723,1619,671230,7546 +"2020-12-24","WA",3162,,31,,13617,13617,1202,27,,263,,0,,,,,105,230202,221695,2315,0,,,,,,,3620650,30191,3620650,30191,,,,,,0,,0 +"2020-12-24","WI",5019,4674,66,345,20647,20647,1243,128,2016,260,2317710,7719,,,,,,503706,466393,3263,0,,,,,,428208,5179199,39779,5179199,39779,,,,,2784103,10518,,0 +"2020-12-24","WV",1228,1105,34,123,,,739,0,,170,,0,,,,,75,77239,63518,1303,0,,,,,,53054,,0,1419370,12186,25195,,,,,0,1419370,12186 +"2020-12-24","WY",373,,0,,1027,1027,161,0,,,156054,0,,,440841,,,42664,36700,0,0,,,,,37502,40258,,0,478351,0,,,,,192754,0,478351,0 +"2020-12-23","AK",197,197,3,,961,961,111,13,,,,0,,,1168903,,15,43361,,360,0,,,,,51776,,,0,1222027,6745,,,,,,0,1222027,6745 +"2020-12-23","AL",4587,4023,135,564,31651,31651,2535,346,2412,,1541851,9211,,,,1385,,334569,271500,4758,0,,,,,,193149,,0,1813351,12372,,,83461,,1813351,12372,,0 +"2020-12-23","AR",3376,2939,38,437,10826,10826,1110,175,,340,1796073,10877,,,1796073,1163,174,207941,174782,2893,0,,,,39849,,182024,,0,1970855,12877,,,,216498,,0,1970855,12877 +"2020-12-23","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-23","AZ",8179,7434,54,745,34112,34112,4163,493,,972,2245335,11584,,,,,673,473273,452680,6058,0,,,,,,,,0,4732267,42251,,,385614,,2698015,17167,4732267,42251 +"2020-12-23","CA",23284,,361,,,,19361,0,,3955,,0,,,,,,1964076,1964076,39069,0,,,,,,,,0,30468560,278378,,,,,,0,30468560,278378 +"2020-12-23","CO",4462,3831,93,631,17642,17642,1336,161,,,1766704,10601,235832,,,,,316500,303493,2948,0,27602,,,,,,4153784,43042,4153784,43042,265742,,,,2070197,13403,,0 +"2020-12-23","CT",5736,4641,33,1095,12257,12257,1155,0,,,,0,,,4126730,,,170705,160524,1745,0,,7910,,,203639,,,0,4336660,45748,,110620,,,,0,4336660,45748 +"2020-12-23","DC",751,,7,,,,253,0,,76,,0,,,,,27,27226,,326,0,,,,,,19514,849992,9790,849992,9790,,,,,346694,2332,,0 +"2020-12-23","DE",872,772,0,100,,,454,0,,64,438013,1361,,,,,,52235,50139,612,0,,,,,53197,,913754,3382,913754,3382,,,,,490248,1973,,0 +"2020-12-23","FL",21173,,121,,61617,61617,5590,338,,,7163174,42208,578113,560932,11703145,,,1213760,1059114,11100,0,71851,,69600,,1578242,,14941870,108462,14941870,108462,650372,,630838,,8376934,53308,13340461,106679 +"2020-12-23","GA",10519,9554,56,965,40139,40139,4157,303,7148,,,0,,,,,,608290,524055,7773,0,43568,,,,496830,,,0,5086136,36781,394629,,,,,0,5086136,36781 +"2020-12-23","GU",121,,0,,,,21,0,,7,87225,421,,,,,3,7257,7084,19,0,17,224,,,,6707,,0,94482,440,321,5242,,,,0,94309,439 +"2020-12-23","HI",285,285,3,,1703,1703,67,24,,14,,0,,,,,11,20920,20522,105,0,,,,,20322,,781435,4499,781435,4499,,,,,,0,,0 +"2020-12-23","IA",3668,,15,,,,644,0,,139,922019,2515,,76814,1895983,,71,232765,232765,1501,0,,41069,8097,38530,252063,222079,,0,1154784,4016,,783600,84951,172087,1157029,4025,2159082,14522 +"2020-12-23","ID",1313,1158,12,155,5267,5267,345,59,958,87,420187,794,,,,,,132594,110351,1717,0,,,,,,51996,,0,530538,2043,,52274,,,530538,2043,828858,4445 +"2020-12-23","IL",16842,15547,171,1295,,,4593,0,,953,,0,,,,,536,918070,,6762,0,,,,,,,,0,12688071,82328,,,,,,0,12688071,82328 +"2020-12-23","IN",7645,7306,64,339,33214,33214,3123,222,5820,664,2079955,6813,,,,,364,476538,,4662,0,,,,,432483,,,0,5376575,45972,,,,,2556493,11475,5376575,45972 +"2020-12-23","KS",2507,,59,,6424,6424,1014,157,1722,255,752515,10992,,,,411,119,209689,,5089,0,,,,,,,,0,962204,16081,,,,,962204,16081,,0 +"2020-12-23","KY",2466,2312,26,154,12827,12827,1644,152,2944,413,,0,,,,,222,250280,202044,2936,0,6485,15274,,,175378,35478,,0,3061692,23620,100450,152691,,,,0,3061692,23620 +"2020-12-23","LA",7226,6877,68,349,,,1675,0,,,3756532,24734,,,,,196,293934,268984,2974,0,,,,,,247501,,0,4050466,27708,,189580,,,,0,4025516,26765 +"2020-12-23","MA",11887,11630,83,257,15372,15372,2066,0,,409,3548835,18551,,,,,226,335988,322652,4814,0,,,12560,,395232,206843,,0,10399569,97655,,,137188,331189,3871487,23060,10399569,97655 +"2020-12-23","MD",5568,5402,49,166,25072,25072,1776,117,,419,2447078,11725,,153039,,,,257862,257862,2465,0,,,18370,,311814,9197,,0,5419999,39810,,,171409,,2704940,14190,5419999,39810 +"2020-12-23","ME",311,306,8,5,1000,1000,187,15,,46,,0,12880,,,,19,20491,17695,748,0,519,2783,,,21639,11039,,0,1035201,7692,13411,63747,,,,0,1035201,7692 +"2020-12-23","MI",12415,11775,73,640,,,3108,0,,738,,0,,,7341599,,416,508449,469928,3820,0,,,,,596059,284731,,0,7937658,32764,415661,,,,,0,7937658,32764 +"2020-12-23","MN",4971,4834,75,137,20963,20963,1073,147,4474,238,2499768,6671,,,,,,402519,389882,1508,0,,,,,,379512,5094803,17828,5094803,17828,,193195,,,2889650,7880,,0 +"2020-12-23","MO",5255,,97,,,,2716,0,,652,1627266,3857,95232,,3094141,,353,373580,373580,3141,0,11958,36785,,,412435,,,0,3513613,17442,107403,307084,100368,140885,2000846,6998,3513613,17442 +"2020-12-23","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,116,116,0,0,,,,,,29,,0,17545,0,,,,,17542,0,26131,0 +"2020-12-23","MS",4533,3702,43,831,8039,8039,1377,0,,339,1127658,0,,,,,195,200325,141944,2634,0,,,,,,154669,,0,1327983,2634,60877,401956,,,,0,1267602,0 +"2020-12-23","MT",914,,19,,3360,3360,251,28,,50,,0,,,,,24,78522,,575,0,,,,,,69555,,0,766196,3342,,,,,,0,766196,3342 +"2020-12-23","NC",6360,6029,69,331,,,3043,0,,696,,0,,,,,,494511,455469,5609,0,,,,,,,,0,6318737,44277,,230958,,,,0,6318737,44277 +"2020-12-23","ND",1249,,5,,3436,3436,118,15,509,20,283541,566,11953,,,,,90723,88128,270,0,1442,,,,,87091,1211720,3249,1211720,3249,13395,27540,,,371669,747,1277443,3682 +"2020-12-23","NE",1521,,10,,5036,5036,566,23,,,666937,2255,,,1479195,,,158324,,1221,0,,,,,181274,96359,,0,1662324,13765,,,,,825661,3477,1662324,13765 +"2020-12-23","NH",677,,21,,892,892,305,3,297,,462374,2040,,,,,,38512,29302,504,0,,,,,,31426,,0,979534,5853,35467,42450,34409,,491676,2415,979534,5853 +"2020-12-23","NJ",18466,16521,140,1945,45807,45807,3841,263,,765,6902509,42749,,,,,485,490162,445138,5453,0,,,,,,,,0,7392671,48202,,,,,,0,7347647,52124 +"2020-12-23","NM",2243,,40,,9007,9007,809,60,,,,0,,,,,,133242,,1167,0,,,,,,57980,,0,1861862,10080,,,,,,0,1861862,10080 +"2020-12-23","NV",2871,,46,,,,2001,0,,460,914225,3502,,,,,312,209962,209962,2988,0,,,,,,,1984938,16319,1984938,16319,,,,,1124187,6490,,0 +"2020-12-23","NY",29016,,166,,89995,89995,6864,0,,1166,,0,,,,,633,878702,,11937,0,,,,,,,23843897,204361,23843897,204361,,,,,,0,,0 +"2020-12-23","OH",8361,7613,109,748,36025,36025,4694,431,5640,1131,,0,,,,,708,644822,583118,7790,0,,37885,,,610369,479387,,0,7352464,31337,,740164,,,,0,7352464,31337 +"2020-12-23","OK",2283,,43,,15678,15678,1728,274,,449,2273979,22662,,,2273979,,,269276,,3656,0,7767,,,,265379,231522,,0,2543255,26318,103518,,,,,0,2543976,26964 +"2020-12-23","OR",1382,,35,,6014,6014,579,74,,125,,0,,,2346094,,67,105073,,1318,0,,,,,145343,,,0,2491437,18993,,,,,,0,2491437,18993 +"2020-12-23","PA",14442,,230,,,,6142,0,,1263,3181266,12384,,,,,764,581156,525803,9605,0,,,,,,360316,7148310,62275,7148310,62275,,,,,3707069,20328,,0 +"2020-12-23","PR",1408,1166,17,242,,,537,0,,86,305972,0,,,395291,,87,70488,66583,576,0,51097,,,,20103,58562,,0,376460,576,,,,,,0,415664,0 +"2020-12-23","RI",1704,,26,,6131,6131,442,72,,49,531773,3032,,,1788394,,35,82066,,879,0,,,,,99063,,1887457,18029,1887457,18029,,,,,613839,3911,,0 +"2020-12-23","SC",5028,4651,52,377,13672,13672,1671,165,,355,2693489,29364,86869,,2614924,,142,282230,261024,4175,0,15586,39458,,,339589,140452,,0,2975719,33539,102455,350852,,,,0,2954513,33048 +"2020-12-23","SD",1389,,8,,5492,5492,337,31,,70,269086,997,,,,,39,96040,87630,531,0,,,,,93516,87337,,0,580783,1852,,,,,365126,1528,580783,1852 +"2020-12-23","TN",6380,5612,111,768,13970,13970,3162,94,,783,,0,,,4828154,,438,541240,481706,7221,0,,63579,,,558671,455586,,0,5386825,29883,,554355,,,,0,5386825,29883 +"2020-12-23","TX",25900,,294,,,,10574,0,,2874,,0,,,,,,1636458,1451256,23363,0,75952,87150,,,1584829,1311851,,0,13021855,73512,655566,1050963,,,,0,13021855,73512 +"2020-12-23","UT",1196,,23,,10327,10327,615,109,1765,198,1270840,5093,,,1904336,620,,257697,,2612,0,,28545,,27384,251372,200943,,0,2155708,14387,,387973,,163821,1503058,7211,2155708,14387 +"2020-12-23","VA",4760,4251,55,509,17271,17271,2586,188,,532,,0,,,,,290,319133,271811,4652,0,16098,45465,,,329850,,4029903,36671,4029903,36671,182305,581961,,,,0,,0 +"2020-12-23","VI",23,,0,,,,,0,,,32761,734,,,,,,1950,,16,0,,,,,,1802,,0,34711,750,,,,,34816,761,,0 +"2020-12-23","VT",117,117,5,,,,29,0,,7,248588,-61,,,,,,6680,6516,72,0,,,,,,4380,,0,663684,3382,,,,,255104,7,663684,3382 +"2020-12-23","WA",3131,,25,,13590,13590,774,75,,195,,0,,,,,97,227887,219584,1252,0,,,,,,,3590459,30764,3590459,30764,,,,,,0,,0 +"2020-12-23","WI",4953,4614,74,339,20519,20519,1243,164,2006,260,2309991,6277,,,,,,500443,463594,3063,0,,,,,,424946,5139420,28876,5139420,28876,,,,,2773585,8856,,0 +"2020-12-23","WV",1194,1079,23,115,,,737,0,,175,,0,,,,,78,75936,62419,1199,0,,,,,,51916,,0,1407184,5978,24842,,,,,0,1407184,5978 +"2020-12-23","WY",373,,0,,1027,1027,161,4,,,156054,453,,,440841,,,42664,36700,285,0,,,,,37502,40258,,0,478351,2551,,,,,192754,603,478351,2551 +"2020-12-22","AK",194,194,10,,948,948,121,11,,,,0,,,1162534,,13,43001,,438,0,,,,,51404,,,0,1215282,14305,,,,,,0,1215282,14305 +"2020-12-22","AL",4452,3910,63,542,31305,31305,2527,311,2399,,1532640,7130,,,,1381,,329811,268339,4979,0,,,,,,183625,,0,1800979,10678,,,82834,,1800979,10678,,0 +"2020-12-22","AR",3338,2910,43,428,10651,10651,1103,81,,353,1785196,7339,,,1785196,1147,173,205048,172782,1941,0,,,,38881,,179706,,0,1957978,8449,,,,212073,,0,1957978,8449 +"2020-12-22","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-22","AZ",8125,7406,153,719,33619,33619,4019,424,,943,2233751,9375,,,,,644,467215,447097,5870,0,,,,,,,,0,4690016,31430,,,385065,,2680848,14818,4690016,31430 +"2020-12-22","CA",22923,,247,,,,18961,0,,3861,,0,,,,,,1925007,1925007,32659,0,,,,,,,,0,30190182,329778,,,,,,0,30190182,329778 +"2020-12-22","CO",4369,3747,-9,622,17481,17481,1358,253,,,1756103,7399,233980,,,,,313552,300691,2516,0,27108,,,,,,4110742,34321,4110742,34321,263434,,,,2056794,9673,,0 +"2020-12-22","CT",5703,4613,27,1090,12257,12257,1159,0,,,,0,,,4083765,,,168960,158957,1583,0,,7660,,,200899,,,0,4290912,47895,,106843,,,,0,4290912,47895 +"2020-12-22","DC",744,,2,,,,256,0,,76,,0,,,,,23,26900,,160,0,,,,,,19275,840202,6064,840202,6064,,,,,344362,1195,,0 +"2020-12-22","DE",872,772,1,100,,,433,0,,61,436652,1604,,,,,,51623,49627,567,0,,,,,52822,,910372,4808,910372,4808,,,,,488275,2171,,0 +"2020-12-22","FL",21052,,76,,61279,61279,5634,326,,,7120966,37852,578113,560932,11611346,,,1202660,1052149,10204,0,71851,,69600,,1563736,,14833408,105361,14833408,105361,650372,,630838,,8323626,48056,13233782,101519 +"2020-12-22","GA",10463,9503,64,960,39836,39836,4137,334,7103,,,0,,,,,,600517,518902,9079,0,42937,,,,491226,,,0,5049355,50049,392358,,,,,0,5049355,50049 +"2020-12-22","GU",121,,1,,,,23,0,,8,86804,448,,,,,6,7238,7066,27,0,17,224,,,,6668,,0,94042,475,321,5212,,,,0,93870,473 +"2020-12-22","HI",282,282,0,,1679,1679,49,0,,15,,0,,,,,8,20815,20417,66,0,,,,,20322,,776936,3486,776936,3486,,,,,,0,,0 +"2020-12-22","IA",3653,,64,,,,651,0,,140,919504,1065,,76371,1883131,,71,231264,231264,642,0,,40455,7849,37951,250465,219071,,0,1150768,1707,,768903,84260,169606,1153004,1717,2144560,8731 +"2020-12-22","ID",1301,1151,21,150,5208,5208,345,53,948,87,419393,1449,,,,,,130877,109102,917,0,,,,,,51421,,0,528495,2127,,52274,,,528495,2127,824413,5093 +"2020-12-22","IL",16671,15414,144,1257,,,4571,0,,981,,0,,,,,557,911308,,6239,0,,,,,,,,0,12605743,84764,,,,,,0,12605743,84764 +"2020-12-22","IN",7581,7244,143,337,32992,32992,3064,282,5780,649,2073142,7689,,,,,356,471876,,3657,0,,,,,428014,,,0,5330603,41961,,,,,2545018,11346,5330603,41961 +"2020-12-22","KS",2448,,0,,6267,6267,630,0,1684,168,741523,0,,,,411,92,204600,,0,0,,,,,,,,0,946123,0,,,,,946123,0,,0 +"2020-12-22","KY",2440,2288,28,152,12675,12675,1631,160,2921,419,,0,,,,,223,247344,199942,3047,0,,,,,,35118,,0,3038072,9168,100320,149517,,,,0,3038072,9168 +"2020-12-22","LA",7158,6813,51,345,,,1647,0,,,3731798,37750,,,,,181,290960,266953,3699,0,,,,,,232725,,0,4022758,41449,,183528,,,,0,3998751,40516 +"2020-12-22","MA",11804,11549,45,255,15372,15372,2004,0,,412,3530284,14749,,,,,233,331174,318143,3800,0,,,12560,,389326,206843,,0,10301914,62078,,,137188,327368,3848427,18042,10301914,62078 +"2020-12-22","MD",5519,5353,48,166,24955,24955,1717,197,,400,2435353,14936,,150832,,,,255397,255397,2324,0,,,17546,,308655,9128,,0,5380189,55698,,,168378,,2690750,17260,5380189,55698 +"2020-12-22","ME",303,298,10,5,985,985,185,5,,43,,0,12839,,,,19,19743,17095,458,0,516,2671,,,21202,10884,,0,1027509,6652,13367,61182,,,,0,1027509,6652 +"2020-12-22","MI",12342,11705,189,637,,,3156,0,,731,,0,,,7311369,,426,504629,466485,3514,0,,,,,593525,284731,,0,7904894,33595,413750,,,,,0,7904894,33595 +"2020-12-22","MN",4896,4763,24,133,20816,20816,1060,187,4449,228,2493097,9882,,,,,,401011,388673,1700,0,,,,,,376354,5076975,30010,5076975,30010,,187586,,,2881770,11433,,0 +"2020-12-22","MO",5158,,211,,,,2703,0,,640,1623409,3274,94799,,3080143,,354,370439,370439,2123,0,11781,35707,,,409021,,,0,3496171,13339,106793,298022,99861,137179,1993848,5397,3496171,13339 +"2020-12-22","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,116,116,0,0,,,,,,29,,0,17545,0,,,,,17542,0,26131,0 +"2020-12-22","MS",4490,3683,79,807,8039,8039,1340,0,,336,1127658,0,,,,,192,197691,140913,2191,0,,,,,,154669,,0,1325349,2191,60877,401956,,,,0,1267602,0 +"2020-12-22","MT",895,,14,,3332,3332,253,52,,62,,0,,,,,27,77947,,623,0,,,,,,69101,,0,762854,3875,,,,,,0,762854,3875 +"2020-12-22","NC",6291,5980,51,311,,,3001,0,,686,,0,,,,,,488902,451384,5255,0,,,,,,,,0,6274460,35857,,224620,,,,0,6274460,35857 +"2020-12-22","ND",1244,,5,,3421,3421,135,21,505,19,282975,989,11953,,,,,90453,87947,332,0,1442,,,,,86776,1208471,4179,1208471,4179,13395,25828,,,370922,1234,1273761,4555 +"2020-12-22","NE",1511,,25,,5013,5013,582,21,,,664682,1364,,,1466904,,,157103,,721,0,,,,,179794,95171,,0,1648559,8511,,,,,822184,2085,1648559,8511 +"2020-12-22","NH",656,,0,,889,889,297,0,297,,460334,1758,,,,,,38008,28927,620,0,,,,,,30867,,0,973681,5079,35405,41378,34355,,489261,2238,973681,5079 +"2020-12-22","NJ",18326,16418,103,1908,45544,45544,3735,260,,740,6859760,0,,,,,492,484709,440336,5266,0,,,,,,,,0,7344469,5266,,,,,,0,7295523,0 +"2020-12-22","NM",2203,,23,,8947,8947,810,101,,,,0,,,,,,132075,,1267,0,,,,,,56844,,0,1851782,10198,,,,,,0,1851782,10198 +"2020-12-22","NV",2825,,38,,,,1996,0,,437,910723,2677,,,,,302,206974,206974,1090,0,,,,,,,1968619,8961,1968619,8961,,,,,1117697,3767,,0 +"2020-12-22","NY",28850,,141,,89995,89995,6661,0,,1126,,0,,,,,614,866765,,9716,0,,,,,,,23639536,164868,23639536,164868,,,,,,0,,0 +"2020-12-22","OH",8252,7530,130,722,35594,35594,4829,546,5588,1160,,0,,,,,742,637032,576802,7678,0,,36479,,,605623,467570,,0,7321127,30254,,710878,,,,0,7321127,30254 +"2020-12-22","OK",2240,,22,,15404,15404,1759,46,,481,2251317,52569,,,2251317,,,265620,,2186,0,7767,,,,261271,228191,,0,2516937,54755,103518,,,,,0,2517012,61388 +"2020-12-22","OR",1347,,6,,5940,5940,595,103,,131,,0,,,2328237,,59,103755,,825,0,,,,,144207,,,0,2472444,56640,,,,,,0,2472444,56640 +"2020-12-22","PA",14212,,231,,,,6151,0,,1236,3168882,8807,,,,,772,571551,517859,7962,0,,,,,,348646,7086035,47369,7086035,47369,,,,,3686741,14681,,0 +"2020-12-22","PR",1391,1150,9,241,,,535,0,,93,305972,0,,,395291,,97,69912,66067,1063,0,50791,,,,20103,57458,,0,375884,1063,,,,,,0,415664,0 +"2020-12-22","RI",1678,,8,,6059,6059,440,73,,54,528741,3000,,,1771469,,38,81187,,956,0,,,,,97959,,1869428,12711,1869428,12711,,,,,609928,3956,,0 +"2020-12-22","SC",4976,4602,14,374,13507,13507,1586,41,,344,2664125,23231,86478,,2586531,,170,278055,257340,2322,0,15436,38628,,,334934,138745,,0,2942180,25553,101914,345379,,,,0,2921465,25361 +"2020-12-22","SD",1381,,0,,5461,5461,341,32,,69,268089,843,,,,,38,95509,87252,435,0,,,,,93134,86501,,0,578931,1877,,,,,363598,1278,578931,1877 +"2020-12-22","TN",6269,5529,133,740,13876,13876,3112,80,,783,,0,,,4803508,,426,534019,477100,4441,0,,60774,,,553434,447996,,0,5356942,16026,,539544,,,,0,5356942,16026 +"2020-12-22","TX",25606,,191,,,,10299,0,,2767,,0,,,,,,1613095,1431416,21147,0,75566,86471,,,1573424,1297294,,0,12948343,122643,653540,1040594,,,,0,12948343,122643 +"2020-12-22","UT",1173,,12,,10218,10218,586,116,1757,202,1265747,4109,,,1892284,615,,255085,,2302,0,,27890,,26758,249037,196951,,0,2141321,12256,,379629,,161431,1495847,5711,2141321,12256 +"2020-12-22","VA",4705,4221,51,484,17083,17083,2166,135,,535,,0,,,,,279,314481,268472,3591,0,15990,43995,,,325601,,3993232,18216,3993232,18216,181749,569450,,,,0,,0 +"2020-12-22","VI",23,,0,,,,,0,,,32027,282,,,,,,1934,,13,0,,,,,,1785,,0,33961,295,,,,,34055,307,,0 +"2020-12-22","VT",112,112,1,,,,43,0,,9,248649,1369,,,,,,6608,6448,74,0,,,,,,4310,,0,660302,3818,,,,,255097,1443,660302,3818 +"2020-12-22","WA",3106,,2,,13515,13515,1207,124,,272,,0,,,,,128,226635,218415,4035,0,,,,,,,3559695,56118,3559695,56118,,,,,,0,,0 +"2020-12-22","WI",4879,4545,128,334,20355,20355,1274,187,1997,281,2303714,4449,,,,,,497380,461015,3027,0,,,,,,421506,5110544,21624,5110544,21624,,,,,2764729,6852,,0 +"2020-12-22","WV",1171,1060,42,111,,,739,0,,175,,0,,,,,75,74737,61660,1400,0,,,,,,50702,,0,1401206,8002,24767,,,,,0,1401206,8002 +"2020-12-22","WY",373,,22,,1023,1023,161,5,,,155601,658,,,438489,,,42379,36550,261,0,,,,,37303,40128,,0,475800,2281,,,,,192151,816,475800,2281 +"2020-12-21","AK",184,184,0,,937,937,123,2,,,,0,,,1148986,,13,42563,,150,0,,,,,50652,,,0,1200977,4471,,,,,,0,1200977,4471 +"2020-12-21","AL",4389,3849,0,540,30994,30994,2526,770,2391,,1525510,4218,,,,1377,,324832,264791,2380,0,,,,,,183625,,0,1790301,6411,,,82229,,1790301,6411,,0 +"2020-12-21","AR",3295,2885,58,410,10570,10570,1078,68,,348,1777857,8220,,,1777857,1142,174,203107,171672,1457,0,,,,37988,,177629,,0,1949529,9289,,,,207014,,0,1949529,9289 +"2020-12-21","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-21","AZ",7972,7278,1,694,33195,33195,3925,158,,904,2224376,9737,,,,,628,461345,441654,7748,0,,,,,,,,0,4658586,37767,,,384633,,2666030,17042,4658586,37767 +"2020-12-21","CA",22676,,83,,,,18359,0,,3756,,0,,,,,,1892348,1892348,37892,0,,,,,,,,0,29860404,395234,,,,,,0,29860404,395234 +"2020-12-21","CO",4378,3769,10,609,17228,17228,1386,57,,,1748704,10396,232595,,,,,311036,298417,2146,0,26811,,,,,,4076421,31861,4076421,31861,261088,,,,2047121,12488,,0 +"2020-12-21","CT",5676,4590,95,1086,12257,12257,1143,0,,,,0,,,4039016,,,167377,157508,4595,0,,7490,,,197812,,,0,4243017,15955,,104234,,,,0,4243017,15955 +"2020-12-21","DC",742,,5,,,,238,0,,79,,0,,,,,27,26740,,139,0,,,,,,19067,834138,4839,834138,4839,,,,,343167,1066,,0 +"2020-12-21","DE",871,771,9,100,,,419,0,,67,435048,1605,,,,,,51056,49127,440,0,,,,,52421,,905564,7129,905564,7129,,,,,486104,2045,,0 +"2020-12-21","FL",20976,,115,,60953,60953,5512,162,,,7083114,41509,578113,560932,11523625,,,1192456,1045247,10907,0,71851,,69600,,1550263,,14728047,116673,14728047,116673,650372,,630838,,8275570,52416,13132263,113728 +"2020-12-21","GA",10399,9453,16,946,39502,39502,3960,90,7055,,,0,,,,,,591438,512699,3520,0,42906,,,,484372,,,0,4999306,25142,392210,,,,,0,4999306,25142 +"2020-12-21","GU",120,,1,,,,25,0,,7,86356,808,,,,,5,7211,7041,9,0,17,224,,,,6660,,0,93567,817,321,4938,,,,0,93397,823 +"2020-12-21","HI",282,282,0,,1679,1679,49,24,,15,,0,,,,,8,20749,20351,134,0,,,,,20234,,773450,3193,773450,3193,,,,,,0,,0 +"2020-12-21","IA",3589,,0,,,,644,0,,142,918439,1131,,75913,1875128,,72,230622,230622,538,0,,39982,7603,37492,249771,214741,,0,1149061,1669,,748659,83556,167825,1151287,1671,2135829,5169 +"2020-12-21","ID",1280,1136,5,144,5155,5155,467,34,942,118,417944,817,,,,,,129960,108424,891,0,,,,,,50950,,0,526368,1452,,52274,,,526368,1452,819320,2168 +"2020-12-21","IL",16527,15299,120,1228,,,4460,0,,981,,0,,,,,546,905069,,4699,0,,,,,,,,0,12520979,86454,,,,,,0,12520979,86454 +"2020-12-21","IN",7438,7101,34,337,32710,32710,2967,214,5742,665,2065453,6128,,,,,345,468219,,3865,0,,,,,424789,,,0,5288642,28115,,,,,2533672,9993,5288642,28115 +"2020-12-21","KS",2448,,107,,6267,6267,630,92,1684,168,741523,11143,,,,411,92,204600,,4174,0,,,,,,,,0,946123,15317,,,,,946123,15317,,0 +"2020-12-21","KY",2412,2266,15,146,12515,12515,1580,32,2900,411,,0,,,,,231,244297,197968,1976,0,,,,,,34704,,0,3028904,6969,100198,147273,,,,0,3028904,6969 +"2020-12-21","LA",7107,6775,65,332,,,1590,0,,,3694048,10809,,,,,174,287261,264187,1116,0,,,,,,232725,,0,3981309,11925,,177522,,,,0,3958235,11937 +"2020-12-21","MA",11759,11506,42,253,15372,15372,1991,0,,410,3515535,15289,,,,,215,327374,314850,3843,0,,,12560,,385357,206843,,0,10239836,61067,,,137188,322335,3830385,19049,10239836,61067 +"2020-12-21","MD",5471,5302,23,169,24758,24758,1676,135,,399,2420417,12634,,150832,,,,253073,253073,2265,0,,,17546,,304829,9128,,0,5324491,40320,,,168378,,2673490,14899,5324491,40320 +"2020-12-21","ME",293,288,1,5,980,980,170,1,,44,,0,12820,,,,18,19285,16721,339,0,506,2512,,,20957,10837,,0,1020857,3341,13338,57095,,,,0,1020857,3341 +"2020-12-21","MI",12153,11532,79,621,,,3179,0,,711,,0,,,7281061,,436,501115,463403,5059,0,,,,,590238,284731,,0,7871299,84618,411872,,,,,0,7871299,84618 +"2020-12-21","MN",4872,4739,22,133,20629,20629,1040,82,4424,237,2483215,9265,,,,,,399311,387122,1992,0,,,,,,373301,5046965,31810,5046965,31810,,185382,,,2870337,11117,,0 +"2020-12-21","MO",4947,,10,,,,2729,0,,653,1620135,5355,94046,,3069194,,351,368316,368316,3130,0,11577,35140,,,406663,,,0,3482832,18385,105836,292195,99037,134641,1988451,8485,3482832,18385 +"2020-12-21","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,116,116,1,0,,,,,,29,,0,17545,1,,,,,17542,0,26131,0 +"2020-12-21","MS",4411,3646,2,765,8039,8039,1307,138,,326,1127658,47998,,,,,189,195500,139944,1167,0,,,,,,154669,,0,1323158,49165,60877,401956,,,,0,1267602,53673 +"2020-12-21","MT",881,,16,,3280,3280,253,19,,64,,0,,,,,31,77324,,154,0,,,,,,68440,,0,758979,3688,,,,,,0,758979,3688 +"2020-12-21","NC",6240,5940,16,300,,,2817,0,,659,,0,,,,,,483647,446795,4479,0,,,,,,,,0,6238603,52375,,221396,,,,0,6238603,52375 +"2020-12-21","ND",1239,,2,,3400,3400,158,6,501,18,281986,-31,11953,,,,,90121,87702,82,0,1442,,,,,86233,1204292,1428,1204292,1428,13395,21392,,,369688,48,1269206,1611 +"2020-12-21","NE",1486,,11,,4992,4992,582,15,,,663318,1807,,,1459221,,,156382,,967,0,,,,,178989,93640,,0,1640048,7601,,,,,820099,2780,1640048,7601 +"2020-12-21","NH",656,,0,,889,889,278,0,297,,458576,1490,,,,,,37388,28447,846,0,,,,,,30044,,0,968602,5351,35370,40734,34323,,487023,2067,968602,5351 +"2020-12-21","NJ",18223,16315,29,1908,45284,45284,3607,102,,727,6859760,187281,,,,,481,479443,435763,3686,0,,,,,,,,0,7339203,190967,,,,,,0,7295523,199818 +"2020-12-21","NM",2180,,9,,8846,8846,796,113,,,,0,,,,,,130808,,815,0,,,,,,55803,,0,1841584,8259,,,,,,0,1841584,8259 +"2020-12-21","NV",2787,,6,,,,1996,0,,437,908046,5525,,,,,297,205884,205884,1939,0,,,,,,,1959658,18610,1959658,18610,,,,,1113930,7464,,0 +"2020-12-21","NY",28709,,111,,89995,89995,6331,0,,1095,,0,,,,,613,857049,,9007,0,,,,,,,23474668,156510,23474668,156510,,,,,,0,,0 +"2020-12-21","OH",8122,7423,75,699,35048,35048,4758,301,5537,1126,,0,,,,,792,629354,570774,6548,0,,35940,,,601414,454354,,0,7290873,46455,,706741,,,,0,7290873,46455 +"2020-12-21","OK",2218,,6,,15358,15358,1704,49,,455,2198748,0,,,2198748,,,263434,,2596,0,7767,,,,252446,224672,,0,2462182,2596,103518,,,,,0,2455624,0 +"2020-12-21","OR",1341,,1,,5837,5837,602,0,,116,,0,,,2275649,,66,102930,,1116,0,,,,,140155,,,0,2415804,0,,,,,,0,2415804,0 +"2020-12-21","PA",13981,,57,,,,6090,0,,1217,3160075,14519,,,,,738,563589,511985,7887,0,,,,,,343789,7038666,52211,7038666,52211,,,,,3672060,21299,,0 +"2020-12-21","PR",1382,1141,14,241,,,520,0,,94,305972,0,,,395291,,104,68849,65064,416,0,50323,,,,20103,57407,,0,374821,416,,,,,,0,415664,0 +"2020-12-21","RI",1670,,11,,5986,5986,429,164,,57,525741,1649,,,1759840,,36,80231,,419,0,,,,,96877,,1856717,7193,1856717,7193,,,,,605972,2068,,0 +"2020-12-21","SC",4962,4587,27,375,13466,13466,1523,22,,324,2640894,17289,86086,,2563959,,165,275733,255210,2327,0,15319,38323,,,332145,137590,,0,2916627,19616,101405,343808,,,,0,2896104,19465 +"2020-12-21","SD",1381,,20,,5429,5429,344,18,,70,267246,688,,,,,31,95074,86934,347,0,,,,,92927,85320,,0,577054,1933,,,,,362320,1035,577054,1933 +"2020-12-21","TN",6136,5427,65,709,13796,13796,2995,51,,789,,0,,,4790628,,415,529578,474343,9891,0,,58611,,,550288,438036,,0,5340916,58714,,524331,,,,0,5340916,58714 +"2020-12-21","TX",25415,,67,,,,10009,0,,2767,,0,,,,,,1591948,1413684,10280,0,75226,84341,,,1555157,1279067,,0,12825700,144933,651053,1007059,,,,0,12825700,144933 +"2020-12-21","UT",1161,,6,,10102,10102,584,63,1725,195,1261638,4204,,,1881840,609,,252783,,1819,0,,27103,,26001,247225,194475,,0,2129065,10039,,371826,,158782,1490136,5737,2129065,10039 +"2020-12-21","VA",4654,4192,4,462,16948,16948,2442,70,,530,,0,,,,,282,310890,265785,4042,0,15866,42360,,,323094,,3975016,37048,3975016,37048,181193,546371,,,,0,,0 +"2020-12-21","VI",23,,0,,,,,0,,,31745,0,,,,,,1921,,0,0,,,,,,1752,,0,33666,0,,,,,33748,0,,0 +"2020-12-21","VT",111,111,0,,,,27,0,,6,247280,1808,,,,,,6534,6374,91,0,,,,,,4236,,0,656484,4943,,,,,253654,1901,656484,4943 +"2020-12-21","WA",3104,,0,,13391,13391,1175,0,,258,,0,,,,,137,222600,214466,0,0,,,,,,,3503577,0,3503577,0,,,,,,0,,0 +"2020-12-21","WI",4751,4425,8,326,20168,20168,1308,48,1980,272,2299265,5067,,,,,,494353,458612,1629,0,,,,,,418587,5088920,24235,5088920,24235,,,,,2757877,6502,,0 +"2020-12-21","WV",1129,1028,1,101,,,695,0,,167,,0,,,,,71,73337,60678,995,0,,,,,,49331,,0,1393204,10314,24623,,,,,0,1393204,10314 +"2020-12-21","WY",351,,0,,1018,1018,162,11,,,154943,1438,,,436371,,,42118,36392,456,0,,,,,37140,39820,,0,473519,9766,,,,,191335,2070,473519,9766 +"2020-12-20","AK",184,184,0,,935,935,127,0,,,,0,,,1144626,,13,42413,,178,0,,,,,50542,,,0,1196506,3388,,,,,,0,1196506,3388 +"2020-12-20","AL",4389,3849,0,540,30224,30224,2337,0,2390,,1521292,6365,,,,1377,,322452,262598,2548,0,,,,,,183625,,0,1783890,8462,,,82020,,1783890,8462,,0 +"2020-12-20","AR",3237,2842,46,395,10502,10502,1061,15,,345,1769637,11653,,,1769637,1136,177,201650,170603,1536,0,,,,37514,,175387,,0,1940240,12969,,,,205000,,0,1940240,12969 +"2020-12-20","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-20","AZ",7971,7277,34,694,33037,33037,3899,361,,885,2214639,18061,,,,,595,453597,434349,5366,0,,,,,,,,0,4620819,57721,,,383896,,2648988,22811,4620819,57721 +"2020-12-20","CA",22593,,161,,,,17750,0,,3710,,0,,,,,,1854456,1854456,46474,0,,,,,,,,0,29465170,352921,,,,,,0,29465170,352921 +"2020-12-20","CO",4368,3759,29,609,17171,17171,1398,41,,,1738308,9898,230369,,,,,308890,296325,2292,0,26199,,,,,,4044560,39692,4044560,39692,259406,,,,2034633,12168,,0 +"2020-12-20","CT",5581,4514,0,1067,12257,12257,1167,0,,,,0,,,4024365,,,162782,153203,0,0,,7093,,,196536,,,0,4227062,17161,,98376,,,,0,4227062,17161 +"2020-12-20","DC",737,,7,,,,235,0,,72,,0,,,,,26,26601,,259,0,,,,,,18989,829299,8300,829299,8300,,,,,342101,1826,,0 +"2020-12-20","DE",862,762,4,100,,,410,0,,66,433443,1554,,,,,,50616,48700,480,0,,,,,51759,,898435,7996,898435,7996,,,,,484059,2034,,0 +"2020-12-20","FL",20861,,97,,60791,60791,5235,148,,,7041605,34499,578113,560932,11425103,,,1181549,1036344,8140,0,71851,,69600,,1535639,,14611374,93311,14611374,93311,650372,,630838,,8223154,42639,13018535,86015 +"2020-12-20","GA",10383,9437,2,946,39412,39412,3787,102,7050,,,0,,,,,,587918,509588,5618,0,42758,,,,480704,,,0,4974164,33115,391653,,,,,0,4974164,33115 +"2020-12-20","GU",119,,0,,,,25,0,,8,85548,0,,,,,6,7202,7035,4,0,17,224,,,,6613,,0,92750,4,321,4876,,,,0,92574,0 +"2020-12-20","HI",282,282,1,,1655,1655,52,0,,14,,0,,,,,7,20615,20217,202,0,,,,,20120,,770257,5884,770257,5884,,,,,,0,,0 +"2020-12-20","IA",3589,,56,,,,639,0,,149,917308,2697,,75859,1870572,,79,230084,230084,897,0,,39631,7541,37165,249185,213641,,0,1147392,3594,,744214,83440,166638,1149616,3582,2130660,8854 +"2020-12-20","ID",1275,1133,0,142,5121,5121,467,35,932,118,417127,2177,,,,,,129069,107789,851,0,,,,,,50324,,0,524916,2999,,52274,,,524916,2999,817152,3811 +"2020-12-20","IL",16407,15202,81,1205,,,4389,0,,991,,0,,,,,546,900370,,6003,0,,,,,,,,0,12434525,78079,,,,,,0,12434525,78079 +"2020-12-20","IN",7404,7070,66,334,32496,32496,2932,225,5700,660,2059325,12102,,,,,343,464354,,6483,0,,,,,421339,,,0,5260527,64091,,,,,2523679,18585,5260527,64091 +"2020-12-20","KS",2341,,0,,6175,6175,688,0,1658,189,730380,0,,,,411,92,200426,,0,0,,,,,,,,0,930806,0,,,,,930806,0,,0 +"2020-12-20","KY",2397,2255,26,142,12483,12483,1607,38,2895,403,,0,,,,,226,242321,196279,1757,0,,,,,,34608,,0,3021935,18549,99926,146120,,,,0,3021935,18549 +"2020-12-20","LA",7042,6711,48,331,,,1534,0,,,3683239,40159,,,,,169,286145,263059,3711,0,,,,,,232725,,0,3969384,43870,,177417,,,,0,3946298,43315 +"2020-12-20","MA",11717,11465,60,252,15372,15372,1919,0,,387,3500246,16755,,,,,205,323531,311090,4261,0,,,12560,,380769,206843,,0,10178769,90789,,,137188,321267,3811336,20917,10178769,90789 +"2020-12-20","MD",5448,5279,36,169,24623,24623,1662,201,,406,2407783,11063,,150832,,,,250808,250808,2054,0,,,17546,,301795,9114,,0,5284171,42612,,,168378,,2658591,13117,5284171,42612 +"2020-12-20","ME",292,287,0,5,979,979,162,8,,49,,0,12759,,,,18,18946,16457,207,0,503,2503,,,20774,10794,,0,1017516,7288,13274,56979,,,,0,1017516,7288 +"2020-12-20","MI",12074,11461,0,613,,,3284,0,,758,,0,,,7203578,,466,496056,458852,0,0,,,,,583103,284731,,0,7786681,0,409456,,,,,0,7786681,0 +"2020-12-20","MN",4850,4719,70,131,20547,20547,1144,79,4412,270,2473950,19810,,,,,,397319,385270,2684,0,,,,,,369912,5015155,58261,5015155,58261,,183856,,,2859220,22322,,0 +"2020-12-20","MO",4937,,33,,,,2757,0,,635,1614780,3387,93494,,3054237,,355,365186,365186,2072,0,11368,34730,,,403291,,,0,3464447,13217,105075,286187,98410,133373,1979966,5459,3464447,13217 +"2020-12-20","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,115,115,0,0,,,,,,29,,0,17544,0,,,,,17542,0,26131,0 +"2020-12-20","MS",4409,3645,19,764,7901,7901,1319,0,,308,1079660,0,,,,,188,194333,139515,2222,0,,,,,,148466,,0,1273993,2222,57605,336269,,,,0,1213929,0 +"2020-12-20","MT",865,,1,,3261,3261,258,13,,61,,0,,,,,35,77170,,551,0,,,,,,67435,,0,755291,3048,,,,,,0,755291,3048 +"2020-12-20","NC",6224,5925,40,299,,,2748,0,,629,,0,,,,,,479168,442682,6900,0,,,,,,,,0,6186228,61346,,219724,,,,0,6186228,61346 +"2020-12-20","ND",1237,,6,,3394,3394,156,7,501,18,282017,384,11953,,,,,90039,87623,251,0,1442,,,,,86013,1202864,4059,1202864,4059,13395,21056,,,369640,587,1267595,4431 +"2020-12-20","NE",1475,,5,,4977,4977,598,25,,,661511,1448,,,1452819,,,155415,,670,0,,,,,177808,92195,,0,1632447,8097,,,,,817319,2119,1632447,8097 +"2020-12-20","NH",656,,6,,889,889,261,3,297,,457086,1297,,,,,,36542,27870,933,0,,,,,,28978,,0,963251,5746,35335,40338,34292,,484956,2009,963251,5746 +"2020-12-20","NJ",18194,16286,21,1908,45182,45182,3574,150,,707,6672479,0,,,,,474,475757,432592,5731,0,,,,,,,,0,7148236,5731,,,,,,0,7095705,0 +"2020-12-20","NM",2171,,16,,8733,8733,820,39,,,,0,,,,,,129993,,1063,0,,,,,,54357,,0,1833325,10156,,,,,,0,1833325,10156 +"2020-12-20","NV",2781,,30,,,,1924,0,,434,902521,2176,,,,,286,203945,203945,2087,0,,,,,,,1941048,9995,1941048,9995,,,,,1106466,4263,,0 +"2020-12-20","NY",28598,,124,,89995,89995,6185,0,,1045,,0,,,,,600,848042,,9957,0,,,,,,,23318158,197251,23318158,197251,,,,,,0,,0 +"2020-12-20","OH",8047,7364,16,683,34747,34747,4758,194,5500,1126,,0,,,,,792,622806,565329,8377,0,,35523,,,594985,447442,,0,7244418,58259,,702618,,,,0,7244418,58259 +"2020-12-20","OK",2212,,23,,15309,15309,1704,178,,455,2198748,0,,,2198748,,,260838,,4970,0,7767,,,,252446,222874,,0,2459586,4970,103518,,,,,0,2455624,0 +"2020-12-20","OR",1340,,36,,5837,5837,602,0,,116,,0,,,2275649,,66,101814,,1506,0,,,,,140155,,,0,2415804,0,,,,,,0,2415804,0 +"2020-12-20","PA",13924,,99,,,,6074,0,,1230,3145556,13925,,,,,720,555702,505205,7213,0,,,,,,334578,6986455,51999,6986455,51999,,,,,3650761,20798,,0 +"2020-12-20","PR",1368,1125,26,243,,,540,0,,94,305972,0,,,395291,,101,68433,64697,1222,0,50177,,,,20103,55454,,0,374405,1222,,,,,,0,415664,0 +"2020-12-20","RI",1659,,15,,5822,5822,459,0,,56,524092,3109,,,1753175,,29,79812,,1029,0,,,,,96349,,1849524,17614,1849524,17614,,,,,603904,4138,,0 +"2020-12-20","SC",4935,4566,40,369,13444,13444,1471,77,,313,2623605,22521,85535,,2547289,,159,273406,253034,2869,0,15129,38015,,,329350,136505,,0,2897011,25390,100664,339557,,,,0,2876639,25169 +"2020-12-20","SD",1361,,11,,5411,5411,345,26,,66,266558,712,,,,,36,94727,86631,391,0,,,,,92643,85096,,0,575121,3057,,,,,361285,1103,575121,3057 +"2020-12-20","TN",6071,5378,111,693,13745,13745,2978,119,,765,,0,,,4741340,,398,519687,465908,16036,0,,56949,,,540862,434977,,0,5282202,50346,,519123,,,,0,5282202,50346 +"2020-12-20","TX",25348,,122,,,,9856,0,,2777,,0,,,,,,1581668,1404675,7780,0,74228,81884,,,1534139,1269014,,0,12680767,111257,646470,983430,,,,0,12680767,111257 +"2020-12-20","UT",1155,,7,,10039,10039,582,71,1717,201,1257434,5876,,,1873503,606,,250964,,1994,0,,26863,,25780,245523,192591,,0,2119026,13409,,370473,,158160,1484399,7669,2119026,13409 +"2020-12-20","VA",4650,4189,7,461,16878,16878,2405,54,,517,,0,,,,,272,306848,262589,3876,0,15734,41593,,,319340,,3937968,49299,3937968,49299,180505,541605,,,,0,,0 +"2020-12-20","VI",23,,0,,,,,0,,,31745,483,,,,,,1921,,11,0,,,,,,1752,,0,33666,494,,,,,33748,478,,0 +"2020-12-20","VT",111,111,3,,,,24,0,,6,245472,1288,,,,,,6443,6281,100,0,,,,,,4155,,0,651541,5023,,,,,251753,1382,651541,5023 +"2020-12-20","WA",3104,,0,,13391,13391,1175,100,,258,,0,,,,,137,222600,214466,2332,0,,,,,,,3503577,24949,3503577,24949,,,,,,0,,0 +"2020-12-20","WI",4743,4417,21,326,20120,20120,1268,68,1978,292,2294198,5867,,,,,,492724,457177,2045,0,,,,,,415922,5064685,24578,5064685,24578,,,,,2751375,7693,,0 +"2020-12-20","WV",1128,1026,6,102,,,693,0,,174,,0,,,,,79,72342,59889,1127,0,,,,,,48580,,0,1382890,7839,24513,,,,,0,1382890,7839 +"2020-12-20","WY",351,,0,,1007,1007,157,5,,,153505,0,,,427157,,,41662,35982,174,0,,,,,36505,39080,,0,463753,0,,,,,189265,0,463753,0 +"2020-12-19","AK",184,184,1,,935,935,146,7,,,,0,,,1141344,,13,42235,,330,0,,,,,50438,,,0,1193118,8196,,,,,,0,1193118,8196 +"2020-12-19","AL",4389,3849,93,540,30224,30224,2318,0,2389,,1514927,7723,,,,1377,,319904,260501,4221,0,,,,,,183625,,0,1775428,10678,,,81525,,1775428,10678,,0 +"2020-12-19","AR",3191,2821,52,370,10487,10487,1061,57,,345,1757984,11970,,,1757984,1136,177,200114,169287,2693,0,,,,37260,,173832,,0,1927271,13823,,,,201974,,0,1927271,13823 +"2020-12-19","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-19","AZ",7937,7246,118,691,32676,32676,4014,383,,939,2196578,15385,,,,,612,448231,429599,5560,0,,,,,,,,0,4563098,48550,,,382700,,2626177,20385,4563098,48550 +"2020-12-19","CA",22432,,272,,,,17398,0,,3620,,0,,,,,,1807982,1807982,43608,0,,,,,,,,0,29112249,371222,,,,,,0,29112249,371222 +"2020-12-19","CO",4339,3730,80,609,17130,17130,1433,110,,,1728410,7454,230369,,,,,306598,294055,2491,0,26199,,,,,,4004868,33004,4004868,33004,256568,,,,2022465,9851,,0 +"2020-12-19","CT",5581,4514,0,1067,12257,12257,1167,0,,,,0,,,4008911,,,162782,153203,0,0,,7093,,,194862,,,0,4209901,33151,,98376,,,,0,4209901,33151 +"2020-12-19","DC",730,,2,,,,248,0,,81,,0,,,,,48,26342,,238,0,,,,,,18893,820999,8097,820999,8097,,,,,340275,1916,,0 +"2020-12-19","DE",858,758,4,100,,,411,0,,59,431889,2892,,,,,,50136,48249,1027,0,,,,,51003,,890439,7520,890439,7520,,,,,482025,3919,,0 +"2020-12-19","FL",20764,,74,,60643,60643,5086,251,,,7007106,40629,578113,560932,11350157,,,1173409,1030922,11456,0,71851,,69600,,1524783,,14518063,123243,14518063,123243,650372,,630838,,8180515,52085,12932520,110461 +"2020-12-19","GA",10381,9435,49,946,39310,39310,3679,246,7045,,,0,,,,,,582300,504501,5763,0,42102,,,,476179,,,0,4941049,37003,388995,,,,,0,4941049,37003 +"2020-12-19","GU",119,,0,,,,26,0,,8,85548,0,,,,,5,7198,7031,5,0,17,224,,,,6613,,0,92746,5,321,4876,,,,0,92574,0 +"2020-12-19","HI",281,281,0,,1655,1655,52,0,,14,,0,,,,,7,20413,20015,156,0,,,,,19931,,764373,6046,764373,6046,,,,,,0,,0 +"2020-12-19","IA",3533,,82,,,,679,0,,140,914611,3007,,75797,1862708,,77,229187,229187,1198,0,,39493,7513,37043,248219,212379,,0,1143798,4205,,742517,83350,166454,1146034,4222,2121806,14159 +"2020-12-19","ID",1275,1131,16,144,5086,5086,467,65,928,118,414950,1723,,,,,,128218,106967,1340,0,,,,,,49914,,0,521917,2792,,52274,,,521917,2792,813341,5211 +"2020-12-19","IL",16326,15123,120,1203,,,4624,0,,1000,,0,,,,,562,894367,,7562,0,,,,,,,,0,12356446,96851,,,,,,0,12356446,96851 +"2020-12-19","IN",7338,7017,73,321,32271,32271,2932,229,5676,673,2047223,7992,,,,,358,457871,,4732,0,,,,,415266,,,0,5196436,39420,,,,,2505094,12724,5196436,39420 +"2020-12-19","KS",2341,,0,,6175,6175,688,0,1658,189,730380,0,,,,411,92,200426,,0,0,,,,,,,,0,930806,0,,,,,930806,0,,0 +"2020-12-19","KY",2371,2234,27,137,12445,12445,1655,261,2890,438,,0,,,,,253,240564,194877,3374,0,,,,,,34517,,0,3003386,14807,99741,145564,,,,0,3003386,14807 +"2020-12-19","LA",6994,6664,0,330,,,1547,0,,,3643080,0,,,,,179,282434,259903,0,0,,,,,,232725,,0,3925514,0,,172616,,,,0,3902983,0 +"2020-12-19","MA",11657,11405,47,252,15372,15372,1927,0,,383,3483491,13307,,,,,196,319270,306928,4344,0,,,12560,,375857,206843,,0,10087980,80214,,,137188,319467,3790419,17302,10087980,80214 +"2020-12-19","MD",5412,5242,54,170,24422,24422,1635,112,,385,2396720,9543,,150832,,,,248754,248754,2201,0,,,17546,,299395,9098,,0,5241559,36405,,,168378,,2645474,11744,5241559,36405 +"2020-12-19","ME",292,287,11,5,971,971,191,6,,46,,0,12759,,,,17,18739,16266,402,0,503,2330,,,20458,10766,,0,1010228,6869,13274,53390,,,,0,1010228,6869 +"2020-12-19","MI",12074,11461,206,613,,,3284,0,,758,,0,,,7203578,,466,496056,458852,4181,0,,,,,583103,284731,,0,7786681,62678,409456,,,,,0,7786681,62678 +"2020-12-19","MN",4780,4649,57,131,20468,20468,1144,145,4392,270,2454140,7914,,,,,,394635,382758,2746,0,,,,,,365620,4956894,32967,4956894,32967,,177042,,,2836898,10442,,0 +"2020-12-19","MO",4904,,51,,,,2721,0,,598,1611393,4027,92966,,3043259,,329,363114,363114,2784,0,11227,34211,,,401073,,,0,3451230,19439,104406,280079,97848,131236,1974507,6811,3451230,19439 +"2020-12-19","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,115,115,0,0,,,,,,29,,0,17544,0,,,,,17542,0,26131,0 +"2020-12-19","MS",4390,3633,36,757,7901,7901,1319,0,,308,1079660,0,,,,,188,192111,138486,1700,0,,,,,,148466,,0,1271771,1700,57605,336269,,,,0,1213929,0 +"2020-12-19","MT",864,,10,,3248,3248,267,22,,63,,0,,,,,38,76619,,627,0,,,,,,67271,,0,752243,4441,,,,,,0,752243,4441 +"2020-12-19","NC",6184,5892,59,292,,,2846,0,,634,,0,,,,,,472268,436625,6164,0,,,,,,,,0,6124882,69893,,216180,,,,0,6124882,69893 +"2020-12-19","ND",1231,,0,,3387,3387,154,38,500,17,281633,768,11953,,,,,89788,87420,231,0,1442,,,,,85672,1198805,5149,1198805,5149,13395,19318,,,369053,961,1263164,5577 +"2020-12-19","NE",1470,,17,,4952,4952,612,22,,,660063,1990,,,1445579,,,154745,,1345,0,,,,,176966,89890,,0,1624350,14965,,,,,815200,3333,1624350,14965 +"2020-12-19","NH",650,,12,,886,886,258,5,297,,455789,2947,,,,,,35609,27158,649,0,,,,,,28234,,0,957505,7768,35273,39897,34245,,482947,3292,957505,7768 +"2020-12-19","NJ",18173,16265,49,1908,45032,45032,3570,143,,687,6672479,0,,,,,471,470026,427417,4859,0,,,,,,,,0,7142505,4859,,,,,,0,7095705,0 +"2020-12-19","NM",2155,,27,,8694,8694,891,123,,,,0,,,,,,128930,,1430,0,,,,,,53278,,0,1823169,13876,,,,,,0,1823169,13876 +"2020-12-19","NV",2751,,43,,,,1924,0,,434,900345,2760,,,,,286,201858,201858,2601,0,,,,,,,1931053,15005,1931053,15005,,,,,1102203,5361,,0 +"2020-12-19","NY",28474,,130,,89995,89995,6208,0,,1088,,0,,,,,610,838085,,9919,0,,,,,,,23120907,191476,23120907,191476,,,,,,0,,0 +"2020-12-19","OH",8031,7352,64,679,34553,34553,4797,410,5483,1124,,0,,,,,797,614429,557616,8567,0,,34638,,,587559,440235,,0,7186159,62057,,684527,,,,0,7186159,62057 +"2020-12-19","OK",2189,,28,,15131,15131,1704,161,,455,2198748,6661,,,2198748,,,255868,,4108,0,7767,,,,252446,220474,,0,2454616,10769,103518,,,,,0,2455624,8364 +"2020-12-19","OR",1304,,21,,5837,5837,587,92,,120,,0,,,2275649,,62,100308,,1372,0,,,,,140155,,,0,2415804,22991,,,,,,0,2415804,22991 +"2020-12-19","PA",13825,,217,,,,6086,0,,1204,3131631,12757,,,,,734,548489,498332,9834,0,,,,,,334578,6934456,64892,6934456,64892,,,,,3629963,20727,,0 +"2020-12-19","PR",1342,1102,9,240,,,558,0,,97,305972,0,,,395291,,106,67211,64182,1079,0,49859,,,,20103,55964,,0,373183,1079,,,,,,0,415664,0 +"2020-12-19","RI",1644,,19,,5822,5822,459,0,,56,520983,1172,,,1736868,,29,78783,,971,0,,,,,95042,,1831910,14550,1831910,14550,,,,,599766,2143,,0 +"2020-12-19","SC",4895,4529,23,366,13367,13367,1461,100,,311,2601084,23265,85354,,2525381,,148,270537,250386,3461,0,15028,37213,,,326089,135084,,0,2871621,26726,100382,333443,,,,0,2851470,26290 +"2020-12-19","SD",1350,,21,,5385,5385,365,37,,72,265846,1052,,,,,42,94336,86319,564,0,,,,,92231,84490,,0,572064,2374,,,,,360182,1616,572064,2374 +"2020-12-19","TN",5960,5287,0,673,13626,13626,3099,0,,767,,0,,,4699592,,400,503651,452581,0,0,,54167,,,532264,425264,,0,5231856,19410,,498503,,,,0,5231856,19410 +"2020-12-19","TX",25226,,272,,,,9796,0,,2747,,0,,,,,,1573888,1398281,17907,0,72863,81071,,,1518230,1260984,,0,12569510,37166,640527,979007,,,,0,12569510,37166 +"2020-12-19","UT",1148,,8,,9968,9968,579,85,1715,218,1251558,4983,,,1862073,605,,248970,,2408,0,,26600,,25530,243544,190873,,0,2105617,13923,,367937,,157166,1476730,6885,2105617,13923 +"2020-12-19","VA",4643,4184,45,459,16824,16824,2429,140,,495,,0,,,,,264,302972,259635,3584,0,15579,40887,,,314238,,3888669,56986,3888669,56986,179607,536904,,,,0,,0 +"2020-12-19","VI",23,,0,,,,,0,,,31262,354,,,,,,1910,,10,0,,,,,,1718,,0,33172,364,,,,,33270,367,,0 +"2020-12-19","VT",108,108,1,,,,20,0,,4,244184,1287,,,,,,6343,6187,100,0,,,,,,4062,,0,646518,5622,,,,,250371,1385,646518,5622 +"2020-12-19","WA",3104,,-13,,13291,13291,1175,56,,258,,0,,,,,144,220268,212283,3063,0,,,,,,,3478628,45736,3478628,45736,,,,,,0,,0 +"2020-12-19","WI",4722,4399,90,323,20052,20052,1330,122,1976,290,2288331,7201,,,,,,490679,455351,4315,0,,,,,,412499,5040107,35523,5040107,35523,,,,,2743682,10876,,0 +"2020-12-19","WV",1122,1022,31,100,,,730,0,,179,,0,,,,,76,71215,59025,1464,0,,,,,,47844,,0,1375051,13054,24368,,,,,0,1375051,13054 +"2020-12-19","WY",351,,0,,1002,1002,157,1,,,153505,0,,,427157,,,41488,35818,129,0,,,,,36505,38620,,0,463753,0,,,,,189265,0,463753,0 +"2020-12-18","AK",183,183,0,,928,928,142,7,,,,0,,,1133565,,13,41905,,487,0,,,,,50044,,,0,1184922,9199,,,,,,0,1184922,9199 +"2020-12-18","AL",4296,3772,42,524,30224,30224,2447,665,2384,,1507204,7855,,,,1371,,315683,257546,5348,0,,,,,,183625,,0,1764750,12037,,,80872,,1764750,12037,,0 +"2020-12-18","AR",3139,2776,27,363,10430,10430,1073,73,,368,1746014,11752,,,1746014,1132,181,197421,167434,2878,0,,,,36355,,171864,,0,1913448,13674,,,,198712,,0,1913448,13674 +"2020-12-18","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-18","AZ",7819,7142,142,677,32293,32293,3931,442,,915,2181193,15289,,,,,601,442671,424599,7635,0,,,,,,,,0,4514548,51882,,,381780,,2605792,22398,4514548,51882 +"2020-12-18","CA",22160,,300,,,,16965,0,,3553,,0,,,,,,1764374,1764374,41012,0,,,,,,,,0,28741027,284669,,,,,,0,28741027,284669 +"2020-12-18","CO",4259,3655,33,604,17020,17020,1476,316,,,1720956,10585,226960,,,,,304107,291658,3693,0,25547,,,,,,3971864,47792,3971864,47792,252507,,,,2012614,14138,,0 +"2020-12-18","CT",5581,4514,29,1067,12257,12257,1167,0,,,,0,,,3978475,,,162782,153203,2680,0,,7093,,,192189,,,0,4176750,8349,,98376,,,,0,4176750,8349 +"2020-12-18","DC",728,,3,,,,249,0,,73,,0,,,,,32,26104,,274,0,,,,,,18743,812902,8695,812902,8695,,,,,338359,1913,,0 +"2020-12-18","DE",854,755,9,99,,,407,0,,68,428997,1090,,,,,,49109,47234,341,0,,,,,50385,,882919,8332,882919,8332,,,,,478106,1431,,0 +"2020-12-18","FL",20690,,96,,60392,60392,5172,315,,,6966477,43646,578113,560932,11255137,,,1161953,1023305,12827,0,71851,,69600,,1509649,,14394820,132680,14394820,132680,650372,,630838,,8128430,56473,12822059,121436 +"2020-12-18","GA",10332,9396,38,936,39064,39064,3691,346,7009,,,0,,,,,,576537,500265,8141,0,41588,,,,471410,,,0,4904046,47876,387135,,,,,0,4904046,47876 +"2020-12-18","GU",119,,0,,,,25,0,,9,85548,379,,,,,5,7193,7026,10,0,17,224,,,,6613,,0,92741,389,321,4876,,,,0,92574,388 +"2020-12-18","HI",281,281,1,,1655,1655,52,7,,14,,0,,,,,7,20257,19859,162,0,,,,,19769,,758327,4720,758327,4720,,,,,,0,,0 +"2020-12-18","IA",3451,,0,,,,701,0,,136,911604,2347,,75508,1849920,,80,227989,227989,1524,0,,39127,7247,36718,246945,208802,,0,1139593,3871,,730761,82795,165614,1141812,3869,2107647,13159 +"2020-12-18","ID",1259,1121,28,138,5021,5021,467,56,918,118,413227,3180,,,,,,126878,105898,1426,0,,,,,,49318,,0,519125,4325,,52274,,,519125,4325,808130,8605 +"2020-12-18","IL",16206,15015,221,1191,,,4690,0,,1023,,0,,,,,589,886805,,7377,0,,,,,,,,0,12259595,112292,,,,,,0,12259595,112292 +"2020-12-18","IN",7265,6944,85,321,32042,32042,3065,222,5637,674,2039231,8687,,,,,370,453139,,5949,0,,,,,410895,,,0,5157016,54022,,,,,2492370,14636,5157016,54022 +"2020-12-18","KS",2341,,88,,6175,6175,688,125,1658,189,730380,6684,,,,411,92,200426,,5857,0,,,,,,,,0,930806,12541,,,,,930806,12541,,0 +"2020-12-18","KY",2344,2208,28,136,12184,12184,1712,55,2832,410,,0,,,,,227,237190,192448,3169,0,,,,,,33665,,0,2988579,19735,99421,144001,,,,0,2988579,19735 +"2020-12-18","LA",6994,6664,30,330,,,1547,0,,,3643080,25577,,,,,179,282434,259903,3113,0,,,,,,232725,,0,3925514,28690,,172616,,,,0,3902983,27997 +"2020-12-18","MA",11610,11358,52,252,15372,15372,1874,0,,370,3470184,26296,,,,,204,314926,302933,5679,0,,,12560,,371377,206843,,0,10007766,106034,,,137188,315192,3773117,31928,10007766,106034 +"2020-12-18","MD",5358,5188,39,170,24310,24310,1686,174,,399,2387177,12635,,150832,,,,246553,246553,2569,0,,,17546,,296808,9064,,0,5205154,44178,,,168378,,2633730,15204,5205154,44178 +"2020-12-18","ME",281,277,5,4,965,965,191,7,,46,,0,12759,,,,17,18337,15942,436,0,503,2305,,,20177,10744,,0,1003359,9120,13274,53135,,,,0,1003359,9120 +"2020-12-18","MI",11868,11274,67,594,,,3284,0,,758,,0,,,7146593,,466,491875,454956,4519,0,,,,,577410,236369,,0,7724003,50919,405263,,,,,0,7724003,50919 +"2020-12-18","MN",4723,4594,65,129,20323,20323,1144,151,4383,270,2446226,15538,,,,,,391889,380230,2718,0,,,,,,360868,4923927,58047,4923927,58047,,172841,,,2826456,17926,,0 +"2020-12-18","MO",4853,,19,,,,2616,0,,606,1607366,6779,92443,,3026898,,321,360330,360330,3723,0,10992,33478,,,398032,,,0,3431791,24631,103648,273849,97201,128665,1967696,10502,3431791,24631 +"2020-12-18","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,115,115,2,0,,,,,,29,,0,17544,2,,,,,17542,0,26131,0 +"2020-12-18","MS",4354,3615,34,739,7901,7901,1318,0,,319,1079660,0,,,,,190,190411,137808,2507,0,,,,,,148466,,0,1270071,2507,57605,336269,,,,0,1213929,0 +"2020-12-18","MT",854,,5,,3226,3226,275,27,,63,,0,,,,,35,75992,,509,0,,,,,,65873,,0,747802,5262,,,,,,0,747802,5262 +"2020-12-18","NC",6125,5842,60,283,,,2824,0,,619,,0,,,,,,466104,431219,8444,0,,,,,,,,0,6054989,69030,,209865,,,,0,6054989,69030 +"2020-12-18","ND",1231,,21,,3349,3349,144,276,496,16,280865,977,11953,,,,,89557,87227,494,0,1442,,,,,85271,1193656,7502,1193656,7502,13395,18015,,,368092,1417,1257587,8186 +"2020-12-18","NE",1453,,5,,4930,4930,602,22,,,658073,2529,,,1432281,,,153400,,1297,0,,,,,175286,88176,,0,1609385,13408,,,,,811867,3824,1609385,13408 +"2020-12-18","NH",638,,9,,881,881,273,4,295,,452842,3090,,,,,,34960,26813,696,0,,,,,,27459,,0,949737,9667,35217,39026,34196,,479655,3591,949737,9667 +"2020-12-18","NJ",18124,16216,44,1908,44889,44889,3582,287,,715,6672479,141939,,,,,480,465167,423226,4445,0,,,,,,,,0,7137646,146384,,,,,,0,7095705,150090 +"2020-12-18","NM",2128,,31,,8571,8571,889,163,,,,0,,,,,,127500,,1455,0,,,,,,52137,,0,1809293,12690,,,,,,0,1809293,12690 +"2020-12-18","NV",2708,,35,,,,1951,0,,433,897585,3587,,,,,286,199257,199257,2878,0,,,,,,,1916048,15645,1916048,15645,,,,,1096842,6465,,0 +"2020-12-18","NY",28344,,122,,89995,89995,6081,0,,1068,,0,,,,,592,828166,,12697,0,,,,,,,22929431,249385,22929431,249385,,,,,,0,,0 +"2020-12-18","OH",7967,7298,73,669,34143,34143,4940,398,5429,1172,,0,,,,,817,605862,550468,9684,0,,33760,,,579163,430621,,0,7124102,67398,,666417,,,,0,7124102,67398 +"2020-12-18","OK",2161,,17,,14970,14970,1733,149,,460,2192087,33450,,,2192087,,,251760,,3556,0,7147,,,,250641,217534,,0,2443847,37006,101297,,,,,0,2447260,44143 +"2020-12-18","OR",1283,,21,,5745,5745,587,66,,120,,0,,,2254227,,62,98936,,1314,0,,,,,138586,,,0,2392813,24404,,,,,,0,2392813,24404 +"2020-12-18","PA",13608,,216,,,,6147,0,,1232,3118874,17110,,,,,745,538655,490362,9320,0,,,,,,323193,6869564,68622,6869564,68622,,,,,3609236,25662,,0 +"2020-12-18","PR",1333,1094,10,239,,,575,0,,97,305972,0,,,395291,,96,66132,63075,1381,0,49060,,,,20103,55628,,0,372104,1381,,,,,,0,415664,0 +"2020-12-18","RI",1625,,23,,5822,5822,459,56,,56,519811,1157,,,1723464,,29,77812,,522,0,,,,,93896,,1817360,11156,1817360,11156,,,,,597623,1679,,0 +"2020-12-18","SC",4872,4512,29,360,13267,13267,1460,88,,315,2577819,32571,84768,,2502705,,143,267076,247361,4302,0,14106,36475,,,322475,133902,,0,2844895,36873,98874,326401,,,,0,2825180,36349 +"2020-12-18","SD",1329,,28,,5348,5348,387,31,,73,264794,1075,,,,,41,93772,85910,575,0,,,,,91858,83670,,0,569690,2493,,,,,358566,1650,569690,2493 +"2020-12-18","TN",5960,5287,115,673,13626,13626,3099,89,,767,,0,,,4686095,,400,503651,452581,10421,0,,54167,,,526351,425264,,0,5212446,64713,,498503,,,,0,5212446,64713 +"2020-12-18","TX",24954,,294,,,,9709,0,,2739,,0,,,,,,1555981,1384476,16792,0,72492,80939,,,1513343,1245339,,0,12532344,88332,639270,977880,,,,0,12532344,88332 +"2020-12-18","UT",1140,,14,,9883,9883,549,92,1707,206,1246575,5506,,,1850222,605,,246562,,2644,0,,25905,,24869,241472,188846,,0,2091694,15499,,355690,,153950,1469845,7592,2091694,15499 +"2020-12-18","VA",4598,4164,45,434,16684,16684,2409,181,,510,,0,,,,,254,299388,256999,3295,0,15367,39768,,,308734,,3831683,20893,3831683,20893,178644,524667,,,,0,,0 +"2020-12-18","VI",23,,0,,,,,0,,,30908,323,,,,,,1900,,22,0,,,,,,1691,,0,32808,345,,,,,32903,321,,0 +"2020-12-18","VT",107,107,2,,,,29,0,,10,242897,1589,,,,,,6243,6089,94,0,,,,,,3970,,0,640896,7450,,,,,248986,1682,640896,7450 +"2020-12-18","WA",3117,,75,,13235,13235,1231,161,,273,,0,,,,,150,217205,209344,2940,0,,,,,,,3432892,0,3432892,0,,,,,,0,,0 +"2020-12-18","WI",4632,4315,71,317,19930,19930,1330,145,1968,290,2281130,7194,,,,,,486364,451676,3921,0,,,,,,408367,5004584,38347,5004584,38347,,,,,2732806,10429,,0 +"2020-12-18","WV",1091,998,20,93,,,753,0,,193,,0,,,,,82,69751,57853,1266,0,,,,,,46632,,0,1361997,11832,24161,,,,,0,1361997,11832 +"2020-12-18","WY",351,,0,,1001,1001,157,18,,,153505,379,,,427157,,,41359,35760,766,0,,,,,36505,38544,,0,463753,6541,,,,,189265,1026,463753,6541 +"2020-12-17","AK",183,183,2,,921,921,140,0,,,,0,,,1124849,,14,41418,,377,0,,,,,49566,,,0,1175723,9578,,,,,,0,1175723,9578 +"2020-12-17","AL",4254,3745,56,509,29559,29559,2425,0,2383,,1499349,8070,,,,1369,,310335,253364,4695,0,,,,,,183625,,0,1752713,11585,,,80026,,1752713,11585,,0 +"2020-12-17","AR",3112,2755,38,357,10357,10357,1084,127,,374,1734262,11404,,,1734262,1125,188,194543,165512,3039,0,,,,35233,,169745,,0,1899774,13686,,,,194199,,0,1899774,13686 +"2020-12-17","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-17","AZ",7677,7040,147,637,31851,31851,3884,383,,899,2165904,17714,,,,,618,435036,417490,5817,0,,,,,,,,0,4462666,53583,,,381042,,2583394,22754,4462666,53583 +"2020-12-17","CA",21860,,379,,,,16426,0,,3392,,0,,,,,,1723362,1723362,52281,0,,,,,,,,0,28456358,306768,,,,,,0,28456358,306768 +"2020-12-17","CO",4226,3633,70,593,16704,16704,1509,90,,,1710371,9158,218820,,,,,300414,288105,3698,0,23888,,,,,,3924072,46805,3924072,46805,247453,,,,1998476,12726,,0 +"2020-12-17","CT",5552,4489,46,1063,12257,12257,1205,0,,,,0,,,3970602,,,160102,150549,2321,0,,7015,,,191726,,,0,4168401,36942,,96479,,,,0,4168401,36942 +"2020-12-17","DC",725,,5,,,,246,0,,80,,0,,,,,34,25830,,228,0,,,,,,18582,804207,5819,804207,5819,,,,,336446,1447,,0 +"2020-12-17","DE",845,745,12,100,,,407,0,,58,427907,2343,,,,,,48768,46897,839,0,,,,,49471,,874587,10563,874587,10563,,,,,476675,3182,,0 +"2020-12-17","FL",20594,,104,,60077,60077,5122,326,,,6922831,46794,578113,560932,11150780,,,1149126,1014615,13102,0,71851,,69600,,1492914,,14262140,131562,14262140,131562,650372,,630838,,8071957,59896,12700623,114068 +"2020-12-17","GA",10294,9358,66,936,38718,38718,3616,300,6967,,,0,,,,,,568396,494173,7777,0,41051,,,,465049,,,0,4856170,38262,385298,,,,,0,4856170,38262 +"2020-12-17","GU",119,,0,,,,30,0,,9,85169,422,,,,,6,7183,7017,15,0,17,178,,,,6580,,0,92352,437,321,4849,,,,0,92186,435 +"2020-12-17","HI",280,280,2,,1648,1648,53,277,,14,,0,,,,,7,20095,19731,141,0,,,,,19647,,753607,5698,753607,5698,,,,,,0,,0 +"2020-12-17","IA",3451,,97,,,,746,0,,146,909257,3125,,75164,1838477,,87,226465,226465,1415,0,,38487,7051,36114,245334,204861,,0,1135722,4540,,717403,82255,163502,1137943,4531,2094488,13174 +"2020-12-17","ID",1231,1104,17,127,4965,4965,470,57,908,109,410047,2243,,,,,,125452,104753,1433,0,,,,,,48752,,0,514800,3256,,45753,,,514800,3256,799525,9731 +"2020-12-17","IL",15985,14835,208,1150,,,4804,0,,1063,,0,,,,,575,879428,,8828,0,,,,,,,,0,12147303,92015,,,,,,0,12147303,92015 +"2020-12-17","IN",7180,6860,79,320,31820,31820,3147,245,5605,683,2030544,9832,,,,,382,447190,,6340,0,,,,,405471,,,0,5102994,52831,,,,,2477734,16172,5102994,52831 +"2020-12-17","KS",2253,,0,,6050,6050,858,0,1628,228,723696,0,,,,409,111,194569,,0,0,,,,,,,,0,918265,0,,,,,918265,0,,0 +"2020-12-17","KY",2316,2183,54,133,12129,12129,1817,403,2830,431,,0,,,,,254,234021,190277,3328,0,,,,,,33666,,0,2968844,28747,99173,139752,,,,0,2968844,28747 +"2020-12-17","LA",6964,6637,31,327,,,1602,0,,,3617503,29415,,,,,169,279321,257483,3776,0,,,,,,232725,,0,3896824,33191,,168007,,,,0,3874986,32409 +"2020-12-17","MA",11558,11305,45,253,15372,15372,1871,549,,383,3443888,19121,,,,,207,309247,297301,5135,0,,,12560,,364785,206843,,0,9901732,92627,,,137188,312716,3741189,24106,9901732,92627 +"2020-12-17","MD",5319,5152,49,167,24136,24136,1702,228,,394,2374542,8698,,150832,,,,243984,243984,2217,0,,,17546,,293698,9044,,0,5160976,29546,,,168378,,2618526,10915,5160976,29546 +"2020-12-17","ME",276,272,9,4,958,958,191,24,,46,,0,12727,,,,17,17901,15576,590,0,495,2144,,,19869,10688,,0,994239,7786,13234,49198,,,,0,994239,7786 +"2020-12-17","MI",11801,11212,213,589,,,3395,0,,780,,0,,,7100305,,461,487356,450776,4541,0,,,,,572779,236369,,0,7673084,53747,402979,,,,,0,7673084,53747 +"2020-12-17","MN",4658,4534,83,124,20172,20172,1222,192,4353,289,2430688,12297,,,,,,389171,377842,2759,0,,,,,,358667,4865880,42028,4865880,42028,,167249,,,2808530,14637,,0 +"2020-12-17","MO",4834,,35,,,,2536,0,,584,1600587,6928,91958,,3006347,,316,356607,356607,3569,0,10742,32320,,,394017,,,0,3407160,25516,102913,258424,96593,124012,1957194,10497,3407160,25516 +"2020-12-17","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,113,113,0,0,,,,,,29,,0,17542,0,,,,,17542,0,26131,0 +"2020-12-17","MS",4320,3594,26,726,7901,7901,1293,0,,315,1079660,0,,,,,193,187904,136835,2261,0,,,,,,148466,,0,1267564,2261,57605,336269,,,,0,1213929,0 +"2020-12-17","MT",849,,13,,3199,3199,306,46,,64,,0,,,,,29,75483,,839,0,,,,,,65393,,0,742540,6481,,,,,,0,742540,6481 +"2020-12-17","NC",6065,5788,86,277,,,2804,0,,620,,0,,,,,,457660,423821,5786,0,,,,,,,,0,5985959,53560,,203947,,,,0,5985959,53560 +"2020-12-17","ND",1210,,10,,3073,3073,148,0,479,48,279888,744,11953,,,,,89063,86787,377,0,1442,,,,,84875,1186154,6486,1186154,6486,13395,16857,,,366675,1066,1249401,7162 +"2020-12-17","NE",1448,,10,,4908,4908,646,24,,,655544,2390,,,1420527,,,152103,,1242,0,,,,,173638,85915,,0,1595977,13736,,,,,808043,3640,1595977,13736 +"2020-12-17","NH",629,,4,,877,877,284,7,293,,449752,2174,,,,,,34264,26312,831,0,,,,,,26707,,0,940070,7541,35141,38368,34129,,476064,2718,940070,7541 +"2020-12-17","NJ",18080,16172,77,1908,44602,44602,3637,141,,726,6530540,0,,,,,488,460722,419330,4911,0,,,,,,,,0,6991262,4911,,,,,,0,6945615,0 +"2020-12-17","NM",2097,,48,,8408,8408,852,109,,,,0,,,,,,126045,,1688,0,,,,,,50784,,0,1796603,29195,,,,,,0,1796603,29195 +"2020-12-17","NV",2673,,20,,,,1975,0,,416,893998,3526,,,,,282,196379,196379,2281,0,,,,,,,1900403,14474,1900403,14474,,,,,1090377,5807,,0 +"2020-12-17","NY",28222,,122,,89995,89995,6147,0,,1095,,0,,,,,611,815469,,10914,0,,,,,,,22680046,202772,22680046,202772,,,,,,0,,0 +"2020-12-17","OH",7894,7241,117,653,33745,33745,5018,370,5382,1211,,0,,,,,838,596178,542686,11412,0,,32980,,,570203,426525,,0,7056704,57611,,655811,,,,0,7056704,57611 +"2020-12-17","OK",2144,,16,,14821,14821,1699,156,,481,2158637,0,,,2158637,,,248204,,2975,0,7147,,,,244480,214290,,0,2406841,2975,101297,,,,,0,2403117,0 +"2020-12-17","OR",1262,,48,,5679,5679,620,100,,122,,0,,,2231538,,63,97622,,1530,0,,,,,136871,,,0,2368409,24681,,,,,,0,2368409,24681 +"2020-12-17","PA",13392,,224,,,,6209,0,,1246,3101764,15705,,,,,745,529335,481810,9966,0,,,,,,317601,6800942,62951,6800942,62951,,,,,3583574,24321,,0 +"2020-12-17","PR",1323,1086,11,237,,,602,0,,99,305972,0,,,395291,,100,64751,61783,1065,0,48083,,,,20103,55479,,0,370723,1065,,,,,,0,415664,0 +"2020-12-17","RI",1602,,12,,5766,5766,479,66,,59,518654,3165,,,1712915,,29,77290,,1081,0,,,,,93289,,1806204,19541,1806204,19541,,,,,595944,4246,,0 +"2020-12-17","SC",4843,4484,43,359,13179,13179,1524,109,,333,2545248,13693,84169,,2470876,,113,262774,243583,2655,0,13910,35556,,,317955,132358,,0,2808022,16348,98079,319131,,,,0,2788831,15805 +"2020-12-17","SD",1301,,1,,5317,5317,406,52,,77,263719,708,,,,,41,93197,85474,594,0,,,,,91401,83140,,0,567197,4919,,,,,356916,1302,567197,4919 +"2020-12-17","TN",5845,5195,177,650,13537,13537,3165,100,,780,,0,,,4631204,,399,493230,444105,8945,0,,51639,,,516529,418724,,0,5147733,32933,,483905,,,,0,5147733,32933 +"2020-12-17","TX",24660,,266,,,,9628,0,,2771,,0,,,,,,1539189,1371223,19849,0,71064,79073,,,1500558,1216415,,0,12444012,83703,627702,957887,,,,0,12444012,83703 +"2020-12-17","UT",1126,,30,,9791,9791,571,99,1694,211,1241069,6657,,,1837001,601,,243918,,3203,0,,25385,,24379,239194,186564,,0,2076195,17289,,346282,,150995,1462253,9328,2076195,17289 +"2020-12-17","VA",4553,4126,45,427,16503,16503,2399,150,,490,,0,,,,,246,296093,254722,3853,0,15176,38582,,,306207,,3810790,30764,3810790,30764,177710,509287,,,,0,,0 +"2020-12-17","VI",23,,0,,,,,0,,,30585,769,,,,,,1878,,50,0,,,,,,1667,,0,32463,819,,,,,32582,842,,0 +"2020-12-17","VT",105,105,0,,,,26,0,,3,241308,1139,,,,,,6149,5996,140,0,,,,,,3897,,0,633446,5086,,,,,247304,1275,633446,5086 +"2020-12-17","WA",3042,,89,,13074,13074,1233,301,,279,,0,,,,,141,214265,206594,61,0,,,,,,,3432892,21216,3432892,21216,,,,,,0,,0 +"2020-12-17","WI",4561,4255,68,306,19785,19785,1363,129,1963,298,2273936,7295,,,,,,482443,448441,4281,0,,,,,,403706,4966237,38534,4966237,38534,,,,,2722377,10938,,0 +"2020-12-17","WV",1071,983,32,88,,,781,0,,206,,0,,,,,84,68485,56877,1636,0,,,,,,45582,,0,1350165,14331,23993,,,,,0,1350165,14331 +"2020-12-17","WY",351,,23,,983,983,169,7,,,153126,903,,,420938,,,40593,35113,283,0,,,,,36183,37953,,0,457212,-604,,,,,188239,1133,457212,-604 +"2020-12-16","AK",181,181,2,,921,921,146,13,,,,0,,,1115724,,15,41041,,603,0,,,,,49120,,,0,1166145,8278,,,,,,0,1166145,8278 +"2020-12-16","AL",4198,3704,74,494,29559,29559,2310,300,2380,,1491279,6097,,,,1364,,305640,249849,4107,0,,,,,,183625,,0,1741128,8943,,,79047,,1741128,8943,,0 +"2020-12-16","AR",3074,2725,58,349,10230,10230,1079,134,,399,1722858,9979,,,1722858,1117,184,191504,163230,2306,0,,,,34344,,167631,,0,1886088,11617,,,,187871,,0,1886088,11617 +"2020-12-16","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-16","AZ",7530,6919,108,611,31468,31468,3809,202,,882,2148190,11008,,,,,602,429219,412450,4837,0,,,,,,,,0,4409083,34631,,,379855,,2560640,15314,4409083,34631 +"2020-12-16","CA",21481,,293,,,,15886,0,,3297,,0,,,,,,1671081,1671081,53711,0,,,,,,,,0,28149590,304524,,,,,,0,28149590,304524 +"2020-12-16","CO",4156,3570,71,586,16614,16614,1554,127,,,1701213,6874,215771,,,,,296716,284537,3334,0,23298,,,,,,3877267,35442,3877267,35442,242708,,,,1985750,10065,,0 +"2020-12-16","CT",5506,4449,40,1057,12257,12257,1254,0,,,,0,,,3936000,,,157781,148383,2319,0,,6816,,,189410,,,0,4131459,42091,,93494,,,,0,4131459,42091 +"2020-12-16","DC",720,,0,,,,245,0,,73,,0,,,,,26,25602,,263,0,,,,,,18392,798388,6404,798388,6404,,,,,334999,1701,,0 +"2020-12-16","DE",833,735,7,98,,,400,0,,54,425564,2535,,,,,,47929,46116,787,0,,,,,48504,,864024,9676,864024,9676,,,,,473493,3322,,0 +"2020-12-16","FL",20490,,125,,59751,59751,5156,366,,,6876037,39035,578113,560932,11053512,,,1136024,1005010,11282,0,71851,,69600,,1476473,,14130578,108401,14130578,108401,650372,,630838,,8012061,50317,12586555,103137 +"2020-12-16","GA",10228,9302,68,926,38418,38418,3564,307,6936,,,0,,,,,,560619,488338,6624,0,40546,,,,459748,,,0,4817908,23433,383471,,,,,0,4817908,23433 +"2020-12-16","GU",119,,0,,,,28,0,,9,84747,287,,,,,5,7168,7004,19,0,17,178,,,,6513,,0,91915,306,321,4761,,,,0,91751,303 +"2020-12-16","HI",278,278,4,,1371,1371,60,7,,19,,0,,,,,18,19954,19590,110,0,,,,,19519,,747909,3662,747909,3662,,,,,,0,,0 +"2020-12-16","IA",3354,,14,,,,776,0,,152,906132,2559,,74873,1826895,,85,225050,225050,1539,0,,38061,6790,35724,243800,200792,,0,1131182,4098,,708292,81703,162641,1133412,4087,2081314,16014 +"2020-12-16","ID",1214,1088,20,126,4908,4908,444,81,895,101,407804,2765,,,,,,124019,103740,1802,0,,,,,,48070,,0,511544,4165,,45753,,,511544,4165,789794,6081 +"2020-12-16","IL",15777,14655,190,1122,,,4793,0,,1045,,0,,,,,590,870600,,7123,0,,,,,,,,0,12055288,93278,,,,,,0,12055288,93278 +"2020-12-16","IN",7101,6781,133,320,31575,31575,3192,251,5564,852,2020712,8803,,,,,380,440850,,6208,0,,,,,399796,,,0,5050163,49885,,,,,2461562,15011,5050163,49885 +"2020-12-16","KS",2253,,144,,6050,6050,858,155,1628,228,723696,9982,,,,409,111,194569,,4551,0,,,,,,,,0,918265,14533,,,,,918265,14533,,0 +"2020-12-16","KY",2262,2133,23,129,11726,11726,1793,137,2759,460,,0,,,,,239,230693,187697,2875,0,,,,,,32402,,0,2940097,14968,98848,136923,,,,0,2940097,14968 +"2020-12-16","LA",6933,6607,38,326,,,1584,0,,,3588088,22115,,,,,167,275545,254489,3269,0,,,,,,232725,,0,3863633,25384,,163264,,,,0,3842577,24145 +"2020-12-16","MA",11513,11261,70,252,14823,14823,1851,0,,382,3424767,22774,,,,,205,304112,292316,5952,0,,,12349,,358906,187221,,0,9809105,124172,,,135208,309136,3717083,28224,9809105,124172 +"2020-12-16","MD",5270,5103,64,167,23908,23908,1762,197,,399,2365844,11329,,150832,,,,241767,241767,2405,0,,,17546,,290913,8966,,0,5131430,36858,,,168378,,2607611,13734,5131430,36858 +"2020-12-16","ME",267,263,2,4,934,934,187,25,,46,,0,12705,,,,18,17311,15142,551,0,487,2134,,,19550,10650,,0,986453,8432,13204,48745,,,,0,986453,8432 +"2020-12-16","MI",11588,11018,93,570,,,3571,0,,818,,0,,,7051776,,476,482815,446752,4644,0,,,,,567561,236369,,0,7619337,55380,400859,,,,,0,7619337,55380 +"2020-12-16","MN",4575,4455,92,120,19980,19980,1277,195,4323,304,2418391,4632,,,,,,386412,375502,2248,0,,,,,,356384,4823852,16534,4823852,16534,,161618,,,2793893,6642,,0 +"2020-12-16","MO",4799,,45,,,,2529,0,,604,1593659,4017,91576,,2984963,,324,353038,353038,2673,0,10549,31551,,,389956,,,0,3381644,15675,102338,251604,96130,121748,1946697,6690,3381644,15675 +"2020-12-16","MP",2,2,0,,4,4,,0,,,17429,0,,,,,,113,113,0,0,,,,,,29,,0,17542,0,,,,,17542,0,26131,0 +"2020-12-16","MS",4294,3581,42,713,7901,7901,1316,0,,321,1079660,0,,,,,193,185643,136002,2343,0,,,,,,148466,,0,1265303,2343,57605,336269,,,,0,1213929,0 +"2020-12-16","MT",836,,10,,3153,3153,311,34,,65,,0,,,,,35,74644,,604,0,,,,,,64737,,0,736059,3320,,,,,,0,736059,3320 +"2020-12-16","NC",5979,5714,98,265,,,2811,0,,646,,0,,,,,,451874,419231,5273,0,,,,,,,,0,5932399,33769,,198646,,,,0,5932399,33769 +"2020-12-16","ND",1200,,24,,3073,3073,160,0,479,48,279144,526,11953,,,,,88686,86465,291,0,1442,,,,,84535,1179668,4494,1179668,4494,13395,15448,,,365609,761,1242239,4889 +"2020-12-16","NE",1438,,20,,4884,4884,677,53,,,653154,2256,,,1408366,,,150861,,1517,0,,,,,172124,85127,,0,1582241,19497,,,,,804403,3772,1582241,19497 +"2020-12-16","NH",625,,21,,870,870,286,7,292,,447578,1799,,,,,,33433,25768,888,0,,,,,,26128,,0,932529,5919,35061,37554,34058,,473346,2309,932529,5919 +"2020-12-16","NJ",18003,16095,131,1908,44461,44461,3672,325,,721,6530540,69631,,,,,482,455811,415075,6306,0,,,,,,,,0,6986351,75937,,,,,,0,6945615,75292 +"2020-12-16","NM",2049,,43,,8299,8299,838,160,,,,0,,,,,,124357,,1800,0,,,,,,49609,,0,1767408,11982,,,,,,0,1767408,11982 +"2020-12-16","NV",2653,,57,,,,1550,0,,329,890472,3599,,,,,247,194098,194098,2366,0,,,,,,,1885929,19084,1885929,19084,,,,,1084570,5965,,0 +"2020-12-16","NY",28100,,98,,89995,89995,6097,0,,1098,,0,,,,,611,804555,,9998,0,,,,,,,22477274,160947,22477274,160947,,,,,,0,,0 +"2020-12-16","OH",7777,7141,123,636,33375,33375,5143,497,5344,1254,,0,,,,,845,584766,533299,5409,0,,31951,,,562324,416028,,0,6999093,33346,,636529,,,,0,6999093,33346 +"2020-12-16","OK",2128,,42,,14665,14665,1717,257,,481,2158637,10680,,,2158637,,,245229,,3238,0,7147,,,,244480,210907,,0,2403866,13918,101297,,,,,0,2403117,7866 +"2020-12-16","OR",1214,,53,,5579,5579,599,76,,119,,0,,,2208399,,67,96092,,1082,0,,,,,135329,,,0,2343728,38797,,,,,,0,2343728,38797 +"2020-12-16","PA",13168,,278,,,,6346,0,,1238,3086059,13754,,,,,740,519369,473194,10049,0,,,,,,306427,6737991,62032,6737991,62032,,,,,3559253,21814,,0 +"2020-12-16","PR",1312,1077,18,235,,,593,0,,98,305972,0,,,395291,,96,63686,60792,267,0,47546,,,,20103,55464,,0,369658,267,,,,,,0,415664,0 +"2020-12-16","RI",1590,,20,,5700,5700,469,84,,62,515489,2337,,,1694627,,30,76209,,972,0,,,,,92036,,1786663,15229,1786663,15229,,,,,591698,3309,,0 +"2020-12-16","SC",4800,4444,44,356,13070,13070,1046,110,,261,2531555,19316,83898,,2457608,,111,260119,241471,2799,0,13817,34538,,,315418,130905,,0,2791674,22115,97715,311277,,,,0,2773026,21668 +"2020-12-16","SD",1300,,39,,5265,5265,412,23,,81,263011,1428,,,,,25,92603,84967,904,0,,,,,90483,80316,,0,562278,913,,,,,355614,2332,562278,913 +"2020-12-16","TN",5668,5059,53,609,13437,13437,3100,105,,757,,0,,,4605350,,378,484285,437798,11410,0,,48804,,,509450,411843,,0,5114800,57810,,467572,,,,0,5114800,57810 +"2020-12-16","TX",24394,,252,,,,9528,0,,2742,,0,,,,,,1519340,1367965,18802,0,70308,77243,,,1489316,1216415,,0,12360309,77097,624341,934936,,,,0,12360309,77097 +"2020-12-16","UT",1096,,19,,9692,9692,566,107,1686,210,1234412,5685,,,1822652,598,,240715,,2928,0,,24736,,23771,236254,182744,,0,2058906,15526,,336818,,147438,1452925,7893,2058906,15526 +"2020-12-16","VA",4508,4090,38,418,16353,16353,2349,166,,511,,0,,,,,257,292240,251894,3931,0,14973,37577,,,302764,,3780026,25270,3780026,25270,176758,498734,,,,0,,0 +"2020-12-16","VI",23,,0,,,,,0,,,29816,0,,,,,,1828,,0,0,,,,,,1641,,0,31644,0,,,,,31740,0,,0 +"2020-12-16","VT",105,105,5,,,,33,0,,6,240169,490,,,,,,6009,5860,86,0,,,,,,3776,,0,628360,3143,,,,,246029,572,628360,3143 +"2020-12-16","WA",2953,2953,35,,12773,12773,1181,124,,260,,0,,,,,138,214204,206544,667,0,,,,,,,3411676,31332,3411676,31332,,,,,,0,,0 +"2020-12-16","WI",4493,4196,85,297,19656,19656,1410,146,1951,314,2266641,6849,,,,,,478162,444798,2822,0,,,,,,399073,4927703,28659,4927703,28659,,,,,2711439,9251,,0 +"2020-12-16","WV",1039,958,27,81,,,766,0,,197,,0,,,,,82,66849,55536,1148,0,,,,,,44550,,0,1335834,8688,23759,,,,,0,1335834,8688 +"2020-12-16","WY",328,,0,,976,976,173,5,,,152223,705,,,421419,,,40310,34883,246,0,,,,,36306,37458,,0,457816,7792,,,,,187106,876,457816,7792 +"2020-12-15","AK",179,179,3,,908,908,140,19,,,,0,,,1107974,,13,40438,,278,0,,,,,48598,,,0,1157867,10307,,,,,,0,1157867,10307 +"2020-12-15","AL",4124,3642,22,482,29259,29259,2353,346,2374,,1485182,6275,,,,1360,,301533,247003,3638,0,,,,,,174805,,0,1732185,8516,,,78493,,1732185,8516,,0 +"2020-12-15","AR",3016,2672,26,344,10096,10096,1070,105,,382,1712879,7036,,,1712879,1099,190,189198,161592,1691,0,,,,33593,,165467,,0,1874471,8272,,,,183346,,0,1874471,8272 +"2020-12-15","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-15","AZ",7422,6835,64,587,31266,31266,3702,124,,863,2137182,10254,,,,,579,424382,408144,4134,0,,,,,,,,0,4374452,29759,,,378518,,2545326,14104,4374452,29759 +"2020-12-15","CA",21188,,142,,,,15198,0,,3193,,0,,,,,,1617370,1617370,32326,0,,,,,,,,0,27845066,293027,,,,,,0,27845066,293027 +"2020-12-15","CO",4085,3505,116,580,16487,16487,1554,313,,,1694339,4736,213157,,,,,293382,281346,2278,0,22725,,,,,,3841825,31936,3841825,31936,239069,,,,1975685,6804,,0 +"2020-12-15","CT",5466,4414,22,1052,12257,12257,1269,0,,,,0,,,3896731,,,155462,146114,1470,0,,6725,,,186624,,,0,4089368,45897,,91514,,,,0,4089368,45897 +"2020-12-15","DC",720,,4,,,,224,0,,75,,0,,,,,26,25339,,301,0,,,,,,18137,791984,9005,791984,9005,,,,,333298,2205,,0 +"2020-12-15","DE",826,728,10,98,,,376,0,,62,423029,2073,,,,,,47142,45381,685,0,,,,,47589,,854348,8556,854348,8556,,,,,470171,2758,,0 +"2020-12-15","FL",20365,,94,,59385,59385,5103,352,,,6837002,34435,578113,560932,10965359,,,1124742,997924,9296,0,71851,,69600,,1461780,,14022177,85977,14022177,85977,650372,,630838,,7961744,43731,12483418,82685 +"2020-12-15","GA",10160,9250,56,910,38111,38111,3352,374,6896,,,0,,,,,,553995,484152,7437,0,40399,,,,456367,,,0,4794475,38945,382784,,,,,0,4794475,38945 +"2020-12-15","GU",119,,0,,,,28,0,,9,84460,465,,,,,5,7149,6988,12,0,17,178,,,,6511,,0,91609,477,320,4745,,,,0,91448,475 +"2020-12-15","HI",274,274,0,,1364,1364,57,7,,17,,0,,,,,14,19844,19480,56,0,,,,,19423,,744247,3206,744247,3206,,,,,,0,,0 +"2020-12-15","IA",3340,,67,,,,798,0,,166,903573,1584,,74612,1812659,,88,223511,223511,726,0,,37363,6539,35062,242125,196157,,0,1127084,2310,,693906,81191,160291,1129325,2326,2065300,7573 +"2020-12-15","ID",1194,1075,19,119,4827,4827,444,64,884,101,405039,558,,,,,,122217,102340,1038,0,,,,,,47497,,0,507379,1421,,45753,,,507379,1421,783713,3665 +"2020-12-15","IL",15587,14509,132,1078,,,4965,0,,1057,,0,,,,,598,863477,,7359,0,,,,,,,,0,11962010,92922,,,,,,0,11962010,92922 +"2020-12-15","IN",6968,6657,128,311,31324,31324,3229,289,5538,911,2011909,6425,,,,,404,434642,,4241,0,,,,,394462,,,0,5000278,38910,,,,,2446551,10666,5000278,38910 +"2020-12-15","KS",2109,,0,,5895,5895,623,0,1584,182,713714,0,,,,409,88,190018,,0,0,,,,,,,,0,903732,0,,,,,903732,0,,0 +"2020-12-15","KY",2239,2112,15,127,11589,11589,1788,126,2725,438,,0,,,,,246,227818,185901,2928,0,,,,,,32234,,0,2925129,9654,98612,133768,,,,0,2925129,9654 +"2020-12-15","LA",6895,6577,50,318,,,1597,0,,,3565973,31246,,,,,152,272276,252459,2633,0,,,,,,217930,,0,3838249,33879,,156087,,,,0,3818432,33413 +"2020-12-15","MA",11443,11190,55,253,14823,14823,1834,0,,371,3401993,15615,,,,,200,298160,286866,3929,0,,,12349,,352414,187221,,0,9684933,61236,,,135208,303783,3688859,19335,9684933,61236 +"2020-12-15","MD",5206,5039,64,167,23711,23711,1799,153,,411,2354515,10492,,147905,,,,239362,239362,2401,0,,,16775,,287692,8958,,0,5094572,33185,,,164680,,2593877,12893,5094572,33185 +"2020-12-15","ME",265,261,6,4,909,909,195,16,,55,,0,12667,,,,19,16760,14690,411,0,456,2034,,,19157,10614,,0,978021,5623,13135,47050,,,,0,978021,5623 +"2020-12-15","MI",11495,10935,206,560,,,3674,0,,821,,0,,,7001981,,508,478171,442715,5391,0,,,,,561976,236369,,0,7563957,49711,397438,,,,,0,7563957,49711 +"2020-12-15","MN",4483,4369,21,114,19785,19785,1309,147,4286,300,2413759,10171,,,,,,384164,373492,2323,0,,,,,,351820,4807318,30809,4807318,30809,,158586,,,2787251,12321,,0 +"2020-12-15","MO",4754,,240,,,,2543,0,,593,1589642,4002,91267,,2972303,,325,350365,350365,2762,0,10381,30270,,,386982,,,0,3365969,15716,101857,240934,95728,117580,1940007,6764,3365969,15716 +"2020-12-15","MP",2,2,0,,4,4,,0,,,17429,223,,,,,,113,113,0,0,,,,,,29,,0,17542,223,,,,,17542,223,26131,608 +"2020-12-15","MS",4252,3555,48,697,7901,7901,1319,0,,310,1079660,0,,,,,187,183300,135105,2205,0,,,,,,148466,,0,1262960,2205,57605,336269,,,,0,1213929,0 +"2020-12-15","MT",826,,8,,3119,3119,338,39,,68,,0,,,,,34,74040,,737,0,,,,,,64298,,0,732739,5680,,,,,,0,732739,5680 +"2020-12-15","NC",5881,5639,26,242,,,2735,0,,643,,0,,,,,,446601,415080,5236,0,,,,,,,,0,5898630,36132,,190556,,,,0,5898630,36132 +"2020-12-15","ND",1176,,13,,3073,3073,277,0,479,48,278618,439,11953,,,,,88395,86232,328,0,1442,,,,,83995,1175174,3325,1175174,3325,13395,14052,,,364848,681,1237350,3650 +"2020-12-15","NE",1418,,45,,4831,4831,693,35,,,650898,836,,,1390721,,,149344,,483,0,,,,,170271,84063,,0,1562744,6217,,,,,800631,1321,1562744,6217 +"2020-12-15","NH",604,,0,,863,863,252,1,289,,445779,2087,,,,,,32545,25258,670,0,,,,,,25464,,0,926610,6149,35008,36757,34009,,471037,2757,926610,6149 +"2020-12-15","NJ",17872,16004,97,1868,44136,44136,3660,225,,727,6460909,79722,,,,,456,449505,409414,4701,0,,,,,,,,0,6910414,84423,,,,,,0,6870323,83688 +"2020-12-15","NM",2006,,28,,8139,8139,865,102,,,,0,,,,,,122557,,1258,0,,,,,,48105,,0,1755426,14025,,,,,,0,1755426,14025 +"2020-12-15","NV",2596,,48,,,,1979,0,,414,886873,5865,,,,,258,191732,191732,2320,0,,,,,,,1866845,21538,1866845,21538,,,,,1078605,8185,,0 +"2020-12-15","NY",28002,,132,,89995,89995,5982,0,,1065,,0,,,,,580,794557,,10353,0,,,,,,,22316327,194188,22316327,194188,,,,,,0,,0 +"2020-12-15","OH",7654,7054,103,600,32878,32878,5296,614,5283,1311,,0,,,,,863,579357,529508,8755,0,,30503,,,556646,404810,,0,6965747,38661,,611609,,,,0,6965747,38661 +"2020-12-15","OK",2086,,14,,14408,14408,1741,46,,471,2147957,37478,,,2147957,,,241991,,2224,0,7147,,,,242962,206896,,0,2389948,39702,101297,,,,,0,2395251,45131 +"2020-12-15","OR",1161,,6,,5503,5503,601,108,,134,,0,,,2171369,,68,95010,,1157,0,,,,,133562,,,0,2304931,62160,,,,,,0,2304931,62160 +"2020-12-15","PA",12890,,270,,,,6295,0,,1264,3072305,11616,,,,,705,509320,465134,9556,0,,,,,,295405,6675959,56430,6675959,56430,,,,,3537439,18601,,0 +"2020-12-15","PR",1294,1048,12,246,,,583,0,,97,305972,0,,,395291,,101,63419,60668,434,0,47530,,,,20103,53982,,0,369391,434,,,,,,0,415664,0 +"2020-12-15","RI",1570,,15,,5616,5616,455,82,,53,513152,2856,,,1680555,,29,75237,,1166,0,,,,,90879,,1771434,12476,1771434,12476,,,,,588389,4022,,0 +"2020-12-15","SC",4756,4402,5,354,12960,12960,1046,50,,261,2512239,21815,83628,,2439043,,111,257320,239119,2544,0,13762,33663,,,312315,129227,,0,2769559,24359,97390,303478,,,,0,2751358,24149 +"2020-12-15","SD",1261,,2,,5242,5242,435,42,,77,261583,390,,,,,41,91699,84290,345,0,,,,,90245,78919,,0,561365,1685,,,,,353282,735,561365,1685 +"2020-12-15","TN",5615,5022,74,593,13332,13332,3062,126,,737,,0,,,4557804,,366,472875,428868,8611,0,,46607,,,499186,404597,,0,5056990,44586,,454223,,,,0,5056990,44586 +"2020-12-15","TX",24142,,205,,,,9472,0,,2725,,0,,,,,,1500538,1352489,18926,0,69839,76600,,,1476519,1203398,,0,12283212,119269,621818,922161,,,,0,12283212,119269 +"2020-12-15","UT",1077,,15,,9585,9585,568,99,1676,203,1228727,3533,,,1809514,592,,237787,,1915,0,,24171,,23226,233866,181000,,0,2043380,10205,,328234,,144823,1445032,4891,2043380,10205 +"2020-12-15","VA",4470,4058,56,412,16187,16187,2361,114,,490,,0,,,,,240,288309,249040,3160,0,14850,36376,,,299894,,3754756,25743,3754756,25743,176040,485798,,,,0,,0 +"2020-12-15","VI",23,,0,,,,,0,,,29816,244,,,,,,1828,,21,0,,,,,,1641,,0,31644,265,,,,,31740,240,,0 +"2020-12-15","VT",100,100,4,,,,20,0,,4,239679,186,,,,,,5923,5778,66,0,,,,,,3680,,0,625217,3076,,,,,245457,252,625217,3076 +"2020-12-15","WA",2918,2918,39,,12649,12649,1144,124,,250,,0,,,,,128,213537,206025,652,0,,,,,,,3380344,32441,3380344,32441,,,,,,0,,0 +"2020-12-15","WI",4408,4122,56,286,19510,19510,1461,184,1944,331,2259792,3798,,,,,,475340,442396,4055,0,,,,,,394095,4899044,19457,4899044,19457,,,,,2702188,7299,,0 +"2020-12-15","WV",1012,936,34,76,,,774,0,,207,,0,,,,,80,65701,54695,1307,0,,,,,,43605,,0,1327146,9093,23593,,,,,0,1327146,9093 +"2020-12-15","WY",328,,7,,971,971,178,4,,,151518,257,,,414622,,,40064,34712,289,0,,,,,35311,37361,,0,450024,9735,,,,,186230,409,450024,9735 +"2020-12-14","AK",176,176,0,,889,889,140,3,,,,0,,,1098479,,12,40160,,422,0,,,,,47796,,,0,1147560,4462,,,,,,0,1147560,4462 +"2020-12-14","AL",4102,3624,0,478,28913,28913,2286,767,2363,,1478907,20347,,,,1353,,297895,244762,2264,0,,,,,,174805,,0,1723669,27230,,,78262,,1723669,27230,,0 +"2020-12-14","AR",2990,2656,45,334,9991,9991,1050,64,,372,1705843,9262,,,1705843,1095,180,187507,160356,1805,0,,,,32616,,163351,,0,1866199,10495,,,,179158,,0,1866199,10495 +"2020-12-14","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-14","AZ",7358,6782,1,576,31142,31142,3677,193,,829,2126928,7223,,,,,542,420248,404294,11806,0,,,,,,,,0,4344693,38805,,,377958,,2531222,18526,4344693,38805 +"2020-12-14","CA",21046,,77,,,,14578,0,,3078,,0,,,,,,1585044,1585044,33278,0,,,,,,,,0,27552039,356452,,,,,,0,27552039,356452 +"2020-12-14","CO",3969,3398,11,571,16174,16174,1585,48,,,1689603,10387,212548,,,,,291104,279278,2911,0,22560,,,,,,3809889,36588,3809889,36588,235882,,,,1968881,13275,,0 +"2020-12-14","CT",5444,4397,81,1047,12257,12257,1243,0,,,,0,,,3854049,,,153992,144793,7231,0,,6499,,,183453,,,0,4043471,13612,,88110,,,,0,4043471,13612 +"2020-12-14","DC",716,,1,,,,239,0,,63,,0,,,,,34,25038,,164,0,,,,,,17914,782979,4714,782979,4714,,,,,331093,1317,,0 +"2020-12-14","DE",816,719,0,97,,,373,0,,50,420956,3053,,,,,,46457,44708,997,0,,,,,46835,,845792,9931,845792,9931,,,,,467413,4050,,0 +"2020-12-14","FL",20271,,138,,59033,59033,4932,142,,,6802567,32182,578113,560932,10895327,,,1115446,991735,8343,0,71851,,69600,,1449377,,13936200,90729,13936200,90729,650372,,630838,,7918013,40525,12400733,84951 +"2020-12-14","GA",10104,9218,28,886,37737,37737,3338,100,6859,,,0,,,,,,546558,479340,3720,0,40214,,,,451146,,,0,4755530,25996,381949,,,,,0,4755530,25996 +"2020-12-14","GU",119,,1,,,,25,0,,9,83995,965,,,,,5,7137,6978,31,0,17,178,,,,6492,,0,91132,996,320,4736,,,,0,90973,1001 +"2020-12-14","HI",274,274,0,,1357,1357,58,0,,21,,0,,,,,17,19788,19424,189,0,,,,,19348,,741041,4972,741041,4972,,,,,,0,,0 +"2020-12-14","IA",3273,,60,,,,764,0,,160,901989,1554,,74216,1805916,,86,222785,222785,637,0,,36776,6281,34515,241353,190221,,0,1124774,2191,,679284,80537,158857,1126999,2193,2057727,5796 +"2020-12-14","ID",1175,1058,6,117,4763,4763,444,17,881,101,404481,1234,,,,,,121179,101477,547,0,,,,,,46980,,0,505958,1745,,45753,,,505958,1745,780048,3094 +"2020-12-14","IL",15455,14394,116,1061,,,4951,0,,1070,,0,,,,,621,856118,,7214,0,,,,,,,,0,11869088,92256,,,,,,0,11869088,92256 +"2020-12-14","IN",6840,6530,35,310,31035,31035,3072,239,5489,872,2005484,7199,,,,,385,430401,,4967,0,,,,,390585,,,0,4961368,33983,,,,,2435885,12166,4961368,33983 +"2020-12-14","KS",2109,,37,,5895,5895,623,95,1584,182,713714,8291,,,,409,88,190018,,4724,0,,,,,,,,0,903732,13015,,,,,903732,13015,,0 +"2020-12-14","KY",2224,2098,17,126,11463,11463,1712,157,2711,441,,0,,,,,243,224890,184072,1786,0,,,,,,32050,,0,2915475,41318,98385,131644,,,,0,2915475,41318 +"2020-12-14","LA",6845,6535,27,310,,,1527,0,,,3534727,9139,,,,,147,269643,250292,1030,0,,,,,,217930,,0,3804370,10169,,152781,,,,0,3785019,10130 +"2020-12-14","MA",11388,11135,39,253,14823,14823,1788,0,,354,3386378,13604,,,,,186,294231,283146,3653,0,,,12349,,348122,187221,,0,9623697,56122,,,135208,300791,3669524,17176,9623697,56122 +"2020-12-14","MD",5142,4978,25,164,23558,23558,1742,165,,404,2344023,13022,,147905,,,,236961,236961,2314,0,,,16775,,284843,8951,,0,5061387,40010,,,164680,,2580984,15336,5061387,40010 +"2020-12-14","ME",259,255,2,4,893,893,198,15,,56,,0,12652,,,,17,16349,14339,426,0,452,1939,,,18855,10548,,0,972398,5251,13116,45325,,,,0,972398,5251 +"2020-12-14","MI",11289,10752,94,537,,,3802,0,,860,,0,,,6957668,,514,472780,437985,7621,0,,,,,556578,236369,,0,7514246,90046,395683,,,,,0,7514246,90046 +"2020-12-14","MN",4462,4350,18,112,19638,19638,1283,102,4255,319,2403588,12768,,,,,,381841,371342,3018,0,,,,,,347077,4776509,41965,4776509,41965,,157285,,,2774930,15576,,0 +"2020-12-14","MO",4514,,3,,,,2624,0,,603,1585640,4869,91067,,2959747,,335,347603,347603,2562,0,10240,29623,,,383863,,,0,3350253,16596,101516,237347,95451,115890,1933243,7431,3350253,16596 +"2020-12-14","MP",2,2,0,,4,4,,0,,,17206,0,,,,,,113,113,0,0,,,,,,29,,0,17319,0,,,,,17319,0,25523,0 +"2020-12-14","MS",4204,3526,5,678,7901,7901,1255,198,,303,1079660,53360,,,,,186,181095,134269,1648,0,,,,,,148466,,0,1260755,55008,57605,336269,,,,0,1213929,59713 +"2020-12-14","MT",818,,0,,3080,3080,350,0,,70,,0,,,,,36,73303,,0,0,,,,,,62778,,0,727059,4751,,,,,,0,727059,4751 +"2020-12-14","NC",5855,5615,32,240,,,2553,0,,613,,0,,,,,,441365,410470,4770,0,,,,,,,,0,5862498,44465,,187337,,,,0,5862498,44465 +"2020-12-14","ND",1163,,5,,3073,3073,277,89,479,48,278179,341,11953,,,,,88067,85988,196,0,1442,,,,,83318,1171849,3189,1171849,3189,13395,12326,,,364167,526,1233700,3481 +"2020-12-14","NE",1373,,8,,4796,4796,692,12,,,650062,2034,,,1385350,,,148861,,1173,0,,,,,169441,82568,,0,1556527,7912,,,,,799310,3210,1556527,7912 +"2020-12-14","NH",604,,1,,862,862,256,1,289,,443692,3189,,,,,,31875,24588,919,0,,,,,,24519,,0,920461,7544,34980,36126,33986,,468280,3801,920461,7544 +"2020-12-14","NJ",17775,15907,24,1868,43911,43911,3635,77,,704,6381187,184431,,,,,491,444804,405448,5337,0,,,,,,,,0,6825991,189768,,,,,,0,6786635,199623 +"2020-12-14","NM",1978,,21,,8037,8037,860,159,,,,0,,,,,,121299,,1499,0,,,,,,46505,,0,1741401,9397,,,,,,0,1741401,9397 +"2020-12-14","NV",2548,,9,,,,2025,0,,400,881008,4328,,,,,263,189412,189412,2579,0,,,,,,,1845307,16093,1845307,16093,,,,,1070420,6907,,0 +"2020-12-14","NY",27870,,85,,89995,89995,5712,0,,1040,,0,,,,,567,784204,,9044,0,,,,,,,22122139,159844,22122139,159844,,,,,,0,,0 +"2020-12-14","OH",7551,6972,59,579,32264,32264,5157,291,5209,1225,,0,,,,,827,570602,522467,7875,0,,30029,,,551489,392565,,0,6927086,57448,,608401,,,,0,6927086,57448 +"2020-12-14","OK",2072,,8,,14362,14362,1664,34,,452,2110479,0,,,2110479,,,239767,,2099,0,7147,,,,235774,202532,,0,2350246,2099,101297,,,,,0,2350120,0 +"2020-12-14","OR",1155,,5,,5395,5395,625,0,,136,,0,,,2113901,,61,93853,,1014,0,,,,,128870,,,0,2242771,0,,,,,,0,2242771,0 +"2020-12-14","PA",12620,,55,,,,6026,0,,1249,3060689,15366,,,,,697,499764,458149,7962,0,,,,,,289863,6619529,54941,6619529,54941,,,,,3518838,23138,,0 +"2020-12-14","PR",1282,1036,10,246,,,609,0,,102,305972,0,,,395291,,105,62985,60348,554,0,47444,,,,20103,52911,,0,368957,554,,,,,,0,415664,0 +"2020-12-14","RI",1555,,17,,5534,5534,433,0,,47,510296,1973,,,1669380,,31,74071,,552,0,,,,,89578,,1758958,7648,1758958,7648,,,,,584367,2525,,0 +"2020-12-14","SC",4751,4398,12,353,12910,12910,1276,36,,307,2490424,23009,83366,,2417685,,140,254776,236785,2570,0,13655,33390,,,309524,128048,,0,2745200,25579,97021,300424,,,,0,2727209,25402 +"2020-12-14","SD",1259,,0,,5200,5200,441,26,,83,261193,375,,,,,50,91354,83986,316,0,,,,,89984,77472,,0,559680,1718,,,,,352547,691,559680,1718 +"2020-12-14","TN",5541,4964,79,577,13206,13206,2986,62,,717,,0,,,4521318,,368,464264,421528,9959,0,,45265,,,491086,394147,,0,5012404,59539,,443112,,,,0,5012404,59539 +"2020-12-14","TX",23937,,26,,,,9304,0,,2679,,0,,,,,,1481612,1337096,8901,0,69478,74573,,,1459163,1185628,,0,12163943,134931,619088,906429,,,,0,12163943,134931 +"2020-12-14","UT",1062,,7,,9486,9486,580,65,1641,211,1225194,3779,,,1800825,585,,235872,,1968,0,,23304,,22396,232350,178395,,0,2033175,8840,,317182,,140702,1440141,5175,2033175,8840 +"2020-12-14","VA",4414,4009,3,405,16073,16073,2260,59,,458,,0,,,,,236,285149,246566,3240,0,14764,34999,,,296965,,3729013,26266,3729013,26266,175431,468468,,,,0,,0 +"2020-12-14","VI",23,,0,,,,,0,,,29572,110,,,,,,1807,,16,0,,,,,,1605,,0,31379,126,,,,,31500,124,,0 +"2020-12-14","VT",96,96,1,,,,28,0,,4,239493,1731,,,,,,5857,5712,104,0,,,,,,3603,,0,622141,4523,,,,,245205,1834,622141,4523 +"2020-12-14","WA",2879,2879,0,,12525,12525,1140,157,,248,,0,,,,,147,212885,205413,1410,0,,,,,,,3347903,27833,3347903,27833,,,,,,0,,0 +"2020-12-14","WI",4352,4068,13,284,19326,19326,1471,77,1933,319,2255994,5228,,,,,,471285,438895,2329,0,,,,,,390003,4879587,22272,4879587,22272,,,,,2694889,7350,,0 +"2020-12-14","WV",978,910,10,68,,,720,0,,199,,0,,,,,82,64394,53741,1177,0,,,,,,42340,,0,1318053,9014,23384,,,,,0,1318053,9014 +"2020-12-14","WY",321,,0,,967,967,184,11,,,151261,1725,,,405773,,,39775,34560,415,0,,,,,34425,36487,,0,440289,0,,,,,185821,2626,440289,0 +"2020-12-13","AK",176,176,0,,886,886,139,3,,,,0,,,1094215,,15,39738,,637,0,,,,,47599,,,0,1143098,9680,,,,,,0,1143098,9680 +"2020-12-13","AL",4102,3624,0,478,28146,28146,2248,0,2357,,1458560,0,,,,1351,,295631,242830,2790,0,,,,,,174805,,0,1696439,0,,,76958,,1696439,0,,0 +"2020-12-13","AR",2945,2633,34,312,9927,9927,1057,16,,370,1696581,11425,,,1696581,1091,181,185702,159123,1450,0,,,,32382,,161337,,0,1855704,12673,,,,178183,,0,1855704,12673 +"2020-12-13","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-13","AZ",7357,6779,35,578,30949,30949,3622,262,,831,2119705,20540,,,,,537,408442,392991,5853,0,,,,,,,,0,4305888,60734,,,376908,,2512696,25833,4305888,60734 +"2020-12-13","CA",20969,,122,,,,13960,0,,2937,,0,,,,,,1551766,1551766,30334,0,,,,,,,,0,27195587,309457,,,,,,0,27195587,309457 +"2020-12-13","CO",3958,3388,87,570,16126,16126,1610,34,,,1679216,9224,210100,,,,,288193,276390,2559,0,22018,,,,,,3773301,35198,3773301,35198,235108,,,,1955606,11747,,0 +"2020-12-13","CT",5363,4332,0,1031,12257,12257,1210,0,,,,0,,,3841894,,,146761,137791,0,0,,6144,,,182023,,,0,4029859,17416,,81862,,,,0,4029859,17416 +"2020-12-13","DC",715,,2,,,,225,0,,58,,0,,,,,30,24874,,231,0,,,,,,17745,778265,7351,778265,7351,,,,,329776,1909,,0 +"2020-12-13","DE",816,719,1,97,,,357,0,,55,417903,2079,,,,,,45460,43719,584,0,,,,,45648,,835861,6829,835861,6829,,,,,463363,2663,,0 +"2020-12-13","FL",20133,,84,,58891,58891,4687,141,,,6770385,29589,578113,560932,10821719,,,1107103,985938,8762,0,71851,,69600,,1438282,,13845471,103473,13845471,103473,650372,,630838,,7877488,38351,12315782,93218 +"2020-12-13","GA",10076,9205,1,871,37637,37637,3237,87,6854,,,0,,,,,,542838,476044,4798,0,39964,,,,447465,,,0,4729534,32827,380934,,,,,0,4729534,32827 +"2020-12-13","GU",118,,1,,,,29,0,,7,83030,0,,,,,5,7106,6953,16,0,17,178,,,,6413,,0,90136,16,319,3484,,,,0,89972,0 +"2020-12-13","HI",274,274,3,,1357,1357,58,0,,21,,0,,,,,17,19599,19235,87,0,,,,,19171,,736069,4851,736069,4851,,,,,,0,,0 +"2020-12-13","IA",3213,,1,,,,749,0,,170,900435,2239,,74202,1800804,,99,222148,222148,989,0,,36441,6272,34211,240688,188924,,0,1122583,3228,,676492,80514,158062,1124806,3272,2051931,7571 +"2020-12-13","ID",1169,1053,18,116,4746,4746,458,27,875,104,403247,1259,,,,,,120632,100966,1022,0,,,,,,46247,,0,504213,2143,,45753,,,504213,2143,776954,4184 +"2020-12-13","IL",15339,14291,107,1048,,,5073,0,,1080,,0,,,,,612,848904,,7216,0,,,,,,,,0,11776832,63648,,,,,,0,11776832,63648 +"2020-12-13","IN",6805,6495,47,310,30796,30796,3108,263,5441,885,1998285,11433,,,,,386,425434,,5898,0,,,,,385912,,,0,4927385,47708,,,,,2423719,17331,4927385,47708 +"2020-12-13","KS",2072,,0,,5800,5800,1068,0,1564,271,705423,0,,,,409,130,185294,,0,0,,,,,,,,0,890717,0,,,,,890717,0,,0 +"2020-12-13","KY",2207,2081,15,126,11306,11306,1711,0,2689,423,,0,,,,,199,223104,182563,2444,0,,,,,,31507,,0,2874157,0,98114,130453,,,,0,2874157,0 +"2020-12-13","LA",6818,6511,51,307,,,1533,0,,,3525588,50507,,,,,162,268613,249301,4422,0,,,,,,217930,,0,3794201,54929,,152452,,,,0,3774889,54182 +"2020-12-13","MA",11349,11098,42,251,14823,14823,1707,0,,342,3372774,17751,,,,,178,290578,279574,4853,0,,,12349,,343992,187221,,0,9567575,90256,,,135208,299450,3652348,22428,9567575,90256 +"2020-12-13","MD",5117,4954,17,163,23393,23393,1679,204,,424,2331001,15556,,147905,,,,234647,234647,2638,0,,,16775,,281931,8944,,0,5021377,51393,,,164680,,2565648,18194,5021377,51393 +"2020-12-13","ME",257,253,0,4,878,878,175,7,,46,,0,12580,,,,15,15923,13946,303,0,442,1833,,,18581,10491,,0,967147,7163,13034,43646,,,,0,967147,7163 +"2020-12-13","MI",11195,10662,0,533,,,3893,0,,863,,0,,,6876831,,518,465159,430780,0,0,,,,,547369,236369,,0,7424200,0,392309,,,,,0,7424200,0 +"2020-12-13","MN",4444,4334,85,110,19536,19536,1461,108,4228,343,2390820,12316,,,,,,378823,368534,3425,0,,,,,,341530,4734544,42785,4734544,42785,,153880,,,2759354,15490,,0 +"2020-12-13","MO",4511,,8,,,,2637,0,,604,1580771,5332,90832,,2945949,,332,345041,345041,2694,0,10135,29101,,,381112,,,0,3333657,19369,101176,229949,95172,114454,1925812,8026,3333657,19369 +"2020-12-13","MP",2,2,0,,4,4,,0,,,17206,0,,,,,,113,113,0,0,,,,,,29,,0,17319,0,,,,,17319,0,25523,0 +"2020-12-13","MS",4199,3524,19,675,7703,7703,1264,0,,298,1026300,0,,,,,178,179447,133527,1500,0,,,,,,136627,,0,1205747,1500,54191,282410,,,,0,1154216,0 +"2020-12-13","MT",818,,2,,3080,3080,365,8,,72,,0,,,,,37,73303,,659,0,,,,,,62778,,0,722308,3806,,,,,,0,722308,3806 +"2020-12-13","NC",5823,5588,27,235,,,2520,0,,606,,0,,,,,,436595,406174,6819,0,,,,,,,,0,5818033,54838,,186013,,,,0,5818033,54838 +"2020-12-13","ND",1158,,0,,2984,2984,270,0,460,41,277838,366,11242,,,,,87871,85803,281,0,1105,,,,,82935,1168660,5611,1168660,5611,12347,12232,,,363641,637,1230219,6173 +"2020-12-13","NE",1365,,22,,4784,4784,711,19,,,648028,1488,,,1378863,,,147688,,811,0,,,,,168033,80829,,0,1548615,9214,,,,,796100,2304,1548615,9214 +"2020-12-13","NH",603,,3,,861,861,251,4,289,,440503,2364,,,,,,30956,23976,712,0,,,,,,23793,,0,912917,7138,34946,35639,33957,,464479,2850,912917,7138 +"2020-12-13","NJ",17751,15883,19,1868,43834,43834,3591,122,,691,6196756,0,,,,,448,439467,400650,4711,0,,,,,,,,0,6636223,4711,,,,,,0,6587012,0 +"2020-12-13","NM",1957,,44,,7878,7878,878,46,,,,0,,,,,,119800,,1442,0,,,,,,44130,,0,1732004,12895,,,,,,0,1732004,12895 +"2020-12-13","NV",2539,,19,,,,1823,0,,416,876680,4011,,,,,240,186833,186833,2882,0,,,,,,,1829214,15459,1829214,15459,,,,,1063513,6893,,0 +"2020-12-13","NY",27785,,110,,89995,89995,5410,0,,1009,,0,,,,,567,775160,,10194,0,,,,,,,21962295,205250,21962295,205250,,,,,,0,,0 +"2020-12-13","OH",7492,6923,15,569,31973,31973,5152,170,5171,1186,,0,,,,,807,562727,515991,9266,0,,29559,,,543335,386749,,0,6869638,62739,,604242,,,,0,6869638,62739 +"2020-12-13","OK",2064,,22,,14328,14328,1664,158,,452,2110479,0,,,2110479,,,237668,,4332,0,7147,,,,235774,200512,,0,2348147,4332,101297,,,,,0,2350120,0 +"2020-12-13","OR",1150,,12,,5395,5395,625,0,,136,,0,,,2113901,,61,92839,,1419,0,,,,,128870,,,0,2242771,0,,,,,,0,2242771,0 +"2020-12-13","PA",12565,,129,,,,5970,0,,1227,3045323,20070,,,,,672,491802,450377,10684,0,,,,,,279048,6564588,73037,6564588,73037,,,,,3495700,29909,,0 +"2020-12-13","PR",1272,1029,6,243,,,620,0,,97,305972,0,,,395291,,107,62431,59842,708,0,47316,,,,20103,52771,,0,368403,708,,,,,,0,415664,0 +"2020-12-13","RI",1538,,12,,5534,5534,433,48,,47,508323,3115,,,1662402,,31,73519,,870,0,,,,,88908,,1751310,14114,1751310,14114,,,,,581842,3985,,0 +"2020-12-13","SC",4739,4387,54,352,12874,12874,1278,149,,295,2467415,60885,82854,,2395280,,129,252206,234392,3408,0,13449,33031,,,306527,126847,,0,2719621,64293,96303,297348,,,,0,2701807,67016 +"2020-12-13","SD",1259,,16,,5174,5174,436,49,,82,260818,1010,,,,,53,91038,83714,631,0,,,,,89704,77032,,0,557962,3496,,,,,351856,1641,557962,3496 +"2020-12-13","TN",5462,4902,62,560,13144,13144,2906,43,,689,,0,,,4471577,,359,454305,412568,11352,0,,43853,,,481288,390891,,0,4952865,83031,,429479,,,,0,4952865,83031 +"2020-12-13","TX",23911,,111,,,,9230,0,,2644,,0,,,,,,1472711,1328213,8349,0,68353,73141,,,1440979,1176377,,0,12029012,82689,613854,888741,,,,0,12029012,82689 +"2020-12-13","UT",1055,,17,,9421,9421,558,70,1636,215,1221415,6286,,,1793524,581,,233904,,2083,0,,23198,,22296,230811,176211,,0,2024335,14580,,316236,,140256,1434966,8412,2024335,14580 +"2020-12-13","VA",4411,4006,2,405,16014,16014,2154,47,,426,,0,,,,,220,281909,243919,3294,0,14661,34344,,,294026,,3702747,31966,3702747,31966,174786,464781,,,,0,,0 +"2020-12-13","VI",23,,0,,,,,0,,,29462,0,,,,,,1791,,0,0,,,,,,1589,,0,31253,0,,,,,31376,0,,0 +"2020-12-13","VT",95,95,0,,,,24,0,,3,237762,1547,,,,,,5753,5609,127,0,,,,,,3511,,0,617618,5306,,,,,243371,1671,617618,5306 +"2020-12-13","WA",2879,2879,0,,12368,12368,1140,131,,248,,0,,,,,131,211475,204060,2228,0,,,,,,,3320070,34134,3320070,34134,,,,,,0,,0 +"2020-12-13","WI",4339,4056,15,283,19249,19249,1448,87,1930,328,2250766,9418,,,,,,468956,436773,2965,0,,,,,,386655,4857315,36314,4857315,36314,,,,,2687539,12175,,0 +"2020-12-13","WV",968,904,2,64,,,702,0,,188,,0,,,,,79,63217,52826,1066,0,,,,,,40862,,0,1309039,13022,23321,,,,,0,1309039,13022 +"2020-12-13","WY",321,,0,,956,956,184,11,,,149536,0,,,405773,,,39360,34168,453,0,,,,,34425,35281,,0,440289,0,,,,,183195,0,440289,0 +"2020-12-12","AK",176,176,18,,883,883,146,14,,,,0,,,1085086,,18,39101,,517,0,,,,,47061,,,0,1133418,9873,,,,,,0,1133418,9873 +"2020-12-12","AL",4102,3624,16,478,28146,28146,2161,0,2356,,1458560,0,,,,1350,,292841,240535,4066,0,,,,,,174805,,0,1696439,0,,,76958,,1696439,0,,0 +"2020-12-12","AR",2911,2619,36,292,9911,9911,1071,63,,374,1685156,12988,,,1685156,1091,177,184252,157875,2628,0,,,,32114,,159827,,0,1843031,14852,,,,177317,,0,1843031,14852 +"2020-12-12","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-12","AZ",7322,6749,77,573,30687,30687,3534,385,,799,2099165,18295,,,,,515,402589,387698,8077,0,,,,,,,,0,4245154,57294,,,375676,,2486863,26042,4245154,57294 +"2020-12-12","CA",20847,,225,,,,13410,0,,2866,,0,,,,,,1521432,1521432,35729,0,,,,,,,,0,26886130,313787,,,,,,0,26886130,313787 +"2020-12-12","CO",3871,3305,25,566,16092,16092,1607,143,,,1669992,10966,210100,,,,,285634,273867,3961,0,22018,,,,,,3738103,46640,3738103,46640,232118,,,,1943859,14870,,0 +"2020-12-12","CT",5363,4332,0,1031,12257,12257,1210,0,,,,0,,,3826335,,,146761,137791,0,0,,6144,,,180190,,,0,4012443,33402,,81862,,,,0,4012443,33402 +"2020-12-12","DC",713,,4,,,,230,0,,59,,0,,,,,30,24643,,286,0,,,,,,17618,770914,8168,770914,8168,,,,,327867,3004,,0 +"2020-12-12","DE",815,718,8,97,,,348,0,,52,415824,3263,,,,,,44876,43157,1058,0,,,,,44977,,829032,9874,829032,9874,,,,,460700,4321,,0 +"2020-12-12","FL",20049,,72,,58750,58750,4509,259,,,6740796,41840,578113,560932,10741096,,,1098341,979732,10385,0,71851,,69600,,1426016,,13741998,120432,13741998,120432,650372,,630838,,7839137,52225,12222564,101779 +"2020-12-12","GA",10075,9204,44,871,37550,37550,3170,229,6847,,,0,,,,,,538040,471734,6447,0,39423,,,,442957,,,0,4696707,39508,378891,,,,,0,4696707,39508 +"2020-12-12","GU",117,,2,,,,33,0,,8,83030,0,,,,,7,7090,6953,11,0,17,178,,,,6413,,0,90120,11,319,3484,,,,0,89972,0 +"2020-12-12","HI",271,271,2,,1357,1357,58,3,,21,,0,,,,,17,19512,19148,197,0,,,,,19079,,731218,4782,731218,4782,,,,,,0,,0 +"2020-12-12","IA",3212,,15,,,,820,0,,170,898196,2303,,74136,1794468,,94,221159,221159,1245,0,,36318,6246,34082,239592,187458,,0,1119355,3548,,675159,80422,158139,1121534,3550,2044360,10886 +"2020-12-12","ID",1151,1036,15,115,4719,4719,458,48,871,104,401988,1771,,,,,,119610,100082,1582,0,,,,,,45810,,0,502070,2968,,45753,,,502070,2968,772770,6190 +"2020-12-12","IL",15232,14176,165,1056,,,5048,0,,1072,,0,,,,,627,841688,,8737,0,,,,,,,,0,11713184,126888,,,,,,0,11713184,126888 +"2020-12-12","IN",6758,6458,85,300,30533,30533,3141,407,5423,914,1986852,11487,,,,,418,419536,,7401,0,,,,,380981,,,0,4879677,60687,,,,,2406388,18888,4879677,60687 +"2020-12-12","KS",2072,,0,,5800,5800,1068,0,1564,271,705423,0,,,,409,130,185294,,0,0,,,,,,,,0,890717,0,,,,,890717,0,,0 +"2020-12-12","KY",2192,2067,24,125,11306,11306,1711,114,2689,423,,0,,,,,199,220660,180633,3540,0,,,,,,31507,,0,2874157,17730,98114,130453,,,,0,2874157,17730 +"2020-12-12","LA",6767,6465,0,302,,,1589,0,,,3475081,0,,,,,167,264191,245626,0,0,,,,,,217930,,0,3739272,0,,147092,,,,0,3720707,0 +"2020-12-12","MA",11307,11057,50,250,14823,14823,1670,0,,334,3355023,18691,,,,,170,285725,274897,5289,0,,,12349,,338478,187221,,0,9477319,99719,,,135208,296649,3629920,23659,9477319,99719 +"2020-12-12","MD",5100,4937,36,163,23189,23189,1719,180,,406,2315445,16756,,147905,,,,232009,232009,3538,0,,,16775,,278541,8938,,0,4969984,65832,,,164680,,2547454,20294,4969984,65832 +"2020-12-12","ME",257,253,7,4,871,871,182,16,,50,,0,12580,,,,16,15620,13687,414,0,442,1679,,,18205,10477,,0,959984,8584,13034,40438,,,,0,959984,8584 +"2020-12-12","MI",11195,10662,230,533,,,3893,0,,863,,0,,,6876831,,518,465159,430780,4813,0,,,,,547369,236369,,0,7424200,57647,392309,,,,,0,7424200,57647 +"2020-12-12","MN",4359,4251,67,108,19428,19428,1461,177,4213,343,2378504,13310,,,,,,375398,365360,4430,0,,,,,,335258,4691759,46554,4691759,46554,,148431,,,2743864,17394,,0 +"2020-12-12","MO",4503,,22,,,,2710,0,,644,1575439,5832,90394,,2929631,,330,342347,342347,3743,0,9870,27908,,,378092,,,0,3314288,21713,100473,208423,94566,110425,1917786,9575,3314288,21713 +"2020-12-12","MP",2,2,0,,4,4,,0,,,17206,0,,,,,,113,113,0,0,,,,,,29,,0,17319,0,,,,,17319,0,25523,0 +"2020-12-12","MS",4180,3519,56,661,7703,7703,1264,0,,298,1026300,0,,,,,178,177947,132930,2665,0,,,,,,136627,,0,1204247,2665,54191,282410,,,,0,1154216,0 +"2020-12-12","MT",816,,11,,3072,3072,365,33,,69,,0,,,,,36,72644,,774,0,,,,,,61877,,0,718502,6768,,,,,,0,718502,6768 +"2020-12-12","NC",5796,5564,44,232,,,2577,0,,610,,0,,,,,,429776,399981,6153,0,,,,,,,,0,5763195,59779,,182850,,,,0,5763195,59779 +"2020-12-12","ND",1158,,22,,2984,2984,282,0,460,41,277472,715,11242,,,,,87590,85532,376,0,1105,,,,,82360,1163049,6038,1163049,6038,12347,12078,,,363004,1041,1224046,6455 +"2020-12-12","NE",1343,,14,,4765,4765,759,31,,,646540,3221,,,1370628,,,146877,,1103,0,,,,,167059,78906,,0,1539401,15056,,,,,793796,4327,1539401,15056 +"2020-12-12","NH",600,,10,,857,857,247,1,287,,438139,2692,,,,,,30244,23490,784,0,,,,,,23046,,0,905779,7294,34875,35182,33897,,461629,3194,905779,7294 +"2020-12-12","NJ",17732,15864,70,1868,43712,43712,3543,250,,690,6196756,0,,,,,438,434756,396496,6888,0,,,,,,,,0,6631512,6888,,,,,,0,6587012,0 +"2020-12-12","NM",1913,,24,,7832,7832,907,95,,,,0,,,,,,118358,,1793,0,,,,,,43091,,0,1719109,12069,,,,,,0,1719109,12069 +"2020-12-12","NV",2520,,41,,,,1823,0,,416,872669,5127,,,,,240,183951,183951,2641,0,,,,,,,1813755,18322,1813755,18322,,,,,1056620,7768,,0 +"2020-12-12","NY",27675,,88,,89995,89995,5359,0,,1029,,0,,,,,563,764966,,11129,0,,,,,,,21757045,242927,21757045,242927,,,,,,0,,0 +"2020-12-12","OH",7477,6911,51,566,31803,31803,5076,267,5151,1167,,0,,,,,760,553461,507325,11252,0,,28564,,,534553,380578,,0,6806899,64929,,584842,,,,0,6806899,64929 +"2020-12-12","OK",2042,,35,,14170,14170,1664,198,,452,2110479,19113,,,2110479,,,233336,,3983,0,7147,,,,235774,198154,,0,2343815,23096,101297,,,,,0,2350120,22081 +"2020-12-12","OR",1138,,15,,5395,5395,625,94,,136,,0,,,2113901,,61,91420,,1582,0,,,,,128870,,,0,2242771,26244,,,,,,0,2242771,26244 +"2020-12-12","PA",12436,,201,,,,5940,0,,1209,3025253,15743,,,,,675,481118,440538,11084,0,,,,,,279048,6491551,66985,6491551,66985,,,,,3465791,24258,,0 +"2020-12-12","PR",1266,1023,17,243,,,646,0,,104,305972,0,,,395291,,118,61723,59292,721,0,46762,,,,20103,52394,,0,367695,721,,,,,,0,415664,0 +"2020-12-12","RI",1526,,17,,5486,5486,440,198,,55,505208,2337,,,1649379,,32,72649,,1831,0,,,,,87817,,1737196,19629,1737196,19629,,,,,577857,4168,,0 +"2020-12-12","SC",4685,4344,12,341,12725,12725,1250,0,,294,2406530,0,81693,,2336567,,122,248798,231363,3572,0,12970,31411,,,298224,124586,,0,2655328,3572,94663,281579,,,,0,2634791,0 +"2020-12-12","SD",1243,,33,,5125,5125,452,39,,89,259808,1111,,,,,58,90407,83225,735,0,,,,,89172,76247,,0,554466,3587,,,,,350215,1846,554466,3587 +"2020-12-12","TN",5400,4849,73,551,13101,13101,2919,62,,705,,0,,,4399299,,356,442953,402790,6691,0,,42140,,,470535,387395,,0,4869834,11900,,411435,,,,0,4869834,11900 +"2020-12-12","TX",23800,,249,,,,9192,0,,2642,,0,,,,,,1464362,1321578,16360,0,67899,71381,,,1430692,1167975,,0,11946323,325,611326,863974,,,,0,11946323,325 +"2020-12-12","UT",1038,,13,,9351,9351,562,82,1630,211,1215129,7205,,,1781284,580,,231821,,3692,0,,22925,,22031,228471,172960,,0,2009755,17966,,313025,,139000,1426554,9811,2009755,17966 +"2020-12-12","VA",4409,4005,39,404,15967,15967,2117,103,,440,,0,,,,,229,278615,241397,4177,0,14450,33645,,,290122,,3670781,36289,3670781,36289,173585,460725,,,,0,,0 +"2020-12-12","VI",23,,0,,,,,0,,,29462,715,,,,,,1791,,58,0,,,,,,1589,,0,31253,773,,,,,31376,791,,0 +"2020-12-12","VT",95,95,2,,,,23,0,,2,236215,1139,,,,,,5626,5485,85,0,,,,,,3420,,0,612312,3900,,,,,241700,1225,612312,3900 +"2020-12-12","WA",2879,2879,29,,12237,12237,1140,153,,248,,0,,,,,133,209247,202000,2421,0,,,,,,,3285936,29098,3285936,29098,,,,,,0,,0 +"2020-12-12","WI",4324,4041,58,283,19162,19162,1448,142,1928,328,2241348,9583,,,,,,465991,434016,4624,0,,,,,,381633,4821001,43457,4821001,43457,,,,,2675364,13642,,0 +"2020-12-12","WV",966,903,28,63,,,697,0,,190,,0,,,,,83,62151,52020,1514,0,,,,,,40862,,0,1296017,15897,23052,,,,,0,1296017,15897 +"2020-12-12","WY",321,,0,,945,945,187,3,,,149536,0,,,405773,,,38907,33757,122,0,,,,,34425,35165,,0,440289,3229,,,,,183195,0,440289,3229 +"2020-12-11","AK",158,158,3,,869,869,146,9,,,,0,,,1075703,,17,38584,,622,0,,,,,46586,,,0,1123545,10185,,,,,,0,1123545,10185 +"2020-12-11","AL",4086,3612,52,474,28146,28146,2111,528,2351,,1458560,9190,,,,1349,,288775,237879,3853,0,,,,,,174805,,0,1696439,12077,,,76958,,1696439,12077,,0 +"2020-12-11","AR",2875,2588,55,287,9848,9848,1059,139,,372,1672168,13243,,,1672168,1089,185,181624,156011,2770,0,,,,31180,,158018,,0,1828179,15181,,,,173190,,0,1828179,15181 +"2020-12-11","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-11","AZ",7245,6689,91,556,30302,30302,3482,967,,809,2080870,16588,,,,,508,394512,379951,6983,0,,,,,,,,0,4187860,51785,,,374754,,2460821,23112,4187860,51785 +"2020-12-11","CA",20622,,159,,,,12940,0,,2773,,0,,,,,,1485703,1485703,35468,0,,,,,,,,0,26572343,248011,,,,,,0,26572343,248011 +"2020-12-11","CO",3846,3283,87,563,15949,15949,1675,293,,,1659026,9726,207064,,,,,281673,269963,4678,0,21310,,,,,,3691463,48945,3691463,48945,228374,,,,1928989,14186,,0 +"2020-12-11","CT",5363,4332,36,1031,12257,12257,1210,0,,,,0,,,3795767,,,146761,137791,3782,0,,6144,,,177423,,,0,3979041,36884,,81862,,,,0,3979041,36884 +"2020-12-11","DC",709,,1,,,,224,0,,58,,0,,,,,30,24357,,259,0,,,,,,17493,762746,4913,762746,4913,,,,,324863,1377,,0 +"2020-12-11","DE",807,710,1,97,,,363,0,,49,412561,2160,,,,,,43818,42152,782,0,,,,,44107,,819158,8820,819158,8820,,,,,456379,2942,,0 +"2020-12-11","FL",19977,,126,,58491,58491,4624,265,,,6698956,43768,578113,560932,10653469,,,1087956,972410,11409,0,71851,,69600,,1412194,,13621566,131102,13621566,131102,650372,,630838,,7786912,55177,12120785,114094 +"2020-12-11","GA",10031,9175,56,856,37321,37321,3199,304,6832,,,0,,,,,,531593,466904,6191,0,38931,,,,438301,,,0,4657199,35358,377015,,,,,0,4657199,35358 +"2020-12-11","GU",115,,0,,,,36,0,,10,83030,388,,,,,7,7079,6942,27,0,17,178,,,,6413,,0,90109,415,319,3484,,,,0,89972,415 +"2020-12-11","HI",269,269,1,,1354,1354,48,10,,19,,0,,,,,14,19315,18951,136,0,,,,,18904,,726436,4781,726436,4781,,,,,,0,,0 +"2020-12-11","IA",3197,,77,,,,833,0,,175,895893,2330,,73817,1785001,,97,219914,219914,1537,0,,35889,5990,33673,238221,183216,,0,1115807,3867,,662415,79847,156926,1117984,3849,2033474,11919 +"2020-12-11","ID",1136,1023,33,113,4671,4671,455,66,862,93,400217,1929,,,,,,118028,98885,1825,0,,,,,,45303,,0,499102,3364,,45753,,,499102,3364,766580,6265 +"2020-12-11","IL",15067,14050,222,1017,,,5141,0,,1081,,0,,,,,635,832951,,9420,0,,,,,,,,0,11586296,104448,,,,,,0,11586296,104448 +"2020-12-11","IN",6673,6373,70,300,30126,30126,3204,383,5353,939,1975365,11119,,,,,416,412135,,7200,0,,,,,374187,,,0,4818990,56097,,,,,2387500,18319,4818990,56097 +"2020-12-11","KS",2072,,131,,5800,5800,1068,146,1564,271,705423,9174,,,,409,130,185294,,5491,0,,,,,,,,0,890717,14665,,,,,890717,14665,,0 +"2020-12-11","KY",2168,2052,22,116,11192,11192,1717,134,2670,432,,0,,,,,253,217120,178047,3670,0,,,,,,31087,,0,2856427,16205,97869,128344,,,,0,2856427,16205 +"2020-12-11","LA",6767,6465,43,302,,,1589,0,,,3475081,31545,,,,,167,264191,245626,2862,0,,,,,,217930,,0,3739272,34407,,147092,,,,0,3720707,33736 +"2020-12-11","MA",11257,11010,48,247,14823,14823,1605,0,,309,3336332,20945,,,,,165,280436,269929,5655,0,,,12349,,332659,187221,,0,9377600,99181,,,135208,293014,3606261,26420,9377600,99181 +"2020-12-11","MD",5064,4901,52,163,23009,23009,1729,176,,416,2298689,14338,,147905,,,,228471,228471,2616,0,,,16775,,274107,8910,,0,4904152,48197,,,164680,,2527160,16954,4904152,48197 +"2020-12-11","ME",250,247,4,3,855,855,182,21,,50,,0,12580,,,,16,15206,13332,345,0,442,1668,,,17901,10444,,0,951400,10210,13034,40282,,,,0,951400,10210 +"2020-12-11","MI",10965,10456,65,509,,,3893,0,,863,,0,,,6825002,,518,460346,426294,5626,0,,,,,541551,197750,,0,7366553,59768,390240,,,,,0,7366553,59768 +"2020-12-11","MN",4292,4186,94,106,19251,19251,1461,222,4188,343,2365194,14572,,,,,,370968,361276,3750,0,,,,,,327509,4645205,53097,4645205,53097,,144624,,,2726470,18039,,0 +"2020-12-11","MO",4481,,31,,,,2795,0,,650,1569607,5558,90002,,2912045,,350,338604,338604,3900,0,9671,26250,,,374017,,,0,3292575,22893,99882,183575,94078,104178,1908211,9458,3292575,22893 +"2020-12-11","MP",2,2,0,,4,4,,0,,,17206,0,,,,,,113,113,0,0,,,,,,29,,0,17319,0,,,,,17319,0,25523,0 +"2020-12-11","MS",4124,3493,41,631,7703,7703,1267,0,,295,1026300,0,,,,,177,175282,131924,2327,0,,,,,,136627,,0,1201582,2327,54191,282410,,,,0,1154216,0 +"2020-12-11","MT",805,,24,,3039,3039,372,36,,69,,0,,,,,36,71870,,978,0,,,,,,61093,,0,711734,9209,,,,,,0,711734,9209 +"2020-12-11","NC",5752,5528,38,224,,,2514,0,,583,,0,,,,,,423623,394742,7540,0,,,,,,,,0,5703416,63501,,175843,,,,0,5703416,63501 +"2020-12-11","ND",1136,,27,,2984,2984,277,0,460,41,276757,727,11242,,,,,87214,85207,507,0,1105,,,,,81678,1157011,8005,1157011,8005,12347,10778,,,361963,1198,1217591,8625 +"2020-12-11","NE",1329,,35,,4734,4734,779,35,,,643319,3546,,,1357312,,,145774,,1850,0,,,,,165348,76908,,0,1524345,19052,,,,,789469,5397,1524345,19052 +"2020-12-11","NH",590,,6,,856,856,258,4,287,,435447,3652,,,,,,29460,22988,1187,0,,,,,,22046,,0,898485,9556,34777,34315,33811,,458435,4548,898485,9556 +"2020-12-11","NJ",17662,15794,54,1868,43462,43462,3571,203,,687,6196756,45607,,,,,421,427868,390256,4335,0,,,,,,,,0,6624624,49942,,,,,,0,6587012,49257 +"2020-12-11","NM",1889,,43,,7737,7737,932,101,,,,0,,,,,,116565,,1834,0,,,,,,42415,,0,1707040,14364,,,,,,0,1707040,14364 +"2020-12-11","NV",2479,,45,,,,1854,0,,394,867542,223,,,,,239,181310,181310,2783,0,,,,,,,1795433,7571,1795433,7571,,,,,1048852,3006,,0 +"2020-12-11","NY",27587,,89,,89995,89995,5321,0,,1007,,0,,,,,546,753837,,10595,0,,,,,,,21514118,212672,21514118,212672,,,,,,0,,0 +"2020-12-11","OH",7426,6864,128,562,31536,31536,5091,394,5134,1207,,0,,,,,767,542209,497565,10359,0,,27645,,,525237,370932,,0,6741970,65391,,568597,,,,0,6741970,65391 +"2020-12-11","OK",2007,,27,,13972,13972,1730,190,,456,2091366,19198,,,2091366,,,229353,,3900,0,7147,,,,232890,195643,,0,2320719,23098,101297,,,,,0,2328039,23303 +"2020-12-11","OR",1123,,13,,5301,5301,618,61,,138,,0,,,2089471,,60,89838,,1551,0,,,,,127056,,,0,2216527,22705,,,,,,0,2216527,22705 +"2020-12-11","PA",12235,,225,,,,5668,0,,1151,3009510,16003,,,,,651,470034,432023,12745,0,,,,,,272619,6424566,63716,6424566,63716,,,,,3441533,25987,,0 +"2020-12-11","PR",1249,1008,11,241,,,649,0,,109,305972,0,,,395291,,111,61002,58629,1544,0,45864,,,,20103,51895,,0,366974,1544,,,,,,0,415664,0 +"2020-12-11","RI",1509,,11,,5288,5288,466,0,,48,502871,3914,,,1631487,,25,70818,,1571,0,,,,,86080,,1717567,22765,1717567,22765,,,,,573689,5485,,0 +"2020-12-11","SC",4673,4332,46,341,12725,12725,1234,107,,282,2406530,33980,81693,,2336567,,124,245226,228261,3540,0,12970,31411,,,298224,124586,,0,2651756,37520,94663,281579,,,,0,2634791,37188 +"2020-12-11","SD",1210,,33,,5086,5086,467,61,,91,258697,1224,,,,,55,89672,82606,945,0,,,,,88547,72840,,0,550879,4321,,,,,348369,2169,550879,4321 +"2020-12-11","TN",5327,4787,87,540,13039,13039,2890,87,,710,,0,,,4393453,,342,436262,397443,7289,0,,40755,,,464481,383478,,0,4857934,53860,,399247,,,,0,4857934,53860 +"2020-12-11","TX",23551,,226,,,,9109,0,,2604,,0,,,,,,1448002,1307878,14451,0,66200,71365,,,1430675,1157334,,0,11945998,6683,606668,863863,,,,0,11945998,6683 +"2020-12-11","UT",1025,,9,,9269,9269,586,82,1620,213,1207924,5897,,,1766161,577,,228129,,2183,0,,22201,,21343,225628,169622,,0,1991789,14986,,299867,,134195,1416743,8151,1991789,14986 +"2020-12-11","VA",4370,3973,35,397,15864,15864,2115,141,,427,,0,,,,,216,274438,238281,3395,0,14230,32581,,,285871,,3634492,33751,3634492,33751,172142,450597,,,,0,,0 +"2020-12-11","VI",23,,0,,,,,0,,,28747,0,,,,,,1733,,0,0,,,,,,1544,,0,30480,0,,,,,30585,0,,0 +"2020-12-11","VT",93,93,4,,,,26,0,,5,235076,1836,,,,,,5541,5399,128,0,,,,,,3322,,0,608412,6783,,,,,240475,1965,608412,6783 +"2020-12-11","WA",2850,2850,-166,,12084,12084,1166,88,,262,,0,,,,,133,206826,199729,2557,0,,,,,,,3256838,31410,3256838,31410,,,,,,0,,0 +"2020-12-11","WI",4266,3991,57,275,19020,19020,1448,145,1916,328,2231765,7187,,,,,,461367,429957,4478,0,,,,,,375627,4777544,31888,4777544,31888,,,,,2661722,11045,,0 +"2020-12-11","WV",938,885,17,53,,,697,0,,193,,0,,,,,77,60637,50804,942,0,,,,,,39728,,0,1280120,18033,22772,,,,,0,1280120,18033 +"2020-12-11","WY",321,,22,,942,942,207,13,,,149536,874,,,402871,,,38785,33659,562,0,,,,,34098,35080,,0,437060,0,,,,,183195,1330,437060,0 +"2020-12-10","AK",155,155,5,,860,860,164,13,,,,0,,,1066119,,17,37962,,620,0,,,,,45990,,,0,1113360,13805,,,,,,0,1113360,13805 +"2020-12-10","AL",4034,3569,49,465,27618,27618,2170,0,2342,,1449370,7745,,,,1341,,284922,234992,4735,0,,,,,,174805,,0,1684362,11198,,,76322,,1684362,11198,,0 +"2020-12-10","AR",2820,2559,34,261,9709,9709,1005,34,,372,1658925,11260,,,1658925,1071,181,178854,154073,2202,0,,,,30172,,156286,,0,1812998,12964,,,,169319,,0,1812998,12964 +"2020-12-10","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-10","AZ",7154,6610,73,544,29335,29335,3408,455,,799,2064282,14051,,,,,496,387529,373427,4928,0,,,,,,,,0,4136075,44258,,,373868,,2437709,18329,4136075,44258 +"2020-12-10","CA",20463,,220,,,,12477,0,,2710,,0,,,,,,1450235,1450235,29677,0,,,,,,,,0,26324332,282261,,,,,,0,26324332,282261 +"2020-12-10","CO",3759,3210,120,549,15656,15656,1659,136,,,1649300,10740,198799,,,,,276995,265503,4649,0,19580,,,,,,3642518,50721,3642518,50721,223852,,,,1914803,15233,,0 +"2020-12-10","CT",5327,4303,42,1024,12257,12257,1214,0,,,,0,,,3761642,,,142979,134286,2431,0,,5786,,,174750,,,0,3942157,41880,,77245,,,,0,3942157,41880 +"2020-12-10","DC",708,,4,,,,217,0,,57,,0,,,,,26,24098,,244,0,,,,,,17291,757833,5326,757833,5326,,,,,323486,1506,,0 +"2020-12-10","DE",806,709,3,97,,,349,0,,44,410401,2008,,,,,,43036,41392,643,0,,,,,43331,,810338,8158,810338,8158,,,,,453437,2651,,0 +"2020-12-10","FL",19851,,135,,58226,58226,4553,269,,,6655188,48767,578113,560932,10554421,,,1076547,964381,11071,0,71851,,69600,,1397473,,13490464,127033,13490464,127033,650372,,630838,,7731735,59838,12006691,109505 +"2020-12-10","GA",9975,9123,54,852,37017,37017,3088,277,6790,,,0,,,,,,525402,462175,7623,0,38451,,,,434079,,,0,4621841,43717,375182,,,,,0,4621841,43717 +"2020-12-10","GU",115,,2,,,,33,0,,10,82642,486,,,,,8,7052,6915,13,0,12,153,,,,6382,,0,89694,499,315,3456,,,,0,89557,499 +"2020-12-10","HI",268,268,2,,1344,1344,51,11,,18,,0,,,,,14,19179,18864,123,0,,,,,18825,,721655,6987,721655,6987,,,,,,0,,0 +"2020-12-10","IA",3120,,99,,,,863,0,,189,893563,2770,,73552,1774745,,114,218377,218377,1683,0,,35178,5806,32994,236590,177803,,0,1111940,4453,,647094,79398,154822,1114135,4454,2021555,12895 +"2020-12-10","ID",1103,1006,29,97,4605,4605,455,66,854,93,398288,1566,,,,,,116203,97450,2298,0,,,,,,44811,,0,495738,3473,,45253,,,495738,3473,760315,5897 +"2020-12-10","IL",14845,13861,232,984,,,5138,0,,1081,,0,,,,,606,823531,,11101,0,,,,,,,,0,11481848,114503,,,,,,0,11481848,114503 +"2020-12-10","IN",6603,6302,97,301,29743,29743,3221,331,5275,949,1964246,9809,,,,,410,404935,,6518,0,,,,,367427,,,0,4762893,55927,,,,,2369181,16327,4762893,55927 +"2020-12-10","KS",1941,,0,,5654,5654,1109,0,1527,301,696249,0,,,,409,136,179803,,0,0,,,,,,,,0,876052,0,,,,,876052,0,,0 +"2020-12-10","KY",2146,2039,28,107,11058,11058,1756,72,2646,442,,0,,,,,231,213450,175271,4314,0,,,,,,30605,,0,2840222,47901,97576,127035,,,,0,2840222,47901 +"2020-12-10","LA",6724,6426,40,298,,,1529,0,,,3443536,22542,,,,,180,261329,243435,2415,0,,,,,,217930,,0,3704865,24957,,142606,,,,0,3686971,24629 +"2020-12-10","MA",11209,10963,43,246,14823,14823,1607,426,,307,3315387,18354,,,,,168,274781,264454,5369,0,,,12349,,326430,187221,,0,9278419,97353,,,135208,290670,3579841,23484,9278419,97353 +"2020-12-10","MD",5012,4850,50,162,22833,22833,1720,211,,416,2284351,16766,,147905,,,,225855,225855,3202,0,,,16775,,270854,8878,,0,4855955,49110,,,164680,,2510206,19968,4855955,49110 +"2020-12-10","ME",246,244,0,2,834,834,172,15,,45,,0,12540,,,,16,14861,13033,407,0,437,1572,,,17471,10394,,0,941190,10138,12989,38279,,,,0,941190,10138 +"2020-12-10","MI",10900,10395,194,505,,,3893,0,,863,,0,,,6772279,,518,454720,421137,6302,0,,,,,534506,197750,,0,7306785,60320,388121,,,,,0,7306785,60320 +"2020-12-10","MN",4198,4096,89,102,19029,19029,1542,220,4145,352,2350622,10197,,,,,,367218,357809,3499,0,,,,,,324304,4592108,38303,4592108,38303,,139611,,,2708431,13416,,0 +"2020-12-10","MO",4450,,67,,,,2641,0,,650,1564049,7361,89616,,2893395,,343,334704,334704,3858,0,9486,25485,,,369810,,,0,3269682,25284,99311,172550,93599,100197,1898753,11219,3269682,25284 +"2020-12-10","MP",2,2,0,,4,4,,0,,,17206,0,,,,,,113,113,0,0,,,,,,29,,0,17319,0,,,,,17319,0,25523,0 +"2020-12-10","MS",4083,3470,42,613,7703,7703,1286,0,,301,1026300,0,,,,,170,172955,130804,2283,0,,,,,,136627,,0,1199255,2283,54191,282410,,,,0,1154216,0 +"2020-12-10","MT",781,,10,,3003,3003,488,40,,76,,0,,,,,37,70892,,759,0,,,,,,52994,,0,702525,3057,,,,,,0,702525,3057 +"2020-12-10","NC",5714,5497,53,217,,,2444,0,,573,,0,,,,,,416083,388106,5556,0,,,,,,,,0,5639915,52359,,168721,,,,0,5639915,52359 +"2020-12-10","ND",1109,,23,,2984,2984,302,0,460,41,276030,821,11242,,,,,86707,84735,558,0,1105,,,,,81008,1149006,8311,1149006,8311,12347,10020,,,360765,1328,1208966,9033 +"2020-12-10","NE",1294,,17,,4699,4699,781,35,,,639773,1903,,,1340385,,,143924,,1321,0,,,,,163231,74597,,0,1505293,13854,,,,,784072,3230,1505293,13854 +"2020-12-10","NH",584,,14,,852,852,248,1,284,,431795,3529,,,,,,28273,22092,681,0,,,,,,21386,,0,888929,7985,34710,33504,33752,,453887,3894,888929,7985 +"2020-12-10","NJ",17608,15740,66,1868,43259,43259,3545,184,,644,6151149,44110,,,,,412,423533,386606,5800,0,,,,,,,,0,6574682,49910,,,,,,0,6537755,49230 +"2020-12-10","NM",1846,,23,,7636,7636,916,39,,,,0,,,,,,114731,,1781,0,,,,,,41177,,0,1692676,23164,,,,,,0,1692676,23164 +"2020-12-10","NV",2434,,50,,,,1824,0,,382,867319,3711,,,,,246,178527,178527,2193,0,,,,,,,1787862,14461,1787862,14461,,,,,1045846,5904,,0 +"2020-12-10","NY",27498,,94,,89995,89995,5164,0,,994,,0,,,,,539,743242,,10178,0,,,,,,,21301446,197406,21301446,197406,,,,,,0,,0 +"2020-12-10","OH",7298,6772,111,526,31142,31142,5110,452,5090,1193,,0,,,,,760,531850,489078,11738,0,,26783,,,515452,361308,,0,6676579,63492,,557180,,,,0,6676579,63492 +"2020-12-10","OK",1980,,35,,13782,13782,1709,146,,459,2072168,16250,,,2072168,,,225453,,2460,0,6539,,,,229256,194229,,0,2297621,18710,98949,,,,,0,2304736,18867 +"2020-12-10","OR",1110,,30,,5240,5240,642,176,,139,,0,,,2068392,,62,88287,,1205,0,,,,,125430,,,0,2193822,18662,,,,,,0,2193822,18662 +"2020-12-10","PA",12010,,248,,,,5877,0,,1218,2993507,20913,,,,,675,457289,422039,11972,0,,,,,,265227,6360850,74669,6360850,74669,,,,,3415546,31979,,0 +"2020-12-10","PR",1238,996,19,242,,,657,0,,99,305972,0,,,395291,,106,59458,57096,496,0,44667,,,,20103,51179,,0,365430,496,,,,,,0,415664,0 +"2020-12-10","RI",1498,,14,,5288,5288,466,72,,48,498957,1227,,,1610610,,25,69247,,948,0,,,,,84192,,1694802,13473,1694802,13473,,,,,568204,2175,,0 +"2020-12-10","SC",4627,4291,15,336,12618,12618,1232,91,,292,2372550,15213,81200,,2303417,,124,241686,225053,2242,0,12780,30676,,,294186,123503,,0,2614236,17455,93980,274284,,,,0,2597603,17126 +"2020-12-10","SD",1177,,30,,5025,5025,491,51,,92,257473,1024,,,,,55,88727,81835,704,0,,,,,87732,71316,,0,546558,1670,,,,,346200,1728,546558,1670 +"2020-12-10","TN",5240,4722,69,518,12952,12952,2851,90,,684,,0,,,4346546,,349,428973,391133,6011,0,,39718,,,457528,382444,,0,4804074,30850,,392041,,,,0,4804074,30850 +"2020-12-10","TX",23325,,244,,,,9045,0,,2644,,0,,,,,,1433551,1296132,15299,0,66200,71236,,,1430071,1074579,,0,11939315,36008,601686,862971,,,,0,11939315,36008 +"2020-12-10","UT",1016,,21,,9187,9187,568,82,1604,220,1202027,6679,,,1753678,573,,225946,,3401,0,,21680,,20837,223125,165042,,0,1976803,16912,,293750,,131011,1408592,9541,1976803,16912 +"2020-12-10","VA",4335,3940,54,395,15723,15723,2051,131,,415,,0,,,,,203,271043,235720,3915,0,14054,31451,,,282215,,3600741,27442,3600741,27442,170832,437010,,,,0,,0 +"2020-12-10","VI",23,,0,,,,,0,,,28747,241,,,,,,1733,,35,0,,,,,,1544,,0,30480,276,,,,,30585,272,,0 +"2020-12-10","VT",89,89,3,,,,23,0,,2,233240,1897,,,,,,5413,5270,128,0,,,,,,3226,,0,601629,7978,,,,,238510,2024,601629,7978 +"2020-12-10","WA",3016,3016,49,,11996,11996,1177,155,,294,,0,,,,,144,204269,197334,2977,0,,,,,,,3225428,28378,3225428,28378,,,,,,0,,0 +"2020-12-10","WI",4209,3944,67,265,18875,18875,1484,160,1902,332,2224578,8521,,,,,,456889,426099,4709,0,,,,,,369821,4745656,37247,4745656,37247,,,,,2650677,12555,,0 +"2020-12-10","WV",921,868,20,53,,,679,0,,184,,0,,,,,73,59695,50016,1233,0,,,,,,38614,,0,1262087,14914,22309,,,,,0,1262087,14914 +"2020-12-10","WY",299,,0,,929,929,206,9,,,148662,1128,,,402871,,,38223,33203,338,0,,,,,34098,33891,,0,437060,5627,,,,,181865,1442,437060,5627 +"2020-12-09","AK",150,150,4,,847,847,165,20,,,,0,,,1053252,,19,37342,,584,0,,,,,45071,,,0,1099555,10577,,,,,,0,1099555,10577 +"2020-12-09","AL",3985,3525,43,460,27618,27618,2111,295,2321,,1441625,6542,,,,1329,,280187,231539,3522,0,,,,,,174805,,0,1673164,9074,,,75780,,1673164,9074,,0 +"2020-12-09","AR",2786,2552,34,234,9675,9675,1064,98,,375,1647665,14779,,,1647665,1068,179,176652,152369,2327,0,,,,29539,,155077,,0,1800034,16536,,,,167609,,0,1800034,16536 +"2020-12-09","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-09","AZ",7081,6551,108,530,28880,28880,3287,355,,766,2050231,7328,,,,,492,382601,369149,4444,0,,,,,,,,0,4091817,26478,,,373202,,2419380,11339,4091817,26478 +"2020-12-09","CA",20243,,196,,,,11965,0,,2627,,0,,,,,,1420558,1420558,30851,0,,,,,,,,0,26042071,252296,,,,,,0,26042071,252296 +"2020-12-09","CO",3639,3100,267,539,15520,15520,1684,563,,,1638560,7832,197968,,,,,272346,261010,3757,0,19292,,,,,,3591797,40346,3591797,40346,218379,,,,1899570,11560,,0 +"2020-12-09","CT",5285,4264,43,1021,12257,12257,1262,0,,,,0,,,3722683,,,140548,131886,2290,0,,5708,,,171929,,,0,3900277,40428,,75093,,,,0,3900277,40428 +"2020-12-09","DC",704,,3,,,,203,0,,58,,0,,,,,23,23854,,265,0,,,,,,17081,752507,6876,752507,6876,,,,,321980,995,,0 +"2020-12-09","DE",803,707,0,96,,,348,0,,42,408393,2419,,,,,,42393,40783,929,0,,,,,42638,,802180,5841,802180,5841,,,,,450786,3348,,0 +"2020-12-09","FL",19716,,89,,57957,57957,4559,310,,,6606421,38060,578113,560932,10460024,,,1065476,957017,9411,0,71851,,69600,,1382676,,13363431,97815,13363431,97815,650372,,630838,,7671897,47471,11897186,82934 +"2020-12-09","GA",9921,9073,48,848,36740,36740,3066,279,6756,,,0,,,,,,517779,456113,5512,0,38123,,,,427970,,,0,4578124,22681,373866,,,,,0,4578124,22681 +"2020-12-09","GU",113,,0,,,,37,0,,10,82156,568,,,,,8,7039,6902,13,0,12,153,,,,6332,,0,89195,581,314,3439,,,,0,89058,580 +"2020-12-09","HI",266,266,4,,1333,1333,47,6,,16,,0,,,,,11,19056,18741,80,0,,,,,18687,,714668,3852,714668,3852,,,,,,0,,0 +"2020-12-09","IA",3021,,102,,,,894,0,,196,890793,2953,,73318,1763766,,120,216694,216694,1797,0,,34767,5635,32596,234720,173440,,0,1107487,4750,,638561,78993,153581,1109681,4733,2008660,14473 +"2020-12-09","ID",1074,982,19,92,4539,4539,455,91,846,93,396722,-4236,,,,,,113905,95543,2012,0,,,,,,44314,,0,492265,-2649,,45253,,,492265,-2649,754418,3766 +"2020-12-09","IL",14613,13666,229,947,,,5284,0,,1176,,0,,,,,647,812430,,8256,0,,,,,,,,0,11367345,92737,,,,,,0,11367345,92737 +"2020-12-09","IN",6506,6207,96,299,29412,29412,3244,383,5238,949,1954437,8792,,,,,414,398417,,5754,0,,,,,361752,,,0,4706966,50139,,,,,2352854,14546,4706966,50139 +"2020-12-09","KS",1941,,85,,5654,5654,1109,145,1527,301,696249,8950,,,,409,136,179803,,5778,0,,,,,,,,0,876052,14728,,,,,876052,14728,,0 +"2020-12-09","KY",2118,2014,16,104,10986,10986,1792,146,2640,412,,0,,,,,211,209136,172075,3468,0,,,,,,30540,,0,2792321,5942,97299,125452,,,,0,2792321,5942 +"2020-12-09","LA",6684,6393,32,291,,,1537,0,,,3420994,28170,,,,,177,258914,241348,4352,0,,,,,,217930,,0,3679908,32522,,139641,,,,0,3662342,30842 +"2020-12-09","MA",11166,10922,90,244,14397,14397,1576,0,,308,3297033,20316,,,,,162,269412,259324,5965,0,,,12193,,320562,169809,,0,9181066,109009,,,133429,287469,3556357,25991,9181066,109009 +"2020-12-09","MD",4962,4801,46,161,22622,22622,1715,201,,416,2267585,13071,,147905,,,,222653,222653,2692,0,,,16775,,267020,8833,,0,4806845,36013,,,164680,,2490238,15763,4806845,36013 +"2020-12-09","ME",246,244,7,2,819,819,173,16,,42,,0,12521,,,,15,14454,12678,405,0,433,1483,,,17009,10338,,0,931052,8462,12966,36378,,,,0,931052,8462 +"2020-12-09","MI",10706,10213,81,493,,,3925,0,,857,,0,,,6718491,,522,448418,415200,5342,0,,,,,527974,197750,,0,7246465,48099,385279,,,,,0,7246465,48099 +"2020-12-09","MN",4109,4011,82,98,18809,18809,1545,215,4106,358,2340425,11617,,,,,,363719,354590,4516,0,,,,,,320233,4553805,34754,4553805,34754,,136408,,,2695015,15794,,0 +"2020-12-09","MO",4383,,28,,,,2579,0,,638,1556688,3393,89188,,2872385,,334,330846,330846,2640,0,9323,24491,,,365582,,,0,3244398,14268,98720,163672,93086,95240,1887534,6033,3244398,14268 +"2020-12-09","MP",2,2,0,,4,4,,0,,,17206,196,,,,,,113,113,2,0,,,,,,29,,0,17319,198,,,,,17319,203,25523,882 +"2020-12-09","MS",4041,3452,24,589,7703,7703,1241,0,,288,1026300,0,,,,,159,170672,129836,2746,0,,,,,,136627,,0,1196972,2746,54191,282410,,,,0,1154216,0 +"2020-12-09","MT",771,,8,,2963,2963,490,54,,80,,0,,,,,39,70133,,787,0,,,,,,52068,,0,699468,2590,,,,,,0,699468,2590 +"2020-12-09","NC",5661,5453,56,208,,,2440,0,,577,,0,,,,,,410527,383408,6495,0,,,,,,,,0,5587556,40561,,163371,,,,0,5587556,40561 +"2020-12-09","ND",1086,,16,,2984,2984,284,88,460,41,275209,272,11242,,,,,86149,84227,473,0,1105,,,,,80515,1140695,4210,1140695,4210,12347,8833,,,359437,1158,1199933,2983 +"2020-12-09","NE",1277,,41,,4664,4664,787,45,,,637870,2504,,,1327997,,,142603,,1476,0,,,,,161776,73592,,0,1491439,17098,,,,,780842,3986,1491439,17098 +"2020-12-09","NH",570,,4,,851,851,232,2,284,,428266,2681,,,,,,27592,21727,969,0,,,,,,20513,,0,880944,7654,34633,32565,33686,,449993,3304,880944,7654 +"2020-12-09","NJ",17542,15674,116,1868,43075,43075,3533,256,,630,6107039,134748,,,,,412,417733,381486,5119,0,,,,,,,,0,6524772,139867,,,,,,0,6488525,139179 +"2020-12-09","NM",1823,,34,,7597,7597,917,74,,,,0,,,,,,112950,,1748,0,,,,,,40058,,0,1669512,0,,,,,,0,1669512,0 +"2020-12-09","NV",2384,,25,,,,1811,0,,371,863608,3759,,,,,252,176334,176334,3053,0,,,,,,,1773401,14295,1773401,14295,,,,,1039942,6812,,0 +"2020-12-09","NY",27404,,97,,89995,89995,4993,0,,952,,0,,,,,521,733064,,10600,0,,,,,,,21104040,194595,21104040,194595,,,,,,0,,0 +"2020-12-09","OH",7187,6675,84,512,30690,30690,5198,464,5059,1229,,0,,,,,747,520112,478879,10094,0,,25598,,,506227,351268,,0,6613087,39706,,536373,,,,0,6613087,39706 +"2020-12-09","OK",1945,,23,,13636,13636,1745,244,,465,2055918,16945,,,2055918,,,222993,,2307,0,6539,,,,226305,191525,,0,2278911,19252,98949,,,,,0,2285869,19091 +"2020-12-09","OR",1080,,35,,5064,5064,608,52,,136,,0,,,2051038,,59,87082,,1294,0,,,,,124122,,,0,2175160,21499,,,,,,0,2175160,21499 +"2020-12-09","PA",11762,,220,,,,5852,0,,1191,2972594,12870,,,,,675,445317,410973,8703,0,,,,,,258283,6286181,55164,6286181,55164,,,,,3383567,20545,,0 +"2020-12-09","PR",1219,979,13,240,,,637,0,,95,305972,0,,,395291,,105,58962,56674,646,0,44595,,,,20103,49961,,0,364934,646,,,,,,0,415664,0 +"2020-12-09","RI",1484,,14,,5216,5216,461,83,,42,497730,3911,,,1598165,,24,68299,,1232,0,,,,,83164,,1681329,18041,1681329,18041,,,,,566029,5143,,0 +"2020-12-09","SC",4612,4280,27,332,12527,12527,1217,81,,275,2357337,12963,80819,,2288614,,128,239444,223140,2490,0,12651,29885,,,291863,122416,,0,2596781,15453,93470,266077,,,,0,2580477,15142 +"2020-12-09","SD",1147,,36,,4974,4974,501,53,,102,256449,1064,,,,,56,88023,81280,985,0,,,,,87323,70728,,0,544888,3326,,,,,344472,2049,544888,3326 +"2020-12-09","TN",5171,4678,62,493,12862,12862,2890,85,,681,,0,,,4321426,,556,422962,385948,8213,0,,38755,,,451798,376851,,0,4773224,44106,,383802,,,,0,4773224,44106 +"2020-12-09","TX",23081,,273,,,,9053,0,,2647,,0,,,,,,1418252,1283674,13606,0,65542,70766,,,1426497,1062398,,0,11903307,81405,598405,857323,,,,0,11903307,81405 +"2020-12-09","UT",995,,23,,9105,9105,592,102,1586,223,1195348,5956,,,1739849,570,,222545,,2574,0,,21178,,20351,220042,161077,,0,1959891,15406,,282991,,124939,1399051,8031,1959891,15406 +"2020-12-09","VA",4281,3894,21,387,15592,15592,2035,125,,436,,0,,,,,200,267128,232940,4398,0,13906,30484,,,279105,,3573299,27430,3573299,27430,169610,425676,,,,0,,0 +"2020-12-09","VI",23,,0,,,,,0,,,28506,345,,,,,,1698,,18,0,,,,,,1534,,0,30204,363,,,,,30313,389,,0 +"2020-12-09","VT",86,86,1,,,,26,0,,2,231343,1049,,,,,,5285,5143,105,0,,,,,,3148,,0,593651,5018,,,,,236486,1012,593651,5018 +"2020-12-09","WA",2967,2967,26,,11841,11841,1114,145,,294,,0,,,,,141,201292,194605,3650,0,,,,,,,3197050,32336,3197050,32336,,,,,,0,,0 +"2020-12-09","WI",4142,3887,88,255,18715,18715,1535,215,1897,326,2216057,8107,,,,,,452180,422065,4171,0,,,,,,363504,4708409,31660,4708409,31660,,,,,2638122,11726,,0 +"2020-12-09","WV",901,846,31,55,,,650,0,,180,,0,,,,,77,58462,48999,1402,0,,,,,,37502,,0,1247173,13496,22165,,,,,0,1247173,13496 +"2020-12-09","WY",299,,19,,920,920,203,9,,,147534,395,,,397815,,,37885,32889,410,0,,,,,33611,32612,,0,431433,2269,,,,,180423,729,431433,2269 +"2020-12-08","AK",146,146,0,,827,827,159,22,,,,0,,,1043338,,21,36758,,562,0,,,,,44423,,,0,1088978,6838,,,,,,0,1088978,6838 +"2020-12-08","AL",3942,3496,50,446,27323,27323,2097,279,2305,,1435083,9299,,,,1323,,276665,229007,4436,0,,,,,,168387,,0,1664090,12517,,,75221,,1664090,12517,,0 +"2020-12-08","AR",2752,2521,39,231,9577,9577,1081,132,,394,1632886,8988,,,1632886,1060,182,174325,150612,2283,0,,,,28844,,153088,,0,1783498,10425,,,,162935,,0,1783498,10425 +"2020-12-08","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-08","AZ",6973,6449,23,524,28525,28525,3157,252,,744,2042903,7199,,,,,487,378157,365138,12314,0,,,,,,,,0,4065339,43,,,372457,,2408041,19202,4065339,43 +"2020-12-08","CA",20047,,112,,,,11511,0,,2526,,0,,,,,,1389707,1389707,23272,0,,,,,,,,0,25789775,296424,,,,,,0,25789775,296424 +"2020-12-08","CO",3372,2845,14,527,14957,14957,1755,53,,,1630728,10429,197968,,,,,268589,257282,3971,0,19292,,,,,,3551451,35448,3551451,35448,217260,,,,1888010,14222,,0 +"2020-12-08","CT",5242,4228,18,1014,12257,12257,1223,0,,,,0,,,3685175,,,138258,129629,2414,0,,5610,,,169096,,,0,3859849,40509,,73439,,,,0,3859849,40509 +"2020-12-08","DC",701,,0,,,,205,0,,55,,0,,,,,24,23589,,270,0,,,,,,16884,745631,6547,745631,6547,,,,,320985,1798,,0 +"2020-12-08","DE",803,707,10,96,,,338,0,,41,405974,2157,,,,,,41464,39871,753,0,,,,,41931,,796339,8081,796339,8081,,,,,447438,2910,,0 +"2020-12-08","FL",19627,,98,,57647,57647,4558,307,,,6568361,32172,578113,560932,10388564,,,1056065,950334,7801,0,71851,,69600,,1371389,,13265616,89756,13265616,89756,650372,,630838,,7624426,39973,11814252,84418 +"2020-12-08","GA",9873,9027,22,846,36461,36461,3013,191,6719,,,0,,,,,,512267,452369,5577,0,37643,,,,425006,,,0,4555443,34383,371988,,,,,0,4555443,34383 +"2020-12-08","GU",113,,0,,,,33,0,,10,81588,170,,,,,8,7026,6890,7,0,12,153,,,,6248,,0,88614,177,310,3392,,,,0,88478,177 +"2020-12-08","HI",262,262,0,,1327,1327,46,2,,17,,0,,,,,12,18976,18661,53,0,,,,,18616,,710816,2650,710816,2650,,,,,,0,,0 +"2020-12-08","IA",2919,,201,,,,900,0,,191,887840,1254,,73070,1751325,,111,214897,214897,830,0,,34054,5366,31914,232741,168056,,0,1102737,2084,,625552,78476,151536,1104948,2090,1994187,8234 +"2020-12-08","ID",1055,965,20,90,4448,4448,360,60,829,89,400958,1247,,,,,,111893,93956,1383,0,,,,,,43926,,0,494914,2189,,45253,,,494914,2189,750652,5670 +"2020-12-08","IL",14384,13487,168,897,,,5199,0,,1071,,0,,,,,626,804174,,7910,0,,,,,,,,0,11274608,95825,,,,,,0,11274608,95825 +"2020-12-08","IN",6410,6109,126,301,29029,29029,3250,386,5193,955,1945645,8954,,,,,399,392663,,5385,0,,,,,357104,,,0,4656827,42287,,,,,2338308,14339,4656827,42287 +"2020-12-08","KS",1856,,0,,5509,5509,623,0,1474,171,687299,0,,,,409,86,174025,,0,0,,,,,,,,0,861324,0,,,,,861324,0,,0 +"2020-12-08","KY",2102,1999,20,103,10840,10840,1760,104,2612,416,,0,,,,,207,205668,169569,3076,0,,,,,,30358,,0,2786379,14602,97055,124907,,,,0,2786379,14602 +"2020-12-08","LA",6652,6363,45,289,,,1516,0,,,3392824,26136,,,,,165,254562,238676,2426,0,,,,,,202891,,0,3647386,28562,,129429,,,,0,3631500,27933 +"2020-12-08","MA",11076,10833,41,243,14397,14397,1552,0,,310,3276717,14946,,,,,166,263447,253649,4122,0,,,12193,,313988,169809,,0,9072057,58501,,,133429,284946,3530366,18573,9072057,58501 +"2020-12-08","MD",4916,4755,51,161,22421,22421,1653,162,,396,2254514,13814,,144346,,,,219961,219961,2632,0,,,15776,,263785,8801,,0,4770832,40400,,,160122,,2474475,16446,4770832,40400 +"2020-12-08","ME",239,237,12,2,803,803,170,22,,52,,0,12508,,,,17,14049,12333,274,0,431,1372,,,16620,10247,,0,922590,5777,12951,34720,,,,0,922590,5777 +"2020-12-08","MI",10625,10138,203,487,,,4091,0,,849,,0,,,6676177,,512,443076,410295,6676,0,,,,,522189,197750,,0,7198366,61388,383571,,,,,0,7198366,61388 +"2020-12-08","MN",4027,3933,22,94,18594,18594,1604,236,4063,359,2328808,7221,,,,,,359203,350413,3051,0,,,,,,314957,4519051,24557,4519051,24557,,131675,,,2679221,10100,,0 +"2020-12-08","MO",4355,,161,,,,2628,0,,623,1553295,4241,89011,,2861000,,344,328206,328206,3250,0,9229,23670,,,362735,,,0,3230130,18701,98448,157166,92852,91310,1881501,7491,3230130,18701 +"2020-12-08","MP",2,2,0,,4,4,,0,,,17010,0,,,,,,111,111,2,0,,,,,,29,,0,17121,2,,,,,17116,0,24641,0 +"2020-12-08","MS",4017,3442,56,575,7703,7703,1222,0,,288,1026300,0,,,,,168,167926,128635,1732,0,,,,,,136627,,0,1194226,1732,54191,282410,,,,0,1154216,0 +"2020-12-08","MT",763,,21,,2909,2909,479,34,,79,,0,,,,,41,69346,,755,0,,,,,,51135,,0,696878,4115,,,,,,0,696878,4115 +"2020-12-08","NC",5605,5401,45,204,,,2373,0,,573,,0,,,,,,404032,377926,4670,0,,,,,,,,0,5546995,38124,,155329,,,,0,5546995,38124 +"2020-12-08","ND",1070,,42,,2896,2896,337,0,452,45,274937,0,11242,,,,,85676,83812,582,0,1105,,,,,77562,1136485,0,1136485,0,12347,8318,,,358279,0,1196950,0 +"2020-12-08","NE",1236,,31,,4619,4619,810,57,,,635366,1529,,,1312983,,,141127,,1293,0,,,,,159705,72583,,0,1474341,9500,,,,,776856,2817,1474341,9500 +"2020-12-08","NH",566,,0,,849,849,211,0,284,,425585,2271,,,,,,26623,21104,807,0,,,,,,20239,,0,873290,6007,34555,31681,33615,,446689,2799,873290,6007 +"2020-12-08","NJ",17426,15590,90,1836,42819,42819,3481,259,,670,5972291,53494,,,,,422,412614,377055,6319,0,,,,,,,,0,6384905,59813,,,,,,0,6349346,68563 +"2020-12-08","NM",1789,,33,,7523,7523,925,116,,,,0,,,,,,111202,,1255,0,,,,,,39725,,0,1669512,9237,,,,,,0,1669512,9237 +"2020-12-08","NV",2359,,40,,,,1784,0,,385,859849,2205,,,,,235,173281,173281,2694,0,,,,,,,1759106,11990,1759106,11990,,,,,1033130,4899,,0 +"2020-12-08","NY",27307,,75,,89995,89995,4835,0,,906,,0,,,,,493,722464,,9335,0,,,,,,,20909445,162464,20909445,162464,,,,,,0,,0 +"2020-12-08","OH",7103,6601,81,502,30226,30226,5181,657,5010,1210,,0,,,,,744,510018,470721,25721,0,,24256,,,498879,341008,,0,6573381,51114,,511288,,,,0,6573381,51114 +"2020-12-08","OK",1922,,11,,13392,13392,1698,19,,469,2038973,30144,,,2038973,,,220686,,2297,0,6539,,,,224116,189020,,0,2259659,32441,98949,,,,,0,2266778,39001 +"2020-12-08","OR",1045,,12,,5012,5012,622,153,,128,,0,,,2031230,,65,85788,,1292,0,,,,,122431,,,0,2153661,15330,,,,,,0,2153661,15330 +"2020-12-08","PA",11542,,169,,,,5561,0,,1160,2959724,16441,,,,,659,436614,403298,10170,0,,,,,,248869,6231017,63499,6231017,63499,,,,,3363022,25284,,0 +"2020-12-08","PR",1206,969,3,236,,,618,0,,104,305972,0,,,395291,,108,58316,56242,694,0,44306,,,,20103,48929,,0,364288,694,,,,,,0,415664,0 +"2020-12-08","RI",1470,,22,,5133,5133,444,94,,43,493819,2677,,,1581776,,25,67067,,1249,0,,,,,81512,,1663288,11667,1663288,11667,,,,,560886,3926,,0 +"2020-12-08","SC",4585,4253,6,332,12446,12446,1179,31,,276,2344374,24160,80649,,2275956,,118,236954,220961,2302,0,12586,29275,,,289379,121359,,0,2581328,26462,93235,260282,,,,0,2565335,26301 +"2020-12-08","SD",1111,,1,,4921,4921,491,49,,94,255385,690,,,,,63,87038,80499,538,0,,,,,86515,69144,,0,541562,2028,,,,,342423,1228,541562,2028 +"2020-12-08","TN",5109,4636,100,473,12777,12777,2839,139,,678,,0,,,4285324,,332,414749,378656,6019,0,,37687,,,443794,371163,,0,4729118,30659,,373162,,,,0,4729118,30659 +"2020-12-08","TX",22808,,181,,,,9028,0,,2646,,0,,,,,,1404646,1272496,19842,0,65063,69554,,,1416631,1050416,,0,11821902,117293,595246,843177,,,,0,11821902,117293 +"2020-12-08","UT",972,,23,,9003,9003,588,107,1576,220,1189392,3927,,,1726713,567,,219971,,2333,0,,20701,,19903,217772,158119,,0,1944485,10931,,274881,,121788,1391020,5717,1944485,10931 +"2020-12-08","VA",4260,3875,52,385,15467,15467,1918,111,,435,,0,,,,,196,262730,229553,3860,0,13822,29468,,,275809,,3545869,23817,3545869,23817,169034,413883,,,,0,,0 +"2020-12-08","VI",23,,0,,,,,0,,,28161,147,,,,,,1680,,31,0,,,,,,1523,,0,29841,178,,,,,29924,170,,0 +"2020-12-08","VT",85,85,4,,,,32,0,,4,230294,73,,,,,,5180,5180,100,0,,,,,,3076,,0,588633,2324,,,,,235474,309,588633,2324 +"2020-12-08","WA",2941,2941,16,,11696,11696,1094,152,,281,,0,,,,,135,197642,191241,1182,0,,,,,,,3164714,21714,3164714,21714,,,,,,0,,0 +"2020-12-08","WI",4054,3806,81,248,18500,18500,1556,214,1889,325,2207950,5477,,,,,,448009,418446,4620,0,,,,,,356752,4676749,25694,4676749,25694,,,,,2626396,9591,,0 +"2020-12-08","WV",870,821,29,49,,,646,0,,187,,0,,,,,80,57060,47976,932,0,,,,,,36513,,0,1233677,10166,22048,,,,,0,1233677,10166 +"2020-12-08","WY",280,,0,,911,911,203,10,,,147139,873,,,395741,,,37475,32555,490,0,,,,,33416,32234,,0,429164,3248,,,,,179694,1232,429164,3248 +"2020-12-07","AK",146,146,3,,805,805,166,6,,,,0,,,1037022,,24,36196,,476,0,,,,,43903,,,0,1082140,4364,,,,,,0,1082140,4364 +"2020-12-07","AL",3892,3465,3,427,27044,27044,2079,713,2290,,1425784,4658,,,,1317,,272229,225789,2352,0,,,,,,168387,,0,1651573,6532,,,74956,,1651573,6532,,0 +"2020-12-07","AR",2713,2485,53,228,9445,9445,1053,44,,382,1623898,8919,,,1623898,1044,182,172042,149175,1118,0,,,,27881,,151248,,0,1773073,9923,,,,156801,,0,1773073,9923 +"2020-12-07","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-07","AZ",6950,6431,0,519,28273,28273,3059,25,,736,2035704,16891,,,,,459,365843,353135,1567,0,,,,,,,,0,4065296,4081,,,371261,,2388839,18340,4065296,4081 +"2020-12-07","CA",19935,,59,,,,10998,0,,2470,,0,,,,,,1366435,1366435,24735,0,,,,,,,,0,25493351,298305,,,,,,0,25493351,298305 +"2020-12-07","CO",3358,2841,2,517,14904,14904,1779,36,,,1620299,11470,196089,,,,,264618,253489,4037,0,18864,,,,,,3516003,37843,3516003,37843,215691,,,,1873788,15447,,0 +"2020-12-07","CT",5224,4212,78,1012,12257,12257,1183,0,,,,0,,,3647920,,,135844,127411,8129,0,,5412,,,165936,,,0,3819340,14368,,71276,,,,0,3819340,14368 +"2020-12-07","DC",701,,4,,,,176,0,,51,,0,,,,,24,23319,,183,0,,,,,,16733,739084,4451,739084,4451,,,,,319187,1381,,0 +"2020-12-07","DE",793,698,0,95,,,322,0,,37,403817,2963,,,,,,40711,39160,799,0,,,,,41125,,788258,9960,788258,9960,,,,,444528,3762,,0 +"2020-12-07","FL",19529,,106,,57340,57340,4495,155,,,6536189,30952,578113,560932,10314978,,,1048264,945449,7537,0,71851,,69600,,1360895,,13175860,92339,13175860,92339,650372,,630838,,7584453,38489,11729834,86753 +"2020-12-07","GA",9851,9007,45,844,36270,36270,2923,231,6691,,,0,,,,,,506690,448683,5285,0,37495,,,,420948,,,0,4521060,45008,371077,,,,,0,4521060,45008 +"2020-12-07","GU",113,,0,,,,33,0,,10,81418,1847,,,,,8,7019,6883,15,0,12,153,,,,6248,,0,88437,1862,310,3392,,,,0,88301,1903 +"2020-12-07","HI",262,262,0,,1325,1325,57,0,,14,,0,,,,,17,18923,18608,81,0,,,,,18567,,708166,6390,708166,6390,,,,,,0,,0 +"2020-12-07","IA",2718,,35,,,,898,0,,200,886586,1387,,72764,1744017,,120,214067,214067,677,0,,33334,5199,31203,231843,160836,,0,1100653,2064,,609129,78003,149492,1102858,2069,1985953,1985953 +"2020-12-07","ID",1035,946,3,89,4388,4388,477,16,822,105,399711,1684,,,,,,110510,93014,805,0,,,,,,43380,,0,492725,2338,,45253,,,492725,2338,744982,3118 +"2020-12-07","IL",14216,13343,100,873,,,5190,0,,1123,,0,,,,,648,796264,,8691,0,,,,,,,,0,11178783,77569,,,,,,0,11178783,77569 +"2020-12-07","IN",6284,5986,42,298,28643,28643,3214,276,5128,954,1936691,8429,,,,,393,387278,,5661,0,,,,,352008,,,0,4614540,37329,,,,,2323969,14090,4614540,37329 +"2020-12-07","KS",1856,,70,,5509,5509,623,92,1474,171,687299,10408,,,,409,86,174025,,5730,0,,,,,,,,0,861324,16138,,,,,861324,16138,,0 +"2020-12-07","KY",2082,1980,10,102,10736,10736,1700,58,2587,410,,0,,,,,210,202592,167377,1960,0,,,,,,30239,,0,2771777,39772,96708,123834,,,,0,2771777,39772 +"2020-12-07","LA",6607,6331,23,276,,,1423,0,,,3366688,9728,,,,,161,252136,236879,1013,0,,,,,,202891,,0,3618824,10741,,125278,,,,0,3603567,10738 +"2020-12-07","MA",11035,10793,31,242,14397,14397,1516,0,,302,3261771,11043,,,,,153,259325,250022,2481,0,,,12193,,309976,169809,,0,9013556,43304,,,133429,280896,3511793,13506,9013556,43304 +"2020-12-07","MD",4865,4705,19,160,22259,22259,1561,164,,388,2240700,15105,,144346,,,,217329,217329,2302,0,,,15776,,260509,8797,,0,4730432,44956,,,160122,,2458029,17407,4730432,44956 +"2020-12-07","ME",227,225,0,2,781,781,170,13,,52,,0,12494,,,,17,13775,12097,427,0,420,1284,,,16371,10146,,0,916813,4970,12926,33057,,,,0,916813,4970 +"2020-12-07","MI",10422,9947,101,475,,,4122,0,,840,,0,,,6622320,,515,436400,404386,9824,0,,,,,514658,197750,,0,7136978,95601,380511,,,,,0,7136978,95601 +"2020-12-07","MN",4005,3913,21,92,18358,18358,1567,125,4015,362,2321587,20452,,,,,,356152,347534,5290,0,,,,,,314138,4494494,62817,4494494,62817,,128998,,,2669121,25583,,0 +"2020-12-07","MO",4194,,2,,,,2550,0,,599,1549054,4828,88648,,2845841,,355,324956,324956,2658,0,9090,22970,,,359229,,,0,3211429,15244,97946,153153,92439,88854,1874010,7486,3211429,15244 +"2020-12-07","MP",2,2,0,,4,4,,0,,,17010,0,,,,,,109,109,3,0,,,,,,29,,0,17119,3,,,,,17116,0,24641,697 +"2020-12-07","MS",3961,3403,0,558,7703,7703,1188,217,,287,1026300,43905,,,,,170,166194,127916,1263,0,,,,,,136627,,0,1192494,45168,54191,282410,,,,0,1154216,49584 +"2020-12-07","MT",742,,6,,2875,2875,492,39,,77,,0,,,,,40,68591,,716,0,,,,,,50652,,0,692763,4549,,,,,,0,692763,4549 +"2020-12-07","NC",5560,5364,17,196,,,2240,0,,528,,0,,,,,,399362,373684,4372,0,,,,,,,,0,5508871,49184,,149603,,,,0,5508871,49184 +"2020-12-07","ND",1028,,9,,2896,2896,304,16,452,45,274937,445,11242,,,,,85094,83297,387,0,1105,,,,,77562,1136485,4460,1136485,4460,12347,7956,,,358279,808,1196950,4828 +"2020-12-07","NE",1205,,11,,4562,4562,768,15,,,633837,2098,,,1305054,,,139834,,1266,0,,,,,158132,71188,,0,1464841,8473,,,,,774039,3366,1464841,8473 +"2020-12-07","NH",566,,2,,849,849,185,0,284,,423314,2378,,,,,,25816,20576,1045,0,,,,,,19864,,0,867283,5810,34525,,33589,,443890,3143,867283,5810 +"2020-12-07","NJ",17336,15500,15,1836,42560,42560,3346,104,,637,5918797,0,,,,,391,406295,371579,4137,0,,,,,,,,0,6325092,4137,,,,,,0,6280783,0 +"2020-12-07","NM",1756,,7,,7407,7407,935,86,,,,0,,,,,,109947,,1859,0,,,,,,38131,,0,1660275,12299,,,,,,0,1660275,12299 +"2020-12-07","NV",2319,,4,,,,1767,0,,379,857644,3997,,,,,227,170587,170587,2448,0,,,,,,,1747116,13853,1747116,13853,,,,,1028231,6445,,0 +"2020-12-07","NY",27232,,83,,89995,89995,4602,0,,872,,0,,,,,464,713129,,7302,0,,,,,,,20746981,152287,20746981,152287,,,,,,0,,0 +"2020-12-07","OH",7022,6544,63,478,29569,29569,5121,336,4943,1163,,0,,,,,711,484297,458993,9273,0,,23904,,,490542,327078,,0,6522267,54838,,508423,,,,0,6522267,54838 +"2020-12-07","OK",1911,,15,,13373,13373,1721,254,,472,2008829,0,,,2008829,,,218389,,1903,0,6539,,,,218948,184736,,0,2227218,1903,98949,,,,,0,2227777,0 +"2020-12-07","OR",1033,,6,,4859,4859,596,0,,127,,0,,,2017104,,59,84496,,1253,0,,,,,121227,,,0,2138331,18821,,,,,,0,2138331,18821 +"2020-12-07","PA",11373,,42,,,,5421,0,,1115,2943283,14247,,,,,614,426444,394455,6330,0,,,,,,247337,6167518,67800,6167518,67800,,,,,3337738,20266,,0 +"2020-12-07","PR",1203,966,11,236,,,618,0,,106,305972,0,,,395291,,88,57622,55680,951,0,43806,,,,20103,47883,,0,363594,951,,,,,,0,415664,0 +"2020-12-07","RI",1448,,11,,5039,5039,422,0,,45,491142,2169,,,1571493,,30,65818,,844,0,,,,,80128,,1651621,7856,1651621,7856,,,,,556960,3013,,0 +"2020-12-07","SC",4579,4249,13,330,12415,12415,1025,35,,243,2320214,24122,80410,,2252263,,108,234652,218820,2553,0,12502,29127,,,286771,120652,,0,2554866,26675,92912,258736,,,,0,2539034,26564 +"2020-12-07","SD",1110,,0,,4872,4872,503,37,,98,254695,691,,,,,62,86500,79994,509,0,,,,,86156,68576,,0,539534,2647,,,,,341195,1200,539534,2647 +"2020-12-07","TN",5009,4544,66,465,12638,12638,2755,45,,666,,0,,,4260327,,333,408730,373537,8136,0,,36663,,,438132,362818,,0,4698459,42198,,367022,,,,0,4698459,42198 +"2020-12-07","TX",22627,,33,,,,8790,0,,2631,,0,,,,,,1384804,1258214,9491,0,64835,67828,,,1401774,1038806,,0,11704609,39810,593787,818716,,,,0,11704609,39810 +"2020-12-07","UT",949,,10,,8896,8896,592,74,1552,215,1185465,5144,,,1717712,558,,217638,,2231,0,,19925,,19158,215842,154983,,0,1933554,11318,,264453,,117599,1385303,7039,1933554,11318 +"2020-12-07","VA",4208,3829,8,379,15356,15356,1885,61,,403,,0,,,,,180,258870,226426,3817,0,13780,28286,,,273087,,3522052,29851,3522052,29851,168577,398841,,,,0,,0 +"2020-12-07","VI",23,,0,,,,,0,,,28014,354,,,,,,1649,,16,0,,,,,,1517,,0,29663,370,,,,,29754,363,,0 +"2020-12-07","VT",81,81,2,,,,31,0,,6,230221,1356,,,,,,5080,4944,65,0,,,,,,2996,,0,586309,2507,,,,,235165,1285,586309,2507 +"2020-12-07","WA",2925,2925,0,,11544,11544,1099,69,,274,,0,,,,,135,196460,190099,1773,0,,,,,,,3143000,9155,3143000,9155,,,,,,0,,0 +"2020-12-07","WI",3973,3738,21,235,18286,18286,1566,70,1882,326,2202473,5751,,,,,,443389,414332,2322,0,,,,,,352510,4651055,27828,4651055,27828,,,,,2616805,7906,,0 +"2020-12-07","WV",841,798,3,43,,,610,0,,176,,0,,,,,83,56128,47242,1131,0,,,,,,35596,,0,1223511,11960,21902,,,,,0,1223511,11960 +"2020-12-07","WY",280,,23,,901,901,206,49,,,146266,1690,,,392871,,,36985,32196,668,0,,,,,33038,30988,,0,425916,8289,,,,,178462,2839,425916,8289 +"2020-12-06","AK",143,143,0,,799,799,164,0,,,,0,,,1032815,,21,35720,,757,0,,,,,43746,,,0,1077776,10545,,,,,,0,1077776,10545 +"2020-12-06","AL",3889,3462,12,427,26331,26331,1927,0,2290,,1421126,5769,,,,1317,,269877,223915,2288,0,,,,,,168387,,0,1645041,7880,,,74784,,1645041,7880,,0 +"2020-12-06","AR",2660,2437,40,223,9401,9401,1076,21,,374,1614979,13244,,,1614979,1038,179,170924,148171,1542,0,,,,27710,,149490,,0,1763150,14704,,,,155934,,0,1763150,14704 +"2020-12-06","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-06","AZ",6950,6431,25,519,28248,28248,2977,242,,714,2018813,15661,,,,,462,364276,351686,5376,0,,,,,,,,0,4061215,15440,,,370928,,2370499,20586,4061215,15440 +"2020-12-06","CA",19876,,85,,,,10624,0,,2393,,0,,,,,,1341700,1341700,30075,0,,,,,,,,0,25195046,293071,,,,,,0,25195046,293071 +"2020-12-06","CO",3356,2839,-1,517,14868,14868,1750,24,,,1608829,34610,196089,,,,,260581,249512,3234,0,18864,,,,,,3478160,36046,3478160,36046,214953,,,,1858341,42697,,0 +"2020-12-06","CT",5146,4143,0,1003,12257,12257,1150,0,,,,0,,,3634989,,,127715,119584,0,0,,4927,,,164510,,,0,3804972,15709,,64103,,,,0,3804972,15709 +"2020-12-06","DC",697,,2,,,,171,0,,50,,0,,,,,23,23136,,264,0,,,,,,16665,734633,7246,734633,7246,,,,,317806,1988,,0 +"2020-12-06","DE",793,698,11,95,,,315,0,,39,400854,2340,,,,,,39912,38362,816,0,,,,,40267,18851,778298,8480,778298,8480,,,,,440766,3156,,0 +"2020-12-06","FL",19423,,96,,57185,57185,4400,145,,,6505237,41197,578113,560932,10238741,,,1040727,939763,8175,0,71851,,69600,,1350646,,13083521,96582,13083521,96582,650372,,630838,,7545964,49372,11643081,86153 +"2020-12-06","GA",9806,8971,13,835,36039,36039,2829,38,6676,,,0,,,,,,501405,443822,2034,0,37176,,,,415077,,,0,4476052,9852,369773,,,,,0,4476052,9852 +"2020-12-06","GU",113,,0,,,,33,0,,10,79571,0,,,,,6,7004,6827,27,0,12,153,,,,6056,,0,86575,27,227,2591,,,,0,86398,0 +"2020-12-06","HI",262,262,1,,1325,1325,57,0,,14,,0,,,,,17,18842,18527,104,0,,,,,18493,,701776,6599,701776,6599,,,,,,0,,0 +"2020-12-06","IA",2683,,16,,,,918,0,,195,885199,2588,,72606,,,122,213390,213390,1499,0,,,5189,30921,,159063,,0,1098589,4087,,,77835,148950,1100789,4076,,0 +"2020-12-06","ID",1032,944,0,88,4372,4372,477,30,814,105,398027,1810,,,,,,109705,92360,1339,0,,,,,,42932,,0,490387,2927,,45253,,,490387,2927,741864,4267 +"2020-12-06","IL",14116,13255,99,861,,,5160,0,,1103,,0,,,,,643,787573,,7598,0,,,,,,,,0,11101214,79538,,,,,,0,11101214,79538 +"2020-12-06","IN",6242,5944,35,298,28367,28367,3189,351,5081,961,1928262,11103,,,,,368,381617,,6598,0,,,,,347061,,,0,4577211,51451,,,,,2309879,17701,4577211,51451 +"2020-12-06","KS",1786,,0,,5417,5417,1143,0,1453,283,676891,0,,,,409,123,168295,,0,0,,,,,,,,0,845186,0,,,,,845186,0,,0 +"2020-12-06","KY",2072,1970,10,102,10678,10678,1731,0,2576,401,,0,,,,,226,200632,165693,2567,0,,,,,,30161,,0,2732005,0,96301,122226,,,,0,2732005,0 +"2020-12-06","LA",6584,6309,36,275,,,1392,0,,,3356960,37603,,,,,162,251123,235869,3946,0,,,,,,202891,,0,3608083,41549,,125101,,,,0,3592829,40993 +"2020-12-06","MA",11004,10763,51,241,14397,14397,1416,0,,298,3250728,19821,,,,,139,256844,247559,4827,0,,,12193,,307148,169809,,0,8970252,89439,,,133429,280427,3498287,24568,8970252,89439 +"2020-12-06","MD",4846,4685,26,161,22095,22095,1576,183,,393,2225595,14799,,144346,,,,215027,215027,2643,0,,,15776,,257412,8785,,0,4685476,48348,,,160122,,2440622,17442,4685476,48348 +"2020-12-06","ME",227,225,0,2,768,768,164,8,,45,,0,12438,,,,17,13348,11801,221,0,409,1190,,,16154,10080,,0,911843,8710,12859,31363,,,,0,911843,8710 +"2020-12-06","MI",10321,9854,0,467,,,4141,0,,855,,0,,,6538482,,513,426576,395036,0,0,,,,,502895,197750,,0,7041377,0,378723,,,,,0,7041377,0 +"2020-12-06","MN",3984,3892,64,92,18233,18233,1679,174,3991,367,2301135,19757,,,,,,350862,342403,5581,0,,,,,,308218,4431677,61042,4431677,61042,,128148,,,2643538,25107,,0 +"2020-12-06","MO",4192,,11,,,,2708,0,,625,1544226,6658,88500,,2833491,,368,322298,322298,3876,0,9013,22691,,,356389,,,0,3196185,22196,97721,150185,92247,87216,1866524,10534,3196185,22196 +"2020-12-06","MP",2,2,0,,4,4,,0,,,17010,0,,,,,,106,106,0,0,,,,,,29,,0,17116,0,,,,,17116,0,23944,0 +"2020-12-06","MS",3961,3403,12,558,7486,7486,1157,0,,286,982395,0,,,,,165,164931,127320,1473,0,,,,,,128746,,0,1147326,1473,51554,210647,,,,0,1104632,0 +"2020-12-06","MT",736,,2,,2836,2836,475,21,,77,,0,,,,,44,67875,,806,0,,,,,,50287,,0,688214,5631,,,,,,0,688214,5631 +"2020-12-06","NC",5543,5347,27,196,,,2191,0,,515,,0,,,,,,394990,369538,6438,0,,,,,,,,0,5459687,51078,,148091,,,,0,5459687,51078 +"2020-12-06","ND",1019,,6,,2880,2880,305,12,450,48,274492,478,11242,,,,,84707,82933,488,0,1105,,,,,76999,1132025,6904,1132025,6904,12347,7868,,,357471,953,1192122,7512 +"2020-12-06","NE",1194,,8,,4547,4547,755,41,,,631739,6185,,,1298009,,,138568,,2243,0,,,,,156729,69840,,0,1456368,20591,,,,,770673,8429,1456368,20591 +"2020-12-06","NH",564,,5,,849,849,169,2,284,,420936,2804,,,,,,24771,19811,633,0,,,,,,19553,,0,861473,7388,34502,,33568,,440747,3194,861473,7388 +"2020-12-06","NJ",17321,15485,15,1836,42456,42456,3241,95,,622,5918797,0,,,,,396,402158,368016,6632,0,,,,,,,,0,6320955,6632,,,,,,0,6280783,0 +"2020-12-06","NM",1749,,11,,7321,7321,919,54,,,,0,,,,,,108088,,1232,0,,,,,,37041,,0,1647976,13059,,,,,,0,1647976,13059 +"2020-12-06","NV",2315,,14,,,,1789,0,,382,853647,4379,,,,,214,168139,168139,2511,0,,,,,,,1733263,14716,1733263,14716,,,,,1021786,6890,,0 +"2020-12-06","NY",27149,,60,,89995,89995,4442,0,,850,,0,,,,,464,705827,,9702,0,,,,,,,20594694,205832,20594694,205832,,,,,,0,,0 +"2020-12-06","OH",6959,6488,13,471,29233,29233,5072,274,4903,1215,,0,,,,,725,475024,449967,7592,0,,23514,,,482767,321505,,0,6467429,64743,,504459,,,,0,6467429,64743 +"2020-12-06","OK",1896,,22,,13119,13119,1721,-9,,472,2008829,0,,,2008829,,,216486,,3241,0,6539,,,,218948,182942,,0,2225315,3241,98949,,,,,0,2227777,0 +"2020-12-06","OR",1027,,24,,4859,4859,596,0,,127,,0,,,1999894,,59,83243,,1806,0,,,,,119616,,,0,2119510,32456,,,,,,0,2119510,32456 +"2020-12-06","PA",11331,,69,,,,5300,0,,1107,2929036,17396,,,,,587,420114,388436,8630,0,,,,,,238660,6099718,65036,6099718,65036,,,,,3317472,25639,,0 +"2020-12-06","PR",1192,959,7,232,,,631,0,,107,305972,0,,,395291,,102,56671,54746,1139,0,43358,,,,20103,47406,,0,362643,1139,,,,,,0,415664,0 +"2020-12-06","RI",1437,,8,,5039,5039,422,55,,45,488973,2913,,,1564614,,30,64974,,1030,0,,,,,79151,,1643765,13774,1643765,13774,,,,,553947,3943,,0 +"2020-12-06","SC",4566,4237,49,329,12380,12380,1025,75,,243,2296092,21406,80199,,2228787,,108,232099,216378,2864,0,12408,28921,,,283683,119844,,0,2528191,24270,92607,255932,,,,0,2512470,23989 +"2020-12-06","SD",1110,,19,,4835,4835,497,42,,111,254004,939,,,,,66,85991,79535,687,0,,,,,85721,68449,,0,536887,3711,,,,,339995,1626,536887,3711 +"2020-12-06","TN",4943,4491,38,452,12593,12593,2760,35,,690,,0,,,4226010,,346,400594,366333,3072,0,,35707,,,430251,360152,,0,4656261,14750,,354519,,,,0,4656261,14750 +"2020-12-06","TX",22594,,92,,,,8681,0,,2592,,0,,,,,,1375313,1249323,10380,0,64340,67018,,,1395225,1030716,,0,11664799,57786,590964,813338,,,,0,11664799,57786 +"2020-12-06","UT",939,,0,,8822,8822,605,57,1548,213,1180321,6450,,,1708439,558,,215407,,2563,0,,19688,,18930,213797,153027,,0,1922236,14448,,263379,,117087,1378264,8738,1922236,14448 +"2020-12-06","VA",4200,3822,3,378,15295,15295,1969,40,,395,,0,,,,,187,255053,223379,3880,0,13691,27785,,,270132,,3492201,55853,3492201,55853,168166,395181,,,,0,,0 +"2020-12-06","VI",23,,0,,,,,0,,,27660,0,,,,,,1633,,0,0,,,,,,1513,,0,29293,0,,,,,29391,0,,0 +"2020-12-06","VT",79,79,0,,,,25,0,,4,228865,2008,,,,,,5015,4884,121,0,,,,,,2951,,0,583802,5793,,,,,233880,2129,583802,5793 +"2020-12-06","WA",2925,2925,0,,11475,11475,1099,202,,274,,0,,,,,136,194687,188411,3080,0,,,,,,,3133845,13699,3133845,13699,,,,,,0,,0 +"2020-12-06","WI",3952,3719,18,233,18216,18216,1660,90,1880,371,2196722,7773,,,,,,441067,412177,3149,0,,,,,,348995,4623227,27704,4623227,27704,,,,,2608899,10564,,0 +"2020-12-06","WV",838,792,9,46,,,616,0,,174,,0,,,,,77,54997,46326,1425,0,,,,,,35082,,0,1211551,12604,21781,,,,,0,1211551,12604 +"2020-12-06","WY",257,,0,,852,852,212,9,,,144576,0,,,385537,,,36317,31561,376,0,,,,,32083,29656,,0,417627,0,,,,,175623,0,417627,0 +"2020-12-05","AK",143,143,1,,799,799,166,5,,,,0,,,1023349,,24,34963,,922,0,,,,,42805,,,0,1067231,16862,,,,,,0,1067231,16862 +"2020-12-05","AL",3877,3454,46,423,26331,26331,1867,0,2290,,1415357,8058,,,,1317,,267589,221804,3390,0,,,,,,168387,,0,1637161,10793,,,74594,,1637161,10793,,0 +"2020-12-05","AR",2620,2402,34,218,9380,9380,1056,51,,359,1601735,11959,,,1601735,1038,178,169382,146711,2245,0,,,,27547,,148131,,0,1748446,13760,,,,155355,,0,1748446,13760 +"2020-12-05","AS",0,,0,,,,,0,,,2140,0,,,,,,0,0,0,0,,,,,,,,0,2140,0,,,,,,0,2140,0 +"2020-12-05","AZ",6925,6406,40,519,28006,28006,2931,268,,701,2003152,16875,,,,,431,358900,346761,6799,0,,,,,,,,0,4045775,33404,,,369832,,2349913,23169,4045775,33404 +"2020-12-05","CA",19791,,209,,,,10273,0,,2265,,0,,,,,,1311625,1311625,25068,0,,,,,,,,0,24901975,226497,,,,,,0,24901975,226497 +"2020-12-05","CO",3357,2840,19,517,14844,14844,1812,82,,,1574219,0,194770,,,,,257347,246333,5125,0,18530,,,,,,3442114,45040,3442114,45040,214953,,,,1815644,0,,0 +"2020-12-05","CT",5146,4143,0,1003,12257,12257,1150,0,,,,0,,,3620929,,,127715,119584,0,0,,4927,,,162880,,,0,3789263,31226,,64103,,,,0,3789263,31226 +"2020-12-05","DC",695,,2,,,,193,0,,54,,0,,,,,22,22872,,392,0,,,,,,16596,727387,9145,727387,9145,,,,,315818,2424,,0 +"2020-12-05","DE",782,688,0,94,,,306,0,,36,398514,1845,,,,,,39096,37655,698,0,,,,,39295,18605,769818,9014,769818,9014,,,,,437610,2543,,0 +"2020-12-05","FL",19327,,91,,57040,57040,4339,231,,,6464040,42210,578113,560932,10163645,,,1032552,933525,10198,0,71851,,69600,,1339838,,12986939,129842,12986939,129842,650372,,630838,,7496592,52408,11556928,108006 +"2020-12-05","GA",9793,8969,68,824,36001,36001,2753,218,6671,,,0,,,,,,499371,442017,5017,0,37137,,,,413978,,,0,4466200,31180,369581,,,,,0,4466200,31180 +"2020-12-05","GU",113,,0,,,,38,0,,9,79571,0,,,,,6,6977,6827,18,0,12,153,,,,6056,,0,86548,18,227,2591,,,,0,86398,0 +"2020-12-05","HI",261,261,5,,1325,1325,57,10,,14,,0,,,,,17,18738,18423,133,0,,,,,18386,,695177,8421,695177,8421,,,,,,0,,0 +"2020-12-05","IA",2667,,62,,,,960,0,,204,882611,3286,,72534,,,117,211891,211891,1655,0,,,5143,30321,,157026,,0,1094502,4941,,,77717,147321,1096713,4935,,0 +"2020-12-05","ID",1032,943,18,89,4342,4342,477,71,805,105,396217,1764,,,,,,108366,91243,1911,0,,,,,,42671,,0,487460,3268,,45253,,,487460,3268,737597,5128 +"2020-12-05","IL",14017,13179,235,838,,,5331,0,,1134,,0,,,,,694,779975,,9887,0,,,,,,,,0,11021676,102678,,,,,,0,11021676,102678 +"2020-12-05","IN",6207,5910,85,297,28016,28016,3255,344,5033,961,1917159,12306,,,,,368,375019,,7690,0,,,,,341255,,,0,4525760,61268,,,,,2292178,19996,4525760,61268 +"2020-12-05","KS",1786,,0,,5417,5417,1143,0,1453,283,676891,0,,,,409,123,168295,,0,0,,,,,,,,0,845186,0,,,,,845186,0,,0 +"2020-12-05","KY",2062,1960,23,102,10678,10678,1731,118,2576,401,,0,,,,,226,198065,163462,3872,0,,,,,,30161,,0,2732005,32324,96301,122226,,,,0,2732005,32324 +"2020-12-05","LA",6548,6274,0,274,,,1357,0,,,3319357,0,,,,,154,247177,232479,0,0,,,,,,202891,,0,3566534,0,,120846,,,,0,3551836,0 +"2020-12-05","MA",10953,10715,43,238,14397,14397,1428,0,,283,3230907,22950,,,,,138,252017,242812,5619,0,,,12193,,301751,169809,,0,8880813,106116,,,133429,279060,3473719,28306,8880813,106116 +"2020-12-05","MD",4820,4659,30,161,21912,21912,1598,156,,379,2210796,16700,,144346,,,,212384,212384,3193,0,,,15776,,254161,8780,,0,4637128,53900,,,160122,,2423180,19893,4637128,53900 +"2020-12-05","ME",227,225,3,2,760,760,164,9,,45,,0,12438,,,,17,13127,11640,283,0,409,1090,,,15669,9993,,0,903133,8615,12859,29524,,,,0,903133,8615 +"2020-12-05","MI",10321,9854,204,467,,,4141,0,,855,,0,,,6538482,,513,426576,395036,6308,0,,,,,502895,197750,,0,7041377,68207,378723,,,,,0,7041377,68207 +"2020-12-05","MN",3920,3829,75,91,18059,18059,1679,231,3980,367,2281378,12161,,,,,,345281,337053,6308,0,,,,,,301081,4370635,48295,4370635,48295,,121786,,,2618431,18075,,0 +"2020-12-05","MO",4181,,59,,,,2735,0,,631,1537568,6927,88121,,2815510,,361,318422,318422,5001,0,8817,22076,,,352226,,,0,3173989,26435,97146,146641,91754,85007,1855990,11928,3173989,26435 +"2020-12-05","MP",2,2,0,,4,4,,0,,,17010,0,,,,,,106,106,0,0,,,,,,29,,0,17116,0,,,,,17116,0,23944,0 +"2020-12-05","MS",3949,3395,33,554,7486,7486,1157,0,,286,982395,0,,,,,165,163458,126751,1942,0,,,,,,128746,,0,1145853,1942,51554,210647,,,,0,1104632,0 +"2020-12-05","MT",734,,7,,2815,2815,466,5,,84,,0,,,,,47,67069,,633,0,,,,,,49910,,0,682583,7321,,,,,,0,682583,7321 +"2020-12-05","NC",5516,5323,49,193,,,2171,0,,508,,0,,,,,,388552,363698,6018,0,,,,,,,,0,5408609,56481,,145082,,,,0,5408609,56481 +"2020-12-05","ND",1013,,18,,2868,2868,298,26,448,47,274014,767,11242,,,,,84219,82463,615,0,1105,,,,,76476,1125121,8318,1125121,8318,12347,7553,,,356518,1322,1184610,9170 +"2020-12-05","NE",1186,,27,,4506,4506,819,27,,,625554,2432,,,1279277,,,136325,,1615,0,,,,,154875,68355,,0,1435777,14074,,,,,762244,4050,1435777,14074 +"2020-12-05","NH",559,,7,,847,847,146,3,282,,418132,3426,,,,,,24138,19421,448,0,,,,,,19034,,0,854085,8885,34455,,33528,,437553,3789,854085,8885 +"2020-12-05","NJ",17306,15470,51,1836,42361,42361,3264,198,,628,5918797,92960,,,,,384,395526,361986,6048,0,,,,,,,,0,6314323,99008,,,,,,0,6280783,103947 +"2020-12-05","NM",1738,,32,,7267,7267,925,83,,,,0,,,,,,106856,,1921,0,,,,,,36388,,0,1634917,14534,,,,,,0,1634917,14534 +"2020-12-05","NV",2301,,29,,,,1789,0,,382,849268,7047,,,,,214,165628,165628,3194,0,,,,,,,1718547,21653,1718547,21653,,,,,1014896,10241,,0 +"2020-12-05","NY",27089,,72,,89995,89995,4318,0,,825,,0,,,,,435,696125,,10761,0,,,,,,,20388862,215401,20388862,215401,,,,,,0,,0 +"2020-12-05","OH",6946,6475,64,471,28959,28959,4978,286,4870,1163,,0,,,,,702,467432,442459,10469,0,,22371,,,472843,315453,,0,6402686,67376,,485926,,,,0,6402686,67376 +"2020-12-05","OK",1874,,14,,13128,13128,1721,179,,472,2008829,26060,,,2008829,,,213245,,4370,0,6539,,,,218948,180810,,0,2222074,30430,98949,,,,,0,2227777,27995 +"2020-12-05","OR",1003,,30,,4859,4859,596,56,,127,,0,,,1970033,,59,81437,,2174,0,,,,,117021,,,0,2087054,44007,,,,,,0,2087054,44007 +"2020-12-05","PA",11262,,149,,,,5272,0,,1066,2911640,18319,,,,,573,411484,380193,12884,0,,,,,,238660,6034682,78228,6034682,78228,,,,,3291833,29001,,0 +"2020-12-05","PR",1185,955,12,229,,,640,0,,103,305972,0,,,395291,,104,55532,53633,935,0,41991,,,,20103,47406,,0,361504,935,,,,,,0,415664,0 +"2020-12-05","RI",1429,,16,,4984,4984,410,141,,42,486060,3138,,,1552033,,30,63944,,1807,0,,,,,77958,,1629991,21143,1629991,21143,,,,,550004,4945,,0 +"2020-12-05","SC",4517,4194,21,323,12305,12305,1029,82,,244,2274686,25800,79812,,2207945,,110,229235,213795,3222,0,12248,28292,,,280536,118984,,0,2503921,29022,92060,250883,,,,0,2488481,28600 +"2020-12-05","SD",1091,,27,,4793,4793,512,45,,110,253065,951,,,,,61,85304,78912,906,0,,,,,84919,68011,,0,533176,3267,,,,,338369,1857,533176,3267 +"2020-12-05","TN",4905,4462,29,443,12558,12558,2715,70,,666,,0,,,4213692,,333,397522,363977,4914,0,,34997,,,427819,357347,,0,4641511,22574,,345152,,,,0,4641511,22574 +"2020-12-05","TX",22502,,247,,,,8916,0,,2663,,0,,,,,,1364933,1240750,14391,0,63669,66269,,,1386252,1022297,,0,11607013,109458,587512,807829,,,,0,11607013,109458 +"2020-12-05","UT",939,,14,,8765,8765,611,113,1544,212,1173871,8539,,,1696512,557,,212844,,3674,0,,19485,,18736,211276,150405,,0,1907788,20132,,261279,,116285,1369526,11815,1907788,20132 +"2020-12-05","VA",4197,3819,37,378,15255,15255,1852,139,,407,,0,,,,,183,251173,220510,3793,0,13570,27174,,,263811,,3436348,49724,3436348,49724,167356,391458,,,,0,,0 +"2020-12-05","VI",23,,0,,,,,0,,,27660,158,,,,,,1633,,20,0,,,,,,1513,,0,29293,178,,,,,29391,202,,0 +"2020-12-05","VT",79,79,2,,,,25,0,,4,226857,1511,,,,,,4894,4765,131,0,,,,,,2899,,0,578009,5139,,,,,231751,1642,578009,5139 +"2020-12-05","WA",2925,2925,25,,11273,11273,1099,78,,274,,0,,,,,132,191607,185493,3138,0,,,,,,,3120146,225779,3120146,225779,,,,,,0,,0 +"2020-12-05","WI",3934,3702,92,232,18126,18126,1660,183,1879,371,2188949,8629,,,,,,437918,409386,5711,0,,,,,,343481,4595523,38957,4595523,38957,,,,,2598335,13460,,0 +"2020-12-05","WV",829,786,30,43,,,641,0,,177,,0,,,,,85,53572,45253,1400,0,,,,,,34454,,0,1198947,21529,21639,,,,,0,1198947,21529 +"2020-12-05","WY",257,,0,,843,843,222,5,,,144576,0,,,385537,,,35941,31250,204,0,,,,,32083,29533,,0,417627,5342,,,,,175623,0,417627,5342 +"2020-12-04","AK",142,142,12,,794,794,151,11,,,,0,,,1008002,,23,34041,,750,0,,,,,41298,,,0,1050369,9864,,,,,,0,1050369,9864 +"2020-12-04","AL",3831,3411,55,420,26331,26331,1875,269,2274,,1407299,7289,,,,1312,,264199,219069,3840,0,,,,,,168387,,0,1626368,10420,,,74069,,1626368,10420,,0 +"2020-12-04","AR",2586,2370,31,216,9329,9329,1041,123,,373,1589776,13097,,,1589776,1034,191,167137,144910,2827,0,,,,26989,,146496,,0,1734686,15285,,,,152332,,0,1734686,15285 +"2020-12-04","AS",0,,0,,,,,0,,,2140,152,,,,,,0,0,0,0,,,,,,,,0,2140,152,,,,,,0,2140,152 +"2020-12-04","AZ",6885,6370,64,515,27738,27738,2899,282,,666,1986277,16441,,,,,412,352101,340467,5680,0,,,,,,,,0,4012371,46993,,,368963,,2326744,21660,4012371,46993 +"2020-12-04","CA",19582,,145,,,,9948,0,,2248,,0,,,,,,1286557,1286557,22018,0,,,,,,,,0,24675478,200836,,,,,,0,24675478,200836 +"2020-12-04","CO",3338,2831,18,507,14762,14762,1883,183,,,1574219,13363,194770,,,,,252222,241425,5013,0,18530,,,,,,3397074,53979,3397074,53979,213300,,,,1815644,18267,,0 +"2020-12-04","CT",5146,4143,35,1003,12257,12257,1150,0,,,,0,,,3592668,,,127715,119584,1538,0,,4927,,,159958,,,0,3758037,37036,,64103,,,,0,3758037,37036 +"2020-12-04","DC",693,,1,,,,194,0,,51,,0,,,,,21,22480,,316,0,,,,,,16374,718242,8251,718242,8251,,,,,313394,2045,,0 +"2020-12-04","DE",782,688,3,94,,,288,0,,37,396669,2365,,,,,,38398,36986,942,0,,,,,38516,18371,760804,4175,760804,4175,,,,,435067,3307,,0 +"2020-12-04","FL",19236,,124,,56809,56809,4334,282,,,6421830,45549,578113,560932,10069429,,,1022354,925841,9898,0,71851,,69600,,1326319,,12857097,121877,12857097,121877,650372,,630838,,7444184,55447,11448922,106388 +"2020-12-04","GA",9725,8922,77,803,35783,35783,2749,212,6642,,,0,,,,,,494354,438300,6376,0,36979,,,,410848,,,0,4435020,38355,368962,,,,,0,4435020,38355 +"2020-12-04","GU",113,,1,,,,39,0,,8,79571,555,,,,,6,6959,6827,17,0,12,153,,,,6056,,0,86530,572,227,2591,,,,0,86398,580 +"2020-12-04","HI",256,256,10,,1315,1315,51,11,,14,,0,,,,,12,18605,18290,121,0,,,,,18217,,686756,3021,686756,3021,,,,,,0,,0 +"2020-12-04","IA",2605,,83,,,,1000,0,,209,879325,3809,,72136,,,128,210236,210236,2267,0,,,5076,30055,,152331,,0,1089561,6076,,,77252,146793,1091778,6121,,0 +"2020-12-04","ID",1014,927,23,87,4271,4271,466,71,791,108,394453,2178,,,,,,106455,89739,1721,0,,,,,,42274,,0,484192,3492,,45253,,,484192,3492,732469,5996 +"2020-12-04","IL",13782,12974,157,808,,,5453,0,,1153,,0,,,,,703,770088,,10526,0,,,,,,,,0,10918998,112634,,,,,,0,10918998,112634 +"2020-12-04","IN",6122,5832,89,290,27672,27672,3289,436,4990,955,1904853,11419,,,,,383,367329,,7899,0,,,,,334650,,,0,4464492,61536,,,,,2272182,19318,4464492,61536 +"2020-12-04","KS",1786,,107,,5417,5417,1143,127,1453,283,676891,7770,,,,409,123,168295,,6234,0,,,,,,,,0,845186,14004,,,,,845186,14004,,0 +"2020-12-04","KY",2039,1941,25,98,10560,10560,1792,249,2551,409,,0,,,,,230,194193,160166,3592,0,,,,,,30071,,0,2699681,11519,96018,119687,,,,0,2699681,11519 +"2020-12-04","LA",6548,6274,24,274,,,1357,0,,,3319357,21534,,,,,154,247177,232479,3099,0,,,,,,202891,,0,3566534,24633,,120846,,,,0,3551836,23984 +"2020-12-04","MA",10910,10674,36,236,14397,14397,1394,0,,278,3207957,21018,,,,,134,246398,237456,5491,0,,,12193,,295839,169809,,0,8774697,96701,,,133429,275819,3445413,26210,8774697,96701 +"2020-12-04","MD",4790,4630,26,160,21756,21756,1594,198,,367,2194096,16154,,144346,,,,209191,209191,3792,0,,,15776,,250295,8751,,0,4583228,55912,,,160122,,2403287,19946,4583228,55912 +"2020-12-04","ME",224,222,4,2,751,751,164,11,,45,,0,12438,,,,17,12844,11390,290,0,409,989,,,15247,9877,,0,894518,11599,12859,27549,,,,0,894518,11599 +"2020-12-04","MI",10117,9661,82,456,,,4141,0,,855,,0,,,6479892,,513,420268,389032,9425,0,,,,,493278,165269,,0,6973170,68645,375457,,,,,0,6973170,68645 +"2020-12-04","MN",3845,3759,61,86,17828,17828,1679,205,3942,367,2269217,18469,,,,,,338973,331139,5347,0,,,,,,293151,4322340,55360,4322340,55360,,117388,,,2600356,23544,,0 +"2020-12-04","MO",4122,,20,,,,2803,0,,659,1530641,5605,87810,,2794542,,368,313421,313421,4053,0,8676,21352,,,346857,,,0,3147554,22857,96691,141709,91371,82317,1844062,9658,3147554,22857 +"2020-12-04","MP",2,2,0,,4,4,,0,,,17010,0,,,,,,106,106,0,0,,,,,,29,,0,17116,0,,,,,17116,0,23944,0 +"2020-12-04","MS",3916,3379,37,537,7486,7486,1188,0,,276,982395,0,,,,,156,161516,125865,2480,0,,,,,,128746,,0,1143911,2480,51554,210647,,,,0,1104632,0 +"2020-12-04","MT",727,,5,,2810,2810,483,48,,81,,0,,,,,43,66436,,1314,0,,,,,,49217,,0,675262,6181,,,,,,0,675262,6181 +"2020-12-04","NC",5467,5279,57,188,,,2157,0,,505,,0,,,,,,382534,358467,5303,0,,,,,,,,0,5352128,52700,,138473,,,,0,5352128,52700 +"2020-12-04","ND",995,,12,,2842,2842,324,29,444,48,273247,669,11242,,,,,83604,81906,891,0,1105,,,,,75653,1116803,10295,1116803,10295,12347,6799,,,355196,1513,1175440,11173 +"2020-12-04","NE",1159,,31,,4479,4479,845,54,,,623122,2671,,,1266908,,,134710,,2180,0,,,,,153194,67336,,0,1421703,15380,,,,,758194,4856,1421703,15380 +"2020-12-04","NH",552,,8,,844,844,159,0,281,,414706,2244,,,,,,23690,19058,765,0,,,,,,18418,,0,845200,6500,34379,,33462,,433764,2737,845200,6500 +"2020-12-04","NJ",17255,15419,46,1836,42163,42163,3315,176,,615,5825837,0,,,,,386,389478,356662,6426,0,,,,,,,,0,6215315,6426,,,,,,0,6176836,0 +"2020-12-04","NM",1706,,33,,7184,7184,934,106,,,,0,,,,,,104935,,2073,0,,,,,,35781,,0,1620383,15469,,,,,,0,1620383,15469 +"2020-12-04","NV",2272,,23,,,,1678,0,,356,842221,2565,,,,,204,162434,162434,2902,0,,,,,,,1696894,14136,1696894,14136,,,,,1004655,5467,,0 +"2020-12-04","NY",27017,,62,,89995,89995,4222,0,,795,,0,,,,,377,685364,,11271,0,,,,,,,20173461,208297,20173461,208297,,,,,,0,,0 +"2020-12-04","OH",6882,6431,129,451,28673,28673,5092,392,4847,1208,,0,,,,,714,456963,432324,10114,0,,21382,,,461409,306950,,0,6335310,61600,,468973,,,,0,6335310,61600 +"2020-12-04","OK",1860,,24,,12949,12949,1687,176,,482,1982769,25328,,,1982769,,,208875,,4827,0,6248,,,,213944,177564,,0,2191644,30155,97315,,,,,0,2199782,28317 +"2020-12-04","OR",973,,20,,4803,4803,629,58,,122,,0,,,1929118,,52,79263,,1103,0,,,,,113929,,,0,2043047,21382,,,,,,-1043744,2043047,21382 +"2020-12-04","PA",11113,,169,,,,5230,0,,1065,2893321,20764,,,,,596,398600,369511,11763,0,,,,,,231188,5956454,79242,5956454,79242,,,,,3262832,31650,,0 +"2020-12-04","PR",1173,943,18,229,,,651,0,,92,305972,0,,,395291,,108,54597,52784,492,0,41785,,,,20103,46476,,0,360569,492,,,,,,0,415664,0 +"2020-12-04","RI",1413,,13,,4843,4843,408,54,,45,482922,2168,,,1533056,,29,62137,,1415,0,,,,,75792,,1608848,14841,1608848,14841,,,,,545059,3583,,0 +"2020-12-04","SC",4496,4175,30,321,12223,12223,1047,97,,233,2248886,22849,79476,,2182682,,104,226013,210995,2950,0,12084,27834,,,277199,118168,,0,2474899,25799,91560,245691,,,,0,2459881,25409 +"2020-12-04","SD",1064,,31,,4748,4748,516,52,,111,252114,765,,,,,64,84398,78153,1050,0,,,,,84194,67409,,0,529909,3933,,,,,336512,1815,529909,3933 +"2020-12-04","TN",4876,4439,95,437,12488,12488,2751,78,,652,,0,,,4195346,,325,392608,360201,4356,0,,33795,,,423591,351553,,0,4618937,24980,,334645,,,,0,4618937,24980 +"2020-12-04","TX",22255,,255,,,,9015,0,,2645,,0,,,,,,1350542,1228812,16796,0,62869,65042,,,1372627,1012700,,0,11497555,113648,583553,791698,,,,0,11497555,113648 +"2020-12-04","UT",925,,8,,8652,8652,603,104,1528,203,1165332,9606,,,1679971,550,,209170,,3005,0,,18865,,18140,207685,146320,,0,1887656,21599,,252295,,113262,1357711,13263,1887656,21599 +"2020-12-04","VA",4160,3805,13,355,15116,15116,1854,102,,413,,0,,,,,187,247380,217588,2877,0,13429,26246,,,258264,,3386624,25623,3386624,25623,166524,381849,,,,0,,0 +"2020-12-04","VI",23,,0,,,,,0,,,27502,82,,,,,,1613,,24,0,,,,,,1502,,0,29115,106,,,,,29189,99,,0 +"2020-12-04","VT",77,77,2,,,,33,0,,3,225346,2268,,,,,,4763,4637,73,0,,,,,,2818,,0,572870,5803,,,,,230109,2685,572870,5803 +"2020-12-04","WA",2900,2900,50,,11195,11195,1097,241,,278,,0,,,,,137,188469,182557,3312,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-12-04","WI",3842,3625,69,217,17943,17943,1660,202,1865,371,2180320,10350,,,,,,432207,404555,5673,0,,,,,,337653,4556566,39104,4556566,39104,,,,,2584875,15197,,0 +"2020-12-04","WV",799,756,10,43,,,632,0,,169,,0,,,,,92,52172,44058,1147,0,,,,,,33657,,0,1177418,16784,21519,,,,,0,1177418,16784 +"2020-12-04","WY",257,,0,,838,838,222,15,,,144576,1299,,,377427,,,35737,31047,659,0,,,,,30891,28468,,0,412285,0,,,,,175623,1828,412285,0 +"2020-12-03","AK",130,130,8,,783,783,157,15,,,,0,,,998843,,24,33291,,760,0,,,,,40607,,,0,1040505,15862,,,,,,0,1040505,15862 +"2020-12-03","AL",3776,3375,65,401,26062,26062,1827,241,2259,,1400010,9659,,,,1302,,260359,215938,3531,0,,,,,,168387,,0,1615948,12425,,,73588,,1615948,12425,,0 +"2020-12-03","AR",2555,2343,33,212,9206,9206,1072,96,,375,1576679,14118,,,1576679,1025,190,164310,142722,2789,0,,,,26171,,144624,,0,1719401,16135,,,,149069,,0,1719401,16135 +"2020-12-03","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-12-03","AZ",6821,6310,82,511,27456,27456,2743,1144,,642,1969836,11949,,,,,386,346421,335248,5442,0,,,,,,,,0,3965378,50731,,,367830,,2305084,16880,3965378,50731 +"2020-12-03","CA",19437,,113,,,,9702,0,,2147,,0,,,,,,1264539,1264539,18591,0,,,,,,,,0,24474642,175516,,,,,,0,24474642,175516 +"2020-12-03","CO",3320,2819,127,501,14579,14579,1956,216,,,1560856,12178,191093,,,,,247209,236521,6037,0,17594,,,,,,3343095,54195,3343095,54195,210946,,,,1797377,17994,,0 +"2020-12-03","CT",5111,4112,20,999,12257,12257,1191,0,,,,0,,,3558711,,,126177,118191,4751,0,,4759,,,156930,,,0,3721001,41115,,62592,,,,0,3721001,41115 +"2020-12-03","DC",692,,2,,,,185,0,,49,,0,,,,,17,22164,,322,0,,,,,,16268,709991,8506,709991,8506,,,,,311349,3185,,0 +"2020-12-03","DE",779,685,0,94,,,277,0,,33,394304,2469,,,,,,37456,36051,758,0,,,,,38106,18066,756629,8590,756629,8590,,,,,431760,3227,,0 +"2020-12-03","FL",19112,,100,,56527,56527,4286,258,,,6376281,39894,578113,560932,9976965,,,1012456,918318,10656,0,71851,,69600,,1312789,,12735220,119339,12735220,119339,650372,,630838,,7388737,50550,11342534,100320 +"2020-12-03","GA",9648,8879,81,769,35571,35571,2691,245,6599,,,0,,,,,,487978,433353,5839,0,36562,,,,406225,,,0,4396665,33701,367023,,,,,0,4396665,33701 +"2020-12-03","GU",112,,0,,,,39,0,,9,79016,450,,,,,7,6942,6802,22,0,12,127,,,,6030,,0,85958,472,227,2308,,,,0,85818,470 +"2020-12-03","HI",246,246,2,,1304,1304,57,13,,20,,0,,,,,15,18484,18186,142,0,,,,,18179,,683735,6290,683735,6290,,,,,,0,,0 +"2020-12-03","IA",2522,,73,,,,1124,0,,224,875516,3260,,71784,,,131,207969,207969,2196,0,,,5019,29491,,147169,,0,1083485,5456,,,76843,145053,1085657,5464,,0 +"2020-12-03","ID",991,905,31,86,4200,4200,466,65,780,108,392275,2446,,,,,,104734,88425,1429,0,,,,,,41838,,0,480700,3452,,31219,,,480700,3452,726473,5838 +"2020-12-03","IL",13625,12830,228,795,,,5653,0,,1170,,0,,,,,693,759562,,10959,0,,,,,,,,0,10806364,106778,,,,,,0,10806364,106778 +"2020-12-03","IN",6033,5748,60,285,27236,27236,3362,382,4931,987,1893434,12302,,,,,399,359430,,8460,0,,,,,327467,,,0,4402956,60470,,,,,2252864,20762,4402956,60470 +"2020-12-03","KS",1679,,0,,5290,5290,854,0,1390,227,669121,0,,,,409,92,162061,,0,0,,,,,,,,0,831182,0,,,,,831182,0,,0 +"2020-12-03","KY",2014,1922,34,92,10311,10311,1810,121,2503,415,,0,,,,,240,190601,157319,3836,0,,,,,,28755,,0,2688162,68353,95876,118795,,,,0,2688162,68353 +"2020-12-03","LA",6524,6252,23,272,,,1325,0,,,3297823,20659,,,,,142,244078,230029,2743,0,,,,,,202891,,0,3541901,23402,,117154,,,,0,3527852,22908 +"2020-12-03","MA",10874,10637,50,237,14397,14397,1324,258,,261,3186939,25748,,,,,137,240907,232264,6675,0,,,12193,,289972,169809,,0,8677996,111734,,,133429,272797,3419203,32225,8677996,111734 +"2020-12-03","MD",4764,4606,49,158,21558,21558,1573,163,,364,2177942,9939,,144346,,,,205399,205399,2044,0,,,15776,,245667,8675,,0,4527316,31305,,,160122,,2383341,11983,4527316,31305 +"2020-12-03","ME",220,218,2,2,740,740,138,15,,46,,0,12397,,,,15,12554,11151,346,0,406,866,,,14734,9733,,0,882919,9235,12815,25228,,,,0,882919,9235 +"2020-12-03","MI",10035,9580,193,455,,,4175,0,,840,,0,,,6420956,,502,410843,380343,7957,0,,,,,483569,165269,,0,6904525,73467,373357,,,,,0,6904525,73467 +"2020-12-03","MN",3784,3701,92,83,17623,17623,1770,245,3911,376,2250748,14306,,,,,,333626,326064,6149,0,,,,,,290019,4266980,48363,4266980,48363,,112630,,,2576812,20069,,0 +"2020-12-03","MO",4102,,59,,,,2758,0,,659,1525036,5031,87487,,2776013,,376,309368,309368,3998,0,8493,20436,,,342557,,,0,3124697,20958,96185,136257,90953,80020,1834404,9029,3124697,20958 +"2020-12-03","MP",2,2,0,,4,4,,0,,,17010,0,,,,,,106,106,0,0,,,,,,29,,0,17116,0,,,,,17116,0,23944,0 +"2020-12-03","MS",3879,3361,28,518,7486,7486,1160,0,,277,982395,0,,,,,137,159036,124693,2168,0,,,,,,128746,,0,1141431,2168,51554,210647,,,,0,1104632,0 +"2020-12-03","MT",722,,9,,2762,2762,474,29,,87,,0,,,,,31,65122,,782,0,,,,,,48360,,0,669081,5500,,,,,,0,669081,5500 +"2020-12-03","NC",5410,5231,44,179,,,2101,0,,500,,0,,,,,,377231,353966,5637,0,,,,,,,,0,5299428,47036,,130577,,,,0,5299428,47036 +"2020-12-03","ND",983,,11,,2813,2813,306,22,440,45,272578,1061,11242,,,,,82713,81055,1017,0,1105,,,,,74667,1106508,10169,1106508,10169,12347,6507,,,353683,2031,1164267,11037 +"2020-12-03","NE",1128,,48,,4425,4425,853,45,,,620451,2279,,,1253975,,,132530,,2336,0,,,,,150764,65740,,0,1406323,20122,,,,,753338,4617,1406323,20122 +"2020-12-03","NH",544,,7,,844,844,156,2,279,,412462,2766,,,,,,22925,18565,593,0,,,,,,18039,,0,838700,7051,34318,,33405,,431027,3211,838700,7051 +"2020-12-03","NJ",17209,15373,64,1836,41987,41987,3292,242,,610,5825837,38456,,,,,366,383052,350999,5556,0,,,,,,,,0,6208889,44012,,,,,,0,6176836,43249 +"2020-12-03","NM",1673,,44,,7078,7078,947,59,,,,0,,,,,,102862,,1899,0,,,,,,35179,,0,1604914,12692,,,,,,0,1604914,12692 +"2020-12-03","NV",2249,,48,,,,1645,0,,373,839656,5225,,,,,215,159532,159532,2536,0,,,,,,,1682758,17759,1682758,17759,,,,,999188,7761,,0 +"2020-12-03","NY",26955,,66,,89995,89995,4063,0,,783,,0,,,,,373,674093,,9855,0,,,,,,,19965164,203440,19965164,203440,,,,,,0,,0 +"2020-12-03","OH",6753,6304,82,449,28281,28281,5142,396,4814,1204,,0,,,,,708,446849,422848,8921,0,,20658,,,451709,298332,,0,6273710,53701,,458724,,,,0,6273710,53701 +"2020-12-03","OK",1836,,24,,12773,12773,1734,195,,474,1957441,16703,,,1957441,,,204048,,1707,0,6248,,,,210176,174169,,0,2161489,18410,97315,,,,,0,2171465,20054 +"2020-12-03","OR",953,,17,,4745,4745,620,96,,113,,0,,,1909535,,56,78160,,1506,0,,,,,112130,,,0,2021665,19350,,,,,1043744,5148,2021665,19350 +"2020-12-03","PA",10944,,187,,,,5071,0,,1065,2872557,19933,,,,,588,386837,358625,11406,0,,,,,,228233,5877212,71960,5877212,71960,,,,,3231182,30515,,0 +"2020-12-03","PR",1155,926,11,229,,,628,0,,98,305972,0,,,395291,,106,54105,52349,397,0,41602,,,,20103,45565,,0,360077,397,,,,,,0,415664,0 +"2020-12-03","RI",1400,,9,,4789,4789,409,57,,45,480754,2853,,,1519744,,31,60722,,1717,0,,,,,74263,,1594007,19476,1594007,19476,,,,,541476,4570,,0 +"2020-12-03","SC",4466,4145,22,321,12126,12126,1046,103,,261,2226037,13971,79104,,2160456,,111,223063,208435,2228,0,11974,27153,,,274016,117338,,0,2449100,16199,91078,239293,,,,0,2434472,15753 +"2020-12-03","SD",1033,,38,,4696,4696,538,70,,109,251349,1012,,,,,63,83348,77261,1145,0,,,,,83215,66841,,0,525976,3303,,,,,334697,2157,525976,3303 +"2020-12-03","TN",4781,4359,93,422,12410,12410,2701,100,,653,,0,,,4174509,,310,388252,356548,3967,0,,33028,,,419448,347412,,0,4593957,19682,,332014,,,,0,4593957,19682 +"2020-12-03","TX",22000,,244,,,,9151,0,,2623,,0,,,,,,1333746,1215113,17552,0,62140,63709,,,1358324,1003141,,0,11383907,116376,578670,771879,,,,0,11383907,116376 +"2020-12-03","UT",917,,11,,8548,8548,609,125,1517,209,1155726,6604,,,1662329,544,,206165,,3945,0,,18473,,17761,203728,142939,,0,1866057,17741,,246400,,110396,1344448,10089,1866057,17741 +"2020-12-03","VA",4147,3798,34,349,15014,15014,1853,131,,411,,0,,,,,186,244503,215768,2023,0,13333,25296,,,255535,,3361001,10105,3361001,10105,165936,369584,,,,0,,0 +"2020-12-03","VI",23,,0,,,,,0,,,27420,173,,,,,,1589,,26,0,,,,,,1499,,0,29009,199,,,,,29090,194,,0 +"2020-12-03","VT",75,75,1,,,,36,0,,3,223078,1614,,,,,,4690,4346,224,0,,,,,,2726,,0,567067,7492,,,,,227424,1614,567067,7492 +"2020-12-03","WA",2850,2850,45,,10954,10954,1083,34,,274,,0,,,,,135,185157,179413,3401,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-12-03","WI",3773,3562,70,211,17741,17741,1754,172,1853,376,2169970,7354,,,,,,426534,399708,5604,0,,,,,,331425,4517462,38263,4517462,38263,,,,,2569678,11972,,0 +"2020-12-03","WV",789,748,11,41,,,625,0,,169,,0,,,,,89,51025,43097,1120,0,,,,,,32808,,0,1160634,11607,21401,,,,,0,1160634,11607 +"2020-12-03","WY",257,,27,,823,823,234,14,,,143277,1811,,,377427,,,35078,30518,571,0,,,,,30891,28113,,0,412285,3960,,,,,173795,3276,412285,3960 +"2020-12-02","AK",122,122,0,,768,768,164,19,,,,0,,,984058,,23,32531,,697,0,,,,,39543,,,0,1024643,6015,,,,,,0,1024643,6015 +"2020-12-02","AL",3711,3326,73,385,25821,25821,1801,211,2252,,1390351,6546,,,,1298,,256828,213172,3928,0,,,,,,168387,,0,1603523,9681,,,73187,,1603523,9681,,0 +"2020-12-02","AR",2522,2312,10,210,9110,9110,1088,89,,393,1562561,10306,,,1562561,1002,186,161521,140705,2212,0,,,,25241,,142600,,0,1703266,11813,,,,144866,,0,1703266,11813 +"2020-12-02","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-12-02","AZ",6739,6237,52,502,26312,26312,2699,240,,642,1957887,12811,,,,,386,340979,330317,3840,0,,,,,,,,0,3914647,54038,,,365871,,2288204,16290,3914647,54038 +"2020-12-02","CA",19324,,113,,,,9365,0,,2121,,0,,,,,,1245948,1245948,20759,0,,,,,,,,0,24299126,137813,,,,,,0,24299126,137813 +"2020-12-02","CO",3193,2700,84,493,14363,14363,1995,247,,,1548678,7534,191093,,,,,241172,230705,3862,0,17594,,,,,,3288900,33359,3288900,33359,208687,,,,1779383,11285,,0 +"2020-12-02","CT",5091,4088,51,1003,12257,12257,1202,0,,,,0,,,3521123,,,121426,113468,2672,0,,4600,,,153477,,,0,3679886,42826,,60636,,,,0,3679886,42826 +"2020-12-02","DC",690,,5,,,,165,0,,41,,0,,,,,18,21842,,157,0,,,,,,16070,701485,4076,701485,4076,,,,,308164,828,,0 +"2020-12-02","DE",779,685,2,94,,,273,0,,34,391835,928,,,,,,36698,35300,355,0,,,,,37254,17907,748039,3851,748039,3851,,,,,428533,1283,,0 +"2020-12-02","FL",19012,,96,,56269,56269,4248,377,,,6336387,40478,578113,560932,9890498,,,1001800,910755,9890,0,71851,,69600,,1299132,,12615881,98399,12615881,98399,650372,,630838,,7338187,50368,11242214,89561 +"2020-12-02","GA",9567,8830,52,737,35326,35326,2644,263,6569,,,0,,,,,,482139,428980,5734,0,36263,,,,402092,,,0,4362964,23997,365326,,,,,0,4362964,23997 +"2020-12-02","GU",112,,0,,,,38,0,,10,78566,417,,,,,7,6920,6782,31,0,12,127,,,,6005,,0,85486,448,226,1972,,,,0,85348,442 +"2020-12-02","HI",244,244,0,,1291,1291,54,3,,19,,0,,,,,15,18342,18044,76,0,,,,,18036,,677445,4281,677445,4281,,,,,,0,,0 +"2020-12-02","IA",2449,,18,,,,1162,0,,226,872256,2662,,71511,,,131,205773,205773,2375,0,,,4961,29027,,142246,,0,1078029,5037,,,76512,144130,1080193,5062,,0 +"2020-12-02","ID",960,881,31,79,4135,4135,446,86,769,110,389829,1424,,,,,,103305,87419,1607,0,,,,,,41354,,0,477248,2572,,31219,,,477248,2572,720635,3657 +"2020-12-02","IL",13397,12639,266,758,,,5764,0,,1190,,0,,,,,714,748603,,9757,0,,,,,,,,0,10699586,85507,,,,,,0,10699586,85507 +"2020-12-02","IN",5973,5688,109,285,26854,26854,3441,430,4867,1001,1881132,8247,,,,,407,350970,,6597,0,,,,,320141,,,0,4342486,46499,,,,,2232102,14844,4342486,46499 +"2020-12-02","KS",1679,,119,,5290,5290,1196,185,1390,298,669121,3683,,,,409,125,162061,,4615,0,,,,,,,,0,831182,8298,,,,,831182,8298,,0 +"2020-12-02","KY",1980,1909,37,71,10190,10190,1768,0,2482,427,,0,,,,,234,186765,154260,3597,0,,,,,,28486,,0,2619809,11557,95698,115488,,,,0,2619809,11557 +"2020-12-02","LA",6501,6231,46,270,,,1288,0,,,3277164,60453,,,,,134,241335,227780,3595,0,,,,,,202891,,0,3518499,64048,,113951,,,,0,3504944,63823 +"2020-12-02","MA",10824,10588,46,236,14139,14139,1259,0,,264,3161191,18695,,,,,126,234232,225787,5027,0,,,12130,,282607,155473,,0,8566262,105845,,,132492,270281,3386978,23308,8566262,105845 +"2020-12-02","MD",4715,4558,42,157,21395,21395,1578,189,,359,2168003,11427,,144346,,,,203355,203355,2220,0,,,15776,,243152,8648,,0,4496011,35566,,,160122,,2371358,13647,4496011,35566 +"2020-12-02","ME",218,216,4,2,725,725,138,16,,46,,0,12381,,,,15,12208,10870,232,0,404,758,,,14275,9564,,0,873684,10559,12797,22470,,,,0,873684,10559 +"2020-12-02","MI",9842,9405,83,437,,,4266,0,,837,,0,,,6359136,,509,402886,373197,7433,0,,,,,471922,165269,,0,6831058,43905,370666,,,,,0,6831058,43905 +"2020-12-02","MN",3692,3613,77,79,17378,17378,1704,267,3873,354,2236442,12827,,,,,,327477,320301,5165,0,,,,,,286219,4218617,38689,4218617,38689,,107730,,,2556743,17740,,0 +"2020-12-02","MO",4043,,37,,,,2651,0,,670,1520005,3109,87140,,2759392,,354,305370,305370,2679,0,8325,19631,,,338277,,,0,3103739,14639,95670,130416,90517,76621,1825375,5788,3103739,14639 +"2020-12-02","MP",2,2,0,,4,4,,0,,,17010,0,,,,,,106,106,0,0,,,,,,29,,0,17116,0,,,,,17116,0,23944,0 +"2020-12-02","MS",3851,3346,15,505,7486,7486,1135,0,,264,982395,0,,,,,138,156868,123746,2457,0,,,,,,128746,,0,1139263,2457,51554,210647,,,,0,1104632,0 +"2020-12-02","MT",713,,15,,2733,2733,478,53,,90,,0,,,,,45,64340,,1135,0,,,,,,47533,,0,663581,2686,,,,,,0,663581,2686 +"2020-12-02","NC",5366,5192,82,174,,,2039,0,,508,,0,,,,,,371594,349280,4199,0,,,,,,,,0,5252392,26100,,124631,,,,0,5252392,26100 +"2020-12-02","ND",972,,12,,2791,2791,316,40,435,38,271517,334,11048,,,,,81696,80081,551,0,1007,,,,,73933,1096339,5195,1096339,5195,12055,5811,,,351652,818,1153230,5643 +"2020-12-02","NE",1080,,62,,4380,4380,869,64,,,618172,1855,,,1236550,,,130194,,1787,0,,,,,148080,64975,,0,1386201,15866,,,,,748721,3641,1386201,15866 +"2020-12-02","NH",537,,9,,842,842,162,1,279,,409696,3255,,,,,,22332,18120,566,0,,,,,,17101,,0,831649,6549,34261,,33348,,427816,3727,831649,6549 +"2020-12-02","NJ",17145,15309,62,1836,41745,41745,3287,440,,599,5787381,38189,,,,,354,377496,346206,5155,0,,,,,,,,0,6164877,43344,,,,,,0,6133587,47091 +"2020-12-02","NM",1629,,40,,7019,7019,940,121,,,,0,,,,,,100963,,1544,0,,,,,,34411,,0,1592222,12463,,,,,,0,1592222,12463 +"2020-12-02","NV",2201,,35,,,,1652,0,,352,834431,2542,,,,,202,156996,156996,2129,0,,,,,,,1664999,11141,1664999,11141,,,,,991427,4671,,0 +"2020-12-02","NY",26889,,73,,89995,89995,3924,0,,742,,0,,,,,373,664238,,8973,0,,,,,,,19761724,193551,19761724,193551,,,,,,0,,0 +"2020-12-02","OH",6671,6224,123,447,27885,27885,5208,436,4781,1222,,0,,,,,714,437928,414215,7835,0,,19691,,,443022,289768,,0,6220009,34473,,439166,,,,0,6220009,34473 +"2020-12-02","OK",1812,,54,,12578,12578,1782,285,,475,1940738,17270,,,1940738,,,202341,,2859,0,6248,,,,206750,170905,,0,2143079,20129,97315,,,,,0,2151411,20663 +"2020-12-02","OR",936,,24,,4649,4649,625,306,,120,,-968686,,,1892019,,56,76654,,1223,0,,,,,110296,,,0,2002315,22535,,,,,1038596,10477,2002315,22535 +"2020-12-02","PA",10757,,194,,,,4982,0,,1048,2852624,16179,,,,,565,375431,348043,8291,0,,,,,,225258,5805252,60558,5805252,60558,,,,,3200667,23574,,0 +"2020-12-02","PR",1144,918,22,226,,,638,0,,99,305972,0,,,395291,,88,53708,52009,388,0,41505,,,,20103,44947,,0,359680,388,,,,,,0,415664,0 +"2020-12-02","RI",1391,,11,,4732,4732,408,62,,45,477901,2094,,,1502098,,28,59005,,1099,0,,,,,72433,,1574531,12617,1574531,12617,,,,,536906,3193,,0 +"2020-12-02","SC",4444,4126,40,318,12023,12023,911,113,,250,2212066,13952,79007,,2146858,,118,220835,206653,1923,0,11896,26375,,,271861,116292,,0,2432901,15875,90903,231716,,,,0,2418719,15601 +"2020-12-02","SD",995,,47,,4626,4626,531,54,,107,250337,716,,,,,63,82203,76438,1291,0,,,,,82339,66351,,0,522673,2963,,,,,332540,2007,522673,2963 +"2020-12-02","TN",4688,4282,50,406,12310,12310,2744,101,,664,,0,,,4158762,,323,384285,353171,4099,0,,32306,,,415513,342115,,0,4574275,22685,,325778,,,,0,4574275,22685 +"2020-12-02","TX",21756,,207,,,,9109,0,,2544,,0,,,,,,1316194,1200674,19222,0,61488,62388,,,1343301,993151,,0,11267531,121623,575536,756314,,,,0,11267531,121623 +"2020-12-02","UT",906,,16,,8423,8423,584,144,1506,202,1149122,4875,,,1648324,543,,202220,,4004,0,,17845,,17162,199992,138995,,0,1848316,12722,,238835,,107300,1334359,7339,1848316,12722 +"2020-12-02","VA",4113,3768,20,345,14883,14883,1860,158,,427,,0,,,,,188,242480,214386,2417,0,13193,24460,,,253961,,3350896,9470,3350896,9470,165196,359184,,,,0,,0 +"2020-12-02","VI",23,,0,,,,,0,,,27247,219,,,,,,1563,,13,0,,,,,,1497,,0,28810,232,,,,,28896,238,,0 +"2020-12-02","VT",74,74,2,,,,33,0,,4,221464,679,,,,,,4466,4346,101,0,,,,,,2655,,0,559575,3942,,,,,225810,777,559575,3942 +"2020-12-02","WA",2805,2805,31,,10920,10920,1077,25,,284,,0,,,,,128,181756,176278,4702,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-12-02","WI",3703,3502,92,201,17569,17569,1780,197,1835,397,2162616,6206,,,,,,420930,395090,4565,0,,,,,,325587,4479199,26098,4479199,26098,,,,,2557706,9983,,0 +"2020-12-02","WV",778,739,20,39,,,622,0,,164,,0,,,,,88,49905,42269,1087,0,,,,,,32002,,0,1149027,10251,21226,,,,,0,1149027,10251 +"2020-12-02","WY",230,,0,,809,809,234,16,,,141466,0,,,374015,,,34507,29966,702,0,,,,,30297,26568,,0,408325,-11262,,,,,170519,0,408325,-11262 +"2020-12-01","AK",122,122,1,,749,749,155,24,,,,0,,,978681,,21,31834,,511,0,,,,,38921,,,0,1018628,7232,,,,,,0,1018628,7232 +"2020-12-01","AL",3638,3280,60,358,25610,25610,1785,272,2242,,1383805,7481,,,,1291,,252900,210037,3376,0,,,,,,161946,,0,1593842,9495,,,71828,,1593842,9495,,0 +"2020-12-01","AR",2512,2304,10,208,9021,9021,1074,84,,403,1552255,6854,,,1552255,994,195,159309,139198,1950,0,,,,24423,,140682,,0,1691453,7996,,,,141607,,0,1691453,7996 +"2020-12-01","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-12-01","AZ",6687,6191,48,496,26072,26072,2594,286,,597,1945076,8127,,,,,369,337139,326838,10322,0,,,,,,,,0,3860609,57515,,,365224,,2271914,18225,3860609,57515 +"2020-12-01","CA",19211,,70,,,,9049,0,,2000,,0,,,,,,1225189,1225189,12221,0,,,,,,,,0,24161313,136142,,,,,,0,24161313,136142 +"2020-12-01","CO",3109,2619,72,490,14116,14116,1977,628,,,1541144,9800,189562,,,,,237310,226954,4405,0,17222,,,,,,3255541,36690,3255541,36690,207350,,,,1768098,14051,,0 +"2020-12-01","CT",5040,4045,20,995,12257,12257,1152,0,,,,0,,,3481846,,,118754,111025,1459,0,,4225,,,149984,,,0,3637060,40059,,56559,,,,0,3637060,40059 +"2020-12-01","DC",685,,5,,,,160,0,,43,,0,,,,,18,21685,,133,0,,,,,,15914,697409,2153,697409,2153,,,,,307336,889,,0 +"2020-12-01","DE",777,683,5,94,,,246,0,,33,390907,2219,,,,,,36343,34963,689,0,,,,,36848,17713,744188,3754,744188,3754,,,,,427250,2908,,0 +"2020-12-01","FL",18916,,82,,55892,55892,4282,338,,,6295909,39477,578113,560932,9813706,,,991910,904354,8540,0,71851,,69600,,1286624,,12517482,89717,12517482,89717,650372,,630838,,7287819,48017,11152653,87019 +"2020-12-01","GA",9515,8798,63,717,35063,35063,2634,239,6536,,,0,,,,,,476405,424929,4842,0,36148,,,,398641,,,0,4338967,24519,364644,,,,,0,4338967,24519 +"2020-12-01","GU",112,,0,,,,46,0,,10,78149,582,,,,,4,6889,6757,37,0,12,127,,,,5846,,0,85038,619,225,1662,,,,0,84906,617 +"2020-12-01","HI",244,244,0,,1288,1288,56,1,,24,,0,,,,,7,18266,17968,43,0,,,,,17931,,673164,3402,673164,3402,,,,,,0,,0 +"2020-12-01","IA",2431,,28,,,,1172,0,,235,869594,1188,,71228,,,144,203398,203398,988,0,,,4899,28011,,137431,,0,1072992,2176,,,76167,141534,1075131,2198,,0 +"2020-12-01","ID",929,854,9,75,4049,4049,446,71,756,110,388405,799,,,,,,101698,86271,1214,0,,,,,,40929,,0,474676,1639,,31219,,,474676,1639,716978,3676 +"2020-12-01","IL",13131,12403,146,728,,,5835,0,,1195,,0,,,,,721,738846,,12542,0,,,,,,,,0,10614079,116081,,,,,,0,10614079,116081 +"2020-12-01","IN",5864,5598,141,266,26424,26424,3460,406,4794,990,1872885,7281,,,,,386,344373,,5396,0,,,,,313886,,,0,4295987,36023,,,,,2217258,12677,4295987,36023 +"2020-12-01","KS",1560,,0,,5105,5105,854,0,1353,227,665438,0,,,,395,92,157446,,0,0,,,,,,,,0,822884,0,,,,,822884,0,,0 +"2020-12-01","KY",1943,1874,35,69,10190,10190,1777,136,2482,441,,0,,,,,241,183168,151528,4127,0,,,,,,28486,,0,2608252,25132,95530,112401,,,,0,2608252,25132 +"2020-12-01","LA",6455,6194,35,261,,,1280,0,,,3216711,45406,,,,,128,237740,224410,5326,0,,,,,,192488,,0,3454451,50732,,111778,,,,0,3441121,49395 +"2020-12-01","MA",10778,10542,30,236,14139,14139,1191,0,,239,3142496,15282,,,,,130,229205,221174,3073,0,,,12130,,277245,155473,,0,8460417,59833,,,132492,265989,3363670,18127,8460417,59833 +"2020-12-01","MD",4673,4516,32,157,21206,21206,1583,155,,350,2156576,10037,,143097,,,,201135,201135,2765,0,,,15413,,240267,8613,,0,4460445,30696,,,158510,,2357711,12802,4460445,30696 +"2020-12-01","ME",214,213,20,1,709,709,139,10,,48,,0,12359,,,,22,11976,10675,219,0,399,664,,,13741,9364,,0,863125,4206,12770,19316,,,,0,863125,4206 +"2020-12-01","MI",9759,9324,195,435,,,4310,0,,874,,0,,,6321136,,526,395453,366242,6511,0,,,,,466017,165269,,0,6787153,38421,369466,,,,,0,6787153,38421 +"2020-12-01","MN",3615,3543,22,72,17111,17111,1840,320,3826,394,2223615,6035,,,,,,322312,315388,3549,0,,,,,,279540,4179928,23306,4179928,23306,,104895,,,2539003,9330,,0 +"2020-12-01","MO",4006,,177,,,,2599,0,,656,1516896,2965,86964,,2747704,,344,302691,302691,2929,0,8218,18677,,,335364,,,0,3089100,12723,95387,123814,90280,73469,1819587,5894,3089100,12723 +"2020-12-01","MP",2,2,0,,4,4,,0,,,17010,263,,,,,,106,106,0,0,,,,,,29,,0,17116,263,,,,,17116,265,23944,0 +"2020-12-01","MS",3836,3334,29,502,7486,7486,1158,0,,250,982395,0,,,,,142,154411,122764,1141,0,,,,,,128746,,0,1136806,1141,51554,210647,,,,0,1104632,0 +"2020-12-01","MT",698,,17,,2680,2680,495,58,,88,,0,,,,,46,63205,,1007,0,,,,,,46350,,0,660895,4874,,,,,,0,660895,4874 +"2020-12-01","NC",5284,5123,23,161,,,2033,0,,485,,0,,,,,,367395,345906,2883,0,,,,,,,,0,5226292,22913,,118261,,,,0,5226292,22913 +"2020-12-01","ND",960,,27,,2751,2751,320,43,430,35,271183,218,11048,,,,,81145,79597,466,0,1007,,,,,73015,1091144,3055,1091144,3055,12055,5463,,,350834,617,1147587,3331 +"2020-12-01","NE",1018,,29,,4316,4316,907,39,,,616317,2416,,,1222719,,,128407,,1941,0,,,,,146049,64485,,0,1370335,16164,,,,,745080,4356,1370335,16164 +"2020-12-01","NH",528,,2,,841,841,160,2,279,,406441,2233,,,,,,21766,17648,772,0,,,,,,16216,,0,825100,7941,34218,,33186,,424089,2828,825100,7941 +"2020-12-01","NJ",17083,15254,90,1829,41305,41305,3129,92,,601,5749192,0,,,,,359,372341,341910,5443,0,,,,,,,,0,6121533,5443,,,,,,0,6086496,0 +"2020-12-01","NM",1589,,21,,6898,6898,909,116,,,,0,,,,,,99419,,2324,0,,,,,,33458,,0,1579759,21468,,,,,,0,1579759,21468 +"2020-12-01","NV",2166,,22,,,,1589,0,,344,831889,4209,,,,,198,154867,154867,2698,0,,,,,,,1653858,15759,1653858,15759,,,,,986756,6907,,0 +"2020-12-01","NY",26816,,69,,89995,89995,3774,0,,718,,0,,,,,348,655265,,7285,0,,,,,,,19568173,146675,19568173,146675,,,,,,0,,0 +"2020-12-01","OH",6548,6111,119,437,27449,27449,5226,585,4729,1233,,0,,,,,693,430093,406780,9030,0,,18371,,,436434,280716,,0,6185536,48466,,414433,,,,0,6185536,48466 +"2020-12-01","OK",1758,,15,,12293,12293,1718,35,,461,1923468,50000,,,1923468,,,199482,,1737,0,6248,,,,203926,167406,,0,2122950,51737,97315,,,,,0,2130748,58811 +"2020-12-01","OR",912,,7,,4343,4343,584,0,,117,968686,0,,,1871210,,50,75431,,1311,0,,,,,108570,,,0,1979780,12383,,,,,1028119,0,1979780,12383 +"2020-12-01","PA",10563,,180,,,,4744,0,,967,2836445,8396,,,,,524,367140,340648,5676,0,,,,,,220284,5744694,44302,5744694,44302,,,,,3177093,13133,,0 +"2020-12-01","PR",1122,897,16,225,,,638,0,,101,305972,0,,,395291,,85,53320,51647,775,0,41279,,,,20103,43987,,0,359292,775,,,,,,0,415664,0 +"2020-12-01","RI",1380,,7,,4670,4670,410,88,,41,475807,2646,,,1490762,,23,57906,,1183,0,,,,,71152,,1561914,11754,1561914,11754,,,,,533713,3829,,0 +"2020-12-01","SC",4404,4091,23,313,11910,11910,980,33,,201,2198114,16138,78915,,2133438,,84,218912,205004,1425,0,11862,25722,,,269680,115152,,0,2417026,17563,90777,225071,,,,0,2403118,17483 +"2020-12-01","SD",948,,2,,4572,4572,547,70,,106,249621,1233,,,,,59,80912,75391,448,0,,,,,81599,65876,,0,519710,2711,,,,,330533,1681,519710,2711 +"2020-12-01","TN",4638,4240,36,398,12209,12209,2632,113,,646,,0,,,4140172,,317,380186,349543,5693,0,,31666,,,411418,336131,,0,4551590,35935,,322042,,,,0,4551590,35935 +"2020-12-01","TX",21549,,170,,,,9047,0,,2583,,0,,,,,,1296972,1184250,18540,0,61129,60962,,,1327560,976517,,0,11145908,135034,573566,738089,,,,0,11145908,135034 +"2020-12-01","UT",890,,19,,8279,8279,587,144,1498,205,1144247,4559,,,1638272,543,,198216,,2510,0,,17326,,16654,197322,136709,,0,1835594,11548,,232796,,105205,1327020,6356,1835594,11548 +"2020-12-01","VA",4093,3750,31,343,14725,14725,1757,106,,398,,0,,,,,173,240063,212916,2228,0,13134,23481,,,252516,,3341426,15099,3341426,15099,164852,347973,,,,0,,0 +"2020-12-01","VI",23,,0,,,,,0,,,27028,245,,,,,,1550,,6,0,,,,,,1493,,0,28578,251,,,,,28658,260,,0 +"2020-12-01","VT",72,72,3,,,,32,0,,2,220785,1196,,,,,,4365,4248,69,0,,,,,,2564,,0,555633,2679,,,,,225033,1259,555633,2679 +"2020-12-01","WA",2774,2774,71,,10895,10895,1003,136,,260,,0,,,,,113,177054,171778,1314,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-12-01","WI",3611,3420,117,191,17372,17372,1827,277,1824,415,2156410,6414,,,,,,416365,391313,4635,0,,,,,,319426,4453101,27071,4453101,27071,,,,,2547723,10492,,0 +"2020-12-01","WV",758,720,23,38,,,595,0,,166,,0,,,,,81,48818,41561,976,0,,,,,,31139,,0,1138776,10781,21163,,,,,0,1138776,10781 +"2020-12-01","WY",230,,15,,793,793,239,9,,,141466,0,,,387265,,,33805,29389,500,0,,,,,32316,26003,,0,419587,0,,,,,170519,0,419587,0 +"2020-11-30","AK",121,121,0,,725,725,162,3,,,,0,,,971946,,27,31323,,507,0,,,,,38426,,,0,1011396,5216,,,,,,0,1011396,5216 +"2020-11-30","AL",3578,3246,1,332,25338,25338,1717,668,2237,,1376324,2554,,,,1288,,249524,208023,2295,0,,,,,,161946,,0,1584347,4634,,,71698,,1584347,4634,,0 +"2020-11-30","AR",2502,2295,32,207,8937,8937,1063,94,,407,1545401,6663,,,1545401,989,211,157359,138056,1112,0,,,,23474,,138696,,0,1683457,7629,,,,136774,,0,1683457,7629 +"2020-11-30","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-30","AZ",6639,6152,5,487,25786,25786,2513,218,,579,1936949,16630,,,,,352,326817,316740,822,0,,,,,,,,0,3803094,22500,,,364625,,2253689,17364,3803094,22500 +"2020-11-30","CA",19141,,20,,,,8578,0,,1919,,0,,,,,,1212968,1212968,14034,0,,,,,,,,0,24025171,217670,,,,,,0,24025171,217670 +"2020-11-30","CO",3037,2561,34,476,13488,13488,1940,60,,,1531344,12038,189136,,,,,232905,222703,4133,0,17152,,,,,,3218851,43725,3218851,43725,206784,,,,1754047,16095,,0 +"2020-11-30","CT",5020,4025,59,995,12257,12257,1098,0,,,,0,,,3444912,,,117295,109491,4714,0,,4213,,,146947,,,0,3597001,13316,,56343,,,,0,3597001,13316 +"2020-11-30","DC",680,,0,,,,158,0,,43,,0,,,,,17,21552,,104,0,,,,,,15746,695256,4914,695256,4914,,,,,306447,884,,0 +"2020-11-30","DE",772,679,2,93,,,243,0,,33,388688,1555,,,,,,35654,34276,403,0,,,,,36473,17463,740434,10970,740434,10970,,,,,424342,1958,,0 +"2020-11-30","FL",18834,,98,,55554,55554,4159,161,,,6256432,29041,578113,560932,9738224,,,983370,899032,6426,0,71851,,69600,,1275384,,12427765,71417,12427765,71417,650372,,630838,,7239802,35467,11065634,70057 +"2020-11-30","GA",9452,8778,10,674,34824,34824,2574,42,6497,,,0,,,,,,471563,422133,2047,0,35894,,,,395848,,,0,4314448,11521,363107,,,,,0,4314448,11521 +"2020-11-30","GU",112,,0,,,,47,0,,9,77567,1134,,,,,3,6852,6722,34,0,12,127,,,,5817,,0,84419,1168,226,1349,,,,0,84289,1215 +"2020-11-30","HI",244,244,0,,1287,1287,60,0,,17,,0,,,,,14,18223,17925,85,0,,,,,17890,,669762,4525,669762,4525,,,,,,0,,0 +"2020-11-30","IA",2403,,36,,,,1162,0,,224,868406,1688,,70981,,,147,202410,202410,1143,0,,,4852,27038,,132271,,0,1070816,2831,,,75873,139206,1072933,2820,,0 +"2020-11-30","ID",920,848,7,72,3978,3978,470,30,749,92,387606,1199,,,,,,100484,85431,824,0,,,,,,40461,,0,473037,1893,,31219,,,473037,1893,713302,2900 +"2020-11-30","IL",12985,12278,103,707,,,5849,0,,1217,,0,,,,,715,726304,,6190,0,,,,,,,,0,10497998,66980,,,,,,0,10497998,66980 +"2020-11-30","IN",5723,5456,38,267,26018,26018,3401,386,4722,968,1865604,9988,,,,,389,338977,,5665,0,,,,,309723,,,0,4259964,37936,,,,,2204581,15653,4259964,37936 +"2020-11-30","KS",1560,,31,,5105,5105,854,87,1353,227,665438,6035,,,,395,92,157446,,4425,0,,,,,,,,0,822884,10460,,,,,822884,10460,,0 +"2020-11-30","KY",1908,1846,12,62,10054,10054,1741,73,2462,421,,0,,,,,229,179041,148424,2116,0,,,,,,28281,,0,2583120,34592,95483,111859,,,,0,2583120,34592 +"2020-11-30","LA",6420,6163,13,257,,,1241,0,,,3171305,844,,,,,125,232414,220421,169,0,,,,,,192488,,0,3403719,1013,,103527,,,,0,3391726,956 +"2020-11-30","MA",10748,10512,26,236,14139,14139,1174,0,,244,3127214,6491,,,,,126,226132,218329,1168,0,,,12130,,274046,155473,,0,8400584,29194,,,132492,262710,3345543,7657,8400584,29194 +"2020-11-30","MD",4641,4486,16,155,21051,21051,1527,174,,344,2146539,10147,,143097,,,,198370,198370,1923,0,,,15413,,237188,8608,,0,4429749,27350,,,158510,,2344909,12070,4429749,27350 +"2020-11-30","ME",194,193,3,1,699,699,139,7,,48,,0,12357,,,,22,11757,10487,249,0,399,655,,,13588,9098,,0,858919,4679,12768,18659,,,,0,858919,4679 +"2020-11-30","MI",9564,9134,97,430,,,4326,0,,851,,0,,,6288394,,531,388942,360449,10790,0,,,,,460338,165269,,0,6748732,106844,367228,,,,,0,6748732,106844 +"2020-11-30","MN",3593,3521,15,72,16791,16791,1840,148,3779,392,2217580,11493,,,,,,318763,312093,5794,0,,,,,,272608,4156622,39881,4156622,39881,,104184,,,2529673,16983,,0 +"2020-11-30","MO",3829,,6,,,,2498,0,,636,1513931,4828,86851,,2738248,,339,299762,299762,3829,0,8156,18231,,,332130,,,0,3076377,17868,95212,120954,90142,71946,1813693,8657,3076377,17868 +"2020-11-30","MP",2,2,0,,4,4,,0,,,16747,0,,,,,,106,106,2,0,,,,,,29,,0,16853,2,,,,,16851,0,23944,1311 +"2020-11-30","MS",3807,3313,1,494,7486,7486,1115,192,,238,982395,35123,,,,,135,153270,122237,1485,0,,,,,,128746,,0,1135665,36608,51554,210647,,,,0,1104632,39690 +"2020-11-30","MT",681,,10,,2622,2622,477,53,,84,,0,,,,,46,62198,,397,0,,,,,,45486,,0,656021,5798,,,,,,0,656021,5798 +"2020-11-30","NC",5261,5104,21,157,,,1966,0,,457,,0,,,,,,364512,343518,2734,0,,,,,,,,0,5203379,34354,,115957,,,,0,5203379,34354 +"2020-11-30","ND",933,,12,,2708,2708,333,41,425,38,270965,684,11048,,,,,80679,79191,595,0,1007,,,,,71848,1088089,7089,1088089,7089,12055,5155,,,350217,1278,1144256,7772 +"2020-11-30","NE",989,,0,,4277,4277,896,31,,,613901,1372,,,1208672,,,126466,,1143,0,,,,,143941,63562,,0,1354171,5945,,,,,740724,2519,1354171,5945 +"2020-11-30","NH",526,,0,,839,839,160,0,279,,404208,1998,,,,,,20994,17053,514,0,,,,,,15323,,0,817159,6496,34190,,33161,,421261,2285,817159,6496 +"2020-11-30","NJ",16993,15164,15,1829,41213,41213,2961,0,,575,5749192,135883,,,,,332,366898,337304,3815,0,,,,,,,,0,6116090,139698,,,,,,0,6086496,142912 +"2020-11-30","NM",1568,,28,,6782,6782,876,102,,,,0,,,,,,97095,,1678,0,,,,,,32569,,0,1558291,11120,,,,,,0,1558291,11120 +"2020-11-30","NV",2144,,8,,,,1545,0,,307,827680,2911,,,,,190,152169,152169,1642,0,,,,,,,1638099,10793,1638099,10793,,,,,979849,4553,,0 +"2020-11-30","NY",26747,,57,,89995,89995,3532,0,,681,,0,,,,,325,647980,,6819,0,,,,,,,19421498,148974,19421498,148974,,,,,,0,,0 +"2020-11-30","OH",6429,6009,30,420,26864,26864,5060,357,4682,1180,,0,,,,,682,421063,398371,6631,0,,17970,,,429541,271326,,0,6137070,50250,,410297,,,,0,6137070,50250 +"2020-11-30","OK",1743,,7,,12258,12258,1653,37,,432,1873468,0,,,1873468,,,197745,,2200,0,5828,,,,195044,163727,,0,2071213,2200,95129,,,,,0,2071937,0 +"2020-11-30","OR",905,,9,,4343,4343,569,0,,123,968686,8042,,,1860056,,50,74120,,1614,0,,,,,107341,,,0,1967397,12968,,,,,1028119,0,1967397,12968 +"2020-11-30","PA",10383,,32,,,,4631,0,,970,2828049,9172,,,,,499,361464,335911,4268,0,,,,,,216878,5700392,34820,5700392,34820,,,,,3163960,13164,,0 +"2020-11-30","PR",1106,881,12,225,,,622,0,,99,305972,0,,,395291,,84,52545,50988,843,0,40897,,,,20103,43123,,0,358517,843,,,,,,0,415664,0 +"2020-11-30","RI",1373,,8,,4582,4582,365,0,,40,473161,2075,,,1480202,,19,56723,,651,0,,,,,69958,,1550160,7114,1550160,7114,,,,,529884,2726,,0 +"2020-11-30","SC",4381,4077,28,304,11877,11877,925,20,,237,2181976,11518,78861,,2117585,,112,217487,203659,1358,0,11851,25477,,,268050,114457,,0,2399463,12876,90712,222720,,,,0,2385635,12755 +"2020-11-30","SD",946,,3,,4502,4502,546,34,,100,248388,544,,,,,57,80464,74973,564,0,,,,,81167,62334,,0,516999,2486,,,,,328852,1108,516999,2486 +"2020-11-30","TN",4602,4206,48,396,12096,12096,2534,56,,640,,0,,,4109690,,309,374493,344712,7975,0,,30559,,,405965,328710,,0,4515655,55547,,310128,,,,0,4515655,55547 +"2020-11-30","TX",21379,,22,,,,8900,0,,2536,,0,,,,,,1278432,1168111,11725,0,60825,59228,,,1309102,962639,,0,11010874,45004,571451,712553,,,,0,11010874,45004 +"2020-11-30","UT",871,,3,,8135,8135,573,59,1476,205,1139688,2913,,,1628693,533,,195706,,1897,0,,16585,,15947,195353,134296,,0,1824046,7014,,224312,,102415,1320664,4365,1824046,7014 +"2020-11-30","VA",4062,3723,4,339,14619,14619,1658,47,,376,,0,,,,,162,237835,211254,1893,0,13113,22467,,,250857,,3326327,16984,3326327,16984,164675,333151,,,,0,,0 +"2020-11-30","VI",23,,0,,,,,0,,,26783,0,,,,,,1544,,0,0,,,,,,1466,,0,28327,0,,,,,28398,0,,0 +"2020-11-30","VT",69,69,2,,,,25,0,,5,219589,900,,,,,,4296,4185,71,0,,,,,,2523,,0,552954,1963,,,,,223774,971,552954,1963 +"2020-11-30","WA",2703,2703,0,,10759,10759,989,96,,256,,0,,,,,103,175740,170525,2179,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-11-30","WI",3494,3313,7,181,17095,17095,1845,96,1808,395,2149996,6206,,,,,,411730,387235,2676,0,,,,,,315086,4426030,27880,4426030,27880,,,,,2537231,8740,,0 +"2020-11-30","WV",735,699,6,36,,,597,0,,162,,0,,,,,76,47842,40847,845,0,,,,,,30320,,0,1127995,8477,21056,,,,,0,1127995,8477 +"2020-11-30","WY",215,,0,,784,784,247,22,,,141466,2562,,,387265,,,33305,29053,816,0,,,,,32316,24478,,0,419587,26211,,,,,170519,4018,419587,26211 +"2020-11-29","AK",121,121,0,,722,722,159,1,,,,0,,,966992,,27,30816,,612,0,,,,,38165,,,0,1006180,7126,,,,,,0,1006180,7126 +"2020-11-29","AL",3577,3245,5,332,24670,24670,1609,0,2234,,1373770,3978,,,,1287,,247229,205943,2236,0,,,,,,161946,,0,1579713,5811,,,71698,,1579713,5811,,0 +"2020-11-29","AR",2470,2265,21,205,8843,8843,1030,24,,390,1538738,9224,,,1538738,975,185,156247,137090,1221,0,,,,23208,,136872,,0,1675828,10243,,,,135709,,0,1675828,10243 +"2020-11-29","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-29","AZ",6634,6148,10,486,25568,25568,2458,220,,573,1920319,15300,,,,,356,325995,316006,3221,0,,,,,,,,0,3780594,23429,,,363824,,2236325,18441,3780594,23429 +"2020-11-29","CA",19121,,32,,,,8198,0,,1823,,0,,,,,,1198934,1198934,15614,0,,,,,,,,0,23807501,234319,,,,,,0,23807501,234319 +"2020-11-29","CO",3003,2530,20,473,13428,13428,1847,59,,,1519306,9047,188172,,,,,228772,218646,3489,0,16879,,,,,,3175126,31899,3175126,31899,206288,,,,1737952,12500,,0 +"2020-11-29","CT",4961,3981,0,980,12257,12257,1017,0,,,,0,,,3432918,,,112581,104793,0,0,,3984,,,145659,,,0,3583685,17255,,53136,,,,0,3583685,17255 +"2020-11-29","DC",680,,2,,,,145,0,,42,,0,,,,,21,21448,,140,0,,,,,,15671,690342,5004,690342,5004,,,,,305563,1530,,0 +"2020-11-29","DE",770,677,7,93,,,211,0,,31,387133,2559,,,,,,35251,33876,581,0,,,,,35710,17279,729464,9274,729464,9274,,,,,422384,3140,,0 +"2020-11-29","FL",18736,,59,,55393,55393,4059,116,,,6227391,30102,578113,560932,9677126,,,976944,894389,7131,0,71851,,69600,,1266562,,12356348,85090,12356348,85090,650372,,630838,,7204335,37233,10995577,80168 +"2020-11-29","GA",9442,8778,18,664,34782,34782,2493,58,6493,,,0,,,,,,469516,420601,1952,0,35871,,,,394478,,,0,4302927,13903,362982,,,,,0,4302927,13903 +"2020-11-29","GU",112,,0,,,,44,0,,8,76433,0,,,,,3,6818,6641,36,0,12,127,,,,5521,,0,83251,36,225,1264,,,,0,83074,0 +"2020-11-29","HI",244,244,4,,1287,1287,60,0,,17,,0,,,,,14,18138,17840,56,0,,,,,17802,,665237,5517,665237,5517,,,,,,0,,0 +"2020-11-29","IA",2367,,7,,,,1175,0,,235,866718,2720,,70683,,,151,201267,201267,1584,0,,,4843,26696,,131098,,0,1067985,4304,,,75566,138472,1070113,4335,,0 +"2020-11-29","ID",913,843,4,70,3948,3948,470,70,742,92,386407,1248,,,,,,99660,84737,1160,0,,,,,,40120,,0,471144,2249,,31219,,,471144,2249,710402,3663 +"2020-11-29","IL",12882,12193,44,689,,,5858,0,,1185,,0,,,,,723,720114,,7178,0,,,,,,,,0,10431018,62740,,,,,,0,10431018,62740 +"2020-11-29","IN",5685,5418,22,267,25632,25632,3392,303,4660,951,1855616,9873,,,,,355,333312,,4304,0,,,,,304037,,,0,4222028,38627,,,,,2188928,14177,4222028,38627 +"2020-11-29","KS",1529,,0,,5018,5018,802,0,1329,221,659403,0,,,,389,73,153021,,0,0,,,,,,,,0,812424,0,,,,,812424,0,,0 +"2020-11-29","KY",1896,1834,11,62,9981,9981,1722,0,2451,408,,0,,,,,220,176925,146693,2743,0,,,,,,27998,,0,2548528,0,95118,111032,,,,0,2548528,0 +"2020-11-29","LA",6407,6152,16,255,,,1196,0,,,3170461,22320,,,,,125,232245,220309,1643,0,,,,,,192488,,0,3402706,23963,,103317,,,,0,3390770,23833 +"2020-11-29","MA",10722,10487,46,235,14139,14139,1081,0,,238,3120723,15758,,,,,110,224964,217163,2495,0,,,12130,,272685,155473,,0,8371390,48685,,,132492,262332,3337886,18259,8371390,48685 +"2020-11-29","MD",4625,4470,23,155,20877,20877,1461,164,,359,2136392,13270,,143097,,,,196447,196447,1999,0,,,15413,,234821,8607,,0,4402399,39249,,,158510,,2332839,15269,4402399,39249 +"2020-11-29","ME",191,190,0,1,692,692,125,3,,49,,0,12276,,,,18,11508,10315,220,0,391,554,,,13388,8952,,0,854240,6033,12679,16906,,,,0,854240,6033 +"2020-11-29","MI",9467,9036,0,431,,,4097,0,,832,,0,,,6196289,,472,378152,350021,0,0,,,,,445599,165269,,0,6641888,0,365318,,,,,0,6641888,0 +"2020-11-29","MN",3578,3507,57,71,16643,16643,1785,220,3750,386,2206087,35557,,,,,,312969,306603,8946,0,,,,,,265223,4116741,89486,4116741,89486,,102683,,,2512690,44232,,0 +"2020-11-29","MO",3823,,6,,,,2654,0,,657,1509103,4310,86744,,2724531,,369,295933,295933,3193,0,8090,18015,,,328018,,,0,3058509,16361,95039,120293,89994,71433,1805036,7503,3058509,16361 +"2020-11-29","MP",2,2,0,,4,4,,0,,,16747,0,,,,,,104,104,0,0,,,,,,29,,0,16851,0,,,,,16851,0,22633,0 +"2020-11-29","MS",3806,3313,27,493,7294,7294,1058,0,,245,947272,0,,,,,130,151785,121614,1845,0,,,,,,121637,,0,1099057,1845,50014,172860,,,,0,1064942,0 +"2020-11-29","MT",671,,2,,2569,2569,461,0,,88,,0,,,,,48,61801,,956,0,,,,,,44100,,0,650223,4830,,,,,,0,650223,4830 +"2020-11-29","NC",5240,5085,21,155,,,1885,0,,454,,0,,,,,,361778,340939,3820,0,,,,,,,,0,5169025,39162,,115123,,,,0,5169025,39162 +"2020-11-29","ND",921,,0,,2667,2667,337,18,417,39,270281,835,11048,,,,,80084,78596,725,0,1007,,,,,70901,1081000,8920,1081000,8920,12055,5148,,,348939,1562,1136484,9722 +"2020-11-29","NE",989,,5,,4246,4246,911,30,,,612529,2115,,,1204041,,,125323,,1257,0,,,,,142643,62686,,0,1348226,8881,,,,,738205,3372,1348226,8881 +"2020-11-29","NH",526,,3,,839,839,146,2,279,,402210,3013,,,,,,20480,16766,478,0,,,,,,14999,,0,810663,25100,34180,,33152,,418976,2818,810663,25100 +"2020-11-29","NJ",16978,15149,13,1829,41213,41213,2877,95,,559,5613309,0,,,,,304,363083,334114,4499,0,,,,,,,,0,5976392,4499,,,,,,0,5943584,0 +"2020-11-29","NM",1540,,13,,6680,6680,919,49,,,,0,,,,,,95417,,1435,0,,,,,,32050,,0,1547171,10969,,,,,,0,1547171,10969 +"2020-11-29","NV",2136,,17,,,,1460,0,,317,824769,882,,,,,162,150527,150257,1298,0,,,,,,,1627306,4490,1627306,4490,,,,,975296,2180,,0 +"2020-11-29","NY",26690,,58,,89995,89995,3372,0,,667,,0,,,,,326,641161,,6723,0,,,,,,,19272524,157320,19272524,157320,,,,,,0,,0 +"2020-11-29","OH",6399,5979,21,420,26507,26507,4908,245,4644,1142,,0,,,,,643,414432,392129,7729,0,,17569,,,422311,266341,,0,6086820,50683,,405672,,,,0,6086820,50683 +"2020-11-29","OK",1736,,19,,12221,12221,1653,141,,432,1873468,0,,,1873468,,,195545,,1721,0,5828,,,,195044,161955,,0,2069013,1721,95129,,,,,0,2071937,0 +"2020-11-29","OR",896,,11,,4343,4343,569,0,,123,960644,40,,,1848350,,50,72506,,1674,0,,,,,106079,,,0,1954429,18656,,,,,1028119,0,1954429,18656 +"2020-11-29","PA",10351,,76,,,,4405,0,,918,2818877,14413,,,,,474,357196,331919,5529,0,,,,,,214516,5665572,47955,5665572,47955,,,,,3150796,19591,,0 +"2020-11-29","PR",1094,869,11,225,,,606,0,,102,305972,0,,,395291,,87,51702,50197,121,0,40398,,,,20103,42993,,0,357674,121,,,,,,0,415664,0 +"2020-11-29","RI",1365,,2,,4582,4582,365,52,,40,471086,2675,,,1473814,,19,56072,,1055,0,,,,,69232,,1543046,12791,1543046,12791,,,,,527158,3730,,0 +"2020-11-29","SC",4353,4050,7,303,11857,11857,879,55,,236,2170458,15136,78771,,2106308,,117,216129,202422,1218,0,11831,25261,,,266572,113704,,0,2386587,16354,90602,220868,,,,0,2372880,16201 +"2020-11-29","SD",943,,1,,4468,4468,544,68,,91,247844,1567,,,,,51,79900,74518,801,0,,,,,80596,62027,,0,514513,4837,,,,,327744,2368,514513,4837 +"2020-11-29","TN",4554,4173,13,381,12040,12040,2408,35,,625,,0,,,4062405,,289,366518,337175,3052,0,,30084,,,397703,325993,,0,4460108,18742,,301754,,,,0,4460108,18742 +"2020-11-29","TX",21357,,48,,,,8634,0,,2487,,0,,,,,,1266707,1157273,7050,0,60759,58415,,,1301267,954465,,0,10965870,53232,570888,706818,,,,0,10965870,53232 +"2020-11-29","UT",868,,5,,8076,8076,575,47,1474,207,1136775,3769,,,1623277,533,,193809,,1722,0,,16378,,15751,193755,132081,,0,1817032,8947,,223171,,101928,1316299,5286,1817032,8947 +"2020-11-29","VA",4058,3719,4,339,14572,14572,1628,56,,365,,0,,,,,155,235942,209783,2325,0,13083,21982,,,249282,,3309343,14135,3309343,14135,164487,330594,,,,0,,0 +"2020-11-29","VI",23,,0,,,,,0,,,26783,49,,,,,,1544,,6,0,,,,,,1466,,0,28327,55,,,,,28398,53,,0 +"2020-11-29","VT",67,67,0,,,,21,0,,4,218689,1348,,,,,,4225,4114,70,0,,,,,,2494,,0,550991,3499,,,,,222803,1414,550991,3499 +"2020-11-29","WA",2703,2703,0,,10663,10663,983,167,,236,,0,,,,,94,173561,168419,2624,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-11-29","WI",3487,3307,23,180,16999,16999,1824,117,1801,398,2143790,5680,,,,,,409054,384701,4055,0,,,,,,311438,4398150,25061,4398150,25061,,,,,2528491,9511,,0 +"2020-11-29","WV",729,691,11,38,,,556,0,,165,,0,,,,,74,46997,40209,1152,0,,,,,,29898,,0,1119518,13727,20985,,,,,0,1119518,13727 +"2020-11-29","WY",215,,0,,762,762,225,14,,,138904,0,,,357394,,,32489,28252,560,0,,,,,27640,23022,,0,393376,0,,,,,166501,0,393376,0 +"2020-11-28","AK",121,121,2,,721,721,155,30,,,,0,,,960276,,25,30204,,650,0,,,,,37764,,,0,999054,8281,,,,,,0,999054,8281 +"2020-11-28","AL",3572,3240,0,332,24670,24670,1571,219,2231,,1369792,4552,,,,1286,,244993,204110,2119,0,,,,,,161946,,0,1573902,6189,,,71335,,1573902,6189,,0 +"2020-11-28","AR",2449,2249,13,200,8819,8819,1010,40,,399,1529514,8424,,,1529514,971,183,155026,136071,1349,0,,,,22878,,135614,,0,1665585,9591,,,,134910,,0,1665585,9591 +"2020-11-28","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-28","AZ",6624,6140,36,484,25348,25348,2383,52,,553,1905019,10368,,,,,343,322774,312865,4136,0,,,,,,,,0,3757165,27409,,,363071,,2217884,14367,3757165,27409 +"2020-11-28","CA",19089,,56,,,,7684,0,,1763,,0,,,,,,1183320,1183320,11996,0,,,,,,,,0,23573182,257264,,,,,,0,23573182,257264 +"2020-11-28","CO",2983,2511,6,472,13369,13369,1852,82,,,1510259,13805,188172,,,,,225283,215193,4330,0,16879,,,,,,3143227,51389,3143227,51389,205051,,,,1725452,18078,,0 +"2020-11-28","CT",4961,3981,0,980,12257,12257,1017,0,,,,0,,,3417579,,,112581,104793,0,0,,3984,,,143793,,,0,3566430,30037,,53136,,,,0,3566430,30037 +"2020-11-28","DC",678,,1,,,,157,0,,41,,0,,,,,16,21308,,371,0,,,,,,15603,685338,12899,685338,12899,,,,,304033,4071,,0 +"2020-11-28","DE",763,671,0,92,,,202,0,,29,384574,2685,,,,,,34670,33298,500,0,,,,,35184,17082,720190,10939,720190,10939,,,,,419244,3185,,0 +"2020-11-28","FL",18677,,81,,55277,55277,3918,128,,,6197289,30204,578113,560932,9606840,,,969813,889553,6062,0,71851,,69600,,1256914,,12271258,79276,12271258,79276,650372,,630838,,7167102,36266,10915409,63897 +"2020-11-28","GA",9424,8775,44,649,34724,34724,2370,119,6485,,,0,,,,,,467564,418936,3038,0,35775,,,,392875,,,0,4289024,30611,362341,,,,,0,4289024,30611 +"2020-11-28","GU",112,,0,,,,43,0,,9,76433,0,,,,,3,6782,6641,14,0,12,127,,,,5521,,0,83215,14,225,1264,,,,0,83074,0 +"2020-11-28","HI",240,240,0,,1287,1287,60,18,,17,,0,,,,,14,18082,17784,76,0,,,,,17744,,659720,4157,659720,4157,,,,,,0,,0 +"2020-11-28","IA",2360,,8,,,,1221,0,,244,863998,1742,,70406,,,146,199683,199683,1461,0,,,4830,26575,,130008,,0,1063681,3203,,,75276,138452,1065778,3195,,0 +"2020-11-28","ID",909,839,14,70,3878,3878,470,61,727,92,385159,2776,,,,,,98500,83736,1997,0,,,,,,39900,,0,468895,4449,,31219,,,468895,4449,706739,8483 +"2020-11-28","IL",12838,12137,152,701,,,5775,0,,1211,,0,,,,,686,712936,,7873,0,,,,,,,,0,10368278,79055,,,,,,0,10368278,79055 +"2020-11-28","IN",5663,5394,69,269,25329,25329,3381,389,4604,938,1845743,8170,,,,,356,329008,,4471,0,,,,,300487,,,0,4183401,34805,,,,,2174751,12641,4183401,34805 +"2020-11-28","KS",1529,,0,,5018,5018,802,0,1329,221,659403,0,,,,389,73,153021,,0,0,,,,,,,,0,812424,0,,,,,812424,0,,0 +"2020-11-28","KY",1885,1825,14,60,9981,9981,1722,74,2451,408,,0,,,,,220,174182,144349,2427,0,,,,,,27998,,0,2548528,19970,95118,111032,,,,0,2548528,19970 +"2020-11-28","LA",6391,6136,0,255,,,1074,0,,,3148141,0,,,,,125,230602,218796,0,0,,,,,,192488,,0,3378743,0,,102237,,,,0,3366937,0 +"2020-11-28","MA",10676,10441,41,235,14139,14139,1045,0,,225,3104965,15037,,,,,111,222469,214662,3217,0,,,12130,,269851,155473,,0,8322705,72269,,,132492,261693,3319627,17951,8322705,72269 +"2020-11-28","MD",4602,4447,33,155,20713,20713,1446,201,,351,2123122,10435,,143097,,,,194448,194448,1590,0,,,15413,,232458,8599,,0,4363150,27708,,,158510,,2317570,12025,4363150,27708 +"2020-11-28","ME",191,190,1,1,689,689,125,2,,49,,0,12276,,,,18,11288,10125,23,0,391,459,,,13032,8822,,0,848207,3190,12679,15008,,,,0,848207,3190 +"2020-11-28","MI",9467,9036,110,431,,,4097,0,,832,,0,,,6196289,,472,378152,350021,8351,0,,,,,445599,165269,,0,6641888,59320,365318,,,,,0,6641888,59320 +"2020-11-28","MN",3521,3453,45,68,16423,16423,1785,380,3715,386,2170530,39310,,,,,,304023,297928,9022,0,,,,,,257485,4027255,105119,4027255,105119,,94651,,,2468458,47874,,0 +"2020-11-28","MO",3817,,8,,,,2813,0,,665,1504793,3916,86553,,2711607,,367,292740,292740,2204,0,7993,17598,,,324613,,,0,3042148,14329,94751,119243,89751,70512,1797533,6120,3042148,14329 +"2020-11-28","MP",2,2,0,,4,4,,0,,,16747,0,,,,,,104,104,0,0,,,,,,29,,0,16851,0,,,,,16851,0,22633,0 +"2020-11-28","MS",3779,3297,10,482,7294,7294,1058,0,,245,947272,0,,,,,130,149940,120902,1553,0,,,,,,121637,,0,1097212,1553,50014,172860,,,,0,1064942,0 +"2020-11-28","MT",669,,12,,2569,2569,461,43,,99,,0,,,,,47,60845,,1049,0,,,,,,44100,,0,645393,2879,,,,,,0,645393,2879 +"2020-11-28","NC",5219,5068,9,151,,,1840,0,,450,,0,,,,,,357958,337501,3444,0,,,,,,,,0,5129863,40408,,113574,,,,0,5129863,40408 +"2020-11-28","ND",921,,13,,2649,2649,345,29,416,43,269446,607,11048,,,,,79359,77875,795,0,1007,,,,,69669,1072080,6923,1072080,6923,12055,5116,,,347377,1306,1126762,7537 +"2020-11-28","NE",984,,2,,4216,4216,931,24,,,610414,1725,,,1196600,,,124066,,1114,0,,,,,141216,61605,,0,1339345,6744,,,,,734833,2839,1339345,6744 +"2020-11-28","NH",523,,6,,837,837,133,1,276,,399197,2179,,,,,,20002,16961,689,0,,,,,,14642,,0,785563,0,34017,,33136,,416158,2868,785563,0 +"2020-11-28","NJ",16965,15136,23,1829,41118,41118,2830,136,,560,5613309,103875,,,,,305,358584,330275,4530,0,,,,,,,,0,5971893,108405,,,,,,0,5943584,116245 +"2020-11-28","NM",1527,,23,,6631,6631,854,89,,,,0,,,,,,93982,,2130,0,,,,,,31482,,0,1536202,14455,,,,,,0,1536202,14455 +"2020-11-28","NV",2119,,24,,,,1460,0,,317,823887,4459,,,,,162,149229,149229,2912,0,,,,,,,1622816,15811,1622816,15811,,,,,973116,7371,,0 +"2020-11-28","NY",26632,,44,,89995,89995,3287,0,,654,,0,,,,,331,634438,,6063,0,,,,,,,19115204,152355,19115204,152355,,,,,,0,,0 +"2020-11-28","OH",6378,5963,32,415,26262,26262,4740,302,4608,1120,,0,,,,,638,406703,384544,6895,0,,16731,,,414639,261353,,0,6036137,49840,,387007,,,,0,6036137,49840 +"2020-11-28","OK",1717,,13,,12080,12080,1653,182,,432,1873468,0,,,1873468,,,193824,,6257,0,5828,,,,195044,159894,,0,2067292,6257,95129,,,,,0,2071937,0 +"2020-11-28","OR",885,,3,,4343,4343,569,81,,123,960604,-53,,,1831334,,50,70832,,826,0,,,,,104439,,,0,1935773,20307,,,,,1028119,2398,1935773,20307 +"2020-11-28","PA",10275,,41,,,,4253,0,,914,2804464,18389,,,,,465,351667,326741,8053,0,,,,,,214516,5617617,66135,5617617,66135,,,,,3131205,25891,,0 +"2020-11-28","PR",1083,859,7,224,,,573,0,,92,305972,0,,,395291,,90,51581,50081,903,0,40367,,,,20103,42589,,0,357553,903,,,,,,0,415664,0 +"2020-11-28","RI",1363,,17,,4530,4530,349,122,,39,468411,1514,,,1462149,,19,55017,,1063,0,,,,,68106,,1530255,11234,1530255,11234,,,,,523428,2577,,0 +"2020-11-28","SC",4346,4043,0,303,11802,11802,879,8,,236,2155322,29405,78542,,2091449,,117,214911,201354,1791,0,11778,25133,,,265230,112978,,0,2370233,31196,90320,219009,,,,0,2356679,31224 +"2020-11-28","SD",942,,54,,4400,4400,539,47,,95,246277,1073,,,,,55,79099,73817,819,0,,,,,79792,61051,,0,509676,2211,,,,,325376,1892,509676,2211 +"2020-11-28","TN",4541,4163,15,378,12005,12005,2450,31,,633,,0,,,4046661,,286,363466,334511,6750,0,,29491,,,394705,323376,,0,4441366,42782,,291265,,,,0,4441366,42782 +"2020-11-28","TX",21309,,102,,,,8597,0,,2427,,0,,,,,,1259657,1151069,4325,0,60487,57538,,,1291811,950586,,0,10912638,71749,569242,701538,,,,0,10912638,71749 +"2020-11-28","UT",863,,14,,8029,8029,581,81,1470,207,1133006,4695,,,1615959,533,,192087,,2043,0,,16081,,15463,192126,129652,,0,1808085,10682,,221197,,101071,1311013,6516,1808085,10682 +"2020-11-28","VA",4054,3715,10,339,14516,14516,1585,65,,370,,0,,,,,149,233617,208169,3173,0,13056,21435,,,247942,,3295208,25498,3295208,25498,164242,327697,,,,0,,0 +"2020-11-28","VI",23,,0,,,,,0,,,26734,219,,,,,,1538,,17,0,,,,,,1453,,0,28272,236,,,,,28345,211,,0 +"2020-11-28","VT",67,67,0,,,,19,0,,2,217341,492,,,,,,4155,4048,40,0,,,,,,2474,,0,547492,1313,,,,,221389,528,547492,1313 +"2020-11-28","WA",2703,2703,-1,,10496,10496,990,254,,207,,0,,,,,83,170937,165906,530,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-11-28","WI",3464,3285,30,179,16882,16882,1843,167,1797,400,2138110,4410,,,,,,404999,380870,5473,0,,,,,,306770,4373089,21209,4373089,21209,,,,,2518980,9443,,0 +"2020-11-28","WV",718,682,6,36,,,540,0,,151,,0,,,,,63,45845,39514,799,0,,,,,,29396,,0,1105791,12802,20962,,,,,0,1105791,12802 +"2020-11-28","WY",215,,0,,748,748,225,28,,,138904,0,,,357394,,,31929,27738,156,0,,,,,27640,22798,,0,393376,-136,,,,,166501,0,393376,-136 +"2020-11-27","AK",119,119,0,,691,691,159,3,,,,0,,,952768,,25,29554,,662,0,,,,,37016,,,0,990773,21200,,,,,,0,990773,21200 +"2020-11-27","AL",3572,3240,0,332,24451,24451,1526,50,2228,,1365240,4053,,,,1284,,242874,202473,917,0,,,,,,161946,,0,1567713,4771,,,71131,,1567713,4771,,0 +"2020-11-27","AR",2436,2237,0,199,8779,8779,1011,68,,406,1521090,7888,,,1521090,966,192,153677,134904,1052,0,,,,22570,,134312,,0,1655994,8850,,,,133559,,0,1655994,8850 +"2020-11-27","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-27","AZ",6588,6106,20,482,25296,25296,2301,133,,532,1894651,20789,,,,,325,318638,308866,4312,0,,,,,,,,0,3729756,10480,,,362284,,2203517,24832,3729756,10480 +"2020-11-27","CA",19033,,54,,,,7388,0,,1726,,0,,,,,,1171324,1171324,12635,0,,,,,,,,0,23315918,219173,,,,,,0,23315918,219173 +"2020-11-27","CO",2977,2505,20,472,13287,13287,1797,39,,,1496454,13492,187345,,,,,220953,210920,4270,0,16707,,,,,,3091838,45689,3091838,45689,204052,,,,1707374,17717,,0 +"2020-11-27","CT",4961,3981,35,980,12257,12257,1017,0,,,,0,,,3390156,,,112581,104793,3429,0,,3984,,,141279,,,0,3536393,3377,,53136,,,,0,3536393,3377 +"2020-11-27","DC",677,,0,,,,149,0,,34,,0,,,,,18,20937,,201,0,,,,,,15476,672439,9238,672439,9238,,,,,299962,2529,,0 +"2020-11-27","DE",763,671,2,92,,,187,0,,31,381889,3056,,,,,,34170,32800,591,0,,,,,34554,16874,709251,3664,709251,3664,,,,,416059,3647,,0 +"2020-11-27","FL",18596,,114,,55149,55149,3748,336,,,6167085,85406,578113,560932,9551703,,,963751,884219,16795,0,71851,,69600,,1248442,,12191982,242690,12191982,242690,650372,,630838,,7130836,102201,10851512,211218 +"2020-11-27","GA",9380,8746,44,634,34605,34605,2295,18,6464,,,0,,,,,,464526,416303,3009,0,35569,,,,390028,,,0,4258413,31722,361442,,,,,0,4258413,31722 +"2020-11-27","GU",112,,1,,,,45,0,,9,76433,429,,,,,3,6768,6641,20,0,12,127,,,,5521,,0,83201,449,225,1264,,,,0,83074,490 +"2020-11-27","HI",240,240,3,,1269,1269,60,0,,17,,0,,,,,12,18006,17708,125,0,,,,,17670,,655563,5663,655563,5663,,,,,,0,,0 +"2020-11-27","IA",2352,,40,,,,1226,0,,256,862256,1624,,70353,,,141,198222,198222,1136,0,,,4789,26034,,127348,,0,1060478,2760,,,75182,136538,1062583,2778,,0 +"2020-11-27","ID",895,827,0,68,3817,3817,453,0,715,108,382383,0,,,,,,96503,82063,0,0,,,,,,39199,,0,464446,0,,31219,,,464446,0,698256,0 +"2020-11-27","IL",12686,12029,90,657,,,5829,0,,1215,,0,,,,,698,705063,,7574,0,,,,,,,,0,10289223,77130,,,,,,0,10289223,77130 +"2020-11-27","IN",5594,5328,33,266,24940,24940,3287,366,4538,946,1837573,10740,,,,,338,324537,,5643,0,,,,,296828,,,0,4148596,48346,,,,,2162110,16383,4148596,48346 +"2020-11-27","KS",1529,,26,,5018,5018,802,97,1329,221,659403,8015,,,,389,73,153021,,5224,0,,,,,,,,0,812424,13239,,,,,812424,13239,,0 +"2020-11-27","KY",1871,1817,36,54,9907,9907,1714,151,2445,390,,0,,,,,216,171755,142254,5616,0,,,,,,27866,,0,2528558,48461,95012,110567,,,,0,2528558,48461 +"2020-11-27","LA",6391,6136,41,255,,,1074,0,,,3148141,63074,,,,,125,230602,218796,4964,0,,,,,,192488,,0,3378743,68038,,102237,,,,0,3366937,67633 +"2020-11-27","MA",10635,10401,31,234,14139,14139,986,322,,209,3089928,29113,,,,,109,219252,211748,4658,0,,,12130,,266566,155473,,0,8250436,119742,,,132492,257397,3301676,33577,8250436,119742 +"2020-11-27","MD",4569,4414,22,155,20512,20512,1435,232,,343,2112687,16000,,143097,,,,192858,192858,2378,0,,,15413,,230545,8565,,0,4335442,47320,,,158510,,2305545,18378,4335442,47320 +"2020-11-27","ME",190,189,0,1,687,687,119,0,,51,,0,12276,,,,15,11265,10105,0,0,391,442,,,12840,8800,,0,845017,7823,12679,14844,,,,0,845017,7823 +"2020-11-27","MI",9357,8933,187,424,,,4097,0,,832,,0,,,6143956,,472,369801,341941,17368,0,,,,,438612,152267,,0,6582568,119731,362221,,,,,0,6582568,119731 +"2020-11-27","MN",3476,3410,101,66,16043,16043,1785,277,3638,386,2131220,17333,,,,,,295001,289364,5698,0,,,,,,244982,3922136,49074,3922136,49074,,90388,,,2420584,22866,,0 +"2020-11-27","MO",3809,,1,,,,2743,0,,648,1500877,5423,86415,,2699643,,353,290536,290536,3273,0,7931,17293,,,322264,,,0,3027819,18205,94551,116480,89578,68967,1791413,8696,3027819,18205 +"2020-11-27","MP",2,2,0,,4,4,,0,,,16747,0,,,,,,104,104,0,0,,,,,,29,,0,16851,0,,,,,16851,0,22633,0 +"2020-11-27","MS",3769,3292,6,477,7294,7294,1039,0,,245,947272,0,,,,,113,148387,120069,1005,0,,,,,,121637,,0,1095659,1005,50014,172860,,,,0,1064942,0 +"2020-11-27","MT",657,,-1,,2526,2526,452,-8,,97,,0,,,,,45,59796,,114,0,,,,,,43290,,0,642514,10587,,,,,,0,642514,10587 +"2020-11-27","NC",5210,5059,72,151,,,1780,0,,437,,0,,,,,,354514,334190,8008,0,,,,,,,,0,5089455,61469,,111727,,,,0,5089455,61469 +"2020-11-27","ND",908,,5,,2620,2620,347,12,408,39,268839,527,10979,,,,,78564,77125,751,0,970,,,,,68105,1065157,7143,1065157,7143,11949,4897,,,346071,1317,1119225,7788 +"2020-11-27","NE",982,,4,,4192,4192,931,10,,,608689,5755,,,1191184,,,122952,,2876,0,,,,,139882,60654,,0,1332601,18785,,,,,731994,8631,1332601,18785 +"2020-11-27","NH",517,,3,,836,836,131,3,276,,397018,1706,,,,,,19313,16272,537,0,,,,,,14226,,0,785563,0,34017,,33089,,413290,2243,785563,0 +"2020-11-27","NJ",16942,15113,17,1829,40982,40982,2796,152,,559,5509434,0,,,,,279,354054,326473,4497,0,,,,,,,,0,5863488,4497,,,,,,0,5827339,0 +"2020-11-27","NM",1504,,35,,6542,6542,874,48,,,,0,,,,,,91852,,2056,0,,,,,,31102,,0,1521747,16891,,,,,,0,1521747,16891 +"2020-11-27","NV",2095,,2,,,,1440,0,,306,819428,5016,,,,,162,146317,146317,1536,0,,,,,,,1607005,14090,1607005,14090,,,,,965745,6552,,0 +"2020-11-27","NY",26588,,39,,89995,89995,3103,0,,636,,0,,,,,294,628375,,8176,0,,,,,,,18962849,219442,18962849,219442,,,,,,0,,0 +"2020-11-27","OH",6346,5932,72,414,25960,25960,4535,474,4571,1113,,0,,,,,635,399808,378082,17065,0,,16513,,,407198,254775,,0,5986297,71047,,383118,,,,0,5986297,71047 +"2020-11-27","OK",1704,,24,,11898,11898,1653,190,,432,1873468,0,,,1873468,,,187567,,3225,0,5828,,,,195044,152969,,0,2061035,3225,95129,,,,,0,2071937,0 +"2020-11-27","OR",882,,15,,4262,4262,532,0,,118,960657,188,,,1812868,,48,70006,,1503,0,,,,,102598,,,0,1915466,23681,,,,,1025721,0,1915466,23681 +"2020-11-27","PA",10234,,21,,,,4114,0,,864,2786075,20846,,,,,445,343614,319239,7360,0,,,,,,209604,5551482,64181,5551482,64181,,,,,3105314,27686,,0 +"2020-11-27","PR",1076,852,7,224,,,582,0,,103,305972,0,,,395291,,91,50678,49226,1452,0,40027,,,,20103,41768,,0,356650,1452,,,,,,0,415664,0 +"2020-11-27","RI",1346,,4,,4408,4408,319,0,,37,466897,1533,,,1451994,,23,53954,,463,0,,,,,67027,,1519021,6858,1519021,6858,,,,,520851,1996,,0 +"2020-11-27","SC",4346,4043,29,303,11794,11794,884,57,,236,2125917,28659,78143,,2062537,,119,213120,199538,2215,0,11625,24958,,,262918,112233,,0,2339037,30874,89768,216396,,,,0,2325455,30545 +"2020-11-27","SD",888,,39,,4353,4353,569,110,,104,245204,2992,,,,,63,78280,73096,2138,0,,,,,79385,61010,,0,507465,4815,,,,,323484,5130,507465,4815 +"2020-11-27","TN",4526,4150,7,376,11974,11974,2400,24,,600,,0,,,4010457,,271,356716,328666,4340,0,,28523,,,388127,318523,,0,4398584,34644,,278320,,,,0,4398584,34644 +"2020-11-27","TX",21207,,51,,,,8518,0,,2449,,0,,,,,,1255332,1147045,3987,0,59679,56447,,,1280439,946663,,0,10840889,12642,563123,689889,,,,0,10840889,12642 +"2020-11-27","UT",849,,15,,7948,7948,586,163,1458,205,1128311,14340,,,1607270,532,,190044,,6142,0,,15777,,15169,190133,126690,,0,1797403,31637,,217320,,100144,1304497,20117,1797403,31637 +"2020-11-27","VA",4044,3704,15,340,14451,14451,1593,34,,373,,0,,,,,160,230444,205632,1544,0,12992,20657,,,245600,,3269710,32817,3269710,32817,163722,320970,,,,0,,0 +"2020-11-27","VI",23,,0,,,,,0,,,26515,0,,,,,,1521,,0,0,,,,,,1432,,0,28036,0,,,,,28134,0,,0 +"2020-11-27","VT",67,67,3,,,,21,0,,2,216849,969,,,,,,4115,4012,98,0,,,,,,2439,,0,546179,13044,,,,,220861,1067,546179,13044 +"2020-11-27","WA",2704,2704,0,,10242,10242,1002,0,,226,,0,,,,,102,170407,165384,2936,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-11-27","WI",3434,3257,19,177,16715,16715,1727,57,1788,363,2133700,8498,,,,,,399526,375837,1422,0,,,,,,301541,4351880,33665,4351880,33665,,,,,2509537,9798,,0 +"2020-11-27","WV",712,678,0,34,,,528,0,,152,,0,,,,,63,45046,38829,866,0,,,,,,29008,,0,1092989,16730,20764,,,,,0,1092989,16730 +"2020-11-27","WY",215,,0,,720,720,224,0,,,138904,7116,,,357394,,,31773,27597,1012,0,,,,,27640,21700,,0,393512,8472,,,,,166501,11366,393512,8472 +"2020-11-26","AK",119,119,3,,688,688,145,25,,,,0,,,933412,,22,28892,,553,0,,,,,35191,,,0,969573,15297,,,,,,0,969573,15297 +"2020-11-26","AL",3572,3240,40,332,24401,24401,1434,25,2227,,1361187,7226,,,,1282,,241957,201755,2639,0,,,,,,161946,,0,1562942,9355,,,70846,,1562942,9355,,0 +"2020-11-26","AR",2436,2237,11,199,8711,8711,1003,0,,406,1513202,12945,,,1513202,960,169,152625,133942,2348,0,,,,22406,,132580,,0,1647144,14638,,,,132849,,0,1647144,14638 +"2020-11-26","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-26","AZ",6568,6086,44,482,25163,25163,2289,211,,523,1873862,18460,,,,,335,314326,304823,3476,0,,,,,,,,0,3719276,47663,,,361284,,2178685,21546,3719276,47663 +"2020-11-26","CA",18979,,104,,,,7197,0,,1617,,0,,,,,,1158689,1158689,14640,0,,,,,,,,0,23096745,186394,,,,,,0,23096745,186394 +"2020-11-26","CO",2957,2485,51,472,13248,13248,1777,204,,,1482962,21870,184336,,,,,216683,206695,6053,0,16010,,,,,,3046149,65750,3046149,65750,202075,,,,1689657,27654,,0 +"2020-11-26","CT",4926,3957,0,969,12257,12257,968,0,,,,0,,,3387156,,,109152,101541,0,0,,3760,,,140912,,,0,3533016,40249,,49729,,,,0,3533016,40249 +"2020-11-26","DC",677,,0,,,,146,0,,30,,0,,,,,14,20736,,220,0,,,,,,15401,663201,12966,663201,12966,,,,,297433,3136,,0 +"2020-11-26","DE",761,670,1,91,,,195,0,,30,378833,3174,,,,,,33579,32224,584,0,,,,,34268,16712,705587,5944,705587,5944,,,,,412412,3758,,0 +"2020-11-26","FL",18482,,0,,54813,54813,3723,0,,,6081679,0,557126,541211,9364258,,,946956,871901,0,0,67208,,65507,,1225332,,11949292,0,11949292,0,624738,,607025,,7028635,0,10640294,0 +"2020-11-26","GA",9336,8716,39,620,34587,34587,2247,174,6463,,,0,,,,,,461517,413909,3608,0,35236,,,,387383,,,0,4226691,30762,359818,,,,,0,4226691,30762 +"2020-11-26","GU",111,,2,,,,46,0,,9,76004,0,,,,,2,6748,6580,43,0,9,121,,,,4957,,0,82752,43,224,1226,,,,0,82584,0 +"2020-11-26","HI",237,237,2,,1269,1269,60,1,,17,,0,,,,,12,17881,17618,117,0,,,,,17581,,649900,9041,649900,9041,,,,,,0,,0 +"2020-11-26","IA",2312,,41,,,,1269,0,,271,860632,4387,,70138,,,142,197086,197086,2691,0,,,4757,25713,,124520,,0,1057718,7078,,,74935,135888,1059805,7111,,0 +"2020-11-26","ID",895,827,21,68,3817,3817,453,55,715,108,382383,3071,,,,,,96503,82063,1773,0,,,,,,39199,,0,464446,4425,,31219,,,464446,4425,698256,6953 +"2020-11-26","IL",12596,11963,156,633,,,6032,0,,1224,,0,,,,,724,697489,,12022,0,,,,,,,,0,10212093,107556,,,,,,0,10212093,107556 +"2020-11-26","IN",5561,5295,63,266,24574,24574,3384,357,4493,955,1826833,12959,,,,,338,318894,,6373,0,,,,,291641,,,0,4100250,62056,,,,,2145727,19332,4100250,62056 +"2020-11-26","KS",1503,,0,,4921,4921,1126,0,1316,272,651388,0,,,,385,102,147797,,0,0,,,,,,,,0,799185,0,,,,,799185,0,,0 +"2020-11-26","KY",1835,1784,0,51,9756,9756,1734,0,2410,409,,0,,,,,216,166139,137387,0,0,,,,,,27349,,0,2480097,0,94485,107911,,,,0,2480097,0 +"2020-11-26","LA",6350,6097,0,253,,,1077,0,,,3085067,0,,,,,116,225638,214237,0,0,,,,,,192488,,0,3310705,0,,98370,,,,0,3299304,0 +"2020-11-26","MA",10604,10372,0,232,13817,13817,942,0,,208,3060815,0,,,,,108,214594,207284,0,0,,,12007,,261393,145682,,0,8130694,0,,,130696,254007,3268099,0,8130694,0 +"2020-11-26","MD",4547,4392,29,155,20280,20280,1453,212,,339,2096687,14188,,143097,,,,190480,190480,2319,0,,,15413,,227713,8561,,0,4288122,41771,,,158510,,2287167,16507,4288122,41771 +"2020-11-26","ME",190,189,0,1,687,687,105,9,,46,,0,12276,,,,11,11265,10105,238,0,391,394,,,12486,8791,,0,837194,13405,12679,12790,,,,0,837194,13405 +"2020-11-26","MI",9170,8761,0,409,,,4063,0,,843,,0,,,6040130,,464,352433,324779,0,0,,,,,422707,152267,,0,6462837,0,359142,,,,,0,6462837,0 +"2020-11-26","MN",3375,3313,0,62,15766,15766,1812,0,3611,387,2113887,0,,,,,,289303,283831,0,0,,,,,,240720,3873062,0,3873062,0,,83887,,,2397718,0,,0 +"2020-11-26","MO",3808,,32,,,,2749,0,,653,1495454,7941,86099,,2684972,,325,287263,287263,4471,0,7800,16887,,,318769,,,0,3009614,26203,94104,111038,89199,66846,1782717,12412,3009614,26203 +"2020-11-26","MP",2,2,0,,4,4,,0,,,16747,0,,,,,,104,104,0,0,,,,,,29,,0,16851,0,,,,,16851,0,22633,0 +"2020-11-26","MS",3763,3287,18,476,7294,7294,1039,0,,245,947272,0,,,,,113,147382,119483,1746,0,,,,,,121637,,0,1094654,1746,50014,172860,,,,0,1064942,0 +"2020-11-26","MT",658,,6,,2534,2534,455,60,,91,,0,,,,,48,59682,,1117,0,,,,,,43077,,0,631927,4076,,,,,,0,631927,4076 +"2020-11-26","NC",5138,4993,0,145,,,1811,0,,431,,0,,,,,,346506,327379,0,0,,,,,,,,0,5027986,45366,,103064,,,,0,5027986,45366 +"2020-11-26","ND",903,,10,,2608,2608,321,21,407,33,268312,953,10671,,,,,77813,76377,1007,0,852,,,,,67200,1058014,8286,1058014,8286,11523,4870,,,344754,1919,1111437,9017 +"2020-11-26","NE",978,,28,,4182,4182,930,56,,,602934,3848,,,1174805,,,120076,,2394,0,,,,,137480,59677,,0,1313816,21133,,,,,723363,6244,1313816,21133 +"2020-11-26","NH",514,,0,,833,833,125,0,276,,395312,0,,,,,,18776,15735,0,0,,,,,,13969,,0,785563,0,34017,,33024,,411047,0,785563,0 +"2020-11-26","NJ",16925,15096,39,1829,40830,40830,2831,124,,550,5509434,0,,,,,284,349557,322378,5160,0,,,,,,,,0,5858991,5160,,,,,,0,5827339,0 +"2020-11-26","NM",1469,,18,,6494,6494,880,113,,,,0,,,,,,89796,,1694,0,,,,,,30777,,0,1504856,17016,,,,,,0,1504856,17016 +"2020-11-26","NV",2093,,22,,,,1440,0,,306,814412,5935,,,,,162,144781,144781,2542,0,,,,,,,1592915,18658,1592915,18658,,,,,959193,8477,,0 +"2020-11-26","NY",26549,,67,,89995,89995,3056,0,,628,,0,,,,,286,620199,,6933,0,,,,,,,18743407,217721,18743407,217721,,,,,,0,,0 +"2020-11-26","OH",6274,5869,0,405,25486,25486,4541,0,4527,1077,,0,,,,,615,382743,361623,0,0,,15723,,,397819,242146,,0,5915250,64822,,362720,,,,0,5915250,64822 +"2020-11-26","OK",1680,,0,,11708,11708,1653,0,,432,1873468,24905,,,1873468,,,184342,,0,0,5828,,,,195044,149345,,0,2057810,24905,95129,,,,,0,2071937,28445 +"2020-11-26","OR",867,,20,,4262,4262,532,86,,118,960469,3220,,,1791382,,48,68503,,1170,0,,,,,100403,,,0,1891785,22577,,,,,1025721,4348,1891785,22577 +"2020-11-26","PA",10213,,118,,,,4087,0,,877,2765229,22008,,,,,467,336254,312399,8425,0,,,,,,203253,5487301,64277,5487301,64277,,,,,3077628,29346,,0 +"2020-11-26","PR",1069,847,17,222,,,597,0,,98,305972,0,,,395291,,88,49226,47854,501,0,39409,,,,20103,40886,,0,355198,501,,,,,,0,415664,0 +"2020-11-26","RI",1342,,7,,4408,4408,319,82,,37,465364,2575,,,1445675,,23,53491,,1174,0,,,,,66488,,1512163,19968,1512163,19968,,,,,518855,3749,,0 +"2020-11-26","SC",4317,4015,0,302,11737,11737,940,0,,227,2097258,0,77529,,2034433,,108,210905,197652,0,0,11318,24415,,,260477,111013,,0,2308163,0,88847,207854,,,,0,2294910,0 +"2020-11-26","SD",849,,0,,4243,4243,570,0,,101,242212,0,,,,,49,76142,71170,0,0,,,,,78327,59981,,0,502650,4946,,,,,318354,0,502650,4946 +"2020-11-26","TN",4519,4144,53,375,11950,11950,2427,136,,592,,0,,,3980377,,281,352376,324599,4404,0,,28215,,,383563,312885,,0,4363940,36134,,275427,,,,0,4363940,36134 +"2020-11-26","TX",21156,,206,,,,8706,0,,2444,,0,,,,,,1251345,1143616,14697,0,59031,56160,,,1278643,943457,,0,10828247,114701,560010,687314,,,,0,10828247,114701 +"2020-11-26","UT",834,,0,,7785,7785,591,0,1440,207,1113971,0,,,1581889,526,,183902,,0,0,,15322,,14743,183877,120890,,0,1765766,0,,207511,,96617,1284380,0,1765766,0 +"2020-11-26","VA",4029,3698,21,331,14417,14417,1601,105,,370,,0,,,,,152,228900,204406,2600,0,12874,20419,,,243145,,3236893,23027,3236893,23027,163229,318954,,,,0,,0 +"2020-11-26","VI",23,,0,,,,,0,,,26515,0,,,,,,1521,,0,0,,,,,,1432,,0,28036,0,,,,,28134,0,,0 +"2020-11-26","VT",64,64,0,,,,24,0,,5,215880,1623,,,,,,4017,3914,79,0,,,,,,2374,,0,533135,0,,,,,219794,1696,533135,0 +"2020-11-26","WA",2704,2704,14,,10242,10242,1007,76,,215,,0,,,,,102,167471,162590,3157,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-11-26","WI",3415,3240,72,175,16658,16658,1892,201,1788,441,2125202,8653,,,,,,398104,374537,5666,0,,,,,,296577,4318215,36568,4318215,36568,,,,,2499739,13748,,0 +"2020-11-26","WV",712,678,17,34,,,534,0,,147,,0,,,,,60,44180,38147,1130,0,,,,,,28718,,0,1076259,15427,20671,,,,,0,1076259,15427 +"2020-11-26","WY",215,,0,,720,720,226,0,,,131788,0,,,357394,,,30761,26677,0,0,,,,,27640,20113,,0,385040,0,,,,,155135,0,385040,0 +"2020-11-25","AK",116,116,0,,663,663,145,32,,,,0,,,919877,,22,28339,,670,0,,,,,33842,,,0,954276,10875,,,,,,0,954276,10875 +"2020-11-25","AL",3532,3207,60,325,24376,24376,1483,216,2217,,1353961,6944,,,,1276,,239318,199626,2453,0,,,,,,161946,,0,1553587,8722,,,70609,,1553587,8722,,0 +"2020-11-25","AR",2425,2227,20,198,8711,8711,1028,91,,400,1500257,13180,,,1500257,960,191,150277,132249,1965,0,,,,21612,,130818,,0,1632506,14603,,,,127630,,0,1632506,14603 +"2020-11-25","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-25","AZ",6524,6044,9,480,24952,24952,2217,286,,531,1855402,13369,,,,,335,310850,301737,3982,0,,,,,,,,0,3671613,51057,,,359967,,2157139,17098,3671613,51057 +"2020-11-25","CA",18875,,106,,,,7049,0,,1551,,0,,,,,,1144049,1144049,18350,0,,,,,,,,0,22910351,168988,,,,,,0,22910351,168988 +"2020-11-25","CO",2906,2439,46,467,13044,13044,1794,208,,,1461092,12932,183560,,,,,210630,200911,4191,0,15819,,,,,,2980399,41136,2980399,41136,200346,,,,1662003,16894,,0 +"2020-11-25","CT",4926,3957,45,969,12257,12257,968,0,,,,0,,,3349750,,,109152,101541,1872,0,,3760,,,138211,,,0,3492767,52455,,49729,,,,0,3492767,52455 +"2020-11-25","DC",677,,4,,,,134,0,,36,,0,,,,,19,20516,,107,0,,,,,,15281,650235,1313,650235,1313,,,,,294297,1465,,0 +"2020-11-25","DE",760,669,3,91,,,183,0,,28,375659,2116,,,,,,32995,31656,331,0,,,,,33941,16538,699643,6634,699643,6634,,,,,408654,2447,,0 +"2020-11-25","FL",18482,,99,,54813,54813,3723,313,,,6081679,38084,557126,541211,9364258,,,946956,871901,8126,0,67208,,65507,,1225332,,11949292,106585,11949292,106585,624738,,607025,,7028635,46210,10640294,96122 +"2020-11-25","GA",9297,8694,76,603,34413,34413,2286,145,6434,,,0,,,,,,457909,411002,3177,0,35037,,,,384916,,,0,4195929,21986,358749,,,,,0,4195929,21986 +"2020-11-25","GU",109,,2,,,,45,0,,11,76004,1059,,,,,4,6705,6580,50,0,9,121,,,,4957,,0,82709,1109,224,1226,,,,0,82584,1106 +"2020-11-25","HI",235,235,2,,1268,1268,67,9,,16,,0,,,,,11,17764,17501,108,0,,,,,17361,,640859,1134,640859,1134,,,,,,0,,0 +"2020-11-25","IA",2271,,45,,,,1305,0,,269,856245,2608,,69781,,,198,194395,194395,3243,0,,,4667,25214,,122059,,0,1050640,5851,,,74488,134681,1052694,5059,,0 +"2020-11-25","ID",874,808,8,66,3762,3762,408,80,701,91,379312,1614,,,,,,94730,80709,1640,0,,,,,,38397,,0,460021,2913,,31219,,,460021,2913,691303,4918 +"2020-11-25","IL",12440,11832,178,608,,,6133,0,,1208,,0,,,,,679,685467,,11378,0,,,,,,,,0,10104537,114233,,,,,,0,10104537,114233 +"2020-11-25","IN",5498,5232,63,266,24217,24217,3363,333,4421,956,1813874,12668,,,,,326,312521,,5983,0,,,,,285743,,,0,4038194,61511,,,,,2126395,18651,4038194,61511 +"2020-11-25","KS",1503,,47,,4921,4921,1126,144,1316,272,651388,9159,,,,385,102,147797,,5738,0,,,,,,,,0,799185,14897,,,,,799185,14897,,0 +"2020-11-25","KY",1835,1784,26,51,9756,9756,1734,133,2410,409,,0,,,,,216,166139,137387,3301,0,,,,,,27349,,0,2480097,9740,94485,107911,,,,0,2480097,9740 +"2020-11-25","LA",6350,6097,27,253,,,1077,0,,,3085067,13086,,,,,116,225638,214237,1235,0,,,,,,192488,,0,3310705,14321,,98370,,,,0,3299304,14109 +"2020-11-25","MA",10604,10372,53,232,13817,13817,942,0,,208,3060815,26441,,,,,108,214594,207284,3395,0,,,12007,,261393,145682,,0,8130694,129833,,,130696,254007,3268099,29665,8130694,129833 +"2020-11-25","MD",4518,4363,37,155,20068,20068,1406,154,,308,2082499,15939,,143097,,,,188161,188161,2697,0,,,15413,,224826,8549,,0,4246351,45515,,,158510,,2270660,18636,4246351,45515 +"2020-11-25","ME",190,189,1,1,678,678,105,16,,46,,0,12276,,,,11,11027,9916,228,0,391,280,,,12106,8592,,0,823789,7310,12679,8622,,,,0,823789,7310 +"2020-11-25","MI",9170,8761,76,409,,,4063,0,,843,,0,,,6040130,,464,352433,324779,4687,0,,,,,422707,152267,,0,6462837,61805,359142,,,,,0,6462837,61805 +"2020-11-25","MN",3375,3313,72,62,15766,15766,1812,322,3611,387,2113887,26598,,,,,,289303,283831,6387,0,,,,,,240720,3873062,63086,3873062,63086,,83887,,,2397718,32775,,0 +"2020-11-25","MO",3776,,26,,,,2698,0,,653,1487513,6971,85668,,2663642,,320,282792,282792,4131,0,7628,16229,,,313937,,,0,2983411,22895,93500,106155,88680,63997,1770305,11102,2983411,22895 +"2020-11-25","MP",2,2,0,,4,4,,0,,,16747,0,,,,,,104,104,0,0,,,,,,29,,0,16851,0,,,,,16851,0,22633,0 +"2020-11-25","MS",3745,3273,16,472,7294,7294,1039,0,,245,947272,0,,,,,113,145636,118597,1092,0,,,,,,121637,,0,1092908,1092,50014,172860,,,,0,1064942,0 +"2020-11-25","MT",652,,22,,2474,2474,462,54,,87,,0,,,,,47,58565,,1061,0,,,,,,42012,,0,627851,5055,,,,,,0,627851,5055 +"2020-11-25","NC",5138,4993,64,145,,,1811,0,,431,,0,,,,,,346506,327379,4212,0,,,,,,,,0,4982620,46312,,103064,,,,0,4982620,46312 +"2020-11-25","ND",893,,4,,2587,2587,321,59,406,33,267359,727,10671,,,,,76806,75426,1184,0,852,,,,,65976,1049728,8930,1049728,8930,11523,4337,,,342835,1802,1102420,9617 +"2020-11-25","NE",950,,16,,4126,4126,936,77,,,599086,3036,,,1156248,,,117682,,1761,0,,,,,134930,59002,,0,1292683,14773,,,,,717119,4795,1292683,14773 +"2020-11-25","NH",514,,1,,833,833,125,1,276,,395312,3064,,,,,,18776,15735,394,0,,,,,,13969,,0,785563,9965,34017,,33024,,411047,3379,785563,9965 +"2020-11-25","NJ",16886,15057,67,1829,40706,40706,2902,234,,545,5509434,97718,,,,,281,344397,317905,4755,0,,,,,,,,0,5853831,102473,,,,,,0,5827339,101760 +"2020-11-25","NM",1451,,23,,6381,6381,897,72,,,,0,,,,,,88102,,1855,0,,,,,,30170,,0,1487840,10556,,,,,,0,1487840,10556 +"2020-11-25","NV",2071,,24,,,,1414,0,,312,808477,3831,,,,,169,142239,142239,3159,0,,,,,,,1574257,15631,1574257,15631,,,,,950716,6990,,0 +"2020-11-25","NY",26482,,41,,89995,89995,2982,0,,596,,0,,,,,277,613266,,6265,0,,,,,,,18525686,173085,18525686,173085,,,,,,0,,0 +"2020-11-25","OH",6274,5869,156,405,25486,25486,4541,417,4527,1077,,0,,,,,615,382743,361623,10835,0,,14624,,,388334,242146,,0,5850428,52098,,343757,,,,0,5850428,52098 +"2020-11-25","OK",1680,,16,,11708,11708,1604,263,,432,1848563,18164,,,1848563,,,184342,,3732,0,5828,,,,191157,149345,,0,2032905,21896,95129,,,,,0,2043492,20100 +"2020-11-25","OR",847,,21,,4176,4176,534,56,,116,957249,7300,,,1770571,,45,67333,,1000,0,,,,,98637,,,0,1869208,27029,,,,,1021373,8252,1869208,27029 +"2020-11-25","PA",10095,,144,,,,3990,0,,858,2743221,19853,,,,,441,327829,305061,6759,0,,,,,,203253,5423024,62181,5423024,62181,,,,,3048282,25846,,0 +"2020-11-25","PR",1052,832,14,220,,,602,0,,105,305972,0,,,395291,,99,48725,47345,177,0,39266,,,,20103,40035,,0,354697,177,,,,,,0,415664,0 +"2020-11-25","RI",1335,,10,,4326,4326,357,74,,35,462789,-1430,,,1426986,,16,52317,,893,0,,,,,65209,,1492195,12350,1492195,12350,,,,,515106,-537,,0 +"2020-11-25","SC",4317,4015,4,302,11737,11737,940,82,,227,2097258,18996,77529,,2034433,,108,210905,197652,1675,0,11318,24415,,,260477,111013,,0,2308163,20671,88847,207854,,,,0,2294910,20318 +"2020-11-25","SD",849,,28,,4243,4243,570,50,,101,242212,1277,,,,,49,76142,71170,1283,0,,,,,77213,59981,,0,497704,5141,,,,,318354,2560,497704,5141 +"2020-11-25","TN",4466,4099,92,367,11814,11814,2413,97,,587,,0,,,3948402,,286,347972,320883,2118,0,,27559,,,379404,308566,,0,4327806,13836,,270011,,,,0,4327806,13836 +"2020-11-25","TX",20950,,200,,,,8585,0,,2356,,0,,,,,,1236648,1130980,18811,0,58350,54860,,,1264769,935011,,0,10713546,130734,556284,670565,,,,0,10713546,130734 +"2020-11-25","UT",834,,26,,7785,7785,591,83,1440,207,1113971,4970,,,1581889,526,,183902,,1781,0,,15322,,14743,183877,120890,,0,1765766,12306,,207511,,96617,1284380,6638,1765766,12306 +"2020-11-25","VA",4008,3679,29,329,14312,14312,1549,100,,361,,0,,,,,153,226300,202426,2718,0,12744,19764,,,239167,,3213866,26599,3213866,26599,162545,306712,,,,0,,0 +"2020-11-25","VI",23,,0,,,,,0,,,26515,288,,,,,,1521,,14,0,,,,,,1432,,0,28036,302,,,,,28134,311,,0 +"2020-11-25","VT",64,64,0,,,,24,0,,5,214257,1810,,,,,,3938,3841,93,0,,,,,,2374,,0,533135,5190,,,,,218098,1899,533135,5190 +"2020-11-25","WA",2690,2690,35,,10166,10166,932,70,,214,,0,,,,,101,164314,159612,3678,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-11-25","WI",3343,3178,71,165,16457,16457,1892,248,1781,441,2116549,11793,,,,,,392438,369442,5997,0,,,,,,290969,4281647,46685,4281647,46685,,,,,2485991,17262,,0 +"2020-11-25","WV",695,662,13,33,,,510,0,,144,,0,,,,,65,43050,37304,967,0,,,,,,28072,,0,1060832,15456,20482,,,,,0,1060832,15456 +"2020-11-25","WY",215,,13,,720,720,226,19,,,131788,0,,,357394,,,30761,26677,802,0,,,,,27640,20113,,0,385040,29,,,,,155135,0,385040,29 +"2020-11-24","AK",116,116,13,,631,631,144,14,,,,0,,,909608,,21,27669,,584,0,,,,,33242,,,0,943401,10385,,,,,,0,943401,10385 +"2020-11-24","AL",3472,3165,13,307,24160,24160,1428,218,2211,,1347017,9276,,,,1276,,236865,197848,2785,0,,,,,,90702,,0,1544865,11237,,,70247,,1544865,11237,,0 +"2020-11-24","AR",2405,2208,18,197,8620,8620,988,97,,387,1487077,11309,,,1487077,951,160,148312,130826,2122,0,,,,20993,,128831,,0,1617903,12730,,,,122446,,0,1617903,12730 +"2020-11-24","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-24","AZ",6515,6036,51,479,24666,24666,2084,205,,474,1842033,10734,,,,,310,306868,298008,4544,0,,,,,,,,0,3620556,57140,,,357863,,2140041,15168,3620556,57140 +"2020-11-24","CA",18769,,43,,,,6641,0,,1514,,0,,,,,,1125699,1125699,15329,0,,,,,,,,0,22741363,283819,,,,,,0,22741363,283819 +"2020-11-24","CO",2860,2396,50,464,12836,12836,1739,310,,,1448160,10232,183560,,,,,206439,196949,4150,0,15819,,,,,,2939263,37523,2939263,37523,199379,,,,1645109,14238,,0 +"2020-11-24","CT",4881,3922,10,959,12257,12257,891,0,,,,0,,,3300265,,,107280,99820,540,0,,3665,,,135409,,,0,3440312,53392,,48549,,,,0,3440312,53392 +"2020-11-24","DC",673,,1,,,,134,0,,36,,0,,,,,13,20409,,119,0,,,,,,15085,648922,9461,648922,9461,,,,,292832,1804,,0 +"2020-11-24","DE",757,666,5,91,,,185,0,,28,373543,2913,,,,,,32664,31336,453,0,,,,,33562,16262,693009,5527,693009,5527,,,,,406207,3366,,0 +"2020-11-24","FL",18383,,73,,54500,54500,3780,333,,,6043595,45821,557126,541211,9279441,,,938830,866301,8102,0,67208,,65507,,1214279,,11842707,101987,11842707,101987,624738,,607025,,6982425,53923,10544172,98985 +"2020-11-24","GA",9221,8648,6,573,34268,34268,2298,185,6414,,,0,,,,,,454732,408644,3676,0,34856,,,,383062,,,0,4173943,34434,357704,,,,,0,4173943,34434 +"2020-11-24","GU",107,,1,,,,49,0,,9,74945,548,,,,,5,6655,6533,53,0,9,121,,,,4952,,0,81600,601,220,1213,,,,0,81478,600 +"2020-11-24","HI",233,233,0,,1259,1259,69,25,,17,,0,,,,,13,17656,17393,60,0,,,,,17350,,639725,3612,639725,3612,,,,,,0,,0 +"2020-11-24","IA",2226,,20,,,,1351,0,,275,853637,3120,,69526,,,155,191152,191152,1296,0,,,4611,24165,,119713,,0,1044789,4416,,,74177,130848,1047635,5207,,0 +"2020-11-24","ID",866,800,17,66,3682,3682,408,72,689,91,377698,1989,,,,,,93090,79410,1437,0,,,,,,38397,,0,457108,3236,,31219,,,457108,3236,686385,7191 +"2020-11-24","IL",12262,11677,150,585,,,6134,0,,1203,,0,,,,,668,674089,,9469,0,,,,,,,,0,9990304,97323,,,,,,0,9990304,97323 +"2020-11-24","IN",5435,5169,103,266,23884,23884,3279,358,4371,909,1801206,11391,,,,,325,306538,,5625,0,,,,,280434,,,0,3976683,37038,,,,,2107744,17016,3976683,37038 +"2020-11-24","KS",1456,,0,,4777,4777,896,0,1294,240,642229,0,,,,377,89,142059,,0,0,,,,,,,,0,784288,0,,,,,784288,0,,0 +"2020-11-24","KY",1809,1764,17,45,9623,9623,1658,93,2384,390,,0,,,,,207,162838,134739,2606,0,,,,,,26951,,0,2470357,28727,94429,106842,,,,0,2470357,28727 +"2020-11-24","LA",6323,6072,39,251,,,1052,0,,,3071981,30949,,,,,113,224403,213214,3243,0,,,,,,185960,,0,3296384,34192,,96600,,,,0,3285195,33069 +"2020-11-24","MA",10551,10319,20,232,13817,13817,954,0,,205,3034374,20409,,,,,99,211199,204060,2576,0,,,12007,,257495,145682,,0,8000861,80819,,,130696,250995,3238434,22634,8000861,80819 +"2020-11-24","MD",4481,4325,33,156,19914,19914,1341,145,,314,2066560,11865,,140937,,,,185464,185464,1667,0,,,14868,,221744,8517,,0,4200836,29162,,,155805,,2252024,13532,4200836,29162 +"2020-11-24","ME",189,188,12,1,662,662,105,15,,43,,0,12245,,,,9,10799,9698,255,0,389,193,,,11805,8232,,0,816479,7940,12646,4273,,,,0,816479,7940 +"2020-11-24","MI",9094,8688,154,406,,,4087,0,,865,,0,,,5986631,,445,347746,320506,6782,0,,,,,414401,152267,,0,6401032,73541,358188,,,,,0,6401032,73541 +"2020-11-24","MN",3303,3243,38,60,15444,15444,1828,338,3540,379,2087289,18070,,,,,,282916,277654,6416,0,,,,,,233847,3809976,53199,3809976,53199,,81183,,,2364943,24167,,0 +"2020-11-24","MO",3750,,189,,,,2680,0,,664,1480542,5343,85352,,2645225,,307,278661,278661,3764,0,7498,15670,,,309518,,,0,2960516,18315,93054,103265,88296,62038,1759203,9107,2960516,18315 +"2020-11-24","MP",2,2,0,,4,4,,0,,,16747,0,,,,,,104,104,0,0,,,,,,29,,0,16851,0,,,,,16851,0,22633,0 +"2020-11-24","MS",3729,3269,53,460,7294,7294,1041,0,,224,947272,0,,,,,107,144544,118063,665,0,,,,,,121637,,0,1091816,665,50014,172860,,,,0,1064942,0 +"2020-11-24","MT",630,,16,,2420,2420,467,43,,80,,0,,,,,41,57504,,1123,0,,,,,,40686,,0,622796,4822,,,,,,0,622796,4822 +"2020-11-24","NC",5074,4939,35,135,,,1724,0,,412,,0,,,,,,342294,323751,3100,0,,,,,,,,0,4936308,40091,,95746,,,,0,4936308,40091 +"2020-11-24","ND",889,,37,,2528,2528,377,47,394,36,266632,546,10671,,,,,75622,74325,1066,0,852,,,,,64611,1040798,7404,1040798,7404,11523,3766,,,341033,1550,1092803,7990 +"2020-11-24","NE",934,,25,,4049,4049,971,86,,,596050,3353,,,1143389,,,115921,,1860,0,,,,,133020,58686,,0,1277910,15347,,,,,712324,5216,1277910,15347 +"2020-11-24","NH",513,,1,,832,832,121,1,276,,392248,1233,,,,,,18382,15420,340,0,,,,,,13558,,0,775598,4807,33949,,32967,,407668,1441,775598,4807 +"2020-11-24","NJ",16819,15007,47,1812,40472,40472,2785,250,,522,5411716,46038,,,,,265,339642,313863,4971,0,,,,,,,,0,5751358,51009,,,,,,0,5725579,50313 +"2020-11-24","NM",1428,,28,,6309,6309,871,80,,,,0,,,,,,86247,,2099,0,,,,,,29568,,0,1477284,12832,,,,,,0,1477284,12832 +"2020-11-24","NV",2047,,24,,,,1399,0,,296,804646,7285,,,,,161,139080,139080,2853,0,,,,,,,1558626,22550,1558626,22550,,,,,943726,10138,,0 +"2020-11-24","NY",26441,,51,,89995,89995,2856,0,,559,,0,,,,,263,607001,,4881,0,,,,,,,18352601,164761,18352601,164761,,,,,,0,,0 +"2020-11-24","OH",6118,5728,98,390,25069,25069,4449,364,4483,1046,,0,,,,,598,371908,351304,8604,0,,13558,,,380911,236618,,0,5798330,53996,,321135,,,,0,5798330,53996 +"2020-11-24","OK",1664,,15,,11445,11445,1566,77,,446,1830399,40754,,,1830999,,,180610,,2736,0,5828,,,,188655,145686,,0,2011009,43490,95129,,,,,0,2023392,48353 +"2020-11-24","OR",826,,6,,4120,4120,492,150,,119,949949,5505,,,1745661,,41,66333,,1163,0,,,,,96518,,,0,1842179,16127,,,,,1013121,22377,1842179,16127 +"2020-11-24","PA",9951,,81,,,,3897,0,,826,2723368,18198,,,,,405,321070,299068,6669,0,,,,,,202274,5360843,55209,5360843,55209,,,,,3022436,23899,,0 +"2020-11-24","PR",1038,819,6,219,,,626,0,,111,305972,0,,,395291,,105,48548,47216,348,0,39234,,,,20103,39895,,0,354520,348,,,,,,0,415664,0 +"2020-11-24","RI",1325,,16,,4252,4252,323,75,,30,464219,3127,,,1415638,,16,51424,,851,0,,,,,64207,,1479845,11763,1479845,11763,,,,,515643,3978,,0 +"2020-11-24","SC",4313,4010,25,303,11655,11655,873,92,,211,2078262,18209,77361,,2015801,,83,209230,196330,1678,0,11213,23722,,,258791,109724,,0,2287492,19887,88574,199415,,,,0,2274592,19637 +"2020-11-24","SD",821,,2,,4193,4193,574,86,,104,240935,1486,,,,,50,74859,70172,1011,0,,,,,76207,57381,,0,492563,3307,,,,,315794,2497,492563,3307 +"2020-11-24","TN",4374,4018,73,356,11717,11717,2368,89,,609,,0,,,3936277,,273,345854,319362,1304,0,,26860,,,377693,303234,,0,4313970,5448,,266114,,,,0,4313970,5448 +"2020-11-24","TX",20750,,162,,,,8495,0,,2331,,0,,,,,,1217837,1115371,16580,0,57944,53643,,,1250838,927331,,0,10582812,147707,553956,654298,,,,0,10582812,147707 +"2020-11-24","UT",808,,11,,7702,7702,565,100,1422,201,1109001,9077,,,1571483,519,,182121,,2701,0,,14575,,14039,181977,118773,,0,1753460,17636,,192109,,90193,1277742,11601,1753460,17636 +"2020-11-24","VA",3979,3660,37,319,14212,14212,1496,116,,354,,0,,,,,146,223582,200284,2544,0,12670,19026,,,239167,,3187267,26208,3187267,26208,162237,295204,,,,0,,0 +"2020-11-24","VI",23,,0,,,,,0,,,26227,252,,,,,,1507,,3,0,,,,,,1427,,0,27734,255,,,,,27823,274,,0 +"2020-11-24","VT",64,64,1,,,,22,0,,5,212447,1246,,,,,,3845,3752,50,0,,,,,,2339,,0,527945,4718,,,,,216199,1296,527945,4718 +"2020-11-24","WA",2655,2655,36,,10096,10096,894,331,,187,,0,,,,,82,160636,156154,1405,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-11-24","WI",3272,3115,114,157,16209,16209,1986,279,1767,436,2104756,10308,,,,,,386441,363973,6748,0,,,,,,284903,4234962,38892,4234962,38892,,,,,2468729,16510,,0 +"2020-11-24","WV",682,649,15,33,,,463,0,,129,,0,,,,,51,42083,36525,969,0,,,,,,27461,,0,1045376,14516,20440,,,,,0,1045376,14516 +"2020-11-24","WY",202,,0,,701,701,228,11,,,131788,0,,,357374,,,29959,25975,528,0,,,,,27637,17896,,0,385011,286,,,,,155135,0,385011,286 +"2020-11-23","AK",103,103,0,,617,617,146,5,,,,0,,,900198,,19,27085,,498,0,,,,,32270,,,0,933016,6655,,,,,,0,933016,6655 +"2020-11-23","AL",3459,3155,2,304,23942,23942,1427,493,2201,,1337741,6940,,,,1268,,234080,195887,1574,0,,,,,,90702,,0,1533628,8242,,,70036,,1533628,8242,,0 +"2020-11-23","AR",2387,2191,30,196,8523,8523,974,51,,384,1475768,9314,,,1475768,945,164,146190,129405,1017,0,,,,20161,,127059,,0,1605173,10226,,,,118613,,0,1605173,10226 +"2020-11-23","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-23","AZ",6464,5992,0,472,24461,24461,2008,49,,469,1831299,17990,,,,,294,302324,293574,2659,0,,,,,,,,0,3563416,23236,,,357473,,2124873,20521,3563416,23236 +"2020-11-23","CA",18726,,50,,,,6254,0,,1455,,0,,,,,,1110370,1110370,8337,0,,,,,,,,0,22457544,220235,,,,,,0,22457544,220235 +"2020-11-23","CO",2810,2347,4,463,12526,12526,1711,42,,,1437928,15649,182357,,,,,202289,192943,3689,0,15579,,,,,,2901740,46130,2901740,46130,198604,,,,1630871,19307,,0 +"2020-11-23","CT",4871,3915,43,956,12257,12257,875,0,,,,0,,,3249828,,,106740,99313,5271,0,,3629,,,132564,,,0,3386920,18813,,47691,,,,0,3386920,18813 +"2020-11-23","DC",672,,2,,,,135,0,,34,,0,,,,,13,20290,,139,0,,,,,,14935,639461,8929,639461,8929,,,,,291028,2704,,0 +"2020-11-23","DE",752,661,4,91,,,178,0,,30,370630,2002,,,,,,32211,30892,403,0,,,,,33232,16073,687482,7533,687482,7533,,,,,402841,2405,,0 +"2020-11-23","FL",18310,,96,,54167,54167,3754,100,,,5997774,23987,557126,541211,9192009,,,930728,860860,6114,0,67208,,65507,,1202993,,11740720,79792,11740720,79792,624738,,607025,,6928502,30101,10445187,79817 +"2020-11-23","GA",9215,8644,17,571,34083,34083,2257,26,6377,,,0,,,,,,451056,406220,1924,0,34740,,,,380636,,,0,4139509,26729,357156,,,,,0,4139509,26729 +"2020-11-23","GU",106,,0,,,,48,0,,8,74397,1061,,,,,4,6602,6481,53,0,9,121,,,,4846,,0,80999,1114,216,1187,,,,0,80878,1211 +"2020-11-23","HI",233,233,0,,1234,1234,72,0,,23,,0,,,,,10,17596,17333,113,0,,,,,17296,,636113,5756,636113,5756,,,,,,0,,0 +"2020-11-23","IA",2206,,14,,,,1333,0,,273,850517,4222,,69308,,,135,189856,189856,2351,0,,,4564,23323,,116837,,0,1040373,6573,,,73912,128726,1042428,6581,,0 +"2020-11-23","ID",849,783,2,66,3610,3610,442,25,688,89,375709,1996,,,,,,91653,78163,819,0,,,,,,38025,,0,453872,2627,,31219,,,453872,2627,679194,3475 +"2020-11-23","IL",12112,11552,61,560,,,6171,0,,1206,,0,,,,,635,664620,,8322,0,,,,,,,,0,9892981,91562,,,,,,0,9892981,91562 +"2020-11-23","IN",5332,5067,27,265,23526,23526,3219,317,4313,915,1789815,12482,,,,,317,300913,,5556,0,,,,,275890,,,0,3939645,42100,,,,,2090728,18038,3939645,42100 +"2020-11-23","KS",1456,,46,,4777,4777,896,95,1294,240,642229,12869,,,,377,89,142059,,7526,0,,,,,,,,0,784288,20395,,,,,784288,20395,,0 +"2020-11-23","KY",1792,1747,5,45,9530,9530,1573,119,2360,391,,0,,,,,203,160232,132799,2132,0,,,,,,26611,,0,2441630,33759,94156,103414,,,,0,2441630,33759 +"2020-11-23","LA",6284,6039,24,245,,,1012,0,,,3041032,9278,,,,,114,221160,211094,968,0,,,,,,185960,,0,3262192,10246,,89615,,,,0,3252126,10248 +"2020-11-23","MA",10531,10299,19,232,13817,13817,922,0,,204,3013965,13760,,,,,91,208623,201835,1773,0,,,12007,,254878,145682,,0,7920042,52280,,,130696,245501,3215800,15545,7920042,52280 +"2020-11-23","MD",4448,4293,14,155,19769,19769,1276,133,,289,2054695,11445,,140937,,,,183797,183797,1658,0,,,14868,,219779,8511,,0,4171674,30947,,,155805,,2238492,13103,4171674,30947 +"2020-11-23","ME",177,176,1,1,647,647,103,5,,45,,0,12233,,,,11,10544,9471,185,0,389,126,,,11618,7986,,0,808539,7719,12634,1677,,,,0,808539,7719 +"2020-11-23","MI",8940,8543,65,397,,,4047,0,,872,,0,,,5922572,,455,340964,314216,11943,0,,,,,404919,152267,,0,6327491,100523,356370,,,,,0,6327491,100523 +"2020-11-23","MN",3265,3205,24,60,15106,15106,1778,177,3480,364,2069219,20622,,,,,,276500,271557,6343,0,,,,,,227311,3756777,56434,3756777,56434,,80527,,,2340776,26682,,0 +"2020-11-23","MO",3561,,2,,,,2805,0,,647,1475199,7006,85172,,2631038,,314,274897,274897,3370,0,7427,15185,,,305429,,,0,2942201,18772,92803,99985,88095,59836,1750096,10376,2942201,18772 +"2020-11-23","MP",2,2,0,,4,4,,0,,,16747,280,,,,,,104,104,0,0,,,,,,29,,0,16851,280,,,,,16851,284,22633,0 +"2020-11-23","MS",3676,3233,0,443,7294,7294,1014,203,,213,947272,40281,,,,,102,143879,117670,699,0,,,,,,121637,,0,1091151,40980,50014,172860,,,,0,1064942,45341 +"2020-11-23","MT",614,,11,,2377,2377,467,27,,84,,0,,,,,44,56381,,701,0,,,,,,39450,,0,617974,4965,,,,,,0,617974,4965 +"2020-11-23","NC",5039,4910,5,129,,,1601,0,,397,,0,,,,,,339194,320990,2419,0,,,,,,,,0,4896217,42082,,91610,,,,0,4896217,42082 +"2020-11-23","ND",852,,6,,2481,2481,377,22,392,42,266086,882,10671,,,,,74556,73311,712,0,852,,,,,62697,1033394,6472,1033394,6472,11523,3188,,,339483,1598,1084813,7094 +"2020-11-23","NE",909,,4,,3963,3963,976,19,,,592697,2037,,,1130083,,,114061,,1032,0,,,,,130994,58057,,0,1262563,6796,,,,,707108,3074,1262563,6796 +"2020-11-23","NH",512,,0,,831,831,121,1,277,,391015,1588,,,,,,18042,15212,444,0,,,,,,13226,,0,770791,5872,33915,,32939,,406227,1903,770791,5872 +"2020-11-23","NJ",16772,14960,11,1812,40222,40222,2693,123,,537,5365678,50536,,,,,240,334671,309588,4040,0,,,,,,,,0,5700349,54576,,,,,,0,5675266,54117 +"2020-11-23","NM",1400,,17,,6229,6229,846,124,,,,0,,,,,,84148,,2252,0,,,,,,29183,,0,1464452,9455,,,,,,0,1464452,9455 +"2020-11-23","NV",2023,,6,,,,1274,0,,278,797361,5435,,,,,163,136227,136227,2339,0,,,,,,,1536076,15531,1536076,15531,,,,,933588,7774,,0 +"2020-11-23","NY",26390,,33,,89995,89995,2724,0,,545,,0,,,,,234,602120,,5906,0,,,,,,,18187840,191489,18187840,191489,,,,,,0,,0 +"2020-11-23","OH",6020,5635,24,385,24705,24705,4358,282,4454,1079,,0,,,,,573,363304,344054,11885,0,,13265,,,373621,230678,,0,5744334,69582,,317578,,,,0,5744334,69582 +"2020-11-23","OK",1649,,15,,11368,11368,1505,35,,450,1789645,0,,,1789645,,,177874,,3544,0,5828,,,,180908,142381,,0,1967519,3544,95129,,,,,0,1975039,0 +"2020-11-23","OR",820,,1,,3970,3970,458,0,,99,944444,6865,,,1730812,,38,65170,,1502,0,,,,,95240,,,0,1826052,13396,,,,,990744,0,1826052,13396 +"2020-11-23","PA",9870,,28,,,,3459,0,,767,2705170,14185,,,,,380,314401,293367,4762,0,,,,,,198072,5305634,44898,5305634,44898,,,,,2998537,18614,,0 +"2020-11-23","PR",1032,812,15,220,,,607,0,,100,305972,0,,,395291,,99,48200,46923,741,0,39130,,,,20103,39214,,0,354172,741,,,,,,0,415664,0 +"2020-11-23","RI",1309,,6,,4177,4177,285,0,,30,461092,1680,,,1404823,,14,50573,,429,0,,,,,63259,,1468082,7679,1468082,7679,,,,,511665,2109,,0 +"2020-11-23","SC",4288,3987,5,301,11563,11563,844,33,,216,2060053,19780,77189,,1998108,,92,207552,194902,1257,0,11126,23220,,,256847,108469,,0,2267605,21037,88315,193630,,,,0,2254955,20895 +"2020-11-23","SD",819,,0,,4107,4107,582,13,,101,239449,1296,,,,,47,73848,69217,783,0,,,,,75492,55679,,0,489256,4233,,,,,313297,2079,489256,4233 +"2020-11-23","TN",4301,3957,35,344,11628,11628,2317,58,,593,,0,,,3931809,,263,344550,318428,4074,0,,26380,,,376713,296592,,0,4308522,28457,,263282,,,,0,4308522,28457 +"2020-11-23","TX",20588,,32,,,,8353,0,,2299,,0,,,,,,1201257,1100979,7641,0,57713,52412,,,1235153,917739,,0,10435105,55174,552103,634477,,,,0,10435105,55174 +"2020-11-23","UT",797,,4,,7602,7602,558,70,1400,199,1099924,4852,,,1556628,516,,179420,,2244,0,,13889,,13384,179196,117104,,0,1735824,10113,,182969,,86266,1266141,6377,1735824,10113 +"2020-11-23","VA",3942,3629,4,313,14096,14096,1512,50,,351,,0,,,,,152,221038,198142,3242,0,12636,18262,,,237216,,3161059,42165,3161059,42165,161986,281905,,,,0,,0 +"2020-11-23","VI",23,,0,,,,,0,,,25975,0,,,,,,1504,,0,0,,,,,,1407,,0,27479,0,,,,,27549,0,,0 +"2020-11-23","VT",63,63,0,,,,19,0,,3,211201,1691,,,,,,3795,3702,68,0,,,,,,2300,,0,523227,6566,,,,,214903,1759,523227,6566 +"2020-11-23","WA",2619,2619,0,,9765,9765,893,0,,165,,0,,,,,86,159231,154801,1890,0,,,,,,,2894367,0,2894367,0,,,,,,0,,0 +"2020-11-23","WI",3158,3011,8,147,15930,15930,1999,107,1754,438,2094448,9196,,,,,,379693,357771,3455,0,,,,,,280358,4196070,33414,4196070,33414,,,,,2452219,12291,,0 +"2020-11-23","WV",667,635,5,32,,,463,0,,136,,0,,,,,60,41114,35778,636,0,,,,,,26769,,0,1030860,11672,20380,,,,,0,1030860,11672 +"2020-11-23","WY",202,,26,,690,690,224,31,,,131788,0,,,357125,,,29431,25560,1262,0,,,,,27600,17452,,0,384725,2515,,,,,155135,0,384725,2515 +"2020-11-22","AK",103,103,1,,612,612,133,0,,,,0,,,893886,,17,26587,,543,0,,,,,31927,,,0,926361,7616,,,,,,0,926361,7616 +"2020-11-22","AL",3457,3153,0,304,23449,23449,1332,0,2199,,1330801,5710,,,,1268,,232506,194585,1798,0,,,,,,90702,,0,1525386,7200,,,69857,,1525386,7200,,0 +"2020-11-22","AR",2357,2161,20,196,8472,8472,962,57,,371,1466454,12729,,,1466454,938,163,145173,128493,1352,0,,,,19952,,125153,,0,1594947,14006,,,,116897,,0,1594947,14006 +"2020-11-22","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-22","AZ",6464,5992,7,472,24412,24412,1932,231,,438,1813309,16546,,,,,256,299665,291043,4331,0,,,,,,,,0,3540180,30985,,,356561,,2104352,20709,3540180,30985 +"2020-11-22","CA",18676,,33,,,,5918,0,,1390,,0,,,,,,1102033,1102033,14319,0,,,,,,,,0,22237309,265477,,,,,,0,22237309,265477 +"2020-11-22","CO",2806,2343,19,463,12484,12484,1670,60,,,1422279,18264,182357,,,,,198600,189285,3921,0,15579,,,,,,2855610,47972,2855610,47972,197936,,,,1611564,22169,,0 +"2020-11-22","CT",4828,3878,0,950,12257,12257,848,0,,,,0,,,3232317,,,101469,94426,0,0,,3269,,,131283,,,0,3368107,20935,,42917,,,,0,3368107,20935 +"2020-11-22","DC",670,,0,,,,136,0,,33,,0,,,,,17,20151,,190,0,,,,,,14882,630532,11748,630532,11748,,,,,288324,-128,,0 +"2020-11-22","DE",748,657,2,91,,,177,0,,29,368628,3006,,,,,,31808,30492,487,0,,,,,32836,15890,679949,9593,679949,9593,,,,,400436,3493,,0 +"2020-11-22","FL",18214,,62,,54067,54067,3613,138,,,5973787,41853,557126,541211,9120724,,,924614,856628,6374,0,67208,,65507,,1194646,,11660928,90769,11660928,90769,624738,,607025,,6898401,48227,10365370,82235 +"2020-11-22","GA",9198,8627,19,571,34057,34057,2193,34,6373,,,0,,,,,,449132,404411,2328,0,34527,,,,378620,,,0,4112780,26638,356199,,,,,0,4112780,26638 +"2020-11-22","GU",106,,2,,,,50,0,,7,73336,0,,,,,3,6549,6331,73,0,9,121,,,,4430,,0,79885,73,216,1151,,,,0,79667,0 +"2020-11-22","HI",233,233,2,,1234,1234,72,0,,23,,0,,,,,10,17483,17220,122,0,,,,,17186,,630357,5342,630357,5342,,,,,,0,,0 +"2020-11-22","IA",2192,,32,,,,1340,0,,255,846295,4190,,69080,,,132,187505,187505,2537,0,,,4555,23009,,116308,,0,1033800,6727,,,73675,128007,1035847,6733,,0 +"2020-11-22","ID",847,783,2,64,3585,3585,442,93,681,89,373713,2282,,,,,,90834,77532,1070,0,,,,,,37504,,0,451245,3244,,31219,,,451245,3244,675719,4535 +"2020-11-22","IL",12051,11506,99,545,,,6072,0,,1179,,0,,,,,589,656298,,10012,0,,,,,,,,0,9801419,92437,,,,,,0,9801419,92437 +"2020-11-22","IN",5305,5040,59,265,23209,23209,3144,335,4284,878,1777333,13373,,,,,310,295357,,6174,0,,,,,271532,,,0,3897545,51165,,,,,2072690,19547,3897545,51165 +"2020-11-22","KS",1410,,0,,4682,4682,1048,0,1269,269,629360,0,,,,372,109,134533,,0,0,,,,,,,,0,763893,0,,,,,763893,0,,0 +"2020-11-22","KY",1787,1742,4,45,9411,9411,1514,0,2342,370,,0,,,,,202,158100,130899,2192,0,,,,,,26156,,0,2407871,0,93778,102900,,,,0,2407871,0 +"2020-11-22","LA",6260,6015,27,245,,,967,0,,,3031754,39086,,,,,105,220192,210124,3483,0,,,,,,185960,,0,3251946,42569,,89446,,,,0,3241878,42171 +"2020-11-22","MA",10512,10281,24,231,13817,13817,893,0,,192,3000205,23189,,,,,88,206850,200050,2695,0,,,12007,,252791,145682,,0,7867762,110280,,,130696,244860,3200255,25910,7867762,110280 +"2020-11-22","MD",4434,4279,19,155,19636,19636,1237,202,,268,2043250,16932,,140937,,,,182139,182139,2168,0,,,14868,,217845,8506,,0,4140727,49895,,,155805,,2225389,19100,4140727,49895 +"2020-11-22","ME",176,175,2,1,642,642,94,6,,42,,0,12162,,,,11,10359,9294,236,0,384,118,,,11457,7791,,0,800820,9733,12558,1652,,,,0,800820,9733 +"2020-11-22","MI",8875,8478,0,397,,,3887,0,,835,,0,,,5835232,,403,329021,302705,0,0,,,,,391736,152267,,0,6226968,0,354957,,,,,0,6226968,0 +"2020-11-22","MN",3241,3181,40,60,14929,14929,1784,184,3452,369,2048597,29191,,,,,,270157,265497,7205,0,,,,,,219720,3700343,60166,3700343,60166,,79491,,,2314094,36114,,0 +"2020-11-22","MO",3559,,4,,,,2817,0,,646,1468193,8288,84949,,2615902,,336,271527,271527,4215,0,7343,14973,,,301823,,,0,2923429,24361,92496,99059,87838,59084,1739720,12503,2923429,24361 +"2020-11-22","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,104,104,1,0,,,,,,29,,0,16571,1,,,,,16567,0,22633,-839 +"2020-11-22","MS",3676,3233,19,443,7091,7091,999,0,,223,906991,0,,,,,106,143180,117309,779,0,,,,,,116683,,0,1050171,779,48342,145992,,,,0,1019601,0 +"2020-11-22","MT",603,,3,,2350,2350,477,14,,,,0,,,,,,55680,,1138,0,,,,,,39051,,0,613009,4507,,,,,,0,613009,4507 +"2020-11-22","NC",5034,4907,29,127,,,1571,0,,404,,0,,,,,,336775,318763,4514,0,,,,,,,,0,4854135,50519,,91610,,,,0,4854135,50519 +"2020-11-22","ND",846,,6,,2459,2459,379,35,389,39,265204,1056,10560,,,,,73844,72605,1180,0,818,,,,,61599,1026922,9893,1026922,9893,11378,3164,,,337885,2197,1077719,10629 +"2020-11-22","NE",905,,8,,3944,3944,963,29,,,590660,3481,,,1124456,,,113029,,1368,0,,,,,129834,16068,,0,1255767,12514,,,,,704034,4848,1255767,12514 +"2020-11-22","NH",512,,4,,830,830,117,1,276,,389427,3579,,,,,,17598,14897,317,0,,,,,,12887,,0,764919,9416,33879,,32909,,404324,3791,764919,9416 +"2020-11-22","NJ",16761,14949,15,1812,40099,40099,2568,106,,466,5315142,49839,,,,,237,330631,306007,4441,0,,,,,,,,0,5645773,54280,,,,,,0,5621149,53807 +"2020-11-22","NM",1383,,33,,6105,6105,845,33,,,,0,,,,,,81896,,2456,0,,,,,,28857,,0,1454997,10876,,,,,,0,1454997,10876 +"2020-11-22","NV",2017,,6,,,,1273,0,,266,791926,4280,,,,,152,133888,133888,2155,0,,,,,,,1520545,13481,1520545,13481,,,,,925814,6435,,0 +"2020-11-22","NY",26357,,31,,89995,89995,2562,0,,502,,0,,,,,234,596214,,5392,0,,,,,,,17996351,196610,17996351,196610,,,,,,0,,0 +"2020-11-22","OH",5996,5612,12,384,24423,24423,4181,205,4418,1013,,0,,,,,538,351419,333020,8133,0,,12910,,,364988,227276,,0,5674752,70382,,313792,,,,0,5674752,70382 +"2020-11-22","OK",1634,,10,,11333,11333,1505,149,,450,1789645,0,,,1789645,,,174330,,3406,0,5828,,,,180908,140312,,0,1963975,3406,95129,,,,,0,1975039,0 +"2020-11-22","OR",819,,7,,3970,3970,458,0,,99,937579,6001,,,1718496,,38,63668,,1493,0,,,,,94160,,,0,1812656,24168,,,,,990744,0,1812656,24168 +"2020-11-22","PA",9842,,41,,,,3379,0,,775,2690985,22309,,,,,371,309639,288938,7075,0,,,,,,193640,5260736,64025,5260736,64025,,,,,2979923,28769,,0 +"2020-11-22","PR",1017,798,5,219,,,606,0,,98,305972,0,,,395291,,96,47459,46235,1025,0,38689,,,,20103,39142,,0,353431,1025,,,,,,0,415664,0 +"2020-11-22","RI",1303,,3,,4177,4177,285,31,,30,459412,3156,,,1397663,,14,50144,,738,0,,,,,62740,,1460403,18053,1460403,18053,,,,,509556,3894,,0 +"2020-11-22","SC",4283,3982,9,301,11530,11530,809,35,,201,2040273,20039,76867,,1978630,,93,206295,193787,1277,0,10982,22979,,,255430,107683,,0,2246568,21316,87849,191023,,,,0,2234060,21181 +"2020-11-22","SD",819,,42,,4094,4094,577,42,,97,238153,1197,,,,,49,73065,68448,851,0,,,,,74673,55349,,0,485023,4245,,,,,311218,2048,485023,4245 +"2020-11-22","TN",4266,3929,55,337,11570,11570,2266,31,,570,,0,,,3907353,,264,340476,314854,4589,0,,25775,,,372712,294231,,0,4280065,36153,,252993,,,,0,4280065,36153 +"2020-11-22","TX",20556,,89,,,,8174,0,,2215,,0,,,,,,1193616,1094275,9769,0,57040,51881,,,1228284,913796,,0,10379931,75543,548439,630204,,,,0,10379931,75543 +"2020-11-22","UT",793,,6,,7532,7532,579,74,1398,197,1095072,9269,,,1548180,516,,177176,,3197,0,,13641,,13144,177531,115904,,0,1725711,19107,,181197,,85181,1259764,12447,1725711,19107 +"2020-11-22","VA",3938,3628,0,310,14046,14046,1469,29,,320,,0,,,,,145,217796,195499,2117,0,12551,17860,,,234326,,3118894,47759,3118894,47759,161570,278521,,,,0,,0 +"2020-11-22","VI",23,,0,,,,,0,,,25975,199,,,,,,1504,,13,0,,,,,,1407,,0,27479,212,,,,,27549,211,,0 +"2020-11-22","VT",63,63,0,,,,22,0,,3,209510,3419,,,,,,3727,3634,88,0,,,,,,2279,,0,516661,10118,,,,,213144,3506,516661,10118 +"2020-11-22","WA",2619,2619,0,,9765,9765,887,48,,199,,0,,,,,86,157341,152996,3193,0,,,,,,,2894367,16473,2894367,16473,,,,,,0,,0 +"2020-11-22","WI",3150,3005,7,145,15823,15823,1988,89,1747,428,2085252,11392,,,,,,376238,354676,4019,0,,,,,,276574,4162656,40477,4162656,40477,,,,,2439928,14899,,0 +"2020-11-22","WV",662,630,4,32,,,433,0,,133,,0,,,,,59,40478,35292,880,0,,,,,,26476,,0,1019188,13779,20294,,,,,0,1019188,13779 +"2020-11-22","WY",176,,0,,659,659,235,0,,,131788,0,,,354936,,,28169,24309,759,0,,,,,27274,16807,,0,382210,745,,,,,155135,0,382210,745 +"2020-11-21","AK",102,102,1,,612,612,129,6,,,,0,,,886676,,14,26044,,675,0,,,,,31523,,,0,918745,14033,,,,,,0,918745,14033 +"2020-11-21","AL",3457,3153,6,304,23449,23449,1300,0,2197,,1325091,8287,,,,1268,,230708,193095,2335,0,,,,,,90702,,0,1518186,9974,,,69591,,1518186,9974,,0 +"2020-11-21","AR",2337,2141,16,196,8415,8415,922,62,,354,1453725,13635,,,1453725,934,154,143821,127216,1905,0,,,,19739,,123722,,0,1580941,15068,,,,116069,,0,1580941,15068 +"2020-11-21","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-21","AZ",6457,5985,30,472,24181,24181,1916,129,,435,1796763,16271,,,,,253,295334,286880,3638,0,,,,,,,,0,3509195,45002,,,355879,,2083643,19754,3509195,45002 +"2020-11-21","CA",18643,,86,,,,5745,0,,1332,,0,,,,,,1087714,1087714,15442,0,,,,,,,,0,21971832,241281,,,,,,0,21971832,241281 +"2020-11-21","CO",2787,2326,42,461,12424,12424,1703,258,,,1404015,19617,181571,,,,,194679,185380,6113,0,15445,,,,,,2807638,54920,2807638,54920,197016,,,,1589395,25657,,0 +"2020-11-21","CT",4828,3878,0,950,12257,12257,848,0,,,,0,,,3213042,,,101469,94426,0,0,,3269,,,129650,,,0,3347172,41949,,42917,,,,0,3347172,41949 +"2020-11-21","DC",670,,1,,,,122,0,,31,,0,,,,,17,19961,,153,0,,,,,,14821,618784,6580,618784,6580,,,,,288452,4949,,0 +"2020-11-21","DE",746,655,0,91,,,172,0,,29,365622,3156,,,,,,31321,30015,505,0,,,,,32381,15735,670356,10902,670356,10902,,,,,396943,3661,,0 +"2020-11-21","FL",18152,,42,,53929,53929,3396,180,,,5931934,39309,557126,541211,9047644,,,918240,851556,8175,0,67208,,65507,,1185730,,11570159,113698,11570159,113698,624738,,607025,,6850174,47484,10283135,99099 +"2020-11-21","GA",9179,8624,37,555,34023,34023,2136,126,6366,,,0,,,,,,446804,402435,6209,0,34191,,,,376594,,,0,4086142,43016,354407,,,,,0,4086142,43016 +"2020-11-21","GU",104,,1,,,,54,0,,11,73336,0,,,,,5,6476,6331,24,0,9,121,,,,4430,,0,79812,24,216,1151,,,,0,79667,0 +"2020-11-21","HI",231,231,7,,1234,1234,72,6,,23,,0,,,,,10,17361,17098,162,0,,,,,17067,,625015,6837,625015,6837,,,,,,0,,0 +"2020-11-21","IA",2160,,27,,,,1416,0,,273,842105,4421,,68752,,,137,184968,184968,3178,0,,,4530,22702,,115736,,0,1027073,7599,,,73322,127114,1029114,7622,,0 +"2020-11-21","ID",845,780,10,65,3492,3492,404,89,673,89,371431,2289,,,,,,89764,76570,1786,0,,,,,,37232,,0,448001,3775,,31219,,,448001,3775,671184,55692 +"2020-11-21","IL",11952,11430,157,522,,,6175,0,,1173,,0,,,,,595,646286,,11891,0,,,,,,,,0,9708982,120284,,,,,,0,9708982,120284 +"2020-11-21","IN",5246,4992,40,254,22874,22874,3168,362,4227,925,1763960,15333,,,,,291,289183,,6872,0,,,,,265477,,,0,3846380,60958,,,,,2053143,22205,3846380,60958 +"2020-11-21","KS",1410,,0,,4682,4682,1048,0,1269,269,629360,0,,,,372,109,134533,,0,0,,,,,,,,0,763893,0,,,,,763893,0,,0 +"2020-11-21","KY",1783,1738,21,45,9411,9411,1514,125,2342,370,,0,,,,,202,155908,128943,3702,0,,,,,,26156,,0,2407871,52396,93778,102900,,,,0,2407871,52396 +"2020-11-21","LA",6233,5985,0,248,,,972,0,,,2992668,0,,,,,101,216709,207039,0,0,,,,,,185960,,0,3209377,0,,86376,,,,0,3199707,0 +"2020-11-21","MA",10488,10257,19,231,13817,13817,891,0,,187,2977016,29568,,,,,85,204155,197329,3206,0,,,12007,,249489,145682,,0,7757482,109239,,,130696,244122,3174345,32559,7757482,109239 +"2020-11-21","MD",4415,4261,17,154,19434,19434,1229,152,,278,2026318,17973,,140937,,,,179971,179971,2885,0,,,14868,,215371,8498,,0,4090832,51510,,,155805,,2206289,20858,4090832,51510 +"2020-11-21","ME",174,173,1,1,636,636,86,8,,41,,0,12162,,,,11,10123,9075,165,0,384,111,,,11212,7713,,0,791087,11909,12558,1439,,,,0,791087,11909 +"2020-11-21","MI",8875,8478,101,397,,,3887,0,,835,,0,,,5835232,,403,329021,302705,7840,0,,,,,391736,152267,,0,6226968,89883,354957,,,,,0,6226968,89883 +"2020-11-21","MN",3201,3141,51,60,14745,14745,1784,283,3427,369,2019406,11828,,,,,,262952,258574,6252,0,,,,,,211513,3640177,51620,3640177,51620,,71933,,,2277980,17686,,0 +"2020-11-21","MO",3555,,18,,,,2851,0,,632,1459905,-2185,84577,,2596099,,336,267312,267312,4876,0,7191,14636,,,297321,,,0,2899068,9082,91971,97782,87395,58056,1727217,2691,2899068,9082 +"2020-11-21","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,103,103,0,0,,,,,,29,,0,16570,0,,,,,16567,0,23472,0 +"2020-11-21","MS",3657,3224,15,433,7091,7091,999,0,,223,906991,0,,,,,106,142401,116768,1972,0,,,,,,116683,,0,1049392,1972,48342,145992,,,,0,1019601,0 +"2020-11-21","MT",600,,33,,2336,2336,474,84,,,,0,,,,,,54542,,1249,0,,,,,,38701,,0,608502,6827,,,,,,0,608502,6827 +"2020-11-21","NC",5005,4880,26,125,,,1590,0,,409,,0,,,,,,332261,314615,3415,0,,,,,,,,0,4803616,53339,,88848,,,,0,4803616,53339 +"2020-11-21","ND",840,,0,,2424,2424,376,34,387,42,264148,836,10560,,,,,72664,71454,1572,0,818,,,,,60640,1017029,11760,1017029,11760,11378,3099,,,335688,2361,1067090,12954 +"2020-11-21","NE",897,,43,,3915,3915,987,56,,,587179,4305,,,1113475,,,111661,,2381,0,,,,,128313,56605,,0,1243253,21988,,,,,699186,6692,1243253,21988 +"2020-11-21","NH",508,,1,,829,829,116,2,276,,385848,397,,,,,,17281,14685,484,0,,,,,,12599,,0,755503,8447,33822,,32858,,400533,727,755503,8447 +"2020-11-21","NJ",16746,14934,34,1812,39993,39993,2552,168,,486,5265303,44973,,,,,232,326190,302039,5252,0,,,,,,,,0,5591493,50225,,,,,,0,5567342,49642 +"2020-11-21","NM",1350,,25,,6072,6072,825,61,,,,0,,,,,,79440,,2342,0,,,,,,28574,,0,1444121,10512,,,,,,0,1444121,10512 +"2020-11-21","NV",2011,,29,,,,1273,0,,266,787646,10966,,,,,152,131733,131733,2019,0,,,,,,,1507064,28901,1507064,28901,,,,,919379,12985,,0 +"2020-11-21","NY",26326,,34,,89995,89995,2443,0,,467,,0,,,,,212,590822,,5972,0,,,,,,,17799741,207907,17799741,207907,,,,,,0,,0 +"2020-11-21","OH",5984,5602,29,382,24218,24218,3987,260,4394,966,,0,,,,,482,343286,325611,7863,0,,12161,,,355805,224068,,0,5604370,69130,,295109,,,,0,5604370,69130 +"2020-11-21","OK",1624,,21,,11184,11184,1505,164,,450,1789645,49720,,,1789645,,,170924,,3663,0,5828,,,,180908,137887,,0,1960569,53383,95129,,,,,0,1975039,57400 +"2020-11-21","OR",812,,4,,3970,3970,458,35,,99,931578,7159,,,1696341,,38,62175,,1302,0,,,,,92147,,,0,1788488,24012,,,,,990744,8410,1788488,24012 +"2020-11-21","PA",9801,,112,,,,3294,0,,748,2668676,19806,,,,,367,302564,282478,6778,0,,,,,,193640,5196711,64469,5196711,64469,,,,,2951154,25829,,0 +"2020-11-21","PR",1012,793,21,219,,,621,0,,99,305972,0,,,395291,,99,46434,45268,1099,0,37873,,,,20103,38237,,0,352406,1099,,,,,,0,415664,0 +"2020-11-21","RI",1300,,6,,4146,4146,293,100,,28,456256,3325,,,1380451,,14,49406,,1405,0,,,,,61899,,1442350,26322,1442350,26322,,,,,505662,4730,,0 +"2020-11-21","SC",4274,3974,43,300,11495,11495,816,40,,188,2020234,30647,76564,,1958876,,90,205018,192645,1857,0,10833,22792,,,254003,106828,,0,2225252,32504,87397,188702,,,,0,2212879,32271 +"2020-11-21","SD",777,,36,,4052,4052,580,59,,94,236956,1157,,,,,49,72214,67715,1144,0,,,,,73664,54570,,0,480778,4576,,,,,309170,2301,480778,4576 +"2020-11-21","TN",4211,3880,9,331,11539,11539,2289,37,,564,,0,,,3875732,,263,335887,310739,4355,0,,25282,,,368180,291819,,0,4243912,28004,,247871,,,,0,4243912,28004 +"2020-11-21","TX",20467,,171,,,,8245,0,,2195,,0,,,,,,1183847,1085524,14922,0,56537,51349,,,1219414,909137,,0,10304388,121313,545643,625778,,,,0,10304388,121313 +"2020-11-21","UT",787,,14,,7458,7458,571,108,1393,183,1085803,8712,,,1532507,513,,173979,,3395,0,,13469,,12986,174097,114058,,0,1706604,17815,,178501,,83987,1247317,11470,1706604,17815 +"2020-11-21","VA",3938,3628,26,310,14017,14017,1507,103,,331,,0,,,,,135,215679,193754,2348,0,12447,17535,,,230823,,3071135,35503,3071135,35503,161019,274637,,,,0,,0 +"2020-11-21","VI",23,,0,,,,,0,,,25776,167,,,,,,1491,,9,0,,,,,,1402,,0,27267,176,,,,,27338,164,,0 +"2020-11-21","VT",63,63,1,,,,18,0,,2,206091,3192,,,,,,3639,3547,88,0,,,,,,2246,,0,506543,8637,,,,,209638,3276,506543,8637 +"2020-11-21","WA",2619,2619,16,,9717,9717,876,64,,206,,0,,,,,87,154148,149920,3082,0,,,,,,,2877894,21420,2877894,21420,,,,,,0,,0 +"2020-11-21","WI",3143,3005,52,138,15734,15734,2076,208,1742,441,2073860,11669,,,,,,372219,351169,7029,0,,,,,,272180,4122179,39436,4122179,39436,,,,,2425029,17893,,0 +"2020-11-21","WV",658,626,19,32,,,416,0,,121,,0,,,,,54,39598,34591,1118,0,,,,,,26165,,0,1005409,18453,20254,,,,,0,1005409,18453 +"2020-11-21","WY",176,,0,,659,659,219,6,,,131788,0,,,354330,,,27410,23567,281,0,,,,,27135,16530,,0,381465,796,,,,,155135,0,381465,796 +"2020-11-20","AK",101,101,0,,606,606,127,13,,,,0,,,874013,,15,25369,,460,0,,,,,30178,,,0,904712,5913,,,,,,0,904712,5913 +"2020-11-20","AL",3451,3148,32,303,23449,23449,1329,154,2189,,1316804,9548,,,,1265,,228373,191408,2463,0,,,,,,90702,,0,1508212,11495,,,69249,,1508212,11495,,0 +"2020-11-20","AR",2321,2125,24,196,8353,8353,928,85,,359,1440090,11805,,,1440090,932,146,141916,125783,2061,0,,,,19098,,122219,,0,1565873,13423,,,,112784,,0,1565873,13423 +"2020-11-20","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-20","AZ",6427,5961,43,466,24052,24052,1835,181,,431,1780492,22422,,,,,244,291696,283397,4471,0,,,,,,,,0,3464193,48856,,,355101,,2063889,26601,3464193,48856 +"2020-11-20","CA",18557,,91,,,,5497,0,,1332,,0,,,,,,1072272,1072272,13005,0,,,,,,,,0,21730551,178023,,,,,,0,21730551,178023 +"2020-11-20","CO",2745,2291,15,454,12166,12166,1723,186,,,1384398,20692,180596,,,,,188566,179340,5765,0,15262,,,,,,2752718,57018,2752718,57018,195858,,,,1563738,26379,,0 +"2020-11-20","CT",4828,3878,23,950,12257,12257,848,0,,,,0,,,3173610,,,101469,94426,2088,0,,3269,,,127224,,,0,3305223,43050,,42917,,,,0,3305223,43050 +"2020-11-20","DC",669,,2,,,,126,0,,28,,0,,,,,11,19808,,130,0,,,,,,14699,612204,4370,612204,4370,,,,,283503,1289,,0 +"2020-11-20","DE",746,655,4,91,,,170,0,,26,362466,3598,,,,,,30816,29511,663,0,,,,,31835,15534,659454,16112,659454,16112,,,,,393282,4261,,0 +"2020-11-20","FL",18110,,80,,53749,53749,3439,230,,,5892625,38335,539858,524946,8959851,,,910065,845249,8831,0,64112,,62540,,1174714,,11456461,107865,11456461,107865,604369,,587789,,6802690,47166,10184036,88356 +"2020-11-20","GA",9142,8591,40,551,33897,33897,2139,119,6340,,,0,,,,,,440595,399410,3439,0,33719,,,,373623,,,0,4043126,32450,351953,,,,,0,4043126,32450 +"2020-11-20","GU",103,,2,,,,56,0,,13,73336,364,,,,,6,6452,6331,36,0,9,121,,,,4430,,0,79788,400,216,1151,,,,0,79667,400 +"2020-11-20","HI",224,224,1,,1228,1228,77,9,,23,,0,,,,,10,17199,16936,118,0,,,,,16909,,618178,5563,618178,5563,,,,,,0,,0 +"2020-11-20","IA",2133,,27,,,,1447,0,,275,837684,4521,,68421,,,144,181790,181790,3477,0,,,4455,22164,,114338,,0,1019474,7998,,,72916,125266,1021492,8010,,0 +"2020-11-20","ID",835,769,23,66,3403,3403,389,91,651,84,369142,2627,,,,,,87978,75084,1543,0,,,,,,36831,,0,444226,3871,,24306,,,444226,3871,615492,6980 +"2020-11-20","IL",11795,11304,147,491,,,6111,0,,1196,,0,,,,,604,634395,,13012,0,,,,,,,,0,9588698,116024,,,,,,0,9588698,116024 +"2020-11-20","IN",5206,4952,63,254,22512,22512,3077,352,4182,898,1748627,14367,,,,,278,282311,,6808,0,,,,,259467,,,0,3785422,60088,,,,,2030938,21175,3785422,60088 +"2020-11-20","KS",1410,,84,,4682,4682,1048,121,1269,269,629360,9693,,,,372,109,134533,,5939,0,,,,,,,,0,763893,15632,,,,,763893,15632,,0 +"2020-11-20","KY",1762,1720,20,42,9286,9286,1544,123,2320,366,,0,,,,,188,152206,125825,3816,0,,,,,,25728,,0,2355475,26080,93595,102117,,,,0,2355475,26080 +"2020-11-20","LA",6233,5985,34,248,,,972,0,,,2992668,93007,,,,,101,216709,207039,4743,0,,,,,,185960,,0,3209377,97750,,86376,,,,0,3199707,97303 +"2020-11-20","MA",10469,10238,34,231,13817,13817,904,0,,179,2947448,22590,,,,,75,200949,194338,2399,0,,,12007,,245981,145682,,0,7648243,71269,,,130696,240068,3141786,24878,7648243,71269 +"2020-11-20","MD",4398,4245,26,153,19282,19282,1207,148,,261,2008345,13570,,140937,,,,177086,177086,2353,0,,,14868,,212068,8474,,0,4039322,41252,,,155805,,2185431,15923,4039322,41252 +"2020-11-20","ME",173,172,2,1,628,628,90,15,,49,,0,12162,,,,12,9958,8933,224,0,384,98,,,10924,7590,,0,779178,7065,12558,1301,,,,0,779178,7065 +"2020-11-20","MI",8774,8377,57,397,,,3887,0,,835,,0,,,5755505,,403,321181,295177,10140,0,,,,,381580,138862,,0,6137085,85362,353571,,,,,0,6137085,85362 +"2020-11-20","MN",3150,3093,68,57,14462,14462,1784,291,3387,369,2007578,20668,,,,,,256700,252716,6794,0,,,,,,202432,3588557,53812,3588557,53812,,70895,,,2260294,27157,,0 +"2020-11-20","MO",3537,,30,,,,2734,0,,638,1462090,7203,84544,,2592316,,323,262436,262436,4614,0,7011,14107,,,292075,,,0,2889986,24813,91758,95126,87278,56545,1724526,11817,2889986,24813 +"2020-11-20","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,103,103,0,0,,,,,,29,,0,16570,0,,,,,16567,0,23472,0 +"2020-11-20","MS",3642,3215,23,427,7091,7091,965,0,,225,906991,0,,,,,99,140429,115817,1638,0,,,,,,116683,,0,1047420,1638,48342,145992,,,,0,1019601,0 +"2020-11-20","MT",567,,6,,2252,2252,506,31,,,,0,,,,,,53293,,1475,0,,,,,,30557,,0,601675,5846,,,,,,0,601675,5846 +"2020-11-20","NC",4979,4854,43,125,,,1571,0,,415,,0,,,,,,328846,311772,3688,0,,,,,,,,0,4750277,49935,,84138,,,,0,4750277,49935 +"2020-11-20","ND",840,,39,,2390,2390,395,52,385,45,263312,747,10560,,,,,71092,69931,1434,0,818,,,,,59283,1005269,9399,1005269,9399,11378,2879,,,333327,2158,1054136,10177 +"2020-11-20","NE",854,,28,,3859,3859,983,133,,,582874,3703,,,1094117,,,109280,,2663,0,,,,,125705,55885,,0,1221265,18151,,,,,692494,6372,1221265,18151 +"2020-11-20","NH",507,,1,,827,827,108,1,276,,385451,3913,,,,,,16797,14355,520,0,,,,,,12201,,0,747056,8994,33775,,32818,,399806,4323,747056,8994 +"2020-11-20","NJ",16712,14900,23,1812,39825,39825,2505,177,,452,5220330,43744,,,,,233,320938,297370,4325,0,,,,,,,,0,5541268,48069,,,,,,0,5517700,51552 +"2020-11-20","NM",1325,,23,,6011,6011,808,46,,,,0,,,,,,77098,,2982,0,,,,,,28130,,0,1433609,12812,,,,,,0,1433609,12812 +"2020-11-20","NV",1982,,29,,,,1283,0,,271,776680,1382,,,,,151,129714,129714,1839,0,,,,,,,1478163,6399,1478163,6399,,,,,906394,3221,,0 +"2020-11-20","NY",26292,,35,,89995,89995,2348,0,,445,,0,,,,,205,584850,,5468,0,,,,,,,17591834,205466,17591834,205466,,,,,,0,,0 +"2020-11-20","OH",5955,5578,65,377,23958,23958,3936,398,4360,966,,0,,,,,488,335423,318151,8808,0,,11493,,,346586,220281,,0,5535240,65066,,280852,,,,0,5535240,65066 +"2020-11-20","OK",1603,,15,,11020,11020,1428,184,,421,1739925,13704,,,1739925,,,167261,,2921,0,5828,,,,173518,134934,,0,1907186,16625,95129,,,,,0,1917639,15419 +"2020-11-20","OR",808,,20,,3935,3935,497,47,,107,924419,7238,,,1673967,,41,60873,,1204,0,,,,,90509,,,0,1764476,21039,,,,,982334,8410,1764476,21039 +"2020-11-20","PA",9689,,108,,,,3162,0,,661,2648870,19343,,,,,351,295786,276455,6808,0,,,,,,192260,5132242,60289,5132242,60289,,,,,2925325,25475,,0 +"2020-11-20","PR",991,775,9,216,,,614,0,,99,305972,0,,,395291,,98,45335,44277,904,0,37569,,,,20103,38238,,0,351307,904,,,,,,0,415664,0 +"2020-11-20","RI",1294,,6,,4046,4046,288,33,,24,452931,3093,,,1355657,,14,48001,,1050,0,,,,,60371,,1416028,14865,1416028,14865,,,,,500932,4143,,0 +"2020-11-20","SC",4231,3949,30,282,11455,11455,808,53,,203,1989587,28620,76067,,1928848,,106,203161,191021,2001,0,10574,22461,,,251760,105856,,0,2192748,30621,86641,183196,,,,0,2180608,30390 +"2020-11-20","SD",741,,36,,3993,3993,574,71,,107,235799,2272,,,,,56,71070,66704,1328,0,,,,,72517,51922,,0,476202,5237,,,,,306869,3600,476202,5237 +"2020-11-20","TN",4202,3872,74,330,11502,11502,2260,80,,589,,0,,,3852016,,269,331532,306892,3444,0,,24677,,,363892,287908,,0,4215908,21287,,242935,,,,0,4215908,21287 +"2020-11-20","TX",20296,,183,,,,8164,0,,2214,,0,,,,,,1168925,1072698,13795,0,55555,50463,,,1206044,901943,,0,10183075,119077,539765,613980,,,,0,10183075,119077 +"2020-11-20","UT",773,,17,,7350,7350,554,135,1384,182,1077091,9757,,,1517664,509,,170584,,4588,0,,12983,,12515,171125,112356,,0,1688789,21529,,168904,,79187,1235847,13783,1688789,21529 +"2020-11-20","VA",3912,3605,16,307,13914,13914,1510,99,,318,,0,,,,,133,213331,191971,2544,0,12337,16975,,,228050,,3035632,28171,3035632,28171,160366,267440,,,,0,,0 +"2020-11-20","VI",23,,0,,,,,0,,,25609,138,,,,,,1482,,13,0,,,,,,1393,,0,27091,151,,,,,27174,157,,0 +"2020-11-20","VT",62,62,1,,,,22,0,,1,202899,1180,,,,,,3551,3463,144,0,,,,,,2205,,0,497906,5041,,,,,206362,1319,497906,5041 +"2020-11-20","WA",2603,2603,11,,9653,9653,844,31,,209,,0,,,,,94,151066,147044,3070,0,,,,,,,2856474,21002,2856474,21002,,,,,,0,,0 +"2020-11-20","WI",3091,2954,81,137,15526,15526,2076,190,1729,441,2062191,12665,,,,,,365190,344945,7077,0,,,,,,266280,4082743,50551,4082743,50551,,,,,2407136,19138,,0 +"2020-11-20","WV",639,609,16,30,,,402,0,,120,,0,,,,,51,38480,33668,1081,0,,,,,,25664,,0,986956,16622,20185,,,,,0,986956,16622 +"2020-11-20","WY",176,,0,,653,653,219,24,,,131788,1658,,,353733,,,27129,23347,960,0,,,,,26936,16316,,0,380669,4546,,,,,155135,2516,380669,4546 +"2020-11-19","AK",101,101,1,,593,593,139,9,,,,0,,,868482,,14,24909,,490,0,,,,,29798,,,0,898799,13241,,,,,,0,898799,13241 +"2020-11-19","AL",3419,3123,72,296,23295,23295,1315,207,2182,,1307256,13211,,,,1261,,225910,189461,2424,0,,,,,,90702,,0,1496717,15049,,,68847,,1496717,15049,,0 +"2020-11-19","AR",2297,2105,22,192,8268,8268,891,129,,353,1428285,12983,,,1428285,925,143,139855,124165,2238,0,,,,18437,,120545,,0,1552450,14667,,,,107231,,0,1552450,14667 +"2020-11-19","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-19","AZ",6384,5919,19,465,23871,23871,1796,398,,433,1758070,14417,,,,,227,287225,279218,4123,0,,,,,,,,0,3415337,49728,,,354092,,2037288,18293,3415337,49728 +"2020-11-19","CA",18466,,106,,,,5319,0,,1253,,0,,,,,,1059267,1059267,11478,0,,,,,,,,0,21552528,133985,,,,,,0,21552528,133985 +"2020-11-19","CO",2730,2277,79,453,11980,11980,1593,178,,,1363706,20132,179842,,,,,182801,173653,6107,0,15141,,,,,,2695700,55085,2695700,55085,194983,,,,1537359,26159,,0 +"2020-11-19","CT",4805,3862,21,943,12257,12257,840,0,,,,0,,,3133084,,,99381,92625,2353,0,,3058,,,124778,,,0,3262173,48404,,40423,,,,0,3262173,48404 +"2020-11-19","DC",667,,2,,,,127,0,,34,,0,,,,,10,19678,,213,0,,,,,,14589,607834,6422,607834,6422,,,,,282214,1927,,0 +"2020-11-19","DE",742,652,0,90,,,165,0,,30,358868,1950,,,,,,30153,28860,398,0,,,,,31161,15435,643342,1216,643342,1216,,,,,389021,2348,,0 +"2020-11-19","FL",18030,,81,,53519,53519,3380,236,,,5854290,41643,539858,524946,8883148,,,901234,838550,8882,0,64112,,62540,,1163367,,11348596,110691,11348596,110691,604369,,587789,,6755524,50525,10095680,88682 +"2020-11-19","GA",9102,8569,37,533,33778,33778,2142,111,6327,,,0,,,,,,437156,396641,3514,0,33421,,,,371101,,,0,4010676,35607,350070,,,,,0,4010676,35607 +"2020-11-19","GU",101,,1,,,,57,0,,14,72972,258,,,,,8,6416,6295,70,0,8,111,,,,4423,,0,79388,328,212,1084,,,,0,79267,3861 +"2020-11-19","HI",223,223,0,,1219,1219,77,9,,23,,0,,,,,13,17081,16841,107,0,,,,,16812,,612615,5253,612615,5253,,,,,,0,,0 +"2020-11-19","IA",2106,,40,,,,1516,0,,286,833163,4016,,67998,,,135,178313,178313,3474,0,,,4407,21351,,112778,,0,1011476,7490,,,72445,122918,1013482,7657,,0 +"2020-11-19","ID",812,746,14,66,3312,3312,389,58,635,84,366515,3247,,,,,,86435,73840,1310,0,,,,,,36339,,0,440355,4322,,24306,,,440355,4322,608512,6915 +"2020-11-19","IL",11648,11178,180,470,,,6037,0,,1192,,0,,,,,587,621383,,14612,0,,,,,,,,0,9472674,113447,,,,,,0,9472674,113447 +"2020-11-19","IN",5143,4889,59,254,22160,22160,3063,423,4129,854,1734260,13026,,,,,269,275503,,7281,0,,,,,253606,,,0,3725334,57285,,,,,2009763,20307,3725334,57285 +"2020-11-19","KS",1326,,0,,4561,4561,1039,0,1241,253,619667,0,,,,364,95,128594,,0,0,,,,,,,,0,748261,0,,,,,748261,0,,0 +"2020-11-19","KY",1742,1701,30,41,9163,9163,1550,111,2303,358,,0,,,,,199,148390,122681,3637,0,,,,,,25437,,0,2329395,35701,91036,99337,,,,0,2329395,35701 +"2020-11-19","LA",6199,5951,15,248,,,929,0,,,2899661,23726,,,,,88,211966,202743,2052,0,,,,,,185960,,0,3111627,25778,,82227,,,,0,3102404,25487 +"2020-11-19","MA",10435,10204,28,231,13817,13817,917,229,,181,2924858,19418,,,,,75,198550,192050,2682,0,,,12007,,243281,145682,,0,7576974,92139,,,130696,237534,3116908,21950,7576974,92139 +"2020-11-19","MD",4372,4220,21,152,19134,19134,1192,175,,260,1994775,17263,,140937,,,,174733,174733,2910,0,,,14868,,209359,8441,,0,3998070,43963,,,155805,,2169508,20173,3998070,43963 +"2020-11-19","ME",171,170,1,1,613,613,88,13,,35,,0,12138,,,,12,9734,8732,215,0,384,92,,,10625,7403,,0,772113,12745,12534,1088,,,,0,772113,12745 +"2020-11-19","MI",8717,8324,144,393,,,3824,0,,843,,0,,,5681886,,400,311041,285398,7983,0,,,,,369837,138862,,0,6051723,71228,352058,,,,,0,6051723,71228 +"2020-11-19","MN",3082,3029,72,53,14171,14171,1751,279,3346,367,1986910,21144,,,,,,249906,246227,7863,0,,,,,,198365,3534745,55821,3534745,55821,,66452,,,2233137,28725,,0 +"2020-11-19","MO",3507,,30,,,,2588,0,,608,1454887,5884,84180,,2572460,,310,257822,257822,4349,0,6903,13603,,,287179,,,0,2865173,20181,91286,92097,86885,54893,1712709,10233,2865173,20181 +"2020-11-19","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,103,103,0,0,,,,,,29,,0,16570,0,,,,,16567,0,23472,0 +"2020-11-19","MS",3619,3195,18,424,7091,7091,926,0,,222,906991,0,,,,,103,138791,114888,1395,0,,,,,,116683,,0,1045782,1395,48342,145992,,,,0,1019601,0 +"2020-11-19","MT",561,,0,,2221,2221,482,19,,,,0,,,,,,51818,,1236,0,,,,,,30477,,0,595829,4423,,,,,,0,595829,4423 +"2020-11-19","NC",4936,4814,38,122,,,1538,0,,395,,0,,,,,,325158,308548,4296,0,,,,,,,,0,4700342,45852,,81125,,,,0,4700342,45852 +"2020-11-19","ND",801,,10,,2338,2338,387,31,381,46,262565,885,10560,,,,,69658,68530,1450,0,818,,,,,57686,995870,9530,995870,9530,11378,2716,,,331169,2259,1043959,10367 +"2020-11-19","NE",826,,10,,3726,3726,961,0,,,579171,3991,,,1078907,,,106617,,2812,0,,,,,122779,55037,,0,1203114,21919,,,,,686122,6809,1203114,21919 +"2020-11-19","NH",506,,2,,826,826,98,4,276,,381538,2449,,,,,,16277,13945,528,0,,,,,,11765,,0,738062,8916,33709,,32761,,395483,4332,738062,8916 +"2020-11-19","NJ",16689,14877,34,1812,39648,39648,2471,400,,456,5176586,0,,,,,216,316613,293744,4871,0,,,,,,,,0,5493199,4871,,,,,,0,5466148,0 +"2020-11-19","NM",1302,,12,,5965,5965,774,90,,,,0,,,,,,74116,,3665,0,,,,,,27659,,0,1420797,10974,,,,,,0,1420797,10974 +"2020-11-19","NV",1953,,6,,,,1288,0,,261,775298,4986,,,,,150,127875,127875,2416,0,,,,,,,1471764,17023,1471764,17023,,,,,903173,7402,,0 +"2020-11-19","NY",26257,,32,,89995,89995,2276,0,,437,,0,,,,,200,579382,,5310,0,,,,,,,17386368,195239,17386368,195239,,,,,,0,,0 +"2020-11-19","OH",5890,5522,63,368,23560,23560,3829,343,4318,943,,0,,,,,479,326615,310103,7787,0,,10906,,,338152,216619,,0,5470174,64482,,271517,,,,0,5470174,64482 +"2020-11-19","OK",1588,,18,,10836,10836,1381,149,,389,1726221,18705,,,1726221,,,164340,,2915,0,5545,,,,171369,132268,,0,1890561,21620,93221,,,,,0,1902220,21726 +"2020-11-19","OR",788,,10,,3888,3888,484,83,,103,917181,5929,,,1654174,,42,59669,,1099,0,,,,,89263,,,0,1743437,18803,,,,,973924,6986,1743437,18803 +"2020-11-19","PA",9581,,116,,,,2952,0,,659,2629527,20541,,,,,318,288978,270323,7126,0,,,,,,190725,5071953,62912,5071953,62912,,,,,2899850,26886,,0 +"2020-11-19","PR",982,767,11,215,,,573,0,,92,305972,0,,,395291,,78,44431,43403,521,0,37240,,,,20103,37327,,0,350403,521,,,,,,0,415664,0 +"2020-11-19","RI",1288,,4,,4013,4013,298,60,,26,449838,2678,,,1341975,,13,46951,,1040,0,,,,,59188,,1401163,16598,1401163,16598,,,,,496789,3718,,0 +"2020-11-19","SC",4201,3924,19,277,11402,11402,815,53,,203,1960967,22125,75667,,1900672,,108,201160,189251,1713,0,10376,22053,,,249546,104997,,0,2162127,23838,86043,177011,,,,0,2150218,23602 +"2020-11-19","SD",705,,31,,3922,3922,578,58,,95,233527,1225,,,,,51,69742,65499,1071,0,,,,,71241,51153,,0,470965,3825,,,,,303269,2296,470965,3825 +"2020-11-19","TN",4128,3810,80,318,11422,11422,2236,80,,577,,0,,,3833872,,257,328088,304077,2887,0,,23992,,,360749,283785,,0,4194621,16937,,235024,,,,0,4194621,16937 +"2020-11-19","TX",20113,,230,,,,7982,0,,2154,,0,,,,,,1155130,1060686,14269,0,54717,49558,,,1192594,896191,,0,10063998,117113,535321,597184,,,,0,10063998,117113 +"2020-11-19","UT",756,,16,,7215,7215,553,108,1363,195,1067334,10419,,,1500396,502,,165996,,3968,0,,12397,,11948,166864,110007,,0,1667260,21968,,159724,,74592,1222064,14462,1667260,21968 +"2020-11-19","VA",3896,3594,36,302,13815,13815,1569,108,,303,,0,,,,,123,210787,190156,1954,0,12233,16468,,,226178,,3007461,24031,3007461,24031,159753,257906,,,,0,,0 +"2020-11-19","VI",23,,0,,,,,0,,,25471,236,,,,,,1469,,6,0,,,,,,1388,,0,26940,242,,,,,27017,260,,0 +"2020-11-19","VT",61,61,1,,,,18,0,,1,201719,2874,,,,,,3407,3324,152,0,,,,,,2157,,0,492865,10540,,,,,205043,3024,492865,10540 +"2020-11-19","WA",2592,2592,21,,9622,9622,748,49,,191,,0,,,,,85,147996,144161,3216,0,,,,,,,2835472,22391,2835472,22391,,,,,,0,,0 +"2020-11-19","WI",3010,2876,85,134,15336,15336,2104,236,1715,427,2049526,12585,,,,,,358113,338472,7448,0,,,,,,259953,4032192,45778,4032192,45778,,,,,2387998,19220,,0 +"2020-11-19","WV",623,594,11,29,,,415,0,,123,,0,,,,,52,37399,32754,1122,0,,,,,,25133,,0,970334,17006,20121,,,,,0,970334,17006 +"2020-11-19","WY",176,,21,,629,629,209,20,,,130130,2443,,,349802,,,26169,22489,894,0,,,,,26321,14904,,0,376123,6831,,,,,152619,3885,376123,6831 +"2020-11-18","AK",100,100,0,,584,584,147,22,,,,0,,,856173,,15,24419,,545,0,,,,,28879,,,0,885558,6936,,,,,,0,885558,6936 +"2020-11-18","AL",3347,3073,46,274,23088,23088,1303,372,2165,,1294045,6373,,,,1249,,223486,187623,2638,0,,,,,,88038,,0,1481668,8122,,,68534,,1481668,8122,,0 +"2020-11-18","AR",2275,2085,30,190,8139,8139,893,89,,339,1415302,11176,,,1415302,916,142,137617,122481,1715,0,,,,17763,,118751,,0,1537783,12504,,,,103757,,0,1537783,12504 +"2020-11-18","AS",0,,0,,,,,0,,,1988,0,,,,,,0,0,0,0,,,,,,,,0,1988,0,,,,,,0,1988,0 +"2020-11-18","AZ",6365,5902,53,463,23473,23473,1700,230,,396,1743653,11757,,,,,218,283102,275342,3206,0,,,,,,,,0,3365609,46783,,,353191,,2018995,14787,3365609,46783 +"2020-11-18","CA",18360,,61,,,,5078,0,,1258,,0,,,,,,1047789,1047789,9811,0,,,,,,,,0,21418543,159467,,,,,,0,21418543,159467 +"2020-11-18","CO",2651,2207,43,444,11802,11802,1593,194,,,1343574,15269,179183,,,,,176694,167626,4650,0,15004,,,,,,2640615,41034,2640615,41034,194187,,,,1511200,19819,,0 +"2020-11-18","CT",4784,3849,13,935,12257,12257,816,0,,,,0,,,3087365,,,97028,90529,2042,0,,2870,,,122207,,,0,3213769,46757,,38269,,,,0,3213769,46757 +"2020-11-18","DC",665,,5,,,,127,0,,35,,0,,,,,10,19465,,156,0,,,,,,14477,601412,4670,601412,4670,,,,,280287,1501,,0 +"2020-11-18","DE",742,652,3,90,,,153,0,,29,356918,994,,,,,,29755,28473,203,0,,,,,31019,15301,642126,8113,642126,8113,,,,,386673,1197,,0 +"2020-11-18","FL",17949,,88,,53283,53283,3352,317,,,5812647,33734,539858,524946,8806008,,,892352,832021,7727,0,64112,,62540,,1152080,,11237905,87065,11237905,87065,604369,,587789,,6704999,41461,10006998,78712 +"2020-11-18","GA",9065,8536,57,529,33667,33667,2091,228,6306,,,0,,,,,,433642,393980,3071,0,33136,,,,368548,,,0,3975069,20647,348580,,,,,0,3975069,20647 +"2020-11-18","GU",100,,0,,,,58,0,,12,72714,0,,,,,6,6346,6225,112,0,8,111,,,,4341,,0,79060,112,212,884,,,,0,75406,0 +"2020-11-18","HI",223,223,1,,1210,1210,82,2,,19,,0,,,,,15,16974,16734,69,0,,,,,16721,,607362,4528,607362,4528,,,,,,0,,0 +"2020-11-18","IA",2066,,39,,,,1527,0,,283,829147,3658,,67589,,,134,174839,174839,3294,0,,,4356,20727,,111305,,0,1003986,6952,,,71985,120517,1005825,6968,,0 +"2020-11-18","ID",798,733,35,65,3254,3254,376,52,632,79,363268,1405,,,,,,85125,72765,1781,0,,,,,,35948,,0,436033,2811,,24306,,,436033,2811,601597,5613 +"2020-11-18","IL",11468,11014,151,454,,,5953,0,,1146,,0,,,,,547,606771,,8922,0,,,,,,,,0,9359227,103569,,,,,,0,9359227,103569 +"2020-11-18","IN",5084,4830,59,254,21737,21737,3040,348,4068,847,1721234,14353,,,,,262,268222,,6015,0,,,,,247870,,,0,3668049,55973,,,,,1989456,20368,3668049,55973 +"2020-11-18","KS",1326,,60,,4561,4561,1039,130,1241,253,619667,8652,,,,364,95,128594,,5853,0,,,,,,,,0,748261,14505,,,,,748261,14505,,0 +"2020-11-18","KY",1712,1674,15,38,9052,9052,1553,104,2284,359,,0,,,,,176,144753,119662,2745,0,,,,,,25058,,0,2293694,30978,90785,97925,,,,0,2293694,30978 +"2020-11-18","LA",6184,5939,28,245,,,886,0,,,2875935,15290,,,,,93,209914,200982,2229,0,,,,,,185960,,0,3085849,17519,,79753,,,,0,3076917,16613 +"2020-11-18","MA",10407,10177,47,230,13588,13588,885,0,,173,2905440,20318,,,,,72,195868,189518,2904,0,,,11910,,240381,137422,,0,7484835,97636,,,129352,234128,3094958,23062,7484835,97636 +"2020-11-18","MD",4351,4201,16,150,18959,18959,1144,147,,270,1977512,11716,,140937,,,,171823,171823,2018,0,,,14868,,205861,8421,,0,3954107,31801,,,155805,,2149335,13734,3954107,31801 +"2020-11-18","ME",170,169,4,1,600,600,85,11,,30,,0,12108,,,,10,9519,8559,156,0,381,88,,,10339,7229,,0,759368,10307,12501,920,,,,0,759368,10307 +"2020-11-18","MI",8573,8190,62,383,,,3792,0,,809,,0,,,5619633,,396,303058,277806,6218,0,,,,,360862,138862,,0,5980495,58769,350177,,,,,0,5980495,58769 +"2020-11-18","MN",3010,2961,67,49,13892,13892,1706,298,3307,355,1965766,11522,,,,,,242043,238646,5094,0,,,,,,193869,3478924,33677,3478924,33677,,64747,,,2204412,16255,,0 +"2020-11-18","MO",3477,,24,,,,2453,0,,582,1449003,5340,83892,,2556990,,298,253473,253473,4587,0,6792,13199,,,282532,,,0,2844992,19151,90887,89153,86536,53646,1702476,9927,2844992,19151 +"2020-11-18","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,103,103,0,0,,,,,,29,,0,16570,0,,,,,16567,0,23472,0 +"2020-11-18","MS",3601,3180,20,421,7091,7091,948,0,,207,906991,0,,,,,96,137396,114043,1593,0,,,,,,116683,,0,1044387,1593,48342,145992,,,,0,1019601,0 +"2020-11-18","MT",561,,18,,2202,2202,463,41,,,,0,,,,,,50582,,1184,0,,,,,,30400,,0,591406,7578,,,,,,0,591406,7578 +"2020-11-18","NC",4898,4780,46,118,,,1537,0,,386,,0,,,,,,320862,304784,3367,0,,,,,,,,0,4654490,30852,,74368,,,,0,4654490,30852 +"2020-11-18","ND",791,,16,,2307,2307,384,46,378,44,261680,307,10529,,,,,68208,67150,1341,0,802,,,,,56468,986340,9534,986340,9534,11331,2563,,,328910,1570,1033592,10829 +"2020-11-18","NE",816,,19,,3726,3726,978,75,,,575180,2642,,,1060089,,,103805,,2204,0,,,,,119710,54604,,0,1181195,14952,,,,,679313,4842,1181195,14952 +"2020-11-18","NH",504,,2,,822,822,91,5,272,,379089,2251,,,,,,15749,12062,446,0,,,,,,11478,,0,729146,6099,33644,,32709,,391151,2251,729146,6099 +"2020-11-18","NJ",16655,14843,37,1812,39248,39248,2446,53,,461,5176586,87414,,,,,223,311742,289562,4759,0,,,,,,,,0,5488328,92173,,,,,,0,5466148,91457 +"2020-11-18","NM",1290,,26,,5875,5875,776,89,,,,0,,,,,,70451,,2892,0,,,,,,26835,,0,1409823,11484,,,,,,0,1409823,11484 +"2020-11-18","NV",1947,,3,,,,1246,0,,264,770312,1614,,,,,141,125459,125459,1665,0,,,,,,,1454741,6918,1454741,6918,,,,,895771,3279,,0 +"2020-11-18","NY",26225,,36,,89995,89995,2202,0,,423,,0,,,,,176,574072,,5294,0,,,,,,,17191129,154434,17191129,154434,,,,,,0,,0 +"2020-11-18","OH",5827,5462,55,365,23217,23217,3716,371,4280,923,,0,,,,,472,318828,302516,6385,0,,10339,,,328930,212713,,0,5405692,44226,,256951,,,,0,5405692,44226 +"2020-11-18","OK",1570,,26,,10687,10687,1434,206,,447,1707516,14905,,,1707516,,,161425,,3017,0,5545,,,,169267,130032,,0,1868941,17922,93221,,,,,0,1880494,21238 +"2020-11-18","OR",778,,13,,3805,3805,445,51,,102,911252,5916,,,1636722,,40,58570,,924,0,,,,,87912,,,0,1724634,15277,,,,,966938,6807,1724634,15277 +"2020-11-18","PA",9465,,110,,,,2904,0,,628,2608986,20519,,,,,310,281852,263978,6339,0,,,,,,186022,5009041,62367,5009041,62367,,,,,2872964,26193,,0 +"2020-11-18","PR",971,756,20,215,,,557,0,,86,305972,0,,,395291,,73,43910,43031,325,0,37140,,,,20103,36675,,0,349882,325,,,,,,0,415664,0 +"2020-11-18","RI",1284,,6,,3953,3953,284,59,,22,447160,3438,,,1326524,,13,45911,,1383,0,,,,,58041,,1384565,18973,1384565,18973,,,,,493071,4821,,0 +"2020-11-18","SC",4182,3906,26,276,11349,11349,830,54,,219,1938842,14419,75309,,1878902,,105,199447,187774,1547,0,10211,21630,,,247714,103996,,0,2138289,15966,85520,172583,,,,0,2126616,15665 +"2020-11-18","SD",674,,30,,3864,3864,593,95,,97,232302,1227,,,,,51,68671,64582,1387,0,,,,,70181,48757,,0,467140,4767,,,,,300973,2614,467140,4767 +"2020-11-18","TN",4048,3749,53,299,11342,11342,2209,87,,564,,0,,,3819358,,247,325201,301901,4472,0,,23184,,,358326,279931,,0,4177684,23974,,226619,,,,0,4177684,23974 +"2020-11-18","TX",19883,,187,,,,7958,0,,2127,,0,,,,,,1140861,1048383,10987,0,54291,48664,,,1179363,889099,,0,9946885,116377,532113,585973,,,,0,9946885,116377 +"2020-11-18","UT",740,,8,,7107,7107,564,119,1350,201,1056915,7755,,,1482716,495,,162028,,3071,0,,12027,,11607,162576,108182,,0,1645292,16195,,152121,,71349,1207602,10237,1645292,16195 +"2020-11-18","VA",3860,3569,25,291,13707,13707,1469,99,,318,,0,,,,,126,208833,188853,2071,0,12132,16091,,,224321,,2983430,20273,2983430,20273,159160,251641,,,,0,,0 +"2020-11-18","VI",23,,0,,,,,0,,,25235,252,,,,,,1463,,13,0,,,,,,1388,,0,26698,265,,,,,26757,248,,0 +"2020-11-18","VT",60,60,1,,,,18,0,,2,198845,559,,,,,,3255,3174,54,0,,,,,,2135,,0,482325,2620,,,,,202019,610,482325,2620 +"2020-11-18","WA",2571,2571,23,,9573,9573,738,55,,208,,0,,,,,87,144780,141110,3454,0,,,,,,,2813081,17345,2813081,17345,,,,,,0,,0 +"2020-11-18","WI",2925,2793,58,132,15100,15100,2217,283,1706,428,2036941,12140,,,,,,350665,331837,8510,0,,,,,,254365,3986414,40138,3986414,40138,,,,,2368778,20129,,0 +"2020-11-18","WV",612,585,14,27,,,429,0,,126,,0,,,,,50,36277,31821,953,0,,,,,,24493,,0,953328,12693,19989,,,,,0,953328,12693 +"2020-11-18","WY",155,,0,,609,609,210,20,,,127687,0,,,343730,,,25275,21750,822,0,,,,,25562,13752,,0,369292,5300,,,,,148734,0,369292,5300 +"2020-11-17","AK",100,100,2,,562,562,136,3,,,,0,,,849757,,11,23874,,634,0,,,,,28361,,,0,878622,6275,,,,,,0,878622,6275 +"2020-11-17","AL",3301,3040,52,261,22716,22716,1289,0,2158,,1287672,5714,,,,1246,,220848,185874,1616,0,,,,,,88038,,0,1473546,6943,,,68223,,1473546,6943,,0 +"2020-11-17","AR",2245,2057,20,188,8050,8050,902,101,,346,1404126,7268,,,1404126,909,133,135902,121153,1554,0,,,,17252,,117068,,0,1525279,8413,,,,101145,,0,1525279,8413 +"2020-11-17","AS",0,,0,,,,,0,,,1988,220,,,,,,0,0,0,0,,,,,,,,0,1988,220,,,,,,0,1988,220 +"2020-11-17","AZ",6312,5855,10,457,23243,23243,1624,121,,385,1731896,13572,,,,,191,279896,272312,2984,0,,,,,,,,0,3318826,43841,,,350899,,2004208,16427,3318826,43841 +"2020-11-17","CA",18299,,36,,,,4885,0,,1206,,0,,,,,,1037978,1037978,8743,0,,,,,,,,0,21259076,190182,,,,,,0,21259076,190182 +"2020-11-17","CO",2608,2177,30,431,11608,11608,1543,405,,,1328305,14712,178706,,,,,172044,163076,4331,0,14896,,,,,,2599581,39485,2599581,39485,193602,,,,1491381,18924,,0 +"2020-11-17","CT",4771,3839,12,932,12257,12257,777,0,,,,0,,,3043340,,,94986,88578,1702,0,,2802,,,119616,,,0,3167012,50085,,37398,,,,0,3167012,50085 +"2020-11-17","DC",660,,0,,,,112,0,,36,,0,,,,,11,19309,,245,0,,,,,,14336,596742,6390,596742,6390,,,,,278786,2002,,0 +"2020-11-17","DE",739,649,3,90,,,153,0,,32,355924,2215,,,,,,29552,28281,352,0,,,,,30580,15161,634013,5075,634013,5075,,,,,385476,2567,,0 +"2020-11-17","FL",17861,,86,,52966,52966,3369,317,,,5778913,30776,539858,524946,8737315,,,884625,826574,7285,0,64112,,62540,,1142252,,11150840,77345,11150840,77345,604369,,587789,,6663538,38061,9928286,71072 +"2020-11-17","GA",9008,8496,41,512,33439,33439,2102,174,6259,,,0,,,,,,430571,391466,4335,0,33020,,,,366489,,,0,3954422,53714,347926,,,,,0,3954422,53714 +"2020-11-17","GU",100,,2,,,,69,0,,16,72714,756,,,,,9,6234,6121,59,0,8,111,,,,4338,,0,78948,815,212,884,,,,0,75406,0 +"2020-11-17","HI",222,222,0,,1208,1208,83,14,,15,,0,,,,,10,16905,16665,52,0,,,,,16656,,602834,2840,602834,2840,,,,,,0,,0 +"2020-11-17","IA",2027,,36,,,,1510,0,,288,825489,1991,,67273,,,130,171545,171545,2192,0,,,4303,19863,,109978,,0,997034,4183,,,71616,117600,998857,4186,,0 +"2020-11-17","ID",763,703,4,60,3202,3202,376,34,621,79,361863,1875,,,,,,83344,71359,1099,0,,,,,,35530,,0,433222,2799,,24306,,,433222,2799,595984,5752 +"2020-11-17","IL",11317,10875,113,442,,,5887,0,,1158,,0,,,,,545,597849,,12601,0,,,,,,,,0,9255658,94205,,,,,,0,9255658,94205 +"2020-11-17","IN",5025,4770,89,255,21389,21389,2951,346,4017,796,1706881,11423,,,,,246,262207,,5463,0,,,,,242046,,,0,3612076,42121,,,,,1969088,16886,3612076,42121 +"2020-11-17","KS",1266,,0,,4431,4431,551,0,1205,163,611015,0,,,,355,58,122741,,0,0,,,,,,,,0,733756,0,,,,,733756,0,,0 +"2020-11-17","KY",1697,1659,33,38,8948,8948,1521,74,2257,354,,0,,,,,178,142008,117557,2911,0,,,,,,24760,,0,2262716,20880,90628,91921,,,,0,2262716,20880 +"2020-11-17","LA",6156,5916,17,240,,,874,0,,,2860645,28468,,,,,92,207685,199659,2626,0,,,,,,176107,,0,3068330,31094,,73595,,,,0,3060304,30660 +"2020-11-17","MA",10360,10130,20,230,13588,13588,835,0,,159,2885122,15480,,,,,73,192964,186774,2525,0,,,11910,,237174,137422,,0,7387199,65468,,,129352,229932,3071896,17743,7387199,65468 +"2020-11-17","MD",4335,4186,26,149,18812,18812,1046,124,,255,1965796,10177,,138383,,,,169805,169805,2149,0,,,14367,,203530,8408,,0,3922306,27740,,,152750,,2135601,12326,3922306,27740 +"2020-11-17","ME",166,165,1,1,589,589,73,12,,29,,0,12085,,,,8,9363,8411,246,0,380,82,,,10051,7025,,0,749061,8422,12477,590,,,,0,749061,8422 +"2020-11-17","MI",8511,8128,80,383,,,3752,0,,776,,0,,,5568947,,367,296840,272034,7886,0,,,,,352779,138862,,0,5921726,57670,349416,,,,,0,5921726,57670 +"2020-11-17","MN",2943,2898,26,45,13594,13594,1669,343,3247,346,1954244,8977,,,,,,236949,233913,5931,0,,,,,,186680,3445247,31555,3445247,31555,,60931,,,2188157,14732,,0 +"2020-11-17","MO",3453,,67,,,,2454,0,,570,1443663,8260,83647,,2542780,,285,248886,248886,5717,0,6698,12523,,,277624,,,0,2825841,24094,90549,86097,86240,51988,1692549,13977,2825841,24094 +"2020-11-17","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,103,103,1,0,,,,,,29,,0,16570,1,,,,,16567,0,23472,839 +"2020-11-17","MS",3581,3168,36,413,7091,7091,868,0,,201,906991,0,,,,,93,135803,113195,905,0,,,,,,116683,,0,1042794,905,48342,145992,,,,0,1019601,0 +"2020-11-17","MT",543,,21,,2161,2161,456,95,,,,0,,,,,,49398,,1371,0,,,,,,29105,,0,583828,10494,,,,,,0,583828,10494 +"2020-11-17","NC",4852,4738,38,114,,,1501,0,,370,,0,,,,,,317495,301998,3288,0,,,,,,,,0,4623638,28714,,70545,,,,0,4623638,28714 +"2020-11-17","ND",775,,26,,2261,2261,399,66,374,48,261373,767,10477,,,,,66867,65880,1129,0,781,,,,,55176,976806,6122,976806,6122,11258,2310,,,327340,1849,1022763,6407 +"2020-11-17","NE",797,,18,,3651,3651,938,76,,,572538,5719,,,1047604,,,101601,,3440,0,,,,,117264,54095,,0,1166243,28997,,,,,674471,9161,1166243,28997 +"2020-11-17","NH",502,,2,,817,817,77,0,271,,376838,1292,,,,,,15303,12062,274,0,,,,,,11250,,0,723047,5158,33602,,32676,,388900,1292,723047,5158 +"2020-11-17","NJ",16618,14817,38,1801,39195,39195,2320,89,,458,5089172,29376,,,,,155,306983,285519,4735,0,,,,,,,,0,5396155,34111,,,,,,0,5374691,35621 +"2020-11-17","NM",1264,,28,,5786,5786,754,102,,,,0,,,,,,67559,,2105,0,,,,,,26338,,0,1398339,12218,,,,,,0,1398339,12218 +"2020-11-17","NV",1944,,27,,,,1159,0,,237,768698,3636,,,,,136,123794,123794,1697,0,,,,,,,1447823,12032,1447823,12032,,,,,892492,5333,,0 +"2020-11-17","NY",26189,,30,,89995,89995,2124,0,,408,,0,,,,,176,568778,,5088,0,,,,,,,17036695,159852,17036695,159852,,,,,,0,,0 +"2020-11-17","OH",5772,5412,30,360,22846,22846,3648,368,4250,897,,0,,,,,441,312443,296387,7079,0,,9615,,,322673,208945,,0,5361466,42465,,240665,,,,0,5361466,42465 +"2020-11-17","OK",1544,,6,,10481,10481,1381,64,,390,1692611,39012,,,1692611,,,158408,,1551,0,5545,,,,166645,128057,,0,1851019,40563,93221,,,,,0,1859256,42566 +"2020-11-17","OR",765,,4,,3754,3754,413,126,,93,905336,4237,,,1622568,,40,57646,,766,0,,,,,86789,,,0,1709357,12869,,,,,960131,19728,1709357,12869 +"2020-11-17","PA",9355,,30,,,,2737,0,,579,2588467,14846,,,,,280,275513,258304,5900,0,,,,,,184593,4946674,48511,4946674,48511,,,,,2846771,20017,,0 +"2020-11-17","PR",951,740,9,211,,,568,0,,85,305972,0,,,395291,,70,43585,42790,569,0,36810,,,,20103,36102,,0,349557,569,,,,,,0,415664,0 +"2020-11-17","RI",1278,,8,,3894,3894,265,37,,22,443722,2245,,,1309037,,10,44528,,605,0,,,,,56555,,1365592,9875,1365592,9875,,,,,488250,2850,,0 +"2020-11-17","SC",4156,3884,13,272,11295,11295,800,62,,224,1924423,15507,75134,,1864993,,106,197900,186528,1283,0,10146,21124,,,245958,103154,,0,2122323,16790,85280,167198,,,,0,2110951,16645 +"2020-11-17","SD",644,,0,,3769,3769,582,71,,95,231075,1206,,,,,47,67284,63491,1006,0,,,,,69043,48016,,0,462373,3556,,,,,298359,2212,462373,3556 +"2020-11-17","TN",3995,3705,72,290,11255,11255,2138,54,,558,,0,,,3799489,,247,320729,298288,1841,0,,22282,,,354221,276497,,0,4153710,14098,,218748,,,,0,4153710,14098 +"2020-11-17","TX",19696,,117,,,,7841,0,,2127,,0,,,,,,1129874,1039511,13644,0,54046,47658,,,1166390,883223,,0,9830508,117494,530418,571848,,,,0,9830508,117494 +"2020-11-17","UT",732,,9,,6988,6988,537,129,1334,196,1049160,6382,,,1469146,494,,158957,,3178,0,,11466,,11079,159951,106601,,0,1629097,13784,,145406,,68235,1197365,8875,1629097,13784 +"2020-11-17","VA",3835,3557,29,278,13608,13608,1392,56,,272,,0,,,,,103,206762,187287,2125,0,12072,15566,,,223485,,2963157,25024,2963157,25024,158884,242057,,,,0,,0 +"2020-11-17","VI",23,,0,,,,,0,,,24983,348,,,,,,1450,,16,0,,,,,,1382,,0,26433,364,,,,,26509,399,,0 +"2020-11-17","VT",59,59,0,,,,17,0,,1,198286,909,,,,,,3201,3123,106,0,,,,,,2107,,0,479705,2115,,,,,201409,1011,479705,2115 +"2020-11-17","WA",2548,2548,29,,9518,9518,707,93,,167,,0,,,,,85,141326,137921,1169,0,,,,,,,2795736,17641,2795736,17641,,,,,,0,,0 +"2020-11-17","WI",2867,2741,103,126,14817,14817,2278,318,1688,456,2024801,15653,,,,,,342155,323848,7593,0,,,,,,248700,3946276,52750,3946276,52750,,,,,2348649,22743,,0 +"2020-11-17","WV",598,571,13,27,,,400,0,,116,,0,,,,,43,35324,31058,864,0,,,,,,24019,,0,940635,8374,19971,,,,,0,940635,8374 +"2020-11-17","WY",155,,11,,589,589,204,13,,,127687,-2521,,,339171,,,24453,21047,1260,0,,,,,24821,13407,,0,363992,6972,,,,,148734,283,363992,6972 +"2020-11-16","AK",98,98,0,,559,559,143,9,,,,0,,,844052,,14,23240,,578,0,,,,,27793,7165,,0,872347,4965,,,,,,0,872347,4965 +"2020-11-16","AL",3249,3001,1,248,22716,22716,1262,441,2153,,1281958,6043,,,,1244,,219232,184645,1410,0,,,,,,88038,,0,1466603,7197,,,68042,,1466603,7197,,0 +"2020-11-16","AR",2225,2038,42,187,7949,7949,861,73,,346,1396858,10147,,,1396858,902,123,134348,120008,1308,0,,,,16718,,115625,,0,1516866,11312,,,,97104,,0,1516866,11312 +"2020-11-16","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-16","AZ",6302,5846,0,456,23122,23122,1557,73,,374,1718324,11929,,,,,194,276912,269457,1476,0,,,,,,,,0,3274985,17004,,,350396,,1987781,13283,3274985,17004 +"2020-11-16","CA",18263,,10,,,,4559,0,,1131,,0,,,,,,1029235,1029235,9890,0,,,,,,,,0,21068894,202109,,,,,,0,21068894,202109 +"2020-11-16","CO",2578,2153,32,425,11203,11203,1424,79,,,1313593,14027,178395,,,,,167713,158864,4296,0,14841,,,,,,2560096,36344,2560096,36344,193236,,,,1472457,17633,,0 +"2020-11-16","CT",4759,3827,22,932,12257,12257,757,0,,,,0,,,2996107,,,93284,87218,4639,0,,2314,,,116901,,,0,3116927,16428,,32727,,,,0,3116927,16428 +"2020-11-16","DC",660,,0,,,,101,0,,33,,0,,,,,18,19064,,87,0,,,,,,14271,590352,1732,590352,1732,,,,,276784,527,,0 +"2020-11-16","DE",736,646,0,90,,,141,0,,31,353709,2697,,,,,,29200,27931,397,0,,,,,30313,15007,628938,6597,628938,6597,,,,,382909,3094,,0 +"2020-11-16","FL",17775,,41,,52649,52649,3243,120,,,5748137,21642,539858,524946,8676094,,,877340,821237,4530,0,64112,,62540,,1132662,,11073495,51327,11073495,51327,604369,,587789,,6625477,26172,9857214,50170 +"2020-11-16","GA",8967,8471,10,496,33265,33265,2070,24,6229,,,0,,,,,,426236,387930,1247,0,32804,,,,362565,,,0,3900708,13422,346476,,,,,0,3900708,13422 +"2020-11-16","GU",98,,4,,,,70,0,,18,71958,703,,,,,11,6175,6062,54,0,8,111,,,,3950,,0,78133,757,212,884,,,,0,75406,0 +"2020-11-16","HI",222,222,0,,1194,1194,78,0,,18,,0,,,,,10,16853,16613,94,0,,,,,16605,,599994,4879,599994,4879,,,,,,0,,0 +"2020-11-16","IA",1991,,6,,,,1392,0,,271,823498,2179,,66913,,,123,169353,169353,2071,0,,,4261,18979,,108187,,0,992851,4250,,,71214,114591,994671,4260,,0 +"2020-11-16","ID",759,700,0,59,3168,3168,395,20,613,96,359988,1591,,,,,,82245,70435,928,0,,,,,,35215,,0,430423,2469,,24306,,,430423,2469,590232,3983 +"2020-11-16","IL",11204,10779,42,425,,,5581,0,,1144,,0,,,,,514,585248,,11632,0,,,,,,,,0,9161453,90612,,,,,,0,9161453,90612 +"2020-11-16","IN",4936,4686,26,250,21043,21043,2768,339,3969,750,1695458,8766,,,,,232,256744,,5147,0,,,,,237802,,,0,3569955,33873,,,,,1952202,13913,3569955,33873 +"2020-11-16","KS",1266,,10,,4431,4431,551,104,1205,163,611015,19735,,,,355,58,122741,,7234,0,,,,,,,,0,733756,26969,,,,,733756,33251,,0 +"2020-11-16","KY",1664,1627,3,37,8874,8874,1442,91,2236,360,,0,,,,,128,139097,115274,1511,0,,,,,,24568,,0,2241836,47738,90433,89326,,,,0,2241836,47738 +"2020-11-16","LA",6139,5902,7,237,,,818,0,,,2832177,7094,,,,,81,205059,197467,546,0,,,,,,176107,,0,3037236,7640,,70833,,,,0,3029644,7637 +"2020-11-16","MA",10340,10110,11,230,13588,13588,781,0,,159,2869642,14993,,,,,74,190439,184511,2164,0,,,11910,,234611,137422,,0,7321731,53265,,,129352,225360,3054153,16960,7321731,53265 +"2020-11-16","MD",4309,4160,7,149,18688,18688,985,112,,237,1955619,11083,,138383,,,,167656,167656,1726,0,,,14367,,201117,8380,,0,3894566,34833,,,152750,,2123275,12809,3894566,34833 +"2020-11-16","ME",165,164,0,1,577,577,69,3,,28,,0,12063,,,,7,9117,8180,173,0,377,82,,,9795,6830,,0,740639,2505,12452,443,,,,0,740639,2505 +"2020-11-16","MI",8431,8049,55,382,,,3580,0,,749,,0,,,5519516,,343,288954,264576,13162,0,,,,,344540,138862,,0,5864056,117843,347813,,,,,0,5864056,117843 +"2020-11-16","MN",2917,2873,12,44,13251,13251,1558,177,3203,324,1945267,17566,,,,,,231018,228158,7437,0,,,,,,179614,3413692,49157,3413692,49157,,59141,,,2173425,24764,,0 +"2020-11-16","MO",3386,,12,,,,2525,0,,559,1435403,5381,83510,,2524842,,275,243169,243169,3718,0,6614,12145,,,271543,,,0,2801747,16348,90326,80959,86062,50906,1678572,9099,2801747,16348 +"2020-11-16","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,102,102,2,0,,,,,,29,,0,16569,2,,,,,16567,0,22633,-839 +"2020-11-16","MS",3545,3138,2,407,7091,7091,807,177,,180,906991,33128,,,,,96,134898,112610,589,0,,,,,,116683,,0,1041889,33717,48342,145992,,,,0,1019601,37205 +"2020-11-16","MT",522,,2,,2066,2066,453,19,,,,0,,,,,,48027,,869,0,,,,,,27496,,0,573334,773,,,,,,0,573334,773 +"2020-11-16","NC",4814,4704,8,110,,,1424,0,,360,,0,,,,,,314207,299061,1972,0,,,,,,,,0,4594924,34737,,67638,,,,0,4594924,34737 +"2020-11-16","ND",749,,7,,2195,2195,400,17,369,39,260606,742,10477,,,,,65738,64793,1084,0,781,,,,,53242,970684,7759,970684,7759,11258,2188,,,325491,1831,1016356,8290 +"2020-11-16","NE",779,,0,,3575,3575,914,24,,,566819,2410,,,1022658,,,98161,,1327,0,,,,,113226,53528,,0,1137246,7014,,,,,665310,3736,1137246,7014 +"2020-11-16","NH",500,,1,,817,817,74,13,268,,375546,2856,,,,,,15029,12062,358,0,,,,,,11185,,0,717889,27530,33500,,32656,,387608,2856,717889,27530 +"2020-11-16","NJ",16580,14779,14,1801,39106,39106,2115,88,,417,5059796,0,,,,,137,302248,281493,2734,0,,,,,,,,0,5362044,2734,,,,,,0,5339070,0 +"2020-11-16","NM",1236,,21,,5684,5684,738,114,,,,0,,,,,,65454,,1253,0,,,,,,25411,,0,1386121,13254,,,,,,0,1386121,13254 +"2020-11-16","NV",1917,,8,,,,1157,0,,251,765062,2722,,,,,146,122097,122097,1914,0,,,,,,,1435791,9709,1435791,9709,,,,,887159,4636,,0 +"2020-11-16","NY",26159,,26,,89995,89995,1968,0,,391,,0,,,,,158,563690,,3490,0,,,,,,,16876843,124565,16876843,124565,,,,,,0,,0 +"2020-11-16","OH",5742,5387,20,355,22478,22478,3387,213,4223,850,,0,,,,,407,305364,289593,7268,0,,9443,,,317057,205198,,0,5319001,60160,,238655,,,,0,5319001,60160 +"2020-11-16","OK",1538,,10,,10417,10417,1247,45,,362,1653599,0,,,1653599,,,156857,,2729,0,5545,,,,159890,126162,,0,1810456,2729,93221,,,,,0,1816690,0 +"2020-11-16","OR",761,,2,,3628,3628,356,0,,70,901099,5552,,,1610638,,30,56880,,862,0,,,,,85850,,,0,1696488,13876,,,,,940403,0,1696488,13876 +"2020-11-16","PA",9325,,13,,,,2575,0,,558,2573621,14125,,,,,269,269613,253133,4476,0,,,,,,183336,4898163,48270,4898163,48270,,,,,2826754,18277,,0 +"2020-11-16","PR",942,731,7,211,,,533,0,,83,305972,0,,,395291,,66,43016,42279,537,0,36618,,,,20103,35461,,0,348988,537,,,,,,0,415664,0 +"2020-11-16","RI",1270,,5,,3857,3857,256,0,,21,441477,1336,,,1299879,,12,43923,,481,0,,,,,55838,,1355717,6195,1355717,6195,,,,,485400,1817,,0 +"2020-11-16","SC",4143,3873,31,270,11233,11233,769,22,,210,1908916,13834,74992,,1849769,,102,196617,185390,1110,0,10125,20732,,,244537,102038,,0,2105533,14944,85117,161448,,,,0,2094306,14864 +"2020-11-16","SD",644,,0,,3698,3698,560,54,,97,229869,1136,,,,,48,66278,62521,897,0,,,,,68228,47495,,0,458817,3019,,,,,296147,2033,458817,3019 +"2020-11-16","TN",3923,3645,30,278,11201,11201,1999,60,,541,,0,,,3787255,,237,318888,296654,7951,0,,21924,,,352357,271864,,0,4139612,60862,,217176,,,,0,4139612,60862 +"2020-11-16","TX",19579,,20,,,,7468,0,,2047,,0,,,,,,1116230,1027889,7828,0,53738,46385,,,1152103,875521,,0,9713014,38343,528417,553433,,,,0,9713014,38343 +"2020-11-16","UT",723,,5,,6859,6859,519,90,1303,198,1042778,7318,,,1458004,487,,155779,,1971,0,,10890,,10527,157309,105481,,0,1615313,13520,,139150,,65768,1188490,9083,1615313,13520 +"2020-11-16","VA",3806,3533,6,273,13552,13552,1337,48,,263,,0,,,,,118,204637,185525,2677,0,12045,14984,,,221669,,2938133,17396,2938133,17396,158675,233836,,,,0,,0 +"2020-11-16","VI",23,,0,,,,,0,,,24635,0,,,,,,1434,,0,0,,,,,,1370,,0,26069,0,,,,,26110,0,,0 +"2020-11-16","VT",59,59,0,,,,20,0,,1,197377,814,,,,,,3095,3021,124,0,,,,,,2050,,0,477590,2662,,,,,200398,936,477590,2662 +"2020-11-16","WA",2519,2519,0,,9425,9425,681,144,,177,,0,,,,,84,140157,136771,1881,0,,,,,,,2778095,29313,2778095,29313,,,,,,0,,0 +"2020-11-16","WI",2764,2649,13,115,14499,14499,2278,118,1666,456,2009148,7909,,,,,,334562,316758,4638,0,,,,,,243841,3893526,28350,3893526,28350,,,,,2325906,12298,,0 +"2020-11-16","WV",585,562,3,23,,,383,0,,108,,0,,,,,41,34460,30384,801,0,,,,,,23498,,0,932261,11895,19955,,,,,0,932261,11895 +"2020-11-16","WY",144,,0,,576,576,191,-4,,,130208,0,,,333117,,,23193,19885,699,0,,,,,23903,12902,,0,357020,9190,,,,,148451,0,357020,9190 +"2020-11-15","AK",98,98,0,,550,550,141,7,,,,0,,,839467,,7,22662,,642,0,,,,,27414,7164,,0,867382,5118,,,,,,0,867382,5118 +"2020-11-15","AL",3248,3000,2,248,22275,22275,1195,0,2151,,1275915,4655,,,,1244,,217822,183491,1979,0,,,,,,88038,,0,1459406,6251,,,67964,,1459406,6251,,0 +"2020-11-15","AR",2183,2000,35,183,7876,7876,830,29,,317,1386711,19634,,,1386711,896,116,133040,118843,2722,0,,,,16445,,114312,,0,1505554,21690,,,,95814,,0,1505554,21690 +"2020-11-15","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-15","AZ",6302,5846,2,456,23049,23049,1506,112,,368,1706395,10789,,,,,183,275436,268103,2383,0,,,,,,,,0,3257981,22808,,,336491,,1974498,13084,3257981,22808 +"2020-11-15","CA",18253,,35,,,,4454,0,,1094,,0,,,,,,1019345,1019345,10968,0,,,,,,,,0,20866785,195189,,,,,,0,20866785,195189 +"2020-11-15","CO",2546,2137,21,409,11124,11124,1417,68,,,1299566,14476,177943,,,,,163417,155258,4183,0,14772,,,,,,2523752,38301,2523752,38301,192715,,,,1454824,18619,,0 +"2020-11-15","CT",4737,3807,0,930,12257,12257,659,0,,,,0,,,2980798,,,88645,82854,0,0,,2269,,,115829,,,0,3100499,18471,,32399,,,,0,3100499,18471 +"2020-11-15","DC",660,,2,,,,104,0,,33,,0,,,,,21,18977,,163,0,,,,,,14182,588620,5301,588620,5301,,,,,276257,1547,,0 +"2020-11-15","DE",736,646,0,90,,,81,0,,16,351012,2043,,,,,,28803,27547,408,0,,,,,29901,14867,622341,5894,622341,5894,,,,,379815,2451,,0 +"2020-11-15","FL",17734,,30,,52529,52529,3118,88,,,5726495,34533,539858,524946,8631846,,,872810,817399,9820,0,64112,,62540,,1126898,,11022168,122779,11022168,122779,604369,,587789,,6599305,44353,9807044,106603 +"2020-11-15","GA",8957,8462,1,495,33241,33241,1978,25,6225,,,0,,,,,,424989,386949,2084,0,32669,,,,361610,,,0,3887286,21347,345943,,,,,0,3887286,21347 +"2020-11-15","GU",94,,1,,,,75,0,,21,71255,463,,,,,12,6121,6010,156,0,8,111,,,,3942,,0,77376,619,212,884,,,,0,75406,0 +"2020-11-15","HI",222,222,0,,1194,1194,78,0,,16,,0,,,,,8,16759,16519,107,0,,,,,16464,,595115,5318,595115,5318,,,,,,0,,0 +"2020-11-15","IA",1985,,13,,,,1279,0,,247,821319,5161,,66638,,,115,167282,167282,3554,0,,,4244,17874,,107888,,0,988601,8715,,,70922,110636,990411,8702,,0 +"2020-11-15","ID",759,700,7,59,3148,3148,395,46,610,96,358397,2332,,,,,,81317,69557,1519,0,,,,,,34826,,0,427954,3539,,24306,,,427954,3539,586249,5625 +"2020-11-15","IL",11162,10742,74,420,,,5474,0,,1045,,0,,,,,490,573616,,10631,0,,,,,,,,0,9070841,84831,,,,,,0,9070841,84831 +"2020-11-15","IN",4910,4660,22,250,20704,20704,2628,321,3900,729,1686692,13628,,,,,224,251597,,6710,0,,,,,233727,,,0,3536082,53337,,,,,1938289,20338,3536082,53337 +"2020-11-15","KS",1256,,0,,4327,4327,811,0,1184,211,591280,0,,,,348,74,115507,,0,0,,,,,,,,0,706787,0,,,,,700505,0,,0 +"2020-11-15","KY",1661,1624,3,37,8783,8783,1378,0,2222,308,,0,,,,,167,137586,114044,1449,0,,,,,,24329,,0,2194098,0,90112,87694,,,,0,2194098,0 +"2020-11-15","LA",6132,5895,11,237,,,753,0,,,2825083,34596,,,,,58,204513,196924,2532,0,,,,,,176107,,0,3029596,37128,,70720,,,,0,3022007,36835 +"2020-11-15","MA",10329,10098,36,231,13588,13588,737,0,,159,2854649,16064,,,,,70,188275,182544,2133,0,,,11910,,232360,137422,,0,7268466,71371,,,129352,222261,3037193,18140,7268466,71371 +"2020-11-15","MD",4302,4153,9,149,18576,18576,938,118,,238,1944536,10457,,138383,,,,165930,165930,1840,0,,,14367,,199077,8374,,0,3859733,28574,,,152750,,2110466,12297,3859733,28574 +"2020-11-15","ME",165,164,2,1,574,574,67,2,,23,,0,12044,,,,7,8944,8006,153,0,373,82,,,9734,6681,,0,738134,8546,12429,440,,,,0,738134,8546 +"2020-11-15","MI",8376,7994,0,382,,,3241,0,,660,,0,,,5416792,,272,275792,251813,0,0,,,,,329421,138862,,0,5746213,0,346627,,,,,0,5746213,0 +"2020-11-15","MN",2905,2861,31,44,13074,13074,1424,159,3176,293,1927701,24650,,,,,,223581,220960,7553,0,,,,,,172873,3364535,62036,3364535,62036,,57147,,,2148661,32028,,0 +"2020-11-15","MO",3374,,1,,,,2462,0,,536,1430022,4714,83367,,2512471,,275,239451,239451,3729,0,6566,11943,,,267624,,,0,2785399,16314,90135,80370,85895,50415,1669473,8443,2785399,16314 +"2020-11-15","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,100,100,0,0,,,,,,29,,0,16567,0,,,,,16567,0,23472,0 +"2020-11-15","MS",3543,3137,3,406,6914,6914,756,0,,185,873863,0,,,,,96,134309,112266,969,0,,,,,,111430,,0,1008172,969,47023,123242,,,,0,982396,0 +"2020-11-15","MT",520,,6,,2047,2047,435,5,,,,0,,,,,,47158,,1272,0,,,,,,27472,,0,572561,2867,,,,,,0,572561,2867 +"2020-11-15","NC",4806,4696,50,110,,,1395,0,,352,,0,,,,,,312235,297184,3117,0,,,,,,,,0,4560187,38470,,66867,,,,0,4560187,38470 +"2020-11-15","ND",742,,10,,2178,2178,400,25,368,38,259864,508,10477,,,,,64654,63711,960,0,781,,,,,51936,962925,7450,962925,7450,11258,2182,,,323660,1432,1008066,8092 +"2020-11-15","NE",779,,4,,3551,3551,889,29,,,564409,3372,,,1017117,,,96834,,1912,0,,,,,111754,52511,,0,1130232,12973,,,,,661574,5288,1130232,12973 +"2020-11-15","NH",499,,0,,804,804,69,0,266,,372690,3340,,,,,,14671,12062,360,0,,,,,,10866,,0,690359,0,33433,,32647,,384752,3340,690359,0 +"2020-11-15","NJ",16566,14765,18,1801,39018,39018,2004,82,,392,5059796,123805,,,,,135,299514,279274,5042,0,,,,,,,,0,5359310,128847,,,,,,0,5339070,128343 +"2020-11-15","NM",1215,,7,,5570,5570,506,47,,,,0,,,,,,64201,,1030,0,,,,,,25089,,0,1372867,12415,,,,,,0,1372867,12415 +"2020-11-15","NV",1909,,1,,,,1025,0,,243,762340,3508,,,,,120,120183,120183,1177,0,,,,,,,1426082,12629,1426082,12629,,,,,882523,4685,,0 +"2020-11-15","NY",26133,,30,,89995,89995,1845,0,,378,,0,,,,,158,560200,,3649,0,,,,,,,16752278,133202,16752278,133202,,,,,,0,,0 +"2020-11-15","OH",5722,5373,8,349,22265,22265,3175,189,4204,755,,0,,,,,368,298096,282550,7853,0,,9213,,,309598,202937,,0,5258841,70955,,235508,,,,0,5258841,70955 +"2020-11-15","OK",1528,,12,,10372,10372,1247,101,,362,1653599,0,,,1653599,,,154128,,3923,0,5545,,,,159890,124793,,0,1807727,3923,93221,,,,,0,1816690,0 +"2020-11-15","OR",759,,6,,3628,3628,356,0,,70,895547,7337,,,1597704,,30,56018,,1081,0,,,,,84908,,,0,1682612,20150,,,,,940403,0,1682612,20150 +"2020-11-15","PA",9312,,38,,,,2440,0,,531,2559496,21349,,,,,265,265137,248981,5199,0,,,,,,178070,4849893,64363,4849893,64363,,,,,2808477,26170,,0 +"2020-11-15","PR",935,725,14,210,,,515,0,,90,305972,0,,,395291,,66,42479,41798,707,0,36226,,,,20103,35472,,0,348451,707,,,,,,0,415664,0 +"2020-11-15","RI",1265,,8,,3857,3857,256,28,,21,440141,2427,,,1294226,,12,43442,,679,0,,,,,55296,,1349522,13763,1349522,13763,,,,,483583,3106,,0 +"2020-11-15","SC",4112,3846,2,266,11211,11211,752,29,,192,1895082,16956,74800,,1836132,,86,195507,184360,1493,0,10064,20592,,,243310,101388,,0,2090589,18449,84864,160440,,,,0,2079442,18373 +"2020-11-15","SD",644,,23,,3644,3644,553,46,,100,228733,1092,,,,,49,65381,61700,1199,0,,,,,67429,45377,,0,455798,4697,,,,,294114,2291,455798,4697 +"2020-11-15","TN",3893,3620,16,273,11141,11141,1972,25,,529,,0,,,3734417,,224,310937,289358,5817,0,,21236,,,344333,270091,,0,4078750,45396,,206697,,,,0,4078750,45396 +"2020-11-15","TX",19559,,89,,,,7274,0,,2047,,0,,,,,,1108402,1020721,7923,0,53738,45833,,,1146144,871784,,0,9674671,55561,528417,549925,,,,0,9674671,55561 +"2020-11-15","UT",718,,8,,6769,6769,502,93,1298,186,1035460,5877,,,1446354,487,,153808,,2667,0,,10760,,10401,155439,104317,,0,1601793,13039,,138449,,65328,1179407,8508,1601793,13039 +"2020-11-15","VA",3800,3527,1,273,13504,13504,1284,24,,252,,0,,,,,120,201960,183454,1161,0,11983,14728,,,220239,,2920737,33735,2920737,33735,158299,231890,,,,0,,0 +"2020-11-15","VI",23,,0,,,,,0,,,24635,0,,,,,,1434,,0,0,,,,,,1370,,0,26069,0,,,,,26110,0,,0 +"2020-11-15","VT",59,59,0,,,,20,0,,1,196563,666,,,,,,2971,2899,44,0,,,,,,2023,,0,474928,6894,,,,,199462,707,474928,6894 +"2020-11-15","WA",2519,2519,0,,9281,9281,658,15,,156,,0,,,,,75,138276,134923,2610,0,,,,,,,2748782,26695,2748782,26695,,,,,,0,,0 +"2020-11-15","WI",2751,2637,12,114,14381,14381,2097,155,1665,446,2001239,11919,,,,,,329924,312369,6320,0,,,,,,240075,3865176,42769,3865176,42769,,,,,2313608,17977,,0 +"2020-11-15","WV",582,560,8,22,,,365,0,,113,,0,,,,,36,33659,29700,867,0,,,,,,23077,,0,920366,11015,19946,,,,,0,920366,11015 +"2020-11-15","WY",144,,0,,580,580,189,0,,,130208,0,,,325126,,,22494,19298,613,0,,,,,22704,12453,,0,347830,1027,,,,,148451,0,347830,1027 +"2020-11-14","AK",98,98,2,,543,543,125,1,,,,0,,,834759,,11,22020,,734,0,,,,,27004,7162,,0,862264,17598,,,,,,0,862264,17598 +"2020-11-14","AL",3246,2998,15,248,22275,22275,1120,0,2151,,1271260,10660,,,,1244,,215843,181895,2226,0,,,,,,88038,,0,1453155,12280,,,67747,,1453155,12280,,0 +"2020-11-14","AR",2148,1968,0,180,7847,7847,799,30,,291,1367077,0,,,1367077,894,114,130318,116787,0,0,,,,15578,,112383,,0,1483864,0,,,,92030,,0,1483864,0 +"2020-11-14","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-14","AZ",6300,5845,43,455,22937,22937,1470,117,,362,1695606,15344,,,,,189,273053,265808,3476,0,,,,,,,,0,3235173,34245,,,330139,,1961414,18698,3235173,34245 +"2020-11-14","CA",18218,,81,,,,4212,0,,1024,,0,,,,,,1008377,1008377,9875,0,,,,,,,,0,20671596,193096,,,,,,0,20671596,193096 +"2020-11-14","CO",2525,2116,21,409,11056,11056,1325,195,,,1285090,15227,177403,,,,,159234,151115,5196,0,14666,,,,,,2485451,41852,2485451,41852,192069,,,,1436205,20319,,0 +"2020-11-14","CT",4737,3807,0,930,12257,12257,659,0,,,,0,,,2963919,,,88645,82854,0,0,,2269,,,114264,,,0,3082028,38769,,32399,,,,0,3082028,38769 +"2020-11-14","DC",658,,1,,,,113,0,,34,,0,,,,,16,18814,,148,0,,,,,,14160,583319,5718,583319,5718,,,,,274710,1388,,0 +"2020-11-14","DE",736,646,2,90,,,132,0,,23,348969,1762,,,,,,28395,27143,379,0,,,,,29586,14727,616447,7673,616447,7673,,,,,377364,2141,,0 +"2020-11-14","FL",17704,,45,,52441,52441,3151,278,,,5691962,27562,539858,524946,8538245,,,862990,811081,4405,0,64112,,62540,,1114105,,10899389,37613,10899389,37613,604369,,587789,,6554952,31967,9700441,35687 +"2020-11-14","GA",8956,8462,51,494,33216,33216,2050,127,6220,,,0,,,,,,422905,384997,3035,0,32485,,,,359580,,,0,3865939,27389,344853,,,,,0,3865939,27389 +"2020-11-14","GU",93,,0,,,,76,0,,21,70792,424,,,,,10,5965,5854,41,0,8,111,,,,3942,,0,76757,465,212,884,,,,0,75406,0 +"2020-11-14","HI",222,222,0,,1194,1194,63,7,,14,,0,,,,,1,16652,16412,118,0,,,,,16349,,589797,4860,589797,4860,,,,,,0,,0 +"2020-11-14","IA",1972,,24,,,,1261,0,,246,816158,4149,,66587,,,107,163728,163728,4093,0,,,4229,17591,,107541,,0,979886,8242,,,70856,110178,981709,8287,,0 +"2020-11-14","ID",752,695,3,57,3102,3102,395,41,602,96,356065,2362,,,,,,79798,68350,1519,0,,,,,,34482,,0,424415,3632,,24306,,,424415,3632,580624,5227 +"2020-11-14","IL",11088,10670,197,418,,,5415,0,,1018,,0,,,,,499,562985,,11028,0,,,,,,,,0,8986010,114370,,,,,,0,8986010,114370 +"2020-11-14","IN",4888,4638,25,250,20383,20383,2634,295,3869,689,1673064,16559,,,,,227,244887,,8322,0,,,,,228434,,,0,3482745,68372,,,,,1917951,24881,3482745,68372 +"2020-11-14","KS",1256,,0,,4327,4327,811,0,1184,211,591280,0,,,,348,74,115507,,0,0,,,,,,,,0,706787,0,,,,,700505,0,,0 +"2020-11-14","KY",1658,1621,11,37,8783,8783,1378,131,2222,308,,0,,,,,167,136137,112914,3293,0,,,,,,24329,,0,2194098,20574,90112,87694,,,,0,2194098,20574 +"2020-11-14","LA",6121,5885,0,236,,,692,0,,,2790487,0,,,,,62,201981,194685,0,0,,,,,,176107,,0,2992468,0,,67211,,,,0,2985172,0 +"2020-11-14","MA",10293,10065,28,228,13588,13588,705,0,,151,2838585,24951,,,,,71,186142,180468,3047,0,,,11910,,229868,137422,,0,7197095,111066,,,129352,221431,3019053,27792,7197095,111066 +"2020-11-14","MD",4293,4144,20,149,18458,18458,921,177,,218,1934079,11546,,138383,,,,164090,164090,2321,0,,,14367,,197046,8362,,0,3831159,37627,,,152750,,2098169,13867,3831159,37627 +"2020-11-14","ME",163,162,1,1,572,572,67,6,,23,,0,12044,,,,7,8791,7882,152,0,373,72,,,9491,6597,,0,729588,10445,12429,423,,,,0,729588,10445 +"2020-11-14","MI",8376,7994,68,382,,,3241,0,,660,,0,,,5416792,,272,275792,251813,7430,0,,,,,329421,138862,,0,5746213,72021,346627,,,,,0,5746213,72021 +"2020-11-14","MN",2874,2836,35,38,12915,12915,1424,271,3155,293,1903051,14877,,,,,,216028,213582,8689,0,,,,,,167234,3302499,50948,3302499,50948,,53893,,,2116633,23371,,0 +"2020-11-14","MO",3373,,14,,,,2447,0,,507,1425308,6937,83123,,2500103,,272,235722,235722,6346,0,6476,11554,,,263711,,,0,2769085,26153,89801,78308,85602,49432,1661030,13283,2769085,26153 +"2020-11-14","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,100,100,0,0,,,,,,29,,0,16567,0,,,,,16567,0,23472,0 +"2020-11-14","MS",3540,3134,21,406,6914,6914,778,0,,185,873863,0,,,,,96,133340,111720,1370,0,,,,,,111430,,0,1007203,1370,47023,123242,,,,0,982396,0 +"2020-11-14","MT",514,,37,,2042,2042,435,486,,,,0,,,,,,45886,,1642,0,,,,,,27472,,0,569694,3150,,,,,,0,569694,3150 +"2020-11-14","NC",4756,4651,36,105,,,1425,0,,347,,0,,,,,,309118,294328,3885,0,,,,,,,,0,4521717,44616,,65269,,,,0,4521717,44616 +"2020-11-14","ND",732,,19,,2153,2153,425,33,367,47,259356,1220,10473,,,,,63694,62780,2329,0,777,,,,,50835,955475,13350,955475,13350,11250,2110,,,322228,3486,999974,14701 +"2020-11-14","NE",775,,19,,3522,3522,918,62,,,561037,2931,,,1006218,,,94922,,2369,0,,,,,109695,51928,,0,1117259,14882,,,,,656286,5301,1117259,14882 +"2020-11-14","NH",499,,1,,804,804,68,-7,266,,369350,3107,,,,,,14311,12062,382,0,,,,,,10842,,0,690359,0,33433,,32612,,381412,3107,690359,0 +"2020-11-14","NJ",16548,14747,26,1801,38936,38936,2000,70,,370,4935991,37143,,,,,134,294472,274736,4970,0,,,,,,,,0,5230463,42113,,,,,,0,5210727,41496 +"2020-11-14","NM",1208,,10,,5523,5523,480,51,,,,0,,,,,,63171,,1165,0,,,,,,24788,,0,1360452,12258,,,,,,0,1360452,12258 +"2020-11-14","NV",1908,,15,,,,1025,0,,243,758832,4564,,,,,120,119006,119006,2269,0,,,,,,,1413453,25167,1413453,25167,,,,,877838,6833,,0 +"2020-11-14","NY",26103,,24,,89995,89995,1788,0,,367,,0,,,,,146,556551,,5388,0,,,,,,,16619076,184162,16619076,184162,,,,,,0,,0 +"2020-11-14","OH",5714,5367,14,347,22076,22076,3104,220,4187,767,,0,,,,,356,290243,274890,7715,0,,8693,,,301053,200715,,0,5187886,61139,,220681,,,,0,5187886,61139 +"2020-11-14","OK",1516,,23,,10271,10271,1247,165,,362,1653599,9934,,,1653599,,,150205,,2847,0,5545,,,,159890,123333,,0,1803804,12781,93221,,,,,0,1816690,12980 +"2020-11-14","OR",753,,7,,3628,3628,356,44,,70,888210,6212,,,1579019,,30,54937,,1058,0,,,,,83443,,,0,1662462,20470,,,,,940403,7229,1662462,20470 +"2020-11-14","PA",9274,,50,,,,2374,0,,518,2538147,14163,,,,,248,259938,244160,5551,0,,,,,,178070,4785530,58601,4785530,58601,,,,,2782307,19167,,0 +"2020-11-14","PR",921,711,7,210,,,539,0,,79,305972,0,,,395291,,62,41772,41174,653,0,35733,,,,20103,35074,,0,347744,653,,,,,,0,415664,0 +"2020-11-14","RI",1257,,3,,3829,3829,258,73,,23,437714,2313,,,1281215,,15,42763,,1234,0,,,,,54544,,1335759,20376,1335759,20376,,,,,480477,3547,,0 +"2020-11-14","SC",4110,3844,9,266,11182,11182,781,35,,183,1878126,39233,74614,,1819465,,93,194014,182943,1913,0,9988,20442,,,241604,100742,,0,2072140,41146,84602,158740,,,,0,2061069,40933 +"2020-11-14","SD",621,,53,,3598,3598,549,58,,92,227641,1307,,,,,45,64182,60600,1855,0,,,,,66103,44814,,0,451101,5787,,,,,291823,3162,451101,5787 +"2020-11-14","TN",3877,3604,25,273,11116,11116,2083,61,,533,,0,,,3694637,,225,305120,284173,4662,0,,20580,,,338717,268368,,0,4033354,34246,,195742,,,,0,4033354,34246 +"2020-11-14","TX",19470,,150,,,,7151,0,,1976,,0,,,,,,1100479,1014160,11401,0,52886,45359,,,1138098,861205,,0,9619110,96728,523180,546645,,,,0,9619110,96728 +"2020-11-14","UT",710,,9,,6676,6676,507,85,1297,184,1029583,10641,,,1436084,486,,151141,,5352,0,,10529,,10176,152670,102514,,0,1588754,21407,,135509,,63351,1170899,14349,1588754,21407 +"2020-11-14","VA",3799,3526,14,273,13480,13480,1312,72,,261,,0,,,,,121,200799,182484,1537,0,11920,14415,,,217693,,2887002,22993,2887002,22993,157976,229928,,,,0,,0 +"2020-11-14","VI",23,,0,,,,,0,,,24635,558,,,,,,1434,,24,0,,,,,,1370,,0,26069,582,,,,,26110,581,,0 +"2020-11-14","VT",59,59,0,,,,21,0,,2,195897,952,,,,,,2927,2858,98,0,,,,,,2000,,0,468034,6525,,,,,198755,1049,468034,6525 +"2020-11-14","WA",2519,2519,12,,9266,9266,698,88,,154,,0,,,,,121,135666,132462,2910,0,,,,,,,2722087,27917,2722087,27917,,,,,,0,,0 +"2020-11-14","WI",2739,2625,56,114,14226,14226,2034,181,1652,435,1989320,13808,,,,,,323604,306311,5581,0,,,,,,235170,3822407,54210,3822407,54210,,,,,2295631,18954,,0 +"2020-11-14","WV",574,554,9,20,,,344,0,,104,,0,,,,,34,32792,29004,1153,0,,,,,,23077,,0,909351,13131,19880,,,,,0,909351,13131 +"2020-11-14","WY",144,,17,,580,580,202,15,,,130208,0,,,324313,,,21881,18726,540,0,,,,,22490,12247,,0,346803,1121,,,,,148451,0,346803,1121 +"2020-11-13","AK",96,96,0,,542,542,113,5,,,,0,,,818384,,8,21286,,584,0,,,,,25793,7161,,0,844666,0,,,,,,0,844666,0 +"2020-11-13","AL",3231,2989,18,242,22275,22275,1177,85,2148,,1260600,15365,,,,1243,,213617,180275,2980,0,,,,,,88038,,0,1440875,19285,,,67410,,1440875,19285,,0 +"2020-11-13","AR",2148,1968,4,180,7817,7817,826,102,,292,1367077,12158,,,1367077,891,114,130318,116787,2312,0,,,,15578,,112383,,0,1483864,13717,,,,92030,,0,1483864,13717 +"2020-11-13","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-13","AZ",6257,5806,17,451,22820,22820,1381,244,,335,1680262,16284,,,,,176,269577,262454,3015,0,,,,,,,,0,3200928,38870,,,328786,,1942716,19210,3200928,38870 +"2020-11-13","CA",18137,,29,,,,4138,0,,1031,,0,,,,,,998502,998502,6893,0,,,,,,,,0,20478500,136428,,,,,,0,20478500,136428 +"2020-11-13","CO",2504,2096,36,408,10861,10861,1315,264,,,1269863,17213,176656,,,,,154038,146023,6439,0,14549,,,,,,2443599,51797,2443599,51797,191205,,,,1415886,26752,,0 +"2020-11-13","CT",4737,3807,11,930,12257,12257,659,0,,,,0,,,2927651,,,88645,82854,2746,0,,2269,,,111844,,,0,3043259,41657,,32399,,,,0,3043259,41657 +"2020-11-13","DC",657,,0,,,,115,0,,34,,0,,,,,19,18666,,159,0,,,,,,14160,577601,6071,577601,6071,,,,,273322,1381,,0 +"2020-11-13","DE",734,644,2,90,,,130,0,,22,347207,2519,,,,,,28016,26778,470,0,,,,,29166,14571,608774,4127,608774,4127,,,,,375223,2989,,0 +"2020-11-13","FL",17659,,74,,52163,52163,3129,271,,,5664400,22512,531822,517552,8508101,,,858585,807971,6760,0,62323,,60854,,1108643,,10861776,78469,10861776,78469,594540,,578706,,6522985,29272,9664754,61456 +"2020-11-13","GA",8905,8418,24,487,33089,33089,2037,142,6211,,,0,,,,,,419870,382505,2994,0,32185,,,,357467,,,0,3838550,31137,343337,,,,,0,3838550,31137 +"2020-11-13","GU",93,,2,,,,78,0,,18,70368,769,,,,,11,5924,5813,74,0,8,111,,,,3942,,0,76292,843,212,884,,,,0,75406,823 +"2020-11-13","HI",222,222,0,,1187,1187,69,9,,16,,0,,,,,1,16534,16302,97,0,,,,,16245,,584937,4862,584937,4862,,,,,,0,,0 +"2020-11-13","IA",1948,,18,,,,1227,0,,240,812009,2856,,66226,,,107,159635,159635,4032,0,,,4194,17031,,106529,,0,971644,6888,,,70460,108344,973422,6898,,0 +"2020-11-13","ID",749,692,16,57,3061,3061,395,59,600,96,353703,2457,,,,,,78279,67080,1158,0,,,,,,34104,,0,420783,3337,,24306,,,420783,3337,575397,5063 +"2020-11-13","IL",10891,10504,45,387,,,5362,0,,990,,0,,,,,488,551957,,15415,0,,,,,,,,0,8871640,106540,,,,,,0,8871640,106540 +"2020-11-13","IN",4863,4613,50,250,20088,20088,2548,515,3810,664,1656505,11153,,,,,216,236565,,5600,0,,,,,221056,,,0,3414373,44275,,,,,1893070,16753,3414373,44275 +"2020-11-13","KS",1256,,41,,4327,4327,811,75,1184,211,591280,0,,,,348,74,115507,,6282,0,,,,,,,,0,706787,6282,,,,,700505,0,,0 +"2020-11-13","KY",1647,1611,25,36,8652,8652,1358,85,2200,307,,0,,,,,147,132844,110237,3164,0,,,,,,23872,,0,2173524,28064,89500,86761,,,,0,2173524,28064 +"2020-11-13","LA",6121,5885,24,236,,,692,0,,,2790487,30530,,,,,62,201981,194685,3450,0,,,,,,176107,,0,2992468,33980,,67211,,,,0,2985172,33326 +"2020-11-13","MA",10265,10038,23,227,13588,13588,687,0,,153,2813634,19212,,,,,71,183095,177627,2906,0,,,11910,,226622,137422,,0,7086029,81305,,,129352,218466,2991261,21886,7086029,81305 +"2020-11-13","MD",4273,4124,12,149,18281,18281,914,142,,208,1922533,10448,,138383,,,,161769,161769,1869,0,,,14367,,194537,8343,,0,3793532,32019,,,152750,,2084302,12317,3793532,32019 +"2020-11-13","ME",162,161,3,1,566,566,66,13,,18,,0,12044,,,,6,8639,7748,244,0,373,57,,,9198,6428,,0,719143,8690,12429,366,,,,0,719143,8690 +"2020-11-13","MI",8308,7929,123,379,,,3241,0,,660,,0,,,5354790,,272,268362,244741,9179,0,,,,,319402,128981,,0,5674192,74496,344502,,,,,0,5674192,74496 +"2020-11-13","MN",2839,2802,46,37,12644,12644,1424,201,3119,293,1888174,19255,,,,,,207339,205088,5544,0,,,,,,161756,3251551,48226,3251551,48226,,52885,,,2093262,24586,,0 +"2020-11-13","MO",3359,,20,,,,2328,0,,512,1418371,4178,82730,,2480694,,264,229376,229376,4005,0,6355,11101,,,257036,,,0,2742932,15996,89287,71928,85184,48068,1647747,8183,2742932,15996 +"2020-11-13","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,100,100,0,0,,,,,,29,,0,16567,0,,,,,16567,0,23472,0 +"2020-11-13","MS",3519,3122,5,397,6914,6914,767,0,,194,873863,0,,,,,92,131970,110930,1305,0,,,,,,111430,,0,1005833,1305,47023,123242,,,,0,982396,0 +"2020-11-13","MT",477,,5,,1556,1556,492,15,,,,0,,,,,,44244,,1213,0,,,,,,25389,,0,566544,8593,,,,,,0,566544,8593 +"2020-11-13","NC",4720,4619,14,101,,,1423,0,,352,,0,,,,,,305233,290802,1779,0,,,,,,,,0,4477101,43421,,61929,,,,0,4477101,43421 +"2020-11-13","ND",713,,10,,2120,2120,421,38,364,50,258136,915,10387,,,,,61365,60511,1490,0,749,,,,,49409,942125,11144,942125,11144,11136,1944,,,318742,2349,985273,11942 +"2020-11-13","NE",756,,25,,3460,3460,905,-21,,,558106,3197,,,993920,,,92553,,2611,0,,,,,107120,51017,,0,1102377,16585,,,,,650985,5812,1102377,16585 +"2020-11-13","NH",498,,3,,811,811,69,7,266,,366243,3257,,,,,,13929,12062,459,0,,,,,,10688,,0,690359,0,33433,,32562,,378305,3257,690359,0 +"2020-11-13","NJ",16522,14721,27,1801,38866,38866,1909,105,,359,4898848,41236,,,,,129,289502,270383,4023,0,,,,,,,,0,5188350,45259,,,,,,0,5169231,44633 +"2020-11-13","NM",1198,,22,,5472,5472,455,64,,,,0,,,,,,62006,,1230,0,,,,,,24449,,0,1348194,17791,,,,,,0,1348194,17791 +"2020-11-13","NV",1893,,13,,,,985,0,,247,754268,3785,,,,,119,116737,116737,1857,0,,,,,,,1388286,12617,1388286,12617,,,,,871005,5642,,0 +"2020-11-13","NY",26079,,24,,89995,89995,1737,0,,331,,0,,,,,137,551163,,5401,0,,,,,,,16434914,203721,16434914,203721,,,,,,0,,0 +"2020-11-13","OH",5700,5354,42,346,21856,21856,2981,298,4164,735,,0,,,,,347,282528,267338,8071,0,,8185,,,292956,197674,,0,5126747,64973,,207345,,,,0,5126747,64973 +"2020-11-13","OK",1493,,12,,10106,10106,1279,76,,350,1643665,37862,,,1643665,,,147358,,2667,0,5545,,,,156722,121774,,0,1791023,40529,93221,,,,,0,1803710,43965 +"2020-11-13","OR",746,,4,,3584,3584,342,31,,71,881998,6425,,,1559879,,27,53879,,1109,0,,,,,82113,,,0,1641992,16325,,,,,933174,7476,1641992,16325 +"2020-11-13","PA",9224,,30,,,,2314,0,,480,2523984,17335,,,,,226,254387,239156,5531,0,,,,,,178070,4726929,57503,4726929,57503,,,,,2763140,22366,,0 +"2020-11-13","PR",914,704,5,210,,,559,0,,77,305972,0,,,395291,,59,41119,40574,667,0,35416,,,,20103,35284,,0,347091,667,,,,,,0,415664,0 +"2020-11-13","RI",1254,,4,,3756,3756,250,55,,27,435401,1751,,,1262119,,14,41529,,765,0,,,,,53264,,1315383,14097,1315383,14097,,,,,476930,2516,,0 +"2020-11-13","SC",4101,3835,17,266,11147,11147,775,63,,188,1838893,8438,74215,,1781234,,89,192101,181243,1611,0,9783,19980,,,238902,100074,,0,2030994,10049,83998,151564,,,,0,2020136,9849 +"2020-11-13","SD",568,,1,,3540,3540,556,85,,102,226334,962,,,,,48,62327,58920,1611,0,,,,,64285,43132,,0,445314,4421,,,,,288661,2573,445314,4421 +"2020-11-13","TN",3852,3583,64,269,11055,11055,2019,105,,527,,0,,,3664854,,218,300458,280117,3733,0,,19937,,,334254,265459,,0,3999108,22774,,189458,,,,0,3999108,22774 +"2020-11-13","TX",19320,,173,,,,7083,0,,1959,,0,,,,,,1089078,1004983,13424,0,52329,44453,,,1126150,850648,,0,9522382,94206,519740,536610,,,,0,9522382,94206 +"2020-11-13","UT",701,,14,,6591,6591,492,104,1294,184,1018942,6865,,,1418600,485,,145789,,2150,0,,10054,,9716,148747,100892,,0,1567347,15697,,128895,,60156,1156550,9804,1567347,15697 +"2020-11-13","VA",3785,3513,27,272,13408,13408,1296,69,,258,,0,,,,,115,199262,181476,1235,0,11841,13895,,,215909,,2864009,10212,2864009,10212,157504,224599,,,,0,,0 +"2020-11-13","VI",23,,0,,,,,0,,,24077,0,,,,,,1410,,0,0,,,,,,1357,,0,25487,0,,,,,25529,0,,0 +"2020-11-13","VT",59,59,0,,,,24,0,,3,194945,924,,,,,,2829,2761,102,0,,,,,,1977,,0,461509,5461,,,,,197706,1017,461509,5461 +"2020-11-13","WA",2507,2507,25,,9178,9178,653,86,,147,,0,,,,,76,132756,129688,2163,0,,,,,,,2694170,49745,2694170,49745,,,,,,0,,0 +"2020-11-13","WI",2683,2573,62,110,14045,14045,2045,274,1637,435,1975512,10713,,,,,,318023,301165,8451,0,,,,,,229469,3768197,39614,3768197,39614,,,,,2276677,18510,,0 +"2020-11-13","WV",565,545,10,20,,,339,0,,104,,0,,,,,34,31639,28076,742,0,,,,,,22543,,0,896220,13860,19846,,,,,0,896220,13860 +"2020-11-13","WY",127,,0,,565,565,195,7,,,130208,1400,,,323424,,,21341,18243,862,0,,,,,22258,12082,,0,345682,4629,,,,,148451,2201,345682,4629 +"2020-11-12","AK",96,96,0,,537,537,113,9,,,,0,,,818384,,8,20702,,481,0,,,,,25793,7161,,0,844666,10076,,,,,,0,844666,10076 +"2020-11-12","AL",3213,2970,12,243,22190,22190,1233,304,2144,,1245235,0,,,,1240,,210637,178013,2000,0,,,,,,88038,,0,1421590,0,,,67066,,1421590,0,,0 +"2020-11-12","AR",2144,1964,18,180,7715,7715,805,80,,295,1354919,11868,,,1354919,887,116,128006,115228,1809,0,,,,14698,,111357,,0,1470147,13153,,,,87860,,0,1470147,13153 +"2020-11-12","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-12","AZ",6240,5793,12,447,22576,22576,1368,82,,331,1663978,13906,,,,,180,266562,259528,1399,0,,,,,,,,0,3162058,28355,,,327834,,1923506,15197,3162058,28355 +"2020-11-12","CA",18108,,38,,,,4002,0,,1010,,0,,,,,,991609,991609,6927,0,,,,,,,,0,20342072,119979,,,,,,0,20342072,119979 +"2020-11-12","CO",2468,2060,25,408,10597,10597,1322,59,,,1252650,0,175579,,,,,147599,139741,5197,0,14341,,,,,,2391802,44534,2391802,44534,189920,,,,1389134,1866,,0 +"2020-11-12","CT",4726,3798,10,928,12257,12257,617,0,,,,0,,,2888423,,,85899,80216,1158,0,,1809,,,109501,,,0,3001602,42441,,27240,,,,0,3001602,42441 +"2020-11-12","DC",657,,0,,,,109,0,,33,,0,,,,,8,18507,,128,0,,,,,,14103,571530,4458,571530,4458,,,,,271941,1356,,0 +"2020-11-12","DE",732,642,8,90,,,126,0,,22,344688,1405,,,,,,27546,26320,204,0,,,,,28976,14487,604647,1319,604647,1319,,,,,372234,1609,,0 +"2020-11-12","FL",17585,,73,,51892,51892,3062,161,,,5641888,21228,531822,517552,8455602,,,851825,803220,5504,0,62323,,60854,,1099871,,10783307,69004,10783307,69004,594540,,578706,,6493713,26732,9603298,52534 +"2020-11-12","GA",8881,8403,75,478,32947,32947,2045,141,6191,,,0,,,,,,416876,380190,2982,0,31909,,,,355154,,,0,3807413,21367,341681,,,,,0,3807413,21367 +"2020-11-12","GU",91,,0,,,,83,0,,17,69599,805,,,,,11,5850,5740,95,0,8,110,,,,3865,,0,75449,900,212,864,,,,0,74583,1544 +"2020-11-12","HI",222,222,0,,1178,1178,73,0,,16,,0,,,,,1,16437,16205,117,0,,,,,16150,,580075,5223,580075,5223,,,,,,0,,0 +"2020-11-12","IA",1930,,31,,,,1208,0,,215,809153,2753,,66057,,,101,155603,155603,3650,0,,,4157,15636,,105384,,0,964756,6403,,,70254,103440,966524,6385,,0 +"2020-11-12","ID",733,676,19,57,3002,3002,361,40,598,94,351246,2283,,,,,,77121,66200,1693,0,,,,,,33715,,0,417446,3608,,17332,,,417446,3608,570334,4663 +"2020-11-12","IL",10846,10477,48,369,,,5258,0,,956,,0,,,,,438,536542,,12702,0,,,,,,,,0,8765100,100617,,,,,,0,8765100,100617 +"2020-11-12","IN",4813,4563,51,250,19573,19573,2569,289,3758,671,1645352,16026,,,,,220,230965,,6591,0,,,,,216436,,,0,3370098,62253,,,,,1876317,22617,3370098,62253 +"2020-11-12","KS",1215,,0,,4252,4252,810,0,1167,210,591280,-3142,,,,347,80,109225,,0,0,,,,,,,,0,700505,-3142,,,,,700505,-3142,,0 +"2020-11-12","KY",1622,1589,18,33,8567,8567,1311,164,2187,299,,0,,,,,163,129680,107745,2336,0,,,,,,23629,,0,2145460,39901,89262,85130,,,,0,2145460,39901 +"2020-11-12","LA",6097,5863,39,234,,,676,0,,,2759957,29736,,,,,59,198531,191889,3829,0,,,,,,176107,,0,2958488,33565,,,,,,0,2951846,31943 +"2020-11-12","MA",10242,10015,20,227,13588,13588,661,215,,151,2794422,19249,,,,,68,180189,174953,2648,0,,,11842,,223573,137422,,0,7004724,98075,,,128053,213220,2969375,21731,7004724,98075 +"2020-11-12","MD",4261,4112,12,149,18139,18139,863,127,,199,1912085,9672,,138383,,,,159900,159900,1477,0,,,14367,,192393,8323,,0,3761513,31598,,,152750,,2071985,11149,3761513,31598 +"2020-11-12","ME",159,158,1,1,553,553,62,8,,16,,0,12030,,,,6,8395,7517,193,0,372,57,,,9002,6292,,0,710453,10887,12414,294,,,,0,710453,10887 +"2020-11-12","MI",8185,7811,49,374,,,3209,0,,628,,0,,,5290609,,253,259183,236225,7311,0,,,,,309087,128981,,0,5599696,68512,343088,,,,,0,5599696,68512 +"2020-11-12","MN",2793,2756,39,37,12443,12443,1329,292,3086,278,1868919,18173,,,,,,201795,199757,7225,0,,,,,,159467,3203325,53217,3203325,53217,,50555,,,2068676,25020,,0 +"2020-11-12","MO",3339,,16,,,,2248,0,,518,1414193,7042,82623,,2468905,,248,225371,225371,4603,0,6296,10518,,,252857,,,0,2726936,21731,89120,67779,85034,46276,1639564,11645,2726936,21731 +"2020-11-12","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,100,100,0,0,,,,,,29,,0,16567,0,,,,,16567,0,23472,0 +"2020-11-12","MS",3514,3118,17,396,6914,6914,774,0,,194,873863,0,,,,,86,130665,110244,1271,0,,,,,,111430,,0,1004528,1271,47023,123242,,,,0,982396,0 +"2020-11-12","MT",472,,0,,1541,1541,499,11,,,,0,,,,,,43031,,961,0,,,,,,24804,,0,557951,10223,,,,,,0,557951,10223 +"2020-11-12","NC",4706,4606,8,100,,,1279,0,,325,,0,,,,,,303454,289204,2893,0,,,,,,,,0,4433680,37868,,59388,,,,0,4433680,37868 +"2020-11-12","ND",703,,12,,2082,2082,399,115,361,53,257221,987,10387,,,,,59875,59079,1835,0,749,,,,,48055,930981,13030,930981,13030,11136,1782,,,316393,2787,973331,14490 +"2020-11-12","NE",731,,1,,3481,3481,885,115,,,554909,3180,,,980211,,,89942,,2209,0,,,,,104283,50148,,0,1085792,14087,,,,,645173,5385,1085792,14087 +"2020-11-12","NH",495,,3,,804,804,69,4,266,,362986,3990,,,,,,13470,12062,322,0,,,,,,10447,,0,690359,16372,33433,,32523,,375048,4447,690359,16372 +"2020-11-12","NJ",16495,14694,19,1801,38761,38761,1827,161,,360,4857612,36314,,,,,117,285479,266986,4236,0,,,,,,,,0,5143091,40550,,,,,,0,5124598,39805 +"2020-11-12","NM",1176,,18,,5408,5408,471,52,,,,0,,,,,,60776,,1742,0,,,,,,24291,,0,1330403,13155,,,,,,0,1330403,13155 +"2020-11-12","NV",1880,,3,,,,941,0,,229,750483,4575,,,,,115,114880,114880,1469,0,,,,,,,1375669,12785,1375669,12785,,,,,865363,6044,,0 +"2020-11-12","NY",26055,,29,,89995,89995,1677,0,,308,,0,,,,,136,545762,,4797,0,,,,,,,16231193,162627,16231193,162627,,,,,,0,,0 +"2020-11-12","OH",5658,5316,35,342,21558,21558,3024,268,4143,756,,0,,,,,332,274457,259499,7101,0,,7779,,,284452,194846,,0,5061774,56533,,197934,,,,0,5061774,56533 +"2020-11-12","OK",1481,,11,,10030,10030,1248,162,,340,1605803,0,,,1605803,,,144691,,2357,0,5285,,,,151156,120426,,0,1750494,2357,91240,,,,,0,1759745,0 +"2020-11-12","OR",742,,5,,3553,3553,345,42,,77,875573,6266,,,1544831,,27,52770,,861,0,,,,,80836,,,0,1625667,17661,,,,,925698,7097,1625667,17661 +"2020-11-12","PA",9194,,49,,,,2196,0,,438,2506649,17888,,,,,207,248856,234125,5488,0,,,,,,176687,4669426,52839,4669426,52839,,,,,2740774,22731,,0 +"2020-11-12","PR",909,700,8,209,,,566,0,,76,305972,0,,,395291,,59,40452,39968,1332,0,35210,,,,20103,34679,,0,346424,1332,,,,,,0,415664,0 +"2020-11-12","RI",1250,,7,,3701,3701,232,45,,28,433650,2142,,,1248876,,17,40764,,988,0,,,,,52410,,1301286,20141,1301286,20141,,,,,474414,3130,,0 +"2020-11-12","SC",4084,3817,8,267,11084,11084,810,60,,196,1830455,18741,74045,,1772990,,91,190490,179832,1495,0,9731,19620,,,237297,99368,,0,2020945,20236,83776,149728,,,,0,2010287,20049 +"2020-11-12","SD",567,,0,,3455,3455,551,66,,97,225372,948,,,,,49,60716,57438,2020,0,,,,,62858,41427,,0,440893,4851,,,,,286088,2968,440893,4851 +"2020-11-12","TN",3788,3531,27,257,10950,10950,1973,55,,528,,0,,,3645425,,224,296725,277081,3344,0,,19188,,,330909,262527,,0,3976334,21184,,181346,,,,0,3976334,21184 +"2020-11-12","TX",19147,,143,,,,6925,0,,1879,,0,,,,,,1075654,993841,10589,0,51772,43455,,,1115259,838950,,0,9428176,96818,515698,523543,,,,0,9428176,96818 +"2020-11-12","UT",687,,9,,6487,6487,484,92,1277,191,1012077,7784,,,1406001,480,,143639,,3919,0,,9674,,9344,145649,98897,,0,1551650,16670,,124502,,57803,1146746,10802,1551650,16670 +"2020-11-12","VA",3758,3490,17,268,13339,13339,1313,66,,246,,0,,,,,110,198027,180623,1521,0,11761,13380,,,214915,,2853797,11990,2853797,11990,157051,216078,,,,0,,0 +"2020-11-12","VI",23,,0,,,,,0,,,24077,0,,,,,,1410,,0,0,,,,,,1357,,0,25487,0,,,,,25529,0,,0 +"2020-11-12","VT",59,59,0,,,,22,0,,5,194021,1231,,,,,,2727,2668,125,0,,,,,,1958,,0,456048,6242,,,,,196689,1350,456048,6242 +"2020-11-12","WA",2482,2482,0,,9092,9092,628,0,,115,,0,,,,,58,130593,127648,2384,0,,,,,,,2644425,0,2644425,0,,,,,,0,,0 +"2020-11-12","WI",2621,2515,67,106,13771,13771,2077,264,1625,424,1964799,14931,,,,,,309572,293388,8223,0,,,,,,223937,3728583,49459,3728583,49459,,,,,2258167,22408,,0 +"2020-11-12","WV",555,535,2,20,,,306,0,,93,,0,,,,,34,30897,27487,696,0,,,,,,22115,,0,882360,12984,19767,,,,,0,882360,12984 +"2020-11-12","WY",127,,0,,558,558,192,13,,,128808,1569,,,319496,,,20479,17442,1105,0,,,,,21557,11585,,0,341053,6252,,,,,146250,2493,341053,6252 +"2020-11-11","AK",96,96,4,,528,528,117,8,,,,0,,,809341,,7,20221,,487,0,,,,,24766,7160,,0,834590,6450,,,,,,0,834590,6450 +"2020-11-11","AL",3201,2958,81,243,21886,21886,1210,0,2142,,1245235,14083,,,,1239,,208637,176355,2070,0,,,,,,84471,,0,1421590,15451,,,66749,,1421590,15451,,0 +"2020-11-11","AR",2126,1947,14,179,7635,7635,801,56,,304,1343051,11043,,,1343051,882,116,126197,113943,1962,0,,,,14095,,110365,,0,1456994,12250,,,,85009,,0,1456994,12250 +"2020-11-11","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-11","AZ",6228,5786,36,442,22494,22494,1360,66,,309,1650072,7775,,,,,156,265163,258237,2030,0,,,,,,,,0,3133703,38838,,,326811,,1908309,9695,3133703,38838 +"2020-11-11","CA",18070,,69,,,,3987,0,,1006,,0,,,,,,984682,984682,7464,0,,,,,,,,0,20222093,127452,,,,,,0,20222093,127452 +"2020-11-11","CO",2443,2039,16,404,10538,10538,1304,275,,,1252650,16291,175579,,,,,142402,134618,3975,0,14341,,,,,,2347268,40486,2347268,40486,189920,,,,1387268,20241,,0 +"2020-11-11","CT",4716,3791,9,925,12257,12257,584,0,,,,0,,,2848568,,,84741,79333,1754,0,,1809,,,107011,,,0,2959161,48035,,27240,,,,0,2959161,48035 +"2020-11-11","DC",657,,0,,,,112,0,,30,,0,,,,,17,18379,,206,0,,,,,,14036,567072,5239,567072,5239,,,,,270585,1747,,0 +"2020-11-11","DE",724,637,2,87,,,126,0,,25,343283,1264,,,,,,27342,26121,230,0,,,,,28875,14380,603328,4285,603328,4285,,,,,370625,1494,,0 +"2020-11-11","FL",17512,,52,,51731,51731,3056,252,,,5620660,27071,531822,517552,8409994,,,846321,799004,5669,0,62323,,60854,,1093112,,10714303,67377,10714303,67377,594540,,578706,,6466981,32740,9550764,57657 +"2020-11-11","GA",8806,8333,76,473,32806,32806,2002,175,6171,,,0,,,,,,413894,377694,2242,0,31711,,,,353053,,,0,3786046,13522,340578,,,,,0,3786046,13522 +"2020-11-11","GU",91,,0,,,,80,0,,20,68794,589,,,,,11,5755,5653,101,0,7,102,,,,3667,,0,74549,690,210,818,,,,0,73039,0 +"2020-11-11","HI",222,222,1,,1178,1178,77,31,,16,,0,,,,,1,16320,16088,78,0,,,,,16028,,574852,4844,574852,4844,,,,,,0,,0 +"2020-11-11","IA",1899,,25,,,,1190,0,,210,806400,3865,,65712,,,101,151953,151953,4297,0,,,4110,14888,,104226,,0,958353,8162,,,69862,101190,960139,8154,,0 +"2020-11-11","ID",714,660,16,54,2962,2962,288,36,593,72,348963,2379,,,,,,75428,64875,1201,0,,,,,,33330,,0,413838,3343,,17332,,,413838,3343,565671,4732 +"2020-11-11","IL",10798,10434,153,364,,,5042,0,,951,,0,,,,,404,523840,,12657,0,,,,,,,,0,8664483,93464,,,,,,0,8664483,93464 +"2020-11-11","IN",4762,4512,31,250,19284,19284,2544,261,3703,649,1629326,11034,,,,,196,224374,,5036,0,,,,,211162,,,0,3307845,38192,,,,,1853700,16070,3307845,38192 +"2020-11-11","KS",1215,,34,,4252,4252,810,114,1167,210,594422,7993,,,,347,80,109225,,5672,0,,,,,,,,0,703647,13665,,,,,703647,13665,,0 +"2020-11-11","KY",1604,1574,14,30,8403,8403,1189,0,2146,286,,0,,,,,,127344,105907,2698,0,,,,,,23165,,0,2105559,0,87849,76184,,,,0,2105559,0 +"2020-11-11","LA",6058,5829,0,229,,,684,0,,,2730221,0,,,,,66,194702,189682,0,0,,,,,,172210,,0,2924923,0,,,,,,0,2919903,0 +"2020-11-11","MA",10222,9994,38,228,13373,13373,659,0,,152,2775173,17957,,,,,72,177541,172471,2660,0,,,11842,,220852,131646,,0,6906649,80321,,,128053,210771,2947644,20452,6906649,80321 +"2020-11-11","MD",4249,4100,16,149,18012,18012,805,98,,193,1902413,11275,,138383,,,,158423,158423,1714,0,,,14367,,190702,8313,,0,3729915,27257,,,152750,,2060836,12989,3729915,27257 +"2020-11-11","ME",158,157,2,1,545,545,49,7,,14,,0,11908,,,,5,8202,7300,142,0,372,57,,,8764,6226,,0,699566,9238,12292,291,,,,0,699566,9238 +"2020-11-11","MI",8136,7766,42,370,,,3093,0,,604,,0,,,5230604,,263,251872,229285,6620,0,,,,,300580,128981,,0,5531184,56015,341946,,,,,0,5531184,56015 +"2020-11-11","MN",2754,2720,56,34,12151,12151,1299,218,3032,282,1850746,6542,,,,,,194570,192910,4889,0,,,,,,157164,3150108,14112,3150108,14112,,44734,,,2043656,11338,,0 +"2020-11-11","MO",3323,,24,,,,2157,0,,486,1407151,24678,82353,,2452034,,257,220768,220768,4071,0,6208,10151,,,248056,,,0,2705205,59784,88762,65144,84721,45359,1627919,28749,2705205,59784 +"2020-11-11","MP",2,2,0,,4,4,,0,,,16467,0,,,,,,100,100,0,0,,,,,,29,,0,16567,0,,,,,16567,0,23472,0 +"2020-11-11","MS",3497,3108,17,389,6914,6914,756,0,,191,873863,0,,,,,78,129394,109679,1256,0,,,,,,111430,,0,1003257,1256,47023,123242,,,,0,982396,0 +"2020-11-11","MT",472,,10,,1530,1530,500,20,,,,0,,,,,,42070,,919,0,,,,,,24594,,0,547728,3162,,,,,,0,547728,3162 +"2020-11-11","NC",4698,4598,38,100,,,1246,0,,301,,0,,,,,,300561,286524,3119,0,,,,,,,,0,4395812,25979,,55930,,,,0,4395812,25979 +"2020-11-11","ND",691,,42,,1967,1967,411,61,351,51,256234,694,10387,,,,,58040,57285,1096,0,749,,,,,45031,917951,10579,917951,10579,11136,1659,,,313606,2608,958841,6140 +"2020-11-11","NE",730,,20,,3366,3366,860,45,,,551729,3564,,,968534,,,87733,,2182,0,,,,,101873,49761,,0,1071705,22627,,,,,639788,5748,1071705,22627 +"2020-11-11","NH",492,,3,,800,800,69,4,263,,358996,2516,,,,,,13148,11605,229,0,,,,,,10262,,0,673987,0,33352,,32489,,370601,2516,673987,0 +"2020-11-11","NJ",16476,14676,15,1800,38600,38600,1801,147,,334,4821298,40664,,,,,104,281243,263495,3733,0,,,,,,,,0,5102541,44397,,,,,,0,5084793,47506 +"2020-11-11","NM",1158,,14,,5356,5356,481,91,,,,0,,,,,,59034,,1487,0,,,,,,23981,,0,1317248,35297,,,,,,0,1317248,35297 +"2020-11-11","NV",1877,,18,,,,950,0,,233,745908,3678,,,,,107,113411,113411,1107,0,,,,,,,1362884,10138,1362884,10138,,,,,859319,4785,,0 +"2020-11-11","NY",26026,,21,,89995,89995,1628,0,,304,,0,,,,,135,540965,,4820,0,,,,,,,16068566,164300,16068566,164300,,,,,,0,,0 +"2020-11-11","OH",5623,5285,76,338,21290,21290,2880,253,4122,716,,0,,,,,328,267356,252510,5874,0,,7263,,,277044,191950,,0,5005241,46337,,183886,,,,0,5005241,46337 +"2020-11-11","OK",1470,,19,,9868,9868,1248,186,,340,1605803,12762,,,1605803,,,142334,,2177,0,5285,,,,151156,119144,,0,1748137,14939,91240,,,,,0,1759745,13104 +"2020-11-11","OR",737,,3,,3511,3511,337,48,,78,869307,5785,,,1528151,,25,51909,,754,0,,,,,79855,,,0,1608006,13463,,,,,918601,6515,1608006,13463 +"2020-11-11","PA",9145,,59,,,,2080,0,,417,2488761,17976,,,,,193,243368,229282,4711,0,,,,,,172791,4616587,48860,4616587,48860,,,,,2718043,22108,,0 +"2020-11-11","PR",901,693,12,208,,,556,0,,72,305972,0,,,395291,,58,39120,38799,264,0,34424,,,,20103,34032,,0,345092,264,,,,,,0,415664,0 +"2020-11-11","RI",1243,,6,,3656,3656,220,35,,25,431508,2429,,,1229792,,17,39776,,978,0,,,,,51353,,1281145,13870,1281145,13870,,,,,471284,3407,,0 +"2020-11-11","SC",4076,3809,14,267,11024,11024,780,58,,198,1811714,10940,73829,,1754669,,97,188995,178524,1257,0,9650,19332,,,235569,98621,,0,2000709,12197,83479,146367,,,,0,1990238,11949 +"2020-11-11","SD",567,,27,,3389,3389,543,112,,92,224424,1059,,,,,50,58696,55705,1362,0,,,,,61454,40668,,0,436042,4226,,,,,283120,2421,436042,4226 +"2020-11-11","TN",3761,3514,89,247,10895,10895,1904,82,,505,,0,,,3627092,,229,293381,274508,3632,0,,18425,,,328058,259438,,0,3955150,29690,,171628,,,,0,3955150,29690 +"2020-11-11","TX",19004,,141,,,,6779,0,,1879,,0,,,,,,1065065,985380,13166,0,51717,42308,,,1103208,831800,,0,9331358,110242,514912,512685,,,,0,9331358,110242 +"2020-11-11","UT",678,,6,,6395,6395,466,111,1277,182,1004293,6050,,,1392458,479,,139720,,2335,0,,9118,,8800,142522,97269,,0,1534980,12971,,119260,,54679,1135944,7666,1534980,12971 +"2020-11-11","VA",3741,3474,15,267,13273,13273,1265,90,,250,,0,,,,,106,196506,179686,1594,0,11696,12832,,,213917,,2841807,21148,2841807,21148,156626,209299,,,,0,,0 +"2020-11-11","VI",23,,0,,,,,0,,,24077,0,,,,,,1410,,0,0,,,,,,1357,,0,25487,0,,,,,25529,0,,0 +"2020-11-11","VT",59,59,0,,,,18,0,,6,192790,772,,,,,,2602,2549,89,0,,,,,,1947,,0,449806,2225,,,,,195339,854,449806,2225 +"2020-11-11","WA",2482,2482,22,,9092,9092,589,61,,107,,0,,,,,58,128209,125396,2713,0,,,,,,,2644425,16910,2644425,16910,,,,,,0,,0 +"2020-11-11","WI",2554,2457,72,97,13507,13507,2102,277,1617,441,1949868,10424,,,,,,301349,285891,7537,0,,,,,,219304,3679124,34257,3679124,34257,,,,,2235759,17472,,0 +"2020-11-11","WV",553,532,7,21,,,277,0,,85,,0,,,,,28,30201,26951,885,0,,,,,,21877,,0,869376,10851,19707,,,,,0,869376,10851 +"2020-11-11","WY",127,,0,,545,545,178,3,,,127239,91,,,314073,,,19374,16518,132,0,,,,,20728,11234,,0,334801,4903,,,,,143757,1298,334801,4903 +"2020-11-10","AK",92,92,8,,520,520,120,6,,,,0,,,803424,,10,19734,,538,0,,,,,24234,7161,,0,828140,60143,,,,,,0,828140,60143 +"2020-11-10","AL",3120,2890,36,230,21886,21886,1206,592,2128,,1231152,-1823,,,,1231,,206567,174987,1710,0,,,,,,84471,,0,1406139,-690,,,66544,,1406139,-690,,0 +"2020-11-10","AR",2112,1934,4,178,7579,7579,809,83,,310,1332008,7353,,,1332008,876,126,124235,112736,1424,0,,,,13296,,109235,,0,1444744,8328,,,,81751,,0,1444744,8328 +"2020-11-10","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-10","AZ",6192,5757,28,435,22428,22428,1289,217,,294,1642297,12091,,,,,148,263133,256317,3434,0,,,,,,,,0,3094865,36237,,,326290,,1898614,15407,3094865,36237 +"2020-11-10","CA",18001,,24,,,,3799,0,,984,,0,,,,,,977218,977218,5367,0,,,,,,,,0,20094641,176162,,,,,,0,20094641,176162 +"2020-11-10","CO",2427,2024,19,403,10263,10263,1270,213,,,1236359,11701,175251,,,,,138427,130668,3890,0,14272,,,,,,2306782,32354,2306782,32354,189523,,,,1367027,15532,,0 +"2020-11-10","CT",4707,3785,9,922,12257,12257,548,0,,,,0,,,2803130,,,82987,77708,1524,0,,1809,,,104513,,,0,2911126,46754,,27240,,,,0,2911126,46754 +"2020-11-10","DC",657,,2,,,,109,0,,27,,0,,,,,15,18173,,86,0,,,,,,13977,561833,3019,561833,3019,,,,,268838,1030,,0 +"2020-11-10","DE",722,635,3,87,,,127,0,,29,342019,1347,,,,,,27112,25898,204,0,,,,,28648,14276,599043,5244,599043,5244,,,,,369131,1551,,0 +"2020-11-10","FL",17460,,69,,51479,51479,3034,283,,,5593589,19829,531822,517552,8359722,,,840652,794860,4282,0,62323,,60854,,1085885,,10646926,46452,10646926,46452,594540,,578706,,6434241,24111,9493107,39288 +"2020-11-10","GA",8730,8264,53,466,32631,32631,1938,148,6138,,,0,,,,,,411652,376054,4319,0,31536,,,,351881,,,0,3772524,22630,339698,,,,,0,3772524,22630 +"2020-11-10","GU",91,,1,,,,77,0,,19,68205,724,,,,,12,5654,5552,181,0,7,102,,,,3667,,0,73859,905,210,818,,,,0,73039,852 +"2020-11-10","HI",221,221,0,,1147,1147,72,-14,,22,,0,,,,,4,16242,16010,63,0,,,,,15956,,570008,3014,570008,3014,,,,,,0,,0 +"2020-11-10","IA",1874,,25,,,,1135,0,,196,802535,1836,,65401,,,89,147656,147656,2734,0,,,4095,14124,,102981,,0,950191,4570,,,69536,98882,951985,4608,,0 +"2020-11-10","ID",698,646,12,52,2926,2926,288,37,585,72,346584,1041,,,,,,74227,63911,1266,0,,,,,,33032,,0,410495,2187,,17332,,,410495,2187,560939,5119 +"2020-11-10","IL",10645,10289,82,356,,,4742,0,,911,,0,,,,,399,511183,,12623,0,,,,,,,,0,8571019,101955,,,,,,0,8571019,101955 +"2020-11-10","IN",4731,4481,67,250,19023,19023,2336,285,3656,599,1618292,9772,,,,,183,219338,,4829,0,,,,,207297,,,0,3269653,30619,,,,,1837630,14601,3269653,30619 +"2020-11-10","KS",1181,,0,,4138,4138,500,0,1135,140,586429,0,,,,339,55,103553,,0,0,,,,,,,,0,689982,0,,,,,689982,0,,0 +"2020-11-10","KY",1590,1562,14,28,8403,8403,1189,129,2146,286,,0,,,,,,124646,103849,2079,0,,,,,,23165,,0,2105559,19684,87849,76184,,,,0,2105559,19684 +"2020-11-10","LA",6058,5829,10,229,,,684,0,,,2730221,25130,,,,,66,194702,189682,1330,0,,,,,,172210,,0,2924923,26460,,,,,,0,2919903,26460 +"2020-11-10","MA",10184,9957,21,227,13373,13373,618,0,,150,2757216,13697,,,,,68,174881,169976,2154,0,,,11842,,217992,131646,,0,6826328,58341,,,128053,207947,2927192,15744,6826328,58341 +"2020-11-10","MD",4233,4084,12,149,17914,17914,761,81,,176,1891138,8864,,136605,,,,156709,156709,1338,0,,,14048,,188516,8305,,0,3702658,24549,,,150653,,2047847,10202,3702658,24549 +"2020-11-10","ME",156,155,3,1,538,538,49,6,,14,,0,11908,,,,5,8060,7173,172,0,372,55,,,8476,6100,,0,690328,5832,12292,246,,,,0,690328,5832 +"2020-11-10","MI",8094,7724,86,370,,,2959,0,,595,,0,,,5182373,,257,245252,223277,6944,0,,,,,292796,128981,,0,5475169,61281,339921,,,,,0,5475169,61281 +"2020-11-10","MN",2698,2668,23,30,11933,11933,1224,262,2996,249,1844204,10137,,,,,,189681,188114,4893,0,,,,,,153347,3135996,32562,3135996,32562,,43876,,,2032318,14967,,0 +"2020-11-10","MO",3299,,146,,,,2055,0,,457,1382473,-12961,82166,,2396543,,237,216697,216697,4256,0,6124,9810,,,243790,,,0,2645421,-24034,88491,63465,84479,44376,1599170,-8705,2645421,-24034 +"2020-11-10","MP",2,2,0,,4,4,,0,,,16467,474,,,,,,100,100,0,0,,,,,,29,,0,16567,474,,,,,16567,482,23472,839 +"2020-11-10","MS",3480,3095,37,385,6914,6914,737,0,,199,873863,0,,,,,83,128138,109087,933,0,,,,,,111430,,0,1002001,933,47023,123242,,,,0,982396,0 +"2020-11-10","MT",462,,5,,1510,1510,487,18,,,,0,,,,,,41151,,1098,0,,,,,,23873,,0,544566,3653,,,,,,0,544566,3653 +"2020-11-10","NC",4660,4562,45,98,,,1230,0,,325,,0,,,,,,297442,283895,2582,0,,,,,,,,0,4369833,25730,,52915,,,,0,4369833,25730 +"2020-11-10","ND",649,,0,,1906,1906,383,0,345,48,255540,0,10350,,,,,56944,56247,947,0,734,,,,,43949,907372,0,907372,0,11084,1515,,,310998,0,952701,5330 +"2020-11-10","NE",710,,7,,3321,3321,820,32,,,548165,1997,,,948316,,,85551,,1582,0,,,,,99481,49314,,0,1049078,9380,,,,,634040,3581,1049078,9380 +"2020-11-10","NH",489,,0,,796,796,64,2,263,,356480,4369,,,,,,12919,11605,220,0,,,,,,10233,,0,673987,8200,33352,,32444,,368085,4541,673987,8200 +"2020-11-10","NJ",16461,14661,21,1800,38453,38453,1645,117,,327,4780634,0,,,,,98,277510,260430,4435,0,,,,,,,,0,5058144,4435,,,,,,0,5037287,0 +"2020-11-10","NM",1144,,14,,5265,5265,425,61,,,,0,,,,,,57547,,1258,0,,,,,,23736,,0,1281951,12428,,,,,,0,1281951,12428 +"2020-11-10","NV",1859,,7,,,,898,0,,231,742230,2271,,,,,101,112304,112304,1322,0,,,,,,,1352746,8438,1352746,8438,,,,,854534,3593,,0 +"2020-11-10","NY",26005,,32,,89995,89995,1548,0,,296,,0,,,,,128,536145,,3965,0,,,,,,,15904266,128036,15904266,128036,,,,,,0,,0 +"2020-11-10","OH",5547,5212,23,335,21037,21037,2747,386,4086,656,,0,,,,,327,261482,247260,6508,0,,6462,,,271395,189079,,0,4958904,41023,,168678,,,,0,4958904,41023 +"2020-11-10","OK",1451,,7,,9682,9682,1102,61,,334,1593041,21720,,,1593041,,,140157,,1702,0,5285,,,,150778,118074,,0,1733198,23422,91240,,,,,0,1746641,26571 +"2020-11-10","OR",734,,4,,3463,3463,318,85,,64,863522,4669,,,1515482,,26,51155,,707,0,,,,,79061,,,0,1594543,11315,,,,,912086,16972,1594543,11315 +"2020-11-10","PA",9086,,62,,,,1938,0,,393,2470785,14929,,,,,189,238657,225150,4361,0,,,,,,171833,4567727,47111,4567727,47111,,,,,2695935,18642,,0 +"2020-11-10","PR",889,682,7,207,,,538,0,,75,305972,0,,,395291,,52,38856,38681,275,0,34388,,,,20103,33368,,0,344828,275,,,,,,0,415664,0 +"2020-11-10","RI",1237,,4,,3621,3621,218,37,,26,429079,2057,,,1216964,,18,38798,,789,0,,,,,50311,,1267275,9636,1267275,9636,,,,,467877,2846,,0 +"2020-11-10","SC",4062,3795,21,267,10966,10966,784,82,,197,1800774,19940,73707,,1744162,,104,187738,177515,1347,0,9523,18900,,,234127,97765,,0,1988512,21287,83290,141266,,,,0,1978289,21082 +"2020-11-10","SD",540,,3,,3277,3277,607,50,,,223365,873,,,,,,57334,54503,1023,0,,,,,60187,40199,,0,431816,3125,,,,,280699,1896,431816,3125 +"2020-11-10","TN",3672,3440,62,232,10813,10813,1815,81,,502,,0,,,3600868,,223,289749,271405,1979,0,,17847,,,324592,256143,,0,3925460,15252,,169043,,,,0,3925460,15252 +"2020-11-10","TX",18863,,94,,,,6170,0,,1828,,0,,,,,,1051899,973970,12935,0,51519,41134,,,1090190,826116,,0,9221116,115851,513192,499322,,,,0,9221116,115851 +"2020-11-10","UT",672,,11,,6284,6284,453,122,1267,185,998243,7708,,,1381178,476,,137385,,2517,0,,8625,,8321,140831,95975,,0,1522009,16429,,114637,,52471,1128278,10460,1522009,16429 +"2020-11-10","VA",3726,3460,13,266,13183,13183,1174,67,,224,,0,,,,,88,194912,178432,1435,0,11677,12356,,,212446,,2820659,17809,2820659,17809,156431,201185,,,,0,,0 +"2020-11-10","VI",23,,0,,,,,0,,,24077,65,,,,,,1410,,5,0,,,,,,1357,,0,25487,70,,,,,25529,78,,0 +"2020-11-10","VT",59,59,0,,,,15,0,,4,192018,641,,,,,,2513,2467,52,0,,,,,,1936,,0,447581,1254,,,,,194485,688,447581,1254 +"2020-11-10","WA",2460,2460,21,,9031,9031,537,228,,110,,0,,,,,62,125496,122814,777,0,,,,,,,2627515,15317,2627515,15317,,,,,,0,,0 +"2020-11-10","WI",2482,2395,72,87,13230,13230,2070,291,1590,418,1939444,12926,,,,,,293812,278843,7432,0,,,,,,214469,3644867,47573,3644867,47573,,,,,2218287,19999,,0 +"2020-11-10","WV",546,525,16,21,,,280,0,,85,,0,,,,,29,29316,26311,511,0,,,,,,21499,,0,858525,6836,19612,,,,,0,858525,6836 +"2020-11-10","WY",127,,13,,542,542,178,22,,,127148,0,,,309852,,,19242,16442,1232,0,,,,,20046,11098,,0,329898,7086,,,,,142459,0,329898,7086 +"2020-11-09","AK",84,84,0,,514,514,119,5,,,,0,,,745182,,9,19196,,464,0,,,,,22430,7161,,0,767997,-12177,,,,,,0,767997,-12177 +"2020-11-09","AL",3084,2865,0,219,21294,21294,1174,0,2122,,1232975,3158,,,,1226,,204857,173854,1170,0,,,,,,84471,,0,1406829,4138,,,66370,,1406829,4138,,0 +"2020-11-09","AR",2108,1930,23,178,7496,7496,786,62,,289,1324655,7716,,,1324655,869,116,122811,111761,945,0,,,,12780,,108201,,0,1436416,8545,,,,77969,,0,1436416,8545 +"2020-11-09","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-09","AZ",6164,5745,0,419,22211,22211,1232,9,,292,1630206,10142,,,,,142,259699,253001,435,0,,,,,,,,0,3058628,14835,,,325589,,1883207,10547,3058628,14835 +"2020-11-09","CA",17977,,14,,,,3668,0,,941,,0,,,,,,971851,971851,7212,0,,,,,,,,0,19918479,193851,,,,,,0,19918479,193851 +"2020-11-09","CO",2408,2007,14,401,10050,10050,1174,33,,,1224658,13686,174883,,,,,134537,126837,3553,0,14228,,,,,,2274428,29043,2274428,29043,189111,,,,1351495,17172,,0 +"2020-11-09","CT",4698,3779,27,919,12257,12257,496,0,,,,0,,,2759057,,,81463,76256,3338,0,,1809,,,101915,,,0,2864372,13056,,27240,,,,0,2864372,13056 +"2020-11-09","DC",655,,1,,,,104,0,,29,,0,,,,,17,18087,,86,0,,,,,,13919,558814,3365,558814,3365,,,,,267808,964,,0 +"2020-11-09","DE",719,632,1,87,,,119,0,,27,340672,1996,,,,,,26908,25697,305,0,,,,,28417,14158,593799,6237,593799,6237,,,,,367580,2301,,0 +"2020-11-09","FL",17391,,58,,51196,51196,2902,103,,,5573760,16454,531822,517552,8325942,,,836370,791595,3845,0,62323,,60854,,1080510,,10600474,44970,10600474,44970,594540,,578706,,6410130,20299,9453819,40593 +"2020-11-09","GA",8677,8223,29,454,32483,32483,1916,15,6097,,,0,,,,,,407333,374181,1272,0,31406,,,,350067,,,0,3749894,15934,339014,,,,,0,3749894,15934 +"2020-11-09","GU",90,,1,,,,75,0,,18,67481,718,,,,,13,5473,5375,240,0,7,98,,,,3654,,0,72954,958,209,765,,,,0,72187,1784 +"2020-11-09","HI",221,221,1,,1161,1161,75,4,,13,,0,,,,,8,16179,15947,128,0,,,,,15885,,566994,4724,566994,4724,,,,,,0,,0 +"2020-11-09","IA",1849,,7,,,,1034,0,,184,800699,5401,,65201,,,82,144922,144922,4381,0,,,4059,12965,,101158,,0,945621,9782,,,69300,95944,947377,9834,,0 +"2020-11-09","ID",686,636,3,50,2889,2889,320,19,580,90,345543,2134,,,,,,72961,62765,649,0,,,,,,32702,,0,408308,2739,,17332,,,408308,2739,555820,3961 +"2020-11-09","IL",10563,10210,25,353,,,4409,0,,857,,0,,,,,376,498560,,10573,0,,,,,,,,0,8469064,64760,,,,,,0,8469064,64760 +"2020-11-09","IN",4664,4418,35,246,18738,18738,2174,233,3623,547,1608520,8954,,,,,180,214509,,4135,0,,,,,203042,,,0,3239034,28368,,,,,1823029,13089,3239034,28368 +"2020-11-09","KS",1181,,15,,4138,4138,500,71,1135,140,586429,7742,,,,339,55,103553,,5920,0,,,,,,,,0,689982,13662,,,,,689982,13662,,0 +"2020-11-09","KY",1576,1549,11,27,8274,8274,1133,430,2113,300,,0,,,,,,122567,102373,1729,0,,,,,,22942,,0,2085875,38911,87690,74520,,,,0,2085875,38911 +"2020-11-09","LA",6048,5819,12,229,,,652,0,,,2705091,5115,,,,,71,193372,188352,391,0,,,,,,172210,,0,2898463,5506,,,,,,0,2893443,5506 +"2020-11-09","MA",10163,9936,14,227,13373,13373,588,0,,143,2743519,12998,,,,,66,172727,167929,1328,0,,,11842,,215662,131646,,0,6767987,47461,,,128053,205541,2911448,14182,6767987,47461 +"2020-11-09","MD",4221,4072,9,149,17833,17833,707,103,,168,1882274,9978,,136605,,,,155371,155371,1375,0,,,14048,,187035,8297,,0,3678109,23650,,,150653,,2037645,11353,3678109,23650 +"2020-11-09","ME",153,152,1,1,532,532,49,7,,14,,0,11890,,,,5,7888,7030,195,0,370,54,,,8302,6036,,0,684496,4132,12272,139,,,,0,684496,4132 +"2020-11-09","MI",8008,7640,63,368,,,2815,0,,544,,0,,,5130002,,239,238308,216804,9305,0,,,,,283886,128981,,0,5413888,87225,339100,,,,,0,5413888,87225 +"2020-11-09","MN",2675,2645,19,30,11671,11671,1084,144,2948,224,1834067,10347,,,,,,184788,183284,3926,0,,,,,,149766,3103434,25468,3103434,25468,,43836,,,2017351,14106,,0 +"2020-11-09","MO",3153,,0,,,,2016,0,,467,1395434,5016,83781,,2425114,,238,212441,212441,3244,0,6079,9542,,,239290,,,0,2669455,14764,90061,64258,85902,44787,1607875,8260,2669455,14764 +"2020-11-09","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,100,100,2,0,,,,,,29,,0,16093,2,,,,,16085,0,22633,0 +"2020-11-09","MS",3443,3072,0,371,6914,6914,718,186,,190,873863,36655,,,,,76,127205,108533,516,0,,,,,,111430,,0,1001068,37171,47023,123242,,,,0,982396,39818 +"2020-11-09","MT",457,,1,,1492,1492,470,15,,,,0,,,,,,40053,,374,0,,,,,,23825,,0,540913,14322,,,,,,0,540913,14322 +"2020-11-09","NC",4615,4521,8,94,,,1169,0,,323,,0,,,,,,294860,281679,1521,0,,,,,,,,0,4344103,33738,,51349,,,,0,4344103,33738 +"2020-11-09","ND",649,,5,,1906,1906,383,25,345,48,255540,347,10350,,,,,55997,55359,1153,0,734,,,,,43949,907372,6924,907372,6924,11084,1396,,,310998,1500,947371,7482 +"2020-11-09","NE",703,,0,,3289,3289,794,9,,,546168,2276,,,940672,,,83969,,1574,0,,,,,97746,48689,,0,1039698,7423,,,,,630459,3853,1039698,7423 +"2020-11-09","NH",489,,0,,794,794,56,0,262,,352111,561,,,,,,12699,11433,211,0,,,,,,10153,,0,665787,2707,33302,,32406,,363544,716,665787,2707 +"2020-11-09","NJ",16440,14640,11,1800,38336,38336,1537,36,,309,4780634,69586,,,,,94,273075,256653,2553,0,,,,,,,,0,5053709,72139,,,,,,0,5037287,73657 +"2020-11-09","NM",1130,,12,,5204,5204,423,82,,,,0,,,,,,56289,,1408,0,,,,,,23457,,0,1269523,7041,,,,,,0,1269523,7041 +"2020-11-09","NV",1852,,1,,,,891,0,,254,739959,3733,,,,,100,110982,110982,960,0,,,,,,,1344308,8676,1344308,8676,,,,,850941,4693,,0 +"2020-11-09","NY",25973,,26,,89995,89995,1444,0,,282,,0,,,,,125,532180,,3144,0,,,,,,,15776230,111416,15776230,111416,,,,,,0,,0 +"2020-11-09","OH",5524,5193,7,331,20651,20651,2533,154,4047,628,,0,,,,,312,254974,241095,4706,0,,6060,,,266950,186254,,0,4917881,52699,,164945,,,,0,4917881,52699 +"2020-11-09","OK",1444,,6,,9621,9621,1045,51,,312,1571321,0,,,1571321,,,138455,,2197,0,5285,,,,145687,116882,,0,1709776,2197,91240,,,,,0,1720070,0 +"2020-11-09","OR",730,,1,,3378,3378,266,0,,62,858853,5341,,,1504943,,27,50448,,861,0,,,,,78285,,,0,1583228,15426,,,,,895114,0,1583228,15426 +"2020-11-09","PA",9024,,4,,,,1827,0,,353,2455856,14221,,,,,179,234296,221437,3402,0,,,,,,171036,4520616,38858,4520616,38858,,,,,2677293,17216,,0 +"2020-11-09","PR",882,675,10,207,,,544,0,,70,305972,0,,,395291,,59,38581,38474,481,0,34279,,,,20103,33354,,0,344553,481,,,,,,0,415664,0 +"2020-11-09","RI",1233,,1,,3584,3584,212,0,,27,427022,1181,,,1208143,,17,38009,,266,0,,,,,49496,,1257639,3975,1257639,3975,,,,,465031,1447,,0 +"2020-11-09","SC",4041,3778,5,263,10884,10884,746,30,,194,1780834,7420,73458,,1725001,,101,186391,176373,703,0,9523,18544,,,232206,96909,,0,1967225,8123,82981,136772,,,,0,1957207,8063 +"2020-11-09","SD",537,,1,,3227,3227,566,43,,,222492,861,,,,,,56311,53486,907,0,,,,,59408,39508,,0,428691,4495,,,,,278803,1768,428691,4495 +"2020-11-09","TN",3610,3388,15,222,10732,10732,1705,54,,492,,0,,,3587508,,221,287770,269747,5919,0,,17479,,,322700,252515,,0,3910208,54580,,167719,,,,0,3910208,54580 +"2020-11-09","TX",18769,,26,,,,6103,0,,1816,,0,,,,,,1038964,963019,4849,0,51213,39598,,,1075300,820156,,0,9105265,34656,511176,483220,,,,0,9105265,34656 +"2020-11-09","UT",661,,2,,6162,6162,460,78,1240,185,990535,6424,,,1367630,473,,134868,,2247,0,,8074,,7792,137950,94929,,0,1505580,12787,,110249,,50105,1117818,8412,1505580,12787 +"2020-11-09","VA",3713,3447,6,266,13116,13116,1127,52,,214,,0,,,,,98,193477,177240,1302,0,11654,11777,,,211092,,2802850,15744,2802850,15744,156286,193316,,,,0,,0 +"2020-11-09","VI",23,,0,,,,,0,,,24012,0,,,,,,1405,,0,0,,,,,,1345,,0,25417,0,,,,,25451,0,,0 +"2020-11-09","VT",59,59,0,,,,11,0,,4,191377,409,,,,,,2461,2420,25,0,,,,,,1931,,0,446327,7499,,,,,193797,432,446327,7499 +"2020-11-09","WA",2439,2439,0,,8803,8803,526,8,,105,,0,,,,,55,124719,122047,1407,0,,,,,,,2612198,19432,2612198,19432,,,,,,0,,0 +"2020-11-09","WI",2410,2329,18,81,12939,12939,2003,100,1575,396,1926518,9717,,,,,,286380,271770,4470,0,,,,,,210318,3597294,32557,3597294,32557,,,,,2198288,14077,,0 +"2020-11-09","WV",530,513,28,17,,,290,0,,85,,0,,,,,30,28805,26010,401,0,,,,,,21301,,0,851689,7447,19526,,,,,0,851689,7447 +"2020-11-09","WY",114,,0,,520,520,172,15,,,127148,3379,,,303632,,,18010,15311,700,0,,,,,19180,10699,,0,322812,7958,,,,,142459,4819,322812,7958 +"2020-11-08","AK",84,84,0,,509,509,119,10,,,,0,,,760511,,7,18732,,511,0,,,,,19277,7161,,0,780174,-520,,,,,,0,780174,-520 +"2020-11-08","AL",3084,2865,2,219,21294,21294,1060,0,2121,,1229817,5222,,,,1225,,203687,172874,1205,0,,,,,,84471,,0,1402691,6323,,,66292,,1402691,6323,,0 +"2020-11-08","AR",2085,1907,17,178,7434,7434,633,19,,235,1316939,8462,,,1316939,866,105,121866,110932,1038,0,,,,12597,,107287,,0,1427871,9378,,,,76925,,0,1427871,9378 +"2020-11-08","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-08","AZ",6164,5745,17,419,22202,22202,1185,32,,272,1620064,12023,,,,,148,259264,252596,1880,0,,,,,,,,0,3043793,19277,,,325006,,1872660,13825,3043793,19277 +"2020-11-08","CA",17963,,24,,,,3554,0,,910,,0,,,,,,964639,964639,7682,0,,,,,,,,0,19724628,159477,,,,,,0,19724628,159477 +"2020-11-08","CO",2394,1994,5,400,10017,10017,1134,20,,,1210972,10965,174720,,,,,130984,123351,3017,0,14201,,,,,,2245385,30597,2245385,30597,188921,,,,1334323,13934,,0 +"2020-11-08","CT",4671,3757,0,914,12257,12257,402,0,,,,0,,,2747047,,,78125,73206,0,0,,1722,,,100884,,,0,2851316,15214,,26855,,,,0,2851316,15214 +"2020-11-08","DC",654,,0,,,,77,0,,25,,0,,,,,14,18001,,110,0,,,,,,13843,555449,4864,555449,4864,,,,,266844,1372,,0 +"2020-11-08","DE",718,631,2,87,,,116,0,,24,338676,2003,,,,,,26603,25395,345,0,,,,,28087,14019,587562,5281,587562,5281,,,,,365279,2348,,0 +"2020-11-08","FL",17333,,22,,51093,51093,2779,64,,,5557306,38183,531822,517552,8290544,,,832525,788267,6619,0,62323,,60854,,1075420,,10555504,101854,10555504,101854,594540,,578706,,6389831,44802,9413226,80436 +"2020-11-08","GA",8648,8194,1,454,32468,32468,1846,33,6095,,,0,,,,,,406061,373078,1439,0,31257,,,,348836,,,0,3733960,18690,338346,,,,,0,3733960,18690 +"2020-11-08","GU",89,,0,,,,73,0,,19,66763,369,,,,,10,5233,5154,120,0,7,79,,,,3402,,0,71996,489,209,699,,,,0,70403,0 +"2020-11-08","HI",220,220,1,,1157,1157,75,10,,13,,0,,,,,8,16051,15819,128,0,,,,,15768,,562270,6174,562270,6174,,,,,,0,,0 +"2020-11-08","IA",1842,,13,,,,992,0,,190,795298,4267,,65130,,,77,140541,140541,3313,0,,,4027,12260,,100747,,0,935839,7580,,,69197,93929,937543,7586,,0 +"2020-11-08","ID",683,633,4,50,2870,2870,320,45,576,90,343409,1431,,,,,,72312,62160,1403,0,,,,,,32330,,0,405569,2481,,17332,,,405569,2481,551859,3930 +"2020-11-08","IL",10538,10196,50,342,,,4303,0,,833,,0,,,,,368,487987,,10009,0,,,,,,,,0,8404304,90757,,,,,,0,8404304,90757 +"2020-11-08","IN",4629,4383,37,246,18505,18505,2070,232,3566,524,1599566,10890,,,,,173,210374,,4652,0,,,,,199666,,,0,3210666,43148,,,,,1809940,15542,3210666,43148 +"2020-11-08","KS",1166,,0,,4067,4067,693,0,1122,183,578687,0,,,,337,62,97633,,0,0,,,,,,,,0,676320,0,,,,,676320,0,,0 +"2020-11-08","KY",1565,1538,4,27,7844,7844,1153,0,1989,299,,0,,,,,,120838,100791,1177,0,,,,,,21513,,0,2046964,0,87413,72974,,,,0,2046964,0 +"2020-11-08","LA",6036,5807,20,229,,,622,0,,,2699976,25215,,,,,72,192981,187961,1266,0,,,,,,172210,,0,2892957,26481,,,,,,0,2887937,26481 +"2020-11-08","MA",10149,9923,20,226,13373,13373,568,0,,144,2730521,18330,,,,,62,171399,166745,1823,0,,,11842,,214280,131646,,0,6720526,80572,,,128053,203073,2897266,20139,6720526,80572 +"2020-11-08","MD",4212,4063,11,149,17730,17730,655,103,,163,1872296,9897,,136605,,,,153996,153996,1081,0,,,14048,,185455,8291,,0,3654459,30266,,,150653,,2026292,10978,3654459,30266 +"2020-11-08","ME",152,151,0,1,525,525,48,2,,13,,0,11868,,,,7,7693,6843,90,0,367,33,,,8192,5935,,0,680364,8010,12247,118,,,,0,680364,8010 +"2020-11-08","MI",7945,7578,0,367,,,2425,0,,484,,0,,,4984958,,202,229003,207794,0,0,,,,,266355,128981,,0,5326663,0,338299,,,,,0,5326663,0 +"2020-11-08","MN",2656,2626,31,30,11527,11527,1038,133,2923,224,1823720,15231,,,,,,180862,179525,5908,0,,,,,,146311,3077966,42572,3077966,42572,,43029,,,2003245,21079,,0 +"2020-11-08","MO",3153,,3,,,,1965,0,,459,1390418,17073,83660,,2413773,,254,209197,209197,4131,0,6027,9377,,,235909,,,0,2654691,-17597,89888,63687,85747,44355,1599615,21204,2654691,-17597 +"2020-11-08","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,98,98,0,0,,,,,,29,,0,16091,0,,,,,16085,0,22633,0 +"2020-11-08","MS",3443,3072,10,371,6728,6728,716,0,,183,837208,0,,,,,87,126689,108217,804,0,,,,,,105839,,0,963897,804,45873,106901,,,,0,942578,0 +"2020-11-08","MT",456,,11,,1477,1477,458,12,,,,0,,,,,,39679,,731,0,,,,,,23793,,0,526591,1415,,,,,,0,526591,1415 +"2020-11-08","NC",4607,4513,2,94,,,1147,0,,311,,0,,,,,,293339,280213,2094,0,,,,,,,,0,4310365,38228,,48655,,,,0,4310365,38228 +"2020-11-08","ND",644,,11,,1881,1881,408,23,343,51,255193,426,10318,,,,,54844,54212,1117,0,719,,,,,43103,900448,6064,900448,6064,11037,1364,,,309498,1527,939889,6491 +"2020-11-08","NE",703,,2,,3280,3280,760,34,,,543892,3053,,,935011,,,82395,,1702,0,,,,,95992,47793,,0,1032275,10429,,,,,626606,4754,1032275,10429 +"2020-11-08","NH",489,,0,,794,794,55,3,262,,351550,997,,,,,,12488,11278,247,0,,,,,,10096,,0,663080,5485,33302,,32402,,362828,1122,663080,5485 +"2020-11-08","NJ",16429,14629,4,1800,38300,38300,1439,50,,284,4711048,0,,,,,89,270522,254595,2494,0,,,,,,,,0,4981570,2494,,,,,,0,4963630,0 +"2020-11-08","NM",1118,,14,,5122,5122,437,31,,,,0,,,,,,54881,,1210,0,,,,,,23205,,0,1262482,11758,,,,,,0,1262482,11758 +"2020-11-08","NV",1851,,1,,,,826,0,,206,736226,2968,,,,,89,110022,110022,1276,0,,,,,,,1335632,9254,1335632,9254,,,,,846248,4244,,0 +"2020-11-08","NY",25947,,19,,89995,89995,1396,0,,295,,0,,,,,131,529036,,3428,0,,,,,,,15664814,145642,15664814,145642,,,,,,0,,0 +"2020-11-08","OH",5517,5186,11,331,20497,20497,2286,102,4013,584,,0,,,,,295,250268,236529,4541,0,,5761,,,261682,184556,,0,4865182,62084,,161704,,,,0,4865182,62084 +"2020-11-08","OK",1438,,9,,9570,9570,1045,132,,312,1571321,0,,,1571321,,,136258,,4507,0,5285,,,,145687,115030,,0,1707579,4507,91240,,,,,0,1720070,0 +"2020-11-08","OR",729,,13,,3378,3378,266,0,,62,853512,4518,,,1490609,,27,49587,,979,0,,,,,77193,,,0,1567802,15412,,,,,895114,0,1567802,15412 +"2020-11-08","PA",9020,,5,,,,1735,0,,345,2441635,15514,,,,,167,230894,218442,2909,0,,,,,,168708,4481758,40956,4481758,40956,,,,,2660077,18219,,0 +"2020-11-08","PR",872,669,10,203,,,518,0,,65,305972,0,,,395291,,52,38100,37999,533,0,34066,,,,20103,33315,,0,344072,533,,,,,,0,415664,0 +"2020-11-08","RI",1232,,1,,3584,3584,212,26,,27,425841,2501,,,1204472,,17,37743,,568,0,,,,,49192,,1253664,13840,1253664,13840,,,,,463584,3069,,0 +"2020-11-08","SC",4036,3776,21,260,10854,10854,718,20,,184,1773414,13228,73421,,1717658,,89,185688,175730,946,0,9518,18494,,,231486,96422,,0,1959102,14174,82939,136308,,,,0,1949144,14096 +"2020-11-08","SD",536,,13,,3184,3184,546,76,,,221631,924,,,,,,55404,52603,1428,0,,,,,58341,39118,,0,424196,4323,,,,,277035,2352,424196,4323 +"2020-11-08","TN",3595,3375,5,220,10678,10678,1656,33,,473,,0,,,3538903,,204,281851,264340,3636,0,,16922,,,316725,250818,,0,3855628,36024,,157394,,,,0,3855628,36024 +"2020-11-08","TX",18743,,43,,,,6080,0,,1786,,0,,,,,,1034115,956234,6878,0,50934,38943,,,1069577,820215,,0,9070609,51708,509011,479209,,,,0,9070609,51708 +"2020-11-08","UT",659,,1,,6084,6084,437,64,1237,170,984111,6352,,,1356934,472,,132621,,2386,0,,7823,,7548,135859,93763,,0,1492793,12256,,109262,,49411,1109406,8435,1492793,12256 +"2020-11-08","VA",3707,3441,3,266,13064,13064,1090,42,,202,,0,,,,,90,192175,176219,1302,0,11627,11541,,,210094,,2787106,20753,2787106,20753,156041,191824,,,,0,,0 +"2020-11-08","VI",23,,0,,,,,0,,,24012,284,,,,,,1405,,15,0,,,,,,1345,,0,25417,299,,,,,25451,298,,0 +"2020-11-08","VT",59,59,0,,,,6,0,,0,190968,828,,,,,,2436,2397,54,0,,,,,,1923,,0,438828,4487,,,,,193365,874,438828,4487 +"2020-11-08","WA",2439,2439,0,,8795,8795,504,4,,103,,0,,,,,45,123312,120682,1931,0,,,,,,,2592766,24509,2592766,24509,,,,,,0,,0 +"2020-11-08","WI",2392,2312,11,80,12839,12839,1860,112,1572,397,1916801,8481,,,,,,281910,267410,4407,0,,,,,,206944,3564737,24662,3564737,24662,,,,,2184211,12761,,0 +"2020-11-08","WV",502,490,0,12,,,288,0,,79,,0,,,,,26,28404,25715,662,0,,,,,,21032,,0,844242,11586,19508,,,,,0,844242,11586 +"2020-11-08","WY",114,,9,,505,505,148,0,,,123769,0,,,296703,,,17310,14691,713,0,,,,,18151,10315,,0,314854,1004,,,,,137640,0,314854,1004 +"2020-11-07","AK",84,84,0,,499,499,105,8,,,,0,,,760934,,8,18221,,603,0,,,,,19376,7157,,0,780694,-607,,,,,,0,780694,-607 +"2020-11-07","AL",3082,2864,33,218,21294,21294,1015,0,2121,,1224595,7593,,,,1225,,202482,171773,1768,0,,,,,,84471,,0,1396368,8920,,,66104,,1396368,8920,,0 +"2020-11-07","AR",2068,1890,12,178,7415,7415,633,14,,235,1308477,10213,,,1308477,865,105,120828,110016,1598,0,,,,12392,,106594,,0,1418493,11491,,,,76277,,0,1418493,11491 +"2020-11-07","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-07","AZ",6147,5730,38,417,22170,22170,1139,152,,249,1608041,14060,,,,,137,257384,250794,2620,0,,,,,,,,0,3024516,31744,,,324293,,1858835,16524,3024516,31744 +"2020-11-07","CA",17939,,73,,,,3456,0,,901,,0,,,,,,956957,956957,5863,0,,,,,,,,0,19565151,168802,,,,,,0,19565151,168802 +"2020-11-07","CO",2389,1990,13,399,9997,9997,1087,86,,,1200007,13630,174305,,,,,127967,120382,3498,0,14110,,,,,,2214788,37697,2214788,37697,188415,,,,1320389,17044,,0 +"2020-11-07","CT",4671,3757,0,914,12257,12257,402,0,,,,0,,,2733123,,,78125,73206,0,0,,1722,,,99613,,,0,2836102,35667,,26855,,,,0,2836102,35667 +"2020-11-07","DC",654,,2,,,,77,0,,25,,0,,,,,14,17891,,99,0,,,,,,13811,550585,4262,550585,4262,,,,,265472,1017,,0 +"2020-11-07","DE",716,629,0,87,,,115,0,,26,336673,1827,,,,,,26258,25057,223,0,,,,,27896,13888,582281,5159,582281,5159,,,,,362931,2050,,0 +"2020-11-07","FL",17311,,87,,51029,51029,2672,161,,,5519123,14673,531822,517552,8218897,,,825906,782903,4380,0,62323,,60854,,1066849,,10453650,48304,10453650,48304,594540,,578706,,6345029,19053,9332790,44755 +"2020-11-07","GA",8647,8193,39,454,32435,32435,1859,118,6091,,,0,,,,,,404622,371825,2195,0,31027,,,,347574,,,0,3715270,23537,337230,,,,,0,3715270,23537 +"2020-11-07","GU",89,,1,,,,82,0,,19,66394,367,,,,,10,5113,5034,36,0,7,79,,,,3403,,0,71507,403,209,699,,,,0,70403,0 +"2020-11-07","HI",219,219,0,,1147,1147,69,9,,13,,0,,,,,9,15923,15691,138,0,,,,,15635,,556096,4293,556096,4293,,,,,,0,,0 +"2020-11-07","IA",1829,,11,,,,901,0,,194,791031,2524,,64890,,,72,137228,137228,3718,0,,,4017,12045,,100359,,0,928259,6242,,,68947,93647,929957,6252,,0 +"2020-11-07","ID",679,630,8,49,2825,2825,320,37,574,90,341978,3322,,,,,,70909,61110,1330,0,,,,,,31969,,0,403088,4367,,17332,,,403088,4367,547929,4607 +"2020-11-07","IL",10488,10154,91,334,,,4250,0,,813,,0,,,,,367,477978,,12438,0,,,,,,,,0,8313547,98418,,,,,,0,8313547,98418 +"2020-11-07","IN",4592,4348,45,244,18273,18273,2036,268,3527,559,1588676,12394,,,,,195,205722,,4899,0,,,,,195456,,,0,3167518,50449,,,,,1794398,17293,3167518,50449 +"2020-11-07","KS",1166,,0,,4067,4067,693,0,1122,183,578687,0,,,,337,62,97633,,0,0,,,,,,,,0,676320,0,,,,,676320,0,,0 +"2020-11-07","KY",1561,1534,17,27,7844,7844,1153,136,1989,299,,0,,,,,,119661,99815,2156,0,,,,,,21513,,0,2046964,-130545,87413,72974,,,,0,2046964,-130545 +"2020-11-07","LA",6016,5787,0,229,,,644,0,,,2674761,0,,,,,81,191715,186695,0,0,,,,,,172210,,0,2866476,0,,,,,,0,2861456,0 +"2020-11-07","MA",10129,9903,23,226,13373,13373,535,0,,127,2712191,21606,,,,,60,169576,164936,2302,0,,,11842,,212158,131646,,0,6639954,92286,,,128053,202372,2877127,23806,6639954,92286 +"2020-11-07","MD",4201,4052,7,149,17627,17627,632,90,,153,1862399,10734,,136605,,,,152915,152915,1410,0,,,14048,,184180,8284,,0,3624193,36496,,,150653,,2015314,12144,3624193,36496 +"2020-11-07","ME",152,151,2,1,523,523,42,10,,14,,0,11868,,,,4,7603,6762,159,0,367,33,,,7983,5906,,0,672354,10002,12247,116,,,,0,672354,10002 +"2020-11-07","MI",7945,7578,65,367,,,2425,0,,484,,0,,,4984958,,202,229003,207794,6494,0,,,,,266355,128981,,0,5326663,75350,338299,,,,,0,5326663,75350 +"2020-11-07","MN",2625,2597,34,28,11394,11394,1038,201,2889,224,1808489,14947,,,,,,174954,173677,4647,0,,,,,,142800,3035394,44429,3035394,44429,,40019,,,1982166,19394,,0 +"2020-11-07","MO",3150,,19,,,,1926,0,,466,1373345,6621,83302,,2435560,,236,205066,205066,4559,0,5943,9150,,,231727,,,0,2672288,23011,89459,56012,85229,38219,1578411,11180,2672288,23011 +"2020-11-07","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,98,98,0,0,,,,,,29,,0,16091,0,,,,,16085,0,22633,0 +"2020-11-07","MS",3433,3070,14,363,6728,6728,710,0,,177,837208,0,,,,,74,125885,107926,1031,0,,,,,,105839,,0,963093,1031,45873,106901,,,,0,942578,0 +"2020-11-07","MT",445,,26,,1465,1465,446,18,,,,0,,,,,,38948,,1001,0,,,,,,23825,,0,525176,1580,,,,,,0,525176,1580 +"2020-11-07","NC",4605,4511,23,94,,,1196,0,,327,,0,,,,,,291245,278200,2676,0,,,,,,,,0,4272137,41946,,47403,,,,0,4272137,41946 +"2020-11-07","ND",633,,15,,1858,1858,374,41,341,46,254767,704,10318,,,,,53727,53105,1646,0,719,,,,,42251,894384,9652,894384,9652,11037,1351,,,307971,2306,933398,10311 +"2020-11-07","NE",701,,27,,3246,3246,748,45,,,540839,4808,,,926419,,,80693,,2681,0,,,,,94166,47259,,0,1021846,21621,,,,,621852,7490,1021846,21621 +"2020-11-07","NH",489,,1,,791,791,49,1,260,,350553,2827,,,,,,12241,11153,229,0,,,,,,9980,,0,657595,6551,33285,,32389,,361706,2976,657595,6551 +"2020-11-07","NJ",16425,14625,9,1800,38250,38250,1392,72,,276,4711048,96992,,,,,76,268028,252582,3800,0,,,,,,,,0,4979076,100792,,,,,,0,4963630,100194 +"2020-11-07","NM",1104,,16,,5091,5091,441,71,,,,0,,,,,,53671,,1277,0,,,,,,23088,,0,1250724,12149,,,,,,0,1250724,12149 +"2020-11-07","NV",1850,,5,,,,826,0,,206,733258,4766,,,,,89,108746,108746,1824,0,,,,,,,1326378,13886,1326378,13886,,,,,842004,6590,,0 +"2020-11-07","NY",25928,,18,,89995,89995,1381,0,,308,,0,,,,,138,525608,,3587,0,,,,,,,15519172,163291,15519172,163291,,,,,,0,,0 +"2020-11-07","OH",5506,5177,12,329,20395,20395,2188,149,4005,575,,0,,,,,283,245727,232171,5549,0,,5233,,,255641,182878,,0,4803098,58695,,148543,,,,0,4803098,58695 +"2020-11-07","OK",1429,,0,,9438,9438,1045,0,,312,1571321,13471,,,1571321,,,131751,,0,0,5285,,,,145687,113227,,0,1703072,13471,91240,,,,,0,1720070,15003 +"2020-11-07","OR",716,,6,,3378,3378,266,44,,62,848994,7806,,,1476185,,27,48608,,769,0,,,,,76205,,,0,1552390,18903,,,,,895114,8546,1552390,18903 +"2020-11-07","PA",9015,,40,,,,1687,0,,345,2426121,17755,,,,,157,227985,215737,4035,0,,,,,,168708,4440802,53169,4440802,53169,,,,,2641858,21234,,0 +"2020-11-07","PR",862,659,0,203,,,526,0,,69,305972,0,,,395291,,49,37567,37490,663,0,33965,,,,20103,32475,,0,343539,663,,,,,,0,415664,0 +"2020-11-07","RI",1231,,7,,3558,3558,210,70,,25,423340,6073,,,1191236,,16,37175,,795,0,,,,,48588,,1239824,21908,1239824,21908,,,,,460515,6868,,0 +"2020-11-07","SC",4015,3756,10,259,10834,10834,740,58,,180,1760186,45961,73044,,1704603,,89,184742,174862,1870,0,9425,18430,,,230445,95754,,0,1944928,47831,82469,135415,,,,0,1935048,47637 +"2020-11-07","SD",523,,13,,3108,3108,515,85,,,220707,1156,,,,,,53976,51343,1337,0,,,,,57150,38403,,0,419873,5818,,,,,274683,2493,419873,5818 +"2020-11-07","TN",3590,3370,49,220,10645,10645,1687,27,,489,,0,,,3506349,,211,278215,261202,5071,0,,16374,,,313255,249162,,0,3819604,44496,,146975,,,,0,3819604,44496 +"2020-11-07","TX",18700,,111,,,,6068,0,,1759,,0,,,,,,1027237,950549,9560,0,50556,38269,,,1061549,811330,,0,9018901,91063,506808,474486,,,,0,9018901,91063 +"2020-11-07","UT",658,,9,,6020,6020,420,98,1232,175,977759,8410,,,1346870,471,,130235,,2956,0,,7574,,7301,133667,92656,,0,1480537,16981,,107849,,48535,1100971,10976,1480537,16981 +"2020-11-07","VA",3704,3439,22,265,13022,13022,1062,86,,215,,0,,,,,91,190873,175187,2103,0,11575,11320,,,208746,,2766353,23124,2766353,23124,155695,190186,,,,0,,0 +"2020-11-07","VI",23,,0,,,,,0,,,23728,0,,,,,,1390,,0,0,,,,,,1340,,0,25118,0,,,,,25153,0,,0 +"2020-11-07","VT",59,59,1,,,,4,0,,0,190140,766,,,,,,2382,2351,28,0,,,,,,1913,,0,434341,5490,,,,,192491,790,434341,5490 +"2020-11-07","WA",2439,2439,8,,8791,8791,510,7,,133,,0,,,,,61,121381,118811,2124,0,,,,,,,2568257,27183,2568257,27183,,,,,,0,,0 +"2020-11-07","WI",2381,2301,48,80,12727,12727,1806,173,1570,373,1908320,11863,,,,,,277503,263130,7521,0,,,,,,202879,3540075,43054,3540075,43054,,,,,2171450,18928,,0 +"2020-11-07","WV",502,491,15,11,,,287,0,,89,,0,,,,,24,27742,25178,655,0,,,,,,20786,,0,832656,10558,19455,,,,,0,832656,10558 +"2020-11-07","WY",105,,0,,505,505,147,6,,,123769,0,,,295907,,,16597,14045,192,0,,,,,17943,10142,,0,313850,1081,,,,,137640,0,313850,1081 +"2020-11-06","AK",84,84,0,,491,491,106,9,,,,0,,,761522,,7,17618,,507,0,,,,,19404,7122,,0,781301,-525,,,,,,0,781301,-525 +"2020-11-06","AL",3049,2839,23,210,21294,21294,1022,267,2110,,1217002,7161,,,,1220,,200714,170446,1556,0,,,,,,84471,,0,1387448,8341,,,65871,,1387448,8341,,0 +"2020-11-06","AR",2056,1878,19,178,7401,7401,633,75,,235,1298264,12651,,,1298264,863,105,119230,108738,1870,0,,,,11961,,105746,,0,1407002,14097,,,,73502,,0,1407002,14097 +"2020-11-06","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-06","AZ",6109,5714,22,395,22018,22018,1082,187,,250,1593981,13820,,,,,138,254764,248330,1996,0,,,,,,,,0,2992772,34703,,,323662,,1842311,15682,2992772,34703 +"2020-11-06","CA",17866,,51,,,,3489,0,,923,,0,,,,,,951094,951094,6518,0,,,,,,,,0,19396349,129986,,,,,,0,19396349,129986 +"2020-11-06","CO",2376,1978,23,398,9911,9911,1041,197,,,1186377,12903,173624,,,,,124469,116968,3463,0,14007,,,,,,2177091,35158,2177091,35158,187631,,,,1303345,16264,,0 +"2020-11-06","CT",4671,3757,15,914,12257,12257,402,0,,,,0,,,2699607,,,78125,73206,1065,0,,1722,,,97515,,,0,2800435,40089,,26855,,,,0,2800435,40089 +"2020-11-06","DC",652,,2,,,,79,0,,25,,0,,,,,9,17792,,110,0,,,,,,13738,546323,5821,546323,5821,,,,,264455,1626,,0 +"2020-11-06","DE",716,629,0,87,,,114,0,,27,334846,2213,,,,,,26035,24835,282,0,,,,,27700,13766,577122,3331,577122,3331,,,,,360881,2495,,0 +"2020-11-06","FL",17224,,54,,50868,50868,2564,198,,,5504450,29721,531822,517552,8179656,,,821526,779662,5150,0,62323,,60854,,1061448,,10405346,76349,10405346,76349,594540,,578706,,6325976,34871,9288035,59562 +"2020-11-06","GA",8608,8156,30,452,32317,32317,1848,100,6075,,,0,,,,,,402427,370106,2802,0,30818,,,,346096,,,0,3691733,19573,336077,,,,,0,3691733,19573 +"2020-11-06","GU",88,,3,,,,86,0,,21,66027,564,,,,,10,5077,4998,73,0,7,79,,,,3403,,0,71104,637,209,699,,,,0,70403,615 +"2020-11-06","HI",219,219,0,,1138,1138,68,13,,13,,0,,,,,9,15785,15572,99,0,,,,,15520,,551803,4470,551803,4470,,,,,,0,,0 +"2020-11-06","IA",1818,,16,,,,912,0,,188,788507,2835,,64555,,,67,133510,133510,2778,0,,,3987,11106,,99243,,0,922017,5613,,,68582,90450,923705,5609,,0 +"2020-11-06","ID",671,622,7,49,2788,2788,296,58,568,77,338656,2160,,,,,,69579,60065,1265,0,,,,,,31574,,0,398721,3045,,17332,,,398721,3045,543322,4301 +"2020-11-06","IL",10397,10079,84,318,,,4090,0,,786,,0,,,,,339,465540,,11790,0,,,,,,,,0,8215129,98401,,,,,,0,8215129,98401 +"2020-11-06","IN",4547,4306,36,241,18005,18005,2001,207,3477,540,1576282,10511,,,,,191,200823,,4647,0,,,,,191092,,,0,3117069,43214,,,,,1777105,15158,3117069,43214 +"2020-11-06","KS",1166,,79,,4067,4067,693,83,1122,183,578687,7222,,,,337,62,97633,,5418,0,,,,,,,,0,676320,12640,,,,,676320,12640,,0 +"2020-11-06","KY",1544,1520,10,24,7708,7708,1153,127,1922,299,,0,,,,,,117505,98138,2228,0,,,,,,20926,,0,2177509,168192,87275,71347,,,,0,2177509,168192 +"2020-11-06","LA",6016,5787,21,229,,,644,0,,,2674761,17940,,,,,81,191715,186695,870,0,,,,,,172210,,0,2866476,18810,,,,,,0,2861456,18810 +"2020-11-06","MA",10106,9880,21,226,13373,13373,513,0,,118,2690585,18652,,,,,57,167274,162736,2113,0,,,11842,,209659,131646,,0,6547668,86357,,,128053,200056,2853321,20690,6547668,86357 +"2020-11-06","MD",4194,4046,12,148,17537,17537,609,102,,152,1851665,11606,,136605,,,,151505,151505,1541,0,,,14048,,182511,8262,,0,3587697,35366,,,150653,,2003170,13147,3587697,35366 +"2020-11-06","ME",150,149,0,1,513,513,37,3,,14,,0,11868,,,,3,7444,6565,184,0,367,27,,,7771,5830,,0,662352,8122,12247,45,,,,0,662352,8122 +"2020-11-06","MI",7880,7513,47,367,,,2425,0,,484,,0,,,4984958,,202,222509,201569,4246,0,,,,,266355,121093,,0,5251313,115366,336396,,,,,0,5251313,115366 +"2020-11-06","MN",2591,2563,36,28,11193,11193,1038,177,2864,224,1793542,16911,,,,,,170307,169230,5442,0,,,,,,139190,2990965,43812,2990965,43812,,38143,,,1962772,22212,,0 +"2020-11-06","MO",3131,,25,,,,1834,0,,517,1366724,6299,83033,,2417371,,226,200507,200507,3931,0,5869,8808,,,226960,,,0,2649277,24307,89114,53513,84925,37813,1567231,10230,2649277,24307 +"2020-11-06","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,98,98,2,0,,,,,,29,,0,16091,2,,,,,16085,0,22633,0 +"2020-11-06","MS",3419,3063,14,356,6728,6728,695,0,,176,837208,0,,,,,82,124854,107405,967,0,,,,,,105839,,0,962062,967,45873,106901,,,,0,942578,0 +"2020-11-06","MT",419,,12,,1447,1447,437,26,,,,0,,,,,,37947,,979,0,,,,,,23607,,0,523596,3572,,,,,,0,523596,3572 +"2020-11-06","NC",4582,4489,34,93,,,1161,0,,311,,0,,,,,,288569,275790,2908,0,,,,,,,,0,4230191,45241,,45126,,,,0,4230191,45241 +"2020-11-06","ND",618,,17,,1817,1817,375,41,337,48,254063,930,10318,,,,,52081,51498,1805,0,719,,,,,41175,884732,11387,884732,11387,11037,1240,,,305665,2695,923087,12271 +"2020-11-06","NE",674,,5,,3201,3201,720,53,,,536031,3615,,,907738,,,78012,,2124,0,,,,,91239,45658,,0,1000225,12727,,,,,614362,5739,1000225,12727 +"2020-11-06","NH",488,,2,,790,790,48,2,259,,347726,2231,,,,,,12012,11004,204,0,,,,,,9894,,0,651044,6453,33242,,32350,,358730,2372,651044,6453 +"2020-11-06","NJ",16416,14616,13,1800,38178,38178,1336,123,,274,4614056,43223,,,,,81,264228,249380,2772,0,,,,,,,,0,4878284,45995,,,,,,0,4863436,45384 +"2020-11-06","NM",1088,,6,,5020,5020,402,51,,,,0,,,,,,52394,,1284,0,,,,,,22811,,0,1238575,8370,,,,,,0,1238575,8370 +"2020-11-06","NV",1845,,21,,,,770,0,,183,728492,4279,,,,,85,106922,106922,1562,0,,,,,,,1312492,13371,1312492,13371,,,,,835414,5841,,0 +"2020-11-06","NY",25910,,18,,89995,89995,1321,0,,285,,0,,,,,129,522021,,3209,0,,,,,,,15355881,160705,15355881,160705,,,,,,0,,0 +"2020-11-06","OH",5494,5165,33,329,20246,20246,2170,231,3991,547,,0,,,,,280,240178,226796,5008,0,,4738,,,249749,180758,,0,4744403,53168,,135985,,,,0,4744403,53168 +"2020-11-06","OK",1429,,16,,9438,9438,1025,100,,326,1557850,14166,,,1557850,,,131751,,1878,0,5285,,,,144206,113227,,0,1689601,16044,91240,,,,,0,1705067,16255 +"2020-11-06","OR",710,,5,,3334,3334,322,22,,62,841188,5283,,,1458457,,27,47839,,790,0,,,,,75030,,,0,1533487,14560,,,,,886568,6037,1533487,14560 +"2020-11-06","PA",8975,,38,,,,1597,0,,351,2408366,17030,,,,,149,223950,212258,3384,0,,,,,,165723,4387633,55453,4387633,55453,,,,,2620624,19940,,0 +"2020-11-06","PR",862,659,7,203,,,518,0,,68,305972,0,,,395291,,42,36904,36904,803,0,33615,,,,20103,31915,,0,342876,803,,,,,,0,415664,0 +"2020-11-06","RI",1224,,2,,3488,3488,187,16,,21,417267,2589,,,1170141,,12,36380,,630,0,,,,,47775,,1217916,17165,1217916,17165,,,,,453647,3219,,0 +"2020-11-06","SC",4005,3748,13,257,10776,10776,767,50,,204,1714225,22579,72567,,1659483,,91,182872,173186,1233,0,9278,18123,,,227928,95045,,0,1897097,23812,81845,130900,,,,0,1887411,23549 +"2020-11-06","SD",510,,28,,3023,3023,493,68,,,219551,1566,,,,,,52639,50248,1488,0,,,,,55625,37703,,0,414055,4083,,,,,272190,3054,414055,4083 +"2020-11-06","TN",3541,3324,32,217,10618,10618,1631,72,,505,,0,,,3466790,,191,273144,256845,1373,0,,15680,,,308318,246392,,0,3775108,11027,,135885,,,,0,3775108,11027 +"2020-11-06","TX",18589,,136,,,,6070,0,,1785,,0,,,,,,1017677,942539,9239,0,49570,37196,,,1050102,807008,,0,8927838,95460,500132,462799,,,,0,8927838,95460 +"2020-11-06","UT",649,,17,,5922,5922,414,92,1216,167,969349,7297,,,1332613,465,,127279,,2987,0,,7054,,6794,130943,91340,,0,1463556,15707,,103488,,46831,1089995,9687,1463556,15707 +"2020-11-06","VA",3682,3432,-6,250,12936,12936,1057,71,,216,,0,,,,,96,188770,173645,1568,0,11524,10986,,,207023,,2743229,24023,2743229,24023,155320,184749,,,,0,,0 +"2020-11-06","VI",23,,0,,,,,0,,,23728,212,,,,,,1390,,2,0,,,,,,1340,,0,25118,214,,,,,25153,219,,0 +"2020-11-06","VT",58,58,0,,,,4,0,,2,189374,667,,,,,,2354,2327,28,0,,,,,,1904,,0,428851,4429,,,,,191701,693,428851,4429 +"2020-11-06","WA",2431,2431,15,,8784,8784,492,49,,128,,0,,,,,48,119257,116779,1872,0,,,,,,,2541074,21580,2541074,21580,,,,,,0,,0 +"2020-11-06","WI",2333,2256,64,77,12554,12554,1787,244,1557,385,1896457,14644,,,,,,269982,256065,6411,0,,,,,,198090,3497021,56991,3497021,56991,,,,,2152522,20785,,0 +"2020-11-06","WV",487,478,7,9,,,280,0,,93,,0,,,,,31,27087,24672,540,0,,,,,,20465,,0,822098,9807,19416,,,,,0,822098,9807 +"2020-11-06","WY",105,,0,,499,499,147,7,,,123769,965,,,295088,,,16405,13871,996,0,,,,,17681,10012,,0,312769,4564,,,,,137640,1882,312769,4564 +"2020-11-05","AK",84,84,0,,482,482,104,6,,,,0,,,757381,,7,17111,,313,0,,,,,24089,7125,,0,781826,154068,,,,,,0,781826,154068 +"2020-11-05","AL",3026,2818,20,208,21027,21027,994,0,2100,,1209841,6344,,,,1214,,199158,169266,1381,0,,,,,,84471,,0,1379107,7495,,,65657,,1379107,7495,,0 +"2020-11-05","AR",2037,1863,11,174,7326,7326,633,53,,235,1285613,11628,,,1285613,859,105,117360,107292,1548,0,,,,11451,,104816,,0,1392905,12783,,,,70983,,0,1392905,12783 +"2020-11-05","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-05","AZ",6087,5707,28,380,21831,21831,1100,45,,254,1580161,12297,,,,,128,252768,246468,2135,0,,,,,,,,0,2958069,35256,,,322766,,1826629,14303,2958069,35256 +"2020-11-05","CA",17815,,63,,,,3462,0,,922,,0,,,,,,944576,944576,4566,0,,,,,,,,0,19266363,85351,,,,,,0,19266363,85351 +"2020-11-05","CO",2353,1956,20,397,9714,9714,1016,96,,,1173474,11264,173088,,,,,121006,113607,3369,0,13913,,,,,,2141933,32819,2141933,32819,187001,,,,1287081,14587,,0 +"2020-11-05","CT",4656,3744,11,912,12257,12257,380,0,,,,0,,,2661601,,,77060,72261,1687,0,,,,,95473,,,0,2760346,39718,,26512,,,,0,2760346,39718 +"2020-11-05","DC",650,,3,,,,83,0,,26,,0,,,,,24,17682,,81,0,,,,,,13653,540502,3411,540502,3411,,,,,262829,1122,,0 +"2020-11-05","DE",716,629,4,87,,,113,0,,28,332633,1503,,,,,,25753,24554,219,0,,,,,27537,13685,573791,1308,573791,1308,,,,,358386,1722,,0 +"2020-11-05","FL",17170,,39,,50670,50670,2523,191,,,5474729,37818,525620,509924,8126664,,,816376,775950,6120,0,60753,,59014,,1055010,,10328997,92039,10328997,92039,586749,,569222,,6291105,43938,9228473,71991 +"2020-11-05","GA",8578,8126,56,452,32217,32217,1780,175,6058,,,0,,,,,,399625,368368,2344,0,30621,,,,344574,,,0,3672160,24882,334992,,,,,0,3672160,24882 +"2020-11-05","GU",85,,2,,,,90,0,,20,65463,610,,,,,11,5004,4931,101,0,7,73,,,,3352,,0,70467,711,208,677,,,,0,69788,696 +"2020-11-05","HI",219,219,0,,1125,1125,57,1,,11,,0,,,,,8,15686,15473,155,0,,,,,15406,11958,547333,5848,547333,5848,,,,,,0,,0 +"2020-11-05","IA",1802,,15,,,,839,0,,188,785672,4358,,64339,,,60,130732,130732,3992,0,,,3970,10502,,98037,,0,916404,8350,,,68349,88445,918096,8340,,0 +"2020-11-05","ID",664,616,17,48,2730,2730,296,39,566,77,336496,1746,,,,,,68314,59180,1290,0,,,,,,31210,,0,395676,2703,,12903,,,395676,2703,539021,3956 +"2020-11-05","IL",10313,10030,97,283,,,3891,0,,772,,0,,,,,343,453750,447491,9935,0,,,,,,,,0,8116728,86015,,,,,,0,8116728,86015 +"2020-11-05","IN",4511,4269,47,242,17798,17798,1948,185,3433,568,1565771,9039,,,,,197,196176,,4412,0,,,,,187475,,,0,3073855,41093,,,,,1761947,13451,3073855,41093 +"2020-11-05","KS",1087,,0,,3984,3984,567,0,1106,160,571465,0,,,,334,60,92215,,0,0,,,,,,,,0,663680,0,,,,,663680,0,,0 +"2020-11-05","KY",1534,1511,20,23,7581,7581,1102,134,1869,291,,0,,,,,,115277,96424,2268,0,,,,,,20304,,0,2009317,27981,87080,70171,,,,0,2009317,27981 +"2020-11-05","LA",5995,5766,20,229,,,636,0,,,2656821,21066,,,,,82,190845,185825,681,0,,,,,,172210,,0,2847666,21747,,,,,,0,2842646,21747 +"2020-11-05","MA",10085,9859,23,226,13373,13373,498,74,,115,2671933,22693,,,,,56,165161,160698,1862,0,,,,,207306,131646,,0,6461311,86359,,,127372,197543,2832631,24454,6461311,86359 +"2020-11-05","MD",4182,4035,10,147,17435,17435,588,72,,157,1840059,9758,,136605,,,,149964,149964,1198,0,,,14048,,180737,8255,,0,3552331,27944,,,150653,,1990023,10956,3552331,27944 +"2020-11-05","ME",150,149,0,1,510,510,38,3,,17,,0,11861,,,,2,7260,6417,183,0,364,23,,,7621,5751,,0,654230,10507,12237,40,,,,0,654230,10507 +"2020-11-05","MI",7833,7470,51,363,,,2280,0,,475,,0,,,4936619,,194,218263,197806,6103,0,,,,,260736,121093,,0,5135947,0,333334,,,,,0,5135947,0 +"2020-11-05","MN",2555,2530,25,25,11016,11016,931,167,2839,216,1776631,17089,,,,,,164865,163929,3942,0,,,,,,137824,2947153,32216,2947153,32216,,37178,,,1940560,20948,,0 +"2020-11-05","MO",3106,,18,,,,1774,0,,511,1360425,6493,82881,,2397240,,233,196576,196576,3553,0,5812,8468,,,222827,,,0,2624970,22090,88905,51692,84750,35931,1557001,10046,2624970,22090 +"2020-11-05","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,96,96,0,0,,,,,,29,,0,16089,0,,,,,16085,0,22633,0 +"2020-11-05","MS",3405,3053,8,352,6728,6728,640,0,,154,837208,0,,,,,76,123887,106882,1612,0,,,,,,105839,,0,961095,1612,45873,106901,,,,0,942578,0 +"2020-11-05","MT",407,,3,,1421,1421,414,19,,,,0,,,,,,36968,,1013,0,,,,,,23300,,0,520024,2736,,,,,,0,520024,2736 +"2020-11-05","NC",4548,4457,41,91,,,1193,0,,323,,0,,,,,,285661,273173,2859,0,,,,,,,,0,4184950,40636,,41718,,,,0,4184950,40636 +"2020-11-05","ND",601,,29,,1776,1776,366,38,333,51,253133,345,10288,,,,,50276,49742,1572,0,710,,,,,40017,873345,9017,873345,9017,10998,1135,,,302970,1889,910816,9773 +"2020-11-05","NE",669,,9,,3148,3148,698,26,,,532416,2586,,,897377,,,75888,,1828,0,,,,,88869,45772,,0,987498,11966,,,,,608623,4414,987498,11966 +"2020-11-05","NH",486,,2,,788,788,44,1,259,,345495,5022,,,,,,11808,10863,245,0,,,,,,9776,,0,644591,9321,33216,,32326,,356358,5222,644591,9321 +"2020-11-05","NJ",16403,14603,12,1800,38055,38055,1224,97,,238,4570833,46999,,,,,85,261456,247219,2576,0,,,,,,,,0,4832289,49575,,,,,,0,4818052,51393 +"2020-11-05","NM",1082,,23,,4969,4969,400,73,,,,0,,,,,,51110,,859,0,,,,,,22459,,0,1230205,11400,,,,,,0,1230205,11400 +"2020-11-05","NV",1824,,10,,,,740,0,,170,724213,4763,,,,,75,105360,105360,1267,0,,,,,,,1299121,12915,1299121,12915,,,,,829573,6030,,0 +"2020-11-05","NY",25892,,24,,89995,89995,1277,0,,268,,0,,,,,128,518812,,2997,0,,,,,,,15195176,161019,15195176,161019,,,,,,0,,0 +"2020-11-05","OH",5461,5133,33,328,20015,20015,2075,214,3969,541,,0,,,,,270,235170,221881,4961,0,,4330,,,245029,178646,,0,4691235,50321,,126346,,,,0,4691235,50321 +"2020-11-05","OK",1413,,21,,9338,9338,1055,119,,337,1543684,14339,,,1543684,,,129873,,2101,0,5049,,,,142196,111695,,0,1673557,16440,89217,,,,,0,1688812,16911 +"2020-11-05","OR",705,,4,,3312,3312,237,34,,66,835905,4961,,,1444842,,26,47049,,589,0,,,,,74085,,,0,1518927,14520,,,,,880531,5510,1518927,14520 +"2020-11-05","PA",8937,,47,,,,1599,0,,335,2391336,17071,,,,,147,220566,209348,2900,0,,,,,,165424,4332180,51375,4332180,51375,,,,,2600684,19619,,0 +"2020-11-05","PR",855,653,5,202,,,483,0,,60,305972,0,,,395291,,40,36101,36101,294,0,33315,,,,20103,31182,,0,342073,294,,,,,,0,415664,0 +"2020-11-05","RI",1222,,8,,3472,3472,182,40,,20,414678,2779,,,1153730,,11,35750,,628,0,,,,,47021,,1200751,16392,1200751,16392,,,,,450428,3407,,0 +"2020-11-05","SC",3992,3736,7,256,10726,10726,755,70,,214,1691646,6628,72237,,1637644,,102,181639,172216,769,0,9176,17719,,,226218,94333,,0,1873285,7397,81413,126687,,,,0,1863862,7202 +"2020-11-05","SD",482,,22,,2955,2955,475,82,,,217985,980,,,,,,51151,48833,1360,0,,,,,54465,37059,,0,409972,3900,,,,,269136,2340,409972,3900 +"2020-11-05","TN",3509,3297,31,212,10546,10546,1701,62,,482,,0,,,3457022,,209,271771,255720,1969,0,,15455,,,307059,243492,,0,3764081,19441,,132225,,,,0,3764081,19441 +"2020-11-05","TX",18453,,133,,,,5954,0,,1749,,0,,,,,,1008438,934994,10171,0,49570,36170,,,1038293,802611,,0,8832378,93783,500132,450761,,,,0,8832378,93783 +"2020-11-05","UT",632,,7,,5830,5830,409,75,1202,158,962052,9585,,,1319404,465,,124292,,2807,0,,6720,,6470,128445,89837,,0,1447849,18463,,100163,,45298,1080308,12642,1447849,18463 +"2020-11-05","VA",3688,3426,11,262,12865,12865,1064,68,,240,,0,,,,,104,187202,172418,1366,0,11466,10584,,,205694,,2719206,18441,2719206,18441,154933,178110,,,,0,,0 +"2020-11-05","VI",23,,0,,,,,0,,,23516,158,,,,,,1388,,0,0,,,,,,1332,,0,24904,158,,,,,24934,158,,0 +"2020-11-05","VT",58,58,0,,,,7,0,,4,188707,900,,,,,,2326,2301,38,0,,,,,,1888,,0,424422,5623,,,,,191008,935,424422,5623 +"2020-11-05","WA",2416,2416,16,,8735,8735,476,60,,128,,0,,,,,62,117385,114990,1595,0,,,,,,,2519494,24343,2519494,24343,,,,,,0,,0 +"2020-11-05","WI",2269,2194,40,75,12310,12310,1774,223,1542,376,1881813,9518,,,,,,263571,249924,6284,0,,,,,,193369,3440030,31577,3440030,31577,,,,,2131737,15440,,0 +"2020-11-05","WV",480,471,8,9,,,281,0,,93,,0,,,,,31,26547,24199,560,0,,,,,,20175,,0,812291,10748,19360,,,,,0,812291,10748 +"2020-11-05","WY",105,,0,,492,492,134,11,,,122804,2087,,,291142,,,15409,12954,365,0,,,,,17063,9709,,0,308205,4955,,,,,135758,2642,308205,4955 +"2020-11-04","AK",84,84,0,,476,476,95,4,,,,0,,,611067,,9,16798,,408,0,,,,,16353,7124,,0,627758,3003,,,,,,0,627758,3003 +"2020-11-04","AL",3006,2799,19,207,21027,21027,1017,126,2089,,1203497,7075,,,,1207,,197777,168115,1848,0,,,,,,84471,,0,1371612,8563,,,65256,,1371612,8563,,0 +"2020-11-04","AR",2026,1854,23,172,7273,7273,627,79,,234,1273985,10323,,,1273985,856,106,115812,106137,1293,0,,,,11000,,103762,,0,1380122,11237,,,,68146,,0,1380122,11237 +"2020-11-04","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-04","AZ",6059,5701,39,358,21786,21786,1065,160,,241,1567864,8411,,,,,127,250633,244462,815,0,,,,,,,,0,2922813,34495,,,321891,,1812326,9091,2922813,34495 +"2020-11-04","CA",17752,,66,,,,3410,0,,901,,0,,,,,,940010,940010,5338,0,,,,,,,,0,19181012,106091,,,,,,0,19181012,106091 +"2020-11-04","CO",2333,1935,22,398,9618,9618,970,438,,,1162210,9774,172469,,,,,117637,110284,2928,0,13795,,,,,,2109114,26963,2109114,26963,186264,,,,1272494,12641,,0 +"2020-11-04","CT",4645,3736,18,909,12257,12257,374,0,,,,0,,,2623849,,,75373,71238,1515,0,,,,,93570,,,0,2720628,40582,,,,,,0,2720628,40582 +"2020-11-04","DC",647,,0,,,,92,0,,29,,0,,,,,14,17601,,77,0,,,,,,13601,537091,3672,537091,3672,,,,,261707,1089,,0 +"2020-11-04","DE",712,625,0,87,,,114,0,,28,331130,889,,,,,,25534,24336,108,0,,,,,27486,13598,572483,2423,572483,2423,,,,,356664,997,,0 +"2020-11-04","FL",17131,,32,,50479,50479,2489,181,,,5436911,17075,525620,509924,8062691,,,810256,771364,4332,0,60753,,59014,,1047159,,10236958,54498,10236958,54498,586749,,569222,,6247167,21407,9156482,24719 +"2020-11-04","GA",8522,8072,43,450,32042,32042,1782,149,6031,,,0,,,,,,397281,366452,2755,0,30453,,,,342706,,,0,3647278,28448,334128,,,,,0,3647278,28448 +"2020-11-04","GU",83,,3,,,,94,0,,22,64853,637,,,,,12,4903,4830,91,0,7,73,,,,3228,,0,69756,728,208,662,,,,0,69092,627 +"2020-11-04","HI",219,219,0,,1124,1124,57,13,,11,,0,,,,,8,15531,15318,87,0,,,,,15252,11930,541485,4064,541485,4064,,,,,,0,,0 +"2020-11-04","IA",1787,,24,,,,777,0,,182,781314,2642,,64044,,,63,126740,126740,2276,0,,,3952,9782,,96753,,0,908054,4918,,,68036,86091,909756,4920,,0 +"2020-11-04","ID",647,600,15,47,2691,2691,155,48,560,55,334750,1856,,,,,,67024,58223,1179,0,,,,,,30844,,0,392973,2682,,,,,392973,2682,535065,4286 +"2020-11-04","IL",10216,9933,55,283,,,3761,0,,776,,0,,,,,327,443815,437556,7538,0,,,,,,,,0,8030713,71857,,,,,,0,8030713,71857 +"2020-11-04","IN",4464,4224,25,240,17613,17613,1897,229,3393,545,1556732,11223,,,,,183,191764,,3698,0,,,,,183083,,,0,3032762,37419,,,,,1748496,14921,3032762,37419 +"2020-11-04","KS",1087,,41,,3984,3984,567,91,1106,160,571465,5425,,,,334,60,92215,,2988,0,,,,,,,,0,663680,8413,,,,,663680,8413,,0 +"2020-11-04","KY",1514,1491,11,23,7447,7447,1066,103,1815,286,,0,,,,,,113009,94691,1630,0,,,,,,19667,,0,1981336,47517,86811,67962,,,,0,1981336,47517 +"2020-11-04","LA",5975,5746,24,229,,,623,0,,,2635755,7043,,,,,77,190164,185144,1016,0,,,,,,172210,,0,2825919,8059,,,,,,0,2820899,7418 +"2020-11-04","MA",10062,9836,27,226,13299,13299,502,0,,109,2649240,20388,,,,,55,163299,158937,1714,0,,,,,205314,127054,,0,6374952,103066,,,127372,195447,2808177,22017,6374952,103066 +"2020-11-04","MD",4172,4025,10,147,17363,17363,595,51,,154,1830301,10167,,136605,,,,148766,148766,1000,0,,,14048,,179340,8235,,0,3524387,25270,,,150653,,1979067,11167,3524387,25270 +"2020-11-04","ME",150,149,2,1,507,507,36,5,,12,,0,11839,,,,2,7077,6241,151,0,363,0,,,7394,5686,,0,643723,9303,12214,12,,,,0,643723,9303 +"2020-11-04","MI",7782,7419,21,363,,,2215,0,,470,,0,,,4881516,,199,212160,192096,4397,0,,,,,254431,121093,,0,5135947,43267,333334,,,,,0,5135947,43267 +"2020-11-04","MN",2530,2505,31,25,10849,10849,908,202,2805,203,1759542,16625,,,,,,160923,160070,3827,0,,,,,,136457,2914937,31199,2914937,31199,,34654,,,1919612,20382,,0 +"2020-11-04","MO",3088,,24,,,,1632,0,,504,1353932,5093,82687,,2378893,,226,193023,193023,2599,0,5730,8149,,,219118,,,0,2602880,17600,88626,47768,84502,33222,1546955,7692,2602880,17600 +"2020-11-04","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,96,96,0,0,,,,,,29,,0,16089,0,,,,,16085,0,22633,0 +"2020-11-04","MS",3397,3045,13,352,6728,6728,689,0,,168,837208,0,,,,,73,122275,106024,766,0,,,,,,105839,,0,959483,766,45873,106901,,,,0,942578,0 +"2020-11-04","MT",404,,5,,1402,1402,407,18,,,,0,,,,,,35955,,796,0,,,,,,22146,,0,517288,4764,,,,,,0,517288,4764 +"2020-11-04","NC",4507,4418,50,89,,,1186,0,,327,,0,,,,,,282802,270675,2425,0,,,,,,,,0,4144314,22501,,39185,,,,0,4144314,22501 +"2020-11-04","ND",572,,12,,1738,1738,352,36,324,54,252788,485,10265,,,,,48704,48223,1172,0,702,,,,,39163,864328,7956,864328,7956,10967,991,,,301081,1591,901043,8486 +"2020-11-04","NE",660,,4,,3122,3122,673,46,,,529830,2386,,,887405,,,74060,,1440,0,,,,,86884,45522,,0,975532,15068,,,,,604209,3829,975532,15068 +"2020-11-04","NH",484,,1,,787,787,42,3,259,,340473,774,,,,,,11563,10663,115,0,,,,,,9625,,0,635270,4226,33156,,32271,,351136,942,635270,4226 +"2020-11-04","NJ",16391,14591,16,1800,37958,37958,1213,87,,238,4523834,0,,,,,80,258880,245257,3041,0,,,,,,,,0,4782714,3041,,,,,,0,4766659,0 +"2020-11-04","NM",1059,,14,,4896,4896,393,59,,,,0,,,,,,50251,,1011,0,,,,,,22274,,0,1218805,16458,,,,,,0,1218805,16458 +"2020-11-04","NV",1814,,7,,,,696,0,,162,719450,2579,,,,,72,104093,104093,1068,0,,,,,,,1286206,8262,1286206,8262,,,,,823543,3647,,0 +"2020-11-04","NY",25868,,15,,89995,89995,1253,0,,284,,0,,,,,129,515815,,2126,0,,,,,,,15034157,133534,15034157,133534,,,,,,0,,0 +"2020-11-04","OH",5428,5102,55,326,19801,19801,1982,186,3946,502,,0,,,,,272,230209,217119,4071,0,,3880,,,240388,176415,,0,4640914,39694,,115454,,,,0,4640914,39694 +"2020-11-04","OK",1392,,17,,9219,9219,1026,115,,349,1529345,8532,,,1529345,,,127772,,1246,0,5049,,,,139642,110453,,0,1657117,9778,89217,,,,,0,1671901,8885 +"2020-11-04","OR",701,,9,,3278,3278,237,27,,66,830944,5022,,,1431232,,26,46460,,482,0,,,,,73175,,,0,1504407,13313,,,,,875021,5466,1504407,13313 +"2020-11-04","PA",8890,,35,,,,1531,0,,316,2374265,19919,,,,,139,217666,206800,2795,0,,,,,,163249,4280805,58973,4280805,58973,,,,,2581065,22356,,0 +"2020-11-04","PR",850,648,8,202,,,459,0,,60,305972,0,,,395291,,46,35807,35807,57,0,33213,,,,20103,30568,,0,341779,57,,,,,,0,415664,0 +"2020-11-04","RI",1214,,2,,3432,3432,169,26,,21,411899,2918,,,1138055,,11,35122,,579,0,,,,,46304,,1184359,14300,1184359,14300,,,,,447021,3497,,0 +"2020-11-04","SC",3985,3728,17,257,10656,10656,783,57,,210,1685018,9847,72151,,1631123,,112,180870,171642,918,0,9162,17465,,,225537,93533,,0,1865888,10765,81313,124113,,,,0,1856660,10627 +"2020-11-04","SD",460,,14,,2873,2873,483,49,,,217005,649,,,,,,49791,47653,937,0,,,,,53372,35423,,0,406072,4237,,,,,266796,1586,406072,4237 +"2020-11-04","TN",3478,3270,24,208,10484,10484,1716,77,,497,,0,,,3439554,,211,269802,254058,3445,0,,15126,,,305086,240587,,0,3744640,25442,,126401,,,,0,3744640,25442 +"2020-11-04","TX",18320,,126,,,,5872,0,,1744,,0,,,,,,998267,926400,9817,0,49145,35184,,,1027079,797586,,0,8738595,96339,497255,441588,,,,0,8738595,96339 +"2020-11-04","UT",625,,5,,5755,5755,401,90,1183,158,952467,3403,,,1304153,456,,121485,,2110,0,,6519,,6274,125233,88347,,0,1429386,8531,,98113,,44320,1067666,4517,1429386,8531 +"2020-11-04","VA",3677,3416,11,261,12797,12797,1041,58,,231,,0,,,,,102,185836,171426,1157,0,11414,10270,,,204362,,2700765,15096,2700765,15096,154480,172639,,,,0,,0 +"2020-11-04","VI",23,,1,,,,,0,,,23358,178,,,,,,1388,,3,0,,,,,,1329,,0,24746,181,,,,,24776,181,,0 +"2020-11-04","VT",58,58,0,,,,8,0,,4,187807,927,,,,,,2288,2266,31,0,,,,,,1870,,0,418799,2653,,,,,190073,954,418799,2653 +"2020-11-04","WA",2400,2400,22,,8675,8675,480,41,,131,,0,,,,,58,115790,113482,1706,0,,,,,,,2495151,24966,2495151,24966,,,,,,0,,0 +"2020-11-04","WI",2229,2156,58,73,12087,12087,1747,243,1530,360,1872295,10333,,,,,,257287,244002,6255,0,,,,,,189331,3408453,31365,3408453,31365,,,,,2116297,16268,,0 +"2020-11-04","WV",472,464,3,8,,,269,0,,88,,0,,,,,33,25987,23750,394,0,,,,,,19852,,0,801543,5686,19304,,,,,0,801543,5686 +"2020-11-04","WY",105,,12,,481,481,138,10,,,120717,0,,,286777,,,15044,12675,425,0,,,,,16473,9501,,0,303250,5162,,,,,133116,0,303250,5162 +"2020-11-03","AK",84,84,0,,472,472,97,2,,,,0,,,608225,,9,16390,,383,0,,,,,16196,7113,,0,624755,4585,,,,,,0,624755,4585 +"2020-11-03","AL",2987,2782,14,205,20901,20901,1022,451,2081,,1196422,5986,,,,1203,,195929,166627,1037,0,,,,,,81005,,0,1363049,6629,,,65053,,1363049,6629,,0 +"2020-11-03","AR",2003,1833,18,170,7194,7194,652,84,,246,1263662,4936,,,1263662,851,113,114519,105223,878,0,,,,10565,,102666,,0,1368885,5456,,,,65159,,0,1368885,5456 +"2020-11-03","AS",0,,0,,,,,0,,,1768,0,,,,,,0,0,0,0,,,,,,,,0,1768,0,,,,,,0,1768,0 +"2020-11-03","AZ",6020,5679,38,341,21626,21626,956,53,,227,1559453,9071,,,,,112,249818,243782,1679,0,,,,,,,,0,2888318,33230,,,321393,,1803235,10633,2888318,33230 +"2020-11-03","CA",17686,,14,,,,3270,0,,840,,0,,,,,,934672,934672,4044,0,,,,,,,,0,19074921,162420,,,,,,0,19074921,162420 +"2020-11-03","CO",2311,1915,19,396,9180,9180,925,66,,,1152436,8255,172080,,,,,114709,107417,2562,0,13725,,,,,,2082151,21509,2082151,21509,185805,,,,1259853,10725,,0 +"2020-11-03","CT",4627,3718,0,909,12257,12257,340,0,,,,0,,,2584649,,,73858,69826,0,0,,,,,92229,,,0,2680046,42355,,,,,,0,2680046,42355 +"2020-11-03","DC",647,,0,,,,93,0,,30,,0,,,,,14,17524,,86,0,,,,,,13517,533419,5245,533419,5245,,,,,260618,1635,,0 +"2020-11-03","DE",712,625,2,87,,,107,0,,25,330241,882,,,,,,25426,24236,115,0,,,,,27364,13497,570060,4077,570060,4077,,,,,355667,997,,0 +"2020-11-03","FL",17099,,56,,50298,50298,2486,235,,,5419836,20822,525620,509924,8042023,,,805924,768129,4553,0,60753,,59014,,1043239,,10182460,55696,10182460,55696,586749,,569222,,6225760,25375,9131763,8967 +"2020-11-03","GA",8479,8029,480,450,31893,31893,1761,158,5997,,,0,,,,,,394526,364589,31605,0,30316,,,,341068,,,0,3618830,22130,333439,,,,,0,3618830,22130 +"2020-11-03","GU",80,,1,,,,94,0,,22,64216,1245,,,,,10,4812,4748,119,0,7,64,,,,3221,,0,69028,1364,208,561,,,,0,68465,1847 +"2020-11-03","HI",219,219,0,,1111,1111,65,4,,11,,0,,,,,8,15444,15231,77,0,,,,,15167,11868,537421,3749,537421,3749,,,,,,0,,0 +"2020-11-03","IA",1763,,22,,,,730,0,,170,778672,1050,,63813,,,59,124464,124464,1092,0,,,3938,9145,,95500,,0,903136,2142,,,67791,84206,904836,2155,,0 +"2020-11-03","ID",632,588,2,44,2643,2643,155,28,555,55,332894,1715,,,,,,65845,57397,757,0,,,,,,30525,,0,390291,2356,,,,,390291,2356,530779,4767 +"2020-11-03","IL",10161,9878,68,283,,,3594,0,,755,,0,,,,,326,436277,430018,6516,0,,,,,,,,0,7958856,82435,,,,,,0,7958856,82435 +"2020-11-03","IN",4439,4199,49,240,17384,17384,1867,229,3356,566,1545509,7852,,,,,194,188066,,2881,0,,,,,180092,,,0,2995343,25013,,,,,1733575,10733,2995343,25013 +"2020-11-03","KS",1046,,0,,3893,3893,373,0,1082,110,566040,0,,,,328,39,89227,,0,0,,,,,,,,0,655267,0,,,,,655267,0,,0 +"2020-11-03","KY",1503,1480,11,23,7344,7344,1037,139,1778,259,,0,,,,,,111379,93407,1709,0,,,,,,19043,,0,1933819,7679,86625,65671,,,,0,1933819,7679 +"2020-11-03","LA",5951,5737,17,214,,,619,0,,,2628712,28223,,,,,84,189148,184769,1153,0,,,,,,168634,,0,2817860,29376,,,,,,0,2813481,29376 +"2020-11-03","MA",10035,9809,12,226,13299,13299,485,0,,96,2628852,13154,,,,,51,161585,157308,1036,0,,,,,203311,127054,,0,6271886,54843,,,127372,193148,2786160,14077,6271886,54843 +"2020-11-03","MD",4162,4015,7,147,17312,17312,562,60,,143,1820134,6684,,134409,,,,147766,147766,771,0,,,13664,,178077,8223,,0,3499117,19887,,,148073,,1967900,7455,3499117,19887 +"2020-11-03","ME",148,147,0,1,502,502,31,7,,10,,0,11821,,,,1,6926,6138,127,0,363,0,,,7240,5632,,0,634420,3352,12196,11,,,,0,634420,3352 +"2020-11-03","MI",7761,7400,45,361,,,2059,0,,444,,0,,,4842727,,183,207763,187995,3437,0,,,,,249953,121093,,0,5092680,43252,332703,,,,,0,5092680,43252 +"2020-11-03","MN",2499,2478,15,21,10647,10647,852,210,2760,197,1742917,3628,,,,,,157096,156313,3476,0,,,,,,134227,2883738,10975,2883738,10975,,32693,,,1899230,7007,,0 +"2020-11-03","MO",3064,,33,,,,1631,0,,476,1348839,8927,82472,,2364104,,218,190424,190424,2238,0,5685,7864,,,216333,,,0,2585280,31506,88365,46335,84265,32264,1539263,11165,2585280,31506 +"2020-11-03","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,96,96,0,0,,,,,,29,,0,16089,0,,,,,16085,0,22633,0 +"2020-11-03","MS",3384,3036,36,348,6728,6728,672,0,,168,837208,0,,,,,73,121509,105745,644,0,,,,,,105839,,0,958717,644,45873,106901,,,,0,942578,0 +"2020-11-03","MT",399,,13,,1384,1384,389,11,,,,0,,,,,,35159,,907,0,,,,,,21990,,0,512524,3593,,,,,,0,512524,3593 +"2020-11-03","NC",4457,4371,67,86,,,1175,0,,331,,0,,,,,,280377,268613,2349,0,,,,,,,,0,4121813,26141,,35890,,,,0,4121813,26141 +"2020-11-03","ND",560,,15,,1702,1702,335,46,322,46,252303,871,10242,,,,,47532,47108,1221,0,691,,,,,38236,856372,7607,856372,7607,10933,880,,,299490,2043,892557,8000 +"2020-11-03","NE",656,,2,,3076,3076,642,26,,,527444,1906,,,873886,,,72620,,954,0,,,,,85332,45108,,0,960464,9967,,,,,600380,2860,960464,9967 +"2020-11-03","NH",483,,0,,784,784,41,3,257,,339699,1927,,,,,,11448,10495,128,0,,,,,,9515,,0,631044,4512,33122,,32243,,350194,1996,631044,4512 +"2020-11-03","NJ",16375,14582,18,1793,37871,37871,1133,133,,216,4523834,43034,,,,,78,255839,242825,2405,0,,,,,,,,0,4779673,45439,,,,,,0,4766659,44862 +"2020-11-03","NM",1045,,9,,4837,4837,401,100,,,,0,,,,,,49240,,1136,0,,,,,,21942,,0,1202347,11020,,,,,,0,1202347,11020 +"2020-11-03","NV",1807,,23,,,,695,0,,176,716871,2552,,,,,75,103025,103025,911,0,,,,,,,1277944,7301,1277944,7301,,,,,819896,3463,,0 +"2020-11-03","NY",25853,,15,,89995,89995,1227,0,,268,,0,,,,,120,513689,,2321,0,,,,,,,14900623,127869,14900623,127869,,,,,,0,,0 +"2020-11-03","OH",5373,5049,33,324,19615,19615,1960,213,3924,509,,0,,,,,263,226138,213350,4229,0,,3429,,,236853,174130,,0,4601220,30817,,102925,,,,0,4601220,30817 +"2020-11-03","OK",1375,,21,,9104,9104,974,170,,336,1520813,26181,,,1520813,,,126526,,1331,0,5049,,,,138655,109234,,0,1647339,27512,89217,,,,,0,1663016,30315 +"2020-11-03","OR",692,,1,,3251,3251,234,47,,74,825922,3559,,,1418571,,27,45978,,549,0,,,,,72523,,,0,1491094,8849,,,,,869555,16870,1491094,8849 +"2020-11-03","PA",8855,,32,,,,1417,0,,301,2354346,15682,,,,,134,214871,204363,2875,0,,,,,,161153,4221832,42586,4221832,42586,,,,,2558709,18281,,0 +"2020-11-03","PR",842,642,3,200,,,421,0,,63,305972,0,,,395291,,48,35750,35750,345,0,33193,,,,20103,29763,,0,341722,345,,,,,,0,415664,0 +"2020-11-03","RI",1212,,2,,3406,3406,177,21,,24,408981,2475,,,1124452,,12,34543,,423,0,,,,,45607,,1170059,11672,1170059,11672,,,,,443524,2898,,0 +"2020-11-03","SC",3968,3713,22,255,10599,10599,737,66,,202,1675171,12050,72029,,1621681,,104,179952,170862,1035,0,9130,17251,,,224352,92763,,0,1855123,13085,81159,121231,,,,0,1846033,12864 +"2020-11-03","SD",446,,8,,2824,2824,480,69,,,216356,1069,,,,,,48854,46858,1004,0,,,,,52374,35041,,0,401835,1891,,,,,265210,2083,401835,1891 +"2020-11-03","TN",3454,3249,75,205,10407,10407,1609,67,,477,,0,,,3417520,,199,266357,250991,1770,0,,14799,,,301678,237736,,0,3719198,13772,,125198,,,,0,3719198,13772 +"2020-11-03","TX",18194,,97,,,,5936,0,,1734,,0,,,,,,988450,918336,10665,0,48506,34271,,,1016443,792286,,0,8642256,97290,491876,429996,,,,0,8642256,97290 +"2020-11-03","UT",620,,6,,5665,5665,382,89,1170,152,949064,5600,,,1296805,451,,119375,,1669,0,,5946,,5708,124050,87211,,0,1420855,10710,,94182,,42278,1063149,7167,1420855,10710 +"2020-11-03","VA",3666,3408,8,258,12739,12739,1026,65,,222,,0,,,,,97,184679,170577,1261,0,11385,9950,,,203259,,2685669,22514,2685669,22514,154320,165181,,,,0,,0 +"2020-11-03","VI",22,,1,,,,,0,,,23180,39,,,,,,1385,,7,0,,,,,,1327,,0,24565,46,,,,,24595,50,,0 +"2020-11-03","VT",58,58,0,,,,3,0,,3,186880,263,,,,,,2257,2239,22,0,,,,,,1833,,0,416146,628,,,,,189119,283,416146,628 +"2020-11-03","WA",2378,2378,12,,8634,8634,471,23,,124,,0,,,,,48,114084,111856,543,0,,,,,,,2470185,1039,2470185,1039,,,,,,0,,0 +"2020-11-03","WI",2171,2102,58,69,11844,11844,1714,247,1514,347,1861962,15344,,,,,,251032,238067,6104,0,,,,,,185241,3377088,49173,3377088,49173,,,,,2100029,21115,,0 +"2020-11-03","WV",469,461,11,8,,,271,0,,83,,0,,,,,35,25593,23446,358,0,,,,,,19617,,0,795857,5479,19237,,,,,0,795857,5479 +"2020-11-03","WY",93,,6,,471,471,124,13,,,120717,866,,,282360,,,14619,12399,452,0,,,,,15728,9312,,0,298088,6390,,,,,133116,1206,298088,6390 +"2020-11-02","AK",84,84,1,,470,470,97,8,,,,0,,,604003,,6,16007,,344,0,,,,,15834,7110,,0,620170,15963,,,,,,0,620170,15963 +"2020-11-02","AL",2973,2767,0,206,20450,20450,967,0,2067,,1190436,3095,,,,1193,,194892,165984,907,0,,,,,,81005,,0,1356420,3840,,,64932,,1356420,3840,,0 +"2020-11-02","AR",1985,1817,60,168,7110,7110,672,55,,251,1258726,15236,,,1258726,845,112,113641,104703,1451,0,,,,10188,,101507,,0,1363429,16457,,,,62842,,0,1363429,16457 +"2020-11-02","AS",0,,0,,,,,0,,,1768,152,,,,,,0,0,0,0,,,,,,,,0,1768,152,,,,,,0,1768,152 +"2020-11-02","AZ",5982,5664,1,318,21573,21573,918,15,,231,1550382,6211,,,,,120,248139,242220,666,0,,,,,,,,0,2855088,12212,,,320952,,1792602,6835,2855088,12212 +"2020-11-02","CA",17672,,5,,,,3241,0,,823,,0,,,,,,930628,930628,4094,0,,,,,,,,0,18912501,169186,,,,,,0,18912501,169186 +"2020-11-02","CO",2292,1899,4,393,9114,9114,858,25,,,1144181,10624,171734,,,,,112147,104947,2237,0,13684,,,,,,2060642,25847,2060642,25847,185418,,,,1249128,12805,,0 +"2020-11-02","CT",4627,3718,11,909,12257,12257,340,0,,,,0,,,2543887,,,73858,69826,2651,0,,,,,90671,,,0,2637691,11123,,,,,,0,2637691,11123 +"2020-11-02","DC",647,,1,,,,93,0,,27,,0,,,,,13,17438,,69,0,,,,,,13443,528174,2928,528174,2928,,,,,258983,852,,0 +"2020-11-02","DE",710,623,0,87,,,111,0,,24,329359,2137,,,,,,25311,24134,185,0,,,,,27236,13375,565983,4716,565983,4716,,,,,354670,2322,,0 +"2020-11-02","FL",17043,,46,,50063,50063,2474,82,,,5399014,19925,525620,509924,8032771,,,801371,764828,4569,0,60753,,59014,,1043586,,10126764,39866,10126764,39866,586749,,569222,,6200385,24494,9122796,39969 +"2020-11-02","GA",7999,,18,,31735,31735,1751,15,5963,,,0,,,,,,362921,362921,939,0,30206,,,,339565,,,0,3596700,12589,332921,,,,,0,3596700,12589 +"2020-11-02","GU",79,,0,,,,102,0,,19,62971,98,,,,,8,4693,4644,3,0,7,49,,,,2666,,0,67664,101,206,409,,,,0,66618,0 +"2020-11-02","HI",219,219,0,,1107,1107,58,2,,8,,0,,,,,5,15367,15154,83,0,,,,,15091,11824,533672,3408,533672,3408,,,,,,0,,0 +"2020-11-02","IA",1741,,24,,,,718,0,,156,777622,2414,,63647,,,57,123372,123372,1405,0,,,3921,8741,,93943,,0,900994,3819,,,67608,82806,902681,3830,,0 +"2020-11-02","ID",630,586,1,44,2615,2615,263,21,552,74,331179,1596,,,,,,65088,56756,480,0,,,,,,30218,,0,387935,1953,,,,,387935,1953,526012,2694 +"2020-11-02","IL",10093,9810,18,283,,,3371,0,,722,,0,,,,,298,429761,423502,6222,0,,,,,,,,0,7876421,68118,,,,,,0,7876421,68118 +"2020-11-02","IN",4390,4150,26,240,17155,17155,1759,132,3313,528,1537657,9821,,,,,170,185185,,3077,0,,,,,177335,,,0,2970330,29293,,,,,1722842,12898,2970330,29293 +"2020-11-02","KS",1046,,17,,3893,3893,373,61,1082,110,566040,8439,,,,328,39,89227,,4046,0,,,,,,,,0,655267,12485,,,,,655267,12485,,0 +"2020-11-02","KY",1492,1470,3,22,7205,7205,988,-5,1736,270,,0,,,,,,109670,92228,1028,0,,,,,,18516,,0,1926140,30487,86479,63638,,,,0,1926140,30487 +"2020-11-02","LA",5934,5720,8,214,,,596,0,,,2600489,5091,,,,,70,187995,183616,275,0,,,,,,168634,,0,2788484,5366,,,,,,0,2784105,5366 +"2020-11-02","MA",10023,9797,10,226,13299,13299,469,0,,96,2615698,13311,,,,,50,160549,156385,842,0,,,,,202224,127054,,0,6217043,51419,,,127372,190746,2772083,14036,6217043,51419 +"2020-11-02","MD",4155,4007,3,148,17252,17252,529,74,,133,1813450,10415,,134409,,,,146995,146995,850,0,,,13664,,177158,8201,,0,3479230,26814,,,148073,,1960445,11265,3479230,26814 +"2020-11-02","ME",148,147,1,1,495,495,29,7,,8,,0,11808,,,,1,6799,6039,84,0,363,0,,,7168,5588,,0,631068,11008,12183,11,,,,0,631068,11008 +"2020-11-02","MI",7716,7357,17,359,,,1966,0,,428,,0,,,4803973,,180,204326,184889,6920,0,,,,,245455,121093,,0,5049428,96962,331012,,,,,0,5049428,96962 +"2020-11-02","MN",2484,2463,9,21,10437,10437,774,103,2729,195,1739289,20116,,,,,,153620,152934,2948,0,,,,,,132125,2872763,36536,2872763,36536,,32466,,,1892223,23046,,0 +"2020-11-02","MO",3031,,5,,,,1659,0,,476,1339912,6731,82277,,2335025,,221,188186,188186,2651,0,5659,7684,,,213941,,,0,2553774,18592,88144,44460,84090,30850,1528098,9382,2553774,18592 +"2020-11-02","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,96,96,0,0,,,,,,29,,0,16089,0,,,,,16085,0,22633,0 +"2020-11-02","MS",3348,3010,0,338,6728,6728,657,152,,167,837208,32944,,,,,75,120865,105370,365,0,,,,,,105839,,0,958073,33309,45873,106901,,,,0,942578,34470 +"2020-11-02","MT",386,,10,,1373,1373,386,16,,,,0,,,,,,34252,,757,0,,,,,,21496,,0,508931,7227,,,,,,0,508931,7227 +"2020-11-02","NC",4390,4313,7,77,,,1146,0,,344,,0,,,,,,278028,266451,1336,0,,,,,,,,0,4095672,32749,,33792,,,,0,4095672,32749 +"2020-11-02","ND",545,,9,,1656,1656,274,22,317,36,251432,682,10223,,,,,46311,45915,967,0,686,,,,,37035,848765,7716,848765,7716,10909,771,,,297447,1654,884557,8207 +"2020-11-02","NE",654,,2,,3050,3050,613,8,,,525538,1838,,,864956,,,71666,,934,0,,,,,84310,44773,,0,950497,5319,,,,,597520,2771,950497,5319 +"2020-11-02","NH",483,,0,,781,781,41,1,256,,337772,976,,,,,,11320,10426,106,0,,,,,,9430,,0,626532,9938,33102,,32225,,348198,1063,626532,9938 +"2020-11-02","NJ",16357,14564,3,1793,37738,37738,1109,17,,212,4480800,62580,,,,,100,253434,240997,1795,0,,,,,,,,0,4734234,64375,,,,,,0,4721797,65691 +"2020-11-02","NM",1036,,10,,4737,4737,382,64,,,,0,,,,,,48104,,872,0,,,,,,21758,,0,1191327,8813,,,,,,0,1191327,8813 +"2020-11-02","NV",1784,,3,,,,678,0,,182,714319,2608,,,,,64,102114,102114,635,0,,,,,,,1270643,7460,1270643,7460,,,,,816433,3243,,0 +"2020-11-02","NY",25838,,14,,89995,89995,1151,0,,276,,0,,,,,117,511368,,1633,0,,,,,,,14772754,96101,14772754,96101,,,,,,0,,0 +"2020-11-02","OH",5340,5026,37,314,19402,19402,1822,182,3899,472,,0,,,,,264,221909,209274,2909,0,,3235,,,234269,171657,,0,4570403,45570,,100805,,,,0,4570403,45570 +"2020-11-02","OK",1354,,9,,8934,8934,852,23,,322,1494632,0,,,1494632,,,125195,,1084,0,5049,,,,135119,107893,,0,1619827,1084,89217,,,,,0,1632701,0 +"2020-11-02","OR",691,,2,,3204,3204,211,0,,61,822363,5335,,,1410154,,23,45429,,508,0,,,,,72091,,,0,1482245,14388,,,,,852685,0,1482245,14388 +"2020-11-02","PA",8823,,6,,,,1352,0,,,2338664,10854,,,,,124,211996,201764,2060,0,,,,,,161116,4179246,25878,4179246,25878,,,,,2540428,12727,,0 +"2020-11-02","PR",839,639,7,200,,,443,0,,68,305972,0,,,395291,,51,35405,35405,864,0,32767,,,,20103,29352,,0,341377,864,,,,,,0,415664,0 +"2020-11-02","RI",1210,,3,,3385,3385,170,0,,22,406506,1060,,,1113217,,9,34120,,232,0,,,,,45170,,1158387,4560,1158387,4560,,,,,440626,1292,,0 +"2020-11-02","SC",3946,3697,10,249,10533,10533,749,19,,204,1663121,13792,71844,,1610128,,88,178917,170048,894,0,9107,16969,,,223041,91934,,0,1842038,14686,80951,117152,,,,0,1833169,14612 +"2020-11-02","SD",438,,1,,2755,2755,402,34,,,215287,446,,,,,,47850,45932,526,0,,,,,51787,34087,,0,399944,2853,,,,,263127,962,399944,2853 +"2020-11-02","TN",3379,3186,26,193,10340,10340,1467,33,,426,,0,,,3405610,,191,264587,249356,3161,0,,14635,,,299816,234460,,0,3705426,37116,,124853,,,,0,3705426,37116 +"2020-11-02","TX",18097,,20,,,,5770,0,,1692,,0,,,,,,977785,910038,5455,0,48164,33203,,,1005389,787685,,0,8544966,27063,490032,417575,,,,0,8544966,27063 +"2020-11-02","UT",614,,0,,5576,5576,366,50,1147,138,943464,6583,,,1287739,443,,117706,,1196,0,,5778,,5545,122406,86269,,0,1410145,11790,,91159,,41611,1055982,8096,1410145,11790 +"2020-11-02","VA",3658,3402,3,256,12674,12674,1031,27,,214,,0,,,,,97,183418,169512,1026,0,11355,9623,,,201764,,2663155,15496,2663155,15496,154182,158540,,,,0,,0 +"2020-11-02","VI",21,,0,,,,,0,,,23141,87,,,,,,1378,,2,0,,,,,,1320,,0,24519,89,,,,,24545,85,,0 +"2020-11-02","VT",58,58,0,,,,4,0,,3,186617,245,,,,,,2235,2219,23,0,,,,,,1826,,0,415518,2771,,,,,188836,268,415518,2771 +"2020-11-02","WA",2366,2366,0,,8611,8611,464,40,,103,,0,,,,,47,113541,111316,787,0,,,,,,,2469146,19024,2469146,19024,,,,,,0,,0 +"2020-11-02","WI",2113,2050,3,63,11597,11597,1648,100,1499,352,1846618,5413,,,,,,244928,232296,3505,0,,,,,,181845,3327915,17559,3327915,17559,,,,,2078914,8846,,0 +"2020-11-02","WV",458,453,1,5,,,254,0,,84,,0,,,,,33,25235,23219,352,0,,,,,,19220,,0,790378,6908,19233,,,,,0,790378,6908 +"2020-11-02","WY",87,,0,,458,458,132,16,,,119851,2589,,,276654,,,14167,12059,444,0,,,,,15044,8963,,0,291698,6952,,,,,131910,3372,291698,6952 +"2020-11-01","AK",83,83,1,,462,462,98,7,,,,0,,,588975,,5,15663,,351,0,,,,,14906,7104,,0,604207,0,,,,,,0,604207,0 +"2020-11-01","AL",2973,2767,6,206,20450,20450,967,0,2066,,1187341,5383,,,,1193,,193985,165239,1700,0,,,,,,81005,,0,1352580,6327,,,64859,,1352580,6327,,0 +"2020-11-01","AR",1925,1758,0,167,7055,7055,639,17,,225,1243490,0,,,1243490,838,106,112190,103482,0,0,,,,9841,,100067,,0,1346972,0,,,,61220,,0,1346972,0 +"2020-11-01","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-11-01","AZ",5981,5663,2,318,21558,21558,875,66,,222,1544171,12748,,,,,112,247473,241596,1527,0,,,,,,,,0,2842876,13357,,,320223,,1785767,14214,2842876,13357 +"2020-11-01","CA",17667,,41,,,,3193,0,,791,,0,,,,,,926534,926534,4529,0,,,,,,,,0,18743315,140998,,,,,,0,18743315,140998 +"2020-11-01","CO",2288,1896,3,392,9089,9089,788,25,,,1133557,11501,171321,,,,,109910,102766,2560,0,13636,,,,,,2034795,30073,2034795,30073,184957,,,,1236323,14047,,0 +"2020-11-01","CT",4616,3708,0,908,12257,12257,329,0,,,,0,,,2533349,,,71207,67519,0,0,,,,,90097,,,0,2626568,11758,,,,,,0,2626568,11758 +"2020-11-01","DC",646,,0,,,,101,0,,34,,0,,,,,11,17369,,103,0,,,,,,13349,525246,11116,525246,11116,,,,,258131,3083,,0 +"2020-11-01","DE",710,623,2,87,,,102,0,,25,327222,1445,,,,,,25126,23955,175,0,,,,,27073,13291,561267,6396,561267,6396,,,,,352348,1620,,0 +"2020-11-01","FL",16997,,28,,49981,49981,2370,67,,,5379089,44294,525620,509924,7996560,,,796802,762674,4805,0,60753,,59014,,1039916,,10086898,107550,10086898,107550,586749,,569222,,6175891,49099,9082827,95177 +"2020-11-01","GA",7981,,2,,31720,31720,1720,21,5961,,,0,,,,,,361982,361982,1192,0,30146,,,,338511,,,0,3584111,21429,332581,,,,,0,3584111,21429 +"2020-11-01","GU",79,,0,,,,100,0,,16,62873,102,,,,,4,4690,4641,9,0,7,49,,,,2666,,0,67563,111,206,409,,,,0,66618,0 +"2020-11-01","HI",219,219,3,,1105,1105,58,8,,8,,0,,,,,5,15284,15071,68,0,,,,,15012,11776,530264,4234,530264,4234,,,,,,0,,0 +"2020-11-01","IA",1717,,1,,,,718,0,,156,775208,4531,,63620,,,57,121967,121967,2212,0,,,3909,8393,,93522,,0,897175,6743,,,67569,81999,898851,6754,,0 +"2020-11-01","ID",629,585,3,44,2594,2594,263,22,551,74,329583,1503,,,,,,64608,56399,798,0,,,,,,29867,,0,385982,2068,,,,,385982,2068,523318,2996 +"2020-11-01","IL",10075,9792,25,283,,,3294,0,,692,,0,,,,,284,423539,417280,6980,0,,,,,,,,0,7808303,78458,,,,,,0,7808303,78458 +"2020-11-01","IN",4364,4124,32,240,17023,17023,1732,176,3292,495,1527836,8186,,,,,167,182108,,2750,0,,,,,174616,,,0,2941037,30420,,,,,1709944,10936,2941037,30420 +"2020-11-01","KS",1029,,0,,3832,3832,512,0,1067,145,557601,0,,,,323,53,85181,,0,0,,,,,,,,0,642782,0,,,,,642782,0,,0 +"2020-11-01","KY",1489,1467,4,22,7210,7210,964,0,1734,236,,0,,,,,,108642,91343,1423,0,,,,,,18468,,0,1895653,0,86301,62629,,,,0,1895653,0 +"2020-11-01","LA",5926,5712,7,214,,,598,0,,,2595398,18376,,,,,70,187720,183341,1071,0,,,,,,168634,,0,2783118,19447,,,,,,0,2778739,19447 +"2020-11-01","MA",10013,9788,22,225,13299,13299,613,13,,113,2602387,15585,,,,,55,159707,155660,1131,0,,,,,201330,127054,,0,6165624,62463,,,127372,188181,2758047,16724,6165624,62463 +"2020-11-01","MD",4152,4004,5,148,17178,17178,523,85,,127,1803035,9644,,134409,,,,146145,146145,864,0,,,13664,,176150,8199,,0,3452416,29754,,,148073,,1949180,10508,3452416,29754 +"2020-11-01","ME",147,146,0,1,488,488,17,2,,5,,0,11780,,,,1,6715,5944,47,0,361,0,,,6991,5554,,0,620060,356,12153,11,,,,0,620060,356 +"2020-11-01","MI",7699,7340,0,359,,,1728,0,,398,,0,,,4714186,,167,197406,178180,0,0,,,,,238280,121093,,0,4952466,0,329831,,,,,0,4952466,0 +"2020-11-01","MN",2475,2455,18,20,10334,10334,738,64,2706,176,1719173,13387,,,,,,150672,150004,2200,0,,,,,,129663,2836227,27094,2836227,27094,,31184,,,1869177,15560,,0 +"2020-11-01","MO",3026,,2,,,,1649,0,,494,1333181,6212,82124,,2319312,,214,185535,185535,2349,0,5621,7465,,,211106,,,0,2535182,17632,87952,43552,83927,30074,1518716,8561,2535182,17632 +"2020-11-01","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,96,96,4,0,,,,,,29,,0,16089,4,,,,,16085,0,22633,0 +"2020-11-01","MS",3348,3010,14,338,6576,6576,673,0,,171,804264,0,,,,,76,120500,105098,340,0,,,,,,101385,,0,924764,340,44238,94219,,,,0,908108,0 +"2020-11-01","MT",376,,1,,1357,1357,376,7,,,,0,,,,,,33495,,694,0,,,,,,21398,,0,501704,2789,,,,,,0,501704,2789 +"2020-11-01","NC",4383,4306,5,77,,,1122,0,,328,,0,,,,,,276692,265171,2057,0,,,,,,,,0,4062923,37191,,33369,,,,0,4062923,37191 +"2020-11-01","ND",536,,7,,1634,1634,278,16,314,38,250750,602,10222,,,,,45344,44949,1150,0,686,,,,,36142,841049,8940,841049,8940,10908,756,,,295793,1729,876350,9545 +"2020-11-01","NE",652,,6,,3042,3042,612,9,,,523700,2327,,,860660,,,70732,,1087,0,,,,,83285,44247,,0,945178,7055,,,,,594749,3416,945178,7055 +"2020-11-01","NH",483,,0,,780,780,38,1,255,,336796,1948,,,,,,11214,10339,130,0,,,,,,9379,,0,616594,0,33039,,32206,,347135,2050,616594,0 +"2020-11-01","NJ",16354,14561,4,1793,37721,37721,1104,33,,213,4418220,0,,,,,101,251639,239629,2126,0,,,,,,,,0,4669859,2126,,,,,,0,4656106,0 +"2020-11-01","NM",1026,,8,,4673,4673,365,56,,,,0,,,,,,47232,,742,0,,,,,,21623,,0,1182514,9794,,,,,,0,1182514,9794 +"2020-11-01","NV",1781,,4,,,,585,0,,165,711711,3987,,,,,58,101479,101479,716,0,,,,,,,1263183,10100,1263183,10100,,,,,813190,4703,,0 +"2020-11-01","NY",25824,,17,,89995,89995,1125,0,,259,,0,,,,,117,509735,,2255,0,,,,,,,14676653,148935,14676653,148935,,,,,,0,,0 +"2020-11-01","OH",5303,4990,2,313,19220,19220,1687,88,3876,453,,0,,,,,247,219000,206549,3303,0,,3078,,,231339,170259,,0,4524833,57389,,98069,,,,0,4524833,57389 +"2020-11-01","OK",1345,,8,,8911,8911,852,22,,322,1494632,0,,,1494632,,,124111,,1349,0,5049,,,,135119,107082,,0,1618743,1349,89217,,,,,0,1632701,0 +"2020-11-01","OR",689,,14,,3204,3204,211,0,,61,817028,6479,,,1396505,,23,44921,,532,0,,,,,71352,,,0,1467857,26698,,,,,852685,0,1467857,26698 +"2020-11-01","PA",8817,,5,,,,1267,0,,,2327810,13176,,,,,120,209936,199891,1909,0,,,,,,158100,4153368,36580,4153368,36580,,,,,2527701,14904,,0 +"2020-11-01","PR",832,632,10,200,,,429,0,,62,305972,0,,,395291,,43,34541,34541,403,0,32120,,,,20103,29903,,0,340513,403,,,,,,0,415664,0 +"2020-11-01","RI",1207,,3,,3385,3385,170,27,,22,405446,2293,,,1108938,,9,33888,,480,0,,,,,44889,,1153827,11900,1153827,11900,,,,,439334,2773,,0 +"2020-11-01","SC",3936,3687,1,249,10514,10514,773,14,,190,1649329,23891,71712,,1596565,,93,178023,169228,1411,0,9083,16869,,,221992,91466,,0,1827352,25302,80795,116139,,,,0,1818557,25234 +"2020-11-01","SD",437,,12,,2721,2721,421,38,,,214841,1301,,,,,,47324,45437,1332,0,,,,,51085,33749,,0,397091,5187,,,,,262165,2633,397091,5187 +"2020-11-01","TN",3353,3165,0,188,10307,10307,1437,1,,428,,0,,,3371628,,181,261426,246563,754,0,,14267,,,296682,233175,,0,3668310,11305,,118549,,,,0,3668310,11305 +"2020-11-01","TX",18077,,53,,,,5691,0,,1631,,0,,,,,,972330,904855,71734,0,47829,32759,,,1001616,785282,,0,8517903,38378,487423,414144,,,,0,8517903,38378 +"2020-11-01","UT",614,,10,,5526,5526,355,63,1144,130,936881,4718,,,1277535,443,,116510,,1854,0,,5610,,5383,120820,85299,,0,1398355,9293,,90076,,40963,1047886,6146,1398355,9293 +"2020-11-01","VA",3655,3399,1,256,12647,12647,1012,43,,228,,0,,,,,98,182392,168675,1202,0,11324,9447,,,200892,,2647659,21607,2647659,21607,153999,157691,,,,0,,0 +"2020-11-01","VI",21,,0,,,,,0,,,23054,0,,,,,,1376,,0,0,,,,,,1320,,0,24430,0,,,,,24460,0,,0 +"2020-11-01","VT",58,58,0,,,,4,0,,1,186372,415,,,,,,2212,2196,17,0,,,,,,1816,,0,412747,4586,,,,,188568,432,412747,4586 +"2020-11-01","WA",2366,2366,0,,8571,8571,470,49,,112,,0,,,,,47,112754,110553,1147,0,,,,,,,2450122,23737,2450122,23737,,,,,,0,,0 +"2020-11-01","WI",2110,2047,18,63,11497,11497,1512,123,1491,343,1841205,14569,,,,,,241423,228863,3553,0,,,,,,179230,3310356,21236,3310356,21236,,,,,2070068,18062,,0 +"2020-11-01","WV",457,452,0,5,,,240,0,,76,,0,,,,,29,24883,22919,423,0,,,,,,19011,,0,783470,9302,19211,,,,,0,783470,9302 +"2020-11-01","WY",87,,0,,442,442,117,3,,,117262,0,,,270359,,,13723,11638,425,0,,,,,14387,8676,,0,284746,828,,,,,128538,0,284746,828 +"2020-10-31","AK",82,82,1,,455,455,94,7,,,,0,,,588975,,6,15312,,454,0,,,,,14906,7099,,0,604207,17884,,,,,,0,604207,17884 +"2020-10-31","AL",2967,2761,35,206,20450,20450,960,0,2065,,1181958,8989,,,,1192,,192285,164295,1789,0,,,,,,81005,,0,1346253,10564,,,64693,,1346253,10564,,0 +"2020-10-31","AR",1925,1758,25,167,7038,7038,652,35,,226,1243490,9324,,,1243490,834,100,112190,103482,1316,0,,,,9841,,100067,,0,1346972,10401,,,,61220,,0,1346972,10401 +"2020-10-31","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-31","AZ",5979,5664,45,315,21492,21492,889,68,,197,1531423,10684,,,,,104,245946,240130,1901,0,,,,,,,,0,2829519,24885,,,319537,,1771553,12458,2829519,24885 +"2020-10-31","CA",17626,,55,,,,3212,0,,771,,0,,,,,,922005,922005,5087,0,,,,,,,,0,18602317,157794,,,,,,0,18602317,157794 +"2020-10-31","CO",2285,1893,7,392,9064,9064,788,33,,,1122056,12015,170938,,,,,107350,100220,2924,0,13571,,,,,,2004722,41137,2004722,41137,184509,,,,1222276,14838,,0 +"2020-10-31","CT",4616,3708,0,908,12257,12257,329,0,,,,0,,,2522249,,,71207,67519,0,0,,,,,89454,,,0,2614810,26176,,,,,,0,2614810,26176 +"2020-10-31","DC",646,,0,,,,107,0,,29,,0,,,,,11,17266,,122,0,,,,,,13348,514130,0,514130,0,,,,,255048,0,,0 +"2020-10-31","DE",708,621,4,87,,,89,0,,23,325777,2001,,,,,,24951,23787,200,0,,,,,26846,13188,554871,4014,554871,4014,,,,,350728,2201,,0 +"2020-10-31","FL",16969,,42,,49914,49914,2297,156,,,5334795,50628,525620,509924,7910274,,,791997,757438,2283,0,60753,,59014,,1031299,,9979348,35722,9979348,35722,586749,,569222,,6126792,52911,8987650,28542 +"2020-10-31","GA",7979,,24,,31699,31699,1725,93,5957,,,0,,,,,,360790,360790,2565,0,29995,,,,337078,,,0,3562682,26857,331821,,,,,0,3562682,26857 +"2020-10-31","GU",79,,0,,,,92,0,,14,62771,370,,,,,4,4681,4632,53,0,7,49,,,,2666,,0,67452,423,206,409,,,,0,66618,0 +"2020-10-31","HI",216,216,1,,1097,1097,59,7,,11,,0,,,,,4,15216,15003,100,0,,,,,14944,11738,526030,4171,526030,4171,,,,,,0,,0 +"2020-10-31","IA",1716,,10,,,,630,0,,153,770677,3610,,63357,,,55,119755,119755,2570,0,,,3889,8197,,93200,,0,890432,6180,,,67286,81284,892097,6178,,0 +"2020-10-31","ID",626,582,11,44,2572,2572,263,23,549,74,328080,2041,,,,,,63810,55834,1064,0,,,,,,29556,,0,383914,2906,,,,,383914,2906,520322,4548 +"2020-10-31","IL",10050,9757,56,283,,,3228,0,,680,,0,,,,,290,416559,410300,7899,0,,,,,,,,0,7729845,92636,,,,,,0,7729845,92636 +"2020-10-31","IN",4332,4096,46,236,16847,16847,1740,162,3263,515,1519650,10760,,,,,174,179358,,3465,0,,,,,172330,,,0,2910617,46698,,,,,1699008,14225,2910617,46698 +"2020-10-31","KS",1029,,0,,3832,3832,512,0,1067,145,557601,0,,,,323,53,85181,,0,0,,,,,,,,0,642782,0,,,,,642782,0,,0 +"2020-10-31","KY",1485,1463,9,22,7210,7210,964,112,1734,236,,0,,,,,,107219,90062,1977,0,,,,,,18468,,0,1895653,19523,86301,62629,,,,0,1895653,19523 +"2020-10-31","LA",5919,5705,0,214,,,612,0,,,2577022,0,,,,,79,186649,182270,0,0,,,,,,168634,,0,2763671,0,,,,,,0,2759292,0 +"2020-10-31","MA",9991,9766,16,225,13286,13286,623,33,,118,2586802,16830,,,,,53,158576,154521,1430,0,,,,,199991,127054,,0,6103161,93234,,,127219,187483,2741323,18122,6103161,93234 +"2020-10-31","MD",4147,4000,10,147,17093,17093,520,70,,126,1793391,11187,,134409,,,,145281,145281,967,0,,,13664,,175075,8181,,0,3422662,32984,,,148073,,1938672,12154,3422662,32984 +"2020-10-31","ME",147,146,1,1,486,486,17,0,,5,,0,11780,,,,1,6668,5907,98,0,361,0,,,6987,5517,,0,619704,9480,12153,5,,,,0,619704,9480 +"2020-10-31","MI",7699,7340,34,359,,,1728,0,,398,,0,,,4714186,,167,197406,178180,4018,0,,,,,238280,121093,,0,4952466,50074,329831,,,,,0,4952466,50074 +"2020-10-31","MN",2457,2438,20,19,10270,10270,738,151,2695,176,1705786,14452,,,,,,148472,147831,3007,0,,,,,,127362,2809133,34438,2809133,34438,,30171,,,1853617,17421,,0 +"2020-10-31","MO",3024,,99,,,,1574,0,,464,1326969,7887,81891,,2304229,,189,183186,183186,2986,0,5556,7286,,,208594,,,0,2517550,22684,87651,42673,83662,29401,1510155,10873,2517550,22684 +"2020-10-31","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,92,92,0,0,,,,,,29,,0,16085,0,,,,,16085,0,22633,0 +"2020-10-31","MS",3334,3002,6,332,6576,6576,673,0,,171,804264,0,,,,,76,120160,104847,824,0,,,,,,101385,,0,924424,824,44238,94219,,,,0,908108,0 +"2020-10-31","MT",375,,11,,1350,1350,369,23,,,,0,,,,,,32801,,885,0,,,,,,21353,,0,498915,6286,,,,,,0,498915,6286 +"2020-10-31","NC",4378,4301,46,77,,,1184,0,,345,,0,,,,,,274635,263177,2805,0,,,,,,,,0,4025732,42087,,32124,,,,0,4025732,42087 +"2020-10-31","ND",529,,12,,1618,1618,309,32,314,46,250148,693,10173,,,,,44194,43833,1461,0,673,,,,,35533,832109,8782,832109,8782,10846,735,,,294064,2126,866805,9303 +"2020-10-31","NE",646,,9,,3033,3033,584,56,,,521373,3425,,,854811,,,69645,,1495,0,,,,,82081,43952,,0,938123,17459,,,,,591333,4923,938123,17459 +"2020-10-31","NH",483,,1,,779,779,42,2,255,,334848,6248,,,,,,11084,10237,200,0,,,,,,9263,,0,616594,6670,33039,,32170,,345085,6389,616594,6670 +"2020-10-31","NJ",16350,14557,11,1793,37688,37688,1090,75,,216,4418220,80236,,,,,91,249513,237886,1751,0,,,,,,,,0,4667733,81987,,,,,,0,4656106,83575 +"2020-10-31","NM",1018,,11,,4617,4617,354,64,,,,0,,,,,,46490,,581,0,,,,,,21570,,0,1172720,10833,,,,,,0,1172720,10833 +"2020-10-31","NV",1777,,0,,,,585,0,,165,707724,3925,,,,,58,100763,100763,977,0,,,,,,,1253083,10374,1253083,10374,,,,,808487,4902,,0 +"2020-10-31","NY",25807,,3,,89995,89995,1121,0,,248,,0,,,,,122,507480,,2049,0,,,,,,,14527718,136962,14527718,136962,,,,,,0,,0 +"2020-10-31","OH",5301,4988,10,313,19132,19132,1666,163,3859,432,,0,,,,,235,215697,203356,2915,0,,2787,,,227520,168884,,0,4467444,56075,,88600,,,,0,4467444,56075 +"2020-10-31","OK",1337,,11,,8889,8889,852,111,,322,1494632,14352,,,1494632,,,122762,,1267,0,5049,,,,135119,106292,,0,1617394,15619,89217,,,,,0,1632701,14575 +"2020-10-31","OR",675,,2,,3204,3204,211,34,,61,810549,5547,,,1370599,,23,44389,,596,0,,,,,70560,,,0,1441159,15627,,,,,852685,6118,1441159,15627 +"2020-10-31","PA",8812,,28,,,,1259,0,,,2314634,16651,,,,,120,208027,198163,2510,0,,,,,,158100,4116788,46431,4116788,46431,,,,,2512797,18870,,0 +"2020-10-31","PR",822,626,2,196,,,430,0,,61,305972,0,,,395291,,39,34138,34138,285,0,31990,,,,20103,29464,,0,340110,285,,,,,,0,415664,0 +"2020-10-31","RI",1204,,3,,3358,3358,153,49,,19,403153,3151,,,1097607,,9,33408,,534,0,,,,,44320,,1141927,17620,1141927,17620,,,,,436561,3685,,0 +"2020-10-31","SC",3935,3686,39,249,10500,10500,789,48,,197,1625438,12672,71287,,1573073,,80,176612,167885,1018,0,8981,16670,,,220250,90994,,0,1802050,13690,80268,114891,,,,0,1793323,13500 +"2020-10-31","SD",425,,10,,2683,2683,415,23,,,213540,1443,,,,,,45992,44216,1433,0,,,,,49963,31194,,0,391904,5618,,,,,259532,2876,391904,5618 +"2020-10-31","TN",3353,3165,12,188,10306,10306,1589,42,,441,,0,,,3361082,,177,260672,245904,1184,0,,14144,,,295923,231887,,0,3657005,9518,,116423,,,,0,3657005,9518 +"2020-10-31","TX",18024,,90,,,,5696,0,,1631,,0,,,,,,900596,900596,7145,0,47137,32269,,,995996,782006,,0,8479525,79056,481608,410844,,,,0,8479525,79056 +"2020-10-31","UT",604,,3,,5463,5463,335,68,1138,132,932163,5580,,,1269749,437,,114656,,1724,0,,5429,,5202,119313,84101,,0,1389062,11569,,88644,,40083,1041740,7171,1389062,11569 +"2020-10-31","VA",3654,3398,11,256,12604,12604,1026,93,,228,,0,,,,,104,181190,167703,1551,0,11261,9296,,,199544,,2626052,19388,2626052,19388,153578,156735,,,,0,,0 +"2020-10-31","VI",21,,0,,,,,0,,,23054,197,,,,,,1376,,14,0,,,,,,1320,,0,24430,211,,,,,24460,213,,0 +"2020-10-31","VT",58,58,0,,,,4,0,,1,185957,985,,,,,,2195,2179,22,0,,,,,,1800,,0,408161,5108,,,,,188136,1007,408161,5108 +"2020-10-31","WA",2366,2366,7,,8522,8522,450,55,,114,,0,,,,,52,111607,109457,1245,0,,,,,,,2426385,21033,2426385,21033,,,,,,0,,0 +"2020-10-31","WI",2092,2031,63,61,11374,11374,1502,229,1479,349,1826636,9575,,,,,,237870,225370,5808,0,,,,,,175096,3289120,53451,3289120,53451,,,,,2052006,14853,,0 +"2020-10-31","WV",457,452,6,5,,,236,0,,73,,0,,,,,26,24460,22575,470,0,,,,,,18827,,0,774168,9218,19145,,,,,0,774168,9218 +"2020-10-31","WY",87,,0,,439,439,120,-1,,,117262,307,,,269649,,,13298,11276,270,0,,,,,14269,8541,,0,283918,798,,,,,128538,994,283918,798 +"2020-10-30","AK",81,81,4,,448,448,90,6,,,,0,,,572229,,6,14858,,377,0,,,,,13775,7096,,0,586323,2055,,,,,,0,586323,2055 +"2020-10-30","AL",2932,2735,18,197,20450,20450,1013,204,2061,,1172969,7071,,,,1187,,190496,162720,1347,0,,,,,,81005,,0,1335689,8254,,,64432,,1335689,8254,,0 +"2020-10-30","AR",1900,1737,6,163,7003,7003,649,36,,234,1234166,10464,,,1234166,834,96,110874,102405,1162,0,,,,9501,,99165,,0,1336571,11281,,,,58958,,0,1336571,11281 +"2020-10-30","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-30","AZ",5934,5641,16,293,21424,21424,900,164,,188,1520739,11912,,,,,99,244045,238356,1565,0,,,,,,,,0,2804634,28898,,,318796,,1759095,13433,2804634,28898 +"2020-10-30","CA",17571,,30,,,,3148,0,,772,,0,,,,,,916918,916918,4014,0,,,,,,,,0,18444523,120752,,,,,,0,18444523,120752 +"2020-10-30","CO",2278,1886,10,392,9031,9031,781,88,,,1110041,8846,170282,,,,,104426,97397,2412,0,13493,,,,,,1963585,27177,1963585,27177,183775,,,,1207438,11136,,0 +"2020-10-30","CT",4616,3708,7,908,12257,12257,329,0,,,,0,,,2497154,,,71207,67519,761,0,,,,,88405,,,0,2588634,33324,,,,,,0,2588634,33324 +"2020-10-30","DC",646,,1,,,,102,0,,30,,0,,,,,10,17144,,70,0,,,,,,13348,514130,4266,514130,4266,,,,,255048,1101,,0 +"2020-10-30","DE",704,617,15,87,,,101,0,,22,323776,1906,,,,,,24751,23594,198,0,,,,,26734,13074,550857,4020,550857,4020,,,,,348527,2104,,0 +"2020-10-30","FL",16927,,73,,49758,49758,2356,178,,,5284167,0,515517,501250,7884446,,,789714,755749,5383,0,58365,,56856,,1028626,,9943626,88022,9943626,88022,574229,,558367,,6073881,5383,8959108,77047 +"2020-10-30","GA",7955,,32,,31606,31606,1701,90,5940,,,0,,,,,,358225,358225,1377,0,29713,,,,334743,,,0,3535825,19663,330193,,,,,0,3535825,19663 +"2020-10-30","GU",79,,1,,,,92,0,,14,62401,565,,,,,4,4628,4579,79,0,7,49,,,,2666,,0,67029,644,206,409,,,,0,66618,637 +"2020-10-30","HI",215,215,2,,1090,1090,62,9,,15,,0,,,,,8,15116,14911,77,0,,,,,14852,11682,521859,4854,521859,4854,,,,,,0,,0 +"2020-10-30","IA",1706,,13,,,,606,0,,152,767067,3185,,62973,,,55,117185,117185,2203,0,,,3850,7759,,92387,,0,884252,5388,,,66863,79221,885919,5392,,0 +"2020-10-30","ID",615,571,16,44,2549,2549,286,35,546,72,326039,2018,,,,,,62746,54969,961,0,,,,,,29195,,0,381008,2794,,,,,381008,2794,515774,4633 +"2020-10-30","IL",9994,9711,49,283,,,3092,0,,673,,0,,,,,288,408660,402401,8489,0,,,,,,,,0,7637209,95111,,,,,,0,7637209,95111 +"2020-10-30","IN",4286,4050,26,236,16685,16685,1662,216,3248,517,1508890,10527,,,,,170,175893,,3163,0,,,,,168905,,,0,2863919,41067,,,,,1684783,13690,2863919,41067 +"2020-10-30","KS",1029,,22,,3832,3832,512,80,1067,145,557601,6613,,,,323,53,85181,,3136,0,,,,,,,,0,642782,9749,,,,,642782,9749,,0 +"2020-10-30","KY",1476,1455,15,21,7098,7098,974,29,1716,241,,0,,,,,,105242,88512,1937,0,,,,,,18407,,0,1876130,35029,86054,61814,,,,0,1876130,35029 +"2020-10-30","LA",5919,5705,11,214,,,612,0,,,2577022,11441,,,,,79,186649,182270,433,0,,,,,,168634,,0,2763671,11874,,,,,,0,2759292,11874 +"2020-10-30","MA",9975,9750,24,225,13253,13253,571,18,,106,2569972,18760,,,,,47,157146,153229,1582,0,,,,,198485,127054,,0,6009927,78604,,,127016,184974,2723201,20248,6009927,78604 +"2020-10-30","MD",4137,3990,10,147,17023,17023,513,52,,126,1782204,8743,,134409,,,,144314,144314,927,0,,,13664,,173940,8164,,0,3389678,28397,,,148073,,1926518,9670,3389678,28397 +"2020-10-30","ME",146,145,0,1,486,486,17,3,,5,,0,11780,,,,1,6570,5829,103,0,361,0,,,6886,5495,,0,610224,11400,12153,4,,,,0,610224,11400 +"2020-10-30","MI",7665,7309,12,356,,,1728,0,,398,,0,,,4668695,,167,193388,174388,3345,0,,,,,233697,114939,,0,4902392,62103,328693,,,,,0,4902392,62103 +"2020-10-30","MN",2437,2420,18,17,10119,10119,738,128,2665,176,1691334,13250,,,,,,145465,144862,3154,0,,,,,,125052,2774695,31826,2774695,31826,,28643,,,1836196,16323,,0 +"2020-10-30","MO",2925,,26,,,,1530,0,,479,1319082,6158,81716,,2284801,,200,180200,180200,2507,0,5501,7009,,,205382,,,0,2494866,20470,87421,41139,83459,28275,1499282,8665,2494866,20470 +"2020-10-30","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,92,92,0,0,,,,,,29,,0,16085,0,,,,,16085,0,22633,0 +"2020-10-30","MS",3328,2998,18,330,6576,6576,712,0,,173,804264,0,,,,,72,119336,104312,749,0,,,,,,101385,,0,923600,749,44238,94219,,,,0,908108,0 +"2020-10-30","MT",364,,27,,1327,1327,357,15,,,,0,,,,,,31916,,1063,0,,,,,,21102,,0,492629,5022,,,,,,0,492629,5022 +"2020-10-30","NC",4332,4257,49,75,,,1196,0,,343,,0,,,,,,271830,260709,2809,0,,,,,,,,0,3983645,43059,,29700,,,,0,3983645,43059 +"2020-10-30","ND",517,,13,,1586,1586,294,39,312,44,249455,1065,10173,,,,,42733,42403,1378,0,673,,,,,34696,823327,11315,823327,11315,10846,668,,,291938,2418,857502,11935 +"2020-10-30","NE",637,,9,,2977,2977,528,27,,,517948,3764,,,838992,,,68150,,1605,0,,,,,80454,43516,,0,920664,15374,,,,,586410,5368,920664,15374 +"2020-10-30","NH",482,,0,,777,777,30,2,254,,328600,108,,,,,,10884,10096,116,0,,,,,,9186,,0,609924,7194,33004,,32135,,338696,188,609924,7194 +"2020-10-30","NJ",16339,14546,7,1793,37613,37613,1058,64,,221,4337984,0,,,,,79,247762,236523,2398,0,,,,,,,,0,4585746,2398,,,,,,0,4572531,0 +"2020-10-30","NM",1007,,13,,4553,4553,334,61,,,,0,,,,,,45909,,1005,0,,,,,,21491,,0,1161887,8702,,,,,,0,1161887,8702 +"2020-10-30","NV",1777,,8,,,,594,0,,163,703799,3735,,,,,56,99786,99786,1232,0,,,,,,,1242709,11597,1242709,11597,,,,,803585,4967,,0 +"2020-10-30","NY",25804,,12,,89995,89995,1085,0,,243,,0,,,,,116,505431,,2255,0,,,,,,,14390756,146885,14390756,146885,,,,,,0,,0 +"2020-10-30","OH",5291,4979,16,312,18969,18969,1629,169,3841,427,,0,,,,,226,212782,200609,3845,0,,2493,,,223501,167035,,0,4411369,50792,,79911,,,,0,4411369,50792 +"2020-10-30","OK",1326,,20,,8778,8778,865,90,,301,1480280,14288,,,1480280,,,121495,,1302,0,4814,,,,134069,105137,,0,1601775,15590,87553,,,,,0,1618126,16350 +"2020-10-30","OR",673,,2,,3170,3170,235,36,,62,805002,7181,,,1355828,,23,43793,,565,0,,,,,69704,,,0,1425532,15306,,,,,846567,7713,1425532,15306 +"2020-10-30","PA",8784,,22,,,,1253,0,,,2297983,15155,,,,,131,205517,195944,2641,0,,,,,,156192,4070357,42165,4070357,42165,,,,,2493927,17488,,0 +"2020-10-30","PR",820,626,6,194,,,452,0,,60,305972,0,,,395291,,38,33853,33853,574,0,31890,,,,20103,28912,,0,339825,574,,,,,,0,415664,0 +"2020-10-30","RI",1201,,6,,3309,3309,152,37,,15,400002,2974,,,1080659,,9,32874,,562,0,,,,,43648,,1124307,17925,1124307,17925,,,,,432876,3536,,0 +"2020-10-30","SC",3896,3653,7,243,10452,10452,777,48,,196,1612766,13615,71021,,1560716,,93,175594,167057,1003,0,8901,16388,,,219107,90215,,0,1788360,14618,79922,112467,,,,0,1779823,14328 +"2020-10-30","SD",415,,12,,2660,2660,403,58,,,212097,1583,,,,,,44559,42896,1559,0,,,,,48530,30624,,0,386286,4559,,,,,256656,3142,386286,4559 +"2020-10-30","TN",3341,3156,78,185,10264,10264,1388,56,,428,,0,,,3352692,,171,259488,244886,2608,0,,13945,,,294795,229669,,0,3647487,24149,,114176,,,,0,3647487,24149 +"2020-10-30","TX",17934,,115,,,,5627,0,,1606,,0,,,,,,893451,893451,6631,0,46737,31586,,,987286,776580,,0,8400469,81689,480444,402315,,,,0,8400469,81689 +"2020-10-30","UT",601,,3,,5395,5395,338,76,1117,133,926583,7351,,,1259856,432,,112932,,2292,0,,5259,,5039,117637,82752,,0,1377493,15541,,85947,,39068,1034569,9212,1377493,15541 +"2020-10-30","VA",3643,3391,7,252,12511,12511,1065,57,,231,,0,,,,,107,179639,166551,1456,0,11198,9040,,,198437,,2606664,22859,2606664,22859,153190,153542,,,,0,,0 +"2020-10-30","VI",21,,0,,,,,0,,,22857,265,,,,,,1362,,9,0,,,,,,1315,,0,24219,274,,,,,24247,276,,0 +"2020-10-30","VT",58,58,0,,,,4,0,,2,184972,556,,,,,,2173,2157,19,0,,,,,,1789,,0,403053,4944,,,,,187129,572,403053,4944 +"2020-10-30","WA",2359,2359,6,,8467,8467,433,84,,112,,0,,,,,46,110362,108251,1102,0,,,,,,,2405352,22020,2405352,22020,,,,,,0,,0 +"2020-10-30","WI",2029,1972,26,57,11145,11145,1546,142,1463,350,1817061,13596,,,,,,232062,220092,5357,0,,,,,,171252,3235669,37568,3235669,37568,,,,,2037153,18692,,0 +"2020-10-30","WV",451,446,8,5,,,240,0,,75,,0,,,,,27,23990,22188,524,0,,,,,,18552,,0,764950,9551,19104,,,,,0,764950,9551 +"2020-10-30","WY",87,,0,,440,440,120,6,,,116955,0,,,269003,,,13028,11020,521,0,,,,,14117,8455,,0,283120,3685,,,,,127544,0,283120,3685 +"2020-10-29","AK",77,77,6,,442,442,89,8,,,,0,,,570308,,6,14481,,350,0,,,,,13641,7094,,0,584268,3669,,,,,,0,584268,3669 +"2020-10-29","AL",2914,2718,3,196,20246,20246,1013,130,2056,,1165898,5972,,,,1183,,189149,161537,1443,0,,,,,,81005,,0,1327435,7129,,,64185,,1327435,7129,,0 +"2020-10-29","AR",1894,1732,19,162,6967,6967,647,47,,226,1223702,11511,,,1223702,829,95,109712,101588,1072,0,,,,9092,,98340,,0,1325290,12348,,,,56296,,0,1325290,12348 +"2020-10-29","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-29","AZ",5918,5626,13,292,21260,21260,874,13,,186,1508827,13013,,,,,95,242480,236835,1315,0,,,,,,,,0,2775736,28512,,,318101,,1745662,14215,2775736,28512 +"2020-10-29","CA",17541,,66,,,,3083,0,,768,,0,,,,,,912904,912904,4191,0,,,,,,,,0,18323771,100175,,,,,,0,18323771,100175 +"2020-10-29","CO",2268,1880,19,388,8943,8943,742,89,,,1101195,9545,169651,,,,,102014,95107,1806,0,13404,,,,,,1936408,25425,1936408,25425,183055,,,,1196302,11259,,0 +"2020-10-29","CT",4609,3702,5,907,12257,12257,321,0,,,,0,,,2464993,,,70446,66896,1319,0,,,,,87329,,,0,2555310,38995,,,,,,0,2555310,38995 +"2020-10-29","DC",645,,1,,,,102,0,,28,,0,,,,,9,17074,,101,0,,,,,,13325,509864,4457,509864,4457,,,,,253947,1427,,0 +"2020-10-29","DE",689,608,1,81,,,99,0,,22,321870,1323,,,,,,24553,23405,161,0,,,,,26597,13008,546837,2057,546837,2057,,,,,346423,1484,,0 +"2020-10-29","FL",16854,,79,,49580,49580,2347,291,,,5284167,34210,515517,501250,7814747,,,784331,751557,4111,0,58365,,56856,,1021507,,9855604,81412,9855604,81412,574229,,558367,,6068498,38321,8882061,65632 +"2020-10-29","GA",7923,,47,,31516,31516,1777,146,5927,,,0,,,,,,356848,356848,1823,0,29569,,,,333316,,,0,3516162,20755,329039,,,,,0,3516162,20755 +"2020-10-29","GU",78,,1,,,,85,0,,14,61836,638,,,,,5,4549,4504,83,0,6,45,,,,2636,,0,66385,721,204,402,,,,0,65981,626 +"2020-10-29","HI",213,213,-2,,1081,1081,61,8,,15,,0,,,,,12,15039,14834,61,0,,,,,14776,11605,517005,4393,517005,4393,,,,,,0,,0 +"2020-10-29","IA",1693,,11,,,,605,0,,135,763882,3562,,62691,,,56,114982,114982,1940,0,,,3831,7349,,91449,,0,878864,5502,,,66562,77568,880527,5507,,0 +"2020-10-29","ID",599,555,14,44,2514,2514,286,31,546,72,324021,2160,,,,,,61785,54193,862,0,,,,,,28890,,0,378214,2814,,,,,378214,2814,511141,3862 +"2020-10-29","IL",9945,9675,56,270,,,3030,0,,643,,0,,,,,269,400171,395458,6363,0,,,,,,,,0,7542098,83056,,,,,,0,7542098,83056 +"2020-10-29","IN",4260,4024,33,236,16469,16469,1733,196,3204,508,1498363,10385,,,,,159,172730,,3618,0,,,,,166440,,,0,2822852,39104,,,,,1671093,14003,2822852,39104 +"2020-10-29","KS",1007,,0,,3752,3752,432,0,1043,120,550988,0,,,,318,40,82045,,0,0,,,,,,,,0,633033,0,,,,,633033,0,,0 +"2020-10-29","KY",1461,1440,19,21,7069,7069,969,61,1710,234,,0,,,,,,103305,86953,1811,0,,,,,,18277,,0,1841101,9732,85899,60572,,,,0,1841101,9732 +"2020-10-29","LA",5908,5694,18,214,,,612,0,,,2565581,13002,,,,,79,186216,181837,394,0,,,,,,168634,,0,2751797,13396,,,,,,0,2747418,13396 +"2020-10-29","MA",9951,9727,27,224,13235,13235,561,22,,99,2551212,17090,,,,,49,155564,151741,1346,0,,,,,196751,127054,,0,5931323,65752,,,126754,183029,2702953,18333,5931323,65752 +"2020-10-29","MD",4127,3980,12,147,16971,16971,502,61,,120,1773461,9934,,134409,,,,143387,143387,962,0,,,13664,,172797,8144,,0,3361281,27719,,,148073,,1916848,10896,3361281,27719 +"2020-10-29","ME",146,145,0,1,483,483,15,-1,,5,,0,10158,,,,2,6467,5749,80,0,350,0,,,6795,5462,,0,598824,8550,10520,2,,,,0,598824,8550 +"2020-10-29","MI",7653,7298,47,355,,,1332,0,,320,,0,,,4610674,,153,190043,171220,4109,0,,,,,229615,114939,,0,4840289,107564,327051,,,,,0,4840289,107564 +"2020-10-29","MN",2419,2404,32,15,9991,9991,867,136,2642,173,1678084,16024,,,,,,142311,141789,2867,0,,,,,,124379,2742869,29792,2742869,29792,,27581,,,1819873,18869,,0 +"2020-10-29","MO",2899,,29,,,,1490,0,,464,1312924,6320,81442,,2267061,,179,177693,177693,3061,0,5422,6661,,,202697,,,0,2474396,19969,87067,37742,83145,26900,1490617,9381,2474396,19969 +"2020-10-29","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,92,92,0,0,,,,,,29,,0,16085,0,,,,,16085,0,22633,0 +"2020-10-29","MS",3310,2985,8,325,6576,6576,699,0,,176,804264,40277,,,,,68,118587,103844,970,0,,,,,,101385,,0,922851,41247,44238,94219,,,,0,908108,40907 +"2020-10-29","MT",337,,12,,1312,1312,373,14,,,,0,,,,,,30853,,887,0,,,,,,20042,,0,487607,3137,,,,,,0,487607,3137 +"2020-10-29","NC",4283,4210,38,73,,,1181,0,,340,,0,,,,,,269021,258319,2885,0,,,,,,,,0,3940586,36669,,27145,,,,0,3940586,36669 +"2020-10-29","ND",504,,11,,1547,1547,287,28,308,41,248390,773,10140,,,,,41355,41051,1228,0,664,,,,,33860,812012,7845,812012,7845,10804,619,,,289520,1996,845567,8450 +"2020-10-29","NE",628,,8,,2950,2950,483,45,,,514184,2537,,,825406,,,66545,,1169,0,,,,,78673,42850,,0,905290,10905,,,,,581042,3704,905290,10905 +"2020-10-29","NH",482,,4,,775,775,30,0,253,,328492,2342,,,,,,10768,10016,127,0,,,,,,9180,,0,602730,7023,32973,,32108,,338508,2445,602730,7023 +"2020-10-29","NJ",16332,14539,8,1793,37549,37549,1072,64,,217,4337984,47370,,,,,79,245364,234547,1973,0,,,,,,,,0,4583348,49343,,,,,,0,4572531,48920 +"2020-10-29","NM",994,,3,,4492,4492,323,63,,,,0,,,,,,44904,,1078,0,,,,,,21389,,0,1153185,11999,,,,,,0,1153185,11999 +"2020-10-29","NV",1769,,3,,,,594,0,,162,700064,-707,,,,,64,98554,98554,1075,0,,,,,,,1231112,3423,1231112,3423,,,,,798618,368,,0 +"2020-10-29","NY",25792,,19,,89995,89995,1085,0,,237,,0,,,,,114,503176,,2499,0,,,,,,,14243871,168353,14243871,168353,,,,,,0,,0 +"2020-10-29","OH",5275,4963,19,312,18800,18800,1536,194,3816,416,,0,,,,,226,208937,196864,3590,0,,2200,,,219929,165302,,0,4360577,50112,,71024,,,,0,4360577,50112 +"2020-10-29","OK",1306,,20,,8688,8688,874,79,,305,1465992,9278,,,1465992,,,120193,,1041,0,4814,,,,132701,103919,,0,1586185,10319,87553,,,,,0,1601776,11154 +"2020-10-29","OR",671,,7,,3134,3134,206,23,,62,797821,3634,,,1341189,,19,43228,,420,0,,,,,69037,,,0,1410226,14259,,,,,838854,4029,1410226,14259 +"2020-10-29","PA",8762,,44,,,,1229,0,,,2282828,13582,,,,,127,202876,193611,2202,0,,,,,,156214,4028192,35925,4028192,35925,,,,,2476439,15547,,0 +"2020-10-29","PR",814,621,1,193,,,425,0,,63,305972,0,,,395291,,39,33279,33279,752,0,31519,,,,20103,28439,,0,339251,752,,,,,,0,415664,0 +"2020-10-29","RI",1195,,3,,3272,3272,139,16,,16,397028,2617,,,1063344,,9,32312,,368,0,,,,,43038,,1106382,14394,1106382,14394,,,,,429340,2985,,0 +"2020-10-29","SC",3889,3645,13,244,10404,10404,800,59,,202,1599151,18861,70886,,1547512,,97,174591,166344,1100,0,8874,16203,,,217983,89472,,0,1773742,19961,79760,109636,,,,0,1765495,19728 +"2020-10-29","SD",403,,19,,2602,2602,413,57,,,210514,1218,,,,,,43000,41507,1000,0,,,,,47273,30135,,0,381727,3581,,,,,253514,2218,381727,3581 +"2020-10-29","TN",3263,3087,22,176,10208,10208,1529,68,,432,,0,,,3331097,,173,256880,242575,2660,0,,13624,,,292241,227271,,0,3623338,28747,,109678,,,,0,3623338,28747 +"2020-10-29","TX",17819,,119,,,,5587,0,,1599,,0,,,,,,886820,886820,6826,0,46323,30780,,,978542,772350,,0,8318780,80804,476253,392149,,,,0,8318780,80804 +"2020-10-29","UT",598,,10,,5319,5319,338,72,1112,123,919232,8073,,,1246283,430,,110640,,1837,0,,5051,,4836,115669,81403,,0,1361952,14983,,82886,,37934,1025357,9973,1361952,14983 +"2020-10-29","VA",3636,3384,20,252,12454,12454,1082,70,,249,,0,,,,,108,178183,165384,1429,0,11141,8716,,,196941,,2583805,20492,2583805,20492,152722,148502,,,,0,,0 +"2020-10-29","VI",21,,0,,,,,0,,,22592,0,,,,,,1353,,0,0,,,,,,1311,,0,23945,0,,,,,23971,0,,0 +"2020-10-29","VT",58,58,0,,,,6,0,,2,184416,977,,,,,,2154,2141,16,0,,,,,,1778,,0,398109,2538,,,,,186557,993,398109,2538 +"2020-10-29","WA",2353,2353,16,,8383,8383,426,25,,112,,0,,,,,40,109260,107192,1075,0,,,,,,,2383332,20737,2383332,20737,,,,,,0,,0 +"2020-10-29","WI",2003,1948,60,55,11003,11003,1453,193,1465,330,1803465,8304,,,,,,226705,214996,5146,0,,,,,,168117,3198101,37721,3198101,37721,,,,,2018461,13174,,0 +"2020-10-29","WV",443,438,7,5,,,238,0,,84,,0,,,,,28,23466,21743,402,0,,,,,,18276,,0,755399,10754,19062,,,,,0,755399,10754 +"2020-10-29","WY",87,,10,,434,434,109,13,,,116955,3269,,,265691,,,12507,10589,361,0,,,,,13744,8236,,0,279435,4153,,,,,127544,4940,279435,4153 +"2020-10-28","AK",71,71,1,,434,434,80,9,,,,0,,,566887,,8,14131,,352,0,,,,,13393,7067,,0,580599,3170,,,,,,0,580599,3170 +"2020-10-28","AL",2911,2713,19,198,20116,20116,1013,142,2049,,1159926,6478,,,,1176,,187706,160380,1269,0,,,,,,74439,,0,1320306,7419,,,63860,,1320306,7419,,0 +"2020-10-28","AR",1875,1714,18,161,6920,6920,644,79,,228,1212191,9016,,,1212191,825,94,108640,100751,961,0,,,,8792,,97450,,0,1312942,9706,,,,53975,,0,1312942,9706 +"2020-10-28","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-28","AZ",5905,5614,14,291,21247,21247,871,75,,188,1495814,5774,,,,,94,241165,235633,1043,0,,,,,,,,0,2747224,29084,,,316805,,1731447,6800,2747224,29084 +"2020-10-28","CA",17475,,75,,,,2998,0,,770,,0,,,,,,908713,908713,4515,0,,,,,,,,0,18223596,96547,,,,,,0,18223596,96547 +"2020-10-28","CO",2249,1861,13,388,8854,8854,721,76,,,1091650,6629,169104,,,,,100208,93393,1475,0,13307,,,,,,1910983,18034,1910983,18034,182411,,,,1185043,7999,,0 +"2020-10-28","CT",4604,3697,9,907,12257,12257,309,0,,,,0,,,2427256,,,69127,66357,490,0,,,,,86143,9800,,0,2516315,45545,,,,,,0,2516315,45545 +"2020-10-28","DC",644,,0,,,,101,0,,25,,0,,,,,8,16973,,67,0,,,,,,13276,505407,2869,505407,2869,,,,,252520,988,,0 +"2020-10-28","DE",688,607,2,81,,,92,0,,22,320547,1655,,,,,,24392,23251,143,0,,,,,26499,12934,544780,2058,544780,2058,,,,,344939,1798,,0 +"2020-10-28","FL",16775,,66,,49289,49289,2340,212,,,5249957,34534,515517,501250,7754583,,,780220,748577,4005,0,58365,,56856,,1016138,,9774192,70701,9774192,70701,574229,,558367,,6030177,38539,8816429,57282 +"2020-10-28","GA",7876,,32,,31370,31370,1779,114,5888,,,0,,,,,,355025,355025,1653,0,29355,,,,331771,,,0,3495407,20516,327806,,,,,0,3495407,20516 +"2020-10-28","GU",77,,2,,,,86,0,,13,61198,571,,,,,6,4466,4432,48,0,6,34,,,,2618,,0,65664,619,204,307,,,,0,65355,619 +"2020-10-28","HI",215,215,3,,1073,1073,61,6,,15,,0,,,,,12,14978,14773,64,0,,,,,14717,11523,512612,4122,512612,4122,,,,,,0,,0 +"2020-10-28","IA",1682,,21,,,,596,0,,136,760320,2561,,62495,,,51,113042,113042,1781,0,,,3807,6949,,90532,,0,873362,4342,,,66342,75535,875020,4341,,0 +"2020-10-28","ID",585,541,5,44,2483,2483,272,36,542,75,321861,1370,,,,,,60923,53539,882,0,,,,,,28553,,0,375400,2063,,,,,375400,2063,507279,3855 +"2020-10-28","IL",9889,9619,51,270,,,2861,0,,600,,0,,,,,243,393808,389095,6110,0,,,,,,,,0,7459042,70752,,,,,,0,7459042,70752 +"2020-10-28","IN",4227,3991,33,236,16273,16273,1679,209,3155,470,1487978,8000,,,,,166,169112,,2548,0,,,,,163098,,,0,2783748,29437,,,,,1657090,10548,2783748,29437 +"2020-10-28","KS",1007,,31,,3752,3752,432,106,1043,120,550988,3733,,,,318,40,82045,,3369,0,,,,,,,,0,633033,7102,,,,,633033,7102,,0 +"2020-10-28","KY",1442,1421,14,21,7008,7008,927,61,1702,235,,0,,,,,,101494,85577,1857,0,,,,,,18165,,0,1831369,10141,85839,59010,,,,0,1831369,10141 +"2020-10-28","LA",5890,5676,18,214,,,613,0,,,2552579,14026,,,,,80,185822,181443,1098,0,,,,,,168634,,0,2738401,15124,,,,,,0,2734022,14478 +"2020-10-28","MA",9924,9700,36,224,13213,13213,582,53,,106,2534122,17508,,,,,49,154218,150498,1181,0,,,,,195310,122856,,0,5865571,84340,,,126476,180772,2684620,18645,5865571,84340 +"2020-10-28","MD",4115,3969,7,146,16910,16910,501,51,,114,1763527,7174,,134409,,,,142425,142425,684,0,,,13664,,171618,8117,,0,3333562,22419,,,148073,,1905952,7858,3333562,22419 +"2020-10-28","ME",146,145,0,1,484,484,16,5,,7,,0,10146,,,,0,6387,5670,76,0,349,0,,,6717,5441,,0,590274,7429,10507,2,,,,0,590274,7429 +"2020-10-28","MI",7606,7257,21,349,,,1332,0,,320,,0,,,4562068,,153,185934,167545,3590,0,,,,,225150,114939,,0,4732725,0,323494,,,,,0,4732725,0 +"2020-10-28","MN",2387,2373,19,14,9855,9855,680,126,2609,166,1662060,7518,,,,,,139444,138944,1908,0,,,,,,123529,2713077,14964,2713077,14964,,26920,,,1801004,9316,,0 +"2020-10-28","MO",2870,,32,,,,1446,0,,451,1306604,4916,81304,,2250415,,173,174632,174632,1915,0,5375,6434,,,199417,,,0,2454427,15848,86882,35726,82980,25800,1481236,6831,2454427,15848 +"2020-10-28","MP",2,2,0,,4,4,,0,,,15993,0,,,,,,92,92,0,0,,,,,,29,,0,16085,0,,,,,16085,0,22633,0 +"2020-10-28","MS",3302,2979,19,323,6576,6576,666,0,,157,763987,34443,,,,,62,117617,103214,1000,0,,,,,,101385,,0,881604,35443,42445,81884,,,,0,867201,39704 +"2020-10-28","MT",325,,20,,1298,1298,374,53,,,,0,,,,,,29966,,620,0,,,,,,19519,,0,484470,3148,,,,,,0,484470,3148 +"2020-10-28","NC",4245,4176,34,69,,,1193,0,,329,,0,,,,,,266136,255693,2253,0,,,,,,,,0,3903917,21589,,24967,,,,0,3903917,21589 +"2020-10-28","ND",493,,12,,1519,1519,284,41,304,41,247617,551,10058,,,,,40127,39839,818,0,632,,,,,33172,804167,7653,804167,7653,10690,572,,,287524,1328,837117,8065 +"2020-10-28","NE",620,,17,,2905,2905,436,30,,,511647,3386,,,815775,,,65376,,877,0,,,,,77406,42633,,0,894385,11765,,,,,577338,4262,894385,11765 +"2020-10-28","NH",478,,3,,775,775,29,4,250,,326150,1597,,,,,,10641,9913,110,0,,,,,,9129,,0,595707,5343,32940,,32082,,336063,1654,595707,5343 +"2020-10-28","NJ",16324,14531,18,1793,37485,37485,1010,71,,194,4290614,37132,,,,,80,243391,232997,2015,0,,,,,,,,0,4534005,39147,,,,,,0,4523611,38798 +"2020-10-28","NM",991,,11,,4429,4429,313,52,,,,0,,,,,,43826,,657,0,,,,,,21224,,0,1141186,11767,,,,,,0,1141186,11767 +"2020-10-28","NV",1766,,10,,,,565,0,,142,700771,2758,,,,,56,97479,97479,571,0,,,,,,,1227689,7246,1227689,7246,,,,,798250,3329,,0 +"2020-10-28","NY",25773,,15,,89995,89995,1085,0,,236,,0,,,,,120,500677,,2031,0,,,,,,,14075518,129660,14075518,129660,,,,,,0,,0 +"2020-10-28","OH",5256,4944,17,312,18606,18606,1536,173,3790,416,,0,,,,,224,205347,193451,2607,0,,1951,,,216481,163472,,0,4310465,31233,,61533,,,,0,4310465,31233 +"2020-10-28","OK",1286,,13,,8609,8609,885,69,,305,1456714,10647,,,1456714,,,119152,,743,0,4814,,,,131411,102792,,0,1575866,11390,87553,,,,,0,1590622,11710 +"2020-10-28","OR",664,,9,,3111,3111,215,20,,61,794187,6339,,,1327498,,26,42808,,372,0,,,,,68469,,,0,1395967,14799,,,,,834825,6697,1395967,14799 +"2020-10-28","PA",8718,,22,,,,1187,0,,,2269246,14723,,,,,114,200674,191646,2228,0,,,,,,154518,3992267,34011,3992267,34011,,,,,2460892,16720,,0 +"2020-10-28","PR",813,620,5,193,,,434,0,,61,305972,0,,,395291,,37,32527,32527,66,0,31060,,,,20103,28021,,0,338499,66,,,,,,0,415664,0 +"2020-10-28","RI",1192,,4,,3256,3256,136,27,,18,394411,2387,,,1049453,,8,31944,,499,0,,,,,42535,,1091988,14318,1091988,14318,,,,,426355,2886,,0 +"2020-10-28","SC",3876,3634,34,242,10345,10345,810,59,,201,1580290,7843,70568,,1529192,,95,173491,165477,912,0,8797,16016,,,216575,88761,,0,1753781,8755,79365,106595,,,,0,1745767,8518 +"2020-10-28","SD",384,,9,,2545,2545,412,62,,,209296,861,,,,,,42000,40589,1270,0,,,,,46285,29683,,0,378146,3437,,,,,251296,2131,378146,3437 +"2020-10-28","TN",3241,3067,34,174,10140,10140,1384,78,,384,,0,,,3305080,,171,254220,240198,2446,0,,13309,,,289511,224822,,0,3594591,22000,,105788,,,,0,3594591,22000 +"2020-10-28","TX",17700,,105,,,,5650,0,,1636,,0,,,,,,879994,879994,5627,0,45489,30193,,,970102,767905,,0,8237976,87362,473079,384461,,,,0,8237976,87362 +"2020-10-28","UT",588,,10,,5247,5247,316,78,1098,117,911159,4992,,,1233303,425,,108803,,1575,0,,4834,,4624,113666,79918,,0,1346969,9731,,80390,,36675,1015384,6236,1346969,9731 +"2020-10-28","VA",3616,3364,16,252,12384,12384,1068,64,,252,,0,,,,,113,176754,164308,1345,0,11065,8419,,,195768,,2563313,19798,2563313,19798,152222,144018,,,,0,,0 +"2020-10-28","VI",21,,0,,,,,0,,,22592,284,,,,,,1353,,2,0,,,,,,1311,,0,23945,286,,,,,23971,273,,0 +"2020-10-28","VT",58,58,0,,,,8,0,,,183439,524,,,,,,2138,2125,11,0,,,,,,1768,,0,395571,4609,,,,,185564,535,395571,4609 +"2020-10-28","WA",2337,2337,16,,8358,8358,417,36,,100,,0,,,,,44,108185,106157,1133,0,,,,,,,2362595,-10001,2362595,-10001,,,,,,0,,0 +"2020-10-28","WI",1943,1897,48,46,10810,10810,1439,174,1453,339,1795161,6003,,,,,,221559,210126,4130,0,,,,,,164726,3160380,22005,3160380,22005,,,,,2005287,9818,,0 +"2020-10-28","WV",436,432,4,4,,,226,0,,83,,0,,,,,27,23064,21409,358,0,,,,,,18071,,0,744645,5105,18984,,,,,0,744645,5105 +"2020-10-28","WY",77,,0,,421,421,104,10,,,113686,0,,,261985,,,12146,10288,340,0,,,,,13297,8105,,0,275282,4412,,,,,122604,0,275282,4412 +"2020-10-27","AK",70,70,2,,425,425,81,1,,,,0,,,563865,,8,13779,,388,0,,,,,13245,7016,,0,577429,6585,,,,,,0,577429,6585 +"2020-10-27","AL",2892,2699,26,193,19974,19974,1001,0,2035,,1153448,4455,,,,1164,,186437,159439,1115,0,,,,,,74439,,0,1312887,5193,,,63683,,1312887,5193,,0 +"2020-10-27","AR",1857,1696,24,161,6841,6841,660,73,,232,1203175,7740,,,1203175,819,89,107679,100061,952,0,,,,8484,,96322,,0,1303236,8391,,,,49893,,0,1303236,8391 +"2020-10-27","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-27","AZ",5891,5601,16,290,21172,21172,861,75,,187,1490040,8719,,,,,100,240122,234607,1158,0,,,,,,,,0,2718140,28065,,,316145,,1724647,9846,2718140,28065 +"2020-10-27","CA",17400,,43,,,,3000,0,,774,,0,,,,,,904198,904198,3188,0,,,,,,,,0,18127049,144220,,,,,,0,18127049,144220 +"2020-10-27","CO",2236,1850,10,386,8778,8778,648,120,,,1085021,6971,168744,,,,,98733,92023,1433,0,13243,,,,,,1892949,18848,1892949,18848,181987,,,,1177044,8319,,0 +"2020-10-27","CT",4595,3687,6,908,12257,12257,292,0,,,,0,,,2382930,,,68637,65901,538,0,,,,,85038,9800,,0,2470770,39500,,,,,,0,2470770,39500 +"2020-10-27","DC",644,,2,,,,106,0,,26,,0,,,,,7,16906,,94,0,,,,,,13215,502538,4348,502538,4348,,,,,251532,1489,,0 +"2020-10-27","DE",686,605,1,81,,,93,0,,20,318892,989,,,,,,24249,23114,81,0,,,,,26432,12846,542722,3323,542722,3323,,,,,343141,1070,,0 +"2020-10-27","FL",16709,,57,,49077,49077,2316,235,,,5215423,12687,487730,475588,7702522,,,776215,745829,4226,0,51923,,50676,,1011016,,9703491,64541,9703491,64541,539844,,526404,,5991638,22398,8759147,54792 +"2020-10-27","GA",7844,,17,,31256,31256,1823,169,5859,,,0,,,,,,353372,353372,1491,0,29271,,,,330641,,,0,3474891,13503,327268,,,,,0,3474891,13503 +"2020-10-27","GU",75,,0,,,,81,0,,16,60627,509,,,,,5,4418,4384,82,0,6,34,,,,2611,,0,65045,591,204,307,,,,0,64736,584 +"2020-10-27","HI",212,212,0,,1067,1067,64,2,,15,,0,,,,,10,14914,14709,37,0,,,,,14655,11444,508490,3235,508490,3235,,,,,,0,,0 +"2020-10-27","IA",1661,,13,,,,564,0,,128,757759,1840,,62237,,,46,111261,111261,857,0,,,3796,6521,,89490,,0,869020,2697,,,66073,73681,870679,2712,,0 +"2020-10-27","ID",580,536,7,44,2447,2447,272,16,539,75,320491,2012,,,,,,60041,52846,697,0,,,,,,28309,,0,373337,2596,,,,,373337,2596,503424,5167 +"2020-10-27","IL",9838,9568,46,270,,,2758,0,,595,,0,,,,,241,387698,382985,4000,0,,,,,,,,0,7388290,62074,,,,,,0,7388290,62074 +"2020-10-27","IN",4194,3958,51,236,16064,16064,1687,159,3135,494,1479978,6327,,,,,156,166564,,1983,0,,,,,160768,,,0,2754311,19366,,,,,1646542,8310,2754311,19366 +"2020-10-27","KS",976,,0,,3646,3646,362,0,1009,103,547255,0,,,,313,39,78676,,0,0,,,,,,,,0,625931,0,,,,,625931,0,,0 +"2020-10-27","KY",1428,1408,18,20,6947,6947,913,52,1694,233,,0,,,,,,99637,84177,1771,0,,,,,,18045,,0,1821228,11357,85579,57656,,,,0,1821228,11357 +"2020-10-27","LA",5872,5666,18,206,,,600,0,,,2538553,19789,,,,,91,184724,180991,922,0,,,,,,165282,,0,2723277,20711,,,,,,0,2719544,20711 +"2020-10-27","MA",9888,9664,7,224,13160,13160,567,0,,109,2516614,12702,,,,,47,153037,149361,1260,0,,,,,193911,122856,,0,5781231,57358,,,126155,178728,2665975,13727,5781231,57358 +"2020-10-27","MD",4108,3962,9,146,16859,16859,471,40,,105,1756353,8826,,131954,,,,141741,141741,897,0,,,13261,,170766,8099,,0,3311143,23187,,,145215,,1898094,9723,3311143,23187 +"2020-10-27","ME",146,145,0,1,479,479,12,2,,5,,0,10136,,,,0,6311,5593,57,0,349,0,,,6637,5399,,0,582845,6725,10497,2,,,,0,582845,6725 +"2020-10-27","MI",7585,7239,33,346,,,1332,0,,320,,0,,,4511126,,146,182344,164274,2675,0,,,,,221599,114939,,0,4732725,41246,323494,,,,,0,4732725,41246 +"2020-10-27","MN",2368,2354,15,14,9729,9729,658,141,2589,165,1654542,5602,,,,,,137536,137146,2164,0,,,,,,122100,2698113,14099,2698113,14099,,26207,,,1791688,7755,,0 +"2020-10-27","MO",2838,,28,,,,1407,0,,449,1301688,6761,80994,,2236660,,162,172717,172717,1695,0,5327,6208,,,197358,,,0,2438579,17968,86524,33883,82654,25040,1474405,8456,2438579,17968 +"2020-10-27","MP",2,2,0,,4,4,,0,,,15993,270,,,,,,92,92,0,0,,,,,,29,,0,16085,270,,,,,16085,274,22633,421 +"2020-10-27","MS",3283,2964,20,319,6576,6576,678,0,,159,729544,0,,,,,63,116617,102599,854,0,,,,,,101385,,0,846161,854,41053,72982,,,,0,827497,0 +"2020-10-27","MT",305,,2,,1245,1245,350,8,,,,0,,,,,,29346,,845,0,,,,,,18981,,0,481322,4997,,,,,,0,481322,4997 +"2020-10-27","NC",4211,4144,41,67,,,1214,0,,329,,0,,,,,,263883,253847,2141,0,,,,,,,,0,3882328,25050,,23444,,,,0,3882328,25050 +"2020-10-27","ND",481,,14,,1478,1478,283,41,297,37,247066,829,10058,,,,,39309,39057,903,0,632,,,,,32339,796514,5978,796514,5978,10690,495,,,286196,1718,829052,6447 +"2020-10-27","NE",603,,7,,2875,2875,427,29,,,508261,2224,,,804996,,,64499,,702,0,,,,,76425,42245,,0,882620,9055,,,,,573076,2924,882620,9055 +"2020-10-27","NH",475,,0,,771,771,31,3,248,,324553,1186,,,,,,10531,9856,134,0,,,,,,8989,,0,590364,5154,32897,,32004,,334409,1294,590364,5154 +"2020-10-27","NJ",16306,14517,14,1789,37414,37414,957,104,,182,4253482,27932,,,,,68,241376,231331,2081,0,,,,,,,,0,4494858,30013,,,,,,0,4484813,29579 +"2020-10-27","NM",980,,4,,4377,4377,307,56,,,,0,,,,,,43169,,583,0,,,,,,21063,,0,1129419,4497,,,,,,0,1129419,4497 +"2020-10-27","NV",1756,,7,,,,568,0,,144,698013,2870,,,,,58,96908,96908,730,0,,,,,,,1220443,8006,1220443,8006,,,,,794921,3600,,0 +"2020-10-27","NY",25758,,16,,89995,89995,1083,0,,233,,0,,,,,120,498646,,1991,0,,,,,,,13945858,111618,13945858,111618,,,,,,0,,0 +"2020-10-27","OH",5239,4927,22,312,18433,18433,1456,198,3771,418,,0,,,,,225,202740,191069,2509,0,,1705,,,214306,161704,,0,4279232,35811,,52939,,,,0,4279232,35811 +"2020-10-27","OK",1273,,22,,8540,8540,907,132,,286,1446067,29043,,,1446067,,,118409,,1010,0,4814,,,,130528,101656,,0,1564476,30053,87553,,,,,0,1578912,32674 +"2020-10-27","OR",655,,2,,3091,3091,214,57,,49,787848,4699,,,1313219,,22,42436,,335,0,,,,,67949,,,0,1381168,8408,,,,,828128,15014,1381168,8408 +"2020-10-27","PA",8696,,23,,,,1170,0,,,2254523,13093,,,,,110,198446,189649,2751,0,,,,,,152803,3958256,38899,3958256,38899,,,,,2444172,15566,,0 +"2020-10-27","PR",808,616,4,192,,,395,0,,59,305972,0,,,395291,,38,32461,32461,263,0,31036,,,,20103,27607,,0,338433,263,,,,,,0,415664,0 +"2020-10-27","RI",1188,,4,,3229,3229,168,21,,14,392024,3156,,,1035676,,8,31445,,421,0,,,,,41994,,1077670,10528,1077670,10528,,,,,423469,3577,,0 +"2020-10-27","SC",3842,3602,19,240,10286,10286,746,50,,188,1572447,10716,70328,,1521519,,93,172579,164802,1078,0,8661,15735,,,215730,87892,,0,1745026,11794,78989,103477,,,,0,1737249,11572 +"2020-10-27","SD",375,,0,,2483,2483,395,30,,,208435,1082,,,,,,40730,39494,989,0,,,,,45371,29167,,0,374709,3086,,,,,249165,2071,374709,3086 +"2020-10-27","TN",3207,3037,44,170,10062,10062,1374,77,,393,,0,,,3285430,,162,251774,238124,1908,0,,12933,,,287161,222348,,0,3572591,16504,,100419,,,,0,3572591,16504 +"2020-10-27","TX",17595,,81,,,,5512,0,,1601,,0,,,,,,874367,874367,7292,0,45215,29591,,,962580,763108,,0,8150614,87326,470883,375346,,,,0,8150614,87326 +"2020-10-27","UT",578,,4,,5169,5169,309,67,1083,111,906167,5448,,,1224882,423,,107228,,1145,0,,4622,,4419,112356,78946,,0,1337238,3119,,77271,,35547,1009148,6588,1337238,3119 +"2020-10-27","VA",3600,3350,19,250,12320,12320,1081,60,,230,,0,,,,,106,175409,163339,1134,0,11035,8062,,,194517,,2543515,18094,2543515,18094,152030,137698,,,,0,,0 +"2020-10-27","VI",21,,0,,,,,0,,,22308,39,,,,,,1351,,3,0,,,,,,1308,,0,23659,42,,,,,23698,55,,0 +"2020-10-27","VT",58,58,0,,,,4,0,,,182915,858,,,,,,2127,2114,31,0,,,,,,1766,,0,390962,1725,,,,,185029,887,390962,1725 +"2020-10-27","WA",2321,2321,25,,8322,8322,422,42,,88,,0,,,,,37,107052,105066,348,0,,,,,,,2372596,12209,2372596,12209,,,,,,0,,0 +"2020-10-27","WI",1895,1852,71,43,10636,10636,1385,220,1442,339,1789158,11266,,,,,,217429,206311,5501,0,,,,,,161260,3138375,34693,3138375,34693,,,,,1995469,16528,,0 +"2020-10-27","WV",432,428,8,4,,,221,0,,74,,0,,,,,26,22706,21160,483,0,,,,,,17846,,0,739540,7271,18965,,,,,0,739540,7271 +"2020-10-27","WY",77,,0,,411,411,105,10,,,113686,0,,,257988,,,11806,10035,329,0,,,,,12882,7906,,0,270870,5411,,,,,122604,0,270870,5411 +"2020-10-26","AK",68,68,0,,424,424,50,3,,,,0,,,557753,,9,13391,,350,0,,,,,12773,6948,,0,570844,10875,,,,,,0,570844,10875 +"2020-10-26","AL",2866,2680,0,186,19974,19974,967,379,2025,,1148993,4208,,,,1159,,185322,158701,967,0,,,,,,74439,,0,1307694,5028,,,63683,,1307694,5028,,0 +"2020-10-26","AR",1833,1676,21,157,6768,6768,634,50,,255,1195435,6315,,,1195435,812,97,106727,99410,612,0,,,,8126,,95314,,0,1294845,6845,,,,47404,,0,1294845,6845 +"2020-10-26","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-26","AZ",5875,5587,1,288,21097,21097,837,11,,179,1481321,7615,,,,,97,238964,233480,801,0,,,,,,,,0,2690075,8960,,,314045,,1714801,8394,2690075,8960 +"2020-10-26","CA",17357,,12,,,,2991,0,,735,,0,,,,,,901010,901010,2981,0,,,,,,,,0,17982829,194944,,,,,,0,17982829,194944 +"2020-10-26","CO",2226,1843,3,383,8658,8658,591,36,,,1078050,16905,168532,,,,,97300,90675,2211,0,13218,,,,,,1874101,31847,1874101,31847,181750,,,,1168725,19096,,0 +"2020-10-26","CT",4589,3683,12,906,12257,12257,270,0,,,,0,,,2344610,,,68099,65421,2047,0,,,,,83929,9800,,0,2431270,10290,,,,,,0,2431270,10290 +"2020-10-26","DC",642,,0,,,,98,0,,23,,0,,,,,12,16812,,45,0,,,,,,13179,498190,1958,498190,1958,,,,,250043,471,,0 +"2020-10-26","DE",685,604,4,81,,,108,0,,19,317903,2523,,,,,,24168,23036,207,0,,,,,26323,12732,539399,6187,539399,6187,,,,,342071,2730,,0 +"2020-10-26","FL",16652,,20,,48842,48842,2258,76,,,5202736,28649,487730,475588,7653423,,,771989,742588,3336,0,51923,,50676,,1005534,,9638950,56560,9638950,56560,539844,,526404,,5969240,31974,8704355,46833 +"2020-10-26","GA",7827,,18,,31087,31087,1740,19,5829,,,0,,,,,,351881,351881,958,0,29146,,,,329506,,,0,3461388,16356,326408,,,,,0,3461388,16356 +"2020-10-26","GU",75,,4,,,,77,0,,17,60118,840,,,,,6,4336,4308,120,0,6,28,,,,2603,,0,64454,960,204,300,,,,0,64152,1538 +"2020-10-26","HI",212,212,0,,1065,1065,64,0,,15,,0,,,,,10,14877,14672,119,0,,,,,14617,11405,505255,4799,505255,4799,,,,,,0,,0 +"2020-10-26","IA",1648,,14,,,,561,0,,129,755919,2215,,62105,,,45,110404,110404,747,0,,,3780,6299,,88124,,0,866323,2962,,,65924,72763,867967,2963,,0 +"2020-10-26","ID",573,528,1,45,2431,2431,272,22,535,75,318479,1646,,,,,,59344,52262,650,0,,,,,,28056,,0,370741,2172,,,,,370741,2172,498257,2296 +"2020-10-26","IL",9792,9522,17,270,,,2638,0,,589,,0,,,,,238,383698,378985,4729,0,,,,,,,,0,7326216,57264,,,,,,0,7326216,57264 +"2020-10-26","IN",4143,3907,13,236,15905,15905,1634,138,3115,500,1473651,6790,,,,,164,164581,,1974,0,,,,,159199,,,0,2734945,23867,,,,,1638232,8764,2734945,23867 +"2020-10-26","KS",976,,1,,3646,3646,362,62,1009,103,547255,7223,,,,313,39,78676,,2446,0,,,,,,,,0,625931,9669,,,,,625931,9669,,0 +"2020-10-26","KY",1410,1391,3,19,6895,6895,858,30,1689,253,,0,,,,,,97866,82892,924,0,,,,,,17881,,0,1809871,24685,82558,45138,,,,0,1809871,24685 +"2020-10-26","LA",5854,5648,17,206,,,609,0,,,2518764,4832,,,,,71,183802,180069,227,0,,,,,,165282,,0,2702566,5059,,,,,,0,2698833,5059 +"2020-10-26","MA",9881,9657,17,224,13160,13160,550,18,,105,2503912,18870,,,,,43,151777,148336,1212,0,,,,,192778,122856,,0,5723873,55858,,,125973,174754,2652248,20086,5723873,55858 +"2020-10-26","MD",4099,3953,3,146,16819,16819,456,62,,112,1747527,8877,,131954,,,,140844,140844,565,0,,,13261,,169684,8067,,0,3287956,21807,,,145215,,1888371,9442,3287956,21807 +"2020-10-26","ME",146,145,0,1,477,477,13,2,,5,,0,10132,,,,0,6254,5551,53,0,349,0,,,6598,5363,,0,576120,2531,10493,1,,,,0,576120,2531 +"2020-10-26","MI",7552,7211,30,341,,,1332,0,,320,,0,,,4472719,,140,179669,161907,4057,0,,,,,218760,114939,,0,4691479,72917,322810,,,,,0,4691479,72917 +"2020-10-26","MN",2353,2339,4,14,9588,9588,614,77,2558,149,1648940,12009,,,,,,135372,134993,1570,0,,,,,,120421,2684014,23691,2684014,23691,,26163,,,1783933,13571,,0 +"2020-10-26","MO",2810,,5,,,,1399,0,,481,1294927,5582,80898,,2220575,,174,171022,171022,1527,0,5299,6020,,,195500,,,0,2420611,13764,86397,31184,82540,23755,1465949,7109,2420611,13764 +"2020-10-26","MP",2,2,0,,4,4,,0,,,15723,0,,,,,,92,92,4,0,,,,,,29,,0,15815,4,,,,,15811,0,22212,0 +"2020-10-26","MS",3263,2951,8,312,6576,6576,679,196,,157,729544,0,,,,,66,115763,102211,675,0,,,,,,101385,,0,845307,675,41053,72982,,,,0,827497,0 +"2020-10-26","MT",303,,6,,1237,1237,360,8,,,,0,,,,,,28501,,621,0,,,,,,18343,,0,476325,10718,,,,,,0,476325,10718 +"2020-10-26","NC",4170,4108,13,62,,,1193,0,,332,,0,,,,,,261742,251937,1643,0,,,,,,,,0,3857278,30029,,22972,,,,0,3857278,30029 +"2020-10-26","ND",467,,6,,1437,1437,256,20,293,38,246237,546,10058,,,,,38406,38165,532,0,632,,,,,31334,790536,6379,790536,6379,10690,465,,,284478,1084,822605,6696 +"2020-10-26","NE",596,,1,,2846,2846,435,13,,,506037,1826,,,796729,,,63797,,582,0,,,,,75643,41930,,0,873565,4402,,,,,570152,2408,873565,4402 +"2020-10-26","NH",475,,2,,768,768,25,2,247,,323367,1502,,,,,,10397,9748,69,0,,,,,,8920,,0,585210,6024,32866,,32015,,333115,1554,585210,6024 +"2020-10-26","NJ",16292,14503,7,1789,37310,37310,948,23,,178,4225550,68136,,,,,75,239295,229684,1495,0,,,,,,,,0,4464845,69631,,,,,,0,4455234,69352 +"2020-10-26","NM",976,,9,,4321,4321,289,44,,,,0,,,,,,42586,,723,0,,,,,,20910,,0,1124922,6078,,,,,,0,1124922,6078 +"2020-10-26","NV",1749,,1,,,,531,0,,148,695143,2977,,,,,64,96178,96178,475,0,,,,,,,1212437,7691,1212437,7691,,,,,791321,3452,,0 +"2020-10-26","NY",25742,,12,,89995,89995,1059,0,,237,,0,,,,,118,496655,,1191,0,,,,,,,13834240,82117,13834240,82117,,,,,,0,,0 +"2020-10-26","OH",5217,4907,11,310,18235,18235,1406,140,3751,408,,0,,,,,216,200231,188738,2116,0,,1565,,,212090,159877,,0,4243421,43407,,51247,,,,0,4243421,43407 +"2020-10-26","OK",1251,,2,,8408,8408,924,22,,305,1417024,0,,,1417024,,,117399,,663,0,4814,,,,127051,100357,,0,1534423,663,87553,,,,,0,1546238,0 +"2020-10-26","OR",653,,0,,3034,3034,197,0,,53,783149,3746,,,1305145,,21,42101,,362,0,,,,,67615,,,0,1372760,12124,,,,,813114,0,1372760,12124 +"2020-10-26","PA",8673,,7,,,,1138,0,,,2241430,11453,,,,,108,195695,187176,1407,0,,,,,,152642,3919357,26971,3919357,26971,,,,,2428606,12763,,0 +"2020-10-26","PR",804,612,3,192,,,356,0,,58,305972,0,,,395291,,45,32198,32198,461,0,30937,,,,20103,27603,,0,338170,461,,,,,,0,415664,0 +"2020-10-26","RI",1184,,1,,3208,3208,163,0,,14,388868,1305,,,1025570,,8,31024,,167,0,,,,,41572,,1067142,3925,1067142,3925,,,,,419892,1472,,0 +"2020-10-26","SC",3823,3587,21,236,10236,10236,737,12,,201,1561731,25995,70263,,1511121,,93,171501,163946,823,0,8624,15411,,,214556,86928,,0,1733232,26818,78887,99939,,,,0,1725677,26798 +"2020-10-26","SD",375,,0,,2453,2453,377,17,,,207353,626,,,,,,39741,38504,538,0,,,,,44507,28305,,0,371623,4464,,,,,247094,1164,371623,4464 +"2020-10-26","TN",3163,2999,32,164,9985,9985,1228,44,,366,,0,,,3270812,,161,249866,236518,2279,0,,12548,,,285275,219230,,0,3556087,22618,,94352,,,,0,3556087,22618 +"2020-10-26","TX",17514,,10,,,,5278,0,,1545,,0,,,,,,867075,867075,4700,0,44950,28917,,,953479,758192,,0,8063288,26595,468501,365010,,,,0,8063288,26595 +"2020-10-26","UT",574,,2,,5102,5102,311,53,1067,112,900719,4362,,,1222143,419,,106083,,1201,0,,4476,,4279,111976,78212,,0,1334119,4659,,75058,,34696,1002560,5392,1334119,4659 +"2020-10-26","VA",3581,3331,2,250,12260,12260,1048,27,,230,,0,,,,,114,174275,162427,904,0,11027,7711,,,193427,,2525421,15308,2525421,15308,151884,132820,,,,0,,0 +"2020-10-26","VI",21,,0,,,,,0,,,22269,180,,,,,,1348,,2,0,,,,,,1305,,0,23617,182,,,,,23643,180,,0 +"2020-10-26","VT",58,58,0,,,,11,0,,,182057,415,,,,,,2096,2085,9,0,,,,,,1741,,0,389237,771,,,,,184142,424,389237,771 +"2020-10-26","WA",2296,2296,0,,8280,8280,389,0,,100,,0,,,,,43,106704,104735,589,0,,,,,,,2360387,0,2360387,0,,,,,,0,,0 +"2020-10-26","WI",1824,1788,11,36,10416,10416,1350,84,1424,329,1777892,9866,,,,,,211928,201049,3011,0,,,,,,158158,3103682,27878,3103682,27878,,,,,1978941,12749,,0 +"2020-10-26","WV",424,420,1,4,,,215,0,,71,,0,,,,,23,22223,20814,317,0,,,,,,16768,,0,732269,13070,18884,,,,,0,732269,13070 +"2020-10-26","WY",77,,9,,401,401,102,7,,,113686,0,,,253073,,,11477,9783,436,0,,,,,12386,7675,,0,265459,6055,,,,,122604,0,265459,6055 +"2020-10-25","AK",68,68,0,,421,421,58,2,,,,0,,,547543,,9,13041,,518,0,,,,,12110,6946,,0,559969,7223,,,,,,0,559969,7223 +"2020-10-25","AL",2866,2680,0,186,19595,19595,922,0,2022,,1144785,5863,,,,1157,,184355,157881,1079,0,,,,,,74439,,0,1302666,6798,,,63508,,1302666,6798,,0 +"2020-10-25","AR",1812,1655,15,157,6718,6718,618,11,,244,1189120,7315,,,1189120,808,91,106115,98880,797,0,,,,8031,,94528,,0,1288000,7982,,,,46772,,0,1288000,7982 +"2020-10-25","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-25","AZ",5874,5586,5,288,21086,21086,828,43,,181,1473706,11512,,,,,91,238163,232701,1391,0,,,,,,,,0,2681115,13744,,,313239,,1706407,12858,2681115,13744 +"2020-10-25","CA",17345,,34,,,,2969,0,,722,,0,,,,,,898029,898029,5219,0,,,,,,,,0,17787885,178706,,,,,,0,17787885,178706 +"2020-10-25","CO",2223,1839,5,384,8622,8622,586,24,,,1061145,10390,167544,,,,,95089,88484,1689,0,12921,,,,,,1842254,24058,1842254,24058,180465,,,,1149629,12059,,0 +"2020-10-25","CT",4577,3674,0,903,12257,12257,233,0,,,,0,,,2334776,,,66052,63376,0,0,,,,,83488,9800,,0,2420980,11294,,,,,,0,2420980,11294 +"2020-10-25","DC",642,,0,,,,95,0,,21,,0,,,,,8,16767,,61,0,,,,,,13104,496232,4679,496232,4679,,,,,249572,1383,,0 +"2020-10-25","DE",681,600,1,81,,,103,0,,21,315380,1951,,,,,,23961,22838,114,0,,,,,26149,12643,533212,4782,533212,4782,,,,,339341,2065,,0 +"2020-10-25","FL",16632,,12,,48766,48766,2219,82,,,5174087,12277,487730,475588,7611074,,,768653,739764,2348,0,51923,,50676,,1001127,,9582390,50215,9582390,50215,539844,,526404,,5937266,14632,8657522,38842 +"2020-10-25","GA",7809,,1,,31068,31068,1668,22,5825,,,0,,,,,,350923,350923,1318,0,29049,,,,328321,,,0,3445032,18922,325899,,,,,0,3445032,18922 +"2020-10-25","GU",71,,0,,,,77,0,,17,59278,213,,,,,6,4216,4196,41,0,6,20,,,,2503,,0,63494,254,203,290,,,,0,62614,0 +"2020-10-25","HI",212,212,3,,1065,1065,64,8,,15,,0,,,,,10,14758,14553,89,0,,,,,14497,11346,500456,4163,500456,4163,,,,,,0,,0 +"2020-10-25","IA",1634,,3,,,,541,0,,119,753704,2799,,62080,,,42,109657,109657,1143,0,,,3772,6187,,87739,,0,863361,3942,,,65891,72039,865004,3937,,0 +"2020-10-25","ID",572,527,10,45,2409,2409,259,22,530,66,316833,1688,,,,,,58694,51736,1021,0,,,,,,27760,,0,368569,2522,,,,,368569,2522,495961,3500 +"2020-10-25","IL",9775,9505,24,270,,,2605,0,,565,,0,,,,,214,378969,374256,4062,0,,,,,,,,0,7268952,72097,,,,,,0,7268952,72097 +"2020-10-25","IN",4130,3894,12,236,15767,15767,1666,140,3093,500,1466861,8984,,,,,165,162607,,2153,0,,,,,157582,,,0,2711078,29881,,,,,1629468,11137,2711078,29881 +"2020-10-25","KS",975,,0,,3584,3584,403,0,1001,2,540032,0,,,,309,41,76230,,0,0,,,,,,,,0,616262,0,,,,,616262,0,,0 +"2020-10-25","KY",1407,1388,3,19,6865,6865,840,0,1681,208,,0,,,,,,96942,82087,1462,0,,,,,,17723,,0,1785186,0,82256,43446,,,,0,1785186,0 +"2020-10-25","LA",5837,5631,17,206,,,596,0,,,2513932,25297,,,,,66,183575,179842,972,0,,,,,,165282,,0,2697507,26269,,,,,,0,2693774,26269 +"2020-10-25","MA",9864,9640,25,224,13142,13142,538,16,,109,2485042,15923,,,,,45,150565,147120,1077,0,,,,,191267,122856,,0,5668015,82846,,,125829,174264,2632162,17020,5668015,82846 +"2020-10-25","MD",4096,3950,5,146,16757,16757,446,52,,103,1738650,11210,,131954,,,,140279,140279,792,0,,,13261,,169003,8064,,0,3266149,31865,,,145215,,1878929,12002,3266149,31865 +"2020-10-25","ME",146,145,0,1,475,475,8,2,,0,,0,10065,,,,0,6201,5521,64,0,348,0,,,6573,5334,,0,573589,5498,10425,1,,,,0,573589,5498 +"2020-10-25","MI",7522,7182,0,340,,,1182,0,,273,,0,,,4404379,,121,175612,158026,0,0,,,,,214183,114939,,0,4618562,0,321825,,,,,0,4618562,0 +"2020-10-25","MN",2349,2335,21,14,9511,9511,584,67,2538,163,1636931,24938,,,,,,133802,133431,1680,0,,,,,,118485,2660323,34933,2660323,34933,,25979,,,1770362,26616,,0 +"2020-10-25","MO",2805,,4,,,,1404,0,,484,1289345,6782,80812,,2208498,,167,169495,169495,2043,0,5289,5928,,,193832,,,0,2406847,18566,86301,30609,82459,23325,1458840,8825,2406847,18566 +"2020-10-25","MP",2,2,0,,4,4,,0,,,15723,0,,,,,,88,88,0,0,,,,,,29,,0,15811,0,,,,,15811,0,22212,0 +"2020-10-25","MS",3255,2944,0,311,6380,6380,683,0,,154,729544,0,,,,,65,115088,101683,0,0,,,,,,97675,,0,844632,0,41053,72982,,,,0,827497,0 +"2020-10-25","MT",297,,3,,1229,1229,357,49,,,,0,,,,,,27880,,738,0,,,,,,17832,,0,465607,1575,,,,,,0,465607,1575 +"2020-10-25","NC",4157,4097,13,60,,,1148,0,,321,,0,,,,,,260099,250332,1807,0,,,,,,,,0,3827249,36632,,22622,,,,0,3827249,36632 +"2020-10-25","ND",461,,8,,1417,1417,272,12,291,37,245691,897,10047,,,,,37874,37638,849,0,627,,,,,30757,784157,8371,784157,8371,10674,458,,,283394,1726,815909,8856 +"2020-10-25","NE",595,,4,,2833,2833,436,16,,,504211,2446,,,792969,,,63215,,705,0,,,,,75000,41364,,0,869163,6283,,,,,567744,3155,869163,6283 +"2020-10-25","NH",473,,0,,766,766,23,1,246,,321865,2436,,,,,,10328,9696,90,0,,,,,,8823,,0,579186,4999,32840,,31995,,331561,2504,579186,4999 +"2020-10-25","NJ",16285,14496,4,1789,37287,37287,868,25,,164,4157414,44859,,,,,72,237800,228468,1407,0,,,,,,,,0,4395214,46266,,,,,,0,4385882,47897 +"2020-10-25","NM",967,,2,,4277,4277,287,38,,,,0,,,,,,41863,,823,0,,,,,,20837,,0,1118844,9749,,,,,,0,1118844,9749 +"2020-10-25","NV",1748,,5,,,,493,0,,134,692166,3271,,,,,51,95703,95703,891,0,,,,,,,1204746,8635,1204746,8635,,,,,787869,4162,,0 +"2020-10-25","NY",25730,,12,,89995,89995,1015,0,,227,,0,,,,,118,495464,,1632,0,,,,,,,13752123,120830,13752123,120830,,,,,,0,,0 +"2020-10-25","OH",5206,4896,0,310,18095,18095,1338,89,3714,377,,0,,,,,195,198115,186703,2309,0,,1415,,,209634,158836,,0,4200014,50645,,48702,,,,0,4200014,50645 +"2020-10-25","OK",1249,,4,,8386,8386,924,26,,305,1417024,0,,,1417024,,,116736,,1051,0,4814,,,,127051,99541,,0,1533760,1051,87553,,,,,0,1546238,0 +"2020-10-25","OR",653,,4,,3034,3034,197,0,,53,779403,5550,,,1293524,,21,41739,,391,0,,,,,67112,,,0,1360636,13589,,,,,813114,0,1360636,13589 +"2020-10-25","PA",8666,,12,,,,1104,0,,,2229977,14920,,,,,115,194288,185866,1666,0,,,,,,150245,3892386,35416,3892386,35416,,,,,2415843,16487,,0 +"2020-10-25","PR",801,610,7,191,,,370,0,,60,305972,0,,,395291,,46,31737,31737,665,0,30766,,,,20103,27348,,0,337709,665,,,,,,0,415664,0 +"2020-10-25","RI",1183,,0,,3208,3208,163,11,,14,387563,2071,,,1021837,,8,30857,,274,0,,,,,41380,,1063217,9963,1063217,9963,,,,,418420,2345,,0 +"2020-10-25","SC",3802,3567,9,235,10224,10224,725,12,,206,1535736,25993,70079,,1485359,,95,170678,163143,1337,0,8587,15305,,,213520,86524,,0,1706414,27330,78666,98080,,,,0,1698879,27300 +"2020-10-25","SD",375,,9,,2436,2436,366,58,,,206727,1188,,,,,,39203,37979,1062,0,,,,,43508,28083,,0,367159,3306,,,,,245930,2250,367159,3306 +"2020-10-25","TN",3131,2971,31,160,9941,9941,1094,15,,343,,0,,,3250692,,138,247587,234320,3500,0,,12439,,,282777,218067,,0,3533469,41245,,93656,,,,0,3533469,41245 +"2020-10-25","TX",17504,,48,,,,5206,0,,1550,,0,,,,,,862375,862375,4304,0,44745,28548,,,949518,755095,,0,8036693,37153,466962,362005,,,,0,8036693,37153 +"2020-10-25","UT",572,,4,,5049,5049,313,52,1067,120,896357,6740,,,1218009,419,,104882,,1765,0,,4370,,4174,111451,77145,,0,1329460,11115,,74457,,34343,997168,8022,1329460,11115 +"2020-10-25","VA",3579,3329,1,250,12233,12233,979,35,,216,,0,,,,,109,173371,161668,999,0,10979,7556,,,192590,,2510113,21096,2510113,21096,151576,131764,,,,0,,0 +"2020-10-25","VI",21,,0,,,,,0,,,22089,0,,,,,,1346,,0,0,,,,,,1305,,0,23435,0,,,,,23463,0,,0 +"2020-10-25","VT",58,58,0,,,,3,0,,,181642,771,,,,,,2087,2076,30,0,,,,,,1733,,0,388466,6591,,,,,183718,799,388466,6591 +"2020-10-25","WA",2296,2296,0,,8280,8280,405,49,,101,,0,,,,,43,106115,104151,835,0,,,,,,,2360387,41456,2360387,41456,,,,,,0,,0 +"2020-10-25","WI",1813,1778,10,35,10332,10332,1293,95,1412,320,1768026,10396,,,,,,208917,198166,3778,0,,,,,,155814,3075804,29127,3075804,29127,,,,,1966192,14022,,0 +"2020-10-25","WV",423,419,1,4,,,214,0,,75,,0,,,,,24,21906,20567,194,0,,,,,,16654,,0,719199,7441,18874,,,,,0,719199,7441 +"2020-10-25","WY",68,,0,,394,394,95,2,,,113686,0,,,247531,,,11041,9396,236,0,,,,,11873,7525,,0,259404,594,,,,,122604,0,259404,594 +"2020-10-24","AK",68,68,0,,419,419,58,4,,,,0,,,540786,,8,12523,,356,0,,,,,11644,6939,,0,552746,0,,,,,,0,552746,0 +"2020-10-24","AL",2866,2680,7,186,19595,19595,920,0,2021,,1138922,5064,,,,1157,,183276,156946,2360,0,,,,,,74439,,0,1295868,6095,,,63359,,1295868,6095,,0 +"2020-10-24","AR",1797,1640,15,157,6707,6707,606,29,,242,1181805,11643,,,1181805,808,94,105318,98213,1183,0,,,,7891,,93977,,0,1280018,12517,,,,46505,,0,1280018,12517 +"2020-10-24","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-24","AZ",5869,5581,4,288,21043,21043,819,76,,191,1462194,11213,,,,,87,236772,231355,890,0,,,,,,,,0,2667371,22591,,,312232,,1693549,12080,2667371,22591 +"2020-10-24","CA",17311,,49,,,,3007,0,,744,,0,,,,,,892810,892810,5945,0,,,,,,,,0,17609179,125886,,,,,,0,17609179,125886 +"2020-10-24","CO",2218,1835,7,383,8598,8598,599,41,,,1050755,11426,167199,,,,,93400,86815,1828,0,12853,,,,,,1818196,27792,1818196,27792,180052,,,,1137570,13161,,0 +"2020-10-24","CT",4577,3674,0,903,12257,12257,233,0,,,,0,,,2324017,,,66052,63376,0,0,,,,,82962,9800,,0,2409686,26052,,,,,,0,2409686,26052 +"2020-10-24","DC",642,,0,,,,93,0,,21,,0,,,,,6,16706,,97,0,,,,,,13068,491553,5800,491553,5800,,,,,248189,1562,,0 +"2020-10-24","DE",680,599,2,81,,,103,0,,22,313429,2004,,,,,,23847,22724,160,0,,,,,26003,12610,528430,5276,528430,5276,,,,,337276,2164,,0 +"2020-10-24","FL",16620,,76,,48684,48684,2162,174,,,5161810,67838,487730,475588,7575340,,,766305,737835,4381,0,51923,,50676,,998106,,9532175,120483,9532175,120483,539844,,526404,,5922634,72244,8618680,96036 +"2020-10-24","GA",7808,,42,,31046,31046,1684,97,5822,,,0,,,,,,349605,349605,1846,0,28865,,,,326890,,,0,3426110,18487,324963,,,,,0,3426110,18487 +"2020-10-24","GU",71,,2,,,,77,0,,17,59065,300,,,,,6,4175,4155,34,0,6,20,,,,2503,,0,63240,334,203,290,,,,0,62614,0 +"2020-10-24","HI",209,209,3,,1057,1057,71,12,,18,,0,,,,,11,14669,14464,140,0,,,,,14409,11292,496293,4843,496293,4843,,,,,,0,,0 +"2020-10-24","IA",1631,,11,,,,545,0,,130,750905,4830,,61848,,,49,108514,108514,1640,0,,,3766,6117,,87463,,0,859419,6470,,,65653,71378,861067,6468,,0 +"2020-10-24","ID",562,518,9,44,2387,2387,259,24,527,66,315145,2078,,,,,,57673,50902,1073,0,,,,,,27509,,0,366047,2999,,,,,366047,2999,492461,4565 +"2020-10-24","IL",9751,9481,63,270,,,2616,0,,560,,0,,,,,222,374907,370194,6161,0,,,,,,,,0,7196855,83517,,,,,,0,7196855,83517 +"2020-10-24","IN",4118,3882,26,236,15627,15627,1685,129,3066,481,1457877,9994,,,,,152,160454,,2741,0,,,,,155443,,,0,2681197,38675,,,,,1618331,12735,2681197,38675 +"2020-10-24","KS",975,,0,,3584,3584,403,0,1001,2,540032,0,,,,309,41,76230,,0,0,,,,,,,,0,616262,0,,,,,616262,0,,0 +"2020-10-24","KY",1404,1385,8,19,6865,6865,840,49,1681,208,,0,,,,,,95480,80735,1732,0,,,,,,17723,,0,1785186,22455,82256,43446,,,,0,1785186,22455 +"2020-10-24","LA",5820,5614,0,206,,,620,0,,,2488635,0,,,,,65,182603,178870,0,0,,,,,,165282,,0,2671238,0,,,,,,0,2667505,0 +"2020-10-24","MA",9839,9616,9,223,13126,13126,551,20,,114,2469119,18040,,,,,45,149488,146023,1203,0,,,,,189918,122856,,0,5585169,70021,,,125639,173868,2615142,19168,5585169,70021 +"2020-10-24","MD",4091,3945,13,146,16705,16705,455,55,,109,1727440,10837,,131954,,,,139487,139487,796,0,,,13261,,168014,8055,,0,3234284,32510,,,145215,,1866927,11633,3234284,32510 +"2020-10-24","ME",146,145,0,1,473,473,8,0,,0,,0,10065,,,,0,6137,5475,42,0,348,0,,,6519,5317,,0,568091,6367,10425,1,,,,0,568091,6367 +"2020-10-24","MI",7522,7182,38,340,,,1182,0,,273,,0,,,4404379,,121,175612,158026,3490,0,,,,,214183,114939,,0,4618562,53493,321825,,,,,0,4618562,53493 +"2020-10-24","MN",2328,2316,14,12,9444,9444,584,106,2533,163,1611993,7611,,,,,,132122,131753,2259,0,,,,,,116693,2625390,34465,2625390,34465,,24238,,,1743746,9853,,0 +"2020-10-24","MO",2801,,113,,,,1443,0,,522,1282563,7781,80547,,2192171,,175,167452,167452,2918,0,5231,5820,,,191640,,,0,2388281,24470,85977,29938,82171,22821,1450015,10699,2388281,24470 +"2020-10-24","MP",2,2,0,,4,4,,0,,,15723,0,,,,,,88,88,0,0,,,,,,29,,0,15811,0,,,,,15811,0,22212,0 +"2020-10-24","MS",3255,2944,17,311,6380,6380,683,0,,154,729544,0,,,,,65,115088,101683,1212,0,,,,,,97675,,0,844632,1212,41053,72982,,,,0,827497,0 +"2020-10-24","MT",294,,12,,1180,1180,348,10,,,,0,,,,,,27142,,639,0,,,,,,17436,,0,464032,3032,,,,,,0,464032,3032 +"2020-10-24","NC",4144,4085,30,59,,,1182,0,,338,,0,,,,,,258292,248620,2584,0,,,,,,,,0,3790617,38722,,21790,,,,0,3790617,38722 +"2020-10-24","ND",453,,8,,1405,1405,278,17,287,41,244794,1031,10039,,,,,37025,36795,967,0,621,,,,,30116,775786,7377,775786,7377,10660,444,,,281668,1966,807053,7748 +"2020-10-24","NE",591,,4,,2817,2817,426,34,,,501765,3742,,,787484,,,62510,,1225,0,,,,,74213,41008,,0,862880,15611,,,,,564589,4964,862880,15611 +"2020-10-24","NH",473,,2,,765,765,19,0,246,,319429,2796,,,,,,10238,9628,126,0,,,,,,8819,,0,574187,6592,32801,,31958,,329057,2906,574187,6592 +"2020-10-24","NJ",16281,14492,8,1789,37262,37262,886,40,,171,4112555,0,,,,,72,236393,227339,2206,0,,,,,,,,0,4348948,2206,,,,,,0,4337985,0 +"2020-10-24","NM",965,,5,,4239,4239,264,70,,,,0,,,,,,41040,,872,0,,,,,,20765,,0,1109095,9611,,,,,,0,1109095,9611 +"2020-10-24","NV",1743,,5,,,,493,0,,134,688895,1914,,,,,51,94812,94812,1146,0,,,,,,,1196111,11042,1196111,11042,,,,,783707,3060,,0 +"2020-10-24","NY",25718,,13,,89995,89995,1045,0,,231,,0,,,,,113,493832,,2061,0,,,,,,,13631293,156940,13631293,156940,,,,,,0,,0 +"2020-10-24","OH",5206,4896,22,310,18006,18006,1355,140,3705,383,,0,,,,,200,195806,184528,2858,0,,1260,,,206738,157744,,0,4149369,51093,,43715,,,,0,4149369,51093 +"2020-10-24","OK",1245,,11,,8360,8360,924,95,,305,1417024,19328,,,1417024,,,115685,,1829,0,4814,,,,127051,98700,,0,1532709,21157,87553,,,,,0,1546238,20677 +"2020-10-24","OR",649,,3,,3034,3034,197,29,,53,773853,8662,,,1280428,,21,41348,,538,0,,,,,66619,,,0,1347047,18765,,,,,813114,9182,1347047,18765 +"2020-10-24","PA",8654,,29,,,,1087,0,,,2215057,14189,,,,,126,192622,184299,2043,0,,,,,,150245,3856970,39474,3856970,39474,,,,,2399356,16052,,0 +"2020-10-24","PR",794,604,3,190,,,395,0,,60,305972,0,,,395291,,43,31072,31072,116,0,30208,,,,20103,26866,,0,337044,116,,,,,,0,415664,0 +"2020-10-24","RI",1183,,6,,3197,3197,163,71,,15,385492,2760,,,1012200,,9,30583,,465,0,,,,,41054,,1053254,18682,1053254,18682,,,,,416075,3225,,0 +"2020-10-24","SC",3793,3560,16,233,10212,10212,743,51,,200,1509743,10791,69729,,1459763,,97,169341,161836,792,0,8480,15204,,,211816,86031,,0,1679084,11583,78209,97080,,,,0,1671579,11392 +"2020-10-24","SD",366,,10,,2378,2378,356,42,,,205539,1739,,,,,,38141,36962,939,0,,,,,42892,27557,,0,363853,4741,,,,,243680,2678,363853,4741 +"2020-10-24","TN",3100,2944,24,156,9926,9926,1382,44,,403,,0,,,3213008,,162,244087,231171,2574,0,,12092,,,279216,216744,,0,3492224,26312,,89377,,,,0,3492224,26312 +"2020-10-24","TX",17456,,81,,,,4995,0,,1513,,0,,,,,,858071,858071,6499,0,44466,28179,,,944643,753611,,0,7999540,69457,465309,358918,,,,0,7999540,69457 +"2020-10-24","UT",568,,1,,4997,4997,319,58,1062,110,889617,6989,,,1208374,417,,103117,,1608,0,,4248,,4055,109971,75776,,0,1318345,12974,,72847,,33663,989146,9187,1318345,12974 +"2020-10-24","VA",3578,3328,39,250,12198,12198,979,58,,220,,0,,,,,117,172372,160843,1088,0,10920,7390,,,191459,,2489017,16956,2489017,16956,151141,130880,,,,0,,0 +"2020-10-24","VI",21,,0,,,,,0,,,22089,0,,,,,,1346,,0,0,,,,,,1305,,0,23435,0,,,,,23463,0,,0 +"2020-10-24","VT",58,58,0,,,,4,0,,,180871,1613,,,,,,2057,2048,28,0,,,,,,1728,,0,381875,4878,,,,,182919,1641,381875,4878 +"2020-10-24","WA",2296,2296,7,,8231,8231,412,48,,114,,0,,,,,48,105280,103363,849,0,,,,,,,2318931,22656,2318931,22656,,,,,,0,,0 +"2020-10-24","WI",1803,1770,29,33,10237,10237,1237,199,1405,276,1757630,13558,,,,,,205139,194540,4673,0,,,,,,152928,3046677,41161,3046677,41161,,,,,1952170,17620,,0 +"2020-10-24","WV",422,418,0,4,,,209,0,,71,,0,,,,,24,21712,20427,320,0,,,,,,16578,,0,711758,5302,18594,,,,,0,711758,5302 +"2020-10-24","WY",68,,0,,392,392,83,0,,,113686,0,,,247059,,,10805,9177,260,0,,,,,11751,7471,,0,258810,989,,,,,122604,0,258810,989 +"2020-10-23","AK",68,68,0,,415,415,59,14,,,,0,,,540786,,7,12167,,248,0,,,,,11644,6915,,0,552746,4037,,,,,,0,552746,4037 +"2020-10-23","AL",2859,2674,16,185,19595,19595,888,147,2001,,1133858,8105,,,,1148,,180916,155915,3852,0,,,,,,74439,,0,1289773,9078,,,62498,,1289773,9078,,0 +"2020-10-23","AR",1782,1626,10,156,6678,6678,610,152,,237,1170162,10920,,,1170162,807,92,104135,97339,1337,0,,,,7546,,93215,,0,1267501,11967,,,,44666,,0,1267501,11967 +"2020-10-23","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-23","AZ",5865,5578,6,287,20967,20967,815,29,,172,1450981,11984,,,,,85,235882,230488,976,0,,,,,,,,0,2644780,24855,,,311920,,1681469,12907,2644780,24855 +"2020-10-23","CA",17262,,73,,,,3011,0,,754,,0,,,,,,886865,886865,6141,0,,,,,,,,0,17483293,124523,,,,,,0,17483293,124523 +"2020-10-23","CO",2211,1829,13,382,8557,8557,550,79,,,1039329,9351,166491,,,,,91572,85080,1350,0,12741,,,,,,1790404,25756,1790404,25756,179232,,,,1124409,10610,,0 +"2020-10-23","CT",4577,3674,8,903,12257,12257,233,0,,,,0,,,2298838,,,66052,63376,679,0,,,,,82117,9800,,0,2383634,33280,,,,,,0,2383634,33280 +"2020-10-23","DC",642,,0,,,,91,0,,23,,0,,,,,8,16609,,72,0,,,,,,13028,485753,6318,485753,6318,,,,,246627,1076,,0 +"2020-10-23","DE",678,597,8,81,,,106,0,,25,311425,1894,,,,,,23687,22567,159,0,,,,,25862,12493,523154,2913,523154,2913,,,,,335112,2053,,0 +"2020-10-23","FL",16544,,74,,48510,48510,2114,190,,,5093972,40124,487730,475588,7484952,,,761924,734208,3618,0,51923,,50676,,992669,,9411692,92812,9411692,92812,539844,,526404,,5850390,43749,8522644,69522 +"2020-10-23","GA",7766,,37,,30949,30949,1741,120,5801,,,0,,,,,,347759,347759,2224,0,28706,,,,325642,,,0,3407623,40089,323918,,,,,0,3407623,40089 +"2020-10-23","GU",69,,0,,,,77,0,,17,58765,534,,,,,6,4141,4121,85,0,6,19,,,,2503,,0,62906,619,203,290,,,,0,62614,616 +"2020-10-23","HI",206,206,3,,1045,1045,75,12,,18,,0,,,,,13,14529,14335,102,0,,,,,14282,11232,491450,4139,491450,4139,,,,,,0,,0 +"2020-10-23","IA",1620,,19,,,,536,0,,134,746075,3430,,61512,,,49,106874,106874,1249,0,,,3748,6043,,86630,,0,852949,4679,,,65299,71282,854599,4674,,0 +"2020-10-23","ID",553,509,7,44,2363,2363,193,36,524,54,313067,2110,,,,,,56600,49981,950,0,,,,,,27221,,0,363048,2863,,,,,363048,2863,487896,12467 +"2020-10-23","IL",9688,9418,41,270,,,2498,0,,511,,0,,,,,197,368746,364033,5000,0,,,,,,,,0,7113338,82256,,,,,,0,7113338,82256 +"2020-10-23","IN",4092,3858,27,234,15498,15498,1548,194,3049,433,1447883,8764,,,,,152,157713,,2467,0,,,,,153266,,,0,2642522,31257,,,,,1605596,11231,2642522,31257 +"2020-10-23","KS",975,,23,,3584,3584,403,78,1001,2,540032,8979,,,,309,41,76230,,1774,0,,,,,,,,0,616262,10753,,,,,616262,10753,,0 +"2020-10-23","KY",1396,1378,16,18,6816,6816,819,55,1669,205,,0,,,,,,93748,79275,1449,0,,,,,,17722,,0,1762731,18728,82113,42676,,,,0,1762731,18728 +"2020-10-23","LA",5820,5614,21,206,,,620,0,,,2488635,19379,,,,,65,182603,178870,699,0,,,,,,165282,,0,2671238,20078,,,,,,0,2667505,20078 +"2020-10-23","MA",9830,9608,20,222,13106,13106,570,24,,125,2451079,14793,,,,,43,148285,144895,1070,0,,,,,188566,122856,,0,5515148,74082,,,125399,171903,2595974,15761,5515148,74082 +"2020-10-23","MD",4078,3932,8,146,16650,16650,458,47,,122,1716603,11227,,131954,,,,138691,138691,712,0,,,13261,,167025,8030,,0,3201774,32472,,,145215,,1855294,11939,3201774,32472 +"2020-10-23","ME",146,145,0,1,473,473,8,0,,0,,0,10065,,,,0,6095,5442,31,0,348,0,,,6488,5307,,0,561724,6855,10425,1,,,,0,561724,6855 +"2020-10-23","MI",7484,7147,20,337,,,1182,0,,273,,0,,,4353764,,121,172122,154688,2046,0,,,,,211305,109539,,0,4565069,58181,318590,,,,,0,4565069,58181 +"2020-10-23","MN",2314,2302,13,12,9338,9338,584,112,2510,163,1604382,9637,,,,,,129863,129511,1711,0,,,,,,114679,2590925,26434,2590925,26434,,23199,,,1733893,11320,,0 +"2020-10-23","MO",2688,,31,,,,1349,0,,215,1274782,5033,80126,,2170868,,172,164534,164534,1811,0,5130,5614,,,188511,,,0,2363811,17321,85454,28459,81713,21837,1439316,6844,2363811,17321 +"2020-10-23","MP",2,2,0,,4,4,,0,,,15723,0,,,,,,88,88,0,0,,,,,,29,,0,15811,0,,,,,15811,0,22212,0 +"2020-10-23","MS",3238,2932,7,306,6380,6380,701,0,,158,729544,0,,,,,70,113876,100939,795,0,,,,,,97675,,0,843420,795,41053,72982,,,,0,827497,0 +"2020-10-23","MT",282,,4,,1170,1170,351,79,,,,0,,,,,,26503,,863,0,,,,,,16611,,0,461000,8154,,,,,,0,461000,8154 +"2020-10-23","NC",4114,4058,32,56,,,1181,0,,325,,0,,,,,,255708,246346,2716,0,,,,,,,,0,3751895,44981,,19839,,,,0,3751895,44981 +"2020-10-23","ND",445,,18,,1388,1388,282,37,286,44,243763,1123,9962,,,,,36058,35872,896,0,590,,,,,29136,768409,8091,768409,8091,10552,373,,,279702,2010,799305,8567 +"2020-10-23","NE",587,,11,,2783,2783,389,42,,,498023,3792,,,773277,,,61285,,977,0,,,,,72815,40494,,0,847269,10467,,,,,559625,4768,847269,10467 +"2020-10-23","NH",471,,1,,765,765,15,0,246,,316633,2893,,,,,,10112,9518,118,0,,,,,,8745,,0,567595,6563,32765,,31919,,326151,2978,567595,6563 +"2020-10-23","NJ",16273,14484,10,1789,37222,37222,874,12705,,212,4112555,39328,,,,,73,234187,225430,1315,0,,,,,,,,0,4346742,40643,,,,,,0,4337985,40373 +"2020-10-23","NM",960,,7,,4169,4169,229,41,,,,0,,,,,,40168,,791,0,,,,,,20655,,0,1099484,10334,,,,,,0,1099484,10334 +"2020-10-23","NV",1738,,2,,,,493,0,,134,686981,5739,,,,,51,93666,93666,813,0,,,,,,,1185069,9655,1185069,9655,,,,,780647,6552,,0 +"2020-10-23","NY",25705,,11,,89995,89995,1023,0,,223,,0,,,,,109,491771,,1637,0,,,,,,,13474353,141508,13474353,141508,,,,,,0,,0 +"2020-10-23","OH",5184,4874,23,310,17866,17866,1347,184,3682,370,,0,,,,,195,192948,181869,2518,0,,1060,,,203971,156421,,0,4098276,47934,,37215,,,,0,4098276,47934 +"2020-10-23","OK",1234,,13,,8265,8265,956,95,,313,1397696,19091,,,1397696,,,113856,,1373,0,4635,,,,125427,97490,,0,1511552,20464,85717,,,,,0,1525561,21493 +"2020-10-23","OR",646,,11,,3005,3005,194,16,,55,765191,5699,,,1262236,,21,40810,,367,0,,,,,66046,,,0,1328282,13457,,,,,803932,6034,1328282,13457 +"2020-10-23","PA",8625,,33,,,,1068,0,,,2200868,15789,,,,,122,190579,182436,2219,0,,,,,,148651,3817496,40770,3817496,40770,,,,,2383304,17742,,0 +"2020-10-23","PR",791,602,8,189,,,381,0,,51,305972,0,,,395291,,39,30956,30956,1152,0,30028,,,,20103,26430,,0,336928,1152,,,,,,0,415664,0 +"2020-10-23","RI",1177,,4,,3126,3126,140,10,,13,382732,4024,,,994022,,9,30118,,524,0,,,,,40550,,1034572,18852,1034572,18852,,,,,412850,4548,,0 +"2020-10-23","SC",3777,3545,22,232,10161,10161,718,59,,191,1498952,17086,69440,,1449305,,96,168549,161235,1064,0,8423,14993,,,210882,85420,,0,1667501,18150,77863,95199,,,,0,1660187,17937 +"2020-10-23","SD",356,,9,,2336,2336,349,59,,,203800,1371,,,,,,37202,36109,1185,0,,,,,41923,26984,,0,359112,4347,,,,,241002,2556,359112,4347 +"2020-10-23","TN",3076,2923,65,153,9882,9882,1426,80,,414,,0,,,3189241,,164,241513,228930,3606,0,,11734,,,276671,214634,,0,3465912,41827,,85642,,,,0,3465912,41827 +"2020-10-23","TX",17375,,89,,,,5065,0,,1511,,0,,,,,,851572,851572,6472,0,43966,27563,,,937845,748252,,0,7930083,78756,462309,351741,,,,0,7930083,78756 +"2020-10-23","UT",567,,4,,4939,4939,321,59,1056,109,882628,6051,,,1197212,415,,101509,,1960,0,,4116,,3932,108159,74688,,0,1305371,12352,,70201,,32781,979959,7527,1305371,12352 +"2020-10-23","VA",3539,3293,15,246,12140,12140,1012,67,,233,,0,,,,,113,171284,160004,1180,0,10848,7104,,,190579,,2472061,20363,2472061,20363,150675,126983,,,,0,,0 +"2020-10-23","VI",21,,0,,,,,0,,,22089,178,,,,,,1346,,3,0,,,,,,1305,,0,23435,181,,,,,23463,175,,0 +"2020-10-23","VT",58,58,0,,,,3,0,,,179258,1135,,,,,,2029,2020,30,0,,,,,,1723,,0,376997,9007,,,,,181278,1165,376997,9007 +"2020-10-23","WA",2289,2289,3,,8183,8183,437,34,,103,,0,,,,,49,104431,102550,785,0,,,,,,,2296275,19822,2296275,19822,,,,,,0,,0 +"2020-10-23","WI",1774,1745,49,29,10038,10038,1245,183,1396,332,1744072,13426,,,,,,200466,190478,4643,0,,,,,,149534,3005516,40443,3005516,40443,,,,,1934550,17804,,0 +"2020-10-23","WV",422,418,4,4,,,193,0,,68,,0,,,,,18,21392,20191,335,0,,,,,,16368,,0,706456,5042,18890,,,,,0,706456,5042 +"2020-10-23","WY",68,,0,,392,392,83,19,,,113686,1864,,,246262,,,10545,8918,426,0,,,,,11559,7357,,0,257821,3927,,,,,122604,2477,257821,3927 +"2020-10-22","AK",68,68,0,,401,401,41,6,,,,0,,,537045,,5,11919,,239,0,,,,,11348,6812,,0,548709,1569,,,,,,0,548709,1569 +"2020-10-22","AL",2843,2660,38,183,19448,19448,864,118,1985,,1125753,5246,,,,1137,,177064,154942,2536,0,,,,,,74439,,0,1280695,7172,,,62257,,1280695,7172,,0 +"2020-10-22","AR",1772,1616,21,156,6526,6526,603,0,,236,1159242,11889,,,1159242,796,91,102798,96292,1202,0,,,,7231,,92288,,0,1255534,12782,,,,42624,,0,1255534,12782 +"2020-10-22","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-22","AZ",5859,5573,5,286,20938,20938,848,118,,164,1438997,10205,,,,,92,234906,229565,994,0,,,,,,,,0,2619925,29539,,,311019,,1668562,11173,2619925,29539 +"2020-10-22","CA",17189,,162,,,,3051,0,,758,,0,,,,,,880724,880724,2940,0,,,,,,,,0,17358770,65631,,,,,,0,17358770,65631 +"2020-10-22","CO",2198,1816,4,382,8478,8478,547,98,,,1029978,8584,165942,,,,,90222,83821,1373,0,12684,,,,,,1764648,22065,1764648,22065,178626,,,,1113799,9847,,0 +"2020-10-22","CT",4569,3667,2,902,12257,12257,232,214,,,,0,,,2266437,,,65373,62743,502,0,,,,,81270,9800,,0,2350354,31948,,,,,,0,2350354,31948 +"2020-10-22","DC",642,,0,,,,95,0,,23,,0,,,,,9,16537,,39,0,,,,,,12979,479435,2992,479435,2992,,,,,245551,1370,,0 +"2020-10-22","DE",670,589,0,81,,,110,0,,25,309531,1426,,,,,,23528,22412,153,0,,,,,25757,12410,520241,1483,520241,1483,,,,,333059,1579,,0 +"2020-10-22","FL",16470,,162,,48320,48320,2074,425,,,5053848,46290,487730,475588,7420252,,,758306,731460,5461,0,51923,,50676,,988033,,9318880,97356,9318880,97356,539844,,526404,,5806641,42812,8453122,68685 +"2020-10-22","GA",7729,,25,,30829,30829,1699,153,5774,,,0,,,,,,345535,345535,1785,0,28346,,,,323551,,,0,3367534,29219,321823,,,,,0,3367534,29219 +"2020-10-22","GU",69,,0,,,,78,0,,15,58231,956,,,,,7,4056,4037,88,0,6,19,,,,2471,,0,62287,1044,203,287,,,,0,61998,798 +"2020-10-22","HI",203,203,14,,1033,1033,75,8,,18,,0,,,,,15,14427,14233,77,0,,,,,14180,11188,487311,4329,487311,4329,,,,,,0,,0 +"2020-10-22","IA",1601,,17,,,,530,0,,135,742645,4293,,61217,,,53,105625,105625,1435,0,,,3725,5801,,85697,,0,848270,5728,,,64981,70128,849925,5731,,0 +"2020-10-22","ID",546,503,11,43,2327,2327,193,50,514,54,310957,1648,,,,,,55650,49228,987,0,,,,,,26916,,0,360185,2352,,,,,360185,2352,475429,3729 +"2020-10-22","IL",9647,9387,42,260,,,2463,0,,525,,0,,,,,212,363746,360159,4942,0,,,,,,,,0,7031082,80977,,,,,,0,7031082,80977 +"2020-10-22","IN",4065,3831,42,234,15304,15304,1515,141,3006,433,1439119,10406,,,,,143,155246,,2850,0,,,,,150959,,,0,2611265,36465,,,,,1594365,13256,2611265,36465 +"2020-10-22","KS",952,,0,,3506,3506,329,0,975,1,531053,0,,,,299,45,74456,,0,0,,,,,,,,0,605509,0,,,,,605509,0,,0 +"2020-10-22","KY",1380,1363,17,17,6761,6761,800,40,1658,214,,0,,,,,,92299,78250,1303,0,,,,,,17627,,0,1744003,29128,81974,42157,,,,0,1744003,29128 +"2020-10-22","LA",5799,5593,9,206,,,598,0,,,2469256,18984,,,,,64,181904,178171,772,0,,,,,,165282,,0,2651160,19756,,,,,,0,2647427,19756 +"2020-10-22","MA",9810,9589,30,221,13082,13082,521,26,,103,2436286,16980,,,,,38,147215,143927,1049,0,,,,,187420,122856,,0,5441066,74672,,,125118,169922,2580213,17966,5441066,74672 +"2020-10-22","MD",4070,3924,12,146,16603,16603,458,54,,125,1705376,10605,,131954,,,,137979,137979,743,0,,,13261,,166166,7999,,0,3169302,30427,,,145215,,1843355,11348,3169302,30427 +"2020-10-22","ME",146,145,0,1,473,473,7,3,,0,,0,10051,,,,0,6064,5411,37,0,347,0,,,6454,5269,,0,554869,6451,10410,1,,,,0,554869,6451 +"2020-10-22","MI",7464,7129,46,335,,,1182,0,,273,,0,,,4298787,,112,170076,152862,2204,0,,,,,208101,109539,,0,4506888,48224,317645,,,,,0,4506888,48224 +"2020-10-22","MN",2301,2289,20,12,9226,9226,584,79,2485,154,1594745,12822,,,,,,128152,127828,1561,0,,,,,,113976,2564491,25115,2564491,25115,,22777,,,1722573,14388,,0 +"2020-10-22","MO",2657,,16,,,,1352,0,,240,1269749,22744,79963,,2155560,,163,162723,162723,1854,0,5082,5432,,,186526,,,0,2346490,19622,85243,27656,81519,21494,1432472,24598,2346490,19622 +"2020-10-22","MP",2,2,0,,4,4,,0,,,15723,0,,,,,,88,88,0,0,,,,,,29,,0,15811,0,,,,,15811,0,22212,0 +"2020-10-22","MS",3231,2926,8,305,6380,6380,695,0,,157,729544,0,,,,,68,113081,100465,958,0,,,,,,97675,,0,842625,958,41053,72982,,,,0,827497,0 +"2020-10-22","MT",278,,3,,1091,1091,353,23,,,,0,,,,,,25640,,928,0,,,,,,16266,,0,452846,4852,,,,,,0,452846,4852 +"2020-10-22","NC",4082,4028,50,54,,,1205,0,,333,,0,,,,,,252992,243923,2400,0,,,,,,,,0,3706914,34738,,18776,,,,0,3706914,34738 +"2020-10-22","ND",427,,0,,1351,1351,276,27,282,38,242640,1209,9962,,,,,35162,34989,1048,0,590,,,,,28271,760318,7823,760318,7823,10552,361,,,277692,2096,790738,8252 +"2020-10-22","NE",576,,11,,2741,2741,400,35,,,494231,3718,,,763923,,,60308,,899,0,,,,,71719,39905,,0,836802,13898,,,,,554857,4618,836802,13898 +"2020-10-22","NH",470,,1,,765,765,18,2,246,,313740,4828,,,,,,9994,9433,77,0,,,,,,8692,,0,561032,8107,32710,,31879,,323173,4881,561032,8107 +"2020-10-22","NJ",16263,14474,18,1789,24517,24517,852,76,,187,4073227,32327,,,,,74,232872,224385,1444,0,,,,,,,,0,4306099,33771,,,,,,0,4297612,33489 +"2020-10-22","NM",953,,3,,4128,4128,213,49,,,,0,,,,,,39377,,662,0,,,,,,20562,,0,1089150,11063,,,,,,0,1089150,11063 +"2020-10-22","NV",1736,,4,,,,520,0,,161,681242,3693,,,,,53,92853,92853,789,0,,,,,,,1175414,10000,1175414,10000,,,,,774095,4482,,0 +"2020-10-22","NY",25694,,15,,89995,89995,986,0,,209,,0,,,,,106,490134,,1628,0,,,,,,,13332845,135341,13332845,135341,,,,,,0,,0 +"2020-10-22","OH",5161,4850,12,311,17682,17682,1293,159,3657,345,,0,,,,,172,190430,179424,2425,0,,879,,,201296,155181,,0,4050342,42740,,30006,,,,0,4050342,42740 +"2020-10-22","OK",1221,,11,,8170,8170,910,93,,297,1378605,11235,,,1378605,,,112483,,1628,0,4635,,,,123241,96245,,0,1491088,12863,85717,,,,,0,1504068,12227 +"2020-10-22","OR",635,,2,,2989,2989,183,25,,57,759492,4311,,,1249260,,21,40443,,307,0,,,,,65565,,,0,1314825,11514,,,,,797898,4599,1314825,11514 +"2020-10-22","PA",8592,,30,,,,1042,0,,,2185079,17543,,,,,110,188360,180483,2063,0,,,,,,148804,3776726,39449,3776726,39449,,,,,2365562,19378,,0 +"2020-10-22","PR",783,596,9,187,,,395,0,,53,305972,0,,,395291,,44,29804,29804,87,0,29233,,,,20103,26253,,0,335776,87,,,,,,0,415664,0 +"2020-10-22","RI",1173,,4,,3116,3116,140,25,,13,378708,3151,,,975904,,8,29594,,471,0,,,,,39816,,1015720,17160,1015720,17160,,,,,408302,3622,,0 +"2020-10-22","SC",3755,3526,47,229,10102,10102,766,40,,185,1481866,14674,69308,,1432507,,91,167485,160384,1128,0,8314,14678,,,209743,84761,,0,1649351,15802,77622,90041,,,,0,1642250,15625 +"2020-10-22","SD",347,,14,,2277,2277,355,38,,,202429,1223,,,,,,36017,34977,973,0,,,,,40822,26397,,0,354765,2961,,,,,238446,2196,354765,2961 +"2020-10-22","TN",3011,2872,41,139,9802,9802,1424,68,,388,,0,,,3151098,,167,237907,225658,2046,0,,11442,,,272987,212555,,0,3424085,19824,,81638,,,,0,3424085,19824 +"2020-10-22","TX",17286,,85,,,,4931,0,,1454,,0,,,,,,845100,845100,6291,0,43576,26863,,,929657,744283,,0,7851327,81418,459439,342539,,,,0,7851327,81418 +"2020-10-22","UT",563,,6,,4880,4880,318,73,1050,110,876577,7691,,,1186599,409,,99549,,1543,0,,3944,,3768,106420,73586,,0,1293019,12708,,67628,,31854,972432,9424,1293019,12708 +"2020-10-22","VA",3524,3274,9,250,12073,12073,1109,63,,218,,0,,,,,120,170104,159060,1332,0,10788,6854,,,189561,,2451698,19962,2451698,19962,150199,122836,,,,0,,0 +"2020-10-22","VI",21,,0,,,,,0,,,21911,143,,,,,,1343,,6,0,,,,,,1303,,0,23254,149,,,,,23288,115,,0 +"2020-10-22","VT",58,58,0,,,,3,0,,,178123,871,,,,,,1999,1990,16,0,,,,,,1718,,0,367990,5084,,,,,180113,886,367990,5084 +"2020-10-22","WA",2286,2286,4,,8149,8149,407,25,,92,,0,,,,,43,103646,101792,918,0,,,,,,,2276453,23665,2276453,23665,,,,,,0,,0 +"2020-10-22","WI",1725,1703,23,22,9855,9855,1202,151,1386,324,1730646,12082,,,,,,195823,186100,3632,0,,,,,,145509,2965073,40867,2965073,40867,,,,,1916746,15495,,0 +"2020-10-22","WV",418,414,5,4,,,188,0,,63,,0,,,,,21,21057,19907,323,0,,,,,,16166,,0,701414,8449,18849,,,,,0,701414,8449 +"2020-10-22","WY",68,,7,,373,373,81,0,,,111822,0,,,242722,,,10119,8537,271,0,,,,,11172,7220,,0,253894,4469,,,,,120127,0,253894,4469 +"2020-10-21","AK",68,68,1,,395,395,41,6,,,,0,,,535629,,8,11680,,224,0,,,,,11195,6751,,0,547140,615,,,,,,0,547140,615 +"2020-10-21","AL",2805,2633,0,172,19330,19330,863,249,1967,,1120507,7948,,,,1121,,174528,153016,0,0,,,,,,74439,,0,1273523,7948,,,62008,,1273523,7948,,0 +"2020-10-21","AR",1751,1599,23,152,6526,6526,626,98,,241,1147353,10119,,,1147353,796,94,101596,95399,1155,0,,,,6891,,91317,,0,1242752,11100,,,,39902,,0,1242752,11100 +"2020-10-21","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-21","AZ",5854,5567,17,287,20820,20820,832,101,,171,1428792,9117,,,,,91,233912,228597,975,0,,,,,,,,0,2590386,27308,,,310123,,1657389,10044,2590386,27308 +"2020-10-21","CA",17027,,35,,,,3077,0,,763,,0,,,,,,877784,877784,3707,0,,,,,,,,0,17293139,104069,,,,,,0,17293139,104069 +"2020-10-21","CO",2194,1812,12,382,8380,8380,532,48,,,1021394,7201,165390,,,,,88849,82558,1267,0,12616,,,,,,1742583,18545,1742583,18545,178006,,,,1103952,8231,,0 +"2020-10-21","CT",4567,3666,8,901,12043,12043,213,0,,,,0,,,2235361,,,64871,62261,416,0,,,,,80432,9651,,0,2318406,38713,,,,,,0,2318406,38713 +"2020-10-21","DC",642,,0,,,,96,0,,23,,0,,,,,9,16498,,53,0,,,,,,12938,476443,2636,476443,2636,,,,,244181,882,,0 +"2020-10-21","DE",670,589,2,81,,,99,0,,23,308105,704,,,,,,23375,22263,50,0,,,,,25687,12335,518758,3377,518758,3377,,,,,331480,754,,0 +"2020-10-21","FL",16308,,0,,47895,47895,2125,0,,,5007558,0,487730,475588,7358921,,,752845,726989,2106,0,51923,,50676,,980858,,9221524,31901,9221524,31901,539844,,526404,,5763829,11033,8384437,27032 +"2020-10-21","GA",7704,,30,,30676,30676,1736,135,5734,,,0,,,,,,343750,343750,1312,0,28101,,,,321274,,,0,3338315,10479,320491,,,,,0,3338315,10479 +"2020-10-21","GU",69,,2,,,,71,0,,12,57275,655,,,,,4,3968,3950,82,0,6,18,,,,2398,,0,61243,737,202,41,,,,0,61200,735 +"2020-10-21","HI",189,189,2,,1025,1025,81,13,,19,,0,,,,,13,14350,14156,88,0,,,,,14097,11150,482982,3681,482982,3681,,,,,,0,,0 +"2020-10-21","IA",1584,,29,,,,534,0,,134,738352,3645,,60834,,,49,104190,104190,1179,0,,,3695,5615,,84671,,0,842542,4824,,,64568,68339,844194,4846,,0 +"2020-10-21","ID",535,492,4,43,2277,2277,187,46,509,54,309309,1697,,,,,,54663,48524,873,0,,,,,,26549,,0,357833,2451,,,,,357833,2451,471700,3991 +"2020-10-21","IL",9605,9345,68,260,,,2338,0,,502,,0,,,,,194,358804,355217,4342,0,,,,,,,,0,6950105,66791,,,,,,0,6950105,66791 +"2020-10-21","IN",4023,3790,15,233,15163,15163,1484,180,2976,412,1428713,7027,,,,,141,152396,,1732,0,,,,,148743,,,0,2574800,23394,,,,,1581109,8759,2574800,23394 +"2020-10-21","KS",952,,80,,3506,3506,329,85,975,1,531053,5627,,,,299,45,74456,,1488,0,,,,,,,,0,605509,7115,,,,,605509,7115,,0 +"2020-10-21","KY",1363,1346,21,17,6721,6721,794,56,1651,203,,0,,,,,,90996,77233,1452,0,,,,,,17534,,0,1714875,7978,81800,40741,,,,0,1714875,7978 +"2020-10-21","LA",5790,5584,18,206,,,608,0,,,2450272,13584,,,,,68,181132,177399,1363,0,,,,,,165282,,0,2631404,14947,,,,,,0,2627671,14302 +"2020-10-21","MA",9780,9559,22,221,13056,13056,519,35,,91,2419306,12076,,,,,36,146166,142941,702,0,,,,,186257,118892,,0,5366394,60353,,,124834,168123,2562247,12722,5366394,60353 +"2020-10-21","MD",4058,3912,8,146,16549,16549,463,33,,131,1694771,6610,,131954,,,,137236,137236,492,0,,,13261,,165228,7960,,0,3138875,17076,,,145215,,1832007,7102,3138875,17076 +"2020-10-21","ME",146,145,0,1,470,470,7,1,,0,,0,10036,,,,0,6027,5381,38,0,346,0,,,6414,5244,,0,548418,6441,10394,1,,,,0,548418,6441 +"2020-10-21","MI",7418,7086,35,332,,,1050,0,,267,,0,,,4252959,,112,167872,150989,1878,0,,,,,205705,109539,,0,4458664,35177,316762,,,,,0,4458664,35177 +"2020-10-21","MN",2281,2269,35,12,9147,9147,588,105,2473,160,1581923,7189,,,,,,126591,126262,1060,0,,,,,,113158,2539376,16377,2539376,16377,,21144,,,1708185,8236,,0 +"2020-10-21","MO",2641,,26,,,,1415,0,,450,1247005,12006,79737,,2137998,,170,160869,160869,1244,0,5027,5307,,,184494,,,0,2326868,30194,84961,26609,69077,14660,1407874,14774,2326868,30194 +"2020-10-21","MP",2,2,0,,4,4,,0,,,15723,0,,,,,,88,88,0,0,,,,,,29,,0,15811,0,,,,,15811,0,22212,0 +"2020-10-21","MS",3223,2919,21,304,6380,6380,711,0,,151,729544,0,,,,,73,112123,99919,801,0,,,,,,97675,,0,841667,801,41053,72982,,,,0,827497,0 +"2020-10-21","MT",275,,23,,1068,1068,345,13,,,,0,,,,,,24712,,619,0,,,,,,15085,,0,447994,2973,,,,,,0,447994,2973 +"2020-10-21","NC",4032,3981,40,51,,,1219,0,,337,,0,,,,,,250592,241792,1842,0,,,,,,,,0,3672176,16603,,17543,,,,0,3672176,16603 +"2020-10-21","ND",427,,10,,1324,1324,219,23,281,33,241431,525,9962,,,,,34114,33957,521,0,590,,,,,27769,752495,6131,752495,6131,10552,329,,,275596,1024,782486,6447 +"2020-10-21","NE",565,,11,,2706,2706,380,26,,,490513,2661,,,751071,,,59409,,592,0,,,,,70666,39687,,0,822904,12406,,,,,550239,3253,822904,12406 +"2020-10-21","NH",469,,1,,763,763,14,0,246,,308912,2152,,,,,,9917,9380,89,0,,,,,,8650,,0,552925,9363,32680,,31852,,318292,2201,552925,9363 +"2020-10-21","NJ",16245,14456,18,1789,24441,24441,844,79,,175,4040900,27793,,,,,63,231428,223223,1301,0,,,,,,,,0,4272328,29094,,,,,,0,4264123,28823 +"2020-10-21","NM",950,,8,,4079,4079,202,49,,,,0,,,,,,38715,,819,0,,,,,,20332,,0,1078087,7606,,,,,,0,1078087,7606 +"2020-10-21","NV",1732,,5,,,,535,0,,147,677549,2736,,,,,47,92064,92064,565,0,,,,,,,1165414,9385,1165414,9385,,,,,769613,3301,,0 +"2020-10-21","NY",25679,,7,,89995,89995,950,0,,201,,0,,,,,103,488506,,2026,0,,,,,,,13197504,124789,13197504,124789,,,,,,0,,0 +"2020-10-21","OH",5149,4839,66,310,17523,17523,1252,135,3632,345,,0,,,,,164,188005,177098,2366,0,,709,,,198708,153769,,0,4007602,31286,,23146,,,,0,4007602,31286 +"2020-10-21","OK",1210,,19,,8077,8077,870,113,,317,1367370,9908,,,1367370,,,110855,,1307,0,4635,,,,122518,94979,,0,1478225,11215,85717,,,,,0,1491841,11078 +"2020-10-21","OR",633,,5,,2964,2964,183,17,,57,755181,6466,,,1238092,,14,40136,,342,0,,,,,65219,,,0,1303311,13204,,,,,793299,6803,1303311,13204 +"2020-10-21","PA",8562,,29,,,,966,0,,,2167536,11897,,,,,104,186297,178648,1425,0,,,,,,147174,3737277,28947,3737277,28947,,,,,2346184,13136,,0 +"2020-10-21","PR",774,590,5,184,,,378,0,,62,305972,0,,,395291,,45,29717,29717,132,0,29113,,,,20103,26018,,0,335689,132,,,,,,0,415664,0 +"2020-10-21","RI",1169,,5,,3091,3091,130,19,,14,375557,3151,,,959236,,6,29123,,474,0,,,,,39324,,998560,13240,998560,13240,,,,,404680,3625,,0 +"2020-10-21","SC",3708,3487,12,221,10062,10062,743,34,,197,1467192,12763,69038,,1418122,,98,166357,159433,864,0,8225,14381,,,208503,84052,,0,1633549,13627,77263,87938,,,,0,1626625,13449 +"2020-10-21","SD",333,,3,,2239,2239,332,46,,,201206,937,,,,,,35044,34031,587,0,,,,,40114,26023,,0,351804,3630,,,,,236250,1524,351804,3630 +"2020-10-21","TN",2970,2834,18,136,9734,9734,1424,53,,388,,0,,,3133279,,167,235861,223867,2292,0,,11167,,,270982,210243,,0,3404261,19210,,78781,,,,0,3404261,19210 +"2020-10-21","TX",17201,,114,,,,4782,0,,1424,,0,,,,,,838809,838809,5252,0,43253,26165,,,920980,739140,,0,7769909,82859,457228,333932,,,,0,7769909,82859 +"2020-10-21","UT",557,,6,,4807,4807,338,54,1040,111,868886,5587,,,1175636,406,,98006,,1363,0,,3890,,3718,104675,72606,,0,1280311,11847,,65372,,30987,963008,6536,1280311,11847 +"2020-10-21","VA",3515,3266,30,249,12010,12010,1010,55,,202,,0,,,,,97,168772,157998,1018,0,10737,6573,,,188401,,2431736,19796,2431736,19796,149742,118874,,,,0,,0 +"2020-10-21","VI",21,,0,,,,,0,,,21768,251,,,,,,1337,,2,0,,,,,,1303,,0,23105,253,,,,,23173,294,,0 +"2020-10-21","VT",58,58,0,,,,4,0,,,177252,771,,,,,,1983,1975,20,0,,,,,,1708,,0,362906,2103,,,,,179227,790,362906,2103 +"2020-10-21","WA",2282,2282,24,,8124,8124,414,47,,109,,0,,,,,43,102728,100906,913,0,,,,,,,2252788,8452,2252788,8452,,,,,,0,,0 +"2020-10-21","WI",1702,1681,50,21,9704,9704,1190,167,1371,299,1718564,5681,,,,,,192191,182687,4363,0,,,,,,142485,2924206,13633,2924206,13633,,,,,1901251,9886,,0 +"2020-10-21","WV",413,409,5,4,,,188,0,,65,,0,,,,,25,20734,19664,215,0,,,,,,15215,,0,692965,4824,18791,,,,,0,692965,4824 +"2020-10-21","WY",61,,0,,373,373,66,2,,,111822,3068,,,238683,,,9848,8305,322,0,,,,,10742,7070,,0,249425,4292,,,,,120127,4036,249425,4292 +"2020-10-20","AK",67,67,0,,389,389,38,2,,,,0,,,535040,,10,11456,,231,0,,,,,11169,6681,,0,546525,10302,,,,,,0,546525,10302 +"2020-10-20","AL",2805,2633,16,172,19081,19081,846,0,1954,,1112559,4731,,,,1114,,174528,153016,1043,0,,,,,,74238,,0,1265575,5475,,,61855,,1265575,5475,,0 +"2020-10-20","AR",1728,1576,14,152,6428,6428,627,67,,257,1137234,7110,,,1137234,782,96,100441,94418,844,0,,,,6672,,90283,,0,1231652,7738,,,,37538,,0,1231652,7738 +"2020-10-20","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-20","AZ",5837,5550,7,287,20719,20719,777,71,,170,1419675,6571,,,,,91,232937,227670,1040,0,,,,,,,,0,2563078,26554,,,309446,,1647345,7560,2563078,26554 +"2020-10-20","CA",16992,,22,,,,3104,0,,781,,0,,,,,,874077,874077,3286,0,,,,,,,,0,17189070,146662,,,,,,0,17189070,146662 +"2020-10-20","CO",2182,1801,2,381,8332,8332,516,84,,,1014193,5287,165070,,,,,87582,81528,1208,0,12594,,,,,,1724038,15588,1724038,15588,177664,,,,1095721,6279,,0 +"2020-10-20","CT",4559,3658,5,901,12043,12043,217,0,,,,0,,,2197459,,,64455,61863,434,0,,,,,79643,9651,,0,2279693,37500,,,,,,0,2279693,37500 +"2020-10-20","DC",642,,1,,,,85,0,,20,,0,,,,,9,16445,,50,0,,,,,,12884,473807,4767,473807,4767,,,,,243299,1678,,0 +"2020-10-20","DE",668,587,2,81,,,107,0,,25,307401,1579,,,,,,23325,22220,129,0,,,,,25574,12245,515381,2352,515381,2352,,,,,330726,1708,,0 +"2020-10-20","FL",16308,,86,,47895,47895,2094,231,,,5007558,25002,487730,475588,7334681,,,750739,725571,3556,0,51923,,50676,,978150,,9189623,58302,9189623,58302,539844,,526404,,5752796,28581,8357405,48510 +"2020-10-20","GA",7674,,17,,30541,30541,1713,153,5701,,,0,,,,,,342438,342438,1128,0,28073,,,,320414,,,0,3327836,13557,320265,,,,,0,3327836,13557 +"2020-10-20","GU",67,,1,,,,70,0,,17,56620,827,,,,,6,3886,3869,130,0,6,17,,,,2354,,0,60506,957,202,39,,,,0,60465,954 +"2020-10-20","HI",187,187,0,,1012,1012,96,7,,22,,0,,,,,15,14262,14068,37,0,,,,,14014,11078,479301,1985,479301,1985,,,,,,0,,0 +"2020-10-20","IA",1555,,17,,,,501,0,,122,734707,1651,,60605,,,45,103011,103011,494,0,,,3685,5433,,83518,,0,837718,2145,,,64329,67096,839348,2147,,0 +"2020-10-20","ID",531,488,3,43,2231,2231,187,25,506,54,307612,1597,,,,,,53790,47770,698,0,,,,,,26238,,0,355382,2192,,,,,355382,2192,467709,4161 +"2020-10-20","IL",9537,9277,41,260,,,2261,0,,489,,0,,,,,195,354462,350875,3714,0,,,,,,,,0,6883314,59077,,,,,,0,6883314,59077 +"2020-10-20","IN",4008,3775,48,233,14983,14983,1425,157,2954,412,1421686,6130,,,,,141,150664,,1498,0,,,,,147110,,,0,2551406,17543,,,,,1572350,7628,2551406,17543 +"2020-10-20","KS",872,,0,,3421,3421,285,0,952,81,525426,0,,,,294,39,72968,,0,0,,,,,,,,0,598394,0,,,,,598394,0,,0 +"2020-10-20","KY",1342,1326,16,16,6665,6665,776,49,1638,202,,0,,,,,,89544,76113,1297,0,,,,,,17402,,0,1706897,8082,81597,39937,,,,0,1706897,8082 +"2020-10-20","LA",5772,5572,6,200,,,586,0,,,2436688,18294,,,,,62,179769,176681,699,0,,,,,,161792,,0,2616457,18993,,,,,,0,2613369,18993 +"2020-10-20","MA",9758,9537,5,221,13021,13021,517,12,,94,2407230,16417,,,,,35,145464,142295,976,0,,,,,185451,118892,,0,5306041,66390,,,124711,166394,2549525,17238,5306041,66390 +"2020-10-20","MD",4050,3904,9,146,16516,16516,464,41,,123,1688161,7593,,129260,,,,136744,136744,590,0,,,12794,,164580,7926,,0,3121799,17966,,,142054,,1824905,8183,3121799,17966 +"2020-10-20","ME",146,145,0,1,469,469,9,0,,1,,0,10025,,,,0,5989,5341,27,0,345,0,,,6377,5206,,0,541977,4549,10382,1,,,,0,541977,4549 +"2020-10-20","MI",7383,7053,20,330,,,1050,0,,267,,0,,,4219797,,106,165994,149392,1871,0,,,,,203690,109539,,0,4423487,50752,316115,,,,,0,4423487,50752 +"2020-10-20","MN",2246,2235,7,11,9042,9042,567,126,2451,155,1574734,4604,,,,,,125531,125215,1092,0,,,,,,111634,2522999,11604,2522999,11604,,20649,,,1699949,5684,,0 +"2020-10-20","MO",2615,,25,,,,1439,0,,429,1234999,0,79502,,2110912,,156,159625,159625,1524,0,4953,5104,,,181463,,,0,2296674,0,84652,25263,68919,14224,1393100,0,2296674,0 +"2020-10-20","MP",2,2,0,,4,4,,0,,,15723,267,,,,,,88,88,2,0,,,,,,29,,0,15811,269,,,,,15811,278,22212,2377 +"2020-10-20","MS",3202,2903,31,299,6380,6380,664,0,,161,729544,0,,,,,73,111322,99451,730,0,,,,,,97675,,0,840866,730,41053,72982,,,,0,827497,0 +"2020-10-20","MT",252,,11,,1055,1055,360,35,,,,0,,,,,,24093,,703,0,,,,,,14842,,0,445021,2655,,,,,,0,445021,2655 +"2020-10-20","NC",3992,3941,53,51,,,1203,0,,326,,0,,,,,,248750,240297,1578,0,,,,,,,,0,3655573,23119,,16457,,,,0,3655573,23119 +"2020-10-20","ND",417,,4,,1301,1301,209,34,279,39,240906,806,9943,,,,,33593,33448,1049,0,584,,,,,27222,746364,5204,746364,5204,10527,288,,,274572,1835,776039,5529 +"2020-10-20","NE",554,,6,,2680,2680,380,22,,,487852,2707,,,739379,,,58817,,749,0,,,,,69955,39313,,0,810498,10919,,,,,546986,3456,810498,10919 +"2020-10-20","NH",468,,0,,763,763,16,2,246,,306760,1219,,,,,,9828,9331,82,0,,,,,,8536,,0,543562,0,32594,,31802,,316091,1285,543562,0 +"2020-10-20","NJ",16227,14438,13,1789,24362,24362,781,89,,169,4013107,16607,,,,,69,230127,222193,1235,0,,,,,,,,0,4243234,17842,,,,,,0,4235300,17595 +"2020-10-20","NM",942,,7,,4030,4030,205,53,,,,0,,,,,,37896,,594,0,,,,,,20165,,0,1070481,9213,,,,,,0,1070481,9213 +"2020-10-20","NV",1727,,15,,,,506,0,,141,674813,2454,,,,,57,91499,91499,656,0,,,,,,,1156029,28,1156029,28,,,,,766312,3110,,0 +"2020-10-20","NY",25672,,13,,89995,89995,942,0,,194,,0,,,,,99,486480,,1201,0,,,,,,,13072715,90540,13072715,90540,,,,,,0,,0 +"2020-10-20","OH",5083,4775,8,308,17388,17388,1221,216,3597,322,,0,,,,,161,185639,174859,2015,0,,478,,,197089,152460,,0,3976316,31605,,16554,,,,0,3976316,31605 +"2020-10-20","OK",1191,,18,,7964,7964,821,149,,319,1357462,29930,,,1357462,,,109548,,1475,0,4635,,,,121425,93698,,0,1467010,31405,85717,,,,,0,1480763,32604 +"2020-10-20","OR",628,,8,,2947,2947,168,61,,50,748715,3143,,,1225279,,11,39794,,262,0,,,,,64828,,,0,1290107,9333,,,,,786496,13271,1290107,9333 +"2020-10-20","PA",8533,,33,,,,918,0,,,2155639,11673,,,,,94,184872,177409,1557,0,,,,,,146048,3708330,31993,3708330,31993,,,,,2333048,13028,,0 +"2020-10-20","PR",769,586,1,183,,,378,0,,61,305972,0,,,395291,,38,29585,29585,447,0,29058,,,,20103,25947,,0,335557,447,,,,,,0,415664,0 +"2020-10-20","RI",1164,,5,,3072,3072,135,22,,16,372406,1427,,,946494,,6,28649,,302,0,,,,,38826,,985320,7409,985320,7409,,,,,401055,1729,,0 +"2020-10-20","SC",3696,3475,35,221,10028,10028,697,69,,182,1454429,8838,68860,,1405705,,92,165493,158747,884,0,8177,14103,,,207471,83361,,0,1619922,9722,77037,85898,,,,0,1613176,9615 +"2020-10-20","SD",330,,7,,2193,2193,329,47,,,200269,1655,,,,,,34457,33466,621,0,,,,,39390,25686,,0,348174,3232,,,,,234726,2276,348174,3232 +"2020-10-20","TN",2952,2817,30,135,9681,9681,1424,63,,399,,0,,,3116332,,179,233569,221884,1508,0,,,,,268719,208182,,0,3385051,13154,,,,,,0,3385051,13154 +"2020-10-20","TX",17087,,65,,,,4588,0,,1349,,0,,,,,,833557,833557,7884,0,42991,25532,,,913649,733758,,0,7687050,83889,455327,323967,,,,0,7687050,83889 +"2020-10-20","UT",551,,5,,4753,4753,311,65,1030,104,863299,3982,,,1165291,403,,96643,,1081,0,,3640,,3471,103173,71693,,0,1268464,8322,,62268,,29952,956472,4919,1268464,8322 +"2020-10-20","VA",3485,3236,28,249,11955,11955,937,73,,194,,0,,,,,98,167754,157213,926,0,10696,6312,,,187280,,2411940,13829,2411940,13829,149504,113108,,,,0,,0 +"2020-10-20","VI",21,,0,,,,,0,,,21517,0,,,,,,1335,,0,0,,,,,,1296,,0,22852,0,,,,,22879,0,,0 +"2020-10-20","VT",58,58,0,,,,0,0,,,176481,348,,,,,,1963,1956,12,0,,,,,,1701,,0,360803,875,,,,,178437,360,360803,875 +"2020-10-20","WA",2258,2258,19,,8077,8077,392,59,,82,,0,,,,,36,101815,100029,298,0,,,,,,,2244336,13551,2244336,13551,,,,,,0,,0 +"2020-10-20","WI",1652,1633,35,19,9537,9537,1192,218,1354,315,1712883,9070,,,,,,187828,178482,4686,0,,,,,,139455,2910573,15330,2910573,15330,,,,,1891365,13661,,0 +"2020-10-20","WV",408,404,9,4,,,191,0,,62,,0,,,,,23,20519,19513,226,0,,,,,,14988,,0,688141,3725,18742,,,,,0,688141,3725 +"2020-10-20","WY",61,,4,,371,371,66,7,,,108754,0,,,234782,,,9526,8070,215,0,,,,,10351,6944,,0,245133,4982,,,,,116091,0,245133,4982 +"2020-10-19","AK",67,67,0,,387,387,65,4,,,,0,,,525048,,8,11225,,204,0,,,,,10859,6516,,0,536223,3512,,,,,,0,536223,3512 +"2020-10-19","AL",2789,2621,1,168,19081,19081,859,226,1939,,1107828,5459,,,,1106,,173485,152272,859,0,,,,,,74238,,0,1260100,6204,,,61800,,1260100,6204,,0 +"2020-10-19","AR",1714,1562,10,152,6361,6361,604,46,,248,1130124,7536,,,1130124,776,95,99597,93790,531,0,,,,6413,,89217,,0,1223914,7970,,,,36212,,0,1223914,7970 +"2020-10-19","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-19","AZ",5830,5544,3,286,20648,20648,721,8,,177,1413104,8043,,,,,94,231897,226681,748,0,,,,,,,,0,2536524,10128,,,309007,,1639785,8762,2536524,10128 +"2020-10-19","CA",16970,,27,,,,3002,0,,758,,0,,,,,,870791,870791,3474,0,,,,,,,,0,17042408,150346,,,,,,0,17042408,150346 +"2020-10-19","CO",2180,1800,4,380,8248,8248,465,21,,,1008906,8240,164811,,,,,86374,80536,1072,0,12564,,,,,,1708450,19137,1708450,19137,177375,,,,1089442,9284,,0 +"2020-10-19","CT",4554,3652,12,902,12043,12043,195,0,,,,0,,,2160818,,,64021,61441,1191,0,,,,,78817,9651,,0,2242193,10365,,,,,,0,2242193,10365 +"2020-10-19","DC",641,,0,,,,84,0,,20,,0,,,,,9,16395,,25,0,,,,,,12824,469040,2235,469040,2235,,,,,241621,662,,0 +"2020-10-19","DE",666,585,1,81,,,107,0,,19,305822,1619,,,,,,23196,22098,103,0,,,,,25524,12113,513029,6458,513029,6458,,,,,329018,1722,,0 +"2020-10-19","FL",16222,,54,,47664,47664,2057,72,,,4982556,15184,487730,475588,7291080,,,747183,722626,1691,0,51923,,50676,,973367,,9131321,36064,9131321,36064,539844,,526404,,5724215,35105,8308895,31025 +"2020-10-19","GA",7657,,19,,30388,30388,1664,12,5665,,,0,,,,,,341310,341310,752,0,27990,,,,319431,,,0,3314279,15821,319648,,,,,0,3314279,15821 +"2020-10-19","GU",66,,0,,,,68,0,,14,55793,500,,,,,3,3756,3742,81,0,6,14,,,,2350,,0,59549,581,202,36,,,,0,59511,1423 +"2020-10-19","HI",187,187,1,,1005,1005,96,4,,22,,0,,,,,15,14225,14031,82,0,,,,,13975,11044,477316,3735,477316,3735,,,,,,0,,0 +"2020-10-19","IA",1538,,10,,,,480,0,,113,733056,2480,,60408,,,45,102517,102517,557,0,,,3674,5221,,82188,,0,835573,3037,,,64121,65534,837201,3041,,0 +"2020-10-19","ID",528,486,-1,42,2206,2206,221,13,504,55,306015,2457,,,,,,53092,47175,510,0,,,,,,25980,,0,353190,2878,,,,,353190,2878,463548,3318 +"2020-10-19","IL",9496,9236,22,260,,,2096,0,,485,,0,,,,,179,350748,347161,3113,0,,,,,,,,0,6824237,48684,,,,,,0,6824237,48684 +"2020-10-19","IN",3960,3727,23,233,14826,14826,1373,111,2926,383,1415556,7701,,,,,125,149166,,1584,0,,,,,146170,,,0,2533863,21689,,,,,1564722,9285,2533863,21689 +"2020-10-19","KS",872,,13,,3421,3421,285,51,952,81,525426,7092,,,,294,39,72968,,2113,0,,,,,,,,0,598394,9205,,,,,598394,9205,,0 +"2020-10-19","KY",1326,1310,9,16,6616,6616,764,24,1629,190,,0,,,,,,88247,75143,640,0,,,,,,17229,,0,1698815,24167,81180,39338,,,,0,1698815,24167 +"2020-10-19","LA",5766,5566,16,200,,,553,0,,,2418394,4665,,,,,64,179070,175982,201,0,,,,,,161792,,0,2597464,4866,,,,,,0,2594376,4866 +"2020-10-19","MA",9753,9532,16,221,13009,13009,500,8,,86,2390813,16827,,,,,33,144488,141474,828,0,,,,,184514,118892,,0,5239651,70708,,,124340,162655,2532287,17654,5239651,70708 +"2020-10-19","MD",4041,3895,4,146,16475,16475,434,40,,116,1680568,9563,,129260,,,,136154,136154,497,0,,,12794,,163872,7892,,0,3103833,24671,,,142054,,1816722,10060,3103833,24671 +"2020-10-19","ME",146,145,0,1,469,469,8,1,,0,,0,10022,,,,0,5962,5323,23,0,345,0,,,6347,5175,,0,537428,3244,10379,1,,,,0,537428,3244 +"2020-10-19","MI",7363,7031,46,332,,,1050,0,,267,,0,,,4171501,,95,164123,147806,5004,0,,,,,201234,109539,,0,4372735,111021,315661,,,,,0,4372735,111021 +"2020-10-19","MN",2239,2229,5,10,8916,8916,532,50,2414,138,1570130,11624,,,,,,124439,124135,1627,0,,,,,,109963,2511395,22177,2511395,22177,,20603,,,1694265,12947,,0 +"2020-10-19","MO",2590,,8,,,,1439,0,,476,1234999,5159,79502,,2110912,,,158101,158101,1405,0,4953,5104,,,181463,,,0,2296674,11607,84652,25263,68919,14224,1393100,6564,2296674,11607 +"2020-10-19","MP",2,2,0,,4,4,,0,,,15456,0,,,,,,86,86,0,0,,,,,,29,,0,15542,0,,,,,15533,0,19835,0 +"2020-10-19","MS",3171,2879,0,292,6380,6380,653,143,,151,729544,0,,,,,70,110592,98947,586,0,,,,,,97675,,0,840136,586,41053,72982,,,,0,827497,0 +"2020-10-19","MT",241,,0,,1020,1020,339,10,,,,0,,,,,,23390,,569,0,,,,,,13538,,0,442366,11232,,,,,,0,442366,11232 +"2020-10-19","NC",3939,3892,5,47,,,1142,0,,311,,0,,,,,,247172,238894,1144,0,,,,,,,,0,3632454,32583,,15544,,,,0,3632454,32583 +"2020-10-19","ND",413,,4,,1267,1267,205,14,277,38,240100,1523,9918,,,,,32544,32416,658,0,572,,,,,26392,741160,8072,741160,8072,10490,266,,,272737,2182,770510,8427 +"2020-10-19","NE",548,,0,,2658,2658,343,8,,,485145,3352,,,729099,,,58068,,734,0,,,,,69055,38956,,0,799579,7949,,,,,543530,4088,799579,7949 +"2020-10-19","NH",468,,1,,761,761,16,0,246,,305541,1403,,,,,,9746,9265,52,0,,,,,,8258,,0,543562,4949,32594,,31773,,314806,1442,543562,4949 +"2020-10-19","NJ",16214,14425,3,1789,24273,24273,758,113,,166,3996500,79442,,,,,62,228892,221205,1371,0,,,,,,,,0,4225392,80813,,,,,,0,4217705,81909 +"2020-10-19","NM",935,,1,,3977,3977,183,37,,,,0,,,,,,37302,,514,0,,,,,,20001,,0,1061268,6377,,,,,,0,1061268,6377 +"2020-10-19","NV",1712,,2,,,,485,0,,148,672359,3112,,,,,53,90843,90843,582,0,,,,,,,1156001,1348,1156001,1348,,,,,763202,3694,,0 +"2020-10-19","NY",25659,,15,,89995,89995,934,0,,198,,0,,,,,106,485279,,998,0,,,,,,,12982175,82009,12982175,82009,,,,,,0,,0 +"2020-10-19","OH",5075,4767,8,308,17172,17172,1154,111,3561,303,,0,,,,,158,183624,172997,1837,0,,423,,,195538,151037,,0,3944711,46100,,15202,,,,0,3944711,46100 +"2020-10-19","OK",1173,,2,,7815,7815,792,17,,301,1327532,0,,,1327532,,,108073,,774,0,4635,,,,118537,92367,,0,1435605,774,85717,,,,,0,1448159,0 +"2020-10-19","OR",620,,0,,2886,2886,190,0,,44,745572,3245,,,1216298,,15,39532,,216,0,,,,,64476,,,0,1280774,8454,,,,,773225,0,1280774,8454 +"2020-10-19","PA",8500,,8,,,,870,0,,,2143966,11315,,,,,89,183315,176054,1103,0,,,,,,146652,3676337,24179,3676337,24179,,,,,2320020,12321,,0 +"2020-10-19","PR",768,585,2,183,,,327,0,,64,305972,0,,,395291,,41,29138,29138,427,0,28812,,,,20103,25939,,0,335110,427,,,,,,0,415664,0 +"2020-10-19","RI",1159,,1,,3050,3050,124,0,,16,370979,1017,,,939292,,4,28347,,85,0,,,,,38619,,977911,2927,977911,2927,,,,,399326,1102,,0 +"2020-10-19","SC",3661,3449,11,212,9959,9959,697,20,,182,1445591,8318,68662,,1397088,,92,164609,157970,619,0,8160,13882,,,206473,82637,,0,1610200,8937,76822,83607,,,,0,1603561,8894 +"2020-10-19","SD",323,,0,,2146,2146,304,27,,,198614,836,,,,,,33836,32904,567,0,,,,,38872,25125,,0,344942,3906,,,,,232450,1403,344942,3906 +"2020-10-19","TN",2922,2789,13,133,9618,9618,1338,41,,390,,0,,,3104663,,177,232061,220566,3317,0,,,,,267234,205832,,0,3371897,42410,,,,,,0,3371897,42410 +"2020-10-19","TX",17022,,8,,,,4319,0,,1349,,0,,,,,,825673,825673,1894,0,42646,24713,,,905339,729762,,0,7603161,23929,452388,313129,,,,0,7603161,23929 +"2020-10-19","UT",546,,3,,4688,4688,304,32,1022,103,859317,5466,,,1158217,401,,95562,,1168,0,,3451,,3288,101925,71035,,0,1260142,7159,,60235,,29106,951553,6487,1260142,7159 +"2020-10-19","VA",3457,3209,24,248,11882,11882,972,21,,210,,0,,,,,81,166828,156439,690,0,10684,6077,,,186494,,2398111,11333,2398111,11333,149429,108105,,,,0,,0 +"2020-10-19","VI",21,,0,,,,,0,,,21517,0,,,,,,1335,,0,0,,,,,,1296,,0,22852,0,,,,,22879,0,,0 +"2020-10-19","VT",58,58,0,,,,0,0,,,176133,1047,,,,,,1951,1944,8,0,,,,,,1696,,0,359928,4271,,,,,178077,1055,359928,4271 +"2020-10-19","WA",2239,2239,0,,8018,8018,388,24,,72,,0,,,,,26,101517,99734,409,0,,,,,,,2230785,16225,2230785,16225,,,,,,0,,0 +"2020-10-19","WI",1617,1600,29,17,9319,9319,1172,292,1340,302,1703813,113244,,,,,,183142,173891,7915,0,,,,,,136910,2895243,20113,2895243,20113,,,,,1877704,120949,,0 +"2020-10-19","WV",399,395,0,4,,,177,0,,67,,0,,,,,26,20293,19328,212,0,,,,,,14799,,0,684416,6970,18733,,,,,0,684416,6970 +"2020-10-19","WY",57,,0,,364,364,68,4,,,108754,0,,,230230,,,9311,7924,286,0,,,,,9921,6796,,0,240151,6226,,,,,116091,0,240151,6226 +"2020-10-18","AK",67,67,0,,383,383,73,6,,,,0,,,521666,,11,11021,,210,0,,,,,10729,6488,,0,532711,2211,,,,,,0,532711,2211 +"2020-10-18","AL",2788,2620,0,168,18855,18855,823,0,1934,,1102369,4270,,,,1103,,172626,151527,964,0,,,,,,74238,,0,1253896,5101,,,61573,,1253896,5101,,0 +"2020-10-18","AR",1704,1552,20,152,6315,6315,565,37,,241,1122588,7773,,,1122588,769,96,99066,93356,644,0,,,,6308,,88450,,0,1215944,8302,,,,35634,,0,1215944,8302 +"2020-10-18","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-18","AZ",5827,5541,3,286,20640,20640,714,22,,176,1405061,9622,,,,,85,231149,225962,742,0,,,,,,,,0,2526396,12365,,,308189,,1631023,10320,2526396,12365 +"2020-10-18","CA",16943,,44,,,,3020,0,,727,,0,,,,,,867317,867317,2862,0,,,,,,,,0,16892062,135351,,,,,,0,16892062,135351 +"2020-10-18","CO",2176,1796,0,380,8227,8227,445,10,,,1000666,9258,164456,,,,,85302,79492,933,0,12531,,,,,,1689313,21260,1689313,21260,176987,,,,1080158,10181,,0 +"2020-10-18","CT",4542,3641,0,901,12043,12043,184,0,,,,0,,,2150801,,,62830,60309,0,0,,,,,78484,9651,,0,2231828,10568,,,,,,0,2231828,10568 +"2020-10-18","DC",641,,0,,,,78,0,,20,,0,,,,,8,16370,,36,0,,,,,,12801,466805,3837,466805,3837,,,,,240959,1124,,0 +"2020-10-18","DE",665,584,1,81,,,106,0,,21,304203,2676,,,,,,23093,21997,151,0,,,,,25347,12018,506571,5098,506571,5098,,,,,327296,2827,,0 +"2020-10-18","FL",16168,,50,,47592,47592,2005,79,,,4967372,15753,487730,475588,7262384,,,745492,721118,2474,0,51923,,50676,,971097,,9095257,53114,9095257,53114,539844,,526404,,5689110,0,8277870,39555 +"2020-10-18","GA",7638,,31,,30376,30376,1654,26,5663,,,0,,,,,,340558,340558,1174,0,27884,,,,318366,,,0,3298458,17790,319165,,,,,0,3298458,17790 +"2020-10-18","GU",66,,2,,,,63,0,,13,55293,230,,,,,4,3675,3664,58,0,6,11,,,,2297,,0,58968,288,201,32,,,,0,58088,0 +"2020-10-18","HI",186,186,1,,1001,1001,96,13,,22,,0,,,,,15,14143,13949,96,0,,,,,13890,10995,473581,3897,473581,3897,,,,,,0,,0 +"2020-10-18","IA",1528,,1,,,,475,0,,108,730576,3795,,60388,,,45,101960,101960,857,0,,,3667,5161,,81811,,0,832536,4652,,,64094,65140,834160,4657,,0 +"2020-10-18","ID",529,487,6,42,2193,2193,221,19,503,55,303558,1126,,,,,,52582,46754,878,0,,,,,,25679,,0,350312,1794,,,,,350312,1794,460230,2586 +"2020-10-18","IL",9474,9214,22,260,,,2012,0,,408,,0,,,,,157,347635,344048,4245,0,,,,,,,,0,6775553,79296,,,,,,0,6775553,79296 +"2020-10-18","IN",3937,3704,19,233,14715,14715,1387,111,2907,403,1407855,7905,,,,,136,147582,,1605,0,,,,,144379,,,0,2512174,26668,,,,,1555437,9510,2512174,26668 +"2020-10-18","KS",859,,0,,3370,3370,456,0,933,123,518334,0,,,,284,47,70855,,0,0,,,,,,,,0,589189,0,,,,,589189,0,,0 +"2020-10-18","KY",1317,1303,5,14,6592,6592,691,0,1629,185,,0,,,,,,87607,74600,810,0,,,,,,17155,,0,1674648,0,80982,39004,,,,0,1674648,0 +"2020-10-18","LA",5750,5550,23,200,,,550,0,,,2413729,25803,,,,,60,178869,175781,1143,0,,,,,,161792,,0,2592598,26946,,,,,,0,2589510,26946 +"2020-10-18","MA",9737,9517,14,220,13001,13001,483,11,,83,2373986,14844,,,,,32,143660,140647,730,0,,,,,183400,118892,,0,5168943,80146,,,124154,162157,2514633,15588,5168943,80146 +"2020-10-18","MD",4037,3891,1,146,16435,16435,433,83,,115,1671005,11228,,129260,,,,135657,135657,530,0,,,12794,,163239,7890,,0,3079162,29528,,,142054,,1806662,11758,3079162,29528 +"2020-10-18","ME",146,145,0,1,468,468,11,1,,5,,0,9979,,,,1,5939,5309,26,0,344,0,,,6331,5145,,0,534184,6650,10353,1,,,,0,534184,6650 +"2020-10-18","MI",7317,6987,0,330,,,1000,0,,254,,0,,,4111638,,94,159119,143106,0,0,,,,,197889,109539,,0,4261714,0,310344,,,,,0,4261714,0 +"2020-10-18","MN",2234,2224,17,10,8866,8866,484,65,2405,126,1558506,17973,,,,,,122812,122524,1722,0,,,,,,108316,2489218,30947,2489218,30947,,20516,,,1681318,19967,,0 +"2020-10-18","MO",2582,,2,,,,918,0,,,1229840,6105,79346,,2100802,,,156696,156696,1768,0,4983,5042,,,179986,,,0,2285067,18079,84527,25059,68797,14120,1386536,7873,2285067,18079 +"2020-10-18","MP",2,2,0,,4,4,,0,,,15456,0,,,,,,86,86,0,0,,,,,,29,,0,15542,0,,,,,15533,0,19835,0 +"2020-10-18","MS",3171,2879,0,292,6237,6237,609,0,,140,729544,0,,,,,69,110006,98475,0,0,,,,,,94165,,0,839550,0,41053,72982,,,,0,827497,0 +"2020-10-18","MT",241,,1,,1010,1010,331,9,,,,0,,,,,,22821,,588,0,,,,,,13441,,0,431134,3006,,,,,,0,431134,3006 +"2020-10-18","NC",3934,3887,5,47,,,1129,0,,310,,0,,,,,,246028,237805,2303,0,,,,,,,,0,3599871,33614,,15275,,,,0,3599871,33614 +"2020-10-18","ND",409,,5,,1253,1253,210,11,277,35,238577,1166,9914,,,,,31886,31760,713,0,572,,,,,25922,733088,6901,733088,6901,10486,264,,,270555,1883,762083,7314 +"2020-10-18","NE",548,,1,,2650,2650,320,3,,,481793,3160,,,721983,,,57334,,620,0,,,,,68235,38629,,0,791630,7195,,,,,539442,3781,791630,7195 +"2020-10-18","NH",467,,1,,761,761,17,0,246,,304138,1691,,,,,,9694,9226,69,0,,,,,,8256,,0,538613,15272,32583,,31764,,313364,1749,538613,15272 +"2020-10-18","NJ",16211,14422,7,1789,24160,24160,732,0,,169,3917058,0,,,,,67,227521,220013,1430,0,,,,,,,,0,4144579,1430,,,,,,0,4135796,0 +"2020-10-18","NM",934,,5,,3940,3940,171,29,,,,0,,,,,,36788,,445,0,,,,,,19894,,0,1054891,8164,,,,,,0,1054891,8164 +"2020-10-18","NV",1710,,3,,,,503,0,,139,669247,3665,,,,,60,90261,90261,609,0,,,,,,,1154653,4230,1154653,4230,,,,,759508,4274,,0 +"2020-10-18","NY",25644,,7,,89995,89995,913,0,,200,,0,,,,,102,484281,,1390,0,,,,,,,12900166,128763,12900166,128763,,,,,,0,,0 +"2020-10-18","OH",5067,4759,0,308,17061,17061,1097,52,3547,289,,0,,,,,133,181787,171245,1562,0,,346,,,193485,150167,,0,3898611,44483,,13867,,,,0,3898611,44483 +"2020-10-18","OK",1171,,3,,7798,7798,792,28,,301,1327532,0,,,1327532,,,107299,107299,796,0,4635,,,,118537,91643,,0,1434831,796,85717,,,,,0,1448159,0 +"2020-10-18","OR",620,,3,,2886,2886,190,0,,44,742327,6073,,,1208130,,15,39316,,381,0,,,,,64190,,,0,1272320,11502,,,,,773225,0,1272320,11502 +"2020-10-18","PA",8492,,26,,,,841,0,,,2132651,12801,,,,,93,182212,175048,1269,0,,,,,,144754,3652158,30370,3652158,30370,,,,,2307699,13999,,0 +"2020-10-18","PR",766,583,5,183,,,292,0,,59,305972,0,,,395291,,39,28711,28711,418,0,28582,,,,20103,25870,,0,334683,418,,,,,,0,415664,0 +"2020-10-18","RI",1158,,0,,3050,3050,124,11,,16,369962,3166,,,936469,,4,28262,,284,0,,,,,38515,,974984,13977,974984,13977,,,,,398224,3450,,0 +"2020-10-18","SC",3650,3439,13,211,9939,9939,716,22,,186,1437273,15436,68524,,1388936,,97,163990,157394,776,0,8105,13785,,,205731,82119,,0,1601263,16212,76629,82974,,,,0,1594667,16175 +"2020-10-18","SD",323,,8,,2119,2119,300,42,,,197778,1185,,,,,,33269,32339,658,0,,,,,38309,24934,,0,341036,4288,,,,,231047,1843,341036,4288 +"2020-10-18","TN",2909,2776,6,133,9577,9577,1105,22,,324,,0,,,3065776,,143,228744,217412,2605,0,,,,,263711,204726,,0,3329487,35431,,,,,,0,3329487,35431 +"2020-10-18","TX",17014,,30,,,,4226,0,,1340,,0,,,,,,823779,823779,3216,0,42428,24447,,,902376,726231,,0,7579232,32359,450891,310816,,,,0,7579232,32359 +"2020-10-18","UT",543,,3,,4656,4656,307,46,1022,102,853851,5904,,,1151842,401,,94394,,1097,0,,3424,,3261,101141,70166,,0,1252983,9579,,59735,,28872,945066,7205,1252983,9579 +"2020-10-18","VA",3433,3186,11,247,11861,11861,972,30,,205,,0,,,,,95,166138,155838,900,0,10636,5949,,,185890,,2386778,20398,2386778,20398,149155,107193,,,,0,,0 +"2020-10-18","VI",21,,0,,,,,0,,,21517,342,,,,,,1335,,6,0,,,,,,1296,,0,22852,348,,,,,22879,345,,0 +"2020-10-18","VT",58,58,0,,,,2,0,,,175086,1028,,,,,,1943,1936,11,0,,,,,,1689,,0,355657,5301,,,,,177022,1038,355657,5301 +"2020-10-18","WA",2239,2239,0,,7994,7994,376,23,,91,,0,,,,,26,101108,99334,664,0,,,,,,,2214560,20306,2214560,20306,,,,,,0,,0 +"2020-10-18","WI",1588,1574,0,14,9027,9027,1090,0,1325,284,1590569,0,,,,,,175227,166186,0,0,,,,,,130231,2875130,26894,2875130,26894,,,,,1756755,0,,0 +"2020-10-18","WV",399,395,0,4,,,173,0,,64,,0,,,,,28,20081,19142,280,0,,,,,,14742,,0,677446,8349,18724,,,,,0,677446,8349 +"2020-10-18","WY",57,,0,,360,360,51,2,,,108754,0,,,224580,,,9025,7673,209,0,,,,,9345,6627,,0,233925,797,,,,,116091,0,233925,797 +"2020-10-17","AK",67,67,1,,377,377,68,4,,,,0,,,519506,,9,10811,,210,0,,,,,10678,6448,,0,530500,7836,,,,,,0,530500,7836 +"2020-10-17","AL",2788,2620,2,168,18855,18855,823,0,1933,,1098099,6641,,,,1102,,171662,150696,1288,0,,,,,,74238,,0,1248795,7613,,,61431,,1248795,7613,,0 +"2020-10-17","AR",1684,1533,19,151,6278,6278,573,35,,236,1114815,9034,,,1114815,766,92,98422,92827,883,0,,,,6192,,87920,,0,1207642,9744,,,,35396,,0,1207642,9744 +"2020-10-17","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-17","AZ",5824,5539,18,285,20618,20618,757,127,,174,1395439,10458,,,,,81,230407,225264,921,0,,,,,,,,0,2514031,20992,,,307425,,1620703,11323,2514031,20992 +"2020-10-17","CA",16899,,69,,,,2995,0,,743,,0,,,,,,864455,864455,2979,0,,,,,,,,0,16756711,134755,,,,,,0,16756711,134755 +"2020-10-17","CO",2176,1796,4,380,8217,8217,428,48,,,991408,9154,164003,,,,,84369,78569,1139,0,12492,,,,,,1668053,21496,1668053,21496,176495,,,,1069977,10146,,0 +"2020-10-17","CT",4542,3641,0,901,12043,12043,184,0,,,,0,,,2140611,,,62830,60309,0,0,,,,,78112,9651,,0,2221260,24842,,,,,,0,2221260,24842 +"2020-10-17","DC",641,,0,,,,84,0,,23,,0,,,,,8,16334,,79,0,,,,,,12793,462968,7181,462968,7181,,,,,239835,2161,,0 +"2020-10-17","DE",664,583,2,81,,,101,0,,26,301527,3109,,,,,,22942,21849,218,0,,,,,25217,11928,501473,6058,501473,6058,,,,,324469,3327,,0 +"2020-10-17","FL",16118,,88,,47513,47513,2031,117,,,4951619,26371,487730,475588,7226175,,,743018,718916,3968,0,51923,,50676,,967848,,9042143,76807,9042143,76807,539844,,526404,,5689110,30330,8238315,58132 +"2020-10-17","GA",7607,,51,,30350,30350,1622,133,5654,,,0,,,,,,339384,339384,1534,0,27746,,,,317180,,,0,3280668,26398,318261,,,,,0,3280668,26398 +"2020-10-17","GU",64,,1,,,,67,0,,15,55063,479,,,,,4,3617,3606,79,0,6,11,,,,2297,,0,58680,558,201,32,,,,0,58088,0 +"2020-10-17","HI",185,185,1,,988,988,100,10,,25,,0,,,,,14,14047,13853,85,0,,,,,13794,10947,469684,3654,469684,3654,,,,,,0,,0 +"2020-10-17","IA",1527,,4,,,,461,0,,104,726781,3952,,60167,,,46,101103,101103,1157,0,,,3663,5158,,81502,,0,827884,5109,,,63869,65216,829503,5119,,0 +"2020-10-17","ID",523,482,6,41,2174,2174,221,37,495,55,302432,2070,,,,,,51704,46086,1094,0,,,,,,25457,,0,348518,2933,,,,,348518,2933,457644,4943 +"2020-10-17","IL",9452,9192,27,260,,,2073,0,,422,,0,,,,,165,343390,339803,3629,0,,,,,,,,0,6696257,77489,,,,,,0,6696257,77489 +"2020-10-17","IN",3918,3685,31,233,14604,14604,1358,131,2883,403,1399950,10496,,,,,136,145977,,2482,0,,,,,143090,,,0,2485506,34221,,,,,1545927,12978,2485506,34221 +"2020-10-17","KS",859,,0,,3370,3370,456,0,933,123,518334,0,,,,284,47,70855,,0,0,,,,,,,,0,589189,0,,,,,589189,0,,0 +"2020-10-17","KY",1312,1298,12,14,6592,6592,691,47,1629,185,,0,,,,,,86797,73915,1291,0,,,,,,17155,,0,1674648,20801,80982,39004,,,,0,1674648,20801 +"2020-10-17","LA",5727,5527,0,200,,,557,0,,,2387926,0,,,,,60,177726,174638,0,0,,,,,,161792,,0,2565652,0,,,,,,0,2562564,0 +"2020-10-17","MA",9723,9503,21,220,12990,12990,500,19,,88,2359142,11845,,,,,36,142930,139903,584,0,,,,,182472,118892,,0,5088797,75834,,,123968,161945,2499045,12395,5088797,75834 +"2020-10-17","MD",4036,3891,4,145,16352,16352,422,64,,108,1659777,11649,,129260,,,,135127,135127,798,0,,,12794,,162576,7880,,0,3049634,36527,,,142054,,1794904,12447,3049634,36527 +"2020-10-17","ME",146,145,1,1,467,467,11,1,,5,,0,9979,,,,1,5913,5283,48,0,344,0,,,6307,5112,,0,527534,5779,10353,1,,,,0,527534,5779 +"2020-10-17","MI",7317,6987,0,330,,,1000,0,,254,,0,,,4111638,,94,159119,143106,0,0,,,,,197889,109539,,0,4261714,0,310344,,,,,0,4261714,0 +"2020-10-17","MN",2217,2208,5,9,8801,8801,484,83,2393,126,1540533,12974,,,,,,121090,120818,1694,0,,,,,,106774,2458271,27720,2458271,27720,,18861,,,1661351,14647,,0 +"2020-10-17","MO",2580,,121,,,,1431,0,,,1223735,15043,79062,,2084659,,,154928,154928,2357,0,4929,4963,,,178082,,,0,2266988,44134,84189,24668,68599,13907,1378663,19417,2266988,44134 +"2020-10-17","MP",2,2,0,,4,4,,0,,,15456,0,,,,,,86,86,6,0,,,,,,29,,0,15542,6,,,,,15533,0,19835,-1455 +"2020-10-17","MS",3171,2879,11,292,6237,6237,609,0,,140,729544,0,,,,,69,110006,98475,751,0,,,,,,94165,,0,839550,751,41053,72982,,,,0,827497,0 +"2020-10-17","MT",240,,5,,1001,1001,324,15,,,,0,,,,,,22233,,638,0,,,,,,13395,,0,428128,2666,,,,,,0,428128,2666 +"2020-10-17","NC",3929,3882,19,47,,,1140,0,,316,,0,,,,,,243725,235597,2102,0,,,,,,,,0,3566257,40063,,14658,,,,0,3566257,40063 +"2020-10-17","ND",404,,11,,1242,1242,217,21,274,39,237411,1065,9909,,,,,31173,31050,771,0,569,,,,,25492,726187,7170,726187,7170,10478,258,,,268672,1809,754769,7530 +"2020-10-17","NE",547,,12,,2647,2647,322,16,,,478633,4795,,,715487,,,56714,,1286,0,,,,,67543,38083,,0,784435,13928,,,,,535661,6080,784435,13928 +"2020-10-17","NH",466,,1,,761,761,18,0,246,,302447,5718,,,,,,9625,9168,111,0,,,,,,8222,,0,523341,1,32487,,31731,,311615,5800,523341,1 +"2020-10-17","NJ",16204,14415,2,1789,24160,24160,759,0,,179,3917058,33463,,,,,60,226091,218738,1164,0,,,,,,,,0,4143149,34627,,,,,,0,4135796,34397 +"2020-10-17","NM",929,,1,,3911,3911,173,50,,,,0,,,,,,36343,,573,0,,,,,,19853,,0,1046727,10876,,,,,,0,1046727,10876 +"2020-10-17","NV",1707,,0,,,,503,0,,139,665582,6596,,,,,60,89652,89652,967,0,,,,,,,1150423,8160,1150423,8160,,,,,755234,7563,,0 +"2020-10-17","NY",25637,,9,,89995,89995,929,0,,195,,0,,,,,103,482891,,1784,0,,,,,,,12771403,159972,12771403,159972,,,,,,0,,0 +"2020-10-17","OH",5067,4759,13,308,17009,17009,1079,99,3539,282,,0,,,,,127,180225,169811,2234,0,,232,,,191342,149351,,0,3854128,50268,,8741,,,,0,3854128,50268 +"2020-10-17","OK",1168,,14,,7770,7770,792,169,,301,1327532,14692,,,1327532,,,106503,106503,1195,0,4635,,,,118537,90845,,0,1434035,15887,85717,,,,,0,1448159,15928 +"2020-10-17","OR",617,,6,,2886,2886,190,18,,44,736254,5503,,,1196961,,15,38935,,410,0,,,,,63857,,,0,1260818,14156,,,,,773225,5889,1260818,14156 +"2020-10-17","PA",8466,,9,,,,847,0,,,2119850,16806,,,,,92,180943,173850,1857,0,,,,,,144754,3621788,42595,3621788,42595,,,,,2293700,18487,,0 +"2020-10-17","PR",761,578,3,183,,,317,0,,56,305972,0,,,395291,,39,28293,28293,119,0,28357,,,,20103,25645,,0,334265,119,,,,,,0,415664,0 +"2020-10-17","RI",1158,,6,,3039,3039,125,24,,13,366796,4310,,,922827,,4,27978,,287,0,,,,,38180,,961007,25384,961007,25384,,,,,394774,4597,,0 +"2020-10-17","SC",3637,3427,22,210,9917,9917,759,63,,205,1421837,17773,68341,,1373750,,103,163214,156655,961,0,8057,13716,,,204742,81703,,0,1585051,18734,76398,82295,,,,0,1578492,18629 +"2020-10-17","SD",315,,8,,2077,2077,295,33,,,196593,1408,,,,,,32611,31711,806,0,,,,,37716,24528,,0,336748,4642,,,,,229204,2214,336748,4642 +"2020-10-17","TN",2903,2770,32,133,9555,9555,1299,66,,364,,0,,,3033011,,171,226139,215062,2646,0,,,,,261045,203586,,0,3294056,30354,,,,,,0,3294056,30354 +"2020-10-17","TX",16984,,81,,,,4275,0,,1348,,0,,,,,,820563,820563,4885,0,42170,24170,,,898621,723204,,0,7546873,65988,449341,308431,,,,0,7546873,65988 +"2020-10-17","UT",540,,3,,4610,4610,313,51,1016,96,847947,14476,,,1143332,401,,93297,,1340,0,,3387,,3227,100072,69110,,0,1243404,11802,,59052,,28590,937861,17073,1243404,11802 +"2020-10-17","VA",3422,3175,14,247,11831,11831,993,51,,219,,0,,,,,100,165238,155068,1114,0,10587,5853,,,184857,,2366380,19481,2366380,19481,148804,106469,,,,0,,0 +"2020-10-17","VI",21,,0,,,,,0,,,21175,0,,,,,,1329,,0,0,,,,,,1294,,0,22504,0,,,,,22534,0,,0 +"2020-10-17","VT",58,58,0,,,,3,0,,,174058,677,,,,,,1932,1926,9,0,,,,,,1687,,0,350356,7915,,,,,175984,686,350356,7915 +"2020-10-17","WA",2239,2239,7,,7971,7971,396,15,,82,,0,,,,,27,100444,98704,770,0,,,,,,,2194254,25062,2194254,25062,,,,,,0,,0 +"2020-10-17","WI",1588,1574,0,14,9027,9027,1068,0,1325,268,1590569,0,,,,,,175227,166186,0,0,,,,,,130231,2848236,32435,2848236,32435,,,,,1756755,0,,0 +"2020-10-17","WV",399,395,3,4,,,180,0,,65,,0,,,,,28,19801,18903,221,0,,,,,,14563,,0,669097,6854,18671,,,,,0,669097,6854 +"2020-10-17","WY",57,,0,,358,358,51,-1,,,108754,0,,,223882,,,8816,7479,151,0,,,,,9246,6559,,0,233128,721,,,,,116091,0,233128,721 +"2020-10-16","AK",66,66,1,,373,373,59,8,,,,0,,,512012,,8,10601,,221,0,,,,,10337,6237,,0,522664,3203,,,,,,0,522664,3203 +"2020-10-16","AL",2786,2618,30,168,18855,18855,859,220,1926,,1091458,6043,,,,1099,,170374,149724,1212,0,,,,,,74238,,0,1241182,7108,,,61222,,1241182,7108,,0 +"2020-10-16","AR",1665,1514,20,151,6243,6243,583,44,,238,1105781,11082,,,1105781,764,101,97539,92117,1015,0,,,,6008,,87256,,0,1197898,11896,,,,34343,,0,1197898,11896 +"2020-10-16","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-16","AZ",5806,5519,17,287,20491,20491,747,29,,167,1384981,7640,,,,,79,229486,224399,738,0,,,,,,,,0,2493039,21201,,,305662,,1609380,8347,2493039,21201 +"2020-10-16","CA",16830,,73,,,,3035,0,,713,,0,,,,,,861476,861476,3075,0,,,,,,,,0,16621956,104144,,,,,,0,16621956,104144 +"2020-10-16","CO",2172,1792,10,380,8169,8169,434,42,,,982254,8065,163468,,,,,83230,77577,1312,0,12432,,,,,,1646557,21030,1646557,21030,175900,,,,1059831,9265,,0 +"2020-10-16","CT",4542,3641,2,901,12043,12043,184,0,,,,0,,,2116348,,,62830,60309,802,0,,,,,77547,9651,,0,2196418,27708,,,,,,0,2196418,27708 +"2020-10-16","DC",641,,3,,,,86,0,,21,,0,,,,,6,16255,,89,0,,,,,,12731,455787,5173,455787,5173,,,,,237674,1799,,0 +"2020-10-16","DE",662,581,1,81,,,104,0,,26,298418,2345,,,,,,22724,21635,164,0,,,,,25062,11818,495415,3199,495415,3199,,,,,321142,2509,,0 +"2020-10-16","FL",16030,,98,,47396,47396,2083,173,,,4925248,26715,487730,475588,7173295,,,739050,715492,3365,0,51923,,50676,,962813,,8965336,77646,8965336,77646,539844,,526404,,5658780,30105,8180183,50288 +"2020-10-16","GA",7556,,64,,30217,30217,1668,136,5614,,,0,,,,,,337850,337850,1609,0,27535,,,,315665,,,0,3254270,24489,317061,,,,,0,3254270,24489 +"2020-10-16","GU",63,,1,,,,67,0,,15,54584,546,,,,,4,3538,3527,111,0,6,11,,,,2297,,0,58122,657,201,32,,,,0,58088,655 +"2020-10-16","HI",184,184,1,,978,978,103,17,,23,,0,,,,,5,13962,13764,90,0,,,,,13703,10915,466030,3489,466030,3489,,,,,,0,,0 +"2020-10-16","IA",1523,,17,,,,468,0,,105,722829,-14060,,59835,,,48,99946,99946,1229,0,,,3654,5026,,80560,,0,822775,-12831,,,63528,63948,824384,-12831,,0 +"2020-10-16","ID",517,476,1,41,2137,2137,219,15,494,56,300362,2143,,,,,,50610,45223,718,0,,,,,,25214,,0,345585,2715,,,,,345585,2715,452701,452701 +"2020-10-16","IL",9425,9165,52,260,,,2016,0,,410,,0,,,,,151,339761,336174,5103,0,,,,,,,,0,6618768,87759,,,,,,0,6618768,87759 +"2020-10-16","IN",3887,3654,23,233,14473,14473,1311,120,2867,379,1389454,9264,,,,,136,143495,,2283,0,,,,,140959,,,0,2451285,1006,,,,,1532949,11547,2451285,1006 +"2020-10-16","KS",859,,21,,3370,3370,456,61,933,123,518334,7662,,,,284,47,70855,,1700,0,,,,,,,,0,589189,9362,,,,,589189,9362,,0 +"2020-10-16","KY",1300,1286,4,14,6545,6545,667,39,1622,187,,0,,,,,,85506,72924,1311,0,,,,,,17018,,0,1653847,20767,80845,38657,,,,0,1653847,20767 +"2020-10-16","LA",5727,5527,20,200,,,557,0,,,2387926,18871,,,,,60,177726,174638,774,0,,,,,,161792,,0,2565652,19645,,,,,,0,2562564,19645 +"2020-10-16","MA",9702,9482,30,220,12971,12971,513,25,,77,2347297,14260,,,,,33,142346,139353,767,0,,,,,181769,118892,,0,5012963,57641,,,123893,160204,2486650,14962,5012963,57641 +"2020-10-16","MD",4032,3887,4,145,16288,16288,416,33,,111,1648128,10841,,129260,,,,134329,134329,781,0,,,12794,,161583,7869,,0,3013107,27647,,,142054,,1782457,11622,3013107,27647 +"2020-10-16","ME",145,144,1,1,466,466,11,2,,5,,0,9979,,,,1,5865,5243,29,0,344,0,,,6280,5099,,0,521755,7509,10353,1,,,,0,521755,7509 +"2020-10-16","MI",7317,6987,15,330,,,1000,0,,254,,0,,,4066291,,94,159119,143106,2206,0,,,,,195423,104271,,0,4261714,53356,310344,,,,,0,4261714,53356 +"2020-10-16","MN",2212,2203,13,9,8718,8718,484,66,2375,126,1527559,21148,,,,,,119396,119145,2290,0,,,,,,105120,2430551,43703,2430551,43703,,17764,,,1646704,23428,,0 +"2020-10-16","MO",2459,,17,,,,1443,0,,,1208692,0,78502,,2045374,,,152571,152571,2017,0,4830,4696,,,173299,,,0,2222854,0,83529,23021,68258,13340,1359246,0,2222854,0 +"2020-10-16","MP",2,2,0,,4,4,,0,,,15456,0,,,,,,80,80,3,0,,,,,,29,,0,15536,3,,,,,15533,0,21290,0 +"2020-10-16","MS",3160,2869,8,291,6237,6237,596,0,,146,729544,24889,,,,,75,109255,97953,1116,0,,,,,,94165,,0,838799,26005,41053,72982,,,,0,827497,30529 +"2020-10-16","MT",235,,5,,986,986,319,27,,,,0,,,,,,21595,,662,0,,,,,,13212,,0,425462,5630,,,,,,0,425462,5630 +"2020-10-16","NC",3910,3864,36,46,,,1148,0,,299,,0,,,,,,241623,233732,2684,0,,,,,,,,0,3526194,41168,,13588,,,,0,3526194,41168 +"2020-10-16","ND",393,,18,,1221,1221,217,29,271,39,236346,1238,9887,,,,,30402,30302,880,0,563,,,,,24882,719017,8751,719017,8751,10450,228,,,266863,2102,747239,9219 +"2020-10-16","NE",535,,5,,2631,2631,323,38,,,473838,4528,,,703017,,,55428,,961,0,,,,,66100,37653,,0,770507,14047,,,,,529581,5487,770507,14047 +"2020-10-16","NH",465,,2,,761,761,16,0,246,,296729,2177,,,,,,9514,9086,88,0,,,,,,8155,,0,523340,5196,32487,,31675,,305815,2239,523340,5196 +"2020-10-16","NJ",16202,14413,5,1789,24160,24160,728,68,,178,3883595,30232,,,,,60,224927,217804,1000,0,,,,,,,,0,4108522,31232,,,,,,0,4101399,31042 +"2020-10-16","NM",928,,6,,3861,3861,168,42,,,,0,,,,,,35770,,812,0,,,,,,19613,,0,1035851,8459,,,,,,0,1035851,8459 +"2020-10-16","NV",1707,,9,,,,469,0,,142,658986,1611,,,,,60,88685,88685,716,0,,,,,,,1142263,8475,1142263,8475,,,,,747671,2327,,0 +"2020-10-16","NY",25628,,10,,89995,89995,918,0,,200,,0,,,,,97,481107,,1707,0,,,,,,,12611431,136039,12611431,136039,,,,,,0,,0 +"2020-10-16","OH",5054,4746,16,308,16910,16910,1084,86,3522,279,,0,,,,,134,177991,167674,2148,0,,111,,,189018,148284,,0,3803860,46535,,4265,,,,0,3803860,46535 +"2020-10-16","OK",1154,,11,,7601,7601,793,0,,291,1312840,17908,,,1312840,,,105308,105308,1472,0,4411,,,,117116,89815,,0,1418148,19380,83562,,,,,0,1432231,19474 +"2020-10-16","OR",611,,3,,2868,2868,199,20,,49,730751,7359,,,1183240,,16,38525,,365,0,,,,,63422,,,0,1246662,16785,,,,,767336,7702,1246662,16785 +"2020-10-16","PA",8457,,25,,,,830,0,,,2103044,13847,,,,,80,179086,172169,1566,0,,,,,,143268,3579193,37475,3579193,37475,,,,,2275213,15222,,0 +"2020-10-16","PR",758,575,15,183,,,341,0,,64,305972,0,,,395291,,35,28174,28174,227,0,28238,,,,20103,25298,,0,334146,227,,,,,,0,415664,0 +"2020-10-16","RI",1152,,3,,3015,3015,137,16,,14,362486,3148,,,897780,,5,27691,,253,0,,,,,37843,,935623,8439,935623,8439,,,,,390177,3401,,0 +"2020-10-16","SC",3615,3405,8,210,9854,9854,769,56,,206,1404064,18562,68013,,1356282,,98,162253,155799,1147,0,7925,13448,,,203581,81106,,0,1566317,19709,75938,79570,,,,0,1559863,19492 +"2020-10-16","SD",307,,3,,2044,2044,299,44,,,195185,1958,,,,,,31805,30940,793,0,,,,,36857,24186,,0,332106,3860,,,,,226990,2751,332106,3860 +"2020-10-16","TN",2871,2738,7,133,9489,9489,1281,73,,361,,0,,,3005275,,154,223493,212682,666,0,,,,,258427,201831,,0,3263702,5750,,,,,,0,3263702,5750 +"2020-10-16","TX",16903,,91,,,,4248,0,,1290,,0,,,,,,815678,815678,5870,0,41811,23677,,,892654,719478,,0,7480885,68382,447010,302744,,,,0,7480885,68382 +"2020-10-16","UT",537,,8,,4559,4559,304,48,1007,96,833471,0,,,1132959,400,,91957,,1496,0,,3312,,3157,98643,68092,,0,1231602,12129,,56742,,27965,920788,0,1231602,12129 +"2020-10-16","VA",3408,3161,20,247,11780,11780,1002,76,,222,,0,,,,,104,164124,154126,1183,0,10524,5661,,,183829,,2346899,20097,2346899,20097,148325,102541,,,,0,,0 +"2020-10-16","VI",21,,1,,,,,0,,,21175,137,,,,,,1329,,2,0,,,,,,1294,,0,22504,139,,,,,22534,138,,0 +"2020-10-16","VT",58,58,0,,,,1,0,,,173381,820,,,,,,1923,1917,13,0,,,,,,1687,,0,342441,1866,,,,,175298,833,342441,1866 +"2020-10-16","WA",2232,2232,11,,7956,7956,376,73,,77,,0,,,,,18,99674,97960,771,0,,,,,,,2169192,22683,2169192,22683,,,,,,0,,0 +"2020-10-16","WI",1588,1574,23,14,9027,9027,1101,135,1325,274,1590569,10725,,,,,,175227,166186,4105,0,,,,,,130231,2815801,35157,2815801,35157,,,,,1756755,14586,,0 +"2020-10-16","WV",396,392,3,4,,,188,0,,70,,0,,,,,31,19580,18718,498,0,,,,,,14269,,0,662243,11139,18627,,,,,0,662243,11139 +"2020-10-16","WY",57,,0,,359,359,51,5,,,108754,740,,,223260,,,8665,7337,290,0,,,,,9147,6494,,0,232407,3328,,,,,116091,988,232407,3328 +"2020-10-15","AK",65,65,1,,365,365,60,9,,,,0,,,508970,,7,10380,,166,0,,,,,10178,6066,,0,519461,2284,,,,,,0,519461,2284 +"2020-10-15","AL",2756,2590,50,166,18635,18635,844,0,1914,,1085415,6939,,,,1091,,169162,148659,1185,0,,,,,,74238,,0,1234074,7853,,,60916,,1234074,7853,,0 +"2020-10-15","AR",1645,1494,11,151,6199,6199,587,51,,236,1094699,11592,,,1094699,760,103,96524,91303,1278,0,,,,5789,,86447,,0,1186002,12660,,,,32741,,0,1186002,12660 +"2020-10-15","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-15","AZ",5789,5502,17,287,20462,20462,726,96,,173,1377341,10731,,,,,75,228748,223692,1113,0,,,,,,,,0,2471838,24411,,,304875,,1601033,11831,2471838,24411 +"2020-10-15","CA",16757,,118,,,,3078,0,,706,,0,,,,,,858401,858401,3329,0,,,,,,,,0,16517812,92325,,,,,,0,16517812,92325 +"2020-10-15","CO",2162,1783,2,379,8127,8127,420,59,,,974189,9699,163043,,,,,81918,76377,1141,0,12385,,,,,,1625527,22571,1625527,22571,175428,,,,1050566,10791,,0 +"2020-10-15","CT",4540,3640,3,900,12043,12043,191,198,,,,0,,,2089217,,,62028,59523,167,0,,,,,76982,9651,,0,2168710,29271,,,,,,0,2168710,29271 +"2020-10-15","DC",638,,0,,,,88,0,,22,,0,,,,,10,16166,,34,0,,,,,,12681,450614,2352,450614,2352,,,,,235875,612,,0 +"2020-10-15","DE",661,580,1,81,,,111,0,,28,296073,1715,,,,,,22560,21473,95,0,,,,,24954,11724,492216,1608,492216,1608,,,,,318633,1810,,0 +"2020-10-15","FL",15932,,144,,47223,47223,2119,212,,,4898533,24918,487730,475588,7127425,,,735685,712788,3286,0,51923,,50676,,958498,,8887690,63585,8887690,63585,539844,,526404,,5628675,28206,8129895,46803 +"2020-10-15","GA",7492,,22,,30081,30081,1682,163,5580,,,0,,,,,,336241,336241,1640,0,27277,,,,314154,,,0,3229781,25483,315202,,,,,0,3229781,25483 +"2020-10-15","GU",62,,1,,,,72,0,,19,54038,485,,,,,4,3427,3417,86,0,6,10,,,,2294,,0,57465,571,199,30,,,,0,57433,568 +"2020-10-15","HI",183,183,10,,961,961,105,10,,27,,0,,,,,9,13872,13674,99,0,,,,,13613,10883,462541,4069,462541,4069,,,,,,0,,0 +"2020-10-15","IA",1506,,9,,,,482,0,,107,736889,5020,,59547,,,49,98717,98717,1333,0,,,3638,4921,,80203,,0,835606,6353,,,63224,44640,837215,6354,,0 +"2020-10-15","ID",516,475,4,41,2122,2122,219,36,492,56,298219,1603,,,,,,49892,44651,645,0,,,,,,24983,,0,342870,2094,,,,,342870,2094,,0 +"2020-10-15","IL",9373,9127,53,246,,,1932,0,,388,,0,,,,,147,334658,331620,4015,0,,,,,,,,0,6531009,67086,,,,,,0,6531009,67086 +"2020-10-15","IN",3864,3632,28,232,14353,14353,1355,125,2845,377,1380190,8399,,,,,132,141212,,1943,0,,,,,140901,,,0,2450279,7707,,,,,1521402,10342,2450279,7707 +"2020-10-15","KS",838,,0,,3309,3309,488,0,913,128,510672,0,,,,280,42,69155,,0,0,,,,,,,,0,579827,0,,,,,579827,0,,0 +"2020-10-15","KY",1296,1282,20,14,6506,6506,738,27,1616,192,,0,,,,,,84195,71896,1182,0,,,,,,16928,,0,1633080,31193,80048,38136,,,,0,1633080,31193 +"2020-10-15","LA",5707,5507,12,200,,,566,0,,,2369055,25541,,,,,61,176952,173864,743,0,,,,,,161792,,0,2546007,26284,,,,,,0,2542919,26284 +"2020-10-15","MA",9672,9452,25,220,12946,12946,503,13,,92,2333037,14169,,,,,34,141579,138651,587,0,,,,,180913,118892,,0,4955322,59123,,,123572,157165,2471688,14737,4955322,59123 +"2020-10-15","MD",4028,3883,6,145,16255,16255,412,40,,109,1637287,9551,,129260,,,,133548,133548,630,0,,,12794,,160667,7851,,0,2985460,28636,,,142054,,1770835,10181,2985460,28636 +"2020-10-15","ME",144,143,1,1,464,464,11,1,,5,,0,9979,,,,1,5836,5206,20,0,344,,,,6242,5070,,0,514246,5405,10335,,,,,0,514246,5405 +"2020-10-15","MI",7302,6973,34,329,,,1000,0,,254,,0,,,4015076,,95,156913,141091,2458,0,,,,,193282,104271,,0,4208358,42122,309383,,,,,0,4208358,42122 +"2020-10-15","MN",2199,2192,19,7,8652,8652,445,67,2362,115,1506411,8943,,,,,,117106,116865,1163,0,,,,,,104547,2386848,19504,2386848,19504,,16963,,,1623276,10045,,0 +"2020-10-15","MO",2442,,22,,,,1443,0,,,1208692,5210,78502,,2045374,,,150554,150554,1875,0,4830,4696,,,173299,,,0,2222854,16480,83529,23021,68258,13340,1359246,7085,2222854,16480 +"2020-10-15","MP",2,2,0,,4,4,,0,,,15456,0,,,,,,77,77,0,0,,,,,,29,,0,15533,0,,,,,15533,0,21290,0 +"2020-10-15","MS",3152,2864,12,288,6237,6237,598,0,,138,704655,0,,,,,69,108139,97236,1322,0,,,,,,94165,,0,812794,1322,40048,66989,,,,0,796968,0 +"2020-10-15","MT",230,,5,,959,959,301,39,,,,0,,,,,,20933,,723,0,,,,,,12854,,0,419832,5253,,,,,,0,419832,5253 +"2020-10-15","NC",3874,3831,18,43,,,1140,0,,296,,0,,,,,,238939,231362,2532,0,,,,,,,,0,3485026,32849,,12872,,,,0,3485026,32849 +"2020-10-15","ND",375,,5,,1192,1192,207,33,268,38,235108,822,9771,,,,,29522,29438,696,0,527,,,,,24336,710266,6732,710266,6732,10298,203,,,264761,1528,738020,7118 +"2020-10-15","NE",530,,3,,2593,2593,311,38,,,469310,3442,,,690063,,,54467,,924,0,,,,,65022,37122,,0,756460,12277,,,,,524094,4368,756460,12277 +"2020-10-15","NH",463,,5,,761,761,18,1,245,,294552,1900,,,,,,9426,9024,77,0,,,,,,8134,,0,518144,4692,32460,,31654,,303576,1957,518144,4692 +"2020-10-15","NJ",16197,14408,6,1789,24092,24092,733,115,,178,3853363,32519,,,,,60,223927,216994,1179,0,,,,,,,,0,4077290,33698,,,,,,0,4070357,33490 +"2020-10-15","NM",922,,1,,3819,3819,150,30,,,,0,,,,,,34958,,668,0,,,,,,19457,,0,1027392,8363,,,,,,0,1027392,8363 +"2020-10-15","NV",1698,,7,,,,486,0,,142,657375,-2729,,,,,63,87969,87969,655,0,,,,,,,1133788,9280,1133788,9280,,,,,745344,-466,,-1154583 +"2020-10-15","NY",25618,,13,,89995,89995,897,0,,197,,0,,,,,95,479400,,1460,0,,,,,,,12475392,133212,12475392,133212,,,,,,0,,0 +"2020-10-15","OH",5038,4730,5,308,16824,16824,1041,108,3507,266,,0,,,,,134,175843,165627,2178,0,,,,,186684,147063,,0,3757325,33541,,,,,,0,3757325,33541 +"2020-10-15","OK",1143,,11,,7601,7601,781,72,,293,1294932,11878,,,1294932,,,103836,103836,1221,0,4411,,,,115879,88780,,0,1398768,13099,83562,,,,,0,1412757,13372 +"2020-10-15","OR",608,,3,,2848,2848,202,31,,50,723392,9895,,,1167008,,20,38160,,380,0,,,,,62869,,,0,1229877,11283,,,,,759634,10259,1229877,11283 +"2020-10-15","PA",8432,,21,,,,799,0,,,2089197,14468,,,,,94,177520,170794,1598,0,,,,,,142016,3541718,34869,3541718,34869,,,,,2259991,15912,,0 +"2020-10-15","PR",743,562,1,181,,,354,0,,62,305972,0,,,395291,,37,27947,27947,318,0,28138,,,,20103,25071,,0,333919,318,,,,,,0,415664,0 +"2020-10-15","RI",1149,,2,,2999,2999,129,15,,12,359338,3439,,,889584,,5,27438,,274,0,,,,,37600,,927184,14925,927184,14925,,,,,386776,3713,,0 +"2020-10-15","SC",3607,3400,14,207,9798,9798,762,63,,204,1385502,18746,67652,,1338036,,94,161106,154869,1297,0,7857,13214,,,202335,80460,,0,1546608,20043,75509,76551,,,,0,1540371,19886 +"2020-10-15","SD",304,,13,,2000,2000,304,37,,,193227,1121,,,,,,31012,30220,797,0,,,,,36145,23576,,0,328246,2905,,,,,224239,1918,328246,2905 +"2020-10-15","TN",2864,2731,36,133,9416,9416,1331,45,,378,,0,,,3000124,,173,222827,212116,2289,0,,,,,257828,200164,,0,3257952,24653,,,,,,0,3257952,24653 +"2020-10-15","TX",16812,,95,,,,4263,0,,1290,,0,,,,,,809808,809808,4726,0,41396,23217,,,886489,716015,,0,7412503,70382,444135,295383,,,,0,7412503,70382 +"2020-10-15","UT",529,,2,,4511,4511,277,51,1001,99,833471,5413,,,1122108,400,,90461,,1498,0,,3192,,3039,97365,66683,,0,1219473,13307,,54484,,27214,920788,6648,1219473,13307 +"2020-10-15","VA",3388,3149,7,239,11704,11704,1009,76,,220,,0,,,,,104,162941,153117,1331,0,10446,5440,,,182743,,2326802,22433,2326802,22433,147878,97881,,,,0,,0 +"2020-10-15","VI",20,,0,,,,,0,,,21038,179,,,,,,1327,,-1,0,,,,,,1292,,0,22365,178,,,,,22396,178,,0 +"2020-10-15","VT",58,58,0,,,,6,0,,,172561,1027,,,,,,1910,1904,16,0,,,,,,1685,,0,340575,5127,,,,,174465,1042,340575,5127 +"2020-10-15","WA",2221,2221,10,,7883,7883,373,9,,82,,0,,,,,25,98903,97214,768,0,,,,,,,2146509,22601,2146509,22601,,,,,,0,,0 +"2020-10-15","WI",1565,1553,18,12,8892,8892,1043,138,1308,264,1579844,11455,,,,,,171122,162325,4040,0,,,,,,127576,2780644,33859,2780644,33859,,,,,1742169,15202,,0 +"2020-10-15","WV",393,389,2,4,,,180,0,,60,,0,,,,,31,19082,18360,264,0,,,,,,14066,,0,651104,6903,18434,,,,,0,651104,6903 +"2020-10-15","WY",57,,0,,354,354,51,2,,,108014,5165,,,220248,,,8375,7089,198,0,,,,,8831,6360,,0,229079,3561,,,,,115103,5340,229079,3561 +"2020-10-14","AK",64,64,4,,356,356,56,1,,,,0,,,506755,,7,10214,,155,0,,,,,10109,5950,,0,517177,2388,,,,,,0,517177,2388 +"2020-10-14","AL",2706,2549,41,157,18635,18635,834,195,1907,,1078476,4352,,,,1085,,167977,147745,784,0,,,,,,74238,,0,1226221,5014,,,60687,,1226221,5014,,0 +"2020-10-14","AR",1634,1484,23,150,6148,6148,582,79,,241,1083107,9793,,,1083107,755,112,95246,90235,1079,0,,,,5537,,85597,,0,1173342,10677,,,,31294,,0,1173342,10677 +"2020-10-14","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-14","AZ",5772,5485,5,287,20366,20366,711,54,,163,1366610,7263,,,,,85,227635,222592,901,0,,,,,,,,0,2447427,22286,,,303875,,1589202,8051,2447427,22286 +"2020-10-14","CA",16639,,58,,,,3126,0,,753,,0,,,,,,855072,855072,2666,0,,,,,,,,0,16425487,91770,,,,,,0,16425487,91770 +"2020-10-14","CO",2160,1781,7,379,8068,8068,405,65,,,964490,6600,162573,,,,,80777,75285,692,0,12345,,,,,,1602956,14324,1602956,14324,174918,,,,1039775,7230,,0 +"2020-10-14","CT",4537,3637,4,900,11845,11845,188,0,,,,0,,,2060495,,,61861,59384,164,0,,,,,76442,9522,,0,2139439,29145,,,,,,0,2139439,29145 +"2020-10-14","DC",638,,1,,,,86,0,,24,,0,,,,,7,16132,,64,0,,,,,,12627,448262,5181,448262,5181,,,,,235263,1813,,0 +"2020-10-14","DE",660,580,1,80,,,116,0,,22,294358,1000,,,,,,22465,21380,71,0,,,,,24902,11665,490608,3707,490608,3707,,,,,316823,1071,,0 +"2020-10-14","FL",15788,,66,,47011,47011,2155,258,,,4873615,18940,487730,475588,7084988,,,732399,710164,2808,0,51923,,50676,,954232,,8824105,52615,8824105,52615,539844,,526404,,5600469,21738,8083092,40330 +"2020-10-14","GA",7470,,16,,29918,29918,1705,156,5546,,,0,,,,,,334601,334601,1297,0,27039,,,,312932,,,0,3204298,23760,313858,,,,,0,3204298,23760 +"2020-10-14","GU",61,,0,,,,62,0,,14,53553,451,,,,,4,3341,3331,75,0,5,10,,,,2295,,0,56894,526,198,27,,,,0,56865,522 +"2020-10-14","HI",173,173,4,,951,951,109,12,,26,,0,,,,,14,13773,13575,61,0,,,,,13520,10834,458472,2354,458472,2354,,,,,,0,,0 +"2020-10-14","IA",1497,,12,,,,473,0,,106,731869,3338,,59226,,,46,97384,97384,1046,0,,,3612,4722,,79121,,0,829253,4384,,,62877,43301,830861,4379,,0 +"2020-10-14","ID",512,471,2,41,2086,2086,187,28,487,54,296616,2276,,,,,,49247,44160,584,0,,,,,,24699,,0,340776,2776,,,,,340776,2776,,0 +"2020-10-14","IL",9320,9074,48,246,,,1974,0,,390,,0,,,,,153,330643,327605,2862,0,,,,,,,,0,6463923,52669,,,,,,0,6463923,52669 +"2020-10-14","IN",3836,3609,14,227,14228,14228,1357,113,2818,396,1371791,5972,,,,,125,139269,,1165,0,,,,,140388,,,0,2442572,21445,,,,,1511060,7137,2442572,21445 +"2020-10-14","KS",838,,67,,3309,3309,488,70,913,128,510672,6453,,,,280,42,69155,,1293,0,,,,,,,,0,579827,7746,,,,,579827,7746,,0 +"2020-10-14","KY",1276,1262,7,14,6479,6479,711,220,1606,185,,0,,,,,,83013,71059,1322,0,,,,,,16756,,0,1601887,10882,79394,37340,,,,0,1601887,10882 +"2020-10-14","LA",5695,5495,16,200,,,582,0,,,2343514,5996,,,,,64,176209,173121,880,0,,,,,,161792,,0,2519723,6876,,,,,,0,2516635,6316 +"2020-10-14","MA",9647,9429,17,218,12933,12933,499,34,,88,2318868,12539,,,,,28,140992,138083,580,0,,,,,180226,118892,,0,4896199,38684,,,123336,156556,2456951,13057,4896199,38684 +"2020-10-14","MD",4022,3877,10,145,16215,16215,417,65,,113,1627736,8770,,129260,,,,132918,132918,575,0,,,12794,,159744,7812,,0,2956824,21891,,,142054,,1760654,9345,2956824,21891 +"2020-10-14","ME",143,142,0,1,463,463,8,0,,3,,0,10149,,,,0,5816,5191,36,0,349,,,,6219,5052,,0,508841,6001,10510,,,,,0,508841,6001 +"2020-10-14","MI",7268,6941,13,327,,,899,0,,230,,0,,,3974957,,95,154455,139061,1593,0,,,,,191279,104271,,0,4166236,29588,308581,,,,,0,4166236,29588 +"2020-10-14","MN",2180,2174,-24,6,8585,8585,487,85,2346,134,1497468,11181,,,,,,115943,115763,1369,0,,,,,,103830,2367344,12220,2367344,12220,,16183,,,1613231,12370,,0 +"2020-10-14","MO",2420,,-2,,,,1413,0,,,1203482,-99955,78204,,2030924,,,148679,148679,4449,0,4773,4545,,,171289,,,0,2206374,130675,83174,22504,68054,13050,1352161,-95506,2206374,130675 +"2020-10-14","MP",2,2,0,,4,4,,0,,,15456,335,,,,,,77,77,0,0,,,,,,29,,0,15533,335,,,,,15533,337,21290,1455 +"2020-10-14","MS",3140,2855,25,285,6237,6237,633,0,,143,704655,0,,,,,72,106817,96505,876,0,,,,,,94165,,0,811472,876,40048,66989,,,,0,796968,0 +"2020-10-14","MT",225,,8,,920,920,292,9,,,,0,,,,,,20210,,599,0,,,,,,12068,,0,414579,4928,,,,,,0,414579,4928 +"2020-10-14","NC",3856,3813,40,43,,,1152,0,,300,,0,,,,,,236407,229115,1926,0,,,,,,,,0,3452177,20537,,11616,,,,0,3452177,20537 +"2020-10-14","ND",370,,8,,1159,1159,206,33,262,39,234286,786,9740,,,,,28826,28750,663,0,513,,,,,23823,703534,7466,703534,7466,10253,187,,,263233,1488,730902,7800 +"2020-10-14","NE",527,,5,,2555,2555,315,12,,,465868,3214,,,678890,,,53543,,704,0,,,,,63929,36950,,0,744183,9491,,,,,519726,3921,744183,9491 +"2020-10-14","NH",458,,2,,760,760,19,2,245,,292652,3726,,,,,,9349,8967,70,0,,,,,,8068,,0,513452,5373,32424,,31619,,301619,3769,513452,5373 +"2020-10-14","NJ",16191,14402,9,1789,23977,23977,699,0,,168,3820844,63344,,,,,58,222748,216023,1141,0,,,,,,,,0,4043592,64485,,,,,,0,4036867,65270 +"2020-10-14","NM",921,,3,,3789,3789,145,31,,,,0,,,,,,34290,,577,0,,,,,,19127,,0,1019029,7709,,,,,,0,1019029,7709 +"2020-10-14","NV",1691,,17,,,,519,0,,133,660104,3262,,,,,64,87314,87314,479,0,,,,,,,1124508,9592,1124508,9592,,,,,745810,3879,1154583,7220 +"2020-10-14","NY",25605,,7,,89995,89995,938,0,,201,,0,,,,,100,477940,,1232,0,,,,,,,12342180,111744,12342180,111744,,,,,,0,,0 +"2020-10-14","OH",5033,4725,16,308,16716,16716,1042,151,3464,268,,0,,,,,140,173665,163558,2039,0,,,,,184878,145969,,0,3723784,26022,,,,,,0,3723784,26022 +"2020-10-14","OK",1132,,13,,7529,7529,749,264,,289,1283054,10831,,,1283054,,,102615,102615,1122,0,4411,,,,114382,87575,,0,1385669,11953,83562,,,,,0,1399385,11957 +"2020-10-14","OR",605,,6,,2817,2817,210,13,,47,713497,5709,,,1156129,,19,37780,,313,0,,,,,62465,,,0,1218594,13813,,,,,749375,6006,1218594,13813 +"2020-10-14","PA",8411,,27,,,,749,0,,,2074729,14636,,,,,91,175922,169350,1276,0,,,,,,140737,3506849,30438,3506849,30438,,,,,2244079,15733,,0 +"2020-10-14","PR",742,561,4,181,,,343,0,,53,305972,0,,,395291,,37,27629,27629,490,0,27887,,,,20103,24788,,0,333601,490,,,,,,0,415664,0 +"2020-10-14","RI",1147,,8,,2984,2984,131,23,,13,355899,2165,,,874953,,4,27164,,204,0,,,,,37306,,912259,6610,912259,6610,,,,,383063,2369,,0 +"2020-10-14","SC",3593,3387,17,206,9735,9735,792,81,,204,1366756,14158,67368,,1319612,,91,159809,153729,926,0,7789,12919,,,200873,79781,,0,1526565,15084,75157,73783,,,,0,1520485,14924 +"2020-10-14","SD",291,,3,,1963,1963,303,52,,,192106,1043,,,,,,30215,29520,876,0,,,,,35430,23320,,0,325341,2540,,,,,222321,1919,325341,2540 +"2020-10-14","TN",2828,2698,31,130,9371,9371,1301,62,,354,,0,,,2977826,,161,220538,210016,1709,0,,,,,255473,198465,,0,3233299,17898,,,,,,0,3233299,17898 +"2020-10-14","TX",16717,,95,,,,4131,0,,1237,,0,,,,,,805082,805082,4826,0,40963,22707,,,879936,711438,,0,7342121,76079,440413,288410,,,,0,7342121,76079 +"2020-10-14","UT",527,,5,,4460,4460,269,77,991,97,828058,6753,,,1110397,396,,88963,,1144,0,,3116,,2964,95769,65472,,0,1206166,11745,,52937,,26547,914140,8012,1206166,11745 +"2020-10-14","VA",3381,3141,9,240,11628,11628,1007,30,,230,,0,,,,,102,161610,152039,805,0,10381,5232,,,181521,,2304369,11807,2304369,11807,147373,93689,,,,0,,0 +"2020-10-14","VI",20,,0,,,,,0,,,20859,122,,,,,,1328,,3,0,,,,,,1293,,0,22187,125,,,,,22218,127,,0 +"2020-10-14","VT",58,58,0,,,,0,0,,,171534,652,,,,,,1894,1889,3,0,,,,,,1678,,0,335448,1420,,,,,173423,655,335448,1420 +"2020-10-14","WA",2211,2211,0,,7874,7874,367,0,,83,,0,,,,,26,98135,96485,867,0,,,,,,,2123908,0,2123908,0,,,,,,0,,0 +"2020-10-14","WI",1547,1536,29,11,8754,8754,1017,153,1304,246,1568389,11435,,,,,,167082,158578,3323,0,,,,,,125411,2746785,27206,2746785,27206,,,,,1726967,14542,,0 +"2020-10-14","WV",391,387,4,4,,,180,0,,61,,0,,,,,28,18818,18124,263,0,,,,,,13815,,0,644201,4735,18237,,,,,0,644201,4735 +"2020-10-14","WY",57,,0,,352,352,45,9,,,102849,-3030,,,216983,,,8177,6914,213,0,,,,,8535,6261,,0,225518,4336,,,,,109763,-2856,225518,4336 +"2020-10-13","AK",60,60,0,,355,355,59,3,,,,0,,,504419,,8,10059,,156,0,,,,,10057,5909,,0,514789,8862,,,,,,0,514789,8862 +"2020-10-13","AL",2665,2509,0,156,18440,18440,823,261,1896,,1074124,5737,,,,1072,,167193,147083,1117,0,,,,,,71240,,0,1221207,6597,,,60552,,1221207,6597,,0 +"2020-10-13","AR",1611,1463,25,148,6069,6069,601,109,,246,1073314,7118,,,1073314,747,105,94167,89351,680,0,,,,5313,,84804,,0,1162665,7599,,,,30032,,0,1162665,7599 +"2020-10-13","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-13","AZ",5767,5479,8,288,20312,20312,706,55,,146,1359347,6286,,,,,88,226734,221804,684,0,,,,,,,,0,2425141,22093,,,302755,,1581151,6951,2425141,22093 +"2020-10-13","CA",16581,,9,,,,3060,0,,748,,0,,,,,,852406,852406,2378,0,,,,,,,,0,16333717,142376,,,,,,0,16333717,142376 +"2020-10-13","CO",2153,1777,37,376,8003,8003,385,88,,,957890,8218,162253,,,,,80085,74655,1048,0,12313,,,,,,1588632,17303,1588632,17303,174566,,,,1032545,9229,,0 +"2020-10-13","CT",4533,3634,1,899,11845,11845,172,0,,,,0,,,2031923,,,61697,59237,320,0,,,,,75889,9522,,0,2110294,27985,,,,,,0,2110294,27985 +"2020-10-13","DC",637,,0,,,,88,0,,25,,0,,,,,7,16068,,46,0,,,,,,12583,443081,4262,443081,4262,,,,,233450,1633,,0 +"2020-10-13","DE",659,579,3,80,,,112,0,,19,293358,1366,,,,,,22394,21311,105,0,,,,,24773,11588,486901,5460,486901,5460,,,,,315752,1471,,0 +"2020-10-13","FL",15722,,123,,46753,46753,2127,212,,,4854675,23416,487730,475588,7048383,,,729591,708010,2657,0,51923,,50676,,950606,,8771490,53779,8771490,53779,539844,,526404,,5578731,26052,8042762,43659 +"2020-10-13","GA",7454,,25,,29762,29762,1753,106,5523,,,0,,,,,,333304,333304,993,0,26980,,,,312040,,,0,3180538,12422,313514,,,,,0,3180538,12422 +"2020-10-13","GU",61,,1,,,,62,0,,13,53102,582,,,,,4,3266,3257,96,0,5,9,,,,2190,,0,56368,678,198,23,,,,0,56343,678 +"2020-10-13","HI",169,169,0,,939,939,103,4,,34,,0,,,,,18,13712,13514,42,0,,,,,13466,10781,456118,1405,456118,1405,,,,,,0,,0 +"2020-10-13","IA",1485,,13,,,,463,0,,114,728531,2200,,58918,,,44,96338,96338,529,0,,,3605,4558,,78136,,0,824869,2729,,,62562,42383,826482,2726,,0 +"2020-10-13","ID",510,469,3,41,2058,2058,187,17,481,54,294340,1783,,,,,,48663,43660,597,0,,,,,,24523,,0,338000,2330,,,,,338000,2330,,0 +"2020-10-13","IL",9272,9026,29,246,,,1848,0,,406,,0,,,,,160,327781,324743,2851,0,,,,,,,,0,6411254,55993,,,,,,0,6411254,55993 +"2020-10-13","IN",3822,3595,27,227,14115,14115,1288,131,2808,382,1365819,6522,,,,,132,138104,,1549,0,,,,,139052,,,0,2421127,27395,,,,,1503923,8071,2421127,27395 +"2020-10-13","KS",771,,0,,3239,3239,355,0,890,111,504219,0,,,,274,42,67862,,0,0,,,,,,,,0,572081,0,,,,,572081,0,,0 +"2020-10-13","KY",1269,1256,14,13,6259,6259,704,138,1595,170,,0,,,,,,81691,70080,761,0,,,,,,13986,,0,1591005,25908,79053,36493,,,,0,1591005,25908 +"2020-10-13","LA",5679,5486,10,193,,,573,0,,,2337518,19900,,,,,68,175329,172801,682,0,,,,,,157873,,0,2512847,20582,,,,,,0,2510319,20582 +"2020-10-13","MA",9630,9413,13,217,12899,12899,514,17,,87,2306329,13112,,,,,27,140412,137565,749,0,,,,,179559,116364,,0,4857515,42116,,,123089,154194,2443894,13744,4857515,42116 +"2020-10-13","MD",4012,3868,9,144,16150,16150,402,43,,102,1618966,8392,,126269,,,,132343,132343,482,0,,,12358,,158779,7744,,0,2934933,18713,,,138627,,1751309,8874,2934933,18713 +"2020-10-13","ME",143,142,0,1,463,463,8,0,,3,,0,10139,,,,0,5780,5160,28,0,347,,,,6190,5006,,0,502840,3139,10498,,,,,0,502840,3139 +"2020-10-13","MI",7255,6928,30,327,,,899,0,,230,,0,,,3946697,,95,152862,137702,1466,0,,,,,189951,104271,,0,4136648,38839,308055,,,,,0,4136648,38839 +"2020-10-13","MN",2204,2151,7,53,8500,8500,481,79,2328,134,1486287,9974,,,,,,114574,114574,1135,0,,,,,,102624,2355124,18002,2355124,18002,,,,,1600861,11109,,0 +"2020-10-13","MO",2422,,0,,,,1313,0,,,1303437,0,76509,,1908333,,,144230,144230,0,0,4188,3979,,,163531,,,0,2075699,0,80831,20834,69462,14213,1447667,0,2075699,0 +"2020-10-13","MP",2,2,0,,4,4,,0,,,15121,0,,,,,,77,77,0,0,,,,,,29,,0,15198,0,,,,,15196,0,19835,0 +"2020-10-13","MS",3115,2839,14,276,6237,6237,600,0,,145,704655,0,,,,,69,105941,95966,713,0,,,,,,94165,,0,810596,713,40048,66989,,,,0,796968,0 +"2020-10-13","MT",217,,5,,911,911,294,7,,,,0,,,,,,19611,,486,0,,,,,,11620,,0,409651,9193,,,,,,0,409651,9193 +"2020-10-13","NC",3816,3774,43,42,,,1103,0,,306,,0,,,,,,234481,227496,1734,0,,,,,,,,0,3431640,21359,,10173,,,,0,3431640,21359 +"2020-10-13","ND",362,,12,,1126,1126,206,27,255,41,233500,898,9655,,,,,28163,28123,490,0,485,,,,,23288,696068,5019,696068,5019,10140,137,,,261745,1406,723102,5370 +"2020-10-13","NE",522,,3,,2543,2543,299,17,,,462654,3098,,,670224,,,52839,,457,0,,,,,63121,36734,,0,734692,6270,,,,,515805,3556,734692,6270 +"2020-10-13","NH",456,,0,,758,758,17,6,241,,288926,4181,,,,,,9279,8924,136,0,,,,,,8036,,0,508079,10169,32384,,31580,,297850,4274,508079,10169 +"2020-10-13","NJ",16182,14394,7,1788,23977,23977,649,71,,160,3757500,0,,,,,58,221607,215085,1145,0,,,,,,,,0,3979107,1145,,,,,,0,3971597,0 +"2020-10-13","NM",918,,3,,3758,3758,125,23,,,,0,,,,,,33713,,351,0,,,,,,18960,,0,1011320,8414,,,,,,0,1011320,8414 +"2020-10-13","NV",1674,,10,,,,505,0,,130,656842,2022,,,,,61,86835,86835,487,0,,,,,,,1114916,7424,1114916,7424,,,,,741931,1371,1147363,3851 +"2020-10-13","NY",25598,,11,,89995,89995,923,0,,181,,0,,,,,90,476708,,1393,0,,,,,,,12230436,99070,12230436,99070,,,,,,0,,0 +"2020-10-13","OH",5017,4709,12,308,16565,16565,1016,123,3447,271,,0,,,,,134,171626,161678,1447,0,,,,,183459,144903,,0,3697762,35812,,,,,,0,3697762,35812 +"2020-10-13","OK",1119,,15,,7265,7265,760,-19,,277,1272223,31705,,,1272223,,,101493,101493,1309,0,4411,,,,113046,86502,,0,1373716,33014,83562,,,,,0,1387428,33794 +"2020-10-13","OR",599,,0,,2804,2804,220,63,,55,707788,3817,,,1142776,,21,37467,,205,0,,,,,62005,,,0,1204781,6784,,,,,743369,14539,1204781,6784 +"2020-10-13","PA",8384,,16,,,,773,0,,,2060093,15387,,,,,83,174646,168253,1342,0,,,,,,139716,3476411,35600,3476411,35600,,,,,2228346,16572,,0 +"2020-10-13","PR",738,557,3,181,,,303,0,,54,305972,0,,,395291,,34,27139,27139,135,0,27401,,,,20103,24552,,0,333111,135,,,,,,0,415664,0 +"2020-10-13","RI",1139,,2,,2961,2961,126,0,,13,353734,1465,,,868550,,4,26960,,129,0,,,,,37099,,905649,5855,905649,5855,,,,,380694,1594,,0 +"2020-10-13","SC",3576,3371,17,205,9654,9654,745,54,,201,1352598,12836,67194,,1305735,,90,158883,152963,828,0,7734,12610,,,199826,79110,,0,1511481,13664,74928,70575,,,,0,1505561,13557 +"2020-10-13","SD",288,,0,,1911,1911,303,25,,,191063,744,,,,,,29339,28707,414,0,,,,,34782,23007,,0,322801,2744,,,,,220402,1158,322801,2744 +"2020-10-13","TN",2797,2667,23,130,9309,9309,1245,61,,339,,0,,,2961490,,156,218829,208606,1147,0,,,,,253911,196940,,0,3215401,13694,,,,,,0,3215401,13694 +"2020-10-13","TX",16622,,64,,,,4053,0,,1237,,0,,,,,,800256,800256,5130,0,40544,22215,,,874204,708349,,0,7266042,74269,436479,279869,,,,0,7266042,74269 +"2020-10-13","UT",522,,0,,4383,4383,254,52,984,90,821305,7140,,,1099954,392,,87819,,987,0,,2987,,2838,94467,64583,,0,1194421,8603,,50502,,25604,906128,7979,1194421,8603 +"2020-10-13","VA",3372,3132,11,240,11598,11598,999,45,,200,,0,,,,,98,160805,151357,1235,0,10365,5035,,,180768,,2292562,20720,2292562,20720,147166,88467,,,,0,,0 +"2020-10-13","VI",20,,0,,,,,0,,,20737,117,,,,,,1325,,0,0,,,,,,1289,,0,22062,117,,,,,22091,117,,0 +"2020-10-13","VT",58,58,0,,,,5,0,,,170882,693,,,,,,1891,1886,11,0,,,,,,1673,,0,334028,1460,,,,,172768,704,334028,1460 +"2020-10-13","WA",2211,2190,21,,7874,7874,376,88,,76,,0,,,,,26,97268,95649,253,0,,,,,,,2123908,62470,2123908,62470,,,,,,0,,0 +"2020-10-13","WI",1518,1508,34,10,8601,8601,959,147,1287,243,1556954,11262,,,,,,163759,155471,3428,0,,,,,,123196,2719579,29967,2719579,29967,,,,,1712425,14541,,0 +"2020-10-13","WV",387,383,2,4,,,181,0,,61,,0,,,,,35,18555,17908,274,0,,,,,,13481,,0,639466,5219,18072,,,,,0,639466,5219 +"2020-10-13","WY",57,,3,,343,343,46,5,,,105879,2703,,,212943,,,7964,6740,162,0,,,,,8239,6181,,0,221182,4840,,,,,112619,3217,221182,4840 +"2020-10-12","AK",60,60,0,,352,352,52,7,,,,0,,,495867,,8,9903,,191,0,,,,,9748,5802,,0,505927,2930,,,,,,0,505927,2930 +"2020-10-12","AL",2665,2509,1,156,18179,18179,856,0,1892,,1068387,3970,,,,1068,,166076,146223,734,0,,,,,,71240,,0,1214610,4603,,,60414,,1214610,4603,,0 +"2020-10-12","AR",1586,1438,17,148,5960,5960,608,50,,256,1066196,7844,,,1066196,737,103,93487,88870,654,0,,,,5081,,84055,,0,1155066,8412,,,,28361,,0,1155066,8412 +"2020-10-12","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-12","AZ",5759,5472,0,287,20257,20257,667,4,,155,1353061,7567,,,,,80,226050,221139,475,0,,,,,,,,0,2403048,7898,,,302232,,1574200,8035,2403048,7898 +"2020-10-12","CA",16572,,8,,,,3070,0,,736,,0,,,,,,850028,850028,3449,0,,,,,,,,0,16191341,144337,,,,,,0,16191341,144337 +"2020-10-12","CO",2116,1747,3,369,7915,7915,370,22,,,949672,5569,161949,,,,,79037,73644,576,0,12294,,,,,,1571329,11150,1571329,11150,174243,,,,1023316,6097,,0 +"2020-10-12","CT",4532,3633,2,899,11845,11845,155,0,,,,0,,,2004458,,,61377,58923,1339,0,,,,,75387,9522,,0,2082309,7646,,,,,,0,2082309,7646 +"2020-10-12","DC",637,,0,,,,87,0,,21,,0,,,,,12,16022,,38,0,,,,,,12539,438819,2652,438819,2652,,,,,231817,888,,0 +"2020-10-12","DE",656,576,2,80,,,105,0,,25,291992,3552,,,,,,22289,21209,159,0,,,,,24645,11493,481441,6265,481441,6265,,,,,314281,3711,,0 +"2020-10-12","FL",15599,,47,,46541,46541,2206,91,,,4831259,15219,487730,475588,7008414,,,726934,705750,1519,0,51923,,50676,,947094,,8717711,36802,8717711,36802,539844,,526404,,5552679,16742,7999103,31400 +"2020-10-12","GA",7429,,13,,29656,29656,1666,21,5514,,,0,,,,,,332311,332311,902,0,26877,,,,311114,,,0,3168116,17087,312558,,,,,0,3168116,17087 +"2020-10-12","GU",60,,0,,,,65,0,,12,52520,627,,,,,,3170,3161,92,0,5,9,,,,2189,,0,55690,719,197,23,,,,0,55665,1188 +"2020-10-12","HI",169,169,1,,935,935,103,6,,34,,0,,,,,18,13670,13472,101,0,,,,,13426,10750,454713,0,454713,0,,,,,,0,,0 +"2020-10-12","IA",1472,,12,,,,449,0,,109,726331,2217,,58755,,,39,95809,95809,463,0,,,3594,4385,,76611,,0,822140,2680,,,62388,41464,823756,2682,,0 +"2020-10-12","ID",507,466,0,41,2041,2041,192,10,479,45,292557,1488,,,,,,48066,43113,365,0,,,,,,24304,,0,335670,1831,,,,,335670,1831,,0 +"2020-10-12","IL",9243,8997,13,246,,,1764,0,,377,,0,,,,,153,324930,321892,2742,0,,,,,,,,0,6355261,47579,,,,,,0,6355261,47579 +"2020-10-12","IN",3795,3568,6,227,13984,13984,1238,124,2780,346,1359297,8096,,,,,122,136555,,1574,0,,,,,136966,,,0,2393732,6347,,,,,1495852,9670,2393732,6347 +"2020-10-12","KS",771,,8,,3239,3239,355,54,890,111,504219,9837,,,,274,42,67862,,2055,0,,,,,,,,0,572081,11892,,,,,572081,11892,,0 +"2020-10-12","KY",1255,1242,3,13,6121,6121,672,27,1590,180,,0,,,,,,80930,69611,638,0,,,,,,13615,,0,1565097,28922,78700,35614,,,,0,1565097,28922 +"2020-10-12","LA",5669,5476,14,193,,,577,0,,,2317618,3337,,,,,70,174647,172119,60,0,,,,,,157873,,0,2492265,3397,,,,,,0,2489737,3397 +"2020-10-12","MA",9617,9401,13,216,12882,12882,501,11,,82,2293217,18036,,,,,32,139663,136933,760,0,,,,,178806,116364,,0,4815399,67395,,,122982,150702,2430150,18801,4815399,67395 +"2020-10-12","MD",4003,3859,4,144,16107,16107,384,49,,93,1610574,10087,,126269,,,,131861,131861,504,0,,,12358,,158129,7738,,0,2916220,23955,,,138627,,1742435,10591,2916220,23955 +"2020-10-12","ME",143,142,0,1,463,463,7,0,,5,,0,10015,,,,0,5752,5144,29,0,530,,,,6165,4998,,0,499701,5543,10559,,,,,0,499701,5543 +"2020-10-12","MI",7225,6898,6,327,,,899,0,,230,,0,,,3909701,,105,151396,136465,1932,0,,,,,188108,104271,,0,4097809,51027,307599,,,,,0,4097809,51027 +"2020-10-12","MN",2197,2144,3,53,8421,8421,446,67,2311,140,1476313,9857,,,,,,113439,113439,1171,0,,,,,,101376,2337122,18312,2337122,18312,,,,,1589752,11028,,0 +"2020-10-12","MO",2422,,0,,,,1313,0,,,1303437,0,76509,,1908333,,,144230,144230,0,0,4188,3979,,,163531,,,0,2075699,0,80831,20834,69462,14213,1447667,0,2075699,0 +"2020-10-12","MP",2,2,0,,4,4,,0,,,15121,0,,,,,,77,77,0,0,,,,,,29,,0,15198,0,,,,,15196,0,19835,0 +"2020-10-12","MS",3101,2829,0,272,6237,6237,600,184,,136,704655,0,,,,,59,105228,95543,296,0,,,,,,94165,,0,809883,296,40048,66989,,,,0,796968,0 +"2020-10-12","MT",212,,2,,904,904,291,12,,,,0,,,,,,19125,,423,0,,,,,,11481,,0,400458,10200,,,,,,0,400458,10200 +"2020-10-12","NC",3773,3738,3,35,,,1109,0,,314,,0,,,,,,232747,225959,1276,0,,,,,,,,0,3410281,32240,,9950,,,,0,3410281,32240 +"2020-10-12","ND",350,,7,,1099,1099,233,23,250,33,232602,831,9655,,,,,27673,27644,473,0,485,,,,,22846,691049,5338,691049,5338,10140,125,,,260339,1303,717732,5596 +"2020-10-12","NE",519,,0,,2526,2526,304,0,,,459556,2522,,,664473,,,52382,,495,0,,,,,62628,36446,,0,728422,5172,,,,,512249,3016,728422,5172 +"2020-10-12","NH",456,,1,,752,752,22,2,238,,284745,1096,,,,,,9143,8831,51,0,,,,,,8002,,0,497910,4801,32327,,31529,,293576,1125,497910,4801 +"2020-10-12","NJ",16175,14387,1,1788,23906,23906,662,12,,163,3757500,56356,,,,,52,220462,214097,553,0,,,,,,,,0,3977962,56909,,,,,,0,3971597,57576 +"2020-10-12","NM",915,,4,,3735,3735,127,25,,,,0,,,,,,33362,,379,0,,,,,,18791,,0,1002906,5533,,,,,,0,1002906,5533 +"2020-10-12","NV",1664,,3,,,,509,0,,136,654820,2295,,,,,56,86348,86348,569,0,,,,,,,1107492,2265,1107492,2265,,,,,740560,3687,1143512,8067 +"2020-10-12","NY",25587,,13,,89995,89995,878,0,,185,,0,,,,,84,475315,,1029,0,,,,,,,12131366,91793,12131366,91793,,,,,,0,,0 +"2020-10-12","OH",5005,4697,6,308,16442,16442,949,43,3434,242,,0,,,,,123,170179,160321,1430,0,,,,,182055,143826,,0,3661950,37451,,,,,,0,3661950,37451 +"2020-10-12","OK",1104,,6,,7284,7284,758,46,,276,1240518,0,,,1240518,,,100184,100184,797,0,4411,,,,110157,85265,,0,1340702,797,83562,,,,,0,1353634,0 +"2020-10-12","OR",599,,0,,2741,2741,212,0,,49,703971,4308,,,1136240,,18,37262,,327,0,,,,,61757,,,0,1197997,8692,,,,,728830,0,1197997,8692 +"2020-10-12","PA",8368,,18,,,,725,0,,,2044706,11061,,,,,81,173304,167068,1088,0,,,,,,140376,3440811,24648,3440811,24648,,,,,2211774,12048,,0 +"2020-10-12","PR",735,554,5,181,,,314,0,,54,305972,0,,,395291,,36,27004,27004,228,0,27230,,,,20103,24488,,0,332976,228,,,,,,0,415664,0 +"2020-10-12","RI",1137,,3,,2961,2961,126,11,,13,352269,1169,,,862835,,4,26831,,81,0,,,,,36959,,899794,3344,899794,3344,,,,,379100,1250,,0 +"2020-10-12","SC",3559,3355,7,204,9600,9600,684,22,,177,1339762,12510,67086,,1293052,,87,158055,152242,649,0,7723,12428,,,198952,78431,,0,1497817,13159,74809,68648,,,,0,1492004,13103 +"2020-10-12","SD",288,,2,,1886,1886,278,20,,,190319,772,,,,,,28925,28289,361,0,,,,,34386,22575,,0,320057,2997,,,,,219244,1133,320057,2997 +"2020-10-12","TN",2774,2649,7,125,9248,9248,945,33,,269,,0,,,2948860,,131,217682,207669,2965,0,,,,,252847,194836,,0,3201707,39215,,,,,,0,3201707,39215 +"2020-10-12","TX",16558,,1,,,,3870,0,,1196,,0,,,,,,795126,795126,2648,0,40449,21673,,,867785,705189,,0,7191773,21033,435831,271104,,,,0,7191773,21033 +"2020-10-12","UT",522,,5,,4331,4331,259,25,970,94,814165,3243,,,1092407,385,,86832,,988,0,,2870,,2723,93411,63961,,0,1185818,6434,,48471,,24782,898149,4201,1185818,6434 +"2020-10-12","VA",3361,3122,3,239,11553,11553,965,34,,205,,0,,,,,92,159570,150321,854,0,10350,4799,,,179640,,2271842,15022,2271842,15022,147037,83449,,,,0,,0 +"2020-10-12","VI",20,,0,,,,,0,,,20620,0,,,,,,1325,,0,0,,,,,,1289,,0,21945,0,,,,,21974,0,,0 +"2020-10-12","VT",58,58,0,,,,0,0,,,170189,844,,,,,,1880,1875,9,0,,,,,,1664,,0,332568,6903,,,,,172064,853,332568,6903 +"2020-10-12","WA",2190,2190,0,,7786,7786,352,0,,59,,0,,,,,27,97015,95402,383,0,,,,,,,2061438,0,2061438,0,,,,,,0,,0 +"2020-10-12","WI",1484,1474,9,10,8454,8454,950,56,1277,240,1545692,7815,,,,,,160331,152192,2016,0,,,,,,121204,2689612,24939,2689612,24939,,,,,1697884,9771,,0 +"2020-10-12","WV",385,381,3,4,,,168,0,,62,,0,,,,,29,18281,17668,153,0,,,,,,13318,,0,634247,5495,18005,,,,,0,634247,5495 +"2020-10-12","WY",54,,0,,338,338,51,15,,,103176,0,,,208467,,,7802,6628,191,0,,,,,7875,6058,,0,216342,5833,,,,,109402,0,216342,5833 +"2020-10-11","AK",60,60,0,,345,345,57,4,,,,0,,,493071,,7,9712,,250,0,,,,,9620,5789,,0,502997,3744,,,,,,0,502997,3744 +"2020-10-11","AL",2664,2508,0,156,18179,18179,812,0,1890,,1064417,4998,,,,1067,,165342,145590,816,0,,,,,,71240,,0,1210007,5687,,,60353,,1210007,5687,,0 +"2020-10-11","AR",1569,1421,17,148,5910,5910,566,10,,237,1058352,8384,,,1058352,731,97,92833,88302,613,0,,,,4999,,83454,,0,1146654,8938,,,,27910,,0,1146654,8938 +"2020-10-11","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-11","AZ",5759,5472,0,287,20253,20253,630,24,,144,1345494,9565,,,,,79,225575,220671,597,0,,,,,,,,0,2395150,10105,,,301689,,1566165,10150,2395150,10105 +"2020-10-11","CA",16564,,64,,,,3103,0,,735,,0,,,,,,846579,846579,3803,0,,,,,,,,0,16047004,168559,,,,,,0,16047004,168559 +"2020-10-11","CO",2113,1745,1,368,7893,7893,383,14,,,944103,9572,161640,,,,,78461,73116,819,0,12266,,,,,,1560179,19017,1560179,19017,173906,,,,1017219,10372,,0 +"2020-10-11","CT",4530,3631,0,899,11845,11845,134,0,,,,0,,,1997008,,,60038,57598,0,0,,,,,75199,9522,,0,2074663,9520,,,,,,0,2074663,9520 +"2020-10-11","DC",637,,1,,,,86,0,,26,,0,,,,,13,15984,,66,0,,,,,,12531,436167,7068,436167,7068,,,,,230929,2261,,0 +"2020-10-11","DE",654,574,1,80,,,108,0,,24,288440,2793,,,,,,22130,21050,132,0,,,,,24512,11430,475176,8353,475176,8353,,,,,310570,2925,,0 +"2020-10-11","FL",15552,,180,,46450,46450,2123,249,,,4816040,26799,487730,475588,6979043,,,725415,704398,5414,0,51923,,50676,,945112,,8680909,105804,8680909,105804,539844,,526404,,5535937,32162,7967703,91094 +"2020-10-11","GA",7416,,23,,29635,29635,1619,24,5511,,,0,,,,,,331409,331409,1140,0,26683,,,,309993,,,0,3151029,18480,311255,,,,,0,3151029,18480 +"2020-10-11","GU",60,,1,,,,60,0,,12,51893,133,,,,,,3078,3071,22,0,3,7,,,,2072,,0,54971,155,192,16,,,,0,54477,0 +"2020-10-11","HI",168,168,2,,929,929,103,18,,34,,0,,,,,18,13569,13371,71,0,,,,,13426,10713,454713,6903,454713,6903,,,,,,0,,0 +"2020-10-11","IA",1460,,5,,,,438,0,,100,724114,4307,,58731,,,40,95346,95346,1075,0,,,3594,4339,,76260,,0,819460,5382,,,62364,41229,821074,5374,,0 +"2020-10-11","ID",507,466,1,41,2031,2031,192,18,478,45,291069,2367,,,,,,47701,42770,613,0,,,,,,24089,,0,333839,2877,,,,,333839,2877,,0 +"2020-10-11","IL",9230,8984,9,246,,,1776,0,,388,,0,,,,,159,322188,319150,2727,0,,,,,,,,0,6307682,64047,,,,,,0,6307682,64047 +"2020-10-11","IN",3789,3562,7,227,13860,13860,1232,104,2765,349,1351201,9973,,,,,119,134981,,1570,0,,,,,136318,,,0,2387385,9066,,,,,1486182,11543,2387385,9066 +"2020-10-11","KS",763,,0,,3185,3185,469,0,877,119,494382,0,,,,271,34,65807,,0,0,,,,,,,,0,560189,0,,,,,560189,0,,0 +"2020-10-11","KY",1252,1239,3,13,6094,6094,652,0,1586,170,,0,,,,,,80292,69138,847,0,,,,,,13539,,0,1536175,0,78505,35468,,,,0,1536175,0 +"2020-10-11","LA",5655,5462,20,193,,,563,0,,,2314281,37600,,,,,71,174587,172059,1181,0,,,,,,157873,,0,2488868,38781,,,,,,0,2486340,38781 +"2020-10-11","MA",9604,9388,17,216,12871,12871,511,10,,85,2275181,15227,,,,,29,138903,136168,563,0,,,,,177860,116364,,0,4748004,77246,,,122843,150341,2411349,15797,4748004,77246 +"2020-10-11","MD",3999,3854,4,145,16058,16058,393,52,,90,1600487,11480,,126269,,,,131357,131357,562,0,,,12358,,157516,7738,,0,2892265,29182,,,138627,,1731844,12042,2892265,29182 +"2020-10-11","ME",143,142,0,1,463,463,7,1,,5,,0,10015,,,,0,5723,5128,27,0,530,,,,6153,4970,,0,494158,7774,10559,,,,,0,494158,7774 +"2020-10-11","MI",7219,6891,0,328,,,862,0,,220,,0,,,3860845,,85,149464,134656,0,0,,,,,185937,104271,,0,4046782,0,306564,,,,,0,4046782,0 +"2020-10-11","MN",2194,2141,10,53,8354,8354,471,52,2291,133,1466456,16181,,,,,,112268,112268,1440,0,,,,,,100171,2318810,30148,2318810,30148,,,,,1578724,17621,,0 +"2020-10-11","MO",2422,,0,,,,1313,0,,,1303437,0,76509,,1908333,,,144230,144230,0,0,4188,3979,,,163531,,,0,2075699,0,80831,20834,69462,14213,1447667,0,2075699,0 +"2020-10-11","MP",2,2,0,,4,4,,0,,,15121,0,,,,,,77,77,0,0,,,,,,29,,0,15198,0,,,,,15196,0,19835,0 +"2020-10-11","MS",3101,2829,5,272,6053,6053,600,0,,136,704655,0,,,,,59,104932,95289,294,0,,,,,,90577,,0,809587,294,40048,66989,,,,0,796968,0 +"2020-10-11","MT",210,,1,,892,892,286,7,,,,0,,,,,,18702,,585,0,,,,,,11361,,0,390258,1609,,,,,,0,390258,1609 +"2020-10-11","NC",3770,3735,5,35,,,1046,0,,288,,0,,,,,,231471,224727,1719,0,,,,,,,,0,3378041,36220,,9655,,,,0,3378041,36220 +"2020-10-11","ND",343,,3,,1076,1076,231,14,249,46,231771,1213,9655,,,,,27200,27177,637,0,485,,,,,22500,685711,7514,685711,7514,10140,124,,,259036,1850,712136,7862 +"2020-10-11","NE",519,,0,,2526,2526,305,27,,,457034,3746,,,659869,,,51887,,743,0,,,,,62066,36091,,0,723250,7558,,,,,509233,4487,723250,7558 +"2020-10-11","NH",455,,0,,750,750,21,0,238,,283649,0,,,,,,9092,8802,0,0,,,,,,7945,,0,493109,0,32299,,31503,,292451,0,493109,0 +"2020-10-11","NJ",16174,14386,3,1788,23894,23894,619,26,,153,3701144,0,,,,,46,219909,213628,847,0,,,,,,,,0,3921053,847,,,,,,0,3914021,0 +"2020-10-11","NM",911,,4,,3710,3710,120,6,,,,0,,,,,,32983,,261,0,,,,,,18680,,0,997373,7721,,,,,,0,997373,7721 +"2020-10-11","NV",1661,,2,,,,519,0,,133,652525,2981,,,,,64,85779,85779,380,0,,,,,,,1105227,4912,1105227,4912,,,,,736873,3478,1135445,7108 +"2020-10-11","NY",25574,,5,,89995,89995,820,0,,186,,0,,,,,84,474286,,1143,0,,,,,,,12039573,118254,12039573,118254,,,,,,0,,0 +"2020-10-11","OH",4999,4691,2,308,16399,16399,887,44,3428,220,,0,,,,,105,168749,158959,1291,0,,,,,180638,143123,,0,3624499,44373,,,,,,0,3624499,44373 +"2020-10-11","OK",1098,,3,,7238,7238,758,20,,276,1240518,0,,,1240518,,,99387,99387,766,0,4411,,,,110157,84520,,0,1339905,766,83562,,,,,0,1353634,0 +"2020-10-11","OR",599,,2,,2741,2741,212,0,,49,699663,5518,,,1127896,,18,36935,,409,0,,,,,61409,,,0,1189305,12636,,,,,728830,0,1189305,12636 +"2020-10-11","PA",8350,,6,,,,706,0,,,2033645,14205,,,,,90,172216,166081,1166,0,,,,,,138550,3416163,30831,3416163,30831,,,,,2199726,15324,,0 +"2020-10-11","PR",730,551,2,179,,,324,0,,51,305972,0,,,395291,,34,26776,26776,218,0,26895,,,,20103,24533,,0,332748,218,,,,,,0,415664,0 +"2020-10-11","RI",1134,,2,,2950,2950,125,16,,13,351100,3829,,,859585,,5,26750,,170,0,,,,,36865,,896450,13700,896450,13700,,,,,377850,3999,,0 +"2020-10-11","SC",3552,3348,1,204,9578,9578,685,17,,176,1327252,13562,66950,,1280819,,87,157406,151649,785,0,7695,12335,,,198082,78115,,0,1484658,14347,74645,68153,,,,0,1478901,14296 +"2020-10-11","SD",286,,0,,1866,1866,266,37,,,189547,1009,,,,,,28564,27943,617,0,,,,,34014,22413,,0,317060,4081,,,,,218111,1626,317060,4081 +"2020-10-11","TN",2767,2642,9,125,9215,9215,1124,35,,307,,0,,,2912759,,148,214717,204848,2068,0,,,,,249733,193849,,0,3162492,30953,,,,,,0,3162492,30953 +"2020-10-11","TX",16557,,31,,,,3622,0,,1142,,0,,,,,,792478,792478,2418,0,40234,21391,,,865350,703662,,0,7170740,33839,434254,268770,,,,0,7170740,33839 +"2020-10-11","UT",517,,7,,4306,4306,274,31,969,99,810922,4847,,,1086703,385,,85844,,1200,0,,2845,,2698,92681,63307,,0,1179384,10814,,47745,,24623,893948,5501,1179384,10814 +"2020-10-11","VA",3358,3120,4,238,11519,11519,924,18,,201,,0,,,,,98,158716,149631,811,0,10312,4712,,,176851,,2256820,18616,2256820,18616,146719,82437,,,,0,,0 +"2020-10-11","VI",20,,0,,,,,0,,,20620,186,,,,,,1325,,1,0,,,,,,1289,,0,21945,187,,,,,21974,182,,0 +"2020-10-11","VT",58,58,0,,,,0,0,,,169345,1594,,,,,,1871,1866,10,0,,,,,,1659,,0,325665,6371,,,,,171211,1604,325665,6371 +"2020-10-11","WA",2190,2190,0,,7786,7786,373,24,,70,,0,,,,,27,96632,95027,701,0,,,,,,,2061438,23492,2061438,23492,,,,,,0,,0 +"2020-10-11","WI",1475,1465,7,10,8398,8398,872,79,1271,229,1537877,7571,,,,,,158315,150236,2713,0,,,,,,119747,2664673,28261,2664673,28261,,,,,1688113,10247,,0 +"2020-10-11","WV",382,378,1,4,,,173,0,,58,,0,,,,,30,18128,17519,215,0,,,,,,13167,,0,628752,5943,18003,,,,,0,628752,5943 +"2020-10-11","WY",54,,0,,323,323,54,0,,,103176,0,,,202933,,,7611,6476,156,0,,,,,7576,5877,,0,210509,601,,,,,109402,0,210509,601 +"2020-10-10","AK",60,60,0,,341,341,66,2,,,,0,,,489481,,10,9462,,230,0,,,,,9466,5761,,0,499253,6183,,,,,,0,499253,6183 +"2020-10-10","AL",2664,2508,11,156,18179,18179,792,190,1889,,1059419,6867,,,,1065,,164526,144901,1061,0,,,,,,71240,,0,1204320,7868,,,60161,,1204320,7868,,0 +"2020-10-10","AR",1552,1405,49,147,5900,5900,554,95,,234,1049968,24422,,,1049968,730,97,92220,87748,2075,0,,,,4942,,82924,,0,1137716,26190,,,,27682,,0,1137716,26190 +"2020-10-10","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-10","AZ",5759,5472,13,287,20229,20229,685,30,,145,1335929,11731,,,,,71,224978,220086,894,0,,,,,,,,0,2385045,19197,,,300857,,1556015,12570,2385045,19197 +"2020-10-10","CA",16500,,72,,,,3084,0,,732,,0,,,,,,842776,842776,4170,0,,,,,,,,0,15878445,141948,,,,,,0,15878445,141948 +"2020-10-10","CO",2112,1744,9,368,7879,7879,365,24,,,934531,10063,161169,,,,,77642,72316,1023,0,12222,,,,,,1541162,22708,1541162,22708,173391,,,,1006847,11030,,0 +"2020-10-10","CT",4530,3631,0,899,11845,11845,134,0,,,,0,,,1987742,,,60038,57598,0,0,,,,,74947,9522,,0,2065143,23792,,,,,,0,2065143,23792 +"2020-10-10","DC",636,,2,,,,99,0,,27,,0,,,,,14,15918,,75,0,,,,,,12492,429099,6874,429099,6874,,,,,228668,1267,,0 +"2020-10-10","DE",653,573,2,80,,,103,0,,21,285647,3107,,,,,,21998,20917,171,0,,,,,24327,11338,466823,6319,466823,6319,,,,,307645,3278,,0 +"2020-10-10","FL",15372,,0,,46201,46201,2077,0,,,4789241,0,487730,475588,6895066,,,720001,699734,0,0,51923,,50676,,938197,,8575105,22523,8575105,22523,539844,,526404,,5503775,0,7876609,0 +"2020-10-10","GA",7393,,45,,29611,29611,1646,101,5508,,,0,,,,,,330269,330269,1237,0,26503,,,,308919,,,0,3132549,19930,310173,,,,,0,3132549,19930 +"2020-10-10","GU",59,,1,,,,62,0,,13,51760,254,,,,,,3056,3049,67,0,3,7,,,,2072,,0,54816,321,192,16,,,,0,54477,0 +"2020-10-10","HI",166,166,2,,911,911,106,11,,29,,0,,,,,18,13498,13300,165,0,,,,,13244,10651,447810,3818,447810,3818,,,,,,0,,0 +"2020-10-10","IA",1455,,18,,,,450,0,,101,719807,4193,,58468,,,40,94271,94271,1084,0,,,3586,4320,,75948,,0,814078,5277,,,62093,41240,815700,5272,,0 +"2020-10-10","ID",506,464,3,42,2013,2013,192,16,475,45,288702,3653,,,,,,47088,42260,662,0,,,,,,23881,,0,330962,4173,,,,,330962,4173,,0 +"2020-10-10","IL",9221,8975,30,246,,,1807,0,,406,,0,,,,,166,319461,316423,2905,0,,,,,,,,0,6243635,66256,,,,,,0,6243635,66256 +"2020-10-10","IN",3782,3555,21,227,13756,13756,1180,108,2751,339,1341228,9285,,,,,115,133411,,1918,0,,,,,135649,,,0,2378319,24590,,,,,1474639,11203,2378319,24590 +"2020-10-10","KS",763,,0,,3185,3185,469,0,877,119,494382,0,,,,271,34,65807,,0,0,,,,,,,,0,560189,0,,,,,560189,0,,0 +"2020-10-10","KY",1249,1236,7,13,6094,6094,652,61,1586,170,,0,,,,,,79445,68442,989,0,,,,,,13539,,0,1536175,10911,78505,35468,,,,0,1536175,10911 +"2020-10-10","LA",5635,5442,0,193,,,582,0,,,2276681,0,,,,,78,173406,170878,0,0,,,,,,157873,,0,2450087,0,,,,,,0,2447559,0 +"2020-10-10","MA",9587,9372,10,215,12861,12861,531,15,,86,2259954,14573,,,,,28,138340,135598,639,0,,,,,177148,116364,,0,4670758,69324,,,122655,149566,2395552,15160,4670758,69324 +"2020-10-10","MD",3995,3850,5,145,16006,16006,383,50,,91,1589007,11799,,126269,,,,130795,130795,636,0,,,12358,,156068,7721,,0,2863083,33660,,,138627,,1719802,12435,2863083,33660 +"2020-10-10","ME",143,142,0,1,462,462,7,2,,5,,0,10015,,,,0,5696,5105,30,0,530,,,,6123,4951,,0,486384,5886,10559,,,,,0,486384,5886 +"2020-10-10","MI",7219,6891,19,328,,,862,0,,220,,0,,,3860845,,85,149464,134656,1648,0,,,,,185937,104271,,0,4046782,45518,306564,,,,,0,4046782,45518 +"2020-10-10","MN",2184,2131,10,53,8302,8302,471,51,2277,133,1450275,16045,,,,,,110828,110828,1516,0,,,,,,99054,2288662,32497,2288662,32497,,,,,1561103,17561,,0 +"2020-10-10","MO",2422,,27,,,,1313,0,,,1303437,42982,76509,,1908333,,,144230,144230,5066,0,4188,3979,,,163531,,,0,2075699,74720,80831,20834,69462,14213,1447667,48048,2075699,74720 +"2020-10-10","MP",2,2,0,,4,4,,0,,,15121,0,,,,,,77,77,2,0,,,,,,29,,0,15198,2,,,,,15196,0,19835,-874 +"2020-10-10","MS",3096,2825,16,271,6053,6053,600,0,,136,704655,0,,,,,59,104638,95088,957,0,,,,,,90577,,0,809293,957,40048,66989,,,,0,796968,0 +"2020-10-10","MT",209,,3,,885,885,280,17,,,,0,,,,,,18117,,718,0,,,,,,11361,,0,388649,1903,,,,,,0,388649,1903 +"2020-10-10","NC",3765,3731,18,34,,,1034,0,,281,,0,,,,,,229752,223089,2321,0,,,,,,,,0,3341821,41183,,9135,,,,0,3341821,41183 +"2020-10-10","ND",340,,15,,1062,1062,219,25,248,42,230558,1402,9655,,,,,26563,26540,598,0,485,,,,,22123,678197,8158,678197,8158,10140,116,,,257186,1990,704274,8653 +"2020-10-10","NE",519,,5,,2499,2499,299,18,,,453288,8880,,,653140,,,51144,,1085,0,,,,,61254,36091,,0,715692,19440,,,,,504746,9966,715692,19440 +"2020-10-10","NH",455,,6,,750,750,21,3,238,,283649,4650,,,,,,9092,8802,214,0,,,,,,7945,,0,493109,10991,32299,,31503,,292451,4823,493109,10991 +"2020-10-10","NJ",16171,14383,7,1788,23868,23868,641,47,,156,3701144,34169,,,,,48,219062,212877,990,0,,,,,,,,0,3920206,35159,,,,,,0,3914021,35033 +"2020-10-10","NM",907,,5,,3704,3704,130,26,,,,0,,,,,,32722,,481,0,,,,,,18621,,0,989652,9599,,,,,,0,989652,9599 +"2020-10-10","NV",1659,,2,,,,519,0,,133,649544,3903,,,,,64,85399,85399,806,0,,,,,,,1100315,8279,1100315,8279,,,,,733395,4531,1128337,9254 +"2020-10-10","NY",25569,,8,,89995,89995,826,0,,179,,0,,,,,81,473143,,1447,0,,,,,,,11921319,134579,11921319,134579,,,,,,0,,0 +"2020-10-10","OH",4997,4689,3,308,16355,16355,862,54,3425,223,,0,,,,,111,167458,157764,1356,0,,,,,178998,142479,,0,3580126,45541,,,,,,0,3580126,45541 +"2020-10-10","OK",1095,,4,,7218,7218,758,94,,276,1240518,15635,,,1240518,,,98621,98621,1533,0,4411,,,,110157,83633,,0,1339139,17168,83562,,,,,0,1353634,17072 +"2020-10-10","OR",597,,3,,2741,2741,212,14,,49,694145,5883,,,1115705,,18,36526,,410,0,,,,,60964,,,0,1176669,13520,,,,,728830,6268,1176669,13520 +"2020-10-10","PA",8344,,36,,,,732,0,,,2019440,19675,,,,,94,171050,164962,1742,0,,,,,,138550,3385332,48695,3385332,48695,,,,,2184402,21316,,0 +"2020-10-10","PR",728,548,8,180,,,347,0,,55,305972,0,,,395291,,31,26558,26558,232,0,26806,,,,20103,24129,,0,332530,232,,,,,,0,415664,0 +"2020-10-10","RI",1132,,2,,2934,2934,119,32,,12,347271,5504,,,846115,,5,26580,,286,0,,,,,36635,,882750,18112,882750,18112,,,,,373851,5790,,0 +"2020-10-10","SC",3551,3346,21,205,9561,9561,728,42,,179,1313690,16798,66711,,1267427,,93,156621,150915,945,0,7631,12251,,,197178,77700,,0,1470311,17743,74342,67607,,,,0,1464605,17680 +"2020-10-10","SD",286,,9,,1829,1829,267,47,,,188538,1600,,,,,,27947,27401,732,0,,,,,33359,22128,,0,312979,5854,,,,,216485,2332,312979,5854 +"2020-10-10","TN",2758,2634,26,124,9180,9180,1156,47,,320,,0,,,2883885,,153,212649,202956,1646,0,,,,,247654,192958,,0,3131539,24240,,,,,,0,3131539,24240 +"2020-10-10","TX",16526,,94,,,,3628,0,,1137,,0,,,,,,790060,790060,4230,0,39953,21136,,,861853,701583,,0,7136901,61495,432509,266444,,,,0,7136901,61495 +"2020-10-10","UT",510,,5,,4275,4275,246,55,968,89,806075,9196,,,1077001,385,,84644,,1354,0,,2833,,2687,91569,62401,,0,1168570,12969,,47303,,24447,888447,10981,1168570,12969 +"2020-10-10","VA",3354,3116,10,238,11501,11501,943,54,,208,,0,,,,,97,157905,148933,1256,0,10252,4616,,,176851,,2238204,18694,2238204,18694,146267,81263,,,,0,,0 +"2020-10-10","VI",20,,0,,,,,0,,,20434,0,,,,,,1324,,0,0,,,,,,1286,,0,21758,0,,,,,21792,0,,0 +"2020-10-10","VT",58,58,0,,,,0,0,,,167751,641,,,,,,1861,1856,10,0,,,,,,1651,,0,319294,4436,,,,,169607,651,319294,4436 +"2020-10-10","WA",2190,2190,7,,7762,7762,364,29,,69,,0,,,,,30,95931,94360,726,0,,,,,,,2037946,21475,2037946,21475,,,,,,0,,0 +"2020-10-10","WI",1468,1458,17,10,8319,8319,870,120,1270,232,1530306,11644,,,,,,155602,147560,2971,0,,,,,,117865,2636412,32759,2636412,32759,,,,,1677866,14386,,0 +"2020-10-10","WV",381,377,5,4,,,173,0,,60,,0,,,,,27,17913,17310,206,0,,,,,,13086,,0,622809,10461,17917,,,,,0,622809,10461 +"2020-10-10","WY",54,,0,,323,323,54,6,,,103176,0,,,202385,,,7455,6338,120,0,,,,,7523,5807,,0,209908,867,,,,,109402,0,209908,867 +"2020-10-09","AK",60,60,0,,339,339,51,2,,,,0,,,483521,,6,9232,,187,0,,,,,9256,5734,,0,493070,1899,,,,,,0,493070,1899 +"2020-10-09","AL",2653,2496,16,157,17989,17989,816,0,1884,,1052552,10506,,,,1063,,163465,143900,1490,0,,,,,,71240,,0,1196452,11742,,,59957,,1196452,11742,,0 +"2020-10-09","AR",1503,1359,0,144,5805,5805,546,0,,237,1025546,0,,,1025546,723,102,90145,85980,0,0,,,,4591,,81563,,0,1111526,0,,,,25538,,0,1111526,0 +"2020-10-09","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-09","AZ",5746,5460,3,286,20199,20199,706,28,,155,1324198,11699,,,,,70,224084,219247,683,0,,,,,,,,0,2365848,21118,,,300333,,1543445,12350,2365848,21118 +"2020-10-09","CA",16428,,67,,,,3186,0,,742,,0,,,,,,838606,838606,3806,0,,,,,,,,0,15736497,112874,,,,,,0,15736497,112874 +"2020-10-09","CO",2103,1736,8,367,7855,7855,380,21,,,924468,10031,160671,,,,,76619,71349,834,0,12172,,,,,,1518454,22256,1518454,22256,172843,,,,995817,10821,,0 +"2020-10-09","CT",4530,3631,3,899,11845,11845,134,0,,,,0,,,1964451,,,60038,57598,290,0,,,,,74474,9522,,0,2041351,27565,,,,,,0,2041351,27565 +"2020-10-09","DC",634,,0,,,,99,0,,27,,0,,,,,13,15843,,78,0,,,,,,12456,422225,5409,422225,5409,,,,,227401,2423,,0 +"2020-10-09","DE",651,571,0,80,,,104,0,,21,282540,2720,,,,,,21827,20748,145,0,,,,,24206,11236,460504,3449,460504,3449,,,,,304367,2865,,0 +"2020-10-09","FL",15372,,118,,46201,46201,2143,196,,,4789241,25496,487730,475588,6895066,,,720001,699734,2853,0,51923,,50676,,938197,,8552582,69642,8552582,69642,539844,,526404,,5503775,28380,7876609,48343 +"2020-10-09","GA",7348,,54,,29510,29510,1717,124,5482,,,0,,,,,,329032,329032,1625,0,26291,,,,307868,,,0,3112619,29498,308749,,,,,0,3112619,29498 +"2020-10-09","GU",58,,0,,,,55,0,,14,51506,369,,,,,,2989,2982,55,0,3,7,,,,2072,,0,54495,424,192,16,,,,0,54477,422 +"2020-10-09","HI",164,164,1,,900,900,111,6,,32,,0,,,,,18,13333,13146,101,0,,,,,13021,10604,443992,3903,443992,3903,,,,,,0,,0 +"2020-10-09","IA",1437,,16,,,,461,0,,104,715614,4722,,58074,,,38,93187,93187,1042,0,,,3569,4263,,75113,,0,808801,5764,,,61682,40536,810428,5770,,0 +"2020-10-09","ID",503,462,3,41,1997,1997,191,25,474,41,285049,1941,,,,,,46426,41740,673,0,,,,,,23678,,0,326789,2461,,,,,326789,2461,,0 +"2020-10-09","IL",9191,8945,32,246,,,1812,0,,395,,0,,,,,153,316556,313518,3117,0,,,,,,,,0,6177379,71599,,,,,,0,6177379,71599 +"2020-10-09","IN",3761,3534,19,227,13648,13648,1187,111,2720,357,1331943,10229,,,,,116,131493,,1816,0,,,,,134014,,,0,2353729,30473,,,,,1463436,12045,2353729,30473 +"2020-10-09","KS",763,,40,,3185,3185,469,64,877,119,494382,8936,,,,271,34,65807,,1855,0,,,,,,,,0,560189,10791,,,,,560189,10791,,0 +"2020-10-09","KY",1242,1229,8,13,6033,6033,679,219,1571,172,,0,,,,,,78456,67635,1001,0,,,,,,13417,,0,1525264,24651,78322,29238,,,,0,1525264,24651 +"2020-10-09","LA",5635,5442,26,193,,,582,0,,,2276681,9615,,,,,78,173406,170878,257,0,,,,,,157873,,0,2450087,9872,,,,,,0,2447559,9872 +"2020-10-09","MA",9577,9362,12,215,12846,12846,500,16,,88,2245381,18833,,,,,28,137701,135011,765,0,,,,,176443,116364,,0,4601434,59918,,,122441,147155,2380392,19567,4601434,59918 +"2020-10-09","MD",3990,3845,11,145,15956,15956,391,58,,96,1577208,10334,,126269,,,,130159,130159,734,0,,,12358,,156068,7704,,0,2829423,27120,,,138627,,1707367,11068,2829423,27120 +"2020-10-09","ME",143,142,1,1,460,460,7,1,,5,,0,10015,,,,0,5666,5075,27,0,530,,,,6101,4933,,0,480498,8103,10559,,,,,0,480498,8103 +"2020-10-09","MI",7200,6876,7,324,,,862,0,,220,,0,,,3817200,,85,147816,133134,1323,0,,,,,184064,99521,,0,4001264,43498,303491,,,,,0,4001264,43498 +"2020-10-09","MN",2174,2121,14,53,8251,8251,471,64,2267,133,1434230,15593,,,,,,109312,109312,1390,0,,,,,,97715,2256165,31971,2256165,31971,,,,,1543542,16983,,0 +"2020-10-09","MO",2395,,136,,,,1303,0,,,1260455,10472,75405,,1839237,,,139164,139164,2008,0,4042,3722,,,158050,,,0,2000979,21589,79581,18390,68411,12459,1399619,12480,2000979,21589 +"2020-10-09","MP",2,2,0,,4,4,,0,,,15121,0,,,,,,75,75,0,0,,,,,,29,,0,15196,0,,,,,15196,0,20709,0 +"2020-10-09","MS",3080,2812,6,268,6053,6053,627,0,,130,704655,0,,,,,64,103681,94506,862,0,,,,,,90577,,0,808336,862,40048,66989,,,,0,796968,0 +"2020-10-09","MT",206,,9,,868,868,266,17,,,,0,,,,,,17399,,722,0,,,,,,10863,,0,386746,5081,,,,,,0,386746,5081 +"2020-10-09","NC",3747,3713,25,34,,,1065,0,,299,,0,,,,,,227431,220965,2034,0,,,,,,,,0,3300638,40012,,8219,,,,0,3300638,40012 +"2020-10-09","ND",325,,11,,1037,1037,202,21,245,39,229156,1133,9655,,,,,25965,25953,644,0,485,,,,,21755,670039,8833,670039,8833,10140,68,,,255196,1789,695621,9157 +"2020-10-09","NE",514,,7,,2481,2481,293,13,,,444408,3674,,,633976,,,50059,,663,0,,,,,61002,35456,,0,696252,8563,,,,,494780,4337,696252,8563 +"2020-10-09","NH",449,,0,,747,747,14,0,238,,278999,0,,,,,,8878,8629,0,0,,,,,,7898,,0,482118,0,32172,,31384,,287628,0,482118,0 +"2020-10-09","NJ",16164,14376,4,1788,23821,23821,666,58,,150,3666975,35456,,,,,53,218072,212013,983,0,,,,,,,,0,3885047,36439,,,,,,0,3878988,36321 +"2020-10-09","NM",902,,3,,3678,3678,133,26,,,,0,,,,,,32241,,485,0,,,,,,18335,,0,980053,6108,,,,,,0,980053,6108 +"2020-10-09","NV",1657,,8,,,,502,0,,127,645641,5270,,,,,63,84593,84593,766,0,,,,,,,1092036,9314,1092036,9314,,,,,728864,6356,1119083,17916 +"2020-10-09","NY",25561,,6,,89995,89995,779,0,,168,,0,,,,,78,471696,,1592,0,,,,,,,11786740,139300,11786740,139300,,,,,,0,,0 +"2020-10-09","OH",4994,4686,11,308,16301,16301,849,101,3413,240,,0,,,,,118,166102,156480,1840,0,,,,,177208,141642,,0,3534585,45553,,,,,,0,3534585,45553 +"2020-10-09","OK",1091,,6,,7124,7124,749,102,,265,1224883,15577,,,1224883,,,97088,97088,1524,0,4185,,,,108540,82482,,0,1321971,17101,80939,,,,,0,1336562,17571 +"2020-10-09","OR",594,,11,,2727,2727,197,22,,39,688262,5328,,,1102668,,14,36116,,482,0,,,,,60481,,,0,1163149,11642,,,,,722562,5785,1163149,11642 +"2020-10-09","PA",8308,,9,,,,734,0,,,1999765,14662,,,,,92,169308,163321,1380,0,,,,,,137139,3336637,40270,3336637,40270,,,,,2163086,15920,,0 +"2020-10-09","PR",720,541,5,179,,,354,0,,55,305972,0,,,395291,,29,26326,26326,316,0,26566,,,,20103,23603,,0,332298,316,,,,,,0,415664,0 +"2020-10-09","RI",1130,,3,,2902,2902,112,13,,10,341767,3498,,,828293,,6,26294,,249,0,,,,,36345,,864638,5209,864638,5209,,,,,368061,3747,,0 +"2020-10-09","SC",3530,3325,16,205,9519,9519,748,44,,193,1296892,21008,66398,,1250899,,99,155676,150033,921,0,7573,12054,,,196026,77102,,0,1452568,21929,73971,65448,,,,0,1446925,21822 +"2020-10-09","SD",277,,5,,1782,1782,267,65,,,186938,2088,,,,,,27215,26711,804,0,,,,,32559,21750,,0,307125,4622,,,,,214153,2862,307125,4622 +"2020-10-09","TN",2732,2614,27,118,9133,9133,1186,39,,315,,0,,,2861272,,153,211003,201530,1556,0,,,,,246027,191651,,0,3107299,26790,,,,,,0,3107299,26790 +"2020-10-09","TX",16432,,98,,,,3593,0,,1138,,0,,,,,,785830,785830,4036,0,39452,20779,,,856947,698481,,0,7075406,65212,429145,260712,,,,0,7075406,65212 +"2020-10-09","UT",505,,4,,4220,4220,261,53,957,86,796879,7046,,,1065363,380,,83290,,1343,0,,2727,,2589,90238,61326,,0,1155601,13277,,45157,,23582,877466,8313,1155601,13277 +"2020-10-09","VA",3344,3110,16,234,11447,11447,963,54,,205,,0,,,,,87,156649,147928,1114,0,10195,4448,,,176851,,2219510,29718,2219510,29718,145817,77241,,,,0,,0 +"2020-10-09","VI",20,,0,,,,,0,,,20434,68,,,,,,1324,,2,0,,,,,,1286,,0,21758,70,,,,,21792,50,,0 +"2020-10-09","VT",58,58,0,,,,0,0,,,167110,968,,,,,,1851,1846,8,0,,,,,,1646,,0,314858,1873,,,,,168956,976,314858,1873 +"2020-10-09","WA",2183,2183,6,,7733,7733,357,30,,72,,0,,,,,29,95205,93670,723,0,,,,,,,2016471,28994,2016471,28994,,,,,,0,,0 +"2020-10-09","WI",1451,1440,16,11,8199,8199,876,138,1261,229,1518662,11834,,,,,,152631,144818,3164,0,,,,,,115826,2603653,34811,2603653,34811,,,,,1663480,14822,,0 +"2020-10-09","WV",376,372,6,4,,,164,0,,57,,0,,,,,25,17707,17129,382,0,,,,,,12896,,0,612348,7956,17794,,,,,0,612348,7956 +"2020-10-09","WY",54,,0,,317,317,54,4,,,103176,1326,,,201618,,,7335,6226,243,0,,,,,7423,5732,,0,209041,3017,,,,,109402,1521,209041,3017 +"2020-10-08","AK",60,60,1,,337,337,46,4,,,,0,,,481745,,6,9045,,134,0,,,,,9133,5672,,0,491171,1097,,,,,,0,491171,1097 +"2020-10-08","AL",2637,2484,36,153,17989,17989,754,74,1876,,1042046,3520,,,,1061,,161975,142664,557,0,,,,,,71240,,0,1184710,3892,,,59685,,1184710,3892,,0 +"2020-10-08","AR",1503,1359,21,144,5805,5805,546,65,,237,1025546,12903,,,1025546,723,102,90145,85980,1265,0,,,,4591,,81563,,0,1111526,13970,,,,25538,,0,1111526,13970 +"2020-10-08","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-08","AZ",5743,5456,10,287,20171,20171,728,121,,156,1312499,11551,,,,,63,223401,218596,863,0,,,,,,,,0,2344730,22948,,,299269,,1531095,12401,2344730,22948 +"2020-10-08","CA",16361,,133,,,,3186,0,,754,,0,,,,,,834800,834800,3575,0,,,,,,,,0,15623623,66917,,,,,,0,15623623,66917 +"2020-10-08","CO",2095,1729,10,366,7834,7834,356,63,,,914437,9322,160046,,,,,75785,70559,863,0,12116,,,,,,1496198,18897,1496198,18897,172162,,,,984996,10133,,0 +"2020-10-08","CT",4527,3629,5,898,11845,11845,128,146,,,,0,,,1937368,,,59748,57332,384,0,,,,,74007,9522,,0,2013786,31139,,,,,,0,2013786,31139 +"2020-10-08","DC",634,,2,,,,100,0,,25,,0,,,,,15,15765,,68,0,,,,,,12431,416816,4160,416816,4160,,,,,224978,1358,,0 +"2020-10-08","DE",651,571,2,80,,,101,0,,21,279820,2197,,,,,,21682,20604,132,0,,,,,24108,11146,457055,1920,457055,1920,,,,,301502,2329,,0 +"2020-10-08","FL",15254,,170,,46005,46005,2141,228,,,4763745,26741,487730,475588,6850539,,,717148,697188,3246,0,51923,,50676,,934530,,8482940,71411,8482940,71411,539844,,526404,,5475395,29978,7828266,50009 +"2020-10-08","GA",7294,,35,,29386,29386,1742,78,5453,,,0,,,,,,327407,327407,1265,0,26095,,,,306421,,,0,3083121,24934,307780,,,,,0,3083121,24934 +"2020-10-08","GU",58,,1,,,,50,0,,15,51137,517,,,,,,2934,2929,66,0,3,5,,,,2067,,0,54071,583,192,14,,,,0,54055,578 +"2020-10-08","HI",163,163,3,,894,894,109,5,,35,,-295153,,,,,18,13232,13045,108,0,,,,,12998,10573,440089,3591,440089,3591,,,,,,-308090,,-441593 +"2020-10-08","IA",1421,,6,,,,449,0,,112,710892,5719,,57806,,,63,92145,92145,1261,0,,,3550,4075,,74250,,0,803037,6980,,,61395,39309,804658,6974,,0 +"2020-10-08","ID",500,459,8,41,1972,1972,191,40,470,41,283108,1999,,,,,,45753,41220,671,0,,,,,,23475,,0,324328,2534,,,,,324328,2534,,0 +"2020-10-08","IL",9159,8910,32,249,,,1755,0,,392,,0,,,,,163,313439,310700,3059,0,,,,,,,,0,6105780,72491,,,,,,0,6105780,72491 +"2020-10-08","IN",3742,3515,15,227,13537,13537,1110,107,2691,342,1321714,9024,,,,,107,129677,,1450,0,,,,,132382,,,0,2323256,29878,,,,,1451391,10474,2323256,29878 +"2020-10-08","KS",723,,0,,3121,3121,393,0,849,103,485446,0,,,,267,34,63952,,0,0,,,,,,,,0,549398,0,,,,,549398,0,,0 +"2020-10-08","KY",1234,1222,11,12,5814,5814,701,135,1562,174,,0,,,,,,77455,66830,868,0,,,,,,13113,,0,1500613,19282,62645,28779,,,,0,1500613,19282 +"2020-10-08","LA",5609,5416,5,193,,,564,0,,,2267066,11776,,,,,79,173149,170621,524,0,,,,,,157873,,0,2440215,12300,,,,,,0,2437687,12300 +"2020-10-08","MA",9565,9350,8,215,12830,12830,484,23,,85,2226548,13626,,,,,23,136936,134277,444,0,,,,,175537,116364,,0,4541516,63385,,,122087,145573,2360825,14035,4541516,63385 +"2020-10-08","MD",3979,3835,6,144,15898,15898,403,55,,98,1566874,11634,,126269,,,,129425,129425,761,0,,,12358,,155177,7676,,0,2802303,29023,,,138627,,1696299,12395,2802303,29023 +"2020-10-08","ME",142,141,0,1,459,459,7,0,,1,,0,9987,,,,0,5639,5048,35,0,528,,,,6069,4900,,0,472395,6735,10529,,,,,0,472395,6735 +"2020-10-08","MI",7193,6869,24,324,,,862,0,,220,,0,,,3775347,,85,146493,132039,1401,0,,,,,182419,99521,,0,3957766,42115,302572,,,,,0,3957766,42115 +"2020-10-08","MN",2160,2107,6,53,8187,8187,457,98,2245,139,1418637,14147,,,,,,107922,107922,1271,0,,,,,,97254,2224194,28312,2224194,28312,,,,,1526559,15418,,0 +"2020-10-08","MO",2259,,23,,,,1344,0,,,1249983,10619,75135,,1819846,,,137156,137156,1505,0,3984,3642,,,155881,,,0,1979390,20929,79251,18042,68157,12276,1387139,12124,1979390,20929 +"2020-10-08","MP",2,2,0,,4,4,,0,,,15121,0,,,,,,75,75,0,0,,,,,,29,,0,15196,0,,,,,15196,0,20709,0 +"2020-10-08","MS",3074,2807,23,267,6053,6053,606,0,,139,704655,0,,,,,66,102819,93881,578,0,,,,,,90577,,0,807474,578,40048,66989,,,,0,796968,0 +"2020-10-08","MT",197,,4,,851,851,263,31,,,,0,,,,,,16677,,614,0,,,,,,10656,,0,381665,5489,,,,,,0,381665,5489 +"2020-10-08","NC",3722,3689,29,33,,,1051,0,,296,,0,,,,,,225397,219162,2428,0,,,,,,,,0,3260626,33428,,6114,,,,0,3260626,33428 +"2020-10-08","ND",314,,6,,1016,1016,214,21,238,40,228023,1207,9655,,,,,25321,25310,523,0,485,,,,,21242,661206,6558,661206,6558,10140,65,,,253407,1734,686464,6900 +"2020-10-08","NE",507,,0,,2468,2468,288,32,,,440734,3497,,,624880,,,49396,,639,0,,,,,61554,35295,,0,687689,12674,,,,,490443,4137,687689,12674 +"2020-10-08","NH",449,,1,,747,747,14,2,238,,278999,2405,,,,,,8878,8629,78,0,,,,,,7898,,0,482118,5604,32172,,31384,,287628,2500,482118,5604 +"2020-10-08","NJ",16160,14373,8,1787,23763,23763,652,124,,148,3631519,59559,,,,,52,217089,211148,1412,0,,,,,,,,0,3848608,60971,,,,,,0,3842667,60857 +"2020-10-08","NM",899,,3,,3652,3652,119,27,,,,0,,,,,,31756,,384,0,,,,,,18045,,0,973945,8626,,,,,,0,973945,8626 +"2020-10-08","NV",1649,,13,,,,498,0,,130,640371,3209,,,,,64,83827,83827,480,0,,,,,,,1082722,8002,1082722,8002,,,,,722508,3655,1101167,7189 +"2020-10-08","NY",25555,,10,,89995,89995,754,0,,172,,0,,,,,67,470104,,1836,0,,,,,,,11647440,145811,11647440,145811,,,,,,0,,0 +"2020-10-08","OH",4983,4674,13,309,16200,16200,863,109,3395,229,,0,,,,,108,164262,154746,1539,0,,,,,175449,140808,,0,3489032,33545,,,,,,0,3489032,33545 +"2020-10-08","OK",1085,,10,,7022,7022,697,93,,252,1209306,13035,,,1209306,,,95564,95564,1212,0,4185,,,,107221,81289,,0,1304870,14247,80939,,,,,0,1318991,13845 +"2020-10-08","OR",583,,2,,2705,2705,197,25,,39,682934,4876,,,1091381,,14,35634,,294,0,,,,,60126,5870,,0,1151507,9830,,,,,716777,5144,1151507,9830 +"2020-10-08","PA",8299,,27,,,,687,0,,,1985103,17561,,,,,76,167928,162063,1376,0,,,,,,136021,3296367,34754,3296367,34754,,,,,2147166,18852,,0 +"2020-10-08","PR",715,536,10,179,,,315,0,,49,305972,0,,,395291,,27,26010,26010,352,0,26284,,,,20103,22805,,0,331982,352,,,,,,0,415664,0 +"2020-10-08","RI",1127,,1,,2889,2889,117,16,,12,338269,6695,,,823284,,6,26045,,269,0,,,,,36145,,859429,20947,859429,20947,,,,,364314,6964,,0 +"2020-10-08","SC",3514,3311,12,203,9475,9475,716,83,,191,1275884,18993,66116,,1230378,,94,154755,149219,1050,0,7498,11862,,,194725,76477,,0,1430639,20043,73614,63262,,,,0,1425103,19878 +"2020-10-08","SD",272,,14,,1717,1717,284,20,,,184850,1976,,,,,,26411,25961,505,0,,,,,31884,21496,,0,302503,4814,,,,,211291,2511,302503,4814 +"2020-10-08","TN",2705,2591,63,114,9094,9094,1149,59,,307,,0,,,2836100,,158,209447,200103,1992,0,,,,,244409,189990,,0,3080509,27016,,,,,,0,3080509,27016 +"2020-10-08","TX",16334,,104,,,,3556,0,,1098,,0,,,,,,781794,781794,4238,0,39230,20366,,,852037,695194,,0,7010194,68542,427731,252857,,,,0,7010194,68542 +"2020-10-08","UT",501,,5,,4167,4167,251,54,947,86,789833,8005,,,1053434,376,,81947,,1501,0,,2650,,2514,88890,60220,,0,1142324,12505,,43435,,22869,869153,9382,1142324,12505 +"2020-10-08","VA",3328,3097,25,231,11393,11393,933,48,,196,,0,,,,,89,155535,146957,1844,0,10146,4289,,,175080,,2189792,19479,2189792,19479,145318,72188,,,,0,,0 +"2020-10-08","VI",20,,0,,,,,0,,,20366,93,,,,,,1322,,1,0,,,,,,1286,,0,21688,94,,,,,21742,112,,0 +"2020-10-08","VT",58,58,0,,,,1,0,,,166142,1242,,,,,,1843,1838,11,0,,,,,,1638,,0,312985,5575,,,,,167980,1253,312985,5575 +"2020-10-08","WA",2177,2177,12,,7703,7703,383,30,,73,,0,,,,,30,94482,92976,723,0,,,,,,,1987477,26410,1987477,26410,,,,,,0,,0 +"2020-10-08","WI",1435,1424,9,11,8061,8061,907,110,1253,228,1506828,13524,,,,,,149467,141830,3274,0,,,,,,113596,2568842,30423,2568842,30423,,,,,1648658,16656,,0 +"2020-10-08","WV",370,365,1,5,,,168,0,,59,,0,,,,,29,17325,16776,186,0,,,,,,12699,,0,604392,6365,17730,,,,,0,604392,6365 +"2020-10-08","WY",54,,1,,313,313,56,8,,,101850,904,,,198800,,,7092,6031,193,0,,,,,7224,5603,,0,206024,3321,,,,,107881,1069,206024,3321 +"2020-10-07","AK",59,59,1,,333,333,46,5,,,,0,,,480682,,6,8911,,121,0,,,,,9099,5626,,0,490074,10700,,,,,,0,490074,10700 +"2020-10-07","AL",2601,2454,21,147,17915,17915,777,216,1867,,1038526,7233,,,,1057,,161418,142292,941,0,,,,,,67948,,0,1180818,7971,,,59483,,1180818,7971,,0 +"2020-10-07","AR",1482,1337,35,145,5740,5740,519,82,,235,1012643,9202,,,1012643,715,98,88880,84914,809,0,,,,4377,,80703,,0,1097556,9885,,,,24364,,0,1097556,9885 +"2020-10-07","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-07","AZ",5733,5447,20,286,20050,20050,681,63,,147,1300948,6675,,,,,66,222538,217746,604,0,,,,,,,,0,2321782,24292,,,298414,,1518694,7267,2321782,24292 +"2020-10-07","CA",16228,,51,,,,3204,0,,797,,0,,,,,,831225,831225,2764,0,,,,,,,,0,15556706,126285,,,,,,0,15556706,126285 +"2020-10-07","CO",2085,1720,4,365,7771,7771,369,50,,,905115,8715,159485,,,,,74922,69748,731,0,12048,,,,,,1477301,17969,1477301,17969,171533,,,,974863,9414,,0 +"2020-10-07","CT",4522,3624,1,898,11699,11699,138,0,,,,0,,,1906846,,,59364,56958,123,0,,,,,73405,9408,,0,1982647,34212,,,,,,0,1982647,34212 +"2020-10-07","DC",632,,1,,,,103,0,,30,,0,,,,,16,15697,,45,0,,,,,,12350,412656,2627,412656,2627,,,,,223620,896,,0 +"2020-10-07","DE",649,569,3,80,,,89,0,,18,277623,1576,,,,,,21550,20474,84,0,,,,,24043,11071,455135,3109,455135,3109,,,,,299173,1660,,0 +"2020-10-07","FL",15084,,139,,45777,45777,2121,258,,,4737004,23551,487730,475588,6804700,,,713902,694361,2544,0,51923,,50676,,930493,,8411529,60824,8411529,60824,539844,,526404,,5445417,26074,7778257,44076 +"2020-10-07","GA",7259,,30,,29308,29308,1770,154,5439,,,0,,,,,,326142,326142,1492,0,26016,,,,305174,,,0,3058187,13395,307358,,,,,0,3058187,13395 +"2020-10-07","GU",57,,2,,,,45,0,,15,50620,422,,,,,,2868,2864,54,0,3,4,,,,1924,,0,53488,476,191,9,,,,0,53477,470 +"2020-10-07","HI",160,160,3,,889,889,115,0,,35,295153,1166,,,,,18,13124,12937,83,0,,,,,12910,10526,436498,3344,436498,3344,,,,,308090,1249,441593,3381 +"2020-10-07","IA",1415,,15,,,,444,0,,104,705173,4264,,57385,,,42,90884,90884,950,0,,,3531,3691,,73311,,0,796057,5214,,,60955,36763,797684,5266,,0 +"2020-10-07","ID",492,452,5,40,1932,1932,151,21,468,36,281109,1295,,,,,,45082,40685,660,0,,,,,,23288,,0,321794,1849,,,,,321794,1849,,0 +"2020-10-07","IL",9127,8878,42,249,,,1679,0,,372,,0,,,,,165,310380,307641,2630,0,,,,,,,,0,6033289,58820,,,,,,0,6033289,58820 +"2020-10-07","IN",3727,3500,16,227,13430,13430,1081,106,2683,333,1312690,7417,,,,,101,128227,,1281,0,,,,,130884,,,0,2293378,34767,,,,,1440917,8698,2293378,34767 +"2020-10-07","KS",723,,17,,3121,3121,352,85,849,103,485446,7048,,,,267,33,63952,,1244,0,,,,,,,,0,549398,8292,,,,,549398,8292,,0 +"2020-10-07","KY",1223,1211,5,12,5679,5679,672,57,1554,161,,0,,,,,,76587,66148,2393,0,,,,,,12800,,0,1481331,15421,58924,28287,,,,0,1481331,15421 +"2020-10-07","LA",5604,5411,12,193,,,552,0,,,2255290,21979,,,,,78,172625,170097,2156,0,,,,,,157873,,0,2427915,24135,,,,,,0,2425387,23032 +"2020-10-07","MA",9557,9342,19,215,12807,12807,515,32,,83,2212922,15625,,,,,34,136492,133868,535,0,,,,,175047,116364,,0,4478131,61703,,,121906,143436,2346790,16134,4478131,61703 +"2020-10-07","MD",3973,3829,6,144,15843,15843,391,52,,93,1555240,8217,,126269,,,,128664,128664,460,0,,,12358,,154217,7665,,0,2773280,20734,,,138627,,1683904,8677,2773280,20734 +"2020-10-07","ME",142,141,0,1,459,459,9,2,,2,,0,9964,,,,0,5604,5011,39,0,528,,,,6038,4880,,0,465660,6419,10506,,,,,0,465660,6419 +"2020-10-07","MI",7169,6847,8,322,,,687,0,,201,,0,,,3734543,,88,145092,130842,1214,0,,,,,181108,99521,,0,3915651,34681,301600,,,,,0,3915651,34681 +"2020-10-07","MN",2154,2101,14,53,8089,8089,367,69,2223,123,1404490,7494,,,,,,106651,106651,911,0,,,,,,96616,2195882,12912,2195882,12912,,,,,1511141,8405,,0 +"2020-10-07","MO",2236,,36,,,,1352,0,,,1239364,6808,74942,,1800597,,,135651,135651,1068,0,3953,3503,,,154257,,,0,1958461,11857,79027,16095,67984,11596,1375015,7876,1958461,11857 +"2020-10-07","MP",2,2,0,,4,4,,0,,,15121,0,,,,,,75,75,0,0,,,,,,29,,0,15196,0,,,,,15196,0,20709,0 +"2020-10-07","MS",3051,2794,38,257,6053,6053,571,0,,127,704655,0,,,,,62,102241,93422,1538,0,,,,,,90577,,0,806896,1538,40048,66989,,,,0,796968,0 +"2020-10-07","MT",193,,1,,820,820,235,47,,,,0,,,,,,16063,,716,0,,,,,,10518,,0,376176,3456,,,,,,0,376176,3456 +"2020-10-07","NC",3693,3661,23,32,,,1028,0,,288,,0,,,,,,222969,216943,1711,0,,,,,,,,0,3227198,16888,,5101,,,,0,3227198,16888 +"2020-10-07","ND",308,,24,,995,995,116,27,235,27,226816,1093,9639,,,,,24798,24787,490,0,485,,,,,20847,654648,6242,654648,6242,10124,49,,,251673,1586,679564,6561 +"2020-10-07","NE",507,,4,,2436,2436,262,29,,,437237,4483,,,615248,,,48757,,498,0,,,,,58518,35052,,0,675015,11417,,,,,486306,4978,675015,11417 +"2020-10-07","NH",448,,2,,745,745,18,2,236,,276594,1657,,,,,,8800,8534,69,0,,,,,,7845,,0,476514,7122,32113,,31327,,285128,1657,476514,7122 +"2020-10-07","NJ",16152,14364,5,1787,23639,23639,601,62,,134,3571960,22615,,,,,46,215677,209850,620,0,,,,,,,,0,3787637,23235,,,,,,0,3781810,23752 +"2020-10-07","NM",896,,2,,3625,3625,109,16,,,,0,,,,,,31372,,425,0,,,,,,17766,,0,965319,4385,,,,,,0,965319,4385 +"2020-10-07","NV",1636,,7,,,,495,0,,137,637162,1346,,,,,67,83347,83347,431,0,,,,,,,1074720,11026,1074720,11026,,,,,718853,1414,1093978,1066 +"2020-10-07","NY",25545,,9,,89995,89995,748,0,,176,,0,,,,,72,468268,,1360,0,,,,,,,11501629,108246,11501629,108246,,,,,,0,,0 +"2020-10-07","OH",4970,4661,23,309,16091,16091,814,119,3384,222,,0,,,,,107,162723,153281,1424,0,,,,,174116,139831,,0,3455487,27042,,,,,,0,3455487,27042 +"2020-10-07","OK",1075,,9,,6929,6929,738,113,,258,1196271,9556,,,1196271,,,94352,94352,1006,0,4185,,,,105881,80211,,0,1290623,10562,80939,,,,,0,1305146,10614 +"2020-10-07","OR",581,,9,,2680,2680,178,23,,55,678058,4095,,,1081833,,18,35340,,291,0,,,,,59844,5870,,0,1141677,8578,,,,,711633,4341,1141677,8578 +"2020-10-07","PA",8272,,28,,,,657,0,,,1967542,15550,,,,,80,166552,160772,1309,0,,,,,,134907,3261613,43137,3261613,43137,,,,,2128314,16732,,0 +"2020-10-07","PR",705,528,9,177,,,325,0,,51,305972,0,,,395291,,36,25658,25658,23,0,26110,,,,20103,22346,,0,331630,23,,,,,,0,415664,0 +"2020-10-07","RI",1126,,1,,2873,2873,107,24,,10,331574,3089,,,802615,,5,25776,,180,0,,,,,35867,,838482,10468,838482,10468,,,,,357350,3269,,0 +"2020-10-07","SC",3502,3300,31,202,9392,9392,707,61,,183,1256891,6725,65678,,1211792,,93,153705,148334,735,0,7422,11623,,,193433,75768,,0,1410596,7460,73100,60381,,,,0,1405225,7259 +"2020-10-07","SD",258,,10,,1697,1697,273,27,,,182874,6273,,,,,,25906,25433,1030,0,,,,,31319,21137,,0,297689,3169,,,,,208780,7303,297689,3169 +"2020-10-07","TN",2642,2530,21,112,9035,9035,1155,59,,319,,0,,,2810943,,151,207455,198405,2080,0,,,,,242550,188576,,0,3053493,21963,,,,,,0,3053493,21963 +"2020-10-07","TX",16230,,119,,,,3519,0,,1052,,0,,,,,,777556,777556,4121,0,38678,20019,,,847282,692123,,0,6941652,68904,422880,246334,,,,0,6941652,68904 +"2020-10-07","UT",496,,8,,4113,4113,233,55,941,87,781828,4207,,,1042333,371,,80446,,1007,0,,2507,,2371,87486,59289,,0,1129819,12188,,40491,,21669,859771,4859,1129819,12188 +"2020-10-07","VA",3303,3088,12,215,11345,11345,1003,29,,228,,0,,,,,109,153691,145462,509,0,10082,4128,,,174072,,2170313,16145,2170313,16145,144775,68577,,,,0,,0 +"2020-10-07","VI",20,,0,,,,,0,,,20273,118,,,,,,1321,,-1,0,,,,,,1286,,0,21594,117,,,,,21630,123,,0 +"2020-10-07","VT",58,58,0,,,,1,0,,,164900,558,,,,,,1832,1827,7,0,,,,,,1635,,0,307410,1320,,,,,166727,564,307410,1320 +"2020-10-07","WA",2165,2165,7,,7673,7673,355,51,,68,,0,,,,,31,93759,92284,906,0,,,,,,,1961067,9660,1961067,9660,,,,,,0,,0 +"2020-10-07","WI",1426,1415,16,11,7951,7951,873,141,1233,219,1493304,11188,,,,,,146193,138698,2463,0,,,,,,111765,2538419,27346,2538419,27346,,,,,1632002,13507,,0 +"2020-10-07","WV",369,364,5,5,,,168,0,,62,,0,,,,,28,17139,16596,203,0,,,,,,12443,,0,598027,3784,17671,,,,,0,598027,3784 +"2020-10-07","WY",53,,0,,305,305,47,1,,,100946,1034,,,195701,,,6899,5866,129,0,,,,,7002,5504,,0,202703,4195,,,,,106812,1149,202703,4195 +"2020-10-06","AK",58,58,0,,328,328,45,3,,,,0,,,470291,,6,8790,,147,0,,,,,8790,5455,,0,479374,0,,,,,,0,479374,0 +"2020-10-06","AL",2580,2436,21,144,17699,17699,764,0,1862,,1031293,4702,,,,1056,,160477,141554,764,0,,,,,,67948,,0,1172847,5334,,,59331,,1172847,5334,,0 +"2020-10-06","AR",1447,1299,0,148,5658,5658,523,72,,237,1003441,7995,,,1003441,701,99,88071,84230,641,0,,,,4228,,79052,,0,1087671,8527,,,,23346,,0,1087671,8527 +"2020-10-06","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-06","AZ",5713,5427,6,286,19987,19987,665,-2316,,138,1294273,7733,,,,,65,221934,217154,864,0,,,,,,,,0,2297490,23800,,,297900,,1511427,8554,2297490,23800 +"2020-10-06","CA",16177,,28,,,,3175,0,,809,,0,,,,,,828461,828461,1677,0,,,,,,,,0,15430421,128740,,,,,,0,15430421,128740 +"2020-10-06","CO",2081,1718,12,363,7721,7721,343,28,,,896400,7316,159182,,,,,74191,69049,654,0,12017,,,,,,1459332,15070,1459332,15070,171199,,,,965449,7916,,0 +"2020-10-06","CT",4521,3623,4,898,11699,11699,129,0,,,,0,,,1873100,,,59241,56829,121,0,,,,,72946,9408,,0,1948435,34209,,,,,,0,1948435,34209 +"2020-10-06","DC",631,,0,,,,105,0,,30,,0,,,,,15,15652,,105,0,,,,,,12350,410029,8461,410029,8461,,,,,222724,2812,,0 +"2020-10-06","DE",646,566,1,80,,,87,0,,20,276047,1575,,,,,,21466,20392,103,0,,,,,23951,10990,452026,3681,452026,3681,,,,,297513,1678,,0 +"2020-10-06","FL",14945,,59,,45519,45519,2151,237,,,4713453,18644,478794,467286,6764112,,,711358,692335,2201,0,49819,,48639,,927148,,8350705,42993,8350705,42993,528773,,516042,,5419343,20855,7734181,35706 +"2020-10-06","GA",7229,,37,,29154,29154,1779,167,5405,,,0,,,,,,324650,324650,936,0,25968,,,,304401,,,0,3044792,12035,306996,,,,,0,3044792,12035 +"2020-10-06","GU",55,,0,,,,42,0,,14,50198,586,,,,,,2814,2814,61,0,3,4,,,,1922,,0,53012,647,191,7,,,,0,53007,646 +"2020-10-06","HI",157,157,1,,889,889,128,0,,39,293987,866,,,,,29,13041,12854,50,0,,,,,12819,10470,433154,1750,433154,1750,,,,,306841,916,438212,1750 +"2020-10-06","IA",1400,,11,,,,413,0,,104,700909,2355,,57083,,,43,89934,89934,474,0,,,3515,3629,,72273,,0,790843,2829,,,60637,35866,792418,2842,,0 +"2020-10-06","ID",487,447,5,40,1911,1911,151,8,466,36,279814,1369,,,,,,44422,40131,458,0,,,,,,23115,,0,319945,1778,,,,,319945,1778,,0 +"2020-10-06","IL",9085,8836,31,249,,,1673,0,,384,,0,,,,,159,307750,305011,1617,0,,,,,,,,0,5974469,49513,,,,,,0,5974469,49513 +"2020-10-06","IN",3711,3484,30,227,13324,13324,1138,85,2658,333,1305273,6074,,,,,103,126946,,970,0,,,,,129432,,,0,2258611,31776,,,,,1432219,7044,2258611,31776 +"2020-10-06","KS",706,,0,,3036,3036,352,0,827,103,478398,0,,,,261,33,62708,,0,0,,,,,,,,0,541106,0,,,,,541106,0,,0 +"2020-10-06","KY",1218,1206,4,12,5622,5622,592,65,1545,150,,0,,,,,,74194,64350,1036,0,,,,,,12751,,0,1465910,12132,58880,27877,,,,0,1465910,12132 +"2020-10-06","LA",5592,5402,6,190,,,567,0,,,2233311,12228,,,,,71,170469,169044,532,0,,,,,,154163,,0,2403780,12760,,,,,,0,2402355,12760 +"2020-10-06","MA",9538,9323,8,215,12775,12775,494,20,,85,2197297,12331,,,,,31,135957,133359,495,0,,,,,174382,113768,,0,4416428,45378,,,121620,141849,2330656,12785,4416428,45378 +"2020-10-06","MD",3967,3823,6,144,15791,15791,360,46,,88,1547023,6497,,123287,,,,128204,128204,413,0,,,11906,,153621,7661,,0,2752546,17746,,,135193,,1675227,6910,2752546,17746 +"2020-10-06","ME",142,141,0,1,457,457,7,3,,1,,0,9952,,,,0,5565,4983,20,0,528,,,,5997,4839,,0,459241,2478,10494,,,,,0,459241,2478 +"2020-10-06","MI",7161,6838,22,323,,,678,0,,158,,0,,,3701084,,75,143878,129826,1152,0,,,,,179886,99521,,0,3880970,25864,300923,,,,,0,3880970,25864 +"2020-10-06","MN",2140,2087,4,53,8020,8020,367,80,2212,123,1396996,7618,,,,,,105740,105740,941,0,,,,,,95614,2182970,13184,2182970,13184,,,,,1502736,8559,,0 +"2020-10-06","MO",2200,,26,,,,1249,0,,,1232556,7306,74665,,1789896,,,134583,134583,1165,0,3912,3369,,,153132,,,0,1946604,16518,78709,15458,67764,11216,1367139,8471,1946604,16518 +"2020-10-06","MP",2,2,0,,4,4,,0,,,15121,0,,,,,,75,75,0,0,,,,,,29,,0,15196,0,,,,,15196,0,20709,0 +"2020-10-06","MS",3013,2765,0,248,6053,6053,554,0,,128,704655,0,,,,,64,100703,92313,0,0,,,,,,90577,,0,805358,0,40048,66989,,,,0,796968,0 +"2020-10-06","MT",192,,2,,773,773,216,19,,,,0,,,,,,15347,,500,0,,,,,,10172,,0,372720,2745,,,,,,0,372720,2745 +"2020-10-06","NC",3670,3639,33,31,,,1013,0,,290,,0,,,,,,221258,215477,1504,0,,,,,,,,0,3210310,17794,,4508,,,,0,3210310,17794 +"2020-10-06","ND",284,,4,,968,968,116,29,233,27,225723,933,9487,,,,,24308,24297,502,0,471,,,,,20392,648406,5737,648406,5737,9958,49,,,250087,1435,673003,6072 +"2020-10-06","NE",503,,2,,2407,2407,271,10,,,432754,3609,,,604432,,,48259,,452,0,,,,,57938,34830,,0,663598,8067,,,,,481328,4062,663598,8067 +"2020-10-06","NH",446,,2,,743,743,20,0,236,,274937,750,,,,,,8731,8534,51,0,,,,,,7785,,0,469392,3514,32059,,31302,,283471,812,469392,3514 +"2020-10-06","NJ",16147,14360,9,1787,23577,23577,553,0,,126,3549345,0,,,,,43,215057,209342,720,0,,,,,,,,0,3764402,720,,,,,,0,3758058,0 +"2020-10-06","NM",894,,0,,3609,3609,110,28,,,,0,,,,,,30947,,315,0,,,,,,17489,,0,960934,6338,,,,,,0,960934,6338 +"2020-10-06","NV",1629,,6,,,,485,0,,125,635816,1689,,,,,69,82916,82916,479,0,,,,,,,1063694,7635,1063694,7635,,,,,717439,1983,1092912,3855 +"2020-10-06","NY",25536,,9,,89995,89995,705,0,,158,,0,,,,,72,466908,,1393,0,,,,,,,11393383,96359,11393383,96359,,,,,,0,,0 +"2020-10-06","OH",4947,4638,16,309,15972,15972,777,132,3367,207,,0,,,,,103,161299,151983,1335,0,,,,,173121,138807,,0,3428445,33046,,,,,,0,3428445,33046 +"2020-10-06","OK",1066,,11,,6816,6816,699,142,,228,1186715,29641,,,1186715,,,93346,93346,1364,0,4185,,,,104865,79219,,0,1280061,31005,80939,,,,,0,1294532,32219 +"2020-10-06","OR",572,,0,,2657,2657,184,39,,43,673963,3297,,,1073541,,18,35049,,279,0,,,,,59558,5826,,0,1133099,5690,,,,,707292,11676,1133099,5690 +"2020-10-06","PA",8244,,17,,,,633,0,,,1951992,11040,,,,,74,165243,159590,1036,0,,,,,,135499,3218476,26056,3218476,26056,,,,,2111582,11967,,0 +"2020-10-06","PR",696,519,1,177,,,322,0,,61,305972,0,,,395291,,33,25635,25635,238,0,26102,,,,20103,,,0,331607,238,,,,,,0,415664,0 +"2020-10-06","RI",1125,,4,,2849,2849,93,14,,8,328485,2643,,,792349,,4,25596,,177,0,,,,,35665,,828014,7709,828014,7709,,,,,354081,2820,,0 +"2020-10-06","SC",3471,3275,15,196,9331,9331,655,48,,167,1250166,13219,65534,,1205239,,87,152970,147800,811,0,7359,11303,,,192727,74949,,0,1403136,14030,72893,58125,,,,0,1397966,13903 +"2020-10-06","SD",248,,0,,1670,1670,250,28,,,176601,756,,,,,,24876,,278,0,,,,,30918,20449,,0,294520,1902,,,,,201477,1034,294520,1902 +"2020-10-06","TN",2621,2511,24,110,8976,8976,1115,53,,302,,0,,,2790974,,143,205375,196623,1676,0,,,,,240556,187026,,0,3031530,25345,,,,,,0,3031530,25345 +"2020-10-06","TX",16111,,78,,,,3394,0,,1080,,0,,,,,,773435,773435,4132,0,38448,19665,,,843046,687277,,0,6872748,69861,421087,238557,,,,0,6872748,69861 +"2020-10-06","UT",488,,6,,4058,4058,245,39,937,79,777621,1932,,,1031373,370,,79439,,716,0,,2371,,2242,86258,58534,,0,1117631,10769,,38427,,20689,854912,2250,1117631,10769 +"2020-10-06","VA",3291,3077,15,214,11316,11316,926,57,,219,,0,,,,,104,153182,144987,625,0,10052,3982,,,173202,,2154168,14177,2154168,14177,144482,62702,,,,0,,0 +"2020-10-06","VI",20,,0,,,,,0,,,20155,0,,,,,,1322,,0,0,,,,,,1283,,0,21477,0,,,,,21507,0,,0 +"2020-10-06","VT",58,58,0,,,,1,0,,,164342,481,,,,,,1825,1821,4,0,,,,,,1632,,0,306090,902,,,,,166163,485,306090,902 +"2020-10-06","WA",2158,2158,16,,7622,7622,347,-6,,64,,0,,,,,31,92853,91424,252,0,,,,,,,1951407,15508,1951407,15508,,,,,,0,,0 +"2020-10-06","WI",1410,1399,18,11,7810,7810,853,108,1225,261,1482116,9539,,,,,,143730,136379,2075,0,,,,,,110110,2511073,23124,2511073,23124,,,,,1618495,11559,,0 +"2020-10-06","WV",364,359,3,5,,,168,0,,65,,0,,,,,35,16936,16423,194,0,,,,,,12242,,0,594243,3148,17644,,,,,0,594243,3148 +"2020-10-06","WY",53,,0,,304,304,44,10,,,99912,379,,,191790,,,6770,5751,141,0,,,,,6718,5418,,0,198508,5935,,,,,105663,470,198508,5935 +"2020-10-05","AK",58,58,0,,325,325,45,1,,,,0,,,470291,,6,8643,,196,0,,,,,8790,5455,,0,479374,2556,,,,,,0,479374,2556 +"2020-10-05","AL",2559,2417,1,142,17699,17699,791,279,1847,,1026591,4518,,,,1047,,159713,140922,544,0,,,,,,67948,,0,1167513,4995,,,59283,,1167513,4995,,0 +"2020-10-05","AR",1447,1299,22,148,5586,5586,516,36,,233,995446,6409,,,995446,696,93,87430,83698,417,0,,,,4109,,79052,,0,1079144,6801,,,,22028,,0,1079144,6801 +"2020-10-05","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-05","AZ",5707,5423,1,284,22303,22303,567,9,,134,1286540,6436,,,,,57,221070,216333,316,0,,,,,,,,0,2273690,7473,,,297329,,1502873,6742,2273690,7473 +"2020-10-05","CA",16149,,29,,,,3146,0,,805,,0,,,,,,826784,826784,3055,0,,,,,,,,0,15301681,141394,,,,,,0,15301681,141394 +"2020-10-05","CO",2069,1707,1,362,7693,7693,325,20,,,889084,6341,158899,,,,,73537,68449,461,0,11998,,,,,,1444262,13722,1444262,13722,170897,,,,957533,6774,,0 +"2020-10-05","CT",4517,3619,4,898,11699,11699,129,0,,,,0,,,1839324,,,59120,56707,823,0,,,,,72526,9408,,0,1914226,7799,,,,,,0,1914226,7799 +"2020-10-05","DC",631,,0,,,,95,0,,28,,0,,,,,12,15547,,28,0,,,,,,12306,401568,1743,401568,1743,,,,,219912,523,,0 +"2020-10-05","DE",645,565,0,80,,,81,0,,20,274472,1626,,,,,,21363,20287,120,0,,,,,23850,10880,448345,5425,448345,5425,,,,,295835,1746,,0 +"2020-10-05","FL",14886,,41,,45282,45282,2118,67,,,4694809,14394,478794,467286,6731612,,,709157,690604,1406,0,49819,,48639,,924053,,8307712,35365,8307712,35365,528773,,516042,,5398488,36162,7698475,29364 +"2020-10-05","GA",7192,,30,,28987,28987,1822,29,5370,,,0,,,,,,323714,323714,789,0,25963,,,,303602,,,0,3032757,14139,306927,,,,,0,3032757,14139 +"2020-10-05","GU",55,,3,,,,33,0,,13,49612,555,,,,,,2753,2751,54,0,3,2,,,,1895,,0,52365,609,189,2,,,,0,52361,1247 +"2020-10-05","HI",156,156,3,,889,889,128,4,,39,293121,1893,,,,,29,12991,12804,70,0,,,,,12770,10446,431404,3561,431404,3561,,,,,305925,1963,436462,3751 +"2020-10-05","IA",1389,,7,,,,389,0,,99,698554,2083,,56852,,,43,89460,89460,364,0,,,3497,3526,,71920,,0,788014,2447,,,60388,34953,789576,2449,,0 +"2020-10-05","ID",482,442,2,40,1903,1903,152,3,466,49,278445,1569,,,,,,43964,39722,262,0,,,,,,22930,,0,318167,1797,,,,,318167,1797,,0 +"2020-10-05","IL",9054,8805,14,249,,,1631,0,,382,,0,,,,,155,306133,303394,1853,0,,,,,,,,0,5924956,38538,,,,,,0,5924956,38538 +"2020-10-05","IN",3681,3454,7,227,13239,13239,1019,91,2640,308,1299199,6282,,,,,103,125976,,830,0,,,,,127617,,,0,2226835,6242,,,,,1425175,7112,2226835,6242 +"2020-10-05","KS",706,,8,,3036,3036,352,53,827,103,478398,8392,,,,261,33,62708,,1597,0,,,,,,,,0,541106,9989,,,,,541106,9989,,0 +"2020-10-05","KY",1214,1202,5,12,5557,5557,563,195,1540,145,,0,,,,,,73158,63658,541,0,,,,,,12445,,0,1453778,19254,58800,27129,,,,0,1453778,19254 +"2020-10-05","LA",5586,5396,9,190,,,547,0,,,2221083,7132,,,,,71,169937,168512,218,0,,,,,,154163,,0,2391020,7350,,,,,,0,2389595,7350 +"2020-10-05","MA",9530,9315,20,215,12755,12755,473,6,,88,2184966,10800,,,,,33,135462,132905,515,0,,,,,173830,113768,,0,4371050,36549,,,121464,139854,2317871,11265,4371050,36549 +"2020-10-05","MD",3961,3817,3,144,15745,15745,338,40,,85,1540526,7969,,123287,,,,127791,127791,501,0,,,11906,,153142,7657,,0,2734800,19570,,,135193,,1668317,8470,2734800,19570 +"2020-10-05","ME",142,141,0,1,454,454,10,0,,1,,0,9945,,,,1,5545,4963,26,0,528,,,,5984,4807,,0,456763,4236,10487,,,,,0,456763,4236 +"2020-10-05","MI",7139,6816,15,323,,,678,0,,158,,0,,,3676101,,67,142726,128923,1455,0,,,,,179005,99521,,0,3855106,55071,299146,,,,,0,3855106,55071 +"2020-10-05","MN",2136,2083,3,53,7940,7940,367,53,2189,123,1389378,12985,,,,,,104799,104799,973,0,,,,,,94416,2169786,23375,2169786,23375,,,,,1494177,13958,,0 +"2020-10-05","MO",2174,,1,,,,1201,0,,,1225250,6936,74599,,1774689,,,133418,133418,987,0,3893,3311,,,151860,,,0,1930086,13339,78620,15027,67695,10968,1358668,7923,1930086,13339 +"2020-10-05","MP",2,2,0,,4,4,,0,,,15121,9,,,,,,75,75,2,0,,,,,,29,,0,15196,11,,,,,15196,14,20709,290 +"2020-10-05","MS",3013,2765,0,248,6053,6053,554,78,,128,704655,65812,,,,,64,100703,92313,215,0,,,,,,90577,,0,805358,66027,40048,66989,,,,0,796968,68449 +"2020-10-05","MT",190,,3,,754,754,201,10,,,,0,,,,,,14847,,212,0,,,,,,9649,,0,369975,12562,,,,,,0,369975,12562 +"2020-10-05","NC",3637,3606,3,31,,,971,0,,274,,0,,,,,,219754,214209,2258,0,,,,,,,,0,3192516,26698,,4175,,,,0,3192516,26698 +"2020-10-05","ND",280,,3,,939,939,112,14,226,24,224790,748,9487,,,,,23806,23795,311,0,471,,,,,19892,642669,4349,642669,4349,9958,49,,,248652,1060,666931,4647 +"2020-10-05","NE",501,,4,,2397,2397,249,9,,,429145,3195,,,596884,,,47807,,404,0,,,,,57437,34613,,0,655531,5663,,,,,477266,3600,655531,5663 +"2020-10-05","NH",444,,1,,743,743,22,0,236,,274187,3066,,,,,,8680,8472,35,0,,,,,,7746,,0,465878,0,32043,,31281,,282659,3095,465878,0 +"2020-10-05","NJ",16138,14351,2,1787,23577,23577,507,17,,102,3549345,23453,,,,,34,214337,208713,579,0,,,,,,,,0,3763682,24032,,,,,,0,3758058,23964 +"2020-10-05","NM",894,,2,,3581,3581,97,20,,,,0,,,,,,30632,,155,0,,,,,,17330,,0,954596,6651,,,,,,0,954596,6651 +"2020-10-05","NV",1623,,0,,,,441,0,,114,634127,2838,,,,,64,82437,82437,337,0,,,,,,,1056059,2385,1056059,2385,,,,,715456,3252,1089057,6736 +"2020-10-05","NY",25527,,8,,89995,89995,636,0,,149,,0,,,,,70,465515,,933,0,,,,,,,11297024,76404,11297024,76404,,,,,,0,,0 +"2020-10-05","OH",4931,4622,6,309,15840,15840,657,73,3331,189,,0,,,,,90,159964,150761,1057,0,,,,,172123,137633,,0,3395399,35071,,,,,,0,3395399,35071 +"2020-10-05","OK",1055,,3,,6674,6674,655,104,,228,1157074,0,,,1157074,,,91982,91982,665,0,4185,,,,102465,78155,,0,1249056,665,80939,,,,,0,1262313,0 +"2020-10-05","OR",572,,1,,2618,2618,176,0,,48,670666,3274,,,1068089,,17,34770,,259,0,,,,,59320,5752,,0,1127409,6793,,,,,695616,0,1127409,6793 +"2020-10-05","PA",8227,,11,,,,594,0,,,1940952,9317,,,,,75,164207,158663,672,0,,,,,,134649,3192420,20902,3192420,20902,,,,,2099615,9979,,0 +"2020-10-05","PR",695,518,9,177,,,321,0,,56,305972,0,,,395291,,41,25397,25397,363,0,25908,,,,20103,,,0,331369,363,,,,,,0,415664,0 +"2020-10-05","RI",1121,,1,,2835,2835,92,0,,7,325842,641,,,784802,,4,25419,,50,0,,,,,35503,,820305,1553,820305,1553,,,,,351261,691,,0 +"2020-10-05","SC",3456,3258,3,198,9283,9283,593,24,,150,1236947,10443,65332,,1192640,,72,152159,147116,577,0,7320,11062,,,191423,74272,,0,1389106,11020,72652,55266,,,,0,1384063,10983 +"2020-10-05","SD",248,,0,,1642,1642,241,10,,,175845,488,,,,,,24598,,180,0,,,,,30682,20076,,0,292618,2734,,,,,200443,668,292618,2734 +"2020-10-05","TN",2597,2489,20,108,8923,8923,975,40,,269,,0,,,2767483,,122,203699,195220,2489,0,,,,,238702,185221,,0,3006185,44101,,,,,,0,3006185,44101 +"2020-10-05","TX",16033,,8,,,,3318,0,,1107,,0,,,,,,769303,769303,3409,0,38354,19234,,,838058,683700,,0,6802887,20124,420372,229474,,,,0,6802887,20124 +"2020-10-05","UT",482,,4,,4019,4019,222,39,928,74,775689,3477,,,1021751,366,,78723,,1105,0,,2330,,2202,85111,57965,,0,1106862,7533,,37827,,20437,852662,3904,1106862,7533 +"2020-10-05","VA",3276,3063,3,213,11259,11259,925,38,,213,,0,,,,,101,152557,144439,687,0,10036,3808,,,172487,,2139991,26113,2139991,26113,144360,57839,,,,0,,0 +"2020-10-05","VI",20,,0,,,,,0,,,20155,243,,,,,,1322,,-5,0,,,,,,1283,,0,21477,238,,,,,21507,238,,0 +"2020-10-05","VT",58,58,0,,,,1,0,,,163861,892,,,,,,1821,1817,33,0,,,,,,1625,,0,305188,4538,,,,,165678,925,305188,4538 +"2020-10-05","WA",2142,2142,0,,7628,7628,367,17,,78,,0,,,,,29,92601,91178,403,0,,,,,,,1935899,12943,1935899,12943,,,,,,0,,0 +"2020-10-05","WI",1392,1381,4,11,7702,7702,782,56,1212,209,1472577,6864,,,,,,141655,134359,1727,0,,,,,,108371,2487949,21775,2487949,21775,,,,,1606936,8560,,0 +"2020-10-05","WV",361,353,3,5,,,165,0,,60,,0,,,,,28,16742,16251,114,0,,,,,,12051,,0,591095,6440,17545,,,,,0,591095,6440 +"2020-10-05","WY",53,,0,,294,294,36,12,,,99533,2469,,,186140,,,6629,5660,125,0,,,,,6433,5272,,0,192573,6539,,,,,105193,2840,192573,6539 +"2020-10-04","AK",58,58,0,,324,324,51,2,,,,0,,,467883,,6,8447,,141,0,,,,,8642,5281,,0,476818,3562,,,,,,0,476818,3562 +"2020-10-04","AL",2558,2416,0,142,17420,17420,757,0,1845,,1022073,5754,,,,1046,,159169,140445,789,0,,,,,,67948,,0,1162518,6473,,,59243,,1162518,6473,,0 +"2020-10-04","AR",1425,1278,18,147,5550,5550,499,23,,228,989037,7150,,,989037,691,88,87013,83306,488,0,,,,4083,,78358,,0,1072343,7605,,,,21860,,0,1072343,7605 +"2020-10-04","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-04","AZ",5706,5422,1,284,22294,22294,545,14,,133,1280104,7647,,,,,59,220754,216027,355,0,,,,,,,,0,2266217,10587,,,296568,,1496131,7986,2266217,10587 +"2020-10-04","CA",16120,,46,,,,3129,0,,787,,0,,,,,,823729,823729,4293,0,,,,,,,,0,15160287,161399,,,,,,0,15160287,161399 +"2020-10-04","CO",2068,1706,8,362,7673,7673,303,7,,,882743,7903,158572,,,,,73076,68016,521,0,11967,,,,,,1430540,16204,1430540,16204,170539,,,,950759,8420,,0 +"2020-10-04","CT",4513,3614,0,899,11699,11699,110,0,,,,0,,,1831677,,,58297,55862,0,0,,,,,72382,9408,,0,1906427,9772,,,,,,0,1906427,9772 +"2020-10-04","DC",631,,2,,,,95,0,,29,,0,,,,,15,15519,,46,0,,,,,,12299,399825,2276,399825,2276,,,,,219389,756,,0 +"2020-10-04","DE",645,565,0,80,,,82,0,,20,272846,1513,,,,,,21243,20167,118,0,,,,,23695,10806,442920,4602,442920,4602,,,,,294089,1631,,0 +"2020-10-04","FL",14845,,42,,45215,45215,2040,64,,,4680415,18547,478794,467286,6704124,,,707751,689253,1786,0,49819,,48639,,922273,,8272347,49430,8272347,49430,528773,,516042,,5362326,-190,7669111,33650 +"2020-10-04","GA",7162,,28,,28958,28958,1764,34,5363,,,0,,,,,,322925,322925,847,0,25887,,,,302744,,,0,3018618,17237,306554,,,,,0,3018618,17237 +"2020-10-04","GU",52,,1,,,,29,0,,12,49057,0,,,,,,2699,2697,0,0,3,2,,,,1887,,0,51756,0,184,2,,,,0,51114,0 +"2020-10-04","HI",153,153,11,,885,885,128,5,,39,291228,1803,,,,,29,12921,12734,133,0,,,,,12696,10415,427843,4982,427843,4982,,,,,303962,1936,432711,4965 +"2020-10-04","IA",1382,,5,,,,392,0,,104,696471,3632,,56820,,,39,89096,89096,626,0,,,3488,3502,,71600,,0,785567,4258,,,60347,34814,787127,4271,,0 +"2020-10-04","ID",480,440,6,40,1900,1900,152,7,465,49,276876,1571,,,,,,43702,39494,464,0,,,,,,22744,,0,316370,1928,,,,,316370,1928,,0 +"2020-10-04","IL",9040,8791,17,249,,,1521,0,,384,,0,,,,,140,304280,301541,1453,0,,,,,,,,0,5886418,51656,,,,,,0,5886418,51656 +"2020-10-04","IN",3674,3447,5,227,13148,13148,950,80,2618,279,1292917,8501,,,,,102,125146,,1087,0,,,,,127140,,,0,2220593,8383,,,,,1418063,9588,2220593,8383 +"2020-10-04","KS",698,,0,,2983,2983,352,0,817,103,470006,0,,,,259,33,61111,,0,0,,,,,,,,0,531117,0,,,,,531117,0,,0 +"2020-10-04","KY",1209,1197,4,12,5362,5362,600,0,1538,129,,0,,,,,,72617,63189,616,0,,,,,,12121,,0,1434524,0,58712,27000,,,,0,1434524,0 +"2020-10-04","LA",5577,5387,32,190,,,518,0,,,2213951,25328,,,,,68,169719,168294,893,0,,,,,,154163,,0,2383670,26221,,,,,,0,2382245,26221 +"2020-10-04","MA",9510,9295,3,215,12749,12749,438,4,,83,2174166,18355,,,,,27,134947,132440,644,0,,,,,173288,113768,,0,4334501,68715,,,121397,138291,2306606,18981,4334501,68715 +"2020-10-04","MD",3958,3814,1,144,15705,15705,320,35,,77,1532557,9651,,123287,,,,127290,127290,471,0,,,11906,,152548,7653,,0,2715230,26364,,,135193,,1659847,10122,2715230,26364 +"2020-10-04","ME",142,141,0,1,454,454,11,0,,2,,0,9906,,,,1,5519,4944,33,0,525,,,,5960,4782,,0,452527,7934,10445,,,,,0,452527,7934 +"2020-10-04","MI",7124,6801,0,323,,,678,0,,158,,0,,,3623003,,62,141271,127516,0,0,,,,,177032,99521,,0,3800035,0,297983,,,,,0,3800035,0 +"2020-10-04","MN",2133,2080,7,53,7887,7887,,41,2177,,1376393,16648,,,,,,103826,103826,1039,0,,,,,,93148,2146411,30373,2146411,30373,,,,,1480219,17687,,0 +"2020-10-04","MO",2173,,4,,,,1135,0,,,1218314,9863,74499,,1762433,,,132431,132431,1326,0,3879,3311,,,150807,,,0,1916747,18569,78506,14987,67615,10942,1350745,11189,1916747,18569 +"2020-10-04","MP",2,2,0,,4,4,,0,,,15112,0,,,,,,73,73,0,0,,,,,,29,,0,15185,0,,,,,15182,0,20419,0 +"2020-10-04","MS",3013,2765,2,248,5975,5975,515,0,,132,638843,0,,,,,69,100488,92154,321,0,,,,,,89737,,0,739331,321,38720,55946,,,,0,728519,0 +"2020-10-04","MT",187,,1,,744,744,191,3,,,,0,,,,,,14635,,279,0,,,,,,9597,,0,357413,2630,,,,,,0,357413,2630 +"2020-10-04","NC",3634,3603,5,31,,,907,0,,266,,0,,,,,,217496,211961,610,0,,,,,,,,0,3165818,31889,,3996,,,,0,3165818,31889 +"2020-10-04","ND",277,,3,,925,925,100,13,222,21,224042,1170,9487,,,,,23495,23484,411,0,470,,,,,19497,638320,6021,638320,6021,9957,49,,,247592,1586,662284,6310 +"2020-10-04","NE",497,,4,,2388,2388,249,9,,,425950,2959,,,591688,,,47403,,426,0,,,,,56981,34395,,0,649868,5236,,,,,473666,3385,649868,5236 +"2020-10-04","NH",443,,1,,743,743,23,0,236,,271121,0,,,,,,8645,8472,48,0,,,,,,7710,,0,465878,4829,32043,,31231,,279564,0,465878,4829 +"2020-10-04","NJ",16136,14349,1,1787,23560,23560,480,49,,107,3525892,60394,,,,,32,213758,208202,701,0,,,,,,,,0,3739650,61095,,,,,,0,3734094,61967 +"2020-10-04","NM",892,,2,,3561,3561,91,12,,,,0,,,,,,30477,,181,0,,,,,,17270,,0,947945,6433,,,,,,0,947945,6433 +"2020-10-04","NV",1623,,3,,,,442,0,,140,631289,2787,,,,,68,82100,82100,392,0,,,,,,,1053674,4767,1053674,4767,,,,,712204,3212,1082321,6505 +"2020-10-04","NY",25519,,14,,89995,89995,618,0,,138,,0,,,,,67,464582,,1222,0,,,,,,,11220620,110329,11220620,110329,,,,,,0,,0 +"2020-10-04","OH",4925,4617,0,308,15767,15767,694,32,3320,216,,0,,,,,102,158907,149762,941,0,,,,,171023,137038,,0,3360328,42134,,,,,,0,3360328,42134 +"2020-10-04","OK",1052,,1,,6570,6570,655,0,,228,1157074,0,,,1157074,,,91317,91317,569,0,4185,,,,102465,77606,,0,1248391,569,80939,,,,,0,1262313,0 +"2020-10-04","OR",571,,8,,2618,2618,176,0,,48,667392,4262,,,1061560,,17,34511,,348,0,,,,,59056,5752,,0,1120616,9903,,,,,695616,0,1120616,9903 +"2020-10-04","PA",8216,,17,,,,603,0,,,1931635,26664,,,,,70,163535,158001,2251,0,,,,,,134098,3171518,24723,3171518,24723,,,,,2089636,28759,,0 +"2020-10-04","PR",686,510,5,176,,,319,0,,49,305972,0,,,395291,,41,25034,25034,230,0,25641,,,,20103,,,0,331006,230,,,,,,0,415664,0 +"2020-10-04","RI",1120,,1,,2835,2835,92,7,,7,325201,1833,,,783311,,4,25369,,124,0,,,,,35441,,818752,8801,818752,8801,,,,,350570,1957,,0 +"2020-10-04","SC",3453,3255,11,198,9259,9259,599,43,,153,1226504,37637,65190,,1182339,,72,151582,146576,691,0,7285,10995,,,190741,73973,,0,1378086,38328,72475,54631,,,,0,1373080,39847 +"2020-10-04","SD",248,,0,,1632,1632,232,17,,,175357,1324,,,,,,24418,,432,0,,,,,30367,19902,,0,289884,4061,,,,,199775,1756,289884,4061 +"2020-10-04","TN",2577,2469,17,108,8883,8883,900,24,,258,,0,,,2726142,,120,201210,192906,1615,0,,,,,235942,184404,,0,2962084,33275,,,,,,0,2962084,33275 +"2020-10-04","TX",16025,,33,,,,3192,0,,1071,,0,,,,,,765894,765894,2884,0,38164,19048,,,836145,680083,,0,6782763,27608,419197,227559,,,,0,6782763,27608 +"2020-10-04","UT",478,,2,,3980,3980,220,24,923,69,772212,5553,,,1014910,366,,77618,,1393,0,,2271,,2148,84419,57392,,0,1099329,9595,,34150,,18335,848758,6463,1099329,9595 +"2020-10-04","VA",3273,3060,3,213,11221,11221,877,30,,197,,0,,,,,98,151870,143883,1067,0,9993,3737,,,171249,,2113878,0,2113878,0,144083,57112,,,,0,,0 +"2020-10-04","VI",20,,0,,,,,0,,,19912,227,,,,,,1327,,1,0,,,,,,1265,,0,21239,228,,,,,21269,246,,0 +"2020-10-04","VT",58,58,0,,,,0,0,,,162969,609,,,,,,1788,1784,6,0,,,,,,1622,,0,300650,4139,,,,,164753,615,300650,4139 +"2020-10-04","WA",2142,2142,-1,,7611,7611,370,25,,82,,0,,,,,26,92198,90786,628,0,,,,,,,1922956,17197,1922956,17197,,,,,,0,,0 +"2020-10-04","WI",1388,1377,5,11,7646,7646,714,58,1205,194,1465713,8950,,,,,,139928,132663,1926,0,,,,,,107004,2466174,25865,2466174,25865,,,,,1598376,10815,,0 +"2020-10-04","WV",358,353,1,5,,,173,0,,64,,0,,,,,30,16628,16132,160,0,,,,,,11982,,0,584655,7340,17515,,,,,0,584655,7340 +"2020-10-04","WY",53,,0,,282,282,32,1,,,97064,0,,,179935,,,6504,5546,139,0,,,,,6099,5160,,0,186034,672,,,,,102353,0,186034,672 +"2020-10-03","AK",58,58,1,,322,322,39,2,,,,0,,,464517,,5,8306,,139,0,,,,,8446,5199,,0,473256,3966,,,,,,0,473256,3966 +"2020-10-03","AL",2558,2416,8,142,17420,17420,738,0,1843,,1016319,9707,,,,1045,,158380,139726,1682,0,,,,,,67948,,0,1156045,10444,,,59075,,1156045,10444,,0 +"2020-10-03","AR",1407,1260,16,147,5527,5527,474,39,,223,981887,9936,,,981887,688,95,86525,82851,746,0,,,,4045,,77772,,0,1064738,10478,,,,12997,,0,1064738,10478 +"2020-10-03","AS",0,,0,,,,,0,,,1616,0,,,,,,0,0,0,0,,,,,,,,0,1616,0,,,,,,0,1616,0 +"2020-10-03","AZ",5705,5421,12,284,22280,22280,605,40,,127,1272457,9040,,,,,52,220399,215688,636,0,,,,,,,,0,2255630,19466,,,295840,,1488145,9641,2255630,19466 +"2020-10-03","CA",16074,,88,,,,3079,0,,787,,0,,,,,,819436,819436,2159,0,,,,,,,,0,14998888,130457,,,,,,0,14998888,130457 +"2020-10-03","CO",2060,1698,3,362,7666,7666,296,13,,,874840,8817,158144,,,,,72555,67499,657,0,11926,,,,,,1414336,17990,1414336,17990,170070,,,,942339,9425,,0 +"2020-10-03","CT",4513,3614,0,899,11699,11699,110,0,,,,0,,,1822097,,,58297,55862,0,0,,,,,72193,9408,,0,1896655,23364,,,,,,0,1896655,23364 +"2020-10-03","DC",629,,0,,,,86,0,,27,,0,,,,,13,15473,,50,0,,,,,,12252,397549,3431,397549,3431,,,,,218633,1149,,0 +"2020-10-03","DE",645,565,3,80,,,83,0,,21,271333,1987,,,,,,21125,20018,188,0,,,,,23585,10748,438318,4767,438318,4767,,,,,292458,2175,,0 +"2020-10-03","FL",14803,,73,,45151,45151,2037,160,,,4661868,22151,478794,467286,6673069,,,705965,687700,2753,0,49819,,48639,,919782,,8222917,58250,8222917,58250,528773,,516042,,5362516,50710,7635461,42378 +"2020-10-03","GA",7134,,28,,28924,28924,1793,133,5354,,,0,,,,,,322078,322078,1444,0,25737,,,,301856,,,0,3001381,31368,305671,,,,,0,3001381,31368 +"2020-10-03","GU",51,,1,,,,29,0,,12,49057,556,,,,,,2699,2697,82,0,3,2,,,,1887,,0,51756,638,184,2,,,,0,51114,0 +"2020-10-03","HI",142,142,3,,880,880,125,18,,40,289425,1660,,,,,27,12788,12601,94,0,,,,,12567,10389,422861,3665,422861,3665,,,,,302026,1746,427746,3504 +"2020-10-03","IA",1377,,5,,,,402,0,,100,692839,4406,,56603,,,38,88470,88470,911,0,,,3483,3493,,71319,,0,781309,5317,,,60125,34763,782856,5327,,0 +"2020-10-03","ID",474,435,2,39,1893,1893,152,20,462,49,275305,2552,,,,,,43238,39137,677,0,,,,,,22568,,0,314442,3105,,,,,314442,3105,,0 +"2020-10-03","IL",9023,8774,31,249,,,1535,0,,361,,0,,,,,140,302827,300088,2442,0,,,,,,,,0,5834762,71634,,,,,,0,5834762,71634 +"2020-10-03","IN",3669,3442,13,227,13068,13068,911,85,2605,281,1284416,8534,,,,,104,124059,,1419,0,,,,,126662,,,0,2212210,25729,,,,,1408475,9953,2212210,25729 +"2020-10-03","KS",698,,0,,2983,2983,352,0,817,103,470006,0,,,,259,33,61111,,0,0,,,,,,,,0,531117,0,,,,,531117,0,,0 +"2020-10-03","KY",1205,1193,8,12,5362,5362,600,28,1538,129,,0,,,,,,72001,62669,1274,0,,,,,,12121,,0,1434524,12004,58712,27000,,,,0,1434524,12004 +"2020-10-03","LA",5545,5355,0,190,,,536,0,,,2188623,0,,,,,74,168826,167401,0,0,,,,,,154163,,0,2357449,0,,,,,,0,2356024,0 +"2020-10-03","MA",9507,9292,17,215,12745,12745,416,12,,75,2155811,13213,,,,,27,134303,131814,672,0,,,,,172557,113768,,0,4265786,65768,,,121078,136823,2287625,13813,4265786,65768 +"2020-10-03","MD",3957,3813,7,144,15670,15670,323,96,,78,1522906,9343,,123287,,,,126819,126819,597,0,,,11906,,151997,7652,,0,2688866,28066,,,135193,,1649725,9940,2688866,28066 +"2020-10-03","ME",142,141,0,1,454,454,11,2,,2,,0,9906,,,,1,5486,4920,18,0,525,,,,5932,4763,,0,444593,5025,10445,,,,,0,444593,5025 +"2020-10-03","MI",7124,6801,14,323,,,678,0,,158,,0,,,3623003,,62,141271,127516,1275,0,,,,,177032,99521,,0,3800035,40437,297983,,,,,0,3800035,40437 +"2020-10-03","MN",2126,2073,14,53,7846,7846,,53,2170,,1359745,14061,,,,,,102787,102787,1421,0,,,,,,91844,2116038,29075,2116038,29075,,,,,1462532,15482,,0 +"2020-10-03","MO",2169,,25,,,,1144,0,,,1208451,11659,74311,,1745338,,,131105,131105,1708,0,3843,3268,,,149342,,,0,1898178,22500,78281,14859,67449,10864,1339556,13367,1898178,22500 +"2020-10-03","MP",2,2,0,,4,4,,0,,,15112,0,,,,,,73,73,0,0,,,,,,29,,0,15185,0,,,,,15182,0,20419,0 +"2020-10-03","MS",3011,2763,12,248,5975,5975,515,0,,132,638843,0,,,,,69,100167,91952,609,0,,,,,,89737,,0,739010,609,38720,55946,,,,0,728519,0 +"2020-10-03","MT",186,,0,,741,741,189,12,,,,0,,,,,,14356,,501,0,,,,,,9601,,0,354783,1421,,,,,,0,354783,1421 +"2020-10-03","NC",3629,3600,21,29,,,921,0,,273,,0,,,,,,216886,211403,2202,0,,,,,,,,0,3133929,35426,,3527,,,,0,3133929,35426 +"2020-10-03","ND",274,,7,,912,912,100,10,220,22,222872,1254,9287,,,,,23084,23073,443,0,444,,,,,19079,632299,5849,632299,5849,9731,49,,,246006,1694,655974,6089 +"2020-10-03","NE",493,,0,,2379,2379,232,23,,,422991,4912,,,586964,,,46977,,792,0,,,,,56474,34090,,0,644632,9945,,,,,470281,5705,644632,9945 +"2020-10-03","NH",442,,0,,743,743,17,0,235,,271121,1647,,,,,,8597,8443,63,0,,,,,,7655,,0,461049,5180,32000,,31231,,279564,1695,461049,5180 +"2020-10-03","NJ",16135,14348,4,1787,23511,23511,485,0,,88,3465498,0,,,,,31,213057,207576,1045,0,,,,,,,,0,3678555,1045,,,,,,0,3672127,0 +"2020-10-03","NM",890,,3,,3549,3549,95,15,,,,0,,,,,,30296,,296,0,,,,,,17210,,0,941512,6111,,,,,,0,941512,6111 +"2020-10-03","NV",1620,,11,,,,442,0,,140,628502,3049,,,,,68,81708,81708,526,0,,,,,,,1048907,7341,1048907,7341,,,,,708992,3480,1075816,7014 +"2020-10-03","NY",25505,,8,,89995,89995,647,0,,149,,0,,,,,70,463360,,1731,0,,,,,,,11110291,134267,11110291,134267,,,,,,0,,0 +"2020-10-03","OH",4925,4617,20,308,15735,15735,702,47,3319,210,,0,,,,,94,157966,148892,1157,0,,,,,169768,136330,,0,3318194,45580,,,,,,0,3318194,45580 +"2020-10-03","OK",1051,,7,,6570,6570,655,1,,228,1157074,16473,,,1157074,,,90748,90748,1189,0,4185,,,,102465,77004,,0,1247822,17662,80939,,,,,0,1262313,17663 +"2020-10-03","OR",563,,3,,2618,2618,176,5,,48,663130,5047,,,1052055,,17,34163,,301,0,,,,,58658,5738,,0,1110713,11910,,,,,695616,5332,1110713,11910 +"2020-10-03","PA",8199,,20,,,,573,0,,,1904971,0,,,,,64,161284,155906,0,0,,,,,,132252,3146795,31892,3146795,31892,,,,,2060877,0,,0 +"2020-10-03","PR",681,508,8,173,,,348,0,,57,305972,0,,,395291,,31,24804,24804,299,0,25571,,,,20103,,,0,330776,299,,,,,,0,415664,0 +"2020-10-03","RI",1119,,1,,2828,2828,94,28,,6,323368,2535,,,774656,,4,25245,,169,0,,,,,35295,,809951,12937,809951,12937,,,,,348613,2704,,0 +"2020-10-03","SC",3442,3243,33,199,9216,9216,686,0,,163,1188867,0,64463,,1145625,,88,150891,145953,1706,0,7065,10785,,,187608,72951,,0,1339758,1706,71528,51506,,,,0,1333233,0 +"2020-10-03","SD",248,,11,,1615,1615,215,27,,,174033,1294,,,,,,23986,,464,0,,,,,29963,19626,,0,285823,3157,,,,,198019,1758,285823,3157 +"2020-10-03","TN",2560,2453,45,107,8859,8859,989,32,,293,,0,,,2694752,,119,199595,191442,1192,0,,,,,234057,183533,,0,2928809,17810,,,,,,0,2928809,17810 +"2020-10-03","TX",15992,,97,,,,3195,0,,1101,,0,,,,,,763010,763010,7006,0,37871,18866,,,833768,677244,,0,6755155,56057,417575,225667,,,,0,6755155,56057 +"2020-10-03","UT",476,,2,,3956,3956,217,40,921,65,766659,6692,,,1006305,366,,76225,,1068,0,,2247,,2116,83429,56751,,0,1089734,11335,,30700,,16629,842295,7661,1089734,11335 +"2020-10-03","VA",3270,3057,20,213,11191,11191,906,51,,191,,0,,,,,103,150803,142923,1116,0,9979,3669,,,171249,,2113878,19517,2113878,19517,143993,56286,,,,0,,0 +"2020-10-03","VI",20,,0,,,,,0,,,19685,0,,,,,,1326,,0,0,,,,,,1256,,0,21011,0,,,,,21023,0,,0 +"2020-10-03","VT",58,58,0,,,,0,0,,,162360,853,,,,,,1782,1778,9,0,,,,,,1616,,0,296511,5059,,,,,164138,862,296511,5059 +"2020-10-03","WA",2143,2143,11,,7586,7586,361,13,,77,,0,,,,,40,91570,90186,580,0,,,,,,,1905759,21685,1905759,21685,,,,,,0,,0 +"2020-10-03","WI",1383,1372,20,11,7588,7588,692,82,1202,200,1456763,11192,,,,,,138002,130798,3054,0,,,,,,105373,2440309,28475,2440309,28475,,,,,1587561,14084,,0 +"2020-10-03","WV",357,352,2,5,,,171,0,,57,,0,,,,,32,16468,15971,161,0,,,,,,11938,,0,577315,6533,17483,,,,,0,577315,6533 +"2020-10-03","WY",53,,0,,281,281,32,1,,,97064,0,,,179315,,,6365,5415,151,0,,,,,6047,5083,,0,185362,776,,,,,102353,0,185362,776 +"2020-10-02","AK",57,57,0,,320,320,41,3,,,,0,,,460796,,6,8167,,141,0,,,,,8201,5042,,0,469290,6967,,,,,,0,469290,6967 +"2020-10-02","AL",2550,2409,2,141,17420,17420,752,163,1840,,1006612,6042,,,,1043,,156698,138989,954,0,,,,,,67948,,0,1145601,6869,,,58858,,1145601,6869,,0 +"2020-10-02","AR",1391,1245,7,146,5488,5488,473,43,,222,971951,10866,,,971951,681,89,85779,82309,958,0,,,,3608,,76186,,0,1054260,11644,,,,12083,,0,1054260,11644 +"2020-10-02","AS",0,,0,,,,,0,,,1616,45,,,,,,0,0,0,0,,,,,,,,0,1616,45,,,,,,0,1616,45 +"2020-10-02","AZ",5693,5411,19,282,22240,22240,586,14,,125,1263417,6657,,,,,48,219763,215087,551,0,,,,,,,,0,2236164,19988,,,294964,,1478504,7136,2236164,19988 +"2020-10-02","CA",15986,,98,,,,3166,0,,796,,0,,,,,,817277,817277,3590,0,,,,,,,,0,14868431,96580,,,,,,0,14868431,96580 +"2020-10-02","CO",2057,1696,3,361,7653,7653,304,74,,,866023,10033,157665,,,,,71898,66891,680,0,11878,,,,,,1396346,19426,1396346,19426,169543,,,,932914,10682,,0 +"2020-10-02","CT",4513,3614,2,899,11699,11699,110,0,,,,0,,,1799143,,,58297,55862,555,0,,,,,71793,9408,,0,1873291,27049,,,,,,0,1873291,27049 +"2020-10-02","DC",629,,1,,,,101,0,,30,,0,,,,,14,15423,,65,0,,,,,,12252,394118,3938,394118,3938,,,,,217484,1564,,0 +"2020-10-02","DE",642,562,6,80,,,83,0,,16,269346,1916,,,,,,20937,19839,150,0,,,,,23476,10678,433551,2006,433551,2006,,,,,290283,2066,,0 +"2020-10-02","FL",14730,,111,,44991,44991,2056,170,,,4639717,23026,478794,467286,6634374,,,703212,685380,2610,0,49819,,48639,,916241,,8164667,70613,8164667,70613,528773,,516042,,5311806,0,7593083,44563 +"2020-10-02","GA",7106,,43,,28791,28791,1792,123,5337,,,0,,,,,,320634,320634,1300,0,25532,,,,300258,,,0,2970013,15621,304551,,,,,0,2970013,15621 +"2020-10-02","GU",50,,1,,,,30,0,,13,48501,503,,,,,,2617,2615,67,0,3,2,,,,1887,,0,51118,570,184,2,,,,0,51114,570 +"2020-10-02","HI",139,139,3,,862,862,130,15,,45,287765,1712,,,,,21,12694,12515,105,0,,,,,12478,10340,419196,3229,419196,3229,,,,,300280,1817,424242,3809 +"2020-10-02","IA",1372,,12,,,,393,0,,95,688433,4124,,56207,,,36,87559,87559,925,0,,,3462,3464,,70501,,0,775992,5049,,,59708,34592,777529,5046,,0 +"2020-10-02","ID",472,433,3,39,1873,1873,135,14,460,36,272753,1783,,,,,,42561,38584,513,0,,,,,,22371,,0,311337,2181,,,,,311337,2181,,0 +"2020-10-02","IL",8992,8743,52,249,,,1678,0,,373,,0,,,,,162,300385,297646,2456,0,,,,,,,,0,5763128,72691,,,,,,0,5763128,72691 +"2020-10-02","IN",3656,3429,11,227,12983,12983,963,72,2590,292,1275882,9327,,,,,102,122640,,1464,0,,,,,125500,,,0,2186481,26601,,,,,1398522,10791,2186481,26601 +"2020-10-02","KS",698,,20,,2983,2983,352,66,817,103,470006,8305,,,,259,33,61111,,1362,0,,,,,,,,0,531117,9667,,,,,531117,9667,,0 +"2020-10-02","KY",1197,1185,6,12,5334,5334,578,19,1533,133,,0,,,,,,70727,61647,999,0,,,,,,12041,,0,1422520,22758,58639,25887,,,,0,1422520,22758 +"2020-10-02","LA",5545,5355,26,190,,,536,0,,,2188623,21887,,,,,74,168826,167401,817,0,,,,,,154163,,0,2357449,22704,,,,,,0,2356024,22704 +"2020-10-02","MA",9490,9275,10,215,12733,12733,421,18,,79,2142598,20698,,,,,34,133631,131214,761,0,,,,,171892,113768,,0,4200018,74914,,,120977,134197,2273812,21451,4200018,74914 +"2020-10-02","MD",3950,3806,1,144,15574,15574,323,32,,80,1513563,10873,,123287,,,,126222,126222,712,0,,,11906,,151268,7606,,0,2660800,30902,,,135193,,1639785,11585,2660800,30902 +"2020-10-02","ME",142,141,0,1,452,452,11,1,,2,,0,9906,,,,1,5468,4900,37,0,525,,,,5906,4741,,0,439568,6783,10445,,,,,0,439568,6783 +"2020-10-02","MI",7110,6788,8,322,,,678,0,,158,,0,,,3583752,,62,139996,126358,984,0,,,,,175846,95051,,0,3759598,40411,296844,,,,,0,3759598,40411 +"2020-10-02","MN",2112,2059,10,53,7793,7793,340,35,2156,120,1345684,16309,,,,,,101366,101366,1166,0,,,,,,90492,2086963,31075,2086963,31075,,,,,1447050,17475,,0 +"2020-10-02","MO",2144,,16,,,,1184,0,,,1196792,9286,74087,,1724744,,,129397,129397,1485,0,3809,3225,,,147490,,,0,1875678,19692,78026,14434,67252,10595,1326189,10771,1875678,19692 +"2020-10-02","MP",2,2,0,,4,4,,0,,,15112,0,,,,,,73,73,3,0,,,,,,29,,0,15185,3,,,,,15182,0,20419,0 +"2020-10-02","MS",2999,2753,20,246,5975,5975,531,0,,134,638843,0,,,,,68,99558,91498,672,0,,,,,,89737,,0,738401,672,38720,55946,,,,0,728519,0 +"2020-10-02","MT",186,,5,,729,729,177,2,,,,0,,,,,,13855,,355,0,,,,,,9569,,0,353362,4653,,,,,,0,353362,4653 +"2020-10-02","NC",3608,3579,29,29,,,921,0,,278,,0,,,,,,214684,209397,1775,0,,,,,,,,0,3098503,39874,,3063,,,,0,3098503,39874 +"2020-10-02","ND",267,,8,,902,902,111,18,217,21,221618,936,9287,,,,,22641,22634,471,0,444,,,,,18691,626450,7119,626450,7119,9731,43,,,244312,1412,649885,7432 +"2020-10-02","NE",493,,15,,2356,2356,227,7,,,418079,4101,,,577942,,,46185,,621,0,,,,,55568,33820,,0,634687,9733,,,,,464576,4731,634687,9733 +"2020-10-02","NH",442,,1,,743,743,20,5,234,,269474,1957,,,,,,8534,8395,217,0,,,,,,7636,,0,455869,5055,31955,,31192,,277869,2035,455869,5055 +"2020-10-02","NJ",16131,14344,4,1787,23511,23511,528,34,,94,3465498,57741,,,,,36,212012,206629,838,0,,,,,,,,0,3677510,58579,,,,,,0,3672127,59095 +"2020-10-02","NM",887,,5,,3534,3534,89,16,,,,0,,,,,,30000,,339,0,,,,,,17055,,0,935401,7012,,,,,,0,935401,7012 +"2020-10-02","NV",1609,,6,,,,463,0,,130,625453,4306,,,,,73,81182,81182,772,0,,,,,,,1041566,8913,1041566,8913,,,,,705512,5097,1068802,10560 +"2020-10-02","NY",25497,,7,,89995,89995,648,0,,146,,0,,,,,63,461629,,1598,0,,,,,,,10976024,119493,10976024,119493,,,,,,0,,0 +"2020-10-02","OH",4905,4597,88,308,15688,15688,663,82,3312,187,,0,,,,,97,156809,147797,1495,0,,,,,168349,135301,,0,3272614,36857,,,,,,0,3272614,36857 +"2020-10-02","OK",1044,,9,,6569,6569,623,59,,234,1140601,13529,,,1140601,,,89559,89559,1190,0,3997,,,,101347,75753,,0,1230160,14719,78836,,,,,0,1244650,14897 +"2020-10-02","OR",560,,1,,2613,2613,179,15,,49,658083,5719,,,1040523,,18,33862,,353,0,,,,,58280,5738,,0,1098803,11944,,,,,690284,6049,1098803,11944 +"2020-10-02","PA",8179,,19,,,,561,0,,,1904971,15332,,,,,63,161284,155906,1161,0,,,,,,132252,3114903,34928,3114903,34928,,,,,2060877,16416,,0 +"2020-10-02","PR",673,500,8,173,,,339,0,,59,305972,0,,,395291,,38,24505,24505,329,0,25242,,,,20103,,,0,330477,329,,,,,,0,415664,0 +"2020-10-02","RI",1118,,1,,2800,2800,96,7,,7,320833,2248,,,761937,,7,25076,,162,0,,,,,35077,,797014,10814,797014,10814,,,,,345909,2410,,0 +"2020-10-02","SC",3409,3211,9,198,9216,9216,679,56,,160,1188867,20736,64463,,1145625,,95,149185,144366,862,0,7065,10785,,,187608,72951,,0,1338052,21598,71528,51506,,,,0,1333233,21315 +"2020-10-02","SD",237,,1,,1588,1588,220,10,,,172739,872,,,,,,23522,,386,0,,,,,29533,19298,,0,282666,9932,,,,,196261,1258,282666,9932 +"2020-10-02","TN",2515,2410,14,105,8827,8827,983,45,,290,,0,,,2678298,,121,198403,190388,971,0,,,,,232701,182116,,0,2910999,16124,,,,,,0,2910999,16124 +"2020-10-02","TX",15895,,72,,,,3227,0,,1091,,0,,,,,,756004,756004,3503,0,37538,18633,,,830093,672144,,0,6699098,50306,415228,221296,,,,0,6699098,50306 +"2020-10-02","UT",474,,15,,3916,3916,258,34,920,73,759967,6881,,,996021,365,,75157,,1107,0,,2225,,2106,82378,56167,,0,1078399,11494,,29880,,16355,834634,8079,1078399,11494 +"2020-10-02","VA",3250,3037,22,213,11140,11140,890,48,,201,,0,,,,,108,149687,141850,966,0,9924,3538,,,169995,,2094361,20125,2094361,20125,143582,52768,,,,0,,0 +"2020-10-02","VI",20,,0,,,,,0,,,19685,237,,,,,,1326,,3,0,,,,,,1256,,0,21011,240,,,,,21023,246,,0 +"2020-10-02","VT",58,58,0,,,,1,0,,,161507,899,,,,,,1773,1769,14,0,,,,,,1611,,0,291452,5126,,,,,163276,913,291452,5126 +"2020-10-02","WA",2132,2132,6,,7573,7573,371,40,,88,,0,,,,,33,90990,89635,618,0,,,,,,,1884074,15985,1884074,15985,,,,,,0,,0 +"2020-10-02","WI",1363,1353,5,10,7506,7506,663,97,1196,181,1445571,10850,,,,,,134948,127906,2825,0,,,,,,103530,2411834,31882,2411834,31882,,,,,1573477,13595,,0 +"2020-10-02","WV",355,351,1,4,,,164,0,,54,,0,,,,,32,16307,15834,283,0,,,,,,11799,,0,570782,9869,17444,,,,,0,570782,9869 +"2020-10-02","WY",53,,0,,280,280,32,6,,,97064,1852,,,178606,,,6214,5289,131,0,,,,,5980,4989,,0,184586,2772,,,,,102353,2095,184586,2772 +"2020-10-01","AK",57,57,1,,317,317,42,2,,,,0,,,454030,,6,8026,,137,0,,,,,8002,4838,,0,462323,5116,,,,,,0,462323,5116 +"2020-10-01","AL",2548,2405,8,143,17257,17257,760,0,1832,,1000570,6095,,,,1037,,155744,138162,1043,0,,,,,,67948,,0,1138732,6693,,,58605,,1138732,6693,,0 +"2020-10-01","AR",1384,1238,15,146,5445,5445,479,91,,226,961085,11978,,,961085,678,92,84821,81531,1124,0,,,,3608,,76186,,0,1042616,12899,,,,12083,,0,1042616,12899 +"2020-10-01","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-10-01","AZ",5674,5401,24,273,22226,22226,620,107,,122,1256760,13119,,,,,54,219212,214608,705,0,,,,,,,,0,2216176,22709,,,294183,,1471368,13793,2216176,22709 +"2020-10-01","CA",15888,,96,,,,3205,0,,817,,0,,,,,,813687,813687,3062,0,,,,,,,,0,14771851,66649,,,,,,0,14771851,66649 +"2020-10-01","CO",2054,1696,3,358,7579,7579,282,11,,,855990,10142,157044,,,,,71218,66242,682,0,11827,,,,,,1376920,19761,1376920,19761,168871,,,,922232,10806,,0 +"2020-10-01","CT",4511,3613,3,898,11699,11699,107,139,,,,0,,,1772448,,,57742,55306,192,0,,,,,71452,9408,,0,1846242,26763,,,,,,0,1846242,26763 +"2020-10-01","DC",628,,1,,,,98,0,,28,,0,,,,,12,15358,,32,0,,,,,,12202,390180,2320,390180,2320,,,,,215920,716,,0 +"2020-10-01","DE",636,559,0,77,,,78,0,,17,267430,1481,,,,,,20787,19690,174,0,,,,,23400,10648,431545,1399,431545,1399,,,,,288217,1655,,0 +"2020-10-01","FL",14619,,131,,44821,44821,2080,213,,,4616691,22023,478794,467286,6593392,,,700602,683148,2551,0,49819,,48639,,912821,,8094054,59906,8094054,59906,528773,,516042,,5311806,24588,7548520,41505 +"2020-10-01","GA",7063,,42,,28668,28668,1858,146,5300,,,0,,,,,,319334,319334,1308,0,25321,,,,299351,,,0,2954392,20713,303223,,,,,0,2954392,20713 +"2020-10-01","GU",49,,0,,,,27,0,,10,47998,372,,,,,,2550,2548,62,0,3,2,,,,1866,,0,50548,434,181,2,,,,0,50544,434 +"2020-10-01","HI",136,136,4,,847,847,140,15,,47,286053,1842,,,,,33,12589,12410,120,0,,,,,12381,10298,415967,4583,415967,4583,,,,,298463,2049,420433,4493 +"2020-10-01","IA",1360,,16,,,,407,0,,104,684309,5038,,55875,,,33,86634,86634,1038,0,,,3450,3375,,69619,,0,770943,6076,,,59364,33336,772483,6066,,0 +"2020-10-01","ID",469,431,5,38,1859,1859,135,12,457,36,270970,1963,,,,,,42048,38186,614,0,,,,,,22180,,0,309156,2450,,,,,309156,2450,,0 +"2020-10-01","IL",8940,8696,24,244,,,1635,0,,359,,0,,,,,149,297929,295440,2166,0,,,,,,,,0,5690437,65615,,,,,,0,5690437,65615 +"2020-10-01","IN",3645,3418,13,227,12911,12911,919,97,2577,265,1266555,6724,,,,,102,121176,,1157,0,,,,,124303,,,0,2159880,26618,,,,,1387731,7881,2159880,26618 +"2020-10-01","KS",678,,0,,2917,2917,352,0,801,103,461701,0,,,,255,33,59749,,0,0,,,,,,,,0,521450,0,,,,,521450,0,,0 +"2020-10-01","KY",1191,1180,17,11,5315,5315,524,36,1529,129,,0,,,,,,69728,60875,888,0,,,,,,11970,,0,1399762,23775,58617,25581,,,,0,1399762,23775 +"2020-10-01","LA",5519,5329,8,190,,,534,0,,,2166736,15590,,,,,75,168009,166584,551,0,,,,,,154163,,0,2334745,16141,,,,,,0,2333320,16141 +"2020-10-01","MA",9480,9265,24,215,12715,12715,436,29,,84,2121900,17451,,,,,32,132870,130461,754,0,,,,,170958,113768,,0,4125104,74487,,,120585,133689,2252361,18159,4125104,74487 +"2020-10-01","MD",3949,3805,0,144,15542,15542,331,12,,74,1502690,9408,,123287,,,,125510,125510,785,0,,,11906,,150425,7568,,0,2629898,23985,,,135193,,1628200,10193,2629898,23985 +"2020-10-01","ME",142,141,1,1,451,451,12,2,,2,,0,9890,,,,1,5431,4865,40,0,523,,,,5864,4704,,0,432785,7194,10427,,,,,0,432785,7194 +"2020-10-01","MI",7102,6781,19,321,,,678,0,,158,,0,,,3544569,,67,139012,125578,998,0,,,,,174618,95051,,0,3719187,35925,295830,,,,,0,3719187,35925 +"2020-10-01","MN",2102,2049,13,53,7758,7758,340,57,2148,120,1329375,13808,,,,,,100200,100200,1066,0,,,,,,89980,2055888,25721,2055888,25721,,,,,1429575,14874,,0 +"2020-10-01","MO",2128,,10,,,,1185,0,,,1187506,9234,73944,,1706722,,,127912,127912,1799,0,3773,3136,,,145846,,,0,1855986,8617,77845,13721,67113,10054,1315418,12460,1855986,8617 +"2020-10-01","MP",2,2,0,,4,4,,0,,,15112,0,,,,,,70,70,0,0,,,,,,29,,0,15182,0,,,,,15182,0,20419,0 +"2020-10-01","MS",2979,2738,10,241,5975,5975,531,131,,134,638843,0,,,,,68,98886,90980,696,0,,,,,,89737,,0,737729,696,38720,55946,,,,0,728519,0 +"2020-10-01","MT",181,,1,,727,727,178,10,,,,0,,,,,,13500,,429,0,,,,,,9428,,0,348709,5551,,,,,,0,348709,5551 +"2020-10-01","NC",3579,3551,47,28,,,939,0,,297,,0,,,,,,212909,207789,2277,0,,,,,,,,0,3058629,28574,,2721,,,,0,3058629,28574 +"2020-10-01","ND",259,,10,,884,884,106,25,214,22,220682,1036,9151,,,,,22170,22164,367,0,427,,,,,18272,619331,5844,619331,5844,9578,42,,,242900,1416,642453,6079 +"2020-10-01","NE",478,,0,,2349,2349,226,34,,,413978,3384,,,569018,,,45564,,520,0,,,,,54787,33362,,0,624954,6602,,,,,459845,3902,624954,6602 +"2020-10-01","NH",441,,2,,738,738,15,0,234,,267517,2070,,,,,,8317,,51,0,,,,,,7534,,0,450814,5339,31913,,31156,,275834,2121,450814,5339 +"2020-10-01","NJ",16127,14340,5,1787,23477,23477,523,38,,96,3407757,0,,,,,39,211174,205889,716,0,,,,,,,,0,3618931,716,,,,,,0,3613032,0 +"2020-10-01","NM",882,,5,,3518,3518,86,23,,,,0,,,,,,29661,,226,0,,,,,,16926,,0,928389,7380,,,,,,0,928389,7380 +"2020-10-01","NV",1603,,3,,,,449,0,,125,621147,3031,,,,,63,80410,80410,430,0,,,,,,,1032653,6366,1032653,6366,,,,,700415,3418,1058242,5806 +"2020-10-01","NY",25490,,11,,89995,89995,612,0,,141,,0,,,,,63,460031,,1382,0,,,,,,,10856531,109218,10856531,109218,,,,,,0,,0 +"2020-10-01","OH",4817,4514,13,303,15606,15606,699,90,3297,197,,0,,,,,100,155314,146438,1327,0,,,,,167112,134216,,0,3235757,33128,,,,,,0,3235757,33128 +"2020-10-01","OK",1035,,4,,6510,6510,610,61,,239,1127072,10243,,,1127072,,,88369,88369,1170,0,3997,,,,99570,74483,,0,1215441,11413,78836,,,,,0,1229753,12172 +"2020-10-01","OR",559,,4,,2598,2598,170,40,,48,652364,6272,,,1028931,,14,33509,,218,0,,,,,57928,5720,,0,1086859,14344,,,,,684235,6465,1086859,14344 +"2020-10-01","PA",8160,,18,,,,558,0,,,1889639,10512,,,,,60,160123,154822,1156,0,,,,,,131300,3079975,26159,3079975,26159,,,,,2044461,11410,,0 +"2020-10-01","PR",665,492,4,173,,,316,0,,59,305972,0,,,395291,,38,24176,24176,176,0,24891,,,,20103,,,0,330148,176,,,,,,0,415664,0 +"2020-10-01","RI",1117,,3,,2793,2793,94,11,,6,318585,2732,,,751294,,7,24914,,166,0,,,,,34906,,786200,16378,786200,16378,,,,,343499,2898,,0 +"2020-10-01","SC",3400,3203,22,197,9160,9160,709,0,,172,1168131,6975,64278,,1125535,,91,148323,143787,381,0,6978,10618,,,186383,74499,,0,1316454,7356,71256,49191,,,,0,1311918,7139 +"2020-10-01","SD",236,,13,,1578,1578,214,29,,,171867,3487,,,,,,23136,,747,0,,,,,28864,19068,,0,272734,2992,,,,,195003,4234,272734,2992 +"2020-10-01","TN",2501,2399,47,102,8782,8782,999,49,,309,,0,,,2663147,,138,197432,189575,1293,0,,,,,231728,180781,,0,2894875,18153,,,,,,0,2894875,18153 +"2020-10-01","TX",15823,,112,,,,3190,0,,1075,,0,,,,,,752501,752501,3534,0,37224,18358,,,826741,668515,,0,6648792,49963,413627,214223,,,,0,6648792,49963 +"2020-10-01","UT",459,,0,,3882,3882,259,35,916,76,753086,6141,,,985814,364,,74050,,1008,0,,2152,,2033,81091,55510,,0,1066905,10787,,28433,,15826,826555,7093,1066905,10787 +"2020-10-01","VA",3228,3015,20,213,11092,11092,913,51,,210,,0,,,,,107,148721,140990,450,0,9868,3395,,,169007,,2074236,24248,2074236,24248,143107,48657,,,,0,,0 +"2020-10-01","VI",20,,0,,,,,0,,,19448,205,,,,,,1323,,5,0,,,,,,1254,,0,20771,210,,,,,20777,195,,0 +"2020-10-01","VT",58,58,0,,,,3,0,,,160608,1004,,,,,,1759,1755,3,0,,,,,,1609,,0,286326,3591,,,,,162363,1007,286326,3591 +"2020-10-01","WA",2126,2126,2,,7533,7533,410,50,,90,,0,,,,,32,90372,89047,633,0,,,,,,,1868089,13690,1868089,13690,,,,,,0,,0 +"2020-10-01","WI",1358,1348,21,10,7409,7409,669,109,1187,208,1434721,11474,,,,,,132123,125161,3000,0,,,,,,101669,2379952,32975,2379952,32975,,,,,1559882,14361,,0 +"2020-10-01","WV",354,349,4,5,,,173,0,,57,,0,,,,,34,16024,15559,176,0,,,,,,11602,,0,560913,5133,17407,,,,,0,560913,5133 +"2020-10-01","WY",53,,3,,274,274,27,2,,,95212,0,,,176036,,,6083,5170,135,0,,,,,5778,4853,,0,181814,3441,,,,,100258,0,181814,3441 +"2020-09-30","AK",56,56,0,,315,315,53,2,,,,0,,,449109,,7,7889,,104,0,,,,,7807,4555,,0,457207,6151,,,,,,0,457207,6151 +"2020-09-30","AL",2540,2399,23,141,17257,17257,776,75,1815,,994475,11312,,,,1025,,154701,137564,1147,0,,,,,,67948,,0,1132039,12327,,,58393,,1132039,12327,,0 +"2020-09-30","AR",1369,1223,19,146,5354,5354,484,0,,218,949107,21205,,,949107,676,93,83697,80610,942,0,,,,3383,,75312,,0,1029717,21812,,,,11700,,0,1029717,21812 +"2020-09-30","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-30","AZ",5650,5382,18,268,22119,22119,560,72,,115,1243641,3735,,,,,55,218507,213934,323,0,,,,,,,,0,2193467,19057,,,293098,,1457575,4047,2193467,19057 +"2020-09-30","CA",15792,,152,,,,3267,0,,830,,0,,,,,,810625,810625,3200,0,,,,,,,,0,14705202,91657,,,,,,0,14705202,91657 +"2020-09-30","CO",2051,1694,5,357,7568,7568,264,10,,,845848,8721,156576,,,,,70536,65578,511,0,11761,,,,,,1357159,15979,1357159,15979,168337,,,,911426,9184,,0 +"2020-09-30","CT",4508,3610,3,898,11560,11560,104,0,,,,0,,,1746066,,,57550,55129,221,0,,,,,71079,9310,,0,1819479,30630,,,,,,0,1819479,30630 +"2020-09-30","DC",627,,1,,,,95,0,,28,,0,,,,,9,15326,,26,0,,,,,,12155,387860,1464,387860,1464,,,,,215204,473,,0 +"2020-09-30","DE",636,559,1,77,,,72,0,,15,265949,992,,,,,,20613,19540,82,0,,,,,23335,10622,430146,1916,430146,1916,,,,,286562,1074,,0 +"2020-09-30","FL",14488,,175,,44608,44608,2097,253,,,4594668,9120,460024,449702,6555737,,,698051,681129,1880,0,45080,,44075,,909158,,8034148,40727,8034148,40727,505164,,493810,,5287218,10998,7507015,27829 +"2020-09-30","GA",7021,,27,,28522,28522,1896,183,5269,,,0,,,,,,318026,318026,1720,0,25149,,,,298062,,,0,2933679,22846,302125,,,,,0,2933679,22846 +"2020-09-30","GU",49,,2,,,,25,0,,9,47626,342,,,,,,2488,2486,45,0,3,,,,,1822,,0,50114,387,180,,,,,0,50110,385 +"2020-09-30","HI",132,132,0,,832,832,147,13,,44,284211,0,,,,,12,12469,12290,87,0,,,,,12257,10256,411384,3424,411384,3424,,,,,296414,0,415940,3150 +"2020-09-30","IA",1344,,16,,,,390,0,,100,679271,5359,,55459,,,31,85596,85596,1120,0,,,3429,3233,,68456,,0,764867,6479,,,58927,32440,766417,6479,,0 +"2020-09-30","ID",464,427,4,37,1847,1847,137,15,457,38,269007,1388,,,,,,41434,37699,511,0,,,,,,21976,,0,306706,1815,,,,,306706,1815,,0 +"2020-09-30","IL",8916,8672,35,244,,,1632,0,,378,,0,,,,,152,295763,293274,2273,0,,,,,,,,0,5624822,58546,,,,,,0,5624822,58546 +"2020-09-30","IN",3632,3405,20,227,12814,12814,975,56,2554,265,1259831,7542,,,,,96,120019,,953,0,,,,,123101,,,0,2133262,31627,,,,,1379850,8495,2133262,31627 +"2020-09-30","KS",678,,41,,2917,2917,352,65,801,103,461701,6421,,,,255,33,59749,,1120,0,,,,,,,,0,521450,7541,,,,,521450,7541,,0 +"2020-09-30","KY",1174,1163,4,11,5279,5279,541,29,1525,126,,0,,,,,,68840,60218,984,0,,,,,,11840,,0,1375987,13058,55961,27868,,,,0,1375987,13058 +"2020-09-30","LA",5511,5321,21,190,,,553,0,,,2151146,10237,,,,,79,167458,166033,610,0,,,,,,154163,,0,2318604,10847,,,,,,0,2317179,10646 +"2020-09-30","MA",9456,9242,33,214,12686,12686,438,19,,89,2104449,13894,,,,,29,132116,129753,532,0,,,,,170156,113768,,0,4050617,62393,,,120418,131852,2234202,14404,4050617,62393 +"2020-09-30","MD",3949,3805,3,144,15530,15530,334,70,,77,1493282,7283,,123287,,,,124725,124725,414,0,,,11906,,149458,7536,,0,2605913,17223,,,135193,,1618007,7697,2605913,17223 +"2020-09-30","ME",141,140,0,1,449,449,13,2,,7,,0,9862,,,,1,5391,4824,54,0,522,,,,5824,4678,,0,425591,6962,10398,,,,,0,425591,6962 +"2020-09-30","MI",7083,6762,11,321,,,557,0,,137,,0,,,3509848,,59,138014,124687,1194,0,,,,,173414,95051,,0,3683262,29538,294558,,,,,0,3683262,29538 +"2020-09-30","MN",2089,2036,17,53,7701,7701,340,68,2146,120,1315567,7436,,,,,,99134,99134,687,0,,,,,,89392,2030167,12817,2030167,12817,,,,,1414701,8123,,0 +"2020-09-30","MO",2118,,32,,,,1171,0,,,1178272,0,74027,,1700102,,,126113,126113,1351,0,3747,3057,,,143886,,,0,1847369,21170,77904,11328,75327,,1302958,0,1847369,21170 +"2020-09-30","MP",2,2,0,,4,4,,0,,,15112,336,,,,,,70,70,0,0,,,,,,29,,0,15182,336,,,,,15182,337,20419,584 +"2020-09-30","MS",2969,2729,12,240,5844,5844,556,0,,136,638843,0,,,,,71,98190,90462,552,0,,,,,,89737,,0,737033,552,38720,55946,,,,0,728519,0 +"2020-09-30","MT",180,,3,,717,717,170,8,,,,0,,,,,,13071,,347,0,,,,,,9256,,0,343158,3232,,,,,,0,343158,3232 +"2020-09-30","NC",3532,3505,38,27,,,956,0,,297,,0,,,,,,210632,205703,1495,0,,,,,,,,0,3030055,13675,,2337,,,,0,3030055,13675 +"2020-09-30","ND",249,,7,,859,859,89,11,210,18,219646,1199,9151,,,,,21803,21797,444,0,427,,,,,17938,613487,5102,613487,5102,9578,23,,,241484,1635,636374,5333 +"2020-09-30","NE",478,,6,,2315,2315,215,14,,,410594,2615,,,563045,,,45044,,466,0,,,,,54169,33198,,0,618352,7272,,,,,455943,3081,618352,7272 +"2020-09-30","NH",439,,0,,738,738,14,0,234,,265447,3476,,,,,,8266,,33,0,,,,,,7522,,0,445475,6503,31863,,31108,,273713,3509,445475,6503 +"2020-09-30","NJ",16122,14335,9,1787,23439,23439,479,60,,108,3407757,45560,,,,,39,210458,205275,822,0,,,,,,,,0,3618215,46382,,,,,,0,3613032,46728 +"2020-09-30","NM",877,,2,,3495,3495,85,20,,,,0,,,,,,29435,,278,0,,,,,,16671,,0,921009,6023,,,,,,0,921009,6023 +"2020-09-30","NV",1600,,7,,,,452,0,,129,618116,1991,,,,,70,79980,79980,385,0,,,,,,,1026287,8989,1026287,8989,,,,,696997,2288,1052436,7102 +"2020-09-30","NY",25479,,9,,89995,89995,605,0,,144,,0,,,,,67,458649,,1000,0,,,,,,,10747313,97960,10747313,97960,,,,,,0,,0 +"2020-09-30","OH",4804,4501,21,303,15516,15516,689,103,3288,194,,0,,,,,103,153987,145191,1080,0,,,,,165782,132980,,0,3202629,26865,,,,,,0,3202629,26865 +"2020-09-30","OK",1031,,13,,6449,6449,628,83,,245,1116829,10645,,,1116829,,,87199,87199,980,0,3997,,,,98631,73100,,0,1204028,11625,78836,,,,,0,1217581,11965 +"2020-09-30","OR",555,,8,,2558,2558,173,20,,53,646092,4057,,,1014964,,17,33291,,297,0,,,,,57551,5538,,0,1072515,8533,,,,,677770,4345,1072515,8533 +"2020-09-30","PA",8142,,19,,,,539,0,,,1879127,12366,,,,,66,158967,153924,1153,0,,,,,,130352,3053816,25679,3053816,25679,,,,,2033051,13422,,0 +"2020-09-30","PR",661,489,7,172,,,327,0,,62,305972,0,,,395291,,39,24000,24000,199,0,24755,,,,20103,,,0,329972,199,,,,,,0,415664,0 +"2020-09-30","RI",1114,,1,,2782,2782,103,8,,7,315853,2511,,,735136,,6,24748,,192,0,,,,,34686,,769822,9594,769822,9594,,,,,340601,2703,,0 +"2020-09-30","SC",3378,3186,19,192,9160,9160,729,55,,184,1161156,8376,64219,,1118867,,95,147942,143623,308,0,6958,10494,,,185912,71691,,0,1309098,8684,71177,47058,,,,0,1304779,8504 +"2020-09-30","SD",223,,0,,1549,1549,212,38,,,168380,1231,,,,,,22389,,392,0,,,,,28414,18508,,0,269742,2897,,,,,190769,1623,269742,2897 +"2020-09-30","TN",2454,2356,34,98,8733,8733,969,61,,280,,0,,,2646321,,124,196139,188505,1528,0,,,,,230401,179322,,0,2876722,23655,,,,,,0,2876722,23655 +"2020-09-30","TX",15711,,107,,,,3344,0,,1076,,0,,,,,,748967,748967,5683,0,37113,18094,,,823305,664883,,0,6598829,54244,412969,209959,,,,0,6598829,54244 +"2020-09-30","UT",459,,2,,3847,3847,243,40,912,75,746945,6872,,,976024,363,,73042,,906,0,,2081,,1966,80094,55141,,0,1056118,11099,,27011,,15282,819462,8051,1056118,11099 +"2020-09-30","VA",3208,2995,21,213,11041,11041,908,63,,190,,0,,,,,104,148271,140614,755,0,9825,3277,,,167677,,2049988,10478,2049988,10478,142594,45793,,,,0,,0 +"2020-09-30","VI",20,,0,,,,,0,,,19243,188,,,,,,1318,,0,0,,,,,,1254,,0,20561,188,,,,,20582,200,,0 +"2020-09-30","VT",58,58,0,,,,3,0,,,159604,603,,,,,,1756,1752,3,0,,,,,,1606,,0,282735,2177,,,,,161356,606,282735,2177 +"2020-09-30","WA",2124,2124,24,,7483,7483,384,6,,91,,0,,,,,26,89739,88438,778,0,,,,,,,1854399,5936,1854399,5936,,,,,,0,,0 +"2020-09-30","WI",1337,1327,27,10,7300,7300,683,91,1179,198,1423247,9473,,,,,,129123,122274,2459,0,,,,,,99925,2346977,23113,2346977,23113,,,,,1545521,11792,,0 +"2020-09-30","WV",350,347,5,3,,,169,0,,55,,0,,,,,27,15848,15393,156,0,,,,,,11507,,0,555780,3350,17346,,,,,0,555780,3350 +"2020-09-30","WY",50,,0,,272,272,24,5,,,95212,490,,,172771,,,5948,5046,127,0,,,,,5602,4791,,0,178373,3687,,,,,100258,588,178373,3687 +"2020-09-29","AK",56,56,0,,313,313,49,4,,,,0,,,443163,,7,7785,,122,0,,,,,7606,4324,,0,451056,6265,,,,,,0,451056,6265 +"2020-09-29","AL",2517,2378,16,139,17182,17182,773,91,1802,,983163,2872,,,,1014,,153554,136549,571,0,,,,,,64583,,0,1119712,3366,,,58235,,1119712,3366,,0 +"2020-09-29","AR",1350,1204,21,146,5354,5354,491,106,,231,927902,9725,,,927902,671,98,82755,80003,706,0,,,,3009,,74440,,0,1007905,10207,,,,10986,,0,1007905,10207 +"2020-09-29","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-29","AZ",5632,5365,9,267,22047,22047,540,28,,119,1239906,4164,,,,,64,218184,213622,674,0,,,,,,,,0,2174410,19062,,,292560,,1453528,4816,2174410,19062 +"2020-09-29","CA",15640,,32,,,,3223,0,,828,,0,,,,,,807425,807425,2162,0,,,,,,,,0,14613545,128693,,,,,,0,14613545,128693 +"2020-09-29","CO",2046,1689,2,357,7558,7558,268,28,,,837127,6743,156256,,,,,70025,65115,535,0,11733,,,,,,1341180,14538,1341180,14538,167989,,,,902242,7246,,0 +"2020-09-29","CT",4505,3608,2,897,11560,11560,92,0,,,,0,,,1715856,,,57329,54919,182,0,,,,,70668,9310,,0,1788849,28967,,,,,,0,1788849,28967 +"2020-09-29","DC",626,,2,,,,93,0,,23,,0,,,,,10,15300,,36,0,,,,,,12115,386396,3348,386396,3348,,,,,214731,1435,,0 +"2020-09-29","DE",635,558,1,77,,,64,0,,12,264957,1531,,,,,,20531,19465,142,0,,,,,23257,10599,428230,3259,428230,3259,,,,,285488,1673,,0 +"2020-09-29","FL",14313,,106,,44355,44355,2174,252,,,4585548,25178,460024,449702,6530457,,,696171,679513,3209,0,45080,,44075,,906707,,7993421,64222,7993421,64222,505164,,493810,,5276220,28395,7479186,49290 +"2020-09-29","GA",6994,,33,,28339,28339,1937,142,5225,,,0,,,,,,316306,316306,1025,0,25045,,,,294652,,,0,2910833,12335,301535,,,,,0,2910833,12335 +"2020-09-29","GU",47,,1,,,,26,0,,9,47284,463,,,,,,2443,2443,53,0,3,,,,,1811,,0,49727,516,180,,,,,0,49725,516 +"2020-09-29","HI",132,132,0,,819,819,147,3,,44,284211,2765,,,,,12,12382,12203,87,0,,,,,12168,10215,407960,2429,407960,2429,,,,,296414,2852,412790,2449 +"2020-09-29","IA",1328,,8,,,,376,0,,97,673912,2598,,55101,,,36,84476,84476,474,0,,,3416,3162,,67477,,0,758388,3072,,,58556,31617,759938,3067,,0 +"2020-09-29","ID",460,423,0,37,1832,1832,135,18,454,44,267619,1266,,,,,,40923,37272,422,0,,,,,,21796,,0,304891,1639,,,,,304891,1639,,0 +"2020-09-29","IL",8881,8637,23,244,,,1535,0,,363,,0,,,,,151,293490,291001,1362,0,,,,,,,,0,5566276,45624,,,,,,0,5566276,45624 +"2020-09-29","IN",3612,3385,21,227,12758,12758,942,104,2541,288,1252289,4317,,,,,94,119066,,744,0,,,,,121800,,,0,2101635,30052,,,,,1371355,5061,2101635,30052 +"2020-09-29","KS",637,,0,,2852,2852,270,0,785,88,455280,0,,,,251,29,58629,,0,0,,,,,,,,0,513909,0,,,,,513909,0,,0 +"2020-09-29","KY",1170,1159,8,11,5250,5250,589,42,1520,129,,0,,,,,,67856,59544,917,0,,,,,,11792,,0,1362929,69789,55904,27552,,,,0,1362929,69789 +"2020-09-29","LA",5490,5308,10,182,,,578,0,,,2140909,17606,,,,,80,166848,165624,533,0,,,,,,149640,,0,2307757,18139,,,,,,0,2306533,18139 +"2020-09-29","MA",9423,9210,8,213,12667,12667,444,19,,107,2090555,13674,,,,,27,131584,129243,512,0,,,,,169522,111479,,0,3988224,57005,,,120133,130459,2219798,14124,3988224,57005 +"2020-09-29","MD",3946,3802,8,144,15460,15460,344,32,,79,1485999,6780,,120591,,,,124311,124311,431,0,,,11517,,148896,7509,,0,2588690,15083,,,132108,,1610310,7211,2588690,15083 +"2020-09-29","ME",141,140,1,1,447,447,8,1,,5,,0,9848,,,,1,5337,4777,37,0,522,,,,5771,4629,,0,418629,4559,10384,,,,,0,418629,4559 +"2020-09-29","MI",7072,6751,21,321,,,557,0,,137,,0,,,3481264,,60,136820,123633,1118,0,,,,,172460,95051,,0,3653724,23821,292652,,,,,0,3653724,23821 +"2020-09-29","MN",2072,2020,5,52,7633,7633,340,87,2129,120,1308131,7904,,,,,,98447,98447,809,0,,,,,,88380,2017350,14235,2017350,14235,,,,,1406578,8713,,0 +"2020-09-29","MO",2086,,22,,,,1219,0,,,1178272,0,73889,,1680422,,,124762,124762,76,0,3728,2863,,,142431,,,0,1826199,13062,77747,10572,75327,,1302958,0,1826199,13062 +"2020-09-29","MP",2,2,0,,4,4,,0,,,14776,0,,,,,,70,70,0,0,,,,,,29,,0,14846,0,,,,,14845,0,19835,0 +"2020-09-29","MS",2957,2722,36,235,5844,5844,564,0,,138,638843,0,,,,,67,97638,90082,589,0,,,,,,89737,,0,736481,589,38720,55946,,,,0,728519,0 +"2020-09-29","MT",177,,3,,709,709,166,11,,,,0,,,,,,12724,,311,0,,,,,,9093,,0,339926,2730,,,,,,0,339926,2730 +"2020-09-29","NC",3494,3467,49,27,,,950,0,,287,,0,,,,,,209137,204331,889,0,,,,,,,,0,3016380,13789,,,,,,0,3016380,13789 +"2020-09-29","ND",242,,5,,848,848,105,20,204,16,218447,693,8951,,,,,21359,21353,419,0,424,,,,,17511,608385,4463,608385,4463,9375,22,,,239849,1112,631041,4752 +"2020-09-29","NE",472,,2,,2301,2301,214,21,,,407979,3681,,,556572,,,44578,,515,0,,,,,53392,33087,,0,611080,4238,,,,,452862,4196,611080,4238 +"2020-09-29","NH",439,,0,,738,738,13,1,234,,261971,812,,,,,,8233,,25,0,,,,,,7463,,0,438972,6576,31793,,31078,,270204,837,438972,6576 +"2020-09-29","NJ",16113,14326,10,1787,23379,23379,443,41,,101,3362197,0,,,,,34,209636,204563,551,0,,,,,,,,0,3571833,551,,,,,,0,3566304,0 +"2020-09-29","NM",875,,2,,3475,3475,80,12,,,,0,,,,,,29157,,172,0,,,,,,16565,,0,914986,5481,,,,,,0,914986,5481 +"2020-09-29","NV",1593,,8,,,,446,0,,136,616125,2643,,,,,69,79595,79595,404,0,,,,,,,1017298,7032,1017298,7032,,,,,694709,2878,1045334,4902 +"2020-09-29","NY",25470,,2,,89995,89995,541,0,,147,,0,,,,,61,457649,,1189,0,,,,,,,10649353,88231,10649353,88231,,,,,,0,,0 +"2020-09-29","OH",4783,4480,37,303,15413,15413,672,106,3274,183,,0,,,,,98,152907,144265,1105,0,,,,,164983,131708,,0,3175764,31623,,,,,,0,3175764,31623 +"2020-09-29","OK",1018,,11,,6366,6366,618,93,,225,1106184,30709,,,1106184,,,86219,86219,1025,0,3997,,,,97612,71957,,0,1192403,31734,78836,,,,,0,1205616,33062 +"2020-09-29","OR",547,,0,,2538,2538,191,42,,44,642035,3365,,,1006764,,19,32994,,174,0,,,,,57218,5490,,0,1063982,5303,,,,,673425,12091,1063982,5303 +"2020-09-29","PA",8123,,16,,,,507,0,,,1866761,11270,,,,,63,157814,152868,988,0,,,,,,127829,3028137,26450,3028137,26450,,,,,2019629,12194,,0 +"2020-09-29","PR",654,483,6,171,,,353,0,,68,305972,0,,,395291,,33,23801,23801,444,0,24666,,,,20103,,,0,329773,444,,,,,,0,415664,0 +"2020-09-29","RI",1113,,3,,2774,2774,103,49,,8,313342,2082,,,725449,,5,24556,,132,0,,,,,34779,,760228,7072,760228,7072,,,,,337898,2214,,0 +"2020-09-29","SC",3359,3173,22,186,9105,9105,690,40,,176,1152780,25307,64145,,1110819,,88,147634,143495,1179,0,6914,10284,,,185456,73136,,0,1300414,26486,71059,44877,,,,0,1296275,26353 +"2020-09-29","SD",223,,5,,1511,1511,211,23,,,167149,543,,,,,,21997,,259,0,,,,,28033,18090,,0,266845,1786,,,,,189146,802,266845,1786 +"2020-09-29","TN",2420,2325,31,95,8672,8672,909,53,,270,,0,,,2624331,,106,194611,187197,879,0,,,,,228736,177945,,0,2853067,12958,,,,,,0,2853067,12958 +"2020-09-29","TX",15604,,71,,,,3251,0,,1044,,0,,,,,,743284,743284,4062,0,36957,17806,,,820161,661038,,0,6544585,57998,411712,202842,,,,0,6544585,57998 +"2020-09-29","UT",457,,4,,3807,3807,195,50,908,71,740073,5519,,,966157,362,,72136,,694,0,,2003,,1890,78862,54844,,0,1045019,8919,,25547,,14623,811411,6433,1045019,8919 +"2020-09-29","VA",3187,2976,15,211,10978,10978,958,62,,202,,0,,,,,113,147516,139961,923,0,9797,3176,,,167223,,2039510,12342,2039510,12342,142332,40550,,,,0,,0 +"2020-09-29","VI",20,,1,,,,,0,,,19055,212,,,,,,1318,,1,0,,,,,,1243,,0,20373,213,,,,,20382,215,,0 +"2020-09-29","VT",58,58,0,,,,5,0,,,159001,751,,,,,,1753,1749,4,0,,,,,,1601,,0,280558,1295,,,,,160750,755,280558,1295 +"2020-09-29","WA",2100,2100,0,,7477,7477,362,22,,75,,0,,,,,43,88961,87686,200,0,,,,,,,1848463,11257,1848463,11257,,,,,,0,,0 +"2020-09-29","WI",1310,1300,17,10,7209,7209,646,67,1171,205,1413774,8397,,,,,,126664,119955,2447,0,,,,,,98385,2323864,20928,2323864,20928,,,,,1533729,10764,,0 +"2020-09-29","WV",345,342,8,3,,,172,0,,53,,0,,,,,29,15692,15248,180,0,,,,,,11333,,0,552430,3027,17327,,,,,0,552430,3027 +"2020-09-29","WY",50,,0,,267,267,22,3,,,94722,360,,,169269,,,5821,4948,67,0,,,,,5417,4702,,0,174686,5236,,,,,99670,411,174686,5236 +"2020-09-28","AK",56,56,0,,309,309,43,1,,,,0,,,437017,,14,7663,,114,0,,,,,7487,3771,,0,444791,1922,,,,,,0,444791,1922 +"2020-09-28","AL",2501,2364,0,137,17091,17091,753,239,1798,,980291,4606,,,,1012,,152983,136055,662,0,,,,,,64583,,0,1116346,5107,,,58151,,1116346,5107,,0 +"2020-09-28","AR",1329,1183,21,146,5248,5248,491,13,,231,918177,56285,,,918177,661,99,82049,79521,807,0,,,,2740,,73573,,0,997698,57071,,,,10349,,0,997698,57071 +"2020-09-28","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-28","AZ",5623,5357,0,267,22019,22019,468,4,,115,1235742,5134,,,,,57,217510,212970,273,0,,,,,,,,0,2155348,6529,,,292278,,1448712,5389,2155348,6529 +"2020-09-28","CA",15608,,21,,,,3160,0,,831,,0,,,,,,805263,805263,2955,0,,,,,,,,0,14484852,151354,,,,,,0,14484852,151354 +"2020-09-28","CO",2044,1687,3,357,7530,7530,246,7,,,830384,6082,155928,,,,,69490,64612,411,0,11707,,,,,,1326642,13239,1326642,13239,167635,,,,894996,6457,,0 +"2020-09-28","CT",4503,3606,2,897,11560,11560,75,0,,,,0,,,1687300,,,57147,54743,560,0,,,,,70267,9310,,0,1759882,5688,,,,,,0,1759882,5688 +"2020-09-28","DC",624,,0,,,,90,0,,27,,0,,,,,15,15264,,14,0,,,,,,12053,383048,1889,383048,1889,,,,,213296,595,,0 +"2020-09-28","DE",634,557,1,77,,,60,0,,13,263426,1662,,,,,,20389,19334,129,0,,,,,23154,10577,424971,4249,424971,4249,,,,,283815,1791,,0 +"2020-09-28","FL",14207,,5,,44103,44103,2122,73,,,4560370,7493,460024,449702,6485581,,,692962,676712,728,0,45080,,44075,,902486,,7929199,19004,7929199,19004,505164,,493810,,5247825,8206,7429896,15277 +"2020-09-28","GA",6961,,15,,28197,28197,1849,18,5194,,,0,,,,,,315281,315281,596,0,25025,,,,293921,,,0,2898498,12229,301453,,,,,0,2898498,12229 +"2020-09-28","GU",46,,3,,,,28,0,,10,46821,456,,,,,,2390,2390,36,0,3,,,,,1795,,0,49211,492,180,,,,,0,49209,955 +"2020-09-28","HI",132,132,1,,816,816,148,14,,48,281446,1807,,,,,31,12295,12116,98,0,,,,,12078,10155,405531,4280,405531,4280,,,,,293562,1905,410341,4249 +"2020-09-28","IA",1320,,6,,,,353,0,,96,671314,327,,54878,,,39,84002,84002,366,0,,,3400,2994,,66327,,0,755316,693,,,58318,30094,756871,691,,0 +"2020-09-28","ID",460,423,0,37,1814,1814,135,3,452,44,266353,1868,,,,,,40501,36899,205,0,,,,,,21630,,0,303252,2046,,,,,303252,2046,,0 +"2020-09-28","IL",8858,8614,13,244,,,1491,0,,346,,0,,,,,135,292128,289639,1709,0,,,,,,,,0,5520652,41142,,,,,,0,5520652,41142 +"2020-09-28","IN",3591,3365,11,226,12654,12654,957,58,2515,299,1247972,6562,,,,,93,118322,,872,0,,,,,120249,,,0,2071583,5102,,,,,1366294,7434,2071583,5102 +"2020-09-28","KS",637,,5,,2852,2852,270,36,785,88,455280,9102,,,,251,29,58629,,2037,0,,,,,,,,0,513909,11139,,,,,513909,11139,,0 +"2020-09-28","KY",1162,1151,5,11,5208,5208,507,15,1514,106,,0,,,,,,66939,58888,448,0,,,,,,11787,,0,1293140,18452,55839,24598,,,,0,1293140,18452 +"2020-09-28","LA",5480,5298,15,182,,,563,0,,,2123303,6229,,,,,83,166315,165091,240,0,,,,,,149640,,0,2289618,6469,,,,,,0,2288394,6469 +"2020-09-28","MA",9415,9202,11,213,12648,12648,418,3,,85,2076881,12682,,,,,31,131072,128793,430,0,,,,,168973,111479,,0,3931219,49373,,,119987,129009,2205674,13049,3931219,49373 +"2020-09-28","MD",3938,3793,3,145,15428,15428,315,30,,82,1479219,8259,,120591,,,,123880,123880,477,0,,,11517,,148419,7476,,0,2573607,17902,,,132108,,1603099,8736,2573607,17902 +"2020-09-28","ME",140,139,0,1,446,446,8,1,,2,,0,9782,,,,0,5300,4755,12,0,521,,,,5749,4599,,0,414070,2143,10317,,,,,0,414070,2143 +"2020-09-28","MI",7051,6731,7,320,,,557,0,,137,,0,,,3458288,,51,135702,122735,1329,0,,,,,171615,95051,,0,3629903,51319,292255,,,,,0,3629903,51319 +"2020-09-28","MN",2067,2015,7,52,7546,7546,340,53,2111,120,1300227,12449,,,,,,97638,97638,904,0,,,,,,87330,2003115,22015,2003115,22015,,,,,1397865,13353,,0 +"2020-09-28","MO",2064,,1,,,,1137,0,,,1178272,3572,,71709,1669272,,,124686,124686,1280,0,,,3618,,140554,,,0,1813137,113818,,,75327,,1302958,4852,1813137,113818 +"2020-09-28","MP",2,2,0,,4,4,,0,,,14776,0,,,,,,70,70,0,0,,,,,,29,,0,14846,0,,,,,14845,0,19835,0 +"2020-09-28","MS",2921,2695,2,226,5844,5844,601,237,,147,638843,4807,,,,,68,97049,89676,190,0,,,,,,89737,,0,735892,4997,38720,55946,,,,0,728519,5130 +"2020-09-28","MT",174,,1,,698,698,158,11,,,,0,,,,,,12413,,306,0,,,,,,8839,,0,337196,6889,,,,,,0,337196,6889 +"2020-09-28","NC",3445,3418,4,27,,,897,0,,271,,0,,,,,,208248,203568,868,0,,,,,,,,0,3002591,25913,,,,,,0,3002591,25913 +"2020-09-28","ND",237,,3,,828,828,105,13,201,18,217754,860,8935,,,,,20940,20938,259,0,422,,,,,17080,603922,3855,603922,3855,9357,18,,,238737,1119,626289,3981 +"2020-09-28","NE",470,,1,,2280,2280,224,1,,,404298,2765,,,552696,,,44063,,467,0,,,,,53031,32824,,0,606842,5306,,,,,448666,3232,606842,5306 +"2020-09-28","NH",439,,0,,737,737,16,1,233,,261159,1845,,,,,,8208,,36,0,,,,,,7430,,0,432396,0,31777,,31046,,269367,1881,432396,0 +"2020-09-28","NJ",16103,14316,-2,1787,23338,23338,421,11,,91,3362197,52479,,,,,39,209085,204107,619,0,,,,,,,,0,3571282,53098,,,,,,0,3566304,53736 +"2020-09-28","NM",873,,3,,3463,3463,76,20,,,,0,,,,,,28985,,141,0,,,,,,16422,,0,909505,4176,,,,,,0,909505,4176 +"2020-09-28","NV",1585,,0,,,,451,0,,128,613482,3254,,,,,68,79191,79191,463,0,,,,,,,1010266,2278,1010266,2278,,,,,691831,3758,1040432,6913 +"2020-09-28","NY",25468,,12,,89995,89995,543,0,,135,,0,,,,,57,456460,,834,0,,,,,,,10561122,52936,10561122,52936,,,,,,0,,0 +"2020-09-28","OH",4746,4444,5,302,15307,15307,681,91,3261,197,,0,,,,,101,151802,143281,993,0,,,,,164071,130859,,0,3144141,35868,,,,,,0,3144141,35868 +"2020-09-28","OK",1007,,3,,6273,6273,579,21,,223,1075475,0,,,1075475,,,85194,85194,1684,0,3997,,,,94741,70808,,0,1160669,1684,78836,,,,,0,1172554,0 +"2020-09-28","OR",547,,1,,2496,2496,199,0,,40,638670,2580,,,1001625,,14,32820,,239,0,,,,,57054,5490,,0,1058679,5312,,,,,661334,0,1058679,5312 +"2020-09-28","PA",8107,,1,,,,481,0,,,1855491,10421,,,,,64,156826,151944,676,0,,,,,,128597,3001687,19908,3001687,19908,,,,,2007435,11066,,0 +"2020-09-28","PR",648,477,4,171,,,339,0,,69,305972,0,,,395291,,38,23357,23357,660,0,24065,,,,20103,,,0,329329,660,,,,,,0,415664,0 +"2020-09-28","RI",1110,,0,,2725,2725,94,0,,8,311260,538,,,718555,,4,24424,,26,0,,,,,34601,,753156,2008,753156,2008,,,,,335684,564,,0 +"2020-09-28","SC",3337,3154,11,183,9065,9065,753,22,,172,1127473,20822,63925,,1085933,,108,146455,142449,568,0,6891,10143,,,183989,70430,,0,1273928,21390,70816,42553,,,,0,1269922,21362 +"2020-09-28","SD",218,,0,,1488,1488,209,15,,,166606,643,,,,,,21738,,197,0,,,,,27797,17692,,0,265059,1715,,,,,188344,840,265059,1715 +"2020-09-28","TN",2389,2296,12,93,8619,8619,832,42,,259,,0,,,2612336,,118,193732,186499,737,0,,,,,227773,176030,,0,2840109,14735,,,,,,0,2840109,14735 +"2020-09-28","TX",15533,,11,,,,3201,0,,1056,,0,,,,,,739222,739222,4090,0,36905,17473,,,816290,657407,,0,6486587,16459,411266,194502,,,,0,6486587,16459 +"2020-09-28","UT",453,,0,,3757,3757,174,28,895,66,734554,3861,,,958195,361,,71442,,827,0,,1936,,1827,77905,54530,,0,1036100,6272,,24376,,14090,804978,4511,1036100,6272 +"2020-09-28","VA",3172,2962,13,210,10916,10916,890,27,,193,,0,,,,,103,146593,139144,449,0,9780,3052,,,166501,,2027168,24039,2027168,24039,142258,36663,,,,0,,0 +"2020-09-28","VI",19,,0,,,,,0,,,18843,0,,,,,,1317,,0,0,,,,,,1217,,0,20160,0,,,,,20167,0,,0 +"2020-09-28","VT",58,58,0,,,,3,0,,,158250,829,,,,,,1749,1745,3,0,,,,,,1590,,0,279263,7878,,,,,159995,832,279263,7878 +"2020-09-28","WA",2100,2100,0,,7455,7455,355,24,,71,,0,,,,,25,88761,87487,328,0,,,,,,,1837206,16583,1837206,16583,,,,,,0,,0 +"2020-09-28","WI",1293,1283,2,10,7142,7142,640,47,1162,173,1405377,6159,,,,,,124217,117588,1739,0,,,,,,96727,2302936,23385,2302936,23385,,,,,1522965,7885,,0 +"2020-09-28","WV",337,334,3,3,,,168,0,,51,,0,,,,,29,15512,15086,164,0,,,,,,11188,,0,549403,5664,17259,,,,,0,549403,5664 +"2020-09-28","WY",50,,0,,264,264,22,2,,,94362,1956,,,164210,,,5754,4897,121,0,,,,,5240,4613,,0,169450,4151,,,,,99259,2268,169450,4151 +"2020-09-27","AK",56,56,4,,308,308,43,4,,,,0,,,435171,,14,7549,,110,0,,,,,7411,3502,,0,442869,0,,,,,,0,442869,0 +"2020-09-27","AL",2501,2364,0,137,16852,16852,741,0,1791,,975685,5637,,,,1007,,152321,135554,730,0,,,,,,64583,,0,1111239,6307,,,58032,,1111239,6307,,0 +"2020-09-27","AR",1308,1160,23,148,5235,5235,452,33,,211,861892,6257,,,861892,661,86,81242,78735,487,0,,,,2710,,72602,,0,940627,6732,,,,10266,,0,940627,6732 +"2020-09-27","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-27","AZ",5623,5356,1,267,22015,22015,483,10,,116,1230608,8757,,,,,59,217237,212715,411,0,,,,,,,,0,2148819,8893,,,291300,,1443323,9096,2148819,8893 +"2020-09-27","CA",15587,,55,,,,3129,0,,892,,0,,,,,,802308,802308,4071,0,,,,,,,,0,14333498,150768,,,,,,0,14333498,150768 +"2020-09-27","CO",2041,1685,1,356,7523,7523,263,3,,,824302,9970,155723,,,,,69079,64237,569,0,11693,,,,,,1313403,17748,1313403,17748,167416,,,,888539,10518,,0 +"2020-09-27","CT",4501,3604,0,897,11560,11560,76,0,,,,0,,,1681723,,,56587,54216,0,0,,,,,70158,9310,,0,1754194,7854,,,,,,0,1754194,7854 +"2020-09-27","DC",624,,0,,,,96,0,,29,,0,,,,,17,15250,,35,0,,,,,,12037,381159,3180,381159,3180,,,,,212701,1102,,0 +"2020-09-27","DE",633,556,0,77,,,60,0,,16,261764,1521,,,,,,20260,19207,104,0,,,,,23043,10557,420722,5109,420722,5109,,,,,282024,1625,,0 +"2020-09-27","FL",14202,,12,,44030,44030,2103,66,,,4552877,16552,460024,449702,6471344,,,692234,676033,1847,0,45080,,44075,,901475,,7910195,45268,7910195,45268,505164,,493810,,5239619,18402,7414619,30689 +"2020-09-27","GA",6946,,32,,28179,28179,1868,26,5187,,,0,,,,,,314685,314685,812,0,24959,,,,293203,,,0,2886269,13914,301039,,,,,0,2886269,13914 +"2020-09-27","GU",43,,0,,,,30,0,,9,46365,0,,,,,,2354,2354,0,0,3,,,,,1668,,0,48719,0,179,,,,,0,48254,0 +"2020-09-27","HI",131,131,4,,802,802,150,15,,48,279639,1563,,,,,31,12197,12018,127,0,,,,,11979,10126,401251,4255,401251,4255,,,,,291657,1690,406092,4082 +"2020-09-27","IA",1314,,3,,,,343,0,,89,670987,3033,,54862,,,34,83636,83636,692,0,,,3396,2792,,65838,,0,754623,3725,,,58298,26254,756180,3731,,0 +"2020-09-27","ID",460,423,2,37,1811,1811,135,16,451,44,264485,2065,,,,,,40296,36721,539,0,,,,,,21468,,0,301206,2554,,,,,301206,2554,,0 +"2020-09-27","IL",8845,8601,13,244,,,1486,0,,350,,0,,,,,144,290419,287930,1604,0,,,,,,,,0,5479510,50822,,,,,,0,5479510,50822 +"2020-09-27","IN",3580,3354,3,226,12596,12596,910,75,2511,282,1241410,7569,,,,,92,117450,,901,0,,,,,119892,,,0,2066481,7516,,,,,1358860,8470,2066481,7516 +"2020-09-27","KS",632,,0,,2816,2816,343,0,768,121,446178,0,,,,250,34,56592,,0,0,,,,,,,,0,502770,0,,,,,502770,0,,0 +"2020-09-27","KY",1157,1147,3,10,5193,5193,538,0,1511,129,,0,,,,,,66491,58501,455,0,,,,,,11750,,0,1274688,0,55724,24514,,,,0,1274688,0 +"2020-09-27","LA",5465,5283,21,182,,,557,0,,,2117074,26161,,,,,85,166075,164851,923,0,,,,,,149640,,0,2283149,27084,,,,,,0,2281925,27084 +"2020-09-27","MA",9404,9191,13,213,12645,12645,408,8,,79,2064199,17471,,,,,27,130642,128426,592,0,,,,,168544,111479,,0,3881846,101826,,,119935,126585,2192625,18065,3881846,101826 +"2020-09-27","MD",3935,3790,10,145,15398,15398,328,16,,90,1470960,9632,,120591,,,,123403,123403,431,0,,,11517,,147832,7463,,0,2555705,30047,,,132108,,1594363,10063,2555705,30047 +"2020-09-27","ME",140,139,0,1,445,445,11,2,,2,,0,9777,,,,0,5288,4741,28,0,521,,,,5736,4567,,0,411927,8326,10312,,,,,0,411927,8326 +"2020-09-27","MI",7044,6723,0,321,,,558,0,,139,,0,,,3408684,,52,134373,121427,0,0,,,,,169900,95051,,0,3578584,0,291180,,,,,0,3578584,0 +"2020-09-27","MN",2060,2008,4,52,7493,7493,340,50,2095,120,1287778,14755,,,,,,96734,96734,1075,0,,,,,,86252,1981100,26385,1981100,26385,,,,,1384512,15830,,0 +"2020-09-27","MO",2063,,0,,,,1125,0,,,1174700,7545,,70741,1566917,,,123406,123406,1392,0,,,3518,,129549,,,0,1699319,11810,,,74259,,1298106,8937,1699319,11810 +"2020-09-27","MP",2,2,0,,4,4,,0,,,14776,0,,,,,,70,70,1,0,,,,,,29,,0,14846,1,,,,,14845,0,19835,0 +"2020-09-27","MS",2919,2693,8,226,5607,5607,601,0,,147,634036,0,,,,,68,96859,89505,182,0,,,,,,85327,,0,730895,182,38425,55557,,,,0,723389,0 +"2020-09-27","MT",173,,2,,687,687,148,3,,,,0,,,,,,12107,,200,0,,,,,,8779,,0,330307,1022,,,,,,0,330307,1022 +"2020-09-27","NC",3441,3414,1,27,,,917,0,,269,,0,,,,,,207380,202704,1290,0,,,,,,,,0,2976678,31292,,,,,,0,2976678,31292 +"2020-09-27","ND",234,,4,,815,815,96,6,201,18,216894,1045,8923,,,,,20681,20679,341,0,421,,,,,16727,600067,5439,600067,5439,9344,18,,,237618,1389,622308,5666 +"2020-09-27","NE",469,,1,,2279,2279,226,3,,,401533,4050,,,547931,,,43596,,434,0,,,,,52505,32584,,0,601536,6249,,,,,445434,4487,601536,6249 +"2020-09-27","NH",439,,0,,736,736,20,2,233,,259314,2057,,,,,,8172,,51,0,,,,,,7403,,0,432396,9805,31777,,31030,,267486,2108,432396,9805 +"2020-09-27","NJ",16105,14318,6,1787,23327,23327,416,3,,88,3309718,0,,,,,47,208466,203548,760,0,,,,,,,,0,3518184,760,,,,,,0,3512568,0 +"2020-09-27","NM",870,,0,,3443,3443,66,8,,,,0,,,,,,28844,,152,0,,,,,,16301,,0,905329,5392,,,,,,0,905329,5392 +"2020-09-27","NV",1585,,3,,,,442,0,,125,610228,2905,,,,,64,78728,78728,373,0,,,,,,,1007988,3475,1007988,3475,,,,,688073,3277,1033519,7033 +"2020-09-27","NY",25456,,6,,89995,89995,541,0,,155,,0,,,,,59,455626,,866,0,,,,,,,10508186,84770,10508186,84770,,,,,,0,,0 +"2020-09-27","OH",4741,4440,1,301,15216,15216,639,31,3251,199,,0,,,,,91,150809,142401,800,0,,,,,163029,130193,,0,3108273,38873,,,,,,0,3108273,38873 +"2020-09-27","OK",1004,,0,,6252,6252,579,0,,223,1075475,0,,,1075475,,,83510,83510,0,0,3997,,,,94741,69754,,0,1158985,0,78836,,,,,0,1172554,0 +"2020-09-27","OR",546,,4,,2496,2496,199,0,,40,636090,5498,,,996555,,14,32581,,267,0,,,,,56812,5490,,0,1053367,10072,,,,,661334,0,1053367,10072 +"2020-09-27","PA",8106,,3,,,,462,0,,,1845070,14778,,,,,56,156150,151299,918,0,,,,,,127290,2981779,29746,2981779,29746,,,,,1996369,15684,,0 +"2020-09-27","PR",644,473,2,171,,,349,0,,65,305972,0,,,395291,,38,22697,22697,533,0,23607,,,,20103,,,0,328669,533,,,,,,0,415664,0 +"2020-09-27","RI",1110,,0,,2725,2725,94,0,,8,310722,1858,,,716584,,4,24398,,114,0,,,,,34564,,751148,9185,751148,9185,,,,,335120,1972,,0 +"2020-09-27","SC",3326,3144,3,182,9043,9043,734,15,,179,1106651,9127,63810,,1066318,,108,145887,141909,614,0,6876,10030,,,182242,70028,,0,1252538,9741,70686,40686,,,,0,1248560,9698 +"2020-09-27","SD",218,,0,,1473,1473,216,39,,,165963,962,,,,,,21541,,408,0,,,,,27568,17533,,0,263344,3510,,,,,187504,1370,263344,3510 +"2020-09-27","TN",2377,2284,3,93,8577,8577,830,49,,249,,0,,,2598400,,127,192995,185833,2104,0,,,,,226974,175143,,0,2825374,42530,,,,,,0,2825374,42530 +"2020-09-27","TX",15522,,37,,,,3217,0,,1056,,0,,,,,,735132,735132,1694,0,35953,17332,,,814979,652376,,0,6470128,23858,400882,192591,,,,0,6470128,23858 +"2020-09-27","UT",453,,5,,3729,3729,184,27,895,76,730693,5753,,,952598,359,,70615,,1068,0,,1931,,1823,77230,54201,,0,1029828,9401,,24235,,13996,800467,6627,1029828,9401 +"2020-09-27","VA",3159,2951,15,208,10889,10889,868,26,,198,,0,,,,,103,146144,138734,736,0,9741,3009,,,165374,,2003129,9785,2003129,9785,141970,36044,,,,0,,0 +"2020-09-27","VI",19,,0,,,,,0,,,18843,167,,,,,,1317,,21,0,,,,,,1217,,0,20160,188,,,,,20167,187,,0 +"2020-09-27","VT",58,58,0,,,,2,0,,,157421,622,,,,,,1746,1742,2,0,,,,,,1584,,0,271385,1249,,,,,159163,624,271385,1249 +"2020-09-27","WA",2100,2100,0,,7431,7431,395,19,,90,,0,,,,,31,88433,87171,521,0,,,,,,,1820623,19602,1820623,19602,,,,,,0,,0 +"2020-09-27","WI",1291,1281,0,10,7095,7095,571,54,1156,166,1399218,5806,,,,,,122478,115862,2247,0,,,,,,95513,2279551,28227,2279551,28227,,,,,1515080,8023,,0 +"2020-09-27","WV",334,331,2,3,,,169,0,,53,,0,,,,,26,15348,14935,190,0,,,,,,11160,,0,543739,7415,17254,,,,,0,543739,7415 +"2020-09-27","WY",50,,0,,262,262,22,4,,,92406,0,,,160245,,,5633,4780,168,0,,,,,5054,4519,,0,165299,326,,,,,96991,0,165299,326 +"2020-09-26","AK",52,52,1,,304,304,43,2,,,,0,,,435171,,14,7439,,119,0,,,,,7411,3267,,0,442869,1537,,,,,,0,442869,1537 +"2020-09-26","AL",2501,2364,10,137,16852,16852,709,0,1791,,970048,6684,,,,1007,,151591,134884,933,0,,,,,,64583,,0,1104932,7337,,,57800,,1104932,7337,,0 +"2020-09-26","AR",1285,1137,19,148,5202,5202,447,0,,213,855635,6813,,,855635,657,91,80755,78260,809,0,,,,2706,,72051,,0,933895,7601,,,,10264,,0,933895,7601 +"2020-09-26","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-26","AZ",5622,5355,35,267,22005,22005,509,33,,115,1221851,10194,,,,,56,216826,212376,459,0,,,,,,,,0,2139926,16612,,,290470,,1434227,10624,2139926,16612 +"2020-09-26","CA",15532,,134,,,,3203,0,,862,,0,,,,,,798237,798237,4197,0,,,,,,,,0,14182730,130483,,,,,,0,14182730,130483 +"2020-09-26","CO",2040,1684,3,356,7520,7520,248,41,,,814332,9526,155335,,,,,68510,63689,584,0,11633,,,,,,1295655,18042,1295655,18042,166968,,,,878021,10078,,0 +"2020-09-26","CT",4501,3604,0,897,11560,11560,76,0,,,,0,,,1674070,,,56587,54216,0,0,,,,,69960,9310,,0,1746340,19115,,,,,,0,1746340,19115 +"2020-09-26","DC",624,,1,,,,101,0,,25,,0,,,,,17,15215,,52,0,,,,,,12029,377979,4393,377979,4393,,,,,211599,1456,,0 +"2020-09-26","DE",633,556,2,77,,,57,0,,10,260243,954,,,,,,20156,19103,71,0,,,,,22909,10541,415613,2243,415613,2243,,,,,280399,1025,,0 +"2020-09-26","FL",14190,,107,,43964,43964,2099,171,,,4536325,26218,460024,449702,6443064,,,690387,674330,2731,0,45080,,44075,,899158,,7864927,66440,7864927,66440,505164,,493810,,5221217,28959,7383930,49243 +"2020-09-26","GA",6914,,40,,28153,28153,1831,118,5176,,,0,,,,,,313873,313873,1359,0,24723,,,,292318,,,0,2872355,24861,299555,,,,,0,2872355,24861 +"2020-09-26","GU",43,,2,,,,30,0,,9,46365,395,,,,,,2354,2354,68,0,3,,,,,1668,,0,48719,463,179,,,,,0,48254,0 +"2020-09-26","HI",127,127,3,,787,787,150,8,,55,278076,2980,,,,,30,12070,11891,132,0,,,,,11853,5397,396996,3275,396996,3275,,,,,289967,3182,402010,3065 +"2020-09-26","IA",1311,,4,,,,334,0,,84,667954,5018,,54568,,,29,82944,82944,899,0,,,3389,2645,,65490,,0,750898,5917,,,57997,20350,752449,5913,,0 +"2020-09-26","ID",458,421,1,37,1795,1795,135,29,451,44,262420,1772,,,,,,39757,36232,523,0,,,,,,21291,,0,298652,2240,,,,,298652,2240,,0 +"2020-09-26","IL",8832,8588,25,244,,,1597,0,,355,,0,,,,,141,288815,286326,2441,0,,,,,,,,0,5428688,65217,,,,,,0,5428688,65217 +"2020-09-26","IN",3577,3351,11,226,12521,12521,910,58,2497,259,1233841,7786,,,,,92,116549,,1142,0,,,,,119466,,,0,2058965,22732,,,,,1350390,8928,2058965,22732 +"2020-09-26","KS",632,,0,,2816,2816,343,0,768,121,446178,0,,,,250,34,56592,,0,0,,,,,,,,0,502770,0,,,,,502770,0,,0 +"2020-09-26","KY",1154,1144,5,10,5193,5193,538,46,1511,129,,0,,,,,,66036,58128,970,0,,,,,,11750,,0,1274688,30060,55724,24514,,,,0,1274688,30060 +"2020-09-26","LA",5444,5262,0,182,,,570,0,,,2090913,0,,,,,86,165152,163928,0,0,,,,,,149640,,0,2256065,0,,,,,,0,2254841,0 +"2020-09-26","MA",9391,9178,18,213,12637,12637,354,18,,77,2046728,13795,,,,,28,130050,127832,569,0,,,,,167823,111479,,0,3780020,73292,,,119693,126039,2174560,14310,3780020,73292 +"2020-09-26","MD",3925,3780,8,145,15382,15382,347,54,,81,1461328,11203,,120591,,,,122972,122972,613,0,,,11517,,147256,7458,,0,2525658,31639,,,132108,,1584300,11816,2525658,31639 +"2020-09-26","ME",140,139,0,1,443,443,8,1,,1,,0,9740,,,,0,5260,4713,25,0,516,,,,5702,4538,,0,403601,6314,10270,,,,,0,403601,6314 +"2020-09-26","MI",7044,6723,17,321,,,558,0,,139,,0,,,3408684,,52,134373,121427,996,0,,,,,169900,95051,,0,3578584,40941,291180,,,,,0,3578584,40941 +"2020-09-26","MN",2056,2004,10,52,7443,7443,340,52,2085,120,1273023,16056,,,,,,95659,95659,1470,0,,,,,,85259,1954715,30695,1954715,30695,,,,,1368682,17526,,0 +"2020-09-26","MO",2063,,69,,,,1101,0,,,1167155,14288,,70585,1556710,,,122014,122014,1716,0,,,3508,,128009,,,0,1687509,20077,,,74093,,1289169,16004,1687509,20077 +"2020-09-26","MP",2,2,0,,4,4,,0,,,14776,0,,,,,,69,69,0,0,,,,,,29,,0,14845,0,,,,,14845,0,19835,0 +"2020-09-26","MS",2911,2686,17,225,5607,5607,601,0,,147,634036,3682,,,,,68,96677,89353,645,0,,,,,,85327,,0,730713,4327,38425,55557,,,,0,723389,4167 +"2020-09-26","MT",171,,1,,684,684,147,9,,,,0,,,,,,11907,,343,0,,,,,,8749,,0,329285,3169,,,,,,0,329285,3169 +"2020-09-26","NC",3440,3413,31,27,,,914,0,,272,,0,,,,,,206090,201431,1759,0,,,,,,,,0,2945386,35809,,,,,,0,2945386,35809 +"2020-09-26","ND",230,,8,,809,809,104,20,201,22,215849,1100,8923,,,,,20340,20338,497,0,421,,,,,16481,594628,7064,594628,7064,9344,17,,,236229,1595,616642,7621 +"2020-09-26","NE",468,,6,,2276,2276,225,17,,,397483,2910,,,542196,,,43162,,431,0,,,,,52014,32238,,0,595287,5078,,,,,440947,3344,595287,5078 +"2020-09-26","NH",439,,1,,734,734,18,2,232,,257257,18150,,,,,,8121,,77,0,,,,,,7379,,0,422591,4902,31666,,30983,,265378,18227,422591,4902 +"2020-09-26","NJ",16099,14312,6,1787,23324,23324,426,39,,88,3309718,33107,,,,,38,207706,202850,829,0,,,,,,,,0,3517424,33936,,,,,,0,3512568,33857 +"2020-09-26","NM",870,,5,,3435,3435,72,15,,,,0,,,,,,28692,,205,0,,,,,,16211,,0,899937,6448,,,,,,0,899937,6448 +"2020-09-26","NV",1582,,9,,,,442,0,,125,607323,3740,,,,,64,78355,78355,602,0,,,,,,,1004513,7438,1004513,7438,,,,,684796,4316,1026486,9153 +"2020-09-26","NY",25450,,4,,89995,89995,527,0,,164,,0,,,,,75,454760,,1005,0,,,,,,,10423416,99953,10423416,99953,,,,,,0,,0 +"2020-09-26","OH",4740,4439,6,301,15185,15185,625,58,3247,205,,0,,,,,95,150009,141671,1115,0,,,,,161912,129498,,0,3069400,40323,,,,,,0,3069400,40323 +"2020-09-26","OK",1004,,11,,6252,6252,579,60,,223,1075475,17331,,,1075475,,,83510,83510,990,0,3997,,,,94741,69754,,0,1158985,18321,78836,,,,,0,1172554,19196 +"2020-09-26","OR",542,,3,,2496,2496,199,28,,40,630592,11959,,,986802,,14,32314,,449,0,,,,,56493,5490,,0,1043295,10299,,,,,661334,12385,1043295,10299 +"2020-09-26","PA",8103,,22,,,,444,0,,,1830292,13895,,,,,60,155232,150393,1029,0,,,,,,127290,2952033,30706,2952033,30706,,,,,1980685,14878,,0 +"2020-09-26","PR",642,471,7,171,,,342,0,,59,305972,0,,,395291,,33,22164,22164,296,0,23249,,,,20103,,,0,328136,296,,,,,,0,415664,0 +"2020-09-26","RI",1110,,3,,2725,2725,94,0,,8,308864,3011,,,707512,,4,24284,,103,0,,,,,34451,,741963,14494,741963,14494,,,,,333148,3114,,0 +"2020-09-26","SC",3323,3141,26,182,9028,9028,727,34,,186,1097524,14959,63660,,1057807,,99,145273,141338,1371,0,6831,9972,,,181055,69629,,0,1242797,16330,70491,39995,,,,0,1238862,16241 +"2020-09-26","SD",218,,2,,1434,1434,213,34,,,165001,1608,,,,,,21133,,579,0,,,,,27065,17173,,0,259834,3906,,,,,186134,2187,259834,3906 +"2020-09-26","TN",2374,2281,22,93,8528,8528,855,51,,267,,0,,,2558215,,119,190891,183856,1437,0,,,,,224629,174044,,0,2782844,26911,,,,,,0,2782844,26911 +"2020-09-26","TX",15485,,121,,,,3209,0,,1056,,0,,,,,,733438,733438,4886,0,35847,17229,,,813007,649580,,0,6446270,48515,399337,191112,,,,0,6446270,48515 +"2020-09-26","UT",448,,0,,3702,3702,191,34,890,77,724940,7743,,,944116,358,,69547,,1017,0,,1900,,1793,76311,53806,,0,1020427,12421,,23618,,13698,793840,8981,1020427,12421 +"2020-09-26","VA",3144,2937,8,207,10863,10863,924,57,,202,,0,,,,,111,145408,138173,975,0,9697,2952,,,165048,,1993344,19845,1993344,19845,141528,35606,,,,0,,0 +"2020-09-26","VI",19,,0,,,,,0,,,18676,0,,,,,,1296,,0,0,,,,,,1209,,0,19972,0,,,,,19980,0,,0 +"2020-09-26","VT",58,58,0,,,,1,0,,,156799,879,,,,,,1744,1740,10,0,,,,,,1580,,0,270136,3958,,,,,158539,888,270136,3958 +"2020-09-26","WA",2100,2100,20,,7412,7412,383,55,,86,,0,,,,,28,87912,86666,588,0,,,,,,,1801021,17742,1801021,17742,,,,,,0,,0 +"2020-09-26","WI",1291,1281,7,10,7041,7041,574,79,1153,161,1393412,9767,,,,,,120231,113645,2902,0,,,,,,94094,2251324,30429,2251324,30429,,,,,1507057,12584,,0 +"2020-09-26","WV",332,329,2,3,,,174,0,,56,,0,,,,,31,15158,14750,205,0,,,,,,11121,,0,536324,6895,17205,,,,,0,536324,6895 +"2020-09-26","WY",50,,0,,258,258,22,2,,,92406,0,,,159940,,,5465,4618,45,0,,,,,5033,4479,,0,164973,351,,,,,96991,0,164973,351 +"2020-09-25","AK",51,51,6,,302,302,43,2,,,,0,,,433688,,14,7320,,126,0,,,,,7357,3042,,0,441332,8134,,,,,,0,441332,8134 +"2020-09-25","AL",2491,2357,-15,134,16852,16852,718,74,1782,,963364,18617,,,,1000,,150658,134231,2452,0,,,,,,64583,,0,1097595,19415,,,57589,,1097595,19415,,0 +"2020-09-25","AR",1266,1116,20,150,5202,5202,478,42,,224,848822,8085,,,848822,657,95,79946,77472,897,0,,,,2682,,71426,,0,926294,8881,,,,10056,,0,926294,8881 +"2020-09-25","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-25","AZ",5587,5319,28,268,21972,21972,521,30,,119,1211657,7092,,,,,65,216367,211946,515,0,,,,,,,,0,2123314,17766,,,289802,,1423603,7612,2123314,17766 +"2020-09-25","CA",15398,,84,,,,3307,0,,899,,0,,,,,,794040,794040,3400,0,,,,,,,,0,14052247,99390,,,,,,0,14052247,99390 +"2020-09-25","CO",2037,1682,4,355,7479,7479,248,25,,,804806,9218,154823,,,,,67926,63137,709,0,11592,,,,,,1277613,16752,1277613,16752,166415,,,,867943,9835,,0 +"2020-09-25","CT",4501,3604,2,897,11560,11560,76,0,,,,0,,,1655249,,,56587,54216,115,0,,,,,69673,9310,,0,1727225,22993,,,,,,0,1727225,22993 +"2020-09-25","DC",623,,2,,,,101,0,,29,,0,,,,,17,15163,,57,0,,,,,,11990,373586,5719,373586,5719,,,,,210143,1696,,0 +"2020-09-25","DE",631,554,1,77,,,53,0,,11,259289,1320,,,,,,20085,19044,138,0,,,,,22844,10517,413370,1404,413370,1404,,,,,279374,1458,,0 +"2020-09-25","FL",14083,,122,,43793,43793,2121,172,,,4510107,23648,460024,449702,6397559,,,687656,671909,2809,0,45080,,44075,,895592,,7798487,65615,7798487,65615,505164,,493810,,5192258,26443,7334687,45143 +"2020-09-25","GA",6874,,52,,28035,28035,1891,132,5156,,,0,,,,,,312514,312514,1468,0,24566,,,,290995,,,0,2847494,22678,298482,,,,,0,2847494,22678 +"2020-09-25","GU",41,,3,,,,31,0,,11,45970,546,,,,,,2286,2286,23,0,3,,,,,1668,,0,48256,569,179,,,,,0,48254,569 +"2020-09-25","HI",124,124,2,,779,779,150,16,,55,275096,0,,,,,30,11938,11779,90,0,,,,,11743,5265,393721,3361,393721,3361,,,,,286785,0,398945,3442 +"2020-09-25","IA",1307,,5,,,,330,0,,87,662936,5427,,54088,,,35,82045,82045,974,0,,,3371,2640,,62648,,0,744981,6401,,,57499,20262,746536,6411,,0 +"2020-09-25","ID",457,419,3,38,1766,1766,147,12,449,40,260648,1948,,,,,,39234,35764,491,0,,,,,,21105,,0,296412,2349,,,,,296412,2349,,0 +"2020-09-25","IL",8807,8563,33,244,,,1637,0,,371,,0,,,,,124,286374,283885,2805,0,,,,,,,,0,5363471,69793,,,,,,0,5363471,69793 +"2020-09-25","IN",3566,3340,18,226,12463,12463,856,75,2484,258,1226055,8683,,,,,83,115407,,1171,0,,,,,118514,,,0,2036233,26532,,,,,1341462,9854,2036233,26532 +"2020-09-25","KS",632,,11,,2816,2816,343,50,768,121,446178,9123,,,,250,34,56592,,1366,0,,,,,,,,0,502770,10489,,,,,502770,10489,,0 +"2020-09-25","KY",1149,1140,12,9,5147,5147,553,28,1501,130,,0,,,,,,65066,57366,908,0,,,,,,11677,,0,1244628,18243,53029,24330,,,,0,1244628,18243 +"2020-09-25","LA",5444,5262,21,182,,,570,0,,,2090913,17825,,,,,86,165152,163928,706,0,,,,,,149640,,0,2256065,18531,,,,,,0,2254841,18531 +"2020-09-25","MA",9373,9160,11,213,12619,12619,389,13,,78,2032933,15400,,,,,31,129481,127317,488,0,,,,,167221,111479,,0,3706728,64012,,,119449,124547,2160250,15854,3706728,64012 +"2020-09-25","MD",3917,3772,8,145,15328,15328,344,29,,79,1450125,10346,,120591,,,,122359,122359,559,0,,,11517,,146476,7431,,0,2494019,29092,,,132108,,1572484,10905,2494019,29092 +"2020-09-25","ME",140,139,0,1,442,442,10,0,,2,,0,9740,,,,0,5235,4691,20,0,516,,,,5673,4507,,0,397287,6323,10270,,,,,0,397287,6323 +"2020-09-25","MI",7027,6708,8,319,,,558,0,,139,,0,,,3368935,,52,133377,120526,1040,0,,,,,168708,90216,,0,3537643,39572,289151,,,,,0,3537643,39572 +"2020-09-25","MN",2046,1994,6,52,7391,7391,303,56,2067,148,1256967,13128,,,,,,94189,94189,1177,0,,,,,,84256,1924020,28718,1924020,28718,,,,,1351156,14305,,0 +"2020-09-25","MO",1994,,42,,,,1068,0,,,1152867,11647,,70340,1538424,,,120298,120298,1987,0,,,3475,,126185,,,0,1667432,18080,,,73815,,1273165,13634,1667432,18080 +"2020-09-25","MP",2,2,0,,4,4,,0,,,14776,0,,,,,,69,69,0,0,,,,,,29,,0,14845,0,,,,,14845,0,19835,0 +"2020-09-25","MS",2894,2671,20,223,5607,5607,609,0,,143,630354,3905,,,,,73,96032,88868,722,0,,,,,,85327,,0,726386,4627,38109,54718,,,,0,719222,4370 +"2020-09-25","MT",170,,5,,675,675,140,25,,,,0,,,,,,11564,,322,0,,,,,,8681,,0,326116,4598,,,,,,0,326116,4598 +"2020-09-25","NC",3409,3409,53,,,,903,0,,281,,0,,,,,,204331,199768,6142,0,,,,,,,,0,2909577,38070,,,,,,0,2909577,38070 +"2020-09-25","ND",222,,6,,789,789,89,12,200,25,214749,1087,8895,,,,,19843,19841,431,0,417,,,,,16104,587564,5460,587564,5460,9312,17,,,234634,1521,609021,5814 +"2020-09-25","NE",462,,0,,2259,2259,231,12,,,394573,2482,,,537626,,,42731,,453,0,,,,,51525,31774,,0,590209,5113,,,,,437603,2934,590209,5113 +"2020-09-25","NH",438,,0,,732,732,16,0,233,,239107,0,,,,,,8044,,0,0,,,,,,7325,,0,417689,0,31620,,30901,,247151,0,417689,0 +"2020-09-25","NJ",16093,14306,6,1787,23285,23285,405,33,,75,3276611,26359,,,,,32,206877,202100,627,0,,,,,,,,0,3483488,26986,,,,,,0,3478711,26907 +"2020-09-25","NM",865,,6,,3420,3420,75,18,,,,0,,,,,,28487,,263,0,,,,,,16020,,0,893489,8116,,,,,,0,893489,8116 +"2020-09-25","NV",1573,,9,,,,460,0,,130,603583,5292,,,,,62,77753,77753,556,0,,,,,,,997075,6903,997075,6903,,,,,680480,5998,1017333,13118 +"2020-09-25","NY",25446,,7,,89995,89995,511,0,,154,,0,,,,,76,453755,,908,0,,,,,,,10323463,94818,10323463,94818,,,,,,0,,0 +"2020-09-25","OH",4734,4433,19,301,15127,15127,595,76,3243,194,,0,,,,,98,148894,140683,1150,0,,,,,160666,128369,,0,3029077,36870,,,,,,0,3029077,36870 +"2020-09-25","OK",993,,12,,6192,6192,590,62,,220,1058144,12462,,,1058144,,,82520,82520,1276,0,3764,,,,92923,68911,,0,1140664,13738,76497,,,,,0,1153358,13180 +"2020-09-25","OR",539,,1,,2468,2468,187,30,,40,618633,4011,,,976958,,16,31865,,362,0,,,,,56038,5484,,0,1032996,7391,,,,,648949,4379,1032996,7391 +"2020-09-25","PA",8081,,2,,,,435,0,,,1816397,12927,,,,,58,154203,149410,806,0,,,,,,126446,2921327,33163,2921327,33163,,,,,1965807,13679,,0 +"2020-09-25","PR",635,464,8,171,,,376,0,,67,305972,0,,,395291,,28,21868,21868,712,0,23037,,,,20103,,,0,327840,712,,,,,,0,415664,0 +"2020-09-25","RI",1107,,1,,2725,2725,94,0,,8,305853,2581,,,693170,,4,24181,,-130,0,,,,,34299,,727469,10422,727469,10422,,,,,330034,2451,,0 +"2020-09-25","SC",3297,3114,18,183,8994,8994,773,49,,191,1082565,18166,63469,,1043249,,101,143902,140056,1195,0,6666,9856,,,179372,68854,,0,1226467,19361,70135,38650,,,,0,1222621,19201 +"2020-09-25","SD",216,,6,,1400,1400,194,25,,,163393,1829,,,,,,20554,,457,0,,,,,26549,16831,,0,255928,3391,,,,,183947,2286,255928,3391 +"2020-09-25","TN",2352,2262,42,90,8477,8477,838,64,,250,,0,,,2533011,,119,189454,182542,1910,0,,,,,222922,172618,,0,2755933,33296,,,,,,0,2755933,33296 +"2020-09-25","TX",15364,,97,,,,3221,0,,1051,,0,,,,,,728552,728552,4633,0,35656,17005,,,809734,646143,,0,6397755,55801,394584,186922,,,,0,6397755,55801 +"2020-09-25","UT",448,,4,,3668,3668,190,49,886,76,717197,5904,,,932997,357,,68530,,1411,0,,1849,,1744,75009,53360,,0,1008006,9893,,22051,,13019,784859,6865,1008006,9893 +"2020-09-25","VA",3136,2930,23,206,10806,10806,965,37,,221,,0,,,,,117,144433,137283,941,0,9630,2874,,,163973,,1973499,20534,1973499,20534,141049,32659,,,,0,,0 +"2020-09-25","VI",19,,0,,,,,0,,,18676,142,,,,,,1296,,6,0,,,,,,1209,,0,19972,148,,,,,19980,145,,0 +"2020-09-25","VT",58,58,0,,,,2,0,,,155920,866,,,,,,1734,1731,7,0,,,,,,1576,,0,266178,4445,,,,,157651,873,266178,4445 +"2020-09-25","WA",2080,2080,-1,,7357,7357,401,8,,87,,0,,,,,27,87324,86108,595,0,,,,,,,1783279,39983,1783279,39983,,,,,,0,,0 +"2020-09-25","WI",1284,1274,9,10,6962,6962,543,65,1150,147,1383645,12575,,,,,,117329,110828,2629,0,,,,,,92366,2220895,28444,2220895,28444,,,,,1494473,15079,,0 +"2020-09-25","WV",330,327,5,3,,,177,0,,59,,0,,,,,31,14953,14577,247,0,,,,,,10968,,0,529429,6318,17164,,,,,0,529429,6318 +"2020-09-25","WY",50,,0,,256,256,22,1,,,92406,1071,,,159615,,,5420,4585,115,0,,,,,5007,4450,,0,164622,1969,,,,,96991,1168,164622,1969 +"2020-09-24","AK",45,45,0,,300,300,43,4,,,,0,,,425736,,14,7194,,131,0,,,,,7180,2731,,0,433198,0,,,,,,0,433198,0 +"2020-09-24","AL",2506,2349,18,157,16778,16778,744,80,1679,,944747,6296,,,,931,,148206,133433,1053,0,,,,,,64583,,0,1078180,7277,,,57387,,1078180,7277,,0 +"2020-09-24","AR",1246,1097,17,149,5160,5160,450,62,,216,840737,9436,,,840737,650,97,79049,76676,1086,0,,,,2566,,70737,,0,917413,10466,,,,10922,,0,917413,10466 +"2020-09-24","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-24","AZ",5559,5291,34,268,21942,21942,565,17,,122,1204565,9983,,,,,64,215852,211426,568,0,,,,,,,,0,2105548,20098,,,289012,,1415991,10489,2105548,20098 +"2020-09-24","CA",15314,,110,,,,3484,0,,914,,0,,,,,,790640,790640,3170,0,,,,,,,,0,13952857,73434,,,,,,0,13952857,73434 +"2020-09-24","CO",2033,1678,3,355,7454,7454,258,10,,,795588,8665,154312,,,,,67217,62520,548,0,11561,,,,,,1260861,15116,1260861,15116,165873,,,,858108,9202,,0 +"2020-09-24","CT",4499,3603,2,896,11560,11560,72,113,,,,0,,,1632509,,,56472,54113,157,0,,,,,69430,9310,,0,1704232,23760,,,,,,0,1704232,23760 +"2020-09-24","DC",621,,0,,,,97,0,,29,,0,,,,,21,15106,,56,0,,,,,,11956,367867,4419,367867,4419,,,,,208447,1630,,0 +"2020-09-24","DE",630,553,1,77,,,57,0,,12,257969,1755,,,,,,19947,18916,117,0,,,,,22805,10487,411966,636,411966,636,,,,,277916,1872,,0 +"2020-09-24","FL",13961,,179,,43621,43621,2169,188,,,4486459,20978,460024,449702,6356072,,,684847,669456,2477,0,45080,,44075,,892098,,7732872,58096,7732872,58096,505164,,493810,,5165815,23459,7289544,40594 +"2020-09-24","GA",6822,,49,,27903,27903,1932,154,5120,,,0,,,,,,311046,311046,1368,0,24436,,,,289670,,,0,2824816,21601,297531,,,,,0,2824816,21601 +"2020-09-24","GU",38,,1,,,,33,0,,11,45424,408,,,,,,2263,2263,28,0,3,,,,,1568,,0,47687,436,179,,,,,0,47685,436 +"2020-09-24","HI",122,122,2,,763,763,162,14,,54,275096,2549,,,,,34,11848,11689,167,0,,,,,11640,5125,390360,5108,390360,5108,,,,,286785,2716,395503,5500 +"2020-09-24","IA",1302,,8,,,,305,0,,79,657509,5579,,53670,,,37,81071,81071,1148,0,,,3357,2511,,61509,,0,738580,6727,,,57067,19784,740125,6725,,0 +"2020-09-24","ID",454,416,3,38,1754,1754,147,14,448,40,258700,1646,,,,,,38743,35363,396,0,,,,,,20901,,0,294063,1904,,,,,294063,1904,,0 +"2020-09-24","IL",8774,8538,30,236,,,1713,0,,400,,0,,,,,155,283569,281371,2257,0,,,,,,,,0,5293678,62071,,,,,,0,5293678,62071 +"2020-09-24","IN",3548,3322,18,226,12388,12388,840,76,2462,261,1217372,7890,,,,,83,114236,,899,0,,,,,117524,,,0,2009701,26075,,,,,1331608,8789,2009701,26075 +"2020-09-24","KS",621,,0,,2766,2766,313,0,753,93,437055,0,,,,240,27,55226,,0,0,,,,,,,,0,492281,0,,,,,492281,0,,0 +"2020-09-24","KY",1137,1128,13,9,5119,5119,543,24,1499,122,,0,,,,,,64158,56608,641,0,,,,,,11570,,0,1226385,9606,52994,22028,,,,0,1226385,9606 +"2020-09-24","LA",5423,5241,16,182,,,575,0,,,2073088,16948,,,,,92,164446,163222,577,0,,,,,,149640,,0,2237534,17525,,,,,,0,2236310,17525 +"2020-09-24","MA",9362,9150,15,212,12606,12606,375,14,,75,2017533,18101,,,,,29,128993,126863,481,0,,,,,166664,111479,,0,3642716,85168,,,119164,122954,2144396,18556,3642716,85168 +"2020-09-24","MD",3909,3765,7,144,15299,15299,349,31,,81,1439779,8971,,120591,,,,121800,121800,503,0,,,11517,,145786,7416,,0,2464927,23702,,,132108,,1561579,9474,2464927,23702 +"2020-09-24","ME",140,139,0,1,442,442,14,1,,1,,0,9712,,,,0,5215,4677,44,0,515,,,,5654,4478,,0,390964,7990,10241,,,,,0,390964,7990 +"2020-09-24","MI",7019,6700,6,319,,,558,0,,139,,0,,,3330487,,50,132337,119597,1078,0,,,,,167584,90216,,0,3498071,37781,288257,,,,,0,3498071,37781 +"2020-09-24","MN",2040,1988,3,52,7335,7335,303,32,2049,148,1243839,11988,,,,,,93012,93012,912,0,,,,,,83862,1895302,21435,1895302,21435,,,,,1336851,12900,,0 +"2020-09-24","MO",1952,,5,,,,1056,0,,,1141220,13603,,70130,1521891,,,118311,118311,1365,0,,,3462,,124668,,,0,1649352,15489,,,73592,,1259531,14968,1649352,15489 +"2020-09-24","MP",2,2,0,,4,4,,0,,,14776,0,,,,,,69,69,0,0,,,,,,29,,0,14845,0,,,,,14845,0,19835,0 +"2020-09-24","MS",2874,2651,4,223,5607,5607,631,0,,149,626449,4311,,,,,84,95310,88403,737,0,,,,,,85327,,0,721759,5048,37921,53678,,,,0,714852,4812 +"2020-09-24","MT",165,,0,,650,650,128,49,,,,0,,,,,,11242,,330,0,,,,,,8634,,0,321518,4358,,,,,,0,321518,4358 +"2020-09-24","NC",3356,3356,40,,,,902,0,,279,,0,,,,,,198189,198189,1688,0,,,,,,,,0,2871507,28179,,,,,,0,2871507,28179 +"2020-09-24","ND",216,,10,,777,777,89,14,194,26,213662,791,8847,,,,,19412,19410,467,0,412,,,,,15757,582104,6625,582104,6625,9259,17,,,233113,1261,603207,7026 +"2020-09-24","NE",462,,1,,2247,2247,200,33,,,392091,2774,,,533064,,,42278,,493,0,,,,,50979,31383,,0,585096,4956,,,,,434669,3268,585096,4956 +"2020-09-24","NH",438,,0,,732,732,16,4,233,,239107,2625,,,,,,8044,,37,0,,,,,,7325,,0,417689,4298,31620,,30901,,247151,2662,417689,4298 +"2020-09-24","NJ",16087,14300,9,1787,23252,23252,433,37,,88,3250252,28493,,,,,34,206250,201552,644,0,,,,,,,,0,3456502,29137,,,,,,0,3451804,29057 +"2020-09-24","NM",859,,2,,3402,3402,66,14,,,,0,,,,,,28224,,237,0,,,,,,15825,,0,885373,6967,,,,,,0,885373,6967 +"2020-09-24","NV",1564,,8,,,,468,0,,137,598291,3174,,,,,67,77197,77197,390,0,,,,,,,990172,8362,990172,8362,,,,,674482,3574,1004215,7908 +"2020-09-24","NY",25439,,2,,89995,89995,500,0,,145,,0,,,,,72,452847,,955,0,,,,,,,10228645,92953,10228645,92953,,,,,,0,,0 +"2020-09-24","OH",4715,4414,28,301,15051,15051,586,74,3228,199,,0,,,,,105,147744,139632,991,0,,,,,159665,127239,,0,2992207,25118,,,,,,0,2992207,25118 +"2020-09-24","OK",981,,11,,6130,6130,593,73,,227,1045682,11517,,,1045682,,,81244,81244,1083,0,3764,,,,92217,67807,,0,1126926,12600,76497,,,,,0,1140178,12545 +"2020-09-24","OR",538,,6,,2438,2438,188,19,,45,614622,3354,,,969855,,16,31503,,190,0,,,,,55750,5475,,0,1025605,8222,,,,,644570,3522,1025605,8222 +"2020-09-24","PA",8079,,17,,,,422,0,,,1803470,13058,,,,,53,153397,148658,853,0,,,,,,125785,2888164,30078,2888164,30078,,,,,1952128,13854,,0 +"2020-09-24","PR",627,456,10,171,,,364,0,,65,305972,0,,,395291,,33,21156,21156,717,0,22686,,,,20103,,,0,327128,717,,,,,,0,415664,0 +"2020-09-24","RI",1106,,4,,2725,2725,94,12,,8,303272,2329,,,682936,,4,24311,,134,0,,,,,34111,,717047,10469,717047,10469,,,,,327583,2463,,0 +"2020-09-24","SC",3279,3097,17,182,8945,8945,804,39,,194,1064399,15501,63259,,1025356,,106,142707,139021,1021,0,6603,9726,,,178064,68079,,0,1207106,16522,69862,36799,,,,0,1203420,16351 +"2020-09-24","SD",210,,8,,1375,1375,194,8,,,161564,1066,,,,,,20097,,463,0,,,,,26100,16596,,0,252537,2887,,,,,181661,1529,252537,2887 +"2020-09-24","TN",2310,2221,35,89,8413,8413,813,75,,260,,0,,,2501811,,114,187544,180793,835,0,,,,,220826,171153,,0,2722637,15920,,,,,,0,2722637,15920 +"2020-09-24","TX",15267,,138,,,,3204,0,,1051,,0,,,,,,723919,723919,4320,0,35421,16771,,,806276,642169,,0,6341954,54762,391678,178767,,,,0,6341954,54762 +"2020-09-24","UT",444,,0,,3619,3619,216,35,884,76,711293,7304,,,924127,356,,67119,,1198,0,,1818,,1716,73986,52860,,0,998113,12022,,20139,,12236,777994,8695,998113,12022 +"2020-09-24","VA",3113,2907,24,206,10769,10769,982,51,,219,,0,,,,,112,143492,136448,902,0,9575,2806,,,163164,,1952965,30359,1952965,30359,140516,29340,,,,0,,0 +"2020-09-24","VI",19,,0,,,,,0,,,18534,194,,,,,,1290,,12,0,,,,,,1208,,0,19824,206,,,,,19835,210,,0 +"2020-09-24","VT",58,58,0,,,,3,0,,,155054,865,,,,,,1727,1724,2,0,,,,,,1566,,0,261733,3662,,,,,156778,867,261733,3662 +"2020-09-24","WA",2081,2081,11,,7349,7349,384,35,,101,,0,,,,,27,86729,85540,599,0,,,,,,,1743296,2397,1743296,2397,,,,,,0,,0 +"2020-09-24","WI",1275,1265,7,10,6897,6897,530,76,1006,151,1371070,10887,,,,,,114700,108324,2478,0,,,,,,90726,2192451,31123,2192451,31123,,,,,1479394,13279,,0 +"2020-09-24","WV",325,323,6,2,,,173,0,,57,,0,,,,,30,14706,14339,202,0,,,,,,10831,,0,523111,3400,17097,,,,,0,523111,3400 +"2020-09-24","WY",50,,0,,255,255,19,2,,,91335,1511,,,157755,,,5305,4488,136,0,,,,,4898,4364,,0,162653,2923,,,,,95823,1768,162653,2923 +"2020-09-23","AK",45,45,0,,296,296,43,1,,,,0,,,425736,,14,7063,,76,0,,,,,7180,2731,,0,433198,2007,,,,,,0,433198,2007 +"2020-09-23","AL",2488,2335,31,153,16698,16698,768,94,1669,,938451,4886,,,,920,,147153,132452,569,0,,,,,,64583,,0,1070903,5350,,,57192,,1070903,5350,,0 +"2020-09-23","AR",1229,1080,20,149,5098,5098,460,43,,221,831301,8076,,,831301,640,89,77963,75646,982,0,,,,2506,,69952,,0,906947,8950,,,,9453,,0,906947,8950 +"2020-09-23","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-23","AZ",5525,5258,27,267,21925,21925,583,25,,114,1194582,8774,,,,,62,215284,210920,438,0,,,,,,,,0,2085450,21703,,,287909,,1405502,9084,2085450,21703 +"2020-09-23","CA",15204,,133,,,,3557,0,,905,,0,,,,,,787470,787470,3146,0,,,,,,,,0,13879423,75368,,,,,,0,13879423,75368 +"2020-09-23","CO",2030,1676,5,354,7444,7444,259,28,,,786923,7865,153766,,,,,66669,61983,616,0,11524,,,,,,1245745,13457,1245745,13457,165290,,,,848906,8454,,0 +"2020-09-23","CT",4497,3601,1,896,11447,11447,73,0,,,,0,,,1609029,,,56315,53969,155,0,,,,,69174,9204,,0,1680472,27695,,,,,,0,1680472,27695 +"2020-09-23","DC",621,,0,,,,92,0,,26,,0,,,,,17,15050,,29,0,,,,,,11929,363448,1815,363448,1815,,,,,206817,652,,0 +"2020-09-23","DE",629,552,1,77,,,61,0,,12,256214,1138,,,,,,19830,18798,69,0,,,,,22773,10443,411330,1428,411330,1428,,,,,276044,1207,,0 +"2020-09-23","FL",13782,,203,,43433,43433,2254,172,,,4465481,21048,460024,449702,6318956,,,682370,667341,2594,0,45080,,44075,,888751,,7674776,48926,7674776,48926,505164,,493810,,5142356,23636,7248950,39828 +"2020-09-23","GA",6773,,96,,27749,27749,1924,259,5077,,,0,,,,,,309678,309678,1457,0,24258,,,,287839,,,0,2803215,19788,296466,,,,,0,2803215,19788 +"2020-09-23","GU",37,,0,,,,33,0,,13,45016,378,,,,,,2235,2235,45,0,3,,,,,1543,,0,47251,423,175,,,,,0,47249,423 +"2020-09-23","HI",120,120,0,,749,749,181,14,,61,272547,1426,,,,,39,11681,11522,63,0,,,,,11469,4992,385252,3079,385252,3079,,,,,284069,1489,390003,2803 +"2020-09-23","IA",1294,,8,,,,301,0,,77,651930,5735,,53215,,,37,79923,79923,1036,0,,,3345,2434,,60350,,0,731853,6771,,,56600,19021,733400,6780,,0 +"2020-09-23","ID",451,413,4,38,1740,1740,130,14,447,39,257054,884,,,,,,38347,35105,446,0,,,,,,20674,,0,292159,1248,,,,,292159,1248,,0 +"2020-09-23","IL",8744,8508,22,236,,,1563,0,,351,,0,,,,,144,281312,279114,1848,0,,,,,,,,0,5231607,46391,,,,,,0,5231607,46391 +"2020-09-23","IN",3530,3305,10,225,12312,12312,815,47,2448,272,1209482,6668,,,,,78,113337,,711,0,,,,,116484,,,0,1983626,31028,,,,,1322819,7379,1983626,31028 +"2020-09-23","KS",621,,21,,2766,2766,313,60,753,93,437055,6323,,,,240,27,55226,,1267,0,,,,,,,,0,492281,7590,,,,,492281,7590,,0 +"2020-09-23","KY",1124,1115,5,9,5095,5095,530,20,1499,123,,0,,,,,,63517,56154,786,0,,,,,,11480,,0,1216779,148313,52939,21830,,,,0,1216779,148313 +"2020-09-23","LA",5407,5225,21,182,,,592,0,,,2056140,12419,,,,,94,163869,162645,616,0,,,,,,149640,,0,2220009,13035,,,,,,0,2218785,12850 +"2020-09-23","MA",9347,9135,19,212,12592,12592,361,21,,71,1999432,20120,,,,,26,128512,126408,543,0,,,,,166112,111479,,0,3557548,80869,,,118843,121231,2125840,20662,3557548,80869 +"2020-09-23","MD",3902,3756,7,146,15268,15268,332,31,,79,1430808,7706,,120591,,,,121297,121297,385,0,,,11517,,145163,7396,,0,2441225,19158,,,132108,,1552105,8091,2441225,19158 +"2020-09-23","ME",140,139,0,1,441,441,14,-1,,2,,0,9689,,,,0,5171,4643,25,0,515,,,,5624,4445,,0,382974,5712,10218,,,,,0,382974,5712 +"2020-09-23","MI",7013,6692,16,321,,,501,0,,146,,0,,,3293848,,58,131259,118615,902,0,,,,,166442,90216,,0,3460290,34332,287162,,,,,0,3460290,34332 +"2020-09-23","MN",2037,1985,6,52,7303,7303,303,50,2045,148,1231851,5840,,,,,,92100,92100,678,0,,,,,,83507,1873867,10173,1873867,10173,,,,,1323951,6518,,0 +"2020-09-23","MO",1947,,83,,,,989,0,,,1127617,1234,,69846,1508256,,,116946,116946,1580,0,,,3388,,122803,,,0,1633863,5540,,,73234,,1244563,2814,1633863,5540 +"2020-09-23","MP",2,2,0,,4,4,,0,,,14776,460,,,,,,69,69,0,0,,,,,,29,,0,14845,460,,,,,14845,470,19835,920 +"2020-09-23","MS",2870,2647,24,223,5607,5607,620,0,,148,622138,3658,,,,,74,94573,87902,552,0,,,,,,85327,,0,716711,4210,37700,51862,,,,0,710040,4031 +"2020-09-23","MT",165,,2,,601,601,124,17,,,,0,,,,,,10912,,212,0,,,,,,8510,,0,317160,3151,,,,,,0,317160,3151 +"2020-09-23","NC",3316,3316,30,,,,912,0,,281,,0,,,,,,196501,196501,952,0,,,,,,,,0,2843328,12334,,,,,,0,2843328,12334 +"2020-09-23","ND",206,,7,,763,763,89,11,192,25,212871,1309,8847,,,,,18945,18943,472,0,412,,,,,15476,575479,6939,575479,6939,9259,17,,,231852,1782,596181,7430 +"2020-09-23","NE",461,,9,,2214,2214,197,6,,,389317,2659,,,528685,,,41785,,397,0,,,,,50411,31212,,0,580140,3696,,,,,431401,3060,580140,3696 +"2020-09-23","NH",438,,0,,728,728,17,1,230,,236482,945,,,,,,8007,,17,0,,,,,,7303,,0,413391,2925,31557,,30839,,244489,962,413391,2925 +"2020-09-23","NJ",16078,14291,8,1787,23215,23215,459,45,,90,3221759,24690,,,,,31,205606,200988,490,0,,,,,,,,0,3427365,25180,,,,,,0,3422747,25098 +"2020-09-23","NM",857,,3,,3388,3388,72,17,,,,0,,,,,,27987,,197,0,,,,,,15669,,0,878406,6075,,,,,,0,878406,6075 +"2020-09-23","NV",1556,,10,,,,479,0,,134,595117,2341,,,,,69,76807,76807,509,0,,,,,,,981810,10629,981810,10629,,,,,670908,2644,996307,4347 +"2020-09-23","NY",25437,,5,,89995,89995,490,0,,141,,0,,,,,68,451892,,665,0,,,,,,,10135692,70930,10135692,70930,,,,,,0,,0 +"2020-09-23","OH",4687,4387,52,300,14977,14977,593,78,3218,200,,0,,,,,113,146753,138712,903,0,,,,,158930,126023,,0,2967089,23618,,,,,,0,2967089,23618 +"2020-09-23","OK",970,,8,,6057,6057,612,61,,226,1034165,11398,,,1034165,,,80161,80161,1089,0,3764,,,,91214,66779,,0,1114326,12487,76497,,,,,0,1127633,12755 +"2020-09-23","OR",532,,3,,2419,2419,182,24,,42,611268,3465,,,961972,,17,31313,,318,0,,,,,55411,5431,,0,1017383,9702,,,,,641048,3764,1017383,9702 +"2020-09-23","PA",8062,,39,,,,421,0,,,1790412,12496,,,,,54,152544,147862,898,0,,,,,,123560,2858086,24542,2858086,24542,,,,,1938274,13288,,0 +"2020-09-23","PR",617,447,4,170,,,376,0,,63,305972,0,,,395291,,36,20439,20439,40,0,22221,,,,20103,,,0,326411,40,,,,,,0,415664,0 +"2020-09-23","RI",1102,,3,,2713,2713,86,9,,9,300943,2596,,,672626,,5,24177,,133,0,,,,,33952,,706578,9770,706578,9770,,,,,325120,2729,,0 +"2020-09-23","SC",3262,3085,19,177,8906,8906,786,55,,190,1048898,17203,63014,,1010510,,103,141686,138171,897,0,6470,9523,,,176559,67491,,0,1190584,18100,69484,34200,,,,0,1187069,17968 +"2020-09-23","SD",202,,0,,1367,1367,192,44,,,160498,1341,,,,,,19634,,445,0,,,,,25612,16324,,0,249650,2673,,,,,180132,1786,249650,2673 +"2020-09-23","TN",2275,2192,14,83,8338,8338,919,75,,286,,0,,,2486825,,114,186709,180083,1561,0,,,,,219892,169649,,0,2706717,21702,,,,,,0,2706717,21702 +"2020-09-23","TX",15129,,135,,,,3195,0,,1041,,0,,,,,,719599,719599,3392,0,35217,16495,,,802918,618054,,0,6287192,53089,390538,173861,,,,0,6287192,53089 +"2020-09-23","UT",444,,1,,3584,3584,190,34,876,65,703989,6674,,,913551,354,,65921,,877,0,,1760,,1661,72540,52357,,0,986091,10880,,19120,,11768,769299,7724,986091,10880 +"2020-09-23","VA",3089,2882,29,207,10718,10718,916,43,,215,,0,,,,,113,142590,135626,580,0,9507,2739,,,161672,,1922606,11026,1922606,11026,139981,26970,,,,0,,0 +"2020-09-23","VI",19,,0,,,,,0,,,18340,152,,,,,,1278,,2,0,,,,,,1198,,0,19618,154,,,,,19625,146,,0 +"2020-09-23","VT",58,58,0,,,,2,0,,,154189,362,,,,,,1725,1722,1,0,,,,,,1565,,0,258071,1602,,,,,155911,363,258071,1602 +"2020-09-23","WA",2070,2070,0,,7314,7314,361,0,,90,,0,,,,,32,86130,84971,669,0,,,,,,,1740899,0,1740899,0,,,,,,0,,0 +"2020-09-23","WI",1268,1259,9,9,6821,6821,509,56,998,140,1360183,11691,,,,,,112222,105932,1895,0,,,,,,89393,2161328,21641,2161328,21641,,,,,1466115,13453,,0 +"2020-09-23","WV",319,317,2,2,,,163,0,,61,,0,,,,,31,14504,14160,120,0,,,,,,10721,,0,519711,2913,17036,,,,,0,519711,2913 +"2020-09-23","WY",50,,1,,253,253,21,0,,,89824,0,,,155005,,,5169,4368,153,0,,,,,4725,4277,,0,159730,2750,,,,,94055,0,159730,2750 +"2020-09-22","AK",45,45,0,,295,295,43,3,,,,0,,,423762,,14,6987,,57,0,,,,,7147,2668,,0,431191,2546,,,,,,0,431191,2546 +"2020-09-22","AL",2457,2304,18,153,16604,16604,796,117,1659,,933565,5453,,,,910,,146584,131988,804,0,,,,,,61232,,0,1065553,6036,,,57042,,1065553,6036,,0 +"2020-09-22","AR",1209,1060,12,149,5055,5055,453,69,,234,823225,5987,,,823225,638,87,76981,74772,617,0,,,,2387,,69184,,0,897997,6473,,,,10427,,0,897997,6473 +"2020-09-22","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-22","AZ",5498,5230,20,268,21900,21900,527,22,,122,1185808,9097,,,,,47,214846,210610,595,0,,,,,,,,0,2063747,21299,,,284225,,1396418,9791,2063747,21299 +"2020-09-22","CA",15071,,53,,,,3520,0,,923,,0,,,,,,784324,784324,2630,0,,,,,,,,0,13804055,131273,,,,,,0,13804055,131273 +"2020-09-22","CO",2025,1672,7,353,7416,7416,230,43,,,779058,5573,155465,,,,,66053,61394,654,0,11645,,,,,,1232288,13151,1232288,13151,167110,,,,840452,6175,,0 +"2020-09-22","CT",4496,3601,1,895,11447,11447,70,0,,,,0,,,1581590,,,56160,53814,136,0,,,,,68934,9204,,0,1652777,24272,,,,,,0,1652777,24272 +"2020-09-22","DC",621,,0,,,,95,0,,22,,0,,,,,19,15021,,43,0,,,,,,11886,361633,3889,361633,3889,,,,,206165,1384,,0 +"2020-09-22","DE",628,551,1,77,,,62,0,,14,255076,1530,,,,,,19761,18733,94,0,,,,,22729,10411,409902,3412,409902,3412,,,,,274837,1624,,0 +"2020-09-22","FL",13579,,99,,43261,43261,2319,228,,,4444433,16612,460024,449702,6282680,,,679776,665194,2414,0,45080,,44075,,885350,,7625850,40522,7625850,40522,505164,,493810,,5118720,19027,7209122,34042 +"2020-09-22","GA",6677,,73,,27490,27490,1960,96,5026,,,0,,,,,,308221,308221,882,0,24217,,,,286876,,,0,2783427,12564,296044,,,,,0,2783427,12564 +"2020-09-22","GU",37,,2,,,,39,0,,15,44638,431,,,,,,2190,2190,43,0,3,,,,,1507,,0,46828,474,175,,,,,0,46826,474 +"2020-09-22","HI",120,120,0,,735,735,185,5,,51,271121,1106,,,,,40,11618,11459,56,0,,,,,11410,4888,382173,1865,382173,1865,,,,,282580,1162,387200,2097 +"2020-09-22","IA",1286,,12,,,,285,0,,72,646195,2939,,52811,,,34,78887,78887,548,0,,,3339,2416,,59216,,0,725082,3487,,,56190,18946,726620,3492,,0 +"2020-09-22","ID",447,409,4,38,1726,1726,130,8,446,39,256170,1375,,,,,,37901,34741,410,0,,,,,,20485,,0,290911,1748,,,,,290911,1748,,0 +"2020-09-22","IL",8722,8486,29,236,,,1455,0,,367,,0,,,,,153,279464,277266,1531,0,,,,,,,,0,5185216,41829,,,,,,0,5185216,41829 +"2020-09-22","IN",3520,3295,8,225,12265,12265,759,81,2439,254,1202814,6196,,,,,79,112626,,599,0,,,,,115413,,,0,1952598,27439,,,,,1315440,6795,1952598,27439 +"2020-09-22","KS",600,,0,,2706,2706,216,0,741,60,430732,0,,,,230,23,53959,,0,0,,,,,,,,0,484691,0,,,,,484691,0,,0 +"2020-09-22","KY",1119,1110,7,9,5075,5075,511,24,1494,133,,0,,,,,,62731,55577,814,0,,,,,,11361,,0,1068466,9983,52158,21407,,,,0,1068466,9983 +"2020-09-22","LA",5386,5218,11,168,,,571,0,,,2043721,20430,,,,,96,163253,162214,752,0,,,,,,145570,,0,2206974,21182,,,,,,0,2205935,21182 +"2020-09-22","MA",9328,9118,11,210,12571,12571,371,18,,67,1979312,8992,,,,,27,127969,125866,173,0,,,,,165412,109397,,0,3476679,40518,,,118447,120496,2105178,9135,3476679,40518 +"2020-09-22","MD",3895,3748,12,147,15237,15237,309,66,,77,1423102,6041,,117647,,,,120912,120912,344,0,,,10993,,144660,7394,,0,2422067,14449,,,128640,,1544014,6385,2422067,14449 +"2020-09-22","ME",140,139,0,1,442,442,17,2,,4,,0,9676,,,,0,5146,4617,40,0,515,,,,5600,4407,,0,377262,3281,10205,,,,,0,377262,3281 +"2020-09-22","MI",6997,6680,16,317,,,501,0,,146,,0,,,3260521,,56,130357,117910,695,0,,,,,165437,90216,,0,3425958,20184,285455,,,,,0,3425958,20184 +"2020-09-22","MN",2031,1979,10,52,7253,7253,290,54,2027,136,1226011,4016,,,,,,91422,91422,480,0,,,,,,82833,1863694,8386,1863694,8386,,,,,1317433,4496,,0 +"2020-09-22","MO",1864,,57,,,,981,0,,,1126383,21131,,69647,1502893,,,115366,115366,1059,0,,,3368,,122668,,,0,1628323,35348,,,73015,,1241749,22190,1628323,35348 +"2020-09-22","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,69,69,0,0,,,,,,29,,0,14385,0,,,,,14375,0,18915,0 +"2020-09-22","MS",2846,2625,36,221,5607,5607,642,0,,147,618480,5130,,,,,74,94021,87529,465,0,,,,,,85327,,0,712501,5595,37439,50385,,,,0,706009,5499 +"2020-09-22","MT",163,,3,,584,584,111,8,,,,0,,,,,,10700,,271,0,,,,,,7937,,0,314009,2747,,,,,,0,314009,2747 +"2020-09-22","NC",3286,3286,39,,,,905,0,,277,,0,,,,,,195549,195549,1168,0,,,,,,,,0,2830994,16001,,,,,,0,2830994,16001 +"2020-09-22","ND",199,,3,,752,752,92,22,192,26,211562,295,8833,,,,,18473,18471,264,0,407,,,,,15220,568540,2697,568540,2697,9240,11,,,230070,559,588751,2781 +"2020-09-22","NE",452,,10,,2208,2208,185,14,,,386658,1925,,,525419,,,41388,,305,0,,,,,49986,31047,,0,576444,4420,,,,,428341,2231,576444,4420 +"2020-09-22","NH",438,,0,,727,727,11,1,230,,235537,1247,,,,,,7990,,38,0,,,,,,7259,,0,410466,3133,31505,,30781,,243527,1285,410466,3133 +"2020-09-22","NJ",16070,14285,7,1785,23170,23170,417,35,,80,3197069,44040,,,,,34,205116,200580,510,0,,,,,,,,0,3402185,44550,,,,,,0,3397649,44858 +"2020-09-22","NM",854,,3,,3371,3371,69,13,,,,0,,,,,,27790,,107,0,,,,,,15586,,0,872331,5648,,,,,,0,872331,5648 +"2020-09-22","NV",1546,,15,,,,441,0,,140,592776,2020,,,,,75,76298,76298,262,0,,,,,,,971181,7706,971181,7706,,,,,668264,2202,991960,3941 +"2020-09-22","NY",25432,,4,,89995,89995,470,0,,133,,0,,,,,67,451227,,754,0,,,,,,,10064762,83997,10064762,83997,,,,,,0,,0 +"2020-09-22","OH",4635,4338,12,297,14899,14899,593,70,3210,196,,0,,,,,115,145850,137888,685,0,,,,,158308,124774,,0,2943471,29718,,,,,,0,2943471,29718 +"2020-09-22","OK",962,,14,,5996,5996,628,100,,244,1022767,27070,,,1022767,,,79072,79072,1164,0,3764,,,,90327,65482,,0,1101839,28234,76497,,,,,0,1114878,30576 +"2020-09-22","OR",529,,3,,2395,2395,169,39,,34,607803,2535,,,952638,,13,30995,,194,0,,,,,55043,5431,,0,1007681,4482,,,,,637284,9333,1007681,4482 +"2020-09-22","PA",8023,,19,,,,429,0,,,1777916,10735,,,,,58,151646,147070,834,0,,,,,,122833,2833544,27131,2833544,27131,,,,,1924986,11524,,0 +"2020-09-22","PR",613,443,4,170,,,369,0,,63,305972,0,,,395291,,42,20399,20399,88,0,22197,,,,20103,,,0,326371,88,,,,,,0,415664,0 +"2020-09-22","RI",1099,,2,,2704,2704,82,11,,10,298347,1713,,,663017,,7,24044,,112,0,,,,,33791,,696808,6527,696808,6527,,,,,322391,1825,,0 +"2020-09-22","SC",3243,3067,31,176,8851,8851,768,72,,187,1031695,25701,62577,,993865,,105,140789,137406,2665,0,6349,8954,,,175236,68748,,0,1172484,28366,68926,30106,,,,0,1169101,28223 +"2020-09-22","SD",202,,0,,1323,1323,178,26,,,159157,1003,,,,,,19189,,320,0,,,,,25194,16170,,0,246977,1986,,,,,178346,1323,246977,1986 +"2020-09-22","TN",2261,2178,28,83,8263,8263,914,64,,297,,0,,,2466913,,120,185148,178759,739,0,,,,,218102,167778,,0,2685015,11828,,,,,,0,2685015,11828 +"2020-09-22","TX",14994,,77,,,,3207,0,,1065,,0,,,,,,716207,716207,17820,0,35026,16231,,,799937,613896,,0,6234103,55380,389207,167276,,,,0,6234103,55380 +"2020-09-22","UT",443,,2,,3550,3550,183,30,869,63,697315,5619,,,903790,352,,65044,,650,0,,1686,,1588,71421,51945,,0,975211,8162,,17730,,11206,761575,6472,975211,8162 +"2020-09-22","VA",3060,2853,39,207,10675,10675,940,62,,213,,0,,,,,113,142010,135101,872,0,9483,2649,,,161087,,1911580,12943,1911580,12943,139724,22823,,,,0,,0 +"2020-09-22","VI",19,,0,,,,,0,,,18188,145,,,,,,1276,,7,0,,,,,,1195,,0,19464,152,,,,,19479,165,,0 +"2020-09-22","VT",58,58,0,,,,1,0,,,153827,510,,,,,,1724,1721,2,0,,,,,,1557,,0,256469,953,,,,,155548,512,256469,953 +"2020-09-22","WA",2070,2070,33,,7314,7314,487,52,,85,,0,,,,,32,85461,84325,196,0,,,,,,,1740899,4343,1740899,4343,,,,,,0,,0 +"2020-09-22","WI",1259,1251,7,8,6765,6765,474,73,991,134,1348492,10865,,,,,,110327,104170,1739,0,,,,,,88131,2139687,18473,2139687,18473,,,,,1452662,12537,,0 +"2020-09-22","WV",317,315,5,2,,,164,0,,58,,0,,,,,28,14384,14044,213,0,,,,,,10524,,0,516798,3256,17008,,,,,0,516798,3256 +"2020-09-22","WY",49,,0,,253,253,21,6,,,89824,637,,,152398,,,5016,4231,72,0,,,,,4582,4230,,0,156980,3087,,,,,94055,679,156980,3087 +"2020-09-21","AK",45,45,0,,292,292,47,5,,,,0,,,421275,,13,6930,,70,0,,,,,7089,2439,,0,428645,1720,,,,,,0,428645,1720 +"2020-09-21","AL",2439,2292,2,147,16487,16487,802,260,1645,,928112,4746,,,,904,,145780,131405,818,0,,,,,,61232,,0,1059517,5500,,,56961,,1059517,5500,,0 +"2020-09-21","AR",1197,1048,16,149,4986,4986,439,19,,228,817238,6944,,,817238,632,95,76364,74286,641,0,,,,2242,,66934,,0,891524,7540,,,,10101,,0,891524,7540 +"2020-09-21","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-21","AZ",5478,5186,2,292,21878,21878,472,2,,119,1176711,6805,,,,,57,214251,209916,233,0,,,,,,,,0,2042448,7122,,,283791,,1386627,7020,2042448,7122 +"2020-09-21","CA",15018,,31,,,,3459,0,,960,,0,,,,,,781694,781694,3294,0,,,,,,,,0,13672782,149624,,,,,,0,13672782,149624 +"2020-09-21","CO",2018,1666,4,352,7373,7373,239,10,,,773485,5633,155187,,,,,65399,60792,542,0,11624,,,,,,1219137,10712,1219137,10712,166809,,,,834277,6169,,0 +"2020-09-21","CT",4495,3600,3,895,11447,11447,68,0,,,,0,,,1557580,,,56024,53692,497,0,,,,,68682,9204,,0,1628505,7621,,,,,,0,1628505,7621 +"2020-09-21","DC",621,,1,,,,88,0,,26,,0,,,,,17,14978,,23,0,,,,,,11856,357744,2600,357744,2600,,,,,204781,682,,0 +"2020-09-21","DE",627,550,6,77,,,53,0,,17,253546,1691,,,,,,19667,18648,101,0,,,,,22627,10376,406490,3461,406490,3461,,,,,273213,1792,,0 +"2020-09-21","FL",13480,,21,,43033,43033,2266,94,,,4427821,16486,460024,449702,6251909,,,677362,663172,1671,0,45080,,44075,,882212,,7585328,38280,7585328,38280,505164,,493810,,5099693,44738,7175080,32367 +"2020-09-21","GA",6604,,2,,27394,27394,1970,17,5005,,,0,,,,,,307339,307339,1184,0,24197,,,,285951,,,0,2770863,20041,295904,,,,,0,2770863,20041 +"2020-09-21","GU",35,,1,,,,38,0,,18,44207,366,,,,,,2147,2147,30,0,3,,,,,1505,,0,46354,396,175,,,,,0,46352,701 +"2020-09-21","HI",120,120,0,,730,730,185,4,,51,270015,1492,,,,,40,11562,11403,77,0,,,,,11356,4759,380308,3654,380308,3654,,,,,281418,1678,385103,3532 +"2020-09-21","IA",1274,,9,,,,271,0,,74,643256,2656,,52582,,,35,78339,78339,660,0,,,3326,2401,,57942,,0,721595,3316,,,55948,18817,723128,3311,,0 +"2020-09-21","ID",443,405,2,38,1718,1718,146,7,443,51,254795,2114,,,,,,37491,34368,244,0,,,,,,20304,,0,289163,2333,,,,,289163,2333,,0 +"2020-09-21","IL",8693,8457,7,236,,,1436,0,,364,,0,,,,,153,277933,275735,1477,0,,,,,,,,0,5143387,38234,,,,,,0,5143387,38234 +"2020-09-21","IN",3512,3287,6,225,12184,12184,766,41,2428,228,1196618,6183,,,,,72,112027,,522,0,,,,,114271,,,0,1925159,4272,,,,,1308645,6705,1925159,4272 +"2020-09-21","KS",600,,4,,2706,2706,216,35,741,60,430732,8268,,,,230,23,53959,,1674,0,,,,,,,,0,484691,9942,,,,,484691,9942,,0 +"2020-09-21","KY",1112,1103,1,9,5051,5051,496,25,1488,114,,0,,,,,,61917,54996,375,0,,,,,,11283,,0,1058483,10488,51575,21017,,,,0,1058483,10488 +"2020-09-21","LA",5375,5207,9,168,,,587,0,,,2023291,6550,,,,,93,162501,161462,243,0,,,,,,145570,,0,2185792,6793,,,,,,0,2184753,6793 +"2020-09-21","MA",9317,9107,7,210,12553,12553,367,8,,69,1970320,10579,,,,,31,127796,125723,256,0,,,,,165228,109397,,0,3436161,36649,,,118364,119095,2096043,10823,3436161,36649 +"2020-09-21","MD",3883,3739,4,144,15171,15171,290,52,,71,1417061,7741,,117647,,,,120568,120568,412,0,,,10993,,144212,7378,,0,2407618,17349,,,128640,,1537629,8153,2407618,17349 +"2020-09-21","ME",140,139,1,1,440,440,17,1,,6,,0,9665,,,,1,5106,4586,27,0,513,,,,5564,4384,,0,373981,2759,10192,,,,,0,373981,2759 +"2020-09-21","MI",6981,6665,12,316,,,501,0,,146,,0,,,3241005,,64,129662,117406,1575,0,,,,,164769,90216,,0,3405774,52088,285076,,,,,0,3405774,52088 +"2020-09-21","MN",2021,1969,4,52,7199,7199,255,36,2014,128,1221995,8537,,,,,,90942,90942,925,0,,,,,,82174,1855308,16916,1855308,16916,,,,,1312937,9462,,0 +"2020-09-21","MO",1807,,12,,,,1022,0,,,1105252,5588,,69183,1468805,,,114307,114307,1463,0,,,3346,,121430,,,0,1592975,8991,,,72529,,1219559,7051,1592975,8991 +"2020-09-21","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,69,69,1,0,,,,,,29,,0,14385,1,,,,,14375,0,18915,0 +"2020-09-21","MS",2810,2591,0,219,5607,5607,621,108,,162,613350,3551,,,,,77,93556,87160,192,0,,,,,,85327,,0,706906,3743,37165,49300,,,,0,700510,3892 +"2020-09-21","MT",160,,3,,576,576,108,6,,,,0,,,,,,10429,,130,0,,,,,,7876,,0,311262,8449,,,,,,0,311262,8449 +"2020-09-21","NC",3247,3247,4,,,,885,0,,277,,0,,,,,,194381,194381,800,0,,,,,,,,0,2814993,24679,,,,,,0,2814993,24679 +"2020-09-21","ND",196,,1,,730,730,87,7,186,23,211267,970,8800,,,,,18209,18207,284,0,403,,,,,14841,565843,3244,565843,3244,9203,11,,,229511,1256,585970,3341 +"2020-09-21","NE",442,,0,,2194,2194,170,0,,,384733,2170,,,521381,,,41083,,286,0,,,,,49609,30509,,0,572024,3667,,,,,426110,2457,572024,3667 +"2020-09-21","NH",438,,0,,726,726,11,1,230,,234290,1836,,,,,,7952,,5,0,,,,,,7226,,0,407333,5644,31475,,30754,,242242,1841,407333,5644 +"2020-09-21","NJ",16063,14278,2,1785,23135,23135,349,5,,87,3153029,0,,,,,32,204606,200154,435,0,,,,,,,,0,3357635,435,,,,,,0,3352791,0 +"2020-09-21","NM",851,,2,,3358,3358,71,17,,,,0,,,,,,27683,,104,0,,,,,,15518,,0,866683,3784,,,,,,0,866683,3784 +"2020-09-21","NV",1531,,0,,,,449,0,,130,590756,1376,,,,,81,76036,76036,232,0,,,,,,,963475,2104,963475,2104,,,,,666062,1583,988019,3352 +"2020-09-21","NY",25428,,1,,89995,89995,468,0,,134,,0,,,,,66,450473,,573,0,,,,,,,9980765,58319,9980765,58319,,,,,,0,,0 +"2020-09-21","OH",4623,4325,8,298,14829,14829,592,56,3199,188,,0,,,,,108,145165,137309,856,0,,,,,157583,123423,,0,2913753,33507,,,,,,0,2913753,33507 +"2020-09-21","OK",948,,2,,5896,5896,522,53,,222,995697,0,,,995697,,,77908,77908,1101,0,3764,,,,86886,64941,,0,1073605,1101,76497,,,,,0,1084302,0 +"2020-09-21","OR",526,,1,,2356,2356,145,0,,32,605268,1957,,,948367,,11,30801,,202,0,,,,,54832,5391,,0,1003199,4544,,,,,627951,0,1003199,4544 +"2020-09-21","PA",8004,,23,,,,418,0,,,1767181,8849,,,,,59,150812,146281,234,0,,,,,,123665,2806413,19559,2806413,19559,,,,,1913462,9073,,0 +"2020-09-21","PR",609,439,1,170,,,386,0,,63,305972,0,,,395291,,41,20311,20311,242,0,22165,,,,20103,,,0,326283,242,,,,,,0,415664,0 +"2020-09-21","RI",1097,,3,,2693,2693,78,0,,10,296634,711,,,656610,,4,23932,,52,0,,,,,33671,,690281,2136,690281,2136,,,,,320566,763,,0 +"2020-09-21","SC",3212,3040,13,172,8779,8779,764,41,,199,1005994,11107,61961,,968999,,112,138124,134884,416,0,6305,8836,,,171879,51431,,0,1144118,11523,68266,29352,,,,0,1140878,11497 +"2020-09-21","SD",202,,0,,1297,1297,161,9,,,158154,497,,,,,,18869,,173,0,,,,,24981,15777,,0,244991,1781,,,,,177023,670,244991,1781 +"2020-09-21","TN",2233,2152,15,81,8199,8199,789,40,,272,,0,,,2455978,,130,184409,178190,895,0,,,,,217209,166674,,0,2673187,12181,,,,,,0,2673187,12181 +"2020-09-21","TX",14917,,24,,,,3132,0,,1073,,0,,,,,,698387,698387,9853,0,34843,15935,,,796468,611856,,0,6178723,14792,386966,160038,,,,0,6178723,14792 +"2020-09-21","UT",441,,1,,3520,3520,154,26,857,61,691696,3363,,,896510,350,,64394,,622,0,,1622,,1527,70539,51660,,0,967049,5991,,16873,,10677,755103,3861,967049,5991 +"2020-09-21","VA",3021,2816,6,205,10613,10613,995,22,,217,,0,,,,,106,141138,134301,627,0,9478,2586,,,160412,,1898637,16609,1898637,16609,139644,20498,,,,0,,0 +"2020-09-21","VI",19,,0,,,,,0,,,18043,0,,,,,,1269,,0,0,,,,,,1186,,0,19312,0,,,,,19314,0,,0 +"2020-09-21","VT",58,58,0,,,,3,0,,,153317,834,,,,,,1722,1719,4,0,,,,,,1557,,0,255516,4416,,,,,155036,838,255516,4416 +"2020-09-21","WA",2037,2037,0,,7262,7262,377,14,,69,,0,,,,,21,85265,84133,323,0,,,,,,,1736556,13516,1736556,13516,,,,,,0,,0 +"2020-09-21","WI",1252,1244,2,8,6692,6692,433,39,1117,131,1337627,5525,,,,,,108588,102498,1296,0,,,,,,86822,2121214,16994,2121214,16994,,,,,1440125,6796,,0 +"2020-09-21","WV",312,310,2,2,,,162,0,,58,,0,,,,,28,14171,13830,117,0,,,,,,10317,,0,513542,5172,16991,,,,,0,513542,5172 +"2020-09-21","WY",49,,0,,247,247,23,4,,,89187,1627,,,149424,,,4944,4189,73,0,,,,,4469,4172,,0,153893,3817,,,,,93376,1807,153893,3817 +"2020-09-20","AK",45,45,0,,287,287,43,4,,,,0,,,419584,,13,6860,,108,0,,,,,7061,2438,,0,426925,4075,,,,,,0,426925,4075 +"2020-09-20","AL",2437,2290,0,147,16227,16227,780,0,1643,,923366,4918,,,,904,,144962,130651,798,0,,,,,,61232,,0,1054017,5595,,,56887,,1054017,5595,,0 +"2020-09-20","AR",1181,1033,8,148,4967,4967,404,4,,212,810294,16197,,,810294,628,83,75723,73690,563,0,,,,2195,,66397,,0,883984,17549,,,,5216,,0,883984,17549 +"2020-09-20","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-20","AZ",5476,5184,9,292,21876,21876,472,-6,,120,1169906,10298,,,,,57,214018,209701,467,0,,,,,,,,0,2035326,8384,,,282714,,1379607,10701,2035326,8384 +"2020-09-20","CA",14987,,75,,,,3441,0,,925,,0,,,,,,778400,778400,4265,0,,,,,,,,0,13523158,179272,,,,,,0,13523158,179272 +"2020-09-20","CO",2014,1663,1,351,7363,7363,239,6,,,767852,6506,154948,,,,,64857,60256,501,0,11600,,,,,,1208425,13046,1208425,13046,166546,,,,828108,6980,,0 +"2020-09-20","CT",4492,3597,0,895,11447,11447,77,0,,,,0,,,1550050,,,55527,53218,0,0,,,,,68593,9204,,0,1620884,7388,,,,,,0,1620884,7388 +"2020-09-20","DC",620,,1,,,,86,0,,25,,0,,,,,14,14955,,53,0,,,,,,11829,355144,4267,355144,4267,,,,,204099,1481,,0 +"2020-09-20","DE",621,548,0,73,,,60,0,,14,251855,1593,,,,,,19566,18547,117,0,,,,,22550,10299,403029,2640,403029,2640,,,,,271421,1710,,0 +"2020-09-20","FL",13459,,9,,42939,42939,2292,81,,,4411335,24014,411877,403867,6222032,,,675691,661506,2497,0,34738,,34017,,879887,,7547048,53474,7547048,53474,446669,,437913,,5054955,0,7142713,42537 +"2020-09-20","GA",6602,,3,,27377,27377,1926,39,5002,,,0,,,,,,306155,306155,1134,0,24046,,,,282798,,,0,2750822,15433,295046,,,,,0,2750822,15433 +"2020-09-20","GU",34,,0,,,,36,0,,19,43841,0,,,,,,2117,2117,0,0,3,,,,,1450,,0,45958,0,172,,,,,0,45651,0 +"2020-09-20","HI",120,120,0,,726,726,185,26,,51,268523,0,,,,,40,11485,11326,109,0,,,,,11273,4622,376654,9252,376654,9252,,,,,279740,0,381571,8954 +"2020-09-20","IA",1265,,1,,,,269,0,,73,640600,3883,,52527,,,38,77679,77679,621,0,,,3320,2368,,57524,,0,718279,4504,,,55887,18671,719817,4506,,0 +"2020-09-20","ID",441,403,3,38,1711,1711,146,10,442,51,252681,1445,,,,,,37247,34149,288,0,,,,,,20105,,0,286830,1693,,,,,286830,1693,,0 +"2020-09-20","IL",8686,8450,14,236,,,1417,0,,357,,0,,,,,151,276456,274258,1402,0,,,,,,,,0,5105153,48011,,,,,,0,5105153,48011 +"2020-09-20","IN",3506,3281,3,225,12143,12143,754,52,2410,218,1190435,8579,,,,,72,111505,,746,0,,,,,114033,,,0,1920887,6438,,,,,1301940,9325,1920887,6438 +"2020-09-20","KS",596,,0,,2671,2671,286,0,734,79,422464,0,,,,230,23,52285,,0,0,,,,,,,,0,474749,0,,,,,474749,0,,0 +"2020-09-20","KY",1111,1102,3,9,5026,5026,496,0,1483,114,,0,,,,,,61542,54695,436,0,,,,,,11237,,0,1047995,0,51457,19403,,,,0,1047995,0 +"2020-09-20","LA",5366,5198,26,168,,,596,0,,,2016741,31077,,,,,100,162258,161219,936,0,,,,,,145570,,0,2178999,32013,,,,,,0,2177960,32013 +"2020-09-20","MA",9310,9100,15,210,12545,12545,364,8,,61,1959741,17059,,,,,34,127540,125479,359,0,,,,,164924,109397,,0,3399512,62220,,,118289,117973,2085220,17399,3399512,62220 +"2020-09-20","MD",3879,3735,3,144,15119,15119,281,0,,68,1409320,10260,,117647,,,,120156,120156,412,0,,,10993,,143721,7377,,0,2390269,28886,,,128640,,1529476,10672,2390269,28886 +"2020-09-20","ME",139,138,0,1,439,439,16,0,,4,,0,9664,,,,1,5079,4562,44,0,512,,,,5541,4364,,0,371222,7859,10190,,,,,0,371222,7859 +"2020-09-20","MI",6969,6653,0,316,,,557,0,,150,,0,,,3190382,,64,128087,115870,0,0,,,,,163304,90216,,0,3353686,0,283882,,,,,0,3353686,0 +"2020-09-20","MN",2017,1965,2,52,7163,7163,248,39,2004,123,1213458,10784,,,,,,90017,90017,1296,0,,,,,,81336,1838392,22618,1838392,22618,,,,,1303475,12080,,0 +"2020-09-20","MO",1795,,2,,,,1064,0,,,1099664,8556,,69139,1461128,,,112844,112844,1328,0,,,3316,,120142,,,0,1583984,12982,,,72455,,1212508,9884,1583984,12982 +"2020-09-20","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,68,68,6,0,,,,,,29,,0,14384,6,,,,,14375,0,18915,0 +"2020-09-20","MS",2810,2591,1,219,5499,5499,630,0,,171,609799,0,,,,,87,93364,87045,277,0,,,,,,78971,,0,703163,277,36912,48844,,,,0,696618,0 +"2020-09-20","MT",157,,1,,570,570,104,3,,,,0,,,,,,10299,,136,0,,,,,,7807,,0,302813,1973,,,,,,0,302813,1973 +"2020-09-20","NC",3243,3243,8,,,,889,0,,292,,0,,,,,,193581,193581,1333,0,,,,,,,,0,2790314,27403,,,,,,0,2790314,27403 +"2020-09-20","ND",195,,0,,723,723,81,7,185,22,210297,1402,8764,,,,,17925,17923,352,0,400,,,,,14558,562599,5737,562599,5737,9164,11,,,228255,1753,582629,5957 +"2020-09-20","NE",442,,0,,2194,2194,174,0,,,382563,2955,,,518025,,,40797,,410,0,,,,,49300,30509,,0,568357,5017,,,,,423653,3362,568357,5017 +"2020-09-20","NH",438,,0,,725,725,10,0,230,,232454,1642,,,,,,7947,,27,0,,,,,,7201,,0,401689,8523,31457,,30737,,240401,1669,401689,8523 +"2020-09-20","NJ",16061,14276,3,1785,23130,23130,380,10,,91,3153029,59961,,,,,39,204171,199762,489,0,,,,,,,,0,3357200,60450,,,,,,0,3352791,60875 +"2020-09-20","NM",849,,2,,3341,3341,64,6,,,,0,,,,,,27579,,67,0,,,,,,15412,,0,862899,5443,,,,,,0,862899,5443 +"2020-09-20","NV",1531,,3,,,,443,0,,127,589380,4113,,,,,89,75804,75804,385,0,,,,,,,961371,3170,961371,3170,,,,,664479,4507,984667,8780 +"2020-09-20","NY",25427,,2,,89995,89995,468,0,,132,,0,,,,,60,449900,,862,0,,,,,,,9922446,100355,9922446,100355,,,,,,0,,0 +"2020-09-20","OH",4615,4318,3,297,14773,14773,563,23,3180,191,,0,,,,,113,144309,136505,762,0,,,,,156649,122671,,0,2880246,39948,,,,,,0,2880246,39948 +"2020-09-20","OK",946,,3,,5843,5843,522,0,,222,995697,0,,,995697,,,76807,76807,1003,0,3764,,,,86886,64467,,0,1072504,1003,76497,,,,,0,1084302,0 +"2020-09-20","OR",525,,4,,2356,2356,145,0,,32,603311,4231,,,943995,,11,30599,,257,0,,,,,54660,5391,,0,998655,8069,,,,,627951,0,998655,8069 +"2020-09-20","PA",7981,,25,,,,400,0,,,1758332,12052,,,,,49,150578,146057,733,0,,,,,,122872,2786854,23185,2786854,23185,,,,,1904389,12774,,0 +"2020-09-20","PR",608,438,3,170,,,384,0,,64,305972,0,,,395291,,43,20069,20069,262,0,21769,,,,20103,,,0,326041,262,,,,,,0,415664,0 +"2020-09-20","RI",1094,,3,,2693,2693,78,6,,10,295923,1705,,,654538,,4,23880,,82,0,,,,,33607,,688145,8291,688145,8291,,,,,319803,1787,,0 +"2020-09-20","SC",3199,3028,11,171,8738,8738,733,30,,203,994887,8862,61795,,958354,,123,137708,134494,468,0,6254,8723,,,171027,51431,,0,1132595,9330,68049,28772,,,,0,1129381,9304 +"2020-09-20","SD",202,,2,,1288,1288,170,20,,,157657,880,,,,,,18696,,252,0,,,,,24774,15651,,0,243210,2712,,,,,176353,1132,243210,2712 +"2020-09-20","TN",2218,2137,2,81,8159,8159,772,43,,249,,0,,,2444781,,106,183514,177394,2075,0,,,,,216225,165844,,0,2661006,39915,,,,,,0,2661006,39915 +"2020-09-20","TX",14893,,45,,,,3081,0,,1057,,0,,,,,,688534,688534,2466,0,34639,15813,,,795308,609210,,0,6163931,22747,385351,158451,,,,0,6163931,22747 +"2020-09-20","UT",440,,0,,3494,3494,187,17,853,59,688333,5048,,,891106,350,,63772,,920,0,,1604,,1508,69952,51410,,0,961058,8991,,16189,,10465,751242,5770,961058,8991 +"2020-09-20","VA",3015,2811,25,204,10591,10591,939,29,,263,,0,,,,,126,140511,133722,856,0,9440,2576,,,159604,,1882028,15362,1882028,15362,139301,20230,,,,0,,0 +"2020-09-20","VI",19,,0,,,,,0,,,18043,331,,,,,,1269,,27,0,,,,,,1186,,0,19312,358,,,,,19314,334,,0 +"2020-09-20","VT",58,58,0,,,,2,0,,,152483,950,,,,,,1718,1715,5,0,,,,,,1548,,0,251100,4787,,,,,154198,955,251100,4787 +"2020-09-20","WA",2037,2037,0,,7248,7248,380,33,,85,,0,,,,,26,84942,83816,535,0,,,,,,,1723040,18370,1723040,18370,,,,,,0,,0 +"2020-09-20","WI",1250,1242,1,8,6653,6653,407,34,1115,111,1332102,6655,,,,,,107292,101227,1735,0,,,,,,85824,2104220,19808,2104220,19808,,,,,1433329,8320,,0 +"2020-09-20","WV",310,308,2,2,,,167,0,,55,,0,,,,,29,14054,13717,180,0,,,,,,10227,,0,508370,4907,16948,,,,,0,508370,4907 +"2020-09-20","WY",49,,0,,243,243,16,1,,,87560,0,,,145776,,,4871,4124,91,0,,,,,4300,4111,,0,150076,274,,,,,91569,0,150076,274 +"2020-09-19","AK",45,45,0,,283,283,41,0,,,,0,,,415600,,13,6752,,94,0,,,,,6970,2438,,0,422850,4557,,,,,,0,422850,4557 +"2020-09-19","AL",2437,2290,9,147,16227,16227,747,0,1642,,918448,8256,,,,904,,144164,129974,1301,0,,,,,,61232,,0,1048422,9412,,,56797,,1048422,9412,,0 +"2020-09-19","AR",1173,1025,0,148,4963,4963,372,31,,193,794097,0,,,794097,628,74,75160,73141,1078,0,,,,2010,,66003,,0,866435,0,,,,9587,,0,866435,0 +"2020-09-19","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-19","AZ",5467,5176,16,291,21882,21882,528,17,,120,1159608,10231,,,,,70,213551,209298,609,0,,,,,,,,0,2026942,15973,,,281887,,1368906,10752,2026942,15973 +"2020-09-19","CA",14912,,100,,,,3510,0,,970,,0,,,,,,774135,774135,4304,0,,,,,,,,0,13343886,166700,,,,,,0,13343886,166700 +"2020-09-19","CO",2013,1662,4,351,7357,7357,237,10,,,761346,7227,154630,,,,,64356,59782,606,0,11568,,,,,,1195379,13550,1195379,13550,166196,,,,821128,7773,,0 +"2020-09-19","CT",4492,3597,0,895,11447,11447,77,0,,,,0,,,1542804,,,55527,53218,0,0,,,,,68455,9204,,0,1613496,18179,,,,,,0,1613496,18179 +"2020-09-19","DC",619,,0,,,,85,0,,23,,0,,,,,14,14902,,50,0,,,,,,11823,350877,3759,350877,3759,,,,,202618,1239,,0 +"2020-09-19","DE",621,548,1,73,,,53,0,,15,250262,990,,,,,,19449,18429,83,0,,,,,22480,10257,400389,3083,400389,3083,,,,,269711,1073,,0 +"2020-09-19","FL",13450,,63,,42858,42858,2266,143,,,4387321,26720,411877,403867,6182971,,,673194,659147,3510,0,34738,,34017,,876603,,7493574,78220,7493574,78220,446669,,437913,,5054955,30225,7100176,50804 +"2020-09-19","GA",6599,,62,,27338,27338,1944,135,4992,,,0,,,,,,305021,305021,2284,0,23959,,,,281373,,,0,2735389,33437,294470,,,,,0,2735389,33437 +"2020-09-19","GU",34,,1,,,,36,0,,19,43841,262,,,,,,2117,2117,43,0,3,,,,,1450,,0,45958,305,172,,,,,0,45651,0 +"2020-09-19","HI",120,120,13,,700,700,200,15,,52,268523,10299,,,,,34,11376,11217,137,0,,,,,11152,4394,367402,6975,367402,6975,,,,,279740,10411,372617,6927 +"2020-09-19","IA",1264,,4,,,,282,0,,81,636717,4897,,51755,,,40,77058,77058,847,0,,,3312,2326,,57269,,0,713775,5744,,,55107,18314,715311,5746,,0 +"2020-09-19","ID",438,400,4,38,1701,1701,146,19,441,51,251236,2173,,,,,,36959,33901,470,0,,,,,,19915,,0,285137,2615,,,,,285137,2615,,0 +"2020-09-19","IL",8672,8436,25,236,,,1469,0,,326,,0,,,,,141,275054,272856,2529,0,,,,,,,,0,5057142,74286,,,,,,0,5057142,74286 +"2020-09-19","IN",3503,3278,8,225,12091,12091,762,56,2402,239,1181856,10101,,,,,74,110759,,1076,0,,,,,113690,,,0,1914449,22051,,,,,1292615,11177,1914449,22051 +"2020-09-19","KS",596,,0,,2671,2671,286,0,734,79,422464,0,,,,230,23,52285,,0,0,,,,,,,,0,474749,0,,,,,474749,0,,0 +"2020-09-19","KY",1108,1099,7,9,5026,5026,496,24,1483,114,,0,,,,,,61106,54325,978,0,,,,,,11237,,0,1047995,2763,51457,19403,,,,0,1047995,2763 +"2020-09-19","LA",5340,5172,0,168,,,647,0,,,1985664,0,,,,,104,161322,160283,0,0,,,,,,145570,,0,2146986,0,,,,,,0,2145947,0 +"2020-09-19","MA",9295,9085,26,210,12537,12537,362,23,,65,1942682,20729,,,,,28,127181,125139,599,0,,,,,164504,109397,,0,3337292,72419,,,118069,116565,2067821,21298,3337292,72419 +"2020-09-19","MD",3876,3732,7,144,15119,15119,324,49,,75,1399060,13255,,117647,,,,119744,119744,682,0,,,10993,,143174,7374,,0,2361383,37131,,,128640,,1518804,13937,2361383,37131 +"2020-09-19","ME",139,138,1,1,439,439,14,2,,5,,0,9641,,,,1,5035,4522,30,0,509,,,,5495,4346,,0,363363,7334,10164,,,,,0,363363,7334 +"2020-09-19","MI",6969,6653,15,316,,,557,0,,150,,0,,,3190382,,64,128087,115870,587,0,,,,,163304,90216,,0,3353686,33899,283882,,,,,0,3353686,33899 +"2020-09-19","MN",2015,1963,13,52,7124,7124,241,33,1998,134,1202674,11644,,,,,,88721,88721,914,0,,,,,,80407,1815774,24094,1815774,24094,,,,,1291395,12558,,0 +"2020-09-19","MO",1793,,13,,,,1004,0,,,1091108,10857,,69055,1449613,,,111516,111516,1387,0,,,3287,,118677,,,0,1571002,16377,,,72342,,1202624,12244,1571002,16377 +"2020-09-19","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,62,62,0,0,,,,,,29,,0,14378,0,,,,,14375,0,18915,0 +"2020-09-19","MS",2809,2593,29,216,5499,5499,630,0,,171,609799,68302,,,,,87,93087,86819,1152,0,,,,,,78971,,0,702886,69454,36912,48844,,,,0,696618,69737 +"2020-09-19","MT",156,,10,,567,567,104,12,,,,0,,,,,,10163,,292,0,,,,,,7553,,0,300840,2285,,,,,,0,300840,2285 +"2020-09-19","NC",3235,3235,28,,,,882,0,,293,,0,,,,,,192248,192248,1229,0,,,,,,,,0,2762911,34441,,,,,,0,2762911,34441 +"2020-09-19","ND",195,,8,,716,716,78,11,184,22,208895,932,8764,,,,,17573,17573,378,0,400,,,,,14319,556862,6538,556862,6538,9164,9,,,226502,1309,576672,6759 +"2020-09-19","NE",442,,0,,2194,2194,185,13,,,379608,2954,,,513488,,,40387,,466,0,,,,,48820,30509,,0,563340,5583,,,,,420291,3423,563340,5583 +"2020-09-19","NH",438,,0,,725,725,8,0,230,,230812,1155,,,,,,7920,,59,0,,,,,,7164,,0,393166,0,31344,,30704,,238732,1214,393166,0 +"2020-09-19","NJ",16058,14273,3,1785,23120,23120,412,24,,89,3093068,0,,,,,27,203682,199309,510,0,,,,,,,,0,3296750,510,,,,,,0,3291916,0 +"2020-09-19","NM",847,,6,,3335,3335,68,15,,,,0,,,,,,27512,,162,0,,,,,,15342,,0,857456,6493,,,,,,0,857456,6493 +"2020-09-19","NV",1528,,4,,,,443,0,,127,585267,3762,,,,,89,75419,75419,323,0,,,,,,,958201,7246,958201,7246,,,,,659972,4112,975887,8047 +"2020-09-19","NY",25425,,2,,89995,89995,467,0,,144,,0,,,,,60,449038,,986,0,,,,,,,9822091,110444,9822091,110444,,,,,,0,,0 +"2020-09-19","OH",4612,4316,4,296,14750,14750,585,63,3175,199,,0,,,,,115,143547,135800,951,0,,,,,155643,121911,,0,2840298,36419,,,,,,0,2840298,36419 +"2020-09-19","OK",943,,4,,5843,5843,522,88,,222,995697,16047,,,995697,,,75804,75804,1237,0,3764,,,,86886,63960,,0,1071501,17284,76497,,,,,0,1084302,17406 +"2020-09-19","OR",521,,0,,2356,2356,145,15,,32,599080,3506,,,936227,,11,30342,,492,0,,,,,54359,5376,,0,990586,8300,,,,,627951,3787,990586,8300 +"2020-09-19","PA",7956,,22,,,,470,0,,,1746280,13475,,,,,47,149845,145335,1162,0,,,,,,122872,2763669,32393,2763669,32393,,,,,1891615,14582,,0 +"2020-09-19","PR",605,435,6,170,,,403,0,,61,305972,0,,,395291,,39,19807,19807,694,0,21186,,,,20103,,,0,325779,694,,,,,,0,415664,0 +"2020-09-19","RI",1091,,3,,2687,2687,75,12,,11,294218,2283,,,646405,,4,23798,,178,0,,,,,33449,,679854,4746,679854,4746,,,,,318016,2461,,0 +"2020-09-19","SC",3188,3017,11,171,8708,8708,826,39,,203,986025,10939,61633,,949664,,121,137240,134052,922,0,6232,8621,,,170413,51431,,0,1123265,11861,67865,27959,,,,0,1120077,11681 +"2020-09-19","SD",200,,2,,1268,1268,153,22,,,156777,1148,,,,,,18444,,369,0,,,,,24450,15298,,0,240498,3755,,,,,175221,1517,240498,3755 +"2020-09-19","TN",2216,2135,20,81,8116,8116,837,53,,271,,0,,,2407243,,123,181439,175443,942,0,,,,,213848,164982,,0,2621091,23609,,,,,,0,2621091,23609 +"2020-09-19","TX",14848,,135,,,,3124,0,,1083,,0,,,,,,686068,686068,3827,0,34415,15658,,,793400,605522,,0,6141184,50993,383876,156824,,,,0,6141184,50993 +"2020-09-19","UT",440,,3,,3477,3477,177,33,850,49,683285,6080,,,882973,349,,62852,,1077,0,,1588,,1493,69094,50957,,0,952067,10266,,16093,,10401,745472,7101,952067,10266 +"2020-09-19","VA",2990,2787,41,203,10562,10562,960,42,,219,,0,,,,,108,139655,132966,953,0,9390,2558,,,158898,,1866666,35043,1866666,35043,138925,19889,,,,0,,0 +"2020-09-19","VI",19,,0,,,,,0,,,17712,0,,,,,,1242,,0,0,,,,,,1174,,0,18954,0,,,,,18980,0,,0 +"2020-09-19","VT",58,58,0,,,,3,0,,,151533,655,,,,,,1713,1710,4,0,,,,,,1541,,0,246313,4643,,,,,153243,659,246313,4643 +"2020-09-19","WA",2037,2037,0,,7215,7215,395,0,,93,,0,,,,,34,84407,83299,478,0,,,,,,,1704670,0,1704670,0,,,,,,0,,0 +"2020-09-19","WI",1249,1241,3,8,6619,6619,362,50,1112,105,1325447,10189,,,,,,105557,99562,2403,0,,,,,,84632,2084412,27370,2084412,27370,,,,,1425009,12472,,0 +"2020-09-19","WV",308,306,11,2,,,169,0,,58,,0,,,,,32,13874,13542,191,0,,,,,,10155,,0,503463,6356,16842,,,,,0,503463,6356 +"2020-09-19","WY",49,,0,,242,242,16,2,,,87560,0,,,145519,,,4780,4039,33,0,,,,,4283,4092,,0,149802,353,,,,,91569,0,149802,353 +"2020-09-18","AK",45,45,1,,283,283,36,3,,,,0,,,411148,,13,6658,,107,0,,,,,6865,2422,,0,418293,2430,,,,,,0,418293,2430 +"2020-09-18","AL",2428,2284,27,144,16227,16227,744,148,1638,,910192,7036,,,,904,,142863,128818,1106,0,,,,,,61232,,0,1039010,7757,,,56411,,1039010,7757,,0 +"2020-09-18","AR",1173,1025,7,148,4932,4932,381,36,,193,794097,10390,,,794097,624,77,74082,72338,871,0,,,,2010,,65542,,0,866435,11114,,,,9587,,0,866435,11114 +"2020-09-18","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-18","AZ",5451,5160,42,291,21865,21865,516,44,,130,1149377,8155,,,,,72,212942,208777,1282,0,,,,,,,,0,2010969,16624,,,281052,,1358154,8038,2010969,16624 +"2020-09-18","CA",14812,,91,,,,3570,0,,965,,0,,,,,,769831,769831,3630,0,,,,,,,,0,13177186,97149,,,,,,0,13177186,97149 +"2020-09-18","CO",2009,1658,3,351,7347,7347,230,20,,,754119,8023,154006,,,,,63750,59236,605,0,11507,,,,,,1181829,14919,1181829,14919,165511,,,,813355,8588,,0 +"2020-09-18","CT",4492,3597,4,895,11447,11447,77,0,,,,0,,,1524819,,,55527,53218,141,0,,,,,68264,9204,,0,1595317,21881,,,,,,0,1595317,21881 +"2020-09-18","DC",619,,0,,,,91,0,,24,,0,,,,,13,14852,,62,0,,,,,,11802,347118,5800,347118,5800,,,,,201379,1800,,0 +"2020-09-18","DE",620,547,1,73,,,58,0,,17,249272,1422,,,,,,19366,18363,48,0,,,,,22379,10201,397306,2901,397306,2901,,,,,268638,1470,,0 +"2020-09-18","FL",13387,,140,,42715,42715,2383,190,,,4360601,24084,411877,403867,6136843,,,669684,655976,3177,0,34738,,34017,,872145,,7415354,76142,7415354,76142,446669,,437913,,5024730,27241,7049372,45857 +"2020-09-18","GA",6537,,63,,27203,27203,1975,149,4966,,,0,,,,,,302737,302737,1834,0,23742,,,,276778,,,0,2701952,22061,293358,,,,,0,2701952,22061 +"2020-09-18","GU",33,,2,,,,41,0,,19,43579,371,,,,,,2074,2074,29,0,3,,,,,1450,,0,45653,400,172,,,,,0,45651,400 +"2020-09-18","HI",107,107,4,,685,685,197,18,,51,258224,3670,,,,,31,11239,11105,159,0,,,,,11041,4248,360427,4600,360427,4600,,,,,269329,3829,365690,7355 +"2020-09-18","IA",1260,,9,,,,281,0,,91,631820,5410,,51659,,,39,76211,76211,1183,0,,,3289,2314,,56546,,0,708031,6593,,,54988,18101,709565,6577,,0 +"2020-09-18","ID",434,396,5,38,1682,1682,123,24,438,54,249063,1791,,,,,,36489,33489,396,0,,,,,,19691,,0,282522,2096,,,,,282522,2096,,0 +"2020-09-18","IL",8647,8411,23,236,,,1481,0,,329,,0,,,,,149,272525,270327,2223,0,,,,,,,,0,4982856,61918,,,,,,0,4982856,61918 +"2020-09-18","IN",3495,3270,17,225,12035,12035,804,53,2387,235,1171755,10751,,,,,76,109683,,1037,0,,,,,112900,,,0,1892398,26346,,,,,1281438,11788,1892398,26346 +"2020-09-18","KS",596,,10,,2671,2671,286,55,734,79,422464,9108,,,,230,23,52285,,1415,0,,,,,,,,0,474749,10523,,,,,474749,10523,,0 +"2020-09-18","KY",1101,1092,8,9,5002,5002,500,26,1478,144,,0,,,,,,60128,53509,758,0,,,,,,11168,,0,1045232,13030,50995,18878,,,,0,1045232,13030 +"2020-09-18","LA",5340,5172,29,168,,,647,0,,,1985664,21817,,,,,104,161322,160283,979,0,,,,,,145570,,0,2146986,22796,,,,,,0,2145947,22796 +"2020-09-18","MA",9269,9059,9,210,12514,12514,338,18,,62,1921953,21786,,,,,25,126582,124570,454,0,,,,,163794,109397,,0,3264873,65310,,,117770,115162,2046523,22217,3264873,65310 +"2020-09-18","MD",3869,3724,8,145,15070,15070,347,62,,84,1385805,9982,,117647,,,,119062,119062,543,0,,,10993,,142395,7351,,0,2324252,24644,,,128640,,1504867,10525,2324252,24644 +"2020-09-18","ME",138,137,0,1,437,437,11,1,,5,,0,9624,,,,1,5005,4492,43,0,509,,,,5465,4335,,0,356029,12873,10147,,,,,0,356029,12873 +"2020-09-18","MI",6954,6638,-1,316,,,557,0,,150,,0,,,3157530,,64,127500,115387,778,0,,,,,162257,85513,,0,3319787,33566,282669,,,,,0,3319787,33566 +"2020-09-18","MN",2002,1950,8,52,7091,7091,250,41,1990,136,1191030,14206,,,,,,87807,87807,1085,0,,,,,,80221,1791680,27945,1791680,27945,,,,,1278837,15291,,0 +"2020-09-18","MO",1780,,23,,,,1025,0,,,1080251,10004,,68819,1434610,,,110129,110129,1795,0,,,3266,,117326,,,0,1554625,16393,,,72085,,1190380,11799,1554625,16393 +"2020-09-18","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,62,62,0,0,,,,,,29,,0,14378,0,,,,,14375,0,18915,0 +"2020-09-18","MS",2780,2572,0,208,5499,5499,630,0,,171,541497,0,,,,,87,91935,85944,0,0,,,,,,78971,,0,633432,0,29016,40904,,,,0,626881,0 +"2020-09-18","MT",146,,3,,555,555,105,6,,,,0,,,,,,9871,,224,0,,,,,,7500,,0,298555,3256,,,,,,0,298555,3256 +"2020-09-18","NC",3207,3207,27,,,,904,0,,283,,0,,,,,,191019,191019,1443,0,,,,,,,,0,2728470,37607,,,,,,0,2728470,37607 +"2020-09-18","ND",187,,2,,705,705,77,14,183,24,207963,1516,8764,,,,,17195,17195,505,0,400,,,,,14060,550324,9699,550324,9699,9164,8,,,225193,2023,569913,9990 +"2020-09-18","NE",442,,3,,2181,2181,188,9,,,376654,3222,,,508454,,,39921,,502,0,,,,,48278,30254,,0,557757,5967,,,,,416868,3395,557757,5967 +"2020-09-18","NH",438,,0,,725,725,7,0,230,,229657,1961,,,,,,7861,,47,0,,,,,,7117,,0,393166,9615,31344,,30635,,237518,2008,393166,9615 +"2020-09-18","NJ",16055,14270,4,1785,23096,23096,413,25,,73,3093068,25611,,,,,36,203172,198848,551,0,,,,,,,,0,3296240,26162,,,,,,0,3291916,26098 +"2020-09-18","NM",841,,5,,3320,3320,72,7,,,,0,,,,,,27350,,151,0,,,,,,15256,,0,850963,5796,,,,,,0,850963,5796 +"2020-09-18","NV",1524,,18,,,,461,0,,136,581505,3517,,,,,85,75096,75096,501,0,,,,,,,950955,7788,950955,7788,,,,,655860,3960,967840,8001 +"2020-09-18","NY",25423,,10,,89995,89995,478,0,,141,,0,,,,,62,448052,,790,0,,,,,,,9711647,89727,9711647,89727,,,,,,0,,0 +"2020-09-18","OH",4608,4312,28,296,14687,14687,634,62,3161,223,,0,,,,,118,142596,134922,1011,0,,,,,154640,120858,,0,2803879,38390,,,,,,0,2803879,38390 +"2020-09-18","OK",939,,9,,5755,5755,516,57,,223,979650,13131,,,979650,,,74567,74567,1249,0,3581,,,,85471,63135,,0,1054217,14380,74483,,,,,0,1066896,14140 +"2020-09-18","OR",521,,0,,2341,2341,144,22,,32,595574,4151,,,928249,,11,29850,,0,0,,,,,54037,5376,,0,982286,8653,,,,,624164,4342,982286,8653 +"2020-09-18","PA",7934,,21,,,,521,0,,,1732805,11530,,,,,50,148683,144228,760,0,,,,,,121920,2731276,30456,2731276,30456,,,,,1877033,12206,,0 +"2020-09-18","PR",599,430,11,169,,,435,0,,70,305972,0,,,395291,,41,19113,19113,479,0,20571,,,,20103,,,0,325085,479,,,,,,0,415664,0 +"2020-09-18","RI",1088,,3,,2675,2675,85,7,,7,291935,2148,,,641632,,6,23620,,132,0,,,,,33476,,675108,9182,675108,9182,,,,,315555,2280,,0 +"2020-09-18","SC",3177,3010,19,167,8669,8669,798,58,,217,975086,22945,61306,,939090,,125,136318,133310,872,0,6153,8291,,,169306,51431,,0,1111404,23817,67459,26886,,,,0,1108396,23690 +"2020-09-18","SD",198,,5,,1246,1246,144,15,,,155629,1792,,,,,,18075,,389,0,,,,,24014,15068,,0,236743,2887,,,,,173704,2181,236743,2887 +"2020-09-18","TN",2196,2116,32,80,8063,8063,871,84,,275,,0,,,2384683,,124,180497,174637,2357,0,,,,,212799,163181,,0,2597482,38290,,,,,,0,2597482,38290 +"2020-09-18","TX",14713,,123,,,,3172,0,,1107,,0,,,,,,682241,682241,3422,0,34084,15466,,,790132,600662,,0,6090191,54076,381430,153189,,,,0,6090191,54076 +"2020-09-18","UT",437,,0,,3444,3444,184,43,848,52,677205,5181,,,873860,349,,61775,,1117,0,,1486,,1396,67941,50492,,0,941801,9169,,13893,,9599,738371,6106,941801,9169 +"2020-09-18","VA",2949,2755,29,194,10520,10520,945,56,,212,,0,,,,,102,138702,132090,1242,0,9344,2481,,,157605,,1831623,9611,1831623,9611,138413,17626,,,,0,,0 +"2020-09-18","VI",19,,0,,,,,0,,,17712,171,,,,,,1242,,4,0,,,,,,1174,,0,18954,175,,,,,18980,180,,0 +"2020-09-18","VT",58,58,0,,,,6,0,,,150878,870,,,,,,1709,1706,2,0,,,,,,1536,,0,241670,4106,,,,,152584,872,241670,4106 +"2020-09-18","WA",2037,2037,6,,7215,7215,379,19,,,,0,,,,,34,83929,82847,471,0,,,,,,,1704670,13623,1704670,13623,,,,,,0,,0 +"2020-09-18","WI",1246,1238,7,8,6569,6569,342,47,1110,98,1315258,10534,,,,,,103154,97279,2580,0,,,,,,83184,2057042,27446,2057042,27446,,,,,1412537,13067,,0 +"2020-09-18","WV",297,295,3,2,,,175,0,,63,,0,,,,,40,13683,13353,253,0,,,,,,10011,,0,497107,4977,16737,,,,,0,497107,4977 +"2020-09-18","WY",49,,0,,240,240,16,4,,,87560,760,,,145201,,,4747,4009,95,0,,,,,4248,4044,,0,149449,1550,,,,,91569,833,149449,1550 +"2020-09-17","AK",44,44,0,,280,280,41,1,,,,0,,,408769,,13,6551,,108,0,,,,,6814,2408,,0,415863,7299,,,,,,0,415863,7299 +"2020-09-17","AL",2401,2264,9,137,16079,16079,740,137,1631,,903156,3472,,,,900,,141757,128097,670,0,,,,,,61232,,0,1031253,4046,,,56181,,1031253,4046,,0 +"2020-09-17","AR",1166,1018,9,148,4896,4896,389,56,,206,783707,9749,,,783707,619,72,73211,71614,992,0,,3300,,,,64145,,0,855321,10632,,21856,,,,0,855321,10632 +"2020-09-17","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-17","AZ",5409,5135,38,274,21821,21821,594,-4,,119,1141222,22668,,,,,65,211660,208894,1753,0,,,,,,,,0,1994345,19986,,,280184,,1350116,23844,1994345,19986 +"2020-09-17","CA",14721,,106,,,,3621,0,,997,,0,,,,,,766201,766201,3238,0,,,,,,,,0,13080037,79515,,,,,,0,13080037,79515 +"2020-09-17","CO",2006,1655,4,351,7327,7327,213,39,,,746096,6860,153449,,,,,63145,58671,459,0,11458,,,,,,1166910,13057,1166910,13057,164905,,,,804767,7274,,0 +"2020-09-17","CT",4488,3593,1,895,11447,11447,75,90,,,,0,,,1503168,,,55386,53087,220,0,,,,,68043,9204,,0,1573436,23140,,,,,,0,1573436,23140 +"2020-09-17","DC",619,,2,,,,100,0,,22,,0,,,,,18,14790,,47,0,,,,,,11763,341318,3077,341318,3077,,,,,199579,1170,,0 +"2020-09-17","DE",619,547,0,72,,,66,0,,18,247850,1179,,,,,,19318,18319,84,0,,,,,22291,10193,394405,3448,394405,3448,,,,,267168,1263,,0 +"2020-09-17","FL",13247,,147,,42525,42525,2385,198,,,4336517,23695,411877,403867,6095243,,,666507,653089,3273,0,34738,,34017,,868101,,7339212,73203,7339212,73203,446669,,437913,,4997489,26994,7003515,45189 +"2020-09-17","GA",6474,,55,,27054,27054,1977,170,4945,,,0,,,,,,300903,300903,1847,0,23551,,,,275551,,,0,2679891,25770,292125,,,,,0,2679891,25770 +"2020-09-17","GU",31,,2,,,,44,0,,19,43208,370,,,,,,2045,2045,32,0,3,,,,,1427,,0,45253,402,170,,,,,0,45251,402 +"2020-09-17","HI",103,103,3,,667,667,210,13,,56,254554,2390,,,,,38,11080,10946,102,0,,,,,10930,4105,355827,6453,355827,6453,,,,,265500,2492,358335,3885 +"2020-09-17","IA",1251,,14,,,,271,0,,85,626410,5379,,51195,,,36,75028,75028,948,0,,,3269,2250,,55834,,0,701438,6327,,,54504,17663,702988,6332,,0 +"2020-09-17","ID",429,391,6,38,1658,1658,123,27,433,54,247272,1440,,,,,,36093,33154,283,0,,,,,,19405,,0,280426,1647,,,,,280426,1647,,0 +"2020-09-17","IL",8624,8392,25,232,,,1558,0,,359,,0,,,,,144,270302,268207,2056,0,,,,,,,,0,4920938,57800,,,,,,0,4920938,57800 +"2020-09-17","IN",3478,3253,6,225,11982,11982,778,64,2376,241,1161004,6921,,,,,72,108646,,837,0,,,,,112082,,,0,1866052,27098,,,,,1269650,7758,1866052,27098 +"2020-09-17","KS",586,,0,,2616,2616,278,0,713,83,413356,0,,,,225,21,50870,,0,0,,,,,,,,0,464226,0,,,,,464226,0,,0 +"2020-09-17","KY",1093,1084,11,9,4976,4976,515,49,1471,113,,0,,,,,,59370,52887,606,0,,,,,,11109,,0,1032202,10750,50342,18735,,,,0,1032202,10750 +"2020-09-17","LA",5311,5143,17,168,,,663,0,,,1963847,8528,,,,,106,160343,159304,478,0,,,,,,145570,,0,2124190,9006,,,,,,0,2123151,9006 +"2020-09-17","MA",9260,9051,15,209,12496,12496,377,18,,64,1900167,27225,,,,,26,126128,124139,429,0,,,,,163227,109397,,0,3199563,67849,,,117453,113845,2024306,27644,3199563,67849 +"2020-09-17","MD",3861,3717,6,144,15008,15008,353,49,,83,1375823,10753,,117647,,,,118519,118519,631,0,,,10993,,141723,7311,,0,2299608,27343,,,128640,,1494342,11384,2299608,27343 +"2020-09-17","ME",138,137,0,1,436,436,12,3,,5,,0,9610,,,,0,4962,4458,21,0,509,,,,5417,4317,,0,343156,9174,10133,,,,,0,343156,9174 +"2020-09-17","MI",6955,6632,12,323,,,590,0,,152,,0,,,3125009,,67,126722,114692,980,0,,,,,161212,85513,,0,3286221,33274,279980,,,,,0,3286221,33274 +"2020-09-17","MN",1994,1942,9,52,7050,7050,242,31,1980,132,1176824,10245,,,,,,86722,86722,909,0,,,,,,79878,1763735,20124,1763735,20124,,,,,1263546,11154,,0 +"2020-09-17","MO",1757,,18,,,,962,0,,,1070247,12451,,68602,1419584,,,108334,108334,1747,0,,,3250,,115983,,,0,1538232,18798,,,71852,,1178581,14198,1538232,18798 +"2020-09-17","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,62,62,1,0,,,,,,29,,0,14378,1,,,,,14375,0,18915,0 +"2020-09-17","MS",2780,2572,24,208,5499,5499,622,0,,169,541497,0,,,,,95,91935,85944,701,0,,,,,,78971,,0,633432,701,29016,40904,,,,0,626881,0 +"2020-09-17","MT",143,,2,,549,549,107,6,,,,0,,,,,,9647,,216,0,,,,,,7401,,0,295299,2898,,,,,,0,295299,2898 +"2020-09-17","NC",3180,3180,31,,,,894,0,,286,,0,,,,,,189576,189576,1552,0,,,,,,,,0,2690863,28506,,,,,,0,2690863,28506 +"2020-09-17","ND",185,,10,,691,691,69,17,181,24,206447,723,8651,,,,,16690,16690,392,0,377,,,,,13828,540625,6402,540625,6402,9028,8,,,223170,1113,559923,6760 +"2020-09-17","NE",439,,3,,2172,2172,176,5,,,373432,3441,,,503094,,,39419,,449,0,,,,,47671,29966,,0,551790,5721,,,,,413473,3908,551790,5721 +"2020-09-17","NH",438,,0,,725,725,7,2,230,,227696,1745,,,,,,7814,,34,0,,,,,,7104,,0,383551,0,31215,,30576,,235510,1779,383551,0 +"2020-09-17","NJ",16051,14266,3,1785,23071,23071,431,39,,85,3067457,30277,,,,,40,202621,198361,636,0,,,,,,,,0,3270078,30913,,,,,,0,3265818,30846 +"2020-09-17","NM",836,,4,,3313,3313,69,19,,,,0,,,,,,27199,,158,0,,,,,,15106,,0,845167,7767,,,,,,0,845167,7767 +"2020-09-17","NV",1506,,12,,,,484,0,,150,577988,2703,,,,,98,74595,74595,347,0,,,,,,,943167,8095,943167,8095,,,,,651900,3086,959839,6684 +"2020-09-17","NY",25413,,3,,89995,89995,486,0,,135,,0,,,,,68,447262,,896,0,,,,,,,9621920,91504,9621920,91504,,,,,,0,,0 +"2020-09-17","OH",4580,4282,25,298,14625,14625,638,65,3149,214,,0,,,,,127,141585,134001,1067,0,,,,,153334,119690,,0,2765489,28806,,,,,,0,2765489,28806 +"2020-09-17","OK",930,,6,,5698,5698,516,88,,221,966519,11207,,,966519,,,73318,73318,1034,0,3581,,,,84029,62144,,0,1039837,12241,74483,,,,,0,1052756,12057 +"2020-09-17","OR",521,,2,,2319,2319,172,27,,39,591423,3021,,,919858,,15,29850,,188,0,,,,,53775,5365,,0,973633,6654,,,,,619822,3197,973633,6654 +"2020-09-17","PA",7913,,10,,,,459,0,,,1721275,13144,,,,,54,147923,143552,933,0,,,,,,121296,2700820,26368,2700820,26368,,,,,1864827,14030,,0 +"2020-09-17","PR",588,420,18,168,,,444,0,,68,305972,0,,,395291,,41,18634,18634,382,0,20233,,,,20103,,,0,324606,382,,,,,,0,415664,0 +"2020-09-17","RI",1085,,4,,2668,2668,88,6,,9,289787,1801,,,632591,,5,23488,,130,0,,,,,33335,,665926,11823,665926,11823,,,,,313275,1931,,0 +"2020-09-17","SC",3158,2992,26,166,8611,8611,733,59,,203,952141,5341,60901,,917799,,123,135446,132565,1324,0,6020,8017,,,166907,51431,,0,1087587,6665,66921,25086,,,,0,1084706,6478 +"2020-09-17","SD",193,,1,,1231,1231,138,20,,,153837,1473,,,,,,17686,,395,0,,,,,23631,14878,,0,233856,5888,,,,,171523,1868,233856,5888 +"2020-09-17","TN",2164,2084,13,80,7979,7979,999,57,,294,,0,,,2348989,,141,178140,172453,1053,0,,,,,210203,161707,,0,2559192,21469,,,,,,0,2559192,21469 +"2020-09-17","TX",14590,,112,,,,3246,0,,1140,,0,,,,,,678819,678819,4047,0,33718,15218,,,786836,594817,,0,6036115,43336,378541,148112,,,,0,6036115,43336 +"2020-09-17","UT",437,,0,,3401,3401,170,20,843,54,672024,5281,,,865790,348,,60658,,911,0,,1464,,1377,66842,50108,,0,932632,9170,,13684,,9495,732265,6319,932632,9170 +"2020-09-17","VA",2920,2734,36,186,10464,10464,995,75,,225,,0,,,,,109,137460,130960,1101,0,9283,2426,,,156565,,1822012,22161,1822012,22161,137851,15668,,,,0,,0 +"2020-09-17","VI",19,,0,,,,,0,,,17541,101,,,,,,1238,,6,0,,,,,,1172,,0,18779,107,,,,,18800,118,,0 +"2020-09-17","VT",58,58,0,,,,2,0,,,150008,1060,,,,,,1707,1704,3,0,,,,,,1533,,0,237564,3652,,,,,151712,1063,237564,3652 +"2020-09-17","WA",2031,2031,11,,7196,7196,380,34,,,,0,,,,,36,83458,82396,482,0,,,,,,,1691047,14345,1691047,14345,,,,,,0,,0 +"2020-09-17","WI",1239,1231,2,8,6522,6522,347,68,1105,103,1304724,9411,,,,,,100574,94746,2134,0,,,,,,81902,2029596,28480,2029596,28480,,,,,1399470,11445,,0 +"2020-09-17","WV",294,292,4,2,,,170,0,,58,,0,,,,,32,13430,13109,234,0,,,,,,9804,,0,492130,4553,16614,,,,,0,492130,4553 +"2020-09-17","WY",49,,3,,236,236,16,1,,,86800,1397,,,143724,,,4652,3936,86,0,,,,,4175,4000,,0,147899,2269,,,,,90736,1467,147899,2269 +"2020-09-16","AK",44,44,0,,279,279,45,1,,,,0,,,401615,,9,6443,,50,0,,,,,6669,2407,,0,408564,1440,,,,,,0,408564,1440 +"2020-09-16","AL",2392,2257,5,135,15942,15942,722,186,1629,,899684,6874,,,,901,,141087,127523,927,0,,,,,,61232,,0,1027207,7584,,,55976,,1027207,7584,,0 +"2020-09-16","AR",1157,1010,147,147,4840,4840,387,38,,189,773958,-26801,,,773958,616,65,72219,70731,862,0,,3067,,,,64145,,0,844689,-26195,,20007,,,,0,844689,-26195 +"2020-09-16","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-16","AZ",5371,5098,27,273,21825,21825,538,25,,135,1118554,15459,,,,,81,209907,207718,698,0,,,,,,,,0,1974359,18821,,,279172,,1326272,15957,1974359,18821 +"2020-09-16","CA",14615,,164,,,,3685,0,,1032,,0,,,,,,762963,762963,2950,0,,,,,,,,0,13000522,72352,,,,,,0,13000522,72352 +"2020-09-16","CO",2002,1651,6,351,7288,7288,248,26,,,739236,5602,152929,,,,,62686,58257,587,0,11393,,,,,,1153853,9912,1153853,9912,164320,,,,797493,6054,,0 +"2020-09-16","CT",4487,3592,2,895,11357,11357,70,0,,,,0,,,1480248,,,55166,52878,135,0,,,,,67835,9142,,0,1550296,24992,,,,,,0,1550296,24992 +"2020-09-16","DC",617,,1,,,,91,0,,24,,0,,,,,13,14743,,56,0,,,,,,11691,338241,1961,338241,1961,,,,,198409,683,,0 +"2020-09-16","DE",619,547,1,72,,,58,0,,11,246671,1649,,,,,,19234,18235,97,0,,,,,22184,10189,390957,2282,390957,2282,,,,,265905,1746,,0 +"2020-09-16","FL",13100,,154,,42327,42327,2464,200,,,4312822,12821,411877,403867,6054308,,,663234,650185,2288,0,34738,,34017,,864052,,7266009,51573,7266009,51573,446669,,437913,,4970495,15230,6958326,30294 +"2020-09-16","GA",6419,,21,,26884,26884,2030,219,4912,,,0,,,,,,299056,299056,2223,0,23408,,,,273177,,,0,2654121,25031,291168,,,,,0,2654121,25031 +"2020-09-16","GU",29,,1,,,,46,0,,10,42838,475,,,,,,2013,2013,47,0,2,,,,,1406,,0,44851,522,158,,,,,0,44849,522 +"2020-09-16","HI",100,100,1,,654,654,222,16,,60,252164,1036,,,,,48,10978,10844,65,0,,,,,10792,3885,349374,2853,349374,2853,,,,,263008,1101,354450,2313 +"2020-09-16","IA",1237,,3,,,,291,0,,79,621031,4696,,50683,,,32,74080,74080,803,0,,,3240,2201,,55067,,0,695111,5499,,,53963,17285,696656,5509,,0 +"2020-09-16","ID",423,385,4,38,1631,1631,105,19,426,34,245832,1194,,,,,,35810,32947,278,0,,,,,,19075,,0,278779,1411,,,,,278779,1411,,0 +"2020-09-16","IL",8599,8367,35,232,,,1565,0,,345,,0,,,,,143,268246,266151,1941,0,,,,,,,,0,4863138,52311,,,,,,0,4863138,52311 +"2020-09-16","IN",3472,3247,12,225,11918,11918,788,60,2363,237,1154083,6581,,,,,68,107809,,580,0,,,,,111213,,,0,1838954,29407,,,,,1261892,7161,1838954,29407 +"2020-09-16","KS",586,,52,,2616,2616,278,44,713,83,413356,4874,,,,225,21,50870,,971,0,,,,,,,,0,464226,5845,,,,,464226,5845,,0 +"2020-09-16","KY",1082,1073,8,9,4927,4927,565,3,1466,125,,0,,,,,,58764,52437,764,0,,,,,,11043,,0,1021452,21151,50206,18502,,,,0,1021452,21151 +"2020-09-16","LA",5294,5126,16,168,,,678,0,,,1955319,22614,,,,,107,159865,158826,612,0,,,,,,145570,,0,2115184,23226,,,,,,0,2114145,23122 +"2020-09-16","MA",9245,9036,20,209,12478,12478,352,16,,66,1872942,16337,,,,,24,125699,123720,306,0,,,,,162714,109397,,0,3131714,55902,,,117107,112394,1996662,16632,3131714,55902 +"2020-09-16","MD",3855,3712,6,143,14959,14959,347,41,,86,1365070,9533,,117647,,,,117888,117888,643,0,,,10993,,140960,7286,,0,2272265,26599,,,128640,,1482958,10176,2272265,26599 +"2020-09-16","ME",138,137,1,1,433,433,10,1,,5,,0,9542,,,,0,4941,4434,23,0,504,,,,5392,4307,,0,333982,5524,10060,,,,,0,333982,5524 +"2020-09-16","MI",6943,6623,11,320,,,590,0,,152,,0,,,3092719,,65,125742,113863,773,0,,,,,160228,85513,,0,3252947,31041,270746,,,,,0,3252947,31041 +"2020-09-16","MN",1985,1933,6,52,7019,7019,244,40,1977,136,1166579,4063,,,,,,85813,85813,462,0,,,,,,79583,1743611,10319,1743611,10319,,,,,1252392,4525,,0 +"2020-09-16","MO",1739,,7,,,,989,0,,,1057796,7440,,68427,1402394,,,106587,106587,1191,0,,,3241,,114421,,,0,1519434,9092,,,71668,,1164383,8631,1519434,9092 +"2020-09-16","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,61,61,0,0,,,,,,29,,0,14377,0,,,,,14375,0,18915,0 +"2020-09-16","MS",2756,2562,22,194,5499,5499,632,0,,168,541497,5709,,,,,98,91234,85384,711,0,,,,,,78971,,0,632731,6420,29016,40904,,,,0,626881,6536 +"2020-09-16","MT",141,,1,,543,543,106,4,,,,0,,,,,,9431,,187,0,,,,,,7186,,0,292401,3033,,,,,,0,292401,3033 +"2020-09-16","NC",3149,3149,38,,,,918,0,,297,,0,,,,,,188024,188024,1137,0,,,,,,,,0,2662357,15629,,,,,,0,2662357,15629 +"2020-09-16","ND",175,,0,,674,674,62,17,176,20,205724,1143,8651,,,,,16298,16298,265,0,377,,,,,13628,534223,5021,534223,5021,9028,8,,,222057,1412,553163,5218 +"2020-09-16","NE",436,,1,,2167,2167,167,13,,,369991,1958,,,497868,,,38970,,328,0,,,,,47177,29799,,0,546069,3790,,,,,409565,2295,546069,3790 +"2020-09-16","NH",438,,0,,723,723,8,1,230,,225951,1241,,,,,,7780,,32,0,,,,,,7083,,0,383551,3158,31215,,30515,,233731,1273,383551,3158 +"2020-09-16","NJ",16048,14263,9,1785,23032,23032,462,29,,100,3037180,22273,,,,,38,201985,197792,445,0,,,,,,,,0,3239165,22718,,,,,,0,3234972,22661 +"2020-09-16","NM",832,,2,,3294,3294,59,10,,,,0,,,,,,27041,,118,0,,,,,,14842,,0,837400,5405,,,,,,0,837400,5405 +"2020-09-16","NV",1494,,12,,,,488,0,,150,575285,2789,,,,,97,74248,74248,208,0,,,,,,,935072,8746,935072,8746,,,,,648814,3011,953155,4971 +"2020-09-16","NY",25410,,5,,89995,89995,483,0,,138,,0,,,,,67,446366,,652,0,,,,,,,9530416,75087,9530416,75087,,,,,,0,,0 +"2020-09-16","OH",4555,4256,49,299,14560,14560,651,79,3134,222,,0,,,,,133,140518,133046,1033,0,,,,,152474,118443,,0,2736683,28563,,,,,,0,2736683,28563 +"2020-09-16","OK",924,,12,,5610,5610,528,48,,213,955312,10118,,,955312,,,72284,72284,970,0,3581,,,,83065,61026,,0,1027596,11088,74483,,,,,0,1040699,11188 +"2020-09-16","OR",519,,8,,2292,2292,155,13,,34,588402,3082,,,913427,,11,29662,,178,0,,,,,53552,5353,,0,966979,5951,,,,,616625,3254,966979,5951 +"2020-09-16","PA",7903,,28,,,,488,0,,,1708131,12847,,,,,60,146990,142666,776,0,,,,,,120531,2674452,25110,2674452,25110,,,,,1850797,13563,,0 +"2020-09-16","PR",570,403,19,167,,,434,0,,68,305972,0,,,395291,,40,18252,18252,46,0,20032,,,,20103,,,0,324224,46,,,,,,0,415664,0 +"2020-09-16","RI",1081,,3,,2662,2662,84,12,,9,287986,1195,,,620944,,5,23358,,108,0,,,,,33159,,654103,11536,654103,11536,,,,,311344,1303,,0 +"2020-09-16","SC",3132,2968,34,164,8552,8552,784,50,,223,946800,5533,60764,,912118,,136,134122,131428,652,0,6001,7921,,,166110,51431,,0,1080922,6185,66765,24446,,,,0,1078228,6044 +"2020-09-16","SD",192,,8,,1211,1211,139,16,,,152364,3262,,,,,,17291,,297,0,,,,,23298,14657,,0,227968,2588,,,,,169655,3559,227968,2588 +"2020-09-16","TN",2151,2074,24,77,7922,7922,969,74,,283,,0,,,2328773,,124,177087,171574,1856,0,,,,,208950,160202,,0,2537723,27632,,,,,,0,2537723,27632 +"2020-09-16","TX",14478,,135,,,,3249,0,,1139,,0,,,,,,674772,674772,6026,0,33463,15103,,,784178,590837,,0,5992779,41587,377019,144928,,,,0,5992779,41587 +"2020-09-16","UT",437,,1,,3381,3381,139,20,837,54,666743,5412,,,857694,348,,59747,,747,0,,1422,,1338,65768,49728,,0,923462,9039,,12664,,9027,725946,6241,923462,9039 +"2020-09-16","VA",2884,2711,45,173,10389,10389,1027,52,,212,,0,,,,,103,136359,129963,845,0,9208,2379,,,155402,,1799851,14298,1799851,14298,137257,14367,,,,0,,0 +"2020-09-16","VI",19,,0,,,,,0,,,17440,120,,,,,,1232,,7,0,,,,,,1170,,0,18672,127,,,,,18682,120,,0 +"2020-09-16","VT",58,58,0,,,,6,0,,,148948,347,,,,,,1704,1701,2,0,,,,,,1530,,0,233912,961,,,,,150649,348,233912,961 +"2020-09-16","WA",2020,2020,5,,7162,7162,357,35,,,,0,,,,,29,82976,81937,511,0,,,,,,,1676702,10987,1676702,10987,,,,,,0,,0 +"2020-09-16","WI",1237,1228,8,9,6454,6454,370,48,1098,103,1295313,10788,,,,,,98440,92712,1502,0,,,,,,80627,2001116,18792,2001116,18792,,,,,1388025,12196,,0 +"2020-09-16","WV",290,288,10,2,,,156,0,,61,,0,,,,,30,13196,12881,220,0,,,,,,9670,,0,487577,3689,16483,,,,,0,487577,3689 +"2020-09-16","WY",46,,0,,235,235,16,5,,,85403,96,,,141514,,,4566,3866,128,0,,,,,4116,3971,,0,145630,2315,,,,,89269,200,145630,2315 +"2020-09-15","AK",44,44,0,,278,278,44,3,,,,0,,,400207,,8,6393,,43,0,,,,,6637,2402,,0,407124,3711,,,,,,0,407124,3711 +"2020-09-15","AL",2387,2253,32,134,15756,15756,716,0,1622,,892810,4718,,,,898,,140160,126813,701,0,,,,,,54223,,0,1019623,5232,,,55856,,1019623,5232,,0 +"2020-09-15","AR",1010,1003,18,7,4802,4802,389,66,,180,800759,43119,,,800759,606,68,71357,70125,730,0,,2779,,,,63415,,0,870884,43795,,18516,,,,0,870884,43795 +"2020-09-15","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-15","AZ",5344,5071,22,273,21800,21800,550,26,,138,1103095,11156,,,,,76,209209,207220,484,0,,,,,,,,0,1955538,18561,,,278475,,1310315,9651,1955538,18561 +"2020-09-15","CA",14451,,66,,,,3735,0,,1044,,0,,,,,,760013,760013,2235,0,,,,,,,,0,12928170,121981,,,,,,0,12928170,121981 +"2020-09-15","CO",1996,1645,6,351,7262,7262,273,22,,,733634,4576,152511,,,,,62099,57805,400,0,11370,,,,,,1143941,9275,1143941,9275,164320,,,,791439,4928,,0 +"2020-09-15","CT",4485,3590,0,895,11357,11357,71,0,,,,0,,,1455459,,,55031,52767,136,0,,,,,67639,9142,,0,1525304,23655,,,,,,0,1525304,23655 +"2020-09-15","DC",616,,0,,,,89,0,,23,,0,,,,,11,14687,,65,0,,,,,,11630,336280,4132,336280,4132,,,,,197726,2035,,0 +"2020-09-15","DE",618,546,1,72,,,61,0,,20,245022,1455,,,,,,19137,18138,200,0,,,,,22120,10165,388675,2659,388675,2659,,,,,264159,1655,,0 +"2020-09-15","FL",12946,,146,,42127,42127,2574,281,,,4300001,24723,411877,403867,6027117,,,660946,648279,2743,0,34738,,34017,,861098,,7214436,63096,7214436,63096,446669,,437913,,4955265,27490,6928032,43038 +"2020-09-15","GA",6398,,45,,26665,26665,2098,271,4870,,,0,,,,,,296833,296833,1496,0,23353,,,,270464,,,0,2629090,13843,290791,,,,,0,2629090,13843 +"2020-09-15","GU",28,,2,,,,47,0,,13,42363,396,,,,,,1966,1966,39,0,2,,,,,1312,,0,44329,435,158,,,,,0,44327,435 +"2020-09-15","HI",99,99,0,,638,638,225,2,,53,251128,2297,,,,,31,10913,10779,79,0,,,,,10720,3693,346521,3545,346521,3545,,,,,261907,2376,352137,3576 +"2020-09-15","IA",1234,,10,,,,284,0,,74,616335,2575,,50230,,,29,73277,73277,401,0,,,3224,2112,,54352,,0,689612,2976,,,53494,16832,691147,2990,,0 +"2020-09-15","ID",419,382,4,37,1612,1612,105,8,424,34,244638,1304,,,,,,35532,32730,253,0,,,,,,18826,,0,277368,1528,,,,,277368,1528,,0 +"2020-09-15","IL",8564,8332,18,232,,,1584,0,,373,,0,,,,,144,266305,264210,1466,0,,,,,,,,0,4810827,39031,,,,,,0,4810827,39031 +"2020-09-15","IN",3460,3235,21,225,11858,11858,809,62,2363,230,1147502,6749,,,,,68,107229,,689,0,,,,,110299,,,0,1809547,26378,,,,,1254731,7438,1809547,26378 +"2020-09-15","KS",534,,0,,2572,2572,192,0,703,50,408482,0,,,,221,15,49899,,0,0,,,,,,,,0,458381,0,,,,,458381,0,,0 +"2020-09-15","KY",1074,1065,9,9,4924,4924,533,19,1459,125,,0,,,,,,58000,51862,718,0,,,,,,10962,,0,1000301,9691,49842,17883,,,,0,1000301,9691 +"2020-09-15","LA",5278,5108,26,170,,,667,0,,,1932705,12288,,,,,99,159253,158318,371,0,,,,,,140440,,0,2091958,12659,,,,,,0,2091023,12659 +"2020-09-15","MA",9225,9016,6,209,12462,12462,310,20,,52,1856605,11510,,,,,23,125393,123425,313,0,,,,,162343,107501,,0,3075812,37187,,,116752,110849,1980030,11796,3075812,37187 +"2020-09-15","MD",3849,3706,10,143,14918,14918,371,34,,93,1355537,7320,,114639,,,,117245,117245,599,0,,,10638,,140136,7254,,0,2245666,19011,,,125277,,1472782,7919,2245666,19011 +"2020-09-15","ME",137,136,1,1,432,432,10,1,,5,,0,9503,,,,0,4918,4415,15,0,503,,,,5366,4280,,0,328458,2534,10020,,,,,0,328458,2534 +"2020-09-15","MI",6932,6612,11,320,,,590,0,,152,,0,,,3062652,,68,124969,113183,682,0,,,,,159254,85513,,0,3221906,25779,270031,,,,,0,3221906,25779 +"2020-09-15","MN",1979,1927,5,52,6979,6979,238,25,1971,131,1162516,4110,,,,,,85351,85351,402,0,,,,,,78953,1733292,8513,1733292,8513,,,,,1247867,4512,,0 +"2020-09-15","MO",1732,,18,,,,1021,0,,,1050356,9228,,68256,1394117,,,105396,105396,1317,0,,,3220,,113579,,,0,1510342,15029,,,71476,,1155752,10545,1510342,15029 +"2020-09-15","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,61,61,0,0,,,,,,29,,0,14377,0,,,,,14375,0,18915,0 +"2020-09-15","MS",2734,2543,28,191,5499,5499,667,0,,177,535788,0,,,,,88,90523,84912,505,0,,,,,,78971,,0,626311,505,28852,38649,,,,0,620345,0 +"2020-09-15","MT",140,,2,,539,539,109,8,,,,0,,,,,,9244,,137,0,,,,,,7150,,0,289368,3498,,,,,,0,289368,3498 +"2020-09-15","NC",3111,3111,51,,,,916,0,,297,,0,,,,,,186887,186887,1106,0,,,,,,,,0,2646728,18342,,,,,,0,2646728,18342 +"2020-09-15","ND",175,,2,,657,657,62,11,171,18,204581,182,8651,,,,,16033,16033,232,0,377,,,,,13328,529202,1667,529202,1667,9028,3,,,220645,415,547945,1818 +"2020-09-15","NE",435,,1,,2154,2154,176,15,,,368033,2403,,,494481,,,38642,,307,0,,,,,46778,29597,,0,542279,3979,,,,,407270,2724,542279,3979 +"2020-09-15","NH",438,,2,,722,722,9,1,230,,224710,608,,,,,,7748,,34,0,,,,,,7022,,0,380393,3001,31165,,30469,,232458,642,380393,3001 +"2020-09-15","NJ",16039,14254,9,1785,23003,23003,406,38,,90,3014907,21905,,,,,35,201540,197404,489,0,,,,,,,,0,3216447,22394,,,,,,0,3212311,22341 +"2020-09-15","NM",830,,7,,3284,3284,59,10,,,,0,,,,,,26923,,81,0,,,,,,14634,,0,831995,5376,,,,,,0,831995,5376 +"2020-09-15","NV",1482,,26,,,,483,0,,154,572496,1439,,,,,98,74040,74040,226,0,,,,,,,926326,8578,926326,8578,,,,,645803,1468,948184,2538 +"2020-09-15","NY",25405,,11,,89995,89995,481,0,,144,,0,,,,,60,445714,,766,0,,,,,,,9455329,73678,9455329,73678,,,,,,0,,0 +"2020-09-15","OH",4506,4207,87,299,14481,14481,666,103,3111,223,,0,,,,,126,139485,132118,1001,0,,,,,151760,117130,,0,2708120,31151,,,,,,0,2708120,31151 +"2020-09-15","OK",912,,7,,5562,5562,561,96,,224,945194,25018,,,945194,,,71314,71314,1091,0,3581,,,,82404,59993,,0,1016508,26109,74483,,,,,0,1029511,28599 +"2020-09-15","OR",511,,2,,2279,2279,135,44,,32,585320,2037,,,907688,,13,29484,,147,0,,,,,53340,5310,,0,961028,3734,,,,,613371,9037,961028,3734 +"2020-09-15","PA",7875,,6,,,,483,0,,,1695284,10675,,,,,61,146214,141950,1151,0,,,,,,119895,2649342,25087,2649342,25087,,,,,1837234,11783,,0 +"2020-09-15","PR",551,385,9,166,,,408,0,,65,305972,0,,,395291,,44,18206,18206,229,0,19966,,,,20103,,,0,324178,229,,,,,,0,415664,0 +"2020-09-15","RI",1078,,3,,2650,2650,81,6,,9,286791,1724,,,609747,,5,23250,,120,0,,,,,32820,,642567,6849,642567,6849,,,,,310041,1844,,0 +"2020-09-15","SC",3098,2943,21,155,8502,8502,745,54,,211,941267,-14526,60657,,906722,,127,133470,130917,790,0,5967,7763,,,165462,51431,,0,1074737,-13736,66624,23477,,,,0,1072184,-13865 +"2020-09-15","SD",184,,0,,1195,1195,133,24,,,149102,764,,,,,,16994,,193,0,,,,,23062,14424,,0,225380,2232,,,,,166096,957,225380,2232 +"2020-09-15","TN",2127,2050,30,77,7848,7848,888,82,,291,,0,,,2303410,,119,175231,169893,957,0,,,,,206681,158660,,0,2510091,22384,,,,,,0,2510091,22384 +"2020-09-15","TX",14343,,132,,,,3311,0,,1151,,0,,,,,,668746,668746,5342,0,33086,14992,,,781588,585912,,0,5951192,39383,373766,142179,,,,0,5951192,39383 +"2020-09-15","UT",436,,0,,3361,3361,178,23,833,50,661331,4847,,,849577,346,,59000,,562,0,,1403,,1320,64846,49327,,0,914423,7801,,12385,,8913,719705,5762,914423,7801 +"2020-09-15","VA",2839,2691,96,148,10337,10337,1015,44,,228,,0,,,,,104,135514,129259,943,0,9173,2318,,,154395,,1785553,12395,1785553,12395,137017,12299,,,,0,,0 +"2020-09-15","VI",19,,0,,,,,0,,,17320,190,,,,,,1225,,4,0,,,,,,1159,,0,18545,194,,,,,18562,208,,0 +"2020-09-15","VT",58,58,0,,,,7,0,,,148601,414,,,,,,1702,1700,7,0,,,,,,1524,,0,232951,990,,,,,150301,420,232951,990 +"2020-09-15","WA",2015,2015,9,,7127,7127,348,29,,,,0,,,,,28,82465,81464,138,0,,,,,,,1665715,11748,1665715,11748,,,,,,0,,0 +"2020-09-15","WI",1229,1220,11,9,6406,6406,343,56,1090,95,1284525,10918,,,,,,96938,91304,1441,0,,,,,,79557,1982324,15529,1982324,15529,,,,,1375829,12266,,0 +"2020-09-15","WV",280,278,5,2,,,155,0,,59,,0,,,,,26,12976,12672,156,0,,,,,,9536,,0,483888,2902,16394,,,,,0,483888,2902 +"2020-09-15","WY",46,,0,,230,230,16,0,,,85307,693,,,139273,,,4438,3762,46,0,,,,,4042,3925,,0,143315,2499,,,,,89069,732,143315,2499 +"2020-09-14","AK",44,44,0,,275,275,37,3,,,,0,,,396600,,8,6350,,75,0,,,,,6533,2377,,0,403413,2200,,,,,,0,403413,2200 +"2020-09-14","AL",2355,2221,4,134,15756,15756,792,229,1611,,888092,3660,,,,892,,139459,126299,704,0,,,,,,54223,,0,1014391,4164,,,55780,,1014391,4164,,0 +"2020-09-14","AR",992,986,11,6,4736,4736,378,17,,175,757640,5791,,,757640,603,76,70627,69449,408,0,,2779,,,,62740,,0,827089,6190,,18516,,,,0,827089,6190 +"2020-09-14","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-14","AZ",5322,5049,0,273,21774,21774,489,1,,168,1091939,4314,,,,,81,208725,206775,213,0,,,,,,,,0,1936977,5262,,,278029,,1300664,4527,1936977,5262 +"2020-09-14","CA",14385,,56,,,,3665,0,,1040,,0,,,,,,757778,757778,2855,0,,,,,,,,0,12806189,116173,,,,,,0,12806189,116173 +"2020-09-14","CO",1990,1639,2,351,7240,7240,239,13,,,729058,5852,152267,,,,,61699,57453,375,0,11348,,,,,,1134666,10485,1134666,10485,163615,,,,786511,6206,,0 +"2020-09-14","CT",4485,3590,5,895,11357,11357,64,0,,,,0,,,1432096,,,54895,52624,569,0,,,,,67356,9142,,0,1501649,7361,,,,,,0,1501649,7361 +"2020-09-14","DC",616,,0,,,,91,0,,22,,0,,,,,8,14622,,30,0,,,,,,11592,332148,1507,332148,1507,,,,,195691,531,,0 +"2020-09-14","DE",617,545,2,72,,,64,0,,18,243567,1120,,,,,,18937,17945,88,0,,,,,22031,10091,386016,4996,386016,4996,,,,,262504,1208,,0 +"2020-09-14","FL",12800,,36,,41846,41846,2637,77,,,4275278,15342,411877,403867,5988176,,,658203,645799,1718,0,34738,,34017,,857173,,7151340,46031,7151340,46031,446669,,437913,,4927775,17073,6884994,29201 +"2020-09-14","GA",6353,,20,,26394,26394,2134,25,4830,,,0,,,,,,295337,295337,1023,0,23344,,,,269415,,,0,2615247,13045,290730,,,,,0,2615247,13045 +"2020-09-14","GU",26,,0,,,,50,0,,15,41967,495,,,,,,1927,1927,36,0,2,,,,,1274,,0,43894,531,158,,,,,0,43892,881 +"2020-09-14","HI",99,99,2,,636,636,225,1,,53,248831,4020,,,,,31,10834,10700,112,0,,,,,10644,3565,342976,6406,342976,6406,,,,,259531,4132,348561,6359 +"2020-09-14","IA",1224,,6,,,,272,0,,75,613760,2805,,49983,,,29,72876,72876,386,0,,,3205,2024,,53417,,0,686636,3191,,,53228,16383,688157,3198,,0 +"2020-09-14","ID",415,378,0,37,1604,1604,165,8,423,46,243334,1378,,,,,,35279,32506,112,0,,,,,,18619,,0,275840,1473,,,,,275840,1473,,0 +"2020-09-14","IL",8546,8314,5,232,,,1431,0,,335,,0,,,,,131,264839,262744,1373,0,,,,,,,,0,4771796,35930,,,,,,0,4771796,35930 +"2020-09-14","IN",3439,3215,1,224,11796,11796,844,47,2353,230,1140753,7573,,,,,74,106540,,736,0,,,,,109242,,,0,1783169,4380,,,,,1247293,8309,1783169,4380 +"2020-09-14","KS",534,,23,,2572,2572,192,35,703,50,408482,7938,,,,221,15,49899,,1513,0,,,,,,,,0,458381,9451,,,,,458381,9451,,0 +"2020-09-14","KY",1065,1056,5,9,4905,4905,504,19,1454,119,,0,,,,,,57282,51317,337,0,,,,,,10918,,0,990610,66268,49374,17451,,,,0,990610,66268 +"2020-09-14","LA",5252,5082,17,170,,,664,0,,,1920417,12077,,,,,105,158882,157947,492,0,,,,,,140440,,0,2079299,12569,,,,,,0,2078364,12569 +"2020-09-14","MA",9219,9010,9,209,12442,12442,302,11,,63,1845095,11966,,,,,17,125080,123139,254,0,,,,,161982,107501,,0,3038625,32467,,,116598,109470,1968234,12201,3038625,32467 +"2020-09-14","MD",3839,3696,1,143,14884,14884,347,33,,90,1348217,8482,,114639,,,,116646,116646,536,0,,,10638,,139370,7229,,0,2226655,19197,,,125277,,1464863,9018,2226655,19197 +"2020-09-14","ME",136,135,0,1,431,431,9,0,,5,,0,9478,,,,3,4903,4401,40,0,503,,,,5350,4237,,0,325924,3542,9995,,,,,0,325924,3542 +"2020-09-14","MI",6921,6601,10,320,,,590,0,,152,,0,,,3037800,,82,124287,112612,1229,0,,,,,158327,85513,,0,3196127,51636,269507,,,,,0,3196127,51636 +"2020-09-14","MN",1974,1922,3,52,6954,6954,233,23,1965,135,1158406,9412,,,,,,84949,84949,638,0,,,,,,78238,1724779,17265,1724779,17265,,,,,1243355,10050,,0 +"2020-09-14","MO",1714,,9,,,,1010,0,,,1041128,15175,,68231,1380372,,,104079,104079,1332,0,,,3221,,112317,,,0,1495313,19730,,,71452,,1145207,16507,1495313,19730 +"2020-09-14","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,61,61,1,0,,,,,,29,,0,14377,1,,,,,14375,0,18915,0 +"2020-09-14","MS",2706,2523,9,183,5499,5499,513,89,,171,535788,2869,,,,,,90018,84557,144,0,,,,,,78971,,0,625806,3013,28852,38649,,,,0,620345,3184 +"2020-09-14","MT",138,,3,,531,531,144,6,,,,0,,,,,,9107,,86,0,,,,,,6842,,0,285870,5746,,,,,,0,285870,5746 +"2020-09-14","NC",3060,3060,8,,,,895,0,,293,,0,,,,,,185781,185781,845,0,,,,,,,,0,2628386,26203,,,,,,0,2628386,26203 +"2020-09-14","ND",173,,2,,646,646,65,3,171,19,204399,1370,8651,,,,,15801,15801,252,0,377,,,,,12903,527535,3965,527535,3965,9028,3,,,220230,1624,546127,4277 +"2020-09-14","NE",434,,0,,2139,2139,169,2,,,365630,3054,,,490851,,,38335,,227,0,,,,,46431,29405,,0,538300,4640,,,,,404546,3293,538300,4640 +"2020-09-14","NH",436,,0,,721,721,7,0,229,,224102,1256,,,,,,7714,,18,0,,,,,,6987,,0,377392,4444,31129,,30439,,231816,1274,377392,4444 +"2020-09-14","NJ",16030,14245,4,1785,22965,22965,420,2,,91,2993002,21106,,,,,41,201051,196968,368,0,,,,,,,,0,3194053,21474,,,,,,0,3189970,21440 +"2020-09-14","NM",823,,0,,3274,3274,60,7,,,,0,,,,,,26842,,81,0,,,,,,14470,,0,826619,3474,,,,,,0,826619,3474 +"2020-09-14","NV",1456,,4,,,,473,0,,158,571057,2519,,,,,99,73814,73814,277,0,,,,,,,917748,1719,917748,1719,,,,,644335,2803,945646,5781 +"2020-09-14","NY",25394,,4,,89995,89995,464,0,,143,,0,,,,,59,444948,,583,0,,,,,,,9381651,63358,9381651,63358,,,,,,0,,0 +"2020-09-14","OH",4419,4126,4,293,14378,14378,671,64,3097,224,,0,,,,,121,138484,131235,1079,0,,,,,150787,115708,,0,2676969,33909,,,,,,0,2676969,33909 +"2020-09-14","OK",905,,0,,5466,5466,499,15,,186,920176,0,,,920176,,,70223,70223,869,0,3581,,,,79689,59007,,0,990399,869,74483,,,,,0,1000912,0 +"2020-09-14","OR",509,,4,,2235,2235,161,0,,43,583283,2335,,,904083,,19,29337,,181,0,,,,,53211,5310,,0,957294,8396,,,,,604334,0,957294,8396 +"2020-09-14","PA",7869,,32,,,,472,0,,,1684609,20609,,,,,59,145063,140842,1182,0,,,,,,118951,2624255,21298,2624255,21298,,,,,1825451,21752,,0 +"2020-09-14","PR",542,376,3,166,,,414,0,,63,305972,0,,,395291,,37,17977,17977,208,0,19773,,,,20103,,,0,323949,208,,,,,,0,415664,0 +"2020-09-14","RI",1075,,0,,2644,2644,80,0,,7,285067,682,,,603012,,4,23130,,32,0,,,,,32706,,635718,2208,635718,2208,,,,,308197,714,,0 +"2020-09-14","SC",3077,2922,13,155,8448,8448,733,22,,203,955793,15794,60621,,913799,,123,132680,130256,816,0,5960,,,,172250,51431,,0,1088473,16610,66581,,,,,0,1086049,16566 +"2020-09-14","SD",184,,0,,1171,1171,110,6,,,148338,1020,,,,,,16801,,163,0,,,,,22864,14118,,0,223148,2168,,,,,165139,1183,223148,2168 +"2020-09-14","TN",2097,2026,19,71,7766,7766,833,56,,262,,0,,,2282076,,131,174274,169130,2450,0,,,,,205631,156808,,0,2487707,36583,,,,,,0,2487707,36583 +"2020-09-14","TX",14211,,21,,,,3391,0,,1165,,0,,,,,,663404,663404,3970,0,33050,14852,,,778772,581204,,0,5911809,9711,373406,137788,,,,0,5911809,9711 +"2020-09-14","UT",436,,3,,3338,3338,170,12,829,54,656484,2386,,,842751,345,,58438,,563,0,,1345,,1263,63871,48934,,0,906622,4073,,11216,,8321,713943,2749,906622,4073 +"2020-09-14","VA",2743,2607,19,136,10293,10293,1006,49,,220,,0,,,,,110,134571,128400,757,0,9163,2257,,,153493,,1773158,13062,1773158,13062,136928,10980,,,,0,,0 +"2020-09-14","VI",19,,0,,,,,0,,,17130,7,,,,,,1221,,1,0,,,,,,1144,,0,18351,8,,,,,18354,8,,0 +"2020-09-14","VT",58,58,0,,,,3,0,,,148187,746,,,,,,1695,1694,11,0,,,,,,1509,,0,231961,3677,,,,,149881,757,231961,3677 +"2020-09-14","WA",2006,2006,15,,7098,7098,385,17,,,,0,,,,,26,82327,81327,239,0,,,,,,,1653967,9382,1653967,9382,,,,,,0,,0 +"2020-09-14","WI",1218,1210,0,8,6350,6350,341,18,1083,98,1273607,3149,,,,,,95497,89956,818,0,,,,,,78527,1966795,12435,1966795,12435,,,,,1363563,3920,,0 +"2020-09-14","WV",275,273,9,2,,,151,0,,58,,0,,,,,24,12820,12519,121,0,,,,,,9361,,0,480986,4246,16360,,,,,0,480986,4246 +"2020-09-14","WY",46,,4,,230,230,13,2,,,84614,2523,,,136830,,,4392,3723,46,0,,,,,3986,3884,,0,140816,2763,,,,,88337,2641,140816,2763 +"2020-09-13","AK",44,44,0,,272,272,35,1,,,,0,,,394452,,8,6275,,61,0,,,,,6481,2377,,0,401213,1584,,,,,,0,401213,1584 +"2020-09-13","AL",2351,2218,1,133,15527,15527,790,0,1610,,884432,5709,,,,892,,138755,125795,1109,0,,,,,,54223,,0,1010227,6681,,,55599,,1010227,6681,,0 +"2020-09-13","AR",981,976,12,5,4719,4719,381,41,,160,751849,1559,,,751849,601,83,70219,69050,509,0,,2757,,,,61819,,0,820899,545,,17863,,,,0,820899,545 +"2020-09-13","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-13","AZ",5322,5049,7,273,21773,21773,525,0,,171,1087625,7024,,,,,87,208512,206611,384,0,,,,,,,,0,1931715,7128,,,277020,,1296137,9313,1931715,7128 +"2020-09-13","CA",14329,,78,,,,3741,0,,1056,,0,,,,,,754923,754923,4625,0,,,,,,,,0,12690016,133049,,,,,,0,12690016,133049 +"2020-09-13","CO",1988,1637,0,351,7227,7227,228,4,,,723206,6625,151964,,,,,61324,57099,417,0,11326,,,,,,1124181,12609,1124181,12609,163290,,,,780305,7020,,0 +"2020-09-13","CT",4480,3595,0,885,11357,11357,51,0,,,,0,,,1424834,,,54326,52095,0,0,,,,,67265,9142,,0,1494288,7981,,,,,,0,1494288,7981 +"2020-09-13","DC",616,,0,,,,88,0,,23,,0,,,,,11,14592,,40,0,,,,,,11574,330641,3204,330641,3204,,,,,195160,1117,,0 +"2020-09-13","DE",615,543,2,72,,,68,0,,17,242447,1588,,,,,,18849,17857,123,0,,,,,21927,10077,381020,3491,381020,3491,,,,,261296,1711,,0 +"2020-09-13","FL",12764,,8,,41769,41769,2631,82,,,4259936,19827,411877,403867,5961411,,,656485,644180,2395,0,34738,,34017,,854899,,7105309,56042,7105309,56042,446669,,437913,,4910702,22211,6855793,37766 +"2020-09-13","GA",6333,,46,,26369,26369,2138,42,4827,,,0,,,,,,294314,294314,1409,0,23194,,,,268347,,,0,2602202,17945,289794,,,,,0,2602202,17945 +"2020-09-13","GU",26,,1,,,,50,0,,11,41472,0,,,,,,1891,1891,0,0,2,,,,,1118,,0,43363,0,158,,,,,0,43011,0 +"2020-09-13","HI",97,97,1,,635,635,220,13,,51,244811,5231,,,,,41,10722,10588,129,0,,,,,10531,3418,336570,7349,336570,7349,,,,,255399,5360,342202,7446 +"2020-09-13","IA",1218,,1,,,,274,0,,79,610955,3771,,49956,,,28,72490,72490,784,0,,,3199,2016,,53151,,0,683445,4555,,,53195,16319,684959,4538,,0 +"2020-09-13","ID",415,378,3,37,1596,1596,165,27,422,46,241956,1296,,,,,,35167,32411,217,0,,,,,,18406,,0,274367,1479,,,,,274367,1479,,0 +"2020-09-13","IL",8541,8309,14,232,,,1422,0,,328,,0,,,,,136,263466,261371,1462,0,,,,,,,,0,4735866,46890,,,,,,0,4735866,46890 +"2020-09-13","IN",3438,3214,1,224,11749,11749,731,39,2338,219,1133180,30761,,,,,72,105804,,1243,0,,,,,108988,,,0,1778789,6884,,,,,1238984,32004,1778789,6884 +"2020-09-13","KS",511,,0,,2537,2537,140,0,690,40,400544,0,,,,219,10,48386,,0,0,,,,,,,,0,448930,0,,,,,448930,0,,0 +"2020-09-13","KY",1060,1051,3,9,4886,4886,587,0,1454,148,,0,,,,,,56945,51018,530,0,,,,,,10872,,0,924342,0,49234,17381,,,,0,924342,0 +"2020-09-13","LA",5235,5065,33,170,,,680,0,,,1908340,27696,,,,,107,158390,157455,1281,0,,,,,,140440,,0,2066730,28977,,,,,,0,2065795,28977 +"2020-09-13","MA",9210,9001,14,209,12431,12431,313,5,,61,1833129,11835,,,,,21,124826,122904,286,0,,,,,161677,107501,,0,3006158,37435,,,116531,108478,1956033,12102,3006158,37435 +"2020-09-13","MD",3838,3695,2,143,14851,14851,351,55,,89,1339735,10816,,114639,,,,116110,116110,577,0,,,10638,,138731,7225,,0,2207458,23517,,,125277,,1455845,11393,2207458,23517 +"2020-09-13","ME",136,135,1,1,431,431,11,0,,6,,0,9473,,,,3,4863,4376,29,0,503,,,,5322,4226,,0,322382,5049,9990,,,,,0,322382,5049 +"2020-09-13","MI",6911,6591,0,320,,,627,0,,172,,0,,,2987552,,77,123058,111524,0,0,,,,,156939,85513,,0,3144491,0,268368,,,,,0,3144491,0 +"2020-09-13","MN",1971,1919,13,52,6931,6931,241,32,1957,136,1148994,10060,,,,,,84311,84311,723,0,,,,,,77461,1707514,22994,1707514,22994,,,,,1233305,10783,,0 +"2020-09-13","MO",1705,,1,,,,971,0,,,1025953,13714,,67952,1362014,,,102747,102747,1613,0,,,3196,,110962,,,0,1475583,18739,,,71148,,1128700,15327,1475583,18739 +"2020-09-13","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,60,60,0,0,,,,,,29,,0,14376,0,,,,,14375,0,18915,0 +"2020-09-13","MS",2697,2514,12,183,5410,5410,542,0,,179,532919,0,,,,,,89874,84451,254,0,,,,,,74098,,0,622793,254,28693,38257,,,,0,617161,0 +"2020-09-13","MT",135,,2,,525,525,145,4,,,,0,,,,,,9021,,96,0,,,,,,6830,,0,280124,1396,,,,,,0,280124,1396 +"2020-09-13","NC",3052,3052,5,,,,831,0,,270,,0,,,,,,184936,184936,1196,0,,,,,,,,0,2602183,33367,,,,,,0,2602183,33367 +"2020-09-13","ND",171,,1,,643,643,62,9,170,18,203029,1599,8650,,,,,15549,15549,429,0,376,,,,,12655,523570,8150,523570,8150,9026,3,,,218606,2025,541850,8510 +"2020-09-13","NE",434,,0,,2137,2137,163,6,,,362576,3063,,,486466,,,38108,,267,0,,,,,46179,29167,,0,533660,4909,,,,,401253,3349,533660,4909 +"2020-09-13","NH",436,,1,,721,721,7,0,228,,222846,1474,,,,,,7696,,44,0,,,,,,6953,,0,372948,3257,31107,,30419,,230542,1518,372948,3257 +"2020-09-13","NJ",16026,14242,5,1784,22963,22963,444,13,,98,2971896,26998,,,,,37,200683,196634,324,0,,,,,,,,0,3172579,27322,,,,,,0,3168530,27744 +"2020-09-13","NM",823,,2,,3267,3267,59,4,,,,0,,,,,,26761,,100,0,,,,,,14407,,0,823145,5875,,,,,,0,823145,5875 +"2020-09-13","NV",1452,,3,,,,476,0,,165,568538,3856,,,,,102,73537,73537,317,0,,,,,,,916029,3115,916029,3115,,,,,641532,4224,939865,7891 +"2020-09-13","NY",25390,,6,,89995,89995,464,0,,131,,0,,,,,54,444365,,725,0,,,,,,,9318293,72668,9318293,72668,,,,,,0,,0 +"2020-09-13","OH",4415,4122,4,293,14314,14314,635,30,3088,215,,0,,,,,126,137405,130196,837,0,,,,,149694,114906,,0,2643060,31418,,,,,,0,2643060,31418 +"2020-09-13","OK",905,,6,,5451,5451,499,27,,186,920176,0,,,920176,,,69354,69354,695,0,3581,,,,79689,58560,,0,989530,695,74483,,,,,0,1000912,0 +"2020-09-13","OR",505,,6,,2235,2235,161,0,,43,580948,4074,,,896162,,19,29156,,291,0,,,,,52736,5310,,0,948898,8557,,,,,604334,0,948898,8557 +"2020-09-13","PA",7837,,0,,,,463,0,,,1664000,0,,,,,60,143881,139699,76,0,,,,,,117920,2602957,19968,2602957,19968,,,,,1803699,76,,0 +"2020-09-13","PR",539,373,4,166,,,396,0,,67,305972,0,,,395291,,50,17769,17769,171,0,19611,,,,20103,,,0,323741,171,,,,,,0,415664,0 +"2020-09-13","RI",1075,,3,,2644,2644,80,5,,7,284385,1248,,,600850,,4,23098,,99,0,,,,,32660,,633510,5419,633510,5419,,,,,307483,1347,,0 +"2020-09-13","SC",3064,2915,24,149,8426,8426,752,24,,205,939999,15105,60519,,898428,,130,131864,129484,1886,0,5907,,,,171055,51431,,0,1071863,16991,66426,,,,,0,1069483,16943 +"2020-09-13","SD",184,,1,,1165,1165,110,13,,,147318,1146,,,,,,16638,,201,0,,,,,22677,13993,,0,220980,2712,,,,,163956,1347,220980,2712 +"2020-09-13","TN",2078,2008,14,70,7710,7710,820,31,,261,,0,,,2248108,,122,171824,166799,933,0,,,,,203016,155865,,0,2451124,13359,,,,,,0,2451124,13359 +"2020-09-13","TX",14190,,47,,,,3319,0,,1140,,0,,,,,,659434,659434,1845,0,34286,14801,,,777965,577832,,0,5902098,14977,390318,137241,,,,0,5902098,14977 +"2020-09-13","UT",433,,0,,3326,3326,178,15,828,52,654098,3114,,,839054,344,,57875,,628,0,,1326,,1245,63495,48690,,0,902549,6237,,11059,,8196,711194,3584,902549,6237 +"2020-09-13","VA",2724,2591,2,133,10244,10244,1012,26,,232,,0,,,,,119,133814,127672,874,0,9145,2236,,,152703,,1760096,16076,1760096,16076,136675,10830,,,,0,,0 +"2020-09-13","VI",19,,0,,,,,0,,,17123,111,,,,,,1220,,9,0,,,,,,1144,,0,18343,120,,,,,18346,118,,0 +"2020-09-13","VT",58,58,0,,,,1,0,,,147441,894,,,,,,1684,1683,7,0,,,,,,1505,,0,228284,4188,,,,,149124,901,228284,4188 +"2020-09-13","WA",1991,1991,0,,7081,7081,371,33,,,,0,,,,,29,82088,81096,478,0,,,,,,,1644585,13423,1644585,13423,,,,,,0,,0 +"2020-09-13","WI",1218,1210,1,8,6332,6332,313,23,1080,93,1270458,6153,,,,,,94679,89185,1624,0,,,,,,77750,1954360,18857,1954360,18857,,,,,1359643,7735,,0 +"2020-09-13","WV",266,264,1,2,,,147,0,,58,,0,,,,,26,12699,12403,178,0,,,,,,9290,,0,476740,4854,16321,,,,,0,476740,4854 +"2020-09-13","WY",42,,0,,228,228,12,-59,,,82091,0,,,134170,,,4346,3679,49,0,,,,,3883,3768,,0,138053,238,,,,,85696,0,138053,238 +"2020-09-12","AK",44,44,1,,271,271,32,1,,,,0,,,392921,,8,6214,,103,0,,,,,6428,2377,,0,399629,5043,,,,,,0,399629,5043 +"2020-09-12","AL",2350,2217,17,133,15527,15527,793,0,1608,,878723,4504,,,,891,,137646,124823,943,0,,,,,,54223,,0,1003546,5230,,,55442,,1003546,5230,,0 +"2020-09-12","AR",969,964,16,5,4678,4678,392,0,,170,750290,20915,,,750290,597,76,69710,68542,727,0,,2709,,,,61245,,0,820354,24175,,17549,,,,0,820354,24175 +"2020-09-12","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-12","AZ",5315,5041,27,274,21773,21773,574,26,,185,1080601,8700,,,,,93,208128,206223,605,0,,,,,,,,0,1924587,14887,,,276179,,1286824,9281,1924587,14887 +"2020-09-12","CA",14251,,162,,,,3848,0,,1120,,0,,,,,,750298,750298,4107,0,,,,,,,,0,12556967,105307,,,,,,0,12556967,105307 +"2020-09-12","CO",1988,1637,3,351,7223,7223,226,15,,,716581,6846,151566,,,,,60907,56704,415,0,11300,,,,,,1111572,13587,1111572,13587,162866,,,,773285,7172,,0 +"2020-09-12","CT",4480,3595,0,885,11357,11357,51,0,,,,0,,,1417008,,,54326,52095,0,0,,,,,67111,9142,,0,1486307,17365,,,,,,0,1486307,17365 +"2020-09-12","DC",616,,0,,,,98,0,,24,,0,,,,,12,14552,,59,0,,,,,,11561,327437,6001,327437,6001,,,,,194043,1808,,0 +"2020-09-12","DE",613,541,0,72,,,66,0,,15,240859,2627,,,,,,18726,17734,260,0,,,,,21817,10063,377529,2418,377529,2418,,,,,259585,2887,,0 +"2020-09-12","FL",12756,,98,,41687,41687,2683,193,,,4240109,21734,411877,403867,5926779,,,654090,641864,3168,0,34738,,34017,,851937,,7049267,71355,7049267,71355,446669,,437913,,4888491,24921,6818027,42983 +"2020-09-12","GA",6287,,41,,26327,26327,2114,164,4818,,,0,,,,,,292905,292905,2124,0,23016,,,,266991,,,0,2584257,25938,288667,,,,,0,2584257,25938 +"2020-09-12","GU",25,,2,,,,50,0,,11,41472,322,,,,,,1891,1891,28,0,2,,,,,1118,,0,43363,350,158,,,,,0,43011,0 +"2020-09-12","HI",96,96,2,,622,622,220,12,,51,239580,3389,,,,,41,10593,10459,170,0,,,,,10398,3334,329221,5724,329221,5724,,,,,250039,3556,334756,5547 +"2020-09-12","IA",1217,,6,,,,290,0,,90,607184,4720,,49687,,,35,71706,71706,573,0,,,3188,1991,,52953,,0,678890,5293,,,52915,16279,680421,5295,,0 +"2020-09-12","ID",412,375,5,37,1569,1569,165,18,412,46,240660,1461,,,,,,34950,32228,333,0,,,,,,18052,,0,272888,1746,,,,,272888,1746,,0 +"2020-09-12","IL",8527,8295,22,232,,,1509,0,,344,,0,,,,,170,262004,259909,2121,0,,,,,,,,0,4688976,56594,,,,,,0,4688976,56594 +"2020-09-12","IN",3437,3213,17,224,11710,11710,807,59,2327,234,1102419,22820,,,,,70,104561,,1056,0,,,,,108696,,,0,1771905,24599,,,,,1206980,23876,1771905,24599 +"2020-09-12","KS",511,,0,,2537,2537,140,0,690,40,400544,0,,,,219,10,48386,,0,0,,,,,,,,0,448930,0,,,,,448930,0,,0 +"2020-09-12","KY",1057,1048,13,9,4886,4886,587,24,1454,148,,0,,,,,,56415,50535,711,0,,,,,,10872,,0,924342,29377,49234,17381,,,,0,924342,29377 +"2020-09-12","LA",5202,5032,0,170,,,723,0,,,1880644,0,,,,,117,157109,156174,0,0,,,,,,140440,,0,2037753,0,,,,,,0,2036818,0 +"2020-09-12","MA",9196,8987,16,209,12426,12426,331,15,,64,1821294,17878,,,,,25,124540,122637,554,0,,,,,161336,107501,,0,2968723,63370,,,116242,106383,1943931,18313,2968723,63370 +"2020-09-12","MD",3836,3693,8,143,14796,14796,361,40,,85,1328919,10767,,114639,,,,115533,115533,809,0,,,10638,,137934,7221,,0,2183941,33303,,,125277,,1444452,11576,2183941,33303 +"2020-09-12","ME",135,134,1,1,431,431,10,-1,,6,,0,9440,,,,4,4834,4349,42,0,503,,,,5295,4211,,0,317333,4884,9957,,,,,0,317333,4884 +"2020-09-12","MI",6911,6591,11,320,,,627,0,,172,,0,,,2987552,,77,123058,111524,807,0,,,,,156939,85513,,0,3144491,38323,268368,,,,,0,3144491,38323 +"2020-09-12","MN",1958,1906,9,52,6899,6899,247,36,1949,140,1138934,9090,,,,,,83588,83588,872,0,,,,,,76650,1684520,19192,1684520,19192,,,,,1222522,9962,,0 +"2020-09-12","MO",1704,,3,,,,1040,0,,,1012239,14827,,67809,1344724,,,101134,101134,1974,0,,,3188,,109562,,,0,1456844,19114,,,70997,,1113373,16801,1456844,19114 +"2020-09-12","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,60,60,1,0,,,,,,29,,0,14376,1,,,,,14375,0,18915,0 +"2020-09-12","MS",2685,2502,15,183,5410,5410,542,0,,179,532919,3715,,,,,,89620,84242,445,0,,,,,,74098,,0,622539,4160,28693,38257,,,,0,617161,4039 +"2020-09-12","MT",133,,2,,521,521,144,3,,,,0,,,,,,8925,,140,0,,,,,,6824,,0,278728,4070,,,,,,0,278728,4070 +"2020-09-12","NC",3047,3047,24,,,,870,0,,287,,0,,,,,,183740,183740,1454,0,,,,,,,,0,2568816,38681,,,,,,0,2568816,38681 +"2020-09-12","ND",170,,7,,634,634,56,4,169,18,201430,1038,8647,,,,,15120,15120,466,0,373,,,,,12450,515420,9022,515420,9022,9020,2,,,216581,1505,533340,9557 +"2020-09-12","NE",434,,4,,2131,2131,166,12,,,359513,3074,,,481871,,,37841,,468,0,,,,,45868,28816,,0,528751,5737,,,,,397904,3562,528751,5737 +"2020-09-12","NH",435,,1,,721,721,6,1,228,,221372,1701,,,,,,7652,,32,0,,,,,,6920,,0,369691,4046,31079,,30329,,229024,1733,369691,4046 +"2020-09-12","NJ",16021,14238,4,1783,22950,22950,462,32,,84,2944898,0,,,,,35,200359,196337,504,0,,,,,,,,0,3145257,504,,,,,,0,3140786,0 +"2020-09-12","NM",821,,3,,3263,3263,67,16,,,,0,,,,,,26661,,98,0,,,,,,14396,,0,817270,5220,,,,,,0,817270,5220 +"2020-09-12","NV",1449,,10,,,,476,0,,165,564682,4206,,,,,102,73220,73220,414,0,,,,,,,912914,7009,912914,7009,,,,,637308,4640,931974,9494 +"2020-09-12","NY",25384,,2,,89995,89995,467,0,,127,,0,,,,,51,443640,,849,0,,,,,,,9245625,102925,9245625,102925,,,,,,0,,0 +"2020-09-12","OH",4411,4118,8,293,14284,14284,626,48,3088,216,,0,,,,,127,136568,129453,1242,0,,,,,148614,114066,,0,2611642,36617,,,,,,0,2611642,36617 +"2020-09-12","OK",899,,11,,5424,5424,499,55,,186,920176,13067,,,920176,,,68659,68659,1017,0,3581,,,,79689,58125,,0,988835,14084,74483,,,,,0,1000912,13590 +"2020-09-12","OR",499,,2,,2235,2235,161,13,,43,576874,8540,,,887899,,19,28865,,211,0,,,,,52442,5310,,0,940341,10448,,,,,604334,8743,940341,10448 +"2020-09-12","PA",7837,,0,,,,470,0,,,1664000,11972,,,,,63,143805,139623,920,0,,,,,,117920,2582989,29784,2582989,29784,,,,,1803623,12836,,0 +"2020-09-12","PR",535,370,12,165,,,420,0,,71,305972,0,,,395291,,54,17598,17598,241,0,19494,,,,20103,,,0,323570,241,,,,,,0,415664,0 +"2020-09-12","RI",1072,,1,,2639,2639,80,19,,8,283137,3019,,,595533,,4,22999,,94,0,,,,,32558,,628091,12408,628091,12408,,,,,306136,3113,,0 +"2020-09-12","SC",3040,2891,12,149,8402,8402,806,49,,220,924894,9464,60035,,884448,,131,129978,127646,932,0,5799,,,,168092,51431,,0,1054872,10396,65834,,,,,0,1052540,10318 +"2020-09-12","SD",183,,6,,1152,1152,109,14,,,146172,1326,,,,,,16437,,320,0,,,,,22431,13739,,0,218268,3101,,,,,162609,1646,218268,3101 +"2020-09-12","TN",2064,1995,39,69,7679,7679,941,55,,299,,0,,,2235909,,137,170891,165922,1032,0,,,,,201856,154947,,0,2437765,22236,,,,,,0,2437765,22236 +"2020-09-12","TX",14143,,146,,,,3371,0,,1174,,0,,,,,,657589,657589,4233,0,33571,14752,,,776717,573670,,0,5887121,36115,383596,136704,,,,0,5887121,36115 +"2020-09-12","UT",433,,2,,3311,3311,176,23,827,48,650984,4498,,,833363,344,,57247,,572,0,,1304,,1226,62949,48396,,0,896312,8200,,10840,,8037,707610,5156,896312,8200 +"2020-09-12","VA",2722,2589,11,133,10218,10218,995,63,,228,,0,,,,,113,132940,126850,1300,0,9090,2216,,,151825,,1744020,15910,1744020,15910,136156,10639,,,,0,,0 +"2020-09-12","VI",19,,1,,,,,0,,,17012,163,,,,,,1211,,10,0,,,,,,1143,,0,18223,173,,,,,18228,162,,0 +"2020-09-12","VT",58,58,0,,,,4,0,,,146547,984,,,,,,1677,1676,9,0,,,,,,1496,,0,224096,4941,,,,,148223,993,224096,4941 +"2020-09-12","WA",1991,1991,0,,7048,7048,384,30,,,,0,,,,,19,81610,80649,475,0,,,,,,,1631162,16414,1631162,16414,,,,,,0,,0 +"2020-09-12","WI",1217,1209,12,8,6309,6309,319,46,1078,94,1264305,10271,,,,,,93055,87603,1430,0,,,,,,76909,1935503,17507,1935503,17507,,,,,1351908,11624,,0 +"2020-09-12","WV",265,263,2,2,,,145,0,,59,,0,,,,,26,12521,12225,347,0,,,,,,9225,,0,471886,7334,16292,,,,,0,471886,7334 +"2020-09-12","WY",42,,0,,287,287,12,60,,,82091,0,,,133950,,,4297,3635,33,0,,,,,3865,3740,,0,137815,301,,,,,85696,0,137815,301 +"2020-09-11","AK",43,43,1,,270,270,44,0,,,,0,,,387966,,7,6111,,89,0,,,,,6340,2359,,0,394586,1509,,,,,,0,394586,1509 +"2020-09-11","AL",2333,2204,32,129,15527,15527,811,188,1593,,874219,4046,,,,877,,136703,124097,1138,0,,,,,,54223,,0,998316,4876,,,55157,,998316,4876,,0 +"2020-09-11","AR",953,,13,,4678,4678,392,72,,,729375,0,,,729375,597,76,68983,67911,1180,0,,2709,,,,61245,,0,796179,0,,17549,,,,0,796179,0 +"2020-09-11","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-11","AZ",5288,5014,15,274,21747,21747,577,136,,171,1071901,6169,,,,,100,207523,205642,521,0,,,,,,,,0,1909700,14977,,,275536,,1277543,6670,1909700,14977 +"2020-09-11","CA",14089,,111,,,,4023,0,,1172,,0,,,,,,746191,746191,3326,0,,,,,,,,0,12451660,61669,,,,,,0,12451660,61669 +"2020-09-11","CO",1985,1634,6,351,7208,7208,232,22,,,709735,5238,151073,,,,,60492,56378,307,0,11252,,,,,,1097985,10786,1097985,10786,162325,,,,766113,5503,,0 +"2020-09-11","CT",4480,3595,2,885,11357,11357,51,0,,,,0,,,1399849,,,54326,52095,233,0,,,,,66911,9142,,0,1468942,21638,,,,,,0,1468942,21638 +"2020-09-11","DC",616,,0,,,,95,0,,25,,0,,,,,8,14493,,81,0,,,,,,11526,321436,2248,321436,2248,,,,,192235,1239,,0 +"2020-09-11","DE",613,541,0,72,,,66,0,,14,238232,0,,,,,,18466,17475,0,0,,,,,21713,10027,375111,2664,375111,2664,,,,,256698,0,,0 +"2020-09-11","FL",12658,,176,,41494,41494,2815,215,,,4218375,22847,411877,403867,5888216,,,650922,639124,3604,0,34738,,34017,,847950,,6977912,66136,6977912,66136,446669,,437913,,4863570,26463,6775044,44086 +"2020-09-11","GA",6246,,42,,26163,26163,2152,101,4794,,,0,,,,,,290781,290781,1658,0,22769,,,,265022,,,0,2558319,15725,287173,,,,,0,2558319,15725 +"2020-09-11","GU",23,,2,,,,52,0,,13,41150,378,,,,,,1863,1863,17,0,2,,,,,1118,,0,43013,395,158,,,,,0,43011,395 +"2020-09-11","HI",94,94,3,,610,610,240,6,,52,236191,7042,,,,,29,10423,10292,169,0,,,,,10240,3176,323497,9914,323497,9914,,,,,246483,7211,329209,9859 +"2020-09-11","IA",1211,,4,,,,281,0,,83,602464,5000,,49276,,,36,71133,71133,728,0,,,3177,1895,,52370,,0,673597,5728,,,52493,15171,675126,5735,,0 +"2020-09-11","ID",407,369,1,37,1551,1551,158,15,407,51,239199,1345,,,,,,34617,31943,307,0,,,,,,17599,,0,271142,1600,,,,,271142,1600,,0 +"2020-09-11","IL",8505,8273,44,232,,,1619,0,,359,,0,,,,,155,259883,257788,2312,0,,,,,,,,0,4632382,56661,,,,,,0,4632382,56661 +"2020-09-11","IN",3420,3196,10,224,11651,11651,809,60,2315,225,1079599,17701,,,,,68,103505,,1262,0,,,,,107792,,,0,1747306,27818,,,,,1183104,18963,1747306,27818 +"2020-09-11","KS",511,,16,,2537,2537,140,67,690,40,400544,6540,,,,219,10,48386,,976,0,,,,,,,,0,448930,7516,,,,,448930,7516,,0 +"2020-09-11","KY",1044,1035,9,9,4862,4862,549,27,1443,124,,0,,,,,,55704,49979,932,0,,,,,,10822,,0,894965,16048,48463,17002,,,,0,894965,16048 +"2020-09-11","LA",5202,5032,41,170,,,723,0,,,1880644,26479,,,,,117,157109,156174,755,0,,,,,,140440,,0,2037753,27234,,,,,,0,2036818,27234 +"2020-09-11","MA",9180,8971,14,209,12411,12411,330,10,,60,1803416,18963,,,,,22,123986,122202,440,0,,,,,160811,107501,,0,2905353,52803,,,115893,100148,1925618,19406,2905353,52803 +"2020-09-11","MD",3828,3685,4,143,14756,14756,369,50,,89,1318152,8503,,114639,,,,114724,114724,646,0,,,10638,,136897,7186,,0,2150638,22614,,,125277,,1432876,9149,2150638,22614 +"2020-09-11","ME",134,133,0,1,432,432,10,1,,6,,0,9426,,,,5,4792,4317,32,0,503,,,,5263,4191,,0,312449,5979,9943,,,,,0,312449,5979 +"2020-09-11","MI",6900,6578,6,322,,,627,0,,172,,0,,,2950535,,77,122251,110832,1405,0,,,,,155633,80678,,0,3106168,36473,267328,,,,,0,3106168,36473 +"2020-09-11","MN",1949,1897,13,52,6863,6863,253,33,1938,139,1129844,6592,,,,,,82716,82716,467,0,,,,,,75757,1665328,18367,1665328,18367,,,,,1212560,7059,,0 +"2020-09-11","MO",1701,,10,,,,934,0,,,997412,11079,,67655,1327482,,113,99160,99160,1569,0,,,3157,,107727,,,0,1437730,18275,,,70812,,1096572,12648,1437730,18275 +"2020-09-11","MP",2,2,0,,4,4,,0,,,14316,0,,,,,,59,59,0,0,,,,,,29,,0,14375,0,,,,,14375,0,18915,0 +"2020-09-11","MS",2670,2489,14,181,5410,5410,545,0,,182,529204,4288,,,,,,89175,83918,853,0,,,,,,74098,,0,618379,5141,28579,37009,,,,0,613122,4878 +"2020-09-11","MT",131,,8,,518,518,142,6,,,,0,,,,,,8785,,122,0,,,,,,6795,,0,274658,1305,,,,,,0,274658,1305 +"2020-09-11","NC",3023,3023,33,,,,938,0,,292,,0,,,,,,182286,182286,1532,0,,,,,,,,0,2530135,33872,,,,,,0,2530135,33872 +"2020-09-11","ND",163,,0,,630,630,64,6,169,22,200392,543,8611,,,,,14654,14654,241,0,367,,,,,12177,506398,5474,506398,5474,8978,2,,,215076,784,523783,5693 +"2020-09-11","NE",430,,9,,2119,2119,178,11,,,356439,3038,,,476686,,,37373,,456,0,,,,,45320,28513,,0,523014,5765,,,,,394342,3510,523014,5765 +"2020-09-11","NH",434,,0,,720,720,7,1,228,,219671,1585,,,,,,7620,,47,0,,,,,,6870,,0,365645,3677,31004,,30325,,227291,1632,365645,3677 +"2020-09-11","NJ",16017,14234,9,1783,22918,22918,483,30,,81,2944898,26658,,,,,36,199855,195888,524,0,,,,,,,,0,3144753,27182,,,,,,0,3140786,27132 +"2020-09-11","NM",818,,2,,3247,3247,73,9,,,,0,,,,,,26563,,134,0,,,,,,14276,,0,812050,5051,,,,,,0,812050,5051 +"2020-09-11","NV",1439,,10,,,,476,0,,165,560476,5703,,,,,102,72806,72806,260,0,,,,,,,905905,7043,905905,7043,,,,,632668,6078,922480,10076 +"2020-09-11","NY",25382,,5,,89995,89995,474,0,,120,,0,,,,,54,442791,,880,0,,,,,,,9142700,89722,9142700,89722,,,,,,0,,0 +"2020-09-11","OH",4403,4110,49,293,14236,14236,650,72,3081,222,,0,,,,,131,135326,128297,1240,0,,,,,147059,113053,,0,2575025,30538,,,,,,0,2575025,30538 +"2020-09-11","OK",888,,12,,5369,5369,509,51,,208,907109,12099,,,907109,,,67642,67642,942,0,3453,,,,78255,57383,,0,974751,13041,73173,,,,,0,987322,13608 +"2020-09-11","OR",497,,3,,2222,2222,162,7,,40,568334,2728,,,877769,,20,28654,,183,0,,,,,52124,5291,,0,929893,5260,,,,,595591,2891,929893,5260 +"2020-09-11","PA",7837,,17,,,,491,0,,,1652028,12679,,,,,64,142885,138759,1008,0,,,,,,117165,2553205,35074,2553205,35074,,,,,1790787,13635,,0 +"2020-09-11","PR",523,359,11,164,,,401,0,,68,305972,0,,,395291,,52,17357,17357,109,0,19224,,,,20103,,,0,323329,109,,,,,,0,415664,0 +"2020-09-11","RI",1071,,4,,2620,2620,80,9,,8,280118,1587,,,583094,,3,22905,,123,0,,,,,32589,,615683,8777,615683,8777,,,,,303023,1710,,0 +"2020-09-11","SC",3028,2877,53,151,8353,8353,806,58,,220,915430,9563,59741,,875468,,131,129046,126792,2454,0,5737,,,,166754,51431,,0,1044476,12017,65478,,,,,0,1042222,11958 +"2020-09-11","SD",177,,0,,1138,1138,98,18,,,144846,1430,,,,,,16117,,283,0,,,,,22141,13425,,0,215167,2495,,,,,160963,1713,215167,2495 +"2020-09-11","TN",2025,1957,37,68,7624,7624,965,75,,305,,0,,,2214968,,141,169859,165009,1622,0,,,,,200561,152674,,0,2415529,27211,,,,,,0,2415529,27211 +"2020-09-11","TX",13997,,144,,,,3465,0,,1198,,0,,,,,,653356,653356,3547,0,33010,14641,,,774410,568067,,0,5851006,36226,380352,134226,,,,0,5851006,36226 +"2020-09-11","UT",431,,1,,3288,3288,170,15,817,48,646486,4080,,,825887,338,,56675,,656,0,,1267,,1192,62225,48021,,0,888112,7977,,10170,,7681,702454,4673,888112,7977 +"2020-09-11","VA",2711,2578,3,133,10155,10155,1120,70,,249,,0,,,,,120,131640,125703,1115,0,9034,2175,,,150703,,1728110,17554,1728110,17554,135417,9895,,,,0,,0 +"2020-09-11","VI",18,,0,,,,,0,,,16849,181,,,,,,1201,,4,0,,,,,,1124,,0,18050,185,,,,,18066,179,,0 +"2020-09-11","VT",58,58,0,,,,4,0,,,145563,1231,,,,,,1668,1667,8,0,,,,,,1493,,0,219155,4902,,,,,147230,1239,219155,4902 +"2020-09-11","WA",1991,1991,6,,7018,7018,392,25,,,,0,,,,,19,81135,80197,536,0,,,,,,,1614748,16761,1614748,16761,,,,,,0,,0 +"2020-09-11","WI",1205,1197,4,8,6263,6263,326,41,1074,97,1254034,8586,,,,,,91625,86250,1443,0,,,,,,75878,1917996,19759,1917996,19759,,,,,1340284,9955,,0 +"2020-09-11","WV",263,261,6,2,,,147,0,,56,,0,,,,,20,12174,11900,157,0,,,,,,9062,,0,464552,4154,16244,,,,,0,464552,4154 +"2020-09-11","WY",42,,0,,227,227,12,3,,,82091,991,,,133666,,,4264,3605,65,0,,,,,3848,3724,,0,137514,1650,,,,,85696,1037,137514,1650 +"2020-09-10","AK",42,42,0,,270,270,42,2,,,,0,,,386481,,10,6022,,114,0,,,,,6316,2351,,0,393077,1140,,,,,,0,393077,1140 +"2020-09-10","AL",2301,2176,16,125,15339,15339,834,0,1572,,870173,6191,,,,864,,135565,123267,1148,0,,,,,,54223,,0,993440,6878,,,55417,,993440,6878,,0 +"2020-09-10","AR",940,,12,,4606,4606,392,32,,,729375,12402,,,729375,589,79,67803,66804,548,0,,2626,,,,60668,,0,796179,13185,,17021,,,,0,796179,13185 +"2020-09-10","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-10","AZ",5273,4999,22,274,21611,21611,628,18,,204,1065732,3076,,,,,120,207002,205141,461,0,,,,,,,,0,1894723,18254,,,274713,,1270873,3502,1894723,18254 +"2020-09-10","CA",13978,,137,,,,4225,0,,1184,,0,,,,,,742865,742865,3338,0,,,,,,,,0,12389991,46194,,,,,,0,12389991,46194 +"2020-09-10","CO",1979,1629,2,350,7186,7186,240,13,,,704497,4065,150679,,,,,60185,56113,265,0,11227,,,,,,1087199,7923,1087199,7923,161906,,,,760610,4312,,0 +"2020-09-10","CT",4478,3593,4,885,11357,11357,52,82,,,,0,,,1378415,,,54093,51877,222,0,,,,,66714,9142,,0,1447304,27376,,,,,,0,1447304,27376 +"2020-09-10","DC",616,,1,,,,87,0,,20,,0,,,,,9,14412,,25,0,,,,,,11498,319188,1528,319188,1528,,,,,190996,261,,0 +"2020-09-10","DE",613,541,4,72,,,66,0,,14,238232,2570,,,,,,18466,17475,158,0,,,,,21608,10027,372447,1321,372447,1321,,,,,256698,2728,,0 +"2020-09-10","FL",12482,,213,,41279,41279,2896,294,,,4195528,16428,411877,403867,5848754,,,647318,635910,2537,0,34738,,34017,,843542,,6911776,45837,6911776,45837,446669,,437913,,4837107,18929,6730958,33271 +"2020-09-10","GA",6204,,76,,26062,26062,2169,217,4776,,,0,,,,,,289123,289123,1836,0,22628,,,,263704,,,0,2542594,14815,286202,,,,,0,2542594,14815 +"2020-09-10","GU",21,,0,,,,54,0,,13,40772,435,,,,,,1846,1846,88,0,2,,,,,1081,,0,42618,523,158,,,,,0,42616,523 +"2020-09-10","HI",91,91,3,,604,604,240,5,,53,229149,1388,,,,,40,10254,10123,98,0,,,,,10069,3120,313583,2710,313583,2710,,,,,239272,1486,319350,2845 +"2020-09-10","IA",1207,,13,,,,302,0,,85,597464,5392,,48908,,,34,70405,70405,902,0,,,3155,1852,,51691,,0,667869,6294,,,52103,14985,669391,6290,,0 +"2020-09-10","ID",406,369,17,37,1536,1536,158,34,406,51,237854,1301,,,,,,34310,31688,329,0,,,,,,17304,,0,269542,1546,,,,,269542,1546,,0 +"2020-09-10","IL",8461,8242,28,219,,,1609,0,,346,,0,,,,,141,257571,255643,1953,0,,,,,,,,0,4575721,48982,,,,,,0,4575721,48982 +"2020-09-10","IN",3410,3186,13,224,11591,11591,833,63,2310,239,1061898,5365,,,,,68,102243,,758,0,,,,,106849,,,0,1719488,28205,,,,,1164141,6123,1719488,28205 +"2020-09-10","KS",495,,0,,2470,2470,319,0,677,92,394004,0,,,,218,41,47410,,0,0,,,,,,,,0,441414,0,,,,,441414,0,,0 +"2020-09-10","KY",1035,1026,22,9,4835,4835,565,58,1440,133,,0,,,,,,54772,49198,795,0,,,,,,10791,,0,878917,6005,47937,16606,,,,0,878917,6005 +"2020-09-10","LA",5161,4991,21,170,,,762,0,,,1854165,10093,,,,,125,156354,155419,464,0,,,,,,140440,,0,2010519,10557,,,,,,0,2009584,10557 +"2020-09-10","MA",9166,8957,20,209,12401,12401,355,14,,59,1784453,17526,,,,,21,123546,121759,403,0,,,,,160263,107501,,0,2852550,53965,,,115578,97848,1906212,17889,2852550,53965 +"2020-09-10","MD",3824,3679,8,145,14706,14706,358,34,,92,1309649,7702,,114639,,,,114078,114078,503,0,,,10638,,136095,7166,,0,2128024,18551,,,125277,,1423727,8205,2128024,18551 +"2020-09-10","ME",134,133,0,1,431,431,11,2,,7,,0,9417,,,,3,4760,4287,26,0,500,,,,5222,4153,,0,306470,4118,9931,,,,,0,306470,4118 +"2020-09-10","MI",6894,6569,7,325,,,627,0,,172,,0,,,2915602,,75,120846,109519,983,0,,,,,154093,80678,,0,3069695,33202,266151,,,,,0,3069695,33202 +"2020-09-10","MN",1936,1884,15,52,6830,6830,257,38,1927,138,1123252,927,,,,,,82249,82249,381,0,,,,,,75425,1646961,25787,1646961,25787,,,,,1205501,1308,,0 +"2020-09-10","MO",1691,,18,,,,934,0,,,986333,11899,,67498,1310509,,113,97591,97591,1116,0,,,3136,,106440,,,0,1419455,19498,,,70634,,1083924,13015,1419455,19498 +"2020-09-10","MP",2,2,0,,4,4,,0,,,14316,832,,,,,,59,59,0,0,,,,,,29,,0,14375,832,,,,,14375,835,18915,1289 +"2020-09-10","MS",2656,2477,33,179,5410,5410,668,0,,177,524916,3083,,,,,101,88322,83328,517,0,,,,,,74098,,0,613238,3600,28319,36315,,,,0,608244,3468 +"2020-09-10","MT",123,,1,,512,512,163,3,,,,0,,,,,,8663,,195,0,,,,,,6732,,0,273353,2203,,,,,,0,273353,2203 +"2020-09-10","NC",2990,2990,32,,,,928,0,,291,,0,,,,,,180754,180754,1222,0,,,,,,,,0,2496263,15536,,,,,,0,2496263,15536 +"2020-09-10","ND",163,,3,,624,624,62,13,165,21,199849,1000,8611,,,,,14413,14413,335,0,367,,,,,11930,500924,6155,500924,6155,8978,2,,,214292,1333,518090,6360 +"2020-09-10","NE",421,,15,,2108,2108,182,19,,,353401,4529,,,471433,,,36917,,440,0,,,,,44810,28175,,0,517249,5528,,,,,390832,4980,517249,5528 +"2020-09-10","NH",434,,1,,719,719,7,1,228,,218086,2617,,,,,,7573,,79,0,,,,,,6867,,0,361968,5788,30956,,30284,,225659,2696,361968,5788 +"2020-09-10","NJ",16008,14225,5,1783,22888,22888,435,34,,62,2918240,22081,,,,,36,199331,195414,490,0,,,,,,,,0,3117571,22571,,,,,,0,3113654,22505 +"2020-09-10","NM",816,,3,,3238,3238,80,19,,,,0,,,,,,26429,,161,0,,,,,,14120,,0,806999,3898,,,,,,0,806999,3898 +"2020-09-10","NV",1429,,17,,,,519,0,,175,554773,2157,,,,,112,72546,72546,288,0,,,,,,,898862,7552,898862,7552,,,,,626590,2438,912404,4953 +"2020-09-10","NY",25377,,7,,89995,89995,482,0,,120,,0,,,,,55,441911,,757,0,,,,,,,9052978,76813,9052978,76813,,,,,,0,,0 +"2020-09-10","OH",4354,4064,30,290,14164,14164,682,81,3070,231,,0,,,,,137,134086,127106,1121,0,,,,,145934,112140,,0,2544487,19352,,,,,,0,2544487,19352 +"2020-09-10","OK",876,,13,,5318,5318,513,65,,195,895010,7403,,,895010,,,66700,66700,771,0,3453,,,,76926,56531,,0,961710,8174,73173,,,,,0,973714,7695 +"2020-09-10","OR",494,,8,,2215,2215,147,9,,31,565606,2462,,,872704,,18,28471,,116,0,,,,,51929,5277,,0,924633,5220,,,,,592700,2568,924633,5220 +"2020-09-10","PA",7820,,15,,,,488,0,,,1639349,13709,,,,,60,141877,137803,587,0,,,,,,116339,2518131,37628,2518131,37628,,,,,1777152,14271,,0 +"2020-09-10","PR",512,349,12,163,,,421,0,,70,305972,0,,,395291,,57,17248,17248,459,0,19031,,,,20103,,,0,323220,459,,,,,,0,415664,0 +"2020-09-10","RI",1067,,5,,2611,2611,76,7,,5,278531,2193,,,574481,,3,22782,,106,0,,,,,32425,,606906,8589,606906,8589,,,,,301313,2299,,0 +"2020-09-10","SC",2975,2823,33,152,8295,8295,852,59,,219,905867,14761,59501,,864955,,127,126592,124397,379,0,5680,,,,165309,51431,,0,1032459,15140,65181,,,,,0,1030264,15061 +"2020-09-10","SD",177,,4,,1120,1120,83,11,,,143416,1098,,,,,,15834,,263,0,,,,,21845,13201,,0,212672,2004,,,,,159250,1361,212672,2004 +"2020-09-10","TN",1988,1923,57,65,7549,7549,1038,105,,309,,0,,,2189555,,154,168237,163515,1650,0,,,,,198763,151202,,0,2388318,25375,,,,,,0,2388318,25375 +"2020-09-10","TX",13853,,161,,,,3575,0,,1267,,0,,,,,,649809,649809,4018,0,32735,14525,,,772078,564114,,0,5814780,35751,377901,130917,,,,0,5814780,35751 +"2020-09-10","UT",430,,3,,3273,3273,165,10,814,48,642406,3770,,,818562,337,,56019,,346,0,,1230,,1156,61573,47545,,0,880135,6448,,9505,,7287,697781,4284,880135,6448 +"2020-09-10","VA",2708,2575,11,133,10085,10085,1096,77,,255,,0,,,,,134,130525,124619,1236,0,8973,2148,,,149486,,1710556,16353,1710556,16353,134764,9283,,,,0,,0 +"2020-09-10","VI",18,,0,,,,,0,,,16668,415,,,,,,1197,,6,0,,,,,,1119,,0,17865,421,,,,,17887,428,,0 +"2020-09-10","VT",58,58,0,,,,5,0,,,144332,516,,,,,,1660,1659,3,0,,,,,,1480,,0,214253,1353,,,,,145991,519,214253,1353 +"2020-09-10","WA",1985,1985,7,,6993,6993,382,27,,,,0,,,,,29,80599,79694,564,0,,,,,,,1597987,14084,1597987,14084,,,,,,0,,0 +"2020-09-10","WI",1201,1193,10,8,6222,6222,304,49,1068,93,1245448,7275,,,,,,90182,84881,1592,0,,,,,,74834,1898237,23621,1898237,23621,,,,,1330329,8822,,0 +"2020-09-10","WV",257,255,3,2,,,141,0,,51,,0,,,,,21,12017,11753,209,0,,,,,,8904,,0,460398,4053,16206,,,,,0,460398,4053 +"2020-09-10","WY",42,,0,,224,224,12,3,,,81100,416,,,132067,,,4199,3559,48,0,,,,,3797,3553,,0,135864,2492,,,,,84659,455,135864,2492 +"2020-09-09","AK",42,42,0,,268,268,40,3,,,,0,,,385352,,10,5908,,65,0,,,,,6305,2340,,0,391937,281,,,,,,0,391937,281 +"2020-09-09","AL",2285,2161,8,124,15339,15339,857,202,1551,,863982,5193,,,,854,,134417,122580,811,0,,,,,,54223,,0,986562,5894,,,55320,,986562,5894,,0 +"2020-09-09","AR",928,,11,,4574,4574,411,50,,,716973,0,,,716973,586,82,67255,66406,498,0,,2556,,,,59920,,0,782994,0,,16591,,,,0,782994,0 +"2020-09-09","AS",0,,0,,,,,0,,,1571,0,,,,,,0,0,0,0,,,,,,,,0,1571,0,,,,,,0,1571,0 +"2020-09-09","AZ",5251,4978,30,273,21593,21593,658,71,,203,1062656,2102,,,,,111,206541,204715,496,0,,,,,,,,0,1876469,18766,,,274100,,1267371,2578,1876469,18766 +"2020-09-09","CA",13841,,83,,,,4425,0,,1233,,0,,,,,,739527,739527,1616,0,,,,,,,,0,12343797,75849,,,,,,0,12343797,75849 +"2020-09-09","CO",1977,1627,4,350,7173,7173,226,12,,,700432,2865,150319,,,,,59920,55866,246,0,11199,,,,,,1079276,5297,1079276,5297,161518,,,,756298,3089,,0 +"2020-09-09","CT",4474,3589,0,885,11275,11275,57,0,,,,0,,,1351301,,,53871,51666,89,0,,,,,66460,9049,,0,1419928,27839,,,,,,0,1419928,27839 +"2020-09-09","DC",615,,4,,,,93,0,,21,,0,,,,,11,14387,,25,0,,,,,,11452,317660,1062,317660,1062,,,,,190735,419,,0 +"2020-09-09","DE",609,537,0,72,,,53,0,,12,235662,0,,,,,,18308,17317,0,0,,,,,21561,9920,371126,2572,371126,2572,,,,,253970,0,,0 +"2020-09-09","FL",12269,,202,,40985,40985,3077,324,,,4179100,12319,411877,403867,5818991,,,644781,633787,2006,0,34738,,34017,,840250,,6865939,38874,6865939,38874,446669,,437913,,4818178,14244,6697687,29996 +"2020-09-09","GA",6128,,58,,25845,25845,2099,256,4736,,,0,,,,,,287287,287287,1937,0,22584,,,,262647,,,0,2527779,15953,285881,,,,,0,2527779,15953 +"2020-09-09","GU",21,,2,,,,57,0,,13,40337,638,,,,,,1758,1758,45,0,2,,,,,1042,,0,42095,683,158,,,,,0,42093,683 +"2020-09-09","HI",88,88,2,,599,599,257,1,,47,227761,708,,,,,29,10156,10025,197,0,,,,,9964,3063,310873,1244,310873,1244,,,,,237786,774,316505,1314 +"2020-09-09","IA",1194,,14,,,,322,0,,83,592072,2234,,48499,,,37,69503,69503,364,0,,,3149,1762,,51014,,0,661575,2598,,,51688,14539,663101,2604,,0 +"2020-09-09","ID",389,353,4,36,1502,1502,114,34,399,35,236553,1056,,,,,,33981,31443,240,0,,,,,,16956,,0,267996,1254,,,,,267996,1254,,0 +"2020-09-09","IL",8433,8214,28,219,,,1580,0,,357,,0,,,,,133,255618,253690,1337,0,,,,,,,,0,4526739,48029,,,,,,0,4526739,48029 +"2020-09-09","IN",3397,3173,17,224,11528,11528,763,61,2304,229,1056533,6450,,,,,70,101485,,705,0,,,,,105870,,,0,1691283,31600,,,,,1158018,7155,1691283,31600 +"2020-09-09","KS",495,,10,,2470,2470,319,29,677,92,394004,4232,,,,218,41,47410,,496,0,,,,,,,,0,441414,4728,,,,,441414,4728,,0 +"2020-09-09","KY",1013,1004,16,9,4777,4777,558,47,1427,153,,0,,,,,,53977,48599,658,0,,,,,,10725,,0,872912,7440,47912,16329,,,,0,872912,7440 +"2020-09-09","LA",5140,4970,22,170,,,782,0,,,1844072,30047,,,,,123,155890,154955,1561,0,,,,,,140440,,0,1999962,31608,,,,,,0,1999027,31569 +"2020-09-09","MA",9146,8937,5,209,12387,12387,338,19,,49,1766927,11168,,,,,21,123143,121396,181,0,,,,,159836,107501,,0,2798585,40201,,,115319,95385,1888323,11350,2798585,40201 +"2020-09-09","MD",3816,3672,9,144,14672,14672,370,36,,95,1301947,4588,,114639,,,,113575,113575,336,0,,,10638,,135426,7157,,0,2109473,9911,,,125277,,1415522,4924,2109473,9911 +"2020-09-09","ME",134,133,0,1,429,429,9,0,,7,,0,9395,,,,3,4734,4258,21,0,499,,,,5190,4135,,0,302352,6775,9907,,,,,0,302352,6775 +"2020-09-09","MI",6887,6552,76,335,,,616,0,,158,,0,,,2883414,,70,119863,108595,961,0,,,,,153079,80678,,0,3036493,23137,265430,,,,,0,3036493,23137 +"2020-09-09","MN",1921,1869,7,52,6792,6792,263,32,1914,137,1122325,2063,,,,,,81868,81868,260,0,,,,,,75055,1621174,4436,1621174,4436,,,,,1204193,2323,,0 +"2020-09-09","MO",1673,,12,,,,934,0,,,974434,8317,,67155,1291761,,113,96475,96475,1362,0,,,3112,,105700,,,0,1399957,12678,,,70267,,1070909,9679,1399957,12678 +"2020-09-09","MP",2,2,0,,4,4,,0,,,13484,0,,,,,,59,59,0,0,,,,,,29,,0,13543,0,,,,,13540,0,17626,0 +"2020-09-09","MS",2623,2447,38,176,5410,5410,683,0,,185,521833,2751,,,,,111,87805,82943,426,0,,,,,,74098,,0,609638,3177,28071,35351,,,,0,604776,3010 +"2020-09-09","MT",122,,3,,509,509,163,7,,,,0,,,,,,8468,,87,0,,,,,,6318,,0,271150,2370,,,,,,0,271150,2370 +"2020-09-09","NC",2958,2958,49,,,,916,0,,296,,0,,,,,,179532,179532,897,0,,,,,,,,0,2480727,10621,,,,,,0,2480727,10621 +"2020-09-09","ND",160,,0,,611,611,53,7,163,18,198849,592,8559,,,,,14078,14078,236,0,359,,,,,11733,494769,3027,494769,3027,8918,1,,,212959,830,511730,3175 +"2020-09-09","NE",406,,2,,2089,2089,179,10,,,348872,6547,,,466326,,,36477,,502,0,,,,,44393,28051,,0,511721,11552,,,,,385852,7059,511721,11552 +"2020-09-09","NH",433,,0,,718,718,7,0,227,,215469,0,,,,,,7494,,0,0,,,,,,6825,,0,356180,0,30824,,30164,,222963,0,356180,0 +"2020-09-09","NJ",16003,14220,8,1783,22854,22854,423,42,,63,2896159,20080,,,,,31,198841,194990,391,0,,,,,,,,0,3095000,20471,,,,,,0,3091149,20403 +"2020-09-09","NM",813,,6,,3219,3219,77,17,,,,0,,,,,,26268,,87,0,,,,,,13928,,0,803101,3428,,,,,,0,803101,3428 +"2020-09-09","NV",1412,,19,,,,552,0,,164,552616,668,,,,,110,72258,72258,154,0,,,,,,,891310,10917,891310,10917,,,,,624152,757,907451,1926 +"2020-09-09","NY",25370,,3,,89995,89995,463,0,,121,,0,,,,,59,441154,,576,0,,,,,,,8976165,63230,8976165,63230,,,,,,0,,0 +"2020-09-09","OH",4324,4034,26,290,14083,14083,700,116,3054,230,,0,,,,,141,132965,126046,973,0,,,,,145090,111201,,0,2525135,17940,,,,,,0,2525135,17940 +"2020-09-09","OK",863,,9,,5253,5253,462,116,,202,887607,27521,,,887607,,,65929,65929,876,0,3453,,,,76064,55405,,0,953536,28397,73173,,,,,0,966019,26519 +"2020-09-09","OR",486,,4,,2206,2206,153,45,,44,563144,3168,,,867646,,21,28355,,165,0,,,,,51767,5252,,0,919413,5348,,,,,590132,14536,919413,5348 +"2020-09-09","PA",7805,,14,,,,492,0,,,1625640,10923,,,,,60,141290,137241,931,0,,,,,,115857,2480503,22668,2480503,22668,,,,,1762881,11819,,0 +"2020-09-09","PR",500,337,18,163,,,400,0,,71,305972,0,,,395291,,56,16789,16789,1,0,18718,,,,20103,,,0,322761,1,,,,,,0,415664,0 +"2020-09-09","RI",1062,,3,,2604,2604,82,15,,4,276338,7491,,,566014,,3,22676,,84,0,,,,,32303,,598317,15705,598317,15705,,,,,299014,7575,,0 +"2020-09-09","SC",2942,2800,30,142,8236,8236,801,54,,224,891106,2863,59407,,852696,,133,126213,124097,305,0,5647,,,,162507,51431,,0,1017319,3168,65054,,,,,0,1015203,3159 +"2020-09-09","SD",173,,0,,1109,1109,76,15,,,142318,1035,,,,,,15571,,168,0,,,,,21622,12964,,0,210668,1559,,,,,157889,1203,210668,1559 +"2020-09-09","TN",1931,1875,35,56,7444,7444,1056,89,,328,,0,,,2165995,,145,166587,162028,833,0,,,,,196948,149698,,0,2362943,16362,,,,,,0,2362943,16362 +"2020-09-09","TX",13692,,139,,,,3604,0,,1347,,0,,,,,,645791,645791,4000,0,32352,14404,,,769672,558894,,0,5779029,42448,374319,128145,,,,0,5779029,42448 +"2020-09-09","UT",427,,3,,3263,3263,137,21,812,45,638636,2636,,,812663,336,,55673,,314,0,,1190,,1119,61024,47084,,0,873687,4213,,8762,,6758,693497,2977,873687,4213 +"2020-09-09","VA",2697,2564,11,133,10008,10008,1072,76,,252,,0,,,,,121,129289,123488,882,0,8945,2072,,,148183,,1694203,10155,1694203,10155,134451,8860,,,,0,,0 +"2020-09-09","VI",18,,0,,,,,0,,,16253,0,,,,,,1191,,0,0,,,,,,1070,,0,17444,0,,,,,17459,0,,0 +"2020-09-09","VT",58,58,0,,,,5,0,,,143816,379,,,,,,1657,1656,5,0,,,,,,1468,,0,212900,1400,,,,,145472,384,212900,1400 +"2020-09-09","WA",1978,1978,25,,6966,6966,358,106,,,,0,,,,,34,80035,79157,219,0,,,,,,,1583903,20850,1583903,20850,,,,,,0,,0 +"2020-09-09","WI",1191,1183,15,8,6173,6173,302,55,1058,86,1238173,8014,,,,,,88590,83334,913,0,,,,,,73964,1874616,9740,1874616,9740,,,,,1321507,8871,,0 +"2020-09-09","WV",254,252,4,2,,,147,0,,55,,0,,,,,27,11808,11564,147,0,,,,,,8748,,0,456345,1439,16142,,,,,0,456345,1439 +"2020-09-09","WY",42,,0,,221,221,12,2,,,80684,3318,,,129623,,,4151,3520,48,0,,,,,3749,3484,,0,133372,2107,,,,,84204,3355,133372,2107 +"2020-09-08","AK",42,42,0,,265,265,41,5,,,,0,,,385074,,8,5843,,33,0,,,,,6302,2339,,0,391656,3035,,,,,,0,391656,3035 +"2020-09-08","AL",2277,2153,1,124,15137,15137,778,223,1538,,858789,3767,,,,848,,133606,121879,633,0,,,,,,51154,,0,980668,4172,,,55234,,980668,4172,,0 +"2020-09-08","AR",917,,9,,4524,4524,409,38,,,716973,10440,,,716973,579,84,66757,66021,477,0,,2442,,,,59260,,0,782994,11084,,15892,,,,0,782994,11084 +"2020-09-08","AS",0,,0,,,,,0,,,1571,57,,,,,,0,0,0,0,,,,,,,,0,1571,57,,,,,,0,1571,57 +"2020-09-08","AZ",5221,4947,2,274,21522,21522,657,-3,,212,1060554,3121,,,,,112,206045,204239,81,0,,,,,,,,0,1857703,4585,,,273717,,1264793,3203,1857703,4585 +"2020-09-08","CA",13758,,32,,,,4297,0,,1217,,0,,,,,,737911,737911,2676,0,,,,,,,,0,12267948,109656,,,,,,0,12267948,109656 +"2020-09-08","CO",1973,1623,0,350,7161,7161,218,19,,,697567,2735,150102,,,,,59674,55642,187,0,11175,,,,,,1073979,4373,1073979,4373,161277,,,,753209,2919,,0 +"2020-09-08","CT",4474,3589,6,885,11275,11275,50,0,,,,0,,,1323758,,,53782,51594,417,0,,,,,66175,9049,,0,1392089,9293,,,,,,0,1392089,9293 +"2020-09-08","DC",611,,0,,,,85,0,,21,,0,,,,,7,14362,,47,0,,,,,,11414,316598,2883,316598,2883,,,,,190316,1049,,0 +"2020-09-08","DE",609,537,0,72,,,53,0,,12,235662,1309,,,,,,18308,17317,59,0,,,,,21504,9920,368554,2583,368554,2583,,,,,253970,1368,,0 +"2020-09-08","FL",12067,,44,,40661,40661,3155,114,,,4166781,13366,411877,403867,5792121,,,642775,632146,1797,0,34738,,34017,,837246,,6827065,36334,6827065,36334,446669,,437913,,4803934,15153,6667691,25630 +"2020-09-08","GA",6070,,26,,25589,25589,2215,51,4698,,,0,,,,,,285350,285350,1543,0,22532,,,,261567,,,0,2511826,22985,285478,,,,,0,2511826,22985 +"2020-09-08","GU",19,,1,,,,54,0,,14,39699,629,,,,,,1713,1713,42,0,2,,,,,951,,0,41412,671,158,,,,,0,41410,1300 +"2020-09-08","HI",86,86,1,,598,598,265,1,,50,227053,2005,,,,,37,9959,,104,0,,,,,9903,3028,309629,3159,309629,3159,,,,,237012,2109,315191,3230 +"2020-09-08","IA",1180,,12,,,,326,0,,92,589838,2676,,48289,,,37,69139,69139,455,0,,,3130,1726,,50466,,0,658977,3131,,,51459,14126,660497,3134,,0 +"2020-09-08","ID",385,349,0,36,1468,1468,114,2,394,35,235497,975,,,,,,33741,31245,74,0,,,,,,16760,,0,266742,1039,,,,,266742,1039,,0 +"2020-09-08","IL",8405,8186,7,219,,,1504,0,,343,,0,,,,,133,254281,252353,1392,0,,,,,,,,0,4478710,31363,,,,,,0,4478710,31363 +"2020-09-08","IN",3380,3156,12,224,11467,11467,839,57,2284,246,1050083,3905,,,,,65,100780,,386,0,,,,,104565,,,0,1659683,5981,,,,,1150863,4291,1659683,5981 +"2020-09-08","KS",485,,0,,2441,2441,177,0,669,51,389772,0,,,,214,25,46914,,0,0,,,,,,,,0,436686,0,,,,,436686,0,,0 +"2020-09-08","KY",997,988,1,9,4730,4730,510,2,1417,130,,0,,,,,,53319,48141,255,0,,,,,,10665,,0,865472,1347,47877,15863,,,,0,865472,1347 +"2020-09-08","LA",5118,4955,13,163,,,799,0,,,1814025,3869,,,,,131,154329,153433,256,0,,,,,,134432,,0,1968354,4125,,,,,,0,1967458,4125 +"2020-09-08","MA",9141,8933,8,208,12368,12368,328,11,,47,1755759,9271,,,,,24,122962,121214,171,0,,,,,159560,105769,,0,2758384,30231,,,115057,94986,1876973,9439,2758384,30231 +"2020-09-08","MD",3807,3663,3,144,14636,14636,365,33,,102,1297359,5053,,111730,,,,113239,113239,356,0,,,10303,,135007,7142,,0,2099562,12953,,,122033,,1410598,5409,2099562,12953 +"2020-09-08","ME",134,133,0,1,429,429,7,2,,6,,0,9394,,,,2,4713,4244,12,0,499,,,,5167,4086,,0,295577,2626,9906,,,,,0,295577,2626 +"2020-09-08","MI",6811,6539,1,272,,,616,0,,158,,0,,,2861182,,76,118902,107812,499,0,,,,,152174,80678,,0,3013356,17470,264994,,,,,0,3013356,17470 +"2020-09-08","MN",1914,1862,2,52,6760,6760,257,17,1903,135,1120262,3812,,,,,,81608,81608,383,0,,,,,,74235,1616738,7120,1616738,7120,,,,,1201870,4195,,0 +"2020-09-08","MO",1661,,2,,,,934,0,,,966117,6072,,67075,1280117,,113,95113,95113,773,0,,,3102,,104695,,,0,1387279,8636,,,70177,,1061230,6845,1387279,8636 +"2020-09-08","MP",2,2,0,,4,4,,0,,,13484,0,,,,,,59,59,1,0,,,,,,29,,0,13543,1,,,,,13540,0,17626,0 +"2020-09-08","MS",2585,2417,0,168,5410,5410,758,84,,186,519082,8161,,,,,111,87379,82684,249,0,,,,,,74098,,0,606461,8410,27730,34497,,,,0,601766,8935 +"2020-09-08","MT",119,,1,,502,502,161,4,,,,0,,,,,,8381,,65,0,,,,,,6270,,0,268780,1655,,,,,,0,268780,1655 +"2020-09-08","NC",2909,2909,12,,,,827,0,,262,,0,,,,,,178635,178635,716,0,,,,,,,,0,2470106,15250,,,,,,0,2470106,15250 +"2020-09-08","ND",160,,0,,604,604,63,2,162,19,198257,160,8559,,,,,13842,13842,74,0,359,,,,,11452,491742,1374,491742,1374,8918,1,,,212129,454,508555,1431 +"2020-09-08","NE",404,,0,,2079,2079,172,11,,,342325,750,,,455426,,,35975,,89,0,,,,,43743,27921,,0,500169,1033,,,,,378793,854,500169,1033 +"2020-09-08","NH",433,,0,,718,718,7,0,227,,215469,646,,,,,,7494,,18,0,,,,,,6825,,0,356180,2110,30824,,30164,,222963,664,356180,2110 +"2020-09-08","NJ",15995,14213,5,1782,22812,22812,419,10,,82,2876079,15941,,,,,33,198450,194667,308,0,,,,,,,,0,3074529,16249,,,,,,0,3070746,16218 +"2020-09-08","NM",807,,0,,3202,3202,68,7,,,,0,,,,,,26181,,37,0,,,,,,13701,,0,799673,4426,,,,,,0,799673,4426 +"2020-09-08","NV",1393,,0,,,,538,0,,170,551948,1273,,,,,107,72104,72104,137,0,,,,,,,880393,2580,880393,2580,,,,,623395,1405,905525,2724 +"2020-09-08","NY",25367,,6,,89995,89995,445,0,,114,,0,,,,,52,440578,,557,0,,,,,,,8912935,57826,8912935,57826,,,,,,0,,0 +"2020-09-08","OH",4298,4009,22,289,13967,13967,687,80,3042,238,,0,,,,,132,131992,125144,656,0,,,,,144497,110279,,0,2507195,23025,,,,,,0,2507195,23025 +"2020-09-08","OK",854,,1,,5137,5137,472,24,,208,860086,0,,,860086,,,65053,65053,833,0,3453,,,,73487,54269,,0,925139,833,73173,,,,,0,939500,0 +"2020-09-08","OR",482,,1,,2161,2161,147,0,,45,559976,2595,,,862454,,23,28190,,146,0,,,,,51611,5198,,0,914065,4913,,,,,575596,0,914065,4913 +"2020-09-08","PA",7791,,11,,,,514,0,,,1614717,6339,,,,,63,140359,136345,496,0,,,,,,113690,2457835,13417,2457835,13417,,,,,1751062,6822,,0 +"2020-09-08","PR",482,319,5,163,,,380,0,,81,305972,0,,,395291,,66,16788,16788,96,0,18716,,,,20103,,,0,322760,96,,,,,,0,415664,0 +"2020-09-08","RI",1059,,0,,2589,2589,73,0,,5,268847,390,,,550797,,3,22592,,20,0,,,,,31815,,582612,1438,582612,1438,,,,,291439,410,,0 +"2020-09-08","SC",2912,2772,5,140,8182,8182,766,11,,213,888243,4140,59336,,849997,,118,125908,123801,301,0,5645,,,,162047,51431,,0,1014151,4441,64981,,,,,0,1012044,4389 +"2020-09-08","SD",173,,0,,1094,1094,68,10,,,141283,490,,,,,,15403,,103,0,,,,,21466,12551,,0,209109,1025,,,,,156686,593,209109,1025 +"2020-09-08","TN",1896,1843,27,53,7355,7355,983,43,,301,,0,,,2150669,,138,165754,161344,645,0,,,,,195912,148165,,0,2346581,6201,,,,,,0,2346581,6201 +"2020-09-08","TX",13553,,61,,,,3701,0,,1322,,0,,,,,,641791,641791,1421,0,32328,14186,,,767049,553409,,0,5736581,12935,374045,123384,,,,0,5736581,12935 +"2020-09-08","UT",424,,1,,3242,3242,140,17,803,41,636000,2228,,,808827,334,,55359,,326,0,,1165,,1094,60647,46722,,0,869474,3435,,7805,,6251,690520,2552,869474,3435 +"2020-09-08","VA",2686,2553,2,133,9932,9932,1051,30,,240,,0,,,,,118,128407,122711,836,0,8920,2006,,,147187,,1684048,7602,1684048,7602,134241,8020,,,,0,,0 +"2020-09-08","VI",18,,1,,,,,0,,,16253,23,,,,,,1191,,1,0,,,,,,1070,,0,17444,24,,,,,17459,24,,0 +"2020-09-08","VT",58,58,0,,,,4,0,,,143437,672,,,,,,1652,1651,2,0,,,,,,1465,,0,211500,1013,,,,,145088,674,211500,1013 +"2020-09-08","WA",1953,1953,0,,6860,6860,376,0,,,,0,,,,,37,79816,78949,163,0,,,,,,,1563053,0,1563053,0,,,,,,0,,0 +"2020-09-08","WI",1176,1168,0,8,6118,6118,297,29,1052,88,1230159,3366,,,,,,87677,82477,749,0,,,,,,73122,1864876,11140,1864876,11140,,,,,1312636,4083,,0 +"2020-09-08","WV",250,248,3,2,,,152,0,,57,,0,,,,,26,11661,11448,86,0,,,,,,8626,,0,454906,1267,16139,,,,,0,454906,1267 +"2020-09-08","WY",42,,0,,219,219,17,0,,,77366,3054,,,127555,,,4103,3483,71,0,,,,,3710,3451,,0,131265,2248,,,,,80849,3164,131265,2248 +"2020-09-07","AK",42,42,0,,260,260,36,4,,,,0,,,382106,,8,5810,,34,0,,,,,6236,2323,,0,388621,1564,,,,,,0,388621,1564 +"2020-09-07","AL",2276,2152,0,124,14914,14914,858,0,1537,,855022,3028,,,,848,,132973,121474,659,0,,,,,,51154,,0,976496,3687,,,55192,,976496,3687,,0 +"2020-09-07","AR",908,,14,,4486,4486,399,24,,,706533,5812,,,706533,571,74,66280,65727,1054,0,,2414,,,,58757,,0,771910,6499,,15661,,,,0,771910,6499 +"2020-09-07","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-09-07","AZ",5219,4945,-2,274,21525,21525,658,-2,,221,1057433,4181,,,,,119,205964,204157,198,0,,,,,,,,0,1853118,4350,,,273150,,1261590,4369,1853118,4350 +"2020-09-07","CA",13726,,17,,,,4285,0,,1244,,0,,,,,,735235,735235,3091,0,,,,,,,,0,12158292,111101,,,,,,0,12158292,111101 +"2020-09-07","CO",1973,1623,1,350,7142,7142,237,4,,,694832,5645,149940,,,,,59487,55458,213,0,11166,,,,,,1069606,10049,1069606,10049,161106,,,,750290,5847,,0 +"2020-09-07","CT",4468,3583,0,885,11275,11275,58,0,,,,0,,,1314551,,,53365,51221,0,0,,,,,66093,9049,,0,1382796,5568,,,,,,0,1382796,5568 +"2020-09-07","DC",611,,0,,,,85,0,,23,,0,,,,,10,14315,,36,0,,,,,,11366,313715,2205,313715,2205,,,,,189267,1648,,0 +"2020-09-07","DE",609,537,0,72,,,53,0,,14,234353,1613,,,,,,18249,17259,206,0,,,,,21426,9847,365971,4972,365971,4972,,,,,252602,1819,,0 +"2020-09-07","FL",12023,,22,,40547,40547,3157,60,,,4153415,15076,411877,403867,5769019,,,640978,630479,1812,0,34738,,34017,,834866,,6790731,40794,6790731,40794,446669,,437913,,4788781,37801,6642061,29358 +"2020-09-07","GA",6044,,7,,25538,25538,2214,15,4687,,,0,,,,,,283807,283807,608,0,22365,,,,259641,,,0,2488841,9273,284452,,,,,0,2488841,9273 +"2020-09-07","GU",18,,2,,,,57,0,,14,39070,0,,,,,,1671,1671,0,0,2,,,,,744,,0,40741,0,158,,,,,0,40110,0 +"2020-09-07","HI",85,85,1,,597,597,265,5,,50,225048,4945,,,,,37,9855,,162,0,,,,,9802,2991,306470,6899,306470,6899,,,,,234903,5107,311961,6735 +"2020-09-07","IA",1168,,3,,,,311,0,,99,587162,2516,,48279,,,35,68684,68684,393,0,,,3126,1719,,49884,,0,655846,2909,,,51445,14069,657363,2927,,0 +"2020-09-07","ID",385,349,1,36,1466,1466,151,0,394,50,234522,827,,,,,,33667,31181,190,0,,,,,,16554,,0,265703,1009,,,,,265703,1009,,0 +"2020-09-07","IL",8398,8179,8,219,,,1484,0,,352,,0,,,,,137,252889,250961,1381,0,,,,,,,,0,4447347,28975,,,,,,0,4447347,28975 +"2020-09-07","IN",3368,3144,4,224,11410,11410,771,45,2278,236,1046178,7114,,,,,63,100394,,590,0,,,,,104226,,,0,1653702,4676,,,,,1146572,7704,1653702,4676 +"2020-09-07","KS",485,,4,,2441,2441,177,26,669,51,389772,7787,,,,214,25,46914,,1694,0,,,,,,,,0,436686,9481,,,,,436686,9481,,0 +"2020-09-07","KY",996,987,0,9,4728,4728,503,15,1416,130,,0,,,,,,53064,47956,290,0,,,,,,10648,,0,864125,-2717,47833,15861,,,,0,864125,-2717 +"2020-09-07","LA",5105,4942,12,163,,,787,0,,,1810156,4676,,,,,124,154073,153177,309,0,,,,,,134432,,0,1964229,4985,,,,,,0,1963333,4985 +"2020-09-07","MA",9133,8925,8,208,12357,12357,322,7,,56,1746488,9648,,,,,20,122791,121046,229,0,,,,,159337,105769,,0,2728153,23641,,,115013,93223,1867534,9870,2728153,23641 +"2020-09-07","MD",3804,3660,5,144,14603,14603,362,30,,109,1292306,11101,,111730,,,,112883,112883,764,0,,,10303,,134549,7112,,0,2086609,22370,,,122033,,1405189,11865,2086609,22370 +"2020-09-07","ME",134,133,0,1,427,427,8,3,,3,,0,9392,,,,2,4701,4230,19,0,499,,,,5147,4076,,0,292951,3231,9904,,,,,0,292951,3231 +"2020-09-07","MI",6810,6538,4,272,,,616,0,,158,,0,,,2844275,,71,118403,107371,1212,0,,,,,151611,80678,,0,2995886,44071,264881,,,,,0,2995886,44071 +"2020-09-07","MN",1912,1860,3,52,6743,6743,275,24,1898,136,1116450,8744,,,,,,81225,81225,638,0,,,,,,73403,1609618,14979,1609618,14979,,,,,1197675,9382,,0 +"2020-09-07","MO",1659,,1,,,,934,0,,,960045,7636,,67071,1272326,,113,94340,94340,906,0,,,3087,,103847,,,0,1378643,10058,,,70158,,1054385,8542,1378643,10058 +"2020-09-07","MP",2,2,0,,4,4,,0,,,13484,0,,,,,,58,58,0,0,,,,,,29,,0,13542,0,,,,,13540,0,17626,0 +"2020-09-07","MS",2585,2417,1,168,5326,5326,758,0,,186,510921,0,,,,,111,87130,82457,242,0,,,,,,67918,,0,598051,242,27468,33480,,,,0,592831,0 +"2020-09-07","MT",118,,1,,498,498,163,12,,,,0,,,,,,8316,,52,0,,,,,,6246,,0,267125,5099,,,,,,0,267125,5099 +"2020-09-07","NC",2897,2897,7,,,,765,0,,248,,0,,,,,,177919,177919,1018,0,,,,,,,,0,2454856,25209,,,,,,0,2454856,25209 +"2020-09-07","ND",160,,0,,602,602,68,4,162,19,198097,729,8554,,,,,13768,13768,169,0,359,,,,,11080,490368,2082,490368,2082,8913,1,,,211675,918,507124,2339 +"2020-09-07","NE",404,,0,,2068,2068,175,3,,,341575,552,,,454475,,,35886,,81,0,,,,,43661,27710,,0,499136,1298,,,,,377939,649,499136,1298 +"2020-09-07","NH",433,,0,,718,718,7,0,227,,214823,1608,,,,,,7476,,29,0,,,,,,6805,,0,354070,3542,30822,,30163,,222299,1637,354070,3542 +"2020-09-07","NJ",15990,14208,2,1782,22802,22802,389,6,,79,2860138,51889,,,,,29,198142,194390,360,0,,,,,,,,0,3058280,52249,,,,,,0,3054528,52221 +"2020-09-07","NM",807,,4,,3195,3195,65,9,,,,0,,,,,,26144,,37,0,,,,,,13604,,0,795247,3411,,,,,,0,795247,3411 +"2020-09-07","NV",1393,,4,,,,597,0,,184,550675,2803,,,,,114,71967,71967,357,0,,,,,,,877813,1458,877813,1458,,,,,621990,3140,902801,6485 +"2020-09-07","NY",25361,,2,,89995,89995,413,0,,115,,0,,,,,57,440021,,520,0,,,,,,,8855109,58865,8855109,58865,,,,,,0,,0 +"2020-09-07","OH",4276,3987,17,289,13887,13887,686,46,3034,244,,0,,,,,135,131336,124514,778,0,,,,,143799,108578,,0,2484170,24140,,,,,,0,2484170,24140 +"2020-09-07","OK",853,,0,,5113,5113,472,8,,208,860086,0,,,860086,,,64220,64220,613,0,3453,,,,73487,53414,,0,924306,613,73173,,,,,0,939500,0 +"2020-09-07","OR",481,,1,,2161,2161,147,0,,45,557381,5130,,,857803,,23,28044,,188,0,,,,,51349,5198,,0,909152,8057,,,,,575596,0,909152,8057 +"2020-09-07","PA",7780,,20,,,,496,0,,,1608378,9079,,,,,57,139863,135862,547,0,,,,,,114687,2444418,17481,2444418,17481,,,,,1744240,9617,,0 +"2020-09-07","PR",477,317,0,160,,,372,0,,81,305972,0,,,395291,,72,16692,16692,423,0,18683,,,,20103,,,0,322664,423,,,,,,0,415664,0 +"2020-09-07","RI",1059,,1,,2589,2589,73,2,,5,268457,1768,,,549388,,3,22572,,53,0,,,,,31786,,581174,4011,581174,4011,,,,,291029,1821,,0 +"2020-09-07","SC",2907,2767,20,140,8171,8171,787,27,,208,884103,7830,59288,,846187,,129,125607,123552,655,0,5641,,,,161468,51431,,0,1009710,8485,64929,,,,,0,1007655,8438 +"2020-09-07","SD",173,,0,,1084,1084,78,5,,,140793,801,,,,,,15300,,191,0,,,,,21340,12235,,0,208084,2130,,,,,156093,992,208084,2130 +"2020-09-07","TN",1869,1818,4,51,7312,7312,953,16,,296,,0,,,2145354,,130,165109,160708,983,0,,,,,195026,146213,,0,2340380,13512,,,,,,0,2340380,13512 +"2020-09-07","TX",13492,,20,,,,3537,0,,1322,,0,,,,,,640370,640370,2060,0,32006,14072,,,766091,543412,,0,5723646,13498,371102,122333,,,,0,5723646,13498 +"2020-09-07","UT",423,,1,,3225,3225,152,18,802,49,633772,2509,,,805728,334,,55033,,373,0,,1145,,1074,60311,46468,,0,866039,3832,,7605,,6124,687968,2792,866039,3832 +"2020-09-07","VA",2684,2551,6,133,9902,9902,1061,21,,249,,0,,,,,119,127571,121919,645,0,8919,1983,,,146610,,1676446,11971,1676446,11971,134195,7553,,,,0,,0 +"2020-09-07","VI",17,,0,,,,,0,,,16230,86,,,,,,1190,,9,0,,,,,,1069,,0,17420,95,,,,,17435,95,,0 +"2020-09-07","VT",58,58,0,,,,2,0,,,142765,1843,,,,,,1650,1649,4,0,,,,,,1465,,0,210487,5519,,,,,144414,1846,210487,5519 +"2020-09-07","WA",1953,1953,0,,6860,6860,384,18,,,,0,,,,,37,79653,78795,304,0,,,,,,,1563053,12576,1563053,12576,,,,,,0,,0 +"2020-09-07","WI",1176,1168,0,8,6089,6089,289,19,1052,91,1226793,4899,,,,,,86928,81760,575,0,,,,,,72478,1853736,11939,1853736,11939,,,,,1308553,5466,,0 +"2020-09-07","WV",247,245,1,2,,,149,0,,55,,0,,,,,25,11575,11368,163,0,,,,,,8581,,0,453639,3368,16139,,,,,0,453639,3368 +"2020-09-07","WY",42,,0,,219,219,15,0,,,74312,0,,,125357,,,4032,3425,0,0,,,,,3660,3416,,0,129017,1132,,,,,77685,0,129017,1132 +"2020-09-06","AK",42,42,0,,256,256,41,0,,,,0,,,380568,,7,5776,,95,0,,,,,6210,2323,,0,387057,2055,,,,,,0,387057,2055 +"2020-09-06","AL",2276,2152,1,124,14914,14914,841,0,1537,,851994,5824,,,,848,,132314,120815,511,0,,,,,,51154,,0,972809,6312,,,55174,,972809,6312,,0 +"2020-09-06","AR",894,,12,,4462,4462,389,6,,,700721,0,,,700721,568,78,65226,64690,0,0,,2311,,,,58295,,0,765411,0,,14859,,,,0,765411,0 +"2020-09-06","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-09-06","AZ",5221,4947,14,274,21527,21527,666,7,,229,1053252,5993,,,,,121,205766,203969,250,0,,,,,,,,0,1848768,4927,,,272437,,1257221,6240,1848768,4927 +"2020-09-06","CA",13709,,66,,,,4226,0,,1201,,0,,,,,,732144,732144,4905,0,,,,,,,,0,12047191,130868,,,,,,0,12047191,130868 +"2020-09-06","CO",1972,1623,1,349,7138,7138,227,4,,,689187,5604,149674,,,,,59274,55256,285,0,11137,,,,,,1059557,8473,1059557,8473,160811,,,,744443,5880,,0 +"2020-09-06","CT",4468,3583,0,885,11275,11275,58,0,,,,0,,,1309062,,,53365,51221,0,0,,,,,66016,9049,,0,1377228,7036,,,,,,0,1377228,7036 +"2020-09-06","DC",611,,0,,,,80,0,,24,,0,,,,,10,14279,,41,0,,,,,,11355,311510,3646,311510,3646,,,,,187619,1383,,0 +"2020-09-06","DE",609,537,1,72,,,62,0,,13,232740,2000,,,,,,18043,17053,151,0,,,,,21291,9696,360999,2156,360999,2156,,,,,250783,2151,,0 +"2020-09-06","FL",12001,,38,,40487,40487,3167,114,,,4138339,18399,411877,403867,5742293,,,639166,628731,2513,0,34738,,34017,,832459,,6749937,49967,6749937,49967,446669,,437913,,4750980,0,6612703,32938 +"2020-09-06","GA",6037,,60,,25523,25523,2202,22,4684,,,0,,,,,,283199,283199,1651,0,22365,,,,259039,,,0,2479568,18839,284452,,,,,0,2479568,18839 +"2020-09-06","GU",16,,1,,,,57,0,,14,39070,0,,,,,,1671,1671,0,0,2,,,,,744,,0,40741,0,158,,,,,0,40110,0 +"2020-09-06","HI",84,84,3,,592,592,265,9,,50,220103,8185,,,,,37,9693,,220,0,,,,,9639,2931,299571,10725,299571,10725,,,,,229796,8405,305226,11124 +"2020-09-06","IA",1165,,4,,,,309,0,,91,584646,3777,,48252,,,37,68291,68291,649,0,,,3121,1719,,49723,,0,652937,4426,,,51413,14081,654436,4416,,0 +"2020-09-06","ID",384,348,2,36,1466,1466,151,5,394,50,233695,1246,,,,,,33477,30999,281,0,,,,,,16339,,0,264694,1511,,,,,264694,1511,,0 +"2020-09-06","IL",8390,8171,5,219,,,1504,0,,356,,0,,,,,134,251508,249580,1403,0,,,,,,,,0,4418372,46496,,,,,,0,4418372,46496 +"2020-09-06","IN",3364,3140,2,224,11365,11365,751,47,2271,232,1039064,8947,,,,,70,99804,,843,0,,,,,103975,,,0,1649026,6492,,,,,1138868,9790,1649026,6492 +"2020-09-06","KS",481,,0,,2415,2415,314,0,661,101,381985,0,,,,211,36,45220,,0,0,,,,,,,,0,427205,0,,,,,427205,0,,0 +"2020-09-06","KY",996,987,3,9,4713,4713,535,0,1414,128,,0,,,,,,52774,47741,310,0,,,,,,10613,,0,866842,0,47702,15830,,,,0,866842,0 +"2020-09-06","LA",5093,4930,58,163,,,790,0,,,1805480,25205,,,,,119,153764,152868,1395,0,,,,,,134432,,0,1959244,26600,,,,,,0,1958348,26600 +"2020-09-06","MA",9125,8917,9,208,12350,12350,312,3,,52,1736840,17361,,,,,22,122562,120824,366,0,,,,,159076,105769,,0,2704512,44050,,,114941,92907,1857664,17731,2704512,44050 +"2020-09-06","MD",3799,3655,3,144,14573,14573,341,57,,96,1281205,8357,,111730,,,,112119,112119,512,0,,,10303,,133590,7103,,0,2064239,16723,,,122033,,1393324,8869,2064239,16723 +"2020-09-06","ME",134,133,0,1,424,424,6,0,,2,,0,9256,,,,2,4682,4210,15,0,491,,,,5123,4049,,0,289720,4760,9760,,,,,0,289720,4760 +"2020-09-06","MI",6806,6534,0,272,,,616,0,,158,,0,,,2801811,,71,117191,106215,0,0,,,,,150004,80678,,0,2951815,0,263721,,,,,0,2951815,0 +"2020-09-06","MN",1909,1857,6,52,6719,6719,284,43,1891,143,1107706,9786,,,,,,80587,80587,707,0,,,,,,72463,1594639,17173,1594639,17173,,,,,1188293,10493,,0 +"2020-09-06","MO",1658,,19,,,,934,0,,,952409,6310,,66921,1263356,,113,93434,93434,1232,0,,,3085,,102766,,,0,1368585,8123,,,70006,,1045843,7542,1368585,8123 +"2020-09-06","MP",2,2,0,,4,4,,0,,,13484,0,,,,,,58,58,0,0,,,,,,29,,0,13542,0,,,,,13540,0,17626,0 +"2020-09-06","MS",2584,2416,15,168,5326,5326,758,0,,186,510921,0,,,,,111,86888,82235,410,0,,,,,,67918,,0,597809,410,27468,33480,,,,0,592831,0 +"2020-09-06","MT",117,,1,,486,486,156,9,,,,0,,,,,,8264,,100,0,,,,,,6243,,0,262026,976,,,,,,0,262026,976 +"2020-09-06","NC",2890,2890,1,,,,830,0,,250,,0,,,,,,176901,176901,1086,0,,,,,,,,0,2429647,28779,,,,,,0,2429647,28779 +"2020-09-06","ND",160,,1,,598,598,64,2,161,18,197368,1203,8554,,,,,13599,13599,298,0,359,,,,,10821,488286,4462,488286,4462,8913,1,,,210757,1544,504785,4653 +"2020-09-06","NE",404,,0,,2065,2065,176,5,,,341023,1160,,,453309,,,35805,,144,0,,,,,43530,27473,,0,497838,1840,,,,,377290,1317,497838,1840 +"2020-09-06","NH",433,,1,,718,718,10,1,227,,213215,1894,,,,,,7447,,23,0,,,,,,6766,,0,350528,4465,30813,,30153,,220662,1917,350528,4465 +"2020-09-06","NJ",15988,14206,4,1782,22796,22796,403,6,,74,2808249,36949,,,,,35,197782,194058,351,0,,,,,,,,0,3006031,37300,,,,,,0,3002307,37585 +"2020-09-06","NM",803,,3,,3186,3186,65,15,,,,0,,,,,,26107,,59,0,,,,,,13530,,0,791836,4025,,,,,,0,791836,4025 +"2020-09-06","NV",1389,,1,,,,597,0,,184,547872,5970,,,,,114,71610,71610,508,0,,,,,,,876355,4534,876355,4534,,,,,618850,6445,896316,10932 +"2020-09-06","NY",25359,,9,,89995,89995,410,0,,119,,0,,,,,56,439501,,729,0,,,,,,,8796244,85630,8796244,85630,,,,,,0,,0 +"2020-09-06","OH",4259,3972,3,287,13841,13841,691,33,3033,252,,0,,,,,134,130558,123803,773,0,,,,,142831,108578,,0,2460030,27899,,,,,,0,2460030,27899 +"2020-09-06","OK",853,,3,,5105,5105,472,0,,208,860086,0,,,860086,,,63607,63607,420,0,3453,,,,73487,53059,,0,923693,420,73173,,,,,0,939500,0 +"2020-09-06","OR",480,,5,,2161,2161,147,0,,45,552251,2923,,,850169,,23,27856,,255,0,,,,,50926,5198,,0,901095,5153,,,,,575596,0,901095,5153 +"2020-09-06","PA",7760,,0,,,,490,0,,,1599299,10218,,,,,64,139316,135324,691,0,,,,,,114239,2426937,20440,2426937,20440,,,,,1734623,10899,,0 +"2020-09-06","PR",477,317,13,160,,,377,0,,73,305972,0,,,395291,,67,16269,16269,26,0,18264,,,,20103,,,0,322241,26,,,,,,0,415664,0 +"2020-09-06","RI",1058,,0,,2587,2587,79,6,,7,266689,1486,,,545448,,3,22519,,35,0,,,,,31715,,577163,6234,577163,6234,,,,,289208,1521,,0 +"2020-09-06","SC",2887,2748,10,139,8144,8144,787,11,,208,876273,6635,59138,,838603,,129,124952,122944,663,0,5618,,,,160614,51431,,0,1001225,7298,64756,,,,,0,999217,7266 +"2020-09-06","SD",173,,0,,1079,1079,81,11,,,139992,974,,,,,,15109,,220,0,,,,,21142,11918,,0,205954,2804,,,,,155101,1194,205954,2804 +"2020-09-06","TN",1865,1814,3,51,7296,7296,969,20,,299,,0,,,2132885,,144,164126,159795,1764,0,,,,,193983,145359,,0,2326868,20836,,,,,,0,2326868,20836 +"2020-09-06","TX",13472,,64,,,,3715,0,,1409,,0,,,,,,638310,638310,2995,0,31773,13966,,,764864,543412,,0,5710148,20417,369645,121316,,,,0,5710148,20417 +"2020-09-06","UT",422,,2,,3207,3207,152,19,802,49,631263,4097,,,802193,333,,54660,,388,0,,1132,,1061,60014,46233,,0,862207,6786,,7501,,6049,685176,4482,862207,6786 +"2020-09-06","VA",2678,2545,1,133,9881,9881,1083,32,,232,,0,,,,,119,126926,121317,1199,0,8900,1950,,,145825,,1664475,12455,1664475,12455,133940,7326,,,,0,,0 +"2020-09-06","VI",17,,1,,,,,0,,,16144,100,,,,,,1181,,14,0,,,,,,1069,,0,17325,114,,,,,17340,109,,0 +"2020-09-06","VT",58,58,0,,,,4,0,,,140922,915,,,,,,1646,1646,1,0,,,,,,1456,,0,204968,3890,,,,,142568,916,204968,3890 +"2020-09-06","WA",1953,1953,0,,6842,6842,403,-6,,,,0,,,,,34,79349,78503,507,0,,,,,,,1550477,16387,1550477,16387,,,,,,0,,0 +"2020-09-06","WI",1176,1168,0,8,6070,6070,286,22,1050,96,1221894,4616,,,,,,86353,81193,890,0,,,,,,71906,1841797,14596,1841797,14596,,,,,1303087,5509,,0 +"2020-09-06","WV",246,244,3,2,,,149,0,,51,,0,,,,,22,11412,11214,123,0,,,,,,8556,,0,450271,4829,16295,,,,,0,450271,4829 +"2020-09-06","WY",42,,0,,219,219,15,-4,,,74312,0,,,124241,,,4032,3425,26,0,,,,,3644,3416,,0,127885,202,,,,,77685,0,127885,202 +"2020-09-05","AK",42,42,2,,256,256,36,4,,,,0,,,378554,,8,5681,,87,0,,,,,6169,2321,,0,385002,3065,,,,,,0,385002,3065 +"2020-09-05","AL",2275,2151,9,124,14914,14914,818,113,1537,,846170,6150,,,,848,,131803,120327,1410,0,,,,,,51154,,0,966497,7188,,,54959,,966497,7188,,0 +"2020-09-05","AR",882,,9,,4456,4456,385,34,,,700721,16485,,,700721,566,78,65226,64690,548,0,,2311,,,,57968,,0,765411,18094,,14859,,,,0,765411,18094 +"2020-09-05","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-09-05","AZ",5207,4933,36,274,21520,21520,702,22,,225,1047259,15012,,,,,131,205516,203722,835,0,,,,,,,,0,1843841,16048,,,271491,,1250981,15839,1843841,16048 +"2020-09-05","CA",13643,,153,,,,4242,0,,1242,,0,,,,,,727239,727239,4956,0,,,,,,,,0,11916323,119353,,,,,,0,11916323,119353 +"2020-09-05","CO",1971,1622,5,349,7134,7134,220,9,,,683583,6270,149229,,,,,58989,54980,334,0,11117,,,,,,1051084,10332,1051084,10332,160346,,,,738563,6541,,0 +"2020-09-05","CT",4468,3583,0,885,11275,11275,58,0,,,,0,,,1302142,,,53365,51221,0,0,,,,,65906,9049,,0,1370192,16073,,,,,,0,1370192,16073 +"2020-09-05","DC",611,,0,,,,80,0,,22,,0,,,,,16,14238,,52,0,,,,,,11323,307864,4513,307864,4513,,,,,186236,1317,,0 +"2020-09-05","DE",608,536,2,72,,,58,0,,12,230740,1850,,,,,,17892,16902,140,0,,,,,21218,9641,358843,3778,358843,3778,,,,,248632,1990,,0 +"2020-09-05","FL",11963,,60,,40373,40373,3229,246,,,4119940,20144,411877,403867,5712716,,,636653,626376,3593,0,34738,,34017,,829243,,6699970,61498,6699970,61498,446669,,437913,,4750980,23740,6579765,40774 +"2020-09-05","GA",5977,,46,,25501,25501,2740,99,4681,,,0,,,,,,281548,281548,2194,0,22155,,,,257428,,,0,2460729,28604,283277,,,,,0,2460729,28604 +"2020-09-05","GU",15,,1,,,,57,0,,14,39070,577,,,,,,1671,1671,52,0,2,,,,,744,,0,40741,629,158,,,,,0,40110,0 +"2020-09-05","HI",81,81,2,,583,583,265,10,,50,211918,7398,,,,,37,9473,,271,0,,,,,9430,2855,288846,9986,288846,9986,,,,,221391,7669,294102,9925 +"2020-09-05","IA",1161,,20,,,,315,0,,94,580869,5148,,47954,,,38,67642,67642,1028,0,,,3118,1664,,49521,,0,648511,6176,,,51112,13362,650020,6191,,0 +"2020-09-05","ID",382,346,10,36,1461,1461,151,19,394,50,232449,1649,,,,,,33196,30734,269,0,,,,,,16071,,0,263183,1894,,,,,263183,1894,,0 +"2020-09-05","IL",8385,8166,23,219,,,1550,0,,363,,0,,,,,151,250105,248177,2806,0,,,,,,,,0,4371876,61935,,,,,,0,4371876,61935 +"2020-09-05","IN",3362,3138,12,224,11318,11318,771,53,2260,249,1030117,10574,,,,,77,98961,,1077,0,,,,,103626,,,0,1642534,21522,,,,,1129078,11651,1642534,21522 +"2020-09-05","KS",481,,0,,2415,2415,314,0,661,101,381985,0,,,,211,36,45220,,0,0,,,,,,,,0,427205,0,,,,,427205,0,,0 +"2020-09-05","KY",993,984,6,9,4713,4713,535,14,1414,128,,0,,,,,,52464,47487,787,0,,,,,,10613,,0,866842,19233,47702,15830,,,,0,866842,19233 +"2020-09-05","LA",5035,4872,0,163,,,808,0,,,1780275,0,,,,,96,152369,151473,0,0,,,,,,134432,,0,1932644,0,,,,,,0,1931748,0 +"2020-09-05","MA",9116,8907,16,209,12347,12347,325,12,,48,1719479,20373,,,,,25,122196,120454,438,0,,,,,158624,105769,,0,2660462,60150,,,114635,92567,1839933,20789,2660462,60150 +"2020-09-05","MD",3796,3652,7,144,14516,14516,353,43,,100,1272848,12214,,111730,,,,111607,111607,776,0,,,10303,,132974,7099,,0,2047516,28192,,,122033,,1384455,12990,2047516,28192 +"2020-09-05","ME",134,133,0,1,424,424,5,1,,2,,0,9237,,,,2,4667,4197,35,0,488,,,,5109,4037,,0,284960,5227,9738,,,,,0,284960,5227 +"2020-09-05","MI",6806,6534,8,272,,,616,0,,158,,0,,,2801811,,71,117191,106215,896,0,,,,,150004,80678,,0,2951815,40903,263721,,,,,0,2951815,40903 +"2020-09-05","MN",1903,1851,4,52,6676,6676,279,41,1878,133,1097920,8579,,,,,,79880,79880,914,0,,,,,,71507,1577466,18635,1577466,18635,,,,,1177800,9493,,0 +"2020-09-05","MO",1639,,77,,,,934,0,,,946099,14584,,66807,1256574,,113,92202,92202,1987,0,,,3040,,101521,,,0,1360462,20791,,,69847,,1038301,16571,1360462,20791 +"2020-09-05","MP",2,2,0,,4,4,,0,,,13484,0,,,,,,58,58,1,0,,,,,,29,,0,13542,1,,,,,13540,0,17626,0 +"2020-09-05","MS",2569,2401,11,168,5326,5326,758,0,,186,510921,9456,,,,,111,86478,81910,539,0,,,,,,67918,,0,597399,9995,27468,33480,,,,0,592831,10534 +"2020-09-05","MT",116,,2,,477,477,151,3,,,,0,,,,,,8164,,145,0,,,,,,6219,,0,261050,1062,,,,,,0,261050,1062 +"2020-09-05","NC",2889,2889,50,,,,831,0,,254,,0,,,,,,175815,175815,1561,0,,,,,,,,0,2400868,32622,,,,,,0,2400868,32622 +"2020-09-05","ND",159,,5,,596,596,67,6,159,18,196165,1382,8545,,,,,13301,13301,355,0,359,,,,,10640,483824,7031,483824,7031,8904,1,,,209213,1956,500132,7334 +"2020-09-05","NE",404,,0,,2060,2060,174,27,,,339863,1740,,,451629,,,35661,,192,0,,,,,43375,26973,,0,495998,2922,,,,,375973,1938,495998,2922 +"2020-09-05","NH",432,,0,,717,717,9,1,227,,211321,1426,,,,,,7424,,56,0,,,,,,6742,,0,346063,4078,30766,,30105,,218745,1482,346063,4078 +"2020-09-05","NJ",15984,14202,7,1782,22790,22790,389,20,,69,2771300,0,,,,,31,197431,193747,384,0,,,,,,,,0,2968731,384,,,,,,0,2964722,0 +"2020-09-05","NM",800,,6,,3171,3171,68,0,,,,0,,,,,,26048,,146,0,,,,,,13460,,0,787811,5767,,,,,,0,787811,5767 +"2020-09-05","NV",1388,,13,,,,597,0,,184,541902,3799,,,,,114,71102,71102,390,0,,,,,,,871821,7125,871821,7125,,,,,612405,4224,885384,10092 +"2020-09-05","NY",25350,,2,,89995,89995,425,0,,115,,0,,,,,61,438772,,801,0,,,,,,,8710614,99761,8710614,99761,,,,,,0,,0 +"2020-09-05","OH",4256,3969,8,287,13808,13808,717,77,3032,253,,0,,,,,136,129785,123079,1341,0,,,,,141638,107972,,0,2432131,30770,,,,,,0,2432131,30770 +"2020-09-05","OK",850,,4,,5105,5105,472,44,,208,860086,7731,,,860086,,,63187,63187,1147,0,3453,,,,73487,52740,,0,923273,8878,73173,,,,,0,939500,13312 +"2020-09-05","OR",475,,5,,2161,2161,147,-14,,45,549328,5539,,,845231,,23,27601,,265,0,,,,,50711,5198,,0,895942,10921,,,,,575596,5792,895942,10921 +"2020-09-05","PA",7760,,18,,,,505,0,,,1589081,12202,,,,,66,138625,134643,963,0,,,,,,112286,2406497,25890,2406497,25890,,,,,1723724,13114,,0 +"2020-09-05","PR",464,309,9,155,,,369,0,,76,305972,0,,,395291,,67,16243,16243,142,0,18249,,,,20103,,,0,322215,142,,,,,,0,415664,0 +"2020-09-05","RI",1058,,3,,2581,2581,82,22,,9,265203,3440,,,539262,,4,22484,,241,0,,,,,31667,,570929,13407,570929,13407,,,,,287687,3681,,0 +"2020-09-05","SC",2877,2738,31,139,8133,8133,845,60,,213,869638,10979,58908,,832138,,128,124289,122313,964,0,5562,,,,159813,51431,,0,993927,11943,64470,,,,,0,991951,11914 +"2020-09-05","SD",173,,3,,1068,1068,86,6,,,139018,1321,,,,,,14889,,293,0,,,,,20877,11659,,0,203150,2764,,,,,153907,1614,203150,2764 +"2020-09-05","TN",1862,1810,25,52,7276,7276,1000,70,,300,,0,,,2114019,,146,162362,158070,1765,0,,,,,192013,144383,,0,2306032,26997,,,,,,0,2306032,26997 +"2020-09-05","TX",13408,,177,,,,3973,0,,1409,,0,,,,,,635315,635315,4486,0,31521,13861,,,762978,538282,,0,5689731,40155,368062,120161,,,,0,5689731,40155 +"2020-09-05","UT",420,,1,,3188,3188,152,16,799,49,627166,4332,,,795821,331,,54272,,433,0,,1124,,1053,59600,45896,,0,855421,6912,,7333,,5922,680694,4812,855421,6912 +"2020-09-05","VA",2677,2544,15,133,9849,9849,1098,51,,243,,0,,,,,121,125727,120191,948,0,8855,1921,,,144891,,1652020,17712,1652020,17712,133366,7003,,,,0,,0 +"2020-09-05","VI",16,,0,,,,,0,,,16044,254,,,,,,1167,,17,0,,,,,,1061,,0,17211,271,,,,,17231,260,,0 +"2020-09-05","VT",58,58,0,,,,4,0,,,140007,853,,,,,,1645,1645,5,0,,,,,,1451,,0,201078,1729,,,,,141652,858,201078,1729 +"2020-09-05","WA",1953,1953,8,,6848,6848,417,14,,,,0,,,,,48,78842,78034,527,0,,,,,,,1534090,16001,1534090,16001,,,,,,0,,0 +"2020-09-05","WI",1176,1168,15,8,6048,6048,275,50,1047,95,1217278,7075,,,,,,85463,80300,999,0,,,,,,71153,1827201,19570,1827201,19570,,,,,1297578,8021,,0 +"2020-09-05","WV",243,241,0,2,,,154,0,,49,,0,,,,,21,11289,11093,252,0,,,,,,8516,,0,445442,4686,16201,,,,,0,445442,4686 +"2020-09-05","WY",42,,0,,223,223,15,0,,,74312,0,,,124045,,,4006,3386,17,0,,,,,3638,3404,,0,127683,250,,,,,77685,0,127683,250 +"2020-09-04","AK",40,40,0,,252,252,43,0,,,,0,,,375546,,4,5594,,119,0,,,,,6115,2295,,0,381937,4001,,,,,,0,381937,4001 +"2020-09-04","AL",2266,2144,33,122,14801,14801,880,0,1525,,840020,3331,,,,839,,130393,119289,1108,0,,,,,,51154,,0,959309,4019,,,54774,,959309,4019,,0 +"2020-09-04","AR",873,,12,,4422,4422,401,36,,,684236,8899,,,684236,564,86,64678,64175,1174,0,,2231,,,,57547,,0,747317,9868,,14299,,,,0,747317,9868 +"2020-09-04","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-09-04","AZ",5171,4897,41,274,21498,21498,742,24,,236,1032247,13341,,,,,145,204681,202895,728,0,,,,,,,,0,1827793,16020,,,270695,,1235142,14053,1827793,16020 +"2020-09-04","CA",13490,,163,,,,4401,0,,1235,,0,,,,,,722283,722283,5106,0,,,,,,,,0,11796970,133046,,,,,,0,11796970,133046 +"2020-09-04","CO",1966,1617,11,349,7125,7125,219,21,,,677313,6585,148645,,,,,58655,54709,368,0,11076,,,,,,1040752,10961,1040752,10961,159721,,,,732022,6927,,0 +"2020-09-04","CT",4468,3583,0,885,11275,11275,58,0,,,,0,,,1286217,,,53365,51221,156,0,,,,,65769,9049,,0,1354119,21997,,,,,,0,1354119,21997 +"2020-09-04","DC",611,,2,,,,75,0,,23,,0,,,,,5,14186,,51,0,,,,,,11297,303351,4592,303351,4592,,,,,184919,1997,,0 +"2020-09-04","DE",606,534,0,72,,,58,0,,12,228890,1995,,,,,,17752,16762,99,0,,,,,21122,9582,355065,2791,355065,2791,,,,,246642,2094,,0 +"2020-09-04","FL",11903,,103,,40127,40127,3360,243,,,4099796,19113,411877,403867,5677015,,,633060,623160,3147,0,34738,,34017,,824418,,6638472,62489,6638472,62489,446669,,437913,,4727240,22281,6538991,39242 +"2020-09-04","GA",5931,,63,,25402,25402,2295,143,4664,,,0,,,,,,279354,279354,2066,0,21947,,,,254680,,,0,2432125,21460,282093,,,,,0,2432125,21460 +"2020-09-04","GU",14,,1,,,,59,0,,11,38493,563,,,,,,1619,1619,59,0,2,,,,,744,,0,40112,622,158,,,,,0,40110,622 +"2020-09-04","HI",79,79,4,,573,573,277,21,,51,204520,6080,,,,,31,9202,,211,0,,,,,9149,2778,278860,8482,278860,8482,,,,,213722,6291,284177,8473 +"2020-09-04","IA",1141,,6,,,,317,0,,87,575721,6486,,47534,,,41,66614,66614,1091,0,,,3106,1642,,49053,,0,642335,7577,,,50680,13188,643829,7579,,0 +"2020-09-04","ID",372,336,0,36,1442,1442,171,7,392,45,230800,2064,,,,,,32927,30489,263,0,,,,,,15787,,0,261289,2326,,,,,261289,2326,,0 +"2020-09-04","IL",8362,8143,38,219,,,1621,0,,360,,0,,,,,155,247299,245371,5594,0,,,,,,,,0,4309941,149273,,,,,,0,4309941,149273 +"2020-09-04","IN",3350,3127,18,223,11265,11265,865,69,2246,262,1019543,13359,,,,,78,97884,,1030,0,,,,,102642,,,0,1621012,23426,,,,,1117427,14389,1621012,23426 +"2020-09-04","KS",481,,23,,2415,2415,314,54,661,101,381985,6678,,,,211,36,45220,,1280,0,,,,,,,,0,427205,7958,,,,,427205,7958,,0 +"2020-09-04","KY",987,978,11,9,4699,4699,574,15,1409,138,,0,,,,,,51677,46846,792,0,,,,,,10587,,0,847609,7904,47540,15548,,,,0,847609,7904 +"2020-09-04","LA",5035,4872,14,163,,,808,0,,,1780275,14723,,,,,96,152369,151473,822,0,,,,,,134432,,0,1932644,15545,,,,,,0,1931748,15545 +"2020-09-04","MA",9100,8892,23,208,12335,12335,333,10,,60,1699106,17340,,,,,26,121758,120038,212,0,,,,,158114,105769,,0,2600312,39443,,,114277,91070,1819144,17559,2600312,39443 +"2020-09-04","MD",3789,3645,11,144,14473,14473,395,46,,108,1260634,13041,,111730,,,,110831,110831,819,0,,,10303,,132036,7072,,0,2019324,29433,,,122033,,1371465,13860,2019324,29433 +"2020-09-04","ME",134,133,1,1,423,423,9,-1,,5,,0,9225,,,,2,4632,4164,15,0,484,,,,5076,4006,,0,279733,5397,9722,,,,,0,279733,5397 +"2020-09-04","MI",6798,6526,7,272,,,616,0,,158,,0,,,2761686,,75,116295,105377,1053,0,,,,,148506,76151,,0,2910912,29205,262033,,,,,0,2910912,29205 +"2020-09-04","MN",1899,1847,10,52,6635,6635,274,43,1871,138,1089341,9076,,,,,,78966,78966,843,0,,,,,,70537,1558831,18724,1558831,18724,,,,,1168307,9919,,0 +"2020-09-04","MO",1562,,17,,,,934,0,,,931515,12047,,66617,1237342,,113,90215,90215,1605,0,,,3017,,99995,,,0,1339671,16422,,,69634,,1021730,13652,1339671,16422 +"2020-09-04","MP",2,2,0,,4,4,,0,,,13484,0,,,,,,57,57,0,0,,,,,,29,,0,13541,0,,,,,13540,0,17626,0 +"2020-09-04","MS",2558,2394,22,164,5326,5326,789,0,,178,501465,0,,,,,115,85939,81530,823,0,,,,,,67918,,0,587404,823,27057,32271,,,,0,582297,0 +"2020-09-04","MT",114,,3,,474,474,150,2,,,,0,,,,,,8019,,148,0,,,,,,5821,,0,259988,4328,,,,,,0,259988,4328 +"2020-09-04","NC",2839,2839,36,,,,955,0,,281,,0,,,,,,174254,174254,2045,0,,,,,,,,0,2368246,36879,,,,,,0,2368246,36879 +"2020-09-04","ND",154,,0,,590,590,67,7,158,17,194783,1513,8517,,,,,12946,12946,340,0,355,,,,,10310,476793,6370,476793,6370,8872,1,,,207257,2053,492798,6717 +"2020-09-04","NE",404,,5,,2033,2033,162,6,,,338123,4153,,,448935,,,35469,,474,0,,,,,43147,26766,,0,493076,5257,,,,,374035,4644,493076,5257 +"2020-09-04","NH",432,,0,,716,716,9,1,227,,209895,1367,,,,,,7368,,21,0,,,,,,6727,,0,341985,4582,30685,,30036,,217263,1388,341985,4582 +"2020-09-04","NJ",15977,14195,7,1782,22770,22770,466,32,,95,2771300,34258,,,,,40,197047,193422,493,0,,,,,,,,0,2968347,34751,,,,,,0,2964722,34707 +"2020-09-04","NM",794,,3,,3171,3171,69,2,,,,0,,,,,,25902,,90,0,,,,,,13412,,0,782044,5248,,,,,,0,782044,5248 +"2020-09-04","NV",1375,,12,,,,611,0,,178,538103,3058,,,,,112,70712,70712,489,0,,,,,,,864696,8610,864696,8610,,,,,608181,3489,875292,7264 +"2020-09-04","NY",25348,,5,,89995,89995,428,0,,116,,0,,,,,61,437971,,864,0,,,,,,,8610853,93395,8610853,93395,,,,,,0,,0 +"2020-09-04","OH",4248,3962,22,286,13731,13731,727,68,3022,266,,0,,,,,134,128444,121765,1332,0,,,,,140184,107083,,0,2401361,29770,,,,,,0,2401361,29770 +"2020-09-04","OK",846,,11,,5061,5061,518,48,,203,852355,10336,,,852355,,,62040,62040,1013,0,3006,,,,72158,52123,,0,914395,11349,68964,,,,,0,926188,11586 +"2020-09-04","OR",470,,2,,2175,2175,133,8,,43,543789,4482,,,834767,,26,27336,,261,0,,,,,50254,5144,,0,885021,7616,,,,,569804,4732,885021,7616 +"2020-09-04","PA",7742,,10,,,,497,0,,,1576879,11436,,,,,66,137662,133731,891,0,,,,,,112882,2380607,24987,2380607,24987,,,,,1710610,12293,,0 +"2020-09-04","PR",455,302,7,153,,,382,0,,78,305972,0,,,395291,,60,16101,16101,32,0,18140,,,,20103,,,0,322073,32,,,,,,0,415664,0 +"2020-09-04","RI",1055,,0,,2559,2559,76,19,,8,261763,2273,,,525975,,4,22243,,100,0,,,,,31547,,557522,9929,557522,9929,,,,,284006,2373,,0 +"2020-09-04","SC",2846,2706,39,140,8073,8073,910,67,,230,858659,10930,58616,,821615,,140,123325,121378,1629,0,5478,,,,158422,51431,,0,981984,12559,64094,,,,,0,980037,12486 +"2020-09-04","SD",170,,1,,1062,1062,89,10,,,137697,1497,,,,,,14596,,259,0,,,,,20566,11394,,0,200386,2531,,,,,152293,1756,200386,2531 +"2020-09-04","TN",1837,1785,22,52,7206,7206,1036,81,,306,,0,,,2088986,,146,160597,156398,1051,0,,,,,190049,143156,,0,2279035,18104,,,,,,0,2279035,18104 +"2020-09-04","TX",13231,,140,,,,3889,0,,1433,,0,,,,,,630829,630829,5482,0,30982,13661,,,759864,532223,,0,5649576,42210,365953,115942,,,,0,5649576,42210 +"2020-09-04","UT",419,,5,,3172,3172,144,19,794,54,622834,4109,,,789420,329,,53839,,513,0,,1101,,1031,59089,45547,,0,848509,6982,,6749,,5517,675882,4499,848509,6982 +"2020-09-04","VA",2662,2529,10,133,9798,9798,1101,57,,244,,0,,,,,128,124779,119259,1111,0,8798,1888,,,143477,,1634308,15255,1634308,15255,132675,6607,,,,0,,0 +"2020-09-04","VI",16,,1,,,,,0,,,15790,141,,,,,,1150,,6,0,,,,,,1050,,0,16940,147,,,,,16971,161,,0 +"2020-09-04","VT",58,58,0,,,,2,0,,,139154,1283,,,,,,1640,1640,10,0,,,,,,1441,,0,199349,5946,,,,,140794,1293,199349,5946 +"2020-09-04","WA",1945,1945,10,,6834,6834,399,39,,,,0,,,,,50,78315,77523,528,0,,,,,,,1518089,21736,1518089,21736,,,,,,0,,0 +"2020-09-04","WI",1161,1153,7,8,5998,5998,302,52,1043,116,1210203,10204,,,,,,84464,79354,1542,0,,,,,,70229,1807631,21487,1807631,21487,,,,,1289557,11702,,0 +"2020-09-04","WV",243,241,6,2,,,152,0,,46,,0,,,,,23,11037,10846,192,0,,,,,,8450,,0,440756,3845,16127,,,,,0,440756,3845 +"2020-09-04","WY",42,,1,,223,223,15,0,,,74312,750,,,123810,,,3989,3373,50,0,,,,,3623,3393,,0,127433,1328,,,,,77685,789,127433,1328 +"2020-09-03","AK",40,40,1,,252,252,43,5,,,,0,,,371638,,8,5475,,88,0,,,,,6022,2288,,0,377936,1052,,,,,,0,377936,1052 +"2020-09-03","AL",2233,2120,16,113,14801,14801,872,48,1511,,836689,695,,,,827,,129285,118601,1046,0,,,,,,51154,,0,955290,1076,,,54557,,955290,1076,,0 +"2020-09-03","AR",861,,20,,4386,4386,425,45,,,675337,0,,,675337,562,91,63504,63081,1392,0,,2109,,,,56889,,0,737449,0,,13631,,,,0,737449,0 +"2020-09-03","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-09-03","AZ",5130,4861,65,269,21474,21474,745,25,,241,1018906,7840,,,,,135,203953,202183,1092,0,,,,,,,,0,1811773,17572,,,269907,,1221089,8912,1811773,17572 +"2020-09-03","CA",13327,,164,,,,4571,0,,1270,,0,,,,,,717177,717177,5125,0,,,,,,,,0,11663924,83554,,,,,,0,11663924,83554 +"2020-09-03","CO",1955,1606,3,349,7104,7104,211,14,,,670728,5689,148063,,,,,58287,54367,268,0,11028,,,,,,1029791,8294,1029791,8294,159091,,,,725095,5947,,0 +"2020-09-03","CT",4468,3583,1,885,11275,11275,65,95,,,,0,,,1264436,,,53209,51076,101,0,,,,,65570,9049,,0,1332122,20037,,,,,,0,1332122,20037 +"2020-09-03","DC",609,,1,,,,76,0,,23,,0,,,,,12,14135,,58,0,,,,,,11254,298759,3962,298759,3962,,,,,182922,1622,,0 +"2020-09-03","DE",606,534,0,72,,,60,0,,12,226895,3914,,,,,,17653,16663,104,0,,,,,21016,9514,352274,1862,352274,1862,,,,,244548,4018,,0 +"2020-09-03","FL",11800,,149,,39884,39884,3438,273,,,4080683,20323,411877,403867,5642186,,,629913,620332,3487,0,34738,,34017,,820290,,6575983,57417,6575983,57417,446669,,437913,,4704959,23824,6499749,38714 +"2020-09-03","GA",5868,,73,,25259,25259,2365,234,4628,,,0,,,,,,277288,277288,2675,0,21730,,,,252857,,,0,2410665,29028,280702,,,,,0,2410665,29028 +"2020-09-03","GU",13,,0,,,,45,0,,9,37930,653,,,,,,1560,1560,66,0,2,,,,,716,,0,39490,719,158,,,,,0,39488,718 +"2020-09-03","HI",75,75,1,,552,552,276,20,,47,198440,4907,,,,,27,8991,,338,0,,,,,8947,2689,270378,7309,270378,7309,,,,,207431,5245,275704,7243 +"2020-09-03","IA",1135,,9,,,,323,0,,88,569235,4226,,47071,,,41,65523,65523,878,0,,,3091,1628,,48580,,0,634758,5104,,,50202,13081,636250,5104,,0 +"2020-09-03","ID",372,336,4,36,1435,1435,171,41,388,45,228736,2008,,,,,,32664,30227,296,0,,,,,,15585,,0,258963,2266,,,,,258963,2266,,0 +"2020-09-03","IL",8324,8115,24,209,,,1620,0,,360,,0,,,,,144,241705,240003,1360,0,,,,,,,,0,4160668,40795,,,,,,0,4160668,40795 +"2020-09-03","IN",3332,3110,7,222,11196,11196,856,53,2242,257,1006184,9338,,,,,79,96854,,1104,0,,,,,101659,,,0,1597586,23969,,,,,1103038,10442,1597586,23969 +"2020-09-03","KS",458,,0,,2361,2361,336,0,649,94,375307,0,,,,210,35,43940,,0,0,,,,,,,,0,419247,0,,,,,419247,0,,0 +"2020-09-03","KY",976,967,10,9,4684,4684,568,32,1403,132,,0,,,,,,50885,46166,894,0,,,,,,10547,,0,839705,6988,47516,15225,,,,0,839705,6988 +"2020-09-03","LA",5021,4858,17,163,,,851,0,,,1765552,11507,,,,,128,151547,150651,813,0,,,,,,134432,,0,1917099,12320,,,,,,0,1916203,12320 +"2020-09-03","MA",9077,8870,17,207,12325,12325,312,30,,61,1681766,31191,,,,,28,121546,119819,415,0,,,,,157684,105769,,0,2560869,82387,,,114108,90721,1801585,31584,2560869,82387 +"2020-09-03","MD",3778,3634,12,144,14427,14427,382,76,,112,1247593,11266,,111730,,,,110012,110012,693,0,,,10303,,131077,7039,,0,1989891,24960,,,122033,,1357605,11959,1989891,24960 +"2020-09-03","ME",133,132,0,1,424,424,9,1,,4,,0,9205,,,,1,4617,4145,50,0,482,,,,5050,3988,,0,274336,7906,9700,,,,,0,274336,7906 +"2020-09-03","MI",6791,6519,10,272,,,616,0,,158,,0,,,2734209,,75,115242,104395,774,0,,,,,147498,76151,,0,2881707,32855,261011,,,,,0,2881707,32855 +"2020-09-03","MN",1889,1837,7,52,6592,6592,272,26,1863,138,1080265,6496,,,,,,78123,78123,1038,0,,,,,,70175,1540107,14552,1540107,14552,,,,,1158388,7534,,0 +"2020-09-03","MO",1545,,3,,,,934,0,,,919468,8584,,66448,1222406,,113,88610,88610,1397,0,,,2982,,98525,,,0,1323249,12226,,,69430,,1008078,9981,1323249,12226 +"2020-09-03","MP",2,2,0,,4,4,,0,,,13484,0,,,,,,57,57,0,0,,,,,,29,,0,13541,0,,,,,13540,0,17626,0 +"2020-09-03","MS",2536,2373,10,163,5326,5326,812,0,,176,501465,4244,,,,,110,85116,80832,751,0,,,,,,67918,,0,586581,4995,27057,32271,,,,0,582297,4883 +"2020-09-03","MT",111,,2,,472,472,151,11,,,,0,,,,,,7871,,180,0,,,,,,5727,,0,255660,1787,,,,,,0,255660,1787 +"2020-09-03","NC",2803,2803,24,,,,858,0,,257,,0,,,,,,172209,172209,1656,0,,,,,,,,0,2331367,28887,,,,,,0,2331367,28887 +"2020-09-03","ND",154,,2,,583,583,51,8,156,16,193270,1440,8330,,,,,12606,12606,359,0,348,,,,,10051,470423,6312,470423,6312,8678,1,,,205204,1975,486081,6544 +"2020-09-03","NE",399,,0,,2027,2027,172,13,,,333970,2903,,,444127,,,34995,,421,0,,,,,42704,26466,,0,487819,5158,,,,,369391,3335,487819,5158 +"2020-09-03","NH",432,,0,,715,715,10,0,227,,208528,4544,,,,,,7347,,50,0,,,,,,6675,,0,337403,8287,30563,,29925,,215875,4594,337403,8287 +"2020-09-03","NJ",15970,14188,7,1782,22738,22738,504,31,,98,2737042,27370,,,,,36,196554,192973,421,0,,,,,,,,0,2933596,27791,,,,,,0,2930015,27748 +"2020-09-03","NM",791,,1,,3169,3169,75,10,,,,0,,,,,,25812,,200,0,,,,,,13283,,0,776796,5837,,,,,,0,776796,5837 +"2020-09-03","NV",1363,,27,,,,631,0,,187,535045,2609,,,,,117,70223,70223,351,0,,,,,,,856086,8911,856086,8911,,,,,604692,2952,868028,5774 +"2020-09-03","NY",25343,,7,,89995,89995,430,0,,117,,0,,,,,61,437107,,889,0,,,,,,,8517458,88981,8517458,88981,,,,,,0,,0 +"2020-09-03","OH",4226,3939,50,287,13663,13663,742,89,3003,244,,0,,,,,129,127112,120471,1345,0,,,,,138601,106095,,0,2371591,27773,,,,,,0,2371591,27773 +"2020-09-03","OK",835,,14,,5013,5013,540,52,,204,842019,8895,,,842019,,,61027,61027,909,0,3006,,,,70857,51447,,0,903046,9804,68964,,,,,0,914602,10002 +"2020-09-03","OR",468,,3,,2167,2167,139,5,,45,539307,4453,,,827512,,22,27075,,129,0,,,,,49893,5144,,0,877405,6856,,,,,565072,4579,877405,6856 +"2020-09-03","PA",7732,,20,,,,530,0,,,1565443,13358,,,,,70,136771,132874,1160,0,,,,,,110784,2355620,26327,2355620,26327,,,,,1698317,14480,,0 +"2020-09-03","PR",448,296,5,152,,,349,0,,73,305972,0,,,395291,,57,16069,16069,127,0,18129,,,,20103,,,0,322041,127,,,,,,0,415664,0 +"2020-09-03","RI",1055,,4,,2540,2540,68,-2,,7,259490,2927,,,516146,,4,22143,,65,0,,,,,31447,,547593,11454,547593,11454,,,,,281633,2992,,0 +"2020-09-03","SC",2807,2667,13,140,8006,8006,911,58,,235,847729,9200,58135,,802372,,145,121696,119822,1193,0,5313,,,,154856,51431,,0,969425,10393,63761,,,,,0,967551,10323 +"2020-09-03","SD",169,,0,,1052,1052,76,9,,,136200,1278,,,,,,14337,,334,0,,,,,20335,11155,,0,197855,2243,,,,,150537,1612,197855,2243 +"2020-09-03","TN",1815,1762,18,53,7125,7125,1056,64,,332,,0,,,2072116,,158,159546,155474,1715,0,,,,,188815,141568,,0,2260931,26633,,,,,,0,2260931,26633 +"2020-09-03","TX",13091,,221,,,,4075,0,,1433,,0,,,,,,625347,625347,3680,0,30524,13425,,,756793,527359,,0,5607366,40899,361848,112940,,,,0,5607366,40899 +"2020-09-03","UT",414,,4,,3153,3153,137,19,788,43,618725,4054,,,782868,329,,53326,,504,0,,1081,,1013,58659,44995,,0,841527,6672,,6367,,5247,671383,4484,841527,6672 +"2020-09-03","VA",2652,2519,11,133,9741,9741,1130,63,,257,,0,,,,,123,123668,118190,1126,0,8728,1849,,,142173,,1619053,13763,1619053,13763,131966,6117,,,,0,,0 +"2020-09-03","VI",15,,0,,,,,0,,,15649,306,,,,,,1144,,1,0,,,,,,1010,,0,16793,307,,,,,16810,305,,0 +"2020-09-03","VT",58,58,0,,,,3,0,,,137871,1749,,,,,,1630,1630,5,0,,,,,,1436,,0,193403,3720,,,,,139501,1754,193403,3720 +"2020-09-03","WA",1935,1935,4,,6795,6795,408,8,,,,0,,,,,65,77787,77041,549,0,,,,,,,1496353,16314,1496353,16314,,,,,,0,,0 +"2020-09-03","WI",1154,1146,4,8,5946,5946,293,30,1036,104,1199999,8451,,,,,,82922,77856,740,0,,,,,,69299,1786144,15598,1786144,15598,,,,,1277855,9178,,0 +"2020-09-03","WV",237,235,7,2,,,145,0,,44,,0,,,,,24,10845,10653,203,0,,,,,,8342,,0,436911,3556,16073,,,,,0,436911,3556 +"2020-09-03","WY",41,,0,,223,223,15,2,,,73562,663,,,122527,,,3939,3334,28,0,,,,,3578,3290,,0,126105,2225,,,,,76896,686,126105,2225 +"2020-09-02","AK",39,39,0,,247,247,46,1,,,,0,,,370557,,10,5387,,66,0,,,,,6010,2281,,0,376884,2629,,,,,,0,376884,2629 +"2020-09-02","AL",2217,2114,17,103,14753,14753,959,215,1501,,835994,4690,,,,827,,128239,118220,623,0,,,,,,51154,,0,954214,4776,,,54160,,954214,4776,,0 +"2020-09-02","AR",841,,27,,4341,4341,435,35,,,675337,5809,,,675337,556,90,62112,62112,615,0,,2050,,,,56261,,0,737449,6424,,13098,,,,0,737449,6424 +"2020-09-02","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-09-02","AZ",5065,4799,21,266,21449,21449,752,44,,248,1011066,4418,,,,,146,202861,201111,519,0,,,,,,,,0,1794201,20014,,,268579,,1212177,4921,1794201,20014 +"2020-09-02","CA",13163,,145,,,,4851,0,,1339,,0,,,,,,712052,712052,4255,0,,,,,,,,0,11580370,109674,,,,,,0,11580370,109674 +"2020-09-02","CO",1952,1604,6,348,7090,7090,247,37,,,665039,4416,147605,,,,,58019,54109,244,0,10998,,,,,,1021497,6855,1021497,6855,158603,,,,719148,4647,,0 +"2020-09-02","CT",4467,3582,1,885,11180,11180,65,0,,,,0,,,1244627,,,53108,50978,102,0,,,,,65365,8967,,0,1312085,20523,,,,,,0,1312085,20523 +"2020-09-02","DC",608,,1,,,,73,0,,22,,0,,,,,8,14077,,28,0,,,,,,11211,294797,1953,294797,1953,,,,,181300,806,,0 +"2020-09-02","DE",606,534,1,72,,,62,0,,9,222981,2093,,,,,,17549,16557,14,0,,,,,20943,9467,350412,4459,350412,4459,,,,,240530,2107,,0 +"2020-09-02","FL",11651,,130,,39611,39611,3511,300,,,4060360,15534,411877,403867,5608276,,,626426,617233,2310,0,34738,,34017,,815752,,6518566,44016,6518566,44016,446669,,437913,,4681135,17833,6461035,32053 +"2020-09-02","GA",5795,,62,,25025,25025,2469,178,4588,,,0,,,,,,274613,274613,1916,0,21440,,,,250612,,,0,2381637,13139,278683,,,,,0,2381637,13139 +"2020-09-02","GU",13,,0,,,,45,0,,8,37277,402,,,,,,1494,1486,47,0,2,,,,,653,,0,38771,449,158,,,,,0,38770,458 +"2020-09-02","HI",74,74,4,,532,532,288,24,,48,193533,3823,,,,,27,8653,,181,0,,,,,8699,2634,263069,5368,263069,5368,,,,,202186,4004,268461,5274 +"2020-09-02","IA",1126,,3,,,,310,0,,87,565009,5381,,46625,,,39,64645,64645,726,0,,,3084,1604,,48074,,0,629654,6107,,,49749,12809,631146,6088,,0 +"2020-09-02","ID",368,333,7,35,1394,1394,162,0,381,46,226728,1127,,,,,,32368,29969,280,0,,,,,,15212,,0,256697,1349,,,,,256697,1349,,0 +"2020-09-02","IL",8300,8091,27,209,,,1596,0,,347,,0,,,,,142,240345,238643,2128,0,,,,,,,,0,4119873,32751,,,,,,0,4119873,32751 +"2020-09-02","IN",3325,3106,13,219,11143,11143,887,49,2237,247,996846,7972,,,,,69,95750,,859,0,,,,,100657,,,0,1573617,22733,,,,,1092596,8831,1573617,22733 +"2020-09-02","KS",458,,12,,2361,2361,336,57,649,94,375307,4670,,,,210,35,43940,,1328,0,,,,,,,,0,419247,5998,,,,,419247,5998,,0 +"2020-09-02","KY",966,957,18,9,4652,4652,589,36,1396,138,,0,,,,,,49991,45497,806,0,,,,,,10463,,0,832717,6657,47237,14854,,,,0,832717,6657 +"2020-09-02","LA",5004,4841,20,163,,,873,0,,,1754045,13102,,,,,132,150734,149838,1151,0,,,,,,134432,,0,1904779,14253,,,,,,0,1903883,14058 +"2020-09-02","MA",9060,8853,-4,207,12295,12295,308,-91,,58,1650575,15291,,,,,29,121131,119426,-7757,0,,,,,157208,103920,,0,2478482,30141,,,113667,89417,1770001,15579,2478482,30141 +"2020-09-02","MD",3766,3623,5,143,14351,14351,370,14,,113,1236327,6273,,111730,,,,109319,109319,456,0,,,10303,,130196,7026,,0,1964931,12430,,,122033,,1345646,6729,1964931,12430 +"2020-09-02","ME",133,132,1,1,423,423,11,2,,6,,0,9153,,,,1,4567,4100,19,0,480,,,,5009,3978,,0,266430,4190,9646,,,,,0,266430,4190 +"2020-09-02","MI",6781,6509,14,272,,,629,0,,156,,0,,,2702348,,78,114468,103710,648,0,,,,,146504,76151,,0,2848852,27594,259606,,,,,0,2848852,27594 +"2020-09-02","MN",1882,1830,10,52,6566,6566,297,46,1854,135,1073769,17202,,,,,,77085,77085,730,0,,,,,,69521,1525555,26636,1525555,26636,,,,,1150854,17932,,0 +"2020-09-02","MO",1542,,4,,,,934,0,,,910884,5395,,66305,1211811,,113,87213,87213,1458,0,,,2952,,96924,,,0,1311023,5992,,,69257,,998097,6853,1311023,5992 +"2020-09-02","MP",2,2,0,,4,4,,0,,,13484,0,,,,,,57,57,0,0,,,,,,29,,0,13541,0,,,,,13540,0,17626,0 +"2020-09-02","MS",2526,2364,33,162,5326,5326,856,0,,190,497221,3288,,,,,111,84365,80193,781,0,,,,,,67918,,0,581586,4069,26774,31722,,,,0,577414,3831 +"2020-09-02","MT",109,,4,,461,461,150,14,,,,0,,,,,,7691,,182,0,,,,,,5584,,0,253873,1577,,,,,,0,253873,1577 +"2020-09-02","NC",2779,2779,38,,,,858,0,,270,,0,,,,,,170553,170553,1129,0,,,,,,,,0,2302480,15065,,,,,,0,2302480,15065 +"2020-09-02","ND",152,,3,,575,575,66,11,153,16,191830,1412,8313,,,,,12247,12247,265,0,342,,,,,9834,464111,5525,464111,5525,8655,1,,,203229,1872,479537,5788 +"2020-09-02","NE",399,,2,,2014,2014,162,8,,,331067,2279,,,439461,,,34574,,287,0,,,,,42215,26363,,0,482661,3606,,,,,366056,2439,482661,3606 +"2020-09-02","NH",432,,0,,715,715,8,0,221,,203984,0,,,,,,7297,,0,0,,,,,,6634,,0,329116,0,30385,,29761,,211281,0,329116,0 +"2020-09-02","NJ",15963,14181,11,1782,22707,22707,514,40,,99,2709672,42914,,,,,29,196133,192595,348,0,,,,,,,,0,2905805,43262,,,,,,0,2902267,44349 +"2020-09-02","NM",790,,3,,3159,3159,71,8,,,,0,,,,,,25612,,152,0,,,,,,13180,,0,770959,5560,,,,,,0,770959,5560 +"2020-09-02","NV",1336,,23,,,,675,0,,199,532436,1720,,,,,113,69872,69872,239,0,,,,,,,847175,8548,847175,8548,,,,,601740,1928,862254,3079 +"2020-09-02","NY",25336,,5,,89995,89995,445,0,,117,,0,,,,,61,436218,,708,0,,,,,,,8428477,88447,8428477,88447,,,,,,0,,0 +"2020-09-02","OH",4176,3890,11,286,13574,13574,746,95,2989,244,,0,,,,,126,125767,119157,1157,0,,,,,137422,105065,,0,2343818,22432,,,,,,0,2343818,22432 +"2020-09-02","OK",821,,12,,4961,4961,545,58,,220,833124,5611,,,833124,,,60118,60118,719,0,3006,,,,69761,50646,,0,893242,6330,68964,,,,,0,904600,6312 +"2020-09-02","OR",465,,6,,2162,2162,132,13,,49,534854,4339,,,821119,,25,26946,,233,0,,,,,49430,4938,,0,870549,10063,,,,,560493,4575,870549,10063 +"2020-09-02","PA",7712,,21,,,,550,0,,,1552085,12116,,,,,67,135611,131752,816,0,,,,,,111201,2329293,20360,2329293,20360,,,,,1683837,12907,,0 +"2020-09-02","PR",443,293,8,150,,,373,0,,71,305972,0,,,395291,,53,15942,15942,358,0,18061,,,,20103,,,0,321914,358,,,,,,0,415664,0 +"2020-09-02","RI",1051,,1,,2542,2542,78,14,,8,256563,2083,,,504777,,4,22078,,76,0,,,,,31362,,536139,5651,536139,5651,,,,,278641,2159,,0 +"2020-09-02","SC",2794,2652,37,142,7948,7948,892,78,,228,838529,3973,58135,,802372,,145,120503,118699,657,0,5313,,,,154856,51431,,0,959032,4630,63448,,,,,0,957228,4556 +"2020-09-02","SD",169,,2,,1043,1043,77,7,,,134922,1076,,,,,,14003,,254,0,,,,,20004,10959,,0,195612,1998,,,,,148925,1330,195612,1998 +"2020-09-02","TN",1797,1743,16,54,7061,7061,1082,83,,351,,0,,,2047518,,165,157831,153898,1502,0,,,,,186780,120675,,0,2234298,20349,,,,,,0,2234298,20349 +"2020-09-02","TX",12870,,189,,,,4149,0,,1476,,0,,,,,,621667,621667,4334,0,30213,13122,,,753665,522087,,0,5566467,42252,360236,109490,,,,0,5566467,42252 +"2020-09-02","UT",410,,1,,3134,3134,147,24,785,47,614671,4024,,,776646,325,,52822,,419,0,,1070,,1002,58209,44658,,0,834855,6765,,6038,,4975,666899,4447,834855,6765 +"2020-09-02","VA",2641,2508,29,133,9678,9678,1114,57,,266,,0,,,,,134,122542,117141,927,0,8656,1802,,,140932,,1605290,11922,1605290,11922,131244,5557,,,,0,,0 +"2020-09-02","VI",15,,0,,,,,0,,,15343,95,,,,,,1143,,4,0,,,,,,998,,0,16486,99,,,,,16505,108,,0 +"2020-09-02","VT",58,58,0,,,,2,0,,,136122,540,,,,,,1625,1625,2,0,,,,,,1433,,0,189683,1148,,,,,137747,542,189683,1148 +"2020-09-02","WA",1931,1931,16,,6787,6787,416,24,,,,0,,,,,48,77238,76522,596,0,,,,,,,1480039,6794,1480039,6794,,,,,,0,,0 +"2020-09-02","WI",1150,1142,11,8,5916,5916,287,38,1030,91,1191548,7831,,,,,,82182,77129,578,0,,,,,,68641,1770546,17412,1770546,17412,,,,,1268677,8376,,0 +"2020-09-02","WV",230,228,8,2,,,146,0,,48,,0,,,,,27,10642,10453,135,0,,,,,,8266,,0,433355,3130,16019,,,,,0,433355,3130 +"2020-09-02","WY",41,,0,,221,221,14,2,,,72899,198,,,120337,,,3911,3311,45,0,,,,,3543,3249,,0,123880,1683,,,,,76210,227,123880,1683 +"2020-09-01","AK",39,39,2,,246,246,41,5,,,,0,,,367949,,9,5321,,35,0,,,,,5974,2246,,0,374255,25625,,,,,,0,374255,25625 +"2020-09-01","AL",2200,2102,18,98,14538,14538,990,271,1487,,831304,-27925,,,,817,,127616,118134,1558,0,,,,,,48028,,0,949438,-26943,,,54076,,949438,-26943,,0 +"2020-09-01","AR",814,,17,,4306,4306,423,93,,,669528,3717,,,669528,554,85,61497,61497,273,0,,1894,,,,55647,,0,731025,3990,,12508,,,,0,731025,3990 +"2020-09-01","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-09-01","AZ",5044,4777,15,267,21405,21405,729,0,,253,1006648,4054,,,,,150,202342,200608,507,0,,,,,,,,0,1774187,20022,,,267953,,1207256,4558,1774187,20022 +"2020-09-01","CA",13018,,85,,,,4869,0,,1352,,0,,,,,,707797,707797,3712,0,,,,,,,,0,11470696,97391,,,,,,0,11470696,97391 +"2020-09-01","CO",1946,1598,1,348,7053,7053,236,25,,,660623,3279,147258,,,,,57775,53878,351,0,10966,,,,,,1014642,4672,1014642,4672,158224,,,,714501,3578,,0 +"2020-09-01","CT",4466,3581,1,885,11180,11180,56,0,,,,0,,,1224334,,,53006,50883,127,0,,,,,65164,8967,,0,1291562,20481,,,,,,0,1291562,20481 +"2020-09-01","DC",607,,0,,,,71,0,,22,,0,,,,,8,14049,,57,0,,,,,,11150,292844,2162,292844,2162,,,,,180494,1155,,0 +"2020-09-01","DE",605,533,0,72,,,64,0,,11,220888,1468,,,,,,17535,16537,106,0,,,,,20847,9419,345953,2885,345953,2885,,,,,238423,1574,,0 +"2020-09-01","FL",11521,,190,,39311,39311,3623,369,,,4044826,52758,411877,403867,5579764,,,624116,615240,7487,0,34738,,34017,,812402,,6474550,110290,6474550,110290,446669,,437913,,4663302,60252,6428982,99401 +"2020-09-01","GA",5733,,101,,24847,24847,2488,243,4537,,,0,,,,,,272697,272697,2226,0,21400,,,,249498,,,0,2368498,24864,278431,,,,,0,2368498,24864 +"2020-09-01","GU",13,,3,,,,43,0,,4,36875,386,,,,,,1447,1439,52,0,2,,,,,568,,0,38322,438,158,,,,,0,38312,438 +"2020-09-01","HI",70,70,7,,508,508,297,3,,57,189710,1330,,,,,42,8472,,133,0,,,,,8519,2578,257701,2002,257701,2002,,,,,198182,1463,263187,2450 +"2020-09-01","IA",1123,,7,,,,311,0,,88,559628,2084,,46304,,,43,63919,63919,591,0,,,3071,1558,,47437,,0,623547,2675,,,49415,12398,625058,2686,,0 +"2020-09-01","ID",361,327,2,34,1394,1394,162,25,379,46,225601,1455,,,,,,32088,29747,221,0,,,,,,14963,,0,255348,1646,,,,,255348,1646,,0 +"2020-09-01","IL",8273,8064,38,209,,,1513,0,,362,,0,,,,,146,238217,236515,1492,0,,,,,,,,0,4087122,22961,,,,,,0,4087122,22961 +"2020-09-01","IN",3312,3093,16,219,11094,11094,848,51,2230,239,988874,6123,,,,,74,94891,,695,0,,,,,99678,,,0,1550884,21552,,,,,1083765,6818,1550884,21552 +"2020-09-01","KS",446,,0,,2304,2304,211,0,628,55,370637,0,,,,209,21,42612,,0,0,,,,,,,,0,413249,0,,,,,413249,0,,0 +"2020-09-01","KY",948,939,15,9,4616,4616,552,36,1391,138,,0,,,,,,49185,44824,789,0,,,,,,10417,,0,826060,8924,46878,14609,,,,0,826060,8924 +"2020-09-01","LA",4984,4821,34,163,,,910,0,,,1740943,16347,,,,,128,149583,148882,689,0,,,,,,127918,,0,1890526,17036,,,,,,0,1889825,17036 +"2020-09-01","MA",9064,8831,4,232,12386,12386,320,22,,55,1635284,21300,,,,,29,128888,119138,355,0,,,,,156836,103920,,0,2448341,43915,,,112996,87251,1754422,21654,2448341,43915 +"2020-09-01","MD",3761,3617,6,144,14337,14337,385,34,,112,1230054,7450,,107996,,,,108863,108863,614,0,,,9906,,129682,6976,,0,1952501,13655,,,117902,,1338917,8064,1952501,13655 +"2020-09-01","ME",132,131,0,1,421,421,9,1,,5,,0,9089,,,,1,4548,4081,22,0,479,,,,4986,3945,,0,262240,5571,9581,,,,,0,262240,5571 +"2020-09-01","MI",6767,6495,14,272,,,629,0,,156,,0,,,2675587,,83,113820,103186,795,0,,,,,145671,76151,,0,2821258,24996,258577,,,,,0,2821258,24996 +"2020-09-01","MN",1872,1823,6,49,6520,6520,294,40,1849,136,1056567,4408,,,,,,76355,76355,491,0,,,,,,68488,1498919,9193,1498919,9193,,,,,1132922,4899,,0 +"2020-09-01","MO",1538,,8,,,,906,0,,,905489,7231,,66097,1206684,,110,85755,85755,1058,0,,,2908,,96068,,,0,1305031,10904,,,69005,,991244,8289,1305031,10904 +"2020-09-01","MP",2,2,0,,4,4,,0,,,13484,0,,,,,,57,57,1,0,,,,,,29,,0,13541,1,,,,,13540,0,17626,0 +"2020-09-01","MS",2493,2337,20,156,5326,5326,798,0,,196,493933,3018,,,,,117,83584,79650,634,0,,,,,,67918,,0,577517,3652,26337,31360,,,,0,573583,3503 +"2020-09-01","MT",105,,1,,447,447,140,11,,,,0,,,,,,7509,,88,0,,,,,,5459,,0,252296,2058,,,,,,0,252296,2058 +"2020-09-01","NC",2741,2741,39,,,,946,0,,270,,0,,,,,,169424,169424,2111,0,,,,,,,,0,2287415,18622,,,,,,0,2287415,18622 +"2020-09-01","ND",149,,2,,564,564,62,10,152,15,190418,473,8278,,,,,11982,11982,192,0,338,,,,,9610,458586,2396,458586,2396,8616,1,,,201357,901,473749,2496 +"2020-09-01","NE",397,,5,,2006,2006,161,12,,,328788,1483,,,436188,,,34287,,241,0,,,,,41883,26177,,0,479055,2782,,,,,363617,1739,479055,2782 +"2020-09-01","NH",432,,0,,715,715,8,1,221,,203984,343,,,,,,7297,,22,0,,,,,,6634,,0,329116,1021,30385,,29761,,211281,365,329116,1021 +"2020-09-01","NJ",15952,14170,5,1782,22667,22667,463,40,,84,2666758,800,,,,,33,195785,192290,380,0,,,,,,,,0,2862543,1180,,,,,,0,2857918,0 +"2020-09-01","NM",787,,8,,3151,3151,72,17,,,,0,,,,,,25460,,108,0,,,,,,13073,,0,765399,4525,,,,,,0,765399,4525 +"2020-09-01","NV",1313,,8,,,,643,0,,193,530716,2023,,,,,119,69633,69633,405,0,,,,,,,838627,7765,838627,7765,,,,,599812,2304,859175,4390 +"2020-09-01","NY",25331,,3,,89995,89995,432,0,,109,,0,,,,,54,435510,,754,0,,,,,,,8340030,76997,8340030,76997,,,,,,0,,0 +"2020-09-01","OH",4165,3879,27,286,13479,13479,777,103,2975,241,,0,,,,,127,124610,118048,1453,0,,,,,136566,104024,,0,2321386,22284,,,,,,0,2321386,22284 +"2020-09-01","OK",809,,9,,4903,4903,535,82,,207,827513,20968,,,827513,,,59399,59399,666,0,3006,,,,69077,49989,,0,886912,21634,68964,,,,,0,898288,23612 +"2020-09-01","OR",459,,1,,2149,2149,136,41,,43,530515,3724,,,811940,,24,26713,,159,0,,,,,48546,4884,,0,860486,6095,,,,,555918,13329,860486,6095 +"2020-09-01","PA",7691,,18,,,,528,0,,,1539969,15774,,,,,73,134795,130961,770,0,,,,,,109183,2308933,28924,2308933,28924,,,,,1670930,16524,,0 +"2020-09-01","PR",435,288,1,147,,,392,0,,71,305972,0,,,395291,,51,15584,15584,108,0,17837,,,,20103,,,0,321556,108,,,,,,0,415664,0 +"2020-09-01","RI",1050,,2,,2528,2528,81,9,,8,254480,2532,,,499207,,5,22002,,53,0,,,,,31281,,530488,6074,530488,6074,,,,,276482,2585,,0 +"2020-09-01","SC",2757,2626,37,131,7870,7870,894,59,,232,834556,4000,58050,,798764,,141,119846,118116,854,0,5281,,,,153908,51431,,0,954402,4854,63331,,,,,0,952672,4783 +"2020-09-01","SD",167,,0,,1036,1036,78,7,,,133846,826,,,,,,13749,,240,0,,,,,19745,10832,,0,193614,1482,,,,,147595,1066,193614,1482 +"2020-09-01","TN",1781,1729,27,52,6978,6978,1037,100,,348,,0,,,2028999,,164,156329,152527,1396,0,,,,,184950,118885,,0,2213949,16633,,,,,,0,2213949,16633 +"2020-09-01","TX",12681,,145,,,,4144,0,,1525,,0,,,,,,617333,617333,4364,0,30159,12805,,,750396,514861,,0,5524215,45845,359593,105095,,,,0,5524215,45845 +"2020-09-01","UT",409,,2,,3110,3110,145,17,780,44,610647,3457,,,770355,322,,52403,,296,0,,1046,,981,57735,44338,,0,828090,5063,,5706,,4710,662452,3825,828090,5063 +"2020-09-01","VA",2612,2479,32,133,9621,9621,1039,52,,258,,0,,,,,130,121615,116294,1021,0,8624,1727,,,140228,,1593368,12077,1593368,12077,130895,4971,,,,0,,0 +"2020-09-01","VI",15,,1,,,,,0,,,15248,148,,,,,,1139,,5,0,,,,,,950,,0,16387,153,,,,,16397,147,,0 +"2020-09-01","VT",58,58,0,,,,6,0,,,135582,3043,,,,,,1623,1623,6,0,,,,,,1432,,0,188535,4255,,,,,137205,3049,188535,4255 +"2020-09-01","WA",1915,1915,10,,6763,6763,392,23,,,,0,,,,,49,76642,75966,162,0,,,,,,,1473245,11891,1473245,11891,,,,,,0,,0 +"2020-09-01","WI",1139,1130,9,9,5878,5878,295,61,1026,100,1183717,10863,,,,,,81604,76584,1036,0,,,,,,67902,1753134,13321,1753134,13321,,,,,1260301,11844,,0 +"2020-09-01","WV",222,220,8,2,,,141,0,,49,,0,,,,,25,10507,10321,257,0,,,,,,8163,,0,430225,2431,15986,,,,,0,430225,2431 +"2020-09-01","WY",41,,4,,219,219,13,4,,,72701,270,,,118697,,,3866,3282,24,0,,,,,3500,3206,,0,122197,1500,,,,,75983,288,122197,1500 +"2020-08-31","AK",37,37,0,,241,241,39,0,,,,0,,,342703,,8,5286,,36,0,,,,,5598,2238,,0,348630,1791,,,,,,0,348630,1791 +"2020-08-31","AL",2182,2083,20,99,14267,14267,1004,0,1474,,859229,3402,,,,807,,126058,117152,823,0,,,,,,48028,,0,976381,4098,,,,,976381,4098,,0 +"2020-08-31","AR",797,,13,,4213,4213,420,31,,,665811,13980,,,665811,542,87,61224,61224,368,0,,1894,,,,54961,,0,727035,14348,,12508,,,,0,727035,14348 +"2020-08-31","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-31","AZ",5029,4762,-1,267,21405,21405,768,-16,,256,1002594,4814,,,,,152,201835,200104,174,0,,,,,,,,0,1754165,4377,,,267557,,1202698,4970,1754165,4377 +"2020-08-31","CA",12933,,28,,,,4829,0,,1346,,0,,,,,,704085,704085,4176,0,,,,,,,,0,11373305,141476,,,,,,0,11373305,141476 +"2020-08-31","CO",1945,1597,1,348,7028,7028,241,18,,,657344,4671,146905,,,,,57424,53579,201,0,10932,,,,,,1009970,7168,1009970,7168,157837,,,,710923,4856,,0 +"2020-08-31","CT",4465,3580,0,885,11180,11180,52,0,,,,0,,,1204088,,,52879,50753,384,0,,,,,64953,8967,,0,1271081,8399,,,,,,0,1271081,8399 +"2020-08-31","DC",607,,1,,,,70,0,,21,,0,,,,,8,13992,,33,0,,,,,,11105,290682,2593,290682,2593,,,,,179339,1256,,0 +"2020-08-31","DE",605,533,1,72,,,58,0,,16,219420,2102,,,,,,17429,16431,86,0,,,,,20772,9381,343068,2285,343068,2285,,,,,236849,2188,,0 +"2020-08-31","FL",11331,,68,,38942,38942,3736,85,,,3992068,14046,411877,403867,5492615,,,616629,608109,1876,0,34738,,34017,,800773,,6364260,33553,6364260,33553,446669,,437913,,4603050,15974,6329581,25940 +"2020-08-31","GA",5632,,28,,24604,24604,2463,32,4493,,,0,,,,,,270471,270471,1498,0,21369,,,,247592,,,0,2343634,16144,278200,,,,,0,2343634,16144 +"2020-08-31","GU",10,,0,,,,38,0,,5,36489,376,,,,,,1395,1387,48,0,2,,,,,533,,0,37884,424,158,,,,,0,37874,958 +"2020-08-31","HI",63,63,1,,505,505,272,8,,57,188380,2584,,,,,42,8339,,200,0,,,,,8392,2520,255699,4322,255699,4322,,,,,196719,2784,260737,4087 +"2020-08-31","IA",1116,,3,,,,299,0,,85,557544,3169,,46099,,,46,63328,63328,608,0,,,3052,1500,,46740,,0,620872,3777,,,49191,11957,622372,3775,,0 +"2020-08-31","ID",359,325,1,34,1369,1369,181,4,375,52,224146,1498,,,,,,31867,29556,190,0,,,,,,14712,,0,253702,1680,,,,,253702,1680,,0 +"2020-08-31","IL",8235,8026,7,209,,,1492,0,,347,,0,,,,,157,236725,235023,1668,0,,,,,,,,0,4064161,47379,,,,,,0,4064161,47379 +"2020-08-31","IN",3296,3077,5,219,11043,11043,881,200,2217,222,982751,10708,,,,,79,94196,,883,0,,,,,98364,,,0,1529332,4601,,,,,1076947,11591,1529332,4601 +"2020-08-31","KS",446,,3,,2304,2304,211,26,628,55,370637,8538,,,,209,21,42612,,1564,0,,,,,,,,0,413249,10102,,,,,413249,10102,,0 +"2020-08-31","KY",933,924,3,9,4580,4580,557,20,1385,144,,0,,,,,,48396,44212,364,0,,,,,,10375,,0,817136,5547,46866,13441,,,,0,817136,5547 +"2020-08-31","LA",4950,4787,19,163,,,881,0,,,1724596,3713,,,,,132,148894,148193,326,0,,,,,,127918,,0,1873490,4039,,,,,,0,1872789,4039 +"2020-08-31","MA",9060,8827,11,232,12364,12364,314,3,,56,1613984,18439,,,,,22,128533,118784,304,0,,,,,156404,103920,,0,2404426,31862,,,112727,86838,1732768,18740,2404426,31862 +"2020-08-31","MD",3755,3612,3,143,14303,14303,377,48,,107,1222604,11157,,107996,,,,108249,108249,458,0,,,9906,,129045,6124,,0,1938846,19331,,,117902,,1330853,11615,1938846,19331 +"2020-08-31","ME",132,131,0,1,420,420,6,0,,4,,0,9056,,,,1,4526,4060,14,0,479,,,,4965,3923,,0,256669,3199,9548,,,,,0,256669,3199 +"2020-08-31","MI",6753,6480,5,273,,,629,0,,156,,0,,,2651406,,90,113025,102468,499,0,,,,,144856,76151,,0,2796262,19765,257840,,,,,0,2796262,19765 +"2020-08-31","MN",1866,1817,1,49,6480,6480,306,26,1839,131,1052159,5277,,,,,,75864,75864,675,0,,,,,,67656,1489726,11294,1489726,11294,,,,,1128023,5952,,0 +"2020-08-31","MO",1530,,22,,,,906,0,,,898258,7676,,66025,1196755,,110,84697,84697,1042,0,,,2899,,95127,,,0,1294127,11071,,,68924,,982955,8718,1294127,11071 +"2020-08-31","MP",2,2,0,,4,4,,0,,,13484,0,,,,,,56,56,0,0,,,,,,29,,0,13540,0,,,,,13540,0,17626,0 +"2020-08-31","MS",2473,2319,32,154,5326,5326,802,26,,207,490915,4427,,,,,121,82950,79165,274,0,,,,,,67918,,0,573865,4701,25554,31261,,,,0,570080,5147 +"2020-08-31","MT",104,,0,,436,436,134,4,,,,0,,,,,,7421,,81,0,,,,,,5330,,0,250238,3577,,,,,,0,250238,3577 +"2020-08-31","NC",2702,2702,10,,,,923,0,,244,,0,,,,,,167313,167313,1186,0,,,,,,,,0,2268793,25044,,,,,,0,2268793,25044 +"2020-08-31","ND",147,,2,,554,554,68,0,149,17,189945,1682,8245,,,,,11790,11790,114,0,335,,,,,9295,456190,1781,456190,1781,8580,,,,200456,734,471253,1920 +"2020-08-31","NE",392,,0,,1994,1994,172,2,,,327305,3113,,,433700,,,34046,,293,0,,,,,41592,25969,,0,476273,4775,,,,,361878,3410,476273,4775 +"2020-08-31","NH",432,,0,,714,714,6,0,220,,203641,1600,,,,,,7275,,21,0,,,,,,6615,,0,328095,2520,30373,,29752,,210916,1621,328095,2520 +"2020-08-31","NJ",15947,14165,8,1782,22627,22627,484,0,,103,2665958,21235,,,,,36,195405,191960,372,0,,,,,,,,0,2861363,21607,,,,,,0,2857918,21584 +"2020-08-31","NM",779,,9,,3134,3134,65,8,,,,0,,,,,,25352,,69,0,,,,,,12960,,0,760874,3941,,,,,,0,760874,3941 +"2020-08-31","NV",1305,,3,,,,664,0,,196,528693,1916,,,,,106,69228,69228,320,0,,,,,,,830862,1510,830862,1510,,,,,597508,2235,854785,4250 +"2020-08-31","NY",25328,,1,,89995,89995,418,0,,109,,0,,,,,51,434756,,656,0,,,,,,,8263033,66241,8263033,66241,,,,,,0,,0 +"2020-08-31","OH",4138,3854,10,284,13376,13376,774,59,2961,244,,0,,,,,140,123157,116666,895,0,,,,,135602,102631,,0,2299102,30957,,,,,,0,2299102,30957 +"2020-08-31","OK",800,,1,,4821,4821,570,7,,214,806545,0,,,806545,,,58733,58733,713,0,3006,,,,66512,49184,,0,865278,713,68964,,,,,0,874676,0 +"2020-08-31","OR",458,,4,,2108,2108,166,0,,47,526791,4234,,,806187,,22,26554,,261,0,,,,,48204,4884,,0,854391,6757,,,,,542589,0,854391,6757 +"2020-08-31","PA",7673,,0,,,,505,0,,,1524195,8296,,,,,78,134025,130211,521,0,,,,,,109900,2280009,16201,2280009,16201,,,,,1654406,8804,,0 +"2020-08-31","PR",434,287,0,147,,,383,0,,65,305972,0,,,395291,,50,15476,15476,247,0,17723,,,,20103,,,0,321448,247,,,,,,0,415664,0 +"2020-08-31","RI",1048,,1,,2519,2519,77,0,,9,251948,1835,,,493216,,5,21949,,46,0,,,,,31198,,524414,3936,524414,3936,,,,,273897,1881,,0 +"2020-08-31","SC",2720,2588,11,132,7811,7811,934,29,,247,830556,6007,57989,,795153,,136,118992,117333,668,0,5267,,,,152736,51431,,0,949548,6675,63256,,,,,0,947889,6643 +"2020-08-31","SD",167,,0,,1029,1029,76,12,,,133020,691,,,,,,13509,,187,0,,,,,19533,10612,,0,192132,1760,,,,,146529,878,192132,1760 +"2020-08-31","TN",1754,1704,7,50,6878,6878,910,38,,313,,0,,,2014005,,155,154933,151250,1818,0,,,,,183311,116864,,0,2197316,11952,,,,,,0,2197316,11952 +"2020-08-31","TX",12536,,26,,,,4203,0,,1525,,0,,,,,,612969,612969,2615,0,30025,12533,,,746464,507499,,0,5478370,12815,358718,101788,,,,0,5478370,12815 +"2020-08-31","UT",407,,0,,3093,3093,143,13,776,45,607190,2448,,,765693,319,,52107,,253,0,,1008,,943,57334,43990,,0,823027,3997,,5334,,4405,658627,2673,823027,3997 +"2020-08-31","VA",2580,2447,11,133,9569,9569,1082,14,,257,,0,,,,,146,120594,115334,847,0,8610,1666,,,139056,,1581291,13097,1581291,13097,130763,4588,,,,0,,0 +"2020-08-31","VI",14,,0,,,,,0,,,15100,123,,,,,,1134,,5,0,,,,,,898,,0,16234,128,,,,,16250,128,,0 +"2020-08-31","VT",58,58,0,,,,8,0,,,132539,2461,,,,,,1617,1617,5,0,,,,,,1425,,0,184280,3212,,,,,134156,2466,184280,3212 +"2020-08-31","WA",1905,1905,0,,6740,6740,411,0,,,,0,,,,,51,76480,75809,325,0,,,,,,,1461354,0,1461354,0,,,,,,0,,0 +"2020-08-31","WI",1130,1122,0,8,5817,5817,290,13,1020,96,1172854,3552,,,,,,80568,75603,268,0,,,,,,67234,1739813,11302,1739813,11302,,,,,1248457,3818,,0 +"2020-08-31","WV",214,212,1,2,,,139,0,,49,,0,,,,,23,10250,10066,140,0,,,,,,8017,,0,427794,4875,15982,,,,,0,427794,4875 +"2020-08-31","WY",37,,0,,215,215,16,0,,,72431,958,,,117217,,,3842,3264,22,0,,,,,3480,3181,,0,120697,1703,,,,,75695,1026,120697,1703 +"2020-08-30","AK",37,37,0,,241,241,41,1,,,,0,,,340942,,8,5250,,43,0,,,,,5568,2233,,0,346839,1144,,,,,,0,346839,1144 +"2020-08-30","AL",2162,2067,10,95,14267,14267,969,0,1467,,855827,3898,,,,804,,125235,116456,1346,0,,,,,,48028,,0,972283,5070,,,,,972283,5070,,0 +"2020-08-30","AR",784,,12,,4182,4182,391,40,,,651831,5239,,,651831,541,84,60856,60856,478,0,,1085,,,,54408,,0,712687,5717,,7090,,,,0,712687,5717 +"2020-08-30","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-30","AZ",5030,4762,23,268,21421,21421,757,-12,,263,997780,6691,,,,,161,201661,199948,374,0,,,,,,,,0,1749788,6351,,,266656,,1197728,7060,1749788,6351 +"2020-08-30","CA",12905,,71,,,,4943,0,,1396,,0,,,,,,699909,699909,6070,0,,,,,,,,0,11231829,122199,,,,,,0,11231829,122199 +"2020-08-30","CO",1944,1596,0,348,7010,7010,240,17,,,652673,4505,146590,,,,,57223,53394,182,0,10910,,,,,,1002802,7851,1002802,7851,157500,,,,706067,4690,,0 +"2020-08-30","CT",4465,3579,0,886,11180,11180,60,0,,,,0,,,1195754,,,52495,50387,0,0,,,,,64890,8967,,0,1262682,8204,,,,,,0,1262682,8204 +"2020-08-30","DC",606,,1,,,,69,0,,24,,0,,,,,10,13959,,34,0,,,,,,11087,288089,2333,288089,2333,,,,,178083,974,,0 +"2020-08-30","DE",604,533,0,71,,,55,0,,16,217318,1783,,,,,,17343,16346,-6,0,,,,,20691,9318,340783,4223,340783,4223,,,,,234661,1777,,0 +"2020-08-30","FL",11263,,14,,38857,38857,3793,96,,,3978022,21814,411877,403867,5469322,,,614753,606336,2547,0,34738,,34017,,798352,,6330707,51890,6330707,51890,446669,,437913,,4587076,24396,6303641,41324 +"2020-08-30","GA",5604,,28,,24572,24572,2489,39,4489,,,0,,,,,,268973,268973,1215,0,21177,,,,245837,,,0,2327490,15311,276958,,,,,0,2327490,15311 +"2020-08-30","GU",10,,0,,,,36,0,,4,36113,0,,,,,,1347,1339,0,0,2,,,,,488,,0,37460,0,158,,,,,0,36916,0 +"2020-08-30","HI",62,62,3,,497,497,272,12,,57,185796,2716,,,,,42,8139,,309,0,,,,,8197,2477,251377,5310,251377,5310,,,,,193935,3025,256650,4940 +"2020-08-30","IA",1113,,5,,,,308,0,,88,554375,3545,,46073,,,42,62720,62720,971,0,,,3044,1488,,46555,,0,617095,4516,,,49157,11962,618597,4503,,0 +"2020-08-30","ID",358,324,5,34,1365,1365,181,16,374,52,222648,2982,,,,,,31677,29374,293,0,,,,,,14490,,0,252022,3268,,,,,252022,3268,,0 +"2020-08-30","IL",8228,8019,11,209,,,1472,0,,328,,0,,,,,155,235057,233355,1992,0,,,,,,,,0,4016782,43693,,,,,,0,4016782,43693 +"2020-08-30","IN",3291,3072,6,219,10843,10843,883,4,2163,267,972043,8684,,,,,79,93313,,879,0,,,,,98104,,,0,1524731,7068,,,,,1065356,9563,1524731,7068 +"2020-08-30","KS",443,,0,,2278,2278,328,0,616,96,362099,0,,,,206,31,41048,,0,0,,,,,,,,0,403147,0,,,,,403147,0,,0 +"2020-08-30","KY",930,921,9,9,4560,4560,570,0,1379,149,,0,,,,,,48032,43901,455,0,,,,,,10328,,0,811589,0,46781,13441,,,,0,811589,0 +"2020-08-30","LA",4931,4768,27,163,,,902,0,,,1720883,38648,,,,,143,148568,147867,1624,0,,,,,,127918,,0,1869451,40272,,,,,,0,1868750,40272 +"2020-08-30","MA",9049,8816,13,232,12361,12361,290,3,,62,1595545,16420,,,,,25,128229,118483,199,0,,,,,156076,103920,,0,2372564,32895,,,112603,86612,1714028,16594,2372564,32895 +"2020-08-30","MD",3752,3609,6,143,14255,14255,358,38,,107,1211447,14258,,107996,,,,107791,107791,497,0,,,9906,,128493,6124,,0,1919515,25105,,,117902,,1319238,14755,1919515,25105 +"2020-08-30","ME",132,131,0,1,420,420,7,2,,4,,0,9045,,,,1,4512,4047,23,0,479,,,,4953,3910,,0,253470,4211,9537,,,,,0,253470,4211 +"2020-08-30","MI",6748,6473,36,275,,,669,0,,184,,0,,,2632268,,93,112526,102017,1390,0,,,,,144229,76151,,0,2776497,27091,257397,,,,,0,2776497,27091 +"2020-08-30","MN",1865,1816,2,49,6454,6454,315,43,1834,136,1046882,10002,,,,,,75189,75189,932,0,,,,,,66916,1478432,18051,1478432,18051,,,,,1122071,10934,,0 +"2020-08-30","MO",1508,,12,,,,1004,0,,,890582,7446,,65935,1186910,,111,83655,83655,1465,0,,,2884,,93879,,,0,1283056,11197,,,68819,,974237,8911,1283056,11197 +"2020-08-30","MP",2,2,0,,4,4,,0,,,13484,-2,,,,,,56,56,0,0,,,,,,29,,0,13540,-2,,,,,13540,0,17626,0 +"2020-08-30","MS",2441,2294,14,147,5300,5300,819,0,,215,486488,0,,,,,111,82676,78904,647,0,,,,,,62707,,0,569164,647,25255,30859,,,,0,564933,0 +"2020-08-30","MT",104,,0,,432,432,131,3,,,,0,,,,,,7340,,89,0,,,,,,5283,,0,246661,1280,,,,,,0,246661,1280 +"2020-08-30","NC",2692,2692,9,,,,917,0,,260,,0,,,,,,166127,166127,1051,0,,,,,,,,0,2243749,30979,,,,,,0,2243749,30979 +"2020-08-30","ND",145,,0,,554,554,68,3,147,17,188263,0,8231,,,,,11676,11676,221,0,334,,,,,9079,454409,3551,454409,3551,8565,,,,199722,1401,469333,3660 +"2020-08-30","NE",392,,0,,1992,1992,172,10,,,324192,2410,,,429254,,,33753,,317,0,,,,,41264,25727,,0,471498,4242,,,,,358468,2737,471498,4242 +"2020-08-30","NH",432,,0,,714,714,6,0,220,,202041,1947,,,,,,7254,,8,0,,,,,,6600,,0,325575,3711,30318,,29702,,209295,1955,325575,3711 +"2020-08-30","NJ",15939,14157,4,1782,22627,22627,480,10,,95,2644723,28296,,,,,28,195033,191611,314,0,,,,,,,,0,2839756,28610,,,,,,0,2836334,28587 +"2020-08-30","NM",770,,1,,3126,3126,66,10,,,,0,,,,,,25283,,105,0,,,,,,12913,,0,756933,4411,,,,,,0,756933,4411 +"2020-08-30","NV",1302,,0,,,,675,0,,182,526777,2717,,,,,102,68908,68908,447,0,,,,,,,829352,3502,829352,3502,,,,,595273,3158,850535,6144 +"2020-08-30","NY",25327,,8,,89995,89995,429,0,,112,,0,,,,,47,434100,,698,0,,,,,,,8196792,100022,8196792,100022,,,,,,0,,0 +"2020-08-30","OH",4128,3844,2,284,13317,13317,769,29,2954,254,,0,,,,,135,122262,115806,922,0,,,,,134494,101944,,0,2268145,30840,,,,,,0,2268145,30840 +"2020-08-30","OK",799,,2,,4814,4814,570,20,,214,806545,0,,,806545,,,58020,58020,667,0,3006,,,,66512,48933,,0,864565,667,68964,,,,,0,874676,0 +"2020-08-30","OR",454,,7,,2108,2108,166,0,,47,522557,4744,,,799829,,22,26293,,239,0,,,,,47805,4884,,0,847634,8844,,,,,542589,0,847634,8844 +"2020-08-30","PA",7673,,2,,,,499,0,,,1515899,11791,,,,,72,133504,129703,670,0,,,,,,109473,2263808,22496,2263808,22496,,,,,1645602,12438,,0 +"2020-08-30","PR",434,287,6,147,,,365,0,,63,305972,0,,,395291,,46,15229,15229,243,0,17619,,,,20103,,,0,321201,243,,,,,,0,415664,0 +"2020-08-30","RI",1047,,0,,2519,2519,77,5,,9,250113,1759,,,489343,,5,21903,,46,0,,,,,31135,,520478,5336,520478,5336,,,,,272016,1805,,0 +"2020-08-30","SC",2709,2574,11,135,7782,7782,956,17,,250,824549,6175,57790,,789377,,143,118324,116697,1075,0,5227,,,,151869,51431,,0,942873,7250,63017,,,,,0,941246,7211 +"2020-08-30","SD",167,,0,,1017,1017,78,11,,,132329,765,,,,,,13322,,380,0,,,,,19314,10511,,0,190372,2323,,,,,145651,1145,190372,2323 +"2020-08-30","TN",1747,1698,22,49,6840,6840,889,89,,306,,0,,,2003929,,155,153115,149469,835,0,,,,,181435,114769,,0,2185364,11958,,,,,,0,2185364,11958 +"2020-08-30","TX",12510,,90,,,,4172,0,,1566,,0,,,,,,610354,610354,3824,0,29723,12438,,,745270,499518,,0,5465555,20343,356857,100665,,,,0,5465555,20343 +"2020-08-30","UT",407,,0,,3080,3080,134,23,776,45,604742,3729,,,761938,319,,51854,,448,0,,997,,932,57092,43724,,0,819030,6135,,5239,,4326,655954,4045,819030,6135 +"2020-08-30","VA",2569,2436,1,133,9555,9555,1090,43,,251,,0,,,,,132,119747,114514,938,0,8566,1623,,,137012,,1568194,12707,1568194,12707,130370,4382,,,,0,,0 +"2020-08-30","VI",14,,0,,,,,0,,,14977,263,,,,,,1129,,11,0,,,,,,893,,0,16106,274,,,,,16122,204,,0 +"2020-08-30","VT",58,58,0,,,,13,0,,,130078,3015,,,,,,1612,1612,11,0,,,,,,1421,,0,181068,4134,,,,,131690,3026,181068,4134 +"2020-08-30","WA",1905,1905,0,,6740,6740,415,61,,,,0,,,,,51,76155,75490,499,0,,,,,,,1461354,37583,1461354,37583,,,,,,0,,0 +"2020-08-30","WI",1130,1122,3,8,5804,5804,287,29,1020,104,1169302,4562,,,,,,80300,75337,570,0,,,,,,66699,1728511,13218,1728511,13218,,,,,1244639,5099,,0 +"2020-08-30","WV",213,211,1,2,,,141,0,,45,,0,,,,,21,10110,9928,143,0,,,,,,7983,,0,422919,4836,15943,,,,,0,422919,4836 +"2020-08-30","WY",37,,0,,215,215,15,0,,,71473,0,,,115554,,,3820,3245,36,0,,,,,3440,3136,,0,118994,240,,,,,74669,0,118994,240 +"2020-08-29","AK",37,37,0,,240,240,43,1,,,,0,,,339808,,7,5207,,93,0,,,,,5558,2201,,0,345695,6157,,,,,,0,345695,6157 +"2020-08-29","AL",2152,2059,45,93,14267,14267,986,0,1459,,851929,9251,,,,801,,123889,115284,1704,0,,,,,,48028,,0,967213,10812,,,,,967213,10812,,0 +"2020-08-29","AR",772,,16,,4142,4142,407,0,,,646592,8120,,,646592,538,95,60378,60378,795,0,,1085,,,,54133,,0,706970,8915,,7090,,,,0,706970,8915 +"2020-08-29","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-29","AZ",5007,4738,29,269,21433,21433,812,5,,262,991089,7670,,,,,164,201287,199579,629,0,,,,,,,,0,1743437,14000,,,265542,,1190668,8271,1743437,14000 +"2020-08-29","CA",12834,,144,,,,5063,0,,1411,,0,,,,,,693839,693839,4981,0,,,,,,,,0,11109630,98993,,,,,,0,11109630,98993 +"2020-08-29","CO",1944,1596,7,348,6993,6993,239,48,,,648168,5557,146238,,,,,57041,53209,268,0,10882,,,,,,994951,9329,994951,9329,157120,,,,701377,5808,,0 +"2020-08-29","CT",4465,3579,0,886,11180,11180,60,0,,,,0,,,1187662,,,52495,50387,0,0,,,,,64781,8967,,0,1254478,18161,,,,,,0,1254478,18161 +"2020-08-29","DC",605,,0,,,,76,0,,25,,0,,,,,13,13925,,74,0,,,,,,11046,285756,4207,285756,4207,,,,,177109,2003,,0 +"2020-08-29","DE",604,533,0,71,,,61,0,,14,215535,1577,,,,,,17349,16336,266,0,,,,,20620,9271,336560,4719,336560,4719,,,,,232884,1843,,0 +"2020-08-29","FL",11249,,150,,38761,38761,3799,287,,,3956208,24337,411877,403867,5431783,,,612206,603892,3132,0,34738,,34017,,794867,,6278817,62926,6278817,62926,446669,,437913,,4562680,27496,6262317,46313 +"2020-08-29","GA",5576,,105,,24533,24533,2582,198,4479,,,0,,,,,,267758,267758,2386,0,20980,,,,244513,,,0,2312179,25195,275453,,,,,0,2312179,25195 +"2020-08-29","GU",10,,0,,,,36,0,,4,36113,474,,,,,,1347,1339,60,0,2,,,,,488,,0,37460,534,158,,,,,0,36916,0 +"2020-08-29","HI",59,59,4,,485,485,279,23,,55,183080,2493,,,,,38,7830,,264,0,,,,,7877,2410,246067,4582,246067,4582,,,,,190910,2757,251710,4693 +"2020-08-29","IA",1108,,13,,,,315,0,,91,550830,4642,,45743,,,43,61749,61749,778,0,,,3034,1450,,46409,,0,612579,5420,,,48817,11775,614094,5419,,0 +"2020-08-29","ID",353,319,10,34,1349,1349,181,21,369,52,219666,1601,,,,,,31384,29088,262,0,,,,,,14175,,0,248754,1848,,,,,248754,1848,,0 +"2020-08-29","IL",8217,8008,11,209,,,1563,0,,349,,0,,,,,134,233065,231363,1880,0,,,,,,,,0,3973089,48784,,,,,,0,3973089,48784 +"2020-08-29","IN",3285,3066,8,219,10839,10839,880,21,2167,278,963359,10623,,,,,72,92434,,1121,0,,,,,97687,,,0,1517663,20667,,,,,1055793,11744,1517663,20667 +"2020-08-29","KS",443,,0,,2278,2278,328,0,616,96,362099,0,,,,206,31,41048,,0,0,,,,,,,,0,403147,0,,,,,403147,0,,0 +"2020-08-29","KY",921,913,3,8,4560,4560,570,28,1379,149,,0,,,,,,47577,43507,820,0,,,,,,10328,,0,811589,10885,46781,13441,,,,0,811589,10885 +"2020-08-29","LA",4904,4741,0,163,,,900,0,,,1682235,0,,,,,141,146944,146243,0,0,,,,,,127918,,0,1829179,0,,,,,,0,1828478,0 +"2020-08-29","MA",9036,8803,13,232,12358,12358,305,24,,62,1579125,23461,,,,,26,128030,118309,446,0,,,,,155842,103920,,0,2339669,48917,,,112464,85450,1697434,23882,2339669,48917 +"2020-08-29","MD",3746,3603,10,143,14217,14217,387,33,,106,1197189,12583,,107996,,,,107294,107294,630,0,,,9906,,127872,6124,,0,1894410,25483,,,117902,,1304483,13213,1894410,25483 +"2020-08-29","ME",132,131,0,1,418,418,8,1,,2,,0,9016,,,,1,4489,4032,53,0,478,,,,4934,3899,,0,249259,4067,9507,,,,,0,249259,4067 +"2020-08-29","MI",6712,6446,0,266,,,669,0,,184,,0,,,2572738,,93,111136,100699,0,0,,,,,142390,76151,,0,2749406,34278,256585,,,,,0,2749406,34278 +"2020-08-29","MN",1863,1814,4,49,6411,6411,313,54,1822,134,1036880,8410,,,,,,74257,74257,1017,0,,,,,,66107,1460381,17037,1460381,17037,,,,,1111137,9427,,0 +"2020-08-29","MO",1496,,32,,,,976,0,,,883136,9495,,65674,1177080,,113,82190,82190,1198,0,,,2851,,92544,,,0,1271859,13274,,,68525,,965326,10693,1271859,13274 +"2020-08-29","MP",2,2,0,,4,4,,0,,,13486,0,,,,,,56,56,2,0,,,,,,29,,0,13542,2,,,,,13540,0,17626,0 +"2020-08-29","MS",2427,2281,14,146,5300,5300,819,21,,215,486488,4900,,,,,111,82029,78445,735,0,,,,,,62707,,0,568517,5635,25255,30859,,,,0,564933,5523 +"2020-08-29","MT",104,,4,,429,429,128,12,,,,0,,,,,,7251,,188,0,,,,,,5278,,0,245381,2506,,,,,,0,245381,2506 +"2020-08-29","NC",2683,2683,31,,,,965,0,,264,,0,,,,,,165076,165076,2585,0,,,,,,,,0,2212770,34871,,,,,,0,2212770,34871 +"2020-08-29","ND",145,,2,,551,551,65,1,147,17,188263,1377,8231,,,,,11455,11455,372,0,334,,,,,9018,450858,7678,450858,7678,8565,,,,198321,1932,465673,7901 +"2020-08-29","NE",392,,1,,1982,1982,168,14,,,321782,2464,,,425399,,,33436,,335,0,,,,,40879,25282,,0,467256,4332,,,,,355731,2809,467256,4332 +"2020-08-29","NH",432,,0,,714,714,7,1,220,,200094,1153,,,,,,7246,,30,0,,,,,,6571,,0,321864,2793,30253,,29641,,207340,1183,321864,2793 +"2020-08-29","NJ",15935,14153,3,1782,22617,22617,437,31,,88,2616427,58204,,,,,26,194719,191320,393,0,,,,,,,,0,2811146,58597,,,,,,0,2807747,58911 +"2020-08-29","NM",769,,2,,3116,3116,67,10,,,,0,,,,,,25178,,136,0,,,,,,12820,,0,752522,5245,,,,,,0,752522,5245 +"2020-08-29","NV",1302,,15,,,,675,0,,182,524060,3361,,,,,102,68461,68461,609,0,,,,,,,825850,5691,825850,5691,,,,,592115,3814,844391,7334 +"2020-08-29","NY",25319,,7,,89995,89995,458,0,,116,,0,,,,,48,433402,,635,0,,,,,,,8096770,93873,8096770,93873,,,,,,0,,0 +"2020-08-29","OH",4126,3842,21,284,13288,13288,791,67,2952,260,,0,,,,,143,121340,114911,1216,0,,,,,133114,101185,,0,2237305,33313,,,,,,0,2237305,33313 +"2020-08-29","OK",797,,11,,4794,4794,570,75,,214,806545,7025,,,806545,,,57353,57353,1093,0,3006,,,,66512,48607,,0,863898,8118,68964,,,,,0,874676,8491 +"2020-08-29","OR",447,,9,,2108,2108,166,15,,47,517813,4858,,,791757,,22,26054,,293,0,,,,,47033,4859,,0,838790,8315,,,,,542589,5152,838790,8315 +"2020-08-29","PA",7671,,16,,,,509,0,,,1504108,15273,,,,,78,132834,129056,843,0,,,,,,108923,2241312,25302,2241312,25302,,,,,1633164,16079,,0 +"2020-08-29","PR",428,283,4,145,,,365,0,,65,305972,0,,,395291,,44,14986,14986,260,0,17564,,,,20103,,,0,320958,260,,,,,,0,415664,0 +"2020-08-29","RI",1047,,1,,2514,2514,80,18,,8,248354,3246,,,484071,,6,21857,,174,0,,,,,31071,,515142,10238,515142,10238,,,,,270211,3420,,0 +"2020-08-29","SC",2698,2563,43,135,7765,7765,945,167,,245,818374,7816,57544,,783450,,145,117249,115661,1298,0,5173,,,,150585,51431,,0,935623,9114,62717,,,,,0,934035,9077 +"2020-08-29","SD",167,,2,,1006,1006,79,11,,,131564,1141,,,,,,12942,,425,0,,,,,18913,10347,,0,188049,2395,,,,,144506,1566,188049,2395 +"2020-08-29","TN",1725,1677,24,48,6751,6751,1002,0,,338,,0,,,1992863,,166,152280,148681,1465,0,,,,,180543,114099,,0,2173406,21391,,,,,,0,2173406,21391 +"2020-08-29","TX",12420,,154,,,,4273,0,,1648,,0,,,,,,606530,606530,4762,0,29635,12353,,,743372,492921,,0,5445212,41073,356229,99677,,,,0,5445212,41073 +"2020-08-29","UT",407,,0,,3057,3057,139,16,774,48,601013,4378,,,756154,319,,51406,,458,0,,980,,916,56741,43342,,0,812895,7188,,5080,,4198,651909,4812,812895,7188 +"2020-08-29","VA",2568,2435,18,133,9512,9512,1101,52,,245,,0,,,,,131,118809,113623,1217,0,8513,1598,,,137012,,1555487,16197,1555487,16197,129748,4205,,,,0,,0 +"2020-08-29","VI",14,,0,,,,,0,,,14714,410,,,,,,1118,,43,0,,,,,,891,,0,15832,453,,,,,15918,449,,0 +"2020-08-29","VT",58,58,0,,,,10,0,,,127063,3333,,,,,,1601,1601,12,0,,,,,,1413,,0,176934,4918,,,,,128664,3345,176934,4918 +"2020-08-29","WA",1905,1905,15,,6679,6679,425,5,,,,0,,,,,46,75656,75042,533,0,,,,,,,1423771,15607,1423771,15607,,,,,,0,,0 +"2020-08-29","WI",1127,1119,6,8,5775,5775,268,39,1017,90,1164740,7933,,,,,,79730,74800,862,0,,,,,,66075,1715293,15862,1715293,15862,,,,,1239540,8752,,0 +"2020-08-29","WV",212,210,10,2,,,151,0,,49,,0,,,,,23,9967,9784,143,0,,,,,,7935,,0,418083,6663,15901,,,,,0,418083,6663 +"2020-08-29","WY",37,,0,,215,215,15,0,,,71473,0,,,115321,,,3784,3210,21,0,,,,,3433,3116,,0,118754,267,,,,,74669,0,118754,267 +"2020-08-28","AK",37,37,0,,239,239,37,3,,,,0,,,333850,,8,5114,,116,0,,,,,5359,2183,,0,339538,3318,,,,,,0,339538,3318 +"2020-08-28","AL",2107,2017,31,90,14267,14267,1002,262,1450,,842678,6892,,,,794,,122185,113723,1162,0,,,,,,48028,,0,956401,7821,,,,,956401,7821,,0 +"2020-08-28","AR",756,,17,,4142,4142,407,38,,,638472,7189,,,638472,538,95,59583,59583,838,0,,1085,,,,53331,,0,698055,8027,,7090,,,,0,698055,8027 +"2020-08-28","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-28","AZ",4978,4709,49,269,21428,21428,809,2,,272,983419,8630,,,,,160,200658,198978,519,0,,,,,,,,0,1729437,14666,,,264598,,1182397,9104,1729437,14666 +"2020-08-28","CA",12690,,140,,,,5267,0,,1477,,0,,,,,,688858,688858,5329,0,,,,,,,,0,11010637,92222,,,,,,0,11010637,92222 +"2020-08-28","CO",1937,1591,6,346,6945,6945,225,17,,,642611,7643,145665,,,,,56773,52958,430,0,10834,,,,,,985622,12632,985622,12632,156499,,,,695569,8039,,0 +"2020-08-28","CT",4465,3579,0,886,11180,11180,60,0,,,,0,,,1169714,,,52495,50387,145,0,,,,,64575,8967,,0,1236317,19270,,,,,,0,1236317,19270 +"2020-08-28","DC",605,,0,,,,83,0,,22,,0,,,,,10,13851,,57,0,,,,,,11010,281549,4845,281549,4845,,,,,175106,2208,,0 +"2020-08-28","DE",604,533,0,71,,,57,0,,12,213958,2875,,,,,,17083,16092,107,0,,,,,20517,9156,331841,3135,331841,3135,,,,,231041,2982,,0 +"2020-08-28","FL",11099,,88,,38474,38474,4001,311,,,3931871,26498,411877,403867,5390000,,,609074,600982,3732,0,34738,,34017,,790677,,6215891,65264,6215891,65264,446669,,437913,,4535184,30273,6216004,48961 +"2020-08-28","GA",5471,,78,,24335,24335,2648,208,4433,,,0,,,,,,265372,265372,2298,0,20781,,,,242320,,,0,2286984,18147,273911,,,,,0,2286984,18147 +"2020-08-28","GU",10,,0,,,,36,0,,4,35639,515,,,,,,1287,1279,55,0,2,,,,,488,,0,36926,570,158,,,,,0,36916,570 +"2020-08-28","HI",55,55,4,,462,462,286,18,,56,180587,2172,,,,,39,7566,,306,0,,,,,7591,2371,241485,3682,241485,3682,,,,,188153,2478,247017,3863 +"2020-08-28","IA",1095,,12,,,,299,0,,91,546188,4331,,45261,,,41,60971,60971,1185,0,,,3020,1382,,45977,,0,607159,5516,,,48321,11155,608675,-7835,,0 +"2020-08-28","ID",343,309,6,34,1328,1328,176,24,366,53,218065,2174,,,,,,31122,28841,342,0,,,,,,13928,,0,246906,2459,,,,,246906,2459,,0 +"2020-08-28","IL",8206,7997,20,209,,,1546,0,,352,,0,,,,,132,231185,229483,2434,0,,,,,,,,0,3924305,48383,,,,,,0,3924305,48383 +"2020-08-28","IN",3277,3058,11,219,10818,10818,867,71,2158,281,952736,8494,,,,,67,91313,,809,0,,,,,96767,,,0,1496996,21724,,,,,1044049,9303,1496996,21724 +"2020-08-28","KS",443,,6,,2278,2278,328,52,616,96,362099,6939,,,,206,31,41048,,1111,0,,,,,,,,0,403147,8050,,,,,403147,8050,,0 +"2020-08-28","KY",918,910,8,8,4532,4532,572,31,1375,158,,0,,,,,,46757,42811,779,0,,,,,,10266,,0,800704,11628,46635,13399,,,,0,800704,11628 +"2020-08-28","LA",4904,4741,30,163,,,900,0,,,1682235,9669,,,,,141,146944,146243,606,0,,,,,,127918,,0,1829179,10275,,,,,,0,1828478,10275 +"2020-08-28","MA",9023,8791,16,232,12334,12334,312,16,,60,1555664,23278,,,,,26,127584,117888,460,0,,,,,155347,103920,,0,2290752,44126,,,111578,83972,1673552,23716,2290752,44126 +"2020-08-28","MD",3736,3593,14,143,14184,14184,412,43,,106,1184606,15587,,107996,,,,106664,106664,601,0,,,9906,,125830,6124,,0,1868927,27502,,,117902,,1291270,16188,1868927,27502 +"2020-08-28","ME",132,131,0,1,417,417,10,2,,6,,0,9001,,,,1,4436,3981,22,0,477,,,,4894,3887,,0,245192,5123,9491,,,,,0,245192,5123 +"2020-08-28","MI",6712,6446,6,266,,,669,0,,184,,0,,,2572738,,93,111136,100699,793,0,,,,,142390,72580,,0,2715128,33342,253766,,,,,0,2715128,33342 +"2020-08-28","MN",1859,1810,4,49,6357,6357,301,31,1813,137,1028470,7370,,,,,,73240,73240,850,0,,,,,,65204,1443344,15997,1443344,15997,,,,,1101710,8220,,0 +"2020-08-28","MO",1464,,14,,,,1007,0,,,873641,10192,,65284,1165164,,118,80992,80992,1418,0,,,2829,,91202,,,0,1258585,15535,,,68113,,954633,11610,1258585,15535 +"2020-08-28","MP",2,2,0,,4,4,,0,,,13486,0,,,,,,54,54,0,0,,,,,,29,,0,13540,0,,,,,13540,0,17626,0 +"2020-08-28","MS",2413,2269,14,144,5279,5279,825,12,,203,481588,5645,,,,,108,81294,77822,599,0,,,,,,62707,,0,562882,6244,25000,28733,,,,0,559410,6144 +"2020-08-28","MT",100,,2,,417,417,121,5,,,,0,,,,,,7063,,134,0,,,,,,5172,,0,242875,2216,,,,,,0,242875,2216 +"2020-08-28","NC",2652,2652,22,,,,970,0,,278,,0,,,,,,162491,162491,1415,0,,,,,,,,0,2177899,35721,,,,,,0,2177899,35721 +"2020-08-28","ND",143,,0,,550,550,70,16,144,17,186886,1127,8011,,,,,11083,11083,307,0,318,,,,,8808,443180,7514,443180,7514,8329,,,,196389,1730,457772,7878 +"2020-08-28","NE",391,,5,,1968,1968,174,14,,,319318,3470,,,421468,,,33101,,374,0,,,,,40483,25009,,0,462924,5973,,,,,352922,3867,462924,5973 +"2020-08-28","NH",432,,1,,713,713,8,0,220,,198941,2118,,,,,,7216,,22,0,,,,,,6554,,0,319071,3959,30184,,29578,,206157,2140,319071,3959 +"2020-08-28","NJ",15932,14150,10,1782,22586,22586,436,26,,83,2558223,0,,,,,30,194326,190971,399,0,,,,,,,,0,2752549,399,,,,,,0,2748836,0 +"2020-08-28","NM",767,,3,,3106,3106,72,15,,,,0,,,,,,25042,,122,0,,,,,,12679,,0,747277,6911,,,,,,0,747277,6911 +"2020-08-28","NV",1287,,16,,,,707,0,,197,520699,3687,,,,,108,67852,67852,632,0,,,,,,,820159,6269,820159,6269,,,,,588301,4294,837057,8126 +"2020-08-28","NY",25312,,3,,89995,89995,478,0,,122,,0,,,,,51,432767,,636,0,,,,,,,8002897,97826,8002897,97826,,,,,,0,,0 +"2020-08-28","OH",4105,3819,29,286,13221,13221,800,71,2946,271,,0,,,,,151,120124,113725,1296,0,,,,,131500,100127,,0,2203992,31429,,,,,,0,2203992,31429 +"2020-08-28","OK",786,,8,,4719,4719,559,46,,229,799520,9221,,,799520,,,56260,56260,710,0,2856,,,,65073,47762,,0,855780,9931,67322,,,,,0,866185,10361 +"2020-08-28","OR",438,,5,,2093,2093,171,30,,53,512955,5788,,,783987,,23,25761,,190,0,,,,,46488,4789,,0,830475,12443,,,,,537437,5981,830475,12443 +"2020-08-28","PA",7655,,20,,,,526,0,,,1488835,17070,,,,,80,131991,128250,835,0,,,,,,106912,2216010,31838,2216010,31838,,,,,1617085,17890,,0 +"2020-08-28","PR",424,280,12,144,,,409,0,,72,305972,0,,,395291,,51,14726,14726,257,0,17262,,,,20103,,,0,320698,257,,,,,,0,415664,105118 +"2020-08-28","RI",1046,,2,,2496,2496,81,11,,8,245108,3284,,,473951,,4,21683,,94,0,,,,,30953,,504904,9329,504904,9329,,,,,266791,3378,,0 +"2020-08-28","SC",2655,2521,27,134,7598,7598,979,0,,246,810558,7137,57308,,775952,,146,115951,114400,1353,0,5104,,,,149006,51431,,0,926509,8490,62412,,,,,0,924958,8430 +"2020-08-28","SD",165,,3,,995,995,80,12,,,130423,1334,,,,,,12517,,323,0,,,,,18520,10170,,0,185654,2429,,,,,142940,1657,185654,2429 +"2020-08-28","TN",1701,1654,28,47,6751,6751,1012,74,,324,,0,,,1973284,,169,150815,147326,1636,0,,,,,178731,113313,,0,2152015,27222,,,,,,0,2152015,27222 +"2020-08-28","TX",12266,,196,,,,4422,0,,1636,,0,,,,,,601768,601768,4031,0,29287,12226,,,739427,484880,,0,5404139,34918,353966,97302,,,,0,5404139,34918 +"2020-08-28","UT",407,,4,,3041,3041,127,26,773,44,596635,3309,,,749468,318,,50948,,391,0,,948,,885,56239,42959,,0,805707,5636,,4825,,4008,647097,3699,805707,5636 +"2020-08-28","VA",2550,2417,35,133,9460,9460,1101,69,,261,,0,,,,,136,117592,112446,2134,0,8452,1554,,,135726,,1539290,36769,1539290,36769,129057,3985,,,,0,,0 +"2020-08-28","VI",14,,0,,,,,0,,,14304,160,,,,,,1075,,23,0,,,,,,864,,0,15379,183,,,,,15469,200,,0 +"2020-08-28","VT",58,58,0,,,,11,0,,,123730,1861,,,,,,1589,1589,4,0,,,,,,1400,,0,172016,2973,,,,,125319,1865,172016,2973 +"2020-08-28","WA",1890,1890,10,,6674,6674,443,34,,,,0,,,,,45,75123,74555,598,0,,,,,,,1408164,16855,1408164,16855,,,,,,0,,0 +"2020-08-28","WI",1121,1113,2,8,5736,5736,309,52,1010,103,1156807,8313,,,,,,78868,73981,864,0,,,,,,65265,1699431,24357,1699431,24357,,,,,1230788,9156,,0 +"2020-08-28","WV",202,201,3,1,,,133,0,,50,,0,,,,,23,9824,9644,191,0,,,,,,7859,,0,411420,5738,15793,,,,,0,411420,5738 +"2020-08-28","WY",37,,0,,215,215,15,0,,,71473,663,,,115058,,,3763,3196,41,0,,,,,3429,3086,,0,118487,1377,,,,,74669,693,118487,1377 +"2020-08-27","AK",37,37,0,,236,236,43,1,,,,0,,,330567,,9,4998,,84,0,,,,,5324,2109,,0,336220,1416,,,,,,0,336220,1416 +"2020-08-27","AL",2076,1990,31,86,14005,14005,1052,0,1430,,835786,11355,,,,782,,121023,112794,1769,0,,,,,,48028,,0,948580,12023,,,,,948580,12023,,0 +"2020-08-27","AR",739,,7,,4104,4104,433,43,,,631283,6033,,,631283,533,99,58745,58745,722,0,,1085,,,,52665,,0,690028,6755,,7090,,,,0,690028,6755 +"2020-08-27","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-27","AZ",4929,4673,33,256,21426,21426,895,50,,311,974789,7338,,,,,176,200139,198504,680,0,,,,,,,,0,1714771,20913,,,262982,,1173293,7998,1714771,20913 +"2020-08-27","CA",12550,,143,,,,5397,0,,1492,,0,,,,,,683529,683529,4430,0,,,,,,,,0,10918415,85658,,,,,,0,10918415,85658 +"2020-08-27","CO",1931,1585,4,346,6928,6928,213,26,,,634968,4858,144760,,,,,56343,52562,350,0,10757,,,,,,972990,10236,972990,10236,155517,,,,687530,5191,,0 +"2020-08-27","CT",4465,3579,2,886,11180,11180,56,93,,,,0,,,1150611,,,52350,50255,130,0,,,,,64421,8967,,0,1217047,20586,,,,,,0,1217047,20586 +"2020-08-27","DC",605,,0,,,,83,0,,24,,0,,,,,10,13794,,72,0,,,,,,10986,276704,2956,276704,2956,,,,,172898,1285,,0 +"2020-08-27","DE",604,533,0,71,,,57,0,,15,211083,974,,,,,,16976,15987,-10,0,,,,,20434,9101,328706,3285,328706,3285,,,,,228059,964,,0 +"2020-08-27","FL",11011,,139,,38163,38163,4252,316,,,3905373,21277,411877,403867,5346674,,,605342,597508,3229,0,34738,,34017,,785463,,6150627,50652,6150627,50652,446669,,437913,,4504911,24480,6167043,41344 +"2020-08-27","GA",5393,,82,,24127,24127,2129,188,4397,,,0,,,,,,263074,263074,2484,0,20571,,,,240686,,,0,2268837,19936,272383,,,,,0,2268837,19936 +"2020-08-27","GU",10,,1,,,,30,0,,3,35124,890,,,,,,1232,1224,112,0,2,,,,,456,,0,36356,1002,158,,,,,0,36346,1002 +"2020-08-27","HI",51,51,2,,444,444,291,25,,54,178415,2242,,,,,35,7260,,276,0,,,,,7276,2288,237803,4064,237803,4064,,,,,185675,2518,243154,3885 +"2020-08-27","IA",1083,,16,,,,305,0,,99,541857,6284,,44654,,,44,59786,59786,1551,0,,,3011,,,45447,,0,601643,7835,,,47705,,616510,8177,,0 +"2020-08-27","ID",337,304,11,33,1304,1304,176,19,363,53,215891,1504,,,,,,30780,28556,305,0,,,,,,13657,,0,244447,1728,,,,,244447,1728,,0 +"2020-08-27","IL",8186,7977,23,209,,,1631,0,,390,,0,,,,,151,228751,227334,1707,0,,,,,,,,0,3875922,44510,,,,,,0,3875922,44510 +"2020-08-27","IN",3266,3047,7,219,10747,10747,882,142,2156,279,944242,11064,,,,,71,90504,,1145,0,,,,,95734,,,0,1475272,22014,,,,,1034746,12209,1475272,22014 +"2020-08-27","KS",437,,0,,2226,2226,262,0,603,76,355160,0,,,,206,25,39937,,0,0,,,,,,,,0,395097,0,,,,,395097,0,,0 +"2020-08-27","KY",910,904,8,6,4501,4501,573,55,1368,154,,0,,,,,,45978,42169,748,0,,,,,,9731,,0,789076,9350,46538,13323,,,,0,789076,9350 +"2020-08-27","LA",4874,4711,23,163,,,876,0,,,1672566,9359,,,,,145,146338,145637,677,0,,,,,,127918,,0,1818904,10036,,,,,,0,1818203,10036 +"2020-08-27","MA",9007,8775,20,232,12318,12318,333,19,,61,1532386,24975,,,,,29,127124,117450,368,0,,,,,154839,103920,,0,2246626,52284,,,111148,82573,1649836,25340,2246626,52284 +"2020-08-27","MD",3722,3580,5,142,14141,14141,412,51,,107,1169019,11334,,107996,,,,106063,106063,577,0,,,9906,,125056,6080,,0,1841425,21475,,,117902,,1275082,11911,1841425,21475 +"2020-08-27","ME",132,131,0,1,415,415,9,3,,4,,0,8982,,,,1,4414,3961,25,0,474,,,,4859,3847,,0,240069,3780,9469,,,,,0,240069,3780 +"2020-08-27","MI",6706,6440,16,266,,,669,0,,184,,0,,,2540488,,85,110343,99958,863,0,,,,,141298,72580,,0,2681786,30717,252101,,,,,0,2681786,30717 +"2020-08-27","MN",1855,1806,13,49,6326,6326,305,52,1805,139,1021100,13289,,,,,,72390,72390,1154,0,,,,,,64876,1427347,21340,1427347,21340,,,,,1093490,14443,,0 +"2020-08-27","MO",1450,,1,,,,902,0,,,863449,9371,,64803,1150970,,110,79574,79574,1512,0,,,2778,,89878,,,0,1243050,13011,,,67581,,943023,10883,1243050,13011 +"2020-08-27","MP",2,2,0,,4,4,,0,,,13486,619,,,,,,54,54,0,0,,,,,,29,,0,13540,619,,,,,13540,620,17626,1173 +"2020-08-27","MS",2399,2256,26,143,5267,5267,827,33,,230,475943,4263,,,,,125,80695,77323,585,0,,,,,,62707,,0,556638,4848,24653,25042,,,,0,553266,4669 +"2020-08-27","MT",98,,0,,412,412,119,10,,,,0,,,,,,6929,,144,0,,,,,,5024,,0,240659,2399,,,,,,0,240659,2399 +"2020-08-27","NC",2630,2630,24,,,,958,0,,272,,0,,,,,,161076,161076,2091,0,,,,,,,,0,2142178,31132,,,,,,0,2142178,31132 +"2020-08-27","ND",143,,1,,534,534,61,9,142,17,185759,1108,8011,,,,,10776,10776,332,0,318,,,,,8666,435666,6614,435666,6614,8329,,,,194659,1559,449894,6965 +"2020-08-27","NE",386,,3,,1954,1954,166,8,,,315848,3436,,,415962,,,32727,,379,0,,,,,40019,24689,,0,456951,5718,,,,,349055,3812,456951,5718 +"2020-08-27","NH",431,,1,,713,713,9,0,220,,196823,2147,,,,,,7194,,35,0,,,,,,6542,,0,315112,4243,30081,,29478,,204017,2182,315112,4243 +"2020-08-27","NJ",15922,14141,7,1781,22560,22560,455,51,,77,2558223,26945,,,,,29,193927,190613,360,0,,,,,,,,0,2752150,27305,,,,,,0,2748836,27252 +"2020-08-27","NM",764,,9,,3091,3091,68,17,,,,0,,,,,,24920,,188,0,,,,,,12446,,0,740366,6146,,,,,,0,740366,6146 +"2020-08-27","NV",1271,,21,,,,727,0,,207,517012,2523,,,,,110,67220,67220,554,0,,,,,,,813890,6499,813890,6499,,,,,584007,3011,828931,5742 +"2020-08-27","NY",25309,,4,,89995,89995,490,0,,126,,0,,,,,52,432131,,791,0,,,,,,,7905071,83437,7905071,83437,,,,,,0,,0 +"2020-08-27","OH",4076,3791,32,285,13150,13150,787,107,2929,257,,0,,,,,150,118828,112489,1244,0,,,,,129988,99035,,0,2172563,26055,,,,,,0,2172563,26055 +"2020-08-27","OK",778,,15,,4673,4673,552,64,,211,790299,7753,,,790299,,,55550,55550,712,0,2856,,,,63967,47186,,0,845849,8465,67322,,,,,0,855824,8764 +"2020-08-27","OR",433,,5,,2063,2063,140,25,,48,507167,4549,,,772165,,26,25571,,180,0,,,,,45867,4747,,0,818032,7918,,,,,531456,4753,818032,7918 +"2020-08-27","PA",7635,,11,,,,542,0,,,1471765,14123,,,,,82,131156,127430,620,0,,,,,,106236,2184172,23221,2184172,23221,,,,,1599195,14718,,0 +"2020-08-27","PR",412,270,8,142,,,403,0,,74,305972,0,,,303412,,41,14469,14469,459,0,16914,,,,7002,,,0,320441,459,,,,,,0,310546,0 +"2020-08-27","RI",1044,,3,,2485,2485,82,7,,10,241824,3648,,,464703,,3,21589,,135,0,,,,,30872,,495575,10549,495575,10549,,,,,263413,3783,,0 +"2020-08-27","SC",2628,2494,55,134,7598,7598,1006,0,,262,803421,7435,57006,,768770,,144,114598,113107,505,0,5026,,,,147758,51431,,0,918019,7940,62032,,,,,0,916528,7899 +"2020-08-27","SD",162,,0,,983,983,75,2,,,129089,2895,,,,,,12194,,343,0,,,,,18117,10032,,0,183225,2619,,,,,141283,3238,183225,2619 +"2020-08-27","TN",1673,1627,25,46,6677,6677,1047,74,,324,,0,,,1947993,,166,149179,145743,1826,0,,,,,176800,111416,,0,2124793,25965,,,,,,0,2124793,25965 +"2020-08-27","TX",12070,,265,,,,4489,0,,1704,,0,,,,,,597737,597737,5600,0,28870,12111,,,736142,478752,,0,5369221,43190,351564,95481,,,,0,5369221,43190 +"2020-08-27","UT",403,,2,,3015,3015,134,19,764,41,593326,4072,,,744253,310,,50557,,383,0,,921,,861,55818,42512,,0,800071,6769,,4576,,3797,643398,4481,800071,6769 +"2020-08-27","VA",2515,2382,0,133,9391,9391,1174,65,,264,,0,,,,,148,115458,110437,0,0,8374,1515,,,134326,,1502521,0,1502521,0,128260,3583,,,,0,,0 +"2020-08-27","VI",14,,0,,,,,0,,,14144,209,,,,,,1052,,22,0,,,,,,824,,0,15196,231,,,,,15269,237,,0 +"2020-08-27","VT",58,58,0,,,,12,0,,,121869,1898,,,,,,1585,1585,11,0,,,,,,1396,,0,169043,3472,,,,,123454,1909,169043,3472 +"2020-08-27","WA",1880,1880,4,,6640,6640,459,45,,,,0,,,,,37,74525,73989,609,0,,,,,,,1391309,11205,1391309,11205,,,,,,0,,0 +"2020-08-27","WI",1119,1111,11,8,5684,5684,291,33,1004,96,1148494,9913,,,,,,78004,73138,912,0,,,,,,64480,1675074,17578,1675074,17578,,,,,1221632,10791,,0 +"2020-08-27","WV",199,198,9,1,,,146,0,,47,,0,,,,,25,9633,9458,93,0,,,,,,7773,,0,405682,4157,15718,,,,,0,405682,4157 +"2020-08-27","WY",37,,0,,215,215,13,2,,,70810,3916,,,113706,,,3722,3166,38,0,,,,,3404,3060,,0,117110,1262,,,,,73976,3993,117110,1262 +"2020-08-26","AK",37,37,1,,235,235,44,2,,,,0,,,329171,,6,4914,,52,0,,,,,5305,2088,,0,334804,973,,,,,,0,334804,973 +"2020-08-26","AL",2045,1965,8,80,14005,14005,1077,212,1412,,824431,14396,,,,770,,119254,112126,2012,0,,,,,,48028,,0,936557,15568,,,,,936557,15568,,0 +"2020-08-26","AR",732,,21,,4061,4061,435,48,,,625250,8440,,,625250,525,108,58023,58023,649,0,,1085,,,,51901,,0,683273,9569,,7090,,,,0,683273,9569 +"2020-08-26","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-26","AZ",4896,4640,104,256,21376,21376,967,11,,305,967451,4520,,,,,180,199459,197844,186,0,,,,,,,,0,1693858,17290,,,261865,,1165295,4693,1693858,17290 +"2020-08-26","CA",12407,,150,,,,5537,0,,1507,,0,,,,,,679099,679099,6004,0,,,,,,,,0,10832757,70251,,,,,,0,10832757,70251 +"2020-08-26","CO",1927,1581,1,346,6902,6902,253,8,,,630110,3849,144206,,,,,55993,52228,193,0,10697,,,,,,962754,7113,962754,7113,154903,,,,682339,4004,,0 +"2020-08-26","CT",4463,3579,0,884,11087,11087,57,0,,,,0,,,1130206,,,52220,50134,180,0,,,,,64255,8893,,0,1196461,20874,,,,,,0,1196461,20874 +"2020-08-26","DC",605,,1,,,,77,0,,25,,0,,,,,13,13722,,38,0,,,,,,10923,273748,2126,273748,2126,,,,,171613,991,,0 +"2020-08-26","DE",604,533,1,71,,,50,0,,13,210109,1743,,,,,,16986,15991,24,0,,,,,20327,9050,325421,2495,325421,2495,,,,,227095,1767,,0 +"2020-08-26","FL",10872,,155,,37847,37847,4405,370,,,3884096,23074,411877,403867,5310027,,,602113,594604,2937,0,34738,,34017,,781065,,6099975,56520,6099975,56520,446669,,437913,,4480431,25946,6125699,44445 +"2020-08-26","GA",5311,,49,,23939,23939,2227,222,4360,,,0,,,,,,260590,260590,2236,0,20483,,,,239055,,,0,2248901,18051,271737,,,,,0,2248901,18051 +"2020-08-26","GU",9,,2,,,,26,0,,4,34234,816,,,,,,1120,1112,136,0,2,,,,,435,,0,35354,952,158,,,,,0,35344,952 +"2020-08-26","HI",49,49,0,,419,419,270,0,,50,176173,2307,,,,,19,6984,,0,0,,,,,6987,2236,233739,3364,233739,3364,,,,,183157,2307,239269,0 +"2020-08-26","IA",1067,,15,,,,313,0,,102,535573,5124,,44558,,,40,58235,58235,941,0,,,2999,,,44903,,0,593808,6065,,,47597,,608333,6296,,0 +"2020-08-26","ID",326,293,12,33,1285,1285,160,16,359,47,214387,4362,,,,,,30475,28332,405,0,,,,,,13353,,0,242719,4705,,,,,242719,4705,,0 +"2020-08-26","IL",8163,7954,37,209,,,1573,0,,350,,0,,,,,132,227044,225627,2157,0,,,,,,,,0,3831412,50362,,,,,,0,3831412,50362 +"2020-08-26","IN",3259,3041,18,218,10605,10605,948,188,2121,283,933178,10618,,,,,75,89359,,938,0,,,,,94581,,,0,1453258,21687,,,,,1022537,11556,1453258,21687 +"2020-08-26","KS",437,,11,,2226,2226,262,43,603,76,355160,6604,,,,206,25,39937,,1536,0,,,,,,,,0,395097,8140,,,,,395097,8140,,0 +"2020-08-26","KY",902,896,7,6,4446,4446,593,0,1357,151,,0,,,,,,45230,41567,662,0,,,,,,9594,,0,779726,7772,46515,13213,,,,0,779726,7772 +"2020-08-26","LA",4851,4688,54,163,,,914,0,,,1663207,13261,,,,,148,145661,144960,1545,0,,,,,,127918,,0,1808868,14806,,,,,,0,1808167,14105 +"2020-08-26","MA",8987,8755,27,232,12299,12299,356,20,,68,1507411,19429,,,,,29,126756,117085,336,0,,,,,154356,103920,,0,2194342,36478,,,110379,82123,1624496,19744,2194342,36478 +"2020-08-26","MD",3717,3574,10,143,14090,14090,432,39,,106,1157685,7166,,107996,,,,105486,105486,440,0,,,9906,,124368,6061,,0,1819950,12377,,,117902,,1263171,7606,1819950,12377 +"2020-08-26","ME",132,131,1,1,412,412,8,2,,5,,0,8944,,,,1,4389,3942,21,0,474,,,,4839,3818,,0,236289,4533,9431,,,,,0,236289,4533 +"2020-08-26","MI",6690,6424,6,266,,,637,0,,186,,0,,,2510872,,93,109480,99200,843,0,,,,,140197,72580,,0,2651069,41345,250244,,,,,0,2651069,41345 +"2020-08-26","MN",1842,1793,17,49,6274,6274,304,36,1796,134,1007811,5992,,,,,,71236,71236,529,0,,,,,,64374,1406007,11021,1406007,11021,,,,,1079047,6521,,0 +"2020-08-26","MO",1449,,9,,,,882,0,,,854078,6636,,64402,1139402,,116,78062,78062,1426,0,,,2737,,88500,,,0,1230039,6568,,,67139,,932140,8062,1230039,6568 +"2020-08-26","MP",2,2,0,,4,4,,0,,,12867,0,,,,,,54,54,0,0,,,,,,29,,0,12921,0,,,,,12920,0,16453,0 +"2020-08-26","MS",2373,2234,58,139,5234,5234,878,26,,232,471680,3625,,,,,119,80110,76917,904,0,,,,,,62707,,0,551790,4529,24384,24363,,,,0,548597,4314 +"2020-08-26","MT",98,,1,,402,402,125,8,,,,0,,,,,,6785,,161,0,,,,,,4983,,0,238260,1753,,,,,,0,238260,1753 +"2020-08-26","NC",2606,2606,36,,,,1004,0,,281,,0,,,,,,158985,158985,1244,0,,,,,,,,0,2111046,14920,,,,,,0,2111046,14920 +"2020-08-26","ND",142,,0,,525,525,53,6,142,17,184651,1281,8011,,,,,10444,10444,233,0,318,,,,,8545,429052,4260,429052,4260,8329,,,,193100,1642,442929,4443 +"2020-08-26","NE",383,,0,,1946,1946,168,16,,,312412,3978,,,410704,,,32348,,301,0,,,,,39559,24524,,0,451233,1934,,,,,345243,4285,451233,1934 +"2020-08-26","NH",430,,1,,713,713,8,0,220,,194676,1955,,,,,,7159,,9,0,,,,,,6510,,0,310869,3576,30010,,29414,,201835,1964,310869,3576 +"2020-08-26","NJ",15915,14134,10,1781,22509,22509,425,41,,72,2531278,23404,,,,,29,193567,190306,326,0,,,,,,,,0,2724845,23730,,,,,,0,2721584,23689 +"2020-08-26","NM",755,,5,,3074,3074,71,24,,,,0,,,,,,24732,,197,0,,,,,,12193,,0,734220,5593,,,,,,0,734220,5593 +"2020-08-26","NV",1250,,20,,,,761,0,,211,514489,1620,,,,,118,66666,66666,253,0,,,,,,,807391,7626,807391,7626,,,,,580996,1820,823189,3407 +"2020-08-26","NY",25305,,8,,89995,89995,492,0,,136,,0,,,,,54,431340,,566,0,,,,,,,7821634,71189,7821634,71189,,,,,,0,,0 +"2020-08-26","OH",4044,3761,48,283,13043,13043,771,87,2920,259,,0,,,,,144,117584,111331,1089,0,,,,,128715,97823,,0,2146508,21556,,,,,,0,2146508,21556 +"2020-08-26","OK",763,,19,,4609,4609,533,82,,211,782546,5887,,,782546,,,54838,54838,666,0,2856,,,,62969,46414,,0,837384,6553,67322,,,,,0,847060,6383 +"2020-08-26","OR",428,,8,,2038,2038,154,10,,53,502618,4436,,,764982,,27,25391,,236,0,,,,,45132,4747,,0,810114,7674,,,,,526703,4662,810114,7674 +"2020-08-26","PA",7624,,19,,,,537,0,,,1457642,12472,,,,,80,130536,126835,501,0,,,,,,105734,2160951,21461,2160951,21461,,,,,1584477,12957,,0 +"2020-08-26","PR",404,263,9,141,,,397,0,,62,305972,0,,,303412,,44,14010,14010,18,0,16734,,,,7002,,,0,319982,18,,,,,,0,310546,0 +"2020-08-26","RI",1041,,2,,2478,2478,80,4,,11,238176,1759,,,454329,,4,21454,,82,0,,,,,30697,,485026,5643,485026,5643,,,,,259630,1841,,0 +"2020-08-26","SC",2573,2451,44,122,7598,7598,1058,0,,268,795986,3367,56702,,762013,,156,114093,112643,605,0,4949,,,,146616,51431,,0,910079,3972,61651,,,,,0,908629,3922 +"2020-08-26","SD",162,,1,,981,981,58,7,,,126194,20,,,,,,11851,,292,0,,,,,17800,9896,,0,180606,1829,,,,,138045,312,180606,1829 +"2020-08-26","TN",1648,1604,20,44,6603,6603,1070,88,,340,,0,,,1924142,,169,147353,144060,1936,0,,,,,174686,109765,,0,2098828,27382,,,,,,0,2098828,27382 +"2020-08-26","TX",11805,,229,,,,4806,0,,1723,,0,,,,,,592137,592137,5407,0,28439,11958,,,732329,472421,,0,5326031,47103,348384,93184,,,,0,5326031,47103 +"2020-08-26","UT",401,,4,,2996,2996,130,27,760,40,589254,3888,,,737933,308,,50174,,407,0,,893,,833,55369,41937,,0,793302,5973,,4330,,3588,638917,4244,793302,5973 +"2020-08-26","VA",2515,2382,21,133,9326,9326,1170,67,,265,,0,,,,,145,115458,110437,823,0,8292,1480,,,133061,,1502521,7507,1502521,7507,127444,3352,,,,0,,0 +"2020-08-26","VI",14,,2,,,,,0,,,13935,322,,,,,,1030,,32,0,,,,,,801,,0,14965,354,,,,,15032,365,,0 +"2020-08-26","VT",58,58,0,,,,14,0,,,119971,623,,,,,,1574,1574,4,0,,,,,,1388,,0,165571,1537,,,,,121545,627,165571,1537 +"2020-08-26","WA",1876,1876,9,,6595,6595,441,53,,,,0,,,,,47,73916,73414,632,0,,,,,,,1380104,54,1380104,54,,,,,,0,,0 +"2020-08-26","WI",1108,1100,6,8,5651,5651,344,41,996,107,1138581,9610,,,,,,77092,72260,786,0,,,,,,63730,1657496,17840,1657496,17840,,,,,1210841,10378,,0 +"2020-08-26","WV",190,189,3,1,,,143,0,,42,,0,,,,,22,9540,9364,145,0,,,,,,7601,,0,401525,4817,15654,,,,,0,401525,4817 +"2020-08-26","WY",37,,0,,213,213,17,0,,,66894,0,,,112466,,,3684,3135,50,0,,,,,3382,3028,,0,115848,1280,,,,,69983,0,115848,1280 +"2020-08-25","AK",36,36,4,,233,233,46,5,,,,0,,,328233,,6,4862,,33,0,,,,,5270,1967,,0,333831,3328,,,,,,0,333831,3328 +"2020-08-25","AL",2037,1959,13,78,13793,13793,1097,0,1399,,810035,3426,,,,764,,117242,110954,532,0,,,,,,44684,,0,920989,4625,,,,,920989,4625,,0 +"2020-08-25","AR",711,,15,,4013,4013,442,51,,,616810,0,,,616810,514,108,57374,57374,480,0,,1085,,,,51351,,0,673704,0,,7090,,,,0,673704,0 +"2020-08-25","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-25","AZ",4792,4535,21,257,21365,21365,999,146,,319,962931,4123,,,,,168,199273,197671,859,0,,,,,,,,0,1676568,18055,,,261217,,1160602,4973,1676568,18055 +"2020-08-25","CA",12257,,105,,,,5561,0,,1540,,0,,,,,,673095,673095,4480,0,,,,,,,,0,10762506,110019,,,,,,0,10762506,110019 +"2020-08-25","CO",1926,1580,7,346,6894,6894,243,49,,,626261,31404,143826,,,,,55800,52074,459,0,10671,,,,,,955641,7996,955641,7996,154497,,,,678335,4422,,0 +"2020-08-25","CT",4463,3580,3,883,11087,11087,59,0,,,,0,,,1109525,,,52040,49971,29,0,,,,,64065,8893,,0,1175587,20013,,,,,,0,1175587,20013 +"2020-08-25","DC",604,,0,,,,87,0,,28,,0,,,,,12,13684,,45,0,,,,,,10885,271622,2221,271622,2221,,,,,170622,1276,,0 +"2020-08-25","DE",603,531,-1,72,,,40,0,,12,208366,1807,,,,,,16962,15960,20,0,,,,,20258,9010,322926,1274,322926,1274,,,,,225328,1827,,0 +"2020-08-25","FL",10717,,183,,37477,37477,4544,445,,,3861022,16695,411877,403867,5270516,,,599176,591989,2665,0,34738,,34017,,776457,,6043455,36233,6043455,36233,446669,,437913,,4454485,19400,6081254,33890 +"2020-08-25","GA",5262,,106,,23717,23717,2260,292,4322,,,0,,,,,,258354,258354,2101,0,20242,,,,237435,,,0,2230850,25669,270000,,,,,0,2230850,25669 +"2020-08-25","GU",7,,0,,,,27,0,,6,33418,854,,,,,,984,976,77,0,2,,,,,429,,0,34402,931,158,,,,,0,34392,931 +"2020-08-25","HI",49,49,2,,419,419,250,23,,35,173866,1642,,,,,19,6984,,384,0,,,,,6775,2236,230375,3087,230375,3087,,,,,180850,2026,239269,6935 +"2020-08-25","IA",1052,,8,,,,295,0,,82,530449,2984,,44147,,,37,57294,57294,661,0,,,2993,,,44396,,0,587743,3645,,,47180,,602037,3822,,0 +"2020-08-25","ID",314,285,7,29,1269,1269,160,13,350,47,210025,1293,,,,,,30070,27989,217,0,,,,,,13081,,0,238014,1467,,,,,238014,1467,,0 +"2020-08-25","IL",8126,7917,29,209,,,1549,0,,345,,0,,,,,135,224887,223470,1680,0,,,,,,,,0,3781050,40859,,,,,,0,3781050,40859 +"2020-08-25","IN",3241,3023,16,218,10417,10417,987,74,2099,276,922560,8114,,,,,77,88421,,829,0,,,,,93508,,,0,1431571,21702,,,,,1010981,8943,1431571,21702 +"2020-08-25","KS",426,,0,,2183,2183,189,0,590,64,348556,0,,,,205,22,38401,,0,0,,,,,,,,0,386957,0,,,,,386957,0,,0 +"2020-08-25","KY",895,889,10,6,4446,4446,593,47,1357,151,,0,,,,,,44568,41054,669,0,,,,,,9594,,0,771954,7896,46484,12864,,,,0,771954,7896 +"2020-08-25","LA",4797,4656,33,141,,,930,0,,,1649946,21031,,,,,141,144116,144116,550,0,,,,,,118120,,0,1794062,21581,,,,,,0,1794062,21581 +"2020-08-25","MA",8960,8729,12,231,12279,12279,327,11,,61,1487982,22425,,,,,28,126420,116770,398,0,,,,,153951,102205,,0,2157864,34873,,,109535,79979,1604752,22774,2157864,34873 +"2020-08-25","MD",3707,3564,13,143,14051,14051,411,44,,97,1150519,7595,,103726,,,,105046,105046,377,0,,,9431,,123831,6056,,0,1807573,12870,,,113157,,1255565,7972,1807573,12870 +"2020-08-25","ME",131,130,0,1,410,410,8,1,,5,,0,8926,,,,1,4368,3919,12,0,472,,,,4812,3784,,0,231756,2432,9411,,,,,0,231756,2432 +"2020-08-25","MI",6684,6417,21,267,,,637,0,,186,,0,,,2470538,,86,108637,98439,951,0,,,,,139186,72580,,0,2609724,24298,249056,,,,,0,2609724,24298 +"2020-08-25","MN",1825,1779,8,46,6238,6238,312,43,1791,137,1001819,4307,,,,,,70707,70707,409,0,,,,,,63725,1394986,8473,1394986,8473,,,,,1072526,4716,,0 +"2020-08-25","MO",1440,,14,,,,925,0,,,847442,3674,,64186,1134314,,119,76636,76636,692,0,,,2705,,87041,,,0,1223471,9015,,,66891,,924078,4366,1223471,9015 +"2020-08-25","MP",2,2,0,,4,4,,0,,,12867,0,,,,,,54,54,0,0,,,,,,29,,0,12921,0,,,,,12920,0,16453,0 +"2020-08-25","MS",2315,2201,67,114,5208,5208,920,29,,234,468055,3798,,,,,124,79206,76228,801,0,,,,,,62707,,0,547261,4599,24188,23678,,,,0,544283,4455 +"2020-08-25","MT",97,,6,,394,394,119,11,,,,0,,,,,,6624,,135,0,,,,,,4891,,0,236507,2834,,,,,,0,236507,2834 +"2020-08-25","NC",2570,2570,35,,,,1000,0,,270,,0,,,,,,157741,157741,1345,0,,,,,,,,0,2096126,13120,,,,,,0,2096126,13120 +"2020-08-25","ND",142,,2,,519,519,50,14,140,16,183370,1352,7976,,,,,10211,10211,233,0,314,,,,,8410,424792,3087,424792,3087,8290,,,,191458,1643,438486,3178 +"2020-08-25","NE",383,,5,,1930,1930,154,20,,,308434,723,,,408963,,,32047,,158,0,,,,,39369,24326,,0,449299,5774,,,,,340958,882,449299,5774 +"2020-08-25","NH",429,,0,,713,713,8,1,220,,192721,1626,,,,,,7150,,16,0,,,,,,6484,,0,307293,2794,29911,,29322,,199871,1642,307293,2794 +"2020-08-25","NJ",15905,14124,4,1781,22468,22468,432,16,,78,2507874,20781,,,,,30,193241,190021,355,0,,,,,,,,0,2701115,21136,,,,,,0,2697895,21083 +"2020-08-25","NM",750,,3,,3050,3050,64,9,,,,0,,,,,,24535,,66,0,,,,,,11909,,0,728627,4826,,,,,,0,728627,4826 +"2020-08-25","NV",1230,,30,,,,772,0,,216,512869,2202,,,,,122,66413,66413,403,0,,,,,,,799765,5618,799765,5618,,,,,579176,2555,819782,4989 +"2020-08-25","NY",25297,,2,,89995,89995,488,0,,133,,0,,,,,52,430774,,629,0,,,,,,,7750445,67255,7750445,67255,,,,,,0,,0 +"2020-08-25","OH",3996,3716,10,280,12956,12956,783,97,2903,250,,0,,,,,150,116495,110343,844,0,,,,,127933,96728,,0,2124952,23961,,,,,,0,2124952,23961 +"2020-08-25","OK",744,,14,,4527,4527,553,96,,226,776659,17324,,,776659,,,54172,54172,650,0,2856,,,,62455,45516,,0,830831,17974,67322,,,,,0,840677,19388 +"2020-08-25","OR",420,,3,,2028,2028,143,44,,44,498182,3299,,,757637,,25,25155,,218,0,,,,,44803,4634,,0,802440,5554,,,,,522041,11985,802440,5554 +"2020-08-25","PA",7605,,26,,,,543,0,,,1445170,11806,,,,,82,130035,126350,561,0,,,,,,105328,2139490,22961,2139490,22961,,,,,1571520,12334,,0 +"2020-08-25","PR",395,256,5,139,,,391,0,,67,305972,0,,,303412,,43,13992,13992,70,0,16728,,,,7002,,,0,319964,70,,,,,,0,310546,0 +"2020-08-25","RI",1039,,4,,2474,2474,87,14,,11,236417,3045,,,448943,,2,21372,,70,0,,,,,30440,,479383,5713,479383,5713,,,,,257789,3115,,0 +"2020-08-25","SC",2529,2408,18,121,7598,7598,1025,159,,261,792619,8693,56604,,758909,,144,113488,112088,937,0,4920,,,,145798,51431,,0,906107,9630,61524,,,,,0,904707,9579 +"2020-08-25","SD",161,,0,,974,974,53,9,,,126174,136,,,,,,11559,,134,0,,,,,17530,9814,,0,178777,1115,,,,,137733,270,178777,1115 +"2020-08-25","TN",1628,1587,40,41,6515,6515,1099,94,,359,,0,,,1898955,,226,145417,142251,813,0,,,,,172491,108035,,0,2071446,15105,,,,,,0,2071446,15105 +"2020-08-25","TX",11576,,181,,,,4907,0,,1799,,0,,,,,,586730,586730,6346,0,28100,11785,,,728523,466550,,0,5278928,47183,346519,90830,,,,0,5278928,47183 +"2020-08-25","UT",397,,7,,2969,2969,143,28,753,47,585366,3433,,,732363,306,,49767,,403,0,,881,,822,54966,41529,,0,787329,5145,,4135,,3424,634673,3852,787329,5145 +"2020-08-25","VA",2494,2370,23,124,9259,9259,1174,52,,273,,0,,,,,144,114635,109679,1005,0,8252,1439,,,132419,,1495014,15897,1495014,15897,126988,3223,,,,0,,0 +"2020-08-25","VI",12,,1,,,,,0,,,13613,155,,,,,,998,,14,0,,,,,,754,,0,14611,169,,,,,14667,130,,0 +"2020-08-25","VT",58,58,0,,,,13,0,,,119348,933,,,,,,1570,1570,6,0,,,,,,1386,,0,164034,1711,,,,,120918,939,164034,1711 +"2020-08-25","WA",1867,1867,4,,6542,6542,421,12,,,,0,,,,,37,73284,72794,217,0,,,,,,,1380050,0,1380050,0,,,,,,0,,0 +"2020-08-25","WI",1102,1094,13,8,5610,5610,354,37,996,133,1128971,9349,,,,,,76306,71492,687,0,,,,,,62995,1639656,9892,1639656,9892,,,,,1200463,9987,,0 +"2020-08-25","WV",187,186,8,1,,,139,0,,46,,0,,,,,21,9395,9219,83,0,,,,,,7486,,0,396708,6708,15584,,,,,0,396708,6708 +"2020-08-25","WY",37,,0,,213,213,18,2,,,66894,4475,,,111229,,,3634,3089,31,0,,,,,3339,2965,,0,114568,1479,,,,,69983,4496,114568,1479 +"2020-08-24","AK",32,32,0,,228,228,43,3,,,,0,,,324954,,8,4829,,71,0,,,,,5221,1861,,0,330503,3063,,,,,,0,330503,3063 +"2020-08-24","AL",2024,1950,11,74,13793,13793,1149,291,1391,,806609,0,,,,754,,116710,110769,1650,0,,,,,,44684,,0,916364,-339,,,,,916364,-339,,0 +"2020-08-24","AR",696,,9,,3962,3962,466,42,,,616810,7684,,,616810,507,108,56894,56894,320,0,,1085,,,,50689,,0,673704,2878,,7090,,,,0,673704,2878 +"2020-08-24","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-24","AZ",4771,4514,0,257,21219,21219,908,-22,,345,958808,6042,,,,,176,198414,196821,311,0,,,,,,,,0,1658513,6234,,,260739,,1155629,6342,1658513,6234 +"2020-08-24","CA",12152,,18,,,,5618,0,,1549,,0,,,,,,668615,668615,4946,0,,,,,,,,0,10652487,111456,,,,,,0,10652487,111456 +"2020-08-24","CO",1919,1574,1,345,6845,6845,243,4,,,594857,0,143436,,,,,55341,51676,198,0,10639,,,,,,947645,9049,947645,9049,154075,,,,673913,4919,,0 +"2020-08-24","CT",4460,3574,0,886,11087,11087,57,0,,,,0,,,1089729,,,52011,49940,492,0,,,,,63852,8893,,0,1155574,5824,,,,,,0,1155574,5824 +"2020-08-24","DC",604,,0,,,,85,0,,26,,0,,,,,13,13639,,49,0,,,,,,10835,269401,3355,269401,3355,,,,,169346,1538,,0 +"2020-08-24","DE",604,532,4,72,,,38,0,,7,206559,1609,,,,,,16942,15930,47,0,,,,,20227,8972,321652,4194,321652,4194,,,,,223501,1656,,0 +"2020-08-24","FL",10534,,72,,37032,37032,4646,129,,,3844327,16265,411877,403867,5240838,,,596511,589591,2224,0,34738,,34017,,772578,,6007222,39163,6007222,39163,446669,,437913,,4435085,18482,6047364,31321 +"2020-08-24","GA",5156,,24,,23425,23425,2350,56,4272,,,0,,,,,,256253,256253,2304,0,20127,,,,235432,,,0,2205181,33297,269215,,,,,0,2205181,33297 +"2020-08-24","GU",7,,0,,,,17,0,,4,32564,793,,,,,,907,899,87,0,2,,,,,428,,0,33471,880,158,,,,,0,33461,1955 +"2020-08-24","HI",47,47,0,,396,396,192,19,,35,172224,2396,,,,,19,6600,,244,0,,,,,6615,2143,227288,3841,227288,3841,,,,,178824,2640,232334,3953 +"2020-08-24","IA",1044,,8,,,,275,0,,86,527465,1764,,43897,,,37,56633,56633,358,0,,,2986,,,43738,,0,584098,2122,,,46923,,598215,2450,,0 +"2020-08-24","ID",307,278,1,29,1256,1256,192,10,347,52,208732,1114,,,,,,29853,27815,191,0,,,,,,12867,,0,236547,1292,,,,,236547,1292,,0 +"2020-08-24","IL",8097,7888,8,209,,,1529,0,,334,,0,,,,,141,223207,221790,1612,0,,,,,,,,0,3740191,36155,,,,,,0,3740191,36155 +"2020-08-24","IN",3225,3008,5,217,10343,10343,912,62,2085,248,914446,22576,,,,,75,87592,,1660,0,,,,,92192,,,0,1409869,6737,,,,,1002038,24236,1409869,6737 +"2020-08-24","KS",426,,7,,2183,2183,189,24,590,64,348556,19097,,,,205,22,38401,,1545,0,,,,,,,,0,386957,20642,,,,,386957,20642,,0 +"2020-08-24","KY",885,879,4,6,4399,4399,564,37,1348,149,,0,,,,,,43899,40493,370,0,,,,,,9544,,0,764058,18788,46390,12456,,,,0,764058,18788 +"2020-08-24","LA",4764,4623,18,141,,,939,0,,,1628915,8020,,,,,152,143566,143566,623,0,,,,,,118120,,0,1772481,8643,,,,,,0,1772481,8643 +"2020-08-24","MA",8948,8717,27,231,12268,12268,308,12,,62,1465557,37244,,,,,26,126022,116421,662,0,,,,,153528,102205,,0,2122991,58462,,,109138,77748,1581978,37815,2122991,58462 +"2020-08-24","MD",3694,3554,3,140,14007,14007,407,51,,103,1142924,14130,,103726,,,,104669,104669,567,0,,,9431,,123344,6047,,0,1794703,22047,,,113157,,1247593,14697,1794703,22047 +"2020-08-24","ME",131,130,0,1,409,409,6,1,,5,,0,8926,,,,1,4356,3910,21,0,470,,,,4802,3762,,0,229324,3085,9409,,,,,0,229324,3085 +"2020-08-24","MI",6663,6397,4,266,,,637,0,,186,,0,,,2447208,,86,107686,97660,878,0,,,,,138218,72580,,0,2585426,21092,248310,,,,,0,2585426,21092 +"2020-08-24","MN",1817,1771,4,46,6195,6195,310,44,1770,135,997512,6776,,,,,,70298,70298,714,0,,,,,,63059,1386513,11977,1386513,11977,,,,,1067810,7490,,0 +"2020-08-24","MO",1426,,0,,,,957,0,,,843768,4010,,64124,1125404,,118,75944,75944,869,0,,,2714,,86924,,,0,1214456,-3641,,,66838,,919712,4879,1214456,-3641 +"2020-08-24","MP",2,2,0,,4,4,,0,,,12867,0,,,,,,54,54,0,0,,,,,,29,,0,12921,0,,,,,12920,0,16453,0 +"2020-08-24","MS",2248,2147,8,101,5179,5179,903,30,,237,464257,7903,,,,,127,78405,75571,511,0,,,,,,56577,,0,542662,8414,23899,22904,,,,0,539828,8854 +"2020-08-24","MT",91,,1,,383,383,114,4,,,,0,,,,,,6489,,60,0,,,,,,4842,,0,233673,22924,,,,,,0,233673,22924 +"2020-08-24","NC",2535,2535,4,,,,948,0,,274,,0,,,,,,156396,156396,1283,0,,,,,,,,0,2083006,24169,,,,,,0,2083006,24169 +"2020-08-24","ND",140,,0,,505,505,51,4,141,16,182018,1009,7910,,,,,9978,9978,126,0,308,,,,,8206,421705,2396,421705,2396,8218,,,,189815,1198,435308,2586 +"2020-08-24","NE",378,,2,,1910,1910,146,3,,,307711,1130,,,403533,,,31889,,109,0,,,,,39027,24155,,0,443525,1939,,,,,340076,1240,443525,1939 +"2020-08-24","NH",429,,0,,712,712,11,1,220,,191095,2138,,,,,,7134,,27,0,,,,,,6450,,0,304499,3183,29844,,29258,,198229,2165,304499,3183 +"2020-08-24","NJ",15901,14120,3,1781,22452,22452,446,4,,66,2487093,27589,,,,,27,192886,189719,258,0,,,,,,,,0,2679979,27847,,,,,,0,2676812,28072 +"2020-08-24","NM",747,,2,,3041,3041,68,10,,,,0,,,,,,24469,,73,0,,,,,,11668,,0,723801,4501,,,,,,0,723801,4501 +"2020-08-24","NV",1200,,3,,,,771,0,,229,510667,2039,,,,,126,66010,66010,409,0,,,,,,,794147,1569,794147,1569,,,,,576621,2502,814793,5110 +"2020-08-24","NY",25295,,7,,89995,89995,482,0,,120,,0,,,,,54,430145,,408,0,,,,,,,7683190,62031,7683190,62031,,,,,,0,,0 +"2020-08-24","OH",3986,3705,8,281,12859,12859,802,59,2888,276,,0,,,,,146,115651,109566,849,0,,,,,127032,95554,,0,2100991,27225,,,,,,0,2100991,27225 +"2020-08-24","OK",730,,4,,4431,4431,578,9,,237,759335,0,,,759335,,,53522,53522,357,0,2856,,,,60433,44660,,0,812857,357,67322,,,,,0,821289,0 +"2020-08-24","OR",417,,0,,1984,1984,173,0,,47,494883,3129,,,752378,,19,24937,,227,0,,,,,44508,4589,,0,796886,5241,,,,,510056,0,796886,5241 +"2020-08-24","PA",7579,,1,,,,518,0,,,1433364,9392,,,,,71,129474,125822,426,0,,,,,,104873,2116529,16070,2116529,16070,,,,,1559186,9807,,0 +"2020-08-24","PR",390,251,0,139,,,363,0,,71,305972,0,,,303412,,42,13922,13922,445,0,16696,,,,7002,,,0,319894,445,,,,,,0,310546,0 +"2020-08-24","RI",1035,,0,,2460,2460,80,0,,11,233372,2064,,,443325,,4,21302,,39,0,,,,,30345,,473670,3508,473670,3508,,,,,254674,2103,,0 +"2020-08-24","SC",2511,2387,7,124,7439,7439,979,0,,248,783926,3578,56477,,751000,,148,112551,111202,563,0,4861,,,,144128,46118,,0,896477,4141,61338,,,,,0,895128,4122 +"2020-08-24","SD",161,,0,,965,965,65,6,,,126038,554,,,,,,11425,,149,0,,,,,17388,9694,,0,177662,1314,,,,,137463,703,177662,1314 +"2020-08-24","TN",1588,1547,21,41,6421,6421,1018,43,,342,,0,,,1884801,,173,144604,141591,667,0,,,,,171540,106041,,0,2056341,14085,,,,,,0,2056341,14085 +"2020-08-24","TX",11395,,25,,,,5019,0,,1809,,0,,,,,,580384,580384,2847,0,27726,11635,,,724009,457182,,0,5231745,14670,344218,88467,,,,0,5231745,14670 +"2020-08-24","UT",390,,5,,2941,2941,144,15,744,57,581933,2575,,,727682,298,,49364,,249,0,,853,,797,54502,41164,,0,782184,4197,,3895,,3224,630821,2860,782184,4197 +"2020-08-24","VA",2471,2352,4,119,9207,9207,1127,31,,256,,0,,,,,134,113630,108767,664,0,8229,1394,,,131291,,1479117,13084,1479117,13084,126679,3099,,,,0,,0 +"2020-08-24","VI",11,,1,,,,,0,,,13458,100,,,,,,984,,24,0,,,,,,712,,0,14442,124,,,,,14537,118,,0 +"2020-08-24","VT",58,58,0,,,,11,0,,,118415,1340,,,,,,1564,1564,8,0,,,,,,1380,,0,162323,2557,,,,,119979,1348,162323,2557 +"2020-08-24","WA",1863,1863,6,,6530,6530,454,30,,,,0,,,,,36,73067,72579,274,0,,,,,,,1380050,1014,1380050,1014,,,,,,0,,0 +"2020-08-24","WI",1089,1081,0,8,5573,5573,337,15,991,121,1119622,4473,,,,,,75619,70854,414,0,,,,,,62310,1629764,13463,1629764,13463,,,,,1190476,4865,,0 +"2020-08-24","WV",179,178,1,1,,,141,0,,47,,0,,,,,23,9312,9137,40,0,,,,,,7385,,0,390000,2536,15521,,,,,0,390000,2536 +"2020-08-24","WY",37,,0,,211,211,20,4,,,62419,1106,,,109780,,,3603,3068,24,0,,,,,3309,2927,,0,113089,1651,,,,,65487,1180,113089,1651 +"2020-08-23","AK",32,32,1,,225,225,48,2,,,,0,,,321943,,7,4758,,66,0,,,,,5170,1745,,0,327440,1153,,,,,,0,327440,1153 +"2020-08-23","AL",2013,1944,2,69,13502,13502,1093,0,1348,,806609,4859,,,,734,,115060,110094,528,0,,,,,,44684,,0,916703,5387,,,,,916703,5387,,0 +"2020-08-23","AR",687,,13,,3920,3920,500,12,,,609126,6187,,,609126,502,110,56574,56574,375,0,,1085,,,,50251,,0,670826,12235,,7090,,,,0,670826,12235 +"2020-08-23","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-23","AZ",4771,4515,15,256,21241,21241,969,-30,,329,952766,6527,,,,,191,198103,196521,208,0,,,,,,,,0,1652279,7824,,,259529,,1149287,6730,1652279,7824 +"2020-08-23","CA",12134,,146,,,,5665,0,,1582,,0,,,,,,663669,663669,6777,0,,,,,,,,0,10541031,104679,,,,,,0,10541031,104679 +"2020-08-23","CO",1918,1573,0,345,6841,6841,225,10,,,594857,0,143047,,,,,55143,51505,260,0,10612,,,,,,938596,8444,938596,8444,153659,,,,668994,5213,,0 +"2020-08-23","CT",4460,3574,0,886,11087,11087,54,0,,,,0,,,1083965,,,51519,49477,0,0,,,,,63793,8893,,0,1149750,6760,,,,,,0,1149750,6760 +"2020-08-23","DC",604,,0,,,,80,0,,27,,0,,,,,12,13590,,56,0,,,,,,10812,266046,3606,266046,3606,,,,,167808,3299,,0 +"2020-08-23","DE",600,531,0,69,,,44,0,,8,204950,1902,,,,,,16895,15881,67,0,,,,,20119,8936,317458,3293,317458,3293,,,,,221845,1969,,0 +"2020-08-23","FL",10462,,51,,36903,36903,4580,139,,,3828062,23812,411877,403867,5212677,,,594287,587629,3004,0,34738,,34017,,769714,,5968059,52380,5968059,52380,446669,,437913,,4416603,26835,6016043,45356 +"2020-08-23","GA",5132,,40,,23369,23369,2360,44,4265,,,0,,,,,,253949,253949,1727,0,19716,,,,230533,,,0,2171884,22714,267561,,,,,0,2171884,22714 +"2020-08-23","GU",7,,0,,,,16,0,,3,31771,1022,,,,,,820,812,53,0,2,,,,,394,,0,32591,1075,155,,,,,0,31506,0 +"2020-08-23","HI",47,47,1,,377,377,192,40,,35,169828,2350,,,,,19,6356,,284,0,,,,,6369,2107,223447,4390,223447,4390,,,,,176184,2634,228381,4396 +"2020-08-23","IA",1036,,5,,,,260,0,,82,525701,3081,,43842,,,39,56275,56275,540,0,,,2980,,,43493,,0,581976,3621,,,46862,,595765,3802,,0 +"2020-08-23","ID",306,277,2,29,1246,1246,192,13,346,52,207618,1134,,,,,,29662,27637,293,0,,,,,,12606,,0,235255,1400,,,,,235255,1400,,0 +"2020-08-23","IL",8089,7880,6,209,,,1449,0,,339,,0,,,,,117,221595,220178,1893,0,,,,,,,,0,3704036,54351,,,,,,0,3704036,54351 +"2020-08-23","IN",3220,3003,2,217,10281,10281,894,62,2076,252,891870,7541,,,,,70,85932,,615,0,,,,,91844,,,0,1403132,9088,,,,,977802,8156,1403132,9088 +"2020-08-23","KS",419,,0,,2159,2159,296,0,584,89,329459,0,,,,203,24,36856,,0,0,,,,,,,,0,366315,0,,,,,366315,0,,0 +"2020-08-23","KY",881,875,17,6,4362,4362,590,0,1340,166,,0,,,,,,43529,40181,1264,0,,,,,,9448,,0,745270,0,45988,11940,,,,0,745270,0 +"2020-08-23","LA",4746,4605,59,141,,,941,0,,,1620895,23808,,,,,152,142943,142943,1223,0,,,,,,118120,,0,1763838,25031,,,,,,0,1763838,25031 +"2020-08-23","MA",8921,8690,0,231,12256,12256,315,0,,50,1428313,0,,,,,20,125360,115850,0,0,,,,,152852,102205,,0,2064529,0,,,108343,74606,1544163,0,2064529,0 +"2020-08-23","MD",3691,3552,6,139,13956,13956,407,92,,99,1128794,11876,,103726,,,,104102,104102,579,0,,,9431,,122660,6047,,0,1772656,21141,,,113157,,1232896,12455,1772656,21141 +"2020-08-23","ME",131,130,1,1,408,408,4,1,,2,,0,8917,,,,1,4335,3890,18,0,470,,,,4782,3734,,0,226239,3880,9400,,,,,0,226239,3880 +"2020-08-23","MI",6659,6393,4,266,,,646,0,,173,,0,,,2426664,,95,106808,96792,764,0,,,,,137670,72580,,0,2564334,76129,247944,,,,,0,2564334,76129 +"2020-08-23","MN",1813,1767,6,46,6151,6151,301,38,1766,137,990736,8347,,,,,,69584,69584,717,0,,,,,,62373,1374536,16941,1374536,16941,,,,,1060320,9064,,0 +"2020-08-23","MO",1426,,1,,,,957,0,,,839758,9321,,64109,1128457,,118,75075,75075,818,0,,,2710,,87456,,,0,1218097,21555,,,66819,,914833,10139,1218097,21555 +"2020-08-23","MP",2,2,0,,4,4,,0,,,12867,0,,,,,,54,54,0,0,,,,,,29,,0,12921,0,,,,,12920,0,16453,0 +"2020-08-23","MS",2240,2139,3,101,5149,5149,982,0,,259,456354,0,,,,,148,77894,75176,626,0,,,,,,56577,,0,534248,626,22862,,,,,0,530974,0 +"2020-08-23","MT",90,,0,,379,379,111,1,,,,0,,,,,,6429,,53,0,,,,,,4816,,0,210749,1033,,,,,,0,210749,1033 +"2020-08-23","NC",2531,2531,10,,,,898,0,,268,,0,,,,,,155113,155113,1472,0,,,,,,,,0,2058837,24904,,,,,,0,2058837,24904 +"2020-08-23","ND",140,,4,,501,501,52,2,141,17,181009,1707,7895,,,,,9852,9852,138,0,308,,,,,8064,419309,4402,419309,4402,8203,,,,188617,1802,432722,4494 +"2020-08-23","NE",376,,0,,1907,1907,139,16,,,306581,1625,,,401732,,,31780,,154,0,,,,,38889,23878,,0,441586,2688,,,,,338836,1778,441586,2688 +"2020-08-23","NH",429,,0,,711,711,12,1,220,,188957,1374,,,,,,7107,,15,0,,,,,,6428,,0,301316,2466,29819,,29236,,196064,1389,301316,2466 +"2020-08-23","NJ",15898,14117,3,1781,22448,22448,411,3,,72,2459504,0,,,,,27,192628,189494,282,0,,,,,,,,0,2652132,282,,,,,,0,2648740,0 +"2020-08-23","NM",745,,2,,3031,3031,64,1,,,,0,,,,,,24396,,94,0,,,,,,11539,,0,719300,6979,,,,,,0,719300,6979 +"2020-08-23","NV",1197,,0,,,,825,0,,247,508628,3571,,,,,138,65601,65601,532,0,,,,,,,792578,3779,792578,3779,,,,,574119,4159,809683,7664 +"2020-08-23","NY",25288,,6,,89995,89995,472,0,,110,,0,,,,,50,429737,,572,0,,,,,,,7621159,74043,7621159,74043,,,,,,0,,0 +"2020-08-23","OH",3978,3697,3,281,12800,12800,777,22,2878,271,,0,,,,,150,114802,108735,637,0,,,,,126029,94825,,0,2073766,26302,,,,,,0,2073766,26302 +"2020-08-23","OK",726,,1,,4422,4422,578,54,,237,759335,0,,,759335,,,53165,53165,566,0,2856,,,,60433,44409,,0,812500,566,67322,,,,,0,821289,0 +"2020-08-23","OR",417,,3,,1984,1984,173,0,,47,491754,4854,,,747453,,19,24710,,289,0,,,,,44192,4589,,0,791645,8955,,,,,510056,0,791645,8955 +"2020-08-23","PA",7578,,2,,,,501,0,,,1423972,11848,,,,,75,129048,125407,619,0,,,,,,103238,2100459,20443,2100459,20443,,,,,1549379,12453,,0 +"2020-08-23","PR",390,251,9,139,,,370,0,,66,305972,0,,,303412,,36,13477,13477,195,0,16419,,,,7002,,,0,319449,195,,,,,,0,310546,0 +"2020-08-23","RI",1035,,0,,2460,2460,80,5,,11,231308,2357,,,439862,,4,21263,,88,0,,,,,30300,,470162,5490,470162,5490,,,,,252571,2445,,0 +"2020-08-23","SC",2504,2380,11,124,7439,7439,1026,0,,250,780348,-20489,56344,,747491,,150,111988,110658,693,0,4846,,,,143515,46118,,0,892336,-19796,61190,,,,,0,891006,-19793 +"2020-08-23","SD",161,,1,,959,959,62,8,,,125484,989,,,,,,11276,,141,0,,,,,17267,9564,,0,176348,2353,,,,,136760,1130,176348,2353 +"2020-08-23","TN",1567,1527,4,40,6378,6378,1009,50,,330,,0,,,1871468,,164,143937,141000,1854,0,,,,,170788,104054,,0,2042256,37395,,,,,,0,2042256,37395 +"2020-08-23","TX",11370,,104,,,,5186,0,,1878,,0,,,,,,577537,577537,4398,0,27726,11553,,,722613,451776,,0,5217075,17988,344218,87509,,,,0,5217075,17988 +"2020-08-23","UT",385,,0,,2926,2926,156,27,743,58,579358,3182,,,723803,298,,49115,,301,0,,844,,789,54184,40831,,0,777987,4928,,3828,,3169,627961,3419,777987,4928 +"2020-08-23","VA",2467,2348,24,119,9176,9176,1155,37,,251,,0,,,,,130,112966,108112,894,0,8193,1381,,,130505,,1466033,12362,1466033,12362,126244,3051,,,,0,,0 +"2020-08-23","VI",10,,0,,,,,0,,,13358,0,,,,,,960,,0,0,,,,,,655,,0,14318,0,,,,,14419,0,,0 +"2020-08-23","VT",58,58,0,,,,13,0,,,117075,1336,,,,,,1556,1556,5,0,,,,,,1371,,0,159766,2148,,,,,118631,1341,159766,2148 +"2020-08-23","WA",1857,1857,7,,6500,6500,455,31,,,,0,,,,,42,72793,72306,551,0,,,,,,,1379036,2503,1379036,2503,,,,,,0,,0 +"2020-08-23","WI",1089,1081,0,8,5558,5558,321,13,990,106,1115149,4361,,,,,,75205,70462,479,0,,,,,,61720,1616301,10977,1616301,10977,,,,,1185611,4814,,0 +"2020-08-23","WV",178,177,2,1,,,139,0,,46,,0,,,,,23,9272,9097,87,0,,,,,,7358,,0,387464,4372,15514,,,,,0,387464,4372 +"2020-08-23","WY",37,,0,,207,207,19,4,,,61313,0,,,108194,,,3579,3046,36,0,,,,,3244,2896,,0,111438,258,,,,,64307,0,111438,258 +"2020-08-22","AK",31,31,1,,223,223,46,3,,,,0,,,320811,,6,4692,,88,0,,,,,5151,1686,,0,326287,4752,,,,,,0,326287,4752 +"2020-08-22","AL",2011,1942,21,69,13502,13502,1067,172,1348,,801750,17420,,,,734,,114532,109566,1762,0,,,,,,44684,,0,911316,19503,,,,,911316,19503,,0 +"2020-08-22","AR",674,,11,,3908,3908,492,52,,,602939,0,,,602939,502,108,56199,56199,547,0,,1085,,,,49764,,0,658591,0,,7090,,,,0,658591,0 +"2020-08-22","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-22","AZ",4756,4500,68,256,21271,21271,1046,61,,363,946239,15150,,,,,209,197895,196318,996,0,,,,,,,,0,1644455,15936,,,258197,,1142557,16137,1644455,15936 +"2020-08-22","CA",11988,,167,,,,5873,0,,1675,,0,,,,,,656892,656892,6556,0,,,,,,,,0,10436352,106980,,,,,,0,10436352,106980 +"2020-08-22","CO",1918,1573,8,345,6831,6831,258,23,,,594857,0,142573,,,,,54883,51258,297,0,10575,,,,,,930152,11226,930152,11226,153148,,,,663781,5929,,0 +"2020-08-22","CT",4460,3574,0,886,11087,11087,54,0,,,,0,,,1077306,,,51519,49477,0,0,,,,,63696,8893,,0,1142990,14515,,,,,,0,1142990,14515 +"2020-08-22","DC",604,,2,,,,81,0,,26,,0,,,,,10,13534,,65,0,,,,,,10800,262440,3382,262440,3382,,,,,164509,0,,0 +"2020-08-22","DE",600,531,0,69,,,44,0,,11,203048,1810,,,,,,16828,15820,58,0,,,,,20048,8923,314165,3394,314165,3394,,,,,219876,1868,,0 +"2020-08-22","FL",10411,,107,,36764,36764,4745,339,,,3804250,30324,411877,403867,5171972,,,591283,584680,4260,0,34738,,34017,,765446,,5915679,85096,5915679,85096,446669,,437913,,4389768,34620,5970687,60865 +"2020-08-22","GA",5092,,94,,23325,23325,2361,200,4251,,,0,,,,,,252222,252222,2592,0,19488,,,,228623,,,0,2149170,29068,265893,,,,,0,2149170,29068 +"2020-08-22","GU",7,,0,,,,14,0,,3,30749,0,,,,,,767,759,0,0,2,,,,,394,,0,31516,0,155,,,,,0,31506,0 +"2020-08-22","HI",46,46,1,,337,337,227,20,,44,167478,4650,,,,,23,6072,,228,0,,,,,6050,2072,219057,3806,219057,3806,,,,,173550,2366,223985,3999 +"2020-08-22","IA",1031,,10,,,,268,0,,79,522620,4487,,43561,,,34,55735,55735,729,0,,,2975,,,43383,,0,578355,5216,,,46576,,591963,5341,,0 +"2020-08-22","ID",304,274,6,30,1233,1233,192,7,344,52,206484,1824,,,,,,29369,27371,249,0,,,,,,12359,,0,233855,2056,,,,,233855,2056,,0 +"2020-08-22","IL",8083,7874,17,209,,,1488,0,,322,,0,,,,,127,219702,218285,2356,0,,,,,,,,0,3649685,56766,,,,,,0,3649685,56766 +"2020-08-22","IN",3218,3001,10,217,10219,10219,883,87,2067,235,884329,10214,,,,,76,85317,,1000,0,,,,,91434,,,0,1394044,23790,,,,,969646,11214,1394044,23790 +"2020-08-22","KS",419,,0,,2159,2159,296,0,584,89,329459,0,,,,203,24,36856,,0,0,,,,,,,,0,366315,0,,,,,366315,0,,0 +"2020-08-22","KY",864,858,0,6,4362,4362,590,0,1340,166,,0,,,,,,42265,39068,0,0,,,,,,9448,,0,745270,0,45988,11940,,,,0,745270,0 +"2020-08-22","LA",4687,4546,0,141,,,1051,0,,,1597087,0,,,,,172,141720,141720,0,0,,,,,,118120,,0,1738807,0,,,,,,0,1738807,0 +"2020-08-22","MA",8921,8690,20,231,12256,12256,315,11,,50,1428313,8192,,,,,20,125360,115850,144,0,,,,,152852,102205,,0,2064529,13658,,,108343,74606,1544163,8301,2064529,13658 +"2020-08-22","MD",3685,3546,11,139,13864,13864,441,41,,98,1116918,15550,,103726,,,,103523,103523,624,0,,,9431,,122025,6047,,0,1751515,28558,,,113157,,1220441,16174,1751515,28558 +"2020-08-22","ME",130,129,1,1,407,407,4,0,,1,,0,8885,,,,1,4317,3872,32,0,467,,,,4757,3718,,0,222359,3790,9365,,,,,0,222359,3790 +"2020-08-22","MI",6655,6389,21,266,,,646,0,,173,,0,,,2352995,,95,106044,96024,1426,0,,,,,135210,72580,,0,2488205,33018,244940,,,,,0,2488205,33018 +"2020-08-22","MN",1807,1761,8,46,6113,6113,316,49,1761,148,982389,8985,,,,,,68867,68867,734,0,,,,,,61698,1357595,16745,1357595,16745,,,,,1051256,9719,,0 +"2020-08-22","MO",1425,,6,,,,913,0,,,830437,7295,,63752,1109461,,104,74257,74257,1293,0,,,2649,,84986,,,0,1196542,11007,,,66401,,904694,8588,1196542,11007 +"2020-08-22","MP",2,2,0,,4,4,,0,,,12867,0,,,,,,54,54,0,0,,,,,,29,,0,12921,0,,,,,12920,0,16453,0 +"2020-08-22","MS",2237,2136,23,101,5149,5149,982,22,,259,456354,2875,,,,,148,77268,74620,945,0,,,,,,56577,,0,533622,3820,22862,,,,,0,530974,3669 +"2020-08-22","MT",90,,1,,378,378,110,15,,,,0,,,,,,6376,,160,0,,,,,,4815,,0,209716,1089,,,,,,0,209716,1089 +"2020-08-22","NC",2521,2521,27,,,,996,0,,279,,0,,,,,,153641,153641,1729,0,,,,,,,,0,2033933,25761,,,,,,0,2033933,25761 +"2020-08-22","ND",136,,0,,499,499,53,8,140,16,179302,1764,7870,,,,,9714,9714,256,0,305,,,,,7968,414907,6623,414907,6623,8175,,,,186815,2177,428228,6870 +"2020-08-22","NE",376,,3,,1891,1891,140,14,,,304956,2537,,,399222,,,31626,,278,0,,,,,38712,23608,,0,438898,3931,,,,,337058,2817,438898,3931 +"2020-08-22","NH",429,,1,,710,710,14,0,220,,187583,4951,,,,,,7092,,42,0,,,,,,6405,,0,298850,8840,29743,,29166,,194675,4993,298850,8840 +"2020-08-22","NJ",15895,14114,2,1781,22445,22445,376,52,,66,2459504,32629,,,,,32,192346,189236,459,0,,,,,,,,0,2651850,33088,,,,,,0,2648740,33048 +"2020-08-22","NM",743,,4,,3030,3030,68,12,,,,0,,,,,,24302,,207,0,,,,,,11458,,0,712321,7366,,,,,,0,712321,7366 +"2020-08-22","NV",1197,,12,,,,825,0,,247,505057,3179,,,,,138,65069,65069,636,0,,,,,,,788799,6632,788799,6632,,,,,569960,3724,802019,6755 +"2020-08-22","NY",25282,,4,,89995,89995,483,0,,116,,0,,,,,56,429165,,653,0,,,,,,,7547116,94849,7547116,94849,,,,,,0,,0 +"2020-08-22","OH",3975,3694,20,281,12778,12778,792,59,2876,281,,0,,,,,155,114165,108133,1119,0,,,,,124995,93914,,0,2047464,30013,,,,,,0,2047464,30013 +"2020-08-22","OK",725,,10,,4368,4368,578,52,,237,759335,10179,,,759335,,,52599,52599,853,0,2856,,,,60433,44035,,0,811934,11032,67322,,,,,0,821289,11169 +"2020-08-22","OR",414,,2,,1984,1984,173,5,,47,486900,4698,,,738974,,19,24421,,256,0,,,,,43716,4566,,0,782690,10346,,,,,510056,4937,782690,10346 +"2020-08-22","PA",7576,,18,,,,487,0,,,1412124,12615,,,,,84,128429,124802,796,0,,,,,,102743,2080016,24367,2080016,24367,,,,,1536926,13386,,0 +"2020-08-22","PR",381,246,7,135,,,401,0,,67,305972,0,,,303412,,41,13282,13282,268,0,16295,,,,7002,,,0,319254,268,,,,,,0,310546,0 +"2020-08-22","RI",1035,,5,,2455,2455,87,17,,9,228951,4119,,,434461,,4,21175,,153,0,,,,,30211,,464672,9695,464672,9695,,,,,250126,4272,,0 +"2020-08-22","SC",2493,2372,34,121,7439,7439,1025,0,,258,800837,8034,57763,,763753,,155,111295,109962,917,0,4970,,,,147046,46118,,0,912132,8951,62733,,,,,0,910799,8861 +"2020-08-22","SD",160,,1,,951,951,66,3,,,124495,1604,,,,,,11135,,251,0,,,,,17020,9435,,0,173995,2129,,,,,135630,1855,173995,2129 +"2020-08-22","TN",1563,1523,14,40,6328,6328,1100,73,,358,,0,,,1836205,,170,142083,139184,1239,0,,,,,168656,103426,,0,2004861,26452,,,,,,0,2004861,26452 +"2020-08-22","TX",11266,,215,,,,5274,0,,1963,,0,,,,,,573139,573139,5559,0,27414,11487,,,720818,446030,,0,5199087,44017,342277,86627,,,,0,5199087,44017 +"2020-08-22","UT",385,,2,,2899,2899,148,29,740,56,576176,4910,,,719134,297,,48814,,369,0,,832,,778,53925,40352,,0,773059,7148,,3741,,3097,624542,5327,773059,7148 +"2020-08-22","VA",2443,2324,7,119,9139,9139,1154,68,,254,,0,,,,,125,112072,107268,1212,0,8124,1364,,,129523,,1453671,16393,1453671,16393,125539,2978,,,,0,,0 +"2020-08-22","VI",10,,0,,,,,0,,,13358,463,,,,,,960,,28,0,,,,,,655,,0,14318,491,,,,,14419,504,,0 +"2020-08-22","VT",58,58,0,,,,15,0,,,115739,1518,,,,,,1551,1551,11,0,,,,,,1366,,0,157618,2744,,,,,117290,1529,157618,2744 +"2020-08-22","WA",1850,1850,13,,6469,6469,469,69,,,,0,,,,,45,72242,71780,509,0,,,,,,,1376533,7269,1376533,7269,,,,,,0,,0 +"2020-08-22","WI",1089,1081,14,8,5545,5545,333,40,986,108,1110788,7750,,,,,,74726,70009,975,0,,,,,,60933,1605324,16237,1605324,16237,,,,,1180797,8700,,0 +"2020-08-22","WV",176,175,6,1,,,138,0,,51,,0,,,,,23,9185,9010,119,0,,,,,,7307,,0,383092,6119,15501,,,,,0,383092,6119 +"2020-08-22","WY",37,,0,,203,203,19,0,,,61313,0,,,107944,,,3543,3009,19,0,,,,,3236,2879,,0,111180,250,,,,,64307,0,111180,250 +"2020-08-21","AK",30,30,1,,220,220,46,2,,,,0,,,316141,,6,4604,,69,0,,,,,5073,1601,,0,321535,8888,,,,,,0,321535,8888 +"2020-08-21","AL",1990,1921,16,69,13330,13330,1168,0,1348,,784330,0,,,,734,,112770,107804,321,0,,,,,,44684,,0,891813,0,,,,,891813,0,,0 +"2020-08-21","AR",663,,22,,3856,3856,509,66,,,602939,9195,,,602939,499,120,55652,55652,887,0,,1085,,,,49135,,0,658591,10082,,7090,,,,0,658591,10082 +"2020-08-21","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-21","AZ",4688,4433,4,255,21210,21210,1068,67,,365,931089,8926,,,,,234,196899,195331,619,0,,,,,,,,0,1628519,14610,,,257196,,1126420,9523,1628519,14610 +"2020-08-21","CA",11821,,135,,,,6039,0,,1706,,0,,,,,,650336,650336,5585,0,,,,,,,,0,10329372,101406,,,,,,0,10329372,101406 +"2020-08-21","CO",1910,1566,7,344,6808,6808,236,11,,,594857,0,141899,,,,,54586,50967,356,0,10514,,,,,,918926,12233,918926,12233,152413,,,,657852,6602,,0 +"2020-08-21","CT",4460,3574,2,886,11087,11087,54,0,,,,0,,,1062914,,,51519,49477,87,0,,,,,63580,8893,,0,1128475,17843,,,,,,0,1128475,17843 +"2020-08-21","DC",602,,1,,,,78,0,,27,,0,,,,,12,13469,,60,0,,,,,,10772,259058,5073,259058,5073,,,,,164509,2351,,0 +"2020-08-21","DE",600,531,5,69,,,37,0,,10,201238,1000,,,,,,16770,15766,52,0,,,,,19966,8839,310771,1776,310771,1776,,,,,218008,1052,,0 +"2020-08-21","FL",10304,,118,,36425,36425,4902,355,,,3773926,26776,411877,403867,5117438,,,587023,580588,4616,0,34738,,34017,,759737,,5830583,67384,5830583,67384,446669,,437913,,4355148,31460,5909822,53686 +"2020-08-21","GA",4998,,94,,23125,23125,2408,245,4218,,,0,,,,,,249630,249630,2889,0,19106,,,,225938,,,0,2120102,23267,263245,,,,,0,2120102,23267 +"2020-08-21","GU",7,,1,,,,14,0,,3,30749,761,,,,,,767,759,63,0,2,,,,,394,,0,31516,824,155,,,,,0,31506,804 +"2020-08-21","HI",45,45,0,,317,317,165,0,,29,162828,0,,,,,19,5844,,0,0,,,,,5825,2031,215251,3520,215251,3520,,,,,171184,2512,219986,0 +"2020-08-21","IA",1021,,7,,,,293,0,,81,518133,3957,,43113,,,32,55006,55006,991,0,,,2964,,,42912,,0,573139,4948,,,46117,,586622,5100,,0 +"2020-08-21","ID",298,269,7,29,1226,1226,205,26,340,51,204660,2209,,,,,,29120,27139,424,0,,,,,,12007,,0,231799,2594,,,,,231799,2594,,0 +"2020-08-21","IL",8066,7857,22,209,,,1526,0,,351,,0,,,,,121,217346,215929,2293,0,,,,,,,,0,3592919,51736,,,,,,0,3592919,51736 +"2020-08-21","IN",3208,2992,17,216,10132,10132,860,-13,2051,252,874115,11921,,,,,81,84317,,1040,0,,,,,90442,,,0,1370254,25173,,,,,958432,12961,1370254,25173 +"2020-08-21","KS",419,,8,,2159,2159,296,69,584,89,329459,5509,,,,203,24,36856,,966,0,,,,,,,,0,366315,6475,,,,,366315,6475,,0 +"2020-08-21","KY",864,858,8,6,4362,4362,590,13,1340,166,,0,,,,,,42265,39068,639,0,,,,,,9448,,0,745270,8703,45988,11940,,,,0,745270,8703 +"2020-08-21","LA",4687,4546,50,141,,,1051,0,,,1597087,18874,,,,,172,141720,141720,899,0,,,,,,118120,,0,1738807,19773,,,,,,0,1738807,19773 +"2020-08-21","MA",8901,8670,13,231,12245,12245,322,20,,66,1420121,26327,,,,,15,125216,115741,488,0,,,,,152702,102205,,0,2050871,41809,,,108011,74485,1535862,26758,2050871,41809 +"2020-08-21","MD",3674,3536,5,138,13823,13823,455,38,,102,1101368,15921,,103726,,,,102899,102899,670,0,,,9431,,121174,6047,,0,1722957,29386,,,113157,,1204267,16591,1722957,29386 +"2020-08-21","ME",129,128,1,1,407,407,7,2,,1,,0,8862,,,,1,4285,3847,32,0,467,,,,4730,3698,,0,218569,3558,9342,,,,,0,218569,3558 +"2020-08-21","MI",6634,6368,0,266,,,646,0,,173,,0,,,2321084,,95,104618,94697,0,0,,,,,134103,67778,,0,2455187,0,243222,,,,,0,2455187,0 +"2020-08-21","MN",1799,1753,8,46,6064,6064,296,45,1740,136,973404,10619,,,,,,68133,68133,825,0,,,,,,60920,1340850,18630,1340850,18630,,,,,1041537,11444,,0 +"2020-08-21","MO",1419,,2,,,,875,0,,,823142,9001,,63428,1099769,,114,72964,72964,1231,0,,,2633,,83699,,,0,1185535,12876,,,66061,,896106,10232,1185535,12876 +"2020-08-21","MP",2,2,0,,4,4,,0,,,12867,0,,,,,,54,54,0,0,,,,,,29,,0,12921,0,,,,,12920,0,16453,0 +"2020-08-21","MS",2214,2119,24,95,5127,5127,997,30,,264,453479,1302,,,,,152,76323,73826,874,0,,,,,,56577,,0,529802,2176,22662,,,,,0,527305,4567 +"2020-08-21","MT",89,,0,,363,363,97,6,,,,0,,,,,,6216,,144,0,,,,,,4798,,0,208627,1067,,,,,,0,208627,1067 +"2020-08-21","NC",2494,2494,29,,,,1015,0,,284,,0,,,,,,151912,151912,2008,0,,,,,,,,0,2008172,26022,,,,,,0,2008172,26022 +"2020-08-21","ND",136,,2,,491,491,54,13,139,15,177538,1993,7870,,,,,9458,9458,231,0,305,,,,,7841,408284,6527,408284,6527,8175,,,,184638,1994,421358,6855 +"2020-08-21","NE",373,,2,,1877,1877,146,26,,,302419,3051,,,395632,,,31348,,308,0,,,,,38378,23292,,0,434967,4421,,,,,334241,3537,434967,4421 +"2020-08-21","NH",428,,0,,710,710,11,0,220,,182632,0,,,,,,7050,,0,0,,,,,,6367,,0,290010,0,29490,,28924,,189682,0,290010,0 +"2020-08-21","NJ",15893,14112,9,1781,22393,22393,414,34,,61,2426875,30195,,,,,30,191887,188817,325,0,,,,,,,,0,2618762,30520,,,,,,0,2615692,30485 +"2020-08-21","NM",739,,5,,3018,3018,65,9,,,,0,,,,,,24095,,144,0,,,,,,11312,,0,704955,10131,,,,,,0,704955,10131 +"2020-08-21","NV",1185,,13,,,,807,0,,246,501878,4499,,,,,140,64433,64433,849,0,,,,,,,782167,6447,782167,6447,,,,,566236,5255,795264,8920 +"2020-08-21","NY",25278,,3,,89995,89995,490,0,,119,,0,,,,,58,428512,,709,0,,,,,,,7452267,98880,7452267,98880,,,,,,0,,0 +"2020-08-21","OH",3955,3675,26,280,12719,12719,849,104,2864,283,,0,,,,,156,113046,107064,1043,0,,,,,123613,92736,,0,2017451,27931,,,,,,0,2017451,27931 +"2020-08-21","OK",715,,6,,4316,4316,562,48,,246,749156,8931,,,749156,,,51746,51746,1077,0,2649,,,,59448,43417,,0,800902,10008,65475,,,,,0,810120,9904 +"2020-08-21","OR",412,,4,,1979,1979,175,21,,48,482202,4916,,,729344,,21,24165,,295,0,,,,,43000,4566,,0,772344,8390,,,,,505119,5204,772344,8390 +"2020-08-21","PA",7558,,20,,,,510,0,,,1399509,13438,,,,,93,127633,124031,693,0,,,,,,102106,2055649,24710,2055649,24710,,,,,1523540,14105,,0 +"2020-08-21","PR",374,240,7,134,,,392,0,,65,305972,0,,,303412,,42,13014,13014,438,0,15832,,,,7002,,,0,318986,438,,,,,,0,310546,0 +"2020-08-21","RI",1030,,2,,2438,2438,81,7,,9,224832,5940,,,424955,,5,21022,,151,0,,,,,30022,,454977,10403,454977,10403,,,,,245854,6091,,0 +"2020-08-21","SC",2459,2339,58,120,7439,7439,1079,293,,278,792803,9323,57478,,756128,,160,110378,109135,1058,0,4894,,,,145810,46118,,0,903181,10381,62372,,,,,0,901938,10312 +"2020-08-21","SD",159,,2,,948,948,50,8,,,122891,1474,,,,,,10884,,193,0,,,,,16837,9349,,0,171866,2500,,,,,133775,1667,171866,2500 +"2020-08-21","TN",1549,1508,61,41,6255,6255,1149,99,,359,,0,,,1811300,,171,140844,138015,1669,0,,,,,167109,102686,,0,1978409,29005,,,,,,0,1978409,29005 +"2020-08-21","TX",11051,,258,,,,5566,0,,1979,,0,,,,,,567580,567580,5021,0,26824,11394,,,716756,438825,,0,5155070,48584,338016,85045,,,,0,5155070,48584 +"2020-08-21","UT",383,,2,,2870,2870,155,17,737,58,571266,3629,,,712436,294,,48445,,463,0,,809,,756,53475,39867,,0,765911,5455,,3564,,2949,619215,4005,765911,5455 +"2020-08-21","VA",2436,2319,9,117,9071,9071,1233,73,,263,,0,,,,,142,110860,106177,978,0,8059,1326,,,128248,,1437278,18943,1437278,18943,124621,2869,,,,0,,0 +"2020-08-21","VI",10,,0,,,,,0,,,12895,222,,,,,,932,,63,0,,,,,,649,,0,13827,285,,,,,13915,352,,0 +"2020-08-21","VT",58,58,0,,,,10,0,,,114221,1339,,,,,,1540,1540,4,0,,,,,,1358,,0,154874,2115,,,,,115761,1343,154874,2115 +"2020-08-21","WA",1837,1837,15,,6400,6400,481,12,,,,0,,,,,48,71733,71302,628,0,,,,,,,1369264,12396,1369264,12396,,,,,,0,,0 +"2020-08-21","WI",1075,1068,1,7,5505,5505,350,36,982,119,1103038,9744,,,,,,73751,69059,848,0,,,,,,60055,1589087,17733,1589087,17733,,,,,1172097,10570,,0 +"2020-08-21","WV",170,169,4,1,,,146,0,,54,,0,,,,,24,9066,8890,84,0,,,,,,7140,,0,376973,6550,15442,,,,,0,376973,6550 +"2020-08-21","WY",37,,3,,203,203,19,1,,,61313,607,,,107703,,,3524,2994,56,0,,,,,3227,2864,,0,110930,849,,,,,64307,661,110930,849 +"2020-08-20","AK",29,29,0,,218,218,51,4,,,,0,,,307360,,6,4535,,83,0,,,,,4970,1513,,0,312647,1798,,,,,,0,312647,1798 +"2020-08-20","AL",1974,1905,30,69,13330,13330,1105,250,1348,,784330,10462,,,,734,,112449,107483,971,0,,,,,,44684,,0,891813,11161,,,,,891813,11161,,0 +"2020-08-20","AR",641,,10,,3790,3790,499,47,,,593744,6680,,,593744,488,108,54765,54765,549,0,,1085,,,,48458,,0,648509,7229,,7090,,,,0,648509,7229 +"2020-08-20","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-20","AZ",4684,4429,50,255,21143,21143,1070,123,,388,922163,6481,,,,,233,196280,194734,723,0,,,,,,,,0,1613909,17491,,,255456,,1116897,7173,1613909,17491 +"2020-08-20","CA",11686,,163,,,,6212,0,,1707,,0,,,,,,644751,644751,5920,0,,,,,,,,0,10227966,87283,,,,,,0,10227966,87283 +"2020-08-20","CO",1903,1559,3,344,6797,6797,238,13,,,594857,0,141188,,,,,54230,50627,329,0,10454,,,,,,906693,11486,906693,11486,151642,,,,651250,6080,,0 +"2020-08-20","CT",4458,3572,1,886,11087,11087,47,72,,,,0,,,1045227,,,51432,49402,118,0,,,,,63429,8893,,0,1110632,17816,,,,,,0,1110632,17816 +"2020-08-20","DC",601,,1,,,,78,0,,26,,0,,,,,12,13409,,55,0,,,,,,10720,253985,2326,253985,2326,,,,,162158,1613,,0 +"2020-08-20","DE",595,526,0,69,,,40,0,,10,200238,2012,,,,,,16718,15714,75,0,,,,,19902,8809,308995,2077,308995,2077,,,,,216956,2087,,0 +"2020-08-20","FL",10186,,119,,36070,36070,5067,450,,,3747150,24958,381574,375046,5070645,,,582407,576315,4516,0,27323,,26788,,753364,,5763199,66232,5763199,66232,408950,,401862,,4323688,29471,5856136,50464 +"2020-08-20","GA",4904,,55,,22880,22880,2506,216,4185,,,0,,,,,,246741,246741,2759,0,18832,,,,223540,,,0,2096835,21138,261409,,,,,0,2096835,21138 +"2020-08-20","GU",6,,1,,,,13,0,,5,29988,837,,,,,,704,696,105,0,2,,,,,381,,0,30692,942,155,,,,,0,30702,962 +"2020-08-20","HI",45,45,3,,317,317,187,14,,33,162828,2324,,,,,20,5844,,235,0,,,,,5596,2031,211731,3741,211731,3741,,,,,168672,2559,219986,3866 +"2020-08-20","IA",1014,,8,,,,300,0,,89,514176,5142,,42632,,,31,54015,54015,727,0,,,2955,,,42372,,0,568191,5869,,,45627,,581522,10114,,0 +"2020-08-20","ID",291,264,9,27,1200,1200,205,30,337,43,202451,1654,,,,,,28696,26754,370,0,,,,,,11733,,0,229205,1977,,,,,229205,1977,,0 +"2020-08-20","IL",8044,7833,27,211,,,1519,0,,357,,0,,,,,124,215053,213721,1832,0,,,,,,,,0,3541183,51612,,,,,,0,3541183,51612 +"2020-08-20","IN",3191,2979,11,212,10145,10145,921,55,2069,257,862194,10497,,,,,78,83277,,941,0,,,,,89402,,,0,1345081,26649,,,,,945471,11438,1345081,26649 +"2020-08-20","KS",411,,0,,2090,2090,300,0,567,88,323950,0,,,,202,26,35890,,0,0,,,,,,,,0,359840,0,,,,,359840,0,,0 +"2020-08-20","KY",856,850,14,6,4349,4349,638,48,1337,155,,0,,,,,,41626,38475,700,0,,,,,,9388,,0,736567,8825,45909,11806,,,,0,736567,8825 +"2020-08-20","LA",4637,4496,28,141,,,1087,0,,,1578213,13142,,,,,178,140821,140821,918,0,,,,,,118120,,0,1719034,14060,,,,,,0,1719034,14060 +"2020-08-20","MA",8888,8657,12,231,12225,12225,379,12,,62,1393794,21569,,,,,23,124728,115310,313,0,,,,,152204,102205,,0,2009062,34144,,,107203,72890,1509104,21831,2009062,34144 +"2020-08-20","MD",3669,3531,8,138,13785,13785,455,41,,107,1085447,11328,,103726,,,,102229,102229,580,0,,,9431,,120372,6040,,0,1693571,18041,,,113157,,1187676,11908,1693571,18041 +"2020-08-20","ME",128,127,1,1,405,405,7,2,,1,,0,8838,,,,1,4253,3812,19,0,460,,,,4693,3679,,0,215011,2661,9311,,,,,0,215011,2661 +"2020-08-20","MI",6634,6368,16,266,,,646,0,,173,,0,,,2321084,,81,104618,94697,527,0,,,,,134103,67778,,0,2455187,31183,243222,,,,,0,2455187,31183 +"2020-08-20","MN",1791,1745,7,46,6019,6019,309,31,1734,148,962785,8477,,,,,,67308,67308,690,0,,,,,,60605,1322220,13956,1322220,13956,,,,,1030093,9167,,0 +"2020-08-20","MO",1417,,3,,,,875,0,,,814141,10021,,63096,1088054,,114,71733,71733,1058,0,,,2606,,82566,,,0,1172659,14215,,,65702,,885874,11079,1172659,14215 +"2020-08-20","MP",2,2,0,,4,4,,0,,,12867,1,,,,,,54,54,0,0,,,,,,29,,0,12921,1,,,,,12920,0,16453,0 +"2020-08-20","MS",2190,2100,27,90,5097,5097,1025,34,,276,452177,0,,,,,176,75449,73085,894,0,,,,,,56577,,0,527626,894,18516,,,,,0,522738,0 +"2020-08-20","MT",89,,5,,357,357,101,9,,,,0,,,,,,6072,,116,0,,,,,,4434,,0,207560,1027,,,,,,0,207560,1027 +"2020-08-20","NC",2465,2465,34,,,,1023,0,,280,,0,,,,,,149904,149904,1972,0,,,,,,,,0,1982150,25739,,,,,,0,1982150,25739 +"2020-08-20","ND",134,,0,,478,478,45,0,136,15,175545,1987,7836,,,,,9227,9227,274,0,300,,,,,7718,401757,7454,401757,7454,8136,,,,182644,2264,414503,7729 +"2020-08-20","NE",371,,3,,1851,1851,156,16,,,299368,1815,,,391534,,,31040,,215,0,,,,,38056,22941,,0,430546,4157,,,,,330704,2031,430546,4157 +"2020-08-20","NH",428,,1,,710,710,11,-2,220,,182632,1659,,,,,,7050,,14,0,,,,,,6367,,0,290010,2936,29490,,28924,,189682,1673,290010,2936 +"2020-08-20","NJ",15884,14103,6,1781,22359,22359,433,48,,79,2396680,27395,,,,,28,191562,188527,141,0,,,,,,,,0,2588242,27536,,,,,,0,2585207,27495 +"2020-08-20","NM",734,,5,,3009,3009,74,7,,,,0,,,,,,23951,,202,0,,,,,,11145,,0,694824,6329,,,,,,0,694824,6329 +"2020-08-20","NV",1172,,38,,,,874,0,,263,497379,3881,,,,,152,63584,63584,556,0,,,,,,,775720,7724,775720,7724,,,,,560981,4545,786344,17046 +"2020-08-20","NY",25275,,5,,89995,89995,518,0,,120,,0,,,,,62,427803,,601,0,,,,,,,7353387,80984,7353387,80984,,,,,,0,,0 +"2020-08-20","OH",3929,3650,22,279,12615,12615,860,86,2844,294,,0,,,,,169,112003,106063,1122,0,,,,,122396,91656,,0,1989520,27887,,,,,,0,1989520,27887 +"2020-08-20","OK",709,,10,,4268,4268,564,76,,248,740225,7408,,,740225,,,50669,50669,746,0,2649,,,,58523,42695,,0,790894,8154,65475,,,,,0,800216,8272 +"2020-08-20","OR",408,,11,,1958,1958,203,29,,51,477286,4624,,,721317,,16,23870,,194,0,,,,,42637,4468,,0,763954,8767,,,,,499915,4801,763954,8767 +"2020-08-20","PA",7538,,15,,,,548,0,,,1386071,17753,,,,,94,126940,123364,791,0,,,,,,101552,2030939,28404,2030939,28404,,,,,1509435,18512,,0 +"2020-08-20","PR",367,236,11,131,,,390,0,,57,305972,0,,,303412,,37,12576,12576,124,0,15567,,,,7002,,,0,318548,124,,,,,,0,310546,0 +"2020-08-20","RI",1028,,1,,2431,2431,84,12,,8,218892,-18627,,,414743,,4,20871,,76,0,,,,,29831,,444574,4447,444574,4447,,,,,239763,-18551,,0 +"2020-08-20","SC",2401,2289,41,112,7146,7146,1108,0,,272,783480,7763,57120,,747254,,170,109320,108146,909,0,4812,,,,144372,45205,,0,892800,8672,61932,,,,,0,891626,8635 +"2020-08-20","SD",157,,2,,940,940,53,5,,,121417,936,,,,,,10691,,125,0,,,,,16632,9265,,0,169366,1879,,,,,132108,1061,169366,1879 +"2020-08-20","TN",1488,1447,36,41,6156,6156,1194,87,,385,,0,,,1784417,,177,139175,136476,1375,0,,,,,164987,100967,,0,1949404,23047,,,,,,0,1949404,23047 +"2020-08-20","TX",10793,,234,,,,5635,0,,1979,,0,,,,,,562559,562559,5303,0,26337,11309,,,712183,431960,,0,5106486,45900,335184,83528,,,,0,5106486,45900 +"2020-08-20","UT",381,,4,,2853,2853,157,21,732,62,567637,4326,,,707399,292,,47982,,461,0,,788,,737,53057,39364,,0,760456,6881,,3368,,2784,615210,4807,760456,6881 +"2020-08-20","VA",2427,2310,17,117,8998,8998,1266,73,,276,,0,,,,,148,109882,105289,863,0,7996,1296,,,126909,,1418335,15864,1418335,15864,123789,2786,,,,0,,0 +"2020-08-20","VI",10,,1,,,,,0,,,12673,156,,,,,,869,,41,0,,,,,,623,,0,13542,197,,,,,13563,203,,0 +"2020-08-20","VT",58,58,0,,,,10,0,,,112882,1638,,,,,,1536,1536,4,0,,,,,,1356,,0,152759,2615,,,,,114418,1642,152759,2615 +"2020-08-20","WA",1822,1822,13,,6388,6388,498,30,,,,0,,,,,44,71105,70699,624,0,,,,,,,1356868,12825,1356868,12825,,,,,,0,,0 +"2020-08-20","WI",1074,1067,7,7,5469,5469,367,39,978,120,1093294,9131,,,,,,72903,68233,769,0,,,,,,59076,1571354,20737,1571354,20737,,,,,1161527,9871,,0 +"2020-08-20","WV",166,165,0,1,,,140,0,,52,,0,,,,,18,8982,8806,181,0,,,,,,7010,,0,370423,7841,15352,,,,,0,370423,7841 +"2020-08-20","WY",34,,0,,202,202,18,5,,,60706,1042,,,106883,,,3468,2940,38,0,,,,,3198,2832,,0,110081,1276,,,,,63646,1073,110081,1276 +"2020-08-19","AK",29,29,0,,214,214,56,6,,,,0,,,305582,,6,4452,,73,0,,,,,4950,1501,,0,310849,840,,,,,,0,310849,840 +"2020-08-19","AL",1944,1876,8,68,13080,13080,1198,122,1336,,773868,15970,,,,731,,111478,106784,1117,0,,,,,,41523,,0,880652,16939,,,,,880652,16939,,0 +"2020-08-19","AR",631,,12,,3743,3743,499,48,,,587064,7489,,,587064,483,114,54216,54216,729,0,,1085,,,,47666,,0,641280,8628,,7090,,,,0,641280,8628 +"2020-08-19","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-19","AZ",4634,4378,105,256,21020,21020,1160,142,,414,915682,6605,,,,,250,195557,194042,637,0,,,,,,,,0,1596418,17636,,,254062,,1109724,7231,1596418,17636 +"2020-08-19","CA",11523,,181,,,,6479,0,,1761,,0,,,,,,638831,638831,6164,0,,,,,,,,0,10140683,91644,,,,,,0,10140683,91644 +"2020-08-19","CO",1900,1556,1,344,6784,6784,238,3,,,594857,4657,140525,,,,,53901,50313,270,0,10406,,,,,,895207,7348,895207,7348,150931,,,,645170,4920,,0 +"2020-08-19","CT",4457,3572,1,885,11015,11015,49,0,,,,0,,,1027593,,,51314,49289,59,0,,,,,63260,8809,,0,1092816,16997,,,,,,0,1092816,16997 +"2020-08-19","DC",600,,1,,,,84,0,,30,,0,,,,,14,13354,,29,0,,,,,,10596,251659,2181,251659,2181,,,,,160545,602,,0 +"2020-08-19","DE",595,526,2,69,,,32,0,,7,198226,974,,,,,,16643,15639,50,0,,,,,19858,8780,306918,2936,306918,2936,,,,,214869,1024,,0 +"2020-08-19","FL",10067,,174,,35620,35620,5298,508,,,3722192,23084,381574,375046,5027142,,,577891,572079,4080,0,27323,,26788,,746905,,5696967,57826,5696967,57826,408950,,401862,,4294217,27352,5805672,48598 +"2020-08-19","GA",4849,,55,,22664,22664,2573,235,4143,,,0,,,,,,243982,243982,2305,0,18600,,,,221593,,,0,2075697,15378,259422,,,,,0,2075697,15378 +"2020-08-19","GU",5,,0,,,,14,0,,4,29151,502,,,,,,599,591,22,0,2,,,,,363,,0,29750,524,155,,,,,0,29740,524 +"2020-08-19","HI",42,42,2,,303,303,205,15,,39,160504,1520,,,,,22,5609,,394,0,,,,,5341,1977,207990,2719,207990,2719,,,,,166113,1914,216120,6591 +"2020-08-19","IA",1006,,17,,,,299,0,,90,509034,4887,,42108,,,33,53288,53288,337,0,,,2942,,,41837,,0,562322,5224,,,45090,,571408,6269,,0 +"2020-08-19","ID",282,255,9,27,1170,1170,167,41,328,37,200797,1870,,,,,,28326,26431,384,0,,,,,,11397,,0,227228,2210,,,,,227228,2210,,0 +"2020-08-19","IL",8017,7806,24,211,,,1519,0,,334,,0,,,,,144,213221,211889,2295,0,,,,,,,,0,3489571,50299,,,,,,0,3489571,50299 +"2020-08-19","IN",3180,2968,15,212,10090,10090,842,53,2059,249,851697,4930,,,,,88,82336,,489,0,,,,,88272,,,0,1318432,27130,,,,,934033,5419,1318432,27130 +"2020-08-19","KS",411,,6,,2090,2090,300,56,567,88,323950,4855,,,,202,26,35890,,723,0,,,,,,,,0,359840,5578,,,,,359840,5578,,0 +"2020-08-19","KY",842,836,12,6,4301,4301,640,49,1332,155,,0,,,,,,40926,37848,627,0,,,,,,9331,,0,727742,3837,45847,11549,,,,0,727742,3837 +"2020-08-19","LA",4609,4468,55,141,,,1160,0,,,1565071,14205,,,,,175,139903,139903,778,0,,,,,,118120,,0,1704974,14983,,,,,,0,1704974,14983 +"2020-08-19","MA",8876,8645,37,231,12213,12213,365,21,,66,1372225,19246,,,,,27,124415,115048,827,0,,,,,151869,102205,,0,1974918,28401,,,106540,72330,1487273,19508,1974918,28401 +"2020-08-19","MD",3661,3522,11,139,13744,13744,475,46,,107,1074119,8049,,103726,,,,101649,101649,414,0,,,9431,,119743,6030,,0,1675530,13829,,,113157,,1175768,8463,1675530,13829 +"2020-08-19","ME",127,126,0,1,403,403,9,2,,2,,0,8813,,,,1,4234,3799,21,0,459,,,,4682,3662,,0,212350,2816,9285,,,,,0,212350,2816 +"2020-08-19","MI",6618,6349,10,269,,,653,0,,169,,0,,,2291097,,82,104091,94278,688,0,,,,,132907,67778,,0,2424004,32955,240643,,,,,0,2424004,32955 +"2020-08-19","MN",1784,1738,17,46,5988,5988,321,56,1727,152,954308,17063,,,,,,66618,66618,557,0,,,,,,60242,1308264,34867,1308264,34867,,,,,1020926,17620,,0 +"2020-08-19","MO",1414,,12,,,,875,0,,,804120,6056,,62737,1075226,,114,70675,70675,1258,0,,,2576,,81200,,,0,1158444,7807,,,65313,,874795,7314,1158444,7807 +"2020-08-19","MP",2,2,0,,4,4,,0,,,12866,0,,,,,,54,54,0,0,,,,,,29,,0,12920,0,,,,,12920,0,16453,0 +"2020-08-19","MS",2163,2077,35,86,5063,5063,1073,38,,286,452177,0,,,,,160,74555,72418,1348,0,,,,,,56577,,0,526732,1348,18516,,,,,0,522738,0 +"2020-08-19","MT",84,,0,,348,348,102,9,,,,0,,,,,,5956,,110,0,,,,,,4357,,0,206533,1021,,,,,,0,206533,1021 +"2020-08-19","NC",2431,2431,35,,,,1001,0,,306,,0,,,,,,147932,147932,1153,0,,,,,,,,0,1956411,10893,,,,,,0,1956411,10893 +"2020-08-19","ND",134,,2,,478,478,49,9,136,15,173558,1412,7805,,,,,8953,8953,188,0,300,,,,,7629,394303,4685,394303,4685,8105,,,,180380,1549,406774,4865 +"2020-08-19","NE",368,,6,,1835,1835,160,-48,,,297553,2629,,,387702,,,30825,,262,0,,,,,37738,22798,,0,426389,4159,,,,,328673,2891,426389,4159 +"2020-08-19","NH",427,,3,,712,712,12,0,220,,180973,1083,,,,,,7036,,19,0,,,,,,6347,,0,287074,2317,29398,,28837,,188009,1102,287074,2317 +"2020-08-19","NJ",15878,14097,11,1781,22311,22311,471,52,,92,2369285,24638,,,,,32,191421,188427,382,0,,,,,,,,0,2560706,25020,,,,,,0,2557712,24967 +"2020-08-19","NM",729,,6,,3002,3002,94,4,,,,0,,,,,,23749,,170,0,,,,,,10976,,0,688495,5442,,,,,,0,688495,5442 +"2020-08-19","NV",1134,,32,,,,867,0,,262,493498,2209,,,,,160,63028,63028,389,0,,,,,,,767996,9745,767996,9745,,,,,556436,2528,769298,6584 +"2020-08-19","NY",25270,,6,,89995,89995,548,0,,131,,0,,,,,60,427202,,631,0,,,,,,,7272403,80425,7272403,80425,,,,,,0,,0 +"2020-08-19","OH",3907,3627,36,280,12529,12529,894,93,2827,296,,0,,,,,164,110881,104999,958,0,,,,,121331,90436,,0,1961633,20070,,,,,,0,1961633,20070 +"2020-08-19","OK",699,,17,,4192,4192,566,77,,250,732817,7143,,,732817,,,49923,49923,597,0,2649,,,,57679,42047,,0,782740,7740,65475,,,,,0,791944,7726 +"2020-08-19","OR",397,,9,,1929,1929,214,16,,54,472662,4896,,,712957,,20,23676,,225,0,,,,,42230,4468,,0,755187,8247,,,,,495114,5114,755187,8247 +"2020-08-19","PA",7523,,24,,,,548,0,,,1368318,14331,,,,,94,126149,122605,570,0,,,,,,99657,2002535,24337,2002535,24337,,,,,1490923,14886,,0 +"2020-08-19","PR",356,225,10,131,,,361,0,,58,305972,0,,,303412,,39,12452,12452,81,0,15482,,,,7002,,,0,318424,81,,,,,,0,310546,0 +"2020-08-19","RI",1027,,3,,2419,2419,82,14,,8,237519,22048,,,410389,,5,20795,,103,0,,,,,29738,,440127,3936,440127,3936,,,,,258314,22151,,0 +"2020-08-19","SC",2360,2248,17,112,7146,7146,1168,0,,293,775717,4908,56762,,740152,,164,108411,107274,739,0,4795,,,,142839,45205,,0,884128,5647,61557,,,,,0,882991,5608 +"2020-08-19","SD",155,,1,,935,935,55,8,,,120481,911,,,,,,10566,,123,0,,,,,16495,9189,,0,167487,1447,,,,,131047,1034,167487,1447 +"2020-08-19","TN",1452,1412,26,40,6069,6069,1230,88,,375,,0,,,1763069,,171,137800,135203,2022,0,,,,,163288,99085,,0,1926357,34482,,,,,,0,1926357,34482 +"2020-08-19","TX",10559,,309,,,,5974,0,,2107,,0,,,,,,557256,557256,7024,0,25995,11208,,,707914,424685,,0,5060586,47293,333355,81646,,,,0,5060586,47293 +"2020-08-19","UT",377,,8,,2832,2832,158,28,727,63,563311,4284,,,701034,289,,47521,,364,0,,774,,723,52541,38883,,0,753575,6595,,3158,,2614,610403,4657,753575,6595 +"2020-08-19","VA",2410,2293,14,117,8925,8925,1243,76,,280,,0,,,,,145,109019,104475,737,0,7928,1265,,,125862,,1402471,16639,1402471,16639,122863,2682,,,,0,,0 +"2020-08-19","VI",9,,0,,,,,0,,,12517,649,,,,,,828,,32,0,,,,,,584,,0,13345,681,,,,,13360,664,,0 +"2020-08-19","VT",58,58,0,,,,12,0,,,111244,777,,,,,,1532,1532,2,0,,,,,,1354,,0,150144,1298,,,,,112776,779,150144,1298 +"2020-08-19","WA",1809,1809,24,,6358,6358,481,62,,,,0,,,,,43,70481,70088,670,0,,,,,,,1344043,14827,1344043,14827,,,,,,0,,0 +"2020-08-19","WI",1067,1060,8,7,5430,5430,388,50,975,121,1084163,8766,,,,,,72134,67493,710,0,,,,,,58244,1550617,16846,1550617,16846,,,,,1151656,9429,,0 +"2020-08-19","WV",166,165,2,1,,,133,0,,46,,0,,,,,22,8801,8623,70,0,,,,,,6909,,0,362582,3954,15246,,,,,0,362582,3954 +"2020-08-19","WY",34,,0,,197,197,12,4,,,59664,586,,,105633,,,3430,2909,67,0,,,,,3172,2786,,0,108805,1408,,,,,62573,645,108805,1408 +"2020-08-18","AK",29,29,1,,208,208,47,2,,,,0,,,304767,,7,4379,,66,0,,,,,4925,1468,,0,310009,4361,,,,,,0,310009,4361 +"2020-08-18","AL",1936,1867,11,69,12958,12958,1280,0,1329,,757898,13979,,,,729,,110361,105815,1357,0,,,,,,41523,,0,863713,15199,,,,,863713,15199,,0 +"2020-08-18","AR",619,,16,,3695,3695,492,74,,,579575,10190,,,579575,478,122,53487,53487,410,0,,1085,,,,46970,,0,632652,10602,,7090,,,,0,632652,10602 +"2020-08-18","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-18","AZ",4529,4273,23,256,20878,20878,1167,122,,427,909077,4694,,,,,260,194920,193416,915,0,,,,,,,,0,1578782,17732,,,253264,,1102493,5596,1578782,17732 +"2020-08-18","CA",11342,,100,,,,6360,0,,1801,,0,,,,,,632667,632667,4636,0,,,,,,,,0,10049039,115259,,,,,,0,10049039,115259 +"2020-08-18","CO",1899,1555,3,344,6781,6781,262,42,,,590200,3920,140148,,,,,53631,50050,261,0,10372,,,,,,887859,6607,887859,6607,150520,,,,640250,4169,,0 +"2020-08-18","CT",4456,3571,0,885,11015,11015,47,0,,,,0,,,1010780,,,51255,49236,-12,0,,,,,63083,8809,,0,1075819,19513,,,,,,0,1075819,19513 +"2020-08-18","DC",599,,2,,,,79,0,,27,,0,,,,,14,13325,,52,0,,,,,,10595,249478,3823,249478,3823,,,,,159943,1624,,0 +"2020-08-18","DE",593,524,0,69,,,32,0,,7,197252,1150,,,,,,16593,15589,57,0,,,,,19772,8749,303982,3260,303982,3260,,,,,213845,1207,,0 +"2020-08-18","FL",9893,,219,,35112,35112,5484,505,,,3699108,22326,381574,375046,4984524,,,573811,568161,3787,0,27323,,26788,,741276,,5639141,48228,5639141,48228,408950,,401862,,4266865,26095,5757074,43671 +"2020-08-18","GA",4794,,67,,22429,22429,2596,296,4117,,,0,,,,,,241677,241677,2816,0,18507,,,,219987,,,0,2060319,30617,258672,,,,,0,2060319,30617 +"2020-08-18","GU",5,,0,,,,14,0,,4,28649,434,,,,,,577,569,19,0,2,,,,,353,,0,29226,453,155,,,,,0,29216,453 +"2020-08-18","HI",40,40,0,,288,288,175,5,,35,158984,2078,,,,,25,5215,,173,0,,,,,5193,1868,205271,3246,205271,3246,,,,,164199,2251,209529,2992 +"2020-08-18","IA",989,,8,,,,287,0,,86,504147,2885,,41721,,,35,52951,52951,229,0,,,2928,,,41565,,0,557098,3114,,,44689,,565139,3377,,0 +"2020-08-18","ID",273,245,4,28,1129,1129,167,19,316,37,198927,2100,,,,,,27942,26091,282,0,,,,,,11093,,0,225018,2350,,,,,225018,2350,,0 +"2020-08-18","IL",7993,7782,26,211,,,1510,0,,335,,0,,,,,128,210926,209594,1740,0,,,,,,,,0,3439272,34175,,,,,,0,3439272,34175 +"2020-08-18","IN",3165,2954,30,211,10037,10037,849,64,2052,251,846767,13140,,,,,94,81847,,841,0,,,,,87119,,,0,1291302,26269,,,,,928614,13981,1291302,26269 +"2020-08-18","KS",405,,0,,2034,2034,229,0,560,62,319095,0,,,,200,24,35167,,0,0,,,,,,,,0,354262,0,,,,,354262,0,,0 +"2020-08-18","KY",830,825,12,5,4252,4252,622,37,1320,147,,0,,,,,,40299,37304,608,0,,,,,,9233,,0,723905,9956,45757,720,,,,0,723905,9956 +"2020-08-18","LA",4554,4431,28,123,,,1204,0,,,1550866,15062,,,,,187,139125,139125,640,0,,,,,,103512,,0,1689991,15702,,,,,,0,1689991,15702 +"2020-08-18","MA",8839,8617,6,222,12192,12192,374,14,,66,1352979,11478,,,,,23,123588,114786,175,0,,,,,151543,100486,,0,1946517,16626,,,105874,70597,1467765,11653,1946517,16626 +"2020-08-18","MD",3650,3511,9,139,13698,13698,453,40,,102,1066070,9173,,100282,,,,101235,101235,520,0,,,9051,,119238,6008,,0,1661701,16059,,,109333,,1167305,9693,1661701,16059 +"2020-08-18","ME",127,126,0,1,401,401,10,2,,5,,0,8799,,,,1,4213,3781,16,0,456,,,,4658,3649,,0,209534,1692,9268,,,,,0,209534,1692 +"2020-08-18","MI",6608,6340,16,268,,,653,0,,169,,0,,,2259122,,89,103403,93662,654,0,,,,,131927,67778,,0,2391049,22267,239798,,,,,0,2391049,22267 +"2020-08-18","MN",1767,1721,9,46,5932,5932,304,46,1722,154,937245,2938,,,,,,66061,66061,345,0,,,,,,59568,1273397,6836,1273397,6836,,,,,1003306,3283,,0 +"2020-08-18","MO",1402,,6,,,,891,0,,,798064,8070,,62504,1068096,,116,69417,69417,794,0,,,2564,,80526,,,0,1150637,11747,,,65068,,867481,8864,1150637,11747 +"2020-08-18","MP",2,,0,,4,4,,0,,,12866,-1,,,,,,54,54,1,0,,,,,,29,,0,12920,0,,,,,12920,0,16453,0 +"2020-08-18","MS",2128,2046,33,82,5025,5025,1090,36,,284,452177,0,,,,,163,73207,71254,795,0,,,,,,56577,,0,525384,795,18516,,,,,0,522738,0 +"2020-08-18","MT",84,,2,,339,339,97,9,,,,0,,,,,,5846,,54,0,,,,,,4206,,0,205512,787,,,,,,0,205512,787 +"2020-08-18","NC",2396,2396,48,,,,1026,0,,313,,0,,,,,,146779,146779,1263,0,,,,,,,,0,1945518,13862,,,,,,0,1945518,13862 +"2020-08-18","ND",132,,2,,469,469,47,8,,,172146,374,7767,,,,,8765,8765,133,0,298,,,,,7485,389618,1784,389618,1784,8065,,,,178831,818,401909,1874 +"2020-08-18","NE",362,,1,,1883,1883,158,0,,,294924,2305,,,383848,,,30563,,191,0,,,,,37435,22647,,0,422230,2184,,,,,325782,2495,422230,2184 +"2020-08-18","NH",424,,1,,712,712,12,3,220,,179890,923,,,,,,7017,,13,0,,,,,,6333,,0,284757,1624,29339,,28782,,186907,936,284757,1624 +"2020-08-18","NJ",15867,14086,10,1781,22259,22259,468,41,,106,2344647,21344,,,,,41,191039,188098,380,0,,,,,,,,0,2535686,21724,,,,,,0,2532745,21675 +"2020-08-18","NM",723,,5,,2998,2998,111,14,,,,0,,,,,,23579,,79,0,,,,,,10802,,0,683053,5903,,,,,,0,683053,5903 +"2020-08-18","NV",1102,,25,,,,903,0,,267,491289,1833,,,,,165,62639,62639,672,0,,,,,,,758251,8280,758251,8280,,,,,553908,2138,762714,3602 +"2020-08-18","NY",25264,,8,,89995,89995,537,0,,126,,0,,,,,60,426571,,655,0,,,,,,,7191978,66891,7191978,66891,,,,,,0,,0 +"2020-08-18","OH",3871,3592,39,279,12436,12436,934,117,2805,314,,0,,,,,172,109923,104105,861,0,,,,,120642,89068,,0,1941563,18366,,,,,,0,1941563,18366 +"2020-08-18","OK",682,,17,,4115,4115,568,94,,240,725674,19055,,,725674,,,49326,49326,615,0,2649,,,,57102,41370,,0,775000,19670,65475,,,,,0,784218,21319 +"2020-08-18","OR",388,,0,,1913,1913,206,50,,47,467766,2231,,,705105,,19,23451,,189,0,,,,,41835,4419,,0,746940,3680,,,,,490000,18065,746940,3680 +"2020-08-18","PA",7499,,31,,,,548,0,,,1353987,11512,,,,,94,125579,122050,735,0,,,,,,99207,1978198,21437,1978198,21437,,,,,1476037,12208,,0 +"2020-08-18","PR",346,216,11,130,,,392,0,,62,305972,0,,,303412,,45,12371,12371,648,0,15342,,,,7002,,,0,318343,648,,,,,,0,310546,0 +"2020-08-18","RI",1024,,1,,2405,2405,78,25,,8,215471,2221,,,406669,,4,20692,,120,0,,,,,29522,,436191,5186,436191,5186,,,,,236163,2341,,0 +"2020-08-18","SC",2343,2230,55,113,7146,7146,1116,294,,294,770809,4215,56573,,735556,,173,107672,106574,719,0,4738,,,,141827,45205,,0,878481,4934,61311,,,,,0,877383,4884 +"2020-08-18","SD",154,,1,,927,927,68,6,,,119570,637,,,,,,10443,,83,0,,,,,16380,9126,,0,166040,946,,,,,130013,720,166040,946 +"2020-08-18","TN",1426,1386,39,40,5981,5981,1231,100,,384,,0,,,1731083,,183,135778,133281,1034,0,,,,,160792,96896,,0,1891875,23114,,,,,,0,1891875,23114 +"2020-08-18","TX",10250,,216,,,,6210,0,,2179,,0,,,,,,550232,550232,7282,0,24732,11113,,,703631,415903,,0,5013293,49414,326216,79761,,,,0,5013293,49414 +"2020-08-18","UT",369,,5,,2804,2804,183,22,718,61,559027,3718,,,694836,288,,47157,,263,0,,765,,714,52144,38555,,0,746980,5507,,3000,,2491,605746,4037,746980,5507 +"2020-08-18","VA",2396,2278,11,118,8849,8849,1253,82,,300,,0,,,,,163,108282,103809,861,0,7889,1220,,,125049,,1385832,16795,1385832,16795,122457,2576,,,,0,,0 +"2020-08-18","VI",9,,0,,,,,0,,,11868,210,,,,,,796,,36,0,,,,,,533,,0,12664,246,,,,,12696,267,,0 +"2020-08-18","VT",58,58,0,,,,17,0,,,110467,755,,,,,,1530,1530,3,0,,,,,,1347,,0,148846,1186,,,,,111997,758,148846,1186 +"2020-08-18","WA",1785,1785,4,,6296,6296,475,41,,,,0,,,,,39,69811,69429,164,0,,,,,,,1329216,15101,1329216,15101,,,,,,0,,0 +"2020-08-18","WI",1059,1052,13,7,5380,5380,380,53,964,109,1075397,9357,,,,,,71424,66830,709,0,,,,,,57382,1533771,9880,1533771,9880,,,,,1142227,9991,,0 +"2020-08-18","WV",164,163,4,1,,,132,0,,50,,0,,,,,21,8731,8557,99,0,,,,,,6737,,0,358628,4779,15215,,,,,0,358628,4779 +"2020-08-18","WY",34,,1,,193,193,12,-2,,,59078,1511,,,104256,,,3363,2850,32,0,,,,,3141,2759,,0,107397,1578,,,,,61928,1532,107397,1578 +"2020-08-17","AK",28,28,0,,206,206,33,3,,,,0,,,300493,,4,4313,,50,0,,,,,4838,1432,,0,305648,4133,,,,,,0,305648,4133 +"2020-08-17","AL",1925,1855,27,70,12958,12958,1301,351,1319,,743919,5928,,,,720,,109004,104595,571,0,,,,,,41523,,0,848514,6444,,,,,848514,6444,,0 +"2020-08-17","AR",603,,4,,3621,3621,486,51,,,569385,0,,,569385,472,120,53077,53077,412,0,,1085,,,,46133,,0,622050,0,,7090,,,,0,622050,0 +"2020-08-17","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-17","AZ",4506,4252,0,254,20756,20756,1182,1,,430,904383,5946,,,,,266,194005,192514,468,0,,,,,,,,0,1561050,7165,,,252860,,1096897,6398,1561050,7165 +"2020-08-17","CA",11242,,18,,,,6332,0,,1811,,0,,,,,,628031,628031,6469,0,,,,,,,,0,9933780,135645,,,,,,0,9933780,135645 +"2020-08-17","CO",1896,1552,0,344,6739,6739,245,4,,,586280,4883,139731,,,,,53370,49801,194,0,10349,,,,,,881252,8201,881252,8201,150080,,,,636081,5073,,0 +"2020-08-17","CT",4456,3572,3,884,11015,11015,42,0,,,,0,,,991454,,,51267,49251,370,0,,,,,62901,8809,,0,1056306,9210,,,,,,0,1056306,9210 +"2020-08-17","DC",597,,0,,,,82,0,,30,,0,,,,,15,13273,,53,0,,,,,,10521,245655,2803,245655,2803,,,,,158319,1727,,0 +"2020-08-17","DE",593,524,0,69,,,29,0,,7,196102,2168,,,,,,16536,15532,85,0,,,,,19701,8713,300722,2769,300722,2769,,,,,212638,2253,,0 +"2020-08-17","FL",9674,,87,,34607,34607,5631,266,,,3676782,17570,381574,375046,4946578,,,570024,564528,2649,0,27323,,26788,,735900,,5590913,32572,5590913,32572,408950,,401862,,4240770,20238,5713403,33497 +"2020-08-17","GA",4727,,25,,22133,22133,2626,46,4061,,,0,,,,,,238861,238861,1831,0,18393,,,,217481,,,0,2029702,24429,257747,,,,,0,2029702,24429 +"2020-08-17","GU",5,,0,,,,13,0,,4,28215,958,,,,,,558,550,42,0,2,,,,,352,,0,28773,1000,155,,,,,0,28763,1677 +"2020-08-17","HI",40,40,0,,283,283,143,4,,35,156906,2432,,,,,25,5042,,217,0,,,,,5017,1841,202025,3840,202025,3840,,,,,161948,2649,206537,3784 +"2020-08-17","IA",981,,6,,,,283,0,,85,501262,2497,,41418,,,33,52722,52722,294,0,,,2919,,,40788,,0,553984,2791,,,44376,,561762,2809,,0 +"2020-08-17","ID",269,241,0,28,1110,1110,206,7,313,38,196827,1082,,,,,,27660,25841,183,0,,,,,,10883,,0,222668,1262,,,,,222668,1262,,0 +"2020-08-17","IL",7967,7756,12,211,,,1544,0,,340,,0,,,,,126,209186,207854,1773,0,,,,,,,,0,3405097,38246,,,,,,0,3405097,38246 +"2020-08-17","IN",3135,2926,2,209,9973,9973,900,38,2033,262,833627,7191,,,,,95,81006,,591,0,,,,,85778,,,0,1265033,7721,,,,,914633,7782,1265033,7721 +"2020-08-17","KS",405,,3,,2034,2034,229,14,560,62,319095,9937,,,,200,24,35167,,1282,0,,,,,,,,0,354262,11219,,,,,354262,11219,,0 +"2020-08-17","KY",818,813,5,5,4215,4215,563,22,1310,136,,0,,,,,,39691,36824,376,0,,,,,,9158,,0,713949,4786,45353,720,,,,0,713949,4786 +"2020-08-17","LA",4526,4403,19,123,,,1226,0,,,1535804,15635,,,,,184,138485,138485,567,0,,,,,,103512,,0,1674289,16202,,,,,,0,1674289,16202 +"2020-08-17","MA",8833,8611,4,222,12178,12178,367,5,,59,1341501,14733,,,,,22,123413,114611,213,0,,,,,151327,100486,,0,1929891,21416,,,105540,69018,1456112,14946,1929891,21416 +"2020-08-17","MD",3641,3504,2,137,13658,13658,435,44,,106,1056897,14699,,100282,,,,100715,100715,503,0,,,9051,,118601,6008,,0,1645642,34401,,,109333,,1157612,15202,1645642,34401 +"2020-08-17","ME",127,126,0,1,399,399,10,-1,,3,,0,8791,,,,1,4197,3767,29,0,456,,,,4648,3638,,0,207842,2218,9260,,,,,0,207842,2218 +"2020-08-17","MI",6592,6325,0,267,,,653,0,,169,,0,,,2237458,,89,102749,93185,490,0,,,,,131324,67778,,0,2368782,19351,238946,,,,,0,2368782,19351 +"2020-08-17","MN",1758,1712,6,46,5886,5886,286,35,1716,155,934307,5405,,,,,,65716,65716,564,0,,,,,,58859,1266561,12353,1266561,12353,,,,,1000023,5969,,0 +"2020-08-17","MO",1396,,29,,,,853,0,,,789994,11851,,62419,1057293,,119,68623,68623,1148,0,,,2549,,79618,,,0,1138890,19763,,,64968,,858617,12999,1138890,19763 +"2020-08-17","MP",2,,0,,4,4,,0,,,12867,615,,,,,,53,53,3,0,,,,,,29,,0,12920,618,,,,,12920,619,16453,2034 +"2020-08-17","MS",2095,2015,11,80,4989,4989,1081,73,,289,452177,4167,,,,,168,72412,70561,276,0,,,,,,56577,,0,524589,4443,18516,,,,,0,522738,4681 +"2020-08-17","MT",82,,0,,330,330,94,4,,,,0,,,,,,5792,,42,0,,,,,,4162,,0,204725,2801,,,,,,0,204725,2801 +"2020-08-17","NC",2348,2348,1,,,,980,0,,290,,0,,,,,,145516,145516,564,0,,,,,,,,0,1931656,23021,,,,,,0,1931656,23021 +"2020-08-17","ND",130,,1,,461,461,55,2,,,171772,559,7734,,,,,8632,8632,59,0,293,,,,,7343,387834,2603,387834,2603,8027,,,,178013,787,400035,2700 +"2020-08-17","NE",361,,0,,1883,1883,146,0,,,292619,1984,,,381854,,,30372,,131,0,,,,,37249,22483,,0,420046,4436,,,,,323287,2115,420046,4436 +"2020-08-17","NH",423,,0,,709,709,15,1,218,,178967,1026,,,,,,7004,,16,0,,,,,,6302,,0,283133,2123,29241,,28699,,185971,1042,283133,2123 +"2020-08-17","NJ",15857,14077,4,1780,22218,22218,472,12,,91,2323303,20572,,,,,38,190659,187767,338,0,,,,,,,,0,2513962,20910,,,,,,0,2511070,20884 +"2020-08-17","NM",718,,4,,2984,2984,119,19,,,,0,,,,,,23500,,92,0,,,,,,10602,,0,677150,6577,,,,,,0,677150,6577 +"2020-08-17","NV",1077,,5,,,,869,0,,256,489456,3298,,,,,150,61967,61967,662,0,,,,,,,749971,2593,749971,2593,,,,,551770,4024,759112,7047 +"2020-08-17","NY",25256,,6,,89995,89995,534,0,,133,,0,,,,,64,425916,,408,0,,,,,,,7125087,56891,7125087,56891,,,,,,0,,0 +"2020-08-17","OH",3832,3554,6,278,12319,12319,933,83,2786,316,,0,,,,,175,109062,103320,775,0,,,,,119938,87764,,0,1923197,21652,,,,,,0,1923197,21652 +"2020-08-17","OK",665,,4,,4021,4021,506,8,,236,706619,0,,,706619,,,48711,48711,369,0,2649,,,,54870,40531,,0,755330,369,65475,,,,,0,762899,0 +"2020-08-17","OR",388,,2,,1863,1863,224,0,,57,465535,3674,,,701617,,16,23262,,244,0,,,,,41643,4355,,0,743260,5793,,,,,471935,0,743260,5793 +"2020-08-17","PA",7468,,0,,,,560,0,,,1342475,10072,,,,,95,124844,121354,384,0,,,,,,98626,1956761,15646,1956761,15646,,,,,1463829,10440,,0 +"2020-08-17","PR",335,206,0,129,,,400,0,,55,305972,0,,,303412,,44,11723,11723,472,0,15037,,,,7002,,,0,317695,472,,,,,,0,310546,0 +"2020-08-17","RI",1023,,1,,2380,2380,80,0,,11,213250,686,,,401688,,3,20572,,58,0,,,,,29317,,431005,2028,431005,2028,,,,,233822,744,,0 +"2020-08-17","SC",2288,2185,19,103,6852,6852,1101,0,,282,766594,5490,56505,,731687,,175,106953,105905,456,0,4722,,,,140812,42730,,0,873547,5946,61227,,,,,0,872499,5929 +"2020-08-17","SD",153,,0,,921,921,60,5,,,118933,433,,,,,,10360,,86,0,,,,,16309,9013,,0,165094,1280,,,,,129293,519,165094,1280 +"2020-08-17","TN",1387,1345,21,42,5881,5881,1139,34,,374,,0,,,1709179,,173,134744,132397,1036,0,,,,,159582,94812,,0,1868761,13746,,,,,,0,1868761,13746 +"2020-08-17","TX",10034,,51,,,,6200,0,,2240,,0,,,,,,542950,542950,7908,0,23797,10973,,,698502,405817,,0,4963879,16322,322433,77664,,,,0,4963879,16322 +"2020-08-17","UT",364,,1,,2782,2782,156,11,708,64,555309,3104,,,689685,286,,46894,,242,0,,747,,696,51788,38132,,0,741473,4892,,2777,,2300,601709,3380,741473,4892 +"2020-08-17","VA",2385,2268,4,117,8767,8767,1173,30,,281,,0,,,,,158,107421,103016,734,0,7866,1174,,,124287,,1369037,19577,1369037,19577,122297,2457,,,,0,,0 +"2020-08-17","VI",9,,0,,,,,0,,,11658,228,,,,,,760,,19,0,,,,,,525,,0,12418,247,,,,,12429,240,,0 +"2020-08-17","VT",58,58,0,,,,18,0,,,109712,1886,,,,,,1527,1527,12,0,,,,,,1343,,0,147660,2953,,,,,111239,1898,147660,2953 +"2020-08-17","WA",1781,1781,15,,6255,6255,487,25,,,,0,,,,,43,69647,69266,359,0,,,,,,,1314115,16187,1314115,16187,,,,,,0,,0 +"2020-08-17","WI",1046,1039,0,7,5327,5327,365,23,961,124,1066040,5507,,,,,,70715,66196,469,0,,,,,,56602,1523891,10852,1523891,10852,,,,,1132236,5962,,0 +"2020-08-17","WV",160,159,0,1,,,134,0,,50,,0,,,,,19,8632,8462,68,0,,,,,,6531,,0,353849,5437,15208,,,,,0,353849,5437 +"2020-08-17","WY",33,,3,,195,195,13,4,,,57567,758,,,102723,,,3331,2829,45,0,,,,,3096,2699,,0,105819,2227,,,,,60396,893,105819,2227 +"2020-08-16","AK",28,28,0,,203,203,42,6,,,,0,,,296426,,3,4263,,101,0,,,,,4777,1418,,0,301515,4838,,,,,,0,301515,4838 +"2020-08-16","AL",1898,1830,2,68,12607,12607,1289,0,1316,,737991,8554,,,,720,,108433,104079,853,0,,,,,,41523,,0,842070,9276,,,,,842070,9276,,0 +"2020-08-16","AR",599,,-1,,3570,3570,478,8,,,569385,33117,,,569385,460,120,52665,52655,673,0,,1085,,,,45572,,0,622050,33390,,7090,,,,0,622050,33390 +"2020-08-16","AS",0,,0,,,,,0,,,1514,0,,,,,,0,0,0,0,,,,,,,,0,1514,0,,,,,,0,1514,0 +"2020-08-16","AZ",4506,4252,14,254,20755,20755,1208,-40,,417,898437,13900,,,,,267,193537,192062,883,0,,,,,,,,0,1553885,9554,,,251782,,1090499,14751,1553885,9554 +"2020-08-16","CA",11224,,77,,,,6309,0,,1820,,0,,,,,,621562,621562,7873,0,,,,,,,,0,9798135,117024,,,,,,0,9798135,117024 +"2020-08-16","CO",1896,1552,0,344,6735,6735,240,8,,,581397,7930,139267,,,,,53176,49611,338,0,10304,,,,,,873051,13317,873051,13317,149571,,,,631008,8263,,0 +"2020-08-16","CT",4453,3569,0,884,11015,11015,56,0,,,,0,,,982296,,,50897,48887,0,0,,,,,62850,8809,,0,1047096,7239,,,,,,0,1047096,7239 +"2020-08-16","DC",597,,0,,,,79,0,,28,,0,,,,,9,13220,,61,0,,,,,,10493,242852,3636,242852,3636,,,,,156592,1410,,0 +"2020-08-16","DE",593,524,0,69,,,30,0,,8,193934,1569,,,,,,16451,15448,55,0,,,,,19631,8671,297953,2952,297953,2952,,,,,210385,1624,,0 +"2020-08-16","FL",9587,,107,,34341,34341,5690,267,,,3659212,26124,381574,375046,4917254,,,567375,561901,3747,0,27323,,26788,,732039,,5558341,48738,5558341,48738,408950,,401862,,4220532,29906,5679906,47702 +"2020-08-16","GA",4702,,33,,22087,22087,2603,59,4050,,,0,,,,,,237030,237030,1862,0,17969,,,,215528,,,0,2005273,17207,253837,,,,,0,2005273,17207 +"2020-08-16","GU",5,,0,,,,12,0,,3,27257,663,,,,,,516,508,14,0,2,,,,,345,,0,27773,677,153,,,,,0,27086,0 +"2020-08-16","HI",40,40,0,,279,279,143,2,,35,154474,2751,,,,,25,4825,,282,0,,,,,4806,1808,198185,4379,198185,4379,,,,,159299,3033,202753,4601 +"2020-08-16","IA",975,,2,,,,271,0,,80,498765,4484,,41355,,,34,52428,52428,635,0,,,2915,,,40525,,0,551193,5119,,,44309,,558953,5394,,0 +"2020-08-16","ID",269,241,4,28,1103,1103,206,12,312,38,195745,1906,,,,,,27477,25661,304,0,,,,,,10616,,0,221406,2182,,,,,221406,2182,,0 +"2020-08-16","IL",7955,7744,18,211,,,1581,0,,345,,0,,,,,116,207413,206081,1562,0,,,,,,,,0,3366851,37089,,,,,,0,3366851,37089 +"2020-08-16","IN",3133,2924,5,209,9935,9935,944,63,2035,265,826436,8497,,,,,92,80415,,739,0,,,,,85460,,,0,1257312,7647,,,,,906851,9236,1257312,7647 +"2020-08-16","KS",402,,0,,2020,2020,311,0,554,98,309158,0,,,,198,33,33885,,0,0,,,,,,,,0,343043,0,,,,,343043,0,,0 +"2020-08-16","KY",813,808,3,5,4193,4193,618,0,1304,131,,0,,,,,,39315,36475,385,0,,,,,,9091,,0,709163,0,45157,665,,,,0,709163,0 +"2020-08-16","LA",4507,4384,77,123,,,1196,0,,,1520169,19894,,,,,189,137918,137918,1181,0,,,,,,103512,,0,1658087,21075,,,,,,0,1658087,21075 +"2020-08-16","MA",8829,8607,11,222,12173,12173,372,3,,65,1326768,15164,,,,,28,123200,114398,303,0,,,,,151061,100486,,0,1908475,22176,,,105287,68697,1441166,15467,1908475,22176 +"2020-08-16","MD",3639,3502,3,137,13614,13614,475,58,,115,1042198,14239,,100282,,,,100212,100212,519,0,,,9051,,117988,6004,,0,1611241,25571,,,109333,,1142410,14758,1611241,25571 +"2020-08-16","ME",127,126,0,1,400,400,9,1,,2,,0,8787,,,,1,4168,3747,24,0,454,,,,4628,3624,,0,205624,2768,9254,,,,,0,205624,2768 +"2020-08-16","MI",6592,6324,6,268,,,713,0,,184,,0,,,2218791,,87,102259,92720,477,0,,,,,130640,67778,,0,2349431,29874,238181,,,,,0,2349431,29874 +"2020-08-16","MN",1752,1706,7,46,5851,5851,290,29,1700,152,928902,8842,,,,,,65152,65152,739,0,,,,,,58196,1254208,17290,1254208,17290,,,,,994054,9581,,0 +"2020-08-16","MO",1367,,21,,,,889,0,,,778143,9099,,61982,1038713,,121,67475,67475,1078,0,,,2521,,78458,,,0,1119127,12544,,,64503,,845618,10177,1119127,12544 +"2020-08-16","MP",2,,0,,4,4,,0,,,12252,0,,,,,,50,50,0,0,,,,,,29,,0,12302,0,,,,,12301,0,14419,0 +"2020-08-16","MS",2084,2004,4,80,4916,4916,1126,0,,321,448010,0,,,,,176,72136,70350,381,0,,,,,,49836,,0,520146,381,18253,,,,,0,518057,0 +"2020-08-16","MT",82,,0,,326,326,90,2,,,,0,,,,,,5750,,91,0,,,,,,4145,,0,201924,988,,,,,,0,201924,988 +"2020-08-16","NC",2347,2347,4,,,,934,0,,289,,0,,,,,,144952,144952,1246,0,,,,,,,,0,1908635,25652,,,,,,0,1908635,25652 +"2020-08-16","ND",129,,4,,459,459,54,2,,,171213,1512,7723,,,,,8573,8573,143,0,293,,,,,7249,385231,5415,385231,5415,8016,,,,177226,1623,397335,5585 +"2020-08-16","NE",361,,0,,1883,1883,144,3,,,290635,2940,,,377649,,,30241,,253,0,,,,,37018,22251,,0,415610,4610,,,,,321172,3195,415610,4610 +"2020-08-16","NH",423,,0,,708,708,13,2,218,,177941,1544,,,,,,6988,,8,0,,,,,,6287,,0,281010,2098,29225,,28671,,184929,1552,281010,2098 +"2020-08-16","NJ",15853,14073,2,1780,22206,22206,450,9,,83,2302731,28790,,,,,42,190321,187455,50,0,,,,,,,,0,2493052,28840,,,,,,0,2490186,28803 +"2020-08-16","NM",714,,3,,2965,2965,109,8,,,,0,,,,,,23408,,106,0,,,,,,10481,,0,670573,5282,,,,,,0,670573,5282 +"2020-08-16","NV",1072,,3,,,,941,0,,258,486158,3916,,,,,166,61305,61305,697,0,,,,,,,747378,4446,747378,4446,,,,,547746,9544,752065,8194 +"2020-08-16","NY",25250,,6,,89995,89995,527,0,,128,,0,,,,,59,425508,,607,0,,,,,,,7068196,77692,7068196,77692,,,,,,0,,0 +"2020-08-16","OH",3826,3548,2,278,12236,12236,910,26,2771,334,,0,,,,,161,108287,102577,613,0,,,,,119126,86926,,0,1901545,26109,,,,,,0,1901545,26109 +"2020-08-16","OK",661,,4,,4013,4013,506,15,,236,706619,0,,,706619,,,48342,48342,544,0,2649,,,,54870,40224,,0,754961,544,65475,,,,,0,762899,0 +"2020-08-16","OR",386,,1,,1863,1863,224,0,,57,461861,11367,,,696165,,16,23018,,405,0,,,,,41302,4355,,0,737467,17962,,,,,471935,0,737467,17962 +"2020-08-16","PA",7468,,3,,,,559,0,,,1332403,12519,,,,,99,124460,120986,660,0,,,,,,98323,1941115,19851,1941115,19851,,,,,1453389,13159,,0 +"2020-08-16","PR",335,205,6,130,,,393,0,,64,305972,0,,,303412,,48,11251,11251,182,0,14755,,,,7002,,,0,317223,182,,,,,,0,310546,0 +"2020-08-16","RI",1022,,0,,2380,2380,80,5,,11,212564,1237,,,399731,,3,20514,,75,0,,,,,29246,,428977,3662,428977,3662,,,,,233078,1312,,0 +"2020-08-16","SC",2269,2165,9,104,6852,6852,1161,0,,290,761104,6586,56305,,726369,,188,106497,105466,615,0,4700,,,,140201,42730,,0,867601,7201,61005,,,,,0,866570,7178 +"2020-08-16","SD",153,,1,,916,916,66,3,,,118500,1169,,,,,,10274,,156,0,,,,,16206,8939,,0,163814,2169,,,,,128774,1325,163814,2169 +"2020-08-16","TN",1366,1324,21,42,5847,5847,1148,34,,328,,0,,,1696713,,158,133708,131383,1961,0,,,,,158302,92655,,0,1855015,27495,,,,,,0,1855015,27495 +"2020-08-16","TX",9983,,143,,,,6267,0,,2269,,0,,,,,,535042,535042,6204,0,23192,10915,,,696878,399572,,0,4947557,21703,318940,76956,,,,0,4947557,21703 +"2020-08-16","UT",363,,0,,2771,2771,204,11,707,64,552205,3448,,,685101,287,,46652,,331,0,,745,,694,51480,37701,,0,736581,5469,,2741,,2269,598329,3668,736581,5469 +"2020-08-16","VA",2381,2266,0,115,8737,8737,1184,36,,283,,0,,,,,165,106687,102299,937,0,7831,1159,,,123419,,1349460,16522,1349460,16522,121831,2408,,,,0,,0 +"2020-08-16","VI",9,,0,,,,,0,,,11430,47,,,,,,741,,7,0,,,,,,523,,0,12171,54,,,,,12189,56,,0 +"2020-08-16","VT",58,58,0,,,,17,0,,,107826,969,,,,,,1515,1515,5,0,,,,,,1337,,0,144707,1625,,,,,109341,974,144707,1625 +"2020-08-16","WA",1766,1766,11,,6230,6230,504,24,,,,0,,,,,55,69288,68911,673,0,,,,,,,1297928,4951,1297928,4951,,,,,,0,,0 +"2020-08-16","WI",1046,1039,1,7,5304,5304,347,29,957,105,1060533,5414,,,,,,70246,65741,699,0,,,,,,55982,1513039,13392,1513039,13392,,,,,1126274,6099,,0 +"2020-08-16","WV",160,159,0,1,,,130,0,,52,,0,,,,,20,8564,8393,107,0,,,,,,6429,,0,348412,5004,15145,,,,,0,348412,5004 +"2020-08-16","WY",30,,0,,191,191,13,0,,,56809,0,,,100558,,,3286,2789,59,0,,,,,3034,2668,,0,103592,339,,,,,59503,0,103592,339 +"2020-08-15","AK",28,28,1,,197,197,36,4,,,,0,,,291666,,4,4162,,84,0,,,,,4706,1384,,0,296677,748,,,,,,0,296677,748 +"2020-08-15","AL",1896,1828,3,68,12607,12607,1259,151,1313,,729437,10762,,,,719,,107580,103357,1271,0,,,,,,41523,,0,832794,11923,,,,,832794,11923,,0 +"2020-08-15","AR",600,,13,,3562,3562,464,-4,,,536268,0,,,536268,460,108,51992,51992,-400,0,,1085,,,,44905,,0,588660,0,,7090,,,,0,588660,0 +"2020-08-15","AS",0,,0,,,,,0,,,1514,118,,,,,,0,0,0,0,,,,,,,,0,1514,118,,,,,,0,1514,118 +"2020-08-15","AZ",4492,4238,69,254,20795,20795,1282,280,,442,884537,8683,,,,,284,192654,191211,933,0,,,,,,,,0,1544331,16372,,,250030,,1075748,9602,1544331,16372 +"2020-08-15","CA",11147,,151,,,,6327,0,,1812,,0,,,,,,613689,613689,12614,0,,,,,,,,0,9681111,124513,,,,,,0,9681111,124513 +"2020-08-15","CO",1896,1552,8,344,6727,6727,236,9,,,573467,5680,138349,,,,,52838,49278,300,0,10222,,,,,,859734,10939,859734,10939,148571,,,,622745,5973,,0 +"2020-08-15","CT",4453,3569,0,884,11015,11015,56,0,,,,0,,,975116,,,50897,48887,0,0,,,,,62795,8809,,0,1039857,14599,,,,,,0,1039857,14599 +"2020-08-15","DC",597,,3,,,,81,0,,28,,0,,,,,14,13159,,41,0,,,,,,10452,239216,2911,239216,2911,,,,,155182,859,,0 +"2020-08-15","DE",593,524,0,69,,,32,0,,10,192365,1230,,,,,,16396,15392,56,0,,,,,19543,8649,295001,3974,295001,3974,,,,,208761,1286,,0 +"2020-08-15","FL",9480,,204,,34074,34074,5721,506,,,3633088,35808,381574,375046,4875096,,,563628,558171,6291,0,27323,,26788,,726846,,5509603,80747,5509603,80747,408950,,401862,,4190626,42230,5632204,69705 +"2020-08-15","GA",4669,,96,,22028,22028,2586,210,4042,,,0,,,,,,235168,235168,3273,0,17676,,,,213697,,,0,1988066,16872,251604,,,,,0,1988066,16872 +"2020-08-15","GU",5,,0,,,,8,0,,2,26594,0,,,,,,502,494,0,0,2,,,,,345,,0,27096,0,153,,,,,0,27086,0 +"2020-08-15","HI",40,40,0,,277,277,173,10,,41,151723,2418,,,,,22,4543,,231,0,,,,,4512,1756,193806,3675,193806,3675,,,,,156266,2649,198152,3801 +"2020-08-15","IA",973,,7,,,,261,0,,82,494281,4976,,41046,,,35,51793,51793,861,0,,,2911,,,40381,,0,546074,5837,,,43996,,553559,10077,,0 +"2020-08-15","ID",265,239,14,26,1091,1091,206,23,309,38,193839,2249,,,,,,27173,25385,542,0,,,,,,10369,,0,219224,2751,,,,,219224,2751,,0 +"2020-08-15","IL",7937,7726,5,211,,,1538,0,,330,,0,,,,,127,205851,204519,1828,0,,,,,,,,0,3329762,44414,,,,,,0,3329762,44414 +"2020-08-15","IN",3128,2921,15,207,9872,9872,922,71,2032,267,817939,10082,,,,,88,79676,,1044,0,,,,,85105,,,0,1249665,24570,,,,,897615,11126,1249665,24570 +"2020-08-15","KS",402,,0,,2020,2020,311,0,554,98,309158,0,,,,198,33,33885,,0,0,,,,,,,,0,343043,0,,,,,343043,0,,0 +"2020-08-15","KY",810,805,6,5,4193,4193,618,35,1304,131,,0,,,,,,38930,36117,632,0,,,,,,9091,,0,709163,11254,45157,665,,,,0,709163,11254 +"2020-08-15","LA",4430,4307,0,123,,,1243,0,,,1500275,0,,,,,197,136737,136737,0,0,,,,,,103512,,0,1637012,0,,,,,,0,1637012,0 +"2020-08-15","MA",8818,8596,14,222,12170,12170,375,20,,65,1311604,22603,,,,,27,122897,114095,366,0,,,,,150687,100486,,0,1886299,33267,,,104872,66513,1425699,22969,1886299,33267 +"2020-08-15","MD",3636,3499,5,137,13556,13556,460,48,,107,1027959,16561,,100282,,,,99693,99693,818,0,,,9051,,117306,5995,,0,1585670,33600,,,109333,,1127652,17379,1585670,33600 +"2020-08-15","ME",127,126,1,1,399,399,5,0,,2,,0,8741,,,,1,4144,3726,29,0,454,,,,4602,3616,,0,202856,2211,9208,,,,,0,202856,2211 +"2020-08-15","MI",6586,6318,20,268,,,713,0,,184,,0,,,2189997,,87,101782,92155,1058,0,,,,,129560,67778,,0,2319557,30824,237323,,,,,0,2319557,30824 +"2020-08-15","MN",1745,1699,6,46,5822,5822,307,39,1691,140,920060,10237,,,,,,64413,64413,690,0,,,,,,57457,1236918,17102,1236918,17102,,,,,984473,10927,,0 +"2020-08-15","MO",1346,,11,,,,871,0,,,769044,9445,,61737,1027492,,113,66397,66397,1127,0,,,2492,,77152,,,0,1106583,12613,,,64229,,835441,10572,1106583,12613 +"2020-08-15","MP",2,,0,,4,4,,0,,,12252,0,,,,,,50,50,0,0,,,,,,29,,0,12302,0,,,,,12301,0,14419,0 +"2020-08-15","MS",2080,2000,37,80,4916,4916,1126,43,,321,448010,7898,,,,,176,71755,70047,825,0,,,,,,49836,,0,519765,8723,18253,,,,,0,518057,8677 +"2020-08-15","MT",82,,1,,324,324,90,5,,,,0,,,,,,5659,,118,0,,,,,,4123,,0,200936,1075,,,,,,0,200936,1075 +"2020-08-15","NC",2343,2343,30,,,,1032,0,,320,,0,,,,,,143706,143706,1536,0,,,,,,,,0,1882983,22856,,,,,,0,1882983,22856 +"2020-08-15","ND",125,,0,,457,457,55,2,,,169701,1420,7714,,,,,8430,8430,123,0,293,,,,,7161,379816,6266,379816,6266,8007,,,,175603,1516,391750,6479 +"2020-08-15","NE",361,,1,,1880,1880,145,0,,,287695,3131,,,373363,,,29988,,328,0,,,,,36701,22004,,0,411000,4412,,,,,317977,3461,411000,4412 +"2020-08-15","NH",423,,1,,706,706,15,1,218,,176397,1702,,,,,,6980,,59,0,,,,,,6264,,0,278912,3409,29130,,28528,,183377,1761,278912,3409 +"2020-08-15","NJ",15851,14071,9,1780,22197,22197,520,36,,99,2273941,31264,,,,,43,190271,187442,323,0,,,,,,,,0,2464212,31587,,,,,,0,2461383,31542 +"2020-08-15","NM",711,,8,,2957,2957,113,11,,,,0,,,,,,23302,,142,0,,,,,,10391,,0,665291,6249,,,,,,0,665291,6249 +"2020-08-15","NV",1069,,24,,,,941,0,,258,482242,3787,,,,,166,60608,60608,859,0,,,,,,,742932,7950,742932,7950,,,,,538202,0,743871,7980 +"2020-08-15","NY",25244,,12,,89995,89995,523,0,,120,,0,,,,,58,424901,,734,0,,,,,,,6990504,88668,6990504,88668,,,,,,0,,0 +"2020-08-15","OH",3824,3546,40,278,12210,12210,899,82,2767,318,,0,,,,,166,107674,102016,1117,0,,,,,117949,86018,,0,1875436,24767,,,,,,0,1875436,24767 +"2020-08-15","OK",657,,13,,3998,3998,506,45,,236,706619,10274,,,706619,,,47798,47798,901,0,2649,,,,54870,39907,,0,754417,11175,65475,,,,,0,762899,11462 +"2020-08-15","OR",385,,2,,1863,1863,224,10,,57,450494,5531,,,678876,,16,22613,,313,0,,,,,40629,4355,,0,719505,6705,,,,,471935,5831,719505,6705 +"2020-08-15","PA",7465,,20,,,,572,0,,,1319884,15145,,,,,99,123800,120346,850,0,,,,,,96564,1921264,26868,1921264,26868,,,,,1440230,15979,,0 +"2020-08-15","PR",329,201,12,128,,,406,0,,66,305972,0,,,303412,,46,11069,11069,339,0,14626,,,,7002,,,0,317041,339,,,,,,0,310546,0 +"2020-08-15","RI",1022,,1,,2375,2375,85,25,,11,211327,1797,,,396161,,2,20439,,104,0,,,,,29154,,425315,4582,425315,4582,,,,,231766,1901,,0 +"2020-08-15","SC",2260,2156,56,104,6852,6852,1246,0,,311,754518,7575,55892,,719922,,181,105882,104874,1041,0,4640,,,,139470,42730,,0,860400,8616,60532,,,,,0,859392,8569 +"2020-08-15","SD",152,,2,,913,913,63,10,,,117331,1341,,,,,,10118,,94,0,,,,,16035,8884,,0,161645,2026,,,,,127449,1435,161645,2026 +"2020-08-15","TN",1345,1304,19,41,5813,5813,1307,88,,392,,0,,,1671887,,187,131747,129509,1289,0,,,,,155633,92100,,0,1827520,17620,,,,,,0,1827520,17620 +"2020-08-15","TX",9840,,238,,,,6481,0,,2306,,0,,,,,,528838,528838,8245,0,23192,10863,,,694472,393266,,0,4925854,42194,318938,76263,,,,0,4925854,42194 +"2020-08-15","UT",363,,3,,2760,2760,186,16,707,64,548757,4097,,,679878,286,,46321,,345,0,,740,,690,51234,37346,,0,731112,6507,,2672,,2215,594661,4537,731112,6507 +"2020-08-15","VA",2381,2265,11,116,8701,8701,1271,51,,279,,0,,,,,167,105750,101448,912,0,7773,1152,,,122373,,1332938,16901,1332938,16901,121105,2355,,,,0,,0 +"2020-08-15","VI",9,,0,,,,,0,,,11383,88,,,,,,734,,30,0,,,,,,519,,0,12117,118,,,,,12133,115,,0 +"2020-08-15","VT",58,58,0,,,,14,0,,,106857,2826,,,,,,1510,1510,9,0,,,,,,1332,,0,143082,3597,,,,,108367,2835,143082,3597 +"2020-08-15","WA",1755,1755,19,,6206,6206,529,24,,,,0,,,,,58,68615,68263,628,0,,,,,,,1292977,8836,1292977,8836,,,,,,0,,0 +"2020-08-15","WI",1045,1038,13,7,5275,5275,337,40,954,96,1055119,10506,,,,,,69547,65056,866,0,,,,,,55172,1499647,19531,1499647,19531,,,,,1120175,11335,,0 +"2020-08-15","WV",160,159,3,1,,,132,0,,54,,0,,,,,21,8457,8289,183,0,,,,,,6298,,0,343408,5268,15072,,,,,0,343408,5268 +"2020-08-15","WY",30,,0,,191,191,13,0,,,56809,0,,,100231,,,3227,2730,44,0,,,,,3022,2659,,0,103253,401,,,,,59503,0,103253,401 +"2020-08-14","AK",27,27,0,,193,193,38,2,,,,0,,,290927,,3,4078,,100,0,,,,,4698,1371,,0,295929,1876,,,,,,0,295929,1876 +"2020-08-14","AL",1893,1825,3,68,12456,12456,1326,0,1305,,718675,21670,,,,716,,106309,102196,752,0,,,,,,41523,,0,820871,22370,,,,,820871,22370,,0 +"2020-08-14","AR",587,,5,,3566,3566,466,0,,,536268,4554,,,536268,466,113,52392,52392,626,0,,1085,,,,45446,,0,588660,5180,,7090,,,,0,588660,5180 +"2020-08-14","AS",0,,0,,,,,0,,,1396,0,,,,,,0,0,0,0,,,,,,,,0,1396,0,,,,,,0,1396,0 +"2020-08-14","AZ",4423,4169,40,254,20515,20515,1359,12,,473,875854,8470,,,,,324,191721,190292,927,0,,,,,,,,0,1527959,14070,,,248666,,1066146,9376,1527959,14070 +"2020-08-14","CA",10996,,188,,,,6364,0,,1850,,0,,,,,,601075,601075,7934,0,,,,,,,,0,9556598,111105,,,,,,0,9556598,111105 +"2020-08-14","CO",1888,1545,6,343,6718,6718,236,18,,,567787,6640,137933,,,,,52538,48985,319,0,10189,,,,,,848795,11505,848795,11505,148122,,,,616772,6948,,0 +"2020-08-14","CT",4453,3569,3,884,11015,11015,56,0,,,,0,,,960675,,,50897,48887,115,0,,,,,62643,8809,,0,1025258,15856,,,,,,0,1025258,15856 +"2020-08-14","DC",594,,0,,,,84,0,,22,,0,,,,,12,13118,,94,0,,,,,,10416,236305,6656,236305,6656,,,,,154323,3249,,0 +"2020-08-14","DE",593,524,0,69,,,38,0,,10,191135,1474,,,,,,16340,15340,373,0,,,,,19442,8613,291027,2613,291027,2613,,,,,207475,1847,,0 +"2020-08-14","FL",9276,,229,,33568,33568,5893,621,,,3597280,32299,381574,375046,4814951,,,557337,552000,7997,0,27323,,26788,,718241,,5428856,74732,5428856,74732,408950,,401862,,4148396,19812,5562499,65148 +"2020-08-14","GA",4573,,35,,21818,21818,2691,237,3999,,,0,,,,,,231895,231895,3227,0,17442,,,,212140,,,0,1971194,27319,249475,,,,,0,1971194,27319 +"2020-08-14","GU",5,,0,,,,8,0,,2,26594,391,,,,,,502,494,25,0,2,,,,,345,,0,27096,416,153,,,,,0,27086,416 +"2020-08-14","HI",40,40,0,,267,267,146,0,,29,149305,3030,,,,,22,4312,,0,0,,,,,4278,1716,190131,4649,190131,4649,,,,,153617,3384,194351,0 +"2020-08-14","IA",966,,7,,,,258,0,,75,489305,4828,,40578,,,28,50932,50932,596,0,,,2901,,,39879,,0,540237,5424,,,43518,,543482,5383,,0 +"2020-08-14","ID",251,225,5,26,1068,1068,216,17,302,36,191590,3110,,,,,,26631,24883,498,0,,,,,,10089,,0,216473,3575,,,,,216473,3575,,0 +"2020-08-14","IL",7932,7721,27,211,,,1612,0,,345,,0,,,,,126,204023,202691,2296,0,,,,,,,,0,3285348,49541,,,,,,0,3285348,49541 +"2020-08-14","IN",3113,2906,8,207,9801,9801,910,123,2007,291,807857,7452,,,,,80,78632,,1067,0,,,,,83963,,,0,1225095,22748,,,,,886489,8519,1225095,22748 +"2020-08-14","KS",402,,7,,2020,2020,311,45,554,98,309158,7142,,,,198,33,33885,,1338,0,,,,,,,,0,343043,8480,,,,,343043,8480,,0 +"2020-08-14","KY",804,799,8,5,4158,4158,656,42,1296,147,,0,,,,,,38298,35565,612,0,,,,,,9021,,0,697909,12939,44926,665,,,,0,697909,12939 +"2020-08-14","LA",4430,4307,28,123,,,1243,0,,,1500275,19734,,,,,197,136737,136737,1298,0,,,,,,103512,,0,1637012,21032,,,,,,0,1637012,21032 +"2020-08-14","MA",8804,8582,14,222,12150,12150,398,19,,58,1289001,21340,,,,,31,122531,113729,212,0,,,,,150223,100486,,0,1853032,32001,,,104191,64773,1402730,21552,1853032,32001 +"2020-08-14","MD",3631,3495,11,136,13508,13508,457,45,,107,1011398,14464,,100282,,,,98875,98875,715,0,,,9051,,116321,5986,,0,1552070,24140,,,109333,,1110273,15179,1552070,24140 +"2020-08-14","ME",126,125,0,1,399,399,6,4,,2,,0,8723,,,,1,4115,3697,26,0,450,,,,4579,3604,,0,200645,2669,9186,,,,,0,200645,2669 +"2020-08-14","MI",6566,6300,11,266,,,713,0,,184,,0,,,2160427,,87,100724,91140,868,0,,,,,128306,63636,,0,2288733,39292,235572,,,,,0,2288733,39292 +"2020-08-14","MN",1739,1693,8,46,5783,5783,313,41,1679,152,909823,9720,,,,,,63723,63723,730,0,,,,,,56659,1219816,16257,1219816,16257,,,,,973546,10450,,0 +"2020-08-14","MO",1335,,10,,,,882,0,,,759599,12039,,61321,1016099,,107,65270,65270,1473,0,,,2460,,75959,,,0,1093970,19509,,,63781,,824869,13512,1093970,19509 +"2020-08-14","MP",2,,0,,4,4,,0,,,12252,0,,,,,,50,50,1,0,,,,,,29,,0,12302,1,,,,,12301,0,14419,0 +"2020-08-14","MS",2043,1965,32,78,4873,4873,1107,26,,312,440112,1672,,,,,179,70930,69268,944,0,,,,,,49836,,0,511042,2616,17823,,,,,0,509380,3027 +"2020-08-14","MT",81,,0,,319,319,86,4,,,,0,,,,,,5541,,134,0,,,,,,4011,,0,199861,2041,,,,,,0,199861,2041 +"2020-08-14","NC",2313,2313,26,,,,1049,0,,308,,0,,,,,,142170,142170,1346,0,,,,,,,,0,1860127,30068,,,,,,0,1860127,30068 +"2020-08-14","ND",125,,1,,455,455,65,10,,,168281,1412,7683,,,,,8307,8307,152,0,292,,,,,7066,373550,5241,373550,5241,7975,,,,174087,1517,385271,5403 +"2020-08-14","NE",360,,4,,1880,1880,147,0,,,284564,4164,,,369348,,,29660,,416,0,,,,,36307,21463,,0,406588,5048,,,,,314516,4578,406588,5048 +"2020-08-14","NH",422,,0,,705,705,15,0,214,,174695,0,,,,,,6921,,0,0,,,,,,6190,,0,275503,3452,29016,,28351,,181616,0,275503,3452 +"2020-08-14","NJ",15842,14064,10,1778,22161,22161,514,36,,91,2242677,25581,,,,,40,189948,187164,604,0,,,,,,,,0,2432625,26185,,,,,,0,2429841,26151 +"2020-08-14","NM",703,,6,,2946,2946,125,18,,,,0,,,,,,23160,,173,0,,,,,,10182,,0,659042,8551,,,,,,0,659042,8551 +"2020-08-14","NV",1045,,15,,,,948,0,,260,478455,3961,,,,,166,59749,59749,1099,0,,,,,,,734982,8324,734982,8324,,,,,538202,4921,735891,8608 +"2020-08-14","NY",25232,,4,,89995,89995,554,0,,127,,0,,,,,59,424167,,727,0,,,,,,,6901836,85455,6901836,85455,,,,,,0,,0 +"2020-08-14","OH",3784,3510,29,274,12128,12128,925,105,2755,319,,0,,,,,170,106557,100945,1131,0,,,,,116724,84904,,0,1850669,27708,,,,,,0,1850669,27708 +"2020-08-14","OK",644,,6,,3953,3953,567,52,,240,696345,11176,,,696345,,,46897,46897,794,0,2649,,,,53700,39282,,0,743242,11970,65475,,,,,0,751437,12150 +"2020-08-14","OR",383,,8,,1853,1853,232,8,,57,444963,4443,,,672507,,22,22300,,278,0,,,,,40293,4282,,0,712800,8523,,,,,466104,4709,712800,8523 +"2020-08-14","PA",7445,,36,,,,585,0,,,1304739,15866,,,,,103,122950,119512,829,0,,,,,,95901,1894396,27278,1894396,27278,,,,,1424251,16647,,0 +"2020-08-14","PR",317,192,11,125,,,428,0,,70,305972,0,,,303412,,49,10730,10730,451,0,14398,,,,7002,,,0,316702,451,,,,,,0,310546,0 +"2020-08-14","RI",1021,,2,,2350,2350,79,9,,8,209530,1296,,,390466,,3,20335,,95,0,,,,,29007,,420733,4530,420733,4530,,,,,229865,1391,,0 +"2020-08-14","SC",2204,2106,18,98,6852,6852,1296,370,,327,746943,44824,55364,,712787,,198,104841,103880,932,0,4553,,,,138036,42730,,0,851784,45756,59917,,,,,0,850823,45653 +"2020-08-14","SD",150,,2,,903,903,65,7,,,115990,1117,,,,,,10024,,127,0,,,,,15919,8773,,0,159619,1791,,,,,126014,1244,159619,1791 +"2020-08-14","TN",1326,1285,13,41,5725,5725,1264,77,,398,,0,,,1655634,,176,130458,128315,1947,0,,,,,154266,91323,,0,1809900,24254,,,,,,0,1809900,24254 +"2020-08-14","TX",9602,,313,,,,6632,0,,2380,,0,,,,,,520593,520593,7018,0,22100,10792,,,689851,383717,,0,4883660,41171,312727,74905,,,,0,4883660,41171 +"2020-08-14","UT",360,,7,,2744,2744,190,23,702,69,544660,3660,,,673846,285,,45976,,552,0,,720,,671,50759,36679,,0,724605,6212,,2521,,2086,590124,3946,724605,6212 +"2020-08-14","VA",2370,2255,7,115,8650,8650,1299,58,,268,,0,,,,,150,104838,100603,1216,0,7708,1120,,,121207,,1316037,14128,1316037,14128,120344,2268,,,,0,,0 +"2020-08-14","VI",9,,0,,,,,0,,,11295,327,,,,,,704,,22,0,,,,,,502,,0,11999,349,,,,,12018,358,,0 +"2020-08-14","VT",58,58,0,,,,13,0,,,104031,1506,,,,,,1501,1501,17,0,,,,,,1321,,0,139485,2287,,,,,105532,1523,139485,2287 +"2020-08-14","WA",1736,1736,12,,6182,6182,519,45,,,,0,,,,,58,67987,67647,632,0,,,,,,,1284141,14510,1284141,14510,,,,,,0,,0 +"2020-08-14","WI",1032,1025,7,7,5235,5235,336,65,951,110,1044613,9418,,,,,,68681,64227,1059,0,,,,,,54181,1480116,20179,1480116,20179,,,,,1108840,10439,,0 +"2020-08-14","WV",157,156,4,1,,,135,0,,52,,0,,,,,18,8274,8104,123,0,,,,,,6144,,0,338140,5105,14999,,,,,0,338140,5105 +"2020-08-14","WY",30,,0,,191,191,13,2,,,56809,357,,,99833,,,3183,2694,64,0,,,,,3019,2641,,0,102852,1587,,,,,59503,424,102852,1587 +"2020-08-13","AK",27,27,0,,191,191,46,5,,,,0,,,289088,,3,3978,,82,0,,,,,4662,1360,,0,294053,1471,,,,,,0,294053,1471 +"2020-08-13","AL",1890,1821,8,69,12456,12456,1341,164,1292,,697005,6020,,,,707,,105557,101496,771,0,,,,,,41523,,0,798501,6715,,,,,798501,6715,,0 +"2020-08-13","AR",582,,16,,3566,3566,473,94,,,531714,9257,,,531714,466,112,51766,51766,652,0,,1085,,,,44602,,0,583480,10612,,7090,,,,0,583480,10612 +"2020-08-13","AS",0,,0,,,,,0,,,1396,0,,,,,,0,0,0,0,,,,,,,,0,1396,0,,,,,,0,1396,0 +"2020-08-13","AZ",4383,4130,36,253,20503,20503,1411,682,,497,867384,12599,,,,,334,190794,189386,1351,0,,,,,,,,0,1513889,17477,,,246800,,1056770,13932,1513889,17477 +"2020-08-13","CA",10808,,160,,,,6424,0,,1826,,0,,,,,,593141,593141,7085,0,,,,,,,,0,9445493,142026,,,,,,0,9445493,142026 +"2020-08-13","CO",1882,1539,7,343,6700,6700,265,15,,,561147,7113,137210,,,,,52219,48677,463,0,10110,,,,,,837290,12228,837290,12228,147320,,,,609824,7528,,0 +"2020-08-13","CT",4450,3566,0,884,11015,11015,63,95,,,,0,,,944963,,,50782,48774,76,0,,,,,62508,8809,,0,1009402,16409,,,,,,0,1009402,16409 +"2020-08-13","DC",594,,1,,,,83,0,,24,,0,,,,,11,13024,,65,0,,,,,,10361,229649,2908,229649,2908,,,,,151074,1430,,0 +"2020-08-13","DE",593,524,2,69,,,37,0,,10,189661,3160,,,,,,15967,14968,268,0,,,,,19357,8587,288414,2047,288414,2047,,,,,205628,3428,,0 +"2020-08-13","FL",9047,,149,,32947,32947,6325,598,,,3564981,28303,381574,375046,4758626,,,549340,,6227,0,27323,,26788,,710087,,5354124,64496,5354124,64496,408950,,401862,,4128584,34612,5497351,58556 +"2020-08-13","GA",4538,,82,,21581,21581,2807,202,3963,,,0,,,,,,228668,228668,2515,0,17140,,,,209150,,,0,1943875,29441,247048,,,,,0,1943875,29441 +"2020-08-13","GU",5,,0,,,,8,0,,1,26203,416,,,,,,477,469,28,0,2,,,,,343,,0,26680,444,152,,,,,0,26670,444 +"2020-08-13","HI",40,40,2,,267,267,132,7,,33,146275,0,,,,,24,4312,,354,0,,,,,3937,1716,185482,3648,185482,3648,,,,,150233,0,194351,4859 +"2020-08-13","IA",959,,8,,,,261,0,,88,484477,6135,,40184,,,25,50336,50336,530,0,,,2896,,,39320,,0,534813,6665,,,43119,,538099,6789,,0 +"2020-08-13","ID",246,221,0,25,1051,1051,216,14,296,36,188480,1831,,,,,,26133,24418,538,0,,,,,,9850,,0,212898,2299,,,,,212898,2299,,0 +"2020-08-13","IL",7905,7696,24,209,,,1628,0,,383,,0,,,,,127,201727,200427,1834,0,,,,,,,,0,3235807,46006,,,,,,0,3235807,46006 +"2020-08-13","IN",3105,2898,19,207,9678,9678,991,0,1975,290,800405,9933,,,,,86,77565,,1043,0,,,,,83003,,,0,1202347,21711,,,,,877970,10976,1202347,21711 +"2020-08-13","KS",395,,0,,1975,1975,357,0,548,95,302016,0,,,,195,29,32547,,0,0,,,,,,,,0,334563,0,,,,,334563,0,,0 +"2020-08-13","KY",796,791,6,5,4116,4116,658,25,1291,140,,0,,,,,,37686,35036,741,0,,,,,,8965,,0,684970,12725,44808,584,,,,0,684970,12725 +"2020-08-13","LA",4402,4279,41,123,,,1281,0,,,1480541,16236,,,,,196,135439,135439,1135,0,,,,,,103512,,0,1615980,17371,,,,,,0,1615980,17371 +"2020-08-13","MA",8790,8568,21,222,12131,12131,401,22,,61,1267661,27560,,,,,26,122319,113517,319,0,,,,,149968,100486,,0,1821031,39483,,,103573,63165,1381178,27879,1821031,39483 +"2020-08-13","MD",3620,3483,8,137,13463,13463,470,115,,111,996934,15480,,100282,,,,98160,98160,776,0,,,9051,,115312,5962,,0,1527930,29842,,,109333,,1095094,16256,1527930,29842 +"2020-08-13","ME",126,125,0,1,395,395,11,1,,5,,0,8706,,,,3,4089,3679,19,0,446,,,,4564,3592,,0,197976,3062,9165,,,,,0,197976,3062 +"2020-08-13","MI",6555,6289,16,266,,,713,0,,184,,0,,,2122530,,90,99856,90392,1167,0,,,,,126911,63636,,0,2249441,40629,233568,,,,,0,2249441,40629 +"2020-08-13","MN",1731,1685,7,46,5742,5742,308,31,1671,154,900103,9621,,,,,,62993,62993,690,0,,,,,,56346,1203559,15271,1203559,15271,,,,,963096,10311,,0 +"2020-08-13","MO",1325,,2,,,,882,0,,,747560,11509,,60746,998356,,111,63797,63797,1267,0,,,2412,,74219,,,0,1074461,16753,,,63158,,811357,12776,1074461,16753 +"2020-08-13","MP",2,,0,,4,4,,0,,,12252,0,,,,,,49,49,0,0,,,,,,29,,0,12301,0,,,,,12301,0,14419,0 +"2020-08-13","MS",2011,1942,22,69,4847,4847,1136,53,,318,438440,0,,,,,195,69986,68430,612,0,,,,,,49836,,0,508426,612,17765,,,,,0,506353,0 +"2020-08-13","MT",81,,1,,315,315,101,14,,,,0,,,,,,5407,,139,0,,,,,,3937,,0,197820,1784,,,,,,0,197820,1784 +"2020-08-13","NC",2287,2287,38,,,,1070,0,,313,,0,,,,,,140824,140824,1763,0,,,,,,,,0,1830059,26715,,,,,,0,1830059,26715 +"2020-08-13","ND",124,,0,,445,445,59,5,,,166869,1820,7614,,,,,8155,8155,200,0,282,,,,,6953,368309,6758,368309,6758,7896,,,,172570,1963,379868,7074 +"2020-08-13","NE",356,,5,,1880,1880,152,0,,,280400,968,,,364709,,,29244,,214,0,,,,,35905,21463,,0,401540,3077,,,,,309938,1183,401540,3077 +"2020-08-13","NH",422,,2,,705,705,15,0,214,,174695,1131,,,,,,6921,,34,0,,,,,,6190,,0,272051,4431,28887,,28351,,181616,1165,272051,4431 +"2020-08-13","NJ",15832,14054,8,1778,22125,22125,545,29,,103,2217096,27018,,,,,28,189344,186594,709,0,,,,,,,,0,2406440,27727,,,,,,0,2403690,27674 +"2020-08-13","NM",697,,2,,2928,2928,128,21,,,,0,,,,,,22987,,171,0,,,,,,9980,,0,650491,5668,,,,,,0,650491,5668 +"2020-08-13","NV",1030,,34,,,,982,0,,260,474494,5007,,,,,174,58650,58650,602,0,,,,,,,726658,9083,726658,9083,,,,,533281,5780,727283,9977 +"2020-08-13","NY",25228,,10,,89995,89995,555,0,,124,,0,,,,,56,423440,,737,0,,,,,,,6816381,87900,6816381,87900,,,,,,0,,0 +"2020-08-13","OH",3755,3481,21,274,12023,12023,952,122,2743,329,,0,,,,,178,105426,99856,1178,0,,,,,115454,83642,,0,1822961,26310,,,,,,0,1822961,26310 +"2020-08-13","OK",638,,11,,3901,3901,600,59,,253,685169,8460,,,685169,,,46103,46103,705,0,2446,,,,52741,38655,,0,731272,9165,62502,,,,,0,739287,9347 +"2020-08-13","OR",375,,7,,1845,1845,213,32,,50,440520,5206,,,664293,,17,22022,,248,0,,,,,39984,4282,,0,704277,3654,,,,,461395,5438,704277,3654 +"2020-08-13","PA",7409,,24,,,,601,0,,,1288873,16897,,,,,99,122121,118731,991,0,,,,,,95254,1867118,32178,1867118,32178,,,,,1407604,17889,,0 +"2020-08-13","PR",306,182,11,124,,,466,0,,80,305972,0,,,303412,,57,10279,10279,110,0,14167,,,,7002,,,0,316251,110,,,,,,0,310546,0 +"2020-08-13","RI",1019,,1,,2341,2341,80,5,,10,208234,2230,,,387294,,4,20240,,111,0,,,,,28909,,416203,4154,416203,4154,,,,,228474,2341,,0 +"2020-08-13","SC",2186,2089,42,97,6482,6482,1322,0,,323,702119,5004,52562,,674577,,201,103909,103051,935,0,4168,,,,130613,40837,,0,806028,5939,56730,,,,,0,805170,5912 +"2020-08-13","SD",148,,1,,896,896,56,4,,,114873,1060,,,,,,9897,,82,0,,,,,15804,8691,,0,157828,2157,,,,,124770,1142,157828,2157 +"2020-08-13","TN",1313,1273,24,40,5648,5648,1312,94,,426,,0,,,1633721,,191,128511,126436,2118,0,,,,,151925,89151,,0,1785646,27956,,,,,,0,1785646,27956 +"2020-08-13","TX",9289,,255,,,,6879,0,,2435,,0,,,,,,513575,513575,6755,0,20800,10700,,,685342,375760,,0,4842489,39346,302012,73513,,,,0,4842489,39346 +"2020-08-13","UT",353,,2,,2721,2721,206,25,694,74,541000,4054,,,667956,281,,45424,,334,0,,702,,653,50437,35817,,0,718393,6361,,2340,,1933,586178,4474,718393,6361 +"2020-08-13","VA",2363,2248,11,115,8592,8592,1258,60,,289,,0,,,,,141,103622,99428,1101,0,7653,1091,,,120124,,1301909,18500,1301909,18500,119503,2184,,,,0,,0 +"2020-08-13","VI",9,,0,,,,,0,,,10968,190,,,,,,682,,43,0,,,,,,476,,0,11650,233,,,,,11660,216,,0 +"2020-08-13","VT",58,58,0,,,,14,0,,,102525,737,,,,,,1484,1484,6,0,,,,,,1310,,0,137198,1212,,,,,104009,743,137198,1212 +"2020-08-13","WA",1724,1724,8,,6137,6137,513,35,,,,0,,,,,40,67355,67036,725,0,,,,,,,1269631,15117,1269631,15117,,,,,,0,,0 +"2020-08-13","WI",1025,1018,7,7,5170,5170,354,45,942,109,1035195,11472,,,,,,67622,63206,968,0,,,,,,53239,1459937,19647,1459937,19647,,,,,1098401,12415,,0 +"2020-08-13","WV",153,152,0,1,,,128,0,,46,,0,,,,,16,8151,7985,143,0,,,,,,6045,,0,333035,4122,14935,,,,,0,333035,4122 +"2020-08-13","WY",30,,1,,189,189,14,2,,,56452,207,,,98292,,,3119,2627,33,0,,,,,2973,2601,,0,101265,2757,,,,,59079,234,101265,2757 +"2020-08-12","AK",27,27,1,,186,186,39,5,,,,0,,,287633,,3,3896,,61,0,,,,,4646,1359,,0,292582,1838,,,,,,0,292582,1838 +"2020-08-12","AL",1882,1814,35,68,12292,12292,1386,222,1282,,690985,11147,,,,700,,104786,100801,935,0,,,,,,41523,,0,791786,12022,,,,,791786,12022,,0 +"2020-08-12","AR",566,,0,,3472,3472,486,71,,,522457,0,,,522457,455,113,51114,51114,703,0,,1085,,,,42998,,0,572868,0,,7090,,,,0,572868,0 +"2020-08-12","AS",0,,0,,,,,0,,,1396,0,,,,,,0,0,0,0,,,,,,,,0,1396,0,,,,,,0,1396,0 +"2020-08-12","AZ",4347,4095,148,252,19821,19821,1469,529,,519,854785,6247,,,,,328,189443,188053,706,0,,,,,,,,0,1496412,17963,,,241948,,1042838,6938,1496412,17963 +"2020-08-12","CA",10648,,180,,,,6647,0,,1873,,0,,,,,,586056,586056,11645,0,,,,,,,,0,9303467,117188,,,,,,0,9303467,117188 +"2020-08-12","CO",1875,1533,0,342,6685,6685,288,6,,,554034,4175,136417,,,,,51756,48262,315,0,10053,,,,,,825062,7640,825062,7640,146470,,,,602296,4429,,0 +"2020-08-12","CT",4450,3566,6,884,10920,10920,58,0,,,,0,,,928680,,,50706,48705,22,0,,,,,62390,8721,,0,992993,15331,,,,,,0,992993,15331 +"2020-08-12","DC",593,,0,,,,85,0,,25,,0,,,,,11,12959,,63,0,,,,,,10300,226741,1992,226741,1992,,,,,149644,915,,0 +"2020-08-12","DE",591,521,0,70,,,35,0,,13,186501,0,,,,,,15699,14700,0,0,,,,,19277,8519,286367,3127,286367,3127,,,,,202200,0,,0 +"2020-08-12","FL",8898,,213,,32349,32349,6551,599,,,3536678,30195,381574,375046,4709452,,,543113,,8095,0,27323,,26788,,701395,,5289628,66969,5289628,66969,408950,,401862,,4093972,38385,5438795,62892 +"2020-08-12","GA",4456,,105,,21379,21379,2865,348,3929,,,0,,,,,,226153,226153,3565,0,17025,,,,206540,,,0,1914434,16217,245877,,,,,0,1914434,16217 +"2020-08-12","GU",5,,0,,,,7,0,,1,25787,605,,,,,,449,441,15,0,2,,,,,341,,0,26236,620,151,,,,,0,26226,620 +"2020-08-12","HI",38,38,4,,260,260,166,18,,31,146275,4077,,,,,23,3958,,320,0,,,,,3745,1665,181834,2412,181834,2412,,,,,150233,4397,189492,5984 +"2020-08-12","IA",951,,11,,,,243,0,,72,478342,3751,,39401,,,25,49806,49806,477,0,,,2871,,,38657,,0,528148,4228,,,42311,,531310,4255,,0 +"2020-08-12","ID",246,221,7,25,1037,1037,189,31,289,32,186649,3344,,,,,,25595,23950,495,0,,,,,,9548,,0,210599,3769,,,,,210599,3769,,0 +"2020-08-12","IL",7881,7672,15,209,,,1525,0,,357,,0,,,,,129,199893,198593,1645,0,,,,,,,,0,3189801,42098,,,,,,0,3189801,42098 +"2020-08-12","IN",3086,2878,17,208,9678,9678,936,79,1975,294,790472,4679,,,,,84,76522,,660,0,,,,,81888,,,0,1180636,20395,,,,,866994,5339,1180636,20395 +"2020-08-12","KS",395,,8,,1975,1975,357,64,548,95,302016,7077,,,,195,29,32547,,817,0,,,,,,,,0,334563,7894,,,,,334563,7894,,0 +"2020-08-12","KY",790,785,7,5,4091,4091,683,28,1279,143,,0,,,,,,36945,34415,1152,0,,,,,,8893,,0,672245,6304,44569,556,,,,0,672245,6304 +"2020-08-12","LA",4361,4238,48,123,,,1320,0,,,1464305,28866,,,,,211,134304,134304,1179,0,,,,,,103512,,0,1598609,30045,,,,,,0,1598609,30045 +"2020-08-12","MA",8769,8547,18,222,12109,12109,422,20,,64,1240101,15464,,,,,33,122000,113198,293,0,,,,,149570,100486,,0,1781548,28,,,102782,62738,1353299,15693,1781548,28 +"2020-08-12","MD",3612,3474,8,138,13348,13348,488,82,,117,981454,10838,,93746,,,,97384,97384,541,0,,,8370,,114406,5956,,0,1498088,18015,,,102116,,1078838,11379,1498088,18015 +"2020-08-12","ME",126,125,0,1,394,394,9,0,,4,,0,8679,,,,1,4070,3662,20,0,441,,,,4547,3579,,0,194914,5324,9133,,,,,0,194914,5324 +"2020-08-12","MI",6539,6273,6,266,,,640,0,,185,,0,,,2083152,,84,98689,89271,476,0,,,,,125660,63636,,0,2208812,35914,231232,,,,,0,2208812,35914 +"2020-08-12","MN",1724,1678,17,46,5711,5711,335,50,1657,154,890482,6291,,,,,,62303,62303,464,0,,,,,,55855,1188288,10353,1188288,10353,,,,,952785,6755,,0 +"2020-08-12","MO",1323,,11,,,,861,0,,,736051,9766,,60404,983054,,107,62530,62530,1595,0,,,2397,,72841,,,0,1057708,10898,,,62801,,798581,11361,1057708,10898 +"2020-08-12","MP",2,,0,,4,4,,0,,,12252,0,,,,,,49,49,0,0,,,,,,29,,0,12301,0,,,,,12301,0,14419,0 +"2020-08-12","MS",1989,1922,45,67,4794,4794,1148,56,,323,438440,2329,,,,,195,69374,67913,1081,0,,,,,,49836,,0,507814,3410,17765,,,,,0,506353,3303 +"2020-08-12","MT",80,,3,,301,301,97,25,,,,0,,,,,,5268,,164,0,,,,,,3598,,0,196036,1624,,,,,,0,196036,1624 +"2020-08-12","NC",2249,2249,45,,,,1062,0,,311,,0,,,,,,139061,139061,1166,0,,,,,,,,0,1803344,15704,,,,,,0,1803344,15704 +"2020-08-12","ND",124,,2,,440,440,58,10,,,165049,1076,7516,,,,,7955,7955,87,0,277,,,,,6815,361551,4118,361551,4118,7793,,,,170607,1276,372794,4268 +"2020-08-12","NE",351,,3,,1880,1880,157,139,,,279432,2396,,,361907,,,29030,,334,0,,,,,35635,21312,,0,398463,4142,,,,,308755,2732,398463,4142 +"2020-08-12","NH",420,,1,,705,705,18,0,213,,173564,5026,,,,,,6887,,26,0,,,,,,6162,,0,267620,2592,28710,,28195,,180451,5052,267620,2592 +"2020-08-12","NJ",15824,14046,11,1778,22096,22096,592,44,,111,2190078,25243,,,,,35,188635,185938,494,0,,,,,,,,0,2378713,25737,,,,,,0,2376016,25706 +"2020-08-12","NM",695,,2,,2907,2907,119,10,,,,0,,,,,,22816,,173,0,,,,,,9744,,0,644823,4486,,,,,,0,644823,4486 +"2020-08-12","NV",996,,15,,,,998,0,,268,469487,2258,,,,,177,58048,58048,528,0,,,,,,,717575,8770,717575,8770,,,,,527501,2689,717306,4687 +"2020-08-12","NY",25218,,7,,89995,89995,558,0,,123,,0,,,,,62,422703,,700,0,,,,,,,6728481,87776,6728481,87776,,,,,,0,,0 +"2020-08-12","OH",3734,3460,26,274,11901,11901,984,141,2721,320,,0,,,,,173,104248,98725,1422,0,,,,,113957,82310,,0,1796651,20056,,,,,,0,1796651,20056 +"2020-08-12","OK",627,,9,,3842,3842,519,82,,216,676709,7202,,,676709,,,45398,45398,670,0,2446,,,,51862,37988,,0,722107,7872,62502,,,,,0,729940,7842 +"2020-08-12","OR",368,,11,,1813,1813,234,15,,59,435314,6070,,,660933,,15,21774,,286,0,,,,,39690,4226,,0,700623,4794,,,,,455957,6328,700623,4794 +"2020-08-12","PA",7385,,33,,,,606,0,,,1271976,16663,,,,,96,121130,117739,849,0,,,,,,94481,1834940,28728,1834940,28728,,,,,1389715,17477,,0 +"2020-08-12","PR",295,174,8,121,,,447,0,,75,305972,0,,,303412,,57,10169,10169,564,0,13905,,,,7002,,,0,316141,564,,,,,,0,310546,0 +"2020-08-12","RI",1018,,2,,2336,2336,89,19,,9,206004,1887,,,382951,,3,20129,,76,0,,,,,28776,,412049,3975,412049,3975,,,,,226133,1963,,-409435 +"2020-08-12","SC",2144,2057,46,87,6482,6482,1366,0,,333,697115,2894,52236,,669714,,206,102974,102143,844,0,4073,,,,129544,40837,,0,800089,3738,56309,,,,,0,799258,3677 +"2020-08-12","SD",147,,1,,892,892,59,5,,,113813,1117,,,,,,9815,,102,0,,,,,15683,8606,,0,155671,1608,,,,,123628,1219,155671,1608 +"2020-08-12","TN",1289,1249,18,40,5554,5554,1295,90,,428,,0,,,1608323,,185,126393,124391,1478,0,,,,,149367,87290,,0,1757690,18815,,,,,,0,1757690,18815 +"2020-08-12","TX",9034,,324,,,,7028,0,,2479,,0,,,,,,506820,506820,6200,0,20241,10589,,,681048,367354,,0,4803143,42595,299037,71941,,,,0,4803143,42595 +"2020-08-12","UT",351,,2,,2696,2696,236,19,690,79,536946,3614,,,662068,279,,45090,,338,0,,691,,644,49964,35311,,0,712032,5774,,2147,,1774,581704,4007,712032,5774 +"2020-08-12","VA",2352,2238,8,114,8532,8532,1281,74,,290,,0,,,,,142,102521,98374,776,0,7566,1066,,,118778,,1283409,15897,1283409,15897,118560,2089,,,,0,,0 +"2020-08-12","VI",9,,0,,,,,0,,,10778,291,,,,,,639,,63,0,,,,,,468,,0,11417,354,,,,,11444,355,,0 +"2020-08-12","VT",58,58,0,,,,9,0,,,101788,1052,,,,,,1478,1478,5,0,,,,,,1302,,0,135986,1670,,,,,103266,1057,135986,1670 +"2020-08-12","WA",1716,1716,19,,6102,6102,480,53,,,,0,,,,,59,66630,66330,824,0,,,,,,,1254514,16612,1254514,16612,,,,,,0,,0 +"2020-08-12","WI",1018,1011,5,7,5125,5125,387,33,941,113,1023723,9446,,,,,,66654,62263,531,0,,,,,,52350,1440290,16220,1440290,16220,,,,,1085986,9924,,0 +"2020-08-12","WV",153,,6,,,,135,0,,48,,0,,,,,16,8008,7844,133,0,,,,,,5960,,0,328913,4548,14831,,,,,0,328913,4548 +"2020-08-12","WY",29,,0,,187,187,15,4,,,56245,466,,,95574,,,3086,2600,13,0,,,,,2934,2577,,0,98508,3033,,,,,58845,482,98508,3033 +"2020-08-11","AK",26,26,0,,181,181,39,1,,,,0,,,285813,,4,3835,,49,0,,,,,4628,1344,,0,290744,10401,,,,,,0,290744,10401 +"2020-08-11","AL",1847,1781,50,66,12070,12070,1504,0,1270,,679838,2291,,,,691,,103851,99926,831,0,,,,,,37923,,0,779764,2827,,,,,779764,2827,,0 +"2020-08-11","AR",566,,11,,3401,3401,507,65,,,522457,3165,,,522457,450,116,50411,50411,383,0,,1085,,,,42998,,0,572868,3548,,7090,,,,0,572868,3548 +"2020-08-11","AS",0,,0,,,,,0,,,1396,0,,,,,,0,0,0,0,,,,,,,,0,1396,0,,,,,,0,1396,0 +"2020-08-11","AZ",4199,3951,45,248,19292,19292,1574,15,,510,848538,7830,,,,,346,188737,187362,1214,0,,,,,,,,0,1478449,18163,,,241052,,1035900,9012,1478449,18163 +"2020-08-11","CA",10468,,109,,,,6759,0,,1885,,0,,,,,,574411,574411,12500,0,,,,,,,,0,9186279,187926,,,,,,0,9186279,187926 +"2020-08-11","CO",1875,1533,12,342,6679,6679,315,52,,,549859,3716,135702,,,,,51441,48008,402,0,9992,,,,,,817422,7146,817422,7146,145694,,,,597867,4073,,0 +"2020-08-11","CT",4444,3561,0,883,10920,10920,70,0,,,,0,,,913480,,,50684,48690,117,0,,,,,62261,8721,,0,977662,16155,,,,,,0,977662,16155 +"2020-08-11","DC",593,,2,,,,83,0,,21,,0,,,,,12,12896,,89,0,,,,,,10232,224749,4358,224749,4358,,,,,148729,2252,,0 +"2020-08-11","DE",591,521,0,70,,,35,0,,13,186501,1463,,,,,,15699,14700,65,0,,,,,19196,8519,283240,2820,283240,2820,,,,,202200,1528,,0 +"2020-08-11","FL",8685,8685,277,,31750,31750,6753,573,,,3506483,29587,381574,375046,4658471,,,535018,,5762,0,27323,,26788,,690302,,5222659,55472,5222659,55472,408950,,401862,,4055587,35514,5375903,55758 +"2020-08-11","GA",4351,,122,,21031,21031,2881,355,3832,,,0,,,,,,222588,222588,3563,0,16791,,,,204553,,,0,1898217,28605,243577,,,,,0,1898217,28605 +"2020-08-11","GU",5,,0,,,,7,0,,1,25182,524,,,,,,434,426,16,0,2,,,,,325,,0,25616,540,151,,,,,0,25606,1252 +"2020-08-11","HI",34,34,3,,242,242,105,3,,24,142198,3600,,,,,15,3638,,140,0,,,,,3605,1586,179422,2442,179422,2442,,,,,145836,3892,183508,2508 +"2020-08-11","IA",940,,7,,,,244,0,,64,474591,2275,,39336,,,25,49329,49329,258,0,,,2860,,,38033,,0,523920,2533,,,42235,,527055,2610,,0 +"2020-08-11","ID",239,214,2,25,1006,1006,189,7,282,32,183305,1500,,,,,,25100,23525,429,0,,,,,,9341,,0,206830,1902,,,,,206830,1902,,0 +"2020-08-11","IL",7866,7657,20,209,,,1459,0,,336,,0,,,,,127,198248,196948,1549,0,,,,,,,,0,3147703,41362,,,,,,0,3147703,41362 +"2020-08-11","IN",3069,2863,25,206,9599,9599,964,245,1961,327,785793,8674,,,,,87,75862,,870,0,,,,,80828,,,0,1160241,23169,,,,,861655,9544,1160241,23169 +"2020-08-11","KS",387,,0,,1911,1911,216,0,534,60,294939,0,,,,194,19,31730,,0,0,,,,,,,,0,326669,0,,,,,326669,0,,0 +"2020-08-11","KY",783,778,8,5,4063,4063,667,39,1270,148,,0,,,,,,35793,33379,539,0,,,,,,8819,,0,665941,10447,44520,556,,,,0,665941,10447 +"2020-08-11","LA",4313,4195,26,118,,,1335,0,,,1435439,19467,,,,,214,133125,133125,1164,0,,,,,,89083,,0,1568564,20631,,,,,,0,1568564,20631 +"2020-08-11","MA",8751,8529,10,222,12089,12089,387,27,,70,1224637,14676,,,,,33,121707,112969,392,0,,,,,149568,99021,,0,1781520,3418,,,102208,,1337606,14972,1781520,3418 +"2020-08-11","MD",3604,3467,13,137,13266,13266,529,19,,121,970616,10064,,93746,,,,96843,96843,585,0,,,8370,,113761,5935,,0,1480073,17145,,,102116,,1067459,10649,1480073,17145 +"2020-08-11","ME",126,125,1,1,394,394,9,1,,4,,0,8663,,,,1,4050,3644,1,0,441,,,,4526,3560,,0,189590,1519,9117,,,,,0,189590,1519 +"2020-08-11","MI",6533,6264,7,269,,,640,0,,185,,0,,,2048341,,85,98213,88756,907,0,,,,,124557,63636,,0,2172898,24112,230011,,,,,0,2172898,24112 +"2020-08-11","MN",1707,1666,6,41,5661,5661,337,55,1648,147,884191,1547,,,,,,61839,61839,323,0,,,,,,55151,1177935,5817,1177935,5817,,,,,946030,1870,,0 +"2020-08-11","MO",1312,,5,,,,923,0,,,726285,16321,,60514,972909,,112,60935,60935,981,0,,,2394,,72091,,,0,1046810,17842,,,62908,,787220,17302,1046810,17842 +"2020-08-11","MP",2,,0,,4,4,,0,,,12252,0,,,,,,49,49,0,0,,,,,,29,,0,12301,0,,,,,12301,0,14419,0 +"2020-08-11","MS",1944,1879,32,65,4738,4738,1114,58,,325,436111,9167,,,,,192,68293,66939,644,0,,,,,,49836,,0,504404,9811,17684,,,,,0,503050,10664 +"2020-08-11","MT",77,,2,,276,276,77,3,,,,0,,,,,,5104,,87,0,,,,,,3542,,0,194412,1007,,,,,,0,194412,1007 +"2020-08-11","NC",2204,2204,32,,,,1122,0,,329,,0,,,,,,137895,137895,1051,0,,,,,,,,0,1787640,17137,,,,,,0,1787640,17137 +"2020-08-11","ND",122,,5,,430,430,55,13,,,163973,1847,7470,,,,,7868,7868,169,0,275,,,,,6668,357433,5454,357433,5454,7745,,,,169331,1976,368526,5766 +"2020-08-11","NE",348,,3,,1741,1741,162,19,,,277036,2833,,,358186,,,28696,,264,0,,,,,35220,21113,,0,394321,4499,,,,,306023,3097,394321,4499 +"2020-08-11","NH",419,,0,,705,705,21,1,211,,168538,1100,,,,,,6861,,21,0,,,,,,6126,,0,265028,2078,28620,,28105,,175399,1121,265028,2078 +"2020-08-11","NJ",15813,14037,12,1776,22052,22052,538,60,,101,2164835,25820,,,,,43,188141,185475,491,0,,,,,,,,0,2352976,26311,,,,,,0,2350310,26264 +"2020-08-11","NM",693,,3,,2897,2897,134,27,,,,0,,,,,,22643,,199,0,,,,,,9612,,0,640337,7340,,,,,,0,640337,7340 +"2020-08-11","NV",981,,18,,,,971,0,,257,467229,2009,,,,,171,57520,57520,548,0,,,,,,,708805,6920,708805,6920,,,,,524812,2409,712619,4158 +"2020-08-11","NY",25211,,7,,89995,89995,540,0,,120,,0,,,,,60,422003,,667,0,,,,,,,6640705,77059,6640705,77059,,,,,,0,,0 +"2020-08-11","OH",3708,3435,35,273,11760,11760,968,131,2699,338,,0,,,,,172,102826,97373,1095,0,,,,,113042,80885,,0,1776595,18072,,,,,,0,1776595,18072 +"2020-08-11","OK",618,,13,,3760,3760,530,135,,218,669507,19022,,,669507,,,44728,44728,765,0,2446,,,,51238,37193,,0,714235,19787,62502,,,,,0,722098,21117 +"2020-08-11","OR",357,,1,,1798,1798,214,40,,58,429244,3479,,,656485,,22,21488,,216,0,,,,,39344,4226,,0,695829,2473,,,,,449629,13010,695829,2473 +"2020-08-11","PA",7352,,35,,,,598,0,,,1255313,14483,,,,,98,120281,116925,828,0,,,,,,92616,1806212,22876,1806212,22876,,,,,1372238,15310,,0 +"2020-08-11","PR",287,167,8,120,,,439,0,,80,305972,0,,,303412,,62,9605,9605,286,0,13798,,,,7002,,,0,315577,286,,,,,,0,310546,0 +"2020-08-11","RI",1016,,1,,2317,2317,88,6,,9,204117,1704,,,380599,,2,20053,,119,0,,,,,28836,,408074,4142,408074,4142,,,,,224170,1823,409435,4283 +"2020-08-11","SC",2098,2012,49,86,6482,6482,1330,329,,339,694221,3750,52099,,666735,,207,102130,101360,971,0,4049,,,,128846,40837,,0,796351,4721,56148,,,,,0,795581,4679 +"2020-08-11","SD",146,,0,,887,887,57,5,,,112696,882,,,,,,9713,,50,0,,,,,15596,8507,,0,154063,1120,,,,,122409,932,154063,1120 +"2020-08-11","TN",1271,1232,38,39,5464,5464,1378,125,,,,0,,,1591309,,,124915,123006,1001,0,,,,,147566,85313,,0,1738875,12785,,,,,,0,1738875,12785 +"2020-08-11","TX",8710,,220,,,,7216,0,,2495,,0,,,,,,500620,500620,9803,0,19800,10472,,,676264,358312,,0,4760548,42078,295617,70363,,,,0,4760548,42078 +"2020-08-11","UT",349,,4,,2677,2677,208,35,685,81,533332,2679,,,656729,277,,44752,,362,0,,673,,630,49529,34764,,0,706258,4193,,1949,,1627,577697,2999,706258,4193 +"2020-08-11","VA",2344,2232,17,112,8458,8458,1293,67,,280,,0,,,,,148,101745,97712,996,0,7527,1032,,,117747,,1267512,9907,1267512,9907,117915,1983,,,,0,,0 +"2020-08-11","VI",9,,0,,,,,0,,,10487,130,,,,,,576,,29,0,,,,,,439,,0,11063,159,,,,,11089,184,,0 +"2020-08-11","VT",58,58,0,,,,12,0,,,100736,981,,,,,,1473,1473,12,0,,,,,,1295,,0,134316,1437,,,,,102209,993,134316,1437 +"2020-08-11","WA",1697,1697,9,,6049,6049,495,48,,,,0,,,,,35,65806,65516,213,0,,,,,,,1237902,15951,1237902,15951,,,,,,0,,0 +"2020-08-11","WI",1013,1006,8,7,5092,5092,364,61,939,111,1014277,12875,,,,,,66123,61785,767,0,,,,,,51456,1424070,10532,1424070,10532,,,,,1076062,13599,,0 +"2020-08-11","WV",147,,6,,,,130,0,,46,,0,,,,,14,7875,7713,121,0,,,,,,5863,,0,324365,3374,14810,,,,,0,324365,3374 +"2020-08-11","WY",29,,1,,183,183,15,4,,,55779,1139,,,92610,,,3073,2584,31,0,,,,,2865,2541,,0,95475,3374,,,,,58363,1158,95475,3374 +"2020-08-10","AK",26,26,0,,180,180,37,4,,,,0,,,272428,,3,3786,,68,0,,,,,4290,1332,,0,280343,2424,,,,,,0,280343,2424 +"2020-08-10","AL",1797,1733,29,64,12070,12070,1551,533,1249,,677547,16430,,,,680,,103020,99390,1686,0,,,,,,37923,,0,776937,18085,,,,,776937,18085,,0 +"2020-08-10","AR",555,,11,,3336,3336,508,52,,,519292,4844,,,,443,117,50028,50028,645,0,,1085,,,,42130,,0,569320,5489,,7090,,,,0,569320,5489 +"2020-08-10","AS",0,,0,,,,,0,,,1396,0,,,,,,0,0,0,0,,,,,,,,0,1396,0,,,,,,0,1396,0 +"2020-08-10","AZ",4154,3922,4,232,19277,19277,1575,9,,506,840708,5068,,,,,366,187523,186180,600,0,,,,,,,,0,1460286,7764,,,240582,,1026888,5655,1460286,7764 +"2020-08-10","CA",10359,,66,,,,6770,0,,1879,,0,,,,,,561911,561911,7751,0,,,,,,,,0,8998353,172234,,,,,,0,8998353,172234 +"2020-08-10","CO",1863,1522,5,341,6627,6627,309,11,,,546143,4963,135225,,,,,51039,47651,379,0,9956,,,,,,810276,8537,810276,8537,145181,,,,593794,5247,,0 +"2020-08-10","CT",4444,3560,3,884,10920,10920,64,0,,,,0,,,897440,,,50567,48577,247,0,,,,,62149,8721,,0,961507,6498,,,,,,0,961507,6498 +"2020-08-10","DC",591,,0,,,,75,0,,21,,0,,,,,8,12807,,54,0,,,,,,10188,220391,2449,220391,2449,,,,,146477,943,,0 +"2020-08-10","DE",591,521,0,70,,,34,0,,12,185038,2494,,,,,,15634,14636,59,0,,,,,19132,8500,280420,3793,280420,3793,,,,,200672,2553,,0 +"2020-08-10","FL",8408,8408,93,,31177,31177,6948,284,,,3476896,24039,381574,375046,4611442,,,529256,,4150,0,27323,,26788,,682190,,5167187,47934,5167187,47934,408950,,401862,,4020073,28247,5320145,45904 +"2020-08-10","GA",4229,,30,,20676,20676,2871,48,3767,,,0,,,,,,219025,219025,2429,0,16749,,,,201850,,,0,1869612,22035,243257,,,,,0,1869612,22035 +"2020-08-10","GU",5,,0,,,,5,0,,1,24658,541,,,,,,418,410,6,0,2,,,,,325,,0,25076,547,147,,,,,0,24354,0 +"2020-08-10","HI",31,31,0,,239,239,105,2,,24,138598,0,,,,,15,3498,,152,0,,,,,3461,1548,176980,2746,176980,2746,,,,,141944,0,181000,2789 +"2020-08-10","IA",933,,3,,,,224,0,,57,472316,2295,,39217,,,23,49071,49071,282,0,,,2849,,,37317,,0,521387,2577,,,42105,,524445,2662,,0 +"2020-08-10","ID",237,212,2,25,999,999,201,11,280,48,181805,1469,,,,,,24671,23123,176,0,,,,,,9157,,0,204928,1639,,,,,204928,1639,,0 +"2020-08-10","IL",7846,7637,1,209,,,1481,0,,352,,0,,,,,138,196699,195399,1319,0,,,,,,,,0,3106341,32353,,,,,,0,3106341,32353 +"2020-08-10","IN",3044,2838,3,206,9354,9354,921,0,1927,305,777119,10322,,,,,81,74992,,664,0,,,,,79539,,,0,1137072,5323,,,,,852111,10986,1137072,5323 +"2020-08-10","KS",387,,7,,1911,1911,216,36,534,60,294939,9065,,,,194,19,31730,,1092,0,,,,,,,,0,326669,10157,,,,,326669,10157,,0 +"2020-08-10","KY",775,770,2,5,4024,4024,641,22,1267,155,,0,,,,,,35254,32941,272,0,,,,,,8738,,0,655494,9307,44407,516,,,,0,655494,9307 +"2020-08-10","LA",4287,4169,24,118,,,1382,0,,,1415972,6800,,,,,215,131961,131961,562,0,,,,,,89083,,0,1547933,7362,,,,,,0,1547933,7362 +"2020-08-10","MA",8741,8519,6,222,12062,12062,380,8,,60,1209961,11062,,,,,25,121315,112673,275,0,,,,,149527,99021,,0,1778102,14941,,,101714,,1322634,11276,1778102,14941 +"2020-08-10","MD",3591,3454,6,137,13247,13247,534,70,,119,960552,16710,,93746,,,,96258,96258,755,0,,,8370,,113011,5910,,0,1462928,29532,,,102116,,1056810,17465,1462928,29532 +"2020-08-10","ME",125,124,0,1,393,393,8,0,,3,,0,8657,,,,1,4049,3641,7,0,440,,,,4516,3537,,0,188071,1850,9110,,,,,0,188071,1850 +"2020-08-10","MI",6526,6257,7,269,,,640,0,,185,,0,,,2025283,,132,97306,87960,580,0,,,,,123503,63636,,0,2148786,21438,229030,,,,,0,2148786,21438 +"2020-08-10","MN",1701,1660,3,41,5606,5606,320,51,1633,159,882644,8569,,,,,,61516,61516,618,0,,,,,,54364,1172118,12979,1172118,12979,,,,,944160,9187,,0 +"2020-08-10","MO",1307,,6,,,,923,0,,,709964,14603,,60069,958061,,112,59954,59954,2575,0,,,2345,,69115,,,0,1028968,32351,,,62414,,769918,17178,1028968,32351 +"2020-08-10","MP",2,,0,,4,4,,0,,,12252,-1,,,,,,49,49,1,0,,,,,,29,,0,12301,0,,,,,12301,0,14419,0 +"2020-08-10","MS",1912,1847,16,65,4680,4680,1074,74,,328,426944,0,,,,,196,67649,66334,476,0,,,,,,42391,,0,494593,476,17226,,,,,0,492386,0 +"2020-08-10","MT",75,,0,,273,273,80,1,,,,0,,,,,,5017,,65,0,,,,,,3413,,0,193405,3459,,,,,,0,193405,3459 +"2020-08-10","NC",2172,2172,4,,,,1111,0,,317,,0,,,,,,136844,136844,626,0,,,,,,,,0,1770503,19182,,,,,,0,1770503,19182 +"2020-08-10","ND",117,,1,,417,417,48,2,,,162126,1050,7403,,,,,7699,7699,117,0,272,,,,,6434,351979,4463,351979,4463,7675,,,,167355,1161,362760,4582 +"2020-08-10","NE",345,,0,,1722,1722,146,7,,,274203,2774,,,354027,,,28432,,187,0,,,,,34886,20896,,0,389822,4262,,,,,302926,2959,389822,4262 +"2020-08-10","NH",419,,0,,704,704,20,3,210,,167438,1684,,,,,,6840,,9,0,,,,,,6095,,0,262950,2942,28541,,28046,,174278,1693,262950,2942 +"2020-08-10","NJ",15801,14025,4,1776,21992,21992,545,0,,83,2139015,21936,,,,,29,187650,185031,278,0,,,,,,,,0,2326665,22214,,,,,,0,2324046,22194 +"2020-08-10","NM",690,,5,,2870,2870,127,19,,,,0,,,,,,22444,,129,0,,,,,,9428,,0,632997,5370,,,,,,0,632997,5370 +"2020-08-10","NV",963,,6,,,,1014,0,,266,465220,3846,,,,,172,56972,56972,742,0,,,,,,,701885,1985,701885,1985,,,,,522403,4663,708461,8249 +"2020-08-10","NY",25204,,2,,89995,89995,535,0,,127,,0,,,,,62,421336,,476,0,,,,,,,6563646,54002,6563646,54002,,,,,,0,,0 +"2020-08-10","OH",3673,3405,4,268,11629,11629,968,64,2680,351,,0,,,,,195,101731,96358,883,0,,,,,112234,79321,,0,1758523,21465,,,,,,0,1758523,21465 +"2020-08-10","OK",605,,2,,3625,3625,594,20,,223,650485,0,,,650485,,,43963,43963,397,0,2446,,,,49186,36378,,0,694448,397,62502,,,,,0,700981,0 +"2020-08-10","OR",356,,1,,1758,1758,204,0,,51,425765,8708,,,654236,,18,21272,,262,0,,,,,39120,4111,,0,693356,2318,,,,,436619,0,693356,2318 +"2020-08-10","PA",7317,,3,,,,591,0,,,1240830,12472,,,,,108,119453,116098,601,0,,,,,,91978,1783336,18972,1783336,18972,,,,,1356928,13065,,0 +"2020-08-10","PR",279,161,0,118,,,423,0,,77,305972,0,,,303412,,50,9319,9319,385,0,13502,,,,7002,,,0,315291,385,,,,,,0,310546,0 +"2020-08-10","RI",1015,,0,,2311,2311,93,0,,8,202413,829,,,376445,,2,19934,,28,0,,,,,28707,,403932,1557,403932,1557,,,,,222347,857,405152,1406 +"2020-08-10","SC",2049,1966,18,83,6153,6153,1353,0,,360,690471,4922,52035,,663060,,217,101159,100431,724,0,4035,,,,127842,37798,,0,791630,5646,56070,,,,,0,790902,5640 +"2020-08-10","SD",146,,0,,882,882,63,6,,,111814,522,,,,,,9663,,58,0,,,,,15538,8371,,0,152943,560,,,,,121477,580,152943,560 +"2020-08-10","TN",1233,1194,10,39,5339,5339,1167,35,,,,0,,,1579674,,,123914,122097,1202,0,,,,,146416,83170,,0,1726090,14771,,,,,,0,1726090,14771 +"2020-08-10","TX",8490,,31,,,,7304,0,,2552,,0,,,,,,490817,490817,4455,0,18924,10351,,,671019,349833,,0,4718470,14430,290944,68552,,,,0,4718470,14430 +"2020-08-10","UT",345,,9,,2642,2642,222,22,673,79,530653,2936,,,652896,275,,44390,,263,0,,649,,609,49169,34319,,0,702065,4411,,1819,,1518,574698,3178,702065,4411 +"2020-08-10","VA",2327,2215,1,112,8391,8391,1251,22,,279,,0,,,,,159,100749,96807,663,0,7510,990,,,116969,,1257605,17266,1257605,17266,117808,1869,,,,0,,0 +"2020-08-10","VI",9,,0,,,,,0,,,10357,25,,,,,,547,,0,0,,,,,,410,,0,10904,25,,,,,10905,5,,0 +"2020-08-10","VT",58,58,0,,,,11,0,,,99755,672,,,,,,1461,1461,3,0,,,,,,1282,,0,132879,946,,,,,101216,675,132879,946 +"2020-08-10","WA",1688,1688,0,,6001,6001,532,105,,,,0,,,,,49,65593,65307,364,0,,,,,,,1221951,18954,1221951,18954,,,,,,0,,0 +"2020-08-10","WI",1005,998,0,7,5031,5031,414,31,938,119,1001402,7660,,,,,,65356,61061,521,0,,,,,,50662,1413538,12367,1413538,12367,,,,,1062463,8167,,0 +"2020-08-10","WV",141,,2,,,,123,0,,43,,0,,,,,17,7754,7596,60,0,,,,,,5699,,0,320991,3907,14806,,,,,0,320991,3907 +"2020-08-10","WY",28,,0,,179,179,15,2,,,54640,1015,,,89306,,,3042,2565,-8,0,,,,,2795,2483,,0,92101,2303,,,,,57205,1090,92101,2303 +"2020-08-09","AK",26,26,0,,176,176,40,4,,,,0,,,270039,,4,3718,,97,0,,,,,4274,1269,,0,277919,4326,,,,,,0,277919,4326 +"2020-08-09","AL",1768,1707,33,61,11537,11537,1449,0,1242,,661117,10002,,,,674,,101334,97735,2947,0,,,,,,37923,,0,758852,12910,,,,,758852,12910,,0 +"2020-08-09","AR",544,,23,,3284,3284,497,61,,,514448,10964,,,,437,117,49383,49383,1344,0,,1085,,,,41452,,0,563831,12308,,7090,,,,0,563831,12308 +"2020-08-09","AS",0,,0,,,,,0,,,1396,0,,,,,,0,0,0,0,,,,,,,,0,1396,0,,,,,,0,1396,0 +"2020-08-09","AZ",4150,3918,13,232,19268,19268,1626,24,,514,835640,5226,,,,,374,186923,185593,816,0,,,,,,,,0,1452522,9320,,,239427,,1021233,6015,1452522,9320 +"2020-08-09","CA",10293,,104,,,,6849,0,,1891,,0,,,,,,554160,554160,8373,0,,,,,,,,0,8826119,118592,,,,,,0,8826119,118592 +"2020-08-09","CO",1858,1517,1,341,6616,6616,319,14,,,541180,5624,134871,,,,,50660,47367,336,0,9941,,,,,,801739,10717,801739,10717,144812,,,,588547,5908,,0 +"2020-08-09","CT",4441,3558,0,883,10920,10920,65,0,,,,0,,,890981,,,50320,48345,0,0,,,,,62110,8721,,0,955009,5309,,,,,,0,955009,5309 +"2020-08-09","DC",591,,1,,,,77,0,,17,,0,,,,,8,12753,,100,0,,,,,,10156,217942,4608,217942,4608,,,,,145534,3006,,0 +"2020-08-09","DE",591,521,1,70,,,36,0,,11,182544,2152,,,,,,15575,14576,73,0,,,,,19049,8449,276627,2369,276627,2369,,,,,198119,2225,,0 +"2020-08-09","FL",8315,8315,77,,30893,30893,6848,254,,,3452857,33562,381574,375046,4571866,,,525106,,6139,0,27323,,26788,,676365,,5119253,71550,5119253,71550,408950,,401862,,3991826,39798,5274241,61932 +"2020-08-09","GA",4199,,13,,20628,20628,2865,72,3752,,,0,,,,,,216596,216596,3169,0,16503,,,,199607,,,0,1847577,32143,241290,,,,,0,1847577,32143 +"2020-08-09","GU",5,,0,,,,3,0,,,24117,0,,,,,,412,404,0,0,2,,,,,321,,0,24529,0,147,,,,,0,24354,0 +"2020-08-09","HI",31,31,0,,237,237,105,6,,24,138598,2467,,,,,15,3346,,231,0,,,,,3319,1511,174234,3129,174234,3129,,,,,141944,2698,178211,3494 +"2020-08-09","IA",930,,5,,,,221,0,,57,470021,4757,,39174,,,20,48789,48789,506,0,,,2839,,,37096,,0,518810,5263,,,42052,,521783,5381,,0 +"2020-08-09","ID",235,211,6,24,988,988,201,20,279,48,180336,1287,,,,,,24495,22953,573,0,,,,,,8921,,0,203289,1832,,,,,203289,1832,,0 +"2020-08-09","IL",7845,7636,5,209,,,1488,0,,322,,0,,,,,114,195380,194080,1382,0,,,,,,,,0,3073988,41354,,,,,,0,3073988,41354 +"2020-08-09","IN",3041,2835,5,206,9354,9354,960,0,1927,289,766797,11618,,,,,78,74328,,1041,0,,,,,79241,,,0,1131749,7788,,,,,841125,12659,1131749,7788 +"2020-08-09","KS",380,,0,,1875,1875,333,0,526,88,285874,0,,,,193,26,30638,,0,0,,,,,,,,0,316512,0,,,,,316512,0,,0 +"2020-08-09","KY",773,768,1,5,4002,4002,653,0,1258,149,,0,,,,,,34982,32713,404,0,,,,,,8674,,0,646187,0,44296,459,,,,0,646187,0 +"2020-08-09","LA",4263,4145,56,118,,,1383,0,,,1409172,32916,,,,,210,131399,131399,2653,0,,,,,,89083,,0,1540571,35569,,,,,,0,1540571,35569 +"2020-08-09","MA",8735,8514,14,221,12054,12054,375,10,,60,1198899,16866,,,,,26,121040,112459,329,0,,,,,149301,99021,,0,1763161,7683,,,101485,,1311358,17152,1763161,7683 +"2020-08-09","MD",3585,3448,8,137,13177,13177,525,72,,128,943842,18900,,93746,,,,95503,95503,922,0,,,8370,,112072,5910,,0,1433396,40672,,,102116,,1039345,19822,1433396,40672 +"2020-08-09","ME",125,124,0,1,393,393,9,0,,3,,0,8644,,,,1,4042,3625,16,0,440,,,,4504,3512,,0,186221,2483,9097,,,,,0,186221,2483 +"2020-08-09","MI",6519,6249,-1,270,,,694,0,,232,,0,,,2004606,,132,96726,87403,535,0,,,,,122742,63636,,0,2127348,26500,228519,,,,,0,2127348,26500 +"2020-08-09","MN",1698,1657,9,41,5555,5555,312,49,1615,148,874075,12779,,,,,,60898,60898,797,0,,,,,,53568,1159139,20544,1159139,20544,,,,,934973,13576,,0 +"2020-08-09","MO",1301,,0,,,,895,0,,,695361,0,,59384,928188,,105,57379,57379,0,0,,,2324,,66665,,,0,996617,0,,,61708,,752740,0,996617,0 +"2020-08-09","MP",2,,0,,4,4,,0,,,12253,0,,,,,,48,48,0,0,,,,,,29,,0,12301,0,,,,,12301,0,14419,0 +"2020-08-09","MS",1896,1832,22,64,4606,4606,1151,0,,334,426944,0,,,,,198,67173,65906,527,0,,,,,,42391,,0,494117,527,17226,,,,,0,492386,0 +"2020-08-09","MT",75,,0,,272,272,83,4,,,,0,,,,,,4952,,63,0,,,,,,3275,,0,189946,1100,,,,,,0,189946,1100 +"2020-08-09","NC",2168,2168,8,,,,1109,0,,315,,0,,,,,,136218,136218,1452,0,,,,,,,,0,1751321,21031,,,,,,0,1751321,21031 +"2020-08-09","ND",116,,0,,415,415,47,1,,,161076,1217,7391,,,,,7582,7582,91,0,272,,,,,6355,347516,5438,347516,5438,7663,,,,166194,1231,358178,5648 +"2020-08-09","NE",345,,0,,1715,1715,147,11,,,271429,1995,,,350003,,,28245,,141,0,,,,,34649,20746,,0,385560,2859,,,,,299967,2135,385560,2859 +"2020-08-09","NH",419,,0,,701,701,23,1,210,,165754,1321,,,,,,6831,,13,0,,,,,,6063,,0,260008,2411,28483,,27975,,172585,1334,260008,2411 +"2020-08-09","NJ",15797,14021,5,1776,21992,21992,483,43,,83,2117079,48716,,,,,31,187372,184773,366,0,,,,,,,,0,2304451,49082,,,,,,0,2301852,49060 +"2020-08-09","NM",685,,4,,2851,2851,121,13,,,,0,,,,,,22315,,200,0,,,,,,9319,,0,627627,7499,,,,,,0,627627,7499 +"2020-08-09","NV",957,,8,,,,976,0,,278,461374,3774,,,,,173,56230,56230,811,0,,,,,,,699900,4148,699900,4148,,,,,517740,4704,700212,8597 +"2020-08-09","NY",25202,,7,,89995,89995,548,0,,131,,0,,,,,66,420860,,515,0,,,,,,,6509644,65812,6509644,65812,,,,,,0,,0 +"2020-08-09","OH",3669,3397,1,272,11565,11565,952,49,2665,365,,0,,,,,193,100848,95496,879,0,,,,,111198,78435,,0,1737058,27618,,,,,,0,1737058,27618 +"2020-08-09","OK",603,,0,,3605,3605,594,11,,223,650485,0,,,650485,,,43566,43566,486,0,2446,,,,49186,36052,,0,694051,486,62502,,,,,0,700981,0 +"2020-08-09","OR",355,,7,,1758,1758,204,0,,51,417057,0,,,652352,,18,21010,,374,0,,,,,38686,4111,,0,691038,2558,,,,,436619,0,691038,2558 +"2020-08-09","PA",7314,,1,,,,600,0,,,1228358,13393,,,,,103,118852,115505,760,0,,,,,,90930,1764364,20409,1764364,20409,,,,,1343863,14143,,0 +"2020-08-09","PR",279,161,5,118,,,424,0,,79,305972,0,,,303412,,53,8934,8934,361,0,13187,,,,7002,,,0,314906,361,,,,,,0,310546,0 +"2020-08-09","RI",1015,,0,,2311,2311,93,17,,8,201584,1451,,,375072,,2,19906,,74,0,,,,,28674,,402375,3399,402375,3399,,,,,221490,1525,403746,3339 +"2020-08-09","SC",2031,1949,24,82,6153,6153,1378,0,,365,685549,6934,51871,,658206,,219,100435,99713,975,0,4011,,,,127056,37798,,0,785984,7909,55882,,,,,0,785262,7904 +"2020-08-09","SD",146,,0,,876,876,55,5,,,111292,782,,,,,,9605,,128,0,,,,,15481,8334,,0,152383,1808,,,,,120897,910,152383,1808 +"2020-08-09","TN",1223,1184,8,39,5304,5304,1290,42,,,,0,,,1566388,,,122712,120911,2127,0,,,,,144931,80997,,0,1711319,27597,,,,,,0,1711319,27597 +"2020-08-09","TX",8459,,116,,,,7437,0,,2608,,0,,,,,,486362,486362,4879,0,18561,10294,,,669182,344845,,0,4704040,21173,288928,67839,,,,0,4704040,21173 +"2020-08-09","UT",336,,1,,2620,2620,224,16,669,78,527717,4090,,,648742,274,,44127,,376,0,,646,,606,48912,33914,,0,697654,6057,,1816,,1515,571520,4393,697654,6057 +"2020-08-09","VA",2326,2214,4,112,8369,8369,1200,37,,260,,0,,,,,146,100086,96167,897,0,7466,973,,,115992,,1240339,21174,1240339,21174,117315,1810,,,,0,,0 +"2020-08-09","VI",9,,0,,,,,0,,,10332,241,,,,,,547,,19,0,,,,,,404,,0,10879,260,,,,,10900,257,,0 +"2020-08-09","VT",58,58,0,,,,6,0,,,99083,753,,,,,,1458,1458,5,0,,,,,,1279,,0,131933,1469,,,,,100541,758,131933,1469 +"2020-08-09","WA",1688,1688,16,,5896,5896,531,6,,,,0,,,,,60,65229,64948,674,0,,,,,,,1202997,4990,1202997,4990,,,,,,0,,0 +"2020-08-09","WI",1005,998,2,7,5000,5000,352,20,938,98,993742,6797,,,,,,64835,60554,622,0,,,,,,50028,1401171,13943,1401171,13943,,,,,1054296,7418,,0 +"2020-08-09","WV",139,,8,,,,124,0,,50,,0,,,,,15,7694,7536,131,0,,,,,,5678,,0,317084,5066,14766,,,,,0,317084,5066 +"2020-08-09","WY",28,,0,,177,177,17,0,,,53625,0,,,87046,,,3050,2533,37,0,,,,,2752,2465,,0,89798,384,,,,,56115,0,89798,384 +"2020-08-08","AK",26,26,1,,172,172,37,5,,,,0,,,265804,,4,3621,,79,0,,,,,4195,1254,,0,273593,4742,,,,,,0,273593,4742 +"2020-08-08","AL",1735,1674,0,61,11537,11537,1454,0,1228,,651115,0,,,,661,,98387,94827,86,0,,,,,,37923,,0,745942,0,,,,,745942,0,,0 +"2020-08-08","AR",521,,0,,3223,3223,523,55,,,503484,0,,,,435,116,48039,48039,0,0,,1085,,,,40360,,0,551523,0,,7090,,,,0,551523,0 +"2020-08-08","AS",0,,0,,,,,0,,,1396,0,,,,,,0,0,0,0,,,,,,,,0,1396,0,,,,,,0,1396,0 +"2020-08-08","AZ",4137,3905,56,232,19244,19244,1659,3,,539,830414,10622,,,,,400,186107,184804,1054,0,,,,,,,,0,1443202,14424,,,237810,,1015218,11635,1443202,14424 +"2020-08-08","CA",10189,,178,,,,6956,0,,2038,,0,,,,,,545787,545787,7371,0,,,,,,,,0,8707527,110645,,,,,,0,8707527,110645 +"2020-08-08","CO",1857,1516,0,341,6602,6602,346,20,,,535556,6318,134180,,,,,50324,47083,431,0,9890,,,,,,791022,11352,791022,11352,144070,,,,582639,6745,,0 +"2020-08-08","CT",4441,3558,0,883,10920,10920,65,0,,,,0,,,885717,,,50320,48345,0,0,,,,,62067,8721,,0,949700,11524,,,,,,0,949700,11524 +"2020-08-08","DC",590,,1,,,,80,0,,17,,0,,,,,8,12653,,64,0,,,,,,10124,213334,4609,213334,4609,,,,,142528,2121,,0 +"2020-08-08","DE",590,520,2,70,,,36,0,,11,180392,1053,,,,,,15502,14502,57,0,,,,,19009,8416,274258,3937,274258,3937,,,,,195894,1110,,0 +"2020-08-08","FL",8238,8238,187,,30639,30639,6890,525,,,3419295,40431,381574,375046,4518861,,,518967,,8343,0,27323,,26788,,667997,,5047703,83387,5047703,83387,408950,,401862,,3952028,49018,5212309,77136 +"2020-08-08","GA",4186,,69,,20556,20556,2878,274,3739,,,0,,,,,,213427,213427,4423,0,16252,,,,196573,,,0,1815434,39861,239168,,,,,0,1815434,39861 +"2020-08-08","GU",5,,0,,,,3,0,,1,24117,166,,,,,,412,404,1,0,2,,,,,321,,0,24529,167,147,,,,,0,24354,0 +"2020-08-08","HI",31,31,2,,231,231,102,6,,24,136131,3761,,,,,19,3115,,201,0,,,,,3107,1467,171105,2975,171105,2975,,,,,139246,3962,174717,2018 +"2020-08-08","IA",925,,12,,,,229,0,,58,465264,4429,,38831,,,22,48283,48283,418,0,,,2829,,,36882,,0,513547,4847,,,41699,,516402,4978,,0 +"2020-08-08","ID",229,205,6,24,968,968,201,14,276,48,179049,3748,,,,,,23922,22408,523,0,,,,,,8738,,0,201457,4240,,,,,201457,4240,,0 +"2020-08-08","IL",7840,7631,18,209,,,1538,0,,338,,0,,,,,125,193998,192698,2190,0,,,,,,,,0,3032634,48016,,,,,,0,3032634,48016 +"2020-08-08","IN",3036,2834,13,202,9354,9354,960,0,1927,284,755179,10329,,,,,85,73287,,1033,0,,,,,78838,,,0,1123961,20914,,,,,828466,11362,1123961,20914 +"2020-08-08","KS",380,,0,,1875,1875,333,0,526,88,285874,0,,,,193,26,30638,,0,0,,,,,,,,0,316512,0,,,,,316512,0,,0 +"2020-08-08","KY",772,767,8,5,4002,4002,653,27,1258,149,,0,,,,,,34578,32330,782,0,,,,,,8674,,0,646187,6354,44296,459,,,,0,646187,6354 +"2020-08-08","LA",4207,4089,0,118,,,1406,0,,,1376256,0,,,,,207,128746,128746,0,0,,,,,,89083,,0,1505002,0,,,,,,0,1505002,0 +"2020-08-08","MA",8721,8500,12,221,12044,12044,386,22,,68,1182033,16269,,,,,30,120711,112173,420,0,,,,,149234,99021,,0,1755478,12031,,,101139,,1294206,16589,1755478,12031 +"2020-08-08","MD",3577,3440,12,137,13105,13105,515,58,,127,924942,11924,,93746,,,,94581,94581,775,0,,,8370,,110972,5899,,0,1392724,20807,,,102116,,1019523,12699,1392724,20807 +"2020-08-08","ME",125,124,1,1,393,393,9,0,,4,,0,8584,,,,0,4026,3609,12,0,435,,,,4488,3504,,0,183738,2573,9031,,,,,0,183738,2573 +"2020-08-08","MI",6520,6250,-4,270,,,694,0,,232,,0,,,1978930,,132,96191,86889,721,0,,,,,121918,63636,,0,2100848,38892,227521,,,,,0,2100848,38892 +"2020-08-08","MN",1689,1648,8,41,5506,5506,309,48,1603,154,861296,10210,,,,,,60101,60101,916,0,,,,,,52768,1138595,17296,1138595,17296,,,,,921397,11126,,0 +"2020-08-08","MO",1301,,0,,,,924,0,,,695361,0,,59384,928188,,108,57379,57379,0,0,,,2324,,66665,,,0,996617,0,,,61708,,752740,0,996617,0 +"2020-08-08","MP",2,,0,,4,4,,0,,,12253,-1,,,,,,48,48,1,0,,,,,,29,,0,12301,0,,,,,12301,0,14419,0 +"2020-08-08","MS",1874,1812,26,62,4606,4606,1151,29,,334,426944,5168,,,,,198,66646,65442,1210,0,,,,,,42391,,0,493590,6378,17226,,,,,0,492386,6315 +"2020-08-08","MT",75,,5,,268,268,81,4,,,,0,,,,,,4889,,132,0,,,,,,3255,,0,188846,1090,,,,,,0,188846,1090 +"2020-08-08","NC",2160,2160,26,,,,1129,0,,335,,0,,,,,,134766,134766,1954,0,,,,,,,,0,1730290,21840,,,,,,0,1730290,21840 +"2020-08-08","ND",116,,2,,414,414,49,6,,,159859,1485,7382,,,,,7491,7491,179,0,272,,,,,6268,342078,5577,342078,5577,7654,,,,164963,1890,352530,5873 +"2020-08-08","NE",345,,5,,1704,1704,156,16,,,269434,3353,,,347323,,,28104,,283,0,,,,,34472,20333,,0,382701,3756,,,,,297832,3634,382701,3756 +"2020-08-08","NH",419,,0,,700,700,24,1,209,,164433,2710,,,,,,6818,,76,0,,,,,,6049,,0,257597,3075,28372,,27857,,171251,2786,257597,3075 +"2020-08-08","NJ",15792,14016,9,1776,21949,21949,540,0,,94,2068363,-368,,,,,34,187006,184429,411,0,,,,,,,,0,2255369,43,,,,,,0,2252792,0 +"2020-08-08","NM",681,,6,,2838,2838,127,19,,,,0,,,,,,22115,,150,0,,,,,,9262,,0,620128,7274,,,,,,0,620128,7274 +"2020-08-08","NV",949,,29,,,,976,0,,278,457600,5135,,,,,173,55419,55419,886,0,,,,,,,695752,8131,695752,8131,,,,,513036,6299,691615,12133 +"2020-08-08","NY",25195,,5,,89995,89995,573,0,,133,,0,,,,,64,420345,,703,0,,,,,,,6443832,74857,6443832,74857,,,,,,0,,0 +"2020-08-08","OH",3668,3396,16,272,11516,11516,936,69,2654,363,,0,,,,,185,99969,94671,1294,0,,,,,109365,77429,,0,1709440,24312,,,,,,0,1709440,24312 +"2020-08-08","OK",603,,3,,3594,3594,594,39,,223,650485,6925,,,650485,,,43080,43080,825,0,2446,,,,49186,35745,,0,693565,7750,62502,,,,,0,700981,7672 +"2020-08-08","OR",348,,9,,1758,1758,204,15,,51,417057,5020,,,650249,,18,20636,,411,0,,,,,38231,4111,,0,688480,6489,,,,,436619,5420,688480,6489 +"2020-08-08","PA",7313,,16,,,,634,0,,,1214965,15345,,,,,106,118092,114755,813,0,,,,,,90930,1743955,23825,1743955,23825,,,,,1329720,16131,,0 +"2020-08-08","PR",274,158,9,116,,,399,0,,77,305972,0,,,303412,,54,8573,8573,343,0,12851,,,,7002,,,0,314545,343,,,,,,0,310546,0 +"2020-08-08","RI",1015,,1,,2294,2294,82,18,,9,200133,1898,,,371831,,2,19832,,94,0,,,,,28576,,398976,4227,398976,4227,,,,,219965,1992,400407,4609 +"2020-08-08","SC",2007,1931,45,76,6153,6153,1402,0,,357,678615,8873,51720,,651353,,234,99460,98743,1241,0,3993,,,,126005,37798,,0,778075,10114,55713,,,,,0,777358,10062 +"2020-08-08","SD",146,,2,,871,871,48,5,,,110510,1154,,,,,,9477,,106,0,,,,,15376,8307,,0,150575,2150,,,,,119987,1260,150575,2150 +"2020-08-08","TN",1215,1176,9,39,5262,5262,1393,72,,,,0,,,1541272,,,120585,118821,1803,0,,,,,142450,80340,,0,1683722,23385,,,,,,0,1683722,23385 +"2020-08-08","TX",8343,,247,,,,7872,0,,2730,,0,,,,,,481483,481483,6959,0,16924,10237,,,666361,338343,,0,4682867,37191,280434,67137,,,,0,4682867,37191 +"2020-08-08","UT",335,,0,,2604,2604,222,26,667,77,523627,4263,,,643020,272,,43751,,376,0,,632,,595,48577,33115,,0,691597,6477,,1776,,1484,567127,4666,691597,6477 +"2020-08-08","VA",2322,2211,5,111,8332,8332,1258,51,,271,,0,,,,,145,99189,95326,1307,0,7406,968,,,115088,,1219165,14161,1219165,14161,116649,1773,,,,0,,0 +"2020-08-08","VI",9,,0,,,,,0,,,10091,114,,,,,,528,,6,0,,,,,,404,,0,10619,120,,,,,10643,123,,0 +"2020-08-08","VT",58,58,0,,,,8,0,,,98330,790,,,,,,1453,1453,6,0,,,,,,1272,,0,130464,1202,,,,,99783,796,130464,1202 +"2020-08-08","WA",1672,1672,19,,5890,5890,551,16,,,,0,,,,,56,64555,64287,732,0,,,,,,,1198007,9342,1198007,9342,,,,,,0,,0 +"2020-08-08","WI",1003,996,6,7,4980,4980,338,50,937,104,986945,11997,,,,,,64213,59933,1185,0,,,,,,49283,1387228,17797,1387228,17797,,,,,1046878,13162,,0 +"2020-08-08","WV",131,,4,,,,121,0,,46,,0,,,,,15,7563,7406,130,0,,,,,,5609,,0,312018,4860,14705,,,,,0,312018,4860 +"2020-08-08","WY",28,,0,,177,177,17,1,,,53625,0,,,86671,,,3013,2498,13,0,,,,,2743,2462,,0,89414,455,,,,,56115,0,89414,455 +"2020-08-07","AK",25,25,0,,167,167,37,3,,,,0,,,261152,,3,3542,,55,0,,,,,4124,1238,,0,268851,7279,,,,,,0,268851,7279 +"2020-08-07","AL",1735,1674,21,61,11537,11537,1403,224,1219,,651115,7923,,,,658,,98301,94827,1709,0,,,,,,37923,,0,745942,9348,,,,,745942,9348,,0 +"2020-08-07","AR",521,,6,,3168,3168,514,50,,,503484,10676,,,,429,111,48039,48039,1011,0,,1085,,,,40360,,0,551523,12422,,7090,,,,0,551523,12422 +"2020-08-07","AS",0,,0,,,,,0,,,1396,0,,,,,,0,0,0,0,,,,,,,,0,1396,0,,,,,,0,1396,0 +"2020-08-07","AZ",4081,3860,79,221,19241,19241,1772,5173,,565,819792,7575,,,,,411,185053,183791,1406,0,,,,,,,,0,1428778,14691,,,236405,,1003583,8958,1428778,14691 +"2020-08-07","CA",10011,,142,,,,7277,0,,1978,,0,,,,,,538416,538416,8436,0,,,,,,,,0,8596882,96419,,,,,,0,8596882,96419 +"2020-08-07","CO",1857,1516,5,341,6582,6582,317,10,,,529238,7311,133273,,,,,49893,46656,457,0,9795,,,,,,779670,13197,779670,13197,143068,,,,575894,7767,,0 +"2020-08-07","CT",4441,3558,4,883,10920,10920,65,0,,,,0,,,874279,,,50320,48345,75,0,,,,,61982,8721,,0,938176,15156,,,,,,0,938176,15156 +"2020-08-07","DC",589,,2,,,,90,0,,18,,0,,,,,12,12589,,71,0,,,,,,10118,208725,2742,208725,2742,,,,,140407,1564,,0 +"2020-08-07","DE",588,518,1,70,,,37,0,,15,179339,2001,,,,,,15445,14447,80,0,,,,,18915,8392,270321,2800,270321,2800,,,,,194784,2081,,0 +"2020-08-07","FL",8051,8051,180,,30114,30114,7144,599,,,3378864,31890,339059,334221,4453694,,,510624,,7541,0,19175,,18780,,656841,,4964316,73757,4964316,73757,358283,,353026,,3903010,39734,5135173,61294 +"2020-08-07","GA",4117,,91,,20282,20282,2981,280,3700,,,0,,,,,,209004,209004,4109,0,15910,,,,192226,,,0,1775573,23598,236570,,,,,0,1775573,23598 +"2020-08-07","GU",5,,0,,,,3,0,,1,23951,471,,,,,,411,403,14,0,2,,,,,321,,0,24362,485,147,,,,,0,24354,485 +"2020-08-07","HI",29,29,2,,225,225,117,11,,21,132370,224,,,,,14,2914,,151,0,,,,,2893,1440,168130,3403,168130,3403,,,,,135284,375,172699,4277 +"2020-08-07","IA",913,,5,,,,223,0,,65,460835,5076,,38270,,,25,47865,47865,504,0,,,2821,,,36322,,0,508700,5580,,,41130,,511424,5652,,0 +"2020-08-07","ID",223,199,6,24,954,954,242,23,269,42,175301,3415,,,,,,23399,21916,692,0,,,,,,8486,,0,197217,4063,,,,,197217,4063,,0 +"2020-08-07","IL",7822,7613,31,209,,,1486,0,,333,,0,,,,,125,191808,190508,2103,0,,,,,,,,0,2984618,46869,,,,,,0,2984618,46869 +"2020-08-07","IN",3023,2821,10,202,9354,9354,990,87,1927,295,744850,11520,,,,,76,72254,,1239,0,,,,,77694,,,0,1103047,19868,,,,,817104,12759,1103047,19868 +"2020-08-07","KS",380,,12,,1875,1875,333,54,526,88,285874,6873,,,,193,26,30638,,921,0,,,,,,,,0,316512,7794,,,,,316512,7794,,0 +"2020-08-07","KY",764,760,4,4,3975,3975,717,51,1254,136,,0,,,,,,33796,31635,542,0,,,,,,8589,,0,639833,9497,44093,430,,,,0,639833,9497 +"2020-08-07","LA",4207,4089,61,118,,,1406,0,,,1376256,18530,,,,,207,128746,128746,1500,0,,,,,,89083,,0,1505002,20030,,,,,,0,1505002,20030 +"2020-08-07","MA",8709,8488,18,221,12022,12022,390,15,,69,1165764,14420,,,,,30,120291,111853,417,0,,,,,149046,99021,,0,1743447,21888,,,100383,,1277617,14740,1743447,21888 +"2020-08-07","MD",3565,3429,14,136,13047,13047,528,69,,135,913018,13882,,93746,,,,93806,93806,801,0,,,8370,,110068,5838,,0,1371917,28583,,,102116,,1006824,14683,1371917,28583 +"2020-08-07","ME",124,123,0,1,393,393,10,3,,5,,0,8571,,,,1,4014,3599,17,0,433,,,,4475,3479,,0,181165,2706,9016,,,,,0,181165,2706 +"2020-08-07","MI",6524,6247,18,277,,,694,0,,232,,0,,,1941125,,132,95470,86191,814,0,,,,,120831,60022,,0,2061956,30302,225674,,,,,0,2061956,30302 +"2020-08-07","MN",1681,1640,4,41,5458,5458,300,37,1592,155,851086,10246,,,,,,59185,59185,545,0,,,,,,51940,1121299,16205,1121299,16205,,,,,910271,10791,,0 +"2020-08-07","MO",1301,,21,,,,930,0,,,695361,9433,,59384,928188,,113,57379,57379,996,0,,,2324,,66665,,,0,996617,28486,,,61708,,752740,10429,996617,28486 +"2020-08-07","MP",2,,0,,4,4,,0,,,12254,0,,,,,,47,47,0,0,,,,,,29,,0,12301,0,,,,,12301,0,14419,0 +"2020-08-07","MS",1848,1793,23,55,4577,4577,1136,66,,335,421776,3635,,,,,191,65436,64295,1036,0,,,,,,42391,,0,487212,4671,17096,,,,,0,486071,4628 +"2020-08-07","MT",70,,5,,264,264,84,5,,,,0,,,,,,4757,,155,0,,,,,,3122,,0,187756,1941,,,,,,0,187756,1941 +"2020-08-07","NC",2134,2134,42,,,,1123,0,,339,,0,,,,,,132812,132812,1545,0,,,,,,,,0,1708450,23469,,,,,,0,1708450,23469 +"2020-08-07","ND",114,,1,,408,408,48,8,,,158374,1832,7337,,,,,7312,7312,149,0,272,,,,,6164,336501,5497,336501,5497,7609,,,,163073,2054,346657,5724 +"2020-08-07","NE",340,,5,,1688,1688,151,7,,,266081,3389,,,343825,,,27821,,332,0,,,,,34224,20176,,0,378945,5802,,,,,294198,3721,378945,5802 +"2020-08-07","NH",419,,1,,699,699,21,1,209,,161723,1035,,,,,,6742,,23,0,,,,,,5941,,0,254522,3013,28241,,27611,,168465,1058,254522,3013 +"2020-08-07","NJ",15783,14007,11,1776,21949,21949,551,384,,120,2068731,22187,,,,,73,186595,184061,403,0,,,,,,,,0,2255326,22590,,,,,,0,2252792,22547 +"2020-08-07","NM",675,,6,,2819,2819,132,16,,,,0,,,,,,21965,,192,0,,,,,,9166,,0,612854,8472,,,,,,0,612854,8472 +"2020-08-07","NV",920,,20,,,,1035,0,,289,452465,5827,,,,,178,54533,54533,976,0,,,,,,,687621,7453,687621,7453,,,,,506737,7131,679482,12492 +"2020-08-07","NY",25190,,5,,89995,89995,579,0,,139,,0,,,,,66,419642,,714,0,,,,,,,6368975,70170,6368975,70170,,,,,,0,,0 +"2020-08-07","OH",3652,3381,34,271,11447,11447,956,81,2641,334,,0,,,,,190,98675,93402,1204,0,,,,,108042,75975,,0,1685128,24376,,,,,,0,1685128,24376 +"2020-08-07","OK",600,,7,,3555,3555,561,58,,216,643560,10308,,,643560,,,42255,42255,854,0,2272,,,,48461,35001,,0,685815,11162,60293,,,,,0,693309,11461 +"2020-08-07","OR",339,,1,,1743,1743,230,17,,58,412037,5214,,,644351,,29,20225,,246,0,,,,,37640,4065,,0,681991,10036,,,,,431199,5440,681991,10036 +"2020-08-07","PA",7297,,15,,,,651,0,,,1199620,15890,,,,,99,117279,113969,758,0,,,,,,90304,1720130,24932,1720130,24932,,,,,1313589,16618,,0 +"2020-08-07","PR",265,149,7,116,,,440,0,,73,305972,0,,,303412,,58,8230,8230,406,0,12456,,,,7002,,,0,314202,406,,,,,,0,310546,0 +"2020-08-07","RI",1014,,0,,2276,2276,84,12,,10,198235,2123,,,367327,,4,19738,,127,0,,,,,28471,,394749,4780,394749,4780,,,,,217973,2250,395798,5320 +"2020-08-07","SC",1962,1883,19,79,6153,6153,1415,354,,358,669742,10394,51277,,642972,,231,98219,97554,1422,0,3905,,,,124324,37798,,0,767961,11816,55182,,,,,0,767296,11816 +"2020-08-07","SD",144,,3,,866,866,47,5,,,109356,1055,,,,,,9371,,98,0,,,,,15215,8244,,0,148425,1579,,,,,118727,1153,148425,1579 +"2020-08-07","TN",1206,1167,20,39,5190,5190,1406,81,,,,0,,,1520171,,,118782,117087,2432,0,,,,,140166,79357,,0,1660337,26695,,,,,,0,1660337,26695 +"2020-08-07","TX",8096,,293,,,,8065,0,,2742,,0,,,,,,474524,474524,7039,0,15364,10150,,,661709,331668,,0,4645676,38889,276849,65737,,,,0,4645676,38889 +"2020-08-07","UT",335,,5,,2578,2578,234,24,657,81,519364,4865,,,636994,269,,43375,,460,0,,618,,582,48126,32371,,0,685120,7637,,1723,,1438,562461,5275,685120,7637 +"2020-08-07","VA",2317,2208,18,109,8281,8281,1372,98,,284,,0,,,,,159,97882,94141,2015,0,7340,932,,,113903,,1205004,13700,1205004,13700,115847,1666,,,,0,,0 +"2020-08-07","VI",9,,0,,,,,0,,,9977,103,,,,,,522,,21,0,,,,,,398,,0,10499,124,,,,,10520,133,,0 +"2020-08-07","VT",58,58,0,,,,6,0,,,97540,871,,,,,,1447,1447,1,0,,,,,,1260,,0,129262,1388,,,,,98987,872,129262,1388 +"2020-08-07","WA",1653,1653,29,,5874,5874,505,34,,,,0,,,,,50,63823,63567,768,0,,,,,,,1188665,15015,1188665,15015,,,,,,0,,0 +"2020-08-07","WI",997,990,12,7,4930,4930,350,49,931,121,974948,13097,,,,,,63028,58768,1043,0,,,,,,48244,1369431,21150,1369431,21150,,,,,1033716,14086,,0 +"2020-08-07","WV",127,,3,,,,122,0,,46,,0,,,,,14,7433,7277,156,0,,,,,,5510,,0,307158,5231,14597,,,,,0,307158,5231 +"2020-08-07","WY",28,,1,,176,176,17,5,,,53625,475,,,86224,,,3000,2490,42,0,,,,,2735,2420,,0,88959,1264,,,,,56115,516,88959,1264 +"2020-08-06","AK",25,25,0,,164,164,42,3,,,,0,,,253987,,2,3487,,40,0,,,,,4024,1220,,0,261572,4293,,,,,,0,261572,4293 +"2020-08-06","AL",1714,1654,19,60,11313,11313,1613,213,1211,,643192,10386,,,,654,,96592,93402,1938,0,,,,,,37923,,0,736594,12012,,,,,736594,12012,,0 +"2020-08-06","AR",515,,7,,3118,3118,514,0,,,492808,4290,,,,424,111,47028,47028,735,0,,1085,,,,39555,,0,539101,5202,,7090,,,,0,539101,5202 +"2020-08-06","AS",0,,0,,,,,0,,,1396,0,,,,,,0,0,0,0,,,,,,,,0,1396,0,,,,,,0,1396,0 +"2020-08-06","AZ",4002,3786,70,216,14068,14068,1879,509,,593,812217,8878,,,,,427,183647,182408,1444,0,,,,,,,,0,1414087,16491,,,235088,,994625,10293,1414087,16491 +"2020-08-06","CA",9869,,166,,,,7485,0,,2026,,0,,,,,,529980,529980,5258,0,,,,,,,,0,8500463,91063,,,,,,0,8500463,91063 +"2020-08-06","CO",1852,1511,1,341,6572,6572,317,36,,,521927,5596,132390,,,,,49436,46200,448,0,9726,,,,,,766473,11829,766473,11829,142116,,,,568127,6041,,0 +"2020-08-06","CT",4437,3555,0,882,10920,10920,66,113,,,,0,,,859277,,,50245,48273,20,0,,,,,61840,8721,,0,923020,13381,,,,,,0,923020,13381 +"2020-08-06","DC",587,,0,,,,98,0,,23,,0,,,,,12,12518,,75,0,,,,,,10094,205983,3158,205983,3158,,,,,138843,1597,,0 +"2020-08-06","DE",587,517,0,70,,,45,0,,15,177338,1934,,,,,,15365,14368,69,0,,,,,18853,8365,267521,1502,267521,1502,,,,,192703,2003,,0 +"2020-08-06","FL",7871,7871,120,,29515,29515,7459,559,,,3346974,34829,339059,334221,4403366,,,503083,,7573,0,19175,,18780,,646583,,4890559,88745,4890559,88745,358283,,353026,,3863276,42593,5073879,69309 +"2020-08-06","GA",4026,,42,,20002,20002,3006,214,3647,,,0,,,,,,204895,204895,3182,0,15596,,,,188992,,,0,1751975,25274,234055,,,,,0,1751975,25274 +"2020-08-06","GU",5,,0,,,,3,0,,1,23480,434,,,,,,397,389,8,0,2,,,,,321,,0,23877,442,147,,,,,0,23869,442 +"2020-08-06","HI",27,27,0,,214,214,83,6,,15,132146,2211,,,,,13,2763,,172,0,,,,,2717,1402,164727,3327,164727,3327,,,,,134909,2383,168422,3246 +"2020-08-06","IA",908,,9,,,,237,0,,68,455759,5990,,37716,,,32,47361,47361,702,0,,,2808,,,35548,,0,503120,6692,,,40563,,505772,6823,,0 +"2020-08-06","ID",217,194,7,23,931,931,242,25,262,42,171886,2233,,,,,,22707,21268,473,0,,,,,,8207,,0,193154,2634,,,,,193154,2634,,0 +"2020-08-06","IL",7791,7594,21,197,,,1517,0,,346,,0,,,,,132,189705,188424,1953,0,,,,,,,,0,2937749,41686,,,,,,0,2937749,41686 +"2020-08-06","IN",3013,2811,6,202,9267,9267,1009,119,1923,301,733330,11080,,,,,82,71015,,1040,0,,,,,76537,,,0,1083179,19347,,,,,804345,12120,1083179,19347 +"2020-08-06","KS",368,,0,,1821,1821,358,0,516,78,279001,0,,,,190,25,29717,,0,0,,,,,,,,0,308718,0,,,,,308718,0,,0 +"2020-08-06","KY",760,756,8,4,3924,3924,701,21,1248,140,,0,,,,,,33254,31146,513,0,,,,,,8523,,0,630336,11543,44033,387,,,,0,630336,11543 +"2020-08-06","LA",4146,4028,50,118,,,1457,0,,,1357726,13802,,,,,215,127246,127246,1303,0,,,,,,89083,,0,1484972,15105,,,,,,0,1484972,15105 +"2020-08-06","MA",8691,8470,32,221,12007,12007,403,14,,73,1151344,11393,,,,,32,119874,111533,231,0,,,,,148701,99021,,0,1721559,23143,,,99768,,1262877,11555,1721559,23143 +"2020-08-06","MD",3551,3415,15,136,12978,12978,535,56,,139,899136,9167,,93746,,,,93005,93005,579,0,,,8370,,109142,5790,,0,1343334,16699,,,102116,,992141,9746,1343334,16699 +"2020-08-06","ME",124,123,0,1,390,390,11,0,,3,,0,8540,,,,1,3997,3582,5,0,430,,,,4461,3475,,0,178459,2564,8982,,,,,0,178459,2564 +"2020-08-06","MI",6506,6247,28,259,,,694,0,,232,,0,,,1911922,,132,94656,85429,763,0,,,,,119732,60022,,0,2031654,26160,223982,,,,,0,2031654,26160 +"2020-08-06","MN",1677,1636,7,41,5421,5421,319,48,1583,153,840840,10996,,,,,,58640,58640,861,0,,,,,,51604,1105094,14791,1105094,14791,,,,,899480,11857,,0 +"2020-08-06","MO",1280,,8,,,,966,0,,,685928,10675,,58960,901518,,110,56383,56383,1062,0,,,2293,,64892,,,0,968131,10268,,,61253,,742311,11737,968131,10268 +"2020-08-06","MP",2,,0,,4,4,,0,,,12254,-1,,,,,,47,47,1,0,,,,,,29,,0,12301,0,,,,,12301,0,14419,0 +"2020-08-06","MS",1825,1772,21,53,4511,4511,1184,39,,337,418141,3763,,,,,193,64400,63302,956,0,,,,,,42391,,0,482541,4719,17031,,,,,0,481443,4681 +"2020-08-06","MT",65,,0,,259,259,87,11,,,,0,,,,,,4602,,173,0,,,,,,2964,,0,185815,2691,,,,,,0,185815,2691 +"2020-08-06","NC",2092,2092,42,,,,1147,0,,333,,0,,,,,,131267,131267,1979,0,,,,,,,,0,1684981,19558,,,,,,0,1684981,19558 +"2020-08-06","ND",113,,1,,400,400,46,6,,,156542,1585,7290,,,,,7163,7163,122,0,271,,,,,5949,331004,5178,331004,5178,7561,,,,161019,1454,340933,5342 +"2020-08-06","NE",335,,3,,1681,1681,148,37,,,262692,2765,,,338496,,,27489,,311,0,,,,,33756,19885,,0,373143,5392,,,,,290477,3083,373143,5392 +"2020-08-06","NH",418,,0,,698,698,20,0,209,,160688,1405,,,,,,6719,,26,0,,,,,,5923,,0,251509,2503,28108,,27506,,167407,1431,251509,2503 +"2020-08-06","NJ",15772,13996,7,1776,21565,21565,754,0,,129,2046544,42853,,,,,54,186192,183701,419,0,,,,,,,,0,2232736,43272,,,,,,0,2230245,43227 +"2020-08-06","NM",669,,2,,2803,2803,138,22,,,,0,,,,,,21773,,207,0,,,,,,8950,,0,604382,6974,,,,,,0,604382,6974 +"2020-08-06","NV",900,,10,,,,1117,0,,307,446638,8349,,,,,208,53557,53557,729,0,,,,,,,680168,8646,680168,8646,,,,,499606,10359,666990,16369 +"2020-08-06","NY",25185,,6,,89995,89995,570,0,,132,,0,,,,,69,418928,,703,0,,,,,,,6298805,72370,6298805,72370,,,,,,0,,0 +"2020-08-06","OH",3618,3348,22,270,11366,11366,979,135,2627,342,,0,,,,,182,97471,92273,1166,0,,,,,106823,74612,,0,1660752,23520,,,,,,0,1660752,23520 +"2020-08-06","OK",593,,10,,3497,3497,643,52,,216,633252,9086,,,633252,,,41401,41401,837,0,2272,,,,47329,34320,,0,674653,9923,60293,,,,,0,681848,10136 +"2020-08-06","OR",338,,5,,1726,1726,228,38,,60,406823,6608,,,636968,,25,19979,,280,0,,,,,34987,4037,,0,671955,8860,,,,,425759,6890,671955,8860 +"2020-08-06","PA",7282,,38,,,,663,0,,,1183730,14719,,,,,98,116521,113241,807,0,,,,,,88555,1695198,22173,1695198,22173,,,,,1296971,15498,,0 +"2020-08-06","PR",258,144,12,114,,,456,0,,76,305972,0,,,303412,,53,7824,7824,140,0,12110,,,,7002,,,0,313796,140,,,,,,0,310546,0 +"2020-08-06","RI",1014,,2,,2264,2264,83,16,,11,196112,2058,,,362179,,4,19611,,130,0,,,,,28299,,389969,5482,389969,5482,,,,,215723,2188,390478,5576 +"2020-08-06","SC",1943,1863,49,80,5799,5799,1492,0,,356,659348,6198,50726,,633202,,276,96797,96132,1325,0,3761,,,,122278,32859,,0,756145,7523,54487,,,,,0,755480,7493 +"2020-08-06","SD",141,,4,,861,861,44,5,,,108301,1095,,,,,,9273,,105,0,,,,,15104,8145,,0,146846,1757,,,,,117574,1200,146846,1757 +"2020-08-06","TN",1186,1147,42,39,5109,5109,1497,108,,,,0,,,1496365,,,116350,114801,2252,0,,,,,137277,77558,,0,1633642,23038,,,,,,0,1633642,23038 +"2020-08-06","TX",7803,,306,,,,8302,0,,2917,,0,,,,,,467485,467485,7598,0,15364,10048,,,656891,323804,,0,4606787,41217,276849,64236,,,,0,4606787,41217 +"2020-08-06","UT",330,,3,,2554,2554,220,35,657,80,514499,4368,,,629830,266,,42915,,587,0,,600,,564,47653,31619,,0,677483,7130,,1671,,1393,557186,4817,677483,7130 +"2020-08-06","VA",2299,2191,25,108,8183,8183,1349,57,,284,,0,,,,,157,95867,92244,818,0,7260,903,,,112844,,1191304,15124,1191304,15124,115091,1558,,,,0,,0 +"2020-08-06","VI",9,,1,,,,,0,,,9874,252,,,,,,501,,20,0,,,,,,384,,0,10375,272,,,,,10387,258,,0 +"2020-08-06","VT",58,58,1,,,,6,0,,,96669,988,,,,,,1446,1446,10,0,,,,,,1258,,0,127874,1596,,,,,98115,998,127874,1596 +"2020-08-06","WA",1624,1624,5,,5840,5840,518,61,,,,0,,,,,58,63055,62811,872,0,,,,,,,1173650,14589,1173650,14589,,,,,,-1009486,,0 +"2020-08-06","WI",985,978,8,7,4881,4881,330,55,927,121,961851,16867,,,,,,61985,57779,875,0,,,,,,47221,1348281,21856,1348281,21856,,,,,1019630,17706,,0 +"2020-08-06","WV",124,,0,,,,123,0,,47,,0,,,,,11,7277,7123,118,0,,,,,,5330,,0,301927,4645,14524,,,,,0,301927,4645 +"2020-08-06","WY",27,,0,,171,171,16,2,,,53150,359,,,84993,,,2958,2449,35,0,,,,,2702,2366,,0,87695,1188,,,,,55599,384,87695,1188 +"2020-08-05","AK",25,25,0,,161,161,38,3,,,,0,,,,,2,3447,,55,0,,,,,,1017,,0,257279,4630,,,,,,0,257279,4630 +"2020-08-05","AL",1695,1639,29,56,11100,11100,1572,0,1200,,632806,4207,,,,645,,94654,91776,952,0,,,,,,37923,,0,724582,5093,,,,,724582,5093,,0 +"2020-08-05","AR",508,,18,,3118,3118,516,64,,,488518,0,,,,424,106,46293,46293,912,0,,1085,,,,38848,,0,533899,0,,7090,,,,0,533899,0 +"2020-08-05","AS",0,,0,,,,,0,,,1396,129,,,,,,0,0,0,0,,,,,,,,0,1396,129,,,,,,0,1396,129 +"2020-08-05","AZ",3932,3717,87,215,13559,13559,1945,265,,618,803339,12600,,,,,455,182203,180993,1698,0,,,,,,,,0,1397596,15857,,,233685,,984332,13088,1397596,15857 +"2020-08-05","CA",9703,,202,,,,7552,0,,2005,,0,,,,,,524722,524722,5295,0,,,,,,,,0,8409400,103687,,,,,,0,8409400,103687 +"2020-08-05","CO",1851,1510,2,341,6536,6536,320,20,,,516331,9303,131650,,,,,48988,45755,594,0,9661,,,,,,754644,27618,754644,27618,141311,,,,562086,9881,,0 +"2020-08-05","CT",4437,3555,0,882,10807,10807,59,0,,,,0,,,846030,,,50225,48258,115,0,,,,,61711,8613,,0,909639,12473,,,,,,0,909639,12473 +"2020-08-05","DC",587,,0,,,,97,0,,21,,0,,,,,13,12443,,45,0,,,,,,10015,202825,2698,202825,2698,,,,,137246,1505,,0 +"2020-08-05","DE",587,517,0,70,,,47,0,,4,175404,1233,,,,,,15296,14299,159,0,,,,,18796,8339,266019,3448,266019,3448,,,,,190700,1392,,0 +"2020-08-05","FL",7751,7751,225,,28956,28956,7615,623,,,3312145,25017,339059,334221,4344367,,,495510,,5424,0,19175,,18780,,637404,,4801814,48947,4801814,48947,358283,,353026,,3820683,30481,5004570,46760 +"2020-08-05","GA",3984,,63,,19788,19788,3077,362,3616,,,0,,,,,,201713,201713,3765,0,15410,,,,186174,,,0,1726701,30856,231824,,,,,0,1726701,30856 +"2020-08-05","GU",5,,0,,,,3,0,,,23046,498,,,,,,389,381,14,0,2,,,,,319,,0,23435,512,146,,,,,0,23427,513 +"2020-08-05","HI",27,27,1,,208,208,83,7,,15,129935,1671,,,,,13,2591,,143,0,,,,,2561,1354,161400,2307,161400,2307,,,,,132526,1814,165176,2391 +"2020-08-05","IA",899,,11,,,,248,0,,77,449769,5440,,36911,,,34,46659,46659,617,0,,,2796,,,34733,,0,496428,6057,,,39746,,498949,6432,,0 +"2020-08-05","ID",210,187,10,23,906,906,195,20,260,39,169653,3550,,,,,,22234,20867,559,0,,,,,,7875,,0,190520,4045,,,,,190520,4045,,0 +"2020-08-05","IL",7770,7573,28,197,,,1552,0,,368,,0,,,,,129,187752,186471,1759,0,,,,,,,,0,2896063,46668,,,,,,0,2896063,46668 +"2020-08-05","IN",3007,2805,11,202,9148,9148,923,0,1894,308,722250,6487,,,,,93,69975,,720,0,,,,,75398,,,0,1063832,19817,,,,,792225,7207,1063832,19817 +"2020-08-05","KS",368,,3,,1821,1821,358,39,516,78,279001,6038,,,,190,25,29717,,841,0,,,,,,,,0,308718,6879,,,,,308718,6879,,0 +"2020-08-05","KY",752,748,1,4,3903,3903,620,52,1239,131,,0,,,,,,32741,30712,544,0,,,,,,8467,,0,618793,12897,43944,363,,,,0,618793,12897 +"2020-08-05","LA",4096,3978,45,118,,,1471,0,,,1343924,18528,,,,,223,125943,125943,1482,0,,,,,,89083,,0,1469867,20010,,,,,,0,1469867,20010 +"2020-08-05","MA",8659,8438,2,221,11993,11993,396,20,,57,1139951,16878,,,,,21,119643,111371,440,0,,,,,148290,99021,,0,1698416,25338,,,99170,,1251322,17216,1698416,25338 +"2020-08-05","MD",3536,3402,6,134,12922,12922,555,34,,134,889969,9477,,93746,,,,92426,92426,572,0,,,8370,,108502,5749,,0,1326635,21762,,,102116,,982395,10049,1326635,21762 +"2020-08-05","ME",124,123,1,1,390,390,10,2,,4,,0,8514,,,,1,3992,3568,17,0,426,,,,4441,3456,,0,175895,2424,8952,,,,,0,175895,2424 +"2020-08-05","MI",6478,6221,7,257,,,694,0,,232,,0,,,1886579,,132,93893,84707,718,0,,,,,118915,60022,,0,2005494,26237,222019,,,,,0,2005494,26237 +"2020-08-05","MN",1670,1629,10,41,5373,5373,305,27,1575,152,829844,8895,,,,,,57779,57779,617,0,,,,,,51223,1090303,11608,1090303,11608,,,,,887623,9512,,0 +"2020-08-05","MO",1272,,6,,,,882,0,,,675253,7810,,58514,892311,,101,55321,55321,1241,0,,,2265,,63881,,,0,957863,10940,,,60779,,730574,9051,957863,10940 +"2020-08-05","MP",2,,0,,4,4,,0,,,12255,0,,,,,,46,46,0,0,,,,,,29,,0,12301,0,,,,,12301,0,14419,0 +"2020-08-05","MS",1804,1754,51,50,4472,4472,1179,48,,329,414378,12786,,,,,192,63444,62384,1245,0,,,,,,42391,,0,477822,14031,17016,,,,,0,476762,16168 +"2020-08-05","MT",65,,1,,248,248,79,10,,,,0,,,,,,4429,,115,0,,,,,,2820,,0,183124,1888,,,,,,0,183124,1888 +"2020-08-05","NC",2050,2050,40,,,,1167,0,,346,,0,,,,,,129288,129288,1127,0,,,,,,,,0,1665423,11613,,,,,,0,1665423,11613 +"2020-08-05","ND",112,,1,,394,394,42,5,,,154957,1420,7226,,,,,7041,7041,122,0,268,,,,,5837,325826,5431,325826,5431,7494,,,,159565,1557,335591,5723 +"2020-08-05","NE",332,,0,,1644,1644,151,0,,,259927,3024,,,333519,,,27178,,222,0,,,,,33354,19764,,0,367751,3159,,,,,287394,3249,367751,3159 +"2020-08-05","NH",418,,1,,698,698,23,1,209,,159283,1107,,,,,,6693,,33,0,,,,,,5915,,0,249006,2415,27977,,27364,,165976,1140,249006,2415 +"2020-08-05","NJ",15765,13989,7,1776,21565,21565,784,0,,117,2003691,21725,,,,,47,185773,183327,392,0,,,,,,,,0,2189464,22117,,,,,,0,2187018,22438 +"2020-08-05","NM",667,,9,,2781,2781,138,28,,,,0,,,,,,21566,,226,0,,,,,,8828,,0,597408,6583,,,,,,0,597408,6583 +"2020-08-05","NV",890,,28,,,,1148,0,,320,438289,1381,,,,,214,52828,52828,649,0,,,,,,,671522,8525,671522,8525,,,,,489247,1645,650621,2944 +"2020-08-05","NY",25179,,4,,89995,89995,564,0,,134,,0,,,,,69,418225,,636,0,,,,,,,6226435,72668,6226435,72668,,,,,,0,,0 +"2020-08-05","OH",3596,3326,26,270,11231,11231,1004,112,2609,340,,0,,,,,189,96305,91171,1199,0,,,,,105460,72950,,0,1637232,19256,,,,,,0,1637232,19256 +"2020-08-05","OK",583,,17,,3445,3445,645,70,,207,624166,6353,,,624166,,,40564,40564,1101,0,2272,,,,46281,33383,,0,664730,7454,60293,,,,,0,671712,7133 +"2020-08-05","OR",333,,5,,1688,1688,219,33,,62,400215,2450,,,628954,,27,19699,,333,0,,,,,34141,3960,,0,663095,6049,,,,,418869,2749,663095,6049 +"2020-08-05","PA",7244,,12,,,,639,0,,,1169011,12491,,,,,102,115714,112462,705,0,,,,,,87942,1673025,19930,1673025,19930,,,,,1281473,13173,,0 +"2020-08-05","PR",246,133,9,113,,,507,0,,73,305972,0,,,303412,,54,7684,7684,271,0,11967,,,,7002,,,0,313656,271,,,,,,0,310546,0 +"2020-08-05","RI",1012,,1,,2248,2248,79,6,,14,194054,1491,,,356757,,5,19481,,91,0,,,,,28145,,384487,3514,384487,3514,,,,,213535,1582,384902,3424 +"2020-08-05","SC",1894,1819,47,75,5799,5799,1469,0,,363,653150,6883,50496,,627272,,270,95472,94837,1282,0,3736,,,,120715,32859,,0,748622,8165,54232,,,,,0,747987,8116 +"2020-08-05","SD",137,,1,,856,856,43,10,,,107206,904,,,,,,9168,,89,0,,,,,15017,8080,,0,145089,1518,,,,,116374,993,145089,1518 +"2020-08-05","TN",1144,1104,27,40,5001,5001,1448,101,,,,0,,,1475866,,,114098,112657,1657,0,,,,,134738,75550,,0,1610604,19294,,,,,,0,1610604,19294 +"2020-08-05","TX",7497,,236,,,,8455,0,,2917,,0,,,,,,459887,459887,8706,0,14535,9955,,,651967,315652,,0,4565570,50225,268978,62531,,,,0,4565570,50225 +"2020-08-05","UT",327,,6,,2519,2519,220,37,650,81,510131,4472,,,623208,265,,42328,,421,0,,587,,552,47145,30911,,0,670353,6727,,1617,,1351,552369,4935,670353,6727 +"2020-08-05","VA",2274,2164,30,110,8126,8126,1304,41,,283,,0,,,,,144,95049,91473,798,0,7135,865,,,111669,,1176180,11665,1176180,11665,113935,1433,,,,0,,0 +"2020-08-05","VI",8,,0,,,,,0,,,9622,310,,,,,,481,,18,0,,,,,,374,,0,10103,328,,,,,10129,328,,0 +"2020-08-05","VT",57,57,0,,,,9,0,,,95681,583,,,,,,1436,1436,5,0,,,,,,1254,,0,126278,1473,,,,,97117,588,126278,1473 +"2020-08-05","WA",1619,1619,19,,5779,5779,525,35,,,,0,,,,,47,62183,61960,871,0,,,,,,,1159061,15068,1159061,15068,,,,,1009486,664,,0 +"2020-08-05","WI",977,970,9,7,4826,4826,330,43,919,112,944984,16139,,,,,,61110,56940,939,0,,,,,,46323,1326425,19353,1326425,19353,,,,,1001924,17023,,0 +"2020-08-05","WV",124,,0,,,,115,0,,47,,0,,,,,13,7159,7008,108,0,,,,,,5218,,0,297282,4051,14441,,,,,0,297282,4051 +"2020-08-05","WY",27,,0,,169,169,16,0,,,52791,432,,,83847,,,2923,2424,39,0,,,,,2660,2323,,0,86507,1156,,,,,55215,464,86507,1156 +"2020-08-04","AK",25,25,0,,158,158,33,2,,,,0,,,,,2,3392,,61,0,,,,,,987,,0,252649,6842,,,,,,0,252649,6842 +"2020-08-04","AL",1666,1611,33,55,11100,11100,1572,235,1173,,628599,7209,,,,634,,93702,90890,1041,0,,,,,,35401,,0,719489,8172,,,,,719489,8172,,0 +"2020-08-04","AR",490,,15,,3054,3054,526,88,,,488518,5715,,,,414,101,45381,45381,784,0,,1085,,,,38000,,0,533899,6499,,7090,,,,0,533899,6499 +"2020-08-04","AS",0,,0,,,,,0,,,1267,0,,,,,,0,0,0,0,,,,,,,,0,1267,0,,,,,,0,1267,0 +"2020-08-04","AZ",3845,2431,66,152,13294,13294,2024,1894,,638,790739,5818,,,,,474,180505,137710,1008,0,,,,,,,,0,1381739,17483,,,232219,,971244,6826,1381739,17483 +"2020-08-04","CA",9501,,113,,,,7630,0,,2082,,0,,,,,,519427,519427,4526,0,,,,,,,,0,8305713,121017,,,,,,0,8305713,121017 +"2020-08-04","CO",1849,1508,5,341,6516,6516,335,29,,,507028,2993,130690,,,,,48394,45177,426,0,9584,,,,,,727026,5105,727026,5105,140274,,,,552205,3397,,0 +"2020-08-04","CT",4437,3555,0,882,10807,10807,60,0,,,,0,,,833688,,,50110,48142,48,0,,,,,61586,8613,,0,897166,12903,,,,,,0,897166,12903 +"2020-08-04","DC",587,,1,,,,100,0,,17,,0,,,,,10,12398,,85,0,,,,,,9959,200127,1312,200127,1312,,,,,135741,948,,0 +"2020-08-04","DE",587,517,2,70,,,42,0,,11,174171,1567,,,,,,15137,14140,82,0,,,,,18690,8303,262571,2615,262571,2615,,,,,189308,1649,,0 +"2020-08-04","FL",7526,7526,247,,28333,28333,7857,589,,,3287128,26214,339059,334221,4305309,,,490086,,5357,0,19175,,18780,,630093,,4752867,48391,4752867,48391,358283,,353026,,3790202,31706,4957810,49344 +"2020-08-04","GA",3921,,79,,19426,19426,3094,302,3556,,,0,,,,,,197948,197948,2513,0,15079,,,,182799,,,0,1695845,19161,229556,,,,,0,1695845,19161 +"2020-08-04","GU",5,,0,,,,3,0,,,22548,343,,,,,,375,367,7,0,2,,,,,318,,0,22923,350,146,,,,,0,22914,351 +"2020-08-04","HI",26,26,0,,201,201,138,2,,15,128264,3227,,,,,10,2448,,206,0,,,,,2407,1315,159093,1789,159093,1789,,,,,130712,3433,162785,4597 +"2020-08-04","IA",888,,6,,,,243,0,,75,444329,3695,,36781,,,32,46042,46042,201,0,,,2776,,,34023,,0,490371,3896,,,39596,,492517,4037,,0 +"2020-08-04","ID",200,177,3,23,886,886,106,12,256,22,166103,2110,,,,,,21675,20372,331,0,,,,,,7617,,0,186475,2415,,,,,186475,2415,,0 +"2020-08-04","IL",7742,7545,19,197,,,1496,0,,365,,0,,,,,125,185993,184712,1471,0,,,,,,,,0,2849395,42598,,,,,,0,2849395,42598 +"2020-08-04","IN",2996,2794,16,202,9148,9148,980,144,1894,375,715763,8714,,,,,83,69255,,822,0,,,,,74168,,,0,1044015,19783,,,,,785018,9536,1044015,19783 +"2020-08-04","KS",365,,0,,1782,1782,232,0,505,62,272963,0,,,,184,16,28876,,0,0,,,,,,,,0,301839,0,,,,,301839,0,,0 +"2020-08-04","KY",751,747,7,4,3851,3851,638,36,1232,135,,0,,,,,,32197,30238,689,0,,,,,,8406,,0,605896,7488,43924,273,,,,0,605896,7488 +"2020-08-04","LA",4051,3937,27,114,,,1487,0,,,1325396,52332,,,,,240,124461,124461,3615,0,,,,,,74246,,0,1449857,55947,,,,,,0,1449857,55947 +"2020-08-04","MA",8657,8436,9,221,11973,11973,354,31,,56,1123073,14878,,,,,29,119203,111033,546,0,,,,,147889,97595,,0,1673078,24389,,,98298,,1234106,15316,1673078,24389 +"2020-08-04","MD",3530,3396,7,134,12888,12888,547,56,,137,880492,10999,,88627,,,,91854,91854,710,0,,,7891,,107832,5740,,0,1304873,16377,,,96518,,972346,11709,1304873,16377 +"2020-08-04","ME",123,122,-1,1,388,388,12,-1,,1,,0,8494,,,,1,3975,3548,5,0,424,,,,4417,3424,,0,173471,1577,8930,,,,,0,173471,1577 +"2020-08-04","MI",6471,6219,8,252,,,694,0,,232,,0,,,1861240,,132,93175,84050,801,0,,,,,118017,60022,,0,1979257,27702,220799,,,,,0,1979257,27702 +"2020-08-04","MN",1660,1620,4,40,5346,5346,328,48,1563,159,820949,5505,,,,,,57162,57162,602,0,,,,,,50426,1078695,7770,1078695,7770,,,,,878111,6107,,0 +"2020-08-04","MO",1266,,11,,,,891,0,,,667443,7382,,58264,882902,,99,54080,54080,1193,0,,,2246,,62399,,,0,946923,10910,,,60510,,721523,8575,946923,10910 +"2020-08-04","MP",2,,0,,4,4,,0,,,12255,0,,,,,,46,46,0,0,,,,,,29,,0,12301,0,,,,,12301,0,14419,0 +"2020-08-04","MS",1753,1705,42,48,4424,4424,1164,44,,314,401592,0,,,,,173,62199,61186,1074,0,,,,,,42391,,0,463791,1074,16566,,,,,0,460594,0 +"2020-08-04","MT",64,,0,,238,238,70,2,,,,0,,,,,,4314,,81,0,,,,,,2766,,0,181236,1728,,,,,,0,181236,1728 +"2020-08-04","NC",2010,2010,28,,,,1166,0,,339,,0,,,,,,128161,128161,1629,0,,,,,,,,0,1653810,19740,,,,,,0,1653810,19740 +"2020-08-04","ND",111,,2,,389,389,51,10,,,153537,1571,7191,,,,,6919,6919,149,0,266,,,,,5715,320395,4685,320395,4685,7457,,,,158008,1778,329868,4904 +"2020-08-04","NE",332,,0,,1644,1644,152,14,,,256903,2499,,,330640,,,26956,,254,0,,,,,33090,19677,,0,364592,3124,,,,,284145,2758,364592,3124 +"2020-08-04","NH",417,,0,,697,697,23,1,209,,158176,2188,,,,,,6660,,26,0,,,,,,5848,,0,246591,2806,27830,,27314,,164836,2214,246591,2806 +"2020-08-04","NJ",15758,13982,11,1776,21565,21565,470,0,,126,1981966,0,,,,,53,185381,182970,404,0,,,,,,,,0,2167347,404,,,,,,0,2164580,0 +"2020-08-04","NM",658,,3,,2753,2753,133,23,,,,0,,,,,,21340,,210,0,,,,,,8685,,0,590825,13015,,,,,,0,590825,13015 +"2020-08-04","NV",862,,15,,,,1146,0,,310,436908,3241,,,,,202,52179,52179,980,0,,,,,,,662997,8103,662997,8103,,,,,487602,4082,647677,6012 +"2020-08-04","NY",25175,,3,,89995,89995,568,0,,139,,0,,,,,69,417589,,746,0,,,,,,,6153767,70993,6153767,70993,,,,,,0,,0 +"2020-08-04","OH",3570,3301,31,269,11119,11119,1038,127,2593,340,,0,,,,,197,95106,90041,1143,0,,,,,104537,71338,,0,1617976,16894,,,,,,0,1617976,16894 +"2020-08-04","OK",566,,15,,3375,3375,504,100,,232,617813,18352,,,617813,,,39463,39463,861,0,2272,,,,45521,32319,,0,657276,19213,60293,,,,,0,664579,20537 +"2020-08-04","OR",328,,2,,1655,1655,215,48,,62,397765,3205,,,623240,,27,19366,,269,0,,,,,33806,3960,,0,657046,5811,,,,,416120,12879,657046,5811 +"2020-08-04","PA",7232,,23,,,,656,0,,,1156520,14106,,,,,100,115009,111780,854,0,,,,,,86256,1653095,24046,1653095,24046,,,,,1268300,14916,,0 +"2020-08-04","PR",237,127,7,110,,,509,0,,75,305972,0,,,303412,,56,7413,7413,300,0,11911,,,,7002,,,0,313385,300,,,,,,0,310546,0 +"2020-08-04","RI",1011,,1,,2242,2242,80,11,,14,192563,1743,,,353449,,6,19390,,144,0,,,,,28029,,380973,4964,380973,4964,,,,,211953,1887,381478,4807 +"2020-08-04","SC",1847,1774,54,73,5799,5799,1458,272,,355,646267,7543,50378,,620882,,254,94190,93604,1239,0,3683,,,,118989,32859,,0,740457,8782,54061,,,,,0,739871,8196 +"2020-08-04","SD",136,,1,,846,846,42,8,,,106302,674,,,,,,9079,,59,0,,,,,14922,8008,,0,143571,826,,,,,115381,733,143571,826 +"2020-08-04","TN",1117,1079,25,38,4900,4900,1433,92,,,,0,,,1458607,,,112441,111101,1805,0,,,,,132703,73259,,0,1591310,18088,,,,,,0,1591310,18088 +"2020-08-04","TX",7261,,245,,,,8674,0,,3006,,0,,,,,,451181,451181,9167,0,13478,9824,,,645987,306262,,0,4515345,53999,258494,60672,,,,0,4515345,53999 +"2020-08-04","UT",321,,7,,2482,2482,220,32,640,81,505659,4119,,,617001,261,,41907,,378,0,,568,,533,46625,30449,,0,663626,6077,,1576,,1315,547434,4526,663626,6077 +"2020-08-04","VA",2244,2134,26,110,8085,8085,1255,67,,282,,0,,,,,144,94251,90728,1145,0,7106,818,,,110906,,1164515,12911,1164515,12911,113579,1320,,,,0,,0 +"2020-08-04","VI",8,,0,,,,,0,,,9312,315,,,,,,463,,24,0,,,,,,364,,0,9775,339,,,,,9801,358,,0 +"2020-08-04","VT",57,57,0,,,,14,0,,,95098,1425,,,,,,1431,1431,5,0,,,,,,1249,,0,124805,2213,,,,,96529,1430,124805,2213 +"2020-08-04","WA",1600,1600,4,,5744,5744,518,52,,,,0,,,,,52,61312,61107,238,0,,,,,,,1143993,16374,1143993,16374,,,,,1008822,542,,0 +"2020-08-04","WI",968,961,12,7,4783,4783,327,51,916,110,928845,17410,,,,,,60171,56056,770,0,,,,,,45368,1307072,13059,1307072,13059,,,,,984901,18138,,0 +"2020-08-04","WV",124,,7,,,,111,0,,40,,0,,,,,14,7051,6902,78,0,,,,,,5063,,0,293231,3230,14418,,,,,0,293231,3230 +"2020-08-04","WY",27,,0,,169,169,17,2,,,52359,327,,,82731,,,2884,2392,36,0,,,,,2620,2284,,0,85351,1404,,,,,54751,355,85351,1404 +"2020-08-03","AK",25,25,1,,156,156,38,2,,,,0,,,,,4,3331,,58,0,,,,,,946,,0,245807,2717,,,,,,0,245807,2717 +"2020-08-03","AL",1633,1580,6,53,10865,10865,1540,344,1153,,621390,6764,,,,619,,92661,89927,1217,0,,,,,,35401,,0,711317,7880,,,,,711317,7880,,0 +"2020-08-03","AR",475,,17,,2966,2966,513,72,,,482803,11395,,,,403,108,44597,44597,1424,0,,1085,,,,37240,,0,527400,12819,,7090,,,,0,527400,12819 +"2020-08-03","AS",0,,0,,,,,0,,,1267,0,,,,,,0,0,0,0,,,,,,,,0,1267,0,,,,,,0,1267,0 +"2020-08-03","AZ",3779,2431,14,152,11400,11400,2017,29,,628,784921,6960,,,,,461,179497,137710,1030,0,,,,,,,,0,1364256,6711,,,231917,,964418,7990,1364256,6711 +"2020-08-03","CA",9388,,32,,,,7629,0,,2069,,0,,,,,,514901,514901,5739,0,,,,,,,,0,8184696,148721,,,,,,0,8184696,148721 +"2020-08-03","CO",1844,1503,0,341,6487,6487,340,13,,,504035,4539,130397,,,,,47968,44773,252,0,9553,,,,,,721921,7361,721921,7361,139950,,,,548808,4785,,0 +"2020-08-03","CT",4437,3555,5,882,10807,10807,56,0,,,,0,,,820935,,,50062,48093,252,0,,,,,61443,8613,,0,884263,7372,,,,,,0,884263,7372 +"2020-08-03","DC",586,,0,,,,104,0,,24,,0,,,,,12,12313,,39,0,,,,,,9893,198815,1623,198815,1623,,,,,134793,985,,0 +"2020-08-03","DE",585,515,0,70,,,40,0,,9,172604,2642,,,,,,15055,14058,106,0,,,,,18611,8267,259956,3691,259956,3691,,,,,187659,2748,,0 +"2020-08-03","FL",7279,7279,73,,27744,27744,7938,220,,,3260914,27049,339059,334221,4263794,,,484729,,4814,0,19175,,18780,,622594,,4704476,51913,4704476,51913,358283,,353026,,3758496,31934,4908466,49145 +"2020-08-03","GA",3842,,2,,19124,19124,3111,60,3512,,,0,,,,,,195435,195435,2258,0,15069,,,,180509,,,0,1676684,21773,229417,,,,,0,1676684,21773 +"2020-08-03","GU",5,,0,,,,5,0,,2,22205,520,,,,,,368,360,1,0,2,,,,,305,,0,22573,521,146,,,,,0,22563,690 +"2020-08-03","HI",26,26,0,,199,199,75,5,,15,125037,593,,,,,10,2242,,45,0,,,,,2284,1294,157304,2790,157304,2790,,,,,127279,638,158188,897 +"2020-08-03","IA",882,,6,,,,241,0,,78,440634,2008,,36680,,,31,45841,45841,349,0,,,2768,,,33219,,0,486475,2357,,,39487,,488480,2361,,0 +"2020-08-03","ID",197,174,0,23,874,874,239,18,253,54,163993,808,,,,,,21344,20067,230,0,,,,,,7370,,0,184060,1026,,,,,184060,1026,,0 +"2020-08-03","IL",7723,7526,9,197,,,1418,0,,347,,0,,,,,132,184522,183241,1298,0,,,,,,,,0,2806797,28475,,,,,,0,2806797,28475 +"2020-08-03","IN",2980,2780,5,200,9004,9004,904,156,1871,310,707049,5863,,,,,81,68433,,576,0,,,,,72940,,,0,1024232,4095,,,,,775482,6439,1024232,4095 +"2020-08-03","KS",365,,7,,1782,1782,232,31,505,62,272963,8268,,,,184,16,28876,,1064,0,,,,,,,,0,301839,9332,,,,,301839,9332,,0 +"2020-08-03","KY",744,740,2,4,3815,3815,612,33,1212,136,,0,,,,,,31508,29623,323,0,,,,,,8335,,0,598408,3535,43896,273,,,,0,598408,3535 +"2020-08-03","LA",4024,3910,17,114,,,1496,0,,,1273064,13371,,,,,230,120846,120846,1099,0,,,,,,74246,,0,1393910,14470,,,,,,0,1393910,14470 +"2020-08-03","MA",8648,8427,10,221,11942,11942,375,6,,64,1108195,12113,,,,,24,118657,110595,199,0,,,,,147503,97595,,0,1648689,26960,,,97515,,1218790,12278,1648689,26960 +"2020-08-03","MD",3523,3389,8,134,12832,12832,548,86,,135,869493,14981,,88627,,,,91144,91144,870,0,,,7891,,107019,5740,,0,1288496,24484,,,96518,,960637,15851,1288496,24484 +"2020-08-03","ME",124,122,1,2,389,389,12,1,,3,,0,8478,,,,1,3970,3541,12,0,419,,,,4407,3396,,0,171894,2012,8909,,,,,0,171894,2012 +"2020-08-03","MI",6463,6212,6,251,,,694,0,,232,,0,,,1834449,,132,92374,83386,613,0,,,,,117106,60022,,0,1951555,25207,218538,,,,,0,1951555,25207 +"2020-08-03","MN",1656,1616,2,40,5298,5298,302,57,1545,153,815444,13050,,,,,,56560,56560,613,0,,,,,,49565,1070925,15963,1070925,15963,,,,,872004,13663,,0 +"2020-08-03","MO",1255,,2,,,,889,0,,,660061,9434,,58153,872832,,99,52887,52887,1047,0,,,2228,,61559,,,0,936013,15723,,,60381,,712948,10481,936013,15723 +"2020-08-03","MP",2,,0,,4,4,,0,,,12255,536,,,,,,46,46,1,0,,,,,,29,,0,12301,537,,,,,12301,542,14419,1674 +"2020-08-03","MS",1711,1664,8,47,4380,4380,1172,66,,302,401592,0,,,,,172,61125,60147,572,0,,,,,,42391,,0,462717,572,16566,,,,,0,460594,0 +"2020-08-03","MT",64,,3,,236,236,69,3,,,,0,,,,,,4233,,40,0,,,,,,2653,,0,179508,5213,,,,,,0,179508,5213 +"2020-08-03","NC",1982,1982,13,,,,1057,0,,318,,0,,,,,,126532,126532,1313,0,,,,,,,,0,1634070,23480,,,,,,0,1634070,23480 +"2020-08-03","ND",109,,0,,379,379,46,8,,,151966,2383,7136,,,,,6770,6770,127,0,263,,,,,5590,315710,4558,315710,4558,7399,,,,156230,1725,324964,4727 +"2020-08-03","NE",332,,0,,1630,1630,144,1,,,254404,3552,,,327822,,,26702,,311,0,,,,,32786,19575,,0,361468,4903,,,,,281387,3861,361468,4903 +"2020-08-03","NH",417,,1,,696,696,24,1,209,,155988,1639,,,,,,6634,,21,0,,,,,,5820,,0,243785,3110,27753,,27251,,162622,1660,243785,3110 +"2020-08-03","NJ",15747,13971,10,1776,21565,21565,738,0,,144,1981966,18438,,,,,49,184977,182614,293,0,,,,,,,,0,2166943,18731,,,,,,0,2164580,18702 +"2020-08-03","NM",655,,1,,2730,2730,131,10,,,,0,,,,,,21130,,114,0,,,,,,8463,,0,577810,3557,,,,,,0,577810,3557 +"2020-08-03","NV",847,,15,,,,1152,0,,326,433667,1753,,,,,207,51199,51199,994,0,,,,,,,654894,2045,654894,2045,,,,,483520,2201,641665,4639 +"2020-08-03","NY",25172,,2,,89995,89995,536,0,,136,,0,,,,,62,416843,,545,0,,,,,,,6082774,51839,6082774,51839,,,,,,0,,0 +"2020-08-03","OH",3539,3271,10,268,10992,10992,1001,92,2570,348,,0,,,,,199,93963,88997,932,0,,,,,103544,69501,,0,1601082,21448,,,,,,0,1601082,21448 +"2020-08-03","OK",551,,1,,3275,3275,628,34,,258,599461,0,,,599461,,,38602,38602,377,0,2272,,,,43360,31165,,0,638063,377,60293,,,,,0,644042,0 +"2020-08-03","OR",326,,1,,1607,1607,208,0,,65,394560,3761,,,617809,,32,19097,,280,0,,,,,33426,3872,,0,651235,6450,,,,,403241,0,651235,6450 +"2020-08-03","PA",7209,,0,,,,585,0,,,1142414,11435,,,,,103,114155,110970,565,0,,,,,,86757,1629049,18261,1629049,18261,,,,,1253384,11989,,0 +"2020-08-03","PR",230,119,0,111,,,533,0,,66,305972,0,,,303412,,51,7113,7113,278,0,11678,,,,7002,,,0,313085,278,,,,,,0,310546,0 +"2020-08-03","RI",1010,,3,,2231,2231,80,20,,14,190820,3826,,,348793,,5,19246,,224,0,,,,,27878,,376009,2733,376009,2733,,,,,210066,4050,376671,11605 +"2020-08-03","SC",1793,1721,16,72,5527,5527,1401,0,,366,638724,8255,50289,,614339,,224,92951,92404,1163,0,3671,,,,117336,32859,,0,731675,9418,53960,,,,,0,731675,9949 +"2020-08-03","SD",135,,0,,838,838,39,3,,,105628,630,,,,,,9020,,65,0,,,,,14097,7939,,0,142745,1054,,,,,114648,695,142745,1054 +"2020-08-03","TN",1092,1055,19,37,4808,4808,1323,52,,,,0,,,1442560,,,110636,109325,1009,0,,,,,130662,70878,,0,1573222,12201,,,,,,0,1573222,12201 +"2020-08-03","TX",7016,,179,,,,8819,0,,3045,,0,,,,,,442014,442014,5303,0,12054,9653,,,639157,297422,,0,4461346,15583,243777,58821,,,,0,4461346,15583 +"2020-08-03","UT",314,,3,,2450,2450,252,20,630,83,501540,3013,,,611381,257,,41529,,354,0,,547,,514,46168,29967,,0,657549,4261,,1495,,1250,542908,3241,657549,4261 +"2020-08-03","VA",2218,2108,0,110,8018,8018,1205,63,,271,,0,,,,,151,93106,89602,1324,0,7094,791,,,109903,,1151604,15036,1151604,15036,113447,1222,,,,0,,0 +"2020-08-03","VI",8,,0,,,,,0,,,8997,129,,,,,,439,,18,0,,,,,,354,,0,9436,147,,,,,9443,97,,0 +"2020-08-03","VT",57,57,0,,,,14,0,,,93673,497,,,,,,1426,1426,1,0,,,,,,1240,,0,122592,610,,,,,95099,498,122592,610 +"2020-08-03","WA",1596,1596,4,,5692,5692,512,37,,,,0,,,,,51,61074,60870,416,0,,,,,,,1127619,17534,1127619,17534,,,,,1008280,6752,,0 +"2020-08-03","WI",956,949,1,7,4732,4732,345,15,910,120,911435,6769,,,,,,59401,55328,411,0,,,,,,44495,1294013,12991,1294013,12991,,,,,966763,7173,,0 +"2020-08-03","WV",117,,0,,,,116,0,,50,,0,,,,,17,6973,6829,119,0,,,,,,4918,,0,290001,3787,14399,,,,,0,290001,3787 +"2020-08-03","WY",27,,1,,167,167,19,0,,,52032,1459,,,81367,,,2848,2364,40,0,,,,,2580,2214,,0,83947,1839,,,,,54396,1569,83947,1839 +"2020-08-02","AK",24,24,0,,154,154,39,1,,,,0,,,,,3,3273,,136,0,,,,,,932,,0,243090,4457,,,,,,0,243090,4457 +"2020-08-02","AL",1627,1576,24,51,10521,10521,1538,0,1151,,614626,6604,,,,616,,91444,88811,2095,0,,,,,,35401,,0,703437,8635,,,,,703437,8635,,0 +"2020-08-02","AR",458,,-2,,2894,2894,499,42,,,471408,0,,,,397,104,43173,43173,0,0,,1085,,,,36034,,0,514581,0,,7090,,,,0,514581,0 +"2020-08-02","AS",0,,0,,,,,0,,,1267,0,,,,,,0,0,0,0,,,,,,,,0,1267,0,,,,,,0,1267,0 +"2020-08-02","AZ",3765,2431,18,152,11371,11371,2147,25,,685,777961,6313,,,,,474,178467,137710,1465,0,,,,,,,,0,1357545,11765,,,230790,,956428,7778,1357545,11765 +"2020-08-02","CA",9356,,132,,,,7761,0,,2119,,0,,,,,,509162,509162,9032,0,,,,,,,,0,8035975,149388,,,,,,0,8035975,149388 +"2020-08-02","CO",1844,1502,0,342,6474,6474,308,9,,,499496,6191,130041,,,,,47716,44527,449,0,9525,,,,,,714560,10606,714560,10606,139566,,,,544023,6641,,0 +"2020-08-02","CT",4432,3551,0,881,10807,10807,69,0,,,,0,,,813606,,,49810,47854,0,0,,,,,61403,8613,,0,876891,5452,,,,,,0,876891,5452 +"2020-08-02","DC",586,,1,,,,102,0,,24,,0,,,,,12,12274,,69,0,,,,,,9870,197192,3411,197192,3411,,,,,133808,2777,,0 +"2020-08-02","DE",585,515,0,70,,,43,0,,8,169962,1943,,,,,,14949,13952,72,0,,,,,18519,8235,256265,3163,256265,3163,,,,,184911,2015,,0 +"2020-08-02","FL",7206,7206,62,,27524,27524,7952,180,,,3233865,34450,339059,334221,4221931,,,479915,,7056,0,19175,,18780,,615892,,4652563,74332,4652563,74332,358283,,353026,,3726562,41687,4859321,65960 +"2020-08-02","GA",3840,,15,,19064,19064,3069,69,3496,,,0,,,,,,193177,193177,3165,0,14823,,,,177896,,,0,1654911,28767,227358,,,,,0,1654911,28767 +"2020-08-02","GU",5,,0,,,,2,0,,2,21685,0,,,,,,367,359,0,0,2,,,,,304,,0,22052,0,145,,,,,0,21873,0 +"2020-08-02","HI",26,26,0,,194,194,75,15,,15,124444,3304,,,,,10,2197,,86,0,,,,,2166,1269,154514,2428,154514,2428,,,,,126641,3390,157291,4315 +"2020-08-02","IA",876,,4,,,,231,0,,75,438626,4632,,36627,,,36,45492,45492,516,0,,,2760,,,32952,,0,484118,5148,,,39426,,486119,5228,,0 +"2020-08-02","ID",197,174,8,23,856,856,239,6,250,54,163185,2033,,,,,,21114,19849,393,0,,,,,,7146,,0,183034,2419,,,,,183034,2419,,0 +"2020-08-02","IL",7714,7517,14,197,,,1407,0,,339,,0,,,,,126,183224,181943,1467,0,,,,,,,,0,2778322,38945,,,,,,0,2778322,38945 +"2020-08-02","IN",2975,2775,4,200,8848,8848,873,67,1852,322,701186,9702,,,,,77,67857,,735,0,,,,,72660,,,0,1020137,6795,,,,,769043,10437,1020137,6795 +"2020-08-02","KS",358,,0,,1751,1751,366,0,494,98,264695,0,,,,179,26,27812,,0,0,,,,,,,,0,292507,0,,,,,292507,0,,0 +"2020-08-02","KY",742,738,2,4,3782,3782,602,0,1207,128,,0,,,,,,31185,29346,462,0,,,,,,8135,,0,594873,0,43626,273,,,,0,594873,0 +"2020-08-02","LA",4007,3893,58,114,,,1534,0,,,1259693,33730,,,,,221,119747,119747,3467,0,,,,,,74246,,0,1379440,37197,,,,,,0,1379440,37197 +"2020-08-02","MA",8638,8417,12,221,11936,11936,406,6,,68,1096082,12959,,,,,33,118458,110430,418,0,,,,,147080,97595,,0,1621729,8178,,,97293,,1206512,13312,1621729,8178 +"2020-08-02","MD",3515,3381,9,134,12746,12746,553,74,,129,854512,14523,,88627,,,,90274,90274,909,0,,,7891,,106014,5713,,0,1264012,23785,,,96518,,944786,15432,1264012,23785 +"2020-08-02","ME",123,122,0,1,388,388,12,0,,4,,0,8468,,,,1,3958,3535,21,0,418,,,,4398,3387,,0,169882,2271,8898,,,,,0,169882,2271 +"2020-08-02","MI",6457,6206,0,251,,,727,0,,238,,0,,,1810080,,144,91761,82782,429,0,,,,,116268,60022,,0,1926348,25433,217937,,,,,0,1926348,25433 +"2020-08-02","MN",1654,1614,8,40,5241,5241,302,33,1532,149,802394,11314,,,,,,55947,55947,759,0,,,,,,48847,1054962,14645,1054962,14645,,,,,858341,12073,,0 +"2020-08-02","MO",1253,,0,,,,889,0,,,650627,5140,,57768,858109,,96,51840,51840,582,0,,,2215,,60974,,,0,920290,9334,,,59983,,702467,5722,920290,9334 +"2020-08-02","MP",2,,0,,4,4,,0,,,11719,0,,,,,,45,45,3,0,,,,,,29,,0,11764,3,,,,,11759,0,12745,0 +"2020-08-02","MS",1703,1657,10,46,4314,4314,1172,0,,302,401592,0,,,,,172,60553,59637,672,0,,,,,,35071,,0,462145,672,16566,,,,,0,460594,0 +"2020-08-02","MT",61,,0,,233,233,72,3,,,,0,,,,,,4193,,112,0,,,,,,2466,,0,174295,2742,,,,,,0,174295,2742 +"2020-08-02","NC",1969,1969,5,,,,1142,0,,341,,0,,,,,,125219,125219,1341,0,,,,,,,,0,1610590,23091,,,,,,0,1610590,23091 +"2020-08-02","ND",109,,2,,371,371,45,0,,,149583,0,7112,,,,,6643,6643,57,0,262,,,,,5396,311152,3828,311152,3828,7374,,,,154505,795,320237,3962 +"2020-08-02","NE",332,,0,,1629,1629,142,7,,,250852,1804,,,323249,,,26391,,180,0,,,,,32460,19325,,0,356565,4744,,,,,277526,1982,356565,4744 +"2020-08-02","NH",416,,0,,695,695,22,0,208,,154349,0,,,,,,6613,,0,0,,,,,,5794,,0,240675,3640,27694,,27088,,160962,0,240675,3640 +"2020-08-02","NJ",15737,13961,6,1776,21565,21565,695,0,,113,1963528,48859,,,,,45,184684,182350,357,0,,,,,,,,0,2148212,49216,,,,,,0,2145878,49549 +"2020-08-02","NM",654,,3,,2720,2720,127,17,,,,0,,,,,,21016,,220,0,,,,,,8343,,0,574253,8367,,,,,,0,574253,8367 +"2020-08-02","NV",832,,0,,,,1165,0,,333,431914,6768,,,,,193,50205,50205,1131,0,,,,,,,652849,3065,652849,3065,,,,,481319,8269,637026,12183 +"2020-08-02","NY",25170,,6,,89995,89995,556,0,,143,,0,,,,,71,416298,,531,0,,,,,,,6030935,58961,6030935,58961,,,,,,0,,0 +"2020-08-02","OH",3529,3261,14,268,10900,10900,1049,43,2560,334,,0,,,,,187,93031,88134,944,0,,,,,102385,68394,,0,1579634,26774,,,,,,0,1579634,26774 +"2020-08-02","OK",550,,1,,3241,3241,628,13,,258,599461,0,,,599461,,,38225,38225,494,0,2272,,,,43360,30820,,0,637686,494,60293,,,,,0,644042,0 +"2020-08-02","OR",325,,3,,1607,1607,208,0,,65,390799,5098,,,611700,,32,18817,,325,0,,,,,33085,3872,,0,644785,9366,,,,,403241,0,644785,9366 +"2020-08-02","PA",7209,,5,,,,564,0,,,1130979,11593,,,,,90,113590,110416,654,0,,,,,,86328,1610788,19155,1610788,19155,,,,,1241395,12230,,0 +"2020-08-02","PR",230,119,5,111,,,506,0,,64,305972,0,,,303412,,46,6835,6835,292,0,11576,,,,7002,,,0,312807,292,,,,,,0,310546,0 +"2020-08-02","RI",1007,,0,,2211,2211,76,0,,15,186994,0,,,337466,,5,19022,,0,0,,,,,27600,,373276,3974,373276,3974,,,,,206016,0,365066,0 +"2020-08-02","SC",1777,1709,26,68,5527,5527,1427,0,,365,630469,9199,50002,,605932,,230,91788,91257,1189,0,3635,,,,115794,32859,,0,722257,10388,53637,,,,,0,721726,10380 +"2020-08-02","SD",135,,1,,835,835,35,3,,,104998,933,,,,,,8955,,88,0,,,,,14047,7909,,0,141691,1583,,,,,113953,1021,141691,1583 +"2020-08-02","TN",1073,1036,6,37,4756,4756,1271,32,,,,0,,,1431528,,,109627,108350,1443,0,,,,,129493,68471,,0,1561021,19406,,,,,,0,1561021,19406 +"2020-08-02","TX",6837,,0,,,,8969,0,,3117,,0,,,,,,436711,436711,6226,0,11812,9563,,,637015,282604,,0,4445763,20123,242251,57988,,,,0,4445763,20123 +"2020-08-02","UT",311,,1,,2430,2430,289,18,628,84,498527,3714,,,607375,256,,41175,,473,0,,540,,508,45913,29389,,0,653288,5726,,1469,,1233,539667,4064,653288,5726 +"2020-08-02","VA",2218,2108,3,110,7955,7955,1172,45,,267,,0,,,,,138,91782,88324,981,0,7055,782,,,108778,,1136568,12641,1136568,12641,112929,1176,,,,0,,0 +"2020-08-02","VI",8,,0,,,,,0,,,8868,0,,,,,,421,,0,0,,,,,,341,,0,9289,0,,,,,9346,0,,0 +"2020-08-02","VT",57,57,0,,,,15,0,,,93176,1159,,,,,,1425,1425,4,0,,,,,,1238,,0,121982,1839,,,,,94601,1163,121982,1839 +"2020-08-02","WA",1592,1592,28,,5655,5655,530,87,,,,0,,,,,57,60658,60456,711,0,,,,,,,1110085,4787,1110085,4787,,,,,1001528,27874,,0 +"2020-08-02","WI",955,948,1,7,4717,4717,354,36,910,110,904666,8721,,,,,,58990,54924,932,0,,,,,,43964,1281022,15299,1281022,15299,,,,,959590,9643,,0 +"2020-08-02","WV",117,,1,,,,112,0,,47,,0,,,,,16,6854,6713,119,0,,,,,,4897,,0,286214,3714,14364,,,,,0,286214,3714 +"2020-08-02","WY",26,,0,,167,167,18,0,,,50573,0,,,79567,,,2808,2333,39,0,,,,,2541,2173,,0,82108,221,,,,,52827,0,82108,221 +"2020-08-01","AK",24,24,1,,153,153,37,2,,,,0,,,,,3,3137,,144,0,,,,,,930,,0,238633,5527,,,,,,0,238633,5527 +"2020-08-01","AL",1603,1553,23,50,10521,10521,1416,0,1150,,608022,6278,,,,616,,89349,86780,1626,0,,,,,,35401,,0,694802,7780,,,,,694802,7780,,0 +"2020-08-01","AR",460,,7,,2852,2852,507,0,,,471408,10450,,,,395,100,43173,43173,662,0,,1085,,,,36034,,0,514581,11864,,7090,,,,0,514581,11864 +"2020-08-01","AS",0,,0,,,,,0,,,1267,230,,,,,,0,0,0,0,,,,,,,,0,1267,230,,,,,,0,1267,230 +"2020-08-01","AZ",3747,2431,53,152,11346,11346,2226,86,,710,771648,11915,,,,,490,177002,137710,2992,0,,,,,,,,0,1345780,16944,,,229328,,948650,14907,1345780,16944 +"2020-08-01","CA",9224,,219,,,,7754,0,,2120,,0,,,,,,500130,500130,6542,0,,,,,,,,0,7886587,75546,,,,,,0,7886587,75546 +"2020-08-01","CO",1844,1501,6,343,6465,6465,335,24,,,493305,6711,129376,,,,,47267,44077,458,0,9474,,,,,,703954,12589,703954,12589,138850,,,,537382,7162,,0 +"2020-08-01","CT",4432,3551,0,881,10807,10807,69,0,,,,0,,,808205,,,49810,47854,0,0,,,,,61353,8613,,0,871439,11681,,,,,,0,871439,11681 +"2020-08-01","DC",585,,0,,,,100,0,,26,,0,,,,,13,12205,,79,0,,,,,,9816,193781,5040,193781,5040,,,,,131031,4157,,0 +"2020-08-01","DE",585,515,0,70,,,45,0,,18,168019,1760,,,,,,14877,13880,89,0,,,,,18385,8212,253102,5209,253102,5209,,,,,182896,1849,,0 +"2020-08-01","FL",7144,7144,178,,27344,27344,8072,439,,,3199415,41713,339059,334221,4166771,,,472859,,9502,0,19175,,18780,,605946,,4578231,84455,4578231,84455,358283,,353026,,3684875,51482,4793361,81174 +"2020-08-01","GA",3825,,73,,18995,18995,3095,306,3475,,,0,,,,,,190012,190012,3660,0,14462,,,,174615,,,0,1626144,22014,224874,,,,,0,1626144,22014 +"2020-08-01","GU",5,,0,,,,2,0,,2,21685,159,,,,,,367,359,11,0,2,,,,,304,,0,22052,170,145,,,,,0,21873,0 +"2020-08-01","HI",26,26,0,,179,179,75,2,,15,121140,1761,,,,,10,2111,,122,0,,,,,2072,1243,152086,2690,152086,2690,,,,,123251,1883,152976,2582 +"2020-08-01","IA",872,,5,,,,242,0,,77,433994,4164,,36590,,,35,44976,44976,394,0,,,2753,,,32819,,0,478970,4558,,,39382,,480891,4569,,0 +"2020-08-01","ID",189,155,12,22,850,850,239,15,249,54,161152,2288,,,,,,20721,19463,475,0,,,,,,6998,,0,180615,2731,,,,,180615,2731,,0 +"2020-08-01","IL",7700,7503,8,197,,,1347,0,,334,,0,,,,,148,181757,180476,1639,0,,,,,,,,0,2739377,39809,,,,,,0,2739377,39809 +"2020-08-01","IN",2971,2771,6,200,8781,8781,977,54,1836,322,691484,10255,,,,,81,67122,,968,0,,,,,72225,,,0,1013342,17077,,,,,758606,11223,1013342,17077 +"2020-08-01","KS",358,,0,,1751,1751,366,0,494,98,264695,0,,,,179,26,27812,,0,0,,,,,,,,0,292507,0,,,,,292507,0,,0 +"2020-08-01","KY",740,736,5,4,3782,3782,602,468,1207,128,,0,,,,,,30723,28922,572,0,,,,,,8135,,0,594873,8797,43626,273,,,,0,594873,8797 +"2020-08-01","LA",3949,3835,0,114,,,1546,0,,,1225963,0,,,,,222,116280,116280,0,0,,,,,,74246,,0,1342243,0,,,,,,0,1342243,0 +"2020-08-01","MA",8626,8406,17,220,11930,11930,369,22,,53,1083123,12305,,,,,26,118040,110077,428,0,,,,,146945,97595,,0,1613551,11055,,,96964,,1193200,12595,1613551,11055 +"2020-08-01","MD",3506,3374,13,132,12672,12672,592,79,,132,839989,17144,,88627,,,,89365,89365,1019,0,,,7891,,104907,5713,,0,1240227,31004,,,96518,,929354,18163,1240227,31004 +"2020-08-01","ME",123,122,0,1,388,388,10,0,,5,,0,8425,,,,1,3937,3516,25,0,417,,,,4372,3377,,0,167611,2471,8854,,,,,0,167611,2471 +"2020-08-01","MI",6457,6206,7,251,,,727,0,,238,,0,,,1785498,,144,91332,82356,758,0,,,,,115417,60022,,0,1900915,32759,216608,,,,,0,1900915,32759 +"2020-08-01","MN",1646,1606,6,40,5208,5208,317,53,1520,149,791080,11189,,,,,,55188,55188,725,0,,,,,,48119,1040317,15401,1040317,15401,,,,,846268,11914,,0 +"2020-08-01","MO",1253,,10,,,,812,0,,,645487,9037,,57677,849835,,103,51258,51258,935,0,,,2206,,59544,,,0,910956,15265,,,59883,,696745,9972,910956,15265 +"2020-08-01","MP",2,,0,,4,4,,0,,,11719,0,,,,,,42,42,0,0,,,,,,29,,0,11761,0,,,,,11759,0,12745,0 +"2020-08-01","MS",1693,1648,30,45,4314,4314,1172,38,,302,401592,5834,,,,,172,59881,59002,1134,0,,,,,,35071,,0,461473,6968,16566,,,,,0,460594,6924 +"2020-08-01","MT",61,,1,,230,230,71,0,,,,0,,,,,,4081,,116,0,,,,,,2456,,0,171553,1583,,,,,,0,171553,1583 +"2020-08-01","NC",1964,1964,40,,,,1151,0,,349,,0,,,,,,123878,123878,1730,0,,,,,,,,0,1587499,23947,,,,,,0,1587499,23947 +"2020-08-01","ND",107,,0,,371,371,45,7,,,149583,2088,7112,,,,,6586,6586,132,0,262,,,,,5396,307324,5815,307324,5815,7374,,,,153710,2465,316275,6045 +"2020-08-01","NE",332,,4,,1622,1622,152,12,,,249048,3858,,,318824,,,26211,,445,0,,,,,32142,19172,,0,351821,4403,,,,,275544,4299,351821,4403 +"2020-08-01","NH",416,,1,,695,695,22,3,208,,154349,2584,,,,,,6613,,69,0,,,,,,5794,,0,237035,3007,27535,,27088,,160962,2653,237035,3007 +"2020-08-01","NJ",15731,13955,12,1776,21565,21565,695,0,,113,1914669,0,,,,,45,184327,182029,426,0,,,,,,,,0,2098996,426,,,,,,0,2096329,0 +"2020-08-01","NM",651,,9,,2703,2703,134,17,,,,0,,,,,,20796,,196,0,,,,,,8286,,0,565886,7874,,,,,,0,565886,7874 +"2020-08-01","NV",832,,2,,,,1165,0,,333,425146,3331,,,,,193,49074,49074,986,0,,,,,,,649784,7595,649784,7595,,,,,473050,4083,624843,8112 +"2020-08-01","NY",25164,,14,,89995,89995,581,0,,147,,0,,,,,72,415767,,753,0,,,,,,,5971974,82737,5971974,82737,,,,,,0,,0 +"2020-08-01","OH",3515,3246,26,269,10857,10857,1049,67,2557,340,,0,,,,,188,92087,87218,928,0,,,,,100986,67319,,0,1552860,26679,,,,,,0,1552860,26679 +"2020-08-01","OK",549,,8,,3228,3228,628,67,,258,599461,10370,,,599461,,,37731,37731,1244,0,2272,,,,43360,30282,,0,637192,11614,60293,,,,,0,644042,11507 +"2020-08-01","OR",322,,6,,1607,1607,208,20,,65,385701,5193,,,602798,,32,18492,,361,0,,,,,32621,3872,,0,635419,8651,,,,,403241,5536,635419,8651 +"2020-08-01","PA",7204,,15,,,,579,0,,,1119386,14562,,,,,89,112936,109779,888,0,,,,,,85831,1591633,21809,1591633,21809,,,,,1229165,15434,,0 +"2020-08-01","PR",225,115,6,110,,,508,0,,65,305972,0,,,303412,,41,6543,6543,546,0,11329,,,,7002,,,0,312515,546,,,,,,0,310546,0 +"2020-08-01","RI",1007,,0,,2211,2211,76,0,,15,186994,0,,,337466,,5,19022,,0,0,,,,,27600,,369302,5176,369302,5176,,,,,206016,0,365066,0 +"2020-08-01","SC",1751,1683,39,68,5527,5527,1453,410,,359,621270,17451,49676,,597095,,235,90599,90076,1583,0,3557,,,,114251,32859,,0,711869,19034,53233,,,,,0,711346,20410 +"2020-08-01","SD",134,,4,,832,832,36,8,,,104065,1194,,,,,,8867,,103,0,,,,,13930,7820,,0,140108,2096,,,,,112932,1297,140108,2096 +"2020-08-01","TN",1067,1030,7,37,4724,4724,1446,63,,,,0,,,1413842,,,108184,106946,2225,0,,,,,127773,67651,,0,1541615,29391,,,,,,0,1541615,29391 +"2020-08-01","TX",6837,,268,,,,8969,0,,3117,,0,,,,,,430485,430485,9539,0,11812,9462,,,634076,282604,,0,4425640,46798,242251,57141,,,,0,4425640,46798 +"2020-08-01","UT",310,,6,,2412,2412,268,35,627,82,494813,4741,,,602037,255,,40702,,506,0,,530,,498,45525,28747,,0,647562,7214,,1439,,1210,535603,5231,647562,7214 +"2020-08-01","VA",2215,2105,41,110,7910,7910,1256,44,,275,,0,,,,,150,90801,87367,913,0,6974,770,,,107823,,1123927,16567,1123927,16567,112208,1118,,,,0,,0 +"2020-08-01","VI",8,,0,,,,,0,,,8868,93,,,,,,421,,15,0,,,,,,341,,0,9289,108,,,,,9346,153,,0 +"2020-08-01","VT",57,57,0,,,,16,0,,,92017,940,,,,,,1421,1421,5,0,,,,,,1231,,0,120143,1469,,,,,93438,945,120143,1469 +"2020-08-01","WA",1564,1564,0,,5568,5568,532,0,,,,0,,,,,56,59947,59771,751,0,,,,,,,1105298,8996,1105298,8996,,,,,973654,0,,0 +"2020-08-01","WI",954,947,13,7,4681,4681,337,44,904,110,895945,13796,,,,,,58058,54002,1124,0,,,,,,43284,1265723,18715,1265723,18715,,,,,949947,14858,,0 +"2020-08-01","WV",116,,0,,,,108,0,,39,,0,,,,,18,6735,6595,93,0,,,,,,4858,,0,282500,5488,14292,,,,,0,282500,5488 +"2020-08-01","WY",26,,0,,167,167,18,1,,,50573,0,,,79354,,,2769,2297,43,0,,,,,2533,2153,,0,81887,220,,,,,52827,0,81887,220 +"2020-07-31","AK",23,23,0,,151,151,40,4,,,,0,,,,,3,2993,,106,0,,,,,,898,,0,233106,8049,,,,,,0,233106,8049 +"2020-07-31","AL",1580,1531,15,49,10521,10521,1596,451,1144,,601744,7398,,,,613,,87723,85278,1961,0,,,,,,35401,,0,687022,9181,,,,,687022,9181,,0 +"2020-07-31","AR",453,,11,,2852,2852,507,105,,,460958,0,,,,395,100,42511,42511,752,0,,1085,,,,35413,,0,502717,0,,7090,,,,0,502717,0 +"2020-07-31","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-31","AZ",3694,2431,68,152,11260,11260,2302,88,,719,759733,17265,,,,,505,174010,137710,3212,0,,,,,,,,0,1328836,15666,,,227897,,933743,20477,1328836,15666 +"2020-07-31","CA",9005,,96,,,,7999,0,,2163,,0,,,,,,493588,493588,8086,0,,,,,,,,0,7811041,177201,,,,,,0,7811041,177201 +"2020-07-31","CO",1838,1498,16,340,6441,6441,350,28,,,486594,6452,128389,,,,,46809,43626,605,0,9385,,,,,,691365,12542,691365,12542,137774,,,,530220,7046,,0 +"2020-07-31","CT",4432,3551,1,881,10807,10807,69,0,,,,0,,,796624,,,49810,47854,140,0,,,,,61256,8613,,0,859758,14496,,,,,,0,859758,14496 +"2020-07-31","DC",585,,1,,,,86,0,,17,,0,,,,,9,12126,,69,0,,,,,,9816,188741,5751,188741,5751,,,,,126874,0,,0 +"2020-07-31","DE",585,515,4,70,,,46,0,,11,166259,2085,,,,,,14788,13791,99,0,,,,,18220,8179,247893,1834,247893,1834,,,,,181047,2184,,0 +"2020-07-31","FL",6966,6966,257,,26905,26905,8209,519,,,3157702,39964,339059,334221,4099817,,,463357,,8900,0,19175,,18780,,592572,,4493776,82202,4493776,82202,358283,,353026,,3633393,49200,4712187,77161 +"2020-07-31","GA",3752,,81,,18689,18689,3155,386,3414,,,0,,,,,,186352,186352,4066,0,14138,,,,171513,,,0,1604130,34533,222213,,,,,0,1604130,34533 +"2020-07-31","GU",5,,0,,,,2,0,,2,21526,338,,,,,,356,348,2,0,2,,,,,304,,0,21882,340,145,,,,,0,21873,340 +"2020-07-31","HI",26,26,0,,177,177,65,4,,14,119379,2032,,,,,10,1989,,124,0,,,,,1941,1226,149396,2500,149396,2500,,,,,121368,2156,150394,2841 +"2020-07-31","IA",867,,10,,,,225,0,,71,429830,4770,,36439,,,29,44582,44582,544,0,,,2744,,,32578,,0,474412,5314,,,39222,,476322,5316,,0 +"2020-07-31","ID",177,155,4,22,835,835,236,27,247,51,158864,3024,,,,,,20246,19020,567,0,,,,,,6744,,0,177884,3541,,,,,177884,3541,,0 +"2020-07-31","IL",7692,7495,22,197,,,1369,0,,346,,0,,,,,148,180118,178837,1980,0,,,,,,,,0,2699568,49782,,,,,,0,2699568,49782 +"2020-07-31","IN",2965,2765,19,200,8727,8727,865,60,1825,280,681229,10634,,,,,81,66154,,901,0,,,,,71180,,,0,996265,16140,,,,,747383,11535,996265,16140 +"2020-07-31","KS",358,,9,,1751,1751,366,51,494,98,264695,6616,,,,179,26,27812,,942,0,,,,,,,,0,292507,7558,,,,,292507,7558,,0 +"2020-07-31","KY",735,731,4,4,3314,3314,597,10,1133,150,,0,,,,,,30151,28404,765,0,,,,,,7481,,0,586076,8440,43408,222,,,,0,586076,8440 +"2020-07-31","LA",3949,3835,24,114,,,1546,0,,,1225963,23054,,,,,222,116280,116280,1799,0,,,,,,74246,,0,1342243,24853,,,,,,0,1342243,24853 +"2020-07-31","MA",8609,8389,14,220,11908,11908,347,15,,58,1070818,18764,,,,,28,117612,109787,514,0,,,,,146758,97595,,0,1602496,21526,,,96180,,1180605,19151,1602496,21526 +"2020-07-31","MD",3493,3362,5,131,12593,12593,590,93,,128,822845,16057,,88627,,,,88346,88346,1169,0,,,7891,,103840,5689,,0,1209223,28632,,,96518,,911191,17226,1209223,28632 +"2020-07-31","ME",123,122,1,1,388,388,12,2,,7,,0,8396,,,,2,3912,3499,24,0,413,,,,4355,3361,,0,165140,2298,8821,,,,,0,165140,2298 +"2020-07-31","MI",6450,6199,7,251,,,727,0,,238,,0,,,1753873,,144,90574,81621,793,0,,,,,114283,57502,,0,1868156,31572,214923,,,,,0,1868156,31572 +"2020-07-31","MN",1640,1600,6,40,5155,5155,312,43,1510,151,779891,-174299,,,,,,54463,54463,771,0,,,,,,47289,1024916,17034,1024916,17034,,,,,834354,13537,,0 +"2020-07-31","MO",1243,,10,,,,869,0,,,636450,10151,,57432,836423,,108,50323,50323,1489,0,,,2178,,57753,,,0,895691,18007,,,59610,,686773,11640,895691,18007 +"2020-07-31","MP",2,,0,,4,4,,0,,,11719,0,,,,,,42,42,0,0,,,,,,29,,0,11761,0,,,,,11759,0,12745,0 +"2020-07-31","MS",1663,1620,52,43,4276,4276,1229,63,,297,395758,3456,,,,,176,58747,57912,1168,0,,,,,,35071,,0,454505,4624,16378,,,,,0,453670,4598 +"2020-07-31","MT",60,,5,,230,230,71,9,,,,0,,,,,,3965,,151,0,,,,,,2331,,0,169970,1354,,,,,,0,169970,1354 +"2020-07-31","NC",1924,1924,21,,,,1229,0,,363,,0,,,,,,122148,122148,1954,0,,,,,,,,0,1563552,25438,,,,,,0,1563552,25438 +"2020-07-31","ND",107,,0,,364,364,47,8,,,147495,1935,7093,,,,,6454,6454,167,0,261,,,,,5289,301509,5031,301509,5031,7354,,,,151245,1981,310230,5237 +"2020-07-31","NE",328,,4,,1610,1610,150,0,,,245190,3719,,,314873,,,25766,,344,0,,,,,31707,18997,,0,347418,5885,,,,,271245,4068,347418,5885 +"2020-07-31","NH",415,,4,,692,692,21,2,207,,151765,881,,,,,,6544,,31,0,,,,,,5722,,0,234028,2534,27391,,26810,,158309,912,234028,2534 +"2020-07-31","NJ",15719,13944,11,1775,21565,21565,695,0,,113,1914669,36075,,,,,45,183901,181660,727,0,,,,,,,,0,2098570,36802,,,,,,0,2096329,36765 +"2020-07-31","NM",642,,7,,2686,2686,152,19,,,,0,,,,,,20600,,212,0,,,,,,8139,,0,558012,6375,,,,,,0,558012,6375 +"2020-07-31","NV",830,,29,,,,1159,0,,333,421815,4994,,,,,191,48088,48088,1264,0,,,,,,,642189,7751,642189,7751,,,,,468967,6082,616731,9443 +"2020-07-31","NY",25150,,5,,89995,89995,576,0,,140,,0,,,,,70,415014,,644,0,,,,,,,5889237,68869,5889237,68869,,,,,,0,,0 +"2020-07-31","OH",3489,3222,47,267,10790,10790,1024,112,2552,330,,0,,,,,185,91159,86333,1533,0,,,,,99464,65788,,0,1526181,23859,,,,,,0,1526181,23859 +"2020-07-31","OK",541,,5,,3161,3161,621,57,,253,589091,9815,,,589091,,,36487,36487,747,0,2071,,,,42245,29187,,0,625578,10562,57683,,,,,0,632535,10902 +"2020-07-31","OR",316,,5,,1587,1587,229,19,,66,380508,4074,,,594630,,30,18131,,410,0,,,,,32138,3835,,0,626768,7162,,,,,397705,4456,626768,7162 +"2020-07-31","PA",7189,,13,,,,522,0,,,1104824,15965,,,,,89,112048,108907,970,0,,,,,,84036,1569824,24376,1569824,24376,,,,,1213731,16914,,0 +"2020-07-31","PR",219,113,5,106,,,488,0,,62,305972,0,,,303412,,39,5997,5997,77,0,10784,,,,7002,,,0,311969,77,,,,,,0,310546,0 +"2020-07-31","RI",1007,,0,,2211,2211,76,9,,15,186994,1425,,,337466,,5,19022,,72,0,,,,,27600,,364126,4031,364126,4031,,,,,206016,1497,365066,4119 +"2020-07-31","SC",1712,1647,45,65,5117,5117,1516,0,,373,603819,0,48977,,580768,,237,89016,88523,1444,0,3430,,,,110168,32859,,0,692835,1444,52407,,,,,0,690936,0 +"2020-07-31","SD",130,,1,,824,824,31,9,,,102871,1211,,,,,,8764,,79,0,,,,,13802,7761,,0,138012,1725,,,,,111635,1290,138012,1725 +"2020-07-31","TN",1060,1023,27,37,4661,4661,1494,89,,,,0,,,1387314,,,105959,104778,3088,0,,,,,124910,66357,,0,1512224,32555,,,,,,0,1512224,32555 +"2020-07-31","TX",6569,,295,,,,9336,0,,3117,,0,,,,,,420946,420946,8839,0,11712,9307,,,627128,273191,,0,4378842,53091,241518,55473,,,,0,4378842,53091 +"2020-07-31","UT",304,,4,,2377,2377,258,31,618,81,490072,3988,,,595387,250,,40196,,500,0,,518,,489,44961,28130,,0,640348,6368,,1402,,1166,530372,4470,640348,6368 +"2020-07-31","VA",2174,2067,33,107,7866,7866,1334,80,,279,,0,,,,,145,89888,86501,984,0,6906,759,,,106630,,1107360,15745,1107360,15745,111265,1057,,,,0,,0 +"2020-07-31","VI",8,,0,,,,,0,,,8775,356,,,,,,406,,21,0,,,,,,338,,0,9181,377,,,,,9193,360,,0 +"2020-07-31","VT",57,57,0,,,,16,0,,,91077,1022,,,,,,1416,1416,8,0,,,,,,1211,,0,118674,1620,,,,,92493,1030,118674,1620 +"2020-07-31","WA",1564,1564,9,,5568,5568,526,92,,,,0,,,,,56,59196,59029,898,0,,,,,,,1096302,14816,1096302,14816,,,,,973654,15347,,0 +"2020-07-31","WI",941,934,15,7,4637,4637,308,47,900,108,882149,14547,,,,,,56934,52940,855,0,,,,,,42317,1247008,20018,1247008,20018,,,,,935089,15379,,0 +"2020-07-31","WV",116,,1,,,,108,0,,39,,0,,,,,18,6642,6502,220,0,,,,,,4815,,0,277012,6092,14221,,,,,0,277012,6092 +"2020-07-31","WY",26,,0,,166,166,18,0,,,50573,618,,,79140,,,2726,2254,40,0,,,,,2527,2123,,0,81667,891,,,,,52827,655,81667,891 +"2020-07-30","AK",23,23,1,,147,147,45,2,,,,0,,,,,3,2887,,84,0,,,,,,885,,0,225057,1393,,,,,,0,225057,1393 +"2020-07-30","AL",1565,1516,27,49,10070,10070,1512,177,1129,,594346,9853,,,,605,,85762,83495,1980,0,,,,,,35401,,0,677841,11776,,,,,677841,11776,,0 +"2020-07-30","AR",442,,8,,2747,2747,508,0,,,460958,6321,,,,387,108,41759,41759,791,0,,,,,,34737,,0,502717,7112,,,,,,0,502717,7112 +"2020-07-30","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-30","AZ",3626,2431,172,152,11172,11172,2348,1112,,758,742468,9312,,,,,531,170798,137710,2525,0,,,,,,,,0,1313170,16351,,,226306,,913266,11837,1313170,16351 +"2020-07-30","CA",8909,,194,,,,8198,0,,2220,,0,,,,,,485502,485502,10197,0,,,,,,,,0,7633840,116374,,,,,,0,7633840,116374 +"2020-07-30","CO",1822,1483,0,339,6413,6413,350,15,,,480142,6266,127421,,,,,46204,43032,408,0,9293,,,,,,678823,10578,678823,10578,136714,,,,523174,6672,,0 +"2020-07-30","CT",4431,3550,6,881,10807,10807,66,95,,,,0,,,782270,,,49670,47717,130,0,,,,,61121,8613,,0,845262,15237,,,,,,0,845262,15237 +"2020-07-30","DC",584,,0,,,,87,0,,17,,0,,,,,7,12057,,58,0,,,,,,9777,182990,2941,182990,2941,,,,,126874,1607,,0 +"2020-07-30","DE",581,511,0,70,,,69,0,,11,164174,1760,,,,,,14689,13692,87,0,,,,,18159,8140,246059,1695,246059,1695,,,,,178863,1847,,0 +"2020-07-30","FL",6709,6709,252,,26386,26386,8395,519,,,3117738,42396,339059,334221,4035319,,,454457,,9835,0,19175,,18780,,580808,,4411574,80116,4411574,80116,358283,,353026,,3584193,52472,4635026,78026 +"2020-07-30","GA",3671,,29,,18303,18303,3200,339,3354,,,0,,,,,,182286,182286,3963,0,13886,,,,167603,,,0,1569597,29573,219867,,,,,0,1569597,29573 +"2020-07-30","GU",5,,0,,,,2,0,,2,21188,210,,,,,,354,346,3,0,2,,,,,297,,0,21542,213,145,,,,,0,21533,213 +"2020-07-30","HI",26,26,0,,173,173,61,6,,11,117347,1545,,,,,9,1865,,108,0,,,,,1826,1215,146896,2740,146896,2740,,,,,119212,1653,147553,2149 +"2020-07-30","IA",857,,11,,,,237,0,,76,425060,5625,,36194,,,31,44038,44038,761,0,,,2738,,,31835,,0,469098,6386,,,38971,,471006,6489,,0 +"2020-07-30","ID",173,152,13,21,808,808,236,25,236,51,155840,2020,,,,,,19679,18503,457,0,,,,,,6472,,0,174343,2451,,,,,174343,2451,,0 +"2020-07-30","IL",7670,7478,16,192,,,1452,0,,353,,0,,,,,149,178138,176896,1772,0,,,,,,,,0,2649786,41134,,,,,,0,2649786,41134 +"2020-07-30","IN",2946,2746,14,200,8667,8667,831,80,1808,301,670595,10656,,,,,69,65253,,954,0,,,,,70277,,,0,980125,16212,,,,,735848,11610,980125,16212 +"2020-07-30","KS",349,,0,,1700,1700,393,0,483,83,258079,0,,,,174,29,26870,,0,0,,,,,,,,0,284949,0,,,,,284949,0,,0 +"2020-07-30","KY",731,727,7,4,3304,3304,587,23,1133,110,,0,,,,,,29386,27716,659,0,,,,,,7590,,0,577636,10849,43348,222,,,,0,577636,10849 +"2020-07-30","LA",3925,3811,42,114,,,1524,0,,,1202909,20551,,,,,205,114481,114481,1708,0,,,,,,74246,,0,1317390,22259,,,,,,0,1317390,22259 +"2020-07-30","MA",8595,8375,15,220,11893,11893,367,17,,55,1052054,11920,,,,,29,117098,109400,414,0,,,,,146308,97595,,0,1580970,22921,,,95217,,1161454,12224,1580970,22921 +"2020-07-30","MD",3488,3357,10,131,12500,12500,585,52,,139,806788,14114,,88627,,,,87177,87177,892,0,,,7891,,102659,5592,,0,1180591,25689,,,96518,,893965,15006,1180591,25689 +"2020-07-30","ME",122,121,1,1,386,386,11,1,,8,,0,8371,,,,3,3888,3477,22,0,412,,,,4324,3345,,0,162842,2663,8795,,,,,0,162842,2663 +"2020-07-30","MI",6443,6191,21,252,,,727,0,,238,,0,,,1723397,,153,89781,80887,807,0,,,,,113187,57502,,0,1836584,16779,212732,,,,,0,1836584,16779 +"2020-07-30","MN",1634,1594,5,40,5112,5112,298,35,1490,141,954190,14046,,,767125,,,53692,53692,745,0,,,,,,46965,1007882,14791,1007882,14791,,,,,820817,820817,,0 +"2020-07-30","MO",1233,,13,,,,813,0,,,626299,12150,,57073,821441,,111,48834,48834,2084,0,,,2137,,54787,,,0,877684,21248,,,59210,,675133,14234,877684,21248 +"2020-07-30","MP",2,,0,,4,4,,0,,,11719,0,,,,,,42,42,2,0,,,,,,29,,0,11761,2,,,,,11759,0,12745,0 +"2020-07-30","MS",1611,1570,48,41,4213,4213,1245,61,,296,392302,4802,,,,,177,57579,56770,1775,0,,,,,,35071,,0,449881,6577,16284,,,,,0,449072,6526 +"2020-07-30","MT",55,,1,,221,221,69,10,,,,0,,,,,,3814,,138,0,,,,,,2240,,0,168616,3261,,,,,,0,168616,3261 +"2020-07-30","NC",1903,1903,38,,,,1239,0,,358,,0,,,,,,120194,120194,2344,0,,,,,,,,0,1538114,25175,,,,,,0,1538114,25175 +"2020-07-30","ND",107,,1,,356,356,43,5,,,145560,704,6514,,,,,6287,6287,72,0,248,,,,,5181,296478,3864,296478,3864,6762,,,,149264,818,304993,3962 +"2020-07-30","NE",324,,3,,1610,1610,137,4,,,241471,2595,,,309489,,,25422,,265,0,,,,,31216,18802,,0,341533,3523,,,,,267177,2864,341533,3523 +"2020-07-30","NH",411,,2,,690,690,22,0,205,,150884,1301,,,,,,6513,,13,0,,,,,,5710,,0,231494,3142,27245,,26674,,157397,1314,231494,3142 +"2020-07-30","NJ",15708,13934,11,1774,21565,21565,759,244,,123,1878594,16678,,,,,51,183174,180970,239,0,,,,,,,,0,2061768,16917,,,,,,0,2059564,16882 +"2020-07-30","NM",635,,3,,2667,2667,156,24,,,,0,,,,,,20388,,252,0,,,,,,8015,,0,551637,7026,,,,,,0,551637,7026 +"2020-07-30","NV",801,,21,,,,1145,0,,327,416821,5242,,,,,187,46824,46824,1018,0,,,,,,,634438,8595,634438,8595,,,,,462885,6283,607288,10493 +"2020-07-30","NY",25145,,13,,89995,89995,586,0,,142,,0,,,,,72,414370,,777,0,,,,,,,5820368,73546,5820368,73546,,,,,,0,,0 +"2020-07-30","OH",3442,3177,20,265,10678,10678,1049,125,2534,319,,0,,,,,184,89626,84862,1733,0,,,,,98063,64311,,0,1502322,27711,,,,,,0,1502322,27711 +"2020-07-30","OK",536,,13,,3104,3104,647,63,,244,579276,7386,,,579276,,,35740,35740,1117,0,2071,,,,41179,28411,,0,615016,8503,57683,,,,,0,621633,8431 +"2020-07-30","OR",311,,8,,1568,1568,235,31,,62,376434,6194,,,587836,,32,17721,,305,0,,,,,31770,3736,,0,619606,8562,,,,,393249,6463,619606,8562 +"2020-07-30","PA",7176,,14,,,,756,0,,,1088859,14996,,,,,109,111078,107958,860,0,,,,,,83308,1545448,23581,1545448,23581,,,,,1196817,15816,,0 +"2020-07-30","PR",214,109,3,105,,,504,0,,63,305972,0,,,303412,,40,5920,5920,220,0,10652,,,,7002,,,0,311892,220,,,,,,0,310546,0 +"2020-07-30","RI",1007,,0,,2202,2202,77,7,,13,185569,1904,,,333452,,5,18950,,150,0,,,,,27495,,360095,4899,360095,4899,,,,,204519,2054,360947,4761 +"2020-07-30","SC",1667,1600,52,67,5117,5117,1563,0,,389,603819,8675,48977,,580768,,245,87572,87117,1726,0,3430,,,,110168,32859,,0,691391,10401,52407,,,,,0,690936,10369 +"2020-07-30","SD",129,,0,,815,815,44,5,,,101660,587,,,,,,8685,,44,0,,,,,13725,7690,,0,136287,1985,,,,,110345,631,136287,1985 +"2020-07-30","TN",1033,996,13,37,4572,4572,1493,90,,,,0,,,1358551,,,102871,101728,2049,0,,,,,121118,64234,,0,1479669,24549,,,,,,0,1479669,24549 +"2020-07-30","TX",6274,,84,,,,9296,0,,3087,,0,,,,,,412107,412107,8800,0,11430,9125,,,619790,260542,,0,4325751,56368,239566,53809,,,,0,4325751,56368 +"2020-07-30","UT",300,,8,,2346,2346,238,22,610,87,486084,4524,,,589565,249,,39696,,502,0,,503,,476,44415,27261,,0,633980,7269,,1348,,1128,525902,5111,633980,7269 +"2020-07-30","VA",2141,2035,16,106,7786,7786,1357,48,,284,,0,,,,,147,88904,85546,911,0,6839,738,,,105369,,1091615,18152,1091615,18152,110617,1009,,,,0,,0 +"2020-07-30","VI",8,,0,,,,,0,,,8419,0,,,,,,385,,0,0,,,,,,296,,0,8804,0,,,,,8833,0,,0 +"2020-07-30","VT",57,57,1,,,,18,0,,,90055,704,,,,,,1408,1408,1,0,,,,,,1207,,0,117054,1215,,,,,91463,705,117054,1215 +"2020-07-30","WA",1555,1555,7,,5476,5476,530,2,,,,0,,,,,57,58298,58149,959,0,,,,,,,1081486,14588,1081486,14588,,,,,958307,13073,,0 +"2020-07-30","WI",926,919,8,7,4590,4590,341,51,893,111,867602,16211,,,,,,56079,52108,1091,0,,,,,,41319,1226990,24201,1226990,24201,,,,,919710,17270,,0 +"2020-07-30","WV",115,,3,,,,102,0,,40,,0,,,,,19,6422,6284,96,0,,,,,,4703,,0,270920,3331,14144,,,,,0,270920,3331 +"2020-07-30","WY",26,,0,,166,166,18,1,,,49955,571,,,78275,,,2686,2217,58,0,,,,,2501,2065,,0,80776,1038,,,,,52172,616,80776,1038 +"2020-07-29","AK",22,22,0,,145,145,45,2,,,,0,,,,,3,2803,,68,0,,,,,,854,,0,223664,9789,,,,,,0,223664,9789 +"2020-07-29","AL",1538,1489,47,49,9893,9893,1605,0,1109,,584493,1460,,,,595,,83782,81572,1416,0,,,,,,32510,,0,666065,2723,,,,,666065,2723,,0 +"2020-07-29","AR",434,,6,,2747,2747,508,61,,,454637,4912,,,,387,108,40968,40968,787,0,,,,,,33938,,0,495605,5699,,,,,,0,495605,5699 +"2020-07-29","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-29","AZ",3454,2431,46,152,10060,10060,2424,666,,800,733156,8159,,,,,561,168273,137710,2339,0,,,,,,,,0,1296819,17261,,,224276,,901429,10498,1296819,17261 +"2020-07-29","CA",8715,,197,,,,8439,0,,2209,,0,,,,,,475305,475305,8755,0,,,,,,,,0,7517466,99600,,,,,,0,7517466,99600 +"2020-07-29","CO",1822,1483,15,339,6398,6398,341,79,,,473876,7013,126496,,,,,45796,42626,482,0,9224,,,,,,668245,11940,668245,11940,135720,,,,516502,7490,,0 +"2020-07-29","CT",4425,3544,2,881,10712,10712,53,0,,,,0,,,767175,,,49540,47581,463,0,,,,,60989,8516,,0,830025,14393,,,,,,0,830025,14393 +"2020-07-29","DC",584,,1,,,,83,0,,17,,0,,,,,8,11999,,54,0,,,,,,9723,180049,2027,180049,2027,,,,,125267,1240,,0 +"2020-07-29","DE",581,511,1,70,,,68,0,,15,162414,2267,,,,,,14602,13606,126,0,,,,,18067,8108,244364,3096,244364,3096,,,,,177016,2393,,0 +"2020-07-29","FL",6457,6457,217,,25867,25867,8720,587,,,3075342,37020,,334221,3971204,,,444622,,9320,0,,,18780,,567610,,4331458,74521,4331458,74521,,,353026,,3531721,46580,4557000,71960 +"2020-07-29","GA",3642,,79,,17964,17964,3188,420,3301,,,0,,,,,,178323,178323,3271,0,13606,,,,163951,,,0,1540024,26141,217543,,,,,0,1540024,26141 +"2020-07-29","GU",5,,0,,,,4,0,,2,20978,535,,,,,,351,343,2,0,2,,,,,297,,0,21329,537,145,,,,,0,21320,547 +"2020-07-29","HI",26,26,0,,167,167,47,2,,,115802,1126,,,,,,1757,,46,0,,,,,1719,1205,144156,1031,144156,1031,,,,,117559,1172,145404,1613 +"2020-07-29","IA",846,,7,,,,246,0,,76,419435,4777,,36041,,,32,43277,43277,500,0,,,2728,,,31246,,0,462712,5277,,,38808,,464517,5291,,0 +"2020-07-29","ID",160,139,8,21,783,783,209,33,232,40,153820,1797,,,,,,19222,18072,528,0,,,,,,6203,,0,171892,2304,,,,,171892,2304,,0 +"2020-07-29","IL",7654,7462,16,192,,,1491,0,,355,,0,,,,,152,176366,175124,1393,0,,,,,,,,0,2608652,38187,,,,,,0,2608652,38187 +"2020-07-29","IN",2932,2733,8,199,8587,8587,837,82,1796,279,659939,6808,,,,,69,64299,,621,0,,,,,69162,,,0,963913,17840,,,,,724238,7429,963913,17840 +"2020-07-29","KS",349,,14,,1700,1700,393,56,483,83,258079,5315,,,,174,29,26870,,698,0,,,,,,,,0,284949,6013,,,,,284949,6552,,0 +"2020-07-29","KY",724,720,5,4,3281,3281,571,2,1133,112,,0,,,,,,28727,27173,601,0,,,,,,7495,,0,566787,10544,42980,222,,,,0,566787,10544 +"2020-07-29","LA",3883,3769,71,114,,,1544,0,,,1182358,17092,,,,,221,112773,112773,1735,0,,,,,,74246,,0,1295131,18827,,,,,,0,1295131,18827 +"2020-07-29","MA",8580,8360,29,220,11876,11876,390,21,,62,1040134,15200,,,,,23,116684,109096,502,0,,,,,145779,97595,,0,1558049,22042,,,94348,,1149230,15556,1558049,22042 +"2020-07-29","MD",3478,3347,20,131,12448,12448,571,59,,145,792674,9942,,88627,,,,86285,86285,761,0,,,7891,,101638,5592,,0,1154902,15747,,,96518,,878959,10703,1154902,15747 +"2020-07-29","ME",121,120,0,1,385,385,11,1,,8,,0,8332,,,,5,3866,3457,28,0,407,,,,4308,3336,,0,160179,2891,8751,,,,,0,160179,2891 +"2020-07-29","MI",6422,6172,1,250,,,670,0,,195,,0,,,1704259,,135,88974,80172,1016,0,,,,,115546,57502,,0,1819805,67930,210763,,,,,0,1819805,67930 +"2020-07-29","MN",1629,1589,9,40,5077,5077,310,49,1484,143,940144,12437,,,,,,52947,52947,666,0,,,,,,46636,993091,13103,993091,13103,,,,,,0,,0 +"2020-07-29","MO",1220,,7,,,,797,0,,,614149,6048,,56719,802399,,112,46750,46750,1927,0,,,2114,,52623,,,0,856436,9779,,,58833,,660899,7975,856436,9779 +"2020-07-29","MP",2,,0,,4,4,,0,,,11719,0,,,,,,40,40,0,0,,,,,,29,,0,11759,0,,,,,11759,0,12745,0 +"2020-07-29","MS",1563,1524,20,39,4152,4152,1211,49,,296,387500,8666,,,,,178,55804,55046,1505,0,,,,,,35071,,0,443304,10171,16140,,,,,0,442546,10124 +"2020-07-29","MT",54,,3,,211,211,59,6,,,,0,,,,,,3676,,201,0,,,,,,2212,,0,165355,3947,,,,,,0,165355,3947 +"2020-07-29","NC",1865,1865,45,,,,1291,0,,361,,0,,,,,,117850,117850,1763,0,,,,,,,,0,1512939,20426,,,,,,0,1512939,20426 +"2020-07-29","ND",106,,2,,351,351,39,8,,,144856,951,6514,,,,,6215,6215,89,0,248,,,,,5087,292614,3299,292614,3299,6762,,,,148446,1186,301031,3460 +"2020-07-29","NE",321,,4,,1606,1606,122,19,,,238876,2672,,,306284,,,25157,,258,0,,,,,30910,18702,,0,338010,5561,,,,,264313,2930,338010,5561 +"2020-07-29","NH",409,,0,,690,690,21,0,202,,149583,0,,,,,,6500,,0,0,,,,,,5688,,0,228352,2697,27084,,26524,,156083,0,228352,2697 +"2020-07-29","NJ",15697,13923,18,1774,21321,21321,761,0,,116,1861916,57907,,,,,49,182935,180766,524,0,,,,,,,,0,2044851,58431,,,,,,0,2042682,58841 +"2020-07-29","NM",632,,6,,2643,2643,158,29,,,,0,,,,,,20136,,345,0,,,,,,7817,,0,544611,7758,,,,,,0,544611,7758 +"2020-07-29","NV",780,,21,,,,1110,0,,325,411579,5629,,,,,190,45806,45806,870,0,,,,,,,625843,8756,625843,8756,,,,,456602,6882,596795,11059 +"2020-07-29","NY",25132,,6,,89995,89995,619,0,,154,,0,,,,,76,413593,,715,0,,,,,,,5746822,62276,5746822,62276,,,,,,0,,0 +"2020-07-29","OH",3422,3156,40,266,10553,10553,1100,128,2513,348,,0,,,,,179,87893,83213,1396,0,,,,,96388,62695,,0,1474611,23111,,,,,,0,1474611,23111 +"2020-07-29","OK",523,,14,,3041,3041,663,54,,228,571890,16539,,,571890,,,34623,34623,848,0,2071,,,,40163,27386,,0,606513,17387,57683,,,,,0,613202,17925 +"2020-07-29","OR",303,,14,,1537,1537,230,23,,58,370240,4762,,,579765,,31,17416,,328,0,,,,,31279,3736,,0,611044,8134,,,,,386786,5068,611044,8134 +"2020-07-29","PA",7162,,16,,,,756,0,,,1073863,14087,,,,,109,110218,107138,834,0,,,,,,82663,1521867,20898,1521867,20898,,,,,1181001,14894,,0 +"2020-07-29","PR",211,106,2,105,,,495,0,,66,305972,0,,,303412,,37,5700,5700,115,0,10361,,,,7002,,,0,311672,115,,,,,,0,310546,0 +"2020-07-29","RI",1007,,2,,2195,2195,74,13,,12,183665,1430,,,328838,,6,18800,,75,0,,,,,27348,,355196,3724,355196,3724,,,,,202465,1505,356186,3686 +"2020-07-29","SC",1615,1551,50,64,5117,5117,1596,0,,404,595144,8923,48452,,572645,,242,85846,85423,1737,0,3319,,,,107922,32859,,0,680990,10660,51771,,,,,0,680567,10626 +"2020-07-29","SD",129,,6,,810,810,46,2,,,101073,2074,,,,,,8641,,149,0,,,,,13604,7609,,0,134302,1491,,,,,109714,2223,134302,1491 +"2020-07-29","TN",1020,983,42,37,4482,4482,1417,202,,,,0,,,1336405,,,100822,99703,1778,0,,,,,118715,62129,,0,1455120,19687,,,,,,0,1455120,19687 +"2020-07-29","TX",6190,,313,,,,9595,0,,3136,,0,,,,,,403307,403307,9042,0,11227,8922,,,611266,251346,,0,4269383,54599,237895,51819,,,,0,4269383,54599 +"2020-07-29","UT",292,,6,,2324,2324,232,29,605,88,481560,4858,,,582970,244,,39194,,339,0,,487,,460,43741,26643,,0,626711,7075,,1311,,1097,520791,5316,626711,7075 +"2020-07-29","VA",2125,2020,30,105,7738,7738,1350,52,,276,,0,,,,,155,87993,84700,999,0,6729,701,,,104037,,1073463,17315,1073463,17315,109278,963,,,,0,,0 +"2020-07-29","VI",8,,1,,,,,0,,,8419,124,,,,,,385,,10,0,,,,,,296,,0,8804,134,,,,,8833,126,,0 +"2020-07-29","VT",56,56,0,,,,18,0,,,89351,550,,,,,,1407,1407,1,0,,,,,,1199,,0,115839,845,,,,,90758,551,115839,845 +"2020-07-29","WA",1548,1548,30,,5474,5474,509,77,,,,0,,,,,48,57339,57202,1001,0,,,,,,,1066898,15276,1066898,15276,,,,,945234,11930,,0 +"2020-07-29","WI",918,911,5,7,4539,4539,271,46,886,86,851391,13824,,,,,,54988,51049,924,0,,,,,,40416,1202789,21024,1202789,21024,,,,,902440,14694,,0 +"2020-07-29","WV",112,,1,,,,98,0,,40,,0,,,,,13,6326,6187,153,0,,,,,,4589,,0,267589,3593,13990,,,,,0,267589,3593 +"2020-07-29","WY",26,,0,,165,165,16,3,,,49384,1193,,,77279,,,2628,2172,39,0,,,,,2459,2022,,0,79738,1085,,,,,51556,1229,79738,1085 +"2020-07-28","AK",22,22,1,,143,143,44,5,,,,0,,,,,4,2735,,108,0,,,,,,836,,0,213875,6611,,,,,,0,213875,6611 +"2020-07-28","AL",1491,1446,0,45,9893,9893,1598,199,1094,,583033,6189,,,,584,,82366,80309,1251,0,,,,,,32510,,0,663342,7369,,,,,663342,7369,,0 +"2020-07-28","AR",428,,20,,2686,2686,501,62,,,449725,4281,,,,377,110,40181,40181,734,0,,,,,,33188,,0,489906,5015,,,,,,0,489906,5015 +"2020-07-28","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-28","AZ",3408,2431,104,152,9394,9394,2564,1643,,814,724997,10491,,,,,574,165934,137710,2107,0,,,,,,,,0,1279558,19111,,,221894,,890931,12598,1279558,19111 +"2020-07-28","CA",8518,,73,,,,8317,0,,2198,,0,,,,,,466550,466550,6000,0,,,,,,,,0,7417866,121288,,,,,,0,7417866,121288 +"2020-07-28","CO",1807,1470,8,337,6319,6319,353,48,,,466863,10998,125718,,,,,45314,42149,749,0,9159,,,,,,656305,17337,656305,17337,134877,,,,509012,11747,,0 +"2020-07-28","CT",4423,3541,5,882,10712,10712,54,0,,,,0,,,752910,,,49077,47089,94,0,,,,,60873,8516,,0,815632,13460,,,,,,0,815632,13460 +"2020-07-28","DC",583,,1,,,,106,0,,20,,0,,,,,9,11945,,87,0,,,,,,9664,178022,3874,178022,3874,,,,,124027,2351,,0 +"2020-07-28","DE",580,510,1,70,,,62,0,,14,160147,1494,,,,,,14476,13480,70,0,,,,,17964,8076,241268,3688,241268,3688,,,,,174623,1564,,0 +"2020-07-28","FL",6240,6240,191,,25280,25280,8992,590,,,3038322,39572,,334221,3912374,,,435302,,9138,0,,,18780,,555415,,4256937,76414,4256937,76414,,,353026,,3485141,48871,4485040,73756 +"2020-07-28","GA",3563,,54,,17544,17544,3157,406,3236,,,0,,,,,,175052,175052,4209,0,13511,,,,161005,,,0,1513883,34855,216727,,,,,0,1513883,34855 +"2020-07-28","GU",5,,0,,,,5,0,,2,20443,308,,,,,,349,341,3,0,2,,,,,291,,0,20792,311,145,,,,,0,20773,301 +"2020-07-28","HI",26,26,0,,165,165,39,2,,,114676,2244,,,,,,1711,,28,0,,,,,1680,1191,143125,1234,143125,1234,,,,,116387,2335,143791,891 +"2020-07-28","IA",839,,6,,,,253,0,,75,414658,2367,,35876,,,31,42777,42777,223,0,,,2719,,,30623,,0,457435,2590,,,38634,,459226,2707,,0 +"2020-07-28","ID",152,130,6,22,750,750,209,9,224,40,152023,2206,,,,,,18694,17565,517,0,,,,,,5964,,0,169588,2685,,,,,169588,2685,,0 +"2020-07-28","IL",7638,7446,30,192,,,1383,0,,329,,0,,,,,128,174973,173731,1076,0,,,,,,,,0,2570465,28331,,,,,,0,2570465,28331 +"2020-07-28","IN",2924,2725,18,199,8505,8505,907,61,1772,304,653131,8247,,,,,69,63678,,771,0,,,,,68086,,,0,946073,18320,,,,,716809,9018,946073,18320 +"2020-07-28","KS",335,,0,,1644,1644,212,0,465,58,252764,0,,,,171,24,26172,,0,0,,,,,,,,0,278936,0,,,,,278397,0,,0 +"2020-07-28","KY",719,715,10,4,3279,3279,584,3,1132,115,,0,,,,,,28126,26656,525,0,,,,,,7470,,0,556243,10185,42814,,,,,0,556243,10185 +"2020-07-28","LA",3812,3700,26,112,,,1583,0,,,1165266,15161,,,,,214,111038,111038,1121,0,,,,,,61456,,0,1276304,16282,,,,,,0,1276304,16282 +"2020-07-28","MA",8551,8331,15,220,11855,11855,364,22,,54,1024934,9703,,,,,27,116182,108740,256,0,,,,,145395,96452,,0,1536007,25590,,,93124,,1133674,9881,1536007,25590 +"2020-07-28","MD",3458,3327,11,131,12389,12389,544,50,,150,782732,12090,,,,,,85524,85524,648,0,,,,,100717,5592,,0,1139155,23944,,,,,868256,12738,1139155,23944 +"2020-07-28","ME",121,120,2,1,384,384,12,1,,7,,0,8317,,,,2,3838,3433,6,0,405,,,,4289,3319,,0,157288,1622,8734,,,,,0,157288,1622 +"2020-07-28","MI",6421,6170,16,251,,,670,0,,195,,0,,,1639924,,135,87958,79176,785,0,,,,,111951,57502,,0,1751875,27983,209655,,,,,0,1751875,27983 +"2020-07-28","MN",1620,1580,4,40,5028,5028,294,67,1474,138,927707,8784,,,,,,52281,52281,478,0,,,,,,45987,979988,9262,979988,9262,,,,,,0,,0 +"2020-07-28","MO",1213,,12,,,,797,0,,,608101,9247,,56380,794773,,112,44823,44823,1773,0,,,2087,,50511,,,0,846657,16643,,,58467,,652924,11020,846657,16643 +"2020-07-28","MP",2,,0,,4,4,,0,,,11719,0,,,,,,40,40,0,0,,,,,,29,,0,11759,0,,,,,11759,0,12745,0 +"2020-07-28","MS",1543,1504,42,39,4103,4103,1184,71,,288,378834,4194,,,,,169,54299,53588,1342,0,,,,,,35071,,0,433133,5536,16053,,,,,0,432422,5496 +"2020-07-28","MT",51,,4,,205,205,62,4,,,,0,,,,,,3475,,94,0,,,,,,2104,,0,161408,2753,,,,,,0,161408,2753 +"2020-07-28","NC",1820,1820,30,,,,1244,0,,364,,0,,,,,,116087,116087,1749,0,,,,,,,,0,1492513,18738,,,,,,0,1492513,18738 +"2020-07-28","ND",104,,1,,343,343,35,6,,,143905,1525,6478,,,,,6126,6126,151,0,246,,,,,4957,289315,4001,289315,4001,6724,,,,147260,1857,297571,4308 +"2020-07-28","NE",317,,1,,1587,1587,117,17,,,236204,1995,,,301136,,,24899,,281,0,,,,,30501,18520,,0,332449,3029,,,,,261383,2278,332449,3029 +"2020-07-28","NH",409,,0,,690,690,21,2,202,,149583,2410,,,,,,6500,,64,0,,,,,,5688,,0,225655,2964,26925,,26524,,156083,2474,225655,2964 +"2020-07-28","NJ",15679,13905,22,1774,21321,21321,718,0,,112,1804009,-20,,,,,50,182411,180295,526,0,,,,,,,,0,1986420,506,,,,,,0,1983841,0 +"2020-07-28","NM",626,,7,,2614,2614,160,24,,,,0,,,,,,19791,,289,0,,,,,,7657,,0,536853,7963,,,,,,0,536853,7963 +"2020-07-28","NV",759,,20,,,,1147,0,,319,405950,5102,,,,,191,44936,44936,1105,0,,,,,,,617087,8949,617087,8949,,,,,449720,6112,585736,10309 +"2020-07-28","NY",25126,,9,,89995,89995,648,0,,152,,0,,,,,81,412878,,534,0,,,,,,,5684546,57397,5684546,57397,,,,,,0,,0 +"2020-07-28","OH",3382,3118,38,264,10425,10425,1144,140,2488,363,,0,,,,,176,86497,81896,1320,0,,,,,95103,61056,,0,1451500,20047,,,,,,0,1451500,20047 +"2020-07-28","OK",509,,13,,2987,2987,596,115,,207,555351,19723,,,555351,,,33775,33775,1089,0,2071,,,,38785,26363,,0,589126,20812,57683,,,,,0,595277,22092 +"2020-07-28","OR",289,,0,,1514,1514,237,40,,58,365478,3761,,,572096,,27,17088,,330,0,,,,,30814,3684,,0,602910,6312,,,,,381718,15982,602910,6312 +"2020-07-28","PA",7146,,24,,,,716,0,,,1059776,17352,,,,,98,109384,106331,1120,0,,,,,,82038,1500969,25971,1500969,25971,,,,,1166107,18455,,0 +"2020-07-28","PR",209,104,8,105,,,469,0,,66,305972,0,,,303412,,37,5585,5585,169,0,10255,,,,7002,,,0,311557,169,,,,,,0,310546,0 +"2020-07-28","RI",1005,,1,,2182,2182,68,8,,10,182235,4132,,,325253,,7,18725,,210,0,,,,,27247,,351472,4037,351472,4037,,,,,200960,4342,352500,6848 +"2020-07-28","SC",1565,1505,59,60,5117,5117,1575,290,,401,586221,9737,48268,,564492,,256,84109,83720,1692,0,3235,,,,105449,32859,,0,670330,11429,51503,,,,,0,669941,11386 +"2020-07-28","SD",123,,0,,808,808,49,2,,,98999,616,,,,,,8492,,48,0,,,,,13498,7474,,0,132811,858,,,,,107491,664,132811,858 +"2020-07-28","TN",978,943,0,35,4280,4280,1420,0,,,,0,,,1318884,,,99044,97966,2555,0,,,,,116549,57239,,0,1435433,25037,,,,,,0,1435433,25037 +"2020-07-28","TX",5877,,164,,,,9593,0,,3136,,0,,,,,,394265,394265,8342,0,11227,8721,,,603167,244449,,0,4214784,59953,237895,49956,,,,0,4214784,59953 +"2020-07-28","UT",286,,5,,2295,2295,233,42,592,90,476702,4539,,,576422,240,,38855,,446,0,,471,,444,43214,25905,,0,619636,6631,,1270,,1062,515475,5027,619636,6631 +"2020-07-28","VA",2095,1991,13,104,7686,7686,1294,39,,261,,0,,,,,153,86994,83732,922,0,6687,675,,,101450,,1056148,20138,1056148,20138,108701,937,,,,0,,0 +"2020-07-28","VI",7,,0,,,,,0,,,8295,262,,,,,,375,,11,0,,,,,,292,,0,8670,273,,,,,8707,297,,0 +"2020-07-28","VT",56,56,0,,,,18,0,,,88801,895,,,,,,1406,1406,3,0,,,,,,1194,,0,114994,1210,,,,,90207,898,114994,1210 +"2020-07-28","WA",1518,1518,17,,5397,5397,478,23,,,,0,,,,,49,56338,56217,337,0,,,,,,,1051622,16103,1051622,16103,,,,,933304,13957,,0 +"2020-07-28","WI",913,906,13,7,4493,4493,246,73,880,86,837567,13662,,,,,,54064,50179,783,0,,,,,,39513,1181765,12190,1181765,12190,,,,,887746,14424,,0 +"2020-07-28","WV",111,,5,,,,94,0,,37,,0,,,,,15,6173,6033,119,0,,,,,,4481,,0,263996,4208,13894,,,,,0,263996,4208 +"2020-07-28","WY",26,,1,,162,162,15,4,,,48191,2368,,,76247,,,2589,2136,69,0,,,,,2406,1970,,0,78653,1156,,,,,50327,2582,78653,1156 +"2020-07-27","AK",21,21,1,,138,138,38,3,,,,0,,,,,3,2627,,94,0,,,,,,817,,0,207264,0,,,,,,0,207264,0 +"2020-07-27","AL",1491,1446,18,45,9694,9694,1473,537,1081,,576844,6452,,,,577,,81115,79129,1821,0,,,,,,32510,,0,655973,8230,,,,,655973,8230,,0 +"2020-07-27","AR",408,,7,,2624,2624,489,82,,,445444,6800,,,,369,110,39447,39447,824,0,,,,,,32365,,0,484891,7624,,,,,,0,484891,7624 +"2020-07-27","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-27","AZ",3304,2431,-1,152,7751,7751,2626,45,,820,714506,9417,,,,,567,163827,137710,1813,0,,,,,,,,0,1260447,7668,,,221349,,878333,11230,1260447,7668 +"2020-07-27","CA",8445,,29,,,,8820,0,,2284,,0,,,,,,460550,460550,6891,0,,,,,,,,0,7296578,128439,,,,,,0,7296578,128439 +"2020-07-27","CO",1799,1463,5,336,6271,6271,359,3,,,455865,2413,124853,,,,,44565,41400,229,0,9091,,,,,,638968,3393,638968,3393,133944,,,,497265,2639,,0 +"2020-07-27","CT",4418,3536,5,882,10712,10712,59,0,,,,0,,,739616,,,48983,46994,207,0,,,,,60713,8516,,0,802172,7263,,,,,,0,802172,7263 +"2020-07-27","DC",582,,1,,,,102,0,,20,,0,,,,,8,11858,,78,0,,,,,,9639,174148,2550,174148,2550,,,,,121676,1417,,0 +"2020-07-27","DE",579,509,0,70,,,63,0,,18,158653,2950,,,,,,14406,13410,116,0,,,,,17882,8035,237580,2967,237580,2967,,,,,173059,3066,,0 +"2020-07-27","FL",6049,6049,77,,24690,24690,9098,269,,,2998750,36102,,334221,3851809,,,426164,,8804,0,,,18780,,542920,,4180523,75332,4180523,75332,,,353026,,3436270,45137,4411284,70623 +"2020-07-27","GA",3509,,11,,17138,17138,3181,47,3172,,,0,,,,,,170843,170843,2890,0,13456,,,,156870,,,0,1479028,23968,216240,,,,,0,1479028,23968 +"2020-07-27","GU",5,,0,,,,4,0,,,20135,440,,,,,,346,338,9,0,2,,,,,291,,0,20481,449,145,,,,,0,20472,681 +"2020-07-27","HI",26,26,0,,163,163,26,2,,,112432,0,,,,,,1683,,63,0,,,,,1635,1179,141891,2541,141891,2541,,,,,114052,0,142900,2458 +"2020-07-27","IA",833,,6,,,,241,0,,78,412291,3892,,35747,,,32,42554,42554,354,0,,,2705,,,29873,,0,454845,4246,,,38491,,456519,4239,,0 +"2020-07-27","ID",146,125,0,21,741,741,204,18,222,45,149817,1420,,,,,,18177,17086,350,0,,,,,,5731,,0,166903,1771,,,,,166903,1771,,0 +"2020-07-27","IL",7608,7416,18,192,,,1417,0,,350,,0,,,,,124,173897,172655,1231,0,,,,,,,,0,2542134,30567,,,,,,0,2542134,30567 +"2020-07-27","IN",2906,2709,3,197,8444,8444,835,43,1767,291,644884,5945,,,,,66,62907,,535,0,,,,,66936,,,0,927753,3593,,,,,707791,6480,927753,3593 +"2020-07-27","KS",335,,9,,1644,1644,212,48,465,58,252764,-94,,,,171,24,26172,,1063,0,,,,,,,,0,278936,969,,,,,278397,430,,0 +"2020-07-27","KY",709,705,9,4,3276,3276,609,10,1129,131,,0,,,,,,27601,26209,522,0,,,,,,7466,,0,546058,5849,42699,,,,,0,546058,5849 +"2020-07-27","LA",3786,3674,23,112,,,1600,0,,,1150105,24415,,,,,208,109917,109917,2343,0,,,,,,61456,,0,1260022,26758,,,,,,0,1260022,26758 +"2020-07-27","MA",8536,8317,7,219,11833,11833,350,5,,57,1015231,10109,,,,,28,115926,108562,289,0,,,,,144998,96452,,0,1510417,22023,,,92664,,1123793,10291,1510417,22023 +"2020-07-27","MD",3447,3315,7,132,12339,12339,536,56,,145,770642,15818,,,,,,84876,84876,1128,0,,,,,99680,5434,,0,1115211,23395,,,,,855518,16946,1115211,23395 +"2020-07-27","ME",119,118,0,1,383,383,13,2,,8,,0,8304,,,,3,3832,3422,18,0,405,,,,4278,3292,,0,155666,2063,8721,,,,,0,155666,2063 +"2020-07-27","MI",6405,6154,5,251,,,670,0,,195,,0,,,1613316,,113,87173,78507,512,0,,,,,110576,57502,,0,1723892,30180,208729,,,,,0,1723892,30180 +"2020-07-27","MN",1616,1576,2,40,4961,4961,257,41,1458,126,918923,12702,,,,,,51803,51803,650,0,,,,,,45198,970726,13352,970726,13352,,,,,,0,,0 +"2020-07-27","MO",1201,,4,,,,1057,0,,,598854,13830,,56042,780858,,159,43050,43050,1123,0,,,2027,,47812,,,0,830014,23261,,,58069,,641904,14953,830014,23261 +"2020-07-27","MP",2,,0,,4,4,,0,,,11719,419,,,,,,40,40,0,0,,,,,,29,,0,11759,419,,,,,11759,421,12745,0 +"2020-07-27","MS",1501,1464,6,37,4032,4032,1179,50,,304,374640,3851,,,,,166,52957,52286,653,0,,,,,,35071,,0,427597,4504,15922,,,,,0,426926,5693 +"2020-07-27","MT",47,,1,,201,201,61,2,,,,0,,,,,,3381,,39,0,,,,,,2090,,0,158655,6340,,,,,,0,158655,6340 +"2020-07-27","NC",1790,1790,5,,,,1169,0,,352,,0,,,,,,114338,114338,1625,0,,,,,,,,0,1473775,25642,,,,,,0,1473775,25642 +"2020-07-27","ND",103,,0,,337,337,43,4,,,142380,1777,6411,,,,,5975,5975,111,0,243,,,,,4829,285314,4241,285314,4241,6654,,,,145403,1843,293263,4405 +"2020-07-27","NE",316,,0,,1570,1570,109,3,,,234209,3140,,,298461,,,24618,,223,0,,,,,30148,18097,,0,329420,3841,,,,,259105,3365,329420,3841 +"2020-07-27","NH",409,,0,,688,688,20,0,200,,147173,0,,,,,,6436,,0,0,,,,,,5438,,0,222691,2375,26858,,26428,,153609,0,222691,2375 +"2020-07-27","NJ",15657,13884,18,1773,21321,21321,695,7,,128,1804029,30103,,,,,54,181885,179812,477,0,,,,,,,,0,1985914,30580,,,,,,0,1983841,30552 +"2020-07-27","NM",619,,5,,2590,2590,159,30,,,,0,,,,,,19502,,460,0,,,,,,7459,,0,528890,8172,,,,,,0,528890,8172 +"2020-07-27","NV",739,,5,,,,1112,0,,310,400848,4760,,,,,184,43831,43831,997,0,,,,,,,608138,2544,608138,2544,,,,,443608,5800,575427,9051 +"2020-07-27","NY",25117,,11,,89995,89995,642,0,,149,,0,,,,,84,412344,,608,0,,,,,,,5627149,57270,5627149,57270,,,,,,0,,0 +"2020-07-27","OH",3344,3082,37,262,10285,10285,1110,86,2466,356,,0,,,,,164,85177,80628,1104,0,,,,,94041,59413,,0,1431453,20484,,,,,,0,1431453,20484 +"2020-07-27","OK",496,,0,,2872,2872,625,37,,225,535628,0,,,535628,,,32686,32686,1401,0,2071,,,,36489,25252,,0,568314,1401,57683,,,,,0,573185,0 +"2020-07-27","OR",289,,3,,1474,1474,233,0,,58,361717,4199,,,566141,,30,16758,,266,0,,,,,30457,3541,,0,596598,7227,,,,,365736,0,596598,7227 +"2020-07-27","PA",7122,,4,,,,704,0,,,1042424,13648,,,,,98,108264,105228,839,0,,,,,,81198,1474998,19809,1474998,19809,,,,,1147652,14475,,0 +"2020-07-27","PR",201,99,0,102,,,509,0,,66,305972,0,,,303412,,37,5416,5416,180,0,10015,,,,7002,,,0,311388,180,,,,,,0,310546,0 +"2020-07-27","RI",1004,,2,,2174,2174,71,28,,8,178103,6299,,,318691,,6,18515,,291,0,,,,,26961,,347435,3001,347435,3001,,,,,196618,6590,345652,16096 +"2020-07-27","SC",1506,1452,15,54,4827,4827,1668,0,,,576484,9870,48187,,555317,,263,82417,82071,1218,0,3214,,,,103238,29378,,0,658901,11088,51401,,,,,0,658555,11085 +"2020-07-27","SD",123,,0,,806,806,47,5,,,98383,-148,,,,,,8444,,49,0,,,,,13444,7404,,0,131953,1006,,,,,106827,-99,131953,1006 +"2020-07-27","TN",978,943,11,35,4280,4280,1328,36,,,,0,,,1296839,,,96489,95433,2553,0,,,,,113557,57239,,0,1410396,28537,,,,,,0,1410396,28537 +"2020-07-27","TX",5713,,675,,,,10893,0,,3281,,0,,,,,,385923,385923,4267,0,10921,8474,,,593896,229107,,0,4154831,15813,235797,47788,,,,0,4154831,15813 +"2020-07-27","UT",281,,7,,2253,2253,225,19,580,83,472163,3717,,,570357,239,,38409,,436,0,,454,,427,42648,25321,,0,613005,5629,,1207,,1006,510448,4117,613005,5629 +"2020-07-27","VA",2082,1978,4,104,7647,7647,1200,54,,260,,0,,,,,140,86072,82871,1505,0,6668,638,,,101450,,1036010,10944,1036010,10944,108500,894,,,,0,,0 +"2020-07-27","VI",7,,0,,,,,0,,,8033,42,,,,,,364,,3,0,,,,,,250,,0,8397,45,,,,,8410,38,,0 +"2020-07-27","VT",56,56,0,,,,13,0,,,87906,830,,,,,,1403,1403,2,0,,,,,,1190,,0,113784,1143,,,,,89309,832,113784,1143 +"2020-07-27","WA",1501,1501,7,,5374,5374,481,33,,,,0,,,,,42,56001,55882,475,0,,,,,,,1035519,17296,1035519,17296,,,,,919347,15673,,0 +"2020-07-27","WI",900,893,1,7,4420,4420,250,26,872,85,823905,6356,,,,,,53281,49417,601,0,,,,,,38633,1169575,14956,1169575,14956,,,,,873322,6946,,0 +"2020-07-27","WV",106,,3,,,,85,0,,37,,0,,,,,10,6054,5913,94,0,,,,,,4332,,0,259788,3825,13825,,,,,0,259788,3825 +"2020-07-27","WY",25,,0,,158,158,17,0,,,45823,0,,,75120,,,2520,2072,45,0,,,,,2377,1915,,0,77497,2224,,,,,47745,0,77497,2224 +"2020-07-26","AK",20,20,0,,135,135,43,3,,,,0,,,,,4,2533,,185,0,,,,,,817,,0,207264,2198,,,,,,0,207264,2198 +"2020-07-26","AL",1473,1428,17,45,9157,9157,1512,0,1076,,570392,6911,,,,573,,79294,77351,1164,0,,,,,,32510,,0,647743,7948,,,,,647743,7948,,0 +"2020-07-26","AR",401,,7,,2542,2542,479,181,,,438644,14429,,,,358,105,38623,38623,1374,0,,,,,,31622,,0,477267,15803,,,,,,0,477267,15803 +"2020-07-26","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-26","AZ",3305,2431,19,152,7706,7706,2650,79,,837,705089,7521,,,,,581,162014,137710,1973,0,,,,,,,,0,1252779,11726,,,220444,,867103,9494,1252779,11726 +"2020-07-26","CA",8416,,79,,,,8820,0,,2284,,0,,,,,,453659,453659,8259,0,,,,,,,,0,7168139,120784,,,,,,0,7168139,120784 +"2020-07-26","CO",1794,1458,0,336,6268,6268,365,7,,,453452,6845,124565,,,,,44336,41174,547,0,9075,,,,,,635575,11224,635575,11224,133640,,,,494626,7391,,0 +"2020-07-26","CT",4413,3531,0,882,10712,10712,71,0,,,,0,,,732393,,,48776,46806,0,0,,,,,60678,8516,,0,794909,5405,,,,,,0,794909,5405 +"2020-07-26","DC",581,,0,,,,85,0,,22,,0,,,,,9,11780,,63,0,,,,,,9607,171598,2589,171598,2589,,,,,120259,1246,,0 +"2020-07-26","DE",579,509,0,70,,,57,0,,9,155703,2956,,,,,,14290,13294,115,0,,,,,17788,7996,234613,2579,234613,2579,,,,,169993,3071,,0 +"2020-07-26","FL",5972,5972,78,,24421,24421,8951,335,,,2962648,40782,,334221,3793442,,,417360,,9246,0,,,18780,,531369,,4105191,81480,4105191,81480,,,353026,,3391133,50204,4340661,77484 +"2020-07-26","GA",3498,,3,,17091,17091,3079,62,3168,,,0,,,,,,167953,167953,2765,0,13147,,,,153582,,,0,1455060,23372,213487,,,,,0,1455060,23372 +"2020-07-26","GU",5,,0,,,,1,0,,,19695,0,,,,,,337,329,0,0,2,,,,,244,,0,20032,0,145,,,,,0,19791,0 +"2020-07-26","HI",26,26,0,,161,161,29,5,,,112432,1191,,,,,,1620,,71,0,,,,,1572,1167,139350,2247,139350,2247,,,,,114052,1262,140442,2088 +"2020-07-26","IA",827,,1,,,,226,0,,77,408399,3807,,35699,,,29,42200,42200,529,0,,,2700,,,29625,,0,450599,4336,,,38438,,452280,4357,,0 +"2020-07-26","ID",146,125,2,21,723,723,204,14,217,45,148397,2221,,,,,,17827,16735,563,0,,,,,,5483,,0,165132,2748,,,,,165132,2748,,0 +"2020-07-26","IL",7590,7398,1,192,,,1394,0,,345,,0,,,,,119,172666,171424,1541,0,,,,,,,,0,2511567,40844,,,,,,0,2511567,40844 +"2020-07-26","IN",2903,2706,8,197,8401,8401,834,221,1758,282,638939,10185,,,,,62,62372,,852,0,,,,,66662,,,0,924160,6791,,,,,701311,11037,924160,6791 +"2020-07-26","KS",326,,0,,1596,1596,315,0,459,98,252858,0,,,,166,24,25109,,0,0,,,,,,,,0,277967,0,,,,,277967,0,,0 +"2020-07-26","KY",700,696,4,4,3266,3266,595,0,1126,132,,0,,,,,,27079,25699,315,0,,,,,,7421,,0,540209,0,42175,,,,,0,540209,0 +"2020-07-26","LA",3763,3651,48,112,,,1557,0,,,1125690,29698,,,,,184,107574,107574,3840,0,,,,,,61456,,0,1233264,33538,,,,,,0,1233264,33538 +"2020-07-26","MA",8529,8310,19,219,11828,11828,364,15,,56,1005122,9507,,,,,30,115637,108380,369,0,,,,,144566,96452,,0,1488394,7350,,,92459,,1113502,9780,1488394,7350 +"2020-07-26","MD",3440,3309,7,131,12283,12283,540,95,,153,754824,12552,,,,,,83748,83748,694,0,,,,,98314,5434,,0,1091816,22041,,,,,838572,13246,1091816,22041 +"2020-07-26","ME",119,118,0,1,381,381,14,2,,10,,0,8279,,,,3,3814,3408,24,0,404,,,,4260,3284,,0,153603,1899,8695,,,,,0,153603,1899 +"2020-07-26","MI",6400,6149,0,251,,,680,0,,210,,0,,,1584083,,113,86661,78019,1589,0,,,,,109629,57502,,0,1693712,56695,207540,,,,,0,1693712,56695 +"2020-07-26","MN",1614,1574,3,40,4920,4920,273,31,1448,115,906221,15816,,,,,,51153,51153,862,0,,,,,,44431,957374,16678,957374,16678,,,,,,0,,0 +"2020-07-26","MO",1197,,15,,,,1057,0,,,585024,6012,,55456,757625,,159,41927,41927,1218,0,,,2027,,47784,,,0,806753,10787,,,57483,,626951,7230,806753,10787 +"2020-07-26","MP",2,,0,,4,4,,0,,,11300,0,,,,,,40,40,1,0,,,,,,29,,0,11340,1,,,,,11338,0,12745,0 +"2020-07-26","MS",1495,1458,15,37,3982,3982,1172,0,,295,370789,0,,,,,159,52304,51639,1207,0,,,,,,30315,,0,423093,1207,15740,,,,,0,421233,0 +"2020-07-26","MT",46,,0,,199,199,62,4,,,,0,,,,,,3342,,82,0,,,,,,2079,,0,152315,1300,,,,,,0,152315,1300 +"2020-07-26","NC",1785,1785,7,,,,1170,0,,350,,0,,,,,,112713,112713,1621,0,,,,,,,,0,1448133,23879,,,,,,0,1448133,23879 +"2020-07-26","ND",103,,0,,333,333,42,5,,,140603,2079,6402,,,,,5864,5864,140,0,243,,,,,4752,281073,4524,281073,4524,6645,,,,143560,2190,288858,4725 +"2020-07-26","NE",316,,0,,1567,1567,103,19,,,231069,2638,,,294864,,,24395,,221,0,,,,,29911,18097,,0,325579,3583,,,,,255740,2859,325579,3583 +"2020-07-26","NH",409,,0,,688,688,20,2,200,,147173,1298,,,,,,6436,,21,0,,,,,,5438,,0,220316,2134,26818,,26428,,153609,1319,220316,2134 +"2020-07-26","NJ",15639,13867,12,1772,21314,21314,725,0,,126,1773926,64627,,,,,54,181408,179363,539,0,,,,,,,,0,1955334,65166,,,,,,0,1953289,65645 +"2020-07-26","NM",614,,7,,2560,2560,144,18,,,,0,,,,,,19042,,254,0,,,,,,7349,,0,520718,8293,,,,,,0,520718,8293 +"2020-07-26","NV",734,,2,,,,1147,0,,314,396088,7383,,,,,180,42834,42834,1018,0,,,,,,,605594,5465,605594,5465,,,,,437808,8761,566376,13895 +"2020-07-26","NY",25106,,3,,89995,89995,637,0,,155,,0,,,,,90,411736,,536,0,,,,,,,5569879,53568,5569879,53568,,,,,,0,,0 +"2020-07-26","OH",3307,3049,10,258,10199,10199,1075,54,2444,357,,0,,,,,177,84073,79573,889,0,,,,,92790,58465,,0,1410969,25990,,,,,,0,1410969,25990 +"2020-07-26","OK",496,,0,,2835,2835,625,67,,225,535628,0,,,535628,,,31285,31285,1204,0,2071,,,,36489,24698,,0,566913,1204,57683,,,,,0,573185,0 +"2020-07-26","OR",286,,4,,1474,1474,233,0,,58,357518,7055,,,559356,,30,16492,,388,0,,,,,30015,3541,,0,589371,12063,,,,,365736,0,589371,12063 +"2020-07-26","PA",7118,,4,,,,707,0,,,1028776,12071,,,,,104,107425,104401,800,0,,,,,,80568,1455189,20793,1455189,20793,,,,,1133177,12840,,0 +"2020-07-26","PR",201,99,0,102,,,496,0,,61,305972,0,,,303412,,34,5236,5236,194,0,9907,,,,7002,,,0,311208,194,,,,,,0,310546,0 +"2020-07-26","RI",1002,,0,,2146,2146,66,0,,6,171804,0,,,302963,,5,18224,,0,0,,,,,26593,,344434,4371,344434,4371,,,,,190028,0,329556,0 +"2020-07-26","SC",1491,1436,26,55,4827,4827,1668,0,,,566614,8132,48039,,545900,,263,81199,80856,1191,0,3183,,,,101570,29378,,0,647813,9323,51222,,,,,0,647470,9314 +"2020-07-26","SD",123,,1,,801,801,48,3,,,98531,923,,,,,,8395,,90,0,,,,,13373,7364,,0,130947,2015,,,,,106926,1013,130947,2015 +"2020-07-26","TN",967,933,3,34,4244,4244,1313,48,,,,0,,,1271424,,,93936,92943,3140,0,,,,,110435,54730,,0,1381859,50431,,,,,,0,1381859,50431 +"2020-07-26","TX",5038,,153,,,,10893,0,,3281,,0,,,,,,381656,381656,5810,0,10751,8384,,,591218,229107,,0,4139018,22614,234534,47065,,,,0,4139018,22614 +"2020-07-26","UT",274,,0,,2234,2234,251,21,577,83,468446,3511,,,565198,239,,37973,,350,0,,448,,421,42178,24798,,0,607376,4671,,1195,,997,506331,3813,607376,4671 +"2020-07-26","VA",2078,1975,3,103,7593,7593,1174,23,,268,,0,,,,,143,84567,81393,958,0,6634,613,,,100785,,1025066,17752,1025066,17752,108072,868,,,,0,,0 +"2020-07-26","VI",7,,0,,,,,0,,,7991,90,,,,,,361,,9,0,,,,,,238,,0,8352,99,,,,,8372,99,,0 +"2020-07-26","VT",56,56,0,,,,10,0,,,87076,886,,,,,,1401,1401,4,0,,,,,,1186,,0,112641,1390,,,,,88477,890,112641,1390 +"2020-07-26","WA",1494,1494,-1,,5341,5341,494,40,,,,0,,,,,51,55526,55408,810,0,,,,,,,1018223,4944,1018223,4944,,,,,903674,19692,,0 +"2020-07-26","WI",899,892,1,7,4394,4394,165,26,870,64,817549,9021,,,,,,52680,48827,965,0,,,,,,37971,1154619,16452,1154619,16452,,,,,866376,9978,,0 +"2020-07-26","WV",103,,0,,,,82,0,,35,,0,,,,,11,5960,5825,139,0,,,,,,4168,,0,255963,4432,13751,,,,,0,255963,4432 +"2020-07-26","WY",25,,0,,158,158,14,0,,,45823,0,,,72982,,,2475,2029,29,0,,,,,2291,1883,,0,75273,259,,,,,47745,0,75273,259 +"2020-07-25","AK",20,20,1,,132,132,38,6,,,,0,,,,,2,2348,,88,0,,,,,,815,,0,205066,4494,,,,,,0,205066,4494 +"2020-07-25","AL",1456,1413,18,43,9157,9157,1499,0,1069,,563481,10502,,,,567,,78130,76314,2125,0,,,,,,32510,,0,639795,12451,,,,,639795,12451,,0 +"2020-07-25","AR",394,,0,,2361,2361,497,0,,,424215,0,,,,329,109,37249,37249,0,0,,,,,,29827,,0,461464,0,,,,,,0,461464,0 +"2020-07-25","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-25","AZ",3286,2431,144,152,7627,7627,2758,166,,842,697568,17052,,,,,594,160041,137710,3740,0,,,,,,,,0,1241053,16169,,,218559,,857609,20792,1241053,16169 +"2020-07-25","CA",8337,,151,,,,8820,0,,2284,,0,,,,,,445400,445400,10066,0,,,,,,,,0,7047355,131479,,,,,,0,7047355,131479 +"2020-07-25","CO",1794,1458,4,336,6261,6261,338,34,,,446607,9843,123881,,,,,43789,40628,809,0,9035,,,,,,624351,16281,624351,16281,132916,,,,487235,10649,,0 +"2020-07-25","CT",4413,3531,0,882,10712,10712,71,0,,,,0,,,727054,,,48776,46806,0,0,,,,,60614,8516,,0,789504,12220,,,,,,0,789504,12220 +"2020-07-25","DC",581,,0,,,,97,0,,28,,0,,,,,9,11717,,68,0,,,,,,9603,169009,3749,169009,3749,,,,,119013,2198,,0 +"2020-07-25","DE",579,509,1,70,,,55,0,,11,152747,2623,,,,,,14175,13179,-27,0,,,,,17693,7961,232034,3115,232034,3115,,,,,166922,2596,,0 +"2020-07-25","FL",5894,5894,126,,24086,24086,9035,511,,,2921866,47542,,334221,3728507,,,408114,,12045,0,,,18780,,519405,,4023711,102503,4023711,102503,,,353026,,3340929,59842,4263177,96533 +"2020-07-25","GA",3495,,53,,17029,17029,3094,277,3158,,,0,,,,,,165188,165188,3787,0,12875,,,,150794,,,0,1431688,30895,211405,,,,,0,1431688,30895 +"2020-07-25","GU",5,,0,,,,1,0,,,19695,563,,,,,,337,329,0,0,2,,,,,244,,0,20032,563,145,,,,,0,19791,0 +"2020-07-25","HI",26,26,0,,156,156,29,1,,,111241,1440,,,,,,1549,,59,0,,,,,1502,1148,137103,1951,137103,1951,,,,,112790,1499,138354,2346 +"2020-07-25","IA",826,,3,,,,220,0,,72,404592,3990,,35600,,,28,41671,41671,400,0,,,2693,,,29477,,0,446263,4390,,,38332,,447923,4424,,0 +"2020-07-25","ID",144,123,6,21,709,709,204,12,210,45,146176,2719,,,,,,17264,16208,528,0,,,,,,5251,,0,162384,3221,,,,,162384,3221,,0 +"2020-07-25","IL",7589,7397,12,192,,,1438,0,,341,,0,,,,,110,171125,169883,1426,0,,,,,,,,0,2470723,38200,,,,,,0,2470723,38200 +"2020-07-25","IN",2895,2698,11,197,8180,8180,824,52,1736,281,628754,10603,,,,,63,61520,,922,0,,,,,66239,,,0,917369,17350,,,,,690274,11525,917369,17350 +"2020-07-25","KS",326,,0,,1596,1596,315,0,459,98,252858,0,,,,166,24,25109,,0,0,,,,,,,,0,277967,0,,,,,277967,0,,0 +"2020-07-25","KY",696,692,5,4,3266,3266,595,18,1126,132,,0,,,,,,26764,25390,833,0,,,,,,7421,,0,540209,8049,42175,,,,,0,540209,8049 +"2020-07-25","LA",3715,3603,0,112,,,1600,0,,,1095992,0,,,,,197,103734,103734,0,0,,,,,,61456,,0,1199726,0,,,,,,0,1199726,0 +"2020-07-25","MA",8510,8291,12,219,11813,11813,371,28,,50,995615,11120,,,,,27,115268,108107,283,0,,,,,144440,96452,,0,1481044,11377,,,91756,,1103722,11330,1481044,11377 +"2020-07-25","MD",3433,3304,11,129,12188,12188,545,69,,157,742272,19688,,,,,,83054,83054,1288,0,,,,,97488,5434,,0,1069775,34874,,,,,825326,20976,1069775,34874 +"2020-07-25","ME",119,118,1,1,379,379,11,1,,8,,0,8249,,,,2,3790,3387,33,0,401,,,,4233,3281,,0,151704,2665,8660,,,,,0,151704,2665 +"2020-07-25","MI",6400,6151,0,249,,,751,0,,215,,0,,,1529574,,113,85072,76541,0,0,,,,,107443,55162,,0,1637017,0,204810,,,,,0,1637017,0 +"2020-07-25","MN",1611,1571,5,40,4889,4889,287,37,1440,115,890405,17017,,,,,,50291,50291,803,0,,,,,,43625,940696,17820,940696,17820,,,,,,0,,0 +"2020-07-25","MO",1182,,4,,,,1057,0,,,579012,5749,,55158,748933,,159,40709,40709,1357,0,,,1994,,45726,,,0,795966,11196,,,57152,,619721,7106,795966,11196 +"2020-07-25","MP",2,,0,,4,4,,0,,,11300,0,,,,,,39,39,1,0,,,,,,29,,0,11339,1,,,,,11338,0,12745,0 +"2020-07-25","MS",1480,1443,17,37,3982,3982,1172,59,,295,370789,8972,,,,,159,51097,50444,1434,0,,,,,,30315,,0,421886,10406,15740,,,,,0,421233,10366 +"2020-07-25","MT",46,,0,,195,195,59,4,,,,0,,,,,,3260,,221,0,,,,,,1977,,0,151015,1815,,,,,,0,151015,1815 +"2020-07-25","NC",1778,1778,32,,,,1168,0,,362,,0,,,,,,111092,111092,2097,0,,,,,,,,0,1424254,22113,,,,,,0,1424254,22113 +"2020-07-25","ND",103,,0,,328,328,39,3,,,138524,1430,6394,,,,,5724,5724,121,0,243,,,,,4671,276549,4011,276549,4011,6637,,,,141370,1484,284133,4180 +"2020-07-25","NE",316,,0,,1548,1548,122,0,,,228431,3175,,,291539,,,24174,,356,0,,,,,29657,17999,,0,321996,5844,,,,,252881,3537,321996,5844 +"2020-07-25","NH",409,,4,,686,686,27,5,200,,145875,2401,,,,,,6415,,97,0,,,,,,5438,,0,218182,3047,26657,,26256,,152290,2498,218182,3047 +"2020-07-25","NJ",15627,13856,11,1771,21314,21314,831,130,,143,1709299,0,,,,,56,180869,178858,554,0,,,,,,,,0,1890168,554,,,,,,0,1887644,0 +"2020-07-25","NM",607,,6,,2542,2542,148,17,,,,0,,,,,,18788,,313,0,,,,,,7268,,0,512425,7248,,,,,,0,512425,7248 +"2020-07-25","NV",732,,10,,,,1147,0,,314,388705,7719,,,,,180,41816,41816,931,0,,,,,,,600129,10306,600129,10306,,,,,429047,9237,552481,14761 +"2020-07-25","NY",25103,,13,,89995,89995,646,0,,149,,0,,,,,94,411200,,750,0,,,,,,,5516311,71466,5516311,71466,,,,,,0,,0 +"2020-07-25","OH",3297,3039,0,258,10145,10145,1054,73,2437,356,,0,,,,,167,83184,78735,1438,0,,,,,91223,57731,,0,1384979,27984,,,,,,0,1384979,27984 +"2020-07-25","OK",496,,12,,2768,2768,625,81,,225,535628,41702,,,535628,,,30081,30081,965,0,2071,,,,36489,24053,,0,565709,42667,57683,,,,,0,573185,45290 +"2020-07-25","OR",282,,9,,1474,1474,233,9,,58,350463,7685,,,548033,,30,16104,,391,0,,,,,29275,3541,,0,577308,10461,,,,,365736,8058,577308,10461 +"2020-07-25","PA",7114,,13,,,,709,0,,,1016705,17328,,,,,102,106625,103632,1054,0,,,,,,79968,1434396,26981,1434396,26981,,,,,1120337,18358,,0 +"2020-07-25","PR",201,99,10,102,,,496,0,,57,305972,0,,,303412,,35,5042,5042,248,0,9498,,,,7002,,,0,311014,248,,,,,,0,310546,0 +"2020-07-25","RI",1002,,0,,2146,2146,66,0,,6,171804,0,,,302963,,5,18224,,0,0,,,,,26593,,340063,5825,340063,5825,,,,,190028,0,329556,0 +"2020-07-25","SC",1465,1412,80,53,4827,4827,1668,0,,,558482,7717,47636,,538066,,263,80008,79674,1401,0,3105,,,,100090,29378,,0,638490,9118,50741,,,,,0,638156,9093 +"2020-07-25","SD",122,,0,,798,798,46,2,,,97608,2318,,,,,,8305,,105,0,,,,,13269,7307,,0,128932,2636,,,,,105913,2423,128932,2636 +"2020-07-25","TN",964,930,26,34,4196,4196,1414,76,,,,0,,,1226772,,,90796,89850,1718,0,,,,,104656,53808,,0,1331428,9721,,,,,,0,1331428,9721 +"2020-07-25","TX",4885,,168,,,,10893,0,,3281,,0,,,,,,375846,375846,6020,0,10595,8286,,,587592,221510,,0,4116404,61099,233410,46285,,,,0,4116404,61099 +"2020-07-25","UT",274,,1,,2213,2213,232,25,576,79,464935,5535,,,560860,238,,37623,,661,0,,438,,412,41845,24390,,0,602705,8093,,1130,,943,502518,6119,602705,8093 +"2020-07-25","VA",2075,1972,8,103,7570,7570,1201,55,,266,,0,,,,,138,83609,80480,1245,0,6550,605,,,99636,,1007314,20126,1007314,20126,107085,859,,,,0,,0 +"2020-07-25","VI",7,,0,,,,,0,,,7901,401,,,,,,352,,16,0,,,,,,236,,0,8253,417,,,,,8273,383,,0 +"2020-07-25","VT",56,56,0,,,,13,0,,,86190,1013,,,,,,1397,1397,13,0,,,,,,1182,,0,111251,1507,,,,,87587,1026,111251,1507 +"2020-07-25","WA",1495,1495,13,,5301,5301,520,25,,,,0,,,,,52,54716,54608,907,0,,,,,,,1013279,9569,1013279,9569,,,,,883982,13219,,0 +"2020-07-25","WI",898,891,13,7,4368,4368,209,41,868,75,808528,13248,,,,,,51715,47870,988,0,,,,,,37287,1138167,19979,1138167,19979,,,,,856398,14201,,0 +"2020-07-25","WV",103,,0,,,,80,0,,35,,0,,,,,11,5821,5687,126,0,,,,,,4115,,0,251531,3950,13604,,,,,0,251531,3950 +"2020-07-25","WY",25,,0,,158,158,14,3,,,45823,0,,,72737,,,2446,2008,41,0,,,,,2277,1866,,0,75014,185,,,,,47745,0,75014,185 +"2020-07-24","AK",19,19,0,,126,126,37,2,,,,0,,,,,1,2260,,57,0,,,,,,800,,0,200572,11063,,,,,,0,200572,11063 +"2020-07-24","AL",1438,1395,41,43,9157,9157,1536,162,1058,,552979,7664,,,,565,,76005,74365,1793,0,,,,,,32510,,0,627344,9333,,,,,627344,9333,,0 +"2020-07-24","AR",394,,8,,2361,2361,497,0,,,424215,13994,,,,329,109,37249,37249,990,0,,,,,,29827,,0,461464,15997,,,,,,0,461464,15997 +"2020-07-24","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-24","AZ",3142,2431,79,152,7461,7461,2844,225,,837,680516,10747,,,,,575,156301,137710,3357,0,,,,,,,,0,1224884,16189,,,217015,,836817,14104,1224884,16189 +"2020-07-24","CA",8186,,159,,,,8820,0,,2284,,0,,,,,,435334,435334,9718,0,,,,,,,,0,6915876,137572,,,,,,0,6915876,137572 +"2020-07-24","CO",1790,1454,4,336,6227,6227,357,78,,,436764,8201,122545,,,,,42980,39822,666,0,8979,,,,,,608070,13339,608070,13339,131524,,,,476586,8860,,0 +"2020-07-24","CT",4413,3531,3,882,10712,10712,71,0,,,,0,,,714994,,,48776,46806,544,0,,,,,60463,8516,,0,777284,15484,,,,,,0,777284,15484 +"2020-07-24","DC",581,,0,,,,97,0,,21,,0,,,,,9,11649,,78,0,,,,,,9582,165260,3239,165260,3239,,,,,116815,1462,,0 +"2020-07-24","DE",578,508,49,70,,,55,0,,9,150124,1697,,,,,,14202,13205,278,0,,,,,17570,7936,228919,2854,228919,2854,,,,,164326,1975,,0 +"2020-07-24","FL",5768,5768,136,,23575,23575,9200,584,,,2874324,53250,,311824,3649517,,,396069,,12320,0,,,14627,,502625,,3921208,90669,3921208,90669,,,326476,,3281087,65902,4166644,91588 +"2020-07-24","GA",3442,,82,,16752,16752,3135,399,3119,,,0,,,,,,161401,161401,4813,0,12547,,,,147362,,,0,1400793,46886,208597,,,,,0,1400793,46886 +"2020-07-24","GU",5,,0,,,,0,0,,,19132,0,,,,,,337,329,5,0,2,,,,,244,,0,19469,5,145,,,,,0,19791,335 +"2020-07-24","HI",26,26,1,,155,155,39,1,,,109801,2423,,,,,,1490,,55,0,,,,,1445,1125,135152,2412,135152,2412,,,,,111291,2478,136008,3647 +"2020-07-24","IA",823,,5,,,,230,0,,72,400602,4950,,35425,,,27,41271,41271,637,0,,,2673,,,29216,,0,441873,5587,,,38137,,443499,5651,,0 +"2020-07-24","ID",138,117,3,21,697,697,204,23,207,46,143457,2953,,,,,,16736,15706,414,0,,,,,,5008,,0,159163,3338,,,,,159163,3338,,0 +"2020-07-24","IL",7577,7385,17,192,,,1471,0,,325,,0,,,,,115,169699,168457,1599,0,,,,,,,,0,2432523,44330,,,,,,0,2432523,44330 +"2020-07-24","IN",2884,2687,4,197,8128,8128,850,62,1725,313,618151,11470,,,,,69,60598,,996,0,,,,,65223,,,0,900019,16580,,,,,678749,12466,900019,16580 +"2020-07-24","KS",326,,18,,1596,1596,,51,459,98,252858,8276,,,,166,24,25109,,1005,0,,,,,,,,0,277967,9281,,,,,277967,9281,,0 +"2020-07-24","KY",691,687,7,4,3248,3248,618,327,1125,130,,0,,,,,,25931,24615,784,0,,,,,,7396,,0,532160,8630,41959,,,,,0,532160,8630 +"2020-07-24","LA",3715,3603,29,112,,,1600,0,,,1095992,22774,,,,,197,103734,103734,2084,0,,,,,,61456,,0,1199726,24858,,,,,,0,1199726,24858 +"2020-07-24","MA",8498,8297,14,219,11785,11785,397,15,,49,984495,12890,,,,,29,114985,107897,338,0,,,,,144243,96452,,0,1469667,17274,,,89569,,1092392,13104,1469667,17274 +"2020-07-24","MD",3422,3293,13,129,12119,12119,533,82,,143,722584,14379,,,,,,81766,81766,930,0,,,,,96121,5434,,0,1034901,24220,,,,,804350,15309,1034901,24220 +"2020-07-24","ME",118,117,0,1,378,378,12,0,,9,,0,8213,,,,3,3757,3357,20,0,395,,,,4201,3259,,0,149039,2885,8618,,,,,0,149039,2885 +"2020-07-24","MI",6400,6151,5,249,,,751,0,,215,,0,,,1529574,,113,85072,76541,641,0,,,,,107443,55162,,0,1637017,28357,204810,,,,,0,1637017,28357 +"2020-07-24","MN",1606,1566,5,40,4852,4852,278,34,1437,108,873388,16794,,,,,,49488,49488,767,0,,,,,,42882,922876,17561,922876,17561,,,,,,0,,0 +"2020-07-24","MO",1178,,-1,,,,1057,0,,,573263,7679,,54849,739825,,159,39352,39352,1652,0,,,1935,,43687,,,0,784770,15154,,,56784,,612615,9331,784770,15154 +"2020-07-24","MP",2,,0,,4,4,,0,,,11300,0,,,,,,38,38,0,0,,,,,,29,,0,11338,0,,,,,11338,0,12745,0 +"2020-07-24","MS",1463,1428,27,35,3923,3923,1216,45,,279,361817,5858,,,,,163,49663,49050,1610,0,,,,,,30315,,0,411480,7468,15453,,,,,0,410867,8393 +"2020-07-24","MT",46,,3,,191,191,56,8,,,,0,,,,,,3039,,129,0,,,,,,1815,,0,149200,2982,,,,,,0,149200,2982 +"2020-07-24","NC",1746,1746,20,,,,1182,0,,363,,0,,,,,,108995,108995,2102,0,,,,,,,,0,1402141,26648,,,,,,0,1402141,26648 +"2020-07-24","ND",103,,2,,325,325,37,3,,,137094,1771,6364,,,,,5603,5603,122,0,240,,,,,4545,272538,4305,272538,4305,6604,,,,139886,1820,279953,4667 +"2020-07-24","NE",316,,5,,1548,1548,126,26,,,225256,3169,,,286153,,,23818,,332,0,,,,,29208,17745,,0,316152,4473,,,,,249344,3501,316152,4473 +"2020-07-24","NH",405,,3,,681,681,26,1,198,,143474,2890,,,,,,6318,,23,0,,,,,,5345,,0,215135,4224,26523,,25979,,149792,2913,215135,4224 +"2020-07-24","NJ",15616,13845,35,1771,21184,21184,800,0,,138,1709299,27548,,,,,62,180315,178345,502,0,,,,,,,,0,1889614,28050,,,,,,0,1887644,28006 +"2020-07-24","NM",601,,5,,2525,2525,161,25,,,,0,,,,,,18475,,312,0,,,,,,7156,,0,505177,8192,,,,,,0,505177,8192 +"2020-07-24","NV",722,,13,,,,1160,0,,315,380986,6769,,,,,165,40885,40885,966,0,,,,,,,589823,10581,589823,10581,,,,,419810,8115,537720,11445 +"2020-07-24","NY",25090,,9,,89995,89995,650,0,,156,,0,,,,,93,410450,,753,0,,,,,,,5444845,76507,5444845,76507,,,,,,0,,0 +"2020-07-24","OH",3297,3039,41,258,10072,10072,1085,104,2419,354,,0,,,,,169,81746,77309,1560,0,,,,,89332,56823,,0,1356995,24089,,,,,,0,1356995,24089 +"2020-07-24","OK",484,,7,,2687,2687,628,91,,260,493926,8720,,,493926,,,29116,29116,1147,0,1854,,,,32927,23277,,0,523042,9867,55185,,,,,0,527895,9761 +"2020-07-24","OR",273,,4,,1465,1465,225,32,,52,342778,5377,,,538145,,28,15713,,320,0,,,,,28702,3509,,0,566847,9233,,,,,357678,5691,566847,9233 +"2020-07-24","PA",7101,,22,,,,736,0,,,999377,18118,,,,,96,105571,102602,1213,0,,,,,,79178,1407415,27811,1407415,27811,,,,,1101979,19312,,0 +"2020-07-24","PR",191,90,3,101,,,460,0,,58,305972,0,,,303412,,31,4794,4794,220,0,9173,,,,7002,,,0,310766,220,,,,,,0,310546,0 +"2020-07-24","RI",1002,,1,,2146,2146,66,9,,6,171804,613,,,302963,,5,18224,,76,0,,,,,26593,,334238,4166,334238,4166,,,,,190028,689,329556,3577 +"2020-07-24","SC",1385,1339,51,46,4827,4827,1668,329,,,550765,8897,47120,,530891,,263,78607,78298,2001,0,3048,,,,98172,29378,,0,629372,10898,50168,,,,,0,629063,10880 +"2020-07-24","SD",122,,1,,796,796,45,4,,,95290,897,,,,,,8200,,57,0,,,,,13145,7261,,0,126296,1930,,,,,103490,954,126296,1930 +"2020-07-24","TN",938,904,13,34,4120,4120,1460,104,,,,0,,,1217433,,,89078,88172,2091,0,,,,,104274,52983,,0,1321707,26592,,,,,,0,1321707,26592 +"2020-07-24","TX",4717,,196,,,,10893,0,,3281,,0,,,,,,369826,369826,8701,0,10565,8098,,,577854,212216,,0,4055305,65759,233139,44448,,,,0,4055305,65759 +"2020-07-24","UT",273,,6,,2188,2188,250,38,574,97,459400,5517,,,553431,237,,36962,,863,0,,427,,404,41181,23715,,0,594612,7982,,1115,,933,496399,6118,594612,7982 +"2020-07-24","VA",2067,1964,13,103,7515,7515,1250,78,,274,,0,,,,,142,82364,79253,1127,0,6466,577,,,98175,,987188,18043,987188,18043,105975,824,,,,0,,0 +"2020-07-24","VI",7,,0,,,,,0,,,7500,0,,,,,,336,,0,0,,,,,,182,,0,7836,0,,,,,7890,0,,0 +"2020-07-24","VT",56,56,0,,,,12,0,,,85177,1064,,,,,,1384,1384,5,0,,,,,,1177,,0,109744,1614,,,,,86561,1069,109744,1614 +"2020-07-24","WA",1482,1482,14,,5276,5276,517,65,,,,0,,,,,47,53809,53726,1027,0,,,,,,,1003710,15175,1003710,15175,,,,,870763,15611,,0 +"2020-07-24","WI",885,878,0,7,4327,4327,312,54,861,60,795280,16438,,,,,,50727,46917,1058,0,,,,,,36333,1118188,23660,1118188,23660,,,,,842197,17456,,0 +"2020-07-24","WV",103,,0,,,,76,0,,37,,0,,,,,15,5695,5562,145,0,,,,,,4013,,0,247581,3340,13490,,,,,0,247581,3340 +"2020-07-24","WY",25,,0,,155,155,14,2,,,45823,0,,,72573,,,2405,1972,58,0,,,,,2256,1857,,0,74829,765,,,,,47745,0,74829,765 +"2020-07-23","AK",19,19,0,,124,124,36,6,,,,0,,,,,1,2203,,64,0,,,,,,787,,0,189509,4176,,,,,,0,189509,4176 +"2020-07-23","AL",1397,1357,33,40,8995,8995,1561,457,1043,,545315,7640,,,,553,,74212,72696,2399,0,,,,,,32510,,0,618011,9923,,,,,618011,9923,,0 +"2020-07-23","AR",386,,6,,2361,2361,480,44,,,410221,5241,,,,329,107,36259,36259,1013,0,,,,,,28864,,0,445467,5832,,,,,,0,445467,5832 +"2020-07-23","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-23","AZ",3063,2431,89,152,7236,7236,2966,189,,851,669769,6397,,,,,617,152944,137710,2335,0,,,,,,,,0,1208695,18413,,,215211,,822713,8732,1208695,18413 +"2020-07-23","CA",8027,,157,,,,8820,0,,2284,,0,,,,,,425616,425616,12040,0,,,,,,,,0,6778304,113885,,,,,,0,6778304,113885 +"2020-07-23","CO",1786,1450,15,336,6149,6149,356,16,,,428563,4850,121269,,,,,42314,39163,616,0,8889,,,,,,594731,9180,594731,9180,130158,,,,467726,5451,,0 +"2020-07-23","CT",4410,3530,4,880,10712,10712,72,58,,,,0,,,699702,,,48232,46213,9,0,,,,,60285,8516,,0,761800,14292,,,,,,0,761800,14292 +"2020-07-23","DC",581,,1,,,,91,0,,22,,0,,,,,9,11571,,42,0,,,,,,2020,162021,2449,162021,2449,,,,,115353,1495,,0 +"2020-07-23","DE",529,471,2,58,,,56,0,,7,148427,2786,,,,,,13924,12933,132,0,,,,,17479,7893,226065,1969,226065,1969,,,,,162351,2918,,0 +"2020-07-23","FL",5632,5632,173,,22991,22991,9422,403,,,2821074,45982,,311824,3574573,,,383749,,10112,0,,,14627,,486782,,3830539,80043,3830539,80043,,,326476,,3215185,56444,4075056,81189 +"2020-07-23","GA",3360,,25,,16353,16353,3157,431,3034,,,0,,,,,,156588,156588,4286,0,12208,,,,142249,,,0,1353907,20564,205171,,,,,0,1353907,20564 +"2020-07-23","GU",5,,0,,,,0,0,,,19132,380,,,,,,332,324,2,0,2,,,,,244,,0,19464,382,145,,,,,0,19456,382 +"2020-07-23","HI",25,25,1,,154,154,39,3,,,107378,614,,,,,,1435,,17,0,,,,,1399,1113,132740,2614,132740,2614,,,,,108813,631,132361,990 +"2020-07-23","IA",818,,10,,,,232,0,,73,395652,9009,,35257,,,32,40634,40634,841,0,,,2663,,,28924,,0,436286,9850,,,37958,,437848,9940,,0 +"2020-07-23","ID",135,114,9,21,674,674,188,18,201,46,140504,2355,,,,,,16322,15321,500,0,,,,,,4746,,0,155825,2816,,,,,155825,2816,,0 +"2020-07-23","IL",7560,7367,20,193,,,1473,0,,309,,0,,,,,135,168100,166925,1624,0,,,,,,,,0,2388193,39706,,,,,,0,2388193,39706 +"2020-07-23","IN",2880,2683,17,197,8066,8066,869,46,1708,327,606681,10941,,,,,85,59602,,929,0,,,,,64176,,,0,883439,16316,,,,,666283,11870,883439,16316 +"2020-07-23","KS",308,,0,,1545,1545,,0,450,112,244582,0,,,,164,28,24104,,0,0,,,,,,,,0,268686,0,,,,,268686,0,,0 +"2020-07-23","KY",684,680,7,4,2921,2921,581,7,1040,135,,0,,,,,,25147,23882,607,0,,,,,,7046,,0,523530,5659,41859,,,,,0,523530,5659 +"2020-07-23","LA",3686,3574,16,112,,,1585,0,,,1073218,19671,,,,,197,101650,101650,2296,0,,,,,,61456,,0,1174868,21967,,,,,,0,1174868,21967 +"2020-07-23","MA",8484,8265,16,219,11770,11770,351,9,,59,971605,15863,,,,,30,114647,107683,327,0,,,,,143913,96452,,0,1452393,20211,,,88712,,1079288,16133,1452393,20211 +"2020-07-23","MD",3409,3281,4,128,12037,12037,528,40,,133,708205,5544,,,,,,80836,80836,664,0,,,,,95073,5434,,0,1010681,16044,,,,,789041,6208,1010681,16044 +"2020-07-23","ME",118,117,0,1,378,378,12,1,,8,,0,8189,,,,3,3737,3334,14,0,390,,,,4178,3239,,0,146154,2569,8589,,,,,0,146154,2569 +"2020-07-23","MI",6395,6148,7,247,,,680,0,,210,,0,,,1502293,,120,84431,75947,701,0,,,,,106367,55162,,0,1608660,27375,202720,,,,,0,1608660,27375 +"2020-07-23","MN",1601,1561,9,40,4818,4818,282,47,1431,107,856594,16004,,,,,,48721,48721,760,0,,,,,,42524,905315,16764,905315,16764,,,,,,0,,0 +"2020-07-23","MO",1179,,20,,,,875,0,,,565584,12187,,54394,726302,,86,37700,37700,1637,0,,,1909,,42073,,,0,769616,20565,,,56303,,603284,13824,769616,20565 +"2020-07-23","MP",2,,0,,4,4,,0,,,11300,-1407,,,,,,38,38,0,0,,,,,,29,,0,11338,-1407,,,,,11338,0,12745,0 +"2020-07-23","MS",1436,1401,13,35,3878,3878,1207,34,,293,355959,0,,,,,140,48053,47468,982,0,,,,,,30315,,0,404012,982,15210,,,,,0,402474,0 +"2020-07-23","MT",43,,1,,183,183,54,4,,,,0,,,,,,2910,,97,0,,,,,,1587,,0,146218,2700,,,,,,0,146218,2700 +"2020-07-23","NC",1726,1726,28,,,,1188,0,,360,,0,,,,,,106893,106893,1892,0,,,,,,,,0,1375493,25652,,,,,,0,1375493,25652 +"2020-07-23","ND",101,,1,,322,322,57,5,,,135323,1424,6325,,,,,5481,5481,125,0,238,,,,,4475,268233,4212,268233,4212,6563,,,,138066,1526,275286,4311 +"2020-07-23","NE",311,,1,,1522,1522,125,14,,,222087,2656,,,282068,,,23486,,296,0,,,,,28823,17499,,0,311679,4211,,,,,245843,2954,311679,4211 +"2020-07-23","NH",402,,2,,680,680,24,3,198,,140584,1308,,,,,,6295,,33,0,,,,,,5341,,0,210911,3670,26345,,25796,,146879,1341,210911,3670 +"2020-07-23","NJ",15581,13810,24,1771,21184,21184,869,0,,152,1681751,18467,,,,,73,179813,177887,294,0,,,,,,,,0,1861564,18761,,,,,,0,1859638,18709 +"2020-07-23","NM",596,,5,,2500,2500,167,30,,,,0,,,,,,18163,,335,0,,,,,,7056,,0,496985,7651,,,,,,0,496985,7651 +"2020-07-23","NV",709,,5,,,,1136,0,,306,374217,8566,,,,,156,39919,39919,1262,0,,,,,,,579242,12062,579242,12062,,,,,411695,10255,526275,15297 +"2020-07-23","NY",25081,,13,,89995,89995,706,0,,160,,0,,,,,93,409697,,811,0,,,,,,,5368338,69698,5368338,69698,,,,,,0,,0 +"2020-07-23","OH",3256,2997,21,259,9968,9968,1105,104,2403,365,,0,,,,,178,80186,75819,1444,0,,,,,87855,55702,,0,1332906,24244,,,,,,0,1332906,24244 +"2020-07-23","OK",477,,3,,2596,2596,607,56,,255,485206,6909,,,485206,,,27969,27969,668,0,1854,,,,31903,22441,,0,513175,7577,55185,,,,,0,518134,7775 +"2020-07-23","OR",269,,0,,1433,1433,231,27,,61,337401,7277,,,529320,,30,15393,,254,0,,,,,28294,3381,,0,557614,17978,,,,,351987,7508,557614,17978 +"2020-07-23","PA",7079,,16,,,,736,0,,,981259,13178,,,,,96,104358,101408,962,0,,,,,,78268,1379604,21358,1379604,21358,,,,,1082667,14103,,0 +"2020-07-23","PR",188,87,3,101,,,442,0,,56,305972,50206,,,303412,,40,4574,4574,244,0,8899,,,,7002,,,0,310546,50450,,,,,,0,310546,52545 +"2020-07-23","RI",1001,,4,,2137,2137,67,10,,7,171191,2397,,,299490,,4,18148,,86,0,,,,,26489,,330072,3895,330072,3895,,,,,189339,2483,325979,4107 +"2020-07-23","SC",1334,1294,49,40,4498,4498,1723,0,,,541868,7750,46637,,522507,,,76606,76315,1564,0,2940,,,,95676,27062,,0,618474,9314,49577,,,,,0,618183,9304 +"2020-07-23","SD",121,,2,,792,792,50,2,,,94393,1412,,,,,,8143,,66,0,,,,,13064,7214,,0,124366,1714,,,,,102536,1478,124366,1714 +"2020-07-23","TN",925,891,37,34,4016,4016,1465,109,,,,0,,,1193333,,,86987,86117,2570,0,,,,,101782,51661,,0,1295115,32122,,,,,,0,1295115,32122 +"2020-07-23","TX",4521,,173,,,,10893,0,,3281,,0,,,,,,361125,361125,9507,0,10394,7873,,,567204,203826,,0,3989546,61794,232021,42653,,,,0,3989546,61794 +"2020-07-23","UT",267,,7,,2150,2150,249,15,568,98,453883,5738,,,546111,234,,36099,,521,0,,409,,387,40519,23093,,0,586630,8295,,1055,,881,490281,6385,586630,8295 +"2020-07-23","VA",2054,1951,3,103,7437,7437,1218,86,,257,,0,,,,,136,81237,78182,844,0,6348,555,,,96887,,969145,17971,969145,17971,104597,798,,,,0,,0 +"2020-07-23","VI",7,,0,,,,,0,,,7500,354,,,,,,336,,16,0,,,,,,182,,0,7836,370,,,,,7890,333,,0 +"2020-07-23","VT",56,56,0,,,,12,0,,,84113,701,,,,,,1379,1379,11,0,,,,,,1156,,0,108130,1096,,,,,85492,712,108130,1096 +"2020-07-23","WA",1468,1468,3,,5211,5211,527,50,,,,0,,,,,55,52782,52706,1096,0,,,,,,,988535,14453,988535,14453,,,,,855152,13968,,0 +"2020-07-23","WI",885,878,13,7,4273,4273,187,48,857,51,778842,14212,,,,,,49669,45899,1086,0,,,,,,35502,1094528,20183,1094528,20183,,,,,824741,15264,,0 +"2020-07-23","WV",103,,2,,,,88,0,,38,,0,,,,,16,5550,5420,344,0,,,,,,3913,,0,244241,3713,13368,,,,,0,244241,3713 +"2020-07-23","WY",25,,0,,153,153,15,1,,,45823,3896,,,71853,,,2347,1923,59,0,,,,,2211,1794,,0,74064,968,,,,,47745,4140,74064,968 +"2020-07-22","AK",19,19,1,,118,118,34,5,,,,0,,,,,1,2139,,94,0,,,,,,753,,0,185333,6707,,,,,,0,185333,6707 +"2020-07-22","AL",1364,1325,61,39,8538,8538,1468,0,1018,,537675,7652,,,,540,,71813,70413,1455,0,,,,,,29736,,0,608088,8990,,,,,608088,8990,,0 +"2020-07-22","AR",380,,6,,2317,2317,474,60,,,404980,0,,,,323,107,35246,35246,591,0,,,,,,27990,,0,439635,0,,,,,,0,439635,0 +"2020-07-22","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-22","AZ",2974,2431,56,152,7047,7047,3094,153,,870,663372,4389,,,,,609,150609,137710,1926,0,,,,,,,,0,1190282,18935,,,213144,,813981,6315,1190282,18935 +"2020-07-22","CA",7870,,115,,,,8820,0,,2284,,0,,,,,,413576,413576,12807,0,,,,,,,,0,6664419,127487,,,,,,0,6664419,127487 +"2020-07-22","CO",1771,1435,8,336,6133,6133,351,23,,,423713,7370,120398,,,,,41698,38562,639,0,8823,,,,,,585551,11389,585551,11389,129221,,,,462275,7985,,0 +"2020-07-22","CT",4406,3527,0,879,10654,10654,63,0,,,,0,,,685537,,,48223,46203,127,0,,,,,60171,8466,,0,747508,13819,,,,,,0,747508,13819 +"2020-07-22","DC",580,,0,,,,81,0,,18,,0,,,,,11,11529,,102,0,,,,,,1974,159572,3861,159572,3861,,,,,113858,2614,,0 +"2020-07-22","DE",527,469,2,58,,,61,0,,7,145641,1040,,,,,,13792,12804,46,0,,,,,17391,7859,224096,3419,224096,3419,,,,,159433,1086,,0 +"2020-07-22","FL",5459,5459,140,,22588,22588,9475,465,,,2775092,45176,,311824,3507785,,,373637,,9664,0,,,14627,,473128,,3750496,88585,3750496,88585,,,326476,,3158741,55067,3993867,80957 +"2020-07-22","GA",3335,,81,,15922,15922,3179,428,2967,,,0,,,,,,152302,152302,3314,0,12035,,,,138819,,,0,1333343,22026,203453,,,,,0,1333343,22026 +"2020-07-22","GU",5,,0,,,,3,0,,,18752,322,,,,,,330,322,3,0,2,,,,,242,,0,19082,325,145,,,,,0,19074,491 +"2020-07-22","HI",24,24,0,,151,151,47,1,,,106764,1374,,,,,,1418,,25,0,,,,,1374,1084,130126,1668,130126,1668,,,,,108182,1399,131371,1861 +"2020-07-22","IA",808,,6,,,,224,0,,71,386643,3684,,34967,,,31,39793,39793,319,0,,,2641,,,28607,,0,426436,4003,,,37646,,427908,4030,,0 +"2020-07-22","ID",126,103,4,33,656,656,188,35,197,46,138149,2344,,,,,,15822,14860,556,0,,,,,,4504,,0,153009,2867,,,,,153009,2867,,0 +"2020-07-22","IL",7540,7347,23,193,,,1456,0,,337,,0,,,,,132,166476,165301,1598,0,,,,,,,,0,2348487,39633,,,,,,0,2348487,39633 +"2020-07-22","IN",2863,2666,17,197,8020,8020,869,79,1703,327,595740,8851,,,,,85,58673,,757,0,,,,,63089,,,0,867123,17034,,,,,654413,9608,867123,17034 +"2020-07-22","KS",308,,1,,1545,1545,,48,450,112,244582,6385,,,,164,28,24104,,770,0,,,,,,,,0,268686,7155,,,,,268686,7155,,0 +"2020-07-22","KY",677,673,3,4,2914,2914,603,14,1039,145,,0,,,,,,24540,23336,480,0,,,,,,7000,,0,517871,10322,42223,,,,,0,517871,10322 +"2020-07-22","LA",3670,3558,62,112,,,1581,0,,,1053547,27168,,,,,188,99354,99354,2771,0,,,,,,61456,,0,1152901,29939,,,,,,0,1152901,29939 +"2020-07-22","MA",8468,8249,18,219,11761,11761,532,15,,63,955742,10594,,,,,37,114320,107413,287,0,,,,,143566,96452,,0,1432182,18328,,,87346,,1063155,10786,1432182,18328 +"2020-07-22","MD",3405,3276,3,129,11997,11997,505,48,,137,702661,17839,,,,,,80172,80172,627,0,,,,,94213,5434,,0,994637,21021,,,,,782833,18466,994637,21021 +"2020-07-22","ME",118,117,0,1,377,377,10,0,,8,,0,8113,,,,4,3723,3321,0,0,386,,,,4156,3216,,0,143585,2736,8509,,,,,0,143585,2736 +"2020-07-22","MI",6388,6141,6,247,,,680,0,,210,,0,,,1475883,,120,83730,75248,671,0,,,,,105402,55162,,0,1581285,30588,200528,,,,,0,1581285,30588 +"2020-07-22","MN",1592,1552,4,40,4771,4771,273,48,1423,119,840590,11188,,,,,,47961,47961,504,0,,,,,,42234,888551,11692,888551,11692,,,,,,0,,0 +"2020-07-22","MO",1159,,16,,,,875,0,,,553397,7839,,53746,707077,,86,36063,36063,1301,0,,,1876,,40767,,,0,749051,9911,,,55622,,589460,9140,749051,9911 +"2020-07-22","MP",2,,0,,4,4,,0,,,12707,1652,,,,,,38,38,0,0,,,,,,29,,0,12745,1652,,,,,11338,246,12745,509 +"2020-07-22","MS",1423,1390,34,33,3844,3844,1165,47,,293,355959,6285,,,,,138,47071,46515,1547,0,,,,,,30315,,0,403030,7832,15210,,,,,0,402474,7801 +"2020-07-22","MT",42,,2,,179,179,52,5,,,,0,,,,,,2813,,101,0,,,,,,1543,,0,143518,2516,,,,,,0,143518,2516 +"2020-07-22","NC",1698,1698,30,,,,1137,0,,338,,0,,,,,,105001,105001,2140,0,,,,,,,,0,1349841,19982,,,,,,0,1349841,19982 +"2020-07-22","ND",100,,2,,317,317,52,8,,,133899,1813,6277,,,,,5356,5356,159,0,234,,,,,4407,264021,4035,264021,4035,6511,,,,136540,1882,270975,4256 +"2020-07-22","NE",310,,4,,1508,1508,118,6,,,219431,3837,,,278266,,,23190,,343,0,,,,,28419,17389,,0,307468,6691,,,,,242889,4197,307468,6691 +"2020-07-22","NH",400,,2,,677,677,23,4,196,,139276,703,,,,,,6262,,13,0,,,,,,5316,,0,207241,2206,26173,,25611,,145538,716,207241,2206 +"2020-07-22","NJ",15557,13787,24,1770,21184,21184,873,85,,151,1663284,22585,,,,,77,179519,177645,443,0,,,,,,,,0,1842803,23028,,,,,,0,1840929,22974 +"2020-07-22","NM",591,,3,,2470,2470,178,37,,,,0,,,,,,17828,,311,0,,,,,,6974,,0,489334,7803,,,,,,0,489334,7803 +"2020-07-22","NV",704,,28,,,,1102,0,,299,365651,4357,,,,,154,38657,38657,1129,0,,,,,,,567180,11806,567180,11806,,,,,401440,5361,510978,7514 +"2020-07-22","NY",25068,,10,,89995,89995,714,0,,179,,0,,,,,96,408886,,705,0,,,,,,,5298640,67659,5298640,67659,,,,,,0,,0 +"2020-07-22","OH",3235,2976,16,259,9864,9864,1098,128,2386,347,,0,,,,,169,78742,74409,1527,0,,,,,86295,54426,,0,1308662,22686,,,,,,0,1308662,22686 +"2020-07-22","OK",474,,13,,2540,2540,630,137,,257,478297,6240,,,478297,,,27301,27301,975,0,1854,,,,31051,21596,,0,505598,7215,55185,,,,,0,510359,7033 +"2020-07-22","OR",269,,7,,1406,1406,237,19,,64,330124,4927,,,511905,,34,15139,,292,0,,,,,27731,3381,,0,539636,7955,,,,,344479,5197,539636,7955 +"2020-07-22","PA",7063,,25,,,,735,0,,,968081,15083,,,,,100,103396,100483,631,0,,,,,,77547,1358246,22893,1358246,22893,,,,,1068564,15691,,0 +"2020-07-22","PR",185,84,5,101,,,415,0,,49,255766,0,,,253922,,31,4330,4330,75,0,8708,,,,3966,,,0,260096,75,,,,,,0,258001,0 +"2020-07-22","RI",997,,1,,2127,2127,67,11,,5,168794,1816,,,295522,,3,18062,,76,0,,,,,26350,,326177,4328,326177,4328,,,,,186856,1892,321872,4328 +"2020-07-22","SC",1285,1242,64,43,4498,4498,1607,0,,,534118,8762,46124,,513352,,,75042,74761,1705,0,2883,,,,93527,27062,,0,609160,10467,49007,,,,,0,608879,10422 +"2020-07-22","SD",119,,1,,790,790,56,14,,,92981,1155,,,,,,8077,,58,0,,,,,13001,7159,,0,122652,2255,,,,,101058,1213,122652,2255 +"2020-07-22","TN",888,855,17,33,3907,3907,1451,109,,,,0,,,1164250,,,84417,83582,2473,0,,,,,98743,49748,,0,1262993,25582,,,,,,0,1262993,25582 +"2020-07-22","TX",4348,,197,,,,10893,0,,3281,,0,,,,,,351618,351618,9879,0,8737,7612,,,557438,195315,,0,3927752,64102,227696,40778,,,,0,3927752,64102 +"2020-07-22","UT",260,,9,,2135,2135,234,26,563,94,448145,5530,,,538558,231,,35578,,566,0,,390,,369,39777,22532,,0,578335,7953,,997,,830,483896,6140,578335,7953 +"2020-07-22","VA",2051,1948,3,103,7351,7351,1157,84,,253,,0,,,,,136,80393,77380,1022,0,6252,527,,,94379,,951174,14026,951174,14026,103203,749,,,,0,,0 +"2020-07-22","VI",7,,1,,,,,0,,,7146,293,,,,,,320,,12,0,,,,,,172,,0,7466,305,,,,,7557,278,,0 +"2020-07-22","VT",56,56,0,,,,14,0,,,83412,962,,,,,,1368,1368,2,0,,,,,,1152,,0,107034,1458,,,,,84780,964,107034,1458 +"2020-07-22","WA",1465,1465,12,,5161,5161,546,59,,,,0,,,,,51,51686,51617,1000,0,,,,,,,974082,15767,974082,15767,,,,,841184,14830,,0 +"2020-07-22","WI",872,865,6,7,4225,4225,167,31,848,63,764630,14068,,,,,,48583,44847,747,0,,,,,,34682,1074345,21969,1074345,21969,,,,,809477,14780,,0 +"2020-07-22","WV",101,,0,,,,78,0,,33,,0,,,,,16,5206,5081,7,0,,,,,,3625,,0,240528,3917,13019,,,,,0,240528,3917 +"2020-07-22","WY",25,,0,,152,152,13,6,,,41927,0,,,70933,,,2288,1864,50,0,,,,,2163,1745,,0,73096,1267,,,,,43605,0,73096,1267 +"2020-07-21","AK",18,18,0,,113,113,32,2,,,,0,,,,,1,2045,,90,0,,,,,,737,,0,178626,3040,,,,,,0,178626,3040 +"2020-07-21","AL",1303,1268,12,35,8538,8538,1549,170,1009,,530023,5126,,,,535,,70358,69075,1467,0,,,,,,29736,,0,599098,6490,,,,,599098,6490,,0 +"2020-07-21","AR",374,,17,,2257,2257,488,55,,,404980,6091,,,,316,111,34655,34655,728,0,,,,,,27283,,0,439635,6819,,,,,,0,439635,6819 +"2020-07-21","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-21","AZ",2918,2431,134,152,6894,6894,3041,196,,865,658983,10643,,,,,608,148683,137710,3500,0,,,,,,,,0,1171347,18865,,,211454,,807666,14143,1171347,18865 +"2020-07-21","CA",7755,,61,,,,8681,0,,2226,,0,,,,,,400769,400769,9231,0,,,,,,,,0,6536932,122611,,,,,,0,6536932,122611 +"2020-07-21","CO",1763,1430,5,333,6110,6110,373,53,,,416343,5610,119661,,,,,41059,37947,493,0,8762,,,,,,574162,8863,574162,8863,128423,,,,454290,6086,,0 +"2020-07-21","CT",4406,3527,0,879,10654,10654,62,0,,,,0,,,671874,,,48096,46116,41,0,,,,,60021,8466,,0,733689,13048,,,,,,0,733689,13048 +"2020-07-21","DC",580,,1,,,,83,0,,19,,0,,,,,13,11427,,88,0,,,,,,1932,155711,3971,155711,3971,,,,,111244,2177,,0 +"2020-07-21","DE",525,467,2,58,,,58,0,,11,144601,5125,,,,,,13746,12763,227,0,,,,,17267,7362,220677,4013,220677,4013,,,,,158347,5352,,0 +"2020-07-21","FL",5319,5319,136,,22123,22123,9520,518,,,2729916,38204,,311824,3439642,,,363973,,9263,0,,,14627,,460918,,3661911,66455,3661911,66455,,,326476,,3103674,47752,3912910,67640 +"2020-07-21","GA",3254,,78,,15494,15494,3155,447,2904,,,0,,,,,,148988,148988,3413,0,12022,,,,136168,,,0,1311317,22036,203234,,,,,0,1311317,22036 +"2020-07-21","GU",5,,0,,,,3,0,,,18430,178,,,,,,327,319,8,0,2,,,,,235,,0,18757,186,145,,,,,0,18583,0 +"2020-07-21","HI",24,24,0,,150,150,46,0,,,105390,815,,,,,,1393,,12,0,,,,,1348,1057,128458,1240,128458,1240,,,,,106783,827,129510,1136 +"2020-07-21","IA",802,,5,,,,223,0,,74,382959,3581,,34865,,,32,39474,39474,308,0,,,2632,,,28388,,0,422433,3889,,,37535,,423878,4016,,0 +"2020-07-21","ID",122,100,3,22,621,621,188,21,186,46,135805,2790,,,,,,15266,14337,393,0,,,,,,4335,,0,150142,3148,,,,,150142,3148,,0 +"2020-07-21","IL",7517,7324,23,193,,,1466,0,,320,,0,,,,,142,164878,163703,955,0,,,,,,,,0,2308854,29745,,,,,,0,2308854,29745 +"2020-07-21","IN",2846,2652,21,194,7941,7941,803,0,1691,267,586889,8435,,,,,82,57916,,710,0,,,,,61982,,,0,850089,17689,,,,,644805,9145,850089,17689 +"2020-07-21","KS",307,,0,,1497,1497,,0,439,111,238197,0,,,,162,21,23334,,0,0,,,,,,,,0,261531,0,,,,,261531,0,,0 +"2020-07-21","KY",674,670,3,4,2900,2900,532,18,1036,136,,0,,,,,,24060,22916,646,0,,,,,,6927,,0,507549,14481,41592,,,,,0,507549,14481 +"2020-07-21","LA",3608,3498,36,110,,,1527,0,,,1026379,18347,,,,,186,96583,96583,1691,0,,,,,,53288,,0,1122962,20038,,,,,,0,1122962,20038 +"2020-07-21","MA",8450,8231,17,219,11746,11746,513,24,,63,945148,7656,,,,,33,114033,107221,244,0,,,,,143238,95390,,0,1413854,19710,,,87006,,1052369,7821,1413854,19710 +"2020-07-21","MD",3402,3272,20,130,11949,11949,484,52,,131,684822,14228,,,,,,79545,79545,860,0,,,,,93322,5380,,0,973616,20550,,,,,764367,15088,973616,20550 +"2020-07-21","ME",118,117,1,1,377,377,12,2,,8,,0,8084,,,,4,3723,3300,12,0,386,,,,4127,3191,,0,140849,2966,8479,,,,,0,140849,2966 +"2020-07-21","MI",6382,6135,9,247,,,680,0,,210,,0,,,1446316,,130,83059,74725,664,0,,,,,104381,55162,,0,1550697,22893,199230,,,,,0,1550697,22893 +"2020-07-21","MN",1588,1548,3,40,4723,4723,266,45,1412,112,829402,9099,,,,,,47457,47457,350,0,,,,,,41511,876859,9449,876859,9449,,,,,,0,,0 +"2020-07-21","MO",1143,,11,,,,875,0,,,545558,7270,,53130,698398,,86,34762,34762,1138,0,,,1861,,39567,,,0,739140,11003,,,54991,,580320,8408,739140,11003 +"2020-07-21","MP",2,,0,,4,4,,0,,,11055,0,,,,,,38,38,1,0,,,,,,29,,0,11093,1,,,,,11092,0,12236,0 +"2020-07-21","MS",1389,1358,31,31,3797,3797,1154,31,,293,349674,3588,,,,,140,45524,44999,1635,0,,,,,,30315,,0,395198,5223,15176,,,,,0,394673,5207 +"2020-07-21","MT",40,,1,,174,174,49,7,,,,0,,,,,,2712,,91,0,,,,,,1493,,0,141002,1960,,,,,,0,141002,1960 +"2020-07-21","NC",1668,1668,26,,,,1179,0,,,,0,,,,,,102861,102861,1815,0,,,,,,,,0,1329859,21111,,,,,,0,1329859,21111 +"2020-07-21","ND",98,,1,,309,309,46,4,,,132086,1234,6241,,,,,5197,5197,82,0,233,,,,,4319,259986,3573,259986,3573,6474,,,,134658,1238,266719,3745 +"2020-07-21","NE",306,,5,,1502,1502,115,20,,,215594,3281,,,272028,,,22847,,264,0,,,,,27991,17237,,0,300777,4406,,,,,238692,3543,300777,4406 +"2020-07-21","NH",398,,0,,673,673,20,0,193,,138573,1398,,,,,,6249,,46,0,,,,,,5286,,0,205035,1830,25992,,25499,,144822,1444,205035,1830 +"2020-07-21","NJ",15533,13763,23,1770,21099,21099,833,41,,169,1640699,14788,,,,,79,179076,177256,353,0,,,,,,,,0,1819775,15141,,,,,,0,1817955,15081 +"2020-07-21","NM",588,,10,,2433,2433,154,34,,,,0,,,,,,17517,,302,0,,,,,,6870,,0,481531,5034,,,,,,0,481531,5034 +"2020-07-21","NV",676,,28,,,,1095,0,,301,361294,2586,,,,,143,37528,37528,815,0,,,,,,,555374,8821,555374,8821,,,,,396079,3091,503464,4725 +"2020-07-21","NY",25058,,2,,89995,89995,724,0,,163,,0,,,,,91,408181,,855,0,,,,,,,5230981,66169,5230981,66169,,,,,,0,,0 +"2020-07-21","OH",3219,2959,30,260,9736,9736,1097,126,2367,342,,0,,,,,168,77215,72963,1047,0,,,,,84961,53077,,0,1285976,18528,,,,,,0,1285976,18528 +"2020-07-21","OK",461,,9,,2403,2403,613,0,,248,472057,21382,,,472057,,,26326,26326,893,0,1854,,,,30273,20663,,0,498383,22275,55185,,,,,0,503326,23779 +"2020-07-21","OR",262,,2,,1387,1387,233,60,,70,325197,4186,,,504347,,34,14847,,268,0,,,,,27334,3338,,0,531681,7586,,,,,339282,15804,531681,7586 +"2020-07-21","PA",7038,,20,,,,736,0,,,952998,14823,,,,,98,102765,99875,1027,0,,,,,,77073,1335353,23129,1335353,23129,,,,,1052873,15826,,0 +"2020-07-21","PR",180,81,0,99,,,375,0,,40,255766,0,,,253922,,24,4255,4255,244,0,8685,,,,3966,,,0,260021,244,,,,,,0,258001,0 +"2020-07-21","RI",996,,1,,2116,2116,64,6,,4,166978,1257,,,291322,,2,17986,,82,0,,,,,26222,,321849,2662,321849,2662,,,,,184964,1339,317544,2388 +"2020-07-21","SC",1221,1203,57,18,4498,4498,1593,316,,,525356,8485,45784,,506998,,,73337,73101,1892,0,2806,,,,91459,27062,,0,598693,10377,48590,,,,,0,598457,10373 +"2020-07-21","SD",118,,0,,776,776,62,2,,,91826,1115,,,,,,8019,,76,0,,,,,12921,7081,,0,120397,669,,,,,99845,1191,120397,669 +"2020-07-21","TN",871,840,24,31,3798,3798,1461,86,,,,0,,,1141646,,,81944,81122,2190,0,,,,,95765,47852,,0,1237411,23028,,,,,,0,1237411,23028 +"2020-07-21","TX",4151,,131,,,,10848,0,,,,0,,,,,,341739,341739,9305,0,8562,7378,,,546991,186529,,0,3863650,68310,226323,38804,,,,0,3863650,68310 +"2020-07-21","UT",251,,4,,2109,2109,219,43,554,96,442615,5086,,,531294,229,,35012,,486,0,,373,,354,39088,22032,,0,570382,7559,,954,,799,477756,5648,570382,7559 +"2020-07-21","VA",2048,1945,17,103,7267,7267,1189,66,,258,,0,,,,,127,79371,76427,996,0,6159,501,,,94379,,937148,19647,937148,19647,102208,709,,,,0,,0 +"2020-07-21","VI",6,,0,,,,,0,,,6853,236,,,,,,308,,4,0,,,,,,158,,0,7161,240,,,,,7279,307,,0 +"2020-07-21","VT",56,56,0,,,,19,0,,,82450,946,,,,,,1366,1366,7,0,,,,,,1148,,0,105576,1334,,,,,83816,953,105576,1334 +"2020-07-21","WA",1453,1453,6,,5102,5102,494,39,,,,0,,,,,43,50686,50620,343,0,,,,,,,958315,17057,958315,17057,,,,,826354,17015,,0 +"2020-07-21","WI",866,859,13,7,4194,4194,354,65,838,101,750562,13371,,,,,,47836,44135,1161,0,,,,,,33902,1052376,17640,1052376,17640,,,,,794697,14488,,0 +"2020-07-21","WV",101,,1,,,,77,0,,33,,0,,,,,16,5199,5074,57,0,,,,,,3546,,0,236611,5322,12970,,,,,0,236611,5322 +"2020-07-21","WY",25,,1,,146,146,13,2,,,41927,0,,,69717,,,2238,1830,51,0,,,,,2112,1694,,0,71829,1492,,,,,43605,0,71829,1492 +"2020-07-20","AK",18,18,0,,111,111,29,1,,,,0,,,,,0,1955,,73,0,,,,,,712,,0,175586,2576,,,,,,0,175586,2576 +"2020-07-20","AL",1291,1257,4,34,8368,8368,1571,586,994,,524897,6375,,,,528,,68891,67711,1880,0,,,,,,29736,,0,592608,8221,,,,,592608,8221,,0 +"2020-07-20","AR",357,,0,,2202,2202,471,25,,,398889,12251,,,,309,111,33927,33927,1394,0,,,,,,26397,,0,432816,13645,,,,,,0,432816,13645 +"2020-07-20","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-20","AZ",2784,2431,23,152,6698,6698,3084,66,,886,648340,5985,,,,,622,145183,137710,1559,0,,,,,,,,0,1152482,7363,,,210464,,793523,7544,1152482,7363 +"2020-07-20","CA",7694,,9,,,,8419,0,,2157,,0,,,,,,391538,391538,6846,0,,,,,,,,0,6414321,127469,,,,,,0,6414321,127469 +"2020-07-20","CO",1758,1426,6,332,6057,6057,386,25,,,410733,8706,119169,,,,,40566,37471,424,0,8717,,,,,,565299,12383,565299,12383,127886,,,,448204,9136,,0 +"2020-07-20","CT",4406,3525,10,881,10654,10654,54,0,,,,0,,,658972,,,48055,46071,162,0,,,,,59891,8466,,0,720641,6097,,,,,,0,720641,6097 +"2020-07-20","DC",579,,1,,,,83,0,,19,,0,,,,,12,11339,,78,0,,,,,,1909,151740,3975,151740,3975,,,,,109067,2142,,0 +"2020-07-20","DE",523,465,0,58,,,47,0,,9,139476,0,,,,,,13519,12537,0,0,,,,,17165,7362,216664,4709,216664,4709,,,,,152995,0,,0 +"2020-07-20","FL",5183,5183,92,,21605,21605,9489,296,,,2691712,39118,,284980,3384679,,,354710,,10405,0,,,12002,,448764,,3595456,68914,3595456,68914,,,297009,,3055922,49632,3845270,69334 +"2020-07-20","GA",3176,,3,,15047,15047,3183,37,2829,,,0,,,,,,145575,145575,2452,0,11985,,,,133176,,,0,1289281,16442,202941,,,,,0,1289281,16442 +"2020-07-20","GU",5,,0,,,,3,0,,,18252,314,,,,,,319,311,4,0,2,,,,,235,,0,18571,318,145,,,,,0,18583,339 +"2020-07-20","HI",24,24,0,,150,150,33,10,,,104575,1294,,,,,,1381,,27,0,,,,,1336,1043,127218,1983,127218,1983,,,,,105956,1321,128374,1920 +"2020-07-20","IA",797,,3,,,,221,0,,76,379378,2610,,34610,,,30,39166,39166,443,0,,,2619,,,28024,,0,418544,3053,,,37265,,419862,3127,,0 +"2020-07-20","ID",119,97,0,22,600,600,224,17,181,33,133015,1131,,,,,,14873,13979,571,0,,,,,,4149,,0,146994,1691,,,,,146994,1691,,0 +"2020-07-20","IL",7494,7301,6,193,,,1410,0,,308,,0,,,,,133,163923,162748,1173,0,,,,,,,,0,2279109,34598,,,,,,0,2279109,34598 +"2020-07-20","IN",2825,2632,3,193,7941,7941,805,46,1691,248,578454,8145,,,,,85,57206,,635,0,,,,,60881,,,0,832400,4207,,,,,635660,8780,832400,4207 +"2020-07-20","KS",307,,8,,1497,1497,,44,439,111,238197,10809,,,,162,21,23334,,1369,0,,,,,,,,0,261531,12178,,,,,261531,12178,,0 +"2020-07-20","KY",671,667,1,4,2882,2882,542,2,1035,114,,0,,,,,,23414,22328,253,0,,,,,,6876,,0,493068,1410,40357,,,,,0,493068,1410 +"2020-07-20","LA",3572,3462,29,110,,,1508,0,,,1008032,30434,,,,,192,94892,94892,3186,0,,,,,,53288,,0,1102924,33620,,,,,,0,1102924,33620 +"2020-07-20","MA",8433,8214,2,219,11722,11722,483,5,,67,937492,10491,,,,,38,113789,107056,255,0,,,,,142899,95390,,0,1394144,17430,,,86433,,1044548,10665,1394144,17430 +"2020-07-20","MD",3382,3252,5,130,11897,11897,463,56,,136,670594,8940,,,,,,78685,78685,554,0,,,,,92337,5344,,0,953066,14755,,,,,749279,9494,953066,14755 +"2020-07-20","ME",117,116,0,1,375,375,12,0,,10,,0,8068,,,,4,3711,3287,24,0,385,,,,4112,3159,,0,137883,1743,8463,,,,,0,137883,1743 +"2020-07-20","MI",6373,6126,7,247,,,680,0,,210,,0,,,1424394,,102,82395,74152,527,0,,,,,103410,55162,,0,1527804,22600,198479,,,,,0,1527804,22600 +"2020-07-20","MN",1585,1545,4,40,4678,4678,247,51,1397,115,820303,13319,,,,,,47107,47107,903,0,,,,,,40742,867410,14222,867410,14222,,,,,,0,,0 +"2020-07-20","MO",1132,,3,,,,875,0,,,538288,12303,,52923,688187,,86,33624,33624,530,0,,,1842,,38855,,,0,728137,19094,,,54765,,571912,12833,728137,19094 +"2020-07-20","MP",2,,0,,4,4,,0,,,11055,391,,,,,,37,37,0,0,,,,,,29,,0,11092,391,,,,,11092,395,12236,901 +"2020-07-20","MS",1358,1327,3,31,3766,3766,1119,39,,284,346086,10647,,,,,143,43889,43380,1251,0,,,,,,30315,,0,389975,11898,15082,,,,,0,389466,12673 +"2020-07-20","MT",39,,2,,167,167,48,2,,,,0,,,,,,2621,,88,0,,,,,,1334,,0,139042,5883,,,,,,0,139042,5883 +"2020-07-20","NC",1642,1642,8,,,,1086,0,,,,0,,,,,,101046,101046,1268,0,,,,,,,,0,1308748,24440,,,,,,0,1308748,24440 +"2020-07-20","ND",97,,1,,305,305,47,3,,,130852,2017,6129,,,,,5115,5115,106,0,230,,,,,4219,256413,5509,256413,5509,6359,,,,133420,2046,262974,5718 +"2020-07-20","NE",301,,0,,1482,1482,121,1,,,212313,2393,,,267985,,,22583,,102,0,,,,,27632,17112,,0,296371,2890,,,,,235149,2495,296371,2890 +"2020-07-20","NH",398,,0,,673,673,17,0,193,,137175,0,,,,,,6203,,0,0,,,,,,5251,,0,203205,3001,25837,,25466,,143378,0,203205,3001 +"2020-07-20","NJ",15510,13741,10,1769,21058,21058,798,-6,,146,1625911,11557,,,,,72,178723,176963,201,0,,,,,,,,0,1804634,11758,,,,,,0,1802874,11737 +"2020-07-20","NM",578,,7,,2399,2399,154,12,,,,0,,,,,,17215,,244,0,,,,,,6814,,0,476497,7282,,,,,,0,476497,7282 +"2020-07-20","NV",648,,1,,,,1086,0,,304,358708,4685,,,,,156,36713,36713,948,0,,,,,,,546553,2720,546553,2720,,,,,392988,5914,498739,8095 +"2020-07-20","NY",25056,,8,,89995,89995,716,0,,158,,0,,,,,93,407326,,519,0,,,,,,,5164812,49342,5164812,49342,,,,,,0,,0 +"2020-07-20","OH",3189,2931,15,258,9610,9610,1065,55,2344,318,,0,,,,,165,76168,71952,1236,0,,,,,83862,51860,,0,1267448,22335,,,,,,0,1267448,22335 +"2020-07-20","OK",452,,1,,2403,2403,604,15,,232,450675,0,,,450675,,,25433,25433,168,0,1854,,,,27903,19750,,0,476108,168,55185,,,,,0,479547,0 +"2020-07-20","OR",260,,3,,1327,1327,242,0,,64,321011,4367,,,497209,,34,14579,,430,0,,,,,26886,3225,,0,524095,7591,,,,,323478,0,524095,7591 +"2020-07-20","PA",7018,,3,,,,706,0,,,938175,11823,,,,,98,101738,98872,711,0,,,,,,76780,1312224,17779,1312224,17779,,,,,1037047,12531,,0 +"2020-07-20","PR",180,81,2,99,,,336,0,,31,255766,0,,,253922,,20,4011,4011,220,0,8450,,,,3966,,,0,259777,220,,,,,,0,258001,0 +"2020-07-20","RI",995,,5,,2110,2110,61,22,,2,165721,4313,,,289004,,2,17904,,111,0,,,,,26152,,319187,2647,319187,2647,,,,,183625,4424,315156,10386 +"2020-07-20","SC",1164,1147,9,17,4182,4182,1593,0,,,516871,9471,45729,,498977,,,71445,71213,1459,0,2781,,,,89107,22553,,0,588316,10930,48510,,,,,0,588084,10919 +"2020-07-20","SD",118,,0,,774,774,65,0,,,90711,530,,,,,,7943,,37,0,,,,,12879,6996,,0,119728,692,,,,,98654,567,119728,692 +"2020-07-20","TN",847,816,4,31,3712,3712,1368,31,,,,0,,,1121126,,,79754,78970,1639,0,,,,,93257,45974,,0,1214383,17840,,,,,,0,1214383,17840 +"2020-07-20","TX",4020,,62,,,,10569,0,,,,0,,,,,,332434,332434,7404,0,7976,7114,,,534477,177871,,0,3795340,21330,223303,36603,,,,0,3795340,21330 +"2020-07-20","UT",247,,4,,2066,2066,247,33,543,105,437529,4433,,,524417,224,,34526,,409,0,,355,,336,38406,21504,,0,562823,6278,,912,,767,472108,4842,562823,6278 +"2020-07-20","VA",2031,1927,4,104,7201,7201,1158,36,,265,,0,,,,,125,78375,75415,945,0,6127,466,,,93228,,917501,7498,917501,7498,101913,645,,,,0,,0 +"2020-07-20","VI",6,,0,,,,,0,,,6617,30,,,,,,304,,7,0,,,,,,135,,0,6921,37,,,,,6972,34,,0 +"2020-07-20","VT",56,56,0,,,,22,0,,,81504,1326,,,,,,1359,1359,10,0,,,,,,1139,,0,104242,1790,,,,,82863,1336,104242,1790 +"2020-07-20","WA",1447,1447,3,,5063,5063,511,30,,,,0,,,,,42,50343,50278,535,0,,,,,,,941258,17727,941258,17727,,,,,809339,17553,,0 +"2020-07-20","WI",853,846,2,7,4129,4129,367,22,829,110,737191,6289,,,,,,46675,43018,727,0,,,,,,33130,1034736,16414,1034736,16414,,,,,780209,6992,,0 +"2020-07-20","WV",100,,0,,,,77,0,,33,,0,,,,,17,5142,5019,100,0,,,,,,3466,,0,231289,3868,12947,,,,,0,231289,3868 +"2020-07-20","WY",24,,0,,144,144,13,1,,,41927,0,,,68260,,,2187,1790,61,0,,,,,2077,1652,,0,70337,2255,,,,,43605,0,70337,2255 +"2020-07-19","AK",18,18,0,,110,110,27,3,,,,0,,,,,1,1882,,83,0,,,,,,712,,0,173010,4647,,,,,,0,173010,4647 +"2020-07-19","AL",1287,1254,1,33,7782,7782,1524,0,988,,518522,9261,,,,526,,67011,65865,1777,0,,,,,,29736,,0,584387,10946,,,,,584387,10946,,0 +"2020-07-19","AR",357,,4,,2177,2177,453,42,,,386638,5395,,,,307,97,32533,32533,771,0,,,,,,25292,,0,419171,6166,,,,,,0,419171,6166 +"2020-07-19","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-19","AZ",2761,2431,31,152,6632,6632,3136,65,,894,642355,11629,,,,,622,143624,137710,2359,0,,,,,,,,0,1145119,12791,,,209531,,785979,13988,1145119,12791 +"2020-07-19","CA",7685,,90,,,,8398,0,,2107,,0,,,,,,384692,384692,9329,0,,,,,,,,0,6286852,119634,,,,,,0,6286852,119634 +"2020-07-19","CO",1752,1420,0,332,6032,6032,397,13,,,402027,5877,118484,,,,,40142,37041,354,0,8676,,,,,,552916,9246,552916,9246,127160,,,,439068,6220,,0 +"2020-07-19","CT",4396,3519,0,877,10654,10654,66,0,,,,0,,,652922,,,47893,45910,0,0,,,,,59849,8466,,0,714544,3953,,,,,,0,714544,3953 +"2020-07-19","DC",578,,0,,,,91,0,,17,,0,,,,,12,11261,,67,0,,,,,,1886,147765,2810,147765,2810,,,,,106925,1654,,0 +"2020-07-19","DE",523,465,0,58,,,47,0,,9,139476,2148,,,,,,13519,12537,90,0,,,,,17030,7362,211955,3925,211955,3925,,,,,152995,2238,,0 +"2020-07-19","FL",5091,5091,89,,21309,21309,9363,340,,,2652594,58175,,284980,3329053,,,344305,,12385,0,,,12002,,435616,,3526542,101596,3526542,101596,,,297009,,3006290,70769,3775936,98792 +"2020-07-19","GA",3173,,5,,15010,15010,3036,49,2822,,,0,,,,,,143123,143123,3251,0,11782,,,,131008,,,0,1272839,28268,200457,,,,,0,1272839,28268 +"2020-07-19","GU",5,,0,,,,4,0,,,17938,0,,,,,,315,307,0,0,2,,,,,222,,0,18253,0,145,,,,,0,18244,0 +"2020-07-19","HI",24,24,1,,140,140,39,1,,,103281,1620,,,,,,1354,,20,0,,,,,1309,1019,125235,2368,125235,2368,,,,,104635,1640,126454,2386 +"2020-07-19","IA",794,,7,,,,214,0,,75,376768,10946,,34549,,,31,38723,38723,816,0,,,2595,,,27894,,0,415491,11762,,,37180,,416735,13006,,0 +"2020-07-19","ID",119,97,1,22,583,583,224,13,180,33,131884,3131,,,,,,14302,13419,550,0,,,,,,3989,,0,145303,3667,,,,,145303,3667,,0 +"2020-07-19","IL",7488,7295,5,193,,,1356,0,,320,,0,,,,,132,162750,161575,965,0,,,,,,,,0,2244511,32113,,,,,,0,2244511,32113 +"2020-07-19","IN",2822,2629,2,193,7895,7895,786,34,1675,244,570309,11508,,,,,81,56571,,917,0,,,,,60583,,,0,828193,7240,,,,,626880,12425,828193,7240 +"2020-07-19","KS",299,,0,,1453,1453,,0,427,58,227388,0,,,,161,14,21965,,0,0,,,,,,,,0,249353,0,,,,,249353,0,,0 +"2020-07-19","KY",670,666,3,4,2880,2880,511,5,1035,102,,0,,,,,,23161,22095,977,0,,,,,,6874,,0,491658,2513,40309,,,,,0,491658,2513 +"2020-07-19","LA",3543,3433,34,110,,,1469,0,,,977598,22248,,,,,177,91706,91706,3116,0,,,,,,53288,,0,1069304,25364,,,,,,0,1069304,25364 +"2020-07-19","MA",8431,8213,12,218,11717,11717,498,8,,64,927001,13406,,,,,41,113534,106882,296,0,,,,,142539,95390,,0,1376714,7616,,,86165,,1033883,13624,1376714,7616 +"2020-07-19","MD",3377,3247,9,130,11841,11841,449,53,,131,661654,17874,,,,,,78131,78131,925,0,,,,,91615,5344,,0,938311,28899,,,,,739785,18799,938311,28899 +"2020-07-19","ME",117,116,0,1,375,375,10,0,,9,,0,8050,,,,7,3687,3266,41,0,385,,,,4089,3148,,0,136140,2421,8445,,,,,0,136140,2421 +"2020-07-19","MI",6366,6119,2,247,,,680,0,,201,,0,,,1402591,,102,81868,73663,530,0,,,,,102613,55162,,0,1505204,28819,197569,,,,,0,1505204,28819 +"2020-07-19","MN",1581,1541,3,40,4627,4627,258,25,1389,120,806984,16492,,,,,,46204,46204,734,0,,,,,,40001,853188,17226,853188,17226,,,,,,0,,0 +"2020-07-19","MO",1129,,-1,,,,875,0,,,525985,7357,,51704,670037,,86,33094,33094,846,0,,,1829,,37936,,,0,709043,12752,,,53533,,559079,8203,709043,12752 +"2020-07-19","MP",2,,0,,4,4,,0,,,10664,0,,,,,,37,37,0,0,,,,,,29,,0,10701,0,,,,,10697,0,11335,0 +"2020-07-19","MS",1355,1324,9,31,3727,3727,1129,0,,278,335439,0,,,,,132,42638,42130,792,0,,,,,,25932,,0,378077,792,14559,,,,,0,376793,0 +"2020-07-19","MT",37,,0,,165,165,47,1,,,,0,,,,,,2533,,62,0,,,,,,1075,,0,133159,1280,,,,,,0,133159,1280 +"2020-07-19","NC",1634,1634,5,,,,1115,0,,,,0,,,,,,99778,99778,1820,0,,,,,,,,0,1284308,25799,,,,,,0,1284308,25799 +"2020-07-19","ND",96,,2,,302,302,45,7,,,128835,2227,6124,,,,,5009,5009,113,0,229,,,,,4131,250904,5412,250904,5412,6353,,,,131374,2352,257256,5544 +"2020-07-19","NE",301,,0,,1481,1481,113,1,,,209920,1130,,,265190,,,22481,,120,0,,,,,27538,16801,,0,293481,2836,,,,,232654,1247,293481,2836 +"2020-07-19","NH",398,,3,,673,673,17,3,193,,137175,1554,,,,,,6203,,38,0,,,,,,5251,,0,200204,3147,25815,,25466,,143378,1592,200204,3147 +"2020-07-19","NJ",15500,13732,8,1768,21064,21064,766,0,,149,1614354,9718,,,,,65,178522,176783,-7,0,,,,,,,,0,1792876,9711,,,,,,0,1791137,9687 +"2020-07-19","NM",571,,2,,2387,2387,161,23,,,,0,,,,,,16971,,235,0,,,,,,6764,,0,469215,8551,,,,,,0,469215,8551 +"2020-07-19","NV",647,,1,,,,1045,0,,287,354023,5963,,,,,149,35765,35765,1288,0,,,,,,,543833,7176,543833,7176,,,,,387074,7195,490644,10202 +"2020-07-19","NY",25048,,13,,89995,89995,722,0,,160,,0,,,,,96,406807,,502,0,,,,,,,5115470,46204,5115470,46204,,,,,,0,,0 +"2020-07-19","OH",3174,2916,42,258,9555,9555,1065,42,2315,318,,0,,,,,163,74932,70755,1110,0,,,,,82439,51086,,0,1245113,26360,,,,,,0,1245113,26360 +"2020-07-19","OK",451,,0,,2388,2388,547,13,,232,450675,0,,,450675,,,25265,25265,209,0,1854,,,,27903,19466,,0,475940,209,55185,,,,,0,479547,0 +"2020-07-19","OR",257,,3,,1327,1327,242,0,,64,316644,6251,,,490051,,34,14149,,347,0,,,,,26453,3225,,0,516504,10633,,,,,323478,0,516504,10633 +"2020-07-19","PA",7015,,8,,,,703,0,,,926352,13866,,,,,96,101027,98164,786,0,,,,,,76780,1294445,20712,1294445,20712,,,,,1024516,14642,,0 +"2020-07-19","PR",178,81,0,97,,,315,0,,26,255766,0,,,253922,,18,3791,3791,330,0,8272,,,,3966,,,0,259557,330,,,,,,0,258001,0 +"2020-07-19","RI",990,,0,,2088,2088,62,0,,4,161408,0,,,278804,,2,17793,,0,0,,,,,25966,,316540,3213,316540,3213,,,,,179201,0,304770,0 +"2020-07-19","SC",1155,1138,20,17,4182,4182,1593,0,,,507400,13019,45462,,489808,,,69986,69765,2374,0,2764,,,,87357,22553,,0,577386,15393,48226,,,,,0,577165,15388 +"2020-07-19","SD",118,,2,,774,774,63,3,,,90181,796,,,,,,7906,,44,0,,,,,12847,6952,,0,119036,2079,,,,,98087,840,119036,2079 +"2020-07-19","TN",843,812,5,31,3681,3681,1327,32,,,,0,,,1105248,,,78115,77361,1779,0,,,,,91295,44319,,0,1196543,23630,,,,,,0,1196543,23630 +"2020-07-19","TX",3958,,93,,,,10592,0,,,,0,,,,,,325030,325030,7300,0,7752,7019,,,530494,172936,,0,3774010,37156,221259,35788,,,,0,3774010,37156 +"2020-07-19","UT",243,,0,,2033,2033,296,19,543,102,433096,4922,,,518607,222,,34117,,785,0,,350,,331,37938,20915,,0,556545,7040,,907,,762,467266,5370,556545,7040 +"2020-07-19","VA",2027,1923,2,104,7165,7165,1186,18,,249,,0,,,,,127,77430,74490,1057,0,6092,458,,,92712,,910003,12739,910003,12739,101546,636,,,,0,,0 +"2020-07-19","VI",6,,0,,,,,0,,,6587,348,,,,,,297,,14,0,,,,,,135,,0,6884,362,,,,,6938,284,,0 +"2020-07-19","VT",56,56,0,,,,24,0,,,80178,2057,,,,,,1349,1349,10,0,,,,,,1137,,0,102452,2695,,,,,81527,2067,102452,2695 +"2020-07-19","WA",1444,1444,10,,5033,5033,534,49,,,,0,,,,,62,49808,49743,908,0,,,,,,,923531,5211,923531,5211,,,,,791786,24129,,0 +"2020-07-19","WI",851,844,1,7,4107,4107,339,25,826,99,730902,7259,,,,,,45948,42315,849,0,,,,,,32628,1018322,19944,1018322,19944,,,,,773217,8089,,0 +"2020-07-19","WV",100,,0,,,,76,0,,32,,0,,,,,15,5042,4918,148,0,,,,,,3373,,0,227421,3911,12825,,,,,0,227421,3911 +"2020-07-19","WY",24,,0,,143,143,17,1,,,41927,0,,,66065,,,2126,1728,18,0,,,,,2017,1615,,0,68082,246,,,,,43605,0,68082,246 +"2020-07-18","AK",18,18,1,,107,107,26,2,,,,0,,,,,1,1799,,62,0,,,,,,708,,0,168363,2949,,,,,,0,168363,2949 +"2020-07-18","AL",1286,1253,21,33,7782,7782,1463,198,982,,509261,9237,,,,524,,65234,64180,2143,0,,,,,,29736,,0,573441,11306,,,,,573441,11306,,0 +"2020-07-18","AR",353,,0,,2135,2135,464,65,,,381243,5508,,,,304,97,31762,31762,0,0,,,,,,24776,,0,413005,6156,,,,,,0,413005,6156 +"2020-07-18","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-18","AZ",2730,2431,147,152,6567,6567,3238,165,,894,630726,4281,,,,,657,141265,137710,2742,0,,,,,,,,0,1132328,21913,,,206872,,771991,7836,1132328,21913 +"2020-07-18","CA",7595,,120,,,,8502,0,,2125,,0,,,,,,375363,375363,9199,0,,,,,,,,0,6167218,123119,,,,,,0,6167218,123119 +"2020-07-18","CO",1752,1420,1,332,6019,6019,401,25,,,396150,4711,117712,,,,,39788,36698,444,0,8621,,,,,,543670,9049,543670,9049,126333,,,,432848,5149,,0 +"2020-07-18","CT",4396,3519,0,877,10654,10654,66,0,,,,0,,,649030,,,47893,45910,0,0,,,,,59790,8466,,0,710591,12933,,,,,,0,710591,12933 +"2020-07-18","DC",578,,1,,,,88,0,,17,,0,,,,,12,11194,,79,0,,,,,,1877,144955,3348,144955,3348,,,,,105271,1422,,0 +"2020-07-18","DE",523,465,2,58,,,51,0,,8,137328,2055,,,,,,13429,12447,92,0,,,,,16901,7362,208030,5260,208030,5260,,,,,150757,2147,,0 +"2020-07-18","FL",5002,5002,90,,20969,20969,9144,443,,,2594419,40892,,284980,3246327,,,331920,,10173,0,,,12002,,420156,,3424946,80694,3424946,80694,,,297009,,2935521,51276,3677144,76406 +"2020-07-18","GA",3168,,36,,14961,14961,2929,314,2819,,,0,,,,,,139872,139872,4689,0,11530,,,,127550,,,0,1244571,33436,197631,,,,,0,1244571,33436 +"2020-07-18","GU",5,,0,,,,4,0,,,17938,0,,,,,,315,307,1,0,2,,,,,222,,0,18253,1,145,,,,,0,18244,20 +"2020-07-18","HI",23,23,1,,139,139,39,1,,,101661,1768,,,,,,1334,,23,0,,,,,1287,994,122867,2420,122867,2420,,,,,102995,1791,124068,2556 +"2020-07-18","IA",787,,3,,,,210,0,,70,365822,1091,,34104,,,27,37907,37907,185,0,,,2516,,,27820,,0,403729,1276,,,36656,,403729,38,,0 +"2020-07-18","ID",118,96,4,22,570,570,224,16,170,33,128753,1567,,,,,,13752,12883,619,0,,,,,,3827,,0,141636,2155,,,,,141636,2155,,0 +"2020-07-18","IL",7483,7290,18,193,,,1360,0,,326,,0,,,,,119,161785,160610,1276,0,,,,,,,,0,2212398,46099,,,,,,0,2212398,46099 +"2020-07-18","IN",2820,2627,17,193,7861,7861,798,47,1667,245,558801,8979,,,,,84,55654,,841,0,,,,,60196,,,0,820953,17273,,,,,614455,9820,820953,17273 +"2020-07-18","KS",299,,0,,1453,1453,,0,427,58,227388,0,,,,161,14,21965,,0,0,,,,,,,,0,249353,0,,,,,249353,0,,0 +"2020-07-18","KY",667,662,9,5,2875,2875,514,11,1033,109,,0,,,,,,22184,21128,579,0,,,,,,6824,,0,489145,7081,40308,,,,,0,489145,7081 +"2020-07-18","LA",3509,3399,0,110,,,1413,0,,,955350,0,,,,,161,88590,88590,0,0,,,,,,53288,,0,1043940,0,,,,,,0,1043940,0 +"2020-07-18","MA",8419,8201,17,218,11709,11709,499,18,,86,913595,11887,,,,,43,113238,106664,359,0,,,,,142431,95390,,0,1369098,10959,,,85623,,1020259,12064,1369098,10959 +"2020-07-18","MD",3368,3238,9,130,11788,11788,448,60,,137,643780,11935,,,,,,77206,77206,835,0,,,,,90508,5344,,0,909412,18053,,,,,720986,12770,909412,18053 +"2020-07-18","ME",117,116,2,1,375,375,9,0,,8,,0,7989,,,,5,3646,3252,10,0,380,,,,4063,3136,,0,133719,1433,8378,,,,,0,133719,1433 +"2020-07-18","MI",6364,6117,9,247,,,680,0,,201,,0,,,1374740,,102,81338,73180,745,0,,,,,101645,55162,,0,1476385,31024,195843,,,,,0,1476385,31024 +"2020-07-18","MN",1578,1538,5,40,4602,4602,265,39,1377,117,790492,15994,,,,,,45470,45470,457,0,,,,,,39310,835962,16451,835962,16451,,,,,,0,,0 +"2020-07-18","MO",1130,,9,,,,875,0,,,518628,12020,,51143,658406,,86,32248,32248,960,0,,,1817,,36842,,,0,696291,19253,,,52960,,550876,12980,696291,19253 +"2020-07-18","MP",2,,0,,4,4,,0,,,10664,0,,,,,,37,37,0,0,,,,,,29,,0,10701,0,,,,,10697,0,11335,0 +"2020-07-18","MS",1346,1316,14,30,3727,3727,1076,15,,253,335439,4804,,,,,129,41846,41354,1017,0,,,,,,25932,,0,377285,5821,14559,,,,,0,376793,5800 +"2020-07-18","MT",37,,0,,164,164,46,5,,,,0,,,,,,2471,,105,0,,,,,,1075,,0,131879,1475,,,,,,0,131879,1475 +"2020-07-18","NC",1629,1629,23,,,,1154,0,,,,0,,,,,,97958,97958,2481,0,,,,,,,,0,1258509,28220,,,,,,0,1258509,28220 +"2020-07-18","ND",94,,0,,295,295,38,5,,,126608,1925,6114,,,,,4896,4896,115,0,229,,,,,4029,245492,4622,245492,4622,6343,,,,129022,2001,251712,4789 +"2020-07-18","NE",301,,2,,1480,1480,105,27,,,208790,4728,,,262493,,,22361,,227,0,,,,,27399,16665,,0,290645,4832,,,,,231407,4955,290645,4832 +"2020-07-18","NH",395,,0,,670,670,24,0,192,,135621,0,,,,,,6165,,0,0,,,,,,5188,,0,197057,2205,25659,,25093,,141786,0,197057,2205 +"2020-07-18","NJ",15492,13725,15,1767,21064,21064,800,61,,141,1604636,12259,,,,,73,178529,176814,308,0,,,,,,,,0,1783165,12567,,,,,,0,1781450,12522 +"2020-07-18","NM",569,,4,,2364,2364,160,27,,,,0,,,,,,16736,,280,0,,,,,,6736,,0,460664,8366,,,,,,0,460664,8366 +"2020-07-18","NV",646,,9,,,,1006,0,,285,348060,4348,,,,,150,34477,34477,1182,0,,,,,,,536657,14175,536657,14175,,,,,379879,5332,480442,7453 +"2020-07-18","NY",25035,,11,,89995,89995,743,0,,172,,0,,,,,100,406305,,754,0,,,,,,,5069266,69817,5069266,69817,,,,,,0,,0 +"2020-07-18","OH",3132,2875,20,257,9513,9513,1024,68,2311,315,,0,,,,,159,73822,69684,1542,0,,,,,80670,50280,,0,1218753,24141,,,,,,0,1218753,24141 +"2020-07-18","OK",451,,6,,2375,2375,547,86,,232,450675,9771,,,450675,,,25056,25056,916,0,1854,,,,27903,19186,,0,475731,10687,55185,,,,,0,479547,10903 +"2020-07-18","OR",254,,5,,1327,1327,242,16,,64,310393,4956,,,480023,,34,13802,,293,0,,,,,25848,3199,,0,505871,8687,,,,,323478,5234,505871,8687 +"2020-07-18","PA",7007,,15,,,,699,0,,,912486,12574,,,,,93,100241,97388,763,0,,,,,,76183,1273733,20938,1273733,20938,,,,,1009874,13311,,0 +"2020-07-18","PR",178,81,1,97,,,316,0,,29,255766,0,,,253922,,25,3461,3461,189,0,7992,,,,3966,,,0,259227,189,,,,,,0,258001,0 +"2020-07-18","RI",990,,0,,2088,2088,62,0,,4,161408,0,,,278804,,2,17793,,0,0,,,,,25966,,313327,4259,313327,4259,,,,,179201,0,304770,0 +"2020-07-18","SC",1135,1117,39,18,4182,4182,1593,0,,,494381,7066,44686,,477230,,,67612,67396,1552,0,2398,,,,84547,23849,,0,561993,8618,47084,,,,,0,561777,8605 +"2020-07-18","SD",116,,0,,771,771,70,8,,,89385,1201,,,,,,7862,,73,0,,,,,12769,6891,,0,116957,1603,,,,,97247,1274,116957,1603 +"2020-07-18","TN",838,807,23,31,3649,3649,1378,87,,,,0,,,1083781,,,76336,75597,2517,0,,,,,89132,43706,,0,1172913,22922,,,,,,0,1172913,22922 +"2020-07-18","TX",3865,,130,,,,10658,0,,,,0,,,,,,317730,317730,10158,0,7819,6886,,,523803,169581,,0,3736854,67029,224935,34835,,,,0,3736854,67029 +"2020-07-18","UT",243,,8,,2014,2014,251,30,541,91,428174,5990,,,512087,222,,33332,,760,0,,345,,328,37418,20421,,0,549505,8708,,883,,748,461896,6558,549505,8708 +"2020-07-18","VA",2025,1921,12,104,7147,7147,1166,60,,254,,0,,,,,108,76373,73420,940,0,6016,452,,,91652,,897264,16938,897264,16938,100461,627,,,,0,,0 +"2020-07-18","VI",6,,0,,,,,0,,,6239,449,,,,,,283,,20,0,,,,,,133,,0,6522,469,,,,,6654,489,,0 +"2020-07-18","VT",56,56,0,,,,25,0,,,78121,968,,,,,,1339,1339,3,0,,,,,,1125,,0,99757,1338,,,,,79460,971,99757,1338 +"2020-07-18","WA",1434,1434,7,,4984,4984,524,40,,,,0,,,,,46,48900,48849,861,0,,,,,,,918320,9687,918320,9687,,,,,767657,14483,,0 +"2020-07-18","WI",850,843,10,7,4082,4082,315,51,823,90,723643,11446,,,,,,45099,41485,1031,0,,,,,,32004,998378,22253,998378,22253,,,,,765128,12424,,0 +"2020-07-18","WV",100,,0,,,,74,0,,33,,0,,,,,16,4894,4768,111,0,,,,,,3295,,0,223510,5133,12642,,,,,0,223510,5133 +"2020-07-18","WY",24,,0,,142,142,16,2,,,41927,0,,,65836,,,2108,1713,39,0,,,,,2000,1611,,0,67836,328,,,,,43605,0,67836,328 +"2020-07-17","AK",17,17,0,,105,105,32,2,,,,0,,,,,0,1737,,42,0,,,,,,697,,0,165414,2392,,,,,,0,165414,2392 +"2020-07-17","AL",1265,1232,35,33,7584,7584,1433,0,967,,500024,10003,,,,521,,63091,62111,2003,0,,,,,,29736,,0,562135,11956,,,,,562135,11956,,0 +"2020-07-17","AR",353,,12,,2070,2070,464,76,,,375735,5888,,,,298,97,31762,31762,648,0,,,,,,24776,,0,406849,6705,,,,,,0,406849,6705 +"2020-07-17","AS",0,,0,,,,,0,,,1037,0,,,,,,0,0,0,0,,,,,,,,0,1037,0,,,,,,0,1037,0 +"2020-07-17","AZ",2583,2431,91,152,6402,6402,3466,106,,944,626445,11792,,,,,687,138523,137710,3910,0,,,,,,,,0,1110415,20774,,,205682,,764155,15664,1110415,20774 +"2020-07-17","CA",7475,,130,,,,8450,0,,2153,,0,,,,,,366164,366164,9986,0,,,,,,,,0,6044099,128591,,,,,,0,6044099,128591 +"2020-07-17","CO",1751,1419,6,332,5994,5994,394,28,,,391439,5816,116522,,,,,39344,36260,618,0,8169,,,,,,534621,8941,534621,8941,124691,,,,427699,6386,,0 +"2020-07-17","CT",4396,3519,7,877,10654,10654,66,0,,,,0,,,636198,,,47893,45910,143,0,,,,,59702,8466,,0,697658,13211,,,,,,0,697658,13211 +"2020-07-17","DC",577,,3,,,,87,0,,17,,0,,,,,14,11115,,39,0,,,,,,1863,141607,1365,141607,1365,,,,,103849,1791,,0 +"2020-07-17","DE",521,463,0,58,,,55,0,,7,135273,3517,,,,,,13337,12355,223,0,,,,,16743,7315,202770,3513,202770,3513,,,,,148610,3740,,0 +"2020-07-17","FL",4912,4912,130,,20526,20526,8961,372,,,2553527,53684,,284980,3183379,,,321747,,11174,0,,,12002,,407133,,3344252,91724,3344252,91724,,,297009,,2884245,65245,3600738,90949 +"2020-07-17","GA",3132,,28,,14647,14647,2902,301,2781,,,0,,,,,,135183,135183,3908,0,10253,,,,123177,,,0,1211135,21023,193476,,,,,0,1211135,21023 +"2020-07-17","GU",5,,0,,,,4,0,,,17938,241,,,,,,314,306,0,0,2,,,,,214,,0,18252,241,145,,,,,0,18224,221 +"2020-07-17","HI",22,22,0,,138,138,39,1,,,99893,1798,,,,,,1311,,19,0,,,,,1267,975,120447,2417,120447,2417,,,,,101204,1817,121512,2670 +"2020-07-17","IA",784,,6,,,,210,0,,70,364731,5412,,34104,,,32,37722,37722,590,0,,,2514,,,27609,,0,402453,6002,,,36654,,403691,6013,,0 +"2020-07-17","ID",114,93,4,21,554,554,153,28,165,35,127186,2768,,,,,,13133,12295,688,0,,,,,,3676,,0,139481,3426,,,,,139481,3426,,0 +"2020-07-17","IL",7465,7272,13,193,,,1431,0,,309,,0,,,,,128,160509,159334,1427,0,,,,,,,,0,2166299,43692,,,,,,0,2166299,43692 +"2020-07-17","IN",2803,2610,8,193,7814,7814,815,67,1658,258,549822,8344,,,,,80,54813,,733,0,,,,,59214,,,0,803680,17026,,,,,604635,9077,803680,17026 +"2020-07-17","KS",299,,0,,1453,1453,,60,427,58,227388,8947,,,,161,14,21965,,1032,0,,,,,,,,0,249353,9979,,,,,249353,9979,,0 +"2020-07-17","KY",658,653,8,5,2864,2864,452,22,1031,89,,0,,,,,,21605,20607,522,0,,,,,,6772,,0,482064,15025,40203,,,,,0,482064,15025 +"2020-07-17","LA",3509,3399,24,110,,,1413,0,,,955350,17624,,,,,161,88590,88590,2179,0,,,,,,53288,,0,1043940,19803,,,,,,0,1043940,19803 +"2020-07-17","MA",8402,8184,22,218,11691,11691,515,28,,76,901708,12605,,,,,34,112879,106487,298,0,,,,,142262,95390,,0,1358139,17990,,,84539,,1008195,12821,1358139,17990 +"2020-07-17","MD",3359,3227,12,132,11728,11728,434,41,,128,631845,14980,,,,,,76371,76371,707,0,,,,,89541,5286,,0,891359,24171,,,,,708216,15687,891359,24171 +"2020-07-17","ME",115,114,1,1,375,375,12,1,,11,,0,7960,,,,5,3636,3239,38,0,377,,,,4049,3114,,0,132286,2850,8346,,,,,0,132286,2850 +"2020-07-17","MI",6355,6108,7,247,,,680,0,,201,,0,,,1344913,,88,80593,72502,754,0,,,,,100448,53867,,0,1445361,30559,192929,,,,,0,1445361,30559 +"2020-07-17","MN",1573,1533,7,40,4563,4563,252,37,1369,110,774498,13633,,,,,,45013,45013,666,0,,,,,,38568,819511,14299,819511,14299,,,,,,0,,0 +"2020-07-17","MO",1121,,8,,,,875,0,,,506608,7729,,50467,639989,,86,31288,31288,866,0,,,1798,,36023,,,0,677038,12228,,,52265,,537896,8595,677038,12228 +"2020-07-17","MP",2,,0,,4,4,,0,,,10664,0,,,,,,37,37,1,0,,,,,,29,,0,10701,1,,,,,10697,0,11335,0 +"2020-07-17","MS",1332,1303,24,29,3712,3712,1076,37,,253,330635,6532,,,,,129,40829,40358,1032,0,,,,,,25932,,0,371464,7564,14384,,,,,0,370993,7506 +"2020-07-17","MT",37,,2,,159,159,45,9,,,,0,,,,,,2366,,135,0,,,,,,992,,0,130404,2564,,,,,,0,130404,2564 +"2020-07-17","NC",1606,1606,18,,,,1180,0,,,,0,,,,,,95477,95477,2051,0,,,,,,,,0,1230289,22271,,,,,,0,1230289,22271 +"2020-07-17","ND",94,,1,,290,290,36,5,,,124683,1295,5946,,,,,4781,4781,122,0,225,,,,,3903,240870,4021,240870,4021,6171,,,,127021,1506,246923,4140 +"2020-07-17","NE",299,,8,,1453,1453,96,0,,,204062,2812,,,257927,,,22134,,155,0,,,,,27134,16501,,0,285813,3801,,,,,226452,2970,285813,3801 +"2020-07-17","NH",395,,1,,670,670,24,2,192,,135621,3462,,,,,,6165,,52,0,,,,,,5188,,0,194852,3498,25450,,25093,,141786,3514,194852,3498 +"2020-07-17","NJ",15477,13710,19,1767,21003,21003,868,229,,141,1592377,8974,,,,,66,178221,176551,99,0,,,,,,,,0,1770598,9073,,,,,,0,1768928,9024 +"2020-07-17","NM",565,,3,,2337,2337,166,25,,,,0,,,,,,16456,,318,0,,,,,,6654,,0,452298,8930,,,,,,0,452298,8930 +"2020-07-17","NV",637,,11,,,,1000,0,,269,343712,4784,,,,,134,33295,33295,1380,0,,,,,,,522482,12783,522482,12783,,,,,374547,5343,472989,7307 +"2020-07-17","NY",25024,,10,,89995,89995,765,0,,179,,0,,,,,98,405551,,776,0,,,,,,,4999449,78239,4999449,78239,,,,,,0,,0 +"2020-07-17","OH",3112,2858,9,254,9445,9445,1016,121,2305,319,,0,,,,,161,72280,68175,1679,0,,,,,78968,49302,,0,1194612,29192,,,,,,0,1194612,29192 +"2020-07-17","OK",445,,7,,2289,2289,604,71,,247,440904,7528,,,440904,,,24140,24140,699,0,1592,,,,26785,18766,,0,465044,8227,49472,,,,,0,468644,8398 +"2020-07-17","OR",249,,2,,1311,1311,219,21,,63,305437,6732,,,471784,,33,13509,,428,0,,,,,25400,3199,,0,497184,10404,,,,,318244,7133,497184,10404 +"2020-07-17","PA",6992,,19,,,,680,0,,,899912,14717,,,,,98,99478,96651,1032,0,,,,,,75603,1252795,23322,1252795,23322,,,,,996563,15736,,0 +"2020-07-17","PR",177,80,5,97,,,302,0,,34,255766,0,,,253922,,27,3272,3272,153,0,7848,,,,3966,,,0,259038,153,,,,,,0,258001,0 +"2020-07-17","RI",990,,2,,2088,2088,62,4,,4,161408,1731,,,278804,,2,17793,,82,0,,,,,25966,,309068,3774,309068,3774,,,,,179201,1813,304770,3969 +"2020-07-17","SC",1096,1078,26,18,4182,4182,1593,438,,,487315,11434,44524,,470536,,,66060,65857,1977,0,2358,,,,82636,23849,,0,553375,13411,46882,,,,,0,553172,13411 +"2020-07-17","SD",116,,1,,763,763,61,6,,,88184,1842,,,,,,7789,,95,0,,,,,12711,6808,,0,115354,2228,,,,,95973,1937,115354,2228 +"2020-07-17","TN",815,785,19,30,3562,3562,1436,65,,,,0,,,1063927,,,73819,73138,2279,0,,,,,86064,42734,,0,1149991,26953,,,,,,0,1149991,26953 +"2020-07-17","TX",3735,,174,,,,10632,0,,,,0,,,,,,307572,307572,14916,0,7811,6600,,,512180,162191,,0,3669825,76811,224781,33004,,,,0,3669825,76811 +"2020-07-17","UT",235,,1,,1984,1984,256,28,532,96,422184,6359,,,504048,220,,32572,,727,0,,327,,311,36749,19862,,0,540797,8860,,845,,716,455338,7085,540797,8860 +"2020-07-17","VA",2013,1909,6,104,7087,7087,1171,67,,247,,0,,,,,118,75433,72516,1002,0,5279,428,,,90256,,880326,12395,880326,12395,98287,570,,,,0,,0 +"2020-07-17","VI",6,,0,,,,,0,,,5790,754,,,,,,263,,14,0,,,,,,126,,0,6053,768,,,,,6165,712,,0 +"2020-07-17","VT",56,56,0,,,,33,0,,,77153,1180,,,,,,1336,1336,9,0,,,,,,1121,,0,98419,1635,,,,,78489,1189,98419,1635 +"2020-07-17","WA",1427,1427,6,,4944,4944,536,115,,,,0,,,,,45,48039,47998,1000,0,,,,,,,908633,16397,908633,16397,,,,,753174,19288,,0 +"2020-07-17","WI",840,833,2,7,4031,4031,331,63,816,96,712197,12527,,,,,,44068,40507,929,0,,,,,,31258,976125,22748,976125,22748,,,,,752704,13407,,0 +"2020-07-17","WV",100,,1,,,,69,0,,37,,0,,,,,15,4783,4658,126,0,,,,,,3267,,0,218377,2519,12633,,,,,0,218377,2519 +"2020-07-17","WY",24,,0,,140,140,19,9,,,41927,501,,,65532,,,2069,1678,43,0,,,,,1976,1590,,0,67508,1087,,,,,43605,535,67508,1087 +"2020-07-16","AK",17,17,0,,103,103,32,1,,,,0,,,,,0,1695,,64,0,,,,,,688,,0,163022,6929,,,,,,0,163022,6929 +"2020-07-16","AL",1230,1200,19,30,7584,7584,1395,293,950,,490021,8039,,,,516,,61088,60158,2021,0,,,,,,29736,,0,550179,9972,,,,,550179,9972,,0 +"2020-07-16","AR",341,,6,,1994,1994,470,46,,,369847,4368,,,,286,101,31114,31114,817,0,,,,,,24195,,0,400144,4932,,,,,,0,400144,4932 +"2020-07-16","AS",0,,0,,,,,0,,,1037,221,,,,,,0,0,0,0,,,,,,,,0,1037,221,,,,,,0,1037,221 +"2020-07-16","AZ",2492,2353,58,139,6296,6296,3454,193,,918,614653,10045,,,,,657,134613,133838,3259,0,,,,,,,,0,1089641,23346,,,203318,,748491,13307,1089641,23346 +"2020-07-16","CA",7345,,118,,,,8363,0,,2120,,0,,,,,,356178,356178,8544,0,,,,,,,,0,5915508,122232,,,,,,0,5915508,122232 +"2020-07-16","CO",1745,1413,1,332,5966,5966,412,16,,,385623,7562,115211,,,,,38726,35690,571,0,8094,,,,,,525680,10938,525680,10938,123305,,,,421313,8126,,0 +"2020-07-16","CT",4389,3515,9,874,10654,10654,66,102,,,,0,,,623133,,,47750,45771,114,0,,,,,59566,8466,,0,684447,14356,,,,,,0,684447,14356 +"2020-07-16","DC",574,,3,,,,86,0,,24,,0,,,,,14,11076,,50,0,,,,,,1843,140242,2298,140242,2298,,,,,102058,1367,,0 +"2020-07-16","DE",521,463,0,58,,,50,0,,8,131756,1418,,,,,,13114,12131,64,0,,,,,16601,7269,199257,2157,199257,2157,,,,,144870,1482,,0 +"2020-07-16","FL",4782,4782,156,,20154,20154,9112,495,,,2499843,65700,,284980,3106801,,,310573,,13759,0,,,12002,,393209,,3252528,103084,3252528,103084,,,297009,,2819000,79831,3509789,104897 +"2020-07-16","GA",3104,,13,,14346,14346,2841,244,2736,,,0,,,,,,131275,131275,3441,0,10071,,,,119897,,,0,1190112,24861,191262,,,,,0,1190112,24861 +"2020-07-16","GU",5,,0,,,,4,0,,,17697,183,,,,,,314,306,1,0,2,,,,,214,,0,18011,184,145,,,,,0,18003,184 +"2020-07-16","HI",22,22,0,,137,137,40,4,,,98095,1802,,,,,,1292,,28,0,,,,,1246,951,118030,2805,118030,2805,,,,,99387,1830,118842,2567 +"2020-07-16","IA",778,,16,,,,195,0,,65,359319,8298,,33862,,,34,37132,37132,841,0,,,2499,,,27404,,0,396451,9139,,,36397,,397678,9162,,0 +"2020-07-16","ID",110,89,7,21,526,526,153,16,151,35,124418,2222,,,,,,12445,11637,727,0,,,,,,3513,,0,136055,2913,,,,,136055,2913,,0 +"2020-07-16","IL",7452,7251,25,201,,,1434,0,,311,,0,,,,,127,159082,157950,1257,0,,,,,,,,0,2122607,43006,,,,,,0,2122607,43006 +"2020-07-16","IN",2795,2602,10,193,7747,7747,827,61,1643,292,541478,8259,,,,,86,54080,,710,0,,,,,58217,,,0,786654,14941,,,,,595558,8969,786654,14941 +"2020-07-16","KS",299,,0,,1393,1393,,0,418,65,218441,0,,,,159,21,20933,,0,0,,,,,,,,0,239374,0,,,,,239374,0,,0 +"2020-07-16","KY",650,646,5,4,2842,2842,418,19,1030,92,,0,,,,,,21083,20118,406,0,,,,,,5500,,0,467039,8792,40158,,,,,0,467039,8792 +"2020-07-16","LA",3485,3375,24,110,,,1401,0,,,937726,20657,,,,,162,86411,86411,2280,0,,,,,,53288,,0,1024137,22937,,,,,,0,1024137,22937 +"2020-07-16","MA",8380,8163,12,217,11663,11663,557,12,,77,889103,12737,,,,,38,112581,106271,234,0,,,,,141964,95390,,0,1340149,17586,,,83598,,995374,12880,1340149,17586 +"2020-07-16","MD",3347,3215,6,132,11687,11687,436,62,,137,616865,11793,,,,,,75664,75664,648,0,,,,,88713,5286,,0,867188,16891,,,,,692529,12441,867188,16891 +"2020-07-16","ME",114,113,0,1,374,374,13,1,,11,,0,7879,,,,4,3598,3207,20,0,375,,,,4014,3094,,0,129436,2449,8263,,,,,0,129436,2449 +"2020-07-16","MI",6348,6101,18,247,,,680,0,,201,,0,,,1315315,,107,79839,71842,926,0,,,,,99487,53867,,0,1414802,27257,190043,,,,,0,1414802,27257 +"2020-07-16","MN",1566,1526,8,40,4526,4526,249,31,1357,103,760865,14110,,,,,,44347,44347,605,0,,,,,,38290,805212,14715,805212,14715,,,,,,0,,0 +"2020-07-16","MO",1113,,11,,,,875,0,,,498879,10646,,50274,628610,,86,30422,30422,708,0,,,1789,,35179,,,0,664810,17930,,,52063,,529301,11354,664810,17930 +"2020-07-16","MP",2,,0,,4,4,,0,,,10664,0,,,,,,36,36,0,0,,,,,,29,,0,10700,0,,,,,10697,0,11335,0 +"2020-07-16","MS",1308,1283,18,25,3675,3675,1117,46,,247,324103,5813,,,,,125,39797,39384,1230,0,,,,,,25932,,0,363900,7043,14269,,,,,0,363487,6999 +"2020-07-16","MT",35,,1,,150,150,37,5,,,,0,,,,,,2231,,135,0,,,,,,970,,0,127840,4082,,,,,,0,127840,4082 +"2020-07-16","NC",1588,1588,20,,,,1134,0,,,,0,,,,,,93426,93426,2160,0,,,,,,,,0,1208018,23132,,,,,,0,1208018,23132 +"2020-07-16","ND",93,,1,,285,285,38,1,,,123388,1389,5892,,,,,4659,4659,103,0,217,,,,,3796,236849,3971,236849,3971,6109,,,,125515,1508,242783,4189 +"2020-07-16","NE",291,,5,,1453,1453,103,11,,,201250,3224,,,254354,,,21979,,262,0,,,,,26917,16324,,0,282012,4716,,,,,223482,3486,282012,4716 +"2020-07-16","NH",394,,2,,668,668,24,3,192,,132159,1141,,,,,,6113,,22,0,,,,,,5125,,0,191354,3258,25244,,21942,,138272,1163,191354,3258 +"2020-07-16","NJ",15458,13691,31,1767,20774,20774,862,0,,146,1583403,17334,,,,,64,178122,176501,271,0,,,,,,,,0,1761525,17605,,,,,,0,1759904,17557 +"2020-07-16","NM",562,,5,,2312,2312,170,28,,,,0,,,,,,16138,,297,0,,,,,,6578,,0,443368,6363,,,,,,0,443368,6363 +"2020-07-16","NV",626,,8,,,,1051,0,,251,338928,4971,,,,,124,31915,31915,1447,0,,,,,,,509699,14021,509699,14021,,,,,369204,5884,465682,8161 +"2020-07-16","NY",25014,,11,,89995,89995,813,0,,165,,0,,,,,88,404775,,769,0,,,,,,,4921210,72685,4921210,72685,,,,,,0,,0 +"2020-07-16","OH",3103,2849,28,254,9324,9324,1024,115,2280,310,,0,,,,,150,70601,66540,1290,0,,,,,77245,48330,,0,1165420,28709,,,,,,0,1165420,28709 +"2020-07-16","OK",438,,6,,2218,2218,638,48,,235,433376,8864,,,433376,,,23441,23441,628,0,1592,,,,25931,18095,,0,456817,9492,49472,,,,,0,460246,9858 +"2020-07-16","OR",247,,3,,1290,1290,207,36,,53,298705,6054,,,461891,,30,13081,,276,0,,,,,24889,3129,,0,486780,10126,,,,,311111,6309,486780,10126 +"2020-07-16","PA",6973,,16,,,,652,0,,,885195,14211,,,,,95,98446,95632,781,0,,,,,,74818,1229473,21138,1229473,21138,,,,,980827,14970,,0 +"2020-07-16","PR",172,75,1,97,,,280,0,,25,255766,0,,,253922,,14,3119,3119,76,0,7455,,,,3966,,,0,258885,76,,,,,,0,258001,0 +"2020-07-16","RI",988,,1,,2084,2084,64,9,,4,159677,1442,,,274951,,3,17711,,71,0,,,,,25850,,305294,4232,305294,4232,,,,,177388,1513,300801,3868 +"2020-07-16","SC",1070,1053,72,17,3744,3744,1578,0,,,475881,12143,43957,,459649,,,64083,63880,1838,0,2306,,,,80112,23849,,0,539964,13981,46263,,,,,0,539761,13778 +"2020-07-16","SD",115,,4,,757,757,61,5,,,86342,451,,,,,,7694,,42,0,,,,,12610,6737,,0,113126,1522,,,,,94036,493,113126,1522 +"2020-07-16","TN",796,767,13,29,3497,3497,1416,63,,,,0,,,1039811,,,71540,70881,2479,0,,,,,83227,41250,,0,1123038,25985,,,,,,0,1123038,25985 +"2020-07-16","TX",3561,,129,,,,10457,0,,,,0,,,,,,292656,292656,10291,0,7806,6295,,,498756,155937,,0,3593014,84292,224433,31233,,,,0,3593014,84292 +"2020-07-16","UT",234,,1,,1956,1956,236,43,523,89,415825,6680,,,496015,214,,31845,,954,0,,315,,300,35922,19214,,0,531937,9369,,817,,694,448253,7333,531937,9369 +"2020-07-16","VA",2007,1903,15,104,7020,7020,1134,115,,248,,0,,,,,118,74431,71570,904,0,5180,410,,,89268,,867931,13565,867931,13565,96741,548,,,,0,,0 +"2020-07-16","VI",6,,0,,,,,0,,,5036,399,,,,,,249,,6,0,,,,,,120,,0,5285,405,,,,,5453,374,,0 +"2020-07-16","VT",56,56,0,,,,25,0,,,75973,903,,,,,,1327,1327,10,0,,,,,,1111,,0,96784,1406,,,,,77300,913,96784,1406 +"2020-07-16","WA",1421,1421,17,,4829,4829,527,41,,,,0,,,,,53,47039,47016,969,0,,,,,,,892236,15411,892236,15411,,,,,733886,15652,,0 +"2020-07-16","WI",838,831,4,7,3968,3968,308,45,811,88,699670,13371,,,,,,43139,39627,942,0,,,,,,30555,953377,19765,953377,19765,,,,,739297,14271,,0 +"2020-07-16","WV",99,,2,,,,65,0,,29,,0,,,,,13,4657,4535,100,0,,,,,,3128,,0,215858,3641,12503,,,,,0,215858,3641 +"2020-07-16","WY",24,,2,,131,131,18,0,,,41426,497,,,64501,,,2026,1644,41,0,,,,,1920,1540,,0,66421,1138,,,,,43070,536,66421,1138 +"2020-07-15","AK",17,17,0,,102,102,32,4,,,,0,,,,,0,1631,,51,0,,,,,,669,,0,156093,6620,,,,,,0,156093,6620 +"2020-07-15","AL",1211,1183,47,28,7291,7291,1332,168,941,,481982,10148,,,,514,,59067,58225,1812,0,,,,,,29736,,0,540207,11932,,,,,540207,11932,,0 +"2020-07-15","AR",335,,4,,1948,1948,458,76,,,365479,4913,,,,279,94,30297,30297,564,0,,,,,,23523,,0,395212,5707,,,,,,0,395212,5707 +"2020-07-15","AS",0,,0,,,,,0,,,816,0,,,,,,0,0,0,0,,,,,,,,0,816,0,,,,,,0,816,0 +"2020-07-15","AZ",2434,2295,97,139,6103,6103,3493,161,,929,604608,10762,,,,,671,131354,130576,3257,0,,,,,,,,0,1066295,24177,,,201004,,735184,13993,1066295,24177 +"2020-07-15","CA",7227,,140,,,,8353,0,,2110,,0,,,,,,347634,347634,11126,0,,,,,,,,0,5793276,118321,,,,,,0,5793276,118321 +"2020-07-15","CO",1744,1413,6,331,5950,5950,389,-13,,,378061,5757,113658,,,,,38155,35126,469,0,7961,,,,,,514742,8614,514742,8614,121619,,,,413187,6220,,0 +"2020-07-15","CT",4380,3505,8,875,10552,10552,67,0,,,,0,,,608918,,,47636,45653,106,0,,,,,59436,8351,,0,670091,15883,,,,,,0,670091,15883 +"2020-07-15","DC",571,,3,,,,95,0,,24,,0,,,,,15,11026,,80,0,,,,,,1809,137944,4028,137944,4028,,,,,100691,2783,,0 +"2020-07-15","DE",521,463,3,58,,,51,0,,11,130338,1707,,,,,,13050,12069,81,0,,,,,16473,7236,197100,3774,197100,3774,,,,,143388,4025,,0 +"2020-07-15","FL",4626,4626,112,,19659,19659,8217,458,,,2434143,40529,,284980,3019257,,,296814,,9992,0,,,12002,,376345,,3149444,71041,3149444,71041,,,297009,,2739169,50803,3404892,74474 +"2020-07-15","GA",3091,,37,,14102,14102,2786,417,2702,,,0,,,,,,127834,127834,3871,0,9591,,,,116420,,,0,1165251,24490,187083,,,,,0,1165251,24490 +"2020-07-15","GU",5,,0,,,,4,0,,,17514,289,,,,,,313,305,1,0,2,,,,,213,,0,17827,290,142,,,,,0,17819,290 +"2020-07-15","HI",22,22,0,,133,133,31,5,,,96293,1466,,,,,,1264,,21,0,,,,,1219,921,115225,1724,115225,1724,,,,,97557,1487,116275,2166 +"2020-07-15","IA",762,,5,,,,190,0,,62,351021,6462,,33578,,,30,36291,36291,442,0,,,2464,,,27177,,0,387312,6904,,,36077,,388516,6910,,0 +"2020-07-15","ID",103,83,1,20,510,510,153,10,151,35,122196,3314,,,,,,11718,10946,316,0,,,,,,3360,,0,133142,3602,,,,,133142,3602,,0 +"2020-07-15","IL",7427,7226,8,201,,,1454,0,,324,,0,,,,,130,157825,156693,1187,0,,,,,,,,0,2079601,38161,,,,,,0,2079601,38161 +"2020-07-15","IN",2785,2592,10,193,7686,7686,881,53,1634,284,533219,7495,,,,,79,53370,,685,0,,,,,57295,,,0,771713,15645,,,,,586589,8180,771713,15645 +"2020-07-15","KS",299,,11,,1393,1393,,50,418,65,218441,7324,,,,159,21,20933,,875,0,,,,,,,,0,239374,8199,,,,,239374,8199,,0 +"2020-07-15","KY",645,641,10,4,2823,2823,445,21,1028,92,,0,,,,,,20677,19737,454,0,,,,,,5475,,0,458247,3565,39932,,,,,0,458247,3565 +"2020-07-15","LA",3461,3351,16,110,,,1369,0,,,917069,22656,,,,,149,84131,84131,2089,0,,,,,,53288,,0,1001200,24745,,,,,,0,1001200,24745 +"2020-07-15","MA",8368,8152,28,216,11651,11651,580,26,,80,876366,10282,,,,,40,112347,106128,217,0,,,,,141646,95390,,0,1322563,20921,,,82409,,982494,10424,1322563,20921 +"2020-07-15","MD",3341,3209,7,132,11625,11625,447,140,,129,605072,13263,,,,,,75016,75016,756,0,,,,,87891,5238,,0,850297,21535,,,,,680088,14019,850297,21535 +"2020-07-15","ME",114,113,0,1,373,373,12,0,,9,,0,7806,,,,4,3578,3186,12,0,373,,,,3988,3079,,0,126987,2418,8188,,,,,0,126987,2418 +"2020-07-15","MI",6330,6085,4,245,,,543,0,,184,,0,,,1289006,,107,78913,71197,1049,0,,,,,98539,53867,,0,1387545,34363,187617,,,,,0,1387545,34363 +"2020-07-15","MN",1558,1518,10,40,4495,4495,254,43,1353,106,746755,12311,,,,,,43742,43742,572,0,,,,,,38179,790497,12883,790497,12883,,,,,,0,,0 +"2020-07-15","MO",1102,,9,,,,875,0,,,488233,11956,,49667,611600,,86,29714,29714,888,0,,,1779,,34290,,,0,646880,13654,,,51446,,517947,12844,646880,13654 +"2020-07-15","MP",2,,0,,4,4,,0,,,10664,0,,,,,,36,36,3,0,,,,,,29,,0,10700,3,,,,,10697,0,11335,0 +"2020-07-15","MS",1290,1266,18,24,3629,3629,1099,44,,240,318290,5619,,,,,132,38567,38198,1025,0,,,,,,25932,,0,356857,6644,13966,,,,,0,356488,6619 +"2020-07-15","MT",34,,0,,145,145,37,9,,,,0,,,,,,2096,,144,0,,,,,,915,,0,123758,2362,,,,,,0,123758,2362 +"2020-07-15","NC",1568,1568,16,,,,1142,0,,,,0,,,,,,91266,91266,1782,0,,,,,,,,0,1184886,23193,,,,,,0,1184886,23193 +"2020-07-15","ND",92,,0,,284,284,42,4,,,121999,1459,5786,,,,,4556,4556,71,0,211,,,,,3760,232878,2953,232878,2953,5997,,,,124007,1472,238594,3105 +"2020-07-15","NE",286,,-2,,1442,1442,110,11,,,198026,3190,,,249941,,,21717,,318,0,,,,,26617,16205,,0,277296,5158,,,,,219996,3515,277296,5158 +"2020-07-15","NH",392,,1,,665,665,23,76,191,,131018,1058,,,,,,6091,,23,0,,,,,,5101,,0,188096,2870,25073,,21766,,137109,1081,188096,2870 +"2020-07-15","NJ",15427,13660,25,1767,20774,20774,923,142,,151,1566069,20753,,,,,78,177851,176278,413,0,,,,,,,,0,1743920,21166,,,,,,0,1742347,21116 +"2020-07-15","NM",557,,6,,2284,2284,174,23,,,,0,,,,,,15841,,327,0,,,,,,6496,,0,437005,6999,,,,,,0,437005,6999 +"2020-07-15","NV",618,,6,,,,1051,0,,251,333957,3396,,,,,124,30468,30468,849,0,,,,,,,495678,13712,495678,13712,,,,,363320,4005,457521,5140 +"2020-07-15","NY",25003,,9,,89995,89995,831,0,,165,,0,,,,,94,404006,,831,0,,,,,,,4848525,63598,4848525,63598,,,,,,0,,0 +"2020-07-15","OH",3075,2819,6,256,9209,9209,1027,160,2259,316,,0,,,,,146,69311,65287,1316,0,,,,,75395,47303,,0,1136711,20473,,,,,,0,1136711,20473 +"2020-07-15","OK",432,,4,,2170,2170,561,54,,231,424512,4956,,,424512,,,22813,22813,1075,0,1592,,,,24954,17366,,0,447325,6031,49472,,,,,0,450388,5536 +"2020-07-15","OR",244,,7,,1254,1254,235,20,,64,292651,4377,,,452211,,35,12805,,367,0,,,,,24443,3129,,0,476654,7096,,,,,304802,4733,476654,7096 +"2020-07-15","PA",6957,,26,,,,667,0,,,870984,20372,,,,,92,97665,94873,994,0,,,,,,74436,1208335,30244,1208335,30244,,,,,965857,21339,,0 +"2020-07-15","PR",171,75,2,96,,,254,0,,18,255766,0,,,253922,,11,3043,3043,139,0,7336,,,,3966,,,0,258809,139,,,,,,0,258001,0 +"2020-07-15","RI",987,,2,,2075,2075,59,5,,5,158235,1165,,,271199,,3,17640,,52,0,,,,,25734,,301062,3313,301062,3313,,,,,175875,1217,296933,3089 +"2020-07-15","SC",998,984,5,14,3744,3744,1560,0,,,463738,6646,43149,,448876,,,62245,62071,1856,0,2146,,,,77107,23849,,0,525983,8502,45295,,,,,0,525983,8671 +"2020-07-15","SD",111,,2,,752,752,59,8,,,85891,1299,,,,,,7652,,80,0,,,,,12548,6663,,0,111604,1460,,,,,93543,1379,111604,1460 +"2020-07-15","TN",783,755,16,28,3434,3434,1282,56,,,,0,,,1016685,,,69061,68441,2273,0,,,,,80368,39857,,0,1097053,25733,,,,,,0,1097053,25733 +"2020-07-15","TX",3432,,110,,,,10471,0,,,,0,,,,,,282365,282365,10791,0,7652,6011,,,484441,149276,,0,3508722,93615,222342,29393,,,,0,3508722,93615 +"2020-07-15","UT",233,,7,,1913,1913,250,25,515,83,409145,6069,,,487399,214,,30891,,413,0,,288,,275,35169,18593,,0,522568,8465,,758,,645,440920,6698,522568,8465 +"2020-07-15","VA",1992,1882,15,110,6905,6905,1081,88,,246,,0,,,,,113,73527,70669,1084,0,5001,378,,,88265,,854366,13864,854366,13864,94740,507,,,,0,,0 +"2020-07-15","VI",6,,0,,,,,0,,,4637,553,,,,,,243,,37,0,,,,,,112,,0,4880,590,,,,,5079,783,,0 +"2020-07-15","VT",56,56,0,,,,19,0,,,75070,700,,,,,,1317,1317,12,0,,,,,,1104,,0,95378,1180,,,,,76387,712,95378,1180 +"2020-07-15","WA",1404,1404,5,,4788,4788,497,10,,,,0,,,,,55,46070,46048,1093,0,,,,,,,876825,16850,876825,16850,,,,,718234,9960,,0 +"2020-07-15","WI",834,827,1,7,3923,3923,295,31,810,88,686299,13104,,,,,,42197,38727,848,0,,,,,,29923,933612,20310,933612,20310,,,,,725026,13925,,0 +"2020-07-15","WV",97,,0,,,,63,0,,26,,0,,,,,13,4557,4439,150,0,,,,,,2999,,0,212217,3006,12365,,,,,0,212217,3006 +"2020-07-15","WY",22,,0,,131,131,17,3,,,40929,2852,,,63418,,,1985,1605,34,0,,,,,1865,1506,,0,65283,1239,,,,,42534,2982,65283,1239 +"2020-07-14","AK",17,17,0,,98,98,25,2,,,,0,,,,,1,1580,,43,0,,,,,,642,,0,149473,2883,,,,,,0,149473,2883 +"2020-07-14","AL",1164,1136,40,28,7123,7123,1362,378,931,,471834,7775,,,,511,,57255,56441,1710,0,,,,,,25783,,0,528275,9448,,,,,528275,9448,,0 +"2020-07-14","AR",331,,8,,1872,1872,445,36,,,360566,6531,,,,273,91,29733,29733,794,0,,,,,,22844,,0,389505,7103,,,,,,0,389505,7103 +"2020-07-14","AS",0,,0,,,,,0,,,816,0,,,,,,0,0,0,0,,,,,,,,0,816,0,,,,,,0,816,0 +"2020-07-14","AZ",2337,2208,92,129,5942,5942,3517,103,,970,593846,15244,,,,,674,128097,127345,4273,0,,,,,,,,0,1042118,22248,,,199450,,721191,19488,1042118,22248 +"2020-07-14","CA",7087,,47,,,,8145,0,,2083,,0,,,,,,336508,336508,7346,0,,,,,,,,0,5674955,130590,,,,,,0,5674955,130590 +"2020-07-14","CO",1738,1408,11,330,5963,5963,368,22,,,372304,4591,112858,,,,,37686,34663,444,0,7916,,,,,,506128,7297,506128,7297,120774,,,,406967,5025,,0 +"2020-07-14","CT",4372,3497,1,875,10552,10552,66,0,,,,0,,,593199,,,47530,45547,20,0,,,,,59283,8351,,0,654208,14435,,,,,,0,654208,14435 +"2020-07-14","DC",568,,0,,,,91,0,,21,,0,,,,,14,10946,,40,0,,,,,,1774,133916,3696,133916,3696,,,,,97908,1745,,0 +"2020-07-14","DE",518,460,1,58,,,48,0,,10,128631,2147,,,,,,12969,11989,90,0,,,,,16356,7184,193326,2239,193326,2239,,,,,139363,0,,0 +"2020-07-14","FL",4514,4514,133,,19201,19201,8354,384,,,2393614,36475,,284980,2957751,,,286822,,9183,0,,,12002,,363828,,3078403,59489,3078403,59489,,,297009,,2688366,45753,3330418,61947 +"2020-07-14","GA",3054,,28,,13685,13685,2741,209,2662,,,0,,,,,,123963,123963,3394,0,9516,,,,113168,,,0,1140761,24172,186113,,,,,0,1140761,24172 +"2020-07-14","GU",5,,0,,,,3,0,,,17225,195,,,,,,312,304,0,0,2,,,,,210,,0,17537,195,142,,,,,0,17529,195 +"2020-07-14","HI",22,22,3,,128,128,23,3,,,94827,877,,,,,,1243,,23,0,,,,,1198,911,113501,1200,113501,1200,,,,,96070,900,114109,1227 +"2020-07-14","IA",757,,3,,,,186,0,,67,344559,3372,,33342,,,32,35849,35849,320,0,,,2446,,,26952,,0,380408,3692,,,35823,,381606,3732,,0 +"2020-07-14","ID",102,82,0,20,500,500,153,23,144,35,118882,2652,,,,,,11402,10658,500,0,,,,,,3262,,0,129540,3147,,,,,129540,3147,,0 +"2020-07-14","IL",7419,7218,25,201,,,1416,0,,333,,0,,,,,126,156638,155506,707,0,,,,,,,,0,2041440,28446,,,,,,0,2041440,28446 +"2020-07-14","IN",2775,2582,13,193,7633,7633,767,59,1620,266,525724,7352,,,,,73,52685,,648,0,,,,,56338,,,0,756068,16568,,,,,578409,8000,756068,16568 +"2020-07-14","KS",288,,0,,1343,1343,,0,410,,211117,0,,,,160,,20058,,0,0,,,,,,,,0,231175,0,,,,,231175,0,,0 +"2020-07-14","KY",635,631,6,4,2802,2802,449,11,1019,84,,0,,,,,,20223,19349,570,0,,,,,,5389,,0,454682,13626,39661,,,,,0,454682,13626 +"2020-07-14","LA",3445,3337,22,108,,,1362,0,,,894413,20814,,,,,146,82042,82042,2215,0,,,,,,46334,,0,976455,23029,,,,,,0,976455,23029 +"2020-07-14","MA",8340,8125,10,215,11625,11625,560,14,,93,866084,11768,,,,,37,112130,105986,303,0,,,,,141265,94347,,0,1301642,20900,,,81525,,972070,11971,1301642,20900 +"2020-07-14","MD",3334,3202,9,132,11485,11485,415,18,,118,591809,13379,,,,,,74260,74260,733,0,,,,,86973,5238,,0,828762,15415,,,,,666069,14112,828762,15415 +"2020-07-14","ME",114,113,0,1,373,373,17,1,,7,,0,7772,,,,3,3566,3168,8,0,373,,,,3969,3062,,0,124569,1488,8154,,,,,0,124569,1488 +"2020-07-14","MI",6326,6081,5,245,,,543,0,,184,,0,,,1255922,,109,77864,70306,666,0,,,,,97260,53867,,0,1353182,20515,186178,,,,,0,1353182,20515 +"2020-07-14","MN",1548,1510,6,38,4452,4452,236,28,1348,107,734444,8227,,,,,,43170,43170,398,0,,,,,,37749,777614,8625,777614,8625,,,,,,0,,0 +"2020-07-14","MO",1093,,10,,,,811,0,,,476277,8390,,49333,599011,,74,28826,28826,936,0,,,1766,,33231,,,0,633226,12183,,,51099,,505103,9326,633226,12183 +"2020-07-14","MP",2,,0,,4,4,,0,,,10664,-70,,,,,,33,33,0,0,,,,,,19,,0,10697,-70,,,,,10697,0,11335,0 +"2020-07-14","MS",1272,1249,22,23,3585,3585,1059,55,,227,312671,5936,,,,,126,37542,37198,862,0,,,,,,25932,,0,350213,6798,13793,,,,,0,349869,6570 +"2020-07-14","MT",34,,2,,136,136,29,3,,,,0,,,,,,1952,,109,0,,,,,,884,,0,121396,2701,,,,,,0,121396,2701 +"2020-07-14","NC",1552,1552,42,,,,1109,0,,,,0,,,,,,89484,89484,1956,0,,,,,,,,0,1161693,18874,,,,,,0,1161693,18874 +"2020-07-14","ND",92,,1,,280,280,42,3,,,120540,1104,5658,,,,,4485,4485,54,0,208,,,,,3685,229925,2382,229925,2382,5866,,,,122535,1175,235489,2431 +"2020-07-14","NE",288,,3,,1431,1431,101,10,,,194836,4349,,,245118,,,21399,,227,0,,,,,26291,16025,,0,272138,4438,,,,,216481,4580,272138,4438 +"2020-07-14","NH",391,,0,,589,589,24,0,191,,129960,1148,,,,,,6068,,14,0,,,,,,5056,,0,185226,1628,24831,,21638,,136028,1162,185226,1628 +"2020-07-14","NJ",15402,13635,22,1767,20632,20632,888,0,,149,1545316,20453,,,,,79,177438,175915,455,0,,,,,,,,0,1722754,20908,,,,,,0,1721231,20846 +"2020-07-14","NM",551,,3,,2261,2261,171,34,,,,0,,,,,,15514,,223,0,,,,,,6429,,0,430006,5651,,,,,,0,430006,5651 +"2020-07-14","NV",612,,19,,,,983,0,,247,330561,5883,,,,,121,29619,29619,1104,0,,,,,,,481966,9678,481966,9678,,,,,359315,6859,452381,9245 +"2020-07-14","NY",24994,,5,,89995,89995,820,0,,167,,0,,,,,101,403175,,912,0,,,,,,,4784927,60045,4784927,60045,,,,,,0,,0 +"2020-07-14","OH",3069,2813,5,256,9049,9049,1017,134,2223,314,,0,,,,,156,67995,64013,1142,0,,,,,74252,46282,,0,1116238,17330,,,,,,0,1116238,17330 +"2020-07-14","OK",428,,4,,2116,2116,546,53,,234,419556,19519,,,419556,,,21738,21738,993,0,1592,,,,24383,16635,,0,441294,20512,49472,,,,,0,444852,21567 +"2020-07-14","OR",237,,3,,1234,1234,246,54,,67,288274,4272,,,445502,,35,12438,,268,0,,,,,24056,3094,,0,469558,6411,,,,,300069,13872,469558,6411 +"2020-07-14","PA",6931,,20,,,,678,0,,,850612,14880,,,,,95,96671,93906,929,0,,,,,,74436,1178091,21149,1178091,21149,,,,,944518,15771,,0 +"2020-07-14","PR",169,73,2,96,,,206,0,,14,255766,0,,,253922,,9,2904,2904,93,0,7219,,,,3966,,,0,258670,93,,,,,,0,258001,0 +"2020-07-14","RI",985,,1,,2070,2070,69,4,,5,157070,1314,,,268191,,3,17588,,101,0,,,,,25653,,297749,3222,297749,3222,,,,,174658,1415,293844,3088 +"2020-07-14","SC",993,984,21,9,3744,3744,1550,346,,,457092,8159,42970,,442197,,,60389,60220,2221,0,2131,,,,75115,23849,,0,517481,10380,45101,,,,,0,517312,10376 +"2020-07-14","SD",109,,0,,744,744,62,2,,,84592,738,,,,,,7572,,48,0,,,,,12463,6599,,0,110144,830,,,,,92164,786,110144,830 +"2020-07-14","TN",767,740,18,27,3378,3378,1222,94,,,,0,,,993647,,,66788,66220,1514,0,,,,,77673,38272,,0,1071320,17896,,,,,,0,1071320,17896 +"2020-07-14","TX",3322,,87,,,,10569,0,,,,0,,,,,,271574,271574,7261,0,7646,5682,,,468089,142398,,0,3415107,87258,222123,27410,,,,0,3415107,87258 +"2020-07-14","UT",226,,10,,1888,1888,231,38,505,80,403076,7321,,,479641,210,,30478,,448,0,,264,,252,34462,18111,,0,514103,10041,,702,,601,434222,8014,514103,10041 +"2020-07-14","VA",1977,1870,9,107,6817,6817,1127,52,,249,,0,,,,,112,72443,69610,801,0,4893,340,,,87237,,840502,14041,840502,14041,93234,461,,,,0,,0 +"2020-07-14","VI",6,,0,,,,,0,,,4084,0,,,,,,206,,0,0,,,,,,96,,0,4290,0,,,,,4296,0,,0 +"2020-07-14","VT",56,56,0,,,,15,0,,,74370,1031,,,,,,1305,1305,4,0,,,,,,1099,,0,94198,1528,,,,,75675,1035,94198,1528 +"2020-07-14","WA",1399,1399,-39,,4778,4778,445,27,,,,0,,,,,39,44977,44960,344,0,,,,,,,859975,17913,859975,17913,,,,,708274,22269,,0 +"2020-07-14","WI",833,826,6,7,3892,3892,293,42,804,83,673195,13716,,,,,,41349,37906,967,0,,,,,,29275,913302,16257,913302,16257,,,,,711101,14680,,0 +"2020-07-14","WV",97,,1,,,,59,0,,24,,0,,,,,7,4407,4289,148,0,,,,,,2982,,0,209211,3078,12219,,,,,0,209211,3078 +"2020-07-14","WY",22,,1,,128,128,14,4,,,38077,0,,,62227,,,1951,1581,47,0,,,,,1817,1462,,0,64044,1604,,,,,39552,0,64044,1604 +"2020-07-13","AK",17,17,0,,96,96,22,1,,,,0,,,,,0,1537,,59,0,,,,,,620,,0,146590,1115,,,,,,0,146590,1115 +"2020-07-13","AL",1124,1096,3,28,6745,6745,1335,0,919,,464059,6140,,,,505,,55545,54768,1958,0,,,,,,25783,,0,518827,8000,,,,,518827,8000,,0 +"2020-07-13","AR",323,,2,,1836,1836,439,14,,,354035,0,,,,269,89,28939,28939,572,0,,,,,,22106,,0,382402,0,,,,,,0,382402,0 +"2020-07-13","AS",0,,0,,,,,0,,,816,0,,,,,,0,0,0,0,,,,,,,,0,816,0,,,,,,0,816,0 +"2020-07-13","AZ",2245,2122,8,123,5839,5839,3373,44,,936,578602,4897,,,,,671,123824,123101,1357,0,,,,,,,,0,1019870,8500,,,198291,,701703,6240,1019870,8500 +"2020-07-13","CA",7040,,23,,,,7895,0,,2021,,0,,,,,,329162,329162,8358,0,,,,,,,,0,5544365,137766,,,,,,0,5544365,137766 +"2020-07-13","CO",1727,1400,2,327,5941,5941,378,46,,,367713,5261,112040,,,,,37242,34229,329,0,7866,,,,,,498831,8154,498831,8154,119906,,,,401942,5579,,0 +"2020-07-13","CT",4371,3492,23,879,10552,10552,74,0,,,,0,,,578933,,,47510,45523,223,0,,,,,59128,8351,,0,639773,4262,,,,,,0,639773,4262 +"2020-07-13","DC",568,,0,,,,93,0,,25,,0,,,,,16,10906,,59,0,,,,,,1756,130220,3337,130220,3337,,,,,96163,1596,,0 +"2020-07-13","DE",517,459,0,58,,,49,0,,12,126484,1879,,,,,,12879,11898,75,0,,,,,16278,7139,191087,2515,191087,2515,,,,,139363,1954,,0 +"2020-07-13","FL",4381,4381,35,,18817,18817,8051,227,,,2357139,52943,,284980,2908137,,,277639,,12207,0,,,12002,,351831,,3018914,100982,3018914,100982,,,297009,,2642613,65800,3268471,103117 +"2020-07-13","GA",3026,,25,,13476,13476,2600,217,2643,,,0,,,,,,120569,120569,3643,0,9505,,,,110003,,,0,1116589,24919,185935,,,,,0,1116589,24919 +"2020-07-13","GU",5,,0,,,,3,0,,,17030,363,,,,,,312,304,0,0,2,,,,,202,,0,17342,363,142,,,,,0,17334,476 +"2020-07-13","HI",19,19,0,,125,125,,0,,,93950,1230,,,,,,1220,,20,0,,,,,1174,890,112301,1896,112301,1896,,,,,95170,1250,112882,1564 +"2020-07-13","IA",754,,4,,,,186,0,,67,341187,1845,,32986,,,32,35529,35529,458,0,,,2435,,,26664,,0,376716,2303,,,35456,,377874,2311,,0 +"2020-07-13","ID",102,82,0,20,477,477,153,9,142,35,116230,1474,,,,,,10902,10163,397,0,,,,,,3179,,0,126393,1862,,,,,126393,1862,,0 +"2020-07-13","IL",7394,7193,6,201,,,1362,0,,334,,0,,,,,136,155931,154799,883,0,,,,,,,,0,2012994,30012,,,,,,0,2012994,30012 +"2020-07-13","IN",2762,2569,2,193,7574,7574,764,47,1601,255,518372,5337,,,,,71,52037,,425,0,,,,,55304,,,0,739500,4462,,,,,570409,5762,739500,4462 +"2020-07-13","KS",288,,4,,1343,1343,,39,410,,211117,11949,,,,160,,20058,,1447,0,,,,,,,,0,231175,13396,,,,,231175,13396,,0 +"2020-07-13","KY",629,625,4,4,2791,2791,440,12,1017,87,,0,,,,,,19653,18824,264,0,,,,,,5344,,0,441056,3968,39316,,,,,0,441056,3968 +"2020-07-13","LA",3423,3315,7,108,,,1308,0,,,873599,16726,,,,,142,79827,79827,1705,0,,,,,,46334,,0,953426,18431,,,,,,0,953426,18431 +"2020-07-13","MA",8330,8115,5,215,11611,11611,570,3,,89,854316,8433,,,,,46,111827,105783,230,0,,,,,140951,94347,,0,1280742,20035,,,80888,,960099,8587,1280742,20035 +"2020-07-13","MD",3325,3194,6,131,11467,11467,386,47,,108,578430,8148,,,,,,73527,73527,418,0,,,,,86221,5230,,0,813347,11067,,,,,651957,8566,813347,11067 +"2020-07-13","ME",114,113,0,1,372,372,18,1,,8,,0,7756,,,,3,3558,3159,19,0,370,,,,3946,3008,,0,123081,1609,8135,,,,,0,123081,1609 +"2020-07-13","MI",6321,6075,7,246,,,543,0,,184,,0,,,1236229,,113,77198,69722,422,0,,,,,96438,53867,,0,1332667,17362,185189,,,,,0,1332667,17362 +"2020-07-13","MN",1542,1504,2,38,4424,4424,247,25,1338,114,726217,13446,,,,,,42772,42772,491,0,,,,,,37199,768989,13937,768989,13937,,,,,,0,,0 +"2020-07-13","MO",1083,,14,,,,932,0,,,467887,9822,,48749,587188,,89,27890,27890,447,0,,,1746,,32874,,,0,621043,15997,,,50495,,495777,10269,621043,15997 +"2020-07-13","MP",2,,0,,4,4,,0,,,10734,0,,,,,,33,33,0,0,,,,,,19,,0,10767,0,,,,,10697,0,11335,0 +"2020-07-13","MS",1250,1228,1,22,3530,3530,1020,35,,208,306735,7811,,,,,110,36680,36564,393,0,,,,,,25932,,0,343415,8204,13664,,,,,0,343299,9270 +"2020-07-13","MT",32,,3,,133,133,28,5,,,,0,,,,,,1843,,85,0,,,,,,875,,0,118695,4034,,,,,,0,118695,4034 +"2020-07-13","NC",1510,1510,7,,,,1040,0,,,,0,,,,,,87528,87528,1827,0,,,,,,,,0,1142819,27022,,,,,,0,1142819,27022 +"2020-07-13","ND",91,,0,,277,277,43,6,,,119436,1291,5607,,,,,4431,4431,102,0,205,,,,,3653,227543,4285,227543,4285,5812,,,,121360,1346,233058,4535 +"2020-07-13","NE",285,,0,,1421,1421,98,0,,,190487,3382,,,240972,,,21172,,174,0,,,,,26005,15860,,0,267700,5416,,,,,211901,3563,267700,5416 +"2020-07-13","NH",391,,0,,589,589,22,0,191,,128812,1447,,,,,,6054,,30,0,,,,,,5027,,0,183598,2269,24673,,21562,,134866,1477,183598,2269 +"2020-07-13","NJ",15380,13613,19,1767,20632,20632,892,0,,166,1524863,14557,,,,,81,176983,175522,258,0,,,,,,,,0,1701846,14815,,,,,,0,1700385,14781 +"2020-07-13","NM",548,,3,,2227,2227,172,23,,,,0,,,,,,15291,,263,0,,,,,,6363,,0,424355,5998,,,,,,0,424355,5998 +"2020-07-13","NV",593,,0,,,,953,0,,250,324678,4805,,,,,107,28515,28515,832,0,,,,,,,472288,2652,472288,2652,,,,,352456,5657,443136,8735 +"2020-07-13","NY",24989,,10,,89995,89995,792,0,,175,,0,,,,,103,402263,,557,0,,,,,,,4724882,51687,4724882,51687,,,,,,0,,0 +"2020-07-13","OH",3064,2807,6,257,8915,8915,949,73,2201,293,,0,,,,,159,66853,62913,1261,0,,,,,73169,45194,,0,1098908,21711,,,,,,0,1098908,21711 +"2020-07-13","OK",424,,2,,2063,2063,499,31,,186,400037,0,,,400037,,,20745,20745,510,0,1592,,,,22367,15815,,0,420782,510,49472,,,,,0,423285,0 +"2020-07-13","OR",234,,2,,1180,1180,208,0,,56,284002,3670,,,439485,,30,12170,,319,0,,,,,23662,3009,,0,463147,7068,,,,,286197,0,463147,7068 +"2020-07-13","PA",6911,,7,,,,682,0,,,835732,6714,,,,,96,95742,93015,476,0,,,,,,73721,1156942,10808,1156942,10808,,,,,928747,7177,,0 +"2020-07-13","PR",167,71,0,96,,,159,0,,15,255766,0,,,253922,,8,2811,2811,228,0,7199,,,,3966,,,0,258577,228,,,,,,0,258001,0 +"2020-07-13","RI",984,,8,,2066,2066,67,15,,3,155756,6413,,,265238,,4,17487,,175,0,,,,,25518,,294527,1804,294527,1804,,,,,173243,6588,290756,12399 +"2020-07-13","SC",972,961,11,11,3398,3398,1488,0,,,448933,13073,42940,,434198,,,58168,58003,1520,0,2127,,,,72738,20957,,0,507101,14593,45067,,,,,0,506936,14591 +"2020-07-13","SD",109,,0,,742,742,63,4,,,83854,745,,,,,,7524,,25,0,,,,,12426,6543,,0,109314,1669,,,,,91378,770,109314,1669 +"2020-07-13","TN",749,722,8,27,3284,3284,1120,34,,,,0,,,977504,,,65274,64737,3314,0,,,,,75920,36996,,0,1053424,35926,,,,,,0,1053424,35926 +"2020-07-13","TX",3235,,43,,,,10405,0,,,,0,,,,,,264313,264313,5655,0,7542,5285,,,451588,136419,,0,3327849,31418,217734,25258,,,,0,3327849,31418 +"2020-07-13","UT",216,,1,,1850,1850,252,26,487,86,395755,4432,,,470380,208,,30030,,546,0,,204,,195,33682,17728,,0,504062,5943,,608,,517,426208,4824,504062,5943 +"2020-07-13","VA",1968,1861,2,107,6765,6765,1129,21,,243,,0,,,,,105,71642,68814,972,0,4869,321,,,86045,,826461,12538,826461,12538,92985,423,,,,0,,0 +"2020-07-13","VI",6,,0,,,,,0,,,4084,176,,,,,,206,,25,0,,,,,,96,,0,4290,201,,,,,4296,201,,0 +"2020-07-13","VT",56,56,0,,,,10,0,,,73339,714,,,,,,1301,1301,6,0,,,,,,1096,,0,92670,955,,,,,74640,720,92670,955 +"2020-07-13","WA",1438,1438,14,,4751,4751,443,89,,,,0,,,,,35,44633,44616,542,0,,,,,,,842062,18560,842062,18560,,,,,686005,17539,,0 +"2020-07-13","WI",827,820,0,7,3850,3850,283,26,800,85,659479,6127,,,,,,40382,36942,505,0,,,,,,28670,897045,14404,897045,14404,,,,,696421,6621,,0 +"2020-07-13","WV",96,,0,,,,63,0,,22,,0,,,,,8,4259,4143,52,0,,,,,,2825,,0,206133,1499,12057,,,,,0,206133,1499 +"2020-07-13","WY",21,,0,,124,124,17,0,,,38077,0,,,60671,,,1904,1545,42,0,,,,,1769,1372,,0,62440,2229,,,,,39552,0,62440,2229 +"2020-07-12","AK",17,17,0,,95,95,27,2,,,,0,,,,,0,1478,,92,0,,,,,,615,,0,145475,2099,,,,,,0,145475,2099 +"2020-07-12","AL",1121,1093,7,28,6745,6745,1163,0,911,,457919,7846,,,,503,,53587,52908,1640,0,,,,,,25783,,0,510827,9460,,,,,510827,9460,,0 +"2020-07-12","AR",321,,8,,1822,1822,412,42,,,354035,11189,,,,266,84,28367,28367,1564,0,,,,,,21591,,0,382402,12753,,,,,,0,382402,12753 +"2020-07-12","AS",0,,0,,,,,0,,,816,0,,,,,,0,0,0,0,,,,,,,,0,816,0,,,,,,0,816,0 +"2020-07-12","AZ",2237,2114,86,123,5795,5795,3432,45,,922,573705,9645,,,,,631,122467,121758,2537,0,,,,,,,,0,1011370,12589,,,197017,,695463,12170,1011370,12589 +"2020-07-12","CA",7017,,72,,,,7854,0,,2020,,0,,,,,,320804,320804,8460,0,,,,,,,,0,5406599,130904,,,,,,0,5406599,130904 +"2020-07-12","CO",1725,1398,0,327,5895,5895,324,10,,,362452,6940,111195,,,,,36913,33911,322,0,7819,,,,,,490677,9327,490677,9327,119014,,,,396363,7264,,0 +"2020-07-12","CT",4348,3476,0,871,10552,10552,77,0,,,,0,,,574724,,,47287,45308,0,0,,,,,59079,8351,,0,635511,5121,,,,,,0,635511,5121 +"2020-07-12","DC",568,,0,,,,95,0,,30,,0,,,,,17,10847,,46,0,,,,,,1737,126883,2833,126883,2833,,,,,94567,1255,,0 +"2020-07-12","DE",517,459,0,58,,,58,0,,10,124605,3233,,,,,,12804,11823,61,0,,,,,16175,7120,188572,3873,188572,3873,,,,,137409,3294,,0 +"2020-07-12","FL",4346,4346,45,,18590,18590,7542,249,,,2304196,83408,,284980,2819784,,,265432,,15149,0,,,12002,,337795,,2917932,129145,2917932,129145,,,297009,,2576813,99003,3165354,136205 +"2020-07-12","GA",3001,,5,,13259,13259,2512,54,2621,,,0,,,,,,116926,116926,2525,0,9367,,,,106202,,,0,1091670,18697,183094,,,,,0,1091670,18697 +"2020-07-12","GU",5,,0,,,,3,0,,,16667,0,,,,,,312,304,0,0,2,,,,,202,,0,16979,0,142,,,,,0,16858,0 +"2020-07-12","HI",19,19,0,,125,125,,0,,,92720,1644,,,,,,1200,,42,0,,,,,1154,872,110405,1999,110405,1999,,,,,93920,1686,111318,2222 +"2020-07-12","IA",750,,2,,,,177,0,,54,339342,5628,,32894,,,26,35071,35071,424,0,,,2428,,,26234,,0,374413,6052,,,35357,,375563,6060,,0 +"2020-07-12","ID",102,82,1,20,468,468,140,19,139,33,114756,2335,,,,,,10505,9775,577,0,,,,,,3114,,0,124531,2891,,,,,124531,2891,,0 +"2020-07-12","IL",7388,7187,19,201,,,1342,0,,311,,0,,,,,127,155048,153916,954,0,,,,,,,,0,1982982,38894,,,,,,0,1982982,38894 +"2020-07-12","IN",2760,2567,4,193,7527,7527,702,69,1592,237,513035,5968,,,,,68,51612,,533,0,,,,,54984,,,0,735038,6048,,,,,564647,6501,735038,6048 +"2020-07-12","KS",284,,0,,1304,1304,,0,405,,199168,0,,,,160,,18611,,0,0,,,,,,,,0,217779,0,,,,,217779,0,,0 +"2020-07-12","KY",625,621,3,4,2779,2779,370,0,1014,75,,0,,,,,,19389,18562,268,0,,,,,,5322,,0,437088,0,38895,,,,,0,437088,0 +"2020-07-12","LA",3416,3308,13,108,,,1243,0,,,856873,9229,,,,,134,78122,78122,1319,0,,,,,,46334,,0,934995,10548,,,,,,0,934995,10548 +"2020-07-12","MA",8325,8110,15,215,11608,11608,583,8,,93,845883,10947,,,,,43,111597,105629,199,0,,,,,140577,94347,,0,1260707,7040,,,80573,,951512,11119,1260707,7040 +"2020-07-12","MD",3319,3188,9,131,11420,11420,392,67,,114,570282,13472,,,,,,73109,73109,642,0,,,,,85712,5230,,0,802280,21140,,,,,643391,14114,802280,21140 +"2020-07-12","ME",114,113,2,1,371,371,19,3,,9,,0,7733,,,,3,3539,3143,19,0,375,,,,3932,2994,,0,121472,2376,8116,,,,,0,121472,2376 +"2020-07-12","MI",6314,6068,1,246,,,505,0,,174,,0,,,1219379,,99,76776,69338,406,0,,,,,95926,53867,,0,1315305,22354,183784,,,,,0,1315305,22354 +"2020-07-12","MN",1540,1502,3,38,4399,4399,251,33,1335,123,712771,12247,,,,,,42281,42281,710,0,,,,,,36582,755052,12957,755052,12957,,,,,,0,,0 +"2020-07-12","MO",1069,,0,,,,883,0,,,458065,10648,,48363,571520,,80,27443,27443,310,0,,,1745,,32546,,,0,605046,14620,,,50108,,485508,10958,605046,14620 +"2020-07-12","MP",2,,0,,4,4,,0,,,10734,0,,,,,,33,33,2,0,,,,,,19,,0,10767,2,,,,,10697,0,11335,0 +"2020-07-12","MS",1249,1227,19,22,3495,3495,963,0,,202,298924,0,,,,,107,36287,35961,868,0,,,,,,22167,,0,335211,868,13123,,,,,0,334029,0 +"2020-07-12","MT",29,,0,,128,128,26,1,,,,0,,,,,,1758,,81,0,,,,,,865,,0,114661,1302,,,,,,0,114661,1302 +"2020-07-12","NC",1503,1503,4,,,,1070,0,,,,0,,,,,,85701,85701,1908,0,,,,,,,,0,1115797,24483,,,,,,0,1115797,24483 +"2020-07-12","ND",91,,0,,271,271,38,8,,,118145,1537,5607,,,,,4329,4329,91,0,205,,,,,3570,223258,4311,223258,4311,5812,,,,120014,1698,228523,4490 +"2020-07-12","NE",285,,-1,,1421,1421,95,2,,,187105,4028,,,235794,,,20998,,221,0,,,,,25780,15724,,0,262284,5451,,,,,208338,4247,262284,5451 +"2020-07-12","NH",391,,1,,589,589,22,4,191,,127365,1054,,,,,,6024,,33,0,,,,,,5013,,0,181329,3510,24597,,21388,,133389,1087,181329,3510 +"2020-07-12","NJ",15361,13594,16,1767,20632,20632,890,0,,163,1510306,23981,,,,,86,176725,175298,378,0,,,,,,,,0,1687031,24359,,,,,,0,1685604,24320 +"2020-07-12","NM",545,,2,,2204,2204,170,17,,,,0,,,,,,15028,,255,0,,,,,,6322,,0,418357,7603,,,,,,0,418357,7603 +"2020-07-12","NV",593,,1,,,,895,0,,239,319873,5478,,,,,114,27683,27683,845,0,,,,,,,469636,8373,469636,8373,,,,,346799,6461,434401,9374 +"2020-07-12","NY",24979,,5,,89995,89995,801,0,,174,,0,,,,,102,401706,,677,0,,,,,,,4673195,62418,4673195,62418,,,,,,0,,0 +"2020-07-12","OH",3058,2801,22,257,8842,8842,954,72,2185,289,,0,,,,,154,65592,61669,1378,0,,,,,71731,44663,,0,1077197,25575,,,,,,0,1077197,25575 +"2020-07-12","OK",422,,1,,2032,2032,499,40,,186,400037,0,,,400037,,,20235,20235,456,0,1592,,,,22367,15485,,0,420272,456,49472,,,,,0,423285,0 +"2020-07-12","OR",232,,0,,1180,1180,208,0,,56,280332,5016,,,432850,,30,11851,,397,0,,,,,23229,3009,,0,456079,8667,,,,,286197,0,456079,8667 +"2020-07-12","PA",6904,,7,,,,652,0,,,829018,11384,,,,,96,95266,92552,577,0,,,,,,73354,1146134,17126,1146134,17126,,,,,921570,11935,,0 +"2020-07-12","PR",167,71,0,96,,,174,0,,12,255766,0,,,253922,,11,2583,2583,148,0,7071,,,,3966,,,0,258349,148,,,,,,0,258001,0 +"2020-07-12","RI",976,,0,,2051,2051,61,0,,4,149343,0,,,253472,,5,17312,,0,0,,,,,24885,,292723,2934,292723,2934,,,,,166655,0,278357,0 +"2020-07-12","SC",961,950,10,11,3398,3398,1472,0,,,435860,2469,42087,,422425,,,56648,56485,1949,0,2086,,,,69920,20957,,0,492508,4418,44173,,,,,0,492345,4416 +"2020-07-12","SD",109,,0,,738,738,53,0,,,83109,957,,,,,,7499,,45,0,,,,,12373,6522,,0,107645,1463,,,,,90608,1002,107645,1463 +"2020-07-12","TN",741,714,3,27,3250,3250,1184,57,,,,0,,,945516,,,61960,61443,954,0,,,,,71982,35855,,0,1017498,10882,,,,,,0,1017498,10882 +"2020-07-12","TX",3192,,80,,,,10410,0,,,,0,,,,,,258658,258658,8196,0,7521,5098,,,445560,132638,,0,3296431,48145,217536,24416,,,,0,3296431,48145 +"2020-07-12","UT",215,,3,,1824,1824,276,27,486,84,391323,5409,,,464869,207,,29484,,629,0,,192,,183,33250,17303,,0,498119,7519,,596,,505,421384,5952,498119,7519 +"2020-07-12","VA",1966,1859,4,107,6744,6744,1045,37,,228,,0,,,,,101,70670,67830,888,0,4857,311,,,84998,,813923,16007,813923,16007,92695,413,,,,0,,0 +"2020-07-12","VI",6,,0,,,,,0,,,3908,268,,,,,,181,,14,0,,,,,,93,,0,4089,282,,,,,4095,230,,0 +"2020-07-12","VT",56,56,0,,,,17,0,,,72625,801,,,,,,1295,1295,13,0,,,,,,1089,,0,91715,1165,,,,,73920,814,91715,1165 +"2020-07-12","WA",1424,1424,0,,4662,4662,447,0,,,,0,,,,,57,44091,44074,850,0,,,,,,,823502,5382,823502,5382,,,,,668466,0,,0 +"2020-07-12","WI",827,820,-1,7,3824,3824,264,27,800,74,653352,6848,,,,,,39877,36448,797,0,,,,,,28318,882641,17158,882641,17158,,,,,689800,7617,,0 +"2020-07-12","WV",96,,1,,,,56,0,,14,,0,,,,,7,4207,4091,133,0,,,,,,2806,,0,204634,3006,12057,,,,,0,204634,3006 +"2020-07-12","WY",21,,0,,124,124,12,1,,,38077,0,,,58496,,,1862,1506,23,0,,,,,1715,1372,,0,60211,207,,,,,39552,0,60211,207 +"2020-07-11","AK",17,17,0,,93,93,31,3,,,,0,,,,,1,1386,,63,0,,,,,,598,,0,143376,1445,,,,,,0,143376,1445 +"2020-07-11","AL",1114,1086,10,28,6745,6745,1093,3656,904,,450073,8365,,,,496,,51947,51294,1439,0,,,,,,25783,,0,501367,9767,,,,,501367,9767,,0 +"2020-07-11","AR",313,,0,,1780,1780,402,37,,,342846,4237,,,,265,84,26803,26803,0,0,,,,,,20642,,0,369649,4988,,,,,,0,369649,4988 +"2020-07-11","AS",0,,0,,,,,0,,,816,0,,,,,,0,0,0,0,,,,,,,,0,816,0,,,,,,0,816,0 +"2020-07-11","AZ",2151,2030,69,121,5750,5750,3485,91,,899,564060,11741,,,,,620,119930,119233,3038,0,,,,,,,,0,998781,23522,,,194948,,683293,14765,998781,23522 +"2020-07-11","CA",6945,,94,,,,7904,0,,2021,,0,,,,,,312344,312344,8047,0,,,,,,,,0,5275695,99958,,,,,,0,5275695,99958 +"2020-07-11","CO",1725,1398,1,327,5885,5885,324,21,,,355512,5842,110506,,,,,36591,33587,400,0,7780,,,,,,481350,9050,481350,9050,118286,,,,389099,6240,,0 +"2020-07-11","CT",4348,3476,0,871,10552,10552,77,0,,,,0,,,569674,,,47287,45308,0,0,,,,,59014,8351,,0,630390,12281,,,,,,0,630390,12281 +"2020-07-11","DC",568,,0,,,,92,0,,29,,0,,,,,17,10801,,58,0,,,,,,1717,124050,3166,124050,3166,,,,,93312,2169,,0 +"2020-07-11","DE",517,460,0,57,,,65,0,,13,121372,1316,,,,,,12743,11699,91,0,,,,,15987,7002,184699,4637,184699,4637,,,,,134115,1407,,0 +"2020-07-11","FL",4301,4301,98,,18341,18341,7186,425,,,2220788,43312,,284980,2703554,,,250283,,10274,0,,,12002,,318664,,2788787,77508,2788787,77508,,,297009,,2477810,53818,3029149,83896 +"2020-07-11","GA",2996,,31,,13205,13205,2446,268,2610,,,0,,,,,,114401,114401,3190,0,9270,,,,103769,,,0,1072973,18248,180366,,,,,0,1072973,18248 +"2020-07-11","GU",5,,0,,,,3,0,,,16667,111,,,,,,312,304,2,0,2,,,,,202,,0,16979,113,142,,,,,0,16858,0 +"2020-07-11","HI",19,19,0,,125,125,,2,,,91076,1611,,,,,,1158,,28,0,,,,,1114,847,108406,1975,108406,1975,,,,,92234,1639,109096,2087 +"2020-07-11","IA",748,,5,,,,178,0,,56,333714,5450,,32755,,,25,34647,34647,663,0,,,2423,,,26104,,0,368361,6113,,,35213,,369503,6506,,0 +"2020-07-11","ID",101,81,1,20,449,449,122,17,138,33,112421,3771,,,,,,9928,9219,500,0,,,,,,3066,,0,121640,4250,,,,,121640,4250,,0 +"2020-07-11","IL",7369,7168,24,201,,,1398,0,,321,,0,,,,,139,154094,152962,1195,0,,,,,,,,0,1944088,32345,,,,,,0,1944088,32345 +"2020-07-11","IN",2756,2563,8,193,7458,7458,714,0,1577,237,507067,6805,,,,,72,51079,,779,0,,,,,54645,,,0,728990,13575,,,,,558146,7584,728990,13575 +"2020-07-11","KS",284,,0,,1304,1304,,0,405,,199168,0,,,,160,,18611,,0,0,,,,,,,,0,217779,0,,,,,217779,0,,0 +"2020-07-11","KY",622,618,2,4,2779,2779,370,16,1014,75,,0,,,,,,19121,18307,451,0,,,,,,5322,,0,437088,5178,38895,,,,,0,437088,5178 +"2020-07-11","LA",3403,3295,23,108,,,1182,0,,,847644,17032,,,,,121,76803,76803,2167,0,,,,,,46334,,0,924447,19199,,,,,,0,924447,19199 +"2020-07-11","MA",8310,8095,14,215,11600,11600,572,18,,87,834936,7430,,,,,44,111398,105457,288,0,,,,,140469,94347,,0,1253667,10216,,,80061,,940393,7597,1253667,10216 +"2020-07-11","MD",3310,3179,7,131,11353,11353,390,53,,120,556810,7657,,,,,,72467,72467,557,0,,,,,84938,5190,,0,781140,12129,,,,,629277,8214,781140,12129 +"2020-07-11","ME",112,111,1,1,368,368,16,2,,7,,0,7658,,,,4,3520,3131,21,0,369,,,,3912,2972,,0,119096,1532,8035,,,,,0,119096,1532 +"2020-07-11","MI",6313,6067,28,246,,,505,0,,174,,0,,,1197752,,99,76370,68948,685,0,,,,,95199,53867,,0,1292951,27607,182310,,,,,0,1292951,27607 +"2020-07-11","MN",1537,1499,4,38,4366,4366,241,37,1325,121,700524,15466,,,,,,41571,41571,804,0,,,,,,36012,742095,16270,742095,16270,,,,,,0,,0 +"2020-07-11","MO",1069,,18,,,,883,0,,,447417,18591,,47650,556928,,72,27133,27133,1134,0,,,1745,,32518,,,0,590426,13889,,,49395,,474550,19725,590426,13889 +"2020-07-11","MP",2,,0,,4,4,,0,,,10734,0,,,,,,31,31,0,0,,,,,,19,,0,10765,0,,,,,10697,0,11335,0 +"2020-07-11","MS",1230,1208,15,22,3495,3495,963,40,,202,298924,3234,,,,,107,35419,35105,797,0,,,,,,22167,,0,334343,4031,13123,,,,,0,334029,4018 +"2020-07-11","MT",29,,1,,127,127,24,4,,,,0,,,,,,1677,,84,0,,,,,,864,,0,113359,1181,,,,,,0,113359,1181 +"2020-07-11","NC",1499,1499,20,,,,1093,0,,,,0,,,,,,83793,83793,2462,0,,,,,,,,0,1091314,22280,,,,,,0,1091314,22280 +"2020-07-11","ND",91,,2,,263,263,31,3,,,116608,1166,5513,,,,,4238,4238,88,0,203,,,,,3533,218947,4058,218947,4058,5716,,,,118316,1256,224033,4325 +"2020-07-11","NE",286,,2,,1419,1419,95,0,,,183077,2686,,,230616,,,20777,,154,0,,,,,25520,15499,,0,256833,3931,,,,,204091,2842,256833,3931 +"2020-07-11","NH",390,,3,,585,585,20,4,190,,126311,1233,,,,,,5991,,18,0,,,,,,4897,,0,177819,2727,24425,,21186,,132302,1251,177819,2727 +"2020-07-11","NJ",15345,13578,46,1767,20632,20632,872,65,,166,1486325,37795,,,,,87,176347,174959,367,0,,,,,,,,0,1662672,38162,,,,,,0,1661284,38126 +"2020-07-11","NM",543,,4,,2187,2187,158,26,,,,0,,,,,,14773,,224,0,,,,,,6271,,0,410754,7173,,,,,,0,410754,7173 +"2020-07-11","NV",592,,13,,,,918,0,,241,314395,4812,,,,,122,26838,26838,930,0,,,,,,,461263,14654,461263,14654,,,,,340338,5891,425027,8320 +"2020-07-11","NY",24974,,6,,89995,89995,799,0,,177,,0,,,,,100,401029,,730,0,,,,,,,4610777,69203,4610777,69203,,,,,,0,,0 +"2020-07-11","OH",3036,2780,4,256,8770,8770,928,69,2169,299,,0,,,,,155,64214,60328,1358,0,,,,,70017,44101,,0,1051622,24807,,,,,,0,1051622,24807 +"2020-07-11","OK",421,,5,,1992,1992,499,43,,186,400037,8055,,,400037,,,19779,19779,687,0,1592,,,,22367,15136,,0,419816,8742,49472,,,,,0,423285,9088 +"2020-07-11","OR",232,,2,,1180,1180,208,18,,56,275316,4429,,,424705,,30,11454,,266,0,,,,,22707,3009,,0,447412,9641,,,,,286197,4678,447412,9641 +"2020-07-11","PA",6897,,17,,,,646,0,,,817634,12870,,,,,97,94689,92001,813,0,,,,,,72910,1129008,18930,1129008,18930,,,,,909635,13665,,0 +"2020-07-11","PR",167,71,8,96,,,174,0,,12,255766,0,,,253922,,7,2435,2435,84,0,6931,,,,3966,,,0,258201,84,,,,,,0,258001,0 +"2020-07-11","RI",976,,0,,2051,2051,61,0,,4,149343,0,,,253472,,5,17312,,0,0,,,,,24885,,289789,4507,289789,4507,,,,,166655,0,278357,0 +"2020-07-11","SC",951,940,22,11,3398,3398,1396,0,,,433391,10575,42257,,419325,,,54699,54538,2280,0,2055,,,,68604,20956,,0,488090,12855,44312,,,,,0,487929,12840 +"2020-07-11","SD",109,,2,,738,738,65,12,,,82152,1011,,,,,,7454,,53,0,,,,,12298,6470,,0,106182,1955,,,,,89606,1064,106182,1955 +"2020-07-11","TN",738,711,15,27,3193,3193,1184,47,,,,0,,,935689,,,61006,60508,1460,0,,,,,70927,35435,,0,1006616,12502,,,,,,0,1006616,12502 +"2020-07-11","TX",3112,,99,,,,10083,0,,,,0,,,,,,250462,250462,10351,0,7485,4886,,,436458,127880,,0,3248286,86577,214872,23537,,,,0,3248286,86577 +"2020-07-11","UT",212,,5,,1797,1797,269,49,483,84,385914,6210,,,457944,207,,28855,,632,0,,179,,170,32656,16897,,0,490600,8695,,565,,477,415432,6895,490600,8695 +"2020-07-11","VA",1962,1857,4,105,6707,6707,1020,32,,230,,0,,,,,97,69782,66963,851,0,4802,296,,,83832,,797916,16539,797916,16539,91478,398,,,,0,,0 +"2020-07-11","VI",6,,0,,,,,0,,,3640,167,,,,,,167,,14,0,,,,,,92,,0,3807,181,,,,,3865,186,,0 +"2020-07-11","VT",56,56,0,,,,18,0,,,71824,836,,,,,,1282,1282,5,0,,,,,,1066,,0,90550,1198,,,,,73106,841,90550,1198 +"2020-07-11","WA",1424,1424,15,,4662,4662,447,-3,,,,0,,,,,57,43241,43226,866,0,,,,,,,818120,10343,818120,10343,,,,,668466,8136,,0 +"2020-07-11","WI",828,821,7,7,3797,3797,264,31,797,75,646504,11093,,,,,,39080,35679,981,0,,,,,,27909,865483,17659,865483,17659,,,,,682183,12019,,0 +"2020-07-11","WV",95,,0,,,,56,0,,14,,0,,,,,7,4074,3963,91,0,,,,,,2763,,0,201628,4247,11849,,,,,0,201628,4247 +"2020-07-11","WY",21,,0,,123,123,12,2,,,38077,0,,,58300,,,1839,1488,49,0,,,,,1704,1361,,0,60004,204,,,,,39552,0,60004,204 +"2020-07-10","AK",17,17,0,,90,90,30,3,,,,0,,,,,0,1323,,50,0,,,,,,588,,0,141931,6187,,,,,,0,141931,6187 +"2020-07-10","AL",1104,1077,36,27,3089,3089,1201,50,888,,441708,20378,,,,493,,50508,49892,1334,0,,,,,,25783,,0,491600,23846,,,,,491600,23846,,0 +"2020-07-10","AR",313,,4,,1743,1743,402,38,,,338609,0,,,,260,84,26803,26803,751,0,,,,,,20642,,0,364661,0,,,,,,0,364661,0 +"2020-07-10","AS",0,,0,,,,,0,,,816,0,,,,,,0,0,0,0,,,,,,,,0,816,0,,,,,,0,816,0 +"2020-07-10","AZ",2082,1961,44,121,5659,5659,3432,133,,876,552319,11929,,,,,615,116892,116209,4221,0,,,,,,,,0,975259,25796,,,191767,,668528,16110,975259,25796 +"2020-07-10","CA",6851,,140,,,,7896,0,,2005,,0,,,,,,304297,304297,7798,0,,,,,,,,0,5175737,97303,,,,,,0,5175737,97303 +"2020-07-10","CO",1724,1397,18,327,5864,5864,328,33,,,349670,8055,109366,,,,,36191,33189,666,0,7740,,,,,,472300,11375,472300,11375,117106,,,,382859,8698,,0 +"2020-07-10","CT",4348,3476,0,871,10552,10552,77,0,,,,0,,,557519,,,47287,45308,78,0,,,,,58899,8351,,0,618109,12691,,,,,,0,618109,12691 +"2020-07-10","DC",568,,0,,,,96,0,,26,,0,,,,,18,10743,,64,0,,,,,,1703,120884,4961,120884,4961,,,,,91143,3083,,0 +"2020-07-10","DE",517,460,0,57,,,58,0,,11,120056,2382,,,,,,12652,11608,121,0,,,,,15804,6949,180062,2746,180062,2746,,,,,132708,2503,,0 +"2020-07-10","FL",4203,4203,92,,17916,17916,6974,437,,,2177476,52796,,261121,2633526,,,240009,,11250,0,,,10831,,305374,,2711279,84956,2711279,84956,,,271978,,2423992,64356,2945253,89401 +"2020-07-10","GA",2965,,35,,12937,12937,2443,331,2565,,,0,,,,,,111211,111211,4484,0,9169,,,,101160,,,0,1054725,27338,177244,,,,,0,1054725,27338 +"2020-07-10","GU",5,,0,,,,3,0,,,16556,333,,,,,,310,302,1,0,2,,,,,202,,0,16866,334,142,,,,,0,16858,332 +"2020-07-10","HI",19,19,0,,123,123,,1,,,89465,1407,,,,,,1130,,36,0,,,,,1086,840,106431,2245,106431,2245,,,,,90595,1443,107009,1719 +"2020-07-10","IA",743,,4,,,,169,0,,54,328264,6845,,32537,,,26,33984,33984,744,0,,,2410,,,25891,,0,362248,7589,,,34982,,362997,7659,,0 +"2020-07-10","ID",100,80,2,20,432,432,124,21,137,29,108650,2999,,,,,,9428,8740,459,0,,,,,,3022,,0,117390,3432,,,,,117390,3432,,0 +"2020-07-10","IL",7345,7144,16,201,,,1436,0,,306,,0,,,,,155,152899,151767,1327,0,,,,,,,,0,1911743,32987,,,,,,0,1911743,32987 +"2020-07-10","IN",2748,2555,9,193,7458,7458,667,72,1577,217,500262,7545,,,,,87,50300,,725,0,,,,,53858,,,0,715415,12365,,,,,550562,8270,715415,12365 +"2020-07-10","KS",284,,2,,1304,1304,,35,405,,199168,8304,,,,160,,18611,,993,0,,,,,,,,0,217779,9297,,,,,217779,9297,,0 +"2020-07-10","KY",620,616,8,4,2763,2763,409,16,1012,70,,0,,,,,,18670,17890,425,0,,,,,,5258,,0,431910,8651,38638,,,,,0,431910,8651 +"2020-07-10","LA",3380,3272,25,108,,,1117,0,,,830612,22466,,,,,122,74636,74636,2642,0,,,,,,46334,,0,905248,25108,,,,,,0,905248,25108 +"2020-07-10","MA",8296,8081,28,215,11582,11582,632,23,,98,827506,12642,,,,,47,111110,105290,213,0,,,,,140318,94347,,0,1243451,18260,,,79073,,932796,12794,1243451,18260 +"2020-07-10","MD",3303,3172,15,131,11300,11300,385,79,,122,549153,8019,,,,,,71910,71910,463,0,,,,,84290,5157,,0,769011,13298,,,,,621063,8482,769011,13298 +"2020-07-10","ME",111,110,0,1,366,366,15,1,,7,,0,7526,,,,4,3499,3110,13,0,365,,,,3885,2931,,0,117564,2561,7900,,,,,0,117564,2561 +"2020-07-10","MI",6285,6039,14,246,,,505,0,,174,,0,,,1171120,,92,75685,68295,622,0,,,,,94224,52841,,0,1265344,23382,179789,,,,,0,1265344,23382 +"2020-07-10","MN",1533,1495,5,38,4329,4329,227,24,1320,124,685058,19781,,,,,,40767,40767,604,0,,,,,,35442,725825,20385,725825,20385,,,,,,0,,0 +"2020-07-10","MO",1051,,0,,,,886,0,,,428826,0,,46509,544522,,79,25999,25999,0,0,,,1670,,31075,,,0,576537,13212,,,48179,,454825,0,576537,13212 +"2020-07-10","MP",2,,0,,4,4,,0,,,10734,0,,,,,,31,31,0,0,,,,,,19,,0,10765,0,,,,,10697,0,11335,0 +"2020-07-10","MS",1215,1195,11,20,3455,3455,981,41,,205,295690,4477,,,,,103,34622,34321,1031,0,,,,,,22167,,0,330312,5508,13024,,,,,0,330011,5489 +"2020-07-10","MT",28,,3,,123,123,21,3,,,,0,,,,,,1593,,127,0,,,,,,855,,0,112178,3413,,,,,,0,112178,3413 +"2020-07-10","NC",1479,1479,18,,,,1046,0,,,,0,,,,,,81331,81331,1982,0,,,,,,,,0,1069034,23660,,,,,,0,1069034,23660 +"2020-07-10","ND",89,,0,,260,260,33,3,,,115442,1663,5385,,,,,4150,4150,84,0,201,,,,,3496,214889,5338,214889,5338,5586,,,,117060,1702,219708,5566 +"2020-07-10","NE",284,,2,,1419,1419,100,14,,,180391,2981,,,226909,,,20623,,198,0,,,,,25301,15206,,0,252902,4020,,,,,201249,3180,252902,4020 +"2020-07-10","NH",387,,1,,581,581,24,3,189,,125078,1402,,,,,,5973,,21,0,,,,,,4831,,0,175092,2607,24192,,20931,,131051,1423,175092,2607 +"2020-07-10","NJ",15299,13532,31,1767,20567,20567,904,62,,162,1448530,23353,,,,,94,175980,174628,439,0,,,,,,,,0,1624510,23792,,,,,,0,1623158,23741 +"2020-07-10","NM",539,,6,,2161,2161,151,24,,,,0,,,,,,14549,,298,0,,,,,,6181,,0,403581,7700,,,,,,0,403581,7700 +"2020-07-10","NV",579,,8,,,,924,0,,248,309583,4709,,,,,111,25908,25908,1004,0,,,,,,,446609,12392,446609,12392,,,,,334447,5512,416707,8096 +"2020-07-10","NY",24968,,9,,89995,89995,826,0,,178,,0,,,,,92,400299,,786,0,,,,,,,4541574,73558,4541574,73558,,,,,,0,,0 +"2020-07-10","OH",3032,2776,26,256,8701,8701,928,131,2161,289,,0,,,,,151,62856,59000,1525,0,,,,,68284,43435,,0,1026815,24272,,,,,,0,1026815,24272 +"2020-07-10","OK",416,,6,,1949,1949,487,56,,217,391982,8724,,,391982,,,19092,19092,596,0,1465,,,,21345,14648,,0,411074,9320,45013,,,,,0,414197,9597 +"2020-07-10","OR",230,,6,,1162,1162,192,7,,59,270887,5437,,,415524,,25,11188,,371,0,,,,,22247,2977,,0,437771,9937,,,,,281519,5792,437771,9937 +"2020-07-10","PA",6880,,32,,,,653,0,,,804764,17608,,,,,103,93876,91206,1009,0,,,,,,72284,1110078,24552,1110078,24552,,,,,895970,18612,,0 +"2020-07-10","PR",159,64,0,95,,,140,0,,12,255766,0,,,253922,,10,2351,2351,116,0,6786,,,,3966,,,0,258117,116,,,,,,0,258001,0 +"2020-07-10","RI",976,,2,,2051,2051,61,8,,4,149343,1449,,,253472,,5,17312,,69,0,,,,,24885,,285282,3747,285282,3747,,,,,166655,1518,278357,3377 +"2020-07-10","SC",929,922,24,7,3398,3398,1438,308,,,422816,9742,41576,,409221,,,52419,52273,1728,0,2038,,,,65868,20956,,0,475235,11470,43614,,,,,0,475089,11467 +"2020-07-10","SD",107,,6,,726,726,65,8,,,81141,1167,,,,,,7401,,65,0,,,,,12221,6408,,0,104227,1593,,,,,88542,1232,104227,1593 +"2020-07-10","TN",723,697,13,26,3146,3146,1184,58,,,,0,,,924831,,,59546,59085,1955,0,,,,,69283,34740,,0,994114,21838,,,,,,0,994114,21838 +"2020-07-10","TX",3013,,95,,,,10002,0,,,,0,,,,,,240111,240111,9765,0,7480,4564,,,420961,122996,,0,3161709,91404,214114,21750,,,,0,3161709,91404 +"2020-07-10","UT",207,,2,,1748,1748,229,48,477,79,379704,5903,,,450029,205,,28223,,867,0,,158,,150,31876,16261,,0,481905,8343,,500,,428,408537,6566,481905,8343 +"2020-07-10","VA",1958,1853,21,105,6675,6675,1006,50,,234,,0,,,,,102,68931,66095,943,0,4752,266,,,82679,,781377,13457,781377,13457,89599,364,,,,0,,0 +"2020-07-10","VI",6,,0,,,,,0,,,3473,103,,,,,,153,,9,0,,,,,,87,,0,3626,112,,,,,3679,69,,0 +"2020-07-10","VT",56,56,0,,,,11,0,,,70988,1380,,,,,,1277,1277,5,0,,,,,,1066,,0,89352,1979,,,,,72265,1385,89352,1979 +"2020-07-10","WA",1409,1409,15,,4665,4665,460,35,,,,0,,,,,60,42375,42364,972,0,,,,,,,807777,14227,807777,14227,,,,,660330,15258,,0 +"2020-07-10","WI",821,814,5,7,3766,3766,278,40,792,77,635411,11857,,,,,,38099,34753,889,0,,,,,,27329,847824,19676,847824,19676,,,,,670164,12702,,0 +"2020-07-10","WV",95,,0,,,,56,0,,16,,0,,,,,7,3983,3872,157,0,,,,,,2756,,0,197381,3336,11695,,,,,0,197381,3336 +"2020-07-10","WY",21,,0,,121,121,12,0,,,38077,806,,,58106,,,1790,1445,16,0,,,,,1694,1327,,0,59800,926,,,,,39552,853,59800,926 +"2020-07-09","AK",17,17,0,,87,87,28,3,,,,0,,,,,0,1273,,47,0,,,,,,571,,0,135744,2343,,,,,,0,135744,2343 +"2020-07-09","AL",1068,1042,10,26,3039,3039,1135,33,877,,421330,0,,,,490,,49174,48588,2212,0,,,,,,25783,,0,467754,0,,,,,467754,0,,0 +"2020-07-09","AR",309,,8,,1705,1705,394,50,,,338609,9849,,,,284,82,26052,26052,1540,0,,,,,,19992,,0,364661,11389,,,,,,0,364661,11389 +"2020-07-09","AS",0,,0,,,,,0,,,816,0,,,,,,0,0,0,0,,,,,,,,0,816,0,,,,,,0,816,0 +"2020-07-09","AZ",2038,1917,75,121,5526,5526,3437,139,,861,540390,7934,,,,,575,112671,112028,4057,0,,,,,,,,0,949463,24826,,,188864,,652418,11931,949463,24826 +"2020-07-09","CA",6711,,149,,,,7821,0,,1957,,0,,,,,,296499,296499,7031,0,,,,,,,,0,5078434,82259,,,,,,0,5078434,82259 +"2020-07-09","CO",1706,1379,2,327,5831,5831,318,11,,,341615,6029,107836,,,,,35525,32546,409,0,7668,,,,,,460925,9332,460925,9332,115504,,,,374161,6437,,0 +"2020-07-09","CT",4348,3476,5,872,10552,10552,90,141,,,,0,,,544970,,,47209,45224,101,0,,,,,58768,8351,,0,605418,15068,,,,,,0,605418,15068 +"2020-07-09","DC",568,,4,,,,92,0,,26,,0,,,,,14,10679,,37,0,,,,,,1662,115923,1634,115923,1634,,,,,88060,974,,0 +"2020-07-09","DE",517,460,2,57,,,63,0,,12,117674,1102,,,,,,12531,11487,69,0,,,,,15698,6901,177316,2051,177316,2051,,,,,130205,1171,,0 +"2020-07-09","FL",4111,4111,120,,17479,17479,,411,,,2124680,28256,,261121,2558651,,,228759,,8890,0,,,10831,,291210,,2626323,46776,2626323,46776,,,271978,,2359636,37247,2855852,49432 +"2020-07-09","GA",2930,,8,,12606,12606,2322,106,2519,,,0,,,,,,106727,106727,2837,0,9117,,,,97594,,,0,1027387,19864,174915,,,,,0,1027387,19864 +"2020-07-09","GU",5,,0,,,,3,0,,,16223,390,,,,,,309,301,2,0,2,,,,,202,,0,16532,392,142,,,,,0,16526,294 +"2020-07-09","HI",19,19,0,,122,122,,3,,,88058,2033,,,,,,1094,,23,0,,,,,1053,811,104186,2068,104186,2068,,,,,89152,2056,105290,2616 +"2020-07-09","IA",739,,4,,,,168,0,,49,321419,7577,,32139,,,22,33240,33240,731,0,,,2395,,,26340,,0,354659,8308,,,34568,,355338,8332,,0 +"2020-07-09","ID",98,78,4,20,411,411,120,15,133,28,105651,2859,,,,,,8969,8307,430,0,,,,,,2978,,0,113958,3282,,,,,113958,3282,,0 +"2020-07-09","IL",7329,7119,20,210,,,1507,0,,317,,0,,,,,153,151572,150450,1018,0,,,,,,,,0,1878756,36180,,,,,,0,1878756,36180 +"2020-07-09","IN",2739,2546,7,193,7386,7386,686,21,1556,226,492717,5923,,,,,89,49575,,512,0,,,,,53099,,,0,703050,11519,,,,,542292,6435,703050,11519 +"2020-07-09","KS",282,,0,,1269,1269,,0,397,,190864,0,,,,160,,17618,,0,0,,,,,,,,0,208482,0,,,,,208482,0,,0 +"2020-07-09","KY",612,608,4,4,2747,2747,457,10,1007,105,,0,,,,,,18245,17491,326,0,,,,,,4939,,0,423259,8055,38497,,,,,0,423259,8055 +"2020-07-09","LA",3355,3247,16,108,,,1042,0,,,808146,12560,,,,,110,71994,71994,1843,0,,,,,,46334,,0,880140,14403,,,,,,0,880140,14403 +"2020-07-09","MA",8268,8053,25,215,11559,11559,635,42,,103,814864,9471,,,,,42,110897,105138,295,0,,,,,139990,94347,,0,1225191,17740,,,78417,,920002,9648,1225191,17740 +"2020-07-09","MD",3288,3160,13,128,11221,11221,406,37,,139,541134,8887,,,,,,71447,71447,586,0,,,,,83673,5132,,0,755713,15119,,,,,612581,9473,755713,15119 +"2020-07-09","ME",111,110,1,1,365,365,16,2,,7,,0,7474,,,,4,3486,3092,26,0,364,,,,3869,2901,,0,115003,2721,7847,,,,,0,115003,2721 +"2020-07-09","MI",6271,6024,9,247,,,505,0,,174,,0,,,1148490,,93,75063,67683,512,0,,,,,93472,52841,,0,1241962,23909,177549,,,,,0,1241962,23909 +"2020-07-09","MN",1528,1490,5,38,4305,4305,251,33,1312,116,665277,11896,,,,,,40163,40163,574,0,,,,,,35193,705440,12470,705440,12470,,,,,,0,,0 +"2020-07-09","MO",1051,,5,,,,811,0,,,428826,11690,,46509,532133,,75,25999,25999,795,0,,,1670,,30270,,,0,563325,15973,,,48179,,454825,12485,563325,15973 +"2020-07-09","MP",2,,0,,4,4,,4,,,10734,0,,,,,,31,31,0,0,,,,,,19,,0,10765,0,,,,,10697,10697,11335,570 +"2020-07-09","MS",1204,1184,16,20,3414,3414,941,49,,187,291213,7782,,,,,104,33591,33309,703,0,,,,,,22167,,0,324804,8485,12769,,,,,0,324522,10063 +"2020-07-09","MT",25,,2,,120,120,24,3,,,,0,,,,,,1466,,95,0,,,,,,796,,0,108765,2344,,,,,,0,108765,2344 +"2020-07-09","NC",1461,1461,20,,,,1034,0,,,,0,,,,,,79349,79349,2039,0,,,,,,,,0,1045374,18338,,,,,,0,1045374,18338 +"2020-07-09","ND",89,,0,,257,257,30,5,,,113779,1911,5015,,,,,4066,4066,99,0,197,,,,,3464,209551,5806,209551,5806,5212,,,,115358,1953,214142,5977 +"2020-07-09","NE",282,,0,,1405,1405,97,7,,,177410,2563,,,223148,,,20425,,224,0,,,,,25047,15031,,0,248882,4296,,,,,198069,2788,248882,4296 +"2020-07-09","NH",386,,2,,578,578,22,1,164,,123676,1097,,,,,,5952,,20,0,,,,,,4817,,0,172485,2022,23900,,20717,,129628,1117,172485,2022 +"2020-07-09","NJ",15268,13501,25,1767,20505,20505,963,79,,170,1425177,21368,,,,,104,175541,174240,243,0,,,,,,,,0,1600718,21611,,,,,,0,1599417,21569 +"2020-07-09","NM",533,,6,,2137,2137,154,36,,,,0,,,,,,14251,,234,0,,,,,,6118,,0,395881,6194,,,,,,0,395881,6194 +"2020-07-09","NV",571,,18,,,,935,0,,237,304874,5522,,,,,112,24904,24904,603,0,,,,,,,434217,13894,434217,13894,,,,,328935,6529,408611,11979 +"2020-07-09","NY",24959,,15,,89995,89995,851,0,,173,,0,,,,,98,399513,,584,0,,,,,,,4468016,65564,4468016,65564,,,,,,0,,0 +"2020-07-09","OH",3006,2749,15,257,8570,8570,890,81,2146,289,,0,,,,,155,61331,57506,1150,0,,,,,66646,42111,,0,1002543,21678,,,,,,0,1002543,21678 +"2020-07-09","OK",410,,3,,1893,1893,453,89,,215,383258,6328,,,383258,,,18496,18496,603,0,1465,,,,20489,14100,,0,401754,6931,45013,,,,,0,404600,6953 +"2020-07-09","OR",224,,4,,1155,1155,188,14,,57,265450,4149,,,406094,,27,10817,,212,0,,,,,21740,2877,,0,427834,7787,,,,,275727,4340,427834,7787 +"2020-07-09","PA",6848,,36,,,,650,0,,,787156,12778,,,,,102,92867,90202,719,0,,,,,,71507,1085526,19415,1085526,19415,,,,,877358,13465,,0 +"2020-07-09","PR",159,64,0,95,,,147,0,,11,255766,63080,,,253922,,7,2235,2235,64,0,6627,,,,3966,,,0,258001,63144,,,,,,0,258001,63677 +"2020-07-09","RI",974,,3,,2043,2043,55,0,,4,147894,1828,,,250190,,3,17243,,39,0,,,,,24790,,281535,3477,281535,3477,,,,,165137,1867,274980,3270 +"2020-07-09","SC",905,898,21,7,3090,3090,1433,0,,,413074,8143,40782,,399939,,,50691,50548,1782,0,2004,,,,63683,19181,,0,463765,9925,42786,,,,,0,463622,9921 +"2020-07-09","SD",101,,3,,718,718,61,9,,,79974,990,,,,,,7336,,94,0,,,,,12154,6331,,0,102634,1456,,,,,87310,1084,102634,1456 +"2020-07-09","TN",710,684,25,26,3088,3088,1135,65,,,,0,,,905208,,,57591,57153,1605,0,,,,,67068,33609,,0,972276,21736,,,,,,0,972276,21736 +"2020-07-09","TX",2918,,105,,,,9689,0,,,,0,,,,,,230346,230346,9782,0,7466,4263,,,404239,118326,,0,3070305,93998,213728,20047,,,,0,3070305,93998 +"2020-07-09","UT",205,,4,,1700,1700,207,22,472,74,373801,5340,,,442418,204,,27356,,601,0,,158,,150,31144,15661,,0,473562,7660,,432,,371,401971,6030,473562,7660 +"2020-07-09","VA",1937,1832,32,105,6625,6625,956,48,,215,,0,,,,,93,67988,65191,613,0,4689,251,,,81692,,767920,16721,767920,16721,87835,349,,,,0,,0 +"2020-07-09","VI",6,,0,,,,,0,,,3370,97,,,,,,144,,22,0,,,,,,81,,0,3514,119,,,,,3610,157,,0 +"2020-07-09","VT",56,56,0,,,,15,0,,,69608,940,,,,,,1272,1272,14,0,,,,,,1054,,0,87373,1394,,,,,70880,954,87373,1394 +"2020-07-09","WA",1394,1394,10,,4630,4630,468,48,,,,0,,,,,59,41403,41394,1062,0,,,,,,,793550,12499,793550,12499,,,,,645072,9548,,0 +"2020-07-09","WI",816,809,2,7,3726,3726,284,43,787,76,623554,12404,,,,,,37210,33908,800,0,,,,,,26792,828148,17991,828148,17991,,,,,657462,13158,,0 +"2020-07-09","WV",95,,0,,,,50,0,,15,,0,,,,,6,3826,3718,119,0,,,,,,2718,,0,194045,3283,11385,,,,,0,194045,3283 +"2020-07-09","WY",21,,0,,121,121,12,1,,,37271,1193,,,57207,,,1774,1428,34,0,,,,,1667,1313,,0,58874,1167,,,,,38699,1243,58874,1167 +"2020-07-08","AK",17,17,0,,84,84,30,4,,,,0,,,,,0,1226,,40,0,,,,,,563,,0,133401,1981,,,,,,0,133401,1981 +"2020-07-08","AL",1058,1032,25,26,3006,3006,1116,45,871,,421330,5751,,,,486,,46962,46424,1177,0,,,,,,22082,,0,467754,6912,,,,,467754,6912,,0 +"2020-07-08","AR",301,,9,,1655,1655,358,51,,,328760,2617,,,,254,89,24512,24512,0,0,,,,,,18725,,0,353272,2876,,,,,,0,353272,2876 +"2020-07-08","AS",0,,0,,,,,0,,,816,120,,,,,,0,0,0,0,,,,,,,,0,816,120,,,,,,0,816,120 +"2020-07-08","AZ",1963,1842,36,121,5387,5387,3421,115,,871,532456,8753,,,,,570,108614,108031,3520,0,,,,,,,,0,924637,26150,,,186602,,640487,12212,924637,26150 +"2020-07-08","CA",6562,,114,,,,7705,0,,1976,,0,,,,,,289468,289468,11694,0,,,,,,,,0,4996175,99805,,,,,,0,4996175,99805 +"2020-07-08","CO",1704,1377,8,327,5820,5820,335,79,,,335586,5177,106623,,,,,35116,32138,452,0,7617,,,,,,451593,7131,451593,7131,114240,,,,367724,5579,,0 +"2020-07-08","CT",4343,3471,5,872,10411,10411,88,0,,,,0,,,530071,,,47108,45129,75,0,,,,,58618,8210,,0,590350,14562,,,,,,0,590350,14562 +"2020-07-08","DC",564,,3,,,,86,0,,30,,0,,,,,17,10642,,73,0,,,,,,1625,114289,3912,114289,3912,,,,,87086,1929,,0 +"2020-07-08","DE",515,458,1,57,,,57,0,,11,116572,301,,,,,,12462,11418,48,0,,,,,15598,6851,175265,1276,175265,1276,,,,,129034,349,,0 +"2020-07-08","FL",3991,3991,48,,17068,17068,,335,,,2096424,41024,,261121,2519880,,,219869,,9947,0,,,10831,,280774,,2579547,67436,2579547,67436,,,271978,,2322389,51122,2806420,71182 +"2020-07-08","GA",2922,,23,,12500,12500,2215,274,2502,,,0,,,,,,103890,103890,3420,0,9032,,,,94821,,,0,1007523,21610,171858,,,,,0,1007523,21610 +"2020-07-08","GU",5,,0,,,,3,0,,,15833,225,,,,,,307,299,4,0,2,,,,,202,,0,16140,229,142,,,,,0,16232,329 +"2020-07-08","HI",19,19,0,,119,119,,0,,,86025,1382,,,,,,1071,,41,0,,,,,1032,797,102118,1539,102118,1539,,,,,87096,1423,102674,1786 +"2020-07-08","IA",735,,10,,,,165,0,,44,313842,6573,,31910,,,23,32509,32509,480,0,,,2382,,,25974,,0,346351,7053,,,34326,,347006,7066,,0 +"2020-07-08","ID",94,74,0,20,396,396,118,9,130,26,102792,2303,,,,,,8539,7884,487,0,,,,,,2932,,0,110676,2751,,,,,110676,2751,,0 +"2020-07-08","IL",7309,7099,36,210,,,1385,0,,320,,0,,,,,153,150554,149432,980,0,,,,,,,,0,1842576,32742,,,,,,0,1842576,32742 +"2020-07-08","IN",2732,2539,15,193,7365,7365,667,32,1551,217,486794,5345,,,,,87,49063,,437,0,,,,,52338,,,0,691531,12892,,,,,535857,5782,691531,12892 +"2020-07-08","KS",282,,2,,1269,1269,,34,397,,190864,5546,,,,160,,17618,,717,0,,,,,,,,0,208482,6263,,,,,208482,6263,,0 +"2020-07-08","KY",608,604,6,4,2737,2737,453,29,1007,111,,0,,,,,,17919,17202,400,0,,,,,,4912,,0,415204,5987,36247,,,,,0,415204,5987 +"2020-07-08","LA",3339,3231,20,108,,,1022,0,,,795586,16251,,,,,105,70151,70151,1888,0,,,,,,46334,,0,865737,18139,,,,,,0,865737,18139 +"2020-07-08","MA",8243,8028,30,215,11517,11517,662,28,,102,805393,8971,,,,,49,110602,104961,264,0,,,,,139637,94347,,0,1207451,19505,,,77150,,910354,9133,1207451,19505 +"2020-07-08","MD",3275,3149,9,126,11184,11184,398,73,,136,532247,8265,,,,,,70861,70861,465,0,,,,,83057,5085,,0,740594,11934,,,,,603108,8730,740594,11934 +"2020-07-08","ME",110,109,0,1,363,363,22,3,,8,,0,7398,,,,5,3460,3065,20,0,361,,,,3841,2856,,0,112282,1991,7768,,,,,0,112282,1991 +"2020-07-08","MI",6262,6015,11,247,,,505,0,,174,,0,,,1125452,,93,74551,67237,651,0,,,,,92601,52841,,0,1218053,23735,174840,,,,,0,1218053,23735 +"2020-07-08","MN",1523,1485,9,38,4272,4272,265,20,1302,122,653381,7267,,,,,,39589,39589,456,0,,,,,,34902,692970,7723,692970,7723,,,,,,0,,0 +"2020-07-08","MO",1046,,4,,,,694,0,,,417136,6417,,45835,517004,,74,25204,25204,575,0,,,1661,,29458,,,0,547352,7957,,,47496,,442340,6992,547352,7957 +"2020-07-08","MP",2,,0,,,,,0,,,10734,2547,,,,,,31,31,0,0,,,,,,19,,0,10765,2547,,,,,,0,10765,2548 +"2020-07-08","MS",1188,1168,30,20,3365,3365,883,50,,190,283431,0,,,,,101,32888,32620,674,0,,,,,,22167,,0,316319,674,12628,,,,,0,314459,0 +"2020-07-08","MT",23,,0,,117,117,22,0,,,,0,,,,,,1371,,44,0,,,,,,759,,0,106421,1094,,,,,,0,106421,1094 +"2020-07-08","NC",1441,1441,21,,,,994,0,,,,0,,,,,,77310,77310,1435,0,,,,,,,,0,1027036,14821,,,,,,0,1027036,14821 +"2020-07-08","ND",89,,-4,,252,252,26,4,,,111868,1409,4985,,,,,3967,3967,73,0,197,,,,,3447,203745,3509,203745,3509,5182,,,,113405,1509,208165,3669 +"2020-07-08","NE",282,,-1,,1398,1398,102,29,,,174847,1820,,,219153,,,20201,,155,0,,,,,24763,14927,,0,244586,3368,,,,,195281,1982,244586,3368 +"2020-07-08","NH",384,,2,,577,577,24,3,164,,122579,613,,,,,,5932,,18,0,,,,,,4758,,0,170463,1893,23657,,20509,,128511,631,170463,1893 +"2020-07-08","NJ",15243,13476,52,1767,20426,20426,935,180,,175,1403809,17554,,,,,142,175298,174039,215,0,,,,,,,,0,1579107,17769,,,,,,0,1577848,17715 +"2020-07-08","NM",527,,8,,2101,2101,154,45,,,,0,,,,,,14017,,290,0,,,,,,6051,,0,389687,4445,,,,,,0,389687,4445 +"2020-07-08","NV",553,,5,,,,876,0,,233,299352,6591,,,,,109,24301,24301,516,0,,,,,,,420323,12297,420323,12297,,,,,322406,7478,396632,12776 +"2020-07-08","NY",24944,,20,,89995,89995,841,0,,166,,0,,,,,97,398929,,692,0,,,,,,,4402452,57585,4402452,57585,,,,,,0,,0 +"2020-07-08","OH",2991,2737,21,254,8489,8489,890,106,2127,289,,0,,,,,155,60181,56384,1277,0,,,,,65244,42111,,0,980865,19359,,,,,,0,980865,19359 +"2020-07-08","OK",407,,3,,1804,1804,458,63,,209,376930,5132,,,376930,,,17893,17893,673,0,1465,,,,19871,13538,,0,394823,5805,45013,,,,,0,397647,5766 +"2020-07-08","OR",220,,5,,1141,1141,191,16,,55,261301,3975,,,398694,,22,10605,,210,0,,,,,21353,2877,,0,420047,6858,,,,,271387,4159,420047,6858 +"2020-07-08","PA",6812,,25,,,,649,0,,,774378,15575,,,,,104,92148,89515,849,0,,,,,,70953,1066111,21084,1066111,21084,,,,,863893,16399,,0 +"2020-07-08","PR",159,64,2,95,,,127,0,,9,192686,0,,,191601,,10,2171,2171,24,0,6574,,,,2627,,,0,194857,24,,,,,,0,194324,0 +"2020-07-08","RI",971,,2,,2043,2043,56,7,,5,146066,0,,,247012,,5,17204,,0,0,,,,,24698,,278058,3513,278058,3513,,,,,163270,0,271710,0 +"2020-07-08","SC",884,876,38,8,3090,3090,1404,0,,,404931,6992,39977,,392228,,,48909,48770,1557,0,1990,,,,61473,19181,,0,453840,8549,41967,,,,,0,453701,8548 +"2020-07-08","SD",98,,0,,709,709,54,10,,,78984,782,,,,,,7242,,79,0,,,,,12058,6280,,0,101178,1822,,,,,86226,861,101178,1822 +"2020-07-08","TN",685,660,20,25,3023,3023,1160,73,,,,0,,,885538,,,55986,55567,2472,0,,,,,65002,32736,,0,950540,29739,,,,,,0,950540,29739 +"2020-07-08","TX",2813,,98,,,,9610,0,,,,0,,,,,,220564,220564,9979,0,7437,3952,,,385981,113284,,0,2976307,92285,212321,18430,,,,0,2976307,92285 +"2020-07-08","UT",201,,7,,1678,1678,236,25,465,76,368461,5006,,,435526,203,,26755,,722,0,,140,,134,30376,15178,,0,465902,7029,,399,,344,395941,5707,465902,7029 +"2020-07-08","VA",1905,1799,24,106,6577,6577,971,65,,230,,0,,,,,98,67375,64583,635,0,4612,232,,,80487,,751199,12900,751199,12900,85623,330,,,,0,,0 +"2020-07-08","VI",6,,0,,,,,0,,,3273,90,,,,,,122,,6,0,,,,,,80,,0,3395,96,,,,,3453,99,,0 +"2020-07-08","VT",56,56,0,,,,14,0,,,68668,661,,,,,,1258,1258,2,0,,,,,,1049,,0,85979,1315,,,,,69926,663,85979,1315 +"2020-07-08","WA",1384,1384,14,,4582,4582,425,38,,,,0,,,,,52,40341,40332,985,0,,,,,,,781051,15397,781051,15397,,,,,635524,6268,,0 +"2020-07-08","WI",814,807,2,7,3683,3683,274,44,787,74,611150,10138,,,,,,36410,33154,645,0,,,,,,26305,810157,16655,810157,16655,,,,,644304,10736,,0 +"2020-07-08","WV",95,,0,,,,48,0,,13,,0,,,,,7,3707,3602,246,0,,,,,,2648,,0,190762,2864,10929,,,,,0,190762,2864 +"2020-07-08","WY",21,,1,,120,120,13,1,,,36078,0,,,56080,,,1740,1404,29,0,,,,,1627,1291,,0,57707,1071,,,,,37456,0,57707,1071 +"2020-07-07","AK",17,17,1,,80,80,25,2,,,,0,,,,,1,1186,,18,0,,,,,,560,,0,131420,7667,,,,,,0,131420,7667 +"2020-07-07","AL",1033,1007,26,26,2961,2961,1078,47,858,,415579,5362,,,,479,,45785,45263,907,0,,,,,,22082,,0,460842,6250,,,,,460842,6250,,0 +"2020-07-07","AR",292,,0,,1604,1604,369,29,,,326143,5428,,,,247,81,24512,24512,259,0,,,,,,17834,,0,350396,5867,,,,,,0,350396,5867 +"2020-07-07","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-07-07","AZ",1927,1807,117,120,5272,5272,3356,84,,869,523703,7303,,,,,544,105094,104572,3653,0,,,,,,,,0,898487,25193,,,183595,,628275,10932,898487,25193 +"2020-07-07","CA",6448,,111,,,,7499,0,,1984,,0,,,,,,277774,277774,6090,0,,,,,,,,0,4896370,103017,,,,,,0,4896370,103017 +"2020-07-07","CO",1696,1372,5,324,5741,5741,335,150,,,330409,4026,105866,,,,,34664,31736,407,0,7551,,,,,,444462,6190,444462,6190,113417,,,,362145,4394,,0 +"2020-07-07","CT",4338,3466,0,872,10411,10411,83,0,,,,0,,,515709,,,47033,45056,57,0,,,,,58440,8210,,0,575788,15206,,,,,,0,575788,15206 +"2020-07-07","DC",561,,0,,,,90,0,,25,,0,,,,,20,10569,,54,0,,,,,,1574,110377,2727,110377,2727,,,,,85157,1825,,0 +"2020-07-07","DE",514,457,2,57,,,56,0,,15,116271,1385,,,,,,12414,11370,121,0,,,,,15433,6815,173989,5631,173989,5631,,,,,128685,1506,,0 +"2020-07-07","FL",3943,3943,63,,16733,16733,,381,,,2055400,27907,,261121,2461715,,,209922,,7299,0,,,10831,,268024,,2512111,43362,2512111,43362,,,271978,,2271267,35330,2735238,29161 +"2020-07-07","GA",2899,,21,,12226,12226,2096,307,2471,,,0,,,,,,100470,100470,3406,0,8976,,,,91700,,,0,985913,21323,171020,,,,,0,985913,21323 +"2020-07-07","GU",5,,0,,,,3,0,,,15608,360,,,,,,303,295,2,0,2,,,,,184,,0,15911,362,142,,,,,0,15903,362 +"2020-07-07","HI",19,19,0,,119,119,,1,,,84643,608,,,,,,1030,,7,0,,,,,993,781,100579,666,100579,666,,,,,85673,615,100888,778 +"2020-07-07","IA",725,,2,,,,165,0,,44,307269,3464,,31695,,,20,32029,32029,372,0,,,2375,,,25594,,0,339298,3836,,,34103,,339940,3960,,0 +"2020-07-07","ID",94,74,1,20,387,387,105,18,130,25,100489,1757,,,,,,8052,7436,319,0,,,,,,2907,,0,107925,2049,,,,,107925,2049,,0 +"2020-07-07","IL",7273,7063,37,210,,,1385,0,,320,,0,,,,,153,149574,148452,587,0,,,,,,,,0,1809834,26994,,,,,,0,1809834,26994 +"2020-07-07","IN",2717,2524,19,193,7333,7333,655,48,1540,213,481449,3188,,,,,76,48626,,295,0,,,,,51467,,,0,678639,14657,,,,,530075,3483,678639,14657 +"2020-07-07","KS",280,,0,,1235,1235,,0,384,,185318,0,,,,158,,16901,,0,0,,,,,,,,0,202219,0,,,,,202219,0,,0 +"2020-07-07","KY",602,598,9,4,2708,2708,421,9,1003,110,,0,,,,,,17519,16864,367,0,,,,,,4841,,0,409217,9502,35979,,,,,0,409217,9502 +"2020-07-07","LA",3319,3211,23,108,,,1025,0,,,779335,32017,,,,,109,68263,68263,1936,0,,,,,,43026,,0,847598,33953,,,,,,0,847598,33953 +"2020-07-07","MA",8213,7998,15,215,11489,11489,621,20,,104,796422,7142,,,,,50,110338,104799,201,0,,,,,139336,93157,,0,1187946,19712,,,76090,,901221,7282,1187946,19712 +"2020-07-07","MD",3266,3140,20,126,11111,11111,404,15,,145,523982,6525,,,,,,70396,70396,492,0,,,,,82431,5036,,0,728660,9879,,,,,594378,7017,728660,9879 +"2020-07-07","ME",110,109,1,1,360,360,22,1,,9,,0,7375,,,,4,3440,3050,17,0,359,,,,3827,2816,,0,110291,1343,7743,,,,,0,110291,1343 +"2020-07-07","MI",6251,6005,30,246,,,505,0,,174,,0,,,1102611,,99,73900,66627,631,0,,,,,91707,52841,,0,1194318,17071,173395,,,,,0,1194318,17071 +"2020-07-07","MN",1514,1477,3,37,4252,4252,267,33,1295,121,646114,4990,,,,,,39133,39133,564,0,,,,,,34377,685247,5554,685247,5554,,,,,,0,,0 +"2020-07-07","MO",1042,,14,,,,676,0,,,410719,7830,,45544,509876,,67,24629,24629,773,0,,,1636,,28652,,,0,539395,10560,,,47180,,435348,8603,539395,10560 +"2020-07-07","MP",2,,0,,,,,0,,,8187,0,,,,,,31,31,0,0,,,,,,19,,0,8218,0,,,,,,0,8217,0 +"2020-07-07","MS",1158,1139,44,19,3315,3315,885,35,,173,283431,0,,,,,95,32214,31966,957,0,,,,,,22167,,0,315645,957,12628,,,,,0,314459,0 +"2020-07-07","MT",23,,0,,117,117,22,5,,,,0,,,,,,1327,,78,0,,,,,,716,,0,105327,2401,,,,,,0,105327,2401 +"2020-07-07","NC",1420,1420,22,,,,989,0,,,,0,,,,,,75875,75875,1346,0,,,,,,,,0,1012215,17129,,,,,,0,1012215,17129 +"2020-07-07","ND",93,,4,,248,248,24,3,,,110459,726,4931,,,,,3894,3894,51,0,197,,,,,3413,200236,1926,200236,1926,5128,,,,111896,819,204496,1981 +"2020-07-07","NE",283,,-1,,1369,1369,109,0,,,173027,1216,,,216032,,,20046,,117,0,,,,,24522,14759,,0,241218,1720,,,,,193299,1332,241218,1720 +"2020-07-07","NH",382,,1,,574,574,25,4,163,,121966,2628,,,,,,5914,,17,0,,,,,,4706,,0,168570,1698,23431,,20455,,127880,2645,168570,1698 +"2020-07-07","NJ",15191,13425,53,1766,20246,20246,903,9,,169,1386255,10657,,,,,142,175083,173878,306,0,,,,,,,,0,1561338,10963,,,,,,0,1560133,10924 +"2020-07-07","NM",519,,4,,2056,2056,133,23,,,,0,,,,,,13727,,220,0,,,,,,5986,,0,385242,5002,,,,,,0,385242,5002 +"2020-07-07","NV",548,,11,,,,849,0,,236,292761,4189,,,,,112,23785,23785,876,0,,,,,,,408026,12815,408026,12815,,,,,314928,4933,383856,6969 +"2020-07-07","NY",24924,,11,,89995,89995,836,0,,160,,0,,,,,103,398237,,588,0,,,,,,,4344867,56736,4344867,56736,,,,,,0,,0 +"2020-07-07","OH",2970,2718,43,252,8383,8383,849,134,2101,289,,0,,,,,140,58904,55150,948,0,,,,,64308,41438,,0,961506,15577,,,,,,0,961506,15577 +"2020-07-07","OK",404,,5,,1741,1741,426,52,,182,371798,23009,,,371798,,,17220,17220,858,0,1465,,,,19241,13005,,0,389018,23867,45013,,,,,0,391881,25592 +"2020-07-07","OR",215,,0,,1125,1125,183,56,,61,257326,3355,,,392174,,26,10395,,165,0,,,,,21015,2846,,0,413189,5080,,,,,267228,16591,413189,5080 +"2020-07-07","PA",6787,,33,,,,637,0,,,758803,15783,,,,,101,91299,88691,995,0,,,,,,70437,1045027,26707,1045027,26707,,,,,847494,16769,,0 +"2020-07-07","PR",157,62,2,95,,,122,0,,19,192686,0,,,191601,,7,2147,2147,76,0,6567,,,,2627,,,0,194833,76,,,,,,0,194324,0 +"2020-07-07","RI",969,,9,,2036,2036,55,17,,4,146066,1515,,,247012,,4,17204,,41,0,,,,,24698,,274545,2887,274545,2887,,,,,163270,1556,271710,3416 +"2020-07-07","SC",846,838,19,8,3090,3090,1324,208,,,397939,4462,39706,,385557,,,47352,47214,972,0,1929,,,,59596,19181,,0,445291,5434,41635,,,,,0,445153,5429 +"2020-07-07","SD",98,,1,,699,699,64,7,,,78202,1004,,,,,,7163,,58,0,,,,,11969,6190,,0,99356,406,,,,,85365,1062,99356,406 +"2020-07-07","TN",665,640,12,25,2950,2950,1112,53,,,,0,,,858616,,,53514,53116,1359,0,,,,,62185,31827,,0,920801,16564,,,,,,0,920801,16564 +"2020-07-07","TX",2715,,60,,,,9286,0,,,,0,,,,,,210585,210585,10028,0,7408,3657,,,367848,108485,,0,2884022,84843,210574,16999,,,,0,2884022,84843 +"2020-07-07","UT",194,,4,,1653,1653,248,49,455,84,363455,5427,,,429266,200,,26033,,564,0,,121,,115,29607,14764,,0,458873,7810,,362,,312,390234,6108,458873,7810 +"2020-07-07","VA",1881,1775,28,106,6512,6512,902,77,,221,,0,,,,,105,66740,63950,638,0,4553,214,,,79499,,738299,10798,738299,10798,84585,311,,,,0,,0 +"2020-07-07","VI",6,,0,,,,,0,,,3183,65,,,,,,116,,4,0,,,,,,79,,0,3299,69,,,,,3354,123,,0 +"2020-07-07","VT",56,56,0,,,,13,0,,,68007,748,,,,,,1256,1256,3,0,,,,,,1039,,0,84664,1100,,,,,69263,751,84664,1100 +"2020-07-07","WA",1370,1370,11,,4544,4544,407,62,,,,0,,,,,37,39356,39349,301,0,,,,,,,765654,17656,765654,17656,,,,,629256,16550,,0 +"2020-07-07","WI",812,805,9,7,3639,3639,254,37,777,69,601012,12099,,,,,,35765,32556,535,0,,,,,,25758,793502,9387,793502,9387,,,,,633568,12594,,0 +"2020-07-07","WV",95,,0,,,,41,0,,13,,0,,,,,6,3461,3354,19,0,,,,,,2535,,0,187898,2548,10709,,,,,0,187898,2548 +"2020-07-07","WY",20,,0,,119,119,10,0,,,36078,2385,,,55040,,,1711,1378,36,0,,,,,1596,1274,,0,56636,1306,,,,,37456,2530,56636,1306 +"2020-07-06","AK",16,16,0,,78,78,19,3,,,,0,,,,,3,1168,,27,0,,,,,,548,,0,123753,0,,,,,,0,123753,0 +"2020-07-06","AL",1007,984,0,23,2914,2914,1025,5,843,,410217,4284,,,,473,,44878,44375,925,0,,,,,,22082,,0,454592,5209,,,,,454592,5209,,0 +"2020-07-06","AR",292,,6,,1575,1575,337,39,,,320715,5031,,,,245,81,24253,24253,1044,0,,,,,,17834,,0,344529,5636,,,,,,0,344529,5636 +"2020-07-06","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-07-06","AZ",1810,1695,1,115,5188,5188,3212,27,,839,516400,10127,,,,,533,101441,100943,3352,0,,,,,,,,0,873294,8494,,,183109,,617343,13459,873294,8494 +"2020-07-06","CA",6337,,6,,,,7278,0,,1937,,0,,,,,,271684,271684,5699,0,,,,,,,,0,4793353,113215,,,,,,0,4793353,113215 +"2020-07-06","CO",1691,1367,-10,324,5591,5591,327,26,,,326383,4793,105213,,,,,34257,31368,192,0,7509,,,,,,438272,6571,438272,6571,112722,,,,357751,4993,,0 +"2020-07-06","CT",4338,3466,3,872,10411,10411,69,0,,,,0,,,500688,,,46976,44997,259,0,,,,,58275,8210,,0,560582,4316,,,,,,0,560582,4316 +"2020-07-06","DC",561,,2,,,,88,0,,23,,0,,,,,16,10515,,33,0,,,,,,1553,107650,1657,107650,1657,,,,,83332,957,,0 +"2020-07-06","DE",512,455,0,57,,,54,0,,15,114886,3073,,,,,,12293,11249,165,0,,,,,15257,6778,168358,3742,168358,3742,,,,,127179,3238,,0 +"2020-07-06","FL",3880,3880,48,,16352,16352,,151,,,2027493,27405,,261121,2438200,,,202623,,6237,0,,,10831,,262521,,2468749,40509,2468749,40509,,,271978,,2235937,33842,2706077,43654 +"2020-07-06","GA",2878,,18,,11919,11919,1962,144,2441,,,0,,,,,,97064,97064,1548,0,8942,,,,89088,,,0,964590,13080,170796,,,,,0,964590,13080 +"2020-07-06","GU",5,,0,,,,2,0,,,15248,582,,,,,,301,293,13,0,2,,,,,179,,0,15549,595,142,,,,,0,15541,1616 +"2020-07-06","HI",19,19,0,,118,118,,0,,,84035,709,,,,,,1023,,24,0,,,,,983,777,99913,1135,99913,1135,,,,,85058,733,100110,828 +"2020-07-06","IA",723,,2,,,,151,0,,41,303805,2686,,31492,,,15,31657,31657,304,0,,,2366,,,25121,,0,335462,2990,,,33891,,335980,2989,,0 +"2020-07-06","ID",93,73,0,20,369,369,85,10,124,22,98732,1836,,,,,,7733,7144,363,0,,,,,,2886,,0,105876,2201,,,,,105876,2201,,0 +"2020-07-06","IL",7236,7026,6,210,,,1395,0,,321,,0,,,,,151,148987,147865,614,0,,,,,,,,0,1782840,21134,,,,,,0,1782840,21134 +"2020-07-06","IN",2698,2505,5,193,7285,7285,613,31,1526,229,478261,4547,,,,,88,48331,,323,0,,,,,50513,,,0,663982,3406,,,,,526592,4870,663982,3406 +"2020-07-06","KS",280,,3,,1235,1235,,16,384,,185318,9676,,,,158,,16901,,982,0,,,,,,,,0,202219,10658,,,,,202219,10658,,0 +"2020-07-06","KY",593,589,8,4,2699,2699,433,14,1000,109,,0,,,,,,17152,16525,776,0,,,,,,4785,,0,399715,4663,35756,,,,,0,399715,4663 +"2020-07-06","LA",3296,3188,8,108,,,964,0,,,747318,10090,,,,,109,66327,66327,1101,0,,,,,,43026,,0,813645,11191,,,,,,0,813645,11191 +"2020-07-06","MA",8198,7983,15,215,11469,11469,603,6,,99,789280,7569,,,,,51,110137,104659,163,0,,,,,139011,93157,,0,1168234,16979,,,75795,,893939,7726,1168234,16979 +"2020-07-06","MD",3246,3121,3,125,11096,11096,403,25,,142,517457,7127,,,,,,69904,69904,272,0,,,,,81953,5029,,0,718781,10937,,,,,587361,7399,718781,10937 +"2020-07-06","ME",109,108,0,1,359,359,21,0,,9,,0,7363,,,,4,3423,3034,8,0,358,,,,3814,2787,,0,108948,1571,7730,,,,,0,108948,1571 +"2020-07-06","MI",6221,5975,3,246,,,505,0,,174,,0,,,1086094,,92,73269,66173,328,0,,,,,91153,52841,,0,1177247,12581,172386,,,,,0,1177247,12581 +"2020-07-06","MN",1511,1474,3,37,4219,4219,258,49,1290,125,641124,5245,,,,,,38569,38569,433,0,,,,,,33907,679693,5678,679693,5678,,,,,,0,,0 +"2020-07-06","MO",1028,,0,,,,740,0,,,402889,6816,,45220,499619,,73,23856,23856,420,0,,,1628,,28348,,,0,528835,104621,,,46848,,426745,7236,528835,104621 +"2020-07-06","MP",2,,0,,,,,0,,,8187,0,,,,,,31,31,0,0,,,,,,19,,0,8218,0,,,,,,0,8217,0 +"2020-07-06","MS",1114,1096,3,18,3280,3280,825,12,,165,283431,4190,,,,,98,31257,31028,357,0,,,,,,22167,,0,314688,4547,12628,,,,,0,314459,4760 +"2020-07-06","MT",23,,0,,112,112,20,0,,,,0,,,,,,1249,,37,0,,,,,,678,,0,102926,2820,,,,,,0,102926,2820 +"2020-07-06","NC",1398,1398,2,,,,982,0,,,,0,,,,,,74529,74529,1546,0,,,,,,,,0,995086,18885,,,,,,0,995086,18885 +"2020-07-06","ND",89,,0,,245,245,22,3,,,109733,421,4886,,,,,3843,3843,33,0,194,,,,,3350,198310,1219,198310,1219,5080,,,,111077,570,202515,1239 +"2020-07-06","NE",284,,0,,1369,1369,101,1,,,171811,1710,,,214455,,,19929,,102,0,,,,,24379,14641,,0,239498,1270,,,,,191967,1816,239498,1270 +"2020-07-06","NH",381,,5,,570,570,25,1,163,,119338,1446,,,,,,5897,,40,0,,,,,,4684,,0,166872,2200,23280,,20395,,125235,1486,166872,2200 +"2020-07-06","NJ",15138,13373,19,1765,20237,20237,861,0,,187,1375598,14360,,,,,152,174777,173611,233,0,,,,,,,,0,1550375,14593,,,,,,0,1549209,14569 +"2020-07-06","NM",515,,2,,2033,2033,129,27,,,,0,,,,,,13507,,251,0,,,,,,5902,,0,380240,5186,,,,,,0,380240,5186 +"2020-07-06","NV",537,,3,,,,748,0,,201,288572,3293,,,,,114,22909,22909,491,0,,,,,,,395211,2948,395211,2948,,,,,309995,3909,376887,4997 +"2020-07-06","NY",24913,,9,,89995,89995,817,0,,170,,0,,,,,103,397649,,518,0,,,,,,,4288131,54328,4288131,54328,,,,,,0,,0 +"2020-07-06","OH",2927,2677,16,250,8249,8249,837,77,2077,267,,0,,,,,140,57956,54232,805,0,,,,,63513,40813,,0,945929,13364,,,,,,0,945929,13364 +"2020-07-06","OK",399,,1,,1689,1689,391,4,,165,348789,0,,,348789,,,16362,16362,434,0,1171,,,,16721,12432,,0,365151,434,34490,,,,,0,366289,0 +"2020-07-06","OR",215,,2,,1069,1069,173,0,,52,253971,8875,,,387359,,25,10230,,300,0,,,,,20750,2759,,0,408109,7040,,,,,250637,0,408109,7040 +"2020-07-06","PA",6754,,1,,,,598,0,,,743020,8174,,,,,107,90304,87705,450,0,,,,,,70437,1018320,10853,1018320,10853,,,,,830725,8612,,0 +"2020-07-06","PR",155,60,0,95,,,115,0,,18,192686,0,,,191601,,11,2071,2071,225,0,6514,,,,2627,,,0,194757,225,,,,,,0,194324,0 +"2020-07-06","RI",960,,0,,2019,2019,61,0,,9,144551,1504,,,243670,,7,17163,,55,0,,,,,24624,,271658,2962,271658,2962,,,,,161714,1559,268294,2810 +"2020-07-06","SC",827,819,7,8,2882,2882,1260,0,,,393477,7515,39648,,381428,,,46380,46247,1533,0,1923,,,,58296,16994,,0,439857,9048,41571,,,,,0,439724,9045 +"2020-07-06","SD",97,,0,,692,692,59,1,,,77198,258,,,,,,7105,,42,0,,,,,11938,6063,,0,98950,466,,,,,84303,300,98950,466 +"2020-07-06","TN",653,628,7,25,2897,2897,940,26,,,,0,,,843683,,,52155,51774,724,0,,,,,60554,31020,,0,904237,8441,,,,,,0,904237,8441 +"2020-07-06","TX",2655,,18,,,,8698,0,,,,0,,,,,,200557,200557,5318,0,7368,3352,,,349745,103782,,0,2799179,32581,207980,15791,,,,0,2799179,32581 +"2020-07-06","UT",190,,6,,1604,1604,244,22,438,83,358028,3024,,,422192,194,,25469,,517,0,,107,,101,28871,14448,,0,451063,4162,,331,,288,384126,3338,451063,4162 +"2020-07-06","VA",1853,1747,0,106,6435,6435,783,17,,194,,0,,,,,86,66102,63339,354,0,4542,201,,,78870,,727501,9362,727501,9362,84360,298,,,,0,,0 +"2020-07-06","VI",6,,0,,,,,0,,,3118,58,,,,,,112,,1,0,,,,,,79,,0,3230,59,,,,,3231,58,,0 +"2020-07-06","VT",56,56,0,,,,24,0,,,67259,333,,,,,,1253,1253,2,0,,,,,,1022,,0,83564,462,,,,,68512,335,83564,462 +"2020-07-06","WA",1359,1359,5,,4482,4482,398,9,,,,0,,,,,39,39055,39048,241,0,,,,,,,747998,17749,747998,17749,,,,,612706,5430,,0 +"2020-07-06","WI",803,796,0,7,3602,3602,255,16,772,69,588913,4802,,,,,,35230,32061,490,0,,,,,,25242,784115,9068,784115,9068,,,,,620974,5286,,0 +"2020-07-06","WV",95,,1,,,,41,0,,13,,0,,,,,6,3442,3336,180,0,,,,,,2518,,0,185350,2325,10660,,,,,0,185350,2325 +"2020-07-06","WY",20,,0,,119,119,9,0,,,33693,0,,,53760,,,1675,1349,41,0,,,,,1570,1172,,0,55330,1463,,,,,34926,0,55330,1463 +"2020-07-05","AK",16,16,0,,75,75,19,4,,,,0,,,,,3,1141,,27,0,,,,,,548,,0,123753,1021,,,,,,0,123753,1021 +"2020-07-05","AL",1007,984,0,23,2909,2909,919,3,843,,405933,6707,,,,473,,43953,43450,1091,0,,,,,,22082,,0,449383,7798,,,,,449383,7798,,0 +"2020-07-05","AR",286,,0,,1536,1536,285,0,,,315684,0,,,,240,70,23209,23209,0,0,,,,,,16726,,0,338893,0,,,,,,0,338893,0 +"2020-07-05","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-07-05","AZ",1809,1694,4,115,5161,5161,3182,93,,821,506273,11318,,,,,531,98089,97611,3536,0,,,,,,,,0,864800,8073,,,182115,,603884,14844,864800,8073 +"2020-07-05","CA",6331,,18,,,,7149,0,,1907,,0,,,,,,265985,265985,8597,0,,,,,,,,0,4680138,127107,,,,,,0,4680138,127107 +"2020-07-05","CO",1701,1365,0,336,5565,5565,286,15,,,321590,4739,104895,,,,,34065,31168,199,0,7494,,,,,,431701,6747,431701,6747,112389,,,,352758,4937,,0 +"2020-07-05","CT",4335,3463,0,872,10411,10411,95,0,,,,0,,,496429,,,46717,44741,0,0,,,,,58222,8210,,0,556266,2123,,,,,,0,556266,2123 +"2020-07-05","DC",559,,2,,,,87,0,,26,,0,,,,,18,10482,,35,0,,,,,,1542,105993,1439,105993,1439,,,,,82375,1045,,0 +"2020-07-05","DE",512,455,0,57,,,53,0,,15,111813,3116,,,,,,12128,11084,132,0,,,,,15176,6740,164616,4496,164616,4496,,,,,123941,3248,,0 +"2020-07-05","FL",3832,3832,29,,16201,16201,,161,,,2000088,43643,,261121,2402605,,,196386,,9856,0,,,10831,,254652,,2428240,63788,2428240,63788,,,271978,,2202095,53768,2662423,67417 +"2020-07-05","GA",2860,,3,,11775,11775,1805,32,2429,,,0,,,,,,95516,95516,2197,0,8925,,,,87841,,,0,951510,23295,170392,,,,,0,951510,23295 +"2020-07-05","GU",5,,0,,,,3,0,,,14666,0,,,,,,288,280,0,0,2,,,,,179,,0,14954,0,128,,,,,0,13925,0 +"2020-07-05","HI",19,19,0,,118,118,,0,,,83326,825,,,,,,999,,24,0,,,,,958,756,98778,1424,98778,1424,,,,,84325,849,99282,1004 +"2020-07-05","IA",721,,0,,,,141,0,,43,301119,3149,,31441,,,16,31353,31353,312,0,,,2359,,,24739,,0,332472,3461,,,33883,,332991,3473,,0 +"2020-07-05","ID",93,73,0,20,359,359,71,4,122,19,96896,2823,,,,,,7370,6779,376,0,,,,,,2858,,0,103675,3201,,,,,103675,3201,,0 +"2020-07-05","IL",7230,7020,6,210,,,1326,0,,304,,0,,,,,165,148373,147251,639,0,,,,,,,,0,1761706,27235,,,,,,0,1761706,27235 +"2020-07-05","IN",2693,2500,6,193,7254,7254,632,38,1526,218,473714,8858,,,,,87,48008,,576,0,,,,,50252,,,0,660576,2679,,,,,521722,9434,660576,2679 +"2020-07-05","KS",277,,0,,1219,1219,,0,377,,175642,0,,,,156,,15919,,0,0,,,,,,,,0,191561,0,,,,,191561,0,,0 +"2020-07-05","KY",585,581,0,4,2685,2685,455,0,996,99,,0,,,,,,16376,15781,0,0,,,,,,4747,,0,395052,0,35019,,,,,0,395052,0 +"2020-07-05","LA",3288,3180,10,108,,,926,0,,,737228,16375,,,,,105,65226,65226,1937,0,,,,,,43026,,0,802454,18312,,,,,,0,802454,18312 +"2020-07-05","MA",8183,7968,11,215,11463,11463,636,2,,100,781711,5782,,,,,46,109974,104502,136,0,,,,,138662,93157,,0,1151255,6645,,,75636,,886213,5893,1151255,6645 +"2020-07-05","MD",3243,3118,7,125,11071,11071,409,37,,144,510330,6329,,,,,,69632,69632,291,0,,,,,81585,5029,,0,707844,9076,,,,,579962,6620,707844,9076 +"2020-07-05","ME",109,108,2,1,359,359,25,1,,9,,0,7350,,,,3,3415,3028,18,0,354,,,,3806,2772,,0,107377,1949,7713,,,,,0,107377,1949 +"2020-07-05","MI",6218,5972,0,246,,,548,0,,193,,0,,,1073878,,92,72941,65876,360,0,,,,,90788,52841,,0,1164666,16830,172203,,,,,0,1164666,16830 +"2020-07-05","MN",1508,1471,5,37,4170,4170,253,31,1287,132,635879,28331,,,,,,38136,38136,512,0,,,,,,33408,674015,28843,674015,28843,,,,,,0,,0 +"2020-07-05","MO",1028,,1,,,,739,0,,,396073,7027,,44863,399926,,72,23436,23436,221,0,,,1626,,23527,,,0,424214,0,,,46489,,419509,7248,424214,0 +"2020-07-05","MP",2,,0,,,,,0,,,8187,0,,,,,,31,31,0,0,,,,,,19,,0,8218,0,,,,,,0,8217,0 +"2020-07-05","MS",1111,1093,4,18,3268,3268,872,0,,175,279241,0,,,,,88,30900,30671,226,0,,,,,,19388,,0,310141,226,12522,,,,,0,309699,0 +"2020-07-05","MT",23,,0,,112,112,20,0,,,,0,,,,,,1212,,45,0,,,,,,678,,0,100106,1156,,,,,,0,100106,1156 +"2020-07-05","NC",1396,1396,1,,,,949,0,,,,0,,,,,,72983,72983,1329,0,,,,,,,,0,976201,16908,,,,,,0,976201,16908 +"2020-07-05","ND",89,,0,,242,242,22,1,,,109312,1163,4879,,,,,3810,3810,36,0,194,,,,,3324,197091,3742,197091,3742,5073,,,,110507,1081,201276,3807 +"2020-07-05","NE",284,,0,,1368,1368,109,3,,,170101,2173,,,213281,,,19827,,167,0,,,,,24283,14340,,0,238228,3539,,,,,190151,2343,238228,3539 +"2020-07-05","NH",376,,0,,569,569,25,0,163,,117892,0,,,,,,5857,,0,0,,,,,,4597,,0,164672,3366,23261,,20057,,123749,0,164672,3366 +"2020-07-05","NJ",15119,13355,22,1764,20237,20237,917,4,,210,1361238,25723,,,,,151,174544,173402,382,0,,,,,,,,0,1535782,26105,,,,,,0,1534640,26092 +"2020-07-05","NM",513,,0,,2006,2006,119,18,,,,0,,,,,,13256,,193,0,,,,,,5860,,0,375054,2766,,,,,,0,375054,2766 +"2020-07-05","NV",534,,4,,,,760,0,,226,285279,5625,,,,,99,22418,22418,843,0,,,,,,,392263,1956,392263,1956,,,,,306086,6300,371890,8458 +"2020-07-05","NY",24904,,8,,89995,89995,832,0,,178,,0,,,,,116,397131,,533,0,,,,,,,4233803,63415,4233803,63415,,,,,,0,,0 +"2020-07-05","OH",2911,2661,4,250,8172,8172,693,61,2058,236,,0,,,,,119,57151,53458,968,0,,,,,62699,40460,,0,932565,22455,,,,,,0,932565,22455 +"2020-07-05","OK",398,,0,,1685,1685,391,9,,165,348789,0,,,348789,,,15928,15928,283,0,1171,,,,16721,12246,,0,364717,283,34490,,,,,0,366289,0 +"2020-07-05","OR",213,,4,,1069,1069,173,0,,52,245096,0,,,380751,,25,9930,,294,0,,,,,20318,2759,,0,401069,8130,,,,,250637,0,401069,8130 +"2020-07-05","PA",6753,,4,,,,592,0,,,734846,9398,,,,,106,89854,87267,479,0,,,,,,70086,1007467,12713,1007467,12713,,,,,822113,9852,,0 +"2020-07-05","PR",155,60,0,95,,,118,0,,9,192686,0,,,191601,,5,1846,1846,29,0,6070,,,,2627,,,0,194532,29,,,,,,0,194324,0 +"2020-07-05","RI",960,,0,,2019,2019,61,0,,9,143047,1374,,,240961,,7,17108,,24,0,,,,,24523,,268696,2374,268696,2374,,,,,160155,1398,265484,2872 +"2020-07-05","SC",820,813,7,7,2882,2882,1251,0,,,385962,8655,39531,,374112,,,44847,44717,1461,0,1919,,,,56567,16994,,0,430809,10116,41450,,,,,0,430679,10112 +"2020-07-05","SD",97,,0,,691,691,59,2,,,76940,138,,,,,,7063,,35,0,,,,,11889,6063,,0,98484,945,,,,,84003,173,98484,945 +"2020-07-05","TN",646,621,9,25,2871,2871,949,11,,,,0,,,836028,,,51431,51061,1291,0,,,,,59768,30254,,0,895796,17566,,,,,,0,895796,17566 +"2020-07-05","TX",2637,,29,,,,8181,0,,,,0,,,,,,195239,195239,3449,0,7307,3213,,,342235,100843,,0,2766598,21121,204641,15223,,,,0,2766598,21121 +"2020-07-05","UT",184,,3,,1582,1582,237,17,438,84,355004,3090,,,418371,195,,24952,,410,0,,73,,67,28530,14147,,0,446901,4168,,297,,254,380788,3418,446901,4168 +"2020-07-05","VA",1853,1746,4,107,6418,6418,792,13,,202,,0,,,,,95,65748,62981,639,0,4532,194,,,78124,,718139,10389,718139,10389,84163,291,,,,0,,0 +"2020-07-05","VI",6,,0,,,,,0,,,3060,0,,,,,,111,,0,0,,,,,,76,,0,3171,0,,,,,3173,0,,0 +"2020-07-05","VT",56,56,0,,,,15,0,,,66926,605,,,,,,1251,1251,11,0,,,,,,1007,,0,83102,833,,,,,68177,616,83102,833 +"2020-07-05","WA",1354,1354,2,,4473,4473,412,10,,,,0,,,,,56,38814,38807,453,0,,,,,,,730249,4803,730249,4803,,,,,607276,7301,,0 +"2020-07-05","WI",803,796,0,7,3586,3586,244,12,771,65,584111,4474,,,,,,34740,31577,533,0,,,,,,24899,775047,12258,775047,12258,,,,,615688,4996,,0 +"2020-07-05","WV",94,,0,,,,27,0,,12,,0,,,,,5,3262,3156,121,0,,,,,,2421,,0,183025,3456,10598,,,,,0,183025,3456 +"2020-07-05","WY",20,,0,,119,119,8,0,,,33693,0,,,52354,,,1634,1312,28,0,,,,,1513,1172,,0,53867,239,,,,,34926,0,53867,239 +"2020-07-04","AK",16,16,1,,71,71,23,2,,,,0,,,,,3,1114,,49,0,,,,,,544,,0,122732,2524,,,,,,0,122732,2524 +"2020-07-04","AL",1007,984,1,23,2906,2906,818,23,843,,399226,10460,,,,473,,42862,42359,997,0,,,,,,22082,,0,441585,11457,,,,,441585,11457,,0 +"2020-07-04","AR",286,,5,,1536,1536,285,19,,,315684,7069,,,,240,70,23209,23209,587,0,,,,,,16726,,0,338893,7656,,,,,,0,338893,7656 +"2020-07-04","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-07-04","AZ",1805,1690,17,115,5068,5068,3113,50,,796,494955,8432,,,,,413,94553,94085,2695,0,,,,,,,,0,856727,17463,,,180250,,589040,11121,856727,17463 +"2020-07-04","CA",6313,,50,,,,7092,0,,1888,,0,,,,,,257388,257388,9153,0,,,,,,,,0,4553031,104855,,,,,,0,4553031,104855 +"2020-07-04","CO",1701,1365,0,336,5550,5550,283,13,,,316851,4716,103986,,,,,33866,30970,247,0,7467,,,,,,424954,6697,424954,6697,111453,,,,347821,4964,,0 +"2020-07-04","CT",4335,3463,0,872,10411,10411,95,0,,,,0,,,494348,,,46717,44741,0,0,,,,,58182,8210,,0,554143,5822,,,,,,0,554143,5822 +"2020-07-04","DC",557,,2,,,,95,0,,28,,0,,,,,21,10447,,12,0,,,,,,1523,104554,1745,104554,1745,,,,,81330,1363,,0 +"2020-07-04","DE",512,455,0,57,,,54,0,,13,108697,2277,,,,,,11996,10952,73,0,,,,,14981,6711,160120,8054,160120,8054,,,,,120693,2350,,0 +"2020-07-04","FL",3803,3803,18,,16040,16040,,245,,,1956445,53679,,226699,2347444,,,186530,,11330,0,,,9575,,242571,,2364452,77840,2364452,77840,,,236304,,2148327,65271,2595006,81891 +"2020-07-04","GA",2857,,1,,11743,11743,1726,90,2425,,,0,,,,,,93319,93319,2826,0,8839,,,,85363,,,0,928215,25785,168048,,,,,0,928215,25785 +"2020-07-04","GU",5,,0,,,,3,0,,,14666,403,,,,,,288,280,2,0,2,,,,,179,,0,14954,405,128,,,,,0,13925,0 +"2020-07-04","HI",19,19,1,,118,118,,2,,,82501,1829,,,,,,975,,29,0,,,,,935,754,97354,1963,97354,1963,,,,,83476,1858,98278,2412 +"2020-07-04","IA",721,,1,,,,134,0,,40,297970,6938,,31373,,,16,31041,31041,612,0,,,2355,,,24604,,0,329011,7550,,,33761,,329518,7560,,0 +"2020-07-04","ID",93,73,1,20,355,355,67,5,121,23,94073,1957,,,,,,6994,6401,401,0,,,,,,2831,,0,100474,2355,,,,,100474,2355,,0 +"2020-07-04","IL",7224,7014,9,210,,,1346,0,,336,,0,,,,,182,147734,146612,862,0,,,,,,,,0,1734471,33836,,,,,,0,1734471,33836 +"2020-07-04","IN",2687,2494,6,193,7216,7216,632,41,1516,218,464856,7618,,,,,87,47432,,517,0,,,,,50094,,,0,657897,6720,,,,,512288,8135,657897,6720 +"2020-07-04","KS",277,,0,,1219,1219,,0,377,,175642,0,,,,156,,15919,,0,0,,,,,,,,0,191561,0,,,,,191561,0,,0 +"2020-07-04","KY",585,581,0,4,2685,2685,455,0,996,99,,0,,,,,,16376,15781,0,0,,,,,,4747,,0,395052,0,35019,,,,,0,395052,0 +"2020-07-04","LA",3278,3170,0,108,,,852,0,,,720853,0,,,,,93,63289,63289,0,0,,,,,,43026,,0,784142,0,,,,,,0,784142,0 +"2020-07-04","MA",8172,7958,23,214,11461,11461,640,25,,107,775929,7777,,,,,51,109838,104391,210,0,,,,,138527,93157,,0,1144610,4277,,,75302,,880320,7940,1144610,4277 +"2020-07-04","MD",3236,3111,13,125,11034,11034,410,61,,143,504001,9128,,,,,,69341,69341,380,0,,,,,81192,5025,,0,698768,12955,,,,,573342,9508,698768,12955 +"2020-07-04","ME",107,106,2,1,358,358,27,0,,9,,0,7338,,,,3,3397,3012,24,0,353,,,,3787,2751,,0,105428,2417,7700,,,,,0,105428,2417 +"2020-07-04","MI",6218,5972,3,246,,,548,0,,193,,0,,,1057573,,92,72581,65533,406,0,,,,,90263,52841,,0,1147836,22098,170893,,,,,0,1147836,22098 +"2020-07-04","MN",1503,1466,0,37,4139,4139,270,0,1277,132,607548,0,,,,,,37624,37624,0,0,,,,,,32347,645172,0,645172,0,,,,,,0,,0 +"2020-07-04","MO",1027,,1,,,,740,0,,,389046,6917,,44439,399926,,73,23215,23215,385,0,,,1614,,23527,,,0,424214,0,,,46053,,412261,7302,424214,0 +"2020-07-04","MP",2,,0,,,,,0,,,8187,0,,,,,,31,31,0,0,,,,,,19,,0,8218,0,,,,,,0,8217,0 +"2020-07-04","MS",1107,1089,15,18,3268,3268,872,60,,175,279241,8972,,,,,88,30674,30458,1904,0,,,,,,19388,,0,309915,10876,12522,,,,,0,309699,10857 +"2020-07-04","MT",23,,0,,112,112,20,3,,,,0,,,,,,1167,,39,0,,,,,,678,,0,98950,1447,,,,,,0,98950,1447 +"2020-07-04","NC",1395,1395,3,,,,945,0,,,,0,,,,,,71654,71654,1413,0,,,,,,,,0,959293,20409,,,,,,0,959293,20409 +"2020-07-04","ND",89,,0,,241,241,22,4,,,108149,1297,4873,,,,,3774,3774,57,0,194,,,,,3288,193349,4343,193349,4343,5067,,,,109426,1258,197469,4434 +"2020-07-04","NE",284,,2,,1365,1365,111,12,,,167928,3246,,,209947,,,19660,,208,0,,,,,24086,14200,,0,234689,5452,,,,,187808,3454,234689,5452 +"2020-07-04","NH",376,,1,,569,569,25,2,163,,117892,1527,,,,,,5857,,35,0,,,,,,4597,,0,161306,2386,23085,,20057,,123749,1562,161306,2386 +"2020-07-04","NJ",15097,13333,25,1764,20233,20233,983,19,,205,1335515,22756,,,,,164,174162,173033,323,0,,,,,,,,0,1509677,23079,,,,,,0,1508548,23047 +"2020-07-04","NM",513,,2,,1988,1988,121,18,,,,0,,,,,,13063,,287,0,,,,,,5845,,0,372288,8914,,,,,,0,372288,8914 +"2020-07-04","NV",530,,2,,,,749,0,,205,279654,6687,,,,,97,21575,21575,857,0,,,,,,,390307,5073,390307,5073,,,,,299786,7654,363432,10177 +"2020-07-04","NY",24896,,11,,89995,89995,844,0,,190,,0,,,,,119,396598,,726,0,,,,,,,4170388,62403,4170388,62403,,,,,,0,,0 +"2020-07-04","OH",2907,2657,4,250,8111,8111,691,27,2052,226,,0,,,,,111,56183,52488,926,0,,,,,61449,39903,,0,910110,22192,,,,,,0,910110,22192 +"2020-07-04","OK",398,,0,,1676,1676,391,15,,165,348789,0,,,348789,,,15645,15645,580,0,1171,,,,16721,11965,,0,364434,580,34490,,,,,0,366289,0 +"2020-07-04","OR",209,,0,,1069,1069,173,0,,52,245096,3336,,,373092,,25,9636,,342,0,,,,,19847,2759,,0,392939,7528,,,,,250637,0,392939,7528 +"2020-07-04","PA",6749,,3,,,,589,0,,,725448,10045,,,,,102,89375,86813,634,0,,,,,,69712,994754,14929,994754,14929,,,,,812261,10653,,0 +"2020-07-04","PR",155,60,1,95,,,100,0,,8,192686,0,,,191601,,4,1817,1817,26,0,5970,,,,2627,,,0,194503,26,,,,,,0,194324,0 +"2020-07-04","RI",960,,0,,2019,2019,61,0,,9,141673,952,,,238135,,7,17084,,27,0,,,,,24477,,266322,2057,266322,2057,,,,,158757,979,262612,2279 +"2020-07-04","SC",813,806,20,7,2882,2882,1190,0,,,377307,9807,39313,,365716,,,43386,43260,1854,0,1908,,,,54851,16994,,0,420693,11661,41221,,,,,0,420567,11654 +"2020-07-04","SD",97,,0,,689,689,54,2,,,76802,787,,,,,,7028,,50,0,,,,,11830,6062,,0,97539,1273,,,,,83830,837,97539,1273 +"2020-07-04","TN",637,612,4,25,2860,2860,949,35,,,,0,,,820028,,,50140,49768,1428,0,,,,,58202,30043,,0,878230,16109,,,,,,0,878230,16109 +"2020-07-04","TX",2608,,33,,,,7890,0,,,,0,,,,,,191790,191790,8258,0,7274,3100,,,337299,97430,,0,2745477,60827,201782,14754,,,,0,2745477,60827 +"2020-07-04","UT",181,,0,,1565,1565,255,36,436,88,351914,5396,,,414556,194,,24542,,676,0,,68,,62,28177,13807,,0,442733,7487,,292,,249,377370,5953,442733,7487 +"2020-07-04","VA",1849,1745,4,104,6405,6405,808,23,,207,,0,,,,,99,65109,62400,716,0,4515,179,,,77536,,707750,11709,707750,11709,83852,276,,,,0,,0 +"2020-07-04","VI",6,,0,,,,,0,,,3060,97,,,,,,111,,13,0,,,,,,76,,0,3171,110,,,,,3173,9,,0 +"2020-07-04","VT",56,56,0,,,,16,0,,,66321,1006,,,,,,1240,1240,2,0,,,,,,999,,0,82269,1314,,,,,67561,1008,82269,1314 +"2020-07-04","WA",1352,1352,10,,4463,4463,446,21,,,,0,,,,,58,38361,38354,888,0,,,,,,,725446,4634,725446,4634,,,,,599975,14986,,0 +"2020-07-04","WI",803,796,0,7,3574,3574,235,19,771,67,579637,6084,,,,,,34207,31055,776,0,,,,,,24491,762789,17819,762789,17819,,,,,610692,6822,,0 +"2020-07-04","WV",94,,1,,,,25,0,,11,,0,,,,,4,3141,3036,15,0,,,,,,2402,,0,179569,1519,10437,,,,,0,179569,1519 +"2020-07-04","WY",20,,0,,119,119,8,0,,,33693,0,,,52123,,,1606,1289,24,0,,,,,1505,1169,,0,53628,216,,,,,34926,0,53628,216 +"2020-07-03","AK",15,15,1,,69,69,25,1,,,,0,,,,,3,1065,,45,0,,,,,,539,,0,120208,4299,,,,,,0,120208,4299 +"2020-07-03","AL",1006,983,21,23,2883,2883,838,48,838,,388766,9149,,,,474,,41865,41362,1754,0,,,,,,22082,,0,430128,10907,,,,,430128,10907,,0 +"2020-07-03","AR",281,,2,,1517,1517,285,40,,,308615,6703,,,,236,70,22622,22622,547,0,,,,,,16164,,0,331237,7250,,,,,,0,331237,7250 +"2020-07-03","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-07-03","AZ",1788,1673,31,115,5018,5018,3013,102,,741,486523,13109,,,,,489,91858,91396,4433,0,,,,,,,,0,839264,26589,,,177849,,577919,17535,839264,26589 +"2020-07-03","CA",6263,,100,,,,7024,0,,1871,,0,,,,,,248235,248235,5688,0,,,,,,,,0,4448176,109458,,,,,,0,4448176,109458 +"2020-07-03","CO",1701,1365,0,336,5537,5537,270,10,,,312135,5197,101101,,,,,33619,30722,267,0,7340,,,,,,418257,7934,418257,7934,108441,,,,342857,5466,,0 +"2020-07-03","CT",4335,3463,9,872,10411,10411,95,0,,,,0,,,488620,,,46717,44741,71,0,,,,,58097,8210,,0,548321,14104,,,,,,0,548321,14104 +"2020-07-03","DC",555,,1,,,,110,0,,38,,0,,,,,24,10435,,45,0,,,,,,1497,102809,1746,102809,1746,,,,,79967,1367,,0 +"2020-07-03","DE",512,455,2,57,,,57,0,,13,106420,3233,,,,,,11923,10879,192,0,,,,,14669,6692,152066,2613,152066,2613,,,,,118343,3425,,0 +"2020-07-03","FL",3785,3785,67,,15795,15795,,341,,,1902766,39689,,226699,2279841,,,175200,,9324,0,,,9575,,228506,,2286612,60623,2286612,60623,,,236304,,2083056,49262,2513115,63953 +"2020-07-03","GA",2856,,7,,11653,11653,1671,153,2413,,,0,,,,,,90493,90493,2784,0,8717,,,,82426,,,0,902430,18412,164412,,,,,0,902430,18412 +"2020-07-03","GU",5,,0,,,,2,0,,,14263,610,,,,,,286,278,6,0,2,,,,,179,,0,14549,616,128,,,,,0,13925,0 +"2020-07-03","HI",18,18,0,,116,116,,0,,,80672,1308,,,,,,946,,20,0,,,,,904,746,95391,1698,95391,1698,,,,,81618,1328,95866,1706 +"2020-07-03","IA",720,,2,,,,146,0,,40,291032,3703,,31041,,,20,30429,30429,220,0,,,2347,,,24338,,0,321461,3923,,,33421,,321958,3973,,0 +"2020-07-03","ID",92,72,0,20,350,350,64,10,121,23,92116,3365,,,,,,6593,6003,223,0,,,,,,2801,,0,98119,3582,,,,,98119,3582,,0 +"2020-07-03","IL",7215,7005,27,210,,,1349,0,,334,,0,,,,,164,146872,145750,937,0,,,,,,,,0,1700635,34318,,,,,,0,1700635,34318 +"2020-07-03","IN",2681,2488,19,193,7175,7175,633,36,1506,217,457238,6790,,,,,81,46915,,528,0,,,,,49750,,,0,651177,12003,,,,,504153,7318,651177,12003 +"2020-07-03","KS",277,,5,,1219,1219,,24,377,,175642,7459,,,,156,,15919,,929,0,,,,,,,,0,191561,8388,,,,,191561,8764,,0 +"2020-07-03","KY",585,581,4,4,2685,2685,455,23,996,99,,0,,,,,,16376,15781,297,0,,,,,,4747,,0,395052,9829,35019,,,,,0,395052,9829 +"2020-07-03","LA",3278,3170,23,108,,,852,0,,,720853,15040,,,,,93,63289,63289,1728,0,,,,,,43026,,0,784142,16768,,,,,,0,784142,16768 +"2020-07-03","MA",8149,7935,17,214,11436,11436,656,44,,106,768152,11232,,,,,55,109628,104228,290,0,,,,,138420,93157,,0,1140333,8339,,,74598,,872380,11444,1140333,8339 +"2020-07-03","MD",3223,3099,11,124,10973,10973,422,34,,143,494873,10121,,,,,,68961,68961,538,0,,,,,80684,5023,,0,685813,15564,,,,,563834,10659,685813,15564 +"2020-07-03","ME",105,104,0,1,358,358,27,4,,9,,0,7249,,,,3,3373,2985,45,0,349,,,,3717,2731,,0,103011,2563,7607,,,,,0,103011,2563 +"2020-07-03","MI",6215,5969,3,246,,,548,0,,193,,0,,,1036090,,92,72175,65135,497,0,,,,,89648,51099,,0,1125738,23326,168588,,,,,0,1125738,23326 +"2020-07-03","MN",1503,1466,8,37,4139,4139,270,27,1277,132,607548,14331,,,,,,37624,37624,414,0,,,,,,32347,645172,14745,645172,14745,,,,,,0,,0 +"2020-07-03","MO",1026,,4,,,,716,0,,,382129,7094,,43498,399926,,78,22830,22830,547,0,,,1581,,23527,,,0,424214,0,,,45079,,404959,7641,424214,0 +"2020-07-03","MP",2,,0,,,,,0,,,8187,0,,,,,,31,31,1,0,,,,,,19,,0,8218,1,,,,,,0,8217,0 +"2020-07-03","MS",1092,1074,0,18,3208,3208,863,0,,167,270269,0,,,,,94,28770,28573,0,0,,,,,,19388,,0,299039,0,12055,,,,,0,298842,0 +"2020-07-03","MT",23,,1,,109,109,17,3,,,,0,,,,,,1128,,45,0,,,,,,678,,0,97503,2354,,,,,,0,97503,2354 +"2020-07-03","NC",1392,1392,1,,,,951,0,,,,0,,,,,,70241,70241,2099,0,,,,,,,,0,938884,21474,,,,,,0,938884,21474 +"2020-07-03","ND",89,,0,,237,237,20,3,,,106852,2314,4859,,,,,3717,3717,63,0,192,,,,,3266,189006,4576,189006,4576,5051,,,,108168,2334,193035,4630 +"2020-07-03","NE",282,,6,,1353,1353,121,10,,,164682,1330,,,204801,,,19452,,142,0,,,,,23794,14022,,0,229237,2587,,,,,184354,1474,229237,2587 +"2020-07-03","NH",375,,2,,567,567,31,2,162,,116365,1860,,,,,,5822,,20,0,,,,,,4508,,0,158920,2278,22894,,19808,,122187,1880,158920,2278 +"2020-07-03","NJ",15072,13308,58,1764,20214,20214,1028,73,,216,1312759,21202,,,,,167,173839,172742,435,0,,,,,,,,0,1486598,21637,,,,,,0,1485501,21588 +"2020-07-03","NM",511,,8,,1970,1970,130,25,,,,0,,,,,,12776,,256,0,,,,,,5802,,0,363374,6737,,,,,,0,363374,6737 +"2020-07-03","NV",528,,3,,,,704,0,,219,272967,7972,,,,,87,20718,20718,985,0,,,,,,,385234,12077,385234,12077,,,,,292132,9327,353255,11792 +"2020-07-03","NY",24885,,8,,89995,89995,857,0,,188,,0,,,,,125,395872,,918,0,,,,,,,4107985,66392,4107985,66392,,,,,,0,,0 +"2020-07-03","OH",2903,2653,0,250,8084,8084,740,46,2044,233,,0,,,,,100,55257,51581,1091,0,,,,,60096,39423,,0,887918,21994,,,,,,0,887918,21994 +"2020-07-03","OK",398,,3,,1661,1661,391,46,,165,348789,10278,,,348789,,,15065,15065,526,0,1171,,,,16721,11519,,0,363854,10804,34490,,,,,0,366289,11089 +"2020-07-03","OR",209,,1,,1069,1069,173,14,,52,241760,7331,,,365991,,25,9294,,363,0,,,,,19420,2759,,0,385411,12085,,,,,250637,7683,385411,12085 +"2020-07-03","PA",6746,,34,,,,598,0,,,715403,13204,,,,,105,88741,86205,667,0,,,,,,69217,979825,18094,979825,18094,,,,,801608,13836,,0 +"2020-07-03","PR",154,60,1,94,,,104,0,,11,192686,0,,,191601,,6,1791,1791,24,0,5892,,,,2627,,,0,194477,24,,,,,,0,194324,0 +"2020-07-03","RI",960,,1,,2019,2019,61,8,,9,140721,673,,,235908,,7,17057,,22,0,,,,,24425,,264265,2876,264265,2876,,,,,157778,695,260333,1893 +"2020-07-03","SC",793,787,9,6,2882,2882,1148,28,,,367500,5800,38296,,356426,,,41532,41413,1831,0,1856,,,,52487,16994,,0,409032,7631,40152,,,,,0,408913,7626 +"2020-07-03","SD",97,,0,,687,687,58,4,,,76015,967,,,,,,6978,,85,0,,,,,11770,6049,,0,96266,1652,,,,,82993,1052,96266,1652 +"2020-07-03","TN",633,608,13,25,2825,2825,949,50,,,,0,,,805477,,,48712,48344,1822,0,,,,,56644,29591,,0,862121,24037,,,,,,0,862121,24037 +"2020-07-03","TX",2575,,50,,,,7652,0,,,,0,,,,,,183532,183532,7555,0,7255,2930,,,324612,93572,,0,2684650,86170,199041,14053,,,,0,2684650,86170 +"2020-07-03","UT",181,,5,,1529,1529,232,24,434,85,346518,5794,,,407687,193,,23866,,596,0,,55,,52,27559,13408,,0,435246,7907,,258,,222,371417,6412,435246,7907 +"2020-07-03","VA",1845,1741,29,104,6382,6382,818,49,,207,,0,,,,,95,64393,61690,658,0,4472,172,,,76798,,696041,11483,696041,11483,82549,269,,,,0,,0 +"2020-07-03","VI",6,,0,,,,,0,,,2963,39,,,,,,98,,6,0,,,,,,75,,0,3061,45,,,,,3164,109,,0 +"2020-07-03","VT",56,56,0,,,,16,0,,,65315,1030,,,,,,1238,1238,9,0,,,,,,967,,0,80955,1430,,,,,66553,1039,80955,1430 +"2020-07-03","WA",1342,1342,3,,4442,4442,460,40,,,,0,,,,,62,37473,37466,884,0,,,,,,,720812,10069,720812,10069,,,,,584989,13025,,0 +"2020-07-03","WI",803,796,3,7,3555,3555,244,36,768,75,573553,9607,,,,,,33431,30317,622,0,,,,,,24043,744970,17156,744970,17156,,,,,603870,10186,,0 +"2020-07-03","WV",93,,0,,,,25,0,,11,,0,,,,,4,3126,3021,73,0,,,,,,2396,,0,178050,2496,10413,,,,,0,178050,2496 +"2020-07-03","WY",20,,0,,119,119,8,0,,,33693,0,,,51922,,,1582,1267,32,0,,,,,1490,1154,,0,53412,519,,,,,34926,0,53412,519 +"2020-07-02","AK",14,14,0,,68,68,18,0,,,,0,,,,,1,1020,,38,0,,,,,,535,,0,115909,1509,,,,,,0,115909,1509 +"2020-07-02","AL",985,961,13,24,2835,2835,843,32,826,,379617,4626,,,,468,,40111,39604,1149,0,,,,,,22082,,0,419221,5788,,,,,419221,5788,,0 +"2020-07-02","AR",279,,2,,1477,1477,272,29,,,301912,8251,,,,231,72,22075,22075,878,0,,,,,,15698,,0,323987,9129,,,,,,0,323987,9129 +"2020-07-02","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-07-02","AZ",1757,1642,37,115,4916,4916,2938,79,,723,473414,7910,,,,,488,87425,86970,3333,0,,,,,,,,0,812675,26174,,,175112,,560384,11235,812675,26174 +"2020-07-02","CA",6163,,73,,,,6812,0,,1934,,0,,,,,,242547,242547,6408,0,,,,,,,,0,4338718,84542,,,,,,0,4338718,84542 +"2020-07-02","CO",1701,1365,4,336,5527,5527,270,14,,,306938,6712,101101,,,,,33352,30453,323,0,7340,,,,,,410323,8706,410323,8706,108441,,,,337391,7032,,0 +"2020-07-02","CT",4326,3459,2,867,10411,10411,101,143,,,,0,,,474717,,,46646,44672,74,0,,,,,57911,8210,,0,534217,13863,,,,,,0,534217,13863 +"2020-07-02","DC",554,,1,,,,120,0,,33,,0,,,,,28,10390,,25,0,,,,,,1465,101063,1028,101063,1028,,,,,78600,692,,0 +"2020-07-02","DE",510,453,1,57,,,67,0,,16,103187,3313,,,,,,11731,10687,221,0,,,,,14556,6678,149453,1618,149453,1618,,,,,114918,3534,,0 +"2020-07-02","FL",3718,3718,68,,15454,15454,,329,,,1863077,41720,,226699,2228207,,,165876,,9442,0,,,9575,,216375,,2225989,62493,2225989,62493,,,236304,,2033794,51879,2449162,69031 +"2020-07-02","GA",2849,,22,,11500,11500,1649,225,2389,,,0,,,,,,87709,87709,3472,0,8645,,,,79974,,,0,884018,28393,161483,,,,,0,884018,28393 +"2020-07-02","GU",5,,0,,,,1,0,,,13653,136,,,,,,280,272,13,0,2,,,,,179,,0,13933,149,128,,,,,0,13925,514 +"2020-07-02","HI",18,18,0,,116,116,,3,,,79364,1223,,,,,,926,,9,0,,,,,887,741,93693,2001,93693,2001,,,,,80290,1232,94160,1935 +"2020-07-02","IA",718,,1,,,,145,0,,36,287329,6990,,30838,,,18,30209,30209,758,0,,,2339,,,23993,,0,317538,7748,,,33210,,317985,7767,,0 +"2020-07-02","ID",92,72,0,20,340,340,69,10,118,17,88751,3828,,,,,,6370,5786,253,0,,,,,,4393,,0,94537,4061,,,,,94537,4061,,0 +"2020-07-02","IL",7188,6987,36,201,,,1651,0,,349,,0,,,,,195,145935,144882,869,0,,,,,,,,0,1666317,30262,,,,,,0,1666317,30262 +"2020-07-02","IN",2662,2469,12,193,7139,7139,644,44,1493,221,450448,6684,,,,,89,46387,,435,0,,,,,49040,,,0,639174,10679,,,,,496835,7119,639174,10679 +"2020-07-02","KS",272,,0,,1195,1195,,43,367,,168183,0,,,,152,,14990,,0,0,,,,,,,,0,183173,0,,,,,182797,0,,0 +"2020-07-02","KY",581,577,9,4,2662,2662,430,27,994,73,,0,,,,,,16079,15508,237,0,,,,,,4726,,0,385223,8689,34835,,,,,0,385223,8689 +"2020-07-02","LA",3255,3147,17,108,,,840,0,,,705813,13903,,,,,91,61561,61561,1383,0,,,,,,43026,,0,767374,15286,,,,,,0,767374,15286 +"2020-07-02","MA",8132,7918,51,214,11392,11392,681,40,,113,756920,7628,,,,,52,109338,104016,195,0,,,,,138258,93157,,0,1131994,13916,,,73613,,860936,7786,1131994,13916 +"2020-07-02","MD",3212,3086,7,126,10939,10939,441,37,,149,484752,10066,,,,,,68423,68423,505,0,,,,,79758,5013,,0,670249,13659,,,,,553175,10571,670249,13659 +"2020-07-02","ME",105,104,0,1,354,354,30,3,,9,,0,7194,,,,3,3328,2951,34,0,345,,,,3671,2698,,0,100448,2218,7548,,,,,0,100448,2218 +"2020-07-02","MI",6212,5966,14,246,,,548,0,,193,,0,,,1013459,,103,71678,64675,589,0,,,,,88953,51099,,0,1102412,23423,165567,,,,,0,1102412,23423 +"2020-07-02","MN",1495,1458,13,37,4112,4112,274,31,1266,123,593217,12826,,,,,,37210,37210,494,0,,,,,,32163,630427,13320,630427,13320,,,,,,0,,0 +"2020-07-02","MO",1022,,5,,,,716,0,,,375035,7222,,42622,399926,,77,22283,22283,356,0,,,1580,,23527,,,0,424214,0,,,44202,,397318,7578,424214,0 +"2020-07-02","MP",2,,0,,,,,0,,,8187,0,,,,,,30,30,0,0,,,,,,19,,0,8217,0,,,,,,0,8217,0 +"2020-07-02","MS",1092,1074,10,18,3208,3208,863,31,,167,270269,4417,,,,,94,28770,28573,870,0,,,,,,19388,,0,299039,5287,12055,,,,,0,298842,5280 +"2020-07-02","MT",22,,0,,106,106,14,1,,,,0,,,,,,1083,,67,0,,,,,,672,,0,95149,1819,,,,,,0,95149,1819 +"2020-07-02","NC",1391,1391,18,,,,912,0,,,,0,,,,,,68142,68142,1629,0,,,,,,,,0,917410,21911,,,,,,0,917410,21911 +"2020-07-02","ND",89,,0,,234,234,19,0,,,104538,927,4833,,,,,3654,3654,43,0,188,,,,,3235,184430,3503,184430,3503,5021,,,,105834,936,188405,3626 +"2020-07-02","NE",276,,2,,1343,1343,117,13,,,163352,1921,,,202428,,,19310,,133,0,,,,,23582,13807,,0,226650,2350,,,,,182880,2054,226650,2350 +"2020-07-02","NH",373,,2,,565,565,32,0,162,,114505,1118,,,,,,5802,,20,0,,,,,,4491,,0,156642,3714,22605,,19483,,120307,1138,156642,3714 +"2020-07-02","NJ",15014,13251,27,1763,20141,20141,1027,87,,216,1291557,20548,,,,,170,173404,172356,468,0,,,,,,,,0,1464961,21016,,,,,,0,1463913,20976 +"2020-07-02","NM",503,,3,,1945,1945,127,17,,,,0,,,,,,12520,,244,0,,,,,,5627,,0,356637,6577,,,,,,0,356637,6577 +"2020-07-02","NV",525,,14,,,,662,0,,196,264995,0,,,,,78,19733,19733,632,0,,,,,,,373157,11463,373157,11463,,,,,282805,0,341463,10145 +"2020-07-02","NY",24877,,11,,89995,89995,878,0,,209,,0,,,,,129,394954,,875,0,,,,,,,4041593,69945,4041593,69945,,,,,,0,,0 +"2020-07-02","OH",2903,2653,27,250,8038,8038,724,127,2035,244,,0,,,,,116,54166,50523,1301,0,,,,,58803,38987,,0,865924,22029,,,,,,0,865924,22029 +"2020-07-02","OK",395,,6,,1615,1615,368,62,,163,338511,6310,,,338511,,,14539,14539,427,0,1171,,,,15918,11048,,0,353050,6737,34490,,,,,0,355200,6850 +"2020-07-02","OR",208,,1,,1055,1055,192,17,,62,234429,5451,,,354547,,24,8931,,275,0,,,,,18779,2722,,0,373326,9624,,,,,242954,5711,373326,9624 +"2020-07-02","PA",6712,,63,,,,631,0,,,702199,12637,,,,,106,88074,85573,832,0,,,,,,68697,961731,18444,961731,18444,,,,,787772,13459,,0 +"2020-07-02","PR",153,59,0,94,,,97,0,,8,192686,0,,,191601,,3,1767,1767,38,0,5841,,,,2627,,,0,194453,38,,,,,,0,194324,0 +"2020-07-02","RI",959,,3,,2011,2011,67,4,,11,140048,985,,,234057,,10,17035,,59,0,,,,,24383,,261389,4238,261389,4238,,,,,157083,1044,258440,2705 +"2020-07-02","SC",784,777,18,7,2854,2854,1125,0,,,361700,9747,37723,,350541,,,39701,39587,1782,0,1847,,,,50746,15471,,0,401401,11529,39570,,,,,0,401287,11525 +"2020-07-02","SD",97,,4,,683,683,64,9,,,75048,931,,,,,,6893,,67,0,,,,,11689,5982,,0,94614,1316,,,,,81941,998,94614,1316 +"2020-07-02","TN",620,594,11,26,2775,2775,949,60,,,,0,,,783613,,,46890,46520,1575,0,,,,,54471,28938,,0,838084,20562,,,,,,0,838084,20562 +"2020-07-02","TX",2525,,44,,,,7382,0,,,,0,,,,,,175977,175977,7915,0,7243,2712,,,307806,90720,,0,2598480,85103,198745,13013,,,,0,2598480,85103 +"2020-07-02","UT",176,,3,,1505,1505,229,29,430,81,340724,5711,,,400448,190,,23270,,554,0,,50,,47,26891,13076,,0,427339,7940,,225,,193,365005,6351,427339,7940 +"2020-07-02","VA",1816,1712,30,104,6333,6333,888,71,,206,,0,,,,,95,63735,61039,532,0,4408,169,,,75964,,684558,12640,684558,12640,80624,266,,,,0,,0 +"2020-07-02","VI",6,,0,,,,,0,,,2924,48,,,,,,92,,2,0,,,,,,75,,0,3016,50,,,,,3055,83,,0 +"2020-07-02","VT",56,56,0,,,,21,0,,,64285,1027,,,,,,1229,1229,17,0,,,,,,960,,0,79525,1525,,,,,65514,1044,79525,1525 +"2020-07-02","WA",1339,1339,7,,4402,4402,430,41,,,,0,,,,,57,36589,36582,920,0,,,,,,,710743,14811,710743,14811,,,,,571964,14689,,0 +"2020-07-02","WI",800,793,7,7,3519,3519,236,37,763,74,563946,12339,,,,,,32809,29738,584,0,,,,,,23527,727814,16073,727814,16073,,,,,593684,12878,,0 +"2020-07-02","WV",93,,0,,,,23,0,,10,,0,,,,,5,3053,2949,121,0,,,,,,2380,,0,175554,4061,10173,,,,,0,175554,4061 +"2020-07-02","WY",20,,0,,119,119,9,2,,,33693,1508,,,51427,,,1550,1233,36,0,,,,,1466,1139,,0,52893,1376,,,,,34926,1557,52893,1376 +"2020-07-01","AK",14,14,0,,68,68,20,0,,,,0,,,,,2,982,,38,0,,,,,,528,,0,114400,2215,,,,,,0,114400,2215 +"2020-07-01","AL",972,947,22,25,2803,2803,809,34,814,,374991,6384,,,,464,,38962,38442,917,0,,,,,,18866,,0,413433,7290,,,,,413433,7290,,0 +"2020-07-01","AR",277,,7,,1448,1448,275,35,,,293661,3235,,,,224,72,21197,21197,420,0,,,,,,15163,,0,314858,3655,,,,,,0,314858,3655 +"2020-07-01","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-07-01","AZ",1720,1607,88,113,4837,4837,2876,101,,675,465504,12363,,,,,466,84092,83645,4877,0,,,,,,,,0,786501,26669,,,172836,,549149,17227,786501,26669 +"2020-07-01","CA",6090,,110,,,,6612,0,,1859,,0,,,,,,236139,236139,7407,0,,,,,,,,0,4254176,87037,,,,,,0,4254176,87037 +"2020-07-01","CO",1697,1362,7,335,5513,5513,262,24,,,300226,5438,98921,,,,,33029,30133,314,0,6940,,,,,,401617,7001,401617,7001,105861,,,,330359,5727,,0 +"2020-07-01","CT",4324,3457,2,867,10268,10268,100,0,,,,0,,,461076,,,46572,44593,58,0,,,,,57711,8053,,0,520354,15034,,,,,,0,520354,15034 +"2020-07-01","DC",553,,2,,,,119,0,,33,,0,,,,,26,10365,,38,0,,,,,,1451,100035,2740,100035,2740,,,,,77908,1796,,0 +"2020-07-01","DE",509,451,0,58,,,68,0,,13,99874,467,,,,,,11510,10466,36,0,,,,,14450,6676,147835,4174,147835,4174,,,,,111384,503,,0 +"2020-07-01","FL",3650,3650,46,,15125,15125,,246,,,1821357,28796,,226699,2172217,,,156434,,6545,0,,,9575,,203480,,2163496,41848,2163496,41848,,,236304,,1981915,35405,2380131,42966 +"2020-07-01","GA",2827,,22,,11275,11275,1570,224,2357,,,0,,,,,,84237,84237,2946,0,8556,,,,76665,,,0,855625,21892,157971,,,,,0,855625,21892 +"2020-07-01","GU",5,,0,,,,0,0,,,13517,461,,,13152,,,267,259,8,0,2,,,,259,179,,0,13784,469,128,,,,,0,13411,370 +"2020-07-01","HI",18,18,0,,113,113,,2,,,78141,1298,,,,,,917,,17,0,,,,,878,736,91692,1454,91692,1454,,,,,79058,1315,92225,1648 +"2020-07-01","IA",717,,2,,,,149,0,,37,280339,5158,,30496,,,21,29451,29451,444,0,,,2315,,,23607,,0,309790,5602,,,32844,,310218,5610,,0 +"2020-07-01","ID",92,72,1,20,330,330,75,8,116,18,84923,1372,,,,,,6117,5553,365,0,,,,,,4233,,0,90476,1713,,,,,90476,1713,,0 +"2020-07-01","IL",7152,6951,28,201,,,1511,0,,384,,0,,,,,189,145066,144013,828,0,,,,,,,,0,1636055,33090,,,,,,0,1636055,33090 +"2020-07-01","IN",2650,2456,10,194,7095,7095,668,30,1483,232,443764,5162,,,,,103,45952,,358,0,,,,,48446,,,0,628495,12042,,,,,489716,5520,628495,12042 +"2020-07-01","KS",272,,2,,1152,1152,,0,367,,168183,5901,,,,152,,14990,,547,0,,,,,,,,0,183173,6448,,,,,182797,6449,,0 +"2020-07-01","KY",572,568,7,4,2635,2635,427,14,1007,73,,0,,,,,,15842,15286,218,0,,,,,,4052,,0,376534,6134,34683,,,,,0,376534,6134 +"2020-07-01","LA",3238,3130,17,108,,,799,0,,,691910,21494,,,,,84,60178,60178,2083,0,,,,,,43026,,0,752088,23577,,,,,,0,752088,23577 +"2020-07-01","MA",8081,7902,27,179,11352,11352,760,15,,123,749292,10033,,,,,65,109143,103858,261,0,,,,,137915,93157,,0,1118078,14528,,,72752,,853150,10190,1118078,14528 +"2020-07-01","MD",3205,3077,15,128,10902,10902,461,58,,154,474686,6390,,,,,,67918,67918,359,0,,,,,79129,5001,,0,656590,9571,,,,,542604,6749,656590,9571 +"2020-07-01","ME",105,104,0,1,351,351,29,3,,8,,0,7149,,,,3,3294,2922,41,0,338,,,,3633,2671,,0,98230,2236,7496,,,,,0,98230,2236 +"2020-07-01","MI",6198,5951,5,247,,,471,0,,179,,0,,,990770,,103,71089,64132,361,0,,,,,88219,51099,,0,1078989,16873,162911,,,,,0,1078989,16873 +"2020-07-01","MN",1482,1445,6,37,4081,4081,260,27,1258,125,580391,11378,,,,,,36716,36716,413,0,,,,,,31947,617107,11791,617107,11791,,,,,,0,,0 +"2020-07-01","MO",1017,,2,,,,592,0,,,367813,16357,,41961,399926,,75,21927,21927,376,0,,,1568,,23527,,,0,424214,0,,,43529,,389740,16733,424214,0 +"2020-07-01","MP",2,,0,,,,,0,,,8187,0,,,,,,30,30,0,0,,,,,,19,,0,8217,0,,,,,,0,8217,0 +"2020-07-01","MS",1082,1064,9,18,3177,3177,786,21,,160,265852,5553,,,,,85,27900,27710,653,0,,,,,,19388,,0,293752,6206,12038,,,,,0,293562,6016 +"2020-07-01","MT",22,,0,,105,105,14,4,,,,0,,,,,,1016,,49,0,,,,,,658,,0,93330,2469,,,,,,0,93330,2469 +"2020-07-01","NC",1373,1373,30,,,,901,0,,,,0,,,,,,66513,66513,1843,0,,,,,,,,0,895499,18461,,,,,,0,895499,18461 +"2020-07-01","ND",89,,1,,234,234,20,3,,,103611,1065,4790,,,,,3611,3611,39,0,186,,,,,3210,180927,2459,180927,2459,4976,,,,104898,1108,184779,2505 +"2020-07-01","NE",274,,5,,1330,1330,120,0,,,161431,2316,,,200223,,,19177,,135,0,,,,,23439,13737,,0,224300,3117,,,,,180826,2458,224300,3117 +"2020-07-01","NH",371,,4,,565,565,37,0,162,,113387,849,,,,,,5782,,22,0,,,,,,4463,,0,152928,1534,22264,,19264,,119169,871,152928,1534 +"2020-07-01","NJ",14987,13224,43,1763,20054,20054,1080,207,,217,1271009,20302,,,,,178,172936,171928,299,0,,,,,,,,0,1443945,20601,,,,,,0,1442937,20563 +"2020-07-01","NM",500,,3,,1928,1928,127,26,,,,0,,,,,,12276,,129,0,,,,,,5514,,0,350060,5879,,,,,,0,350060,5879 +"2020-07-01","NV",511,,4,,,,630,0,,142,264995,5883,,,,,74,19101,19101,645,0,,,,,,,361694,12485,361694,12485,,,,,282805,6827,331318,8374 +"2020-07-01","NY",24866,,11,,89995,89995,879,0,,226,,0,,,,,139,394079,,625,0,,,,,,,3971648,56710,3971648,56710,,,,,,0,,0 +"2020-07-01","OH",2876,2626,13,250,7911,7911,724,72,2008,244,,0,,,,,116,52865,49263,1076,0,,,,,57552,,,0,843895,18575,,,,,,0,843895,18575 +"2020-07-01","OK",389,,2,,1553,1553,374,33,,159,332201,4361,,,332201,,,14112,14112,355,0,1171,,,,15387,10605,,0,346313,4716,34490,,,,,0,348350,4727 +"2020-07-01","OR",207,,3,,1038,1038,149,13,,42,228978,2330,,,345317,,25,8656,,171,0,,,,,18385,2722,,0,363702,4039,,,,,237243,2474,363702,4039 +"2020-07-01","PA",6649,,0,,,,632,0,,,689562,11981,,,,,111,87242,84751,636,0,,,,,,68048,943287,17068,943287,17068,,,,,774313,12602,,0 +"2020-07-01","PR",153,59,0,94,,,121,0,,7,192686,0,,,191601,,3,1729,1729,36,0,5808,,,,2627,,,0,194415,36,,,,,,0,194324,0 +"2020-07-01","RI",956,,6,,2007,2007,69,6,,11,139063,1891,,,231451,,11,16976,,65,0,,,,,24284,,257151,1997,257151,1997,,,,,156039,1956,255735,4099 +"2020-07-01","SC",766,759,27,7,2854,2854,1160,0,,,351953,7780,36717,,341321,,,37919,37809,1520,0,1815,,,,48441,15471,,0,389872,9300,38532,,,,,0,389762,9292 +"2020-07-01","SD",93,,2,,674,674,65,8,,,74117,793,,,,,,6826,,62,0,,,,,11605,5933,,0,93298,1216,,,,,80943,855,93298,1216 +"2020-07-01","TN",609,583,5,26,2715,2715,955,50,,,,0,,,764905,,,45315,44951,1806,0,,,,,52617,28283,,0,817522,24743,,,,,,0,817522,24743 +"2020-07-01","TX",2481,,57,,,,6904,0,,,,0,,,,,,168062,168062,8076,0,7234,2488,,,290850,87556,,0,2513377,95012,197088,12058,,,,0,2513377,95012 +"2020-07-01","UT",173,,1,,1476,1476,261,32,423,84,335013,4768,,,393213,187,,22716,,499,0,,42,,39,26186,12707,,0,419399,6711,,204,,177,358654,5345,419399,6711 +"2020-07-01","VA",1786,1681,23,105,6262,6262,892,59,,205,,0,,,,,95,63203,60528,416,0,4337,161,,,75141,,671918,16514,671918,16514,78642,258,,,,0,,0 +"2020-07-01","VI",6,,0,,,,,0,,,2876,57,,,,,,90,,6,0,,,,,,73,,0,2966,63,,,,,2972,65,,0 +"2020-07-01","VT",56,56,0,,,,17,0,,,63258,522,,,,,,1212,1212,2,0,,,,,,961,,0,78000,971,,,,,64470,524,78000,971 +"2020-07-01","WA",1332,1332,12,,4361,4361,427,38,,,,0,,,,,50,35669,35664,989,0,,,,,,,695932,16148,695932,16148,,,,,557275,9055,,0 +"2020-07-01","WI",793,786,9,7,3482,3482,237,36,757,77,551607,12068,,,,,,32225,29199,563,0,,,,,,23089,711741,13743,711741,13743,,,,,580806,12608,,0 +"2020-07-01","WV",93,,0,,,,23,0,,5,,0,,,,,3,2932,2831,27,0,,,,,,2284,,0,171493,2407,9918,,,,,0,171493,2407 +"2020-07-01","WY",20,,0,,117,117,9,0,,,32185,0,,,50091,,,1514,1203,27,0,,,,,1426,1119,,0,51517,1230,,,,,33369,0,51517,1230 +"2020-06-30","AK",14,14,0,,68,68,18,0,,,,0,,,,,1,944,,36,0,,,,,,526,,0,112185,3476,,,,,,0,112185,3476 +"2020-06-30","AL",950,926,21,24,2769,2769,775,44,806,,368607,12489,,,,458,,38045,37536,870,0,,,,,,18866,,0,406143,13343,,,,,406143,13343,,0 +"2020-06-30","AR",270,,5,,1413,1413,290,33,,,290426,8147,,,,220,67,20777,20777,520,0,,,,,,14531,,0,311203,8667,,,,,,0,311203,8667 +"2020-06-30","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-06-30","AZ",1632,1529,44,103,4736,4736,2793,102,,683,453141,16251,,,,,455,79215,78781,4682,0,,,,,,,,0,759832,26633,,,169911,,531922,20913,759832,26633 +"2020-06-30","CA",5980,,44,,,,6466,0,,1751,,0,,,,,,228732,228732,9480,0,,,,,,,,0,4167139,105447,,,,,,0,4167139,105447 +"2020-06-30","CO",1690,1355,8,335,5489,5489,237,47,,,294788,3442,98921,,,,,32715,29844,204,0,6940,,,,,,394616,5803,394616,5803,105861,,,,324632,3635,,0 +"2020-06-30","CT",4322,3453,2,869,10268,10268,98,0,,,,0,,,446265,,,46514,44534,152,0,,,,,57508,8053,,0,505320,13287,,,,,,0,505320,13287 +"2020-06-30","DC",551,,0,,,,126,0,,33,,0,,,,,22,10327,,35,0,,,,,,1270,97295,1935,97295,1935,,,,,76112,1537,,0 +"2020-06-30","DE",509,451,2,58,,,64,0,,13,99407,852,,,,,,11474,10430,98,0,,,,,14278,6667,143661,3435,143661,3435,,,,,110881,950,,0 +"2020-06-30","FL",3604,3604,58,,14879,14879,,228,,,1792561,26159,,226699,2136944,,,149889,,6027,0,,,9575,,195894,,2121648,39427,2121648,39427,,,236304,,1946510,32359,2337165,37735 +"2020-06-30","GA",2805,,21,,11051,11051,1459,227,2323,,,0,,,,,,81291,81291,1874,0,8547,,,,74214,,,0,833733,11092,157623,,,,,0,833733,11092 +"2020-06-30","GU",5,,0,,,,0,0,,,13056,397,,,12792,,,259,251,4,0,2,,,,249,179,,0,13315,401,128,,,,,0,13041,200 +"2020-06-30","HI",18,18,0,,111,111,,0,,,76843,587,,,,,,900,,1,0,,,,,860,722,90238,880,90238,880,,,,,77743,588,90577,711 +"2020-06-30","IA",715,,7,,,,133,0,,34,275181,3118,,30308,,,20,29007,29007,225,0,,,2303,,,23212,,0,304188,3343,,,32644,,304608,3345,,0 +"2020-06-30","ID",91,71,0,20,322,322,60,10,114,18,83551,2525,,,,,,5752,5212,433,0,,,,,,4073,,0,88763,2947,,,,,88763,2947,,0 +"2020-06-30","IL",7124,6923,21,201,,,1560,0,,401,,0,,,,,185,144238,143185,724,0,,,,,,,,0,1602965,31069,,,,,,0,1602965,31069 +"2020-06-30","IN",2640,2448,16,192,7065,7065,695,41,1477,272,438602,7311,,,,,97,45594,,366,0,,,,,47831,,,0,616453,13264,,,,,484196,7677,616453,13264 +"2020-06-30","KS",270,,0,,1152,1152,,0,360,,162282,0,,,,152,,14443,,0,0,,,,,,,,0,176725,0,,,,,176348,0,,0 +"2020-06-30","KY",565,561,5,4,2621,2621,408,19,1019,75,,0,,,,,,15624,15090,277,0,,,,,,3990,,0,370400,9471,34381,,,,,0,370400,9471 +"2020-06-30","LA",3221,3113,22,108,,,781,0,,,670416,22860,,,,,83,58095,58095,1014,0,,,,,,42225,,0,728511,23874,,,,,,0,728511,23874 +"2020-06-30","MA",8054,7874,-41,180,11337,11337,733,-8,,120,739259,5740,,,,,63,108882,103701,114,0,,,,,137597,93157,,0,1103550,16112,,,71686,,842960,5813,1103550,16112 +"2020-06-30","MD",3190,3062,15,128,10844,10844,452,22,,152,468296,6237,,,,,,67559,67559,305,0,,,,,78682,4982,,0,647019,8682,,,,,535855,6542,647019,8682 +"2020-06-30","ME",105,104,0,1,348,348,29,1,,9,,0,7106,,,,4,3253,2893,34,0,332,,,,3600,2646,,0,95994,1426,7447,,,,,0,95994,1426 +"2020-06-30","MI",6193,5947,32,246,,,471,0,,179,,0,,,974329,,98,70728,63870,505,0,,,,,87787,51099,,0,1062116,15571,160431,,,,,0,1062116,15571 +"2020-06-30","MN",1476,1441,6,35,4054,4054,270,23,1258,136,569013,11919,,,,,,36303,36303,442,0,,,,,,31601,605316,12361,605316,12361,,,,,,0,,0 +"2020-06-30","MO",1015,,17,,,,599,0,,,351456,5093,,41436,399926,,66,21551,21551,508,0,,,1548,,23527,,,0,424214,0,,,42984,,373007,5601,424214,0 +"2020-06-30","MP",2,,0,,,,,0,,,8187,0,,,,,,30,30,0,0,,,,,,19,,0,8217,0,,,,,,0,8217,0 +"2020-06-30","MS",1073,1056,14,17,3156,3156,779,41,,167,260299,3344,,,,,91,27247,27067,680,0,,,,,,19388,,0,287546,4024,11965,,,,,0,287546,4191 +"2020-06-30","MT",22,,0,,101,101,12,1,,,,0,,,,,,967,,48,0,,,,,,642,,0,90861,2118,,,,,,0,90861,2118 +"2020-06-30","NC",1343,1343,18,,,,908,0,,,,0,,,,,,64670,64670,1186,0,,,,,,,,0,877038,16374,,,,,,0,877038,16374 +"2020-06-30","ND",88,,0,,231,231,25,4,,,102546,394,4747,,,,,3572,3572,38,0,183,,,,,3195,178468,1693,178468,1693,4930,,,,103790,668,182274,1710 +"2020-06-30","NE",269,,2,,1330,1330,121,14,,,159115,2742,,,197285,,,19042,,143,0,,,,,23261,13547,,0,221183,3951,,,,,178368,2884,221183,3951 +"2020-06-30","NH",367,,0,,565,565,34,0,162,,112538,0,,,,,,5760,,0,0,,,,,,4435,,0,151394,1995,21950,,19051,,118298,0,151394,1995 +"2020-06-30","NJ",14944,13181,43,1763,19847,19847,992,0,,211,1250707,17995,,,,,174,172637,171667,438,0,,,,,,,,0,1423344,18433,,,,,,0,1422374,18390 +"2020-06-30","NM",497,,4,,1902,1902,127,26,,,,0,,,,,,12147,,165,0,,,,,,5393,,0,344181,6461,,,,,,0,344181,6461 +"2020-06-30","NV",507,,3,,,,593,0,,134,259112,3989,,,,,65,18456,18456,562,0,,,,,,,349209,9795,349209,9795,,,,,275978,4581,322944,8556 +"2020-06-30","NY",24855,,13,,89995,89995,891,0,,217,,0,,,,,137,393454,,524,0,,,,,,,3914938,52025,3914938,52025,,,,,,0,,0 +"2020-06-30","OH",2863,2615,45,248,7839,7839,722,93,1994,242,,0,,,,,115,51789,48222,743,0,,,,,56576,,,0,825320,13328,,,,,,0,825320,13328 +"2020-06-30","OK",387,,2,,1520,1520,315,31,,111,327840,14819,,,327840,,,13757,13757,585,0,1171,,,,15029,10085,,0,341597,15404,34490,,,,,0,343623,15940 +"2020-06-30","OR",204,,2,,1025,1025,151,3,,44,226648,7119,,,341441,,25,8485,,144,0,,,,,18222,2700,,0,359663,5744,,,,,234769,18425,359663,5744 +"2020-06-30","PA",6649,,35,,,,634,0,,,677581,10680,,,,,110,86606,84130,618,0,,,,,,67552,926219,14219,926219,14219,,,,,761711,11281,,0 +"2020-06-30","PR",153,59,0,94,,,102,0,,9,192686,0,,,191601,,2,1693,1693,55,0,5772,,,,2627,,,0,194379,55,,,,,,0,194324,0 +"2020-06-30","RI",950,,4,,2001,2001,74,6,,13,137172,974,,,227493,,13,16911,,40,0,,,,,24143,,255154,3756,255154,3756,,,,,154083,1014,251636,1940 +"2020-06-30","SC",739,735,19,4,2854,2854,1021,232,,,344173,9512,36224,,334069,,,36399,36297,1755,0,1796,,,,46401,15471,,0,380572,11267,38020,,,,,0,380470,11263 +"2020-06-30","SD",91,,0,,666,666,62,9,,,73324,583,,,,,,6764,,48,0,,,,,11527,5872,,0,92082,463,,,,,80088,631,92082,463 +"2020-06-30","TN",604,578,12,26,2665,2665,886,66,,,,0,,,742366,,,43509,43161,1212,0,,,,,50413,27599,,0,792779,15921,,,,,,0,792779,15921 +"2020-06-30","TX",2424,,21,,,,6533,0,,,,0,,,,,,159986,159986,6975,0,7116,2219,,,272296,84818,,0,2418365,91085,192657,11113,,,,0,2418365,91085 +"2020-06-30","UT",172,,4,,1444,1444,250,27,406,83,330245,5180,,,387132,178,,22217,,553,0,,33,,31,25556,12398,,0,412688,7237,,163,,142,353309,5897,412688,7237 +"2020-06-30","VA",1763,1658,23,105,6203,6203,902,39,,230,,0,,,,,98,62787,60124,598,0,4276,157,,,74344,,655404,9645,655404,9645,77190,254,,,,0,,0 +"2020-06-30","VI",6,,0,,,,,0,,,2819,73,,,,,,84,,3,0,,,,,,73,,0,2903,76,,,,,2907,49,,0 +"2020-06-30","VT",56,56,0,,,,16,0,,,62736,766,,,,,,1210,1210,0,0,,,,,,953,,0,77029,1054,,,,,63946,766,77029,1054 +"2020-06-30","WA",1320,1320,10,,4323,4323,395,48,,,,0,,,,,50,34680,34675,266,0,,,,,,,679784,17729,679784,17729,,,,,548220,13777,,0 +"2020-06-30","WI",784,777,0,7,3446,3446,242,39,750,79,539539,12180,,,,,,31662,28659,629,0,,,,,,22587,697998,10772,697998,10772,,,,,568198,12781,,0 +"2020-06-30","WV",93,,0,,,,27,0,,10,,0,,,,,3,2905,2804,35,0,,,,,,2272,,0,169086,2536,9777,,,,,0,169086,2536 +"2020-06-30","WY",20,,0,,117,117,6,5,,,32185,1779,,,48890,,,1487,1184,37,0,,,,,1397,1097,,0,50287,1620,,,,,33369,1884,50287,1620 +"2020-06-29","AK",14,14,0,,68,68,16,0,,,,0,,,,,1,908,,21,0,,,,,,525,,0,108709,409,,,,,,0,108709,409 +"2020-06-29","AL",929,905,10,24,2725,2725,726,22,801,,356118,5279,,,,457,,37175,36682,1734,0,,,,,,18866,,0,392800,6997,,,,,392800,6997,,0 +"2020-06-29","AR",265,,6,,1380,1380,300,7,,,282279,10367,,,,211,63,20257,20257,947,0,,,,,,14066,,0,302536,11314,,,,,,0,302536,11314 +"2020-06-29","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-06-29","AZ",1588,1488,0,100,4634,4634,2721,17,,679,436890,902,,,,,465,74533,74119,625,0,,,,,,,,0,733199,9565,,,166748,,511009,1524,733199,9565 +"2020-06-29","CA",5936,,31,,,,6179,0,,1686,,0,,,,,,219252,219252,8009,0,,,,,,,,0,4061692,105740,,,,,,0,4061692,105740 +"2020-06-29","CO",1682,1350,6,332,5442,5442,271,41,,,291346,4088,98921,,,,,32511,29651,204,0,6940,,,,,,388813,5462,388813,5462,105861,,,,320997,4263,,0 +"2020-06-29","CT",4320,3451,4,869,10268,10268,99,0,,,,0,,,433199,,,46362,44384,59,0,,,,,57346,8053,,0,492033,3843,,,,,,0,492033,3843 +"2020-06-29","DC",551,,1,,,,121,0,,34,,0,,,,,23,10292,,44,0,,,,,,1200,95360,2228,95360,2228,,,,,74575,1792,,0 +"2020-06-29","DE",507,449,0,58,,,72,0,,15,98555,3435,,,,,,11376,10306,150,0,,,,,14070,6665,140226,4839,140226,4839,,,,,109931,3585,,0 +"2020-06-29","FL",3546,3546,28,,14651,14651,,111,,,1766402,25580,,226699,2106109,,,143862,,5363,0,,,9575,,189183,,2082221,37707,2082221,37707,,,236304,,1914151,30907,2299430,43116 +"2020-06-29","GA",2784,,6,,10824,10824,1359,113,2289,,,0,,,,,,79417,79417,2207,0,8529,,,,73044,,,0,822641,16179,157375,,,,,0,822641,16179 +"2020-06-29","GU",5,,0,,,,0,0,,,12659,529,,,12596,,,255,247,7,0,2,,,,245,179,,0,12914,536,128,,,,,0,12841,1318 +"2020-06-29","HI",18,18,0,,111,111,,1,,,76256,1650,,,,,,899,,27,0,,,,,859,719,89358,1901,89358,1901,,,,,77155,1677,89866,1984 +"2020-06-29","IA",708,,3,,,,119,0,,35,272063,4637,,29858,,,18,28782,28782,293,0,,,2282,,,17851,,0,300845,4930,,,32172,,301263,4928,,0 +"2020-06-29","ID",91,71,0,20,312,312,50,0,111,17,81026,0,,,,,,5319,4790,0,0,,,,,,3898,,0,85816,0,,,,,85816,0,,0 +"2020-06-29","IL",7103,6902,14,201,,,1501,0,,372,,0,,,,,187,143514,142461,738,0,,,,,,,,0,1571896,26918,,,,,,0,1571896,26918 +"2020-06-29","IN",2624,2432,5,192,7024,7024,626,21,1469,265,431291,5686,,,,,85,45228,,298,0,,,,,47156,,,0,603189,3768,,,,,476519,5984,603189,3768 +"2020-06-29","KS",270,,6,,1152,1152,,24,360,,162282,7961,,,,152,,14443,,905,0,,,,,,,,0,176725,8866,,,,,176348,8800,,0 +"2020-06-29","KY",560,557,2,3,2602,2602,381,12,999,69,,0,,,,,,15347,14835,115,0,,,,,,3939,,0,360929,3001,33844,,,,,0,360929,3001 +"2020-06-29","LA",3199,3091,0,108,,,737,0,,,647556,7681,,,,,79,57081,57081,845,0,,,,,,42225,,0,704637,8526,,,,,,0,704637,8526 +"2020-06-29","MA",8095,7895,35,200,11345,11345,762,26,,138,733519,6392,,,,,79,108768,103628,101,0,,,,,137252,93157,,0,1087438,16112,,,70768,,837147,6481,1087438,16112 +"2020-06-29","MD",3175,3048,7,127,10822,10822,447,29,,160,462059,9363,,,,,,67254,67254,477,0,,,,,78273,4979,,0,638337,12536,,,,,529313,9840,638337,12536 +"2020-06-29","ME",105,104,1,1,347,347,31,1,,8,,0,7023,,,,4,3219,2863,28,0,327,,,,3565,2623,,0,94568,1238,7359,,,,,0,94568,1238 +"2020-06-29","MI",6161,5915,3,246,,,557,0,,193,,0,,,959152,,106,70223,63497,277,0,,,,,87393,51099,,0,1046545,12725,158486,,,,,0,1046545,12725 +"2020-06-29","MN",1470,1435,10,35,4031,4031,278,21,1249,140,557094,7226,,,,,,35861,35861,312,0,,,,,,31225,592955,7538,592955,7538,,,,,,0,,0 +"2020-06-29","MO",998,,1,,,,599,0,,,346363,5765,,40851,399926,,,21043,21043,468,0,,,1537,,23527,,,0,424214,0,,,42388,,367406,6233,424214,0 +"2020-06-29","MP",2,,0,,,,,0,,,8187,0,,,,,,30,30,0,0,,,,,,19,,0,8217,0,,,,,,0,8217,0 +"2020-06-29","MS",1059,1042,20,17,3115,3115,719,13,,158,256955,2659,,,,,93,26567,26400,675,0,,,,,,19388,,0,283522,3334,11922,,,,,0,283355,3335 +"2020-06-29","MT",22,,0,,100,100,13,3,,,,0,,,,,,919,,56,0,,,,,,609,,0,88743,6269,,,,,,0,88743,6269 +"2020-06-29","NC",1325,1325,3,,,,843,0,,,,0,,,,,,63484,63484,1342,0,,,,,,,,0,860664,17548,,,,,,0,860664,17548 +"2020-06-29","ND",88,,0,,227,227,25,1,,,102152,1722,4702,,,,,3534,3534,46,0,180,,,,,3163,176775,3292,176775,3292,4882,,,,103122,1703,180564,3364 +"2020-06-29","NE",267,,0,,1316,1316,117,1,,,156373,2350,,,193600,,,18899,,124,0,,,,,23011,13322,,0,217232,2936,,,,,175484,2475,217232,2936 +"2020-06-29","NH",367,,0,,565,565,34,3,162,,112538,2146,,,,,,5760,,43,0,,,,,,4435,,0,149399,2117,21684,,19051,,118298,2189,149399,2117 +"2020-06-29","NJ",14901,13138,19,1763,19847,19847,978,6,,225,1232712,16061,,,,,185,172199,171272,106,0,,,,,,,,0,1404911,16167,,,,,,0,1403984,16151 +"2020-06-29","NM",493,,1,,1876,1876,119,11,,,,0,,,,,,11982,,173,0,,,,,,5296,,0,337720,6672,,,,,,0,337720,6672 +"2020-06-29","NV",504,,4,,,,555,0,,124,255123,4703,,,,,65,17894,17894,734,0,,,,,,,339414,2719,339414,2719,,,,,271397,5459,314388,7257 +"2020-06-29","NY",24842,,7,,89995,89995,853,0,,216,,0,,,,,136,392930,,391,0,,,,,,,3862913,46428,3862913,46428,,,,,,0,,0 +"2020-06-29","OH",2818,2575,11,243,7746,7746,669,65,1961,245,,0,,,,,115,51046,47524,737,0,,,,,55916,,,0,811992,17764,,,,,,0,811992,17764 +"2020-06-29","OK",385,,0,,1489,1489,329,33,,134,313021,0,,,313021,,,13172,13172,228,0,1171,,,,13941,9587,,0,326193,228,34490,,,,,0,327683,0 +"2020-06-29","OR",202,,0,,1022,1022,149,0,,53,219529,0,,,335952,,35,8341,,247,0,,,,,17967,2649,,0,353919,7083,,,,,216344,0,353919,7083 +"2020-06-29","PA",6614,,35,,,,635,0,,,666901,9415,,,,,111,85988,83529,492,0,,,,,,67070,912000,13811,912000,13811,,,,,750430,33763,,0 +"2020-06-29","PR",153,59,0,94,,,104,0,,8,192686,79406,,,191601,,1,1638,1638,14,0,5612,,,,2627,,,0,194324,79420,,,,,,0,194324,79601 +"2020-06-29","RI",946,,19,,1995,1995,73,11,,15,136198,1320,,,225612,,14,16871,,36,0,,,,,24084,,251398,1486,251398,1486,,,,,153069,1356,249696,3706 +"2020-06-29","SC",720,717,4,3,2622,2622,1032,0,,,334661,8179,35882,,324966,,,34644,34546,1324,0,1772,,,,44241,13456,,0,369305,9503,37654,,,,,0,369207,9504 +"2020-06-29","SD",91,,0,,657,657,70,5,,,72741,529,,,,,,6716,,35,0,,,,,11497,5818,,0,91619,1195,,,,,79457,564,91619,1195 +"2020-06-29","TN",592,568,8,24,2599,2599,839,35,,,,0,,,727985,,,42297,41949,2125,0,,,,,48873,26962,,0,776858,28629,,,,,,0,776858,28629 +"2020-06-29","TX",2403,,10,,,,5913,0,,,,0,,,,,,153011,153011,4288,0,6973,2000,,,254258,81335,,0,2327280,30546,187535,10346,,,,0,2327280,30546 +"2020-06-29","UT",168,,1,,1417,1417,254,21,394,80,325065,5176,,,380698,170,,21664,,564,0,,29,,28,24753,12205,,0,405451,6810,,159,,139,347412,5672,405451,6810 +"2020-06-29","VA",1740,1635,8,105,6164,6164,796,28,,225,,0,,,,,101,62189,59522,453,0,4257,147,,,73788,,645759,9045,645759,9045,76969,244,,,,0,,0 +"2020-06-29","VI",6,,0,,,,,0,,,2746,0,,,,,,81,,0,0,,,,,,71,,0,2827,0,,,,,2858,0,,0 +"2020-06-29","VT",56,56,0,,,,13,0,,,61970,1091,,,,,,1210,1210,6,0,,,,,,949,,0,75975,1439,,,,,63180,1097,75975,1439 +"2020-06-29","WA",1310,1310,0,,4275,4275,387,35,,,,0,,,,,52,34414,34409,493,0,,,,,,,662055,17616,662055,17616,,,,,534443,8641,,0 +"2020-06-29","WI",784,777,7,7,3407,3407,236,14,747,90,527359,5612,,,,,,31033,28058,326,0,,,,,,22217,687226,13191,687226,13191,,,,,555417,5927,,0 +"2020-06-29","WV",93,,0,,,,28,0,,5,,0,,,,,3,2870,2771,53,0,,,,,,2196,,0,166550,1267,9637,,,,,0,166550,1267 +"2020-06-29","WY",20,,0,,112,112,7,0,,,30406,0,,,47299,,,1450,1151,33,0,,,,,1368,1070,,0,48667,1981,,,,,31485,0,48667,1981 +"2020-06-28","AK",14,14,0,,68,68,12,1,,,,0,,,,,1,887,,29,0,,,,,,521,,0,108300,2719,,,,,,0,108300,2719 +"2020-06-28","AL",919,898,0,21,2703,2703,650,6,790,,350839,1896,,,,454,,35441,34964,358,0,,,,,,18866,,0,385803,1777,,,,,385803,1777,,0 +"2020-06-28","AR",259,,10,,1373,1373,278,36,,,271912,6687,,,,210,63,19310,19310,570,0,,,,,,13270,,0,291222,7257,,,,,,0,291222,7257 +"2020-06-28","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-06-28","AZ",1588,1488,9,100,4617,4617,2691,22,,666,435988,11292,,,,,475,73908,73497,3857,0,,,,,,,,0,723634,13808,,,164333,,509485,15148,723634,13808 +"2020-06-28","CA",5905,,33,,,,5956,0,,1602,,0,,,,,,211243,211243,4810,0,,,,,,,,0,3955952,93642,,,,,,0,3955952,93642 +"2020-06-28","CO",1676,1344,2,332,5401,5401,234,2,,,287258,5569,97025,,,,,32307,29476,285,0,6858,,,,,,383351,7655,383351,7655,103883,,,,316734,5851,,0 +"2020-06-28","CT",4316,3448,5,868,10268,10268,103,0,,,,0,,,429411,,,46303,44324,97,0,,,,,57294,8053,,0,488190,5325,,,,,,0,488190,5325 +"2020-06-28","DC",550,,2,,,,126,0,,34,,0,,,,,27,10248,,32,0,,,,,,1199,93132,3861,93132,3861,,,,,72783,3084,,0 +"2020-06-28","DE",507,449,0,58,,,78,0,,14,95120,1949,,,,,,11226,10162,135,0,,,,,13893,6665,135387,3119,135387,3119,,,,,106346,2084,,0 +"2020-06-28","FL",3518,3518,29,,14540,14540,,108,,,1740822,43842,,226699,2070179,,,138499,,8354,0,,,9575,,182100,,2044514,64790,2044514,64790,,,236304,,1883244,52453,2256314,69914 +"2020-06-28","GA",2778,,2,,10711,10711,1236,22,2268,,,0,,,,,,77210,77210,2225,0,8416,,,,70883,,,0,806462,17125,154116,,,,,0,806462,17125 +"2020-06-28","GU",5,,0,,,,1,0,,,12130,227,,,11284,,,248,240,0,0,2,,,,239,179,,0,12378,227,125,,,,,0,11523,0 +"2020-06-28","HI",18,18,1,,110,110,,1,,,74606,1171,,,,,,872,,6,0,,,,,833,714,87457,1457,87457,1457,,,,,75478,1177,87882,1418 +"2020-06-28","IA",705,,1,,,,118,0,,36,267426,5686,,29607,,,18,28489,28489,477,0,,,2276,,,17620,,0,295915,6163,,,31915,,296335,6164,,0 +"2020-06-28","ID",91,71,1,20,312,312,48,3,111,18,81026,2118,,,,,,5319,4790,171,0,,,,,,3898,,0,85816,2279,,,,,85816,2279,,0 +"2020-06-28","IL",7089,6888,15,201,,,1464,0,,373,,0,,,,,193,142776,141723,646,0,,,,,,,,0,1544978,23789,,,,,,0,1544978,23789 +"2020-06-28","IN",2619,2427,3,192,7003,7003,617,21,1468,266,425605,7163,,,,,86,44930,,355,0,,,,,46926,,,0,599421,5424,,,,,470535,7518,599421,5424 +"2020-06-28","KS",264,,0,,1128,1128,,0,356,,154321,0,,,,152,,13538,,0,0,,,,,,,,0,167859,0,,,,,167548,0,,0 +"2020-06-28","KY",558,555,5,3,2590,2590,386,1,996,68,,0,,,,,,15232,14732,373,0,,,,,,3730,,0,357928,7632,33837,,,,,0,357928,7632 +"2020-06-28","LA",3199,3086,9,113,,,715,0,,,639875,16638,,,,,76,56236,56236,1467,0,,,,,,39792,,0,696111,18105,,,,,,0,696111,18105 +"2020-06-28","MA",8060,7860,19,200,11319,11319,748,9,,134,727127,9228,,,,,81,108667,103539,224,0,,,,,136938,93157,,0,1071326,6248,,,70476,,830666,9391,1071326,6248 +"2020-06-28","MD",3168,3042,11,126,10793,10793,446,42,,158,452696,5330,,,,,,66777,66777,327,0,,,,,77679,4976,,0,625801,7564,,,,,519473,5657,625801,7564 +"2020-06-28","ME",104,103,0,1,346,346,31,1,,10,,0,7023,,,,4,3191,2838,37,0,327,,,,3541,2577,,0,93330,1523,7359,,,,,0,93330,1523 +"2020-06-28","MI",6158,5912,5,246,,,557,0,,193,,0,,,946733,,106,69946,63261,267,0,,,,,87087,51099,,0,1033820,15965,156996,,,,,0,1033820,15965 +"2020-06-28","MN",1460,1425,8,35,4010,4010,288,24,1241,143,549868,15994,,,,,,35549,35549,516,0,,,,,,30809,585417,16510,585417,16510,,,,,,0,,0 +"2020-06-28","MO",997,,1,,,,412,0,,,340598,5569,,39963,399926,,,20575,20575,314,0,,,1523,,23527,,,0,424214,0,,,41486,,361173,5883,424214,0 +"2020-06-28","MP",2,,0,,,,,0,,,8187,0,,,,,,30,30,0,0,,,,,,19,,0,8217,0,,,,,,0,8217,0 +"2020-06-28","MS",1039,1022,4,17,3102,3102,676,24,,149,254296,2506,,,,,88,25892,25724,361,0,,,,,,17242,,0,280188,2867,11843,,,,,0,280020,2862 +"2020-06-28","MT",22,,0,,97,97,11,2,,,,0,,,,,,863,,11,0,,,,,,604,,0,82474,1227,,,,,,0,82474,1227 +"2020-06-28","NC",1322,1322,10,,,,890,0,,,,0,,,,,,62142,62142,1605,0,,,,,,,,0,843116,20411,,,,,,0,843116,20411 +"2020-06-28","ND",88,,1,,226,226,24,1,,,100430,1369,4699,,,,,3488,3488,35,0,179,,,,,3139,173483,3109,173483,3109,4878,,,,101419,1339,177200,3225 +"2020-06-28","NE",267,,1,,1315,1315,123,3,,,154023,3949,,,190801,,,18775,,251,0,,,,,22877,13053,,0,214296,6371,,,,,173009,4209,214296,6371 +"2020-06-28","NH",367,,2,,562,562,35,1,162,,110392,1295,,,,,,5717,,46,0,,,,,,4401,,0,147282,2358,21628,,18713,,116109,1341,147282,2358 +"2020-06-28","NJ",14882,13121,27,1761,19841,19841,1014,18,,223,1216651,20274,,,,,187,172093,171182,331,0,,,,,,,,0,1388744,20605,,,,,,0,1387833,20583 +"2020-06-28","NM",492,,1,,1865,1865,114,14,,,,0,,,,,,11809,,190,0,,,,,,5264,,0,331048,8089,,,,,,0,331048,8089 +"2020-06-28","NV",500,,0,,,,511,0,,122,250420,3733,,,,,59,17160,17160,821,0,,,,,,,336695,6417,336695,6417,,,,,265938,4271,307131,5316 +"2020-06-28","NY",24835,,5,,89995,89995,869,0,,229,,0,,,,,167,392539,,616,0,,,,,,,3816485,61906,3816485,61906,,,,,,0,,0 +"2020-06-28","OH",2807,2564,3,243,7681,7681,661,57,1946,182,,0,,,,,101,50309,46790,854,0,,,,,55104,,,0,794228,21018,,,,,,0,794228,21018 +"2020-06-28","OK",385,,1,,1456,1456,329,16,,134,313021,0,,,313021,,,12944,12944,302,0,1171,,,,13941,9397,,0,325965,302,34490,,,,,0,327683,0 +"2020-06-28","OR",202,,0,,1022,1022,149,0,,53,219529,10479,,,329189,,35,8094,,276,0,,,,,17647,2649,,0,346836,8023,,,,,216344,0,346836,8023 +"2020-06-28","PA",6579,,0,,,,648,0,,,657486,22775,,,,,121,85496,81956,1126,0,,,,,,66686,898189,15191,898189,15191,,,,,716667,0,,0 +"2020-06-28","PR",153,59,1,94,,,99,0,,8,113280,0,,,112331,,5,1624,1624,22,0,5565,,,,2326,,,0,114904,22,,,,,,0,114723,0 +"2020-06-28","RI",927,,0,,1984,1984,91,0,,16,134878,578,,,221992,,15,16835,,22,0,,,,,23998,,249912,3284,249912,3284,,,,,151713,600,245990,1472 +"2020-06-28","SC",716,712,5,4,2622,2622,954,0,,,326482,7257,35645,,317085,,,33320,33221,1381,0,1752,,,,42618,13456,,0,359802,8638,37397,,,,,0,359703,8628 +"2020-06-28","SD",91,,0,,652,652,75,7,,,72212,738,,,,,,6681,,55,0,,,,,11440,5752,,0,90424,1221,,,,,78893,793,90424,1221 +"2020-06-28","TN",584,560,0,24,2564,2564,800,0,,,,0,,,701761,,,40172,39848,0,0,,,,,46468,26159,,0,748229,0,,,,,,0,748229,0 +"2020-06-28","TX",2393,,27,,,,5497,0,,,,0,,,,,,148723,148723,5357,0,6940,1872,,,247586,79974,,0,2296734,48975,184398,9872,,,,0,2296734,48975 +"2020-06-28","UT",167,,0,,1396,1396,289,31,389,83,319889,5454,,,374419,167,,21100,,472,0,,28,,27,24222,11931,,0,398641,7442,,158,,138,341740,5892,398641,7442 +"2020-06-28","VA",1732,1628,8,104,6136,6136,818,16,,235,,0,,,,,107,61736,59071,489,0,4236,142,,,73198,,636714,10692,636714,10692,76475,239,,,,0,,0 +"2020-06-28","VI",6,,0,,,,,0,,,2746,0,,,,,,81,,0,0,,,,,,71,,0,2827,0,,,,,2858,0,,0 +"2020-06-28","VT",56,56,0,,,,15,0,,,60879,1167,,,,,,1204,1204,3,0,,,,,,946,,0,74536,1541,,,,,62083,1170,74536,1541 +"2020-06-28","WA",1310,1310,6,,4240,4240,400,46,,,,0,,,,,58,33921,33916,626,0,,,,,,,644439,4854,644439,4854,,,,,525802,11374,,0 +"2020-06-28","WI",777,777,0,,3393,3393,251,11,746,93,521747,6024,,,,,,30707,27743,480,0,,,,,,21953,674035,12922,674035,12922,,,,,549490,6481,,0 +"2020-06-28","WV",93,,0,,,,32,0,,10,,0,,,,,4,2817,2723,56,0,,,,,,2062,,0,165283,2320,9584,,,,,0,165283,2320 +"2020-06-28","WY",20,,0,,112,112,5,1,,,30406,0,,,45354,,,1417,1121,25,0,,,,,1332,1057,,0,46686,209,,,,,31485,0,46686,209 +"2020-06-27","AK",14,14,0,,67,67,11,0,,,,0,,,,,1,858,,19,0,,,,,,521,,0,105581,3789,,,,,,0,105581,3789 +"2020-06-27","AL",919,898,12,21,2697,2697,655,44,789,,348943,4803,,,,453,,35083,34605,900,0,,,,,,18866,,0,384026,6169,,,,,384026,6169,,0 +"2020-06-27","AR",249,,9,,1337,1337,284,37,,,265225,5907,,,,206,63,18740,18740,678,0,,,,,,12784,,0,283965,6585,,,,,,0,283965,6585 +"2020-06-27","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-06-27","AZ",1579,1479,44,100,4595,4595,2577,81,,657,424696,11421,,,,,433,70051,69641,3503,0,,,,,,,,0,709826,23684,,,162440,,494337,15007,709826,23684 +"2020-06-27","CA",5872,,60,,,,5790,0,,1562,,0,,,,,,206433,206433,5972,0,,,,,,,,0,3862310,90996,,,,,,0,3862310,90996 +"2020-06-27","CO",1674,1343,1,331,5399,5399,235,7,,,281689,5902,97025,,,,,32022,29194,226,0,6858,,,,,,375696,8521,375696,8521,103883,,,,310883,6124,,0 +"2020-06-27","CT",4311,3443,4,868,10268,10268,106,0,,,,0,,,424169,,,46206,44225,147,0,,,,,57215,8053,,0,482865,11201,,,,,,0,482865,11201 +"2020-06-27","DC",548,,2,,,,136,0,,43,,0,,,,,26,10216,,31,0,,,,,,1194,89271,1148,89271,1148,,,,,69699,1031,,0 +"2020-06-27","DE",507,449,0,58,,,83,0,,15,93171,2088,,,,,,11091,10047,74,0,,,,,13798,6665,132268,4980,132268,4980,,,,,104262,2162,,0 +"2020-06-27","FL",3489,3489,25,,14432,14432,,151,,,1696980,51055,,226699,2010839,,,130145,,9534,0,,,9575,,171768,,1979724,71204,1979724,71204,,,236304,,1830791,60710,2186400,79352 +"2020-06-27","GA",2776,,6,,10689,10689,1178,84,2261,,,0,,,,,,74985,74985,1990,0,8367,,,,68570,,,0,789337,18785,152220,,,,,0,789337,18785 +"2020-06-27","GU",5,,0,,,,1,0,,,11903,259,,,11284,,,248,240,0,0,2,,,,239,179,,0,12151,259,125,,,,,0,11523,0 +"2020-06-27","HI",17,17,0,,109,109,,0,,,73435,1280,,,,,,866,,16,0,,,,,828,705,86000,1630,86000,1630,,,,,74301,1296,86464,1554 +"2020-06-27","IA",704,,0,,,,131,0,,40,261740,5783,,29466,,,22,28012,28012,326,0,,,2271,,,17467,,0,289752,6109,,,31769,,290171,6125,,0 +"2020-06-27","ID",90,70,0,20,309,309,42,6,108,19,78908,1403,,,,,,5148,4629,283,0,,,,,,3827,,0,83537,1666,,,,,83537,1666,,0 +"2020-06-27","IL",7074,6873,26,201,,,1516,0,,400,,0,,,,,225,142130,141077,786,0,,,,,,,,0,1521189,30237,,,,,,0,1521189,30237 +"2020-06-27","IN",2616,2424,21,192,6982,6982,595,38,1461,257,418442,8692,,,,,82,44575,,435,0,,,,,46660,,,0,593997,12788,,,,,463017,9127,593997,12788 +"2020-06-27","KS",264,,0,,1128,1128,,0,356,,154321,0,,,,152,,13538,,0,0,,,,,,,,0,167859,0,,,,,167548,0,,0 +"2020-06-27","KY",553,550,0,3,2589,2589,387,0,996,74,,0,,,,,,14859,14401,0,0,,,,,,3730,,0,350296,0,33340,,,,,0,350296,0 +"2020-06-27","LA",3190,3077,0,113,,,700,0,,,623237,0,,,,,73,54769,54769,0,0,,,,,,39792,,0,678006,0,,,,,,0,678006,0 +"2020-06-27","MA",8041,7841,28,200,11310,11310,769,19,,143,717899,11884,,,,,90,108443,103376,373,0,,,,,136818,93157,,0,1065078,7836,,,69826,,821275,12189,1065078,7836 +"2020-06-27","MD",3157,3030,15,127,10751,10751,478,26,,181,447366,7084,,,,,,66450,66450,335,0,,,,,77264,4935,,0,618237,10414,,,,,513816,7419,618237,10414 +"2020-06-27","ME",104,103,1,1,345,345,24,2,,7,,0,6943,,,,5,3154,2809,52,0,320,,,,3512,2566,,0,91807,2052,7271,,,,,0,91807,2052 +"2020-06-27","MI",6153,5907,19,246,,,557,0,,193,,0,,,931142,,106,69679,63009,350,0,,,,,86713,51099,,0,1017855,19365,154909,,,,,0,1017855,19365 +"2020-06-27","MN",1452,1417,6,35,3986,3986,300,20,1233,155,533874,11212,,,,,,35033,35033,417,0,,,,,,30401,568907,11629,568907,11629,,,,,,0,,0 +"2020-06-27","MO",996,,6,,,,680,0,,,335029,6325,,39980,399926,,66,20261,20261,347,0,,,1506,,23527,,,0,424214,0,,,41486,,355290,6672,424214,0 +"2020-06-27","MP",2,,0,,,,,0,,,8187,0,,,,,,30,30,0,0,,,,,,19,,0,8217,0,,,,,,0,8217,0 +"2020-06-27","MS",1035,1018,13,17,3078,3078,731,34,,169,251790,4962,,,,,90,25531,25368,465,0,,,,,,17242,,0,277321,5427,11652,,,,,0,277158,5424 +"2020-06-27","MT",22,,0,,95,95,9,0,,,,0,,,,,,852,,23,0,,,,,,604,,0,81247,1086,,,,,,0,81247,1086 +"2020-06-27","NC",1312,1312,9,,,,888,0,,,,0,,,,,,60537,60537,1719,0,,,,,,,,0,822705,19149,,,,,,0,822705,19149 +"2020-06-27","ND",87,,0,,225,225,23,3,,,99061,1596,4685,,,,,3453,3453,37,0,184,,,,,3119,170374,4085,170374,4085,4869,,,,100080,1553,173975,4161 +"2020-06-27","NE",266,,6,,1312,1312,125,18,,,150074,3418,,,184781,,,18524,,178,0,,,,,22547,12698,,0,207925,6228,,,,,168800,3605,207925,6228 +"2020-06-27","NH",365,,0,,561,561,32,0,161,,109097,0,,,,,,5671,,0,0,,,,,,4381,,0,144924,2979,21336,,18518,,114768,0,144924,2979 +"2020-06-27","NJ",14855,13094,36,1761,19823,19823,1103,71,,236,1196377,20289,,,,,200,171762,170873,313,0,,,,,,,,0,1368139,20602,,,,,,0,1367250,20578 +"2020-06-27","NM",491,,2,,1851,1851,122,23,,,,0,,,,,,11619,,211,0,,,,,,5251,,0,322959,2321,,,,,,0,322959,2321 +"2020-06-27","NV",500,,2,,,,503,0,,117,246687,3265,,,,,66,16339,16339,479,0,,,,,,,330278,9806,330278,9806,,,,,261667,3736,301815,4180 +"2020-06-27","NY",24830,,16,,89995,89995,908,0,,230,,0,,,,,167,391923,,703,0,,,,,,,3754579,73262,3754579,73262,,,,,,0,,0 +"2020-06-27","OH",2804,2561,16,243,7624,7624,561,54,1916,190,,0,,,,,106,49455,45969,817,0,,,,,54054,,,0,773210,20752,,,,,,0,773210,20752 +"2020-06-27","OK",384,,7,,1440,1440,329,47,,134,313021,14587,,,313021,,,12642,12642,299,0,1171,,,,13941,9155,,0,325663,14886,34490,,,,,0,327683,15229 +"2020-06-27","OR",202,,5,,1022,1022,149,10,,53,209050,0,,,321612,,35,7818,,250,0,,,,,17201,2649,,0,338813,12576,,,,,216344,0,338813,12576 +"2020-06-27","PA",6579,,0,,,,651,0,,,634711,0,,,,,126,84370,81956,0,0,,,,,,65808,882998,17481,882998,17481,,,,,716667,0,,0 +"2020-06-27","PR",152,58,1,94,,,105,0,,10,113280,0,,,112331,,5,1602,1602,19,0,5464,,,,2326,,,0,114882,19,,,,,,0,114723,0 +"2020-06-27","RI",927,,0,,1984,1984,91,0,,16,134300,1198,,,220557,,15,16813,,36,0,,,,,23961,,246628,2537,246628,2537,,,,,151113,1234,244518,3273 +"2020-06-27","SC",711,707,17,4,2622,2622,908,0,,,319225,14889,34799,,310105,,,31939,31850,1604,0,1734,,,,40970,13456,,0,351164,16493,36533,,,,,0,351075,16877 +"2020-06-27","SD",91,,3,,645,645,73,6,,,71474,994,,,,,,6626,,91,0,,,,,11372,5717,,0,89203,1441,,,,,78100,1085,89203,1441 +"2020-06-27","TN",584,560,7,24,2564,2564,705,66,,,,0,,,701761,,,40172,39848,728,0,,,,,46468,26159,,0,748229,6492,,,,,,0,748229,6492 +"2020-06-27","TX",2366,,42,,,,5523,0,,,,0,,,,,,143366,143366,5742,0,6918,1709,,,237339,78248,,0,2247759,86143,180835,9321,,,,0,2247759,86143 +"2020-06-27","UT",167,,1,,1365,1365,287,44,388,77,314435,5911,,,367463,166,,20628,,578,0,,26,,25,23736,11658,,0,391199,7760,,156,,136,335848,6550,391199,7760 +"2020-06-27","VA",1724,1620,24,104,6120,6120,819,49,,234,,0,,,,,103,61247,58611,677,0,4192,139,,,72567,,626022,10518,626022,10518,75057,236,,,,0,,0 +"2020-06-27","VI",6,,0,,,,,0,,,2746,41,,,,,,81,,0,0,,,,,,71,,0,2827,41,,,,,2858,60,,0 +"2020-06-27","VT",56,56,0,,,,14,0,,,59712,1118,,,,,,1201,1201,2,0,,,,,,946,,0,72995,1464,,,,,60913,1120,72995,1464 +"2020-06-27","WA",1304,1304,4,,4194,4194,386,88,,,,0,,,,,50,33295,33292,661,0,,,,,,,639585,8678,639585,8678,,,,,514428,8633,,0 +"2020-06-27","WI",777,777,11,,3382,3382,248,31,746,92,515723,8555,,,,,,30227,27286,559,0,,,,,,21606,661113,14722,661113,14722,,,,,543009,9094,,0 +"2020-06-27","WV",93,,1,,,,33,0,,10,,0,,,,,4,2761,2699,49,0,,,,,,2042,,0,162963,2896,9243,,,,,0,162963,2896 +"2020-06-27","WY",20,,0,,111,111,5,-1,,,30406,0,,,45155,,,1392,1097,24,0,,,,,1322,1054,,0,46477,244,,,,,31485,0,46477,244 +"2020-06-26","AK",14,14,2,,67,67,12,0,,,,0,,,,,2,839,,18,0,,,,,,519,,0,101792,2340,,,,,,0,101792,2340 +"2020-06-26","AL",907,887,11,20,2653,2653,668,41,772,,344140,7888,,,,450,,34183,33717,977,0,,,,,,18866,,0,377857,8852,,,,,377857,8852,,0 +"2020-06-26","AR",240,,0,,1300,1300,284,55,,,259318,0,,,,203,61,18062,18740,0,0,,,,,,12127,,0,277380,0,,,,,,0,277380,0 +"2020-06-26","AS",0,,0,,,,,0,,,696,0,,,,,,0,0,0,0,,,,,,,,0,696,0,,,,,,0,696,0 +"2020-06-26","AZ",1535,1435,45,100,4514,4514,2110,108,,581,413275,12109,,,,,312,66548,66055,3518,0,,,,,,,,0,686142,23669,,,157620,,479330,15530,686142,23669 +"2020-06-26","CA",5812,,79,,,,5639,0,,1570,,0,,,,,,200461,200461,4890,0,,,,,,,,0,3771314,76969,,,,,,0,3771314,76969 +"2020-06-26","CO",1673,1342,4,331,5392,5392,226,6,,,275787,4689,95693,,,,,31796,28972,317,0,6800,,,,,,367175,7238,367175,7238,102493,,,,304759,4987,,0 +"2020-06-26","CT",4307,3440,9,867,10268,10268,127,0,,,,0,,,413162,,,46059,44086,65,0,,,,,57071,8053,,0,471664,13871,,,,,,0,471664,13871 +"2020-06-26","DC",546,,3,,,,147,0,,48,,0,,,,,29,10185,,26,0,,,,,,1186,88123,1392,88123,1392,,,,,68668,2942,,0 +"2020-06-26","DE",507,449,0,58,,,78,0,,,91083,1071,,,,,,11017,9972,37,0,,,,,13640,6661,127288,2234,127288,2234,,,,,102100,1108,,0 +"2020-06-26","FL",3464,3464,41,,14281,14281,,213,,,1645925,39299,,226699,1943604,,,120611,,8814,0,,,9575,,159793,,1908520,65014,1908520,65014,,,236304,,1770081,48269,2107048,69674 +"2020-06-26","GA",2770,,25,,10605,10605,1184,148,2244,,,0,,,,,,72995,72995,1900,0,8275,,,,66512,,,0,770552,13104,149086,,,,,-757924,770552,13104 +"2020-06-26","GU",5,,0,,,,1,0,,,11644,471,,,11284,,,248,240,3,0,2,,,,239,179,,0,11892,474,125,,,,,0,11523,422 +"2020-06-26","HI",17,17,0,,109,109,,4,,,72155,1055,,,,,,850,,15,0,,,,,812,696,84370,1569,84370,1569,,,,,73005,1070,84910,1609 +"2020-06-26","IA",704,,9,,,,141,0,,42,255957,6100,,28898,,,24,27686,27686,489,0,,,2255,,,17313,,0,283643,6589,,,31185,,284046,6602,,0 +"2020-06-26","ID",90,70,0,20,303,303,48,3,106,20,77505,1611,,,,,,4865,4366,220,0,,,,,,3712,,0,81871,1811,,,,,81871,1811,,0 +"2020-06-26","IL",7048,6847,34,201,,,1516,0,,400,,0,,,,,225,141344,140291,910,0,,,,,,,,0,1490952,30425,,,,,,0,1490952,30425 +"2020-06-26","IN",2595,2403,9,192,6944,6944,692,32,1458,281,409750,9153,,,,,94,44140,,485,0,,,,,46080,,,0,581209,12144,,,,,453890,9638,581209,12144 +"2020-06-26","KS",264,,3,,1128,1128,,46,356,,154321,5586,,,,152,,13538,,568,0,,,,,,,,0,167859,6154,,,,,167548,6110,,0 +"2020-06-26","KY",553,550,7,3,2589,2589,387,5,996,74,,0,,,,,,14859,14401,242,0,,,,,,3730,,0,350296,7849,33340,,,,,0,350296,7849 +"2020-06-26","LA",3190,3077,26,113,,,700,0,,,623237,15987,,,,,73,54769,54769,1354,0,,,,,,39792,,0,678006,17341,,,,,,0,678006,17341 +"2020-06-26","MA",8013,7815,50,198,11291,11291,791,39,,156,706015,8396,,,,,99,108070,103071,233,0,,,,,136627,93157,,0,1057242,13231,,,68259,,809086,8545,1057242,13231 +"2020-06-26","MD",3142,3015,13,127,10725,10725,487,42,,190,440282,7100,,,,,,66115,66115,338,0,,,,,76821,4903,,0,607823,9914,,,,,506397,7438,607823,9914 +"2020-06-26","ME",103,102,0,1,343,343,28,0,,9,,0,6799,,,,6,3102,2758,32,0,316,,,,3454,2542,,0,89755,2211,7123,,,,,0,89755,2211 +"2020-06-26","MI",6134,5888,1,246,,,557,0,,193,,0,,,912377,,106,69329,62695,340,0,,,,,86113,49290,,0,998490,19072,151973,,,,,0,998490,19072 +"2020-06-26","MN",1446,1411,5,35,3966,3966,335,23,1221,157,522662,14089,,,,,,34616,34616,493,0,,,,,,30008,557278,14582,557278,14582,,,,,,0,,0 +"2020-06-26","MO",990,,8,,,,600,0,,,328704,6477,,39315,399926,,66,19914,19914,493,0,,,1497,,23527,,,0,424214,97190,,,40812,,348618,6970,424214,97190 +"2020-06-26","MP",2,,0,,,,,0,,,8187,0,,,,,,30,30,0,0,,,,,,19,,0,8217,0,,,,,,0,8217,0 +"2020-06-26","MS",1022,1005,6,17,3044,3044,769,46,,153,246828,5347,,,,,90,25066,24906,550,0,,,,,,17242,,0,271894,5897,11389,,,,,0,271734,5895 +"2020-06-26","MT",22,,1,,95,95,14,2,,,,0,,,,,,829,,26,0,,,,,,589,,0,80161,1829,,,,,,0,80161,1829 +"2020-06-26","NC",1303,1303,19,,,,892,0,,,,0,,,,,,58818,58818,1635,0,,,,,,,,0,803556,21238,,,,,,0,803556,21238 +"2020-06-26","ND",87,,0,,222,222,23,0,,,97465,1414,4637,,,,,3416,3416,28,0,182,,,,,3090,166289,4343,166289,4343,4819,,,,98527,1424,169814,4415 +"2020-06-26","NE",260,,3,,1294,1294,126,26,,,146656,1707,,,178893,,,18346,,125,0,,,,,22221,12314,,0,201697,2410,,,,,165195,1827,201697,2410 +"2020-06-26","NH",365,,18,,561,561,32,3,161,,109097,3129,,,,,,5671,,73,0,,,,,,4381,,0,141945,2509,21049,,18518,,114768,3202,141945,2509 +"2020-06-26","NJ",14819,13060,43,1759,19752,19752,1118,84,,234,1176088,25374,,,,,206,171449,170584,419,0,,,,,,,,0,1347537,25793,,,,,,0,1346672,25762 +"2020-06-26","NM",489,,4,,1828,1828,128,17,,,,0,,,,,,11408,,216,0,,,,,,5149,,0,320638,5968,,,,,,0,320638,5968 +"2020-06-26","NV",498,,3,,,,471,0,,118,243422,2731,,,,,59,15860,15860,381,0,,,,,,,320472,8523,320472,8523,,,,,257931,3057,297635,3782 +"2020-06-26","NY",24814,,14,,89995,89995,951,0,,244,,0,,,,,167,391220,,805,0,,,,,,,3681317,61723,3681317,61723,,,,,,0,,0 +"2020-06-26","OH",2788,2545,16,243,7570,7570,624,68,1904,205,,0,,,,,116,48638,45172,987,0,,,,,52960,,,0,752458,21386,,,,,,0,752458,21386 +"2020-06-26","OK",377,,2,,1393,1393,308,57,,126,298434,5417,,,298434,,,12343,12343,395,0,1058,,,,13338,8817,,0,310777,5812,30021,,,,,0,312454,5738 +"2020-06-26","OR",197,,2,,1012,1012,189,6,,60,209050,2486,,,309548,,29,7568,,124,0,,,,,16689,2649,,0,326237,2584,,,,,216344,2595,326237,2584 +"2020-06-26","PA",6579,,22,,,,661,0,,,634711,13680,,,,,131,84370,81956,600,0,,,,,,65808,865517,19804,865517,19804,,,,,716667,14262,,0 +"2020-06-26","PR",151,57,0,94,,,89,0,,9,113280,0,,,112331,,7,1583,1583,4,0,5339,,,,2326,,,0,114863,4,,,,,,0,114723,0 +"2020-06-26","RI",927,,7,,1984,1984,91,3,,16,133102,1314,,,217368,,15,16777,,69,0,,,,,23877,,244091,2971,244091,2971,,,,,149879,1383,241245,2458 +"2020-06-26","SC",694,692,1,2,2622,2622,906,245,,,304336,0,33536,,296525,,,30335,30263,1313,0,1706,,,,37673,13456,,0,334671,1313,35242,,,,,0,334198,0 +"2020-06-26","SD",88,,1,,639,639,79,7,,,70480,1105,,,,,,6535,,56,0,,,,,9931,5652,,0,87762,1239,,,,,77015,1161,87762,1239 +"2020-06-26","TN",577,552,10,25,2498,2498,741,67,,,,0,,,696003,,,39444,39149,1410,0,,,,,45734,25753,,0,741737,14469,,,,,,0,741737,14469 +"2020-06-26","TX",2324,,28,,,,5102,0,,,,0,,,,,,137624,137624,5707,0,6871,1542,,,221863,76282,,0,2161616,77860,177863,8490,,,,0,2161616,77860 +"2020-06-26","UT",166,,2,,1321,1321,238,31,375,80,308524,4488,,,360392,161,,20050,,676,0,,26,,25,23047,11097,,0,383439,6208,,145,,128,329298,5059,383439,6208 +"2020-06-26","VA",1700,1596,25,104,6071,6071,854,76,,219,,0,,,,,99,60570,57977,624,0,4158,127,,,71867,,615504,11693,615504,11693,73574,224,,,,0,,0 +"2020-06-26","VI",6,,0,,,,,0,,,2705,51,,,,,,81,,1,0,,,,,,67,,0,2786,52,,,,,2798,43,,0 +"2020-06-26","VT",56,56,0,,,,14,0,,,58594,881,,,,,,1199,1199,7,0,,,,,,941,,0,71531,1453,,,,,59793,888,71531,1453 +"2020-06-26","WA",1300,1300,7,,4106,4106,372,13,,,,0,,,,,49,32634,32632,676,0,,,,,,,630907,13587,630907,13587,,,,,505795,10297,,0 +"2020-06-26","WI",766,766,0,,3351,3351,262,25,741,95,507168,8607,,,,,,29668,26747,563,0,,,,,,21174,646391,13218,646391,13218,,,,,533915,9127,,0 +"2020-06-26","WV",92,,0,,,,33,0,,10,,0,,,,,4,2712,2622,51,0,,,,,,1907,,0,160067,3079,9210,,,,,0,160067,3079 +"2020-06-26","WY",20,,0,,112,112,5,1,,,30406,1537,,,44917,,,1368,1079,42,0,,,,,1316,1033,,0,46233,1250,,,,,31485,1600,46233,1250 +"2020-06-25","AK",12,12,0,,67,67,14,0,,,,0,,,,,2,821,,24,0,,,,,,513,,0,99452,3356,,,,,,0,99452,3356 +"2020-06-25","AL",896,880,5,16,2612,2612,694,45,761,,336252,9557,,,,447,,33206,32753,1142,0,,,,,,18866,,0,369005,10686,,,,,369005,10686,,0 +"2020-06-25","AR",240,,0,,1245,1245,284,31,,,259318,4827,,,,194,61,18062,18062,687,0,,,,,,12127,,0,277380,5514,,,,,,0,277380,5514 +"2020-06-25","AS",0,,0,,,,,0,,,696,522,,,,,,0,0,0,0,,,,,,,,0,696,522,,,,,,0,696,522 +"2020-06-25","AZ",1490,1393,27,97,4406,4406,2453,93,,611,401166,11952,,,,,415,63030,62634,3056,0,,,,,,,,0,662473,23698,,,155343,,463800,15000,662473,23698 +"2020-06-25","CA",5733,,101,,,,5522,0,,1523,,0,,,,,,195571,195571,5349,0,,,,,,,,0,3694345,101446,,,,,,0,3694345,101446 +"2020-06-25","CO",1669,1337,2,332,5386,5386,247,11,,,271098,6188,94101,,,,,31479,28674,324,0,6719,,,,,,359937,8287,359937,8287,100820,,,,299772,6488,,0 +"2020-06-25","CT",4298,3434,11,864,10268,10268,122,169,,,,0,,,399481,,,45994,44018,81,0,,,,,56907,8053,,0,457793,13534,,,,,,0,457793,13534 +"2020-06-25","DC",543,,2,,,,157,0,,53,,0,,,,,34,10159,,31,0,,,,,,1182,86731,2558,86731,2558,,,,,65726,0,,0 +"2020-06-25","DE",507,449,2,58,,,93,0,,,90012,2700,,,,,,10980,9925,91,0,,,,,13553,6646,125054,1184,125054,1184,,,,,100992,2791,,0 +"2020-06-25","FL",3423,3423,46,,14068,14068,,203,,,1606626,47298,,198132,1885749,,,111797,,4991,0,,,8627,,148081,,1843506,53065,1843506,53065,,,206789,,1721812,52372,2037374,58617 +"2020-06-25","GA",2745,,47,,10457,10457,1135,144,2222,,,0,,,,,,71095,71095,1714,0,8185,,,,64811,,,0,757448,14690,146230,,,,757924,14690,757448,14690 +"2020-06-25","GU",5,,0,,,,0,0,,0,11173,366,,,10878,,0,245,237,14,0,2,,,,223,174,,0,11418,380,122,,,,,0,11101,390 +"2020-06-25","HI",17,17,0,,105,105,,1,,,71100,1380,,,,,,835,,16,0,,,,,793,686,82801,2046,82801,2046,,,,,71935,1396,83301,1653 +"2020-06-25","IA",695,,3,,,,137,0,,42,249857,6603,,28404,,,26,27197,27197,492,0,,,2238,,,17017,,0,277054,7095,,,30674,,277444,7112,,0 +"2020-06-25","ID",90,70,1,20,300,300,45,2,106,14,75894,2461,,,,,,4645,4166,243,0,,,,,,3610,,0,80060,2684,,,,,80060,2684,,0 +"2020-06-25","IL",7014,6810,40,204,,,1626,0,,399,,0,,,,,216,140434,139434,894,0,,,,,,,,0,1460527,31686,,,,,,0,1460527,31686 +"2020-06-25","IN",2586,2394,8,192,6912,6912,723,29,1452,276,400597,11854,,,,,91,43655,,515,0,,,,,45558,,,0,569065,11644,,,,,444252,12369,569065,11644 +"2020-06-25","KS",261,,0,,1082,1082,,0,348,,148735,0,,,,150,,12970,,0,0,,,,,,,,0,161705,0,,,,,161438,0,,0 +"2020-06-25","KY",546,542,8,4,2584,2584,377,10,994,79,,0,,,,,,14617,14182,254,0,,,,,,3719,,0,342447,7171,34447,,,,,0,342447,7171 +"2020-06-25","LA",3164,3051,12,113,,,653,0,,,607250,11222,,,,,77,53415,53415,938,0,,,,,,39792,,0,660665,12160,,,,,,0,660665,12160 +"2020-06-25","MA",7963,7776,25,187,11252,11252,822,33,,174,697619,10158,,,,,101,107837,102922,226,0,,,,,136298,93157,,0,1044011,12646,,,66753,,800541,10318,1044011,12646 +"2020-06-25","MD",3129,3001,21,128,10683,10683,511,35,,209,433182,8062,,,,,,65777,65777,440,0,,,,,76340,4874,,0,597909,11637,,,,,498959,8502,597909,11637 +"2020-06-25","ME",103,102,0,1,343,343,25,4,,10,,0,6780,,,,7,3070,2731,53,0,311,,,,3415,2512,,0,87544,2398,7099,,,,,0,87544,2398 +"2020-06-25","MI",6133,5886,19,247,,,557,0,,193,,0,,,893850,,115,68989,62306,434,0,,,,,85568,49290,,0,979418,18050,148912,,,,,0,979418,18050 +"2020-06-25","MN",1441,1406,9,35,3943,3943,336,46,1218,162,508573,12693,,,,,,34123,34123,360,0,,,,,,29854,542696,13053,542696,13053,,,,,,0,,0 +"2020-06-25","MO",982,,7,,,,546,0,,,322227,14071,,37177,360303,,66,19421,19421,553,0,,,1451,,21737,,,0,327024,0,,,38268,,341648,14624,327024,0 +"2020-06-25","MP",2,,0,,,,,0,,,8187,0,,,,,,30,30,0,0,,,,,,19,,0,8217,0,,,,,,0,8217,0 +"2020-06-25","MS",1016,999,5,17,2998,2998,755,52,,157,241481,3244,,,,,94,24516,24358,1092,0,,,,,,17242,,0,265997,4336,11330,,,,,0,265839,4334 +"2020-06-25","MT",21,,0,,93,93,15,0,,,,0,,,,,,803,,37,0,,,,,,572,,0,78332,3266,,,,,,0,78332,3266 +"2020-06-25","NC",1284,1284,18,,,,891,0,,,,0,,,,,,57183,57183,1009,0,,,,,,,,0,782318,18527,,,,,,0,782318,18527 +"2020-06-25","ND",87,,1,,222,222,25,3,,,96051,724,4530,,,,,3388,3388,32,0,147,,,,,3064,161946,2894,161946,2894,4677,,,,97103,735,165399,2965 +"2020-06-25","NE",257,,1,,1268,1268,131,11,,,144949,1740,,,176638,,,18221,,129,0,,,,,22070,12099,,0,199287,2897,,,,,163368,1874,199287,2897 +"2020-06-25","NH",347,,4,,558,558,49,0,160,,105968,1486,,,,,,5598,,27,0,,,,,,4358,,0,139436,2775,20785,,18082,,111566,1513,139436,2775 +"2020-06-25","NJ",14776,13018,23,1758,19668,19668,1182,70,,252,1150714,20961,,,,,210,171030,170196,324,0,,,,,,,,0,1321744,21285,,,,,,0,1320910,21265 +"2020-06-25","NM",485,,5,,1811,1811,135,18,,,,0,,,,,,11192,,202,0,,,,,,5047,,0,314670,6565,,,,,,0,314670,6565 +"2020-06-25","NV",495,,1,,,,467,0,,98,240691,2666,,,,,57,15479,15479,887,0,,,,,,,311949,8798,311949,8798,,,,,254874,2967,293853,3933 +"2020-06-25","NY",24800,,18,,89995,89995,996,0,,270,,0,,,,,167,390415,,749,0,,,,,,,3619594,67642,3619594,67642,,,,,,0,,0 +"2020-06-25","OH",2772,2530,17,242,7502,7502,624,55,1897,206,,0,,,,,121,47651,44221,892,0,,,,,51845,,,0,731072,18345,,,,,,0,731072,18345 +"2020-06-25","OK",375,,3,,1336,1336,277,17,,87,293017,6249,,,293017,,,11948,11948,438,0,1058,,,,13108,8507,,0,304965,6687,30021,,,,,0,306716,6786 +"2020-06-25","OR",195,,3,,1006,1006,185,23,,59,206564,3126,,,307081,,29,7444,,170,0,,,,,16572,2604,,0,323653,6831,,,,,213749,3293,323653,6831 +"2020-06-25","PA",6557,,39,,,,704,0,,,621031,12814,,,,,142,83770,81374,579,0,,,,,,65340,845713,17380,845713,17380,,,,,702405,13378,,0 +"2020-06-25","PR",151,57,2,94,,,85,0,,12,113280,0,,,112331,,4,1579,1579,2,0,5298,,,,2326,,,0,114859,2,,,,,,0,114723,0 +"2020-06-25","RI",920,,8,,1981,1981,103,14,,18,131788,1406,,,214999,,17,16708,,45,0,,,,,23788,,241120,3614,241120,3614,,,,,148496,1451,238787,2841 +"2020-06-25","SC",693,691,10,2,2377,2377,881,0,,,304336,14025,33536,,296525,,,29022,28962,1125,0,1706,,,,37673,12317,,0,333358,15150,35242,,,,,0,334198,7567 +"2020-06-25","SD",87,,3,,632,632,79,3,,,69375,717,,,,,,6479,,60,0,,,,,9850,5592,,0,86523,1325,,,,,75854,777,86523,1325 +"2020-06-25","TN",567,540,11,27,2431,2431,741,45,,,,0,,,683066,,,38034,37753,799,0,,,,,44202,25280,,0,727268,9230,,,,,,0,727268,9230 +"2020-06-25","TX",2296,,47,,,,4739,0,,,,0,,,,,,131917,131917,5996,0,6823,1337,,,207327,74496,,0,2083756,72894,176697,7673,,,,0,2083756,72894 +"2020-06-25","UT",164,,1,,1290,1290,230,34,365,79,304036,5156,,,354800,160,,19374,,590,0,,25,,24,22431,10642,,0,377231,6874,,124,,109,324239,5788,377231,6874 +"2020-06-25","VA",1675,1572,14,103,5995,5995,854,40,,237,,0,,,,,104,59946,57384,432,0,4103,123,,,70986,,603811,11740,603811,11740,71993,219,,,,0,,0 +"2020-06-25","VI",6,,0,,,,,0,,,2654,61,,,,,,80,,2,0,,,,,,64,,0,2734,63,,,,,2755,49,,0 +"2020-06-25","VT",56,56,0,,,,15,0,,,57713,847,,,,,,1192,1192,7,0,,,,,,938,,0,70078,1160,,,,,58905,854,70078,1160 +"2020-06-25","WA",1293,1293,9,,4093,4093,402,26,,,,0,,,,,56,31958,31956,620,0,,,,,,,617320,13233,617320,13233,,,,,495498,8439,,0 +"2020-06-25","WI",766,766,9,,3326,3326,247,27,734,94,498561,10758,,,,,,29105,26227,464,0,,,,,,20557,633173,17149,633173,17149,,,,,524788,11222,,0 +"2020-06-25","WV",92,,0,,,,24,0,,5,,0,,,,,2,2661,2574,32,0,,,,,,1858,,0,156988,2391,8988,,,,,0,156988,2391 +"2020-06-25","WY",20,,0,,111,111,7,2,,,28869,0,,,43693,,,1326,1052,44,0,,,,,1290,996,,0,44983,1327,,,,,29885,0,44983,1327 +"2020-06-24","AK",12,12,0,,67,67,16,1,,,,0,,,,,2,797,,14,0,,,,,,507,,0,96096,3149,,,,,,0,96096,3149 +"2020-06-24","AL",891,879,27,12,2567,2567,683,46,749,,326695,3754,,,,441,,32064,31624,967,0,,,,,,18866,,0,358319,4708,,,,,358319,4708,,0 +"2020-06-24","AR",240,,3,,1214,1214,267,26,,,254491,6677,,,,189,58,17375,17375,697,0,,,,,,11568,,0,271866,7374,,,,,,0,271866,7374 +"2020-06-24","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-24","AZ",1463,1366,79,97,4313,4313,2270,58,,581,389214,6875,,,,,407,59974,59586,1795,0,,,,,,,,0,638775,23477,,,151006,,448800,8662,638775,23477 +"2020-06-24","CA",5632,,52,,,,5399,0,,1487,,0,,,,,,190222,190222,7149,0,,,,,,,,0,3592899,95970,,,,,,0,3592899,95970 +"2020-06-24","CO",1667,1335,2,332,5375,5375,247,9,,,264910,4969,92756,,,,,31155,28374,262,0,6658,,,,,,351650,6281,351650,6281,99414,,,,293284,5205,,0 +"2020-06-24","CT",4287,3423,10,864,10099,10099,124,0,,,,0,,,386155,,,45913,43954,14,0,,,,,56721,7842,,0,444259,12002,,,,,,0,444259,12002 +"2020-06-24","DC",541,,4,,,,167,0,,58,,0,,,,,36,10128,,34,0,,,,,,1182,84173,871,84173,871,,,,,65726,653,,0 +"2020-06-24","DE",505,447,1,58,,,85,0,,,87312,623,,,,,,10889,9834,42,0,,,,,13501,6598,123870,2304,123870,2304,,,,,98201,665,,0 +"2020-06-24","FL",3377,3377,44,,13865,13865,,251,,,1559328,22079,,198132,1833006,,,106806,,5471,0,,,8627,,142315,,1790441,32598,1790441,32598,,,206789,,1669440,27602,1978757,34027 +"2020-06-24","GA",2698,,10,,10313,10313,1124,190,2206,,,0,,,,,,69381,69381,1703,0,8106,,,,63113,,,0,742758,11973,143350,,,,743234,11973,742758,11973 +"2020-06-24","GU",5,,0,,,,0,0,,0,10807,381,,,10493,,0,231,223,6,0,2,,,,218,174,,0,11038,387,122,,,,,0,10711,266 +"2020-06-24","HI",17,17,0,,104,104,,5,,,69720,1196,,,,,,819,,3,0,,,,,782,673,80755,1275,80755,1275,,,,,70539,1199,81648,1254 +"2020-06-24","IA",692,,4,,,,140,0,,43,243254,4924,,28021,,,25,26705,26705,332,0,,,2223,,,16858,,0,269959,5256,,,30276,,270332,5258,,0 +"2020-06-24","ID",89,69,0,20,298,298,34,5,105,14,73433,1523,,,,,,4402,3943,148,0,,,,,,3484,,0,77376,1646,,,,,77376,1646,,0 +"2020-06-24","IL",6974,6770,63,204,,,1614,0,,389,,0,,,,,219,139540,138540,715,0,,,,,,,,0,1428841,29331,,,,,,0,1428841,29331 +"2020-06-24","IN",2578,2386,9,192,6883,6883,701,30,1446,263,388743,5238,,,,,89,43140,,269,0,,,,,45085,,,0,557421,12883,,,,,431883,5507,557421,12883 +"2020-06-24","KS",261,,2,,1082,1082,,26,348,,148735,6187,,,,150,,12970,,505,0,,,,,,,,0,161705,6692,,,,,161438,6668,,0 +"2020-06-24","KY",538,534,1,4,2574,2574,335,18,992,79,,0,,,,,,14363,13937,222,0,,,,,,3706,,0,335276,4387,32876,,,,,0,335276,4387 +"2020-06-24","LA",3152,3039,18,113,,,631,0,,,596028,11684,,,,,77,52477,52477,882,0,,,,,,39792,,0,648505,12566,,,,,,0,648505,12566 +"2020-06-24","MA",7938,7752,48,186,11219,11219,939,62,,181,687461,7258,,,,,98,107611,102762,172,0,,,,,135964,91404,,0,1031365,13998,,,65845,,790223,7369,1031365,13998 +"2020-06-24","MD",3108,2978,16,130,10648,10648,544,37,,213,425120,6592,,,,,,65337,65337,330,0,,,,,75828,4810,,0,586272,8887,,,,,490457,6922,586272,8887 +"2020-06-24","ME",103,102,1,1,339,339,26,0,,12,,0,6652,,,,6,3017,2680,23,0,308,,,,3367,2490,,0,85146,1867,6968,,,,,0,85146,1867 +"2020-06-24","MI",6114,5868,5,246,,,557,0,,209,,0,,,876250,,124,68555,61953,358,0,,,,,85118,49290,,0,961368,16159,146035,,,,,0,961368,16159 +"2020-06-24","MN",1432,1397,7,35,3897,3897,340,37,1203,160,495880,9304,,,,,,33763,33763,294,0,,,,,,29707,529643,9598,529643,9598,,,,,,0,,0 +"2020-06-24","MO",975,,14,,,,546,0,,,308156,8925,,36822,360303,,66,18868,18868,725,0,,,1446,,21737,,,0,327024,-55586,,,38268,,327024,9650,327024,-55586 +"2020-06-24","MP",2,,0,,,,,0,,,8187,0,,,,,,30,30,0,0,,,,,,19,,0,8217,0,,,,,,0,8217,0 +"2020-06-24","MS",1011,994,22,17,2946,2946,767,31,,157,238237,7275,,,,,91,23424,23268,526,0,,,,,,17242,,0,261661,7801,11008,,,,,0,261505,8407 +"2020-06-24","MT",21,,0,,93,93,17,2,,,,0,,,,,,766,,23,0,,,,,,571,,0,75066,1143,,,,,,0,75066,1143 +"2020-06-24","NC",1266,1266,15,,,,906,0,,,,0,,,,,,56174,56174,1721,0,,,,,,,,0,763791,15713,,,,,,0,763791,15713 +"2020-06-24","ND",86,,2,,219,219,27,1,,,95327,1094,4453,,,,,3356,3356,41,0,145,,,,,3044,159052,3863,159052,3863,4598,,,,96368,1077,162434,3944 +"2020-06-24","NE",256,,7,,1257,1257,125,23,,,143209,2524,,,173929,,,18092,,135,0,,,,,21887,12099,,0,196390,2885,,,,,161494,2667,196390,2885 +"2020-06-24","NH",343,,4,,558,558,51,0,160,,104482,1164,,,,,,5571,,13,0,,,,,,4316,,0,136661,3162,20541,,17902,,110053,1895,136661,3162 +"2020-06-24","NJ",14753,12995,46,1758,19598,19598,1196,86,,275,1129753,16036,,,,,214,170706,169892,196,0,,,,,,,,0,1300459,16232,,,,,,0,1299645,16194 +"2020-06-24","NM",480,,4,,1793,1793,149,17,,,,0,,,,,,10990,,152,0,,,,,,4984,,0,308105,6022,,,,,,0,308105,6022 +"2020-06-24","NV",494,,2,,,,439,0,,96,238025,3496,,,,,53,14592,14592,595,0,,,,,,,303151,8535,303151,8535,,,,,251907,3874,289920,4130 +"2020-06-24","NY",24782,,16,,89995,89995,1071,0,,290,,0,,,,,228,389666,,581,0,,,,,,,3551952,51144,3551952,51144,,,,,,0,,0 +"2020-06-24","OH",2755,2516,20,239,7447,7447,592,68,1886,202,,0,,,,,119,46759,43363,632,0,,,,,50962,,,0,712727,11533,,,,,,0,712727,11533 +"2020-06-24","OK",372,,1,,1319,1319,268,31,,90,286768,2739,,,286768,,,11510,11510,482,0,1058,,,,12498,8144,,0,298278,3221,30021,,,,,0,299930,2942 +"2020-06-24","OR",192,,0,,983,983,184,14,,58,203438,3893,,,300516,,28,7274,,191,0,,,,,16306,2604,,0,316822,6280,,,,,210456,4075,316822,6280 +"2020-06-24","PA",6518,,54,,,,707,0,,,608217,11810,,,,,136,83191,80810,495,0,,,,,,64502,828333,16638,828333,16638,,,,,689027,12273,,0 +"2020-06-24","PR",149,57,0,92,,,80,0,,9,113280,0,,,112331,,2,1577,1577,27,0,5243,,,,2326,,,0,114857,27,,,,,,0,114723,0 +"2020-06-24","RI",912,,6,,1967,1967,104,9,,20,130382,1486,,,212253,,16,16663,,51,0,,,,,23693,,237506,3988,237506,3988,,,,,147045,1537,235946,3354 +"2020-06-24","SC",683,683,10,0,2377,2377,832,0,,,290311,7673,32561,,290311,,,27897,27842,1284,0,1681,,,,36320,12317,,0,318208,8957,34242,,,,,0,326631,9193 +"2020-06-24","SD",84,,1,,629,629,81,5,,,68658,1025,,,,,,6419,,66,0,,,,,9773,5554,,0,85198,768,,,,,75077,1091,85198,768 +"2020-06-24","TN",556,535,14,21,2386,2386,696,50,,,,0,,,674821,,,37235,36969,932,0,,,,,43217,24693,,0,718038,12874,,,,,,0,718038,12874 +"2020-06-24","TX",2249,,29,,,,4389,0,,,,0,,,,,,125921,125921,5551,0,6770,1175,,,193924,72898,,0,2010862,63690,175384,6722,,,,0,2010862,63690 +"2020-06-24","UT",163,,0,,1256,1256,245,30,355,77,298880,4645,,,348608,154,,18784,,484,0,,22,,21,21749,10334,,0,370357,6339,,91,,79,318451,5214,370357,6339 +"2020-06-24","VA",1661,1559,16,102,5955,5955,886,42,,235,,0,,,,,107,59514,56956,520,0,4037,112,,,70203,,592071,10763,592071,10763,69979,208,,,,0,,0 +"2020-06-24","VI",6,,0,,,,,0,,,2593,49,,,,,,78,,2,0,,,,,,64,,0,2671,51,,,,,2706,53,,0 +"2020-06-24","VT",56,56,0,,,,13,0,,,56866,517,,,,,,1185,1185,20,0,,,,,,930,,0,68918,751,,,,,58051,537,68918,751 +"2020-06-24","WA",1284,1284,8,,4067,4067,386,5,,,,0,,,,,44,31338,31338,724,0,,,,,,,604087,14545,604087,14545,,,,,487059,9855,,0 +"2020-06-24","WI",757,757,7,,3299,3299,239,31,723,89,487803,9638,,,,,,28641,25763,466,0,,,,,,20121,616024,12596,616024,12596,,,,,513566,10070,,0 +"2020-06-24","WV",92,,0,,,,24,0,,5,,0,,,,,2,2629,2541,47,0,,,,,,1855,,0,154597,2121,8817,,,,,0,154597,2121 +"2020-06-24","WY",20,,0,,109,109,7,0,,,28869,1384,,,42397,,,1282,1016,28,0,,,,,1259,966,,0,43656,1267,,,,,29885,1408,43656,1267 +"2020-06-23","AK",12,12,0,,66,66,14,1,,,,0,,,,,1,783,,16,0,,,,,,502,,0,92947,2123,,,,,,0,92947,2123 +"2020-06-23","AL",864,854,23,10,2521,2521,681,50,737,,322941,4285,,,,430,,31097,30670,643,0,,,,,,15974,,0,353611,4924,,,,,353611,4924,,0 +"2020-06-23","AR",237,,10,,1188,1188,248,24,,,247814,7558,,,,186,57,16678,16678,595,0,,,,,,11220,,0,264492,8153,,,,,,0,264492,8153 +"2020-06-23","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-23","AZ",1384,1291,42,93,4255,4255,2136,0,,614,382339,7135,,,,,386,58179,57799,3593,0,,,,,,,,0,615298,21964,,,149616,,440138,10720,615298,21964 +"2020-06-23","CA",5580,,65,,,,5065,0,,1421,,0,,,,,,183073,183073,5019,0,,,,,,,,0,3496929,85243,,,,,,0,3496929,85243 +"2020-06-23","CO",1665,1330,14,335,5366,5366,238,23,,,259941,2770,91974,,,,,30893,28138,188,0,6601,,,,,,345369,4114,345369,4114,98575,,,,288079,2949,,0 +"2020-06-23","CT",4277,3414,14,863,10099,10099,138,0,,,,0,,,374333,,,45899,43941,117,0,,,,,56556,7842,,0,432257,12034,,,,,,0,432257,12034 +"2020-06-23","DC",537,,2,,,,171,0,,61,,0,,,,,40,10094,,36,0,,,,,,1182,83302,1298,83302,1298,,,,,65073,1002,,0 +"2020-06-23","DE",504,446,0,58,,,91,0,,,86689,786,,,,,,10847,9792,27,0,,,,,13420,6554,121566,3467,121566,3467,,,,,97536,813,,0 +"2020-06-23","FL",3333,3333,67,,13614,13614,,207,,,1537249,19979,,198132,1805379,,,101335,,3798,0,,,8627,,135955,,1757843,33677,1757843,33677,,,206789,,1641838,23298,1944730,33054 +"2020-06-23","GA",2688,,40,,10123,10123,1056,170,2174,,,0,,,,,,67678,67678,1750,0,8090,,,,61786,,,0,730785,23236,142862,,,,731261,23235,730785,23236 +"2020-06-23","GU",5,,0,,,,0,0,,0,10426,246,,,10228,,0,225,217,1,0,2,,,,217,174,,0,10651,247,122,,,,,0,10445,152 +"2020-06-23","HI",17,17,0,,99,99,,2,,,68524,627,,,,,,816,,2,0,,,,,778,669,79480,707,79480,707,,,,,69340,629,80394,599 +"2020-06-23","IA",688,,2,,,,163,0,,47,238330,5749,,27733,,,26,26373,26373,322,0,,,2214,,,16579,,0,264703,6071,,,29977,,265074,6072,,0 +"2020-06-23","ID",89,69,0,20,293,293,39,10,102,14,71910,2948,,,,,,4254,3820,248,0,,,,,,3405,,0,75730,3183,,,,,75730,3183,,0 +"2020-06-23","IL",6911,6707,36,204,,,1648,0,,424,,0,,,,,236,138825,137825,601,0,,,,,,,,0,1399510,20507,,,,,,0,1399510,20507 +"2020-06-23","IN",2569,2377,16,192,6853,6853,736,34,1447,297,383505,7222,,,,,110,42871,,238,0,,,,,44579,,,0,544538,13634,,,,,426376,7460,544538,13634 +"2020-06-23","KS",259,,0,,1056,1056,,0,342,,142548,0,,,,149,,12465,,0,0,,,,,,,,0,155013,0,,,,,154770,0,,0 +"2020-06-23","KY",537,533,11,4,2556,2556,376,24,988,70,,0,,,,,,14141,13736,302,0,,,,,,3591,,0,330889,9247,32138,,,,,0,330889,9247 +"2020-06-23","LA",3134,3021,17,113,,,646,0,,,584344,16519,,,,,83,51595,51595,1356,0,,,,,,39792,,0,635939,17875,,,,,,0,635939,17875 +"2020-06-23","MA",7890,7710,16,180,11157,11157,953,63,,181,680203,7350,,,,,112,107439,102651,229,0,,,,,135621,91404,,0,1017367,14067,,,65313,,782854,7532,1017367,14067 +"2020-06-23","MD",3092,2963,18,129,10611,10611,561,39,,212,418528,8406,,,,,,65007,65007,404,0,,,,,75363,4797,,0,577385,10360,,,,,483535,8810,577385,10360 +"2020-06-23","ME",102,101,0,1,339,339,24,3,,12,,0,6470,,,,6,2994,2655,23,0,307,,,,3333,2443,,0,83279,992,6785,,,,,0,83279,992 +"2020-06-23","MI",6109,5864,12,245,,,557,0,,209,,0,,,860471,,99,68197,61630,240,0,,,,,84738,49290,,0,945209,10664,144088,,,,,0,945209,10664 +"2020-06-23","MN",1425,1393,9,32,3860,3860,339,30,1191,158,486576,6666,,,,,,33469,33469,242,0,,,,,,29399,520045,6908,520045,6908,,,,,,0,,0 +"2020-06-23","MO",961,,0,,,,595,0,,,299231,0,,36243,360303,,66,18143,18143,0,0,,,1421,,21737,,,0,382610,112378,,,37664,,317374,0,382610,112378 +"2020-06-23","MP",2,,0,,,,,0,,,8187,48,,,,,,30,30,0,0,,,,,,19,,0,8217,48,,,,,,0,8217,48 +"2020-06-23","MS",989,972,11,17,2915,2915,664,34,,151,230962,0,,,,,88,22898,22745,611,0,,,,,,17242,,0,253860,611,10713,,,,,0,253098,0 +"2020-06-23","MT",21,,0,,91,91,15,1,,,,0,,,,,,743,,3,0,,,,,,566,,0,73923,2618,,,,,,0,73923,2618 +"2020-06-23","NC",1251,1251,28,,,,915,0,,,,0,,,,,,54453,54453,848,0,,,,,,,,0,748078,11253,,,,,,0,748078,11253 +"2020-06-23","ND",84,,1,,218,218,28,0,,,94233,93,4349,,,,,3315,3315,7,0,139,,,,,3008,155189,320,155189,320,4488,,,,95291,191,158490,327 +"2020-06-23","NE",249,,5,,1234,1234,135,22,,,140685,1987,,,171196,,,17957,,147,0,,,,,21740,11980,,0,193505,3508,,,,,158827,2136,193505,3508 +"2020-06-23","NH",339,,0,,558,558,54,5,160,,103318,0,,,,,,5558,,14,0,,,,,,4290,,0,133499,1379,20228,,17822,,108158,-704,133499,1379 +"2020-06-23","NJ",14707,12949,56,1758,19512,19512,1092,111,,307,1113717,15733,,,,,216,170510,169734,351,0,,,,,,,,0,1284227,16084,,,,,,0,1283451,16052 +"2020-06-23","NM",476,,7,,1776,1776,141,22,,,,0,,,,,,10838,,144,0,,,,,,4874,,0,302083,4007,,,,,,0,302083,4007 +"2020-06-23","NV",492,,0,,,,389,0,,100,234529,3999,,,,,50,13997,13997,462,0,,,,,,,294616,6253,294616,6253,,,,,248033,4459,285790,5703 +"2020-06-23","NY",24766,,27,,89995,89995,1104,0,,302,,0,,,,,228,389085,,597,0,,,,,,,3500808,48709,3500808,48709,,,,,,0,,0 +"2020-06-23","OH",2735,2497,31,238,7379,7379,570,87,1876,205,,0,,,,,126,46127,42767,590,0,,,,,50426,,,0,701194,11491,,,,,,0,701194,11491 +"2020-06-23","OK",371,,2,,1288,1288,265,20,,111,284029,12104,,,284029,,,11028,11028,295,0,1058,,,,12295,7888,,0,295057,12399,30021,,,,,0,296988,13113 +"2020-06-23","OR",192,,2,,969,969,145,23,,48,199545,3871,,,294482,,27,7083,,146,0,,,,,16060,2588,,0,310542,5771,,,,,206381,3770,310542,5771 +"2020-06-23","PA",6464,,38,,,,738,0,,,596407,10745,,,,,151,82696,80347,510,0,,,,,,64502,811695,15360,811695,15360,,,,,676754,11233,,0 +"2020-06-23","PR",149,57,0,92,,,77,0,,9,113280,0,,,112331,,2,1550,1550,10,0,5135,,,,2326,,,0,114830,10,,,,,,0,114723,0 +"2020-06-23","RI",906,,3,,1958,1958,105,8,,19,128896,1599,,,209010,,17,16612,,77,0,,,,,23582,,233518,3846,233518,3846,,,,,145508,1676,232592,3750 +"2020-06-23","SC",673,673,14,0,2377,2377,824,83,,,282638,4459,32313,,282638,,,26613,26572,912,0,1662,,,,34800,12317,,0,309251,5371,33975,,,,,0,317438,5485 +"2020-06-23","SD",83,,2,,624,624,85,8,,,67633,630,,,,,,6353,,27,0,,,,,9725,5497,,0,84430,740,,,,,73986,657,84430,740 +"2020-06-23","TN",542,521,11,21,2336,2336,721,35,,,,0,,,663010,,,36303,36048,750,0,,,,,42154,24068,,0,705164,5310,,,,,,0,705164,5310 +"2020-06-23","TX",2220,,28,,,,4092,0,,,,0,,,,,,120370,120370,5489,0,6606,1003,,,182161,70714,,0,1947172,47285,170411,5811,,,,0,1947172,47285 +"2020-06-23","UT",163,,5,,1226,1226,214,34,344,77,294235,4301,,,342872,153,,18300,,394,0,,21,,20,21146,10057,,0,364018,5721,,87,,76,313237,4831,364018,5721 +"2020-06-23","VA",1645,1542,25,103,5913,5913,847,44,,245,,0,,,,,126,58994,56452,529,0,3992,100,,,69593,,581308,8137,581308,8137,68992,196,,,,0,,0 +"2020-06-23","VI",6,,0,,,,,0,,,2544,42,,,,,,76,,0,0,,,,,,64,,0,2620,42,,,,,2653,60,,0 +"2020-06-23","VT",56,56,0,,,,19,0,,,56349,716,,,,,,1165,1165,2,0,,,,,,927,,0,68167,916,,,,,57514,718,68167,916 +"2020-06-23","WA",1276,1276,6,,4062,4062,372,13,,,,0,,,,,37,30614,30614,191,0,,,,,,,589542,13098,589542,13098,,,,,477204,2266,,0 +"2020-06-23","WI",750,750,5,,3268,3268,240,37,716,93,478165,11531,,,,,,28175,25331,297,0,,,,,,19852,603428,8624,603428,8624,,,,,503496,11794,,0 +"2020-06-23","WV",92,,3,,,,21,0,,5,,0,,,,,2,2582,2493,30,0,,,,,,1790,,0,152476,2891,8643,,,,,0,152476,2891 +"2020-06-23","WY",20,,0,,109,109,8,4,,,27485,1323,,,41158,,,1254,992,24,0,,,,,1231,953,,0,42389,1140,,,,,28477,1368,42389,1140 +"2020-06-22","AK",12,12,0,,65,65,13,0,,,,0,,,,,1,767,,6,0,,,,,,491,,0,90824,2773,,,,,,0,90824,2773 +"2020-06-22","AL",841,831,2,10,2471,2471,663,11,725,,318656,3999,,,,424,,30454,30031,433,0,,,,,,15974,,0,348687,4432,,,,,348687,4432,,0 +"2020-06-22","AR",227,,3,,1164,1164,237,12,,,240256,13164,,,,186,61,16083,16083,941,0,,,,,,10793,,0,256339,14105,,,,,,0,256339,14105 +"2020-06-22","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-22","AZ",1342,1251,3,91,4255,4255,1992,0,,583,375204,7850,,,,,379,54586,54214,2196,0,,,,,,,,0,593334,7690,,,148031,,429418,10046,593334,7690 +"2020-06-22","CA",5515,,20,,,,4804,0,,1412,,0,,,,,,178054,178054,4230,0,,,,,,,,0,3411686,92430,,,,,,0,3411686,92430 +"2020-06-22","CO",1651,1314,4,337,5343,5343,249,16,,,257171,4938,91154,,,,,30705,27959,166,0,6550,,,,,,341255,6238,341255,6238,97704,,,,285130,5097,,0 +"2020-06-22","CT",4263,3403,3,860,10099,10099,140,0,,,,0,,,362481,,,45782,43820,27,0,,,,,56385,7842,,0,420223,3175,,,,,,0,420223,3175 +"2020-06-22","DC",535,,2,,,,155,0,,50,,0,,,,,34,10058,,38,0,,,,,,1182,82004,2482,82004,2482,,,,,64071,1984,,0 +"2020-06-22","DE",504,446,0,58,,,89,0,,,85903,1704,,,,,,10820,9764,45,0,,,,,13311,6459,118099,2813,118099,2813,,,,,96723,1749,,0 +"2020-06-22","FL",3266,3266,12,,13407,13407,,82,,,1517270,15265,,198132,1777209,,,97537,,2751,0,,,8627,,131152,,1724166,33994,1724166,33994,,,206789,,1618540,18205,1911676,22014 +"2020-06-22","GA",2648,,5,,9953,9953,1000,116,2155,,,0,,,,,,65928,65928,1227,0,8079,,,,59960,,,0,707549,9708,142648,,,,708026,19438,707549,9708 +"2020-06-22","GU",5,,0,,,,0,0,,0,10180,392,,,10077,,0,224,216,2,0,2,,,,216,173,,0,10404,394,122,,,,,0,10293,227 +"2020-06-22","HI",17,17,0,,97,97,,1,,,67897,840,,,,,,814,,11,0,,,,,774,651,78773,1436,78773,1436,,,,,68711,851,79795,1051 +"2020-06-22","IA",686,,1,,,,169,0,,51,232581,1392,,26850,,,28,26051,26051,88,0,,,2207,,,16240,,0,258632,1480,,,29086,,259002,1480,,0 +"2020-06-22","ID",89,69,0,20,283,283,41,0,101,12,68962,0,,,,,,4006,3585,0,0,,,,,,3305,,0,72547,0,,,,,72547,0,,0 +"2020-06-22","IL",6875,6671,24,204,,,1628,0,,419,,0,,,,,250,138224,137224,462,0,,,,,,,,0,1379003,18219,,,,,,0,1379003,18219 +"2020-06-22","IN",2553,2363,13,190,6819,6819,756,31,1452,283,376283,6786,,,,,108,42633,,210,0,,,,,43983,,,0,530904,2797,,,,,418916,6996,530904,2797 +"2020-06-22","KS",259,,5,,1056,1056,,21,342,,142548,6958,,,,149,,12465,,406,0,,,,,,,,0,155013,7364,,,,,154770,7357,,0 +"2020-06-22","KY",526,522,0,4,2532,2532,349,10,987,67,,0,,,,,,13839,13449,89,0,,,,,,3534,,0,321642,4858,30573,,,,,0,321642,4858 +"2020-06-22","LA",3117,3004,12,113,,,630,0,,,567825,6791,,,,,77,50239,50239,461,0,,,,,,39792,,0,618064,7252,,,,,,0,618064,7252 +"2020-06-22","MA",7874,7694,16,180,11094,11094,920,9,,180,672853,6594,,,,,107,107210,102469,149,0,,,,,135290,91404,,0,1003300,13590,,,64592,,775322,6730,1003300,13590 +"2020-06-22","MD",3074,2945,8,129,10572,10572,602,28,,232,410122,5397,,,,,,64603,64603,297,0,,,,,74856,4776,,0,567025,7433,,,,,474725,5694,567025,7433 +"2020-06-22","ME",102,102,0,,336,336,27,0,,13,,0,6336,,,,6,2971,2640,14,0,305,,,,3319,2409,,0,82287,1251,6649,,,,,0,82287,1251 +"2020-06-22","MI",6097,5853,7,244,,,557,0,,209,,0,,,850060,,99,67957,61409,246,0,,,,,84485,49290,,0,934545,10584,143099,,,,,0,934545,10584 +"2020-06-22","MN",1416,1384,4,32,3830,3830,332,33,1180,156,479910,8467,,,,,,33227,33227,307,0,,,,,,29065,513137,8774,513137,8774,,,,,,0,,0 +"2020-06-22","MO",961,,5,,,,415,0,,,299231,2077,,36243,252506,,66,18143,18143,140,0,,,1421,,17275,,,0,270232,0,,,37664,,317374,2217,270232,0 +"2020-06-22","MP",2,,0,,,,,0,,,8139,0,,,,,,30,30,0,0,,,,,,19,,0,8169,0,,,,,,0,8169,0 +"2020-06-22","MS",978,961,40,17,2881,2881,710,114,,148,230962,12888,,,,,95,22287,22136,1646,0,,,,,,17242,,0,253249,14534,10713,,,,,0,253098,14524 +"2020-06-22","MT",21,,1,,90,90,15,1,,,,0,,,,,,740,,23,0,,,,,,548,,0,71305,948,,,,,,0,71305,948 +"2020-06-22","NC",1223,1223,3,,,,870,0,,,,0,,,,,,53605,53605,804,0,,,,,,,,0,736825,18129,,,,,,0,736825,18129 +"2020-06-22","ND",83,,0,,218,218,31,2,,,94140,1255,4349,,,,,3308,3308,25,0,139,,,,,2952,154869,2184,154869,2184,4488,,,,95100,1242,158163,2226 +"2020-06-22","NE",244,,0,,1212,1212,141,0,,,138698,2164,,,167929,,,17810,,103,0,,,,,21512,11776,,0,189997,2825,,,,,156691,2268,189997,2825 +"2020-06-22","NH",339,,0,,553,553,55,2,159,,103318,2951,,,,,,5544,,26,0,,,,,,4275,,0,132120,1287,20112,,17588,,108862,2977,132120,1287 +"2020-06-22","NJ",14651,12895,28,1756,19401,19401,1033,134,,287,1097984,22159,,,,,213,170159,169415,286,0,,,,,,,,0,1268143,22445,,,,,,0,1267399,22432 +"2020-06-22","NM",469,,0,,1754,1754,139,8,,,,0,,,,,,10694,,129,0,,,,,,4742,,0,298076,4645,,,,,,0,298076,4645 +"2020-06-22","NV",492,,0,,,,373,0,,100,230530,2044,,,,,46,13535,13535,330,0,,,,,,,288363,1663,288363,1663,,,,,243574,2204,280087,2055 +"2020-06-22","NY",24739,,14,,89995,89995,1122,0,,330,,0,,,,,228,388488,,552,0,,,,,,,3452099,56780,3452099,56780,,,,,,0,,0 +"2020-06-22","OH",2704,2467,4,237,7292,7292,549,50,1852,217,,0,,,,,124,45537,42254,729,0,,,,,49936,,,0,689703,14800,,,,,,0,689703,14800 +"2020-06-22","OK",369,,0,,1268,1268,197,25,,93,271925,0,,,271925,,,10733,10733,218,0,1058,,,,11340,7648,,0,282658,218,30021,,,,,0,283875,0 +"2020-06-22","OR",190,,1,,946,946,154,0,,50,195674,8329,,,288943,,29,6937,,187,0,,,,,15828,2533,,0,304771,6490,,,,,202611,8922,304771,6490 +"2020-06-22","PA",6426,,3,,,,745,0,,,585662,9647,,,,,156,82186,79859,456,0,,,,,,64105,796335,12871,796335,12871,,,,,665521,10101,,0 +"2020-06-22","PR",149,57,0,92,,,70,0,,10,113280,0,,,112331,,3,1540,1540,7,0,5024,,,,2326,,,0,114820,7,,,,,,0,114723,0 +"2020-06-22","RI",903,,9,,1950,1950,106,28,,18,127297,1596,,,205408,,15,16535,,59,0,,,,,23434,,229672,1072,229672,1072,,,,,143832,1655,228842,3684 +"2020-06-22","SC",659,659,6,0,2294,2294,731,0,,,278179,205,32276,,278179,,,25701,25666,1008,0,1630,,,,33774,10790,,0,303880,1213,33906,,,,,0,311953,9318 +"2020-06-22","SD",81,,0,,616,616,88,8,,,67003,274,,,,,,6326,,29,0,,,,,9683,5437,,0,83690,966,,,,,73329,303,83690,966 +"2020-06-22","TN",531,510,5,21,2301,2301,664,10,,,,0,,,658355,,,35553,35302,451,0,,,,,41499,23567,,0,699854,14473,,,,,,0,699854,14473 +"2020-06-22","TX",2192,,10,,,,3711,0,,,,0,,,,,,114881,114881,3280,0,6527,866,,,173856,69190,,0,1899887,16992,166168,5043,,,,0,1899887,16992 +"2020-06-22","UT",158,,0,,1192,1192,198,8,338,67,289934,3395,,,337707,150,,17906,,444,0,,19,,18,20590,9863,,0,358297,4463,,69,,58,308406,3714,358297,4463 +"2020-06-22","VA",1620,1517,9,103,5869,5869,848,29,,240,,0,,,,,132,58465,55949,471,0,3983,98,,,69143,,573171,8774,573171,8774,68762,194,,,,0,,0 +"2020-06-22","VI",6,,0,,,,,0,,,2502,0,,,,,,76,,0,0,,,,,,64,,0,2578,0,,,,,2593,6,,0 +"2020-06-22","VT",56,56,0,,,,8,0,,,55633,774,,,,,,1163,1163,4,0,,,,,,926,,0,67251,1177,,,,,56796,778,67251,1177 +"2020-06-22","WA",1270,1270,5,,4049,4049,362,19,,,,0,,,,,42,30423,30423,315,0,,,,,,,576444,13634,576444,13634,,,,,474938,8869,,0 +"2020-06-22","WI",745,745,1,,3231,3231,246,11,711,93,466634,6300,,,,,,27878,25068,263,0,,,,,,19543,594804,8861,594804,8861,,,,,491702,6549,,0 +"2020-06-22","WV",89,,0,,,,21,0,,5,,0,,,,,2,2552,2461,9,0,,,,,,1681,,0,149585,890,8575,,,,,0,149585,890 +"2020-06-22","WY",20,,0,,105,105,8,5,,,26162,0,,,40048,,,1230,974,33,0,,,,,1201,931,,0,41249,1550,,,,,27109,0,41249,1550 +"2020-06-21","AK",12,12,0,,65,65,15,0,,,,0,,,,,1,761,,11,0,,,,,,475,,0,88051,1133,,,,,,0,88051,1133 +"2020-06-21","AL",839,829,1,10,2460,2460,625,17,721,,314657,4683,,,,424,,30021,29598,472,0,,,,,,15974,,0,344255,5155,,,,,344255,5155,,0 +"2020-06-21","AR",224,,0,,1152,1152,240,52,,,227092,0,,,,184,59,15142,15142,0,0,,,,,,10082,,0,242234,0,,,,,,0,242234,0 +"2020-06-21","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-21","AZ",1339,1248,1,91,4255,4255,1942,3,,556,367354,11872,,,,,361,52390,52018,2592,0,,,,,,,,0,585644,13128,,,147565,,419372,14464,585644,13128 +"2020-06-21","CA",5495,,71,,,,4679,0,,1366,,0,,,,,,173824,173824,4515,0,,,,,,,,0,3319256,84844,,,,,,0,3319256,84844 +"2020-06-21","CO",1647,1310,0,337,5327,5327,256,4,,,252233,4196,90329,,,,,30539,27800,190,0,6513,,,,,,335017,5637,335017,5637,96842,,,,280033,4388,,0 +"2020-06-21","CT",4260,3401,9,859,10099,10099,149,0,,,,0,,,359353,,,45755,43802,40,0,,,,,56339,7842,,0,417048,4330,,,,,,0,417048,4330 +"2020-06-21","DC",533,,2,,,,168,0,,61,,0,,,,,37,10020,,36,0,,,,,,1172,79522,1569,79522,1569,,,,,62087,1335,,0 +"2020-06-21","DE",504,446,0,58,,,79,0,,,84199,2464,,,,,,10775,9724,94,0,,,,,13240,6459,115286,2861,115286,2861,,,,,94974,2558,,0 +"2020-06-21","FL",3254,3254,17,,13325,13325,,98,,,1502005,34530,,198132,1758538,,,94786,,4617,0,,,8627,,127837,,1690172,37092,1690172,37092,,,206789,,1600335,38055,1889662,45556 +"2020-06-21","GA",2643,,1,,9837,9837,960,0,2140,,,0,,,,,,64701,64701,892,0,8017,,,,58871,,,0,697841,9707,140694,,,,688588,0,697841,9707 +"2020-06-21","GU",5,,0,,,,0,0,,0,9788,0,,,9852,,0,222,214,0,0,2,,,,214,173,,0,10010,0,116,,,,,0,10066,0 +"2020-06-21","HI",17,17,0,,96,96,,0,,,67057,1112,,,,,,803,,14,0,,,,,765,644,77337,1282,77337,1282,,,,,67860,1126,78744,1124 +"2020-06-21","IA",685,,4,,,,170,0,,53,231189,6478,,26662,,,27,25963,25963,467,0,,,2207,,,16068,,0,257152,6945,,,28898,,257522,6946,,0 +"2020-06-21","ID",89,69,0,20,283,283,31,4,101,12,68962,1637,,,,,,4006,3585,135,0,,,,,,3305,,0,72547,1756,,,,,72547,1756,,0 +"2020-06-21","IL",6851,6647,22,204,,,1631,0,,422,,0,,,,,256,137762,136762,658,0,,,,,,,,0,1360784,23816,,,,,,0,1360784,23816 +"2020-06-21","IN",2540,2350,4,190,6788,6788,744,33,1450,226,369497,9756,,,,,124,42423,,362,0,,,,,43845,,,0,528107,6393,,,,,411920,10118,528107,6393 +"2020-06-21","KS",254,,0,,1035,1035,,0,338,,135590,0,,,,146,,12059,,0,0,,,,,,,,0,147649,0,,,,,147413,0,,0 +"2020-06-21","KY",526,523,2,3,2522,2522,354,0,980,62,,0,,,,,,13750,13369,120,0,,,,,,3530,,0,316784,0,30547,,,,,0,316784,0 +"2020-06-21","LA",3105,2993,1,112,,,589,0,,,561034,5603,,,,,69,49778,49778,393,0,,,,,,37017,,0,610812,5996,,,,,,0,610812,5996 +"2020-06-21","MA",7858,7677,30,181,11085,11085,927,9,,194,666259,8258,,,,,111,107061,102333,125,0,,,,,134874,91404,,0,989710,5228,,,64266,,768592,8363,989710,5228 +"2020-06-21","MD",3066,2937,14,129,10544,10544,608,47,,230,404725,6401,,,,,,64306,64306,350,0,,,,,74473,4773,,0,559592,9424,,,,,469031,6751,559592,9424 +"2020-06-21","ME",102,102,0,,336,336,26,3,,11,,0,6336,,,,5,2957,2629,19,0,305,,,,3305,2391,,0,81036,1400,6649,,,,,0,81036,1400 +"2020-06-21","MI",6090,5846,3,244,,,557,0,,209,,0,,,839715,,99,67711,61230,166,0,,,,,84246,49290,,0,923961,12933,141941,,,,,0,923961,12933 +"2020-06-21","MN",1412,1380,8,32,3797,3797,322,30,1163,160,471443,11867,,,,,,32920,32920,453,0,,,,,,28663,504363,12320,504363,12320,,,,,,0,,0 +"2020-06-21","MO",956,,1,,,,415,0,,,297154,3629,,36213,252506,,66,18003,18003,413,0,,,1419,,17275,,,0,270232,0,,,37632,,315157,4042,270232,0 +"2020-06-21","MP",2,,0,,,,,0,,,8139,0,,,,,,30,30,0,0,,,,,,19,,0,8169,0,,,,,,0,8169,0 +"2020-06-21","MS",938,922,0,16,2767,2767,689,0,,156,218074,0,,,,,98,20641,20500,0,0,,,,,,15323,,0,238715,0,10353,,,,,0,238574,0 +"2020-06-21","MT",20,,0,,89,89,15,4,,,,0,,,,,,717,,19,0,,,,,,548,,0,70357,827,,,,,,0,70357,827 +"2020-06-21","NC",1220,1220,8,,,,845,0,,,,0,,,,,,52801,52801,1412,0,,,,,,,,0,718696,15400,,,,,,0,718696,15400 +"2020-06-21","ND",83,,1,,216,216,31,3,,,92885,1905,4344,,,,,3283,3283,37,0,139,,,,,2910,152685,3861,152685,3861,4483,,,,93858,1929,155937,3932 +"2020-06-21","NE",244,,0,,1212,1212,140,12,,,136534,2271,,,165239,,,17707,,116,0,,,,,21382,11565,,0,187172,2942,,,,,154423,2383,187172,2942 +"2020-06-21","NH",339,,2,,551,551,55,2,159,,100367,286,,,,,,5518,,32,0,,,,,,4244,,0,130833,2201,20002,,17402,,105885,318,130833,2201 +"2020-06-21","NJ",14623,12870,15,1753,19267,19267,1105,0,,278,1075825,25786,,,,,219,169873,169142,325,0,,,,,,,,0,1245698,26111,,,,,,0,1244967,26094 +"2020-06-21","NM",469,,3,,1746,1746,134,6,,,,0,,,,,,10565,,135,0,,,,,,4684,,0,293431,4794,,,,,,0,293431,4794 +"2020-06-21","NV",492,,1,,,,370,0,,87,228486,2454,,,,,49,13205,13205,274,0,,,,,,,286700,3616,286700,3616,,,,,241370,2696,278032,3153 +"2020-06-21","NY",24725,,15,,89995,89995,1142,0,,332,,0,,,,,237,387936,,664,0,,,,,,,3395319,67526,3395319,67526,,,,,,0,,0 +"2020-06-21","OH",2700,2463,3,237,7242,7242,496,41,1844,194,,0,,,,,119,44808,41578,546,0,,,,,49252,,,0,674903,14756,,,,,,0,674903,14756 +"2020-06-21","OK",369,,1,,1243,1243,197,14,,93,271925,0,,,271925,,,10515,10037,478,0,1058,,,,11340,7531,,0,282440,478,30021,,,,,0,283875,0 +"2020-06-21","OR",189,,1,,946,946,154,0,,50,187345,0,,,282661,,29,6750,,178,0,,,,,15620,2533,,0,298281,8110,,,,,193689,0,298281,8110 +"2020-06-21","PA",6423,,4,,,,735,0,,,576015,9554,,,,,157,81730,79405,464,0,,,,,,62932,783464,13218,783464,13218,,,,,655420,10012,,0 +"2020-06-21","PR",149,57,2,92,,,71,0,,13,113280,0,,,112331,,5,1533,1533,2,0,4992,,,,2326,,,0,114813,2,,,,,,0,114723,0 +"2020-06-21","RI",894,,0,,1922,1922,123,0,,23,125701,623,,,201860,,12,16476,,27,0,,,,,23298,,228600,1958,228600,1958,,,,,142177,650,225158,1010 +"2020-06-21","SC",653,653,9,0,2294,2294,692,0,,,277974,5511,31883,,270043,,,24693,24661,907,0,1623,,,,32592,10790,,0,302667,6418,33506,,,,,0,302635,6416 +"2020-06-21","SD",81,,0,,608,608,89,10,,,66729,1039,,,,,,6297,,72,0,,,,,9625,5389,,0,82724,1141,,,,,73026,1111,82724,1141 +"2020-06-21","TN",526,505,2,21,2291,2291,605,25,,,,0,,,644414,,,35102,34854,656,0,,,,,40967,23067,,0,685381,10280,,,,,,0,685381,10280 +"2020-06-21","TX",2182,,17,,,,3409,0,,,,0,,,,,,111601,111601,3866,0,6493,739,,,170508,68499,,0,1882895,30710,163944,4481,,,,0,1882895,30710 +"2020-06-21","UT",158,,3,,1184,1184,222,23,338,67,286539,4400,,,333588,150,,17462,,394,0,,19,,18,20246,9659,,0,353834,6117,,69,,58,304692,4860,353834,6117 +"2020-06-21","VA",1611,1508,4,103,5840,5840,863,33,,243,,0,,,,,125,57994,55504,551,0,3978,91,,,68672,,564397,14255,564397,14255,68314,187,,,,0,,0 +"2020-06-21","VI",6,,0,,,,,0,,,2502,10,,,,,,76,,2,0,,,,,,64,,0,2578,12,,,,,2587,1,,0 +"2020-06-21","VT",56,56,0,,,,11,0,,,54859,769,,,,,,1159,1159,12,0,,,,,,922,,0,66074,1029,,,,,56018,781,66074,1029 +"2020-06-21","WA",1265,1265,10,,4030,4030,371,27,,,,0,,,,,54,30108,30108,521,0,,,,,,,562810,3797,562810,3797,,,,,466069,-8807,,0 +"2020-06-21","WI",744,744,0,,3220,3220,243,17,710,94,460334,5771,,,,,,27615,24819,289,0,,,,,,19310,585943,10914,585943,10914,,,,,485153,6051,,0 +"2020-06-21","WV",89,,1,,,,23,0,,3,,0,,,,,2,2543,2452,57,0,,,,,,1676,,0,148695,2026,8566,,,,,0,148695,2026 +"2020-06-21","WY",20,,0,,100,100,8,2,,,26162,0,,,38540,,,1197,947,18,0,,,,,1159,909,,0,39699,150,,,,,27109,0,39699,150 +"2020-06-20","AK",12,12,0,,65,65,16,2,,,,0,,,,,1,750,,21,0,,,,,,464,,0,86918,3287,,,,,,0,86918,3287 +"2020-06-20","AL",838,828,16,10,2443,2443,638,27,717,,309974,7651,,,,418,,29549,29126,547,0,,,,,,15974,,0,339100,8194,,,,,339100,8194,,0 +"2020-06-20","AR",224,,10,,1100,1100,224,0,,,227092,6951,,,,175,53,15142,15142,511,0,,,,,,10082,,0,242234,7462,,,,,,0,242234,7462 +"2020-06-20","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-20","AZ",1338,1247,26,91,4252,4252,1938,6,,546,355482,9955,,,,,368,49798,49426,3109,0,,,,,,,,0,572516,22321,,,144366,,404908,13058,572516,22321 +"2020-06-20","CA",5424,,64,,,,4582,0,,1332,,0,,,,,,169309,169309,3893,0,,,,,,,,0,3234412,78710,,,,,,0,3234412,78710 +"2020-06-20","CO",1647,1310,4,337,5323,5323,255,5,,,248037,5155,89299,,,,,30349,27608,162,0,6457,,,,,,329380,7016,329380,7016,95756,,,,275645,5310,,0 +"2020-06-20","CT",4251,3394,13,857,10099,10099,150,0,,,,0,,,355105,,,45715,43763,158,0,,,,,56258,7842,,0,412718,6611,,,,,,0,412718,6611 +"2020-06-20","DC",531,,1,,,,177,0,,58,,0,,,,,40,9984,,32,0,,,,,,1166,77953,4162,77953,4162,,,,,60752,1680,,0 +"2020-06-20","DE",504,446,0,58,,,75,0,,,81735,1912,,,,,,10681,9632,70,0,,,,,13176,6395,112425,4860,112425,4860,,,,,92416,1982,,0 +"2020-06-20","FL",3237,3237,40,,13227,13227,,165,,,1467475,24352,,198132,1717070,,,90169,,4002,0,,,8627,,123815,,1653080,30974,1653080,30974,,,206789,,1562280,28404,1844106,34452 +"2020-06-20","GA",2642,,6,,9837,9837,944,65,2140,,,0,,,,,,63809,63809,1800,0,7943,,,,57956,,,0,688134,24618,138123,,,,688588,24613,688134,24618 +"2020-06-20","GU",5,,0,,,,0,0,,0,9788,273,,,9852,,0,222,214,22,0,2,,,,214,173,,0,10010,295,116,,,,,0,10066,359 +"2020-06-20","HI",17,17,0,,96,96,,1,,,65945,963,,,,,,789,,27,0,,,,,753,642,76055,1361,76055,1361,,,,,66734,990,77620,1280 +"2020-06-20","IA",681,,0,,,,182,0,,58,224711,3337,,26256,,,30,25496,25496,221,0,,,2202,,,15963,,0,250207,3558,,,28486,,250576,3561,,0 +"2020-06-20","ID",89,69,0,20,279,279,28,1,101,9,67325,1523,,,,,,3871,3466,128,0,,,,,,3183,,0,70791,1635,,,,,70791,1635,,0 +"2020-06-20","IL",6829,6625,111,204,,,1696,0,,454,,0,,,,,274,137104,136104,634,0,,,,,,,,0,1336968,25965,,,,,,0,1336968,25965 +"2020-06-20","IN",2536,2346,20,190,6755,6755,768,24,1444,231,359741,8600,,,,,113,42061,,315,0,,,,,43627,,,0,521714,13456,,,,,401802,8915,521714,13456 +"2020-06-20","KS",254,,0,,1035,1035,,0,338,,135590,0,,,,146,,12059,,0,0,,,,,,,,0,147649,0,,,,,147413,0,,0 +"2020-06-20","KY",524,521,2,3,2522,2522,354,28,980,62,,0,,,,,,13630,13253,176,0,,,,,,3530,,0,316784,5914,30547,,,,,0,316784,5914 +"2020-06-20","LA",3104,2992,20,112,,,574,0,,,555431,13037,,,,,73,49385,49385,870,0,,,,,,37017,,0,604816,13907,,,,,,0,604816,13907 +"2020-06-20","MA",7828,7647,28,181,11076,11076,964,40,,200,658001,13844,,,,,118,106936,102228,286,0,,,,,134754,91404,,0,984482,7208,,,63736,,760229,14067,984482,7208 +"2020-06-20","MD",3052,2923,22,129,10497,10497,644,50,,238,398324,8203,,,,,,63956,63956,408,0,,,,,73980,4745,,0,550168,11802,,,,,462280,8611,550168,11802 +"2020-06-20","ME",102,102,0,,333,333,29,5,,13,,0,6203,,,,5,2938,2610,25,0,303,,,,3279,2380,,0,79636,1305,6514,,,,,0,79636,1305 +"2020-06-20","MI",6087,5843,20,244,,,557,0,,209,,0,,,827089,,99,67545,61084,448,0,,,,,83939,49290,,0,911028,14646,140185,,,,,0,911028,14646 +"2020-06-20","MN",1404,1372,11,32,3767,3767,324,19,1155,161,459576,16455,,,,,,32467,32467,436,0,,,,,,28205,492043,16891,492043,16891,,,,,,0,,0 +"2020-06-20","MO",955,,7,,,,415,0,,,293525,4442,,35823,252506,,66,17590,17590,389,0,,,1387,,17275,,,0,270232,0,,,37210,,311115,4831,270232,0 +"2020-06-20","MP",2,,0,,,,,0,,,8139,0,,,,,,30,30,0,0,,,,,,19,,0,8169,0,,,,,,0,8169,0 +"2020-06-20","MS",938,922,0,16,2767,2767,465,0,,159,218074,0,,,,,108,20641,20500,0,0,,,,,,15323,,0,238715,0,10353,,,,,0,238574,0 +"2020-06-20","MT",20,,0,,85,85,10,3,,,,0,,,,,,698,,32,0,,,,,,548,,0,69530,1108,,,,,,0,69530,1108 +"2020-06-20","NC",1212,1212,15,,,,883,0,,,,0,,,,,,51389,51389,1549,0,,,,,,,,0,703296,24377,,,,,,0,703296,24377 +"2020-06-20","ND",82,,0,,213,213,28,3,,,90980,1600,4336,,,,,3246,3246,25,0,139,,,,,2882,148824,3896,148824,3896,4475,,,,91929,1662,152005,3943 +"2020-06-20","NE",244,,4,,1200,1200,141,34,,,134263,3832,,,162454,,,17591,,176,0,,,,,21226,11312,,0,184230,3434,,,,,152040,4001,184230,3434 +"2020-06-20","NH",337,,6,,549,549,61,16,159,,100081,1806,,,,,,5486,,36,0,,,,,,4209,,0,128632,2995,19749,,17126,,105567,1842,128632,2995 +"2020-06-20","NJ",14608,12857,23,1751,19267,19267,1125,0,,286,1050039,24192,,,,,238,169548,168834,367,0,,,,,,,,0,1219587,24559,,,,,,0,1218873,24530 +"2020-06-20","NM",466,,2,,1740,1740,145,5,,,,0,,,,,,10430,,170,0,,,,,,4628,,0,288637,4035,,,,,,0,288637,4035 +"2020-06-20","NV",491,,0,,,,370,0,,87,226032,4158,,,,,49,12931,12931,445,0,,,,,,,283084,6368,283084,6368,,,,,238674,4521,274879,5782 +"2020-06-20","NY",24710,,24,,89995,89995,1220,0,,335,,0,,,,,237,387272,,716,0,,,,,,,3327793,68830,3327793,68830,,,,,,0,,0 +"2020-06-20","OH",2697,2460,30,237,7201,7201,482,34,1833,186,,0,,,,,118,44262,41062,531,0,,,,,48588,,,0,660147,14549,,,,,,0,660147,14549 +"2020-06-20","OK",368,,1,,1229,1229,197,20,,93,271925,7053,,,271925,,,10037,10037,331,0,1058,,,,11340,7414,,0,281962,7384,30021,,,,,0,283875,7559 +"2020-06-20","OR",188,,1,,946,946,154,13,,50,187345,4575,,,274848,,29,6572,,206,0,,,,,15323,2533,,0,290171,7955,,,,,193689,4779,290171,7955 +"2020-06-20","PA",6419,,20,,,,715,0,,,566461,10005,,,,,161,81266,78947,504,0,,,,,,62574,770246,14222,770246,14222,,,,,645408,10501,,0 +"2020-06-20","PR",147,57,0,90,,,83,0,,10,113280,0,,,112331,,4,1531,1531,32,0,4932,,,,2326,,,0,114811,32,,,,,,0,114723,0 +"2020-06-20","RI",894,,0,,1922,1922,123,0,,23,125078,681,,,200885,,12,16449,,36,0,,,,,23263,,226642,3899,226642,3899,,,,,141527,717,224148,1756 +"2020-06-20","SC",644,644,5,0,2294,2294,673,0,,,272463,6794,31275,,264666,,,23786,23756,1155,0,1602,,,,31553,10790,,0,296249,7949,32877,,,,,0,296219,7942 +"2020-06-20","SD",81,,0,,598,598,91,9,,,65690,655,,,,,,6225,,67,0,,,,,9557,5335,,0,81583,1074,,,,,71915,722,81583,1074 +"2020-06-20","TN",524,503,9,21,2266,2266,588,28,,,,0,,,634900,,,34446,34207,429,0,,,,,40201,22838,,0,675101,7765,,,,,,0,675101,7765 +"2020-06-20","TX",2165,,25,,,,3247,0,,,,0,,,,,,107735,107735,4430,0,6431,623,,,165047,67096,,0,1852185,50348,159453,3869,,,,0,1852185,50348 +"2020-06-20","UT",155,,0,,1161,1161,232,16,333,66,282139,4884,,,327981,149,,17068,,643,0,,17,,17,19736,9390,,0,347717,6803,,67,,57,299832,5454,347717,6803 +"2020-06-20","VA",1607,1504,5,103,5807,5807,880,10,,267,,0,,,,,133,57443,54953,650,0,3928,91,,,67975,,550142,8834,550142,8834,67129,185,,,,0,,0 +"2020-06-20","VI",6,,0,,,,,0,,,2492,42,,,,,,74,,0,0,,,,,,64,,0,2566,42,,,,,2586,51,,0 +"2020-06-20","VT",56,56,0,,,,9,0,,,54090,1142,,,,,,1147,1147,4,0,,,,,,920,,0,65045,1510,,,,,55237,1146,65045,1510 +"2020-06-20","WA",1255,1255,10,,4003,4003,359,44,,,,0,,,,,49,29587,29587,542,0,,,,,,,559013,7072,559013,7072,,,,,474876,689,,0 +"2020-06-20","WI",744,744,14,,3203,3203,239,26,708,90,454563,9812,,,,,,27326,24539,413,0,,,,,,18951,575029,13680,575029,13680,,,,,479102,10197,,0 +"2020-06-20","WV",88,,0,,,,22,0,,6,,0,,,,,2,2486,2403,51,0,,,,,,1669,,0,146669,2395,8384,,,,,0,146669,2395 +"2020-06-20","WY",20,,0,,98,98,8,0,,,26162,-9139,,,38395,,,1179,930,6,0,,,,,1154,896,,0,39549,190,,,,,27109,27109,39549,190 +"2020-06-19","AK",12,12,0,,63,63,18,2,,,,0,,,,,1,729,,16,0,,,,,,457,,0,83631,2446,,,,,,0,83631,2446 +"2020-06-19","AL",822,812,12,10,2416,2416,650,43,710,,302323,7995,,,,415,,29002,28583,796,0,,,,,,15974,,0,330906,8782,,,,,330906,8782,,0 +"2020-06-19","AR",214,,6,,1100,1100,224,26,,,220141,5635,,,,175,53,14631,14631,703,0,,,,,,9712,,0,234772,6338,,,,,,0,234772,6338 +"2020-06-19","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-19","AZ",1312,1224,41,88,4246,4246,1832,5,,519,345527,9238,,,,,362,46689,46323,3246,0,,,,,,,,0,550195,20636,,,140847,,391850,12476,550195,20636 +"2020-06-19","CA",5360,,70,,,,4587,0,,1329,,0,,,,,,165416,165416,4317,0,,,,,,,,0,3155702,81172,,,,,,0,3155702,81172 +"2020-06-19","CO",1643,1306,5,337,5318,5318,250,10,,,242882,8337,87749,,,,,30187,27453,286,0,6385,,,,,,322364,7595,322364,7595,94134,,,,270335,5869,,0 +"2020-06-19","CT",4238,3385,12,853,10099,10099,172,0,,,,0,,,348646,,,45557,43610,117,0,,,,,56110,7842,,0,406107,8866,,,,,,0,406107,8866 +"2020-06-19","DC",530,,3,,,,184,0,,63,,0,,,,,44,9952,,49,0,,,,,,1162,73791,1592,73791,1592,,,,,59072,1205,,0 +"2020-06-19","DE",504,446,2,58,,,75,0,,,79823,1638,,,,,,10611,9580,112,0,,,,,13067,6395,107565,1456,107565,1456,,,,,90434,1750,,0 +"2020-06-19","FL",3197,3197,43,,13062,13062,,200,,,1443123,17737,,171364,1687546,,,86167,,3313,0,,,7717,,118915,,1622106,31521,1622106,31521,,,179109,,1533876,21561,1809654,26539 +"2020-06-19","GA",2636,,31,,9772,9772,937,109,2122,,,0,,,,,,62009,62009,1097,0,7848,,,,55621,,,0,663516,6560,134309,,,,663975,663975,663516,6560 +"2020-06-19","GU",5,,0,,,,0,0,,0,9515,120,,,9515,,0,200,192,7,0,2,,,,192,173,,0,9715,127,114,,,,,0,9707,447 +"2020-06-19","HI",17,17,0,,95,95,,0,,,64982,1352,,,,,,762,,18,0,,,,,727,640,74694,1890,74694,1890,,,,,65744,1370,76340,1807 +"2020-06-19","IA",681,,2,,,,197,0,,60,221374,5297,,25816,,,37,25275,25275,421,0,,,2171,,,15816,,0,246649,5718,,,28015,,247015,5714,,0 +"2020-06-19","ID",89,69,1,20,278,278,28,3,101,9,65802,1422,,,,,,3743,3354,111,0,,,,,,3088,,0,69156,1518,,,,,69156,1518,,0 +"2020-06-19","IL",6718,6580,0,204,,,1837,0,,512,,0,,,,,293,136470,135470,831,0,,,,,,,,0,1311003,27171,,,,,,0,1311003,27171 +"2020-06-19","IN",2516,2327,25,189,6731,6731,773,142,1465,259,351141,7857,,,,,111,41746,,308,0,,,,,43205,,,0,508258,13669,,,,,392887,8165,508258,13669 +"2020-06-19","KS",254,,7,,1035,1035,,24,338,,135590,5147,,,,146,,12059,,378,0,,,,,,,,0,147649,5525,,,,,147413,5525,,0 +"2020-06-19","KY",522,519,2,3,2494,2494,339,12,978,64,,0,,,,,,13454,13097,257,0,,,,,,3516,,0,310870,4841,30270,,,,,0,310870,4841 +"2020-06-19","LA",3084,2972,22,112,,,561,0,,,542394,45807,,,,,75,48515,48515,-119,0,,,,,,37017,,0,590909,45688,,,,,,0,590909,45688 +"2020-06-19","MA",7800,7619,30,181,11036,11036,994,51,,199,644157,9319,,,,,124,106650,102005,228,0,,,,,134592,91404,,0,977274,11621,,,62591,,746162,9471,977274,11621 +"2020-06-19","MD",3030,2901,14,129,10447,10447,648,90,,261,390121,5742,,,,,,63548,63548,319,0,,,,,73424,4685,,0,538366,8628,,,,,453669,6061,538366,8628 +"2020-06-19","ME",102,102,0,,328,328,26,5,,11,,0,6087,,,,5,2913,2586,35,0,300,,,,3250,2323,,0,78331,1538,6395,,,,,0,78331,1538 +"2020-06-19","MI",6067,5823,6,244,,,557,0,,209,,0,,,812831,,99,67097,60829,299,0,,,,,83551,44964,,0,896382,30105,137858,,,,,0,896382,30105 +"2020-06-19","MN",1393,1361,17,32,3748,3748,339,30,1150,168,443121,13917,,,,,,32031,32031,356,0,,,,,,27709,475152,14273,475152,14273,,,,,,0,,0 +"2020-06-19","MO",948,,2,,,,594,0,,,289083,8649,,35265,252506,,70,17201,17201,293,0,,,1385,,17275,,,0,270232,0,,,36650,,306284,8942,270232,0 +"2020-06-19","MP",2,,0,,,,,0,,,8139,0,,,,,,30,30,0,0,,,,,,19,,0,8169,0,,,,,,0,8169,0 +"2020-06-19","MS",938,922,0,16,2767,2767,661,0,,159,218074,0,,,,,108,20641,20500,0,0,,,,,,15323,,0,238715,0,10353,,,,,0,238574,0 +"2020-06-19","MT",20,,0,,82,82,9,1,,,,0,,,,,,666,,11,0,,,,,,546,,0,68422,1552,,,,,,0,68422,1552 +"2020-06-19","NC",1197,1197,22,,,,871,0,,,,0,,,,,,49840,49840,1652,0,,,,,,,,0,678919,21412,,,,,,0,678919,21412 +"2020-06-19","ND",82,,1,,210,210,26,2,,,89380,1919,4266,,,,,3221,3221,32,0,135,,,,,2840,144928,3778,144928,3778,4401,,,,90267,1909,148062,3813 +"2020-06-19","NE",240,,6,,1166,1166,149,25,,,130431,2844,,,159240,,,17415,,189,0,,,,,21009,11066,,0,180796,3591,,,,,148039,3043,180796,3591 +"2020-06-19","NH",331,,1,,533,533,56,2,158,,98275,1727,,,,,,5450,,14,0,,,,,,4140,,0,125637,2525,19442,,16848,,103725,1741,125637,2525 +"2020-06-19","NJ",14585,12835,35,1750,19267,19267,1177,257,,286,1025847,22220,,,,,231,169181,168496,410,0,,,,,,,,0,1195028,22630,,,,,,0,1194343,22609 +"2020-06-19","NM",464,,8,,1735,1735,147,9,,,,0,,,,,,10260,,107,0,,,,,,4512,,0,284602,8705,,,,,,0,284602,8705 +"2020-06-19","NV",491,,2,,,,370,0,,87,221874,3154,,,,,49,12486,12486,410,0,,,,,,,276716,6670,276716,6670,,,,,234153,3425,269097,4529 +"2020-06-19","NY",24686,,25,,89995,89995,1284,0,,359,,0,,,,,256,386556,,796,0,,,,,,,3258963,79303,3258963,79303,,,,,,0,,0 +"2020-06-19","OH",2667,2430,34,237,7167,7167,525,63,1820,200,,0,,,,,133,43731,40549,609,0,,,,,47972,,,0,645598,15706,,,,,,0,645598,15706 +"2020-06-19","OK",367,,1,,1209,1209,211,63,,96,264872,4673,,,264872,,,9706,9706,352,0,974,,,,10834,7212,,0,274578,5025,27415,,,,,0,276316,4977 +"2020-06-19","OR",187,,4,,933,933,141,4,,46,182770,4638,,,267194,,28,6366,,148,0,,,,,15022,2502,,0,282216,7706,,,,,188910,4771,282216,7706 +"2020-06-19","PA",6399,,38,,,,731,0,,,556456,12624,,,,,169,80762,78451,526,0,,,,,,62186,756024,17320,756024,17320,,,,,634907,13126,,0 +"2020-06-19","PR",147,57,0,90,,,78,0,,7,113280,0,,,112331,,3,1499,1499,3,0,4696,,,,2326,,,0,114779,3,,,,,,0,114723,0 +"2020-06-19","RI",894,,9,,1922,1922,123,11,,23,124397,1181,,,199203,,12,16413,,59,0,,,,,23189,,222743,3180,222743,3180,,,,,140810,1240,222392,3560 +"2020-06-19","SC",639,639,18,0,2294,2294,660,239,,,265669,6694,30523,,258045,,,22631,22608,1083,0,1569,,,,30232,10790,,0,288300,7777,32092,,,,,0,288277,7754 +"2020-06-19","SD",81,,3,,589,589,95,4,,,65035,791,,,,,,6158,,49,0,,,,,9480,5276,,0,80509,1676,,,,,71193,840,80509,1676 +"2020-06-19","TN",515,494,6,21,2238,2238,635,29,,,,0,,,627672,,,34017,33776,1188,0,,,,,39664,22531,,0,667336,15176,,,,,,0,667336,15176 +"2020-06-19","TX",2140,,35,,,,3148,0,,,,0,,,,,,103305,103305,3454,0,6262,493,,,156829,65329,,0,1801837,44962,153011,3116,,,,0,1801837,44962 +"2020-06-19","UT",155,,3,,1145,1145,237,25,330,63,277255,4707,,,321802,148,,16425,,586,0,,13,,13,19112,9113,,0,340914,6437,,59,,50,294378,5221,340914,6437 +"2020-06-19","VA",1602,1499,16,103,5797,5797,862,53,,251,,0,,,,,121,56793,54312,555,0,3862,88,,,67410,,541308,9873,541308,9873,65374,182,,,,0,,0 +"2020-06-19","VI",6,,0,,,,,0,,,2450,96,,,,,,74,,1,0,,,,,,64,,0,2524,97,,,,,2535,95,,0 +"2020-06-19","VT",56,56,0,,,,8,0,,,52948,1131,,,,,,1143,1143,8,0,,,,,,918,,0,63535,1463,,,,,54091,1139,63535,1463 +"2020-06-19","WA",1245,1245,19,,3959,3959,396,21,,,,0,,,,,47,29045,29045,460,0,,,,,,,551941,10006,551941,10006,,,,,474187,4419,,0 +"2020-06-19","WI",730,730,11,,3177,3177,241,17,704,91,444751,10838,,,,,,26913,24154,323,0,,,,,,18055,561349,13987,561349,13987,,,,,468905,11116,,0 +"2020-06-19","WV",88,,0,,,,22,0,,6,,0,,,,,2,2435,2353,17,0,,,,,,1665,,0,144274,2980,8223,,,,,0,144274,2980 +"2020-06-19","WY",20,,2,,98,98,8,1,,,35301,291,,,38213,,,1173,927,29,0,,,,,1146,889,,0,39359,751,,,,,,0,39359,751 +"2020-06-18","AK",12,12,0,,61,61,18,0,,,,0,,,,,0,713,,12,0,,,,,,449,,0,81185,3476,,,,,,0,81185,3476 +"2020-06-18","AL",810,801,20,9,2373,2373,668,21,695,,294328,10917,,,,405,,28206,27796,894,0,,,,,,15974,,0,322124,11799,,,,,322124,11799,,0 +"2020-06-18","AR",208,,11,,1074,1074,226,22,,,214506,7413,,,,173,53,13928,13928,322,0,,,,,,9376,,0,228434,7735,,,,,,0,228434,7735 +"2020-06-18","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-18","AZ",1271,1184,32,87,4241,4241,1667,17,,540,336289,11020,,,,,341,43443,43085,2519,0,,,,,,,,0,529559,17723,,,138292,,379374,13528,529559,17723 +"2020-06-18","CA",5290,,82,,,,4584,0,,1298,,0,,,,,,161099,161099,4084,0,,,,,,,,0,3074530,76542,,,,,,0,3074530,76542 +"2020-06-18","CO",1638,1303,7,335,5308,5308,270,14,,,234545,2002,86128,,,,,29901,27218,228,0,6302,,,,,,314769,6502,314769,6502,92430,,,,264466,4920,,0 +"2020-06-18","CT",4226,3378,7,848,10099,10099,176,187,,,,0,,,339957,,,45440,43493,11,0,,,,,55939,7842,,0,397241,10184,,,,,,0,397241,10184 +"2020-06-18","DC",527,,4,,,,189,0,,86,,0,,,,,45,9903,,56,0,,,,,,1155,72199,2113,72199,2113,,,,,57867,1794,,0 +"2020-06-18","DE",502,444,0,58,,,79,0,,,78185,2042,,,,,,10499,9524,55,0,,,,,13004,6350,106109,979,106109,979,,,,,88684,2091,,0 +"2020-06-18","FL",3154,3154,44,,12862,12862,,189,,,1425386,22346,,171364,1665500,,,82854,,2694,0,,,7717,,114435,,1590585,29092,1590585,29092,,,179109,,1512315,25556,1783115,30401 +"2020-06-18","GA",2605,,30,,9663,9663,921,120,2109,,,0,,,,,,60912,60912,882,0,6982,,,,55069,,,0,656956,12699,121151,,,,,0,656956,12699 +"2020-06-18","GU",5,,0,,,,0,0,,0,9395,385,,,9076,,0,193,185,5,0,2,,,,184,170,,0,9588,390,114,,,,,0,9260,164 +"2020-06-18","HI",17,17,0,,95,95,,3,,,63630,1127,,,,,,744,,4,0,,,,,709,639,72804,1452,72804,1452,,,,,64374,1131,74533,1455 +"2020-06-18","IA",679,,6,,,,188,0,,64,216077,5407,,25453,,,47,24854,24854,393,0,,,2160,,,15604,,0,240931,5800,,,27641,,241301,5793,,0 +"2020-06-18","ID",88,68,0,20,275,275,23,0,101,7,64380,1136,,,,,,3632,3258,92,0,,,,,,3013,,0,67638,1197,,,,,67638,1197,,0 +"2020-06-18","IL",6718,6537,52,181,,,1878,0,,538,,0,,,,,321,135639,134778,593,0,,,,,,,,0,1283832,25504,,,,,,0,1283832,25504 +"2020-06-18","IN",2491,2304,16,187,6589,6589,754,63,1389,236,343284,13115,,,,,103,41438,,425,0,,,,,42778,,,0,494589,13627,,,,,384722,13540,494589,13627 +"2020-06-18","KS",247,,0,,1011,1011,,0,333,,130443,0,,,,146,,11681,,0,0,,,,,,,,0,142124,0,,,,,141888,0,,0 +"2020-06-18","KY",520,518,2,2,2482,2482,400,27,975,68,,0,,,,,,13197,12846,202,0,,,,,,3506,,0,306029,6509,30238,,,,,0,306029,6509 +"2020-06-18","LA",3062,2950,0,112,,,585,0,,,496587,0,,,,,83,48634,48634,0,0,,,,,,37017,,0,545221,0,,,,,,0,545221,0 +"2020-06-18","MA",7770,7591,36,179,10985,10985,968,60,,227,634838,8943,,,,,125,106422,101853,271,0,,,,,134278,91404,,0,965653,17340,,,61085,,736691,9142,965653,17340 +"2020-06-18","MD",3016,2886,20,130,10357,10357,660,48,,269,384379,6005,,,,,,63229,63229,260,0,,,,,72930,4640,,0,529738,8562,,,,,447608,6265,529738,8562 +"2020-06-18","ME",102,102,0,,323,323,27,0,,10,,0,5843,,,,4,2878,2555,42,0,294,,,,3218,2300,,0,76793,1573,6145,,,,,0,76793,1573 +"2020-06-18","MI",6061,5818,25,243,,,557,0,,209,,0,,,783388,,101,66798,60618,301,0,,,,,82889,44964,,0,866277,0,132227,,,,,0,866277,0 +"2020-06-18","MN",1376,1344,19,32,3718,3718,345,29,1144,171,429204,11913,,,,,,31675,31675,379,0,,,,,,27566,460879,12292,460879,12292,,,,,,0,,0 +"2020-06-18","MO",946,,37,,,,533,0,,,280434,12057,,34715,252506,,64,16908,16908,283,0,,,1363,,17275,,,0,270232,0,,,36078,,297342,12551,270232,0 +"2020-06-18","MP",2,,0,,,,,0,,,8139,0,,,,,,30,30,0,0,,,,,,19,,0,8169,0,,,,,,0,8169,0 +"2020-06-18","MS",938,922,0,16,2767,2767,668,0,,161,218074,-5674,,,,,100,20641,20500,0,0,,,,,,15323,,0,238715,-5674,10353,,,,,0,238574,0 +"2020-06-18","MT",20,,0,,81,81,8,3,,,,0,,,,,,655,,25,0,,,,,,545,,0,66870,1355,,,,,,0,66870,1355 +"2020-06-18","NC",1175,1175,7,,,,857,0,,,,0,,,,,,48188,48188,1333,0,,,,,,,,0,657507,17071,,,,,,0,657507,17071 +"2020-06-18","ND",81,,3,,208,208,26,7,,,87461,953,4069,,,,,3189,3189,29,0,130,,,,,2809,141150,4087,141150,4087,4199,,,,88358,929,144249,4188 +"2020-06-18","NE",234,,3,,1141,1141,156,25,,,127587,2231,,,155905,,,17226,,195,0,,,,,20774,10761,,0,177205,3652,,,,,144996,2430,177205,3652 +"2020-06-18","NH",330,,4,,531,531,56,10,156,,96548,1826,,,,,,5436,,72,0,,,,,,4104,,0,123112,2636,19109,,16599,,101984,1898,123112,2636 +"2020-06-18","NJ",14550,12800,32,1750,19010,19010,1258,0,,319,1003627,23489,,,,,257,168771,168107,428,0,,,,,,,,0,1172398,23917,,,,,,0,1171734,23893 +"2020-06-18","NM",456,,4,,1726,1726,157,11,,,,0,,,,,,10153,,88,0,,,,,,4439,,0,275897,0,,,,,,0,275897,0 +"2020-06-18","NV",489,,3,,,,357,0,,93,218720,2952,,,,,55,12076,12076,234,0,,,,,,,270046,7094,270046,7094,,,,,230728,3136,264568,3767 +"2020-06-18","NY",24661,,32,,89995,89995,1358,0,,388,,0,,,,,278,385760,,618,0,,,,,,,3179660,68541,3179660,68541,,,,,,0,,0 +"2020-06-18","OH",2633,2401,22,232,7104,7104,547,53,1807,219,,0,,,,,149,43122,39973,700,0,,,,,47260,,,0,629892,16653,,,,,,0,629892,16653 +"2020-06-18","OK",366,,2,,1146,1146,197,0,,89,260199,3671,,,260199,,,9354,9354,450,0,974,,,,10535,7071,,0,269553,4121,27415,,,,,0,271339,3915 +"2020-06-18","OR",183,,1,,929,929,158,17,,54,178132,4692,,,259703,,26,6218,,120,0,,,,,14807,2457,,0,274510,7455,,,,,184139,4802,274510,7455 +"2020-06-18","PA",6361,,42,,,,740,0,,,543832,10819,,,,,170,80236,77949,418,0,,,,,,60979,738704,14366,738704,14366,,,,,621781,11225,,0 +"2020-06-18","PR",147,57,0,90,,,73,0,,9,113280,0,,,112331,,5,1496,1496,10,0,4615,,,,2326,,,0,114776,10,,,,,,0,114723,0 +"2020-06-18","RI",885,,9,,1911,1911,126,13,,23,123216,1219,,,195774,,13,16354,,71,0,,,,,23058,,219563,2941,219563,2941,,,,,139570,1290,218832,3015 +"2020-06-18","SC",621,621,4,0,2055,2055,626,0,,,258975,6777,29838,,251540,,,21548,21533,992,0,1538,,,,28983,9734,,0,280523,7769,31376,,,,,0,280523,7774 +"2020-06-18","SD",78,,0,,585,585,93,15,,,64244,1306,,,,,,6109,,59,0,,,,,9415,5221,,0,78833,2288,,,,,70353,1365,78833,2288 +"2020-06-18","TN",509,488,12,21,2209,2209,617,29,,,,0,,,613966,,,32829,32595,686,0,,,,,38194,21949,,0,652160,7816,,,,,,0,652160,7816 +"2020-06-18","TX",2105,,43,,,,2947,0,,,,0,,,,,,99851,99851,3516,0,6258,401,,,149615,63812,,0,1756875,50012,152796,2475,,,,0,1756875,50012 +"2020-06-18","UT",152,,3,,1120,1120,282,18,326,66,272548,3596,,,315924,145,,15839,,495,0,,11,,11,18553,8786,,0,334477,4995,,46,,39,289157,4121,334477,4995 +"2020-06-18","VA",1586,1482,3,104,5744,5744,857,52,,241,,0,,,,,129,56238,53769,463,0,3803,88,,,66774,,531435,11335,531435,11335,63844,182,,,,0,,0 +"2020-06-18","VI",6,,0,,,,,0,,,2354,0,,,,,,73,,0,0,,,,,,64,,0,2427,0,,,,,2440,0,,0 +"2020-06-18","VT",56,56,1,,,,11,0,,,51817,1076,,,,,,1135,1135,6,0,,,,,,917,,0,62072,1346,,,,,52952,1082,62072,1346 +"2020-06-18","WA",1226,1226,-5,,3938,3938,373,23,,,,0,,,,,47,28585,28585,494,0,,,,,,,541935,9795,541935,9795,,,,,469768,6619,,0 +"2020-06-18","WI",719,719,7,,3160,3160,241,32,701,82,433913,10177,,,,,,26590,23876,461,0,,,,,,18055,547362,14175,547362,14175,,,,,457789,10599,,0 +"2020-06-18","WV",88,,0,,,,25,0,,5,,0,,,,,2,2418,2336,42,0,,,,,,1665,,0,141294,4735,8070,,,,,0,141294,4735 +"2020-06-18","WY",18,,0,,97,97,8,0,,,35010,1055,,,37479,,,1144,906,30,0,,,,,1129,870,,0,38608,1131,,,,,,0,38608,1131 +"2020-06-17","AK",12,12,0,,61,61,23,0,,,,0,,,,,0,701,,20,0,,,,,,438,,0,77709,1494,,,,,,0,77709,1494 +"2020-06-17","AL",790,784,5,6,2352,2352,688,37,687,,283411,4899,,,,401,,27312,26914,400,0,,,,,,15974,,0,310325,5289,,,,,310325,5289,,0 +"2020-06-17","AR",197,,15,,1052,1052,217,26,,,207093,14718,,,,168,53,13606,13606,415,0,,,,,,8996,,0,220699,15407,,,,,,0,220699,15407 +"2020-06-17","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-17","AZ",1239,1159,20,80,4224,4224,1582,15,,531,325269,10032,,,,,346,40924,40577,1827,0,,,,,,,,0,511836,17988,,,136117,,365846,11855,511836,17988 +"2020-06-17","CA",5208,,87,,,,4522,0,,1318,,0,,,,,,157015,157015,3455,0,,,,,,,,0,2997988,60233,,,,,,0,2997988,60233 +"2020-06-17","CO",1631,1299,14,332,5294,5294,270,22,,,232543,5318,84783,,,,,29673,27003,231,0,6236,,,,,,308267,6818,308267,6818,91019,,,,259546,5526,,0 +"2020-06-17","CT",4219,3373,9,846,9912,9912,186,0,,,,0,,,330006,,,45429,43487,80,0,,,,,55715,7611,,0,387057,9880,,,,,,0,387057,9880 +"2020-06-17","DC",523,,3,,,,197,0,,73,,0,,,,,47,9847,,29,0,,,,,,1155,70086,2960,70086,2960,,,,,56073,2615,,0 +"2020-06-17","DE",502,444,3,58,,,83,0,,,76143,472,,,,,,10444,9470,41,0,,,,,12964,6305,105130,2648,105130,2648,,,,,86593,519,,0 +"2020-06-17","FL",3110,3110,25,,12673,12673,,184,,,1403040,22840,,171364,1638911,,,80160,,2427,0,,,7717,,110650,,1561493,22825,1561493,22825,,,179109,,1486759,25462,1752714,30647 +"2020-06-17","GA",2575,,46,,9543,9543,881,89,2084,,,0,,,,,,60030,60030,952,0,6912,,,,54227,,,0,644257,15453,118426,,,,,0,644257,15453 +"2020-06-17","GU",5,,0,,,,0,0,,0,9010,164,,,8914,,0,188,180,2,0,2,,,,181,170,,0,9198,166,114,,,,,0,9096,295 +"2020-06-17","HI",17,17,0,,92,92,,1,,,62503,1211,,,,,,740,,4,0,,,,,703,637,71352,1198,71352,1198,,,,,63243,1215,73078,1503 +"2020-06-17","IA",673,,4,,,,188,0,,64,210670,4211,,25186,,,47,24461,24461,282,0,,,2152,,,15289,,0,235131,4493,,,27366,,235508,4496,,0 +"2020-06-17","ID",88,68,0,20,275,275,28,5,101,8,63244,1059,,,,,,3540,3197,78,0,,,,,,2921,,0,66441,1135,,,,,66441,1135,,0 +"2020-06-17","IL",6666,6485,87,181,,,1878,0,,563,,0,,,,,331,135046,134185,546,0,,,,,,,,0,1258328,29987,,,,,,0,1258328,29987 +"2020-06-17","IN",2475,2289,28,186,6526,6526,789,45,1384,238,330169,7210,,,,,105,41013,,227,0,,,,,42306,,,0,480962,13141,,,,,371182,7437,480962,13141 +"2020-06-17","KS",247,,2,,1011,1011,,23,333,,130443,4900,,,,146,,11681,,262,0,,,,,,,,0,142124,5162,,,,,141888,5147,,0 +"2020-06-17","KY",518,516,6,2,2455,2455,416,19,971,61,,0,,,,,,12995,12646,166,0,,,,,,3444,,0,299520,4820,30190,,,,,0,299520,4820 +"2020-06-17","LA",3062,2950,20,112,,,585,0,,,496587,11576,,,,,83,48634,48634,928,0,,,,,,37017,,0,545221,12504,,,,,,0,545221,12504 +"2020-06-17","MA",7734,7568,69,166,10925,10925,998,58,,227,625895,8133,,,,,135,106151,101654,266,0,,,,,133872,88725,,0,948313,17892,,,59940,,727549,8313,948313,17892 +"2020-06-17","MD",2996,2866,14,130,10309,10309,702,47,,283,378374,11558,,,,,,62969,62969,560,0,,,,,72479,4596,,0,521176,15594,,,,,441343,12118,521176,15594 +"2020-06-17","ME",102,102,1,,323,323,27,2,,10,,0,5843,,,,5,2836,2509,17,0,294,,,,3170,2275,,0,75220,1669,6145,,,,,0,75220,1669 +"2020-06-17","MI",6036,5792,2,244,,,562,0,,210,,0,,,783388,,131,66497,60393,228,0,,,,,82889,44964,,0,866277,14447,132227,,,,,0,866277,14447 +"2020-06-17","MN",1357,1325,13,32,3689,3689,351,31,1136,181,417291,19028,,,,,,31296,31296,414,0,,,,,,27404,448587,19442,448587,19442,,,,,,0,,0 +"2020-06-17","MO",909,,27,,,,533,0,,,268377,0,,33637,252506,,66,16625,16625,211,0,,,1308,,17275,,,0,270232,0,,,34945,,284791,0,270232,0 +"2020-06-17","MP",2,,0,,,,,0,,,8139,0,,,,,,30,30,0,0,,,,,,19,,0,8169,0,,,,,,0,8169,0 +"2020-06-17","MS",938,922,23,16,2767,2767,668,39,,161,223748,3097,,,,,100,20641,20500,489,0,,,,,,15323,,0,244389,3586,10222,,,,,0,238574,-2090 +"2020-06-17","MT",20,,1,,78,78,5,-1,,,,0,,,,,,630,,16,0,,,,,,538,,0,65515,1938,,,,,,0,65515,1938 +"2020-06-17","NC",1168,1168,14,,,,846,0,,,,0,,,,,,46855,46855,1002,0,,,,,,,,0,640436,13726,,,,,,0,640436,13726 +"2020-06-17","ND",78,,1,,201,201,25,1,,,86508,981,3997,,,,,3160,3160,39,0,128,,,,,2756,137063,4343,137063,4343,4125,,,,87429,954,140061,4406 +"2020-06-17","NE",231,,11,,1116,1116,156,28,,,125356,2694,,,152535,,,17031,,180,0,,,,,20503,10529,,0,173553,3324,,,,,142566,2876,173553,3324 +"2020-06-17","NH",326,,6,,521,521,62,2,155,,94722,1194,,,,,,5364,,19,0,,,,,,4067,,0,120476,1942,18787,,16285,,100086,1213,120476,1942 +"2020-06-17","NJ",14518,12769,42,1749,19010,19010,1352,131,,358,980138,15782,,,,,254,168343,167703,307,0,,,,,,,,0,1148481,16089,,,,,,0,1147841,16059 +"2020-06-17","NM",452,,5,,1715,1715,161,17,,,,0,,,,,,10065,,132,0,,,,,,4351,,0,275897,4344,,,,,,0,275897,4344 +"2020-06-17","NV",486,,1,,,,360,0,,96,215768,4952,,,,,45,11842,11842,184,0,,,,,,,262952,5233,262952,5233,,,,,227592,5132,260801,6002 +"2020-06-17","NY",24629,,21,,89995,89995,1479,0,,431,,0,,,,,304,385142,,567,0,,,,,,,3111119,59341,3111119,59341,,,,,,0,,0 +"2020-06-17","OH",2611,2377,14,234,7051,7051,541,44,1797,215,,0,,,,,148,42422,39303,412,0,,,,,46485,,,0,613239,10724,,,,,,0,613239,10724 +"2020-06-17","OK",364,,1,,1146,1146,181,16,,92,256528,3368,,,256528,,,8904,8904,259,0,974,,,,10296,6898,,0,265432,3627,27415,,,,,0,267424,3542 +"2020-06-17","OR",182,,2,,912,912,141,13,,50,173440,3124,,,252413,,22,6098,,278,0,,,,,14642,2431,,0,267055,5884,,,,,179337,3396,267055,5884 +"2020-06-17","PA",6319,,43,,,,788,0,,,533013,9404,,,,,179,79818,77543,335,0,,,,,,59863,724338,12787,724338,12787,,,,,610556,9717,,0 +"2020-06-17","PR",147,57,0,90,,,78,0,,8,113280,0,,,112331,,1,1486,1486,7,0,4517,,,,2326,,,0,114766,7,,,,,,0,114723,0 +"2020-06-17","RI",876,,11,,1898,1898,126,9,,17,121997,1207,,,192904,,13,16283,,51,0,,,,,22913,,216622,3118,216622,3118,,,,,138280,1258,215817,2679 +"2020-06-17","SC",617,617,10,0,2055,2055,607,0,,,252198,4509,28878,,244957,,,20556,20551,566,0,1500,,,,27792,9734,,0,272754,5075,30378,,,,,0,272749,5070 +"2020-06-17","SD",78,,1,,570,570,91,8,,,62938,1702,,,,,,6050,,84,0,,,,,9304,5143,,0,76545,1051,,,,,68988,1786,76545,1051 +"2020-06-17","TN",497,476,4,21,2180,2180,632,34,,,,0,,,606924,,,32143,31914,313,0,,,,,37420,21282,,0,644344,5572,,,,,,0,644344,5572 +"2020-06-17","TX",2062,,33,,,,2793,0,,,,0,,,,,,96335,96335,3129,0,6258,316,,,142013,62368,,0,1706863,52643,152796,1971,,,,0,1706863,52643 +"2020-06-17","UT",149,,4,,1102,1102,270,29,321,64,268952,3464,,,311492,142,,15344,,407,0,,11,,11,17990,8552,,0,329482,4966,,32,,27,285036,3942,329482,4966 +"2020-06-17","VA",1583,1478,13,105,5692,5692,938,49,,249,,0,,,,,120,55775,53318,444,0,3750,85,,,66042,,520100,10219,520100,10219,61907,179,,,,0,,0 +"2020-06-17","VI",6,,0,,,,,0,,,2354,49,,,,,,73,,0,0,,,,,,64,,0,2427,49,,,,,2440,57,,0 +"2020-06-17","VT",55,55,0,,,,5,0,,,50741,773,,,,,,1129,1129,0,0,,,,,,915,,0,60726,992,,,,,51870,773,60726,992 +"2020-06-17","WA",1231,1231,10,,3915,3915,359,21,,,,0,,,,,47,28091,28091,520,0,,,,,,,532140,10795,532140,10795,,,,,463149,8913,,0 +"2020-06-17","WI",712,712,9,,3128,3128,247,32,696,93,423736,9406,,,,,,26129,23454,285,0,,,,,,17613,533187,11672,533187,11672,,,,,447190,9662,,0 +"2020-06-17","WV",88,,0,,,,23,0,,7,,0,,,,,2,2376,2295,35,0,,,,,,1654,,0,136559,4910,7878,,,,,0,136559,4910 +"2020-06-17","WY",18,,0,,97,97,7,1,,,33955,631,,,36370,,,1114,884,25,0,,,,,1107,862,,0,37477,846,,,,,,0,37477,846 +"2020-06-16","AK",12,12,0,,61,61,22,1,,,,0,,,,,2,681,,13,0,,,,,,429,,0,76215,1778,,,,,,0,76215,1778 +"2020-06-16","AL",785,779,11,6,2315,2315,683,56,682,,278512,2110,,,,399,,26912,26524,640,0,,,,,,13508,,0,305036,2742,,,,,305036,2742,,0 +"2020-06-16","AR",182,,0,,1026,1026,214,23,,,192375,1154,,,,165,45,13191,13191,274,0,,,,,,8352,,0,205292,1240,,,,,,0,205292,1240 +"2020-06-16","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-16","AZ",1219,1140,25,79,4209,4209,1506,27,,502,315237,6685,,,,,340,39097,38754,2392,0,,,,,,,,0,493848,17774,,,135295,,353991,9062,493848,17774 +"2020-06-16","CA",5121,,32,,,,4462,0,,1272,,0,,,,,,153560,153560,2108,0,,,,,,,,0,2937755,69573,,,,,,0,2937755,69573 +"2020-06-16","CO",1617,1291,12,326,5272,5272,290,3,,,227225,3368,83749,,,,,29442,26795,143,0,6176,,,,,,301449,4481,301449,4481,89925,,,,254020,3497,,0 +"2020-06-16","CT",4210,3362,6,848,9912,9912,201,0,,,,0,,,320305,,,45349,43415,114,0,,,,,55547,7611,,0,377177,8952,,,,,,0,377177,8952 +"2020-06-16","DC",520,,5,,,,192,0,,70,,0,,,,,49,9818,,19,0,,,,,,1155,67126,1280,67126,1280,,,,,53458,1010,,0 +"2020-06-16","DE",499,441,1,58,,,87,0,,,75671,1325,,,,,,10403,9429,63,0,,,,,12898,6256,102482,2741,102482,2741,,,,,86074,1388,,0 +"2020-06-16","FL",3085,3085,55,,12489,12489,,191,,,1380200,27342,,171364,1611442,,,77733,,2691,0,,,7717,,107506,,1538668,34413,1538668,34413,,,179109,,1461297,30133,1722067,37688 +"2020-06-16","GA",2529,,35,,9454,9454,875,132,2065,,,0,,,,,,59078,59078,664,0,6897,,,,53313,,,0,628804,4218,118075,,,,,0,628804,4218 +"2020-06-16","GU",5,,0,,,,,0,,,8846,273,,,8624,,,186,178,1,0,2,,,,176,169,,0,9032,274,114,,,,,0,8801,95 +"2020-06-16","HI",17,17,0,,91,91,,0,,,61292,546,,,,,,736,,8,0,,,,,699,630,70154,671,70154,671,,,,,62028,554,71575,698 +"2020-06-16","IA",669,,14,,,,193,0,,71,206459,3124,,24658,,,49,24179,24179,126,0,,,2131,,,15025,,0,230638,3250,,,26817,,231012,3253,,0 +"2020-06-16","ID",88,68,1,20,270,270,24,4,100,6,62185,2604,,,,,,3462,3121,63,0,,,,,,2877,,0,65306,2664,,,,,65306,2664,,0 +"2020-06-16","IL",6579,6398,72,181,,,1939,0,,561,,0,,,,,331,134500,133639,623,0,,,,,,,,0,1228341,18729,,,,,,0,1228341,18729 +"2020-06-16","IN",2447,2265,14,182,6481,6481,860,30,1383,313,322959,7560,,,,,121,40786,,356,0,,,,,41887,,,0,467821,13858,,,,,363745,7916,467821,13858 +"2020-06-16","KS",245,,0,,988,988,,0,327,,125543,0,,,,143,,11419,,0,0,,,,,,,,0,136962,0,,,,,136741,0,,0 +"2020-06-16","KY",512,510,7,2,2436,2436,395,3,969,69,,0,,,,,,12829,12490,182,0,,,,,,3431,,0,294700,-830,29733,,,,,0,294700,-830 +"2020-06-16","LA",3042,2930,24,112,,,588,0,,,485011,13458,,,,,77,47706,47706,534,0,,,,,,37017,,0,532717,13992,,,,,,0,532717,13992 +"2020-06-16","MA",7665,7508,18,157,10867,10867,1045,50,,244,617762,6221,,,,,151,105885,101474,195,0,,,,,133424,88725,,0,930421,13700,,,58795,,719236,6361,930421,13700 +"2020-06-16","MD",2982,2851,35,131,10262,10262,742,40,,284,366816,7740,,,,,,62409,62409,377,0,,,,,71784,4579,,0,505582,10497,,,,,429225,8117,505582,10497 +"2020-06-16","ME",101,101,0,,321,321,30,4,,10,,0,5715,,,,6,2819,2499,9,0,290,,,,3147,2233,,0,73551,1347,6013,,,,,0,73551,1347 +"2020-06-16","MI",6034,5790,17,244,,,562,0,,210,,0,,,769265,,131,66269,60189,184,0,,,,,82565,44964,,0,851830,11964,130254,,,,,0,851830,11964 +"2020-06-16","MN",1344,1313,9,31,3658,3658,357,28,1128,185,398263,6034,,,,,,30882,30882,189,0,,,,,,27006,429145,6223,429145,6223,,,,,,0,,0 +"2020-06-16","MO",882,,2,,,,524,0,,,268377,4625,,33637,252506,,66,16414,16414,225,0,,,1308,,17275,,,0,270232,0,,,34945,,284791,4850,270232,0 +"2020-06-16","MP",2,,0,,,,,0,,,8139,0,,,,,,30,30,0,0,,,,,,19,,0,8169,0,,,,,,0,8169,0 +"2020-06-16","MS",915,899,20,16,2728,2728,668,48,,160,220651,9947,,,,,98,20152,20013,353,0,,,,,,15323,,0,240803,10300,10161,,,,,0,240664,10161 +"2020-06-16","MT",19,,0,,79,79,8,1,,,,0,,,,,,614,,5,0,,,,,,535,,0,63577,2640,,,,,,0,63577,2640 +"2020-06-16","NC",1154,1154,36,,,,829,0,,,,0,,,,,,45853,45853,751,0,,,,,,,,0,626710,12694,,,,,,0,626710,12694 +"2020-06-16","ND",77,,0,,200,200,26,3,,,85527,852,3967,,,,,3121,3121,23,0,126,,,,,2720,132720,1770,132720,1770,4093,,,,86475,929,135655,1795 +"2020-06-16","NE",220,,4,,1088,1088,160,13,,,122662,1632,,,149423,,,16851,,126,0,,,,,20296,10351,,0,170229,3348,,,,,139690,1766,170229,3348 +"2020-06-16","NH",320,,0,,519,519,69,0,154,,93528,0,,,,,,5345,,0,0,,,,,,4041,,0,118534,1717,18427,,16080,,98873,0,118534,1717 +"2020-06-16","NJ",14476,12727,52,1749,18879,18879,1291,124,,362,964356,15376,,,,,245,168036,167426,345,0,,,,,,,,0,1132392,15721,,,,,,0,1131782,15699 +"2020-06-16","NM",447,,7,,1698,1698,156,12,,,,0,,,,,,9933,,88,0,,,,,,4217,,0,271553,3632,,,,,,0,271553,3632 +"2020-06-16","NV",485,,2,,,,349,0,,87,210816,5661,,,,,48,11658,11658,379,0,,,,,,,257719,4329,257719,4329,,,,,222460,5996,254799,6301 +"2020-06-16","NY",24608,,29,,89995,89995,1538,0,,449,,0,,,,,303,384575,,631,0,,,,,,,3051778,60568,3051778,60568,,,,,,0,,0 +"2020-06-16","OH",2597,2362,24,235,7007,7007,528,59,1784,216,,0,,,,,151,42010,38911,434,0,,,,,45992,,,0,602515,9326,,,,,,0,602515,9326 +"2020-06-16","OK",363,,4,,1130,1130,172,13,,75,253160,10573,,,253160,,,8645,8645,228,0,974,,,,10130,6765,,0,261805,10801,27415,,,,,0,263882,11258 +"2020-06-16","OR",180,,4,,899,899,125,24,,50,170316,2070,,,246879,,19,5820,,184,0,,,,,14292,2396,,0,261171,4387,,,,,175941,9922,261171,4387 +"2020-06-16","PA",6276,,33,,,,800,0,,,523609,9700,,,,,179,79483,77230,362,0,,,,,,59612,711551,13383,711551,13383,,,,,600839,10047,,0 +"2020-06-16","PR",147,57,0,90,,,94,0,,9,113280,0,,,112331,,1,1479,1479,2,0,4472,,,,2326,,,0,114759,2,,,,,,0,114723,0 +"2020-06-16","RI",865,,14,,1889,1889,129,7,,16,120790,1486,,,190338,,13,16232,,52,0,,,,,22800,,213504,3284,213504,3284,,,,,137022,1538,213138,2912 +"2020-06-16","SC",607,607,5,,2055,2055,571,67,,,247689,11510,28573,,240593,,,19990,19990,612,0,1483,,,,27086,9734,,0,267679,12122,30056,,,,,0,267679,5206 +"2020-06-16","SD",77,,2,,562,562,92,18,,,61236,769,,,,,,5966,,38,0,,,,,9255,5069,,0,75494,1130,,,,,67202,807,75494,1130 +"2020-06-16","TN",493,472,10,21,2146,2146,621,40,,,,0,,,601777,,,31830,31612,670,0,,,,,36995,20710,,0,638772,9003,,,,,,0,638772,9003 +"2020-06-16","TX",2029,,46,,,,2518,0,,,,0,,,,,,93206,93206,4098,0,6189,270,,,135057,60681,,0,1654220,43642,150573,1757,,,,0,1654220,43642 +"2020-06-16","UT",145,,2,,1073,1073,271,32,311,,265488,3788,,,307048,138,,14937,,329,0,,7,,7,17468,8470,,0,324516,5106,,22,,19,281094,4212,324516,5106 +"2020-06-16","VA",1570,1465,18,105,5643,5643,904,55,,241,,0,,,,,125,55331,52917,445,0,3704,85,,,65432,,509881,7489,509881,7489,60889,179,,,,0,,0 +"2020-06-16","VI",6,,0,,,,,0,,,2305,0,,,,,,73,,0,0,,,,,,64,,0,2378,0,,,,,2383,5,,0 +"2020-06-16","VT",55,55,0,,,,12,0,,,49968,334,,,,,,1129,1129,3,0,,,,,,914,,0,59734,471,,,,,51097,337,59734,471 +"2020-06-16","WA",1221,1221,4,,3894,3894,342,38,,,,0,,,,,38,27571,27571,136,0,,,,,,,521345,12560,521345,12560,,,,,454236,10942,,0 +"2020-06-16","WI",703,703,9,,3096,3096,275,35,687,100,414330,10883,,,,,,25844,23198,298,0,,,,,,17122,521515,7575,521515,7575,,,,,437528,11149,,0 +"2020-06-16","WV",88,,0,,,,24,0,,8,,0,,,,,3,2341,2261,43,0,,,,,,1636,,0,131649,1406,7813,,,,,0,131649,1406 +"2020-06-16","WY",18,,0,,96,96,7,3,,,33324,1778,,,35547,,,1089,866,10,0,,,,,1084,852,,0,36631,787,,,,,,0,36631,787 +"2020-06-15","AK",12,12,0,,60,60,21,3,,,,0,,,,,3,668,,3,0,,,,,,417,,0,74437,970,,,,,,0,74437,970 +"2020-06-15","AL",774,769,1,5,2259,2259,641,4,676,,276402,4562,,,,395,,26272,25892,657,0,,,,,,13508,,0,302294,5219,,,,,302294,5219,,0 +"2020-06-15","AR",182,,3,,1003,1003,206,5,,,191221,6733,,,,163,45,12917,12917,416,0,,,,,,8352,,0,204052,7063,,,,,,0,204052,7063 +"2020-06-15","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-15","AZ",1194,1127,8,67,4182,4182,1449,34,,464,308552,6198,,,,,307,36705,36377,1014,0,,,,,,,,0,476074,6281,,,134173,,344929,7201,476074,6281 +"2020-06-15","CA",5089,,26,,,,4323,0,,1270,,0,,,,,,151452,151452,2597,0,,,,,,,,0,2868182,66186,,,,,,0,2868182,66186 +"2020-06-15","CO",1605,1279,6,326,5269,5269,276,25,,,223857,3902,82914,,,,,29299,26666,169,0,6119,,,,,,296968,5164,296968,5164,89033,,,,250523,4045,,0 +"2020-06-15","CT",4204,3356,3,848,9912,9912,203,0,,,,0,,,311560,,,45235,43303,147,0,,,,,55351,7611,,0,368225,2393,,,,,,0,368225,2393 +"2020-06-15","DC",515,,0,,,,191,0,,76,,0,,,,,48,9799,,32,0,,,,,,1155,65846,1316,65846,1316,,,,,52448,1088,,0 +"2020-06-15","DE",498,440,2,58,,,88,0,,,74346,2823,,,,,,10340,9378,76,0,,,,,12845,6172,99741,2889,99741,2889,,,,,84686,2899,,0 +"2020-06-15","FL",3030,3030,8,,12298,12298,,74,,,1352858,19411,,171364,1577532,,,75042,,1760,0,,,7717,,103802,,1504255,30907,1504255,30907,,,179109,,1431164,21172,1684379,26305 +"2020-06-15","GA",2494,,43,,9322,9322,865,74,2043,,,0,,,,,,58414,58414,733,0,6885,,,,52913,,,0,624586,9589,117901,,,,,0,624586,9589 +"2020-06-15","GU",5,,0,,,,,0,,,8573,215,,,8531,,,185,177,0,0,2,,,,174,169,,0,8758,215,114,,,,,0,8706,280 +"2020-06-15","HI",17,17,0,,91,91,,2,,,60746,1147,,,,,,728,,5,0,,,,,691,629,69483,1202,69483,1202,,,,,61474,1152,70877,1365 +"2020-06-15","IA",655,,3,,,,197,0,,71,203335,2627,,24121,,,51,24053,24053,127,0,,,2114,,,14625,,0,227388,2754,,,26262,,227759,2758,,0 +"2020-06-15","ID",87,67,0,20,266,266,23,0,98,5,59581,0,,,,,,3399,3061,0,0,,,,,,2837,,0,62642,0,,,,,62642,0,,0 +"2020-06-15","IL",6507,6326,18,181,,,1961,0,,569,,0,,,,,340,133877,133016,473,0,,,,,,,,0,1209612,18627,,,,,,0,1209612,18627 +"2020-06-15","IN",2433,2251,11,182,6451,6451,882,32,1368,305,315399,6917,,,,,123,40430,,521,0,,,,,41401,,,0,453963,2846,,,,,355829,7438,453963,2846 +"2020-06-15","KS",245,,2,,988,988,,15,327,,125543,7438,,,,143,,11419,,372,0,,,,,,,,0,136962,7810,,,,,136741,7802,,0 +"2020-06-15","KY",505,503,6,2,2433,2433,383,0,969,63,,0,,,,,,12647,12326,202,0,,,,,,3416,,0,295530,1265,29535,,,,,0,295530,1265 +"2020-06-15","LA",3018,2906,4,112,,,568,0,,,471553,8840,,,,,76,47172,47172,553,0,,,,,,37017,,0,518725,9393,,,,,,0,518725,9393 +"2020-06-15","MA",7647,7490,23,157,10817,10817,1026,15,,253,611541,4434,,,,,167,105690,101334,87,0,,,,,133033,88725,,0,916721,14126,,,57886,,712875,4492,916721,14126 +"2020-06-15","MD",2947,2817,8,130,10222,10222,745,57,,292,359076,5468,,,,,,62032,62032,331,0,,,,,71293,4567,,0,495085,8486,,,,,421108,5799,495085,8486 +"2020-06-15","ME",101,101,1,,317,317,31,3,,11,,0,5622,,,,4,2810,2495,17,0,287,,,,3133,2189,,0,72204,1092,5917,,,,,0,72204,1092 +"2020-06-15","MI",6017,5772,1,245,,,562,0,,210,,0,,,757952,,139,66085,60064,31,0,,,,,82274,44964,,0,839866,10343,128657,,,,,0,839866,10343 +"2020-06-15","MN",1335,1304,6,31,3630,3630,353,20,1121,186,392229,4990,,,,,,30693,30693,222,0,,,,,,26609,422922,5212,422922,5212,,,,,,0,,0 +"2020-06-15","MO",880,,1,,,,612,0,,,263752,4073,,33127,252506,,64,16189,16189,379,0,,,1288,,17275,,,0,270232,0,,,34415,,279941,4452,270232,0 +"2020-06-15","MP",2,,0,,,,,0,,,8139,0,,,,,,30,30,0,0,,,,,,19,,0,8169,0,,,,,,0,8169,0 +"2020-06-15","MS",895,879,4,16,2680,2680,661,15,,163,210704,16167,,,,,100,19799,19664,283,0,,,,,,15323,,0,230503,16450,10161,,,,,0,230503,16750 +"2020-06-15","MT",19,,0,,78,78,7,1,,,,0,,,,,,609,,8,0,,,,,,510,,0,60937,2030,,,,,,0,60937,2030 +"2020-06-15","NC",1118,1118,9,,,,797,0,,,,0,,,,,,45102,45102,983,0,,,,,,,,0,614016,13541,,,,,,0,614016,13541 +"2020-06-15","ND",77,,0,,197,197,31,0,,,84675,875,3874,,,,,3098,3098,22,0,126,,,,,2683,130950,1995,130950,1995,4000,,,,85546,1011,133860,2025 +"2020-06-15","NE",216,,0,,1075,1075,160,5,,,121030,1548,,,146309,,,16725,,92,0,,,,,20073,10121,,0,166881,2735,,,,,137924,1647,166881,2735 +"2020-06-15","NH",320,,2,,519,519,69,6,154,,93528,2406,,,,,,5345,,46,0,,,,,,4041,,0,116817,2095,18167,,16080,,98873,2452,116817,2095 +"2020-06-15","NJ",14424,12676,52,1748,18755,18755,1342,18,,399,948980,18245,,,,,267,167691,167103,230,0,,,,,,,,0,1116671,18475,,,,,,0,1116083,18467 +"2020-06-15","NM",440,,5,,1686,1686,161,61,,,,0,,,,,,9845,,122,0,,,,,,4160,,0,267921,4256,,,,,,0,267921,4256 +"2020-06-15","NV",483,,4,,,,346,0,,85,205155,5717,,,,,40,11279,11279,106,0,,,,,,,253390,1383,253390,1383,,,,,216464,5961,248498,6769 +"2020-06-15","NY",24579,,28,,89995,89995,1608,0,,470,,0,,,,,323,383944,,620,0,,,,,,,2991210,56611,2991210,56611,,,,,,0,,0 +"2020-06-15","OH",2573,2342,16,231,6948,6948,513,53,1776,216,,0,,,,,157,41576,38536,428,0,,,,,45657,,,0,593189,10943,,,,,,0,593189,10943 +"2020-06-15","OK",359,,0,,1117,1117,149,1,,67,242587,0,,,242587,,,8417,8417,186,0,974,,,,9456,6628,,0,251004,186,27415,,,,,0,252624,0 +"2020-06-15","OR",176,,2,,875,875,133,0,,47,168246,3302,,,242754,,15,5636,,101,0,,,,,14030,2396,,0,256784,6243,,,,,166019,0,256784,6243 +"2020-06-15","PA",6243,,28,,,,851,0,,,513909,9474,,,,,178,79121,76883,323,0,,,,,,58549,698168,12277,698168,12277,,,,,590792,9790,,0 +"2020-06-15","PR",147,57,0,90,,,104,0,,8,113280,0,,,112331,,2,1477,1477,6,0,4413,,,,2326,,,0,114757,6,,,,,,0,114723,0 +"2020-06-15","RI",851,,18,,1882,1882,127,29,,21,119304,1711,,,187532,,14,16180,,76,0,,,,,22694,,210220,2110,210220,2110,,,,,135484,1787,210226,3141 +"2020-06-15","SC",602,602,2,,1988,1988,536,0,,,236179,6638,28524,,236179,,,19378,19378,583,0,1457,,,,26294,8682,,0,255557,7221,29981,,,,,0,262473,7377 +"2020-06-15","SD",75,,0,,544,544,93,5,,,60467,1046,,,,,,5928,,30,0,,,,,9229,4961,,0,74364,964,,,,,66395,1076,74364,964 +"2020-06-15","TN",483,462,8,21,2106,2106,642,19,,,,0,,,593485,,,31160,30951,728,0,,,,,36284,20062,,0,629769,14726,,,,,,0,629769,14726 +"2020-06-15","TX",1983,,7,,,,2326,0,,,,0,,,,,,89108,89108,1254,0,6135,219,,,128779,59089,,0,1610578,14922,149090,1544,,,,0,1610578,14922 +"2020-06-15","UT",143,,4,,1041,1041,184,13,304,72,261700,3265,,,302448,134,,14608,,295,0,,5,,5,16962,8380,,0,319410,4508,,5,,5,276882,3575,319410,4508 +"2020-06-15","VA",1552,1444,6,108,5588,5588,902,52,,269,,0,,,,,130,54886,52460,380,0,3699,82,,,64951,,502392,8677,502392,8677,60740,176,,,,0,,0 +"2020-06-15","VI",6,,0,,,,,0,,,2305,0,,,,,,73,,1,0,,,,,,64,,0,2378,1,,,,,2378,15,,0 +"2020-06-15","VT",55,55,0,,,,16,0,,,49634,1549,,,,,,1126,1126,1,0,,,,,,912,,0,59263,1836,,,,,50760,1550,59263,1836 +"2020-06-15","WA",1217,1217,4,,3856,3856,357,11,,,,0,,,,,41,27435,27435,193,0,,,,,,,508785,11883,508785,11883,,,,,443294,10675,,0 +"2020-06-15","WI",694,694,2,,3061,3061,284,12,680,100,403447,6081,,,,,,25546,22932,206,0,,,,,,16837,513940,8813,513940,8813,,,,,426379,6255,,0 +"2020-06-15","WV",88,,0,,,,25,0,,8,,0,,,,,2,2298,2220,9,0,,,,,,1585,,0,130243,874,7673,,,,,0,130243,874 +"2020-06-15","WY",18,,0,,93,93,4,0,,,31546,-459,,,34779,,,1079,856,19,0,,,,,1065,834,,0,35844,902,,,,,,0,35844,902 +"2020-06-14","AK",12,12,0,,57,57,11,1,,,,0,,,,,1,665,,9,0,,,,,,411,,0,73467,1664,,,,,,0,73467,1664 +"2020-06-14","AL",773,768,0,5,2255,2255,576,14,675,,271840,3189,,,,395,,25615,25235,1014,0,,,,,,13508,,0,297075,4203,,,,,297075,4203,,0 +"2020-06-14","AR",179,,3,,998,998,204,19,,,184488,9018,,,,162,46,12501,12501,954,0,,,,,,8110,,0,196989,9972,,,,,,0,196989,9972 +"2020-06-14","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-14","AZ",1186,1119,3,67,4148,4148,1457,33,,452,302354,8415,,,,,317,35691,35374,1233,0,,,,,,,,0,469793,9317,,,131698,,337728,9643,469793,9317 +"2020-06-14","CA",5063,,74,,,,4247,0,,1280,,0,,,,,,148855,148855,3212,0,,,,,,,,0,2801996,77603,,,,,,0,2801996,77603 +"2020-06-14","CO",1599,1273,1,326,5244,5244,276,0,,,219955,4329,81861,,,,,29130,26523,113,0,6046,,,,,,291804,5893,291804,5893,87907,,,,246478,4444,,0 +"2020-06-14","CT",4201,3355,15,846,9912,9912,205,0,,,,0,,,309232,,,45088,43172,94,0,,,,,55289,7611,,0,365832,3008,,,,,,0,365832,3008 +"2020-06-14","DC",515,,4,,,,186,0,,71,,0,,,,,50,9767,,58,0,,,,,,1150,64530,1494,64530,1494,,,,,51360,1328,,0 +"2020-06-14","DE",496,438,1,58,,,93,0,,,71523,1653,,,,,,10264,9313,35,0,,,,,12785,6172,96852,3371,96852,3371,,,,,81787,1688,,0 +"2020-06-14","FL",3022,3022,6,,12224,12224,,69,,,1333447,36586,,171364,1553385,,,73282,,2133,0,,,7717,,101662,,1473348,45792,1473348,45792,,,179109,,1409992,38591,1658074,45457 +"2020-06-14","GA",2451,,5,,9248,9248,829,24,2034,,,0,,,,,,57681,57681,880,0,6769,,,,52295,,,0,614997,15786,115727,,,,,0,614997,15786 +"2020-06-14","GU",5,,0,,,,,0,,,8358,0,,,8249,,,185,177,0,0,2,,,,176,168,,0,8543,0,110,,,,,0,8426,0 +"2020-06-14","HI",17,17,0,,89,89,,2,,,59599,967,,,,,,723,,17,0,,,,,675,628,68281,1205,68281,1205,,,,,60322,984,69512,774 +"2020-06-14","IA",652,,2,,,,203,0,,77,200708,4817,,23952,,,47,23926,23926,209,0,,,2101,,,14383,,0,224634,5026,,,26080,,225001,5025,,0 +"2020-06-14","ID",87,67,0,20,266,266,22,1,98,6,59581,276,,,,,,3399,3061,46,0,,,,,,2837,,0,62642,314,,,,,62642,314,,0 +"2020-06-14","IL",6489,6308,19,181,,,1914,0,,562,,0,,,,,328,133404,132543,672,0,,,,,,,,0,1190985,22040,,,,,,0,1190985,22040 +"2020-06-14","IN",2422,2240,9,182,6419,6419,869,70,1360,301,308482,7388,,,,,113,39909,,366,0,,,,,41237,,,0,451117,6733,,,,,348391,7754,451117,6733 +"2020-06-14","KS",243,,0,,973,973,,0,324,,118105,0,,,,143,,11047,,0,0,,,,,,,,0,129152,0,,,,,128939,0,,0 +"2020-06-14","KY",499,497,0,2,2433,2433,410,0,969,68,,0,,,,,,12445,12125,0,0,,,,,,3409,,0,294265,0,28635,,,,,0,294265,0 +"2020-06-14","LA",3014,2901,10,113,,,556,0,,,462713,4613,,,,,76,46619,46619,336,0,,,,,,33904,,0,509332,4949,,,,,,0,509332,4949 +"2020-06-14","MA",7624,7467,48,157,10802,10802,1039,30,,244,607107,8906,,,,,156,105603,101276,208,0,,,,,132541,88725,,0,902595,5039,,,57582,,708383,9112,902595,5039 +"2020-06-14","MD",2939,2811,13,128,10165,10165,751,112,,313,353608,6155,,,,,,61701,61701,396,0,,,,,70855,4541,,0,486599,8480,,,,,415309,6551,486599,8480 +"2020-06-14","ME",100,100,0,,314,314,29,1,,10,,0,5438,,,,5,2793,2486,36,0,281,,,,3123,2173,,0,71112,1494,5727,,,,,0,71112,1494 +"2020-06-14","MI",6016,5771,3,245,,,636,0,,253,,0,,,747444,,139,66054,59990,218,0,,,,,82079,44964,,0,829523,14149,127842,,,,,0,829523,14149 +"2020-06-14","MN",1329,1298,15,31,3610,3610,369,29,1110,186,387239,-6,,,,,,30471,30471,6,0,,,,,,26090,417710,0,417710,0,,,,,,0,,0 +"2020-06-14","MO",879,,0,,,,647,0,,,259679,5693,,33017,252506,,65,15810,15810,0,0,,,1275,,17275,,,0,270232,0,,,34292,,275489,5693,270232,0 +"2020-06-14","MP",2,,0,,,,,0,,,8139,233,,,,,,30,30,0,0,,,,,,19,,0,8169,233,,,,,,0,8169,233 +"2020-06-14","MS",891,873,2,16,2665,2665,667,21,,151,194537,0,,,,,99,19516,19383,168,0,,,,,,13356,,0,214053,168,9442,,,,,0,213753,0 +"2020-06-14","MT",19,,1,,77,77,6,0,,,,0,,,,,,601,,13,0,,,,,,510,,0,58907,903,,,,,,0,58907,903 +"2020-06-14","NC",1109,1109,5,,,,798,0,,,,0,,,,,,44119,44119,1443,0,,,,,,,,0,600475,16049,,,,,,0,600475,16049 +"2020-06-14","ND",77,,0,,197,197,35,0,,,83800,985,3872,,,,,3076,3076,22,0,126,,,,,2658,128955,2058,128955,2058,3998,,,,84535,860,131835,2087 +"2020-06-14","NE",216,,0,,1070,1070,156,3,,,119482,1618,,,143727,,,16633,,120,0,,,,,19929,9879,,0,164146,2480,,,,,136277,1741,164146,2480 +"2020-06-14","NH",318,,3,,513,513,70,10,152,,91122,2417,,,,,,5299,,48,0,,,,,,3905,,0,114722,2581,18071,,15631,,96421,2465,114722,2581 +"2020-06-14","NJ",14372,12625,37,1747,18737,18737,1391,30,,386,930735,19125,,,,,285,167461,166881,290,0,,,,,,,,0,1098196,19415,,,,,,0,1097616,19401 +"2020-06-14","NM",435,,4,,1625,1625,162,0,,,,0,,,,,,9723,,102,0,,,,,,4114,,0,263665,4671,,,,,,0,263665,4671 +"2020-06-14","NV",479,,1,,,,332,0,,83,199438,5504,,,,,69,11173,11173,227,0,,,,,,,252007,2473,252007,2473,,,,,210503,5715,241729,6229 +"2020-06-14","NY",24551,,24,,89995,89995,1657,0,,499,,0,,,,,346,383324,,694,0,,,,,,,2934599,62359,2934599,62359,,,,,,0,,0 +"2020-06-14","OH",2557,2327,3,230,6895,6895,511,31,1762,216,,0,,,,,145,41148,38188,300,0,,,,,45250,,,0,582246,12568,,,,,,0,582246,12568 +"2020-06-14","OK",359,,0,,1116,1116,149,5,,67,242587,4221,,,242587,,,8231,8231,158,0,974,,,,9456,6578,,0,250818,4379,27415,,,,,0,252624,4533 +"2020-06-14","OR",174,,1,,875,875,133,0,,47,164944,4132,,,236699,,15,5535,,158,0,,,,,13842,2396,,0,250541,6302,,,,,166019,0,250541,6302 +"2020-06-14","PA",6215,,4,,,,852,0,,,504435,7846,,,,,189,78798,76567,336,0,,,,,,58310,685891,10517,685891,10517,,,,,581002,8176,,0 +"2020-06-14","PR",147,57,1,90,,,110,0,,6,113280,0,,,112331,,2,1471,1471,11,0,4340,,,,2326,,,0,114751,11,,,,,,0,114723,0 +"2020-06-14","RI",833,,0,,1853,1853,141,0,,28,117593,884,,,184571,,17,16104,,32,0,,,,,22514,,208110,3130,208110,3130,,,,,133697,916,207085,1947 +"2020-06-14","SC",600,600,1,,1988,1988,521,0,,,229541,5590,28264,,229541,,,18795,18795,840,0,1444,,,,25555,8682,,0,248336,6430,29708,,,,,0,255096,6534 +"2020-06-14","SD",75,,0,,539,539,87,8,,,59421,741,,,,,,5898,,65,0,,,,,9184,4899,,0,73400,1413,,,,,65319,806,73400,1413 +"2020-06-14","TN",475,454,3,21,2087,2087,588,14,,,,0,,,579620,,,30432,30255,891,0,,,,,35423,19896,,0,615043,13882,,,,,,0,615043,13882 +"2020-06-14","TX",1976,,19,,,,2287,0,,,,0,,,,,,87854,87854,1843,0,6062,187,,,126327,58341,,0,1595656,23965,146967,1391,,,,0,1595656,23965 +"2020-06-14","UT",139,,0,,1028,1028,178,16,302,,258435,3882,,,298286,134,,14313,,332,0,,5,,5,16616,8252,,0,314902,5291,,5,,5,273307,4208,314902,5291 +"2020-06-14","VA",1546,1438,5,108,5536,5536,958,25,,334,,0,,,,,155,54506,52103,637,0,3666,80,,,64446,,493715,9500,493715,9500,60293,174,,,,0,,0 +"2020-06-14","VI",6,,0,,,,,0,,,2305,21,,,,,,72,,0,0,,,,,,64,,0,2377,21,,,,,2363,0,,0 +"2020-06-14","VT",55,55,0,,,,26,0,,,48085,1049,,,,,,1125,1125,2,0,,,,,,909,,0,57427,1240,,,,,49210,1051,57427,1240 +"2020-06-14","WA",1213,1213,9,,3845,3845,350,28,,,,0,,,,,49,27242,27242,390,0,,,,,,,496902,4093,496902,4093,,,,,432619,3760,,0 +"2020-06-14","WI",692,692,1,,3049,3049,291,14,680,101,397366,8967,,,,,,25340,22758,251,0,,,,,,16558,505127,10010,505127,10010,,,,,420124,9207,,0 +"2020-06-14","WV",88,,0,,,,30,0,,8,,0,,,,,2,2289,2213,30,0,,,,,,1571,,0,129369,3732,7651,,,,,0,129369,3732 +"2020-06-14","WY",18,,0,,93,93,5,0,,,32005,0,,,33912,,,1060,841,10,0,,,,,1030,834,,0,34942,127,,,,,,0,34942,127 +"2020-06-13","AK",12,12,0,,56,56,12,1,,,,0,,,,,2,656,,26,0,,,,,,405,,0,71803,923,,,,,,0,71803,923 +"2020-06-13","AL",773,768,4,5,2241,2241,563,39,672,,268651,5976,,,,395,,24601,24221,891,0,,,,,,13508,,0,292872,6864,,,,,292872,6864,,0 +"2020-06-13","AR",176,,0,,979,979,203,18,,,175470,5895,,,,160,49,11547,11547,0,0,,,,,,7607,,0,187017,4372,,,,,,0,187017,4372 +"2020-06-13","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-13","AZ",1183,1116,39,67,4115,4115,1412,36,,447,293939,4078,,,,,309,34458,34146,1540,0,,,,,,,,0,460476,16337,,,128830,,328085,7269,460476,16337 +"2020-06-13","CA",4989,,46,,,,4411,0,,1313,,0,,,,,,145643,145643,3660,0,,,,,,,,0,2724393,62135,,,,,,0,2724393,62135 +"2020-06-13","CO",1598,1272,3,326,5244,5244,262,10,,,215626,7987,80748,,,,,29017,26408,195,0,5984,,,,,,285911,7385,285911,7385,86732,,,,242034,5573,,0 +"2020-06-13","CT",4186,3342,27,844,9912,9912,233,0,,,,0,,,306308,,,44994,43078,305,0,,,,,55208,7611,,0,362824,6507,,,,,,0,362824,6507 +"2020-06-13","DC",511,,5,,,,197,0,,78,,0,,,,,52,9709,,55,0,,,,,,1143,63036,1083,63036,1083,,,,,50032,1330,,0 +"2020-06-13","DE",495,437,1,58,,,93,0,,,69870,2349,,,,,,10229,9278,56,0,,,,,12677,6116,93481,2416,93481,2416,,,,,80099,2405,,0 +"2020-06-13","FL",3016,3016,49,,12155,12155,,169,,,1296861,31933,,171364,1510430,,,71149,,2476,0,,,7717,,99168,,1427556,35007,1427556,35007,,,179109,,1371401,34506,1612617,41395 +"2020-06-13","GA",2446,,28,,9224,9224,810,43,2029,,,0,,,,,,56801,56801,1018,0,6631,,,,51141,,,0,599211,13254,113405,,,,,0,599211,13254 +"2020-06-13","GU",5,,0,,,,,0,,,8358,15,,,8249,,,185,185,1,0,2,,,,174,168,,0,8543,16,110,,,,,0,8426,0 +"2020-06-13","HI",17,17,0,,87,87,,1,,,58632,745,,,,,,706,,14,0,,,,,659,627,67076,949,67076,949,,,,,59338,759,68738,1346 +"2020-06-13","IA",650,,7,,,,200,0,,76,195891,4684,,23752,,,43,23717,23717,380,0,,,2097,,,14326,,0,219608,5064,,,25876,,219976,5033,,0 +"2020-06-13","ID",87,67,1,20,265,265,24,0,98,5,59305,1175,,,,,,3353,3023,51,0,,,,,,2776,,0,62328,1214,,,,,62328,1214,,0 +"2020-06-13","IL",6470,6289,29,181,,,2117,0,,610,,0,,,,,352,132732,131871,673,0,,,,,,,,0,1168945,21844,,,,,,0,1168945,21844 +"2020-06-13","IN",2413,2231,17,182,6349,6349,871,0,1354,316,301094,5060,,,,,118,39543,,397,0,,,,,41037,,,0,444384,13135,,,,,340637,5457,444384,13135 +"2020-06-13","KS",243,,0,,973,973,,0,324,,118105,0,,,,143,,11047,,0,0,,,,,,,,0,129152,0,,,,,128939,0,,0 +"2020-06-13","KY",499,497,6,2,2433,2433,410,27,969,68,,0,,,,,,12445,12125,500,0,,,,,,3409,,0,294265,13479,28635,,,,,0,294265,13479 +"2020-06-13","LA",3004,2891,8,113,,,542,0,,,458100,23561,,,,,76,46283,46283,1288,0,,,,,,33904,,0,504383,24849,,,,,,0,504383,24849 +"2020-06-13","MA",7576,7420,38,156,10772,10772,1069,46,,249,598201,9901,,,,,162,105395,101070,336,0,,,,,132395,88725,,0,897556,6435,,,57048,,699271,10160,897556,6435 +"2020-06-13","MD",2926,2799,26,127,10053,10053,799,130,,321,347453,7971,,,,,,61305,61305,692,0,,,,,70320,4536,,0,478119,10555,,,,,408758,8663,478119,10555 +"2020-06-13","ME",100,100,0,,313,313,29,5,,10,,0,5323,,,,4,2757,2452,36,0,280,,,,3080,2152,,0,69618,1462,5611,,,,,0,69618,1462 +"2020-06-13","MI",6013,5768,23,245,,,636,0,,253,,0,,,733647,,139,65836,59801,164,0,,,,,81727,44964,,0,815374,13338,125950,,,,,0,815374,13338 +"2020-06-13","MN",1314,1283,9,31,3581,3581,390,24,1104,191,387245,9656,,,,,,30465,30465,2,0,,,,,,25620,417710,9658,417710,9658,,,,,,0,,0 +"2020-06-13","MO",879,,7,,,,595,0,,,253986,4436,,32313,252506,,69,15810,15810,225,0,,,1275,,17275,,,0,270232,0,,,33588,,269796,4661,270232,0 +"2020-06-13","MP",2,,0,,,,,0,,,7906,174,,,,,,30,30,0,0,,,,,,19,,0,7936,174,,,,,,0,7936,174 +"2020-06-13","MS",889,873,8,16,2644,2644,684,1,,160,194537,-865,,,,,103,19348,19216,257,0,,,,,,13356,,0,213885,-608,9442,,,,,0,213753,0 +"2020-06-13","MT",18,,0,,77,77,7,0,,,,0,,,,,,588,,15,0,,,,,,510,,0,58004,982,,,,,,0,58004,982 +"2020-06-13","NC",1104,1104,12,,,,823,0,,,,0,,,,,,42676,42676,1427,0,,,,,,,,0,584426,22126,,,,,,0,584426,22126 +"2020-06-13","ND",77,,0,,197,197,35,0,,,82815,1667,3860,,,,,3054,3054,42,0,126,,,,,2630,126897,3247,126897,3247,3986,,,,83675,1745,129748,3305 +"2020-06-13","NE",216,,4,,1067,1067,157,38,,,117864,3406,,,141410,,,16513,,198,0,,,,,19772,9610,,0,161666,3842,,,,,134536,3603,161666,3842 +"2020-06-13","NH",315,,7,,503,503,76,-1,149,,88705,1997,,,,,,5251,,42,0,,,,,,3843,,0,112141,2639,17720,,15236,,93956,2039,112141,2639 +"2020-06-13","NJ",14335,12589,103,1746,18707,18707,1395,100,,409,911610,22378,,,,,279,167171,166605,460,0,,,,,,,,0,1078781,22838,,,,,,0,1078215,22819 +"2020-06-13","NM",431,,5,,1625,1625,172,0,,,,0,,,,,,9621,,95,0,,,,,,4072,,0,258994,3710,,,,,,0,258994,3710 +"2020-06-13","NV",478,,3,,,,351,0,,81,193934,5165,,,,,43,10946,10946,270,0,,,,,,,249534,5188,249534,5188,,,,,204788,5432,235500,6227 +"2020-06-13","NY",24527,,32,,89995,89995,1734,0,,517,,0,,,,,360,382630,,916,0,,,,,,,2872240,70840,2872240,70840,,,,,,0,,0 +"2020-06-13","OH",2554,2324,46,230,6864,6864,516,50,1754,230,,0,,,,,152,40848,37893,424,0,,,,,44760,,,0,569678,11870,,,,,,0,569678,11870 +"2020-06-13","OK",359,,0,,1111,1111,154,8,,67,238366,0,,,238366,,,8073,8073,225,0,974,,,,9456,6495,,0,246439,225,27415,,,,,0,248091,0 +"2020-06-13","OR",173,,2,,875,875,133,11,,47,160812,4245,,,230670,,15,5377,,140,0,,,,,13569,2370,,0,244239,6880,,,,,166019,4376,244239,6880 +"2020-06-13","PA",6211,,49,,,,875,0,,,496589,8204,,,,,192,78462,76237,463,0,,,,,,58061,675374,11698,675374,11698,,,,,572826,8641,,0 +"2020-06-13","PR",146,56,0,90,,,117,0,,4,113280,0,,,112331,,3,1460,1460,17,0,4230,,,,2326,,,0,114740,17,,,,,,0,114723,0 +"2020-06-13","RI",833,,0,,1853,1853,141,0,,28,116709,1226,,,182700,,17,16072,,49,0,,,,,22438,,204980,4805,204980,4805,,,,,132781,1275,205138,2844 +"2020-06-13","SC",599,599,6,,1988,1988,523,0,,,223951,5062,27599,,223951,,,17955,17955,785,0,1424,,,,24611,8682,,0,241906,5847,29023,,,,,0,248562,6019 +"2020-06-13","SD",75,,1,,531,531,85,6,,,58680,1417,,,,,,5833,,91,0,,,,,9096,4828,,0,71987,1405,,,,,64513,1508,71987,1405 +"2020-06-13","TN",472,451,4,21,2073,2073,583,24,,,,0,,,566752,,,29541,29340,415,0,,,,,34409,19731,,0,601161,6201,,,,,,0,601161,6201 +"2020-06-13","TX",1957,,18,,,,2242,0,,,,0,,,,,,86011,86011,2331,0,5963,148,,,122603,56535,,0,1571691,40707,144050,1205,,,,0,1571691,40707 +"2020-06-13","UT",139,,0,,1012,1012,236,24,300,,254553,4513,,,293348,132,,13981,,404,0,,5,,5,16263,8114,,0,309611,6411,,5,,5,269099,4926,309611,6411 +"2020-06-13","VA",1541,1435,7,106,5511,5511,959,66,,295,,0,,,,,142,53869,51499,658,0,3588,75,,,63856,,484215,10561,484215,10561,58767,169,,,,0,,0 +"2020-06-13","VI",6,,0,,,,,0,,,2284,63,,,,,,72,,0,0,,,,,,64,,0,2356,63,,,,,2363,64,,0 +"2020-06-13","VT",55,55,0,,,,11,0,,,47036,1287,,,,,,1123,1123,5,0,,,,,,908,,0,56187,1560,,,,,48159,1292,56187,1560 +"2020-06-13","WA",1204,1204,10,,3817,3817,372,45,,,,0,,,,,43,26852,26852,400,0,,,,,,,492809,6423,492809,6423,,,,,428859,6089,,0 +"2020-06-13","WI",691,691,2,,3035,3035,285,32,677,99,388399,11037,,,,,,25089,22518,294,0,,,,,,16231,495117,13427,495117,13427,,,,,410917,11309,,0 +"2020-06-13","WV",88,,2,,,,29,0,,9,,0,,,,,2,2259,2183,26,0,,,,,,1568,,0,125637,3084,7485,,,,,0,125637,3084 +"2020-06-13","WY",18,,0,,93,93,5,1,,,32005,1132,,,33788,,,1050,832,23,0,,,,,1027,833,,0,34815,165,,,,,,0,34815,165 +"2020-06-12","AK",12,12,1,,55,55,15,1,,,,0,,,,,3,630,,14,0,,,,,,403,,0,70880,1869,,,,,,0,70880,1869 +"2020-06-12","AL",769,764,14,5,2202,2202,624,37,658,,262675,6694,,,,384,,23710,23333,865,0,,,,,,13508,,0,286008,7553,,,,,286008,7553,,0 +"2020-06-12","AR",176,,5,,961,961,203,36,,,169575,3726,,,,157,49,11547,11547,731,0,,,,,,7607,,0,182645,6428,,,,,,0,182645,6428 +"2020-06-12","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-12","AZ",1144,1060,17,67,4079,4079,1336,38,,429,289861,11543,,,,,278,32918,30955,1654,0,,,,,,,,0,444139,15088,,,122070,,320816,11543,444139,15088 +"2020-06-12","CA",4943,,62,,,,4480,0,,1310,,0,,,,,,141983,141983,2702,0,,,,,,,,0,2662258,64611,,,,,,0,2662258,64611 +"2020-06-12","CO",1595,1268,12,327,5234,5234,274,177,,,207639,1916,79135,,,,,28822,26215,175,0,5892,,,,,,278526,5596,278526,5596,85027,,,,236461,4698,,0 +"2020-06-12","CT",4159,3321,13,838,9912,9912,244,0,,,,0,,,299978,,,44689,42788,228,0,,,,,55046,7611,,0,356317,7263,,,,,,0,356317,7263 +"2020-06-12","DC",506,,4,,,,212,0,,82,,0,,,,,57,9654,,65,0,,,,,,1143,61953,2665,61953,2665,,,,,48702,906,,0 +"2020-06-12","DE",494,436,0,58,,,100,0,,,67521,3594,,,,,,10173,9222,67,0,,,,,12592,6062,91065,1619,91065,1619,,,,,77694,3661,,0 +"2020-06-12","FL",2967,2967,29,,11986,11986,,136,,,1264928,27249,,171364,1472224,,,68673,,1634,0,,,7717,,96007,,1392549,30492,1392549,30492,,,179109,,1336895,29167,1571222,35397 +"2020-06-12","GA",2418,,43,,9181,9181,836,108,2021,,,0,,,,,,55783,55783,810,0,6504,,,,50189,,,0,585957,7493,110825,,,,,0,585957,7493 +"2020-06-12","GU",5,,0,,,,,0,,,8343,146,,,8249,,,184,174,1,0,2,,,,174,168,,0,8527,147,110,,,,,0,8426,60 +"2020-06-12","HI",17,17,0,,86,86,,1,,,57887,1277,,,,,,692,,7,0,,,,,655,623,66127,1464,66127,1464,,,,,58579,1284,67392,1540 +"2020-06-12","IA",643,,4,,,,225,0,,81,191207,5606,,23575,,,47,23337,23337,399,0,,,2095,,,14227,,0,214544,6005,,,25697,,214943,6404,,0 +"2020-06-12","ID",86,66,1,20,265,265,20,3,98,5,58130,1275,,,,,,3302,2984,42,0,,,,,,2684,,0,61114,1312,,,,,61114,1312,,0 +"2020-06-12","IL",6441,6260,78,181,,,2209,0,,648,,0,,,,,375,132059,131198,732,0,,,,,,,,0,1147101,24774,,,,,,-1122327,1147101,24774 +"2020-06-12","IN",2396,2214,16,182,6349,6349,906,35,1354,329,296034,7440,,,,,116,39146,,398,0,,,,,40598,,,0,431249,12072,,,,,335180,7838,431249,12072 +"2020-06-12","KS",243,,3,,973,973,,19,324,,118105,5175,,,,143,,11047,,235,0,,,,,,,,0,129152,5410,,,,,128939,128939,,0 +"2020-06-12","KY",493,491,0,2,2406,2406,514,0,967,81,,0,,,,,,11945,11637,0,0,,,,,,3379,,0,280786,0,28319,,,,,0,280786,0 +"2020-06-12","LA",2996,2883,9,113,,,549,0,,,434539,9338,,,,,74,44995,44995,523,0,,,,,,33904,,0,479534,9861,,,,,,0,479534,9861 +"2020-06-12","MA",7538,7382,46,156,10726,10726,1143,72,,276,588300,9879,,,,,170,105059,100811,392,0,,,,,132202,88725,,0,891121,13004,,,55784,,689111,10186,891121,13004 +"2020-06-12","MD",2900,2773,25,127,9923,9923,836,134,,331,339482,7309,,,,,,60613,60613,416,0,,,,,69655,4474,,0,467564,9748,,,,,400095,7725,467564,9748 +"2020-06-12","ME",100,100,0,,308,308,32,0,,11,,0,5182,,,,5,2721,2420,54,0,274,,,,3026,2105,,0,68156,1419,5464,,,,,0,68156,1419 +"2020-06-12","MI",5990,5745,5,245,,,636,0,,253,,0,,,720615,,139,65672,59621,223,0,,,,,81421,42041,,0,802036,15882,122843,,,,,0,802036,15882 +"2020-06-12","MN",1305,1274,25,31,3557,3557,403,35,1093,191,377589,12773,,,,,,30463,30463,45,0,,,,,,25028,408052,12818,408052,12818,,,,,,0,,0 +"2020-06-12","MO",872,,12,,,,593,0,,,249550,5900,,31220,252506,,69,15585,15585,195,0,,,1232,,17275,,,0,270232,0,,,32452,,265135,6095,270232,0 +"2020-06-12","MP",2,,0,,,,,0,,,7732,181,,,,,,30,30,0,0,,,,,,19,,0,7762,181,,,,,,0,7762,181 +"2020-06-12","MS",881,856,13,16,2643,2643,710,29,,172,195402,0,,,,,94,19091,18959,608,0,,,,,,13356,,0,214493,608,9442,,,,,0,213753,0 +"2020-06-12","MT",18,,0,,77,77,7,3,,,,0,,,,,,573,,10,0,,,,,,489,,0,57022,1245,,,,,,0,57022,1245 +"2020-06-12","NC",1092,1092,28,,,,760,0,,,,0,,,,,,41249,41249,1768,0,,,,,,,,0,562300,19471,,,,,,0,562300,19471 +"2020-06-12","ND",77,,0,,197,197,35,4,,,81148,1340,3692,,,,,3012,3012,36,0,124,,,,,2573,123650,3332,123650,3332,3816,,,,81930,1312,126443,3409 +"2020-06-12","NE",212,,17,,1029,1029,164,29,,,114458,2821,,,137852,,,16315,,290,0,,,,,19491,9229,,0,157824,4137,,,,,130933,3103,157824,4137 +"2020-06-12","NH",308,,7,,504,504,73,4,149,,86708,1979,,,,,,5209,,31,0,,,,,,3665,,0,109502,3032,17282,,14884,,91917,2010,109502,3032 +"2020-06-12","NJ",14232,12489,49,1743,18607,18607,1480,115,,415,889232,24255,,,,,300,166711,166164,373,0,,,,,,,,0,1055943,24628,,,,,,0,1055396,24603 +"2020-06-12","NM",426,,6,,1625,1625,179,0,,,,0,,,,,,9526,,159,0,,,,,,3983,,0,255284,4404,,,,,,0,255284,4404 +"2020-06-12","NV",475,,0,,,,328,0,,77,188769,5914,,,,,36,10676,10676,277,0,,,,,,,244346,4759,244346,4759,,,,,199356,6186,229273,7487 +"2020-06-12","NY",24495,,53,,89995,89995,1898,0,,552,,0,,,,,387,381714,,822,0,,,,,,,2801400,72395,2801400,72395,,,,,,0,,0 +"2020-06-12","OH",2508,2280,18,228,6814,6814,547,61,1745,217,,0,,,,,144,40424,37519,420,0,,,,,44225,,,0,557808,13033,,,,,,0,557808,13033 +"2020-06-12","OK",359,,2,,1103,1103,154,11,,65,238366,4547,,,238366,,,7848,7848,222,0,974,,,,9156,6391,,0,246214,4769,27415,,,,,0,248091,4877 +"2020-06-12","OR",171,,2,,864,864,130,7,,39,156567,4869,,,224005,,19,5237,,177,0,,,,,13354,2350,,0,237359,6064,,,,,161643,5038,237359,6064 +"2020-06-12","PA",6162,,49,,,,899,0,,,488385,11946,,,,,202,77999,75800,66,0,,,,,,56939,663676,15287,663676,15287,,,,,564185,12627,,0 +"2020-06-12","PR",146,56,2,90,,,92,0,,7,113280,24595,,,112331,,4,1443,1443,40,0,4093,,,,2326,,,0,114723,24635,,,,,,0,114723,24678 +"2020-06-12","RI",833,,10,,1853,1853,141,11,,28,115483,2093,,,179958,,17,16023,,81,0,,,,,22336,,200175,3687,200175,3687,,,,,131506,2174,202294,4589 +"2020-06-12","SC",593,593,5,,1988,1988,512,90,,,218889,5273,26913,,218889,,,17170,17170,729,0,1385,,,,23654,8682,,0,236059,6002,28298,,,,,0,242543,6087 +"2020-06-12","SD",74,,1,,525,525,87,11,,,57263,1184,,,,,,5742,,77,0,,,,,8992,4755,,0,70582,1568,,,,,63005,1261,70582,1568 +"2020-06-12","TN",468,447,27,21,2049,2049,608,38,,,,0,,,561047,,,29126,28942,588,0,,,,,33913,19425,,0,594960,59864,,,,,,-528635,594960,59864 +"2020-06-12","TX",1939,,19,,,,2166,0,,,,0,,,,,,83680,83680,2097,0,5925,117,,,117638,55258,,0,1530984,42643,143174,963,,,,0,1530984,42643 +"2020-06-12","UT",139,,8,,988,988,197,20,294,,250040,3453,,,287384,130,,13577,,325,0,,5,,5,15816,7935,,0,303200,5184,,5,,5,264173,3793,303200,5184 +"2020-06-12","VA",1534,1426,14,108,5445,5445,1026,85,,297,,0,,,,,143,53211,50853,564,0,3493,74,,,63219,,473654,9966,473654,9966,57230,168,,,,0,,0 +"2020-06-12","VI",6,,0,,,,,0,,,2221,41,,,,,,72,,0,0,,,,,,64,,0,2293,41,,,,,2299,19,,0 +"2020-06-12","VT",55,55,0,,,,16,0,,,45749,1401,,,,,,1118,1118,10,0,,,,,,907,,0,54627,1705,,,,,46867,1411,54627,1705 +"2020-06-12","WA",1194,1194,4,,3772,3772,386,-1,,,,0,,,,,8,26452,26452,371,0,,,,,,,486386,9637,486386,9637,,,,,422770,9191,,0 +"2020-06-12","WI",689,689,7,,3003,3003,287,27,670,104,377362,11308,,,,,,24795,22246,354,0,,,,,,15783,481690,12959,481690,12959,,,,,399608,11628,,0 +"2020-06-12","WV",86,,1,,,,29,0,,9,,0,,,,,2,2233,2157,21,0,,,,,,1553,,0,122553,2859,7354,,,,,0,122553,2859 +"2020-06-12","WY",18,,0,,92,92,5,0,,,30873,264,,,33624,,,1027,811,18,0,,,,,1026,814,,0,34650,696,,,,,,0,34650,696 +"2020-06-11","AK",11,11,0,,54,54,18,1,,,,0,,,,,4,616,,18,0,,,,,,397,,0,69011,1291,,,,,,0,69011,1291 +"2020-06-11","AL",755,750,11,5,2165,2165,647,36,650,,255981,4913,,,,380,,22845,22474,856,0,,,,,,13508,,0,278455,5761,,,,,278455,5761,,0 +"2020-06-11","AR",171,,6,,925,925,187,24,,,165849,0,,,,150,45,10816,10816,448,0,,,,,,7351,,0,176217,0,,,,,,0,176217,0 +"2020-06-11","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-11","AZ",1127,1060,32,67,4041,4041,1291,41,,429,278318,8483,,,,,278,31264,30955,1412,0,,,,,,,,0,429051,15036,,,120054,,309273,9586,429051,15036 +"2020-06-11","CA",4881,,105,,,,4534,0,,1325,,0,,,,,,139281,139281,3090,0,,,,,,,,0,2597647,56849,,,,,,0,2597647,56849 +"2020-06-11","CO",1583,1258,10,325,5057,5057,279,22,,,205723,3877,77546,,,,,28647,26040,148,0,5799,,,,,,272930,5401,272930,5401,83345,,,,231763,4002,,0 +"2020-06-11","CT",4146,3308,26,838,9912,9912,246,243,,,,0,,,292985,,,44461,42557,114,0,,,,,54789,7611,,0,349054,9282,,,,,,0,349054,9282 +"2020-06-11","DC",502,,3,,,,238,0,,82,,0,,,,,53,9589,,52,0,,,,,,1143,59288,1096,59288,1096,,,,,47796,648,,0 +"2020-06-11","DE",494,436,1,58,,,109,0,,,63927,2238,,,,,,10106,9158,50,0,,,,,12525,6001,89446,1664,89446,1664,,,,,74033,2288,,0 +"2020-06-11","FL",2938,2938,49,,11850,11850,,229,,,1237679,26027,,148981,1439362,,,67039,,1669,0,,,6828,,93533,,1362057,27796,1362057,27796,,,155835,,1307728,27725,1535825,34772 +"2020-06-11","GA",2375,,46,,9073,9073,842,99,2006,,,0,,,,,,54973,54973,993,0,6381,,,,49603,,,0,578464,13243,108194,,,,,0,578464,13243 +"2020-06-11","GU",5,,0,,,,,0,,,8197,97,,,8191,,,183,175,1,0,2,,,,175,168,,0,8380,98,109,,,,,0,8366,290 +"2020-06-11","HI",17,17,0,,85,85,,1,,,56610,1119,,,,,,685,,3,0,,,,,649,622,64663,1508,64663,1508,,,,,57295,1122,65852,1351 +"2020-06-11","IA",639,,9,,,,242,0,,75,185601,5323,,22801,,,48,22938,22938,387,0,,,2070,,,13956,,0,208539,5710,,,24898,,208539,5710,,0 +"2020-06-11","ID",85,65,0,20,262,262,28,0,99,7,56855,1023,,,,,,3260,2947,40,0,,,,,,2628,,0,59802,1056,,,,,59802,1056,,0 +"2020-06-11","IL",6363,6185,90,178,,,2365,0,,638,,0,,,,,379,131327,130603,766,0,,,,,,,,0,1122327,22325,,,,,1122327,22325,1122327,22325 +"2020-06-11","IN",2380,2198,25,182,6314,6314,887,53,1345,331,288594,6837,,,,,118,38748,,411,0,,,,,40143,,,0,419177,10094,,,,,327342,7248,419177,10094 +"2020-06-11","KS",240,,0,,954,954,,0,316,,112930,0,,,,139,,10812,,0,0,,,,,,,,0,123742,0,,,,,,0,,0 +"2020-06-11","KY",493,491,9,2,2406,2406,514,10,967,81,,0,,,,,,11945,11637,62,0,,,,,,3379,,0,280786,6679,28319,,,,,0,280786,6679 +"2020-06-11","LA",2987,2874,19,113,,,553,0,,,425201,9111,,,,,77,44472,44472,442,0,,,,,,33904,,0,469673,9553,,,,,,0,469673,9553 +"2020-06-11","MA",7492,7337,38,155,10654,10654,1260,72,,296,578421,10487,,,,,181,104667,100504,511,0,,,,,131718,88725,,0,878117,13081,,,54574,,678925,10833,878117,13081 +"2020-06-11","MD",2875,2750,31,125,9789,9789,902,34,,358,332173,6996,,,,,,60197,60197,732,0,,,,,69087,4365,,0,457816,11547,,,,,392370,7728,457816,11547 +"2020-06-11","ME",100,100,0,,308,308,29,5,,12,,0,5071,,,,5,2667,2380,30,0,261,,,,2965,2062,,0,66737,1503,5340,,,,,0,66737,1503 +"2020-06-11","MI",5985,5738,33,247,,,661,0,,249,,0,,,705071,,150,65449,59496,267,0,,,,,81083,42041,,0,786154,14602,120796,,,,,0,786154,14602 +"2020-06-11","MN",1280,1249,13,31,3522,3522,411,40,1091,196,364816,13182,,,,,,30418,30418,219,0,,,,,,24870,395234,13401,395234,13401,,,,,,0,,0 +"2020-06-11","MO",860,,12,,,,537,0,,,243650,7208,,30275,252506,,59,15390,15390,203,0,,,1195,,17275,,,0,270232,0,,,31470,,259040,7411,270232,0 +"2020-06-11","MP",2,,0,,,,,0,,,7551,58,,,,,,30,30,0,0,,,,,,19,,0,7581,58,,,,,,0,7581,58 +"2020-06-11","MS",868,851,0,17,2614,2614,655,0,,160,195402,0,,,,,99,18483,18351,0,0,,,,,,13356,,0,213885,0,9442,,,,,0,213753,0 +"2020-06-11","MT",18,,0,,74,74,7,0,,,,0,,,,,,563,,2,0,,,,,,487,,0,55777,1161,,,,,,0,55777,1161 +"2020-06-11","NC",1064,1064,11,,,,812,0,,,,0,,,,,,39481,39481,1310,0,,,,,,,,0,542829,15356,,,,,,0,542829,15356 +"2020-06-11","ND",77,,1,,193,193,32,0,,,79808,1089,3583,,,,,2976,2976,38,0,121,,,,,2515,120318,3303,120318,3303,3704,,,,80618,1105,123034,3373 +"2020-06-11","NE",195,,4,,1000,1000,175,11,,,111637,2358,,,134062,,,16025,,142,0,,,,,19153,8946,,0,153687,3422,,,,,127830,2501,153687,3422 +"2020-06-11","NH",301,,7,,500,500,81,4,147,,84729,1214,,,,,,5178,,46,0,,,,,,3585,,0,106470,3235,16876,,14532,,89907,1260,106470,3235 +"2020-06-11","NJ",14183,12443,67,1740,18492,18492,1512,269,,445,864977,21389,,,,,319,166338,165816,486,0,,,,,,,,0,1031315,21875,,,,,,0,1030793,21859 +"2020-06-11","NM",420,,10,,1625,1625,183,42,,,,0,,,,,,9367,,117,0,,,,,,3380,,0,250880,5323,,,,,,0,250880,5323 +"2020-06-11","NV",475,,1,,,,337,0,,72,182855,5696,,,,,35,10399,10399,235,0,,,,,,,239587,6275,239587,6275,,,,,193170,5878,221786,6699 +"2020-06-11","NY",24442,,38,,89995,89995,2042,0,,581,,0,,,,,424,380892,,736,0,,,,,,,2729005,60839,2729005,60839,,,,,,0,,0 +"2020-06-11","OH",2490,2263,33,227,6753,6753,563,60,1732,225,,0,,,,,155,40004,37120,429,0,,,,,43721,,,0,544775,13184,,,,,,0,544775,13184 +"2020-06-11","OK",357,,2,,1092,1092,153,17,,58,233819,4002,,,233819,,,7626,7626,146,0,863,,,,9395,6263,,0,241445,4148,23402,,,,,0,243214,4209 +"2020-06-11","OR",169,,0,,857,857,136,6,,40,151698,3069,,,218130,,18,5060,,72,0,,,,,13165,2332,,0,231295,5314,,,,,156605,3135,231295,5314 +"2020-06-11","PA",6113,,51,,,,946,0,,,476439,9475,,,,,215,77933,75119,467,0,620,,,,,55665,648389,13450,648389,13450,,,,,551558,9910,,0 +"2020-06-11","PR",144,56,1,88,,,91,0,,7,88685,0,,,87930,,4,1403,1403,1,0,3949,,,,2060,,,0,90088,1,,,,,,0,90045,0 +"2020-06-11","RI",823,,11,,1842,1842,146,14,,26,113390,1438,,,175575,,16,15942,,87,0,,,,,22130,,196488,3179,196488,3179,,,,,129332,1525,197705,3568 +"2020-06-11","SC",588,588,13,,1898,1898,494,0,,,213616,-23157,26272,,213616,,,16441,16441,682,0,1337,,,,22760,7928,,0,230057,-22475,27609,,,,,0,236456,-24921 +"2020-06-11","SD",73,,4,,514,514,87,11,,,56079,998,,,,,,5665,,61,0,,,,,8908,4664,,0,69014,1825,,,,,61744,1059,69014,1825 +"2020-06-11","TN",441,441,5,,2011,2011,606,21,,,,0,,,506756,,,28538,28340,477,0,,,,,28340,18992,,0,535096,6461,,,,,528635,0,535096,6461 +"2020-06-11","TX",1920,,35,,,,2008,0,,,,0,,,,,,81583,81583,1826,0,5906,90,,,112525,54096,,0,1488341,40902,142573,758,,,,0,1488341,40902 +"2020-06-11","UT",131,,3,,968,968,188,14,282,,246587,3959,,,282600,123,,13252,,388,0,,3,,3,15416,7745,,0,298016,5409,,3,,3,260380,4323,298016,5409 +"2020-06-11","VA",1520,1413,6,107,5360,5360,1069,88,,273,,0,,,,,138,52647,50275,470,0,3385,72,,,62434,,463688,12100,463688,12100,55736,166,,,,0,,0 +"2020-06-11","VI",6,,0,,,,,0,,,2180,11,,,,,,72,,0,0,,,,,,64,,0,2252,11,,,,,2280,33,,0 +"2020-06-11","VT",55,55,0,,,,12,0,,,44348,1430,,,,,,1108,1108,16,0,,,,,,905,,0,52922,1674,,,,,45456,1446,52922,1674 +"2020-06-11","WA",1190,1190,14,,3773,3773,384,26,,,,0,,,,,63,26081,26081,409,0,,,,,,,476749,11970,476749,11970,,,,,413579,11209,,0 +"2020-06-11","WI",682,682,11,,2976,2976,306,33,660,101,366054,8942,,,,,,24441,21926,371,0,,,,,,15348,468731,14373,468731,14373,,,,,387980,9275,,0 +"2020-06-11","WV",85,,0,,,,38,0,,8,,0,,,,,2,2212,2136,24,0,,,,,,1516,,0,119694,3249,7173,,,,,0,119694,3249 +"2020-06-11","WY",18,,0,,92,92,7,0,,,30609,737,,,32948,,,1009,793,29,0,,,,,1006,814,,0,33954,781,,,,,,0,33954,781 +"2020-06-10","AK",11,11,0,,53,53,22,0,,,,0,,,,,3,598,,20,0,,,,,,392,,0,67720,830,,,,,,0,67720,830 +"2020-06-10","AL",744,739,15,5,2129,2129,646,42,646,,251068,4751,,,,378,,21989,21626,567,0,,,,,,13508,,0,272694,5306,,,,,272694,5306,,0 +"2020-06-10","AR",165,,4,,901,901,181,36,,,165849,10148,,,,147,49,10368,10368,288,0,,,,,,7116,,0,176217,5697,,,,,,0,176217,5697 +"2020-06-10","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-10","AZ",1095,,25,,4000,4000,1274,41,,413,269835,4918,,,,,273,29852,,1556,0,,,,,,,,0,414015,15112,,,117257,,299687,6474,414015,15112 +"2020-06-10","CA",4776,,79,,,,4719,0,,1326,,0,,,,,,136191,136191,2702,0,,,,,,,,0,2540798,54553,,,,,,0,2540798,54553 +"2020-06-10","CO",1573,1250,20,323,5035,5035,277,10,,,201846,4099,75842,,,,,28499,25915,152,0,5688,,,,,,267529,5172,267529,5172,81530,,,,227761,4227,,0 +"2020-06-10","CT",4120,3283,23,837,9669,9669,270,0,,,,0,,,284142,,,44347,42448,168,0,,,,,54383,7284,,0,339772,8404,,,,,,0,339772,8404 +"2020-06-10","DC",499,,4,,,,245,0,,79,,0,,,,,60,9537,,63,0,,,,,,1143,58192,1040,58192,1040,,,,,47148,735,,0 +"2020-06-10","DE",493,435,1,58,,,108,0,,,61689,956,,,,,,10056,,36,0,,,,,12467,5939,87782,1984,87782,1984,,,,,71745,992,,0 +"2020-06-10","FL",2889,2889,38,,11621,11621,,161,,,1211652,19347,,148981,1406853,,,65370,,1242,0,,,6828,,91285,,1334261,21339,1334261,21339,,,155835,,1280003,20720,1501053,26453 +"2020-06-10","GA",2329,,44,,8974,8974,817,102,1991,,,0,,,,,,53980,53980,731,0,6232,,,,48721,,,0,565221,13765,105491,,,,,0,565221,13765 +"2020-06-10","GU",5,,0,,,,,0,,,8100,304,,,7904,,,182,174,2,0,2,,,,172,164,,0,8282,306,109,,,,,0,8076,279 +"2020-06-10","HI",17,17,0,,84,84,,0,,,55491,693,,,,,,682,,6,0,,,,,644,621,63155,895,63155,895,,,,,56173,699,64501,968 +"2020-06-10","IA",630,,6,,,,245,0,,73,180278,4791,,22331,,,49,22551,22551,315,0,,,2048,,,13628,,0,202829,5106,,,24404,,202829,5106,,0 +"2020-06-10","ID",85,65,2,20,262,262,20,2,99,7,55832,1344,,,,,,3220,2914,31,0,,,,,,2554,,0,58746,1370,,,,,58746,1370,,0 +"2020-06-10","IL",6273,6095,77,178,,,2458,0,,706,,0,,,,,394,130561,129837,625,0,,,,,,,,0,1100002,20820,,,,,1100002,20820,1100002,20820 +"2020-06-10","IN",2355,2173,16,182,6261,6261,894,36,1334,307,281757,4400,,,,,113,38337,,304,0,,,,,39659,,,0,409083,8539,,,,,320094,4704,409083,8539 +"2020-06-10","KS",240,,4,,954,954,,18,316,,112930,4071,,,,139,,10812,,162,0,,,,,,,,0,123742,4233,,,,,,0,,0 +"2020-06-10","KY",484,482,7,2,2396,2396,508,10,966,68,,0,,,,,,11883,11576,175,0,,,,,,3375,,0,274107,14458,28240,,,,,0,274107,14458 +"2020-06-10","LA",2968,2855,11,113,,,549,0,,,416090,6034,,,,,72,44030,44030,418,0,,,,,,33904,,0,460120,6452,,,,,,0,460120,6452 +"2020-06-10","MA",7454,7300,46,154,10582,10582,1345,75,,319,567934,9831,,,,,200,104156,100158,267,0,,,,,131213,84621,,0,865036,13436,,,53040,,668092,10034,865036,13436 +"2020-06-10","MD",2844,2719,33,125,9755,9755,955,79,,379,325177,5999,,,,,,59465,59465,561,0,,,,,68174,4310,,0,446269,8496,,,,,384642,6560,446269,8496 +"2020-06-10","ME",100,100,0,,303,303,27,1,,10,,0,4980,,,,5,2637,2350,31,0,257,,,,2924,2023,,0,65234,1527,5245,,,,,0,65234,1527 +"2020-06-10","MI",5952,5708,1,244,,,661,0,,249,,0,,,690869,,150,65182,59278,15,0,,,,,80683,42041,,0,771552,0,116586,,,,,0,771552,0 +"2020-06-10","MN",1267,1236,39,31,3482,3482,427,41,1083,193,351634,11707,,,,,,30199,30199,333,0,,,,,,24675,381833,12040,381833,12040,,,,,,0,,0 +"2020-06-10","MO",848,,8,,,,533,0,,,236442,5660,,29718,252506,,59,15187,15187,274,0,,,1175,,17275,,,0,270232,0,,,30893,,251629,5934,270232,0 +"2020-06-10","MP",2,,0,,,,,0,,,7493,0,,,,,,30,30,0,0,,,,,,19,,0,7523,0,,,,,,0,7523,0 +"2020-06-10","MS",868,851,31,17,2614,2614,655,79,,160,195402,4958,,,,,99,18483,18351,715,0,,,,,,13356,,0,213885,5673,9442,,,,,0,213753,5664 +"2020-06-10","MT",18,,0,,74,74,7,2,,,,0,,,,,,561,,7,0,,,,,,487,,0,54616,1432,,,,,,0,54616,1432 +"2020-06-10","NC",1053,1053,24,,,,780,0,,,,0,,,,,,38171,38171,1011,0,,,,,,,,0,527473,15719,,,,,,0,527473,15719 +"2020-06-10","ND",76,,1,,193,193,33,4,,,78719,954,3478,,,,,2938,2938,40,0,118,,,,,2482,117015,2765,117015,2765,3596,,,,79513,927,119661,2834 +"2020-06-10","NE",191,,3,,989,989,181,22,,,109279,2339,,,130898,,,15883,,131,0,,,,,18900,8820,,0,150265,3438,,,,,125329,2479,150265,3438 +"2020-06-10","NH",294,,8,,496,496,80,4,146,,83515,1471,,,,,,5132,,53,0,,,,,,3501,,0,103235,1769,16498,,14232,,88647,1524,103235,1769 +"2020-06-10","NJ",14116,12377,76,1739,18223,18223,1701,154,,471,843588,18887,,,,,342,165852,165346,567,0,,,,,,,,0,1009440,19454,,,,,,0,1008934,19437 +"2020-06-10","NM",410,,6,,1583,1583,197,0,,,,0,,,,,,9250,,145,0,,,,,,3806,,0,245557,3900,,,,,,0,245557,3900 +"2020-06-10","NV",474,,2,,,,359,0,,70,177159,3600,,,,,38,10164,10164,134,0,,,,,,,233312,7074,233312,7074,,,,,187292,3778,215087,3930 +"2020-06-10","NY",24404,,56,,89995,89995,2190,0,,630,,0,,,,,462,380156,,674,0,,,,,,,2668166,62297,2668166,62297,,,,,,0,,0 +"2020-06-10","OH",2457,2231,36,226,6693,6693,575,73,1714,232,,0,,,,,159,39575,36710,413,0,,,,,43214,,,0,531591,9978,,,,,,0,531591,9978 +"2020-06-10","OK",355,,2,,1075,1075,150,14,,63,229817,3139,,,229817,,,7480,7480,117,0,863,,,,8624,6166,,0,237297,3256,23402,,,,,0,239005,3274 +"2020-06-10","OR",169,,5,,851,851,145,8,,47,148629,3672,,,212935,,20,4988,,66,0,,,,,13046,2313,,0,225981,5554,,,,,153470,3738,225981,5554 +"2020-06-10","PA",6062,,48,,,,992,0,,,466964,7716,,,,,218,77466,74684,410,0,620,,,,,54560,634939,11580,634939,11580,,,,,541648,8102,,0 +"2020-06-10","PR",143,63,1,80,,,97,0,,8,88685,0,,,87930,,5,1402,1402,16,0,3927,,,,2060,,,0,90087,16,,,,,,0,90045,0 +"2020-06-10","RI",812,,4,,1828,1828,148,13,,27,111952,1364,,,172200,,16,15855,,104,0,,,,,21937,,193309,2890,193309,2890,,,,,127807,1468,194137,3061 +"2020-06-10","SC",575,575,7,,1898,1898,513,0,,,236773,4019,,,236773,,,15759,15759,531,0,,,,,24604,7928,,0,252532,4550,,,,,,0,261377,4667 +"2020-06-10","SD",69,,1,,503,503,101,16,,,55081,1445,,,,,,5604,,81,0,,,,,8837,4573,,0,67189,1046,,,,,60685,1526,67189,1046 +"2020-06-10","TN",436,436,1,,1990,1990,624,16,,,,0,,,500766,,,28061,27869,486,0,,,,,27869,18516,,0,528635,7438,,,,,528635,7438,528635,7438 +"2020-06-10","TX",1885,,32,,,,2153,0,,,,0,,,,,,79757,79757,2504,0,5812,71,,,108133,52449,,0,1447439,34957,140962,618,,,,0,1447439,34957 +"2020-06-10","UT",128,,1,,954,954,223,23,276,,242628,4779,,,277586,116,,12864,,305,0,,,,,15021,7587,,0,292607,6399,,,,,256057,5195,292607,6399 +"2020-06-10","VA",1514,1408,18,106,5272,5272,1155,69,,296,,0,,,,,139,52177,49785,439,0,3282,71,,,61618,,451588,10867,451588,10867,53944,165,,,,0,,0 +"2020-06-10","VI",6,,0,,,,,0,,,2169,32,,,,,,72,,1,0,,,,,,64,,0,2241,33,,,,,2247,35,,0 +"2020-06-10","VT",55,55,0,,,,11,0,,,42918,1000,,,,,,1092,1092,11,0,,,,,,903,,0,51248,1219,,,,,44010,1011,51248,1219 +"2020-06-10","WA",1176,1176,15,,3747,3747,350,48,,,,0,,,,,92,25672,25672,510,0,,,,,,,464779,12421,464779,12421,,,,,402370,11555,,0 +"2020-06-10","WI",671,671,10,,2943,2943,328,39,654,114,357112,9902,,,,,,24070,21593,336,0,,,,,,14999,454358,11847,454358,11847,,,,,378705,10187,,0 +"2020-06-10","WV",85,,1,,,,24,0,,9,,0,,,,,5,2188,2114,19,0,,,,,,1485,,0,116445,3481,7006,,,,,0,116445,3481 +"2020-06-10","WY",18,,1,,92,92,8,1,,,29872,506,,,32183,,,980,768,10,0,,,,,990,804,,0,33173,687,,,,,,0,33173,687 +"2020-06-09","AK",11,11,1,,53,53,12,0,,,,0,,,,,1,578,,11,0,,,,,,389,,0,66890,978,,,,,,0,66890,978 +"2020-06-09","AL",729,725,11,4,2087,2087,628,33,631,,246317,7251,,,,375,,21422,21071,497,0,,,,,,11395,,0,267388,8156,,,,,267388,8156,,0 +"2020-06-09","AR",161,,6,,865,865,173,21,,,155701,4854,,,,144,44,10080,10080,340,0,,,,,,6875,,0,170520,10247,,,,,,0,170520,10247 +"2020-06-09","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-09","AZ",1070,,23,,3959,3959,1243,48,,438,264917,4514,,,,,264,28296,,618,0,,,,,,,,0,398903,14456,,,115961,,293213,5132,398903,14456 +"2020-06-09","CA",4697,,44,,,,4583,0,,1345,,0,,,,,,133489,133489,2170,0,,,,,,,,0,2486245,55055,,,,,,0,2486245,55055 +"2020-06-09","CO",1553,1233,10,320,5025,5025,305,166,,,197747,4043,74725,,,,,28347,25787,164,0,5616,,,,,,262357,4793,262357,4793,80341,,,,223534,4203,,0 +"2020-06-09","CT",4097,3266,13,831,9669,9669,293,0,,,,0,,,276052,,,44179,42182,87,0,,,,,54087,7284,,0,331368,8796,,,,,,0,331368,8796 +"2020-06-09","DC",495,,4,,,,255,0,,89,,0,,,,,59,9474,,85,0,,,,,,1143,57152,1386,57152,1386,,,,,46413,1051,,0 +"2020-06-09","DE",492,434,2,58,,,108,0,,,60733,758,,,,,,10020,,48,0,,,,,12395,5888,85798,1002,85798,1002,,,,,70753,806,,0 +"2020-06-09","FL",2851,2851,53,,11460,11460,,178,,,1192305,22659,,148981,1382146,,,64128,,1158,0,,,6828,,89566,,1312922,29175,1312922,29175,,,155835,,1259283,23770,1474600,29341 +"2020-06-09","GA",2285,,77,,8872,8872,834,126,1960,,,0,,,,,,53249,53249,752,0,6207,,,,47914,,,0,551456,7044,105160,,,,,0,551456,7044 +"2020-06-09","GU",5,,0,,,,,0,,,7796,246,,,7625,,,180,172,1,0,2,,,,172,163,,0,7976,247,109,,,,,0,7797,68 +"2020-06-09","HI",17,17,0,,84,84,,0,,,54798,326,,,,,,676,,1,0,,,,,638,618,62260,611,62260,611,,,,,55474,327,63533,274 +"2020-06-09","IA",624,,12,,,,255,0,,82,175487,3852,,21771,,,51,22236,22236,249,0,,,1994,,,13411,,0,197723,4101,,,23790,,197723,4101,,0 +"2020-06-09","ID",83,63,0,20,260,260,21,0,99,7,54488,1586,,,,,,3189,2888,50,0,,,,,,2509,,0,57376,1634,,,,,57376,1634,,0 +"2020-06-09","IL",6196,6018,94,178,,,2573,0,,726,,0,,,,,437,129936,129212,797,0,,,,,,,,0,1079182,20309,,,,,1079182,20309,1079182,20309 +"2020-06-09","IN",2339,2158,23,181,6225,6225,853,46,1330,307,277357,5477,,,,,113,38033,,410,0,,,,,39180,,,0,400544,11680,,,,,315390,5887,400544,11680 +"2020-06-09","KS",236,,0,,936,936,,0,311,,108859,0,,,,136,,10650,,0,0,,,,,,,,0,119509,0,,,,,,0,,0 +"2020-06-09","KY",477,475,5,2,2386,2386,525,18,966,75,,0,,,,,,11708,11419,232,0,,,,,,3365,,0,259649,7056,27948,,,,,0,259649,7056 +"2020-06-09","LA",2957,2844,13,113,,,568,0,,,410056,10504,,,,,67,43612,43612,562,0,,,,,,33904,,0,453668,11066,,,,,,0,453668,11066 +"2020-06-09","MA",7408,7255,55,153,10507,10507,1397,82,,315,558103,4460,,,,,202,103889,99955,263,0,,,,,130653,84621,,0,851600,14355,,,52144,,658058,4660,851600,14355 +"2020-06-09","MD",2811,2686,35,125,9676,9676,970,47,,386,319178,6079,,,,,,58904,58904,500,0,,,,,67562,4279,,0,437773,8118,,,,,378082,6579,437773,8118 +"2020-06-09","ME",100,100,1,,302,302,29,1,,10,,0,4803,,,,7,2606,2322,18,0,255,,,,2878,1992,,0,63707,781,5066,,,,,0,63707,781 +"2020-06-09","MI",5951,5708,9,244,,,661,0,,249,,0,,,690869,,150,65167,59265,63,0,,,,,80683,42041,,0,771552,17144,116586,,,,,0,771552,17144 +"2020-06-09","MN",1228,1217,20,11,3441,3441,455,40,1068,199,339927,8451,,,,,,29866,29866,430,0,,,,,,24221,369793,8881,369793,8881,,,,,,0,,0 +"2020-06-09","MO",840,,21,,,,533,0,,,230782,4055,,28977,252506,,59,14913,14913,179,0,,,1159,,17275,,,0,270232,0,,,30136,,245695,4234,270232,0 +"2020-06-09","MP",2,,0,,,,,0,,,7493,279,,,,,,30,30,2,0,,,,,,19,,0,7523,281,,,,,,0,7523,282 +"2020-06-09","MS",837,821,0,16,2535,2535,598,0,,142,190444,0,,,,,83,17768,17645,0,0,,,,,,13356,,0,208212,0,9140,,,,,0,208089,0 +"2020-06-09","MT",18,,0,,72,72,5,3,,,,0,,,,,,554,,6,0,,,,,,485,,0,53184,1592,,,,,,0,53184,1592 +"2020-06-09","NC",1029,1029,23,,,,774,0,,,,0,,,,,,37160,37160,676,0,,,,,,,,0,511754,9326,,,,,,0,511754,9326 +"2020-06-09","ND",75,,0,,189,189,32,5,,,77765,465,3381,,,,,2898,2898,22,0,115,,,,,2450,114250,1602,114250,1602,3496,,,,78586,573,116827,1621 +"2020-06-09","NE",188,,0,,967,967,176,32,,,106940,1167,,,127607,,,15752,,118,0,,,,,18758,8637,,0,146827,2519,,,,,122850,1281,146827,2519 +"2020-06-09","NH",286,,0,,492,492,78,3,145,,82044,1535,,,,,,5079,,36,0,,,,,,3392,,0,101466,1948,16100,,13920,,87123,1571,101466,1948 +"2020-06-09","NJ",14040,12303,93,1737,18069,18069,1736,19,,510,824701,14109,,,,,373,165285,164796,314,0,,,,,,,,0,989986,14423,,,,,,0,989497,14408 +"2020-06-09","NM",404,,4,,1583,1583,193,25,,,,0,,,,,,9105,,43,0,,,,,,3699,,0,241657,2856,,,,,,0,241657,2856 +"2020-06-09","NV",472,,3,,,,350,0,,86,173559,3342,,,,,41,10030,10030,244,0,,,,,,,226238,5492,226238,5492,,,,,183514,3511,211157,4643 +"2020-06-09","NY",24348,,49,,89995,89995,2344,0,,663,,0,,,,,485,379482,,683,0,,,,,,,2605869,49973,2605869,49973,,,,,,0,,0 +"2020-06-09","OH",2421,2196,17,225,6620,6620,639,70,1708,238,,0,,,,,153,39162,36355,325,0,,,,,42914,,,0,521613,8438,,,,,,0,521613,8438 +"2020-06-09","OK",353,,5,,1061,1061,148,22,,66,226678,12080,,,226678,,,7363,7363,158,0,863,,,,8491,6073,,0,234041,12238,23402,,,,,0,235731,12486 +"2020-06-09","OR",164,,0,,843,843,137,24,,43,144957,1365,,,207513,,18,4922,,114,0,,,,,12914,2237,,0,220427,4695,,,,,149732,1332,220427,4695 +"2020-06-09","PA",6014,,61,,,,1032,0,,,459248,7861,,,,,237,77056,74298,493,0,620,,,,,53670,623359,11087,623359,11087,,,,,533546,8332,,0 +"2020-06-09","PR",142,63,0,79,,,95,0,,9,88685,0,,,87930,,6,1386,1386,13,0,3799,,,,2060,,,0,90071,13,,,,,,0,90045,0 +"2020-06-09","RI",808,,9,,1815,1815,144,8,,31,110588,1164,,,169341,,19,15751,,68,0,,,,,21735,,190419,1966,190419,1966,,,,,126339,1232,191076,2752 +"2020-06-09","SC",568,568,11,,1898,1898,541,84,,,232754,2893,,,232754,,,15228,15228,428,0,,,,,23956,7928,,0,247982,3321,,,,,,0,256710,3448 +"2020-06-09","SD",68,,3,,487,487,90,5,,,53636,1288,,,,,,5523,,52,0,,,,,8753,4483,,0,66143,1223,,,,,59159,1340,66143,1223 +"2020-06-09","TN",435,435,14,,1974,1974,587,26,,,,0,,,493622,,,27575,27575,631,0,,,,,27575,18013,,0,521197,8434,,,,,521197,8434,521197,8434 +"2020-06-09","TX",1853,,23,,,,2056,0,,,,0,,,,,,77253,77253,1637,0,5710,50,,,104940,51140,,0,1412482,29928,138784,502,,,,0,1412482,29928 +"2020-06-09","UT",127,,3,,931,931,230,13,274,,237849,3906,,,271636,116,,12559,,237,0,,,,,14572,7391,,0,286208,5367,,,,,250862,4275,286208,5367 +"2020-06-09","VA",1496,1391,19,105,5203,5203,1169,60,,311,,0,,,,,155,51738,49362,487,0,3231,68,,,60931,,440721,8054,440721,8054,53053,162,,,,0,,0 +"2020-06-09","VI",6,,0,,,,,0,,,2137,9,,,,,,71,,0,0,,,,,,63,,0,2208,9,,,,,2212,10,,0 +"2020-06-09","VT",55,55,0,,,,16,0,,,41918,463,,,,,,1081,1081,8,0,,,,,,901,,0,50029,547,,,,,42999,471,50029,547 +"2020-06-09","WA",1161,1161,2,,3699,3699,372,30,,,,0,,,,,60,25162,25162,110,0,,,,,,,452358,11751,452358,11751,,,,,390815,9785,,0 +"2020-06-09","WI",661,661,15,,2904,2904,331,44,649,117,347210,13957,,,,,,23734,21308,300,0,,,,,,14583,442511,8078,442511,8078,,,,,368518,14227,,0 +"2020-06-09","WV",84,,0,,,,24,0,,9,,0,,,,,4,2169,2095,16,0,,,,,,1477,,0,112964,1947,6871,,,,,0,112964,1947 +"2020-06-09","WY",17,,0,,91,91,8,0,,,29366,352,,,31508,,,970,760,10,0,,,,,978,789,,0,32486,671,,,,,,0,32486,671 +"2020-06-08","AK",10,10,0,,53,53,7,0,,,,0,,,,,0,567,,18,0,,,,,,384,,0,65912,1008,,,,,,0,65912,1008 +"2020-06-08","AL",718,714,26,4,2054,2054,593,32,623,,239066,0,,,,371,,20925,20590,425,0,,,,,,11395,,0,259232,0,,,,,259232,0,,0 +"2020-06-08","AR",155,,1,,844,844,171,0,,,150847,0,,,,143,46,9740,9740,314,0,,,,,,6424,,0,160273,0,,,,,,0,160273,0 +"2020-06-08","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-08","AZ",1047,,3,,3911,3911,1266,64,,390,260403,5671,,,,,246,27678,,789,0,,,,,,,,0,384447,4814,,,114579,,288081,6460,384447,4814 +"2020-06-08","CA",4653,,27,,,,4506,0,,1301,,0,,,,,,131319,131319,2507,0,,,,,,,,0,2431190,68972,,,,,,0,2431190,68972 +"2020-06-08","CO",1543,1224,16,319,4859,4859,304,374,,,193704,4221,73240,,,,,28183,25627,182,0,5543,,,,,,257564,5261,257564,5261,78783,,,,219331,4391,,0 +"2020-06-08","CT",4084,3239,13,845,9669,9669,324,0,,,,0,,,267646,,,44092,42017,124,0,,,,,53713,7284,,0,322572,2422,,,,,,0,322572,2422 +"2020-06-08","DC",491,,2,,,,268,0,,102,,0,,,,,72,9389,,57,0,,,,,,1143,55766,1219,55766,1219,,,,,45362,877,,0 +"2020-06-08","DE",490,432,2,58,,,113,0,,,59975,920,,,,,,9972,,30,0,,,,,12321,5791,84796,1100,84796,1100,,,,,69947,950,,0 +"2020-06-08","FL",2798,2798,12,,11282,11282,,67,,,1169646,17426,,118053,1354303,,,62970,,1029,0,,,5474,,88102,,1283747,24940,1283747,24940,,,123552,,1235513,18408,1445259,22912 +"2020-06-08","GA",2208,,28,,8746,8746,819,61,1925,,,0,,,,,,52497,52497,599,0,6203,,,,47433,,,0,544412,9516,105013,,,,,0,544412,9516 +"2020-06-08","GU",5,,0,,,,,0,,,7550,266,,,7550,,,179,171,0,0,2,,,,171,163,,0,7729,266,109,,,,,0,7729,613 +"2020-06-08","HI",17,17,0,,84,84,,1,,,54472,1090,,,,,,675,,2,0,,,,,637,617,61649,945,61649,945,,,,,55147,55147,63259,1254 +"2020-06-08","IA",612,,8,,,,265,0,,85,171635,5110,,21153,,,53,21987,21987,320,0,,,1972,,,13028,,0,193622,5430,,,23143,,193622,5430,,0 +"2020-06-08","ID",83,63,0,20,260,260,23,0,99,8,52902,0,,,,,,3139,2840,0,0,,,,,,2461,,0,55742,0,,,,,55742,0,,0 +"2020-06-08","IL",6102,5924,198,178,,,2496,0,,713,,0,,,,,443,129139,128415,1382,0,,,,,,,,0,1058873,16099,,,,,1058873,16099,1058873,16099 +"2020-06-08","IN",2316,2135,13,181,6179,6179,902,43,1325,346,271880,5014,,,,,130,37623,,226,0,,,,,38475,,,0,388864,2365,,,,,309503,5240,388864,2365 +"2020-06-08","KS",236,,4,,936,936,,19,311,,108859,5599,,,,136,,10650,,257,0,,,,,,,,0,119509,5856,,,,,,0,,0 +"2020-06-08","KY",472,470,2,2,2368,2368,486,7,958,76,,0,,,,,,11476,11212,189,0,,,,,,3359,,0,252593,3787,32765,,,,,0,252593,3787 +"2020-06-08","LA",2944,2831,8,113,,,582,0,,,399552,8303,,,,,71,43050,43050,234,0,,,,,,33904,,0,442602,8537,,,,,,0,442602,8537 +"2020-06-08","MA",7353,7217,37,136,10425,10425,1415,32,,322,553643,4589,,,,,209,103626,99755,190,0,,,,,130010,84621,,0,837245,13946,,,51404,,653398,4782,837245,13946 +"2020-06-08","MD",2776,2653,27,123,9629,9629,979,83,,392,313099,6269,,,,,,58404,58404,431,0,,,,,66983,4240,,0,429655,8101,,,,,371503,6700,429655,8101 +"2020-06-08","ME",99,99,0,,301,301,37,3,,12,,0,4733,,,,7,2588,2305,18,0,254,,,,2856,1891,,0,62926,1171,4995,,,,,0,62926,1171 +"2020-06-08","MI",5942,5707,15,244,,,661,0,,249,,0,,,674060,,191,65104,59211,135,0,,,,,80348,42041,,0,754408,13040,114914,,,,,0,754408,13040 +"2020-06-08","MN",1208,1197,11,11,3401,3401,452,34,1052,198,331476,7323,,,,,,29436,29436,448,0,,,,,,23657,360912,7771,360912,7771,,,,,,0,,0 +"2020-06-08","MO",819,,10,,,,611,0,,,226727,4422,,27626,252506,,76,14734,14734,181,0,,,1084,,17275,,,0,270232,0,,,28745,,241461,4706,270232,0 +"2020-06-08","MP",2,,0,,,,,0,,,7214,0,,,,,,28,28,1,0,,,,,,19,,0,7242,1,,,,,,0,7241,0 +"2020-06-08","MS",837,821,20,16,2535,2535,598,13,,142,190444,4465,,,,,83,17768,17645,498,0,,,,,,13356,,0,208212,4963,9140,,,,,0,208089,4962 +"2020-06-08","MT",18,,0,,69,69,2,0,,,,0,,,,,,548,,3,0,,,,,,475,,0,51592,4214,,,,,,0,51592,4214 +"2020-06-08","NC",1006,1006,10,,,,739,0,,,,0,,,,,,36484,36484,938,0,,,,,,,,0,502428,12929,,,,,,0,502428,12929 +"2020-06-08","ND",75,,0,,184,184,29,1,,,77300,228,3316,,,,,2876,2876,19,0,112,,,,,2336,112648,1387,112648,1387,3428,,,,78013,281,115206,1414 +"2020-06-08","NE",188,,0,,935,935,166,7,,,105773,1547,,,125328,,,15634,,91,0,,,,,18528,8455,,0,144308,2188,,,,,121569,1643,144308,2188 +"2020-06-08","NH",286,,3,,489,489,86,2,145,,80509,1519,,,,,,5043,,24,0,,,,,,3392,,0,99518,2343,15836,,13920,,85552,1543,99518,2343 +"2020-06-08","NJ",13947,12214,39,1733,18050,18050,1740,0,,498,810592,14331,,,,,361,164971,164497,341,0,,,,,,,,0,975563,14672,,,,,,0,975089,14664 +"2020-06-08","NM",400,,4,,1558,1558,183,25,,,,0,,,,,,9062,,122,0,,,,,,3380,,0,238801,4426,,,,,,0,238801,4426 +"2020-06-08","NV",469,,4,,,,339,0,,74,170217,4169,,,,,44,9786,9786,137,0,,,,,,,220746,992,220746,992,,,,,180003,4351,206514,4906 +"2020-06-08","NY",24299,,40,,89995,89995,2371,0,,678,,0,,,,,507,378799,,702,0,,,,,,,2555896,58054,2555896,58054,,,,,,0,,0 +"2020-06-08","OH",2404,2177,27,227,6550,6550,644,53,1668,245,,0,,,,,158,38837,36077,361,0,,,,,42622,,,0,513175,11089,,,,,,0,513175,11089 +"2020-06-08","OK",348,,0,,1039,1039,158,13,,65,214598,0,,,214598,,,7205,7205,55,0,863,,,,8109,6014,,0,221803,55,23402,,,,,0,223245,0 +"2020-06-08","OR",164,,1,,819,819,121,0,,39,143592,2095,,,202952,,16,4808,,146,0,,,,,12780,2237,,0,215732,3942,,,,,148400,5282,215732,3942 +"2020-06-08","PA",5953,,10,,,,1174,0,,,451387,7214,,,,,268,76563,73827,351,0,620,,,,,53670,612272,9668,612272,9668,,,,,525214,7562,,0 +"2020-06-08","PR",142,63,0,79,,,107,0,,8,88685,0,,,87930,,7,1373,1373,9,0,3673,,,,2060,,,0,90058,9,,,,,,0,90045,0 +"2020-06-08","RI",799,,27,,1807,1807,146,32,,28,109424,884,,,166808,,20,15683,,45,0,,,,,21516,,188453,1687,188453,1687,,,,,125107,929,188324,1863 +"2020-06-08","SC",557,557,11,,1814,1814,507,0,,,229861,6288,,,229861,,,14800,14800,514,0,,,,,23401,7347,,0,244661,6802,,,,,,0,253262,6931 +"2020-06-08","SD",65,,0,,482,482,92,4,,,52348,726,,,,,,5471,,33,0,,,,,8718,4403,,0,64920,1679,,,,,57819,759,64920,1679 +"2020-06-08","TN",421,421,3,,1948,1948,617,16,,,,0,,,485819,,,26944,26944,563,0,,,,,26944,17563,,0,512763,13995,,,,,512763,21342,512763,13995 +"2020-06-08","TX",1830,,0,,,,1935,0,,,,0,,,,,,75616,75616,638,0,4767,47,,,102617,49758,,0,1382554,9999,118509,453,,,,0,1382554,9999 +"2020-06-08","UT",124,,3,,918,918,182,18,270,,233943,2618,,,266660,112,,12322,,256,0,,,,,14181,7255,,0,280841,3798,,,,,246587,2813,280841,3798 +"2020-06-08","VA",1477,1373,5,104,5143,5143,1173,37,,308,,0,,,,,160,51251,48879,570,0,3202,61,,,60282,,432667,8655,432667,8655,52772,155,,,,0,,0 +"2020-06-08","VI",6,,0,,,,,0,,,2128,3,,,,,,71,,0,0,,,,,,62,,0,2199,3,,,,,2202,1,,0 +"2020-06-08","VT",55,55,0,,,,13,0,,,41455,1392,,,,,,1073,1073,12,0,,,,,,895,,0,49482,1627,,,,,42528,1404,49482,1627 +"2020-06-08","WA",1159,1159,6,,3669,3669,350,17,,,,0,,,,,66,25052,25052,163,0,,,,,,,440607,10560,440607,10560,,,,,381030,8276,,0 +"2020-06-08","WI",646,646,-1,,2860,2860,322,12,637,110,333253,7386,,,,,,23434,21038,222,0,,,,,,14242,434433,8378,434433,8378,,,,,354291,7589,,0 +"2020-06-08","WV",84,,0,,,,24,0,,9,,0,,,,,4,2153,2083,9,0,,,,,,1468,,0,111017,505,6809,,,,,0,111017,505 +"2020-06-08","WY",17,,0,,91,91,7,1,,,29014,1210,,,30857,,,960,748,13,0,,,,,958,773,,0,31815,607,,,,,,0,31815,607 +"2020-06-07","AK",10,10,0,,53,53,7,0,,,,0,,,,,1,549,,8,0,,,,,,382,,0,64904,1003,,,,,,0,64904,1003 +"2020-06-07","AL",692,688,3,4,2022,2022,518,29,615,,239066,13465,,,,364,,20500,20166,457,0,,,,,,11395,,0,259232,13922,,,,,259232,13922,,0 +"2020-06-07","AR",154,,0,,844,844,145,6,,,150847,3191,,,,143,35,9426,9426,325,0,,,,,,6424,,0,160273,3516,,,,,,0,160273,3516 +"2020-06-07","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-07","AZ",1044,,2,,3847,3847,1252,70,,392,254732,8537,,,,,248,26889,,1438,0,,,,,,,,0,379633,6308,,,111625,,281621,9975,379633,6308 +"2020-06-07","CA",4626,,67,,,,4525,0,,1288,,0,,,,,,128812,128812,2796,0,,,,,,,,0,2362218,53918,,,,,,0,2362218,53918 +"2020-06-07","CO",1527,1209,0,318,4485,4485,322,5,,,189483,4317,72211,,,,,28001,25457,153,0,5482,,,,,,252303,5366,252303,5366,77693,,,,214940,4455,,0 +"2020-06-07","CT",4071,3229,16,842,9669,9669,333,0,,,,0,,,265311,,,43968,41895,150,0,,,,,53631,7284,,0,320150,3595,,,,,,0,320150,3595 +"2020-06-07","DC",489,,6,,,,285,0,,90,,0,,,,,73,9332,,63,0,,,,,,1143,54547,869,54547,869,,,,,44485,957,,0 +"2020-06-07","DE",488,430,3,58,,,103,0,,,59055,1265,,,,,,9942,,97,0,,,,,12235,5792,83696,907,83696,907,,,,,68997,1362,,0 +"2020-06-07","FL",2786,2786,13,,11215,11215,,52,,,1152220,40793,,118053,1332711,,,61941,,1392,0,,,5474,,86827,,1258807,50715,1258807,50715,,,123552,,1217105,41999,1422347,49414 +"2020-06-07","GA",2180,,6,,8685,8685,783,23,1909,,,0,,,,,,51898,51898,589,0,6084,,,,46813,,,0,534896,12007,102638,,,,,0,534896,12007 +"2020-06-07","GU",5,,0,,,,,0,,,7284,0,,,6945,,,179,171,0,0,2,,,,170,162,,0,7463,0,105,,,,,0,7116,0 +"2020-06-07","HI",17,17,0,,83,83,,0,,,53382,789,,,,,,673,,9,0,,,,,636,616,60704,1031,60704,1031,,,,,,0,62005,1020 +"2020-06-07","IA",604,,6,,,,269,0,,86,166525,3289,,20267,,,54,21667,21667,189,0,,,1952,,,12805,,0,188192,3478,,,22237,,188192,3478,,0 +"2020-06-07","ID",83,63,0,20,260,260,30,3,99,8,52902,774,,,,,,3139,2840,28,0,,,,,,2461,,0,55742,793,,,,,55742,793,,0 +"2020-06-07","IL",5904,5904,40,,,,2550,0,,720,,0,,,,,438,127757,127757,867,0,,,,,,,,0,1042774,20700,,,,,1042774,20700,1042774,20700 +"2020-06-07","IN",2303,2121,11,182,6136,6136,913,45,1317,335,266866,6333,,,,,133,37397,,400,0,,,,,38333,,,0,386499,4339,,,,,304263,6733,386499,4339 +"2020-06-07","KS",232,,0,,917,917,,0,306,,103260,0,,,,135,,10393,,0,0,,,,,,,,0,113653,0,,,,,,0,,0 +"2020-06-07","KY",470,468,0,2,2361,2361,495,0,958,75,,0,,,,,,11287,11031,0,0,,,,,,3344,,0,248806,0,32753,,,,,0,248806,0 +"2020-06-07","LA",2936,2825,11,111,,,575,0,,,391249,5666,,,,,74,42816,42816,330,0,,,,,,31728,,0,434065,5996,,,,,,0,434065,5996 +"2020-06-07","MA",7316,7179,27,137,10393,10393,1442,24,,335,549054,7547,,,,,221,103436,99562,304,0,,,,,129333,84621,,0,823299,4975,,,51146,,648616,7808,823299,4975 +"2020-06-07","MD",2749,2625,9,124,9546,9546,1003,95,,404,306830,6936,,,,,,57973,57973,491,0,,,,,66470,4240,,0,421554,9251,,,,,364803,7427,421554,9251 +"2020-06-07","ME",99,99,1,,298,298,34,2,,15,,0,4555,,,,7,2570,2295,46,0,247,,,,2837,1864,,0,61755,1523,4810,,,,,0,61755,1523 +"2020-06-07","MI",5927,5698,11,244,,,864,0,,315,,0,,,661256,,191,64969,59107,55,0,,,,,80112,42041,,0,741368,10531,113451,,,,,0,741368,10531 +"2020-06-07","MN",1197,1186,16,11,3367,3367,450,31,1044,199,324153,9409,,,,,,28988,28988,135,0,,,,,,22992,353141,9544,353141,9544,,,,,,0,,0 +"2020-06-07","MO",809,,0,,,,657,0,,,222305,6682,,28401,252506,,84,14553,14553,111,0,,,1117,,17275,,,0,270232,0,,,29518,,236755,6888,270232,0 +"2020-06-07","MP",2,,0,,,,,0,,,7214,545,,,,,,27,27,1,0,,,,,,19,,0,7241,546,,,,,,0,7241,546 +"2020-06-07","MS",817,801,14,16,2522,2522,585,47,,133,185979,9625,,,,,69,17270,17148,501,0,,,,,,11203,,0,203249,10126,9021,,,,,0,203127,10119 +"2020-06-07","MT",18,,0,,69,69,2,1,,,,0,,,,,,545,,5,0,,,,,,475,,0,47378,624,,,,,,0,47378,624 +"2020-06-07","NC",996,996,4,,,,696,0,,,,0,,,,,,35546,35546,921,0,,,,,,,,0,489499,15790,,,,,,0,489499,15790 +"2020-06-07","ND",75,,0,,183,183,28,1,,,77072,1008,3302,,,,,2857,2857,44,0,111,,,,,2307,111261,2247,111261,2247,3413,,,,77732,1048,113792,2315 +"2020-06-07","NE",188,,2,,928,928,167,9,,,104226,2058,,,123269,,,15543,,164,0,,,,,18406,8255,,0,142120,2788,,,,,119926,2226,142120,2788 +"2020-06-07","NH",283,,0,,487,487,84,0,145,,78990,0,,,,,,5019,,0,0,,,,,,3319,,0,97175,2131,15746,,13604,,84009,0,97175,2131 +"2020-06-07","NJ",13908,12176,71,1732,18050,18050,1882,27,,503,796261,17138,,,,,385,164630,164164,280,0,,,,,,,,0,960891,17418,,,,,,0,960425,17409 +"2020-06-07","NM",396,,4,,1533,1533,177,44,,,,0,,,,,,8940,,140,0,,,,,,3307,,0,234375,5228,,,,,,0,234375,5228 +"2020-06-07","NV",465,,2,,,,348,0,,80,166048,3737,,,,,44,9649,9649,189,0,,,,,,,219754,3060,219754,3060,,,,,175652,3898,201608,4632 +"2020-06-07","NY",24259,,47,,89995,89995,2427,0,,704,,0,,,,,534,378097,,781,0,,,,,,,2497842,60435,2497842,60435,,,,,,0,,0 +"2020-06-07","OH",2377,2155,7,222,6497,6497,603,37,1657,240,,0,,,,,167,38476,35731,365,0,,,,,42139,,,0,502086,11096,,,,,,0,502086,11096 +"2020-06-07","OK",348,,3,,1026,1026,158,0,,65,214598,0,,,214598,,,7150,7150,147,0,863,,,,8109,5981,,0,221748,147,23402,,,,,0,223245,0 +"2020-06-07","OR",163,,2,,819,819,121,0,,39,141497,2821,,,199274,,16,4662,,92,0,,,,,12516,2237,,0,211790,4625,,,,,143118,0,211790,4625 +"2020-06-07","PA",5943,,12,,,,1174,0,,,444173,9051,,,,,268,76212,73479,506,0,620,,,,,53670,602604,10643,602604,10643,,,,,517652,9551,,0 +"2020-06-07","PR",142,63,0,79,,,105,0,,6,88685,0,,,87930,,7,1364,1364,4,0,3621,,,,2060,,,0,90049,4,,,,,,0,90045,0 +"2020-06-07","RI",772,,0,,1775,1775,182,0,,37,108540,758,,,165060,,23,15638,,49,0,,,,,21401,,186766,2804,186766,2804,,,,,124178,807,186461,1658 +"2020-06-07","SC",546,546,1,,1814,1814,477,0,,,223573,4745,,,223573,,,14286,14286,370,0,,,,,22758,7347,,0,237859,5115,,,,,,0,246331,5243 +"2020-06-07","SD",65,,0,,478,478,87,4,,,51622,1531,,,,,,5438,,71,0,,,,,7041,4335,,0,63241,1876,,,,,57060,1602,63241,1876 +"2020-06-07","TN",418,418,1,,1932,1932,561,9,,,,0,,,472387,,,26381,26381,310,0,,,,,26381,17222,,0,498768,7347,,,,,491421,0,498768,7347 +"2020-06-07","TX",1830,,11,,,,1878,0,,,,0,,,,,,74978,74978,1425,0,4767,47,,,101818,49758,,0,1372555,15233,118509,425,,,,0,1372555,15233 +"2020-06-07","UT",121,,0,,900,900,207,10,269,,231325,3503,,,263074,111,,12066,,268,0,,,,,13969,7108,,0,277043,4837,,,,,243774,3799,277043,4837 +"2020-06-07","VA",1472,1369,12,103,5106,5106,1186,52,,316,,0,,,,,165,50681,48349,1284,0,3164,59,,,59668,,424012,9237,424012,9237,52312,153,,,,0,,0 +"2020-06-07","VI",6,,0,,,,,0,,,2125,0,,,,,,71,,0,0,,,,,,62,,0,2196,0,,,,,2201,1,,0 +"2020-06-07","VT",55,55,0,,,,14,0,,,40063,1535,,,,,,1061,1061,17,0,,,,,,890,,0,47855,1791,,,,,41124,1552,47855,1791 +"2020-06-07","WA",1153,1153,4,,3652,3652,446,13,,,,0,,,,,57,24889,24889,393,0,,,,,,,430047,3125,430047,3125,,,,,372754,2372,,0 +"2020-06-07","WI",647,647,2,,2848,2848,308,16,638,107,325867,11065,,,,,,23212,20835,275,0,,,,,,14047,426055,10119,426055,10119,,,,,346702,11329,,0 +"2020-06-07","WV",84,,0,,,,28,0,,9,,0,,,,,4,2144,2075,13,0,,,,,,1451,,0,110512,2085,6776,,,,,0,110512,2085 +"2020-06-07","WY",17,,0,,90,90,4,0,,,27804,235,,,30277,,,947,734,8,0,,,,,931,757,,0,31208,98,,,,,,0,31208,98 +"2020-06-06","AK",10,10,0,,53,53,7,0,,,,0,,,,,1,541,,12,0,,,,,,382,,0,63901,2911,,,,,,0,63901,2911 +"2020-06-06","AL",689,685,13,4,1993,1993,473,44,612,,225601,5515,,,,363,,20043,19709,656,0,,,,,,11395,,0,245310,6151,,,,,245310,6151,,0 +"2020-06-06","AR",154,,2,,838,838,154,46,,,147656,8696,,,,142,36,9101,9101,450,0,,,,,,6266,,0,156757,5782,,,,,,0,156757,5782 +"2020-06-06","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-06","AZ",1042,,30,,3777,3777,1278,65,,391,246195,6662,,,,,292,25451,,1119,0,,,,,,,,0,373325,13828,,,109266,,271646,7781,373325,13828 +"2020-06-06","CA",4559,,74,,,,4526,0,,1315,,0,,,,,,126016,126016,3115,0,,,,,,,,0,2308300,69837,,,,,,0,2308300,69837 +"2020-06-06","CO",1527,1209,3,318,4480,4480,299,8,,,185166,4504,70728,,,,,27848,25319,233,0,5372,,,,,,246937,5690,246937,5690,76100,,,,210485,4724,,0 +"2020-06-06","CT",4055,3218,17,837,9669,9669,333,0,,,,0,,,261844,,,43818,41743,358,0,,,,,53510,7284,,0,316555,8040,,,,,,0,316555,8040 +"2020-06-06","DC",483,,8,,,,276,0,,100,,0,,,,,68,9269,,70,0,,,,,,1138,53678,1817,53678,1817,,,,,43528,1728,,0 +"2020-06-06","DE",485,427,0,58,,,117,0,,,57790,834,,,,,,9845,,72,0,,,,,12146,5696,82789,1897,82789,1897,,,,,67635,906,,0 +"2020-06-06","FL",2773,2773,28,,11163,11163,,97,,,1111427,37975,,118053,1284797,,,60549,,1244,0,,,5474,,85372,,1208092,35848,1208092,35848,,,123552,,1175106,39241,1372933,45669 +"2020-06-06","GA",2174,,0,,8662,8662,788,16,1901,,,0,,,,,,51309,51309,688,0,5903,,,,46057,,,0,522889,15070,99894,,,,,0,522889,15070 +"2020-06-06","GU",5,,0,,,,,0,,,7284,89,,,6945,,,179,171,0,0,2,,,,170,162,,0,7463,89,105,,,,,0,7116,0 +"2020-06-06","HI",17,17,0,,83,83,,0,,,52593,912,,,,,,664,,9,0,,,,,626,614,59673,1137,59673,1137,,,,,,0,60985,1143 +"2020-06-06","IA",598,,6,,,,299,0,,102,163236,3725,,19464,,,62,21478,21478,326,0,,,1934,,,12715,,0,184714,4051,,,21415,,184714,4051,,0 +"2020-06-06","ID",83,63,0,20,257,257,21,2,98,8,52128,1558,,,,,,3111,2821,57,0,,,,,,2408,,0,54949,1616,,,,,54949,1616,,0 +"2020-06-06","IL",5864,5864,69,,,,2702,0,,770,,0,,,,,476,126890,126890,975,0,,,,,,,,0,1022074,21155,,,,,1022074,21155,1022074,21155 +"2020-06-06","IN",2292,2110,34,182,6091,6091,926,38,1304,344,260533,5473,,,,,133,36997,,419,0,,,,,38172,,,0,382160,9507,,,,,297530,5892,382160,9507 +"2020-06-06","KS",232,,0,,917,917,,0,306,,103260,0,,,,135,,10393,,0,0,,,,,,,,0,113653,0,,,,,,0,,0 +"2020-06-06","KY",470,468,4,2,2361,2361,495,16,958,75,,0,,,,,,11287,11031,310,0,,,,,,3344,,0,248806,6632,32753,,,,,0,248806,6632 +"2020-06-06","LA",2925,2814,13,111,,,582,0,,,385583,6786,,,,,77,42486,42486,497,0,,,,,,31728,,0,428069,7283,,,,,,0,428069,7283 +"2020-06-06","MA",7289,7152,54,137,10369,10369,1529,66,,359,541507,9295,,,,,238,103132,99301,575,0,,,,,129081,84621,,0,818324,6265,,,50575,,640808,9800,818324,6265 +"2020-06-06","MD",2740,2616,38,124,9451,9451,1059,105,,418,299894,8938,,,,,,57482,57482,712,0,,,,,65856,4175,,0,412303,12490,,,,,357376,9650,412303,12490 +"2020-06-06","ME",98,98,0,,296,296,35,3,,14,,0,4555,,,,7,2524,2253,42,0,247,,,,2779,1845,,0,60232,1407,4810,,,,,0,60232,1407 +"2020-06-06","MI",5916,5683,7,244,,,864,0,,315,,0,,,650942,,191,64914,59073,93,0,,,,,79895,42041,,0,730837,10749,111125,,,,,0,730837,10749 +"2020-06-06","MN",1181,1170,22,11,3336,3336,473,47,1044,206,314744,10247,,,,,,28853,28853,165,0,,,,,,22253,343597,10412,343597,10412,,,,,,0,,0 +"2020-06-06","MO",809,,10,,,,666,0,,,215623,5334,,27396,252506,,79,14442,14442,189,0,,,1084,,17275,,,0,270232,15242,,,28480,,229867,5325,270232,15242 +"2020-06-06","MP",2,,0,,,,,0,,,6669,0,,,,,,26,26,0,0,,,,,,16,,0,6695,0,,,,,,0,6695,0 +"2020-06-06","MS",803,787,0,16,2475,2475,604,0,,149,176354,0,,,,,84,16769,16654,10,0,,,,,,11203,,0,193123,10,8662,,,,,0,193008,0 +"2020-06-06","MT",18,,0,,68,68,1,0,,,,0,,,,,,540,,-1,0,,,,,,472,,0,46754,866,,,,,,0,46754,866 +"2020-06-06","NC",992,992,26,,,,708,0,,,,0,,,,,,34625,34625,1370,0,,,,,,,,0,473709,12921,,,,,,0,473709,12921 +"2020-06-06","ND",75,,1,,182,182,29,2,,,76064,1953,3176,,,,,2813,2813,71,0,111,,,,,2268,109014,3920,109014,3920,3287,,,,76684,1891,111477,4026 +"2020-06-06","NE",186,,0,,919,919,181,14,,,102168,2463,,,120749,,,15379,,262,0,,,,,18143,7957,,0,139332,2692,,,,,117700,2726,139332,2692 +"2020-06-06","NH",283,,10,,487,487,84,15,145,,78990,4101,,,,,,5019,,143,0,,,,,,3319,,0,95044,2736,15407,,13604,,84009,4244,95044,2736 +"2020-06-06","NJ",13837,12106,58,1731,18023,18023,1933,143,,539,779123,23568,,,,,410,164350,163893,576,0,,,,,,,,0,943473,24144,,,,,,0,943016,24125 +"2020-06-06","NM",392,,5,,1489,1489,176,0,,,,0,,,,,,8800,,128,0,,,,,,3286,,0,229147,4507,,,,,,0,229147,4507 +"2020-06-06","NV",463,,3,,,,348,0,,80,162311,5470,,,,,44,9460,9460,194,0,,,,,,,216694,5546,216694,5546,,,,,171754,5752,196976,5851 +"2020-06-06","NY",24212,,37,,89995,89995,2603,0,,720,,0,,,,,554,377316,,1108,0,,,,,,,2437407,77895,2437407,77895,,,,,,0,,0 +"2020-06-06","OH",2370,2148,15,222,6460,6460,628,75,1650,256,,0,,,,,155,38111,35408,353,0,,,,,41708,,,0,490990,13239,,,,,,0,490990,13239 +"2020-06-06","OK",345,,1,,1026,1026,158,12,,65,214598,5034,,,214598,,,7003,7003,96,0,863,,,,8109,5867,,0,221601,5130,23402,,,,,0,223245,5235 +"2020-06-06","OR",161,,2,,819,819,121,7,,39,138676,3838,,,194837,,16,4570,,96,0,,,,,12328,2214,,0,207165,5959,,,,,143118,3930,207165,5959 +"2020-06-06","PA",5931,,45,,,,1174,0,,,435122,10921,,,,,268,75706,72979,701,0,620,,,,,52560,591961,15943,591961,15943,,,,,508101,11608,,0 +"2020-06-06","PR",142,63,1,79,,,100,0,,7,88685,28263,,,87930,,4,1360,1360,30,0,3555,,,,2060,,,0,90045,28293,,,,,,0,90045,28343 +"2020-06-06","RI",772,,0,,1775,1775,182,0,,37,107782,1126,,,163479,,23,15589,,68,0,,,,,21324,,183962,3727,183962,3727,,,,,123371,1194,184803,2803 +"2020-06-06","SC",545,545,7,,1814,1814,453,0,,,218828,982,,,218828,,,13916,13916,463,0,,,,,22260,7347,,0,232744,1445,,,,,,0,241088,2280 +"2020-06-06","SD",65,,0,,474,474,93,7,,,50091,2005,,,,,,5367,,90,0,,,,,6965,4273,,0,61365,1598,,,,,55458,2095,61365,1598 +"2020-06-06","TN",417,417,9,,1923,1923,535,30,,,,0,,,465350,,,26071,26071,551,0,,,,,26071,17124,,0,491421,9249,,,,,491421,9249,491421,9249 +"2020-06-06","TX",1819,,31,,,,1822,0,,,,0,,,,,,73553,73553,1940,0,4659,43,,,100738,48895,,0,1357322,27138,115910,394,,,,0,1357322,27138 +"2020-06-06","UT",121,,1,,890,890,147,20,266,,227822,4323,,,258566,110,,11798,,546,0,,,,,13640,6939,,0,272206,5947,,,,,239975,4901,272206,5947 +"2020-06-06","VA",1460,1357,7,103,5054,5054,1171,46,,324,,0,,,,,169,49397,47123,865,0,3070,53,,,59020,,414775,9893,414775,9893,50911,147,,,,0,,0 +"2020-06-06","VI",6,,0,,,,,0,,,2125,145,,,,,,71,,0,0,,,,,,62,,0,2196,145,,,,,2200,141,,0 +"2020-06-06","VT",55,55,0,,,,16,0,,,38528,1097,,,,,,1044,1044,17,0,,,,,,888,,0,46064,1312,,,,,39572,1114,46064,1312 +"2020-06-06","WA",1149,1149,11,,3639,3639,479,24,,,,0,,,,,86,24496,24496,327,0,,,,,,,426922,4772,426922,4772,,,,,370382,3749,,0 +"2020-06-06","WI",645,645,12,,2832,2832,315,41,636,118,314802,11470,,,,,,22937,20571,338,0,,,,,,13770,415936,12208,415936,12208,,,,,335373,11792,,0 +"2020-06-06","WV",84,,0,,,,27,0,,11,,0,,,,,3,2131,2065,12,0,,,,,,1446,,0,108427,1719,6634,,,,,0,108427,1719 +"2020-06-06","WY",17,,0,,90,90,4,0,,,27569,890,,,30184,,,939,726,6,0,,,,,926,757,,0,31110,97,,,,,,0,31110,97 +"2020-06-05","AK",10,10,0,,53,53,8,1,,,,0,,,,,1,529,,11,0,,,,,,380,,0,60990,893,,,,,,0,60990,893 +"2020-06-05","AL",676,672,23,4,1949,1949,582,20,603,,220086,3859,,,,358,,19387,19073,315,0,,,,,,11395,,0,239159,3860,,,,,239159,3860,,0 +"2020-06-05","AR",152,,10,,792,792,147,35,,,138960,4547,,,,138,32,8651,8651,584,0,,,,,,5919,,0,150975,3590,,,,,,0,150975,3590 +"2020-06-05","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-05","AZ",1012,,16,,3712,3712,1234,70,,375,239533,12531,,,,,241,24332,,1579,0,,,,,,,,0,359497,12096,,,106390,,263865,14110,359497,12096 +"2020-06-05","CA",4485,,63,,,,4625,0,,1333,,0,,,,,,122901,122901,3094,0,,,,,,,,0,2238463,55792,,,,,,0,2238463,55792 +"2020-06-05","CO",1524,1205,12,319,4472,4472,299,12,,,180662,4598,68860,,,,,27615,25099,255,0,5234,,,,,,241247,6581,241247,6581,74094,,,,205761,4849,,0 +"2020-06-05","CT",4038,3196,31,842,9669,9669,350,0,,,,0,,,254075,,,43460,41387,221,0,,,,,53248,7284,,0,308515,8276,,,,,,0,308515,8276 +"2020-06-05","DC",475,,0,,,,273,0,,99,,0,,,,,75,9199,,79,0,,,,,,1138,51861,765,51861,765,,,,,41800,229,,0 +"2020-06-05","DE",485,427,2,58,,,128,0,,,56956,793,,,,,,9773,,27,0,,,,,12044,5631,80892,1859,80892,1859,,,,,66729,820,,0 +"2020-06-05","FL",2745,2745,54,,11066,11066,,143,,,1073452,26592,,118053,1240903,,,59305,,1019,0,,,5474,,83619,,1172244,28263,1172244,28263,,,123552,,1135865,27913,1327264,34388 +"2020-06-05","GA",2174,,27,,8646,8646,790,89,1897,,,0,,,,,,50621,50621,774,0,5748,,,,45196,,,0,507819,11548,97294,,,,,0,507819,11548 +"2020-06-05","GU",5,,0,,,,,0,,,7195,390,,,6945,,,179,171,0,0,2,,,,170,162,,0,7374,390,105,,,,,0,7116,287 +"2020-06-05","HI",17,17,0,,83,83,,0,,,51681,1696,,,,,,655,,2,0,,,,,622,611,58536,1790,58536,1790,,,,,,0,59842,1900 +"2020-06-05","IA",592,,12,,,,299,0,,102,159511,5381,,18980,,,62,21152,21152,347,0,,,1920,,,12585,,0,180663,5728,,,20917,,180663,5728,,0 +"2020-06-05","ID",83,63,0,20,255,255,29,2,98,8,50570,3755,,,,,,3054,2763,64,0,,,,,,2362,,0,53333,3809,,,,,53333,3809,,0 +"2020-06-05","IL",5795,5795,59,,,,2911,0,,817,,0,,,,,500,125915,125915,1156,0,,,,,,,,0,1000919,18903,,,,,1000919,18903,1000919,18903 +"2020-06-05","IN",2258,2078,27,180,6053,6053,924,54,1293,368,255060,5922,,,,,147,36578,,482,0,,,,,37703,,,0,372653,8645,,,,,291638,6404,372653,8645 +"2020-06-05","KS",232,,10,,917,917,,27,306,,103260,5377,,,,135,,10393,,223,0,,,,,,,,0,113653,5600,,,,,,0,,0 +"2020-06-05","KY",466,465,8,1,2345,2345,505,13,958,73,,0,,,,,,10977,10734,272,0,,,,,,3316,,0,242174,6249,32745,,,,,0,242174,6249 +"2020-06-05","LA",2912,2801,29,111,,,604,0,,,378797,9173,,,,,75,41989,41989,427,0,,,,,,31728,,0,420786,9600,,,,,,0,420786,9600 +"2020-06-05","MA",7235,7097,34,138,10303,10303,1533,65,,350,532212,9340,,,,,238,102557,98796,494,0,,,,,128793,84621,,0,812059,11524,,,49556,,631008,9760,812059,11524 +"2020-06-05","MD",2702,2580,34,122,9346,9346,1076,129,,455,290956,9796,,,,,,56770,56770,912,0,,,,,64919,4159,,0,399813,13210,,,,,347726,10708,399813,13210 +"2020-06-05","ME",98,98,3,,293,293,35,2,,13,,0,4478,,,,7,2482,2210,36,0,240,,,,2719,1797,,0,58825,1401,4726,,,,,0,58825,1401 +"2020-06-05","MI",5909,5672,8,244,,,617,0,,321,,0,,,640450,,205,64821,59001,205,0,,,,,79638,38099,,0,720088,12958,104273,,,,,0,720088,12958 +"2020-06-05","MN",1159,1148,33,11,3289,3289,478,36,1044,220,304497,10639,,,,,,28688,28688,398,0,,,,,,21864,333185,11037,333185,11037,,,,,,0,,0 +"2020-06-05","MO",799,,13,,,,666,0,,,210289,5685,,26506,237939,,79,14253,14253,196,0,,,1061,,16681,,,0,254990,71340,,,27567,,224542,6164,254990,71340 +"2020-06-05","MP",2,,0,,,,,0,,,6669,0,,,,,,26,26,0,0,,,,,,16,,0,6695,0,,,,,,0,6695,0 +"2020-06-05","MS",803,787,9,16,2475,2475,604,135,,149,176354,7929,,,,,84,16759,16654,199,0,,,,,,11203,,0,193113,8128,8662,,,,,0,193008,8673 +"2020-06-05","MT",18,,1,,68,68,1,0,,,,0,,,,,,541,,2,0,,,,,,470,,0,45888,1246,,,,,,0,45888,1246 +"2020-06-05","NC",966,966,6,,,,717,0,,,,0,,,,,,33255,33255,1289,0,,,,,,,,0,460788,18746,,,,,,0,460788,18746 +"2020-06-05","ND",74,,5,,180,180,30,5,,,74111,1073,3041,,,,,2742,2742,40,0,107,,,,,2242,105094,2550,105094,2550,3148,,,,74793,1214,107451,2623 +"2020-06-05","NE",186,,-1,,905,905,190,3,,,99705,2316,,,118324,,,15117,,251,0,,,,,17898,7598,,0,136640,3126,,,,,114974,2565,136640,3126 +"2020-06-05","NH",273,,8,,472,472,86,4,145,,74889,3719,,,,,,4876,,81,0,,,,,,3187,,0,92308,2860,15040,,12944,,79765,3800,92308,2860 +"2020-06-05","NJ",13779,12049,82,1730,17880,17880,1933,276,,542,755555,60356,,,,,410,163774,163336,822,0,,,,,,,,0,919329,61178,,,,,,0,918891,61162 +"2020-06-05","NM",387,,4,,1489,1489,175,73,,,,0,,,,,,8672,,319,0,,,,,,3206,,0,224640,6883,,,,,,0,224640,6883 +"2020-06-05","NV",460,,0,,,,341,0,,72,156841,4508,,,,,47,9266,9266,176,0,,,,,,,211148,5176,211148,5176,,,,,166002,4698,191125,5477 +"2020-06-05","NY",24175,,42,,89995,89995,2728,0,,758,,0,,,,,583,376208,,1075,0,,,,,,,2359512,66480,2359512,66480,,,,,,0,,0 +"2020-06-05","OH",2355,2135,16,220,6385,6385,671,73,1632,259,,0,,,,,168,37758,35096,476,0,,,,,41094,,,0,477751,12405,,,,,,0,477751,12405 +"2020-06-05","OK",344,,0,,1014,1014,164,0,,66,209564,4749,,,209564,,,6907,6907,0,0,863,,,,7921,5781,,0,216471,4749,23402,,,,,0,218010,4868 +"2020-06-05","OR",159,,0,,812,812,124,12,,40,134838,2569,,,189041,,13,4474,,75,0,,,,,12165,2199,,0,201206,4342,,,,,139188,2639,201206,4342 +"2020-06-05","PA",5886,,69,,,,1174,0,,,424201,7259,,,,,268,75005,72292,445,0,620,,,,,52069,576018,10322,576018,10322,,,,,496493,7670,,0 +"2020-06-05","PR",141,63,1,78,,,116,0,,9,60422,0,,,59701,,7,1330,1330,8,0,3290,,,,1952,,,0,61752,8,,,,,,0,61702,0 +"2020-06-05","RI",772,,16,,1775,1775,182,10,,37,106656,1520,,,160874,,23,15521,,105,0,,,,,21126,,180235,4734,180235,4734,,,,,122177,1625,182000,3697 +"2020-06-05","SC",538,538,13,,1814,1814,453,25,,,217846,0,,,217846,,,13453,13453,448,0,,,,,20962,7347,,0,231299,448,,,,,,0,238808,0 +"2020-06-05","SD",65,,1,,467,467,83,3,,,48086,711,,,,,,5277,,30,0,,,,,6887,4179,,0,59767,4662,,,,,53363,741,59767,4662 +"2020-06-05","TN",408,408,7,,1893,1893,505,38,,,,0,,,456652,,,25520,25520,400,0,,,,,25520,16925,,0,482172,6034,,,,,482172,6034,482172,6034 +"2020-06-05","TX",1788,,21,,,,1855,0,,,,0,,,,,,71613,71613,1693,0,4549,37,,,98909,47865,,0,1330184,42713,113372,366,,,,0,1330184,42713 +"2020-06-05","UT",120,,3,,870,870,133,20,262,,223499,3283,,,253248,109,,11252,,439,0,,,,,13011,6788,,0,266259,4638,,,,,235074,3706,266259,4638 +"2020-06-05","VA",1453,1350,8,103,5008,5008,1205,51,,320,,0,,,,,161,48532,46281,676,0,2973,50,,,58319,,404882,11931,404882,11931,49415,144,,,,0,,0 +"2020-06-05","VI",6,,0,,,,,0,,,1980,5,,,,,,71,,0,0,,,,,,62,,0,2051,5,,,,,2059,11,,0 +"2020-06-05","VT",55,55,0,,,,14,0,,,37431,951,,,,,,1027,1027,2,0,,,,,,882,,0,44752,1150,,,,,38458,953,44752,1150 +"2020-06-05","WA",1138,1138,3,,3615,3615,519,37,,,,0,,,,,91,24169,24169,382,0,,,,,,,422150,8069,422150,8069,,,,,366633,6259,,0 +"2020-06-05","WI",633,633,7,,2791,2791,355,52,625,124,303332,11965,,,,,,22599,20249,406,0,,,,,,13337,403728,13528,403728,13528,,,,,323581,12322,,0 +"2020-06-05","WV",84,,6,,,,27,0,,11,,0,,,,,3,2119,2054,27,0,,,,,,1445,,0,106708,1831,6475,,,,,0,106708,1831 +"2020-06-05","WY",17,,0,,90,90,4,3,,,26679,605,,,30096,,,933,721,12,0,,,,,917,755,,0,31013,595,,,,,,0,31013,595 +"2020-06-04","AK",10,10,0,,52,52,13,0,,,,0,,,,,1,518,,10,0,,,,,,376,,0,60097,1915,,,,,,0,60097,1915 +"2020-06-04","AL",653,651,0,2,1929,1929,601,29,601,,216227,3484,,,,357,,19072,18766,221,0,,,,,,11395,,0,235299,4002,,,,,235299,4002,,0 +"2020-06-04","AR",142,,0,,757,757,138,26,,,134413,0,,,,127,30,8067,8067,0,0,,,,,,5717,,0,147385,4905,,,,,,0,147385,4905 +"2020-06-04","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-04","AZ",996,,15,,3642,3642,1079,53,,375,227002,4710,,,,,223,22753,,520,0,,,,,,,,0,347401,11044,,,101147,,249755,5230,347401,11044 +"2020-06-04","CA",4422,,61,,,,4455,0,,1279,,0,,,,,,119807,119807,2120,0,,,,,,,,0,2182671,51377,,,,,,0,2182671,51377 +"2020-06-04","CO",1512,1195,18,317,4460,4460,319,17,,,176064,5924,66395,,,,,27360,24848,300,0,5059,,,,,,234666,8296,234666,8296,71454,,,,200912,6215,,0 +"2020-06-04","CT",4007,3171,18,836,9669,9669,373,-4124,,,,0,,,246207,,,43239,41171,148,0,,,,,52864,7284,,0,300239,7608,,,,,,0,300239,7608 +"2020-06-04","DC",475,,2,,,,276,0,,98,,0,,,,,73,9120,,104,0,,,,,,1138,51096,1534,51096,1534,,,,,41571,820,,0 +"2020-06-04","DE",483,425,8,58,,,142,0,,,56163,955,,,,,,9746,,34,0,,,,,11956,5562,79033,1232,79033,1232,,,,,65909,989,,0 +"2020-06-04","FL",2691,2691,41,,10923,10923,,127,,,1046860,24711,,118053,1208362,,,58286,,1265,0,,,5474,,81817,,1143981,34562,1143981,34562,,,123552,,1107952,26127,1292876,33700 +"2020-06-04","GA",2147,,24,,8557,8557,807,138,1872,,,0,,,,,,49847,49847,953,0,5599,,,,44359,,,0,496271,13624,94626,,,,,0,496271,13624 +"2020-06-04","GU",5,,0,,,,,0,,,6805,256,,,,,,179,171,1,0,2,,,,171,162,,0,6984,257,94,,,,,0,6829,332 +"2020-06-04","HI",17,17,0,,83,83,,0,,,49985,1130,,,,,,653,,0,0,,,,,621,612,56746,1301,56746,1301,,,,,,0,57942,1373 +"2020-06-04","IA",580,,6,,,,310,0,,105,154130,9740,,18399,,,70,20805,20805,750,0,,,1912,,,12333,,0,174935,10490,,,20328,,174935,10490,,0 +"2020-06-04","ID",83,63,0,20,253,253,28,2,98,3,46815,806,,,,,,2990,2709,57,0,,,,,,2311,,0,49524,855,,,,,49524,855,,0 +"2020-06-04","IL",5736,5736,115,,,,3044,0,,853,,0,,,,,516,124759,124759,929,0,,,,,,,,0,982016,22841,,,,,982016,22841,982016,22841 +"2020-06-04","IN",2231,2052,24,179,5999,5999,979,47,1286,372,249138,7035,,,,,144,36096,,384,0,,,,,37198,,,0,364008,8308,,,,,285234,7419,364008,8308 +"2020-06-04","KS",222,,0,,890,890,,0,302,,97883,0,,,,131,,10170,,0,0,,,,,,,,0,108053,0,,,,,,0,,0 +"2020-06-04","KY",458,456,8,2,2332,2332,518,15,954,67,,0,,,,,,10705,10479,295,0,,,,,,3303,,0,235925,3726,26789,,,,,0,235925,3726 +"2020-06-04","LA",2883,2772,13,111,,,613,0,,,369624,8670,,,,,82,41562,41562,429,0,,,,,,31728,,0,411186,9099,,,,,,0,411186,9099 +"2020-06-04","MA",7201,7062,49,139,10238,10238,1637,87,,401,522872,6703,,,,,249,102063,98376,471,0,,,,,128133,84621,,0,800535,12024,,,48436,,621248,7115,800535,12024 +"2020-06-04","MD",2668,2546,2,122,9217,9217,1096,106,,456,281160,8517,,,,,,55858,55858,876,0,,,,,63859,3985,,0,386603,11524,,,,,337018,9393,386603,11524 +"2020-06-04","ME",95,95,0,,291,291,35,6,,14,,0,4393,,,,7,2446,2181,28,0,232,,,,2674,1739,,0,57424,1542,4633,,,,,0,57424,1542 +"2020-06-04","MI",5901,5665,17,244,,,617,0,,321,,0,,,627907,,205,64616,58878,234,0,,,,,79223,38099,,0,707130,15114,101172,,,,,0,707130,15114 +"2020-06-04","MN",1126,1115,29,11,3253,3253,512,50,1033,244,293858,10539,,,,,,28290,28290,401,0,,,,,,21490,322148,10940,322148,10940,,,,,,0,,0 +"2020-06-04","MO",786,,0,,,,599,0,,,204604,7018,,25828,168871,,82,14057,13774,290,0,,,1041,,14498,,,0,183650,0,,,26869,,218378,7260,183650,0 +"2020-06-04","MP",2,,0,,,,,0,,,6669,135,,,,,,26,26,3,0,,,,,,16,,0,6695,138,,,,,,0,6695,138 +"2020-06-04","MS",794,778,12,16,2340,2340,633,0,,145,168425,0,,,,,97,16560,16447,238,0,,,,,,11203,,0,184985,238,8027,,,,,0,184335,0 +"2020-06-04","MT",17,,0,,68,68,1,0,,,,0,,,,,,539,,14,0,,,,,,467,,0,44642,1194,,,,,,0,44642,1194 +"2020-06-04","NC",960,960,21,,,,659,0,,,,0,,,,,,31966,31966,1189,0,,,,,,,,0,442042,12966,,,,,,0,442042,12966 +"2020-06-04","ND",69,,0,,175,175,32,3,,,73038,1215,2937,,,,,2702,2702,26,0,104,,,,,2209,102544,3471,102544,3471,3041,,,,73579,1285,104828,3570 +"2020-06-04","NE",187,,6,,902,902,211,51,,,97389,2034,,,115498,,,14866,,255,0,,,,,17605,7005,,0,133514,3906,,,,,112409,2290,133514,3906 +"2020-06-04","NH",265,,9,,468,468,88,6,144,,71170,180,,,,,,4795,,46,0,,,,,,3157,,0,89448,3934,14649,,12614,,75965,226,89448,3934 +"2020-06-04","NJ",13697,11970,95,1727,17604,17604,1982,214,,537,695199,19847,,,,,459,162952,162530,480,0,,,,,,,,0,858151,20327,,,,,,0,857729,20309 +"2020-06-04","NM",383,,8,,1416,1416,170,0,,,,0,,,,,,8353,,213,0,,,,,,3115,,0,217757,4761,,,,,,0,217757,4761 +"2020-06-04","NV",460,,5,,,,364,0,,79,152333,5013,,,,,47,9090,9090,159,0,,,,,,,205972,5469,205972,5469,,,,,161304,5157,185648,5640 +"2020-06-04","NY",24133,,54,,89995,89995,2849,0,,832,,0,,,,,613,375133,,1048,0,,,,,,,2293032,63559,2293032,63559,,,,,,0,,0 +"2020-06-04","OH",2339,2117,40,222,6312,6312,693,61,1623,267,,0,,,,,181,37282,34639,490,0,,,,,40471,,,0,465346,12788,,,,,,0,465346,12788 +"2020-06-04","OK",344,,3,,1014,1014,148,11,,63,204815,3568,,,204815,,,6907,6907,102,0,746,,,,7802,5781,,0,211722,3670,20278,,,,,0,213142,3856 +"2020-06-04","OR",159,,2,,800,800,112,5,,27,132269,2395,,,184813,,10,4399,,64,0,,,,,12051,2199,,0,196864,3925,,,,,136549,2455,196864,3925 +"2020-06-04","PA",5817,,76,,,,1174,0,,,416942,15573,,,,,268,74560,71881,538,0,618,,,,,51019,565696,12118,565696,12118,,,,,488823,16093,,0 +"2020-06-04","PR",140,63,0,77,,,114,0,,15,60422,0,,,59701,,9,1322,1322,9,0,3186,,,,1952,,,0,61744,9,,,,,,0,61702,0 +"2020-06-04","RI",756,,14,,1765,1765,185,12,,42,105136,2000,,,157390,,29,15416,,117,0,,,,,20913,,175501,3735,175501,3735,,,,,120552,2117,178303,4727 +"2020-06-04","SC",525,525,7,,1789,1789,453,0,,,217846,7572,,,217846,,,13005,13005,354,0,,,,,20962,6976,,0,230851,7926,,,,,,0,238808,8121 +"2020-06-04","SD",64,,2,,464,464,86,8,,,47375,3875,,,,,,5247,,85,0,,,,,6806,4163,,0,55105,1969,,,,,52622,3960,55105,1969 +"2020-06-04","TN",401,401,13,,1855,1855,547,26,,,,0,,,451018,,,25120,25120,298,0,,,,,25120,16643,,0,476138,5359,,,,,476138,5359,476138,5359 +"2020-06-04","TX",1767,,33,,,,1796,0,,,,0,,,,,,69920,69920,1649,0,4500,34,,,95954,46799,,0,1287471,38322,112313,329,,,,0,1287471,38322 +"2020-06-04","UT",117,,0,,850,850,164,21,258,,220216,3553,,,249055,108,,10813,,316,0,,,,,12566,6628,,0,261621,5094,,,,,231368,3920,261621,5094 +"2020-06-04","VA",1445,1338,17,107,4957,4957,1266,73,,321,,0,,,,,171,47856,45620,951,0,2843,49,,,57368,,392951,11402,392951,11402,47626,143,,,,0,,0 +"2020-06-04","VI",6,,0,,,,,0,,,1975,19,,,,,,71,,1,0,,,,,,62,,0,2046,20,,,,,2048,17,,0 +"2020-06-04","VT",55,55,0,,,,13,0,,,36480,1236,,,,,,1025,1025,36,0,,,,,,881,,0,43602,1450,,,,,37505,1272,43602,1450 +"2020-06-04","WA",1135,1135,6,,3578,3578,484,35,,,,0,,,,,94,23787,23787,417,0,,,,,,,414081,6377,414081,6377,,,,,360374,4589,,0 +"2020-06-04","WI",626,626,10,,2739,2739,355,39,616,117,291367,11656,,,,,,22193,19892,532,0,,,,,,12980,390200,13349,390200,13349,,,,,311259,12148,,0 +"2020-06-04","WV",78,,0,,,,28,0,,11,,0,,,,,2,2092,1593,21,0,,,,,,1399,,0,104877,2386,6188,,,,,0,104877,2386 +"2020-06-04","WY",17,,0,,87,87,4,0,,,26074,361,,,29512,,,921,709,6,0,,,,,906,714,,0,30418,887,,,,,,0,30418,887 +"2020-06-03","AK",10,10,0,,52,52,11,1,,,,0,,,,,0,508,,18,0,,,,,,373,,0,58182,1979,,,,,,0,58182,1979 +"2020-06-03","AL",653,651,2,2,1900,1900,610,21,591,,212743,7583,,,,355,,18851,18554,209,0,,,,,,11395,,0,231297,7495,,,,,231297,7495,,0 +"2020-06-03","AR",142,,9,,731,731,132,13,,,134413,8620,,,,124,31,8067,8067,624,0,,,,,,5717,,0,142480,9244,,,,,,0,142480,9244 +"2020-06-03","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-03","AZ",981,,40,,3589,3589,1092,69,,379,222292,5709,,,,,239,22233,,983,0,,,,,,,,0,336357,11141,,,100519,,244525,6692,336357,11141 +"2020-06-03","CA",4361,,75,,,,4458,0,,1313,,0,,,,,,117687,117687,2377,0,,,,,,,,0,2131294,59703,,,,,,0,2131294,59703 +"2020-06-03","CO",1494,1182,20,312,4443,4443,356,24,,,170140,2751,64531,,,,,27060,24557,272,0,4934,,,,,,226370,4859,226370,4859,69465,,,,194697,3997,,0 +"2020-06-03","CT",3989,3156,17,833,13793,13793,406,0,,,,0,,,238958,,,43091,41051,112,0,,,,,52525,7511,,0,292631,7563,,,,,,0,292631,7563 +"2020-06-03","DC",473,,3,,,,285,0,,103,,0,,,,,72,9016,,130,0,,,,,,1138,49562,1861,49562,1861,,,,,40751,1500,,0 +"2020-06-03","DE",475,418,4,57,,,153,0,,,55208,831,,,,,,9712,,27,0,,,,,11858,5493,77801,558,77801,558,,,,,64920,858,,0 +"2020-06-03","FL",2650,2650,37,,10796,10796,,118,,,1022149,29844,,118053,1176653,,,57021,,1209,0,,,5474,,79855,,1109419,25625,1109419,25625,,,123552,,1081825,31154,1259176,49076 +"2020-06-03","GA",2123,,21,,8419,8419,815,85,1841,,,0,,,,,,48894,48894,687,0,5425,,,,43515,,,0,482647,8425,91688,,,,,0,482647,8425 +"2020-06-03","GU",5,,0,,,,,0,,,6549,335,,,,,,178,170,1,0,2,,,,170,151,,0,6727,336,93,,,,,0,6497,143 +"2020-06-03","HI",17,17,0,,83,83,,0,,,48855,586,,,,,,653,,1,0,,,,,620,609,55445,817,55445,817,,,,,,0,56569,850 +"2020-06-03","IA",574,,13,,,,314,0,,116,144390,716,,17607,,,76,20055,20055,39,0,,,1880,,,12064,,0,164445,755,,,19502,,164445,476,,0 +"2020-06-03","ID",83,63,0,20,251,251,30,4,98,3,46009,782,,,,,,2933,2660,27,0,,,,,,2282,,0,48669,799,,,,,48669,799,,0 +"2020-06-03","IL",5621,5621,96,,,,3173,0,,844,,0,,,,,508,123830,123830,982,0,,,,,,,,0,959175,24471,,,,,959175,24471,959175,24471 +"2020-06-03","IN",2207,2032,10,175,5952,5952,1017,50,1282,358,242103,5421,,,,,138,35712,,475,0,,,,,36766,,,0,355700,7220,,,,,277815,5896,355700,7220 +"2020-06-03","KS",222,,5,,890,890,,28,302,,97883,4582,,,,131,,10170,,159,0,,,,,,,,0,108053,4741,,,,,,0,,0 +"2020-06-03","KY",450,449,8,1,2317,2317,488,10,950,68,,0,,,,,,10410,10192,225,0,,,,,,3283,,0,232199,5143,26568,,,,,0,232199,5143 +"2020-06-03","LA",2870,2759,35,111,,,617,0,,,360954,8567,,,,,86,41133,41133,387,0,,,,,,31728,,0,402087,8954,,,,,,0,402087,8954 +"2020-06-03","MA",7152,7012,67,140,10151,10151,1684,88,,393,516169,7937,,,,,263,101592,97964,429,0,,,,,127383,78108,,0,788511,13111,,,47414,,614133,8362,788511,13111 +"2020-06-03","MD",2666,2544,20,122,9111,9111,1109,154,,471,272643,11003,,,,,,54982,54982,807,0,,,,,62955,3970,,0,375079,14385,,,,,327625,11810,375079,14385 +"2020-06-03","ME",95,95,1,,285,285,44,-2,,14,,0,4212,,,,10,2418,2152,41,0,226,,,,2640,1699,,0,55882,1683,4446,,,,,0,55882,1683 +"2020-06-03","MI",5884,5657,15,243,,,646,0,,328,,0,,,613173,,224,64382,58760,279,0,,,,,78843,38099,,0,692016,16696,98953,,,,,0,692016,16696 +"2020-06-03","MN",1097,1086,15,11,3203,3203,537,69,1022,254,283319,15388,,,,,,27889,27889,513,0,,,,,,21169,311208,15901,311208,15901,,,,,,0,,0 +"2020-06-03","MO",786,,3,,,,571,0,,,197586,5731,,24681,168871,,70,13767,13767,192,0,,,1006,,14498,,,0,183650,0,,,25687,,211118,5957,183650,0 +"2020-06-03","MP",2,,0,,,,,0,,,6534,0,,,,,,23,23,0,0,,,,,,16,,0,6557,0,,,,,,0,6557,0 +"2020-06-03","MS",782,767,15,15,2340,2340,602,44,,141,168425,4947,,,,,96,16322,16211,302,0,,,,,,11203,,0,184747,5249,8027,,,,,0,184335,4947 +"2020-06-03","MT",17,,0,,68,68,1,1,,,,0,,,,,,525,,2,0,,,,,,464,,0,43448,1236,,,,,,0,43448,1236 +"2020-06-03","NC",939,939,18,,,,684,0,,,,0,,,,,,30777,30777,888,0,,,,,,,,0,429076,12313,,,,,,0,429076,12313 +"2020-06-03","ND",69,,1,,172,172,34,2,,,71823,825,2824,,,,,2676,2676,33,0,97,,,,,2169,99073,2568,99073,2568,2921,,,,72294,929,101258,2621 +"2020-06-03","NE",181,,3,,851,851,194,851,,,95355,3282,,,112019,,,14611,,266,0,,,,,17184,6743,,0,129608,3014,,,,,110119,3549,129608,3014 +"2020-06-03","NH",256,,11,,462,462,97,6,142,,70990,1331,,,,,,4749,,64,0,,,,,,3071,,0,85514,2770,14266,,12249,,75739,1395,85514,2770 +"2020-06-03","NJ",13602,11880,112,1722,17390,17390,2250,0,,612,675352,19220,,,,,459,162472,162068,554,0,,,,,,,,0,837824,19774,,,,,,0,837420,19743 +"2020-06-03","NM",375,,8,,1416,1416,170,0,,,,0,,,,,,8140,,116,0,,,,,,3013,,0,212996,6159,,,,,,0,212996,6159 +"2020-06-03","NV",455,,3,,,,372,0,,84,147320,4059,,,,,47,8931,8931,101,0,,,,,,,200503,6802,200503,6802,,,,,156147,4181,180008,3976 +"2020-06-03","NY",24079,,56,,89995,89995,2978,134,,865,,0,,,,,638,374085,,1045,0,,,,,,,2229473,61642,2229473,61642,,,,,,0,,0 +"2020-06-03","OH",2299,2080,41,219,6251,6251,704,75,1604,283,,0,,,,,198,36792,34208,442,0,,,,,39887,,,0,452558,10391,,,,,,0,452558,10391 +"2020-06-03","OK",341,,2,,1003,1003,136,9,,59,201247,3282,,,201247,,,6805,6805,113,0,746,,,,7716,5711,,0,208052,3395,20278,,,,,0,209286,3170 +"2020-06-03","OR",157,,3,,795,795,102,5,,29,129874,2558,,,181011,,15,4335,,33,0,,,,,11928,2164,,0,192939,4138,,,,,134094,2586,192939,4138 +"2020-06-03","PA",5741,,74,,,,1164,0,,,401369,2008,,,,,269,74022,71361,512,0,617,,,,,49915,553578,11826,553578,11826,,,,,472730,2505,,0 +"2020-06-03","PR",140,63,2,77,,,107,0,,12,60422,0,,,59701,,7,1313,1313,8,0,2710,,,,1952,,,0,61735,8,,,,,,0,61702,0 +"2020-06-03","RI",742,,10,,1753,1753,189,10,,44,103136,1624,,,152937,,30,15299,,105,0,,,,,20639,,171766,3298,171766,3298,,,,,118435,1729,173576,3700 +"2020-06-03","SC",518,518,17,,1789,1789,433,0,,,210274,3912,,,210274,,,12651,12651,236,0,,,,,20413,6976,,0,222925,4148,,,,,,0,230687,5640 +"2020-06-03","SD",62,,0,,456,456,87,13,,,43500,1721,,,,,,5162,,95,0,,,,,6735,4084,,0,53136,1292,,,,,48662,1816,53136,1292 +"2020-06-03","TN",388,388,7,,1829,1829,548,37,,,,0,,,445957,,,24822,24822,447,0,,,,,24822,16319,,0,470779,8643,,,,,470779,8643,470779,8643 +"2020-06-03","TX",1734,,36,,,,1487,0,,,,0,,,,,,68271,68271,1703,0,4395,33,,,93695,45858,,0,1249149,42837,110506,293,,,,0,1249149,42837 +"2020-06-03","UT",117,,4,,829,829,150,28,250,,216663,3105,,,244394,107,,10497,,295,0,,,,,12133,6501,,0,256527,4119,,,,,227448,3379,256527,4119 +"2020-06-03","VA",1428,1322,21,106,4884,4884,1311,114,,313,,0,,,,,185,46905,44715,666,0,2730,48,,,56250,,381549,12268,381549,12268,45940,141,,,,0,,0 +"2020-06-03","VI",6,,0,,,,,0,,,1956,20,,,,,,70,,0,0,,,,,,62,,0,2026,20,,,,,2031,19,,0 +"2020-06-03","VT",55,55,0,,,,10,0,,,35244,644,,,,,,989,989,2,0,,,,,,879,,0,42152,739,,,,,36233,646,42152,739 +"2020-06-03","WA",1129,1129,5,,3543,3543,474,26,,,,0,,,,,89,23370,23370,410,0,,,,,,,407704,7329,407704,7329,,,,,355785,5328,,0 +"2020-06-03","WI",616,616,9,,2700,2700,357,57,606,130,279711,15968,,,,,,21661,19400,506,0,,,,,,12172,376851,11243,376851,11243,,,,,299111,16451,,0 +"2020-06-03","WV",78,,1,,,,34,0,,13,,0,,,,,4,2071,1593,30,0,,,,,,1381,,0,102491,3162,5993,,,,,0,102491,3162 +"2020-06-03","WY",17,,0,,87,87,4,1,,,25713,881,,,28638,,,915,703,3,0,,,,,893,714,,0,29531,601,,,,,,0,29531,601 +"2020-06-02","AK",10,10,0,,51,51,10,1,,,,0,,,,,0,490,,20,0,,,,,,371,,0,56203,2013,,,,,,0,56203,2013 +"2020-06-02","AL",651,649,5,2,1879,1879,606,23,591,,205160,0,,,,355,,18642,18354,279,0,,,,,,9355,,0,223802,567,,,,,223802,567,,0 +"2020-06-02","AR",133,,0,,718,718,121,7,,,125793,0,,,,124,26,7443,7443,0,0,,,,,,5401,,0,133236,0,,,,,,0,133236,0 +"2020-06-02","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-02","AZ",941,,24,,3520,3520,1009,75,,380,216583,8636,,,,,235,21250,,1127,0,,,,,,,,0,325216,11073,,,98756,,237833,9763,325216,11073 +"2020-06-02","CA",4286,,35,,,,4393,0,,1286,,0,,,,,,115310,115310,2304,0,,,,,,,,0,2071591,59008,,,,,,0,2071591,59008 +"2020-06-02","CO",1474,1162,16,312,4419,4419,388,47,,,167389,3429,59697,,,,,26788,24311,211,0,4727,,,,,,221511,3395,221511,3395,64424,,,,190700,2631,,0 +"2020-06-02","CT",3972,3139,8,833,13793,13793,434,0,,,,0,,,231839,,,42979,40941,236,0,,,,,52099,7511,,0,285068,8225,,,,,,0,285068,8225 +"2020-06-02","DC",470,,2,,,,295,0,,106,,0,,,,,74,8886,,29,0,,,,,,1137,47701,438,47701,438,,,,,39251,276,,0 +"2020-06-02","DE",471,414,0,57,,,157,0,,,54377,1535,,,,,,9685,,80,0,,,,,11799,5442,77243,766,77243,766,,,,,64062,1615,,0 +"2020-06-02","FL",2613,2613,70,,10678,10678,,184,,,992305,8735,,118053,1130070,,,55812,,602,0,,,5474,,77387,,1083794,10168,1083794,10168,,,123552,,1050671,9353,1210100,0 +"2020-06-02","GA",2102,,28,,8334,8334,828,207,1821,,,0,,,,,,48207,48207,589,0,5395,,,,43054,,,0,474222,6493,91325,,,,,0,474222,6493 +"2020-06-02","GU",5,,0,,,,,0,,,6214,73,,,,,,177,167,2,0,2,,,,,148,,0,6391,75,93,,,,,0,6354,73 +"2020-06-02","HI",17,17,0,,83,83,,0,,,48269,434,,,,,,652,,0,0,,,,,620,608,54628,524,54628,524,,,,,,0,55719,383 +"2020-06-02","IA",561,,10,,,,327,0,,114,143674,4290,,17559,,,76,20016,20016,319,0,,,1876,,,11742,,0,163690,4609,,,19449,,163969,4677,,0 +"2020-06-02","ID",83,63,1,20,247,247,34,5,98,4,45227,1369,,,,,,2906,2643,67,0,,,,,,2266,,0,47870,1434,,,,,47870,1434,,0 +"2020-06-02","IL",5525,5525,113,,,,3238,0,,874,,0,,,,,548,122848,122848,1614,0,,,,,,,,0,934704,16431,,,,,934704,16431,934704,16431 +"2020-06-02","IN",2197,2022,55,175,5902,5902,961,42,1261,358,236682,5616,,,,,140,35237,,407,0,,,,,36307,,,0,348480,9970,,,,,271919,6023,348480,9970 +"2020-06-02","KS",217,,0,,862,862,,20,290,,93301,8071,,,,127,,10011,,0,0,,,,,,,,0,103312,8071,,,,,,0,,0 +"2020-06-02","KY",442,441,3,1,2307,2307,481,33,941,85,,0,,,,,,10185,9970,139,0,,,,,,3275,,0,227056,11203,26529,,,,,0,227056,11203 +"2020-06-02","LA",2835,2724,34,111,,,639,0,,,352387,5358,,,,,83,40746,40746,405,0,,,,,,31728,,0,393133,5763,,,,,,0,393133,5763 +"2020-06-02","MA",7085,6944,50,141,10063,10063,1657,111,,394,508232,5604,,,,,269,101163,97539,358,0,,,,,126513,78108,,0,775400,13074,,,46565,,605771,5852,775400,13074 +"2020-06-02","MD",2646,2525,21,121,8957,8957,1148,71,,481,261640,6237,,,,,,54175,54175,848,0,,,,,62014,3855,,0,360694,8786,,,,,315815,7085,360694,8786 +"2020-06-02","ME",94,94,5,,287,287,48,3,,16,,0,4101,,,,10,2377,2118,28,0,219,,,,2587,1646,,0,54199,749,4328,,,,,0,54199,749 +"2020-06-02","MI",5869,5641,26,242,,,674,0,,346,,0,,,597072,,240,64103,58594,290,0,,,,,78248,38099,,0,675320,16167,97108,,,,,0,675320,16167 +"2020-06-02","MN",1082,1072,22,10,3134,3134,537,48,1003,248,267931,7192,,,,,,27376,27376,479,0,,,,,,20381,295307,7671,295307,7671,,,,,,0,,0 +"2020-06-02","MO",783,,10,,,,693,0,,,191855,5474,,23739,168871,,81,13575,13306,248,0,,,985,,14498,,,0,183650,0,,,24724,,205161,5726,183650,0 +"2020-06-02","MP",2,,0,,,,,0,,,6534,222,,,,,,23,23,1,0,,,,,,16,,0,6557,223,,,,,,0,6557,223 +"2020-06-02","MS",767,752,28,15,2296,2296,584,0,,146,163478,2976,,,,,97,16020,15910,268,0,,,,,,11203,,0,179498,3244,7882,,,,,0,179388,3134 +"2020-06-02","MT",17,,0,,67,67,1,0,,,,0,,,,,,523,,4,0,,,,,,462,,0,42212,1555,,,,,,0,42212,1555 +"2020-06-02","NC",921,921,23,,,,716,0,,,,0,,,,,,29889,29889,626,0,,,,,,,,0,416763,4552,,,,,,0,416763,4552 +"2020-06-02","ND",68,,4,,170,170,34,1,,,70998,322,2747,,,,,2643,2643,22,0,95,,,,,2127,96505,1538,96505,1538,2842,,,,71365,516,98637,1609 +"2020-06-02","NE",178,,8,,,,,0,,,92073,2509,,,109298,,,14345,,244,0,,,,,16895,,,0,126594,4198,,,,,106570,2757,126594,4198 +"2020-06-02","NH",245,,0,,456,456,98,5,142,,69659,1854,,,,,,4685,,34,0,,,,,,2954,,0,82744,1506,13827,,12046,,74344,1888,82744,1506 +"2020-06-02","NJ",13490,11770,52,1720,17390,17390,2370,168,,639,656132,21450,,,,,480,161918,161545,640,0,,,,,,,,0,818050,22090,,,,,,0,817677,22077 +"2020-06-02","NM",367,,5,,1416,1416,182,99,,,,0,,,,,,8024,,224,0,,,,,,2960,,0,206837,3722,,,,,,0,206837,3722 +"2020-06-02","NV",452,,7,,,,365,0,,88,143261,5166,,,,,39,8830,8830,142,0,,,,,,,193701,5454,193701,5454,,,,,151966,5278,176032,6219 +"2020-06-02","NY",24023,,64,,89861,89861,3121,158,,907,,0,,,,,673,373040,,1329,0,,,,,,,2167831,54054,2167831,54054,,,,,,0,,0 +"2020-06-02","OH",2258,2041,52,217,6176,6176,697,64,1583,295,,0,,,,,204,36350,33892,366,0,,,,,39451,,,0,442167,8830,,,,,,0,442167,8830 +"2020-06-02","OK",339,,5,,994,994,124,8,,60,197965,11265,,,197965,,,6692,6692,119,0,746,,,,7628,5599,,0,204657,11384,20278,,,,,0,206116,11620 +"2020-06-02","OR",154,,1,,790,790,108,4,,32,127316,2358,,,176960,,17,4302,,59,0,,,,,11841,2164,,0,188801,3601,,,,,131508,2415,188801,3601 +"2020-06-02","PA",5667,,100,,,,1302,0,,,399361,9930,,,,,283,73510,70864,612,0,616,,,,,48838,541752,13231,541752,13231,,,,,470225,10516,,0 +"2020-06-02","PR",138,63,2,75,,,106,0,,17,60422,0,,,59701,,10,1305,1305,1,0,2630,,,,1952,,,0,61727,1,,,,,,0,61702,0 +"2020-06-02","RI",732,,12,,1743,1743,188,19,,48,101512,1400,,,149490,,31,15194,,107,0,,,,,20386,,168468,2994,168468,2994,,,,,116706,1507,169876,3248 +"2020-06-02","SC",501,501,1,,1789,1789,425,155,,,206362,13822,,,206362,,,12415,12415,267,0,,,,,18685,6976,,0,218777,14089,,,,,,0,225047,14221 +"2020-06-02","SD",62,,0,,443,443,89,8,,,41779,1152,,,,,,5067,,33,0,,,,,6671,3990,,0,51844,1546,,,,,46846,1185,51844,1546 +"2020-06-02","TN",381,381,14,,1792,1792,565,25,,,,0,,,437761,,,24375,24375,821,0,,,,,24375,15916,,0,462136,13643,,,,,462136,13643,462136,13643 +"2020-06-02","TX",1698,,20,,,,1773,0,,,,0,,,,,,66568,66568,1688,0,4258,18,,,90855,44517,,0,1206312,34283,107452,227,,,,0,1206312,34283 +"2020-06-02","UT",113,,0,,801,801,159,12,243,,213558,3605,,,240579,104,,10202,,203,0,,,,,11829,6319,,0,252408,4891,,,,,224069,3922,252408,4891 +"2020-06-02","VA",1407,1300,15,107,4770,4770,1362,76,,336,,0,,,,,186,46239,44069,841,0,2679,45,,,55298,,369281,7484,369281,7484,44853,137,,,,0,,0 +"2020-06-02","VI",6,,0,,,,,0,,,1936,195,,,,,,70,,0,0,,,,,,62,,0,2006,195,,,,,2012,197,,0 +"2020-06-02","VT",55,55,0,,,,10,0,,,34600,568,,,,,,987,987,2,0,,,,,,879,,0,41413,677,,,,,35587,570,41413,677 +"2020-06-02","WA",1124,1124,6,,3517,3517,473,16,,,,0,,,,,48,22960,22960,100,0,,,,,,,400375,8470,400375,8470,,,,,350457,6407,,0 +"2020-06-02","WI",607,607,12,,2643,2643,388,40,593,139,263743,10148,,,,,,21155,18917,419,0,,,,,,12172,365608,11971,365608,11971,,,,,282660,10522,,0 +"2020-06-02","WV",77,,2,,,,31,0,,11,,0,,,,,4,2041,1593,24,0,,,,,,1341,,0,99329,2254,5776,,,,,0,99329,2254 +"2020-06-02","WY",17,,0,,86,86,7,0,,,24832,595,,,28055,,,912,701,2,0,,,,,875,667,,0,28930,695,,,,,,0,28930,695 +"2020-06-01","AK",10,10,0,,50,50,10,0,,,,0,,,,,1,470,,7,0,,,,,,368,,0,54190,2495,,,,,,0,54190,2495 +"2020-06-01","AL",646,644,15,2,1856,1856,596,12,591,,205160,5510,,,,355,,18363,18075,460,0,,,,,,9355,,0,223235,1928,,,,,223235,1928,,0 +"2020-06-01","AR",133,,0,,711,711,115,0,,,125793,3531,,,,123,27,7443,7443,190,0,,,,,,5401,,0,133236,3721,,,,,,0,133236,3721 +"2020-06-01","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-06-01","AZ",917,,11,,3445,3445,968,66,,377,207947,2677,,,,,238,20123,,187,0,,,,,,,,0,314143,3481,,,93856,,228070,2864,314143,3481 +"2020-06-01","CA",4251,,38,,,,4258,0,,1273,,0,,,,,,113006,113006,2423,0,,,,,,,,0,2012583,67735,,,,,,0,2012583,67735 +"2020-06-01","CO",1458,1152,13,306,4372,4372,394,25,,,163960,3962,58311,,,,,26577,24109,199,0,4642,,,,,,218116,5096,218116,5096,62953,,,,188069,4122,,0 +"2020-06-01","CT",3964,3110,20,854,13793,13793,454,1255,,,,0,,,224128,,,42743,40670,542,0,,,,,51616,7511,,0,276843,2489,,,,,,0,276843,2489 +"2020-06-01","DC",468,,2,,,,302,0,,108,,0,,,,,67,8857,,56,0,,,,,,1126,47263,780,47263,780,,,,,38975,562,,0 +"2020-06-01","DE",471,414,3,57,,,159,0,,,52842,1669,,,,,,9605,,107,0,,,,,11726,5353,76477,1657,76477,1657,,,,,62447,1776,,0 +"2020-06-01","FL",2543,2543,9,,10494,10494,,41,,,983570,18384,,118053,1130070,,,55210,,700,0,,,5474,,77387,,1073626,24222,1073626,24222,,,123552,,1041318,19053,1210100,54450 +"2020-06-01","GA",2074,,32,,8127,8127,841,181,1800,,,0,,,,,,47618,47618,632,0,,,,,42761,,,0,467729,265,91184,,,,,0,467729,265 +"2020-06-01","GU",5,,0,,,,,0,,,6141,212,,,,,,175,167,2,0,2,,,,,145,,0,6316,214,85,,,,,0,6281,270 +"2020-06-01","HI",17,17,0,,83,83,,0,,,47835,-6134,,,,,,652,,1,0,,,,,620,608,54104,725,54104,725,,,,,,0,55336,716 +"2020-06-01","IA",551,,17,,,,339,0,,125,139384,2640,,17170,,,73,19697,19697,145,0,,,1869,,,11440,,0,159081,2785,,,19051,,159292,4344,,0 +"2020-06-01","ID",82,62,0,20,242,242,25,0,96,3,43858,0,,,,,,2839,2578,0,0,,,,,,2248,,0,46436,0,,,,,46436,0,,0 +"2020-06-01","IL",5412,5412,22,,,,3215,0,,902,,0,,,,,547,121234,121234,974,0,,,,,,,,0,918273,20014,,,,,918273,20014,918273,20014 +"2020-06-01","IN",2142,1976,8,166,5860,5860,1041,575,1255,366,231066,4094,,,,,148,34830,,256,0,,,,,35601,,,0,338510,2175,,,,,265896,4350,338510,2175 +"2020-06-01","KS",217,,9,,842,842,,0,284,,85230,0,,,,124,,10011,,292,0,,,,,,,,0,95241,292,,,,,,0,,0 +"2020-06-01","KY",439,438,8,1,2274,2274,457,2,940,90,,0,,,,,,10046,9853,342,0,,,,,,3232,,0,215853,2267,20563,,,,,0,215853,2267 +"2020-06-01","LA",2801,2690,10,111,,,661,0,,,347029,11836,,,,,86,40341,40341,425,0,,,,,,31728,,0,387370,12261,,,,,,0,387370,12261 +"2020-06-01","MA",7035,6894,189,141,9952,9952,1747,129,,404,502628,6740,,,,,289,100805,97291,3840,0,,,,,125632,78108,,0,762326,12892,,,,,599919,7066,762326,12892 +"2020-06-01","MD",2625,2505,29,120,8886,8886,1174,148,,479,255403,6300,,,,,,53327,53327,549,0,,,,,61245,3782,,0,351908,8772,,,,,308730,6849,351908,8772 +"2020-06-01","ME",89,89,0,,284,284,52,1,,17,,0,3757,,,,10,2349,2093,24,0,218,,,,2551,1586,,0,53450,1225,3983,,,,,0,53450,1225 +"2020-06-01","MI",5843,5627,25,242,,,674,0,,346,,0,,,581424,,240,63813,58417,245,0,,,,,77729,38099,,0,659153,14634,67783,,,,,0,659153,14634 +"2020-06-01","MN",1060,1050,10,10,3086,3086,549,39,981,253,260739,3606,,,,,,26897,26897,575,0,,,,,,19441,287636,4181,287636,4181,,,,,,0,,0 +"2020-06-01","MO",773,,1,,,,693,0,,,186381,5967,,23095,168871,,78,13327,13327,180,0,,,953,,14498,,,0,183650,0,,,24048,,199435,6055,183650,0 +"2020-06-01","MP",2,,0,,,,,0,,,6312,161,,,,,,22,22,0,0,,,,,,16,,0,6334,161,,,,,,0,6334,161 +"2020-06-01","MS",739,,5,,2296,2296,584,24,,146,160502,4166,,,,,97,15752,,251,0,,,,,,11203,,0,176254,4417,7740,,,,,0,176254,4417 +"2020-06-01","MT",17,,0,,67,67,2,0,,,,0,,,,,,519,,4,0,,,,,,461,,0,40657,859,,,,,,0,40657,859 +"2020-06-01","NC",898,898,12,,,,650,0,,,,0,,,,,,29263,29263,674,0,,,,,,,,0,412211,13931,,,,,,0,412211,13931 +"2020-06-01","ND",64,,0,,169,169,35,2,,,70676,1213,2681,,,,,2621,2621,47,0,91,,,,,2078,94967,2308,94967,2308,2772,,,,70849,1130,97028,2376 +"2020-06-01","NE",170,,0,,,,,0,,,89564,2327,,,105439,,,14101,,196,0,,,,,16564,,,0,122396,2250,,,,,103813,2523,122396,2250 +"2020-06-01","NH",245,,3,,451,451,96,2,141,,67805,2070,,,,,,4651,,106,0,,,,,,2948,,0,81238,1379,13590,,11838,,72456,2176,81238,1379 +"2020-06-01","NJ",13438,11721,26,1717,17222,17222,2466,25,,646,634682,48982,,,,,459,161278,160918,474,0,,,,,,,,0,795960,49456,,,,,,0,795600,50292 +"2020-06-01","NM",362,,6,,1317,1317,191,0,,,,0,,,,,,7800,,111,0,,,,,,2888,,0,203115,3511,,,,,,0,203115,3511 +"2020-06-01","NV",445,,1,,,,361,0,,87,138095,4128,,,,,40,8688,8688,95,0,,,,,,,188247,999,188247,999,,,,,146688,4227,169813,4799 +"2020-06-01","NY",23959,,54,,89703,89703,3331,113,,999,,0,,,,,746,371711,,941,0,,,,,,,2113777,49952,2113777,49952,,,,,,0,,0 +"2020-06-01","OH",2206,1993,51,213,6112,6112,761,63,1569,324,,0,,,,,223,35984,33501,471,0,,,,,39034,,,0,433337,11129,,,,,,0,433337,11129 +"2020-06-01","OK",334,,0,,986,986,154,1,,65,186700,0,,,186700,,,6573,6573,67,0,746,,,,7291,5511,,0,193273,67,20278,,,,,0,194496,0 +"2020-06-01","OR",153,,0,,786,786,117,8,,33,124958,2348,,,173457,,17,4243,,58,0,,,,,11743,2152,,0,185200,3694,,,,,129093,2400,185200,3694 +"2020-06-01","PA",5567,,12,,,,1302,0,,,389431,6320,,,,,287,72898,70278,352,0,616,,,,,48428,528521,8417,528521,8417,,,,,459709,12563,,0 +"2020-06-01","PR",136,63,0,73,,,99,0,,9,60422,0,,,59701,,4,1304,1304,0,0,2569,,,,1952,,,0,61726,0,,,,,,0,61702,0 +"2020-06-01","RI",720,,2,,1724,1724,195,23,,46,100112,1322,,,146504,,29,15087,,99,0,,,,,20124,,165474,1826,165474,1826,,,,,115199,1421,166628,2936 +"2020-06-01","SC",500,500,6,,1634,1634,450,0,,,192540,4185,,,192540,,,12148,12148,287,0,,,,,18286,6459,,0,204688,4472,,,,,,0,210826,4579 +"2020-06-01","SD",62,,0,,435,435,87,3,,,40627,1492,,,,,,5034,,41,0,,,,,6615,3903,,0,50298,1584,,,,,45661,1533,50298,1584 +"2020-06-01","TN",367,367,3,,1767,1767,504,17,,,,0,,,424939,,,23554,23554,548,0,,,,,23554,15564,,0,448493,12516,,,,,448493,12516,448493,12516 +"2020-06-01","TX",1678,,6,,,,1756,0,,,,0,,,,,,64880,64880,593,0,4080,12,,,88332,43338,,0,1172029,15911,103460,185,,,,0,1172029,15911 +"2020-06-01","UT",113,,0,,789,789,134,14,242,,209953,2774,,,236035,102,,9999,,202,0,,,,,11482,6251,,0,247517,3708,,,,,220147,2936,247517,3708 +"2020-06-01","VA",1392,1282,17,110,4694,4694,1371,51,,347,,0,,,,,188,45398,43247,791,0,2668,41,,,54481,,361797,7958,361797,7958,44694,133,,,,0,,0 +"2020-06-01","VI",6,,0,,,,,0,,,1741,108,,,,,,70,,1,0,,,,,,62,,0,1811,109,,,,,1815,94,,0 +"2020-06-01","VT",55,55,0,,,,16,0,,,34032,1285,,,,,,985,985,4,0,,,,,,880,,0,40736,1455,,,,,35017,1289,40736,1455 +"2020-06-01","WA",1118,1118,0,,3501,3501,497,21,,,,0,,,,,52,22860,22860,149,0,,,,,,,391905,8023,391905,8023,,,,,344050,6198,,0 +"2020-06-01","WI",595,595,3,,2603,2603,403,20,586,136,253595,3492,,,,,,20736,18543,172,0,,,,,,11838,353637,11441,353637,11441,,,,,272138,3632,,0 +"2020-06-01","WV",75,,0,,,,31,0,,11,,0,,,,,4,2017,1593,7,0,,,,,,1313,,0,97075,778,5650,,,,,0,97075,778 +"2020-06-01","WY",17,,1,,86,86,8,1,,,24237,747,,,27368,,,910,700,7,0,,,,,867,667,,0,28235,810,,,,,,0,28235,810 +"2020-05-31","AK",10,10,0,,50,50,14,0,,,,0,,,,,2,463,,28,0,,,,,,368,,0,51695,0,,,,,,0,51695,0 +"2020-05-31","AL",631,629,13,2,1844,1844,527,18,589,,199650,4808,,,,355,,17903,17614,544,0,,,,,,9355,,0,221307,9106,,,,,221307,9106,,0 +"2020-05-31","AR",133,,0,,711,711,115,9,,,122262,2778,,,,123,27,7253,7253,240,0,,,,,,5275,,0,129515,3018,,,,,,0,129515,3018 +"2020-05-31","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-05-31","AZ",906,,3,,3379,3379,973,45,,376,205270,7478,,,,,239,19936,,681,0,,,,,,,,0,310662,9103,,,93367,,225206,8159,310662,9103 +"2020-05-31","CA",4213,,57,,,,4331,0,,1324,,0,,,,,,110583,110583,3705,0,,,,,,,,0,1944848,56253,,,,,,0,1944848,56253 +"2020-05-31","CO",1445,1140,2,305,4347,4347,414,14,,,159998,5469,57298,,,,,26378,23949,280,0,4570,,,,,,213020,7532,213020,7532,61868,,,,183947,5751,,0 +"2020-05-31","CT",3944,,32,,12538,12538,481,0,,,,0,,,221755,,,42201,,179,0,,,,,51503,7127,,0,274354,3746,,,,,,0,274354,3746 +"2020-05-31","DC",466,,4,,,,295,0,,109,,0,,,,,66,8801,,84,0,,,,,,1116,46483,854,46483,854,,,,,38413,532,,0 +"2020-05-31","DE",468,411,2,57,,,160,0,,,51173,1266,,,,,,9498,,76,0,,,,,11617,5266,74820,2282,74820,2282,,,,,60671,1342,,0 +"2020-05-31","FL",2534,2534,4,,10453,10453,,78,,,965186,25642,,,1077549,,,54510,,870,0,,,,,75508,,1049404,26713,1049404,26713,,,,,1022265,26379,1155650,0 +"2020-05-31","GA",2042,,39,,7946,7946,853,25,1794,,,0,,,,,,46986,46986,700,0,,,,,42748,,,0,467464,30561,88461,,,,,0,467464,30561 +"2020-05-31","GU",5,,0,,,,,0,,,5929,0,,,,,,173,166,0,0,1,,,,,144,,0,6102,0,54,,,,,0,6011,0 +"2020-05-31","HI",17,17,0,,83,83,,0,,,53969,604,,,,,,651,,2,0,,,,,618,606,53379,829,53379,829,,,,,,0,54620,606 +"2020-05-31","IA",534,,3,,,,341,0,,116,136744,5565,,16810,,,70,19552,19552,308,0,,,1861,,,11147,,0,156296,5873,,,18682,,154948,4097,,0 +"2020-05-31","ID",82,62,0,20,242,242,29,2,96,3,43858,1237,,,,,,2839,2578,36,0,,,,,,2248,,0,46436,1264,,,,,46436,1264,,0 +"2020-05-31","IL",5390,5390,60,,,,3296,0,,941,,0,,,,,550,120260,120260,1343,0,,,,,,,,0,898259,21154,,,,,898259,898259,898259,21154 +"2020-05-31","IN",2134,1967,9,167,5285,5285,1050,0,1248,372,226972,4788,,,,,143,34574,,363,0,,,,,35461,,,0,336335,3398,,,,,261546,5151,336335,3398 +"2020-05-31","KS",208,,0,,842,842,,0,284,,85230,0,,,,124,,9719,,0,0,,,,,,,,0,94949,0,,,,,,-94780,,0 +"2020-05-31","KY",431,430,13,1,2272,2272,480,6,940,87,,0,,,,,,9704,9537,240,0,,,,,,3232,,0,213586,5552,20556,,,,,0,213586,5552 +"2020-05-31","LA",2791,2686,6,105,,,678,0,,,335193,5951,,,,,84,39916,39916,339,0,,,,,,28700,,0,375109,6290,,,,,,0,375109,6290 +"2020-05-31","MA",6846,6846,78,,9823,9823,1824,34,,436,495888,9670,,,,,,96965,96965,664,0,,,,,124696,78108,,0,749434,5062,,,,,592853,10334,749434,5062 +"2020-05-31","MD",2596,2476,34,120,8738,8738,1183,119,,479,249103,7172,,,,,,52778,52778,763,0,,,,,60534,3764,,0,343136,9412,,,,,301881,7935,343136,9412 +"2020-05-31","ME",89,89,0,,283,283,49,11,,18,,0,3757,,,,10,2325,2067,43,0,218,,,,2519,1552,,0,52225,1416,3983,,,,,0,52225,1416 +"2020-05-31","MI",5818,5601,16,240,,,774,0,,371,,0,,,567192,,250,63568,58254,247,0,,,,,77327,38099,,0,644519,13152,67783,,,,,0,644519,13152 +"2020-05-31","MN",1050,1040,14,10,3047,3047,555,36,971,257,257133,6741,,,,,,26322,26322,141,0,,,,,,18695,283455,6882,283455,6882,,,,,,0,,0 +"2020-05-31","MO",772,,1,,,,718,0,,,180414,7946,,23035,168871,,83,13147,12966,185,0,,,943,,14498,,,0,183650,0,,,23978,,193380,7946,183650,0 +"2020-05-31","MP",2,,0,,,,,0,,,6151,165,,,,,,22,22,0,0,,,,,,15,,0,6173,165,,,,,,0,6173,165 +"2020-05-31","MS",734,,11,,2272,2272,570,32,,113,156336,5633,,,,,108,15501,,272,0,,,,,,9401,,0,171837,5905,7629,,,,,0,171837,5905 +"2020-05-31","MT",17,,0,,67,67,2,0,,,,0,,,,,,515,,10,0,,,,,,456,,0,39798,514,,,,,,0,39798,514 +"2020-05-31","NC",886,886,9,,,,649,0,,,,0,,,,,,28589,28589,916,0,,,,,,,,0,398280,11978,,,,,,0,398280,11978 +"2020-05-31","ND",64,,1,,167,167,36,2,,,69463,1036,2599,,,,,2574,2574,23,0,89,,,,,1959,92659,2032,92659,2032,2688,,,,69719,970,94652,2084 +"2020-05-31","NE",170,,0,,,,,0,,,87237,1883,,,103403,,,13905,,251,0,,,,,16353,,,0,120146,3497,,,,,101290,2132,120146,3497 +"2020-05-31","NH",242,,4,,449,449,107,9,140,,65735,1267,,,,,,4545,,53,0,,,,,,2940,,0,79859,2732,13401,,11468,,70280,1320,79859,2732 +"2020-05-31","NJ",13412,11698,67,1714,17197,17197,2497,76,,522,585700,0,,,,,378,160804,160445,846,0,,,,,,,,0,746504,846,,,,,,0,745308,0 +"2020-05-31","NM",356,,5,,1317,1317,182,0,,,,0,,,,,,7689,,65,0,,,,,,2853,,0,199604,5157,,,,,,0,199604,5157 +"2020-05-31","NV",444,,5,,,,336,0,,71,133967,3930,,,,,41,8593,8593,98,0,,,,,,,187248,3875,187248,3875,,,,,142461,4047,165014,4515 +"2020-05-31","NY",23905,,57,,89590,89590,3436,190,,1050,,0,,,,,791,370770,,1110,0,,,,,,,2063825,58444,2063825,58444,,,,,,0,,0 +"2020-05-31","OH",2155,1944,6,211,6049,6049,779,38,1556,310,,0,,,,,213,35513,33073,479,0,,,,,38543,,,0,422208,12259,,,,,,0,422208,12259 +"2020-05-31","OK",334,,0,,985,985,154,3,,65,186700,0,,,186700,,,6506,6506,88,0,746,,,,7291,5492,,0,193206,88,20278,,,,,0,194496,0 +"2020-05-31","OR",153,,2,,778,778,131,7,,32,122610,4060,,,169867,,17,4185,,54,0,,,,,11639,2137,,0,181506,5163,,,,,126693,4114,181506,5163 +"2020-05-31","PA",5555,,18,,,,1352,0,,,383111,7370,,,,,296,72546,69916,515,0,620,,,,,48190,520104,10015,520104,10015,,,,,447146,1981,,0 +"2020-05-31","PR",136,63,3,73,,,99,0,,9,60422,0,,,59701,,1,1304,1304,4,0,2472,,,,1952,,,0,61726,4,,,,,,0,61702,0 +"2020-05-31","RI",718,,7,,1701,1701,206,19,,46,98790,850,,,143770,,29,14988,,76,0,,,,,19922,,163648,4123,163648,4123,,,,,113778,926,163692,1873 +"2020-05-31","SC",494,494,7,,1634,1634,402,0,,,188355,10230,,,188355,,,11861,11861,467,0,,,,,17892,6459,,0,200216,10697,,,,,,0,206247,6512 +"2020-05-31","SD",62,,0,,432,432,86,5,,,39135,1157,,,,,,4993,,33,0,,,,,6566,3837,,0,48714,2633,,,,,44128,1190,48714,2633 +"2020-05-31","TN",364,364,0,,1750,1750,463,18,,,,0,,,412971,,,23006,23006,440,0,,,,,23006,15300,,0,435977,8931,,,,,435977,8931,435977,8931 +"2020-05-31","TX",1672,,46,,,,1684,0,,,,0,,,,,,64287,64287,1949,0,4044,12,,,87508,42423,,0,1156118,19647,102928,168,,,,0,1156118,19647 +"2020-05-31","UT",113,,1,,775,775,142,12,242,,207179,3645,,,232513,102,,9797,,264,0,,,,,11296,6137,,0,243809,4840,,,,,217211,3877,243809,4840 +"2020-05-31","VA",1375,1274,5,101,4643,4643,1458,42,,371,,0,,,,,196,44607,42499,996,0,2627,41,,,53898,,353839,9839,353839,9839,44192,133,,,,0,,0 +"2020-05-31","VI",6,,0,,,,,0,,,1633,0,,,,,,69,,0,0,,,,,,61,,0,1702,0,,,,,1721,0,,0 +"2020-05-31","VT",55,55,0,,,,18,0,,,32747,1344,,,,,,981,981,4,0,,,,,,873,,0,39281,1520,,,,,33728,1348,39281,1520 +"2020-05-31","WA",1118,1118,7,,3480,3480,536,25,,,,0,,,,,67,22711,22711,344,0,,,,,,,383882,2922,383882,2922,,,,,337852,2344,,0 +"2020-05-31","WI",592,592,4,,2583,2583,414,20,585,133,250103,7195,,,,,,20564,18403,182,0,,,,,,11646,342196,11415,342196,11415,,,,,268506,7368,,0 +"2020-05-31","WV",75,,0,,,,33,0,,14,,0,,,,,8,2010,1593,36,0,,,,,,1303,,0,96297,1597,5638,,,,,0,96297,1597 +"2020-05-31","WY",16,,0,,85,85,13,0,,,23490,305,,,26566,,,903,693,5,0,,,,,859,658,,0,27425,203,,,,,,0,27425,203 +"2020-05-30","AK",10,10,0,,50,50,14,0,,,,0,,,,,2,435,,3,0,,,,,,368,,0,51695,2256,,,,,,0,51695,2256 +"2020-05-30","AL",618,618,13,,1826,1826,536,26,583,,194842,2782,,,,349,,17359,17359,536,0,,,,,,9355,,0,212201,3318,,,,,212201,3318,,0 +"2020-05-30","AR",133,,8,,702,702,104,35,,,119484,6254,,,,123,26,7013,7013,475,0,,,,,,5166,,0,126497,6729,,,,,,0,126497,6729 +"2020-05-30","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-05-30","AZ",903,,18,,3334,3334,975,53,,386,197792,6444,,,,,241,19255,,790,0,,,,,,,,0,301559,10822,,,90668,,217047,7234,301559,10822 +"2020-05-30","CA",4156,,88,,,,4215,0,,1273,,0,,,,,,106878,106878,2992,0,,,,,,,,0,1888595,53117,,,,,,0,1888595,53117 +"2020-05-30","CO",1443,1138,7,305,4333,4333,414,26,,,154529,4401,55644,,,,,26098,23667,485,0,4425,,,,,,205488,5703,205488,5703,60069,,,,178196,4896,,0 +"2020-05-30","CT",3912,,44,,12538,12538,533,0,,,,0,,,218226,,,42022,,260,0,,,,,51296,7127,,0,270608,7453,,,,,,0,270608,7453 +"2020-05-30","DC",462,,2,,,,317,0,,109,,0,,,,,66,8717,,179,0,,,,,,1100,45629,1771,45629,1771,,,,,37881,0,,0 +"2020-05-30","DE",466,409,3,57,,,174,0,,,49907,1610,,,,,,9422,,186,0,,,,,11436,5205,72538,2709,72538,2709,,,,,59329,1796,,0 +"2020-05-30","FL",2530,2530,35,,10375,10375,,132,,,939544,10802,,,1077549,,,53640,,752,0,,,,,75508,,1022691,14315,1022691,14315,,,,,995886,11726,1155650,51992 +"2020-05-30","GA",2003,,29,,7921,7921,850,69,1790,,,0,,,,,,46286,46286,616,0,,,,,40976,,,0,436903,8584,84803,,,,,0,436903,8584 +"2020-05-30","GU",5,,0,,,,,0,,,5929,6,,,,,,173,166,1,0,1,,,,,144,,0,6102,7,54,,,,,0,6011,0 +"2020-05-30","HI",17,17,0,,83,83,,0,,,53365,1188,,,,,,649,,2,0,,,,,616,605,52550,980,52550,980,,,,,,0,54014,1190 +"2020-05-30","IA",531,,9,,,,368,0,,118,131179,2785,,16786,,,69,19244,19244,318,0,,,1861,,,11019,,0,150423,3103,,,18658,,150851,136103,,0 +"2020-05-30","ID",82,62,0,20,240,240,30,2,96,,42621,629,,,,,,2803,2551,34,0,,,,,,2225,,0,45172,661,,,,,45172,661,,0 +"2020-05-30","IL",5330,5330,60,,,,3336,0,,925,,0,,,,,661,118917,118917,1462,0,,,,,,,,0,877105,25343,,,,,,0,877105,25343 +"2020-05-30","IN",2125,1958,15,167,5285,5285,1149,0,1166,412,222184,7029,,,,,161,34211,,653,0,,,,,35268,,,0,332937,9305,,,,,256395,7682,332937,9305 +"2020-05-30","KS",208,,0,,842,842,,0,284,,85230,0,,,,124,,9719,,0,0,,,,,,,,0,94949,0,,,,,94780,0,,0 +"2020-05-30","KY",418,417,9,1,2266,2266,499,86,940,81,,0,,,,,,9464,9303,280,0,,,,,,3231,,0,208034,-13084,19910,,,,,0,208034,-13084 +"2020-05-30","LA",2785,2680,19,105,,,674,0,,,329242,13017,,,,,84,39577,39577,775,0,,,,,,28700,,0,368819,13792,,,,,,0,368819,13792 +"2020-05-30","MA",6768,6768,50,,9789,9789,1904,64,,453,486218,9985,,,,,,96301,96301,789,0,,,,,124398,78108,,0,744372,7555,,,,,582519,10774,744372,7555 +"2020-05-30","MD",2562,2444,24,118,8619,8619,1239,140,,492,241931,8401,,,,,,52015,52015,1027,0,,,,,59667,3649,,0,333724,10845,,,,,293946,9428,333724,10845 +"2020-05-30","ME",89,89,4,,272,272,46,2,,18,,0,3757,,,,11,2282,2025,56,0,218,,,,2462,1505,,0,50809,1256,3983,,,,,0,50809,1256 +"2020-05-30","MI",5802,5578,24,240,,,774,0,,371,,0,,,554509,,250,63321,58065,205,0,,,,,76858,38099,,0,631367,16229,67783,,,,,0,631367,16229 +"2020-05-30","MN",1036,1026,30,10,3011,3011,589,75,960,263,250392,8268,,,,,,26181,26181,168,0,,,,,,17864,276573,8436,276573,8436,,,,,,0,,0 +"2020-05-30","MO",771,,33,,,,679,0,,,172468,7413,,22313,168871,,85,12962,12966,167,0,,,939,,14498,,,0,183650,0,,,23252,,185434,7763,183650,0 +"2020-05-30","MP",2,,0,,,,,0,,,5986,324,,,,,,22,22,0,0,,,,,,15,,0,6008,324,,,,,,0,6008,324 +"2020-05-30","MS",723,,13,,2240,2240,593,32,,145,150703,-815,,,,,92,15229,,439,0,,,,,,9401,,0,165932,-376,7536,,,,,0,165932,6959 +"2020-05-30","MT",17,,0,,67,67,2,0,,,,0,,,,,,505,,12,0,,,,,,448,,0,39284,755,,,,,,0,39284,755 +"2020-05-30","NC",877,877,18,,,,638,0,,,,0,,,,,,27673,27673,1185,0,,,,,,,,0,386302,16706,,,,,,0,386302,16706 +"2020-05-30","ND",63,,1,,165,165,34,1,,,68427,1494,,,,,,2551,2551,34,0,,,,,,1943,90627,2956,90627,2956,,,,,68749,1413,92568,3042 +"2020-05-30","NE",170,,6,,,,,0,,,85354,3812,,,100232,,,13654,,393,0,,,,,16029,,,0,116649,5425,,,,,99158,3971,116649,5425 +"2020-05-30","NH",238,,6,,440,440,105,2,120,,64468,1992,,,,,,4492,,106,0,,,,,,2802,,0,77127,2147,12987,,11169,,68960,2098,77127,2147 +"2020-05-30","NJ",13345,11634,106,1711,17121,17121,2626,161,,672,585700,28133,,,,,499,159958,159608,778,0,,,,,,,,0,745658,28911,,,,,,0,745308,28897 +"2020-05-30","NM",351,,7,,1317,1317,189,0,,,,0,,,,,,7624,,131,0,,,,,,2835,,0,194447,6186,,,,,,0,194447,6186 +"2020-05-30","NV",439,,4,,,,371,0,,92,130037,3971,,,,,42,8495,8495,145,0,,,,,,,183373,7923,183373,7923,,,,,138414,4058,160499,5084 +"2020-05-30","NY",23848,,68,,89400,89400,3619,206,,1124,,0,,,,,857,369660,,1376,0,,,,,,,2005381,61251,2005381,61251,,,,,,0,,0 +"2020-05-30","OH",2149,1938,18,211,6011,6011,806,64,1548,339,,0,,,,,219,35034,32639,468,0,,,,,37849,,,0,409949,11784,,,,,,0,409949,11784 +"2020-05-30","OK",334,,5,,982,982,154,0,,65,186700,5640,,,186700,,,6418,6418,80,0,746,,,,7291,5435,,0,193118,5720,20278,,,,,0,194496,5831 +"2020-05-30","OR",151,,0,,771,771,155,3,,36,118550,2989,,,164828,,21,4131,,45,0,,,,,11515,1981,,0,176343,4401,,,,,122579,3024,176343,4401 +"2020-05-30","PA",5537,,73,,,,1352,0,,,375741,8771,,,,,295,72031,69424,692,0,616,,,,,47133,510089,12049,510089,12049,,,,,445165,9430,,0 +"2020-05-30","PR",133,62,1,71,,,106,0,,6,60422,0,,,59701,,5,1300,1300,7,0,2418,,,,1952,,,0,61722,7,,,,,,0,61702,0 +"2020-05-30","RI",711,,18,,1682,1682,219,22,,50,97940,1828,,,142043,,32,14912,,104,0,,,,,19776,,159525,4340,159525,4340,,,,,112852,1932,161819,4169 +"2020-05-30","SC",487,487,4,,1634,1634,387,0,,,178125,999,,,178125,,,11394,11394,263,0,,,,,21610,6459,,0,189519,1262,,,,,,0,199735,5688 +"2020-05-30","SD",62,,3,,427,427,93,9,,,37978,2162,,,,,,4960,,94,0,,,,,6469,3805,,0,46081,1806,,,,,42938,2256,46081,1806 +"2020-05-30","TN",364,364,4,,1732,1732,516,22,,,,0,,,404480,,,22566,22566,481,0,,,,,22566,15193,,0,427046,5079,,,,,427046,5079,427046,5079 +"2020-05-30","TX",1626,,0,,,,1752,0,,,,0,,,,,,62338,62338,1332,0,3882,8,,,86154,40068,,0,1136471,39847,98932,154,,,,0,1136471,39847 +"2020-05-30","UT",112,,5,,763,763,139,10,241,,203534,3905,,,227939,102,,9533,,269,0,,,,,11030,5995,,0,238969,4973,,,,,213334,4201,238969,4973 +"2020-05-30","VA",1370,1269,12,101,4601,4601,1471,72,,372,,0,,,,,194,43611,41529,1078,0,2515,41,,,53077,,344000,11953,344000,11953,42431,133,,,,0,,0 +"2020-05-30","VI",6,,0,,,,,0,,,1633,0,,,,,,69,,0,0,,,,,,61,,0,1702,0,,,,,1721,0,,0 +"2020-05-30","VT",55,55,0,,,,17,0,,,31403,1303,,,,,,977,977,2,0,,,,,,865,,0,37761,1495,,,,,32380,1305,37761,1495 +"2020-05-30","WA",1111,1111,5,,3455,3455,541,42,,,,0,,,,,88,22367,22367,302,0,,,,,,,380960,4087,380960,4087,,,,,335508,3298,,0 +"2020-05-30","WI",588,588,20,,2563,2563,409,64,577,144,242908,9320,,,,,,20382,18230,539,0,,,,,,11338,330781,12296,330781,12296,,,,,261138,9843,,0 +"2020-05-30","WV",75,,1,,,,33,0,,14,,0,,,,,8,1974,1593,23,0,,,,,,1290,,0,94700,2521,5352,,,,,0,94700,2521 +"2020-05-30","WY",16,,1,,85,85,13,1,,,23185,807,,,26367,,,898,688,7,0,,,,,855,658,,0,27222,141,,,,,,0,27222,141 +"2020-05-29","AK",10,10,0,,50,50,14,1,,,,0,,,,,1,432,,5,0,,,,,,367,,0,49439,1469,,,,,,0,49439,1469 +"2020-05-29","AL",605,605,15,,1800,1800,590,35,577,,192060,7889,,,,344,,16823,16823,513,0,,,,,,9355,,0,208883,8402,,,,,208883,8402,,0 +"2020-05-29","AR",125,,5,,667,667,104,27,,,113230,866,,,,119,27,6538,6538,0,0,,,,,,4583,,0,119768,1127,,,,,,0,119768,1127 +"2020-05-29","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-05-29","AZ",885,,28,,3281,3281,931,58,,378,191348,6197,,,,,238,18465,,702,0,,,,,,,,0,290737,9146,,,87682,,209813,6899,290737,9146 +"2020-05-29","CA",4068,,95,,,,4414,0,,1328,,0,,,,,,103886,103886,2189,0,,,,,,,,0,1835478,44919,,,,,,0,1835478,44919 +"2020-05-29","CO",1436,1129,15,307,4307,4307,421,53,,,150128,6290,53222,,,,,25613,23172,492,0,4265,,,,,,199785,7915,199785,7915,57487,,,,173300,6704,,0 +"2020-05-29","CT",3868,,42,,12538,12538,577,0,,,,0,,,211142,,,41762,,203,0,,,,,50951,7127,,0,263155,8348,,,,,,0,263155,8348 +"2020-05-29","DC",460,,7,,,,338,0,,114,,0,,,,,65,8538,,46,0,,,,,,1089,43858,344,43858,344,,,,,37881,1597,,0 +"2020-05-29","DE",463,406,4,57,,,183,0,,,48297,667,,,,,,9236,,65,0,,,,,11255,5103,69829,1052,69829,1052,,,,,57533,732,,0 +"2020-05-29","FL",2495,2495,49,,10243,10243,,187,,,928742,30411,,,1028579,,,52888,,1221,0,,,,,72521,,1008376,36737,1008376,36737,,,,,984160,30839,1103658,22146 +"2020-05-29","GA",1974,,12,,7852,7852,889,85,1780,,,0,,,,,,45670,45670,600,0,,,,,40509,,,0,428319,9111,81736,,,,,0,428319,9111 +"2020-05-29","GU",5,,0,,,,,0,,,5923,133,,,,,,172,165,0,0,1,,,,,144,,0,6095,133,54,,,,,0,6011,117 +"2020-05-29","HI",17,17,0,,83,83,,0,,,52177,982,,,,,,647,,3,0,,,,,613,604,51570,898,51570,898,,,,,,0,52824,985 +"2020-05-29","IA",522,,18,,,,376,0,,117,128394,4034,,16050,,,78,18926,18926,353,0,,,1846,,,10753,,0,147320,4387,,,17906,,14748,-128611,,0 +"2020-05-29","ID",82,62,0,20,238,238,31,4,96,,41992,848,,,,,,2769,2519,38,0,,,,,,2195,,0,44511,882,,,,,44511,882,,0 +"2020-05-29","IL",5270,5270,84,,,,3599,0,,980,,0,,,,,593,117455,117455,1622,0,,,,,,,,0,851762,21796,,,,,,0,851762,21796 +"2020-05-29","IN",2110,1946,42,164,5285,5285,1149,0,1166,412,215155,5936,,,,,161,33558,,490,0,,,,,34726,,,0,323632,8880,,,,,248713,6426,323632,8880 +"2020-05-29","KS",208,,3,,842,842,,20,284,,85230,10079,,,,124,,9719,,382,0,,,,,,,,0,94949,10461,,,,,94780,10447,,0 +"2020-05-29","KY",409,408,9,1,2180,2180,494,38,937,88,,0,,,,,,9184,9028,107,0,,,,,,3181,,0,221118,39170,19112,,,,,0,221118,39170 +"2020-05-29","LA",2766,2661,26,105,,,714,0,,,316225,0,,,,,90,38802,38802,0,0,,,,,,28700,,0,355027,0,,,,,,0,355027,0 +"2020-05-29","MA",6718,6718,78,,9725,9725,1991,107,,485,476233,8805,,,,,,95512,95512,617,0,,,,,123935,78108,,0,736817,13476,,,,,571745,9422,736817,13476 +"2020-05-29","MD",2538,2421,37,117,8479,8479,1296,87,,507,233530,8381,,,,,,50988,50988,1279,0,,,,,58514,3571,,0,322879,11719,,,,,284518,9660,322879,11719 +"2020-05-29","ME",85,85,1,,270,270,53,6,,18,,0,3463,,,,12,2226,1971,37,0,198,,,,2416,1458,,0,49553,1420,3669,,,,,0,49553,1420 +"2020-05-29","MI",5778,5562,27,240,,,774,0,,371,,0,,,538868,,250,63116,57904,319,0,,,,,76270,33168,,0,615138,17310,67783,,,,,0,615138,17310 +"2020-05-29","MN",1006,996,29,10,2936,2936,592,56,938,259,242124,9929,,,,,,26013,26013,454,0,,,,,,16930,268137,10383,268137,10383,,,,,,0,,0 +"2020-05-29","MO",738,,31,,,,650,0,,,165055,6661,,21315,168871,,85,12795,12616,122,0,,,869,,14498,,,0,183650,0,,,22184,,177671,6807,183650,0 +"2020-05-29","MP",2,,0,,,,,0,,,5662,261,,,,,,22,22,0,0,,,,,,13,,0,5684,261,,,,,,0,5684,261 +"2020-05-29","MS",710,,17,,2208,2208,584,61,,121,151518,9393,,,,,77,14790,,418,0,,,,,,9401,,0,166308,9811,7335,,,,,0,158973,2476 +"2020-05-29","MT",17,,0,,67,67,2,1,,,,0,,,,,,493,,8,0,,,,,,448,,0,38529,1736,,,,,,0,38529,1736 +"2020-05-29","NC",859,859,32,,,,680,0,,,,0,,,,,,26488,26488,1076,0,,,,,,,,0,369596,10116,,,,,,0,369596,10116 +"2020-05-29","ND",62,,2,,164,164,36,3,,,66933,1160,,,,,,2517,2517,40,0,,,,,,1882,87671,2787,87671,2787,,,,,67336,1166,89526,2886 +"2020-05-29","NE",164,,1,,,,,0,,,81542,1538,,,95358,,,13261,,285,0,,,,,15483,,,0,111224,2083,,,,,95187,1840,111224,2083 +"2020-05-29","NH",232,,9,,438,438,110,12,120,,62476,1166,,,,,,4386,,100,0,,,,,,2730,,0,74980,2664,12607,,10553,,66862,1266,74980,2664 +"2020-05-29","NJ",13239,11531,135,1708,16960,16960,2707,182,,720,557567,29525,,,,,544,159180,158844,1050,0,,,,,,,,0,716747,30575,,,,,,0,716411,30554 +"2020-05-29","NM",344,,9,,1317,1317,193,0,,,,0,,,,,,7493,,129,0,,,,,,2728,,0,188261,4717,,,,,,0,188261,4717 +"2020-05-29","NV",435,,10,,,,371,0,,92,126066,3084,,,,,42,8350,8350,142,0,,,,,,,175450,6647,175450,6647,,,,,134356,3153,155415,3477 +"2020-05-29","NY",23780,,58,,89194,89194,3781,152,,1164,,0,,,,,889,368284,,1551,0,,,,,,,1944130,67341,1944130,67341,,,,,,0,,0 +"2020-05-29","OH",2131,1921,33,210,5947,5947,833,136,1533,326,,0,,,,,222,34566,32202,651,0,,,,,37183,,,0,398165,12092,,,,,,0,398165,12092 +"2020-05-29","OK",329,,3,,982,982,160,7,,68,181060,4924,,,181060,,,6338,6338,68,0,746,,,,7114,5340,,0,187398,4992,20278,,,,,0,188665,5033 +"2020-05-29","OR",151,,3,,768,768,149,9,,32,115561,2607,,,160519,,17,4086,,48,0,,,,,11423,1981,,0,171942,4654,,,,,119555,2654,171942,4654 +"2020-05-29","PA",5464,,91,,,,1445,0,,,366970,9166,,,,,313,71339,68765,1297,0,604,,,,,46370,498040,12443,498040,12443,,,,,435735,7889,,0 +"2020-05-29","PR",132,62,1,70,,,101,0,,12,60422,0,,,59701,,5,1293,1293,13,0,2354,,,,1952,,,0,61715,13,,,,,,0,61702,0 +"2020-05-29","RI",693,,16,,1660,1660,219,21,,47,96112,1537,,,138085,,33,14808,,178,0,,,,,19565,,155185,3716,155185,3716,,,,,110920,1715,157650,4317 +"2020-05-29","SC",483,483,13,,1634,1634,399,16,,,177126,5665,,,177126,,,11131,11131,343,0,,,,,16921,6459,,0,188257,6008,,,,,,0,194047,6259 +"2020-05-29","SD",59,,5,,418,418,95,12,,,35816,1583,,,,,,4866,,73,0,,,,,6397,3744,,0,44275,1388,,,,,40682,1656,44275,1388 +"2020-05-29","TN",360,360,4,,1710,1710,507,21,,,,0,,,399882,,,22085,22085,406,0,,,,,22085,14965,,0,421967,5978,,,,,421967,5978,421967,5978 +"2020-05-29","TX",1626,,25,,,,1701,0,,,,0,,,,,,61006,61006,1230,0,3782,5,,,83984,40068,,0,1096624,34685,96719,115,,,,0,1096624,34685 +"2020-05-29","UT",107,,1,,753,753,135,19,237,,199629,2790,,,223286,102,,9264,,343,0,,,,,10710,5813,,0,233996,4076,,,,,209133,3060,233996,4076 +"2020-05-29","VA",1358,1258,20,100,4529,4529,1524,87,,373,,0,,,,,193,42533,40477,1132,0,2407,41,,,51711,,332047,12362,332047,12362,40620,133,,,,0,,0 +"2020-05-29","VI",6,,0,,,,,0,,,1633,16,,,,,,69,,0,0,,,,,,61,,0,1702,16,,,,,1721,13,,0 +"2020-05-29","VT",55,55,0,,,,14,0,,,30100,808,,,,,,975,975,1,0,,,,,,859,,0,36266,934,,,,,31075,809,36266,934 +"2020-05-29","WA",1106,1106,11,,3413,3413,547,19,,,,0,,,,,85,22065,22065,351,0,,,,,,,376873,6840,376873,6840,,,,,332210,5392,,0 +"2020-05-29","WI",568,568,18,,2499,2499,423,47,567,144,233588,12869,,,,,,19843,17707,766,0,,,,,,10880,318485,12077,318485,12077,,,,,251295,13602,,0 +"2020-05-29","WV",74,,0,,,,33,0,,14,,0,,,,,8,1951,1593,45,0,,,,,,1241,,0,92179,3035,4998,,,,,0,92179,3035 +"2020-05-29","WY",15,,0,,84,84,13,2,,,22378,92,,,26227,,,891,682,15,0,,,,,854,634,,0,27081,696,,,,,,0,27081,696 +"2020-05-28","AK",10,10,0,,49,49,10,0,,,,0,,,,,,427,,13,0,,,,,,366,,0,47970,1607,,,,,,0,47970,1607 +"2020-05-28","AL",590,590,9,,1765,1765,527,46,566,,184171,4220,,,,338,,16310,16310,467,0,,,,,,9355,,0,200481,4687,,,,,200481,4687,,0 +"2020-05-28","AR",120,,0,,640,640,104,13,,,112364,3045,,,,118,27,6538,6538,261,0,,,,,,4583,,0,118641,3142,,,,,,0,118641,3142 +"2020-05-28","AS",0,,0,,,,,0,,,174,0,,,,,,0,0,0,0,,,,,,,,0,174,0,,,,,,0,174,0 +"2020-05-28","AZ",857,,26,,3223,3223,945,51,,374,185151,6147,,,,,222,17763,,501,0,,,,,,,,0,281591,8255,,,84691,,202914,6648,281591,8255 +"2020-05-28","CA",3973,,89,,,,4529,0,,1325,,0,,,,,,101697,101697,2717,0,,,,,,,,0,1790559,53665,,,,,,0,1790559,53665 +"2020-05-28","CO",1421,1115,29,306,4254,4254,464,58,,,143838,5482,50551,,,,,25121,22758,354,0,4101,,,,,,191870,7178,191870,7178,54652,,,,166596,5800,,0 +"2020-05-28","CT",3826,,23,,12538,12538,648,0,,,,0,,,203269,,,41559,,271,0,,,,,50506,7127,,0,254807,8584,,,,,,0,254807,8584 +"2020-05-28","DC",453,,8,,,,343,0,,108,,0,,,,,65,8492,,86,0,,,,,,1082,43514,817,43514,817,,,,,36284,602,,0 +"2020-05-28","DE",459,402,6,57,,,192,0,,,47630,1305,,,,,,9171,,75,0,,,,,11121,5010,68777,794,68777,794,,,,,56801,1380,,0 +"2020-05-28","FL",2446,2446,46,,10056,10056,,157,,,898331,17394,,,1007406,,,51667,,614,0,,,,,71569,,971639,19497,971639,19497,,,,,953321,18050,1081512,0 +"2020-05-28","GA",1962,,55,,7767,7767,903,101,1761,,,0,,,,,,45070,45070,649,0,,,,,39989,,,0,419208,7450,78173,,,,,0,419208,7450 +"2020-05-28","GU",5,,0,,,,,0,,,5790,275,,,,,,172,164,2,0,1,,,,,143,,0,5962,277,54,,,,,0,5894,145 +"2020-05-28","HI",17,17,0,,83,83,,0,,,51195,636,,,,,,644,,1,0,,,,,611,600,50672,610,50672,610,,,,,,0,51839,637 +"2020-05-28","IA",504,,13,,,,383,0,,112,124360,3194,,14324,,,67,18573,18573,213,0,,,1805,,,10359,,0,142933,3407,,,16138,,143359,3413,,0 +"2020-05-28","ID",82,62,1,20,234,234,30,3,95,,41144,826,,,,,,2731,2485,32,0,,,,,,2185,,0,43629,853,,,,,43629,853,,0 +"2020-05-28","IL",5186,5186,103,,,,3649,0,,1009,,0,,,,,576,115833,115833,1527,0,,,,,,,,0,829966,25993,,,,,,0,829966,25993 +"2020-05-28","IN",2068,1907,38,161,5285,5285,1131,0,1166,411,209219,6323,,,,,178,33068,,631,0,,,,,34150,,,0,314752,7944,,,,,242287,6954,314752,7944 +"2020-05-28","KS",205,,0,,822,822,,0,275,,75151,0,,,,122,,9337,,0,0,,,,,,,,0,84488,0,,,,,84333,0,,0 +"2020-05-28","KY",400,399,0,1,2142,2142,512,6,899,82,,0,,,,,,9077,8924,0,0,,,,,,3124,,0,181948,0,18814,,,,,0,181948,0 +"2020-05-28","LA",2740,2635,18,105,,,761,0,,,316225,7075,,,,,100,38802,38802,305,0,,,,,,28700,,0,355027,7380,,,,,,0,355027,7380 +"2020-05-28","MA",6640,6640,93,,9618,9618,2112,126,,529,467428,9504,,,,,,94895,94895,675,0,,,,,122913,78108,,0,723341,12813,,,,,562323,16842,723341,12813 +"2020-05-28","MD",2501,2386,43,115,8392,8392,1334,111,,511,225149,11517,,,,,,49709,49709,1286,0,,,,,57193,3468,,0,311160,16354,,,,,274858,12803,311160,16354 +"2020-05-28","ME",84,84,3,,264,264,58,4,,22,,0,3463,,,,14,2189,1951,52,0,198,,,,2356,1402,,0,48133,1213,3669,,,,,0,48133,1213 +"2020-05-28","MI",5751,5538,24,240,,,860,0,,405,,0,,,522663,,251,62797,57695,336,0,,,,,75165,33168,,0,597828,18146,67783,,,,,0,597828,18146 +"2020-05-28","MN",977,967,35,10,2880,2880,606,84,924,242,232195,9374,,,,,,25559,25559,571,0,,,,,,16655,257754,9945,257754,9945,,,,,,0,,0 +"2020-05-28","MO",707,,11,,,,648,0,,,158394,5365,,21094,168871,,88,12673,12470,181,0,,,833,,14498,,,0,183650,0,,,21957,,170864,5560,183650,0 +"2020-05-28","MP",2,,0,,,,,0,,,5401,223,,,,,,22,22,0,0,,,,,,13,,0,5423,223,,,,,,0,5423,223 +"2020-05-28","MS",693,,23,,2147,2147,594,41,,148,142125,8037,,,,,78,14372,,328,0,,,,,,9401,,0,156497,8365,7033,,,,,0,156497,8678 +"2020-05-28","MT",17,,0,,66,66,1,0,,,,0,,,,,,485,,4,0,,,,,,445,,0,36793,1150,,,,,,0,36793,1150 +"2020-05-28","NC",827,827,33,,,,708,0,,,,0,,,,,,25412,25412,784,0,,,,,,,,0,359480,11573,,,,,,0,359480,11573 +"2020-05-28","ND",60,,1,,161,161,35,0,,,65773,872,,,,,,2477,2477,41,0,,,,,,1793,84884,1890,84884,1890,,,,,66170,813,86640,1973 +"2020-05-28","NE",163,,10,,,,,0,,,80004,2202,,,93625,,,12976,,357,0,,,,,15135,,,0,109141,3365,,,,,93347,2599,109141,3365 +"2020-05-28","NH",223,,9,,426,426,105,5,120,,61310,1309,,,,,,4286,,55,0,,,,,,2691,,0,72316,1802,12235,,10262,,65596,1364,72316,1802 +"2020-05-28","NJ",13104,11401,67,1703,16778,16778,2797,181,,740,528042,24345,,,,,564,158130,157815,1204,0,,,,,,,,0,686172,25549,,,,,,0,685857,25532 +"2020-05-28","NM",335,,6,,1317,1317,196,35,,,,0,,,,,,7364,,112,0,,,,,,2684,,0,183544,4001,,,,,,0,183544,4001 +"2020-05-28","NV",425,,9,,,,439,0,,123,122982,2536,,,,,55,8208,8208,95,0,,,,,,,168803,8213,168803,8213,,,,,131203,2521,151938,3413 +"2020-05-28","NY",23722,,79,,89042,89042,4010,176,,1219,,0,,,,,931,366733,,1768,0,,,,,,,1876789,65245,1876789,65245,,,,,,0,,0 +"2020-05-28","OH",2098,1888,54,210,5811,5811,812,111,1516,285,,0,,,,,190,33915,31625,476,0,,,,,36515,,,0,386073,8782,,,,,,0,386073,8782 +"2020-05-28","OK",326,,4,,975,975,181,34,,80,176136,3727,,,176136,,,6270,6270,41,0,628,,,,7006,5236,,0,182406,3768,17160,,,,,0,183632,3790 +"2020-05-28","OR",148,,0,,759,759,146,7,,35,112954,1383,,,156627,,16,4038,,71,0,,,,,10661,1795,,0,167288,3647,,,,,116901,1451,167288,3647 +"2020-05-28","PA",5373,,108,,,,1476,0,,,357804,7814,,,,,321,70042,68104,625,0,576,,,,,44826,485597,10476,485597,10476,,,,,427846,10341,,0 +"2020-05-28","PR",131,61,2,70,,,120,0,,12,60422,19934,,,59701,,5,1280,1280,20,0,2206,,,,1952,,,0,61702,19954,,,,,,0,61702,20001 +"2020-05-28","RI",677,,22,,1639,1639,222,15,,53,94575,1071,,,134183,,36,14630,,132,0,,,,,19150,,151469,2341,151469,2341,,,,,109205,1203,153333,3618 +"2020-05-28","SC",470,470,4,,1618,1618,397,0,,,171461,6401,,,171461,,,10788,10788,165,0,,,,,16327,6102,,0,182249,6566,,,,,,0,187788,6634 +"2020-05-28","SD",54,,0,,406,406,105,15,,,34233,937,,,,,,4793,,83,0,,,,,6301,3698,,0,42887,769,,,,,39026,1020,42887,769 +"2020-05-28","TN",356,356,3,,1689,1689,545,42,,,,0,,,394310,,,21679,21679,373,0,,,,,21679,14632,,0,415989,6359,,,,,415989,6359,415989,6359 +"2020-05-28","TX",1601,,39,,,,1692,0,,,,0,,,,,,59776,59776,1855,0,3445,5,,,81893,38905,,0,1061939,38986,88643,89,,,,0,1061939,38986 +"2020-05-28","UT",106,,1,,734,734,169,18,231,,196839,3143,,,219524,98,,8921,,215,0,,,,,10396,5623,,0,229920,4520,,,,,206073,3427,229920,4520 +"2020-05-28","VA",1338,1236,57,102,4442,4442,1502,57,,416,,0,,,,,195,41401,39393,1152,0,2254,41,,,50205,,319685,11757,319685,11757,38326,132,,,,0,,0 +"2020-05-28","VI",6,,0,,,,,0,,,1617,175,,,,,,69,,0,0,,,,,,61,,0,1686,175,,,,,1708,169,,0 +"2020-05-28","VT",55,55,1,,,,17,0,,,29292,718,,,,,,974,974,4,0,,,,,,855,,0,35332,921,,,,,30266,722,35332,921 +"2020-05-28","WA",1095,1095,17,,3394,3394,524,56,,,,0,,,,,94,21714,21714,400,0,,,,,,,370033,6822,370033,6822,,,,,326818,5232,,0 +"2020-05-28","WI",550,550,11,,2452,2452,408,41,556,138,220719,10114,,,,,,19077,16974,564,0,,,,,,10384,306408,12594,306408,12594,,,,,237693,10626,,0 +"2020-05-28","WV",74,,0,,,,35,0,,13,,0,,,,,6,1906,1593,39,0,,,,,,1211,,0,89144,1703,4628,,,,,0,89144,1703 +"2020-05-28","WY",15,,2,,82,82,15,0,,,22286,1634,,,25544,,,876,667,16,0,,,,,841,624,,0,26385,1869,,,,,,0,26385,1869 +"2020-05-27","AK",10,10,0,,49,49,14,0,,,,0,,,,,,414,,1,0,,,,,,364,,0,46363,1399,,,,,,0,46363,1399 +"2020-05-27","AL",581,581,6,,1719,1719,607,48,560,,179951,1588,,,,334,,15843,15843,447,0,,,,,,7951,,0,195794,2035,,,,,195794,2035,,0 +"2020-05-27","AR",120,,1,,627,627,108,10,,,109319,3726,,,,116,22,6277,6277,97,0,,,,,,4424,,0,115499,3877,,,,,,0,115499,3877 +"2020-05-27","AS",0,,0,,,,,0,,,174,50,,,,,,0,0,0,0,,,,,,,,0,174,50,,,,,,0,174,50 +"2020-05-27","AZ",831,,24,,3172,3172,911,50,,375,179004,5056,,,,,237,17262,,479,0,,,,,,,,0,273336,9151,,,83284,,196266,5535,273336,9151 +"2020-05-27","CA",3884,,70,,,,4544,0,,1407,,0,,,,,,98980,98980,2247,0,,,,,,,,0,1736894,40498,,,,,,0,1736894,40498 +"2020-05-27","CO",1392,1096,40,296,4196,4196,464,36,,,138356,3501,48670,,,,,24767,22440,202,0,3990,,,,,,184692,4440,184692,4440,52660,,,,160796,3760,,0 +"2020-05-27","CT",3803,,34,,12538,12538,684,0,,,,0,,,195342,,,41288,,-15,0,,,,,49879,7127,,0,246223,9022,,,,,,0,246223,9022 +"2020-05-27","DC",445,,5,,,,349,0,,113,,0,,,,,76,8406,,72,0,,,,,,1082,42697,642,42697,642,,,,,35682,420,,0 +"2020-05-27","DE",453,397,9,56,,,196,0,,,46325,477,,,,,,9096,,30,0,,,,,11041,4909,67983,1744,67983,1744,,,,,55421,507,,0 +"2020-05-27","FL",2400,2400,62,,9899,9899,,159,,,880937,9968,,,1007406,,,51053,,475,0,,,,,71569,,952142,13972,952142,13972,,,,,935271,10351,1081512,12833 +"2020-05-27","GA",1907,,36,,7666,7666,907,119,1735,,,0,,,,,,44421,44421,691,0,,,,,39537,,,0,411758,7524,77835,,,,,0,411758,7524 +"2020-05-27","GU",5,,0,,,,1,0,,,5515,0,,,,,,170,163,1,0,1,,,,,143,,0,5685,1,54,,,,,0,5749,5749 +"2020-05-27","HI",17,17,0,,83,83,,-1,,,50559,831,,,,,,643,,0,0,,,,,610,593,50062,454,50062,454,,,,,,0,51202,831 +"2020-05-27","IA",491,,13,,,,393,0,,109,121166,3865,,14071,,,66,18360,18360,657,0,,,1795,,,10016,,0,139526,4522,,,15875,,139946,4639,,0 +"2020-05-27","ID",81,61,2,20,231,231,24,6,95,,40318,1538,,,,,,2699,2458,73,0,,,,,,2100,,0,42776,1609,,,,,42776,1609,,0 +"2020-05-27","IL",5083,5083,160,,,,3826,0,,1031,,0,,,,,592,114306,114306,1111,0,,,,,,,,0,803973,17179,,,,,,0,803973,17179 +"2020-05-27","IN",2030,1871,26,159,5285,5285,1122,0,1166,400,202896,4225,,,,,182,32437,,359,0,,,,,33609,,,0,306808,9869,,,,,235333,4584,306808,9869 +"2020-05-27","KS",205,,17,,822,822,,22,275,,75151,2970,,,,122,,9337,,119,0,,,,,,,,0,84488,3089,,,,,84333,3088,,0 +"2020-05-27","KY",400,399,9,1,2136,2136,489,5,897,78,,0,,,,,,9077,8924,506,0,,,,,,3124,,0,181948,12212,18814,,,,,0,181948,12212 +"2020-05-27","LA",2722,2617,21,105,,,798,0,,,309150,6178,,,,,100,38497,38497,443,0,,,,,,28700,,0,347647,6621,,,,,,0,347647,6621 +"2020-05-27","MA",6547,6473,74,,9492,9492,2106,104,,556,457924,6136,,,,,,94220,93693,527,0,,,,,121749,,,0,710528,13943,,,,,545481,0,710528,13943 +"2020-05-27","MD",2458,2343,41,115,8281,8281,1338,102,,520,213632,6832,,,,,,48423,48423,736,0,,,,,55245,3401,,0,294806,10556,,,,,262055,7568,294806,10556 +"2020-05-27","ME",81,81,2,,260,260,59,2,,25,,0,3463,,,,14,2137,1914,28,0,198,,,,2324,1357,,0,46920,904,3669,,,,,-28357,46920,904 +"2020-05-27","MI",5727,5511,24,240,,,882,0,,388,,0,,,505609,,272,62461,57477,386,0,,,,,74073,33168,,0,579682,18587,67783,,,,,0,579682,18587 +"2020-05-27","MN",942,932,34,10,2796,2796,598,87,902,260,222821,8847,,,,,,24988,24988,680,0,,,,,,16314,247809,9527,247809,9527,,,,,,0,,0 +"2020-05-27","MO",696,,10,,,,644,0,,,153029,5022,,19123,168871,,84,12492,12275,201,0,,,813,,14498,,,0,183650,0,,,19936,,165304,5191,183650,0 +"2020-05-27","MP",2,,0,,,,,0,,,5178,260,,,,,,22,22,0,0,,,,,,13,,0,5200,260,,,,,,0,5200,260 +"2020-05-27","MS",670,,18,,2106,2106,547,36,,127,134088,0,,,,,73,14044,,313,0,,,,,,9401,,0,148132,313,6805,,,,,0,147819,0 +"2020-05-27","MT",17,,0,,66,66,2,1,,,,0,,,,,,481,,2,0,,,,,,444,,0,35643,1809,,,,,,0,35643,1809 +"2020-05-27","NC",794,794,28,,,,702,0,,,,0,,,,,,24628,24628,488,0,,,,,,,,0,347907,3571,,,,,,0,347907,3571 +"2020-05-27","ND",59,,5,,161,161,40,5,,,64901,469,,,,,,2436,2436,17,0,,,,,,1762,82994,1000,82994,1000,,,,,65357,482,84667,1046 +"2020-05-27","NE",153,,3,,,,,0,,,77802,2115,,,90718,,,12619,,264,0,,,,,14709,,,0,105776,1976,,,,,90748,2398,105776,1976 +"2020-05-27","NH",214,,4,,421,421,91,1,120,,60001,1159,,,,,,4231,,34,0,,,,,,2550,,0,70514,2433,11776,,10031,,64232,1193,70514,2433 +"2020-05-27","NJ",13037,11339,151,1698,16597,16597,2761,224,,768,503697,23569,,,,,583,156926,156628,880,0,,,,,,,,0,660623,24449,,,,,,0,660325,24433 +"2020-05-27","NM",329,,4,,1282,1282,210,0,,,,0,,,,,,7252,,122,0,,,,,,2638,,0,179543,-1103,,,,,,0,179543,-1103 +"2020-05-27","NV",416,,4,,,,435,0,,108,120446,5076,,,,,48,8113,8113,116,0,,,,,,,160590,6450,160590,6450,,,,,128682,5363,148525,5692 +"2020-05-27","NY",23643,,79,,88866,88866,4208,180,,1261,,0,,,,,988,364965,,1129,0,,,,,,,1811544,37416,1811544,37416,,,,,,0,,0 +"2020-05-27","OH",2044,1842,42,202,5700,5700,885,121,1492,313,,0,,,,,217,33439,31191,433,0,,,,,36026,,,0,377291,7620,,,,,,0,377291,7620 +"2020-05-27","OK",322,,4,,941,941,156,0,,74,172409,18605,,,172409,,,6229,6229,92,0,628,,,,6948,5135,,0,178638,18697,17160,,,,,0,179842,18939 +"2020-05-27","OR",148,,0,,752,752,149,5,,40,111571,1662,,,153100,,17,3967,,18,0,,,,,10541,1795,,0,163641,2932,,,,,115450,1680,163641,2932 +"2020-05-27","PA",5265,,113,,,,1493,0,,,349990,10155,,,,,351,69417,67515,780,0,576,,,,,43038,475121,13587,475121,13587,,,,,417505,10891,,0 +"2020-05-27","PR",129,61,0,68,,,105,0,,8,40488,0,,,40095,,4,1260,1260,19,0,2137,,,,1572,,,0,41748,19,,,,,,0,41701,0 +"2020-05-27","RI",655,,21,,1624,1624,218,11,,49,93504,1104,,,130902,,35,14498,,133,0,,,,,18813,,149128,2904,149128,2904,,,,,108002,1237,149715,2327 +"2020-05-27","SC",466,466,20,,1618,1618,398,0,,,165060,2742,,,165060,,,10623,10623,207,0,,,,,16094,6102,,0,175683,2949,,,,,,0,181154,3035 +"2020-05-27","SD",54,,4,,391,391,101,13,,,33296,911,,,,,,4710,,57,0,,,,,6230,3619,,0,42118,673,,,,,38006,968,42118,673 +"2020-05-27","TN",353,353,10,,1647,1647,501,38,,,,0,,,388324,,,21306,21306,341,0,,,,,21306,13916,,0,409630,6126,,,,,409630,6126,409630,6126 +"2020-05-27","TX",1562,,26,,,,1645,0,,,,0,,,,,,57921,57921,1361,0,3406,3,,,79538,37626,,0,1022953,41047,87565,62,,,,0,1022953,41047 +"2020-05-27","UT",105,,4,,716,716,127,20,223,,193696,2522,,,215319,94,,8706,,86,0,,,,,10081,5499,,0,225400,3349,,,,,202646,2732,225400,3349 +"2020-05-27","VA",1281,1202,45,79,4385,4385,1459,60,,390,,0,,,,,203,40249,38276,907,0,2144,41,,,48969,,307928,11501,307928,11501,36965,132,,,,0,,0 +"2020-05-27","VI",6,,0,,,,,0,,,1442,17,,,,,,69,,0,0,,,,,,61,,0,1511,17,,,,,1539,27,,0 +"2020-05-27","VT",54,54,0,,,,21,0,,,28574,155,,,,,,970,970,2,0,,,,,,849,,0,34411,236,,,,,29544,157,34411,236 +"2020-05-27","WA",1078,1078,8,,3338,3338,521,48,,,,0,,,,,53,21314,21314,149,0,,,,,,,363211,7309,363211,7309,,,,,321586,5743,,0 +"2020-05-27","WI",539,539,22,,2411,2411,413,49,550,139,210605,9731,,,,,,18513,16462,646,0,,,,,,9846,293814,13635,293814,13635,,,,,227067,10330,,0 +"2020-05-27","WV",74,,0,,,,36,0,,13,,0,,,,,6,1867,1593,13,0,,,,,,1191,,0,87441,977,4284,,,,,0,87441,977 +"2020-05-27","WY",13,,0,,82,82,12,0,,,20652,0,,,23689,,,860,653,10,0,,,,,827,607,,0,24516,975,,,,,,0,24516,975 +"2020-05-26","AK",10,10,0,,49,49,12,0,,,,0,,,,,,413,,2,0,,,,,,362,,0,44964,492,,,,,,0,44964,492 +"2020-05-26","AL",575,575,13,,1671,1671,569,42,551,,178363,2778,,,,327,,15396,15396,666,0,,,,,,7951,,0,193759,3444,,,,,193759,3444,,0 +"2020-05-26","AR",119,,2,,617,617,107,12,,,105593,0,,,,114,18,6180,6180,151,0,,,,,,4332,,0,111622,0,,,,,,0,111622,0 +"2020-05-26","AS",0,,0,,,,,0,,,124,0,,,,,,0,0,0,0,,,,,,,,0,124,0,,,,,,0,124,0 +"2020-05-26","AZ",807,,1,,3122,3122,818,45,,336,173948,2727,,,,,208,16783,,222,0,,,,,,,,0,264185,3181,,,82338,,190731,2949,264185,3181 +"2020-05-26","CA",3814,,19,,,,4404,0,,1392,,0,,,,,,96733,96733,2175,0,,,,,,,,0,1696396,52294,,,,,,0,1696396,52294 +"2020-05-26","CO",1352,1075,19,275,4160,4160,484,32,,,134855,3113,47419,,,,,24565,22208,296,0,3913,,,,,,180252,4175,180252,4175,51332,,,,157036,3353,,0 +"2020-05-26","CT",3769,,27,,12538,12538,694,0,,,,0,,,187001,,,41303,,430,0,,,,,49235,7127,,0,237201,2255,,,,,,0,237201,2255 +"2020-05-26","DC",440,,0,,,,353,0,,113,,0,,,,,76,8334,,109,0,,,,,,1080,42055,1252,42055,1252,,,,,35262,1068,,0 +"2020-05-26","DE",444,389,8,55,,,201,0,,,45848,917,,,,,,9066,,101,0,,,,,10914,4802,66239,1014,66239,1014,,,,,54914,1018,,0 +"2020-05-26","FL",2338,2338,7,,9740,9740,,59,,,870969,14480,,,995118,,,50578,,503,0,,,,,71039,,938170,18066,938170,18066,,,,,924920,14992,1068679,18432 +"2020-05-26","GA",1871,,41,,7547,7547,854,72,1703,,,0,,,,,,43730,43344,386,0,,,,,39250,,,0,404234,3672,,,,,,0,404234,3672 +"2020-05-26","GU",5,,0,,,,,0,,,5515,112,,,,,,169,161,3,0,,,,,,139,,0,5684,115,,,,,,0,,0 +"2020-05-26","HI",17,17,0,,84,84,,0,,,49728,0,,,,,,643,,0,0,,,,,610,592,49608,445,49608,445,,,,,,0,50371,0 +"2020-05-26","IA",478,,19,,,,379,0,,115,117301,2163,,13806,,,65,17703,17703,126,0,,,1787,,,9791,,0,135004,2289,,,15597,,135307,2261,,0 +"2020-05-26","ID",79,59,0,20,225,225,19,0,94,,38780,0,,,,,,2626,2387,0,0,,,,,,1755,,0,41167,0,,,,,41167,0,,0 +"2020-05-26","IL",4923,4923,39,,,,3788,0,,1035,,0,,,,,590,113195,113195,1178,0,,,,,,,,0,786794,17230,,,,,,0,786794,17230 +"2020-05-26","IN",2004,1850,28,154,5285,5285,1088,0,1166,365,198671,4135,,,,,163,32078,,363,0,,,,,32841,,,0,296939,2258,,,,,230749,4498,296939,2258 +"2020-05-26","KS",188,,0,,800,800,,0,271,,72181,0,,,,120,,9218,,0,0,,,,,,,,0,81399,0,,,,,81245,0,,0 +"2020-05-26","KY",391,390,0,1,2131,2131,484,0,897,89,,0,,,,,,8571,8451,0,0,,,,,,3102,,0,169736,0,,,,,,0,169736,0 +"2020-05-26","LA",2701,2596,11,105,,,831,0,,,302972,9883,,,,,103,38054,38054,245,0,,,,,,28700,,0,341026,10128,,,,,,0,341026,10128 +"2020-05-26","MA",6473,6473,57,,9388,9388,2108,49,,560,451788,4498,,,,,,93693,93693,422,0,,,,,120525,,,0,696585,15436,,,,,545481,4920,696585,15436 +"2020-05-26","MD",2417,2302,38,115,8179,8179,1315,87,,520,206800,4375,,,,,,47687,47687,535,0,,,,,53775,3334,,0,284250,6126,,,,,254487,4910,284250,6126 +"2020-05-26","ME",79,79,1,,258,258,60,1,,26,,0,2704,,,,13,2109,1894,35,0,177,,,,2294,1318,,0,46016,872,2884,,,,28357,0,46016,872 +"2020-05-26","MI",5703,5487,25,240,,,953,0,,449,,0,,,487906,,319,62075,57205,443,0,,,,,73189,33168,,0,561095,11988,67783,,,,,0,561095,11988 +"2020-05-26","MN",908,899,18,9,2709,2709,570,33,886,258,213974,6158,,,,,,24308,24308,784,0,,,,,,15523,238282,6942,238282,6942,,,,,,0,,0 +"2020-05-26","MO",686,,1,,,,500,0,,,148007,2789,,19050,168871,,82,12291,12106,124,0,,,780,,14498,,,0,183650,3530,,,19830,,160113,2982,183650,3530 +"2020-05-26","MP",2,,0,,,,,0,,,4918,183,,,,,,22,22,0,0,,,,,,13,,0,4940,183,,,,,,0,4940,183 +"2020-05-26","MS",652,,17,,2070,2070,561,24,,134,134088,3629,,,,,81,13731,,273,0,,,,,,9401,,0,147819,3902,6805,,,,,0,147819,3902 +"2020-05-26","MT",17,,1,,65,65,2,0,,,,0,,,,,,479,,0,0,,,,,,441,,0,33834,152,,,,,,0,33834,152 +"2020-05-26","NC",766,766,12,,,,621,0,,,,0,,,,,,24140,24140,176,0,,,,,,,,0,344336,7748,,,,,,0,344336,7748 +"2020-05-26","ND",54,,0,,156,156,40,2,,,64432,539,,,,,,2419,2419,43,0,,,,,,1701,81994,920,81994,920,,,,,64875,557,83621,988 +"2020-05-26","NE",150,,0,,,,,0,,,75687,2089,,,88998,,,12355,,221,0,,,,,14457,,,0,103800,2714,,,,,88350,2323,103800,2714 +"2020-05-26","NH",210,,1,,420,420,91,1,120,,58842,1605,,,,,,4197,,48,0,,,,,,2434,,0,68081,2104,11507,,9790,,63039,1653,68081,2104 +"2020-05-26","NJ",12886,11191,52,1695,16373,16373,2723,16373,,786,480128,11423,,,,,578,156046,155764,676,0,,,,,,,,0,636174,12099,,,,,,0,635892,12095 +"2020-05-26","NM",325,,5,,1282,1282,211,18,,,,0,,,,,,7130,,104,0,,,,,,2564,,0,180646,3285,,,,,,0,180646,3285 +"2020-05-26","NV",412,,2,,,,390,0,,91,115370,8518,,,,,46,7997,7997,118,0,,,,,,,154140,1799,154140,1799,,,,,123319,8615,142833,9325 +"2020-05-26","NY",23564,,76,,88686,88686,4265,132,,1273,,0,,,,,1002,363836,,1072,0,,,,,,,1774128,34679,1774128,34679,,,,,,0,,0 +"2020-05-26","OH",2002,1803,15,199,5579,5579,937,68,1450,351,,0,,,,,232,33006,30827,529,0,,,,,35538,,,0,369671,8497,,,,,,0,369671,8497 +"2020-05-26","OK",318,,5,,941,941,174,3,,78,153804,-1139,,,153804,,,6137,6137,47,0,628,,,,6696,4823,,0,159941,-1092,17160,,,,,0,160903,0 +"2020-05-26","OR",148,,0,,747,747,125,5,,35,109909,1641,,,150206,,23,3949,,22,0,,,,,10503,1376,,0,160709,2684,,,,,113770,1660,160709,2684 +"2020-05-26","PA",5152,,13,,,,1493,0,,,339835,4907,,,,,334,68637,66779,451,0,551,,,,,41868,461534,6442,461534,6442,,,,,406614,3500,,0 +"2020-05-26","PR",129,61,0,68,,,104,0,,14,40488,0,,,40095,,4,1241,1241,1,0,2083,,,,1572,,,0,41729,1,,,,,,0,41701,0 +"2020-05-26","RI",634,,26,,1613,1613,226,33,,50,92400,1726,,,128847,,36,14365,,154,0,,,,,18541,,146224,1519,146224,1519,,,,,106765,1880,147388,2818 +"2020-05-26","SC",446,446,6,,1618,1618,433,84,,,162318,6476,,,162318,,,10416,10416,238,0,,,,,15801,6102,,0,172734,6714,,,,,,0,178119,7085 +"2020-05-26","SD",50,,0,,378,378,106,8,,,32385,1688,,,,,,4653,,67,0,,,,,6176,3528,,0,41445,1438,,,,,37038,1755,41445,1438 +"2020-05-26","TN",343,343,5,,1609,1609,582,15,,,,0,,,382539,,,20965,20965,358,0,,,,,20965,13344,,0,403504,7285,,,,,403504,7285,403504,7285 +"2020-05-26","TX",1536,,9,,,,1534,0,,,,0,,,,,,56560,56560,589,0,3294,1,,,76789,36375,,0,981906,16093,84841,29,,,,0,981906,16093 +"2020-05-26","UT",101,,3,,696,696,134,4,217,,191174,1696,,,212210,89,,8620,,99,0,,,,,9841,5346,,0,222051,2276,,,,,199914,1830,222051,2276 +"2020-05-26","VA",1236,1175,28,61,4325,4325,1403,56,,366,,0,,,,,190,39342,37440,1615,0,2131,30,,,47645,,296427,5226,296427,5226,36820,120,,,,0,,0 +"2020-05-26","VI",6,,0,,,,,0,,,1425,82,,,,,,69,,0,0,,,,,,61,,0,1494,82,,,,,1512,55,,0 +"2020-05-26","VT",54,54,0,,,,25,0,,,28419,563,,,,,,968,968,5,0,,,,,,848,,0,34175,672,,,,,29387,568,34175,672 +"2020-05-26","WA",1070,1070,9,,3290,3290,509,3,,,,0,,,,,51,21165,21165,102,0,,,,,,,355902,8770,355902,8770,,,,,315843,6895,,0 +"2020-05-26","WI",517,517,3,,2362,2362,422,23,544,135,200874,7495,,,,,,17867,15863,296,0,,,,,,9405,280179,9984,280179,9984,,,,,216737,7774,,0 +"2020-05-26","WV",74,,2,,,,35,0,,9,,0,,,,,7,1854,1593,80,0,,,,,,1180,,0,86464,1109,4205,,,,,0,86464,1109 +"2020-05-26","WY",13,,1,,82,82,14,3,,,20652,1101,,,22730,,,850,648,7,0,,,,,811,607,,0,23541,841,,,,,,0,23541,841 +"2020-05-25","AK",10,10,0,,49,49,10,0,,,,0,,,,,,411,,1,0,,,,,,361,,0,44472,965,,,,,,0,44472,965 +"2020-05-25","AL",562,562,11,,1629,1629,450,17,543,,175585,4113,,,,323,,14730,14730,403,0,,,,,,7951,,0,190315,4516,,,,,190315,4516,,0 +"2020-05-25","AR",117,,1,,605,605,92,7,,,105593,2934,,,,111,17,6029,6029,107,0,,,,,,4249,,0,111622,3041,,,,,,0,111622,3041 +"2020-05-25","AS",0,,0,,,,,0,,,124,0,,,,,,0,0,0,0,,,,,,,,0,124,0,,,,,,0,124,0 +"2020-05-25","AZ",806,,6,,3077,3077,833,51,,334,171221,3919,,,,,212,16561,,222,0,,,,,,,,0,261004,3387,,,80601,,187782,4141,261004,3387 +"2020-05-25","CA",3795,,21,,,,4306,0,,1301,,0,,,,,,94558,94558,1848,0,,,,,,,,0,1644102,61357,,,,,,0,1644102,61357 +"2020-05-25","CO",1333,1056,1,275,4128,4128,507,9,,,131742,5608,45860,,,,,24269,21941,95,0,3793,,,,,,176077,4033,176077,4033,49653,,,,153683,3375,,0 +"2020-05-25","CT",3742,,49,,12538,12538,706,0,,,,0,,,184895,,,40873,,405,0,,,,,49091,7127,,0,234946,2570,,,,,,0,234946,2570 +"2020-05-25","DC",440,,13,,,,331,0,,106,,0,,,,,70,8225,,259,0,,,,,,1080,40803,0,40803,0,,,,,34194,618,,0 +"2020-05-25","DE",436,382,5,54,,,205,0,,,44931,1870,,,,,,8965,,156,0,,,,,10786,4693,65225,1130,65225,1130,,,,,53896,2026,,0 +"2020-05-25","FL",2331,2331,15,,9681,9681,,43,,,856489,36121,,,977392,,,50075,,980,0,,,,,70360,,920104,37478,920104,37478,,,,,909928,37012,1050247,41577 +"2020-05-25","GA",1830,,6,,7475,7475,892,36,1686,,,0,,,,,,43344,43344,506,0,,,,,38975,,,0,400562,21337,,,,,,0,400562,21337 +"2020-05-25","GU",5,,0,,,,,0,,,5403,0,,,,,,166,161,0,0,,,,,,138,,0,5569,0,,,,,,0,,-5704 +"2020-05-25","HI",17,17,0,,84,84,,0,,,49728,799,,,,,,643,,0,0,,,,,610,591,49163,724,49163,724,,,,,,0,50371,799 +"2020-05-25","IA",459,,5,,,,377,0,,118,115138,4634,,13714,,,66,17577,17252,325,0,,,1786,,,9377,,0,132715,4959,,,15504,,133046,5006,,0 +"2020-05-25","ID",79,59,0,20,225,225,15,0,94,,38780,0,,,,,,2626,2387,0,0,,,,,,1755,,0,41167,0,,,,,41167,0,,0 +"2020-05-25","IL",4884,4884,28,,,,3762,0,,1025,,0,,,,,605,112017,112017,1713,0,,,,,,,,0,769564,21643,,,,,,-747921,769564,21643 +"2020-05-25","IN",1976,1832,0,152,5285,5285,1102,0,1166,365,194536,5111,,,,,169,31715,,339,0,,,,,32668,,,0,294681,2237,,,,,226251,5450,294681,2237 +"2020-05-25","KS",188,,3,,800,800,,13,271,,72181,4705,,,,120,,9218,,260,0,,,,,,,,0,81399,4965,,,,,81245,4965,,0 +"2020-05-25","KY",391,390,0,1,2131,2131,484,0,897,89,,0,,,,,,8571,8451,0,0,,,,,,3102,,0,169736,0,,,,,,0,169736,0 +"2020-05-25","LA",2690,2585,0,105,,,847,0,,,293089,14222,,,,,102,37809,37809,640,0,,,,,,28700,,0,330898,14862,,,,,,0,330898,14862 +"2020-05-25","MA",6416,6416,44,,9339,9339,2132,31,,576,447290,7592,,,,,,93271,93271,596,0,,,,,118983,,,0,681149,4566,,,,,540561,8188,681149,4566 +"2020-05-25","MD",2379,2267,38,112,8092,8092,1279,153,,517,202425,8376,,,,,,47152,47152,839,0,,,,,53142,3329,,0,278124,10831,,,,,249577,9215,278124,10831 +"2020-05-25","ME",78,78,0,,257,257,59,5,,27,,0,2704,,,,13,2074,1858,19,0,177,,,,2250,1290,,0,45144,681,2884,,,,28357,0,45144,681 +"2020-05-25","MI",5678,5463,38,238,,,953,0,,449,,0,,,476325,,319,61632,56892,175,0,,,,,72782,33168,,0,549107,9557,67783,,,,,0,549107,9557 +"2020-05-25","MN",890,881,12,9,2676,2676,605,88,869,248,207816,6250,,,,,,23524,23524,403,0,,,,,,14816,231340,6653,231340,6653,,,,,,0,,0 +"2020-05-25","MO",685,,4,,,,729,0,,,145218,5587,,19443,165572,,93,12167,11913,179,0,,,727,,14273,,,0,180120,10388,,,20198,,157131,5512,180120,10388 +"2020-05-25","MP",2,,0,,,,,0,,,4735,0,,,,,,22,22,0,0,,,,,,13,,0,4757,0,,,,,,0,4757,0 +"2020-05-25","MS",635,,10,,2046,2046,566,23,,152,130459,5809,,,,,94,13458,,206,0,,,,,,9401,,0,143917,6015,6781,,,,,0,143917,6015 +"2020-05-25","MT",16,,0,,65,65,3,0,,,,0,,,,,,479,,0,0,,,,,,441,,0,33682,301,,,,,,0,33682,301 +"2020-05-25","NC",754,754,10,,,,627,0,,,,0,,,,,,23964,23964,742,0,,,,,,,,0,336588,7154,,,,,,0,336588,7154 +"2020-05-25","ND",54,,1,,154,154,41,2,,,63893,823,,,,,,2376,2376,40,0,,,,,,1551,81074,1925,81074,1925,,,,,64318,976,82633,1981 +"2020-05-25","NE",150,,3,,,,,0,,,73598,2382,,,86555,,,12134,,145,0,,,,,14191,,,0,101086,3870,,,,,86027,2542,101086,3870 +"2020-05-25","NH",209,,1,,419,419,92,0,120,,57237,1787,,,,,,4149,,60,0,,,,,,2204,,0,65977,1400,11259,,9541,,61386,1847,65977,1400 +"2020-05-25","NJ",12834,11144,15,1690,,,2755,0,,719,468705,19052,,,,,540,155370,155092,943,0,,,,,,,,0,624075,19995,,,,,,0,623797,19990 +"2020-05-25","NM",320,,3,,1264,1264,216,21,,,,0,,,,,,7026,,83,0,,,,,,2522,,0,177361,3880,,,,,,0,177361,3880 +"2020-05-25","NV",410,,2,,,,380,0,,91,106852,4341,,,,,45,7879,7879,109,0,,,,,,,152341,1289,152341,1289,,,,,114704,4444,133508,4705 +"2020-05-25","NY",23488,,97,,88554,88554,4348,230,,1366,,0,,,,,1058,362764,,1249,0,,,,,,,1739449,39623,1739449,39623,,,,,,0,,0 +"2020-05-25","OH",1987,1788,18,199,5511,5511,872,35,1443,323,,0,,,,,211,32477,30305,566,0,,,,,35026,,,0,361174,8981,,,,,,0,361174,8981 +"2020-05-25","OK",313,,2,,938,938,,0,,78,154943,0,,,154207,,,6090,6090,53,0,628,,,,6696,4714,,0,161033,53,17160,,,,,0,160903,0 +"2020-05-25","OR",148,,1,,742,742,117,2,,35,108268,1949,,,147569,,18,3927,,39,0,,,,,10456,1376,,0,158025,3223,,,,,112110,1992,158025,3223 +"2020-05-25","PA",5139,,15,,,,1628,0,,,334928,6546,,,,,324,68186,66347,473,0,549,,,,,40911,455092,8637,455092,8637,,,,,403114,7019,,0 +"2020-05-25","PR",129,61,2,68,,,112,0,,16,40488,0,,,40095,,8,1240,1240,10,0,2020,,,,1572,,,0,41728,10,,,,,,0,41701,0 +"2020-05-25","RI",608,,0,,1580,1580,240,0,,49,90674,750,,,126302,,32,14211,,70,0,,,,,18268,,144705,1521,144705,1521,,,,,104885,820,144570,1500 +"2020-05-25","SC",440,440,5,,1534,1534,407,0,,,155842,1991,,,155842,,,10178,10178,82,0,,,,,15192,6063,,0,166020,2073,,,,,,0,171034,2126 +"2020-05-25","SD",50,,0,,370,370,99,6,,,30697,355,,,,,,4586,,23,0,,,,,6105,3415,,0,40007,1523,,,,,35283,378,40007,1523 +"2020-05-25","TN",338,338,2,,1594,1594,517,11,,,,0,,,375612,,,20607,20607,462,0,,,,,20607,13073,,0,396219,12643,,,,,396219,12643,396219,12643 +"2020-05-25","TX",1527,,21,,,,1511,0,,,,0,,,,,,55971,55971,623,0,3163,,,,75779,35292,,0,965813,24893,80700,,,,,0,965813,24893 +"2020-05-25","UT",98,,1,,692,692,131,4,215,,189478,2044,,,210088,88,,8521,,129,0,,,,,9687,5218,,0,219775,2776,,,,,198084,2142,219775,2776 +"2020-05-25","VA",1208,1158,37,50,4269,4269,1376,55,,349,,0,,,,,182,37727,35890,1483,0,2124,29,,,47140,,291201,7585,291201,7585,36768,119,,,,0,,0 +"2020-05-25","VI",6,,0,,,,,0,,,1343,0,,,,,,69,,0,0,,,,,,61,,0,1412,0,,,,,1457,0,,0 +"2020-05-25","VT",54,54,0,,,,19,0,,,27856,746,,,,,,963,963,6,0,,,,,,843,,0,33503,883,,,,,28819,752,33503,883 +"2020-05-25","WA",1061,1061,6,,3287,3287,536,31,,,,0,,,,,47,21063,21063,151,0,,,,,,,347132,3303,347132,3303,,,,,308948,2483,,0 +"2020-05-25","WI",514,514,4,,2339,2339,388,24,543,121,193379,7173,,,,,,17571,15584,318,0,,,,,,9207,270195,11661,270195,11661,,,,,208963,7480,,0 +"2020-05-25","WV",72,,0,,,,36,0,,13,,0,,,,,7,1774,1593,15,0,,,,,,1135,,0,85355,774,4124,,,,,0,85355,774 +"2020-05-25","WY",12,,0,,79,79,10,1,,,19551,330,,,21918,,,843,644,5,0,,,,,782,575,,0,22700,176,,,,,,0,22700,176 +"2020-05-24","AK",10,10,0,,49,49,10,0,,,,0,,,,,,410,,0,0,,,,,,358,,0,43507,1156,,,,,,0,43507,1156 +"2020-05-24","AL",551,551,5,,1612,1612,440,23,537,,171472,2734,,,,320,,14327,14327,389,0,,,,,,7951,,0,185799,3123,,,,,185799,3123,,0 +"2020-05-24","AR",116,,3,,598,598,86,8,,,102659,5224,,,,111,17,5922,5922,310,0,,,,,,4148,,0,108581,5534,,,,,,0,108581,5534 +"2020-05-24","AS",0,,0,,,,,0,,,124,0,,,,,,0,0,0,0,,,,,,,,0,124,0,,,,,,0,124,0 +"2020-05-24","AZ",800,,1,,3026,3026,804,42,,322,167302,2902,,,,,201,16339,,300,0,,,,,,,,0,257617,6367,,,77018,,183641,3202,257617,6367 +"2020-05-24","CA",3774,,66,,,,4300,0,,1315,,0,,,,,,92710,92710,2079,0,,,,,,,,0,1582745,67439,,,,,,0,1582745,67439 +"2020-05-24","CO",1332,1055,5,275,4119,4119,560,14,,,126134,47,45058,,,,,24174,21857,210,0,3713,,,,,,172044,3379,172044,3379,48771,,,,150308,2564,,0 +"2020-05-24","CT",3693,,18,,12538,12538,701,0,,,,0,,,182515,,,40468,,446,0,,,,,48905,7127,,0,232376,3400,,,,,,0,232376,3400 +"2020-05-24","DC",427,,0,,,,324,0,,110,,0,,,,,73,7966,,0,0,,,,,,1075,40803,1875,40803,1875,,,,,33576,841,,0 +"2020-05-24","DE",431,377,6,54,,,211,0,,,43061,1217,,,,,,8809,,119,0,,,,,10680,4598,64095,2286,64095,2286,,,,,51870,1336,,0 +"2020-05-24","FL",2316,2316,4,,9638,9638,,71,,,820368,14058,,,936730,,,49095,,545,0,,,,,69459,,882626,15706,882626,15706,,,,,872916,14804,1008670,18370 +"2020-05-24","GA",1824,,13,,7439,7439,848,28,1683,,,0,,,,,,42838,42838,706,0,,,,,37843,,,0,379225,16663,,,,,,0,379225,16663 +"2020-05-24","GU",5,,0,,,,,0,,,5403,209,,,5403,,,166,161,1,0,,,,,161,138,,0,5569,210,,,,,,0,5704,217 +"2020-05-24","HI",17,17,0,,84,84,,0,,,48929,750,,,,,,643,,1,0,,,,,610,589,48439,846,48439,846,,,,,,0,49572,751 +"2020-05-24","IA",454,,10,,,,363,0,,114,110504,3456,,13443,,,61,17252,17252,359,0,,,1772,,,9318,,0,127756,3815,,,15219,,128040,3826,,0 +"2020-05-24","ID",79,59,0,20,225,225,23,0,94,,38780,766,,,,,,2626,2387,31,0,,,,,,1755,,0,41167,797,,,,,41167,797,,0 +"2020-05-24","IL",4856,4856,66,,,,3667,0,,1007,,0,,,,,632,110304,110304,2508,0,,,,,,,,0,747921,25674,,,,,747921,25674,747921,25674 +"2020-05-24","IN",1976,1824,33,152,5285,5285,1112,0,1166,396,189425,5393,,,,,173,31376,,475,0,,,,,32498,,,0,292444,3396,,,,,220801,5868,292444,3396 +"2020-05-24","KS",185,,0,,787,787,,0,269,,67476,0,,,,120,,8958,,0,0,,,,,,,,0,76434,0,,,,,76280,0,,0 +"2020-05-24","KY",391,390,0,1,2131,2131,484,55,897,89,,0,,,,,,8571,8451,145,0,,,,,,3102,,0,169736,-1602,,,,,,0,169736,-1602 +"2020-05-24","LA",2690,2567,22,123,,,813,0,,,278867,1460,,,,,102,37169,37169,129,0,,,,,,26249,,0,316036,1589,,,,,,0,316036,1589 +"2020-05-24","MA",6372,6372,68,,9308,9308,2169,48,,558,439698,10374,,,,,,92675,92675,1013,0,,,,,118601,,,0,676583,5559,,,,,532373,11387,676583,5559 +"2020-05-24","MD",2341,2229,35,112,7939,7939,1290,114,,503,194049,7217,,,,,,46313,46313,818,0,,,,,52169,3319,,0,267293,6731,,,,,240362,8035,267293,6731 +"2020-05-24","ME",78,78,1,,252,252,59,9,,27,,0,2704,,,,13,2055,1845,42,0,177,,,,2228,1263,,0,44463,1428,2884,,,,28357,0,44463,1428 +"2020-05-24","MI",5640,5440,28,238,,,953,0,,449,,0,,,467087,,319,61457,56741,164,0,,,,,72463,33168,,0,539550,11929,61973,,,,,0,539550,11929 +"2020-05-24","MN",878,869,17,9,2588,2588,553,54,841,207,201566,6625,,,,,,23121,23121,356,0,,,,,,14115,224687,6981,224687,6981,,,,,,0,,0 +"2020-05-24","MO",681,,5,,,,742,0,,,139631,3079,,18176,155323,,94,11988,11988,236,0,,,692,,14137,,,0,169732,682,,,18868,,151619,-13792,169732,682 +"2020-05-24","MP",2,,0,,,,,0,,,4735,439,,,,,,22,22,0,0,,,,,,13,,0,4757,439,,,,,,0,4757,439 +"2020-05-24","MS",625,,9,,2023,2023,512,27,,150,124650,3435,,,,,73,13252,,247,0,,,,,,7681,,0,137902,3682,9057,,,,,0,137902,3682 +"2020-05-24","MT",16,,0,,65,65,3,0,,,,0,,,,,,479,,0,0,,,,,,441,,0,33381,729,,,,,,0,33381,729 +"2020-05-24","NC",744,744,7,,,,587,0,,,,0,,,,,,23222,23222,497,0,,,,,,,,0,329434,9046,,,,,,0,329434,9046 +"2020-05-24","ND",53,,1,,152,152,40,2,,,63070,1287,,,,,,2336,2336,54,0,,,,,,1496,79149,2281,79149,2281,,,,,63342,1255,80652,2327 +"2020-05-24","NE",147,,0,,,,,0,,,71216,2896,,,82917,,,11989,,327,0,,,,,13962,,,0,97216,1659,,,,,83485,3010,97216,1659 +"2020-05-24","NH",208,,0,,419,419,93,0,120,,55450,0,,,,,,4089,,0,0,,,,,,2197,,0,64577,1965,10972,,9062,,59539,0,64577,1965 +"2020-05-24","NJ",12819,11133,54,1686,,,2857,0,,760,449653,24022,,,,,639,154427,154154,1055,0,,,,,,,,0,604080,25077,,,,,,0,603807,25072 +"2020-05-24","NM",317,,9,,1243,1243,213,104,,,,0,,,,,,6943,,148,0,,,,,,2464,,0,173481,4362,,,,,,0,173481,4362 +"2020-05-24","NV",408,,4,,,,373,0,,92,102511,3160,,,,,51,7770,7770,74,0,,,,,,,151052,2775,151052,2775,,,,,110260,3213,128803,3409 +"2020-05-24","NY",23391,,109,,88324,88324,4393,241,,1406,,0,,,,,1067,361515,,1589,0,,,,,,,1699826,47765,1699826,47765,,,,,,0,,0 +"2020-05-24","OH",1969,1769,13,200,5476,5476,864,39,1438,317,,0,,,,,205,31911,29777,503,0,,,,,34406,,,0,352193,11533,,,,,,0,352193,11533 +"2020-05-24","OK",311,,0,,938,938,174,12,,78,154943,0,,,154207,,,6037,6037,77,0,628,,,,6696,4688,,0,160980,77,17160,,,,,0,160903,0 +"2020-05-24","OR",147,,0,,740,740,102,3,,41,106319,2344,,,144459,,15,3888,,24,0,,,,,10343,1376,,0,154802,4307,,,,,110118,2373,154802,4307 +"2020-05-24","PA",5124,,28,,,,1533,0,,,328382,6913,,,,,336,67713,65906,730,0,513,,,,,40627,446455,9182,446455,9182,,,,,396095,7643,,0 +"2020-05-24","PR",127,61,0,66,,,106,0,,13,40488,0,,,40095,,7,1230,1230,-640,0,1959,,,,1572,,,0,41718,-640,,,,,,0,41701,0 +"2020-05-24","RI",608,,11,,1580,1580,240,23,,49,89924,757,,,124936,,32,14141,,84,0,,,,,18134,,143184,2982,143184,2982,,,,,104065,841,143070,1503 +"2020-05-24","SC",435,435,10,,1534,1534,461,0,,,153851,4836,,,153851,,,10096,10096,201,0,,,,,15057,5743,,0,163947,5037,,,,,,0,168908,5090 +"2020-05-24","SD",50,,0,,364,364,85,6,,,30342,1282,,,,,,4563,,95,0,,,,,6017,3371,,0,38484,1173,,,,,34905,1377,38484,1173 +"2020-05-24","TN",336,336,7,,1583,1583,526,10,,,,0,,,363431,,,20145,20145,356,0,,,,,20145,12837,,0,383576,9818,,,,,383576,9818,383576,9818 +"2020-05-24","TX",1506,,0,,,,1572,0,,,,0,,,,,,55348,55348,839,0,2866,,,,73832,33385,,0,940920,22461,71731,,,,,0,940920,22461 +"2020-05-24","UT",97,,0,,688,688,128,12,215,,187434,3217,,,207432,88,,8392,,132,0,,,,,9567,5081,,0,216999,4112,,,,,195942,3354,216999,4112 +"2020-05-24","VA",1171,1135,12,36,4214,4214,1351,33,,354,,0,,,,,192,36244,34451,495,0,2094,29,,,46256,,283616,7319,283616,7319,36260,119,,,,0,,0 +"2020-05-24","VI",6,,0,,,,,0,,,1343,0,,,,,,69,,0,0,,,,,,61,,0,1412,0,,,,,1457,0,,0 +"2020-05-24","VT",54,54,0,,,,25,0,,,27110,1085,,,,,,957,957,3,0,,,,,,839,,0,32620,1208,,,,,28067,1088,32620,1208 +"2020-05-24","WA",1055,1055,5,,3256,3256,560,26,,,,0,,,,,74,20912,20912,313,0,,,,,,,343829,2823,343829,2823,,,,,306465,2342,,0 +"2020-05-24","WI",510,510,3,,2315,2315,399,23,541,126,186206,6877,,,,,,17253,15277,410,0,,,,,,8999,258534,11497,258534,11497,,,,,201483,7277,,0 +"2020-05-24","WV",72,,0,,,,23,0,,8,,0,,,,,4,1759,1593,42,0,,,,,,1121,,0,84581,1531,4094,,,,,0,84581,1531 +"2020-05-24","WY",12,,0,,78,78,10,1,,,19221,0,,,21745,,,838,638,25,0,,,,,779,556,,0,22524,156,,,,,,0,22524,156 +"2020-05-23","AK",10,10,0,,49,49,10,0,,,,0,,,,,,410,,4,0,,,,,,358,,0,42351,905,,,,,,0,42351,905 +"2020-05-23","AL",546,546,9,,1589,1589,446,28,538,,168738,4533,,,,319,,13938,13938,375,0,,,,,,7951,,0,182676,4908,,,,,182676,4908,,0 +"2020-05-23","AR",113,,0,,590,590,81,6,,,97435,0,,,,111,14,5612,5612,0,0,,,,,,4029,,0,103047,0,,,,,,0,103047,0 +"2020-05-23","AS",0,,0,,,,,0,,,124,0,,,,,,0,0,0,0,,,,,,,,0,124,0,,,,,,0,124,0 +"2020-05-23","AZ",799,,24,,2984,2984,784,41,,309,164400,4005,,,,,193,16039,,431,0,2200,,,,12089,,,0,251250,8156,,,73350,,180439,4436,251250,8156 +"2020-05-23","CA",3708,,78,,,,4342,0,,1312,,0,,,,,,90631,90631,2187,0,,,,,,,,0,1515306,48533,,,,,,0,1515306,48533 +"2020-05-23","CO",1327,1052,3,275,4105,4105,538,23,,,126087,4622,43765,,,,,23964,21657,477,0,3614,,,,,,168665,6197,168665,6197,47379,,,,147744,5077,,0 +"2020-05-23","CT",3675,,38,,12538,12538,724,0,,,,0,,,179333,,,40022,,382,0,,,,,48689,7127,,0,228976,7225,,,,,,0,228976,7225 +"2020-05-23","DC",427,,9,,,,324,0,,110,,0,,,,,73,7966,,73,0,,,,,,1075,38928,-4065,38928,-4065,,,,,32735,32735,,0 +"2020-05-23","DE",425,371,5,54,,,210,0,,,41844,1387,,,,,,8690,,161,0,,,,,10503,4454,61809,1478,61809,1478,,,,,50534,1548,,0 +"2020-05-23","FL",2312,2312,44,,9567,9567,,195,,,806310,20265,,,919519,,,48550,,733,0,,,,,68322,,866920,25853,866920,25853,,,,,858112,20940,990300,49542 +"2020-05-23","GA",1811,,26,,7411,7411,848,98,1678,,,0,,,,,,42132,42132,914,0,,,,,36868,,,0,362562,13179,,,,,,0,362562,13179 +"2020-05-23","GU",5,,0,,,,,0,,,5194,80,,,5190,,,165,160,0,0,,,,,,134,,0,5359,80,,,,,,0,5487,156 +"2020-05-23","HI",17,17,0,,84,84,,1,,,48179,841,,,,,,642,,-5,0,,,,,610,585,47593,738,47593,738,,,,,,-47985,48821,48821 +"2020-05-23","IA",444,,19,,,,362,0,,111,107048,3302,,12799,,,70,16893,16893,389,0,,,1757,,,9254,,0,123941,3691,,,14560,,124214,3700,,0 +"2020-05-23","ID",79,59,2,20,225,225,19,2,94,,38014,953,,,,,,2595,2356,61,0,,,,,,1735,,0,40370,1008,,,,,40370,1008,,0 +"2020-05-23","IL",4790,4790,75,,,,3753,0,,1027,,0,,,,,607,107796,107796,2352,0,,,,,,,,0,722247,25114,,,,,722247,25114,722247,25114 +"2020-05-23","IN",1943,1812,2,152,5285,5285,1138,0,1166,403,184032,5880,,,,,173,30901,,492,0,,,,,32286,,,0,289048,9733,,,,,214933,6372,289048,9733 +"2020-05-23","KS",185,,0,,787,787,,0,269,,67476,0,,,,120,,8958,,0,0,,,,,,,,0,76434,0,,,,,76280,0,,0 +"2020-05-23","KY",391,390,5,1,2076,2076,477,35,889,90,,0,,,,,,8426,8305,140,0,,,,,,3069,,0,171338,5098,,,,,,0,171338,5098 +"2020-05-23","LA",2668,2560,0,123,,,836,0,,,277407,2524,,,,,112,37040,37040,115,0,,,,,,26249,,0,314447,2639,,,,,,0,314447,2639 +"2020-05-23","MA",6304,6304,76,,9260,9260,2237,98,,610,429324,8569,,,,,,91662,91662,773,0,,,,,118092,,,0,671024,6712,,,,,520986,9342,671024,6712 +"2020-05-23","MD",2306,2197,32,109,7825,7825,1320,191,,524,186832,3354,,,,,,45495,45495,1071,0,,,,,51210,3283,,0,260562,8715,,,,,232327,4425,260562,8715 +"2020-05-23","ME",77,77,2,,243,243,50,3,,26,,0,2704,,,,11,2013,1804,65,0,177,,,,2181,1232,,0,43035,2070,2884,,,,28357,0,43035,2070 +"2020-05-23","MI",5612,5402,26,237,,,953,0,,449,,0,,,455556,,319,61293,56612,218,0,,,,,72065,33168,,0,527621,14869,61973,,,,,0,527621,14869 +"2020-05-23","MN",861,852,10,9,2534,2534,568,102,832,215,194941,8505,,,,,,22765,22765,391,0,,,,,,13485,217706,8896,217706,8896,,,,,,0,,0 +"2020-05-23","MO",676,,5,,,,742,0,,,136552,-24836,,16435,154644,,94,11752,11751,194,0,,,678,,14135,,,0,169050,1851,,,17138,,165411,-7535,169050,1851 +"2020-05-23","MP",2,,0,,,,,0,,,4296,0,,,,,,22,22,0,0,,,,,,13,,0,4318,0,,,,,,0,4318,0 +"2020-05-23","MS",616,,20,,1996,1996,590,30,,154,121215,-4134,,,,,93,13005,,381,0,,,,,,7681,,0,134220,-3753,8813,,,,,0,134220,-3753 +"2020-05-23","MT",16,,0,,65,65,3,0,,,,0,,,,,,479,,0,0,,,,,,441,,0,32652,795,,,,,,0,32652,795 +"2020-05-23","NC",737,737,9,,,,589,0,,,,0,,,,,,22725,22725,1107,0,,,,,,,,0,320388,11829,,,,,,0,320388,11829 +"2020-05-23","ND",52,,0,,150,150,39,3,,,61783,1270,,,,,,2282,2282,49,0,,,,,,1451,76868,2257,76868,2257,,,,,62087,1323,78325,2308 +"2020-05-23","NE",147,,4,,,,,0,,,68320,1326,,,81517,,,11662,,237,0,,,,,13705,,,0,95557,4614,,,,,80475,1821,95557,4614 +"2020-05-23","NH",208,,9,,419,419,93,26,120,,55450,4285,,,,,,4089,,154,0,,,,,,2197,,0,62612,2039,10491,,9062,,59539,4439,62612,2039 +"2020-05-23","NJ",12765,11081,99,1684,,,2974,0,,806,425631,23036,,,,,611,153372,153104,410,0,,,,,,,,0,579003,23446,,,,,,0,578735,23421 +"2020-05-23","NM",308,,6,,1139,1139,208,0,,,,0,,,,,,6795,,170,0,,,,,,2357,,0,169119,10736,,,,,,0,169119,10736 +"2020-05-23","NV",404,,4,,,,402,0,,99,99351,6811,,,,,53,7696,7696,295,0,,,,,,,148277,7015,148277,7015,,,,,107047,7106,125394,7788 +"2020-05-23","NY",23282,,87,,88083,88083,4642,240,,1502,,0,,,,,1254,359926,,1772,0,,,,,,,1652061,51268,1652061,51268,,,,,,0,,0 +"2020-05-23","OH",1956,1756,84,200,5437,5437,858,58,1429,333,,0,,,,,223,31408,29288,614,0,,,,,33657,,,0,340660,9983,,,,,,0,340660,9983 +"2020-05-23","OK",311,,4,,926,926,174,0,,78,154943,7625,,,154207,,,5960,5960,111,0,628,,,,6696,4645,,0,160903,7736,17160,,,,,0,160903,7905 +"2020-05-23","OR",147,,2,,737,737,146,5,,47,103975,2568,,,140269,,16,3864,,47,0,,,,,10226,1376,,0,150495,3919,,,,,107745,2613,150495,3919 +"2020-05-23","PA",5096,,112,,,,1560,0,,,321469,8726,,,,,348,66983,65209,725,0,513,,,,,39519,437273,11457,437273,11457,,,,,388452,9451,,0 +"2020-05-23","PR",127,61,1,66,,,106,0,,14,40488,0,,,40095,,5,1870,1870,649,0,1230,,,,1572,,,0,42358,649,,,,,,0,41701,0 +"2020-05-23","RI",597,,18,,1557,1557,233,20,,51,89167,1317,,,123584,,34,14057,,108,0,,,,,17983,,140202,3510,140202,3510,,,,,103224,1425,141567,2958 +"2020-05-23","SC",425,425,6,,1534,1534,430,0,,,149015,8630,,,149015,,,9895,9895,257,0,,,,,14803,5743,,0,158910,8887,,,,,,0,163818,9072 +"2020-05-23","SD",50,,0,,358,358,90,7,,,29060,1072,,,,,,4468,,112,0,,,,,5923,3336,,0,37311,1241,,,,,33528,1184,37311,1241 +"2020-05-23","TN",329,329,14,,1573,1573,478,13,,,,0,,,353969,,,19789,19789,395,0,,,,,19789,12745,,0,373758,5588,,,,,373758,5588,373758,5588 +"2020-05-23","TX",1506,,26,,,,1688,0,,,,0,,,,,,54509,54509,1060,0,2463,,,,72543,32277,,0,918459,44864,60252,,,,,0,918459,44864 +"2020-05-23","UT",97,,4,,676,676,165,16,213,,184217,3317,,,203484,88,,8260,,203,0,,,,,9403,4898,,0,212887,4316,,,,,192588,3491,212887,4316 +"2020-05-23","VA",1159,1123,23,36,4181,4181,1384,36,,330,,0,,,,,213,35749,33962,799,0,1981,29,,,45359,,276297,10630,276297,10630,34481,118,,,,0,,0 +"2020-05-23","VI",6,,0,,,,,0,,,1343,0,,,,,,69,,0,0,,,,,,61,,0,1412,0,,,,,1457,0,,0 +"2020-05-23","VT",54,54,0,,,,21,0,,,26025,1161,,,,,,954,954,2,0,,,,,,837,,0,31412,1366,,,,,26979,1163,31412,1366 +"2020-05-23","WA",1050,1050,6,,3230,3230,553,74,,,,0,,,,,96,20599,20599,297,0,,,,,,,341006,3350,341006,3350,,,,,304123,2671,,0 +"2020-05-23","WI",507,507,11,,2292,2292,388,33,542,128,179329,6626,,,,,,16843,14877,503,0,,,,,,8688,247037,11017,247037,11017,,,,,194206,7107,,0 +"2020-05-23","WV",72,,1,,,,39,0,,11,,0,,,,,9,1717,1593,101,0,,,,,,1110,,0,83050,2039,3800,,,,,0,83050,2039 +"2020-05-23","WY",12,,0,,77,77,10,1,,,19221,600,,,21593,,,813,615,10,0,,,,,775,551,,0,22368,193,,,,,,0,22368,193 +"2020-05-22","AK",10,10,0,,49,49,15,2,,,,0,,,,,,406,,2,0,,,,,,356,,0,41446,1901,,,,,,0,41446,1901 +"2020-05-22","AL",537,537,8,,1561,1561,598,33,531,,164205,6585,,,,315,,13563,13563,444,0,,,,,,7951,,0,177768,7029,,,,,177768,7029,,0 +"2020-05-22","AR",113,,3,,584,584,86,49,,,97435,3617,,,,110,14,5612,5612,154,0,,,,,,4029,,0,103047,3771,,,,,,0,103047,3771 +"2020-05-22","AS",0,,0,,,,,0,,,124,0,,,,,,0,0,0,0,,,,,,,,0,124,0,,,,,,0,124,0 +"2020-05-22","AZ",775,,12,,2943,2943,796,58,,311,160395,4083,,,,,203,15608,,293,0,,,,,,,,0,243094,7546,,,69483,,176003,4376,243094,7546 +"2020-05-22","CA",3630,,88,,,,4762,0,,1317,,0,,,,,,88444,88444,2247,0,,,,,,,,0,1466773,45646,,,,,,0,1466773,45646 +"2020-05-22","CO",1324,1048,14,275,4082,4082,571,45,,,121465,2431,40655,,,,,23487,21202,296,0,3448,,,,,,162468,3550,162468,3550,44103,,,,142667,2730,,0 +"2020-05-22","CT",3637,,55,,12538,12538,740,1592,,,,0,,,172616,,,39640,,432,0,,,,,48200,7127,,0,221751,7306,,,,,,0,221751,7306 +"2020-05-22","DC",418,,6,,,,342,0,,112,,0,,,,,74,7893,,105,0,,,,,,1069,42993,1237,42993,1237,,,,,,0,,0 +"2020-05-22","DE",420,367,3,53,,,221,0,,,40457,1301,,,,,,8529,,143,0,,,,,10326,4296,60331,1106,60331,1106,,,,,48986,1444,,0 +"2020-05-22","FL",2268,2268,46,,9372,9372,,172,,,786045,20791,,,871876,,,47817,,725,0,,,,,66424,,841067,23841,841067,23841,,,,,837172,21588,940758,0 +"2020-05-22","GA",1785,,31,,7313,7313,889,78,1658,,,0,,,,,,41218,41218,813,0,,,,,36108,,,0,349383,9995,,,,,,0,349383,9995 +"2020-05-22","GU",5,,0,,,,,0,,,5114,215,,,5037,,,165,160,0,0,,,,,,125,,0,5279,215,,,,,,0,5331,164 +"2020-05-22","HI",17,17,0,,83,83,,1,,,47338,832,,,,,,647,,4,0,,,,,610,579,46855,886,46855,886,,,,,47985,836,,0 +"2020-05-22","IA",425,,19,,,,362,0,,123,103746,3351,,12090,,,79,16504,16504,334,0,,,1725,,,9079,,0,120250,3685,,,13818,,120514,3686,,0 +"2020-05-22","ID",77,,0,,223,223,19,2,92,,37061,679,,,,,,2534,2301,28,0,,,,,,1720,,0,39362,702,,,,,39362,702,,0 +"2020-05-22","IL",4715,4715,108,,,,3928,0,,1060,,0,,,,,589,105444,105444,2758,0,,,,,,,,0,697133,25113,,,,,697133,25113,697133,25113 +"2020-05-22","IN",1941,1791,28,150,5285,5285,1203,896,1166,416,178152,5093,,,,,173,30409,,473,0,,,,,31659,,,0,279315,9102,,,,,208561,5566,279315,9102 +"2020-05-22","KS",185,,7,,787,787,,27,269,,67476,4812,,,,120,,8958,,419,0,,,,,,,,0,76434,5231,,,,,76280,5232,,0 +"2020-05-22","KY",386,385,10,1,2041,2041,475,25,886,92,,0,,,,,,8286,8175,11,0,,,,,,3008,,0,166240,7568,,,,,,0,166240,7568 +"2020-05-22","LA",2668,2545,39,123,,,867,0,,,274883,6006,,,,,104,36925,36925,421,0,,,,,,26249,,0,311808,6427,,,,,,0,311808,6427 +"2020-05-22","MA",6228,6228,80,,9162,9162,2323,122,,628,420755,9353,,,,,,90889,90889,805,0,,,,,117464,,,0,664312,14811,,,,,511644,10158,664312,14811 +"2020-05-22","MD",2274,2169,53,105,7634,7634,1329,149,,506,183478,6776,,,,,,44424,44424,893,0,,,,,50019,3243,,0,251847,6462,,,,,227902,7669,251847,6462 +"2020-05-22","ME",75,75,2,,240,240,45,5,,21,,0,2704,,,,12,1948,1749,71,0,177,,,,2118,1192,,0,40965,1239,2884,,,,28357,0,40965,1239 +"2020-05-22","MI",5586,5375,31,237,,,955,0,,470,,0,,,441282,,348,61075,56445,465,0,,,,,71470,28234,,0,512752,20340,,,,,,0,512752,20340 +"2020-05-22","MN",851,842,33,9,2432,2432,534,52,806,233,186436,8930,,,,,,22374,22374,792,0,,,,,,12696,208810,9722,208810,9722,,,,,,0,,0 +"2020-05-22","MO",671,,10,,,,711,0,,,161388,10636,,15520,152883,,93,11558,11558,218,0,,,647,,14046,,,0,167199,3515,,,16192,,172946,10962,167199,3515 +"2020-05-22","MP",2,,0,,,,,0,,,4296,229,,,,,,22,22,0,0,,,,,,13,,0,4318,229,,,,,,0,4318,229 +"2020-05-22","MS",596,,16,,1966,1966,557,34,,159,125349,11601,,,,,85,12624,,402,0,,,,,,7681,,0,137973,12003,4055,,,,,0,137973,12003 +"2020-05-22","MT",16,,0,,65,65,3,0,,,,0,,,,,,479,,0,0,,,,,,441,,0,31857,1333,,,,,,0,31857,1333 +"2020-05-22","NC",728,728,12,,,,568,0,,,,0,,,,,,21618,21618,758,0,,,,,,,,0,308559,10185,,,,,,0,308559,10185 +"2020-05-22","ND",52,,1,,147,147,39,3,,,60513,1463,,,,,,2233,2233,70,0,,,,,,1405,74611,2491,74611,2491,,,,,60764,1615,76017,2570 +"2020-05-22","NE",143,,5,,,,,0,,,66994,2476,,,77369,,,11425,,303,0,,,,,13245,,,0,90943,2920,,,,,78654,2790,90943,2920 +"2020-05-22","NH",199,,9,,393,393,97,8,120,,51165,2203,,,,,,3935,,67,0,,,,,,1767,,0,60573,2355,9988,,7835,,55100,2270,60573,2355 +"2020-05-22","NJ",12666,10985,148,1681,,,3049,0,,846,402595,9793,,,,,674,152962,152719,1265,0,,,,,,,,0,555557,11058,,,,,,0,555314,11040 +"2020-05-22","NM",302,,8,,1139,1139,206,0,,,,0,,,,,,6625,,153,0,,,,,,2149,,0,158383,5616,,,,,,0,158383,5616 +"2020-05-22","NV",400,,3,,,,404,0,,90,92540,5413,,,,,51,7401,7401,146,0,,,,,,,141262,7241,141262,7241,,,,,99941,5559,117606,6283 +"2020-05-22","NY",23195,,112,,87843,87843,4844,205,,1581,,0,,,,,1254,358154,,1696,0,,,,,,,1600793,45738,1600793,45738,,,,,,0,,0 +"2020-05-22","OH",1872,1691,36,181,5379,5379,879,84,1416,362,,0,,,,,232,30794,28758,627,0,,,,,32960,,,0,330677,11465,,,,,,0,330677,11465 +"2020-05-22","OK",307,,3,,926,926,190,9,,94,147318,3403,,,146409,,,5849,5849,169,0,459,,,,6589,4533,,0,153167,3572,13642,,,,,0,152998,3551 +"2020-05-22","OR",145,,1,,732,732,140,9,,40,101407,3059,,,136410,,14,3817,,16,0,,,,,10166,1406,,0,146576,4422,,,,,105132,3083,146576,4422 +"2020-05-22","PA",4984,,115,,,,1580,0,,,312743,9229,,,,,368,66258,64551,866,0,481,,,,,37767,425816,12667,425816,12667,,,,,379001,10095,,0 +"2020-05-22","PR",126,60,0,66,,,96,0,,12,40488,0,,,40095,,6,1221,1221,8,0,1809,,,,1572,,,0,41709,8,,,,,,0,41701,0 +"2020-05-22","RI",579,,23,,1537,1537,242,31,,56,87850,1451,,,120860,,40,13949,,201,0,,,,,17749,,136692,4131,136692,4131,,,,,101799,1652,138609,3318 +"2020-05-22","SC",419,419,12,,1534,1534,429,90,,,140385,11322,,,140385,,,9638,9638,463,0,,,,,14361,5743,,0,150023,11785,,,,,,-138238,154746,154746 +"2020-05-22","SD",50,,2,,351,351,83,9,,,27988,937,,,,,,4356,,106,0,,,,,5825,3267,,0,36070,1270,,,,,32344,1043,36070,1270 +"2020-05-22","TN",315,315,2,,1560,1560,570,21,,,,0,,,348776,,,19394,19394,433,0,,,,,19394,12566,,0,368170,7587,,,,,368170,7587,368170,7587 +"2020-05-22","TX",1480,,40,,,,1578,0,,,,0,,,,,,53449,53449,1181,0,2463,,,,70288,31223,,0,873595,35232,49313,,,,,0,873595,35232 +"2020-05-22","UT",93,,1,,660,660,163,13,210,,180900,3045,,,199390,88,,8057,,183,0,,,,,9181,4748,,0,208571,3924,,,,,189097,3211,208571,3924 +"2020-05-22","VA",1136,1100,37,36,4145,4145,1459,52,,366,,0,,,,,207,34950,33208,813,0,1878,27,,,43902,,265667,8187,265667,8187,32735,116,,,,0,,0 +"2020-05-22","VI",6,,0,,,,,0,,,1343,29,,,,,,69,,0,0,,,,,,61,,0,1412,29,,,,,1457,48,,0 +"2020-05-22","VT",54,54,0,,,,16,0,,,24864,1676,,,,,,952,952,2,0,,,,,,834,,0,30046,825,,,,,25816,1678,30046,825 +"2020-05-22","WA",1044,1044,7,,3156,3156,572,31,,,,0,,,,,85,20302,20302,268,0,,,,,,,337656,5844,337656,5844,,,,,301452,4568,,0 +"2020-05-22","WI",496,496,9,,2259,2259,416,41,535,134,172703,9465,,,,,,16340,14396,548,0,,,,,,8362,236020,11512,236020,11512,,,,,187099,25977,,0 +"2020-05-22","WV",71,,1,,,,47,0,,13,,0,,,,,9,1616,1593,23,0,,,,,,983,,0,81011,1428,,,,,,0,81011,1428 +"2020-05-22","WY",12,,1,,76,76,10,1,,,18621,568,,,21405,,,803,608,2,0,,,,,770,551,,0,22175,780,,,,,,0,22175,780 +"2020-05-21","AK",10,10,0,,47,47,19,1,,,,0,,,,,,404,,0,0,,,,,,356,,0,39545,2500,,,,,,0,39545,2500 +"2020-05-21","AL",529,529,12,,1528,1528,574,35,526,,157620,5914,,,,311,,13119,13119,375,0,,,,,,,,0,170739,6289,,,,,170739,6289,,0 +"2020-05-21","AR",110,,3,,535,535,78,0,,,93818,2563,,,,101,14,5458,5458,455,0,,,,,,3915,,0,99276,3018,,,,,,0,99276,3018 +"2020-05-21","AS",0,,0,,,,,0,,,124,0,,,,,,0,0,0,0,,,,,,,,0,124,0,,,,,,0,124,0 +"2020-05-21","AZ",763,,16,,2885,2885,812,49,,299,156312,5774,,,,,197,15315,,418,0,,,,,,,,0,235548,6829,,,65790,,171627,6192,235548,6829 +"2020-05-21","CA",3542,,106,,,,4735,0,,1310,,0,,,,,,86197,86197,2140,0,,,,,,,,0,1421127,41007,,,,,,0,1421127,41007 +"2020-05-21","CO",1310,1036,11,273,4037,4037,620,47,,,119034,6220,38142,,,,,23191,20903,394,0,3315,,,,,,158918,5121,158918,5121,41457,,,,139937,4326,,0 +"2020-05-21","CT",3582,,53,,10946,10946,816,0,,,,0,,,165919,,,39208,,191,0,,,,,47621,6264,,0,214445,7065,,,,,,0,214445,7065 +"2020-05-21","DC",412,,5,,,,336,0,,,,0,,,,,74,7788,,237,0,,,,,,1061,41756,1337,41756,1337,,,,,,0,,0 +"2020-05-21","DE",417,364,3,53,,,220,0,,,39156,1938,,,,,,8386,,192,0,,,,,10177,4130,59225,1171,59225,1171,,,,,47542,2130,,0 +"2020-05-21","FL",2222,2222,49,,9200,9200,,266,,,765254,41377,,,871876,,,47092,,1190,0,,,,,66424,,817226,45203,817226,45203,,,,,815584,42915,940758,53378 +"2020-05-21","GA",1754,,67,,7235,7235,919,128,1642,,,0,,,,,,40405,40405,758,0,,,,,35526,,,0,339388,477,,,,,,0,339388,477 +"2020-05-21","GU",5,,0,,,,,0,,,4899,92,,,4875,,,165,160,0,0,,,,,160,125,,0,5064,92,,,,,,0,5167,132 +"2020-05-21","HI",17,17,0,,82,82,,0,,,46506,843,,,,,,643,,2,0,,,,,606,578,45969,1033,45969,1033,,,,,47149,845,,0 +"2020-05-21","IA",406,,18,,,,376,0,,125,100395,5261,,11908,,,80,16170,16170,556,0,,,1711,,,8672,,0,116565,5817,,,13622,,116828,5821,,0 +"2020-05-21","ID",77,,0,,221,221,27,6,91,,36382,291,,,,,,2506,2278,30,0,,,,,,1688,,0,38660,316,,,,,38660,316,,0 +"2020-05-21","IL",4607,4607,82,,,,4107,0,,1088,,0,,,,,609,102686,102686,2268,0,,,,,,,,0,672020,29307,,,,,672020,29307,672020,29307 +"2020-05-21","IN",1913,1764,49,149,4389,4389,1166,0,990,409,173059,6595,,,,,175,29936,,662,0,,,,,30933,,,0,270213,8160,,,,,202995,7257,270213,8160 +"2020-05-21","KS",178,,0,,760,760,,0,258,,62664,0,,,,116,,8539,,0,0,,,,,,,,0,71203,0,,,,,71048,0,,0 +"2020-05-21","KY",376,375,10,1,2016,2016,474,6,879,98,,0,,,,,,8275,8167,206,0,,,,,,2919,,0,158672,4872,,,,,,0,158672,4872 +"2020-05-21","LA",2629,2506,21,123,,,884,0,,,268877,18223,,,,,107,36504,36504,1188,0,,,,,,26249,,0,305381,19411,,,,,,0,305381,19411 +"2020-05-21","MA",6148,6148,82,,9040,9040,2396,143,,647,411402,10419,,,,,,90084,90084,1114,0,,,,,115960,,,0,649501,15944,,,,,501486,11533,649501,15944 +"2020-05-21","MD",2221,2116,23,105,7485,7485,1374,92,,526,176702,3695,,,,,,43531,43531,1208,0,,,,,49129,3099,,0,245385,9592,,,,,220233,4903,245385,9592 +"2020-05-21","ME",73,73,0,,235,235,41,4,,21,,0,2704,,,,12,1877,1678,58,0,177,,,,2034,1145,,0,39726,1087,2884,,,,28357,0,39726,1087 +"2020-05-21","MI",5555,5349,41,237,,,1054,0,,472,,0,,,421788,,361,60610,56132,459,0,,,,,70624,28234,,0,492412,16698,,,,,,0,492412,16698 +"2020-05-21","MN",818,809,32,9,2380,2380,566,72,787,229,177506,7307,,,,,,21582,21582,973,0,,,,,,12488,199088,8280,199088,8280,,,,,,0,,0 +"2020-05-21","MO",661,,30,,,,697,0,,,150752,0,,14443,149562,,99,11340,11340,108,0,,,601,,13853,,,0,163684,4048,,,15068,,161984,0,163684,4048 +"2020-05-21","MP",2,,0,,,,,0,,,4067,271,,,,,,22,22,1,0,,,,,,13,,0,4089,272,,,,,,0,4089,272 +"2020-05-21","MS",580,,10,,1932,1932,638,31,,158,113748,5035,,,,,92,12222,,255,0,,,,,,7681,,0,125970,5290,4055,,,,,0,125970,5290 +"2020-05-21","MT",16,,0,,65,65,3,0,,,,0,,,,,,479,,1,0,,,,,,440,,0,30524,798,,,,,,0,30524,798 +"2020-05-21","NC",716,716,14,,,,578,0,,,,0,,,,,,20860,20860,738,0,,,,,,,,0,298374,12313,,,,,,0,298374,12313 +"2020-05-21","ND",51,,2,,144,144,39,2,,,59050,1945,,,,,,2163,2163,95,0,,,,,,1340,72120,2624,72120,2624,,,,,59149,2018,73447,2667 +"2020-05-21","NE",138,,6,,,,,0,,,64518,3229,,,74773,,,11122,,276,0,,,,,12927,,,0,88023,3968,,,,,75864,3531,88023,3968 +"2020-05-21","NH",190,,8,,385,385,103,2,109,,48962,1795,,,,,,3868,,147,0,,,,,,1388,,0,58218,2531,9403,,7254,,52830,1942,58218,2531 +"2020-05-21","NJ",12518,10843,102,1675,,,3208,0,,896,392802,11858,,,,,700,151697,151472,1100,0,,,,,,,,0,544499,12958,,,,,,0,544274,12931 +"2020-05-21","NM",294,,11,,1139,1139,205,0,,,,0,,,,,,6472,,155,0,,,,,,2041,,0,152767,5423,,,,,,0,152767,5423 +"2020-05-21","NV",397,,4,,,,410,0,,92,87127,3122,,,,,52,7255,7255,89,0,,,,,,,134021,7912,134021,7912,,,,,94382,3211,111323,3657 +"2020-05-21","NY",23083,,107,,87638,87638,5187,179,,1695,,0,,,,,1345,356458,,2088,0,,,,,,,1555055,49219,1555055,49219,,,,,,0,,0 +"2020-05-21","OH",1836,1653,55,183,5295,5295,892,97,1397,349,,0,,,,,258,30167,28174,731,0,,,,,32083,,,0,319212,11572,,,,,,0,319212,11572 +"2020-05-21","OK",304,,5,,917,917,201,12,,78,143915,5076,,,142983,,,5680,5680,148,0,459,,,,6464,4361,,0,149595,5224,13642,,,,,0,149447,4229 +"2020-05-21","OR",144,,4,,723,723,152,9,,42,98348,2354,,,132082,,17,3801,,75,0,,,,,10072,1406,,0,142154,3787,,,,,102049,2419,142154,3787 +"2020-05-21","PA",4869,,245,,,,1654,0,,,303514,17480,,,,,361,65392,,1726,0,,,,,,,413149,12668,413149,12668,,,,,368906,19206,,0 +"2020-05-21","PR",126,60,1,66,,,114,0,,13,40488,40488,,,40095,,7,1213,1213,7,0,1700,,,,1572,,,0,41701,40495,,,,,,0,41701,41701 +"2020-05-21","RI",556,,18,,1506,1506,254,20,,56,86399,1939,,,117886,,41,13748,,169,0,,,,,17405,,132561,3096,132561,3096,,,,,100147,2108,135291,4109 +"2020-05-21","SC",407,407,8,,1444,1444,414,0,,,129063,3056,,,,,,9175,9175,119,0,,,,,,5451,,0,138238,3175,,,,,138238,3175,,0 +"2020-05-21","SD",48,,2,,342,342,91,9,,,27051,839,,,,,,4250,,73,0,,,,,5728,3145,,0,34800,792,,,,,31301,912,34800,792 +"2020-05-21","TN",313,313,4,,1539,1539,601,24,,,,0,,,341622,,,18961,18961,429,0,,,,,18961,12191,,0,360583,6570,,,,,360583,6570,360583,6570 +"2020-05-21","TX",1440,,21,,,,1680,0,,,,0,,,,,,52268,52268,945,0,2114,,,,68369,30341,,0,838363,33366,60252,,,,,0,838363,33366 +"2020-05-21","UT",92,,2,,647,647,169,16,207,,177855,3061,,,195678,88,,7874,,164,0,,,,,8969,4596,,0,204647,4230,,,,,185886,3227,204647,4230 +"2020-05-21","VA",1099,1064,25,35,4093,4093,1491,114,,351,,0,,,,,191,34137,32428,1229,0,1777,27,,,42676,,257480,11052,257480,11052,30922,112,,,,0,,0 +"2020-05-21","VI",6,,0,,,,,0,,,1314,0,,,,,,69,,0,0,,,,,,61,,0,1383,0,,,,,1409,26,,0 +"2020-05-21","VT",54,54,0,,,,14,0,,,23188,1099,,,,,,950,950,5,0,,,,,,827,,0,29221,1277,,,,,24138,1104,29221,1277 +"2020-05-21","WA",1037,1037,6,,3125,3125,518,3125,,,,0,,,,,70,20034,20034,299,0,,,,,,,331812,5733,331812,5733,,,,,296884,4672,,0 +"2020-05-21","WI",487,487,6,,2218,2218,398,57,526,126,163238,8938,,,,,,15792,13885,523,0,,,,,,8012,224508,13693,224508,13693,,,,,161122,0,,0 +"2020-05-21","WV",70,,1,,,,46,0,,12,,0,,,,,9,1593,1593,48,0,,,,,,983,,0,79583,3197,,,,,,0,79583,3197 +"2020-05-21","WY",11,,0,,75,75,8,1,,,18053,0,,,20650,,,801,608,14,0,,,,,745,534,,0,21395,923,,,,,,0,21395,923 +"2020-05-20","AK",10,10,0,,46,46,16,0,,,,0,,,,,,404,,3,0,,,,,,352,,0,37045,665,,,,,,0,37045,665 +"2020-05-20","AL",517,517,13,,1493,1493,560,40,524,,151706,6516,,,,309,,12744,12744,368,0,,,,,,,,0,164450,6884,,,,,164450,6884,,0 +"2020-05-20","AR",107,,5,,535,535,78,0,,,91255,2477,,,,101,14,5003,5003,80,0,,,,,,3852,,0,96258,2557,,,,,,0,96258,2557 +"2020-05-20","AS",0,,0,,,,,0,,,124,0,,,,,,0,0,0,0,,,,,,,,0,124,0,,,,,,0,124,0 +"2020-05-20","AZ",747,,43,,2836,2836,810,36,,298,150538,3533,,,,,208,14897,,331,0,,,,,,,,0,228719,8051,,,61664,,165435,3864,228719,8051 +"2020-05-20","CA",3436,,102,,,,4681,0,,1345,,0,,,,,,84057,84057,2262,0,,,,,,,,0,1380120,40804,,,,,,0,1380120,40804 +"2020-05-20","CO",1299,1026,42,273,3990,3990,613,35,,,112814,3459,35941,,,,,22797,20595,315,0,3183,,,,,,153797,4365,153797,4365,39124,,,,135611,3774,,0 +"2020-05-20","CT",3529,,57,,10946,10946,887,0,,,,0,,,159595,,,39017,,587,0,,,,,46903,6264,,0,207380,6915,,,,,,0,207380,6915 +"2020-05-20","DC",407,,7,,,,336,0,,,,0,,,,,74,7551,,117,0,,,,,,1059,40419,1045,40419,1045,,,,,,0,,0 +"2020-05-20","DE",414,362,6,52,,,220,0,,,37218,1123,,,,,,8194,,157,0,,,,,10053,3965,58054,880,58054,880,,,,,45412,1280,,0 +"2020-05-20","FL",2173,2173,44,,8934,8934,,190,,,723877,54966,,,821168,,,45902,,475,0,,,,,64172,,772023,71322,772023,71322,,,,,772669,55507,887380,67453 +"2020-05-20","GA",1687,,23,,7107,7107,959,80,1617,,,0,,,,,,39647,39647,926,0,,,,,35460,,,0,338911,16484,,,,,,0,338911,16484 +"2020-05-20","GU",5,,0,,,,,0,,,4807,134,,,4754,,,165,160,11,0,,,,,149,125,,0,4972,145,,,,,,0,5035,115 +"2020-05-20","HI",17,17,0,,82,82,,0,,,45663,1280,,,,,,641,,1,0,,,,,606,578,44936,836,44936,836,,,,,46304,1281,,0 +"2020-05-20","IA",388,,16,,,,381,0,,126,95134,2835,,11304,,,84,15614,15614,265,0,,,1696,,,8362,,0,110748,3100,,,13004,,111007,3359,,0 +"2020-05-20","ID",77,,3,,215,215,28,2,89,,36091,477,,,,,,2476,2253,21,0,,,,,,1668,,0,38344,497,,,,,38344,497,,0 +"2020-05-20","IL",4525,4525,146,,,,3914,0,,1005,,0,,,,,554,100418,100418,2388,0,,,,,,,,0,642713,21029,,,,,642713,21029,642713,21029 +"2020-05-20","IN",1864,1716,40,148,4389,4389,1288,0,990,431,166464,5839,,,,,197,29274,,569,0,,,,,30308,,,0,262053,8870,,,,,195738,6408,262053,8870 +"2020-05-20","KS",178,,5,,760,760,,20,258,,62664,4014,,,,116,,8539,,199,0,,,,,,,,0,71203,4213,,,,,71048,4166,,0 +"2020-05-20","KY",366,365,0,1,2010,2010,443,30,875,269,,0,,,,,,8069,7979,0,0,,,,,,2826,,0,153800,0,,,,,,0,153800,0 +"2020-05-20","LA",2608,2485,27,123,,,931,0,,,250654,7619,,,,,110,35316,35316,278,0,,,,,,26249,,0,285970,7897,,,,,,0,285970,7897 +"2020-05-20","MA",6066,6066,128,,8897,8897,2518,131,,675,400983,11968,,,,,,88970,88970,1045,0,,,,,114290,,,0,633557,16910,,,,,489953,13013,633557,16910 +"2020-05-20","MD",2198,2093,34,105,7393,7393,1410,194,,539,173007,5895,,,,,,42323,42323,777,0,,,,,47697,2993,,0,235793,7535,,,,,215330,6672,235793,7535 +"2020-05-20","ME",73,73,0,,231,231,43,6,,24,,0,2704,,,,12,1819,1632,78,0,177,,,,1986,1100,,0,38639,1262,2884,,,,28357,0,38639,1262 +"2020-05-20","MI",5514,5318,44,236,,,1066,0,,492,,0,,,405848,,332,60151,55838,575,0,,,,,69866,28234,,0,475714,14349,,,,,,0,475714,14349 +"2020-05-20","MN",786,777,29,9,2308,2308,550,87,773,212,170199,6190,,,,,,20609,20609,767,0,,,,,,12227,190808,6957,190808,6957,,,,,,0,,0 +"2020-05-20","MO",631,,15,,,,546,0,,,150752,7722,,13224,145742,,103,11232,11232,152,0,,,545,,13629,,,0,159636,4863,,,13788,,161984,7874,159636,4863 +"2020-05-20","MP",2,,0,,,,,0,,,3796,0,,,,,,21,21,0,0,,,,,,13,,0,3817,0,,,,,,0,3817,0 +"2020-05-20","MS",570,,16,,1901,1901,644,61,,157,108713,2657,,,,,89,11967,,263,0,,,,,,7681,,0,120680,2920,,,,,,0,120680,2920 +"2020-05-20","MT",16,,0,,65,65,3,0,,,,0,,,,,,478,,7,0,,,,,,440,,0,29726,776,,,,,,0,29726,776 +"2020-05-20","NC",702,702,11,,,,554,0,,,,0,,,,,,20122,20122,422,0,,,,,,,,0,286061,8647,,,,,,0,286061,8647 +"2020-05-20","ND",49,,4,,142,142,38,7,,,57105,1368,,,,,,2068,2068,81,0,,,,,,1302,69496,1982,69496,1982,,,,,57131,1502,70780,2033 +"2020-05-20","NE",132,,7,,,,,0,,,61289,1930,,,71185,,,10846,,221,0,,,,,12553,,,0,84055,3311,,,,,72333,2186,84055,3311 +"2020-05-20","NH",182,,10,,383,383,105,15,109,,47167,1345,,,,,,3721,,69,0,,,,,,1275,,0,55687,3427,8744,,6617,,50888,1414,55687,3427 +"2020-05-20","NJ",12416,10747,168,1669,,,3405,0,,969,380944,9775,,,,,750,150597,150399,1405,0,,,,,,,,0,531541,11180,,,,,,0,531343,11161 +"2020-05-20","NM",283,,7,,1139,1139,206,253,,,,0,,,,,,6317,,125,0,,,,,,1985,,0,147344,5098,,,,,,0,147344,5098 +"2020-05-20","NV",393,,3,,,,437,0,,107,84005,3496,,,,,60,7166,7166,120,0,,,,,,,126109,7055,126109,7055,,,,,91171,3616,107666,3963 +"2020-05-20","NY",22976,,133,,87459,87459,5570,290,,1761,,0,,,,,1421,354370,,1525,0,,,,,,,1505836,38097,1505836,38097,,,,,,0,,0 +"2020-05-20","OH",1781,1603,61,178,5198,5198,902,81,1369,333,,0,,,,,248,29436,27517,484,0,,,,,31379,,,0,307640,9305,,,,,,0,307640,9305 +"2020-05-20","OK",299,,5,,905,905,209,8,,92,138839,5181,,,138839,,,5532,5532,43,0,459,,,,6379,4266,,0,144371,5224,13642,,,,,0,145218,4956 +"2020-05-20","OR",140,,2,,714,714,137,6,,43,95994,2366,,,128370,,13,3726,,39,0,,,,,9997,1406,,0,138367,4024,,,,,99630,2398,138367,4024 +"2020-05-20","PA",4624,,0,,,,1818,0,,,286034,0,,,,,377,63666,,0,0,,,,,,,400481,10050,400481,10050,,,,,349700,0,,0 +"2020-05-20","PR",125,66,1,,,,110,0,,20,,0,,,,,5,1206,1206,-1,0,1660,,,,,,,0,1206,-1,,,,,,0,,0 +"2020-05-20","RI",538,,6,,1486,1486,257,22,,58,84460,1525,,,114141,,45,13579,,187,0,,,,,17041,,129465,3583,129465,3583,,,,,98039,1712,131182,3078 +"2020-05-20","SC",399,399,0,,1444,1444,,0,,,126007,0,,,,,,9056,9056,0,0,,,,,,5451,,0,135063,0,,,,,135063,0,,0 +"2020-05-20","SD",46,,0,,333,333,81,6,,,26212,588,,,,,,4177,,92,0,,,,,5642,3023,,0,34008,762,,,,,30389,680,34008,762 +"2020-05-20","TN",309,309,4,,1515,1515,652,17,,,,0,,,335481,,,18532,18532,154,0,,,,,18532,11783,,0,354013,7890,,,,,354013,7890,354013,7890 +"2020-05-20","TX",1419,,50,,,,1791,0,,,,0,,,,,,51323,51323,1411,0,,,,,66586,30341,,0,804997,33843,49313,,,,,0,804997,33843 +"2020-05-20","UT",90,,2,,631,631,144,12,200,,174794,3426,,,191649,87,,7710,,192,0,,,,,8768,4423,,0,200417,4566,,,,,182659,3615,200417,4566 +"2020-05-20","VA",1074,1040,33,34,3979,3979,1536,75,,370,,0,,,,,202,32908,31247,763,0,1647,25,,,41104,,246428,8154,246428,8154,28875,109,,,,0,,0 +"2020-05-20","VI",6,,0,,,,,0,,,1314,16,,,,,,69,,0,0,,,,,,61,,0,1383,16,,,,,1383,16,,0 +"2020-05-20","VT",54,54,0,,,,15,0,,,22089,527,,,,,,945,945,1,0,,,,,,824,,0,27944,595,,,,,23034,528,27944,595 +"2020-05-20","WA",1031,1031,29,,,,504,0,,52,,0,,,,,,19735,19735,319,0,,,,,,,326079,7060,326079,7060,,,,,292212,5638,,0 +"2020-05-20","WI",481,481,14,,2161,2161,393,51,515,128,154300,6063,,,,,,15269,13413,577,0,,,,,,7728,210815,11911,210815,11911,,,,,161122,0,,0 +"2020-05-20","WV",69,,1,,,,58,0,,16,,0,,,,,9,1545,1545,36,0,,,,,,950,,0,76386,1780,,,,,,0,76386,1780 +"2020-05-20","WY",11,,1,,74,74,9,1,,,18053,969,,,19744,,,787,596,11,0,,,,,728,528,,0,20472,602,,,,,,0,20472,602 +"2020-05-19","AK",10,10,0,,46,46,16,0,,,,0,,,,,,401,,0,0,,,,,,348,,0,36380,769,,,,,,0,36380,769 +"2020-05-19","AL",504,504,15,,1453,1453,489,37,517,,145190,153,,,,306,,12376,12376,290,0,,,,,,,,0,157566,443,,,,,157566,443,,0 +"2020-05-19","AR",102,,2,,535,535,78,5,,,88778,8352,,,,101,14,4923,4923,110,0,,,,,,3739,,0,93701,8516,,,,,,0,93701,8516 +"2020-05-19","AS",0,,0,,,,,0,,,124,19,,,,,,0,0,0,0,,,,,,,,0,124,19,,,,,,0,124,19 +"2020-05-19","AZ",704,,18,,2800,2800,792,43,,318,147005,4702,,,,,201,14566,,396,0,,,,,,,,0,220668,9122,,,59041,,161571,5098,220668,9122 +"2020-05-19","CA",3334,,32,,,,4363,0,,1307,,0,,,,,,81795,81795,1365,0,,,,,,,,0,1339316,46644,,,,,,0,1339316,46644 +"2020-05-19","CO",1257,1001,33,256,3955,3955,626,56,,,109355,224,33887,,,,,22482,20304,280,0,3047,,,,,,149432,3014,149432,3014,36934,,,,131837,2678,,0 +"2020-05-19","CT",3472,,23,,10946,10946,914,0,,,,0,,,153485,,,38430,,314,0,,,,,46117,6264,,0,200465,6844,,,,,,0,200465,6844 +"2020-05-19","DC",400,,8,,,,375,0,,,,0,,,,,77,7434,,164,0,,,,,,1040,39374,1549,39374,1549,,,,,,0,,0 +"2020-05-19","DE",408,357,9,51,,,236,0,,,36095,1506,,,,,,8037,,168,0,,,,,9932,3760,57174,983,57174,983,,,,,44132,1674,,0 +"2020-05-19","FL",2129,2129,56,,8744,8744,,191,,,668911,38941,,,754767,,,45427,,612,0,,,,,63148,,700701,30481,700701,30481,,,,,717162,39452,819927,73803 +"2020-05-19","GA",1664,,22,,7027,7027,986,111,1589,,,0,,,,,,38721,38721,640,0,,,,,34500,,,0,322427,4167,,,,,,0,322427,4167 +"2020-05-19","GU",5,,0,,,,,0,,,4673,104,,,4645,,,154,149,0,0,,,,,149,126,,0,4827,104,,,,,,0,4920,4920 +"2020-05-19","HI",17,17,0,,82,82,,0,,,44383,2978,,,,,,640,,0,0,,,,,604,574,44100,478,44100,478,,,,,45023,2499,,0 +"2020-05-19","IA",372,,17,,,,383,0,,126,92299,4106,,10718,,,83,15349,15349,394,0,,,1683,,,8130,,0,107648,4500,,,12404,,107648,4500,,0 +"2020-05-19","ID",74,,1,,213,213,28,0,89,,35614,1361,,,,,,2455,2233,36,0,,,,,,1649,,0,37847,1391,,,,,37847,1391,,0 +"2020-05-19","IL",4379,4379,145,,,,4002,0,,993,,0,,,,,576,98030,98030,1545,0,,,,,,,,0,621684,18443,,,,,621684,18443,621684,18443 +"2020-05-19","IN",1824,1678,59,146,4389,4389,1268,0,990,421,160625,4968,,,,,206,28705,,450,0,,,,,29641,,,0,253183,10043,,,,,189330,5418,253183,10043 +"2020-05-19","KS",173,,0,,740,740,,0,250,,58650,0,,,,115,,8340,,0,0,,,,,,,,0,66990,0,,,,,66882,0,,0 +"2020-05-19","KY",366,345,32,1,1980,1980,447,84,866,277,,0,,,,,,8069,7883,381,0,,,,,,2826,,0,153800,24395,,,,,,0,153800,24395 +"2020-05-19","LA",2581,2458,18,123,,,1004,0,,,243035,7996,,,,,112,35038,35038,329,0,,,,,,26249,,0,278073,8325,,,,,,0,278073,8325 +"2020-05-19","MA",5938,5938,76,,8766,8766,2472,145,,672,389015,6868,,,,,,87925,87925,873,0,,,,,112611,,,0,616647,16689,,,,,476940,7741,616647,16689 +"2020-05-19","MD",2164,2061,42,103,7199,7199,1421,113,,537,167112,5368,,,,,,41546,41546,1784,0,,,,,46787,2868,,0,228258,5757,,,,,208658,7152,228258,5757 +"2020-05-19","ME",73,73,2,,225,225,44,2,,19,,0,587,,,,11,1741,1561,28,0,,,,,1922,1088,,0,37377,836,,,,,28357,0,37377,836 +"2020-05-19","MI",5470,5278,43,233,,,1079,0,,486,,0,,,392208,,351,59576,55461,764,0,,,,,69157,28234,,0,461365,17060,,,,,,0,461365,17060 +"2020-05-19","MN",757,748,17,9,2221,2221,545,93,750,229,164009,5522,,,,,,19842,19842,855,0,,,,,,11540,183851,6377,183851,6377,,,,,,0,,0 +"2020-05-19","MO",616,,11,,,,721,0,,,143030,2637,,12995,141119,,103,11080,11080,135,0,,,532,,13393,,,0,154773,2453,,,13545,,154110,2772,154773,2453 +"2020-05-19","MP",2,,0,,,,,0,,,3796,397,,,,,,21,21,0,0,,,,,,13,,0,3817,397,,,,,,0,3817,397 +"2020-05-19","MS",554,,26,,1840,1840,611,35,,153,106056,1721,,,,,87,11704,,272,0,,,,,,7681,,0,117760,1993,,,,,,0,117760,1993 +"2020-05-19","MT",16,,0,,65,65,5,1,,,,0,,,,,,471,,1,0,,,,,,437,,0,28950,783,,,,,,0,28950,783 +"2020-05-19","NC",691,691,30,,,,585,0,,,,0,,,,,,19700,19700,677,0,,,,,,,,0,277414,8397,,,,,,0,277414,8397 +"2020-05-19","ND",45,,1,,135,135,32,2,,,55737,1107,,,,,,1987,1987,60,0,,,,,,1269,67514,1839,67514,1839,,,,,55629,1138,68747,1886 +"2020-05-19","NE",125,,2,,,,,0,,,59359,2206,,,68180,,,10625,,277,0,,,,,12264,,,0,80744,4046,,,,,70147,2498,80744,4046 +"2020-05-19","NH",172,,0,,368,368,109,9,109,,45822,4540,,,,,,3652,,56,0,,,,,,1269,,0,52260,1273,8090,,6445,,49474,4596,52260,1273 +"2020-05-19","NJ",12248,10586,152,1662,,,3481,0,,977,371169,13639,,,,,789,149192,149013,988,0,,,,,,,,0,520361,14627,,,,,,0,520182,14613 +"2020-05-19","NM",276,,6,,886,886,204,0,,,,0,,,,,,6192,,96,0,,,,,,1882,,0,142246,4626,,,,,,0,142246,4626 +"2020-05-19","NV",390,,7,,,,405,0,,106,80509,5583,,,,,54,7046,7046,140,0,,,,,,,119054,6265,119054,6265,,,,,87555,5723,103703,6609 +"2020-05-19","NY",22843,,114,,87169,87169,5818,268,,1836,,0,,,,,1481,352845,,1474,0,,,,,,,1467739,28182,1467739,28182,,,,,,0,,0 +"2020-05-19","OH",1720,1556,63,164,5117,5117,913,119,1357,365,,0,,,,,234,28952,27106,498,0,,,,,30863,,,0,298335,7523,,,,,,0,298335,7523 +"2020-05-19","OK",294,,6,,897,897,167,12,,77,133658,15496,,,133658,,,5489,5489,91,0,459,,,,6221,4135,,0,139147,15587,13642,,,,,0,140262,16308 +"2020-05-19","OR",138,,1,,708,708,137,5,,43,93628,2895,,,124438,,13,3687,,64,0,,,,,9905,1406,,0,134343,2713,,,,,97232,2957,134343,2713 +"2020-05-19","PA",4624,,119,,,,1861,0,,,286034,8481,,,,,380,63666,,610,0,,,,,,,390431,10983,390431,10983,,,,,349700,9091,,0 +"2020-05-19","PR",124,60,0,,,,121,0,,20,,0,,,,,8,1207,1207,12,0,1598,,,,,,,0,1207,12,,,,,,0,,0 +"2020-05-19","RI",532,,26,,1464,1464,247,26,,59,82935,1878,,,111383,,44,13392,,215,0,,,,,16721,,125882,2251,125882,2251,,,,,96327,2093,128104,3482 +"2020-05-19","SC",399,399,8,,1444,1444,,23,,,126007,3390,,,,,,9056,9056,114,0,,,,,,5451,,0,135063,3504,,,,,135063,3504,,0 +"2020-05-19","SD",46,,2,,327,327,75,11,,,25624,606,,,,,,4085,,58,0,,,,,5572,2914,,0,33246,454,,,,,29709,664,33246,454 +"2020-05-19","TN",305,305,4,,1498,1498,615,9,,,,0,,,327745,,,18378,18378,367,0,,,,,18378,10969,,0,346123,8695,,,,,346123,8695,346123,8695 +"2020-05-19","TX",1369,,22,,,,1732,0,,,,0,,,,,,49912,49912,1219,0,,,,,64658,29359,,0,771154,36943,44791,,,,,0,771154,36943 +"2020-05-19","UT",88,,8,,619,619,96,24,197,,171368,3175,,,187302,84,,7518,,134,0,,,,,8549,4275,,0,195851,4217,,,,,179044,3380,195851,4217 +"2020-05-19","VA",1041,1007,27,34,3904,3904,1497,82,,377,,0,,,,,199,32145,30539,1005,0,1561,25,,,39921,,238274,5640,238274,5640,27340,109,,,,0,,0 +"2020-05-19","VI",6,,0,,,,,0,,,1298,20,,,,,,69,,0,0,,,,,,61,,0,1367,20,,,,,1367,20,,0 +"2020-05-19","VT",54,54,0,,,,24,0,,,21562,548,,,,,,944,944,4,0,,,,,,820,,0,27349,643,,,,,22506,552,27349,643 +"2020-05-19","WA",1002,1002,1,,,,539,0,,52,,0,,,,,,19416,19416,64,0,,,,,,,319019,8633,319019,8633,,,,,286574,7096,,0 +"2020-05-19","WI",467,467,8,,2110,2110,398,42,503,130,148237,3735,,,,,,14692,12885,250,0,,,,,,7371,198904,8072,198904,8072,,,,,161122,3933,,0 +"2020-05-19","WV",68,,1,,,,54,0,,18,,0,,,,,9,1509,1509,18,0,,,,,,922,,0,74606,2141,,,,,,0,74606,2141 +"2020-05-19","WY",10,,2,,73,73,8,0,,,17084,753,,,19150,,,776,583,10,0,,,,,720,504,,0,19870,645,,,,,,0,19870,645 +"2020-05-18","AK",10,10,0,,46,46,9,0,,,,0,,,,,,401,,3,0,,,,,,345,,0,35611,960,,,,,,0,35611,960 +"2020-05-18","AL",489,489,1,,1416,1416,536,24,512,,145037,458,,,,302,,12086,12086,315,0,,,,,,,,0,157123,773,,,,,157123,773,,0 +"2020-05-18","AR",100,,2,,530,530,77,10,,,80426,0,,,,101,12,4813,4813,54,0,,,,,,3645,,0,85185,0,,,,,,0,85185,0 +"2020-05-18","AS",0,,0,,,,,0,,,105,0,,,,,,0,0,0,0,,,,,,,,0,105,0,,,,,,0,105,0 +"2020-05-18","AZ",686,,6,,2757,2757,820,54,,329,142303,4479,,,,,200,14170,,233,0,,,,,,,,0,211546,3281,,,56311,,156473,4712,211546,3281 +"2020-05-18","CA",3302,,41,,,,4391,0,,1325,,0,,,,,,80430,80430,1591,0,,,,,,,,0,1292672,57429,,,,,,0,1292672,57429 +"2020-05-18","CO",1224,975,9,249,3899,3899,626,27,,,109131,2574,33431,,,,,22202,20028,264,0,3018,,,,,,146418,3269,146418,3269,36359,,,,129159,2829,,0 +"2020-05-18","CT",3449,,41,,10946,10946,920,0,,,,0,,,147382,,,38116,,697,0,,,,,45404,6264,,0,193621,2682,,,,,,0,193621,2682 +"2020-05-18","DC",392,,9,,,,374,0,,,,0,,,,,70,7270,,147,0,,,,,,1028,37825,1299,37825,1299,,,,,,0,,0 +"2020-05-18","DE",399,351,7,48,,,240,0,,,34589,1394,,,,,,7869,,199,0,,,,,9840,3545,56191,2093,56191,2093,,,,,42458,1593,,0 +"2020-05-18","FL",2073,2073,24,,8553,8553,,75,,,629970,23766,,,683219,,,44815,,654,0,,,,,60938,,670220,19312,670220,19312,,,,,677710,24629,746124,0 +"2020-05-18","GA",1642,,36,,6916,6916,1025,126,1565,,,0,,,,,,38081,38081,380,0,,,,,34333,,,0,318260,9329,,,,,,0,318260,9329 +"2020-05-18","GU",5,,0,,,,,0,,,4569,119,,,,,,154,149,0,0,,,,,,126,,0,4723,119,,,,,,0,,0 +"2020-05-18","HI",17,17,0,,82,82,,0,,,41405,370,,,,,,640,,1,0,,,,,604,573,43622,717,43622,717,,,,,42524,746,,0 +"2020-05-18","IA",355,,4,,,,382,0,,121,88193,2603,,,,,85,14955,14955,304,0,,,,,,7324,,0,103148,2907,,,,,103148,2907,,-100241 +"2020-05-18","ID",73,,0,,213,213,30,0,89,,34253,0,,,,,,2419,2203,0,0,,,,,,1612,,0,36456,0,,,,,36456,0,,0 +"2020-05-18","IL",4234,4234,57,,,,4120,0,,1096,,0,,,,,636,96485,96485,2294,0,,,,,,,,0,603241,21297,,,,,603241,603241,603241,21297 +"2020-05-18","IN",1765,1621,14,144,4389,4389,1244,0,990,426,155657,6192,,,,,212,28255,,477,0,,,,,28874,,,0,243140,2308,,,,,183912,6669,243140,2308 +"2020-05-18","KS",173,,1,,740,740,,16,250,,58650,4944,,,,115,,8340,,454,0,,,,,,,,0,66990,5398,,,,,66882,5394,,0 +"2020-05-18","KY",334,334,0,,1896,1896,381,0,797,218,,0,,,,,,7688,7408,0,0,,,,,,2768,,0,129405,0,,,,,,0,129405,0 +"2020-05-18","LA",2563,2440,72,123,,,1031,0,,,235039,4301,,,,,118,34709,34709,277,0,,,,,,26249,,0,269748,4578,,,,,,0,269748,4578 +"2020-05-18","MA",5862,5862,65,,8621,8621,2533,82,,674,382147,7331,,,,,,87052,87052,1042,0,,,,,110751,,,0,599958,17590,,,,,469199,8373,599958,17590 +"2020-05-18","MD",2122,2020,32,102,7086,7086,1447,93,,555,161744,5622,,,,,,39762,39762,958,0,,,,,45932,2817,,0,222501,6706,,,,,201506,6580,222501,6706 +"2020-05-18","ME",71,71,1,,223,223,42,7,,16,,0,587,,,,10,1713,1533,26,0,,,,,1870,1053,,0,36541,639,,,,,28357,0,36541,639 +"2020-05-18","MI",5427,5237,31,233,,,1075,0,,473,,0,,,376115,,418,58812,54872,534,0,,,,,68190,28234,,0,444305,13503,,,,,,0,444305,13503 +"2020-05-18","MN",740,731,9,9,2128,2128,488,38,731,229,158487,5418,,,,,,18987,18987,971,0,,,,,,10764,177474,6397,177474,6397,,,,,,0,,0 +"2020-05-18","MO",605,,11,,,,570,0,,,140393,4927,,12553,138777,,91,10945,10945,156,0,,,519,,13283,,,0,152320,6065,,,13090,,151338,2421,152320,6065 +"2020-05-18","MP",2,,0,,,,,0,,,3399,81,,,,,,21,21,0,0,,,,,,12,,0,3420,81,,,,,,0,3420,3420 +"2020-05-18","MS",528,,7,,1805,1805,559,32,,141,104335,2505,,,,,75,11432,,136,0,,,,,,7681,,0,115767,2641,,,,,,0,115767,2641 +"2020-05-18","MT",16,,0,,64,64,4,1,,,,0,,,,,,470,,2,0,,,,,,434,,0,28167,1282,,,,,,0,28167,1282 +"2020-05-18","NC",661,661,2,,,,511,0,,,,0,,,,,,19023,19023,511,0,,,,,,,,0,269017,9508,,,,,,0,269017,9508 +"2020-05-18","ND",44,,1,,133,133,32,3,,,54630,1309,,,,,,1927,1927,31,0,,,,,,1219,65675,2022,65675,2022,,,,,54491,1303,66861,2047 +"2020-05-18","NE",123,,0,,,,,0,,,57153,1733,,,64529,,,10348,,128,0,,,,,11881,,,0,76698,1425,,,,,67649,1875,76698,1425 +"2020-05-18","NH",172,,1,,359,359,114,12,109,,41282,86,,,,,,3596,,40,0,,,,,,1268,,0,50987,2601,7663,,5839,,44878,126,50987,2601 +"2020-05-18","NJ",12096,10435,83,1661,,,3509,0,,1053,357530,16299,,,,,819,148204,148039,1712,0,,,,,,,,0,505734,18011,,,,,,0,505569,18004 +"2020-05-18","NM",270,,5,,886,886,213,0,,,,0,,,,,,6096,,158,0,,,,,,1796,,0,137620,4367,,,,,,0,137620,4367 +"2020-05-18","NV",383,,8,,,,423,0,,105,74926,1146,,,,,65,6906,6906,49,0,,,,,,,112789,2625,112789,2625,,,,,81832,1195,97094,1140 +"2020-05-18","NY",22729,,110,,86901,86901,5840,326,,1908,,0,,,,,1538,351371,,1250,0,,,,,,,1439557,26161,1439557,26161,,,,,,0,,0 +"2020-05-18","OH",1657,1504,32,153,4998,4998,912,77,1328,367,,0,,,,,247,28454,26646,531,0,,,,,30424,,,0,290812,9922,,,,,,0,290812,9922 +"2020-05-18","OK",288,,0,,885,885,76,5,,45,118162,0,,,118162,,,5398,5398,88,0,459,,,,5792,4008,,0,123560,88,13642,,,,,0,123954,0 +"2020-05-18","OR",137,,0,,703,703,156,4,,37,90733,2146,,,121801,,16,3623,,11,0,,,,,9829,1406,,0,131630,3977,,,,,94275,2154,131630,3977 +"2020-05-18","PA",4505,,87,,,,1885,0,,,277553,6883,,,,,397,63056,,822,0,,,,,,,379448,8975,379448,8975,,,,,340609,7705,,0 +"2020-05-18","PR",124,60,1,,,,147,0,,17,,0,,,,,4,1195,1195,48,0,1515,,,,,,,0,1195,48,,,,,,0,,0 +"2020-05-18","RI",506,,7,,1438,1438,236,20,,62,81057,1289,,,108303,,46,13177,,137,0,,,,,16319,,123631,2999,123631,2999,,,,,94234,1426,124622,2130 +"2020-05-18","SC",391,391,11,,1421,1421,,0,,,122617,10947,,,,,,8942,8942,126,0,,,,,,5076,,0,131559,11073,,,,,131559,131559,,-120331 +"2020-05-18","SD",44,,0,,316,316,77,4,,,25018,446,,,,,,4027,,40,0,,,,,5542,2784,,0,32792,881,,,,,29045,486,32792,881 +"2020-05-18","TN",301,301,3,,1489,1489,638,7,,,,0,,,319417,,,18011,18011,623,0,,,,,18011,9886,,0,337428,12148,,,,,337428,337428,337428,12148 +"2020-05-18","TX",1347,,11,,,,1551,0,,,,0,,,,,,48693,48693,909,0,,,,,61814,28371,,0,734211,11780,43168,,,,,0,734211,11780 +"2020-05-18","UT",80,,0,,595,595,179,9,197,,168193,2552,,,183311,84,,7384,,146,0,,,,,8323,4183,,0,191634,3300,,,,,175664,2674,191634,3300 +"2020-05-18","VA",1014,980,5,34,3822,3822,1502,47,,361,,0,,,,,194,31140,29591,752,0,1552,25,,,39211,,232634,8508,232634,8508,27229,107,,,,0,,0 +"2020-05-18","VI",6,,0,,,,,0,,,1278,0,,,,,,69,,0,0,,,,,,61,,0,1347,0,,,,,1347,0,,0 +"2020-05-18","VT",54,54,0,,,,22,0,,,21014,562,,,,,,940,940,0,0,,,,,,815,,0,26706,672,,,,,21954,562,26706,672 +"2020-05-18","WA",1001,1001,1,,,,558,0,,52,,0,,,,,,19352,19352,118,0,,,,,,,310386,8462,310386,8462,,,,,279478,6982,,0 +"2020-05-18","WI",459,459,6,,2068,2068,379,30,496,127,144502,4828,,,,,,14442,12687,185,0,,,,,,6786,190832,6371,190832,6371,,,,,157189,4972,,-152217 +"2020-05-18","WV",67,,0,,,,48,0,,11,,0,,,,,7,1491,1491,1,0,,,,,,919,,0,72465,760,,,,,,0,72465,760 +"2020-05-18","WY",8,,0,,73,73,8,3,,,16331,0,,,18522,,,766,577,12,0,,,,,703,498,,0,19225,656,,,,,,0,19225,656 +"2020-05-17","AK",10,10,0,,46,46,13,1,,,,0,,,,,,398,,4,0,,,,,,344,,0,34651,1370,,,,,,0,34651,1370 +"2020-05-17","AL",488,488,3,,1392,1392,460,5,504,,144579,2608,,,,296,,11771,11771,248,0,,,,,,,,0,156350,2856,,,,,156350,2856,,0 +"2020-05-17","AR",98,,0,,520,520,65,0,,,80426,3360,,,,101,9,4759,4759,181,0,,,,,,3590,,0,85185,3656,,,,,,0,85185,3656 +"2020-05-17","AS",0,,0,,,,,0,,,105,0,,,,,,0,0,0,0,,,,,,,,0,105,0,,,,,,0,105,0 +"2020-05-17","AZ",680,,1,,2703,2703,796,30,,337,137824,4667,,,,,201,13937,,306,0,,,,,,,,0,208265,12342,,,51245,,151761,4973,208265,12342 +"2020-05-17","CA",3261,,57,,,,4291,0,,1293,,0,,,,,,78839,78839,2046,0,,,,,,,,0,1235243,56117,,,,,,0,1235243,56117 +"2020-05-17","CO",1215,966,23,249,3872,3872,650,6,,,106557,2642,31788,,,,,21938,19773,305,0,2886,,,,,,143149,3414,143149,3414,34674,,,,126330,2908,,0 +"2020-05-17","CT",3408,,69,,10946,10946,937,0,,,,0,,,144932,,,37419,,716,0,,,,,45178,6264,,0,190939,3717,,,,,,0,190939,3717 +"2020-05-17","DC",383,,8,,,,369,0,,,,0,,,,,74,7123,,81,0,,,,,,1023,36526,994,36526,994,,,,,,0,,0 +"2020-05-17","DE",392,345,9,47,,,229,0,,,33195,984,,,,,,7670,,123,0,,,,,9619,3478,54098,3034,54098,3034,,,,,40865,1107,,0 +"2020-05-17","FL",2049,2049,9,,8478,8478,,85,,,606204,20968,,,683219,,,44161,,1136,0,,,,,60938,,650908,21549,650908,21549,,,,,653081,22286,746124,746124 +"2020-05-17","GA",1606,,14,,6790,6790,1010,55,1557,,,0,,,,,,37701,37701,554,0,,,,,33760,,,0,308931,8234,,,,,,0,308931,8234 +"2020-05-17","GU",5,,0,,,,,0,,,4450,85,,,,,,154,149,0,0,,,,,,126,,0,4604,85,,,,,,0,,0 +"2020-05-17","HI",17,17,0,,82,82,,1,,,41035,790,,,,,,639,,1,0,,,,,601,572,42905,745,42905,745,,,,,41778,788,,0 +"2020-05-17","IA",351,,5,,,,376,0,,124,85590,3618,,,,,85,14651,14651,323,0,,,,,,7154,,0,100241,3941,,,,,100241,3941,100241,100241 +"2020-05-17","ID",73,,0,,213,213,26,0,89,,34253,954,,,,,,2419,2203,30,0,,,,,,1612,,0,36456,971,,,,,36456,971,,0 +"2020-05-17","IL",4177,4177,48,,,,4190,0,,1144,,0,,,,,735,94191,94191,1734,0,,,,,,,,0,581944,20295,,,,,,-561649,581944,20295 +"2020-05-17","IN",1751,1607,10,144,4389,4389,1246,0,990,441,149465,5387,,,,,205,27778,,498,0,,,,,28677,,,0,240832,3677,,,,,177243,5885,240832,3677 +"2020-05-17","KS",172,,0,,724,724,,0,246,,53706,0,,,,112,,7886,,0,0,,,,,,,,0,61592,0,,,,,61488,0,,0 +"2020-05-17","KY",334,334,2,,1896,1896,381,0,797,218,,0,,,,,,7688,7408,244,0,,,,,,2768,,0,129405,1707,,,,,,0,129405,1707 +"2020-05-17","LA",2491,2425,12,66,,,1019,0,,,230738,5113,,,,,111,34432,34432,315,0,,,,,,22608,,0,265170,5428,,,,,,0,265170,5428 +"2020-05-17","MA",5797,5797,92,,8539,8539,2597,83,,702,374816,11660,,,,,,86010,86010,1077,0,,,,,108607,,,0,582368,5855,,,,,460826,12737,582368,5855 +"2020-05-17","MD",2090,1989,50,101,6993,6993,1460,238,,562,156122,3915,,,,,,38804,38804,836,0,,,,,45056,2816,,0,215795,6335,,,,,194926,4751,215795,6335 +"2020-05-17","ME",70,70,0,,216,216,37,2,,16,,0,587,,,,11,1687,1511,39,0,,,,,1845,1028,,0,35902,786,,,,,28357,0,35902,786 +"2020-05-17","MI",5396,5194,39,233,,,1114,0,,488,,0,,,363548,,434,58278,54457,255,0,,,,,67254,28234,,0,430802,11436,,,,,,0,430802,11436 +"2020-05-17","MN",731,722,22,9,2090,2090,487,51,716,221,153069,5670,,,,,,18016,18016,311,0,,,,,,10175,171077,5973,171077,5973,,,,,,0,,0 +"2020-05-17","MO",594,,5,,,,775,0,,,135466,6801,,11214,135466,,116,10789,10789,114,0,,,473,,13191,,,0,146255,2289,,,11703,,148917,9577,146255,2289 +"2020-05-17","MP",2,,0,,,,,0,,,3318,0,,,,,,21,21,0,0,,,,,,12,,0,3339,0,,,,,,0,,-3339 +"2020-05-17","MS",521,,11,,1773,1773,608,25,,158,101830,4477,,,,,81,11296,,173,0,,,,,,6268,,0,113126,4650,,,,,,0,113126,4650 +"2020-05-17","MT",16,,0,,63,63,3,0,,,,0,,,,,,468,,0,0,,,,,,431,,0,26885,794,,,,,,0,26885,794 +"2020-05-17","NC",659,659,7,,,,493,0,,,,0,,,,,,18512,18512,530,0,,,,,,,,0,259509,10708,,,,,,0,259509,10708 +"2020-05-17","ND",43,,1,,130,130,30,0,,,53321,1682,,,,,,1896,1896,51,0,,,,,,1178,63653,2473,63653,2473,,,,,53188,1690,64814,2528 +"2020-05-17","NE",123,,4,,,,,0,,,55420,5214,,,63245,,,10220,,448,0,,,,,11741,,,0,75273,5410,,,,,65774,5682,75273,5410 +"2020-05-17","NH",171,,12,,347,347,115,12,109,,41196,1984,,,,,,3556,,92,0,,,,,,1258,,0,48386,1833,7349,,4435,,44752,2076,48386,1833 +"2020-05-17","NJ",12013,10356,110,1657,,,3411,0,,1030,341231,11096,,,,,819,146492,146334,1251,0,,,,,,,,0,487723,12347,,,,,,0,487565,12341 +"2020-05-17","NM",265,,6,,886,886,211,0,,,,0,,,,,,5938,,91,0,,,,,,1755,,0,133253,4679,,,,,,0,133253,4679 +"2020-05-17","NV",375,,6,,,,423,0,,105,73780,6778,,,,,65,6857,6857,148,0,,,,,,,110164,3901,110164,3901,,,,,80637,6973,95954,6500 +"2020-05-17","NY",22619,,141,,86575,86575,5897,368,,1981,,0,,,,,1601,350121,,1889,0,,,,,,,1413396,34679,1413396,34679,,,,,,0,,0 +"2020-05-17","OH",1625,1472,15,153,4921,4921,914,51,1305,343,,0,,,,,230,27923,26220,449,0,,,,,29858,,,0,280890,11055,,,,,,0,280890,11055 +"2020-05-17","OK",288,,0,,880,880,180,2,,73,118162,0,,,118162,,,5310,5310,73,0,459,,,,5792,3983,,0,123472,73,13642,,,,,0,123954,0 +"2020-05-17","OR",137,,0,,699,699,153,8,,48,88587,2622,,,117909,,16,3612,,71,0,,,,,9744,1406,,0,127653,5476,,,,,92121,2677,127653,5476 +"2020-05-17","PA",4418,,15,,,,1821,0,,,270670,4445,,,,,422,62234,,623,0,,,,,,,370473,5980,370473,5980,,,,,332904,5068,,0 +"2020-05-17","PR",123,60,1,,,,150,0,,24,,0,,,,,5,1147,1147,33,0,1499,,,,,,,0,1147,33,,,,,,0,,0 +"2020-05-17","RI",499,,10,,1418,1418,260,15,,64,79768,1537,,,106397,,45,13040,,125,0,,,,,16095,,120632,4590,120632,4590,,,,,92808,1662,122492,2928 +"2020-05-17","SC",380,380,0,,1421,1421,,0,,,111670,10461,,,,,,8816,8816,409,0,,,,,,5076,,0,120486,10870,,,,,,-109616,120331,120331 +"2020-05-17","SD",44,,0,,312,312,77,8,,,24572,355,,,,,,3987,,28,0,,,,,5489,2724,,0,31911,853,,,,,28559,383,31911,853 +"2020-05-17","TN",298,298,3,,1482,1482,513,8,,,,0,,,307892,,,17388,17388,100,0,,,,,17388,9652,,0,325280,5079,,,,,,-320201,325280,5079 +"2020-05-17","TX",1336,,31,,,,1512,0,,,,0,,,,,,47784,47784,785,0,,,,,60946,27570,,0,722431,14062,42921,,,,,0,722431,14062 +"2020-05-17","UT",80,,2,,586,586,181,8,196,,165641,3256,,,180168,84,,7238,,170,0,,,,,8166,4075,,0,188334,4066,,,,,172990,3418,188334,4066 +"2020-05-17","VA",1009,975,7,34,3775,3775,1524,51,,379,,0,,,,,195,30388,28901,705,0,1516,25,,,38003,,224126,7805,224126,7805,26744,107,,,,0,,0 +"2020-05-17","VI",6,,0,,,,,0,,,1278,84,,,,,,69,,0,0,,,,,,61,,0,1347,84,,,,,1347,47,,0 +"2020-05-17","VT",54,54,1,,,,14,0,,,20452,681,,,,,,940,940,8,0,,,,,,810,,0,26034,648,,,,,21392,689,26034,648 +"2020-05-17","WA",1000,1000,8,,,,581,0,,52,,0,,,,,,19234,19234,282,0,,,,,,,301924,2468,301924,2468,,,,,272496,1970,,0 +"2020-05-17","WI",453,453,0,,2038,2038,364,20,494,131,139674,5468,,,,,,14257,12543,379,0,,,,,,6542,184461,7819,184461,7819,,,,,152217,5824,152217,152217 +"2020-05-17","WV",67,,3,,,,48,0,,11,,0,,,,,7,1490,1490,33,0,,,,,,919,,0,71705,1805,,,,,,0,71705,1805 +"2020-05-17","WY",8,,1,,70,70,8,1,,,16331,653,,,17892,,,754,566,13,0,,,,,677,498,,0,18569,107,,,,,,0,18569,107 +"2020-05-16","AK",10,10,0,,45,45,10,2,,,,0,,,,,,394,,4,0,,,,,,344,,0,33281,863,,,,,,0,33281,863 +"2020-05-16","AL",485,485,9,,1387,1387,455,10,501,,141971,7124,,,,295,,11523,11523,307,0,,,,,,,,0,153494,7431,,,,,153494,7431,,0 +"2020-05-16","AR",98,,0,,520,520,65,0,,,77066,0,,,,101,10,4578,4578,115,0,,,,,,3472,,0,81529,0,,,,,,0,81529,0 +"2020-05-16","AS",0,,0,,,,,0,,,105,0,,,,,,0,0,0,0,,,,,,,,0,105,0,,,,,,0,105,0 +"2020-05-16","AZ",679,,28,,2673,2673,791,37,,344,133157,4325,,,,,210,13631,,462,0,,,,,,,,0,195923,9674,,,47716,,146788,4787,195923,9674 +"2020-05-16","CA",3204,,96,,,,4424,0,,1313,,0,,,,,,76793,76793,1857,0,,,,,,,,0,1179126,45220,,,,,,0,1179126,45220 +"2020-05-16","CO",1192,963,42,229,3866,3866,650,24,,,103915,3307,29935,,,,,21633,19507,401,0,2747,,,,,,139735,4422,139735,4422,32682,,,,123422,3663,,0 +"2020-05-16","CT",3339,,54,,10946,10946,994,0,,,,0,,,141531,,,36703,,618,0,,,,,44870,6264,,0,187222,7511,,,,,,0,187222,7511 +"2020-05-16","DC",375,,7,,,,382,0,,,,0,,,,,79,7042,,171,0,,,,,,998,35532,1193,35532,1193,,,,,,0,,0 +"2020-05-16","DE",383,336,10,47,,,250,0,,,32211,1306,,,,,,7547,,174,0,,,,,9344,3367,51064,1392,51064,1392,,,,,39758,1480,,0 +"2020-05-16","FL",2040,2040,49,,8393,8393,,400,,,585236,19609,,,,,,43025,,480,0,,,,,,,629359,6606,629359,6606,,,,,630795,21221,,0 +"2020-05-16","GA",1592,,35,,6735,6735,1005,297,1554,,,0,,,,,,37147,37147,466,0,,,,,33279,,,0,300697,24933,,,,,,0,300697,24933 +"2020-05-16","GU",5,,0,,,,,0,,,4365,4,,,,,,154,149,0,0,,,,,,126,,0,4519,4,,,,,,0,,0 +"2020-05-16","HI",17,17,0,,81,81,,0,,,40245,2106,,,,,,638,,1,0,,,,,600,565,42160,739,42160,739,,,,,40990,1223,,0 +"2020-05-16","IA",346,,10,,,,387,0,,128,81972,2455,,,,,83,14328,14328,279,0,,,,,,6927,,0,96300,2734,,,,,96300,2734,,0 +"2020-05-16","ID",73,,1,,213,213,19,1,89,,33299,905,,,,,,2389,2186,38,0,,,,,,1588,,0,35485,939,,,,,35485,939,,0 +"2020-05-16","IL",4129,4129,71,,,,4306,0,,1135,,0,,,,,653,92457,92457,2088,0,,,,,,,,0,561649,23047,,,,,561649,23047,561649,23047 +"2020-05-16","IN",1741,1596,50,145,4389,4389,1274,0,990,426,144078,5285,,,,,199,27280,,625,0,,,,,28421,,,0,237155,11307,,,,,171358,5910,237155,11307 +"2020-05-16","KS",172,,0,,724,724,,0,246,,53706,0,,,,112,,7886,,0,0,,,,,,,,0,61592,0,,,,,61488,0,,0 +"2020-05-16","KY",332,332,4,,1896,1896,381,9,797,218,,0,,,,,,7444,7408,219,0,,,,,,2739,,0,127698,6452,,,,,,0,127698,6452 +"2020-05-16","LA",2479,2413,31,66,,,1028,0,,,225625,6273,,,,,123,34117,34117,280,0,,,,,,22608,,0,259742,6553,,,,,,0,259742,6553 +"2020-05-16","MA",5705,5705,113,,8456,8456,2692,142,,747,363156,10898,,,,,,84933,84933,1512,0,,,,,108011,,,0,576513,9340,,,,,448089,12410,576513,9340 +"2020-05-16","MD",2040,1943,49,97,6755,6755,1500,76,,598,152207,6367,,,,,,37968,37968,982,0,,,,,44114,2806,,0,209460,7598,,,,,190175,7349,209460,7598 +"2020-05-16","ME",70,70,1,,214,214,37,3,,19,,0,587,,,,10,1648,1477,45,0,,,,,1802,1012,,0,35116,854,,,,,28357,0,35116,854 +"2020-05-16","MI",5357,5163,32,233,,,1256,0,,532,,0,,,353156,,440,58023,54246,336,0,,,,,66210,28234,,0,419366,12186,,,,,,0,419366,12186 +"2020-05-16","MN",709,700,17,9,2039,2039,493,54,700,225,147399,7626,,,,,,17705,17705,342,0,,,,,,9571,165104,7968,165104,7968,,,,,,0,,0 +"2020-05-16","MO",589,,13,,,,775,0,,,128665,4663,,9802,130771,,116,10675,10675,219,0,,,422,,12943,,,0,143966,4226,,,10238,,139340,4882,143966,4226 +"2020-05-16","MP",2,,0,,,,,0,,,3318,12,,,,,,21,21,2,0,,,,,,12,,0,3339,14,,,,,,0,3339,14 +"2020-05-16","MS",510,,17,,1748,1748,641,36,,170,97353,1331,,,,,81,11123,,322,0,,,,,,6268,,0,108476,1653,,,,,,0,108476,1653 +"2020-05-16","MT",16,,0,,63,63,3,0,,,,0,,,,,,468,,2,0,,,,,,431,,0,26091,673,,,,,,0,26091,673 +"2020-05-16","NC",652,652,11,,,,481,0,,,,0,,,,,,17982,17982,853,0,,,,,,,,0,248801,13923,,,,,,0,248801,13923 +"2020-05-16","ND",42,,0,,130,130,33,0,,,51639,1685,,,,,,1845,1845,87,0,,,,,,1111,61180,2684,61180,2684,,,,,51498,1681,62286,2729 +"2020-05-16","NE",119,,6,,,,,0,,,50206,2407,,,58346,,,9772,,356,0,,,,,11239,,,0,69863,4173,,,,,60092,2777,69863,4173 +"2020-05-16","NH",159,,0,,335,335,110,0,109,,39212,64,,,,,,3464,,0,0,,,,,,1254,,0,46553,2347,6593,,3913,,42676,370,46553,2347 +"2020-05-16","NJ",11903,10249,114,1654,,,3564,0,,1061,330135,11068,,,,,846,145241,145089,1197,0,,,,,,,,0,475376,12265,,,,,,0,475224,12252 +"2020-05-16","NM",259,,6,,886,886,208,0,,,,0,,,,,,5847,,185,0,,,,,,1739,,0,128574,4116,,,,,,0,128574,4116 +"2020-05-16","NV",369,,1,,,,423,0,,105,67002,1470,,,,,65,6709,6709,95,0,,,,,,,106263,7361,106263,7361,,,,,73664,1518,89454,3663 +"2020-05-16","NY",22478,,174,,86207,86207,6220,425,,2077,,0,,,,,1674,348232,,2419,0,,,,,,,1378717,40669,1378717,40669,,,,,,0,,0 +"2020-05-16","OH",1610,1457,29,153,4870,4870,866,79,1277,366,,0,,,,,251,27474,25836,520,0,,,,,29159,,,0,269835,10566,,,,,,0,269835,10566 +"2020-05-16","OK",288,,3,,878,878,180,15,,73,118162,5056,,,118162,,,5237,5237,151,0,459,,,,5792,3945,,0,123399,5207,13642,,,,,0,123954,5203 +"2020-05-16","OR",137,,0,,691,691,161,6,,46,85965,5394,,,112704,,19,3541,,62,0,,,,,9473,1406,,0,122177,3930,,,,,89444,5535,122177,3930 +"2020-05-16","PA",4403,,61,,,,1873,0,,,266225,7015,,,,,429,61611,,989,0,,,,,,,364493,9677,364493,9677,,,,,327836,8004,,0 +"2020-05-16","PR",122,59,0,,,,144,0,,15,,0,,,,,5,1114,1114,26,0,1475,,,,,,,0,1114,26,,,,,,0,,0 +"2020-05-16","RI",489,,10,,1403,1403,273,31,,66,78231,1764,,,103692,,44,12915,,252,0,,,,,15872,,116042,3839,116042,3839,,,,,91146,2016,119564,4294 +"2020-05-16","SC",380,380,0,,1421,1421,,0,,,101209,0,,,,,,8407,8407,0,0,,,,,,5076,,0,109616,0,,,,,109616,0,,0 +"2020-05-16","SD",44,,0,,304,304,75,8,,,24217,690,,,,,,3959,,72,0,,,,,5415,2673,,0,31058,1150,,,,,28176,762,31058,1150 +"2020-05-16","TN",295,295,5,,1474,1474,515,20,,,,0,,,302913,,,17288,17288,318,0,,,,,17288,9529,,0,320201,10445,,,,,320201,10445,320201,10445 +"2020-05-16","TX",1305,,33,,,,1791,0,,,,0,,,,,,46999,46999,1801,0,,,,,60063,26601,,0,708369,26722,39732,,,,,0,708369,26722 +"2020-05-16","UT",78,,1,,578,578,168,12,194,,162385,3161,,,176296,84,,7068,,155,0,,,,,7972,3896,,0,184268,4098,,,,,169572,3320,184268,4098 +"2020-05-16","VA",1002,968,25,34,3724,3724,1505,67,,381,,0,,,,,189,29683,28233,1011,0,1395,24,,,36922,,216321,7210,216321,7210,24858,101,,,,0,,0 +"2020-05-16","VI",6,,0,,,,,0,,,1194,0,,,,,,69,,0,0,,,,,,61,,0,1263,0,,,,,1300,22,,0 +"2020-05-16","VT",53,53,0,,,,20,0,,,19771,787,,,,,,932,932,1,0,,,,,,804,,0,25386,601,,,,,20703,788,25386,601 +"2020-05-16","WA",992,992,9,,,,663,0,,90,,0,,,,,,18952,18952,271,0,,,,,,,299456,3498,299456,3498,,,,,270526,2829,,0 +"2020-05-16","WI",453,453,8,,2018,2018,361,41,488,128,134206,5549,,,,,,13878,12187,534,0,,,,,,6542,176642,9936,176642,9936,,,,,146393,6051,,0 +"2020-05-16","WV",64,,2,,,,55,0,,13,,0,,,,,6,1457,1457,16,0,,,,,,889,,0,69900,2394,,,,,,0,69900,2394 +"2020-05-16","WY",7,,0,,69,69,8,1,,,15678,371,,,17791,,,741,559,25,0,,,,,671,496,,0,18462,222,,,,,,0,18462,222 +"2020-05-15","AK",10,10,0,,43,43,8,1,,,,0,,,,,,390,,1,0,,,,,,343,,0,32418,656,,,,,,0,32418,656 +"2020-05-15","AL",476,476,9,,1377,1377,519,27,497,,134847,3830,,,,293,,11216,11216,248,0,,,,,,,,0,146063,9691,,,,,146063,9691,,0 +"2020-05-15","AR",98,,1,,520,520,65,11,,,77066,5484,,,,101,9,4463,4463,227,0,,,,,,3390,,0,81529,5711,,,,,,0,81529,5711 +"2020-05-15","AS",0,,0,,,,,0,,,105,0,,,,,,0,0,0,0,,,,,,,,0,105,0,,,,,,0,105,0 +"2020-05-15","AZ",651,,27,,2636,2636,808,41,,313,128832,7168,,,,,222,13169,,495,0,,,,,,,,0,186249,7269,,,44903,,142001,7663,186249,7269 +"2020-05-15","CA",3108,,76,,,,4519,0,,1324,,0,,,,,,74936,74936,1772,0,,,,,,,,0,1133906,29255,,,,,,0,1133906,29255 +"2020-05-15","CO",1150,944,59,206,3842,3842,671,53,,,100608,3416,27491,,,,,21232,19151,394,0,2538,,,,,,135313,4262,135313,4262,30029,,,,119759,3763,,0 +"2020-05-15","CT",3285,,66,,10946,10946,1033,0,,,,0,,,134696,,,36085,,621,0,,,,,44229,6264,,0,179711,7701,,,,,,0,179711,7701 +"2020-05-15","DC",368,,10,,,,393,0,,,,0,,,,,90,6871,,135,0,,,,,,975,34339,2681,34339,2681,,,,,,0,,0 +"2020-05-15","DE",373,327,11,46,,,269,0,,,30905,1271,,,,,,7373,,150,0,,,,,9210,3210,49672,1342,49672,1342,,,,,38278,3525,,0 +"2020-05-15","FL",1991,1991,43,,7993,7993,,0,,,565627,0,,,,,,42545,,786,0,,,,,,,622753,15534,622753,15534,,,,,609574,14096,,0 +"2020-05-15","GA",1557,,30,,6438,6438,1029,93,1534,,,0,,,,,,36681,36681,823,0,,,,,31721,,,0,275764,13904,,,,,,0,275764,13904 +"2020-05-15","GU",5,,0,,,,,0,,,4361,135,,,,,,154,150,1,0,,,,,,124,,0,4515,136,,,,,,0,,0 +"2020-05-15","HI",17,17,0,,81,81,,0,,,38139,-104,,,,,,637,,-1,0,,,,,600,564,41421,832,41421,832,,,,,39767,1300,,0 +"2020-05-15","IA",336,,18,,,,387,0,,130,79517,3898,,,,,87,14049,14049,374,0,,,,,,6561,,0,93566,4272,,,,,93566,7847,,0 +"2020-05-15","ID",72,,3,,212,212,26,0,89,,32394,964,,,,,,2351,2152,27,0,,,,,,1573,,0,34546,990,,,,,34546,990,,0 +"2020-05-15","IL",4058,4058,130,,,,4367,0,,1129,,0,,,,,675,90369,90369,2432,0,,,,,,,,0,538602,26565,,,,,538602,49243,538602,26565 +"2020-05-15","IN",1691,1550,45,138,4389,4389,1294,0,990,492,138793,4607,,,,,213,26655,,602,0,,,,,27480,,,0,225848,9561,,,,,165448,11365,225848,9561 +"2020-05-15","KS",172,,8,,724,724,,20,246,,53706,3546,,,,112,,7886,,418,0,,,,,,,,0,61592,3964,,,,,61488,3944,,0 +"2020-05-15","KY",328,328,2,,1887,1887,385,52,794,220,,0,,,,,,7225,7193,145,0,,,,,,2712,,0,121246,10637,,,,,,0,121246,10637 +"2020-05-15","LA",2448,2382,31,66,,,1091,0,,,219352,5253,,,,,132,33837,33837,348,0,,,,,,22608,,0,253189,5601,,,,,,0,253189,15285 +"2020-05-15","MA",5592,5592,110,,8314,8314,2767,107,,749,352258,10079,,,,,,83421,83421,1239,0,,,,,106978,,,0,567173,17768,,,,,435679,25647,567173,17768 +"2020-05-15","MD",1991,1896,56,95,6679,6679,1496,126,,598,145840,3289,,,,,,36986,36986,1083,0,,,,,42939,2685,,0,201862,7267,,,,,182826,9252,201862,7267 +"2020-05-15","ME",69,69,0,,211,211,35,4,,16,,0,587,,,,8,1603,1437,38,0,,,,,1755,993,,0,34262,938,,,,,28357,0,34262,938 +"2020-05-15","MI",5325,5124,47,233,,,1256,0,,532,,0,,,341827,,440,57687,53956,651,0,,,,,65353,22686,,0,407180,16004,,,,,,0,407180,16004 +"2020-05-15","MN",692,683,29,9,1985,1985,498,70,679,200,139773,8330,,,,,,17363,17363,798,0,,,,,,8820,157136,9128,157136,9128,,,,,,0,,0 +"2020-05-15","MO",576,,14,,,,812,0,,,124002,7209,,8387,126806,,120,10456,10456,139,0,,,374,,12685,,,0,139740,4765,,,8770,,134458,10452,139740,4765 +"2020-05-15","MP",2,,0,,,,,0,,,3306,0,,,,,,19,19,0,0,,,,,,12,,0,3325,0,,,,,,0,3325,0 +"2020-05-15","MS",493,,13,,1712,1712,573,45,,172,96022,1179,,,,,81,10801,,318,0,,,,,,6268,,0,106823,1497,,,,,,0,106823,1497 +"2020-05-15","MT",16,,0,,63,63,3,0,,,,0,,,,,,466,,4,0,,,,,,431,,0,25418,869,,,,,,0,25418,869 +"2020-05-15","NC",641,641,26,,,,492,0,,,,0,,,,,,17129,17129,622,0,,,,,,,,0,234878,9317,,,,,,0,234878,9317 +"2020-05-15","ND",42,,2,,130,130,35,1,,,49954,1355,,,,,,1758,1758,51,0,,,,,,1071,58496,2086,58496,2086,,,,,49817,1284,59557,2136 +"2020-05-15","NE",113,,6,,,,,0,,,47799,3533,,,54565,,,9416,,341,0,,,,,10849,,,0,65690,4921,,,,,57315,3888,65690,4921 +"2020-05-15","NH",159,,9,,335,335,115,9,109,,39148,3272,,,,,,3464,,165,0,,,,,,1247,,0,44206,1919,5870,,,,42306,6466,44206,1919 +"2020-05-15","NJ",11789,10138,197,1651,,,3823,0,,1127,319067,10075,,,,,865,144044,143905,1219,0,,,,,,,,0,463111,11294,,,,,,0,462972,11276 +"2020-05-15","NM",253,,11,,886,886,223,0,,,,0,,,,,,5662,,159,0,,,,,,1671,,0,124458,4857,,,,,,0,124458,4857 +"2020-05-15","NV",368,,10,,,,425,0,,115,65532,2547,,,,,73,6614,6614,115,0,,,,,,,98902,6721,98902,6721,,,,,72146,5474,85791,2798 +"2020-05-15","NY",22304,,134,,85782,85782,6394,328,,2156,,0,,,,,1774,345813,,2762,0,,,,,,,1338048,39291,1338048,39291,,,,,,0,,0 +"2020-05-15","OH",1581,1431,47,150,4791,4791,944,73,1277,370,,0,,,,,260,26954,25349,597,0,,,,,28474,,,0,259269,12083,,,,,,0,259269,12083 +"2020-05-15","OK",285,,1,,863,863,215,5,,98,113106,5885,,,113106,,,5086,5086,124,0,459,,,,5645,3801,,0,118192,6009,13642,,,,,0,118751,6104 +"2020-05-15","OR",137,,3,,685,685,163,7,,38,80571,0,,,108960,,17,3479,,63,0,,,,,9287,1406,,0,118247,3673,,,,,83909,6367,118247,3673 +"2020-05-15","PA",4342,,124,,,,1934,0,,,259210,7651,,,,,431,60622,,986,0,,,,,,,354816,10610,354816,10610,,,,,319832,8637,,0 +"2020-05-15","PR",122,63,5,,,,147,0,,18,,0,,,,,3,1088,1088,15,0,1454,,,,,,,0,1088,15,,,,,,0,,0 +"2020-05-15","RI",479,,11,,1372,1372,272,21,,63,76467,1700,,,99817,,41,12663,,232,0,,,,,15453,,112203,3737,112203,3737,,,,,89130,1932,115270,3677 +"2020-05-15","SC",380,380,9,,1421,1421,,83,,,101209,6863,,,,,,8407,8407,218,0,,,,,,5076,,0,109616,7081,,,,,109616,16476,,0 +"2020-05-15","SD",44,,1,,296,296,80,6,,,23527,846,,,,,,3887,,95,0,,,,,5322,2574,,0,29908,899,,,,,27414,941,29908,899 +"2020-05-15","TN",290,290,3,,1454,1454,535,19,,,,0,,,292786,,,16970,16970,271,0,,,,,16970,9280,,0,309756,7439,,,,,309756,16839,309756,7439 +"2020-05-15","TX",1272,,56,,,,1716,0,,,,0,,,,,,45198,45198,1347,0,,,,,58262,25454,,0,681647,25172,36362,,,,,0,681647,25172 +"2020-05-15","UT",77,,2,,566,566,161,8,190,,159224,3267,,,172386,83,,6913,,164,0,,,,,7784,3719,,0,180170,4213,,,,,166252,3435,180170,4213 +"2020-05-15","VA",977,944,22,33,3657,3657,1511,65,,362,,0,,,,,195,28672,27293,859,0,1273,23,,,35912,,209111,7952,209111,7952,22902,91,,,,0,,0 +"2020-05-15","VI",6,,0,,,,,0,,,1194,30,,,,,,69,,0,0,,,,,,61,,0,1263,30,,,,,1278,81,,0 +"2020-05-15","VT",53,53,0,,,,17,0,,,18984,621,,,,,,931,931,1,0,,,,,,796,,0,24785,617,,,,,19915,622,24785,617 +"2020-05-15","WA",983,983,8,,,,626,0,,114,,0,,,,,,18681,18681,312,0,,,,,,,295958,6541,295958,6541,,,,,267697,5404,,0 +"2020-05-15","WI",445,445,11,,1977,1977,356,38,485,125,128657,6059,,,,,,13344,11685,475,0,,,,,,6250,166706,8746,166706,8746,,,,,140342,12329,,0 +"2020-05-15","WV",62,,2,,,,57,0,,15,,0,,,,,8,1441,1441,14,0,,,,,,870,,0,67506,1738,,,,,,0,67506,1738 +"2020-05-15","WY",7,,0,,68,68,8,1,,,15307,578,,,17575,,,716,541,15,0,,,,,665,487,,0,18240,654,,,,,,0,18240,654 +"2020-05-14","AK",10,10,0,,42,42,12,1,,,,0,,,,,,389,,5,0,,,,,,339,,0,31762,1113,,,,,,0,31762,1113 +"2020-05-14","AL",467,467,18,,1350,1350,509,33,489,,131017,5262,,,,291,,10968,10968,351,0,,,,,,,,0,136372,3154,,,,,136372,3154,,0 +"2020-05-14","AR",97,,2,,509,509,64,12,,,71582,2531,,,,100,13,4236,4236,72,0,,,,,,3277,,0,75818,2603,,,,,,0,75818,2603 +"2020-05-14","AS",0,,0,,,,,0,,,105,0,,,,,,0,0,0,0,,,,,,,,0,105,0,,,,,,0,105,0 +"2020-05-14","AZ",624,,30,,2595,2595,781,52,,323,121664,6090,,,,,201,12674,,498,0,,,,,,,,0,178980,7445,,,41117,,134338,6588,178980,7445 +"2020-05-14","CA",3032,,98,,,,4655,0,,1324,,0,,,,,,73164,73164,2023,0,,,,,,,,0,1104651,39059,,,,,,0,1104651,39059 +"2020-05-14","CO",1091,,29,,3789,3789,685,54,,,97192,3148,24876,,,,,20838,18804,363,0,2336,,,,,,131051,4017,131051,4017,27212,,,,115996,3491,,0 +"2020-05-14","CT",3219,,94,,10946,10946,1103,1557,,,,0,,,127833,,,35464,,609,0,,,,,43430,6264,,0,172010,7650,,,,,,0,172010,7650 +"2020-05-14","DC",358,,8,,,,397,0,,,,0,,,,,90,6736,,152,0,,,,,,966,31658,608,31658,608,,,,,,0,,0 +"2020-05-14","DE",362,318,11,44,,,273,0,,,29634,1833,,,,,,7223,,271,0,,,,,9044,3080,48330,1104,48330,1104,,,,,34753,1462,,0 +"2020-05-14","FL",1948,1948,50,,7993,7993,,158,,,565627,13266,,,,,,41759,,792,0,,,,,,,607219,15700,607219,15700,,,,,595478,15874,,0 +"2020-05-14","GA",1527,,22,,6345,6345,1060,86,1513,,,0,,,,,,35858,35858,526,0,,,,,30981,,,0,261860,10998,,,,,,0,261860,10998 +"2020-05-14","GU",5,,0,,,,,0,,,4226,116,,,,,,153,149,1,0,,,,,,124,,0,4379,117,,,,,,0,,0 +"2020-05-14","HI",17,17,0,,81,81,,0,,,38243,513,,,,,,638,,3,0,,,,,599,563,40589,756,40589,756,,,,,38467,425,,0 +"2020-05-14","IA",318,,12,,,,405,0,,134,75619,3189,,,,,93,13675,13675,386,0,,,,,,6231,,0,89294,3575,,,,,85719,4431,,0 +"2020-05-14","ID",69,,0,,212,212,19,-2,88,,31430,595,,,,,,2324,2126,31,0,,,,,,1557,,0,33556,622,,,,,33556,622,,0 +"2020-05-14","IL",3928,3928,136,,,,4473,0,,1132,,0,,,,,689,87937,87937,3239,0,,,,,,,,0,512037,22678,,,,,489359,17668,512037,22678 +"2020-05-14","IN",1646,1508,27,138,4389,4389,1381,0,990,488,134186,5576,,,,,217,26053,,580,0,,,,,26854,,,0,216287,8593,,,,,154083,3573,216287,8593 +"2020-05-14","KS",164,,0,,704,704,,0,238,,50160,0,,,,108,,7468,,0,0,,,,,,,,0,57628,0,,,,,57544,3519,,0 +"2020-05-14","KY",326,326,5,,1835,1835,377,10,784,215,,0,,,,,,7080,7049,227,0,,,,,,2649,,0,110609,6608,,,,,,0,110609,6608 +"2020-05-14","LA",2417,2351,36,66,,,1193,0,,,214099,8857,,,,,140,33489,33489,827,0,,,,,,22608,,0,247588,9684,,,,,,0,237904,9892 +"2020-05-14","MA",5482,5382,167,,8207,8207,2859,175,,781,342179,12644,,,,,,82182,82182,1685,0,,,,,105126,,,0,549405,17377,,,,,410032,8536,549405,17377 +"2020-05-14","MD",1935,1840,54,95,6553,6553,1538,149,,569,142551,3789,,,,,,35903,35903,1091,0,,,,,41635,2569,,0,194595,6028,,,,,173574,4071,194595,6028 +"2020-05-14","ME",69,69,3,,207,207,37,3,,18,,0,587,,,,7,1565,1405,50,0,,,,,1725,958,,0,33324,1007,,,,,28357,4927,33324,1007 +"2020-05-14","MI",5278,5092,46,232,,,1330,0,,653,,0,,,326657,,515,57036,53451,578,0,,,,,64519,22686,,0,391176,17692,,,,,,0,391176,17692 +"2020-05-14","MN",663,663,25,9,1915,1915,498,64,663,203,131443,5941,,,,,,16565,16565,793,0,,,,,,8473,148008,6734,148008,6734,,,,,,0,,0 +"2020-05-14","MO",562,,20,,,,796,0,,,116793,2793,,7307,122388,,115,10317,10317,175,0,,,328,,12346,,,0,134975,4874,,,7644,,124006,2710,134975,4874 +"2020-05-14","MP",2,,0,,,,,0,,,3306,285,,,,,,19,19,0,0,,,,,,12,,0,3325,285,,,,,,0,3325,285 +"2020-05-14","MS",480,,15,,1667,1667,589,51,,131,94843,4885,,,,,72,10483,,393,0,,,,,,6268,,0,105326,5278,,,,,,0,105326,5278 +"2020-05-14","MT",16,,0,,63,63,3,0,,,,0,,,,,,462,,0,0,,,,,,431,,0,24549,697,,,,,,0,24549,697 +"2020-05-14","NC",615,615,18,,,,507,0,,,,0,,,,,,16507,16507,691,0,,,,,,,,0,225561,7919,,,,,,0,225561,7919 +"2020-05-14","ND",40,,0,,129,129,38,2,,,48599,1301,,,,,,1707,1707,67,0,,,,,,1007,56410,2317,56410,2317,,,,,48533,1389,57421,2384 +"2020-05-14","NE",107,,4,,,,,0,,,44266,3233,,,50178,,,9075,,383,0,,,,,10319,,,0,60769,2781,,,,,53427,3628,60769,2781 +"2020-05-14","NH",150,,8,,326,326,126,7,97,,35876,1899,,,,,,3299,,60,0,,,,,,1236,,0,42287,2669,5168,,,,35840,35840,42287,2669 +"2020-05-14","NJ",11592,9946,252,1646,,,3958,0,,1157,308992,9102,,,,,898,142825,142704,1157,0,,,,,,,,0,451817,10259,,,,,,0,451696,10246 +"2020-05-14","NM",242,,11,,886,886,209,0,,,,0,,,,,,5503,,139,0,,,,,,1576,,0,119601,4590,,,,,,0,119601,4590 +"2020-05-14","NV",358,,3,,,,515,0,,126,62985,2707,,,,,75,6499,6499,105,0,,,,,,,92181,6230,92181,6230,,,,,66672,2597,82993,3258 +"2020-05-14","NY",22170,,157,,85454,85454,6706,446,,2223,,0,,,,,1846,343051,,2390,0,,,,,,,1298757,39850,1298757,39850,,,,,,0,,0 +"2020-05-14","OH",1534,1388,51,146,4718,4718,953,100,1268,360,,0,,,,,253,26357,24800,636,0,,,,,27789,,,0,247186,10046,,,,,,0,247186,10046 +"2020-05-14","OK",284,,6,,858,858,217,10,,102,107221,2946,,,107221,,,4962,4962,110,0,,,,,5426,3660,,0,112183,3056,,,,,,0,112647,2788 +"2020-05-14","OR",134,,4,,678,678,162,5,,38,80571,6251,,,105414,,17,3416,,130,0,,,,,9160,1406,,0,114574,4321,,,,,77542,77542,114574,4321 +"2020-05-14","PA",4218,,275,,,,1983,0,,,251559,7388,,,,,446,59636,,938,0,,,,,,,344206,10075,344206,10075,,,,,311195,8326,,0 +"2020-05-14","PR",117,58,2,,,,159,0,,18,,0,,,,,5,1073,1073,9,0,1354,,,,,,,0,1073,9,,,,,,0,,0 +"2020-05-14","RI",468,,6,,1351,1351,271,23,,65,74767,1927,,,96504,,42,12431,,228,0,,,,,15089,,108466,3981,108466,3981,,,,,87198,2155,111593,3599 +"2020-05-14","SC",371,371,16,,1338,1338,,0,,,94346,9133,,,,,,8189,8189,262,0,,,,,,4914,,0,102535,9395,,,,,93140,0,,0 +"2020-05-14","SD",43,,4,,290,290,85,9,,,22681,569,,,,,,3792,,60,0,,,,,5247,2437,,0,29009,879,,,,,26473,629,29009,879 +"2020-05-14","TN",287,287,14,,1435,1435,599,47,,,,0,,,285618,,,16699,16699,329,0,,,,,16699,8881,,0,302317,9400,,,,,292917,8993,302317,9400 +"2020-05-14","TX",1216,,58,,,,1648,0,,,,0,,,,,,43851,43851,1448,0,,,,,56494,24487,,0,656475,27227,35971,,,,,0,656475,27227 +"2020-05-14","UT",75,,0,,558,558,142,5,187,,155957,2931,,,168364,83,,6749,,129,0,,,,,7593,3566,,0,175957,3761,,,,,162817,3080,175957,3761 +"2020-05-14","VA",955,927,28,28,3592,3592,1533,72,,355,,0,,,,,201,27813,26469,1067,0,1156,22,,,34740,,201159,8735,201159,8735,20711,84,,,,0,,0 +"2020-05-14","VI",6,,0,,,,,0,,,1164,36,,,,,,69,,0,0,,,,,,61,,0,1233,36,,,,,1197,13,,0 +"2020-05-14","VT",53,53,0,,,,18,0,,,18363,703,,,,,,930,930,1,0,,,,,,792,,0,24168,729,,,,,19293,704,24168,729 +"2020-05-14","WA",975,975,13,,,,645,0,,111,,0,,,,,,18369,18369,251,0,,,,,,,289417,6373,289417,6373,,,,,262293,5005,,0 +"2020-05-14","WI",434,434,13,,1939,1939,352,31,478,120,122598,5487,,,,,,12869,11275,420,0,,,,,,5994,157960,8312,157960,8312,,,,,128013,4654,,0 +"2020-05-14","WV",60,,2,,,,52,0,,9,,0,,,,,5,1427,1427,29,0,,,,,,870,,0,65768,1876,,,,,,0,65768,1876 +"2020-05-14","WY",7,,0,,67,67,8,0,,,14729,345,,,16944,,,701,529,13,0,,,,,642,480,,0,17586,573,,,,,,0,17586,573 +"2020-05-13","AK",10,10,0,,41,41,12,0,,,,0,,,,,,384,,1,0,,,,,,338,,0,30649,688,,,,,,0,30649,688 +"2020-05-13","AL",449,449,20,,1317,1317,524,30,477,,125755,2847,,,,284,,10617,10617,307,0,,,,,,,,0,133218,0,,,,,133218,0,,0 +"2020-05-13","AR",95,,0,,497,497,59,12,,,69051,2771,,,,99,12,4164,4164,0,0,,,,,,3220,,0,73215,2771,,,,,,0,73215,2771 +"2020-05-13","AS",0,,0,,,,,0,,,105,0,,,,,,0,0,0,0,,,,,,,,0,105,0,,,,,,0,105,0 +"2020-05-13","AZ",594,,32,,2543,2543,755,39,,292,115574,4468,,,,,191,12176,,440,0,,,,,,,,0,171535,8094,,,38060,,127750,4908,171535,8094 +"2020-05-13","CA",2934,,87,,,,4545,0,,1314,,0,,,,,,71141,71141,1759,0,,,,,,,,0,1065592,32222,,,,,,0,1065592,32222 +"2020-05-13","CO",1062,,53,,3735,3735,685,40,,,94044,2951,20517,,,,,20475,18461,318,0,2032,,,,,,127034,3821,127034,3821,22549,,,,112505,3201,,0 +"2020-05-13","CT",3125,,84,,9389,9389,1158,0,,,,0,,,121139,,,34855,,522,0,,,,,42499,5413,,0,164360,8181,,,,,,0,164360,8181 +"2020-05-13","DC",350,,14,,,,423,0,,,,0,,,,,82,6584,,99,0,,,,,,934,31050,0,31050,0,,,,,,0,,0 +"2020-05-13","DE",351,308,17,43,,,282,0,,,27801,1251,,,,,,6952,,211,0,,,,,8876,2942,47226,746,47226,746,,,,,33291,33291,,0 +"2020-05-13","FL",1898,1898,49,,7835,7835,,181,,,552361,14680,,,,,,40967,,799,0,,,,,,,591519,14557,591519,14557,,,,,579604,579604,,0 +"2020-05-13","GA",1505,,44,,6259,6259,1091,129,1494,,,0,,,,,,35332,35332,697,0,,,,,30214,,,0,250862,5697,,,,,,0,250862,5697 +"2020-05-13","GU",5,,0,,,,,0,,,4110,171,,,,,,152,148,0,0,,,,,,124,,0,4262,171,,,,,,0,,0 +"2020-05-13","HI",17,17,0,,81,81,,0,,,37730,425,,,,,,635,,1,0,,,,,596,563,39833,641,39833,641,,,,,38042,38042,,0 +"2020-05-13","IA",306,,17,,,,388,0,,133,72430,4054,,,,,101,13289,13289,377,0,,,,,,5954,,0,85719,4431,,,,,81288,81288,,0 +"2020-05-13","ID",69,,-1,,214,214,20,4,88,,30835,390,,,,,,2293,2099,33,0,,,,,,1536,,0,32934,416,,,,,32934,416,,0 +"2020-05-13","IL",3792,3792,191,,,,4563,0,,1208,,0,,,,,714,84698,84698,1677,0,,,,,,,,0,489359,17668,,,,,471691,471691,489359,17668 +"2020-05-13","IN",1619,1482,41,137,4389,4389,1336,0,990,481,128610,3227,,,,,217,25473,,346,0,,,,,26199,,,0,207694,8390,,,,,150510,150510,207694,8390 +"2020-05-13","KS",164,,6,,704,704,,44,238,,50160,3167,,,,108,,7468,,352,0,,,,,,,,0,57628,3519,,,,,54025,54025,,0 +"2020-05-13","KY",321,321,10,,1825,1825,379,58,783,215,,0,,,,,,6853,6828,176,0,,,,,,2546,,0,104001,0,,,,,,0,104001,0 +"2020-05-13","LA",2381,2315,34,66,,,1194,0,,,205242,9280,,,,,147,32662,32662,612,0,,,,,,22608,,0,237904,9892,,,,,,0,228012,228012 +"2020-05-13","MA",5315,5315,174,,8032,8032,3101,190,,794,329535,7371,,,,,,80497,80497,1165,0,,,,,103043,,,0,532028,17922,,,,,401496,401496,532028,17922 +"2020-05-13","MD",1881,1787,47,94,6404,6404,1550,117,,572,138762,3320,,,,,,34812,34812,751,0,,,,,40581,2456,,0,188567,5425,,,,,169503,169503,188567,5425 +"2020-05-13","ME",66,66,1,,204,204,41,2,,20,,0,587,,,,7,1515,1372,38,0,,,,,1678,943,,0,32317,781,,,,,23430,23430,32317,781 +"2020-05-13","MI",5232,5046,44,231,,,1384,0,,693,,0,,,310242,,525,56458,53030,817,0,,,,,63242,22686,,0,373484,19575,,,,,,0,373484,19575 +"2020-05-13","MN",638,638,24,9,1851,1851,494,52,647,199,125502,6568,,,,,,15772,15772,729,0,,,,,,8149,141274,7297,141274,7297,,,,,,0,,0 +"2020-05-13","MO",542,,18,,,,771,0,,,114000,2710,,6330,117748,,129,10142,10142,136,0,,,293,,12117,,,0,130101,5059,,,6632,,121296,121296,130101,5059 +"2020-05-13","MP",2,,0,,,,,0,,,3021,167,,,,,,19,19,0,0,,,,,,12,,0,3040,167,,,,,,0,3040,167 +"2020-05-13","MS",465,,8,,1616,1616,604,34,,150,89958,2174,,,,,79,10090,,182,0,,,,,,6268,,0,100048,2356,,,,,,0,100048,2356 +"2020-05-13","MT",16,,0,,63,63,3,0,,,,0,,,,,,462,,1,0,,,,,,430,,0,23852,817,,,,,,0,23852,817 +"2020-05-13","NC",597,597,20,,,,521,0,,,,0,,,,,,15816,15816,470,0,,,,,,,,0,217642,6686,,,,,,0,217642,6686 +"2020-05-13","ND",40,,2,,127,127,37,5,,,47298,1037,,,,,,1640,1640,74,0,,,,,,969,54093,1703,54093,1703,,,,,47144,1026,55037,1760 +"2020-05-13","NE",103,,3,,,,192,0,,81,41033,1662,,,47798,,56,8692,,120,0,,,,,9925,,,0,57988,3547,,,,,49799,1780,57988,3547 +"2020-05-13","NH",142,,9,,319,319,121,1,97,,33977,1576,,,,,,3239,,79,0,,,,,,1234,,0,39618,1592,4459,,,,,0,39618,1592 +"2020-05-13","NJ",11340,9702,202,1638,,,4226,0,,1226,299890,7573,,,,,928,141668,141560,833,0,,,,,,,,0,441558,8406,,,,,,0,441450,8390 +"2020-05-13","NM",231,,12,,886,886,200,0,,,,0,,,,,,5364,,152,0,,,,,,1515,,0,115011,4722,,,,,,0,115011,4722 +"2020-05-13","NV",355,,5,,,,522,0,,121,60278,2514,,,,,64,6394,6394,83,0,,,,,,,85951,6908,85951,6908,,,,,64075,64075,79735,2821 +"2020-05-13","NY",22013,,168,,85008,85008,6946,519,,2308,,0,,,,,1908,340661,,2176,0,,,,,,,1258907,33794,1258907,33794,,,,,,0,,0 +"2020-05-13","OH",1483,1347,47,136,4618,4618,924,79,1248,353,,0,,,,,244,25721,24245,471,0,,,,,27229,,,0,237140,7783,,,,,,0,237140,7783 +"2020-05-13","OK",278,,0,,848,848,218,20,,93,104275,12896,,,104275,,,4852,4852,120,0,,,,,5317,3559,,0,109127,13016,,,,,,0,109859,3300 +"2020-05-13","OR",130,,0,,673,673,165,0,,39,74320,0,,,101234,,25,3286,,0,0,,,,,9019,1125,,0,110253,3051,,,,,,0,110253,3051 +"2020-05-13","PA",3943,,137,,,,2012,0,,,244171,6182,,,,,473,58698,,707,0,,,,,,,334131,8004,334131,8004,,,,,302869,6889,,0 +"2020-05-13","PR",115,58,1,,,,142,0,,10,,0,,,,,6,1064,1064,2,0,1265,,,,,,,0,1064,2,,,,,,0,,0 +"2020-05-13","RI",462,,18,,1328,1328,269,21,,68,72840,1924,,,93212,,48,12203,,196,0,,,,,14782,,104485,2998,104485,2998,,,,,85043,2120,107994,3860 +"2020-05-13","SC",355,355,0,,1338,1338,,0,,,85213,0,,,,,,7927,7927,0,0,,,,,,6817,,0,93140,0,,,,,93140,93140,,0 +"2020-05-13","SD",39,,0,,281,281,79,10,,,22112,578,,,,,,3732,,69,0,,,,,5184,2367,,0,28130,542,,,,,25844,647,28130,542 +"2020-05-13","TN",273,273,8,,1388,1388,635,25,,,,0,,,276547,,,16370,16370,259,0,,,,,16370,8624,,0,292917,8993,,,,,283924,283924,292917,8993 +"2020-05-13","TX",1158,,25,,,,1676,0,,,,0,,,,,,42403,42403,1355,0,,,,,54739,23519,,0,629248,25752,30655,,,,,0,629248,25752 +"2020-05-13","UT",75,,2,,553,553,158,18,182,,153026,3895,,,164810,81,,6620,,188,0,,,,,7386,3406,,0,172196,4958,,,,,159737,4080,172196,4958 +"2020-05-13","VA",927,899,36,28,3520,3520,1526,125,,374,,0,,,,,202,26746,25431,946,0,1054,21,,,33434,,192424,6009,192424,6009,19080,83,,,,0,,0 +"2020-05-13","VI",6,,0,,,,,0,,,1128,13,,,,,,69,,0,0,,,,,,61,,0,1197,13,,,,,1184,1184,,0 +"2020-05-13","VT",53,53,0,,,,17,0,,,17660,490,,,,,,929,929,2,0,,,,,,789,,0,23439,416,,,,,18589,492,23439,416 +"2020-05-13","WA",962,962,17,,,,562,0,,114,,0,,,,,,18118,18118,294,0,,,,,,,283044,6144,283044,6144,,,,,257288,4747,,0 +"2020-05-13","WI",421,421,3,,1908,1908,343,31,469,122,117111,4363,,,,,,12449,10902,318,0,,,,,,5673,149648,6807,149648,6807,,,,,123359,123359,,0 +"2020-05-13","WV",58,,1,,,,58,0,,11,,0,,,,,6,1398,1398,27,0,,,,,,813,,0,63892,1489,,,,,,0,63892,1489 +"2020-05-13","WY",7,,0,,67,67,10,0,,,14384,0,,,16383,,,688,523,13,0,,,,,630,477,,0,17013,499,,,,,,0,17013,499 +"2020-05-12","AK",10,10,0,,41,41,10,0,,,,0,,,,,,383,,2,0,,,,,,334,,0,29961,1281,,,,,,0,29961,1281 +"2020-05-12","AL",429,429,28,,1287,1287,529,31,468,,122908,3473,,,,280,,10310,10310,301,0,,,,,,,,0,133218,3774,,,,,133218,3774,,0 +"2020-05-12","AR",95,,1,,485,485,59,5,,,66280,1284,,,,98,12,4164,4164,130,0,,,,,,3220,,0,70444,1414,,,,,,0,70444,1414 +"2020-05-12","AS",0,,0,,,,,0,,,105,0,,,,,,0,0,0,0,,,,,,,,0,105,0,,,,,,0,105,0 +"2020-05-12","AZ",562,,20,,2504,2504,765,42,,318,111106,6022,,,,,204,11736,,356,0,,,,,,,,0,163441,8195,,,36209,,122842,6378,163441,8195 +"2020-05-12","CA",2847,,77,,,,4544,0,,1349,,0,,,,,,69382,69382,1443,0,,,,,,,,0,1033370,41473,,,,,,0,1033370,41473 +"2020-05-12","CO",1009,,22,,3695,3695,688,32,,,91093,2315,19549,,,,,20157,18211,278,0,1979,,,,,,123213,2929,123213,2929,21528,,,,109304,2543,,0 +"2020-05-12","CT",3041,,33,,9389,9389,1189,0,,,,0,,,113793,,,34333,,568,0,,,,,41688,5413,,0,156179,6097,,,,,,0,156179,6097 +"2020-05-12","DC",336,,8,,,,416,0,,,,0,,,,,82,6485,,96,0,,,,,,886,31050,789,31050,789,,,,,,0,,0 +"2020-05-12","DE",334,296,10,38,,,276,0,,,26550,1187,,,,,,6741,,176,0,,,,,8782,2802,46480,953,46480,953,,,,,,0,,0 +"2020-05-12","FL",1849,1849,44,,7654,7654,,196,,,537681,17606,,,,,,40168,,606,0,,,,,,,576962,21155,576962,21155,,,,,,0,,0 +"2020-05-12","GA",1461,,20,,6130,6130,1125,115,1443,,,0,,,,,,34635,34635,708,0,,,,,29861,,,0,245165,10273,,,,,,0,245165,10273 +"2020-05-12","GU",5,,0,,,,,0,,,3939,101,,,,,,152,148,1,0,,,,,,124,,0,4091,102,,,,,,0,,0 +"2020-05-12","HI",17,17,0,,81,81,,0,,,37305,254,,,,,,634,,2,0,,,,,595,561,39192,270,39192,270,,,,,,0,,0 +"2020-05-12","IA",289,,18,,,,385,0,,143,68376,2957,,,,,101,12912,12912,539,0,,,,,,5618,,0,81288,3496,,,,,,0,,0 +"2020-05-12","ID",70,,3,,210,210,25,3,87,,30445,533,,,,,,2260,2073,30,0,,,,,,1508,,0,32518,557,,,,,32518,557,,0 +"2020-05-12","IL",3601,3601,142,,,,4626,0,,1215,,0,,,,,730,83021,83021,4014,0,,,,,,,,0,471691,29266,,,,,,0,471691,29266 +"2020-05-12","IN",1578,1444,38,134,4389,4389,1283,0,990,472,125383,3322,,,,,212,25127,,500,0,,,,,25457,,,0,199304,8630,,,,,,0,199304,8630 +"2020-05-12","KS",158,,0,,660,660,,0,233,,46993,0,,,,101,,7116,,0,0,,,,,,,,0,54109,0,,,,,,0,,0 +"2020-05-12","KY",311,311,7,,1767,1767,383,10,768,220,,0,,,,,,6677,6654,237,0,,,,,,2335,,0,104001,17101,,,,,,0,104001,17101 +"2020-05-12","LA",2347,2281,39,66,,,1320,0,,,195962,6947,,,,,146,32050,32050,235,0,,,,,,22608,,0,228012,7182,,,,,,0,,0 +"2020-05-12","MA",5141,5141,33,,7842,7842,3127,110,,818,322164,5898,,,,,,79332,79332,870,0,,,,,100934,,,0,514106,17359,,,,,,0,514106,17359 +"2020-05-12","MD",1834,1742,46,92,6287,6287,1563,104,,590,135442,4035,,,,,,34061,34061,688,0,,,,,39787,2394,,0,183142,3754,,,,,,0,183142,3754 +"2020-05-12","ME",65,65,0,,202,202,34,2,,17,,0,587,,,,8,1477,1338,15,0,,,,,1641,913,,0,31536,388,,,,,,0,31536,388 +"2020-05-12","MI",5188,5001,49,230,,,1384,0,,693,,0,,,291701,,525,55641,52399,1637,0,,,,,62208,22686,,0,353909,14066,,,,,,0,353909,14066 +"2020-05-12","MN",614,614,23,,1799,1799,496,83,625,199,118934,3349,,,,,,15043,15043,664,0,,,,,,7609,133977,4013,133977,4013,,,,,,0,,0 +"2020-05-12","MO",524,,36,,,,787,0,,,111290,5588,,6216,112948,,140,10006,10006,88,0,,,289,,11865,,,0,125042,1296,,,6514,,,0,125042,1296 +"2020-05-12","MP",2,,0,,,,,0,,,2854,178,,,,,,19,19,0,0,,,,,,12,,0,2873,178,,,,,,0,2873,178 +"2020-05-12","MS",457,,22,,1582,1582,604,36,,146,87784,1573,,,,,75,9908,,234,0,,,,,,6268,,0,97692,1807,,,,,,0,97692,1807 +"2020-05-12","MT",16,,0,,63,63,4,1,,,,0,,,,,,461,,2,0,,,,,,425,,0,23035,463,,,,,,0,23035,463 +"2020-05-12","NC",577,577,27,,,,475,0,,,,0,,,,,,15346,15346,301,0,,,,,,,,0,210956,2741,,,,,,0,210956,2741 +"2020-05-12","ND",38,,2,,122,122,38,7,,,46261,765,,,,,,1566,1566,52,0,,,,,,877,52390,1283,52390,1283,,,,,46118,880,53277,1323 +"2020-05-12","NE",100,,2,,,,192,0,,81,39371,1447,,,44530,,56,8572,,257,0,,,,,9647,,,0,54441,1847,,,,,48019,1705,54441,1847 +"2020-05-12","NH",133,,0,,318,318,117,0,97,,32401,678,,,,,,3160,,0,0,,,,,,1231,,0,38026,910,3788,,,,,0,38026,910 +"2020-05-12","NJ",11138,9508,212,1630,,,4328,0,,1306,292317,6329,,,,,982,140835,140743,813,0,,,,,,,,0,433152,7142,,,,,,0,433060,7127 +"2020-05-12","NM",219,,11,,886,886,199,0,,,,0,,,,,,5212,,143,0,,,,,,1434,,0,110289,3568,,,,,,0,110289,3568 +"2020-05-12","NV",350,,6,,,,522,0,,121,57764,3832,,,,,64,6311,6311,159,0,,,,,,,79043,6319,79043,6319,,,,,,0,76914,3944 +"2020-05-12","NY",21845,,205,,84489,84489,7063,295,,2375,,0,,,,,1964,338485,,1430,0,,,,,,,1225113,20463,1225113,20463,,,,,,0,,0 +"2020-05-12","OH",1436,1303,79,133,4539,4539,1032,126,1232,401,,0,,,,,270,25250,23809,473,0,,,,,26713,,,0,229357,6775,,,,,,0,229357,6775 +"2020-05-12","OK",278,,4,,828,828,190,0,,83,91379,0,,,101082,,,4732,4732,119,0,,,,,5229,3423,,0,96111,119,,,,,,0,106559,10690 +"2020-05-12","OR",130,,3,,673,673,164,3,,40,74320,2041,,,98271,,23,3286,,58,0,,,,,8931,1125,,0,107202,3427,,,,,,0,107202,3427 +"2020-05-12","PA",3806,,75,,,,2187,0,,,237989,6285,,,,,497,57991,,837,0,,,,,,,326127,8694,326127,8694,,,,,295980,7122,,0 +"2020-05-12","PR",114,58,1,,,,127,0,,,,0,,,,,,1062,1062,8,0,1237,,,,,,,0,1062,8,,,,,,0,,0 +"2020-05-12","RI",444,,14,,1307,1307,277,27,,72,70916,1551,,,89697,,53,12007,,219,0,,,,,14437,,101487,2114,101487,2114,,,,,82923,1770,104134,2803 +"2020-05-12","SC",355,355,24,,1338,1338,,86,,,85213,8409,,,,,,7927,7927,274,0,,,,,,6817,,0,93140,8683,,,,,,0,,0 +"2020-05-12","SD",39,,5,,271,271,74,8,,,21534,570,,,,,,3663,,49,0,,,,,5137,2309,,0,27588,852,,,,,25197,619,27588,852 +"2020-05-12","TN",265,265,14,,1363,1363,591,19,,,,0,,,267813,,,16111,16111,567,0,,,,,16110,8336,,0,283924,10647,,,,,,0,283924,10647 +"2020-05-12","TX",1133,,33,,,,1725,0,,,,0,,,,,,41048,41048,1179,0,,,,,53175,22674,,0,603496,24713,,,,,,0,603496,24713 +"2020-05-12","UT",73,,5,,535,535,166,18,178,,149131,2749,,,160090,80,,6432,,70,0,,,,,7148,3267,,0,167238,3409,,,,,155657,2843,167238,3409 +"2020-05-12","VA",891,864,41,27,3395,3395,1529,95,,364,,0,,,,,201,25800,24601,730,0,975,20,,,32577,,186415,4204,186415,4204,17626,82,,,,0,,0 +"2020-05-12","VI",6,,1,,,,,0,,,1115,5,,,,,,69,,0,0,,,,,,61,,0,1184,5,,,,,,0,,0 +"2020-05-12","VT",53,53,0,,,,18,0,,,17170,294,,,,,,927,927,1,0,,,,,,787,,0,23023,343,,,,,18097,295,23023,343 +"2020-05-12","WA",945,945,14,,,,321,0,,94,,0,,,,,,17824,17824,61,0,,,,,,,276900,6106,276900,6106,,,,,252541,4976,,0 +"2020-05-12","WI",418,418,9,,1877,1877,326,31,464,115,112748,4715,,,,,,12131,10611,211,0,,,,,,5371,142841,5004,142841,5004,,,,,,0,,0 +"2020-05-12","WV",57,,3,,,,50,0,,9,,0,,,,,5,1371,1371,5,0,,,,,,803,,0,62403,1087,,,,,,0,62403,1087 +"2020-05-12","WY",7,,0,,67,67,10,1,,,14384,2981,,,15894,,,675,513,6,0,,,,,620,477,,0,16514,508,,,,,,0,16514,508 +"2020-05-11","AK",10,10,0,,41,41,7,0,,,,0,,,,,,381,,2,0,,,,,,328,,0,28680,1316,,,,,,0,28680,1316 +"2020-05-11","AL",401,401,8,,1256,1256,458,16,463,,119435,1791,,,,276,,10009,10009,232,0,,,,,,,,0,129444,2023,,,,,129444,2023,,0 +"2020-05-11","AR",94,,6,,480,480,61,9,,,64996,3215,,,,98,11,4034,4034,287,0,,,,,,3149,,0,69030,3502,,,,,,0,69030,3502 +"2020-05-11","AS",0,,0,,,,,0,,,105,22,,,,,,0,0,0,0,,,,,,,,0,105,22,,,,,,0,105,22 +"2020-05-11","AZ",542,,6,,2462,2462,717,41,,297,105084,5826,,,,,201,11380,,261,0,,,,,,,,0,155246,2156,,,33777,,116464,6087,155246,2156 +"2020-05-11","CA",2770,,25,,,,4549,0,,1329,,0,,,,,,67939,67939,1259,0,,,,,,,,0,991897,36233,,,,,,0,991897,36233 +"2020-05-11","CO",987,,16,,3663,3663,738,32,,,88778,-113,19218,,,,,19879,17983,176,0,1956,,,,,,120284,3071,120284,3071,21174,,,,106761,2684,,0 +"2020-05-11","CT",3008,2718,41,,9389,9389,1212,0,,,,0,,,108620,,,33765,,211,0,,,,,40809,5413,,0,150082,2286,,,,,,0,150082,2286 +"2020-05-11","DC",328,,5,,,,416,0,,,,0,,,,,82,6389,,117,0,,,,,,881,30261,691,30261,691,,,,,,0,,0 +"2020-05-11","DE",324,288,12,36,,,275,0,,,25363,771,,,,,,6565,,118,0,,,,,8671,2619,45527,1630,45527,1630,,,,,,0,,0 +"2020-05-11","FL",1805,1805,14,,7458,7458,,54,,,520075,21723,,,,,,39562,,383,0,,,,,,,555807,17780,555807,17780,,,,,,0,,0 +"2020-05-11","GA",1441,,36,,6015,6015,1133,18,1414,,,0,,,,,,33927,33927,486,0,,,,,29188,,,0,234892,10418,,,,,,0,234892,10418 +"2020-05-11","GU",5,,0,,,,,0,,,3838,195,,,,,,151,147,0,0,,,,,,124,,0,3989,195,,,,,,0,,0 +"2020-05-11","HI",17,17,0,,81,81,,0,,,37051,412,,,,,,632,,1,0,,,,,593,561,38922,685,38922,685,,,,,,0,,0 +"2020-05-11","IA",271,,6,,,,394,0,,152,65419,3204,,,,,107,12373,12373,414,0,,,,,,5249,,0,77792,3618,,,,,,0,,0 +"2020-05-11","ID",67,,0,,207,207,30,0,87,,29912,0,,,,,,2230,2049,0,0,,,,,,1473,,0,31961,0,,,,,31961,0,,0 +"2020-05-11","IL",3459,,53,,,,4319,0,,1248,,0,,,,,730,79007,79007,1266,0,,,,,,,,0,442425,12441,,,,,,0,442425,12441 +"2020-05-11","IN",1540,1411,32,,4389,4389,1346,0,990,452,122061,6158,,,,,213,24627,,501,0,,,,,24752,,,0,190674,1650,,,,,,0,190674,1650 +"2020-05-11","KS",158,,1,,660,660,,3,233,,46993,1436,,,,101,,7116,,168,0,,,,,,,,0,54109,1604,,,,,,0,,0 +"2020-05-11","KY",304,304,0,,1757,1757,394,0,758,226,,0,,,,,,6440,6417,0,0,,,,,,2308,,0,86900,0,,,,,,0,86900,0 +"2020-05-11","LA",2308,2242,22,,,,1310,0,,,189015,4743,,,,,157,31815,31815,215,0,,,,,,22608,,0,220830,4958,,,,,,0,,0 +"2020-05-11","MA",5108,5108,129,,7732,7732,3102,115,,813,316266,5670,,,,,,78462,78462,669,0,,,,,98664,,,0,496747,15642,,,,,,0,496747,15642 +"2020-05-11","MD",1788,1698,49,90,6183,6183,1544,228,,585,131407,4063,,,,,,33373,33373,786,0,,,,,38979,2298,,0,179388,7930,,,,,,0,179388,7930 +"2020-05-11","ME",65,65,1,,200,200,37,1,,17,,0,587,,,,9,1462,1328,26,0,,,,,1622,872,,0,31148,337,,,,,,0,31148,337 +"2020-05-11","MI",5139,4958,58,228,,,1424,0,,685,,0,,,278293,,557,54004,50925,971,0,,,,,61550,22686,,0,339843,11509,,,,,,0,339843,11509 +"2020-05-11","MN",591,591,13,,1716,1716,452,59,600,194,115585,4476,,,,,,14379,14379,827,0,,,,,,6945,129964,5303,129964,5303,,,,,,0,,0 +"2020-05-11","MO",488,,6,,,,824,0,,,105702,0,,5953,111728,,137,9918,9918,74,0,,,272,,11789,,,0,123746,2187,,,6234,,,0,123746,2187 +"2020-05-11","MP",2,,0,,,,,0,,,2676,355,,,,,,19,19,3,0,,,,,,12,,0,2695,358,,,,,,0,2695,359 +"2020-05-11","MS",435,,5,,1546,1546,507,15,,132,86211,14110,,,,,68,9674,,173,0,,,,,,6268,,0,95885,14283,,,,,,0,95885,3886 +"2020-05-11","MT",16,,0,,62,62,4,0,,,,0,,,,,,459,,1,0,,,,,,423,,0,22572,868,,,,,,0,22572,868 +"2020-05-11","NC",550,550,3,,,,464,0,,,,0,,,,,,15045,15045,281,0,,,,,,,,0,208215,5318,,,,,,0,208215,5318 +"2020-05-11","ND",36,,1,,115,115,34,5,,,45496,2118,,,,,,1514,1514,26,0,,,,,,846,51107,2446,51107,2446,,,,,45238,1971,51954,2495 +"2020-05-11","NE",98,,2,,,,,0,,,37924,589,,,42946,,,8315,,81,0,,,,,9385,,,0,52594,682,,,,,46314,670,52594,682 +"2020-05-11","NH",133,,2,,318,318,113,5,97,,31723,1281,,,,,,3160,,149,0,,,,,,1229,,0,37116,1270,3059,,,,,0,37116,1270 +"2020-05-11","NJ",10926,9310,60,1616,,,4195,0,,1255,285988,112073,,,,,970,140022,139945,1415,0,,,,,,,,0,426010,113488,,,,,,-312447,425933,425933 +"2020-05-11","NM",208,,8,,886,886,207,97,,,,0,,,,,,5069,,206,0,,,,,,1300,,0,106721,4223,,,,,,0,106721,4223 +"2020-05-11","NV",344,,5,,,,482,0,,117,53932,1221,,,,,60,6152,6152,54,0,,,,,,,72724,1228,72724,1228,,,,,,0,72970,1367 +"2020-05-11","NY",21640,,162,,84194,84194,7226,433,,2450,,0,,,,,2020,337055,,1660,0,,,,,,,1204650,21652,1204650,21652,,,,,,0,,0 +"2020-05-11","OH",1357,1236,16,121,4413,4413,1011,62,1217,391,,0,,,,,256,24777,23400,696,0,,,,,26288,,,0,222582,8744,,,,,,0,222582,8744 +"2020-05-11","OK",274,,2,,828,828,177,2,,93,91379,0,,,90721,,,4613,4613,24,0,,,,,4923,3241,,0,95992,24,,,,,,0,95869,0 +"2020-05-11","OR",127,,0,,670,670,164,8,,45,72279,819,,,95112,,22,3228,,68,0,,,,,8663,1125,,0,103775,3187,,,,,,0,103775,3187 +"2020-05-11","PA",3731,,24,,,,2176,0,,,231704,3932,,,,,497,57154,,543,0,,,,,,,317433,5382,317433,5382,,,,,288858,4475,,0 +"2020-05-11","PR",113,57,2,,,,159,0,,,,0,,,,,,1054,1054,14,0,1202,,,,,,,0,1054,14,,,,,,0,,0 +"2020-05-11","RI",430,,8,,1280,1280,276,29,,73,69365,1259,,,87264,,52,11788,,175,0,,,,,14067,,99373,2397,99373,2397,,,,,81153,1434,101331,2038 +"2020-05-11","SC",331,331,0,,1252,1252,,0,,,76804,0,,,,,,7653,7653,0,0,,,,,,4120,,0,84457,0,,,,,,0,,0 +"2020-05-11","SD",34,,0,,263,263,78,2,,,20964,587,,,,,,3614,,97,0,,,,,5052,2187,,0,26736,1164,,,,,24578,684,26736,1164 +"2020-05-11","TN",251,251,8,,1344,1344,581,19,,,,0,,,257733,,,15544,15544,559,0,,,,,15544,8038,,0,273277,11408,,,,,,0,273277,11408 +"2020-05-11","TX",1100,483,12,,,,1525,0,,,,0,,,,,,39869,39869,1000,0,,,,,51389,21713,,0,578783,6107,,,,,,0,578783,6107 +"2020-05-11","UT",68,,1,,517,517,160,5,169,,146382,1711,,,156793,76,,6362,,111,0,,,,,7036,3181,,0,163829,2182,,,,,152814,1788,163829,2182 +"2020-05-11","VA",850,823,11,27,3300,3300,1504,89,,362,,0,,,,,194,25070,23889,989,0,961,20,,,31982,,182211,5553,182211,5553,17515,82,,,,0,,0 +"2020-05-11","VI",5,,1,,,,,0,,,1110,8,,,,,,69,,0,0,,,,,,60,,0,1179,8,,,,,,0,,0 +"2020-05-11","VT",53,53,0,,,,14,0,,,16876,620,,,,,,926,926,0,0,,,,,,785,,0,22680,718,,,,,17802,620,22680,718 +"2020-05-11","WA",931,931,10,,,,350,0,,110,,0,,,,,,17763,17763,126,0,,,,,,,270794,6198,270794,6198,,,,,247565,4843,,0 +"2020-05-11","WI",409,409,9,,1846,1846,340,26,460,117,108033,2870,,,,,,11920,10418,226,0,,,,,,5176,137837,4693,137837,4693,,,,,,0,,0 +"2020-05-11","WV",54,,0,,,,49,0,,10,,0,,,,,6,1366,1366,6,0,,,,,,775,,0,61316,816,,,,,,0,61316,816 +"2020-05-11","WY",7,,0,,66,66,12,1,,,11403,0,,,15403,,,669,510,7,0,,,,,603,443,,0,16006,616,,,,,,0,16006,616 +"2020-05-10","AK",10,10,0,,41,41,8,0,,,,0,,,,,,379,,1,0,,,,,,324,,0,27364,915,,,,,,0,27364,915 +"2020-05-10","AL",393,393,5,,1240,1240,424,12,460,,117644,1717,,,,274,,9777,9777,210,0,,,,,,,,0,127421,1927,,,,,127421,1927,,0 +"2020-05-10","AR",88,,0,,471,471,64,0,,,61781,0,,,,96,14,3747,3747,0,0,,,,,,2968,,0,65528,0,,,,,,0,65528,0 +"2020-05-10","AS",0,,0,,,,,0,,,83,0,,,,,,0,0,0,0,,,,,,,,0,83,0,,,,,,0,83,0 +"2020-05-10","AZ",536,,4,,2421,2421,713,35,,300,99258,4408,,,,,195,11119,,159,0,,,,,,,,0,153090,10983,,,27362,,110377,4567,153090,10983 +"2020-05-10","CA",2745,,67,,,,4555,0,,1328,,0,,,,,,66680,66680,2119,0,,,,,,,,0,955664,43094,,,,,,0,955664,43094 +"2020-05-10","CO",971,,4,,3631,3631,573,8,,,88891,4517,17708,,,,,19703,17809,328,0,1821,,,,,,117213,4024,117213,4024,19529,,,,104077,3467,,0 +"2020-05-10","CT",2967,2633,35,,9389,9389,1242,0,,,,0,,,106634,,,33554,,570,0,,,,,40518,5413,,0,147796,2908,,,,,,0,147796,2908 +"2020-05-10","DC",323,,12,,,,447,0,,130,,0,,,,,91,6272,,170,0,,,,,,880,29570,1387,29570,1387,,,,,,0,,0 +"2020-05-10","DE",312,277,11,35,,,285,0,,,24592,1573,,,,,,6447,,170,0,,,,,8445,2537,43897,1947,43897,1947,,,,,,0,,0 +"2020-05-10","FL",1791,1791,6,,7404,7404,,79,,,498352,10622,,,,,,39179,,681,0,,,,,,,538027,13684,538027,13684,,,,,,0,,0 +"2020-05-10","GA",1405,,5,,5997,5997,1144,10,1412,,,0,,,,,,33441,33441,909,0,,,,,28281,,,0,224474,5327,,,,,,0,224474,5327 +"2020-05-10","GU",5,,0,,,,,0,,,3643,0,,,,,,151,147,0,0,,,,,,124,,0,3794,0,,,,,,0,,0 +"2020-05-10","HI",17,17,0,,81,81,,0,,,36639,1006,,,,,,631,,2,0,,,,,592,551,38237,569,38237,569,,,,,,0,,0 +"2020-05-10","IA",265,,13,,,,413,0,,157,62215,2410,,,,,105,11959,11959,288,0,,,,,,5154,,0,74174,2698,,,,,,0,,0 +"2020-05-10","ID",67,,0,,207,207,25,1,87,,29912,311,,,,,,2230,2049,25,0,,,,,,1473,,0,31961,333,,,,,31961,333,,0 +"2020-05-10","IL",3406,,57,,,,4293,0,,1232,,0,,,,,709,77741,77741,1656,0,,,,,,,,0,429984,13653,,,,,,0,429984,13653 +"2020-05-10","IN",1508,1379,18,,4389,4389,1328,0,990,462,115903,3949,,,,,205,24126,,394,0,,,,,24618,,,0,189024,3839,,,,,,0,189024,3839 +"2020-05-10","KS",157,,0,,657,657,,22,231,,45557,2375,,,,101,,6948,,197,0,,,,,,,,0,52505,2572,,,,,,0,,0 +"2020-05-10","KY",304,304,6,,1757,1757,394,61,758,226,,0,,,,,,6440,6417,152,0,,,,,,2308,,0,86900,472,,,,,,0,86900,472 +"2020-05-10","LA",2286,2213,19,,,,1324,0,,,184272,3532,,,,,161,31600,31600,183,0,,,,,,20316,,0,215872,3715,,,,,,0,,0 +"2020-05-10","MA",4979,4979,139,,7617,7617,3128,66,,810,310596,10802,,,,,,77793,77793,1050,0,,,,,96540,,,0,481105,4559,,,,,,0,481105,4559 +"2020-05-10","MD",1739,1652,47,87,5955,5955,1640,23,,611,127344,2850,,,,,,32587,32587,1053,0,,,,,37984,2293,,0,171458,7340,,,,,,0,171458,7340 +"2020-05-10","ME",64,64,0,,199,199,36,1,,17,,0,587,,,,10,1436,1312,28,0,,,,,1607,861,,0,30811,589,,,,,,0,30811,589 +"2020-05-10","MI",5081,4911,45,228,,,1437,0,,674,,0,,,267417,,536,53033,50129,301,0,,,,,60917,22686,,0,328334,8654,,,,,,0,328334,8654 +"2020-05-10","MN",578,578,20,,1657,1657,434,45,581,199,111109,5069,,,,,,13552,13552,231,0,,,,,,6304,124661,5300,124661,5300,,,,,,0,,0 +"2020-05-10","MO",482,,10,,,,824,0,,,105702,6470,,5273,109674,,137,9844,9844,178,0,,,251,,11659,,,0,121559,4258,,,5533,,,0,121559,4258 +"2020-05-10","MP",2,,0,,,,,0,,,2321,0,,,,,,16,16,0,0,,,,,,12,,0,2337,0,,,,,,0,2336,0 +"2020-05-10","MS",430,,9,,1531,1531,645,19,,141,72101,0,,,,,78,9501,,123,0,,,,,,4421,,0,81602,123,,,,,,0,91999,1527 +"2020-05-10","MT",16,,0,,62,62,4,0,,,,0,,,,,,458,,0,0,,,,,,422,,0,21704,375,,,,,,0,21704,375 +"2020-05-10","NC",547,547,3,,,,442,0,,,,0,,,,,,14764,14764,404,0,,,,,,,,0,202897,7457,,,,,,0,202897,7457 +"2020-05-10","ND",35,,0,,110,110,29,0,,,43378,909,,,,,,1488,1488,26,0,,,,,,792,48661,1346,48661,1346,,,,,43267,939,49459,1375 +"2020-05-10","NE",96,,4,,,,,0,,,37335,2190,,,42348,,,8234,,403,0,,,,,9303,,,0,51912,2156,,,,,45644,2598,51912,2156 +"2020-05-10","NH",131,,10,,313,313,107,4,97,,30442,1091,,,,,,3011,,64,0,,,,,,1228,,0,35846,1672,2930,,,,,0,35846,1672 +"2020-05-10","NJ",10866,9255,151,1611,,,4308,0,,1338,173915,5794,,,,,994,138607,138532,1457,0,,,,,,,,0,312522,7251,,,,,312447,7241,,0 +"2020-05-10","NM",200,,9,,789,789,194,0,,,,0,,,,,,4863,,85,0,,,,,,1285,,0,102498,5445,,,,,,0,102498,5445 +"2020-05-10","NV",339,,5,,,,444,0,,116,52711,2628,,,,,65,6098,6098,70,0,,,,,,,71496,2256,71496,2256,,,,,,0,71603,3237 +"2020-05-10","NY",21478,,207,,83761,83761,7262,476,,2488,,0,,,,,2073,335395,,2273,0,,,,,,,1182998,29230,1182998,29230,,,,,,0,,0 +"2020-05-10","OH",1341,1220,10,121,4351,4351,962,51,1205,381,,0,,,,,254,24081,22891,384,0,,,,,25687,,,0,213838,9202,,,,,,0,213838,9202 +"2020-05-10","OK",272,,2,,826,826,177,4,,93,91379,0,,,90721,,,4589,4589,99,0,,,,,4923,3204,,0,95968,99,,,,,,0,95869,0 +"2020-05-10","OR",127,,3,,662,662,139,3,,34,71460,1835,,,92032,,19,3160,,92,0,,,,,8556,1125,,0,100588,3990,,,,,,0,100588,3990 +"2020-05-10","PA",3707,,19,,,,2230,0,,,227772,5981,,,,,501,56611,,1295,0,,,,,,,312051,9374,312051,9374,,,,,284383,7276,,0 +"2020-05-10","PR",111,57,3,,,,143,0,,,,0,,,,,,1040,1040,6,0,1158,,,,,,,0,1040,6,,,,,,0,,0 +"2020-05-10","RI",422,,4,,1251,1251,283,33,,70,68106,1502,,,85467,,52,11613,,186,0,,,,,13826,,96976,3800,96976,3800,,,,,79719,1688,99293,2367 +"2020-05-10","SC",331,331,1,,1252,1252,,0,,,76804,3372,,,,,,7653,7653,122,0,,,,,,4120,,0,84457,3494,,,,,,0,,0 +"2020-05-10","SD",34,,0,,261,261,77,8,,,20377,818,,,,,,3517,,124,0,,,,,4921,2147,,0,25572,2188,,,,,23894,942,25572,2188 +"2020-05-10","TN",243,243,1,,1325,1325,484,6,,,,0,,,246884,,,14985,14985,217,0,,,,,14985,7528,,0,261869,9121,,,,,,0,261869,9121 +"2020-05-10","TX",1088,481,39,,,,1626,0,,,,0,,,,,,38869,38869,1009,0,,,,,50981,21022,,0,572676,12667,,,,,,0,572676,12667 +"2020-05-10","UT",67,,1,,512,512,144,14,168,,144671,2471,,,154691,76,,6251,,148,0,,,,,6956,3033,,0,161647,3139,,,,,151026,2610,161647,3139 +"2020-05-10","VA",839,813,12,26,3211,3211,1555,47,,351,,0,,,,,187,24081,22962,885,0,922,20,,,31136,,176658,7117,176658,7117,16846,82,,,,0,,0 +"2020-05-10","VI",4,,0,,,,,0,,,1102,78,,,,,,69,,1,0,,,,,,59,,0,1171,79,,,,,,0,,0 +"2020-05-10","VT",53,53,0,,,,21,0,,,16256,454,,,,,,926,926,8,0,,,,,,777,,0,21962,548,,,,,17182,462,21962,548 +"2020-05-10","WA",921,921,16,,,,335,0,,101,,0,,,,,,17637,17637,254,0,,,,,,,264596,1776,264596,1776,,,,,242722,1361,,0 +"2020-05-10","WI",400,400,2,,1820,1820,332,14,456,113,105163,3228,,,,,,11694,10219,292,0,,,,,,5014,133144,5609,133144,5609,,,,,,0,,0 +"2020-05-10","WV",54,,1,,,,49,0,,10,,0,,,,,6,1360,1360,25,0,,,,,,775,,0,60500,1566,,,,,,0,60500,1566 +"2020-05-10","WY",7,,0,,65,65,12,1,,,11403,0,,,14810,,,662,504,9,0,,,,,580,443,,0,15390,103,,,,,,0,15390,103 +"2020-05-09","AK",10,10,0,,41,41,8,0,,,,0,,,,,,378,,1,0,,,,,,318,,0,26449,976,,,,,,0,26449,976 +"2020-05-09","AL",388,388,13,,1228,1228,437,21,459,,115927,5034,,,,272,,9567,9567,346,0,,,,,,,,0,125494,5380,,,,,125494,5380,,0 +"2020-05-09","AR",88,,0,,471,471,64,5,,,61781,1481,,,,96,14,3747,3747,53,0,,,,,,2968,,0,65528,1534,,,,,,0,65528,1534 +"2020-05-09","AS",0,,0,,,,,0,,,83,0,,,,,,0,0,0,0,,,,,,,,0,83,0,,,,,,0,83,0 +"2020-05-09","AZ",532,,15,,2386,2386,739,36,,296,94850,4251,,,,,186,10960,,434,0,,,,,,,,0,142107,7030,,,23130,,105810,4685,142107,7030 +"2020-05-09","CA",2678,,93,,,,4538,0,,1349,,0,,,,,,64561,64561,2049,0,,,,,,,,0,912570,37298,,,,,,0,912570,37298 +"2020-05-09","CO",967,,7,,3623,3623,790,23,,,84374,6429,16062,,,,,19375,17491,548,0,1680,,,,,,113189,4680,113189,4680,17742,,,,100610,3838,,0 +"2020-05-09","CT",2932,2495,58,,9389,9389,1301,0,,,,0,,,104090,,,32984,,573,0,,,,,40162,5413,,0,144888,6072,,,,,,0,144888,6072 +"2020-05-09","DC",311,,7,,,,447,0,,130,,0,,,,,91,6102,,203,0,,,,,,879,28183,1068,28183,1068,,,,,,0,,0 +"2020-05-09","DE",301,268,4,33,,,288,0,,,23019,866,,,,,,6277,,166,0,,,,,8292,2450,41950,2059,41950,2059,,,,,,0,,0 +"2020-05-09","FL",1785,1785,47,,7325,7325,,168,,,487730,13588,,,,,,38498,,765,0,,,,,,,524343,16745,524343,16745,,,,,,0,,0 +"2020-05-09","GA",1400,,23,,5987,5987,1179,52,1409,,,0,,,,,,32532,32532,426,0,,,,,27085,,,0,219147,4803,,,,,,0,219147,4803 +"2020-05-09","GU",5,,0,,,,,0,,,3643,17,,,,,,151,147,0,0,,,,,,124,,0,3794,17,,,,,,0,,0 +"2020-05-09","HI",17,17,0,,81,81,,7,,,35633,-356,,,,,,629,,0,0,,,,,589,566,37668,670,37668,670,,,,,,0,,0 +"2020-05-09","IA",252,,9,,,,402,0,,161,59805,1001,,,,,106,11671,11671,214,0,,,,,,5011,,0,71476,1215,,,,,,0,,0 +"2020-05-09","ID",67,,0,,206,206,19,0,86,,29601,509,,,,,,2205,2027,27,0,,,,,,1442,,0,31628,529,,,,,31628,529,,0 +"2020-05-09","IL",3349,,108,,,,4739,0,,1215,,0,,,,,739,76085,76085,2325,0,,,,,,,,0,416331,16617,,,,,,0,416331,16617 +"2020-05-09","IN",1490,1362,43,,4389,4389,1361,0,990,458,111954,4972,,,,,213,23732,,586,0,,,,,24293,,,0,185185,7819,,,,,,0,185185,7819 +"2020-05-09","KS",157,,5,,635,635,,27,229,,43182,1975,,,,100,,6751,,250,0,,,,,,,,0,49933,2225,,,,,,0,,0 +"2020-05-09","KY",298,298,4,,1696,1696,369,12,723,210,,0,,,,,,6288,6269,159,0,,,,,,2266,,0,86428,5037,,,,,,0,86428,5037 +"2020-05-09","LA",2267,2042,40,,,,1333,0,,,180740,9179,,,,,165,31417,31417,562,0,,,,,,20316,,0,212157,9741,,,,,,0,,0 +"2020-05-09","MA",4840,4840,138,,7551,7551,3229,117,,814,299794,9104,,,,,,76743,76743,1410,0,,,,,95866,,,0,476546,7688,,,,,,0,476546,7688 +"2020-05-09","MD",1692,1609,49,83,5932,5932,1665,121,,575,124494,2792,,,,,,31534,31534,1049,0,,,,,36612,2159,,0,164118,6049,,,,,,0,164118,6049 +"2020-05-09","ME",64,64,1,,198,198,43,4,,22,,0,587,,,,10,1408,1287,34,0,,,,,1590,857,,0,30222,602,,,,,,0,30222,602 +"2020-05-09","MI",5036,4853,49,227,,,1531,0,,683,,0,,,259265,,539,52732,49871,383,0,,,,,60415,22686,,0,319680,11879,,,,,,0,319680,11879 +"2020-05-09","MN",558,558,24,,1612,1612,476,63,556,180,106040,4632,,,,,,13321,13321,281,0,,,,,,5764,119361,4913,119361,4913,,,,,,0,,0 +"2020-05-09","MO",472,,23,,,,855,0,,,99232,0,,4628,105590,,144,9666,9666,177,0,,,227,,11486,,,0,117301,3811,,,4861,,,0,117301,3811 +"2020-05-09","MP",2,,0,,,,,0,,,2321,0,,,,,,16,16,1,0,,,,,,12,,0,2337,1,,,,,,0,2336,0 +"2020-05-09","MS",421,,12,,1512,1512,607,34,,133,72101,0,,,,,76,9378,,288,0,,,,,,4421,,0,81479,288,,,,,,0,90472,90472 +"2020-05-09","MT",16,,0,,62,62,4,0,,,,0,,,,,,458,,0,0,,,,,,422,,0,21329,384,,,,,,0,21329,384 +"2020-05-09","NC",544,544,17,,,,513,0,,,,0,,,,,,14360,14360,492,0,,,,,,,,0,195440,7917,,,,,,0,195440,7917 +"2020-05-09","ND",35,,2,,110,110,34,6,,,42469,1393,,,,,,1462,1462,40,0,,,,,,762,47315,1891,47315,1891,,,,,42328,1315,48084,1947 +"2020-05-09","NE",92,,2,,,,,0,,,35145,1923,,,40586,,,7831,,641,0,,,,,8914,,,0,49756,4479,,,,,43046,2564,49756,4479 +"2020-05-09","NH",121,,7,,309,309,112,1,97,,29351,1522,,,,,,2947,,104,0,,,,,,1210,,0,34174,1514,2619,,,,,0,34174,1514 +"2020-05-09","NJ",10715,9116,177,1599,,,4628,0,,1416,168121,4816,,,,,1054,137150,137085,1646,0,,,,,,,,0,305271,6462,,,,,305206,6447,,0 +"2020-05-09","NM",191,,10,,789,789,198,0,,,,0,,,,,,4778,,105,0,,,,,,1268,,0,97053,3791,,,,,,0,97053,3791 +"2020-05-09","NV",334,,6,,,,,0,,,50083,2623,,,,,,6028,6028,144,0,,,,,,,69240,3799,69240,3799,,,,,,0,68366,2822 +"2020-05-09","NY",21271,,226,,83285,83285,7776,555,,2664,,0,,,,,2203,333122,,2715,0,,,,,,,1153768,32225,1153768,32225,,,,,,0,,0 +"2020-05-09","OH",1331,1214,25,117,4300,4300,929,82,1200,368,,0,,,,,222,23697,22560,681,0,,,,,25039,,,0,204636,9858,,,,,,0,204636,9858 +"2020-05-09","OK",270,,4,,822,822,177,17,,93,91379,5946,,,90721,,,4490,4490,66,0,,,,,4923,3154,,0,95869,6012,,,,,,0,95869,6012 +"2020-05-09","OR",124,,3,,659,659,159,14,,42,69625,2156,,,88226,,18,3068,,79,0,,,,,8372,1125,,0,96598,3080,,,,,,0,96598,3080 +"2020-05-09","PA",3688,,72,,,,2285,0,,,221791,5470,,,,,502,55316,,1078,0,,,,,,,302677,7817,302677,7817,,,,,277107,6548,,0 +"2020-05-09","PR",108,57,1,,,,148,0,,,,0,,,,,7,1034,1034,5,0,1139,,,,,,,0,1034,5,,,,,,0,,0 +"2020-05-09","RI",418,,19,,1218,1218,292,31,,77,66604,2266,,,83377,,56,11427,,286,0,,,,,13549,,93176,2957,93176,2957,,,,,78031,2552,96926,3736 +"2020-05-09","SC",330,330,14,,1252,1252,,100,,,73432,7132,,,,,,7531,7531,389,0,,,,,,4120,,0,80963,7521,,,,,,0,,0 +"2020-05-09","SD",34,,3,,253,253,79,6,,,19559,1410,,,,,,3393,,249,0,,,,,4517,2125,,0,23384,1308,,,,,22952,1659,23384,1308 +"2020-05-09","TN",242,242,1,,1319,1319,509,20,,,,0,,,237980,,,14768,14768,327,0,,,,,14768,7369,,0,252748,9170,,,,,,0,252748,9170 +"2020-05-09","TX",1049,470,45,,,,1735,0,,,,0,,,,,,37860,37860,1251,0,,,,,49966,20141,,0,560009,23019,,,,,,0,560009,23019 +"2020-05-09","UT",66,,5,,498,498,172,10,166,,142200,3981,,,151706,75,,6103,,184,0,,,,,6802,2901,,0,158508,4869,,,,,148416,4150,158508,4869 +"2020-05-09","VA",827,801,15,26,3164,3164,1593,105,,367,,0,,,,,198,23196,22086,854,0,839,20,,,30016,,169541,8426,169541,8426,15457,82,,,,0,,0 +"2020-05-09","VI",4,,0,,,,,0,,,1024,0,,,,,,68,,0,0,,,,,,57,,0,1092,0,,,,,,0,,0 +"2020-05-09","VT",53,53,0,,,,21,0,,,15802,460,,,,,,918,918,2,0,,,,,,744,,0,21414,515,,,,,16720,462,21414,515 +"2020-05-09","WA",905,905,14,,,,393,0,,128,,0,,,,,,17383,17383,266,0,,,,,,,262820,2508,262820,2508,,,,,241361,2094,,0 +"2020-05-09","WI",398,398,14,,1806,1806,339,39,452,110,101935,4670,,,,,,11402,9939,372,0,,,,,,4875,127535,5781,127535,5781,,,,,,0,,0 +"2020-05-09","WV",53,,2,,,,53,0,,13,,0,,,,,7,1335,1335,25,0,,,,,,761,,0,58934,1555,,,,,,0,58934,1555 +"2020-05-09","WY",7,,0,,64,64,12,4,,,11403,0,,,14707,,,653,495,9,0,,,,,580,438,,0,15287,128,,,,,,0,15287,128 +"2020-05-08","AK",10,10,0,,41,41,16,0,,,,0,,,,,,377,,3,0,,,,,,305,,0,25473,1132,,,,,,0,25473,1132 +"2020-05-08","AL",375,375,26,,1207,1207,481,29,454,,110893,4618,,,,266,,9221,9221,323,0,,,,,,,,0,120114,4941,,,,,120114,4941,,0 +"2020-05-08","AR",88,,1,,466,466,70,4,,,60300,3916,,,,93,14,3694,3694,83,0,,,,,,2159,,0,63994,3999,,,,,,0,63994,3999 +"2020-05-08","AS",0,,0,,,,,0,,,83,0,,,,,,0,0,0,0,,,,,,,,0,83,0,,,,,,0,83,0 +"2020-05-08","AZ",517,,67,,2350,2350,730,58,,295,90599,4110,,,,,197,10526,,581,0,,,,,,,,0,135077,7106,,,18782,,101125,4691,135077,7106 +"2020-05-08","CA",2585,,81,,,,4514,0,,1342,,0,,,,,,62512,62512,1898,0,,,,,,,,0,875272,32398,,,,,,0,875272,32398 +"2020-05-08","CO",960,,16,,3600,3600,790,43,,,77945,2210,,,,,,18827,16969,456,0,,,,,,,108509,5376,108509,5376,,,,,96772,4505,,0 +"2020-05-08","CT",2874,2436,77,,9389,9389,1327,0,,,,0,,,98806,,,32411,,627,0,,,,,39412,5413,,0,138816,4519,,,,,,0,138816,4519 +"2020-05-08","DC",304,,19,,,,447,0,,130,,0,,,,,91,5899,,245,0,,,,,,825,27115,1259,27115,1259,,,,,,0,,0 +"2020-05-08","DE",297,264,12,33,,,289,0,,,22153,766,,,,,,6111,,172,0,,,,,8095,2288,39891,1710,39891,1710,,,,,,0,,0 +"2020-05-08","FL",1738,1738,71,,7157,7157,,167,,,474142,20020,,,,,,37733,,344,0,,,,,,,507598,17302,507598,17302,,,,,,0,,0 +"2020-05-08","GA",1377,,41,,5935,5935,1227,100,1399,,,0,,,,,,32106,32106,667,0,,,,,26759,,,0,214344,4834,,,,,,0,214344,4834 +"2020-05-08","GU",5,,0,,,,,0,,,3626,62,,,,,,151,147,0,0,,,,,,122,,0,3777,62,,,,,,0,,0 +"2020-05-08","HI",17,17,0,,74,74,,0,,,35989,1074,,,,,,629,,3,0,,,,,588,565,36998,686,36998,686,,,,,,0,,0 +"2020-05-08","IA",243,,12,,,,407,0,,164,58804,3436,,,,,109,11457,11457,398,0,,,,,,4685,,0,70261,3834,,,,,,0,,0 +"2020-05-08","ID",67,,1,,206,206,16,1,86,,29092,360,,,,,,2178,2007,20,0,,,,,,1420,,0,31099,381,,,,,31099,381,,0 +"2020-05-08","IL",3241,,130,,,,4750,0,,1222,,0,,,,,727,73760,73760,2887,0,,,,,,,,0,399714,20671,,,,,,0,399714,20671 +"2020-05-08","IN",1447,1328,33,,4389,4389,1379,4389,990,481,106982,4703,,,,,219,23146,,643,0,,,,,23719,,,0,177366,7659,,,,,,0,177366,7659 +"2020-05-08","KS",152,,5,,608,608,,21,223,,41207,2529,,,,99,,6501,,357,0,,,,,,,,0,47708,2886,,,,,,0,,0 +"2020-05-08","KY",294,294,11,,1684,1684,356,68,714,199,,0,,,,,,6129,6119,195,0,,,,,,2177,,0,81391,2788,,,,,,0,81391,2788 +"2020-05-08","LA",2227,1991,19,,,,1359,0,,,171561,1446,,,,,185,30855,30855,203,0,,,,,,20316,,0,202416,1649,,,,,,0,,0 +"2020-05-08","MA",4702,4702,150,,7434,7434,3349,197,,826,290690,12779,,,,,,75333,75333,1612,0,,,,,94841,,,0,468858,16945,,,,,,0,468858,16945 +"2020-05-08","MD",1643,1561,63,82,5811,5811,1674,148,,571,121702,2476,,,,,,30485,30485,1111,0,,,,,35288,2041,,0,158069,5048,,,,,,0,158069,5048 +"2020-05-08","ME",63,63,1,,194,194,44,2,,23,,0,587,,,,10,1374,1264,44,0,,,,,1559,836,,0,29620,725,,,,,,0,29620,725 +"2020-05-08","MI",4987,4809,62,215,,,1637,0,,725,,0,,,248142,,570,52349,49565,618,0,,,,,59659,15659,,0,307801,12785,,,,,,0,307801,12785 +"2020-05-08","MN",534,534,26,,1549,1549,473,90,540,198,101408,4164,,,,,,13040,13040,712,0,,,,,,5163,114448,4876,114448,4876,,,,,,0,,0 +"2020-05-08","MO",449,,31,,,,832,0,,,99232,4951,,4053,101966,,143,9489,9489,148,0,,,202,,11307,,,0,113490,4208,,,4258,,,0,113490,4208 +"2020-05-08","MP",2,,0,,,,,0,,,2321,538,,,,,,15,15,0,0,,,,,,12,,0,2336,538,,,,,,0,2336,539 +"2020-05-08","MS",409,,13,,1478,1478,632,36,,123,72101,0,,,,,58,9090,,404,0,,,,,,4421,,0,81191,404,,,,,,0,,0 +"2020-05-08","MT",16,,0,,62,62,6,0,,,,0,,,,,,458,,2,0,,,,,,420,,0,20945,698,,,,,,0,20945,698 +"2020-05-08","NC",527,527,20,,,,515,0,,,,0,,,,,,13868,13868,471,0,,,,,,,,0,187523,6871,,,,,,0,187523,6871 +"2020-05-08","ND",33,,2,,104,104,33,2,,,41076,1580,,,,,,1422,1422,53,0,,,,,,714,45424,1918,45424,1918,,,,,41013,1639,46137,1970 +"2020-05-08","NE",90,,4,,,,,0,,,33222,2235,,,36930,,,7190,,419,0,,,,,8092,,,0,45277,3054,,,,,40482,2653,45277,3054 +"2020-05-08","NH",114,,3,,308,308,113,1,97,,27829,1763,,,,,,2843,,103,0,,,,,,1165,,0,32660,1120,2326,,,,,0,32660,1120 +"2020-05-08","NJ",10538,8952,170,1586,,,4605,0,,1439,163305,4282,,,,,1089,135504,135454,1827,0,,,,,,,,0,298809,6109,,,,,298759,6101,,0 +"2020-05-08","NM",181,,9,,789,789,201,29,,,,0,,,,,,4673,,180,0,,,,,,1189,,0,93262,4230,,,,,,0,93262,4230 +"2020-05-08","NV",328,,8,,,,,0,,,47460,1869,,,,,,5884,5884,118,0,,,,,,,65441,3780,65441,3780,,,,,,0,65544,1836 +"2020-05-08","NY",21045,,217,,82730,82730,8196,533,,2811,,0,,,,,2295,330407,,2938,0,,,,,,,1121543,31627,1121543,31627,,,,,,0,,0 +"2020-05-08","OH",1306,1185,35,121,4218,4218,1060,78,1188,393,,0,,,,,274,23016,21969,885,0,,,,,24172,,,0,194778,8856,,,,,,0,194778,8856 +"2020-05-08","OK",266,,6,,805,805,228,0,,96,85433,2876,,,85078,,,4424,4424,94,0,,,,,4779,3064,,0,89857,2970,,,,,,0,89857,2398 +"2020-05-08","OR",121,,6,,645,645,171,4,,48,67469,2409,,,85304,,23,2989,,73,0,,,,,8214,1125,,0,93518,3816,,,,,,0,93518,3816 +"2020-05-08","PA",3616,,200,,,,2342,0,,,216321,6448,,,,,517,54238,,1323,0,,,,,,,294860,9040,294860,9040,,,,,270559,7771,,0 +"2020-05-08","PR",107,56,5,,,,161,0,,,,0,,,,,10,1029,1029,16,0,1127,,,,,,,0,1029,16,,,,,,0,,0 +"2020-05-08","RI",399,,11,,1187,1187,312,34,,71,64338,1691,,,80087,,52,11141,,231,0,,,,,13103,,90219,3394,90219,3394,,,,,75479,1922,93190,2833 +"2020-05-08","SC",316,316,11,,1152,1152,,0,,,66300,-4246,,,,,,7142,7142,206,0,,,,,,3816,,0,73442,-4040,,,,,,0,,0 +"2020-05-08","SD",31,,0,,247,247,76,11,,,18149,940,,,,,,3144,,239,0,,,,,4285,2069,,0,22076,933,,,,,21293,1179,22076,933 +"2020-05-08","TN",241,,4,,1299,1299,550,33,,,,0,,,229137,,,14441,14441,345,0,,,,,14441,7011,,0,243578,7250,,,,,,0,243578,7250 +"2020-05-08","TX",1004,453,31,,,,1734,0,,,,0,,,,,,36609,36609,1219,0,,,,,48434,19197,,0,536990,23354,,,,,,0,536990,23354 +"2020-05-08","UT",61,,0,,488,488,216,12,162,,138219,4169,,,147041,73,,5919,,195,0,,,,,6598,2769,,0,153639,5010,,,,,144266,4355,153639,5010 +"2020-05-08","VA",812,787,43,25,3059,3059,1625,104,,378,,0,,,,,199,22342,21274,772,0,737,20,,,28671,,161115,7282,161115,7282,13422,65,,,,0,,0 +"2020-05-08","VI",4,,0,,,,,0,,,1024,34,,,,,,68,,2,0,,,,,,57,,0,1092,36,,,,,,0,,0 +"2020-05-08","VT",53,53,0,,,,15,0,,,15342,525,,,,,,916,916,2,0,,,,,,737,,0,20899,614,,,,,16258,527,20899,614 +"2020-05-08","WA",891,891,21,,,,393,0,,122,,0,,,,,,17117,17117,289,0,,,,,,,260312,6096,260312,6096,,,,,239267,5175,,0 +"2020-05-08","WI",384,384,10,,1767,1767,345,35,441,110,97265,4230,,,,,,11030,9590,409,0,,,,,,4694,121754,5633,121754,5633,,,,,,0,,0 +"2020-05-08","WV",51,,0,,,,65,0,,19,,0,,,,,11,1310,1310,23,0,,,,,,761,,0,57379,1716,,,,,,0,57379,1716 +"2020-05-08","WY",7,,0,,60,60,9,1,,,11403,0,,,14580,,,644,490,9,0,,,,,579,428,,0,15159,482,,,,,,0,15159,482 +"2020-05-07","AK",10,10,0,,41,41,12,0,,,,0,,,,,,374,,2,0,,,,,,291,,0,24341,686,,,,,,0,24341,686 +"2020-05-07","AL",349,349,9,,1178,1178,502,20,448,,106275,5340,,,,266,,8898,8898,317,0,,,,,,,,0,115173,5657,,,,,115173,5657,,0 +"2020-05-07","AR",87,,2,,462,462,69,9,,,56384,949,,,,93,14,3611,3611,43,0,,,,,,2123,,0,59995,992,,,,,,0,59995,992 +"2020-05-07","AS",0,,0,,,,,0,,,83,0,,,,,,0,0,0,0,,,,,,,,0,83,0,,,,,,0,83,0 +"2020-05-07","AZ",450,,24,,2292,2292,766,48,,288,86489,4459,,,,,196,9945,,238,0,,,,,,,,0,127971,5702,,,14652,,96434,4697,127971,5702 +"2020-05-07","CA",2504,,92,,,,4560,0,,1374,,0,,,,,,60614,60614,1799,0,,,,,,,,0,842874,33838,,,,,,0,842874,33838 +"2020-05-07","CO",944,,23,,3557,3557,821,571,,,75735,2218,,,,,,18371,16532,541,0,,,,,,,103133,3306,103133,3306,,,,,92267,2738,,0 +"2020-05-07","CT",2797,2339,79,,9389,9389,1385,1631,,,,0,,,95117,,,31784,,789,0,,,,,38617,5413,,0,134297,4276,,,,,,0,134297,4276 +"2020-05-07","DC",285,,8,,,,447,0,,130,,0,,,,,91,5654,,193,0,,,,,,825,25856,872,25856,872,,,,,,0,,0 +"2020-05-07","DE",285,253,16,32,,,285,0,,,21387,697,,,,,,5939,,161,0,,,,,7904,2110,38181,1377,38181,1377,,,,,,0,,0 +"2020-05-07","FL",1667,1667,62,,6990,6990,,214,,,454122,12073,,,,,,37389,,625,0,,,,,,,490296,13811,490296,13811,,,,,,0,,0 +"2020-05-07","GA",1336,,25,,5835,5835,1309,70,1374,,,0,,,,,,31439,31439,743,0,,,,,26433,,,0,209510,10285,,,,,,0,209510,10285 +"2020-05-07","GU",5,,0,,,,,0,,,3564,88,,,,,,151,147,0,0,,,,,,123,,0,3715,88,,,,,,0,,0 +"2020-05-07","HI",17,17,0,,74,74,,1,,,34915,341,,,,,,626,,1,0,,,,,586,558,36312,587,36312,587,,,,,,0,,0 +"2020-05-07","IA",231,,12,,,,417,0,,151,55368,2601,,,,,107,11059,11059,655,0,,,,,,4266,,0,66427,3256,,,,,,0,,0 +"2020-05-07","ID",66,,1,,205,205,20,2,86,,28732,314,,,,,,2158,1986,31,0,,,,,,1399,,0,30718,343,,,,,30718,343,,0 +"2020-05-07","IL",3111,,137,,,,4862,0,,1253,,0,,,,,766,70873,70873,2641,0,,,,,,,,0,379043,17783,,,,,,0,379043,17783 +"2020-05-07","IN",1414,1295,37,,,,1457,0,,487,102279,3653,,,,,228,22503,,633,0,,,,,23103,,,0,169707,7043,,,,,,0,169707,7043 +"2020-05-07","KS",147,,3,,587,587,,16,218,,38678,2298,,,,97,,6144,,410,0,,,,,,,,0,44822,2708,,,,,,0,,0 +"2020-05-07","KY",283,282,8,,1616,1616,351,13,693,190,,0,,,,,,5934,5931,112,0,,,,,,2125,,0,78603,17590,,,,,,0,78603,17590 +"2020-05-07","LA",2208,1926,93,,,,1432,0,,,170115,5842,,,,,189,30652,30652,253,0,,,,,,20316,,0,200767,6095,,,,,,0,,0 +"2020-05-07","MA",4552,4552,132,,7237,7237,3436,157,,852,277911,10297,,,,,,73721,73721,1696,0,,,,,92617,,,0,451913,17091,,,,,,0,451913,17091 +"2020-05-07","MD",1580,1500,60,80,5663,5663,1683,166,,584,119226,3377,,,,,,29374,29374,1211,0,,,,,34106,2029,,0,153021,6357,,,,,,0,153021,6357 +"2020-05-07","ME",62,62,0,,192,192,39,1,,16,,0,587,,,,11,1330,1231,76,0,,,,,1524,787,,0,28895,754,,,,,,0,28895,754 +"2020-05-07","MI",4925,4772,86,211,,,1697,0,,753,,0,,,236184,,612,51731,49064,600,0,,,,,58832,15659,,0,295016,12565,,,,,,0,295016,12565 +"2020-05-07","MN",508,508,23,,1459,1459,435,54,512,182,97244,4197,,,,,,12328,12328,818,0,,,,,,4800,109572,5015,109572,5015,,,,,,0,,0 +"2020-05-07","MO",418,,22,,,,917,0,,,94281,2636,,3471,98025,,141,9341,9341,239,0,,,171,,11048,,,0,109282,4794,,,3644,,,0,109282,4794 +"2020-05-07","MP",2,,0,,,,,0,,,1783,0,,,,,,15,15,0,0,,,,,,12,,0,1798,0,,,,,,0,1797,0 +"2020-05-07","MS",396,,22,,1442,1442,650,50,,139,72101,0,,,,,71,8686,,262,0,,,,,,4421,,0,80787,262,,,,,,0,,0 +"2020-05-07","MT",16,,0,,62,62,6,0,,,,0,,,,,,456,,0,0,,,,,,417,,0,20247,543,,,,,,0,20247,543 +"2020-05-07","NC",507,507,30,,,,525,0,,,,0,,,,,,13397,13397,639,0,,,,,,,,0,180652,9330,,,,,,0,180652,9330 +"2020-05-07","ND",31,,0,,102,102,35,5,,,39496,2187,,,,,,1369,1369,49,0,,,,,,601,43506,2518,43506,2518,,,,,39374,2201,44167,2566 +"2020-05-07","NE",86,,4,,,,,0,,,30987,1297,,,34617,,,6771,,333,0,,,,,7354,,,0,42223,1987,,,,,37829,1635,42223,1987 +"2020-05-07","NH",111,,19,,307,307,113,12,82,,26066,969,,,,,,2740,,104,0,,,,,,1110,,0,31540,1420,2048,,,,,0,31540,1420 +"2020-05-07","NJ",10368,8801,264,1567,,,4996,0,,1470,159023,1993,,,,,1107,133677,133635,1749,0,,,,,,,,0,292700,3742,,,,,292658,3738,,0 +"2020-05-07","NM",172,,3,,760,760,197,73,,,,0,,,,,,4493,,202,0,,,,,,1125,,0,89032,3348,,,,,,0,89032,3348 +"2020-05-07","NV",320,,9,,,,,0,,,45591,1979,,,,,,5766,5766,103,0,,,,,,,61661,2568,61661,2568,,,,,,0,63708,2618 +"2020-05-07","NY",20828,,951,,82197,82197,8665,627,,2976,,0,,,,,2425,327469,,3491,0,,,,,,,1089916,33995,1089916,33995,,,,,,0,,0 +"2020-05-07","OH",1271,1153,46,118,4140,4140,1057,88,1167,418,,0,,,,,279,22131,21132,555,0,,,,,23510,,,0,185922,8707,,,,,,0,185922,8707 +"2020-05-07","OK",260,,7,,805,805,223,32,,97,82557,3868,,,82557,,,4330,4330,129,0,,,,,4698,2985,,0,86887,3997,,,,,,0,87459,4058 +"2020-05-07","OR",115,,2,,641,641,191,19,,47,65060,2475,,,81645,,20,2916,,77,0,,,,,8057,1125,,0,89702,3092,,,,,,0,89702,3092 +"2020-05-07","PA",3416,,310,,,,2420,0,,,209873,5378,,,,,539,52915,,1070,0,,,,,,,285820,8247,285820,8247,,,,,262788,6448,,0 +"2020-05-07","PR",102,56,3,,,,164,0,,,,0,,,,,,1013,1013,7,0,1018,,,,,,,0,1013,7,,,,,,0,,0 +"2020-05-07","RI",388,,18,,1153,1153,318,30,,82,62647,1929,,,77593,,56,10910,,271,0,,,,,12764,,86825,3317,86825,3317,,,,,73557,2200,90357,3320 +"2020-05-07","SC",305,305,0,,1152,1152,,0,,,70546,0,,,,,,6936,6936,0,0,,,,,,3816,,0,77482,0,,,,,,0,,0 +"2020-05-07","SD",31,,2,,236,236,70,6,,,17209,572,,,,,,2905,,126,0,,,,,4136,2028,,0,21143,570,,,,,20114,698,21143,570 +"2020-05-07","TN",237,,-2,,1266,1266,558,45,,,,0,,,222232,,,14096,14096,158,0,,,,,14096,6783,,0,236328,9227,,,,,,0,236328,9227 +"2020-05-07","TX",973,449,25,,,,1750,0,,,,0,,,,,,35390,35390,968,0,,,,,46699,18440,,0,513636,22428,,,,,,0,513636,22428 +"2020-05-07","UT",61,,3,,476,476,194,12,159,,134050,4315,,,142231,73,,5724,,129,0,,,,,6398,2640,,0,148629,4932,,,,,139911,4475,148629,4932 +"2020-05-07","VA",769,745,56,24,2955,2955,1613,182,,371,,0,,,,,203,21570,20537,1314,0,658,19,,,27518,,153833,8712,153833,8712,12106,50,,,,0,,0 +"2020-05-07","VI",4,,0,,,,,0,,,990,0,,,,,,66,,0,0,,,,,,54,,0,1056,0,,,,,,0,,0 +"2020-05-07","VT",53,53,1,,,,14,0,,2,14817,392,,,,,0,914,914,5,0,,,,,,718,,0,20285,222,,,,,15731,397,20285,222 +"2020-05-07","WA",870,870,8,,,,358,0,,144,,0,,,,,,16828,16828,259,0,,,,,,,254216,5514,254216,5514,,,,,234092,4584,,0 +"2020-05-07","WI",374,374,12,,1732,1732,339,38,435,107,93035,5209,,,,,,10621,9215,359,0,,,,,,4520,116121,6367,116121,6367,,,,,,0,,0 +"2020-05-07","WV",51,,1,,,,76,0,,22,,0,,,,,12,1287,1287,39,0,,,,,,716,,0,55663,1557,,,,,,0,55663,1557 +"2020-05-07","WY",7,,0,,59,59,11,-1,,,11403,0,,,14114,,,635,483,4,0,,,,,563,416,,0,14677,528,,,,,,0,14677,528 +"2020-05-06","AK",10,10,1,,41,41,8,1,,,,0,,,,,,372,,1,0,,,,,,284,,0,23655,963,,,,,,0,23655,963 +"2020-05-06","AL",340,340,27,,1158,1158,485,51,442,,100935,2454,,,,264,,8581,8581,296,0,,,,,,,,0,109516,2750,,,,,109516,2750,,0 +"2020-05-06","AR",85,,2,,453,453,69,0,,,55435,4296,,,,89,14,3568,3568,72,0,,,,,,2109,,0,59003,4368,,,,,,0,59003,4368 +"2020-05-06","AS",0,,0,,,,,0,,,83,0,,,,,,0,0,0,0,,,,,,,,0,83,0,,,,,,0,83,0 +"2020-05-06","AZ",426,,31,,2244,2244,754,52,,286,82030,3075,,,,,193,9707,,402,0,,,,,,,,0,122269,5785,,,,,91737,3477,122269,5785 +"2020-05-06","CA",2412,,95,,,,4681,0,,1415,,0,,,,,,58815,58815,2603,0,,,,,,,,0,809036,29134,,,,,,0,809036,29134 +"2020-05-06","CO",921,,18,,2986,2986,798,67,,,73517,4905,,,,,,17830,16012,466,0,,,,,,,99827,3161,99827,3161,,,,,89529,3553,,0 +"2020-05-06","CT",2718,2339,85,,7758,7758,1445,0,,,,0,,,91552,,,30995,,374,0,,,,,37937,4346,,0,130021,4812,,,,,,0,130021,4812 +"2020-05-06","DC",277,,13,,,,447,0,,130,,0,,,,,91,5461,,139,0,,,,,,808,24984,655,24984,655,,,,,,0,,0 +"2020-05-06","DE",269,237,3,32,,,299,0,,,20690,1381,,,,,,5778,,407,0,,,,,7635,2008,36804,1125,36804,1125,,,,,,0,,0 +"2020-05-06","FL",1605,1605,69,,6776,6776,,230,,,442049,13797,,,,,,36764,,581,0,,,,,,,476485,14803,476485,14803,,,,,,0,,0 +"2020-05-06","GA",1311,,23,,5765,5765,1339,131,1343,,,0,,,,,,30696,30696,985,0,,,,,25851,,,0,199225,8903,,,,,,0,199225,8903 +"2020-05-06","GU",5,,0,,,,,0,,,3476,135,,,,,,151,147,2,0,,,,,,123,,0,3627,137,,,,,,0,,0 +"2020-05-06","HI",17,17,0,,73,73,,0,,,34574,1196,,,,,,625,,4,0,,,,,584,551,35725,863,35725,863,,,,,,0,,0 +"2020-05-06","IA",219,,12,,,,414,0,,151,52767,2309,,,,,103,10404,10404,293,0,,,,,,3803,,0,63171,2602,,,,,,0,,0 +"2020-05-06","ID",65,,1,,203,203,21,2,84,,28418,216,,,,,,2127,1957,21,0,,,,,,1379,,0,30375,229,,,,,30375,229,,0 +"2020-05-06","IL",2974,,136,,,,4832,0,,1231,,0,,,,,780,68232,68232,2270,0,,,,,,,,0,361260,14974,,,,,,0,361260,14974 +"2020-05-06","IN",1377,1264,51,,,,1558,0,,526,98626,3825,,,,,281,21870,,837,0,,,,,22504,,,0,162664,7804,,,,,,0,162664,7804 +"2020-05-06","KS",144,,7,,571,571,,5,213,,36380,1746,,,,96,,5734,,276,0,,,,,,,,0,42114,2022,,,,,,0,,0 +"2020-05-06","KY",275,274,14,,1603,1603,347,74,685,189,,0,,,,,,5822,5821,577,0,,,,,,2058,,0,61013,967,,,,,,0,61013,967 +"2020-05-06","LA",2115,1907,0,,,,1465,0,,,164273,6038,,,,,187,30399,30399,403,0,,,,,,20316,,0,194672,6441,,,,,,0,,0 +"2020-05-06","MA",4420,4420,208,,7080,7080,3564,249,,922,267614,4536,,,,,,72025,72025,1754,0,,,,,90148,,,0,434822,16685,,,,,,0,434822,16685 +"2020-05-06","MD",1520,1444,44,76,5497,5497,1707,160,,584,115849,2863,,,,,,28163,28163,1046,0,,,,,32710,1903,,0,146664,4537,,,,,,0,146664,4537 +"2020-05-06","ME",62,62,1,,191,191,37,4,,18,,0,587,,,,12,1254,1174,28,0,,,,,1481,766,,0,28141,651,,,,,,0,28141,651 +"2020-05-06","MI",4839,4714,58,209,,,1818,0,,794,,0,,,224563,,617,51131,48572,634,0,,,,,57888,15659,,0,282451,12496,,,,,,0,282451,12496 +"2020-05-06","MN",485,485,30,,1405,1405,443,55,488,180,93047,3845,,,,,,11510,11510,634,0,,,,,,4520,104557,4479,104557,4479,,,,,,0,,0 +"2020-05-06","MO",396,,19,,,,953,0,,,91645,5495,,2911,93577,,134,9102,9102,186,0,,,144,,10719,,,0,104488,4105,,,3057,,,0,104488,4105 +"2020-05-06","MP",2,,0,,,,,0,,,1783,0,,,,,,15,15,1,0,,,,,,12,,0,1798,1,,,,,,0,1797,1797 +"2020-05-06","MS",374,,32,,1392,1392,618,40,,144,72101,0,,,,,79,8424,,217,0,,,,,,4421,,0,80525,217,,,,,,0,,0 +"2020-05-06","MT",16,,0,,62,62,6,0,,,,0,,,,,,456,,0,0,,,,,,417,,0,19704,4432,,,,,,0,19704,4432 +"2020-05-06","NC",477,477,25,,,,516,0,,,,0,,,,,,12758,12758,502,0,,,,,,,,0,171322,5972,,,,,,0,171322,5972 +"2020-05-06","ND",31,,6,,97,97,32,2,,,37309,2154,,,,,,1320,1320,56,0,,,,,,582,40988,2554,40988,2554,,,,,37173,2122,41601,2582 +"2020-05-06","NE",82,,4,,,,,0,,,29690,1164,,,33047,,,6438,,355,0,,,,,6943,,,0,40236,1737,,,,,36194,1519,40236,1737 +"2020-05-06","NH",92,,6,,295,295,115,9,82,,25097,815,,,,,,2636,,48,0,,,,,,1105,,0,30120,1332,1775,,,,,0,30120,1332 +"2020-05-06","NJ",10104,8549,321,1555,,,5221,0,,1549,157030,0,,,,,1146,131928,131890,1308,0,,,,,,,,0,288958,1308,,,,,288920,1297,,0 +"2020-05-06","NM",169,,7,,687,687,193,0,,,,0,,,,,,4291,,153,0,,,,,,1073,,0,85684,2433,,,,,,0,85684,2433 +"2020-05-06","NV",311,,14,,,,,0,,,43612,1322,,,,,,5663,5663,69,0,,,,,,,59093,2693,59093,2693,,,,,,0,61090,1653 +"2020-05-06","NY",19877,,232,,81570,81570,9179,652,,3098,,0,,,,,,323978,,2786,0,,,,,,,1055921,27022,1055921,27022,,,,,,0,,0 +"2020-05-06","OH",1225,1114,90,111,4052,4052,1045,96,1151,407,,0,,,,,275,21576,20625,607,0,,,,,22819,,,0,177215,6820,,,,,,0,177215,6820 +"2020-05-06","OK",253,,6,,773,773,230,0,,102,78689,3399,,,78689,,,4201,4201,74,0,,,,,4538,2909,,0,82890,3473,,,,,,0,83401,3509 +"2020-05-06","OR",113,,4,,622,622,219,14,,49,62585,1887,,,78670,,25,2839,,80,0,,,,,7940,860,,0,86610,2904,,,,,,0,86610,2904 +"2020-05-06","PA",3106,,94,,,,2545,0,,,204495,4570,,,,,560,51845,,888,0,,,,,,,277573,6502,277573,6502,,,,,256340,5458,,0 +"2020-05-06","PR",99,56,0,,,,144,0,,,,-9313,,,,,,1006,1006,1,0,962,,,,,,,0,1006,-9312,,,,,,0,,0 +"2020-05-06","RI",370,,15,,1123,1123,324,31,,86,60718,1937,,,74689,,60,10639,,342,0,,,,,12348,,83508,3306,83508,3306,,,,,71357,2279,87037,3326 +"2020-05-06","SC",305,305,22,,1152,1152,,42,,,70546,9532,,,,,,6936,6936,179,0,,,,,,3816,,0,77482,9711,,,,,,0,,0 +"2020-05-06","SD",29,,5,,230,230,72,10,,,16637,336,,,,,,2779,,58,0,,,,,4071,1977,,0,20573,351,,,,,19416,394,20573,351 +"2020-05-06","TN",239,,13,,1221,1221,557,65,,,,0,,,213163,,,13938,13938,248,0,,,,,13938,6564,,0,227101,8305,,,,,,0,227101,8305 +"2020-05-06","TX",948,443,42,,,,1812,0,,,,0,,,,,,34422,34422,1053,0,,,,,45165,17622,,0,491208,22474,,,,,,0,491208,22474 +"2020-05-06","UT",58,,2,,464,464,,8,,,129735,3993,,,137482,,,5595,,146,0,,,,,6215,2509,,0,143697,4578,,,,,135436,4136,143697,4578 +"2020-05-06","VA",713,690,0,23,2773,2773,1496,73,,361,,0,,,,,189,20256,19357,0,0,553,19,,,26185,,145121,6185,145121,6185,10441,50,,,,0,,0 +"2020-05-06","VI",4,,0,,,,,0,,,990,17,,,,,,66,,0,0,,,,,,54,,0,1056,17,,,,,,0,,0 +"2020-05-06","VT",52,52,0,,,,26,0,,2,14425,208,,,,,0,909,909,3,0,,,,,,706,,0,20063,458,,,,,15334,211,20063,458 +"2020-05-06","WA",862,862,21,,,,390,0,,127,,0,,,,,,16569,16569,388,0,,,,,,,248702,6412,248702,6412,,,,,229508,5299,,0 +"2020-05-06","WI",362,362,9,,1694,1694,298,31,423,107,87826,3859,,,,,,10262,8901,366,0,,,,,,4348,109754,5261,109754,5261,,,,,,0,,0 +"2020-05-06","WV",50,,0,,,,76,0,,22,,0,,,,,12,1248,1248,10,0,,,,,,716,,0,54106,1019,,,,,,0,54106,1019 +"2020-05-06","WY",7,,0,,60,60,11,0,,,11403,1084,,,13594,,,631,479,27,0,,,,,555,409,,0,14149,600,,,,,,0,14149,600 +"2020-05-05","AK",9,9,0,,40,40,13,1,,,,0,,,,,,371,,1,0,,,,,,277,,0,22692,969,,,,,,0,22692,969 +"2020-05-05","AL",313,313,17,,1107,1107,522,43,428,,98481,3389,,,,255,,8285,8285,260,0,,,,,,,,0,106766,3649,,,,,106766,3649,,0 +"2020-05-05","AR",83,,2,,453,453,89,15,,,51139,155,,,,89,16,3496,3496,38,0,,,,,,2041,,0,54635,193,,,,,,0,54635,193 +"2020-05-05","AS",0,,0,,,,,0,,,83,0,,,,,,0,0,0,0,,,,,,,,0,83,0,,,,,,0,83,0 +"2020-05-05","AZ",395,,33,,2192,2192,728,57,,303,78955,2621,,,,,185,9305,,386,0,,,,,,,,0,116484,5685,,,,,88260,3007,116484,5685 +"2020-05-05","CA",2317,,63,,,,4622,0,,1388,,0,,,,,,56212,56212,1275,0,,,,,,,,0,779902,32028,,,,,,0,779902,32028 +"2020-05-05","CO",903,,52,,2919,2919,792,81,,,68612,515,,,,,,17364,15600,457,0,,,,,,,96666,3010,96666,3010,,,,,85976,2710,,0 +"2020-05-05","CT",2633,2257,138,,7758,7758,1500,0,,,,0,,,87665,,,30621,,1334,0,,,,,37055,4346,,0,125209,4363,,,,,,0,125209,4363 +"2020-05-05","DC",264,,6,,,,447,0,,130,,0,,,,,91,5322,,152,0,,,,,,667,24329,534,24329,534,,,,,,0,,0 +"2020-05-05","DE",266,235,11,31,,,284,0,,,19309,487,,,,,,5371,,83,0,,,,,7400,1847,35679,850,35679,850,,,,,,0,,0 +"2020-05-05","FL",1536,1536,113,,6546,6546,,217,,,428252,20879,,,,,,36183,,574,0,,,,,,,461682,21067,461682,21067,,,,,,0,,0 +"2020-05-05","GA",1288,,66,,5634,5634,1343,108,1318,,,0,,,,,,29711,29711,343,0,,,,,25197,,,0,190322,4781,,,,,,0,190322,4781 +"2020-05-05","GU",5,,0,,,,,0,,,3341,99,,,,,,149,145,0,0,,,,,,124,,0,3490,99,,,,,,0,,0 +"2020-05-05","HI",17,17,0,,73,73,,0,,,33378,132,,,,,,621,,1,0,,,,,580,548,34862,498,34862,498,,,,,,0,,0 +"2020-05-05","IA",207,,19,,,,407,0,,152,50458,3000,,,,,94,10111,10111,408,0,,,,,,3572,,0,60569,3408,,,,,,0,,0 +"2020-05-05","ID",64,,0,,201,201,27,1,83,,28202,456,,,,,,2106,1944,45,0,,,,,,1358,,0,30146,495,,,,,30146,495,,0 +"2020-05-05","IL",2838,,176,,,,4780,0,,1266,,0,,,,,780,65962,65962,2122,0,,,,,,,,0,346286,13139,,,,,,0,346286,13139 +"2020-05-05","IN",1326,1213,62,,,,1537,0,,480,94801,2011,,,,,272,21033,,526,0,,,,,21666,,,0,154860,6917,,,,,,0,154860,6917 +"2020-05-05","KS",137,,1,,566,566,,13,212,,34634,1276,,,,95,,5458,,213,0,,,,,,,,0,40092,1489,,,,,,0,,0 +"2020-05-05","KY",261,260,8,,1529,1529,333,10,659,174,,0,,,,,,5245,5244,115,0,,,,,,1892,,0,60046,1638,,,,,,0,60046,1638 +"2020-05-05","LA",2115,1884,51,,,,1512,0,,,158235,6977,,,,,194,29996,29996,323,0,,,,,,20316,,0,188231,7300,,,,,,0,,0 +"2020-05-05","MA",4212,4212,122,,6831,6831,3542,209,,914,263078,7897,,,,,,70271,70271,1184,0,,,,,87665,,,0,418137,16013,,,,,,0,418137,16013 +"2020-05-05","MD",1476,1402,52,74,5337,5337,1693,138,,573,112986,2399,,,,,,27117,27117,709,0,,,,,31544,1810,,0,142127,3143,,,,,,0,142127,3143 +"2020-05-05","ME",61,61,4,,187,187,36,1,,18,,0,,,,,12,1226,1150,21,0,,,,,1454,741,,0,27490,306,,,,,,0,27490,306 +"2020-05-05","MI",4781,4630,59,208,,,1948,0,,839,,0,,,213091,,670,50497,48034,688,0,,,,,56864,15659,,0,269955,11419,,,,,,0,269955,11419 +"2020-05-05","MN",455,455,27,,1350,1350,434,79,475,182,89202,2525,,,,,,10876,10876,641,0,,,,,,4159,100078,3166,100078,3166,,,,,,0,,0 +"2020-05-05","MO",377,,19,,,,893,0,,,86150,3453,,2906,89800,,139,8916,8916,162,0,,,142,,10407,,,0,100383,1182,,,3050,,,0,100383,1182 +"2020-05-05","MP",2,,0,,,,,0,,,1783,462,,,,,,14,14,0,0,,,,,,12,,0,1797,462,,,,,,0,,0 +"2020-05-05","MS",342,,32,,1352,1352,645,36,,162,72101,301,,,,,77,8207,,330,0,,,,,,4421,,0,80308,631,,,,,,0,,0 +"2020-05-05","MT",16,,0,,62,62,6,0,,,,0,,,,,,456,,-1,0,,,,,,410,,0,15272,184,,,,,,0,15272,184 +"2020-05-05","NC",452,452,22,,,,534,0,,,,0,,,,,,12256,12256,408,0,,,,,,,,0,165350,2701,,,,,,0,165350,2701 +"2020-05-05","ND",25,,0,,95,95,31,1,,,35155,1626,,,,,,1264,1264,39,0,,,,,,559,38434,1878,38434,1878,,,,,35051,1610,39019,1897 +"2020-05-05","NE",78,,0,,,,,0,,,28526,682,,,31719,,,6083,,173,0,,,,,6535,,,0,38499,2153,,,,,34675,856,38499,2153 +"2020-05-05","NH",86,,0,,286,286,111,0,82,,24282,0,,,,,,2588,,0,0,,,,,,1019,,0,28788,878,1509,,,,,0,28788,878 +"2020-05-05","NJ",9783,8244,341,1539,,,5328,0,,1534,157030,8079,,,,,1169,130620,130593,2332,0,,,,,,,,0,287650,10411,,,,,287623,10403,,0 +"2020-05-05","NM",162,,6,,687,687,178,20,,,,0,,,,,,4138,,107,0,,,,,,964,,0,83251,1531,,,,,,0,83251,1531 +"2020-05-05","NV",297,,5,,,,,0,,,42290,1615,,,,,,5594,5594,103,0,,,,,,,56400,2041,56400,2041,,,,,,0,59437,2163 +"2020-05-05","NY",19645,,230,,80918,80918,9600,542,,3281,,0,,,,,,321192,,2239,0,,,,,,,1028899,21589,1028899,21589,,,,,,0,,0 +"2020-05-05","OH",1135,1038,79,97,3956,3956,1069,147,1123,402,,0,,,,,281,20969,20072,495,0,,,,,22330,,,0,170395,5697,,,,,,0,170395,5697 +"2020-05-05","OK",247,,9,,773,773,236,20,,113,75290,15486,,,75290,,,4127,4127,83,0,,,,,4430,2830,,0,79417,15569,,,,,,0,79892,9524 +"2020-05-05","OR",109,,0,,608,608,207,10,,41,60698,1324,,,75851,,17,2759,,79,0,,,,,7855,860,,0,83706,2697,,,,,,0,83706,2697 +"2020-05-05","PA",3012,,554,,,,2580,0,,,199925,4427,,,,,550,50957,,865,0,,,,,,,271071,6345,271071,6345,,,,,250882,5292,,0 +"2020-05-05","PR",99,56,2,,,,140,0,,,9313,0,,,,,,1005,1005,4,0,919,,,,,,,0,10318,4,,,,,,0,,0 +"2020-05-05","RI",355,,14,,1092,1092,327,31,,89,58781,1979,,,71853,,62,10297,,303,0,,,,,11858,,80202,2485,80202,2485,,,,,69078,2282,83711,3313 +"2020-05-05","SC",283,283,8,,1110,1110,,0,,,61014,3452,,,,,,6757,6757,131,0,,,,,,3622,,0,67771,3583,,,,,,0,,0 +"2020-05-05","SD",24,,3,,220,220,75,9,,,16301,256,,,,,,2721,,53,0,,,,,4026,1895,,0,20222,293,,,,,19022,309,20222,293 +"2020-05-05","TN",226,,7,,1156,1156,520,13,,,,0,,,205172,,,13690,13624,119,0,,,,,13624,6356,,0,218796,7353,,,,,,0,218796,7353 +"2020-05-05","TX",906,433,22,,,,1888,0,,,,0,,,,,,33369,33369,1037,0,,,,,43683,16791,,0,468734,23939,,,,,,0,468734,23939 +"2020-05-05","UT",56,,6,,456,456,,15,,,125742,2792,,,133065,,,5449,,132,0,,,,,6054,2387,,0,139119,3294,,,,,131300,2937,139119,3294 +"2020-05-05","VA",713,690,29,23,2700,2700,1496,73,,361,,0,,,,,189,20256,19357,764,0,499,14,,,25079,,138936,3295,138936,3295,9325,45,,,,0,,0 +"2020-05-05","VI",4,,0,,,,,0,,,973,8,,,,,,66,,0,0,,,,,,51,,0,1039,8,,,,,,0,,0 +"2020-05-05","VT",52,52,0,,,,33,0,,2,14217,168,,,,,0,906,906,5,0,,,,,,,,0,19605,191,,,,,15123,173,19605,191 +"2020-05-05","WA",841,841,7,,,,292,0,,102,,0,,,,,,16181,16181,85,0,,,,,,,242290,6125,242290,6125,,,,,224209,5069,,0 +"2020-05-05","WI",353,353,13,,1663,1663,309,42,414,91,83967,3500,,,,,,9896,8566,358,0,,,,,,4131,104493,3914,104493,3914,,,,,,0,,0 +"2020-05-05","WV",50,,0,,,,64,0,,23,,0,,,,,12,1238,1238,32,0,,,,,,630,,0,53087,1416,,,,,,0,53087,1416 +"2020-05-05","WY",7,,0,,60,60,13,0,,,10319,451,,,13006,,,604,452,8,0,,,,,543,405,,0,13549,441,,,,,,0,13549,441 +"2020-05-04","AK",9,9,0,,39,39,12,0,,,,0,,,,,,370,,2,0,,,,,,263,,0,21723,145,,,,,,0,21723,145 +"2020-05-04","AL",296,296,6,,1064,1064,517,29,411,,95092,10317,,,,247,,8025,8025,300,0,,,,,,,,0,103117,10617,,,,,103117,10617,,0 +"2020-05-04","AR",81,,5,,438,438,91,11,,,50984,1525,,,,88,16,3458,3458,27,0,,,,,,2016,,0,54442,1552,,,,,,0,54442,1552 +"2020-05-04","AS",0,,0,,,,,0,,,83,26,,,,,,0,0,0,0,,,,,,,,0,83,26,,,,,,0,83,26 +"2020-05-04","AZ",362,,0,,2135,2135,703,46,,288,76334,3855,,,,,200,8919,,279,0,,,,,,,,0,110799,1632,,,,,85253,4134,110799,1632 +"2020-05-04","CA",2254,,39,,,,4616,0,,1464,,0,,,,,,54937,54937,1321,0,,,,,,,,0,747874,32123,,,,,,0,747874,32123 +"2020-05-04","CO",851,,9,,2838,2838,834,39,,,68097,1642,,,,,,16907,15169,272,0,,,,,,,93656,2232,93656,2232,,,,,83266,1914,,0 +"2020-05-04","CT",2495,2168,59,,7758,7758,1488,0,,,,0,,,84199,,,29287,,0,0,,,,,36195,4346,,0,120846,2333,,,,,,0,120846,2333 +"2020-05-04","DC",258,,7,,,,447,0,,130,,0,,,,,91,5170,,154,0,,,,,,666,23795,693,23795,693,,,,,,0,,0 +"2020-05-04","DE",255,226,9,29,,,281,0,,,18822,293,,,,,,5288,,80,0,,,,,7226,1716,34829,1169,34829,1169,,,,,,0,,0 +"2020-05-04","FL",1423,1423,20,,6329,6329,,85,,,407373,15262,,,,,,35609,,768,0,,,,,,,440615,15372,440615,15372,,,,,,0,,0 +"2020-05-04","GA",1222,,45,,5526,5526,1377,133,1284,,,0,,,,,,29368,29368,766,0,,,,,24899,,,0,185541,12573,,,,,,0,185541,12573 +"2020-05-04","GU",5,,0,,,,,0,,,3242,90,,,,,,149,145,-1,0,,,,,,125,,0,3391,89,,,,,,0,,0 +"2020-05-04","HI",17,17,1,,73,73,,1,,,33246,916,,,,,,620,,0,0,,,,,579,544,34364,510,34364,510,,,,,,0,,0 +"2020-05-04","IA",188,,4,,,,389,0,,143,47458,3441,,,,,93,9703,9703,534,0,,,,,,3486,,0,57161,3975,,,,,,0,,0 +"2020-05-04","ID",64,,1,,200,200,27,0,83,,27746,0,,,,,,2061,1905,0,0,,,,,,1267,,0,29651,0,,,,,29651,0,,0 +"2020-05-04","IL",2662,,44,,,,4493,0,,1232,,0,,,,,763,63840,63840,2341,0,,,,,,,,0,333147,13834,,,,,,0,333147,13834 +"2020-05-04","IN",1264,1151,18,,,,1449,0,,483,92790,3864,,,,,249,20507,,574,0,,,,,20933,,,0,147943,2221,,,,,,0,147943,2221 +"2020-05-04","KS",136,,2,,553,553,,6,209,,33358,1610,,,,95,,5245,,215,0,,,,,,,,0,38603,1825,,,,,,0,,0 +"2020-05-04","KY",253,252,5,,1519,1519,329,108,654,170,,0,,,,,,5130,5129,251,0,,,,,,1892,,0,58408,760,,,,,,0,58408,760 +"2020-05-04","LA",2064,1905,95,,,,1502,0,,,151258,4438,,,,,220,29673,29673,333,0,,,,,,20316,,0,180931,4771,,,,,,0,,0 +"2020-05-04","MA",4090,4090,86,,6622,6622,3539,115,,908,255181,8622,,,,,,69087,69087,1000,0,,,,,85160,,,0,402124,15444,,,,,,0,402124,15444 +"2020-05-04","MD",1424,1353,52,71,5199,5199,1649,148,,563,110587,3255,,,,,,26408,26408,946,0,,,,,30845,1695,,0,138984,5617,,,,,,0,138984,5617 +"2020-05-04","ME",57,57,0,,186,186,37,3,,18,,0,,,,,11,1205,1136,20,0,,,,,1440,720,,0,27184,327,,,,,,0,27184,327 +"2020-05-04","MI",4722,4573,81,206,,,1948,0,,839,,0,,,202671,,670,49809,47451,780,0,,,,,55865,15659,,0,258536,7947,,,,,,0,258536,7947 +"2020-05-04","MN",428,428,9,,1271,1271,396,72,444,166,86677,3244,,,,,,10235,10235,824,0,,,,,,3784,96912,4068,96912,4068,,,,,,0,,0 +"2020-05-04","MO",358,,6,,,,858,0,,,82697,8107,,2835,88708,,135,8754,8754,368,0,,,135,,10319,,,0,99201,1587,,,2972,,,0,99201,1587 +"2020-05-04","MP",2,,0,,,,,0,,,1321,0,,,,,,14,14,0,0,,,,,,12,,0,1335,0,,,,,,0,,0 +"2020-05-04","MS",310,,7,,1316,1316,646,18,,145,71800,1757,,,,,78,7877,,327,0,,,,,,4421,,0,79677,2084,,,,,,0,,0 +"2020-05-04","MT",16,,0,,62,62,6,1,,,,0,,,,,,457,,2,0,,,,,,404,,0,15088,81,,,,,,0,15088,81 +"2020-05-04","NC",430,430,8,,,,498,0,,,,0,,,,,,11848,11848,184,0,,,,,,,,0,162649,5202,,,,,,0,162649,5202 +"2020-05-04","ND",25,,0,,94,94,31,4,,,33529,1367,,,,,,1225,1225,34,0,,,,,,540,36556,1461,36556,1461,,,,,33441,1358,37122,1486 +"2020-05-04","NE",78,,2,,,,,0,,,27844,1908,,,30055,,,5910,,584,0,,,,,6055,,,0,36346,1651,,,,,33819,2487,36346,1651 +"2020-05-04","NH",86,,2,,286,286,103,9,,,24282,-1682,,,,,,2588,,159,0,,,,,,1017,,0,27910,426,1351,,,,,0,27910,426 +"2020-05-04","NJ",9442,7910,62,1532,,,5287,0,,1610,148951,629,,,,,1189,128288,128269,1526,0,,,,,,,,0,277239,2155,,,,,277220,2154,,0 +"2020-05-04","NM",156,,5,,667,667,181,80,,,,0,,,,,,4031,,181,0,,,,,,842,,0,81720,3743,,,,,,0,81720,3743 +"2020-05-04","NV",292,,5,,,,,0,,,40675,832,,,,,,5491,5491,68,0,,,,,,,54359,921,54359,921,,,,,,0,57274,1167 +"2020-05-04","NY",19415,,226,,80376,80376,9647,608,,3330,,0,,,,,,318953,,2538,0,,,,,,,1007310,21399,1007310,21399,,,,,,0,,0 +"2020-05-04","OH",1056,975,18,81,3809,3809,1078,40,1090,412,,0,,,,,275,20474,19609,560,0,,,,,21791,,,0,164698,6941,,,,,,0,164698,6941 +"2020-05-04","OK",238,,0,,753,753,236,10,,92,59804,0,,,66084,,,4044,4044,72,0,,,,,4150,2682,,0,63848,72,,,,,,0,70368,0 +"2020-05-04","OR",109,,0,,598,598,205,3,,46,59374,1873,,,73286,,21,2680,,45,0,,,,,7723,860,,0,81009,3492,,,,,,0,81009,3492 +"2020-05-04","PA",2458,,14,,,,2708,0,,,195498,4124,,,,,573,50092,,825,0,,,,,,,264726,5740,264726,5740,,,,,245590,4949,,0 +"2020-05-04","PR",97,54,0,,,,152,0,,,9313,0,,,,,,1001,1001,13,0,842,,,,,,,0,10314,13,,,,,,0,,0 +"2020-05-04","RI",341,,21,,1061,1061,339,48,,84,56802,1569,,,68975,,61,9994,,291,0,,,,,11423,,77717,2443,77717,2443,,,,,66796,1860,80398,2488 +"2020-05-04","SC",275,275,0,,1110,1110,,0,,,57562,0,,,,,,6626,6626,0,0,,,,,,3622,,0,64188,0,,,,,,0,,0 +"2020-05-04","SD",21,,0,,211,211,69,14,,,16045,259,,,,,,2668,,37,0,,,,,3985,1830,,0,19929,413,,,,,18713,296,19929,413 +"2020-05-04","TN",219,,9,,1143,1143,499,8,,,,0,,,197941,,,13571,13502,394,0,,,,,13502,6081,,0,211443,6836,,,,,,0,211443,6836 +"2020-05-04","TX",884,414,17,,,,1533,0,,,,0,,,,,,32332,32332,784,0,,,,,41855,16090,,0,444795,6756,,,,,,0,444795,6756 +"2020-05-04","UT",50,,0,,441,441,,5,,,122950,3075,,,129929,,,5317,,142,0,,,,,5896,2342,,0,135825,3675,,,,,128363,3252,135825,3675 +"2020-05-04","VA",684,662,24,22,2627,2627,1463,108,,348,,0,,,,,192,19492,18640,821,0,485,14,,,24539,,135641,4821,135641,4821,9034,45,,,,0,,0 +"2020-05-04","VI",4,,0,,,,,0,,,965,14,,,,,,66,,0,0,,,,,,51,,0,1031,14,,,,,,0,,0 +"2020-05-04","VT",52,52,0,,,,15,0,,,14049,315,,,,,,901,901,5,0,,,,,,,,0,19414,563,,,,,14950,320,19414,563 +"2020-05-04","WA",834,834,4,,,,263,0,,86,,0,,,,,,16096,16096,113,0,,,,,,,236165,6365,236165,6365,,,,,219140,5510,,0 +"2020-05-04","WI",340,340,1,,1621,1621,348,13,404,116,80467,2470,,,,,,9538,8236,311,0,,,,,,3973,100579,3499,100579,3499,,,,,,0,,0 +"2020-05-04","WV",50,,0,,,,73,0,,28,,0,,,,,15,1206,1206,15,0,,,,,,611,,0,51671,1397,,,,,,0,51671,1397 +"2020-05-04","WY",7,,0,,60,60,13,0,,,9868,228,,,12584,,,596,444,10,0,,,,,524,391,,0,13108,580,,,,,,0,13108,580 +"2020-05-03","AK",9,9,0,,39,39,12,0,,,,0,,,,,,368,,3,0,,,,,,262,,0,21578,179,,,,,,0,21578,179 +"2020-05-03","AL",290,290,2,,1035,1035,427,12,403,,84775,0,,,,242,,7725,7725,291,0,,,,,,,,0,92500,291,,,,,92500,291,,0 +"2020-05-03","AR",76,,3,,427,427,100,13,,,49459,1249,,,,88,20,3431,3431,59,0,,,,,,1999,,0,52890,1308,,,,,,0,52890,1308 +"2020-05-03","AS",0,,0,,,,,0,,,57,0,,,,,,0,0,0,0,,,,,,,,0,57,0,,,,,,0,57,0 +"2020-05-03","AZ",362,,14,,2089,2089,732,56,,282,72479,2846,,,,,192,8640,,276,0,,,,,,,,0,109167,6549,,,,,81119,3122,109167,6549 +"2020-05-03","CA",2215,,44,,,,4734,0,,1468,,0,,,,,,53616,53616,1419,0,,,,,,,,0,715751,30703,,,,,,0,715751,30703 +"2020-05-03","CO",842,,10,,2799,2799,883,6,,,66455,2774,,,,,,16635,14897,410,0,,,,,,,91424,3582,91424,3582,,,,,81352,3173,,0 +"2020-05-03","CT",2436,2089,97,,7758,7758,1551,0,,,,0,,,82322,,,29287,,523,0,,,,,35758,4346,,0,118513,3188,,,,,,0,118513,3188 +"2020-05-03","DC",251,,11,,,,,0,,,,0,,,,,,5016,,219,0,,,,,,666,23102,1098,23102,1098,,,,,,0,,0 +"2020-05-03","DE",246,220,11,26,,,284,0,,,18529,455,,,,,,5208,,170,0,,,,,6985,1640,33660,1163,33660,1163,,,,,,0,,0 +"2020-05-03","FL",1403,1403,15,,6244,6244,,299,,,392111,11562,,,,,,34841,,632,0,,,,,,,425243,12393,425243,12393,,,,,,0,,0 +"2020-05-03","GA",1177,,3,,5393,5393,1410,6,1249,,,0,,,,,,28602,28602,296,0,,,,,23985,,,0,172968,445,,,,,,0,172968,445 +"2020-05-03","GU",5,,0,,,,,0,,,3152,112,,,,,,150,146,2,0,,,,,,126,,0,3302,114,,,,,,0,,0 +"2020-05-03","HI",16,16,0,,72,72,,0,,,32330,964,,,,,,620,,1,0,,,,,576,541,33854,614,33854,614,,,,,,0,,0 +"2020-05-03","IA",184,,9,,,,378,0,,133,44017,6309,,,,,93,9169,9169,528,0,,,,,,3325,,0,53186,6837,,,,,,0,,0 +"2020-05-03","ID",63,,0,,200,200,27,22,83,,27746,291,,,,,,2061,1905,26,0,,,,,,1267,,0,29651,316,,,,,29651,316,,0 +"2020-05-03","IL",2618,,59,,,,4701,0,,1232,,0,,,,,759,61499,61499,2994,0,,,,,,,,0,319313,19417,,,,,,0,319313,19417 +"2020-05-03","IN",1246,1132,17,,,,1398,0,,476,88926,4080,,,,,242,19933,,638,0,,,,,20610,,,0,145722,3879,,,,,,0,145722,3879 +"2020-05-03","KS",134,,3,,547,547,,6,209,,31748,1552,,,,95,,5030,,284,0,,,,,,,,0,36778,1836,,,,,,0,,0 +"2020-05-03","KY",248,252,0,,1411,1411,334,0,652,178,,0,,,,,,4879,4878,0,0,,,,,,1752,,0,57648,0,,,,,,0,57648,0 +"2020-05-03","LA",1969,1845,19,,,,1530,0,,,146820,3102,,,,,213,29340,29340,200,0,,,,,,17303,,0,176160,3302,,,,,,0,,0 +"2020-05-03","MA",4004,4004,158,,6507,6507,3617,129,,904,246559,13828,,,,,,68087,68087,1824,0,,,,,82450,,,0,386680,6462,,,,,,0,386680,6462 +"2020-05-03","MD",1372,1302,49,70,5051,5051,1635,141,,565,107332,6283,,,,,,25462,25462,989,0,,,,,29716,1666,,0,133367,4636,,,,,,0,133367,4636 +"2020-05-03","ME",57,57,1,,183,183,33,2,,18,,0,,,,,12,1185,1185,33,0,,,,,1429,706,,0,26857,462,,,,,,0,26857,462 +"2020-05-03","MI",4641,4516,62,205,,,2100,0,,850,,0,,,195361,,713,49029,46783,357,0,,,,,55228,15659,,0,250589,7223,,,,,,0,250589,7223 +"2020-05-03","MN",419,419,24,,1199,1199,373,40,426,155,83433,2824,,,,,,9411,9411,340,0,,,,,,2596,92844,3164,92844,3164,,,,,,0,,0 +"2020-05-03","MO",352,,1,,,,896,0,,,74590,0,,2337,87215,,141,8386,8386,232,0,,,105,,10227,,,0,97614,4494,,,2443,,,0,97614,4494 +"2020-05-03","MP",2,,0,,,,,0,,,1321,387,,,,,,14,14,0,0,,,,,,12,,0,1335,387,,,,,,0,,0 +"2020-05-03","MS",303,,12,,1298,1298,667,33,,143,70043,3009,,,,,73,7550,,109,0,,,,,,3413,,0,77593,3118,,,,,,0,,0 +"2020-05-03","MT",16,,0,,61,61,5,0,,,,0,,,,,,455,,0,0,,,,,,404,,0,15007,372,,,,,,0,15007,372 +"2020-05-03","NC",422,422,2,,,,475,0,,,,0,,,,,,11664,11664,155,0,,,,,,,,0,157447,5961,,,,,,0,157447,5961 +"2020-05-03","ND",25,,1,,90,90,31,0,,,32162,1768,,,,,,1191,1191,38,0,,,,,,517,35095,1889,35095,1889,,,,,32083,1751,35636,1914 +"2020-05-03","NE",76,,3,,,,,0,,,25936,1426,,,28774,,,5326,,488,0,,,,,5689,,,0,34695,1772,,,,,31332,1775,34695,1772 +"2020-05-03","NH",84,,3,,277,277,103,7,,,25964,3925,,,,,,2429,,119,0,,,,,,1107,,0,27484,1222,1306,,,,,0,27484,1222 +"2020-05-03","NJ",9380,7871,155,1509,,,5317,0,,1623,148322,9727,,,,,1198,126762,126744,3031,0,,,,,,,,0,275084,12758,,,,,275066,12754,,0 +"2020-05-03","NM",151,,12,,587,587,164,0,,,,0,,,,,,3850,,118,0,,,,,,832,,0,77977,3033,,,,,,0,77977,3033 +"2020-05-03","NV",287,,6,,,,,0,,,39843,767,,,,,,5423,5423,112,0,,,,,,,53438,1087,53438,1087,,,,,,0,56107,1189 +"2020-05-03","NY",19189,,280,,79768,79768,9786,826,,3430,,0,,,,,,316415,,3438,0,,,,,,,985911,26894,985911,26894,,,,,,0,,0 +"2020-05-03","OH",1038,957,17,81,3769,3769,931,57,1078,393,,0,,,,,255,19914,19094,579,0,,,,,21111,,,0,157757,6520,,,,,,0,157757,6520 +"2020-05-03","OK",238,,0,,743,743,236,0,,92,59804,0,,,66084,,,3972,3972,121,0,,,,,4150,2635,,0,63776,121,,,,,,0,70368,0 +"2020-05-03","OR",109,,5,,595,595,209,4,,50,57501,1904,,,70095,,22,2635,,56,0,,,,,7422,,,0,77517,3368,,,,,,0,77517,3368 +"2020-05-03","PA",2444,,26,,,,2645,0,,,191374,4303,,,,,562,49267,,962,0,,,,,,,258986,6054,258986,6054,,,,,240641,5265,,0 +"2020-05-03","PR",97,53,2,,,,171,0,,,9313,0,,,,,,988,988,15,0,820,,,,,,,0,10301,15,,,,,,0,,0 +"2020-05-03","RI",320,,24,,1013,1013,330,36,,83,55233,1610,,,66874,,59,9703,,181,0,,,,,11036,,75274,2183,75274,2183,,,,,64936,1791,77910,2452 +"2020-05-03","SC",275,,8,,1110,1110,,0,,,57562,2435,,,,,,6626,6626,137,0,,,,,,3622,,0,64188,2572,,,,,,0,,-59379 +"2020-05-03","SD",21,,0,,197,197,71,10,,,15786,283,,,,,,2631,,43,0,,,,,3927,1799,,0,19516,520,,,,,18417,326,19516,520 +"2020-05-03","TN",210,,1,,1135,1135,510,10,,,,0,,,191430,,,13177,13177,516,0,,,,,13177,5814,,0,204607,8331,,,,,,0,204607,8331 +"2020-05-03","TX",867,,20,,,,1540,0,,,,0,,,,,,31548,31548,1026,0,,,,,41313,15544,,0,438039,10860,,,,,,0,438039,10860 +"2020-05-03","UT",50,,1,,436,436,,18,,,119875,2906,,,126447,,,5175,,194,0,,,,,5703,2238,,0,132150,3391,,,,,125111,3046,132150,3391 +"2020-05-03","VA",660,644,44,16,2519,2519,1413,103,,385,,0,,,,,193,18671,17873,940,0,449,14,,,23596,,130820,5852,130820,5852,8443,45,,,,0,,0 +"2020-05-03","VI",4,,0,,,,,0,,,951,29,,,,,,66,,0,0,,,,,,51,,0,1017,29,,,,,,0,,0 +"2020-05-03","VT",52,,1,,,,19,0,,,13734,329,,,,,,896,896,11,0,,,,,,,,0,18851,468,,,,,14630,340,18851,468 +"2020-05-03","WA",830,,6,,,,411,0,,120,,0,,,,,,15983,15983,318,0,,,,,,,229800,1797,229800,1797,,,,,213630,1484,,0 +"2020-05-03","WI",339,,5,,1608,1608,348,17,402,116,77997,2427,,,,,,9227,7964,307,0,,,,,,3723,97080,4266,97080,4266,,,,,,0,,0 +"2020-05-03","WV",50,,2,,,,73,0,,28,,0,,,,,15,1191,1191,22,0,,,,,,611,,0,50274,2347,,,,,,0,50274,2347 +"2020-05-03","WY",7,,0,,60,60,13,2,,,9640,177,,,12035,,,586,435,7,0,,,,,493,391,,0,12528,126,,,,,,0,12528,126 +"2020-05-02","AK",9,,0,,39,39,10,0,,,,0,,,,,,365,,1,0,,,,,,261,,0,21399,1074,,,,,,0,21399,1074 +"2020-05-02","AL",288,,9,,1023,1023,420,15,335,,84775,0,,,,195,,7434,7434,276,0,,,,,,,,0,92209,276,,,,,92209,276,,0 +"2020-05-02","AR",73,,9,,414,414,95,0,,,48210,1855,,,,85,20,3372,3372,51,0,,,,,,1987,,0,51582,1906,,,,,,0,51582,1906 +"2020-05-02","AS",0,,0,,,,,0,,,57,0,,,,,,0,0,0,0,,,,,,,,0,57,0,,,,,,0,57,0 +"2020-05-02","AZ",348,,18,,2033,2033,718,47,,291,69633,2716,,,,,198,8364,,402,0,,,,,,,,0,102618,5124,,,,,77997,3118,102618,5124 +"2020-05-02","CA",2171,,98,,,,4722,0,,1433,,0,,,,,,52197,52197,1755,0,,,,,,,,0,685048,30063,,,,,,0,685048,30063 +"2020-05-02","CO",832,,12,,2793,2793,883,46,,,63681,2500,,,,,,16225,14498,457,0,,,,,,,87842,3335,87842,3335,,,,,78179,2920,,0 +"2020-05-02","CT",2339,1998,0,,7758,7758,1592,0,,,,0,,,79731,,,28764,,0,0,,,,,35188,4346,,0,115325,4028,,,,,,0,115325,4028 +"2020-05-02","DC",240,,9,,,,,0,,,,0,,,,,,4797,,139,0,,,,,,666,22004,869,22004,869,,,,,,0,,0 +"2020-05-02","DE",235,209,13,26,,,300,0,,,18074,407,,,,,,5038,,120,0,,,,,6742,1546,32497,922,32497,922,,,,,,0,,0 +"2020-05-02","FL",1388,,74,,5945,5945,,150,,,380549,12578,,,,,,34209,,703,0,,,,,,,412850,16386,412850,16386,,,,,,0,,0 +"2020-05-02","GA",1174,,20,,5387,5387,1440,118,1247,,,0,,,,,,28306,28306,1036,0,,,,,23961,,,0,172523,6461,,,,,,0,172523,6461 +"2020-05-02","GU",5,,0,,,,,0,,,3040,181,,,,,,148,144,2,0,,,,,,131,,0,3188,183,,,,,,0,,0 +"2020-05-02","HI",16,16,0,,72,72,,2,,,31366,890,,,,,,619,,1,0,,,,,576,532,33240,867,33240,867,,,,,,0,,0 +"2020-05-02","IA",175,,5,,,,353,0,,131,37708,0,,,,,90,8641,8641,757,0,,,,,,3156,,0,46349,757,,,,,,0,,0 +"2020-05-02","ID",63,,0,,178,178,23,0,76,,27455,245,,,,,,2035,1880,20,0,,,,,,1215,,0,29335,265,,,,,29335,265,,0 +"2020-05-02","IL",2559,,102,,,,4717,0,,1250,,0,,,,,789,58505,58505,2450,0,,,,,,,,0,299896,15208,,,,,,0,299896,15208 +"2020-05-02","IN",1229,,54,,,,1456,0,,487,84846,3837,,,,,244,19295,,665,0,,,,,20157,,,0,141843,7634,,,,,,0,141843,7634 +"2020-05-02","KS",131,,1,,541,541,,7,206,,30196,1611,,,,95,,4746,,297,0,,,,,,,,0,34942,1908,,,,,,0,,0 +"2020-05-02","KY",248,,8,,1411,1411,334,36,652,178,,0,,,,,,4879,4878,171,0,,,,,,1752,,0,57648,1037,,,,,,0,57648,1037 +"2020-05-02","LA",1950,1801,23,,,,1545,0,,,143718,4178,,,,,208,29140,29140,429,0,,,,,,17303,,0,172858,4607,,,,,,0,,0 +"2020-05-02","MA",3846,,130,,6378,6378,3601,209,,921,232731,7406,,,,,,66263,66263,1952,0,,,,,81449,,,0,380218,9197,,,,,,0,380218,9197 +"2020-05-02","MD",1323,1258,47,65,4910,4910,1657,192,,566,101049,3538,,,,,,24473,24473,1001,0,,,,,28643,1590,,0,128731,5128,,,,,,0,128731,5128 +"2020-05-02","ME",56,,1,,181,181,36,4,,19,,0,,,,,10,1152,1152,29,0,,,,,1402,689,,0,26395,391,,,,,,0,26395,391 +"2020-05-02","MI",4579,4436,59,203,,,2100,0,,850,,0,,,188713,,713,48672,46455,432,0,,,,,54653,15659,,0,243366,10838,,,,,,0,243366,10838 +"2020-05-02","MN",395,,24,,1159,1159,389,63,404,135,80609,3395,,,,,,9071,9071,335,0,,,,,,2002,89680,3730,89680,3730,,,,,,0,,0 +"2020-05-02","MO",351,,14,,,,896,0,,,74590,0,,1913,83051,,141,8154,8154,319,0,,,83,,9908,,,0,93120,4131,,,1997,,,0,93120,4131 +"2020-05-02","MP",2,,0,,,,,0,,,934,185,,,,,,14,,0,0,,,,,,12,,0,948,185,,,,,,0,,0 +"2020-05-02","MS",291,,10,,1265,1265,632,39,,142,67034,2698,,,,,71,7441,,229,0,,,,,,3413,,0,74475,2927,,,,,,0,,0 +"2020-05-02","MT",16,,0,,61,61,5,0,,,,0,,,,,,455,,2,0,,,,,,404,,0,14635,432,,,,,,0,14635,432 +"2020-05-02","NC",420,,21,,,,502,0,,,,0,,,,,,11509,11509,586,0,,,,,,,,0,151486,5490,,,,,,0,151486,5490 +"2020-05-02","ND",24,,1,,90,90,32,4,,,30394,1976,,,,,,1153,1153,46,0,,,,,,510,33206,2114,33206,2114,,,,,30332,1991,33722,2156 +"2020-05-02","NE",73,,3,,,,,0,,,24510,1406,,,27364,,,4838,,557,0,,,,,5332,,,0,32923,2124,,,,,29557,1980,32923,2124 +"2020-05-02","NH",81,,9,,270,270,103,8,,,22039,2136,,,,,,2310,,164,0,,,,,,980,,0,26262,1120,1047,,,,,0,26262,1120 +"2020-05-02","NJ",9225,7742,225,1483,,,5713,0,,1715,138595,3240,,,,,1230,123731,123717,2541,0,,,,,,,,0,262326,5781,,,,,262312,5767,,0 +"2020-05-02","NM",139,,8,,587,587,168,0,,,,0,,,,,,3732,,219,0,,,,,,812,,0,74944,3826,,,,,,0,74944,3826 +"2020-05-02","NV",281,,4,,,,,0,,,39076,708,,,,,,5311,5311,84,0,,,,,,,52351,1879,52351,1879,,,,,,0,54918,934 +"2020-05-02","NY",18909,,299,,78942,78942,10350,718,,3501,,0,,,,,,312977,,4663,0,,,,,,,959017,31579,959017,31579,,,,,,0,,0 +"2020-05-02","OH",1021,940,19,81,3712,3712,1003,78,1066,424,,0,,,,,267,19335,18537,592,0,,,,,20547,,,0,151237,7350,,,,,,0,151237,7350 +"2020-05-02","OK",238,,8,,743,743,236,28,,92,59804,0,,,66084,,,3851,3851,103,0,,,,,4150,2554,,0,63655,103,,,,,,0,70368,3502 +"2020-05-02","OR",104,,1,,591,591,208,13,,49,55597,2075,,,66923,,23,2579,,69,0,,,,,7226,,,0,74149,3303,,,,,,0,74149,3303 +"2020-05-02","PA",2418,,64,,,,2673,0,,,187071,6594,,,,,571,48305,,1334,0,,,,,,,252932,8987,252932,8987,,,,,235376,7928,,0 +"2020-05-02","PR",95,53,3,,,,187,0,,,9313,0,,,,,,973,973,9,0,784,,,,,,,0,10286,9,,,,,,0,,0 +"2020-05-02","RI",296,,17,,977,977,333,40,,80,53623,1295,,,64706,,54,9522,,189,0,,,,,10752,,73091,3540,73091,3540,,,,,63145,1484,75458,2185 +"2020-05-02","SC",267,,11,,1110,1110,,0,,,55127,2006,,,,,,6489,6489,231,0,,,,,,3622,,0,61616,2237,,,,,,0,59379,0 +"2020-05-02","SD",21,,0,,187,187,71,8,,,15503,665,,,,,,2588,,63,0,,,,,3407,1759,,0,18996,550,,,,,18091,728,18996,550 +"2020-05-02","TN",209,,5,,1125,1125,474,12,,,,0,,,183615,,,12661,12661,770,0,,,,,12661,5718,,0,196276,10144,,,,,,0,196276,10144 +"2020-05-02","TX",847,,31,,,,1725,0,,,,0,,,,,,30522,30522,1293,0,,,,,40528,14891,,0,427179,20131,,,,,,0,427179,20131 +"2020-05-02","UT",49,,3,,418,418,,15,,,116969,5030,,,123224,,,4981,,153,0,,,,,5535,2185,,0,128759,5757,,,,,122065,5239,128759,5757 +"2020-05-02","VA",616,607,35,9,2416,2416,1426,94,,375,,0,,,,,202,17731,16979,830,0,382,14,,,22637,,124968,6613,124968,6613,7065,45,,,,0,,0 +"2020-05-02","VI",4,,0,,,,,0,,,922,111,,,,,,66,,0,0,,,,,,51,,0,988,111,,,,,,0,,0 +"2020-05-02","VT",51,,1,,,,11,0,,,13405,312,,,,,,885,885,6,0,,,,,,,,0,18383,484,,,,,14290,318,18383,484 +"2020-05-02","WA",824,,10,,,,428,0,,117,,0,,,,,,15665,15665,247,0,,,,,,,228003,2704,228003,2704,,,,,212146,2319,,0 +"2020-05-02","WI",334,,7,,1591,1591,352,47,400,119,75570,3004,,,,,,8920,7660,370,0,,,,,,3698,92814,4107,92814,4107,,,,,,0,,0 +"2020-05-02","WV",48,,2,,,,76,0,,29,,0,,,,,15,1169,1169,33,0,,,,,,572,,0,47927,2204,,,,,,0,47927,2204 +"2020-05-02","WY",7,,0,,58,58,13,2,,,9463,327,,,11909,,,579,429,13,0,,,,,493,387,,0,12402,123,,,,,,0,12402,123 +"2020-05-01","AK",9,,0,,39,39,25,1,,,,0,,,,,,364,,9,0,,,,,,254,,0,20325,1206,,,,,,0,20325,1206 +"2020-05-01","AL",279,,10,,1008,1008,495,30,335,,84775,4598,,,,195,,7158,7158,139,0,,,,,,,,0,91933,4737,,,,,91933,4737,,0 +"2020-05-01","AR",64,,3,,414,414,95,12,,,46355,1231,,,,85,23,3321,3321,66,0,,,,,,1973,,0,49676,1297,,,,,,0,49676,1297 +"2020-05-01","AS",0,,0,,,,,0,,,57,54,,,,,,0,0,0,0,,,,,,,,0,57,54,,,,,,0,57,54 +"2020-05-01","AZ",330,,10,,1986,1986,709,49,,311,66917,2779,,,,,187,7962,,314,0,,,,,,,,0,97494,4105,,,,,74879,3093,97494,4105 +"2020-05-01","CA",2073,,91,,,,4706,0,,1434,,0,,,,,,50442,50442,1525,0,,,,,,,,0,654985,29648,,,,,,0,654985,29648 +"2020-05-01","CO",820,,43,,2747,2747,931,50,,,61181,4075,,,,,,15768,14078,484,0,,,,,,,84507,3336,84507,3336,,,,,75259,2869,,0 +"2020-05-01","CT",2339,1924,82,,7758,7758,1592,7758,,,,0,,,76615,,,28764,,1064,0,,,,,34308,4346,,0,111297,3561,,,,,,0,111297,3561 +"2020-05-01","DC",231,,7,,,,,0,,,,0,,,,,,4658,,335,0,,,,,,666,21135,1056,21135,1056,,,,,,0,,0 +"2020-05-01","DE",222,197,12,25,,,281,0,,,17667,581,,,,,,4918,,184,0,,,,,6528,1403,31575,743,31575,743,,,,,,0,,0 +"2020-05-01","FL",1314,,24,,5795,5795,,0,,,367971,19256,,,,,,33506,,977,0,,,,,,,396464,18225,396464,18225,,,,,,0,,0 +"2020-05-01","GA",1154,,34,,5269,5269,1500,113,1215,,,0,,,,,,27270,27270,1115,0,,,,,23434,,,0,166062,4881,,,,,,0,166062,4881 +"2020-05-01","GU",5,,0,,,,,0,,,2859,897,,,,,,146,142,0,0,,,,,,131,,0,3005,897,,,,,,0,,0 +"2020-05-01","HI",16,16,0,,70,70,,1,,,30476,449,,,,,,618,,5,0,,,,,571,526,32373,736,32373,736,,,,,,0,,0 +"2020-05-01","IA",170,,8,,,,345,0,,121,37708,2186,,,,,91,7884,7884,739,0,,,,,,2899,,0,45592,2925,,,,,,0,,0 +"2020-05-01","ID",63,,3,,178,178,28,3,75,,27210,348,,,,,,2015,1860,31,0,,,,,,1175,,0,29070,377,,,,,29070,377,,0 +"2020-05-01","IL",2457,,102,,,,4900,0,,1263,,0,,,,,777,56055,56055,3137,0,,,,,,,,0,284688,14821,,,,,,0,284688,14821 +"2020-05-01","IN",1175,,61,,,,1431,0,,514,81009,3846,,,,,257,18630,,795,0,,,,,19297,,,0,134209,6836,,,,,,0,134209,6836 +"2020-05-01","KS",130,,1,,534,534,,11,206,,28585,1197,,,,96,,4449,,211,0,,,,,,,,0,33034,1408,,,,,,0,,0 +"2020-05-01","KY",240,,5,,1375,1375,330,16,642,178,,0,,,,,,4708,4707,169,0,,,,,,1675,,0,56611,2510,,,,,,0,56611,2510 +"2020-05-01","LA",1927,1740,65,,,,1607,0,,,139540,6232,,,,,230,28711,28711,710,0,,,,,,17303,,0,168251,6942,,,,,,0,,0 +"2020-05-01","MA",3716,,154,,6169,6169,3716,227,,947,225325,11883,,,,,,64311,64311,2106,0,,,,,80037,,,0,371021,17290,,,,,,0,371021,17290 +"2020-05-01","MD",1276,1214,50,62,4718,4718,1668,159,,568,97511,4894,,,,,,23472,23472,1730,0,,,,,27477,1517,,0,123603,5278,,,,,,0,123603,5278 +"2020-05-01","ME",55,,2,,177,177,37,7,,17,,0,,,,,9,1123,1123,28,0,,,,,1384,657,,0,26004,542,,,,,,0,26004,542 +"2020-05-01","MI",4520,4376,86,203,,,2319,0,,966,,0,,,178807,,760,48240,46072,735,0,,,,,53721,8342,,0,232528,10950,,,,,,0,232528,10950 +"2020-05-01","MN",371,,28,,1096,1096,369,52,380,118,77214,3865,,,,,,8736,8736,620,0,,,,,,1911,85950,4485,85950,4485,,,,,,0,,0 +"2020-05-01","MO",337,,8,,,,883,0,,,74590,1465,,1453,79260,,137,7835,7835,273,0,,,70,,9578,,,0,88989,4919,,,1524,,,0,88989,4919 +"2020-05-01","MP",2,,0,,,,,0,,,749,164,,,,,,14,,0,0,,,,,,12,,0,763,164,,,,,,0,,0 +"2020-05-01","MS",281,,20,,1226,1226,651,51,,160,64336,4811,,,,,75,7212,,397,0,,,,,,3413,,0,71548,5208,,,,,,0,,0 +"2020-05-01","MT",16,,0,,61,61,5,0,,,,0,,,,,,453,,0,0,,,,,,397,,0,14203,289,,,,,,0,14203,289 +"2020-05-01","NC",399,,21,,,,547,0,,,,0,,,,,,10923,10923,414,0,,,,,,,,0,145996,6598,,,,,,0,145996,6598 +"2020-05-01","ND",23,,4,,86,86,27,1,,,28418,2025,,,,,,1107,1107,40,0,,,,,,482,31092,2089,31092,2089,,,,,28341,1988,31566,2127 +"2020-05-01","NE",70,,2,,,,,0,,,23104,1567,,,25834,,,4281,,497,0,,,,,4770,,,0,30799,2672,,,,,27577,2079,30799,2672 +"2020-05-01","NH",72,,6,,262,262,112,3,,,19903,36,,,,,,2146,,92,0,,,,,,980,,0,25142,1279,816,,,,,0,25142,1279 +"2020-05-01","NJ",9000,7538,336,1462,,,5972,0,,1724,135355,6089,,,,,1286,121190,121190,2538,0,,,,,,,,0,256545,8627,,,,,256545,8627,,0 +"2020-05-01","NM",131,,8,,587,587,159,51,,,,0,,,,,,3513,,102,0,,,,,,785,,0,71118,3249,,,,,,0,71118,3249 +"2020-05-01","NV",277,,8,,,,,0,,,38368,1380,,,,,,5227,5227,229,0,,,,,,,50472,1544,50472,1544,,,,,,0,53984,2223 +"2020-05-01","NY",18610,,289,,78224,78224,10993,824,,3640,,0,,,,,,308314,,3942,0,,,,,,,927438,26802,927438,26802,,,,,,0,,0 +"2020-05-01","OH",1002,922,27,80,3634,3634,,101,1056,,,0,,,,,,18743,17962,716,0,,,,,19716,,,0,143887,6003,,,,,,0,143887,6003 +"2020-05-01","OK",230,,8,,715,715,255,12,,113,59804,0,,,62714,,,3748,3748,130,0,,,,,4032,2467,,0,63552,130,,,,,,0,66866,3087 +"2020-05-01","OR",103,,2,,578,578,243,9,,65,53522,1496,,,63789,,28,2510,,64,0,,,,,7057,,,0,70846,2793,,,,,,0,70846,2793 +"2020-05-01","PA",2354,,62,,,,2683,0,,,180477,4875,,,,,590,46971,,1208,0,,,,,,,243945,7027,243945,7027,,,,,227448,6083,,0 +"2020-05-01","PR",92,51,0,,,,200,0,,,9313,0,,,,,,964,964,9,0,611,,,,,,,0,10277,9,,,,,,0,,0 +"2020-05-01","RI",279,,13,,937,937,352,41,,76,52328,2228,,,62780,,51,9333,,317,0,,,,,10493,,69551,3201,69551,3201,,,,,61661,2545,73273,3546 +"2020-05-01","SC",256,,12,,1110,1110,,110,,,53121,2704,,,,,,6258,6258,163,0,,,,,,3622,,0,59379,2867,,,,,,0,59379,59379 +"2020-05-01","SD",21,,4,,179,179,69,6,,,14838,259,,,,,,2525,,76,0,,,,,3339,1686,,0,18446,521,,,,,17363,335,18446,521 +"2020-05-01","TN",204,,5,,1113,1113,529,68,,,,0,,,174241,,,11891,11891,1156,0,,,,,11891,5546,,0,186132,8506,,,,,,0,186132,8506 +"2020-05-01","TX",816,,34,,,,1778,0,,,,0,,,,,,29229,29229,1142,0,,,,,39084,14122,,0,407048,20039,,,,,,0,407048,20039 +"2020-05-01","UT",46,,0,,403,403,,13,,,111939,3154,,,117697,,,4828,,156,0,,,,,5305,2062,,0,123002,3763,,,,,116826,3301,123002,3763 +"2020-05-01","VA",581,572,29,9,2322,2322,1431,63,,366,,0,,,,,193,16901,16109,1055,0,303,13,,,21476,,118355,5440,118355,5440,5774,44,,,,0,,0 +"2020-05-01","VI",4,,0,,,,,0,,,811,4,,,,,,66,,0,0,,,,,,51,,0,877,4,,,,,,0,,0 +"2020-05-01","VT",50,,1,,,,19,0,,,13093,524,,,,,,879,879,13,0,,,,,,,,0,17899,1048,,,,,13972,537,17899,1048 +"2020-05-01","WA",814,,13,,,,470,0,,120,,0,,,,,,15418,15418,328,0,,,,,,,225299,5695,225299,5695,,,,,209827,4792,,0 +"2020-05-01","WI",327,,11,,1544,1544,341,32,391,127,72566,3172,,,,,,8550,7314,498,0,,,,,,3352,88707,3806,88707,3806,,,,,,0,,0 +"2020-05-01","WV",46,,5,,,,81,0,,33,,0,,,,,18,1136,1136,18,0,,,,,,555,,0,45723,2066,,,,,,0,45723,2066 +"2020-05-01","WY",7,,0,,56,56,13,0,,,9136,234,,,11792,,,566,420,7,0,,,,,487,373,,0,12279,619,,,,,,0,12279,619 +"2020-04-30","AK",9,,0,,38,38,19,0,,,,0,,,,,,355,,0,0,,,,,,252,,0,19119,0,,,,,,0,19119,0 +"2020-04-30","AL",269,,24,,978,978,479,33,335,,80177,6570,,,,195,,7019,7019,177,0,,,,,,,,0,87196,6747,,,,,87196,6747,,0 +"2020-04-30","AR",61,,2,,402,402,95,13,,,45124,2867,,,,85,23,3255,3255,63,0,,,,,,1305,,0,48379,2930,,,,,,0,48379,2930 +"2020-04-30","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-30","AZ",320,,16,,1937,1937,755,53,,311,64138,2527,,,,,194,7648,,446,0,,,,,,,,0,93389,3842,,,,,71786,2973,93389,3842 +"2020-04-30","CA",1982,,95,,,,4981,0,,1473,,0,,,,,,48917,48917,2417,0,,,,,,,,0,625337,22198,,,,,,0,625337,22198 +"2020-04-30","CO",777,,11,,2697,2697,959,76,,,57106,805,,,,,,15284,13637,526,0,,,,,,,81171,3312,81171,3312,,,,,72390,2941,,0 +"2020-04-30","CT",2257,1862,89,,,,1650,0,,,,0,,,73867,,,27700,,933,0,,,,,33527,,,0,107736,4706,,,,,,0,107736,4706 +"2020-04-30","DC",224,,19,,,,,0,,,,0,,,,,,4323,,217,0,,,,,,660,20079,850,20079,850,,,,,,0,,0 +"2020-04-30","DE",210,185,6,25,,,296,0,,,17086,203,,,,,,4734,,79,0,,,,,6355,1275,30832,848,30832,848,,,,,,0,,0 +"2020-04-30","FL",1290,,50,,5795,5795,,171,,,348715,8420,,,,,,32529,,514,0,,,,,,,378239,9670,378239,9670,,,,,,0,,0 +"2020-04-30","GA",1120,,27,,5156,5156,,100,1171,,,0,,,,,,26155,26155,532,0,,,,,23045,,,0,161181,15956,,,,,,0,161181,15956 +"2020-04-30","GU",5,,0,,,,,0,,,1962,260,,,,,,146,142,1,0,,,,,,131,,0,2108,261,,,,,,0,,0 +"2020-04-30","HI",16,16,0,,69,69,,0,,,30027,1018,,,,,,613,,4,0,,,,,567,516,31637,1324,31637,1324,,,,,,0,,0 +"2020-04-30","IA",162,,14,,,,335,0,,121,35522,1028,,,,,86,7145,7145,302,0,,,,,,2697,,0,42667,1330,,,,,,0,,0 +"2020-04-30","ID",60,,0,,175,175,36,2,74,,26862,432,,,,,,1984,1831,32,0,,,,,,1121,,0,28693,453,,,,,28693,453,,0 +"2020-04-30","IL",2355,,140,,,,4953,0,,1289,,0,,,,,785,52918,52918,2563,0,,,,,,,,0,269867,13200,,,,,,0,269867,13200 +"2020-04-30","IN",1114,,49,,,,1466,0,,549,77163,2795,,,,,275,17835,,653,0,,,,,18597,,,0,127373,6239,,,,,,0,127373,6239 +"2020-04-30","KS",129,,4,,523,523,,8,201,,27388,1668,,,,93,,4238,,500,0,,,,,,,,0,31626,2168,,,,,,0,,0 +"2020-04-30","KY",235,,10,,1359,1359,325,28,636,176,,0,,,,,,4539,4539,164,0,,,,,,1668,,0,54101,1691,,,,,,0,54101,1691 +"2020-04-30","LA",1862,1729,60,,,,1601,0,,,133308,4400,,,,,231,28001,28001,341,0,,,,,,17303,,0,161309,4741,,,,,,0,,0 +"2020-04-30","MA",3562,,157,,5942,5942,3803,184,,1001,213442,8089,,,,,,62205,62205,1940,0,,,,,77305,,,0,353731,16874,,,,,,0,353731,16874 +"2020-04-30","MD",1226,1167,58,59,4559,4559,1711,157,,590,92617,2537,,,,,,21742,21742,893,0,,,,,26198,1432,,0,118325,5433,,,,,,0,118325,5433 +"2020-04-30","ME",53,,1,,170,170,35,4,,18,,0,,,,,8,1095,1095,39,0,,,,,1352,631,,0,25462,611,,,,,,0,25462,611 +"2020-04-30","MI",4434,4317,99,202,,,2319,0,,966,,0,,,168944,,760,47505,45406,1017,0,,,,,52634,8342,,0,221578,11723,,,,,,0,221578,11723 +"2020-04-30","MN",343,,24,,1044,1044,365,94,358,130,73349,3699,,,,,,8116,8116,648,0,,,,,,1829,81465,4347,81465,4347,,,,,,0,,0 +"2020-04-30","MO",329,,11,,,,853,0,,,73125,3391,,988,74728,,141,7562,7562,137,0,,,54,,9201,,,0,84070,4942,,,1043,,,0,84070,4942 +"2020-04-30","MP",2,,0,,,,,0,,,585,375,,,,,,14,,0,0,,,,,,12,,0,599,375,,,,,,0,,0 +"2020-04-30","MS",261,,11,,1175,1175,639,49,,146,59525,0,,,,,72,6815,,246,0,,,,,,3413,,0,66340,246,,,,,,0,,0 +"2020-04-30","MT",16,,0,,61,61,5,0,,,,0,,,,,,453,,2,0,,,,,,392,,0,13914,386,,,,,,0,13914,386 +"2020-04-30","NC",378,,24,,,,546,0,,,,0,,,,,,10509,10509,561,0,,,,,,,,0,139398,5318,,,,,,0,139398,5318 +"2020-04-30","ND",19,,0,,85,85,30,3,,,26393,1890,,,,,,1067,1067,34,0,,,,,,458,29003,2030,29003,2030,,,,,26353,1831,29439,2051 +"2020-04-30","NE",68,,13,,,,,0,,,21537,1280,,,23776,,,3784,,410,0,,,,,4171,,,0,28127,1958,,,,,25498,1700,28127,1958 +"2020-04-30","NH",66,,6,,259,259,107,10,,,19867,1131,,,,,,2054,,44,0,,,,,,980,,0,23863,1605,589,,,,,0,23863,1605 +"2020-04-30","NJ",8664,7228,480,1436,,,6137,0,,1765,129266,4212,,,,,1271,118652,118652,2388,0,,,,,,,,0,247918,6600,,,,,247918,6600,,0 +"2020-04-30","NM",123,,11,,536,536,172,0,,,,0,,,,,,3411,,198,0,,,,,,760,,0,67869,2784,,,,,,0,67869,2784 +"2020-04-30","NV",269,,12,,,,,0,,,36988,858,,,,,,4998,4998,100,0,,,,,,,48928,1574,48928,1574,,,,,,0,51761,1235 +"2020-04-30","NY",18321,,306,,77400,77400,11598,950,,3769,,0,,,,,,304372,,4681,0,,,,,,,900636,28155,900636,28155,,,,,,0,,0 +"2020-04-30","OH",975,898,38,77,3533,3533,,112,1035,,,0,,,,,,18027,17285,724,0,,,,,18996,,,0,137884,5391,,,,,,0,137884,5391 +"2020-04-30","OK",222,,8,,703,703,291,10,,127,59804,2010,,,59804,,,3618,3618,145,0,,,,,3859,2401,,0,63422,2155,,,,,,0,63779,2160 +"2020-04-30","OR",101,,9,,569,569,227,15,,56,52026,3182,,,61171,,24,2446,,92,0,,,,,6882,,,0,68053,3635,,,,,,0,68053,3635 +"2020-04-30","PA",2292,,97,,,,2707,0,,,175602,5085,,,,,556,45763,,1397,0,,,,,,,236918,7716,236918,7716,,,,,221365,6482,,0 +"2020-04-30","PR",92,51,6,,,,201,0,,,9313,0,,,,,,955,955,51,0,584,,,,,,,0,10268,51,,,,,,0,,0 +"2020-04-30","RI",266,,15,,896,896,339,146,,85,50100,1957,,,59691,,54,9016,,348,0,,,,,10036,,66350,3819,66350,3819,,,,,59116,2305,69727,3204 +"2020-04-30","SC",244,,41,,1000,1000,,0,,,50417,2081,,,,,,6095,6095,214,0,,,,,,3252,,0,56512,2295,,,,,,0,,0 +"2020-04-30","SD",17,,4,,173,173,76,8,,,14579,119,,,,,,2449,,76,0,,,,,3277,1573,,0,17925,504,,,,,17028,195,17925,504 +"2020-04-30","TN",199,,4,,1045,1045,605,32,,,,0,,,166891,,,10735,10366,369,0,,,,,10735,5338,,0,177626,9077,,,,,,0,177626,9077 +"2020-04-30","TX",782,,50,,,,1686,0,,,,0,,,,,,28087,28087,1033,0,,,,,37630,13353,,0,387009,19888,,,,,,0,387009,19888 +"2020-04-30","UT",46,,1,,390,390,,7,,,108785,3535,,,114113,,,4672,,177,0,,,,,5126,1939,,0,119239,4049,,,,,113525,3672,119239,4049 +"2020-04-30","VA",552,543,30,9,2259,2259,1550,94,,372,,0,,,,,208,15846,15180,885,0,219,11,,,20578,,112915,6644,112915,6644,4308,42,,,,0,,0 +"2020-04-30","VI",4,,0,,,,,0,,,807,75,,,,,,66,,4,0,,,,,,51,,0,873,79,,,,,,0,,0 +"2020-04-30","VT",49,,2,,,,23,0,,,12569,194,,,,,,866,866,4,0,,,,,,,,0,16851,256,,,,,13435,198,16851,256 +"2020-04-30","WA",801,,15,,,,474,0,,145,,0,,,,,,15090,15090,295,0,,,,,,,219604,5526,219604,5526,,,,,205035,4882,,0 +"2020-04-30","WI",316,,8,,1512,1512,359,23,382,119,69394,2764,,,,,,8052,6854,392,0,,,,,,3352,84901,4245,84901,4245,,,,,,0,,0 +"2020-04-30","WV",41,,3,,,,84,0,,38,,0,,,,,20,1118,1118,23,0,,,,,,545,,0,43657,2370,,,,,,0,43657,2370 +"2020-04-30","WY",7,,0,,56,56,13,0,,,8902,221,,,11189,,,559,415,15,0,,,,,471,371,,0,11660,434,,,,,,0,11660,434 +"2020-04-29","AK",9,,0,,38,38,14,0,,,,0,,,,,,355,,4,0,,,,,,240,,0,19119,2030,,,,,,0,19119,2030 +"2020-04-29","AL",245,,3,,945,945,498,34,335,,73607,4467,,,,195,,6842,6842,155,0,,,,,,,,0,80449,4622,,,,,80449,4622,,0 +"2020-04-29","AR",59,,7,,389,389,93,98,,,42257,4697,,,,82,18,3192,3192,81,0,,,,,,1249,,0,45449,4778,,,,,,0,45449,4778 +"2020-04-29","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-29","AZ",304,,11,,1884,1884,756,60,,312,61611,1121,,,,,191,7202,,254,0,,,,,,,,0,89547,4060,,,,,68813,1375,89547,4060 +"2020-04-29","CA",1887,,78,,,,5011,0,,1512,,0,,,,,,46500,46500,1469,0,,,,,,,,0,603139,25531,,,,,,0,603139,25531 +"2020-04-29","CO",766,,30,,2621,2621,966,50,,,56301,1587,,,,,,14758,13148,442,0,,,,,,,77859,2754,77859,2754,,,,,69449,2355,,0 +"2020-04-29","CT",2168,1764,79,,,,1691,0,,,,0,,,70195,,,26767,,455,0,,,,,32538,,,0,103030,3849,,,,,,0,103030,3849 +"2020-04-29","DC",205,,15,,,,,0,,,,0,,,,,,4106,,112,0,,,,,,660,19229,344,19229,344,,,,,,0,,0 +"2020-04-29","DE",204,179,12,25,,,326,0,,,16883,278,,,,,,4655,,80,0,,,,,6152,1173,29984,831,29984,831,,,,,,0,,0 +"2020-04-29","FL",1240,,86,,5624,5624,,358,,,340295,6266,,,,,,32015,,343,0,,,,,,,368569,7013,368569,7013,,,,,,0,,0 +"2020-04-29","GA",1093,,67,,5056,5056,,242,1148,,,0,,,,,,25623,25411,1008,0,,,,,21502,,,0,145225,5311,,,,,,0,145225,5311 +"2020-04-29","GU",5,,0,,,,,0,,,1702,164,,,,,,145,141,1,0,,,,,,130,,0,1847,165,,,,,,0,,0 +"2020-04-29","HI",16,16,0,,69,69,,1,,,29009,433,,,27632,,,609,,2,0,,,,,562,505,30313,306,30313,306,,,,,,0,,0 +"2020-04-29","IA",148,,12,,,,323,0,,100,34494,1047,,,,,74,6843,6843,467,0,,,,,,2428,,0,41337,1514,,,,,,0,,0 +"2020-04-29","ID",60,,2,,173,173,39,1,73,,26430,8295,,,,,,1952,1810,35,0,,,,,,1087,,0,28240,8188,,,,,28240,8188,,0 +"2020-04-29","IL",2215,,90,,,,5036,0,,1290,,0,,,,,777,50355,50355,2253,0,,,,,,,,0,256667,14478,,,,,,0,256667,14478 +"2020-04-29","IN",1065,,164,,,,1484,0,,570,74368,3775,,,,,262,17182,,594,0,,,,,17875,,,0,121134,6039,,,,,,0,121134,6039 +"2020-04-29","KS",125,,1,,515,515,,11,198,,25720,1121,,,,88,,3738,,247,0,,,,,,,,0,29458,1368,,,,,,0,,0 +"2020-04-29","KY",225,,12,,1331,1331,320,50,625,170,,0,,,,,,4375,4374,229,0,,,,,,1617,,0,52410,3612,,,,,,0,52410,3612 +"2020-04-29","LA",1802,1703,44,,,,1629,0,,,128908,5086,,,,,244,27660,27660,374,0,,,,,,17303,,0,156568,5460,,,,,,0,,0 +"2020-04-29","MA",3405,,252,,5758,5758,3856,243,,1011,205353,9155,,,,,,60265,60265,1963,0,,,,,74600,,,0,336857,15514,,,,,,0,336857,15514 +"2020-04-29","MD",1168,1110,69,58,4402,4402,1610,134,,586,90080,2408,,,,,,20849,20849,736,0,,,,,24841,1361,,0,112892,3055,,,,,,0,112892,3055 +"2020-04-29","ME",52,,1,,166,166,32,3,,17,,0,,,,,7,1056,1056,16,0,,,,,1323,615,,0,24851,602,,,,,,0,24851,602 +"2020-04-29","MI",4335,4232,88,199,,,2498,0,,997,,0,,,158373,,778,46488,44508,950,0,,,,,51482,8342,,0,209855,10649,,,,,,0,209855,10649 +"2020-04-29","MN",319,,18,,950,950,320,38,337,119,69650,6402,,,,,,7468,7468,680,0,,,,,,1724,77118,7082,77118,7082,,,,,,0,,0 +"2020-04-29","MO",318,,4,,,,891,0,,,69734,3534,,640,70219,,125,7425,7425,122,0,,,37,,8781,,,0,79128,3979,,,678,,,0,79128,3979 +"2020-04-29","MP",2,,0,,,,,0,,,210,159,,,,,,14,,0,0,,,,,,12,,0,224,159,,,,,,0,,0 +"2020-04-29","MS",250,,11,,1126,1126,677,38,,151,59525,1455,,,,,69,6569,,227,0,,,,,,3413,,0,66094,1682,,,,,,0,,0 +"2020-04-29","MT",16,,1,,61,61,5,0,,,,0,,,,,,451,,0,0,,,,,,382,,0,13528,337,,,,,,0,13528,337 +"2020-04-29","NC",354,,12,,,,551,0,,,,0,,,,,,9948,9948,380,0,,,,,,,,0,134080,3751,,,,,,0,134080,3751 +"2020-04-29","ND",19,,0,,82,82,28,3,,,24503,1771,,,,,,1033,1033,42,0,,,,,,437,26973,2044,26973,2044,,,,,24522,1754,27388,2072 +"2020-04-29","NE",55,,0,,,,,0,,,20257,10,,,22301,,,3374,,16,0,,,,,3704,,,0,26169,18,,,,,23798,26,26169,18 +"2020-04-29","NH",60,,0,,249,249,106,3,,,18736,529,,,,,,2010,,72,0,,,,,,936,,0,22258,582,407,,,,,0,22258,582 +"2020-04-29","NJ",8184,6770,349,1414,,,6289,0,,1811,125054,4551,,,,,1327,116264,116264,2408,0,,,,,,,,0,241318,6959,,,,,241318,6959,,0 +"2020-04-29","NM",112,,2,,536,536,163,27,,,,0,,,,,,3213,,239,0,,,,,,734,,0,65085,3340,,,,,,0,65085,3340 +"2020-04-29","NV",257,,6,,,,,0,,,36130,816,,,,,,4898,4898,93,0,,,,,,,47354,1265,47354,1265,,,,,,0,50526,1051 +"2020-04-29","NY",18015,,377,,76450,76450,12159,1088,,3923,,0,,,,,,299691,,4585,0,,,,,,,872481,27487,872481,27487,,,,,,0,,0 +"2020-04-29","OH",937,856,138,81,3421,3421,,81,1014,,,0,,,,,,17303,16601,534,0,,,,,18400,,,0,132493,5097,,,,,,0,132493,5097 +"2020-04-29","OK",214,,7,,693,693,283,37,,126,57794,1505,,,57794,,,3473,3473,63,0,,,,,3717,2319,,0,61267,1568,,,,,,0,61619,61619 +"2020-04-29","OR",92,,0,,554,554,249,0,,71,48844,0,,,57707,,31,2354,,0,0,,,,,6711,,,0,64418,2629,,,,,,0,64418,2629 +"2020-04-29","PA",2195,,479,,,,2781,0,,,170517,4693,,,,,602,44366,,1102,0,,,,,,,229202,6336,229202,6336,,,,,214883,5795,,0 +"2020-04-29","PR",86,51,0,,,,125,0,,,9313,0,,,,,,904,904,6,0,529,,,,,,,0,10217,6,,,,,,0,,0 +"2020-04-29","RI",251,,12,,750,750,269,18,,80,48143,2454,,,56919,,55,8668,,372,0,,,,,9604,,62531,2673,62531,2673,,,,,56811,2826,66523,3827 +"2020-04-29","SC",203,,26,,1000,1000,,56,,,48336,1804,,,,,,5881,5881,268,0,,,,,,3252,,0,54217,2072,,,,,,0,,0 +"2020-04-29","SD",13,,2,,165,165,69,8,,,14460,161,,,,,,2373,,60,0,,,,,3195,1492,,0,17421,299,,,,,16833,221,17421,299 +"2020-04-29","TN",195,,7,,1013,1013,614,119,,,,0,,,158183,,,10366,10366,314,0,,,,,10366,5140,,0,168549,6621,,,,,,0,168549,6621 +"2020-04-29","TX",732,,42,,,,1702,0,,,,0,,,,,,27054,27054,883,0,,,,,36080,12507,,0,367121,17392,,,,,,0,367121,17392 +"2020-04-29","UT",45,,0,,383,383,,13,,,105250,4040,,,110215,,,4495,,152,0,,,,,4975,1790,,0,115190,4750,,,,,109853,4213,115190,4750 +"2020-04-29","VA",522,513,30,9,2165,2165,1566,99,,387,,0,,,,,222,14961,14328,622,0,187,10,,,19344,,106271,4089,106271,4089,3302,28,,,,0,,0 +"2020-04-29","VI",4,,0,,,,,0,,,732,13,,,,,,62,,3,0,,,,,,51,,0,794,16,,,,,,0,,0 +"2020-04-29","VT",47,,0,,,,26,0,,,12375,114,,,,,,862,862,0,0,,,,,,,,0,16595,165,,,,,13237,114,16595,165 +"2020-04-29","WA",786,,21,,,,490,0,,156,,0,,,,,,14795,14795,370,0,,,,,,,214078,5696,214078,5696,,,,,200153,4923,,0 +"2020-04-29","WI",308,,8,,1489,1489,350,33,363,121,66630,3095,,,,,,7660,6520,269,0,,,,,,,80656,3676,80656,3676,,,,,,0,,0 +"2020-04-29","WV",38,,1,,,,102,0,,40,,0,,,,,21,1095,1095,16,0,,,,,,504,,0,41287,1832,,,,,,0,41287,1832 +"2020-04-29","WY",7,,0,,56,56,12,0,,,8681,455,,,10766,,,544,404,8,0,,,,,460,362,,0,11226,444,,,,,,0,11226,444 +"2020-04-28","AK",9,,0,,38,38,16,1,,,,0,,,,,,351,,6,0,,,,,,228,,0,17089,833,,,,,,0,17089,833 +"2020-04-28","AL",242,,20,,911,911,530,39,335,,69140,1642,,,,195,,6687,6687,188,0,,,,,,,,0,75827,1830,,,,,75827,1830,,0 +"2020-04-28","AR",52,,2,,291,291,104,0,,,37560,120,,,,57,20,3111,3111,94,0,,,,,,1146,,0,40671,214,,,,,,0,40671,214 +"2020-04-28","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-28","AZ",293,,18,,1824,1824,737,52,,303,60490,663,,,,,193,6948,,232,0,,,,,,,,0,85487,3535,,,,,67438,895,85487,3535 +"2020-04-28","CA",1809,,54,,,,4983,0,,1485,,0,,,,,,45031,,1567,0,,,,,,,,0,577608,24199,,,,,,0,577608,24199 +"2020-04-28","CO",736,,30,,2571,2571,964,86,,,54714,2252,,,,,,14316,12741,437,0,,,,,,,75105,2702,75105,2702,,,,,67094,753,,0 +"2020-04-28","CT",2089,1639,91,,,,1732,0,,,,0,,,67264,,,26312,,1043,0,,,,,31659,,,0,99181,4402,,,,,,0,99181,4402 +"2020-04-28","DC",190,,5,,,,,0,,,,0,,,,,,3994,,102,0,,,,,,660,18885,469,18885,469,,,,,,0,,0 +"2020-04-28","DE",192,170,11,22,,,337,0,,,16605,1151,,,,,,4575,,413,0,,,,,5997,1096,29153,730,29153,730,,,,,,0,,0 +"2020-04-28","FL",1154,,53,,5266,5266,,55,,,334029,9704,,,,,,31672,,748,0,,,,,,,361556,11763,361556,11763,,,,,,0,,0 +"2020-04-28","GA",1026,,55,,4814,4814,,133,1087,,,0,,,,,,24615,,702,0,,,,,20950,,,0,139914,3735,,,,,,0,139914,3735 +"2020-04-28","GU",5,,0,,,,3,0,,,1538,114,,,,,,144,140,2,0,,,,,,129,,0,1682,116,,,,,,0,,0 +"2020-04-28","HI",16,16,2,,68,68,,0,,,28576,172,,,,,,607,,1,0,,,,,558,493,30007,249,30007,249,,,,,,0,,0 +"2020-04-28","IA",136,,9,,,,304,0,,98,33447,1165,,,,,64,6376,6376,508,0,,,,,,2164,,0,39823,1673,,,,,,0,,0 +"2020-04-28","ID",58,,2,,172,172,41,3,73,,18135,8,,,,,,1917,,20,0,,,,,,1039,,0,20052,28,,,,,20052,28,,0 +"2020-04-28","IL",2125,,142,,,,4738,0,,1245,,0,,,,,778,48102,,2219,0,,,,,,,,0,242189,14561,,,,,,0,242189,14561 +"2020-04-28","IN",901,,57,,,,1518,0,,546,70593,2078,,,,,275,16588,,627,0,,,,,17109,,,0,115095,5640,,,,,,0,115095,5640 +"2020-04-28","KS",124,,4,,504,504,,8,,,24599,760,,,,,,3491,,163,0,,,,,,,,0,28090,923,,,,,,0,,0 +"2020-04-28","KY",213,,5,,1281,1281,313,7,612,165,,0,,,,,,4146,4145,72,0,,,,,,1521,,0,48798,324,,,,,,0,48798,324 +"2020-04-28","LA",1758,1660,61,,,,1666,0,,,123822,3901,,,,,244,27286,27286,218,0,,,,,,17303,,0,151108,4119,,,,,,0,,0 +"2020-04-28","MA",3153,,150,,5515,5515,3875,278,,1005,196198,7773,,,,,,58302,,1840,0,,,,,71775,,,0,321343,15275,,,,,,0,321343,15275 +"2020-04-28","MD",1099,1042,54,57,4268,4268,1528,167,,551,87672,2183,,,,,,20113,20113,626,0,,,,,24059,1295,,0,109837,2827,,,,,,0,109837,2827 +"2020-04-28","ME",51,,0,,163,163,33,2,,17,,0,,,,,7,1040,1040,17,0,,,,,1283,585,,0,24249,459,,,,,,0,24249,459 +"2020-04-28","MI",4247,4136,99,198,,,2623,0,,1027,,0,,,148910,,801,45538,43634,829,0,,,,,50296,8342,,0,199206,9050,,,,,,0,199206,9050 +"2020-04-28","MN",301,,15,,912,912,314,51,324,120,63248,2745,,,,,,6788,6788,601,0,,,,,,1611,70036,3346,70036,3346,,,,,,0,,0 +"2020-04-28","MO",314,,26,,,,655,0,,,66200,2265,,631,66603,,105,7303,7303,132,0,,,35,,8424,,,0,75149,1136,,,667,,,0,75149,1136 +"2020-04-28","MP",2,,0,,,,,0,,,51,0,,,,,,14,,0,0,,,,,,12,,0,65,0,,,,,,0,,0 +"2020-04-28","MS",239,,10,,1088,1088,639,28,,162,58070,702,,,,,77,6342,,248,0,,,,,,,,0,64412,950,,,,,,0,,0 +"2020-04-28","MT",15,,1,,61,61,10,0,,,,0,,,,,,451,,2,0,,,,,,356,,0,13191,158,,,,,,0,13191,158 +"2020-04-28","NC",342,,36,,,,463,0,,,,0,,,,,,9568,,426,0,,,,,,,,0,130329,2134,,,,,,0,130329,2134 +"2020-04-28","ND",19,,0,,79,79,25,2,,,22732,1240,,,,,,991,991,49,0,,,,,,409,24929,1454,24929,1454,,,,,22768,1271,25316,1485 +"2020-04-28","NE",55,,-1,,,,,0,,,20247,912,,,22295,,,3358,,330,0,,,,,3692,,,0,26151,1249,,,,,23772,1247,26151,1249 +"2020-04-28","NH",60,,0,,246,246,99,4,,,18207,347,,,,,,1938,,74,0,,,,,,798,,0,21676,647,296,,,,,0,21676,647 +"2020-04-28","NJ",7835,6442,428,1393,,,6476,0,,1809,120503,3916,,,,,1262,113856,113856,2668,0,,,,,,,,0,234359,6584,,,,,234359,6584,,0 +"2020-04-28","NM",110,,6,,509,509,157,28,,,,0,,,,,,2974,,151,0,,,,,,705,,0,61745,2942,,,,,,0,61745,2942 +"2020-04-28","NV",251,,6,,,,,0,,,35314,1191,,,,,,4805,4805,115,0,,,,,,,46089,1482,46089,1482,,,,,,0,49475,1654 +"2020-04-28","NY",17638,,335,,75362,75362,12646,760,,4071,,0,,,,,,295106,,3110,0,,,,,,,844994,18899,844994,18899,,,,,,0,,0 +"2020-04-28","OH",799,757,46,42,3340,3340,,108,1004,,,0,,,,,,16769,16128,444,0,,,,,17859,,,0,127396,3519,,,,,,0,127396,3519 +"2020-04-28","OK",207,,10,,656,656,288,0,,118,56289,6398,,,,,,3410,3410,130,0,,,,,,2260,,0,59699,6528,,,,,,0,,0 +"2020-04-28","OR",92,,1,,554,554,249,8,,71,48844,2191,,,55124,,31,2354,,43,0,,,,,6665,,,0,61789,2987,,,,,,0,61789,2987 +"2020-04-28","PA",1716,,119,,,,2781,0,,,165824,4452,,,,,616,43264,,1214,0,,,,,,,222866,6568,222866,6568,,,,,209088,5666,,0 +"2020-04-28","PR",86,,2,,,,132,0,,,9313,0,,,,,,898,898,3,0,502,,,,,,,0,10211,3,,,,,,0,,0 +"2020-04-28","RI",239,,6,,732,732,266,14,,84,45689,1774,,,53568,,55,8296,,324,0,,,,,9128,,59858,1869,59858,1869,,,,,53985,2098,62696,2679 +"2020-04-28","SC",177,,3,,944,944,,0,,,46532,1261,,,,,,5613,5613,123,0,,,,,,2830,,0,52145,1384,,,,,,0,,0 +"2020-04-28","SD",11,,0,,157,157,69,7,,,14299,169,,,,,,2313,,68,0,,,,,3134,1392,,0,17122,248,,,,,16612,237,17122,248 +"2020-04-28","TN",188,,4,,894,894,611,57,,,,0,,,151876,,,10052,,134,0,,,,,10052,4921,,0,161928,7526,,,,,,0,161928,7526 +"2020-04-28","TX",690,,27,,,,1682,0,,,,0,,,,,,26171,26171,874,0,,,,,34662,11786,,0,349729,17581,,,,,,0,349729,17581 +"2020-04-28","UT",45,,4,,370,370,,21,,,101210,3300,,,105647,,,4343,,110,0,,,,,4793,1704,,0,110440,3703,,,,,105640,3430,110440,3703 +"2020-04-28","VA",492,487,34,5,2066,2066,1508,52,,376,,0,,,,,217,14339,13794,804,0,152,9,,,18567,,102182,3254,102182,3254,2539,27,,,,0,,0 +"2020-04-28","VI",4,,0,,,,,0,,,719,3,,,,,,59,,0,0,,,,,,51,,0,778,3,,,,,,0,,0 +"2020-04-28","VT",47,,0,,,,29,0,,,12261,115,,,,,,862,862,7,0,,,,,,,,0,16430,293,,,,,13123,122,16430,293 +"2020-04-28","WA",765,,16,,,,436,0,,158,,0,,,,,,14425,14425,114,0,,,,,,,208382,5968,208382,5968,,,,,195230,5347,,0 +"2020-04-28","WI",300,,19,,1456,1456,351,41,363,123,63535,2224,,,,,,7391,6289,230,0,,,,,,,76980,3105,76980,3105,,,,,,0,,0 +"2020-04-28","WV",37,,1,,,,87,0,,28,,0,,,,,15,1079,1079,16,0,,,,,,481,,0,39455,818,,,,,,0,39455,818 +"2020-04-28","WY",7,,0,,56,56,16,2,,,8226,429,,,10329,,,536,396,16,0,,,,,453,343,,0,10782,671,,,,,,0,10782,671 +"2020-04-27","AK",9,,0,,37,37,10,0,,,,0,,,,,,345,,4,0,,,,,,218,,0,16256,79,,,,,,0,16256,79 +"2020-04-27","AL",222,,6,,872,872,426,27,335,,67498,217,,,,195,,6499,6499,229,0,,,,,,,,0,73997,446,,,,,73997,446,,0 +"2020-04-27","AR",50,,1,,291,291,109,0,,,37440,912,,,,57,25,3017,3017,76,0,,,,,,987,,0,40457,988,,,,,,0,40457,988 +"2020-04-27","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-27","AZ",275,,0,,1772,1772,647,56,,328,59827,1542,,,,,200,6716,,190,0,,,,,,,,0,81952,892,,,,,66543,1732,81952,892 +"2020-04-27","CA",1755,,45,,,,4878,0,,1499,,0,,,,,,43464,,1300,0,,,,,,,,0,553409,27325,,,,,,0,553409,27325 +"2020-04-27","CO",706,,26,,2485,2485,994,47,,,52462,2629,,,,,,13879,12374,438,0,,,,,,,72403,2659,72403,2659,,,,,66341,3067,,0 +"2020-04-27","CT",1998,1544,74,,,,1758,0,,,,0,,,63926,,,25269,,0,0,,,,,30635,,,0,94779,1890,,,,,,0,94779,1890 +"2020-04-27","DC",185,,7,,,,402,0,,,,0,,,,,,3892,,51,0,,,,,,659,18416,348,18416,348,,,,,,0,,0 +"2020-04-27","DE",181,159,13,22,,,325,0,,,15454,239,,,,,,4162,,128,0,,,,,5780,996,28423,1048,28423,1048,,,,,,0,,0 +"2020-04-27","FL",1101,,7,,5211,5211,,56,,,324325,11240,,,,,,30924,,519,0,,,,,,,349793,8877,349793,8877,,,,,,0,,0 +"2020-04-27","GA",971,,59,,4681,4681,,322,1057,,,0,,,,,,23913,,512,0,,,,,20557,,,0,136179,11750,,,,,,0,136179,11750 +"2020-04-27","GU",5,,0,,,,3,0,,,1424,37,,,,,,142,138,1,0,,,,,,128,,0,1566,38,,,,,,0,,0 +"2020-04-27","HI",14,14,0,,68,68,,0,,,28404,524,,,,,,606,,3,0,,,,,557,488,29758,576,29758,576,,,,,,0,,0 +"2020-04-27","IA",127,,9,,,,300,0,,100,32282,1668,,,,,58,5868,5868,392,0,,,,,,2021,,0,38150,2060,,,,,,0,,0 +"2020-04-27","ID",56,,0,,169,169,36,0,71,,18127,516,,,,,,1897,,10,0,,,,,,983,,0,20024,526,,,,,20024,526,,0 +"2020-04-27","IL",1983,,50,,,,4672,0,,1249,,0,,,,,763,45883,,1980,0,,,,,,,,0,227628,12676,,,,,,0,227628,12676 +"2020-04-27","IN",844,,31,,,,1493,0,,581,68515,1819,,,,,284,15961,,949,0,,,,,16407,,,0,109455,2287,,,,,,0,109455,2287 +"2020-04-27","KS",120,,2,,496,496,,11,,,23839,786,,,,,,3328,,154,0,,,,,,,,0,27167,940,,,,,,0,,0 +"2020-04-27","KY",208,,3,,1274,1274,308,8,608,166,,0,,,,,,4074,,169,0,,,,,,1511,,0,48474,1916,,,,,,0,48474,1916 +"2020-04-27","LA",1697,1599,27,,,,1683,0,,,119921,3658,,,,,262,27068,27068,295,0,,,,,,17303,,0,146989,3953,,,,,,0,,0 +"2020-04-27","MA",3003,,104,,5237,5237,3892,133,,1089,188425,7263,,,,,,56462,,1524,0,,,,,69008,,,0,306068,13795,,,,,,0,306068,13795 +"2020-04-27","MD",1045,990,44,55,4101,4101,1513,139,,535,85489,7405,,,,,,19487,19487,906,0,,,,,23404,1263,,0,107010,4033,,,,,,0,107010,4033 +"2020-04-27","ME",51,,1,,161,161,39,2,,16,,0,,,,,7,1023,1023,8,0,,,,,1264,549,,0,23790,421,,,,,,0,23790,421 +"2020-04-27","MI",4148,4049,112,191,,,2667,0,,1059,,0,,,140972,,832,44709,42885,920,0,,,,,49184,8342,,0,190156,7399,,,,,,0,190156,7399 +"2020-04-27","MN",286,,14,,861,861,292,32,316,122,60503,1342,,,,,,6187,6187,675,0,,,,,,1556,66690,2017,66690,2017,,,,,,0,,0 +"2020-04-27","MO",288,,14,,,,679,0,,,63935,1184,,611,65566,,109,7171,7171,174,0,,,35,,8326,,,0,74013,1298,,,647,,,0,74013,1298 +"2020-04-27","MP",2,,0,,,,,0,,,51,0,,,,,,14,,0,0,,,,,,11,,0,65,0,,,,,,0,,0 +"2020-04-27","MS",229,,2,,1060,1060,590,59,,142,57368,2491,,,,,71,6094,,183,0,,,,,,,,0,63462,2674,,,,,,0,,0 +"2020-04-27","MT",14,,0,,61,61,11,0,,,,0,,,,,,449,,1,0,,,,,,352,,0,13033,171,,,,,,0,13033,171 +"2020-04-27","NC",306,,7,,,,473,0,,,,0,,,,,,9142,,312,0,,,,,,,,0,128195,2985,,,,,,0,128195,2985 +"2020-04-27","ND",19,,2,,77,77,23,6,,,21492,1642,,,,,,942,942,75,0,,,,,,350,23475,1994,23475,1994,,,,,21497,1869,23831,2034 +"2020-04-27","NE",56,,3,,,,,0,,,19335,839,,,21377,,,3028,,296,0,,,,,3364,,,0,24902,1281,,,,,22525,1148,24902,1281 +"2020-04-27","NH",60,,0,,242,242,101,4,,,17860,896,,,,,,1864,,77,0,,,,,,779,,0,21029,631,234,,,,,0,21029,631 +"2020-04-27","NJ",7407,6044,139,1363,,,6407,0,,1801,116587,2481,,,,,1303,111188,111188,2150,0,,,,,,,,0,227775,4631,,,,,227775,4631,,0 +"2020-04-27","NM",104,,5,,481,481,155,69,,,,0,,,,,,2823,,97,0,,,,,,666,,0,58803,2188,,,,,,0,58803,2188 +"2020-04-27","NV",245,,10,,,,,0,,,34123,539,,,,,,4690,4690,88,0,,,,,,,44607,499,44607,499,,,,,,0,47821,856 +"2020-04-27","NY",17303,,337,,74602,74602,12819,1062,,4157,,0,,,,,,291996,,3951,0,,,,,,,826095,20745,826095,20745,,,,,,0,,0 +"2020-04-27","OH",753,712,25,41,3232,3232,,54,978,,,0,,,,,,16325,15699,362,0,,,,,17454,,,0,123877,4197,,,,,,0,123877,4197 +"2020-04-27","OK",197,,2,,656,656,306,3,,150,49891,0,,,,,,3280,3280,27,0,,,,,,2167,,0,53171,27,,,,,,0,,0 +"2020-04-27","OR",91,,4,,546,546,249,10,,71,46653,1529,,,52291,,31,2311,,58,0,,,,,6511,,,0,58802,2308,,,,,,0,58802,2308 +"2020-04-27","PA",1597,,47,,,,2800,0,,,161372,3944,,,,,629,42050,,885,0,,,,,,,216298,5454,216298,5454,,,,,203422,4829,,0 +"2020-04-27","PR",84,,0,,,,140,0,,,9313,0,,,,,,895,895,4,0,494,,,,,,,0,10208,4,,,,,,0,,0 +"2020-04-27","RI",233,,7,,718,718,266,27,,81,43915,1169,,,51300,,56,7972,,203,0,,,,,8717,,57989,2625,57989,2625,,,,,51887,1372,60017,1874 +"2020-04-27","SC",174,,0,,944,944,,0,,,45271,0,,,,,,5490,5490,0,0,,,,,,3701,,0,50761,0,,,,,,0,,0 +"2020-04-27","SD",11,,0,,150,150,61,15,,,14130,68,,,,,,2245,,33,0,,,,,3091,1316,,0,16874,525,,,,,16375,101,16874,525 +"2020-04-27","TN",184,,3,,837,837,618,9,,,,0,,,144484,,,9918,,251,0,,,,,9918,4720,,0,154402,6928,,,,,,0,154402,6928 +"2020-04-27","TX",663,,15,,,,1563,0,,,,0,,,,,,25297,25297,666,0,,,,,33166,11170,,0,332148,5635,,,,,,0,332148,5635 +"2020-04-27","UT",41,,0,,349,349,,4,,,97910,2073,,,102094,,,4233,,110,0,,,,,4643,1641,,0,106737,2337,,,,,102210,2153,106737,2337 +"2020-04-27","VA",458,454,10,4,2014,2014,1455,72,,389,,0,,,,,217,13535,13036,565,0,138,9,,,17974,,98928,3742,98928,3742,2134,27,,,,0,,0 +"2020-04-27","VI",4,,0,,,,,0,,,716,16,,,,,,59,,2,0,,,,,,51,,0,775,18,,,,,,0,,0 +"2020-04-27","VT",47,,1,,,,33,0,,,12146,221,,,,,,855,855,3,0,,,,,,,,0,16137,571,,,,,13001,224,16137,571 +"2020-04-27","WA",749,,11,,,,536,0,,115,,0,,,,,,14311,14311,166,0,,,,,,,202414,5797,202414,5797,,,,,189883,5117,,0 +"2020-04-27","WI",281,,9,,1415,1415,335,18,355,124,61311,2076,,,,,,7161,6081,198,0,,,,,,,73875,2248,73875,2248,,,,,,0,,0 +"2020-04-27","WV",36,,2,,,,100,0,,38,,0,,,,,20,1063,1063,19,0,,,,,,455,,0,38637,3506,,,,,,0,38637,3506 +"2020-04-27","WY",7,,0,,54,54,16,0,,,7797,0,,,9670,,,520,389,18,0,,,,,441,342,,0,10111,581,,,,,,0,10111,581 +"2020-04-26","AK",9,,0,,37,37,14,0,,,,0,,,,,,341,,2,0,,,,,,217,,0,16177,445,,,,,,0,16177,445 +"2020-04-26","AL",216,,4,,845,845,384,6,288,,67281,2074,,,,170,,6270,6270,133,0,,,,,,,,0,73551,2207,,,,,73551,2207,,0 +"2020-04-26","AR",49,,2,,291,291,104,0,,,36528,1304,,,,57,25,2941,2941,112,0,,,,,,985,,0,39469,1416,,,,,,0,39469,1416 +"2020-04-26","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-26","AZ",275,,9,,1716,1716,671,44,,308,58285,2057,,,,,200,6526,,246,0,,,,,,,,0,81060,1163,,,,,64811,2303,81060,1163 +"2020-04-26","CA",1710,,59,,,,4928,0,,1473,,0,,,,,,42164,,1027,0,,,,,,,,0,526084,20049,,,,,,0,526084,20049 +"2020-04-26","CO",680,,8,,2438,2438,1007,28,,,49833,3010,,,,,,13441,11980,473,0,,,,,,,69744,3237,69744,3237,,,,,63274,3483,,0 +"2020-04-26","CT",1924,1423,62,,,,1766,0,,,,0,,,62460,,,25269,,687,0,,,,,30218,,,0,92889,2481,,,,,,0,92889,2481 +"2020-04-26","DC",178,,13,,,,402,0,,120,,0,,,,,69,3841,,142,0,,,,,,657,18068,766,18068,766,,,,,,0,,0 +"2020-04-26","DE",168,147,13,21,,,317,0,,,15215,1093,,,,,,4034,,458,0,,,,,5464,911,27375,1266,27375,1266,,,,,,0,,0 +"2020-04-26","FL",1094,,19,,5155,5155,,110,,,313085,10825,,,,,,30405,,795,0,,,,,,,340916,16900,340916,16900,,,,,,0,,0 +"2020-04-26","GA",912,,8,,4359,4359,,33,,,,0,,,,,,23401,,706,0,,,,,19108,,,0,124429,3402,,,,,,0,124429,3402 +"2020-04-26","GU",5,,0,,,,2,0,,,1387,79,,,,,,141,137,0,0,,,,,,128,,0,1528,79,,,,,,0,,0 +"2020-04-26","HI",14,14,1,,68,68,,1,,,27880,441,,,,,,603,,2,0,,,,,554,482,29182,617,29182,617,,,,,,0,,0 +"2020-04-26","IA",118,,6,,,,286,0,,99,30614,1356,,,,,55,5476,5476,384,0,,,,,,1900,,0,36090,1740,,,,,,0,,0 +"2020-04-26","ID",56,,2,,169,169,38,1,72,,17611,0,,,,,,1887,,17,0,,,,,,938,,0,19498,17,,,,,19498,17,,0 +"2020-04-26","IL",1933,,59,,,,4595,0,,1267,,0,,,,,772,43903,,2126,0,,,,,,,,0,214952,13335,,,,,,0,214952,13335 +"2020-04-26","IN",813,,28,,,,1446,0,,589,66696,1317,,,,,310,15012,,617,0,,,,,16184,,,0,107168,2745,,,,,,0,107168,2745 +"2020-04-26","KS",118,,1,,485,485,,11,,,23053,910,,,,,,3174,,118,0,,,,,,,,0,26227,1028,,,,,,0,,0 +"2020-04-26","KY",205,,5,,1266,1266,301,123,605,164,,0,,,,,,3905,,126,0,,,,,,1501,,0,46558,1596,,,,,,0,46558,1596 +"2020-04-26","LA",1670,,26,,,,1701,0,,,116263,3773,,,,,265,26773,26773,261,0,,,,,,14927,,0,143036,4034,,,,,,0,,0 +"2020-04-26","MA",2899,,22,,5104,5104,3879,139,,1077,181162,7665,,,,,,54938,,1590,0,,,,,66238,,,0,292273,6208,,,,,,0,292273,6208 +"2020-04-26","MD",1001,950,53,51,3962,3962,1463,202,,530,78084,6727,,,,,,18581,18581,815,0,,,,,22350,1177,,0,102977,4288,,,,,,0,102977,4288 +"2020-04-26","ME",50,,0,,159,159,39,3,,19,,0,,,,,7,1015,1015,25,0,,,,,1256,532,,0,23369,409,,,,,,0,23369,409 +"2020-04-26","MI",4036,3957,107,190,,,2757,0,,1099,,0,,,134431,,871,43789,42027,526,0,,,,,48326,8342,,0,182757,6094,,,,,,0,182757,6094 +"2020-04-26","MN",272,,28,,829,829,285,32,301,115,59161,2179,,,,,,5512,5512,385,0,,,,,,1502,64673,2564,64673,2564,,,,,,0,,0 +"2020-04-26","MO",274,,1,,,,679,0,,,62751,2359,,451,64409,,109,6997,6997,171,0,,,31,,8186,,,0,72715,2727,,,483,,,0,72715,2727 +"2020-04-26","MP",2,,0,,,,,0,,,51,0,,,,,,14,,0,0,,,,,,11,,0,65,0,,,,,,0,,0 +"2020-04-26","MS",227,,6,,1001,1001,644,5,,146,54877,1638,,,,,67,5911,,193,0,,,,,,,,0,60788,1831,,,,,,0,,0 +"2020-04-26","MT",14,,0,,61,61,11,0,,,,0,,,,,,448,,3,0,,,,,,339,,0,12862,365,,,,,,0,12862,365 +"2020-04-26","NC",299,,10,,,,451,0,,,,0,,,,,,8830,,207,0,,,,,,,,0,125210,5298,,,,,,0,125210,5298 +"2020-04-26","ND",17,,1,,71,71,18,1,,,19850,1303,,,,,,867,867,64,0,,,,,,326,21481,1188,21481,1188,,,,,19628,1145,21797,1195 +"2020-04-26","NE",53,,3,,,,,0,,,18496,944,,,20415,,,2732,,311,0,,,,,3047,,,0,23621,1473,,,,,21377,1265,23621,1473 +"2020-04-26","NH",60,,7,,238,238,95,14,,,16964,957,,,,,,1787,,67,0,,,,,,777,,0,20398,830,161,,,,,0,20398,830 +"2020-04-26","NJ",7268,5938,102,1330,,,6573,0,,1804,114106,5943,,,,,1418,109038,109038,3515,0,,,,,,,,0,223144,9458,,,,,223144,9458,,0 +"2020-04-26","NM",99,,6,,412,412,148,0,,,,0,,,,,,2726,,66,0,,,,,,650,,0,56615,2880,,,,,,0,56615,2880 +"2020-04-26","NV",235,,6,,,,,0,,,33584,915,,,,,,4602,4602,63,0,,,,,,,44108,718,44108,718,,,,,,0,46965,1080 +"2020-04-26","NY",16966,,367,,73540,73540,12839,1096,,4284,,0,,,,,,288045,,5902,0,,,,,,,805350,27782,805350,27782,,,,,,0,,0 +"2020-04-26","OH",728,687,17,41,3178,3178,,63,952,,,0,,,,,,15963,15360,376,0,,,,,16961,,,0,119680,5189,,,,,,0,119680,5189 +"2020-04-26","OK",195,,1,,653,653,306,16,,150,49891,0,,,,,,3253,3253,60,0,,,,,,2139,,0,53144,60,,,,,,0,,0 +"2020-04-26","OR",87,,1,,536,536,261,16,,60,45124,1809,,,50145,,29,2253,,76,0,,,,,6349,,,0,56494,2649,,,,,,0,56494,2649 +"2020-04-26","PA",1550,,13,,,,2736,0,,,157428,4542,,,,,632,41165,,1116,0,,,,,,,210844,6606,210844,6606,,,,,198593,5658,,0 +"2020-04-26","PR",84,,1,,,,146,0,,,9313,0,,,,,,891,891,13,0,480,,,,,,,0,10204,13,,,,,,0,,0 +"2020-04-26","RI",226,,11,,691,691,258,115,,78,42746,1886,,,49676,,53,7769,,276,0,,,,,8467,,55364,2599,55364,2599,,,,,50515,2162,58143,2630 +"2020-04-26","SC",174,,8,,944,944,,0,,,45271,1510,,,,,,5490,5490,237,0,,,,,,3701,,0,50761,1747,,,,,,0,,0 +"2020-04-26","SD",11,,1,,135,135,64,7,,,14062,613,,,,,,2212,,65,0,,,,,3038,1257,,0,16349,572,,,,,16274,678,16349,572 +"2020-04-26","TN",181,,3,,828,828,568,7,,,,0,,,137807,,,9667,,478,0,,,,,9667,4527,,0,147474,6068,,,,,,0,147474,6068 +"2020-04-26","TX",648,,25,,,,1542,0,,,,0,,,,,,24631,24631,858,0,,,,,32716,10763,,0,326513,7951,,,,,,0,326513,7951 +"2020-04-26","UT",41,,0,,345,345,,16,,,95837,3879,,,99852,,,4123,,175,0,,,,,4548,1568,,0,104400,4329,,,,,100057,4035,104400,4329 +"2020-04-26","VA",448,444,12,4,1942,1942,1436,105,,387,,0,,,,,217,12970,12488,604,0,120,9,,,17180,,95186,4061,95186,4061,1908,27,,,,0,,0 +"2020-04-26","VI",4,,1,,,,,0,,,700,7,,,,,,57,,2,0,,,,,,51,,0,757,9,,,,,,0,,0 +"2020-04-26","VT",46,,0,,,,34,0,,,11925,111,,,,,,852,852,9,0,,,,,,,,0,15566,400,,,,,12777,120,15566,400 +"2020-04-26","WA",738,,73,,,,508,0,,145,,0,,,,,,14145,14145,351,0,,,,,,,196617,2085,196617,2085,,,,,184766,1778,,0 +"2020-04-26","WI",272,,6,,1397,1397,343,21,353,141,59235,2097,,,,,,6963,5911,248,0,,,,,,,71627,2866,71627,2866,,,,,,0,,0 +"2020-04-26","WV",34,,2,,,,100,0,,38,,0,,,,,20,1044,1044,24,0,,,,,,455,,0,35131,5877,,,,,,0,35131,5877 +"2020-04-26","WY",7,,0,,54,54,16,0,,,7797,0,,,9103,,,502,370,11,0,,,,,427,334,,0,9530,77,,,,,,0,9530,77 +"2020-04-25","AK",9,,0,,37,37,32,0,,,,0,,,,,,339,,0,0,,,,,,217,,0,15732,3451,,,,,,0,15732,3451 +"2020-04-25","AL",212,,15,,839,839,351,71,288,,65207,18344,,,,170,,6137,6137,305,0,,,,,,,,0,71344,18649,,,,,71344,18649,,0 +"2020-04-25","AR",47,,2,,291,291,104,0,,,35224,2387,,,,57,25,2829,2829,88,0,,,,,,964,,0,38053,2475,,,,,,0,38053,2475 +"2020-04-25","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-25","AZ",266,,0,,1672,1672,697,46,,313,56228,1559,,,,,191,6280,,235,0,,,,,,,,0,79897,2991,,,,,62508,1794,79897,2991 +"2020-04-25","CA",1651,,89,,,,4847,0,,1458,,0,,,,,,41137,,1883,0,,,,,,,,0,506035,11862,,,,,,0,506035,11862 +"2020-04-25","CO",672,,-2,,2410,2410,1046,44,,,46823,2290,,,,,,12968,11533,713,0,,,,,,,66507,2943,66507,2943,,,,,59791,3002,,0 +"2020-04-25","CT",1862,1331,98,,,,1810,0,,,,0,,,60618,,,24582,,661,0,,,,,29598,,,0,90408,4336,,,,,,0,90408,4336 +"2020-04-25","DC",165,,12,,,,402,0,,120,,0,,,,,69,3699,,171,0,,,,,,652,17302,769,17302,769,,,,,,0,,0 +"2020-04-25","DE",155,136,8,19,,,300,0,,,14122,185,,,,,,3576,,134,0,,,,,5095,809,26109,1233,26109,1233,,,,,,0,,0 +"2020-04-25","FL",1075,,44,,5045,5045,,157,,,302260,15475,,,,,,29610,,734,0,,,,,,,324016,13407,324016,13407,,,,,,0,,0 +"2020-04-25","GA",904,,12,,4326,4326,,105,,,,0,,,,,,22695,,548,0,,,,,18792,,,0,121027,13942,,,,,,0,121027,13942 +"2020-04-25","GU",5,,0,,,,2,0,,,1308,75,,,,,,141,137,1,0,,,,,,128,,0,1449,76,,,,,,0,,0 +"2020-04-25","HI",13,13,1,,67,67,,4,,,27439,1148,,,,,,601,,5,0,,,,,549,463,28565,727,28565,727,,,,,,0,,0 +"2020-04-25","IA",112,,5,,,,293,0,,108,29258,1730,,,,,60,5092,5092,647,0,,,,,,1723,,0,34350,2377,,,,,,0,,0 +"2020-04-25","ID",54,,0,,168,168,35,2,71,,17611,0,,,,,,1870,,34,0,,,,,,867,,0,19481,34,,,,,19481,34,,0 +"2020-04-25","IL",1874,,79,,,,4699,0,,1244,,0,,,,,763,41777,,2119,0,,,,,,,,0,201617,11985,,,,,,0,201617,11985 +"2020-04-25","IN",785,,44,,,,1515,0,,598,65379,3506,,,,,324,14395,,715,0,,,,,15794,,,0,104423,4330,,,,,,0,104423,4330 +"2020-04-25","KS",117,,6,,474,474,,17,,,22143,1332,,,,,,3056,,279,0,,,,,,,,0,25199,1611,,,,,,0,,0 +"2020-04-25","KY",200,,9,,1143,1143,303,28,575,164,,0,,,,,,3779,,298,0,,,,,,1341,,0,44962,2118,,,,,,0,44962,2118 +"2020-04-25","LA",1644,,43,,,,1700,0,,,112490,518,,,,,268,26512,26512,372,0,,,,,,14927,,0,139002,890,,,,,,0,,0 +"2020-04-25","MA",2877,,0,,4965,4965,3879,213,,1058,173497,9253,,,,,,53348,,2379,0,,,,,65072,,,0,286065,10266,,,,,,0,286065,10266 +"2020-04-25","MD",948,900,49,48,3760,3760,1408,142,,538,71357,3257,,,,,,17766,17766,1150,0,,,,,21393,1165,,0,98689,4486,,,,,,0,98689,4486 +"2020-04-25","ME",50,,3,,156,156,39,4,,17,,0,,,,,7,990,990,25,0,,,,,1242,519,,0,22960,498,,,,,,0,22960,498 +"2020-04-25","MI",3929,3846,111,184,,,2889,0,,1164,,0,,,128955,,934,43263,41548,533,0,,,,,47708,8342,,0,176663,6721,,,,,,0,176663,6721 +"2020-04-25","MN",244,,23,,797,797,288,41,291,109,56982,2276,,,,,,5127,5127,339,0,,,,,,1410,62109,2615,62109,2615,,,,,,0,,0 +"2020-04-25","MO",273,,11,,,,850,0,,,60392,1810,,244,61965,,142,6826,6826,201,0,,,22,,7919,,,0,69988,2823,,,267,,,0,69988,2823 +"2020-04-25","MP",2,,0,,,,,0,,,51,0,,,,,,14,,0,0,,,,,,11,,0,65,0,,,,,,0,,0 +"2020-04-25","MS",221,,12,,996,996,649,26,,152,53239,3003,,,,,78,5718,,284,0,,,,,,,,0,58957,3287,,,,,,0,,0 +"2020-04-25","MT",14,,0,,61,61,11,2,,,,0,,,,,,445,,1,0,,,,,,339,,0,12497,370,,,,,,0,12497,370 +"2020-04-25","NC",289,,20,,,,456,0,,,,0,,,,,,8623,,571,0,,,,,,,,0,119912,4788,,,,,,0,119912,4788 +"2020-04-25","ND",16,,1,,70,70,17,3,,,18547,1846,,,,,,803,803,56,0,,,,,,310,20293,2042,20293,2042,,,,,18483,1804,20602,2057 +"2020-04-25","NE",50,,3,,,,,0,,,17552,1064,,,19283,,,2421,,297,0,,,,,2710,,,0,22148,1632,,,,,20112,1411,22148,1632 +"2020-04-25","NH",53,,2,,224,224,89,6,,,16007,868,,,,,,1720,,50,0,,,,,,578,,0,19568,1309,71,,,,,0,19568,1309 +"2020-04-25","NJ",7166,5863,280,1303,,,6722,0,,1971,108163,4397,,,,,1442,105523,105523,3327,0,,,,,,,,0,213686,7724,,,,,213686,7724,,0 +"2020-04-25","NM",93,,9,,412,412,152,0,,,,0,,,,,,2660,,139,0,,,,,,614,,0,53735,2225,,,,,,0,53735,2225 +"2020-04-25","NV",229,,13,,,,,0,,,32669,875,,,,,,4539,4539,141,0,,,,,,,43390,1116,43390,1116,,,,,,0,45885,1398 +"2020-04-25","NY",16599,,437,,72444,72444,13524,1071,,4410,,0,,,,,,282143,,10553,0,,,,,,,777568,46912,777568,46912,,,,,,0,,0 +"2020-04-25","OH",711,671,21,40,3115,3115,,62,938,,,0,,,,,,15587,14983,418,0,,,,,16444,,,0,114491,5503,,,,,,0,114491,5503 +"2020-04-25","OK",194,,6,,637,637,306,0,,150,49891,6872,,,,,,3193,3193,72,0,,,,,,2080,,0,53084,6944,,,,,,0,,0 +"2020-04-25","OR",86,,3,,520,520,258,8,,56,43315,1466,,,47665,,29,2177,,50,0,,,,,6180,,,0,53845,3586,,,,,,0,53845,3586 +"2020-04-25","PA",1537,,45,,,,2748,0,,,152886,5395,,,,,640,40049,,1397,0,,,,,,,204238,7291,204238,7291,,,,,192935,6792,,0 +"2020-04-25","PR",83,,6,,,,137,0,,,9313,0,,,,,,878,878,7,0,429,,,,,,,0,10191,7,,,,,,0,,0 +"2020-04-25","RI",215,,13,,576,576,263,0,,77,40860,1789,,,47362,,52,7493,,305,0,,,,,8151,,52765,3775,52765,3775,,,,,48353,2094,55513,2604 +"2020-04-25","SC",166,,16,,944,944,,107,,,43761,4215,,,,,,5253,5253,336,0,,,,,,3701,,0,49014,4551,,,,,,0,,0 +"2020-04-25","SD",10,,0,,128,128,61,4,,,13449,665,,,,,,2147,,107,0,,,,,2955,1223,,0,15777,747,,,,,15596,772,15777,747 +"2020-04-25","TN",178,,10,,821,821,510,13,,,,0,,,132217,,,9189,,463,0,,,,,9189,4467,,0,141406,10078,,,,,,0,141406,10078 +"2020-04-25","TX",623,,30,,,,1597,0,,,,0,,,,,,23773,23773,967,0,,,,,32051,9986,,0,318562,15742,,,,,,0,318562,15742 +"2020-04-25","UT",41,,2,,329,329,,14,,,91958,4187,,,95695,,,3948,,166,0,,,,,4376,1399,,0,100071,4687,,,,,96022,4362,100071,4687 +"2020-04-25","VA",436,432,26,4,1837,1837,1405,84,,357,,0,,,,,223,12366,11902,772,0,88,9,,,16409,,91125,3529,91125,3529,1386,27,,,,0,,0 +"2020-04-25","VI",3,,0,,,,,0,,,693,51,,,,,,55,,1,0,,,,,,51,,0,748,52,,,,,,0,,0 +"2020-04-25","VT",46,,2,,,,37,0,,,11814,299,,,,,,843,843,9,0,,,,,,,,0,15166,758,,,,,12657,308,15166,758 +"2020-04-25","WA",665,,6,,,,455,0,,174,,0,,,,,,13794,13794,275,0,,,,,,,194532,3448,194532,3448,,,,,182988,3011,,0 +"2020-04-25","WI",266,,4,,1376,1376,341,23,353,137,57138,2565,,,,,,6715,5687,351,0,,,,,,,68761,2959,68761,2959,,,,,,0,,0 +"2020-04-25","WV",32,,0,,,,97,0,,36,,0,,,,,19,1020,1020,32,0,,,,,,439,,0,29254,3529,,,,,,0,29254,3529 +"2020-04-25","WY",7,,0,,54,54,16,0,,,7797,101,,,9030,,,491,362,18,0,,,,,423,321,,0,9453,97,,,,,,0,9453,97 +"2020-04-24","AK",9,,0,,37,37,36,0,,,,0,,,,,,339,,2,0,,,,,,208,,0,12281,120,,,,,,0,12281,120 +"2020-04-24","AL",197,,0,,768,768,429,0,288,,46863,0,,,,170,,5832,5832,54,0,,,,,,,,0,52695,54,,,,,52695,54,,0 +"2020-04-24","AR",45,,0,,291,291,101,0,,,32837,3712,,,,57,24,2741,2741,276,0,,,,,,929,,0,35578,3988,,,,,,0,35578,3988 +"2020-04-24","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-24","AZ",266,,17,,1626,1626,639,54,,332,54669,1741,,,,,186,6045,,276,0,,,,,,,,0,76906,2582,,,,,60714,2017,76906,2582 +"2020-04-24","CA",1562,,93,,,,4880,0,,1521,,0,,,,,,39254,,1885,0,,,,,,,,0,494173,12076,,,,,,0,494173,12076 +"2020-04-24","CO",674,,122,,2366,2366,1084,129,,,44533,3471,,,,,,12255,10995,993,0,,,,,,,63564,5249,63564,5249,,,,,56789,4465,,0 +"2020-04-24","CT",1764,1086,125,,,,1877,0,,,,0,,,57245,,,23921,,821,0,,,,,28660,,,0,86072,4061,,,,,,0,86072,4061 +"2020-04-24","DC",153,,14,,,,402,0,,120,,0,,,,,69,3528,,167,0,,,,,,651,16533,603,16533,603,,,,,,0,,0 +"2020-04-24","DE",147,128,16,19,,,277,0,,,13937,333,,,,,,3442,,134,0,,,,,4768,703,24876,769,24876,769,,,,,,0,,0 +"2020-04-24","FL",1031,,52,,4888,4888,,195,,,286785,18909,,,,,,28876,,1214,0,,,,,,,310609,18611,310609,18611,,,,,,0,,0 +"2020-04-24","GA",892,,20,,4221,4221,,152,,,,0,,,,,,22147,,635,0,,,,,17164,,,0,107085,6106,,,,,,0,107085,6106 +"2020-04-24","GU",5,,0,,,,2,0,,,1233,53,,,,,,140,136,2,0,,,,,,126,,0,1373,55,,,,,,0,,0 +"2020-04-24","HI",12,12,0,,63,63,,0,,,26291,755,,,,,,596,,4,0,,,,,545,455,27838,837,27838,837,,,,,,0,,0 +"2020-04-24","IA",107,,11,,,,278,0,,104,27528,2190,,,,,60,4445,4445,521,0,,,,,,1604,,0,31973,2711,,,,,,0,,0 +"2020-04-24","ID",54,,0,,166,166,31,4,63,,17611,241,,,,,,1836,,34,0,,,,,,822,,0,19447,275,,,,,19447,275,,0 +"2020-04-24","IL",1795,,107,,,,4828,0,,1225,,0,,,,,709,39658,,2724,0,,,,,,,,0,189632,16124,,,,,,0,189632,16124 +"2020-04-24","IN",741,,35,,,,,0,,621,61873,2872,,,,,325,13680,,641,0,,,,,15018,,,0,100093,5282,,,,,,0,100093,5282 +"2020-04-24","KS",111,,-1,,457,457,,15,,,20811,1975,,,,,,2777,,295,0,,,,,,,,0,23588,2270,,,,,,0,,0 +"2020-04-24","KY",191,,6,,1115,1115,302,10,570,163,,0,,,,,,3481,,108,0,,,,,,1335,,0,42844,6769,,,,,,0,42844,6769 +"2020-04-24","LA",1601,,61,,,,1697,0,,,111972,198,,,,,286,26140,26140,401,0,,,,,,14927,,0,138112,599,,,,,,0,,0 +"2020-04-24","MA",2877,,108,,4752,4752,3847,259,,1034,164244,7920,,,,,,50969,,2977,0,,,,,63242,,,0,275799,14903,,,,,,0,275799,14903 +"2020-04-24","MD",899,853,68,46,3618,3618,1425,141,,547,68100,3737,,,,,,16616,16616,879,0,,,,,20267,1108,,0,94203,4870,,,,,,0,94203,4870 +"2020-04-24","ME",47,,3,,152,152,39,2,,17,,0,,,,,7,965,965,28,0,,,,,1215,499,,0,22462,632,,,,,,0,22462,632 +"2020-04-24","MI",3818,3745,107,182,,,3022,0,,1176,,0,,,123054,,965,42730,41066,1036,0,,,,,46888,3237,,0,169942,9089,,,,,,0,169942,9089 +"2020-04-24","MN",221,,21,,756,756,278,44,281,111,54706,2562,,,,,,4788,4788,518,0,,,,,,1373,59494,3080,59494,3080,,,,,,0,,0 +"2020-04-24","MO",262,,44,,,,877,0,,,58582,5453,,109,59430,,,6625,6625,304,0,,,17,,7639,,,0,67165,2978,,,127,,,0,67165,2978 +"2020-04-24","MP",2,,0,,,,,0,,,51,0,,,,,,14,,0,0,,,,,,11,,0,65,0,,,,,,0,,0 +"2020-04-24","MS",209,,8,,970,970,586,24,,148,50236,0,,,,,74,5434,,281,0,,,,,,,,0,55670,281,,,,,,0,,0 +"2020-04-24","MT",14,,0,,59,59,12,0,,,,0,,,,,,444,,2,0,,,,,,325,,0,12127,252,,,,,,0,12127,252 +"2020-04-24","NC",269,,16,,,,477,0,,,,0,,,,,,8052,,444,0,,,,,,,,0,115124,6406,,,,,,0,115124,6406 +"2020-04-24","ND",15,,0,,67,67,17,2,,,16701,1080,,,,,,747,747,38,0,,,,,,285,18251,1335,18251,1335,,,,,16679,1121,18545,1368 +"2020-04-24","NE",47,,2,,,,,0,,,16488,941,,,18011,,,2124,,311,0,,,,,2357,,,0,20516,1557,,,,,18701,1307,20516,1557 +"2020-04-24","NH",51,,3,,218,218,92,5,,,15139,715,,,,,,1670,,82,0,,,,,,551,,0,18259,592,42,,,,,0,18259,592 +"2020-04-24","NJ",6886,5617,279,1269,,,6847,0,,1933,103766,3607,,,,,1487,102196,102196,2207,0,,,,,,,,0,205962,5814,,,,,205962,5814,,0 +"2020-04-24","NM",84,,6,,412,412,152,45,,,,0,,,,,,2521,,142,0,,,,,,614,,0,51510,4947,,,,,,0,51510,4947 +"2020-04-24","NV",216,,6,,,,,0,,,31794,1253,,,,,,4398,4398,190,0,,,,,,,42274,917,42274,917,,,,,,0,44487,1778 +"2020-04-24","NY",16162,,422,,71373,71373,14258,1191,,4540,,0,,,,,,271590,,8130,0,,,,,,,730656,34736,730656,34736,,,,,,0,,0 +"2020-04-24","OH",690,649,34,41,3053,3053,,93,920,,,0,,,,,,15169,14581,475,0,,,,,15897,,,0,108988,4924,,,,,,0,108988,4924 +"2020-04-24","OK",188,,9,,637,637,310,15,,155,43019,0,,,,,,3121,3121,104,0,,,,,,1961,,0,46140,104,,,,,,0,,0 +"2020-04-24","OR",83,,5,,512,512,304,24,,74,41849,2723,,,44292,,36,2127,,68,0,,,,,5967,,,0,50259,2422,,,,,,0,50259,2422 +"2020-04-24","PA",1492,,71,,,,2746,0,,,147491,5430,,,,,679,38652,,1599,0,,,,,,,196947,7923,196947,7923,,,,,186143,7029,,0 +"2020-04-24","PR",77,,8,,,,172,0,,,9313,0,,,,,,871,871,-44,0,405,,,,,,,0,10184,-44,,,,,,0,,0 +"2020-04-24","RI",202,,-11,,576,576,267,-181,,77,39071,2648,,,45152,,48,7188,,415,0,,,,,7757,,48990,2949,48990,2949,,,,,46259,3063,52909,3786 +"2020-04-24","SC",150,,0,,837,837,,0,,,39546,0,,,,,,4917,4917,0,0,,,,,,3317,,0,44463,0,,,,,,0,,0 +"2020-04-24","SD",10,,1,,124,124,61,5,,,12784,675,,,,,,2040,,84,0,,,,,2851,1190,,0,15030,675,,,,,14824,759,15030,675 +"2020-04-24","TN",168,,-2,,808,808,593,15,,,,0,,,122602,,,8726,,460,0,,,,,8726,4370,,0,131328,8228,,,,,,0,131328,8228 +"2020-04-24","TX",593,,32,,,,1674,0,,,,0,,,,,,22806,22806,862,0,,,,,30597,9156,,0,302820,14759,,,,,,0,302820,14759 +"2020-04-24","UT",39,,4,,315,315,,14,,,87771,4170,,,91213,,,3782,,170,0,,,,,4171,1252,,0,95384,4692,,,,,91660,4314,95384,4692 +"2020-04-24","VA",410,407,38,3,1753,1753,1399,94,,379,,0,,,,,220,11594,11169,596,0,72,9,,,15704,,87596,4990,87596,4990,844,27,,,,0,,0 +"2020-04-24","VI",3,,0,,,,,0,,,642,59,,,,,,54,,0,0,,,,,,50,,0,696,59,,,,,,0,,0 +"2020-04-24","VT",44,,1,,,,32,0,,,11515,284,,,,,,834,834,3,0,,,,,,,,0,14408,479,,,,,12349,287,14408,479 +"2020-04-24","WA",659,,5,,,,551,0,,164,,0,,,,,,13519,13519,284,0,,,,,,,191084,6176,191084,6176,,,,,179977,5509,,0 +"2020-04-24","WI",262,,5,,1353,1353,356,35,346,146,54573,3117,,,,,,6364,5356,353,0,,,,,,,65802,2799,65802,2799,,,,,,0,,0 +"2020-04-24","WV",32,,3,,,,97,0,,36,,0,,,,,19,988,988,21,0,,,,,,439,,0,25725,2296,,,,,,0,25725,2296 +"2020-04-24","WY",7,,0,,54,54,16,2,,,7696,455,,,8936,,,473,349,20,0,,,,,420,321,,0,9356,418,,,,,,0,9356,418 +"2020-04-23","AK",9,,0,,37,37,42,0,,,,0,,,,,,337,,2,0,,,,,,209,,0,12161,2,,,,,,0,12161,2 +"2020-04-23","AL",197,,3,,768,768,406,38,288,,46863,3568,,,,170,,5778,5778,313,0,,,,,,,,0,52641,3881,,,,,52641,3881,,0 +"2020-04-23","AR",45,,3,,291,291,101,0,,,29125,1688,,,,57,24,2465,2465,189,0,,,,,,902,,0,31590,1877,,,,,,0,31590,1877 +"2020-04-23","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-23","AZ",249,,20,,1572,1572,699,44,,305,52928,1786,,,,,201,5769,,310,0,,,,,,,,0,74324,2510,,,,,58697,2096,74324,2510 +"2020-04-23","CA",1469,,115,,,,4929,0,,1531,,0,,,,,,37369,,1973,0,,,,,,,,0,482097,16770,,,,,,0,482097,16770 +"2020-04-23","CO",552,,44,,2237,2237,1084,114,,,41062,1295,,,,,,11262,10208,384,0,,,,,,,58315,1904,58315,1904,,,,,52324,1679,,0 +"2020-04-23","CT",1639,1036,95,,,,1947,0,,,,0,,,54198,,,23100,,631,0,,,,,27670,,,0,82011,4009,,,,,,0,82011,4009 +"2020-04-23","DC",139,,12,,,,402,0,,120,,0,,,,,200,3361,,155,0,,,,,,648,15930,428,15930,428,,,,,,0,,0 +"2020-04-23","DE",131,114,14,17,,,290,0,,,13604,251,,,,,,3308,,108,0,,,,,4548,643,24107,1096,24107,1096,,,,,,0,,0 +"2020-04-23","FL",979,,69,,4693,4693,,224,,,267876,7558,,,,,,27662,,697,0,,,,,,,291998,11064,291998,11064,,,,,,0,,0 +"2020-04-23","GA",872,,36,,4069,4069,,110,,,,0,,,,,,21512,,772,0,,,,,16471,,,0,100979,6908,,,,,,0,100979,6908 +"2020-04-23","GU",5,,0,,,,2,0,,,1180,94,,,,,,138,135,4,0,,,,,,126,,0,1318,98,,,,,,0,,0 +"2020-04-23","HI",12,12,0,,63,63,,7,,,25536,776,,,,,,592,,6,0,,,,,540,444,27001,802,27001,802,,,,,,0,,0 +"2020-04-23","IA",96,,6,,,,282,0,,102,25338,842,,,,,55,3924,3924,176,0,,,,,,1492,,0,29262,1018,,,,,,0,,0 +"2020-04-23","ID",54,,3,,162,162,52,4,60,,17370,966,,,,,,1802,,36,0,,,,,,767,,0,19172,1002,,,,,19172,1002,,0 +"2020-04-23","IL",1688,,123,,,,4877,0,,1268,,0,,,,,766,36934,,1826,0,,,,,,,,0,173508,9162,,,,,,0,173508,9162 +"2020-04-23","IN",706,,45,,,,,0,,652,59001,1969,,,,,333,13039,,601,0,,,,,13594,,,0,94811,4585,,,,,,0,94811,4585 +"2020-04-23","KS",112,,2,,442,442,,10,,,18836,844,,,,,,2482,,271,0,,,,,,,,0,21318,1115,,,,,,0,,0 +"2020-04-23","KY",185,,14,,1105,1105,301,29,564,161,,0,,,,,,3373,,181,0,,,,,,1311,,0,36075,2747,,,,,,0,36075,2747 +"2020-04-23","LA",1540,,67,,,,1727,0,,,111774,186,,,,,274,25739,25739,481,0,,,,,,14927,,0,137513,667,,,,,,0,,0 +"2020-04-23","MA",2769,,172,,4493,4493,3851,237,,1034,156324,11535,,,,,,47992,,3079,0,,,,,60424,,,0,260896,13425,,,,,,0,260896,13425 +"2020-04-23","MD",831,789,52,42,3477,3477,1405,152,,515,64363,2609,,,,,,15737,15737,962,0,,,,,19161,1040,,0,89333,3906,,,,,,0,89333,3906 +"2020-04-23","ME",44,,5,,150,150,42,6,,18,,0,,,,,11,937,937,30,0,,,,,1173,485,,0,21830,634,,,,,,0,21830,634 +"2020-04-23","MI",3711,3636,109,180,,,3611,0,,1148,,0,,,115005,,1027,41694,40145,989,0,,,,,45848,3237,,0,160853,9699,,,,,,0,160853,9699 +"2020-04-23","MN",200,,21,,712,712,268,52,274,104,52144,1979,,,,,,4270,4270,512,0,,,,,,1336,56414,2491,56414,2491,,,,,,0,,0 +"2020-04-23","MO",218,,10,,,,884,0,,,53129,1110,,47,56736,,,6321,6321,184,0,,,12,,7361,,,0,64187,2541,,,60,,,0,64187,2541 +"2020-04-23","MP",2,,0,,,,,0,,,51,0,,,,,,14,,0,0,,,,,,11,,0,65,0,,,,,,0,,0 +"2020-04-23","MS",201,,8,,946,946,595,36,,156,50236,1295,,,,,78,5153,,259,0,,,,,,,,0,55389,1554,,,,,,0,,0 +"2020-04-23","MT",14,,0,,59,59,13,0,,,,0,,,,,,442,,3,0,,,,,,306,,0,11875,292,,,,,,0,11875,292 +"2020-04-23","NC",253,,11,,,,486,0,,,,0,,,,,,7608,,388,0,,,,,,,,0,108718,7796,,,,,,0,108718,7796 +"2020-04-23","ND",15,,1,,65,65,18,3,,,15621,711,,,,,,709,709,32,0,,,,,,269,16916,820,16916,820,,,,,15558,747,17177,829 +"2020-04-23","NE",45,,7,,,,,0,,,15547,590,,,16863,,,1813,,91,0,,,,,1953,,,0,18959,513,,,,,17394,581,18959,513 +"2020-04-23","NH",48,,6,,213,213,91,7,,,14424,874,,,,,,1588,,97,0,,,,,,550,,0,17667,785,16,,,,,0,17667,785 +"2020-04-23","NJ",6607,5368,332,1239,,,7240,0,,1990,100159,4365,,,,,1462,99989,99989,4124,0,,,,,,,,0,200148,8489,,,,,200148,8489,,0 +"2020-04-23","NM",78,,7,,367,367,123,36,,,,0,,,,,,2379,,169,0,,,,,,573,,0,46563,5331,,,,,,0,46563,5331 +"2020-04-23","NV",210,,9,,,,,0,,,30541,734,,,,,,4208,4208,127,0,,,,,,,41357,1042,41357,1042,,,,,,0,42709,1175 +"2020-04-23","NY",15740,,438,,70182,70182,15021,1409,,4597,,0,,,,,,263460,,6244,0,,,,,,,695920,25938,695920,25938,,,,,,0,,0 +"2020-04-23","OH",656,618,46,38,2960,2960,,78,900,,,0,,,,,,14694,14142,577,0,,,,,15264,,,0,104064,3966,,,,,,0,104064,3966 +"2020-04-23","OK",179,,9,,622,622,284,34,,156,43019,0,,,,,,3017,3017,123,0,,,,,,1884,,0,46036,123,,,,,,0,,0 +"2020-04-23","OR",78,,0,,488,488,302,17,,67,39126,0,,,42038,,35,2059,,57,0,,,,,5799,,,0,47837,2509,,,,,,0,47837,2509 +"2020-04-23","PA",1421,,-201,,,,2750,0,,,142061,5789,,,,,679,37053,,1369,0,,,,,,,189024,8255,189024,8255,,,,,179114,7158,,0 +"2020-04-23","PR",69,,2,,,,154,0,,,9313,471,,,,,,915,,0,0,,,,,,,,0,10228,471,,,,,,0,,0 +"2020-04-23","RI",213,,12,,757,757,316,40,,72,36423,1895,,,41860,,45,6773,,419,0,,,,,7263,,46041,2808,46041,2808,,,,,43196,2314,49123,2953 +"2020-04-23","SC",150,,10,,837,837,,0,,,39546,1196,,,,,,4917,4917,156,0,,,,,,3317,,0,44463,1352,,,,,,0,,0 +"2020-04-23","SD",9,,1,,119,119,58,8,,,12109,521,,,,,,1956,,98,0,,,,,2743,1064,,0,14355,655,,,,,14065,619,14355,655 +"2020-04-23","TN",170,,4,,793,793,488,18,,,,0,,,114834,,,8266,,424,0,,,,,8266,4193,,0,123100,8120,,,,,,0,123100,8120 +"2020-04-23","TX",561,,18,,,,1649,0,,,,0,,,,,,21944,21944,875,0,,,,,29283,8025,,0,288061,12269,,,,,,0,288061,12269 +"2020-04-23","UT",35,,1,,301,301,,13,,,83601,5166,,,86683,,,3612,,167,0,,,,,4009,1050,,0,90692,5604,,,,,87346,5309,90692,5604 +"2020-04-23","VA",372,370,23,2,1659,1659,1379,78,,400,,0,,,,,249,10998,10627,732,0,33,9,,,14835,,82606,4811,82606,4811,343,27,,,,0,,0 +"2020-04-23","VI",3,,0,,,,,0,,,583,0,,,,,,54,,0,0,,,,,,48,,0,637,0,,,,,,0,,0 +"2020-04-23","VT",43,,3,,,,44,0,,,11231,285,,,,,,831,831,3,0,,,,,,,,0,13929,603,,,,,12062,288,13929,603 +"2020-04-23","WA",654,,7,,,,544,0,,151,,0,,,,,,13235,13235,268,0,,,,,,,184908,4963,184908,4963,,,,,174468,4338,,0 +"2020-04-23","WI",257,,11,,1318,1318,349,16,342,146,51456,1954,,,,,,6011,5052,245,0,,,,,,,63003,2892,63003,2892,,,,,,0,,0 +"2020-04-23","WV",29,,3,,,,108,0,,44,,0,,,,,24,967,967,28,0,,,,,,380,,0,23429,1542,,,,,,0,23429,1542 +"2020-04-23","WY",7,,1,,52,52,,0,,,7241,-60,,,8542,,,453,332,6,0,,,,,396,275,,0,8938,269,,,,,,0,8938,269 +"2020-04-22","AK",9,,0,,37,37,39,0,,,,0,,,,,,335,,6,0,,,,,,196,,0,12159,1040,,,,,,0,12159,1040 +"2020-04-22","AL",194,,17,,730,730,440,31,288,,43295,0,,,,170,,5465,5465,234,0,,,,,,,,0,48760,234,,,,,48760,234,,0 +"2020-04-22","AR",42,,-1,,291,291,97,0,,,27437,2223,,,,57,23,2276,2276,49,0,,,,,,863,,0,29713,2272,,,,,,0,29713,2272 +"2020-04-22","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-22","AZ",229,,21,,1528,1528,664,44,,300,51142,1241,,,,,195,5459,,208,0,,,,,,,,0,71814,2450,,,,,56601,1449,71814,2450 +"2020-04-22","CA",1354,,86,,,,4984,0,,1551,,-266839,,,,,,35396,,2135,0,,,,,,,,0,465327,165227,,,,,,0,465327,165227 +"2020-04-22","CO",508,,22,,2123,2123,859,120,,,39767,1510,,,,,,10878,,431,0,,,,,,,56411,2167,56411,2167,,,,,50645,1941,,0 +"2020-04-22","CT",1544,1036,121,,,,1972,0,,,,0,,,51267,,,22469,,2109,0,,,,,26617,,,0,78002,3024,,,,,,0,78002,3024 +"2020-04-22","DC",127,,15,,,,402,0,,120,,0,,,,,69,3206,,108,0,,,,,,645,15502,563,15502,563,,,,,,0,,0 +"2020-04-22","DE",117,103,13,14,,,269,0,,,13353,418,,,,,,3200,,269,0,,,,,4173,599,23011,383,23011,383,,,,,,0,,0 +"2020-04-22","FL",910,,54,,4469,4469,,234,,,260318,10754,,,,,,26965,,859,0,,,,,,,280934,12234,280934,12234,,,,,,0,,0 +"2020-04-22","GA",836,,37,,3959,3959,,180,,,,0,,,,,,20740,,859,0,,,,,15804,,,0,94071,1649,,,,,,0,94071,1649 +"2020-04-22","GU",5,,0,,,,3,0,,2,1086,53,,,,,,134,133,1,0,,,,,,119,,0,1220,54,,,,,,0,,0 +"2020-04-22","HI",12,12,2,,56,56,,1,,,24760,648,,,,,,586,,2,0,,,,,529,437,26199,543,26199,543,,,,,,0,,0 +"2020-04-22","IA",90,,7,,,,272,0,,92,24496,522,,,,,57,3748,3748,107,0,,,,,,1428,,0,28244,629,,,,,,0,,0 +"2020-04-22","ID",51,,3,,158,158,54,1,58,,16404,333,,,,,,1766,,30,0,,,,,,710,,0,18170,363,,,,,18170,363,,0 +"2020-04-22","IL",1565,,97,,,,4665,0,,1220,,0,,,,,747,35108,,2049,0,,,,,,,,0,164346,9349,,,,,,0,164346,9349 +"2020-04-22","IN",661,,31,,,,,0,,633,57032,1865,,,,,334,12438,,341,0,,,,,13000,,,0,90226,4526,,,,,,0,90226,4526 +"2020-04-22","KS",110,,3,,432,432,,13,,,17992,916,,,,,,2211,,186,0,,,,,,,,0,20203,1102,,,,,,0,,0 +"2020-04-22","KY",171,,17,,1076,1076,286,17,558,165,,0,,,,,,3192,,142,0,,,,,,1266,,0,33328,508,,,,,,0,33328,508 +"2020-04-22","LA",1473,,68,,,,1747,0,,,111588,0,,,,,287,25258,25258,404,0,,,,,,14927,,0,136846,404,,,,,,0,,0 +"2020-04-22","MA",2597,,148,,4256,4256,3890,247,,1050,144789,3345,,,,,,44913,,1745,0,,,,,57491,,,0,247471,15397,,,,,,0,247471,15397 +"2020-04-22","MD",779,738,47,41,3325,3325,1432,167,,527,61754,2312,,,,,,14775,14775,582,0,,,,,18054,981,,0,85427,3298,,,,,,0,85427,3298 +"2020-04-22","ME",39,,3,,144,144,42,5,,18,,0,,,,,10,907,907,19,0,,,,,1144,455,,0,21196,509,,,,,,0,21196,509 +"2020-04-22","MI",3602,3531,131,174,,,3305,0,,1350,,0,,,106653,,1065,40705,39267,1116,0,,,,,44501,3237,,0,151154,8341,,,,,,0,151154,8341 +"2020-04-22","MN",179,,19,,660,660,240,31,262,107,50165,1824,,,,,,3758,3758,306,0,,,,,,1138,53923,2130,53923,2130,,,,,,0,,0 +"2020-04-22","MO",208,,19,,,,1001,0,,,52019,840,,21,54480,,,6137,6137,196,0,,,6,,7085,,,0,61646,2590,,,28,,,0,61646,2590 +"2020-04-22","MP",2,,0,,,,,0,,,51,0,,,,,,14,,0,0,,,,,,11,,0,65,0,,,,,,0,,0 +"2020-04-22","MS",193,,10,,910,910,628,52,,162,48941,1293,,,,,86,4894,,178,0,,,,,,,,0,53835,1471,,,,,,0,,0 +"2020-04-22","MT",14,,2,,59,59,13,0,,,,0,,,,,,439,,2,0,,,,,,296,,0,11583,342,,,,,,0,11583,342 +"2020-04-22","NC",242,,29,,,,434,0,,,,0,,,,,,7220,,269,0,,,,,,,,0,100922,4520,,,,,,0,100922,4520 +"2020-04-22","ND",14,,1,,62,62,23,8,,,14910,567,,,,,,677,677,33,0,,,,,,229,16096,677,16096,677,,,,,14811,581,16348,706 +"2020-04-22","NE",38,,5,,,,,0,,,14957,233,,,16415,,,1722,,74,0,,,,,1892,,,0,18446,447,,,,,16813,335,18446,447 +"2020-04-22","NH",42,,0,,206,206,94,0,,,13550,702,,,,,,1491,,0,0,,,,,,546,,0,16882,934,7,,,,,0,16882,934 +"2020-04-22","NJ",6275,5063,343,1212,,,7210,0,,1983,95794,3355,,,,,1570,95865,95865,3478,0,,,,,,,,0,191659,6833,,,,,191659,6833,,0 +"2020-04-22","NM",71,,6,,331,331,121,25,,,,0,,,,,,2210,,138,0,,,,,,547,,0,41232,355,,,,,,0,41232,355 +"2020-04-22","NV",201,,8,,,,,0,,,29807,689,,,,,,4081,4081,144,0,,,,,,,40315,2489,40315,2489,,,,,,0,41534,1070 +"2020-04-22","NY",15302,,474,,68773,68773,15599,1502,,4690,,0,,,,,,257216,,5526,0,,,,,,,669982,20657,669982,20657,,,,,,0,,0 +"2020-04-22","OH",610,584,53,26,2882,2882,,103,880,,,0,,,,,,14117,13609,392,0,,,,,14762,,,0,100098,3694,,,,,,0,100098,3694 +"2020-04-22","OK",170,,6,,588,588,298,27,,147,43019,1482,,,,,,2894,2894,87,0,,,,,,1772,,0,45913,1569,,,,,,0,,0 +"2020-04-22","OR",78,,3,,471,471,297,6,,70,39126,1037,,,39716,,35,2002,,46,0,,,,,5612,,,0,45328,1353,,,,,,0,45328,1353 +"2020-04-22","PA",1622,,58,,,,2764,0,,,136272,3949,,,,,685,35684,,1156,0,,,,,,,180769,5823,180769,5823,,,,,171956,5105,,0 +"2020-04-22","PR",67,,3,,,,140,0,,,8842,53,,,,,,915,,-383,0,,,,,,,,0,9757,-330,,,,,,0,,0 +"2020-04-22","RI",201,,15,,717,717,314,43,,71,34528,1922,,,39389,,44,6354,,382,0,,,,,6781,,43233,2554,43233,2554,,,,,40882,2304,46170,2818 +"2020-04-22","SC",140,,16,,837,837,,61,,,38350,1512,,,,,,4761,4761,322,0,,,,,,3317,,0,43111,1834,,,,,,0,,0 +"2020-04-22","SD",8,,0,,111,111,62,11,,,11588,528,,,,,,1858,,103,0,,,,,2638,937,,0,13700,499,,,,,13446,631,13700,499 +"2020-04-22","TN",166,,9,,775,775,441,15,,,,0,,,107138,,,7842,,448,0,,,,,7842,4012,,0,114980,6798,,,,,,0,114980,6798 +"2020-04-22","TX",543,,26,,,,1678,0,,,,0,,,,,,21069,21069,873,0,,,,,28133,7341,,0,275792,12833,,,,,,0,275792,12833 +"2020-04-22","UT",34,,2,,288,288,,11,,,78435,4683,,,81234,,,3445,,149,0,,,,,3854,970,,0,85088,5059,,,,,82037,4847,85088,5059 +"2020-04-22","VA",349,347,25,2,1581,1581,1374,81,,419,,0,,,,,244,10266,9952,636,0,18,9,,,13940,,77795,2716,77795,2716,91,27,,,,0,,0 +"2020-04-22","VI",3,,0,,,,,0,,,583,9,,,,,,54,,0,0,,,,,,48,,0,637,9,,,,,,0,,0 +"2020-04-22","VT",40,,0,,,,37,0,,,10946,207,,,,,,828,828,8,0,,,,,,,,0,13326,379,,,,,11774,215,13326,379 +"2020-04-22","WA",647,,7,,,,543,0,,161,,0,,,,,,12967,12967,334,0,,,,,,,179945,5127,179945,5127,,,,,170130,4424,,0 +"2020-04-22","WI",246,,4,,1302,1302,352,50,324,137,49502,1661,,,,,,5766,4845,257,0,,,,,,,60111,2698,60111,2698,,,,,,0,,0 +"2020-04-22","WV",26,,0,,,,103,0,,41,,0,,,,,23,939,939,25,0,,,,,,330,,0,21887,1791,,,,,,0,21887,1791 +"2020-04-22","WY",6,,0,,52,52,19,0,,,7301,0,,,8296,,,447,326,6,0,,,,,373,254,,0,8669,289,,,,,,0,8669,289 +"2020-04-21","AK",9,,0,,37,37,42,0,,,,0,,,,,,329,,8,0,,,,,,168,,0,11119,995,,,,,,0,11119,995 +"2020-04-21","AL",177,,10,,699,699,401,58,260,,43295,2420,,,,157,,5231,5231,206,0,,,,,,,,0,48526,2626,,,,,48526,2626,,0 +"2020-04-21","AR",43,,1,,291,291,86,0,,,25214,584,,,,57,27,2227,2227,304,0,,,,,,809,,0,27441,888,,,,,,0,27441,888 +"2020-04-21","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-21","AZ",208,,21,,1484,1484,637,30,,285,49901,465,,,,,181,5251,,187,0,,,,,,,,0,69364,2745,,,,,55152,652,69364,2745 +"2020-04-21","CA",1268,,60,,,,4886,0,,1502,266839,7317,,,,,,33261,,2283,0,,,,,,,,0,300100,9600,,,,,,0,300100,9600 +"2020-04-21","CO",486,,37,,2003,2003,851,123,,,38257,897,,,,,,10447,,341,0,,,,,,,54244,1476,54244,1476,,,,,48704,1238,,0 +"2020-04-21","CT",1423,971,92,,,,1949,0,,,,0,,,49221,,,20360,,545,0,,,,,25660,,,0,74978,3493,,,,,,0,74978,3493 +"2020-04-21","DC",112,,7,,,,402,0,,120,,0,,,,,69,3098,,171,0,,,,,,636,14939,826,14939,826,,,,,,0,,0 +"2020-04-21","DE",104,92,5,12,,,263,0,,,12935,427,,,,,,2931,,186,0,,,,,4051,565,22628,701,22628,701,,,,,,0,,0 +"2020-04-21","FL",856,,50,,4235,4235,,225,,,249564,9999,,,,,,26106,,746,0,,,,,,,268700,10579,268700,10579,,,,,,0,,0 +"2020-04-21","GA",799,,66,,3779,3779,,229,,,,0,,,,,,19881,,934,0,,,,,15635,,,0,92422,4999,,,,,,0,92422,4999 +"2020-04-21","GU",5,,0,,,,3,0,,2,1033,42,,,,,,133,133,0,0,,,,,,114,,0,1166,42,,,,,,0,,0 +"2020-04-21","HI",10,10,0,,55,55,,3,,,24112,517,,,,,,584,,4,0,,,,,527,423,25656,647,25656,647,,,,,,0,,0 +"2020-04-21","IA",83,,4,,,,214,0,,89,23974,1313,,,,,60,3641,3641,482,0,,,,,,1293,,0,27615,1795,,,,,,0,,0 +"2020-04-21","ID",48,,3,,157,157,69,6,58,,16071,298,,,,,,1736,,64,0,,,,,,660,,0,17807,362,,,,,17807,362,,0 +"2020-04-21","IL",1468,,119,,,,4776,0,,1226,,0,,,,,781,33059,,1551,0,,,,,,,,0,154997,6639,,,,,,0,154997,6639 +"2020-04-21","IN",630,,61,,,,,0,,676,55167,2214,,,,,368,12097,,411,0,,,,,12365,,,0,85700,4862,,,,,,0,85700,4862 +"2020-04-21","KS",107,,7,,419,419,,14,,,17076,301,,,,,,2025,,39,0,,,,,,,,0,19101,340,,,,,,0,,0 +"2020-04-21","KY",154,,6,,1059,1059,263,0,582,147,,0,,,,,,3050,,90,0,,,,,,1174,,0,32820,248,,,,,,0,32820,248 +"2020-04-21","LA",1405,,77,,,,1798,0,,,111588,0,,,,,297,24854,24854,331,0,,,,,,,,0,136442,331,,,,,,0,,0 +"2020-04-21","MA",2449,,146,,4009,4009,3977,137,,1040,141444,5398,,,,,,43168,,1752,0,,,,,54261,,,0,232074,11823,,,,,,0,232074,11823 +"2020-04-21","MD",732,692,49,40,3158,3158,1433,144,,526,59442,1729,,,,,,14193,14193,509,0,,,,,17293,930,,0,82129,2188,,,,,,0,82129,2188 +"2020-04-21","ME",36,,1,,139,139,40,1,,16,,0,,,,,8,888,888,13,0,,,,,1112,443,,0,20687,372,,,,,,0,20687,372 +"2020-04-21","MI",3471,3428,124,171,,,3357,0,,1346,,0,,,99667,,1107,39589,38208,1095,0,,,,,43146,3237,,0,142813,7609,,,,,,0,142813,7609 +"2020-04-21","MN",160,,17,,629,629,237,27,253,117,48341,1487,,,,,,3452,3452,262,0,,,,,,1094,51793,1749,51793,1749,,,,,,0,,0 +"2020-04-21","MO",189,,12,,,,1001,0,,,51179,973,,21,52207,,,5941,5941,134,0,,,6,,6778,,,0,59056,980,,,28,,,0,59056,980 +"2020-04-21","MP",2,,0,,,,,0,,,51,0,,,,,,14,,0,0,,,,,,11,,0,65,0,,,,,,0,,0 +"2020-04-21","MS",183,,14,,858,858,548,39,,146,47648,726,,,,,89,4716,,204,0,,,,,,,,0,52364,930,,,,,,0,,0 +"2020-04-21","MT",12,,2,,59,59,14,2,,,,0,,,,,,437,,4,0,,,,,,273,,0,11241,190,,,,,,0,11241,190 +"2020-04-21","NC",213,,34,,,,427,0,,,,0,,,,,,6951,,187,0,,,,,,,,0,96402,773,,,,,,0,96402,773 +"2020-04-21","ND",13,,0,,54,54,17,1,,,14343,223,,,,,,644,644,18,0,,,,,,214,15419,269,15419,269,,,,,14230,202,15642,272 +"2020-04-21","NE",33,,5,,,,,0,,,14724,518,,,16092,,,1648,,174,0,,,,,1777,,,0,17999,808,,,,,16478,722,17999,808 +"2020-04-21","NH",42,,1,,206,206,78,8,,,12848,122,,,,,,1491,,99,0,,,,,,521,,0,15948,594,5,,,,,0,15948,594 +"2020-04-21","NJ",5932,4753,414,1179,,,7594,0,,1930,92439,3188,,,,,1501,92387,92387,3581,0,,,,,,,,0,184826,6769,,,,,184826,6769,,0 +"2020-04-21","NM",65,,7,,306,306,119,15,,,,0,,,,,,2072,,101,0,,,,,,529,,0,40877,2122,,,,,,0,40877,2122 +"2020-04-21","NV",193,,13,,,,,0,,,29118,601,,,,,,3937,3937,107,0,,,,,,,37826,1361,37826,1361,,,,,,0,40464,936 +"2020-04-21","NY",14828,,481,,67271,67271,16135,1302,,4729,,0,,,,,,251690,,4178,0,,,,,,,649325,15464,649325,15464,,,,,,0,,0 +"2020-04-21","OH",557,538,48,19,2779,2779,,126,838,,,0,,,,,,13725,13250,806,0,,,,,14028,,,0,96404,3765,,,,,,0,96404,3765 +"2020-04-21","OK",164,,21,,561,561,346,20,,164,41537,8571,,,,,,2807,2807,127,0,,,,,,1702,,0,44344,8698,,,,,,0,,0 +"2020-04-21","OR",75,,1,,465,465,303,9,,74,38089,961,,,38474,,35,1956,,46,0,,,,,5501,,,0,43975,1946,,,,,,0,43975,1946 +"2020-04-21","PA",1564,,360,,,,2743,0,,,132323,2603,,,,,673,34528,,1296,0,,,,,,,174946,4068,174946,4068,,,,,166851,3899,,0 +"2020-04-21","PR",64,,1,,,,117,0,,,8789,303,,,,,,1298,,46,0,,,,,,,,0,10087,349,,,,,,0,,0 +"2020-04-21","RI",186,,11,,674,674,309,45,,67,32606,1723,,,36991,,43,5972,,387,0,,,,,6361,,40679,2301,40679,2301,,,,,38578,2110,43352,2559 +"2020-04-21","SC",124,,4,,776,776,,0,,,36838,735,,,,,,4439,4439,62,0,,,,,,2063,,0,41277,797,,,,,,0,,0 +"2020-04-21","SD",8,,1,,100,100,65,13,,,11060,419,,,,,,1755,,70,0,,,,,2541,824,,0,13201,372,,,,,12815,489,13201,372 +"2020-04-21","TN",157,,5,,760,760,523,30,,,,0,,,100788,,,7394,,156,0,,,,,7394,3828,,0,108182,7493,,,,,,0,108182,7493 +"2020-04-21","TX",517,,22,,,,1419,0,,,,0,,,,,,20196,20196,738,0,,,,,26963,6486,,0,262959,13767,,,,,,0,262959,13767 +"2020-04-21","UT",32,,4,,277,277,,9,,,73752,5310,,,76354,,,3296,,83,0,,,,,3675,888,,0,80029,5692,,,,,77190,5467,80029,5692 +"2020-04-21","VA",324,321,24,3,1500,1500,1331,78,,403,,0,,,,,251,9630,9451,640,0,14,9,,,13382,,75079,1974,75079,1974,69,27,,,,0,,0 +"2020-04-21","VI",3,,0,,,,,0,,,574,20,,,,,,54,,1,0,,,,,,48,,0,628,21,,,,,,0,,0 +"2020-04-21","VT",40,,2,,,,41,0,,,10739,44,,,,,,820,820,3,0,,,,,,,,0,12947,159,,,,,11559,47,12947,159 +"2020-04-21","WA",640,,11,,,,503,0,,161,,0,,,,,,12633,12633,96,0,,,,,,,174818,4791,174818,4791,,,,,165706,4202,,0 +"2020-04-21","WI",242,,12,,1252,1252,358,41,324,137,47841,1238,,,,,,5509,4620,156,0,,,,,,,57413,2006,57413,2006,,,,,,0,,0 +"2020-04-21","WV",26,,2,,,,85,0,,42,,0,,,,,24,914,914,12,0,,,,,,330,,0,20096,275,,,,,,0,20096,275 +"2020-04-21","WY",6,,4,,52,52,19,1,,,7301,228,,,8024,,,441,322,13,0,,,,,356,237,,0,8380,297,,,,,,0,8380,297 +"2020-04-20","AK",9,,0,,37,37,46,0,,,,0,,,,,,321,,2,0,,,,,,161,,0,10124,229,,,,,,0,10124,229 +"2020-04-20","AL",167,,13,,641,641,397,0,260,,40875,0,,,,157,,5025,5025,188,0,,,,,,,,0,45900,188,,,,,45900,188,,0 +"2020-04-20","AR",42,,2,,291,291,93,0,,,24630,2202,,,,57,24,1923,1923,142,0,,,,,,749,,0,26553,2344,,,,,,0,26553,2344 +"2020-04-20","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-20","AZ",187,,3,,1454,1454,637,67,,285,49436,1375,,,,,181,5064,,135,0,,,,,,,,0,66619,967,,,,,54500,1510,66619,967 +"2020-04-20","CA",1208,,42,,,,4674,0,,1480,259522,8955,,,,,,30978,,645,0,,,,,,,,0,290500,9600,,,,,,0,290500,9600 +"2020-04-20","CO",449,,27,,1880,1880,861,67,,,37360,895,,,,,,10106,,376,0,,,,,,,52768,1477,52768,1477,,,,,47466,1271,,0 +"2020-04-20","CT",1331,868,245,,,,1919,0,,,,0,,,46901,,,19815,,2265,0,,,,,24500,,,0,71485,1594,,,,,,0,71485,1594 +"2020-04-20","DC",105,,9,,,,402,0,,120,,0,,,,,69,2927,,134,0,,,,,,630,14113,414,14113,414,,,,,,0,,0 +"2020-04-20","DE",99,89,9,10,,,256,0,,,12508,252,,,,,,2745,,207,0,,,,,3825,495,21927,942,21927,942,,,,,,0,,0 +"2020-04-20","FL",806,,25,,4010,4010,,80,,,239565,9482,,,,,,25360,,713,0,,,,,,,258121,9218,258121,9218,,,,,,0,,0 +"2020-04-20","GA",733,,46,,3550,3550,,86,,,,0,,,,,,18947,,646,0,,,,,15109,,,0,87423,4096,,,,,,0,87423,4096 +"2020-04-20","GU",5,,0,,,,3,0,,2,991,48,,,,,,133,133,0,0,,,,,,112,,0,1124,48,,,,,,0,,0 +"2020-04-20","HI",10,10,1,,52,52,,1,,,23595,699,,,,,,580,,6,0,,,,,523,414,25009,913,25009,913,,,,,,0,,0 +"2020-04-20","IA",79,,4,,,,214,0,,91,22661,1013,,,,,58,3159,3159,257,0,,,,,,1235,,0,25820,1270,,,,,,0,,0 +"2020-04-20","ID",45,,1,,151,151,53,0,53,,15773,0,,,,,,1672,,4,0,,,,,,585,,0,17445,4,,,,,17445,4,,0 +"2020-04-20","IL",1349,,59,,,,4599,0,,1239,,0,,,,,757,31508,,1151,0,,,,,,,,0,148358,5040,,,,,,0,148358,5040 +"2020-04-20","IN",569,,7,,,,,0,,669,52953,3021,,,,,353,11686,,476,0,,,,,11648,,,0,80838,1338,,,,,,0,80838,1338 +"2020-04-20","KS",100,,8,,405,405,,15,,,16775,494,,,,,,1986,,137,0,,,,,,,,0,18761,631,,,,,,0,,0 +"2020-04-20","KY",148,,4,,1059,1059,274,0,534,155,,0,,,,,,2960,,253,0,,,,,,1174,,0,32572,347,,,,,,0,32572,347 +"2020-04-20","LA",1328,,32,,,,1794,0,,,111588,168,,,,,332,24523,24523,595,0,,,,,,,,0,136111,763,,,,,,0,,0 +"2020-04-20","MA",2303,,157,,3872,3872,3872,83,,987,136046,6751,,,,,,41416,,1596,0,,,,,51550,,,0,220251,12963,,,,,,0,220251,12963 +"2020-04-20","MD",683,644,57,39,3014,3014,,128,,,57713,2652,,,,,,13684,13684,854,0,,,,,16749,917,,0,79941,3952,,,,,,0,79941,3952 +"2020-04-20","ME",35,,1,,138,138,39,2,,16,,0,,,,,9,875,875,8,0,,,,,1100,414,,0,20315,497,,,,,,0,20315,497 +"2020-04-20","MI",3347,3300,111,169,,,3374,0,,1346,,0,,,93393,,1102,38494,37170,937,0,,,,,41811,3237,,0,135204,4527,,,,,,0,135204,4527 +"2020-04-20","MN",143,,9,,602,602,237,28,241,126,46854,566,,,,,,3190,3190,276,0,,,,,,1059,50044,842,50044,842,,,,,,0,,0 +"2020-04-20","MO",177,,1,,,,873,0,,,50206,1964,,19,51379,,,5807,5807,140,0,,,5,,6628,,,0,58076,1242,,,25,,,0,58076,1242 +"2020-04-20","MP",2,,0,,,,,0,,,51,9,,,,,,14,,0,0,,,,,,11,,0,65,9,,,,,,0,,0 +"2020-04-20","MS",169,,10,,819,819,548,11,,146,46922,12131,,,,,89,4512,,238,0,,,,,,,,0,51434,12369,,,,,,0,,0 +"2020-04-20","MT",10,,0,,57,57,19,2,,,,0,,,,,,433,,0,0,,,,,,243,,0,11051,153,,,,,,0,11051,153 +"2020-04-20","NC",179,,7,,,,373,0,,,,0,,,,,,6764,,271,0,,,,,,,,0,95629,2592,,,,,,0,95629,2592 +"2020-04-20","ND",13,,3,,53,53,17,2,,,14120,1075,,,,,,626,626,42,0,,,,,,189,15150,893,15150,893,,,,,14028,751,15370,912 +"2020-04-20","NE",28,,0,,,,,0,,,14206,918,,,15483,,,1474,,187,0,,,,,1583,,,0,17191,1125,,,,,15756,1104,17191,1125 +"2020-04-20","NH",41,,3,,198,198,79,6,,,12726,644,,,,,,1392,,50,0,,,,,,521,,0,15354,653,,,,,,0,15354,653 +"2020-04-20","NJ",5518,4377,208,1141,,,6986,0,,2018,89251,3864,,,,,1594,88806,88806,3505,0,,,,,,,,0,178057,7369,,,,,178057,7369,,0 +"2020-04-20","NM",58,,3,,291,291,116,17,,,,0,,,,,,1971,,126,0,,,,,,501,,0,38755,1713,,,,,,0,38755,1713 +"2020-04-20","NV",180,,8,,,,,0,,,28517,647,,,,,,3830,3830,102,0,,,,,,,36465,458,36465,458,,,,,,0,39528,860 +"2020-04-20","NY",14347,,478,,65969,65969,16103,1419,,4814,,0,,,,,,247512,,4726,0,,,,,,,633861,16306,633861,16306,,,,,,0,,0 +"2020-04-20","OH",509,491,38,18,2653,2653,,88,798,,,0,,,,,,12919,12516,1317,0,,,,,12672,,,0,92639,4397,,,,,,0,92639,4397 +"2020-04-20","OK",143,,3,,541,541,307,0,,136,32966,0,,,,,,2680,2680,81,0,,,,,,1614,,0,35646,81,,,,,,0,,0 +"2020-04-20","OR",74,,2,,456,456,290,7,,74,37128,1389,,,36703,,37,1910,,66,0,,,,,5326,,,0,42029,2388,,,,,,0,42029,2388 +"2020-04-20","PA",1204,,92,,,,2701,0,,,129720,3150,,,,,659,33232,,948,0,,,,,,,170878,4330,170878,4330,,,,,162952,4098,,0 +"2020-04-20","PR",63,,1,,,,151,0,,,8486,206,,,,,,1252,,39,0,,,,,,,,0,9738,245,,,,,,0,,0 +"2020-04-20","RI",175,,11,,629,629,297,24,,62,30883,1594,,,34877,,45,5585,,378,0,,,,,5916,,38378,2428,38378,2428,,,,,36468,1972,40793,2305 +"2020-04-20","SC",120,,0,,776,776,,0,,,36103,0,,,,,,4377,4377,0,0,,,,,,2063,,0,40480,0,,,,,,0,,0 +"2020-04-20","SD",7,,0,,87,87,,13,,,10641,214,,,,,,1685,,50,0,,,,,2492,709,,0,12829,362,,,,,12326,264,12829,362 +"2020-04-20","TN",152,,4,,730,730,505,6,,,,0,,,93451,,,7238,,168,0,,,,,7238,3575,,0,100689,3591,,,,,,0,100689,3591 +"2020-04-20","TX",495,,18,,,,1411,0,,,,0,,,,,,19458,19458,535,0,,,,,25388,5706,,0,249192,3362,,,,,,0,249192,3362 +"2020-04-20","UT",28,,1,,268,268,,9,,,68442,2905,,,70836,,,3213,,144,0,,,,,3501,776,,0,74337,3158,,,,,71723,2987,74337,3158 +"2020-04-20","VA",300,,23,,1422,1422,1296,126,,396,,0,,,,,237,8990,,453,0,4,9,,,12913,,73105,2439,73105,2439,36,27,,,,0,,0 +"2020-04-20","VI",3,,0,,,,,0,,,554,6,,,,,,53,,0,0,,,,,,48,,0,607,6,,,,,,0,,0 +"2020-04-20","VT",38,,0,,,,49,0,,,10695,181,,,,,,817,817,4,0,,,,,,15,,0,12788,307,,,,,11512,185,12788,307 +"2020-04-20","WA",629,,14,,,,403,0,,122,,0,,,,,,12537,12537,176,0,,,,,,,170027,4968,170027,4968,,,,,161504,4388,,0 +"2020-04-20","WI",230,,10,,1211,1211,357,21,307,142,46603,1280,,,,,,5353,4499,177,0,,,,,,,55407,1326,55407,1326,,,,,,0,,0 +"2020-04-20","WV",24,,6,,,,77,0,,37,,0,,,,,23,902,902,39,0,,,,,,290,,0,19821,1860,,,,,,0,19821,1860 +"2020-04-20","WY",2,,0,,51,51,19,1,,,7073,101,,,7736,,,428,317,2,0,,,,,347,233,,0,8083,299,,,,,,0,8083,299 +"2020-04-19","AK",9,,0,,37,37,37,0,,,,0,,,,,,319,,5,0,,,,,,153,,0,9895,240,,,,,,0,9895,240 +"2020-04-19","AL",154,,8,,641,641,360,21,260,,40875,2992,,,,157,,4837,4837,182,0,,,,,,,,0,45712,3174,,,,,45712,3174,,0 +"2020-04-19","AR",40,,2,,291,291,88,0,,,22428,26,,,,57,25,1781,1781,42,0,,,,,,721,,0,24209,68,,,,,,0,24209,68 +"2020-04-19","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-19","AZ",184,,7,,1387,1387,631,46,,283,48061,1735,,,,,187,4929,,210,0,,,,,,,,0,65652,981,,,,,52990,1945,65652,981 +"2020-04-19","CA",1166,,94,,,,4731,0,,1457,250567,19864,,,,,,30333,,1370,0,,,,,,,,0,280900,21234,,,,,,0,280900,21234 +"2020-04-19","CO",422,,11,,1813,1813,874,16,,,36465,1292,,,,,,9730,,297,0,,,,,,,51291,1826,51291,1826,,,,,46195,1589,,0 +"2020-04-19","CT",1086,671,50,,,,1938,0,,,,0,,,45754,,,17550,,741,0,,,,,24060,,,0,69891,2227,,,,,,0,69891,2227 +"2020-04-19","DC",96,,5,,,,313,0,,105,,0,,,,,79,2793,,127,0,,,,,,622,13699,431,13699,431,,,,,,0,,0 +"2020-04-19","DE",90,80,4,10,,,249,0,,,12256,562,,,,,,2538,,215,0,,,,,3465,466,20985,791,20985,791,,,,,,0,,0 +"2020-04-19","FL",781,,27,,3930,3930,,88,,,230083,8825,,,,,,24647,,741,0,,,,,,,248903,9158,248903,9158,,,,,,0,,0 +"2020-04-19","GA",687,,14,,3464,3464,,44,,,,0,,,,,,18301,,632,0,,,,,14613,,,0,83327,3977,,,,,,0,83327,3977 +"2020-04-19","GU",5,,0,,,,6,0,,2,943,0,,,,,,133,133,0,0,,,,,,112,,0,1076,0,,,,,,0,,0 +"2020-04-19","HI",9,9,0,,51,51,,3,,,22896,1106,,,,,,574,,21,0,,,,,516,410,24096,942,24096,942,,,,,,0,,0 +"2020-04-19","IA",75,,1,,,,198,0,,86,21648,1214,,,,,54,2902,2902,389,0,,,,,,1171,,0,24550,1603,,,,,,0,,0 +"2020-04-19","ID",44,,1,,151,151,43,0,53,,15773,481,,,,,,1668,,13,0,,,,,,520,,0,17441,494,,,,,17441,494,,0 +"2020-04-19","IL",1290,,31,,,,4314,0,,1196,,0,,,,,749,30357,,1197,0,,,,,,,,0,143318,5914,,,,,,0,143318,5914 +"2020-04-19","IN",562,,17,,,,,0,,649,49932,3700,,,,,342,11210,,569,0,,,,,11413,,,0,79500,2006,,,,,,0,79500,2006 +"2020-04-19","KS",92,,6,,390,390,,7,,,16281,395,,,,,,1849,,59,0,,,,,,,,0,18130,454,,,,,,0,,0 +"2020-04-19","KY",144,,7,,1059,1059,274,51,534,155,,0,,,,,,2707,,185,0,,,,,,1174,,0,32225,1629,,,,,,0,32225,1629 +"2020-04-19","LA",1296,,29,,,,1748,0,,,111420,-2999,,,,,349,23928,23928,348,0,,,,,,,,0,135348,-2651,,,,,,0,,0 +"2020-04-19","MA",2146,,163,,3789,3789,3789,61,,987,129295,4691,,,,,,39820,,2293,0,,,,,48441,,,0,207288,5596,,,,,,0,207288,5596 +"2020-04-19","MD",626,592,44,34,2886,2886,,129,,,55061,1999,,,,,,12830,12830,522,0,,,,,15669,914,,0,75989,2739,,,,,,0,75989,2739 +"2020-04-19","ME",34,,2,,136,136,46,0,,18,,0,,,,,9,867,867,20,0,,,,,1090,393,,0,19818,517,,,,,,0,19818,517 +"2020-04-19","MI",3236,3178,129,160,,,3403,0,,1344,,0,,,89758,,1115,37557,36293,528,0,,,,,40919,3237,,0,130677,3286,,,,,,0,130677,3286 +"2020-04-19","MN",134,,13,,574,574,228,13,226,116,46288,1106,,,,,,2914,2914,126,0,,,,,,1026,49202,1232,49202,1232,,,,,,0,,0 +"2020-04-19","MO",176,,1,,,,875,0,,,48242,0,,9,50308,,,5667,5667,150,0,,,2,,6457,,,0,56834,2327,,,11,,,0,56834,2327 +"2020-04-19","MP",2,,0,,,,,0,,,42,0,,,,,,14,,0,0,,,,,,9,,0,56,0,,,,,,0,,0 +"2020-04-19","MS",159,,7,,808,808,,26,,138,34791,0,,,,,79,4274,,300,0,,,,,,,,0,39065,300,,,,,,0,,0 +"2020-04-19","MT",10,,0,,55,55,18,0,,,,0,,,,,,433,,7,0,,,,,,243,,0,10898,329,,,,,,0,10898,329 +"2020-04-19","NC",172,,8,,,,465,0,,,,0,,,,,,6493,,353,0,,,,,,,,0,93037,3600,,,,,,0,93037,3600 +"2020-04-19","ND",10,,1,,51,51,15,4,,,13045,610,,,,,,584,584,56,0,,,,,,189,14257,932,14257,932,,,,,13277,818,14458,955 +"2020-04-19","NE",28,,4,,,,,0,,,13288,749,,,14558,,,1287,,149,0,,,,,1385,,,0,16066,1064,,,,,14652,899,16066,1064 +"2020-04-19","NH",38,,1,,192,192,85,2,,,12082,517,,,,,,1342,,55,0,,,,,,513,,0,14701,601,,,,,,0,14701,601 +"2020-04-19","NJ",5310,4202,171,1108,,,7494,0,,1940,85387,4271,,,,,1628,85301,85301,3881,0,,,,,,,,0,170688,8152,,,,,170688,8152,,0 +"2020-04-19","NM",55,,2,,274,274,103,16,,,,0,,,,,,1845,,47,0,,,,,,487,,0,37042,410,,,,,,0,37042,410 +"2020-04-19","NV",172,,4,,,,,0,,,27870,745,,,,,,3728,3728,102,0,,,,,,,36007,810,36007,810,,,,,,0,38668,1270 +"2020-04-19","NY",13869,,507,,64550,64550,16213,1447,,4878,,0,,,,,,242786,,6054,0,,,,,,,617555,21023,617555,21023,,,,,,0,,0 +"2020-04-19","OH",471,453,20,18,2565,2565,,46,765,,,0,,,,,,11602,11292,1380,0,,,,,11198,,,0,88242,4418,,,,,,0,88242,4418 +"2020-04-19","OK",140,,1,,541,541,307,0,,136,32966,0,,,,,,2599,2599,29,0,,,,,,1575,,0,35565,29,,,,,,0,,0 +"2020-04-19","OR",72,,2,,449,449,290,22,,74,35739,1203,,,34536,,37,1844,,59,0,,,,,5105,,,0,39641,2058,,,,,,0,39641,2058 +"2020-04-19","PA",1112,,276,,,,2634,0,,,126570,3674,,,,,657,32284,,1215,0,,,,,,,166548,5317,166548,5317,,,,,158854,4889,,0 +"2020-04-19","PR",62,,2,,,,160,0,,,8280,225,,,,,,1213,,95,0,,,,,,,,0,9493,320,,,,,,0,,0 +"2020-04-19","RI",164,,14,,605,605,298,27,,66,29289,1762,,,32968,,37,5207,,339,0,,,,,5520,,35950,2046,35950,2046,,,,,34496,2101,38488,2441 +"2020-04-19","SC",120,,1,,776,776,,0,,,36103,1516,,,,,,4377,4377,131,0,,,,,,2633,,0,40480,1647,,,,,,0,,0 +"2020-04-19","SD",7,,0,,74,74,,6,,,10427,309,,,,,,1635,,93,0,,,,,2432,646,,0,12467,620,,,,,12062,402,12467,620 +"2020-04-19","TN",148,,3,,724,724,393,5,,,,0,,,90028,,,7070,,308,0,,,,,7070,3344,,0,97098,6512,,,,,,0,97098,6512 +"2020-04-19","TX",477,,24,,,,1471,0,,,,0,,,,,,18923,18923,663,0,,,,,25049,5334,,0,245830,6314,,,,,,0,245830,6314 +"2020-04-19","UT",27,,2,,259,259,,8,,,65537,4038,,,67781,,,3069,,138,0,,,,,3398,679,,0,71179,4364,,,,,68736,4158,71179,4364 +"2020-04-19","VA",277,,19,,1296,1296,1319,75,,388,,0,,,,,231,8537,,484,0,4,8,,,12352,,70666,2706,70666,2706,27,26,,,,0,,0 +"2020-04-19","VI",3,,0,,,,,0,,,548,158,,,,,,53,,0,0,,,,,,48,,0,601,158,,,,,,0,,0 +"2020-04-19","VT",38,,0,,,,53,0,,,10514,168,,,,,,813,813,11,0,,,,,,15,,0,12481,295,,,,,11327,179,12481,295 +"2020-04-19","WA",615,,17,,,,586,0,,193,,0,,,,,,12361,12361,347,0,,,,,,,165059,1967,165059,1967,,,,,157116,1677,,0 +"2020-04-19","WI",220,,9,,1190,1190,357,14,307,137,45323,1361,,,,,,5176,4346,163,0,,,,,,,54081,1990,54081,1990,,,,,,0,,0 +"2020-04-19","WV",18,,2,,,,72,0,,37,,0,,,,,25,863,863,78,0,,,,,,265,,0,17961,666,,,,,,0,17961,666 +"2020-04-19","WY",2,,0,,50,50,19,0,,,6972,755,,,7446,,,426,313,4,0,,,,,338,227,,0,7784,83,,,,,,0,7784,83 +"2020-04-18","AK",9,,0,,37,37,39,0,,,,0,,,,,,314,,5,0,,,,,,147,,0,9655,205,,,,,,0,9655,205 +"2020-04-18","AL",146,,2,,620,620,359,26,247,,37883,4565,,,,148,,4655,4655,125,0,,,,,,,,0,42538,4690,,,,,42538,4690,,0 +"2020-04-18","AR",38,,1,,291,291,86,161,,,22402,603,,,,57,22,1739,1739,44,0,,,,,,703,,0,24141,647,,,,,,0,24141,647 +"2020-04-18","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-18","AZ",177,,8,,1341,1341,566,52,,285,46326,1603,,,,,178,4719,,212,0,,,,,,,,0,64671,2458,,,,,51045,1815,64671,2458 +"2020-04-18","CA",1072,,87,,,,4936,0,,1490,230703,6617,,,,,,28963,,1435,0,,,,,,,,0,259666,8052,,,,,,0,259666,8052 +"2020-04-18","CO",411,,20,,1797,1797,874,42,,,35173,913,,,,,,9433,,386,0,,,,,,,49465,1581,49465,1581,,,,,44606,1299,,0 +"2020-04-18","CT",1036,602,0,,,,1946,0,,,,0,,,44127,,,16809,,0,0,,,,,23466,,,0,67664,3698,,,,,,0,67664,3698 +"2020-04-18","DC",91,,5,,,,313,0,,105,,0,,,,,79,2666,,190,0,,,,,,608,13268,625,13268,625,,,,,,0,,0 +"2020-04-18","DE",86,77,10,9,,,224,0,,,11694,0,,,,,,2323,,0,0,,,,,3258,423,20194,971,20194,971,,,,,,0,,0 +"2020-04-18","FL",754,,55,,3842,3842,,177,,,221258,10540,,,,,,23906,,1083,0,,,,,,,239745,12795,239745,12795,,,,,,0,,0 +"2020-04-18","GA",673,,23,,3420,3420,,96,,,,0,,,,,,17669,,475,0,,,,,14183,,,0,79350,7664,,,,,,0,79350,7664 +"2020-04-18","GU",5,,0,,,,6,0,,2,943,3,,,,,,133,,0,0,,,,,,110,,0,1076,3,,,,,,0,,0 +"2020-04-18","HI",9,9,0,,48,48,,3,,,21790,474,,,,,,553,,12,0,,,,,496,390,23154,716,23154,716,,,,,,0,,0 +"2020-04-18","IA",74,,10,,,,193,0,,84,20434,974,,,,,51,2513,2513,181,0,,,,,,1095,,0,22947,1155,,,,,,0,,0 +"2020-04-18","ID",43,,2,,151,151,53,3,53,,15292,249,,,,,,1655,,46,0,,,,,,453,,0,16947,295,,,,,16947,295,,0 +"2020-04-18","IL",1259,,125,,,,4340,0,,1192,,0,,,,,740,29160,,1585,0,,,,,,,,0,137404,7241,,,,,,0,137404,7241 +"2020-04-18","IN",545,,26,,,,,0,,663,46232,1601,,,,,360,10641,,487,0,,,,,11160,,,0,77494,4831,,,,,,0,77494,4831 +"2020-04-18","KS",86,,2,,383,383,,8,,,15886,690,,,,,,1790,,85,0,,,,,,,,0,17676,775,,,,,,0,,0 +"2020-04-18","KY",137,,8,,1008,1008,360,37,514,227,,0,,,,,,2522,,93,0,,,,,,979,,0,30596,849,,,,,,0,30596,849 +"2020-04-18","LA",1267,,54,,,,1761,0,,,114419,5550,,,,,347,23580,23580,462,0,,,,,,,,0,137999,6012,,,,,,0,,0 +"2020-04-18","MA",1983,,161,,3728,3728,3728,-28,,987,124604,7409,,,,,,37527,,2402,0,,,,,47174,,,0,201692,7478,,,,,,0,201692,7478 +"2020-04-18","MD",582,550,41,32,2757,2757,,145,,,53062,2625,,,,,,12308,12308,736,0,,,,,15055,771,,0,73250,3776,,,,,,0,73250,3776 +"2020-04-18","ME",32,,3,,136,136,49,3,,20,,0,,,,,12,847,847,20,0,,,,,1066,382,,0,19301,591,,,,,,0,19301,591 +"2020-04-18","MI",3107,3076,123,152,,,3634,0,,1423,,0,,,87114,,1203,37029,35789,709,0,,,,,40277,3237,,0,127391,4884,,,,,,0,127391,4884 +"2020-04-18","MN",121,,10,,561,561,239,43,215,111,45182,1362,,,,,,2788,2788,120,0,,,,,,997,47970,1482,47970,1482,,,,,,0,,0 +"2020-04-18","MO",175,,10,,,,875,0,,,48242,1808,,7,48182,,,5517,5517,234,0,,,1,,6260,,,0,54507,2063,,,8,,,0,54507,2063 +"2020-04-18","MP",2,,0,,,,,0,,,42,0,,,,,,14,,1,0,,,,,,9,,0,56,1,,,,,,0,,0 +"2020-04-18","MS",152,,12,,782,782,,46,,154,34791,0,,,,,99,3974,,181,0,,,,,,,,0,38765,181,,,,,,0,,0 +"2020-04-18","MT",10,,2,,55,55,17,1,,,,0,,,,,,426,,4,0,,,,,,234,,0,10569,325,,,,,,0,10569,325 +"2020-04-18","NC",164,,12,,,,388,0,,,,0,,,,,,6140,,281,0,,,,,,,,0,89437,2472,,,,,,0,89437,2472 +"2020-04-18","ND",9,,0,,47,47,13,0,,,12435,532,,,,,,528,528,90,0,,,,,,183,13325,696,13325,696,,,,,12459,634,13503,713 +"2020-04-18","NE",24,,0,,,,,0,,,12539,501,,,13651,,,1138,,72,0,,,,,1231,,,0,15002,525,,,,,13753,580,15002,525 +"2020-04-18","NH",37,,0,,190,190,86,0,,,11565,144,,,,,,1287,,0,0,,,,,,468,,0,14100,565,,,,,,0,14100,565 +"2020-04-18","NJ",5139,4070,286,1069,,,7718,0,,2024,81116,2134,,,,,1641,81420,81420,2953,0,,,,,,,,0,162536,5087,,,,,162536,5087,,0 +"2020-04-18","NM",53,,2,,258,258,92,16,,,,0,,,,,,1798,,87,0,,,,,,465,,0,36632,1019,,,,,,0,36632,1019 +"2020-04-18","NV",168,,6,,,,,0,,,27125,887,,,,,,3626,3626,102,0,,,,,,,35197,1316,35197,1316,,,,,,0,37398,1443 +"2020-04-18","NY",13362,,540,,63103,63103,16967,1983,,4996,,0,,,,,,236732,,7090,0,,,,,,,596532,23309,596532,23309,,,,,,0,,0 +"2020-04-18","OH",451,434,33,17,2519,2519,,95,760,,,0,,,,,,10222,9939,1115,0,,,,,10152,,,0,83824,3877,,,,,,0,83824,3877 +"2020-04-18","OK",139,,3,,541,541,307,13,,136,32966,1811,,,,,,2570,2570,105,0,,,,,,1515,,0,35536,1916,,,,,,0,,0 +"2020-04-18","OR",70,,6,,427,427,301,13,,69,34536,1334,,,32635,,41,1785,,49,0,,,,,4948,,,0,37583,2300,,,,,,0,37583,2300 +"2020-04-18","PA",836,,80,,,,2613,0,,,122896,4964,,,,,660,31069,,1628,0,,,,,,,161231,7149,161231,7149,,,,,153965,6592,,0 +"2020-04-18","PR",60,,2,,,,165,0,,,8055,191,,,,,,1118,,50,0,,,,,,,,0,9173,241,,,,,,0,,0 +"2020-04-18","RI",150,,32,,578,578,293,247,,67,27527,1370,,,30909,,43,4868,,283,0,,,,,5138,,33904,2125,33904,2125,,,,,32395,1653,36047,2050 +"2020-04-18","SC",119,,10,,776,776,,101,,,34587,2234,,,,,,4246,4246,315,0,,,,,,2633,,0,38833,2549,,,,,,0,,0 +"2020-04-18","SD",7,,0,,68,68,,5,,,10118,467,,,,,,1542,,131,0,,,,,2318,552,,0,11847,589,,,,,11660,598,11847,589 +"2020-04-18","TN",145,,3,,719,719,593,8,,,,0,,,83824,,,6762,,173,0,,,,,6762,3234,,0,90586,3313,,,,,,0,90586,3313 +"2020-04-18","TX",453,,25,,,,1321,0,,,,0,,,,,,18260,18260,889,0,,,,,24534,4806,,0,239516,12853,,,,,,0,239516,12853 +"2020-04-18","UT",25,,2,,251,251,,7,,,61499,4258,,,63547,,,2931,,126,0,,,,,3268,565,,0,66815,4664,,,,,64578,4438,66815,4664 +"2020-04-18","VA",258,,27,,1221,1221,1307,107,,398,,0,,,,,230,8053,,562,0,3,8,,,11808,,67960,3305,67960,3305,9,26,,,,0,,0 +"2020-04-18","VI",3,,1,,,,,0,,,390,17,,,,,,53,,2,0,,,,,,46,,0,443,19,,,,,,0,,0 +"2020-04-18","VT",38,,3,,,,56,0,,,10346,292,,,,,,802,802,10,0,,,,,,15,,0,12186,502,,,,,11148,302,12186,502 +"2020-04-18","WA",598,,13,,,,518,0,,155,,0,,,,,,12014,12014,309,0,,,,,,,163092,2568,163092,2568,,,,,155439,2246,,0 +"2020-04-18","WI",211,,6,,1176,1176,361,23,307,136,43962,1597,,,,,,5013,4199,174,0,,,,,,,52091,2108,52091,2108,,,,,,0,,0 +"2020-04-18","WV",16,,3,,,,83,0,,40,,0,,,,,27,785,785,31,0,,,,,,255,,0,17295,670,,,,,,0,17295,670 +"2020-04-18","WY",2,,0,,50,50,19,7,,,6217,86,,,7367,,,422,309,10,0,,,,,334,206,,0,7701,99,,,,,,0,7701,99 +"2020-04-17","AK",9,,0,,37,37,,1,,,,0,,,,,,309,,9,0,,,,,,128,,0,9450,715,,,,,,0,9450,715 +"2020-04-17","AL",144,,11,,594,594,364,41,247,,33318,1272,,,,148,,4530,4530,185,0,,,,,,,,0,37848,1457,,,,,37848,1457,,0 +"2020-04-17","AR",37,,0,,130,130,83,0,,,21799,744,,,,39,21,1695,1695,75,0,,,,,,593,,0,23494,819,,,,,,0,23494,819 +"2020-04-17","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-17","AZ",169,,19,,1289,1289,566,31,,285,44723,1559,,,,,178,4507,,273,0,,,,,,,,0,62213,2335,,,,,49230,1832,62213,2335 +"2020-04-17","CA",985,,95,,,,4892,0,,1484,224086,3868,,,,,,27528,,1346,0,,,,,,,,0,251614,5214,,,,,,0,251614,5214 +"2020-04-17","CO",391,,17,,1755,1755,843,62,,,34260,1105,,,,,,9047,,372,0,,,,,,,47884,1706,47884,1706,,,,,43307,1477,,0 +"2020-04-17","CT",1036,554,65,,,,1946,0,,,,0,,,41564,,,16809,,925,0,,,,,22343,,,0,63966,3167,,,,,,0,63966,3167 +"2020-04-17","DC",86,,5,,,,313,0,,105,,0,,,,,79,2476,,126,0,,,,,,573,12643,493,12643,493,,,,,,0,,0 +"2020-04-17","DE",76,67,6,9,,,224,0,,,11694,419,,,,,,2323,,248,0,,,,,2925,423,19223,714,19223,714,,,,,,0,,0 +"2020-04-17","FL",699,,53,,3665,3665,,205,,,210718,14367,,,,,,22823,,1199,0,,,,,,,226950,15461,226950,15461,,,,,,0,,0 +"2020-04-17","GA",650,,63,,3324,3324,,216,,,,0,,,,,,17194,,1525,0,,,,,13002,,,0,71686,1920,,,,,,0,71686,1920 +"2020-04-17","GU",5,,0,,,,6,0,,2,940,70,,,,,,133,,0,0,,,,,,97,,0,1073,70,,,,,,0,,0 +"2020-04-17","HI",9,9,0,,45,45,,0,,,21316,1146,,,,,,541,,11,0,,,,,487,374,22438,1292,22438,1292,,,,,,0,,0 +"2020-04-17","IA",64,,4,,,,183,0,,88,19460,926,,,,,52,2332,2332,191,0,,,,,,1007,,0,21792,1117,,,,,,0,,0 +"2020-04-17","ID",41,,0,,148,148,58,5,51,,15043,388,,,,,,1609,,22,0,,,,,,390,,0,16652,410,,,,,16652,410,,0 +"2020-04-17","IL",1134,,62,,,,4454,0,,1196,,0,,,,,777,27575,,1842,0,,,,,,,,0,130163,7574,,,,,,0,130163,7574 +"2020-04-17","IN",519,,42,,,,,0,,638,44631,3058,,,,,417,10154,,612,0,,,,,10524,,,0,72663,4545,,,,,,0,72663,4545 +"2020-04-17","KS",84,,4,,375,375,,16,,,15196,662,,,,,,1705,,117,0,,,,,,,,0,16901,779,,,,,,0,,0 +"2020-04-17","KY",129,,7,,971,971,477,164,506,333,,0,,,,,,2429,,138,0,,,,,,956,,0,29747,1423,,,,,,0,29747,1423 +"2020-04-17","LA",1213,,57,,,,1868,0,,,108869,4815,,,,,363,23118,23118,586,0,,,,,,,,0,131987,5401,,,,,,0,,0 +"2020-04-17","MA",1822,,155,,3756,3756,3756,30,,987,117195,7097,,,,,,35125,,2633,0,,,,,45466,,,0,194214,13125,,,,,,0,194214,13125 +"2020-04-17","MD",541,512,42,29,2612,2612,,161,,,50437,2378,,,,,,11572,11572,788,0,,,,,14075,736,,0,69474,3439,,,,,,0,69474,3439 +"2020-04-17","ME",29,,2,,133,133,55,3,,28,,0,,,,,8,827,827,31,0,,,,,1028,352,,0,18710,731,,,,,,0,18710,731 +"2020-04-17","MI",2984,2955,143,148,,,3674,0,,1428,,0,,,83268,,1167,36320,35118,865,0,,,,,39239,629,,0,122507,6067,,,,,,0,122507,6067 +"2020-04-17","MN",111,,17,,518,518,223,43,202,106,43820,1284,,,,,,2668,2668,182,0,,,,,,955,46488,1466,46488,1466,,,,,,0,,0 +"2020-04-17","MO",165,,13,,,,1043,0,,,46434,897,,3,46360,,,5283,5283,172,0,,,0,,6022,,,0,52444,2042,,,3,,,0,52444,2042 +"2020-04-17","MP",2,,0,,,,,0,,,42,15,,,,,,13,,0,0,,,,,,,,0,55,15,,,,,,0,,0 +"2020-04-17","MS",140,,11,,736,736,,54,,154,34791,0,,,,,99,3793,,169,0,,,,,,,,0,38584,169,,,,,,0,,0 +"2020-04-17","MT",8,,1,,54,54,21,2,,,,0,,,,,,422,,7,0,,,,,,233,,0,10244,308,,,,,,0,10244,308 +"2020-04-17","NC",152,,21,,,,429,0,,,,0,,,,,,5859,,394,0,,,,,,,,0,86965,3576,,,,,,0,86965,3576 +"2020-04-17","ND",9,,0,,47,47,16,2,,,11903,592,,,,,,438,438,46,0,,,,,,172,12629,819,12629,819,,,,,11825,711,12790,858 +"2020-04-17","NE",24,,3,,,,,0,,,12038,696,,,13197,,,1066,,114,0,,,,,1160,,,0,14477,790,,,,,13173,849,14477,790 +"2020-04-17","NH",37,,5,,190,190,74,12,,,11421,394,,,,,,1287,,148,0,,,,,,455,,0,13535,410,,,,,,0,13535,410 +"2020-04-17","NJ",4853,3840,364,1013,,,8011,0,,1961,78982,2469,,,,,1594,78467,78467,3150,0,,,,,,,,0,157449,5619,,,,,157449,5619,,0 +"2020-04-17","NM",51,,7,,242,242,96,12,,,,0,,,,,,1711,,114,0,,,,,,382,,0,35613,1125,,,,,,0,35613,1125 +"2020-04-17","NV",162,,4,,,,,0,,,26238,1108,,,,,,3524,3524,203,0,,,,,,,33881,1135,33881,1135,,,,,,0,35955,1451 +"2020-04-17","NY",12822,,630,,61120,61120,17316,2068,,5039,,0,,,,,,229642,,7358,0,,,,,,,573223,22644,573223,22644,,,,,,0,,0 +"2020-04-17","OH",418,401,29,17,2424,2424,,93,740,,,0,,,,,,9107,8858,693,0,,,,,9453,,,0,79947,4007,,,,,,0,79947,4007 +"2020-04-17","OK",136,,5,,528,528,325,0,,155,31155,2613,,,,,,2465,2465,108,0,,,,,,1331,,0,33620,2721,,,,,,0,,0 +"2020-04-17","OR",64,,6,,414,414,307,13,,89,33202,1514,,,30476,,43,1736,,73,0,,,,,4807,,,0,35283,2422,,,,,,0,35283,2422 +"2020-04-17","PA",756,,49,,,,2603,0,,,117932,4197,,,,,661,29441,,1706,0,,,,,,,154082,6251,154082,6251,,,,,147373,5903,,0 +"2020-04-17","PR",58,,2,,,,,0,,,7864,549,,,,,,1068,,25,0,,,,,,,,0,8932,574,,,,,,0,,0 +"2020-04-17","RI",118,,13,,331,331,252,0,,62,26157,1500,,,29181,,43,4585,,290,0,,,,,4816,,31779,2941,31779,2941,,,,,30742,1790,33997,2131 +"2020-04-17","SC",109,,2,,675,675,,0,,,32353,1276,,,,,,3931,3931,275,0,,,,,,,,0,36284,1551,,,,,,0,,0 +"2020-04-17","SD",7,,0,,63,63,,8,,,9651,412,,,,,,1411,,100,0,,,,,2190,457,,0,11258,650,,,,,11062,512,11258,650 +"2020-04-17","TN",142,,1,,711,711,465,20,,,,0,,,80684,,,6589,,327,0,,,,,6589,3017,,0,87273,2224,,,,,,0,87273,2224 +"2020-04-17","TX",428,,35,,,,1522,0,,,,0,,,,,,17371,17371,916,0,,,,,23484,4190,,0,226663,12647,,,,,,0,226663,12647 +"2020-04-17","UT",23,,2,,244,244,,6,,,57241,3931,,,59076,,,2805,,122,0,,,,,3075,443,,0,62151,4261,,,,,60140,4045,62151,4261 +"2020-04-17","VA",231,,23,,1114,1114,1308,66,,400,,0,,,,,224,7491,,602,0,1,5,,,11200,,64655,3271,64655,3271,5,23,,,,0,,0 +"2020-04-17","VI",2,,1,,,,,0,,,373,16,,,,,,51,,0,0,,,,,,46,,0,424,16,,,,,,0,,0 +"2020-04-17","VT",35,,0,,,,32,0,,,10054,471,,,,,,792,792,13,0,,,,,,15,,0,11684,551,,,,,10846,484,11684,551 +"2020-04-17","WA",585,,14,,,,622,0,,195,,0,,,,,,11705,11705,329,0,,,,,,,160524,5123,160524,5123,,,,,153193,4452,,0 +"2020-04-17","WI",205,,8,,1153,1153,361,32,306,141,42365,1391,,,,,348,4839,4045,203,0,,,,,,,49983,1965,49983,1965,,,,,,0,,0 +"2020-04-17","WV",13,,0,,,,85,0,,34,,0,,,,,24,754,754,15,0,,,,,,223,,0,16625,586,,,,,,0,16625,586 +"2020-04-17","WY",2,,0,,43,43,19,0,,,6131,0,,,7272,,,412,305,11,0,,,,,330,148,,0,7602,296,,,,,,0,7602,296 +"2020-04-16","AK",9,,0,,36,36,,3,,,,0,,,,,,300,,7,0,,,,,,110,,0,8735,71,,,,,,0,8735,71 +"2020-04-16","AL",133,,12,,553,553,360,28,227,,32046,2082,,,,137,,4345,4345,232,0,,,,,,,,0,36391,2314,,,,,36391,2314,,0 +"2020-04-16","AR",37,,4,,130,130,85,0,,,21055,790,,,,39,21,1620,1620,51,0,,,,,,548,,0,22675,841,,,,,,0,22675,841 +"2020-04-16","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-16","AZ",150,,8,,1258,1258,578,45,,278,43164,1816,,,,,188,4234,,272,0,,,,,,,,0,59878,2216,,,,,47398,2088,59878,2216 +"2020-04-16","CA",890,,69,,,,5031,0,,1568,220218,28156,,,,,,26182,,1758,0,,,,,,,,0,246400,29914,,,,,,0,246400,29914 +"2020-04-16","CO",374,,17,,1693,1693,858,57,,,33155,902,,,,,,8675,,395,0,,,,,,,46178,1495,46178,1495,,,,,41830,1297,,0 +"2020-04-16","CT",971,494,103,,,,1926,0,,,,0,,,39483,,,15884,,1129,0,,,,,21265,,,0,60799,3110,,,,,,0,60799,3110 +"2020-04-16","DC",81,,9,,,,313,0,,105,,0,,,,,79,2350,,153,0,,,,,,552,12150,625,12150,625,,,,,,0,,0 +"2020-04-16","DE",70,61,3,9,,,209,0,,,11275,187,,,,,,2075,,61,0,,,,,2754,378,18509,715,18509,715,,,,,,0,,0 +"2020-04-16","FL",646,,37,,3460,3460,,116,,,196351,5353,,,,,,21624,,897,0,,,,,,,211489,9625,211489,9625,,,,,,0,,0 +"2020-04-16","GA",587,,35,,3108,3108,,186,,,,0,,,,,,15669,,682,0,,,,,12763,,,0,69766,4534,,,,,,0,69766,4534 +"2020-04-16","GU",5,,0,,,,9,0,,,870,27,,,,,,133,,0,0,,,,,,86,,0,1003,27,,,,,,0,,0 +"2020-04-16","HI",9,9,0,,45,45,,0,,,20170,884,,,,,,530,,13,0,,,,,478,359,21146,905,21146,905,,,,,,0,,0 +"2020-04-16","IA",60,,7,,,,175,0,,84,18534,660,,,,,48,2141,2141,146,0,,,,,,987,,0,20675,806,,,,,,0,,0 +"2020-04-16","ID",41,,2,,143,143,70,2,46,,14655,721,,,,,,1587,,123,0,,,,,,,,0,16242,844,,,,,16242,844,,0 +"2020-04-16","IL",1072,,124,,,,4423,0,,1248,,0,,,,,797,25733,,1140,0,,,,,,,,0,122589,5660,,,,,,0,122589,5660 +"2020-04-16","IN",477,,41,,,,,0,,696,41573,2132,,,,,426,9542,,587,0,,,,,9939,,,0,68118,3813,,,,,,0,68118,3813 +"2020-04-16","KS",80,,4,,359,359,,17,,,14534,1360,,,,,,1588,,94,0,,,,,,,,0,16122,1454,,,,,,0,,0 +"2020-04-16","KY",122,,7,,807,807,412,120,367,252,,0,,,,,,2291,,81,0,,,,,,862,,0,28324,627,,,,,,0,28324,627 +"2020-04-16","LA",1156,,53,,,,1914,0,,,104054,4077,,,,,396,22532,22532,581,0,,,,,,,,0,126586,4658,,,,,,0,,0 +"2020-04-16","MA",1667,,165,,3726,3726,3726,89,,973,110098,7308,,,,,,32492,,2522,0,,,,,42142,,,0,181089,10706,,,,,,0,181089,10706 +"2020-04-16","MD",499,471,30,28,2451,2451,,220,,,48059,2328,,,,,,10784,10784,752,0,,,,,13166,736,,0,66035,3578,,,,,,0,66035,3578 +"2020-04-16","ME",27,,3,,130,130,47,4,,20,,0,,,,,7,796,796,26,0,,,,,996,333,,0,17979,661,,,,,,0,17979,661 +"2020-04-16","MI",2841,2836,169,140,,,3809,0,,1447,,0,,,78274,,1211,35455,34298,922,0,,,,,38166,617,,0,116440,5674,,,,,,0,116440,5674 +"2020-04-16","MN",94,,7,,475,475,213,30,188,103,42536,1291,,,,,,2486,2486,165,0,,,,,,926,45022,1456,45022,1456,,,,,,0,,0 +"2020-04-16","MO",152,,5,,,,1043,0,,,45537,1420,,3,44563,,,5111,5111,216,0,,,0,,5781,,,0,50402,2169,,,3,,,0,50402,2169 +"2020-04-16","MP",2,,0,,,,,0,,,27,0,,,,,,13,,0,0,,,,,,,,0,40,0,,,,,,0,,0 +"2020-04-16","MS",129,,7,,682,682,,37,,154,34791,0,,,,,99,3624,,264,0,,,,,,,,0,38415,264,,,,,,0,,0 +"2020-04-16","MT",7,,0,,52,52,21,1,,,,0,,,,,,415,,11,0,,,,,,218,,0,9936,353,,,,,,0,9936,353 +"2020-04-16","NC",131,,14,,,,452,0,,,,0,,,,,,5465,,342,0,,,,,,,,0,83389,3215,,,,,,0,83389,3215 +"2020-04-16","ND",9,,0,,45,45,14,1,,,11311,359,,,,,,392,392,28,0,,,,,,163,11810,400,11810,400,,,,,11114,342,11932,413 +"2020-04-16","NE",21,,1,,,,,0,,,11342,514,,,12519,,,952,,51,0,,,,,1055,,,0,13687,731,,,,,12324,567,13687,731 +"2020-04-16","NH",32,,0,,178,178,70,0,,,11027,0,,,,,,1139,,0,0,,,,,,365,,0,13125,471,,,,,,0,13125,471 +"2020-04-16","NJ",4489,3518,421,971,,,8224,0,,2014,76513,3522,,,,,1645,75317,75317,4287,0,,,,,,,,0,151830,7809,,,,,151830,7809,,0 +"2020-04-16","NM",44,,8,,230,230,90,15,,,,0,,,,,,1597,,113,0,,,,,,353,,0,34488,1094,,,,,,0,34488,1094 +"2020-04-16","NV",158,,8,,,,,0,,,25130,686,,,,,,3321,3321,110,0,,,,,,,32746,1470,32746,1470,,,,,,0,34504,1067 +"2020-04-16","NY",12192,,606,,59052,59052,17735,2084,,5071,,0,,,,,,222284,,8505,0,,,,,,,550579,24567,550579,24567,,,,,,0,,0 +"2020-04-16","OH",389,373,28,16,2331,2331,,94,707,,,0,,,,,,8414,8239,623,0,,,,,8775,,,0,75940,3613,,,,,,0,75940,3613 +"2020-04-16","OK",131,,8,,528,528,236,18,,163,28542,1586,,,,,,2357,2357,94,0,,,,,,1240,,0,30899,1680,,,,,,0,,0 +"2020-04-16","OR",58,,3,,401,401,305,20,,95,31688,958,,,28235,,43,1663,,30,0,,,,,4626,,,0,32861,1474,,,,,,0,32861,1474 +"2020-04-16","PA",707,,60,,,,2512,0,,,113735,2641,,,,,675,27735,,1245,0,,,,,,,147831,4361,147831,4361,,,,,141470,3886,,0 +"2020-04-16","PR",56,,5,,,,,0,,,7315,490,,,,,,1043,,69,0,,,,,,,,0,8358,559,,,,,,0,,0 +"2020-04-16","RI",105,,18,,331,331,245,0,,61,24657,2090,,,27358,,43,4295,,392,0,,,,,4508,,28838,2150,28838,2150,,,,,28952,2482,31866,2949 +"2020-04-16","SC",107,,0,,675,675,,0,,,31077,0,,,,,,3656,3656,0,0,,,,,,,,0,34733,0,,,,,,0,,0 +"2020-04-16","SD",7,,1,,55,55,,4,,,9239,548,,,,,,1311,,143,0,,,,,2097,373,,0,10608,619,,,,,10550,691,10608,619 +"2020-04-16","TN",141,,6,,691,691,444,28,,,,0,,,78787,,,6262,,183,0,,,,,6262,2786,,0,85049,4153,,,,,,0,85049,4153 +"2020-04-16","TX",393,,29,,,,1459,0,,,,0,,,,,,16455,16455,963,0,,,,,22402,3677,,0,214016,11742,,,,,,0,214016,11742 +"2020-04-16","UT",21,,1,,238,238,,17,,,53310,2831,,,54940,,,2683,,141,0,,,,,2950,357,,0,57890,3169,,,,,56095,2991,57890,3169 +"2020-04-16","VA",208,,13,,1048,1048,1337,70,,427,,0,,,,,238,6889,,389,0,1,3,,,10526,,61384,3026,61384,3026,4,21,,,,0,,0 +"2020-04-16","VI",1,,0,,,,,0,,,357,26,,,,,,51,,0,0,,,,,,46,,0,408,26,,,,,,0,,0 +"2020-04-16","VT",35,,5,,,,58,0,,,9583,257,,,,,,779,779,9,0,,,,,,15,,0,11133,365,,,,,10362,266,11133,365 +"2020-04-16","WA",571,,20,,,,595,0,,196,,0,,,,,,11376,11376,302,0,,,,,,,155401,4702,155401,4702,,,,,148741,4348,,0 +"2020-04-16","WI",197,,15,,1121,1121,394,30,299,147,40974,1648,,,,,,4636,3875,183,0,,,,,,,48018,1774,48018,1774,,,,,,0,,0 +"2020-04-16","WV",13,,3,,,,85,-164,,34,,0,,,,,24,739,739,37,0,,,,,,223,,0,16039,521,,,,,,0,16039,521 +"2020-04-16","WY",2,,0,,43,43,19,0,,,6131,89,,,6983,,,401,296,8,0,,,,,323,148,,0,7306,240,,,,,,0,7306,240 +"2020-04-15","AK",9,,0,,33,33,,0,,,,0,,,,,,293,,8,0,,,,,,106,,0,8664,316,,,,,,0,8664,316 +"2020-04-15","AL",121,,11,,525,525,402,32,219,,29964,723,,,,134,,4113,4113,237,0,,,,,,,,0,34077,960,,,,,34077,960,,0 +"2020-04-15","AR",33,,3,,130,130,83,0,43,,20265,614,,,,39,26,1569,1569,89,0,,,,,,489,,0,21834,703,,,,,,0,21834,703 +"2020-04-15","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-15","AZ",142,,11,,1213,1213,590,42,,286,41348,1058,,,,,202,3962,,156,0,,,,,,,,0,57662,2171,,,,,45310,1214,57662,2171 +"2020-04-15","CA",821,,63,,,,5163,0,,1175,192062,13192,,,,,,24424,,1086,0,,,,,,,,0,216486,14278,,,,,,0,216486,14278 +"2020-04-15","CO",357,,28,,1636,1636,859,80,,,32253,614,,,,,,8280,,339,0,,,,,,,44683,1182,44683,1182,,,,,40533,953,,0 +"2020-04-15","CT",868,448,197,,,,1908,0,,,,0,,,37576,,,14755,,766,0,,,,,20068,,,0,57689,3658,,,,,,0,57689,3658 +"2020-04-15","DC",72,,5,,,,313,0,,105,,0,,,,,79,2197,,139,0,,,,,,530,11525,241,11525,241,,,,,,0,,0 +"2020-04-15","DE",67,59,7,8,,,208,0,,,11088,545,,,,,,2014,,253,0,,,,,2523,354,17794,491,17794,491,,,,,,0,,0 +"2020-04-15","FL",609,,72,,3344,3344,,284,,,190998,9185,,,,,,20727,,592,0,,,,,,,201864,6421,201864,6421,,,,,,0,,0 +"2020-04-15","GA",552,,51,,2922,2922,,153,,,,0,,,,,,14987,,764,0,,,,,12071,,,0,65232,3424,,,,,,0,65232,3424 +"2020-04-15","GU",5,,0,,,,9,0,,2,843,32,,,,,2,133,,0,0,,,,,,73,,0,976,32,,,,,,0,,0 +"2020-04-15","HI",9,9,0,,45,45,,1,,,19286,370,,,,,,517,,13,0,,,,,462,333,20241,404,20241,404,,,,,,0,,0 +"2020-04-15","IA",53,,4,,,,171,0,,78,17874,888,,,,,43,1995,1995,96,0,,,,,,908,,0,19869,984,,,,,,0,,0 +"2020-04-15","ID",39,,6,,141,141,66,6,43,,13934,273,,,,,,1464,,11,0,,,,,,,,0,15398,284,,,,,15398,284,,0 +"2020-04-15","IL",948,,80,,,,4283,0,,1189,,0,,,,,796,24593,,1346,0,,,,,,,,0,116929,6313,,,,,,0,116929,6313 +"2020-04-15","IN",436,,48,,,,,0,,737,39441,1951,,,,,422,8955,,428,0,,,,,9391,,,0,64305,4061,,,,,,0,64305,4061 +"2020-04-15","KS",76,,7,,342,342,,15,,,13174,453,,,,,,1494,,68,0,,,,,,,,0,14668,521,,,,,,0,,0 +"2020-04-15","KY",115,,11,,687,687,305,14,263,137,,0,,,,,,2210,,162,0,,,,,,653,,0,27697,1014,,,,,,0,27697,1014 +"2020-04-15","LA",1103,,90,,,,1943,0,,,99977,3073,,,,,425,21951,21951,433,0,,,,,,,,0,121928,3506,,,,,,0,,0 +"2020-04-15","MA",1502,,173,,3637,3637,3637,21,,973,102790,3970,,,,,,29970,,1861,0,,,,,39345,,,0,170383,11653,,,,,,0,170383,11653 +"2020-04-15","MD",469,441,48,28,2231,2231,,109,,,45731,1470,,,,,,10032,10032,560,0,,,,,12107,607,,0,62457,2406,,,,,,0,62457,2406 +"2020-04-15","ME",24,,4,,126,126,48,2,,22,,0,,,,,9,770,770,36,0,,,,,954,305,,0,17318,547,,,,,,0,17318,547 +"2020-04-15","MI",2672,2701,140,135,,,3918,0,,1468,,0,,,73828,,1212,34533,33448,920,0,,,,,36938,452,,0,110766,4583,,,,,,0,110766,4583 +"2020-04-15","MN",87,,8,,445,445,197,40,175,93,41245,1540,,,,,,2321,2321,156,0,,,,,,853,43566,1696,43566,1696,,,,,,0,,0 +"2020-04-15","MO",147,,14,,,,1024,0,,,44117,825,,3,42635,,,4895,4895,209,0,,,0,,5546,,,0,48233,2256,,,3,,,0,48233,2256 +"2020-04-15","MP",2,,0,,,,,0,,,27,0,,,,,,13,,0,0,,,,,,,,0,40,0,,,,,,0,,0 +"2020-04-15","MS",122,,11,,645,645,,49,,154,34791,0,,,,,99,3360,,273,0,,,,,,,,0,38151,273,,,,,,0,,0 +"2020-04-15","MT",7,,0,,51,51,21,1,,,,0,,,,,,404,,5,0,,,,,,209,,0,9583,349,,,,,,0,9583,349 +"2020-04-15","NC",117,,9,,,,431,0,,,,0,,,,,,5123,,99,0,,,,,,,,0,80174,1968,,,,,,0,80174,1968 +"2020-04-15","ND",9,,0,,44,44,13,2,,,10952,377,,,,,,364,364,23,0,,,,,,142,11410,340,11410,340,,,,,10772,280,11519,350 +"2020-04-15","NE",20,,2,,,,,0,,,10828,342,,,11877,,,901,,30,0,,,,,972,,,0,12956,788,,,,,11757,373,12956,788 +"2020-04-15","NH",32,,9,,178,178,70,26,,,11027,437,,,,,,1139,,119,0,,,,,,365,,0,12654,331,,,,,,0,12654,331 +"2020-04-15","NJ",4068,3156,409,912,,,8270,0,,1980,72991,2041,,,,,1705,71030,71030,2206,0,,,,,,,,0,144021,4247,,,,,144021,4247,,0 +"2020-04-15","NM",36,,0,,215,215,90,34,,,,0,,,,,,1484,,139,0,,,,,,353,,0,33394,1424,,,,,,0,33394,1424 +"2020-04-15","NV",150,,9,,,,,0,,,24444,871,,,,,,3211,3211,123,0,,,,,,,31276,1035,31276,1035,,,,,,0,33437,1259 +"2020-04-15","NY",11586,,752,,56968,56968,18335,2315,,5205,,0,,,,,,213779,,11571,0,,,,,,,526012,26869,526012,26869,,,,,,0,,0 +"2020-04-15","OH",361,346,37,15,2237,2237,,81,677,,,0,,,,,,7791,7628,511,0,,,,,8215,,,0,72327,2502,,,,,,0,72327,2502 +"2020-04-15","OK",123,,15,,510,510,194,22,,107,26956,871,,,,,,2263,2263,79,0,,,,,,1115,,0,29219,950,,,,,,0,,0 +"2020-04-15","OR",55,,2,,381,381,311,12,,88,30730,1193,,,26880,,44,1633,,49,0,,,,,4507,,,0,31387,1243,,,,,,0,31387,1243 +"2020-04-15","PA",647,,63,,,,2395,0,,,111094,2808,,,,,668,26490,,1145,0,,,,,,,143470,4392,143470,4392,,,,,137584,3953,,0 +"2020-04-15","PR",51,,6,,,,,0,,,6825,541,,,,,,974,,51,0,,,,,,,,0,7799,592,,,,,,0,,0 +"2020-04-15","RI",87,,7,,331,331,229,0,,54,22567,1577,,,24858,,44,3903,,307,0,,,,,4059,,26688,2076,26688,2076,,,,,26470,1884,28917,2156 +"2020-04-15","SC",107,,10,,675,675,,0,,,31077,758,,,,,,3656,3656,103,0,,,,,,,,0,34733,861,,,,,,0,,0 +"2020-04-15","SD",6,,0,,51,51,,6,,,8691,383,,,,,,1168,,180,0,,,,,1899,329,,0,9989,338,,,,,9859,563,9989,338 +"2020-04-15","TN",135,,11,,663,663,412,30,,,,0,,,74817,,,6079,,256,0,,,,,6079,2196,,0,80896,2065,,,,,,0,80896,2065 +"2020-04-15","TX",364,,46,,,,1538,0,,,,0,,,,,,15492,15492,868,0,,,,,21409,3150,,0,202274,9873,,,,,,0,202274,9873 +"2020-04-15","UT",20,,1,,221,221,,8,,,50479,2891,,,51947,,,2542,,130,0,,,,,2774,218,,0,54721,3201,,,,,53104,3053,54721,3201 +"2020-04-15","VA",195,,41,,978,978,1298,75,,394,,0,,,,,234,6500,,329,0,1,3,,,9948,,58358,2047,58358,2047,4,21,,,,0,,0 +"2020-04-15","VI",1,,0,,,,,0,,,331,5,,,,,,51,,0,0,,,,,,44,,0,382,5,,,,,,0,,0 +"2020-04-15","VT",30,,1,,,,63,0,,,9326,351,,,,,,770,770,9,0,,,,,,15,,0,10768,426,,,,,10096,360,10768,426 +"2020-04-15","WA",551,,9,,,,645,0,,194,,0,,,,,,11074,11074,371,0,,,,,,,150699,4498,150699,4498,,,,,144393,4146,,0 +"2020-04-15","WI",182,,12,,1091,1091,406,42,290,162,39326,1329,,,,,,4453,3721,207,0,,,,,,,46244,1751,46244,1751,,,,,,0,,0 +"2020-04-15","WV",10,,1,,164,164,82,0,73,36,,0,,,,50,23,702,702,62,0,,,,,,211,,0,15518,494,,,,,,0,15518,494 +"2020-04-15","WY",2,,1,,43,43,,0,,,6042,353,,,6748,,,393,288,10,0,,,,,318,129,,0,7066,235,,,,,,0,7066,235 +"2020-04-14","AK",9,,1,,33,33,,0,,,,0,,,,,,285,,8,0,,,,,,98,,0,8348,518,,,,,,0,8348,518 +"2020-04-14","AL",110,,11,,493,493,380,36,210,,29241,3793,,,,132,,3876,3876,142,0,,,,,,,,0,33117,3935,,,,,33117,3935,,0 +"2020-04-14","AR",30,,0,,130,130,81,0,43,,19651,257,,,,39,29,1480,1480,70,0,,,,,,427,,0,21131,327,,,,,,0,21131,327 +"2020-04-14","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-14","AZ",131,,9,,1171,1171,580,49,,286,40290,645,,,,,216,3806,,104,0,,,,,,,,0,55491,2304,,,,,44096,749,55491,2304 +"2020-04-14","CA",758,,71,,,,5163,0,,1552,178870,10336,,,,,,23338,,990,0,,,,,,,,0,202208,11326,,,,,,0,202208,11326 +"2020-04-14","CO",329,,21,,1556,1556,878,63,,,31639,588,,,,,,7941,,250,0,,,,,,,43501,1018,43501,1018,,,,,39580,838,,0 +"2020-04-14","CT",671,380,69,,,,1779,0,,,,0,,,35241,,,13989,,608,0,,,,,18750,,,0,54031,1595,,,,,,0,54031,1595 +"2020-04-14","DC",67,,14,,,,295,0,,95,,0,,,,,31,2058,,103,0,,,,,,518,11284,350,11284,350,,,,,,0,,0 +"2020-04-14","DE",60,53,7,7,,,204,0,,,10543,348,,,,,,1761,,136,0,,,,,2405,277,17303,553,17303,553,,,,,,0,,0 +"2020-04-14","FL",537,,54,,3060,3060,,227,,,181813,6207,,,,,,20135,,922,0,,,,,,,195443,8691,195443,8691,,,,,,0,,0 +"2020-04-14","GA",501,,37,,2769,2769,,180,,,,0,,,,,,14223,,908,0,,,,,11524,,,0,61808,4719,,,,,,0,61808,4719 +"2020-04-14","GU",5,,0,,,,13,0,,2,811,41,,,,,2,133,,0,0,,,,,,66,,0,944,41,,,,,,0,,0 +"2020-04-14","HI",9,9,0,,44,44,,0,,,18916,571,,,,,,504,,5,0,,,,,457,315,19837,702,19837,702,,,,,,0,,0 +"2020-04-14","IA",49,,6,,,,163,0,,73,16986,0,,,,,41,1899,1899,189,0,,,,,,741,,0,18885,189,,,,,,0,,0 +"2020-04-14","ID",33,,6,,135,135,59,3,38,,13661,206,,,,,,1453,,27,0,,,,,,,,0,15114,233,,,,,15114,233,,0 +"2020-04-14","IL",868,,74,,,,4283,0,,1189,,0,,,,,796,23247,,1222,0,,,,,,,,0,110616,4848,,,,,,0,110616,4848 +"2020-04-14","IN",388,,38,,,,,0,,721,37490,1187,,,,,435,8527,,291,0,,,,,8780,,,0,60244,3887,,,,,,0,60244,3887 +"2020-04-14","KS",69,,7,,327,327,,18,,,12721,233,,,,,,1426,,50,0,,,,,,,,0,14147,283,,,,,,0,,0 +"2020-04-14","KY",104,,7,,673,673,299,6,259,136,,0,,,,,,2048,,85,0,,,,,,629,,0,26683,817,,,,,,0,26683,817 +"2020-04-14","LA",1013,,129,,,,1977,0,,,96904,9829,,,,,436,21518,21518,502,0,,,,,,,,0,118422,10331,,,,,,0,,0 +"2020-04-14","MA",1329,,118,,3616,3616,3616,131,,,98820,3320,,,,,,28109,,1315,0,,,,,36432,,,0,158730,11345,,,,,,0,158730,11345 +"2020-04-14","MD",421,396,37,25,2122,2122,,147,,,44261,1446,,,,,,9472,9472,536,0,,,,,11399,607,,0,60051,1583,,,,,,0,60051,1583 +"2020-04-14","ME",20,,1,,124,124,58,0,,21,,0,,,,,9,734,734,36,0,,,,,922,292,,0,16771,514,,,,,,0,16771,514 +"2020-04-14","MI",2532,2537,141,131,,,3910,0,,1497,,0,,,70675,,1235,33613,32572,911,0,,,,,35508,452,,0,106183,5000,,,,,,0,106183,5000 +"2020-04-14","MN",79,,9,,405,405,177,44,155,75,39705,1038,,,,,,2165,2165,153,0,,,,,,830,41870,1191,41870,1191,,,,,,0,,0 +"2020-04-14","MO",133,,19,,,,1041,0,,,43292,2252,,3,40667,,,4686,4686,298,0,,,0,,5262,,,0,45977,788,,,3,,,0,45977,788 +"2020-04-14","MP",2,,0,,,,,0,,,27,0,,,,,,13,,2,0,,,,,,,,0,40,2,,,,,,0,,0 +"2020-04-14","MS",111,,13,,596,596,,47,,154,34791,6749,,,,,99,3087,,145,0,,,,,,,,0,37878,6894,,,,,,0,,0 +"2020-04-14","MT",7,,0,,50,50,24,3,,,,0,,,,,,399,,5,0,,,,,,197,,0,9234,136,,,,,,0,9234,136 +"2020-04-14","NC",108,,22,,,,418,0,,,,0,,,,,,5024,,208,0,,,,,,,,0,78206,1298,,,,,,0,78206,1298 +"2020-04-14","ND",9,,1,,42,42,13,2,,,10575,125,,,,,,341,341,10,0,,,,,,138,11070,206,11070,206,,,,,10492,185,11169,209 +"2020-04-14","NE",18,,1,,,,,0,,,10486,328,,,11199,,,871,,57,0,,,,,866,,,0,12168,455,,,,,11384,393,12168,455 +"2020-04-14","NH",23,,0,,152,152,72,0,,,10590,368,,,,,,1020,,35,0,,,,,,249,,0,12323,225,,,,,,0,12323,225 +"2020-04-14","NJ",3659,2805,411,854,,,8185,0,,2051,70950,6065,,,,,1626,68824,68824,4240,0,,,,,,,,0,139774,10305,,,,,139774,10305,,0 +"2020-04-14","NM",36,,5,,181,181,87,0,,,,0,,,,,,1345,,100,0,,,,,,340,,0,31970,1455,,,,,,0,31970,1455 +"2020-04-14","NV",141,,8,,,,,0,,,23573,1080,,,,,,3088,3088,117,0,,,,,,,30241,1263,30241,1263,,,,,,0,32178,1550 +"2020-04-14","NY",10834,,778,,54653,54653,18697,1717,,5225,,0,,,,,,202208,,7177,0,,,,,,,499143,20786,499143,20786,,,,,,0,,0 +"2020-04-14","OH",324,309,50,15,2156,2156,,123,654,,,0,,,,,,7280,7153,305,0,,,,,7901,,,0,69825,2252,,,,,,0,69825,2252 +"2020-04-14","OK",108,,9,,488,488,194,31,,107,26085,5295,,,,,,2184,2184,115,0,,,,,,1060,,0,28269,5410,,,,,,0,,0 +"2020-04-14","OR",53,,1,,369,369,321,10,,96,29537,1306,,,25725,,50,1584,,57,0,,,,,4419,,,0,30144,1828,,,,,,0,30144,1828 +"2020-04-14","PA",584,,60,,,,2317,0,,,108286,2693,,,,,675,25345,,1146,0,,,,,,,139078,4210,139078,4210,,,,,133631,3839,,0 +"2020-04-14","PR",45,,0,,,,,0,,,6284,324,,,,,,923,,20,0,,,,,,,,0,7207,344,,,,,,0,,0 +"2020-04-14","RI",80,,7,,331,331,213,0,,48,20990,1559,,,23055,,,3596,,267,0,,,,,3706,,24612,1096,24612,1096,,,,,24586,1826,26761,2077 +"2020-04-14","SC",97,,15,,675,675,,179,,,30319,2213,,,,,,3553,3553,234,0,,,,,,,,0,33872,2447,,,,,,0,,0 +"2020-04-14","SD",6,,0,,45,45,,1,,,8308,174,,,,,,988,,120,0,,,,,1781,261,,0,9651,395,,,,,9296,294,9651,395 +"2020-04-14","TN",124,,15,,633,633,443,54,,,,0,,,73008,,,5823,,213,0,,,,,5823,1969,,0,78831,2636,,,,,,0,78831,2636 +"2020-04-14","TX",318,,31,,,,1409,0,,,,0,,,,,,14624,14624,718,0,,,,,20454,2580,,0,192401,9387,,,,,,0,192401,9387 +"2020-04-14","UT",19,,1,,213,213,,12,,,47588,1607,,,48913,,,2412,,49,0,,,,,2607,218,,0,51520,1744,,,,,50051,1671,51520,1744 +"2020-04-14","VA",154,,5,,903,903,1282,31,,422,,0,,,,,276,6171,,424,0,1,3,,,9551,,56311,1613,56311,1613,1,21,,,,0,,0 +"2020-04-14","VI",1,,0,,,,,0,,,326,4,,,,,,51,,0,0,,,,,,44,,0,377,4,,,,,,0,,0 +"2020-04-14","VT",29,,1,,,,64,0,,,8975,169,,,,,,761,761,7,0,,,,,,15,,0,10342,227,,,,,9736,176,10342,227 +"2020-04-14","WA",542,,16,,,,387,0,,98,,0,,,,,,10703,10703,90,0,,,,,,,146201,4658,146201,4658,,,,,140247,4309,,0 +"2020-04-14","WI",170,,16,,1049,1049,441,56,283,161,37997,1228,,,,,,4246,3555,166,0,,,,,,,44493,1373,44493,1373,,,,,,0,,0 +"2020-04-14","WV",9,,0,,164,164,87,0,73,38,,0,,,,50,25,640,640,14,0,,,,,,147,,0,15024,211,,,,,,0,15024,211 +"2020-04-14","WY",1,,0,,43,43,,2,,,5689,0,,,6521,,,383,282,10,0,,,,,310,140,,0,6831,307,,,,,,0,6831,307 +"2020-04-13","AK",8,,0,,33,33,,0,,,,0,,,,,,277,,5,0,,,,,,85,,0,7830,-208,,,,,,0,7830,-208 +"2020-04-13","AL",99,,6,,457,457,380,20,189,,25448,7390,,,,119,,3734,3734,209,0,,,,,,,,0,29182,7599,,,,,29182,7599,,0 +"2020-04-13","AR",30,,3,,130,130,74,0,43,,19394,952,,,,39,28,1410,1410,130,0,,,,,,391,,0,20804,1082,,,,,,0,20804,1082 +"2020-04-13","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-13","AZ",122,,7,,1122,1122,525,48,,286,39645,1075,,,,,195,3702,,163,0,,,,,,,,0,53187,898,,,,,43347,1238,53187,898 +"2020-04-13","CA",687,,36,,,,3015,0,,1178,168534,0,,,,,,22348,,554,0,,,,,,,,0,190882,554,,,,,,0,190882,554 +"2020-04-13","CO",308,,18,,1493,1493,888,76,,,31051,1201,,,,,,7691,,388,0,,,,,,,42483,1794,42483,1794,,,,,38742,1589,,0 +"2020-04-13","CT",602,277,48,,,,1760,0,,,,0,,,34384,,,13381,,1346,0,,,,,18014,,,0,52436,1054,,,,,,0,52436,1054 +"2020-04-13","DC",53,,3,,,,295,0,,95,,0,,,,,31,1955,,80,0,,,,,,507,10934,294,10934,294,,,,,,0,,0 +"2020-04-13","DE",53,47,5,6,,,201,0,,,10195,571,,,,,,1625,,146,0,,,,,2230,213,16750,688,16750,688,,,,,,0,,0 +"2020-04-13","FL",483,,18,,2833,2833,,61,,,175606,12208,,,,,,19213,,809,0,,,,,,,186752,8697,186752,8697,,,,,,0,,0 +"2020-04-13","GA",464,,31,,2589,2589,,84,,,,0,,,,,,13315,,863,0,,,,,10659,,,0,57089,476,,,,,,0,57089,476 +"2020-04-13","GU",5,,0,,,,12,0,,2,770,77,,,,,2,133,,0,0,,,,,,58,,0,903,77,,,,,,0,,0 +"2020-04-13","HI",9,9,1,,44,44,,0,,,18345,863,,,,,,499,,13,0,,,,,452,310,19135,867,19135,867,,,,,,0,,0 +"2020-04-13","IA",43,,2,,,,142,0,,70,16986,981,,,,,41,1710,1710,123,0,,,,,,741,,0,18696,1104,,,,,,0,,0 +"2020-04-13","ID",27,,0,,132,132,62,1,38,,13455,554,,,,,,1426,,19,0,,,,,,,,0,14881,573,,,,,14881,573,,0 +"2020-04-13","IL",794,,74,,,,3680,0,,1166,,0,,,,,821,22025,,1173,0,,,,,,,,0,105768,5033,,,,,,0,105768,5033 +"2020-04-13","IN",350,,7,,,,,0,,740,36303,1742,,,,,459,8236,,308,0,,,,,8222,,,0,56357,876,,,,,,0,56357,876 +"2020-04-13","KS",62,,6,,309,309,,11,,,12488,572,,,,,,1376,,39,0,,,,,,,,0,13864,611,,,,,,0,,0 +"2020-04-13","KY",97,,3,,667,667,289,208,256,136,,0,,,,,,1963,,123,0,,,,,,607,,0,25866,1299,,,,,,0,25866,1299 +"2020-04-13","LA",884,,44,,,,2134,0,,,87075,3625,,,,,461,21016,21016,421,0,,,,,,,,0,108091,4046,,,,,,0,,0 +"2020-04-13","MA",1211,,155,,3485,3485,3485,971,,,95500,4037,,,,,,26794,,1413,0,,,,,33218,,,0,147385,7504,,,,,,0,147385,7504 +"2020-04-13","MD",384,360,49,24,1975,1975,,115,,,42815,1276,,,,,,8936,8936,711,0,,,,,10971,603,,0,58468,3804,,,,,,0,58468,3804 +"2020-04-13","ME",19,,0,,124,124,22,4,,,,0,,,,,,698,698,65,0,,,,,886,273,,0,16257,320,,,,,,0,16257,320 +"2020-04-13","MI",2391,2401,142,122,,,3986,0,,1570,,0,,,67063,,1365,32702,31715,1036,0,,,,,34120,447,,0,101183,3590,,,,,,0,101183,3590 +"2020-04-13","MN",70,,0,,361,361,157,0,146,74,38667,637,,,,,,2012,2012,148,0,,,,,,772,40679,785,40679,785,,,,,,0,,0 +"2020-04-13","MO",114,,4,,,,988,0,,,41040,0,,3,39977,,,4388,4388,228,0,,,0,,5165,,,0,45189,948,,,3,,,0,45189,948 +"2020-04-13","MP",2,,0,,,,,0,,,27,0,,,,,,11,,0,0,,,,,,,,0,38,0,,,,,,0,,0 +"2020-04-13","MS",98,,2,,549,549,,1,,124,28042,9410,,,,,84,2942,,161,0,,,,,,,,0,30984,9571,,,,,,0,,0 +"2020-04-13","MT",7,,1,,47,47,21,0,,,,0,,,,,,394,,7,0,,,,,,171,,0,9098,185,,,,,,0,9098,185 +"2020-04-13","NC",86,,5,,,,313,0,,,,0,,,,,,4816,,296,0,,,,,,,,0,76908,7999,,,,,,0,76908,7999 +"2020-04-13","ND",8,,0,,40,40,13,1,,,10450,408,,,,,,331,331,23,0,,,,,,127,10864,457,10864,457,,,,,10307,423,10960,465 +"2020-04-13","NE",17,,0,,,,,0,,,10158,258,,,10805,,,814,,23,0,,,,,814,,,0,11713,734,,,,,10991,794,11713,734 +"2020-04-13","NH",23,,0,,152,152,,6,,,10222,226,,,,,,985,,56,0,,,,,,239,,0,12098,385,,,,,,0,12098,385 +"2020-04-13","NJ",3248,2443,164,805,,,7781,0,,1886,64885,0,,,,,1611,64584,64584,2734,0,,,,,,,,0,129469,2734,,,,,129469,2734,,0 +"2020-04-13","NM",31,,5,,181,181,87,181,,,,0,,,,,,1245,,71,0,,,,,,304,,0,30515,1823,,,,,,0,30515,1823 +"2020-04-13","NV",133,,5,,,,,0,,,22493,718,,,,,,2971,2971,135,0,,,,,,,28978,387,28978,387,,,,,,0,30628,1049 +"2020-04-13","NY",10056,,671,,52936,52936,18825,2017,,5156,,0,,,,,,195031,,6337,0,,,,,,,478357,16756,478357,16756,,,,,,0,,0 +"2020-04-13","OH",274,268,21,6,2033,2033,,85,613,,,0,,,,,,6975,6881,371,0,,,,,7527,,,0,67573,2673,,,,,,0,67573,2673 +"2020-04-13","OK",99,,3,,457,457,383,11,,191,20790,0,,,,,,2069,,99,0,,,,,,865,,0,22859,99,,,,,,0,,0 +"2020-04-13","OR",52,,4,,359,359,295,21,,81,28231,2378,,,24032,,52,1527,,156,0,,,,,4284,,,0,28316,1768,,,,,,0,28316,1768 +"2020-04-13","PA",524,,17,,,,2243,0,,,105593,3536,,,,,669,24199,,1366,0,,,,,,,134868,5135,134868,5135,,,,,129792,4902,,0 +"2020-04-13","PR",45,,1,,,,,0,,,5960,141,,,,,,903,,6,0,,,,,,,,0,6863,147,,,,,,0,,0 +"2020-04-13","RI",73,,10,,331,331,197,331,,50,19431,853,,,21267,,26,3329,,187,0,,,,,3417,,23516,1984,23516,1984,,,,,22760,1040,24684,1100 +"2020-04-13","SC",82,,0,,496,496,,0,,,28106,0,,,,,,3319,3319,0,0,,,,,,,,0,31425,0,,,,,,0,,0 +"2020-04-13","SD",6,,0,,44,44,,1,,,8134,311,,,,,,868,,138,0,,,,,1646,207,,0,9256,578,,,,,9002,449,9256,578 +"2020-04-13","TN",109,,8,,579,579,458,12,,,,0,,,70585,,,5610,,302,0,,,,,5610,1671,,0,76195,5448,,,,,,0,76195,5448 +"2020-04-13","TX",287,,16,,,,1176,0,,,,0,,,,,,13906,13906,422,0,,,,,19242,2269,,0,183014,2183,,,,,,0,183014,2183 +"2020-04-13","UT",18,,0,,201,201,,6,,,45981,745,,,47238,,,2363,,60,0,,,,,2538,218,,0,49776,839,,,,,48380,790,49776,839 +"2020-04-13","VA",149,,8,,872,872,1238,35,,428,,0,,,,,302,5747,,473,0,1,3,,,9221,,54698,2142,54698,2142,1,21,,,,0,,0 +"2020-04-13","VI",1,,0,,,,,0,,,322,23,,,,,,51,,0,0,,,,,,43,,0,373,23,,,,,,0,,0 +"2020-04-13","VT",28,,1,,,,33,0,,,8806,490,,,,,,754,754,21,0,,,,,,15,,0,10115,506,,,,,9560,511,10115,506 +"2020-04-13","WA",526,,17,,,,527,0,,166,,0,,,,,,10613,10613,155,0,,,,,,,141543,4586,141543,4586,,,,,135938,4220,,0 +"2020-04-13","WI",154,,10,,993,993,431,19,264,163,36769,853,,,,,,4080,3428,116,0,,,,,,,43120,1103,43120,1103,,,,,,0,,0 +"2020-04-13","WV",9,,1,,164,164,95,164,73,43,,0,,,,50,23,626,626,15,0,,,,,,85,,0,14813,700,,,,,,0,14813,700 +"2020-04-13","WY",1,,1,,41,41,,1,,,5689,491,,,6229,,,373,275,9,0,,,,,295,138,,0,6524,314,,,,,,0,6524,314 +"2020-04-12","AK",8,,0,,33,33,,1,,,,0,,,,,,272,,15,0,,,,,,66,,0,8038,306,,,,,,0,8038,306 +"2020-04-12","AL",93,,2,,437,437,290,35,189,,18058,0,,,,119,,3525,3525,334,0,,,,,,,,0,21583,334,,,,,21583,334,,0 +"2020-04-12","AR",27,,3,,130,130,74,0,43,,18442,1090,,,,39,30,1280,1280,54,0,,,,,,367,,0,19722,1144,,,,,,0,19722,1144 +"2020-04-12","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-12","AZ",115,,7,,1074,1074,,37,,,38570,1433,,,,,,3539,,146,0,,,,,,,,0,52289,854,,,,,42109,1579,52289,854 +"2020-04-12","CA",651,,42,,,,5234,0,,1539,168534,15930,,,,,,21794,,1179,0,,,,,,,,0,190328,17109,,,,,,0,190328,17109 +"2020-04-12","CO",290,,16,,1417,1417,842,41,,,29850,1870,,,,,,7303,,410,0,,,,,,,40689,2585,40689,2585,,,,,37153,2280,,0 +"2020-04-12","CT",554,277,60,,,,1654,0,,,,0,,,33743,,,12035,,525,0,,,,,17602,,,0,51382,1805,,,,,,0,51382,1805 +"2020-04-12","DC",50,,3,,,,,0,,,,0,,,,,,1875,,97,0,,,,,,493,10640,601,10640,601,,,,,,0,,0 +"2020-04-12","DE",48,42,5,6,,,190,0,,,9624,0,,,,,,1479,,0,0,,,,,2080,191,16062,1098,16062,1098,,,,,,0,,0 +"2020-04-12","FL",465,,27,,2772,2772,,111,,,163398,8959,,,,,,18404,,1064,0,,,,,,,178055,11251,178055,11251,,,,,,0,,0 +"2020-04-12","GA",433,,5,,2505,2505,,26,,,,0,,,,,,12452,,293,0,,,,,10610,,,0,56613,4844,,,,,,0,56613,4844 +"2020-04-12","GU",5,,0,,,,13,0,,2,693,0,,,,,2,133,,0,0,,,,,,58,,0,826,0,,,,,,0,,0 +"2020-04-12","HI",8,8,0,,44,44,,1,,,17482,416,,,,,,486,,21,0,,,,,440,300,18268,1013,18268,1013,,,,,,0,,0 +"2020-04-12","IA",41,,7,,,,129,0,,55,16005,383,,,,,30,1587,1587,77,0,,,,,,674,,0,17592,460,,,,,,0,,0 +"2020-04-12","ID",27,,2,,131,131,63,3,38,,12901,533,,,,,,1407,,11,0,,,,,,,,0,14308,544,,,,,14308,544,,0 +"2020-04-12","IL",720,,43,,,,3680,0,,1166,,0,,,,,821,20852,,1672,0,,,,,,,,0,100735,7956,,,,,,0,100735,7956 +"2020-04-12","IN",343,,13,,,,,0,,820,34561,2781,,,,,497,7928,,493,0,,,,,8083,,,0,55481,1725,,,,,,0,55481,1725 +"2020-04-12","KS",56,,1,,298,298,,5,,,11916,841,,,,,,1337,,69,0,,,,,,,,0,13253,910,,,,,,0,,0 +"2020-04-12","KY",94,,4,,459,459,271,0,177,105,,0,,,,,,1840,,147,0,,,,,,464,,0,24567,279,,,,,,0,24567,279 +"2020-04-12","LA",840,,34,,,,2084,0,,,83450,6549,,,,,458,20595,20595,581,0,,,,,,,,0,104045,7130,,,,,,0,,0 +"2020-04-12","MA",1056,,110,,2514,2514,2514,7,,,91463,5348,,,,,,25381,,2615,0,,,,,30955,,,0,139881,3802,,,,,,0,139881,3802 +"2020-04-12","MD",335,317,37,18,1860,1860,,151,,,41539,1995,,,,,,8225,8225,531,0,,,,,10004,456,,0,54664,2175,,,,,,0,54664,2175 +"2020-04-12","ME",19,,0,,120,120,,6,,,,0,,,,,,633,633,17,0,,,,,827,266,,0,15937,435,,,,,,0,15937,435 +"2020-04-12","MI",2249,2269,168,113,,,3636,0,,1582,,0,,,64555,,1441,31666,30727,686,0,,,,,33038,433,,0,97593,3286,,,,,,0,97593,3286 +"2020-04-12","MN",70,,6,,361,361,157,21,146,74,38030,1132,,,,,,1864,1864,58,0,,,,,,772,39894,1190,39894,1190,,,,,,0,,0 +"2020-04-12","MO",110,,1,,,,988,0,,,41040,1892,,2,39135,,,4160,4160,136,0,,,0,,5060,,,0,44241,2090,,,2,,,0,44241,2090 +"2020-04-12","MP",2,,0,,,,,0,,,27,0,,,,,,11,,0,0,,,,,,,,0,38,0,,,,,,0,,0 +"2020-04-12","MS",96,,3,,548,548,,20,,,18632,0,,,,,,2781,,139,0,,,,,,,,0,21413,139,,,,,,0,,0 +"2020-04-12","MT",6,,0,,47,47,22,1,,,,0,,,,,,387,,10,0,,,,,,169,,0,8913,332,,,,,,0,8913,332 +"2020-04-12","NC",81,,1,,,,331,0,,,,0,,,,,,4520,,208,0,,,,,,,,0,68909,2875,,,,,,0,68909,2875 +"2020-04-12","ND",8,,1,,39,39,12,3,,,10042,255,,,,,,308,308,15,0,,,,,,121,10407,396,10407,396,,,,,9884,367,10495,401 +"2020-04-12","NE",17,,0,,,,,0,,,9900,615,,,10166,,,791,,91,0,,,,,721,,,0,10979,809,,,,,10197,190,10979,809 +"2020-04-12","NH",23,,1,,146,146,,12,,,9996,388,,,,,,929,,44,0,,,,,,236,,0,11713,375,,,,,,0,11713,375 +"2020-04-12","NJ",3084,2350,240,734,,,7604,0,,1914,64885,2843,,,,,1644,61850,61850,3699,0,,,,,,,,0,126735,6542,,,,,126735,6542,,0 +"2020-04-12","NM",26,,6,,,,80,0,,,,0,,,,,,1174,,83,0,,,,,,235,,0,28692,1594,,,,,,0,28692,1594 +"2020-04-12","NV",128,,3,,,,282,0,,,21775,888,,,,,,2836,2836,136,0,,,,,,,28591,815,28591,815,,,,,,0,29579,1244 +"2020-04-12","NY",9385,,758,,50919,50919,18707,2622,,5198,,0,,,,,,188694,,8236,0,,,,,,,461601,20621,461601,20621,,,,,,0,,0 +"2020-04-12","OH",253,248,6,5,1948,1948,,89,595,,,0,,,,,,6604,6518,354,0,,,,,7116,,,0,64900,3049,,,,,,0,64900,3049 +"2020-04-12","OK",96,,2,,446,446,383,0,,191,20790,0,,,,,,1970,,102,0,,,,,,865,,0,22760,102,,,,,,0,,0 +"2020-04-12","OR",48,,4,,338,338,140,12,,58,25853,1547,,,22414,,46,1371,,50,0,,,,,4134,,,0,26548,2258,,,,,,0,26548,2258 +"2020-04-12","PA",507,,13,,,,2097,0,,,102057,3559,,,,,649,22833,,1178,0,,,,,,,129733,5036,129733,5036,,,,,124890,4737,,0 +"2020-04-12","PR",44,,2,,,,,0,,,5819,236,,,,,,897,,109,0,,,,,,,,0,6716,345,,,,,,0,,0 +"2020-04-12","RI",63,,7,,,,201,0,,50,18578,1448,,,20329,,26,3142,,289,0,,,,,3255,,21532,2202,21532,2202,,,,,21720,1737,23584,1989 +"2020-04-12","SC",82,,2,,496,496,,0,,,28106,1220,,,,,,3319,3319,112,0,,,,,,,,0,31425,1332,,,,,,0,,0 +"2020-04-12","SD",6,,0,,43,43,,10,,,7823,445,,,,,,730,,104,0,,,,,1523,197,,0,8678,450,,,,,8553,549,8678,450 +"2020-04-12","TN",101,,0,,567,567,324,11,,,,0,,,65369,,,5308,,194,0,,,,,5308,1504,,0,70747,3919,,,,,,0,70747,3919 +"2020-04-12","TX",271,,17,,,,1338,0,,,,0,,,,,,13484,13484,923,0,,,,,18974,2014,,0,180831,4374,,,,,,0,180831,4374 +"2020-04-12","UT",18,,0,,195,195,,5,,,45236,1364,,,46447,,,2303,,97,0,,,,,2490,,,0,48937,1511,,,,,47590,1438,48937,1511 +"2020-04-12","VA",141,,11,,837,837,751,65,,440,,0,,,,,294,5274,,197,0,1,3,,,8813,,52556,2365,52556,2365,1,21,,,,0,,0 +"2020-04-12","VI",1,,0,,,,3,0,,,299,0,,,,,,51,,0,0,,,,,,43,,0,350,0,,,,,,0,,0 +"2020-04-12","VT",27,,2,,,,34,0,,,8316,542,,,,,,733,733,20,0,,,,,,15,,0,9609,548,,,,,9049,562,9609,548 +"2020-04-12","WA",509,,15,,,,642,0,,191,,0,,,,,,10458,10458,309,0,,,,,,,136957,1481,136957,1481,,,,,131718,1431,,0 +"2020-04-12","WI",144,,7,,974,974,443,24,261,176,35916,1236,,,,,,3964,3341,142,0,,,,,,,42017,1527,42017,1527,,,,,,0,,0 +"2020-04-12","WV",8,,3,,,,81,0,,36,,0,,,,,24,611,611,34,0,,,,,,83,,0,14113,639,,,,,,0,14113,639 +"2020-04-12","WY",0,,0,,40,40,,3,,,5198,0,,,5923,,,364,270,21,0,,,,,287,137,,0,6210,47,,,,,,0,6210,47 +"2020-04-11","AK",8,,1,,32,32,,2,,,,0,,,,,,257,,11,0,,,,,,63,,0,7732,300,,,,,,0,7732,300 +"2020-04-11","AL",91,,11,,402,402,343,34,177,,18058,0,,,,113,,3191,3191,223,0,,,,,,,,0,21249,223,,,,,21249,223,,0 +"2020-04-11","AR",24,,1,,130,130,86,0,43,,17352,1403,,,,39,33,1226,1226,55,0,,,,,,340,,0,18578,1458,,,,,,0,18578,1458 +"2020-04-11","AS",,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-11","AZ",108,,11,,1037,1037,,42,,,37137,2515,,,,,,3393,,281,0,,,,,,,,0,51435,1961,,,,,40530,2796,51435,1961 +"2020-04-11","CA",609,,68,,,,5236,0,,1591,152604,7213,,,,,,20615,,1143,0,,,,,,,,0,173219,8356,,,,,,0,173219,8356 +"2020-04-11","CO",274,,24,,1376,1376,822,64,,,27980,1837,,,,,,6893,,383,0,,,,,,,38104,2462,38104,2462,,,,,34873,2220,,0 +"2020-04-11","CT",494,206,46,,,,1593,0,,,,0,,,32632,,,11510,,972,0,,,,,16908,,,0,49577,2801,,,,,,0,49577,2801 +"2020-04-11","DC",47,,9,,,,,0,,,,0,,,,,,1778,,118,0,,,,,,447,10039,684,10039,684,,,,,,0,,0 +"2020-04-11","DE",43,37,7,6,,,190,0,,,9624,-791,,,,,,1479,,153,0,,,,,1852,191,14964,661,14964,661,,,,,,0,,0 +"2020-04-11","FL",438,,48,,2661,2661,,174,,,154439,9140,,,,,,17340,,1088,0,,,,,,,166804,9442,166804,9442,,,,,,0,,0 +"2020-04-11","GA",428,,12,,2479,2479,,128,,,,0,,,,,,12159,,676,0,,,,,9912,,,0,51769,5581,,,,,,0,51769,5581 +"2020-04-11","GU",5,,1,,,,14,0,,2,693,31,,,,,2,133,,3,0,,,,,,58,,0,826,34,,,,,,0,,0 +"2020-04-11","HI",8,8,2,,43,43,,1,,,17066,1359,,,,,,465,,23,0,,,,,420,284,17255,717,17255,717,,,,,,0,,0 +"2020-04-11","IA",34,,3,,,,118,0,,55,15622,1057,,,,,30,1510,1510,122,0,,,,,,585,,0,17132,1179,,,,,,0,,0 +"2020-04-11","ID",25,,1,,128,128,61,1,35,,12368,627,,,,,,1396,,43,0,,,,,,,,0,13764,670,,,,,13764,670,,0 +"2020-04-11","IL",677,,81,,,,3680,0,,1166,,0,,,,,821,19180,,1293,0,,,,,,,,0,92779,5252,,,,,,0,92779,5252 +"2020-04-11","IN",330,,30,,,,,0,,820,31780,3647,,,,,497,7435,,528,0,,,,,7861,,,0,53756,3131,,,,,,0,53756,3131 +"2020-04-11","KS",55,,5,,293,293,,19,,,11075,827,,,,,,1268,,102,0,,,,,,,,0,12343,929,,,,,,0,,0 +"2020-04-11","KY",90,,0,,459,459,271,0,177,105,,0,,,,,,1693,,0,0,,,,,,464,,0,24288,0,,,,,,0,24288,0 +"2020-04-11","LA",806,,51,,,,2067,0,,,76901,3874,,,,,470,20014,20014,761,0,,,,,,,,0,96915,4635,,,,,,0,,0 +"2020-04-11","MA",946,,114,,2507,2507,2507,72,,,86115,4551,,,,,,22766,,1888,0,,,,,29883,,,0,136079,5306,,,,,,0,136079,5306 +"2020-04-11","MD",298,286,43,12,1709,1709,,296,,,39544,2064,,,,,,7694,7694,726,0,,,,,9469,431,,0,52489,3632,,,,,,0,52489,3632 +"2020-04-11","ME",19,,2,,114,114,,3,,,,0,,,,,,616,616,30,0,,,,,764,256,,0,15502,583,,,,,,0,15502,583 +"2020-04-11","MI",2081,2136,164,103,,,3636,0,,1582,,0,,,62241,,1441,30980,30085,808,0,,,,,32066,595,,0,94307,3755,,,,,,0,94307,3755 +"2020-04-11","MN",64,,7,,340,340,145,23,138,69,36898,1552,,,,,,1806,1806,74,0,,,,,,729,38704,1626,38704,1626,,,,,,0,,0 +"2020-04-11","MO",109,,13,,,,506,0,,,39148,2207,,2,37292,,,4024,4024,225,0,,,0,,4818,,,0,42151,1978,,,2,,,0,42151,1978 +"2020-04-11","MP",2,,0,,,,,0,,,27,0,,,,,,11,,0,0,,,,,,,,0,38,0,,,,,,0,,0 +"2020-04-11","MS",93,,11,,528,528,,46,,,18632,0,,,,,,2642,,173,0,,,,,,,,0,21274,173,,,,,,0,,0 +"2020-04-11","MT",6,,0,,46,46,21,5,,,,0,,,,,,377,,12,0,,,,,,169,,0,8581,284,,,,,,0,8581,284 +"2020-04-11","NC",80,,6,,,,362,0,,,,0,,,,,,4312,,404,0,,,,,,,,0,66034,10211,,,,,,0,66034,10211 +"2020-04-11","ND",7,,1,,36,36,10,0,,,9787,457,,,,,,293,293,15,0,,,,,,119,10011,610,10011,610,,,,,9517,561,10094,616 +"2020-04-11","NE",17,,2,,,,,0,,,9285,566,,,9412,,,700,,65,0,,,,,668,,,0,10170,675,,,,,10007,632,10170,675 +"2020-04-11","NH",22,,1,,134,134,,10,,,9608,469,,,,,,885,,66,0,,,,,,234,,0,11338,549,,,,,,0,11338,549 +"2020-04-11","NJ",2844,2183,323,661,,,7618,0,,1746,62042,3107,,,,,1650,58151,58151,3563,0,,,,,,,,0,120193,6670,,,,,120193,6670,,0 +"2020-04-11","NM",20,,1,,,,78,0,,,,0,,,,,18,1091,,102,0,,,,,,235,,0,27098,3167,,,,,,0,27098,3167 +"2020-04-11","NV",125,,5,,,,282,0,,,20887,722,,,,,,2700,2700,116,0,,,,,,,27776,1239,27776,1239,,,,,,0,28335,1049 +"2020-04-11","NY",8627,,783,,48297,48297,18654,2529,,5009,,0,,,,,,180458,,9946,0,,,,,,,440980,23095,440980,23095,,,,,,0,,0 +"2020-04-11","OH",247,242,16,5,1859,1859,,104,572,,,0,,,,,,6250,6187,372,0,,,,,6684,,,0,61851,3111,,,,,,0,61851,3111 +"2020-04-11","OK",94,,6,,446,446,383,18,,191,20790,420,,,,,,1868,,74,0,,,,,,865,,0,22658,494,,,,,,0,,0 +"2020-04-11","OR",44,,0,,326,326,146,0,,66,24306,0,,,20321,,54,1321,,0,0,,,,,3969,,,0,24290,2185,,,,,,0,24290,2185 +"2020-04-11","PA",494,,78,,,,2115,0,,,98498,5458,,,,,639,21655,,1676,0,,,,,,,124697,7757,124697,7757,,,,,120153,7134,,0 +"2020-04-11","PR",42,,3,,,,,0,,,5583,462,,,,,,788,,63,0,,,,,,,,0,6371,525,,,,,,0,,0 +"2020-04-11","RI",56,,7,,,,183,0,,50,17130,1727,,,18655,,26,2853,,280,0,,,,,2940,,19330,2993,19330,2993,,,,,19983,2007,21595,2210 +"2020-04-11","SC",80,,8,,496,496,,0,,,26886,1768,,,,,,3207,3207,142,0,,,,,,,,0,30093,1910,,,,,,0,,0 +"2020-04-11","SD",6,,0,,33,33,,4,,,7378,267,,,,,,626,,90,0,,,,,1425,189,,0,8228,540,,,,,8004,357,8228,540 +"2020-04-11","TN",101,,3,,556,556,411,20,,,,0,,,61714,,,5114,,252,0,,,,,5114,1386,,0,66828,4029,,,,,,0,66828,4029 +"2020-04-11","TX",254,,28,,,,1514,0,,,,0,,,,,,12561,12561,890,0,,,,,18484,1617,,0,176457,10316,,,,,,0,176457,10316 +"2020-04-11","UT",18,,1,,190,190,,7,,,43872,1936,,,45020,,,2206,,104,0,,,,,2406,,,0,47426,2185,,,,,46152,2049,47426,2185 +"2020-04-11","VA",130,,9,,772,772,1252,87,,426,,0,,,,,283,5077,,568,0,1,3,,,8351,,50191,2799,50191,2799,1,21,,,,0,,0 +"2020-04-11","VI",1,,0,,,,3,0,,,299,26,,,,,,51,,1,0,,,,,,43,,0,350,27,,,,,,0,,0 +"2020-04-11","VT",25,,1,,,,77,0,,,7774,525,,,,,,713,713,33,0,,,,,,15,,0,9061,589,,,,,8487,558,9061,589 +"2020-04-11","WA",494,,18,,,,649,0,,191,,0,,,,,,10149,10149,363,0,,,,,,,135476,2187,135476,2187,,,,,130287,2076,,0 +"2020-04-11","WI",137,,9,,950,950,445,46,257,184,34680,1455,,,,,,3822,3213,157,0,,,,,,,40490,1787,40490,1787,,,,,,0,,0 +"2020-04-11","WV",5,,0,,,,85,0,,40,,0,,,,,22,577,577,23,0,,,,,,63,,0,13474,1156,,,,,,0,13474,1156 +"2020-04-11","WY",0,,0,,37,37,,0,,,5198,462,,,5876,,,343,261,3,0,,,,,287,129,,0,6163,104,,,,,,0,6163,104 +"2020-04-10","AK",7,,0,,30,30,,0,,,,0,,,,,,246,,11,0,,,,,,55,,0,7432,209,,,,,,0,7432,209 +"2020-04-10","AL",80,,6,,368,368,350,35,,,18058,0,,,,,,2968,2968,199,0,,,,,,,,0,21026,199,,,,,21026,199,,0 +"2020-04-10","AR",23,,2,,130,130,86,0,43,,15949,2117,,,,39,33,1171,1171,52,0,,,,,,312,,0,17120,2169,,,,,,0,17120,2169 +"2020-04-10","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-10","AZ",97,,8,,995,995,,45,,,34622,462,,,,,,3112,,94,0,,,,,,,,0,49474,2106,,,,,37734,556,49474,2106 +"2020-04-10","CA",541,,49,,,,2897,0,,1145,145391,200,,,,,,19472,,1163,0,,,,,,,,0,164863,1363,,,,,,0,164863,1363 +"2020-04-10","CO",250,,24,,1312,1312,841,91,,,26143,0,,,,,,6510,,308,0,,,,,,,35642,1675,35642,1675,,,,,32653,1473,,0 +"2020-04-10","CT",448,189,68,,,,1562,0,,,,0,,,31005,,,10538,,754,0,,,,,15741,,,0,46776,2574,,,,,,0,46776,2574 +"2020-04-10","DC",38,,6,,,,,0,,,,0,,,,,,1660,,137,0,,,,,,426,9355,631,9355,631,,,,,,0,,0 +"2020-04-10","DE",36,30,2,6,,,181,0,,,10415,1732,,,,,,1326,,119,0,,,,,1729,177,14303,869,14303,869,,,,,,0,,0 +"2020-04-10","FL",390,,36,,2487,2487,,219,,,145299,9114,,,,,,16252,,1033,0,,,,,,,157362,14011,157362,14011,,,,,,0,,0 +"2020-04-10","GA",416,,37,,2351,2351,,192,,,,0,,,,,,11483,,917,0,,,,,9391,,,0,46188,1360,,,,,,0,46188,1360 +"2020-04-10","GU",4,,0,,,,14,0,,2,662,69,,,,,2,130,,2,0,,,,,,41,,0,792,71,,,,,,0,,0 +"2020-04-10","HI",6,6,1,,42,42,,0,,,15707,391,,,,,,442,,7,0,,,,,410,251,16538,553,16538,553,,,,,,0,,0 +"2020-04-10","IA",31,,2,,,,125,0,,55,14565,862,,,,,30,1388,1388,118,0,,,,,,506,,0,15953,980,,,,,,0,,0 +"2020-04-10","ID",24,,6,,127,127,67,14,33,,11741,442,,,,,,1353,,121,0,,,,,,,,0,13094,563,,,,,13094,563,,0 +"2020-04-10","IL",596,,68,,,,3680,0,,1166,,0,,,,,821,17887,,1465,0,,,,,,,,0,87527,6670,,,,,,0,87527,6670 +"2020-04-10","IN",300,,55,,,,,0,,820,28133,2351,,,,,497,6907,,556,0,,,,,7434,,,0,50625,3050,,,,,,0,50625,3050 +"2020-04-10","KS",50,,8,,274,274,,11,,,10248,579,,,,,,1166,,60,0,,,,,,,,0,11414,639,,,,,,0,,0 +"2020-04-10","KY",90,,17,,459,459,271,459,177,105,,0,,,,,,1693,,347,0,,,,,,464,,0,24288,2487,,,,,,0,24288,2487 +"2020-04-10","LA",755,,53,,,,2054,0,,,73027,4391,,,,,479,19253,19253,970,0,,,,,,,,0,92280,5361,,,,,,0,,0 +"2020-04-10","MA",832,,107,,2435,2435,2435,133,,,81564,5418,,,,,,20878,,2035,0,,,,,28410,,,0,130773,8851,,,,,,0,130773,8851 +"2020-04-10","MD",255,244,34,11,1413,1413,,65,,,37480,2136,,,,,,6968,6968,783,0,,,,,8595,397,,0,48857,3924,,,,,,0,48857,3924 +"2020-04-10","ME",17,,1,,111,111,,6,,,,0,,,,,,586,586,26,0,,,,,734,246,,0,14919,489,,,,,,0,14919,489 +"2020-04-10","MI",1917,1978,161,95,,,3823,0,,1663,,0,,,59597,,1394,30172,29327,1076,0,,,,,30955,56,,0,90552,4580,,,,,,0,90552,4580 +"2020-04-10","MN",57,,7,,317,317,143,24,131,64,35346,1664,,,,,,1732,1732,95,0,,,,,,675,37078,1759,37078,1759,,,,,,0,,0 +"2020-04-10","MO",96,,19,,,,568,0,,,36941,1986,,2,35533,,,3799,3799,260,0,,,0,,4603,,,0,40173,2271,,,2,,,0,40173,2271 +"2020-04-10","MP",2,,0,,,,,0,,,27,0,,,,,,11,,0,0,,,,,,,,0,38,0,,,,,,0,,0 +"2020-04-10","MS",82,,6,,482,482,,41,,,18632,0,,,,,,2469,,209,0,,,,,,,,0,21101,209,,,,,,0,,0 +"2020-04-10","MT",6,,0,,41,41,29,5,,,,0,,,,,,365,,11,0,,,,,,165,,0,8297,437,,,,,,0,8297,437 +"2020-04-10","NC",74,,9,,,,423,0,,,,0,,,,,,3908,,257,0,,,,,,,,0,55823,5262,,,,,,0,55823,5262 +"2020-04-10","ND",6,,1,,36,36,13,2,,,9330,609,,,,,,278,278,9,0,,,,,,105,9401,427,9401,427,,,,,8956,399,9478,432 +"2020-04-10","NE",15,,1,,,,,0,,,8719,603,,,8806,,,635,,68,0,,,,,605,,,0,9495,812,,,,,9375,523,9495,812 +"2020-04-10","NH",21,,3,,124,124,,6,,,9139,376,,,,,,819,,31,0,,,,,,234,,0,10789,454,,,,,,0,10789,454 +"2020-04-10","NJ",2521,1932,285,589,,,7570,0,,1679,58935,2770,,,,,1663,54588,54588,3561,0,,,,,,,,0,113523,6331,,,,,113523,6331,,0 +"2020-04-10","NM",19,,0,,,,75,0,,,,0,,,,,18,989,,124,0,,,,,,235,,0,23931,124,,,,,,0,23931,124 +"2020-04-10","NV",120,,10,,,,282,0,,,20165,850,,,,,,2584,2584,128,0,,,,,,,26537,1141,26537,1141,,,,,,0,27286,1212 +"2020-04-10","NY",7844,,777,,45768,45768,18569,2916,,4908,,0,,,,,,170512,,10575,0,,,,,,,417885,26336,417885,26336,,,,,,0,,0 +"2020-04-10","OH",231,227,18,4,1755,1755,,143,548,,,0,,,,,,5878,5836,366,0,,,,,6260,,,0,58740,3120,,,,,,0,58740,3120 +"2020-04-10","OK",88,,8,,428,428,186,13,,122,20370,1775,,,,,,1794,,110,0,,,,,,790,,0,22164,1885,,,,,,0,,0 +"2020-04-10","OR",44,,11,,326,326,146,2,,66,24306,981,,,18277,,54,1321,,82,0,,,,,3828,,,0,22105,1916,,,,,,0,22105,1916 +"2020-04-10","PA",416,,78,,,,2072,0,,,93040,5666,,,,,611,19979,,1751,0,,,,,,,116940,7792,116940,7792,,,,,113019,7417,,0 +"2020-04-10","PR",39,,6,,,,,0,,,5121,418,,,,,,725,,42,0,,,,,,,,0,5846,460,,,,,,0,,0 +"2020-04-10","RI",49,,6,,,,169,0,,45,15403,2374,,,16744,,26,2573,,404,0,,,,,2641,,16337,1799,16337,1799,,,,,17976,2778,19385,2997 +"2020-04-10","SC",72,,5,,496,496,,255,,,25118,543,,,,,,3065,3065,273,0,,,,,,,,0,28183,816,,,,,,0,,0 +"2020-04-10","SD",6,,0,,29,29,,2,,,7111,411,,,,,,536,,89,0,,,,,1319,177,,0,7688,376,,,,,7647,500,7688,376 +"2020-04-10","TN",98,,4,,536,536,561,31,,,,0,,,57937,,,4862,,228,0,,,,,4862,1145,,0,62799,2950,,,,,,0,62799,2950 +"2020-04-10","TX",226,,27,,,,1532,0,,,,0,,,,,,11671,11671,1441,0,,,,,17430,1366,,0,166141,10016,,,,,,0,166141,10016 +"2020-04-10","UT",17,,4,,183,183,,15,,,41936,1957,,,42954,,,2102,,126,0,,,,,2287,,,0,45241,2151,,,,,44103,2053,45241,2151 +"2020-04-10","VA",121,,12,,685,685,1238,122,,457,,0,,,,,287,4509,,467,0,1,3,,,7915,,47392,3372,47392,3372,1,21,,,,0,,0 +"2020-04-10","VI",1,,0,,,,3,0,,,273,22,,,,,,50,,4,0,,,,,,43,,0,323,26,,,,,,0,,0 +"2020-04-10","VT",24,,1,,,,32,0,,,7249,274,,,,,,680,680,49,0,,,,,,15,,0,8472,308,,,,,7929,323,8472,308 +"2020-04-10","WA",476,,17,,,,642,0,,191,,0,,,,,,9786,9786,346,0,,,,,,,133289,4481,133289,4481,,,,,128211,4299,,0 +"2020-04-10","WI",128,,17,,904,904,443,61,247,185,33225,1801,,,,,,3665,3068,222,0,,,,,,,38703,1998,38703,1998,,,,,,0,,0 +"2020-04-10","WV",5,,0,,,,85,0,,20,,0,,,,,22,554,554,31,0,,,,,,63,,0,12318,991,,,,,,0,12318,991 +"2020-04-10","WY",0,,0,,37,37,,3,,,4736,816,,,5778,,,340,253,20,0,,,,,281,105,,0,6059,272,,,,,,0,6059,272 +"2020-04-09","AK",7,,0,,30,30,,2,,,,0,,,,,,235,,9,0,,,,,,49,,0,7223,155,,,,,,0,7223,155 +"2020-04-09","AL",74,,8,,333,333,324,19,,,18058,1305,,,,,,2769,2769,400,0,,,,,,,,0,20827,1705,,,,,20827,1705,,0 +"2020-04-09","AR",21,,3,,130,130,73,0,43,,13832,302,,,,39,31,1119,1119,119,0,,,,,,288,,0,14951,421,,,,,,0,14951,421 +"2020-04-09","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-09","AZ",89,,9,,950,950,,44,,,34160,2322,,,,,,3018,,292,0,,,,,,,,0,47368,1889,,,,,37178,2614,47368,1889 +"2020-04-09","CA",492,,50,,,,2825,0,,1132,145191,17884,,,,,,18309,,1352,0,,,,,,,,0,163500,19236,,,,,,0,163500,19236 +"2020-04-09","CO",226,,33,,1221,1221,842,59,,,26143,2599,,,,,,6202,,547,0,,,,,,,33967,2199,33967,2199,,,,,31180,1981,,0 +"2020-04-09","CT",380,165,103,,,,1464,0,,,,0,,,29479,,,9784,,2003,0,,,,,14696,,,0,44202,3006,,,,,,0,44202,3006 +"2020-04-09","DC",32,,5,,,,,0,,,,0,,,,,,1523,,83,0,,,,,,393,8724,441,8724,441,,,,,,0,,0 +"2020-04-09","DE",34,28,2,6,,,201,0,,,8683,1055,,,,,,1207,,279,0,,,,,1547,173,13434,1218,13434,1218,,,,,,0,,0 +"2020-04-09","FL",354,,45,,2268,2268,,206,,,136185,8506,,,,,,15219,,1046,0,,,,,,,143351,6493,143351,6493,,,,,,0,,0 +"2020-04-09","GA",379,,17,,2159,2159,,166,,,,0,,,,,,10566,,665,0,,,,,9153,,,0,44828,3829,,,,,,0,44828,3829 +"2020-04-09","GU",4,,0,,,,14,0,,2,593,31,,,,,2,128,,3,0,,,,,,33,,0,721,34,,,,,,0,,0 +"2020-04-09","HI",5,5,0,,42,42,,0,,,15316,577,,,,,,435,,25,0,,,,,401,113,15985,756,15985,756,,,,,,0,,0 +"2020-04-09","IA",29,,2,,,,122,-193,,,13703,882,,,,,,1270,1270,125,0,,,,,,476,,0,14973,1007,,,,,,0,,0 +"2020-04-09","ID",18,,3,,113,113,70,20,29,,11299,611,,,,,,1232,,22,0,,,,,,,,0,12531,633,,,,,12531,633,,0 +"2020-04-09","IL",528,,66,,,,3680,0,,1166,,0,,,,,821,16422,,1344,0,,,,,,,,0,80857,5791,,,,,,0,80857,5791 +"2020-04-09","IN",245,,42,,,,,0,,924,25782,856,,,,,507,6351,,408,0,,,,,7032,,,0,47575,3381,,,,,,0,47575,3381 +"2020-04-09","KS",42,,4,,263,263,,40,,,9669,532,,,,,,1106,,60,0,,,,,,,,0,10775,592,,,,,,0,,0 +"2020-04-09","KY",73,,8,,,,,0,,,,0,,,,,,1346,,197,0,,,,,,,,0,21801,197,,,,,,0,21801,197 +"2020-04-09","LA",702,,50,,,,2014,0,,,68636,4260,,,,,473,18283,18283,1253,0,,,,,,,,0,86919,5513,,,,,,0,,0 +"2020-04-09","MA",725,,110,,2302,2302,2302,183,,,76146,5297,,,,,,18843,,2151,0,,,,,26096,,,0,121922,7775,,,,,,0,121922,7775 +"2020-04-09","MD",221,210,30,11,1348,1348,,138,,,35344,2411,,,,,,6185,6185,656,0,,,,,7660,376,,0,44933,3155,,,,,,0,44933,3155 +"2020-04-09","ME",16,,2,,105,105,,4,,,,0,,,,,,560,560,23,0,,,,,700,202,,0,14430,480,,,,,,0,14430,480 +"2020-04-09","MI",1756,1822,156,88,,,3826,0,,1628,,0,,,56430,,1434,29096,28303,1032,0,,,,,29542,56,,0,85972,4786,,,,,,0,85972,4786 +"2020-04-09","MN",50,,11,,293,293,145,22,119,63,33682,1728,,,,,,1637,1637,103,0,,,,,,625,35319,1831,35319,1831,,,,,,0,,0 +"2020-04-09","MO",77,,19,,,,568,0,,,34955,4172,,2,33518,,,3539,3539,212,0,,,0,,4348,,,0,37902,2303,,,2,,,0,37902,2303 +"2020-04-09","MP",2,,0,,,,,0,,,27,0,,,,,,11,,0,0,,,,,,,,0,38,0,,,,,,0,,0 +"2020-04-09","MS",76,,9,,441,441,,31,,,18632,0,,,,,,2260,,257,0,,,,,,,,0,20892,257,,,,,,0,,0 +"2020-04-09","MT",6,,0,,36,36,13,5,,,,0,,,,,,354,,22,0,,,,,,157,,0,7860,462,,,,,,0,7860,462 +"2020-04-09","NC",65,,12,,,,398,0,,,,0,,,,,,3651,,225,0,,,,,,,,0,50561,2431,,,,,,0,50561,2431 +"2020-04-09","ND",5,,1,,34,34,14,0,,,8721,420,,,,,,269,269,18,0,,,,,,101,8974,543,8974,543,,,,,8557,498,9046,550 +"2020-04-09","NE",14,,2,,,,,0,,,8116,674,,,8056,,,567,,48,0,,,,,549,,,0,8683,667,,,,,8852,785,8683,667 +"2020-04-09","NH",18,,0,,118,118,,0,,,8763,374,,,,,,788,,0,0,,,,,,227,,0,10335,447,,,,,,0,10335,447 +"2020-04-09","NJ",2236,1700,267,536,,,7363,0,,1523,56165,3186,,,,,1551,51027,51027,3590,0,,,,,,,,0,107192,6776,,,,,107192,6776,,0 +"2020-04-09","NM",19,,3,,,,73,0,,,,0,,,,,18,865,,71,0,,,,,,217,,0,23807,1874,,,,,,0,23807,1874 +"2020-04-09","NV",110,,9,,,,282,0,,,19315,1067,,,,,,2456,2456,138,0,,,,,,,25396,1245,25396,1245,,,,,,0,26074,1440 +"2020-04-09","NY",7067,,799,,42852,42852,18279,2870,,4925,,0,,,,,,159937,,10621,0,,,,,,,391549,26396,391549,26396,,,,,,0,,0 +"2020-04-09","OH",213,,20,,1612,1612,,117,497,,,0,,,,,,5512,5512,364,0,,,,,5868,,,0,55620,3215,,,,,,0,55620,3215 +"2020-04-09","OK",80,,1,,415,415,188,25,,120,18595,6774,,,,,,1684,,160,0,,,,,,686,,0,20279,6934,,,,,,0,,0 +"2020-04-09","OR",33,,0,,324,324,156,0,,61,23325,1499,,,16529,,58,1239,,58,0,,,,,3660,,,0,20189,2168,,,,,,0,20189,2168 +"2020-04-09","PA",338,,29,,,,2051,0,,,87374,5075,,,,,592,18228,,1989,0,,,,,,,109148,7404,109148,7404,,,,,105602,7064,,0 +"2020-04-09","PR",33,,9,,,,,0,,,4703,437,,,,,,683,,63,0,,,,,,,,0,5386,500,,,,,,0,,0 +"2020-04-09","RI",43,,8,,,,160,0,,45,13029,1362,,,14167,,26,2169,,279,0,,,,,2221,,14538,2010,14538,2010,,,,,15198,1641,16388,1805 +"2020-04-09","SC",67,,4,,241,241,,0,,,24575,2493,,,,,,2792,2792,240,0,,,,,,,,0,27367,2733,,,,,,0,,0 +"2020-04-09","SD",6,,0,,27,27,,1,,,6700,345,,,,,,447,,54,0,,,,,1263,161,,0,7312,498,,,,,7147,399,7312,498 +"2020-04-09","TN",94,,15,,505,505,639,56,,,,0,,,55215,,,4634,,272,0,,,,,4634,921,,0,59849,3231,,,,,,0,59849,3231 +"2020-04-09","TX",199,,22,,,,1439,0,,,,0,,,,,,10230,10230,877,0,,,,,16406,1101,,0,156125,9648,,,,,,0,156125,9648 +"2020-04-09","UT",13,,0,,168,168,,10,,,39979,2101,,,40906,,,1976,,130,0,,,,,2184,,,0,43090,2287,,,,,42050,2186,43090,2287 +"2020-04-09","VA",109,,34,,563,563,669,0,,469,,0,,,,,285,4042,,397,0,1,3,,,7378,,44020,2310,44020,2310,1,20,,,,0,,0 +"2020-04-09","VI",1,,0,,,,,0,,,251,9,,,,,,46,,1,0,,,,,,39,,0,297,10,,,,,,0,,0 +"2020-04-09","VT",23,,0,,,,33,-50,,,6975,198,,,,,,631,631,23,0,,,,,,15,,0,8164,377,,,,,7606,221,8164,377 +"2020-04-09","WA",459,,16,,,,650,0,,191,,0,,,,,,9440,9440,413,0,,,,,,,128808,4491,128808,4491,,,,,123912,4306,,0 +"2020-04-09","WI",111,,12,,843,843,446,53,230,196,31424,1309,,,,,,3443,2885,164,0,,,,,,,36705,1870,36705,1870,,,,,,0,,0 +"2020-04-09","WV",5,,1,,,,,0,,,,0,,,,,,523,523,61,0,,,,,,,,0,11327,620,,,,,,0,11327,620 +"2020-04-09","WY",0,,0,,34,34,,1,,,3920,77,,,5517,,,320,239,17,0,,,,,270,94,,0,5787,328,,,,,,0,5787,328 +"2020-04-08","AK",7,,1,,28,28,,2,,,,0,,,,,,226,,13,0,,,,,,32,,0,7068,155,,,,,,0,7068,155 +"2020-04-08","AL",66,,10,,314,314,308,43,,,16753,3956,,,,,,2369,2369,250,0,,,,,,,,0,19122,4206,,,,,19122,4206,,0 +"2020-04-08","AR",18,,2,,130,130,76,-18,43,,13530,838,,,,39,30,1000,1000,54,0,,,,,,208,,0,14530,892,,,,,,0,14530,892 +"2020-04-08","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-08","AZ",80,,7,,906,906,,53,,,31838,1038,,,,,,2726,,151,0,,,,,,,,0,45479,2420,,,,,34564,1189,45479,2420 +"2020-04-08","CA",442,,68,,,,2714,0,,1154,127307,11943,,,,,,16957,,1092,0,,,,,,,,0,144264,13035,,,,,,0,144264,13035 +"2020-04-08","CO",193,,14,,1162,1162,848,83,,,23544,879,,,,,,5655,,226,0,,,,,,,31768,1233,31768,1233,,,,,29199,1105,,0 +"2020-04-08","CT",277,131,0,,,,1308,0,,,,0,,,27673,,,7781,,0,0,,,,,13497,,,0,41196,2873,,,,,,0,41196,2873 +"2020-04-08","DC",27,,5,,,,,0,,,,0,,,,,,1440,,229,0,,,,,,361,8283,460,8283,460,,,,,,0,,0 +"2020-04-08","DE",32,27,4,5,,,147,0,,,7628,0,,,,,,928,,0,0,,,,,1298,144,12216,661,12216,661,,,,,,0,,0 +"2020-04-08","FL",309,,13,,2062,2062,,63,,,127679,4264,,,,,,14173,,1006,0,,,,,,,136858,11510,136858,11510,,,,,,0,,0 +"2020-04-08","GA",362,,33,,1993,1993,,219,,,,0,,,,,,9901,,1083,0,,,,,8525,,,0,40999,3002,,,,,,0,40999,3002 +"2020-04-08","GU",4,,0,,,,21,0,,2,562,33,,,,,2,125,,4,0,,,,,,31,,0,687,37,,,,,,0,,0 +"2020-04-08","HI",5,5,0,,42,42,,16,,,14739,1584,,,,,,410,,23,0,,,,,372,113,15229,830,15229,830,,,,,,0,,0 +"2020-04-08","IA",27,,1,,193,193,122,0,,,12821,1151,,,,,,1145,1145,97,0,,,,,,431,,0,13966,1248,,,,,,0,,0 +"2020-04-08","ID",15,,2,,93,93,62,10,24,,10688,612,,,,,,1210,,40,0,,,,,,,,0,11898,652,,,,,11898,652,,0 +"2020-04-08","IL",462,,82,,,,3680,0,,1166,,0,,,,,821,15078,,1529,0,,,,,,,,0,75066,6334,,,,,,0,75066,6334 +"2020-04-08","IN",203,,30,,,,,0,,924,24926,1669,,,,,507,5943,,436,0,,,,,6475,,,0,44194,3016,,,,,,0,44194,3016 +"2020-04-08","KS",38,,11,,223,223,,0,,,9137,523,,,,,,1046,,146,0,,,,,,,,0,10183,669,,,,,,0,,0 +"2020-04-08","KY",65,,6,,,,,0,,,,0,,,,,,1149,,141,0,,,,,,,,0,21604,1649,,,,,,0,21604,1649 +"2020-04-08","LA",652,,70,,,,1983,0,,,64376,6005,,,,,490,17030,17030,746,0,,,,,,,,0,81406,6751,,,,,,0,,0 +"2020-04-08","MA",615,,100,,2119,2119,2119,288,,,70849,4579,,,,,,16692,,1588,0,,,,,23820,,,0,114147,7958,,,,,,0,114147,7958 +"2020-04-08","MD",191,181,31,10,1210,1210,,104,,,32933,5677,,,,,,5529,5529,1158,0,,,,,6976,365,,0,41778,7936,,,,,,0,41778,7936 +"2020-04-08","ME",14,,2,,101,101,,2,,,,0,,,,,,537,537,18,0,,,,,676,187,,0,13950,706,,,,,,0,13950,706 +"2020-04-08","MI",1600,1668,151,78,,,,0,,,,0,,,53176,,,28064,27334,1100,0,,,,,28010,56,,0,81186,4053,,,,,,0,81186,4053 +"2020-04-08","MN",39,,5,,271,271,135,29,105,64,31954,1351,,,,,,1534,1534,102,0,,,,,,593,33488,1453,33488,1453,,,,,,0,,0 +"2020-04-08","MO",58,,5,,,,519,0,,,30783,1851,,2,31459,,,3327,3327,290,0,,,0,,4106,,,0,35599,2744,,,2,,,0,35599,2744 +"2020-04-08","MP",2,,0,,,,,0,,,27,12,,,,,,11,,3,0,,,,,,,,0,38,15,,,,,,0,,0 +"2020-04-08","MS",67,,8,,410,410,,33,,,18632,0,,,,,,2003,,88,0,,,,,,,,0,20635,88,,,,,,0,,0 +"2020-04-08","MT",6,,0,,31,31,,3,,,,0,,,,,,332,,13,0,,,,,,135,,0,7398,413,,,,,,0,7398,413 +"2020-04-08","NC",53,,7,,,,386,0,,,,0,,,,,,3426,,205,0,,,,,,,,0,48130,913,,,,,,0,48130,913 +"2020-04-08","ND",4,,0,,34,34,16,1,,,8301,835,,,,,,251,251,14,0,,,,,,98,8431,877,8431,877,,,,,8059,828,8496,884 +"2020-04-08","NE",12,,2,,,,,0,,,7442,631,,,7439,,,519,,72,0,,,,,502,,,0,8016,561,,,,,8067,798,8016,561 +"2020-04-08","NH",18,,9,,118,118,,15,,,8389,370,,,,,,788,,73,0,,,,,,211,,0,9888,431,,,,,,0,9888,431 +"2020-04-08","NJ",1969,1504,338,465,,,7026,0,,1617,52979,2421,,,,,1576,47437,47437,3021,0,,,,,,,,0,100416,5442,,,,,100416,5442,,0 +"2020-04-08","NM",16,,3,,,,59,0,,,,0,,,,,18,794,,108,0,,,,,,201,,0,21933,108,,,,,,0,21933,108 +"2020-04-08","NV",101,,10,,,,282,0,,,18248,1696,,,,,,2318,2318,231,0,,,,,,,24151,1081,24151,1081,,,,,,0,24634,2816 +"2020-04-08","NY",6268,,779,,39982,39982,18079,3050,,4841,,0,,,,,,149316,,10453,0,,,,,,,365153,25095,365153,25095,,,,,,0,,0 +"2020-04-08","OH",193,,26,,1495,1495,,141,472,,,0,,,,,,5148,5148,366,0,,,,,5435,,,0,52405,2535,,,,,,0,52405,2535 +"2020-04-08","OK",79,,12,,390,390,188,14,,120,11821,0,,,,,,1524,,52,0,,,,,,686,,0,13345,52,,,,,,0,,0 +"2020-04-08","OR",33,,6,,324,324,,66,,,21826,1157,,,14897,,69,1181,,49,0,,,,,3124,,,0,18021,2291,,,,,,0,18021,2291 +"2020-04-08","PA",309,,69,,,,1898,0,,,82299,5580,,,,,603,16239,,1680,0,,,,,,,101744,7763,101744,7763,,,,,98538,7260,,0 +"2020-04-08","PR",24,,1,,,,,0,,,4266,300,,,,,,620,,47,0,,,,,,,,0,4886,347,,,,,,0,,0 +"2020-04-08","RI",35,,5,,,,143,0,,45,11667,1572,,,12646,,26,1890,,273,0,,,,,1937,,12528,1913,12528,1913,,,,,13557,1845,14583,2013 +"2020-04-08","SC",63,,12,,241,241,,0,,,22082,819,,,,,,2552,2552,135,0,,,,,,,,0,24634,954,,,,,,0,,0 +"2020-04-08","SD",6,,0,,26,26,,3,,,6355,407,,,,,,393,,73,0,,,,,1179,146,,0,6814,444,,,,,6748,480,6814,444 +"2020-04-08","TN",79,,7,,449,449,708,41,,,,0,,,52256,,,4362,,224,0,,,,,4362,592,,0,56618,3744,,,,,,0,56618,3744 +"2020-04-08","TX",177,,23,,,,1491,0,,,,0,,,,,,9353,9353,1092,0,,,,,15378,38,,0,146477,10774,,,,,,0,146477,10774 +"2020-04-08","UT",13,,0,,158,158,,10,,,37878,2276,,,38725,,,1846,,108,0,,,,,2078,,,0,40803,2493,,,,,39864,2399,40803,2493 +"2020-04-08","VA",75,,12,,563,563,,66,,,,0,,,,,,3645,,312,0,1,3,,,6923,,41710,2391,41710,2391,1,20,,,,0,,0 +"2020-04-08","VI",1,,0,,,,,0,,,242,20,,,,,,45,,2,0,,,,,,39,,0,287,22,,,,,,0,,0 +"2020-04-08","VT",23,,0,,50,50,35,5,,,6777,324,,,,,,608,608,33,0,,,,,,15,,0,7787,393,,,,,7385,357,7787,393 +"2020-04-08","WA",443,,14,,,,655,0,,186,,0,,,,,,9027,9027,395,0,,,,,,,124317,5065,124317,5065,,,,,119606,4804,,0 +"2020-04-08","WI",99,,7,,790,790,351,45,218,157,30115,1603,,,,,,3279,2756,215,0,,,,,,,34835,1778,34835,1778,,,,,,0,,0 +"2020-04-08","WV",4,,0,,,,,0,,,,0,,,,,,462,462,50,0,,,,,,,,0,10707,849,,,,,,0,10707,849 +"2020-04-08","WY",0,,0,,33,33,,0,,,3843,54,,,5203,,,303,230,87,0,,,,,256,62,,0,5459,279,,,,,,0,5459,279 +"2020-04-07","AK",6,,0,,26,26,,1,,,,0,,,,,,213,,22,0,,,,,,29,,0,6913,30,,,,,,0,6913,30 +"2020-04-07","AL",56,,6,,271,271,302,31,,,12797,0,,,,,,2119,2119,151,0,,,,,,,,0,14916,151,,,,,14916,151,,0 +"2020-04-07","AR",16,,0,,148,148,74,11,,,12692,722,,,,43,26,946,946,71,0,,,,,,142,,0,13638,793,,,,,,0,13638,793 +"2020-04-07","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-07","AZ",73,,8,,853,853,,34,,,30800,722,,,,,,2575,,119,0,,,,,,,,0,43059,3664,,,,,33375,841,43059,3664 +"2020-04-07","CA",374,,31,,,,2611,0,,1108,115364,12269,,,,,,15865,,1529,0,,,,,,,,0,131229,13798,,,,,,0,131229,13798 +"2020-04-07","CO",179,,29,,1079,1079,833,85,,,22665,962,,,,,,5429,,257,0,,,,,,,30535,1634,30535,1634,,,,,28094,1219,,0 +"2020-04-07","CT",277,112,71,,,,1308,0,,,,0,,,25984,,,7781,,875,0,,,,,12318,,,0,38323,2790,,,,,,0,38323,2790 +"2020-04-07","DC",22,,-2,,,,,0,,,,0,,,,,,1211,,114,0,,,,,,318,7823,370,7823,370,,,,,,0,,0 +"2020-04-07","DE",28,23,4,5,,,147,0,,,7628,1307,,,,,,928,,255,0,,,,,1203,144,11555,861,11555,861,,,,,,0,,0 +"2020-04-07","FL",296,,60,,1999,1999,,317,,,123415,13465,,,,,,13167,,1159,0,,,,,,,125348,11063,125348,11063,,,,,,0,,0 +"2020-04-07","GA",329,,100,,1774,1774,,442,,,,0,,,,,,8818,,1504,0,,,,,7817,,,0,37997,6647,,,,,,0,37997,6647 +"2020-04-07","GU",4,,0,,,,21,0,,2,529,24,,,,,2,121,,8,0,,,,,,27,,0,650,32,,,,,,0,,0 +"2020-04-07","HI",5,5,1,,26,26,,5,,,13155,0,,,,,,387,,16,0,,,,,347,89,14399,701,14399,701,,,,,,0,,0 +"2020-04-07","IA",26,,1,,193,193,104,14,,,11670,1017,,,,,,1048,1048,102,0,,,,,,341,,0,12718,1119,,,,,,0,,0 +"2020-04-07","ID",13,,3,,83,83,67,6,21,,10076,182,,,,,,1170,,69,0,,,,,,,,0,11246,251,,,,,11246,251,,0 +"2020-04-07","IL",380,,73,,,,3680,0,,1166,,0,,,,,821,13549,,1287,0,,,,,,,,0,68732,5790,,,,,,0,68732,5790 +"2020-04-07","IN",173,,34,,,,,0,,924,23257,2010,,,,,507,5507,,563,0,,,,,6008,,,0,41178,2697,,,,,,0,41178,2697 +"2020-04-07","KS",27,,2,,223,223,,25,,,8614,375,,,,,,900,,55,0,,,,,,,,0,9514,430,,,,,,0,,0 +"2020-04-07","KY",59,,14,,,,,0,,,,0,,,,,,1008,,53,0,,,,,,,,0,19955,1188,,,,,,0,19955,1188 +"2020-04-07","LA",582,,70,,,,1996,0,,,58371,4072,,,,,519,16284,16284,1417,0,,,,,,,,0,74655,5489,,,,,,0,,0 +"2020-04-07","MA",515,,67,,1831,1831,1831,164,,,66270,3550,,,,,,15104,,1365,0,,,,,21713,,,0,106189,7622,,,,,,0,106189,7622 +"2020-04-07","MD",160,152,22,8,1106,1106,,47,,,27256,1684,,,,,,4371,4371,326,0,,,,,5376,288,,0,33842,1404,,,,,,0,33842,1404 +"2020-04-07","ME",12,,2,,99,99,,7,,,,0,,,,,,519,519,20,0,,,,,652,176,,0,13244,951,,,,,,0,13244,951 +"2020-04-07","MI",1449,1522,158,72,,,,0,,,,0,,,50344,,,26964,26290,1179,0,,,,,26789,56,,0,77133,4852,,,,,,0,77133,4852 +"2020-04-07","MN",34,,4,,242,242,120,19,100,64,30603,1448,,,,,,1432,1432,102,0,,,,,,515,32035,1550,32035,1550,,,,,,0,,0 +"2020-04-07","MO",53,,14,,,,508,0,,,28932,1819,,2,29042,,,3037,3037,315,0,,,0,,3786,,,0,32855,901,,,2,,,0,32855,901 +"2020-04-07","MP",2,,1,,,,,0,,,15,2,,,,,,8,,0,0,,,,,,,,0,23,2,,,,,,0,,0 +"2020-04-07","MS",59,,8,,377,377,,-98,,,18632,0,,,,,,1915,,177,0,,,,,,,,0,20547,177,,,,,,0,,0 +"2020-04-07","MT",6,,0,,28,28,,4,,,,0,,,,,,319,,20,0,,,,,,,,0,6985,196,,,,,,0,6985,196 +"2020-04-07","NC",46,,13,,,,354,0,,,,0,,,,,,3221,,351,0,,,,,,,,0,47217,852,,,,,,0,47217,852 +"2020-04-07","ND",4,,1,,33,33,18,1,,,7466,478,,,,,,237,237,12,0,,,,,,82,7554,437,7554,437,,,,,7231,416,7612,443 +"2020-04-07","NE",10,,2,,,,,0,,,6811,433,,,6933,,,447,,38,0,,,,,452,,,0,7455,1083,,,,,7269,473,7455,1083 +"2020-04-07","NH",9,,0,,103,103,,11,,,8019,318,,,,,,715,,46,0,,,,,,151,,0,9457,360,,,,,,0,9457,360 +"2020-04-07","NJ",1631,1232,297,399,,,7017,0,,1651,50558,2616,,,,,1540,44416,44416,3326,0,,,,,,,,0,94974,5942,,,,,94974,5942,,0 +"2020-04-07","NM",13,,1,,,,51,0,,,,0,,,,,18,686,,62,0,,,,,,171,,0,21825,2689,,,,,,0,21825,2689 +"2020-04-07","NV",91,,12,,,,282,0,,,16552,876,,,,,,2087,2087,134,0,,,,,,,23070,1328,23070,1328,,,,,,0,21818,1062 +"2020-04-07","NY",5489,,731,,36932,36932,17493,2555,,4539,,0,,,,,,138863,,8174,0,,,,,,,340058,19247,340058,19247,,,,,,0,,0 +"2020-04-07","OH",167,,25,,1354,1354,,140,417,,,0,,,,,,4782,4782,332,0,,,,,5065,,,0,49870,3216,,,,,,0,49870,3216 +"2020-04-07","OK",67,,16,,376,376,186,36,,137,11821,10399,,,,,,1472,,145,0,,,,,,612,,0,13293,10544,,,,,,0,,0 +"2020-04-07","OR",27,,0,,258,258,,0,,,20669,1113,,,12775,,40,1132,,64,0,,,,,2955,,,0,15730,1524,,,,,,0,15730,1524 +"2020-04-07","PA",240,,78,,,,1665,-1145,,,76719,5845,,,,,548,14559,,1579,0,,,,,,,93981,7606,93981,7606,,,,,91278,7424,,0 +"2020-04-07","PR",23,,2,,,,,0,,,3966,534,,,,,,573,,60,0,,,,,,,,0,4539,594,,,,,,0,,0 +"2020-04-07","RI",30,,3,,,,123,0,,40,10095,1486,,,10923,,26,1617,,261,0,,,,,1647,,10615,1924,10615,1924,,,,,11712,1747,12570,1916 +"2020-04-07","SC",51,,7,,241,241,,0,,,21263,4336,,,,,,2417,2417,368,0,,,,,,,,0,23680,4704,,,,,,0,,0 +"2020-04-07","SD",6,,2,,23,23,,0,,,5948,216,,,,,,320,,32,0,,,,,1140,98,,0,6370,356,,,,,6268,248,6370,356 +"2020-04-07","TN",72,,7,,408,408,802,56,,,,0,,,48736,,,4138,,336,0,,,,,4138,466,,0,52874,5524,,,,,,0,52874,5524 +"2020-04-07","TX",154,,14,,,,1252,0,,,,0,,,,,,8261,8261,988,0,,,,,14319,38,,0,135703,10135,,,,,,0,135703,10135 +"2020-04-07","UT",13,,0,,148,148,,10,,,35602,2202,,,36359,,,1738,,63,0,,,,,1951,,,0,38310,2395,,,,,37465,2310,38310,2395 +"2020-04-07","VA",63,,9,,497,497,,66,,,,0,,,,,,3333,,455,0,0,2,,,6533,,39319,2962,39319,2962,0,19,,,,0,,0 +"2020-04-07","VI",1,,0,,,,,0,,,222,0,,,,,,43,,0,0,,,,,,36,,0,265,0,,,,,,0,,0 +"2020-04-07","VT",23,,0,,45,45,29,0,,,6453,469,,,,,,575,575,32,0,,,,,,15,,0,7394,512,,,,,7028,501,7394,512 +"2020-04-07","WA",429,,22,,,,641,0,,190,,0,,,,,,8632,8632,171,0,,,,,,,119252,5476,119252,5476,,,,,114802,5229,,0 +"2020-04-07","WI",92,,15,,745,745,334,77,200,157,28512,1938,,,,,,3064,2578,198,0,,,,,,,33057,1420,33057,1420,,,,,,0,,0 +"2020-04-07","WV",4,,0,,,,,0,,,,0,,,,,,412,412,67,0,,,,,,,,0,9858,1766,,,,,,0,9858,1766 +"2020-04-07","WY",0,,0,,33,33,,10,,,3789,70,,,4939,,,216,216,6,0,,,,,241,62,,0,5180,367,,,,,,0,5180,367 +"2020-04-06","AK",6,,0,,25,25,,4,,,,0,,,,,,191,,6,0,,,,,,,,0,6883,599,,,,,,0,6883,599 +"2020-04-06","AL",50,,5,,240,240,297,9,,,12797,1515,,,,,,1968,1968,172,0,,,,,,,,0,14765,1687,,,,,14765,1687,,0 +"2020-04-06","AR",16,,0,,137,137,74,7,,,11970,1558,,,,39,22,875,875,45,0,,,,,,102,,0,12845,1603,,,,,,0,12845,1603 +"2020-04-06","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-06","AZ",65,,1,,819,819,,59,,,30078,4937,,,,,,2456,,187,0,,,,,,,,0,39395,948,,,,,32534,5124,39395,948 +"2020-04-06","CA",343,,24,,,,2509,0,,1085,103095,0,,,,,,14336,,898,0,,,,,,,,0,117431,898,,,,,,0,117431,898 +"2020-04-06","CO",150,,10,,994,994,786,70,,,21703,880,,,,,,5172,,222,0,,,,,,,28901,1202,28901,1202,,,,,26875,1102,,0 +"2020-04-06","CT",206,85,17,,,,1221,0,,,,0,,,24296,,,6906,,1231,0,,,,,11219,,,0,35533,1157,,,,,,0,35533,1157 +"2020-04-06","DC",24,,2,,,,,0,,,,0,,,,,,1097,,99,0,,,,,,287,7453,619,7453,619,,,,,,0,,0 +"2020-04-06","DE",24,20,5,4,,,101,0,,,6321,0,,,,,,673,,0,0,,,,,1053,71,10694,1247,10694,1247,,,,,,0,,0 +"2020-04-06","FL",236,,18,,1682,1682,,110,,,109950,8697,,,,,,12008,,763,0,,,,,,,114285,7018,114285,7018,,,,,,0,,0 +"2020-04-06","GA",229,,18,,1332,1332,,49,,,,0,,,,,,7314,,667,0,,,,,6154,,,0,31350,3409,,,,,,0,31350,3409 +"2020-04-06","GU",4,,0,,,,21,0,,2,505,12,,,,,,113,,1,0,,,,,,25,,0,618,13,,,,,,0,,0 +"2020-04-06","HI",4,4,0,,21,21,,2,,,13155,551,,,,,,371,,20,0,,,,,330,85,13698,450,13698,450,,,,,,0,,0 +"2020-04-06","IA",25,,3,,179,179,99,14,,,10653,680,,,,,,946,946,78,0,,,,,,284,,0,11599,758,,,,,,0,,0 +"2020-04-06","ID",10,,0,,77,77,62,11,16,,9894,710,,,,,,1101,,24,0,,,,,,,,0,10995,734,,,,,10995,734,,0 +"2020-04-06","IL",307,,33,,,,,0,,,,0,,,,,,12262,,1006,0,,,,,,,,0,62942,3959,,,,,,0,62942,3959 +"2020-04-06","IN",139,,12,,,,,0,,924,21247,3006,,,,,507,4944,,533,0,,,,,5526,,,0,38481,1231,,,,,,0,38481,1231 +"2020-04-06","KS",25,,3,,198,198,,15,,,8239,763,,,,,,845,,98,0,,,,,,,,0,9084,861,,,,,,0,,0 +"2020-04-06","KY",45,,5,,,,,0,,,,0,,,,,,955,,38,0,,,,,,,,0,18767,2104,,,,,,0,18767,2104 +"2020-04-06","LA",512,,35,,,,1981,0,,,54299,6984,,,,,552,14867,14867,1857,0,,,,,,,,0,69166,8841,,,,,,0,,0 +"2020-04-06","MA",448,,78,,1667,1667,1667,35,,,62720,3155,,,,,,13739,,1337,0,,,,,19472,,,0,98567,7580,,,,,,0,98567,7580 +"2020-04-06","MD",138,131,16,7,1059,1059,,123,,,25572,844,,,,,,4045,4045,436,0,,,,,5070,184,,0,32438,2633,,,,,,0,32438,2633 +"2020-04-06","ME",10,,0,,92,92,,6,,,,0,,,,,,499,499,29,0,,,,,611,158,,0,12293,494,,,,,,0,12293,494 +"2020-04-06","MI",1291,1377,141,66,,,,0,,,,0,,,47262,,,25785,25186,1327,0,,,,,25019,56,,0,72281,5226,,,,,,0,72281,5226 +"2020-04-06","MN",30,,1,,223,223,115,21,90,57,29155,1065,,,,,,1330,1330,113,0,,,,,,440,30485,1178,30485,1178,,,,,,0,,0 +"2020-04-06","MO",39,,5,,,,439,0,,,27113,2231,,2,28257,,,2722,2722,355,0,,,0,,3673,,,0,31954,1103,,,2,,,0,31954,1103 +"2020-04-06","MP",1,,0,,,,,0,,,13,0,,,,,,8,,0,0,,,,,,,,0,21,0,,,,,,0,,0 +"2020-04-06","MS",51,,8,,475,475,,0,,,18632,13052,,,,,,1738,,100,0,,,,,,,,0,20370,13152,,,,,,0,,0 +"2020-04-06","MT",6,,0,,24,24,,0,,,,0,,,,,,299,,13,0,,,,,,,,0,6789,186,,,,,,0,6789,186 +"2020-04-06","NC",33,,2,,,,270,0,,,,0,,,,,,2870,,285,0,,,,,,,,0,46365,1343,,,,,,0,46365,1343 +"2020-04-06","ND",3,,0,,32,32,19,1,,,6988,408,,,,,,225,225,18,0,,,,,,74,7117,357,7117,357,,,,,6815,339,7169,362 +"2020-04-06","NE",8,,0,,,,,0,,,6378,820,,,5917,,,409,,46,0,,,,,385,,,0,6372,423,,,,,6796,863,6372,423 +"2020-04-06","NH",9,,0,,92,92,,6,,,7701,290,,,,,,669,,48,0,,,,,,147,,0,9097,336,,,,,,0,9097,336 +"2020-04-06","NJ",1334,1003,150,331,,,6390,0,,,47942,3281,,,,,1263,41090,41090,3585,0,,,,,,,,0,89032,6866,,,,,89032,6866,,0 +"2020-04-06","NM",12,,0,,,,48,0,,,,0,,,,,18,624,,81,0,,,,,,133,,0,19136,2308,,,,,,0,19136,2308 +"2020-04-06","NV",79,,3,,,,,0,,,15676,681,,,,,,1953,1953,117,0,,,,,,,21742,536,21742,536,,,,,,0,20756,848 +"2020-04-06","NY",4758,,599,,34377,34377,16837,2084,,4504,,0,,,,,,130689,,8658,0,,,,,,,320811,18531,320811,18531,,,,,,0,,0 +"2020-04-06","OH",142,,23,,1214,1214,,110,371,,,0,,,,,,4450,4450,407,0,,,,,4635,,,0,46654,2994,,,,,,0,46654,2994 +"2020-04-06","OK",51,,5,,340,340,161,10,,143,1422,21,,,,,,1327,,75,0,,,,,,522,,0,2749,96,,,,,,0,,0 +"2020-04-06","OR",27,,1,,258,258,,19,,,19556,3021,,,11359,,40,1068,,69,0,,,,,2847,,,0,14206,1884,,,,,,0,14206,1884 +"2020-04-06","PA",162,,12,,1145,1145,,73,,,70874,4613,,,,,533,12980,,1470,0,,,,,,,86375,6436,86375,6436,,,,,83854,6083,,0 +"2020-04-06","PR",21,,1,,,,,0,,,3432,359,,,,,,513,,38,0,,,,,,,,0,3945,397,,,,,,0,,0 +"2020-04-06","RI",27,,2,,,,109,0,,37,8609,1577,,,9292,,26,1356,,206,0,,,,,1362,,8691,1343,8691,1343,,,,,9965,1783,10654,1925 +"2020-04-06","SC",44,,0,,241,241,,0,,,16927,0,,,,,,2049,2049,0,0,,,,,,,,0,18976,0,,,,,,0,,0 +"2020-04-06","SD",4,,2,,23,23,,1,,,5732,379,,,,,,288,,48,0,,,,,1098,91,,0,6014,435,,,,,6020,427,6014,435 +"2020-04-06","TN",65,,21,,352,352,834,24,,,,0,,,43548,,,3802,,169,0,,,,,3802,356,,0,47350,2050,,,,,,0,47350,2050 +"2020-04-06","TX",140,,13,,,,1153,0,,,,0,,,,,,7273,7273,480,0,,,,,13274,38,,0,125568,6702,,,,,,0,125568,6702 +"2020-04-06","UT",13,,5,,138,138,,14,,,33400,1304,,,34081,,,1675,,70,0,,,,,1834,,,0,35915,1438,,,,,35155,1373,35915,1438 +"2020-04-06","VA",54,,3,,431,431,,41,,,,0,,,,,,2878,,241,0,,2,,,6122,,36357,3809,36357,3809,,19,,,,0,,0 +"2020-04-06","VI",1,,0,,,,,0,,,222,16,,,,,,43,,1,0,,,,,,36,,0,265,17,,,,,,0,,0 +"2020-04-06","VT",23,,1,,45,45,28,0,,,5984,324,,,,,,543,543,31,0,,,,,,15,,0,6882,389,,,,,6527,355,6882,389 +"2020-04-06","WA",407,,21,,,,638,0,,191,,0,,,,,,8461,8461,207,0,,,,,,,113776,5383,113776,5383,,,,,109573,5136,,0 +"2020-04-06","WI",77,,9,,668,668,300,44,186,136,26574,1405,,,,,,2866,2440,223,0,,,,,,,31637,1603,31637,1603,,,,,,0,,0 +"2020-04-06","WV",4,,1,,,,,0,,,,0,,,,,,345,345,21,0,,,,,,,,0,8092,711,,,,,,0,8092,711 +"2020-04-06","WY",0,,0,,23,23,,0,,,3719,679,,,4585,,,210,210,13,0,,,,,228,52,,0,4813,433,,,,,,0,4813,433 +"2020-04-05","AK",6,,1,,21,21,,4,,,,0,,,,,,185,,14,0,,,,,,,,0,6284,244,,,,,,0,6284,244 +"2020-04-05","AL",45,,2,,231,231,282,19,,,11282,2009,,,,,,1796,1796,216,0,,,,,,,,0,13078,2225,,,,,13078,2225,,0 +"2020-04-05","AR",16,,2,,130,130,67,24,,,10412,785,,,,39,27,830,830,87,0,,,,,,97,,0,11242,872,,,,,,0,11242,872 +"2020-04-05","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-05","AZ",64,,12,,760,760,,49,,,25141,0,,,,,,2269,,250,0,,,,,,,,0,38447,1138,,,,,27410,250,38447,1138 +"2020-04-05","CA",319,,43,,,,2398,0,,1040,103095,1421,,,,,,13438,,1412,0,,,,,,,,0,116533,2833,,,,,,0,116533,2833 +"2020-04-05","CO",140,,14,,924,924,786,49,,,20823,1488,,,,,,4950,,385,0,,,,,,,27699,2120,27699,2120,,,,,25773,1873,,0 +"2020-04-05","CT",189,69,24,,,,1142,0,,,,0,,,23609,,,5675,,399,0,,,,,10750,,,0,34376,1709,,,,,,0,34376,1709 +"2020-04-05","DC",22,,1,,,,,0,,,,0,,,,,,998,,96,0,,,,,,258,6834,396,6834,396,,,,,,0,,0 +"2020-04-05","DE",19,16,2,3,,,101,0,,,6321,447,,,,,,673,,80,0,,,,,834,71,9447,1071,9447,1071,,,,,,0,,0 +"2020-04-05","FL",218,,27,,1572,1572,,110,,,101253,10297,,,,,,11245,,1148,0,,,,,,,107267,12143,107267,12143,,,,,,0,,0 +"2020-04-05","GA",211,,10,,1283,1283,,44,,,,0,,,,,,6647,,487,0,,,,,5573,,,0,27941,1604,,,,,,0,27941,1604 +"2020-04-05","GU",4,,0,,,,21,0,,2,493,21,,,,,,112,,19,0,,,,,,23,,0,605,40,,,,,,0,,0 +"2020-04-05","HI",4,4,1,,19,19,,1,,,12604,645,,,,,,351,,32,0,,,,,317,82,13248,760,13248,760,,,,,,0,,0 +"2020-04-05","IA",22,,8,,165,165,91,12,,,9973,519,,,,,,868,868,82,0,,,,,,188,,0,10841,601,,,,,,0,,0 +"2020-04-05","ID",10,,0,,66,66,51,4,11,,9184,1327,,,,,,1077,,64,0,,,,,,,,0,10261,1391,,,,,10261,1391,,0 +"2020-04-05","IL",274,,31,,,,,0,,,,0,,,,,,11256,,899,0,,,,,,,,0,58983,5402,,,,,,0,58983,5402 +"2020-04-05","IN",127,,11,,,,,0,,,18241,2394,,,,,,4411,,458,0,,,,,5300,,,0,37250,1789,,,,,,0,37250,1789 +"2020-04-05","KS",22,,1,,183,183,,11,,,7476,596,,,,,,747,,49,0,,,,,,,,0,8223,645,,,,,,0,,0 +"2020-04-05","KY",40,,3,,,,,0,,,,0,,,,,,917,,86,0,,,,,,,,0,16663,1091,,,,,,0,16663,1091 +"2020-04-05","LA",477,,68,,,,1803,0,,,47315,1313,,,,,561,13010,13010,514,0,,,,,,,,0,60325,1827,,,,,,0,,0 +"2020-04-05","MA",370,,66,,1632,1632,1632,262,,,59565,2374,,,,,,12402,,765,0,,,,,17371,,,0,90987,4102,,,,,,0,90987,4102 +"2020-04-05","MD",122,115,21,7,936,936,,115,,,24728,2243,,,,,,3609,3609,484,0,,,,,4444,159,,0,29805,3401,,,,,,0,29805,3401 +"2020-04-05","ME",10,,0,,86,86,,3,,,,0,,,,,,470,470,14,0,,,,,571,156,,0,11799,372,,,,,,0,11799,372 +"2020-04-05","MI",1150,1225,120,58,,,,0,,,,0,,,44154,,,24458,23908,877,0,,,,,22901,56,,0,67055,4850,,,,,,0,67055,4850 +"2020-04-05","MN",29,,5,,202,202,106,22,77,48,28090,1403,,,,,,1217,1217,59,0,,,,,,422,29307,1462,29307,1462,,,,,,0,,0 +"2020-04-05","MO",34,,10,,,,424,0,,,24882,2268,,1,27303,,,2367,2367,76,0,,,0,,3526,,,0,30851,1974,,,1,,,0,30851,1974 +"2020-04-05","MP",1,,0,,,,,0,,,13,0,,,,,,8,,0,0,,,,,,,,0,21,0,,,,,,0,,0 +"2020-04-05","MS",43,,8,,475,475,,39,,,5580,447,,,,,,1638,,183,0,,,,,,,,0,7218,630,,,,,,0,,0 +"2020-04-05","MT",6,,1,,24,24,,0,,,,0,,,,,,286,,21,0,,,,,,,,0,6603,374,,,,,,0,6603,374 +"2020-04-05","NC",31,,7,,,,261,0,,,,0,,,,,,2585,,183,0,,,,,,,,0,45022,7629,,,,,,0,45022,7629 +"2020-04-05","ND",3,,0,,31,31,20,1,,,6580,559,,,,,,207,207,21,0,,,,,,63,6760,440,6760,440,,,,,6476,412,6807,446 +"2020-04-05","NE",8,,2,,,,,0,,,5558,500,,,5535,,,363,,42,0,,,,,346,,,0,5949,659,,,,,5933,544,5949,659 +"2020-04-05","NH",9,,2,,86,86,,6,,,7411,446,,,,,,621,,81,0,,,,,,146,,0,8761,479,,,,,,0,8761,479 +"2020-04-05","NJ",1184,917,126,267,,,4000,0,,,44661,3429,,,,,,37505,37505,3381,0,,,,,,,,0,82166,6810,,,,,82166,6810,,0 +"2020-04-05","NM",12,,1,,,,45,0,,,,-16285,,,,,18,543,,48,0,,,,,,130,,0,16828,1196,,,,,,0,16828,1196 +"2020-04-05","NV",76,,6,,,,,0,,,14995,574,,,,,,1836,1836,94,0,,,,,,,21206,849,21206,849,,,,,,0,19908,709 +"2020-04-05","NY",4159,,594,,32293,32293,16479,2822,,4376,,0,,,,,,122031,,8327,0,,,,,,,302280,18659,302280,18659,,,,,,0,,0 +"2020-04-05","OH",119,,17,,1104,1104,,98,346,,,0,,,,,,4043,4043,304,0,,,,,4225,,,0,43660,3696,,,,,,0,43660,3696 +"2020-04-05","OK",46,,4,,330,330,,14,,,1401,39,,,,,,1252,,93,0,,,,,,,,0,2653,132,,,,,,0,,0 +"2020-04-05","OR",26,,4,,239,239,,35,,,16535,0,,,9623,,38,999,,100,0,,,,,2699,,,0,12322,2753,,,,,,0,12322,2753 +"2020-04-05","PA",150,,14,,1072,1072,,68,,,66261,6248,,,,,,11510,,1493,0,,,,,,,79939,7902,79939,7902,,,,,77771,7741,,0 +"2020-04-05","PR",20,,2,,,,,0,,,3073,468,,,,,,475,,23,0,,,,,,,,0,3548,491,,,,,,0,,0 +"2020-04-05","RI",25,,8,,,,103,0,,33,7032,1070,,,7585,,6,1150,,182,0,,,,,1144,,7348,803,7348,803,,,,,8182,1252,8729,1343 +"2020-04-05","SC",44,,4,,241,241,,0,,,16927,530,,,,,,2049,2049,132,0,,,,,,,,0,18976,662,,,,,,0,,0 +"2020-04-05","SD",2,,0,,22,22,,3,,,5353,341,,,,,,240,,28,0,,,,,1074,84,,0,5579,498,,,,,5593,369,5579,498 +"2020-04-05","TN",44,,1,,328,328,637,17,,,,0,,,41667,,,3633,,312,0,,,,,3633,295,,0,45300,3909,,,,,,0,45300,3909 +"2020-04-05","TX",127,,22,,,,827,0,,,,0,,,,,,6793,6793,681,0,,,,,12693,38,,0,118866,4925,,,,,,0,118866,4925 +"2020-04-05","UT",8,,0,,124,124,,7,,,32096,1865,,,32713,,,1605,,177,0,,,,,1764,,,0,34477,2048,,,,,33782,1978,34477,2048 +"2020-04-05","VA",51,,-1,,390,390,,78,,,,0,,,,,,2637,,230,0,,2,,,5637,,32548,2193,32548,2193,,19,,,,0,,0 +"2020-04-05","VI",1,,1,,,,,0,,,206,22,,,,,,42,,2,0,,,,,,34,,0,248,24,,,,,,0,,0 +"2020-04-05","VT",22,,2,,45,45,29,0,,,5660,570,,,,,,512,512,52,0,,,,,,15,,0,6493,602,,,,,6172,622,6493,602 +"2020-04-05","WA",386,,21,,,,581,0,,178,,0,,,,,,8254,8254,416,0,,,,,,,108393,2096,108393,2096,,,,,104437,1952,,0 +"2020-04-05","WI",68,,12,,624,624,294,36,175,134,25169,1310,,,,,,2643,2267,167,0,,,,,,,30034,1838,30034,1838,,,,,,0,,0 +"2020-04-05","WV",3,,1,,,,,0,,,,0,,,,,,324,324,42,0,,,,,,,,0,7381,1048,,,,,,0,7381,1048 +"2020-04-05","WY",0,,0,,23,23,,0,,,3040,95,,,4159,,,197,200,10,0,,,,,221,50,,0,4380,148,,,,,,0,4380,148 +"2020-04-04","AK",5,,2,,17,17,,0,,,,0,,,,,,171,,11,0,,,,,,,,0,6040,24,,,,,,0,6040,24 +"2020-04-04","AL",43,,8,,212,212,238,212,,,9273,1086,,,,,,1580,1580,148,0,,,,,,,,0,10853,1234,,,,,10853,1234,,0 +"2020-04-04","AR",14,,2,,106,106,72,1,,,9627,632,,,,39,23,743,743,39,0,,,,,,79,,0,10370,671,,,,,,0,10370,671 +"2020-04-04","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-04","AZ",52,,11,,711,711,,44,,,25141,2237,,,,,,2019,,250,0,,,,,,,,0,37309,2241,,,,,27160,2487,37309,2241 +"2020-04-04","CA",276,,39,,,,2300,0,,1008,101674,77075,,,,,,12026,,1325,0,,,,,,,,0,113700,78400,,,,,,0,113700,78400 +"2020-04-04","CO",126,,15,,875,875,783,52,,,19335,1437,,,,,,4565,,392,0,,,,,,,25579,1968,25579,1968,,,,,23900,1829,,0 +"2020-04-04","CT",165,36,34,,,,1033,0,,,,0,,,22593,,,5276,,362,0,,,,,10057,,,0,32667,2440,,,,,,0,32667,2440 +"2020-04-04","DC",21,,6,,,,,0,,,,0,,,,,,902,,145,0,,,,,,235,6438,854,6438,854,,,,,,0,,0 +"2020-04-04","DE",17,16,0,1,,,95,0,,,5874,879,,,,,,593,,143,0,,,,,665,71,8376,1206,8376,1206,,,,,,0,,0 +"2020-04-04","FL",191,,28,,1462,1462,,175,,,90956,8819,,,,,,10097,,1281,0,,,,,,,95124,10738,95124,10738,,,,,,0,,0 +"2020-04-04","GA",201,,17,,1239,1239,,81,,,,0,,,,,,6160,,329,0,,,,,5292,,,0,26337,1051,,,,,,0,26337,1051 +"2020-04-04","GU",4,,0,,,,20,0,,2,472,13,,,,,,93,,9,0,,,,,,20,,0,565,22,,,,,,0,,0 +"2020-04-04","HI",3,3,1,,18,18,,3,,,11959,1753,,,,,,319,,34,0,,,,,300,78,12488,915,12488,915,,,,,,0,,0 +"2020-04-04","IA",14,,3,,153,153,85,15,,,9454,700,,,,,,786,786,87,0,,,,,,188,,0,10240,787,,,,,,0,,0 +"2020-04-04","ID",10,,1,,62,62,53,6,8,,7857,803,,,,,,1013,,122,0,,,,,,,,0,8870,925,,,,,8870,925,,0 +"2020-04-04","IL",243,,33,,,,,0,,,,0,,,,,,10357,,1453,0,,,,,,,,0,53581,5533,,,,,,0,53581,5533 +"2020-04-04","IN",116,,14,,,,,0,,,15847,1449,,,,,,3953,,516,0,,,,,5021,,,0,35461,3009,,,,,,0,35461,3009 +"2020-04-04","KS",21,,4,,172,172,,21,,,6880,426,,,,,,698,,78,0,,,,,,,,0,7578,504,,,,,,0,,0 +"2020-04-04","KY",37,,6,,,,,0,,,,0,,,,,,831,,61,0,,,,,,,,0,15572,2768,,,,,,0,15572,2768 +"2020-04-04","LA",409,,39,,,,1726,0,,,46002,2654,,,,,571,12496,12496,2199,0,,,,,,,,0,58498,4853,,,,,,0,,0 +"2020-04-04","MA",304,,39,,1370,1370,1370,404,,,57191,4506,,,,,,11637,,1334,0,,,,,16294,,,0,86885,4744,,,,,,0,86885,4744 +"2020-04-04","MD",101,94,17,7,821,821,,157,,,22485,1553,,,,,,3125,3125,367,0,,,,,3825,159,,0,26404,2629,,,,,,0,26404,2629 +"2020-04-04","ME",10,,1,,83,83,,8,,,,0,,,,,,456,456,24,0,,,,,553,140,,0,11427,601,,,,,,0,11427,601 +"2020-04-04","MI",1030,1092,112,45,,,,0,,,,0,,,41205,,,23581,23071,1002,0,,,,,21000,56,,0,62205,7109,,,,,,0,62205,7109 +"2020-04-04","MN",24,,2,,180,180,95,24,69,42,26687,1624,,,,,,1158,1158,39,0,,,,,,416,27845,1663,27845,1663,,,,,,0,,0 +"2020-04-04","MO",24,,5,,,,413,0,,,22614,3257,,,25580,,,2291,2291,178,0,,,,,3277,,,0,28877,2167,,,,,,0,28877,2167 +"2020-04-04","MP",1,,0,,,,,0,,,13,0,,,,,,8,,0,0,,,,,,,,0,21,0,,,,,,0,,0 +"2020-04-04","MS",35,,6,,436,436,,16,,,5133,380,,,,,,1455,,97,0,,,,,,,,0,6588,477,,,,,,0,,0 +"2020-04-04","MT",5,,0,,24,24,,0,,,,0,,,,,,265,,22,0,,,,,,,,0,6229,511,,,,,,0,6229,511 +"2020-04-04","NC",24,,5,,,,271,0,,,,0,,,,,,2402,,309,0,,,,,,,,0,37393,3404,,,,,,0,37393,3404 +"2020-04-04","ND",3,,0,,30,30,,1,,,6021,396,,,,,,186,186,13,0,,,,,,63,6320,496,6320,496,,,,,6064,466,6361,504 +"2020-04-04","NE",6,,0,,,,,0,,,5058,571,,,4922,,,321,,42,0,,,,,302,,,0,5290,391,,,,,5389,612,5290,391 +"2020-04-04","NH",7,,2,,80,80,,7,,,6965,390,,,,,,540,,61,0,,,,,,144,,0,8282,536,,,,,,0,8282,536 +"2020-04-04","NJ",1058,846,242,212,,,4000,0,,,41232,3624,,,,,,34124,34124,4229,0,,,,,,,,0,75356,7853,,,,,75356,7853,,0 +"2020-04-04","NM",11,,1,,,,37,0,,,16285,1148,,,,,18,495,,92,0,,,,,,54,,0,15632,854,,,,,,0,15632,854 +"2020-04-04","NV",70,,11,,,,,0,,,14421,1403,,,,,,1742,1742,228,0,,,,,,,20357,1458,20357,1458,,,,,,0,19199,1758 +"2020-04-04","NY",3565,,630,,29471,29471,15905,3261,,4126,,0,,,,,,113704,,10841,0,,,,,,,283621,23101,283621,23101,,,,,,0,,0 +"2020-04-04","OH",102,,11,,1006,1006,,111,326,,,0,,,,,,3739,3739,427,0,,,,,3738,,,0,39964,4153,,,,,,0,39964,4153 +"2020-04-04","OK",42,,4,,316,316,,27,,,1362,47,,,,,,1159,,171,0,,,,,,,,0,2521,218,,,,,,0,,0 +"2020-04-04","OR",22,,1,,204,204,188,16,,,16535,1276,,,7156,,38,899,,73,0,,,,,2413,,,0,9569,2259,,,,,,0,9569,2259 +"2020-04-04","PA",136,,34,,1004,1004,,152,,,60013,6318,,,,,,10017,,1597,0,,,,,,,72037,8281,72037,8281,,,,,70030,7915,,0 +"2020-04-04","PR",18,,3,,,,,0,,,2605,556,,,,,,452,,74,0,,,,,,,,0,3057,630,,,,,,0,,0 +"2020-04-04","RI",17,,3,,,,93,0,,31,5962,620,,,6429,,6,968,,137,0,,,,,957,,6545,882,6545,882,,,,,6930,757,7386,803 +"2020-04-04","SC",40,,9,,241,241,,0,,,16397,10956,,,,,,1917,1917,363,0,,,,,,,,0,18314,11319,,,,,,0,,0 +"2020-04-04","SD",2,,0,,19,19,,2,,,5012,419,,,,,,212,,25,0,,,,,1037,76,,0,5081,414,,,,,5224,444,5081,414 +"2020-04-04","TN",43,,6,,311,311,601,18,,,,0,,,38070,,,3321,,254,0,,,,,3321,416,,0,41391,3552,,,,,,0,41391,3552 +"2020-04-04","TX",105,,15,,,,196,0,,,,0,,,,,,6112,6112,788,0,,,,,12043,38,,0,113941,9570,,,,,,0,113941,9570 +"2020-04-04","UT",8,,1,,117,117,,11,,,30231,2279,,,30783,,,1428,,182,0,,,,,1646,,,0,32429,2492,,,,,31804,2405,32429,2492 +"2020-04-04","VA",52,,6,,312,312,,66,,,,0,,,,,,2407,,395,0,,2,,,5230,,30355,2709,30355,2709,,19,,,,0,,0 +"2020-04-04","VI",,,0,,,,,0,,,184,30,,,,,,40,,2,0,,,,,,34,,0,224,32,,,,,,0,,0 +"2020-04-04","VT",20,,3,,45,45,29,0,,,5090,432,,,,,,460,460,70,0,,,,,,15,,0,5891,511,,,,,5550,502,5891,511 +"2020-04-04","WA",365,,27,,,,574,0,,174,,0,,,,,,7838,7838,399,0,,,,,,,106297,2699,106297,2699,,,,,102485,2614,,0 +"2020-04-04","WI",56,,19,,588,588,279,101,,117,23859,1482,,,,,,2476,2112,213,0,,,,,,,28196,2153,28196,2153,,,,,,0,,0 +"2020-04-04","WV",2,,0,,,,,-1,,,,0,,,,,,282,282,45,0,,,,,,,,0,6333,996,,,,,,0,6333,996 +"2020-04-04","WY",0,,0,,23,23,,2,,,2945,241,,,4015,,,187,187,25,0,,,,,217,49,,0,4232,165,,,,,,0,4232,165 +"2020-04-03","AK",3,,0,,17,17,,1,,,,0,,,,,,160,,11,0,,,,,,,,0,6016,994,,,,,,0,6016,994 +"2020-04-03","AL",35,,3,,,,238,0,,,8187,684,,,,,,1432,1432,199,0,,,,,,,,0,9619,883,,,,,9619,883,,0 +"2020-04-03","AR",12,,0,,105,105,71,5,,,8995,1115,,,,39,26,704,704,61,0,,,,,,60,,0,9699,1176,,,,,,0,9699,1176 +"2020-04-03","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-03","AZ",41,,9,,667,667,,51,,,22904,1793,,,,,,1769,,171,0,,,,,,,,0,35068,2412,,,,,24673,1964,35068,2412 +"2020-04-03","CA",237,,34,,,,2188,0,,901,24599,790,,,,,,10701,,1510,0,,,,,,,,0,35300,2300,,,,,,0,35300,2300 +"2020-04-03","CO",111,,14,,823,823,777,113,,,17898,1215,,,,,,4173,,445,0,,,,,,,23611,1816,23611,1816,,,,,22071,1660,,0 +"2020-04-03","CT",131,34,19,,,,909,0,,,,0,,,21034,,,4914,,1090,0,,,,,9176,,,0,30227,2395,,,,,,0,30227,2395 +"2020-04-03","DC",15,,3,,,,,0,,,,0,,,,,,757,,104,0,,,,,,206,5584,514,5584,514,,,,,,0,,0 +"2020-04-03","DE",17,16,1,1,,,63,0,,,4995,429,,,,,,450,,57,0,,,,,504,71,7170,570,7170,570,,,,,,0,,0 +"2020-04-03","FL",163,,35,,1287,1287,,164,,,82137,12851,,,,,,8816,,1268,0,,,,,,,84386,12683,84386,12683,,,,,,0,,0 +"2020-04-03","GA",184,,21,,1158,1158,,102,,,,0,,,,,,5831,,483,0,,,,,5010,,,0,25286,2316,,,,,,0,25286,2316 +"2020-04-03","GU",4,,1,,,,19,0,,2,459,17,,,,,,84,,2,0,,,,,,14,,0,543,19,,,,,,0,,0 +"2020-04-03","HI",2,2,1,,15,15,,0,,,10206,0,,,,,,285,,27,0,,,,,273,72,11573,917,11573,917,,,,,,0,,0 +"2020-04-03","IA",11,,0,,138,138,80,18,,,8754,700,,,,,,699,699,85,0,,,,,,188,,0,9453,785,,,,,,0,,0 +"2020-04-03","ID",9,,0,,56,56,45,7,7,,7054,441,,,,,,891,,222,0,,,,,,,,0,7945,663,,,,,7945,663,,0 +"2020-04-03","IL",210,,53,,,,,0,,,,0,,,,,,8904,,1209,0,,,,,,,,0,48048,4392,,,,,,0,48048,4392 +"2020-04-03","IN",102,,24,,,,,0,,,14398,1152,,,,,,3437,,398,0,,,,,4618,,,0,32452,2862,,,,,,0,32452,2862 +"2020-04-03","KS",17,,4,,151,151,,13,,,6454,395,,,,,,620,,68,0,,,,,,,,0,7074,463,,,,,,0,,0 +"2020-04-03","KY",31,,11,,,,,0,,,,0,,,,,,770,,90,0,,,,,,,,0,12804,4904,,,,,,0,12804,4904 +"2020-04-03","LA",370,,60,,,,1707,0,,,43348,1412,,,,,535,10297,10297,1147,0,,,,,,,,0,53645,2559,,,,,,0,,0 +"2020-04-03","MA",265,,36,,966,966,,153,,,52685,4918,,,,,,10303,,1436,0,,,,,14972,,,0,82141,6567,,,,,,0,82141,6567 +"2020-04-03","MD",84,79,20,5,664,664,,82,,,20932,2042,,,,,,2758,2758,427,0,,,,,3364,159,,0,23775,3036,,,,,,0,23775,3036 +"2020-04-03","ME",9,,2,,75,75,,7,,,,0,,,,,,432,432,56,0,,,,,519,113,,0,10826,720,,,,,,0,10826,720 +"2020-04-03","MI",918,985,117,39,,,,0,,,,0,,,37060,,,22579,22102,1203,0,,,,,18036,56,,0,55096,6001,,,,,,0,55096,6001 +"2020-04-03","MN",22,,4,,156,156,86,18,40,40,25063,1283,,,,,,1119,1119,63,0,,,,,,,26182,1346,26182,1346,,,,,,0,,0 +"2020-04-03","MO",19,,0,,,,,0,,,19357,1508,,,23715,,,2113,2113,279,0,,,,,2978,,,0,26710,2295,,,,,,0,26710,2295 +"2020-04-03","MP",1,,0,,,,,0,,,13,0,,,,,,8,,0,0,,,,,,,,0,21,0,,,,,,0,,0 +"2020-04-03","MS",29,,3,,420,420,,60,,,4753,0,,,,,,1358,,181,0,,,,,,,,0,6111,181,,,,,,0,,0 +"2020-04-03","MT",5,,0,,24,24,,4,,,,0,,,,,,243,,16,0,,,,,,,,0,5718,530,,,,,,0,5718,530 +"2020-04-03","NC",19,,3,,,,184,0,,,,0,,,,,,2093,,236,0,,,,,,,,0,33989,2883,,,,,,0,33989,2883 +"2020-04-03","ND",3,,0,,29,29,,1,,,5625,804,,,,,,173,173,14,0,,,,,,55,5824,535,5824,535,,,,,5598,508,5857,536 +"2020-04-03","NE",6,,1,,,,,0,,,4487,509,,,4560,,,279,,33,0,,,,,276,,,0,4899,762,,,,,4777,542,4899,762 +"2020-04-03","NH",5,,1,,73,73,,15,,,6575,497,,,,,,479,,64,0,,,,,,101,,0,7746,480,,,,,,0,7746,480 +"2020-04-03","NJ",816,646,136,170,,,3016,0,,,37608,4088,,,,,,29895,29895,4305,0,,,,,,,,0,67503,8393,,,,,67503,8393,,0 +"2020-04-03","NM",10,,3,,,,41,0,,,15137,762,,,,,18,403,,40,0,,,,,,26,,0,14778,767,,,,,,0,14778,767 +"2020-04-03","NV",59,,8,,,,,0,,,13018,430,,,,,,1514,1514,56,0,,,,,,,18899,1276,18899,1276,,,,,,0,17441,737 +"2020-04-03","NY",2935,,562,,26210,26210,14810,3424,,3731,,0,,,,,,102863,,10482,0,,,,,,,260520,21555,260520,21555,,,,,,0,,0 +"2020-04-03","OH",91,,10,,895,895,,93,288,,,0,,,,,,3312,3312,410,0,,,,,3186,,,0,35811,2945,,,,,,0,35811,2945 +"2020-04-03","OK",38,,4,,289,289,171,32,,123,1315,50,,,,,,988,,109,0,,,,,,383,,0,2303,159,,,,,,0,,0 +"2020-04-03","OR",21,,3,,188,188,134,34,,,15259,2123,,,5071,,38,826,,90,0,,,,,2239,,,0,7310,1782,,,,,,0,7310,1782 +"2020-04-03","PA",102,,12,,852,852,,122,,,53695,5997,,,,,,8420,,1404,0,,,,,,,63756,7562,63756,7562,,,,,62115,7401,,0 +"2020-04-03","PR",15,,3,,,,,0,,,2049,445,,,,,,378,,62,0,,,,,,,,0,2427,507,,,,,,0,,0 +"2020-04-03","RI",14,,2,,,,77,0,,14,5342,717,,,5769,,6,831,,101,0,,,,,814,,5663,529,5663,529,,,,,6173,818,6583,883 +"2020-04-03","SC",31,,0,,241,241,,0,,,5441,0,,,,,,1554,1554,0,0,,,,,,,,0,6995,0,,,,,,0,,0 +"2020-04-03","SD",2,,0,,17,17,,0,,,4593,376,,,,,,187,,22,0,,,,,623,69,,0,4667,342,,,,,4780,398,4667,342 +"2020-04-03","TN",37,,5,,293,293,625,30,,,,0,,,34772,,,3067,,222,0,,,,,3067,248,,0,37839,3228,,,,,,0,37839,3228 +"2020-04-03","TX",90,,20,,,,196,0,,,,0,,,,,,5324,5324,659,0,,,,,11059,38,,0,104371,9067,,,,,,0,104371,9067 +"2020-04-03","UT",7,,0,,106,106,,6,,,27952,2521,,,28428,,,1246,,172,0,,,,,1509,,,0,29937,2718,,,,,29399,2651,29937,2718 +"2020-04-03","VA",46,,5,,246,246,,38,,,,0,,,,,,2012,,306,0,,2,,,4880,,27646,1964,27646,1964,,19,,,,0,,0 +"2020-04-03","VI",,,0,,,,,0,,,154,5,,,,,,38,,5,0,,,,,,29,,0,192,10,,,,,,0,,0 +"2020-04-03","VT",17,,0,,45,45,29,0,,,4658,473,,,,,,390,390,31,0,,,,,,15,,0,5380,509,,,,,5048,504,5380,509 +"2020-04-03","WA",338,,28,,,,,0,,,,0,,,,,,7439,7439,452,0,,,,,,,103598,5053,103598,5053,,,,,99871,4854,,0 +"2020-04-03","WI",37,,6,,487,487,257,26,,117,22377,2060,,,,,,2263,1912,223,0,,,,,,,26043,1904,26043,1904,,,,,,0,,0 +"2020-04-03","WV",2,,0,,1,1,,0,,,,0,,,,,,237,237,20,0,,,,,,,,0,5337,718,,,,,,0,5337,718 +"2020-04-03","WY",0,,0,,21,21,,2,,,2704,265,,,3857,,,162,162,12,0,,,,,210,37,,0,4067,404,,,,,,0,4067,404 +"2020-04-02","AK",3,,0,,16,16,,1,,,,0,,,,,,149,,8,0,,,,,,,,0,5022,419,,,,,,0,5022,419 +"2020-04-02","AL",32,,6,,,,226,0,,,7503,806,,,,,,1233,1233,156,0,,,,,,,,0,8736,962,,,,,8736,962,,0 +"2020-04-02","AR",12,,2,,100,100,66,10,,,7880,526,,,,32,23,643,643,59,0,,,,,,47,,0,8523,585,,,,,,0,8523,585 +"2020-04-02","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-02","AZ",32,,3,,616,616,,34,,,21111,1466,,,,,,1598,,185,0,,,,,,,,0,32656,2383,,,,,22709,1651,32656,2383 +"2020-04-02","CA",203,,32,,,,1922,0,,816,23809,2037,,,,,,9191,,1036,0,,,,,,,,0,33000,3073,,,,,,0,33000,3073 +"2020-04-02","CO",97,,17,,710,710,739,90,,,16683,1380,,,,,,3728,,386,0,,,,,,,21795,1589,21795,1589,,,,,20411,1766,,0 +"2020-04-02","CT",112,27,27,,,,827,0,,,,0,,,19575,,,3824,,267,0,,,,,8240,,,0,27832,2484,,,,,,0,27832,2484 +"2020-04-02","DC",12,,1,,,,,0,,,,0,,,,,,653,,67,0,,,,,,173,5070,1222,5070,1222,,,,,,0,,0 +"2020-04-02","DE",16,15,3,1,,,56,0,,,4566,551,,,,,,393,,25,0,,,,,437,49,6600,542,6600,542,,,,,,0,,0 +"2020-04-02","FL",128,,41,,1123,1123,,174,,,69286,9757,,,,,,7548,,1032,0,,,,,,,71703,8444,71703,8444,,,,,,0,,0 +"2020-04-02","GA",163,,24,,1056,1056,,104,,,,0,,,,,,5348,,710,0,,,,,4560,,,0,22970,2632,,,,,,0,22970,2632 +"2020-04-02","GU",3,,0,,,,19,0,,2,442,36,,,,,,82,,5,0,,,,,,12,,0,524,41,,,,,,0,,0 +"2020-04-02","HI",1,1,0,,15,15,,2,,,10206,1485,,,,,,258,,50,0,,,,,248,69,10656,1338,10656,1338,,,,,,0,,0 +"2020-04-02","IA",11,,2,,120,120,74,21,,,8054,750,,,,,,614,614,65,0,,,,,,46,,0,8668,815,,,,,,0,,0 +"2020-04-02","ID",9,,0,,49,49,49,3,7,,6613,537,,,,,,669,,144,0,,,,,,,,0,7282,681,,,,,7282,681,,0 +"2020-04-02","IL",157,,16,,,,,0,,,,0,,,,,,7695,,715,0,,,,,,,,0,43656,3272,,,,,,0,43656,3272 +"2020-04-02","IN",78,,13,,,,,0,,,13246,1436,,,,,,3039,,474,0,,,,,4182,,,0,29590,2698,,,,,,0,29590,2698 +"2020-04-02","KS",13,,3,,138,138,,24,,,6059,648,,,,,,552,,70,0,,,,,,,,0,6611,718,,,,,,0,,0 +"2020-04-02","KY",20,,3,,,,,0,,,,0,,,,,,680,,89,0,,,,,,,,0,7900,344,,,,,,0,7900,344 +"2020-04-02","LA",310,,37,,,,1639,0,,,41936,2584,,,,,507,9150,9150,2726,0,,,,,,,,0,51086,5310,,,,,,0,,0 +"2020-04-02","MA",229,,42,,813,813,,131,,,47767,3642,,,,,,8867,,1228,0,,,,,13347,,,0,75574,6004,,,,,,0,75574,6004 +"2020-04-02","MD",64,60,12,4,582,582,,60,,,18890,1657,,,,,,2331,2331,346,0,,,,,2806,81,,0,20739,2536,,,,,,0,20739,2536 +"2020-04-02","ME",7,,0,,68,68,,5,,,,0,,,,,,376,376,32,0,,,,,458,94,,0,10106,903,,,,,,0,10106,903 +"2020-04-02","MI",801,879,125,36,,,,0,,,,0,,,33443,,,21376,20937,1130,0,,,,,15652,,,0,49095,5907,,,,,,0,49095,5907 +"2020-04-02","MN",18,,1,,138,138,75,16,38,38,23780,1900,,,,,,1056,1056,83,0,,,,,,,24836,1983,24836,1983,,,,,,0,,0 +"2020-04-02","MO",19,,1,,,,,0,,,17849,2003,,,21700,,,1834,1834,253,0,,,,,2700,,,0,24415,2459,,,,,,0,24415,2459 +"2020-04-02","MP",1,,1,,,,,0,,,13,13,,,,,,8,,2,0,,,,,,,,0,21,15,,,,,,0,,0 +"2020-04-02","MS",26,,4,,360,360,,28,,,4753,1041,,,,,,1177,,104,0,,,,,,,,0,5930,1145,,,,,,0,,0 +"2020-04-02","MT",5,,0,,20,20,,3,,,,0,,,,,,227,,19,0,,,,,,,,0,5188,343,,,,,,0,5188,343 +"2020-04-02","NC",16,,6,,,,184,0,,,,0,,,,,,1857,,273,0,,,,,,,,0,31106,3435,,,,,,0,31106,3435 +"2020-04-02","ND",3,,0,,28,28,,5,,,4821,470,,,,,,159,159,20,0,,,,,,43,5289,649,5289,649,,,,,5090,612,5321,655 +"2020-04-02","NE",5,,1,,,,,0,,,3978,503,,,3862,,,246,,36,0,,,,,216,,,0,4137,718,,,,,4235,542,4137,718 +"2020-04-02","NH",4,,0,,58,58,,2,,,6078,93,,,,,,415,,0,0,,,,,,91,,0,7266,577,,,,,,0,7266,577 +"2020-04-02","NJ",680,537,205,143,,,2000,0,,,33520,3133,,,,,,25590,25590,3335,0,,,,,,,,0,59110,6468,,,,,59110,6468,,0 +"2020-04-02","NM",7,,1,,,,31,0,,,14375,727,,,,,,363,,48,0,,,,,,26,,0,14011,771,,,,,,0,14011,771 +"2020-04-02","NV",51,,6,,,,,0,,,12588,1069,,,,,,1458,1458,179,0,,,,,,,17623,1548,17623,1548,,,,,,0,16704,1403 +"2020-04-02","NY",2373,,432,,22786,22786,13383,2857,,3396,,0,,,,,,92381,,8669,0,,,,,,,238965,18031,238965,18031,,,,,,0,,0 +"2020-04-02","OH",81,,16,,802,802,,123,260,,,0,,,,,,2902,2902,355,0,,,,,2668,,,0,32866,2713,,,,,,0,32866,2713 +"2020-04-02","OK",34,,4,,257,257,182,38,,144,1265,17,,,,,,879,,160,0,,,,,,,,0,2144,177,,,,,,0,,0 +"2020-04-02","OR",18,,0,,154,154,132,0,,,13136,0,,,3521,,40,736,,46,0,,,,,2007,,,0,5528,1922,,,,,,0,5528,1922 +"2020-04-02","PA",90,,16,,730,730,,110,,,47698,5271,,,,,,7016,,1211,0,,,,,,,56194,6667,56194,6667,,,,,54714,6482,,0 +"2020-04-02","PR",12,,1,,,,,0,,,1604,195,,,,,,316,,30,0,,,,,,,,0,1920,225,,,,,,0,,0 +"2020-04-02","RI",12,,2,,,,72,0,,14,4625,436,,,4994,,6,730,,62,0,,,,,706,,5134,797,5134,797,,,,,5355,498,5700,529 +"2020-04-02","SC",31,,5,,241,241,,139,,,5441,408,,,,,,1554,1554,261,0,,,,,,,,0,6995,669,,,,,,0,,0 +"2020-04-02","SD",2,,0,,17,17,,5,,,4217,314,,,,,,165,,36,0,,,,,601,57,,0,4325,357,,,,,4382,350,4325,357 +"2020-04-02","TN",32,,8,,263,263,656,63,,,,0,,,31766,,,2845,,162,0,,,,,2845,220,,0,34611,2159,,,,,,0,34611,2159 +"2020-04-02","TX",70,,12,,,,196,0,,,,0,,,,,,4665,4665,669,0,,,,,10054,38,,0,95304,8975,,,,,,0,95304,8975 +"2020-04-02","UT",7,,0,,100,100,,9,,,25431,2202,,,25844,,,1074,,62,0,,,,,1375,,,0,27219,2376,,,,,26748,2324,27219,2376 +"2020-04-02","VA",41,,7,,208,208,246,43,,,,0,,,,,,1706,,222,0,,2,,,4550,,25682,2392,25682,2392,,19,,,,0,,0 +"2020-04-02","VI",,,0,,,,,0,,,149,23,,,,,,33,,3,0,,,,,,25,,0,182,26,,,,,,0,,0 +"2020-04-02","VT",17,,1,,45,45,29,0,,,4185,166,,,,,,359,359,39,0,,,,,,15,,0,4871,209,,,,,4544,205,4871,209 +"2020-04-02","WA",310,,28,,,,,0,,,,0,,,,,,6987,6987,462,0,,,,,,,98545,5171,98545,5171,,,,,95017,4907,,0 +"2020-04-02","WI",31,,7,,461,461,192,63,,103,20317,1498,,,,,,2040,1730,219,0,,,,,,,24139,1693,24139,1693,,,,,,0,,0 +"2020-04-02","WV",2,,1,,1,1,,0,,,,0,,,,,,217,217,26,0,,,,,,,,0,4619,669,,,,,,0,4619,669 +"2020-04-02","WY",0,,0,,19,19,,1,,,2439,221,,,3460,,,150,153,20,0,,,,,203,31,,0,3663,425,,,,,,0,3663,425 +"2020-04-01","AK",3,,0,,15,15,,3,,,,0,,,,,,141,,13,0,,,,,,,,0,4603,890,,,,,,0,4603,890 +"2020-04-01","AL",26,,13,,,,258,0,,,6697,399,,,,,,1077,1077,96,0,,,,,,,,0,7774,495,,,,,7774,495,,0 +"2020-04-01","AR",10,,2,,90,90,56,90,,,7354,1395,,,,32,25,584,584,61,0,,,,,,42,,0,7938,1456,,,,,,0,7938,1456 +"2020-04-01","AS",0,,0,,,,,0,,,3,0,,,,,,0,0,0,0,,,,,,,,0,3,0,,,,,,0,3,0 +"2020-04-01","AZ",29,,5,,582,582,,48,,,19645,1563,,,,,,1413,,124,0,,,,,,,,0,30273,2274,,,,,21058,1687,30273,2274 +"2020-04-01","CA",171,,18,,,,1855,0,,774,21772,0,,,,,,8155,,673,0,,,,,,,,0,29927,673,,,,,,0,29927,673 +"2020-04-01","CO",80,,11,,620,620,698,111,,,15303,1420,,,,,,3342,,376,0,,,,,,,20206,1692,20206,1692,,,,,18645,1796,,0 +"2020-04-01","CT",85,27,16,,,,766,0,,,,0,,,18064,,,3557,,429,0,,,,,7270,,,0,25348,2230,,,,,,0,25348,2230 +"2020-04-01","DC",11,,2,,,,,0,,,,0,,,,,,586,,91,0,,,,,,142,3848,91,3848,91,,,,,,0,,0 +"2020-04-01","DE",13,13,1,0,,,51,0,,,4015,319,,,,,,368,,49,0,,,,,353,49,6058,590,6058,590,,,,,,0,,0 +"2020-04-01","FL",87,,10,,949,949,,126,,,59529,5244,,,,,,6516,,904,0,,,,,,,63259,8213,63259,8213,,,,,,0,,0 +"2020-04-01","GA",139,,28,,952,952,,119,,,,0,,,,,,4638,,709,0,,,,,3713,,,0,20338,428,,,,,,0,20338,428 +"2020-04-01","GU",3,,1,,,,19,0,,2,406,35,,,,,,77,,8,0,,,,,,9,,0,483,43,,,,,,0,,0 +"2020-04-01","HI",1,1,1,,13,13,,1,,,8721,250,,,,,,208,,4,0,,,,,219,58,9318,488,9318,488,,,,,,0,,0 +"2020-04-01","IA",9,,2,,99,99,63,5,,,7304,416,,,,,,549,549,52,0,,,,,,118,,0,7853,468,,,,,,0,,0 +"2020-04-01","ID",9,,2,,46,46,49,1,7,,6076,779,,,,,,525,,110,0,,,,,,,,0,6601,889,,,,,6601,889,,0 +"2020-04-01","IL",141,,42,,,,,0,,,,0,,,,,,6980,,986,0,,,,,,,,0,40384,5159,,,,,,0,40384,5159 +"2020-04-01","IN",65,,16,,,,,0,,,11810,596,,,,,,2565,,406,0,,,,,3785,,,0,26892,2552,,,,,,0,26892,2552 +"2020-04-01","KS",10,,1,,114,114,,35,,,5411,415,,,,,,482,,54,0,,,,,,,,0,5893,469,,,,,,0,,0 +"2020-04-01","KY",17,,6,,,,,0,,,,0,,,,,,591,,111,0,,,,,,,,0,7556,746,,,,,,0,7556,746 +"2020-04-01","LA",273,,34,,,,1498,0,,,39352,5622,,,,,490,6424,6424,1187,0,,,,,,,,0,45776,6809,,,,,,0,,0 +"2020-04-01","MA",187,,34,,682,682,,120,,,44125,3685,,,,,,7639,,1118,0,,,,,11943,,,0,69570,5576,,,,,,0,69570,5576 +"2020-04-01","MD",52,50,9,2,522,522,,93,,,17233,2365,,,,,,1985,1985,325,0,,,,,2356,,,0,18203,2945,,,,,,0,18203,2945 +"2020-04-01","ME",7,,2,,63,63,,6,,,,0,,,,,,344,344,41,0,,,,,413,80,,0,9203,560,,,,,,0,9203,560 +"2020-04-01","MI",676,765,125,35,,,,0,,,,0,,,29951,,,20246,19844,1592,0,,,,,13237,,,0,43188,6133,,,,,,0,43188,6133 +"2020-04-01","MN",17,,5,,122,122,54,10,27,27,21880,945,,,,,,973,973,57,0,,,,,,,22853,1002,22853,1002,,,,,,0,,0 +"2020-04-01","MO",18,,4,,,,,0,,,15846,1232,,,19540,,,1581,1581,254,0,,,,,2402,,,0,21956,2767,,,,,,0,21956,2767 +"2020-04-01","MP",,,0,,,,,0,,,,0,,,,,,6,,4,0,,,,,,,,0,6,4,,,,,,0,,0 +"2020-04-01","MS",22,,2,,332,332,,121,,,3712,175,,,,,,1073,,136,0,,,,,,,,0,4785,311,,,,,,0,,0 +"2020-04-01","MT",5,,1,,17,17,,3,,,,0,,,,,,208,,24,0,,,,,,,,0,4845,960,,,,,,0,4845,960 +"2020-04-01","NC",10,,2,,,,204,0,,,,0,,,,,,1584,,86,0,,,,,,,,0,27671,2787,,,,,,0,27671,2787 +"2020-04-01","ND",3,,0,,23,23,,2,,,4351,220,,,,,,139,139,22,0,,,,,,34,4640,565,4640,565,,,,,4478,536,4666,568 +"2020-04-01","NE",4,,1,,,,,0,,,3475,544,,,3187,,,210,,38,0,,,,,175,,,0,3419,417,,,,,3693,582,3419,417 +"2020-04-01","NH",4,,1,,56,56,,11,,,5985,572,,,,,,415,,101,0,,,,,,56,,0,6689,449,,,,,,0,6689,449 +"2020-04-01","NJ",475,355,111,120,,,2000,0,,,30387,3310,,,,,,22255,22255,3559,0,,,,,,,,0,52642,6869,,,,,52642,6869,,0 +"2020-04-01","NM",6,,1,,,,31,0,,,13648,723,,,,,,315,,34,0,,,,,,26,,0,13240,713,,,,,,0,13240,713 +"2020-04-01","NV",45,,8,,,,,0,,,11519,838,,,,,,1279,1279,166,0,,,,,,,16075,1249,16075,1249,,,,,,0,15301,1157 +"2020-04-01","NY",1941,,391,,19929,19929,12226,2844,,3022,,0,,,,,,83712,,7917,0,,,,,,,220934,15701,220934,15701,,,,,,0,,0 +"2020-04-01","OH",65,,10,,679,679,,94,222,,,0,,,,,,2547,2547,348,0,,,,,2287,,,0,30153,2543,,,,,,0,30153,2543 +"2020-04-01","OK",30,,7,,219,219,174,42,,98,1248,19,,,,,,719,,154,0,,,,,,,,0,1967,173,,,,,,0,,0 +"2020-04-01","OR",18,,2,,154,154,132,14,,,13136,859,,,1790,,40,690,,84,0,,,,,1816,,,0,3606,1064,,,,,,0,3606,1064 +"2020-04-01","PA",74,,11,,620,620,,106,,,42427,4782,,,,,,5805,,962,0,,,,,,,49527,6034,49527,6034,,,,,48232,5744,,0 +"2020-04-01","PR",11,,3,,,,,0,,,1409,214,,,,,,286,,47,0,,,,,,,,0,1695,261,,,,,,0,,0 +"2020-04-01","RI",10,,2,,,,60,0,,14,4189,645,,,4517,,6,668,,100,0,,,,,654,,4337,440,4337,440,,,,,4857,745,5171,798 +"2020-04-01","SC",26,,4,,102,102,,0,,,5033,417,,,,,,1293,1293,210,0,,,,,,,,0,6326,627,,,,,,0,,0 +"2020-04-01","SD",2,,1,,12,12,,0,,,3903,294,,,,,,129,,21,0,,,,,574,51,,0,3968,245,,,,,4032,315,3968,245 +"2020-04-01","TN",24,,1,,200,200,486,25,,,,0,,,29769,,,2683,,444,0,,,,,2683,137,,0,32452,5092,,,,,,0,32452,5092 +"2020-04-01","TX",58,,17,,,,196,0,,,,0,,,,,,3996,3996,730,0,,,,,9091,38,,0,86329,8109,,,,,,0,86329,8109 +"2020-04-01","UT",7,,2,,91,91,,18,,,23229,2703,,,23602,,,1012,,125,0,,,,,1241,,,0,24843,2913,,,,,24424,2844,24843,2913 +"2020-04-01","VA",34,,7,,165,165,,29,,,,0,,,,,,1484,,234,0,,2,,,4191,,23290,1897,23290,1897,,19,,,,0,,0 +"2020-04-01","VI",,,0,,,,,0,,,126,0,,,,,,30,,0,0,,,,,,21,,0,156,0,,,,,,0,,0 +"2020-04-01","VT",16,,3,,45,45,30,9,,,4019,180,,,,,,320,320,27,0,,,,,,15,,0,4662,215,,,,,4339,207,4662,215 +"2020-04-01","WA",282,,20,,,,,0,,,,0,,,,,,6525,6525,568,0,,,,,,,93374,4962,93374,4962,,,,,90110,4717,,0 +"2020-04-01","WI",24,,8,,398,398,,61,,,18819,1444,,,,,,1821,1550,236,0,,,,,,,22446,2057,22446,2057,,,,,,0,,0 +"2020-04-01","WV",1,,0,,1,1,,0,,,,0,,,,,,191,191,29,0,,,,,,,,0,3950,410,,,,,,0,3950,410 +"2020-04-01","WY",0,,0,,18,18,,1,,,2218,219,,,3050,,,130,137,21,0,,,,,188,31,,0,3238,316,,,,,,0,3238,316 +"2020-03-31","AK",3,,0,,12,12,,2,,,,0,,,,,,128,,10,0,,,,,,,,0,3713,59,,,,,,0,3713,59 +"2020-03-31","AL",13,,7,,,,172,0,,,6298,604,,,,,,981,981,122,0,,,,,,,,0,7279,726,,,,,7279,726,,0 +"2020-03-31","AR",8,,1,,,,64,0,,,5959,697,,,,,23,523,523,50,0,,,,,,35,,0,6482,747,,,,,,0,6482,747 +"2020-03-31","AS",0,,0,,,,,0,,,3,3,,,,,,0,0,0,0,,,,,,,,0,3,3,,,,,,0,3,3 +"2020-03-31","AZ",24,,4,,534,534,,56,,,18082,2480,,,,,,1289,,132,0,,,,,,,,0,27999,2441,,,,,19371,2612,27999,2441 +"2020-03-31","CA",153,,20,,,,1617,0,,657,21772,1223,,,,,,7482,,1035,0,,,,,,,,0,29254,2258,,,,,,0,29254,2258 +"2020-03-31","CO",69,,18,,509,509,574,95,,,13883,1146,,,,,,2966,,339,0,,,,,,,18514,1407,18514,1407,,,,,16849,1485,,0 +"2020-03-31","CT",69,21,33,,,,608,0,,,,0,,,16744,,,3128,,557,0,,,,,6364,,,0,23118,2127,,,,,,0,23118,2127 +"2020-03-31","DC",9,,0,,,,,0,,,,0,,,,,,495,,94,0,,,,,,121,3757,674,3757,674,,,,,,0,,0 +"2020-03-31","DE",12,12,1,0,,,57,0,,,3696,1480,,,,,,319,,55,0,,,,,292,22,5468,457,5468,457,,,,,,0,,0 +"2020-03-31","FL",77,,14,,823,823,,171,,,54285,6060,,,,,,5612,,852,0,,,,,,,55046,6927,55046,6927,,,,,,0,,0 +"2020-03-31","GA",111,,24,,833,833,,126,,,,0,,,,,,3929,,1120,0,,,,,3653,,,0,19910,3685,,,,,,0,19910,3685 +"2020-03-31","GU",2,,1,,,,19,0,,2,371,19,,,,,,69,,11,0,,,,,,7,,0,440,30,,,,,,0,,0 +"2020-03-31","HI",,,0,,12,12,,0,,,8471,646,,,,,,204,,29,0,,,,,202,49,8830,685,8830,685,,,,,,0,,0 +"2020-03-31","IA",7,,1,,94,94,61,20,,,6888,726,,,,,,497,497,73,0,,,,,,33,,0,7385,799,,,,,,0,,0 +"2020-03-31","ID",7,,1,,45,45,45,6,6,,5297,901,,,,,,415,,105,0,,,,,,,,0,5712,1006,,,,,5712,1006,,0 +"2020-03-31","IL",99,,26,,,,,0,,,,0,,,,,,5994,,937,0,,,,,,,,0,35225,4779,,,,,,0,35225,4779 +"2020-03-31","IN",49,,14,,,,,0,,,11214,1342,,,,,,2159,,373,0,,,,,3394,,,0,24340,2059,,,,,,0,24340,2059 +"2020-03-31","KS",9,,1,,79,79,,13,,,4996,442,,,,,,428,,60,0,,,,,,,,0,5424,502,,,,,,0,,0 +"2020-03-31","KY",11,,2,,,,,0,,,,0,,,,,,480,,41,0,,,,,,,,0,6810,792,,,,,,0,6810,792 +"2020-03-31","LA",239,,54,,,,1355,0,,,33730,3722,,,,,438,5237,5237,1212,0,,,,,,,,0,38967,4934,,,,,,0,,0 +"2020-03-31","MA",153,,29,,562,562,,109,,,40440,3274,,,,,,6521,,868,0,,,,,10520,,,0,63994,5930,,,,,,0,63994,5930 +"2020-03-31","MD",43,42,8,1,429,429,,76,,,14868,1552,,,,,,1660,1660,247,0,,,,,1861,,,0,15258,2054,,,,,,0,15258,2054 +"2020-03-31","ME",5,,2,,57,57,,8,,,,0,,,,,,303,303,28,0,,,,,376,68,,0,8643,631,,,,,,0,8643,631 +"2020-03-31","MI",551,641,114,33,,,,0,,,,0,,,26334,,,18654,18318,1291,0,,,,,10721,,,0,37055,4883,,,,,,0,37055,4883 +"2020-03-31","MN",12,,2,,112,112,56,20,26,26,20935,1423,,,,,,916,916,93,0,,,,,,,21851,1516,21851,1516,,,,,,0,,0 +"2020-03-31","MO",14,,1,,,,,0,,,14614,1410,,,17138,,,1327,1327,296,0,,,,,2037,,,0,19189,890,,,,,,0,19189,890 +"2020-03-31","MP",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,,,,0,2,0,,,,,,0,,0 +"2020-03-31","MS",20,,4,,211,211,,16,,,3537,548,,,,,,937,,90,0,,,,,,,,0,4474,638,,,,,,0,,0 +"2020-03-31","MT",4,,0,,14,14,,4,,,,0,,,,,,184,,13,0,,,,,,,,0,3885,0,,,,,,0,3885,0 +"2020-03-31","NC",8,,2,,,,157,0,,,,0,,,,,,1498,,191,0,,,,,,,,0,24884,2082,,,,,,0,24884,2082 +"2020-03-31","ND",3,,1,,21,21,,2,,,4131,403,,,,,,117,117,10,0,,,,,,30,4075,207,4075,207,,,,,3942,199,4098,206 +"2020-03-31","NE",3,,1,,,,,0,,,2931,347,,,2803,,,172,,27,0,,,,,148,,,0,3002,391,,,,,3111,377,3002,391 +"2020-03-31","NH",3,,0,,45,45,,0,,,5413,27,,,,,,314,,0,0,,,,,,,,0,6240,250,,,,,,0,6240,250 +"2020-03-31","NJ",364,267,98,97,,,2000,0,,,27077,1853,,,,,,18696,18696,2060,0,,,,,,,,0,45773,3913,,,,,45773,3913,,0 +"2020-03-31","NM",5,,1,,,,24,0,,,12925,679,,,,,,281,,44,0,,,,,,26,,0,12527,1521,,,,,,0,12527,1521 +"2020-03-31","NV",37,,5,,,,,0,,,10681,474,,,,,,1113,1113,117,0,,,,,,,14826,1250,14826,1250,,,,,,0,14144,795 +"2020-03-31","NY",1550,,332,,17085,17085,10929,2507,,2710,,0,,,,,,75795,,9298,0,,,,,,,205233,18648,205233,18648,,,,,,0,,0 +"2020-03-31","OH",55,,16,,585,585,,110,198,,,0,,,,,,2199,2199,266,0,,,,,1989,,,0,27610,2208,,,,,,0,27610,2208 +"2020-03-31","OK",23,,6,,177,177,,24,,83,1229,22,,,,,,565,,84,0,,,,,,,,0,1794,106,,,,,,0,,0 +"2020-03-31","OR",16,,3,,140,140,132,11,,,12277,1399,,,853,,39,606,,58,0,,,,,1689,,,0,2542,1206,,,,,,0,2542,1206 +"2020-03-31","PA",63,,14,,514,514,,128,,,37645,3868,,,,,,4843,,756,0,,,,,,,43493,4816,43493,4816,,,,,42488,4624,,0 +"2020-03-31","PR",8,,2,,,,,0,,,1195,264,,,,,,239,,65,0,,,,,,,,0,1434,329,,,,,,0,,0 +"2020-03-31","RI",8,,4,,,,59,0,,9,3544,298,,,3818,,6,568,,73,0,,,,,555,,3897,284,3897,284,,,,,4112,371,4373,440 +"2020-03-31","SC",22,,4,,102,102,,0,,,4616,456,,,,,,1083,1083,158,0,,,,,,,,0,5699,614,,,,,,0,,0 +"2020-03-31","SD",1,,0,,12,12,,12,,,3609,131,,,,,,108,,7,0,,,,,554,44,,0,3723,290,,,,,3717,138,3723,290 +"2020-03-31","TN",23,,10,,175,175,9,27,,,,0,,,25121,,,2239,,405,0,,,,,2239,121,,0,27360,4056,,,,,,0,27360,4056 +"2020-03-31","TX",41,,7,,,,196,0,,,,0,,,,,,3266,3266,392,0,,,,,8249,38,,0,78220,7427,,,,,,0,78220,7427 +"2020-03-31","UT",5,,1,,73,73,,73,,,20526,2194,,,20833,,,887,,81,0,,,,,1097,,,0,21930,2363,,,,,21580,2314,21930,2363 +"2020-03-31","VA",27,,2,,136,136,,24,,,,0,,,,,,1250,,230,0,,2,,,3847,,21393,1685,21393,1685,,19,,,,0,,0 +"2020-03-31","VI",,,0,,,,,0,,,126,0,,,,,,30,,0,0,,,,,,21,,0,156,0,,,,,,0,,0 +"2020-03-31","VT",13,,1,,36,36,21,18,,,3839,293,,,,,,293,293,37,0,,,,,,15,,0,4447,345,,,,,4132,330,4447,345 +"2020-03-31","WA",262,,14,,,,,0,,,,0,,,,,,5957,5957,241,0,,,,,,,88412,4881,88412,4881,,,,,85393,4706,,0 +"2020-03-31","WI",16,,2,,337,337,,337,,,17375,1519,,,,,,1585,1351,163,0,,,,,,,20389,1394,20389,1394,,,,,,0,,0 +"2020-03-31","WV",1,,0,,1,1,,0,,,,0,,,,,,162,162,36,0,,,,,,,,0,3540,381,,,,,,0,3540,381 +"2020-03-31","WY",0,,0,,17,17,,0,,,1999,159,,,2764,,,109,120,15,0,,,,,158,26,,0,2922,281,,,,,,0,2922,281 +"2020-03-30","AK",3,,1,,10,10,,0,,,,0,,,,,,118,,8,0,,,,,,,,0,3654,320,,,,,,0,3654,320 +"2020-03-30","AL",6,,2,,,,156,0,,,5694,1510,,,,,,859,859,53,0,,,,,,,,0,6553,1563,,,,,6553,1563,,0 +"2020-03-30","AR",7,,1,,,,62,0,,,5262,2235,,,,,21,473,473,47,0,,,,,,29,,0,5735,2282,,,,,,0,5735,2282 +"2020-03-30","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-30","AZ",20,,3,,478,478,,51,,,15602,2649,,,,,,1157,,238,0,,,,,,,,0,25558,781,,,,,16759,2887,25558,781 +"2020-03-30","CA",133,,10,,,,1432,0,,597,20549,0,,,,,,6447,,739,0,,,,,,,,0,26996,739,,,,,,0,26996,739 +"2020-03-30","CO",51,,4,,414,414,503,88,,,12737,0,,,,,,2627,,320,0,,,,,,,17107,1633,17107,1633,,,,,15364,894,,0 +"2020-03-30","CT",36,19,2,,,,517,0,,,,0,,,15476,,,2571,,578,0,,,,,5506,,,0,20991,829,,,,,,0,20991,829 +"2020-03-30","DC",9,,4,,,,,0,,,,0,,,,,,401,,59,0,,,,,,106,3083,272,3083,272,,,,,,0,,0 +"2020-03-30","DE",11,11,1,0,,,45,0,,,2216,2180,,,,,,264,,32,0,,,,,244,9,5011,542,5011,542,,,,,,0,,0 +"2020-03-30","FL",63,,7,,652,652,,58,,,48225,9155,,,,,,4760,,876,0,,,,,,,48119,7137,48119,7137,,,,,,0,,0 +"2020-03-30","GA",87,,7,,707,707,,41,,,,0,,,,,,2809,,158,0,,,,,2920,,,0,16225,1596,,,,,,0,16225,1596 +"2020-03-30","GU",1,,0,,,,19,0,,2,352,18,,,,,,58,,2,0,,,,,,7,,0,410,20,,,,,,0,,0 +"2020-03-30","HI",,,0,,12,12,,0,,,7825,976,,,,,,175,,24,0,,,,,175,,8145,1190,8145,1190,,,,,,0,,0 +"2020-03-30","IA",6,,2,,74,74,51,6,,,6162,1149,,,,,,424,424,88,0,,,,,,23,,0,6586,1237,,,,,,0,,0 +"2020-03-30","ID",6,,1,,39,39,42,3,,,4396,375,,,,,,310,,49,0,,,,,,,,0,4706,424,,,,,4706,424,,0 +"2020-03-30","IL",73,,8,,,,,0,,,,0,,,,,,5057,,461,0,,,,,,,,0,30446,2684,,,,,,0,30446,2684 +"2020-03-30","IN",35,,3,,,,,0,,,9872,1556,,,,,,1786,,272,0,,,,,3029,,,0,22281,1709,,,,,,0,22281,1709 +"2020-03-30","KS",8,,2,,66,66,,11,,,4554,360,,,,,,368,,49,0,,,,,,,,0,4922,409,,,,,,0,,0 +"2020-03-30","KY",9,,0,,,,,0,,,,0,,,,,,439,,45,0,,,,,,,,0,6018,477,,,,,,0,6018,477 +"2020-03-30","LA",185,,34,,,,1185,0,,,30008,5677,,,,,385,4025,4025,485,0,,,,,,,,0,34033,6162,,,,,,0,,0 +"2020-03-30","MA",124,,25,,453,453,,54,,,37166,2932,,,,,,5653,,797,0,,,,,9117,,,0,58064,5581,,,,,,0,58064,5581 +"2020-03-30","MD",35,34,11,1,353,353,,76,,,13316,962,,,,,,1413,1413,174,0,,,,,1537,,,0,13204,1585,,,,,,0,13204,1585 +"2020-03-30","ME",3,,0,,49,49,,49,,,,0,,,,,,275,275,22,0,,,,,342,41,,0,8012,695,,,,,,0,8012,695 +"2020-03-30","MI",437,518,86,29,,,,0,,,,0,,,23263,,,17363,17058,1579,0,,,,,8909,,,0,32172,7860,,,,,,0,32172,7860 +"2020-03-30","MN",10,,1,,92,92,56,17,24,24,19512,946,,,,,,823,823,98,0,,,,,,,20335,1044,20335,1044,,,,,,0,,0 +"2020-03-30","MO",13,,3,,,,,0,,,13204,1657,,,16387,,,1031,1031,193,0,,,,,1898,,,0,18299,1274,,,,,,0,18299,1274 +"2020-03-30","MP",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,,,,0,2,0,,,,,,0,,0 +"2020-03-30","MS",16,,2,,195,195,,-40,,,2989,429,,,,,,847,,89,0,,,,,,,,0,3836,518,,,,,,0,,0 +"2020-03-30","MT",4,,3,,10,10,,2,,,,0,,,,,,171,,17,0,,,,,,,,0,3885,0,,,,,,0,3885,0 +"2020-03-30","NC",6,,2,,,,137,0,,,,0,,,,,,1307,,267,0,,,,,,,,0,22802,1638,,,,,,0,22802,1638 +"2020-03-30","ND",2,,1,,19,19,,2,,,3728,373,,,,,,107,107,10,0,,,,,,19,3868,294,3868,294,,,,,3743,284,3892,295 +"2020-03-30","NE",2,,0,,,,,0,,,2584,616,,,2434,,,145,,37,0,,,,,127,,,0,2611,353,,,,,2734,389,2611,353 +"2020-03-30","NH",3,,1,,45,45,,12,,,5386,862,,,,,,314,,100,0,,,,,,,,0,5990,513,,,,,,0,5990,513 +"2020-03-30","NJ",266,198,49,68,,,2000,0,,,25224,3008,,,,,,16636,16636,3250,0,,,,,,,,0,41860,6258,,,,,41860,6258,,0 +"2020-03-30","NM",4,,2,,,,22,0,,,12246,1477,,,,,,237,,29,0,,,,,,26,,0,11006,29,,,,,,0,11006,29 +"2020-03-30","NV",32,,4,,,,,0,,,10207,1795,,,,,,996,996,258,0,,,,,,,13576,455,13576,455,,,,,,0,13349,2568 +"2020-03-30","NY",1218,,253,,14578,14578,9517,1883,,2352,,0,,,,,,66497,,6984,0,,,,,,,186585,14115,186585,14115,,,,,,0,,0 +"2020-03-30","OH",39,,10,,475,475,,72,163,,,0,,,,,,1933,1933,280,0,,,,,1716,,,0,25402,2101,,,,,,0,25402,2101 +"2020-03-30","OK",17,,1,,153,153,,13,,103,1207,2,,,,,,481,,52,0,,,,,,,,0,1688,54,,,,,,0,,0 +"2020-03-30","OR",13,,0,,129,129,107,12,,,10878,1185,,,31,,37,548,,69,0,,,,,1305,,,0,1336,1336,,,,,,0,1336,1336 +"2020-03-30","PA",49,,11,,386,386,,33,,,33777,3716,,,,,,4087,,693,0,,,,,,,38677,4494,38677,4494,,,,,37864,4409,,0 +"2020-03-30","PR",6,,1,,,,,0,,,931,90,,,,,,174,,47,0,,,,,,,,0,1105,137,,,,,,0,,0 +"2020-03-30","RI",4,,1,,,,41,0,,9,3246,190,,,3449,,6,495,,78,0,,,,,484,,3613,450,3613,450,,,,,3741,268,3933,284 +"2020-03-30","SC",18,,2,,102,102,,0,,,4160,1145,,,,,,925,925,151,0,,,,,,,,0,5085,1296,,,,,,0,,0 +"2020-03-30","SD",1,,0,,,,,0,,,3478,351,,,,,,101,,11,0,,,,,539,34,,0,3433,425,,,,,3579,362,3433,425 +"2020-03-30","TN",13,,6,,148,148,,15,,,,0,,,21470,,,1834,,297,0,,,,,1834,,,0,23304,2730,,,,,,0,23304,2730 +"2020-03-30","TX",34,,0,,,,,0,,,,0,,,,,,2874,2874,322,0,,,,,7387,38,,0,70793,2805,,,,,,0,70793,2805 +"2020-03-30","UT",4,,2,,,,,0,,,18332,1294,,,18593,,,806,,87,0,,,,,974,,,0,19567,1400,,,,,19266,1349,19567,1400 +"2020-03-30","VA",25,,3,,112,112,,13,,,,0,,,,,,1020,,130,0,,2,,,3613,,19708,1386,19708,1386,,19,,,,0,,0 +"2020-03-30","VI",,,0,,,,,0,,,126,3,,,,,,30,,7,0,,,,,,,,0,156,10,,,,,,0,,0 +"2020-03-30","VT",12,,0,,18,18,,0,,,3546,172,,,,,,256,256,22,0,,,,,,,,0,4102,185,,,,,3802,194,4102,185 +"2020-03-30","WA",248,,11,,,,,0,,,,0,,,,,,5716,5716,287,0,,,,,,,83531,5450,83531,5450,,,,,80687,5150,,0 +"2020-03-30","WI",14,,1,,,,,0,,,15856,-694,,,,,,1422,1221,146,0,,,,,,,18995,1274,18995,1274,,,,,,0,,0 +"2020-03-30","WV",1,,1,,1,1,,0,,,,0,,,,,,126,126,13,0,,,,,,,,0,3159,584,,,,,,0,3159,584 +"2020-03-30","WY",0,,0,,17,17,,2,,,1840,286,,,2496,,,94,95,8,0,,,,,145,24,,0,2641,257,,,,,,0,2641,257 +"2020-03-29","AK",2,,0,,10,10,,0,,,,0,,,,,,110,,19,0,,,,,,,,0,3334,413,,,,,,0,3334,413 +"2020-03-29","AL",4,,1,,,,158,0,,,4184,0,,,,,,806,806,110,0,,,,,,,,0,4990,110,,,,,4990,110,,0 +"2020-03-29","AR",6,,1,,,,43,0,,,3027,89,,,,,16,426,426,22,0,,,,,,28,,0,3453,111,,,,,,0,3453,111 +"2020-03-29","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-29","AZ",17,,2,,427,427,,41,,,12953,5498,,,,,,919,,46,0,,,,,,,,0,24777,1237,,,,,13872,5544,24777,1237 +"2020-03-29","CA",123,,22,,,,1034,0,,410,20549,0,,,,,,5708,,1065,0,,,,,,,,0,26257,1065,,,,,,0,26257,1065 +"2020-03-29","CO",47,,3,,326,326,358,52,,,12737,1522,,,,,,2307,,246,0,,,,,,,15474,1283,15474,1283,,,,,14470,1194,,0 +"2020-03-29","CT",34,12,1,,,,404,0,,,,0,,,15032,,,1993,,469,0,,,,,5121,,,0,20162,1328,,,,,,0,20162,1328 +"2020-03-29","DC",5,,1,,,,,0,,,,0,,,,,,342,,38,0,,,,,,66,2811,296,2811,296,,,,,,0,,0 +"2020-03-29","DE",10,10,1,0,,,33,0,,,36,0,,,,,,232,,18,0,,,,,183,9,4469,476,4469,476,,,,,,0,,0 +"2020-03-29","FL",56,,2,,594,594,,68,,,39070,3704,,,,,,3884,,705,0,,,,,,,40982,6375,40982,6375,,,,,,0,,0 +"2020-03-29","GA",80,,11,,666,666,,49,,,,0,,,,,,2651,,285,0,,,,,2508,,,0,14629,549,,,,,,0,14629,549 +"2020-03-29","GU",1,,0,,,,15,0,,,334,35,,,,,,56,,1,0,,,,,,7,,0,390,36,,,,,,0,,0 +"2020-03-29","HI",,,0,,12,12,,4,,,6849,2492,,,,,,151,,31,0,,,,,146,,6955,1158,6955,1158,,,,,,0,,0 +"2020-03-29","IA",4,,1,,68,68,51,7,,,5013,638,,,,,,336,336,38,0,,,,,,17,,0,5349,676,,,,,,0,,0 +"2020-03-29","ID",5,,1,,36,36,35,11,,,4021,679,,,,,,261,,31,0,,,,,,,,0,4282,710,,,,,4282,710,,0 +"2020-03-29","IL",65,,18,,,,,0,,,,0,,,,,,4596,,1105,0,,,,,,,,0,27762,2333,,,,,,0,27762,2333 +"2020-03-29","IN",32,,1,,,,,0,,,8316,1141,,,,,,1514,,282,0,,,,,2813,,,0,20572,1433,,,,,,0,20572,1433 +"2020-03-29","KS",6,,1,,55,55,,28,,,4194,523,,,,,,319,,58,0,,,,,,,,0,4513,581,,,,,,0,,0 +"2020-03-29","KY",9,,1,,,,,0,,,,0,,,,,,394,,92,0,,,,,,,,0,5541,418,,,,,,0,5541,418 +"2020-03-29","LA",151,,14,,,,1127,0,,,24331,2485,,,,,380,3540,3540,225,0,,,,,,,,0,27871,2710,,,,,,0,,0 +"2020-03-29","MA",99,,27,,399,399,,49,,,34234,3319,,,,,,4856,,698,0,,,,,7800,,,0,52483,2473,,,,,,0,52483,2473 +"2020-03-29","MD",24,23,7,1,277,277,,51,,,12354,838,,,,,,1239,1239,247,0,,,,,1294,,,0,11619,1308,,,,,,0,11619,1308 +"2020-03-29","ME",3,,2,,,,,0,,,,0,,,,,,253,253,42,0,,,,,319,41,,0,7317,1236,,,,,,0,7317,1236 +"2020-03-29","MI",351,408,68,25,,,,0,,,,0,,,17417,,,15784,15519,919,0,,,,,6895,,,0,24312,2392,,,,,,0,24312,2392 +"2020-03-29","MN",9,,4,,75,75,39,18,17,,18566,1171,,,,,,725,725,38,0,,,,,,243,19291,1209,19291,1209,,,,,,0,,0 +"2020-03-29","MO",10,,0,,,,,0,,,11547,1465,,,15311,,,838,838,0,0,,,,,1702,,,0,17025,2136,,,,,,0,17025,2136 +"2020-03-29","MP",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,,,,0,2,0,,,,,,0,,0 +"2020-03-29","MS",14,,1,,235,235,,16,,,2560,0,,,,,,758,,95,0,,,,,,,,0,3318,95,,,,,,0,,0 +"2020-03-29","MT",1,,0,,8,8,,1,,,,0,,,,,,154,,25,0,,,,,,,,0,3885,468,,,,,,0,3885,468 +"2020-03-29","NC",4,,0,,,,91,0,,,,0,,,,,,1040,,105,0,,,,,,,,0,21164,2910,,,,,,0,21164,2910 +"2020-03-29","ND",1,,0,,17,17,,1,,,3355,546,,,,,,97,97,17,0,,,,,,18,3574,522,3574,522,,,,,3459,502,3597,525 +"2020-03-29","NE",2,,0,,,,,0,,,1968,64,,,2103,,,108,,12,0,,,,,105,,,0,2258,338,,,,,2345,339,2258,338 +"2020-03-29","NH",2,,0,,33,33,,3,,,4524,868,,,,,,214,,27,0,,,,,,,,0,5477,477,,,,,,0,5477,477 +"2020-03-29","NJ",217,161,26,56,,,2000,0,,,22216,2830,,,,,,13386,13386,2262,0,,,,,,,,0,35602,5092,,,,,35602,5092,,0 +"2020-03-29","NM",2,,0,,,,22,0,,,10769,0,,,,,,208,,17,0,,,,,,26,,0,10977,1590,,,,,,0,10977,1590 +"2020-03-29","NV",28,,3,,,,,0,,,8412,511,,,,,,738,738,117,0,,,,,,,13121,560,13121,560,,,,,,0,10781,808 +"2020-03-29","NY",965,,237,,12695,12695,8503,2241,,2037,,0,,,,,,59513,,7195,0,,,,,,,172470,16401,172470,16401,,,,,,0,,0 +"2020-03-29","OH",29,,4,,403,403,,59,139,,,0,,,,,,1653,1653,247,0,,,,,1496,,,0,23301,3186,,,,,,0,23301,3186 +"2020-03-29","OK",16,,1,,140,140,,14,,,1205,25,,,,,,429,,52,0,,,,,,,,0,1634,77,,,,,,0,,0 +"2020-03-29","OR",13,,1,,117,117,107,15,,,9693,1183,,,,,31,479,,65,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-29","PA",38,,4,,353,353,,37,,,30061,4807,,,,,,3394,,643,0,,,,,,,34183,5500,34183,5500,,,,,33455,5450,,0 +"2020-03-29","PR",5,,2,,,,,0,,,841,102,,,,,,127,,27,0,,,,,,,,0,968,129,,,,,,0,,0 +"2020-03-29","RI",3,,3,,,,35,0,,9,3056,314,,,3227,,6,417,,105,0,,,,,422,,3163,319,3163,319,,,,,3473,419,3649,462 +"2020-03-29","SC",16,,3,,102,102,,0,,,3015,607,,,,,,774,774,235,0,,,,,,,,0,3789,842,,,,,,0,,0 +"2020-03-29","SD",1,,0,,,,,0,,,3127,535,,,,,,90,,22,0,,,,,520,29,,0,3008,414,,,,,3217,557,3008,414 +"2020-03-29","TN",7,,1,,133,133,,15,,,,0,,,19037,,,1537,,164,0,,,,,1537,,,0,20574,2236,,,,,,0,20574,2236 +"2020-03-29","TX",34,,7,,,,,0,,,,0,,,,,,2552,2552,504,0,,,,,6974,,,0,67988,3842,,,,,,0,67988,3842 +"2020-03-29","UT",2,,0,,,,,0,,,17038,2557,,,17249,,,719,,117,0,,,,,918,,,0,18167,2726,,,,,17917,2685,18167,2726 +"2020-03-29","VA",22,,5,,99,99,,16,,,,0,,,,,,890,,151,0,,1,,,3403,,18322,1598,18322,1598,,18,,,,0,,0 +"2020-03-29","VI",,,0,,,,,0,,,123,17,,,,,,23,,1,0,,,,,,,,0,146,18,,,,,,0,,0 +"2020-03-29","VT",12,,0,,18,18,,0,,,3374,268,,,,,,234,234,21,0,,,,,,,,0,3917,309,,,,,3608,289,3917,309 +"2020-03-29","WA",237,,17,,,,,0,,,,0,,,,,,5429,5429,462,0,,,,,,,78081,1987,78081,1987,,,,,75537,1833,,0 +"2020-03-29","WI",13,,0,,,,,0,,,16550,1318,,,,,,1276,1112,142,0,,,,,,,17721,1329,17721,1329,,,,,,0,,0 +"2020-03-29","WV",0,,0,,1,1,,0,,,,0,,,,,,113,113,17,0,,,,,,,,0,2575,356,,,,,,0,2575,356 +"2020-03-29","WY",0,,0,,15,15,,1,,,1554,79,,,2267,,,86,87,4,0,,,,,117,20,,0,2384,78,,,,,,0,2384,78 +"2020-03-28","AK",2,,1,,10,10,,4,,,,0,,,,,,91,,17,0,,,,,,,,0,2921,533,,,,,,0,2921,533 +"2020-03-28","AL",3,,0,,,,134,0,,,4184,0,,,,,,696,696,109,0,,,,,,,,0,4880,109,,,,,4880,109,,0 +"2020-03-28","AR",5,,2,,,,48,0,,,2938,1393,,,,,17,404,404,23,0,,,,,,24,,0,3342,1416,,,,,,0,3342,1416 +"2020-03-28","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-28","AZ",15,,2,,386,386,,43,,,7455,0,,,,,,873,,137,0,,,,,,,,0,23540,2407,,,,,8328,137,23540,2407 +"2020-03-28","CA",101,,23,,,,1034,0,,410,20549,3169,,,,,,4643,,764,0,,,,,,,,0,25192,3933,,,,,,0,25192,3933 +"2020-03-28","CO",44,,13,,274,274,332,35,,,11215,1273,,,,,,2061,,327,0,,,,,,,14191,1687,14191,1687,,,,,13276,1600,,0 +"2020-03-28","CT",33,10,6,,,,205,0,,,,0,,,14184,,,1524,,233,0,,,,,4642,,,0,18834,2223,,,,,,0,18834,2223 +"2020-03-28","DC",4,,1,,,,,0,,,,0,,,,,,304,,37,0,,,,,,51,2515,351,2515,351,,,,,,0,,0 +"2020-03-28","DE",9,9,4,0,,,31,0,,,36,0,,,,,,214,,51,0,,,,,145,9,3993,431,3993,431,,,,,,0,,0 +"2020-03-28","FL",54,,20,,526,526,,70,,,35366,7180,,,,,,3179,,659,0,,,,,,,34607,6244,34607,6244,,,,,,0,,0 +"2020-03-28","GA",69,,5,,617,617,,51,,,,0,,,,,,2366,,365,0,,,,,2383,,,0,14080,3059,,,,,,0,14080,3059 +"2020-03-28","GU",1,,0,,,,15,0,,,299,0,,,,,,55,,4,0,,,,,,7,,0,354,4,,,,,,0,,0 +"2020-03-28","HI",,,0,,8,8,,1,,,4357,0,,,,,,120,,14,0,,,,,118,,5797,729,5797,729,,,,,,0,,0 +"2020-03-28","IA",3,,0,,61,61,46,11,,,4375,635,,,,,,298,298,63,0,,,,,,15,,0,4673,698,,,,,,0,,0 +"2020-03-28","ID",4,,1,,25,25,37,25,,,3342,674,,,,,,230,,41,0,,,,,,,,0,3572,715,,,,,3572,715,,0 +"2020-03-28","IL",47,,13,,,,,0,,,,0,,,,,,3491,,465,0,,,,,,,,0,25429,3887,,,,,,0,25429,3887 +"2020-03-28","IN",31,,7,,,,,0,,,7175,1220,,,,,,1232,,251,0,,,,,2545,,,0,19139,2350,,,,,,0,19139,2350 +"2020-03-28","KS",5,,1,,27,27,,0,,,3671,442,,,,,,261,,59,0,,,,,,,,0,3932,501,,,,,,0,,0 +"2020-03-28","KY",8,,2,,,,,0,,,,0,,,,,,302,,54,0,,,,,,,,0,5123,1107,,,,,,0,5123,1107 +"2020-03-28","LA",137,,18,,,,927,0,,,21846,3233,,,,,336,3315,3315,569,0,,,,,,,,0,25161,3802,,,,,,0,,0 +"2020-03-28","MA",72,,15,,350,350,,131,,,30915,4671,,,,,,4158,,1007,0,,,,,7224,,,0,50010,3202,,,,,,0,50010,3202 +"2020-03-28","MD",17,17,7,,226,226,,53,,,11516,11422,,,,,,992,992,218,0,,,,,1117,,,0,10311,3075,,,,,,0,10311,3075 +"2020-03-28","ME",1,,0,,,,,0,,,,0,,,,,,211,211,43,0,,,,,275,36,,0,6081,938,,,,,,0,6081,938 +"2020-03-28","MI",283,326,71,19,,,,0,,,,0,,,15902,,,14865,14625,1066,0,,,,,6018,,,0,21920,2787,,,,,,0,21920,2787 +"2020-03-28","MN",5,,1,,57,57,30,6,17,,17395,3790,,,,,,687,687,47,0,,,,,,215,18082,3837,18082,3837,,,,,,0,,0 +"2020-03-28","MO",10,,2,,,,,0,,,10082,9713,,,13471,,,838,838,169,0,,,,,1406,,,0,14889,2410,,,,,,0,14889,2410 +"2020-03-28","MP",,,0,,,,,0,,,,0,,,,,,2,,2,0,,,,,,,,0,2,2,,,,,,0,,0 +"2020-03-28","MS",13,,5,,219,219,,34,,,2560,0,,,,,,663,,84,0,,,,,,,,0,3223,84,,,,,,0,,0 +"2020-03-28","MT",1,,1,,7,7,,0,,,,0,,,,,,129,,21,0,,,,,,,,0,3417,239,,,,,,0,3417,239 +"2020-03-28","NC",4,,1,,,,87,0,,,,0,,,,,,935,,172,0,,,,,,,,0,18254,2667,,,,,,0,18254,2667 +"2020-03-28","ND",1,,1,,16,16,,3,,,2809,382,,,,,,80,80,19,0,,,,,,16,3052,503,3052,503,,,,,2957,475,3072,504 +"2020-03-28","NE",2,,2,,,,,0,,,1904,143,,,1802,,,96,,11,0,,,,,78,,,0,1920,189,,,,,2006,103,1920,189 +"2020-03-28","NH",2,,1,,30,30,,5,,,3656,261,,,,,,187,,29,0,,,,,,,,0,5000,662,,,,,,0,5000,662 +"2020-03-28","NJ",191,140,51,51,,,2000,0,,,19386,2839,,,,,,11124,11124,2299,0,,,,,,,,0,30510,5138,,,,,30510,5138,,0 +"2020-03-28","NM",2,,1,,,,19,0,,,10769,1573,,,,,,191,,55,0,,,,,,2,,0,9387,874,,,,,,0,9387,874 +"2020-03-28","NV",25,,4,,,,,0,,,7901,1740,,,,,,621,621,86,0,,,,,,,12561,1196,12561,1196,,,,,,0,9973,1845 +"2020-03-28","NY",728,,209,,10454,10454,7328,1722,,1755,,0,,,,,,52318,,7681,0,,,,,,,156069,17444,156069,17444,,,,,,0,,0 +"2020-03-28","OH",25,,6,,344,344,,68,123,,,0,,,,,,1406,1406,269,0,,,,,1162,,,0,20115,3027,,,,,,0,20115,3027 +"2020-03-28","OK",15,,7,,126,126,,21,,,1180,96,,,,,,377,,55,0,,,,,,,,0,1557,151,,,,,,0,,0 +"2020-03-28","OR",12,,1,,102,102,91,12,,,8510,1557,,,,,31,414,,87,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-28","PA",34,,12,,316,316,,75,,,25254,4238,,,,,,2751,,533,0,,,,,,,28683,4931,28683,4931,,,,,28005,4771,,0 +"2020-03-28","PR",3,,0,,,,,0,,,739,220,,,,,,100,,21,0,,,,,,,,0,839,241,,,,,,0,,0 +"2020-03-28","RI",,,0,,,,29,0,,9,2742,240,,,2871,,6,312,,64,0,,,,,316,,2844,241,2844,241,,,,,3054,304,3187,319 +"2020-03-28","SC",13,,4,,102,102,,0,,,2408,101,,,,,,539,539,83,0,,,,,,,,0,2947,184,,,,,,0,,0 +"2020-03-28","SD",1,,0,,,,,0,,,2592,205,,,,,,68,,10,0,,,,,511,26,,0,2594,446,,,,,2660,215,2594,446 +"2020-03-28","TN",6,,0,,118,118,,15,,,,0,,,16965,,,1373,,170,0,,,,,1373,,,0,18338,2247,,,,,,0,18338,2247 +"2020-03-28","TX",27,,4,,,,,0,,,,0,,,,,,2048,2048,317,0,,,,,6498,,,0,64146,8295,,,,,,0,64146,8295 +"2020-03-28","UT",2,,0,,,,,0,,,14481,2729,,,14655,,,602,,122,0,,,,,786,,,0,15441,2896,,,,,15232,2862,15441,2896 +"2020-03-28","VA",17,,3,,83,83,,18,,,,0,,,,,,739,,135,0,,1,,,3214,,16724,1946,16724,1946,,18,,,,0,,0 +"2020-03-28","VI",,,0,,,,,0,,,106,51,,,,,,22,,3,0,,,,,,,,0,128,54,,,,,,0,,0 +"2020-03-28","VT",12,,2,,18,18,,0,,,3106,320,,,,,,213,213,28,0,,,,,,,,0,3608,360,,,,,3319,348,3608,360 +"2020-03-28","WA",220,,21,,,,,0,,,,0,,,,,,4967,4967,435,0,,,,,,,76094,2797,76094,2797,,,,,73704,2601,,0 +"2020-03-28","WI",13,,0,,,,,0,,,15232,2092,,,,,,1134,989,165,0,,,,,,,16392,1703,16392,1703,,,,,,0,,0 +"2020-03-28","WV",0,,0,,1,1,,0,,,,0,,,,,,96,96,20,0,,,,,,,,0,2219,561,,,,,,0,2219,561 +"2020-03-28","WY",0,,0,,14,14,,3,,,1475,264,,,2193,,,82,84,12,0,,,,,113,18,,0,2306,102,,,,,,0,2306,102 +"2020-03-27","AK",1,,0,,6,6,,2,,,,0,,,,,,74,,11,0,,,,,,,,0,2388,528,,,,,,0,2388,528 +"2020-03-27","AL",3,,2,,,,112,0,,,4184,591,,,,,,587,587,81,0,,,,,,,,0,4771,672,,,,,4771,672,,0 +"2020-03-27","AR",3,,0,,,,48,0,,,1545,41,,,,,17,381,381,46,0,,,,,,19,,0,1926,87,,,,,,0,1926,87 +"2020-03-27","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-27","AZ",13,,5,,343,343,,40,,,7455,7108,,,,,,736,,159,0,,,,,,,,0,21133,2426,,,,,8191,7267,21133,2426 +"2020-03-27","CA",78,,13,,,,746,0,,200,17380,0,,,,,,3879,,873,0,,,,,,,,0,21259,873,,,,,,0,21259,873 +"2020-03-27","CO",31,,7,,239,239,307,55,,,9942,1250,,,,,,1734,,304,0,,,,,,,12504,1593,12504,1593,,,,,11676,1554,,0 +"2020-03-27","CT",27,5,6,,,,173,0,,,,0,,,12635,,,1291,,279,0,,,,,3971,,,0,16611,2262,,,,,,0,16611,2262 +"2020-03-27","DC",3,,0,,,,,0,,,,0,,,,,,267,,36,0,,,,,,49,2164,307,2164,307,,,,,,0,,0 +"2020-03-27","DE",5,5,2,0,,,15,0,,,36,0,,,,,,163,,33,0,,,,,101,9,3562,414,3562,414,,,,,,0,,0 +"2020-03-27","FL",34,,6,,456,456,,50,,,28186,4445,,,,,,2520,,535,0,,,,,,,28363,5626,28363,5626,,,,,,0,,0 +"2020-03-27","GA",64,,16,,566,566,,93,,,,0,,,,,,2001,,476,0,,,,,1789,,,0,11021,1059,,,,,,0,11021,1059 +"2020-03-27","GU",1,,0,,,,13,0,,,299,36,,,,,,51,,6,0,,,,,,,,0,350,42,,,,,,0,,0 +"2020-03-27","HI",,,0,,7,7,,2,,,4357,0,,,,,,106,,11,0,,,,,104,,5068,514,5068,514,,,,,,0,,0 +"2020-03-27","IA",3,,2,,50,50,32,4,,,3740,1162,,,,,,235,235,56,0,,,,,,18,,0,3975,1218,,,,,,0,,0 +"2020-03-27","ID",3,,3,,,,31,0,,,2668,603,,,,,,189,,66,0,,,,,,,,0,2857,669,,,,,2857,669,,0 +"2020-03-27","IL",34,,8,,,,,0,,,,0,,,,,,3026,,488,0,,,,,,,,0,21542,4911,,,,,,0,21542,4911 +"2020-03-27","IN",24,,7,,,,,0,,,5955,1949,,,,,,981,,336,0,,,,,2163,,,0,16789,2740,,,,,,0,16789,2740 +"2020-03-27","KS",4,,1,,27,27,,27,,,3229,360,,,,,,202,,34,0,,,,,,,,0,3431,394,,,,,,0,,0 +"2020-03-27","KY",6,,2,,,,,0,,,,0,,,,,,248,,50,0,,,,,,,,0,4016,716,,,,,,0,4016,716 +"2020-03-27","LA",119,,36,,,,773,0,,,18613,2889,,,,,270,2746,2746,441,0,,,,,,,,0,21359,3330,,,,,,0,,0 +"2020-03-27","MA",57,,15,,219,219,,0,,,26244,4917,,,,,,3151,,833,0,,,,,6520,,,0,46808,4815,,,,,,0,46808,4815 +"2020-03-27","MD",10,10,3,,173,173,,41,,,94,0,,,,,,774,774,194,0,,,,,769,25,,0,7236,1820,,,,,,0,7236,1820 +"2020-03-27","ME",1,,1,,,,,0,,,,0,,,,,,168,168,13,0,,,,,228,24,,0,5143,696,,,,,,0,5143,696 +"2020-03-27","MI",212,264,53,15,,,,0,,,,0,,,14140,,,13799,13585,1324,0,,,,,4993,,,0,19133,3536,,,,,,0,19133,3536 +"2020-03-27","MN",4,,2,,51,51,34,10,17,,13605,1001,,,,,,640,640,75,0,,,,,,176,14245,1076,14245,1076,,,,,,0,,0 +"2020-03-27","MO",8,,0,,,,,0,,,369,0,,,11324,,,669,669,167,0,,,,,1144,,,0,12479,2435,,,,,,0,12479,2435 +"2020-03-27","MP",0,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-27","MS",8,,2,,185,185,,35,,,2560,269,,,,,,579,,94,0,,,,,,,,0,3139,363,,,,,,0,,0 +"2020-03-27","MT",,,0,,7,7,,6,,,,0,,,,,,108,,37,0,,,,,,,,0,3178,985,,,,,,0,3178,985 +"2020-03-27","NC",3,,1,,,,77,0,,,,0,,,,,,763,,127,0,,,,,,,,0,15587,2793,,,,,,0,15587,2793 +"2020-03-27","ND",0,,0,,13,13,,3,,,2427,388,,,,,,61,61,9,0,,,,,,15,2549,462,2549,462,,,,,2482,446,2568,463 +"2020-03-27","NE",0,,0,,,,,0,,,1761,177,,,1631,,,85,,12,0,,,,,61,,,0,1731,199,,,,,1903,1903,1731,199 +"2020-03-27","NH",1,,0,,25,25,,6,,,3395,394,,,,,,158,,21,0,,,,,,,,0,4338,777,,,,,,0,4338,777 +"2020-03-27","NJ",140,108,32,32,,,2000,0,,,16547,2886,,,,,,8825,8825,1949,0,,,,,,,,0,25372,4835,,,,,25372,4835,,0 +"2020-03-27","NM",1,,0,,,,17,0,,,9196,819,,,,,,136,,24,0,,,,,,,,0,8513,720,,,,,,0,8513,720 +"2020-03-27","NV",21,,4,,,,,0,,,6161,1464,,,,,,535,535,115,0,,,,,,,11365,1190,11365,1190,,,,,,0,8128,1984 +"2020-03-27","NY",519,,134,,8732,8732,6481,1811,,1583,,0,,,,,,44637,,7379,0,,,,,,,138625,16315,138625,16315,,,,,,0,,0 +"2020-03-27","OH",19,,4,,276,276,,53,107,,,0,,,,,,1137,1137,270,0,,,,,898,,,0,17088,1989,,,,,,0,17088,1989 +"2020-03-27","OK",8,,1,,105,105,,19,,,1084,126,,,,,,322,,74,0,,,,,,,,0,1406,200,,,,,,0,,0 +"2020-03-27","OR",11,,3,,90,90,,29,,,6953,2603,,,,,,327,,118,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-27","PA",22,,6,,241,241,,241,,,21016,4575,,,,,,2218,,531,0,,,,,,,23752,5125,23752,5125,,,,,23234,5106,,0 +"2020-03-27","PR",3,,1,,,,,0,,,519,142,,,,,,79,,15,0,,,,,,,,0,598,157,,,,,,0,,0 +"2020-03-27","RI",,,0,,,,28,0,,9,2502,202,,,2611,,6,248,,31,0,,,,,257,,2603,216,2603,216,,,,,2750,233,2868,242 +"2020-03-27","SC",9,,0,,102,102,,0,,,2307,0,,,,,,456,456,0,0,,,,,,,,0,2763,0,,,,,,0,,0 +"2020-03-27","SD",1,,0,,,,,0,,,2387,414,,,,,,58,,12,0,,,,,65,21,,0,2148,397,,,,,2445,426,2148,397 +"2020-03-27","TN",6,,3,,103,103,,27,,,,0,,,14888,,,1203,,246,0,,,,,1203,,,0,16091,1182,,,,,,0,16091,1182 +"2020-03-27","TX",23,,5,,,,,0,,,,0,,,,,,1731,1731,337,0,,,,,5586,,,0,55851,7205,,,,,,0,55851,7205 +"2020-03-27","UT",2,,1,,,,,0,,,11752,2582,,,11895,,,480,,78,0,,,,,650,,,0,12545,2721,,,,,12370,2692,12545,2721 +"2020-03-27","VA",14,,1,,65,65,,6,,,,0,,,,,,604,,144,0,,1,,,2967,,14778,1404,14778,1404,,18,,,,0,,0 +"2020-03-27","VI",,,0,,,,,0,,,55,0,,,,,,19,,2,0,,,,,,,,0,74,2,,,,,,0,,0 +"2020-03-27","VT",10,,1,,18,18,,18,,,2786,170,,,,,,185,185,25,0,,,,,,,,0,3248,197,,,,,2971,195,3248,197 +"2020-03-27","WA",199,,16,,,,,0,,,,0,,,,,,4532,4532,441,0,,,,,,,73297,4617,73297,4617,,,,,71103,4360,,0 +"2020-03-27","WI",13,,5,,,,,0,,,13140,1557,,,,,,969,842,163,0,,,,,,,14689,1812,14689,1812,,,,,,0,,0 +"2020-03-27","WV",0,,0,,1,1,,0,,,,0,,,,,,76,76,25,0,,,,,,,,0,1658,526,,,,,,0,1658,526 +"2020-03-27","WY",0,,0,,11,11,,11,,,1211,159,,,2093,,,70,73,17,0,,,,,111,17,,0,2204,227,,,,,,0,2204,227 +"2020-03-26","AK",1,,0,,4,4,,1,,,,0,,,,,,63,,14,0,,,,,,,,0,1860,169,,,,,,0,1860,169 +"2020-03-26","AL",1,,1,,,,106,0,,,3593,1064,,,,,,506,506,223,0,,,,,,,,0,4099,1287,,,,,4099,1287,,0 +"2020-03-26","AR",3,,1,,,,41,0,,,1504,67,,,,,13,335,335,55,0,,,,,,13,,0,1839,122,,,,,,0,1839,122 +"2020-03-26","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-26","AZ",8,,2,,303,303,,39,,,347,24,,,,,,577,,127,0,,,,,,,,0,18707,2729,,,,,924,151,18707,2729 +"2020-03-26","CA",65,,12,,,,,0,,,17380,1459,,,,,,3006,,651,0,,,,,,,,0,20386,2110,,,,,,0,20386,2110 +"2020-03-26","CO",24,,5,,184,184,278,36,,,8692,1714,,,,,,1430,,344,0,,,,,,,10911,1833,10911,1833,,,,,10122,2058,,0 +"2020-03-26","CT",21,4,2,,,,125,0,,,,0,,,11074,,,1012,,137,0,,,,,3270,,,0,14349,1956,,,,,,0,14349,1956 +"2020-03-26","DC",3,,1,,,,,0,,,,0,,,,,,231,,48,0,,,,,,21,1857,251,1857,251,,,,,,0,,0 +"2020-03-26","DE",3,3,1,0,,,13,0,,,36,0,,,,,,130,,15,0,,,,,94,4,3148,419,3148,419,,,,,,0,,0 +"2020-03-26","FL",28,,6,,406,406,,90,,,23741,8367,,,,,,1985,,497,0,,,,,,,22737,6902,22737,6902,,,,,,0,,0 +"2020-03-26","GA",48,,8,,473,473,,79,,,,0,,,,,,1525,,278,0,,,,,1557,,,0,9962,655,,,,,,0,9962,655 +"2020-03-26","GU",1,,0,,,,11,0,,,263,30,,,,,,45,,8,0,,,,,,,,0,308,38,,,,,,0,,0 +"2020-03-26","HI",,,0,,5,5,,-1,,,4357,0,,,,,,95,,5,0,,,,,92,,4554,337,4554,337,,,,,,0,,0 +"2020-03-26","IA",1,,0,,46,46,31,10,,,2578,0,,,,,,179,179,34,0,,,,,,15,,0,2757,34,,,,,,0,,0 +"2020-03-26","ID",0,,0,,,,34,0,,,2065,178,,,,,,123,,50,0,,,,,,,,0,2188,228,,,,,2188,228,,0 +"2020-03-26","IL",26,,7,,,,,0,,,,0,,,,,,2538,,673,0,,,,,,,,0,16631,2422,,,,,,0,16631,2422 +"2020-03-26","IN",17,,3,,,,,-1,,,4006,1127,,,,,,645,,168,0,,,,,1824,,,0,14049,2457,,,,,,0,14049,2457 +"2020-03-26","KS",3,,0,,,,,0,,,2869,509,,,,,,168,,42,0,,,,,,,,0,3037,551,,,,,,0,,0 +"2020-03-26","KY",4,,0,,,,,0,,,,0,,,,,,198,,41,0,,,,,,,,0,3300,278,,,,,,0,3300,278 +"2020-03-26","LA",83,,18,,,,676,0,,,15724,6068,,,,,239,2305,2305,510,0,,,,,,,,0,18029,6578,,,,,,0,,0 +"2020-03-26","MA",42,,9,,219,219,,116,,,21327,3248,,,,,,2318,,579,0,,,,,5513,,,0,41993,4836,,,,,,0,41993,4836 +"2020-03-26","MD",7,7,2,,132,132,,132,,,94,0,,,,,,580,580,157,0,,,,,563,,,0,5416,3341,,,,,,0,5416,3341 +"2020-03-26","ME",,,0,,,,,0,,,,0,,,,,,155,155,6,0,,,,,195,16,,0,4447,484,,,,,,0,4447,484 +"2020-03-26","MI",159,197,48,10,,,,0,,,,0,,,11730,,,12475,12288,1140,0,,,,,3867,,,0,15597,3815,,,,,,0,15597,3815 +"2020-03-26","MN",2,,1,,41,41,31,6,,,12604,1416,,,,,,565,565,63,0,,,,,,,13169,1479,13169,1479,,,,,,0,,0 +"2020-03-26","MO",8,,0,,,,,0,,,369,0,,,9121,,,502,502,146,0,,,,,915,,,0,10044,2064,,,,,,0,10044,2064 +"2020-03-26","MP",0,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-26","MS",6,,4,,150,150,,33,,,2291,725,,,,,,485,,108,0,,,,,,,,0,2776,833,,,,,,0,,0 +"2020-03-26","MT",,,0,,1,1,,1,,,,0,,,,,,71,,18,0,,,,,,,,0,2193,192,,,,,,0,2193,192 +"2020-03-26","NC",2,,1,,,,29,0,,,,0,,,,,,636,,132,0,,,,,,,,0,12794,2446,,,,,,0,12794,2446 +"2020-03-26","ND",0,,0,,10,10,,2,,,2039,305,,,,,,52,52,13,0,,,,,,,2087,344,2087,344,,,,,2036,335,2105,345 +"2020-03-26","NE",0,,0,,,,,0,,,1584,280,,,1440,,,73,,12,0,,,,,57,,,0,1532,123,,,,,,0,1532,123 +"2020-03-26","NH",1,,0,,19,19,,6,,,3001,645,,,,,,137,,29,0,,,,,,,,0,3561,386,,,,,,0,3561,386 +"2020-03-26","NJ",108,81,27,27,,,1080,0,,,13661,3209,,,,,,6876,6876,2474,0,,,,,,,,0,20537,5683,,,,,20537,5683,,0 +"2020-03-26","NM",1,,0,,,,,0,,,8377,696,,,,,,112,,12,0,,,,,,,,0,7793,951,,,,,,0,7793,951 +"2020-03-26","NV",17,,4,,,,,0,,,4697,446,,,,,,420,420,99,0,,,,,,,10175,1058,10175,1058,,,,,,0,6144,594 +"2020-03-26","NY",385,,100,,6921,6921,5327,1795,,1290,,0,,,,,,37258,,6448,0,,,,,,,122310,18651,122310,18651,,,,,,0,,0 +"2020-03-26","OH",15,,5,,223,223,,41,91,,,0,,,,,,867,867,163,0,,,,,753,,,0,15099,1092,,,,,,0,15099,1092 +"2020-03-26","OK",7,,2,,86,86,,27,,,958,153,,,,,,248,,84,0,,,,,,,,0,1206,237,,,,,,0,,0 +"2020-03-26","OR",8,,0,,61,61,,0,,,4350,0,,,,,,209,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-26","PA",16,,5,,,,,0,,,16441,5248,,,,,,1687,,560,0,,,,,,,18627,6035,18627,6035,,,,,18128,5808,,0 +"2020-03-26","PR",2,,0,,,,,0,,,377,60,,,,,,64,,13,0,,,,,,,,0,441,73,,,,,,0,,0 +"2020-03-26","RI",,,0,,,,23,0,,9,2300,176,,,2396,,6,217,,41,0,,,,,230,,2387,208,2387,208,,,,,2517,217,2626,216 +"2020-03-26","SC",9,,2,,102,102,,0,,,2307,4,,,,,,456,456,32,0,,,,,,,,0,2763,36,,,,,,0,,0 +"2020-03-26","SD",1,,0,,,,,0,,,1973,1154,,,,,,46,,5,0,,,,,54,16,,0,1751,289,,,,,2019,1159,1751,289 +"2020-03-26","TN",3,,0,,76,76,,23,,,,0,,,13952,,,957,,173,0,,,,,957,,,0,14909,3113,,,,,,0,14909,3113 +"2020-03-26","TX",18,,6,,,,,0,,,,0,,,,,,1394,1394,419,0,,,,,4726,,,0,48646,6771,,,,,,0,48646,6771 +"2020-03-26","UT",1,,0,,,,,0,,,9170,1661,,,9285,,,402,,56,0,,,,,539,,,0,9824,1792,,,,,9678,1763,9824,1792 +"2020-03-26","VA",13,,4,,59,59,,14,,,,0,,,,,,460,,69,0,,1,,,2777,,13374,1097,13374,1097,,18,,,,0,,0 +"2020-03-26","VI",,,0,,,,,0,,,55,0,,,,,,17,,0,0,,,,,,,,0,72,0,,,,,,0,,0 +"2020-03-26","VT",9,,1,,,,,0,,,2616,985,,,,,,160,160,35,0,,,,,,,,0,3051,907,,,,,2776,1020,3051,907 +"2020-03-26","WA",183,,24,,,,,0,,,,0,,,,,,4091,4091,438,0,,,,,,,68680,4687,68680,4687,,,,,66743,4471,,0 +"2020-03-26","WI",8,,1,,,,,0,,,11583,1494,,,,,,806,707,139,0,,,,,,,12877,1625,12877,1625,,,,,,0,,0 +"2020-03-26","WV",0,,0,,1,1,,0,,,,0,,,,,,51,51,12,0,,,,,,,,0,1132,306,,,,,,0,1132,306 +"2020-03-26","WY",,,0,,,,,0,,,1052,98,,,1887,,,53,53,9,0,,,,,90,12,,0,1977,244,,,,,,0,1977,244 +"2020-03-25","AK",1,,1,,3,3,,1,,,,0,,,,,,49,,7,0,,,,,,,,0,1691,669,,,,,,0,1691,669 +"2020-03-25","AL",0,,0,,,,91,0,,,2529,423,,,,,,283,283,68,0,,,,,,,,0,2812,491,,,,,2812,491,,0 +"2020-03-25","AR",2,,2,,,,22,0,,,1437,490,,,,,4,280,280,62,0,,,,,,11,,0,1717,552,,,,,,0,1717,552 +"2020-03-25","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-25","AZ",6,,1,,264,264,,45,,,323,10,,,,,,450,,93,0,,,,,,,,0,15978,2586,,,,,773,103,15978,2586 +"2020-03-25","CA",53,,13,,,,,0,,,15921,2469,,,,,,2355,,253,0,,,,,,,,0,18276,2722,,,,,,0,18276,2722 +"2020-03-25","CO",19,,8,,148,148,230,64,,,6978,189,,,,,,1086,,174,0,,,,,,,9078,1134,9078,1134,,,,,8064,363,,0 +"2020-03-25","CT",19,3,7,,,,113,0,,,,0,,,9638,,,875,,257,0,,,,,2751,,,0,12393,2048,,,,,,0,12393,2048 +"2020-03-25","DC",2,,0,,,,,0,,,,0,,,,,,183,,46,0,,,,,,,1606,274,1606,274,,,,,,0,,0 +"2020-03-25","DE",2,2,1,0,,,11,0,,,36,0,,,,,,115,,24,0,,,,,82,,2729,363,2729,363,,,,,,0,,0 +"2020-03-25","FL",22,,4,,316,316,,57,,,15374,2247,,,,,,1488,,283,0,,,,,,,15835,2881,15835,2881,,,,,,0,,0 +"2020-03-25","GA",40,,8,,394,394,,394,,,,0,,,,,,1247,,221,0,,,,,1495,,,0,9307,2501,,,,,,0,9307,2501 +"2020-03-25","GU",1,,0,,,,10,0,,,233,32,,,,,,37,,5,0,,,,,,,,0,270,37,,,,,,0,,0 +"2020-03-25","HI",,,0,,6,6,,2,,,4357,768,,,,,,90,,13,0,,,,,84,,4217,553,4217,553,,,,,,0,,0 +"2020-03-25","IA",1,,1,,36,36,23,9,,,2578,263,,,,,,145,145,21,0,,,,,,,,0,2723,284,,,,,,0,,0 +"2020-03-25","ID",0,,0,,,,,0,,,1887,0,,,,,,73,,23,0,,,,,,,,0,1960,23,,,,,1960,23,,0 +"2020-03-25","IL",19,,3,,,,,0,,,,0,,,,,,1865,,330,0,,,,,,,,0,14209,2724,,,,,,0,14209,2724 +"2020-03-25","IN",14,,2,,1,1,,0,,,2879,313,,,,,,477,,112,0,,,,,1505,,,0,11592,1723,,,,,,0,11592,1723 +"2020-03-25","KS",3,,1,,,,,0,,,2360,274,,,,,,126,,28,0,,,,,,,,0,2486,302,,,,,,0,,0 +"2020-03-25","KY",4,,0,,,,,0,,,,0,,,,,,157,,33,0,,,,,,,,0,3022,1136,,,,,,0,3022,1136 +"2020-03-25","LA",65,,19,,,,491,0,,,9656,2441,,,,,163,1795,1795,407,0,,,,,,,,0,11451,2848,,,,,,0,,0 +"2020-03-25","MA",33,,7,,103,103,,9,,,18079,5365,,,,,,1739,,679,0,,,,,4529,,,0,37157,4484,,,,,,0,37157,4484 +"2020-03-25","MD",5,5,0,,,,,0,,,94,0,,,,,,423,423,74,0,,,,,161,,,0,2075,1120,,,,,,0,2075,1120 +"2020-03-25","ME",,,0,,,,,0,,,,0,,,,,,149,149,24,0,,,,,163,7,,0,3963,357,,,,,,0,3963,357 +"2020-03-25","MI",111,149,25,8,,,,0,,,,0,,,8842,,,11335,11163,1180,0,,,,,2940,,,0,11782,2426,,,,,,0,11782,2426 +"2020-03-25","MN",1,,0,,35,35,26,14,,,11188,5638,,,,,,502,502,58,0,,,,,,121,11690,5696,11690,5696,,,,,,0,,0 +"2020-03-25","MO",8,,5,,,,,0,,,369,0,,,7272,,,356,356,173,0,,,,,700,,,0,7980,1815,,,,,,0,7980,1815 +"2020-03-25","MP",0,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-25","MS",2,,1,,117,117,,31,,,1566,14,,,,,,377,,57,0,,,,,,,,0,1943,71,,,,,,0,,0 +"2020-03-25","MT",,,0,,,,,0,,,,0,,,,,,53,,7,0,,,,,,,,0,2001,313,,,,,,0,2001,313 +"2020-03-25","NC",1,,1,,,,29,0,,,,0,,,,,,504,,106,0,,,,,,,,0,10348,529,,,,,,0,10348,529 +"2020-03-25","ND",0,,0,,8,8,,3,,,1734,280,,,,,,39,39,6,0,,,,,,,1743,287,1743,287,,,,,1701,279,1760,286 +"2020-03-25","NE",0,,0,,,,,0,,,1304,329,,,1328,,,61,,9,0,,,,,47,,,0,1409,196,,,,,,0,1409,196 +"2020-03-25","NH",1,,0,,13,13,,2,,,2356,909,,,,,,108,,7,0,,,,,,,,0,3175,458,,,,,,0,3175,458 +"2020-03-25","NJ",81,62,21,19,,,,0,,,10452,2127,,,,,,4402,4402,727,0,,,,,,,,0,14854,2854,,,,,14854,2854,,0 +"2020-03-25","NM",1,,0,,,,,0,,,7681,939,,,,,,100,,17,0,,,,,,,,0,6842,869,,,,,,0,6842,869 +"2020-03-25","NV",13,,0,,,,,0,,,4251,297,,,,,,321,321,43,0,,,,,,,9117,845,9117,845,,,,,,0,5550,1517 +"2020-03-25","NY",285,,75,,5126,5126,4079,1085,,,,0,,,,,,30810,,5145,0,,,,,,,103659,12142,103659,12142,,,,,,0,,0 +"2020-03-25","OH",10,,2,,182,182,,37,74,,,0,,,,,,704,704,140,0,,,,,660,,,0,14007,721,,,,,,0,14007,721 +"2020-03-25","OK",5,,2,,59,59,,34,,,805,70,,,,,,164,,58,0,,,,,,,,0,969,128,,,,,,0,,0 +"2020-03-25","OR",8,,3,,61,61,,5,,,4350,701,,,,,,209,,18,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-25","PA",11,,4,,,,,0,,,11193,2550,,,,,,1127,,276,0,,,,,,,12592,2824,12592,2824,,,,,12320,2826,,0 +"2020-03-25","PR",2,,0,,,,,0,,,317,49,,,,,,51,,12,0,,,,,,,,0,368,61,,,,,,0,,0 +"2020-03-25","RI",,,0,,,,15,0,,,2124,173,,,2215,,,176,,28,0,,,,,195,,2179,263,2179,263,,,,,2300,201,2410,209 +"2020-03-25","SC",7,,2,,102,102,,102,,,2303,291,,,,,,424,424,126,0,,,,,,,,0,2727,417,,,,,,0,,0 +"2020-03-25","SD",1,,0,,,,,0,,,819,29,,,,,,41,,11,0,,,,,45,,,0,1462,235,,,,,860,40,1462,235 +"2020-03-25","TN",3,,1,,53,53,,53,,,,0,,,11012,,,784,,117,0,,,,,784,,,0,11796,652,,,,,,0,11796,652 +"2020-03-25","TX",12,,3,,,,,0,,,,0,,,,,,975,975,263,0,,,,,3990,,,0,41875,6719,,,,,,0,41875,6719 +"2020-03-25","UT",1,,0,,,,,0,,,7509,1212,,,7598,,,346,,47,0,,,,,434,,,0,8032,1304,,,,,7915,1281,8032,1304 +"2020-03-25","VA",9,,2,,45,45,,7,,,,0,,,,,,391,,101,0,,1,,,2630,,12277,1074,12277,1074,,18,,,,0,,0 +"2020-03-25","VI",,,0,,,,,0,,,55,55,,,,,,17,,0,0,,,,,,,,0,72,55,,,,,,0,,0 +"2020-03-25","VT",8,,1,,,,,0,,,1631,226,,,,,,125,125,28,0,,,,,,,,0,2144,266,,,,,1756,254,2144,266 +"2020-03-25","WA",159,,13,,,,,0,,,,0,,,,,,3653,3653,463,0,,,,,,,63993,5248,63993,5248,,,,,62272,5007,,0 +"2020-03-25","WI",7,,2,,,,,0,,,10089,1852,,,,,,667,585,142,0,,,,,,,11252,1646,11252,1646,,,,,,0,,0 +"2020-03-25","WV",0,,0,,1,1,,0,,,,0,,,,,,39,39,19,0,,,,,,,,0,826,309,,,,,,0,826,309 +"2020-03-25","WY",,,0,,,,,0,,,954,244,,,1654,,,44,49,15,0,,,,,79,7,,0,1733,266,,,,,,0,1733,266 +"2020-03-24","AK",0,,0,,2,2,,1,,,,0,,,,,,42,,4,0,,,,,,,,0,1022,54,,,,,,0,1022,54 +"2020-03-24","AL",0,,0,,,,74,0,,,2106,441,,,,,,215,215,48,0,,,,,,,,0,2321,489,,,,,2321,489,,0 +"2020-03-24","AR",0,,0,,,,22,0,,,947,41,,,,,,218,218,44,0,,,,,,,,0,1165,85,,,,,,0,1165,85 +"2020-03-24","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-24","AZ",5,,3,,219,219,,30,,,313,4,,,,,,357,,92,0,,,,,,,,0,13392,2548,,,,,670,96,13392,2548 +"2020-03-24","CA",40,,13,,,,,0,,,13452,885,,,,,,2102,,369,0,,,,,,,,0,15554,1254,,,,,,0,15554,1254 +"2020-03-24","CO",11,,4,,84,84,152,12,,,6789,1285,,,,,,912,,192,0,,,,,,,7944,1231,7944,1231,,,,,7701,1477,,0 +"2020-03-24","CT",12,1,2,,,,71,0,,,,0,,,8084,,,618,,203,0,,,,,2257,,,0,10345,1804,,,,,,0,10345,1804 +"2020-03-24","DC",2,,0,,,,,0,,,,0,,,,,,137,,21,0,,,,,,,1332,103,1332,103,,,,,,0,,0 +"2020-03-24","DE",1,1,1,0,,,,0,,,36,0,,,,,,91,,23,0,,,,,68,,2366,264,2366,264,,,,,,0,,0 +"2020-03-24","FL",18,,4,,259,259,,42,,,13127,2064,,,,,,1205,,176,0,,,,,,,12954,1670,12954,1670,,,,,,0,,0 +"2020-03-24","GA",32,,7,,,,,0,,,,0,,,,,,1026,,254,0,,,,,1092,,,0,6806,847,,,,,,0,6806,847 +"2020-03-24","GU",1,,0,,,,5,0,,,201,40,,,,,,32,,3,0,,,,,,,,0,233,43,,,,,,0,,0 +"2020-03-24","HI",,,0,,4,4,,4,,,3589,634,,,,,,77,,21,0,,,,,69,,3664,606,3664,606,,,,,,0,,0 +"2020-03-24","IA",,,0,,27,27,,27,,,2315,272,,,,,,124,124,19,0,,,,,,,,0,2439,291,,,,,,0,,0 +"2020-03-24","ID",0,,0,,,,,0,,,1887,578,,,,,,50,,3,0,,,,,,,,0,1937,581,,,,,1937,581,,0 +"2020-03-24","IL",16,,4,,,,,0,,,,0,,,,,,1535,,262,0,,,,,,,,0,11485,1617,,,,,,0,11485,1617 +"2020-03-24","IN",12,,5,,1,1,,0,,,2566,865,,,,,,365,,106,0,,,,,1181,,,0,9869,1567,,,,,,0,9869,1567 +"2020-03-24","KS",2,,0,,,,,0,,,2086,1669,,,,,,98,,16,0,,,,,,,,0,2184,1685,,,,,,0,,0 +"2020-03-24","KY",4,,1,,,,,0,,,,0,,,,,,124,,20,0,,,,,,,,0,1886,20,,,,,,0,1886,20 +"2020-03-24","LA",46,,12,,,,271,0,,,7215,2439,,,,,,1388,1388,216,0,,,,,,,,0,8603,2655,,,,,,0,,0 +"2020-03-24","MA",26,,9,,94,94,,15,,,12714,4451,,,,,,1060,,382,0,,,,,3737,,,0,32673,4319,,,,,,0,32673,4319 +"2020-03-24","MD",5,5,1,,,,,0,,,94,0,,,,,,349,349,61,0,,,,,77,,,0,955,955,,,,,,0,955,955 +"2020-03-24","ME",,,0,,,,,0,,,,0,,,,,,125,125,18,0,,,,,147,,,0,3606,347,,,,,,0,3606,347 +"2020-03-24","MI",86,103,29,7,,,,0,,,,0,,,6989,,,10155,10006,1093,0,,,,,2367,,,0,9356,1680,,,,,,0,9356,1680 +"2020-03-24","MN",1,,0,,21,21,,4,,,5550,1039,,,,,,444,444,51,0,,,,,,,5994,1090,5994,1090,,,,,,0,,0 +"2020-03-24","MO",3,,0,,,,,0,,,369,0,,,5639,,,183,183,0,0,,,,,520,,,0,6165,710,,,,,,0,6165,710 +"2020-03-24","MP",0,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-24","MS",1,,0,,86,86,,53,,,1552,409,,,,,,320,,71,0,,,,,,,,0,1872,480,,,,,,0,,0 +"2020-03-24","MT",,,0,,,,,0,,,,0,,,,,,46,,12,0,,,,,,,,0,1688,522,,,,,,0,1688,522 +"2020-03-24","NC",0,,0,,,,,0,,,,0,,,,,,398,,101,0,,,,,,,,0,9819,2163,,,,,,0,9819,2163 +"2020-03-24","ND",0,,0,,5,5,,1,,,1454,101,,,,,,33,33,3,0,,,,,,,1456,112,1456,112,,,,,1422,105,1474,113 +"2020-03-24","NE",0,,0,,,,,0,,,975,619,,,1143,,,52,,2,0,,,,,37,,,0,1213,178,,,,,,0,1213,178 +"2020-03-24","NH",1,,1,,11,11,,11,,,1447,73,,,,,,101,,23,0,,,,,,,,0,2717,224,,,,,,0,2717,224 +"2020-03-24","NJ",60,44,20,16,,,,0,,,8325,7966,,,,,,3675,3675,831,0,,,,,,,,0,12000,8797,,,,,12000,8797,,0 +"2020-03-24","NM",1,,1,,,,,0,,,6742,852,,,,,,83,,18,0,,,,,,,,0,5973,587,,,,,,0,5973,587 +"2020-03-24","NV",13,,5,,,,,0,,,3954,464,,,,,,278,278,88,0,,,,,,,8272,722,8272,722,,,,,,0,4033,1124 +"2020-03-24","NY",210,,96,,4041,4041,3343,916,,,,0,,,,,,25665,,4790,0,,,,,,,91517,12952,91517,12952,,,,,,0,,0 +"2020-03-24","OH",8,,2,,145,145,,41,,,,0,,,,,,564,564,122,0,,,,,608,,,0,13286,1741,,,,,,0,13286,1741 +"2020-03-24","OK",3,,1,,25,25,,10,,,735,41,,,,,,106,,25,0,,,,,,,,0,841,66,,,,,,0,,0 +"2020-03-24","OR",5,,1,,56,56,,13,,,3649,785,,,,,,191,,30,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-24","PA",7,,1,,,,,0,,,8643,2048,,,,,,851,,207,0,,,,,,,9768,2325,9768,2325,,,,,9494,2255,,0 +"2020-03-24","PR",2,,0,,,,,0,,,268,79,,,,,,39,,8,0,,,,,,,,0,307,87,,,,,,0,,0 +"2020-03-24","RI",,,0,,,,,0,,,1951,238,,,2032,,,148,,19,0,,,,,169,,1916,183,1916,183,,,,,2099,257,2201,263 +"2020-03-24","SC",5,,0,,,,,0,,,2012,546,,,,,,298,298,0,0,,,,,,,,0,2310,546,,,,,,0,,0 +"2020-03-24","SD",1,,0,,,,,0,,,790,28,,,,,,30,,2,0,,,,,32,,,0,1227,313,,,,,820,30,1227,313 +"2020-03-24","TN",2,,0,,,,,0,,,,0,,,10477,,,667,,52,0,,,,,667,,,0,11144,11144,,,,,,0,11144,11144 +"2020-03-24","TX",9,,1,,,,,0,,,,0,,,,,,712,712,425,0,,,,,3226,,,0,35156,6077,,,,,,0,35156,6077 +"2020-03-24","UT",1,,0,,,,,0,,,6297,733,,,6363,,,299,,42,0,,,,,365,,,0,6728,807,,,,,6634,791,6728,807 +"2020-03-24","VA",7,,1,,38,38,,6,,,,0,,,,,,290,,36,0,,1,,,2494,,11203,810,11203,810,,18,,,,0,,0 +"2020-03-24","VI",,,0,,,,,0,,,,0,,,,,,17,,0,0,,,,,,,,0,17,0,,,,,,0,,0 +"2020-03-24","VT",7,,2,,,,,0,,,1405,123,,,,,,97,97,21,0,,,,,,,,0,1878,154,,,,,1502,144,1878,154 +"2020-03-24","WA",146,,9,,,,,0,,,,0,,,,,,3190,3190,192,0,,,,,,,58745,5500,58745,5500,,,,,57265,5227,,0 +"2020-03-24","WI",5,,0,,,,,0,,,8237,1187,,,,,,525,457,59,0,,,,,,,9606,1259,9606,1259,,,,,,0,,0 +"2020-03-24","WV",0,,0,,1,1,,0,,,,0,,,,,,20,20,4,0,,,,,,,,0,517,187,,,,,,0,517,187 +"2020-03-24","WY",,,0,,,,,0,,,710,118,,,1403,,,29,30,3,0,,,,,64,,,0,1467,160,,,,,,0,1467,160 +"2020-03-23","AK",0,,0,,1,1,,0,,,,0,,,,,,38,,13,0,,,,,,,,0,968,0,,,,,,0,968,0 +"2020-03-23","AL",0,,0,,,,,0,,,1665,201,,,,,,167,167,29,0,,,,,,,,0,1832,230,,,,,1832,230,,0 +"2020-03-23","AR",0,,0,,,,13,0,,,906,195,,,,,,174,174,9,0,,,,,,,,0,1080,204,,,,,,0,1080,204 +"2020-03-23","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-23","AZ",2,,0,,189,189,,44,,,309,27,,,,,,265,,113,0,,,,,,,,0,10844,724,,,,,574,140,10844,724 +"2020-03-23","CA",27,,0,,,,,0,,,12567,1263,,,,,,1733,,197,0,,,,,,,,0,14300,1460,,,,,,0,14300,1460 +"2020-03-23","CO",7,,1,,72,72,116,14,,,5504,659,,,,,,720,,129,0,,,,,,,6713,924,6713,924,,,,,6224,788,,0 +"2020-03-23","CT",10,,5,,,,54,0,,,,0,,,6768,,,415,,192,0,,,,,1769,,,0,8541,693,,,,,,0,8541,693 +"2020-03-23","DC",2,,1,,,,,0,,,,0,,,,,,116,,18,0,,,,,,,1229,174,1229,174,,,,,,0,,0 +"2020-03-23","DE",0,0,0,0,,,,0,,,36,0,,,,,,68,,12,0,,,,,42,,2102,370,2102,370,,,,,,0,,0 +"2020-03-23","FL",14,,1,,217,217,,32,,,11063,3073,,,,,,1029,,298,0,,,,,,,11284,2797,11284,2797,,,,,,0,,0 +"2020-03-23","GA",25,,2,,,,,0,,,,0,,,,,,772,,172,0,,,,,905,,,0,5959,1197,,,,,,0,5959,1197 +"2020-03-23","GU",1,,0,,,,,0,,,161,35,,,,,,29,,2,0,,,,,,,,0,190,37,,,,,,0,,0 +"2020-03-23","HI",,,0,,,,,0,,,2955,2692,,,,,,56,,8,0,,,,,54,,3058,487,3058,487,,,,,,0,,0 +"2020-03-23","IA",,,0,,,,,0,,,2043,828,,,,,,105,105,15,0,,,,,,,,0,2148,843,,,,,,0,,0 +"2020-03-23","ID",0,,0,,,,,0,,,1309,134,,,,,,47,,5,0,,,,,,,,0,1356,139,,,,,1356,139,,0 +"2020-03-23","IL",12,,3,,,,,0,,,,0,,,,,,1273,,224,0,,,,,,,,0,9868,1494,,,,,,0,9868,1494 +"2020-03-23","IN",7,,1,,1,1,,0,,,1701,408,,,,,,259,,58,0,,,,,906,,,0,8302,1063,,,,,,0,8302,1063 +"2020-03-23","KS",2,,0,,,,,0,,,417,0,,,,,,82,,18,0,,,,,,,,0,499,18,,,,,,0,,0 +"2020-03-23","KY",3,,0,,,,,0,,,,0,,,,,,104,,5,0,,,,,,,,0,1866,295,,,,,,0,1866,295 +"2020-03-23","LA",34,,14,,,,,0,,,4776,2115,,,,,,1172,1172,335,0,,,,,,,,0,5948,2450,,,,,,0,,0 +"2020-03-23","MA",17,,6,,79,79,,8,,,8263,2787,,,,,,678,,131,0,,,,,2999,,,0,28354,4097,,,,,,0,28354,4097 +"2020-03-23","MD",4,4,0,,,,,0,,,94,0,,,,,,288,288,44,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-23","ME",,,0,,,,,0,,,,0,,,,,,107,107,18,0,,,,,130,,,0,3259,297,,,,,,0,3259,297 +"2020-03-23","MI",57,79,21,3,,,,0,,,,0,,,5847,,,9062,8937,1240,0,,,,,1829,,,0,7676,1453,,,,,,0,7676,1453 +"2020-03-23","MN",1,,0,,17,17,,5,,,4511,0,,,,,,393,393,44,0,,,,,,,4904,44,4904,44,,,,,,0,,0 +"2020-03-23","MO",3,,0,,,,,0,,,369,0,,,5008,,,183,183,93,0,,,,,441,,,0,5455,813,,,,,,0,5455,813 +"2020-03-23","MP",0,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-23","MS",1,,0,,33,33,,0,,,1143,29,,,,,,249,,42,0,,,,,,,,0,1392,71,,,,,,0,,0 +"2020-03-23","MT",,,0,,,,,0,,,,0,,,,,,34,,3,0,,,,,,,,0,1166,0,,,,,,0,1166,0 +"2020-03-23","NC",0,,0,,,,,0,,,,0,,,,,,297,,42,0,,,,,,,,0,7656,1389,,,,,,0,7656,1389 +"2020-03-23","ND",0,,0,,4,4,,1,,,1353,93,,,,,,30,30,2,0,,,,,,,1344,98,1344,98,,,,,1317,96,1361,98 +"2020-03-23","NE",0,,0,,,,,0,,,356,0,,,975,,,50,,2,0,,,,,31,,,0,1035,102,,,,,,0,1035,102 +"2020-03-23","NH",,,0,,,,,0,,,1374,186,,,,,,78,,13,0,,,,,,,,0,2493,512,,,,,,0,2493,512 +"2020-03-23","NJ",40,27,11,13,,,,0,,,359,32,,,,,,2844,2844,930,0,,,,,,,,0,3203,962,,,,,3203,962,,0 +"2020-03-23","NM",,,0,,,,,0,,,5890,569,,,,,,65,,8,0,,,,,,,,0,5386,607,,,,,,0,5386,607 +"2020-03-23","NV",8,,1,,,,,0,,,3490,1042,,,,,,190,190,36,0,,,,,,,7550,309,7550,309,,,,,,0,2909,31 +"2020-03-23","NY",114,,0,,3125,3125,2629,771,,,,0,,,,,,20875,,5707,0,,,,,,,78565,16812,78565,16812,,,,,,0,,0 +"2020-03-23","OH",6,,3,,104,104,,21,,,,0,,,,,,442,442,91,0,,,,,478,,,0,11545,1259,,,,,,0,11545,1259 +"2020-03-23","OK",2,,0,,15,15,,4,,,694,25,,,,,,81,,14,0,,,,,,,,0,775,39,,,,,,0,,0 +"2020-03-23","OR",4,,1,,43,43,,43,,,2864,861,,,,,,161,,47,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-23","PA",6,,4,,,,,0,,,6595,1631,,,,,,644,,165,0,,,,,,,7443,1859,7443,1859,,,,,7239,1796,,0 +"2020-03-23","PR",2,,1,,,,,0,,,189,6,,,,,,31,,8,0,,,,,,,,0,220,14,,,,,,0,,0 +"2020-03-23","RI",,,0,,,,,0,,,1713,166,,,1789,,,129,,16,0,,,,,149,,1733,309,1733,309,,,,,1842,182,1938,183 +"2020-03-23","SC",5,,2,,,,,0,,,1466,0,,,,,,298,298,103,0,,,,,,,,0,1764,103,,,,,,0,,0 +"2020-03-23","SD",1,,0,,,,,0,,,762,22,,,,,,28,,7,0,,,,,26,,,0,914,113,,,,,790,29,914,113 +"2020-03-23","TN",2,,2,,,,,0,,,,0,,,,,,615,,110,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-23","TX",8,,3,,,,,0,,,,0,,,,,,287,287,24,0,,,,,2507,,,0,29079,1836,,,,,,0,29079,1836 +"2020-03-23","UT",1,,0,,,,,0,,,5564,1076,,,5617,,,257,,76,0,,,,,304,,,0,5921,1153,,,,,5843,1137,5921,1153 +"2020-03-23","VA",6,,3,,32,32,,7,,,,0,,,,,,254,,35,0,,1,,,2405,,10393,498,10393,498,,18,,,,0,,0 +"2020-03-23","VI",,,0,,,,,0,,,,0,,,,,,17,,11,0,,,,,,,,0,17,11,,,,,,0,,0 +"2020-03-23","VT",5,,3,,,,,0,,,1282,194,,,,,,76,76,24,0,,,,,,,,0,1724,177,,,,,1358,218,1724,177 +"2020-03-23","WA",137,,11,,,,,0,,,,0,,,,,,2998,2998,197,0,,,,,,,53245,5507,53245,5507,,,,,52038,5303,,0 +"2020-03-23","WI",5,,1,,,,,0,,,7050,820,,,,,,466,416,41,0,,,,,,,8347,987,8347,987,,,,,,0,,0 +"2020-03-23","WV",0,,0,,1,1,,0,,,,0,,,,,,16,16,4,0,,,,,,,,0,330,60,,,,,,0,330,60 +"2020-03-23","WY",,,0,,,,,0,,,592,154,,,1259,,,26,28,2,0,,,,,48,,,0,1307,221,,,,,,0,1307,221 +"2020-03-22","AK",0,,0,,1,1,,0,,,,0,,,,,,25,,10,0,,,,,,,,0,968,196,,,,,,0,968,196 +"2020-03-22","AL",0,,0,,,,,0,,,1464,1436,,,,,,138,138,14,0,,,,,,,,0,1602,1450,,,,,1602,1450,,0 +"2020-03-22","AR",0,,0,,,,13,0,,,711,144,,,,,,165,165,47,0,,,,,,,,0,876,191,,,,,,0,876,191 +"2020-03-22","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-22","AZ",2,,1,,145,145,,17,,,282,42,,,,,,152,,48,0,,,,,,,,0,10120,806,,,,,434,90,10120,806 +"2020-03-22","CA",27,,3,,,,,0,,,11304,55,,,,,,1536,,257,0,,,,,,,,0,12840,312,,,,,,0,12840,312 +"2020-03-22","CO",6,,1,,58,58,74,9,,,4845,770,,,,,,591,,116,0,,,,,,,5789,1422,5789,1422,,,,,5436,886,,0 +"2020-03-22","CT",5,,1,,,,43,0,,,,0,,,6243,,,223,,29,0,,,,,1601,,,0,7848,974,,,,,,0,7848,974 +"2020-03-22","DC",1,,0,,,,,0,,,,0,,,,,,98,,21,0,,,,,,,1055,472,1055,472,,,,,,0,,0 +"2020-03-22","DE",0,0,0,0,,,,0,,,36,0,,,,,,56,,11,0,,,,,37,,1732,346,1732,346,,,,,,0,,0 +"2020-03-22","FL",13,,1,,185,185,,27,,,7990,1411,,,,,,731,,203,0,,,,,,,8487,2295,8487,2295,,,,,,0,,0 +"2020-03-22","GA",23,,9,,,,,0,,,,0,,,,,,600,,93,0,,,,,698,,,0,4762,781,,,,,,0,4762,781 +"2020-03-22","GU",1,,1,,,,,0,,,126,18,,,,,,27,,12,0,,,,,,,,0,153,30,,,,,,0,,0 +"2020-03-22","HI",,,0,,,,,0,,,263,139,,,,,,48,,11,0,,,,,47,,2571,762,2571,762,,,,,,0,,0 +"2020-03-22","IA",,,0,,,,,0,,,1215,166,,,,,,90,90,22,0,,,,,,,,0,1305,188,,,,,,0,,0 +"2020-03-22","ID",0,,0,,,,,0,,,1175,295,,,,,,42,,11,0,,,,,,,,0,1217,306,,,,,1217,306,,0 +"2020-03-22","IL",9,,3,,,,,0,,,,0,,,,,,1049,,296,0,,,,,,,,0,8374,2127,,,,,,0,8374,2127 +"2020-03-22","IN",6,,2,,1,1,,0,,,1293,586,,,,,,201,,75,0,,,,,802,,,0,7239,744,,,,,,0,7239,744 +"2020-03-22","KS",2,,0,,,,,0,,,417,0,,,,,,64,,9,0,,,,,,,,0,481,9,,,,,,0,,0 +"2020-03-22","KY",3,,1,,,,,0,,,,0,,,,,,99,,45,0,,,,,,,,0,1571,803,,,,,,0,1571,803 +"2020-03-22","LA",20,,4,,,,,0,,,2661,481,,,,,,837,837,257,0,,,,,,,,0,3498,738,,,,,,0,,0 +"2020-03-22","MA",11,,4,,71,71,,10,,,5476,677,,,,,,547,,121,0,,,,,2367,,,0,24257,2102,,,,,,0,24257,2102 +"2020-03-22","MD",4,4,1,,,,,0,,,94,0,,,,,,244,244,54,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-22","ME",,,0,,,,,0,,,,0,,,,,,89,89,16,0,,,,,115,,,0,2962,397,,,,,,0,2962,397 +"2020-03-22","MI",36,54,13,3,,,,0,,,,0,,,4791,,,7822,7726,799,0,,,,,1432,,,0,6223,1020,,,,,,0,6223,1020 +"2020-03-22","MN",1,,0,,12,12,,12,,,4511,559,,,,,,349,349,22,0,,,,,,,4860,581,4860,581,,,,,,0,,0 +"2020-03-22","MO",3,,0,,,,,0,,,369,0,,,4278,,,90,90,17,0,,,,,358,,,0,4642,1187,,,,,,0,4642,1187 +"2020-03-22","MP",0,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-22","MS",1,,0,,33,33,,33,,,1114,419,,,,,,207,,67,0,,,,,,,,0,1321,486,,,,,,0,,0 +"2020-03-22","MT",,,0,,,,,0,,,,0,,,,,,31,,11,0,,,,,,,,0,1166,0,,,,,,0,1166,0 +"2020-03-22","NC",0,,0,,,,,0,,,,0,,,,,,255,,71,0,,,,,,,,0,6267,2192,,,,,,0,6267,2192 +"2020-03-22","ND",0,,0,,3,3,,0,,,1260,119,,,,,,28,28,0,0,,,,,,,1246,150,1246,150,,,,,1221,146,1263,150 +"2020-03-22","NE",0,,0,,,,,0,,,356,0,,,879,,,48,,10,0,,,,,27,,,0,933,164,,,,,,0,933,164 +"2020-03-22","NH",,,0,,,,,0,,,1188,215,,,,,,65,,10,0,,,,,,,,0,1981,358,,,,,,0,1981,358 +"2020-03-22","NJ",29,20,7,9,,,,0,,,327,33,,,,,,1914,1914,587,0,,,,,,,,0,2241,620,,,,,2241,620,,0 +"2020-03-22","NM",,,0,,,,,0,,,5321,599,,,,,,57,,14,0,,,,,,,,0,4779,965,,,,,,0,4779,965 +"2020-03-22","NV",7,,2,,,,,0,,,2448,64,,,,,,154,154,30,0,,,,,,,7241,488,7241,488,,,,,,0,2878,2878 +"2020-03-22","NY",114,,70,,2354,2354,2043,823,,,,0,,,,,,15168,,4812,0,,,,,,,61753,16029,61753,16029,,,,,,0,,0 +"2020-03-22","OH",3,,0,,83,83,,25,,,,0,,,,,,351,351,104,0,,,,,410,,,0,10286,1278,,,,,,0,10286,1278 +"2020-03-22","OK",2,,1,,11,11,,1,,,669,109,,,,,,67,,14,0,,,,,,,,0,736,123,,,,,,0,,0 +"2020-03-22","OR",3,,0,,,,,0,,,2003,0,,,,,,114,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-22","PA",2,,0,,,,,0,,,4964,1198,,,,,,479,,108,0,,,,,,,5584,1314,5584,1314,,,,,5443,1306,,0 +"2020-03-22","PR",1,,1,,,,,0,,,183,40,,,,,,23,,2,0,,,,,,,,0,206,42,,,,,,0,,0 +"2020-03-22","RI",,,0,,,,,0,,,1547,263,,,1620,,,113,,25,0,,,,,135,,1424,138,1424,138,,,,,1660,288,1755,312 +"2020-03-22","SC",3,,2,,,,,0,,,1466,211,,,,,,195,195,43,0,,,,,,,,0,1661,254,,,,,,0,,0 +"2020-03-22","SD",1,,0,,,,,0,,,740,49,,,,,,21,,7,0,,,,,24,,,0,801,126,,,,,761,56,801,126 +"2020-03-22","TN",,,0,,,,,0,,,,0,,,,,,505,,134,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-22","TX",5,,0,,,,,0,,,,0,,,,,,263,263,28,0,,,,,2233,,,0,27243,2138,,,,,,0,27243,2138 +"2020-03-22","UT",1,,1,,,,,0,,,4488,582,,,4529,,,181,,45,0,,,,,239,,,0,4768,622,,,,,4706,613,4768,622 +"2020-03-22","VA",3,,1,,25,25,,5,,,,0,,,,,,219,,67,0,,1,,,2375,,9895,907,9895,907,,18,,,,0,,0 +"2020-03-22","VI",,,0,,,,,0,,,,0,,,,,,6,,0,0,,,,,,,,0,6,0,,,,,,0,,0 +"2020-03-22","VT",2,,0,,,,,0,,,1088,145,,,,,,52,52,8,0,,,,,,,,0,1547,90,,,,,1140,153,1547,90 +"2020-03-22","WA",126,,15,,,,,0,,,,0,,,,,,2801,2801,304,0,,,,,,,47738,2032,47738,2032,,,,,46735,1888,,0 +"2020-03-22","WI",4,,0,,,,,0,,,6230,1602,,,,,,425,385,110,0,,,,,,,7360,1310,7360,1310,,,,,,0,,0 +"2020-03-22","WV",0,,0,,1,1,,0,,,,0,,,,,,12,12,1,0,,,,,,,,0,270,38,,,,,,0,270,38 +"2020-03-22","WY",,,0,,,,,0,,,438,0,,,1049,,,24,26,1,0,,,,,37,,,0,1086,66,,,,,,0,1086,66 +"2020-03-21","AK",0,,0,,1,1,,0,,,,0,,,,,,15,,1,0,,,,,,,,0,772,74,,,,,,0,772,74 +"2020-03-21","AL",0,,0,,,,,0,,,28,0,,,,,,124,124,43,0,,,,,,,,0,152,43,,,,,152,43,,0 +"2020-03-21","AR",,,0,,,,,0,,,567,216,,,,,,118,118,22,0,,,,,,,,0,685,238,,,,,,0,685,238 +"2020-03-21","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-21","AZ",1,,1,,128,128,,20,,,240,29,,,,,,104,,39,0,,,,,,,,0,9314,1919,,,,,344,68,9314,1919 +"2020-03-21","CA",24,,4,,,,,0,,,11249,825,,,,,,1279,,216,0,,,,,,,,0,12528,1041,,,,,,0,12528,1041 +"2020-03-21","CO",5,,1,,49,49,56,5,,,4075,758,,,,,,475,,112,0,,,,,,,4367,832,4367,832,,,,,4550,870,,0 +"2020-03-21","CT",4,,1,,,,,0,,,,0,,,5535,,,194,,0,0,,,,,1335,,,0,6874,1685,,,,,,0,6874,1685 +"2020-03-21","DC",1,,0,,,,,0,,,,0,,,,,,77,,6,0,,,,,,,583,11,583,11,,,,,,0,,0 +"2020-03-21","DE",0,0,0,0,,,,0,,,36,0,,,,,,45,,7,0,,,,,26,,1386,185,1386,185,,,,,,0,,0 +"2020-03-21","FL",12,,2,,158,158,,158,,,6579,4709,,,,,,528,,142,0,,,,,,,6192,1419,6192,1419,,,,,,0,,0 +"2020-03-21","GA",14,,1,,,,,0,,,,0,,,,,,507,,87,0,,,,,582,,,0,3981,866,,,,,,0,3981,866 +"2020-03-21","GU",,,0,,,,,0,,,108,22,,,,,,15,,1,0,,,,,,,,0,123,23,,,,,,0,,0 +"2020-03-21","HI",,,0,,,,,0,,,124,0,,,,,,37,,11,0,,,,,37,,1809,652,1809,652,,,,,,0,,0 +"2020-03-21","IA",,,0,,,,,0,,,1049,407,,,,,,68,68,23,0,,,,,,,,0,1117,430,,,,,,0,,0 +"2020-03-21","ID",,,0,,,,,0,,,880,290,,,,,,31,,8,0,,,,,,,,0,911,298,,,,,911,298,,0 +"2020-03-21","IL",6,,1,,,,,0,,,,0,,,,,,753,,168,0,,,,,,,,0,6247,1961,,,,,,0,6247,1961 +"2020-03-21","IN",4,,2,,1,1,,1,,,707,232,,,,,,126,,47,0,,,,,680,,,0,6495,1823,,,,,,0,6495,1823 +"2020-03-21","KS",2,,1,,,,,0,,,417,0,,,,,,55,,11,0,,,,,,,,0,472,11,,,,,,0,,0 +"2020-03-21","KY",2,,1,,,,,0,,,,0,,,,,,54,,7,0,,,,,,,,0,768,129,,,,,,0,768,129 +"2020-03-21","LA",16,,4,,,,,0,,,2180,1612,,,,,,580,580,107,0,,,,,,,,0,2760,1719,,,,,,0,,0 +"2020-03-21","MA",7,,2,,61,61,,61,,,4799,1004,,,,,,426,,112,0,,,,,2069,,,0,22155,2771,,,,,,0,22155,2771 +"2020-03-21","MD",3,3,0,,,,,0,,,94,0,,,,,,190,190,41,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-21","ME",,,0,,,,,0,,,,0,,,,,,73,73,16,0,,,,,87,,,0,2565,355,,,,,,0,2565,355 +"2020-03-21","MI",23,33,10,3,,,,0,,,,0,,,4086,,,7023,6938,804,0,,,,,1117,,,0,5203,1358,,,,,,0,5203,1358 +"2020-03-21","MN",1,,1,,,,,0,,,3952,211,,,,,,327,327,24,0,,,,,,,4279,235,4279,235,,,,,,0,,0 +"2020-03-21","MO",3,,2,,,,,0,,,369,0,,,3201,,,73,73,26,0,,,,,250,,,0,3455,1128,,,,,,0,3455,1128 +"2020-03-21","MP",0,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-21","MS",1,,0,,,,,0,,,695,0,,,,,,140,,60,0,,,,,,,,0,835,60,,,,,,0,,0 +"2020-03-21","MT",,,0,,,,,0,,,,-931,,,,,,20,,4,0,,,,,,,,0,1166,219,,,,,,0,1166,219 +"2020-03-21","NC",0,,0,,,,,0,,,,0,,,,,,184,,47,0,,,,,,,,0,4075,943,,,,,,0,4075,943 +"2020-03-21","ND",0,,0,,3,3,,3,,,1141,341,,,,,,28,28,8,0,,,,,,,1096,332,1096,332,,,,,1075,327,1113,335 +"2020-03-21","NE",0,,0,,,,,0,,,356,116,,,728,,,38,,6,0,,,,,21,,,0,769,85,,,,,,0,769,85 +"2020-03-21","NH",,,0,,,,,0,,,973,228,,,,,,55,,11,0,,,,,,,,0,1623,311,,,,,,0,1623,311 +"2020-03-21","NJ",22,16,6,6,,,,0,,,294,30,,,,,,1327,1327,437,0,,,,,,,,0,1621,467,,,,,1621,467,,0 +"2020-03-21","NM",,,0,,,,,0,,,4722,951,,,,,,43,,8,0,,,,,,,,0,3814,1017,,,,,,0,3814,1017 +"2020-03-21","NV",5,,2,,,,,0,,,2384,392,,,,,,124,124,15,0,,,,,,,6753,888,6753,888,,,,,,0,,0 +"2020-03-21","NY",44,,9,,1531,1531,1436,1531,,,,0,,,,,,10356,,3254,0,,,,,,,45724,13087,45724,13087,,,,,,0,,0 +"2020-03-21","OH",3,,2,,58,58,,58,,,,0,,,,,,247,247,78,0,,,,,354,,,0,9008,1228,,,,,,0,9008,1228 +"2020-03-21","OK",1,,0,,10,10,,10,,,560,22,,,,,,53,,4,0,,,,,,,,0,613,26,,,,,,0,,0 +"2020-03-21","OR",3,,0,,,,,0,,,2003,674,,,,,,114,,26,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-21","PA",2,,1,,,,,0,,,3766,1192,,,,,,371,,103,0,,,,,,,4270,1385,4270,1385,,,,,4137,1295,,0 +"2020-03-21","PR",,,0,,,,,0,,,143,29,,,,,,21,,7,0,,,,,,,,0,164,36,,,,,,0,,0 +"2020-03-21","RI",,,0,,,,,0,,,1284,123,,,1338,,,88,,14,0,,,,,105,,1286,211,1286,211,,,,,1372,137,1443,147 +"2020-03-21","SC",1,,0,,,,,0,,,1255,422,,,,,,152,152,71,0,,,,,,,,0,1407,493,,,,,,0,,0 +"2020-03-21","SD",1,,0,,,,,0,,,691,28,,,,,,14,,0,0,,,,,24,,,0,675,67,,,,,705,28,675,67 +"2020-03-21","TN",,,0,,,,,0,,,,0,,,,,,371,,143,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-21","TX",5,,0,,,,,0,,,,0,,,,,,235,235,60,0,,,,,1934,,,0,25105,4683,,,,,,0,25105,4683 +"2020-03-21","UT",0,,0,,,,,0,,,3906,590,,,3941,,,136,,24,0,,,,,205,,,0,4146,628,,,,,4093,618,4146,628 +"2020-03-21","VA",2,,0,,20,20,,1,,,,0,,,,,,152,,38,0,,1,,,2302,,8988,595,8988,595,,18,,,,0,,0 +"2020-03-21","VI",,,0,,,,,0,,,,0,,,,,,6,,3,0,,,,,,,,0,6,3,,,,,,0,,0 +"2020-03-21","VT",2,,0,,,,,0,,,943,201,,,,,,44,44,16,0,,,,,,,,0,1457,35,,,,,987,217,1457,35 +"2020-03-21","WA",111,,7,,,,,0,,,,0,,,,,,2497,2497,334,0,,,,,,,45706,2430,45706,2430,,,,,44847,2342,,0 +"2020-03-21","WI",4,,1,,,,,0,,,4628,1173,,,,,,315,281,80,0,,,,,,,6050,1602,6050,1602,,,,,,0,,0 +"2020-03-21","WV",0,,0,,1,1,,1,,,,0,,,,,,11,11,4,0,,,,,,,,0,232,86,,,,,,0,232,86 +"2020-03-21","WY",,,0,,,,,0,,,438,107,,,984,,,23,24,4,0,,,,,36,,,0,1020,78,,,,,,0,1020,78 +"2020-03-20","AK",0,,0,,1,1,,0,,,,0,,,,,,14,,3,0,,,,,,,,0,698,260,,,,,,0,698,260 +"2020-03-20","AL",0,,0,,,,,0,,,28,0,,,,,,81,81,13,0,,,,,,,,0,109,13,,,,,109,13,,0 +"2020-03-20","AR",,,0,,,,,0,,,351,41,,,,,,96,96,50,0,,,,,,,,0,447,91,,,,,,0,447,91 +"2020-03-20","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-20","AZ",0,,0,,108,108,,23,,,211,36,,,,,,65,,21,0,,,,,,,,0,7395,1652,,,,,276,57,7395,1652 +"2020-03-20","CA",20,,2,,,,,0,,,10424,1637,,,,,,1063,,139,0,,,,,,,,0,11487,1776,,,,,,0,11487,1776 +"2020-03-20","CO",4,,2,,44,44,,2,,,3317,642,,,,,,363,,86,0,,,,,,,3535,807,3535,807,,,,,3680,728,,0 +"2020-03-20","CT",3,,2,,,,,0,,,,0,,,4191,,,194,,98,0,,,,,994,,,0,5189,1526,,,,,,0,5189,1526 +"2020-03-20","DC",1,,1,,,,,0,,,,0,,,,,,71,,32,0,,,,,,,572,380,572,380,,,,,,0,,0 +"2020-03-20","DE",0,0,0,0,,,,0,,,36,0,,,,,,38,,8,0,,,,,22,,1201,304,1201,304,,,,,,0,,0 +"2020-03-20","FL",10,,2,,,,,0,,,1870,337,,,,,,386,,76,0,,,,,,,4773,1102,4773,1102,,,,,,0,,0 +"2020-03-20","GA",13,,3,,,,,0,,,,0,,,,,,420,,133,0,,,,,460,,,0,3115,647,,,,,,0,3115,647 +"2020-03-20","GU",,,0,,,,,0,,,86,17,,,,,,14,,2,0,,,,,,,,0,100,19,,,,,,0,,0 +"2020-03-20","HI",,,0,,,,,0,,,124,31,,,,,,26,,10,0,,,,,22,,1157,438,1157,438,,,,,,0,,0 +"2020-03-20","IA",,,0,,,,,0,,,642,559,,,,,,45,45,7,0,,,,,,,,0,687,566,,,,,,0,,0 +"2020-03-20","ID",,,0,,,,,0,,,590,131,,,,,,23,,12,0,,,,,,,,0,613,143,,,,,613,143,,0 +"2020-03-20","IL",5,,1,,,,,0,,,,0,,,,,,585,,163,0,,,,,,,,0,4286,1135,,,,,,0,4286,1135 +"2020-03-20","IN",2,,0,,,,,0,,,475,151,,,,,,79,,23,0,,,,,471,,,0,4672,1178,,,,,,0,4672,1178 +"2020-03-20","KS",1,,0,,,,,0,,,417,0,,,,,,44,,10,0,,,,,,,,0,461,10,,,,,,0,,0 +"2020-03-20","KY",1,,0,,,,,0,,,,0,,,,,,47,,12,0,,,,,,,,0,639,150,,,,,,0,639,150 +"2020-03-20","LA",12,,4,,,,,0,,,568,110,,,,,,473,473,126,0,,,,,,,,0,1041,236,,,,,,0,,0 +"2020-03-20","MA",5,,2,,,,,0,,,3795,877,,,,,,314,,85,0,,,,,1730,,,0,19384,3875,,,,,,0,19384,3875 +"2020-03-20","MD",3,3,1,,,,,0,,,94,0,,,,,,149,149,42,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-20","ME",,,0,,,,,0,,,,0,,,,,,57,57,4,0,,,,,76,,,0,2210,202,,,,,,0,2210,202 +"2020-03-20","MI",13,20,3,2,,,,0,,,,0,,,3041,,,6219,6150,943,0,,,,,804,,,0,3845,1255,,,,,,0,3845,1255 +"2020-03-20","MN",,,0,,,,,0,,,3741,792,,,,,,303,303,16,0,,,,,,,4044,808,4044,808,,,,,,0,,0 +"2020-03-20","MO",1,,0,,,,,0,,,369,61,,,2148,,,47,47,23,0,,,,,176,,,0,2327,797,,,,,,0,2327,797 +"2020-03-20","MP",0,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-20","MS",1,,1,,,,,0,,,695,143,,,,,,80,,30,0,,,,,,,,0,775,173,,,,,,0,,0 +"2020-03-20","MT",,,0,,,,,0,,,931,170,,,,,,16,,4,0,,,,,,,,0,947,174,,,,,,0,947,174 +"2020-03-20","NC",0,,0,,,,,0,,,,0,,,,,,137,,40,0,,,,,,,,0,3132,1696,,,,,,0,3132,1696 +"2020-03-20","ND",0,,0,,,,,0,,,800,307,,,,,,20,20,5,0,,,,,,,764,293,764,293,,,,,748,288,778,291 +"2020-03-20","NE",0,,0,,,,,0,,,240,0,,,648,,,32,,5,0,,,,,16,,,0,684,117,,,,,,0,684,117 +"2020-03-20","NH",,,0,,,,,0,,,745,124,,,,,,44,,5,0,,,,,,,,0,1312,263,,,,,,0,1312,263 +"2020-03-20","NJ",16,11,3,5,,,,0,,,264,54,,,,,,890,890,148,0,,,,,,,,0,1154,202,,,,,1154,202,,0 +"2020-03-20","NM",,,0,,,,,0,,,3771,1009,,,,,,35,,7,0,,,,,,,,0,2797,443,,,,,,0,2797,443 +"2020-03-20","NV",3,,0,,,,,0,,,1992,366,,,,,,109,109,8,0,,,,,,,5865,846,5865,846,,,,,,0,,0 +"2020-03-20","NY",35,,23,,,,1042,0,,,,0,,,,,,7102,,2950,0,,,,,,,32637,10124,32637,10124,,,,,,0,,0 +"2020-03-20","OH",1,,1,,,,,0,,,,0,,,,,,169,169,50,0,,,,,307,,,0,7780,1672,,,,,,0,7780,1672 +"2020-03-20","OK",1,,0,,,,,0,,,538,72,,,,,,49,,5,0,,,,,,,,0,587,77,,,,,,0,,0 +"2020-03-20","OR",3,,0,,,,,0,,,1329,211,,,,,,88,,13,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-20","PA",1,,0,,,,,0,,,2574,966,,,,,,268,,83,0,,,,,,,2885,1071,2885,1071,,,,,2842,1049,,0 +"2020-03-20","PR",,,0,,,,,0,,,114,58,,,,,,14,,9,0,,,,,,,,0,128,67,,,,,,0,,0 +"2020-03-20","RI",,,0,,,,,0,,,1161,193,,,1212,,,74,,13,0,,,,,84,,1075,277,1075,277,,,,,1235,206,1296,212 +"2020-03-20","SC",1,,0,,,,,0,,,833,250,,,,,,81,81,21,0,,,,,,,,0,914,271,,,,,,0,,0 +"2020-03-20","SD",1,,0,,,,,0,,,663,112,,,,,,14,,3,0,,,,,22,,,0,608,38,,,,,677,115,608,38 +"2020-03-20","TN",,,0,,,,,0,,,,0,,,,,,228,,74,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-20","TX",5,,2,,,,,0,,,,0,,,,,,175,175,67,0,,,,,1581,,,0,20422,4965,,,,,,0,20422,4965 +"2020-03-20","UT",0,,0,,,,,0,,,3316,801,,,3341,,,112,,34,0,,,,,177,,,0,3518,858,,,,,3475,845,3518,858 +"2020-03-20","VA",2,,0,,19,19,,19,,,,0,,,,,,114,,20,0,,1,,,2253,,8393,593,8393,593,,18,,,,0,,0 +"2020-03-20","VI",,,0,,,,,0,,,,0,,,,,,3,,0,0,,,,,,,,0,3,0,,,,,,0,,0 +"2020-03-20","VT",2,,2,,,,,0,,,742,123,,,,,,28,28,7,0,,,,,,,,0,1422,287,,,,,770,130,1422,287 +"2020-03-20","WA",104,,12,,,,,0,,,,0,,,,,,2163,2163,290,0,,,,,,,43276,4120,43276,4120,,,,,42505,4061,,0 +"2020-03-20","WI",3,,3,,,,,0,,,3455,1263,,,,,,235,206,61,0,,,,,,,4448,1263,4448,1263,,,,,,0,,0 +"2020-03-20","WV",0,,0,,,,,0,,,,0,,,,,,7,7,5,0,,,,,,,,0,146,49,,,,,,0,146,49 +"2020-03-20","WY",,,0,,,,,0,,,331,60,,,910,,,19,22,1,0,,,,,32,,,0,942,198,,,,,,0,942,198 +"2020-03-19","AK",0,,0,,1,1,,0,,,,0,,,,,,11,,3,0,,,,,,,,0,438,26,,,,,,0,438,26 +"2020-03-19","AL",0,,0,,,,,0,,,28,0,,,,,,68,68,22,0,,,,,,,,0,96,22,,,,,96,22,,0 +"2020-03-19","AR",,,0,,,,,0,,,310,74,,,,,,46,46,13,0,,,,,,,,0,356,87,,,,,,0,356,87 +"2020-03-19","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-19","AZ",0,,0,,85,85,,18,,,175,27,,,,,,44,,16,0,,,,,,,,0,5743,1449,,,,,219,43,5743,1449 +"2020-03-19","CA",18,,5,,,,,0,,,8787,806,,,,,,924,,313,0,,,,,,,,0,9711,1119,,,,,,0,9711,1119 +"2020-03-19","CO",2,,0,,42,42,,16,,,2675,563,,,,,,277,,61,0,,,,,,,2728,524,2728,524,,,,,2952,624,,0 +"2020-03-19","CT",1,,1,,,,,0,,,,0,,,2966,,,96,,28,0,,,,,694,,,0,3663,1349,,,,,,0,3663,1349 +"2020-03-19","DC",0,,0,,,,,0,,,,0,,,,,,39,,8,0,,,,,,,192,23,192,23,,,,,,0,,0 +"2020-03-19","DE",0,0,0,0,,,,0,,,36,0,,,,,,30,,5,0,,,,,17,,897,480,897,480,,,,,,0,,0 +"2020-03-19","FL",8,,1,,,,,0,,,1533,308,,,,,,310,,99,0,,,,,,,3671,1055,3671,1055,,,,,,0,,0 +"2020-03-19","GA",10,,9,,,,,0,,,,0,,,,,,287,,90,0,,,,,352,,,0,2468,602,,,,,,0,2468,602 +"2020-03-19","GU",,,0,,,,,0,,,69,12,,,,,,12,,4,0,,,,,,,,0,81,16,,,,,,0,,0 +"2020-03-19","HI",,,0,,,,,0,,,93,0,,,,,,16,,2,0,,,,,15,,719,233,719,233,,,,,,0,,0 +"2020-03-19","IA",,,0,,,,,0,,,83,0,,,,,,38,38,9,0,,,,,,,,0,121,9,,,,,,0,,0 +"2020-03-19","ID",,,0,,,,,0,,,459,0,,,,,,11,,2,0,,,,,,,,0,470,2,,,,,470,2,,0 +"2020-03-19","IL",4,,3,,,,,0,,,,0,,,,,,422,,134,0,,,,,,,,0,3151,1099,,,,,,0,3151,1099 +"2020-03-19","IN",2,,0,,,,,0,,,324,170,,,,,,56,,17,0,,,,,338,,,0,3494,897,,,,,,0,3494,897 +"2020-03-19","KS",1,,0,,,,,0,,,417,0,,,,,,34,,18,0,,,,,,,,0,451,18,,,,,,0,,0 +"2020-03-19","KY",1,,0,,,,,0,,,,0,,,,,,35,,9,0,,,,,,,,0,489,109,,,,,,0,489,109 +"2020-03-19","LA",8,,2,,,,,0,,,458,123,,,,,,347,347,107,0,,,,,,,,0,805,230,,,,,,0,,0 +"2020-03-19","MA",3,,1,,,,,0,,,2918,803,,,,,,229,,73,0,,,,,1336,,,0,15509,3138,,,,,,0,15509,3138 +"2020-03-19","MD",2,2,0,,,,,0,,,94,0,,,,,,107,107,22,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-19","ME",,,0,,,,,0,,,,0,,,,,,53,53,10,0,,,,,70,,,0,2008,349,,,,,,0,2008,349 +"2020-03-19","MI",10,11,5,1,,,,0,,,,0,,,2051,,,5276,5221,745,0,,,,,539,,,0,2590,738,,,,,,0,2590,738 +"2020-03-19","MN",,,0,,,,,0,,,2949,264,,,,,,287,287,18,0,,,,,,,3236,282,3236,282,,,,,,0,,0 +"2020-03-19","MO",1,,1,,,,,0,,,308,55,,,1409,,,24,24,11,0,,,,,120,,,0,1530,685,,,,,,0,1530,685 +"2020-03-19","MP",0,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-19","MS",,,0,,,,,0,,,552,73,,,,,,50,,16,0,,,,,,,,0,602,89,,,,,,0,,0 +"2020-03-19","MT",,,0,,,,,0,,,761,262,,,,,,12,,2,0,,,,,,,,0,773,264,,,,,,0,773,264 +"2020-03-19","NC",0,,0,,,,,0,,,,0,,,,,,97,,34,0,,,,,,,,0,1436,205,,,,,,0,1436,205 +"2020-03-19","ND",0,,0,,,,,0,,,493,225,,,,,,15,15,9,0,,,,,,,471,225,471,225,,,,,460,221,487,228 +"2020-03-19","NE",0,,0,,,,,0,,,240,34,,,538,,,27,,3,0,,,,,9,,,0,567,94,,,,,,0,567,94 +"2020-03-19","NH",,,0,,,,,0,,,621,108,,,,,,39,,13,0,,,,,,,,0,1049,216,,,,,,0,1049,216 +"2020-03-19","NJ",13,9,6,4,,,,0,,,210,20,,,,,,742,742,313,0,,,,,,,,0,952,333,,,,,952,335,,0 +"2020-03-19","NM",,,0,,,,,0,,,2762,436,,,,,,28,,5,0,,,,,,,,0,2354,634,,,,,,0,2354,634 +"2020-03-19","NV",3,,1,,,,,0,,,1626,1458,,,,,,101,101,23,0,,,,,,,5019,973,5019,973,,,,,,0,,0 +"2020-03-19","NY",12,,0,,,,617,0,,,,0,,,,,,4152,,1769,0,,,,,,,22513,7698,22513,7698,,,,,,0,,0 +"2020-03-19","OH",,,0,,,,,0,,,,0,,,,,,119,119,31,0,,,,,238,,,0,6108,1940,,,,,,0,6108,1940 +"2020-03-19","OK",1,,1,,,,,0,,,466,88,,,,,,44,,15,0,,,,,,,,0,510,103,,,,,,0,,0 +"2020-03-19","OR",3,,3,,,,,0,,,1118,429,,,,,,75,,28,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-19","PA",1,,0,,,,,0,,,1608,421,,,,,,185,,52,0,,,,,,,1814,467,1814,467,,,,,1793,473,,0 +"2020-03-19","PR",,,0,,,,,0,,,56,25,,,,,,5,,0,0,,,,,,,,0,61,25,,,,,,0,,0 +"2020-03-19","RI",,,0,,,,,0,,,968,249,,,1015,,,61,,17,0,,,,,69,,798,125,798,125,,,,,1029,266,1084,279 +"2020-03-19","SC",1,,0,,,,,0,,,583,0,,,,,,60,60,0,0,,,,,,,,0,643,0,,,,,,0,,0 +"2020-03-19","SD",1,,0,,,,,0,,,551,0,,,,,,11,,0,0,,,,,22,,,0,570,148,,,,,562,0,570,148 +"2020-03-19","TN",,,0,,,,,0,,,,0,,,,,,154,,56,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-19","TX",3,,1,,,,,0,,,,0,,,,,,108,108,26,0,,,,,1174,,,0,15457,4056,,,,,,0,15457,4056 +"2020-03-19","UT",0,,0,,,,,0,,,2515,564,,,2532,,,78,,15,0,,,,,128,,,0,2660,605,,,,,2630,599,2660,605 +"2020-03-19","VA",2,,1,,,,,0,,,,0,,,,,,94,,17,0,,1,,,2161,,7800,424,7800,424,,18,,,,0,,0 +"2020-03-19","VI",,,0,,,,,0,,,,0,,,,,,3,,1,0,,,,,,,,0,3,1,,,,,,0,,0 +"2020-03-19","VT",,,0,,,,,0,,,619,54,,,,,,21,21,2,0,,,,,,,,0,1135,324,,,,,640,56,1135,324 +"2020-03-19","WA",92,,10,,,,,0,,,,0,,,,,,1873,1873,268,0,,,,,,,39156,4460,39156,4460,,,,,38444,4550,,0 +"2020-03-19","WI",,,0,,,,,0,,,2192,615,,,,,,174,155,53,0,,,,,,,3185,1055,3185,1055,,,,,,0,,0 +"2020-03-19","WV",0,,0,,,,,0,,,,0,,,,,,2,2,1,0,,,,,,,,0,97,63,,,,,,0,97,63 +"2020-03-19","WY",,,0,,,,,0,,,271,93,,,716,,,18,18,3,0,,,,,28,,,0,744,143,,,,,,0,744,143 +"2020-03-18","AK",0,,0,,1,1,,0,,,,0,,,,,,8,,5,0,,,,,,,,0,412,75,,,,,,0,412,75 +"2020-03-18","AL",0,,0,,,,,0,,,28,0,,,,,,46,46,10,0,,,,,,,,0,74,10,,,,,74,10,,0 +"2020-03-18","AR",,,0,,,,,0,,,236,39,,,,,,33,33,11,0,,,,,,,,0,269,50,,,,,,0,269,50 +"2020-03-18","AS",0,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-18","AZ",0,,0,,67,67,,12,,,148,6,,,,,,28,,8,0,,,,,,,,0,4294,1396,,,,,176,14,4294,1396 +"2020-03-18","CA",13,,2,,,,,0,,,7981,0,,,,,,611,,128,0,,,,,,,,0,8592,128,,,,,,0,8592,128 +"2020-03-18","CO",2,,0,,26,26,,6,,,2112,495,,,,,,216,,33,0,,,,,,,2204,736,2204,736,,,,,2328,538,,0 +"2020-03-18","CT",,,0,,,,,0,,,,0,,,1863,,,68,,27,0,,,,,448,,,0,2314,989,,,,,,0,2314,989 +"2020-03-18","DC",,,0,,,,,0,,,,0,,,,,,31,,9,0,,,,,,,169,43,169,43,,,,,,0,,0 +"2020-03-18","DE",0,0,0,0,,,,0,,,36,0,,,,,,25,,9,0,,,,,2,,417,66,417,66,,,,,,0,,0 +"2020-03-18","FL",7,,1,,,,,0,,,1225,285,,,,,,211,,62,0,,,,,,,2616,704,2616,704,,,,,,0,,0 +"2020-03-18","GA",1,,0,,,,,0,,,,0,,,,,,197,,51,0,,,,,246,,,0,1866,366,,,,,,0,1866,366 +"2020-03-18","GU",,,0,,,,,0,,,57,16,,,,,,8,,3,0,,,,,,,,0,65,19,,,,,,0,,0 +"2020-03-18","HI",,,0,,,,,0,,,93,93,,,,,,14,,4,0,,,,,11,,486,180,486,180,,,,,,0,,0 +"2020-03-18","IA",,,0,,,,,0,,,83,0,,,,,,29,29,6,0,,,,,,,,0,112,6,,,,,,0,,0 +"2020-03-18","ID",,,0,,,,,0,,,459,113,,,,,,9,,2,0,,,,,,,,0,468,115,,,,,468,115,,0 +"2020-03-18","IL",1,,0,,,,,0,,,,0,,,,,,288,,129,0,,,,,,,,0,2052,552,,,,,,0,2052,552 +"2020-03-18","IN",2,,0,,,,,0,,,154,25,,,,,,39,,9,0,,,,,238,,,0,2597,790,,,,,,0,2597,790 +"2020-03-18","KS",1,,0,,,,,0,,,417,35,,,,,,16,,1,0,,,,,,,,0,433,36,,,,,,0,,0 +"2020-03-18","KY",1,,0,,,,,0,,,,0,,,,,,26,,4,0,,,,,,,,0,380,63,,,,,,0,380,63 +"2020-03-18","LA",6,,2,,,,,0,,,335,49,,,,,,240,240,103,0,,,,,,,,0,575,152,,,,,,0,,0 +"2020-03-18","MA",2,,2,,,,,0,,,2115,482,,,,,,156,,38,0,,,,,1050,,,0,12371,3226,,,,,,0,12371,3226 +"2020-03-18","MD",2,2,2,,,,,0,,,94,0,,,,,,85,85,28,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-18","ME",,,0,,,,,0,,,,0,,,,,,43,43,11,0,,,,,57,,,0,1659,494,,,,,,0,1659,494 +"2020-03-18","MI",5,9,3,1,,,,0,,,,0,,,1478,,,4531,4491,872,0,,,,,374,,,0,1852,752,,,,,,0,1852,752 +"2020-03-18","MN",,,0,,,,,0,,,2685,409,,,,,,269,269,23,0,,,,,,,2954,432,2954,432,,,,,,0,,0 +"2020-03-18","MO",0,,0,,,,,0,,,253,46,,,774,,,13,13,5,0,,,,,70,,,0,845,440,,,,,,0,845,440 +"2020-03-18","MP",0,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-18","MS",,,0,,,,,0,,,479,111,,,,,,34,,13,0,,,,,,,,0,513,124,,,,,,0,,0 +"2020-03-18","MT",,,0,,,,,0,,,499,196,,,,,,10,,2,0,,,,,,,,0,509,198,,,,,,0,509,198 +"2020-03-18","NC",0,,0,,,,,0,,,,0,,,,,,63,,23,0,,,,,,,,0,1231,295,,,,,,0,1231,295 +"2020-03-18","ND",0,,0,,,,,0,,,268,48,,,,,,6,6,5,0,,,,,,,246,116,246,116,,,,,239,112,259,116 +"2020-03-18","NE",,,0,,,,,0,,,206,0,,,446,,,24,,3,0,,,,,7,,,0,473,97,,,,,,0,473,97 +"2020-03-18","NH",,,0,,,,,0,,,513,158,,,,,,26,,9,0,,,,,,,,0,833,147,,,,,,0,833,147 +"2020-03-18","NJ",7,5,3,2,,,,0,,,190,27,,,,,,429,429,162,0,,,,,,,,0,619,189,,,,,617,187,,0 +"2020-03-18","NM",,,0,,,,,0,,,2326,629,,,,,,23,,2,0,,,,,,,,0,1720,450,,,,,,0,1720,450 +"2020-03-18","NV",2,,1,,,,,0,,,168,0,,,,,,78,78,5,0,,,,,,,4046,1056,4046,1056,,,,,,0,,0 +"2020-03-18","NY",12,,5,,,,416,0,,,,0,,,,,,2383,,1009,0,,,,,,,14815,4553,14815,4553,,,,,,0,,0 +"2020-03-18","OH",,,0,,,,,0,,,,0,,,,,,88,88,21,0,,,,,164,,,0,4168,1806,,,,,,0,4168,1806 +"2020-03-18","OK",,,0,,,,,0,,,378,131,,,,,,29,,12,0,,,,,,,,0,407,143,,,,,,0,,0 +"2020-03-18","OR",,,0,,,,,0,,,689,110,,,,,,47,,8,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-18","PA",1,,1,,,,,0,,,1187,308,,,,,,133,,37,0,,,,,,,1347,356,1347,356,,,,,1320,345,,0 +"2020-03-18","PR",,,0,,,,,0,,,31,18,,,,,,5,,0,0,,,,,,,,0,36,18,,,,,,0,,0 +"2020-03-18","RI",,,0,,,,,0,,,719,111,,,753,,,44,,11,0,,,,,52,,673,174,673,174,,,,,763,122,805,128 +"2020-03-18","SC",1,,0,,,,,0,,,583,272,,,,,,60,60,27,0,,,,,,,,0,643,299,,,,,,0,,0 +"2020-03-18","SD",1,,1,,,,,0,,,551,0,,,,,,11,,0,0,,,,,21,,,0,422,159,,,,,562,0,422,159 +"2020-03-18","TN",,,0,,,,,0,,,,0,,,,,,98,,25,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-18","TX",2,,1,,,,,0,,,,0,,,,,,82,82,19,0,,,,,867,,,0,11401,3299,,,,,,0,11401,3299 +"2020-03-18","UT",0,,0,,,,,0,,,1951,526,,,1965,,,63,,12,0,,,,,90,,,0,2055,553,,,,,2031,545,2055,553 +"2020-03-18","VA",1,,0,,,,,0,,,,0,,,,,,77,,10,0,,1,,,2142,,7376,224,7376,224,,18,,,,0,,0 +"2020-03-18","VI",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,,,,0,2,0,,,,,,0,,0 +"2020-03-18","VT",,,0,,,,,0,,,565,92,,,,,,19,19,2,0,,,,,,,,0,811,262,,,,,584,94,811,262 +"2020-03-18","WA",82,,4,,,,,0,,,,0,,,,,,1605,1605,300,0,,,,,,,34696,4826,34696,4826,,,,,33894,4740,,0 +"2020-03-18","WI",,,0,,,,,0,,,1577,539,,,,,,121,106,38,0,,,,,,,2130,810,2130,810,,,,,,0,,0 +"2020-03-18","WV",0,,0,,,,,0,,,,0,,,,,,1,1,1,0,,,,,,,,0,34,13,,,,,,0,34,13 +"2020-03-18","WY",,,0,,,,,0,,,178,83,,,580,,,15,16,5,0,,,,,21,,,0,601,140,,,,,,0,601,140 +"2020-03-17","AK",0,,0,,1,1,,0,,,,0,,,,,,3,,3,0,,,,,,,,0,337,193,,,,,,0,337,193 +"2020-03-17","AL",0,,0,,,,,0,,,28,0,,,,,,36,36,8,0,,,,,,,,0,64,8,,,,,64,8,,0 +"2020-03-17","AR",,,0,,,,,0,,,197,65,,,,,,22,22,0,0,,,,,,,,0,219,65,,,,,,0,219,65 +"2020-03-17","AS",,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-17","AZ",0,,0,,55,55,,13,,,142,17,,,,,,20,,2,0,,,,,,,,0,2898,1043,,,,,162,19,2898,1043 +"2020-03-17","CA",11,,5,,,,,0,,,7981,0,,,,,,483,,148,0,,,,,,,,0,8464,148,,,,,,0,8464,148 +"2020-03-17","CO",2,,1,,20,20,,20,,,1617,561,,,,,,183,,23,0,,,,,,,1468,461,1468,461,,,,,1790,1790,,0 +"2020-03-17","CT",,,0,,,,,0,,,,0,,,1034,,,41,,15,0,,,,,288,,,0,1325,570,,,,,,0,1325,570 +"2020-03-17","DC",,,0,,,,,0,,,,0,,,,,,22,,5,0,,,,,,,126,13,126,13,,,,,,0,,0 +"2020-03-17","DE",0,0,0,0,,,,0,,,36,0,,,,,,16,,8,0,,,,,2,,351,231,351,231,,,,,,0,,0 +"2020-03-17","FL",6,,2,,,,,0,,,940,256,,,,,,149,,27,0,,,,,,,1912,591,1912,591,,,,,,0,,0 +"2020-03-17","GA",1,,0,,,,,0,,,,0,,,,,,146,,25,0,,,,,185,,,0,1500,541,,,,,,0,1500,541 +"2020-03-17","GU",,,0,,,,,0,,,41,18,,,,,,5,,2,0,,,,,,,,0,46,20,,,,,,0,,0 +"2020-03-17","HI",,,0,,,,,0,,,,0,,,,,,10,,3,0,,,,,10,,306,117,306,117,,,,,,0,,0 +"2020-03-17","IA",,,0,,,,,0,,,83,0,,,,,,23,23,1,0,,,,,,,,0,106,1,,,,,,0,,0 +"2020-03-17","ID",,,0,,,,,0,,,346,81,,,,,,7,,2,0,,,,,,,,0,353,83,,,,,353,83,,0 +"2020-03-17","IL",1,,1,,,,,0,,,,0,,,,,,159,,66,0,,,,,,,,0,1500,357,,,,,,0,1500,357 +"2020-03-17","IN",2,,1,,,,,0,,,129,14,,,,,,30,,6,0,,,,,160,,,0,1807,685,,,,,,0,1807,685 +"2020-03-17","KS",1,,0,,,,,0,,,382,216,,,,,,15,,4,0,,,,,,,,0,397,220,,,,,,0,,0 +"2020-03-17","KY",1,,0,,,,,0,,,,0,,,,,,22,,1,0,,,,,,,,0,317,62,,,,,,0,317,62 +"2020-03-17","LA",4,,2,,,,,0,,,286,98,,,,,,137,137,22,0,,,,,,,,0,423,120,,,,,,0,,0 +"2020-03-17","MA",,,0,,,,,0,,,1633,434,,,,,,118,,21,0,,,,,787,,,0,9145,2790,,,,,,0,9145,2790 +"2020-03-17","MD",,,-2,,,,,0,,,94,0,,,,,,57,57,20,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-17","ME",,,0,,,,,0,,,,0,,,,,,32,32,15,0,,,,,37,,,0,1165,415,,,,,,0,1165,415 +"2020-03-17","MI",2,4,0,1,,,,0,,,,0,,,879,,,3659,3632,764,0,,,,,221,,,0,1100,835,,,,,,0,1100,835 +"2020-03-17","MN",,,0,,,,,0,,,2276,437,,,,,,246,246,67,0,,,,,,,2522,504,2522,504,,,,,,0,,0 +"2020-03-17","MO",0,,0,,,,,0,,,207,43,,,365,,,8,8,2,0,,,,,39,,,0,405,118,,,,,,0,405,118 +"2020-03-17","MP",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-17","MS",,,0,,,,,0,,,368,91,,,,,,21,,9,0,,,,,,,,0,389,100,,,,,,0,,0 +"2020-03-17","MT",,,0,,,,,0,,,303,105,,,,,,8,,1,0,,,,,,,,0,311,106,,,,,,0,311,106 +"2020-03-17","NC",0,,0,,,,,0,,,,0,,,,,,40,,7,0,,,,,,,,0,936,936,,,,,,0,936,936 +"2020-03-17","ND",0,,0,,,,,0,,,220,97,,,,,,1,1,0,0,,,,,,,130,34,130,34,,,,,127,34,143,34 +"2020-03-17","NE",,,0,,,,,0,,,206,36,,,351,,,21,,3,0,,,,,6,,,0,376,76,,,,,,0,376,76 +"2020-03-17","NH",,,0,,,,,0,,,355,84,,,,,,17,,4,0,,,,,,,,0,686,160,,,,,,0,686,160 +"2020-03-17","NJ",4,3,2,1,,,,0,,,163,43,,,,,,267,267,89,0,,,,,,,,0,430,132,,,,,430,132,,0 +"2020-03-17","NM",,,0,,,,,0,,,1697,448,,,,,,21,,4,0,,,,,,,,0,1270,687,,,,,,0,1270,687 +"2020-03-17","NV",1,,0,,,,,0,,,168,0,,,,,,73,73,10,0,,,,,,,2990,913,2990,913,,,,,,0,,0 +"2020-03-17","NY",7,,0,,,,325,0,,,,0,,,,,,1374,,432,0,,,,,,,10262,2907,10262,2907,,,,,,0,,0 +"2020-03-17","OH",,,0,,,,,0,,,,0,,,,,,67,67,17,0,,,,,95,,,0,2362,1064,,,,,,0,2362,1064 +"2020-03-17","OK",,,0,,,,,0,,,247,73,,,,,,17,,7,0,,,,,,,,0,264,80,,,,,,0,,0 +"2020-03-17","OR",,,0,,,,,0,,,579,159,,,,,,39,,3,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-17","PA",,,0,,,,,0,,,879,209,,,,,,96,,20,0,,,,,,,991,240,991,240,,,,,975,229,,0 +"2020-03-17","PR",,,0,,,,,0,,,13,4,,,,,,5,,0,0,,,,,,,,0,18,4,,,,,,0,,0 +"2020-03-17","RI",,,0,,,,,0,,,608,153,,,637,,,33,,11,0,,,,,40,,499,97,499,97,,,,,641,164,677,178 +"2020-03-17","SC",1,,0,,,,,0,,,311,76,,,,,,33,33,5,0,,,,,,,,0,344,81,,,,,,0,,0 +"2020-03-17","SD",,,0,,,,,0,,,551,57,,,,,,11,,1,0,,,,,19,,,0,263,84,,,,,562,58,263,84 +"2020-03-17","TN",,,0,,,,,0,,,,0,,,,,,73,,21,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-17","TX",1,,1,,,,,0,,,,0,,,,,,63,63,7,0,,,,,631,,,0,8102,2606,,,,,,0,8102,2606 +"2020-03-17","UT",0,,0,,,,,0,,,1425,442,,,1433,,,51,,12,0,,,,,69,,,0,1502,465,,,,,1486,461,1502,465 +"2020-03-17","VA",1,,0,,,,,0,,,,0,,,,,,67,,16,0,,1,,,2119,,7152,325,7152,325,,18,,,,0,,0 +"2020-03-17","VI",,,0,,,,,0,,,,0,,,,,,2,,1,0,,,,,,,,0,2,1,,,,,,0,,0 +"2020-03-17","VT",,,0,,,,,0,,,473,81,,,,,,17,17,5,0,,,,,,,,0,549,121,,,,,490,86,549,121 +"2020-03-17","WA",78,,9,,,,,0,,,,0,,,,,,1305,1305,108,0,,,,,,,29870,4815,29870,4815,,,,,29154,4638,,0 +"2020-03-17","WI",,,0,,,,,0,,,1038,534,,,,,,83,72,27,0,,,,,,,1320,378,1320,378,,,,,,0,,0 +"2020-03-17","WV",0,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,21,4,,,,,,0,21,4 +"2020-03-17","WY",,,0,,,,,0,,,95,95,,,444,,,10,11,7,0,,,,,17,,,0,461,161,,,,,,0,461,161 +"2020-03-16","AK",0,,0,,1,1,,0,,,,0,,,,,,,,0,0,,,,,,,,0,144,0,,,,,,0,144,0 +"2020-03-16","AL",0,,0,,,,,0,,,28,0,,,,,,28,28,16,0,,,,,,,,0,56,16,,,,,56,16,,0 +"2020-03-16","AR",,,0,,,,,0,,,132,29,,,,,,22,22,6,0,,,,,,,,0,154,35,,,,,,0,154,35 +"2020-03-16","AS",,,0,,,,,0,,,,0,,,,,,,0,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-16","AZ",0,,0,,42,42,,6,,,125,4,,,,,,18,,6,0,,,,,,,,0,1855,303,,,,,143,10,1855,303 +"2020-03-16","CA",6,,1,,,,,0,,,7981,7065,,,,,,335,,42,0,,,,,,,,0,8316,7107,,,,,,0,8316,7107 +"2020-03-16","CO",1,,0,,,,,0,,,1056,429,,,,,,160,,29,0,,,,,,,1007,303,1007,303,,,,,,0,,0 +"2020-03-16","CT",,,0,,,,,0,,,,0,,,598,,,26,,6,0,,,,,154,,,0,755,136,,,,,,0,755,136 +"2020-03-16","DC",,,0,,,,,0,,,,0,,,,,,17,,1,0,,,,,,,113,18,113,18,,,,,,0,,0 +"2020-03-16","DE",0,0,0,0,,,,0,,,36,0,,,,,,8,,2,0,,,,,0,,120,60,120,60,,,,,,0,,0 +"2020-03-16","FL",4,,0,,,,,0,,,684,6,,,,,,122,,31,0,,,,,,,1321,181,1321,181,,,,,,0,,0 +"2020-03-16","GA",1,,0,,,,,0,,,,0,,,,,,121,,22,0,,,,,100,,,0,959,252,,,,,,0,959,252 +"2020-03-16","GU",,,0,,,,,0,,,23,0,,,,,,3,,0,0,,,,,,,,0,26,0,,,,,,0,,0 +"2020-03-16","HI",,,0,,,,,0,,,,0,,,,,,7,,5,0,,,,,7,,189,130,189,130,,,,,,0,,0 +"2020-03-16","IA",,,0,,,,,0,,,83,0,,,,,,22,22,4,0,,,,,,,,0,105,4,,,,,,0,,0 +"2020-03-16","ID",,,0,,,,,0,,,265,91,,,,,,5,,0,0,,,,,,,,0,270,91,,,,,270,91,,0 +"2020-03-16","IL",,,0,,,,,0,,,,0,,,,,,93,,29,0,,,,,,,,0,1143,211,,,,,,0,1143,211 +"2020-03-16","IN",1,,1,,,,,0,,,115,13,,,,,,24,,5,0,,,,,94,,,0,1122,159,,,,,,0,1122,159 +"2020-03-16","KS",1,,0,,,,,0,,,166,31,,,,,,11,,3,0,,,,,,,,0,177,34,,,,,,0,,0 +"2020-03-16","KY",1,,0,,,,,0,,,,0,,,,,,21,,5,0,,,,,,,,0,255,100,,,,,,0,255,100 +"2020-03-16","LA",2,,0,,,,,0,,,188,32,,,,,,115,115,25,0,,,,,,,,0,303,57,,,,,,0,,0 +"2020-03-16","MA",,,0,,,,,0,,,1199,615,,,,,,97,,33,0,,,,,532,,,0,6355,2235,,,,,,0,6355,2235 +"2020-03-16","MD",2,,2,,,,,0,,,94,0,,,,,,37,37,6,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-16","ME",,,0,,,,,0,,,,0,,,,,,17,17,14,0,,,,,25,,,0,750,235,,,,,,0,750,235 +"2020-03-16","MI",2,1,1,1,,,,0,,,,0,,,193,,,2895,2873,707,0,,,,,72,,,0,265,156,,,,,,0,265,156 +"2020-03-16","MN",,,0,,,,,0,,,1839,452,,,,,,179,179,51,0,,,,,,,2018,503,2018,503,,,,,,0,,0 +"2020-03-16","MO",0,,0,,,,,0,,,164,42,,,257,,,6,6,1,0,,,,,29,,,0,287,99,,,,,,0,287,99 +"2020-03-16","MP",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-16","MS",,,0,,,,,0,,,277,193,,,,,,12,,2,0,,,,,,,,0,289,195,,,,,,0,,0 +"2020-03-16","MT",,,0,,,,,0,,,198,95,,,,,,7,,0,0,,,,,,,,0,205,95,,,,,,0,205,95 +"2020-03-16","NC",0,,0,,,,,0,,,,0,,,,,,33,,1,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-16","ND",0,,0,,,,,0,,,123,28,,,,,,1,1,0,0,,,,,,,96,22,96,22,,,,,93,20,109,22 +"2020-03-16","NE",,,0,,,,,0,,,170,90,,,276,,,18,,1,0,,,,,5,,,0,300,54,,,,,,0,300,54 +"2020-03-16","NH",,,0,,,,,0,,,271,0,,,,,,13,,0,0,,,,,,,,0,526,121,,,,,,0,526,121 +"2020-03-16","NJ",2,2,0,0,,,,0,,,120,0,,,,,,178,178,80,0,,,,,,,,0,298,80,,,,,298,80,,0 +"2020-03-16","NM",,,0,,,,,0,,,1249,683,,,,,,17,,4,0,,,,,,,,0,583,88,,,,,,0,583,88 +"2020-03-16","NV",1,,0,,,,,0,,,168,0,,,,,,63,63,18,0,,,,,,,2077,408,2077,408,,,,,,0,,0 +"2020-03-16","NY",7,,4,,,,,0,,,,0,,,,,,942,,294,0,,,,,,,7355,1936,7355,1936,,,,,,0,,0 +"2020-03-16","OH",,,0,,,,,0,,,,0,,,,,,50,50,14,0,,,,,63,,,0,1298,443,,,,,,0,1298,443 +"2020-03-16","OK",,,0,,,,,0,,,174,56,,,,,,10,,1,0,,,,,,,,0,184,57,,,,,,0,,0 +"2020-03-16","OR",,,0,,,,,0,,,420,83,,,,,,36,,6,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-16","PA",,,0,,,,,0,,,670,465,,,,,,76,,13,0,,,,,,,751,198,751,198,,,,,746,478,,0 +"2020-03-16","PR",,,0,,,,,0,,,9,0,,,,,,5,,0,0,,,,,,,,0,14,0,,,,,,0,,0 +"2020-03-16","RI",,,0,,,,,0,,,455,91,,,475,,,22,,2,0,,,,,24,,402,55,402,55,,,,,477,93,499,97 +"2020-03-16","SC",1,,1,,,,,0,,,235,81,,,,,,28,28,9,0,,,,,,,,0,263,90,,,,,,0,,0 +"2020-03-16","SD",,,0,,,,,0,,,494,167,,,,,,10,,1,0,,,,,10,,,0,179,84,,,,,504,168,179,84 +"2020-03-16","TN",,,0,,,,,0,,,,0,,,,,,52,,13,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-16","TX",,,0,,,,,0,,,,0,,,,,,56,56,0,0,,,,,430,,,0,5496,575,,,,,,0,5496,575 +"2020-03-16","UT",0,,0,,,,,0,,,983,326,,,991,,,39,,11,0,,,,,46,,,0,1037,346,,,,,1025,343,1037,346 +"2020-03-16","VA",1,,0,,,,,0,,,,0,,,,,,51,,6,0,,1,,,2107,,6827,88,6827,88,,18,,,,0,,0 +"2020-03-16","VI",,,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,,,,0,1,0,,,,,,0,,0 +"2020-03-16","VT",,,0,,,,,0,,,392,72,,,,,,12,12,4,0,,,,,,,,0,428,58,,,,,404,76,428,58 +"2020-03-16","WA",69,,12,,,,,0,,,,0,,,,,,1197,1197,156,0,,,,,,,25055,4996,25055,4996,,,,,24516,4895,,0 +"2020-03-16","WI",,,0,,,,,0,,,504,191,,,,,,56,47,19,0,,,,,,,942,365,942,365,,,,,,0,,0 +"2020-03-16","WV",0,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,17,12,,,,,,0,17,12 +"2020-03-16","WY",,,0,,,,,0,,,,0,,,286,,,3,3,0,0,,,,,14,,,0,300,122,,,,,,0,300,122 +"2020-03-15","AK",0,,0,,1,1,,0,,,,0,,,,,,,,0,0,,,,,,,,0,144,0,,,,,,0,144,0 +"2020-03-15","AL",0,,0,,,,,0,,,28,6,,,,,,12,12,6,0,,,,,,,,0,40,12,,,,,40,12,,0 +"2020-03-15","AR",,,0,,,,,0,,,103,38,,,,,,16,16,4,0,,,,,,,,0,119,42,,,,,,0,119,42 +"2020-03-15","AZ",0,,0,,36,36,,10,,,121,0,,,,,,12,,0,0,,,,,,,,0,1552,261,,,,,133,0,1552,261 +"2020-03-15","CA",5,,0,,,,,0,,,916,0,,,,,,293,,41,0,,,,,,,,0,1209,41,,,,,,0,1209,41 +"2020-03-15","CO",1,,0,,,,,0,,,627,0,,,,,,131,,0,0,,,,,,,704,179,704,179,,,,,,0,,0 +"2020-03-15","CT",,,0,,,,,0,,,,0,,,488,,,20,,9,0,,,,,128,,,0,619,123,,,,,,0,619,123 +"2020-03-15","DC",,,0,,,,,0,,,,0,,,,,,16,,6,0,,,,,,,95,36,95,36,,,,,,0,,0 +"2020-03-15","DE",0,0,0,0,,,,0,,,36,0,,,,,,6,,0,0,,,,,0,,60,32,60,32,,,,,,0,,0 +"2020-03-15","FL",4,,1,,,,,0,,,678,200,,,,,,91,,40,0,,,,,,,1140,436,1140,436,,,,,,0,,0 +"2020-03-15","GA",1,,0,,,,,0,,,,0,,,,,,99,,33,0,,,,,68,,,0,707,241,,,,,,0,707,241 +"2020-03-15","HI",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,4,,59,31,59,31,,,,,,0,,0 +"2020-03-15","IA",,,0,,,,,0,,,83,0,,,,,,18,18,1,0,,,,,,,,0,101,1,,,,,,0,,0 +"2020-03-15","ID",,,0,,,,,0,,,174,0,,,,,,5,,3,0,,,,,,,,0,179,3,,,,,179,3,,0 +"2020-03-15","IL",,,0,,,,,0,,,,0,,,,,,64,,18,0,,,,,,,,0,932,224,,,,,,0,932,224 +"2020-03-15","IN",0,,0,,,,,0,,,102,28,,,,,,19,,4,0,,,,,74,,,0,963,288,,,,,,0,963,288 +"2020-03-15","KS",1,,0,,,,,0,,,135,42,,,,,,8,,2,0,,,,,,,,0,143,44,,,,,,0,,0 +"2020-03-15","KY",1,,0,,,,,0,,,,0,,,,,,16,,2,0,,,,,,,,0,155,2,,,,,,0,155,2 +"2020-03-15","LA",2,,2,,,,,0,,,156,47,,,,,,90,90,39,0,,,,,,,,0,246,86,,,,,,0,,0 +"2020-03-15","MA",,,0,,,,,0,,,584,584,,,,,,64,,26,0,,,,,380,,,0,4120,1084,,,,,,0,4120,1084 +"2020-03-15","MD",,,0,,,,,0,,,94,0,,,,,,31,31,5,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-15","ME",,,0,,,,,0,,,,0,,,,,,3,3,0,0,,,,,16,,,0,515,296,,,,,,0,515,296 +"2020-03-15","MI",1,0,0,1,,,,0,,,,0,,,53,,,2188,2175,460,0,,,,,56,,,0,109,33,,,,,,0,109,33 +"2020-03-15","MN",,,0,,,,,0,,,1387,540,,,,,,128,128,38,0,,,,,,,1515,578,1515,578,,,,,,0,,0 +"2020-03-15","MO",0,,0,,,,,0,,,122,32,,,168,,,5,5,1,0,,,,,19,,,0,188,73,,,,,,0,188,73 +"2020-03-15","MS",,,0,,,,,0,,,84,0,,,,,,10,,4,0,,,,,,,,0,94,4,,,,,,0,,0 +"2020-03-15","MT",,,0,,,,,0,,,103,0,,,,,,7,,2,0,,,,,,,,0,110,2,,,,,,0,110,2 +"2020-03-15","NC",,,0,,,,,0,,,,0,,,,,,32,,9,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-15","ND",0,,0,,,,,0,,,95,41,,,,,,1,1,0,0,,,,,,,74,24,74,24,,,,,73,24,87,24 +"2020-03-15","NE",,,0,,,,,0,,,80,0,,,222,,,17,,3,0,,,,,5,,,0,246,29,,,,,,0,246,29 +"2020-03-15","NH",,,0,,,,,0,,,271,59,,,,,,13,,6,0,,,,,,,,0,405,86,,,,,,0,405,86 +"2020-03-15","NJ",2,2,1,0,,,,0,,,120,23,,,,,,98,98,20,0,,,,,,,,0,218,43,,,,,218,71,,0 +"2020-03-15","NM",,,0,,,,,0,,,566,84,,,,,,13,,3,0,,,,,,,,0,495,248,,,,,,0,495,248 +"2020-03-15","NV",1,,1,,,,,0,,,168,0,,,,,,45,45,11,0,,,,,,,1669,424,1669,424,,,,,,0,,0 +"2020-03-15","NY",3,,3,,,,,0,,,,0,,,,,,648,,131,0,,,,,,,5419,1293,5419,1293,,,,,,0,,0 +"2020-03-15","OH",,,0,,,,,0,,,,0,,,,,,36,36,23,0,,,,,44,,,0,855,410,,,,,,0,855,410 +"2020-03-15","OK",,,0,,,,,0,,,118,82,,,,,,9,,5,0,,,,,,,,0,127,87,,,,,,0,,0 +"2020-03-15","OR",,,0,,,,,0,,,337,0,,,,,,30,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-15","PA",,,0,,,,,0,,,205,0,,,,,,63,,16,0,,,,,,,553,160,553,160,,,,,268,16,,0 +"2020-03-15","RI",,,0,,,,,0,,,364,54,,,380,,,20,,1,0,,,,,22,,347,90,347,90,,,,,384,55,402,55 +"2020-03-15","SC",,,0,,,,,0,,,154,44,,,,,,19,19,6,0,,,,,,,,0,173,50,,,,,,0,,0 +"2020-03-15","SD",,,0,,,,,0,,,327,145,,,,,,9,,0,0,,,,,10,,,0,95,45,,,,,336,145,95,45 +"2020-03-15","TN",,,0,,,,,0,,,,0,,,,,,39,,7,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-15","TX",,,0,,,,,0,,,,0,,,,,,56,56,34,0,,,,,361,,,0,4921,530,,,,,,0,4921,530 +"2020-03-15","UT",0,,0,,,,,0,,,657,276,,,662,,,28,,22,0,,,,,29,,,0,691,296,,,,,682,292,691,296 +"2020-03-15","VA",1,,1,,,,,0,,,,0,,,,,,45,,15,0,,1,,,2100,,6739,59,6739,59,,18,,,,0,,0 +"2020-03-15","VT",,,0,,,,,0,,,320,102,,,,,,8,8,3,0,,,,,,,,0,370,132,,,,,328,105,370,132 +"2020-03-15","WA",57,,6,,,,,0,,,,0,,,,,,1041,1041,214,0,,,,,,,20059,1743,20059,1743,,,,,19621,1689,,0 +"2020-03-15","WI",,,0,,,,,0,,,313,144,,,,,,37,33,14,0,,,,,,,577,271,577,271,,,,,,0,,0 +"2020-03-15","WV",0,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,5,3,,,,,,0,5,3 +"2020-03-15","WY",,,0,,,,,0,,,,0,,,166,,,3,3,1,0,,,,,12,,,0,178,27,,,,,,0,178,27 +"2020-03-14","AK",0,,0,,1,1,,0,,,,0,,,,,,,,0,0,,,,,,,,0,144,84,,,,,,0,144,84 +"2020-03-14","AL",,,0,,,,,0,,,22,11,,,,,,6,6,5,0,,,,,,,,0,28,16,,,,,28,16,,0 +"2020-03-14","AR",,,0,,,,,0,,,65,35,,,,,,12,12,3,0,,,,,,,,0,77,38,,,,,,0,77,38 +"2020-03-14","AZ",0,,0,,26,26,,4,,,121,27,,,,,,12,,3,0,,,,,,,,0,1291,478,,,,,133,30,1291,478 +"2020-03-14","CA",5,,1,,,,,0,,,916,0,,,,,,252,,50,0,,,,,,,,0,1168,50,,,,,,0,1168,50 +"2020-03-14","CO",1,,0,,,,,0,,,627,17,,,,,,131,,30,0,,,,,,,525,192,525,192,,,,,,0,,0 +"2020-03-14","CT",,,0,,,,,0,,,,0,,,392,,,11,,5,0,,,,,101,,,0,496,143,,,,,,0,496,143 +"2020-03-14","DC",,,0,,,,,0,,,,0,,,,,,10,,0,0,,,,,,,59,29,59,29,,,,,,0,,0 +"2020-03-14","DE",0,0,0,0,,,,0,,,36,6,,,,,,6,,2,0,,,,,0,,28,9,28,9,,,,,,0,,0 +"2020-03-14","FL",3,,1,,,,,0,,,478,0,,,,,,51,,20,0,,,,,,,704,199,704,199,,,,,,0,,0 +"2020-03-14","GA",1,,0,,,,,0,,,,0,,,,,,66,,24,0,,,,,41,,,0,466,130,,,,,,0,466,130 +"2020-03-14","HI",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,2,,28,7,28,7,,,,,,0,,0 +"2020-03-14","IA",,,0,,,,,0,,,83,0,,,,,,17,17,1,0,,,,,,,,0,100,1,,,,,,0,,0 +"2020-03-14","ID",,,0,,,,,0,,,174,43,,,,,,2,,2,0,,,,,,,,0,176,45,,,,,176,45,,0 +"2020-03-14","IL",,,0,,,,,0,,,,0,,,,,,46,,14,0,,,,,,,,0,708,264,,,,,,0,708,264 +"2020-03-14","IN",0,,0,,,,,0,,,74,13,,,,,,15,,3,0,,,,,51,,,0,675,264,,,,,,0,675,264 +"2020-03-14","KS",1,,1,,,,,0,,,93,0,,,,,,6,,0,0,,,,,,,,0,99,0,,,,,,0,,0 +"2020-03-14","KY",1,,1,,,,,0,,,,0,,,,,,14,,3,0,,,,,,,,0,153,35,,,,,,0,153,35 +"2020-03-14","LA",,,0,,,,,0,,,109,72,,,,,,51,51,15,0,,,,,,,,0,160,87,,,,,,0,,0 +"2020-03-14","MA",,,0,,,,,0,,,,0,,,,,,38,,15,0,,,,,308,,,0,3036,935,,,,,,0,3036,935 +"2020-03-14","MD",,,0,,,,,0,,,94,0,,,,,,26,26,9,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-14","ME",,,0,,,,,0,,,,0,,,,,,3,3,0,0,,,,,5,,,0,219,83,,,,,,0,219,83 +"2020-03-14","MI",1,0,0,1,,,,0,,,,0,,,41,,,1728,1717,367,0,,,,,35,,,0,76,27,,,,,,0,76,27 +"2020-03-14","MN",,,0,,,,,0,,,847,306,,,,,,90,90,28,0,,,,,,,937,334,937,334,,,,,,0,,0 +"2020-03-14","MO",0,,0,,,,,0,,,90,19,,,102,,,4,4,2,0,,,,,12,,,0,115,28,,,,,,0,115,28 +"2020-03-14","MS",,,0,,,,,0,,,84,43,,,,,,6,,2,0,,,,,,,,0,90,45,,,,,,0,,0 +"2020-03-14","MT",,,0,,,,,0,,,103,48,,,,,,5,,4,0,,,,,,,,0,108,52,,,,,,0,108,52 +"2020-03-14","NC",,,0,,,,,0,,,,0,,,,,,23,,8,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-14","ND",0,,0,,,,,0,,,54,15,,,,,,1,1,0,0,,,,,,,50,21,50,21,,,,,49,21,63,23 +"2020-03-14","NE",,,0,,,,,0,,,80,0,,,195,,,14,,1,0,,,,,3,,,0,217,13,,,,,,0,217,13 +"2020-03-14","NH",,,0,,,,,0,,,212,118,,,,,,7,,1,0,,,,,,,,0,319,70,,,,,,0,319,70 +"2020-03-14","NJ",1,1,0,0,,,,0,,,97,0,,,,,,78,78,21,0,,,,,,,,0,175,21,,,,,147,0,,0 +"2020-03-14","NM",,,0,,,,,0,,,482,245,,,,,,10,,4,0,,,,,,,,0,247,74,,,,,,0,247,74 +"2020-03-14","NV",0,,0,,,,,0,,,168,0,,,,,,34,34,12,0,,,,,,,1245,444,1245,444,,,,,,0,,0 +"2020-03-14","NY",,,0,,,,,0,,,,0,,,,,,517,,164,0,,,,,,,4126,1290,4126,1290,,,,,,0,,0 +"2020-03-14","OH",,,0,,,,,0,,,,0,,,,,,13,13,0,0,,,,,32,,,0,445,174,,,,,,0,445,174 +"2020-03-14","OK",,,0,,,,,0,,,36,0,,,,,,4,,1,0,,,,,,,,0,40,1,,,,,,0,,0 +"2020-03-14","OR",,,0,,,,,0,,,337,51,,,,,,30,,11,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-14","PA",,,0,,,,,0,,,205,65,,,,,,47,,6,0,,,,,,,393,175,393,175,,,,,252,71,,0 +"2020-03-14","RI",,,0,,,,,0,,,310,86,,,326,,,19,,0,0,,,,,21,,257,56,257,56,,,,,329,86,347,90 +"2020-03-14","SC",,,0,,,,,0,,,110,35,,,,,,13,13,1,0,,,,,,,,0,123,36,,,,,,0,,0 +"2020-03-14","SD",,,0,,,,,0,,,182,109,,,,,,9,,0,0,,,,,9,,,0,50,16,,,,,191,109,50,16 +"2020-03-14","TN",,,0,,,,,0,,,,0,,,,,,32,,6,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-14","TX",,,0,,,,,0,,,,0,,,,,,22,22,0,0,,,,,302,,,0,4391,960,,,,,,0,4391,960 +"2020-03-14","UT",,,0,,,,,0,,,381,166,,,383,,,6,,0,0,,,,,12,,,0,395,172,,,,,390,170,395,172 +"2020-03-14","VA",,,0,,,,,0,,,,0,,,,,,30,,0,0,,1,,,2098,,6680,79,6680,79,,18,,,,0,,0 +"2020-03-14","VT",,,0,,,,,0,,,218,86,,,,,,5,5,3,0,,,,,,,,0,238,89,,,,,223,89,238,89 +"2020-03-14","WA",51,,4,,,,,0,,,,0,,,,,,827,827,179,0,,,,,,,18316,2376,18316,2376,,,,,17932,2329,,0 +"2020-03-14","WI",,,0,,,,,0,,,169,0,,,,,,23,19,0,0,,,,,,,306,130,306,130,,,,,,0,,0 +"2020-03-14","WV",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,2,1,,,,,,0,2,1 +"2020-03-14","WY",,,0,,,,,0,,,,0,,,145,,,2,2,1,0,,,,,6,,,0,151,43,,,,,,0,151,43 +"2020-03-13","AK",0,,0,,1,1,,0,,,,0,,,,,,,,0,0,,,,,,,,0,60,14,,,,,,0,60,14 +"2020-03-13","AL",,,0,,,,,0,,,11,1,,,,,,1,1,1,0,,,,,,,,0,12,2,,,,,12,2,,0 +"2020-03-13","AR",,,0,,,,,0,,,30,6,,,,,,9,9,3,0,,,,,,,,0,39,9,,,,,,0,39,9 +"2020-03-13","AZ",0,,0,,22,22,,6,,,94,12,,,,,,9,,0,0,,,,,,,,0,813,391,,,,,103,12,813,391 +"2020-03-13","CA",4,,0,,,,,0,,,916,0,,,,,,202,,0,0,,,,,,,,0,1118,0,,,,,,0,1118,0 +"2020-03-13","CO",1,,1,,,,,0,,,610,86,,,,,,101,,29,0,,,,,,,333,135,333,135,,,,,,0,,0 +"2020-03-13","CT",,,0,,,,,0,,,,0,,,280,,,6,,0,0,,,,,70,,,0,353,97,,,,,,0,353,97 +"2020-03-13","DC",,,0,,,,,0,,,,0,,,,,,10,,0,0,,,,,,,30,0,30,0,,,,,,0,,0 +"2020-03-13","DE",0,0,0,0,,,,0,,,30,7,,,,,,4,,0,0,,,,,0,,19,7,19,7,,,,,,0,,0 +"2020-03-13","FL",2,,0,,,,,0,,,478,177,,,,,,31,,5,0,,,,,,,505,118,505,118,,,,,,0,,0 +"2020-03-13","GA",1,,1,,,,,0,,,,0,,,,,,42,,11,0,,,,,32,,,0,336,255,,,,,,0,336,255 +"2020-03-13","HI",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,2,,21,5,21,5,,,,,,0,,0 +"2020-03-13","IA",,,0,,,,,0,,,83,16,,,,,,16,16,2,0,,,,,,,,0,99,18,,,,,,0,,0 +"2020-03-13","ID",,,0,,,,,0,,,131,38,,,,,,0,,0,0,,,,,,,,0,131,38,,,,,131,38,,0 +"2020-03-13","IL",,,0,,,,,0,,,,0,,,,,,32,,7,0,,,,,,,,0,444,26,,,,,,0,444,26 +"2020-03-13","IN",,,0,,,,,0,,,61,9,,,,,,12,,0,0,,,,,30,,,0,411,210,,,,,,0,411,210 +"2020-03-13","KS",,,0,,,,,0,,,93,52,,,,,,6,,2,0,,,,,,,,0,99,54,,,,,,0,,0 +"2020-03-13","KY",,,0,,,,,0,,,,0,,,,,,11,,3,0,,,,,,,,0,118,54,,,,,,0,118,54 +"2020-03-13","LA",,,0,,,,,0,,,37,0,,,,,,36,36,22,0,,,,,,,,0,73,22,,,,,,0,,0 +"2020-03-13","MA",,,0,,,,,0,,,,0,,,,,,23,,15,0,,,,,234,,,0,2101,985,,,,,,0,2101,985 +"2020-03-13","MD",,,0,,,,,0,,,94,0,,,,,,17,17,5,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-13","ME",,,0,,,,,0,,,,0,,,,,,3,3,2,0,,,,,3,,,0,136,70,,,,,,0,136,70 +"2020-03-13","MI",1,0,0,1,,,,0,,,,0,,,23,,,1361,1353,364,0,,,,,26,,,0,49,21,,,,,,0,49,21 +"2020-03-13","MN",,,0,,,,,0,,,541,234,,,,,,62,62,19,0,,,,,,,603,253,603,253,,,,,,0,,0 +"2020-03-13","MO",,,0,,,,,0,,,71,7,,,76,,,2,2,1,0,,,,,11,,,0,87,22,,,,,,0,87,22 +"2020-03-13","MS",,,0,,,,,0,,,41,0,,,,,,4,,3,0,,,,,,,,0,45,3,,,,,,0,,0 +"2020-03-13","MT",,,0,,,,,0,,,55,21,,,,,,1,,0,0,,,,,,,,0,56,21,,,,,,0,56,21 +"2020-03-13","NC",,,0,,,,,0,,,,0,,,,,,15,,3,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-13","ND",0,,0,,,,,0,,,39,27,,,,,,1,1,0,0,,,,,,,29,12,29,12,,,,,28,12,40,14 +"2020-03-13","NE",,,0,,,,,0,,,80,0,,,185,,,13,,3,0,,,,,0,,,0,204,33,,,,,,0,204,33 +"2020-03-13","NH",,,0,,,,,0,,,94,0,,,,,,6,,0,0,,,,,,,,0,249,45,,,,,,0,249,45 +"2020-03-13","NJ",1,1,0,0,,,,0,,,97,23,,,,,,57,57,25,0,,,,,,,,0,154,48,,,,,147,43,,0 +"2020-03-13","NM",,,0,,,,,0,,,237,70,,,,,,6,,2,0,,,,,,,,0,173,44,,,,,,0,173,44 +"2020-03-13","NV",0,,0,,,,,0,,,168,0,,,,,,22,22,10,0,,,,,,,801,347,801,347,,,,,,0,,0 +"2020-03-13","NY",,,0,,,,,0,,,,0,,,,,,353,,102,0,,,,,,,2836,762,2836,762,,,,,,0,,0 +"2020-03-13","OH",,,0,,,,,0,,,,0,,,,,,13,13,8,0,,,,,20,,,0,271,128,,,,,,0,271,128 +"2020-03-13","OK",,,0,,,,,0,,,36,0,,,,,,3,,0,0,,,,,,,,0,39,0,,,,,,0,,0 +"2020-03-13","OR",,,0,,,,,0,,,286,0,,,,,,19,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-13","PA",,,0,,,,,0,,,140,24,,,,,,41,,19,0,,,,,,,218,73,218,73,,,,,181,43,,0 +"2020-03-13","RI",,,0,,,,,0,,,224,48,,,236,,,19,,6,0,,,,,21,,201,51,201,51,,,,,243,54,257,56 +"2020-03-13","SC",,,0,,,,,0,,,75,27,,,,,,12,12,2,0,,,,,,,,0,87,29,,,,,,0,,0 +"2020-03-13","SD",,,0,,,,,0,,,73,46,,,,,,9,,1,0,,,,,6,,,0,34,17,,,,,82,47,34,17 +"2020-03-13","TN",,,0,,,,,0,,,,0,,,,,,26,,8,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-13","TX",,,0,,,,,0,,,,0,,,,,,22,22,0,0,,,,,265,,,0,3431,655,,,,,,0,3431,655 +"2020-03-13","UT",,,0,,,,,0,,,215,89,,,217,,,6,,2,0,,,,,6,,,0,223,93,,,,,220,91,223,93 +"2020-03-13","VA",,,0,,,,,0,,,,0,,,,,,30,,13,0,,1,,,2095,,6601,85,6601,85,,18,,,,0,,0 +"2020-03-13","VT",,,0,,,,,0,,,132,44,,,,,,2,2,0,0,,,,,,,,0,149,50,,,,,134,44,149,50 +"2020-03-13","WA",47,,3,,,,,0,,,,0,,,,,,648,648,133,0,,,,,,,15940,4326,15940,4326,,,,,15603,4234,,0 +"2020-03-13","WI",,,0,,,,,0,,,169,85,,,,,,23,19,14,0,,,,,,,176,71,176,71,,,,,,0,,0 +"2020-03-13","WV",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,1,1,,,,,,0,1,1 +"2020-03-13","WY",,,0,,,,,0,,,,0,,,107,,,1,2,0,0,,,,,1,,,0,108,33,,,,,,0,108,33 +"2020-03-12","AK",0,,0,,1,1,,0,,,,0,,,,,,,,0,0,,,,,,,,0,46,0,,,,,,0,46,0 +"2020-03-12","AL",,,0,,,,,0,,,10,0,,,,,,0,0,0,0,,,,,,,,0,10,0,,,,,10,0,,0 +"2020-03-12","AR",,,0,,,,,0,,,24,12,,,,,,6,6,6,0,,,,,,,,0,30,18,,,,,,0,30,18 +"2020-03-12","AZ",,,0,,16,16,,5,,,82,23,,,,,,9,,0,0,,,,,,,,0,422,137,,,,,91,23,422,137 +"2020-03-12","CA",4,,4,,,,,0,,,916,0,,,,,,202,,45,0,,,,,,,,0,1118,45,,,,,,0,1118,45 +"2020-03-12","CO",,,0,,,,,0,,,524,226,,,,,,72,,27,0,,,,,,,198,128,198,128,,,,,,0,,0 +"2020-03-12","CT",,,0,,,,,0,,,,0,,,229,,,6,,3,0,,,,,25,,,0,256,61,,,,,,0,256,61 +"2020-03-12","DC",,,0,,,,,0,,,,0,,,,,,10,,5,0,,,,,,,30,5,30,5,,,,,,0,,0 +"2020-03-12","DE",0,0,0,0,,,,0,,,23,6,,,,,,4,,3,0,,,,,0,,12,2,12,2,,,,,,0,,0 +"2020-03-12","FL",2,,0,,,,,0,,,301,0,,,,,,26,,6,0,,,,,,,387,53,387,53,,,,,,0,,0 +"2020-03-12","GA",,,0,,,,,0,,,,0,,,,,,31,,9,0,,,,,7,,,0,81,37,,,,,,0,81,37 +"2020-03-12","HI",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,2,,16,1,16,1,,,,,,0,,0 +"2020-03-12","IA",,,0,,,,,0,,,67,21,,,,,,14,14,1,0,,,,,,,,0,81,22,,,,,,0,,0 +"2020-03-12","ID",,,0,,,,,0,,,93,26,,,,,,0,,0,0,,,,,,,,0,93,26,,,,,93,26,,0 +"2020-03-12","IL",,,0,,,,,0,,,,0,,,,,,25,,6,0,,,,,,,,0,418,51,,,,,,0,418,51 +"2020-03-12","IN",,,0,,,,,0,,,52,19,,,,,,12,,2,0,,,,,16,,,0,201,68,,,,,,0,201,68 +"2020-03-12","KS",,,0,,,,,0,,,41,0,,,,,,4,,3,0,,,,,,,,0,45,3,,,,,,0,,0 +"2020-03-12","KY",,,0,,,,,0,,,,0,,,,,,8,,0,0,,,,,,,,0,64,10,,,,,,0,64,10 +"2020-03-12","LA",,,0,,,,,0,,,37,0,,,,,,14,14,8,0,,,,,,,,0,51,8,,,,,,0,,0 +"2020-03-12","MA",,,0,,,,,0,,,,0,,,,,,8,,8,0,,,,,170,,,0,1116,432,,,,,,0,1116,432 +"2020-03-12","MD",,,0,,,,,0,,,94,0,,,,,,12,12,3,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-12","ME",,,0,,,,,0,,,,0,,,,,,1,1,1,0,,,,,0,,,0,66,23,,,,,,0,66,23 +"2020-03-12","MI",1,0,1,1,,,,0,,,,0,,,15,,,997,996,270,0,,,,,13,,,0,28,24,,,,,,0,28,24 +"2020-03-12","MN",,,0,,,,,0,,,307,90,,,,,,43,43,22,0,,,,,,,350,112,350,112,,,,,,0,,0 +"2020-03-12","MO",,,0,,,,,0,,,64,64,,,56,,,1,1,0,0,,,,,9,,,0,65,11,,,,,,0,65,11 +"2020-03-12","MS",,,0,,,,,0,,,41,21,,,,,,1,,1,0,,,,,,,,0,42,22,,,,,,0,,0 +"2020-03-12","MT",,,0,,,,,0,,,34,13,,,,,,1,,1,0,,,,,,,,0,35,14,,,,,,0,35,14 +"2020-03-12","NC",,,0,,,,,0,,,,0,,,,,,12,,5,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-12","ND",,,0,,,,,0,,,12,5,,,,,,1,1,1,0,,,,,,,17,8,17,8,,,,,16,8,26,12 +"2020-03-12","NE",,,0,,,,,0,,,80,33,,,152,,,10,,5,0,,,,,0,,,0,171,21,,,,,,0,171,21 +"2020-03-12","NH",,,0,,,,,0,,,94,56,,,,,,6,,2,0,,,,,,,,0,204,42,,,,,,0,204,42 +"2020-03-12","NJ",1,1,0,0,,,,0,,,74,17,,,,,,32,32,9,0,,,,,,,,0,106,26,,,,,104,23,,0 +"2020-03-12","NM",,,0,,,,,0,,,167,42,,,,,,4,,4,0,,,,,,,,0,129,42,,,,,,0,129,42 +"2020-03-12","NV",0,,0,,,,,0,,,168,0,,,,,,12,12,3,0,,,,,,,454,146,454,146,,,,,,0,,0 +"2020-03-12","NY",,,0,,,,,0,,,,0,,,,,,251,,56,0,,,,,,,2074,553,2074,553,,,,,,0,,0 +"2020-03-12","OH",,,0,,,,,0,,,,0,,,,,,5,5,1,0,,,,,16,,,0,143,81,,,,,,0,143,81 +"2020-03-12","OK",,,0,,,,,0,,,36,21,,,,,,3,,1,0,,,,,,,,0,39,22,,,,,,0,,0 +"2020-03-12","OR",,,0,,,,,0,,,286,73,,,,,,19,,4,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-12","PA",,,0,,,,,0,,,116,28,,,,,,22,,6,0,,,,,,,145,40,145,40,,,,,138,34,,0 +"2020-03-12","RI",,,0,,,,,0,,,176,37,,,186,,,13,,8,0,,,,,15,,150,34,150,34,,,,,189,45,201,51 +"2020-03-12","SC",,,0,,,,,0,,,48,16,,,,,,10,10,1,0,,,,,,,,0,58,17,,,,,,0,,0 +"2020-03-12","SD",,,0,,,,,0,,,27,14,,,,,,8,,3,0,,,,,3,,,0,17,17,,,,,35,17,17,17 +"2020-03-12","TN",,,0,,,,,0,,,,0,,,,,,18,,11,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-12","TX",,,0,,,,,0,,,,0,,,,,,22,22,4,0,,,,,239,,,0,2776,305,,,,,,0,2776,305 +"2020-03-12","UT",,,0,,,,,0,,,126,56,,,126,,,4,,2,0,,,,,4,,,0,130,58,,,,,129,57,130,58 +"2020-03-12","VA",,,0,,,,,0,,,,0,,,,,,17,,8,0,,1,,,2094,,6516,32,6516,32,,18,,,,0,,0 +"2020-03-12","VT",,,0,,,,,0,,,88,31,,,,,,2,2,1,0,,,,,,,,0,99,33,,,,,90,32,99,33 +"2020-03-12","WA",44,,4,,,,,0,,,,0,,,,,,515,515,110,0,,,,,,,11614,3809,11614,3809,,,,,11369,3764,,0 +"2020-03-12","WI",,,0,,,,,0,,,84,41,,,,,,9,8,6,0,,,,,,,105,46,105,46,,,,,,0,,0 +"2020-03-12","WV",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-12","WY",,,0,,,,,0,,,,0,,,74,,,1,1,1,0,,,,,1,,,0,75,38,,,,,,0,75,38 +"2020-03-11","AK",0,,0,,1,1,,0,,,,0,,,,,,,,0,0,,,,,,,,0,46,23,,,,,,0,46,23 +"2020-03-11","AL",,,0,,,,,0,,,10,10,,,,,,0,0,0,0,,,,,,,,0,10,10,,,,,10,10,,0 +"2020-03-11","AR",,,0,,,,,0,,,12,0,,,,,,0,0,0,0,,,,,,,,0,12,0,,,,,,0,12,0 +"2020-03-11","AZ",,,0,,11,11,,3,,,59,8,,,,,,9,,3,0,,,,,,,,0,285,63,,,,,68,11,285,63 +"2020-03-11","CA",,,0,,,,,0,,,916,226,,,,,,157,,24,0,,,,,,,,0,1073,250,,,,,,0,1073,250 +"2020-03-11","CO",,,0,,,,,0,,,298,47,,,,,,45,,17,0,,,,,,,70,70,70,70,,,,,,0,,0 +"2020-03-11","CT",,,0,,,,,0,,,,0,,,179,,,3,,1,0,,,,,14,,,0,195,27,,,,,,0,195,27 +"2020-03-11","DC",,,0,,,,,0,,,,0,,,,,,5,,0,0,,,,,,,25,3,25,3,,,,,,0,,0 +"2020-03-11","DE",0,0,0,0,,,,0,,,17,0,,,,,,1,,1,0,,,,,0,,10,10,10,10,,,,,,0,,0 +"2020-03-11","FL",2,,2,,,,,0,,,301,79,,,,,,20,,2,0,,,,,,,334,71,334,71,,,,,,0,,0 +"2020-03-11","GA",,,0,,,,,0,,,,0,,,,,,22,,5,0,,,,,4,,,0,44,15,,,,,,0,44,15 +"2020-03-11","HI",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,2,,15,3,15,3,,,,,,0,,0 +"2020-03-11","IA",,,0,,,,,0,,,46,14,,,,,,13,13,5,0,,,,,,,,0,59,19,,,,,,0,,0 +"2020-03-11","ID",,,0,,,,,0,,,67,26,,,,,,0,,0,0,,,,,,,,0,67,26,,,,,67,26,,0 +"2020-03-11","IL",,,0,,,,,0,,,,0,,,,,,19,,0,0,,,,,,,,0,367,41,,,,,,0,367,41 +"2020-03-11","IN",,,0,,,,,0,,,33,3,,,,,,10,,4,0,,,,,10,,,0,133,58,,,,,,0,133,58 +"2020-03-11","KS",,,0,,,,,0,,,41,24,,,,,,1,,0,0,,,,,,,,0,42,24,,,,,,0,,0 +"2020-03-11","KY",,,0,,,,,0,,,,0,,,,,,8,,2,0,,,,,,,,0,54,20,,,,,,0,54,20 +"2020-03-11","LA",,,0,,,,,0,,,37,26,,,,,,6,6,5,0,,,,,,,,0,43,31,,,,,,0,,0 +"2020-03-11","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,141,,,0,684,182,,,,,,0,684,182 +"2020-03-11","MD",,,0,,,,,0,,,94,5,,,,,,9,9,3,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-11","ME",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,0,,,0,43,43,,,,,,0,43,43 +"2020-03-11","MI",0,0,0,0,,,,0,,,,0,,,2,,,727,727,199,0,,,,,2,,,0,4,1,,,,,,0,4,1 +"2020-03-11","MN",,,0,,,,,0,,,217,85,,,,,,21,21,10,0,,,,,,,238,95,238,95,,,,,,0,,0 +"2020-03-11","MO",,,0,,,,,0,,,,0,,,46,,,1,1,0,0,,,,,8,,,0,54,12,,,,,,0,54,12 +"2020-03-11","MS",,,0,,,,,0,,,20,20,,,,,,0,,0,0,,,,,,,,0,20,20,,,,,,0,,0 +"2020-03-11","MT",,,0,,,,,0,,,21,6,,,,,,0,,0,0,,,,,,,,0,21,6,,,,,,0,21,6 +"2020-03-11","NC",,,0,,,,,0,,,,0,,,,,,7,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-11","ND",,,0,,,,,0,,,7,1,,,,,,0,0,0,0,,,,,,,9,2,9,2,,,,,8,1,14,2 +"2020-03-11","NE",,,0,,,,,0,,,47,0,,,134,,,5,,2,0,,,,,0,,,0,150,34,,,,,,0,150,34 +"2020-03-11","NH",,,0,,,,,0,,,38,0,,,,,,4,,0,0,,,,,,,,0,162,44,,,,,,0,162,44 +"2020-03-11","NJ",1,1,1,0,,,,0,,,57,13,,,,,,23,23,7,0,,,,,,,,0,80,20,,,,,81,22,,0 +"2020-03-11","NM",,,0,,,,,0,,,125,38,,,,,,0,,0,0,,,,,,,,0,87,30,,,,,,0,87,30 +"2020-03-11","NV",0,,0,,,,,0,,,168,154,,,,,,9,9,4,0,,,,,,,308,107,308,107,,,,,,0,,0 +"2020-03-11","NY",,,0,,,,,0,,,,0,,,,,,195,,44,0,,,,,,,1521,425,1521,425,,,,,,0,,0 +"2020-03-11","OH",,,0,,,,,0,,,,0,,,,,,4,4,1,0,,,,,6,,,0,62,43,,,,,,0,62,43 +"2020-03-11","OK",,,0,,,,,0,,,15,0,,,,,,2,,0,0,,,,,,,,0,17,0,,,,,,0,,0 +"2020-03-11","OR",,,0,,,,,0,,,213,48,,,,,,15,,1,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-11","PA",,,0,,,,,0,,,88,88,,,,,,16,,4,0,,,,,,,105,33,105,33,,,,,104,104,,0 +"2020-03-11","RI",,,0,,,,,0,,,139,34,,,144,,,5,,0,0,,,,,6,,116,27,116,27,,,,,144,34,150,34 +"2020-03-11","SC",,,0,,,,,0,,,32,8,,,,,,9,9,2,0,,,,,,,,0,41,10,,,,,,0,,0 +"2020-03-11","SD",,,0,,,,,0,,,13,2,,,,,,5,,5,0,,,,,,,,0,,0,,,,,18,7,,0 +"2020-03-11","TN",,,0,,,,,0,,,,0,,,,,,7,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-11","TX",,,0,,,,,0,,,,0,,,,,,18,18,3,0,,,,,215,,,0,2471,135,,,,,,0,2471,135 +"2020-03-11","UT",,,0,,,,,0,,,70,26,,,70,,,2,,0,0,,,,,2,,,0,72,26,,,,,72,26,72,26 +"2020-03-11","VA",,,0,,,,,0,,,,0,,,,,,9,,1,0,,1,,,2092,,6484,11,6484,11,,18,,,,0,,0 +"2020-03-11","VT",,,0,,,,,0,,,57,23,,,,,,1,1,0,0,,,,,,,,0,66,28,,,,,58,23,66,28 +"2020-03-11","WA",40,,3,,,,,0,,,,0,,,,,,405,405,62,0,,,,,,,7805,2319,7805,2319,,,,,7605,2267,,0 +"2020-03-11","WI",,,0,,,,,0,,,43,7,,,,,,3,3,1,0,,,,,,,59,19,59,19,,,,,,0,,0 +"2020-03-11","WV",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-11","WY",,,0,,,,,0,,,,0,,,37,,,0,,0,0,,,,,0,,,0,37,11,,,,,,0,37,11 +"2020-03-10","AK",0,,0,,1,1,,0,,,,0,,,,,,,,0,0,,,,,,,,0,23,0,,,,,,0,23,0 +"2020-03-10","AL",,,0,,,,,0,,,0,0,,,,,,0,0,0,0,,,,,,,,0,0,0,,,,,0,0,,0 +"2020-03-10","AR",,,0,,,,,0,,,12,0,,,,,,0,0,0,0,,,,,,,,0,12,0,,,,,,0,12,0 +"2020-03-10","AZ",,,0,,8,8,,0,,,51,7,,,,,,6,,1,0,,,,,,,,0,222,75,,,,,57,8,222,75 +"2020-03-10","CA",,,0,,,,,0,,,690,0,,,,,,133,,19,0,,,,,,,,0,823,19,,,,,,0,823,19 +"2020-03-10","CO",,,0,,,,,0,,,251,109,,,,,,28,,16,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-10","CT",,,0,,,,,0,,,,0,,,158,,,2,,1,0,,,,,8,,,0,168,46,,,,,,0,168,46 +"2020-03-10","DC",,,0,,,,,0,,,,0,,,,,,5,,4,0,,,,,,,22,7,22,7,,,,,,0,,0 +"2020-03-10","DE",0,0,0,0,,,,0,,,17,2,,,,,,0,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-10","FL",,,0,,,,,0,,,222,82,,,,,,18,,5,0,,,,,,,263,84,263,84,,,,,,0,,0 +"2020-03-10","GA",,,0,,,,,0,,,,0,,,,,,17,,5,0,,,,,2,,,0,29,23,,,,,,0,29,23 +"2020-03-10","HI",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,2,,12,1,12,1,,,,,,0,,0 +"2020-03-10","IA",,,0,,,,,0,,,32,6,,,,,,8,8,5,0,,,,,,,,0,40,11,,,,,,0,,0 +"2020-03-10","ID",,,0,,,,,0,,,41,0,,,,,,0,,0,0,,,,,,,,0,41,0,,,,,41,0,,0 +"2020-03-10","IL",,,0,,,,,0,,,,0,,,,,,19,,12,0,,,,,,,,0,326,326,,,,,,0,326,326 +"2020-03-10","IN",,,0,,,,,0,,,30,30,,,,,,6,,4,0,,,,,9,,,0,75,33,,,,,,0,75,33 +"2020-03-10","KS",,,0,,,,,0,,,17,6,,,,,,1,,0,0,,,,,,,,0,18,6,,,,,,0,,0 +"2020-03-10","KY",,,0,,,,,0,,,,0,,,,,,6,,2,0,,,,,,,,0,34,13,,,,,,0,34,13 +"2020-03-10","LA",,,0,,,,,0,,,11,6,,,,,,1,1,0,0,,,,,,,,0,12,6,,,,,,0,,0 +"2020-03-10","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,118,,,0,502,109,,,,,,0,502,109 +"2020-03-10","MD",,,0,,,,,0,,,89,16,,,,,,6,6,1,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-10","ME",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-10","MI",0,0,0,0,,,,0,,,,0,,,1,,,528,528,156,0,,,,,2,,,0,3,3,,,,,,0,3,3 +"2020-03-10","MN",,,0,,,,,0,,,132,52,,,,,,11,11,6,0,,,,,,,143,58,143,58,,,,,,0,,0 +"2020-03-10","MO",,,0,,,,,0,,,,0,,,34,,,1,1,0,0,,,,,8,,,0,42,6,,,,,,0,42,6 +"2020-03-10","MS",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-10","MT",,,0,,,,,0,,,15,4,,,,,,0,,0,0,,,,,,,,0,15,4,,,,,,0,15,4 +"2020-03-10","NC",,,0,,,,,0,,,,0,,,,,,7,,5,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-10","ND",,,0,,,,,0,,,6,6,,,,,,0,0,0,0,,,,,,,7,7,7,7,,,,,7,7,12,12 +"2020-03-10","NE",,,0,,,,,0,,,47,11,,,102,,,3,,0,0,,,,,0,,,0,116,15,,,,,,0,116,15 +"2020-03-10","NH",,,0,,,,,0,,,38,0,,,,,,4,,0,0,,,,,,,,0,118,25,,,,,,0,118,25 +"2020-03-10","NJ",0,,0,0,,,,0,,,44,9,,,,,,16,16,1,0,,,,,,,,0,60,10,,,,,59,13,,0 +"2020-03-10","NM",,,0,,,,,0,,,87,30,,,,,,0,,0,0,,,,,,,,0,57,0,,,,,,0,57,0 +"2020-03-10","NV",0,,0,,,,,0,,,14,0,,,,,,5,5,0,0,,,,,,,201,75,201,75,,,,,,0,,0 +"2020-03-10","NY",,,0,,,,,0,,,,0,,,,,,151,,63,0,,,,,,,1096,401,1096,401,,,,,,0,,0 +"2020-03-10","OH",,,0,,,,,0,,,,0,,,,,,3,3,0,0,,,,,0,,,0,19,11,,,,,,0,19,11 +"2020-03-10","OK",,,0,,,,,0,,,15,7,,,,,,2,,1,0,,,,,,,,0,17,8,,,,,,0,,0 +"2020-03-10","OR",,,0,,,,,0,,,165,65,,,,,,14,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-10","PA",,,0,,,,,0,,,,0,,,,,,12,,2,0,,,,,,,72,16,72,16,,,,,,0,,0 +"2020-03-10","RI",,,0,,,,,0,,,105,23,,,110,,,5,,1,0,,,,,6,,89,16,89,16,,,,,110,24,116,27 +"2020-03-10","SC",,,0,,,,,0,,,24,0,,,,,,7,7,0,0,,,,,,,,0,31,0,,,,,,0,,0 +"2020-03-10","SD",,,0,,,,,0,,,11,6,,,,,,0,,0,0,,,,,,,,0,,0,,,,,11,6,,0 +"2020-03-10","TN",,,0,,,,,0,,,,0,,,,,,7,,4,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-10","TX",,,0,,,,,0,,,,0,,,,,,15,15,3,0,,,,,209,,,0,2336,50,,,,,,0,2336,50 +"2020-03-10","UT",,,0,,,,,0,,,44,11,,,44,,,2,,1,0,,,,,2,,,0,46,12,,,,,46,12,46,12 +"2020-03-10","VA",,,0,,,,,0,,,,0,,,,,,8,,5,0,,1,,,2092,,6473,10,6473,10,,18,,,,0,,0 +"2020-03-10","VT",,,0,,,,,0,,,34,6,,,,,,1,1,0,0,,,,,,,,0,38,7,,,,,35,6,38,7 +"2020-03-10","WA",37,,2,,,,,0,,,,0,,,,,,343,343,61,0,,,,,,,5486,1813,5486,1813,,,,,5338,1784,,0 +"2020-03-10","WI",,,0,,,,,0,,,36,0,,,,,,2,2,1,0,,,,,,,40,9,40,9,,,,,,0,,0 +"2020-03-10","WV",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-10","WY",,,0,,,,,0,,,0,0,,,26,,,0,,0,0,,,,,0,,,0,26,7,,,,,,0,26,7 +"2020-03-09","AK",0,,0,,1,1,,1,,,,0,,,,,,,,0,0,,,,,,,,0,23,9,,,,,,0,23,9 +"2020-03-09","AL",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,0,0,,,,,0,0,,0 +"2020-03-09","AR",,,0,,,,,0,,,12,6,,,,,,0,0,0,0,,,,,,,,0,12,6,,,,,,0,12,6 +"2020-03-09","AZ",,,0,,8,8,,2,,,44,0,,,,,,5,,0,0,,,,,,,,0,147,17,,,,,49,0,147,17 +"2020-03-09","CA",,,0,,,,,0,,,690,228,,,,,,114,,26,0,,,,,,,,0,804,254,,,,,,0,804,254 +"2020-03-09","CO",,,0,,,,,0,,,142,9,,,,,,12,,3,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-09","CT",,,0,,,,,0,,,,0,,,116,,,1,,0,0,,,,,4,,,0,122,35,,,,,,0,122,35 +"2020-03-09","DC",,,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,,,15,4,15,4,,,,,,0,,0 +"2020-03-09","DE",0,0,0,0,,,,0,,,15,5,,,,,,0,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-09","FL",,,0,,,,,0,,,140,22,,,,,,13,,1,0,,,,,,,179,36,179,36,,,,,,0,,0 +"2020-03-09","GA",,,0,,,,,0,,,,0,,,,,,12,,5,0,,,,,1,,,0,6,6,,,,,,0,6,6 +"2020-03-09","HI",,,0,,,,,0,,,,0,,,,,,2,,1,0,,,,,1,,11,2,11,2,,,,,,0,,0 +"2020-03-09","IA",,,0,,,,,0,,,26,11,,,,,,3,3,3,0,,,,,,,,0,29,14,,,,,,0,,0 +"2020-03-09","ID",,,0,,,,,0,,,41,14,,,,,,0,,0,0,,,,,,,,0,41,14,,,,,41,14,,0 +"2020-03-09","IL",,,0,,,,,0,,,,0,,,,,,7,,1,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-09","IN",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,3,,,0,42,9,,,,,,0,42,9 +"2020-03-09","KS",,,0,,,,,0,,,11,0,,,,,,1,,0,0,,,,,,,,0,12,0,,,,,,0,,0 +"2020-03-09","KY",,,0,,,,,0,,,,0,,,,,,4,,3,0,,,,,,,,0,21,7,,,,,,0,21,7 +"2020-03-09","LA",,,0,,,,,0,,,5,0,,,,,,1,1,1,0,,,,,,,,0,6,1,,,,,,0,,0 +"2020-03-09","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,104,,,0,393,81,,,,,,0,393,81 +"2020-03-09","MD",,,0,,,,,0,,,73,21,,,,,,5,5,2,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-09","ME",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-09","MI",,0,0,0,,,,0,,,,0,,,,,,372,372,121,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-09","MN",,,0,,,,,0,,,80,32,,,,,,5,5,3,0,,,,,,,85,35,85,35,,,,,,0,,0 +"2020-03-09","MO",,,0,,,,,0,,,,0,,,29,,,1,1,0,0,,,,,7,,,0,36,5,,,,,,0,36,5 +"2020-03-09","MS",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-09","MT",,,0,,,,,0,,,11,0,,,,,,0,,0,0,,,,,,,,0,11,0,,,,,,0,11,0 +"2020-03-09","NC",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-09","ND",,,0,,,,,0,,,0,0,,,,,,,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-09","NE",,,0,,,,,0,,,36,19,,,88,,,3,,2,0,,,,,0,,,0,101,9,,,,,,0,101,9 +"2020-03-09","NH",,,0,,,,,0,,,38,0,,,,,,4,,0,0,,,,,,,,0,93,17,,,,,,0,93,17 +"2020-03-09","NJ",0,,0,0,,,,0,,,35,4,,,,,,15,15,9,0,,,,,,,,0,50,13,,,,,46,9,,0 +"2020-03-09","NM",,,0,,,,,0,,,57,0,,,,,,0,,0,0,,,,,,,,0,57,11,,,,,,0,57,11 +"2020-03-09","NV",0,,0,,,,,0,,,14,0,,,,,,5,5,1,0,,,,,,,126,23,126,23,,,,,,0,,0 +"2020-03-09","NY",,,0,,,,,0,,,,0,,,,,,88,,28,0,,,,,,,695,307,695,307,,,,,,0,,0 +"2020-03-09","OH",,,0,,,,,0,,,,0,,,,,,3,3,3,0,,,,,0,,,0,8,2,,,,,,0,8,2 +"2020-03-09","OK",,,0,,,,,0,,,8,0,,,,,,1,,0,0,,,,,,,,0,9,0,,,,,,0,,0 +"2020-03-09","OR",,,0,,,,,0,,,100,23,,,,,,14,,7,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-09","PA",,,0,,,,,0,,,,0,,,,,,10,,4,0,,,,,,,56,17,56,17,,,,,,0,,0 +"2020-03-09","RI",,,0,,,,,0,,,82,15,,,85,,,4,,1,0,,,,,4,,73,18,73,18,,,,,86,16,89,16 +"2020-03-09","SC",,,0,,,,,0,,,24,16,,,,,,7,7,5,0,,,,,,,,0,31,21,,,,,,0,,0 +"2020-03-09","SD",,,0,,,,,0,,,5,0,,,,,,0,,0,0,,,,,,,,0,,0,,,,,5,0,,0 +"2020-03-09","TN",,,0,,,,,0,,,,0,,,,,,3,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-09","TX",,,0,,,,,0,,,,0,,,,,,12,12,7,0,,,,,203,,,0,2286,18,,,,,,0,2286,18 +"2020-03-09","UT",,,0,,,,,0,,,33,7,,,33,,,1,,0,0,,,,,1,,,0,34,7,,,,,34,7,34,7 +"2020-03-09","VA",,,0,,,,,0,,,,0,,,,,,3,,1,0,,1,,,2092,,6463,1,6463,1,,18,,,,0,,0 +"2020-03-09","VT",,,0,,,,,0,,,28,5,,,,,,1,1,0,0,,,,,,,,0,31,5,,,,,29,5,31,5 +"2020-03-09","WA",35,,4,,,,,0,,,,0,,,,,,282,282,38,0,,,,,,,3673,1041,3673,1041,,,,,3554,1024,,0 +"2020-03-09","WI",,,0,,,,,0,,,36,5,,,,,,1,1,0,0,,,,,,,31,0,31,0,,,,,,0,,0 +"2020-03-09","WV",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-09","WY",,,0,,,,,0,,,,0,,,19,,,0,,0,0,,,,,0,,,0,19,10,,,,,,0,19,10 +"2020-03-08","AK",0,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,14,2,,,,,,0,14,2 +"2020-03-08","AL",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,0,0,,,,,0,0,,0 +"2020-03-08","AR",,,0,,,,,0,,,6,0,,,,,,0,0,0,0,,,,,,,,0,6,0,,,,,,0,6,0 +"2020-03-08","AZ",,,0,,6,6,,0,,,44,0,,,,,,5,,0,0,,,,,,,,0,130,13,,,,,49,0,130,13 +"2020-03-08","CA",,,0,,,,,0,,,462,0,,,,,,88,,19,0,,,,,,,,0,550,19,,,,,,0,550,19 +"2020-03-08","CO",,,0,,,,,0,,,133,29,,,,,,9,,1,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-08","CT",,,0,,,,,0,,,,0,,,83,,,1,,1,0,,,,,2,,,0,87,23,,,,,,0,87,23 +"2020-03-08","DC",,,0,,,,,0,,,,0,,,,,,1,,1,0,,,,,,,11,3,11,3,,,,,,0,,0 +"2020-03-08","DE",0,0,0,0,,,,0,,,10,0,,,,,,0,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-08","FL",,,0,,,,,0,,,118,18,,,,,,12,,4,0,,,,,,,143,27,143,27,,,,,,0,,0 +"2020-03-08","GA",,,0,,,,,0,,,,0,,,,,,7,,1,0,,,,,0,,,0,0,0,,,,,,0,0,0 +"2020-03-08","HI",,,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,1,,9,2,9,2,,,,,,0,,0 +"2020-03-08","IA",,,0,,,,,0,,,15,0,,,,,,0,0,0,0,,,,,,,,0,15,0,,,,,,0,,0 +"2020-03-08","ID",,,0,,,,,0,,,27,0,,,,,,0,,0,0,,,,,,,,0,27,0,,,,,27,0,,0 +"2020-03-08","IL",,,0,,,,,0,,,,0,,,,,,6,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-08","IN",,,0,,,,,0,,,,0,,,,,,2,,1,0,,,,,1,,,0,33,6,,,,,,0,33,6 +"2020-03-08","KS",,,0,,,,,0,,,11,0,,,,,,1,,1,0,,,,,,,,0,12,1,,,,,,0,,0 +"2020-03-08","KY",,,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,,,,0,14,4,,,,,,0,14,4 +"2020-03-08","LA",,,0,,,,,0,,,5,5,,,,,,0,0,0,0,,,,,,,,0,5,5,,,,,,0,,0 +"2020-03-08","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,97,,,0,312,61,,,,,,0,312,61 +"2020-03-08","MD",,,0,,,,,0,,,52,11,,,,,,3,3,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-08","ME",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-08","MI",,0,0,0,,,,0,,,,0,,,,,,251,251,63,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-08","MN",,,0,,,,,0,,,48,0,,,,,,2,2,0,0,,,,,,,50,0,50,0,,,,,,0,,0 +"2020-03-08","MO",,,0,,,,,0,,,,0,,,24,,,1,1,1,0,,,,,7,,,0,31,8,,,,,,0,31,8 +"2020-03-08","MS",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-08","MT",,,0,,,,,0,,,11,0,,,,,,0,,0,0,,,,,,,,0,11,0,,,,,,0,11,0 +"2020-03-08","NC",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-08","ND",,,0,,,,,0,,,0,0,,,,,,,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-08","NE",,,0,,,,,0,,,17,0,,,81,,,1,,0,0,,,,,0,,,0,92,13,,,,,,0,92,13 +"2020-03-08","NH",,,0,,,,,0,,,38,18,,,,,,4,,2,0,,,,,,,,0,76,30,,,,,,0,76,30 +"2020-03-08","NJ",0,,0,0,,,,0,,,31,31,,,,,,6,6,2,0,,,,,,,,0,37,33,,,,,37,33,,0 +"2020-03-08","NM",,,0,,,,,0,,,57,11,,,,,,0,,0,0,,,,,,,,0,46,36,,,,,,0,46,36 +"2020-03-08","NV",0,,0,,,,,0,,,14,0,,,,,,4,4,0,0,,,,,,,103,30,103,30,,,,,,0,,0 +"2020-03-08","NY",,,0,,,,,0,,,,0,,,,,,60,,24,0,,,,,,,388,200,388,200,,,,,,0,,0 +"2020-03-08","OH",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,0,,,0,6,1,,,,,,0,6,1 +"2020-03-08","OK",,,0,,,,,0,,,8,8,,,,,,1,,0,0,,,,,,,,0,9,8,,,,,,0,,0 +"2020-03-08","OR",,,0,,,,,0,,,77,13,,,,,,7,,4,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-08","PA",,,0,,,,,0,,,,0,,,,,,6,,2,0,,,,,,,39,12,39,12,,,,,,0,,0 +"2020-03-08","RI",,,0,,,,,0,,,67,18,,,70,,,3,,0,0,,,,,3,,55,19,55,19,,,,,70,18,73,18 +"2020-03-08","SC",,,0,,,,,0,,,8,0,,,,,,2,2,0,0,,,,,,,,0,10,0,,,,,,0,,0 +"2020-03-08","SD",,,0,,,,,0,,,5,0,,,,,,0,,0,0,,,,,,,,0,,0,,,,,5,0,,0 +"2020-03-08","TN",,,0,,,,,0,,,,0,,,,,,3,,2,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-08","TX",,,0,,,,,0,,,,0,,,,,,5,5,0,0,,,,,202,,,0,2268,8,,,,,,0,2268,8 +"2020-03-08","UT",,,0,,,,,0,,,26,11,,,26,,,1,,0,0,,,,,1,,,0,27,11,,,,,27,11,27,11 +"2020-03-08","VA",,,0,,,,,0,,,,0,,,,,,2,,2,0,,1,,,2092,,6462,5,6462,5,,18,,,,0,,0 +"2020-03-08","VT",,,0,,,,,0,,,23,23,,,,,,1,1,1,0,,,,,,,,0,26,9,,,,,24,24,26,9 +"2020-03-08","WA",31,,4,,,,,0,,,,0,,,,,,244,244,38,0,,,,,,,2632,540,2632,540,,,,,2530,523,,0 +"2020-03-08","WI",,,0,,,,,0,,,31,0,,,,,,1,1,0,0,,,,,,,31,0,31,0,,,,,,0,,0 +"2020-03-08","WV",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-08","WY",,,0,,,,,0,,,,0,,,9,,,0,,0,0,,,,,0,,,0,9,1,,,,,,0,9,1 +"2020-03-07","AK",0,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,12,4,,,,,,0,12,4 +"2020-03-07","AL",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,0,0,,,,,0,0,,0 +"2020-03-07","AR",,,0,,,,,0,,,6,0,,,,,,0,0,0,0,,,,,,,,0,6,0,,,,,,0,6,0 +"2020-03-07","AZ",,,0,,6,6,,0,,,44,11,,,,,,5,,2,0,,,,,,,,0,117,37,,,,,49,13,117,37 +"2020-03-07","CA",,,0,,,,,0,,,462,0,,,,,,69,,9,0,,,,,,,,0,531,9,,,,,,0,531,9 +"2020-03-07","CO",,,0,,,,,0,,,104,49,,,,,,8,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-07","CT",,,0,,,,,0,,,,0,,,60,,,0,,0,0,,,,,2,,,0,64,13,,,,,,0,64,13 +"2020-03-07","DC",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,8,0,8,0,,,,,,0,,0 +"2020-03-07","DE",,,0,,,,,0,,,10,0,,,,,,0,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-07","FL",,,0,,,,,0,,,100,45,,,,,,8,,0,0,,,,,,,116,48,116,48,,,,,,0,,0 +"2020-03-07","GA",,,0,,,,,0,,,,0,,,,,,6,,4,0,,,,,0,,,0,0,0,,,,,,0,0,0 +"2020-03-07","HI",,,0,,,,,0,,,,0,,,,,,1,,1,0,,,,,0,,7,0,7,0,,,,,,0,,0 +"2020-03-07","IA",,,0,,,,,0,,,15,0,,,,,,0,0,0,0,,,,,,,,0,15,0,,,,,,0,,0 +"2020-03-07","ID",,,0,,,,,0,,,27,0,,,,,,0,,0,0,,,,,,,,0,27,0,,,,,27,27,,0 +"2020-03-07","IL",,,0,,,,,0,,,,0,,,,,,6,,1,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-07","IN",,,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,0,,,0,27,8,,,,,,0,27,8 +"2020-03-07","KS",,,0,,,,,0,,,11,7,,,,,,0,,0,0,,,,,,,,0,11,7,,,,,,0,,0 +"2020-03-07","KY",,,0,,,,,0,,,,0,,,,,,1,,1,0,,,,,,,,0,10,3,,,,,,0,10,3 +"2020-03-07","LA",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-07","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,77,,,0,251,100,,,,,,0,251,100 +"2020-03-07","MD",,,0,,,,,0,,,41,15,,,,,,3,3,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-07","ME",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-07","MI",,0,0,0,,,,0,,,,0,,,,,,188,188,48,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-07","MN",,,0,,,,,0,,,48,12,,,,,,2,2,1,0,,,,,,,50,13,50,13,,,,,,0,,0 +"2020-03-07","MO",,,0,,,,,0,,,,0,,,17,,,0,0,0,0,,,,,6,,,0,23,0,,,,,,0,23,23 +"2020-03-07","MS",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-07","MT",,,0,,,,,0,,,11,0,,,,,,0,,0,0,,,,,,,,0,11,0,,,,,,0,11,11 +"2020-03-07","NC",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-07","ND",,,0,,,,,0,,,0,0,,,,,,,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-07","NE",,,0,,,,,0,,,17,0,,,69,,,1,,1,0,,,,,0,,,0,79,7,,,,,,0,79,7 +"2020-03-07","NH",,,0,,,,,0,,,20,0,,,,,,2,,0,0,,,,,,,,0,46,9,,,,,,0,46,9 +"2020-03-07","NJ",0,,0,0,,,,0,,,,0,,,,,,4,4,0,0,,,,,,,,0,4,0,,,,,4,3,,0 +"2020-03-07","NM",,,0,,,,,0,,,46,36,,,,,,0,,0,0,,,,,,,,0,10,0,,,,,,0,10,0 +"2020-03-07","NV",0,,0,,,,,0,,,14,0,,,,,,4,4,1,0,,,,,,,73,25,73,25,,,,,,0,,0 +"2020-03-07","NY",,,0,,,,,0,,,,0,,,,,,36,,11,0,,,,,,,188,66,188,66,,,,,,0,,0 +"2020-03-07","OH",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,0,,,0,5,2,,,,,,0,5,2 +"2020-03-07","OK",,,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,,,,0,1,0,,,,,,0,,0 +"2020-03-07","OR",,,0,,,,,0,,,64,19,,,,,,3,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-07","PA",,,0,,,,,0,,,,0,,,,,,4,,2,0,,,,,,,27,16,27,16,,,,,,0,,0 +"2020-03-07","RI",,,0,,,,,0,,,49,19,,,52,,,3,,0,0,,,,,3,,36,13,36,13,,,,,52,19,55,19 +"2020-03-07","SC",,,0,,,,,0,,,8,3,,,,,,2,2,2,0,,,,,,,,0,10,5,,,,,,0,,0 +"2020-03-07","SD",,,0,,,,,0,,,5,0,,,,,,0,,0,0,,,,,,,,0,,0,,,,,5,5,,0 +"2020-03-07","TN",,,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-07","TX",,,0,,,,,0,,,,0,,,,,,5,5,0,0,,,,,201,,,0,2260,24,,,,,,0,2260,24 +"2020-03-07","UT",,,0,,,,,0,,,15,0,,,15,,,1,,0,0,,,,,1,,,0,16,0,,,,,16,16,16,16 +"2020-03-07","VA",,,0,,,,,0,,,,0,,,,,,0,,0,0,,1,,,2092,,6457,2,6457,2,,18,,,,0,,0 +"2020-03-07","VT",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,17,7,,,,,,0,17,7 +"2020-03-07","WA",27,,1,,,,,0,,,,0,,,,,,206,206,51,0,,,,,,,2092,425,2092,425,,,,,2007,403,,0 +"2020-03-07","WI",,,0,,,,,0,,,31,0,,,,,,1,1,0,0,,,,,,,31,10,31,10,,,,,,0,,0 +"2020-03-07","WV",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-07","WY",,,0,,,,,0,,,,0,,,8,,,0,,0,0,,,,,0,,,0,8,0,,,,,,0,8,0 +"2020-03-06","AK",0,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,8,0,,,,,,0,8,8 +"2020-03-06","AR",,,0,,,,,0,,,6,0,,,,,,0,0,0,0,,,,,,,,0,6,0,,,,,,0,6,6 +"2020-03-06","AZ",,,0,,6,6,,1,,,33,5,,,,,,3,,1,0,,,,,,,,0,80,17,,,,,36,6,80,17 +"2020-03-06","CA",,,0,,,,,0,,,462,0,,,,,,60,,7,0,,,,,,,,0,522,7,,,,,,0,522,7 +"2020-03-06","CO",,,0,,,,,0,,,55,9,,,,,,8,,6,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-06","CT",,,0,,,,,0,,,,0,,,49,,,,,0,0,,,,,0,,,0,51,15,,,,,,0,51,15 +"2020-03-06","DC",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,8,2,8,2,,,,,,0,,0 +"2020-03-06","DE",,,0,,,,,0,,,10,0,,,,,,0,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-06","FL",,,0,,,,,0,,,55,24,,,,,,8,,1,0,,,,,,,68,27,68,27,,,,,,0,,0 +"2020-03-06","GA",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,0,,,0,0,0,,,,,,0,0,0 +"2020-03-06","HI",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,7,4,7,4,,,,,,0,,0 +"2020-03-06","IA",,,0,,,,,0,,,15,0,,,,,,0,0,0,0,,,,,,,,0,15,0,,,,,,0,,0 +"2020-03-06","IL",,,0,,,,,0,,,,0,,,,,,5,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-06","IN",,,0,,,,,0,,,,0,,,,,,1,,1,0,,,,,0,,,0,19,2,,,,,,0,19,2 +"2020-03-06","KS",,,0,,,,,0,,,4,0,,,,,,0,,0,0,,,,,,,,0,4,0,,,,,,0,,0 +"2020-03-06","KY",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,,0,7,0,,,,,,0,7,7 +"2020-03-06","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,33,,,0,151,49,,,,,,0,151,49 +"2020-03-06","MD",,,0,,,,,0,,,26,9,,,,,,3,3,3,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-06","MI",,0,0,0,,,,0,,,,0,,,,,,140,140,40,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-06","MN",,,0,,,,,0,,,36,0,,,,,,1,1,0,0,,,,,,,37,37,37,0,,,,,,0,,0 +"2020-03-06","NC",,,0,,,,,0,,,,0,,,,,,2,,1,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-06","NE",,,0,,,,,0,,,17,0,,,64,,,0,,0,0,,,,,0,,,0,72,6,,,,,,0,72,6 +"2020-03-06","NH",,,0,,,,,0,,,20,4,,,,,,2,,0,0,,,,,,,,0,37,28,,,,,,0,37,28 +"2020-03-06","NJ",0,,0,0,,,,0,,,,0,,,,,,4,4,2,0,,,,,,,,0,4,2,,,,,1,0,,0 +"2020-03-06","NM",,,0,,,,,0,,,10,0,,,,,,0,,0,0,,,,,,,,0,10,10,,,,,,0,10,10 +"2020-03-06","NV",0,0,0,,,,,0,,,14,0,,,,,,3,3,2,0,,,,,,,48,16,48,16,,,,,,0,,0 +"2020-03-06","NY",,,0,,,,,0,,,,0,,,,,,25,,22,0,,,,,,,122,92,122,92,,,,,,0,,0 +"2020-03-06","OH",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,0,,,0,3,3,,,,,,0,3,3 +"2020-03-06","OR",,,0,,,,,0,,,45,16,,,,,,3,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-06","PA",,,0,,,,,0,,,,0,,,,,,2,,2,0,,,,,,,11,4,11,4,,,,,,0,,0 +"2020-03-06","RI",,,0,,,,,0,,,30,11,,,33,,,3,,0,0,,,,,3,,23,4,23,4,,,,,33,11,36,13 +"2020-03-06","SC",,,0,,,,,0,,,5,0,,,,,,0,0,0,0,,,,,,,,0,5,0,,,,,,0,,0 +"2020-03-06","TN",,,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-06","TX",,,0,,,,,0,,,,0,,,,,,5,5,5,0,,,,,200,,,0,2236,1286,,,,,,0,2236,1286 +"2020-03-06","VA",,,0,,,,,0,,,,0,,,,,,0,,0,0,,1,,,2091,,6455,2,6455,2,,18,,,,0,,0 +"2020-03-06","VT",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,10,4,,,,,,0,10,4 +"2020-03-06","WA",26,,6,,,,,0,,,,0,,,,,,155,155,38,0,,,,,,,1667,511,1667,511,,,,,1604,476,,0 +"2020-03-06","WI",,,0,,,,,0,,,31,12,,,,,,1,1,0,0,,,,,,,21,9,21,9,,,,,,0,,0 +"2020-03-06","WV",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-06","WY",,,0,,,,,0,,,,0,,,8,,,,,0,0,,,,,0,,,0,8,0,,,,,,0,8,0 +"2020-03-05","AZ",,,0,,5,5,,1,,,28,1,,,,,,2,,0,0,,,,,,,,0,63,30,,,,,30,1,63,30 +"2020-03-05","CA",,,0,,,,,0,,,462,0,,,,,,53,,0,0,,,,,,,,0,515,0,,,,,,0,515,0 +"2020-03-05","CO",,,0,,,,,0,,,46,27,,,,,,2,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-05","CT",,,0,,,,,0,,,,0,,,34,,,,,0,0,,,,,0,,,0,36,12,,,,,,0,36,12 +"2020-03-05","DC",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,6,6,6,0,,,,,,0,,0 +"2020-03-05","FL",,,0,,,,,0,,,31,7,,,,,,7,,4,0,,,,,,,41,19,41,19,,,,,,0,,0 +"2020-03-05","GA",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,0,,,0,0,0,,,,,,0,0,0 +"2020-03-05","HI",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,3,1,3,1,,,,,,0,,0 +"2020-03-05","IL",,,0,,,,,0,,,,0,,,,,,5,,1,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-05","IN",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,17,5,,,,,,0,17,5 +"2020-03-05","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,19,,,0,102,36,,,,,,0,102,36 +"2020-03-05","MD",,,0,,,,,0,,,17,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-05","MI",,0,0,0,,,,0,,,,0,,,,,,100,100,26,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-05","NC",,,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-05","NE",,,0,,,,,0,,,17,17,,,58,,,0,,0,0,,,,,0,,,0,66,18,,,,,,0,66,18 +"2020-03-05","NH",,,0,,,,,0,,,16,6,,,,,,2,,0,0,,,,,,,,0,9,3,,,,,,0,9,3 +"2020-03-05","NJ",0,,0,0,,,,0,,,,0,,,,,,2,2,2,0,,,,,,,,0,2,2,,,,,1,1,,0 +"2020-03-05","NM",,,0,,,,,0,,,10,0,,,,,,0,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-05","NV",0,,0,,,,,0,,,14,0,,,,,,1,1,0,0,,,,,,,32,32,32,0,,,,,,0,,0 +"2020-03-05","NY",,,0,,,,,0,,,,0,,,,,,3,,2,0,,,,,,,30,20,30,20,,,,,,0,,0 +"2020-03-05","OH",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-05","OR",,,0,,,,,0,,,29,29,,,,,,3,,3,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-05","PA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,7,2,7,2,,,,,,0,,0 +"2020-03-05","RI",,,0,,,,,0,,,19,4,,,21,,,3,,1,0,,,,,2,,19,12,19,12,,,,,22,5,23,4 +"2020-03-05","SC",,,0,,,,,0,,,5,0,,,,,,0,0,0,0,,,,,,,,0,5,0,,,,,,0,,0 +"2020-03-05","TN",,,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-05","TX",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,124,,,0,950,930,,,,,,0,950,930 +"2020-03-05","VA",,,0,,,,,0,,,,0,,,,,,0,,0,0,,1,,,2091,,6453,1,6453,1,,18,,,,0,,0 +"2020-03-05","VT",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,6,3,,,,,,0,6,3 +"2020-03-05","WA",20,,4,,,,,0,,,,0,,,,,,117,117,24,0,,,,,,,1156,374,1156,374,,,,,1128,360,,0 +"2020-03-05","WI",,,0,,,,,0,,,19,0,,,,,,1,1,0,0,,,,,,,12,5,12,5,,,,,,0,,0 +"2020-03-05","WY",,,0,,,,,0,,,,0,,,8,,,,,0,0,,,,,0,,,0,8,4,,,,,,0,8,4 +"2020-03-04","AZ",,,0,,4,4,,0,,,27,0,,,,,,2,,0,0,,,,,,,,0,33,0,,,,,29,29,33,33 +"2020-03-04","CA",,,0,,,,,0,,,462,0,,,,,,53,,0,0,,,,,,,,0,515,0,,,,,,0,515,515 +"2020-03-04","CO",,,0,,,,,0,,,19,0,,,,,,2,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-04","CT",,,0,,,,,0,,,,0,,,22,,,,,0,0,,,,,0,,,0,24,12,,,,,,0,24,12 +"2020-03-04","FL",,,0,,,,,0,,,24,24,,,,,,3,,1,0,,,,,,,22,3,22,3,,,,,,0,,0 +"2020-03-04","GA",,,0,,,,,0,,,,0,,,,,,2,,0,0,,,,,0,,,0,0,0,,,,,,0,0,0 +"2020-03-04","HI",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,2,2,2,0,,,,,,0,,0 +"2020-03-04","IL",,,0,,,,,0,,,,0,,,,,,4,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-04","IN",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,12,4,,,,,,0,12,4 +"2020-03-04","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,11,,,0,66,22,,,,,,0,66,22 +"2020-03-04","MI",,0,0,0,,,,0,,,,0,,,,,,74,74,24,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-04","NC",,,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-04","NE",,,0,,,,,0,,,,0,,,43,,,,,0,0,,,,,0,,,0,48,0,,,,,,0,48,0 +"2020-03-04","NH",,,0,,,,,0,,,10,0,,,,,,2,,0,0,,,,,,,,0,6,0,,,,,,0,6,6 +"2020-03-04","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-04","NY",,0,0,,,,,0,,,,0,,,,,,1,,0,0,,,,,,,10,9,10,9,,,,,,0,,0 +"2020-03-04","OR",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-04","PA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,5,5,5,5,,,,,,0,,0 +"2020-03-04","RI",,,0,,,,,0,,,15,10,,,17,,,2,,0,0,,,,,2,,7,2,7,2,,,,,17,10,19,12 +"2020-03-04","SC",,,0,,,,,0,,,5,0,,,,,,0,0,0,0,,,,,,,,0,5,0,,,,,,0,,0 +"2020-03-04","TX",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,7,,,0,20,14,,,,,,0,20,14 +"2020-03-04","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,1,,,2090,,6452,1,6452,1,,18,,,,0,,0 +"2020-03-04","VT",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,3,3,,,,,,0,3,3 +"2020-03-04","WA",16,,2,,,,,0,,,,0,,,,,,93,93,34,0,,,,,,,782,251,782,251,,,,,768,245,,0 +"2020-03-04","WI",,,0,,,,,0,,,19,19,,,,,,1,1,1,0,,,,,,,7,0,7,0,,,,,,0,,0 +"2020-03-04","WY",,,0,,,,,0,,,,0,,,4,,,,,0,0,,,,,0,,,0,4,3,,,,,,0,4,3 +"2020-03-03","CT",,,0,,,,,0,,,,0,,,12,,,,,0,0,,,,,0,,,0,12,4,,,,,,0,12,4 +"2020-03-03","FL",,,0,,,,,0,,,,0,,,,,,2,,2,0,,,,,,,19,4,19,4,,,,,,0,,0 +"2020-03-03","IN",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,8,2,,,,,,0,8,2 +"2020-03-03","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,9,,,0,44,15,,,,,,0,44,15 +"2020-03-03","MI",,,0,0,,,,0,,,,0,,,,,,50,50,23,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-03","NE",,,0,,,,,0,,,,0,,,43,,,,,0,0,,,,,0,,,0,48,12,,,,,,0,48,12 +"2020-03-03","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-03","NY",,,0,,,,,0,,,,0,,,,,,1,,1,0,,,,,,,1,1,1,1,,,,,,0,,0 +"2020-03-03","PA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-03-03","RI",,,0,,,,,0,,,5,2,,,5,,,2,,0,0,,,,,2,,5,1,5,1,,,,,7,2,7,2 +"2020-03-03","TX",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,1,,,0,6,0,,,,,,0,6,6 +"2020-03-03","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,1,,,2090,,6451,1,6451,1,,18,,,,0,,0 +"2020-03-03","VT",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,0,0 +"2020-03-03","WA",14,,3,,,,,0,,,,0,,,,,,59,59,16,0,,,,,,,531,226,531,226,,,,,523,225,,0 +"2020-03-03","WI",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,7,7,7,0,,,,,,0,,0 +"2020-03-03","WY",,,0,,,,,0,,,,0,,,1,,,,,0,0,,,,,0,,,0,1,0,,,,,,0,1,0 +"2020-03-02","CT",,,0,,,,,0,,,,0,,,8,,,,,0,0,,,,,0,,,0,8,4,,,,,,0,8,4 +"2020-03-02","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,15,0,15,0,,,,,,0,,0 +"2020-03-02","IN",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,6,0,,,,,,0,6,0 +"2020-03-02","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,8,,,0,29,6,,,,,,0,29,6 +"2020-03-02","MI",,,0,0,,,,0,,,,0,,,,,,27,27,13,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-02","NE",,,0,,,,,0,,,,0,,,33,,,,,0,0,,,,,0,,,0,36,0,,,,,,0,36,0 +"2020-03-02","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-02","NY",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-03-02","RI",,,0,,,,,0,,,3,1,,,3,,,2,,0,0,,,,,2,,4,4,4,4,,,,,5,1,5,1 +"2020-03-02","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,1,,,2090,,6450,1,6450,1,,18,,,,0,,0 +"2020-03-02","WA",11,,3,,,,,0,,,,0,,,,,,43,43,17,0,,,,,,,305,188,305,188,,,,,298,184,,0 +"2020-03-02","WY",,,0,,,,,0,,,,0,,,1,,,,,0,0,,,,,0,,,0,1,0,,,,,,0,1,0 +"2020-03-01","CT",,,0,,,,,0,,,,0,,,4,,,,,0,0,,,,,0,,,0,4,1,,,,,,0,4,1 +"2020-03-01","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,15,0,15,0,,,,,,0,,0 +"2020-03-01","IN",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,6,2,,,,,,0,6,2 +"2020-03-01","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,7,,,0,23,4,,,,,,0,23,4 +"2020-03-01","MI",,0,0,0,,,,0,,,,0,,,,,,14,14,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-03-01","NE",,,0,,,,,0,,,,0,,,33,,,,,0,0,,,,,0,,,0,36,11,,,,,,0,36,11 +"2020-03-01","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-03-01","RI",,,0,,,,,0,,,2,0,,,2,,,2,,0,0,,,,,2,,,0,,0,,,,,4,4,4,4 +"2020-03-01","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,1,,,2090,,6449,2,6449,2,,18,,,,0,,0 +"2020-03-01","WA",8,,3,,,,,0,,,,0,,,,,,26,26,8,0,,,,,,,117,75,117,75,,,,,114,73,,0 +"2020-03-01","WY",,,0,,,,,0,,,,0,,,1,,,,,0,0,,,,,0,,,0,1,0,,,,,,0,1,1 +"2020-02-29","CT",,,0,,,,,0,,,,0,,,3,,,,,0,0,,,,,0,,,0,3,0,,,,,,0,3,3 +"2020-02-29","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,15,0,15,0,,,,,,0,,0 +"2020-02-29","IN",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,4,2,,,,,,0,4,2 +"2020-02-29","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,6,,,0,19,1,,,,,,0,19,1 +"2020-02-29","NE",,,0,,,,,0,,,,0,,,24,,,,,0,0,,,,,0,,,0,25,15,,,,,,0,25,15 +"2020-02-29","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-29","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,1,,,2090,,6447,2,6447,2,,17,,,,0,,0 +"2020-02-29","WA",5,,1,,,,,0,,,,0,,,,,,18,18,3,0,,,,,,,42,42,42,42,,,,,41,41,,0 +"2020-02-28","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,15,0,15,0,,,,,,0,,0 +"2020-02-28","IN",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,2,1,,,,,,0,2,1 +"2020-02-28","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,6,,,0,18,2,,,,,,0,18,2 +"2020-02-28","NE",,,0,,,,,0,,,,0,,,9,,,,,0,0,,,,,0,,,0,10,0,,,,,,0,10,0 +"2020-02-28","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-28","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,2090,,6445,0,6445,0,,14,,,,0,,0 +"2020-02-28","WA",4,,2,,,,,0,,,,0,,,,,,15,15,2,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-27","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,15,0,15,0,,,,,,0,,0 +"2020-02-27","IN",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,1,0,,,,,,0,1,1 +"2020-02-27","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,5,,,0,16,0,,,,,,0,16,0 +"2020-02-27","NE",,,0,,,,,0,,,,0,,,9,,,,,0,0,,,,,0,,,0,10,0,,,,,,0,10,0 +"2020-02-27","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-27","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,6445,6445,6445,6445,,14,,,,0,,0 +"2020-02-27","WA",2,,0,,,,,0,,,,0,,,,,,13,13,1,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-26","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,15,0,15,0,,,,,,0,,0 +"2020-02-26","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,5,,,0,16,0,,,,,,0,16,0 +"2020-02-26","NE",,,0,,,,,0,,,,0,,,9,,,,,0,0,,,,,0,,,0,10,0,,,,,,0,10,0 +"2020-02-26","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-26","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,14,,,,0,,0 +"2020-02-26","WA",2,,2,,,,,0,,,,0,,,,,,12,12,2,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-25","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,15,1,15,1,,,,,,0,,0 +"2020-02-25","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,5,,,0,16,0,,,,,,0,16,0 +"2020-02-25","NE",,,0,,,,,0,,,,0,,,9,,,,,0,0,,,,,0,,,0,10,0,,,,,,0,10,0 +"2020-02-25","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-25","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,14,,,,0,,0 +"2020-02-25","WA",,,0,,,,,0,,,,0,,,,,,10,10,1,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-24","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,14,0,14,0,,,,,,0,,0 +"2020-02-24","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,5,,,0,16,2,,,,,,0,16,2 +"2020-02-24","NE",,,0,,,,,0,,,,0,,,9,,,,,0,0,,,,,0,,,0,10,0,,,,,,0,10,0 +"2020-02-24","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-24","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,14,,,,0,,0 +"2020-02-24","WA",,,0,,,,,0,,,,0,,,,,,9,9,1,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-23","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,14,0,14,0,,,,,,0,,0 +"2020-02-23","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,4,,,0,14,0,,,,,,0,14,0 +"2020-02-23","NE",,,0,,,,,0,,,,0,,,9,,,,,0,0,,,,,0,,,0,10,0,,,,,,0,10,0 +"2020-02-23","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-23","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,12,,,,0,,0 +"2020-02-23","WA",,,0,,,,,0,,,,0,,,,,,8,8,1,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-22","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,14,1,14,1,,,,,,0,,0 +"2020-02-22","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,4,,,0,14,0,,,,,,0,14,0 +"2020-02-22","NE",,,0,,,,,0,,,,0,,,9,,,,,0,0,,,,,0,,,0,10,0,,,,,,0,10,0 +"2020-02-22","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-22","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,11,,,,0,,0 +"2020-02-22","WA",,,0,,,,,0,,,,0,,,,,,7,7,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-21","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,13,0,13,0,,,,,,0,,0 +"2020-02-21","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,4,,,0,14,0,,,,,,0,14,0 +"2020-02-21","NE",,,0,,,,,0,,,,0,,,9,,,,,0,0,,,,,0,,,0,10,1,,,,,,0,10,1 +"2020-02-21","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-21","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,9,,,,0,,0 +"2020-02-21","WA",,,0,,,,,0,,,,0,,,,,,7,7,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-20","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,13,0,13,0,,,,,,0,,0 +"2020-02-20","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,4,,,0,14,1,,,,,,0,14,1 +"2020-02-20","NE",,,0,,,,,0,,,,0,,,8,,,,,0,0,,,,,0,,,0,9,0,,,,,,0,9,0 +"2020-02-20","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-20","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,9,,,,0,,0 +"2020-02-20","WA",,,0,,,,,0,,,,0,,,,,,7,7,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-19","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,13,0,13,0,,,,,,0,,0 +"2020-02-19","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,3,,,0,13,0,,,,,,0,13,0 +"2020-02-19","NE",,,0,,,,,0,,,,0,,,8,,,,,0,0,,,,,0,,,0,9,6,,,,,,0,9,6 +"2020-02-19","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-19","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,9,,,,0,,0 +"2020-02-19","WA",,,0,,,,,0,,,,0,,,,,,7,7,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-18","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,13,0,13,0,,,,,,0,,0 +"2020-02-18","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,3,,,0,13,0,,,,,,0,13,0 +"2020-02-18","NE",,,0,,,,,0,,,,0,,,2,,,,,0,0,,,,,0,,,0,3,0,,,,,,0,3,0 +"2020-02-18","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-18","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,7,,,,0,,0 +"2020-02-18","WA",,,0,,,,,0,,,,0,,,,,,7,7,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-17","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,13,1,13,1,,,,,,0,,0 +"2020-02-17","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,3,,,0,13,0,,,,,,0,13,0 +"2020-02-17","NE",,,0,,,,,0,,,,0,,,2,,,,,0,0,,,,,0,,,0,3,0,,,,,,0,3,0 +"2020-02-17","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-17","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,5,,,,0,,0 +"2020-02-17","WA",,,0,,,,,0,,,,0,,,,,,7,7,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-16","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,12,0,12,0,,,,,,0,,0 +"2020-02-16","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,3,,,0,13,0,,,,,,0,13,0 +"2020-02-16","NE",,,0,,,,,0,,,,0,,,2,,,,,0,0,,,,,0,,,0,3,2,,,,,,0,3,2 +"2020-02-16","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-16","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,4,,,,0,,0 +"2020-02-16","WA",,,0,,,,,0,,,,0,,,,,,7,7,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-15","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,12,3,12,3,,,,,,0,,0 +"2020-02-15","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,3,,,0,13,0,,,,,,0,13,0 +"2020-02-15","NE",,,0,,,,,0,,,,0,,,1,,,,,0,0,,,,,0,,,0,1,0,,,,,,0,1,1 +"2020-02-15","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-15","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,4,,,,0,,0 +"2020-02-15","WA",,,0,,,,,0,,,,0,,,,,,7,7,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-14","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,9,0,9,0,,,,,,0,,0 +"2020-02-14","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,3,,,0,13,0,,,,,,0,13,0 +"2020-02-14","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-14","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,4,,,,0,,0 +"2020-02-14","WA",,,0,,,,,0,,,,0,,,,,,7,7,1,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-13","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,9,1,9,1,,,,,,0,,0 +"2020-02-13","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,3,,,0,13,0,,,,,,0,13,0 +"2020-02-13","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-13","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,4,,,,0,,0 +"2020-02-13","WA",,,0,,,,,0,,,,0,,,,,,6,6,1,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-12","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,8,0,8,0,,,,,,0,,0 +"2020-02-12","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,3,,,0,13,1,,,,,,0,13,1 +"2020-02-12","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-12","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,4,,,,0,,0 +"2020-02-12","WA",,,0,,,,,0,,,,0,,,,,,5,5,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-11","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,8,1,8,1,,,,,,0,,0 +"2020-02-11","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,3,,,0,12,0,,,,,,0,12,0 +"2020-02-11","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-11","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,4,,,,0,,0 +"2020-02-11","WA",,,0,,,,,0,,,,0,,,,,,5,5,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-10","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,7,0,7,0,,,,,,0,,0 +"2020-02-10","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,3,,,0,12,1,,,,,,0,12,1 +"2020-02-10","NJ",0,,0,0,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,0,0,,,,,,0,,0 +"2020-02-10","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,3,,,,0,,0 +"2020-02-10","WA",,,0,,,,,0,,,,0,,,,,,5,5,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-09","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,7,0,7,0,,,,,,0,,0 +"2020-02-09","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,2,,,0,11,0,,,,,,0,11,0 +"2020-02-09","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,3,,,,0,,0 +"2020-02-09","WA",,,0,,,,,0,,,,0,,,,,,5,5,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-08","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,7,1,7,1,,,,,,0,,0 +"2020-02-08","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,2,,,0,11,1,,,,,,0,11,1 +"2020-02-08","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,3,,,,0,,0 +"2020-02-08","WA",,,0,,,,,0,,,,0,,,,,,5,5,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-07","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,6,0,6,0,,,,,,0,,0 +"2020-02-07","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,2,,,0,10,0,,,,,,0,10,0 +"2020-02-07","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,3,,,,0,,0 +"2020-02-07","WA",,,0,,,,,0,,,,0,,,,,,5,5,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-06","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,6,0,6,0,,,,,,0,,0 +"2020-02-06","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,2,,,0,10,1,,,,,,0,10,1 +"2020-02-06","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,3,,,,0,,0 +"2020-02-06","WA",,,0,,,,,0,,,,0,,,,,,5,5,2,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-05","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,6,0,6,0,,,,,,0,,0 +"2020-02-05","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,1,,,0,9,0,,,,,,0,9,0 +"2020-02-05","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,3,,,,0,,0 +"2020-02-05","WA",,,0,,,,,0,,,,0,,,,,,3,3,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-04","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,6,2,6,2,,,,,,0,,0 +"2020-02-04","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,1,,,0,9,2,,,,,,0,9,2 +"2020-02-04","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,3,,,,0,,0 +"2020-02-04","WA",,,0,,,,,0,,,,0,,,,,,3,3,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-03","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,4,0,4,0,,,,,,0,,0 +"2020-02-03","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,1,,,0,7,3,,,,,,0,7,3 +"2020-02-03","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,2,,,,0,,0 +"2020-02-03","WA",,,0,,,,,0,,,,0,,,,,,3,3,1,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-02","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,4,0,4,0,,,,,,0,,0 +"2020-02-02","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,1,,,0,4,0,,,,,,0,4,0 +"2020-02-02","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,2,,,,0,,0 +"2020-02-02","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-02-01","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,4,0,4,0,,,,,,0,,0 +"2020-02-01","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,1,,,0,4,0,,,,,,0,4,0 +"2020-02-01","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,2,,,,0,,0 +"2020-02-01","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-01-31","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,4,3,4,3,,,,,,0,,0 +"2020-01-31","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,1,,,0,4,0,,,,,,0,4,0 +"2020-01-31","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,2,,,,0,,0 +"2020-01-31","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-01-30","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,1,0,1,0,,,,,,0,,0 +"2020-01-30","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,1,,,0,4,0,,,,,,0,4,0 +"2020-01-30","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,2,,,,0,,0 +"2020-01-30","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-01-29","FL",,,0,,,,,0,,,,0,,,,,,0,,0,0,,,,,,,1,1,1,0,,,,,,0,,0 +"2020-01-29","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,1,,,0,4,1,,,,,,0,4,1 +"2020-01-29","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,2,,,,0,,0 +"2020-01-29","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-01-28","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,3,0,,,,,,0,3,0 +"2020-01-28","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,1,,,,0,,0 +"2020-01-28","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-01-27","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,3,1,,,,,,0,3,1 +"2020-01-27","VA",,,0,,,,,0,,,,0,,,,,,,,0,0,,0,,,,,,0,,0,,1,,,,0,,0 +"2020-01-27","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-01-26","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,2,0,,,,,,0,2,0 +"2020-01-26","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-01-25","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,2,0,,,,,,0,2,0 +"2020-01-25","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-01-24","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,2,0,,,,,,0,2,0 +"2020-01-24","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-01-23","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,2,1,,,,,,0,2,1 +"2020-01-23","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-01-22","MA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,0,,,0,1,0,,,,,,0,1,1 +"2020-01-22","WA",,,0,,,,,0,,,,0,,,,,,2,2,0,0,,,,,,,0,0,0,0,,,,,,0,,0 +"2020-01-21","WA",,,0,,,,,0,,,,0,,,,,,2,2,1,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-01-20","WA",,,0,,,,,0,,,,0,,,,,,1,1,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-01-19","WA",,,0,,,,,0,,,,0,,,,,,1,1,1,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-01-18","WA",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-01-17","WA",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-01-16","WA",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-01-15","WA",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-01-14","WA",,,0,,,,,0,,,,0,,,,,,0,0,0,0,,,,,,,,0,,0,,,,,,0,,0 +"2020-01-13","WA",,,0,,,,,0,,,,0,,,,,,,,0,0,,,,,,,,0,,0,,,,,,0,,0 \ No newline at end of file diff --git a/views/deathStatistics.html b/views/deathStatistics.html new file mode 100644 index 00000000..da7eb77d --- /dev/null +++ b/views/deathStatistics.html @@ -0,0 +1,334 @@ + + + + + + + + + + + + + + +

+ + + + + + diff --git a/views/index.html b/views/index.html new file mode 100644 index 00000000..8eb1d44b --- /dev/null +++ b/views/index.html @@ -0,0 +1,54 @@ + + + + + Title + + + + + + + + +
+ +
+
+ +
+ +
+ +
+
+ Click On Me!!!!! + See Instruction Video! +
+ + + + \ No newline at end of file diff --git a/views/positiveStatistics.html b/views/positiveStatistics.html new file mode 100644 index 00000000..d108a76b --- /dev/null +++ b/views/positiveStatistics.html @@ -0,0 +1,22 @@ + + + + + Title + + + + + + +

+ + + + + + \ No newline at end of file diff --git a/views/video.html b/views/video.html new file mode 100644 index 00000000..40e25ec4 --- /dev/null +++ b/views/video.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file